summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--contrib/perl5/AUTHORS120
-rw-r--r--contrib/perl5/Changes41338
-rw-r--r--contrib/perl5/Changes5.00519336
-rwxr-xr-xcontrib/perl5/Configure7793
-rw-r--r--contrib/perl5/EXTERN.h19
-rw-r--r--contrib/perl5/INSTALL1209
-rw-r--r--contrib/perl5/INTERN.h19
-rw-r--r--contrib/perl5/MAINTAIN879
-rw-r--r--contrib/perl5/MANIFEST640
-rwxr-xr-xcontrib/perl5/Makefile.SH402
-rwxr-xr-xcontrib/perl5/Policy_sh.SH147
-rw-r--r--contrib/perl5/Porting/Glossary1127
-rw-r--r--contrib/perl5/Porting/config.sh435
-rw-r--r--contrib/perl5/Porting/config_H2385
-rwxr-xr-xcontrib/perl5/Porting/findvars21
-rwxr-xr-xcontrib/perl5/Porting/genlog7
-rwxr-xr-xcontrib/perl5/Porting/makerel41
-rwxr-xr-xcontrib/perl5/Porting/p4d2p2
-rwxr-xr-xcontrib/perl5/Porting/p4desc118
-rw-r--r--contrib/perl5/Porting/patching.pod138
-rwxr-xr-xcontrib/perl5/Porting/patchls83
-rw-r--r--contrib/perl5/Porting/pumpkin.pod353
-rw-r--r--contrib/perl5/README32
-rw-r--r--contrib/perl5/README.Y2K47
-rw-r--r--contrib/perl5/README.posix-bc131
-rw-r--r--contrib/perl5/README.threads123
-rw-r--r--contrib/perl5/Todo82
-rw-r--r--contrib/perl5/Todo-5.6156
-rw-r--r--contrib/perl5/XSUB.h429
-rw-r--r--contrib/perl5/av.c367
-rw-r--r--contrib/perl5/av.h36
-rw-r--r--contrib/perl5/bytecode.pl267
-rw-r--r--contrib/perl5/cc_runtime.h30
-rwxr-xr-xcontrib/perl5/cflags.SH10
-rwxr-xr-xcontrib/perl5/config_h.SH2398
-rwxr-xr-xcontrib/perl5/configpm53
-rw-r--r--contrib/perl5/configure.com862
-rwxr-xr-xcontrib/perl5/configure.gnu8
-rw-r--r--contrib/perl5/cop.h265
-rw-r--r--contrib/perl5/cv.h33
-rw-r--r--contrib/perl5/deb.c84
-rw-r--r--contrib/perl5/doio.c770
-rw-r--r--contrib/perl5/doop.c930
-rw-r--r--contrib/perl5/dosish.h29
-rw-r--r--contrib/perl5/dump.c1080
-rw-r--r--contrib/perl5/ebcdic.c13
-rw-r--r--contrib/perl5/eg/cgi/dna_small_gif.uu63
-rw-r--r--contrib/perl5/eg/cgi/file_upload.cgi12
-rw-r--r--contrib/perl5/eg/cgi/index.html7
-rw-r--r--contrib/perl5/eg/cgi/wilogo_gif.uu13
-rw-r--r--contrib/perl5/embed.h5421
-rwxr-xr-xcontrib/perl5/embed.pl2399
-rw-r--r--contrib/perl5/embedvar.h2039
-rw-r--r--contrib/perl5/ext/B/B.pm104
-rw-r--r--contrib/perl5/ext/B/B.xs407
-rw-r--r--contrib/perl5/ext/B/B/Asmdata.pm65
-rw-r--r--contrib/perl5/ext/B/B/Assembler.pm1
-rw-r--r--contrib/perl5/ext/B/B/Bblock.pm40
-rw-r--r--contrib/perl5/ext/B/B/Bytecode.pm107
-rw-r--r--contrib/perl5/ext/B/B/C.pm835
-rw-r--r--contrib/perl5/ext/B/B/CC.pm465
-rw-r--r--contrib/perl5/ext/B/B/Debug.pm33
-rw-r--r--contrib/perl5/ext/B/B/Deparse.pm1318
-rw-r--r--contrib/perl5/ext/B/B/Disassembler.pm14
-rw-r--r--contrib/perl5/ext/B/B/Lint.pm73
-rw-r--r--contrib/perl5/ext/B/B/Stackobj.pm113
-rw-r--r--contrib/perl5/ext/B/B/Stash.pm42
-rw-r--r--contrib/perl5/ext/B/B/Terse.pm8
-rw-r--r--contrib/perl5/ext/B/B/Xref.pm86
-rw-r--r--contrib/perl5/ext/B/Makefile.PL36
-rw-r--r--contrib/perl5/ext/B/NOTES4
-rw-r--r--contrib/perl5/ext/B/O.pm4
-rw-r--r--contrib/perl5/ext/B/defsubs_h.PL35
-rw-r--r--contrib/perl5/ext/B/ramblings/flip-flop27
-rw-r--r--contrib/perl5/ext/B/ramblings/runtime.porting9
-rw-r--r--contrib/perl5/ext/B/typemap16
-rw-r--r--contrib/perl5/ext/ByteLoader/ByteLoader.pm40
-rw-r--r--contrib/perl5/ext/ByteLoader/ByteLoader.xs79
-rw-r--r--contrib/perl5/ext/ByteLoader/Makefile.PL9
-rw-r--r--contrib/perl5/ext/ByteLoader/bytecode.h161
-rw-r--r--contrib/perl5/ext/ByteLoader/byterun.c899
-rw-r--r--contrib/perl5/ext/ByteLoader/byterun.h161
-rw-r--r--contrib/perl5/ext/ByteLoader/hints/sunos.pl2
-rw-r--r--contrib/perl5/ext/DB_File/Changes59
-rw-r--r--contrib/perl5/ext/DB_File/DB_File.pm439
-rw-r--r--contrib/perl5/ext/DB_File/DB_File.xs734
-rw-r--r--contrib/perl5/ext/DB_File/Makefile.PL10
-rw-r--r--contrib/perl5/ext/DB_File/dbinfo21
-rw-r--r--contrib/perl5/ext/DB_File/hints/sco.pl2
-rw-r--r--contrib/perl5/ext/DB_File/typemap14
-rw-r--r--contrib/perl5/ext/DB_File/version.c71
-rw-r--r--contrib/perl5/ext/Data/Dumper/Changes15
-rw-r--r--contrib/perl5/ext/Data/Dumper/Dumper.pm195
-rw-r--r--contrib/perl5/ext/Data/Dumper/Dumper.xs142
-rw-r--r--contrib/perl5/ext/Data/Dumper/Todo6
-rw-r--r--contrib/perl5/ext/Devel/DProf/Changes176
-rw-r--r--contrib/perl5/ext/Devel/DProf/DProf.pm196
-rw-r--r--contrib/perl5/ext/Devel/DProf/DProf.xs689
-rw-r--r--contrib/perl5/ext/Devel/DProf/Makefile.PL17
-rw-r--r--contrib/perl5/ext/Devel/DProf/Todo13
-rw-r--r--contrib/perl5/ext/Devel/Peek/Changes64
-rw-r--r--contrib/perl5/ext/Devel/Peek/Makefile.PL11
-rw-r--r--contrib/perl5/ext/Devel/Peek/Peek.pm432
-rw-r--r--contrib/perl5/ext/Devel/Peek/Peek.xs218
-rw-r--r--contrib/perl5/ext/DynaLoader/DynaLoader_pm.PL130
-rw-r--r--contrib/perl5/ext/DynaLoader/Makefile.PL11
-rw-r--r--contrib/perl5/ext/DynaLoader/XSLoader_pm.PL158
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_aix.xs200
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_beos.xs34
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_dld.xs46
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_dlopen.xs88
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_dyld.xs226
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_hpux.xs40
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_mpeix.xs32
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_next.xs41
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_vmesa.xs175
-rw-r--r--contrib/perl5/ext/DynaLoader/dl_vms.xs65
-rw-r--r--contrib/perl5/ext/DynaLoader/dlutils.c52
-rw-r--r--contrib/perl5/ext/DynaLoader/hints/aix.pl10
-rw-r--r--contrib/perl5/ext/DynaLoader/hints/linux.pl4
-rw-r--r--contrib/perl5/ext/DynaLoader/hints/openbsd.pl3
-rw-r--r--contrib/perl5/ext/Errno/Errno_pm.PL37
-rw-r--r--contrib/perl5/ext/Fcntl/Fcntl.pm103
-rw-r--r--contrib/perl5/ext/Fcntl/Fcntl.xs410
-rw-r--r--contrib/perl5/ext/File/Glob/Changes47
-rw-r--r--contrib/perl5/ext/File/Glob/Glob.pm378
-rw-r--r--contrib/perl5/ext/File/Glob/Glob.xs209
-rw-r--r--contrib/perl5/ext/File/Glob/Makefile.PL21
-rw-r--r--contrib/perl5/ext/File/Glob/TODO21
-rw-r--r--contrib/perl5/ext/File/Glob/bsd_glob.c945
-rw-r--r--contrib/perl5/ext/File/Glob/bsd_glob.h82
-rw-r--r--contrib/perl5/ext/GDBM_File/GDBM_File.pm14
-rw-r--r--contrib/perl5/ext/GDBM_File/GDBM_File.xs154
-rw-r--r--contrib/perl5/ext/GDBM_File/typemap23
-rw-r--r--contrib/perl5/ext/IO/ChangeLog318
-rw-r--r--contrib/perl5/ext/IO/IO.pm27
-rw-r--r--contrib/perl5/ext/IO/IO.xs300
-rw-r--r--contrib/perl5/ext/IO/Makefile.PL11
-rw-r--r--contrib/perl5/ext/IO/README9
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Dir.pm239
-rw-r--r--contrib/perl5/ext/IO/lib/IO/File.pm32
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Handle.pm311
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Pipe.pm41
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Poll.pm205
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Seekable.pm31
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Select.pm315
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Socket.pm748
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Socket/INET.pm406
-rw-r--r--contrib/perl5/ext/IO/lib/IO/Socket/UNIX.pm143
-rw-r--r--contrib/perl5/ext/IO/poll.c135
-rw-r--r--contrib/perl5/ext/IO/poll.h55
-rw-r--r--contrib/perl5/ext/IPC/SysV/Msg.pm24
-rw-r--r--contrib/perl5/ext/IPC/SysV/Semaphore.pm14
-rw-r--r--contrib/perl5/ext/IPC/SysV/SysV.pm4
-rw-r--r--contrib/perl5/ext/IPC/SysV/SysV.xs10
-rw-r--r--contrib/perl5/ext/IPC/SysV/hints/cygwin.pl2
-rw-r--r--contrib/perl5/ext/IPC/SysV/hints/next_3.pl1
-rw-r--r--contrib/perl5/ext/NDBM_File/NDBM_File.pm12
-rw-r--r--contrib/perl5/ext/NDBM_File/NDBM_File.xs152
-rw-r--r--contrib/perl5/ext/NDBM_File/hints/cygwin.pl2
-rw-r--r--contrib/perl5/ext/NDBM_File/hints/sco.pl4
-rw-r--r--contrib/perl5/ext/NDBM_File/typemap16
-rw-r--r--contrib/perl5/ext/ODBM_File/ODBM_File.pm12
-rw-r--r--contrib/perl5/ext/ODBM_File/ODBM_File.xs114
-rw-r--r--contrib/perl5/ext/ODBM_File/hints/cygwin.pl2
-rw-r--r--contrib/perl5/ext/ODBM_File/hints/sco.pl8
-rw-r--r--contrib/perl5/ext/ODBM_File/typemap16
-rw-r--r--contrib/perl5/ext/Opcode/Opcode.pm18
-rw-r--r--contrib/perl5/ext/Opcode/Opcode.xs92
-rw-r--r--contrib/perl5/ext/Opcode/Safe.pm5
-rw-r--r--contrib/perl5/ext/POSIX/Makefile.PL12
-rw-r--r--contrib/perl5/ext/POSIX/POSIX.pm364
-rw-r--r--contrib/perl5/ext/POSIX/POSIX.pod27
-rw-r--r--contrib/perl5/ext/POSIX/POSIX.xs313
-rw-r--r--contrib/perl5/ext/SDBM_File/Makefile.PL20
-rw-r--r--contrib/perl5/ext/SDBM_File/SDBM_File.pm12
-rw-r--r--contrib/perl5/ext/SDBM_File/SDBM_File.xs152
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/Makefile.PL8
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/README.too5
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/dba.c14
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/dbd.c18
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/dbe.c34
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/dbm.c23
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/dbu.c18
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/pair.c17
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/pair.h2
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/sdbm.37
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/sdbm.c35
-rw-r--r--contrib/perl5/ext/SDBM_File/sdbm/sdbm.h39
-rw-r--r--contrib/perl5/ext/SDBM_File/typemap16
-rw-r--r--contrib/perl5/ext/Socket/Makefile.PL8
-rw-r--r--contrib/perl5/ext/Socket/Socket.pm141
-rw-r--r--contrib/perl5/ext/Socket/Socket.xs177
-rw-r--r--contrib/perl5/ext/Sys/Hostname/Hostname.pm153
-rw-r--r--contrib/perl5/ext/Sys/Hostname/Hostname.xs76
-rw-r--r--contrib/perl5/ext/Sys/Hostname/Makefile.PL8
-rw-r--r--contrib/perl5/ext/Sys/Syslog/Makefile.PL8
-rw-r--r--contrib/perl5/ext/Sys/Syslog/Syslog.pm294
-rw-r--r--contrib/perl5/ext/Sys/Syslog/Syslog.xs642
-rw-r--r--contrib/perl5/ext/Thread/Thread.pm55
-rw-r--r--contrib/perl5/ext/Thread/Thread.xs130
-rw-r--r--contrib/perl5/ext/Thread/Thread/Queue.pm12
-rw-r--r--contrib/perl5/ext/Thread/Thread/Semaphore.pm6
-rw-r--r--contrib/perl5/ext/Thread/Thread/Specific.pm9
-rw-r--r--contrib/perl5/ext/Thread/sync.t3
-rw-r--r--contrib/perl5/ext/Thread/sync2.t3
-rw-r--r--contrib/perl5/ext/Thread/typemap2
-rw-r--r--contrib/perl5/ext/attrs/attrs.pm21
-rw-r--r--contrib/perl5/ext/attrs/attrs.xs9
-rw-r--r--contrib/perl5/ext/re/Makefile.PL2
-rw-r--r--contrib/perl5/ext/re/re.pm24
-rw-r--r--contrib/perl5/ext/re/re.xs33
-rw-r--r--contrib/perl5/form.h2
-rw-r--r--contrib/perl5/global.sym1611
-rw-r--r--contrib/perl5/globals.c1471
-rw-r--r--contrib/perl5/globvar.sym68
-rw-r--r--contrib/perl5/gv.c501
-rw-r--r--contrib/perl5/gv.h26
-rw-r--r--contrib/perl5/handy.h323
-rw-r--r--contrib/perl5/hints/README.hints62
-rw-r--r--contrib/perl5/hints/aix.sh331
-rw-r--r--contrib/perl5/hints/amigaos.sh11
-rw-r--r--contrib/perl5/hints/beos.sh4
-rw-r--r--contrib/perl5/hints/cygwin.sh48
-rw-r--r--contrib/perl5/hints/darwin.sh63
-rw-r--r--contrib/perl5/hints/dec_osf.sh131
-rw-r--r--contrib/perl5/hints/dgux.sh5
-rw-r--r--contrib/perl5/hints/dos_djgpp.sh5
-rw-r--r--contrib/perl5/hints/dynixptx.sh13
-rw-r--r--contrib/perl5/hints/epix.sh15
-rw-r--r--contrib/perl5/hints/esix4.sh23
-rw-r--r--contrib/perl5/hints/freebsd.sh65
-rw-r--r--contrib/perl5/hints/hpux.sh288
-rw-r--r--contrib/perl5/hints/irix_4.sh10
-rw-r--r--contrib/perl5/hints/irix_5.sh10
-rw-r--r--contrib/perl5/hints/irix_6.sh189
-rw-r--r--contrib/perl5/hints/irix_6_0.sh10
-rw-r--r--contrib/perl5/hints/irix_6_1.sh10
-rw-r--r--contrib/perl5/hints/linux.sh62
-rw-r--r--contrib/perl5/hints/lynxos.sh8
-rw-r--r--contrib/perl5/hints/machten.sh77
-rw-r--r--contrib/perl5/hints/mint.sh3
-rw-r--r--contrib/perl5/hints/mpeix.sh23
-rw-r--r--contrib/perl5/hints/netbsd.sh6
-rw-r--r--contrib/perl5/hints/newsos4.sh3
-rw-r--r--contrib/perl5/hints/next_3.sh8
-rw-r--r--contrib/perl5/hints/next_3_0.sh6
-rw-r--r--contrib/perl5/hints/next_4.sh20
-rw-r--r--contrib/perl5/hints/openbsd.sh62
-rw-r--r--contrib/perl5/hints/os2.sh62
-rw-r--r--contrib/perl5/hints/os390.sh48
-rw-r--r--contrib/perl5/hints/posix-bc.sh42
-rw-r--r--contrib/perl5/hints/powerux.sh17
-rw-r--r--contrib/perl5/hints/qnx.sh6
-rw-r--r--contrib/perl5/hints/rhapsody.sh67
-rw-r--r--contrib/perl5/hints/sco.sh16
-rw-r--r--contrib/perl5/hints/solaris_2.sh313
-rw-r--r--contrib/perl5/hints/sunos_4_1.sh14
-rw-r--r--contrib/perl5/hints/svr4.sh9
-rw-r--r--contrib/perl5/hints/svr5.sh221
-rw-r--r--contrib/perl5/hints/ultrix_4.sh12
-rw-r--r--contrib/perl5/hints/unicos.sh2
-rw-r--r--contrib/perl5/hints/unicosmk.sh22
-rw-r--r--contrib/perl5/hints/vmesa.sh338
-rw-r--r--contrib/perl5/hv.c488
-rw-r--r--contrib/perl5/hv.h80
-rwxr-xr-xcontrib/perl5/installhtml44
-rwxr-xr-xcontrib/perl5/installman58
-rwxr-xr-xcontrib/perl5/installperl217
-rw-r--r--contrib/perl5/intrpvar.h316
-rw-r--r--contrib/perl5/iperlsys.h1428
-rw-r--r--contrib/perl5/keywords.h466
-rwxr-xr-xcontrib/perl5/keywords.pl2
-rw-r--r--contrib/perl5/lib/AnyDBM_File.pm6
-rw-r--r--contrib/perl5/lib/AutoLoader.pm68
-rw-r--r--contrib/perl5/lib/AutoSplit.pm41
-rw-r--r--contrib/perl5/lib/Benchmark.pm422
-rw-r--r--contrib/perl5/lib/CGI.pm592
-rw-r--r--contrib/perl5/lib/CGI/Apache.pm92
-rw-r--r--contrib/perl5/lib/CGI/Carp.pm30
-rw-r--r--contrib/perl5/lib/CGI/Cookie.pm31
-rw-r--r--contrib/perl5/lib/CGI/Fast.pm4
-rw-r--r--contrib/perl5/lib/CGI/Pretty.pm236
-rw-r--r--contrib/perl5/lib/CGI/Push.pm2
-rw-r--r--contrib/perl5/lib/CGI/Switch.pm61
-rw-r--r--contrib/perl5/lib/CPAN.pm727
-rw-r--r--contrib/perl5/lib/CPAN/FirstTime.pm29
-rw-r--r--contrib/perl5/lib/CPAN/Nox.pm9
-rw-r--r--contrib/perl5/lib/Carp.pm168
-rw-r--r--contrib/perl5/lib/Carp/Heavy.pm253
-rw-r--r--contrib/perl5/lib/Class/Struct.pm138
-rw-r--r--contrib/perl5/lib/Cwd.pm39
-rw-r--r--contrib/perl5/lib/DB.pm802
-rw-r--r--contrib/perl5/lib/Dumpvalue.pm66
-rw-r--r--contrib/perl5/lib/English.pm23
-rw-r--r--contrib/perl5/lib/Env.pm180
-rw-r--r--contrib/perl5/lib/Exporter.pm270
-rw-r--r--contrib/perl5/lib/Exporter/Heavy.pm225
-rw-r--r--contrib/perl5/lib/ExtUtils/Command.pm4
-rw-r--r--contrib/perl5/lib/ExtUtils/Embed.pm15
-rw-r--r--contrib/perl5/lib/ExtUtils/Install.pm22
-rw-r--r--contrib/perl5/lib/ExtUtils/Installed.pm11
-rw-r--r--contrib/perl5/lib/ExtUtils/Liblist.pm52
-rw-r--r--contrib/perl5/lib/ExtUtils/MM_Cygwin.pm121
-rw-r--r--contrib/perl5/lib/ExtUtils/MM_OS2.pm10
-rw-r--r--contrib/perl5/lib/ExtUtils/MM_Unix.pm486
-rw-r--r--contrib/perl5/lib/ExtUtils/MM_VMS.pm287
-rw-r--r--contrib/perl5/lib/ExtUtils/MM_Win32.pm149
-rw-r--r--contrib/perl5/lib/ExtUtils/MakeMaker.pm249
-rw-r--r--contrib/perl5/lib/ExtUtils/Manifest.pm38
-rw-r--r--contrib/perl5/lib/ExtUtils/Mkbootstrap.pm4
-rw-r--r--contrib/perl5/lib/ExtUtils/Mksymlists.pm17
-rw-r--r--contrib/perl5/lib/ExtUtils/Packlist.pm5
-rw-r--r--contrib/perl5/lib/ExtUtils/typemap15
-rwxr-xr-xcontrib/perl5/lib/ExtUtils/xsubpp376
-rw-r--r--contrib/perl5/lib/Fatal.pm59
-rw-r--r--contrib/perl5/lib/File/Basename.pm58
-rw-r--r--contrib/perl5/lib/File/CheckTree.pm2
-rw-r--r--contrib/perl5/lib/File/Compare.pm95
-rw-r--r--contrib/perl5/lib/File/Copy.pm43
-rw-r--r--contrib/perl5/lib/File/DosGlob.pm23
-rw-r--r--contrib/perl5/lib/File/Find.pm767
-rw-r--r--contrib/perl5/lib/File/Path.pm67
-rw-r--r--contrib/perl5/lib/File/Spec.pm86
-rw-r--r--contrib/perl5/lib/File/Spec/Functions.pm95
-rw-r--r--contrib/perl5/lib/File/Spec/Mac.pm285
-rw-r--r--contrib/perl5/lib/File/Spec/OS2.pm50
-rw-r--r--contrib/perl5/lib/File/Spec/Unix.pm363
-rw-r--r--contrib/perl5/lib/File/Spec/VMS.pm450
-rw-r--r--contrib/perl5/lib/File/Spec/Win32.pm385
-rw-r--r--contrib/perl5/lib/File/stat.pm6
-rw-r--r--contrib/perl5/lib/FileHandle.pm4
-rw-r--r--contrib/perl5/lib/FindBin.pm4
-rw-r--r--contrib/perl5/lib/Getopt/Long.pm1025
-rw-r--r--contrib/perl5/lib/Getopt/Std.pm89
-rw-r--r--contrib/perl5/lib/I18N/Collate.pm5
-rw-r--r--contrib/perl5/lib/IPC/Open2.pm75
-rw-r--r--contrib/perl5/lib/IPC/Open3.pm83
-rw-r--r--contrib/perl5/lib/Math/BigFloat.pm57
-rw-r--r--contrib/perl5/lib/Math/BigInt.pm89
-rw-r--r--contrib/perl5/lib/Math/Complex.pm188
-rw-r--r--contrib/perl5/lib/Math/Trig.pm32
-rw-r--r--contrib/perl5/lib/Net/Ping.pm11
-rw-r--r--contrib/perl5/lib/Net/hostent.pm3
-rw-r--r--contrib/perl5/lib/Net/netent.pm19
-rw-r--r--contrib/perl5/lib/Net/protoent.pm3
-rw-r--r--contrib/perl5/lib/Net/servent.pm3
-rw-r--r--contrib/perl5/lib/Pod/Checker.pm1195
-rw-r--r--contrib/perl5/lib/Pod/Find.pm278
-rw-r--r--contrib/perl5/lib/Pod/Functions.pm20
-rw-r--r--contrib/perl5/lib/Pod/Html.pm1654
-rw-r--r--contrib/perl5/lib/Pod/InputObjects.pm933
-rw-r--r--contrib/perl5/lib/Pod/Man.pm1217
-rw-r--r--contrib/perl5/lib/Pod/ParseUtils.pm837
-rw-r--r--contrib/perl5/lib/Pod/Parser.pm1771
-rw-r--r--contrib/perl5/lib/Pod/Plainer.pm69
-rw-r--r--contrib/perl5/lib/Pod/Select.pm745
-rw-r--r--contrib/perl5/lib/Pod/Text.pm1154
-rw-r--r--contrib/perl5/lib/Pod/Text/Color.pm125
-rw-r--r--contrib/perl5/lib/Pod/Text/Termcap.pm142
-rw-r--r--contrib/perl5/lib/Pod/Usage.pm544
-rw-r--r--contrib/perl5/lib/SelfLoader.pm21
-rw-r--r--contrib/perl5/lib/Shell.pm60
-rw-r--r--contrib/perl5/lib/Term/ANSIColor.pm307
-rw-r--r--contrib/perl5/lib/Term/Cap.pm6
-rw-r--r--contrib/perl5/lib/Term/ReadLine.pm2
-rw-r--r--contrib/perl5/lib/Test.pm20
-rw-r--r--contrib/perl5/lib/Test/Harness.pm123
-rw-r--r--contrib/perl5/lib/Text/Abbrev.pm68
-rw-r--r--contrib/perl5/lib/Text/ParseWords.pm4
-rw-r--r--contrib/perl5/lib/Text/Soundex.pm2
-rw-r--r--contrib/perl5/lib/Text/Tabs.pm14
-rw-r--r--contrib/perl5/lib/Tie/Array.pm48
-rw-r--r--contrib/perl5/lib/Tie/Handle.pm89
-rw-r--r--contrib/perl5/lib/Tie/Hash.pm7
-rw-r--r--contrib/perl5/lib/Tie/RefHash.pm7
-rw-r--r--contrib/perl5/lib/Tie/Scalar.pm23
-rw-r--r--contrib/perl5/lib/Time/Local.pm232
-rw-r--r--contrib/perl5/lib/Time/gmtime.pm3
-rw-r--r--contrib/perl5/lib/Time/localtime.pm5
-rw-r--r--contrib/perl5/lib/UNIVERSAL.pm18
-rw-r--r--contrib/perl5/lib/User/grent.pm3
-rw-r--r--contrib/perl5/lib/User/pwent.pm286
-rw-r--r--contrib/perl5/lib/abbrev.pl10
-rw-r--r--contrib/perl5/lib/attributes.pm399
-rw-r--r--contrib/perl5/lib/autouse.pm4
-rw-r--r--contrib/perl5/lib/base.pm25
-rw-r--r--contrib/perl5/lib/bigfloat.pl27
-rw-r--r--contrib/perl5/lib/bigint.pl10
-rw-r--r--contrib/perl5/lib/bigrat.pl8
-rw-r--r--contrib/perl5/lib/blib.pm6
-rw-r--r--contrib/perl5/lib/bytes.pm52
-rw-r--r--contrib/perl5/lib/bytes_heavy.pl8
-rw-r--r--contrib/perl5/lib/cacheout.pl9
-rw-r--r--contrib/perl5/lib/charnames.pm135
-rw-r--r--contrib/perl5/lib/chat2.pl9
-rw-r--r--contrib/perl5/lib/complete.pl9
-rw-r--r--contrib/perl5/lib/constant.pm196
-rw-r--r--contrib/perl5/lib/ctime.pl8
-rwxr-xr-xcontrib/perl5/lib/diagnostics.pm44
-rw-r--r--contrib/perl5/lib/dotsh.pl13
-rw-r--r--contrib/perl5/lib/dumpvar.pl56
-rw-r--r--contrib/perl5/lib/exceptions.pl7
-rw-r--r--contrib/perl5/lib/fastcwd.pl8
-rw-r--r--contrib/perl5/lib/fields.pm294
-rw-r--r--contrib/perl5/lib/filetest.pm68
-rw-r--r--contrib/perl5/lib/flush.pl9
-rw-r--r--contrib/perl5/lib/ftp.pl9
-rw-r--r--contrib/perl5/lib/getcwd.pl9
-rw-r--r--contrib/perl5/lib/getopt.pl10
-rw-r--r--contrib/perl5/lib/getopts.pl10
-rw-r--r--contrib/perl5/lib/hostname.pl10
-rw-r--r--contrib/perl5/lib/integer.pm17
-rw-r--r--contrib/perl5/lib/lib.pm68
-rw-r--r--contrib/perl5/lib/locale.pm9
-rw-r--r--contrib/perl5/lib/look.pl8
-rw-r--r--contrib/perl5/lib/open.pm76
-rw-r--r--contrib/perl5/lib/overload.pm177
-rw-r--r--contrib/perl5/lib/perl5db.pl934
-rw-r--r--contrib/perl5/lib/pwd.pl13
-rw-r--r--contrib/perl5/lib/strict.pm11
-rw-r--r--contrib/perl5/lib/syslog.pl6
-rw-r--r--contrib/perl5/lib/termcap.pl9
-rw-r--r--contrib/perl5/lib/unicode/ArabLink.pl46
-rw-r--r--contrib/perl5/lib/unicode/ArabLnkGrp.pl94
-rw-r--r--contrib/perl5/lib/unicode/ArabShap.txt170
-rw-r--r--contrib/perl5/lib/unicode/Bidirectional.pl638
-rw-r--r--contrib/perl5/lib/unicode/Block.pl93
-rw-r--r--contrib/perl5/lib/unicode/Blocks.txt90
-rw-r--r--contrib/perl5/lib/unicode/Category.pl1506
-rw-r--r--contrib/perl5/lib/unicode/CombiningClass.pl152
-rw-r--r--contrib/perl5/lib/unicode/CompExcl.txt143
-rw-r--r--contrib/perl5/lib/unicode/Decomposition.pl3470
-rw-r--r--contrib/perl5/lib/unicode/EAWidth.txt10636
-rw-r--r--contrib/perl5/lib/unicode/In/AlphabeticPresentationForms.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Arabic.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/ArabicPresentationForms-A.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/ArabicPresentationForms-B.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Armenian.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Arrows.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/BasicLatin.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Bengali.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/BlockElements.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Bopomofo.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/BopomofoExtended.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/BoxDrawing.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/BraillePatterns.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CJKCompatibility.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CJKCompatibilityForms.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CJKCompatibilityIdeographs.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CJKRadicalsSupplement.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CJKSymbolsandPunctuation.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CJKUnifiedIdeographs.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Cherokee.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CombiningDiacriticalMarks.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CombiningHalfMarks.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CombiningMarksforSymbols.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/ControlPictures.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/CurrencySymbols.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Cyrillic.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Devanagari.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Dingbats.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/EnclosedAlphanumerics.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/EnclosedCJKLettersandMonths.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Ethiopic.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/GeneralPunctuation.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/GeometricShapes.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Georgian.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Greek.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/GreekExtended.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Gujarati.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Gurmukhi.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/HalfwidthandFullwidthForms.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/HangulCompatibilityJamo.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/HangulJamo.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/HangulSyllables.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Hebrew.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/HighPrivateUseSurrogates.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/HighSurrogates.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Hiragana.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/IPAExtensions.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/IdeographicDescriptionCharacters.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Kanbun.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/KangxiRadicals.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Kannada.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Katakana.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Khmer.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Lao.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Latin-1Supplement.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/LatinExtended-A.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/LatinExtended-B.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/LatinExtendedAdditional.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/LetterlikeSymbols.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/LowSurrogates.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Malayalam.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/MathematicalOperators.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/MiscellaneousSymbols.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/MiscellaneousTechnical.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Mongolian.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Myanmar.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/NumberForms.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Ogham.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/OpticalCharacterRecognition.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Oriya.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/PrivateUse.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Runic.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Sinhala.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/SmallFormVariants.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/SpacingModifierLetters.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Specials.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/SuperscriptsandSubscripts.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Syriac.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Tamil.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Telugu.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Thaana.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Thai.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/Tibetan.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/YiRadicals.pl6
-rw-r--r--contrib/perl5/lib/unicode/In/YiSyllables.pl6
-rw-r--r--contrib/perl5/lib/unicode/Index.txt3055
-rw-r--r--contrib/perl5/lib/unicode/Is/ASCII.pl6
-rw-r--r--contrib/perl5/lib/unicode/Is/Alnum.pl276
-rw-r--r--contrib/perl5/lib/unicode/Is/Alpha.pl258
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiAN.pl7
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiB.pl10
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiCS.pl16
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiEN.pl15
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiES.pl7
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiET.pl29
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiL.pl323
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiON.pl115
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiR.pl19
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiS.pl8
-rw-r--r--contrib/perl5/lib/unicode/Is/BidiWS.pl12
-rw-r--r--contrib/perl5/lib/unicode/Is/C.pl18
-rw-r--r--contrib/perl5/lib/unicode/Is/Cc.pl7
-rw-r--r--contrib/perl5/lib/unicode/Is/Cn.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/Cntrl.pl18
-rw-r--r--contrib/perl5/lib/unicode/Is/Co.pl6
-rw-r--r--contrib/perl5/lib/unicode/Is/DCcircle.pl10
-rw-r--r--contrib/perl5/lib/unicode/Is/DCcompat.pl69
-rw-r--r--contrib/perl5/lib/unicode/Is/DCfinal.pl118
-rw-r--r--contrib/perl5/lib/unicode/Is/DCfont.pl16
-rw-r--r--contrib/perl5/lib/unicode/Is/DCinital.pl59
-rw-r--r--contrib/perl5/lib/unicode/Is/DCinitial.pl80
-rw-r--r--contrib/perl5/lib/unicode/Is/DCisolated.pl103
-rw-r--r--contrib/perl5/lib/unicode/Is/DCnarrow.pl11
-rw-r--r--contrib/perl5/lib/unicode/Is/DCnoBreak.pl10
-rw-r--r--contrib/perl5/lib/unicode/Is/DCsmall.pl8
-rw-r--r--contrib/perl5/lib/unicode/Is/DCsquare.pl8
-rw-r--r--contrib/perl5/lib/unicode/Is/DCsub.pl6
-rw-r--r--contrib/perl5/lib/unicode/Is/DCsuper.pl15
-rw-r--r--contrib/perl5/lib/unicode/Is/DCvertical.pl6
-rw-r--r--contrib/perl5/lib/unicode/Is/DCwide.pl8
-rw-r--r--contrib/perl5/lib/unicode/Is/DecoCanon.pl212
-rw-r--r--contrib/perl5/lib/unicode/Is/DecoCompat.pl107
-rw-r--r--contrib/perl5/lib/unicode/Is/Digit.pl25
-rw-r--r--contrib/perl5/lib/unicode/Is/Graph.pl362
-rw-r--r--contrib/perl5/lib/unicode/Is/L.pl260
-rw-r--r--contrib/perl5/lib/unicode/Is/Ll.pl379
-rw-r--r--contrib/perl5/lib/unicode/Is/Lm.pl23
-rw-r--r--contrib/perl5/lib/unicode/Is/Lo.pl191
-rw-r--r--contrib/perl5/lib/unicode/Is/Lower.pl379
-rw-r--r--contrib/perl5/lib/unicode/Is/Lt.pl15
-rw-r--r--contrib/perl5/lib/unicode/Is/Lu.pl376
-rw-r--r--contrib/perl5/lib/unicode/Is/M.pl105
-rw-r--r--contrib/perl5/lib/unicode/Is/Mc.pl56
-rw-r--r--contrib/perl5/lib/unicode/Is/Mirrored.pl48
-rw-r--r--contrib/perl5/lib/unicode/Is/Mn.pl98
-rw-r--r--contrib/perl5/lib/unicode/Is/N.pl43
-rw-r--r--contrib/perl5/lib/unicode/Is/Nd.pl25
-rw-r--r--contrib/perl5/lib/unicode/Is/No.pl23
-rw-r--r--contrib/perl5/lib/unicode/Is/P.pl80
-rw-r--r--contrib/perl5/lib/unicode/Is/Pd.pl16
-rw-r--r--contrib/perl5/lib/unicode/Is/Pe.pl41
-rw-r--r--contrib/perl5/lib/unicode/Is/Po.pl70
-rw-r--r--contrib/perl5/lib/unicode/Is/Print.pl362
-rw-r--r--contrib/perl5/lib/unicode/Is/Ps.pl43
-rw-r--r--contrib/perl5/lib/unicode/Is/Punct.pl80
-rw-r--r--contrib/perl5/lib/unicode/Is/S.pl131
-rw-r--r--contrib/perl5/lib/unicode/Is/Sc.pl15
-rw-r--r--contrib/perl5/lib/unicode/Is/Sm.pl40
-rw-r--r--contrib/perl5/lib/unicode/Is/So.pl103
-rw-r--r--contrib/perl5/lib/unicode/Is/Space.pl14
-rw-r--r--contrib/perl5/lib/unicode/Is/SylA.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylC.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylE.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylI.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylO.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylU.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylV.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylWA.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylWC.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylWE.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylWI.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/SylWV.pl5
-rw-r--r--contrib/perl5/lib/unicode/Is/Syllable.pl4
-rw-r--r--contrib/perl5/lib/unicode/Is/Upper.pl376
-rw-r--r--contrib/perl5/lib/unicode/Is/Word.pl277
-rw-r--r--contrib/perl5/lib/unicode/Is/XDigit.pl8
-rw-r--r--contrib/perl5/lib/unicode/Is/Z.pl12
-rw-r--r--contrib/perl5/lib/unicode/Is/Zl.pl6
-rw-r--r--contrib/perl5/lib/unicode/Is/Zp.pl6
-rw-r--r--contrib/perl5/lib/unicode/Is/Zs.pl11
-rw-r--r--contrib/perl5/lib/unicode/Jamo.txt69
-rw-r--r--contrib/perl5/lib/unicode/JamoShort.pl72
-rw-r--r--contrib/perl5/lib/unicode/LineBrk.txt10643
-rw-r--r--contrib/perl5/lib/unicode/Makefile6
-rw-r--r--contrib/perl5/lib/unicode/Name.pl10552
-rw-r--r--contrib/perl5/lib/unicode/Names.txt17271
-rw-r--r--contrib/perl5/lib/unicode/NamesList.html226
-rw-r--r--contrib/perl5/lib/unicode/Number.pl386
-rw-r--r--contrib/perl5/lib/unicode/Props.txt3640
-rw-r--r--contrib/perl5/lib/unicode/README.Ethiopic18
-rw-r--r--contrib/perl5/lib/unicode/ReadMe.txt45
-rw-r--r--contrib/perl5/lib/unicode/SpecCase.txt219
-rw-r--r--contrib/perl5/lib/unicode/To/Digit.pl30
-rw-r--r--contrib/perl5/lib/unicode/To/Lower.pl401
-rw-r--r--contrib/perl5/lib/unicode/To/Title.pl411
-rw-r--r--contrib/perl5/lib/unicode/To/Upper.pl411
-rw-r--r--contrib/perl5/lib/unicode/UCD300.html345
-rw-r--r--contrib/perl5/lib/unicode/Unicode.30010617
-rw-r--r--contrib/perl5/lib/unicode/Unicode3.html1988
-rwxr-xr-xcontrib/perl5/lib/unicode/mktables.PL339
-rw-r--r--contrib/perl5/lib/unicode/syllables.txt1329
-rw-r--r--contrib/perl5/lib/utf8.pm77
-rw-r--r--contrib/perl5/lib/utf8_heavy.pl221
-rw-r--r--contrib/perl5/lib/vars.pm14
-rw-r--r--contrib/perl5/lib/warnings.pm318
-rw-r--r--contrib/perl5/lib/warnings/register.pm30
-rwxr-xr-xcontrib/perl5/makeaperl.SH2
-rw-r--r--contrib/perl5/makedef.pl794
-rwxr-xr-xcontrib/perl5/makedepend.SH14
-rwxr-xr-xcontrib/perl5/makedir.SH2
-rw-r--r--contrib/perl5/malloc.c874
-rw-r--r--contrib/perl5/mg.c906
-rw-r--r--contrib/perl5/mg.h14
-rw-r--r--contrib/perl5/minimod.pl2
-rw-r--r--contrib/perl5/miniperlmain.c25
-rwxr-xr-xcontrib/perl5/myconfig.SH60
-rw-r--r--contrib/perl5/objXSUB.h3749
-rw-r--r--contrib/perl5/op.c2989
-rw-r--r--contrib/perl5/op.h266
-rw-r--r--contrib/perl5/opcode.h2984
-rwxr-xr-xcontrib/perl5/opcode.pl520
-rw-r--r--contrib/perl5/opnames.h362
-rw-r--r--contrib/perl5/patchlevel.h41
-rw-r--r--contrib/perl5/perl.c1875
-rw-r--r--contrib/perl5/perl.h1945
-rw-r--r--contrib/perl5/perlapi.c4004
-rw-r--r--contrib/perl5/perlapi.h892
-rw-r--r--contrib/perl5/perlio.c67
-rw-r--r--contrib/perl5/perlsdio.h6
-rw-r--r--contrib/perl5/perlsfio.h7
-rw-r--r--contrib/perl5/perlvars.h173
-rw-r--r--contrib/perl5/perly.c2936
-rwxr-xr-xcontrib/perl5/perly.fixer23
-rw-r--r--contrib/perl5/perly.h43
-rw-r--r--contrib/perl5/perly.y231
-rw-r--r--contrib/perl5/perly_c.diff393
-rw-r--r--contrib/perl5/pod/Makefile61
-rw-r--r--contrib/perl5/pod/Win32.pod284
-rw-r--r--contrib/perl5/pod/buildtoc39
-rw-r--r--contrib/perl5/pod/perl.pod268
-rw-r--r--contrib/perl5/pod/perl5004delta.pod20
-rw-r--r--contrib/perl5/pod/perl5005delta.pod989
-rw-r--r--contrib/perl5/pod/perlapi.pod2232
-rw-r--r--contrib/perl5/pod/perlbook.pod2
-rw-r--r--contrib/perl5/pod/perlboot.pod811
-rw-r--r--contrib/perl5/pod/perlcall.pod244
-rw-r--r--contrib/perl5/pod/perlcompile.pod444
-rw-r--r--contrib/perl5/pod/perldata.pod647
-rw-r--r--contrib/perl5/pod/perldbmfilter.pod168
-rw-r--r--contrib/perl5/pod/perldebguts.pod923
-rw-r--r--contrib/perl5/pod/perldebug.pod1682
-rw-r--r--contrib/perl5/pod/perldelta.pod3228
-rw-r--r--contrib/perl5/pod/perldiag.pod1178
-rw-r--r--contrib/perl5/pod/perldsc.pod224
-rw-r--r--contrib/perl5/pod/perlembed.pod148
-rw-r--r--contrib/perl5/pod/perlfaq.pod40
-rw-r--r--contrib/perl5/pod/perlfaq1.pod45
-rw-r--r--contrib/perl5/pod/perlfaq2.pod152
-rw-r--r--contrib/perl5/pod/perlfaq3.pod153
-rw-r--r--contrib/perl5/pod/perlfaq4.pod340
-rw-r--r--contrib/perl5/pod/perlfaq5.pod144
-rw-r--r--contrib/perl5/pod/perlfaq6.pod149
-rw-r--r--contrib/perl5/pod/perlfaq7.pod209
-rw-r--r--contrib/perl5/pod/perlfaq8.pod52
-rw-r--r--contrib/perl5/pod/perlfaq9.pod107
-rw-r--r--contrib/perl5/pod/perlfilter.pod570
-rw-r--r--contrib/perl5/pod/perlfork.pod301
-rw-r--r--contrib/perl5/pod/perlfunc.pod2616
-rw-r--r--contrib/perl5/pod/perlguts.pod2421
-rw-r--r--contrib/perl5/pod/perlhack.pod292
-rw-r--r--contrib/perl5/pod/perlhist.pod96
-rw-r--r--contrib/perl5/pod/perlintern.pod26
-rw-r--r--contrib/perl5/pod/perlipc.pod91
-rw-r--r--contrib/perl5/pod/perllexwarn.pod433
-rw-r--r--contrib/perl5/pod/perllocale.pod29
-rw-r--r--contrib/perl5/pod/perllol.pod144
-rw-r--r--contrib/perl5/pod/perlmod.pod282
-rw-r--r--contrib/perl5/pod/perlmodinstall.pod91
-rw-r--r--contrib/perl5/pod/perlmodlib.pod878
-rw-r--r--contrib/perl5/pod/perlnumber.pod185
-rw-r--r--contrib/perl5/pod/perlobj.pod166
-rw-r--r--contrib/perl5/pod/perlop.pod1000
-rw-r--r--contrib/perl5/pod/perlopentut.pod42
-rw-r--r--contrib/perl5/pod/perlpod.pod69
-rw-r--r--contrib/perl5/pod/perlport.pod1329
-rw-r--r--contrib/perl5/pod/perlre.pod888
-rw-r--r--contrib/perl5/pod/perlref.pod189
-rw-r--r--contrib/perl5/pod/perlreftut.pod22
-rw-r--r--contrib/perl5/pod/perlrun.pod478
-rw-r--r--contrib/perl5/pod/perlsec.pod30
-rw-r--r--contrib/perl5/pod/perlstyle.pod6
-rw-r--r--contrib/perl5/pod/perlsub.pod716
-rw-r--r--contrib/perl5/pod/perlsyn.pod86
-rw-r--r--contrib/perl5/pod/perlthrtut.pod328
-rw-r--r--contrib/perl5/pod/perltie.pod22
-rw-r--r--contrib/perl5/pod/perltoc.pod5684
-rw-r--r--contrib/perl5/pod/perltodo.pod870
-rw-r--r--contrib/perl5/pod/perltoot.pod39
-rw-r--r--contrib/perl5/pod/perltootc.pod1337
-rw-r--r--contrib/perl5/pod/perltrap.pod70
-rw-r--r--contrib/perl5/pod/perlunicode.pod244
-rw-r--r--contrib/perl5/pod/perlvar.pod820
-rw-r--r--contrib/perl5/pod/perlxs.pod647
-rw-r--r--contrib/perl5/pod/perlxstut.pod902
-rw-r--r--contrib/perl5/pod/pod2latex.PL10
-rw-r--r--contrib/perl5/pod/pod2man.PL1389
-rw-r--r--contrib/perl5/pod/pod2text.PL191
-rw-r--r--contrib/perl5/pod/pod2usage.PL179
-rw-r--r--contrib/perl5/pod/podchecker.PL162
-rw-r--r--contrib/perl5/pod/podselect.PL142
-rw-r--r--contrib/perl5/pod/roffitall16
-rw-r--r--contrib/perl5/pp.c2072
-rw-r--r--contrib/perl5/pp.h213
-rw-r--r--contrib/perl5/pp.sym391
-rw-r--r--contrib/perl5/pp_ctl.c1827
-rw-r--r--contrib/perl5/pp_hot.c1168
-rw-r--r--contrib/perl5/pp_proto.h736
-rw-r--r--contrib/perl5/pp_sys.c1576
-rw-r--r--contrib/perl5/proto.h2076
-rw-r--r--contrib/perl5/regcomp.c2837
-rw-r--r--contrib/perl5/regcomp.h201
-rw-r--r--contrib/perl5/regcomp.pl29
-rw-r--r--contrib/perl5/regcomp.sym26
-rw-r--r--contrib/perl5/regexec.c2776
-rw-r--r--contrib/perl5/regexp.h131
-rw-r--r--contrib/perl5/regnodes.h286
-rw-r--r--contrib/perl5/run.c69
-rw-r--r--contrib/perl5/scope.c338
-rw-r--r--contrib/perl5/scope.h316
-rw-r--r--contrib/perl5/sv.c5650
-rw-r--r--contrib/perl5/sv.h476
-rwxr-xr-xcontrib/perl5/t/TEST11
-rwxr-xr-xcontrib/perl5/t/UTEST195
-rwxr-xr-xcontrib/perl5/t/base/lex.t68
-rwxr-xr-xcontrib/perl5/t/base/rs.t5
-rwxr-xr-xcontrib/perl5/t/base/term.t2
-rwxr-xr-xcontrib/perl5/t/cmd/while.t55
-rwxr-xr-xcontrib/perl5/t/comp/bproto.t44
-rwxr-xr-xcontrib/perl5/t/comp/colon.t2
-rwxr-xr-xcontrib/perl5/t/comp/cpp.aux4
-rwxr-xr-xcontrib/perl5/t/comp/cpp.t4
-rwxr-xr-xcontrib/perl5/t/comp/proto.t51
-rwxr-xr-xcontrib/perl5/t/comp/require.t85
-rwxr-xr-xcontrib/perl5/t/comp/script.t3
-rwxr-xr-xcontrib/perl5/t/comp/term.t8
-rwxr-xr-xcontrib/perl5/t/comp/use.t79
-rw-r--r--contrib/perl5/t/harness66
-rwxr-xr-xcontrib/perl5/t/io/argv.t90
-rwxr-xr-xcontrib/perl5/t/io/dup.t1
-rwxr-xr-xcontrib/perl5/t/io/fs.t62
-rwxr-xr-xcontrib/perl5/t/io/nargv.t63
-rwxr-xr-xcontrib/perl5/t/io/open.t282
-rwxr-xr-xcontrib/perl5/t/io/openpid.t86
-rwxr-xr-xcontrib/perl5/t/io/pipe.t151
-rwxr-xr-xcontrib/perl5/t/io/print.t8
-rwxr-xr-xcontrib/perl5/t/io/tell.t46
-rwxr-xr-xcontrib/perl5/t/lib/abbrev.t2
-rwxr-xr-xcontrib/perl5/t/lib/ansicolor.t73
-rwxr-xr-xcontrib/perl5/t/lib/anydbm.t32
-rwxr-xr-xcontrib/perl5/t/lib/attrs.t138
-rwxr-xr-xcontrib/perl5/t/lib/autoloader.t25
-rwxr-xr-xcontrib/perl5/t/lib/basename.t2
-rwxr-xr-xcontrib/perl5/t/lib/bigfloat.t408
-rwxr-xr-xcontrib/perl5/t/lib/bigfltpm.t463
-rwxr-xr-xcontrib/perl5/t/lib/bigint.t2
-rwxr-xr-xcontrib/perl5/t/lib/bigintpm.t116
-rwxr-xr-xcontrib/perl5/t/lib/cgi-form.t10
-rwxr-xr-xcontrib/perl5/t/lib/cgi-function.t2
-rwxr-xr-xcontrib/perl5/t/lib/cgi-html.t22
-rwxr-xr-xcontrib/perl5/t/lib/cgi-request.t19
-rwxr-xr-xcontrib/perl5/t/lib/charnames.t74
-rwxr-xr-xcontrib/perl5/t/lib/checktree.t2
-rwxr-xr-xcontrib/perl5/t/lib/complex.t121
-rwxr-xr-xcontrib/perl5/t/lib/db-btree.t618
-rwxr-xr-xcontrib/perl5/t/lib/db-hash.t277
-rwxr-xr-xcontrib/perl5/t/lib/db-recno.t412
-rwxr-xr-xcontrib/perl5/t/lib/dirhand.t2
-rwxr-xr-xcontrib/perl5/t/lib/dosglob.t2
-rwxr-xr-xcontrib/perl5/t/lib/dprof.t80
-rw-r--r--contrib/perl5/t/lib/dprof/V.pm59
-rw-r--r--contrib/perl5/t/lib/dprof/test1_t18
-rw-r--r--contrib/perl5/t/lib/dprof/test1_v24
-rw-r--r--contrib/perl5/t/lib/dprof/test2_t21
-rw-r--r--contrib/perl5/t/lib/dprof/test2_v36
-rw-r--r--contrib/perl5/t/lib/dprof/test3_t19
-rw-r--r--contrib/perl5/t/lib/dprof/test3_v29
-rw-r--r--contrib/perl5/t/lib/dprof/test4_t24
-rw-r--r--contrib/perl5/t/lib/dprof/test4_v36
-rw-r--r--contrib/perl5/t/lib/dprof/test5_t25
-rw-r--r--contrib/perl5/t/lib/dprof/test5_v15
-rw-r--r--contrib/perl5/t/lib/dprof/test6_t29
-rw-r--r--contrib/perl5/t/lib/dprof/test6_v16
-rwxr-xr-xcontrib/perl5/t/lib/dumper-ovl.t2
-rwxr-xr-xcontrib/perl5/t/lib/dumper.t195
-rwxr-xr-xcontrib/perl5/t/lib/english.t4
-rwxr-xr-xcontrib/perl5/t/lib/env-array.t100
-rwxr-xr-xcontrib/perl5/t/lib/env.t13
-rwxr-xr-xcontrib/perl5/t/lib/errno.t2
-rwxr-xr-xcontrib/perl5/t/lib/fatal.t17
-rwxr-xr-xcontrib/perl5/t/lib/fields.t70
-rwxr-xr-xcontrib/perl5/t/lib/filecache.t2
-rwxr-xr-xcontrib/perl5/t/lib/filecopy.t177
-rwxr-xr-xcontrib/perl5/t/lib/filefind.t162
-rwxr-xr-xcontrib/perl5/t/lib/filefunc.t17
-rwxr-xr-xcontrib/perl5/t/lib/filehand.t5
-rwxr-xr-xcontrib/perl5/t/lib/filepath.t4
-rwxr-xr-xcontrib/perl5/t/lib/filespec.t384
-rwxr-xr-xcontrib/perl5/t/lib/findbin.t2
-rwxr-xr-xcontrib/perl5/t/lib/gdbm.t192
-rwxr-xr-xcontrib/perl5/t/lib/getopt.t2
-rwxr-xr-xcontrib/perl5/t/lib/glob-basic.t119
-rwxr-xr-xcontrib/perl5/t/lib/glob-case.t53
-rwxr-xr-xcontrib/perl5/t/lib/glob-global.t110
-rwxr-xr-xcontrib/perl5/t/lib/glob-taint.t26
-rwxr-xr-xcontrib/perl5/t/lib/gol-basic.t24
-rwxr-xr-xcontrib/perl5/t/lib/gol-compat.t25
-rwxr-xr-xcontrib/perl5/t/lib/gol-linkage.t37
-rwxr-xr-xcontrib/perl5/t/lib/h2ph.t3
-rwxr-xr-xcontrib/perl5/t/lib/hostname.t3
-rwxr-xr-xcontrib/perl5/t/lib/io_const.t33
-rwxr-xr-xcontrib/perl5/t/lib/io_dir.t66
-rwxr-xr-xcontrib/perl5/t/lib/io_dup.t2
-rwxr-xr-xcontrib/perl5/t/lib/io_linenum.t80
-rwxr-xr-xcontrib/perl5/t/lib/io_multihomed.t124
-rwxr-xr-xcontrib/perl5/t/lib/io_pipe.t16
-rwxr-xr-xcontrib/perl5/t/lib/io_poll.t77
-rwxr-xr-xcontrib/perl5/t/lib/io_sel.t20
-rwxr-xr-xcontrib/perl5/t/lib/io_sock.t124
-rwxr-xr-xcontrib/perl5/t/lib/io_taint.t2
-rwxr-xr-xcontrib/perl5/t/lib/io_tell.t2
-rwxr-xr-xcontrib/perl5/t/lib/io_udp.t74
-rwxr-xr-xcontrib/perl5/t/lib/io_unix.t89
-rwxr-xr-xcontrib/perl5/t/lib/io_xs.t2
-rwxr-xr-xcontrib/perl5/t/lib/ipc_sysv.t178
-rwxr-xr-xcontrib/perl5/t/lib/ndbm.t192
-rwxr-xr-xcontrib/perl5/t/lib/odbm.t205
-rwxr-xr-xcontrib/perl5/t/lib/opcode.t2
-rwxr-xr-xcontrib/perl5/t/lib/open2.t2
-rwxr-xr-xcontrib/perl5/t/lib/open3.t18
-rwxr-xr-xcontrib/perl5/t/lib/ops.t2
-rwxr-xr-xcontrib/perl5/t/lib/parsewords.t56
-rwxr-xr-xcontrib/perl5/t/lib/ph.t2
-rwxr-xr-xcontrib/perl5/t/lib/posix.t33
-rwxr-xr-xcontrib/perl5/t/lib/safe1.t2
-rwxr-xr-xcontrib/perl5/t/lib/safe2.t7
-rwxr-xr-xcontrib/perl5/t/lib/sdbm.t204
-rwxr-xr-xcontrib/perl5/t/lib/searchdict.t2
-rwxr-xr-xcontrib/perl5/t/lib/selectsaver.t2
-rwxr-xr-xcontrib/perl5/t/lib/socket.t15
-rwxr-xr-xcontrib/perl5/t/lib/soundex.t2
-rwxr-xr-xcontrib/perl5/t/lib/symbol.t2
-rwxr-xr-xcontrib/perl5/t/lib/syslfs.t221
-rwxr-xr-xcontrib/perl5/t/lib/textfill.t4
-rwxr-xr-xcontrib/perl5/t/lib/texttabs.t2
-rwxr-xr-xcontrib/perl5/t/lib/textwrap.t3
-rwxr-xr-xcontrib/perl5/t/lib/thr5005.t118
-rwxr-xr-xcontrib/perl5/t/lib/tie-push.t4
-rwxr-xr-xcontrib/perl5/t/lib/tie-stdarray.t4
-rwxr-xr-xcontrib/perl5/t/lib/tie-stdhandle.t47
-rwxr-xr-xcontrib/perl5/t/lib/tie-stdpush.t4
-rwxr-xr-xcontrib/perl5/t/lib/timelocal.t2
-rwxr-xr-xcontrib/perl5/t/lib/trig.t2
-rwxr-xr-xcontrib/perl5/t/op/64bitint.t242
-rwxr-xr-xcontrib/perl5/t/op/args.t54
-rwxr-xr-xcontrib/perl5/t/op/arith.t13
-rwxr-xr-xcontrib/perl5/t/op/array.t7
-rwxr-xr-xcontrib/perl5/t/op/assignwarn.t4
-rwxr-xr-xcontrib/perl5/t/op/attrs.t176
-rwxr-xr-xcontrib/perl5/t/op/avhv.t74
-rwxr-xr-xcontrib/perl5/t/op/bop.t23
-rwxr-xr-xcontrib/perl5/t/op/chars.t74
-rwxr-xr-xcontrib/perl5/t/op/chop.t10
-rwxr-xr-xcontrib/perl5/t/op/closure.t29
-rwxr-xr-xcontrib/perl5/t/op/defins.t2
-rwxr-xr-xcontrib/perl5/t/op/delete.t82
-rwxr-xr-xcontrib/perl5/t/op/die.t2
-rwxr-xr-xcontrib/perl5/t/op/die_exit.t10
-rwxr-xr-xcontrib/perl5/t/op/each.t17
-rwxr-xr-xcontrib/perl5/t/op/eval.t37
-rwxr-xr-xcontrib/perl5/t/op/exec.t27
-rwxr-xr-xcontrib/perl5/t/op/exists_sub.t46
-rwxr-xr-xcontrib/perl5/t/op/fh.t26
-rwxr-xr-xcontrib/perl5/t/op/filetest.t71
-rwxr-xr-xcontrib/perl5/t/op/fork.t368
-rwxr-xr-xcontrib/perl5/t/op/glob.t5
-rwxr-xr-xcontrib/perl5/t/op/goto.t27
-rwxr-xr-xcontrib/perl5/t/op/goto_xs.t2
-rwxr-xr-xcontrib/perl5/t/op/grent.t139
-rwxr-xr-xcontrib/perl5/t/op/grep.t70
-rwxr-xr-xcontrib/perl5/t/op/groups.t106
-rwxr-xr-xcontrib/perl5/t/op/gv.t48
-rwxr-xr-xcontrib/perl5/t/op/hashwarn.t16
-rwxr-xr-xcontrib/perl5/t/op/inc.t53
-rwxr-xr-xcontrib/perl5/t/op/int.t17
-rwxr-xr-xcontrib/perl5/t/op/join.t16
-rwxr-xr-xcontrib/perl5/t/op/lex_assign.t324
-rwxr-xr-xcontrib/perl5/t/op/lfs.t226
-rwxr-xr-xcontrib/perl5/t/op/list.t12
-rwxr-xr-xcontrib/perl5/t/op/lop.t44
-rwxr-xr-xcontrib/perl5/t/op/magic.t47
-rwxr-xr-xcontrib/perl5/t/op/method.t43
-rwxr-xr-xcontrib/perl5/t/op/misc.t133
-rwxr-xr-xcontrib/perl5/t/op/mkdir.t17
-rwxr-xr-xcontrib/perl5/t/op/nothr5005.t35
-rwxr-xr-xcontrib/perl5/t/op/numconvert.t186
-rwxr-xr-xcontrib/perl5/t/op/oct.t62
-rwxr-xr-xcontrib/perl5/t/op/ord.t15
-rwxr-xr-xcontrib/perl5/t/op/pack.t106
-rwxr-xr-xcontrib/perl5/t/op/pat.t419
-rwxr-xr-xcontrib/perl5/t/op/pwent.t137
-rwxr-xr-xcontrib/perl5/t/op/quotemeta.t8
-rwxr-xr-xcontrib/perl5/t/op/rand.t19
-rwxr-xr-xcontrib/perl5/t/op/range.t20
-rw-r--r--contrib/perl5/t/op/re_tests279
-rwxr-xr-xcontrib/perl5/t/op/readdir.t11
-rwxr-xr-xcontrib/perl5/t/op/recurse.t32
-rwxr-xr-xcontrib/perl5/t/op/ref.t22
-rwxr-xr-xcontrib/perl5/t/op/regexp.t19
-rwxr-xr-xcontrib/perl5/t/op/repeat.t17
-rwxr-xr-xcontrib/perl5/t/op/runlevel.t30
-rwxr-xr-xcontrib/perl5/t/op/sort.t209
-rwxr-xr-xcontrib/perl5/t/op/split.t6
-rwxr-xr-xcontrib/perl5/t/op/sprintf.t11
-rwxr-xr-xcontrib/perl5/t/op/stat.t88
-rwxr-xr-xcontrib/perl5/t/op/subst.t77
-rwxr-xr-xcontrib/perl5/t/op/subst_amp.t104
-rwxr-xr-xcontrib/perl5/t/op/subst_wamp.t11
-rwxr-xr-xcontrib/perl5/t/op/substr.t305
-rwxr-xr-xcontrib/perl5/t/op/sysio.t2
-rwxr-xr-xcontrib/perl5/t/op/taint.t105
-rwxr-xr-xcontrib/perl5/t/op/tie.t38
-rwxr-xr-xcontrib/perl5/t/op/tiearray.t2
-rwxr-xr-xcontrib/perl5/t/op/tiehandle.t2
-rwxr-xr-xcontrib/perl5/t/op/time.t8
-rwxr-xr-xcontrib/perl5/t/op/tr.t18
-rwxr-xr-xcontrib/perl5/t/op/undef.t22
-rwxr-xr-xcontrib/perl5/t/op/universal.t8
-rwxr-xr-xcontrib/perl5/t/op/vec.t4
-rwxr-xr-xcontrib/perl5/t/op/ver.t96
-rwxr-xr-xcontrib/perl5/t/op/write.t17
-rwxr-xr-xcontrib/perl5/t/pod/emptycmd.t21
-rw-r--r--contrib/perl5/t/pod/emptycmd.xr2
-rwxr-xr-xcontrib/perl5/t/pod/for.t59
-rw-r--r--contrib/perl5/t/pod/for.xr21
-rwxr-xr-xcontrib/perl5/t/pod/headings.t140
-rw-r--r--contrib/perl5/t/pod/headings.xr26
-rwxr-xr-xcontrib/perl5/t/pod/include.t36
-rw-r--r--contrib/perl5/t/pod/include.xr22
-rwxr-xr-xcontrib/perl5/t/pod/included.t35
-rw-r--r--contrib/perl5/t/pod/included.xr3
-rwxr-xr-xcontrib/perl5/t/pod/lref.t66
-rw-r--r--contrib/perl5/t/pod/lref.xr40
-rwxr-xr-xcontrib/perl5/t/pod/multiline_items.t31
-rw-r--r--contrib/perl5/t/pod/multiline_items.xr5
-rwxr-xr-xcontrib/perl5/t/pod/nested_items.t64
-rw-r--r--contrib/perl5/t/pod/nested_items.xr19
-rwxr-xr-xcontrib/perl5/t/pod/nested_seqs.t23
-rw-r--r--contrib/perl5/t/pod/nested_seqs.xr3
-rwxr-xr-xcontrib/perl5/t/pod/oneline_cmds.t46
-rw-r--r--contrib/perl5/t/pod/oneline_cmds.xr26
-rwxr-xr-xcontrib/perl5/t/pod/pod2usage.t18
-rw-r--r--contrib/perl5/t/pod/pod2usage.xr55
-rwxr-xr-xcontrib/perl5/t/pod/poderrs.t125
-rw-r--r--contrib/perl5/t/pod/poderrs.xr33
-rwxr-xr-xcontrib/perl5/t/pod/podselect.t18
-rw-r--r--contrib/perl5/t/pod/podselect.xr42
-rwxr-xr-xcontrib/perl5/t/pod/special_seqs.t43
-rw-r--r--contrib/perl5/t/pod/special_seqs.xr22
-rw-r--r--contrib/perl5/t/pod/testcmp.pl91
-rw-r--r--contrib/perl5/t/pod/testp2pt.pl192
-rw-r--r--contrib/perl5/t/pod/testpchk.pl129
-rwxr-xr-xcontrib/perl5/t/pragma/constant.t93
-rwxr-xr-xcontrib/perl5/t/pragma/diagnostics.t38
-rwxr-xr-xcontrib/perl5/t/pragma/locale.t689
-rw-r--r--contrib/perl5/t/pragma/locale/latin110
-rw-r--r--contrib/perl5/t/pragma/locale/utf810
-rwxr-xr-xcontrib/perl5/t/pragma/overload.t226
-rw-r--r--contrib/perl5/t/pragma/strict-refs2
-rw-r--r--contrib/perl5/t/pragma/strict-subs40
-rw-r--r--contrib/perl5/t/pragma/strict-vars176
-rwxr-xr-xcontrib/perl5/t/pragma/strict.t8
-rwxr-xr-xcontrib/perl5/t/pragma/sub_lval.t429
-rwxr-xr-xcontrib/perl5/t/pragma/subs.t6
-rwxr-xr-xcontrib/perl5/t/pragma/utf8.t253
-rw-r--r--contrib/perl5/t/pragma/warn/1global189
-rw-r--r--contrib/perl5/t/pragma/warn/2use308
-rw-r--r--contrib/perl5/t/pragma/warn/3both197
-rw-r--r--contrib/perl5/t/pragma/warn/4lint112
-rw-r--r--contrib/perl5/t/pragma/warn/5nolint96
-rw-r--r--contrib/perl5/t/pragma/warn/6default53
-rw-r--r--contrib/perl5/t/pragma/warn/7fatal242
-rw-r--r--contrib/perl5/t/pragma/warn/8signal18
-rwxr-xr-xcontrib/perl5/t/pragma/warn/9enabled819
-rw-r--r--contrib/perl5/t/pragma/warn/av9
-rw-r--r--contrib/perl5/t/pragma/warn/doio191
-rw-r--r--contrib/perl5/t/pragma/warn/doop6
-rw-r--r--contrib/perl5/t/pragma/warn/gv54
-rw-r--r--contrib/perl5/t/pragma/warn/hv8
-rw-r--r--contrib/perl5/t/pragma/warn/malloc9
-rw-r--r--contrib/perl5/t/pragma/warn/mg44
-rw-r--r--contrib/perl5/t/pragma/warn/op861
-rw-r--r--contrib/perl5/t/pragma/warn/perl57
-rw-r--r--contrib/perl5/t/pragma/warn/perlio10
-rw-r--r--contrib/perl5/t/pragma/warn/perly31
-rw-r--r--contrib/perl5/t/pragma/warn/pp110
-rw-r--r--contrib/perl5/t/pragma/warn/pp_ctl217
-rw-r--r--contrib/perl5/t/pragma/warn/pp_hot226
-rw-r--r--contrib/perl5/t/pragma/warn/pp_sys354
-rw-r--r--contrib/perl5/t/pragma/warn/regcomp165
-rw-r--r--contrib/perl5/t/pragma/warn/regexec119
-rw-r--r--contrib/perl5/t/pragma/warn/run8
-rw-r--r--contrib/perl5/t/pragma/warn/sv303
-rw-r--r--contrib/perl5/t/pragma/warn/taint49
-rw-r--r--contrib/perl5/t/pragma/warn/toke583
-rw-r--r--contrib/perl5/t/pragma/warn/universal16
-rw-r--r--contrib/perl5/t/pragma/warn/utf829
-rw-r--r--contrib/perl5/t/pragma/warn/util108
-rwxr-xr-xcontrib/perl5/t/pragma/warnings.t121
-rw-r--r--contrib/perl5/taint.c19
-rw-r--r--contrib/perl5/thrdvar.h76
-rw-r--r--contrib/perl5/thread.h454
-rw-r--r--contrib/perl5/toke.c2681
-rw-r--r--contrib/perl5/universal.c135
-rw-r--r--contrib/perl5/unixish.h23
-rw-r--r--contrib/perl5/utf8.c856
-rw-r--r--contrib/perl5/utf8.h51
-rw-r--r--contrib/perl5/util.c1947
-rw-r--r--contrib/perl5/util.h26
-rw-r--r--contrib/perl5/utils/Makefile13
-rw-r--r--contrib/perl5/utils/dprofpp.PL838
-rw-r--r--contrib/perl5/utils/h2ph.PL8
-rw-r--r--contrib/perl5/utils/h2xs.PL1084
-rw-r--r--contrib/perl5/utils/perlbc.PL80
-rw-r--r--contrib/perl5/utils/perlbug.PL168
-rw-r--r--contrib/perl5/utils/perlcc.PL414
-rw-r--r--contrib/perl5/utils/perldoc.PL706
-rw-r--r--contrib/perl5/warnings.h117
-rw-r--r--contrib/perl5/warnings.pl492
-rwxr-xr-xcontrib/perl5/writemain.SH12
-rwxr-xr-xcontrib/perl5/x2p/Makefile.SH7
-rw-r--r--contrib/perl5/x2p/a2p.c3862
-rw-r--r--contrib/perl5/x2p/a2p.h59
-rw-r--r--contrib/perl5/x2p/a2p.pod19
-rw-r--r--contrib/perl5/x2p/a2p.y11
-rw-r--r--contrib/perl5/x2p/a2py.c13
-rwxr-xr-xcontrib/perl5/x2p/cflags.SH4
-rw-r--r--contrib/perl5/x2p/find2perl.PL1178
-rw-r--r--contrib/perl5/x2p/hash.c7
-rw-r--r--contrib/perl5/x2p/hash.h18
-rw-r--r--contrib/perl5/x2p/s2p.PL14
-rw-r--r--contrib/perl5/x2p/str.h44
-rw-r--r--contrib/perl5/x2p/util.c3
-rw-r--r--contrib/perl5/x2p/util.h28
-rw-r--r--contrib/perl5/x2p/walk.c24
-rw-r--r--contrib/perl5/xsutils.c290
1081 files changed, 297336 insertions, 68420 deletions
diff --git a/contrib/perl5/AUTHORS b/contrib/perl5/AUTHORS
new file mode 100644
index 0000000..f978b51
--- /dev/null
+++ b/contrib/perl5/AUTHORS
@@ -0,0 +1,120 @@
+# Two sections: the real one and the virtual one.
+# The real section has three \t+ fields: alias, name, email.
+# The sections are separated by one or more empty lines.
+# The virtual section (each record two \t+ separated fields) builds
+# meta-aliases based on the real section.
+
+alan.burlison Alan Burlison Alan.Burlison@UK.Sun.com
+allen Norton T. Allen allen@huarp.harvard.edu
+bradapp Brad Appleton bradapp@enteract.com
+cbail Charles Bailey bailey@newman.upenn.edu
+dgris Daniel Grisinger dgris@dimensional.com
+dmulholl Daniel Yacob dmulholl@cs.indiana.edu
+dogcow Tom Spindler dogcow@merit.edu
+domo Dominic Dunlop domo@slipper.ip.lu
+doug Doug MacEachern dougm@pobox.com
+doughera Andy Dougherty doughera@lafcol.lafayette.edu
+gbarr Graham Barr gbarr@ti.com
+gerti Gerd Knops gerti@BITart.com
+gibreel Stephen Zander gibreel@pobox.com
+gnat Nathan Torkington gnat@frii.com
+gsar Gurusamy Sarathy gsar@activestate.com
+hansmu Hans Mulder hansmu@xs4all.nl
+ilya Ilya Zakharevich ilya@math.ohio-state.edu
+jbuehler Joe Buehler jbuehler@hekimian.com
+jfs John Stoffel jfs@fluent.com
+jhi Jarkko Hietaniemi jhi@iki.fi
+jon Jon Orwant orwant@media.mit.edu
+jvromans Johan Vromans jvromans@squirrel.nl
+k Andreas Koenig andreas.koenig@franz.ww.tu-berlin.de
+kjahds Kenneth Albanowski kjahds@kjahds.com
+krishna Krishna Sethuraman krishna@sgi.com
+kstar Kurt D. Starsinic kstar@isinet.com
+lstein Lincoln D. Stein lstein@genome.wi.mit.edu
+lutherh Luther Huffman lutherh@stratcom.com
+lutz Mark P. Lutz mark.p.lutz@boeing.com
+lwall Larry Wall larry@wall.org
+makemaker MakeMaker list makemaker@franz.ww.tu-berlin.de
+mbiggar Mark A Biggar mab@wdl.loral.com
+mbligh Martin J. Bligh mbligh@sequent.com
+mike Mike Stok mike@stok.co.uk
+millert Todd Miller millert@openbsd.org
+laszlo.molnar Laszlo Molnar Laszlo.Molnar@eth.ericsson.se
+mpeix Mark Bixby markb@cccd.edu
+muir David Muir Sharnoff muir@idiom.com
+neale Neale Ferguson neale@VMA.TABNSW.COM.AU
+nik Nick Ing-Simmons nik@tiuk.ti.com
+okamoto Jeff Okamoto okamoto@corp.hp.com
+paul_green Paul Green Paul_Green@stratus.com
+pmarquess Paul Marquess Paul.Marquess@btinternet.com
+pomeranz Hal Pomeranz pomeranz@netcom.com
+pudge Chris Nandor pudge@pobox.com
+pueschel Norbert Pueschel pueschel@imsdd.meb.uni-bonn.de
+pvhp Peter Prymmer pvhp@forte.com
+raphael Raphael Manfredi Raphael_Manfredi@pobox.com
+rdieter Rex Dieter rdieter@math.unl.edu
+rsanders Robert Sanders Robert.Sanders@linux.org
+roberto Ollivier Robert roberto@keltia.freenix.fr
+roderick Roderick Schertler roderick@argon.org
+roehrich Dean Roehrich roehrich@cray.com
+tsanders Tony Sanders sanders@bsdi.com
+schinder Paul Schinder schinder@pobox.com
+scotth Scott Henry scotth@sgi.com
+seibert Greg Seibert seibert@Lynx.COM
+spider Spider Boardman spider@Orb.Nashua.NH.US
+smccam Stephen McCamant smccam@uclink4.berkeley.edu
+sugalskd Dan Sugalski sugalskd@osshe.edu
+sundstrom David Sundstrom sunds@asictest.sc.ti.com
+tchrist Tom Christiansen tchrist@perl.com
+thomas.dorner Dorner Thomas Thomas.Dorner@start.de
+timb Tim Bunce Tim.Bunce@ig.co.uk
+tom.horsley Tom Horsley Tom.Horsley@mail.ccur.com
+tye Tye McQueen tye@metronet.com
+wayne.thompson Wayne Thompson Wayne.Thompson@Ebay.sun.com
+
+PUMPKING gsar
+aix jhi
+amiga pueschel
+beos dogcow
+bsdos tsanders
+cfg jhi
+cgi lstein
+complex jhi,raphael
+cpan k
+cxux tom.horsley
+cygwin win32
+dec_osf jhi,spider
+dgux roderick
+doc tchrist
+dos laszlo.molnar
+dynix/ptx mbligh
+ebcdic vms,vmesa,posixbc
+filespec kjahds
+freebsd roberto
+hpux okamoto,jhi
+irix scotth,krishna,jfs,kstar
+jpl gibreel
+linux kjahds,kstar
+locale jhi,domo
+lynxos lynxos
+machten domo
+mm makemaker
+mvs pvhp
+netbsd jhi
+openbsd millert
+os2 ilya
+plan9 lutherl
+posix-bc thomas.dorner
+powerux tom.horsley
+qnx allen
+solaris doughera,alan.burlison
+step gerti,hansmu,rdieter
+sunos4 doughera
+svr4 tye
+unicos jhi,lutz
+uwin jbuehler
+vmesa neale
+vms sugalskd,cbail
+vos paul_green
+warn pmarquess
+win32 gsar
diff --git a/contrib/perl5/Changes b/contrib/perl5/Changes
index 00a38d5..6949821 100644
--- a/contrib/perl5/Changes
+++ b/contrib/perl5/Changes
@@ -1,11 +1,9 @@
-Please note: This file provides a summary of significant changes
-between versions and sub-versions of Perl, not necessarily a complete
-list of each modification. If you'd like more detailed information,
-please consult the comments in the patches on which the relevant
-release of Perl is based. (Patches can be found on any CPAN
-site, in the .../src/5.0 directory for full version releases,
-or in the .../src/5/0/unsupported directory for sub-version
-releases.)
+Please note: This file provides a complete, temporally ordered log of
+changes that went into every version of Perl. If you'd like more
+detailed information, please consult the comments in the individual
+patches posted to the perl5-porters mailing list. Patches for each
+individual change may also be obtained through ftp and rsync--see
+perlhack.pod for the details.
---------------
@@ -14,46 +12,63 @@ releases.)
To give due honor to those who have made Perl what is is today,
here are some of the more common names in the Changes file, and their
-current addresses (as of July 1998):
+current addresses (as of February 2000):
Gisle Aas <gisle@aas.no>
- Abigail <abigail@fnx.com>
+ Abigail <abigail@delanet.com>
Kenneth Albanowski <kjahds@kjahds.com>
Russ Allbery <rra@stanford.edu>
+ Brad Appleton <bradapp@enteract.com>
+ Greg Bacon <gbacon@itsc.uah.edu>
+ Robin Barker <rmb1@cise.npl.co.uk>
+ Vishal Bhatia <vishal@gol.com>
Spider Boardman <spider@orb.nashua.nh.us>
Tom Christiansen <tchrist@perl.com>
+ Mark-Jason Dominus <mjd@plover.com>
+ Jan Dubois <jand@activestate.com>
+ Dominic Dunlop <domo@computer.org>
+ Eric Fifer <efifer@sanwaint.com>
Hallvard B Furuseth <h.b.furuseth@usit.uio.no>
M. J. T. Guy <mjtg@cus.cam.ac.uk>
Jarkko Hietaniemi <jhi@iki.fi>
+ Tom Hughes <tom@compton.nu>
Nick Ing-Simmons <nik@tiuk.ti.com>
Andreas Koenig <a.koenig@mind.de>
+ Douglas Lankshear <dougl@activestate.com>
Doug MacEachern <dougm@opengroup.org>
- Paul Marquess <pmarquess@bfsec.bt.co.uk>
+ Raphael Manfredi <Raphael.Manfredi@st.com>
+ Paul Marquess <Paul.Marquess@btinternet.com>
Stephen McCamant <alias@mcs.com>
- Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
Hans Mulder <hansmu@xs4all.nl>
+ Chris Nandor <pudge@pobox.com>
Matthias Neeracher <neeri@iis.ee.ethz.ch>
Jeff Okamoto <okamoto@hpcc123.corp.hp.com>
Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
Tom Phoenix <rootbeer@teleport.com>
Joshua Pritikin <joshua.pritikin@db.com>
+ Peter Prymmer <pvhp@forte.com>
Norbert Pueschel <pueschel@imsdd.meb.uni-bonn.de>
Dean Roehrich <roehrich@cray.com>
Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Michael G Schwern <schwern@pobox.com>
Roderick Schertler <roderick@argon.org>
Kurt D. Starsinic <kstar@chapin.edu>
+ Benjamin Stuhl <sho_pi@hotmail.com>
Dan Sugalski <sugalskd@osshe.edu>
+ Nathan Torkington <gnat@frii.com>
Larry W. Virden <lvirden@cas.org>
+ Johan Vromans <jvromans@squirrel.nl>
Ilya Zakharevich <ilya@math.ohio-state.edu>
And the Keepers of the Patch Pumpkin:
- Charles Bailey <bailey@hmivax.humgen.upenn.edu>
- Graham Barr <gbarr@pobox.com>
+ Charles Bailey <bailey@newman.upenn.edu>
+ Graham Barr <gbarr@ti.com>
Malcolm Beattie <mbeattie@sable.ox.ac.uk>
Tim Bunce <Tim.Bunce@ig.co.uk>
Andy Dougherty <doughera@lafcol.lafayette.edu>
- Gurusamy Sarathy <gsar@umich.edu>
+ Gurusamy Sarathy <gsar@activestate.com>
Chip Salzenberg <chip@perl.com>
And, of course, the Author of Perl:
@@ -73,19264 +88,27343 @@ indicator:
!> merged changes (from elsewhere)
-----------------
-Version 5.005_03 Third maintenance release of 5.005
-----------------
+--------------
+Version v5.6.0
+--------------
____________________________________________________________________________
-[ 3198] By: gbarr on 1999/03/28 22:21:49
- Log: redo #3193 which #3195 undid
- Branch: maint-5.005/perl
- ! pod/perlhist.pod
+[ 5899] By: gsar on 2000/03/23 05:39:11
+ Log: update patchlevel.h, Changes; regen perltoc.pod
+ Branch: perl
+ ! Changes patchlevel.h pod/perlhist.pod pod/perltoc.pod
____________________________________________________________________________
-[ 3197] By: gbarr on 1999/03/28 21:04:04
- Log: Updated CPAN.pm to 1.48
- Branch: maint-5.005/perl
- ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
+[ 5898] By: jhi on 2000/03/23 05:36:47
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> README.machten Todo Todo-5.6 pod/perldebug.pod
+ !> pod/perldelta.pod pod/perldiag.pod pod/perlport.pod sv.c
____________________________________________________________________________
-[ 3196] By: gbarr on 1999/03/28 17:21:27
- Log: AIX hints update from Jarkko
- Branch: maint-5.005/perl
- ! hints/aix.sh
+[ 5897] By: gsar on 2000/03/23 05:31:12
+ Log: revise perldelta for more optimal ordering, minor Todo
+ rearrangments
+ Branch: perl
+ ! README.machten Todo Todo-5.6 pod/perldelta.pod
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 3195] By: jhi on 1999/03/28 16:42:54
- Log: Update perlhist on 5_03.
- Branch: maint-5.005/perl
- ! pod/perlhist.pod
+[ 5896] By: gsar on 2000/03/23 05:30:15
+ Log: pod updates (from Tom Christiansen)
+ Branch: perl
+ ! pod/perldebug.pod pod/perlport.pod
____________________________________________________________________________
-[ 3193] By: gsar on 1999/03/28 09:46:29
- Log: =end needs matching =begin (or installhtml will croak)
- Branch: maint-5.005/perl
- ! pod/perlhist.pod
+[ 5895] By: gsar on 2000/03/23 02:33:33
+ Log: fix misplaced OP refcount for eval root
+ Branch: perl
+ ! sv.c
____________________________________________________________________________
-[ 3192] By: gsar on 1999/03/28 09:10:15
- Log: update pod/Makefile
- Branch: maint-5.005/perl
- ! pod/Makefile
+[ 5894] By: jhi on 2000/03/22 21:37:03
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> README.machten
+ !> MAINTAIN MANIFEST README.win32 ext/DynaLoader/dlutils.c
+ !> ext/IO/lib/IO/File.pm hints/machten.sh pod/perl.pod
+ !> pod/perldelta.pod pod/perlsyn.pod t/io/fs.t win32/Makefile
+ !> win32/makefile.mk
____________________________________________________________________________
-[ 3191] By: gsar on 1999/03/28 08:43:47
- Log: integrate change#3180 from mainline
-
- fix bogus OPf_REF context for the BLOCK in C<grep BLOCK @foo>
- (sometimes caused bizarreness in the BLOCK)
- Branch: maint-5.005/perl
- +> t/op/grep.t
- !> MANIFEST op.c
+[ 5893] By: gsar on 2000/03/22 21:08:34
+ Log: unretract change#5871 (Dominic Dunlop reports machten is better
+ with it than without)
+ Branch: perl
+ ! hints/machten.sh
____________________________________________________________________________
-[ 3190] By: gsar on 1999/03/28 08:29:51
- Log: integrate change#3147 from mainline
-
- warn about newfangled vfork() caveats
- Branch: maint-5.005/perl
- ! Configure
+[ 5892] By: gsar on 2000/03/22 20:37:44
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure config_h.SH hints/machten.sh hints/solaris_2.sh
+ !> hints/unicosmk.sh
____________________________________________________________________________
-[ 3189] By: gsar on 1999/03/28 08:22:00
- Log: various pod niggles
- Branch: maint-5.005/perl
- ! pod/perl.pod pod/perldebug.pod pod/perldiag.pod
- ! pod/perlfunc.pod pod/perlhist.pod
+[ 5891] By: gsar on 2000/03/22 20:04:01
+ Log: perlsyn.pod nit (from Tom Christiansen)
+ Branch: perl
+ ! pod/perlsyn.pod
____________________________________________________________________________
-[ 3188] By: gsar on 1999/03/28 07:37:43
- Log: integrate binary compatible variant of change#3098 from mainline
- Branch: maint-5.005/perl
- ! op.c perl.h t/base/lex.t toke.c
+[ 5890] By: gsar on 2000/03/22 19:43:22
+ Log: typo in comment
+ Branch: perl
+ ! ext/DynaLoader/dlutils.c
____________________________________________________________________________
-[ 3187] By: gsar on 1999/03/28 07:31:16
- Log: regularize CAPI declarations (CAPI extensions now build under
- the Borland compiler)
- Branch: maint-5.005/perl
- ! win32/GenCAPI.pl
+[ 5889] By: gsar on 2000/03/22 19:41:46
+ Log: add README.machten (from Dominic Dunlop)
+ Branch: perl
+ + README.machten
+ ! MAINTAIN MANIFEST pod/perl.pod win32/Makefile
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 3186] By: gsar on 1999/03/28 07:26:33
- Log: ensure XS_LOCKS stuff happens *before* XSUB is entered under
- -DPERL_CAPI
- Branch: maint-5.005/perl
- ! XSlock.h win32/GenCAPI.pl win32/Makefile win32/makefile.mk
+[ 5888] By: gsar on 2000/03/22 19:29:47
+ Log: makefile nits
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 3185] By: gbarr on 1999/03/28 06:37:41
- Log: integrate change #2846 from mainline
-
- a modified version of suggested patch for pack template 'Z'; added docs
- From: "Valeriy E. Ushakov" <uwe@ptc.spbu.ru>
- Date: Mon, 16 Jun 1997 03:00:31 +0400 (MSD)
- Message-ID: <%lOHpzIuGV@snark.ptc.spbu.ru>
- Subject: lack of pack/unpack letter with useful symmetry for C null delimited strings
- Branch: maint-5.005/perl
- ! pod/perldelta.pod pod/perlfunc.pod pp.c
- !> t/op/pack.t
+[ 5887] By: gsar on 2000/03/22 19:26:03
+ Log: add note about lib/open3.t#22 failure on Win2K
+ Branch: perl
+ ! README.win32 pod/perldelta.pod
____________________________________________________________________________
-[ 3184] By: gbarr on 1999/03/28 06:35:50
- Log: integrate change # 3160 from mainline
-
- better description of OP_UNSTACK (s/unstack/iteration finalizer/)
- Branch: maint-5.005/perl
- ! opcode.h opcode.pl
+[ 5886] By: gsar on 2000/03/22 19:14:20
+ Log: io/fs.t tweaks for Windows 2000
+ Branch: perl
+ ! t/io/fs.t
____________________________________________________________________________
-[ 3182] By: gbarr on 1999/03/28 03:40:28
- Log: Integrate changes #3067 and #3106 from mainline
-
- exempt $foo::a,$foo::b from warnings only if sort() was seen in package foo
- From: Graham Barr <gbarr@ti.com>
- Date: Wed, 3 Mar 1999 17:23:56 -0600
- Message-ID: <19990303172356.F7442@dal.asp.ti.com>
- Subject: Re: 'use strict' doesn't work for one-letter variables
-
- change#3067 failed package.t due to needless creation of $a and $b;
- fixed to do that only for C<sort BLOCK|CODE @foo>, not C<sort(@foo)>
- Branch: maint-5.005/perl
- ! gv.c op.c t/pragma/warn-1global
+[ 5885] By: gsar on 2000/03/22 18:41:50
+ Log: make unloading of extension shared objects (change#5381) a build
+ option (use "Configure -Accflags=-DDL_UNLOAD_ALL_AT_EXIT" to enable)
+ Branch: perl
+ ! ext/DynaLoader/dlutils.c pod/perldelta.pod
____________________________________________________________________________
-[ 3179] By: gsar on 1999/03/28 02:14:04
- Log: fix thread segfault when passing large number of arguments to child
- a la C<Thread->new($foo, 1..1000)>
- Branch: maint-5.005/perl
- ! ext/Thread/Thread.xs t/lib/thread.t
+[ 5884] By: gsar on 2000/03/22 18:16:45
+ Log: avoid loading both XSLoader and DynaLoader (avoids dl_error()
+ redefinition warnings when statically linked)
+ Branch: perl
+ ! ext/IO/lib/IO/File.pm
____________________________________________________________________________
-[ 3178] By: gbarr on 1999/03/28 01:39:23
- Log: fix $Config{'usethreads'} typo in perlthrtut
-
- From: Ian Maloney <szhmf9@wsblob.ubs.com>
- Date: Thu, 25 Mar 1999 16:40:14 +0100 (MET)
- Message-Id: <199903251540.QAA02439@wsblob.>
- Subject: perlthrtut documentation error
- Branch: maint-5.005/perl
- ! pod/perlthrtut.pod
+[ 5883] By: jhi on 2000/03/22 17:45:01
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/lib/thr5005.t t/op/64bitint.t t/op/nothr5005.t
+ - t/lib/thread.t t/op/64bit.t t/op/nothread.t
+ !> Configure MAINTAIN MANIFEST Todo-5.6 ext/POSIX/Makefile.PL
+ !> lib/ExtUtils/Liblist.pm lib/ExtUtils/xsubpp
+ !> lib/File/Compare.pm pod/perldelta.pod universal.c util.c
+ !> utils/h2xs.PL utils/perlbug.PL win32/Makefile
+ !> win32/makefile.mk
+____________________________________________________________________________
+[ 5882] By: jhi on 2000/03/22 17:16:27
+ Log: Metaconfigify #5881.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/installdirs/inc_version_list.U
____________________________________________________________________________
-[ 3177] By: gbarr on 1999/03/28 01:09:59
- Log: Integrate #2910 from mainline
-
- slurping an empty file should return '' rather than undef, with
- commensurate effects on ARGV processing
- Branch: maint-5.005/perl
- ! pod/perldelta.pod pp_hot.c sv.h
- !> t/io/argv.t
+[ 5881] By: gsar on 2000/03/22 17:04:01
+ Log: avoid including things that aren't directories in inc_version_list
+ (from Robin Barker)
+ Branch: perl
+ ! Configure
____________________________________________________________________________
-[ 3176] By: gbarr on 1999/03/28 00:00:30
- Log: Integrate relevant doc changes from mainline
- Branch: maint-5.005/perl
- !> (integrate 34 files)
+[ 5880] By: gsar on 2000/03/22 16:55:42
+ Log: avoid File::Compare warning when passed handles (from Nick
+ Ing-Simmons)
+ Branch: perl
+ ! lib/File/Compare.pm
____________________________________________________________________________
-[ 3175] By: gbarr on 1999/03/27 19:20:32
- Log: Integrated #2352 and #2397 from mainline
-
- Implement $^C to allow perl access to -c flag - I think this
- was agreed once...
-
- Update docs and English.pm for $^C
- Branch: maint-5.005/perl
- ! gv.c mg.c
- !> lib/English.pm
+[ 5879] By: jhi on 2000/03/22 16:48:33
+ Log: Retract #5871.
+ Branch: cfgperl
+ ! hints/machten.sh
____________________________________________________________________________
-[ 3174] By: gbarr on 1999/03/27 18:21:01
- Log: Update Copyright year
- Branch: maint-5.005/perl
- ! EXTERN.h INTERN.h README av.c av.h cop.h cv.h deb.c doio.c
- ! doop.c dump.c form.h gv.c gv.h handy.h hv.c hv.h mg.c mg.h
- ! op.c op.h perl.h perly.y pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c
- ! regcomp.c regexec.c run.c scope.c sv.c sv.h toke.c util.c
- ! util.h
+[ 5878] By: gsar on 2000/03/22 16:29:37
+ Log: RM600-svr4 tweaks (from Frank Ridderbusch
+ <frank.ridderbusch@pdb.siemens.de>)
+ Branch: perl
+ ! ext/POSIX/Makefile.PL lib/ExtUtils/Liblist.pm
____________________________________________________________________________
-[ 3173] By: gbarr on 1999/03/27 18:19:47
- Log: Update Test.pm to VERSION 1.122 from CPAN
- Branch: maint-5.005/perl
- ! lib/Test.pm
+[ 5877] By: gsar on 2000/03/22 15:38:49
+ Log: save RE context when calling __WARN__ and __DIE__ hooks;
+ add missing stack-of-stacks logic for new code that came
+ in with lexical warnings (this fixes coredumps from
+ -Mdiagnostics when the warnings happens to come from within
+ the RE engine)
+ Branch: perl
+ ! util.c
____________________________________________________________________________
-[ 3154] By: jhi on 1999/03/24 21:40:51
- Log: Reword the shared library search path (LD_LIBRARY_PATH) info
- based on suggestions from Andy Dougherty.
- Branch: maint-5.005/perl
- ! INSTALL
+[ 5876] By: gsar on 2000/03/22 15:02:59
+ Log: missing pieces in perldelta
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 3146] By: jhi on 1999/03/24 09:20:14
- Log: Bring in changes #2808 and #2812 (from mainline perl)
- that enhance the perlbug checklist.
- Branch: maint-5.005/perl
- ! utils/perlbug.PL
+[ 5875] By: gsar on 2000/03/22 14:46:24
+ Log: rename tests to more appropriate names
+ Branch: perl
+ +> t/lib/thr5005.t t/op/64bitint.t t/op/nothr5005.t
+ - t/lib/thread.t t/op/64bit.t t/op/nothread.t
+ ! MAINTAIN MANIFEST pod/perldelta.pod
____________________________________________________________________________
-[ 3130] By: jhi on 1999/03/23 22:02:23
- Log: Don't use config.msg to remind about the
- LD_LIBRARY_PATH because Makefile.SH takes
- care of that.
-
- Use shrplib in DEC O^W^Digital U^W^WTru64 UNIX.
- This used to be the default but in some MT or another it
- was dropped because of some transient error or another.
- Branch: maint-5.005/perl
- ! Configure hints/dec_osf.sh
+[ 5874] By: jhi on 2000/03/22 14:32:57
+ Log: Make the no-luck-on-uselongdouble warning more visible.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 3122] By: jhi on 1999/03/19 21:12:14
- Log: Describe the new Benchmark feature in more detail.
+[ 5873] By: gsar on 2000/03/22 14:28:56
+ Log: backout change#5708; fixups for behavior of recently added -a switch;
+ support -k and -m switches in h2xs (from Hugo van der Sanden)
+ Branch: perl
+ ! lib/ExtUtils/xsubpp utils/h2xs.PL
+____________________________________________________________________________
+[ 5872] By: gsar on 2000/03/22 14:21:20
+ Log: remove outdated notes in makefiles
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 5871] By: jhi on 2000/03/22 14:17:40
+ Log: Disable SysV shm and msg even more.
Branch: cfgperl
- ! pod/perldelta.pod
- Branch: maint-5.005/perl
- ! pod/perldelta.pod
+ ! hints/machten.sh
____________________________________________________________________________
-[ 3121] By: jhi on 1999/03/19 08:16:12
- Log: AVAILABILITY tuning.
+[ 5870] By: jhi on 2000/03/22 14:16:54
+ Log: Augment #5865.
Branch: cfgperl
- ! pod/perl.pod
- Branch: maint-5.005/perl
- ! pod/perl.pod
+ ! hints/unicosmk.sh
____________________________________________________________________________
-[ 3119] By: jhi on 1999/03/17 14:33:43
- Log: More Apollo fixes.
- Branch: maint-5.005/perl
- ! README.apollo hints/apollo.sh t/lib/io_udp.t
+[ 5869] By: gsar on 2000/03/22 14:07:27
+ Log: perlbug -ok shouldn't prompt (from Paul Moore
+ <Paul.Moore@uk.origin-it.com>)
+ Branch: perl
+ ! utils/perlbug.PL
____________________________________________________________________________
-[ 3118] By: jhi on 1999/03/16 17:23:39
- Log: Nada.
- Branch: maint-5.005/perl
- ! README.apollo
+[ 5868] By: gsar on 2000/03/22 13:54:27
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ ! Todo-5.6
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH hints/dec_osf.sh hints/openbsd.sh
+ !> hints/solaris_2.sh hints/unicosmk.sh pod/perldelta.pod
+ !> pod/perlport.pod win32/config_H.bc win32/config_H.gc
+ !> win32/config_H.vc
____________________________________________________________________________
-[ 3117] By: jhi on 1999/03/16 17:18:49
- Log: Apollo DomainOS AVAILABILITY.
+[ 5867] By: jhi on 2000/03/22 05:25:40
+ Log: OpenBSD pthreadness fixes from Tom Christiansen.
Branch: cfgperl
- ! pod/perl.pod
- Branch: maint-5.005/perl
- ! pod/perl.pod
+ ! hints/openbsd.sh
____________________________________________________________________________
-[ 3116] By: jhi on 1999/03/16 17:14:00
- Log: Apollo DomainOS patch
- From: Johann Klasek <jk@auto.tuwien.ac.at>
- Subject: Re: DomainPerl
- Date: Tue, 16 Mar 1999 17:46:32 +0100
- Message-ID: <19990316174632.A19759@euklid.auto.tuwien.ac.at>
- Branch: maint-5.005/perl
- + README.apollo apollo/netinet/in.h
- ! MANIFEST hints/apollo.sh
+[ 5866] By: gsar on 2000/03/22 04:18:39
+ Log: UMRs in universal.c (SvCUR() may not be there unless SvPOK())
+ Branch: perl
+ ! universal.c
____________________________________________________________________________
-[ 3115] By: jhi on 1999/03/16 14:23:54
- Log: From: Paul Marquess <pmarquess@bfsec.bt.co.uk>
- To: Gurusamy Sarathy <gsar@activestate.com>,
- Graham Barr <gbarr@pobox.com>
- Cc: Perl5 Porters <perl5-porters@perl.org>,
- "Paul.Marquess" <Paul.Marquess@btinternet.com>
- Subject: [PATCH 5.005_56 & 5.005_03_T6] Upgrade DB_File to version 1.65
- Date: Sun, 14 Mar 1999 14:43:57 -0000
- Message-Id: <199903141841.NAA17040@defender.perl.org>
- Branch: maint-5.005/perl
- ! ext/DB_File/Changes ext/DB_File/DB_File.pm
- ! ext/DB_File/DB_File.xs ext/DB_File/typemap
+[ 5865] By: jhi on 2000/03/21 21:38:20
+ Log: The SysV shm*() are in libc but unimplemented.
+ Branch: cfgperl
+ ! hints/unicosmk.sh
____________________________________________________________________________
-[ 3114] By: jhi on 1999/03/16 12:42:20
- Log: Mention Rhapsody in 5.005_5X perldelta,
- and in Rhapsody and Netware in 5.005_0X and 5.005_5X
- *planned* AVAILABILITY.
+[ 5864] By: jhi on 2000/03/21 21:30:02
+ Log: s/setgropus/setgroups/; # detypo in a comment
Branch: cfgperl
- ! pod/perl.pod pod/perldelta.pod
- Branch: maint-5.005/perl
- ! pod/perl.pod
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc
+ Branch: metaconfig
+ ! U/modified/Getfile.U U/modified/d_flexfnam.U
+ ! U/modified/groupstype.U
____________________________________________________________________________
-[ 3113] By: jhi on 1999/03/16 10:38:53
- Log: perldelta niggling.
+[ 5863] By: jhi on 2000/03/21 20:25:40
+ Log: Add supported platforms.
Branch: cfgperl
- ! pod/perldelta.pod
- Branch: maint-5.005/perl
- ! pod/perldelta.pod
+ ! pod/perlport.pod
____________________________________________________________________________
-[ 3111] By: jhi on 1999/03/16 10:28:10
- Log: AVAILABILITY update: still mention PowerUX,
- Novell Netware now has sources available.
+[ 5862] By: jhi on 2000/03/21 19:19:04
+ Log: Integrate with Sarathy.
Branch: cfgperl
- ! pod/perl.pod
- Branch: maint-5.005/perl
- ! pod/perl.pod
+ !> makedef.pl
____________________________________________________________________________
-[ 3105] By: jhi on 1999/03/12 15:54:57
- Log: Recognize the NetBSD packages collection.
- Branch: maint-5.005/perl
- ! hints/netbsd.sh
+[ 5861] By: gsar on 2000/03/21 19:07:13
+ Log: add missing bincompat symbols to export list
+ Branch: perl
+ ! makedef.pl
____________________________________________________________________________
-[ 3104] By: jhi on 1999/03/12 09:07:04
- Log: From: pvhp@forte.com (Peter Prymmer)
- To: jhi@iki.fi, perl-mvs@perl.org, perlbug@perl.com
- Subject: [PATCH MT6,_56] was Re: Not OK: perl 5.00503 +MAINT_TRIAL_6 on os390 06.00 (UNINSTALLED)
- Date: Thu, 11 Mar 99 14:24:54 PST
- Message-Id: <9903112224.AA24346@forte.com>
- Branch: maint-5.005/perl
- ! README.os390 t/lib/posix.t
+[ 5860] By: jhi on 2000/03/21 18:59:39
+ Log: Disallow using too old gcc in {Tru64,Digital UNIX,DEC OSF/1}.
+ (Even gcc 2.95 doesn't seem to be working 100%.)
+ Branch: cfgperl
+ ! hints/dec_osf.sh pod/perldelta.pod
____________________________________________________________________________
-[ 3102] By: jhi on 1999/03/10 11:01:20
- Log: From: pvhp@forte.com (Peter Prymmer)
- To: perl5-porters@perl.org
- Subject: [5.005_03-MT6]Patch: time passes
- Date: Tue, 9 Mar 99 18:42:17 PST
- Message-Id: <9903100242.AA29057@forte.com>
- Branch: maint-5.005/perl
- ! perl.c
+[ 5859] By: jhi on 2000/03/21 16:36:27
+ Log: Nit for #5802 from Robin Barker.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Getfile.U
____________________________________________________________________________
-[ 3101] By: jhi on 1999/03/10 10:30:15
- Log: From: Mark-Jason Dominus <mjd@plover.com>
- To: perl5-porters@perl.com
- Subject: Minor fix to perlfunc.pod
- Date: Mon, 08 Mar 1999 20:05:53 -0500
- Message-ID: <19990309010553.13757.qmail@plover.com>
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5858] By: jhi on 2000/03/21 14:34:25
+ Log: Be more lenient in the case libsunmath cannot be found.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 3094] By: jhi on 1999/03/06 16:16:15
- Log: From: Mark Kettenis <kettenis@wins.uva.nl>
- To: jhi@iki.fi
- Subject: Oops
- Date: Sat, 6 Mar 1999 17:15:35 +0100 (CET)
- Message-Id: <199903061615.RAA00207@delius.kettenis.nl>
- Branch: maint-5.005/perl
- ! README.hurd
+[ 5857] By: jhi on 2000/03/21 14:14:38
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 27 files)
____________________________________________________________________________
-[ 3093] By: jhi on 1999/03/06 15:59:46
- Log: From: Mark Kettenis <kettenis@wins.uva.nl>
- To: jhi@iki.fi
- Subject: New Hurd README
- Date: Sat, 6 Mar 1999 16:46:12 +0100 (CET)
- Message-Id: <199903061601.RAA00185@delius.kettenis.nl>
- Branch: maint-5.005/perl
- ! README.hurd
+[ 5856] By: gsar on 2000/03/21 10:44:10
+ Log: here lies RC3
+ Branch: perl
+ ! Changes patchlevel.h pod/perlhist.pod
____________________________________________________________________________
-[ 3092] By: jhi on 1999/03/06 12:52:06
- Log: From: Paul_Green@stratus.com
- To: perl5-porters@perl.org
- Cc: jhi@iki.fi, Paul_Green@stratus.com
- Subject: [PATCH 5.005_03-MAINT_TRIAL_6]: platform: vos -- updates to VOS port of Perl5
- Date: Fri, 5 Mar 1999 18:08:49 -0500
- Message-ID: <1D1A4EF7AD4DD211A80D00A0C9D7DB665A035A@exna1.stratus.com>
- Branch: maint-5.005/perl
- ! vos/config.h vos/config_h.SH_orig
+[ 5855] By: gsar on 2000/03/21 10:05:42
+ Log: clone awareness for change#5847
+ Branch: perl
+ ! sv.c
____________________________________________________________________________
-[ 3091] By: jhi on 1999/03/06 12:42:21
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- To: perl5-porters@perl.org, vmsperl@perl.org
- Subject: [PATCH 5.005_03-MT6]VMS build patch
- Date: Fri, 05 Mar 1999 12:36:19 -0800
- Message-Id: <3.0.6.32.19990305123619.02d326a0@ous.edu>
- Branch: maint-5.005/perl
- ! vms/subconfigure.com
+[ 5854] By: gsar on 2000/03/21 09:30:50
+ Log: regen win32/config*
+ Branch: perl
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
____________________________________________________________________________
-[ 3090] By: gsar on 1999/03/06 04:40:03
- Log: integrate change#3089 from mainline
-
- tolerate CRs after options
- Branch: maint-5.005/perl
- !> perl.c
+[ 5853] By: gsar on 2000/03/21 08:56:58
+ Log: integrate cfgperl and vmsperl contents into mainline
+ Branch: perl
+ !> Configure Todo Todo-5.6 config_h.SH lib/File/Spec/VMS.pm
+ !> pod/perldelta.pod t/op/taint.t
____________________________________________________________________________
-[ 3086] By: gbarr on 1999/03/05 01:48:05
- Log: #3085 was a bit premature, this is MT6 as 2 files were
- missing from MANIFEST
- Branch: maint-5.005/perl
- ! MANIFEST
+[ 5852] By: gsar on 2000/03/21 06:08:20
+ Log: README.mint tweaks (from Guido Flohr <gufl0000@stud.uni-sb.de>)
+ Branch: perl
+ ! Changes README.mint
____________________________________________________________________________
-[ 3085] By: gbarr on 1999/03/05 01:41:06
- Log: Trial release 6
- Branch: maint-5.005/perl
- ! Changes
+[ 5851] By: gsar on 2000/03/21 06:06:44
+ Log: make parenthetic warnings look consistent; make diagnostic on
+ "use 5.6" et al mention the alternate form; pod fixups
+ Branch: perl
+ ! gv.c op.c pod/perldelta.pod pod/perldiag.pod pp_ctl.c
+ ! t/comp/use.t t/pragma/strict-vars t/pragma/warn/op
+ ! t/pragma/warn/pp_hot t/pragma/warn/pp_sys toke.c universal.c
+ ! util.c
____________________________________________________________________________
-[ 3084] By: gbarr on 1999/03/05 01:34:07
- Log: Don't process - as a file in Errno_pm.PL
-
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Thu, 4 Mar 1999 13:29:23 +0200 (EET)
- Message-ID: <14046.28307.561693.849859@alpha.hut.fi>
- Subject: Re: maint-5.005
- Branch: maint-5.005/perl
- ! ext/Errno/Errno_pm.PL
+[ 5850] By: gsar on 2000/03/21 04:05:00
+ Log: disable unused Windows code that won't run on Windows 95
+ Branch: perl
+ ! win32/vmem.h
____________________________________________________________________________
-[ 3081] By: gsar on 1999/03/05 00:14:33
- Log: protect against doubled backslashes
- Branch: maint-5.005/perl
- ! ext/Errno/Errno_pm.PL
+[ 5849] By: gsar on 2000/03/21 03:34:39
+ Log: $File::Find::name doesn't reflect top level files
+ correctly (from Simon Cozens <simon@brecon.co.uk>)
+ Branch: perl
+ ! lib/File/Find.pm
____________________________________________________________________________
-[ 3080] By: gsar on 1999/03/04 23:37:20
- Log: pick up AIX hints from mainline
- Branch: maint-5.005/perl
- !> hints/aix.sh
+[ 5848] By: gsar on 2000/03/21 02:46:01
+ Log: test fails when sockets not available (from Yitzchak Scott-Thoennes)
+ Branch: perl
+ ! t/lib/io_unix.t
____________________________________________________________________________
-[ 3079] By: gsar on 1999/03/04 21:09:43
- Log: tweak cast and crew
- Branch: maint-5.005/perl
- ! Changes
+[ 5847] By: gsar on 2000/03/21 00:09:09
+ Log: under useithreads, PUSHLOOP must save PL_curpad for looking up
+ iterdata, since dounwind() may defer LEAVEs
+ Branch: perl
+ ! cop.h
____________________________________________________________________________
-[ 3078] By: gsar on 1999/03/04 21:03:04
- Log: update patchlevel, Changes
- Branch: maint-5.005/perl
- ! Changes README.win32 patchlevel.h
- !> pod/perlhist.pod
+[ 5846] By: jhi on 2000/03/20 23:54:37
+ Log: Document the lib/io_multihomedt hang in 64-bit HP-Ux.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 3075] By: gsar on 1999/03/04 07:36:53
- Log: integrate changes#3037,3041 from mainline
-
- fix longstanding bug: searches for lexicals originating within eval''
- weren't stopping at the subroutine boundary correctly
- --
- fix subtle bug in eval'' testsuite
- Branch: maint-5.005/perl
- !> op.c proto.h t/op/eval.t
+[ 5845] By: jhi on 2000/03/20 23:45:24
+ Log: detypo
+ Branch: cfgperl
+ ! t/op/taint.t
____________________________________________________________________________
-[ 3074] By: gsar on 1999/03/04 07:32:15
- Log: integrate change#3048 from mainline
-
- updated HP-UX notes from Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
- Branch: maint-5.005/perl
- !> MANIFEST README.hpux
+[ 5844] By: jhi on 2000/03/20 23:17:18
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/Dumpvalue.pm lib/User/pwent.pm lib/dumpvar.pl
+ !> lib/strict.pm op.c pod/perldata.pod pod/perldelta.pod
+ !> pod/perlfunc.pod pp.c t/io/pipe.t t/lib/charnames.t toke.c
+ !> utils/perlbug.PL
____________________________________________________________________________
-[ 3073] By: gsar on 1999/03/04 07:29:43
- Log: integrate changes#3014,3015,3021,3032,3034,3045 from mainline
-
- more "correct" utbuf for utime()
- --
- avoid modifying readonly values from qw()
- --
- ansify perlio.c, fix PerlIO-ish typos
- --
- add README.hpux
- --
- s/print STDERR/warn/ suggested by abigail@fnx.com; add $VERSION
- --
- destroy PL_svref_mutex in perl_destruct()
- Branch: maint-5.005/perl
- +> README.hpux
- !> MANIFEST doio.c ext/DynaLoader/dl_beos.xs
- !> ext/DynaLoader/dl_cygwin32.xs iperlsys.h
- !> lib/ExtUtils/MM_Unix.pm lib/Getopt/Std.pm perl.c perlio.c
+[ 5843] By: gsar on 2000/03/20 22:14:35
+ Log: add note about symbolic filehandles (from Johan Vromans)
+ Branch: perl
+ ! lib/strict.pm pod/perlfunc.pod
____________________________________________________________________________
-[ 3072] By: gsar on 1999/03/04 07:12:15
- Log: integrate changes#2978,2979 from mainline
-
- bring '*' prototype closer to how it behaves internally
- --
- doc for change#2978
- Branch: maint-5.005/perl
- +> t/lib/fatal.t
- !> MANIFEST lib/Fatal.pm op.c pod/perlsub.pod t/comp/proto.t
+[ 5842] By: gsar on 2000/03/20 21:59:51
+ Log: perlbugtron flags in perlbug (from Richard Foley); eliminate duplicate
+ code
+ Branch: perl
+ ! utils/perlbug.PL
____________________________________________________________________________
-[ 3071] By: gsar on 1999/03/04 07:05:50
- Log: integrate changes#2919,2920,2921,2928,2932,2933 from mainline
-
- applied suggested patch, with several language/readability tweaks
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Fri, 29 Jan 1999 00:25:02 -0500
- Message-ID: <19990129002502.C2898@monk.mps.ohio-state.edu>
- Subject: Re: [PATCH 5.005_*] Better parsing docs
- --
- tweak READ() docs to mention $buffer must be altered by reference
- --
- use New() et al., rather than safemalloc() et al.
- From: jan.dubois@ibm.net (Jan Dubois)
- Date: Fri, 29 Jan 1999 23:27:22 +0100
- Message-ID: <36bd33f2.51029616@smtp1.ibm.net>
- Subject: [PATCH _03-MT5] POSIX.xs memory API
- --
- allow the Carp routines to pass through exception objects
- --
- clarify what a "line" is
- --
- From: "J. van Krieken" <John.van.Krieken@ATComputing.nl>
- Date: Thu, 4 Feb 1999 17:25:25 +0100 (MET)
- Message-Id: <199902041625.RAA14489@atcmpg.ATComputing.nl>
- Subject: s2p incorrectly handles hold space commands
- Branch: maint-5.005/perl
- !> ext/POSIX/POSIX.xs lib/Carp.pm pod/perlfunc.pod pod/perlop.pod
- !> pod/perltie.pod pod/perlvar.pod x2p/s2p.PL
+[ 5841] By: gsar on 2000/03/20 21:06:01
+ Log: more sleep needed from slow systems (from Peter Haworth)
+ Branch: perl
+ ! t/io/pipe.t
____________________________________________________________________________
-[ 3070] By: gsar on 1999/03/04 06:43:57
- Log: integrate changes#2748,2753,2754,2819,2824,2855,2866,2867,2869,2885,2888,2889
- from mainline
-
- From: "Jonathan I. Kamens" <jik@kamens.brookline.ma.us>
- Date: Thu, 3 Dec 1998 15:10:17 -0500
- Message-Id: <199812032010.PAA09692@jik.shore.net>
- Subject: sample checksum code in "perlfunc" man page is wrong
- --
- Todo tweaks
- --
- Todo updates from Andy Dougherty <doughera@lafayette.edu>
- --
- avoid garbage in db->dirbuf
- From: Masahiro KAJIURA <masahiro.kajiura@toshiba.co.jp>
- Date: Sat, 05 Dec 1998 14:14:54 +0900
- Message-Id: <199812050514.OAA23268@toshiba.co.jp>
- Subject: SDBM bug
- --
- tweak doc on bitwise ops
- --
- applied suggested patch; added tests
- From: Adam Krolnik <adamk@gypsy.cyrix.com>
- Date: Sat, 12 Dec 98 15:30:18 -0600
- Message-Id: <9812122130.AA03717@gypsy.eng.cyrix.com>
- Subject: Range operation doesn't handle IV_MAX
- --
- display full pathname of unreadable files
- --
- av_extend() doc tweak from Jan Dubois
- --
- update win32/pod.mak
- --
- note how to find REG_INFTY limit
- --
- add note about test-notty target
- --
- tweak PERL_STRICT_CR notes
- Branch: maint-5.005/perl
- !> Porting/pumpkin.pod README.win32 Todo Todo-5.005
- !> ext/SDBM_File/sdbm/sdbm.c pod/perldelta.pod pod/perlfunc.pod
- !> pod/perlguts.pod pod/perlop.pod pod/perlre.pod pp_ctl.c
- !> t/op/range.t utils/perldoc.PL win32/pod.mak
+[ 5840] By: gsar on 2000/03/20 21:04:42
+ Log: typo in change#5839
+ Branch: perl
+ ! lib/Dumpvalue.pm
____________________________________________________________________________
-[ 3069] By: gsar on 1999/03/04 06:02:29
- Log: integrate change#2747 from mainline
-
- typos in Pod/Text.pm
- Branch: maint-5.005/perl
- !> lib/Pod/Text.pm
+[ 5839] By: gsar on 2000/03/20 21:03:14
+ Log: make dumpvar.pl recognize emptyness in arrays (from Matthias Urlichs
+ <smurf@noris.de>); fix up duplicate code in Dumpvalue.pm
+ Branch: perl
+ ! lib/Dumpvalue.pm lib/dumpvar.pl
____________________________________________________________________________
-[ 3059] By: jhi on 1999/03/03 22:46:43
- Log: Document HP-UX 11 Y2K patch effect, based on
-
- From: "Richard L. England" <richard_england@mentorg.com>
- To: perlbug@perl.com
- CC: "England, Richard" <richard_england@mentorg.com>
- Subject: test io/fs.t number 18 fails on HPUX 11.0 when Y2K patch installed.
- Date: Fri, 26 Feb 1999 15:35:49 -0800
- Message-ID: <36D72FD4.4136C84F@mentorg.com>
- Branch: maint-5.005/perl
- ! INSTALL
+[ 5838] By: gsar on 2000/03/20 20:53:25
+ Log: mention handle autovivification in perldata (from Johan Vromans)
+ Branch: perl
+ ! lib/User/pwent.pm pod/perldata.pod
____________________________________________________________________________
-[ 3057] By: jhi on 1999/03/03 21:42:22
- Log: The *symbols patch (for Kurt's h2ph fixes) haunted us in AIX.
- Branch: maint-5.005/perl
- ! Configure
+[ 5837] By: gsar on 2000/03/20 20:37:42
+ Log: change#5797 didn't do the right thing for "\xff\N{WHITE SMILING FACE}"
+ Branch: perl
+ ! t/lib/charnames.t toke.c
____________________________________________________________________________
-[ 3056] By: jhi on 1999/03/03 21:21:46
- Log: Fixed the pthreads_created_joinable test messed up
- by the Mach cthreads change.
- Branch: maint-5.005/perl
- ! Configure
+[ 5836] By: gsar on 2000/03/20 16:27:13
+ Log: autovivify open($fh[0],...) properly
+ Branch: perl
+ ! op.c pp.c
____________________________________________________________________________
-[ 3055] By: jhi on 1999/03/03 18:17:55
- Log: Configure and make gotchas.
- Branch: maint-5.005/perl
- ! INSTALL
+[ 5835] By: gsar on 2000/03/19 18:51:24
+ Log: add @x->[2] bug to known issues (from Johan Vromans)
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 3051] By: jhi on 1999/03/02 08:24:52
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- To: perl5-porters@perl.org, vmsperl@perl.org
- Subject: [PATCH 5.005_0x and 5.005_5x]Minor update to README.VMS
- Date: Mon, 01 Mar 1999 16:10:57 -0800
- Message-Id: <3.0.6.32.19990301161057.03b1fc00@ous.edu>
+[ 5834] By: jhi on 2000/03/19 18:42:35
+ Log: Fix the socklen default type (from Laszlo Molnar;
+ though I prefer signed, not unsigned); move the cross-compialtion
+ wish item to Todo; drop excess permissions in taint.t.
Branch: cfgperl
- ! README.vms
- Branch: maint-5.005/perl
- ! README.vms
+ ! Configure Todo Todo-5.6 config_h.SH t/op/taint.t
+ Branch: metaconfig
+ ! U/protos/socksizetype.U
____________________________________________________________________________
-[ 3049] By: jhi on 1999/03/02 07:34:21
- Log: From: Spider Boardman <spider@leggy.zk3.dec.com>
- To: perl5-porters@perl.org
- Subject: [PATCH] Eliminate (valid) warning in byterun.c
- Date: Mon, 01 Mar 1999 17:27:59 -0500
- Message-Id: <199903012227.RAA00181@leggy.zk3.dec.com>
+[ 5833] By: jhi on 2000/03/19 18:20:42
+ Log: Integrate with Sarathy.
Branch: cfgperl
- ! bytecode.h
- Branch: maint-5.005/perl
- ! bytecode.h
+ !> (integrate 42 files)
____________________________________________________________________________
-[ 3028] By: jhi on 1999/02/26 14:40:00
- Log: HP-UX 11 threads.
-
- From: Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
- To: perl5-porters@perl.org
- Cc: jhi@cc.hut.fi
- Subject: Maint 5 and _54 with threading on HP-UX 11.00
- Date: Wed, 3 Feb 1999 12:57:18 -0800 (PST)
- Message-Id: <199902032057.MAA10218@xfiles.intercon.hp.com>
-
- NOTE from jhi: the hpux hints could still be more robust by
- disabling gdbm when necessary.
-
- Currently if there's a libgdbm.sl (gdbm 1.7.3) which is pre-11,
- linking -lgdbm -lpthread creates an executable that instantly
- core dumps on a pthreads internal panic:
-
- ./gdpt
-
- Pthread internal error: message: __libc_reinit() failed, file: ../pthreads/pthread.c, line: 1096
- Return Pointer is 0xc082bf33
- 17639 quit (core dumped) ./gdpt
-
- You don't have to *use* either gdbm or pthreads in the executable,
- just linking them together is enough. Workaround is to recompile
- the GDBM under HP-UX 11, that makes the problem to go away.
- Branch: maint-5.005/perl
- ! hints/hpux.sh thread.h
+[ 5832] By: gsar on 2000/03/19 18:01:28
+ Log: pwent.pm doc tweak (from Tom Christiansen)
+ Branch: perl
+ ! lib/User/pwent.pm
____________________________________________________________________________
-[ 3027] By: jhi on 1999/02/26 09:04:29
- Log: From: abigail@fnx.com
- To: perl5-porters@perl.org (Perl Porters)
- Subject: [PATCH 5.005_02 Getopt::Std] warn() instead of print STDERR.
- Date: Thu, 25 Feb 1999 22:08:41 -0500 (EST)
- Message-ID: <19990226030841.5985.qmail@alexandra.wayne.fnx.com>
- Branch: maint-5.005/perl
- ! lib/Getopt/Std.pm
+[ 5831] By: gsar on 2000/03/19 17:57:31
+ Log: unsigned is a more reasonable socksizetype default (from
+ Laszlo <ml1050@freemail.hu>)
+ Branch: perl
+ ! Configure
____________________________________________________________________________
-[ 3026] By: jhi on 1999/02/26 08:18:26
- Log: full_ar wasn't propagated.
- Branch: maint-5.005/perl
- ! Configure
+[ 5830] By: gsar on 2000/03/19 17:40:20
+ Log: taint.t shouldn't fail where IPC::SysV unavailable
+ Branch: perl
+ ! t/op/taint.t
____________________________________________________________________________
-[ 3013] By: jhi on 1999/02/22 19:27:44
- Log: Fix MacPerl version, change PowerUX to PowerMAX.
-
- From: Chris Nandor <pudge@pobox.com>
- To: jhi@iki.fi
- Cc: perl5-porters@perl.org
- Subject: Re: perl current availability as documented by perl.pod
- Date: Sun, 21 Feb 1999 11:06:03 -0500
- Message-Id: <v04020a07b2f5df60c9e3@[192.168.0.77]>
-
- From: Tom Horsley <Tom.Horsley@mail.ccur.com>
- To: jhi@iki.fi
- Cc: perl5-porters@perl.org
- Subject: Re: perl current availability as documented by perl.pod
- Date: Mon, 22 Feb 1999 13:08:30 GMT
- Message-Id: <199902221308.NAA19971@cleo.ccur.com>
- Branch: cfgperl
- ! pod/perl.pod
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5829] By: gsar on 2000/03/19 17:19:46
+ Log: update Changes
+ Branch: perl
+ ! Changes embed.h
____________________________________________________________________________
-[ 3010] By: jhi on 1999/02/22 10:21:55
- Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- To: gbarr@pobox.com (Graham Barr)
- Cc: perl5-porters@perl.org
- Subject: [PATCH 5.005_03-MT5] DB_File 1.64 patch
- Date: Mon, 22 Feb 1999 10:12:34 +0000 (GMT)
- Message-Id: <9902221012.AA17784@claudius.bfsec.bt.co.uk>
- Branch: maint-5.005/perl
- ! ext/DB_File/Changes ext/DB_File/DB_File.pm
- ! ext/DB_File/DB_File.xs ext/DB_File/typemap t/lib/db-recno.t
+[ 5828] By: gsar on 2000/03/19 16:47:14
+ Log: squelch known scalar leak due to compile failure
+ Branch: perl
+ ! t/pragma/strict-vars
____________________________________________________________________________
-[ 3005] By: jhi on 1999/02/22 08:35:30
- Log: Configure/Perl knew how to look for use Mach cthreads
- but Configure didn't let them to be used ($osname 'next').
- Branch: cfgperl
- ! Configure config_h.SH
- Branch: maint-5.005/perl
- ! Configure
+[ 5827] By: gsar on 2000/03/19 09:20:22
+ Log: mention how to look up perllocal.pod (from Michael G Schwern)
+ Branch: perl
+ ! pod/perlapi.pod pod/perlmodinstall.pod pod/perlmodlib.pod
____________________________________________________________________________
-[ 3004] By: jhi on 1999/02/21 15:46:02
- Log: Update Acorn AVAILABILITY.
- Branch: cfgperl
- ! pod/perl.pod
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5826] By: gsar on 2000/03/19 08:49:27
+ Log: mention need to wait for children (from Russ Allbery)
+ Branch: perl
+ ! lib/IPC/Open2.pm lib/IPC/Open3.pm pod/perldelta.pod
____________________________________________________________________________
-[ 3003] By: jhi on 1999/02/21 14:50:42
- Log: From: rjk@linguist.dartmouth.edu (Ronald J. Kimball)
- To: perl5-porters@perl.org (Perl 5 Porters)
- Subject: PATCH: perlref.pod - symbolic ref example
- Date: Sat, 20 Feb 1999 17:32:11 -0500 (EST)
- Message-Id: <199902202232.RAA62306@linguist.dartmouth.edu>
- Branch: cfgperl
- ! pod/perlref.pod
- Branch: maint-5.005/perl
- ! pod/perlref.pod
+[ 5825] By: gsar on 2000/03/19 08:47:52
+ Log: Pod::Man should strip leading lib/ for module manpages (from
+ Russ Allbery)
+ Branch: perl
+ ! lib/Pod/Man.pm
____________________________________________________________________________
-[ 3000] By: jhi on 1999/02/21 14:15:31
- Log: pack s/l for negative numbers was broken on platforms
- where sizeof(short) != 2 or sizeof(long) != 4 (Alpha, Cray).
- pack v was broken for sizeof(short) == 8 big-endian platforms
- (Cray), only zeros were produced.
- Branch: maint-5.005/perl
- ! perl.h pod/perlfunc.pod pp.c t/op/pack.t
+[ 5824] By: gsar on 2000/03/19 08:17:49
+ Log: User::pwent fixups for additional fields (from Tom Christiansen);
+ fix bug in pw_has(); tolerate absense of pw{change,age,quota}
+ and pw{comment,class} (Debian 2.1 doesn't have either of these)
+ Branch: perl
+ ! lib/User/pwent.pm
____________________________________________________________________________
-[ 2997] By: jhi on 1999/02/20 14:00:26
- Log: Glossary update.
- Branch: maint-5.005/perl
- ! Porting/Glossary
+[ 5823] By: gsar on 2000/03/19 07:41:46
+ Log: pod typo fixes (from Marcel Grunauer <marcel.grunauer@lovely.net>)
+ Branch: perl
+ ! embed.pl embedvar.h hints/linux.sh pod/perlhack.pod
+ ! pod/perlnumber.pod pod/perlthrtut.pod vms/ext/Stdio/Stdio.pm
____________________________________________________________________________
-[ 2995] By: jhi on 1999/02/20 12:25:10
- Log: Document #2893, Mach cthreads support.
- Branch: maint-5.005/perl
- ! pod/perldelta.pod
+[ 5822] By: gsar on 2000/03/19 07:34:29
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ ! ext/Thread/Thread.pm pod/perlthrtut.pod
+ !> (integrate 41 files)
____________________________________________________________________________
-[ 2986] By: jhi on 1999/02/19 23:26:34
- Log: Remove the unnecessary osf1 -D__LANGUAGE_C__.
- Branch: maint-5.005/perl
- ! Configure
+[ 5821] By: gsar on 2000/03/19 07:14:38
+ Log: remove dead code
+ Branch: perl
+ ! lib/charnames.pm
____________________________________________________________________________
-[ 2983] By: jhi on 1999/02/19 20:35:51
- Log: Mach cthreads:
- From: brie@corp.home.net (Brian Harrison)
- Subject: perl5.005_02 patch for mthreads
- To: perl5-porters@perl.org
- Date: Fri, 23 Oct 1998 14:20:57 -0700 (PDT)
- Message-ID: <Pine.GSO.4.04.9810231410220.11111-200000@sulaco.eos.home.net>
- Branch: maint-5.005/perl
- ! Configure Porting/Glossary config_h.SH malloc.c perl.h
- ! thread.h
+[ 5820] By: gsar on 2000/03/19 07:13:01
+ Log: fix typo
+ Branch: perl
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 2981] By: jhi on 1999/02/19 19:49:03
- Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
- To: Chaim Frenkel <chaimf@pobox.com>,
- Russ Allbery <rra@stanford.edu>,
- Jarkko Hietaniemi <jhi@iki.fi>,
- Gurusamy Sarathy <gsar@activestate.com>,
- Graham Barr <gbarr@pobox.com>
- Cc: bdensch@ameritech.net, perlbug@perl.com
- Subject: [PATCH] Re: Solaris 7 for Intel
- Message-ID: <19990219124404.A30182@O2.chapin.edu>
-
- and Glossary update.
- Branch: maint-5.005/perl
- ! Configure Makefile.SH Porting/Glossary
+[ 5819] By: gsar on 2000/03/19 07:09:32
+ Log: produce better error message when \N{...} is used without
+ "use charnames ..."
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod toke.c
____________________________________________________________________________
-[ 2980] By: gbarr on 1999/02/19 16:06:53
- Log: Make result of h2xs work when user adds C<use strict>
- Branch: maint-5.005/perl
- ! utils/h2xs.PL
+[ 5818] By: gsar on 2000/03/19 06:30:11
+ Log: default warnLevel and dieLevel to 0 in debugger (from Tom
+ Christiansen); make dumpvar.pl safe against non-glob entries
+ in stashes
+ Branch: perl
+ ! lib/Dumpvalue.pm lib/dumpvar.pl lib/perl5db.pl
+ ! pod/perldebug.pod
____________________________________________________________________________
-[ 2976] By: gsar on 1999/02/18 21:54:09
- Log: integrate change#2975 from mainline
-
- distinguish eval'' from BEGIN|INIT|END CVs (fixes buggy propagation
- of lexical searches in BEGIN|INIT|END)
- Branch: maint-5.005/perl
- !> cop.h cv.h op.c perly.c perly.y pp_ctl.c t/op/misc.t
- !> vms/perly_c.vms
+[ 5817] By: gsar on 2000/03/19 06:18:24
+ Log: better notes on s///ee (from Simon Cozens <simon@cozens.net>)
+ Branch: perl
+ ! pod/perlop.pod
____________________________________________________________________________
-[ 2971] By: jhi on 1999/02/18 11:14:24
- Log: AIX syscalls.exp scan missed explicitly 32/64-bit syscalls.
-
- From: Joe Buehler <jhpb@hekimian.com>
- To: perl5-porters@perl.org
- Subject: setsid not detected by perl 5.005_02 configure under AIX 4.3
- Date: 12 Feb 1999 11:25:21 -0500
- Message-ID: <yd3lni3613i.fsf@ganymede.hekimian.com>
- Branch: maint-5.005/perl
- ! Configure
+[ 5816] By: gsar on 2000/03/19 05:55:52
+ Log: support for C<use vmsish 'hushed'>; move VMSISH_EXIT out of
+ op_private (from Charles Lane <lane@DUPHY4.Physics.Drexel.Edu>)
+ Branch: perl
+ ! embed.pl op.c op.h opcode.h opcode.pl perl.h pp.sym pp_ctl.c
+ ! pp_proto.h vms/ext/vmsish.pm vms/ext/vmsish.t vms/vmsish.h
____________________________________________________________________________
-[ 2967] By: jhi on 1999/02/17 23:12:59
- Log: Make SCO/Unixware scan to work in Unixware, too.
-
- From: Tom Hughes <thh@cyberscience.com>
- To: perlbug@perl.com
- Subject: Not OK: perl 5.00555 on i386-svr4 [actually Unixware 2.1] (UNINSTALLED)
- Date: 17 Feb 1999 15:34:15 +0000
- Message-ID: <yekg185nix4.fsf@elva.cyberscience.com>
- Branch: maint-5.005/perl
- ! Configure
+[ 5815] By: gsar on 2000/03/19 05:27:31
+ Log: fix sort optimizer to not hang inside loops
+ Branch: perl
+ ! op.c t/op/sort.t
____________________________________________________________________________
-[ 2956] By: jhi on 1999/02/15 21:03:28
- Log: OpenBSD sparc SHMLBA (like change #2945).
- Branch: maint-5.005/perl
- ! ext/IPC/SysV/SysV.xs
+[ 5814] By: gsar on 2000/03/19 03:59:29
+ Log: fixes for alias handling in debugger (from Tom Christiansen)
+ Branch: perl
+ ! lib/perl5db.pl
____________________________________________________________________________
-[ 2950] By: jhi on 1999/02/15 13:37:28
- Log: AVAILABILITY sync.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5813] By: gsar on 2000/03/19 03:38:10
+ Log: warn about CHECK and INIT blocks encountered at run time
+ Branch: perl
+ ! op.c pod/perldelta.pod pod/perldiag.pod t/pragma/warn/op
____________________________________________________________________________
-[ 2906] By: jhi on 1999/02/13 14:55:47
- Log: AVAILABILITY sync.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5812] By: jhi on 2000/03/19 03:15:58
+ Log: Taint msgrcv() messages; general SysV IPC cleanup.
+ Branch: cfgperl
+ ! doio.c ext/IPC/SysV/Msg.pm pod/perldelta.pod pod/perlfunc.pod
+ ! pod/perlipc.pod pod/perlsec.pod t/lib/ipc_sysv.t t/op/taint.t
____________________________________________________________________________
-[ 2905] By: gsar on 1999/02/13 00:12:53
- Log: integrate change#2898 from mainline
-
- support win32_putenv()
- Branch: maint-5.005/perl
- !> mg.c util.c win32/GenCAPI.pl win32/makedef.pl win32/perlhost.h
- !> win32/win32.c win32/win32iop.h
+[ 5811] By: jhi on 2000/03/19 01:48:47
+ Log: Taint shmread().
+ Branch: cfgperl
+ ! doio.c pod/perldelta.pod pod/perlfunc.pod pod/perlsec.pod
+ ! t/op/taint.t
____________________________________________________________________________
-[ 2904] By: jhi on 1999/02/12 21:23:30
- Log: Add README.hurd, from Mark Kettenis <kettenis@wins.uva.nl>.
- Branch: maint-5.005/perl
- + README.hurd
- ! MANIFEST
+[ 5810] By: jhi on 2000/03/19 01:22:47
+ Log: Taint also the passwd field of the getpw*().
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perlfunc.pod pod/perlsec.pod pp_sys.c
+ ! t/op/taint.t
____________________________________________________________________________
-[ 2900] By: jhi on 1999/02/12 12:07:28
- Log: SCO ODT/OSR release scanning.
- Branch: maint-5.005/perl
- ! Configure
+[ 5809] By: jhi on 2000/03/18 21:44:34
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> t/pragma/strict-vars toke.c
____________________________________________________________________________
-[ 2897] By: jhi on 1999/02/12 11:24:25
- Log: Undo a big bad paste from change #2884.
- Branch: maint-5.005/perl
- ! hints/openbsd.sh
+[ 5808] By: jhi on 2000/03/18 21:40:55
+ Log: (Re-)introduce $uidsign and $gidsign.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH epoc/config.sh pp_sys.c vms/subconfigure.com
+ ! vos/config.def vos/config.h vos/config_h.SH_orig
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/config_h.PL win32/config_sh.PL
+ Branch: metaconfig
+ ! U/modified/groupstype.U U/typedefs/gidtype.U
____________________________________________________________________________
-[ 2896] By: jhi on 1999/02/12 11:19:52
- Log: Update the error message of db-recno.t to DB version 1.86
- and the URL to www.sleepycat.com instead of www.bostic.com.
- Branch: maint-5.005/perl
- ! t/lib/db-recno.t
+[ 5807] By: jhi on 2000/03/18 20:38:12
+ Log: The #5805 requires a test change, too.
+ Branch: cfgperl
+ ! t/op/taint.t
____________________________________________________________________________
-[ 2895] By: gsar on 1999/02/12 11:18:59
- Log: integrate change#2854 from mainline
-
- compatibility fix: magic non-propagation in foreach implicit localization
- Branch: maint-5.005/perl
- !> pp_ctl.c t/op/local.t
+[ 5806] By: gsar on 2000/03/18 20:10:29
+ Log: queued errors may not be displayed after the PL_error_count limit
+ Branch: perl
+ ! t/pragma/strict-vars toke.c
____________________________________________________________________________
-[ 2884] By: jhi on 1999/02/12 08:36:14
- Log: OpenBSD pthreads awareness, thanks to
- David Leonard <david.leonard@csee.uq.edu.au>
- Branch: maint-5.005/perl
- ! Configure hints/openbsd.sh
+[ 5805] By: jhi on 2000/03/18 19:56:12
+ Log: Taint the shell from the getpw*.
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perlfunc.pod pod/perlsec.pod pp_sys.c
____________________________________________________________________________
-[ 2883] By: jhi on 1999/02/12 08:29:51
- Log: AVAILABILITY sync.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5804] By: jhi on 2000/03/18 19:37:01
+ Log: Use the newSVuv().
+ Branch: cfgperl
+ ! embed.h op.c pp_sys.c toke.c
____________________________________________________________________________
-[ 2878] By: jhi on 1999/02/11 22:00:50
- Log: Replace changes #2783, #2784, #2785, with a single tested
- patch from Francois Desarmenien <desar@club-internet.fr>.
- Branch: maint-5.005/perl
- ! MANIFEST ext/GDBM_File/hints/sco.pl ext/IPC/SysV/SysV.xs
- ! hints/sco.sh
+[ 5803] By: jhi on 2000/03/18 19:08:40
+ Log: Add newSVuv().
+ Branch: cfgperl
+ ! Configure embed.pl global.sym objXSUB.h perlapi.c perlapi.h
+ ! pod/perlapi.pod proto.h sv.c
____________________________________________________________________________
-[ 2876] By: jhi on 1999/02/11 20:43:17
- Log: From: Chris Nandor <pudge@pobox.com>
- To: perl5-porters@perl.org
- Subject: [PATCH] perlport.pod 1.39
- Date: Thu, 11 Feb 1999 12:28:35 -0500
- Message-Id: <v04020a2db2e8c3177123@[192.168.0.77]>
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 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.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH vos/config.h vos/config_h.SH_orig
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ Branch: metaconfig
+ ! U/modified/Getfile.U
+ Branch: metaconfig/U/perl
+ ! bincompat5005.U
____________________________________________________________________________
-[ 2875] By: jhi on 1999/02/11 20:35:08
- Log: The fpsetmask() really is SCO5 only.
- Branch: maint-5.005/perl
- ! unixish.h
+[ 5801] By: jhi on 2000/03/18 16:41:31
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes Configure hints/dos_djgpp.sh lib/ExtUtils/xsubpp
+ !> lib/Getopt/Long.pm mg.c pod/perlpod.pod pp_hot.c
+ !> t/lib/charnames.t t/pragma/utf8.t toke.c
____________________________________________________________________________
-[ 2874] By: jhi on 1999/02/11 20:32:06
- Log: Change #2783 missed these.
- Branch: maint-5.005/perl
- ! ext/IPC/SysV/SysV.xs unixish.h
+[ 5800] By: gsar on 2000/03/18 05:16:32
+ Log: force i_ieeefp=undef on dos_djgpp (it reportedly causes failures
+ in system includes)
+ Branch: perl
+ ! hints/dos_djgpp.sh
____________________________________________________________________________
-[ 2873] By: jhi on 1999/02/11 20:27:45
- Log: Import the change #2810 from cfgperl.
- Branch: maint-5.005/perl
- + ext/GDBM_File/hints/sco.pl
- ! MANIFEST hints/sco.sh unixish.h
+[ 5799] By: gsar on 2000/03/18 05:12:00
+ Log: Getopt::Long 2.23 update (from Johan Vromans)
+ Branch: perl
+ ! Changes lib/Getopt/Long.pm
____________________________________________________________________________
-[ 2872] By: jhi on 1999/02/11 19:57:37
- Log: Sync the current AVAILABILITY.
- Branch: maint-5.005/perl
- ! pod/perl.pod pod/perldelta.pod
+[ 5798] By: gsar on 2000/03/18 05:03:20
+ Log: recognize single-line declarations in xsubpp; add switches to
+ disable newfangled features (from Ilya Zakharevich)
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 2871] By: jhi on 1999/02/11 19:42:54
- Log: Copied the GNU/Hurd hints file over from cfgperl
- because it works well enough (there are still some
- rough edges in Hurd), verified via private
- email from Mark Kettenis <kettenis@wins.uva.nl>
- Branch: maint-5.005/perl
- + hints/gnu.sh
+[ 5797] By: gsar on 2000/03/18 04:21:43
+ Log: make "\N{...}" enable utf8-ness correctly
+ Branch: perl
+ ! t/lib/charnames.t toke.c
____________________________________________________________________________
-[ 2864] By: jhi on 1999/02/11 08:45:00
- Log: From: Spider Boardman <spider@zk3.dec.com>
- To: perlbug@perl.com
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on RISC-ultrix 4.4 (UNINSTALLED)
- Date: Wed, 10 Feb 1999 23:33:31 -0500
- Message-Id: <9902110433.AA12816@abyss.zk3.dec.com>
- Branch: maint-5.005/perl
- ! doio.c ext/IPC/SysV/SysV.xs hints/ultrix_4.sh
+[ 5796] By: gsar on 2000/03/18 04:03:08
+ Log: avoid mentioning Perl version in Configure question
+ Branch: perl
+ ! Configure
____________________________________________________________________________
-[ 2863] By: jhi on 1999/02/11 08:35:35
- Log: AVAILABILITY.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5795] By: gsar on 2000/03/18 03:32:31
+ Log: better explanation of C<> tags (from Wolfgang Laun)
+ Branch: perl
+ ! pod/perlpod.pod
____________________________________________________________________________
-[ 2858] By: gsar on 1999/02/11 07:10:59
- Log: remove dup hunk
- Branch: maint-5.005/perl
- ! pod/perldelta.pod
+[ 5794] By: gsar on 2000/03/18 03:26:57
+ Log: make return values from match in a list context, as well as $& et
+ al propagate utf8-ness (from Graham Barr)
+ Branch: perl
+ ! mg.c pp_hot.c t/pragma/utf8.t
____________________________________________________________________________
-[ 2857] By: gsar on 1999/02/11 07:09:20
- Log: sync with parent version of perldelta.pod
- Branch: maint-5.005/perl
- !> pod/perldelta.pod
+[ 5793] By: jhi on 2000/03/18 01:45:30
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> hints/powerux.sh xsutils.c
____________________________________________________________________________
-[ 2853] By: gsar on 1999/02/11 00:33:06
- Log: integrate change#2816 from mainline
-
- minor bug in dumping blessed subrefs
- Branch: maint-5.005/perl
- !> ext/Data/Dumper/Dumper.pm
+[ 5792] By: gsar on 2000/03/18 01:08:25
+ Log: hints fixups for PowerMAX (from Tom Horsley)
+ Branch: perl
+ ! hints/powerux.sh
____________________________________________________________________________
-[ 2852] By: gsar on 1999/02/10 23:17:49
- Log: fair warning about -Dusethreads
- Branch: maint-5.005/perl
- ! Configure INSTALL README.threads
+[ 5791] By: gsar on 2000/03/17 23:53:21
+ Log: make reftype() consistently croak on non-refs
+ Branch: perl
+ ! xsutils.c
____________________________________________________________________________
-[ 2851] By: jhi on 1999/02/10 23:00:39
- Log: Snapshot of the ongoing AVAILABILITY discussion.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5790] By: jhi on 2000/03/17 23:41:36
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> configpm ext/Thread/Thread/Queue.pm
+ !> ext/Thread/Thread/Semaphore.pm ext/Thread/Thread/Specific.pm
+ !> lib/Pod/Find.pm lib/perl5db.pl perl.c pod/perldata.pod
____________________________________________________________________________
-[ 2850] By: jhi on 1999/02/10 16:07:32
- Log: OS390 and Windows AVAILABILITY entries enhanced.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5789] By: gsar on 2000/03/17 22:37:21
+ Log: fix coredump when upgrading PL_sv_yes in a second call to
+ perl_construct() (from Doug MacEachern)
+ Branch: perl
+ ! perl.c
____________________________________________________________________________
-[ 2849] By: jhi on 1999/02/10 12:39:46
- Log: AS/400 and Mac were not described right.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5788] By: gsar on 2000/03/17 22:32:25
+ Log: make noTTY debugger option work again (from Paul Marquess)
+ Branch: perl
+ ! lib/perl5db.pl
____________________________________________________________________________
-[ 2848] By: jhi on 1999/02/10 09:13:49
- Log: Added AVAILABILITY section.
- Branch: maint-5.005/perl
- ! pod/perl.pod
+[ 5787] By: gsar on 2000/03/17 17:00:05
+ Log: make Config.pm report sane errors with older perls
+ Branch: perl
+ ! configpm
____________________________________________________________________________
-[ 2837] By: jhi on 1999/02/08 14:51:39
- Log: Fix typo introduced in change #2836.
- Branch: maint-5.005/perl
- ! Configure
+[ 5786] By: gsar on 2000/03/17 16:48:20
+ Log: syntax errors in Thread::* (from Tom Christiansen)
+ Branch: perl
+ ! ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
+ ! ext/Thread/Thread/Specific.pm
____________________________________________________________________________
-[ 2836] By: jhi on 1999/02/08 14:44:31
- Log: Augment change #2809, the h2ph-*symbols patch.
- Branch: maint-5.005/perl
- ! Configure t/lib/h2ph.pht
+[ 5785] By: gsar on 2000/03/17 16:45:34
+ Log: tweak perldata section on v-strings
+ Branch: perl
+ ! pod/perldata.pod
____________________________________________________________________________
-[ 2815] By: gsar on 1999/02/05 03:44:50
- Log: integrate change#2242 from mainline
-
- fix skipspace() to properly account for newlines in eval''-ed
- strings (caused bogus line numbers in diagnostics and debugger)
- Branch: maint-5.005/perl
- !> toke.c
+[ 5784] By: gsar on 2000/03/17 16:24:28
+ Log: missing file in change#5781
+ Branch: perl
+ ! lib/Pod/Find.pm
____________________________________________________________________________
-[ 2814] By: jhi on 1999/02/04 21:21:39
- Log: Stratus perlport update.
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 5783] By: jhi on 2000/03/17 14:38:29
+ Log: Add the NEXTSTEP strftime %j bug to Known Problems.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 2813] By: jhi on 1999/02/04 21:16:54
- Log: Stratus VOS update.
-
- From: Paul_Green@stratus.com
- To: jhi@iki.fi
- Subject: RE: VOS changes for Perl5.005_03 are ready!
- Date: Thu, 4 Feb 1999 14:51:07 -0500
- Message-ID: <1D1A4EF7AD4DD211A80D00A0C9D7DB665A0168@exna1.stratus.com>
- Branch: maint-5.005/perl
- + vos/vos_accept.c
- ! MANIFEST README.vos perl.c pod/perlport.pod vos/Changes
- ! vos/build.cm vos/compile_perl.cm vos/config.h
- ! vos/config_h.SH_orig vos/perl.bind vos/test_vos_dummies.c
- ! vos/vos_dummies.c vos/vosish.h
+[ 5782] By: jhi on 2000/03/17 14:29:46
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> embed.pl ext/B/B/Bblock.pm global.sym lib/File/Spec/Unix.pm
+ !> lib/open.pm objXSUB.h op.c perlapi.c pod/perlcompile.pod
+ !> pod/perldebug.pod sv.c t/comp/cpp.aux t/pod/testpchk.pl
____________________________________________________________________________
-[ 2809] By: jhi on 1999/02/03 19:54:16
- Log: h2ph fixes + Configure patch to support them.
-
- From: "Kurt D. Starsinic" <kstar@chapin.edu>
- To: Graham Barr <gbarr@pobox.com>, Jarkko Hietaniemi <jhi@iki.fi>,
- Gurusamy Sarathy <gsar@engin.umich.edu>
- Cc: perl5-porters@perl.org
- Subject: [PATCH 5.00503_MT5] h2ph.PL
- Date: Tue, 2 Feb 1999 19:48:06 -0500
- Message-ID: <19990202194806.E10647@O2.chapin.edu>
- Branch: maint-5.005/perl
- ! Configure utils/h2ph.PL
+[ 5781] By: gsar on 2000/03/17 06:19:17
+ Log: PodParser v1.13 update (from Brad Appleton)
+ Branch: perl
+ ! t/pod/testpchk.pl
____________________________________________________________________________
-[ 2802] By: jhi on 1999/02/02 17:41:23
- Log: From: John Bley <jbb6@acpub.duke.edu>
- To: perlbug@perl.org
- Subject: [PATCH]5.005_54 (DOC) fix minor typos
- Date: Tue, 2 Feb 1999 07:52:52 -0500 (EST)
- Message-ID: <Pine.SOL.3.91.990202075115.23589A-100000@soc11.acpub.duke.edu>
- Branch: maint-5.005/perl
- ! pod/perlre.pod
+[ 5780] By: gsar on 2000/03/17 05:42:45
+ Log: propagate CvFLAGS() into clones
+ Branch: perl
+ ! op.c
____________________________________________________________________________
-[ 2790] By: jhi on 1999/02/02 16:51:45
- Log: Re-introduce the typo corrections (update to CGI 2.46
- overran them).
- Branch: maint-5.005/perl
- ! lib/CGI.pm
+[ 5779] By: gsar on 2000/03/17 04:58:39
+ Log: documentation fixes from p5p
+ Branch: perl
+ ! ext/B/B/Bblock.pm lib/File/Spec/Unix.pm pod/perlcompile.pod
+ ! pod/perldebug.pod
____________________________________________________________________________
-[ 2781] By: jhi on 1999/02/02 14:27:01
- Log: Update the MkLinux note.
- Branch: maint-5.005/perl
- ! hints/linux.sh
+[ 5778] By: bailey on 2000/03/17 04:23:35
+ Log: Quick pre-release fixes: clean up results in File::Spec::VMS and
+ switch dir test order in taint.t to accomodate DECCRTL extension.
+ Branch: vmsperl
+ ! lib/File/Spec/VMS.pm t/op/taint.t
____________________________________________________________________________
-[ 2775] By: jhi on 1999/02/02 13:13:24
- Log: Mention lib/Dumpvalue.pm.
- Branch: maint-5.005/perl
- ! pod/roffitall
+[ 5777] By: gsar on 2000/03/17 04:13:27
+ Log: make attributes::reftype(*FOO{IO}) return "IO" instead of "UNKNOWN"
+ (from Tom Christiansen)
+ Branch: perl
+ ! sv.c
____________________________________________________________________________
-[ 2767] By: jhi on 1999/02/02 12:29:57
- Log: Demangle spaces to tab+space.
- Branch: maint-5.005/perl
- ! hints/freebsd.sh
+[ 5776] By: jhi on 2000/03/17 03:40:18
+ Log: More Todo.
+ Branch: cfgperl
+ ! Todo Todo-5.6
____________________________________________________________________________
-[ 2758] By: jhi on 1999/02/02 10:51:26
- Log: Detypo.
- Branch: maint-5.005/perl
- ! lib/Math/Trig.pm
+[ 5775] By: gsar on 2000/03/17 03:40:14
+ Log: s/:def/:DEFAULT/
+ Branch: perl
+ ! lib/open.pm
____________________________________________________________________________
-[ 2755] By: jhi on 1999/02/02 09:07:51
- Log: Make FreeBSD 2.2.7 work with -Duseshrplib -ders.
- Branch: maint-5.005/perl
- ! hints/freebsd.sh
+[ 5774] By: gsar on 2000/03/17 03:39:07
+ Log: export cv_undef() and cv_const_sv() (mod_perl uses them to
+ good advantage)
+ Branch: perl
+ ! embed.pl global.sym objXSUB.h perlapi.c
____________________________________________________________________________
-[ 2752] By: jhi on 1999/02/01 22:15:12
- Log: Add perlthrtut.pod.
-
- From: Dan Sugalski <sugalskd@osshe.edu>
- To: perl5-porters@perl.org
- Subject: perlthrtut.pod
- Date: Mon, 01 Feb 1999 10:57:11 -0800
- Message-Id: <3.0.6.32.19990201105711.02e62540@ous.edu>
- Branch: maint-5.005/perl
- + pod/perlthrtut.pod
- ! MANIFEST pod/Makefile pod/buildtoc pod/perldelta.pod
- ! pod/roffitall
+[ 5773] By: gsar on 2000/03/17 03:12:34
+ Log: remove non-ANSI parts in comp/cpp.t
+ Branch: perl
+ ! t/comp/cpp.aux
____________________________________________________________________________
-[ 2741] By: gbarr on 1999/02/01 03:00:42
- Log: Fix typecasts in #2728
-
- From: "G. Del Merritt" <del@intranetics.com>
- Date: Fri, 29 Jan 1999 11:47:25 -0700
- Message-Id: <199901291847.LAA04828@jhereg.perl.com>
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on MSWin32-x86-object 4.0 (PATCH included)
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.xs
+[ 5772] By: jhi on 2000/03/17 03:11:49
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> configure.com embed.h embed.pl lib/CGI.pm
+ !> lib/ExtUtils/Mksymlists.pm lib/Pod/Man.pm perl.h
+ !> pod/pod2man.PL pod/pod2text.PL pp_sys.c vms/ext/vmsish.pm
+ !> vms/ext/vmsish.t vms/subconfigure.com vms/test.com
+ !> vms/vmsish.h
+____________________________________________________________________________
+[ 5771] By: jhi on 2000/03/17 03:10:34
+ Log: Make the test easier to use.
+ Branch: cfgperl
+ ! t/op/sysio.t
____________________________________________________________________________
-[ 2740] By: gsar on 1999/02/01 02:43:07
- Log: CAPI inheritance tweak and doc
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MakeMaker.pm
+[ 5770] By: gsar on 2000/03/17 03:04:33
+ Log: pod{man,text} updates from podlators-1.00 (from Russ Allbery)
+ Branch: perl
+ ! lib/Pod/Man.pm pod/pod2man.PL pod/pod2text.PL
____________________________________________________________________________
-[ 2739] By: jhi on 1999/01/31 18:31:54
- Log: Undo changes #2730 and #2731 and replace them
- with an extensively tested patch from
- Anton Berezin <tobez@plab.ku.dk> (via private email).
- Branch: maint-5.005/perl
- ! Makefile.SH hints/freebsd.sh
+[ 5769] By: gsar on 2000/03/17 02:53:39
+ Log: integrate vmsperl contents into mainline (no actual changes, since
+ cfgperl already had them all)
+ Branch: perl
+ !> configure.com lib/CGI.pm lib/ExtUtils/Mksymlists.pm perl.h
+ !> vms/ext/vmsish.pm vms/ext/vmsish.t vms/subconfigure.com
+ !> vms/test.com vms/vmsish.h
____________________________________________________________________________
-[ 2738] By: gsar on 1999/01/31 05:04:32
- Log: fix bogus CAPI inheritance from change#2541
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MakeMaker.pm
+[ 5768] By: gsar on 2000/03/17 02:48:14
+ Log: fix signedness in test for syswrite() length argument
+ Branch: perl
+ ! pp_sys.c
____________________________________________________________________________
-[ 2737] By: gsar on 1999/01/31 04:55:06
- Log: remove the big ugly thing jhi sneezed into INSTALL :-)
- Branch: maint-5.005/perl
- ! INSTALL
+[ 5767] By: gsar on 2000/03/17 02:38:51
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> (integrate 28 files)
____________________________________________________________________________
-[ 2736] By: jhi on 1999/01/30 12:57:06
- Log: From: pvhp@forte.com (Peter Prymmer)
- To: perl-mvs@perl.org, perlbug@perl.com
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on os390 05.00 (UNINSTALLED)
- Date: Fri, 29 Jan 99 19:22:31 PST
- Message-Id: <9901300322.AA19136@forte.com>
-
- (slighty edited at the end)
- Branch: maint-5.005/perl
- ! README.os390
+[ 5766] By: jhi on 2000/03/17 02:29:24
+ Log: Add "Known Problems" section.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 2735] By: jhi on 1999/01/30 11:49:54
- Log: Undo 5.005-devel random, srandom mention.
- Branch: maint-5.005/perl
- ! INSTALL
+[ 5765] By: gsar on 2000/03/17 00:31:19
+ Log: add missing bincompat5005 #defines
+ Branch: perl
+ ! embed.h embed.pl
____________________________________________________________________________
-[ 2734] By: jhi on 1999/01/29 22:22:00
- Log: Add perlreftut.
- Branch: maint-5.005/perl
- + pod/perlreftut.pod
- ! MANIFEST pod/perl.pod pod/perldelta.pod pod/roffitall
+[ 5764] By: jhi on 2000/03/16 15:32:52
+ Log: pp_send() type tuning continues.
+ Branch: cfgperl
+ ! pp_sys.c
____________________________________________________________________________
-[ 2732] By: gsar on 1999/01/29 20:09:44
- Log: integrate change#2720 from mainline
-
- missing space while munging CCFLAGS for PERL_CAPI
- Branch: maint-5.005/perl
- !> lib/ExtUtils/MM_Unix.pm
+[ 5763] By: jhi on 2000/03/16 04:09:37
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> embed.pl global.sym objXSUB.h perl.c perlapi.c
+ !> win32/perlhost.h win32/perllib.c win32/win32.h
____________________________________________________________________________
-[ 2731] By: jhi on 1999/01/29 14:33:12
- Log: FreeBSD version numbers can be like "2.2.8-release".
- Branch: maint-5.005/perl
- ! hints/freebsd.sh
+[ 5762] By: jhi on 2000/03/16 04:06:36
+ Log: VMS patches from Dan Sugalski and Charles Bailey
+ Branch: cfgperl
+ ! configure.com ext/File/Glob/Glob.pm lib/CGI.pm
+ ! lib/ExtUtils/Mksymlists.pm vms/subconfigure.com
+____________________________________________________________________________
+[ 5761] By: gsar on 2000/03/16 03:18:41
+ Log: due to an oversight during PERL_OBJECT migration, hosts created
+ by pseudo-fork were never being deleted, leading to a sizeable
+ memory leak; std FDs in pseudo-children are now closed
+ automatically to avoid resource leaks; basic infinite looping
+ fork() test works without leaking again in non-PERL_OBJECT
+ build
+ Branch: perl
+ ! embed.pl global.sym objXSUB.h perl.c perlapi.c
+ ! win32/perlhost.h win32/perllib.c win32/win32.h
+____________________________________________________________________________
+[ 5760] By: jhi on 2000/03/16 01:50:13
+ Log: Fix pp_send() sizes (pass a Size_t, not an Off_t, and
+ return a SSize_t, not an Off_t); add a note about a slightly
+ similar situation in pp_truncate(); introduce $sizesize
+ for Configure; update EPOC, VOS, Win32, and VMS for the
+ sizesize; minor updates on the EPOC config file; reword
+ socklen_t message slightly; fix fpossize (though unused currently)
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH epoc/config.sh pp_sys.c vms/subconfigure.com
+ ! vos/config.def vos/config.h win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/config_h.PL win32/config_sh.PL
+ Branch: metaconfig/U/perl
+ ! d_socklen_t.U fpossize.U
____________________________________________________________________________
-[ 2730] By: jhi on 1999/01/29 12:40:38
- Log: FreeBSD hints iteration (hopefully convergent).
- usethreads: require at least FreeBSD 2.2.8.
- signal type: mirror change #2429 in cfgperl.
- Branch: maint-5.005/perl
- ! hints/freebsd.sh
+[ 5759] By: jhi on 2000/03/15 23:47:11
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> makedef.pl
____________________________________________________________________________
-[ 2729] By: gbarr on 1999/01/29 05:06:32
- Log: Trial release 5
- Branch: maint-5.005/perl
- ! Changes patchlevel.h pod/perlhist.pod
+[ 5758] By: jhi on 2000/03/15 23:46:17
+ Log: Retract #5767; replace it with a tested patch
+ from Anton Berezin.
+ Branch: cfgperl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 5757] By: jhi on 2000/03/15 23:36:53
+ Log: Configure nits: do not use /tmp to avoid potential security
+ problems (Andy Dougherty: this does not fix the rampant
+ use of /tmp by the various utilities like C compilers, though.
+ Just don't run Configure as root if you care about security.),
+ fix man3dir bug (both from Andy Dougherty); fix hints files
+ not to use /tmp; retract #4993 (the description of the *symbols
+ variables is okay, after all); regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH hints/dec_osf.sh hints/esix4.sh hints/newsos4.sh
+ Branch: metaconfig
+ + U/modified/d_flexfnam.U
+ ! U/installdirs/man3dir.U
____________________________________________________________________________
-[ 2728] By: gbarr on 1999/01/29 04:10:37
- Log: From: Ted Law <tedlaw@cibcwg.com>
- Date: Wed, 27 Jan 1999 14:54:03 -0500 (EST)
- Message-Id: <199901271954.OAA07391@dcm2.cibcwg.com>
- Subject: POSIX::strftime buffer overflow problem
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.xs
+[ 5756] By: jhi on 2000/03/15 22:20:06
+ Log: cater for FreeBSD 5.*
+ Branch: cfgperl
+ ! hints/freebsd.sh
____________________________________________________________________________
-[ 2728] By: gbarr on 1999/01/29 04:10:37
- Log: From: Ted Law <tedlaw@cibcwg.com>
- Date: Wed, 27 Jan 1999 14:54:03 -0500 (EST)
- Message-Id: <199901271954.OAA07391@dcm2.cibcwg.com>
- Subject: POSIX::strftime buffer overflow problem
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.xs
+[ 5755] By: jhi on 2000/03/15 22:00:57
+ Log: Add missing Windows O_ constants.
+ Branch: cfgperl
+ ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
____________________________________________________________________________
-[ 2727] By: gbarr on 1999/01/29 04:09:57
- Log: From: Tom Spindler <dogcow@isi.net>
- Date: Thu, 28 Jan 1999 17:15:11 -0800
- Message-ID: <19990128171510.A11778@isi.net>
- Subject: [PATCH] BeOS dynamic loading support for perl5.005_03_MT4
- Branch: maint-5.005/perl
- + ext/DynaLoader/dl_beos.xs
- ! Configure MANIFEST Makefile.SH README.beos hints/beos.sh
- ! lib/ExtUtils/MM_Unix.pm
+[ 5754] By: gsar on 2000/03/15 19:56:37
+ Log: add PL_thr_key to export list under useithreads
+ Branch: perl
+ ! makedef.pl
____________________________________________________________________________
-[ 2726] By: gbarr on 1999/01/29 03:30:51
- Log: Remove use of File::Slurp in t/lib/textfill.t
- Branch: maint-5.005/perl
- ! t/lib/textfill.t
+[ 5753] By: jhi on 2000/03/15 04:19:19
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 37 files)
____________________________________________________________________________
-[ 2725] By: gbarr on 1999/01/29 03:11:41
- Log: From: Gurusamy Sarathy <gsar@ActiveState.com>
- Date: Wed, 27 Jan 1999 23:14:33 -0800
- Message-Id: <199901280714.XAA10176@activestate.com>
- Subject: Re: NOT OK: "@INC contains: ." after make install - MAINT_TRIAL_4 - 5.005_03 maintenance trial 4 MSWin32-x86-object
- Branch: maint-5.005/perl
- ! win32/Makefile win32/makefile.mk
+[ 5752] By: bailey on 2000/03/15 03:45:28
+ Log: Make DEBUGGING a configurable option
+ Branch: vmsperl
+ ! configure.com
____________________________________________________________________________
-[ 2724] By: jhi on 1999/01/28 19:27:15
- Log: Change jhi@iki.fi to perlbug@perl.com.
- Cosmetic change in semctl probing messages.
- Branch: maint-5.005/perl
- ! Configure hints/freebsd.sh
+[ 5751] By: bailey on 2000/03/15 03:38:57
+ Log: Remove obsolete DCL symbol from subconfigure.com
+ Branch: vmsperl
+ ! vms/subconfigure.com
____________________________________________________________________________
-[ 2723] By: jhi on 1999/01/28 17:27:49
- Log: Yet another typo in a test program.
- Branch: maint-5.005/perl
- ! Configure
+[ 5750] By: bailey on 2000/03/15 03:29:17
+ Log: Add VMS' default to the CGI.pm temp list (should update to File::Spec)
+ Branch: vmsperl
+ ! lib/CGI.pm
+ !> ext/File/Glob/Glob.pm
____________________________________________________________________________
-[ 2722] By: jhi on 1999/01/28 17:13:52
- Log: The pthreads_created_joinable test had a typo,
- by blind luck the default value works almost anywhere.
- Branch: maint-5.005/perl
- ! Configure
+[ 5749] By: bailey on 2000/03/15 02:05:28
+ Log: Change test using obsolete %COnfig element
+ Branch: vmsperl
+ ! lib/ExtUtils/Mksymlists.pm
____________________________________________________________________________
-[ 2721] By: jhi on 1999/01/28 13:04:23
- Log: MinT support, adapted from change #2594.
- Branch: maint-5.005/perl
- + README.mint ext/POSIX/hints/mint.pl hints/mint.sh
- + mint/Makefile mint/README mint/errno.h mint/pwd.c mint/stdio.h
- + mint/sys/time.h mint/time.h
- ! MANIFEST doio.c malloc.c miniperlmain.c perl.c
- ! pod/perldelta.pod t/io/fs.t t/lib/safe2.t t/op/groups.t
- ! t/op/mkdir.t t/op/taint.t
+[ 5748] By: gsar on 2000/03/14 23:39:42
+ Log: update local_patches entry for RC2
+ Branch: perl
+ ! Changes patchlevel.h pod/perlhist.pod
____________________________________________________________________________
-[ 2719] By: jhi on 1999/01/27 19:49:49
- Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- To: perl5-porters@perl.org
- Subject: Re: [PATCH] perl5.005_03-MAINT_TRIAL_3: clarify Sv[INU]V versus Sv[INU]VX in perlguts
- Date: Tue, 26 Jan 1999 22:25:07 +0000
- Message-Id: <E105Gux-0000Ac-00@taurus.cus.cam.ac.uk>
- Branch: maint-5.005/perl
- ! pod/perlguts.pod
+[ 5747] By: gsar on 2000/03/14 22:44:27
+ Log: more warnings tidy-ups (from Paul Marquess)
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfaq4.pod
+ ! t/lib/attrs.t utils/h2xs.PL
____________________________________________________________________________
-[ 2718] By: jhi on 1999/01/27 19:46:04
- Log: io/fs.t fails test #18 (sense of tests appears to have been
- changed incompletely; this patch just skips the test attached,
- a la test #17 preceding it).
-
- From: "G. Del Merritt" <del@intranetics.com>
- To: perlbug@perl.com
- Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included)
- Date: Tue, 26 Jan 1999 12:09:09 -0700
- Message-Id: <199901261909.MAA25525@jhereg.perl.com>
- Branch: maint-5.005/perl
- ! t/io/fs.t
+[ 5746] By: gsar on 2000/03/14 22:30:43
+ Log: Sys::Syslog fix for accidental arguments to autoloaded constants
+ Branch: perl
+ ! ext/Sys/Syslog/Syslog.pm ext/Sys/Syslog/Syslog.xs
____________________________________________________________________________
-[ 2717] By: jhi on 1999/01/27 19:44:46
- Log: Miniperl fails to build (pp_sys.c was changed and iperlsys.h wasn't)
-
- From: "G. Del Merritt" <del@intranetics.com>
- To: perlbug@perl.com
- Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included)
- Date: Tue, 26 Jan 1999 12:09:09 -0700
- Message-Id: <199901261909.MAA25525@jhereg.perl.com>
- Branch: maint-5.005/perl
- ! iperlsys.h
+[ 5745] By: gsar on 2000/03/14 22:20:27
+ Log: tweak to use SIZE_ONLY
+ Branch: perl
+ ! regcomp.c
____________________________________________________________________________
-[ 2716] By: jhi on 1999/01/27 19:38:36
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- To: perlbug@perl.com, vmsperl@perl.org
- Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on VMSAXP (Patch included, of course)
- Date: Tue, 26 Jan 1999 14:40:38 -0800
- Message-Id: <3.0.6.32.19990126144038.02e5d650@ous.edu>
-
- From: Dan Sugalski <sugalskd@osshe.edu>
- To: perl5-porters@perl.org, vmsperl@perl.org
- Subject: [PATCH 5.005_03-MAILT_TRIAL_4]VMS test patches
- Date: Tue, 26 Jan 1999 14:55:29 -0800
- Message-Id: <3.0.6.32.19990126145529.02f22280@ous.edu>
- Branch: maint-5.005/perl
- ! t/lib/textfill.t t/lib/textwrap.t vms/ext/Stdio/test.pl
- ! vms/subconfigure.com
+[ 5744] By: gsar on 2000/03/14 21:56:48
+ Log: regen win32/config*
+ Branch: perl
+ ! win32/Makefile win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 2715] By: jhi on 1999/01/27 19:34:28
- Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
- To: perl5-porters@perl.org
- Subject: [PATCH perl5.005_03-MAINT_TRIAL_4] MPE port tweaks
- Date: Tue, 26 Jan 1999 16:32:18 -0800 (PST)
- Message-Id: <199901270032.QAA13395@spock.dis.cccd.edu>
- Branch: maint-5.005/perl
- ! hints/mpeix.sh mpeix/relink
+[ 5743] By: gsar on 2000/03/14 21:46:25
+ Log: change#5729 had syntax errors
+ Branch: perl
+ ! t/lib/complex.t
____________________________________________________________________________
-[ 2714] By: jhi on 1999/01/27 19:32:41
- Log: NetBSD does not do setruid, setrgid.
- Branch: maint-5.005/perl
- ! hints/netbsd.sh
+[ 5742] By: gsar on 2000/03/14 21:26:33
+ Log: integrate vmsperl changes into mainline (change#5693 denied)
+ Branch: perl
+ !> configure.com lib/File/Spec/VMS.pm t/lib/complex.t
+ !> t/lib/filespec.t vms/ext/filespec.t vms/subconfigure.com
+ !> vms/vms.c
____________________________________________________________________________
-[ 2713] By: jhi on 1999/01/27 19:28:53
- Log: FreeBSD usethreads, based on private email with
- Anton Berezin <tobez@plab.ku.dk>.
- Branch: maint-5.005/perl
- ! hints/freebsd.sh
+[ 5741] By: gsar on 2000/03/14 21:17:34
+ Log: update Changes; integrate cfgperl contents into mainline
+ Branch: perl
+ ! Changes
+ !> ext/Socket/Socket.xs patchlevel.h perl.h t/lib/complex.t
____________________________________________________________________________
-[ 2712] By: jhi on 1999/01/27 19:26:17
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- To: Mailing list Perl5 <perl5-porters@perl.org>
- Subject: [PATCH 5.005_*] OS/2 threads
- Date: Tue, 26 Jan 1999 13:39:46 -0500
- Message-ID: <19990126133946.A11594@monk.mps.ohio-state.edu>
- Branch: maint-5.005/perl
- ! os2/os2ish.h
+[ 5740] By: gsar on 2000/03/14 20:57:12
+ Log: perlfaq4 tweak (from Damian Conway <damian@cs.monash.edu.au>)
+ Branch: perl
+ ! pod/perlfaq4.pod
____________________________________________________________________________
-[ 2711] By: jhi on 1999/01/27 19:24:28
- Log: "make ok", "make okfile", and "make nok" were broken
- with -Duseshrplib, because of a shared typo.
-
- From: Spider Boardman <spider@web.zk3.dec.com>
- To: perlbug@perl.com
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
- Date: Wed, 27 Jan 1999 12:27:15 -0500
- Message-Id: <199901271727.MAA233455@web.zk3.dec.com>
- Branch: maint-5.005/perl
- ! Makefile.SH
+[ 5739] By: gsar on 2000/03/14 20:53:07
+ Log: allow alternates to negate correctly (from Johan Vromans)
+ Branch: perl
+ ! lib/Getopt/Long.pm
____________________________________________________________________________
-[ 2710] By: jhi on 1999/01/27 19:22:23
- Log: Errno fixes:
-
- From: Spider Boardman <spider@web.zk3.dec.com>
- To: perlbug@perl.com
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
- Date: Wed, 27 Jan 1999 12:27:15 -0500
- Message-Id: <199901271727.MAA233455@web.zk3.dec.com>
-
- From: Spider Boardman <spider@web.zk3.dec.com>
- To: perlbug@perl.com
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
- Date: Wed, 27 Jan 1999 13:31:16 -0500
- Message-Id: <199901271831.NAA241001@web.zk3.dec.com>
- Branch: maint-5.005/perl
- ! Configure ext/Errno/Errno_pm.PL
+[ 5738] By: gsar on 2000/03/14 20:34:19
+ Log: kludge our way around warnings on C<use POSIX; use IO::File;>
+ Branch: perl
+ ! ext/IO/lib/IO/Seekable.pm
____________________________________________________________________________
-[ 2709] By: jhi on 1999/01/27 19:17:35
- Log: Fix Configure installusrbinperl:
-
- From: Spider Boardman <spider@web.zk3.dec.com>
- To: jhi@iki.fi
- cc: perl5-porters@perl.org
- Subject: Re: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
- Date: Wed, 27 Jan 1999 13:03:35 -0500
- Message-Id: <199901271803.NAA238257@web.zk3.dec.com>
- Branch: maint-5.005/perl
- ! Configure
+[ 5737] By: gsar on 2000/03/14 20:06:23
+ Log: protect special characters better against interpretation by *roff
+ (from Russ Allbery)
+ Branch: perl
+ ! lib/Pod/Man.pm
____________________________________________________________________________
-[ 2708] By: gbarr on 1999/01/26 04:14:42
- Log: Trial release 4
- Branch: maint-5.005/perl
- ! Changes patchlevel.h pod/perlhist.pod
+[ 5736] By: gsar on 2000/03/14 19:47:00
+ Log: provide an explicit base address for perl56.dll to avoid relocations;
+ increase the default stack size (RE engine can use a lot more stack
+ than the 1MB default limit); default to using the regular version of
+ the MSVCRT even for DEBUGGING builds (this allows extensions to be
+ selectively built with debugging)
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 2707] By: gbarr on 1999/01/26 02:06:17
- Log: Add redef IO::Handle::* for setv?buf()
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.pm
+[ 5735] By: gsar on 2000/03/14 19:31:53
+ Log: regen perltoc, other pod nits
+ Branch: perl
+ ! ext/IO/poll.c pod/Makefile pod/buildtoc pod/perlnumber.pod
+ ! pod/perltoc.pod pod/roffitall
____________________________________________________________________________
-[ 2706] By: jhi on 1999/01/24 22:26:12
- Log: Better AIX libc nm scan.
- Branch: maint-5.005/perl
- ! Configure
+[ 5734] By: gsar on 2000/03/14 19:08:22
+ Log: avoid dup warning (from Simon Cozens)
+ Branch: perl
+ ! regcomp.c
____________________________________________________________________________
-[ 2703] By: jhi on 1999/01/24 14:26:18
- Log: Minor Configure adjustments.
- Branch: maint-5.005/perl
- ! Configure
+[ 5733] By: gsar on 2000/03/14 18:46:50
+ Log: allow usemymalloc to be overridden via -Uusemymalloc
+ Branch: perl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 2702] By: jhi on 1999/01/24 13:57:33
- Log: Use usethreads.cbu consistently.
- Branch: maint-5.005/perl
- ! Configure hints/aix.sh hints/dec_osf.sh hints/dos_djgpp.sh
- ! hints/freebsd.sh hints/hpux.sh hints/irix_4.sh hints/irix_5.sh
- ! hints/irix_6.sh hints/irix_6_0.sh hints/irix_6_1.sh
- ! hints/linux.sh hints/os2.sh hints/solaris_2.sh
+[ 5732] By: gsar on 2000/03/14 17:23:47
+ Log: test case for change#5700 (from M. J. T. Guy)
+ Branch: perl
+ ! t/op/universal.t
____________________________________________________________________________
-[ 2701] By: jhi on 1999/01/24 13:55:43
- Log: Mention year-1900 and month 0..11 also here.
- Branch: maint-5.005/perl
- ! lib/Time/Local.pm
+[ 5731] By: gsar on 2000/03/14 17:15:44
+ Log: revise README.win32 for currentness, point to function
+ list in perlport.pod (from a patch suggested by Dominic Dunlop)
+ Branch: perl
+ ! README.win32 pod/perlport.pod
____________________________________________________________________________
-[ 2700] By: jhi on 1999/01/24 13:52:36
- Log: Document Configure -Uinstallusrbinperl.
- Branch: maint-5.005/perl
- ! INSTALL pod/perldelta.pod
+[ 5730] By: gsar on 2000/03/14 17:14:21
+ Log: tweak sort() notes (from Nathan Torkington)
+ Branch: perl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 2699] By: jhi on 1999/01/24 13:01:57
- Log: perlopentut was missing.
- Branch: maint-5.005/perl
- + pod/perlopentut.pod
- ! MANIFEST pod/perldelta.pod
+[ 5729] By: jhi on 2000/03/14 15:13:13
+ Log: Make the tests 1018 and 1019 more robust.
+ Branch: cfgperl
+ ! t/lib/complex.t
____________________________________________________________________________
-[ 2697] By: jhi on 1999/01/24 12:31:33
- Log: Remove t/op/grent.t (t/op/pwent.t was removed by #2685).
- Branch: maint-5.005/perl
- - t/op/grent.t
- ! MANIFEST
+[ 5728] By: jhi on 2000/03/14 15:07:48
+ Log: Fix for one of the problems in RC1 reported by M. E. O'Neill
+ in NEXTSTEP 3.3p2.
+ Branch: cfgperl
+ ! ext/Socket/Socket.xs
____________________________________________________________________________
-[ 2696] By: gsar on 1999/01/24 11:39:39
- Log: integrate changes#2255,2694 from mainline
-
- another win32 portability fix: make sysread() and syswrite()
- work on sockets
-
- better notes on 'make' on win32
- Branch: maint-5.005/perl
- ! README.win32 pp_sys.c win32/win32.h
+[ 5727] By: jhi on 2000/03/14 14:57:04
+ Log: Integrate with Sarathy; unapply the #5539 that snekt in
+ with #5539.
+ Branch: cfgperl
+ +> pod/perldebguts.pod
+ ! patchlevel.h perl.h
+ !> MANIFEST lib/Text/Abbrev.pm lib/perl5db.pl pod/perl.pod
+ !> pod/perldebug.pod pod/perldelta.pod pod/perlnumber.pod
+ !> t/lib/io_sock.t utils/perlcc.PL utils/perldoc.PL
+ !> win32/makefile.mk
____________________________________________________________________________
-[ 2693] By: gbarr on 1999/01/24 00:53:31
- Log: Integrate changes #2646,2647 from cfgperl
-
- Show LANGUAGE env var when needed. (Augment change #2645).
-
- SHMLBA strikes back in NetBSD/sparc.
-
- From: Dave Nelson <David.Nelson@bellcow.com>
- To: jhi@iki.fi
- Subject: perl5.005_02 + IPC::SysV + NetBSD/Sparc
- Date: Mon, 18 Jan 1999 22:07:56 -0600
- Message-Id: <199901190407.WAA02543@longhorn.bellcow.com>
- Branch: maint-5.005/perl
- ! util.c utils/perlbug.PL
- !> ext/IPC/SysV/SysV.xs
+[ 5726] By: gsar on 2000/03/14 07:43:37
+ Log: fixes for Borland compiler (from Vadim Konovalov
+ <vkonovalov@lucent.com>)
+ Branch: perl
+ ! utils/perlcc.PL win32/makefile.mk
____________________________________________________________________________
-[ 2692] By: gbarr on 1999/01/24 00:28:52
- Log: Integrate #2630 from mainline and an errno save fix
- Branch: maint-5.005/perl
- !> doio.c
+[ 5725] By: gsar on 2000/03/14 07:38:00
+ Log: more efficient Text::Abbrev (from M.E. O'Neill <oneill@cs.sfu.ca>)
+ Branch: perl
+ ! lib/Text/Abbrev.pm
____________________________________________________________________________
-[ 2691] By: gbarr on 1999/01/24 00:28:37
- Log: Update CGI modules to 2.46 and Getopt::Long to 2.19
- Branch: maint-5.005/perl
- ! lib/CGI.pm lib/CGI/Carp.pm lib/CGI/Cookie.pm lib/CGI/Fast.pm
- ! lib/CGI/Push.pm lib/Getopt/Long.pm t/lib/cgi-html.t
+[ 5724] By: gsar on 2000/03/14 05:59:02
+ Log: integrate cfgperl changes into mainline, ignoring the
+ __attribute__((unused)) stuff that seems to have snuck
+ back in
+ Branch: perl
+ !> Todo-5.6 patchlevel.h perl.h pod/perl.pod pod/perlport.pod
+ !> vms/perlvms.pod
____________________________________________________________________________
-[ 2690] By: gbarr on 1999/01/23 23:35:39
- Log: Integrate #2681 from cfgperl
-
- Better (I hope) LANGUAGE documentation.
- Branch: maint-5.005/perl
- !> pod/perllocale.pod
+[ 5723] By: gsar on 2000/03/14 05:49:08
+ Log: patches for many bugs in the debugger; documentation updates for
+ perldelta; split perldebug.pod into perldeb{ug,guts}.pod (from
+ Tom Christiansen)
+ Branch: perl
+ + pod/perldebguts.pod
+ ! MANIFEST lib/perl5db.pl pod/perl.pod pod/perldebug.pod
+ ! pod/perldelta.pod pod/perlnumber.pod pod/perlport.pod
____________________________________________________________________________
-[ 2689] By: gbarr on 1999/01/23 23:31:59
- Log: More nosuid patches
-
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Fri, 22 Jan 1999 12:12:45 +0200 (EET)
- Message-ID: <13992.20253.269284.841300@alpha.hut.fi>
- Subject: Re: [PATCH] 5.005*: the "nosuid" problem: v2
- Branch: maint-5.005/perl
- ! Configure config_h.SH perl.c perl.h pod/perldelta.pod
- ! pod/perldiag.pod
+[ 5722] By: gsar on 2000/03/14 05:37:29
+ Log: add sleep() to avoid race on NeXT (from M.E. O'Neill
+ <oneill@cs.sfu.ca>)
+ Branch: perl
+ ! t/lib/io_sock.t
____________________________________________________________________________
-[ 2688] By: gbarr on 1999/01/23 23:03:39
- Log: From: Anton Berezin <tobez@plab.ku.dk>
- Date: 21 Jan 1999 17:07:28 +0100
- Message-ID: <86emood2yn.fsf@lion.plab.ku.dk>
- Subject: [PATCH 5.005_54] hints/freebsd.sh - reflect the birth of version 4.0
- Branch: maint-5.005/perl
- ! hints/freebsd.sh
+[ 5721] By: gsar on 2000/03/14 03:53:50
+ Log: support a -U option when run as root to drop privileges (from
+ Tom Christiansen)
+ Branch: perl
+ ! utils/perldoc.PL
____________________________________________________________________________
-[ 2687] By: gbarr on 1999/01/23 22:52:58
- Log: overload syntax is no longer experimental
- Branch: maint-5.005/perl
- ! lib/overload.pm
+[ 5720] By: jhi on 2000/03/14 03:43:51
+ Log: move the big AVAILABILITY list to perlport as Supported Platforms
+ (Tom Christiansen); add few more platforms
+ Branch: cfgperl
+ ! pod/perl.pod pod/perlport.pod
____________________________________________________________________________
-[ 2685] By: gbarr on 1999/01/23 22:15:46
- Log: Remove t/op/pwent.t added from cfgperl, but is not robust.
- Branch: maint-5.005/perl
- - t/op/pwent.t
- ! MANIFEST
+[ 5719] By: jhi on 2000/03/14 02:44:55
+ Log: more todo
+ Branch: cfgperl
+ ! Todo-5.6
____________________________________________________________________________
-[ 2684] By: gbarr on 1999/01/23 22:13:07
- Log: More doc typos from Abigail, and undo some in lib/diagnostics.pm
- from change #2672
-
- From: abigail@fnx.com
- Date: Tue, 19 Jan 1999 19:32:42 -0500 (EST)
- Message-Id: <19990120003242.19938.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/CGI.pm] Typos
-
- From: abigail@fnx.com
- Date: Tue, 19 Jan 1999 19:40:41 -0500 (EST)
- Message-Id: <19990120004041.20052.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/CPAN.pm] Typos
- Branch: maint-5.005/perl
- ! lib/CGI.pm lib/CPAN.pm lib/diagnostics.pm
+[ 5718] By: jhi on 2000/03/14 02:17:16
+ Log: detypo
+ Branch: cfgperl
+ ! vms/perlvms.pod
____________________________________________________________________________
-[ 2677] By: gbarr on 1999/01/22 03:38:07
- Log: Integrate #2645, #2648 and update patching.pod
-
- Document the GNU LANGUAGE env var.
-
- Mention /usr/share/locale.
-
- From: Daniel Grisinger <dgris@moiraine.dimensional.com>
- Date: 21 Jan 1999 00:17:35 -0700
- Message-Id: <m31zkpqels.fsf_-_@moiraine.dimensional.com>
- Subject: [PATCH] patching.pod, misc fixes (was Re: Which ? What ? Why ? When ?)
- Branch: maint-5.005/perl
- ! Porting/patching.pod
- !> pod/perllocale.pod
+[ 5717] By: jhi on 2000/03/14 02:00:24
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ ! patchlevel.h perl.h
+ !> (integrate 60 files)
____________________________________________________________________________
-[ 2676] By: gbarr on 1999/01/22 01:54:02
- Log: Fixup FindBin to use File::Spec
-
- Message-Id: <19990120185157.D24479@west-tip.transeda.com>
- Date: Wed, 20 Jan 1999 18:51:57 +0000
- From: Paul Johnson <pjcj@transeda.com>
- Subject: Re: [PATCH] 5005_54 Make FindBin work with UNC paths
- Branch: maint-5.005/perl
- ! lib/FindBin.pm
+[ 5716] By: gsar on 2000/03/14 00:01:39
+ Log: reference miscount in Devel::Peek that causes debugger to
+ crash unceremoniously when doing "V DB" etc., repeatedly
+ Branch: perl
+ ! ext/Devel/Peek/Peek.xs
____________________________________________________________________________
-[ 2675] By: gbarr on 1999/01/22 01:38:31
- Log: Add new config values added for nosuid fix into VMS configure
-
- From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Wed, 20 Jan 1999 12:05:18 -0800
- Message-Id: <3.0.6.32.19990120120518.00a98470@ous.edu>
- Subject: [PATCH 5.005_03MT3]VMS configure tweak
- Branch: maint-5.005/perl
- ! vms/subconfigure.com
+[ 5715] By: gsar on 2000/03/13 21:40:23
+ Log: fixes for broken L<> links (from Wolfgang Laun
+ <wolfgang.laun@alcatel.at>)
+ Branch: perl
+ ! pod/Win32.pod pod/perlcall.pod pod/perlcompile.pod
+ ! pod/perldata.pod pod/perlfaq7.pod pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perllocale.pod pod/perlnumber.pod
+ ! pod/perlop.pod pod/perlxstut.pod vms/perlvms.pod
____________________________________________________________________________
-[ 2674] By: gbarr on 1999/01/22 01:36:35
- Log: Fix for buggy compiler optimization on dec for pack("I",...)
-
- From: Achim Bohnet <ach@mpe.mpg.de>
- Date: Wed, 20 Jan 1999 20:25:53 +0100
- Message-Id: <199901201925.UAA16940@o06.xray.mpe.mpg.de>
- Subject: [PATCH] Not OK: perl 5.00503 +MAINT_TRIAL_3 on alpha-dec_osf 4.0
- Branch: maint-5.005/perl
- ! pp.c
+[ 5714] By: gsar on 2000/03/13 21:37:48
+ Log: typos in perlboot.pod (from Randal L. Schwartz <merlyn@stonehenge.com>)
+ Branch: perl
+ ! pod/perlboot.pod
____________________________________________________________________________
-[ 2673] By: gbarr on 1999/01/22 01:29:37
- Log: OS/2 patches from Ilya
-
- Date: Thu, 21 Jan 1999 02:08:27 -0500
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: [PATCH 5.00*] makedepend
- Message-Id: <19990121020827.A25509@monk.mps.ohio-state.edu>
-
- Date: Thu, 21 Jan 1999 02:46:34 -0500
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: [PATCH 5.005_*] Errno.pm suffers from \\ too
- Message-Id: <19990121024634.A25600@monk.mps.ohio-state.edu>
-
- Date: Thu, 21 Jan 1999 02:50:16 -0500
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: [PATCH 5.005_03] Resend of OS/2 patch
- Message-Id: <19990121025016.A25612@monk.mps.ohio-state.edu>
-
- Date: Thu, 21 Jan 1999 03:58:29 -0500
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: [PATCH 5.005_*] OS2::PrfDB was exploiting a bug in U32 XSUBs
- Message-Id: <19990121035829.A25822@monk.mps.ohio-state.edu>
- Branch: maint-5.005/perl
- ! ext/Errno/Errno_pm.PL makedepend.SH os2/Changes
- ! os2/Makefile.SHs os2/OS2/PrfDB/PrfDB.xs os2/os2.c
+[ 5713] By: gsar on 2000/03/13 21:36:24
+ Log: avoid infinite loop in h2xs (from Hugo van der Sanden)
+ Branch: perl
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 2672] By: gbarr on 1999/01/22 01:05:45
- Log: More doc typo patches from Abigail
-
- From: abigail@fnx.com
- Message-Id: <19990120001410.19645.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL 3 lib/AutoLoader.pm] Typos
- Date: Tue, 19 Jan 1999 19:14:10 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120004312.20152.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/Carp.pm] Typo
- Date: Tue, 19 Jan 1999 19:43:12 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120004429.20190.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/Cwd.pm] Typo
- Date: Tue, 19 Jan 1999 19:44:29 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120005241.20693.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/Safe.pm] Typo
- Date: Tue, 19 Jan 1999 19:52:41 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120005525.20788.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/SelfLoader.pm] Typos
- Date: Tue, 19 Jan 1999 19:55:25 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120005821.20926.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/Symbol.pm] Typo
- Date: Tue, 19 Jan 1999 19:58:21 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120010002.20973.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/Test.pm] Typo
- Date: Tue, 19 Jan 1999 20:00:02 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120013823.23015.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/diagnostics.pm] Typos (ignore
- Date: Tue, 19 Jan 1999 20:38:23 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120013909.23085.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/ops.pm] Typo
- Date: Tue, 19 Jan 1999 20:39:09 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120015817.24306.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/overload.pm] Typos
- Date: Tue, 19 Jan 1999 20:58:16 -0500 (EST)
-
- From: abigail@fnx.com
- Message-Id: <19990120020326.24373.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL3 lib/re.pm] Typos
- Date: Tue, 19 Jan 1999 21:03:26 -0500 (EST)
- Branch: maint-5.005/perl
- ! ext/Opcode/Safe.pm ext/Opcode/ops.pm ext/re/re.pm
- ! lib/AutoLoader.pm lib/Carp.pm lib/Cwd.pm lib/SelfLoader.pm
- ! lib/Symbol.pm lib/Test.pm lib/diagnostics.pm lib/overload.pm
+[ 5712] By: gsar on 2000/03/13 21:29:15
+ Log: lexical warnings update for docs and tests (from Paul Marquess)
+ Branch: perl
+ ! ext/File/Glob/Glob.pm lib/fields.pm pod/perl.pod
+ ! pod/perldata.pod pod/perldbmfilter.pod pod/perlfaq3.pod
+ ! pod/perlfaq4.pod pod/perlfaq7.pod pod/perlfilter.pod
+ ! pod/perlipc.pod pod/perlmod.pod pod/perlmodlib.pod
+ ! pod/perlop.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ ! pod/perlstyle.pod pod/perlsyn.pod pod/perltie.pod
+ ! pod/perltrap.pod pod/perlunicode.pod pod/perlxstut.pod
+ ! t/io/open.t t/lib/fields.t t/lib/parsewords.t
+ ! t/op/assignwarn.t t/op/gv.t t/op/hashwarn.t t/op/magic.t
+ ! t/op/pack.t t/op/pat.t t/op/sort.t t/op/sprintf.t
+ ! t/pragma/constant.t t/pragma/locale.t
____________________________________________________________________________
-[ 2671] By: gbarr on 1999/01/22 00:40:13
- Log: Fix win32 for Borland compiler and spaces in paths
-
- From: Gurusamy Sarathy <gsar@activestate.com>
- Date: Mon, 18 Jan 1999 20:33:17 -0800
- Message-Id: <199901190433.UAA03656@activestate.com>
- Subject: [PATCH] 5.005_03-trial3 win32 issues
- Branch: maint-5.005/perl
- ! README.win32 win32/Makefile win32/config_sh.PL
- ! win32/makefile.mk win32/runperl.c
+[ 5711] By: gsar on 2000/03/13 21:08:29
+ Log: updates from PodParser v1.12 on CPAN (from Brad Appleton)
+ Branch: perl
+ ! lib/Pod/Checker.pm lib/Pod/Find.pm lib/Pod/InputObjects.pm
+ ! lib/Pod/ParseUtils.pm lib/Pod/Parser.pm lib/Pod/Select.pm
+ ! lib/Pod/Usage.pm t/pod/poderrs.xr t/pod/testp2pt.pl
+ ! t/pod/testpchk.pl
____________________________________________________________________________
-[ 2637] By: gbarr on 1999/01/18 02:52:18
- Log: Update DB_File to 1.63
-
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- Date: Tue, 29 Dec 1998 16:23:54 +0000 (GMT)
- Message-Id: <9812291623.AA20884@claudius.bfsec.bt.co.uk>
- Subject: PATCH DB_File 1.63 for 5.005_54 & 5.005_03
- Branch: maint-5.005/perl
- ! ext/DB_File/Changes ext/DB_File/DB_File.pm
- ! ext/DB_File/DB_File.xs ext/DB_File/dbinfo ext/DB_File/typemap
+[ 5710] By: gsar on 2000/03/13 20:46:37
+ Log: cleaner logic in op.c, also avoids QNX optimizer bug (from Norton
+ Allen <allen@huarp.harvard.edu>)
+ Branch: perl
+ ! op.c
____________________________________________________________________________
-[ 2636] By: gbarr on 1999/01/17 18:03:31
- Log: Trial release 3
- Branch: maint-5.005/perl
- ! Changes patchlevel.h
+[ 5709] By: gsar on 2000/03/13 20:43:30
+ Log: mention changes to diagnostics
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 2635] By: gbarr on 1999/01/17 17:32:01
- Log: Update to CPAN-1.44
-
- From: Mark-Jason Dominus <mjd@plover.com>
- Date: Sat, 16 Jan 1999 17:22:06 -0500
- Message-ID: <19990116222206.3674.qmail@plover.com>
- Subject: Re: DOC PATCH (5.005_54 perlsub.pod)
- Branch: maint-5.005/perl
- ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
- ! pod/perlsub.pod
+[ 5708] By: gsar on 2000/03/13 20:34:38
+ Log: ignore const for the purposes of typemaps (from Hugo van der Sanden)
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 2634] By: gbarr on 1999/01/17 17:27:12
- Log: Fix for suidperl when script is on a nosuid filesystem
-
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Sun, 17 Jan 1999 16:27:06 +0200 (EET)
- Message-ID: <13985.62266.324824.292401@alpha.hut.fi>
- Subject: [PATCH] 5.005*: the "nosuid" problem: v2
- Branch: maint-5.005/perl
- ! Configure config_h.SH perl.c perl.h pod/perldiag.pod
+[ 5707] By: gsar on 2000/03/13 20:23:24
+ Log: don't check for errno after Atof() (atof() doesn't set errno, and
+ where Atof() is actually strto[l]d(), some platforms seem to want
+ to set errno randomly)
+ Branch: perl
+ ! toke.c
____________________________________________________________________________
-[ 2618] By: gbarr on 1999/01/16 19:18:26
- Log: Added Dumpvalue.pm
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 7 Dec 1998 02:44:25 -0500 (EST)
- Message-Id: <199812070744.CAA18949@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Dumpvar.pm
- Branch: maint-5.005/perl
- + lib/Dumpvalue.pm
- ! MANIFEST pod/perldelta.pod
+[ 5706] By: gsar on 2000/03/13 18:14:18
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure config_h.SH hints/hpux.sh hints/solaris_2.sh mg.c
+ !> perl.h pod/perl.pod pp.c
____________________________________________________________________________
-[ 2617] By: gbarr on 1999/01/16 19:09:36
- Log: Minor change to perlxstut and added perlopentut.pod
-
- From: Nathan Torkington <gnat@frii.com>
- Date: Sat, 26 Dec 1998 14:28:21 +1300 (NZDT)
- Message-ID: <13956.15285.933914.320849@localhost.frii.com>
- Subject: [PATCH] perlxstut.pod fix
-
- From: Tom Christiansen <tchrist@jhereg.perl.com>
- Date: Sat, 09 Jan 1999 08:13:18 -0700
- Message-Id: <199901091513.IAA17512@jhereg.perl.com>
- Subject: perlopentut.pod
- Branch: maint-5.005/perl
- ! MANIFEST pod/perl.pod pod/perldelta.pod pod/perlxstut.pod
- ! pod/roffitall
+[ 5705] By: jhi on 2000/03/13 14:44:11
+ Log: STRLEN != int.
+ Branch: cfgperl
+ ! mg.c
____________________________________________________________________________
-[ 2616] By: gbarr on 1999/01/16 18:59:55
- Log: Win32 changes from Jan
-
- From: jan.dubois@ibm.net (Jan Dubois)
- Date: Fri, 15 Jan 1999 23:38:35 +0100
- Message-ID: <36a7c10d.16311905@smtp1.ibm.net>
- Subject: [PATCH 5.005_03m2] Win32 Makefile patches
-
- From: jan.dubois@ibm.net (Jan Dubois)
- Date: Sat, 16 Jan 1999 13:02:45 +0100
- Message-ID: <36a07da6.10722337@smtp1.ibm.net>
- Subject: [PATCH 5.005_03m2] minor tweaks to README.win32
- Branch: maint-5.005/perl
- ! README.win32 win32/Makefile win32/makefile.mk
+[ 5704] By: jhi on 2000/03/13 13:18:07
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/warnings/register.pm
+ !> (integrate 42 files)
____________________________________________________________________________
-[ 2615] By: gbarr on 1999/01/16 18:48:48
- Log: Jumbo patch from Sarathy for PERL_OBJECT & USE_THREADS
-
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Thu, 07 Jan 1999 00:12:00 -0500
- Message-Id: <199901070512.AAA23568@aatma.engin.umich.edu>
- Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
-
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Thu, 14 Jan 1999 19:21:46 -0500
- Message-Id: <199901150021.TAA01886@aatma.engin.umich.edu>
- Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
- Branch: maint-5.005/perl
- ! embed.h global.sym lib/ExtUtils/MM_Unix.pm objXSUB.h objpp.h
- ! op.c perl.c perl.h perly.c perly.y perly_c.diff pp.c proto.h
- ! sv.c t/io/fs.t toke.c win32/GenCAPI.pl win32/config.bc
- ! win32/makedef.pl win32/runperl.c win32/win32.c
+[ 5703] By: gsar on 2000/03/13 12:40:51
+ Log: mention autoflush portability caveat
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlop.pod pod/perlport.pod
____________________________________________________________________________
-[ 2614] By: gbarr on 1999/01/16 16:48:38
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Fri, 15 Jan 1999 17:28:34 +0200 (EET)
- Message-Id: <199901151528.RAA08785@alpha.hut.fi>
- Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: NetBSD patches
-
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Fri, 15 Jan 1999 18:44:19 +0200 (EET)
- Message-Id: <199901151644.SAA08184@alpha.hut.fi>
- Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: allow skipping the "install also as /usr/bin/perl" question of installperl
-
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Fri, 15 Jan 1999 18:52:29 +0200 (EET)
- Message-Id: <199901151652.SAA11259@alpha.hut.fi>
- Subject: the promised "installusrbinperl + NetBSD" fix
- Branch: maint-5.005/perl
- ! Configure Makefile.SH hints/netbsd.sh installperl
- ! makedepend.SH unixish.h
+[ 5702] By: gsar on 2000/03/13 11:09:05
+ Log: final touches for lexical warnings (from Paul Marquess)
+ Branch: perl
+ + lib/warnings/register.pm
+ ! MANIFEST ext/IO/lib/IO/Select.pm ext/Socket/Socket.pm
+ ! lib/Class/Struct.pm lib/I18N/Collate.pm lib/Tie/Handle.pm
+ ! lib/Tie/Hash.pm lib/Tie/Scalar.pm lib/constant.pm
+ ! lib/syslog.pl lib/vars.pm lib/warnings.pm mg.c perl.c
+ ! pod/perllexwarn.pod pp_ctl.c t/lib/filepath.t t/lib/io_sel.t
+ ! t/lib/socket.t t/lib/tie-stdhandle.t t/op/tie.t
+ ! t/pragma/constant.t t/pragma/diagnostics.t t/pragma/warn/2use
+ ! t/pragma/warn/9enabled warnings.h warnings.pl
____________________________________________________________________________
-[ 2613] By: gbarr on 1999/01/16 16:28:40
- Log: From: Laszlo Molnar <ml1050@freemail.c3.hu>
- Date: Thu, 14 Jan 1999 22:37:26 +0100
- Message-ID: <19990114223726.A177@beeblebrox>
- Subject: [PATCH for 5.005_03-MAINT_TRIAL_2] dos-djgpp update
- Branch: maint-5.005/perl
- ! djgpp/config.over djgpp/djgpp.c
+[ 5701] By: gsar on 2000/03/13 11:00:00
+ Log: avoid compiler warnings
+ Branch: perl
+ ! pp_hot.c
____________________________________________________________________________
-[ 2612] By: gbarr on 1999/01/16 16:27:25
- Log: Hints for sco.sh to automatically support dynamic linking
-
- From: Peter Wolfe <wolfe@teloseng.com>
- Date: Mon, 11 Jan 1999 11:50:20 -0800 (PST)
- Message-Id: <199901111950.LAA01703@titan.teloseng.com>
- Subject: SCO 3.2v5 patch for perl5.005_03-MAINT_TRIAL_1
- Branch: maint-5.005/perl
- ! hints/sco.sh
+[ 5700] By: gsar on 2000/03/13 09:57:59
+ Log: make the is_utf8_*() safe for use on invalid utf8 (they now
+ return false on such input instead of emitting warnings)
+ Branch: perl
+ ! embed.h embed.pl global.sym gv.c objXSUB.h perlapi.c
+ ! pod/perlapi.pod proto.h universal.c utf8.c
____________________________________________________________________________
-[ 2610] By: gbarr on 1999/01/14 03:07:33
- Log: Fix login in installperl for pods
-
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Date: Mon, 4 Jan 1999 13:50:10 GMT
- Message-Id: <199901041350.NAA19665@cyclone.cise.npl.co.uk>
- Subject: PATCH to installperl
- Branch: maint-5.005/perl
- ! installperl
+[ 5699] By: gsar on 2000/03/13 06:59:57
+ Log: the premature FREETMPS calls in change#1187 weren't defensive enough
+ Branch: perl
+ ! pp_ctl.c pp_hot.c t/op/recurse.t
____________________________________________________________________________
-[ 2609] By: gbarr on 1999/01/14 03:04:37
- Log: Fix incorrect "used only once" warnings
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Fri, 8 Jan 1999 04:37:10 -0500
- Message-ID: <19990108043710.A14390@monk.mps.ohio-state.edu>
- Subject: Re: change#965 flakiness
- Branch: maint-5.005/perl
- ! gv.c
+[ 5698] By: jhi on 2000/03/13 05:03:37
+ Log: hints nibbling continues
+ Branch: cfgperl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 2608] By: gbarr on 1999/01/14 02:56:46
- Log: Fixed double GLOB de-reference
-
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Sat, 09 Jan 1999 23:40:24 -0500
- Message-Id: <199901100440.XAA12360@aatma.engin.umich.edu>
- Subject: Re: IO::Pipe with perl -d (on HPUX)
- Branch: maint-5.005/perl
- ! ext/IO/lib/IO/Pipe.pm
+[ 5697] By: jhi on 2000/03/13 04:45:57
+ Log: there's no end to tweaking
+ Branch: cfgperl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 2607] By: gbarr on 1999/01/14 02:53:40
- Log: Added Carp::cluck to perldelta.pod
- Branch: maint-5.005/perl
- ! pod/perldelta.pod
+[ 5696] By: jhi on 2000/03/13 04:26:15
+ Log: hints tweak
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5695] By: bailey on 2000/03/13 03:54:09
+ Log: Trim out leftover hunk from prior resolve conflict
+ Branch: vmsperl
+ ! lib/File/Spec/VMS.pm
+____________________________________________________________________________
+[ 5694] By: bailey on 2000/03/13 03:20:20
+ Log: Assorted configuration cleanups (Peter Prymmer, and a
+ bit from Charles Bailey and Dan Sugalski)
+ Branch: vmsperl
+ ! configure.com vms/subconfigure.com
+____________________________________________________________________________
+[ 5693] By: bailey on 2000/03/13 03:00:16
+ Log: Add vmsish 'hushed' option to suppress error messages at exit
+ Branch: vmsperl
+ ! perl.h vms/ext/vmsish.pm vms/ext/vmsish.t vms/test.com
+ ! vms/vmsish.h
+____________________________________________________________________________
+[ 5692] By: bailey on 2000/03/13 02:50:10
+ Log: Fix inverted test conditions for secure lnm translation
+ and default file types. (Dan Sugalski)
+ Branch: vmsperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 5691] By: bailey on 2000/03/13 02:41:36
+ Log: Insulate tests of default display_format from different precision
+ on different machines by truncating at 1 digit less than the most
+ common choice (.15g)
+ Branch: vmsperl
+ ! t/lib/complex.t
+____________________________________________________________________________
+[ 5690] By: bailey on 2000/03/13 02:31:44
+ Log: Resync with mainline post RC1
+ Branch: vmsperl
+ +> lib/Pod/Plainer.pm
+ !> (integrate 137 files)
+____________________________________________________________________________
+[ 5689] By: bailey on 2000/03/13 02:22:24
+ Log: Update File::Spec::VMS and tests
+ Since reduce_ricochet has been removed from File::Spec,
+ revert changes to VMS::Filespec::vmsify made to accomodate it.
+ Branch: vmsperl
+ ! lib/File/Spec/VMS.pm t/lib/filespec.t vms/ext/filespec.t
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5688] By: bailey on 2000/03/13 02:12:11
+ Log: Basic 5.6.0 RC1 build patches for VMS
+ Branch: vmsperl
+ ! configure.com t/pragma/warn/doio t/pragma/warn/util
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 5687] By: jhi on 2000/03/13 00:41:51
+ Log: Solaris long double fixes from Alan Burlison.
+ Branch: cfgperl
+ ! hints/solaris_2.sh perl.h pp.c
____________________________________________________________________________
-[ 2606] By: gbarr on 1999/01/14 02:44:04
- Log: New perlfaq*.pod from Tom (private mail)
- Branch: maint-5.005/perl
- ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
- ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
- ! pod/perlfaq9.pod
+[ 5686] By: jhi on 2000/03/13 00:17:13
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> dump.c hints/hpux.sh op.c pod/perldelta.pod t/op/misc.t
____________________________________________________________________________
-[ 2584] By: gbarr on 1999/01/08 04:50:56
- Log: implemented Ilya's suggested fix, and added a testcase
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 5 Jan 1999 00:56:01 -0500 (EST)
- Message-Id: <199901050556.AAA02597@monk.mps.ohio-state.edu>
- Subject: Re: Text::ParseWords: regex fix
- Branch: maint-5.005/perl
- ! lib/Text/ParseWords.pm t/lib/parsewords.t
+[ 5685] By: jhi on 2000/03/13 00:13:17
+ Log: Retract #5680, it broke more than it helped.
+ Branch: cfgperl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 2583] By: gbarr on 1999/01/08 04:50:03
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Thu, 7 Jan 1999 12:47:38 +0200 (EET)
- Message-Id: <199901071047.MAA24100@alpha.hut.fi>
- Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: ext/Errno_pm.PL: understand wrapper cppstdins
- Branch: maint-5.005/perl
- ! ext/Errno/Errno_pm.PL
+[ 5684] By: gsar on 2000/03/12 21:48:44
+ Log: set optimize=-O only if not already set
+ Branch: perl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 2582] By: gbarr on 1999/01/08 03:37:55
- Log: More doc changes from Abigail, and included change #2575 from cfgperl
-
- From: abigail@fnx.com
- Message-ID: <19990107041434.22326.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Time/gmtime.pm] Typo fix
- Date: Wed, 6 Jan 1999 23:14:34 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107041746.22376.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Time/localtime.pm] Typo fix
- Date: Wed, 6 Jan 1999 23:17:46 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107042105.22527.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/User/grent.pm] Typo fix
- Date: Wed, 6 Jan 1999 23:21:05 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107042254.22624.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/User/pwent.pw] Typo fix
- Date: Wed, 6 Jan 1999 23:22:54 -0500 (EST)
- Branch: maint-5.005/perl
- ! lib/Math/Trig.pm lib/Time/gmtime.pm lib/Time/localtime.pm
- ! lib/User/grent.pm lib/User/pwent.pm
+[ 5683] By: gsar on 2000/03/12 20:11:45
+ Log: another optimized-OP_SASSIGN bug: ops that were not OA_TARGLEX
+ were being mistakenly subverted anyway
+ Branch: perl
+ ! dump.c op.c pod/perldelta.pod t/op/misc.t
____________________________________________________________________________
-[ 2578] By: gbarr on 1999/01/07 04:30:26
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Wed, 06 Jan 1999 13:47:34 -0800
- Message-Id: <3.0.6.32.19990106134734.0334d260@ous.edu>
- Subject: [PATCH 5.005_02-MT2, 5.005_5x]VMS.C tweak for occasional system() error
- Branch: maint-5.005/perl
- ! vms/vms.c
+[ 5682] By: jhi on 2000/03/12 18:11:52
+ Log: update AVAILABILITY for LynxOS
+ Branch: cfgperl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 2577] By: gbarr on 1999/01/07 04:26:28
- Log: Another set of doc patches from Abigail
-
- From: abigail@fnx.com
- Message-ID: <19990107032132.20124.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRAIL2 lib/Net/hostent.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:21:32 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107032445.20178.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Net/netent.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:24:45 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107032834.20362.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRAIL2 lib/Term/Complete.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:28:34 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107033136.20440.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRAIL2 lib/Term/ReadLine.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:31:36 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107033351.20540.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Apache.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:33:51 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107033933.20707.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Push.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:39:33 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107034548.20936.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/File/Copy.pm] Typo fixes
- Date: Wed, 6 Jan 1999 22:45:48 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107034856.21056.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:48:56 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107035113.21174.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec/Mac.pm] Typo fixes
- Date: Wed, 6 Jan 1999 22:51:13 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107035612.21522.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigFloat.pm] Typo fix
- Date: Wed, 6 Jan 1999 22:56:12 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107035842.21585.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigInt.pm] Typo fixes
- Date: Wed, 6 Jan 1999 22:58:41 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107040644.22009.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Text/Wrap.pm] Typo fixes
- Date: Wed, 6 Jan 1999 23:06:44 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107040955.22087.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Array.pm] Typo fixes
- Date: Wed, 6 Jan 1999 23:09:55 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990107041136.22174.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Hash.pm] Typo fix
- Date: Wed, 6 Jan 1999 23:11:36 -0500 (EST)
- Branch: maint-5.005/perl
- ! lib/CGI/Apache.pm lib/CGI/Push.pm lib/File/Copy.pm
- ! lib/File/Spec.pm lib/File/Spec/Mac.pm lib/Math/BigFloat.pm
- ! lib/Math/BigInt.pm lib/Net/hostent.pm lib/Net/netent.pm
- ! lib/Term/Complete.pm lib/Term/ReadLine.pm lib/Text/Wrap.pm
- ! lib/Tie/Array.pm lib/Tie/Hash.pm
+[ 5681] By: jhi on 2000/03/12 18:03:46
+ Log: 64-bitness hints tweaks
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 2568] By: gbarr on 1999/01/06 03:13:15
- Log: From: jan.dubois@ibm.net (Jan Dubois)
- Date: Wed, 06 Jan 1999 01:24:09 +0100
- Message-ID: <3696aa85.18259325@smtp1.ibm.net>
- Subject: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
- Branch: maint-5.005/perl
- ! embed.h global.sym objXSUB.h objpp.h perl.c proto.h
- ! win32/GenCAPI.pl win32/makedef.pl
+[ 5680] By: jhi on 2000/03/12 17:49:25
+ Log: 64-bitness tweak: separate 64bitint and 64bitall.
+ Branch: cfgperl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 2567] By: gbarr on 1999/01/06 02:31:28
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Tue, 05 Jan 1999 16:47:31 -0800
- Message-Id: <3.0.6.32.19990105164731.00b5b2d0@ous.edu>
- Subject: [PATCH 5.005_03-MAINT_TRIAL_2]taint.c fix for VMS
- Branch: maint-5.005/perl
- ! taint.c
+[ 5679] By: jhi on 2000/03/12 17:43:09
+ Log: metaconfig-ify #5676.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! fflushall.U
____________________________________________________________________________
-[ 2566] By: gbarr on 1999/01/06 02:29:05
- Log: From: "W. Phillip Moore" <wpm@ms.com>
- Date: Tue, 5 Jan 1999 12:40:27 -0500 (EST)
- Message-ID: <13970.20107.190314.549471@zappa>
- Subject: [PATCH] POSIX getpgrp is not -w clean
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.pm
+[ 5678] By: jhi on 2000/03/12 17:37:14
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes Configure Todo lib/File/DosGlob.pm
____________________________________________________________________________
-[ 2565] By: gbarr on 1999/01/06 02:19:00
- Log: From: Slaven Rezic <eserte@cs.tu-berlin.de>
- Date: Mon, 4 Jan 1999 23:01:46 +0100 (CET)
- Message-Id: <199901042201.XAA01875@cabulja.herceg.de>
- Subject: FindBin.pm on Win32 systems
- Branch: maint-5.005/perl
- ! lib/FindBin.pm
+[ 5677] By: gsar on 2000/03/12 11:35:10
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ ! Changes Todo
+ !> Todo-5.6 perl.h pod/perldelta.pod
____________________________________________________________________________
-[ 2564] By: gbarr on 1999/01/06 02:13:23
- Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
- Date: Mon, 4 Jan 1999 13:34:58 -0800 (PST)
- Message-Id: <199901042134.NAA18852@spock.dis.cccd.edu>
- Subject: [PATCH 5.005_03-MAINT_TRIAL_2] t/op/sysio.t for MPE/iX
- Branch: maint-5.005/perl
- ! t/op/sysio.t
+[ 5676] By: gsar on 2000/03/12 11:27:38
+ Log: don't bother testing if we can flush all handles when fflush(stdin)
+ shows the pipe bug
+ Branch: perl
+ ! Configure
____________________________________________________________________________
-[ 2563] By: gbarr on 1999/01/06 02:03:44
- Log: From: Jarkko Hietaniemi <jhi@cc.hut.fi>
- Date: Mon, 4 Jan 1999 19:25:03 +0200 (EET)
- Message-Id: <199901041725.TAA30462@alpha.hut.fi>
- Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: undo untrue HP-UX 64-bitness (mostly harmless but misleading)
- Branch: maint-5.005/perl
- ! hints/hpux.sh
+[ 5675] By: jhi on 2000/03/12 05:08:29
+ Log: continue flogging the string->int conversion ifdefs
+ Branch: cfgperl
+ ! perl.h
____________________________________________________________________________
-[ 2562] By: gbarr on 1999/01/06 02:02:18
- Log: Jumbo doc patch from Abigail
-
- From: abigail@fnx.com
- Message-ID: <19990105170142.4889.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03-TRIAL2 lib/ExtUtils/Liblist.pm] pod fixes
- Date: Tue, 5 Jan 1999 12:01:42 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990105172855.5115.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Commands.pm] Typo fix.
- Date: Tue, 5 Jan 1999 12:28:55 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990105173808.5260.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH perl5.005_03 MAINT3 lib/ExtUtils/Embed.pm] Typo fix
- Date: Tue, 5 Jan 1999 12:38:08 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990105174859.5533.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Install.pm] Typo fix
- Date: Tue, 5 Jan 1999 12:48:59 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990105174947.5547.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 lib/ExtUtils/MM_Unix.pm] Typo fixes
- Date: Tue, 5 Jan 1999 12:49:46 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990105182301.5966.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 lib/ExtUtils/MakeMaker.pm] Typos fixes.
- Date: Tue, 5 Jan 1999 13:23:00 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990105183344.6065.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Manifest.pm] Typo fixes
- Date: Tue, 5 Jan 1999 13:33:44 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990105184028.6220.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Mksymlists.pm] Typo fix
- Date: Tue, 5 Jan 1999 13:40:28 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990106012015.9451.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/IO/Pipe.pm] Typo fixes.
- Date: Tue, 5 Jan 1999 20:20:15 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990106012047.9459.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRAIL2 lib/IO/Seekable.pm] Typo fixes
- Date: Tue, 5 Jan 1999 20:20:47 -0500 (EST)
-
- From: abigail@fnx.com
- Message-ID: <19990106012338.9536.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_03 TRIAL2 lib/IO/Socket.pm] Typo fix
- Date: Tue, 5 Jan 1999 20:23:38 -0500 (EST)
- Branch: maint-5.005/perl
- ! ext/IO/lib/IO/Pipe.pm ext/IO/lib/IO/Seekable.pm
- ! ext/IO/lib/IO/Socket.pm lib/ExtUtils/Command.pm
- ! lib/ExtUtils/Embed.pm lib/ExtUtils/Install.pm
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm
- ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Manifest.pm
- ! lib/ExtUtils/Mksymlists.pm
-____________________________________________________________________________
-[ 2560] By: gbarr on 1999/01/03 16:59:01
- Log: Trial release 2
- Branch: maint-5.005/perl
- ! Changes patchlevel.h
+[ 5674] By: gsar on 2000/03/12 05:01:30
+ Log: fix File::DosGlob for patterns with drive names like c:*.bat
+ (suggested by Jason Mathews <mathews@computer.org>)
+ Branch: perl
+ ! lib/File/DosGlob.pm
____________________________________________________________________________
-[ 2559] By: gbarr on 1999/01/02 15:37:35
- Log: From: Blair Zajac <bzajac@geostaff.com>
- Date: Wed, 23 Dec 1998 17:13:32 -0800
- Message-ID: <3681953C.8B6A90AA@geostaff.com>
- Subject: Tie::SubstrHash patch
- Branch: maint-5.005/perl
- ! lib/Tie/SubstrHash.pm
+[ 5673] By: jhi on 2000/03/12 04:48:14
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> doop.c perl.h pod/perldelta.pod pod/perldiag.pod
+ !> pod/perlpod.pod toke.c utils/perldoc.PL
____________________________________________________________________________
-[ 2558] By: gbarr on 1999/01/02 15:30:01
- Log: integrate change #2544
-
- From: Tim Bunce <Tim.Bunce@ig.co.uk>
- Subject: bug in pod2man search for perl binary [5.005_5x]
- Date: Sat, 12 Dec 1998 23:08:51 +0000
- Message-ID: <19981212230851.A20578@ig.co.uk>
- Branch: maint-5.005/perl
- !> pod/pod2man.PL
+[ 5672] By: gsar on 2000/03/12 03:57:23
+ Log: security fixes for perldoc (from Tom Christiansen)
+ Branch: perl
+ ! utils/perldoc.PL
____________________________________________________________________________
-[ 2557] By: gbarr on 1999/01/02 15:20:42
- Log: integrate change #2548
-
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- To: perl5-porters@perl.org
- cc: hv@crypt0.demon.co.uk
- Subject: [bug 5.004_54] duplicate error message
- Date: Thu, 31 Dec 1998 04:05:25 +0000
- Message-Id: <199812310405.EAA00386@crypt.compulink.co.uk>
-
- Message-ID: <13963.60672.134591.383377@alias-2.pr.mcs.net>
- From: Stephen McCamant <smccam@uclink4.berkeley.edu>
- To: hv@crypt0.demon.co.uk
- Cc: perl5-porters@perl.org
- Subject: [PATCH _54] Re: duplicate error message
- Date: Thu, 31 Dec 1998 16:10:13 -0600 (CST)
-
- Message-Id: <199901010732.HAA02926@crypt.compulink.co.uk>
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- To: Stephen McCamant <smccam@uclink4.berkeley.edu>
- cc: hv@crypt0.demon.co.uk, perl5-porters@perl.org
- Subject: [TEST PATCH _54] Re: duplicate error message
- Date: Fri, 01 Jan 1999 07:32:14 +0000
- Branch: maint-5.005/perl
- ! op.c t/pragma/warn-1global taint.c
+[ 5671] By: gsar on 2000/03/12 03:45:27
+ Log: Larry's patch to disallow CORE::Snark, with perldiag entry
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod toke.c
____________________________________________________________________________
-[ 2556] By: gbarr on 1999/01/02 15:18:58
- Log: From: abigail@fnx.com
- Date: Mon, 28 Dec 1998 14:16:12 -0500 (EST)
- Message-ID: <19981228191612.8380.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_02; lib/fields.pm] Typos in pod.
- Branch: maint-5.005/perl
- ! lib/fields.pm
+[ 5670] By: gsar on 2000/03/12 03:36:17
+ Log: insufficient buffer in change#5317
+ Branch: perl
+ ! doop.c
____________________________________________________________________________
-[ 2555] By: gbarr on 1999/01/02 15:11:45
- Log: intregrate change #2547
-
- From: Chris Nandor <pudge@pobox.com>
- Subject: Re: [PATCH] perlport.pod 1.38
- Date: Thu, 31 Dec 1998 09:06:48 -0500
- Message-Id: <v04020a1db2b1352ec92a@[192.168.0.77]>
- Branch: maint-5.005/perl
- !> pod/perlport.pod
+[ 5669] By: gsar on 2000/03/12 03:15:29
+ Log: avoid L<foo|bar> for now, not all the pod2foo support it
+ Branch: perl
+ ! pod/perlpod.pod
____________________________________________________________________________
-[ 2543] By: gbarr on 1998/12/31 06:17:13
- Log: integrated relevant parts og changes #2385 & #2387 from mainline
-
- various fixes for race conditions under threads: mutex locks based
- on PL_threadnum were seriously flawed, since it means more than one
- thread could enter the critical region; PL_na was global instead of
- thread-local; child thread could finish and free thr structures
- before Thread->new() got around to creating the Thread object;
- cv_clone() needed locking, as it mucks with PL_comppad and other
- global data; new_struct_thread() needed to lock template-thread's
- mutex while copying its data
-
- another threads reliability fix: serialize writes to thr->threadsv
- avoid most uses of PL_na (which is much more inefficient than a
- simple local); update docs to suit; PL_na now being thr->Tna may
- be a minor compatibility issue for extensions--will require dTHR
- outside of XSUBs (those get automatic dTHR)
- Branch: maint-5.005/perl
- ! XSUB.h djgpp/djgpp.c doio.c doop.c dump.c embedvar.h
- ! ext/DynaLoader/dl_next.xs ext/IO/IO.xs ext/Opcode/Opcode.xs
- ! ext/POSIX/POSIX.xs ext/Thread/Thread.xs ext/attrs/attrs.xs
- ! gv.c malloc.c mg.c objXSUB.h op.c os2/OS2/REXX/REXX.xs
- ! os2/os2.c perl.c perlvars.h perly.c perly.y pod/perlcall.pod
- ! pod/perlembed.pod pod/perlguts.pod pod/perlxs.pod pp.c pp.h
- ! pp_ctl.c pp_hot.c pp_sys.c run.c sv.c taint.c thread.h toke.c
- ! universal.c util.c vms/ext/Stdio/Stdio.xs vms/perly_c.vms
- ! vms/vms.c win32/win32.c win32/win32thread.c
-____________________________________________________________________________
-[ 2542] By: gbarr on 1998/12/30 14:46:40
- Log: doc updates
-
- From: abigail@fnx.com
- Date: Wed, 23 Dec 1998 22:32:07 -0500 (EST)
- Message-ID: <19981224033207.16751.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_02] Typo in documentation of pod2html.
-
- From: abigail@fnx.com
- Date: Wed, 23 Dec 1998 22:59:59 -0500 (EST)
- Message-ID: <19981224035959.16994.qmail@alexandra.wayne.fnx.com>
- Subject: [PATCH 5.005_02] Re: m// doc is buggy (was Re: m'$foo' is undocumented)
-
- pod/perldelta.pod from:
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Thu, 17 Dec 1998 16:13:34 +0200 (EET)
- Message-ID: <13945.4494.140163.973953@alpha.hut.fi>
- Subject: Re: important UNDOC issues for 5.005_54
- Branch: maint-5.005/perl
- ! pod/perldelta.pod pod/perlop.pod pod/pod2html.PL
+[ 5668] By: gsar on 2000/03/12 02:35:55
+ Log: rework change#5664
+ Branch: perl
+ ! perl.h
____________________________________________________________________________
-[ 2541] By: gbarr on 1998/12/30 14:37:14
- Log: From: jan.dubois@ibm.net (Jan Dubois)
- Date: Wed, 23 Dec 1998 21:26:38 +0100
- Message-ID: <36895086.8849224@smtp1.ibm.net>
- Subject: [PATCH 5.005_03m1] subdirectory Makefiles should inherit CAPI setting from command line
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MakeMaker.pm
+[ 5667] By: jhi on 2000/03/11 21:35:29
+ Log: todo and perldelta updates
+ Branch: cfgperl
+ ! Todo Todo-5.6 pod/perldelta.pod
____________________________________________________________________________
-[ 2538] By: gbarr on 1998/12/29 14:41:29
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 22 Dec 1998 10:57:48 +0200 (EET)
- Message-ID: <13951.24332.932827.831376@alpha.hut.fi>
- Subject: Re: x operator broken in DEC Alpha for 8-bit characters (Re: Digest-MD5-2.00 test fails on DEC Alpha - a patch)
- Branch: maint-5.005/perl
- ! t/op/repeat.t util.c
+[ 5666] By: jhi on 2000/03/11 21:00:34
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> perl.h
____________________________________________________________________________
-[ 2535] By: gbarr on 1998/12/29 14:27:56
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Fri, 18 Dec 1998 16:39:27 +0200 (EET)
- Message-ID: <13946.26911.140905.387070@alpha.hut.fi>
- Subject: Math::Trig, Math::Complex, Fcntl, addressed (Re: Undocumentation Issues for 5.005)
- Branch: maint-5.005/perl
- ! pod/perldelta.pod
+[ 5665] By: jhi on 2000/03/11 20:58:58
+ Log: Fixes for #5661.
+ Branch: cfgperl
+ ! perl.h
____________________________________________________________________________
-[ 2534] By: gbarr on 1998/12/29 14:23:02
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 15 Dec 1998 17:52:32 +0200 (EET)
- Message-ID: <13942.34240.66558.169330@alpha.hut.fi>
- Subject: some doc link fixes
- Branch: maint-5.005/perl
- ! pod/perlcall.pod pod/perldata.pod pod/perldiag.pod
- ! pod/perlfaq5.pod pod/perlfaq7.pod pod/perlfunc.pod
- ! pod/perlguts.pod pod/perllocale.pod pod/perlobj.pod
- ! pod/perlsub.pod pod/perlvar.pod
+[ 5664] By: gsar on 2000/03/11 19:50:06
+ Log: fix Strtoul() misdefinition is change#5661
+ Branch: perl
+ ! perl.h
____________________________________________________________________________
-[ 2533] By: gbarr on 1998/12/29 14:23:00
- Log: From: Chris Nandor <pudge@pobox.com>
- Date: Sat, 19 Dec 1998 12:54:34 -0500
- Message-Id: <v04020a03b2a194aaa676@[192.168.0.77]>
- Subject: [PATCH] perlport.pod v1.37
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 5663] By: gsar on 2000/03/11 19:21:18
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> Configure config_h.SH hints/solaris_2.sh perl.h
+ !> t/pragma/warn/pp_hot toke.c
____________________________________________________________________________
-[ 2531] By: gbarr on 1998/12/29 14:12:25
- Log: change in_pod pattern to /^=\w/ from /^=/
- From: Frank Ridderbusch <Frank.Ridderbusch@pdb.siemens.de>
- Date: Tue, 15 Dec 1998 16:23:12 +0100 (MET)
- Message-ID: <13942.32480.700000.640927@utensil>
- Subject: Minor Bug in AutoSplit.qm in 5.005 and 5.004
- Branch: maint-5.005/perl
- ! lib/AutoSplit.pm
+[ 5662] By: jhi on 2000/03/11 19:06:20
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> cop.h perl.c pp_ctl.c t/op/eval.t t/op/misc.t
____________________________________________________________________________
-[ 2530] By: gbarr on 1998/12/29 14:09:51
- Log: undo the "perlsyn intrusion" into perlfunc
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5661] By: jhi on 2000/03/11 19:03:32
+ Log: Use Atof() instead of bare strtod(); ditto for Atol()/Atoul()
+ (introduce the latter) instead of bare strtoll()/strtoll().
+ Branch: cfgperl
+ ! perl.h toke.c
____________________________________________________________________________
-[ 2529] By: gbarr on 1998/12/29 14:04:35
- Log: From: Jarkko Hietaniemi <hietanie@koah.research.nokia.com>
- Date: Sun, 13 Dec 1998 14:54:56 +0200 (EET)
- Message-Id: <199812131254.OAA24494@koah.research.nokia.com>
- Subject: ignore_versioned_libs isn't used anywhere (it became ignore_versioned_solibs)
- Branch: maint-5.005/perl
- ! hints/linux.sh
+[ 5660] By: gsar on 2000/03/11 18:40:49
+ Log: another long-standing eval bug: return doesn't reset $@ correctly
+ Branch: perl
+ ! pp_ctl.c t/op/eval.t
____________________________________________________________________________
-[ 2528] By: gbarr on 1998/12/29 13:59:49
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 28 Oct 1998 01:20:33 -0500 (EST)
- Message-Id: <199810280620.BAA06893@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.00552] Make sort respect overloading
- Branch: maint-5.005/perl
- ! pp_ctl.c t/pragma/overload.t
+[ 5659] By: jhi on 2000/03/11 18:27:54
+ Log: metaconfig-ify the test for broken fflush(NULL)
+ (which ails e.g. Solaris), from Ulrich Pfeifer.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/solaris_2.sh
+ Branch: metaconfig/U/perl
+ ! d_unorderedl.U fflushall.U
____________________________________________________________________________
-[ 2527] By: gbarr on 1998/12/29 13:58:56
- Log: doc update, quads only work on 64-but platforms
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5658] By: gsar on 2000/03/11 18:11:22
+ Log: change#3511 was not defensive enough about try blocks, causing
+ bogus attempts to free closures, and thence, segfaults
+ Branch: perl
+ ! cop.h perl.c pp_ctl.c t/op/misc.t
____________________________________________________________________________
-[ 2526] By: gbarr on 1998/12/29 13:49:55
- Log: From: Andy Dougherty <doughera@lafayette.edu>
- Date: Tue, 1 Dec 1998 12:50:27 -0500 (EST)
- Message-Id: <Pine.SUN.3.96.981201124929.4288H-100000@newton.phys>
- Subject: [PATCH 5.005_xx] erroneous 'none' in lddlflags
- Branch: maint-5.005/perl
- ! Configure
+[ 5657] By: jhi on 2000/03/11 18:04:44
+ Log: Rewording.
+ Branch: cfgperl
+ ! t/pragma/warn/pp_hot
____________________________________________________________________________
-[ 2512] By: gbarr on 1998/12/28 14:56:36
- Log: change t/op/pwent.t to ignore NIS includes
- From: achampio@lehman.com (Alan Champion)
- Date: Tue, 1 Dec 1998 15:18:03 GMT
- Message-Id: <9812011518.AA00005@lonhpov1.lehman.com>
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on sun4-solaris 2.3 (UNINSTALLED)
-
- From: pvhp@forte.com (Peter Prymmer)
- Date: Fri, 4 Dec 98 17:11:41 PST
- Message-Id: <9812050111.AA16778@forte.com>
- Subject: [PATCH 5.005_03-MAINT_TRIAL_1 && 5.005_54]dumper and searchdict ebcdic style
- Branch: maint-5.005/perl
- ! t/lib/dumper.t t/lib/searchdict.t t/op/pwent.t
+[ 5656] By: jhi on 2000/03/11 17:41:29
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 27 files)
____________________________________________________________________________
-[ 2511] By: gbarr on 1998/12/28 14:55:28
- Log: From: jan.dubois@ibm.net (Jan Dubois)
- Date: Tue, 01 Dec 1998 00:07:33 +0100
- Message-ID: <366921b5.14512598@smtp1.ibm.net>
- Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] to compile on Win32
-
- From: jan.dubois@ibm.net (Jan Dubois)
- Date: Wed, 02 Dec 1998 00:24:54 +0100
- Message-ID: <366a77bb.19498126@smtp1.ibm.net>
- Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] spaces in filenames support
- Branch: maint-5.005/perl
- ! perl.h proto.h taint.c win32/GenCAPI.pl win32/Makefile
- ! win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_sh.PL win32/makedef.pl
+[ 5655] By: gsar on 2000/03/11 17:06:03
+ Log: reword comment
+ Branch: perl
+ ! t/pragma/warn/pp_hot
____________________________________________________________________________
-[ 2510] By: gbarr on 1998/12/28 14:37:35
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 1 Dec 1998 00:34:08 -0500 (EST)
- Message-Id: <199812010534.AAA21371@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Debugger 'v' command
- Branch: maint-5.005/perl
- ! lib/perl5db.pl
+[ 5654] By: gsar on 2000/03/11 17:01:47
+ Log: off-by-one in os2.c (from Ilya Zakharevich)
+ Branch: perl
+ ! os2/os2.c
____________________________________________________________________________
-[ 2478] By: gbarr on 1998/12/13 16:02:24
- Log: From: pvhp@forte.com (Peter Prymmer)
- Date: Mon, 30 Nov 98 21:08:36 PST
- Message-Id: <9812010508.AA07791@forte.com>
- Subject: [PATCH 5.005_03t1 && 5.005_54]dll linkage side decks for OS/390
- Branch: maint-5.005/perl
- ! hints/os390.sh
+[ 5653] By: gsar on 2000/03/11 16:59:48
+ Log: File::Spec::VMS fixups, *not tested* on VMS (from Barrie Slaymaker)
+ Branch: perl
+ ! lib/File/Spec/VMS.pm t/lib/filespec.t
____________________________________________________________________________
-[ 2477] By: gbarr on 1998/12/13 16:00:23
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Mon, 30 Nov 1998 17:08:12 -0800
- Message-Id: <3.0.6.32.19981130170812.00b12b70@ous.edu>
- Subject: [PATCH 5.005_03]Minor VMS patches needed to build
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MM_VMS.pm vms/subconfigure.com
+[ 5652] By: gsar on 2000/03/11 16:52:03
+ Log: missing export list entry in change#5619
+ Branch: perl
+ ! makedef.pl
____________________________________________________________________________
-[ 2476] By: gbarr on 1998/12/13 15:30:58
- Log: From: pvhp@forte.com (Peter Prymmer)
- Date: Fri, 4 Dec 98 00:37:32 PST
- Message-Id: <9812040837.AA10908@forte.com>
- Subject: Re: [PATCH 5.005_03-MAINT-TRIAL1] some tweaks to the build process for OS/390
- Branch: maint-5.005/perl
- ! Makefile.SH regcomp.c
+[ 5651] By: gsar on 2000/03/11 16:50:05
+ Log: avoid using context pointer in MUTEX_INIT() et al; remove the
+ *_NOCONTEXT variants to keep it simple
+ Branch: perl
+ ! malloc.c thread.h win32/win32thread.h
____________________________________________________________________________
-[ 2472] By: gbarr on 1998/12/12 17:12:28
- Log: undo changes to Exporter.pm from #2312
- Branch: maint-5.005/perl
- ! lib/Exporter.pm
+[ 5650] By: gsar on 2000/03/11 16:07:35
+ Log: remove =for section (from Johan Vromans)
+ Branch: perl
+ ! lib/Getopt/Long.pm
____________________________________________________________________________
-[ 2471] By: gbarr on 1998/12/12 17:09:39
- Log: integrate change#2459 from cfgperl
-
- enclose case want_vtbl_collxfrm with #ifdef USE_LOCALE_COLLATE
-
- From: hansm@icgroup.nl
- Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on OPENSTEP-Mach 4_1 (UNINSTALLED)
- Date: Sun, 6 Dec 98 22:19:54 +0100
- Message-Id: <9812062116.AA26445@icgned.icgroup.nl>
- Branch: maint-5.005/perl
- ! util.c
+[ 5649] By: gsar on 2000/03/11 16:05:50
+ Log: add nokfile target in Makefile (from Andy Dougherty)
+ Branch: perl
+ ! Makefile.SH
____________________________________________________________________________
-[ 2470] By: gbarr on 1998/12/12 16:46:03
- Log: re-sync'd Text::Wrap with new version from CPAN
- Branch: maint-5.005/perl
- +> t/lib/textfill.t
- ! MANIFEST
- !> lib/Text/Wrap.pm t/lib/textwrap.t
+[ 5648] By: gsar on 2000/03/11 16:02:53
+ Log: mention podchecker (from Tim Jenness <timj@jach.hawaii.edu>)
+ Branch: perl
+ ! pod/perlpod.pod
____________________________________________________________________________
-[ 2469] By: gbarr on 1998/12/12 15:58:43
- Log: integrate changes#2435,2436 from cfgperl
-
- Pod::Html and Pod::Text were not locale-savvy:
- for example in =head1 all non-ASCII-\w-runs were
- turned into underscores in NAME tags. This could
- result in several NAME tags becoming identical.
- Reported by:
-
- From: Fyodor Krasnov <fyodor@aha.ru>
- Subject: pod2html vs Russian Characters
- To: Tom.Christiansen@snn.aha.ru, tchrist@perl.com
- Date: Tue, 24 Nov 1998 19:00:36 +0300 (MSK)
- Message-Id: <199811241600.TAA05149@stat.aha.ru>
-
- One paste too many in #2435.
- Branch: maint-5.005/perl
- !> lib/Pod/Html.pm lib/Pod/Text.pm
+[ 5647] By: gsar on 2000/03/11 16:01:03
+ Log: VMS build tweaks (from Charles Bailey)
+ Branch: perl
+ ! configure.com perl.c t/pragma/warn/doio t/pragma/warn/util
+ ! vms/subconfigure.com
____________________________________________________________________________
-[ 2468] By: gbarr on 1998/12/12 15:01:58
- Log: redirect trail program to error msg file in Configure
-
- From: Andy Dougherty <doughera@lafayette.edu>
- Date: Tue, 1 Dec 1998 13:40:12 -0500 (EST)
- Message-Id: <Pine.SUN.3.96.981201133546.4288K-100000@newton.phys>
- Subject: [PATCH 5.005_xx] Missing redirection of simple test program
- Branch: maint-5.005/perl
- ! Configure
+[ 5646] By: gsar on 2000/03/11 10:13:27
+ Log: remove outdated ftp.cis.ufl.edu reference
+ Branch: perl
+ ! pod/perlfaq2.pod
____________________________________________________________________________
-[ 2467] By: gbarr on 1998/12/12 14:52:24
- Log: Change reall_srchlen back to an int from a #define
-
- From: Graham Barr <gbarr@ti.com>
- Date: Mon, 30 Nov 1998 14:29:14 -0600
- Message-ID: <19981130142914.X1504@asic.sc.ti.com>
- Subject: [PATCH 5.005_03-MT!] Re: one compilation warning from 5_03-MT1
- Branch: maint-5.005/perl
- ! malloc.c
+[ 5645] By: gsar on 2000/03/11 10:10:39
+ Log: failed hunk in change#5644
+ Branch: perl
+ ! t/op/pat.t
____________________________________________________________________________
-[ 2466] By: gbarr on 1998/12/12 14:40:56
- Log: s/SCM_CREDENTIALSS/SCM_CREDENTIALs/ in Socket.xs
-
- From: Andy Dougherty <doughera@lafayette.edu>
- Date: Thu, 3 Dec 1998 11:26:25 -0500 (EST)
- Message-Id: <Pine.SUN.3.96.981203112330.8800H-100000@newton.phys>
- Subject: [PATCH 5.005_03-MAINT_TRIAL_1] Trivial grammar patch
- Branch: maint-5.005/perl
- ! Porting/Glossary
- !> ext/Socket/Socket.xs
+[ 5644] By: gsar on 2000/03/11 10:08:47
+ Log: fix optimizer bug in /^(?p{"a"})b/ (from Ilya Zakharevich)
+ Branch: perl
+ ! regcomp.c t/op/pat.t
____________________________________________________________________________
-[ 2456] By: gsar on 1998/12/06 13:49:02
- Log: branch perldelta.pod
- Branch: maint-5.005/perl
- +> pod/perldelta.pod
+[ 5643] By: gsar on 2000/03/11 09:48:30
+ Log: better {local,gm}time documentation (from Mark-Jason Dominus)
+ Branch: perl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 2455] By: gsar on 1998/12/06 13:47:21
- Log: clobber perldelta.pod to reestablish branch from perl5005delta.pod
- Branch: maint-5.005/perl
- - pod/perldelta.pod
+[ 5642] By: gsar on 2000/03/11 09:45:10
+ Log: tweaks for lynxos build (from Ed Mooring <mooring@lynx.com>)
+ Branch: perl
+ ! doio.c hints/lynxos.sh perl.h
____________________________________________________________________________
-[ 2415] By: gbarr on 1998/11/30 02:31:15
- Log: Chnages,patchlevel.h etc...
- Branch: maint-5.005/perl
- ! Changes MANIFEST patchlevel.h t/op/tr.t win32/Makefile
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/makefile.mk
+[ 5641] By: gsar on 2000/03/11 09:42:56
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> Configure Todo-5.6 config_h.SH hints/irix_6.sh
+ !> lib/Math/Complex.pm regcomp.c t/op/64bit.t
____________________________________________________________________________
-[ 2411] By: gbarr on 1998/11/30 01:31:22
- Log: integrated changes#2323,2353,2369
-
- From: maeda@src.ricoh.co.jp
- Date: Tue, 24 Nov 1998 10:37:45 +0900
- Message-Id: <199811240137.KAA05867@luna.src.ricoh.co.jp>
- Subject: format "..." bug
-
- Locale collation, ctype, and numeric, were initialized wrong
- (if LC_ALL or LANG were unset, so were the collation/ctype/numeric),
- as reported by
-
- From: Ilya.Sandler@etak.com (Ilya Sandler)
- Subject: a bug in locale handling: LC_COLLATE ignored sometimes
- Date: 25 Nov 1998 04:53:52 +0200
- Message-ID: <MLIST_199811250226.SAA12590@axi001.etak.sw>
-
- allow final period in a file (not followed by a newline) to
- terminate format spec
- Branch: maint-5.005/perl
- ! pp_ctl.c toke.c util.c
- !> t/op/write.t
+[ 5640] By: gsar on 2000/03/11 09:24:30
+ Log: perldelta update, typos and whitespace adjustments
+ Branch: perl
+ ! lib/open.pm miniperlmain.c pod/perldelta.pod win32/perllib.c
____________________________________________________________________________
-[ 2408] By: gbarr on 1998/11/30 01:29:19
- Log: integrated ext/B/... changes from mainline
- Branch: maint-5.005/perl
- !> ext/B/B.pm ext/B/B.xs ext/B/B/Assembler.pm ext/B/B/C.pm
- !> ext/B/B/Disassembler.pm
+[ 5639] By: jhi on 2000/03/11 00:51:48
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 44 files)
____________________________________________________________________________
-[ 2404] By: gbarr on 1998/11/30 00:26:36
- Log: integrate some of change#2318 from mainline
- Branch: maint-5.005/perl
- +> t/op/grent.t t/op/pwent.t
- !> ext/DB_File/Changes ext/DB_File/DB_File.pm
- !> ext/DB_File/DB_File.xs ext/POSIX/hints/dynixptx.pl
- !> ext/Socket/Socket.pm ext/Socket/Socket.xs lib/Benchmark.pm
- !> pod/perldata.pod t/op/sort.t
+[ 5638] By: jhi on 2000/03/11 00:45:46
+ Log: Cpp out deadcode that IRIX compiler noticed.
+ Branch: cfgperl
+ ! regcomp.c
____________________________________________________________________________
-[ 2398] By: gbarr on 1998/11/29 22:11:16
- Log: integrate changes#2254,2259,2335,2345,2348,2361,2368,2380 from mainline
-
- win32_recvfrom() compatibility fix
-
- From: "Kurt D. Starsinic" <kstar@chapin.edu>
- Subject: Re: [PATCH] Re: pod2man bug in date generated line
- To: Albert Dvornik <bert@genscan.com>, "Larry W. Virden" <lvirden@cas.org>
- Cc: perlbug@perl.com
- Date: 20 Nov 1998 21:30:17 +0200
- Message-ID: <MLIST_19981120131523.A464@O2.chapin.edu>
-
- make $1 et al readonly under threads; make C<undef $1> fail like
- C<$1 = undef> does
-
- fix typo in pp_defined() causing C<defined %tied> to fail
-
- more conservative version of changes#2345,2346,2347; those break
- C<defined(@{"foo::ISA"})> which seems to be extensively used in
- the libs :-(
-
- fix uninitialized warnings
- From: Brian Callaghan <callagh@itginc.com>
- Date: Thu, 19 Nov 1998 17:49:10 -0800
- Message-Id: <3654CA96.B64FCAEB@itginc.com>
- Subject: Complete.pm patch (version 1.1)
-
- Liblist tweak suggested by Swen Thuemmler <Swen.Thuemmler@paderlinx.de>;
- add C<$Config{installarchlib}/CORE> to the default locations searched
- on win32
-
- prefer IO::Handle for IO if FileHandle:: is empty (as suggested by
- Tim Bunce)
- Branch: maint-5.005/perl
- ! gv.c op.c pp.c
- !> lib/ExtUtils/Liblist.pm lib/Term/Complete.pm pod/perlfaq4.pod
- !> pod/pod2man.PL t/op/undef.t win32/win32sck.c
+[ 5637] By: jhi on 2000/03/10 14:22:24
+ Log: Do not use Perl's malloc in IRIX.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 5636] By: jhi on 2000/03/10 05:27:03
+ Log: More/modified unused floating point units.
+ Branch: metaconfig/U/perl
+ + d_fp_class_l.U d_unordered.U d_unorderedl.U
+ ! d_fpclass.U
+____________________________________________________________________________
+[ 5635] By: jhi on 2000/03/10 01:54:07
+ Log: Add various yet-unused units.
+ Branch: metaconfig/U/perl
+ + d_class.U d_fchdir.U d_finite.U d_fp_class.U d_fp_classl.U
+ + d_fpclass.U d_fpclassify.U d_frexpl.U d_futimes.U
+ + d_getitimer.U d_getrlimit.U d_iconv.U d_isfinite.U d_isinf.U
+ + d_isnan.U d_isnanl.U d_lchmod.U d_lutimes.U d_setitimer.U
+ + d_setrlimit.U d_ualarm.U d_utimes.U
+____________________________________________________________________________
+[ 5634] By: jhi on 2000/03/10 01:07:54
+ Log: Fix goofups noticed by Mark Bixby and Jeff Okamoto.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/compline/nblock_io.U
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 5633] By: jhi on 2000/03/09 23:22:33
+ Log: Remove an obsolete note.
+ Branch: cfgperl
+ ! t/op/64bit.t
____________________________________________________________________________
-[ 2315] By: gbarr on 1998/11/27 05:16:50
- Log: integrate change#2246 from mainline, while still allowing
- C<sort $globref @foo>
-
- allow C<sort $coderef @foo>
- Branch: maint-5.005/perl
- ! op.c sv.c
- !> t/op/sort.t
+[ 5632] By: gsar on 2000/03/09 18:50:43
+ Log: update Changes
+ Branch: perl
+ ! Changes
____________________________________________________________________________
-[ 2314] By: gbarr on 1998/11/27 04:03:58
- Log: integrate change#2159 from mainline
-
- Data::Dumper update
- Branch: maint-5.005/perl
- !> ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
- !> ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Todo t/lib/dumper.t
+[ 5631] By: gsar on 2000/03/09 18:49:12
+ Log: track more of the child state on Windows
+ Branch: perl
+ ! win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 2313] By: gbarr on 1998/11/27 03:04:21
- Log: Fix typo in change#2312
- Branch: maint-5.005/perl
- ! ext/Thread/Thread.xs
+[ 5630] By: gsar on 2000/03/09 18:48:05
+ Log: UNIVERSAL::isa() and UNIVERSAL::can() fail for magic values
+ Branch: perl
+ ! universal.c
____________________________________________________________________________
-[ 2312] By: gbarr on 1998/11/27 03:03:03
- Log: integrate change#1837,1967,1986,2060,2068,2146,2214,2224,2300,2301 from mainline
-
- (via private mail)
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- Date: Sat, 05 Sep 1998 01:23:58 -0400 (EDT)
- Message-id: <01J1FH7R43NS002F14@cor.newman.upenn.edu>
- Subject: [Patch 5.005_02] Miscellaneous VMS cleanup
-
- correct bugs exposed in MM_Unix.pm by commenting out Selfloader
- (MAN3PODS cannot be set to ' '; stray stricture violation)
-
- qualify names of builtins
-
- handle '::' in section names properly
- From: Graham Barr <gbarr@pobox.com>
- Date: Sat, 17 Oct 1998 12:57:54 -0500
- Message-ID: <19981017125754.C510@pobox.com>
- Subject: Re: pod2html
-
- From: Zachary Miller <zcmiller@simon.er.usgs.gov>
- Date: Tue, 20 Oct 1998 20:52:20 -0500
- Message-Id: <199810210152.UAA07792@simon.er.usgs.gov>
- Subject: Exporter.pm's export_to_level() argument handling buggy
-
- hand-apply whitespace-mutiliated patch
- From: "vishal bhatia" <vishalb@hotmail.com>
- Date: Wed, 28 Oct 1998 23:45:32 PST
- Message-ID: <19981029074534.2334.qmail@hotmail.com>
- Subject: [PATCH 5.005_52]Compiling modules,more bugfixes for B
-
- typo in newHVhv()
-
- avoid endless loops in Text::Wrap (from a suggestion by Lupe
- Christoph <lupe@alanya.m.isar.de>)
-
- properly free temporaries created by threads
-
- fix PL_defoutgv leak under threads
- Branch: maint-5.005/perl
- !> (integrate 31 files)
+[ 5629] By: gsar on 2000/03/09 18:37:35
+ Log: tweak Unicode notes, other cleanups
+ Branch: perl
+ ! Changes lib/bytes.pm lib/utf8.pm pod/perldelta.pod
+ ! pod/perlhist.pod pod/perlunicode.pod
____________________________________________________________________________
-[ 2311] By: gbarr on 1998/11/27 01:31:36
- Log: integrate change#2210 from mainline
-
- fix AvREALISH bogusness
- Branch: maint-5.005/perl
- ! av.c
- !> t/op/array.t
+[ 5628] By: gsar on 2000/03/09 17:39:58
+ Log: support binmode(F,":crlf") and use open IN => ":raw", OUT => ":crlf"
+ semantics; the pragma sets defaults for both open() and qx//
+ Branch: perl
+ ! doio.c dosish.h embed.h embed.pl epoc/epocish.h lib/open.pm
+ ! mpeix/mpeixish.h op.c op.h opcode.h opcode.pl os2/os2ish.h
+ ! perl.h perlapi.c plan9/plan9ish.h pod/perlfunc.pod pp.sym
+ ! pp_proto.h pp_sys.c proto.h sv.h vms/vmsish.h vos/vosish.h
____________________________________________________________________________
-[ 2310] By: gbarr on 1998/11/27 00:20:21
- Log: integrate changes#2235,2299,2300 from mainline
-
- catch a neophyte trap: open(<FH>), close(<FH>) etc.
-
- fix C<if (...) { package Foo; ... }> misoptimization that fails
- to set the package for the block properly
-
- properly free temporaries created by threads
- Branch: maint-5.005/perl
- ! ext/Thread/Thread.xs op.c perl.h util.c
- !> t/comp/package.t
+[ 5627] By: gsar on 2000/03/09 12:54:08
+ Log: avoid autoflushing behavior of fork/system/exec on Solaris (thanks
+ to fflush(NULL) bug)
+ Branch: perl
+ ! hints/solaris_2.sh pod/perldelta.pod
____________________________________________________________________________
-[ 2309] By: gbarr on 1998/11/27 00:16:36
- Log: integrate change#2298 from mainline
- Branch: maint-5.005/perl
- !> universal.c
+[ 5626] By: gsar on 2000/03/09 11:34:51
+ Log: abort build on HP-UX if bundled non-ANSI compiler is detected
+ (from Dominic Dunlop <domo@computer.org>)
+ Branch: perl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 2308] By: gbarr on 1998/11/27 00:11:44
- Log: Updates for MPE/iX DynaLoader and installperl, via private mail
- forwarded by Jarkko Hietaniemi from Mark Bixby
- Branch: maint-5.005/perl
- ! ext/DynaLoader/dl_mpeix.xs installperl
+[ 5625] By: gsar on 2000/03/09 11:17:07
+ Log: patch from Larry to make -T filetest algorithm recognize utf8 as
+ "text"
+ Branch: perl
+ ! pp_sys.c
____________________________________________________________________________
-[ 2307] By: gbarr on 1998/11/27 00:07:27
- Log: Remove docs for feature not in _0*
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5624] By: gsar on 2000/03/09 11:11:59
+ Log: provide support for deleting actions etc. (from Ronald J Kimball
+ <rjk@linguist.dartmouth.edu>)
+ Branch: perl
+ ! lib/perl5db.pl pod/perldebug.pod
____________________________________________________________________________
-[ 2306] By: gbarr on 1998/11/26 23:44:47
- Log: Allow PL_FILES to have multiple targets from one source by allowing
- an array ref as the value in the hash
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
- ! lib/ExtUtils/MakeMaker.pm
+[ 5623] By: gsar on 2000/03/09 06:39:21
+ Log: new xsubpp keywords should be in all caps
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 2305] By: gbarr on 1998/11/26 23:38:06
- Log: fix unsigned variables to use SvUV and sv_setuv
- Branch: maint-5.005/perl
- ! lib/ExtUtils/typemap
+[ 5622] By: gsar on 2000/03/09 06:26:04
+ Log: demand-load utf8.pm in swash routines
+ Branch: perl
+ ! op.c utf8.c
____________________________________________________________________________
-[ 2304] By: gbarr on 1998/11/26 23:36:17
- Log: Fix embeded \n in ABSTRACT and <> in AUTHOR
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MM_Unix.pm
+[ 5621] By: gsar on 2000/03/08 19:27:02
+ Log: make Dump() call the XSUB implementation transparently (modified
+ version of patch suggested by David Boyce <dsb@world.std.com>)
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.pm ext/Data/Dumper/Dumper.xs
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 2302] By: gbarr on 1998/11/26 15:27:03
- Log: integrate changes#2177,2189,2228,2229 from cfgperl
-
- 0**0 = 1, from
-
- From: d-lewart@uiuc.edu (Daniel S. Lewart)
- Subject: Math::Complex 0**0 patches
- Date: Sun, 1 Nov 1998 19:21:48 -0600 (CST)
- Message-Id: <199811020121.TAA28310@staff2.cso.uiuc.edu>
-
- sysio.t failure: fix undefined order of evaluation, from
-
- From: Spider Boardman <spider@web.zk3.dec.com>
- Subject: Not OK: perl 5.00553 on alpha-thread 5.0 [PATCH]
- Date: 4 Nov 1998 01:22:30 +0200
- Message-ID: <MLIST_199811032227.RAA143892@web.zk3.dec.com>
-
- From: "Martin J. Bligh" <mbligh@sequent.com>
- Message-ID: <187803647.910720870@w-186d219.rhe.sequent.com>
- Subject: Re: Making Perl work on DYNIX/ptx
- Date: Tue, 10 Nov 1998 18:01:10 -0800
-
- From: "Martin J. Bligh" <mbligh@sequent.com>
- Subject: Re: Making Perl work on DYNIX/ptx
- Date: Tue, 10 Nov 1998 16:24:26 -0800
- Message-ID: <181999655.910715066@w-186d219.rhe.sequent.com>
- Branch: maint-5.005/perl
- +> ext/DB_File/hints/dynixptx.pl ext/POSIX/hints/dynixptx.pl
- ! pp_sys.c
- !> hints/dynixptx.sh lib/Math/Complex.pm t/lib/complex.t
+[ 5620] By: gsar on 2000/03/08 18:35:48
+ Log: do FILE should not see outside lexicals (from Rick Delaney
+ <rick@consumercontact.com>)
+ Branch: perl
+ ! op.c pp_ctl.c t/comp/require.t
____________________________________________________________________________
-[ 2297] By: gbarr on 1998/11/24 02:32:38
- Log: integrate change#2266 from cfgperl
- From: John Tobey <jtobey@channel1.com>
- Subject: [PATCH] perlfaq typos
- To: perl5-porters@perl.com
- Date: 22 Nov 1998 04:25:15 +0200
- Message-ID: <MLIST_m0zhPeF-000FOgC@feynman.localnet>
- Branch: maint-5.005/perl
- !> pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- !> pod/perlfaq7.pod pod/perlfaq8.pod
+[ 5619] By: gsar on 2000/03/08 18:04:45
+ Log: abstract code for C<use Foo 1.23 @ary;> into a Perl_load_module()
+ API function
+ Branch: perl
+ ! doio.c embed.h embed.pl global.sym objXSUB.h op.c op.h
+ ! perlapi.c pp_sys.c proto.h
____________________________________________________________________________
-[ 2296] By: gbarr on 1998/11/24 01:39:18
- Log: integrated changes#2011,2092,2106,2108,2143 from cfgperl
-
- More robust yacc/bison failure output handling.
-
- More robustness.
-
- Bison says 'parse error', not 'parser error'.
-
- The "parse error" must be converted to "syntax error",
- just matching it aint' enough.
-
- There can be multiple yacc/bison errors.
- Branch: maint-5.005/perl
- !> t/comp/require.t t/op/misc.t t/pragma/subs.t
- !> t/pragma/warning.t
+[ 5618] By: jhi on 2000/03/08 18:03:30
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/Pod/Plainer.pm
+ !> Changes MANIFEST dosish.h embedvar.h lib/Pod/InputObjects.pm
+ !> lib/Pod/Parser.pm makedef.pl op.c op.h perl.c perlapi.h
+ !> perlvars.h pod/perlop.pod pod/pod2latex.PL sv.c unixish.h
+ !> vms/vmsish.h
+____________________________________________________________________________
+[ 5617] By: jhi on 2000/03/08 15:44:05
+ Log: ICU todo fixes.
+ Branch: cfgperl
+ ! Todo-5.6
____________________________________________________________________________
-[ 2295] By: gbarr on 1998/11/24 00:49:28
- Log: integrate change#1823 from mainline
- From: Joe Buehler <jhpb@hekimian.com>
- Date: 29 Aug 1998 17:13:28 -0400
- Message-ID: <yd37lzro5jb.fsf@pandora.hekimian.com>
- Subject: patches for perl 5.005_51 under U/WIN
- Branch: maint-5.005/perl
- +> hints/uwin.sh
- ! Configure
- !> installman makedepend.SH t/lib/posix.t
+[ 5616] By: jhi on 2000/03/08 14:30:40
+ Log: Even more Todo.
+ Branch: cfgperl
+ ! Todo-5.6
____________________________________________________________________________
-[ 2258] By: gbarr on 1998/11/21 20:48:02
- Log: Another Configure patch from Jarkko
- Branch: maint-5.005/perl
- ! Configure
+[ 5615] By: jhi on 2000/03/08 14:13:45
+ Log: More Todo.
+ Branch: cfgperl
+ ! Todo-5.6
____________________________________________________________________________
-[ 2257] By: gbarr on 1998/11/21 17:23:13
- Log: Big Configure patch from Jarkko Hietaniemi <jhi@iki.fi> via
- private mail
- Branch: maint-5.005/perl
- ! Configure Makefile.SH config_h.SH hints/dec_osf.sh
- ! hints/freebsd.sh hints/irix_6.sh hints/linux.sh
- ! hints/next_3.sh hints/os390.sh pp_sys.c
+[ 5614] By: jhi on 2000/03/08 13:50:53
+ Log: wording changes
+ Branch: cfgperl
+ ! lib/Math/Complex.pm
____________________________________________________________________________
-[ 2239] By: gbarr on 1998/11/14 03:59:58
- Log: more doc changes from mainline
- Branch: maint-5.005/perl
- ! pod/perldiag.pod pod/perlfunc.pod pod/perlre.pod
- !> INSTALL README.vms vms/ext/Stdio/Stdio.pm
+[ 5613] By: gsar on 2000/03/08 12:51:35
+ Log: clarify docs on return value from binding operators
+ Branch: perl
+ ! pod/perlop.pod
____________________________________________________________________________
-[ 2238] By: gbarr on 1998/11/14 02:51:51
- Log: integrate doc changes from mainline, including
- changes#1796,1811,1830,1831,1844,1846,1876,1905,2149,2152
- Branch: maint-5.005/perl
- !> README.os390 pod/perl.pod pod/perldelta.pod pod/perlfaq1.pod
- !> pod/perlform.pod pod/perlfunc.pod pod/perlguts.pod
- !> pod/perlipc.pod pod/perllocale.pod pod/perlport.pod
- !> pod/perlref.pod pod/perlrun.pod pod/perlvar.pod pod/perlxs.pod
- !> pod/pod2man.PL
-____________________________________________________________________________
-[ 2237] By: gbarr on 1998/11/14 02:51:49
- Log: integrate change#1847 from mainline
- From: Roderick Schertler <roderick@argon.org>
- Date: Wed, 09 Sep 1998 23:52:48 -0400
- Message-ID: <20567.905399568@eeyore.ibcinc.com>
- Subject: seed srand from /dev/urandom when possible
- Branch: maint-5.005/perl
- ! pp.c
+[ 5612] By: gsar on 2000/03/08 12:41:38
+ Log: shore up pod2latex shortcomings, and a Pod::Parser fix (from
+ Robin Barker)
+ Branch: perl
+ + lib/Pod/Plainer.pm
+ ! MANIFEST lib/Pod/Parser.pm pod/pod2latex.PL
____________________________________________________________________________
-[ 2232] By: gbarr on 1998/11/13 03:12:37
- Log: integrate change#2215 from mainline
- set close-on-exec bit on pipe() FDs
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod pod/perlvar.pod pp_sys.c
+[ 5611] By: gsar on 2000/03/08 12:22:59
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ ! Changes
+ !> installperl lib/Math/Complex.pm pod/perldelta.pod
+ !> t/lib/complex.t vms/vmsish.h
____________________________________________________________________________
-[ 2231] By: gbarr on 1998/11/13 02:16:03
- Log: integrate change#2188 from mainline
- fix return value of win32_pclose()
- Branch: maint-5.005/perl
- !> win32/win32.c
+[ 5610] By: gsar on 2000/03/08 12:08:17
+ Log: add missing locks for op refcounts
+ Branch: perl
+ ! dosish.h embedvar.h makedef.pl op.c op.h perl.c perlapi.h
+ ! perlvars.h sv.c unixish.h vms/vmsish.h
____________________________________________________________________________
-[ 2218] By: gbarr on 1998/11/08 16:48:44
- Log: From: Graham Barr <gbarr@ti.com>
- Date: Mon, 2 Nov 1998 07:38:52 -0600
- Message-ID: <19981102073852.A12751@asic.sc.ti.com>
- Subject: [PATCH 5.005_*] Re: IPC::Msg 1.03
- Branch: maint-5.005/perl
- ! ext/IPC/SysV/Msg.pm
+[ 5609] By: gsar on 2000/03/08 11:30:32
+ Log: Pod::InputObjects tweak (from Brad Appleton)
+ Branch: perl
+ ! lib/Pod/InputObjects.pm
____________________________________________________________________________
-[ 2217] By: gbarr on 1998/11/08 05:22:39
- Log: fix changes in 2213 not to break binary compat
- Branch: maint-5.005/perl
- ! pp_ctl.c proto.h
+[ 5608] By: jhi on 2000/03/08 05:08:59
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 27 files)
____________________________________________________________________________
-[ 2216] By: gbarr on 1998/11/08 04:21:01
- Log: integrate change#2192 from mainline
- indeterminate order-of-evaluation fixes
- Branch: maint-5.005/perl
- ! mg.c
+[ 5607] By: jhi on 2000/03/08 05:07:06
+ Log: Make the stringification more customizable.
+ A potentially backward incompatible change.
+ Based on a suggestion by Roman Kosenko <ra@amk.al.lg.ua>.
+ Branch: cfgperl
+ ! lib/Math/Complex.pm pod/perldelta.pod t/lib/complex.t
____________________________________________________________________________
-[ 2213] By: gbarr on 1998/11/08 00:39:44
- Log: integrate change#2051 from mainline
- properly restore PL_rsfp_filters after require
- Branch: maint-5.005/perl
- ! embed.h global.sym objXSUB.h objpp.h pp_ctl.c proto.h scope.c
- ! scope.h
+[ 5606] By: jhi on 2000/03/08 00:49:14
+ Log: s/lfs/largefiles/
+ Branch: metaconfig
+ ! U/mksample
____________________________________________________________________________
-[ 2212] By: gbarr on 1998/11/07 23:13:29
- Log: integrate changes#1914,1925,1926,1945,1956,1987 from mainline
-
- normalize tm struct passed to strftime() with mktime()
- From: Spider Boardman <spider@orb.nashua.nh.us>
- Date: Wed, 30 Sep 1998 15:12:09 -0400
- Message-Id: <199809301912.PAA26119@Orb.Nashua.NH.US>
- Subject: [PATCH 5.005_52] Re: POSIX::strftime returns incorrect date
-
- disable USE_THREADS when PERL_OBJECT is enabled
-
- From: Mark-Jason Dominus <mjd@plover.com>
- Date: Sun, 04 Oct 1998 14:48:11 -0400
- Message-ID: <19981004184811.16048.qmail@plover.com>
- Subject: PATCH: perldoc -f does not locate -e, -r, -x, etc.
-
- defer "deep recursion" warnings until CXt_SUB context is properly
- set up
-
- Mutexen should be initialized only once.
-
- perldoc pod update
- From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Date: 06 Oct 1998 23:56:51 -0600
- Message-ID: <m3g1d0kj8c.fsf@perrin.dimensional.com>
- Subject: [PATCH _02 and _52] perldoc
- Branch: maint-5.005/perl
- ! gv.c op.c pp_hot.c
- !> ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs utils/perldoc.PL
- !> win32/Makefile win32/makefile.mk
+[ 5605] By: gsar on 2000/03/07 23:37:48
+ Log: VMS build patch (from Peter Prymmer)
+ Branch: perl
+ ! configure.com installhtml lib/lib.pm vms/descrip_mms.template
+ ! vms/subconfigure.com vms/vms.c
____________________________________________________________________________
-[ 2207] By: gbarr on 1998/11/06 01:36:17
- Log: integrate changes#1912,1948 from mainline
- change warning about glob process failure
- Branch: maint-5.005/perl
- ! pod/perldiag.pod pp_hot.c
+[ 5604] By: gsar on 2000/03/07 23:25:46
+ Log: CopFILEGV(&PL_compiling) must be reset properly (from Doug MacEachern)
+ Branch: perl
+ ! perl.c
____________________________________________________________________________
-[ 2200] By: gbarr on 1998/11/05 04:26:26
- Log: integrate changes#1840,1855,1860,1882,1884,1891,1900,1907 from mainline
- pl2bat tweak from Tye McQueen <tye@metronet.com>
-
- reset errno after C<require> search (as suggested by Larry)
-
- upgrade to CPAN-1.40
-
- missing file in last submit (1881)
-
- temporarily disable perl malloc for a2p until we clean up
- conflicting malloc() declarations everywhere
-
- Fixed apostrophe problem from Mark Knutsen.
-
- use SETERRNO() to reset errno (suggested by Charles Bailey)
-
- applied patches, but retained old behavior for win32 (where compilers
- can't read from stdin at all)
- From: Graham Barr <gbarr@ti.com>
- Date: Mon, 28 Sep 1998 09:41:49 -0500
- Message-ID: <19980928094149.B26576@asic.sc.ti.com>
- Subject: Re: 5.005_51 Errno invokes cpprun incorrectly
- --
- Date: Tue, 29 Sep 1998 12:35:43 -0500
- Message-ID: <19980929123543.Z26576@asic.sc.ti.com>
- Subject: Re: 5.005_51 Errno invokes cpprun incorrectly
-
- and ext/Errno/Errno_pm.PL from change#2050
- Branch: maint-5.005/perl
- ! perl.h pp_ctl.c proto.h sv.h
- !> ext/Errno/Errno_pm.PL lib/CPAN.pm lib/CPAN/FirstTime.pm
- !> win32/bin/pl2bat.pl x2p/Makefile.SH
+[ 5603] By: gsar on 2000/03/07 23:05:16
+ Log: type mismatch
+ Branch: perl
+ ! sv.c
____________________________________________________________________________
-[ 2199] By: gbarr on 1998/11/05 03:35:00
- Log: integrate changes#1817,1856,1869,1909 from mainline
- updated usethreads hints for hpux 10.X
- From: Matthew T Harden <mthard@mthard1.monsanto.com>
- Date: Fri, 28 Aug 1998 14:10:42 GMT
- Message-Id: <199808281410.AA11058@mthard1.monsanto.com>
- Subject: Re: OK: perl 5.00502 on PA-RISC1.1-thread 10.20 (UNINSTALLED)
-
- update hints for OPENSTEP 4.2 on i386
- From: Gerben Wierda <Gerben_Wierda@RnA.nl>
- Date: Sun, 20 Sep 1998 01:03:18 +0200
- Message-Id: <9809192303.AA29190@Spike>
- Subject: Perl 5.005_02 compilation problems
-
- use STRICT_ALIGNMENT on IRIX to allow usemymalloc=y again
- From: Scott Henry <scotth@sgi.com>
- Date: 13 Aug 1998 09:52:15 PDT
- Message-Id: <yd8pve46czk.fsf@hoshi.engr.sgi.com>
- Subject: [PATCH] Irix USE_LONG_LONG/malloc.c incompatibility (was...)
-
- update SCO hints for dynamic loading
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Mon, 28 Sep 1998 16:50:38 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980928164648.8130E-100000@newton.phys>
- Subject: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV
- --
- Date: Tue, 29 Sep 1998 16:48:55 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980929164612.8634A-100000@newton.phys>
- Subject: Re: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV
- Branch: maint-5.005/perl
- !> hints/hpux.sh hints/irix_6.sh hints/next_4.sh hints/sco.sh
+[ 5602] By: gsar on 2000/03/07 22:40:55
+ Log: add note to INSTALL about C++ compilers (from M J T Guy)
+ Branch: perl
+ ! INSTALL
____________________________________________________________________________
-[ 2198] By: gbarr on 1998/11/05 03:00:51
- Log: integrate OS2 changes from mainline, change#1836,1930,1996,2063
- and os2/os2,c from #2145
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sat, 5 Sep 1998 00:14:51 -0400 (EDT)
- Message-Id: <199809050414.AAA19801@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] OS/2 spawning typos
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199810050637.CAA07781@monk.mps.ohio-state.edu>
- Date: Mon, 5 Oct 1998 02:37:43 -0400 (EDT)
- Subject: [PATCH 5.005_52] Cumulative OS/2-related patch
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 13 Oct 1998 04:46:00 -0400 (EDT)
- Message-Id: <199810130846.EAA00769@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_52] Memory overrun in os2.c
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sun, 18 Oct 1998 23:20:57 -0400 (EDT)
- Message-Id: <199810190320.XAA28249@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Improve sbrk() on OS/2
-
- remaining PL_foo stragglers
- Branch: maint-5.005/perl
- ! mg.c perl_exp.SH util.c
- !> hints/os2.sh os2/Changes os2/Makefile.SHs os2/os2.c
+[ 5601] By: gsar on 2000/03/07 22:30:35
+ Log: separate options to incpush() for adding version directories and
+ architecture directories (from Andy Dougherty)
+ Branch: perl
+ ! embed.h embed.pl perl.c proto.h t/lib/fatal.t
____________________________________________________________________________
-[ 2197] By: gbarr on 1998/11/05 02:15:53
- Log: integrate changes#1826,1862 from mainline
-
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Wed, 12 Aug 1998 22:41:37 +0300 (EET DST)
- Message-Id: <199808121941.WAA06263@alpha.hut.fi>
- Subject: [PATCH] 5.004_50 or 5.005_02: get rid of interp.sym because not even AIX needs it
-
- remove bogus warn()
- Branch: maint-5.005/perl
- - interp.sym
- ! MANIFEST Makefile.SH embed.pl perl_exp.SH
+[ 5600] By: gsar on 2000/03/07 20:18:54
+ Log: support :void to enable croaking only in void context (from
+ Simon Cozens <simon@othersideofthe.earth.li>)
+ Branch: perl
+ ! lib/Fatal.pm t/lib/fatal.t
____________________________________________________________________________
-[ 2194] By: gbarr on 1998/11/05 01:26:46
- Log: integarte malloc.c changes from mainline change#1807,2112,2133
- Branch: maint-5.005/perl
- !> malloc.c
+[ 5599] By: gsar on 2000/03/07 18:35:21
+ Log: Pod::Html tweak to avoid false falses
+ Branch: perl
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 2193] By: gbarr on 1998/11/05 01:25:31
- Log: integrate changes#1763,1778,1801,1804 from mainline
-
- From: Stephen McCamant <alias@mcs.com>
- Date: Sun, 2 Aug 1998 16:33:18 -0500 (CDT)
- Message-ID: <13764.55116.921952.837027@alias-2.pr.mcs.net>
- Subject: [PATCH] Eliminate superfluous RV2p[AH]Vs in oops[AH]V()
-
- Implicit require during compile reset line numbering
-
- silence redefined warning for XS(INIT) {}
-
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Date: Sun, 9 Aug 1998 22:38:23 +0200
- Message-ID: <19980809223823.A215@cdata.tvnet.hu>
- Subject: [PATCH 5.5002] dos-djgpp update
- Branch: maint-5.005/perl
- ! op.c pp_ctl.c
- !> t/io/fs.t
+[ 5598] By: gsar on 2000/03/07 18:21:58
+ Log: skip null siblings encountered by goto out of loopish block
+ (from Doug Lankshear)
+ Branch: perl
+ ! pp_ctl.c
____________________________________________________________________________
-[ 2176] By: gbarr on 1998/11/02 04:51:48
- Log: integrate change#2030 from mainline
-
- fix handling of mayhaps-extended @_ in goto &sub
- Branch: maint-5.005/perl
- ! av.c pp_ctl.c
- !> t/op/goto.t
+[ 5597] By: gsar on 2000/03/07 16:33:29
+ Log: omit XSLoader from bytecode dumps
+ Branch: perl
+ ! ext/B/B/Bytecode.pm ext/B/B/Stash.pm ext/B/B/Xref.pm
____________________________________________________________________________
-[ 2175] By: gbarr on 1998/11/02 04:32:02
- Log: integrate chnage#1934,1935 from mainline
- fix USE_THREADS coredump due to uninitialized PL_hv_fetch_ent_mh
- add test for previous fix
- Branch: maint-5.005/perl
- ! util.c
- !> ext/Thread/create.t
+[ 5596] By: gsar on 2000/03/07 10:58:17
+ Log: avoid coredump on C<printf "%vd">
+ Branch: perl
+ ! sv.c
____________________________________________________________________________
-[ 2174] By: gbarr on 1998/11/02 04:22:20
- Log: integrate change#1863,1881 from mainline
-
- provide locked access to string table for USE_THREADS
-
- serial access to PL_x[inpr]v_root for USE_THREADS
- Branch: maint-5.005/perl
- ! embedvar.h objXSUB.h perl.c proto.h sv.c
- !> hv.c intrpvar.h thread.h
+[ 5595] By: gsar on 2000/03/07 10:26:03
+ Log: add missing HTML escapes that can be displayed in xterm (from
+ Tim Jenness <timj@jach.hawaii.edu>)
+ Branch: perl
+ ! lib/Pod/Text.pm
____________________________________________________________________________
-[ 2173] By: gbarr on 1998/11/02 04:10:46
- Log: integrate change#1990 from mainline
-
- provide option to enable optimization with VC (suggested by Jan
- Dubois)
- Branch: maint-5.005/perl
- !> win32/Makefile win32/makefile.mk
+[ 5594] By: gsar on 2000/03/07 10:24:55
+ Log: Fatal.pm pod tweak (from Matt Sergeant <matt@sergeant.org>)
+ Branch: perl
+ ! lib/Fatal.pm
____________________________________________________________________________
-[ 2172] By: gbarr on 1998/11/02 02:52:29
- Log: integrate changes#1944,1948,1966 from mainline
-
- change#1614 merely disabled earlier fix (doh!); undo it and properly
- fixup the cop_seq value that must be seen by lexical lookups that
- emanate within eval''
-
- tweak to make fix in change#1944 behave correctly for closures
- created within eval''
- Branch: maint-5.005/perl
- ! op.c pp_ctl.c pp_hot.c scope.c
- !> cop.h t/op/eval.t
+[ 5593] By: gsar on 2000/03/07 09:57:24
+ Log: get ByteLoader working again
+ Branch: perl
+ ! bytecode.pl ext/B/B/Asmdata.pm ext/B/B/Bytecode.pm
+ ! ext/B/B/C.pm ext/ByteLoader/bytecode.h
+ ! ext/ByteLoader/byterun.c
____________________________________________________________________________
-[ 2171] By: gbarr on 1998/11/01 03:59:39
- Log: integrate changes 1835,2003,2067 and File::Find change in 1938
- warn on C<my($foo,$foo)>
-
- silence -w noises (suggested by Greg Bacon) Term::Complete
-
- From: jan.dubois@ibm.net (Jan Dubois)
- Date: Wed, 21 Oct 1998 00:55:51 +0200
- Message-ID: <36380269.55370608@smtp1.ibm.net>
- Subject: Make _really_ sure Dynaloader.xs code is initialized only once
- Branch: maint-5.005/perl
- ! op.c pod/perldiag.pod
- !> ext/DynaLoader/DynaLoader_pm.PL lib/File/Find.pm
- !> lib/Term/Complete.pm
+[ 5592] By: gsar on 2000/03/07 05:14:49
+ Log: typo in makedef.pl
+ Branch: perl
+ ! lib/File/Path.pm makedef.pl
____________________________________________________________________________
-[ 2170] By: gbarr on 1998/11/01 03:48:38
- Log: integrate change 1992 from mainline
-
- applied suggested patch with small doc tweak
- From: Gisle Aas <gisle@aas.no>
- Date: 11 Oct 1998 12:53:13 +0200
- Message-ID: <m3u31bfjza.fsf@furu.g.aas.no>
- Subject: Re: [PATCH 5.005_52] Optional syswrite LENGTH argument
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod pp_sys.c
- !> opcode.h opcode.pl t/op/sysio.t t/op/tiehandle.t
+[ 5591] By: jhi on 2000/03/06 22:56:24
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes ext/File/Glob/Glob.xs lib/Pod/Html.pm
____________________________________________________________________________
-[ 2168] By: gbarr on 1998/11/01 01:58:58
- Log: From: jan.dubois@ibm.net (Jan Dubois)
- Date: Fri, 09 Oct 1998 23:28:31 +0200
- Message-ID: <36217b7f.3193091@smtp1.ibm.net>
- Subject: [PATCH 5.005_02] Allow XS access to vtbl_*s when compiled with PERL_OBJECT
- Branch: maint-5.005/perl
- ! XSUB.h
+[ 5590] By: gsar on 2000/03/06 22:32:44
+ Log: fix incorrect prototypes in File::Glob
+ Branch: perl
+ ! ext/File/Glob/Glob.xs
____________________________________________________________________________
-[ 2167] By: gbarr on 1998/11/01 01:22:41
- Log: integrate change#2029 from mainline
- restore sanity to "constant" references
- Branch: maint-5.005/perl
- ! op.c pod/perldiag.pod
- !> lib/constant.pm t/pragma/constant.t
+[ 5589] By: gsar on 2000/03/06 22:07:38
+ Log: update Changes
+ Branch: perl
+ ! Changes
____________________________________________________________________________
-[ 2166] By: gbarr on 1998/11/01 01:04:24
- Log: integrate changes#1895,1896,2066,2147,2148 from mainline
- fix win32_stat() to do the right thing for share names
-
- small tweak on last change
-
- recognize '%' as a shell metachar for win32
- From: jan.dubois@ibm.net (Jan Dubois)
- Date: Tue, 20 Oct 1998 21:57:35 +0200
- Message-ID: <3636ea31.49170453@smtp1.ibm.net>
- Subject: [PATCH 5.005_02, Win32] Re: %ENV% not expanded in backquotes?
-
- tweaked version of suggested patch
- From: Anton Berezin <tobez@plab.ku.dk>
- Date: 29 Oct 1998 14:48:54 +0100
- Message-ID: <86yapzv5q1.fsf@lion.plab.ku.dk>
- Subject: [PATCH 5.005_52] One more problem with win32_stat and MSVC
-
- From: Anton Berezin <tobez@plab.ku.dk>
- Date: 29 Oct 1998 17:06:25 +0100
- Message-ID: <86pvbbuzcu.fsf@lion.plab.ku.dk>
- Subject: [PATCH 5.005_52] win32_opendir() fails on empty drives
- Branch: maint-5.005/perl
- !> win32/win32.c
+[ 5588] By: jhi on 2000/03/06 21:46:18
+ Log: From: "Craig A. Berry" <craig.berry@metamorgs.com>
+ To: vmsperl@perl.org, perl5-porters@perl.org
+ Cc: jhi@iki.fi, Charles Bailey <BAILEY@newman.upenn.edu>, gsar@activestate.com
+ Subject: [PATCH 5.5.670] circumvent VMS fileno bug in old DEC C version
+ Date: Mon, 06 Mar 2000 15:36:13 -0600
+ Message-Id: <4.2.2.20000306153539.00ca6420@exchi01.midwest.metamorgs.com>
+ Branch: cfgperl
+ ! vms/vmsish.h
____________________________________________________________________________
-[ 2165] By: gbarr on 1998/11/01 00:10:15
- Log: integrated changes#1941,1942,1943,1975,2061,2111,2151 from mainline
-
- don't longjmp() in pp_goto() (regressive bug from old single-stack
- implementation)
-
- force copy of substrings when matching against temporaries
-
- ensure recursive attempts to findlex()icals know enough about where
- the last eval'' context was encountered
-
- propagate typeness of lexicals while cloning them
-
- From: Graham Barr <gbarr@pobox.com>
- Date: Sat, 17 Oct 1998 22:22:02 -0500
- Message-ID: <19981017222202.J510@pobox.com>
- Subject: Re: '*' prototype does not allow bareword with strict
-
- smarter C<$SIG{FOO} = BAREWORD;> warning
-
- From: Mark-Jason Dominus <mjd@plover.com>
- Date: Fri, 30 Oct 1998 14:24:23 EST
- Message-Id: <19981030192423.27276.qmail@plover.com>
- Subject: PATCH: (5.005_02) a2p should use `chomp' instead of `chop'
- Branch: maint-5.005/perl
- ! op.c pp_ctl.c pp_hot.c t/op/pat.t toke.c
- !> t/op/eval.t t/op/runlevel.t x2p/walk.c
+[ 5587] By: jhi on 2000/03/06 21:23:27
+ Log: Use $^O.
+ Branch: cfgperl
+ ! installperl
____________________________________________________________________________
-[ 2158] By: gbarr on 1998/10/31 05:03:02
- Log: integrate changes#1821 & 1857 from mainline
-
- s/runops/CALLRUNOPS/
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 22 Sep 1998 17:30:16 -0400 (EDT)
- Message-Id: <199809222130.RAA17034@monk.mps.ohio-state.edu>
- Subject: More verbose Test::Harness [PATCH]
- Branch: maint-5.005/perl
- !> cc_runtime.h lib/Test/Harness.pm
-____________________________________________________________________________
-[ 2157] By: gbarr on 1998/10/31 02:35:07
- Log: integrate change#1839 from mainline
- From: Drago Goricanec <drago@raptor.otsd.ts.fujitsu.co.jp>
- Date: Mon, 7 Sep 1998 17:36:09 +0900
- Message-Id: <199809070836.RAA14631@raptor.otsd.ts.fujitsu.co.jp>
- Subject: Thread::cond_wait bug in 5.005.51 causes deadlock
- Branch: maint-5.005/perl
- ! ext/Thread/Thread.xs
+[ 5586] By: jhi on 2000/03/06 21:19:15
+ Log: Undo drift from the mainline.
+ Branch: cfgperl
+ !> (integrate 1607 files)
____________________________________________________________________________
-[ 2156] By: gbarr on 1998/10/31 02:22:11
- Log: integrate change#1829 from mainline
- fix problematic typecast in filter_del()
- From: Mark P Lutz <tecmpl1@triton.ca.boeing.com>
- Date: Mon, 31 Aug 1998 21:13:11 GMT
- Message-Id: <199808312113.VAA53356@triton.ca.boeing.com>
- Subject: perl5.005_02 does not build on Cray T90
- Branch: maint-5.005/perl
- ! toke.c
+[ 5585] By: gsar on 2000/03/06 20:23:37
+ Log: change#5513 accidentally undid change#5373, put it back
+ Branch: perl
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 2155] By: gbarr on 1998/10/31 01:59:08
- Log: integrate chnages#1824,2118 from mainline
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sat, 29 Aug 1998 17:38:30 -0400 (EDT)
- Message-Id: <199808292138.RAA18359@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Protect debugger from nonlocal exits
-
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 28 Oct 1998 01:23:27 -0500 (EST)
- Message-Id: <199810280623.BAA06968@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.00552] Minor debugger tweaks
- Branch: maint-5.005/perl
- !> lib/perl5db.pl
+[ 5584] By: jhi on 2000/03/06 17:30:48
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/File/Path.pm lib/Getopt/Long.pm lib/IPC/Open2.pm
+ !> lib/Pod/Man.pm makedef.pl toke.c vms/subconfigure.com
____________________________________________________________________________
-[ 2154] By: gbarr on 1998/10/31 01:06:35
- Log: integrate all lib/ExtUtils/... changes from mainline
- Branch: maint-5.005/perl
- !> lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm
- !> lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MM_Win32.pm
- !> lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mkbootstrap.pm
- !> lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp
-____________________________________________________________________________
-[ 2139] By: gbarr on 1998/10/30 04:17:53
- Log: apply chnage#2071 from mainline
- From: Graham Barr <gbarr@pobox.com>
- Date: Sat, 17 Oct 1998 20:42:41 -0500
- Message-ID: <19981017204241.G510@pobox.com>
- Subject: Re: taint checking for: use lib "$ENV{'EVIL'}"
- Branch: maint-5.005/perl
- ! pp_ctl.c
+[ 5583] By: gsar on 2000/03/06 17:02:52
+ Log: makedef.pl typos
+ Branch: perl
+ ! makedef.pl
____________________________________________________________________________
-[ 2138] By: gbarr on 1998/10/30 04:14:35
- Log: apply change#2077 from mainline
- From: Graham Barr <gbarr@pobox.com>
- Date: Sat, 24 Oct 1998 21:45:50 -0500
- Message-ID: <19981024214550.C508@pobox.com>
- Subject: Re: die with a reference should use overload "" operator
- Branch: maint-5.005/perl
- ! pp_ctl.c
+[ 5582] By: gsar on 2000/03/06 15:24:14
+ Log: Pod::Man bugfixes (from Russ Allbery)
+ Branch: perl
+ ! lib/Pod/Man.pm
____________________________________________________________________________
-[ 2137] By: gbarr on 1998/10/30 04:01:06
- Log: integrate change#1937 from mainline
- fix $/ init for USE_THREADS
- Branch: maint-5.005/perl
- ! perl.c
+[ 5581] By: gsar on 2000/03/06 15:17:08
+ Log: File::Path::rmtree() doesn't delete stale symlinks correctly
+ Branch: perl
+ ! lib/File/Path.pm
____________________________________________________________________________
-[ 2136] By: gbarr on 1998/10/30 03:40:55
- Log: apply change#2076 from mainline
- From: Graham Barr <gbarr@pobox.com>
- Date: Sat, 24 Oct 1998 12:45:21 -0500
- Message-ID: <19981024124521.C512@pobox.com>
- Subject: [PATCH 5.005_02] Re: Auto-incrementing tied scalar causes SEGV
- Branch: maint-5.005/perl
- ! sv.c
+[ 5580] By: gsar on 2000/03/06 14:55:57
+ Log: pod nits
+ Branch: perl
+ ! lib/Getopt/Long.pm lib/IPC/Open2.pm
____________________________________________________________________________
-[ 2135] By: gbarr on 1998/10/30 03:28:29
- Log: integrate change#1873 from mainline
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 25 Aug 1998 04:29:49 -0400 (EDT)
- Message-Id: <199808250829.EAA02470@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Extraneous warning for (?()A|B)
- Branch: maint-5.005/perl
- ! regcomp.c
+[ 5579] By: gsar on 2000/03/06 14:55:08
+ Log: 64-bit build fix on VMS (from Dan Sugalski)
+ Branch: perl
+ ! toke.c vms/subconfigure.com
____________________________________________________________________________
-[ 2134] By: gbarr on 1998/10/30 03:15:12
- Log: integrate change#1816 from mainline
- don't create empty directories in installperl
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Date: Fri, 21 Aug 1998 11:29:24 +0100 (BST)
- Message-Id: <199808211029.LAA00551@cyclone.cise.npl.co.uk>
- Subject: [PATCH 5.005_02] install: empty dirs
- Branch: maint-5.005/perl
- !> installperl
+[ 5578] By: jhi on 2000/03/06 14:37:46
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> README.win32 configure.com iperlsys.h lib/File/Spec/VMS.pm
+ !> lib/IPC/Open2.pm lib/IPC/Open3.pm perl.c t/lib/filefind.t
+ !> t/lib/filespec.t vms/ext/filespec.t vms/subconfigure.com
+ !> vms/test.com vms/vms.c win32/config.bc win32/config.gc
+ !> win32/config.vc win32/config_H.bc win32/config_H.gc
+ !> win32/config_H.vc win32/config_h.PL win32/perlhost.h
+ !> win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 2132] By: gbarr on 1998/10/30 01:39:00
- Log: integrate changes#1815 & 1828 from mainline
- make behavior of /(a{3})+/ like /(aaa)+/ w.r.t where it matches
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Fri, 21 Aug 1998 05:41:02 -0400 (EDT)
- Message-Id: <199808210941.FAA16467@monk.mps.ohio-state.edu>
- Subject: Re: your mail
+[ 5577] By: gsar on 2000/03/06 07:26:18
+ Log: skip tests that need VMS::Filespec on other platforms
+ Branch: perl
+ ! t/lib/filespec.t
+____________________________________________________________________________
+[ 5576] By: gsar on 2000/03/06 07:11:21
+ Log: integrate vmsperl contents into mainline
+ Branch: perl
+ !> configure.com lib/File/Spec/VMS.pm t/lib/filefind.t
+ !> t/lib/filespec.t vms/ext/filespec.t vms/subconfigure.com
+ !> vms/test.com vms/vms.c
+____________________________________________________________________________
+[ 5575] By: gsar on 2000/03/06 07:05:34
+ Log: support for autovivified handles (from Tom Christiansen)
+ Branch: perl
+ ! lib/IPC/Open2.pm lib/IPC/Open3.pm
+____________________________________________________________________________
+[ 5574] By: gsar on 2000/03/06 06:31:55
+ Log: vendorlib support for Windows; regen win32/config*
+ Branch: perl
+ ! README.win32 iperlsys.h perl.c win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/config_h.PL win32/perlhost.h
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 5573] By: bailey on 2000/03/06 05:23:23
+ Log: Skip openpid.t while VMS subprocess intercommunication in flux (several vmsperlers)
+ Branch: vmsperl
+ ! vms/test.com
+____________________________________________________________________________
+[ 5572] By: gsar on 2000/03/06 05:21:26
+ Log: the incpush()es weren't all quite right on Windows in change#5559
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 5571] By: bailey on 2000/03/06 05:18:59
+ Log: Fix ricochet in File::Spec::VMS
+ Fix eval error in filespec.t
+ Misc. minor fixes in filespec.t
+ Branch: vmsperl
+ ! lib/File/Spec/VMS.pm t/lib/filespec.t
+____________________________________________________________________________
+[ 5570] By: gsar on 2000/03/06 05:00:44
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure Makefile.SH Porting/Glossary Porting/config.sh
+ !> Porting/config_H config_h.SH epoc/config.sh
+ !> ext/DynaLoader/DynaLoader_pm.PL hints/aix.sh patchlevel.h
+ !> perl.c perl.h toke.c vos/config.def vos/config.h
+ !> vos/config_h.SH_orig
+____________________________________________________________________________
+[ 5569] By: jhi on 2000/03/06 04:51:39
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> installperl pp.c
+____________________________________________________________________________
+[ 5568] By: gsar on 2000/03/06 04:48:17
+ Log: installperl wasn't putting extensions with two or more
+ nested package names in the archlib
+ Branch: perl
+ ! installperl
+____________________________________________________________________________
+[ 5567] By: bailey on 2000/03/06 03:43:36
+ Log: Set up for vendorarch (and fix 64bitint typo) (Dan Sugalski)
+ Branch: vmsperl
+ ! configure.com vms/subconfigure.com
+____________________________________________________________________________
+[ 5566] By: bailey on 2000/03/06 03:40:14
+ Log: Change $Config{'extensions'} to look Unixy (Charles Lane)
+ FIx logic error in glob-basic.t (Charles Lane)
+ Branch: vmsperl
+ ! configure.com vms/subconfigure.com
+____________________________________________________________________________
+[ 5565] By: bailey on 2000/03/06 03:37:46
+ Log: Remove trailing . from typeless files (Charles Lane)
+ Branch: vmsperl
+ ! t/lib/filefind.t
+____________________________________________________________________________
+[ 5564] By: bailey on 2000/03/06 03:36:26
+ Log: Resync with mainline, update test in vmsfspec.t
+ Branch: vmsperl
+ +> lib/Term/ANSIColor.pm t/lib/ansicolor.t
+ ! vms/ext/filespec.t
+ !> (integrate 171 files)
+____________________________________________________________________________
+[ 5563] By: gsar on 2000/03/06 03:29:11
+ Log: avoid warning
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 5562] By: bailey on 2000/03/06 02:48:17
+ Log: Downcase function call to hush picky cc
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5561] By: jhi on 2000/03/06 00:23:22
+ Log: VOS patch from Paul Green. Note that the vos/config_h.SH_orig
+ is not exactly identical to the current config_h.SH because
+ Paul needs better $sitearch control.
+ Branch: cfgperl
+ ! vos/config.def vos/config.h vos/config_h.SH_orig
+____________________________________________________________________________
+[ 5560] By: jhi on 2000/03/05 23:26:41
+ Log: Avoid wiping out @dl_{librefs,modules} when XSLoader
+ falls back to DynaLoader.
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 31 Aug 1998 14:52:10 -0400 (EDT)
- Message-Id: <199808311852.OAA24676@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_5*] (?>) broken in RE
- Branch: maint-5.005/perl
- ! regexec.c
- !> t/op/re_tests
+ From: Doug MacEachern <dougm@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH v5.5.670] maintain DynaLoader::dl_{librefs,modules}
+ Date: Sun, 5 Mar 2000 15:19:01 -0800 (PST)
+ Message-ID: <Pine.LNX.4.10.10003051509460.16885-100000@mojo.covalent.net>
+ Branch: cfgperl
+ ! ext/DynaLoader/DynaLoader_pm.PL
____________________________________________________________________________
-[ 2131] By: gbarr on 1998/10/30 01:09:19
- Log: integrate change#1947 from mainline
- let docatch() pass the buck when restartop turns out to be null,
- making exceptions in BEGIN{} propagate as expected
- Branch: maint-5.005/perl
- ! pp_ctl.c
- !> t/op/misc.t
+[ 5559] By: jhi on 2000/03/05 22:05:54
+ Log: sitelib_stem and vendorlib_stem patches from Andy;
+ problem reported in
+ From: schwern@athens.arena-i.com (Michael G Schwern)
+ To: perl5-porters@perl.org
+ Subject: [ID 20000305.001] [BUG 5.5.670 perl.c] SITELIB_EXP mangled by hack.
+ Date: Sun, 5 Mar 2000 06:31:29 -0500 (EST)
+ Message-Id: <20000305113129.80DC23820@athens.arena-i.com>
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH epoc/config.sh patchlevel.h perl.c perl.h
+ ! vos/config.def vos/config.h vos/config_h.SH_orig
+ Branch: metaconfig
+ ! U/installdirs/instubperl.U U/installdirs/sitelib.U
+ ! U/installdirs/vendorlib.U
+____________________________________________________________________________
+[ 5558] By: jhi on 2000/03/05 21:18:59
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> hints/linux.sh lib/Getopt/Long.pm
____________________________________________________________________________
-[ 2129] By: gbarr on 1998/10/29 14:53:11
- Log: integrate change#1810 from mainline
- fix bogus integerization of pop()'s return value
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Sat, 15 Aug 1998 23:27:54 -0400
- Message-Id: <199808160327.XAA05186@aatma.engin.umich.edu>
- Subject: Re: Complex expression does integer arithmetic
- Branch: maint-5.005/perl
- !> opcode.h opcode.pl
-____________________________________________________________________________
-[ 2128] By: gbarr on 1998/10/29 14:28:13
- Log: integrate change#1870 from mainline
- From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Fri, 14 Aug 1998 09:20:16 PDT
- Message-Id: <3.0.5.32.19980814092016.00b37dc0@ous.edu>
- Subject: [PATCH 5.005_02] (and _5x I expect) VMS config procedure patch
- Branch: maint-5.005/perl
- !> configure.com
+[ 5557] By: gsar on 2000/03/05 20:35:13
+ Log: Getopt-Long v2.21 update (from Johan Vromans)
+ Branch: perl
+ ! lib/Getopt/Long.pm
____________________________________________________________________________
-[ 2127] By: gbarr on 1998/10/29 13:36:29
- Log: Integrate change#1789 from mainline
- delay freeing itervar so C<for $i (@a) { return($i) }> works
- Branch: maint-5.005/perl
- !> cop.h t/cmd/for.t
+[ 5556] By: gsar on 2000/03/05 20:26:57
+ Log: Linux needs -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 too
+ (from Matthias Urlichs <smurf@noris.net>)
+ Branch: perl
+ ! hints/linux.sh
____________________________________________________________________________
-[ 2123] By: gbarr on 1998/10/29 02:43:01
- Log: Apply change#2075 from mainline
- fix C<print $n += 5;> etc.
- Branch: maint-5.005/perl
- ! toke.c
+[ 5555] By: jhi on 2000/03/05 20:15:34
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/Term/ANSIColor.pm t/lib/ansicolor.t
+ !> MANIFEST lib/Pod/InputObjects.pm opcode.h opcode.pl
+ !> pod/perldelta.pod pod/perlfunc.pod pp.c pp_sys.c
+ !> t/comp/proto.t toke.c utils/perlbug.PL
____________________________________________________________________________
-[ 2122] By: gbarr on 1998/10/29 02:40:31
- Log: Apply change#2070 from mainline
- avoid bogus line number in XSUB redefined warnings
- Branch: maint-5.005/perl
- ! op.c
+[ 5554] By: gsar on 2000/03/05 20:02:17
+ Log: prototype changes for eventually supporting C<binmode(F, ":raw")>
+ and C<open F, "-|", 'cat', '-v'>
+ Branch: perl
+ ! opcode.h opcode.pl pod/perlfunc.pod pp.c pp_sys.c
+ ! t/comp/proto.t toke.c
____________________________________________________________________________
-[ 2121] By: gbarr on 1998/10/29 02:38:59
- Log: Apply change#2052 from mainline
- avoid the circular refcnt logic in magic_mutexfree()
- Branch: maint-5.005/perl
- ! mg.c pp.c pp_hot.c
-____________________________________________________________________________
-[ 2120] By: gbarr on 1998/10/29 02:36:23
- Log: Remove "5.005" hard-coded and expose vtbl_* from the perl DLL
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Date: Mon, 28 Sep 1998 08:49:13 -0700
- Message-ID: <000001bdeaf7$8a189350$a32fa8c0@tau.Active>
- Subject: PATCH [5.005_02] update
- Branch: maint-5.005/perl
- ! embed.h global.sym objXSUB.h objpp.h perl.h proto.h util.c
- ! win32/win32.c
+[ 5553] By: jhi on 2000/03/05 19:55:02
+ Log: AIX gcvt() cannot format long doubles very well.
+ Branch: cfgperl
+ ! hints/aix.sh
____________________________________________________________________________
-[ 2084] By: gbarr on 1998/10/25 19:09:11
- Log: Integrate change#2069 from mainline
- From: Martijn Koster <mak@excitecorp.com>
- Date: Wed, 21 Oct 1998 13:12:03 +0100
- Message-ID: <19981021131203.A15661@excitecorp.com>
- Subject: File::Path::mkpath reports the wrong error
- Branch: maint-5.005/perl
- !> lib/File/Path.pm
+[ 5552] By: jhi on 2000/03/05 18:44:37
+ Log: the monster cpp expression needs to be on one line to
+ appease makedepend
+ Branch: cfgperl
+ ! toke.c
____________________________________________________________________________
-[ 2083] By: gbarr on 1998/10/25 18:48:39
- Log: Integrate change#1965 from mainline
- use better numbers for exitstatus test
- Branch: maint-5.005/perl
- !> t/op/die_exit.t
-____________________________________________________________________________
-[ 2082] By: gbarr on 1998/10/25 18:22:54
- Log: Apply change 2054 from mainline
- disallow 'x' in hex numbers (except leading '0x')
- From: Gisle Aas <gisle@aas.no>
- Date: 16 Oct 1998 16:33:12 +0200
- Message-ID: <m3n26wtw47.fsf@furu.g.aas.no>
- Subject: Re: [PATCH 5.005_52] 'x' is not a legal hex digit
- Branch: maint-5.005/perl
- ! perlvars.h util.c
- !> t/op/oct.t
+[ 5551] By: jhi on 2000/03/05 18:24:32
+ Log: IRIX cpp is fussy.
+ Branch: cfgperl
+ ! toke.c
____________________________________________________________________________
-[ 2081] By: gbarr on 1998/10/25 17:58:04
- Log: Apply change #1998 from mainline
- skip readonly vars and unref references when doing a reset()
- Branch: maint-5.005/perl
- ! sv.c
+[ 5550] By: gsar on 2000/03/05 17:46:18
+ Log: perlbug tweak to grok local_patches better
+ Branch: perl
+ ! utils/perlbug.PL
____________________________________________________________________________
-[ 2080] By: gbarr on 1998/10/25 16:06:35
- Log: Integrate changes #2072 & #1993 from mainline
- fix bug in B::CC::pp_sassign()
- From: "vishal bhatia" <vishalb@hotmail.com>
- Date: Sun, 11 Oct 1998 18:41:38 PDT
- Message-ID: <19981012014139.19614.qmail@hotmail.com>
- Subject: B::CC problems with pp_sassign routine
- implement C<goto &func> and other fixes (via private mail)
- From: "vishal bhatia" <vishalb@hotmail.com>
- Date: Wed, 21 Oct 1998 22:59:03 PDT
- Message-Id: <19981022055904.20083.qmail@hotmail.com>
- Subject: [PATCH 5.005_52] More fixes for B
- Branch: maint-5.005/perl
- !> ext/B/B.pm ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm
+[ 5549] By: gsar on 2000/03/05 17:33:10
+ Log: add Term::ANSIColor, perldelta notes on Pod::Man, and fix a bug
+ in Pod::InputObjects (from Russ Allbery)
+ Branch: perl
+ + lib/Term/ANSIColor.pm t/lib/ansicolor.t
+ ! MANIFEST lib/Pod/InputObjects.pm pod/perldelta.pod
____________________________________________________________________________
-[ 2079] By: gbarr on 1998/10/25 14:08:00
- Log: integrate from mainline more FSF address changes
- Branch: maint-5.005/perl
- !> Copying ext/B/README lib/Getopt/Long.pm
+[ 5548] By: jhi on 2000/03/05 17:27:06
+ Log: clean up the makedepend temp file
+ Branch: cfgperl
+ ! Makefile.SH
____________________________________________________________________________
-[ 2053] By: gbarr on 1998/10/25 04:56:47
- Log: From: Graham Barr <gbarr@pobox.com>
- Date: Sat, 17 Oct 1998 23:05:18 -0500
- Message-ID: <19981017230518.K510@pobox.com>
- Subject: Re: redo LOOP not restoring $` $' $&
- Branch: maint-5.005/perl
- ! cop.h t/cmd/while.t
+[ 5547] By: jhi on 2000/03/05 17:23:18
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> perl.c
____________________________________________________________________________
-[ 2048] By: gbarr on 1998/10/24 04:20:10
- Log: Change Free Software Foundation address in README
- Branch: maint-5.005/perl
- !> README
+[ 5546] By: jhi on 2000/03/05 17:16:12
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 47 files)
____________________________________________________________________________
-[ 2047] By: gbarr on 1998/10/24 04:02:20
- Log: Remove #ifdef DEBUGGING around SvTEMP_off
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Mon, 28 Sep 1998 15:23:39 -0400
- Message-Id: <199809281923.PAA10303@aatma.engin.umich.edu>
- Subject: Re: [PATCH] Re: 5.005_52: the miniperl coredump: touch magic and you're toast
- Branch: maint-5.005/perl
- ! scope.c
+[ 5545] By: gsar on 2000/03/05 17:13:48
+ Log: strip last component of SITELIB_EXP only if it looks like a
+ number
+ Branch: perl
+ ! perl.c
____________________________________________________________________________
-[ 2046] By: gbarr on 1998/10/24 04:00:54
- Log: use cpp symbols instead of hardwired constants
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Date: Mon, 05 Oct 1998 09:23:33 +0100
- Message-Id: <199810050823.JAA00891@crypt.compulink.co.uk>
- Subject: [PATCH 5.005_52] By the numbers (resend)
- Branch: maint-5.005/perl
- ! op.c
+[ 5544] By: jhi on 2000/03/05 17:12:42
+ Log: s/Perl/PeRl/; # yeah
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/cpp_stuff.U
____________________________________________________________________________
-[ 2045] By: gbarr on 1998/10/24 03:50:25
- Log: squelch undef warnings
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Date: Fri, 02 Oct 1998 11:01:14 +0100
- Message-Id: <199810021001.LAA19214@crypt.compulink.co.uk>
- Subject: [PATCH] Re: Apparent bug in Math::BigInt
- Branch: maint-5.005/perl
- !> lib/Math/BigInt.pm
+[ 5543] By: gsar on 2000/03/05 16:54:10
+ Log: thinko in change#4546 that caused variables to lose their importedness
+ (GvIMPORTED_XV_off should be !GvIMPORTED_XV)
+ Branch: perl
+ ! sv.c t/pragma/strict-vars
____________________________________________________________________________
-[ 2044] By: gbarr on 1998/10/24 03:47:24
- Log: Add note to INSTALL about ANSI C
- Branch: maint-5.005/perl
- ! INSTALL
+[ 5542] By: gsar on 2000/03/05 09:37:26
+ Log: regen win32/config*, up version numbers &c.
+ Branch: perl
+ ! patchlevel.h win32/Makefile win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 2043] By: gbarr on 1998/10/24 02:38:12
- Log: make C<goto &sub> AUTOLOAD-aware (autouse now works for modules
- that are autoloaded)
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Thu, 24 Sep 1998 03:01:01 -0400
- Message-Id: <199809240701.DAA16223@aatma.engin.umich.edu>
- Subject: Re: autouse and Getopt::Long don't work together anymore
- Branch: maint-5.005/perl
- ! pp_ctl.c t/op/goto.t
+[ 5541] By: gsar on 2000/03/05 09:20:12
+ Log: undo change#5506; add patch to make blank line warnings optional
+ (from Brad Appleton)
+ Branch: perl
+ ! lib/Pod/Checker.pm lib/Pod/Parser.pm t/pod/poderrs.xr
____________________________________________________________________________
-[ 2042] By: gbarr on 1998/10/24 02:16:26
- Log: From: jarkko.hietaniemi@research.nokia.com (Jarkko Hietaniemi)
- Date: Wed, 12 Aug 1998 15:42:35 +0300
- Message-Id: <199808121242.PAA29761@comanche.spices>
- Subject: [PATCH] 5.004_02 or 5.005_51: fix regexp and tr character ranges in non-ASCII lands
- Branch: maint-5.005/perl
- + t/op/tr.t
- ! MANIFEST perl.h pod/perllocale.pod pod/perlop.pod
- ! pod/perlre.pod regcomp.c t/pragma/locale.t toke.c
+[ 5540] By: gsar on 2000/03/05 09:04:52
+ Log: fixes for most warnings identified by gcc -Wall
+ Branch: perl
+ ! av.c cop.h deb.c doop.c dump.c embed.h embed.pl gv.c hv.c mg.c
+ ! miniperlmain.c objXSUB.h op.c perl.c perlapi.c pp.c pp_ctl.c
+ ! pp_hot.c pp_sys.c proto.h regcomp.c regexec.c regexp.h run.c
+ ! scope.c sv.c sv.h toke.c universal.c util.c xsutils.c
____________________________________________________________________________
-[ 2021] By: gbarr on 1998/10/20 01:25:23
- Log: From: Chip Salzenberg <chip@perlsupport.com>
- Date: Tue, 6 Oct 1998 13:33:05 -0400
- Message-ID: <19981006133305.A2348@perlsupport.com>
- Subject: [PATCH] 5.005_02: Eliminate leak on self-ties
- Branch: maint-5.005/perl
- ! av.c doop.c hv.c mg.c mg.h pp.c pp_hot.c pp_sys.c scope.c
- ! t/op/tie.t
+[ 5539] By: gsar on 2000/03/05 06:37:58
+ Log: shup up warnings about dNOOP from gcc with __attribute__ ((unused))
+ (from Doug MacEachern <dougm@pobox.com>)
+ Branch: perl
+ ! patchlevel.h perl.h
____________________________________________________________________________
-[ 2015] By: gbarr on 1998/10/17 21:49:56
- Log: make h2xs generate ANSI prototypes
- Branch: maint-5.005/perl
- !> utils/h2xs.PL
+[ 5538] By: gsar on 2000/03/05 05:50:44
+ Log: tyop
+ Branch: perl
+ ! config_h.SH
____________________________________________________________________________
-[ 2014] By: gbarr on 1998/10/17 20:31:42
- Log: Fix POSIX::sigprocmask not to check type of $old parameter
- as it is output only
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.xs
+[ 5537] By: gsar on 2000/03/05 05:41:10
+ Log: integrate cfgperl contents into mainline; add new tests from
+ inc.t into 64bit.t
+ Branch: perl
+ ! t/op/64bit.t
+ !> Configure config_h.SH hints/hpux.sh hints/sco.sh perl.h
+ !> pod/perl.pod toke.c
____________________________________________________________________________
-[ 2013] By: gbarr on 1998/10/17 17:51:16
- Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
- Date: Thu, 20 Aug 1998 20:59:03 -0400
- Message-ID: <19980820205903.A12908@O2.chapin.edu>
- Subject: [PATCH] h2ph misquotes #error directives
-
- fix h2ph handling of C<#error "foo">
- From: SAKAI Kiyotaka <ksakai@netwk.ntt-at.co.jp>
- Date: Thu, 10 Sep 1998 09:59:33 +0900
- Message-Id: <19980910095933N.ksakai@netwk.ntt-at.co.jp>
- Subject: [5.005_02] h2ph problem
- Branch: maint-5.005/perl
- !> t/lib/h2ph.pht utils/h2ph.PL
+[ 5536] By: jhi on 2000/03/05 05:37:22
+ Log: dethinko
+ Branch: cfgperl
+ ! toke.c
____________________________________________________________________________
-[ 1985] By: gbarr on 1998/10/17 00:41:40
- Log: s/last/first/ typo in append_list()
- Branch: maint-5.005/perl
- ! op.c
+[ 5535] By: jhi on 2000/03/05 05:14:40
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> pp.c t/op/inc.t toke.c
____________________________________________________________________________
-[ 1984] By: gbarr on 1998/10/17 00:36:51
- Log: From: "Green, Paul" <pgreen@seussnt.stratus.com>
- Date: Thu, 10 Sep 1998 00:02:07 -0400
- Message-ID: <646CD0392810D211B04A00A024BF26FB1022EB@terminator.sw.stratus.com>
- Subject: RE: [PATCH] 5.005_02 and 5.005_51: Stratus VOS port
- Branch: maint-5.005/perl
- + README.vos vos/Changes vos/build.cm vos/compile_perl.cm
- + vos/config.h vos/config_h.SH_orig vos/perl.bind
- + vos/test_vos_dummies.c vos/vos_dummies.c vos/vosish.h
- ! MANIFEST perl.c perl.h pod/perlport.pod
+[ 5534] By: gsar on 2000/03/05 04:50:26
+ Log: optimize change#5533 to stick to IVs if constant is <= IV_MAX,
+ since runtime is highly optimized for IVs rather than UVs
+ Branch: perl
+ ! toke.c
____________________________________________________________________________
-[ 1983] By: gbarr on 1998/10/17 00:23:31
- Log: define PUT_svindex(), PUT_opindex()
- Branch: maint-5.005/perl
- !> ext/B/B/Assembler.pm
+[ 5533] By: gsar on 2000/03/05 04:30:02
+ Log: scan_num() sticks to UVs rather than IVs (now -2147483648 doesn't
+ end up being promoted to an NV)
+ Branch: perl
+ ! pp.c t/op/inc.t toke.c
____________________________________________________________________________
-[ 1982] By: gbarr on 1998/10/17 00:20:57
- Log: From: Jochen Wiedmann <joe@ispsoft.de>
- Date: Thu, 17 Sep 1998 17:16:06 +0200
- Message-ID: <360127B6.E44564A@ispsoft.de>
- Subject: [PATCH] ExtUtils::MakeMaker::prompt cannot return 0
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MakeMaker.pm
+[ 5532] By: jhi on 2000/03/05 01:11:37
+ Log: more cpp cosmetics, logic cleanup
+ Branch: cfgperl
+ ! toke.c
____________________________________________________________________________
-[ 1981] By: gbarr on 1998/10/16 02:58:10
- Log: better CR-handling on shebang line and in formats (fixed variant of
- patch suggested by Igor Sysoev <igor@nitek.ru>)
- Branch: maint-5.005/perl
- ! perl.c toke.c
+[ 5531] By: jhi on 2000/03/05 00:51:20
+ Log: Implement #5525 in metaconfig.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/cpp_stuff.U
____________________________________________________________________________
-[ 1980] By: gbarr on 1998/10/16 02:21:57
- Log: From: Roderick Schertler <roderick@argon.org>
- Date: 11 Sep 1998 16:19:21 -0400
- Message-ID: <pzyarqpfli.fsf@eeyore.ibcinc.com>
- Subject: Re: Open2 and memory leaks
- Branch: maint-5.005/perl
- !> lib/IPC/Open3.pm
+[ 5530] By: jhi on 2000/03/05 00:32:51
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> config_h.SH doio.c lib/Cwd.pm lib/Pod/Html.pm lib/bytes.pm
+ !> lib/charnames.pm lib/filetest.pm lib/integer.pm lib/locale.pm
+ !> lib/overload.pm lib/utf8.pm os2/os2ish.h pod/perldebug.pod
+ !> t/lib/ipc_sysv.t t/pragma/warn/regcomp win32/config_H.bc
+ !> win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 5529] By: jhi on 2000/03/05 00:31:17
+ Log: Sanity check on the strtoll and strtoull.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! d_strtoll.U d_strtoull.U
____________________________________________________________________________
-[ 1979] By: gbarr on 1998/10/16 02:15:54
- Log: integrate change #1908 from mainline
- Branch: maint-5.005/perl
- !> lib/File/Find.pm
+[ 5528] By: jhi on 2000/03/05 00:07:21
+ Log: Reformat the fearful cpp expression to be a little bit less fearful.
+ Branch: cfgperl
+ ! toke.c
____________________________________________________________________________
-[ 1977] By: gbarr on 1998/10/16 01:52:46
- Log: tests missing from change #1794
- Branch: maint-5.005/perl
- ! t/op/re_tests
+[ 5527] By: gsar on 2000/03/04 21:55:03
+ Log: make hints available via globals in the respective pragmas to
+ avoid duplicating the constants everywhere
+ Branch: perl
+ ! lib/bytes.pm lib/charnames.pm lib/filetest.pm lib/integer.pm
+ ! lib/locale.pm lib/overload.pm lib/utf8.pm
____________________________________________________________________________
-[ 1794] By: gbarr on 1998/09/20 15:59:20
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 11 Aug 1998 18:43:29 -0400 (EDT)
- Message-Id: <199808112243.SAA14243@monk.mps.ohio-state.edu>
- Subject: Re: Segmentation fault for /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
- Branch: maint-5.005/perl
- ! regcomp.c t/op/re_tests
+[ 5526] By: gsar on 2000/03/04 20:39:36
+ Log: remove deadcode
+ Branch: perl
+ ! lib/Cwd.pm
____________________________________________________________________________
-[ 1793] By: gbarr on 1998/09/20 15:39:41
- Log: From: Peter Prymmer <pvhp@forte.com>
- Date: Mon, 10 Aug 98 16:58:22 PDT
- Message-Id: <9808102358.AA10616@forte.com>
- Subject: fix for unpack('u') failures on OS/390
- Branch: maint-5.005/perl
- ! pp.c
+[ 5525] By: gsar on 2000/03/04 19:42:55
+ Log: make CAT2() portable for use as a macro argument with an extra
+ level of macros
+ Branch: perl
+ ! config_h.SH
____________________________________________________________________________
-[ 1792] By: gbarr on 1998/09/20 15:11:33
- Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Date: Sun, 9 Aug 1998 15:51:48 +0100
- Message-Id: <E0z5Wp2-00071p-00@taurus.cus.cam.ac.uk>
- Subject: Fix typo, change "an array" to "a hash"
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5524] By: gsar on 2000/03/04 19:02:27
+ Log: avoid looking up stale PL_statbuf (spotted by Charles Lane
+ <lane@DUPHY4.Physics.Drexel.Edu>)
+ Branch: perl
+ ! doio.c
____________________________________________________________________________
-[ 1791] By: gbarr on 1998/09/20 14:49:26
- Log: From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Wed, 16 Sep 1998 22:13:17 -0400
- Message-Id: <199809170213.WAA10546@aatma.engin.umich.edu>
- Subject: fill gaps in sig_* entries in win32/config.?c
- and resync win32/config.?c with Porting/config.sh to pick up apiversion
- Branch: maint-5.005/perl
- ! win32/config.bc win32/config.gc win32/config.vc
+[ 5523] By: gsar on 2000/03/04 18:59:03
+ Log: pod tweak
+ Branch: perl
+ ! pod/perldebug.pod
____________________________________________________________________________
-[ 1790] By: gbarr on 1998/09/20 14:40:56
- Log: From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Sun, 06 Sep 1998 15:35:11 -0400
- Message-Id: <199809061935.PAA21531@aatma.engin.umich.edu>
- Subject: suppress bogus warning on C<sub x {} x()>
- Branch: maint-5.005/perl
- ! toke.c
+[ 5522] By: gsar on 2000/03/04 17:46:58
+ Log: regen win32/config_H*
+ Branch: perl
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
____________________________________________________________________________
-[ 1784] By: nick on 1998/09/12 09:53:36
- Log: Two tweaks to allow quiet compile qith egcs-1.1
- Branch: maint-5.005/perl
- ! win32/win32.h
+[ 5521] By: jhi on 2000/03/04 16:35:48
+ Log: From: "Matthias Urlichs" <smurf@noris.net>
+ To: perl5-porters@perl.org
+ Subject: BUG: Integer floatifies? +PATCH: reading BIG integers with SMALL floats
+ Date: Sat, 4 Mar 2000 12:48:42 +0100
+ Message-ID: <20000304124841.A8090@noris.de>
+ Branch: cfgperl
+ ! toke.c
____________________________________________________________________________
-[ 1783] By: gbarr on 1998/09/07 20:33:11
- Log: Subject: index() applied BM optimization to wrong argument
- From: larry@wall.org (Larry Wall)
- Date: Thu, 3 Sep 1998 12:49:13 -0700
- Message-Id: <199809031949.MAA29566@wall.org>, <199809060004.RAA23792@wall.org>
- Branch: maint-5.005/perl
- ! op.c util.c
+[ 5520] By: jhi on 2000/03/04 15:41:12
+ Log: unthink wishful thinking
+ Branch: cfgperl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 1782] By: gbarr on 1998/09/07 18:54:49
- Log: From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Date: Fri, 28 Aug 1998 00:33:15 -0400
- Mssage-Id: <199808280433.AAA06767@aatma.engin.umich.edu>
- Subject: socket problems on NT
- Branch: maint-5.005/perl
- ! objXSUB.h
+[ 5519] By: gsar on 2000/03/04 06:42:47
+ Log: fix OS/2 coredump with POSIX::tmpnam() (from Ilya Zakharevich)
+ Branch: perl
+ ! os2/os2ish.h
____________________________________________________________________________
-[ 1759] By: gsar on 1998/08/08 20:57:47
- Log: pending submit of 5.005_02
- Branch: maint-5.005/perl
- ! Changes
-
-----------------
-Version 5.005_02 Second maintenance release of 5.005
-----------------
-
+[ 5518] By: gsar on 2000/03/04 06:02:26
+ Log: avoid "scalars leaked" message in test
+ Branch: perl
+ ! t/pragma/warn/regcomp
____________________________________________________________________________
-[ 1758] By: gsar on 1998/08/08 03:45:04
- Log: set patchlevel.h, other minor tweaks
- Branch: maint-5.005/perl
- ! Changes patchlevel.h pod/perlhist.pod pod/perlport.pod
+[ 5517] By: jhi on 2000/03/04 06:01:16
+ Log: detypo
+ Branch: cfgperl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 1757] By: gsar on 1998/08/08 03:33:33
- Log: prevent lexical leaks from Benchmark into target code (inspired by
- an attempt by John Allen)
- Branch: maint-5.005/perl
- ! lib/Benchmark.pm
+[ 5516] By: jhi on 2000/03/04 05:59:21
+ Log: cleanup AVAILABILITY and mention binaries
+ Branch: cfgperl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 1755] By: gsar on 1998/08/07 23:58:33
- Log: temporary opcode.pl workaround for ebcdic (suggested by
- David J. Fiander <davidf@mks.com> and M.J.T. Guy)
- Branch: maint-5.005/perl
- ! opcode.pl
+[ 5515] By: gsar on 2000/03/04 05:55:02
+ Log: syntax error in change#5498
+ Branch: perl
+ ! t/lib/ipc_sysv.t
____________________________________________________________________________
-[ 1754] By: gsar on 1998/08/07 22:21:10
- Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- Date: Fri, 7 Aug 1998 09:56:01 +0100 (BST)
- Message-Id: <9808070856.AA28065@claudius.bfsec.bt.co.uk>
- Subject: [PATCH 5.005_50 & 5.005_02] Fix for command line use of source filters
- Branch: maint-5.005/perl
- ! perl.c
+[ 5514] By: jhi on 2000/03/04 05:50:56
+ Log: assuming that removing the libbind will be a good idea
+ Branch: cfgperl
+ ! hints/sco.sh
____________________________________________________________________________
-[ 1753] By: gsar on 1998/08/07 22:19:42
- Log: perlport.pod notes from Jarkko Hietaniemi; utime() note for Win32
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 5513] By: gsar on 2000/03/04 05:50:15
+ Log: Pod::Html fixups for nicer links to functions (from Wolfgang Laun
+ <wolfgang.laun@chello.at>)
+ Branch: perl
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 1752] By: gsar on 1998/08/07 22:08:29
- Log: perlport.pod v1.33 from Chris Nandor <pudge@pobox.com>
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 5512] By: jhi on 2000/03/04 05:45:52
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 41 files)
____________________________________________________________________________
-[ 1751] By: gsar on 1998/08/07 22:01:04
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Thu, 6 Aug 1998 19:44:16 -0400 (EDT)
- Message-Id: <199808062344.TAA09505@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Minor cleanup of RE tests and docs
- Branch: maint-5.005/perl
- ! pod/perlre.pod t/op/regexp.t
+[ 5511] By: jhi on 2000/03/04 05:42:37
+ Log: HP-UX 64-bitness cures
+ Branch: cfgperl
+ ! hints/hpux.sh perl.h
____________________________________________________________________________
-[ 1750] By: gsar on 1998/08/07 21:51:52
- Log: allow more compatible interpretation of spaces File::DosGlob::glob()
- patterns
- Branch: maint-5.005/perl
- ! lib/File/DosGlob.pm
+[ 5510] By: gsar on 2000/03/04 05:40:08
+ Log: better error messages when xsubpp fails to find map for a particular
+ type (from Ilya Zakharevich)
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 1749] By: gsar on 1998/08/07 21:36:04
- Log: don't use © in Test.pm (suggested by M.J.T. Guy)
- Branch: maint-5.005/perl
- ! lib/Test.pm
+[ 5509] By: jhi on 2000/03/04 05:33:27
+ Log: scratch #5508
+ Branch: cfgperl
+ ! perl.h
____________________________________________________________________________
-[ 1748] By: gsar on 1998/08/07 21:31:46
- Log: From: Dominic Dunlop <domo@computer.org>
- Date: Thu, 6 Aug 1998 12:38:07 +0000
- Message-Id: <v03110702b1ef5274635a@[195.95.102.104]>
- Subject: [Patch perl5.005_02-TRIAL2] Update hints, Configure for MachTen 4.1.1
- Branch: maint-5.005/perl
- ! Configure hints/machten.sh
+[ 5508] By: jhi on 2000/03/04 05:31:19
+ Log: In HP-UX there is a secret handshake to get strtoll and strtoull.
+ Branch: cfgperl
+ ! perl.h
____________________________________________________________________________
-[ 1746] By: gsar on 1998/08/05 22:55:59
- Log: MM_Win32.pm and Liblist.pm tweaks
- Branch: maint-5.005/perl
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
+[ 5507] By: gsar on 2000/03/04 04:27:51
+ Log: more whitespace removal (from Michael G Schwern)
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.pm ext/Errno/Errno_pm.PL
+ ! ext/File/Glob/Glob.pm ext/IO/lib/IO/Select.pm
+ ! ext/IO/lib/IO/Socket.pm ext/IO/lib/IO/Socket/INET.pm
+ ! ext/IPC/SysV/Msg.pm ext/IPC/SysV/Semaphore.pm lib/CGI.pm
+ ! lib/CGI/Cookie.pm lib/CGI/Fast.pm lib/CGI/Push.pm
+ ! lib/Carp/Heavy.pm lib/DB.pm lib/Exporter/Heavy.pm
+ ! lib/File/DosGlob.pm lib/File/Find.pm lib/Getopt/Long.pm
+ ! lib/Math/Trig.pm lib/Net/Ping.pm lib/Net/netent.pm
+ ! lib/SelfLoader.pm lib/Tie/Array.pm lib/Tie/Handle.pm
+ ! lib/Tie/Scalar.pm lib/Time/Local.pm lib/filetest.pm
+ ! lib/overload.pm x2p/s2p.PL
____________________________________________________________________________
-[ 1745] By: gsar on 1998/08/05 21:57:00
- Log: pod/perlfaq* update from Tom Christiansen <tchrist@perl.com>
- Branch: maint-5.005/perl
- ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
- ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq8.pod
+[ 5506] By: gsar on 2000/03/04 04:12:06
+ Log: temporarily disable blank line warning from Pod::Parser until
+ it can be made optional
+ Branch: perl
+ ! lib/Pod/Parser.pm t/pod/poderrs.xr
____________________________________________________________________________
-[ 1744] By: gsar on 1998/08/05 21:53:30
- Log: From: Chris Nandor <pudge@pobox.com>
- Date: Wed, 5 Aug 1998 15:38:48 -0400
- Message-Id: <v04011701b1ee58b86c63@[192.168.0.3]>
- Subject: [PATCH] perlport 1.32
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 5505] By: gsar on 2000/03/04 04:00:44
+ Log: rid blanks in pods (from Michael G Schwern)
+ Branch: perl
+ ! README.amiga README.dos README.os2
____________________________________________________________________________
-[ 1743] By: gsar on 1998/08/05 21:52:05
- Log: README.os2 update
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 5 Aug 1998 05:44:46 -0400 (EDT)
- Message-Id: <199808050944.FAA09053@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Additional OS/2 tweaks: docs, tests
- Branch: maint-5.005/perl
- ! README.os2 t/lib/posix.t t/op/exec.t
+[ 5504] By: gsar on 2000/03/04 03:59:07
+ Log: avoid warnings from shmread() when given undefined variable
+ (from Tom Christiansen)
+ Branch: perl
+ ! doio.c
____________________________________________________________________________
-[ 1742] By: gsar on 1998/08/05 21:50:07
- Log: additional INSTALL notes from Jarkko Hietaniemi <jhi@cc.hut.fi>
- on semget failure in t/lib/ipc_sysv.t
- Branch: maint-5.005/perl
- ! INSTALL
+[ 5503] By: gsar on 2000/03/04 03:53:43
+ Log: fpsetmask() needs include on freebsd (from Slaven Rezic
+ <eserte@vran.herceg.de>)
+ Branch: perl
+ ! unixish.h
____________________________________________________________________________
-[ 1741] By: gsar on 1998/08/05 21:46:13
- Log: correct URL for perlcrt.dll
- Branch: maint-5.005/perl
- ! Changes win32/Makefile win32/makefile.mk
+[ 5502] By: gsar on 2000/03/04 03:51:05
+ Log: avoid ambiguity in indirect object notation (breaks with overridden
+ run time require)
+ Branch: perl
+ ! lib/CGI.pm
____________________________________________________________________________
-[ 1740] By: gsar on 1998/08/05 10:05:46
- Log: update Changes, patchlevel, tweak Liblist.pm
- Branch: maint-5.005/perl
- ! Changes lib/ExtUtils/Liblist.pm patchlevel.h
+[ 5501] By: gsar on 2000/03/04 01:08:54
+ Log: adjust perldelta
+ Branch: perl
+ ! Todo-5.6 pod/perl.pod pod/perldelta.pod
____________________________________________________________________________
-[ 1739] By: gsar on 1998/08/05 09:10:45
- Log: newer cperl-mode.el
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 5 Aug 1998 03:50:16 -0400 (EDT)
- Message-Id: <199808050750.DAA07240@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] CPerl update
- Branch: maint-5.005/perl
- ! emacs/cperl-mode.el
+[ 5500] By: gsar on 2000/03/04 00:33:49
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> hints/irix_6.sh hints/solaris_2.sh pod/perl.pod
+ !> pod/perlfunc.pod t/lib/ipc_sysv.t
____________________________________________________________________________
-[ 1738] By: gsar on 1998/08/05 09:08:33
- Log: support :nosearch in ExtUtils::Liblist for win32, and make -lfoo
- processing (somewhat) compiler-specific
- Branch: maint-5.005/perl
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
+[ 5499] By: jhi on 2000/03/03 22:51:53
+ Log: solaris hints tweak
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1737] By: gsar on 1998/08/05 03:20:03
- Log: add index entries for -X
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sun, 02 Aug 1998 16:33:18 EDT
- Message-Id: <199808022033.QAA18778@monk.mps.ohio-state.edu>
- Subject: [PATCH] A missing docu patch
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5498] By: jhi on 2000/03/03 22:35:46
+ Log: The SysV IPC test must use the native integers
+ (long or short), also noted this in the msgsnd/semctl
+ documentation. Reported in
+
+ From: schwern@athens.arena-i.com (Michael G Schwern)
+ To: perl5-porters@perl.org
+ Subject: [ID 20000302.006] [BUG 5.5.670 t/ipc_sysv.t] Fails 2,5,6 with 64bit on Linux
+ Date: Thu, 2 Mar 2000 17:15:03 -0500 (EST)
+ Message-Id: <20000302221503.EDF6E3830@athens.arena-i.com>
+ Branch: cfgperl
+ ! pod/perlfunc.pod t/lib/ipc_sysv.t
____________________________________________________________________________
-[ 1736] By: gsar on 1998/08/05 03:09:58
- Log: make Test::Harness optionally check for stray files when running tests
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sun, 2 Aug 1998 18:12:48 -0400 (EDT)
- Message-Id: <199808022212.SAA20126@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] File leaked from test suite
- Branch: maint-5.005/perl
- ! lib/Test/Harness.pm
+[ 5497] By: jhi on 2000/03/03 21:08:53
+ Log: Update AVAILABILITY.
+ Branch: cfgperl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 1735] By: gsar on 1998/08/05 02:29:46
- Log: back out change#1703 that break bincompat with PERL_OBJECT and
- MULTIPLICITY
- Branch: maint-5.005/perl
- ! ext/re/re.pm regcomp.c regexec.c thrdvar.h
-____________________________________________________________________________
-[ 1734] By: gsar on 1998/08/05 02:23:47
- Log: fixes to enable ISC to build IPC/SysV
- From: Jarkko Hietaniemi <jhi@cc.hut.fi>
- Date: 05 Aug 1998 00:59:13 +0300
- Message-ID: <oee3ebce7da.fsf@alpha.hut.fi>
- Subject: [PATCH] 5.005_02-TRIAL1: (Re: Bug in pp_rename and ISC hint)
- Branch: maint-5.005/perl
- ! ext/IPC/SysV/SysV.xs hints/isc.sh hints/isc_2.sh
+[ 5496] By: gsar on 2000/03/03 20:21:05
+ Log: perldebug tweak (from M J T Guy)
+ Branch: perl
+ ! pod/perldebug.pod
____________________________________________________________________________
-[ 1733] By: gsar on 1998/08/05 01:20:29
- Log: let some 'tr' be '$tr' for occult reasons
- From: Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
- Date: Mon, 3 Aug 1998 11:04:30 -0700 (PDT)
- Message-Id: <199808031804.LAA25595@xfiles.intercon.hp.com>
- Subject: PATCH: Configure uses tr, not $tr
- Branch: maint-5.005/perl
- ! Configure
+[ 5495] By: jhi on 2000/03/03 19:32:58
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 79 files)
____________________________________________________________________________
-[ 1732] By: gsar on 1998/08/05 01:16:40
- Log: perlre.pod tweak suggested by Mike Wescott <mike.wescott@columbiasc.ncr.com>
- Branch: maint-5.005/perl
- ! pod/perlre.pod
+[ 5494] By: jhi on 2000/03/03 19:14:01
+ Log: the workaround is needed in all 7.2.* compilers,
+ not just on IRIX64.
+ Branch: cfgperl
+ ! hints/irix_6.sh
____________________________________________________________________________
-[ 1731] By: gsar on 1998/08/05 01:10:41
- Log: explain caveat about use of numeric constants in podoc for sysopen()
- From: "David J. Fiander" <davidf@mks.com>
- Date: Tue, 4 Aug 1998 13:09:58 -0400
- Message-Id: <199808041709.NAA01750@mks.com>
- Subject: Re: [PATCH] 5.005_01: OE MVS
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5493] By: gsar on 2000/03/03 18:58:45
+ Log: whitespace and readabiliti nits in the pods (from Michael G Schwern
+ and Robin Barker)
+ Branch: perl
+ ! Changes pod/perl.pod pod/perl5004delta.pod
+ ! pod/perl5005delta.pod pod/perlboot.pod pod/perldata.pod
+ ! pod/perldebug.pod pod/perldelta.pod pod/perldiag.pod
+ ! pod/perlembed.pod pod/perlfaq.pod pod/perlfaq2.pod
+ ! pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfaq6.pod
+ ! pod/perlfaq7.pod pod/perlfaq8.pod pod/perlfaq9.pod
+ ! pod/perlfilter.pod pod/perlguts.pod pod/perlipc.pod
+ ! pod/perllexwarn.pod pod/perllocale.pod pod/perlmodinstall.pod
+ ! pod/perlmodlib.pod pod/perlobj.pod pod/perlopentut.pod
+ ! pod/perlpod.pod pod/perlport.pod pod/perlre.pod
+ ! pod/perlref.pod pod/perlreftut.pod pod/perlsub.pod
+ ! pod/perltie.pod pod/perltodo.pod pod/perltoot.pod
+ ! pod/perltootc.pod pod/perltrap.pod pod/perlvar.pod
+ ! pod/perlxstut.pod
____________________________________________________________________________
-[ 1730] By: gsar on 1998/08/05 00:46:53
- Log: end pod processing when source file is closed (prevents it carrying
- over into require()d files)
- Branch: maint-5.005/perl
- ! t/comp/require.t toke.c
+[ 5492] By: gsar on 2000/03/03 17:48:31
+ Log: support for list assignment to pseudohashes (from John Tobey
+ <jtobey@john-edwin-tobey.org>)
+ Branch: perl
+ ! av.c dump.c embed.h embed.pl global.sym objXSUB.h op.c op.h
+ ! perlapi.c pp_hot.c proto.h t/op/avhv.t t/op/hashwarn.t
____________________________________________________________________________
-[ 1729] By: gsar on 1998/08/04 23:03:23
- Log: correct prototype for des_fcrypt(), explain how to add it in more
- detail, and supply a patch for libdes-3.06
- Branch: maint-5.005/perl
- + win32/des_fcrypt.patch
- ! MANIFEST README.win32 win32/Makefile win32/makefile.mk
- ! win32/win32.c
+[ 5491] By: gsar on 2000/03/03 16:45:49
+ Log: add MakeMaker caveat to INSTALL (from Andy Dougherty)
+ Branch: perl
+ ! INSTALL
____________________________________________________________________________
-[ 1728] By: gsar on 1998/08/04 21:50:40
- Log: tweak to avoid ambiguity warnings
- Branch: maint-5.005/perl
- ! pp.c
+[ 5490] By: gsar on 2000/03/03 16:44:42
+ Log: perldelta tweaks
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 1727] By: gsar on 1998/08/04 20:31:04
- Log: remove useless 'rcsid' (extension of a suggestion by
- Stephen McCamant)
- Branch: maint-5.005/perl
- ! embed.h ext/SDBM_File/sdbm/pair.c ext/SDBM_File/sdbm/sdbm.c
- ! global.sym gv.c perl.c vms/gen_shrfls.pl
+[ 5489] By: gsar on 2000/03/03 16:26:52
+ Log: /dev/console may not be writable in Syslog.pm (from Ask Bjoern Hansen
+ <ask@valueclick.com>)
+ Branch: perl
+ ! ext/Sys/Syslog/Syslog.pm
____________________________________________________________________________
-[ 1726] By: gsar on 1998/08/04 19:52:43
- Log: correct Pod::Html's notion of email addresses
- From: abigail@fnx.com
- Date: Mon, 3 Aug 1998 20:22:49 -0400 (EDT)
- Message-ID: <19980804002249.2011.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.005_01] lib/Pod/Html.pm
- Branch: maint-5.005/perl
- ! lib/Pod/Html.pm
+[ 5488] By: gsar on 2000/03/03 16:21:34
+ Log: OS/2 patches for dlclose() support (from Yitzchak Scott-Thoennes
+ <sthoenna@efn.org>)
+ Branch: perl
+ ! makedef.pl os2/diff.configure os2/dl_os2.c os2/dlfcn.h
+ ! os2/os2.sym
____________________________________________________________________________
-[ 1725] By: gsar on 1998/08/04 19:50:06
- Log: perlport.pod additions from Peter Prymmer <pvhp@forte.com>
- Date: Mon, 3 Aug 98 15:31:35 PDT
- Message-Id: <9808032231.AA22324@forte.com>
- --
- Date: Tue, 4 Aug 98 12:44:20 PDT
- Message-Id: <9808041944.AA04815@forte.com>
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 5487] By: gsar on 2000/03/03 16:16:34
+ Log: skip test on AFS (from Hans Ranke <Hans.Ranke@ei.tum.de>)
+ Branch: perl
+ ! t/lib/glob-basic.t
____________________________________________________________________________
-[ 1724] By: gsar on 1998/08/04 18:08:07
- Log: From: Chris Nandor <pudge@pobox.com>
- Date: Mon, 3 Aug 1998 13:35:25 -0400
- Message-Id: <v04011711b1eba46d0827@[192.168.0.3]>
- Subject: [PATCH] perlport 1.30
- Branch: maint-5.005/perl
- ! pod/perlport.pod
+[ 5486] By: gsar on 2000/03/03 15:42:28
+ Log: integrate cfgperl and vmsperl contents into mainline
+ Branch: perl
+ ! pod/perl.pod
+ !> (integrate 38 files)
____________________________________________________________________________
-[ 1723] By: gsar on 1998/08/04 18:06:13
- Log: update postscript generator
- From: Tom Christiansen <tchrist@chthon.perl.com>
- Date: Mon, 3 Aug 1998 05:29:25 -0600
- Message-Id: <199808031129.FAA24985@chthon.perl.com>
- Subject: PATCH: pod/roffitall (5.005_02)
- Branch: maint-5.005/perl
- ! pod/roffitall
+[ 5485] By: jhi on 2000/03/03 15:21:40
+ Log: pull the sparcv9 workshop libraries in front of loclibpth
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1722] By: gsar on 1998/08/03 17:01:12
- Log: applied suggested patch, slightly tweaked
- From: Jarkko Hietaniemi <jhi@cc.hut.fi>
- Date: Mon, 3 Aug 1998 11:52:30 +0300 (EET DST)
- Message-Id: <199808030852.LAA14153@alpha.hut.fi>
- Subject: [PATCH] perl5.005_02-TRIAL1: pod/perlhist.pod
- Branch: maint-5.005/perl
- ! pod/perlhist.pod
+[ 5484] By: jhi on 2000/03/03 15:09:03
+ Log: Introduce i_ieefp because FreeBSD on ix86 needs that
+ for ftpsetmask(0); regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH epoc/config.sh perl.h vms/subconfigure.com
+ ! vos/config.def vos/config.h vos/config_h.SH_orig
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
____________________________________________________________________________
-[ 1721] By: gsar on 1998/08/03 16:30:20
- Log: fix segfault when threadsv is used as foreach itervar
- From: Stephen McCamant <alias@mcs.com>
- Date: Sun, 02 Aug 1998 21:44:34 CDT
- Message-Id: <13765.8641.997452.14516@alias-2.pr.mcs.net>
- Subject: [PATCH] threadsv index in enteriter targ in op_free()
- Branch: maint-5.005/perl
- ! op.c
+[ 5483] By: jhi on 2000/03/03 05:37:58
+ Log: The _cflags must be left-aligned.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 5482] By: bailey on 2000/03/03 04:42:45
+ Log: Once more unto resync
+ Branch: vmsperl
+ !> (integrate 48 files)
+____________________________________________________________________________
+[ 5481] By: bailey on 2000/03/03 04:36:46
+ Log: VMS-specific perldelta update
+ Branch: vmsperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 5480] By: bailey on 2000/03/03 04:05:28
+ Log: Set up Perl invocation method during configuration (Peter Prymmer)
+ Add missing bits to various utilities and install them (ditto)
+ Branch: vmsperl
+ ! configure.com pod/pod2usage.PL pod/podselect.PL
+ ! utils/dprofpp.PL vms/descrip_mms.template
+____________________________________________________________________________
+[ 5479] By: bailey on 2000/03/03 04:01:48
+ Log: Fix test to match new behavior of vmsify() (Craig Berry)
+ Branch: vmsperl
+ ! vms/ext/filespec.t
+____________________________________________________________________________
+[ 5478] By: bailey on 2000/03/03 03:54:10
+ Log: Try to intuit whether typeless file invoked in subprocess
+ is an executable image or DCL procedure.
+ Branch: vmsperl
+ ! vms/perlvms.pod vms/vms.c
+____________________________________________________________________________
+[ 5477] By: bailey on 2000/03/03 03:37:18
+ Log: Remove leftover bits of VAXC support (Dan Sugalski)
+ Branch: vmsperl
+ ! vms/gen_shrfls.pl
+____________________________________________________________________________
+[ 5476] By: bailey on 2000/03/03 03:34:51
+ Log: Add missing declaration (Dan Sugalski)
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5475] By: gsar on 2000/03/03 03:27:52
+ Log: warn about /(?p{})/ (from Simon Cozens)
+ Branch: perl
+ ! regcomp.c toke.c
+____________________________________________________________________________
+[ 5474] By: bailey on 2000/03/03 03:27:05
+ Log: Ad hoc patch for duping stdout into stderr
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5473] By: bailey on 2000/03/03 03:23:29
+ Log: Bypass PERL_INC_VERSION_LIST until we support in in Configure.Com
+ Branch: vmsperl
+ ! vms/subconfigure.com vms/vmsish.h
+____________________________________________________________________________
+[ 5472] By: gsar on 2000/03/03 02:58:49
+ Log: File::Spec bugs (spotted by Hack Kampbjorn <hack@hackdata.com>)
+ Branch: perl
+ ! lib/File/Spec/Mac.pm lib/File/Spec/Unix.pm
+ ! lib/File/Spec/VMS.pm lib/File/Spec/Win32.pm
+____________________________________________________________________________
+[ 5471] By: jhi on 2000/03/03 02:38:23
+ Log: more todo
+ Branch: cfgperl
+ ! Todo-5.6
____________________________________________________________________________
-[ 1720] By: gsar on 1998/08/02 23:33:42
- Log: close() open files before unlink()
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sun, 2 Aug 1998 18:14:22 -0400 (EDT)
- Message-Id: <199808022214.SAA20135@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] File leaked from test suite - tests
- Branch: maint-5.005/perl
- ! t/base/rs.t t/op/defins.t
+[ 5470] By: gsar on 2000/03/03 02:36:02
+ Log: skip test if db doesn't have null key support
+ Branch: perl
+ ! t/lib/anydbm.t
____________________________________________________________________________
-[ 1719] By: gsar on 1998/08/02 23:31:51
- Log: more pack() tests
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Mon, 3 Aug 1998 00:59:41 +0300 (EET DST)
- Message-Id: <199808022159.AAA17160@alpha.hut.fi>
- Subject: Re: uudecode 'u' problem
- Branch: maint-5.005/perl
- ! t/op/pack.t
+[ 5469] By: jhi on 2000/03/03 02:26:53
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> INSTALL lib/AutoSplit.pm lib/ExtUtils/xsubpp lib/SelfLoader.pm
+ !> lib/Test/Harness.pm lib/constant.pm pod/perl.pod
+ !> pod/perldelta.pod pod/perlpod.pod pod/perlre.pod
+ !> pod/perltoc.pod regcomp.c t/op/misc.t t/op/pat.t toke.c
+ !> utils/h2xs.PL win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 5468] By: jhi on 2000/03/03 02:24:05
+ Log: irix hints tweak
+ Branch: cfgperl
+ ! hints/irix_6.sh
____________________________________________________________________________
-[ 1718] By: gsar on 1998/08/02 23:26:51
- Log: t/TEST aesthetic tweak suggested by Jarkko
- Branch: maint-5.005/perl
- ! t/TEST
+[ 5467] By: gsar on 2000/03/03 02:19:50
+ Log: /(?p{})/ changed to /(??{})/, per Larry's suggestion (from
+ Simon Cozens <simon@othersideofthe.earth.li>)
+ Branch: perl
+ ! lib/AutoSplit.pm lib/ExtUtils/xsubpp lib/SelfLoader.pm
+ ! pod/perlre.pod pod/perltoc.pod regcomp.c t/op/misc.t
+ ! t/op/pat.t toke.c
____________________________________________________________________________
-[ 1717] By: gsar on 1998/08/02 23:23:43
- Log: add Digital Unix 3.x notes to README.threads (as suggested by
- Phoenix <awrobel@jedi.cis.temple.edu>)
- Branch: maint-5.005/perl
- ! README.threads
-____________________________________________________________________________
-[ 1716] By: gsar on 1998/08/02 23:15:00
- Log: allow *FOO{BAR}[0] etc. (without intervening arrow)
- From: Stephen McCamant <alias@mcs.com>
- Date: Sun, 2 Aug 1998 16:16:50 -0500 (CDT)
- Message-ID: <13764.54929.60137.104838@alias-2.pr.mcs.net>
- Subject: [PATCH] Re: Minor nit in glob notation
- Branch: maint-5.005/perl
- ! Changes op.c
+[ 5466] By: jhi on 2000/03/03 02:12:41
+ Log: in words order bad
+ Branch: cfgperl
+ ! pod/perlre.pod
____________________________________________________________________________
-[ 1715] By: gsar on 1998/08/02 22:49:53
- Log: fix unpack('u',...) problem with spaces in input
- Branch: maint-5.005/perl
- ! pp.c t/op/pack.t
+[ 5465] By: jhi on 2000/03/03 02:09:45
+ Log: /[[:alpha]/ now dies on unmatched [] instead of
+ "an unknown character class" (spotted by Tom Christiansen)
+ Branch: cfgperl
+ ! regcomp.c t/pragma/warn/regcomp
____________________________________________________________________________
-[ 1714] By: gsar on 1998/08/02 21:27:19
- Log: update location of perlcrt.dll for win32 builds
- Branch: maint-5.005/perl
- ! win32/Makefile win32/makefile.mk
+[ 5464] By: gsar on 2000/03/03 02:04:48
+ Log: perldelta notes about IO::Socket changes (from Graham Barr)
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 1713] By: gsar on 1998/08/02 09:28:32
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sun, 2 Aug 1998 04:35:11 -0400 (EDT)
- Message-Id: <199808020835.EAA09367@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Better debugging output from malloc.c
- Branch: maint-5.005/perl
- ! malloc.c
+[ 5463] By: gsar on 2000/03/03 02:02:50
+ Log: relax restrictions on constant names a bit (from M J T Guy)
+ Branch: perl
+ ! lib/constant.pm
____________________________________________________________________________
-[ 1712] By: gsar on 1998/08/02 09:16:55
- Log: fix longstanding bug in pack('u',...) (reads garbage beyond the end
- of the input string)
- Branch: maint-5.005/perl
- ! pp.c
+[ 5462] By: gsar on 2000/03/03 01:59:49
+ Log: support for generation of accessor functions (from Hugo van der
+ Sanden)
+ Branch: perl
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 1711] By: gsar on 1998/08/02 08:14:25
- Log: update Changes, tweak Porting/makerel
- Branch: maint-5.005/perl
- ! Changes Porting/makerel
+[ 5461] By: jhi on 2000/03/03 01:51:53
+ Log: cosmetics
+ Branch: cfgperl
+ ! t/op/pack.t
____________________________________________________________________________
-[ 1710] By: gsar on 1998/08/02 07:31:37
- Log: remove CRs from djgpp/configure.bat (Porting/makerel adds them)
- Branch: maint-5.005/perl
- ! djgpp/configure.bat
+[ 5460] By: jhi on 2000/03/03 01:50:07
+ Log: detypo
+ Branch: cfgperl
+ ! t/op/pack.t
____________________________________________________________________________
-[ 1709] By: gsar on 1998/08/02 07:27:34
- Log: Porting/makerel tweaks
- Branch: maint-5.005/perl
- ! Porting/makerel
+[ 5459] By: gsar on 2000/03/03 01:46:35
+ Log: pod tweaks
+ Branch: perl
+ ! pod/perl.pod pod/perlpod.pod
____________________________________________________________________________
-[ 1708] By: gsar on 1998/08/02 07:09:35
- Log: fixes for pod noises
- Branch: maint-5.005/perl
- ! ext/B/B/Bytecode.pm ext/Thread/Thread/Specific.pm
- ! pod/perlembed.pod pod/perlfaq.pod
+[ 5458] By: jhi on 2000/03/03 01:25:21
+ Log: solaris hints tweak
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1707] By: gsar on 1998/08/02 06:59:47
- Log: malloc.c tweaks
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sat, 01 Aug 1998 18:46:32 EDT
- Message-Id: <199808012246.SAA00699@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.005_*] Better malloc.c
- Branch: maint-5.005/perl
- ! malloc.c
+[ 5457] By: jhi on 2000/03/02 22:56:49
+ Log: detypo
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1706] By: gsar on 1998/08/02 06:56:37
- Log: fix quoting of keys with embedded nulls
- From: Slaven Rezic <eserte@cs.tu-berlin.de>
- Date: Sat, 01 Aug 1998 13:38:03 +0200
- Message-Id: <199808011138.NAA05189@mail.cs.tu-berlin.de>
- Subject: Data::Dumper 2.09, patch
- Branch: maint-5.005/perl
- ! ext/Data/Dumper/Dumper.xs
+[ 5456] By: gsar on 2000/03/02 21:15:11
+ Log: Test::Harness uses $ENV{HARNESS_PERL_SWITCHES} when running perl;
+ add test targets for -C switch on windows
+ Branch: perl
+ ! lib/Test/Harness.pm win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 1705] By: gsar on 1998/08/02 06:50:07
- Log: From: pvhp@forte.com (Peter Prymmer)
- Date: Fri, 31 Jul 1998 14:50:41 PDT
- Message-Id: <9807312150.AA08867@forte.com>
- Subject: Re: \Q doesn't work in interpolated regular expressions
- Branch: maint-5.005/perl
- ! pod/perlre.pod
+[ 5455] By: gsar on 2000/03/02 21:06:49
+ Log: add note about failed tests on memory starved systems (from
+ Andy Dougherty)
+ Branch: perl
+ ! INSTALL
____________________________________________________________________________
-[ 1704] By: gsar on 1998/08/02 06:37:06
- Log: add test for magic autovivification
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Date: Thu, 30 Jul 1998 12:18:15 +0100
- Message-Id: <E0z1qit-0003O5-00@taurus.cus.cam.ac.uk>
- Subject: Re: Perl5.005_01 failing to autovivify subroutine args
- Branch: maint-5.005/perl
- ! pod/perldiag.pod t/cmd/subval.t
+[ 5454] By: jhi on 2000/03/02 21:03:35
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes lib/Pod/Find.pm lib/Pod/Html.pm lib/Pod/Man.pm
+ !> lib/Term/Cap.pm lib/Test/Harness.pm lib/blib.pm
+ !> pod/perldata.pod pod/perldelta.pod pod/perlop.pod
____________________________________________________________________________
-[ 1703] By: gsar on 1998/08/02 06:26:57
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 21 Jul 1998 23:58:53 -0400 (EDT)
- Message-Id: <199807220358.XAA19811@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_76] better RE colors
- Branch: maint-5.005/perl
- ! ext/re/re.pm regcomp.c regexec.c thrdvar.h
+[ 5453] By: jhi on 2000/03/02 20:58:43
+ Log: Further long double patches from Spider Boardman.
+ Branch: cfgperl
+ ! t/comp/use.t t/lib/bigfltpm.t t/op/pack.t t/op/universal.t
____________________________________________________________________________
-[ 1702] By: gsar on 1998/08/02 06:22:15
- Log: mark link type of exported functions for OS/2
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sun, 26 Jul 1998 21:03:03 -0400 (EDT)
- Message-Id: <199807270103.VAA04977@monk.mps.ohio-state.edu>
- Subject: Re: Compiler linkage's types [PATCH 5.005]
- Branch: maint-5.005/perl
- ! os2/os2ish.h proto.h
+[ 5452] By: gsar on 2000/03/02 20:52:08
+ Log: move doc about v-strings from perlop to perldata (suggested by
+ David Dyck <dcd@tc.fluke.com>)
+ Branch: perl
+ ! pod/perldata.pod pod/perldelta.pod pod/perlop.pod
____________________________________________________________________________
-[ 1701] By: gsar on 1998/08/02 06:16:03
- Log: tweaked version of suggested patch
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 20 Jul 1998 21:40:00 -0400 (EDT)
- Message-Id: <199807210140.VAA17186@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_75] Enable -DS
- Branch: maint-5.005/perl
- ! README.threads ext/Thread/Thread.xs ext/Thread/typemap mg.c
- ! op.c perl.c perl.h pod/perlrun.pod pp.c pp_hot.c scope.c
- ! thread.h util.c win32/win32thread.c
+[ 5451] By: gsar on 2000/03/02 20:30:29
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure hints/irix_6.sh pp.c
____________________________________________________________________________
-[ 1700] By: gsar on 1998/08/02 05:54:00
- Log: up patchlevel to 5.005_02
- Branch: maint-5.005/perl
- ! Changes patchlevel.h win32/Makefile win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+[ 5450] By: gsar on 2000/03/02 20:08:10
+ Log: still other multiline match cleanups (from Greg Bacon)
+ Branch: perl
+ ! Changes lib/Pod/Find.pm lib/Pod/Html.pm lib/Pod/Man.pm
+ ! lib/Term/Cap.pm lib/Test/Harness.pm lib/blib.pm
____________________________________________________________________________
-[ 1699] By: gsar on 1998/08/02 05:50:01
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199807180809.EAA09379@monk.mps.ohio-state.edu>
- Date: Sat, 18 Jul 1998 04:09:26 -0400 (EDT)
- Subject: [PATCH 5.004_72] Make tests succeed on OS/2
- Branch: maint-5.005/perl
- ! t/io/fs.t t/lib/io_pipe.t t/lib/io_sock.t t/op/stat.t
+[ 5449] By: jhi on 2000/03/02 20:01:58
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> configure.com ext/File/Glob/Glob.pm ext/File/Glob/bsd_glob.c
+ !> lib/ExtUtils/MM_VMS.pm lib/Test/Harness.pm t/lib/glob-basic.t
+ !> t/pragma/warn/8signal t/pragma/warn/pp_ctl
+ !> vms/descrip_mms.template vms/gen_shrfls.pl
+ !> vms/subconfigure.com vms/vms.c win32/Makefile
+ !> win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 5448] By: jhi on 2000/03/02 20:00:37
+ Log: workaround for Tru64 compiler bug (cleaner fix will have
+ to wait until 5.6.1), from Spider Boardman
+ Branch: cfgperl
+ ! pp.c
____________________________________________________________________________
-[ 1698] By: gsar on 1998/08/02 05:41:41
- Log: use I32_MAX as the limit when U16_MAX > I32_MAX (for CRAY)
- Branch: maint-5.005/perl
- ! regcomp.c
+[ 5447] By: jhi on 2000/03/02 19:52:34
+ Log: Workaround for an optimizer bug.
+ Branch: cfgperl
+ ! hints/irix_6.sh
____________________________________________________________________________
-[ 1697] By: gsar on 1998/08/02 05:20:12
- Log: support OE/MVS
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Message-Id: <199808010903.MAA09371@alpha.hut.fi>
- Date: Sat, 1 Aug 1998 12:03:02 +0300 (EET DST)
- Subject: [PATCH] 5.005_01: OE MVS
- Branch: maint-5.005/perl
- + README.os390 ebcdic.c
- ! Configure MANIFEST doio.c ext/Errno/Errno_pm.PL gv.c handy.h
- ! hints/os390.sh lib/bigint.pl mg.c patchlevel.h perl.c perl.h
- ! perly.c perly.h perly.y perly_c.diff pod/perldelta.pod
- ! pod/perlport.pod pp.c pp_ctl.c pp_hot.c pp_sys.c sv.c
- ! t/base/term.t t/comp/package.t t/comp/require.t
- ! t/lib/bigintpm.t t/lib/cgi-html.t t/lib/filehand.t t/lib/ph.t
- ! t/op/auto.t t/op/bop.t t/op/each.t t/op/magic.t t/op/misc.t
- ! t/op/ord.t t/op/pack.t t/op/quotemeta.t t/op/re_tests
- ! t/op/regexp.t t/op/sort.t t/op/sprintf.t t/op/subst.t
- ! t/op/taint.t t/op/universal.t t/pragma/constant.t
- ! t/pragma/overload.t t/pragma/subs.t toke.c x2p/a2p.h
- ! x2p/a2py.c
-____________________________________________________________________________
-[ 1696] By: gsar on 1998/08/02 05:03:09
- Log: VMS patches
- From: pvhp@forte.com (Peter Prymmer)
- Message-Id: <9807290017.AA01833@forte.com>
- Date: Tue, 28 Jul 98 17:17:33 PDT
- Subject: Re: Not OK: perl 5.00501 on VMS_AXP-thread I7.2
- --
- From: Dan Sugalski <sugalskd@osshe.edu>
- Message-Id: <3.0.5.32.19980729125623.00b562b0@ous.edu>
- Date: Wed, 29 Jul 1998 12:56:23 -0700
- Subject: [PATCH 5.005_01]Typo in CONFIGURE.COM (vms)
- --
- From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Thu, 30 Jul 1998 09:02:24 -0700
- Message-Id: <3.0.5.32.19980730090224.00b70eb0@ous.edu>
- Subject: [PATCH 5.005_01]VMS config SOCKETSHR typo patch and fcntl check
- Branch: maint-5.005/perl
- ! configure.com vms/subconfigure.com
+[ 5446] By: jhi on 2000/03/02 19:44:35
+ Log: installation directory fix from Andy Dougherty
+ (installstyle was being clobbered, spotted by Spider Boardman)
+ Branch: cfgperl
+ ! Configure
+ Branch: metaconfig
+ ! U/installdirs/installstyle.U
____________________________________________________________________________
-[ 1695] By: gsar on 1998/08/02 04:49:32
- Log: rename duplicate warning in regexec.c
- Branch: maint-5.005/perl
- ! regexec.c
+[ 5445] By: gsar on 2000/03/02 19:40:44
+ Log: patch to fix mingw32 build under USE_IMP_SYS (from Benjamin Stuhl);
+ some parts not applied
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk win32/perllib.c win32/win32.c
+ ! win32/win32.h
____________________________________________________________________________
-[ 1694] By: gsar on 1998/08/02 04:44:20
- Log: beware egcs' ld on Solaris
- From: Tom Spindler <dogcow@home.merit.edu>
- Message-ID: <19980801212158.A2934@home.merit.edu>
- Date: Sat, 1 Aug 1998 21:21:58 -0400
- Subject: Re: [PATCH perl5.005_01] hints/solaris_2.sh, egcs, and ld
- Branch: maint-5.005/perl
- ! hints/solaris_2.sh
+[ 5444] By: gsar on 2000/03/02 19:26:08
+ Log: avoid buffering issue in warn/8signal
+ Branch: perl
+ ! t/pragma/warn/8signal
____________________________________________________________________________
-[ 1693] By: gsar on 1998/08/02 04:41:43
- Log: de-utf-ized variation of Ilya's patch
- From: Jan-Pieter Cornet <johnpc@xs4all.net>
- Date: 31 Jul 1998 12:44:57 +0200
- Message-ID: <6ps779$hmj$1@xs1.xs4all.nl>
- Subject: Re: s/\s*$//g in majordomo causes segfault under 5.005_01
- Branch: maint-5.005/perl
- ! regexec.c
+[ 5443] By: gsar on 2000/03/02 18:13:28
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure config_h.SH hints/aix.sh hints/hpux.sh
+ !> hints/solaris_2.sh makedepend.SH sv.c t/lib/syslfs.t
+ !> t/op/lfs.t t/op/pack.t
____________________________________________________________________________
-[ 1692] By: gsar on 1998/08/02 04:39:14
- Log: better validation of SysV IPC availability
- From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
- Date: Fri, 31 Jul 1998 13:13:57 +0300 (EEST)
- Message-Id: <199807311013.NAA28887@koah.research.nokia.com>
- Subject: Re: lib/ipc_sysv.t fails under FreeBSD 2.2.1
- Branch: maint-5.005/perl
- ! Configure INSTALL ext/IPC/SysV/SysV.xs pod/perldiag.pod
- ! t/lib/ipc_sysv.t
+[ 5442] By: gsar on 2000/03/02 18:02:40
+ Log: integrate vmsperl changes into mainline (denied their changes to
+ Glob.pm, t/pragma/warn/{8signal,pp_ctl})
+ Branch: perl
+ !> configure.com ext/File/Glob/Glob.pm ext/File/Glob/bsd_glob.c
+ !> lib/ExtUtils/MM_VMS.pm lib/Test/Harness.pm t/lib/glob-basic.t
+ !> t/pragma/warn/8signal t/pragma/warn/pp_ctl
+ !> vms/descrip_mms.template vms/gen_shrfls.pl
+ !> vms/subconfigure.com vms/vms.c
____________________________________________________________________________
-[ 1691] By: gsar on 1998/08/02 04:32:30
- Log: fix bug in display of watched expressions
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Thu, 30 Jul 1998 20:02:04 -0400 (EDT)
- Message-Id: <199807310002.UAA21681@monk.mps.ohio-state.edu>
- Subject: Re: Bug? in perl5db.pl [PATCH]
- Branch: maint-5.005/perl
- ! lib/perl5db.pl
+[ 5441] By: jhi on 2000/03/02 17:56:20
+ Log: nit from Spider Boardman
+ Branch: cfgperl
+ ! makedepend.SH
____________________________________________________________________________
-[ 1690] By: gsar on 1998/08/02 04:29:08
- Log: applied all but one hunk
- From: Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
- Date: Thu, 30 Jul 1998 17:19:42 -0400
- Message-Id: <199807302119.RAA06852@sleipnir.valparaiso.cl>
- Subject: Some typos in perldelta.pod
- Branch: maint-5.005/perl
- ! pod/perldelta.pod
+[ 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.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/aix.sh hints/hpux.sh
+ Branch: metaconfig/U/perl
+ ! uselfs.U
+____________________________________________________________________________
+[ 5439] By: jhi on 2000/03/02 15:32:04
+ Log: Remove the pack.t kludge introduced to fudge the test
+ to pass under long doubles: leave the similar kludge
+ to posix.t because POSIX::strtod() is still double,
+ not long double.
+ Branch: cfgperl
+ ! t/op/pack.t
____________________________________________________________________________
-[ 1689] By: gsar on 1998/08/02 04:27:02
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Thu, 30 Jul 1998 10:22:36 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980730101627.17514B-100000@newton.phys>
- Subject: [PATCH 5.005_05] Remove redundant dTHR
- Branch: maint-5.005/perl
- ! mg.c sv.c
+[ 5438] By: jhi on 2000/03/02 04:58:48
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/ExtUtils/Install.pm lib/ExtUtils/Installed.pm
+ !> lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm lib/FindBin.pm
+ !> lib/Pod/Html.pm op.c
____________________________________________________________________________
-[ 1688] By: gsar on 1998/08/02 04:25:49
- Log: From: Tom Hughes <thh@cyberscience.com>
- Date: 30 Jul 1998 09:47:31 +0100
- Message-ID: <yek1zr3vi70.fsf@elva.cyberscience.com>
- Subject: Class::Struct has an incomplete tied array package
- Branch: maint-5.005/perl
- ! lib/Class/Struct.pm
+[ 5437] By: jhi on 2000/03/02 04:51:46
+ Log: A patch on #5407.
+ Branch: cfgperl
+ ! sv.c
+____________________________________________________________________________
+[ 5436] By: gsar on 2000/03/02 04:45:37
+ Log: avoid useless comparison
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 5435] By: bailey on 2000/03/02 04:43:11
+ Log: YA sync with mainline
+ Branch: vmsperl
+ +> lib/open.pm pod/perlboot.pod pod/perlnumber.pod
+ +> t/lib/env-array.t
+ !> (integrate 150 files)
+____________________________________________________________________________
+[ 5434] By: gsar on 2000/03/02 04:28:48
+ Log: make the "back to top" links optional
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 5433] By: bailey on 2000/03/02 04:26:58
+ Log: Protect manipulation of open pipe list from concurrent ASTs (Charles Lane)
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5432] By: bailey on 2000/03/02 04:20:51
+ Log: Update dependencies and remove obsolete VAXC support
+ Branch: vmsperl
+ ! vms/descrip_mms.template
+____________________________________________________________________________
+[ 5431] By: bailey on 2000/03/02 04:19:42
+ Log: Rmeove obsolete VAXC support
+ Branch: vmsperl
+ ! vms/gen_shrfls.pl
+____________________________________________________________________________
+[ 5430] By: bailey on 2000/03/02 04:18:57
+ Log: Minor updates to subconfigure.com:
+ - remove old VAXC support
+ - avoid echoing commands to tempfiles
+ - fix typos
+ - define 64bit symbols (as "undef") when not using 64 bit support
+ Branch: vmsperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 5429] By: bailey on 2000/03/02 04:16:11
+ Log: Minor changes to Configure.Com:
+ - permit operation in batch mode (splits output)
+ - remove old VAXC support
+ - default to enabling secure internal lnm translation
+ Branch: vmsperl
+ ! configure.com
+____________________________________________________________________________
+[ 5428] By: bailey on 2000/03/02 04:06:53
+ Log: Optional warning for truncated logical name equivalence string (Dan Sugalski)
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5427] By: bailey on 2000/03/02 04:05:47
+ Log: FIx no-op in vms.c
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5426] By: bailey on 2000/03/02 04:04:52
+ Log: MIscellaneous tweaks to test and driver (Charles Lane)
+ Branch: vmsperl
+ ! t/pragma/warn/8signal t/pragma/warn/pp_sys t/pragma/warnings.t
+ ! vms/test.com
+____________________________________________________________________________
+[ 5425] By: bailey on 2000/03/02 04:02:44
+ Log: Take advantage of new subprocess invocation (Charles Lane)
+ Branch: vmsperl
+ ! t/op/runlevel.t t/pragma/strict.t t/pragma/subs.t
+ ! t/pragma/warnings.t
+____________________________________________________________________________
+[ 5424] By: bailey on 2000/03/02 04:00:20
+ Log: Increment counter for skipped tests (Charles Lane)
+ Branch: vmsperl
+ ! t/io/open.t
+____________________________________________________________________________
+[ 5423] By: bailey on 2000/03/02 03:59:14
+ Log: Remove redundant elements of @INC to cope with VMS' 255-char limit
+ on PERL5LIB logical (Dan Sugalski)
+ Branch: vmsperl
+ ! lib/Test/Harness.pm
+____________________________________________________________________________
+[ 5422] By: bailey on 2000/03/02 03:57:40
+ Log: Use temp to construct dirspec in File::Find (Charles Lane)
+ Branch: vmsperl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 5421] By: bailey on 2000/03/02 03:56:13
+ Log: Satisfy various Pod::* needs for Unix syntax (Charles Lane)
+ (Should move to File::Spec in long term)
+ Branch: vmsperl
+ ! lib/Pod/Checker.pm lib/Pod/Parser.pm t/pod/testp2pt.pl
+____________________________________________________________________________
+[ 5420] By: bailey on 2000/03/02 03:52:45
+ Log: Escape \n in commands written to Descrip.MMS (Charles Lane)
+ Branch: vmsperl
+ ! lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 5419] By: bailey on 2000/03/02 03:50:53
+ Log: Make File::Glob more VMS-friendly (Charles Lane)
+ Branch: vmsperl
+ ! ext/File/Glob/Glob.pm ext/File/Glob/bsd_glob.c
+ ! t/lib/glob-basic.t
+____________________________________________________________________________
+[ 5418] By: bailey on 2000/03/02 03:47:21
+ Log: Miscellaneous fixes to build procedures (Peter Prymmer)
+ Branch: vmsperl
+ ! configure.com vms/subconfigure.com
+____________________________________________________________________________
+[ 5417] By: bailey on 2000/03/02 03:42:49
+ Log: Temrinate statements in pp_ctl warning test (Charles Lane)
+ Branch: vmsperl
+ ! t/pragma/warn/pp_ctl
+____________________________________________________________________________
+[ 5416] By: bailey on 2000/03/02 03:39:46
+ Log: Warn but continue installing when file missing (Dan Sugalski)
+ Branch: vmsperl
+ ! installperl
+____________________________________________________________________________
+[ 5415] By: jhi on 2000/03/01 23:31:23
+ Log: Make file sparseness detection more portable (Scott Henry)
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
____________________________________________________________________________
-[ 1687] By: gsar on 1998/08/02 04:21:48
- Log: ensure implicit close on local(*FH) doesn't affect $! and thence $?
- Branch: maint-5.005/perl
- ! sv.c t/op/die_exit.t
+[ 5414] By: jhi on 2000/03/01 22:53:48
+ Log: detypo #5411 continues: Sun grep doesn't have -e.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1686] By: gsar on 1998/08/02 03:57:28
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Thu, 30 Jul 1998 00:39:30 +0300 (EET DST)
- Message-Id: <199807292139.AAA01795@alpha.hut.fi>
- Subject: Re: [PATCH] 5.004_05-MAINT_TRIAL_5: three locale fixes
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.xs pod/perllocale.pod
+[ 5413] By: jhi on 2000/03/01 22:49:44
+ Log: detypo #5411
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1685] By: gsar on 1998/08/02 03:54:15
- Log: PERL_OBJECT bincompat fixes from Douglas Lankshear <dougl@ActiveState.com>
- Date: Wed, 29 Jul 1998 10:45:31 -0700
- Message-ID: <000101bdbb18$ae767550$a32fa8c0@tau.Active>
- Subject: [PATCH 5.005_01] Fixes binary compatibility for PERL_OBJECT
- --
- Date: Sat, 1 Aug 1998 09:33:19 -0700
- Message-ID: <000701bdbd6a$17ada180$a32fa8c0@tau.Active>
- Subject: [PATCH 5.005_01]
- Branch: maint-5.005/perl
- ! perl.h proto.h
-____________________________________________________________________________
-[ 1684] By: gsar on 1998/08/02 03:49:33
- Log: hand-apply whitespace-mutiliated patch
- From: Nicholas Clark <nick@flirble.org>
- Date: Tue, 28 Jul 1998 16:40:42 +0100 (BST)
- Message-Id: <199807281540.QAA04640@flirble.org>
- Subject: [PATCH] POSIX::ELOOP
- Branch: maint-5.005/perl
- ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs
+[ 5412] By: gsar on 2000/03/01 20:04:42
+ Log: typo in change#5408
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
____________________________________________________________________________
-[ 1683] By: gsar on 1998/08/02 03:45:26
- Log: document return values of do() better
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Date: Tue, 28 Jul 1998 12:44:36 +0100
- Message-Id: <E0z18BI-0003cH-00@taurus.cus.cam.ac.uk>
- Subject: [PATCH] Re: Obscurity of lexicals with do ""
- Branch: maint-5.005/perl
- ! pod/perlfunc.pod
+[ 5411] By: jhi on 2000/03/01 18:48:52
+ Log: Better detection of the solaris workshop compiler.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1682] By: gsar on 1998/08/02 03:42:26
- Log: avoid reusing foreach itervar if magic got tacked onto it
- From: Stephen McCamant <alias@mcs.com>
- Date: Tue, 28 Jul 1998 22:18:25 -0500 (CDT)
- Message-ID: <13758.36756.215424.719750@alias-2.pr.mcs.net>
- Subject: [PATCH] Re: pos() resetting changed with 5.005?
- Branch: maint-5.005/perl
- ! pp_hot.c
+[ 5410] By: jhi on 2000/03/01 18:18:04
+ Log: From: Robin Barker <rmb1@cise.npl.co.uk>
+ To: perl5-porters@perl.org
+ Subject: solaris 64-bit and gcc
+ Date: Wed, 1 Mar 2000 17:59:36 GMT
+ Message-Id: <200003011759.RAA03938@tempest.npl.co.uk>
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1681] By: gsar on 1998/08/02 03:39:27
- Log: From: Nick Ing-Simmons <nik@tiuk.ti.com>
- Date: Wed, 29 Jul 1998 13:28:14 +0100
- Message-Id: <199807291228.NAA20055@tiuk.ti.com>
- Subject: [Patch] Math::Complex - Ambiguous call resolved as CORE::foo()
- Branch: maint-5.005/perl
- + Porting/fixCORE
- ! MANIFEST lib/Math/Complex.pm
-____________________________________________________________________________
-[ 1680] By: gsar on 1998/08/02 03:33:07
- Log: From: h.sanden@elsevier.nl (Hugo van der Sanden)
- Date: Mon, 27 Jul 1998 13:34:45 +0200
- Message-Id: <199807271134.NAA24475@dorlas.elsevier.nl>
- Subject: perlcall.pod
- Branch: maint-5.005/perl
- ! pod/perlcall.pod
+[ 5409] By: jhi on 2000/03/01 18:16:43
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/lib/env-array.t
+ !> MANIFEST README.cygwin ext/DynaLoader/DynaLoader_pm.PL
+ !> ext/DynaLoader/dlutils.c lib/AutoLoader.pm lib/AutoSplit.pm
+ !> lib/CGI/Carp.pm lib/CPAN.pm lib/Cwd.pm lib/Env.pm
+ !> lib/File/Find.pm lib/File/Spec/Mac.pm lib/File/Spec/VMS.pm
+ !> pod/perldebug.pod pod/perldelta.pod t/lib/env.t
+ !> t/lib/filefind.t t/lib/glob-basic.t
+____________________________________________________________________________
+[ 5408] By: gsar on 2000/03/01 18:15:49
+ Log: still more multiline match cleanups (from Greg Bacon)
+ Branch: perl
+ ! lib/ExtUtils/Install.pm lib/ExtUtils/Installed.pm
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm lib/FindBin.pm
+____________________________________________________________________________
+[ 5407] By: jhi on 2000/03/01 18:11:09
+ Log: A further patch from Spider Boardman for long doubleness.
+ Branch: cfgperl
+ ! sv.c
____________________________________________________________________________
-[ 1679] By: gsar on 1998/08/02 03:29:41
- Log: MM_Win32::maybe_command() case-insesitivity tweak
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MM_Win32.pm
+[ 5406] By: gsar on 2000/03/01 17:32:09
+ Log: yet more multiline match cleanups (from Greg Bacon)
+ Branch: perl
+ ! lib/CPAN.pm lib/Cwd.pm
____________________________________________________________________________
-[ 1678] By: gsar on 1998/08/02 03:24:29
- Log: fix MM_Win32::maybe_command()
- Branch: maint-5.005/perl
- ! lib/ExtUtils/MM_Win32.pm
+[ 5405] By: gsar on 2000/03/01 17:24:53
+ Log: add support for Env arrays (from Gregor N. Purdy
+ <gregor@focusresearch.com>)
+ Branch: perl
+ + t/lib/env-array.t
+ ! MANIFEST lib/Env.pm pod/perldelta.pod t/lib/env.t
____________________________________________________________________________
-[ 1677] By: gsar on 1998/08/01 19:52:19
- Log: fixes for overloading bugs and docs, tweaked some
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sat, 25 Jul 1998 21:28:16 -0400 (EDT)
- Message-Id: <199807260128.VAA10543@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_76] better overloading
- Branch: maint-5.005/perl
- ! Changes gv.c lib/dumpvar.pl lib/overload.pm lib/perl5db.pl
- ! t/pragma/overload.t
-____________________________________________________________________________
-[ 1676] By: gsar on 1998/08/01 19:37:13
- Log: stray s/foo/PL_foo/
- From: win@in.rhein-main.de (Winfried Koenig)
- Date: Mon, 27 Jul 98 21:13 MET
- Message-Id: <m0z0teW-00019aC@incom.rhein-main.de>
- Subject: Bug in pp_rename and ISC hint
- Branch: maint-5.005/perl
- ! pp_sys.c
+[ 5404] By: gsar on 2000/03/01 17:00:23
+ Log: cygwin update (from Eric Fifer)
+ Branch: perl
+ ! README.cygwin t/lib/glob-basic.t
____________________________________________________________________________
-[ 1675] By: gsar on 1998/08/01 19:22:13
- Log: newer Porting/patchls from maint-5.004
- Branch: maint-5.005/perl
- ! Porting/patchls
+[ 5403] By: gsar on 2000/03/01 16:55:47
+ Log: more multiline match cleanups (from Greg Bacon)
+ Branch: perl
+ ! lib/AutoLoader.pm lib/AutoSplit.pm lib/CGI/Carp.pm
+ ! lib/File/Spec/Mac.pm lib/File/Spec/VMS.pm
____________________________________________________________________________
-[ 1674] By: gsar on 1998/08/01 17:50:44
- Log: fix buggy detection of failed glob()
- Branch: maint-5.005/perl
- ! pp_hot.c
+[ 5402] By: gsar on 2000/03/01 16:38:48
+ Log: avoid DProf entering dl_unload_file() (from Alan Burlison)
+ Branch: perl
+ ! ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/dlutils.c
____________________________________________________________________________
-[ 1673] By: gsar on 1998/07/29 18:14:32
- Log: fix typo in change#1489 that prevented magic-autovivification
- Branch: maint-5.005/perl
- ! mg.c
+[ 5401] By: gsar on 2000/03/01 16:35:28
+ Log: fix minor compatibility issues with finddepth() (from Helmut Jarausch)
+ Branch: perl
+ ! lib/File/Find.pm t/lib/filefind.t
+____________________________________________________________________________
+[ 5400] By: gsar on 2000/03/01 16:32:24
+ Log: mention "r" debugger command (from Ilya Zakharevich)
+ Branch: perl
+ ! pod/perldebug.pod
+____________________________________________________________________________
+[ 5399] By: jhi on 2000/03/01 14:58:33
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes configure.com ext/File/Glob/Glob.pm
+ !> ext/File/Glob/bsd_glob.c installperl lib/ExtUtils/MM_VMS.pm
+ !> lib/File/Find.pm lib/Pod/Checker.pm lib/Pod/Parser.pm
+ !> t/io/open.t t/io/openpid.t t/lib/glob-basic.t t/op/goto.t
+ !> t/op/runlevel.t t/op/split.t t/pod/testp2pt.pl
+ !> t/pragma/strict.t t/pragma/subs.t t/pragma/warn/8signal
+ !> t/pragma/warn/pp_sys t/pragma/warnings.t
+ !> vms/descrip_mms.template vms/subconfigure.com vms/test.com
+ !> vms/vms.c
+____________________________________________________________________________
+[ 5398] By: gsar on 2000/03/01 07:03:13
+ Log: fix testsuite issues in change#5397
+ Branch: perl
+ ! Changes t/pragma/warn/8signal t/pragma/warn/pp_sys
----------------
-Version 5.005_01 First maintenance release of 5.005
+Version v5.5.670
----------------
____________________________________________________________________________
-[ 1669] By: gsar on 1998/07/26 23:19:02
- Log: update Changes; add sv_*_mg() entries in win32/GenCAPI.pl
- Branch: maint-5.005/perl
- ! Changes proto.h win32/GenCAPI.pl
+[ 5397] By: gsar on 2000/03/01 06:44:42
+ Log: consolidated VMS patches (from Craig A. Berry
+ <craig.berry@metamorgs.com>); Glob.pm patch modified to use
+ $DEFAULT_FLAGS, and iff no flags were supplied
+ Branch: perl
+ ! configure.com ext/File/Glob/Glob.pm ext/File/Glob/bsd_glob.c
+ ! installperl lib/ExtUtils/MM_VMS.pm lib/File/Find.pm
+ ! lib/Pod/Checker.pm lib/Pod/Parser.pm t/io/open.t
+ ! t/io/openpid.t t/lib/glob-basic.t t/op/goto.t t/op/runlevel.t
+ ! t/op/split.t t/pod/testp2pt.pl t/pragma/strict.t
+ ! t/pragma/subs.t t/pragma/warn/8signal t/pragma/warn/pp_sys
+ ! t/pragma/warnings.t vms/descrip_mms.template
+ ! vms/subconfigure.com vms/test.com vms/vms.c
____________________________________________________________________________
-[ 1668] By: gsar on 1998/07/26 21:12:11
- Log: s/TMP_CRLF_PATCH/PERL_STRICT_CR/ with sense reversed, so they
- can disable it from config.sh if they want; up patchlevel to 5_01;
- little tweaks to pods
- Branch: maint-5.005/perl
- ! README.win32 patchlevel.h pod/perldelta.pod toke.c
- ! win32/Makefile win32/config_H.bc win32/config_H.gc
- ! win32/config_H.vc win32/makefile.mk win32/win32.c
+[ 5396] By: gsar on 2000/03/01 06:28:22
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> ext/Fcntl/Fcntl.pm hints/solaris_2.sh pp.c sv.c
____________________________________________________________________________
-[ 1662] By: gsar on 1998/07/26 05:01:52
- Log: add missing sv_*_mg() prototypes in proto.h, update perlhist.pod
- Branch: maint-5.005/perl
- ! pod/perlhist.pod proto.h
+[ 5395] By: jhi on 2000/03/01 06:12:10
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/open.pm
+ !> MANIFEST Todo-5.6 mg.c
____________________________________________________________________________
-[ 1658] By: gsar on 1998/07/26 02:23:46
- Log: VMS patches from Dan Sugalski <sugalskd@osshe.edu>
- Date: Fri, 24 Jul 1998 11:38:25 -0700
- Message-Id: <3.0.5.32.19980724113825.00a067b0@ous.edu>
- Subject: [PATCH 5.005] version number problem with VMS (Corrected)
- --
- Date: Fri, 24 Jul 1998 12:30:36 -0700
- Message-Id: <3.0.5.32.19980724123036.009f0390@ous.edu>
- Subject: [PATCH 5.005]Tweaks to README.vms
- --
- Date: Sat, 25 Jul 1998 17:56:55 -0700 (PDT)
- Message-ID: <Pine.GSO.3.96.980725175626.15740D-100000@netserve.ous.edu>
- Subject: [PATCH 5.005] Final build cleanup patch
- Branch: maint-5.005/perl
- ! README.vms vms/descrip_mms.template vms/subconfigure.com
+[ 5394] By: gsar on 2000/03/01 06:07:00
+ Log: fix segfault on C<local ${^WARNING_BITS}>
+ Branch: perl
+ ! mg.c
____________________________________________________________________________
-[ 1657] By: gsar on 1998/07/26 02:19:50
- Log: another platform where pp_sselect() needs a whole fd_set buffer
- From: Lupe Christoph <lupe@alanya.m.isar.de>
- Date: Sat, 25 Jul 1998 19:49:33 +0200 (MET DST)
- Message-Id: <199807251749.TAA22347@alanya.m.isar.de>
- Subject: Patch for Not OK: perl 5.005 on i86pc-solaris-thread 2.6
- Branch: maint-5.005/perl
- ! pp_sys.c
+[ 5393] By: jhi on 2000/03/01 06:02:12
+ Log: Fcntl de-cut-and-pasto.
+ From: Doug MacEachern <dougm@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH v5.5.660] Fcntl.pm
+ Date: Tue, 29 Feb 2000 21:24:00 -0800 (PST)
+ Message-ID: <Pine.LNX.4.10.10002292120200.382-100000@mojo.itixs.com>
+ Branch: cfgperl
+ ! ext/Fcntl/Fcntl.pm
____________________________________________________________________________
-[ 1656] By: gsar on 1998/07/26 02:12:46
- Log: fix problem building modules on dos-djgpp
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Date: Sat, 25 Jul 1998 00:53:39 +0200
- Message-ID: <19980725005339.C222@cdata.tvnet.hu>
- Subject: [PATCH 5.005] dos-djgpp and modules problem
- Branch: maint-5.005/perl
- ! djgpp/fixpmain
+[ 5392] By: gsar on 2000/03/01 05:55:20
+ Log: update Todo-5.6, add stub open.pm
+ Branch: perl
+ + lib/open.pm
+ ! MANIFEST Todo-5.6
____________________________________________________________________________
-[ 1655] By: gsar on 1998/07/26 02:11:09
- Log: From: Tom Spindler <dogcow@home.merit.edu>
- Date: Wed, 22 Jul 1998 16:11:07 -0400
- Message-ID: <19980722161107.A16813@home.merit.edu>
- Subject: [PATCH 5.005] BeOS tweak
- Branch: maint-5.005/perl
- ! hints/beos.sh
+[ 5391] By: jhi on 2000/03/01 05:42:25
+ Log: The 64-bitallness does require the /usr/lib/sparcv9 in loclibpth.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 1654] By: gsar on 1998/07/26 02:09:29
- Log: various pod tweaks
- Branch: maint-5.005/perl
- ! Changes pod/perldelta.pod pod/perlmodinstall.pod
- ! pod/perltoc.pod
+[ 5390] By: jhi on 2000/03/01 05:35:53
+ Log: Couple of math functions need to be Perl_ so that
+ they are correctly long double, especially the frexp()
+ in sv_vcatpvfn() (spotted by Spider Boardman).
+ Branch: cfgperl
+ ! pp.c sv.c
____________________________________________________________________________
-[ 1653] By: gsar on 1998/07/26 02:05:46
- Log: fix emacs/ptags for PL_* changes
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Fri, 24 Jul 1998 03:12:35 -0400 (EDT)
- Message-Id: <199807240712.DAA04204@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_76] Yet better ptags
- Branch: maint-5.005/perl
- ! emacs/ptags
+[ 5389] By: jhi on 2000/03/01 05:33:54
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> pod/perlnumber.pod
+ !> Changes MANIFEST README.win32 ext/DynaLoader/DynaLoader_pm.PL
+ !> ext/DynaLoader/Makefile.PL ext/DynaLoader/dl_dlopen.xs
+ !> ext/DynaLoader/dlutils.c lib/File/Find.pm lib/Test/Harness.pm
+ !> pod/Makefile pod/buildtoc pod/perl.pod pod/perldelta.pod
+ !> pod/perlguts.pod pod/perlhack.pod pod/perlhist.pod
+ !> pod/perlport.pod pod/perltoc.pod pod/roffitall vms/vms.c
+ !> win32/perllib.c win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 1652] By: gsar on 1998/07/26 02:03:01
- Log: fix behavior of <=> on bigints
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Message-Id: <E0yzlfF-0004kz-00@taurus.cus.cam.ac.uk>
- Date: Fri, 24 Jul 1998 18:29:53 +0100
- Subject: [PATCH] Re: Math::BigInt <=> op is not correct.
- Branch: maint-5.005/perl
- ! lib/Math/BigInt.pm t/lib/bigintpm.t
+[ 5388] By: gsar on 2000/03/01 03:38:03
+ Log: Windows miscellany
+ Branch: perl
+ ! pod/perlguts.pod win32/perllib.c win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 1649] By: gsar on 1998/07/24 03:56:56
- Log: create maint-5.005 branch
- Branch: maint-5.005/perl
- +> (branch 1079 files)
+[ 5387] By: gsar on 2000/03/01 03:13:37
+ Log: mention ftp/rsync access to repository in perlhack
+ Branch: perl
+ ! Changes pod/perlhack.pod pod/perlhist.pod
____________________________________________________________________________
-[ 1648] By: gsar on 1998/07/24 03:36:35
- Log: un-checked-in 5.005 Changes (this is 5.005 *exactly*)
+[ 5386] By: gsar on 2000/03/01 03:04:54
+ Log: support kill(0,$pid) on Windows to test if process exists
Branch: perl
- ! Changes
-
--------------
-Version 5.005 Production release
--------------
-
+ ! README.win32 pod/perldelta.pod pod/perlport.pod win32/win32.c
____________________________________________________________________________
-[ 1647] By: gsar on 1998/07/22 21:11:29
- Log: sneak in hints/irix_6.sh update
+[ 5385] By: gsar on 2000/03/01 02:10:01
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! Changes hints/irix_6.sh
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH epoc/config.sh hints/dec_osf.sh hints/solaris_2.sh
+ !> perl.h vms/subconfigure.com vos/config.def win32/config.bc
+ !> win32/config.gc win32/config.vc
____________________________________________________________________________
-[ 1646] By: gsar on 1998/07/22 21:00:44
- Log: Update perldelta and Changes; refresh perltoc; newer perlembed.pod
- from Jon Orwant <orwant@media.mit.edu>; update guts documentation
- to reflect PL_* changes; is this *it* for 5.005?
+[ 5384] By: gsar on 2000/03/01 01:47:55
+ Log: oops, change#5382 didn't really fix the typo
Branch: perl
- ! Changes README.win32 patchlevel.h pod/perlcall.pod
- ! pod/perldelta.pod pod/perlembed.pod pod/perlguts.pod
- ! pod/perltoc.pod pod/perlxs.pod
+ ! ext/DynaLoader/dl_dlopen.xs
____________________________________________________________________________
-[ 1645] By: gsar on 1998/07/22 19:37:41
- Log: don't use qualify() in class methods
- From: Albert Dvornik <bert@genscan.com>
- Date: 22 Jul 1998 15:14:46 EDT
- Message-Id: <tqbtqhlmu1.fsf_-_@puma.genscan.com>
- Subject: [PATCH 5.005-MAYBE] Bug in IO::Handle->input_record_separator
+[ 5383] By: gsar on 2000/03/01 01:38:25
+ Log: avoid warning on type-mismatch
Branch: perl
- ! ext/IO/lib/IO/Handle.pm
+ ! ext/DynaLoader/dlutils.c
____________________________________________________________________________
-[ 1644] By: gsar on 1998/07/22 18:13:31
- Log: newer perlembed.pod
+[ 5382] By: gsar on 2000/03/01 01:33:42
+ Log: fix bug in change#5381
Branch: perl
- ! pod/perlembed.pod
+ ! ext/DynaLoader/dl_dlopen.xs
____________________________________________________________________________
-[ 1643] By: gsar on 1998/07/22 18:03:42
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Wed, 22 Jul 1998 13:42:20 EDT
- Message-Id: <Pine.SUN.3.96.980722134049.10073C-100000@newton.phys>
- Subject: Re: 5.005 - a sneak preview
+[ 5381] By: gsar on 2000/03/01 00:46:44
+ Log: unload extension shared objects when exiting, implemented
+ only for dl_dlopen.xs (from Alan Burlison)
Branch: perl
- ! Porting/pumpkin.pod
+ ! ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/Makefile.PL
+ ! ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dlutils.c
____________________________________________________________________________
-[ 1642] By: gsar on 1998/07/22 17:58:42
- Log: add perlmodinstall, regen perltoc
+[ 5380] By: gsar on 2000/03/01 00:34:10
+ Log: add perlnumber.pod (from Ilya Zakharevich); substantially edited
+ prose
Branch: perl
- + pod/perlmodinstall.pod
+ + pod/perlnumber.pod
! MANIFEST pod/Makefile pod/buildtoc pod/perl.pod
- ! pod/perltoc.pod win32/pod.mak
+ ! pod/perltoc.pod pod/roffitall
+____________________________________________________________________________
+[ 5379] By: jhi on 2000/02/29 23:37:01
+ Log: Be understanding.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! use64bits.U uselfs.U
____________________________________________________________________________
-[ 1641] By: gsar on 1998/07/22 17:11:55
- Log: support optional crypt() with PERL_OBJECT
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Date: Wed, 22 Jul 1998 08:21:10 PDT
- Message-Id: <000701bdb584$5b57c070$a32fa8c0@tau.Active>
- Subject: [PATCH 5.005 maybe] for crypt with PERL_OBJECT
+[ 5378] By: gsar on 2000/02/29 23:35:50
+ Log: VMS fixups (from Dan Sugalski); cosmetic tweaks
Branch: perl
- ! iperlsys.h pp.c win32/Makefile win32/makefile.mk
- ! win32/perlhost.h win32/win32.c win32/win32iop.h
+ ! lib/Test/Harness.pm vms/vms.c
____________________________________________________________________________
-[ 1640] By: gsar on 1998/07/22 17:09:11
- Log: win32 tweaks
- Date: Wed, 22 Jul 1998 07:09:09 PDT
- Message-Id: <000001bdb57a$4bc9dd00$a32fa8c0@tau.Active>
- From: "Douglas Lankshear" <dougl@ActiveState.com>
+[ 5377] By: jhi on 2000/02/29 23:12:29
+ Log: Tru64 hints fix from Spider Boardman; Tru64 hint for
+ d_Gconvert on long doubles to use sprintf %Lg.
+ Branch: cfgperl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 5376] By: jhi on 2000/02/29 23:02:45
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> gv.c lib/Pod/Html.pm malloc.c pod/perlapi.pod pod/perlcall.pod
+ !> pod/perldiag.pod pod/perlembed.pod pod/perlfunc.pod
+ !> pod/perlguts.pod pod/perlop.pod
+____________________________________________________________________________
+[ 5375] By: gsar on 2000/02/29 23:02:34
+ Log: fix File::Find::finddepth() bugs (from Helmut Jarausch)
+ Branch: perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 5374] By: jhi on 2000/02/29 23:01:35
+ Log: Add libsunmath (long double math library for Solaris,
+ SUNWspro cc only) awareness; fix various Solaris nits.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH epoc/config.sh hints/solaris_2.sh perl.h
+ ! vms/subconfigure.com vos/config.def win32/config.bc
+ ! win32/config.gc win32/config.vc
+ Branch: metaconfig
+ ! U/modified/libs.U
+ Branch: metaconfig/U/perl
+ + i_sunmath.U
+____________________________________________________________________________
+[ 5373] By: gsar on 2000/02/29 22:56:10
+ Log: fix Pod::Html to recognize C<< > >> etc., and convert some pods
+ to the more readable form (from Robin Barker)
Branch: perl
- ! win32/Makefile win32/makefile.mk win32/win32.h
+ ! lib/Pod/Html.pm pod/perlfunc.pod pod/perlop.pod
____________________________________________________________________________
-[ 1639] By: gsar on 1998/07/22 17:00:30
- Log: From: d-lewart@uiuc.edu (Daniel S. Lewart)
- Date: Wed, 22 Jul 1998 06:20:08 CDT
- Message-Id: <199807221120.GAA07962@staff2.cso.uiuc.edu>
- Subject: [PATCH] lib/Sys/Syslog.pm doc
+[ 5372] By: gsar on 2000/02/29 22:52:27
+ Log: better fix for malloc bug in change#5346 (from Dominic Dunlop)
Branch: perl
- ! Changes lib/Sys/Syslog.pm
+ ! malloc.c
____________________________________________________________________________
-[ 1638] By: gsar on 1998/07/22 09:12:26
- Log: up patchlevel etc (only doc patching from now on, testing in progress)
+[ 5371] By: gsar on 2000/02/29 22:29:36
+ Log: fix pods to reflect newer canonical names for call_sv() etc.
Branch: perl
- ! Changes patchlevel.h win32/Makefile win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+ ! gv.c pod/perlapi.pod pod/perlcall.pod pod/perldiag.pod
+ ! pod/perlembed.pod pod/perlguts.pod
____________________________________________________________________________
-[ 1637] By: gsar on 1998/07/22 08:27:09
- Log: VMS patches from Dan Sugalski <sugalskd@osshe.edu>
- Date: Tue, 21 Jul 1998 16:04:40 PDT
- Message-Id: <3.0.5.32.19980721160440.00a916f0@ous.edu>
- Subject: [PATCH 5.004_76]Document Vax C's death for VMS
- --
- Date: Tue, 21 Jul 1998 16:08:57 PDT
- Message-Id: <3.0.5.32.19980721160857.00a6d250@ous.edu>
- Subject: [PATCH 5.004_76]fix clean/realclean targets of VMS' makefile
- --
- Date: Tue, 21 Jul 1998 16:05:56 PDT
- Message-Id: <3.0.5.32.19980721160556.00a1a100@ous.edu>
- Subject: [PATCH 5.004_76]Note the record-read capabilities of $/ in perldelta.pod
+[ 5370] By: jhi on 2000/02/29 22:08:26
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> perl.c perl.h win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 5369] By: gsar on 2000/02/29 21:37:10
+ Log: remove bogus code that caused test failures on HP-UX
Branch: perl
- ! README.vms pod/perldelta.pod vms/descrip_mms.template
+ ! perl.h
____________________________________________________________________________
-[ 1636] By: gsar on 1998/07/22 08:04:37
- Log: fix quoting in t/io/inplace.t
+[ 5368] By: gsar on 2000/02/29 20:45:01
+ Log: change#5364 had a few problems
Branch: perl
- ! t/io/inplace.t
+ ! perl.c win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 1635] By: gsar on 1998/07/22 07:59:30
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Tue, 21 Jul 1998 13:06:44 PDT
- Message-Id: <3.0.5.32.19980721130644.00ac5100@ous.edu>
- Subject: [PATCH 5.004_76]t/io/inplace.t enabled for VMS
+[ 5367] By: gsar on 2000/02/29 18:19:04
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! t/io/inplace.t vms/test.com
+ !> Configure config_h.SH epoc/config.sh hints/hpux.sh
+ !> hints/solaris_2.sh regcomp.c vms/subconfigure.com
+ !> vos/config.def win32/config.bc win32/config.gc win32/config.vc
____________________________________________________________________________
-[ 1634] By: gsar on 1998/07/22 07:55:35
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Tue, 21 Jul 1998 12:42:20 PDT
- Message-Id: <3.0.5.32.19980721124220.00a82a20@ous.edu>
- Subject: [PATCH 5.004_76]Fix inplace editing for VMS
+[ 5366] By: jhi on 2000/02/29 18:15:09
+ Log: Some compilers have problems with quad switch() controls.
+ Branch: cfgperl
+ ! regcomp.c
+____________________________________________________________________________
+[ 5365] By: jhi on 2000/02/29 18:14:30
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> perl.c win32/Makefile win32/makefile.mk win32/win32.c
+ !> win32/win32.h
+____________________________________________________________________________
+[ 5364] By: gsar on 2000/02/29 18:11:34
+ Log: utf8-ize @ARGV when -C switch is used on Windows
Branch: perl
- ! doio.c
+ ! perl.c win32/Makefile win32/makefile.mk win32/win32.c
+ ! win32/win32.h
+____________________________________________________________________________
+[ 5363] By: jhi on 2000/02/29 17:47:48
+ Log: HP-UX lddlflags were broken.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! dlsrc.U
+____________________________________________________________________________
+[ 5362] By: jhi on 2000/02/29 17:32:27
+ Log: Make the failsafe question about socket address structure
+ sizes hopefully a bit less confusing.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/protos/socksizetype.U
____________________________________________________________________________
-[ 1633] By: gsar on 1998/07/22 07:53:53
- Log: fix AIX hints for PL_* changes
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 21 Jul 1998 22:53:54 +0300
- Message-Id: <199807211953.WAA55724@vipunen.hut.fi>
- Subject: Re: _76 fails to link B extension on AIX 414
+[ 5361] By: jhi on 2000/02/29 17:17:10
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> malloc.c
+____________________________________________________________________________
+[ 5360] By: gsar on 2000/02/29 17:16:09
+ Log: malloc "fix" in change#5346 coredumps on HP-UX, revert
Branch: perl
- ! perl_exp.SH
+ ! malloc.c
+____________________________________________________________________________
+[ 5359] By: jhi on 2000/02/29 17:06:12
+ Log: Make the warning about preferring HP's ar more visible.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5358] By: jhi on 2000/02/29 17:04:36
+ Log: The sprintf option was blithely printing long doubles as
+ doubles (spotted by Spider Boardman); dqgcvt() wasn't ever
+ being used; made the test more thorough.
+ Branch: cfgperl
+ ! Configure config_h.SH epoc/config.sh vms/subconfigure.com
+ ! vos/config.def win32/config.bc win32/config.gc win32/config.vc
+ Branch: metaconfig
+ ! U/compline/d_gconvert.U
+____________________________________________________________________________
+[ 5357] By: jhi on 2000/02/29 16:58:08
+ Log: Make the warning about abandoning long doubles more visible.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! uselongdbl.U
+____________________________________________________________________________
+[ 5356] By: jhi on 2000/02/29 16:51:33
+ Log: HP-UX gcc fix; detypo in use64bits.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! dlsrc.U use64bits.U
+____________________________________________________________________________
+[ 5355] By: jhi on 2000/02/29 16:31:17
+ Log: Solaris 64-bitness hints saga continues.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 5354] By: jhi on 2000/02/29 16:04:42
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> ext/Thread/Thread.xs perl.c perl.h
+____________________________________________________________________________
+[ 5353] By: jhi on 2000/02/29 15:54:10
+ Log: Solaris hints tweak for 64-bitallness.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 5352] By: jhi on 2000/02/29 15:35:13
+ Log: Too many 64-bitness option combinations.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! use64bits.U
____________________________________________________________________________
-[ 1632] By: gsar on 1998/07/22 07:51:56
- Log: From: Anton Berezin <tobez@plab.ku.dk>
- Date: Tue, 21 Jul 1998 21:46:45 +0200
- Message-Id: <199807211946.VAA01301@lion.plab.ku.dk>
- Subject: [PATCH _76] t/op/eval.t test for eval & scoping of lexicals
+[ 5351] By: gsar on 2000/02/29 15:31:56
+ Log: more adjustments needed for change#5342 under use5005threads
Branch: perl
- ! t/op/eval.t
+ ! ext/Thread/Thread.xs perl.c perl.h
____________________________________________________________________________
-[ 1631] By: gsar on 1998/07/22 07:48:20
- Log: applied patch, with tweak suggested by Michael Parker
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Tue, 21 Jul 1998 14:30:05 EDT
- Message-Id: <Pine.SUN.3.96.980721142928.8231Q-100000@newton.phys>
- Subject: Re: Not OK: _76 on IP22-irix6.2 fails tests
+[ 5350] By: jhi on 2000/02/29 15:24:59
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> pod/perlboot.pod
+ !> (integrate 40 files)
+____________________________________________________________________________
+[ 5349] By: gsar on 2000/02/29 08:13:56
+ Log: more m//s and $ vs \z fixups (from Greg Bacon)
Branch: perl
- ! hints/irix_6.sh
+ ! lib/File/CheckTree.pm lib/File/Copy.pm lib/File/DosGlob.pm
+ ! lib/File/Path.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
+ ! lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+ ! lib/File/Spec/Win32.pm
____________________________________________________________________________
-[ 1630] By: gsar on 1998/07/22 07:40:25
- Log: better diagnostic on errno.t failure
- From: Graham Barr <gbarr@ti.com>
- Date: Tue, 21 Jul 1998 13:07:29 CDT
- Message-Id: <19980721130729.K4337@asic.sc.ti.com>
+[ 5348] By: gsar on 2000/02/29 08:00:48
+ Log: increase sleep to compensate for slow cpu (from Peter Haworth
+ <pmh@edison.ioppublishing.com>)
Branch: perl
- ! t/lib/errno.t
+ ! t/io/pipe.t
____________________________________________________________________________
-[ 1629] By: gsar on 1998/07/22 07:36:38
- Log: win32 tweaks: disable XSLOCKS in perl.c, correct typo, search
- the registry for anything that begins with "PERL", not "PERL5"
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Date: Tue, 21 Jul 1998 11:08:00 PDT
- Message-Id: <000601bdb4d2$7ee74720$a32fa8c0@tau.Active>
+[ 5347] By: gsar on 2000/02/29 07:52:35
+ Log: add OO tutorial for beginners (from Randal L. Schwartz
+ <merlyn@stonehenge.com>)
Branch: perl
- ! perl.c win32/perlhost.h win32/win32.c
+ + pod/perlboot.pod
+ ! MANIFEST pod/Makefile pod/buildtoc pod/perl.pod
+ ! pod/perldelta.pod pod/perltoc.pod
____________________________________________________________________________
-[ 1628] By: gsar on 1998/07/22 07:28:35
- Log: suppress redefined warnings on C<INIT {} INIT {}>
+[ 5346] By: gsar on 2000/02/29 07:24:52
+ Log: malloc bug fix and machten hints (from Dominic Dunlop
+ <domo@computer.org>)
Branch: perl
- ! op.c
+ ! hints/machten.sh malloc.c
____________________________________________________________________________
-[ 1627] By: gsar on 1998/07/22 07:15:19
- Log: remove spurious $VERSION line that confuses CPAN
- From: Johan Vromans <jvromans@squirrel.nl>
- Date: Tue, 21 Jul 1998 20:01:36 +0200
- Message-Id: <13748.55168.397720.564438@phoenix.squirrel.nl>
- Subject: Re: 5.004_76 missing version numbers
+[ 5345] By: gsar on 2000/02/29 06:32:56
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! lib/Getopt/Long.pm
+ !> Configure MANIFEST config_h.SH ext/DynaLoader/dl_aix.xs
+ !> ext/DynaLoader/hints/aix.pl ext/File/Glob/Makefile.PL
+ !> hints/aix.sh hints/hpux.sh hints/irix_6.sh hints/solaris_2.sh
+ !> mg.c perl.h pod/perldelta.pod pod/perlop.pod pp.c sv.c
+ !> t/lib/ipc_sysv.t t/op/64bit.t t/op/misc.t t/op/numconvert.t
+ !> win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 5344] By: gsar on 2000/02/29 06:25:33
+ Log: export list tweak
+ Branch: perl
+ ! makedef.pl
+____________________________________________________________________________
+[ 5343] By: gsar on 2000/02/29 06:01:22
+ Log: various shenanigans in change#5342
+ Branch: perl
+ ! makedef.pl thread.h util.c win32/Makefile win32/makefile.mk
+ ! win32/win32.h win32/win32thread.h
+____________________________________________________________________________
+[ 5342] By: gsar on 2000/02/29 04:53:00
+ Log: support fetching current interpreter from TLS under useithreads
+ Branch: perl
+ ! embed.h embed.pl embedvar.h global.sym intrpvar.h makedef.pl
+ ! objXSUB.h perl.c perl.h perlapi.h perlvars.h pod/perldelta.pod
+ ! proto.h sv.c thread.h util.c win32/perlhost.h win32/perllib.c
+ ! win32/win32.h win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 5341] By: jhi on 2000/02/29 03:26:11
+ Log: Don't know how to do large files using gcc in HP-UX.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5340] By: jhi on 2000/02/29 03:07:16
+ Log: Added few more libs to scan.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Myinit.U U/modified/libs.U
+____________________________________________________________________________
+[ 5339] By: jhi on 2000/02/29 01:37:43
+ Log: Bigger warning on the changed behaviour of the unary ~.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 5338] By: jhi on 2000/02/29 01:17:07
+ Log: IRIX 64-bitness fixes.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/irix_6.sh
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 5337] By: jhi on 2000/02/29 00:59:08
+ Log: Userfriendliness.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 5336] By: jhi on 2000/02/29 00:53:51
+ Log: Undo the sv_2pv() change of #5329, caused numconvert.t
+ problems in IRIX 32-n32.
+ Branch: cfgperl
+ ! sv.c
+____________________________________________________________________________
+[ 5335] By: jhi on 2000/02/29 00:22:37
+ Log: Fixes for building on HP-UX using gcc from Daniel S. Lewart.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/hpux.sh
+ Branch: metaconfig/U/perl
+ ! dlsrc.U
+____________________________________________________________________________
+[ 5334] By: jhi on 2000/02/28 23:59:59
+ Log: Do not cast pointers into I32s.
+ Branch: cfgperl
+ ! mg.c
+____________________________________________________________________________
+[ 5333] By: jhi on 2000/02/28 23:39:26
+ Log: More AIX fixes from Steven Hirsch.
+ Branch: cfgperl
+ ! Configure config_h.SH ext/DynaLoader/dl_aix.xs
+ ! ext/DynaLoader/hints/aix.pl hints/aix.sh
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 5332] By: jhi on 2000/02/28 22:45:59
+ Log: Detypo.
+ Branch: cfgperl
+ ! hints/irix_6.sh
____________________________________________________________________________
-[ 1626] By: gsar on 1998/07/22 06:57:56
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Tue, 21 Jul 1998 10:20:13 EDT
- Message-Id: <Pine.SUN.3.96.980721101922.8078A-100000@newton.phys>
- Subject: [PATCH] Porting/config* updates for 5.005
+[ 5331] By: jhi on 2000/02/28 22:23:36
+ Log: Regularize the call-back units (and fix a bug in #5330).
+ Branch: cfgperl
+ ! hints/aix.sh hints/hpux.sh hints/irix_6.sh hints/solaris_2.sh
+____________________________________________________________________________
+[ 5330] By: jhi on 2000/02/28 21:50:28
+ Log: Don't be overeager to turn on 64-bitallness.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 5329] By: jhi on 2000/02/28 20:32:53
+ Log: Lift the 32-bit straightjacket from bit ops;
+ prefer IV/UV over NV in sv_2pv().
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perlop.pod pp.c sv.c t/op/64bit.t
+ ! t/op/misc.t t/op/numconvert.t
+____________________________________________________________________________
+[ 5328] By: jhi on 2000/02/28 20:11:59
+ Log: Do not add -Ae for gcc.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5327] By: jhi on 2000/02/28 17:35:39
+ Log: Use the vendor file(1).
+ Branch: cfgperl
+ ! hints/hpux.sh hints/irix_6.sh hints/solaris_2.sh
+____________________________________________________________________________
+[ 5326] By: jhi on 2000/02/28 17:31:19
+ Log: Put back madvise lost because of a typo.
+ Branch: cfgperl
+ ! Configure config_h.SH perl.h win32/config.bc win32/config.gc
+ ! win32/config.vc
+____________________________________________________________________________
+[ 5325] By: jhi on 2000/02/28 16:44:32
+ Log: Tweak HP-UX libraries.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5324] By: jhi on 2000/02/28 16:37:43
+ Log: Don't be overeager to turn on largefileness.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 5323] By: jhi on 2000/02/28 16:23:15
+ Log: AIX 64-bit patches from Steven Hirsch <hirschs@btv.ibm.com>
+ The patch to File/Glob/Makefile.PL is inconvenient but at the
+ moment necessary: adding an ext/FIle/Glob/hints/aix.pl to turn
+ off the optimization ($self->{OPTIMIZE} = '') doesn't work,
+ the file is processed by MakeMaker but OPTIMIZE ends up as -O
+ in the resulting Makefile. A MakeMaker bug?
+ Branch: cfgperl
+ ! MANIFEST ext/DynaLoader/dl_aix.xs ext/File/Glob/Makefile.PL
+ ! hints/aix.sh t/lib/ipc_sysv.t
+____________________________________________________________________________
+[ 5322] By: jhi on 2000/02/28 16:17:33
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 45 files)
+____________________________________________________________________________
+[ 5321] By: gsar on 2000/02/28 10:13:03
+ Log: avoid warnings in legacy code (from David Dyck)
Branch: perl
- ! Changes Porting/config.sh Porting/config_H
+ ! lib/pwd.pl
____________________________________________________________________________
-[ 1625] By: gsar on 1998/07/22 06:46:38
- Log: add a few more globals with old names #defined
+[ 5320] By: gsar on 2000/02/28 10:11:37
+ Log: find2perl doc tweak (from David Dyck <dcd@tc.fluke.com>)
Branch: perl
- ! embed.pl embedvar.h
+ ! x2p/find2perl.PL
____________________________________________________________________________
-[ 1624] By: gsar on 1998/07/22 06:39:22
- Log: allow extensions to be specified as paths
- From: Paul Johnson <pjcj@transeda.com>
- Date: Tue, 21 Jul 1998 12:04:27 BST
- Message-Id: <19980721120427.F903@west-tip.transeda.com>
- Subject: [PATCH] 5.004_75 Embed and static extensions
+[ 5319] By: gsar on 2000/02/28 10:07:00
+ Log: fix outdated URLs (from Michael G Schwern)
Branch: perl
- ! lib/ExtUtils/Embed.pm
+ ! pod/perldelta.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod pod/perlmodinstall.pod pod/perlmodlib.pod
+ ! pod/perlopentut.pod pod/perlport.pod pod/perltoc.pod
+ ! pod/perlvar.pod pod/perlxs.pod
____________________________________________________________________________
-[ 1623] By: gsar on 1998/07/22 06:12:50
- Log: make $ prototype to accept THREADSVs
+[ 5318] By: gsar on 2000/02/28 10:04:57
+ Log: update Changes, patchlevel etc.
Branch: perl
- ! op.c
+ ! Changes patchlevel.h win32/Makefile win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 5317] By: gsar on 2000/02/28 09:39:47
+ Log: make stringwise bitops work properly on utf8 strings
+ Branch: perl
+ ! doop.c t/op/bop.t
+____________________________________________________________________________
+[ 5316] By: gsar on 2000/02/28 07:04:22
+ Log: integrate cfgperl and vmsperl changes into mainline
+ Branch: perl
+ ! Porting/makerel
+ !> Configure Makefile.SH config_h.SH configure.com
+ !> ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/dl_vms.xs
+ !> hints/hpux.sh lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
+ !> lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mksymlists.pm
+ !> lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm t/comp/script.t
+ !> t/io/openpid.t t/lib/cgi-html.t t/op/goto.t t/op/split.t
+ !> vms/descrip_mms.template vms/gen_shrfls.pl
+ !> vms/subconfigure.com vms/vms.c
+____________________________________________________________________________
+[ 5315] By: jhi on 2000/02/28 06:31:08
+ Log: The search for static _s-suffixex libs was broken;
+ add -L/lib/pa20_64 only iff there.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/hpux.sh
+ Branch: metaconfig
+ ! U/modified/libs.U
+____________________________________________________________________________
+[ 5314] By: jhi on 2000/02/28 06:08:40
+ Log: Even better use64bitall logic.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! use64bits.U uselfs.U
+____________________________________________________________________________
+[ 5313] By: jhi on 2000/02/28 05:47:27
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/File/Basename.pm lib/File/Find.pm lib/fields.pm
+ !> pod/perldelta.pod pod/perlfunc.pod pod/perlref.pod
+ !> t/lib/fields.t x2p/find2perl.PL
+____________________________________________________________________________
+[ 5312] By: jhi on 2000/02/28 05:09:31
+ Log: Ask about use64bitall regardless of whether use64bitint is defined.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 5311] By: bailey on 2000/02/28 05:05:56
+ Log: Integrate mainline
+ Branch: vmsperl
+ !> README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
+ !> ext/File/Glob/Glob.pm hints/dos_djgpp.sh lib/File/Basename.pm
+ !> lib/File/Find.pm lib/fields.pm op.c pod/perldelta.pod
+ !> pod/perlfaq5.pod pod/perlfunc.pod pod/perlop.pod
+ !> pod/perlref.pod pod/perlsec.pod pod/perltodo.pod pp_sys.c
+ !> regexec.c sv.c t/lib/fields.t t/pragma/locale.t
+ !> x2p/find2perl.PL
+____________________________________________________________________________
+[ 5310] By: bailey on 2000/02/28 04:36:20
+ Log: Revert File::Spec::Unix functions and keep VMS versions VMS-specific
+ Branch: vmsperl
+ ! lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+____________________________________________________________________________
+[ 5309] By: jhi on 2000/02/28 04:17:36
+ Log: The #5249 wasn't doing any good.
+ Branch: cfgperl
+ ! Makefile.SH lib/ExtUtils/MM_Unix.pm
____________________________________________________________________________
-[ 1622] By: gsar on 1998/07/22 06:04:25
- Log: fix Liblist.pm to find entries that are plain pathnames on win32
+[ 5308] By: bailey on 2000/02/28 03:56:51
+ Log: Repair typo -- conjunction of variable with text
+ Branch: vmsperl
+ ! t/lib/cgi-html.t
+____________________________________________________________________________
+[ 5307] By: jhi on 2000/02/28 03:46:14
+ Log: A less ambitious version of #5292.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 5306] By: bailey on 2000/02/28 03:42:38
+ Log: Defer inclusion of VMS-specific code to runtime
+ Branch: vmsperl
+ ! t/io/openpid.t
+____________________________________________________________________________
+[ 5305] By: jhi on 2000/02/28 03:41:48
+ Log: The #5292 was Not So Good Idea.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 5304] By: bailey on 2000/02/28 02:57:14
+ Log: Minor test updates to accomodate new subprocess invocation
+ Branch: vmsperl
+ ! t/comp/script.t t/op/goto.t t/op/split.t
+____________________________________________________________________________
+[ 5303] By: bailey on 2000/02/28 02:52:47
+ Log: Missed bit of #5302 (case-sensitive symbols)
+ Branch: vmsperl
+ ! lib/ExtUtils/Mksymlists.pm
+____________________________________________________________________________
+[ 5302] By: bailey on 2000/02/28 02:51:00
+ Log: Support case-sensitive symbols usage in linker
+ Branch: vmsperl
+ ! ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/dl_vms.xs
+ ! lib/ExtUtils/MM_VMS.pm vms/gen_shrfls.pl
+____________________________________________________________________________
+[ 5301] By: bailey on 2000/02/28 02:46:47
+ Log: Free $PARSE context after lookups
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5300] By: bailey on 2000/02/28 02:43:56
+ Log: Don't wait for subprocess to read final EOF
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5299] By: bailey on 2000/02/28 00:44:45
+ Log: Dan Sugalski's config/build changes to .660
+ Branch: vmsperl
+ ! configure.com vms/descrip_mms.template vms/subconfigure.com
+____________________________________________________________________________
+[ 5298] By: bailey on 2000/02/28 00:07:13
+ Log: When testing CGI.pm, use its notion of CRLF
+ Branch: vmsperl
+ ! t/lib/cgi-html.t
+____________________________________________________________________________
+[ 5297] By: bailey on 2000/02/28 00:00:08
+ Log: Quote command line args which need to be upper case
+ Tell subprocess we're finished before waiting for it
+ Branch: vmsperl
+ ! t/io/openpid.t
+____________________________________________________________________________
+[ 5296] By: gsar on 2000/02/28 00:00:05
+ Log: m/.*$/ etc should be m/.*\z/s in many file handling modules; fix
+ these insidious errors in File::Basename, File::Find and find2perl
+ (from Tom Christiansen)
+
+ TODO: many other modules need to be fixed as well!
+ Branch: perl
+ ! lib/File/Basename.pm lib/File/Find.pm x2p/find2perl.PL
+____________________________________________________________________________
+[ 5295] By: jhi on 2000/02/27 23:18:40
+ Log: Version number update.
+ Branch: cfgperl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 5294] By: gsar on 2000/02/27 22:27:46
+ Log: typos in change#5293
+ Branch: perl
+ ! lib/fields.pm
+____________________________________________________________________________
+[ 5293] By: gsar on 2000/02/27 21:57:40
+ Log: support fields::new() and fields::phash() to create pseudo-hash
+ objects and plain pseudo-hashes respectively (this avoids users
+ from having to diddle %FIELDS directly); update documentation to
+ suit (from original fields::phash() implementation by Peter
+ Scott <Peter@PSDT.com>)
Branch: perl
- ! lib/ExtUtils/Liblist.pm
+ ! lib/fields.pm pod/perldelta.pod pod/perlfunc.pod
+ ! pod/perlref.pod t/lib/fields.t
+____________________________________________________________________________
+[ 5292] By: jhi on 2000/02/27 21:49:25
+ Log: proto.h was mssing from the list of generated files;
+ added rules to generate any single wanted file
+ (a bunch of other files may also be generated
+ at the same time, as before)
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 5291] By: jhi on 2000/02/27 18:57:12
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
+ !> ext/File/Glob/Glob.pm hints/dos_djgpp.sh lib/File/Spec/OS2.pm
+ !> lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+ !> lib/File/Spec/Win32.pm op.c pod/perldelta.pod pod/perlfaq5.pod
+ !> pod/perlfunc.pod pod/perlop.pod pod/perlsec.pod
+ !> pod/perltodo.pod pp_sys.c sv.c vms/perlvms.pod vms/vms.c
____________________________________________________________________________
-[ 1621] By: gsar on 1998/07/22 05:10:53
- Log: perlfaq update from From Tom Christiansen and Nathan Torkington
- (removes all mention of training courses from perlfaq*.pod)
+[ 5290] By: gsar on 2000/02/27 18:47:00
+ Log: integrate cfgperl and vmsperl contents into mainline
Branch: perl
- ! pod/perlfaq.pod pod/perlfaq2.pod pod/perlfaq3.pod
- ! pod/perlfaq4.pod pod/perlfaq6.pod pod/perlfaq7.pod
- ! pod/perlfaq8.pod pod/perlfaq9.pod
+ !> lib/File/Spec/OS2.pm lib/File/Spec/Unix.pm
+ !> lib/File/Spec/VMS.pm lib/File/Spec/Win32.pm regexec.c
+ !> t/pragma/locale.t vms/perlvms.pod vms/vms.c
____________________________________________________________________________
-[ 1620] By: gsar on 1998/07/22 02:51:13
- Log: applied patch, modulo parts already added to perldelta
- From: Stephen McCamant <alias@mcs.com>
- Date: Tue, 21 Jul 1998 17:06:23 CDT
- Message-Id: <13749.3106.995764.413053@alias-2.pr.mcs.net>
- Subject: [PATCH] Re: Beta2 is available
+[ 5289] By: gsar on 2000/02/27 18:09:04
+ Log: tweak change#5286 (we don't ever get to pp_glob() if we're using
+ the internal glob())
Branch: perl
- ! pod/perldelta.pod
+ ! pp_sys.c
____________________________________________________________________________
-[ 1619] By: gsar on 1998/07/22 02:45:55
- Log: applied patch, add new message to perldeta
- From: Stephen McCamant <alias@mcs.com>
- Date: Tue, 21 Jul 1998 16:12:25 CDT
- Message-Id: <13749.910.83378.949909@alias-2.pr.mcs.net>
- Subject: [PATCH] Band-aid patch for local($avhv->{a})
+[ 5288] By: gsar on 2000/02/27 17:12:41
+ Log: djgpp update (from Laszlo Molnar)
Branch: perl
- ! pod/perldelta.pod pod/perldiag.pod pp.c pp_hot.c
+ ! README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
+ ! hints/dos_djgpp.sh
____________________________________________________________________________
-[ 1618] By: gsar on 1998/07/22 02:08:00
- Log: fix up B modules for PL_* changes
+[ 5287] By: gsar on 2000/02/27 16:58:53
+ Log: tweak comment about core glob()
Branch: perl
- ! ext/B/B/C.pm ext/B/B/CC.pm ext/B/B/Stackobj.pm
+ ! ext/File/Glob/Glob.pm
____________________________________________________________________________
-[ 1617] By: gsar on 1998/07/22 01:42:14
- Log: From: Malcolm Beattie <mbeattie@sable.ox.ac.uk>
- Date: Tue, 21 Jul 1998 18:13:16 BST
- Message-Id: <199807211713.SAA20735@sable.ox.ac.uk>
- Subject: Compiler docs for 5.005
+[ 5286] By: gsar on 2000/02/27 16:52:54
+ Log: remove outdated info about csh and glob(); glob() need not fail
+ when tainting anymore if using internal globbing
Branch: perl
- ! ext/B/B.pm ext/B/B/Bytecode.pm ext/B/B/C.pm ext/B/B/CC.pm
- ! ext/B/O.pm
+ ! pod/perldelta.pod pod/perlfaq5.pod pod/perlfunc.pod
+ ! pod/perlop.pod pod/perlsec.pod pod/perltodo.pod pp_sys.c
____________________________________________________________________________
-[ 1616] By: gsar on 1998/07/22 01:29:09
- Log: s/PL_sv/PL_bytecode_sv/ etc., so we have unique, case-insensitive
- names
+[ 5285] By: gsar on 2000/02/27 16:20:31
+ Log: make readdir() respect IOf_UNTAINT flag (allows untainting of directory
+ handles with: C<use IO::Handle; opendir D, $dir or die; D->untaint;>
Branch: perl
- ! bytecode.h bytecode.pl byterun.c embedvar.h interp.sym
- ! intrpvar.h
+ ! pp_sys.c
____________________________________________________________________________
-[ 1615] By: nick on 1998/07/21 22:26:34
- Log: Mingw32 PERL_OBJECT tweaks
+[ 5284] By: gsar on 2000/02/27 14:31:24
+ Log: avoid compiler warnings (from Dan Sugalski)
Branch: perl
- ! ext/Fcntl/Fcntl.xs ext/IO/IO.xs ext/POSIX/POSIX.xs
+ ! op.c sv.c
____________________________________________________________________________
-[ 1614] By: gsar on 1998/07/21 19:43:32
- Log: fix off-by-one in change#623 that broke lexical lookups in eval''
+[ 5283] By: gsar on 2000/02/27 14:21:16
+ Log: propagate utf8ness in sv_setsv() (from Gisle Aas)
Branch: perl
- ! pp_ctl.c
+ ! sv.c
+____________________________________________________________________________
+[ 5282] By: bailey on 2000/02/27 05:07:08
+ Log: Impose security constraints on lnm lookup only if tainting
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 5281] By: bailey on 2000/02/27 05:05:35
+ Log: Add new File::Spec::VMS methods
+ Don't add implicit device in VMS <-> Unix filespec translation
+ Make File::Spec::Unix{rel2abs|abs2rel} OS-independent
+ Branch: vmsperl
+ ! lib/File/Spec/OS2.pm lib/File/Spec/Unix.pm
+ ! lib/File/Spec/VMS.pm lib/File/Spec/Win32.pm vms/vms.c
+____________________________________________________________________________
+[ 5280] By: bailey on 2000/02/27 04:58:01
+ Log: Accept filespecs as command verbs for subprocesses
+ Branch: vmsperl
+ ! vms/perlvms.pod vms/vms.c
+____________________________________________________________________________
+[ 5279] By: jhi on 2000/02/27 04:01:53
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> pp_hot.c
+____________________________________________________________________________
+[ 5278] By: bailey on 2000/02/27 02:43:01
+ Log: Resync with mainline again
+ Branch: vmsperl
+ !> Makefile.SH README.vms configure.com lib/ExtUtils/MM_Unix.pm
+ !> lib/Pod/Checker.pm lib/Pod/InputObjects.pm
+ !> lib/Pod/ParseUtils.pm lib/Pod/Parser.pm lib/Pod/Select.pm
+ !> lib/Pod/Usage.pm pod/perlfunc.pod pp_hot.c t/pod/poderrs.t
+ !> t/pod/poderrs.xr vms/descrip_mms.template vms/sockadapt.h
+ !> vms/subconfigure.com
+____________________________________________________________________________
+[ 5277] By: jhi on 2000/02/27 02:36:36
+ Log: Fix locale case-ignorant matching bug reported in
+
+ From: gomar@md.media-web.de
+ To: perl5-porters@perl.org
+ Subject: [ID 20000223.005]
+ Date: 23 Feb 2000 16:03:08 -0000
+ Message-Id: <20000223160308.1830.qmail@md.media-web.de>
+ Branch: cfgperl
+ ! regexec.c t/pragma/locale.t
+____________________________________________________________________________
+[ 5276] By: gsar on 2000/02/26 18:18:16
+ Log: allow $fh->autoflush on globrefs, and thence autovivified filehandles
+ (from Tom Christiansen)
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 5275] By: jhi on 2000/02/26 16:43:11
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 34 files)
+____________________________________________________________________________
+[ 5274] By: gsar on 2000/02/26 15:23:45
+ Log: rework binmode() entry in perlfunc (from Martien Verbruggen
+ <mgjv@comdyn.com.au>)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 5273] By: gsar on 2000/02/26 15:04:54
+ Log: PodParser v1.11 update (from Brad Appleton)
+ Branch: perl
+ ! lib/Pod/Checker.pm lib/Pod/InputObjects.pm
+ ! lib/Pod/ParseUtils.pm lib/Pod/Parser.pm lib/Pod/Select.pm
+ ! lib/Pod/Usage.pm t/pod/poderrs.t t/pod/poderrs.xr
+____________________________________________________________________________
+[ 5272] By: gsar on 2000/02/26 14:48:24
+ Log: add missing perl headers to perldepend action
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 5271] By: gsar on 2000/02/26 08:03:36
+ Log: VMS patch (from Peter Prymmer)
+ Branch: perl
+ ! Makefile.SH README.vms configure.com vms/descrip_mms.template
+ ! vms/sockadapt.h vms/subconfigure.com
+____________________________________________________________________________
+[ 5270] By: gsar on 2000/02/26 07:46:35
+ Log: integrate vmsperl changes into mainline
+ Branch: perl
+ !> av.c configure.com installperl lib/ExtUtils/MM_VMS.pm mg.h
+ !> pp_sys.c scope.c vms/vms.c vms/vmsish.h
+____________________________________________________________________________
+[ 5269] By: bailey on 2000/02/26 07:04:55
+ Log: Resync with mainline
+ Branch: vmsperl
+ +> cygwin/cygwin.c ext/DynaLoader/dl_dyld.xs
+ +> ext/Sys/Hostname/Hostname.pm ext/Sys/Hostname/Hostname.xs
+ +> ext/Sys/Hostname/Makefile.PL hints/darwin.sh lib/bytes.pm
+ +> lib/bytes_heavy.pl t/pragma/warn/9enabled
+ - ext/DynaLoader/dl_rhapsody.xs lib/Sys/Hostname.pm lib/byte.pm
+ - lib/byte_heavy.pl lib/unicode/Eq/Latin1.pl
+ - lib/unicode/Eq/Unicode.pl
+ !> (integrate 323 files)
+____________________________________________________________________________
+[ 5268] By: gsar on 2000/02/26 06:50:04
+ Log: reintroduce useithreads (accidentally deleted in change#5261)
+ Branch: perl
+ ! win32/config.vc
+____________________________________________________________________________
+[ 5266] By: gsar on 2000/02/26 06:46:06
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ +> cygwin/cygwin.c ext/DynaLoader/dl_dyld.xs hints/darwin.sh
+ - ext/DynaLoader/dl_rhapsody.xs
+ !> (integrate 62 files)
+____________________________________________________________________________
+[ 5265] By: gsar on 2000/02/26 06:31:10
+ Log: support for version vectors in UNIVERSAL::VERSION(), so that
+ C<use Foo v1.2.3> etc., work; tests for the same
+
+ TODO: XS_VERSION_BOOTCHECK needs to be revisited in light of this
+ Branch: perl
+ ! embed.h embed.pl global.sym objXSUB.h perlapi.c proto.h
+ ! t/comp/use.t toke.c universal.c
+____________________________________________________________________________
+[ 5264] By: jhi on 2000/02/26 04:14:15
+ Log: Add libscheck for IRIX.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 5263] By: jhi on 2000/02/26 03:40:47
+ Log: Add libscheck for Solaris.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 5262] By: jhi on 2000/02/26 03:10:47
+ Log: Rhapsody/Darwin patches from Wilfredo Sanchez.
+ Branch: cfgperl
+ + ext/DynaLoader/dl_dyld.xs hints/darwin.sh
+ - ext/DynaLoader/dl_rhapsody.xs
+ ! Configure INSTALL MANIFEST Makefile.SH README.threads
+ ! config_h.SH hints/rhapsody.sh installperl pp_sys.c
+ Branch: metaconfig
+ ! U/a_dvisory/multiarch.U
+____________________________________________________________________________
+[ 5261] By: jhi on 2000/02/26 02:48:23
+ Log: Rename use64bits to use64bitint;
+ rename usefull64bits to use64bitall.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH configure.com epoc/config.sh hints/aix.sh
+ ! hints/hpux.sh hints/irix_4.sh hints/irix_5.sh hints/irix_6.sh
+ ! hints/irix_6_0.sh hints/irix_6_1.sh hints/solaris_2.sh
+ ! myconfig.SH perl.c perl.h pod/perldelta.pod pod/perlfunc.pod
+ ! vms/subconfigure.com vos/config.def vos/config.h
+ ! vos/config_h.SH_orig win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U U/mksample U/modified/libpth.U
+ ! U/protos/socksizetype.U U/threads/archname.U
+ Branch: metaconfig/U/perl
+ ! Extensions.U dbm64.U perlxv.U stdio64.U use64bits.U uselfs.U
+ ! usemorebits.U
+____________________________________________________________________________
+[ 5260] By: jhi on 2000/02/25 22:57:16
+ Log: From: "Fifer, Eric" <EFifer@sanwaint.com>
+ To: "'perl5-porters@perl.org'" <perl5-porters@perl.org>
+ Subject: [PATCH 5.5.660] cygwin port
+ Message-ID: <779F20BCCE5AD31186A50008C75D99791716E2@SILLDN_MAIL1>
+ Branch: cfgperl
+ ! README.cygwin cygwin/Makefile.SHs cygwin/cygwin.c
+____________________________________________________________________________
+[ 5259] By: jhi on 2000/02/25 22:53:51
+ Log: Configure nits; add socksizetype; add getfsstat for completeness;
+ add lseekproto, usefull64bits, socksizetype getfsstat to non-UNIX
+ lands; regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH doio.c epoc/config.sh perl.c pp_sys.c
+ ! vms/subconfigure.com vos/config.def win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc
+ Branch: metaconfig
+ + U/protos/socksizetype.U
+ Branch: metaconfig/U/perl
+ + d_getfsstat.U
+ ! d_fstatfs.U fpossize.U use64bits.U uselfs.U
+____________________________________________________________________________
+[ 5258] By: jhi on 2000/02/25 21:04:17
+ Log: Further fixes to malloc.c prototypes from Dominic Dunlop.
+ Branch: cfgperl
+ ! malloc.c
+____________________________________________________________________________
+[ 5257] By: jhi on 2000/02/25 20:48:13
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> embed.h embed.pl objXSUB.h op.c op.h perlapi.c pp_ctl.c
+ !> proto.h t/cmd/while.t
+____________________________________________________________________________
+[ 5256] By: gsar on 2000/02/25 20:04:37
+ Log: fix missing perl_alloc() declaration under PERL_IMPLICIT_SYS
+ Branch: perl
+ ! embed.h embed.pl objXSUB.h perlapi.c proto.h
+____________________________________________________________________________
+[ 5255] By: gsar on 2000/02/25 19:23:58
+ Log: change#4849 wasn't restoring savestack correctly; make loops that have
+ continue blocks recognizable at run time
+ Branch: perl
+ ! op.c op.h pp_ctl.c t/cmd/while.t
+____________________________________________________________________________
+[ 5254] By: jhi on 2000/02/25 06:00:01
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> ext/B/B.xs ext/B/B/C.pm lib/Pod/InputObjects.pm
+ !> lib/Pod/Parser.pm lib/Pod/Select.pm lib/Pod/Usage.pm
+ !> t/lib/filefind.t t/pod/poderrs.xr
+____________________________________________________________________________
+[ 5253] By: jhi on 2000/02/25 05:57:59
+ Log: Megalopatch for Configure: Andy's new installation schemes;
+ introduce usefull64bits, beautify and regularize the various
+ type probes; introduce d_lseekproto.
+ Branch: cfgperl
+ ! Configure INSTALL Policy_sh.SH config_h.SH perl.h
+ ! pod/perldelta.pod
+ Branch: metaconfig
+ + U/installdirs/perl5.U U/installdirs/sitehtml1.U
+ + U/installdirs/sitehtml3.U U/installdirs/siteman1.U
+ + U/installdirs/siteman3.U U/installdirs/sitescript.U
+ + U/installdirs/vendorhtml1.U U/installdirs/vendorhtml3.U
+ + U/installdirs/vendorman1.U U/installdirs/vendorman3.U
+ + U/installdirs/vendorscript.U U/protos/d_lseekproto.U
+ - U/installdirs/vendorhtml1dir.U U/installdirs/vendorhtml3dir.U
+ - U/installdirs/vendorman1dir.U U/installdirs/vendorman3dir.U
+ - U/installdirs/vendorscriptdir.U
+ ! U/compline/doublesize.U U/compline/ptrsize.U
+ ! U/installdirs/archlib.U U/installdirs/bin.U
+ ! U/installdirs/html1dir.U U/installdirs/html3dir.U
+ ! U/installdirs/inc_version_list.U U/installdirs/installprefix.U
+ ! U/installdirs/installstyle.U U/installdirs/instubperl.U
+ ! U/installdirs/localarch.U U/installdirs/locallib.U
+ ! U/installdirs/otherlibdirs.U U/installdirs/prefix.U
+ ! U/installdirs/privlib.U U/installdirs/scriptdir.U
+ ! U/installdirs/sitearch.U U/installdirs/sitebin.U
+ ! U/installdirs/sitelib.U U/installdirs/siteprefix.U
+ ! U/installdirs/vendorarch.U U/installdirs/vendorbin.U
+ ! U/installdirs/vendorlib.U U/installdirs/vendorprefix.U
+ ! U/modified/d_longdbl.U U/modified/d_longlong.U
+ ! U/typedefs/gidsize.U U/typedefs/lseektype.U
+ ! U/typedefs/uidsize.U
+ Branch: metaconfig/U/perl
+ ! d_fpos64_t.U d_int64_t.U d_off64_t.U d_socklen_t.U fpossize.U
+ ! patchlevel.U use64bits.U uselfs.U usemultiplicity.U
+____________________________________________________________________________
+[ 5252] By: gsar on 2000/02/25 03:15:03
+ Log: update PodParser to v1.10 (from Brad Appleton)
+ Branch: perl
+ ! lib/Pod/InputObjects.pm lib/Pod/Parser.pm lib/Pod/Select.pm
+ ! lib/Pod/Usage.pm t/pod/poderrs.xr
+____________________________________________________________________________
+[ 5251] By: gsar on 2000/02/25 03:10:51
+ Log: make File::Find tests tolerate case-insensitive systems (from
+ Laszlo Molnar)
+ Branch: perl
+ ! t/lib/filefind.t
+____________________________________________________________________________
+[ 5250] By: gsar on 2000/02/25 01:50:04
+ Log: more Compiler tweaks for useithreads
+ Branch: perl
+ ! ext/B/B.xs ext/B/B/C.pm
+____________________________________________________________________________
+[ 5249] By: jhi on 2000/02/25 00:17:53
+ Log: Remove NFS temp files and Configure temp C files.
+ Branch: cfgperl
+ ! Makefile.SH lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 5248] By: jhi on 2000/02/24 23:57:49
+ Log: In FreeBSD disable floating point exception handlers.
+ As the comment says, this should be done in the hints.
+
+ From: dive <dive@ender.com>
+ To: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ cc: perl5-porters@perl.org
+ Subject: Re: [ID 20000216.004] apparent bug on freebsd systems when calculating large numbers
+ Date: Thu, 24 Feb 2000 15:54:24 -0800 (PST)
+ Message-ID: <Pine.LNX.4.04.10002241552080.448-100000@dragon.ender.com>
+ Branch: cfgperl
+ ! unixish.h
+____________________________________________________________________________
+[ 5247] By: jhi on 2000/02/24 23:46:27
+ Log: From: Gisle Aas <gisle@aas.no>
+ To: perl5-porters@perl.org
+ Subject: [PATCH v5.5.660] More UTF8_MAXLEN fixes
+ Date: 25 Feb 2000 00:24:53 +0100
+ Message-ID: <m3ema2tc8q.fsf@eik.g.aas.no>
+ Branch: cfgperl
+ ! doop.c op.c perl.c pp.c regcomp.c regexec.c sv.c
+____________________________________________________________________________
+[ 5246] By: jhi on 2000/02/24 23:15:56
+ Log: The op/stat.t patch in #5341 wasn't robust enough,
+ it broke subtest 4 almost everywhere else.
+ Branch: cfgperl
+ ! t/op/stat.t
+____________________________________________________________________________
+[ 5245] By: jhi on 2000/02/24 19:28:53
+ Log: More VMS patches from Peter Prymmer.
+ Branch: cfgperl
+ ! configure.com vms/subconfigure.com
+____________________________________________________________________________
+[ 5244] By: jhi on 2000/02/24 19:26:33
+ Log: Largefileness in Solaris doesn't require long longs;
+ use64bits enhancements; introduce usefull64bits.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/aix.sh hints/hpux.sh
+ ! hints/irix_6.sh hints/solaris_2.sh
+ Branch: metaconfig
+ ! U/threads/archname.U
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 5243] By: jhi on 2000/02/24 18:40:25
+ Log: Tidy up the 64-bit (and socklen_t) type probing.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/d_longdbl.U U/modified/d_longlong.U
+ Branch: metaconfig/U/perl
+ + d_fpos64_t.U d_off64_t.U
+ - io64.U
+ ! d_int64_t.U d_socklen_t.U
+____________________________________________________________________________
+[ 5242] By: jhi on 2000/02/24 18:09:49
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> pod/perlop.pod
+____________________________________________________________________________
+[ 5241] By: jhi on 2000/02/24 18:00:49
+ Log: From: "Fifer, Eric" <EFifer@sanwaint.com>
+ To: "'perl5-porters@perl.org'" <perl5-porters@perl.org>
+ Subject: [PATCH 5.5.660] cygwin port
+ Date: Thu, 24 Feb 2000 17:15:28 -0000
+ Message-ID: <779F20BCCE5AD31186A50008C75D99791716E1@SILLDN_MAIL1>
+ Branch: cfgperl
+ + cygwin/cygwin.c
+ ! MANIFEST Makefile.SH README.cygwin cygwin/Makefile.SHs
+ ! hints/cygwin.sh perl.c t/lib/glob-basic.t t/op/stat.t
+____________________________________________________________________________
+[ 5240] By: jhi on 2000/02/24 17:53:12
+ Log: VMS patch from Peter Prymmer; use full_ar.
+ Branch: cfgperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 5239] By: jhi on 2000/02/24 17:46:45
+ Log: MPE/ix patches from Mark Bixby.
+ Branch: cfgperl
+ ! pp_sys.c t/io/pipe.t t/lib/glob-basic.t t/lib/io_poll.t
+ ! t/lib/io_sock.t t/op/die_exit.t t/op/exec.t t/op/fork.t
+ ! t/op/stat.t
+____________________________________________________________________________
+[ 5238] By: jhi on 2000/02/24 17:13:22
+ Log: Get -lbind if available. Add pointer to perldelta.pod/64-bit
+ support to t/op/numconvert.t.
+
+ From: Lupe Christoph <lupe@lupe-christoph.de>
+ To: perl5-porters@perl.org
+ Subject: [ID 20000224.003] Not OK: perl v5.5.660 on i86pc-solaris 2.7
+ Date: Thu, 24 Feb 2000 11:54:50 +0100 (MET)
+ Message-Id: <200002241054.LAA06808@lupe-christoph.de>
+ Branch: cfgperl
+ ! Configure config_h.SH t/op/numconvert.t
+ Branch: metaconfig
+ ! U/modified/libs.U
+____________________________________________________________________________
+[ 5237] By: jhi on 2000/02/24 15:47:11
+ Log: Remove more cruft from IO.
+ Branch: cfgperl
+ ! ext/IO/IO.xs
+____________________________________________________________________________
+[ 5236] By: jhi on 2000/02/24 15:14:48
+ Log: From: Hugo <hv@crypt.compulink.co.uk>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.5.660] double EXPORT_OK in h2xs
+ Date: Thu, 24 Feb 2000 13:24:10 +0000
+ Message-Id: <200002241324.NAA05900@crypt.compulink.co.uk>
+ Branch: cfgperl
+ ! utils/h2xs.PL
+____________________________________________________________________________
+[ 5235] By: jhi on 2000/02/24 15:12:40
+ Log: Some Windows setups do not have S_IRGRP, S_IWGRP, S_IXGRP,
+ S_IROTH, S_IWOTH, S_IXOTH.
+
+ From: js@ddre.dk
+ To: perl5-porters@perl.org
+ Subject: [ID 20000224.004] Not OK: perl v5.5.660 on MSWin32-x86 4.0
+ Date: Thu, 24 Feb 2000 15:11:33 +0100
+ Message-Id: <2991B60B9F72D011811C0000F821BB4C983B0C@freja.ddre.dk>
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 5234] By: gsar on 2000/02/24 03:39:17
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ - lib/unicode/Eq/Latin1.pl lib/unicode/Eq/Unicode.pl
+ ! pod/perlop.pod
+ !> Configure MANIFEST Porting/Glossary Porting/config.sh
+ !> Porting/config_H config_h.SH configpm configure.com doio.c
+ !> ext/Fcntl/Fcntl.pm ext/IO/IO.xs ext/IO/lib/IO/Socket.pm
+ !> ext/Sys/Hostname/Hostname.xs hints/dec_osf.sh hints/irix_6.sh
+ !> lib/unicode/mktables.PL malloc.c myconfig.SH pp_sys.c
+ !> t/op/64bit.t vms/descrip_mms.template vms/subconfigure.com
+____________________________________________________________________________
+[ 5233] By: jhi on 2000/02/24 01:31:38
+ Log: VMS patch from Peter Prymmer.
+ Branch: cfgperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 5232] By: jhi on 2000/02/24 01:15:03
+ Log: Detypo fpos64_t test.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! io64.U
+____________________________________________________________________________
+[ 5231] By: jhi on 2000/02/24 01:11:17
+ Log: miscut'n'paste in #5230.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! d_int64_t.U
+____________________________________________________________________________
+[ 5230] By: jhi on 2000/02/24 01:02:05
+ Log: The #5228 wasn't quite right + fix typos.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/d_longdbl.U U/modified/d_longlong.U
+ Branch: metaconfig/U/perl
+ ! d_int64_t.U d_socklen_t.U io64.U
+____________________________________________________________________________
+[ 5229] By: jhi on 2000/02/24 00:40:01
+ Log: Depickify the compiler (about unused and set but not used variables)
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 5228] By: jhi on 2000/02/24 00:34:35
+ Log: Cosmetics.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/d_longdbl.U U/modified/d_longlong.U
+ Branch: metaconfig/U/perl
+ ! d_int64_t.U d_socklen_t.U
+____________________________________________________________________________
+[ 5227] By: jhi on 2000/02/24 00:17:34
+ Log: In IRIX <sys/mode.h> is something completely different.
+
+ From: jarausch@numa1.igpm.rwth-aachen.de (Helmut Jarausch)
+ To: perl5-porters@perl.org
+ Subject: [ID 20000223.003] Not OK: perl v5.5.660 on IP26-irix 6.5
+ Date: Wed, 23 Feb 2000 10:55:08 +0100 (CST)
+ Message-Id: <200002230955.KAA89136@numa1.igpm.rwth-aachen.de>
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 5226] By: jhi on 2000/02/23 20:39:28
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> pod/perldelta.pod pod/perlfunc.pod pod/perlop.pod
+ !> t/comp/require.t t/op/ver.t toke.c
+____________________________________________________________________________
+[ 5225] By: jhi on 2000/02/23 20:35:58
+ Log: From: Dominic Dunlop <domo@computer.org>
+ To: perl5-porters@perl.org
+ Cc: Gurusamy Sarathy <gsar@activestate.com>
+ Subject: [ID 20000223.008] [PATCH 5.5.660] squash malloc.c compile warnings
+ Date: Wed, 23 Feb 2000 21:23:44 +0100
+ Message-Id: <v04220800b4d9f1bcee1a@[212.24.193.51]>
+ Branch: cfgperl
+ ! malloc.c
+____________________________________________________________________________
+[ 5224] By: jhi on 2000/02/23 20:22:43
+ Log: From: Dan Sugalski <dan@sidhe.org>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.5.660]VMS build patches
+ Date: Wed, 23 Feb 2000 15:14:27 -0500
+ Message-Id: <4.3.0.20000223151302.01efa560@24.8.96.48>
+
+ (the patch was mangled, had to be manually applied)
+ Branch: cfgperl
+ ! configure.com vms/descrip_mms.template vms/subconfigure.com
+____________________________________________________________________________
+[ 5223] By: jhi on 2000/02/23 19:54:04
+ Log: From: Dominic Dunlop <domo@computer.org>
+ To: perl5-porters@perl.org
+ Cc: Andy Dougherty <doughera@lafayette.edu>,
+ Gurusamy Sarathy <gsar@activestate.com>
+ Subject: [ID 20000223.007] [PATCH 5.5.660] $@ unsafe in Configure sed arguments
+ Date: Wed, 23 Feb 2000 20:41:54 +0100
+ Message-Id: <v04220800b4d9e48c51bb@[212.24.193.51]>
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Oldconfig.U U/modified/libs.U
+ Branch: metaconfig/U/perl
+ ! dlsrc.U
+____________________________________________________________________________
+[ 5222] By: jhi on 2000/02/23 18:02:39
+ Log: Remove &IO::EINPROGRESS now that IO uses Errno anyway
+ (suggested by Graham Barr).
+ Branch: cfgperl
+ ! ext/IO/IO.xs ext/IO/lib/IO/Socket.pm
+____________________________________________________________________________
+[ 5221] By: jhi on 2000/02/23 16:00:29
+ Log: Streamline #5218 even more.
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Socket.pm
+____________________________________________________________________________
+[ 5220] By: gsar on 2000/02/23 09:10:43
+ Log: per Larry's idea, parse 1.2.3 as v1.2.3; C<require 5.6.0> and
+ C<use 5.6.0> work as well; underscores are now permitted in v-strings
+ Branch: perl
+ ! pod/perldelta.pod pod/perlfunc.pod pod/perlop.pod
+ ! t/comp/require.t t/op/ver.t toke.c
+____________________________________________________________________________
+[ 5219] By: jhi on 2000/02/23 04:24:54
+ Log: Streamline #5218.
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Socket.pm
+____________________________________________________________________________
+[ 5218] By: jhi on 2000/02/23 02:08:19
+ Log: Trying to connect to an already open socket may give EISCONN.
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Socket.pm
+____________________________________________________________________________
+[ 5217] By: jhi on 2000/02/22 23:54:51
+ Log: Fix prototype conflicts with POSIX.pm.
+ Branch: cfgperl
+ ! ext/Fcntl/Fcntl.pm
+____________________________________________________________________________
+[ 5216] By: jhi on 2000/02/22 22:27:19
+ Log: See http://www.unicode.org/unicode/reports/tr15/
+ for in-depth description of the problem.
+ Branch: cfgperl
+ - lib/unicode/Eq/Latin1.pl lib/unicode/Eq/Unicode.pl
+ ! MANIFEST lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 5215] By: jhi on 2000/02/22 22:11:17
+ Log: Add uselongdouble, regroup the use* more logically.
+ Branch: cfgperl
+ ! myconfig.SH
+____________________________________________________________________________
+[ 5214] By: jhi on 2000/02/22 22:04:43
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> malloc.c perl.c pod/perldelta.pod pod/perldiag.pod
+ !> pod/perlpod.pod pod/perlrun.pod toke.c utils/perldoc.PL
+____________________________________________________________________________
+[ 5213] By: jhi on 2000/02/22 22:03:26
+ Log: Add socklen_t probe; Configure maintenance.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH doio.c ext/Sys/Hostname/Hostname.xs pp_sys.c
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U U/compline/alignbytes.U U/modified/cc.U
+ ! U/modified/libs.U
+ Branch: metaconfig/U/perl
+ + d_int64_t.U d_socklen_t.U
+ - d_int64t.U
+ ! i_sysutsname.U
+____________________________________________________________________________
+[ 5212] By: gsar on 2000/02/22 21:46:45
+ Log: make Perl's malloc work for allocations over 2GB (from Ilya
+ Zakharevich)
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 5211] By: gsar on 2000/02/22 19:51:47
+ Log: add -W and -X to -h output; fix other pod omissions
+ Branch: perl
+ ! perl.c pod/perlrun.pod
+____________________________________________________________________________
+[ 5210] By: gsar on 2000/02/22 19:51:13
+ Log: describe C<< ... >> in perlpod.pod (from Brad Appleton)
+ Branch: perl
+ ! pod/perlpod.pod
+____________________________________________________________________________
+[ 5209] By: jhi on 2000/02/22 19:40:43
+ Log: The subtests 28 and 31 were wrong. Tightened also the similar
+ tests nearby.
+ Branch: cfgperl
+ ! t/op/64bit.t
+____________________________________________________________________________
+[ 5208] By: gsar on 2000/02/22 19:13:44
+ Log: s/Activeware/ActiveState/
+ Branch: perl
+ ! pod/perlrun.pod
+____________________________________________________________________________
+[ 5207] By: jhi on 2000/02/22 18:38:29
+ Log: Perl version nit spotted by Spider Boardman.
+ Branch: cfgperl
+ ! configpm
+____________________________________________________________________________
+[ 5206] By: gsar on 2000/02/22 17:50:44
+ Log: change#5205 wasn't quite right; SvCUR() should be SvLEN()
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 5205] By: gsar on 2000/02/22 17:36:26
+ Log: fix memory overrun due to off-by-one in change#5192
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 5204] By: gsar on 2000/02/22 17:10:39
+ Log: sundry typos and such
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod utils/perldoc.PL
+____________________________________________________________________________
+[ 5203] By: jhi on 2000/02/22 17:10:22
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 56 files)
+____________________________________________________________________________
+[ 5202] By: gsar on 2000/02/22 16:48:58
+ Log: remove vestiges of older attribute syntax
+ Branch: perl
+ ! ext/attrs/attrs.pm pod/Win32.pod pod/perldelta.pod
+ ! pod/perlop.pod pod/perlthrtut.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 5201] By: jhi on 2000/02/22 14:39:56
+ Log: Configure nits spotted by Spider Boardman.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/libs.U
+ Branch: metaconfig/U/perl
+ ! fpossize.U
+____________________________________________________________________________
+[ 5200] By: jhi on 2000/02/22 14:31:21
+ Log: Tru64 V5.0 patches from Spider Boardman.
+ Branch: cfgperl
+ ! hints/dec_osf.sh
----------------
-Version 5.004_76 5.005 Public Beta, Issue 2
+Version v5.5.660
----------------
____________________________________________________________________________
-[ 1613] By: gsar on 1998/07/21 10:26:01
- Log: final tweaks before beta2
+[ 5199] By: gsar on 2000/02/22 11:29:28
+ Log: beta2
Branch: perl
- + Porting/findvars
- +> Porting/fixvars
- - fixvars
- ! Changes MANIFEST intrpvar.h iperlsys.h
- ! lib/ExtUtils/MM_Win32.pm win32/perlhost.h
+ ! Changes
____________________________________________________________________________
-[ 1612] By: gsar on 1998/07/21 07:15:54
- Log: fixes to enable PERL_OBJECT build with mingw32/egcs-1.0.2
+[ 5198] By: gsar on 2000/02/22 10:45:54
+ Log: PodParser-1.093 update (from Brad Appleton's site)
Branch: perl
- ! ext/Opcode/Opcode.xs proto.h win32/makedef.pl
- ! win32/makefile.mk win32/perlhost.h win32/win32.c win32/win32.h
- ! win32/win32sck.c
+ ! lib/Pod/Checker.pm lib/Pod/Find.pm lib/Pod/InputObjects.pm
+ ! lib/Pod/ParseUtils.pm lib/Pod/Parser.pm lib/Pod/Select.pm
+ ! lib/Pod/Usage.pm t/pod/poderrs.t t/pod/poderrs.xr
+ ! t/pod/special_seqs.t t/pod/special_seqs.xr
____________________________________________________________________________
-[ 1611] By: gsar on 1998/07/21 07:12:00
- Log: fix bytecode.pl with moved var names
+[ 5197] By: gsar on 2000/02/22 10:24:13
+ Log: integrate cfgperl contents into mainline, update Changes
Branch: perl
- ! bytecode.pl byterun.c byterun.h ext/B/B/Asmdata.pm
+ ! Changes pod/perlhist.pod
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH hints/solaris_2.sh malloc.c perl.h
+ !> pod/perldelta.pod
____________________________________________________________________________
-[ 1610] By: gsar on 1998/07/21 05:51:10
- Log: tweak toke.c
+[ 5196] By: gsar on 2000/02/22 10:10:36
+ Log: dos-djgpp updates (from Laszlo Molnar <laszlo.molnar@eth.ericsson.se>)
Branch: perl
- ! toke.c
+ ! djgpp/config.over djgpp/configure.bat djgpp/djgppsed.sh
+ ! t/lib/glob-basic.t t/lib/glob-case.t t/lib/glob-global.t
+ ! t/lib/glob-taint.t t/lib/io_unix.t
____________________________________________________________________________
-[ 1609] By: gsar on 1998/07/21 05:46:59
- Log: change case of PERL_OBJECT filenames, consistent with the rest
+[ 5195] By: gsar on 2000/02/22 10:01:49
+ Log: s/undef/NO_INIT/g in change#5183
Branch: perl
- + XSlock.h objXSUB.h
- - ObjXSub.h XSLock.h
- ! MANIFEST XSUB.h lib/ExtUtils/MM_Win32.pm perl.h
- ! win32/GenCAPI.pl win32/Makefile win32/makefile.mk
+ ! lib/ExtUtils/xsubpp pod/perlxs.pod
____________________________________________________________________________
-[ 1608] By: gsar on 1998/07/21 05:31:13
- Log: part 2 of PERL_OBJECT fixes (globals in bytecode.h moved to intrpvar.h)
+[ 5194] By: gsar on 2000/02/22 09:44:07
+ Log: perlipc bug (spotted by Ben Low)
Branch: perl
- ! bytecode.h byterun.c embedvar.h interp.sym intrpvar.h
+ ! pod/perlipc.pod
____________________________________________________________________________
-[ 1607] By: gsar on 1998/07/21 05:29:10
- Log: part 1 of PERL_OBJECT fixes for new var names
+[ 5193] By: gsar on 2000/02/22 09:38:58
+ Log: EPOC port update (from Olaf Flebbe <O.Flebbe@science-computing.de>)
Branch: perl
- ! ObjXSub.h bytecode.h globals.c iperlsys.h perl.h pp_ctl.c
- ! run.c win32/GenCAPI.pl
+ ! README.epoc epoc/config.sh epoc/createpkg.pl perl.c
____________________________________________________________________________
-[ 1606] By: gsar on 1998/07/21 05:17:26
- Log: From: Stephen McCamant <alias@mcs.com>
- Date: Mon, 20 Jul 1998 23:53:32 CDT
- Message-Id: <13748.6947.311341.657005@alias-2.pr.mcs.net>
- Subject: [PATCH] redundant RV2GVs in ck_fun()
+[ 5192] By: gsar on 2000/02/22 09:26:06
+ Log: improvements for high-bit text literals (from Gisle Aas)
Branch: perl
- ! op.c
+ ! t/pragma/warn/doop t/pragma/warn/pp t/pragma/warn/sv
+ ! t/pragma/warn/toke t/pragma/warn/utf8 toke.c
____________________________________________________________________________
-[ 1605] By: gsar on 1998/07/21 05:13:28
- Log: From: Stephen McCamant <alias@mcs.com>
- Date: Mon, 20 Jul 1998 23:32:42 CDT
- Message-Id: <13748.6392.921893.643238@alias-2.pr.mcs.net>
- Subject: B::Deparse 0.56 (first testsuite fixes; big)
+[ 5191] By: gsar on 2000/02/22 07:35:47
+ Log: allow C<print v10>, $h{v13.10} etc.
Branch: perl
- ! ext/B/B/Deparse.pm
+ ! t/op/ver.t toke.c
____________________________________________________________________________
-[ 1604] By: gsar on 1998/07/21 05:07:29
- Log: applied a slightly tweaked version of suggested patch
- From: Colin Kuskie <ckuskie@cadence.com>
- Date: Mon, 20 Jul 1998 15:58:31 -0700 (PDT)
- Message-ID: <Pine.GSO.3.96.980720154841.6188M-100000@pdxmail.cadence.com>
- Subject: [PATCH _75] More documentation for -i prefix
+[ 5190] By: gsar on 2000/02/22 05:35:27
+ Log: adjust for lost fp precision in require version check
Branch: perl
- ! pod/perlrun.pod
+ ! pp_ctl.c t/comp/require.t
____________________________________________________________________________
-[ 1603] By: gsar on 1998/07/21 04:59:19
- Log: disable malloced_size() feedback with -DLEAKTEST
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 20 Jul 1998 21:20:21 -0400 (EDT)
- Message-Id: <199807210120.VAA15031@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_75] -DLEAKTEST broken
+[ 5189] By: jhi on 2000/02/22 05:14:35
+ Log: Check the alignment of long doubles if they are to be used;
+ regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+ Branch: metaconfig
+ ! U/compline/alignbytes.U
+____________________________________________________________________________
+[ 5188] By: gsar on 2000/02/22 04:45:57
+ Log: use same treatment for EINVAL as for ETIMEDOUT
Branch: perl
- ! av.c sv.c
+ ! ext/IO/lib/IO/Socket/INET.pm
____________________________________________________________________________
-[ 1602] By: gsar on 1998/07/21 04:57:43
- Log: fix hints/hpux.sh for cpp recognition
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Mon, 20 Jul 1998 12:46:33 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980720124202.6585B-100000@newton.phys>
- Subject: RE: Configure misses preprocessor on HP-UX
+[ 5187] By: gsar on 2000/02/21 23:15:12
+ Log: type mismatch
Branch: perl
- ! hints/hpux.sh
+ ! sv.c
____________________________________________________________________________
-[ 1601] By: gsar on 1998/07/21 04:55:51
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sun, 19 Jul 1998 18:16:38 -0400 (EDT)
- Message-Id: <199807192216.SAA10482@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Compile (?{}) into a correct package
+[ 5186] By: gsar on 2000/02/21 21:10:26
+ Log: remove dual-valueness of v-strings (i.e., they are pure strings
+ now); avoid the word "tuple" to describe strings represented as
+ character ordinals; usurp $PERL_VERSION for $^V as suggested by
+ Larry, deprecate $] ; adjust the documentation and testsuite
+ accordingly
Branch: perl
- ! pp_ctl.c t/op/pat.t
+ ! MANIFEST lib/English.pm op.c pod/perldelta.pod
+ ! pod/perlfunc.pod pod/perlop.pod pod/perlvar.pod
+ ! t/comp/require.t t/op/ver.t toke.c
____________________________________________________________________________
-[ 1600] By: gsar on 1998/07/21 04:48:32
- Log: allocate a whole fd_set for pp_sselect() on more platforms
- From: Jarkko Hietaniemi <jhi@cc.hut.fi>
- Date: 20 Jul 1998 00:14:18 +0300
- Message-ID: <oeen2a5y251.fsf@alpha.hut.fi>
- Subject: Re: Not OK: perl 5.00475 +DEVEL_BETA_ISSUE_1 on OPENSTEP-Mach 4_1 (UNINSTALLED)
+[ 5185] By: jhi on 2000/02/21 20:36:05
+ Log: detypo
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 5184] By: gsar on 2000/02/21 18:37:38
+ Log: clarify "use Module VERSION LIST" (from Robin Barker)
Branch: perl
- ! pp_sys.c
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1599] By: gsar on 1998/07/21 04:44:04
- Log: add tests to check if context propagation works
- From: Francois Desarmenien <desar@club-internet.fr>
- Date: Sun, 19 Jul 1998 12:28:33 +0200
- Message-ID: <35B1CA51.A606AD27@club-internet.fr>
- Subject: Re: m//g strange behaviour in 5.004
+[ 5183] By: gsar on 2000/02/21 18:31:42
+ Log: allow optional XSUB parameters without being forced to use a
+ default (from Hugo van der Sanden)
Branch: perl
- + t/op/context.t
- ! MANIFEST
+ ! lib/ExtUtils/xsubpp pod/perlfunc.pod pod/perlxs.pod
____________________________________________________________________________
-[ 1598] By: gsar on 1998/07/21 04:37:49
- Log: applied RE doc patches, with tweaks to the prose
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sat, 18 Jul 1998 23:11:13 -0400 (EDT)
- Message-Id: <199807190311.XAA25080@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Document irregular zero-length matches
- --
- Date: Sun, 19 Jul 1998 00:38:44 -0400 (EDT)
- Message-Id: <199807190438.AAA26226@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Another irregularity of expressions documented
+[ 5182] By: jhi on 2000/02/21 18:22:47
+ Log: Add Solaris LP64 notes.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 5181] By: gsar on 2000/02/21 16:53:39
+ Log: generalize "%v" format into a flag for any integral format type:
+ "%vd", "%v#o", "%*vX", etc are allowed
Branch: perl
- ! pod/perlre.pod
+ ! perl.c pod/perldelta.pod pod/perlfunc.pod sv.c t/op/ver.t
+ ! utils/perlbug.PL
____________________________________________________________________________
-[ 1597] By: gsar on 1998/07/21 04:16:51
- Log: pod tweak suggested by Ilya
+[ 5180] By: gsar on 2000/02/21 07:11:00
+ Log: detypo
Branch: perl
- ! pod/perlfunc.pod
+ ! ext/B/B.xs
____________________________________________________________________________
-[ 1596] By: gsar on 1998/07/21 04:12:39
- Log: enable color output with -Mre=debugcolor with -DDEBUGGING
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sat, 18 Jul 1998 17:34:00 -0400 (EDT)
- Message-Id: <199807182134.RAA20644@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Better -Mre=colordb
+[ 5179] By: gsar on 2000/02/21 07:08:38
+ Log: undo accidental delete
Branch: perl
- ! ext/re/re.xs
+ ! ext/B/B.pm ext/B/B.xs
____________________________________________________________________________
-[ 1595] By: gsar on 1998/07/21 04:07:44
- Log: From: "John L. Allen" <allen@grumman.com>
- Date: Thu, 16 Jul 1998 11:43:54 -0400 (EDT)
- Message-ID: <Pine.SOL.3.91.980716113018.14617A-100000@gateway.grumman.com>
- Subject: [PATCH _75 & _05] perlbug does not report usage on invalid flags
+[ 5178] By: gsar on 2000/02/21 07:02:16
+ Log: get Compiler "working" under useithreads
Branch: perl
- ! utils/perlbug.PL
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm
+ ! ext/B/B/Deparse.pm ext/B/B/Xref.pm
____________________________________________________________________________
-[ 1594] By: gsar on 1998/07/21 04:06:06
- Log: don't use SelectSaver on IO::Handle->input_*() methods
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Date: Thu, 16 Jul 1998 15:00:39 +0100 (BST)
- Message-Id: <199807161400.PAA25532@tempest.cise.npl.co.uk>
- Subject: Re: Bug in IO::Handle->input_record_separator
+[ 5177] By: jhi on 2000/02/21 03:16:24
+ Log: Thou shalt not printf longs with %d.
+ Branch: cfgperl
+ ! malloc.c
+____________________________________________________________________________
+[ 5176] By: jhi on 2000/02/21 01:37:35
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/pragma/warn/9enabled
+ !> (integrate 63 files)
+____________________________________________________________________________
+[ 5175] By: gsar on 2000/02/21 00:25:00
+ Log: misplaced braces
Branch: perl
- ! ext/IO/lib/IO/Handle.pm
+ ! malloc.c
____________________________________________________________________________
-[ 1593] By: gsar on 1998/07/21 04:03:46
- Log: applied a tweaked version of suggested patch
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 15 Jul 1998 17:02:48 -0400 (EDT)
- Message-Id: <199807152102.RAA19952@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Enable/document colors in re.pm
+[ 5174] By: gsar on 2000/02/21 00:09:16
+ Log: more malloc.c tweaks for change#5070
Branch: perl
- ! ext/re/re.pm
+ ! malloc.c
____________________________________________________________________________
-[ 1592] By: gsar on 1998/07/21 03:49:55
- Log: remove compat3.sym and rename perld4.pod
+[ 5173] By: gsar on 2000/02/21 00:01:17
+ Log: malloc.c fixups in change#5170 need to fetch thx pointer
Branch: perl
- +> pod/perl5004delta.pod
- - compat3.sym pod/perld4.pod
- ! MANIFEST
+ ! malloc.c
____________________________________________________________________________
-[ 1591] By: gsar on 1998/07/21 03:38:16
- Log: update patchlevel, Changes
+[ 5172] By: gsar on 2000/02/20 23:52:39
+ Log: missing file in change#5170
Branch: perl
- ! Changes patchlevel.h win32/Makefile win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+ + t/pragma/warn/9enabled
____________________________________________________________________________
-[ 1590] By: gsar on 1998/07/21 03:06:04
- Log: documentation tweaks from Abigail <abigail@fnx.com>
- Date: Fri, 17 Jul 1998 20:52:36 -0400 (EDT)
- Message-ID: <19980718005236.5154.qmail@betelgeuse.wayne.fnx.com>
- Subject: Re: [PATCH 5.00475] pod/perlsyn.pod
- --
- Date: Thu, 16 Jul 1998 17:00:49 -0400 (EDT)
- Message-ID: <19980716210049.16156.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.00475] pod/perlguts.pod
- --
- Date: Thu, 16 Jul 1998 16:52:05 -0400 (EDT)
- Message-ID: <19980716205205.15949.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.00475] Tweaking pod/perlfunc.pod
- --
- Date: Fri, 17 Jul 1998 22:58:05 -0400 (EDT)
- Message-ID: <19980718025805.7135.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH, 5.00475], pod/perlsub.pod
- --
- Date: Sat, 18 Jul 1998 04:02:00 -0400 (EDT)
- Message-ID: <19980718080200.9927.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.00475] pod/perlfunc.pod
+[ 5171] By: gsar on 2000/02/20 23:49:17
+ Log: skip conditionally defined symbols in change#5162
Branch: perl
- ! pod/perlfunc.pod pod/perlguts.pod pod/perlsub.pod
- ! pod/perlsyn.pod
+ ! makedef.pl
____________________________________________________________________________
-[ 1589] By: gsar on 1998/07/21 02:44:25
- Log: VMS patches from Dan Sugalski <sugalskd@osshe.edu>
- Date: Wed, 15 Jul 1998 09:38:12 -0700
- Message-Id: <3.0.5.32.19980715093812.00a42a50@ous.edu>
- Subject: [PATCH 5.005-beta1]Quick VMS config update
- --
- Date: Wed, 15 Jul 1998 12:53:52 -0700
- Message-Id: <3.0.5.32.19980715125352.00a25cb0@ous.edu>
- Subject: Re: $ebcdic has broken VMS in _75 (Now with doc patch!)
- --
- Date: Thu, 16 Jul 1998 11:15:44 -0700
- Message-Id: <3.0.5.32.19980716111544.00b78770@ous.edu>
- Subject: [PATCH 5.004_75]Another VMS tweak for the Vax C compiler
- --
- Date: Thu, 16 Jul 1998 11:21:55 -0700
- Message-Id: <3.0.5.32.19980716112155.00a66c50@ous.edu>
- Subject: [PATCH 5.004_75]Get archname correct for thread build on VMS
- --
- Date: Thu, 16 Jul 1998 11:25:04 -0700
- Message-Id: <3.0.5.32.19980716112504.00ae0d50@ous.edu>
- Subject: [PATCH 5.004_75]Thread build tweaks for VMS 6.2 and older
- --
- Date: Fri, 17 Jul 1998 15:29:13 -0700
- Message-Id: <3.0.5.32.19980717152913.00a469b0@ous.edu>
- Subject: [PATCH 5.004_75]Missed a header file in VMS build procedure
- --
- Date: Mon, 20 Jul 1998 10:20:49 -0700
- Message-Id: <3.0.5.32.19980720102049.00a05100@ous.edu>
- Subject: [PATCH 5.004_75]Tweaks to Thread.XS for OLD_PTHREADS_API build
- --
- Date: Mon, 20 Jul 1998 10:13:03 -0700
- Message-Id: <3.0.5.32.19980720101303.00a17100@ous.edu>
- Subject: [PATCH 5.004_75]Explicitly specify extensions during VMS config process
- --
- From: Brad Hughes <brad@tgsmc.com>
- Date: Mon, 20 Jul 1998 15:51:22 -0700
- Message-Id: <3.0.5.32.19980720155122.00a41950@ous.edu>
- Subject: patch for readme.vms
+[ 5170] By: gsar on 2000/02/20 22:58:09
+ Log: lexical warnings update, ability to inspect bitmask in calling
+ scope, among other things (from Paul Marquess)
Branch: perl
- ! README.vms ext/Thread/Thread.xs vms/descrip_mms.template
- ! vms/gen_shrfls.pl vms/subconfigure.com
+ ! MANIFEST lib/warnings.pm malloc.c mg.c op.c pod/perldiag.pod
+ ! pod/perlfunc.pod pod/perllexwarn.pod pp.c pp_ctl.c pp_hot.c
+ ! regcomp.c regexec.c sv.c t/op/substr.t t/pragma/warn/op
+ ! t/pragma/warn/pp t/pragma/warn/pp_ctl t/pragma/warn/pp_hot
+ ! t/pragma/warn/regcomp t/pragma/warn/regexec t/pragma/warn/sv
+ ! t/pragma/warn/toke toke.c warnings.h warnings.pl
____________________________________________________________________________
-[ 1588] By: gsar on 1998/07/21 01:26:20
- Log: change#1481 didn't go through at all, redo it
+[ 5169] By: gsar on 2000/02/20 22:22:28
+ Log: windows fixes for virtualizing child std{in,out,err} handles,
+ attempts to lock uninitialized critical section in files that
+ were never explicitly opened (from Doug Lankshear)
Branch: perl
- ! t/base/rs.t
+ ! iperlsys.h win32/perlhost.h win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 1587] By: gsar on 1998/07/21 01:21:41
- Log: workaround C<"foo" "bar"> catenation-intolerant compilers
+[ 5168] By: gsar on 2000/02/20 20:19:11
+ Log: update Changes, credits
Branch: perl
- ! regexec.c toke.c
+ ! Changes
____________________________________________________________________________
-[ 1586] By: gsar on 1998/07/21 01:05:49
- Log: do not override PERL_DESTRUCT_LEVEL if use has it set
+[ 5167] By: gsar on 2000/02/20 18:54:27
+ Log: avoid reading out-of-bounds memory when matching against reference
Branch: perl
- ! t/TEST
+ ! regexec.c
____________________________________________________________________________
-[ 1585] By: gsar on 1998/07/21 00:39:17
- Log: fix small memory leak when mess_sv happens to be touched by magic
+[ 5166] By: gsar on 2000/02/20 17:59:41
+ Log: byte mode chop() should clear UTF8 (from Gisle Aas)
Branch: perl
- ! perl.c t/lib/thread.t t/op/local.t t/op/pat.t t/op/regexp.t
+ ! doop.c
____________________________________________________________________________
-[ 1584] By: gsar on 1998/07/21 00:37:32
- Log: fix memory leak in C<local(*foo) = 'bar'>
+[ 5165] By: gsar on 2000/02/20 17:57:08
+ Log: test fix needed by change#5164
Branch: perl
- ! scope.c
+ ! t/pragma/warn/toke
____________________________________________________________________________
-[ 1583] By: TimBunce on 1998/07/20 22:14:11
- Log: Update Changes and patchlevel.h for release. At last.
- Branch: maint-5.004/perl
- ! Changes patchlevel.h
+[ 5164] By: gsar on 2000/02/20 17:50:38
+ Log: default mkdir() mode argument to 0777
+ Branch: perl
+ ! opcode.h opcode.pl pod/perldiag.pod pod/perlfunc.pod pp_sys.c
+ ! t/op/mkdir.t toke.c
____________________________________________________________________________
-[ 1582] By: gsar on 1998/07/20 21:28:43
- Log: add rsfp_filters and perldb to pollutants list
+[ 5163] By: gsar on 2000/02/20 16:34:33
+ Log: glob() takes one or no user arguments and a non-user-visible second
+ hidden argument, fix its prototype-checking accordingly
Branch: perl
- ! embed.pl
+ ! op.c opcode.h opcode.pl
____________________________________________________________________________
-[ 1581] By: nick on 1998/07/20 19:22:37
- Log: Integrate mainline pre-beta2 - just in case
- Branch: ansiperl
- !> (integrate 66 files)
+[ 5162] By: gsar on 2000/02/20 16:07:38
+ Log: make change#3386 a build-time option (avoids problems due to
+ perl_run() longjmping out)
+ Branch: perl
+ ! Todo-5.6 embed.h embed.pl embedvar.h intrpvar.h objXSUB.h
+ ! perl.c perl.h perlapi.c perlvars.h pp_ctl.c proto.h scope.c
+ ! scope.h sv.c thrdvar.h util.c
____________________________________________________________________________
-[ 1580] By: TimBunce on 1998/07/20 17:16:38
- Log: Assorted patches:
-
- Title: "Clean up hash array allocation"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807201052.GAA13336@aatma.engin.umich.edu>
- Files: hv.c
-
- Title: "Further fixes for cppstdin on HP-UX 11"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980720124202.6585B-100000@newton.phys>
- Files: hints/hpux.sh
- Branch: maint-5.004/perl
- ! hints/hpux.sh hv.c
+[ 5161] By: gsar on 2000/02/20 12:13:37
+ Log: IO::Socket now sets $!, avoids eval/die (patch from Graham Barr
+ modified to use Errno more portably)
+ Branch: perl
+ ! ext/IO/lib/IO/Socket.pm ext/IO/lib/IO/Socket/INET.pm
____________________________________________________________________________
-[ 1579] By: TimBunce on 1998/07/20 09:46:14
- Log: Assorted patches:
-
- Title: "Fix C<$1 .. $2> coredump under debugger"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807200042.UAA23288@aatma.engin.umich.edu>
- Files: pp_ctl.c
-
- Title: "Fix lvalue leaks stemming from failure to free LvTARG(sv)"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807191829.OAA12433@aatma.engin.umich.edu>
- Files: embed.h perl.h proto.h global.sym mg.c sv.c t/op/substr.t t/op/vec.t
-
- Title: "fix major bug (from 5.003_96); void contexts were using the context
- of the enclosing sub!"
- From: Francois Desarmenien <desar@club-internet.fr>, Gurusamy Sarathy
- <gsar@engin.umich.edu>
- Msg-ID: <199807180927.FAA08032@aatma.engin.umich.edu>,
- <35B1CA51.A606AD27@club-internet.fr>
- Files: op.h
-
- Title: "Update lib/Getopt/Long.pm (from perl5.005 beta 1)"
- From: Johan Vromans <jvromans@squirrel.nl>
- Msg-ID: <13745.47704.943964.34613@phoenix.squirrel.nl>
- Files: lib/Getopt/Long.pm
+[ 5160] By: gsar on 2000/02/20 11:53:28
+ Log: mention portability caveat about C<use Errno 'EFOO'>
+ Branch: perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 5159] By: gsar on 2000/02/20 11:14:36
+ Log: revise docs on @+ and @- (from Tom "Camel" Christiansen)
+ Branch: perl
+ ! pod/perlvar.pod
+____________________________________________________________________________
+[ 5158] By: gsar on 2000/02/20 10:53:49
+ Log: README.vms and related updates (from Peter Prymmer <pvhp@best.com>)
+ Branch: perl
+ ! MANIFEST Makefile.SH README.vms pod/perl5005delta.pod
+ ! pod/perldelta.pod pod/perlport.pod pod/podchecker.PL
+ ! vms/descrip_mms.template
+____________________________________________________________________________
+[ 5157] By: jhi on 2000/02/19 20:29:26
+ Log: Be explicit about what ops work with bt vectors.
+ (And implicit about which don't.)
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 5156] By: jhi on 2000/02/19 18:38:14
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/bytes.pm lib/bytes_heavy.pl
+ - lib/byte.pm lib/byte_heavy.pl
+ !> (integrate 61 files)
+____________________________________________________________________________
+[ 5155] By: gsar on 2000/02/19 17:57:39
+ Log: char vs U8 warnings
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 5154] By: gsar on 2000/02/19 17:44:56
+ Log: remove outdated caveat about C<while ($k = each %foo)> (from
+ Hugo van der Sanden)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 5153] By: gsar on 2000/02/19 17:41:41
+ Log: tests, doc tweak (from Gisle Aas)
+ Branch: perl
+ ! pod/perlfaq9.pod t/op/ord.t
+____________________________________________________________________________
+[ 5152] By: gsar on 2000/02/19 17:35:50
+ Log: document behavior of splice(@ary) (from Gisle Aas)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 5151] By: gsar on 2000/02/19 17:33:59
+ Log: fix bug in backtracking optimizer (from Makoto Ishisone
+ <ishisone@sra.co.jp>)
+ Branch: perl
+ ! regexec.c t/op/pat.t
+____________________________________________________________________________
+[ 5150] By: gsar on 2000/02/19 17:33:05
+ Log: more B fixups to cope with empty GVs (these can only happen in pads)
+ Branch: perl
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/C.pm op.c
+____________________________________________________________________________
+[ 5149] By: gsar on 2000/02/19 17:32:03
+ Log: avoid compiler warnings
+ Branch: perl
+ ! malloc.c perl.h
+____________________________________________________________________________
+[ 5148] By: gsar on 2000/02/19 17:18:09
+ Log: document 'lvalue' attribute (from Simon Cozens <simon@brecon.co.uk>)
+ Branch: perl
+ ! lib/attributes.pm
+____________________________________________________________________________
+[ 5147] By: gsar on 2000/02/19 17:15:34
+ Log: avoid failing on $!{ENOTHERE} (they can always use C<exists $!{NOTHERE}>
+ for that)
+ Branch: perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 5146] By: gsar on 2000/02/19 16:18:46
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> Configure config_h.SH ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
+ !> ext/SDBM_File/sdbm/sdbm.c ext/Socket/Socket.pm
+ !> ext/Socket/Socket.xs hints/hpux.sh perl.h pod/perldelta.pod
+ !> pod/perlfunc.pod pod/perlopentut.pod t/lib/syslfs.t
+____________________________________________________________________________
+[ 5145] By: gsar on 2000/02/19 16:10:37
+ Log: POSIX::strftime gets the date wrong (from John Tobey
+ <jtobey@epsilondev.com>)
+ Branch: perl
+ ! ext/POSIX/POSIX.xs t/lib/posix.t
+____________________________________________________________________________
+[ 5144] By: gsar on 2000/02/19 16:02:40
+ Log: don't blindly set bool=char on linux (from Andy Dougherty)
+ Branch: perl
+ ! handy.h hints/linux.sh x2p/a2p.h
+____________________________________________________________________________
+[ 5143] By: gsar on 2000/02/19 15:54:04
+ Log: some rearrangement of the includes for easier "microperl" build;
+ add PERL_MICRO guards supplied by Simon Cozens <simon@brecon.co.uk>
+ Branch: perl
+ ! doio.c perl.c perl.h pp_hot.c pp_sys.c toke.c util.c
+____________________________________________________________________________
+[ 5142] By: gsar on 2000/02/19 15:22:17
+ Log: fixes for Pod::Html issues (from Wolfgang Laun
+ <wolfgang.laun@chello.at>)
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 5141] By: gsar on 2000/02/19 08:27:29
+ Log: grammos (spotted by Tom Christiansen)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 5140] By: gsar on 2000/02/19 08:17:04
+ Log: various xsubpp enhancements that make it easier to use with
+ C::Scan (from Ilya Zakharevich)
- Title: "Add Porting/p4d2p utility for converting perforce diffs"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807200002.UAA21398@aatma.engin.umich.edu>
- Files: MANIFEST Porting/p4d2p
- Branch: maint-5.004/perl
- + Porting/p4d2p
- ! MANIFEST embed.h global.sym lib/Getopt/Long.pm mg.c op.h
- ! perl.h pp_ctl.c proto.h sv.c t/op/substr.t t/op/vec.t
-____________________________________________________________________________
-[ 1578] By: gsar on 1998/07/20 09:38:39
- Log: complete s/foo/PL_foo/ changes (all escaped cases identified with
- brute force search script). Result builds and passes all tests on
- Solaris. win32 and PERL_OBJECT are still untested.
- Branch: perl
- ! XSLock.h XSUB.h bytecode.h bytecode.pl byterun.c cc_runtime.h
- ! djgpp/djgpp.c embed.pl ext/B/B.xs ext/B/B/Asmdata.pm
- ! ext/B/byteperl.c ext/DB_File/DB_File.xs ext/DB_File/typemap
- ! ext/DynaLoader/dl_dld.xs ext/DynaLoader/dl_next.xs
- ! ext/DynaLoader/dl_vms.xs ext/GDBM_File/typemap ext/IO/IO.xs
- ! ext/IPC/SysV/SysV.xs ext/NDBM_File/typemap
- ! ext/ODBM_File/ODBM_File.xs ext/ODBM_File/typemap
- ! ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs ext/SDBM_File/typemap
- ! ext/Thread/Thread.xs ext/attrs/attrs.xs fakethr.h gv.c hv.c
- ! lib/ExtUtils/typemap malloc.c mg.c op.c os2/OS2/PrfDB/PrfDB.xs
- ! os2/OS2/PrfDB/typemap os2/OS2/REXX/REXX.xs os2/os2.c
- ! os2/os2ish.h perl.c perl.h pp.c pp_ctl.c pp_hot.c pp_sys.c
- ! regcomp.c regcomp.h regexec.c scope.c scope.h sv.h taint.c
- ! toke.c util.c vms/ext/DCLsym/DCLsym.xs vms/ext/Stdio/Stdio.xs
- ! vms/vms.c vms/vmsish.h win32/win32.c win32/win32thread.c
-____________________________________________________________________________
-[ 1577] By: TimBunce on 1998/07/20 08:28:17
- Log: Title: "Make failed matches return empty list in list context"
- From: "Paul E. Maisano" <pem@aaii.oz.au>, Gurusamy Sarathy
- <gsar@engin.umich.edu>, Paul Maisano <pem@aaii.oz.au>
- Msg-ID: <199807200002.UAA21398@aatma.engin.umich.edu>,
- <199807200027.KAA27815@ironbark-ridge.aaii.oz.au>,
- <35B156FB.504E66E@aaii.oz.au>
- Files: pod/perlop.pod pp_hot.c t/op/pat.t
- Branch: maint-5.004/perl
- ! pod/perlop.pod pp_hot.c t/op/pat.t
-____________________________________________________________________________
-[ 1576] By: TimBunce on 1998/07/20 08:11:37
- Log: Title: "win32 update from 5.005 beta 2 for 5.004_05"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807192332.TAA20905@aatma.engin.umich.edu>
- Files: win32/include/dirent.h win32/include/sys/socket.h proto.h
- lib/ExtUtils/Liblist.pm lib/ExtUtils/Mksymlists.pm
- win32/win32.h win32/win32iop.h README.win32 installperl
- pp_ctl.c win32/Makefile win32/config.bc win32/config.vc
- win32/config_H.bc win32/config_H.vc win32/config_h.PL
- win32/config_sh.PL win32/dl_win32.xs win32/makedef.pl
- win32/makefile.mk win32/pod.mak win32/win32.c
- win32/win32sck.c win32/bin/pl2bat.pl
- Branch: maint-5.004/perl
- ! README.win32 installperl lib/ExtUtils/Liblist.pm
- ! lib/ExtUtils/Mksymlists.pm pp_ctl.c proto.h win32/Makefile
- ! win32/bin/pl2bat.pl win32/config.bc win32/config.vc
- ! win32/config_H.bc win32/config_H.vc win32/config_h.PL
- ! win32/config_sh.PL win32/dl_win32.xs win32/include/dirent.h
- ! win32/include/sys/socket.h win32/makedef.pl win32/makefile.mk
- ! win32/pod.mak win32/win32.c win32/win32.h win32/win32iop.h
- ! win32/win32sck.c
+ TODO: still needs documentation
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 1575] By: gsar on 1998/07/20 01:27:14
- Log: integrate ansi branch to get s/foo/PL_foo/ changes
+[ 5139] By: gsar on 2000/02/19 07:55:18
+ Log: s/croak/Perl_croak/
Branch: perl
- +> fixvars
- !> (integrate 537 files)
+ ! sv.c
____________________________________________________________________________
-[ 1574] By: gsar on 1998/07/20 00:33:43
- Log: fix C<$1 .. $2> coredump under debugger
+[ 5138] By: gsar on 2000/02/19 07:51:39
+ Log: make comparisons promote to utf8 as necessary (from Gisle Aas)
Branch: perl
- ! pp_ctl.c
+ ! Todo-5.6 embed.h embed.pl global.sym objXSUB.h perlapi.c
+ ! pp_hot.c proto.h sv.c toke.c
____________________________________________________________________________
-[ 1573] By: gsar on 1998/07/20 00:28:27
- Log: misc win32 config tweaks
+[ 5137] By: gsar on 2000/02/19 07:42:12
+ Log: set close-on-exec flag on sockets too, like we do for files
+ and pipes
Branch: perl
- ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_h.PL win32/makefile.mk
+ ! pod/perldelta.pod pod/perlfunc.pod pod/perlvar.pod pp_sys.c
____________________________________________________________________________
-[ 1572] By: nick on 1998/07/19 19:04:58
- Log: Missed file that had changed
- Branch: ansiperl
- ! embedvar.h
+[ 5136] By: gsar on 2000/02/19 07:23:48
+ Log: allocate sufficient buffer sizes for 64-bit wide utf8 characters
+ permitted by change#5011 (from Gisle Aas)
+ Branch: perl
+ ! pp.c utf8.c utf8.h
____________________________________________________________________________
-[ 1571] By: nick on 1998/07/19 18:57:35
- Log: Another threaded, perl malloc issue, x2p's Makefile.SH has a
- pattern match...
- Branch: ansiperl
- ! x2p/Makefile.SH
+[ 5135] By: gsar on 2000/02/19 06:53:13
+ Log: s/WARN_PRECEDENCE/WARN_BAREWORD/, vide change#5131
+ Branch: perl
+ ! lib/warnings.pm op.c warnings.h warnings.pl
____________________________________________________________________________
-[ 1570] By: nick on 1998/07/19 18:16:20
- Log: Drat! - threaded perl-malloc has mutex that needs PL_
- Branch: ansiperl
- ! malloc.c perl.h
+[ 5134] By: gsar on 2000/02/19 06:36:46
+ Log: s/byte/bytes/g remnants
+ Branch: perl
+ ! lib/bytes.pm lib/bytes_heavy.pl
____________________________________________________________________________
-[ 1569] By: nick on 1998/07/19 17:55:22
- Log: PL_ for perl's malloc
- Branch: ansiperl
- ! hv.c malloc.c
+[ 5133] By: gsar on 2000/02/19 06:33:49
+ Log: rename byte:: to bytes::
+ Branch: perl
+ +> lib/bytes.pm lib/bytes_heavy.pl
+ - lib/byte.pm lib/byte_heavy.pl
+ ! MANIFEST lib/charnames.pm lib/utf8.pm pod/perldelta.pod
+ ! pod/perltoc.pod pod/perlunicode.pod pod/perlvar.pod
+ ! t/lib/charnames.t t/op/ver.t
____________________________________________________________________________
-[ 1568] By: nick on 1998/07/19 16:23:30
- Log: PL_ minir tidy up
- Branch: ansiperl
- ! embed.pl ext/Thread/Thread.xs util.c
+[ 5132] By: gsar on 2000/02/19 05:58:42
+ Log: English names for $^R and $^S
+ Branch: perl
+ ! lib/English.pm pod/perlvar.pod
____________________________________________________________________________
-[ 1567] By: nick on 1998/07/19 13:21:07
- Log: Add PL_ to merged file
- Branch: ansiperl
- ! pp_hot.c
+[ 5131] By: gsar on 2000/02/19 05:44:20
+ Log: rename "Probable precendence problem" diagnostic to "Bareword found
+ in conditional" to better reflect the class of error (as suggested
+ by Larry)
+ Branch: perl
+ ! op.c pod/perldelta.pod pod/perldiag.pod t/pragma/warn/op
____________________________________________________________________________
-[ 1566] By: nick on 1998/07/19 12:38:30
- Log: Merge Mainline
- Branch: ansiperl
- + fixvars
- !> (integrate 29 files)
+[ 5130] By: gsar on 2000/02/19 05:43:10
+ Log: fix outdated info about PerlClinic and the bug-tracking system
+ Branch: perl
+ ! pod/perlfaq2.pod pod/perltodo.pod
____________________________________________________________________________
-[ 1565] By: gsar on 1998/07/19 07:06:54
- Log: tweak pod in MakeMaker.pm
- From: Paul Johnson <pjcj@transeda.com>
- Date: Sat, 18 Jul 1998 15:58:48 +0100
- Message-ID: <19980718155847.D903@west-tip.transeda.com>
- Subject: [PATCH]5.004_75 (DOC) MakeMaker.pm
+[ 5129] By: gsar on 2000/02/19 04:14:19
+ Log: some fixes for mingw32/GCC (SETERRNO() still appears to
+ trash memory)
Branch: perl
- ! lib/ExtUtils/MakeMaker.pm
+ ! README.win32 t/lib/safe2.t t/op/mkdir.t win32/makefile.mk
+ ! win32/win32.h
____________________________________________________________________________
-[ 1564] By: gsar on 1998/07/19 07:04:45
- Log: From: Gisle Aas <gisle@aas.no>
- Date: 17 Jul 1998 22:49:32 +0200
- Message-ID: <m390lsb3tv.fsf@furu.g.aas.no>
- Subject: [PATCH _75] sv_gets() did not NUL-terminate SV when reading records
+[ 5128] By: gsar on 2000/02/18 06:55:33
+ Log: avoid $@-clearing sideeffect of require in Carp
Branch: perl
- ! sv.c
+ ! lib/Carp.pm
____________________________________________________________________________
-[ 1563] By: gsar on 1998/07/19 07:03:32
- Log: update freebsd hints
- From: Mik Firestone <fireston@lexmark.com>
- Date: Fri, 17 Jul 1998 15:24:26 -0400 (EDT)
- Message-Id: <199807171924.AA05297@interlock2.lexmark.com>
- Subject: [PATCH 5.005b1] hints/freebsd.sh
+[ 5127] By: gsar on 2000/02/18 04:58:26
+ Log: stronger testcase for change#5126
Branch: perl
- ! hints/freebsd.sh
+ ! t/op/pat.t
____________________________________________________________________________
-[ 1562] By: gsar on 1998/07/19 07:01:33
- Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
- Date: Fri, 17 Jul 1998 10:37:49 -0700 (PDT)
- Message-Id: <199807171737.KAA06967@spock.dis.cccd.edu>
- Subject: [PATCH 5.005b1] MPE/iX hints and readme tweaks
+[ 5126] By: gsar on 2000/02/18 04:44:28
+ Log: make /\S/ match the same things /[\S]/ matches; likewise for
+ \D (from Rick Delaney <rick@consumercontact.com>)
Branch: perl
- ! README.mpeix hints/mpeix.sh
+ ! regexec.c t/op/pat.t
____________________________________________________________________________
-[ 1561] By: gsar on 1998/07/19 07:00:19
- Log: From: Norton Allen <allen@huarp.harvard.edu>
- Date: Fri, 17 Jul 1998 12:37:27 -0400 (edt)
- Message-Id: <199807171637.MAA24830@bottesini.harvard.edu>
- Subject: [PATCH: 75] make install fails
+[ 5125] By: gsar on 2000/02/18 03:57:43
+ Log: Compiler fixups from Jan Dubois
Branch: perl
- ! Makefile.SH
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/C.pm utils/perlcc.PL
____________________________________________________________________________
-[ 1560] By: gsar on 1998/07/19 06:58:55
- Log: fix flawed substitution-loop detection on zero-length matches
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Fri, 17 Jul 1998 13:55:38 -0400 (EDT)
- Message-Id: <199807171755.NAA27720@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Substitution loop in devel branch
+[ 5124] By: jhi on 2000/02/17 22:09:09
+ Log: Take out the -Wl,-z as we have survice so far without.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5123] By: jhi on 2000/02/17 18:40:17
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> dump.c ext/ODBM_File/ODBM_File.xs t/op/split.t
+____________________________________________________________________________
+[ 5122] By: gsar on 2000/02/17 18:01:14
+ Log: fix test that depends on op_dump() output
Branch: perl
- ! pp_hot.c t/op/subst.t
+ ! t/op/split.t
____________________________________________________________________________
-[ 1559] By: gsar on 1998/07/19 06:56:19
- Log: add perltrap entry about "${#a}", as suggested by
- andy barfoot <abarfoot@eng.auburn.edu>
+[ 5121] By: gsar on 2000/02/17 17:55:18
+ Log: op_dump() tweak
Branch: perl
- ! pod/perltrap.pod
+ ! dump.c
+____________________________________________________________________________
+[ 5120] By: jhi on 2000/02/16 23:11:04
+ Log: Regularize the use* questions, and replace
+ "Configure *must* be run with -Duse..." with.
+ "can be run".
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/threads/usethreads.U
+ Branch: metaconfig/U/perl
+ ! use64bits.U uselfs.U uselongdbl.U uselonglong.U
+ ! usemultiplicity.U useperlio.U usesocks.U
+____________________________________________________________________________
+[ 5119] By: jhi on 2000/02/16 22:29:11
+ Log: HP-UX 64-bitness/largefile fixes.
+ Branch: cfgperl
+ ! Configure config_h.SH ext/SDBM_File/sdbm/sdbm.c hints/hpux.sh
+ ! perl.h
+ Branch: metaconfig
+ ! U/modified/cc.U U/modified/libpth.U U/modified/libs.U
+ Branch: metaconfig/U/perl
+ ! Extensions.U
+____________________________________________________________________________
+[ 5118] By: jhi on 2000/02/16 19:47:51
+ Log: Fcntl: more O_ constants, move SEEK_ to @EXPORT_OK
+ (tag :seek), add S_I constants (and functions) (tag :mode);
+ refer only to the SEEK_ of Fcntl, not the ones from
+ POSIX or IO::; add SHUT_ to Socket; get trigonometric
+ functions from Math::Trig instead of POSIX.
+ Branch: cfgperl
+ ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs ext/Socket/Socket.pm
+ ! ext/Socket/Socket.xs perl.h pod/perldelta.pod pod/perlfunc.pod
+ ! pod/perlopentut.pod t/lib/syslfs.t
+ Branch: metaconfig/U/perl
+ + i_sysmode.U
____________________________________________________________________________
-[ 1558] By: gsar on 1998/07/19 06:43:53
- Log: From: Anton Berezin <tobez@plab.ku.dk>
- Date: Fri, 17 Jul 1998 11:49:30 +0200 (CEST)
- Message-Id: <199807170949.LAA18099@lion.plab.ku.dk>
- Subject: [PATCH 5.005b1] perlcall.pod SAVETMPS/FREETMPS bracket
+[ 5117] By: gsar on 2000/02/16 06:39:06
+ Log: avoid warnings due to redefined NULL
Branch: perl
- ! pod/perlcall.pod
+ ! ext/ODBM_File/ODBM_File.xs
____________________________________________________________________________
-[ 1557] By: gsar on 1998/07/19 06:40:33
- Log: From: "Art Green" <Art_Green@mercmarine.com>
- Date: Thu, 16 Jul 1998 21:37:05 -0500
- Message-ID: <86256644.000E61D4.00@FDLTest1.mercmarine.com>
- Subject: [PATCH]:_75 - Update hints/aix.sh for c_r library
+[ 5116] By: gsar on 2000/02/16 00:10:25
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! hints/aix.sh
+ !> Configure Makefile.SH Porting/Glossary Porting/config.sh
+ !> Porting/config_H config_h.SH ext/Sys/Hostname/Hostname.xs
+ !> ext/Sys/Syslog/Syslog.xs hints/aix.sh hints/hpux.sh
+ !> lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm myconfig.SH
+____________________________________________________________________________
+[ 5115] By: jhi on 2000/02/15 23:11:55
+ Log: Probe for <sys/utsname.h>.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH ext/Sys/Hostname/Hostname.xs
+ Branch: metaconfig/U/perl
+ + i_sysutsname.U
+____________________________________________________________________________
+[ 5114] By: jhi on 2000/02/15 22:59:59
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> ext/Sys/Hostname/Hostname.pm ext/Sys/Hostname/Hostname.xs
+ +> ext/Sys/Hostname/Makefile.PL
+ - lib/Sys/Hostname.pm
+ !> (integrate 41 files)
+____________________________________________________________________________
+[ 5113] By: gsar on 2000/02/15 21:22:18
+ Log: update Changes, patchlevel
+ Branch: perl
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 1556] By: gsar on 1998/07/19 06:38:17
- Log: update README.threads
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Thu, 16 Jul 1998 11:10:33 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980716110949.2651J-100000@newton.phys>
- Subject: Re: Sort of OK: 5.005-beta1 and threads on ppc-powerux-threads
+[ 5112] By: gsar on 2000/02/15 20:57:12
+ Log: fix change#5104 under useithreads
Branch: perl
- ! README.threads
+ ! op.c
____________________________________________________________________________
-[ 1555] By: gsar on 1998/07/19 06:36:32
- Log: From: Scott Henry <scotth@sgi.com>
- Date: 15 Jul 1998 20:23:02 -0700
- Message-ID: <yd890lu1nu1.fsf@hoshi.engr.sgi.com>
- Subject: [PATCH 5.005-beta1] update hints/irix_6.sh
+[ 5111] By: gsar on 2000/02/15 20:45:10
+ Log: export list tweak needed by change#5103
Branch: perl
- ! hints/irix_6.sh
+ ! makedef.pl
____________________________________________________________________________
-[ 1554] By: gsar on 1998/07/19 06:35:10
- Log: From: Spider Boardman <spider@web.zk3.dec.com>
- Date: Wed, 15 Jul 1998 16:56:48 -0400
- Message-Id: <199807152056.QAA369057@web.zk3.dec.com>
- Subject: [PATCH _75] dec_osf hints still wrong
+[ 5110] By: gsar on 2000/02/15 19:32:56
+ Log: add XS version of Sys::Hostname (from Greg Bacon
+ <gbacon@itsc.uah.edu>)
Branch: perl
- ! hints/dec_osf.sh
+ + ext/Sys/Hostname/Hostname.pm ext/Sys/Hostname/Hostname.xs
+ + ext/Sys/Hostname/Makefile.PL
+ - lib/Sys/Hostname.pm
+ ! MANIFEST ext/DynaLoader/Makefile.PL ext/Sys/Syslog/Makefile.PL
+ ! pod/perldelta.pod t/lib/hostname.t win32/Makefile
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 1553] By: gsar on 1998/07/19 06:33:29
- Log: tweak hpux hints in vain attempt to get cppstdin set properly
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Wed, 15 Jul 1998 16:11:43 -0400 (EDT)
- Subject: Re: HP-UX 11, perl 5.004_04, Oracle 7.3.3.4, DBI 0.93
- Message-Id: <Pine.SUN.3.96.980715161018.1560D-100000@newton.phys>
- --
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Thu, 16 Jul 1998 11:37:58 -0400 (EDT)
- Subject: Re: Configure misses preprocessor on HP-UX
- Message-Id: <Pine.SUN.3.96.980716113128.2651N-100000@newton.phys>
+[ 5109] By: gsar on 2000/02/15 18:35:28
+ Log: UNIVERSAL::can and UNIVERSAL::isa should return undef when
+ given undefined values (from Graham Barr <gbarr@pobox.com>)
Branch: perl
- ! hints/hpux.sh
+ ! universal.c
____________________________________________________________________________
-[ 1552] By: gsar on 1998/07/19 06:26:24
- Log: From: Tye McQueen <tye@metronet.com>
- Date: Wed, 15 Jul 1998 13:46:44 -0500 (CDT)
- Message-Id: <199807151846.AA12653@metronet.com>
- Subject: Minor debugger fix
+[ 5108] By: gsar on 2000/02/15 18:25:05
+ Log: avoid accidental #line directives (from Rick Delaney
+ <rick@consumercontact.com>)
Branch: perl
- ! lib/perl5db.pl
+ ! pod/perlsyn.pod toke.c
____________________________________________________________________________
-[ 1551] By: gsar on 1998/07/19 06:25:05
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Wed, 15 Jul 1998 14:23:39 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980715135257.1310F-100000@newton.phys>
- Subject: Re: Configure s?rand support [PATCH 5.004_75] -- better patch
+[ 5107] By: gsar on 2000/02/15 18:04:31
+ Log: locale guards needed (from Simon Cozens <simon@brecon.co.uk>)
Branch: perl
- ! INSTALL pp.c
+ ! perl.c
____________________________________________________________________________
-[ 1550] By: gsar on 1998/07/19 06:23:10
- Log: minor re.pm cleanup
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Date: Wed, 15 Jul 1998 12:41:14 +0100
- Message-Id: <E0ywPvu-0003V7-00@ursa.cus.cam.ac.uk>
- Subject: Re: [PATCH 5.004_74]Don't use tainted REs in Basename.pm when building perl
+[ 5106] By: gsar on 2000/02/15 18:02:17
+ Log: incorrect docs about delete() (spotted by Martyn Pearce
+ <martyn@inpharmatica.co.uk>)
Branch: perl
- ! ext/re/re.pm pod/perldiag.pod
+ ! pod/perldelta.pod pod/perlfunc.pod
____________________________________________________________________________
-[ 1549] By: gsar on 1998/07/19 06:20:49
- Log: export additional symbols on OS/2
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 15 Jul 1998 06:13:07 -0400 (EDT)
- Message-Id: <199807151013.GAA11279@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Export more symbols from Perl DLL
+[ 5105] By: gsar on 2000/02/15 17:43:27
+ Log: s/use vars/our/ (from Gisle Aas)
Branch: perl
- ! os2/os2.sym
+ ! bytecode.pl
____________________________________________________________________________
-[ 1548] By: gsar on 1998/07/19 06:18:58
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 15 Jul 1998 06:10:36 -0400 (EDT)
- Message-Id: <199807151010.GAA11270@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Minor improvements to perlcc
+[ 5104] By: gsar on 2000/02/15 17:42:06
+ Log: optimize pseudohash slice in array slice at compile time (from
+ John Tobey <jtobey@john-edwin-tobey.org>)
Branch: perl
- ! utils/perlcc.PL
+ ! op.c t/lib/fields.t
____________________________________________________________________________
-[ 1547] By: gsar on 1998/07/19 06:17:22
- Log: applied slightly tweaked version of patch
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Thu, 16 Jul 1998 15:49:15 -0400 (EDT)
- Message-Id: <199807161949.PAA08214@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Updated patch to Test::Harness
+[ 5103] By: gsar on 2000/02/15 17:18:12
+ Log: provide malloc stats via get_mstats() (from Ilya Zakharevich)
Branch: perl
- ! lib/Test/Harness.pm
+ ! embed.h embed.pl global.sym makedef.pl malloc.c objXSUB.h
+ ! perl.h perlapi.c proto.h vos/vos_dummies.c
____________________________________________________________________________
-[ 1546] By: gsar on 1998/07/19 06:11:03
- Log: improve 'frame' handling in debugger
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 15 Jul 1998 00:52:10 -0400 (EDT)
- Message-Id: <199807150452.AAA06685@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Better debugger trace
+[ 5102] By: gsar on 2000/02/15 17:05:12
+ Log: doc patches from Rick Delaney and Chris Nandor; update Todo-5.6
Branch: perl
- ! lib/perl5db.pl
+ ! Todo-5.6 pod/perldata.pod pod/perlport.pod
____________________________________________________________________________
-[ 1545] By: gsar on 1998/07/19 06:07:51
- Log: fix and test handling of literal newlines in heredocs
- From: Gisle Aas <gisle@aas.no>
- Date: 17 Jul 1998 14:58:25 +0200
- Message-ID: <m3iukw63da.fsf@furu.g.aas.no>
- Subject: Re: [PATCH _71] CRs et al
- --
- From: larry@wall.org (Larry Wall)
- Date: Fri, 17 Jul 1998 09:32:35 -0700
- Message-Id: <199807171632.JAA12959@wall.org>
- Subject: Re: [PATCH _71] CRs et al
+[ 5101] By: gsar on 2000/02/15 17:02:51
+ Log: fix regen_headers target to make all the autogenerated files
+ writable first
Branch: perl
- ! t/comp/multiline.t toke.c
+ ! Makefile.SH
____________________________________________________________________________
-[ 1544] By: gsar on 1998/07/19 06:00:12
- Log: remove possibly unwritable lib/re.pm before overwrite
- From: larry@wall.org (Larry Wall)
- Date: Wed, 15 Jul 1998 14:26:03 -0700
- Message-Id: <199807152126.OAA04623@wall.org>
- Subject: Re: bug encountered building perl5.005beta1
+[ 5100] By: gsar on 2000/02/15 16:41:53
+ Log: fix misoptimization of C<my($x,$y); $x = $y = 1 + $z;> (from
+ Ilya Zakharevich)
Branch: perl
- ! Makefile.SH
+ ! op.c t/op/lex_assign.t
____________________________________________________________________________
-[ 1543] By: gsar on 1998/07/19 05:56:18
- Log: unsubmitted Changes tweak
+[ 5099] By: gsar on 2000/02/15 16:17:36
+ Log: more complete File::Spec support for Mac and VMS, tests (from
+ Barrie Slaymaker <barries@slaysys.com>)
Branch: perl
- ! Changes cygwin32/ld2
+ ! lib/File/Spec/Mac.pm lib/File/Spec/Unix.pm
+ ! lib/File/Spec/VMS.pm lib/File/Spec/Win32.pm t/lib/filespec.t
____________________________________________________________________________
-[ 1542] By: gsar on 1998/07/19 01:21:22
- Log: make failed matches return empty list in list context
+[ 5098] By: gsar on 2000/02/15 16:10:46
+ Log: fix incompatibility with bison generated parser (from
+ Ignasi Roca <ignasi.roca@fujitsu.siemens.es>)
Branch: perl
- ! pod/perlop.pod pp_hot.c t/op/pat.t
+ ! toke.c
____________________________________________________________________________
-[ 1541] By: gsar on 1998/07/18 22:27:59
- Log: remove obsolete perltrap about m//g's pos() reset behavior
+[ 5097] By: gsar on 2000/02/15 16:07:17
+ Log: propagate st_mode bits to group/other for Borland build
+ (from Vadim Konovalov <vkonovalov@lucent.com>)
Branch: perl
- ! pod/perltrap.pod
+ ! win32/win32.c
____________________________________________________________________________
-[ 1540] By: nick on 1998/07/18 22:16:26
- Log: PL_ stuff passes non-threaded on Mingw32
- (Why did it compile without this fix?)
- Branch: ansiperl
- ! pp_sys.c
+[ 5096] By: jhi on 2000/02/15 14:22:23
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> win32/Makefile win32/bin/exetype.pl win32/makefile.mk
____________________________________________________________________________
-[ 1539] By: TimBunce on 1998/07/18 22:04:58
- Log: Assorted patches:
-
- Title: "Minor fixes to MakeMaker docs re ExtUtils::Embed"
- From: Paul Johnson <pjcj@transeda.com>
- Msg-ID: <19980718155847.D903@west-tip.transeda.com>
- Files: lib/ExtUtils/MakeMaker.pm
-
- Title: "Update t/op/array.t (from 5.005 beta 1)"
- Files: t/op/array.t
- Branch: maint-5.004/perl
- ! lib/ExtUtils/MakeMaker.pm t/op/array.t
-____________________________________________________________________________
-[ 1538] By: TimBunce on 1998/07/18 21:57:50
- Log: Title: "Remove flawed '// with parens or $&' performance patch (Change 662)"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Tim Bunce <Tim.Bunce@ig.co.uk>,
- larry@wall.org (Larry Wall)
- Msg-ID: <19980717015308.E6244@ig.co.uk>, <199807171819.LAA13771@wall.org>,
- <E0yvtzn-0002F9-00@ursa.cus.cam.ac.uk>
- Files: cop.h embed.h perl.h proto.h regexp.h gv.c interp.sym perl.c pp.c
- pp_ctl.c pp_hot.c regexec.c scope.c
- Branch: maint-5.004/perl
- ! cop.h embed.h gv.c interp.sym perl.c perl.h pp.c pp_ctl.c
- ! pp_hot.c proto.h regexec.c regexp.h scope.c
+[ 5095] By: jhi on 2000/02/15 14:19:22
+ Log: cc_r can be in different places (/usr/ibmcxx/bin or /usr/bin),
+ easier just to drop the paranoid test.
+ Branch: cfgperl
+ ! hints/aix.sh
____________________________________________________________________________
-[ 1537] By: nick on 1998/07/18 20:56:58
- Log: PL_ scheme Builds under Minw32 - some SEGFAULT snags
- Branch: ansiperl
- ! doio.c mg.c perl.c pp_hot.c pp_sys.c util.c win32/perllib.c
- ! win32/win32.c win32/win32.h
+[ 5094] By: gsar on 2000/02/15 05:42:17
+ Log: update exetype.pl tool
+ Branch: perl
+ ! win32/Makefile win32/bin/exetype.pl win32/makefile.mk
____________________________________________________________________________
-[ 1536] By: nick on 1998/07/18 20:50:26
- Log: Merge latest mainline
- Branch: ansiperl
- ! patchlevel.h
- !> ext/Thread/Thread.xs op.h util.c
+[ 5093] By: jhi on 2000/02/15 05:24:02
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Porting/pumpkin.pod embed.h embed.pl ext/DB_File/DB_File.xs
+ !> ext/GDBM_File/GDBM_File.xs ext/NDBM_File/NDBM_File.xs
+ !> ext/ODBM_File/ODBM_File.xs ext/SDBM_File/SDBM_File.xs hv.c
+ !> perl.c proto.h sv.c t/op/ord.t t/pragma/warnings.t
____________________________________________________________________________
-[ 1535] By: nick on 1998/07/18 16:45:29
- Log: Edited "behind my back" ...
- Branch: ansiperl
- ! vms/perly_c.vms
+[ 5092] By: jhi on 2000/02/15 05:22:09
+ Log: Unroll the libs scan thanks to HP-UX.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/hpux.sh
+ Branch: metaconfig
+ ! U/modified/libpth.U U/modified/libs.U
+ Branch: metaconfig/U/perl
+ ! Extensions.U dlsrc.U
____________________________________________________________________________
-[ 1534] By: nick on 1998/07/18 16:38:27
- Log: PL_ stuff for threads
- Branch: ansiperl
- ! byterun.c cop.h deb.c doio.c doop.c embed.pl embedvar.h
- ! ext/B/B.xs ext/Thread/Thread.xs gv.c intrpvar.h mg.c
- ! miniperlmain.c op.c op.h perl.c perl.h perly.y pp.c pp.h
- ! pp_ctl.c pp_hot.c pp_sys.c regexec.c run.c scope.c sv.c sv.h
- ! thread.h toke.c util.c win32/perllib.c
-____________________________________________________________________________
-[ 1533] By: nick on 1998/07/18 14:30:54
- Log: Builds and passes tests with -DMULTIPLICITY and -DCRIPPLED_CC
- (still with PERL_GLOBAL_STRUCT) - to cover more #if branches
- Branch: ansiperl
- ! embed.pl intrpvar.h perl.c toke.c
+[ 5091] By: gsar on 2000/02/15 05:17:56
+ Log: fix leaks in *DBM_File; safemalloc()ed things need to be freed with
+ safefree() rather than Safefree()
+ Branch: perl
+ ! ext/DB_File/DB_File.xs ext/GDBM_File/GDBM_File.xs
+ ! ext/NDBM_File/NDBM_File.xs ext/ODBM_File/ODBM_File.xs
+ ! ext/SDBM_File/SDBM_File.xs
____________________________________________________________________________
-[ 1532] By: nick on 1998/07/18 13:53:03
- Log: PL_ prefix to all perlvars, part1
- Builds and passes all tests at one limit i.e. -DPERL_GLOBAL_STRUCT
- Branch: ansiperl
- ! XSUB.h av.c bytecode.h byterun.c byterun.h cop.h deb.c doio.c
- ! doop.c dump.c embed.h embed.pl embedvar.h ext/B/B.xs
- ! ext/Data/Dumper/Dumper.xs ext/DynaLoader/dl_next.xs
- ! ext/ODBM_File/ODBM_File.xs ext/Opcode/Opcode.xs
- ! ext/POSIX/POSIX.xs ext/Socket/Socket.xs ext/attrs/attrs.xs
- ! ext/re/re.xs gv.c hv.c hv.h lib/ExtUtils/typemap
- ! lib/ExtUtils/xsubpp mg.c miniperlmain.c op.c perl.c perl.h
- ! perly.c perly.y pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c regcomp.c
- ! regcomp.h regexec.c run.c scope.c scope.h sv.c sv.h taint.c
- ! thrdvar.h toke.c universal.c util.c
-____________________________________________________________________________
-[ 1531] By: gsar on 1998/07/18 08:48:13
- Log: fix yet another USE_THREADS leak due to failure to free stacks
- Branch: perl
- ! ext/Thread/Thread.xs util.c
-____________________________________________________________________________
-[ 1530] By: gsar on 1998/07/18 08:46:58
- Log: fix major bug in GIMME (introduced in 5.003_96); void contexts were
- using the context of the enclosing sub!
+[ 5090] By: gsar on 2000/02/15 04:54:17
+ Log: fix memory leak in C<$x = *Y> provoked by change#4198, which
+ introduced XPVMG storage in arenas
Branch: perl
- ! op.h
+ ! sv.c
____________________________________________________________________________
-[ 1529] By: nick on 1998/07/18 08:18:03
- Log: Integrate post-beta tweaks to ansiperl
- Branch: ansiperl
- !> ObjXSub.h embed.h ext/Thread/Thread.xs global.sym gv.c mg.c
- !> objpp.h op.c perl.c perl.h pp_sys.c proto.h sv.c t/op/substr.t
- !> t/op/vec.t toke.c util.c
+[ 5089] By: jhi on 2000/02/15 00:41:36
+ Log: AIX perl linkage tweakage.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 5088] By: jhi on 2000/02/15 00:07:06
+ Log: abort instead of just promising.
+ Branch: cfgperl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 5087] By: jhi on 2000/02/14 23:51:05
+ Log: silly compilers don't know that croak() exits
+ and complain about unitialized RETVALs
+ Branch: cfgperl
+ ! ext/Sys/Syslog/Syslog.xs
+____________________________________________________________________________
+[ 5086] By: jhi on 2000/02/14 21:13:24
+ Log: Add lseektype and lseeksize to myconfig.
+ Branch: cfgperl
+ ! myconfig.SH
____________________________________________________________________________
-[ 1528] By: gsar on 1998/07/18 04:23:12
- Log: fix lvalue leaks stemming from failure to free LvTARG(sv)
+[ 5085] By: gsar on 2000/02/14 18:51:11
+ Log: avoid warnings
Branch: perl
- ! ObjXSub.h embed.h global.sym mg.c objpp.h perl.h proto.h sv.c
- ! t/op/substr.t t/op/vec.t
+ ! perl.c
____________________________________________________________________________
-[ 1527] By: gsar on 1998/07/18 02:16:40
- Log: check ferror() only if read() returned 0
+[ 5084] By: gsar on 2000/02/14 18:26:08
+ Log: fix small interpreter leaks identified by Purify
Branch: perl
- ! pp_sys.c
+ ! Porting/pumpkin.pod embed.h embed.pl hv.c perl.c proto.h sv.c
+ ! t/op/ord.t t/pragma/warnings.t
+____________________________________________________________________________
+[ 5083] By: jhi on 2000/02/14 17:50:52
+ Log: Remove tagged core files.
+ Branch: cfgperl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 5082] By: jhi on 2000/02/14 17:41:07
+ Log: Prefer full_ar.
+ Branch: cfgperl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
____________________________________________________________________________
-[ 1526] By: gsar on 1998/07/18 02:08:01
- Log: fix another CvMUTEXP() leak
+[ 5081] By: jhi on 2000/02/14 17:20:32
+ Log: Add ivtype, ivsize, nvtype, nvsize to myconfig.
+ Branch: cfgperl
+ ! myconfig.SH
+____________________________________________________________________________
+[ 5080] By: jhi on 2000/02/14 15:33:03
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Porting/pumpkin.pod av.c malloc.c sv.c
+____________________________________________________________________________
+[ 5079] By: gsar on 2000/02/14 08:50:06
+ Log: notes about running Purify
Branch: perl
- ! gv.c
+ ! Porting/pumpkin.pod av.c sv.c
____________________________________________________________________________
-[ 1525] By: TimBunce on 1998/07/18 01:51:52
- Log: Assorted patches:
-
- Title: "Fix @a=@a=qw(...) properly"
- From: Stephen McCamant <alias@mcs.com>
- Msg-ID: <13742.49404.367751.437966@alias-2.pr.mcs.net>
- Files: opcode.h
-
- Title: "Larry's patch to support CR LF in scripts (updated)"
- From: Gisle Aas <gisle@aas.no>, larry@wall.org (Larry Wall)
- Msg-ID: <199807120054.RAA19550@wall.org>, <m3iukw63da.fsf@furu.g.aas.no>
- Files: t/comp/multiline.t toke.c
-
- Title: "Change getc() docs to match behaviour. Make read() return undef on
- error."
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807052257.SAA10004@aatma.engin.umich.edu>
- Files: pod/perlfunc.pod pp_sys.c
-
- Title: "Update patchls utility"
- Files: Porting/patchls
- Branch: maint-5.004/perl
- ! Porting/patchls opcode.h pod/perlfunc.pod pp_sys.c
- ! t/comp/multiline.t toke.c
+[ 5078] By: gsar on 2000/02/14 07:27:21
+ Log: use system malloc() instead of sbrk() in Perl_malloc() under -DPURIFY
+ Branch: perl
+ ! malloc.c
____________________________________________________________________________
-[ 1524] By: gsar on 1998/07/18 01:22:35
- Log: fix CvMUTEXP() leaks with -Dusethreads
+[ 5077] By: gsar on 2000/02/14 07:25:44
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! op.c toke.c
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH epoc/config.sh hints/aix.sh hints/hpux.sh
+ !> hints/irix_6.sh hints/solaris_2.sh perl.h pod/perldelta.pod
+ !> vms/subconfigure.com vos/config.def vos/config.h
+ !> vos/config_h.SH_orig win32/config.bc win32/config.gc
+ !> win32/config.vc win32/config_H.bc win32/config_H.gc
+ !> win32/config_H.vc
+____________________________________________________________________________
+[ 5076] By: jhi on 2000/02/14 05:01:56
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> embed.h embed.pl objXSUB.h perl.c perlapi.c proto.h sv.c
+____________________________________________________________________________
+[ 5075] By: jhi on 2000/02/14 04:56:52
+ Log: Configure -A stopped processing of any further options.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Options.U
+____________________________________________________________________________
+[ 5074] By: gsar on 2000/02/14 04:45:01
+ Log: remove outdated -DPURIFY code--it reports bogus errors during global
+ destruction since we actually depend on SVs being in arenas there
+ Branch: perl
+ ! embed.h embed.pl objXSUB.h perl.c perlapi.c proto.h sv.c
____________________________________________________________________________
-[ 1523] By: gsar on 1998/07/18 01:17:28
- Log: fix $/ init for multiple interpreters/threads
+[ 5073] By: jhi on 2000/02/13 19:28:17
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ - Todo-5.005
+ !> cop.h op.c perl.c pp_ctl.c regcomp.c regexec.c scope.c sv.c
+ !> util.c
+____________________________________________________________________________
+[ 5072] By: gsar on 2000/02/13 19:02:07
+ Log: more purification (pp_require() could access free memory; vdie()
+ could think message was random length when passed a null argument;
+ utilize() didn't set up the hash for the method name leading to
+ pp_method_named() accessing random state; PL_curpm wasn't zeroed
+ properly)
+ Branch: perl
+ ! cop.h op.c perl.c pp_ctl.c regcomp.c regexec.c scope.c sv.c
+ ! util.c
+____________________________________________________________________________
+[ 5071] By: jhi on 2000/02/12 19:59:35
+ Log: uselonglong sits deep.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/solaris_2.sh
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 5070] By: jhi on 2000/02/12 01:25:41
+ Log: megalomaniac 64-bit update: most importantly,
+ uselonglong is eradicated, only backward
+ compatibility hooks in use64bits remain.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH epoc/config.sh hints/aix.sh hints/hpux.sh
+ ! hints/irix_6.sh hints/solaris_2.sh perl.h vms/subconfigure.com
+ ! vos/config.def vos/config.h vos/config_h.SH_orig
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U U/modified/libpth.U U/modified/libs.U
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 5069] By: jhi on 2000/02/11 21:13:41
+ Log: undo #5064 for now; there seems to be no good selection
+ of flags to add the new option.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5068] By: jhi on 2000/02/11 21:01:21
+ Log: Guard against accidental long long use.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 5067] By: jhi on 2000/02/11 19:50:32
+ Log: logic fixes
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! uselonglong.U
+____________________________________________________________________________
+[ 5066] By: jhi on 2000/02/11 19:32:30
+ Log: Clarify 64-bit issues.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 5065] By: jhi on 2000/02/11 18:13:29
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> ext/Devel/Peek/Peek.xs regcomp.c t/comp/require.t t/comp/use.t
+ !> toke.c
+____________________________________________________________________________
+[ 5064] By: jhi on 2000/02/11 18:11:47
+ Log: Silence linker warnings about binary backward incompatibilities.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5063] By: gsar on 2000/02/11 16:36:14
+ Log: fix uninitialized memory reads found by purify
Branch: perl
- ! ext/Thread/Thread.xs perl.c util.c
+ ! ext/Devel/Peek/Peek.xs regcomp.c
____________________________________________________________________________
-[ 1522] By: gsar on 1998/07/18 01:11:07
- Log: fix missing init that caused RE alternations to fail under
- -Dusethreads
+[ 5062] By: jhi on 2000/02/11 00:11:39
+ Log: de-fancify the largefiles hints
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 5061] By: gsar on 2000/02/10 19:17:09
+ Log: longstanding bug in parsing "require VERSION", could reallocate
+ current line and not know it; exposed by change#5004; manifested
+ as parse failure of C<{require 5.003}>
Branch: perl
- ! util.c
+ ! t/comp/require.t t/comp/use.t toke.c
____________________________________________________________________________
-[ 1521] By: TimBunce on 1998/07/16 22:23:25
- Log: Assorted patches:
-
- Title: "Allow $SIG{CHLD}='IGNORE' to work (reap zombies) on Solaris"
- From: Albert Dvornik <bert@genscan.com>, Chip Salzenberg <chip@perl.org>
- Msg-ID: <19980708181055.A8005@perlsupport.com>,
- <tqn2adkvge.fsf@puma.genscan.com>
- Files: util.c
-
- Title: "Document perltrap on precedence of keys/values/each"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807151857.OAA04704@aatma.engin.umich.edu>
- Files: pod/perltrap.pod
-
- Title: "perlbook.pod patch"
- From: Tom Christiansen <tchrist@chthon.perl.com>
- Msg-ID: <199807140037.SAA04556@chthon.perl.com>
- Files: pod/perlbook.pod
-
- Title: "perlmod.pod patch"
- From: Tom Christiansen <tchrist@chthon.perl.com>
- Msg-ID: <199807140109.TAA04678@chthon.perl.com>
- Files: pod/perlmod.pod
-
- Title: "Fix bug in IO::Handle->input_record_separator"
- From: Robin Barker <rmb1@cise.npl.co.uk>, Swen Thuemmler
- <Swen.Thuemmler@paderlinx.de>
- Msg-ID: <199807161400.PAA25532@tempest.cise.npl.co.uk>,
- <Pine.GSO.4.00.9807161649380.6537-100000@rmail>
- Files: ext/IO/lib/IO/Handle.pm
-
- Title: "update h2ph, Math::Complex and Math::Trig (from 5.005 beta 1)"
- Files: lib/Math/Complex.pm lib/Math/Trig.pm t/lib/complex.t t/lib/h2ph.t
- t/lib/trig.t utils/h2ph.PL
-
- Title: "Update hints/irix_6.sh"
- From: Scott Henry <scotth@sgi.com>
- Msg-ID: <yd890lu1nu1.fsf@hoshi.engr.sgi.com>
- Files: hints/irix_6.sh
-
- Title: "Configure misses preprocessor on HP-UX (further fix)"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980716113128.2651N-100000@newton.phys>
- Files: hints/hpux.sh
-
- Title: "update perlbug to v1.26 (from 5.005 beta 1)"
- Files: utils/perlbug.PL
- Branch: maint-5.004/perl
- ! ext/IO/lib/IO/Handle.pm hints/hpux.sh hints/irix_6.sh
- ! lib/Math/Complex.pm lib/Math/Trig.pm pod/perlbook.pod
- ! pod/perlmod.pod pod/perltrap.pod t/lib/complex.t t/lib/h2ph.t
- ! t/lib/trig.t util.c utils/h2ph.PL utils/perlbug.PL
+[ 5060] By: jhi on 2000/02/10 13:29:25
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> makedef.pl pp_ctl.c t/op/write.t win32/vdir.h
____________________________________________________________________________
-[ 1520] By: TimBunce on 1998/07/15 21:24:12
- Log: Assorted patches:
-
- Title: "Add stub attrs.pm"
- From: Graham Barr <gbarr@ti.com>, Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <19980713163312.A18222@asic.sc.ti.com>,
- <199807132140.RAA09583@aatma.engin.umich.edu>
- Files: MANIFEST lib/attrs.pm
-
- Title: "Fix @a=@a=qw(...)"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>, Stephen McCamant
- <alias@mcs.com>
- Msg-ID: <13737.12300.950886.821143@alias-2.pr.mcs.net>,
- <199807122351.TAA05649@aatma.engin.umich.edu>
- Files: op.c opcode.pl t/op/array.t
-
- Title: "Fix 'PERL_DESTRUCT_LEVEL=2 ./perl -DD -e 1' loop"
- From: Gisle Aas <gisle@aas.no>, Stephen McCamant <alias@mcs.com>
- Msg-ID: <13739.55551.205810.338648@alias-2.pr.mcs.net>,
- <m33ec4jdwn.fsf@furu.g.aas.no>
- Files: sv.c
-
- Title: "Make Power MachTen use vfork() and system malloc()"
- From: Dominic Dunlop <domo@computer.org>, Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <v03110700b1c95b010820@[195.95.102.91]>
- Files: hints/machten.sh malloc.c
-
- Title: "Use REG_INFTY in place of hardwired constant"
- From: Dominic Dunlop <domo@computer.org>
- Msg-ID: <v03110703b1ca662c44f8@[195.95.102.91]>
- Files: regcomp.h regcomp.c regexec.c
-
- Title: "Minor debugger fix (history adds an extra newline)"
- From: Tye McQueen <tye@metronet.com>
- Msg-ID: <199807151846.AA12653@metronet.com>
- Files: lib/perl5db.pl
-
- Title: "Protect Term::ReadLine against non-default $/ value"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>,
- kstar@chapin.edu@ig.co.uk ()
- Msg-ID: <19980713151749.G8596@O2.chapin.edu>,
- <199807132139.RAA11270@monk.mps.ohio-state.edu>
- Files: lib/Term/ReadLine.pm
-
- Title: "Fix HP-UX 11 build (cppstdin)"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980715161018.1560D-100000@newton.phys>
- Files: Configure hints/hpux.sh
-
- Title: "VMS filetest operator fixup (SS$_ACCONFLICT)"
- From: Dan Sugalski <sugalskd@osshe.edu>
- Msg-ID: <3.0.5.32.19980702135255.00a6ad90@ous.edu>
- Files: vms/vms.c
- Branch: maint-5.004/perl
- + lib/attrs.pm
- ! Configure MANIFEST hints/hpux.sh hints/machten.sh
- ! lib/Term/ReadLine.pm lib/perl5db.pl malloc.c op.c opcode.pl
- ! regcomp.c regcomp.h regexec.c sv.c t/op/array.t vms/vms.c
+[ 5059] By: gsar on 2000/02/10 06:21:21
+ Log: make global symbol exports AIX-specific
+ Branch: perl
+ ! makedef.pl
____________________________________________________________________________
-[ 1519] By: nick on 1998/07/15 18:56:17
- Log: Integrate mainline at beta1
- Branch: ansiperl
- +> Porting/p4d2p README.mpeix Todo-5.005
- +> ext/DynaLoader/dl_mpeix.xs ext/re/hints/mpeix.pl
- +> mpeix/mpeixish.h mpeix/nm mpeix/relink perly_c.diff
- +> pod/perld4.pod pod/perlport.pod t/lib/ipc_sysv.t
- - Todo.5.005 lib/Bundle/CPAN.pm perly.c.diff pod/perldelta4.pod
- - t/op/ipcmsg.t t/op/ipcsem.t
- !> (integrate 167 files)
+[ 5058] By: gsar on 2000/02/10 06:16:57
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> Configure Makefile.SH Porting/Glossary Porting/config.sh
+ !> Porting/config_H config_h.SH makedef.pl perl.h
+ !> vms/subconfigure.com vos/config.def win32/config.bc
+ !> win32/config.gc win32/config.vc win32/config_H.bc
+ !> win32/config_H.gc win32/config_H.vc win32/config_h.PL
+ !> win32/config_sh.PL
+____________________________________________________________________________
+[ 5057] By: gsar on 2000/02/10 01:08:01
+ Log: windows bugfixes for virtual directories under USE_ITHREADS:
+ allows path mapping to unknown devices to work properly;
+ special file names like CONOUT$ can be opened with sysopen()
+ again
+ Branch: perl
+ ! win32/vdir.h
+____________________________________________________________________________
+[ 5056] By: gsar on 2000/02/10 00:56:27
+ Log: formline() could wipe out readonly-ness, freeing constants
+ prematurely, or affect cloning of pad constants
+ Branch: perl
+ ! pp_ctl.c t/op/write.t
+____________________________________________________________________________
+[ 5055] By: jhi on 2000/02/09 19:48:58
+ Log: Regenerate Configure for I_SYSLOG.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 5054] By: jhi on 2000/02/09 19:38:04
+ Log: fix AIX and multiplicity problems
+ Branch: cfgperl
+ ! Makefile.SH makedef.pl
+____________________________________________________________________________
+[ 5053] By: bailey on 2000/02/09 10:58:11
+ Log: remove redundant archcore directory prefix in installperl
+ Branch: vmsperl
+ ! installperl
+____________________________________________________________________________
+[ 5052] By: bailey on 2000/02/09 10:44:22
+ Log: Work around prefixing bug in older DECC preprocessors
+ Branch: vmsperl
+ ! vms/vms.c vms/vmsish.h
+____________________________________________________________________________
+[ 5051] By: bailey on 2000/02/09 09:52:06
+ Log: Eliminate unnecessary (and sometimes confounding) test for
+ word boundary
+ Branch: vmsperl
+ ! lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 5050] By: bailey on 2000/02/09 09:29:06
+ Log: Minor fixes to assuage picky compilers (unsigned comparisons and
+ alias rules lead to compilation warnings)
+ Branch: vmsperl
+ ! av.c mg.h pp_sys.c scope.c sv.c vms/vms.c
+____________________________________________________________________________
+[ 5049] By: bailey on 2000/02/09 09:09:45
+ Log: Resync with mainline
+ Branch: vmsperl
+ +> Todo-5.6 ext/Sys/Syslog/Makefile.PL ext/Sys/Syslog/Syslog.pm
+ +> ext/Sys/Syslog/Syslog.xs lib/Pod/Find.pm lib/Pod/ParseUtils.pm
+ +> pod/perlapi.pod pod/perlintern.pod pod/perlunicode.pod
+ +> t/op/exists_sub.t t/op/ver.t t/pragma/diagnostics.t
+ +> vos/config.def vos/config.pl win32/bin/exetype.pl
+ - Todo-5.005 lib/Sys/Syslog.pm lib/caller.pm
+ ! vms/subconfigure.com
+ !> (integrate 358 files)
+____________________________________________________________________________
+[ 5048] By: jhi on 2000/02/09 03:54:05
+ Log: OS/2 gcc doesn't like -o foo.exe and -Zexe simultaneously
+ (reported by Yitzchak Scott-Thoennes in p5p)
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 5047] By: jhi on 2000/02/09 02:56:43
+ Log: (fake) use of getcwd.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h
+____________________________________________________________________________
+[ 5046] By: jhi on 2000/02/09 02:22:50
+ Log: lib scan fix
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/libs.U
+____________________________________________________________________________
+[ 5045] By: jhi on 2000/02/09 02:17:34
+ Log: Reintroduce #5019 via metaconfig.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/installdirs/inc_version_list.U
+____________________________________________________________________________
+[ 5044] By: jhi on 2000/02/09 02:07:08
+ Log: Add/restore probes for getcwd/mk*temp*/mmap.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h vms/subconfigure.com vos/config.def
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/config_h.PL win32/config_sh.PL
+ Branch: metaconfig
+ ! U/modified/d_mkstemp.U U/modified/libs.U
+ Branch: metaconfig/U/perl
+ + d_mkdtemp.U d_mkstemps.U
+____________________________________________________________________________
+[ 5043] By: jhi on 2000/02/08 20:58:02
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> Todo-5.6 t/op/ver.t win32/bin/exetype.pl
+ !> (integrate 110 files)
+____________________________________________________________________________
+[ 5042] By: gsar on 2000/02/08 20:32:12
+ Log: avoid exiting just because we didn't scan for libm ('libs' may still
+ have it, but we avoided scan for things in 'libs')
+ Branch: perl
+ ! Configure
----------------
-Version 5.004_75 5.005 Public Beta, Issue 1
+Version v5.5.650
----------------
____________________________________________________________________________
-[ 1518] By: gsar on 1998/07/15 10:01:41
- Log: add stub docs for ext/B, other minor tweaks
+[ 5041] By: gsar on 2000/02/08 07:57:11
+ Log: update Changes
Branch: perl
- ! Changes Porting/config_H config_h.SH ext/B/B.pm
- ! ext/B/B/Asmdata.pm ext/B/B/Assembler.pm ext/B/B/Bblock.pm
- ! ext/B/B/Bytecode.pm ext/B/B/C.pm ext/B/B/CC.pm
- ! ext/B/B/Debug.pm ext/B/B/Disassembler.pm ext/B/B/Showlex.pm
- ! ext/B/B/Stackobj.pm ext/B/B/Terse.pm ext/B/O.pm sv.c
+ ! Changes
____________________________________________________________________________
-[ 1517] By: gsar on 1998/07/15 08:27:15
- Log: up patchlevel to 75 (Beta, Issue 1), add podpatch
- From: abigail@fnx.com
- Date: Wed, 15 Jul 1998 04:03:44 -0400 (EDT)
- Message-ID: <19980715080344.21975.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.004_74] pod/perlop.pod
+[ 5040] By: gsar on 2000/02/08 07:51:20
+ Log: documentation patches (from Michael Schwern and Yitzchak
+ Scott-Thoennes)
Branch: perl
- ! Changes patchlevel.h pod/perlop.pod win32/Makefile
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/makefile.mk
+ ! av.c hv.c lib/UNIVERSAL.pm pod/perlapi.pod
____________________________________________________________________________
-[ 1516] By: gsar on 1998/07/15 08:04:24
- Log: From: abigail@fnx.com
- Date: Wed, 15 Jul 1998 03:47:56 EDT
- Message-Id: <19980715074756.21868.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.004_74] pod/pod2man.PL Fix use of < inside C<>
+[ 5039] By: gsar on 2000/02/08 07:22:46
+ Log: alias to $^V to $PERL_VERSION_TUPLE
Branch: perl
- ! pod/pod2man.PL
+ ! lib/English.pm pod/perlvar.pod
____________________________________________________________________________
-[ 1515] By: gsar on 1998/07/15 08:02:14
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 15 Jul 1998 03:49:24 EDT
- Message-Id: <199807150749.DAA09177@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] Additional targets for OS/2 build
+[ 5038] By: gsar on 2000/02/08 07:03:34
+ Log: update Changes
Branch: perl
- ! os2/Makefile.SHs
+ ! Changes pod/perlhist.pod
____________________________________________________________________________
-[ 1514] By: gsar on 1998/07/15 07:58:29
- Log: rename some long file names to be 8.3 truncation-safe
+[ 5037] By: gsar on 2000/02/08 06:59:55
+ Log: Windows has a somewhat different sitelib layout, and needs
+ $sitelib/archname added as well
Branch: perl
- +> Todo-5.005 perly_c.diff pod/perld4.pod
- - Todo.5.005 perly.c.diff pod/perldelta4.pod
- ! MANIFEST Porting/pumpkin.pod perly.fixer
+ ! perl.c
____________________________________________________________________________
-[ 1513] By: gsar on 1998/07/15 07:35:29
- Log: minor tweaks to docs on qr//
+[ 5036] By: gsar on 2000/02/08 06:59:03
+ Log: change#4987 appears to have broken libs scan for platforms that
+ don't set ignore_versioned_solibs (Solaris is one of them); add
+ derivative fix from the older logic for skipping versioned .so
+ libs
Branch: perl
- ! ext/re/re.pm pod/perldelta.pod pod/perlop.pod pod/perlre.pod
+ ! Configure
____________________________________________________________________________
-[ 1512] By: gsar on 1998/07/15 07:06:02
- Log: applied patch, with tab tweak suggest by Peter Prymmer
- From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Tue, 14 Jul 1998 16:41:14 -0700
- Message-Id: <3.0.5.32.19980714164114.00a3e2a0@ous.edu>
- Subject: [PATCH 5.004_74]VMS build cleanups
+[ 5035] By: gsar on 2000/02/07 21:21:44
+ Log: sprintf("%v"...) buffer resizing busted
Branch: perl
- ! vms/descrip_mms.template
+ ! sv.c
____________________________________________________________________________
-[ 1511] By: gsar on 1998/07/15 07:03:33
- Log: allow perlbug -ok when STDIN it not a tty
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Date: Wed, 15 Jul 1998 03:24:56 +0200
- Message-Id: <l03130302b1d1b1e7c2a0@[194.222.64.89]>
- Subject: Re: [NOT OK] 5.004_74: "make ok" not ok in IRIX 6.2
+[ 5034] By: gsar on 2000/02/07 19:16:21
+ Log: update Changes
Branch: perl
- ! utils/perlbug.PL
+ ! Changes pod/perlhist.pod
____________________________________________________________________________
-[ 1510] By: gsar on 1998/07/15 06:59:43
- Log: From: "Art Green" <Art_Green@mercmarine.com>
- Date: Tue, 14 Jul 1998 20:53:48 -0500
- Message-ID: <86256642.0004D7AB.00@FDLTest1.mercmarine.com>
- Subject: [PATCH]:_74 - Allow Configure to recognize _AIX41 & _POWER compiler defines
+[ 5033] By: gsar on 2000/02/07 19:01:08
+ Log: stringify "\x{FFF}" to utf8 correctly; set SvUTF8 on "\x{XX}"
+ only when XX > 127
Branch: perl
- ! Configure
+ ! pp_hot.c toke.c
____________________________________________________________________________
-[ 1509] By: gsar on 1998/07/15 06:57:50
- Log: typecast long vs. IV compares in pp_flip/pp_flop
+[ 5032] By: gsar on 2000/02/07 18:25:31
+ Log: add note about printf("%v",...)
Branch: perl
- ! pp_ctl.c
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 1508] By: gsar on 1998/07/15 06:50:49
- Log: don't copy foreach itervar when no external refs exist
- From: Gisle Aas <gisle@aas.no>
- Date: 15 Jul 1998 03:35:25 +0200
- Message-ID: <m33ec3nbfm.fsf@furu.g.aas.no>
- Subject: Re: Testcase for 1..n closure change
+[ 5031] By: gsar on 2000/02/07 18:18:43
+ Log: update Changes
Branch: perl
- ! pp_hot.c
+ ! Changes Todo-5.6
____________________________________________________________________________
-[ 1507] By: gsar on 1998/07/15 06:46:41
- Log: applied patch, regen headers
- From: Stephen McCamant <alias@mcs.com>
- Date: Tue, 14 Jul 1998 19:56:47 -0500 (CDT)
- Message-ID: <13739.64763.792570.626015@alias-2.pr.mcs.net>
- Subject: B::Deparse update for qr// and regcreset
+[ 5030] By: gsar on 2000/02/07 18:17:49
+ Log: thinko in change#5029
Branch: perl
- ! ext/B/B/Deparse.pm opcode.h opcode.pl
+ ! gv.c
____________________________________________________________________________
-[ 1506] By: gsar on 1998/07/15 06:43:04
- Log: make pregcomp et al VIRTUAL again for PERL_OBJECT
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Date: Tue, 14 Jul 1998 16:40:30 -0700
- Message-ID: <000301bdaf80$c93d14a0$a32fa8c0@tau.Active>
- Subject: [PATCH 5.004_74]
+[ 5029] By: gsar on 2000/02/07 17:49:58
+ Log: change $^U to $^WIDE_SYSTEM_CALLS; s/PL_bigchar/PL_widesyscalls/;
+ introduce -C switch (sets $^WIDE_SYSTEM_CALLS)
Branch: perl
- ! proto.h
+ ! embedvar.h gv.c intrpvar.h mg.c perl.c perlapi.h
+ ! pod/perlrun.pod pod/perlunicode.pod pod/perlvar.pod
+ ! win32/win32.h
____________________________________________________________________________
-[ 1505] By: gsar on 1998/07/15 06:41:43
- Log: dont use sv_dump() in -DD diagnostic
- From: Gisle Aas <gisle@aas.no>
- Date: 14 Jul 1998 23:55:36 +0200
- Message-ID: <m33ec4jdwn.fsf@furu.g.aas.no>
- Subject: [PATCH] Fix 'PERL_DESTRUCT_LEVEL=2 ./perl -DD -e 1' loop
+[ 5028] By: gsar on 2000/02/07 17:10:03
+ Log: perlport updates (from Peter Prymmer)
Branch: perl
- ! sv.c
+ ! pod/perlport.pod
____________________________________________________________________________
-[ 1504] By: gsar on 1998/07/15 06:39:37
- Log: add a few more thread.t tests
+[ 5027] By: gsar on 2000/02/07 16:53:47
+ Log: fix up Todo-5.6
Branch: perl
- ! t/lib/thread.t
+ ! Todo-5.6
____________________________________________________________________________
-[ 1503] By: gsar on 1998/07/15 06:31:33
- Log: fix thread.t ('join $t' ne '$t->join' !)
+[ 5026] By: gsar on 2000/02/07 16:32:31
+ Log: rename Todo-5.005 to Todo-5.6
Branch: perl
- ! t/lib/thread.t
+ +> Todo-5.6
+ - Todo-5.005
+ ! MANIFEST
____________________________________________________________________________
-[ 1502] By: gsar on 1998/07/15 06:26:00
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Wed, 15 Jul 1998 01:45:57 +0300 (EET DST)
- Message-Id: <199807142245.BAA09651@alpha.hut.fi>
- Subject: [PATCH] 5.004_74: MPE/iX final touches
+[ 5025] By: gsar on 2000/02/07 16:09:54
+ Log: ${^Warnings} renamed to ${^WARNING_BITS}
Branch: perl
- ! installperl lib/File/Copy.pm
+ ! gv.c lib/warnings.pm mg.c pod/perltoc.pod pod/perlvar.pod
+ ! toke.c warnings.pl
____________________________________________________________________________
-[ 1501] By: gsar on 1998/07/15 05:59:49
- Log: apply (reversed) patch
- From: Peter Wolfe <wolfe@titan.teloseng.com>
- Date: Tue, 14 Jul 1998 13:01:58 -0700 (PDT)
- Message-Id: <199807142001.NAA26550@titan.teloseng.com>
- Subject: NOT_OK: perl 5.00474 on SCO 3.2v5.0.4
+[ 5024] By: gsar on 2000/02/07 11:47:06
+ Log: various Windows tweaks: make $^E a little less buggy by saving
+ and restoring system error across TLS fetch; avoid needless
+ copying of buffers
Branch: perl
- ! ext/IPC/SysV/SysV.xs
+ ! win32/Makefile win32/makefile.mk win32/perllib.c win32/win32.c
+ ! win32/win32.h
____________________________________________________________________________
-[ 1500] By: gsar on 1998/07/15 05:57:39
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Tue, 14 Jul 1998 14:14:59 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980714141346.29710D-100000@newton.phys>
- Subject: [PATCH 5.004_74] Config_74-01
+[ 5023] By: gsar on 2000/02/07 11:44:19
+ Log: avoid MakeMaker setting $^W=1
Branch: perl
- ! Configure MANIFEST Porting/Glossary Porting/config.sh
- ! Porting/config_H Porting/pumpkin.pod config_h.SH
- ! vms/subconfigure.com win32/config.bc win32/config.gc
- ! win32/config.vc
+ ! lib/ExtUtils/MakeMaker.pm
____________________________________________________________________________
-[ 1499] By: gsar on 1998/07/15 05:48:38
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 14 Jul 1998 21:35:02 +0300 (EET DST)
- Message-Id: <199807141835.VAA09030@alpha.hut.fi>
- Subject: [PATCH] 5.004_74: trig.t: math inaccuracy fudge for unicos
+[ 5022] By: gsar on 2000/02/07 10:38:56
+ Log: up to v5.5.650
Branch: perl
- ! t/lib/trig.t
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 1498] By: gsar on 1998/07/15 05:47:33
- Log: -w, strict clean perldoc (via PM)
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Date: Tue, 14 Jul 98 17:22:01 BST
- Message-Id: <18695.9807141622@tempest.cise.npl.co.uk>
- Subject: [PATCH 5.004_74] perldoc.PL
+[ 5021] By: gsar on 2000/02/07 10:10:31
+ Log: mention threads status in pod
Branch: perl
- ! utils/perldoc.PL
+ ! ext/Thread/Thread.pm
____________________________________________________________________________
-[ 1497] By: gsar on 1998/07/15 05:35:54
- Log: add comment about cpprun etc., to hints/hpux.sh
+[ 5020] By: gsar on 2000/02/07 09:57:46
+ Log: tolerate NULL SITELIB_EXP
Branch: perl
- ! hints/hpux.sh
+ ! perl.c
____________________________________________________________________________
-[ 1496] By: gsar on 1998/07/15 05:15:16
- Log: fix warning from CGI::Carp
+[ 5019] By: gsar on 2000/02/07 09:46:11
+ Log: NULL-terminate PERL_INC_VERSION_LIST
Branch: perl
- ! lib/CGI/Carp.pm
+ ! Configure perl.c win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc
____________________________________________________________________________
-[ 1495] By: gsar on 1998/07/14 23:47:18
- Log: fix off-by-one in win32 registry handling
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Date: Tue, 14 Jul 1998 07:39:06 -0700
- Message-ID: <000401bdaf35$27489e80$a32fa8c0@tau.Active>
- Subject: [PATCH 5.004_73]
+[ 5018] By: gsar on 2000/02/07 09:13:10
+ Log: add compatible versions from $Config{inc_ver_list} to search
+ paths automatically (from Tom Hughes <tom@compton.nu>)
Branch: perl
- ! win32/win32.c
+ ! lib/lib.pm perl.c
____________________________________________________________________________
-[ 1494] By: gsar on 1998/07/14 23:45:58
- Log: doc patches from Gisle Aas <gisle@aas.no>
- Date: 14 Jul 1998 16:18:31 +0200
- Message-ID: <m33ec4cy88.fsf@furu.g.aas.no>
- Subject: [PATCH] substr/splice changes for perldelta.pod
- --
- Date: 14 Jul 1998 20:31:27 +0200
- Message-ID: <m3hg0kqo74.fsf@furu.g.aas.no>
- Subject: [PATCH] Duplicate description of use integer %
+[ 5017] By: gsar on 2000/02/07 08:58:56
+ Log: makefiles now use exetype.pl to make wperl.exe
Branch: perl
- ! pod/perldelta.pod pod/perlop.pod
+ ! sv.c win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 1493] By: gsar on 1998/07/14 23:39:31
- Log: File/Spec.pm needs trailing newline
+[ 5016] By: gsar on 2000/02/07 08:38:25
+ Log: add exetype.pl (from Jan Dubois)
Branch: perl
- ! lib/File/Spec.pm
+ + win32/bin/exetype.pl
+ ! MANIFEST
____________________________________________________________________________
-[ 1492] By: gsar on 1998/07/14 21:43:03
- Log: unsubmitted _74 tweaks
+[ 5015] By: gsar on 2000/02/07 08:29:28
+ Log: pod fixes (from Abigail and M J T Guy)
Branch: perl
- ! Changes mpeix/nm mpeix/relink pod/perldelta.pod
- ! pod/perldiag.pod
-
-----------------
-Version 5.004_74
-----------------
-
+ ! Changes README.os2 gv.c pod/perlapi.pod pod/perldebug.pod
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlopentut.pod
+ ! pod/perlport.pod pod/perlvar.pod
____________________________________________________________________________
-[ 1491] By: gsar on 1998/07/14 08:48:28
- Log: up patchlevel to 74; introduce distinct archname for PERL_OBJECT
+[ 5014] By: gsar on 2000/02/07 07:09:08
+ Log: clarify behavior of vec() when arguments are off the end of the
+ string (from M J T Guy)
Branch: perl
- ! Changes patchlevel.h pod/perlhist.pod win32/Makefile
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/makefile.mk
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1490] By: gsar on 1998/07/14 08:31:13
- Log: From: Gisle Aas <gisle@aas.no>
- Date: 14 Jul 1998 10:20:34 +0200
- Message-Id: <m3hg0k973h.fsf@furu.g.aas.no>
- Subject: [PATCH] Make -DP work (and readable)
+[ 5013] By: gsar on 2000/02/07 07:08:15
+ Log: remove $^U dependent behaviors in runtime; chr() and sprintf('%c',...)
+ now return bytes all the way to 255, they will be transparently
+ coerced (in future) to UTF-8 when they are used in operations
+ involving other UTF-8 strings; C<use utf8> doesn't set $^U anymore
Branch: perl
- ! run.c
+ ! lib/byte.pm lib/utf8.pm pod/perlunicode.pod pod/perlvar.pod
+ ! pp.c sv.c
____________________________________________________________________________
-[ 1489] By: gsar on 1998/07/14 08:23:46
- Log: fix function parameter autovivification for pseudohashes
+[ 5012] By: gsar on 2000/02/07 06:36:33
+ Log: partly revert change#4851, apparently POSIX::uname() may not be correct
+ per strict reading of standard (says Tom Christiansen)
Branch: perl
- ! mg.c t/op/avhv.t
+ ! lib/Sys/Hostname.pm
____________________________________________________________________________
-[ 1488] By: gsar on 1998/07/14 07:34:45
- Log: merge changes#1423,1465 from maintbranch; checkin two missed files
- from earlier changes#1461,1478
+[ 5011] By: gsar on 2000/02/07 06:26:30
+ Log: allow 64-bit utf8-encoded integers (from Ilya Zakharevich)
Branch: perl
- ! pod/perldiag.pod pod/perlfunc.pod pod/perlop.pod pp_sys.c
- ! t/TEST t/lib/thread.t t/op/local.t t/op/pat.t t/op/regexp.t
- ! t/op/substr.t t/op/vec.t
+ ! utf8.c utf8.h
____________________________________________________________________________
-[ 1487] By: gsar on 1998/07/14 07:04:54
- Log: tweak t/lib/thread.t
+[ 5010] By: gsar on 2000/02/06 21:27:03
+ Log: fix debug code in Perl_malloc() (from Ilya Zakharevich)
Branch: perl
- ! t/lib/thread.t
+ ! malloc.c
____________________________________________________________________________
-[ 1486] By: gsar on 1998/07/14 06:38:15
- Log: applied patch, slightly tweaked
- From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Mon, 13 Jul 1998 11:52:27 -0700
- Message-Id: <3.0.5.32.19980713115227.00a73970@ous.edu>
- Subject: [PATCH 5.004_73]Get re module working on VMS
+[ 5009] By: gsar on 2000/02/06 20:45:30
+ Log: set SvUTF8 on vectors only if there are chars > 127; update copyright
+ years (from Gisle Aas)
Branch: perl
- ! ext/re/Makefile.PL perl.h proto.h
+ ! EXTERN.h INTERN.h README av.c av.h cop.h cv.h deb.c doio.c
+ ! doop.c dump.c form.h gv.c gv.h handy.h hv.c hv.h mg.c mg.h
+ ! op.c op.h perl.c perl.h perlio.c perly.y pp.c pp.h pp_ctl.c
+ ! pp_hot.c pp_sys.c regcomp.c regexec.c run.c scope.c sv.c sv.h
+ ! toke.c utf8.c utf8.h util.c util.h
____________________________________________________________________________
-[ 1485] By: gsar on 1998/07/14 06:32:58
- Log: add Porting/p4d2p
+[ 5008] By: gsar on 2000/02/06 19:28:31
+ Log: use builtin __CYGWIN__ rather than -DCYGWIN (from Eric Fifer
+ <EFifer@sanwaint.com>)
Branch: perl
- + Porting/p4d2p
- ! MANIFEST
+ ! EXTERN.h XSUB.h doio.c ext/POSIX/POSIX.xs
+ ! ext/SDBM_File/sdbm/pair.c ext/SDBM_File/sdbm/sdbm.c
+ ! hints/cygwin.sh lib/ExtUtils/MM_Cygwin.pm mg.c perl.h
+ ! unixish.h util.c
____________________________________________________________________________
-[ 1484] By: gsar on 1998/07/14 06:08:20
- Log: doc patches from Tom Christiansen <tchrist@chthon.perl.com> (via PM)
- Date: Mon, 13 Jul 1998 19:09:09 -0600
- Message-Id: <199807140109.TAA04678@chthon.perl.com>
- Subject: perlmod.pod patch
- --
- Date: Mon, 13 Jul 1998 18:37:07 -0600
- Message-Id: <199807140037.SAA04556@chthon.perl.com>
- Subject: perlbook.pod patch
+[ 5007] By: gsar on 2000/02/06 17:47:01
+ Log: reduce memory consumption of POSIX.pm (from Ilya Zakharevich)
Branch: perl
- ! pod/perlbook.pod pod/perlmod.pod
+ ! ext/POSIX/POSIX.pm
____________________________________________________________________________
-[ 1483] By: gsar on 1998/07/14 06:04:25
- Log: OS/2 update
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199807132336.TAA12967@monk.mps.ohio-state.edu>
- Date: Mon, 13 Jul 1998 19:36:05 -0400 (EDT)
- Subject: [PATCH 5.004_72] OS/2 system() and friends additions
+[ 5006] By: gsar on 2000/02/06 17:28:35
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! README.os2 hints/os2.sh os2/Changes os2/os2.c t/op/magic.t
+ !> Configure config_h.SH ext/Sys/Syslog/Syslog.xs hints/hpux.sh
+ !> perl.h pp_sys.c
____________________________________________________________________________
-[ 1482] By: gsar on 1998/07/14 06:01:12
- Log: more VMS patches from Dan Sugalski <sugalskd@osshe.edu>
- Date: Mon, 13 Jul 1998 16:37:49 -0700
- Message-Id: <3.0.5.32.19980713163749.00af1c40@ous.edu>
- Subject: [PATCH 5.004_73]t/io/iprefix.t patch for VMS
- --
- Date: Mon, 13 Jul 1998 15:51:09 -0700
- Message-Id: <3.0.5.32.19980713155109.00a52c30@ous.edu>
- Subject: [PATCH5.004_73]Tweak t/lib/cgi-html.t to work on VMS
+[ 5005] By: gsar on 2000/02/06 17:18:39
+ Log: VOS port updates (from Paul Green <Paul_Green@stratus.com>)
Branch: perl
- ! t/io/iprefix.t t/lib/cgi-html.t
+ ! README.vos pod/perlport.pod vos/Changes vos/build.cm
+ ! vos/compile_perl.cm vos/config.def vos/config.h vos/config.pl
+ ! vos/config_h.SH_orig vos/perl.bind vos/test_vos_dummies.c
+ ! vos/vos_dummies.c vos/vosish.h
____________________________________________________________________________
-[ 1481] By: gsar on 1998/07/14 05:57:36
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Mon, 13 Jul 1998 15:41:53 -0700
- Message-Id: <3.0.5.32.19980713154153.00a87be0@ous.edu>
- Subject: [PATCH 5.004_73]Fix t/base/rs.t test failures on VMS
+[ 5004] By: gsar on 2000/02/06 17:00:49
+ Log: fix parse error on C<{ use strict }> and other constructs that
+ make the parser reenter while LEX_KNOWNEXT is active
Branch: perl
- ! t/base/rs.t
+ ! t/comp/use.t toke.c
____________________________________________________________________________
-[ 1480] By: gsar on 1998/07/14 05:56:14
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Message-Id: <3.0.5.32.19980713150427.00b2a540@ous.edu>
- Date: Mon, 13 Jul 1998 15:04:27 -0700
- Subject: [PATCH 5.004_73]Thread tweak for VMS.C
+[ 5003] By: gsar on 2000/02/06 14:57:30
+ Log: avoid -Bforcearchive on netbsd too
Branch: perl
- ! vms/vms.c
+ ! Changes hints/netbsd.sh
____________________________________________________________________________
-[ 1479] By: gsar on 1998/07/14 05:55:13
- Log: From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Date: Mon, 13 Jul 1998 23:13:43 +0200
- Message-ID: <19980713231343.A178@cdata.tvnet.hu>
- Subject: [PATCH _72] Configure problem on dos-djgpp
+[ 5002] By: gsar on 2000/02/06 14:45:17
+ Log: revised notes about Pod::Parser & Co.
Branch: perl
- ! Configure
+ ! lib/Pod/Usage.pm pod/perldelta.pod
____________________________________________________________________________
-[ 1478] By: gsar on 1998/07/14 05:53:08
- Log: add files and tweaks needed for MPE/iX port (via PM)
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 14 Jul 1998 00:07:30 +0300 (EET DST)
- Message-Id: <199807132107.AAA20603@alpha.hut.fi>
- Subject: MPE/iX patches for _73
- Branch: perl
- + README.mpeix ext/DynaLoader/dl_mpeix.xs ext/re/hints/mpeix.pl
- + mpeix/mpeixish.h mpeix/nm mpeix/relink
- ! MANIFEST ext/Socket/Socket.xs hints/mpeix.sh installperl
- ! lib/File/Copy.pm perl.c perl.h pod/perldelta.pod
-____________________________________________________________________________
-[ 1477] By: gsar on 1998/07/14 04:23:28
- Log: added suggested patch (via PM), tweaked to implicitly specify -DDEBUGGING
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Mon, 13 Jul 1998 16:50:55 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980713164922.28314B-100000@newton.phys>
- Subject: Re: _70 and Devel::RE
- Branch: perl
- ! ext/re/Makefile.PL ext/re/re.xs regcomp.c regexec.c
-____________________________________________________________________________
-[ 1476] By: gsar on 1998/07/14 04:06:25
- Log: minor Configure nits
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Mon, 13 Jul 1998 23:25:27 +0300 (EET DST)
- Message-Id: <199807132025.XAA10771@alpha.hut.fi>
- Subject: Configure patches for MVS (and one x2p/Makefile.SH)
+[ 5001] By: gsar on 2000/02/06 14:02:43
+ Log: fix description of obsolete diagnostic
Branch: perl
- ! Configure x2p/Makefile.SH
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 1475] By: gsar on 1998/07/14 03:59:56
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Mon, 13 Jul 1998 12:54:19 -0700
- Message-Id: <3.0.5.32.19980713125419.009e0100@ous.edu>
- Subject: [PATCH 5.004_73] Fixes to the VMS configuration system
+[ 5000] By: gsar on 2000/02/06 13:59:58
+ Log: allow "\x{12ab}" even without C<use utf8>
Branch: perl
- ! vms/munchconfig.c vms/subconfigure.com
+ ! t/pragma/warn/toke toke.c
____________________________________________________________________________
-[ 1474] By: gsar on 1998/07/14 03:58:13
- Log: make Term::Readline::get_line() independent of caller's $/
- From: kstar@chapin.edu
- Date: Mon, 13 Jul 1998 15:17:49 -0400
- Message-ID: <19980713151749.G8596@O2.chapin.edu>
- Subject: [PATCH] Was: CPAN.pm still fails
+[ 4999] By: gsar on 2000/02/06 13:58:31
+ Log: make perlbug use new-style version numbers; improve compatibility
+ (runs with perl 5.005); fix swapped old vs new version reporting
Branch: perl
- ! lib/Term/ReadLine.pm
+ ! utils/perlbug.PL
____________________________________________________________________________
-[ 1473] By: gsar on 1998/07/14 03:55:29
- Log: fix $trnl interpolation in here-docs (via PM)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Mon, 13 Jul 1998 15:49:00 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980713151243.28129F-100000@newton.phys>
- Subject: Re: [PATCH] 5.004_73: Re: Configure/trnl craziness
+[ 4998] By: gsar on 2000/02/06 13:56:45
+ Log: support sprintf("v%v", v1.2.3) (works on any string argument, in
+ fact); add tests for version tuples
Branch: perl
- ! Configure
+ + t/op/ver.t
+ ! MANIFEST perl.c pod/perldiag.pod pod/perlfunc.pod
+ ! pod/perlop.pod sv.c toke.c
____________________________________________________________________________
-[ 1472] By: gsar on 1998/07/14 03:50:18
- Log: From: Dominic Dunlop <domo@ppp52.vo.lu>
- Date: Mon, 13 Jul 1998 15:55:09 +0100 (WET DST)
- Message-Id: <199807131455.PAA23621@ppp52.vo.lu>
- Subject: Not OK: perl 5.00473 on powerpc-machten 4.1 [PATCH 5.004_73]
+[ 4997] By: gsar on 2000/02/04 21:40:08
+ Log: change#4970 fallout for useithreads
Branch: perl
- ! hints/machten.sh
+ ! sv.c
____________________________________________________________________________
-[ 1471] By: gsar on 1998/07/14 03:49:07
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Message-Id: <3.0.5.32.19980713123005.00b6be50@ous.edu>
- Date: Mon, 13 Jul 1998 12:30:05 -0700
- Subject: [PATCH 5.004_73] Add Data::Dumper and re modules to VMS config stuff
+[ 4996] By: jhi on 2000/02/04 20:09:00
+ Log: Largefilify offsets of tied handles.
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 4995] By: jhi on 2000/02/04 19:54:25
+ Log: Sanity check for libraries scan.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/libs.U
+____________________________________________________________________________
+[ 4994] By: jhi on 2000/02/04 19:48:42
+ Log: HP-UX largefileness doesn't like lseek being redeclared;
+ no more USE_LONG_LONG.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4993] By: jhi on 2000/02/04 19:18:59
+ Log: fix the description as much as possible; the whole
+ separation into three different symbols lists is
+ pretty broken now.
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 4992] By: jhi on 2000/02/04 19:13:10
+ Log: Use <syslog.h>, not <sys/syslog.h>.
+ Branch: cfgperl
+ ! Configure config_h.SH ext/Sys/Syslog/Syslog.xs
+____________________________________________________________________________
+[ 4991] By: gsar on 2000/02/04 19:11:07
+ Log: dmake is on CPAN now
Branch: perl
- ! configure.com vms/descrip_mms.template
+ ! README.win32
____________________________________________________________________________
-[ 1470] By: gsar on 1998/07/14 03:40:14
- Log: consistently refer to functions as C<foo()>
- From: abigail@fnx.com
- Date: Mon, 13 Jul 1998 03:04:24 -0400 (EDT)
- Message-ID: <19980713070424.19841.qmail@betelgeuse.wayne.fnx.com>
- Subject: Re: [PATCH 5.004_71] pod/perlfunc.pod
+[ 4990] By: jhi on 2000/02/04 19:04:01
+ Log: Re-introduce #4817 and #4964 wiped out by #4987.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/threads/usethreads.U
+ Branch: metaconfig/U/perl
+ ! patchlevel.U
+____________________________________________________________________________
+[ 4989] By: jhi on 2000/02/04 18:54:00
+ Log: typo fix
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/libs.U
+____________________________________________________________________________
+[ 4988] By: jhi on 2000/02/04 18:34:06
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> ext/Sys/Syslog/Makefile.PL ext/Sys/Syslog/Syslog.pm
+ +> ext/Sys/Syslog/Syslog.xs
+ - lib/Sys/Syslog.pm
+ !> (integrate 37 files)
+____________________________________________________________________________
+[ 4987] By: jhi on 2000/02/04 18:31:05
+ Log: Configure megamaintenance. Cppsym (hopefully) final spasms;
+ default is to use long long if available; various nits
+ here and there; fixed to hpux 64-bitnes and largefileness.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/hpux.sh perl.h
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U U/modified/Cppsym.U
+ ! U/modified/d_gethname.U U/modified/libpth.U U/modified/libs.U
+ Branch: metaconfig/U/perl
+ ! d_fseeko.U d_ftello.U dlsrc.U uselongdbl.U uselonglong.U
+ ! usemultiplicity.U xs_apiversion.U
+____________________________________________________________________________
+[ 4986] By: gsar on 2000/02/04 17:26:37
+ Log: avoid bad cast warnings (from Robin Barker <rmb1@cise.npl.co.uk>)
Branch: perl
- ! pod/perlfunc.pod
+ ! sv.c
____________________________________________________________________________
-[ 1469] By: gsar on 1998/07/14 03:35:06
- Log: From: Tom Hughes <thh@cyberscience.com>
- Date: 13 Jul 1998 09:34:16 +0100
- Message-ID: <yekk95i175j.fsf@elva.cyberscience.com>
- Subject: [PATCH 5.004_72] Fix d_Gconvert definition in hints/svr4.sh
+[ 4985] By: gsar on 2000/02/04 16:43:49
+ Log: avoid 'na' (spotted by Yitzchak Scott-Thoennes <sthoenna@efn.org>)
Branch: perl
- ! hints/svr4.sh
+ ! ext/Devel/DProf/DProf.xs
____________________________________________________________________________
-[ 1468] By: gsar on 1998/07/14 03:34:03
- Log: From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
- Date: 13 Jul 1998 11:16:27 +0200
- Message-ID: <sfc90lyqff8.fsf@dubravka.in-berlin.de>
- Subject: Parallel Makefiles
+[ 4984] By: gsar on 2000/02/04 08:20:05
+ Log: CPAN.pm updated to v1.52 (from Andreas Koenig)
Branch: perl
- ! lib/ExtUtils/MM_Unix.pm
+ ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
____________________________________________________________________________
-[ 1467] By: gsar on 1998/07/14 03:31:39
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 13 Jul 1998 00:12:19 -0400 (EDT)
- Message-Id: <199807130412.AAA27128@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_72] t/io/pipe.t - completely broken?
+[ 4983] By: gsar on 2000/02/04 08:00:38
+ Log: updated OpenBSD hints (From Todd C. Miller <Todd.Miller@courtesan.com>)
Branch: perl
- ! t/io/pipe.t
+ ! hints/openbsd.sh
____________________________________________________________________________
-[ 1466] By: gsar on 1998/07/14 03:29:25
- Log: minor tweaks to perldelta and README.win32
+[ 4982] By: gsar on 2000/02/04 07:54:04
+ Log: pod typos (from Gregor N. Purdy <gregor@focusresearch.com>)
Branch: perl
- ! Changes README.win32 pod/perldelta.pod
+ ! lib/Pod/Parser.pm
____________________________________________________________________________
-[ 1465] By: TimBunce on 1998/07/13 21:33:45
- Log: Assorted patches:
-
- Title: "Fix string substitution returncode problem"
- From: Dominic Dunlop <domo@vo.lu>, Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805271236.IAA28213@aatma.engin.umich.edu>,
- <v03110700b191a557f041@[195.95.102.114]>
- Files: pp_hot.c
-
- Title: "umask EXPR is fatal only if (EXPR & 0700) > 0"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807111656.MAA03310@aatma.engin.umich.edu>
- Files: pod/perldiag.pod pp_sys.c
-
- Title: "Remove reference to qsort from perlfunc.pod"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807111923.PAA05124@aatma.engin.umich.edu>
- Files: pod/perlfunc.pod
-
- Title: "Deprecate AvFILL in favor of av_len()"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807111945.PAA05489@aatma.engin.umich.edu>
- Files: pod/perlguts.pod
-
- Title: "Further clarify effects of using quotes with m operator"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199806201921.PAA03829@aatma.engin.umich.edu>
- Files: pod/perlop.pod
-
- Title: "Add PERL_DESTRUCT_LEVEL=2 to test suite"
- From: Tim Bunce
- Files: t/TEST t/op/local.t t/op/pat.t t/op/regexp.t t/op/substr.t t/op/vec.t
- Branch: maint-5.004/perl
- ! pod/perldiag.pod pod/perlfunc.pod pod/perlguts.pod
- ! pod/perlop.pod pp_hot.c pp_sys.c t/TEST t/op/local.t
- ! t/op/pat.t t/op/regexp.t t/op/substr.t t/op/vec.t toke.c
-
-----------------
-Version 5.004_73
-----------------
-
+[ 4981] By: gsar on 2000/02/04 07:34:38
+ Log: avoid assuming cc accepts -o switch (from Tom Hughes)
+ Branch: perl
+ ! Makefile.SH
____________________________________________________________________________
-[ 1464] By: gsar on 1998/07/13 04:41:07
- Log: up patchlevel to 73, update Changes &c.
+[ 4980] By: gsar on 2000/02/04 07:29:59
+ Log: Sys::Syslog goes the XS way (from Tom Hughes <tom@compton.nu>)
Branch: perl
- ! Changes patchlevel.h pod/perlhist.pod t/op/array.t
- ! win32/Makefile win32/config_H.bc win32/config_H.gc
- ! win32/config_H.vc win32/makefile.mk
+ + ext/Sys/Syslog/Makefile.PL ext/Sys/Syslog/Syslog.pm
+ + ext/Sys/Syslog/Syslog.xs
+ - lib/Sys/Syslog.pm
+ ! MANIFEST pod/perldelta.pod
____________________________________________________________________________
-[ 1463] By: gsar on 1998/07/13 02:58:51
- Log: avoid empty rm -f in MM_Unix.pm
+[ 4979] By: gsar on 2000/02/04 07:13:19
+ Log: pod updates (from David Adler, M J T Guy)
Branch: perl
- ! lib/ExtUtils/MM_Unix.pm
+ ! pod/perlfaq2.pod pod/perlop.pod pod/perlsyn.pod
____________________________________________________________________________
-[ 1462] By: gsar on 1998/07/13 02:54:52
- Log: update perldelta
+[ 4978] By: gsar on 2000/02/04 07:08:14
+ Log: typos in config_h.SH (from Paul_Green@vos.stratus.com)
Branch: perl
- ! pod/perldelta.pod
+ ! config_h.SH
____________________________________________________________________________
-[ 1461] By: gsar on 1998/07/13 02:44:30
- Log: added patch, tweaked PERL_OBJECT things
- From: Graham Barr <gbarr@pobox.com>
- Date: Sun, 12 Jul 1998 19:57:47 CDT
- Message-Id: <19980712195747.C493@pobox.com>
- Subject: [ PATCH perl5.004_72] patch to add qr//
+[ 4977] By: gsar on 2000/02/04 07:06:10
+ Log: avoid adding null components to LD_LIBRARY_PATH, OpenBSD has trouble
+ with them (from Todd C. Miller <Todd.Miller@courtesan.com>)
Branch: perl
- ! dump.c embed.h ext/Opcode/Opcode.pm global.sym globals.c
- ! keywords.h keywords.pl op.c op.h opcode.h opcode.pl
- ! pod/perlfunc.pod pp.c pp_hot.c pp_proto.h proto.h regcomp.c
- ! regexp.h sv.c t/op/pat.t toke.c
+ ! Makefile.SH
____________________________________________________________________________
-[ 1460] By: gsar on 1998/07/13 01:25:07
- Log: add a few more PURIFY guards
+[ 4976] By: gsar on 2000/02/04 06:33:43
+ Log: VMS update (from Dan Sugalski and Peter Prymmer)
Branch: perl
- ! av.c sv.c
+ ! configure.com vms/descrip_mms.template vms/subconfigure.com
____________________________________________________________________________
-[ 1459] By: gsar on 1998/07/12 23:38:31
- Log: add tests for change#1458 and then some
+[ 4975] By: gsar on 2000/02/04 05:51:14
+ Log: patch to provide more informative names for evals and anonymous
+ subroutines (from Ilya Zakharevich)
Branch: perl
- ! t/op/array.t
+ ! ext/Devel/Peek/Peek.pm ext/Devel/Peek/Peek.xs lib/Dumpvalue.pm
+ ! lib/dumpvar.pl lib/perl5db.pl op.c perl.h pod/perldebug.pod
+ ! pod/perlvar.pod pp_ctl.c
____________________________________________________________________________
-[ 1458] By: gsar on 1998/07/12 22:42:47
- Log: apply patch for smarter AASSIGN_COMMON detection; regen headers
- From: Stephen McCamant <alias@mcs.com>
- Date: Sun, 12 Jul 1998 17:17:00 CDT
- Message-Id: <13737.12300.950886.821143@alias-2.pr.mcs.net>
- Subject: [PATCH] @a=@a=qw(1) not working, both 5.004_04 and 5.004_71
+[ 4974] By: gsar on 2000/02/04 05:05:57
+ Log: off-by-one in malloc.c (from Ilya Zakharevich)
Branch: perl
- ! op.c opcode.h opcode.pl
+ ! malloc.c
____________________________________________________________________________
-[ 1457] By: gsar on 1998/07/12 22:06:05
- Log: small tweaks from Jarkko Hietaniemi <jhi@cc.hut.fi>
+[ 4973] By: gsar on 2000/02/04 05:03:00
+ Log: OS/2 build fixups from Ilya Zakharevich
Branch: perl
- ! Configure Makefile.SH ext/Socket/Socket.xs perl.c
+ ! ext/Devel/DProf/DProf.xs os2/Makefile.SHs t/op/fork.t
____________________________________________________________________________
-[ 1456] By: gsar on 1998/07/12 21:56:39
- Log: From: Doug MacEachern <dougm@pobox.com>
- Date: Sun, 12 Jul 1998 14:29:29 -0400
- Message-Id: <199807121829.OAA00525@postman.opengroup.org>
- Subject: [PATCH 5.004_72] Embed.pm support for PERL_OBJECT
+[ 4972] By: gsar on 2000/02/04 04:58:57
+ Log: avoid /* within comment
Branch: perl
- ! lib/ExtUtils/Embed.pm
+ ! xsutils.c
____________________________________________________________________________
-[ 1455] By: gsar on 1998/07/12 21:54:02
- Log: applied installperl patch, corrected other little nits
- From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
- Date: 12 Jul 1998 16:27:21 +0200
- Message-ID: <sfcn2afrvp2.fsf@dubravka.in-berlin.de>
- Subject: [5.004_72] installperl tweak
+[ 4971] By: gsar on 2000/02/04 04:56:09
+ Log: another HINT_BYTE victim
Branch: perl
- ! Changes Configure README.win32 installperl win32/makefile.mk
+ ! lib/charnames.pm
____________________________________________________________________________
-[ 1454] By: gsar on 1998/07/12 10:14:24
- Log: update MANIFEST, Changes
+[ 4970] By: gsar on 2000/02/04 04:45:13
+ Log: fix pad_alloc panic from C<my $w; sub { my($i) = @_; sub { $w } }>
Branch: perl
- - lib/Bundle/CPAN.pm
- ! Changes MANIFEST
+ ! op.c scope.c scope.h t/op/closure.t toke.c
+____________________________________________________________________________
+[ 4969] By: gsar on 2000/02/04 01:09:37
+ Log: byte.pm and HINT_BYTE don't match (0x8, not 0x10!)
+ Branch: perl
+ ! lib/byte.pm
+____________________________________________________________________________
+[ 4968] By: jhi on 2000/02/02 13:17:25
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/Pod/Find.pm lib/Pod/ParseUtils.pm
+ ! Configure
+ !> (integrate 29 files)
----------------
-Version 5.004_72
+Version v5.5.640
----------------
____________________________________________________________________________
-[ 1453] By: gsar on 1998/07/12 10:04:33
- Log: merge changes 1424, 1428 from maintbranch
+[ 4967] By: gsar on 2000/02/02 12:22:29
+ Log: update makerel for new version format
Branch: perl
- ! Porting/makerel ext/re/re.pm lib/Sys/Syslog.pm
+ ! Changes Porting/makerel
____________________________________________________________________________
-[ 1452] By: gsar on 1998/07/12 09:46:40
- Log: patchlevel up to 72, update Changes, minor tweaks to win32/config*
- and README.win32
+[ 4966] By: gsar on 2000/02/02 11:42:03
+ Log: workaround for undefined symbol
Branch: perl
- ! Changes README.win32 patchlevel.h win32/Makefile
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/makefile.mk
+ ! win32/win32.h
____________________________________________________________________________
-[ 1451] By: gsar on 1998/07/12 07:01:26
- Log: generic Configure mods and HAS_GROUP additions to help MiNT/MPEix/MVS
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Sat, 11 Jul 1998 17:51:07 +0300 (EET DST)
- Message-Id: <199807111451.RAA27010@alpha.hut.fi>
- Subject: M3 "generic" parts
+[ 4965] By: gsar on 2000/02/02 11:19:19
+ Log: on cygwin, h_errno is now "__declspec(dllimport) int h_errno"
+ (from Eric Fifer <EFifer@sanwaint.com>)
Branch: perl
- ! Configure Makefile.SH config_h.SH ext/POSIX/POSIX.xs
- ! ext/SDBM_File/sdbm/sdbm.h lib/ExtUtils/MM_Unix.pm
- ! makedepend.SH mv-if-diff perl.h plan9/plan9ish.h pp_sys.c
- ! unixish.h vms/subconfigure.com vms/vmsish.h win32/config_H.bc
- ! win32/config_H.gc x2p/Makefile.SH
+ ! pp_sys.c
____________________________________________________________________________
-[ 1450] By: gsar on 1998/07/12 06:38:27
- Log: various tweaks for PERL_OBJECT build & test
+[ 4964] By: gsar on 2000/02/02 11:11:15
+ Log: adjust notes on use5005threads
Branch: perl
- ! globals.c iperlsys.h win32/GenCAPI.pl win32/Makefile
- ! win32/makefile.mk win32/win32.c win32/win32iop.h
+ ! Configure INSTALL README.threads
____________________________________________________________________________
-[ 1449] By: gsar on 1998/07/12 06:29:23
- Log: From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
- Date: 12 Jul 1998 08:22:16 +0200
- Message-Id: <sfck95jtwpz.fsf@dubravka.in-berlin.de>
- Subject: [5.004_71] Patch: let CPAN.pm work with threaded perl
+[ 4963] By: gsar on 2000/02/02 10:14:30
+ Log: fix typo
Branch: perl
- ! lib/CPAN.pm lib/SelfLoader.pm
+ ! Configure
____________________________________________________________________________
-[ 1448] By: gsar on 1998/07/12 05:10:50
- Log: make RE engine threadsafe; -Dusethreads builds, tests on Solaris,
- and runs regexes in 1000s of threads without crashing; also fixed
- statcache not being thread-local
+[ 4962] By: gsar on 2000/02/02 10:13:10
+ Log: integrate selected changes from cfgperl (#4899,4900,4904,4918)
Branch: perl
- ! embed.h embedvar.h ext/Thread/Thread.xs ext/re/re.xs
- ! intrpvar.h op.c perl.c pp_ctl.c regcomp.c regexec.c sv.c
- ! t/lib/thread.t thrdvar.h util.c
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH ext/IO/IO.xs lib/Benchmark.pm
____________________________________________________________________________
-[ 1447] By: gsar on 1998/07/12 02:40:45
- Log: From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Date: Sun, 12 Jul 1998 03:23:04 +0200
- Message-Id: <l03130300b1cdbff87621@[194.222.64.89]>
- Subject: Re: perlbug doesn't check that save succeeded
+[ 4961] By: gsar on 2000/02/02 09:55:45
+ Log: PodParser-1.092 update via CPAN (from Brad Appleton)
Branch: perl
- ! utils/perlbug.PL
+ + lib/Pod/Find.pm lib/Pod/ParseUtils.pm
+ ! MANIFEST lib/Pod/Checker.pm t/pod/poderrs.t t/pod/poderrs.xr
____________________________________________________________________________
-[ 1446] By: gsar on 1998/07/12 02:39:24
- Log: be generous about CRs
- From: larry@wall.org (Larry Wall)
- Date: Sat, 11 Jul 1998 17:54:21 PDT
- Message-Id: <199807120054.RAA19550@wall.org>
- Subject: [PATCH _71] CRs et al
+[ 4960] By: gsar on 2000/02/02 08:22:31
+ Log: replace misleading docs with a BUGS section
Branch: perl
- ! toke.c
+ ! lib/English.pm
____________________________________________________________________________
-[ 1445] By: gsar on 1998/07/12 02:11:16
- Log: fix pp_caller() to fully traverse stacklevels
+[ 4959] By: gsar on 2000/02/02 08:16:17
+ Log: remove FUD from perlfunc/use (from M J T Guy)
Branch: perl
- ! objpp.h pp_ctl.c proto.h t/op/runlevel.t
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1444] By: gsar on 1998/07/11 23:43:37
- Log: add patch, along with all the missing bits, and doc tweaks
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Thu, 9 Jul 1998 18:47:25 -0400 (EDT)
- Message-Id: <199807092247.SAA06314@monk.mps.ohio-state.edu>
- Subject: Re: [PATCH 5.004_71] Secure RE update
- Branch: perl
- ! ObjXSub.h embed.h embedvar.h ext/Opcode/Opcode.pm ext/re/re.pm
- ! global.sym globals.c interp.sym intrpvar.h op.c opcode.h
- ! opcode.pl pp_ctl.c pp_proto.h regcomp.c sv.c t/op/misc.t
- ! t/op/pat.t t/op/subst.t
-____________________________________________________________________________
-[ 1443] By: gsar on 1998/07/11 23:08:14
- Log: tweak to get BSDI to build IPC/SysV
- From: Jarkko Hietaniemi <jhi@cc.hut.fi>
- Date: 11 Jul 1998 16:26:44 +0300
- Message-ID: <oeeww9kecx7.fsf@alpha.hut.fi>
- Subject: Re: NOT OK: perl5.004_71 on BSDI 3.1
+[ 4958] By: gsar on 2000/02/02 08:13:04
+ Log: Benchmark displays bogus CPU stats (suggested by Cedric Auzanne
+ <cedric.auzanne@nist.gov>)
Branch: perl
- ! ext/IPC/SysV/SysV.xs
+ ! Changes lib/Benchmark.pm
____________________________________________________________________________
-[ 1442] By: gsar on 1998/07/11 23:03:39
- Log: fix closures in optimized C<for (1..5)> (only the tests are in this
- change, the pp_hot.c fix accidentally went in change#1441)
+[ 4957] By: gsar on 2000/02/02 08:04:52
+ Log: fix coredump on C<"x" =~ /x/; print @-> (from Ilya Zakharevich)
Branch: perl
- ! t/op/closure.t
+ ! pp_hot.c
____________________________________________________________________________
-[ 1441] By: gsar on 1998/07/11 22:35:40
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Sat, 11 Jul 1998 18:21:21 -0400 (EDT)
- Message-Id: <199807112221.SAA03221@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_71] Update os2's OS2::Process
+[ 4956] By: gsar on 2000/02/02 08:02:57
+ Log: flock() pod talks about "adding" in the sense of "or-ing"
Branch: perl
- ! os2/OS2/Process/Makefile.PL os2/OS2/Process/Process.pm
- ! os2/OS2/Process/Process.xs pp_hot.c
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1440] By: gsar on 1998/07/11 19:41:59
- Log: From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
- Date: 11 Jul 1998 17:00:21 +0200
- Message-ID: <sfc1zrsxwje.fsf@dubravka.in-berlin.de>
- Subject: [perl5.004_71] Patch: change MakeMaker default compress --> gzip
+[ 4955] By: gsar on 2000/02/02 07:58:35
+ Log: fixes for switching files in the debugger (from Ilya Zakharevich)
Branch: perl
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/perl5db.pl pod/perldebug.pod
____________________________________________________________________________
-[ 1439] By: gsar on 1998/07/11 19:36:58
- Log: export newRV_noinc on win32, deprecate AvFILL in favor of av_len()
+[ 4954] By: gsar on 2000/02/02 07:53:51
+ Log: use warnings rather than fiddling with $^W (from Paul Marquess)
Branch: perl
- ! pod/perlguts.pod win32/makedef.pl
+ ! lib/Cwd.pm lib/English.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MM_Win32.pm lib/ExtUtils/Manifest.pm lib/Fatal.pm
+ ! lib/File/Spec/Win32.pm lib/Math/BigFloat.pm
+ ! lib/Text/ParseWords.pm lib/utf8_heavy.pl
____________________________________________________________________________
-[ 1438] By: gsar on 1998/07/11 19:14:21
- Log: applied patch for perlfunc tweaks, removed reference to system qsort()
- From: abigail@fnx.com
- Date: Sat, 11 Jul 1998 04:20:54 -0400 (EDT)
- Message-ID: <19980711082054.2184.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.004_71] pod/perlfunc.pod
+[ 4953] By: gsar on 2000/02/02 07:40:33
+ Log: dynixptx hints tweak (from Martin J. Bligh <mbligh@sequent.com>)
Branch: perl
- ! pod/perlfunc.pod
+ ! hints/dynixptx.sh
____________________________________________________________________________
-[ 1437] By: gsar on 1998/07/11 19:05:00
- Log: From: abigail@fnx.com
- Date: Sat, 11 Jul 1998 04:09:57 -0400 (EDT)
- Message-ID: <19980711080957.2106.qmail@betelgeuse.wayne.fnx.com>
- Subject: [PATCH 5.004_71] pod/pod2man.PL
+[ 4952] By: gsar on 2000/02/02 07:36:39
+ Log: deltanotes on weakrefs and Pod::Parser (from Tuomas Lukka and
+ Brad Appleton)
Branch: perl
- ! pod/pod2man.PL
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 1436] By: gsar on 1998/07/11 18:58:03
- Log: more complete version of change#1421
- From: Stephen McCamant <alias@mcs.com>
- Date: Fri, 10 Jul 1998 23:46:46 -0500 (CDT)
- Message-ID: <13734.58994.735473.859218@alias-2.pr.mcs.net>
- Subject: [PATCH] Re: B::Deparse for(1..100000)
+[ 4951] By: gsar on 2000/02/02 06:54:22
+ Log: avoid mismatched type warnings
Branch: perl
- ! ext/B/B/Deparse.pm
+ ! embed.pl perlapi.h
+____________________________________________________________________________
+[ 4950] By: jhi on 2000/02/02 06:49:10
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> pod/perlunicode.pod
+ !> MANIFEST Makefile.SH lib/File/Spec/Win32.pm lib/Text/Tabs.pm
+ !> lib/byte.pm lib/byte_heavy.pl lib/utf8.pm lib/warnings.pm
+ !> makedef.pl op.c perl.h pod/perldelta.pod pp_ctl.c regcomp.c
+ !> regexec.c t/pragma/warn/2use utf8.h utils/perldoc.PL
+ !> vms/descrip_mms.template warnings.pl
____________________________________________________________________________
-[ 1435] By: gsar on 1998/07/11 18:54:42
- Log: win32 fixes for VC 6.0 nits
+[ 4949] By: gsar on 2000/02/02 06:41:17
+ Log: fix broken abs2rel() (from François Allard <franka@host.ott.igs.net>)
Branch: perl
- ! ext/Data/Dumper/Dumper.xs win32/Makefile win32/makefile.mk
- ! win32/win32.h
+ ! lib/File/Spec/Win32.pm
____________________________________________________________________________
-[ 1434] By: gsar on 1998/07/11 18:45:32
- Log: s/AVHV/pseudo-hash/ (via PM)
- From: Gisle Aas <gisle@aas.no>
- Date: 11 Jul 1998 00:16:53 +0200
- Message-ID: <m3hg0pbbca.fsf@furu.g.aas.no>
- Subject: [PATCH] trivial fields.pm doc patch
+[ 4948] By: gsar on 2000/02/02 06:30:41
+ Log: makefile tweak
Branch: perl
- ! lib/fields.pm
+ ! Makefile.SH
____________________________________________________________________________
-[ 1433] By: gsar on 1998/07/11 18:43:11
- Log: From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Date: Fri, 10 Jul 1998 23:12:11 +0200
- Message-ID: <19980710231211.A161@cdata.tvnet.hu>
- Subject: [PATCH _71] dos-djgpp update
+[ 4947] By: gsar on 2000/02/02 06:27:43
+ Log: future-proof unknown warning categories (from Greg Bacon
+ <gbacon@cs.uah.edu>)
Branch: perl
- ! Configure djgpp/config.over djgpp/djgppsed.sh djgpp/fixpmain
+ ! lib/warnings.pm t/pragma/warn/2use warnings.pl
____________________________________________________________________________
-[ 1432] By: gsar on 1998/07/11 18:41:00
- Log: applied patch, reformatted long lines in places
- From: Dominic Dunlop <domo@computer.org>
- Date: Fri, 10 Jul 1998 23:11:30 +0000
- Message-Id: <v03110703b1cc32a02438@[195.95.102.91]>
- Subject: [PATCH 5.004_71] Re: Document "count exceeded" regular expression
- warning
+[ 4946] By: gsar on 2000/02/02 06:21:34
+ Log: doc tweak (from Michael G Schwern <schwern@pobox.com>)
Branch: perl
- ! pod/perldiag.pod regexec.c
+ ! lib/Text/Tabs.pm
____________________________________________________________________________
-[ 1431] By: gsar on 1998/07/11 18:29:18
- Log: From: "John L. Allen" <allen@grumman.com>
- Date: Fri, 10 Jul 1998 13:57:01 -0400 (EDT)
- Message-ID: <Pine.SOL.3.91.980710134236.15717A-100000@gateway.grumman.com>
- Subject: [PATCH]: _71 & _04 - Make AIX hints preserve ccflags as per docs
+[ 4945] By: gsar on 2000/02/02 06:03:04
+ Log: more meaningful message on invalid pattern argument (from
+ Kevin Meltzer <KMeltzer@USCO.com>)
Branch: perl
- ! hints/aix.sh
+ ! utils/perldoc.PL
____________________________________________________________________________
-[ 1430] By: TimBunce on 1998/07/11 18:15:09
- Log: Title: "Fix string substitution returncode problem"
- From: Dominic Dunlop <domo@vo.lu>, Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805271236.IAA28213@aatma.engin.umich.edu>,
- <v03110700b191a557f041@[195.95.102.114]>
- Files: pp_hot.c
- Branch: maint-5.004/perl
- ! pp_hot.c
+[ 4944] By: gsar on 2000/02/02 05:43:49
+ Log: XSLoader build patch for VMS (from Craig A. Berry
+ <craig.berry@metamorgs.com>)
+ Branch: perl
+ ! vms/descrip_mms.template
____________________________________________________________________________
-[ 1429] By: gsar on 1998/07/11 18:07:52
- Log: applied patch, tweaked doc and code that does labels/indentation
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Thu, 9 Jul 1998 21:39:40 -0400 (EDT)
- Message-Id: <199807100139.VAA08617@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_71] perldebug.pod and RE
+[ 4943] By: gsar on 2000/02/02 03:40:49
+ Log: reword some sections of perlunicode.pod
Branch: perl
- ! pod/perldebug.pod regcomp.c regexec.c
+ ! pod/perlunicode.pod
____________________________________________________________________________
-[ 1428] By: TimBunce on 1998/07/11 17:45:56
- Log: Assorted patches:
-
- Title: "makerel now reads local patch list from patchlevel.h"
- Files: patchlevel.h Porting/makerel
-
- Title: "pod/pod2man.PL"
- From: abigail@fnx.com
- Msg-ID: <19980711080957.2106.qmail@betelgeuse.wayne.fnx.com>
- Files: pod/pod2man.PL
-
- Title: "Clarify taint example in re.pm"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980623155803.3227X-100000@user2.teleport.com>
- Files: lib/re.pm
-
- Title: "Anohter ptags improvement"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199807070059.UAA28815@monk.mps.ohio-state.edu>
- Files: emacs/ptags
-
- Title: "_71 & _04 - Make AIX hints preserve ccflags as per docs"
- From: "John L. Allen" <allen@grumman.com>
- Msg-ID: <Pine.SOL.3.91.980710134236.15717A-100000@gateway.grumman.com>
- Files: hints/aix.sh
- Branch: maint-5.004/perl
- ! Porting/makerel emacs/ptags hints/aix.sh lib/re.pm
- ! patchlevel.h pod/pod2man.PL
+[ 4942] By: gsar on 2000/02/01 21:02:01
+ Log: AIX warning on undefined symbol
+ Branch: perl
+ ! makedef.pl
____________________________________________________________________________
-[ 1427] By: gsar on 1998/07/11 17:04:47
- Log: make Liblist return consistently backslashed paths
+[ 4941] By: gsar on 2000/02/01 20:29:30
+ Log: HINT_UTF8 is not propagated to the op tree anymore; add a
+ perlunicode.pod that reflects changes to unicode support so far
Branch: perl
- ! lib/ExtUtils/Liblist.pm
+ + pod/perlunicode.pod
+ ! MANIFEST lib/byte.pm lib/byte_heavy.pl lib/utf8.pm op.c perl.h
+ ! pod/perldelta.pod pp_ctl.c regcomp.c regexec.c utf8.h
____________________________________________________________________________
-[ 1426] By: gsar on 1998/07/11 16:53:56
- Log: don't 'touch a2p.c', it might readonly (via PM)
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Date: Fri, 10 Jul 98 17:19:54 BST
- Message-Id: <20430.9807101619@tempest.cise.npl.co.uk>
+[ 4940] By: jhi on 2000/02/01 12:22:30
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> embed.pl embedvar.h global.sym gv.c intrpvar.h
+ !> lib/charnames.pm lib/utf8.pm mg.c objXSUB.h op.c op.h
+ !> perlapi.c perlapi.h pod/perlvar.pod pp.c sv.c sv.h
+ !> t/lib/charnames.t toke.c win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 4939] By: gsar on 2000/02/01 08:52:16
+ Log: export pregexec(), Tk uses it
Branch: perl
- ! x2p/Makefile.SH
+ ! embed.pl global.sym objXSUB.h perlapi.c
____________________________________________________________________________
-[ 1425] By: TimBunce on 1998/07/11 16:42:26
- Log: Title: "Add newCONSTSUB (from 5.005_70)"
- Files: embed.h proto.h global.sym op.c
- Branch: maint-5.004/perl
- ! embed.h global.sym op.c proto.h
-____________________________________________________________________________
-[ 1424] By: TimBunce on 1998/07/11 16:20:21
- Log: Title: "Assorted fixes for Sys::Syslog.pm"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Sean Robinson
- <ROBINSON_S@sc.maricopa.edu>, Tim.Bunce@ig.co.uk
- Msg-ID: <01IXGLISWJ7Q0001B6@sc.maricopa.edu>,
- <199805270939.KAA08453@toad.ig.co.uk>,
- <E0yeHPI-00047D-00@taurus.cus.cam.ac.uk>
- Files: lib/Sys/Syslog.pm
- Branch: maint-5.004/perl
- ! lib/Sys/Syslog.pm
+[ 4938] By: gsar on 2000/02/01 04:00:09
+ Log: mark literal utf8 in string literals properly
+ Branch: perl
+ ! toke.c
____________________________________________________________________________
-[ 1423] By: TimBunce on 1998/07/11 15:53:37
- Log: Assorted patches:
-
- Title: "umask: die if EXPR & 0700 else return undef"
- From: Chip Salzenberg <chip@perl.org>, Jarkko Hietaniemi <jhi@cc.hut.fi>,
- Jarkko Hietaniemi <jhi@iki.fi>, Malcolm Beattie
- <mbeattie@sable.ox.ac.uk>, Tim.Bunce@ig.co.uk (Tim Bunce),
- kstar@chapin.ed, kstar@chapin.edu@ig.co.uk ()
- Msg-ID: <199805291520.QAA01615@sable.ox.ac.uk>,
- <199805291549.SAA01439@alpha.hut.fi>,
- <199805291608.RAA29283@toad.ig.co.uk>,
- <19980530105129.A24006@O2.chapin.edu>,
- <19980608133037.A8793@perlsupport.com>
- Files: pod/perldiag.pod pod/perlfunc.pod pp_sys.c
-
- Title: "File name DynaLoader.pm.PL is 8.3 unfriendly"
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Msg-ID: <19980610005417.G162@cdata.tvnet.hu>
- Files: MANIFEST ext/DynaLoader/Makefile.PL
- Branch: maint-5.004/perl
- +> ext/DynaLoader/DynaLoader_pm.PL
- - ext/DynaLoader/DynaLoader.pm.PL
- ! MANIFEST ext/DynaLoader/Makefile.PL pod/perldiag.pod
- ! pod/perlfunc.pod pp_sys.c
+[ 4937] By: gsar on 2000/01/31 20:19:34
+ Log: introduce $^U, a global bit to indicate whether system
+ calls should using widechar APIs; chr and sprintf "%c" also
+ follow this flag in the absense of "use byte"; "use utf8"
+ sets $^U=1 (this appears kludgey)
+ Branch: perl
+ ! embedvar.h gv.c intrpvar.h lib/charnames.pm lib/utf8.pm mg.c
+ ! op.c op.h perlapi.h pod/perlvar.pod pp.c sv.c sv.h
+ ! t/lib/charnames.t win32/win32.h
____________________________________________________________________________
-[ 1421] By: gsar on 1998/07/11 02:54:02
- Log: From: Gisle Aas <gisle@aas.no>
- Subject: [PATCH] B::Deparse for(1..100000)
- Date: 10 Jul 1998 14:04:44 +0200
- Message-ID: <m3n2ahx677.fsf@furu.g.aas.no>
+[ 4936] By: jhi on 2000/01/31 20:17:44
+ Log: HP-UX (induced) fixes.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/hpux.sh
+ Branch: metaconfig
+ ! U/modified/Oldconfig.U U/modified/libs.U
+ Branch: metaconfig/U/perl
+ ! quadfio.U
+____________________________________________________________________________
+[ 4935] By: jhi on 2000/01/31 19:15:43
+ Log: Cosmetics.
+ Branch: metaconfig
+ ! U/compline/d_gconvert.U
+____________________________________________________________________________
+[ 4934] By: jhi on 2000/01/31 19:15:22
+ Log: Cppsym saga continues.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 4933] By: gsar on 2000/01/31 18:45:07
+ Log: !USING_WIDE() branch is busted in win32_stat()
Branch: perl
- ! ext/B/B/Deparse.pm
+ ! win32/win32.c
+____________________________________________________________________________
+[ 4932] By: jhi on 2000/01/31 06:41:47
+ Log: Reveal even more symbols.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 4931] By: jhi on 2000/01/31 06:21:41
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ - lib/caller.pm
+ !> (integrate 29 files)
____________________________________________________________________________
-[ 1420] By: gsar on 1998/07/11 02:28:18
- Log: add 'clean' target for ext/re
+[ 4930] By: gsar on 2000/01/31 04:57:42
+ Log: runtime now looks at the SVf_UTF8 bit on the SV to decide
+ whether to use widechar semantics; lexer and RE engine continue
+ to need "use utf8" to enable unicode awareness in literals
+ and patterns (TODO: this needs to be fixed); $1 et al are marked
+ SvUTF8 if the pattern was compiled for utf8 (TODO: propagating
+ it from the data is probably better)
Branch: perl
- ! ext/re/Makefile.PL
+ ! doop.c gv.c mg.c op.c op.h pp.c pp_ctl.c pp_hot.c regcomp.c
+ ! sv.c t/pragma/warn/doop t/pragma/warn/pp t/pragma/warn/sv
+ ! t/pragma/warn/toke t/pragma/warn/utf8 toke.c utf8.h
____________________________________________________________________________
-[ 1419] By: gsar on 1998/07/11 02:20:32
- Log: From: Tom Hughes <thh@cyberscience.com>
- Date: 10 Jul 1998 10:25:18 +0100
- Message-ID: <yekn2ai5a81.fsf@elva.cyberscience.com>
- Subject: [5.004_71] Patch: svr4 hints updates for Unixware
+[ 4929] By: gsar on 2000/01/31 04:17:09
+ Log: remove caller.pm from change#3534 (flawed idea)
Branch: perl
- ! hints/svr4.sh
+ - lib/caller.pm
+ ! MANIFEST pod/perldelta.pod pod/perlfunc.pod
____________________________________________________________________________
-[ 1418] By: gsar on 1998/07/11 02:19:12
- Log: move op/ipc{msg,sem}.t into lib/ipc_sysv.t
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Fri, 10 Jul 1998 13:08:08 +0300 (EET DST)
- Message-Id: <199807101008.NAA10817@alpha.hut.fi>
- Subject: Re: make minitest does not work out of the box - test subset
- needs pruning
+[ 4928] By: gsar on 2000/01/31 04:16:01
+ Log: fix factual regression (-e doesn't create temporary files anymore)
Branch: perl
- + t/lib/ipc_sysv.t
- - t/op/ipcmsg.t t/op/ipcsem.t
- ! MANIFEST
+ ! pod/perlfilter.pod
____________________________________________________________________________
-[ 1417] By: gsar on 1998/07/11 02:14:16
- Log: disable CR croaking (via #define, default off) in lieu of more
- complete fix
+[ 4927] By: gsar on 2000/01/30 21:27:12
+ Log: introduce $^V (eq chr($revision) . chr($version) . chr($subversion));
+ document version tuples
Branch: perl
- ! toke.c
+ ! gv.c pod/perldelta.pod pod/perlfunc.pod pod/perlop.pod
+ ! pod/perlvar.pod
____________________________________________________________________________
-[ 1416] By: gsar on 1998/07/11 02:06:11
- Log: added patch, made linking with setargv a build option
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Date: Thu, 9 Jul 1998 09:51:42 -0700
- Message-ID: <000101bdab59$d9602dc0$a32fa8c0@tau.Active>
- Subject: [PATCH 5.004_71]
+[ 4926] By: gsar on 2000/01/28 18:10:12
+ Log: implement -follow option in find2perl (from Helmut Jarausch
+ <jarausch@igpm.rwth-aachen.de>)
Branch: perl
- ! perl.c pp_sys.c win32/Makefile win32/makefile.mk
+ ! lib/File/Find.pm x2p/find2perl.PL
____________________________________________________________________________
-[ 1415] By: gsar on 1998/07/11 01:47:19
- Log: From: Tom Hughes <thh@cyberscience.com>
- Date: 10 Jul 1998 09:01:12 +0100
- Message-ID: <yekr9zu5e47.fsf@elva.cyberscience.com>
- Subject: [5.004_71] Patch: Fix perl_exp.SH for Unixware
+[ 4925] By: gsar on 2000/01/28 18:03:28
+ Log: document what chdir() without an argument does (from Mark-Jason
+ Dominus <mjd@plover.com>)
Branch: perl
- ! perl_exp.SH
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1414] By: gsar on 1998/07/11 01:45:45
- Log: make lib/re.pm a prereq for minitest
+[ 4924] By: gsar on 2000/01/28 17:49:34
+ Log: README.cygwin update (from Eric Fifer <EFifer@sanwaint.com>)
Branch: perl
- ! Makefile.SH
+ ! README.cygwin
____________________________________________________________________________
-[ 1413] By: gsar on 1998/07/11 01:40:56
- Log: add patch (via PM)
- From: Stephen McCamant <alias@mcs.com>
- Date: Fri, 10 Jul 1998 01:14:11 -0500 (CDT)
- Message-ID: <13733.45251.47363.431138@alias-2.pr.mcs.net>
- Subject: Big B::Deparse update
+[ 4923] By: gsar on 2000/01/28 17:10:08
+ Log: avoid leaking lexicals into program being debugged (from Ilya
+ Zakharevich)
Branch: perl
- ! ext/B/B/Deparse.pm
+ ! lib/perl5db.pl
____________________________________________________________________________
-[ 1412] By: gsar on 1998/07/11 00:25:17
- Log: add perlport.pod v1.23 from Chris Nandor <pudge@pobox.com>
+[ 4922] By: gsar on 2000/01/28 16:36:13
+ Log: perldelta note about export list changes
Branch: perl
- + pod/perlport.pod
- ! pod/perl.pod
+ ! Changes pod/perldelta.pod
____________________________________________________________________________
-[ 1411] By: gsar on 1998/07/10 21:53:06
- Log: make binmode(STDIN) not whine
- From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Thu, 09 Jul 1998 16:51:27 -0700
- Message-Id: <3.0.5.32.19980709165127.00a692e0@ous.edu>
- Subject: [PATCH 5.004_70] Fix up binmode() for VMS
+[ 4921] By: gsar on 2000/01/28 15:49:04
+ Log: alias realpath() to abs_path() (from Tom Christiansen)
Branch: perl
- ! vms/vms.c
+ ! lib/Cwd.pm
+____________________________________________________________________________
+[ 4920] By: jhi on 2000/01/28 09:52:47
+ Log: Cppsym fixup from Andy.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 4919] By: jhi on 2000/01/28 09:52:22
+ Log: In HP-UX no largefiles if no 64 bits.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 4918] By: jhi on 2000/01/28 09:03:37
+ Log: The #4880 was too eager, the $n test is useful too.
+ Branch: cfgperl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 4917] By: jhi on 2000/01/28 06:27:50
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> pod/perlapi.pod pod/perlintern.pod
+ !> (integrate 39 files)
____________________________________________________________________________
-[ 1410] By: gsar on 1998/07/10 21:50:57
- Log: CPAN-1.39 update
- From: koenig@kulturbox.de (Andreas J. Koenig)
- Date: 10 Jul 1998 00:45:36 +0200
- Message-ID: <sfcbtqytzhr.fsf@dubravka.in-berlin.de>
- Subject: Re: perl5.004_71 hit the stands this morn
+[ 4916] By: gsar on 2000/01/28 05:29:37
+ Log: more exported symbols needed for build on windows
Branch: perl
- ! MANIFEST lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
+ ! embed.pl global.sym objXSUB.h perlapi.c pod/perlapi.pod
+ ! pod/perlintern.pod t/lib/thread.t win32/win32.c
____________________________________________________________________________
-[ 1409] By: gsar on 1998/07/10 21:45:10
- Log: manually apply patch with conflicts
- From: Dan Sugalski <sugalskd@osshe.edu>
- Date: Thu, 09 Jul 1998 12:08:33 -0700
- Message-Id: <3.0.5.32.19980709120833.009eb100@ous.edu>
- Subject: [PATCH 5.004_70] Updated duble-quotes in config.h/config.pm patch
+[ 4915] By: gsar on 2000/01/28 03:43:52
+ Log: autogenerate API listing from comments in the source (from Benjamin
+ Stuhl <sho_pi@hotmail.com>); fix the markup format to be more
+ flexible for better readability; add missing docs in sv.c; regenerate
+ perltoc
Branch: perl
- ! configpm
+ + pod/perlapi.pod pod/perlintern.pod
+ ! MANIFEST XSUB.h av.c av.h cop.h cv.h embed.pl global.sym gv.c
+ ! gv.h handy.h hv.c hv.h intrpvar.h makedef.pl mg.c objXSUB.h
+ ! op.c op.h perl.c perlapi.c pod/Makefile pod/buildtoc
+ ! pod/perl.pod pod/perldelta.pod pod/perlguts.pod
+ ! pod/perltoc.pod pod/roffitall pp.h scope.h sv.c sv.h thrdvar.h
+ ! universal.c util.c
____________________________________________________________________________
-[ 1408] By: gsar on 1998/07/10 21:36:54
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Thu, 9 Jul 1998 11:58:30 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980709115556.24236D-100000@newton.phys>
- Subject: Re: perldelta.pod [PATCH]
+[ 4914] By: gsar on 2000/01/27 19:43:35
+ Log: document unimplemented status of forking pipe open() on windows
Branch: perl
- ! pod/perldelta.pod
+ ! pod/perlfork.pod t/op/fork.t
+____________________________________________________________________________
+[ 4913] By: jhi on 2000/01/27 11:18:51
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 51 files)
____________________________________________________________________________
-[ 1407] By: gsar on 1998/07/10 21:35:13
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Thu, 9 Jul 1998 11:26:03 -0400 (EDT)
- Subject: [PATCH 5.004_71] Allow static build of IPC::SysV
- Message-Id: <Pine.SUN.3.96.980709112507.24236B-100000@newton.phys>
+[ 4912] By: jhi on 2000/01/27 10:35:48
+ Log: Cppsym update continues.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 4911] By: gsar on 2000/01/27 08:04:17
+ Log: add missing flag in change#4892
Branch: perl
- ! ext/IPC/SysV/Makefile.PL
+ ! win32/win32.c
____________________________________________________________________________
-[ 1406] By: gsar on 1998/07/10 21:33:30
- Log: manually apply patch with conflicts
- From: kstar@chapin.edu
- Message-ID: <19980709093621.B7857@O2.chapin.edu>
- Date: Thu, 9 Jul 1998 09:36:21 -0400
- Subject: Re: [PATCH] 5.004_70 installperl and docs
+[ 4910] By: gsar on 2000/01/27 03:56:48
+ Log: various pod nits identified by installhtml (all fixed except
+ unresolved links)
Branch: perl
- ! installperl
+ ! ext/B/B/C.pm ext/Devel/Peek/Peek.pm ext/File/Glob/Glob.pm
+ ! ext/IO/lib/IO/Socket/INET.pm ext/IPC/SysV/SysV.pm
+ ! ext/Thread/Thread.pm lib/Class/Struct.pm lib/File/Find.pm
+ ! lib/File/Spec/VMS.pm lib/Pod/Html.pm lib/UNIVERSAL.pm
+ ! pod/buildtoc pod/perlcompile.pod pod/perlfork.pod
+ ! pod/perlre.pod pod/perltoc.pod pod/perltodo.pod
____________________________________________________________________________
-[ 1405] By: gsar on 1998/07/10 21:28:29
- Log: misc tweaks to docs and qsortsv() warning
+[ 4909] By: gsar on 2000/01/26 22:45:28
+ Log: typo
Branch: perl
- ! Changes pod/perldelta.pod pod/perlsub.pod pp_ctl.c
+ ! Porting/p4desc
____________________________________________________________________________
-[ 1404] By: gsar on 1998/07/10 21:23:53
- Log: add more correct version of change#1350 (as yet untested)
- From: joshua.pritikin@db.com
- Date: Thu, 9 Jul 1998 09:22:46 -0400
- Message-Id: <H00000e50008f277@MHS>
- Subject: Re: [PATCH _70] cache missing methods
+[ 4908] By: gsar on 2000/01/26 22:41:18
+ Log: update p4 tool
Branch: perl
- ! embedvar.h gv.c interp.sym intrpvar.h perlvars.h
+ ! Porting/p4desc
____________________________________________________________________________
-[ 1403] By: gsar on 1998/07/10 20:46:12
- Log: add win32_rename() that does what docs say
+[ 4907] By: gsar on 2000/01/26 21:45:41
+ Log: revised attribute syntax: C<my $foo :a :b :c>, C<my $foo : a b c>
+ and C<my $foo : a : b : c> are all valid (from Spider Boardman)
Branch: perl
- ! win32/GenCAPI.pl win32/makedef.pl win32/perlhost.h
- ! win32/win32.c win32/win32iop.h
+ ! lib/AutoSplit.pm lib/SelfLoader.pm lib/attributes.pm
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlsub.pod
+ ! t/op/attrs.t toke.c
____________________________________________________________________________
-[ 1402] By: gsar on 1998/07/10 20:19:18
- Log: inet_aton() should do DNS lookup only if arg isn't a dotted-quad
- (suggested by Philippe.Simonet@swisscom.com)
+[ 4906] By: gsar on 2000/01/26 20:16:39
+ Log: pod typos and warnings (from Abigail <abigail@delanet.com>)
Branch: perl
- ! ext/Socket/Socket.xs
+ ! README.win32 ext/B/B/Deparse.pm lib/Class/Struct.pm
____________________________________________________________________________
-[ 1401] By: gsar on 1998/07/10 03:24:45
- Log: undo change#1379 (order of tests *is* significant)
+[ 4905] By: gsar on 2000/01/26 19:10:26
+ Log: s/STOP/CHECK/ blocks
Branch: perl
- ! t/lib/posix.t
+ ! embedvar.h ext/B/B/Stash.pm ext/B/NOTES ext/B/O.pm intrpvar.h
+ ! keywords.h keywords.pl lib/constant.pm op.c perl.c perlapi.h
+ ! perly.c perly.y pod/perldelta.pod pod/perldiag.pod
+ ! pod/perlfunc.pod pod/perlmod.pod pod/perlrun.pod
+ ! pod/perlsub.pod pod/perltodo.pod sv.c t/op/misc.t toke.c
+ ! vms/perly_c.vms
____________________________________________________________________________
-[ 1400] By: nick on 1998/07/09 17:43:14
- Log: Integrate mainline (_071-ish)
- Branch: ansiperl
- +> ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
- +> ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Makefile.PL
- +> ext/Data/Dumper/Todo ext/IPC/SysV/ChangeLog
- +> ext/IPC/SysV/MANIFEST ext/IPC/SysV/Makefile.PL
- +> ext/IPC/SysV/Msg.pm ext/IPC/SysV/README
- +> ext/IPC/SysV/Semaphore.pm ext/IPC/SysV/SysV.pm
- +> ext/IPC/SysV/SysV.xs ext/IPC/SysV/t/msg.t ext/IPC/SysV/t/sem.t
- +> ext/re/Makefile.PL ext/re/re.pm ext/re/re.xs pp_proto.h
- +> t/io/iprefix.t t/lib/dumper-ovl.t t/lib/dumper.t
- !> (integrate 145 files)
-
-----------------
-Version 5.004_71
-----------------
-
+[ 4904] By: jhi on 2000/01/26 13:58:18
+ Log: In UNICOS and UNICOS/mk after a successful fcntl F_SETFL
+ of O_NONBLOCK a subsequent fcntl F_GETFL will return O_NDELAY.
+ Branch: cfgperl
+ ! ext/IO/IO.xs
+____________________________________________________________________________
+[ 4903] By: jhi on 2000/01/26 11:16:34
+ Log: Continue cpp symbol update.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
____________________________________________________________________________
-[ 1399] By: gsar on 1998/07/09 12:15:12
- Log: update Changes, perlhist.pod, beginnings of perldelta.pod
+[ 4902] By: gsar on 2000/01/26 09:28:37
+ Log: tweak exports list on Windows
Branch: perl
- ! Changes pod/perldelta.pod pod/perlhist.pod
+ ! makedef.pl t/op/fork.t win32/win32.h
____________________________________________________________________________
-[ 1397] By: gsar on 1998/07/09 08:35:39
- Log: merge changes from maintbranch (1354, and relevant part of 1356); all
- maintenance changes upto 1356 merged
+[ 4901] By: jhi on 2000/01/26 08:05:57
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes README.win32 lib/File/Path.pm lib/Getopt/Std.pm op.c
+ !> pod/perldelta.pod pod/perldiag.pod t/op/grep.t
+ !> t/pragma/strict-vars toke.c win32/Makefile win32/makefile.mk
+ !> win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 4900] By: jhi on 2000/01/26 07:59:05
+ Log: s/d_nvpresuv/d_nv_preserves_uv/;
+ plus cosmetic change for #4899.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+ Branch: metaconfig/U/perl
+ ! perlxv.U
+____________________________________________________________________________
+[ 4899] By: jhi on 2000/01/26 07:46:56
+ Log: Update the scan of the cpp symbols.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Cppsym.U
+____________________________________________________________________________
+[ 4898] By: gsar on 2000/01/26 04:49:45
+ Log: allow '--' to terminate argument processing (suggested by
+ Marc Espie <espie@schutzenberger.liafa.jussieu.fr>)
Branch: perl
- ! pod/perldiag.pod pp_hot.c t/op/misc.t
+ ! lib/Getopt/Std.pm
____________________________________________________________________________
-[ 1396] By: gsar on 1998/07/09 08:02:52
- Log: add Data-Dumper, up patchlevel to 71, various misc tweaks to
- make all configs build on Solaris and win32
+[ 4897] By: gsar on 2000/01/26 02:42:38
+ Log: change#3744 should have made grep more like map instead of the
+ other way around
Branch: perl
- + ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
- + ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Makefile.PL
- + ext/Data/Dumper/Todo t/lib/dumper-ovl.t t/lib/dumper.t
- ! MANIFEST Todo patchlevel.h win32/Makefile win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+ ! t/op/grep.t toke.c
____________________________________________________________________________
-[ 1395] By: gsar on 1998/07/09 05:39:48
- Log: From: Stephen McCamant <alias@mcs.com>
- Date: Wed, 08 Jul 1998 23:16:49 CDT
- Message-Id: <13732.16626.904108.608743@alias-2.pr.mcs.net>
- Subject: [PATCH] UNOP opclass test in B.xs
+[ 4896] By: gsar on 2000/01/26 00:56:14
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! ext/B/B.xs
+ +> vos/config.def vos/config.pl
+ ! Changes
+ !> Configure MANIFEST config_h.SH hints/unicosmk.sh
+ !> lib/Benchmark.pm pod/perldelta.pod pod/perlhist.pod pp.c
+ !> vos/config.h vos/config_h.SH_orig
____________________________________________________________________________
-[ 1394] By: gsar on 1998/07/09 05:37:48
- Log: get it building again on win32
+[ 4895] By: gsar on 2000/01/26 00:45:45
+ Log: fix parse failure of (my $foo : bar) and similar (from Spider
+ Boardman)
Branch: perl
- ! bytecode.h embed.h ext/re/Makefile.PL global.sym intrpvar.h
- ! op.c opcode.pl perl.h pp.c pp_ctl.c pp_hot.c pp_proto.h
- ! pp_sys.c proto.h win32/Makefile win32/makedef.pl
- ! win32/makefile.mk
+ ! toke.c
____________________________________________________________________________
-[ 1393] By: gsar on 1998/07/09 05:20:31
- Log: applied patch from Ilya, tweaked some to get clean static build of
- the ext/re stuff (untested on win32)
+[ 4894] By: gsar on 2000/01/26 00:33:53
+ Log: avoid failure if directories already read by rmtree() are
+ deleted by another process
Branch: perl
- ! regcomp.c regexec.c
+ ! lib/File/Path.pm
____________________________________________________________________________
-[ 1392] By: gsar on 1998/07/09 03:56:45
- Log: fix installperl typo
- From: kstar@chapin.edu
- Date: Wed, 08 Jul 1998 23:51:57 EDT
- Message-Id: <19980708235157.D1380@O2.chapin.edu>
- Subject: Re: [PATCH] 5.004_70 installperl and docs
+[ 4893] By: gsar on 2000/01/25 23:19:18
+ Log: typo in change#4892
Branch: perl
- ! installperl
+ ! win32/win32.c
____________________________________________________________________________
-[ 1391] By: gsar on 1998/07/09 01:48:16
- Log: From: Chip Salzenberg <chip@perl.org>
- Date: Wed, 8 Jul 1998 18:10:55 -0400
- Message-ID: <19980708181055.A8005@perlsupport.com>
- Subject: [PATCH _70] Allow $SIG{CHLD}='IGNORE' to work on Solaris
+[ 4892] By: gsar on 2000/01/25 22:16:19
+ Log: eliminate need for perl95.exe on Windows 9x by working around CRT
+ bug internally (from Benjamin Stuhl <sho_pi@hotmail.com>); modified
+ to call the fixed version of open_osfhandle() only on Windows 9x;
+ updated the makefiles and README.win32 to suit
Branch: perl
- ! util.c
+ ! README.win32 win32/Makefile win32/makefile.mk win32/win32.c
+ ! win32/win32.h
____________________________________________________________________________
-[ 1390] By: gsar on 1998/07/09 01:45:16
- Log: added patch, tweaked per Ilya's suggestion
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Date: Wed, 8 Jul 1998 13:34:42 +0100
- Message-Id: <E0yttQo-0002aH-00@taurus.cus.cam.ac.uk>
- Subject: [PATCH] perl5db.pl complains about non-integer condition
+[ 4891] By: gsar on 2000/01/25 20:22:01
+ Log: produce redeclaration warning on C<our $foo; { our $foo; ... }>
Branch: perl
- ! lib/perl5db.pl
+ ! op.c pod/perldelta.pod pod/perldiag.pod t/pragma/strict-vars
____________________________________________________________________________
-[ 1389] By: gsar on 1998/07/09 01:42:13
- Log: reenable misaligned memory checks, cast to UV & check alignment
- From: Dominic Dunlop <domo@computer.org>
- Date: Wed, 8 Jul 1998 11:21:48 +0000
- Message-Id: <v03110703b1c8ffdb68ed@[195.95.102.91]>
- Subject: Re: [PATCH 5.00469] corrupt malloc ptr on NeXT
+[ 4890] By: gsar on 2000/01/25 19:21:17
+ Log: update Makefile notes on the now deprecated USE_5005THREADS and
+ USE_OBJECT
Branch: perl
- ! malloc.c
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 4889] By: jhi on 2000/01/25 14:44:55
+ Log: Misedit in #4888.
+ Branch: cfgperl
+ ! pp.c
+____________________________________________________________________________
+[ 4888] By: jhi on 2000/01/25 14:38:59
+ Log: UNICOS/mk patches. Removing the _CRAYMPP test may be
+ rash but it's the best move I can think of right now.
+ UNICOS/mk doesn't anymore (2.0.4.82) define _CRAYMPP,
+ but I think it did in the past.
+ Removing the _CRAYMPP test fixes a legion of pack/unpack
+ failures (hint: SHORTSIZE=4,INTSIZE=8,LONGSIZE=8).
+ One subtest, t/lib/io_sock.t #14, is still failing.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/unicosmk.sh pp.c
+ Branch: metaconfig
+ ! U/modified/Oldconfig.U
+____________________________________________________________________________
+[ 4887] By: jhi on 2000/01/25 06:13:14
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes Makefile.SH XSUB.h cflags.SH embed.pl globals.c
+ !> installperl lib/Pod/Html.pm makedef.pl mg.c objXSUB.h perl.h
+ !> perlapi.c perlapi.h pod/perldelta.pod pod/perldiag.pod
+ !> t/io/fs.t win32/Makefile win32/makefile.mk win32/perlhost.h
+ !> win32/perllib.c win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 1388] By: gsar on 1998/07/09 01:36:22
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Wed, 8 Jul 1998 13:32:07 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980708133010.23053F-100000@newton.phys>
- Subject: [PATCH 5.004_70] more on finding metaconfig units.
+[ 4886] By: gsar on 2000/01/25 02:54:00
+ Log: consistently use MAX_PATH+1 buffer sizes
Branch: perl
- ! Porting/pumpkin.pod
+ ! win32/win32.c
____________________________________________________________________________
-[ 1387] By: gsar on 1998/07/09 01:35:23
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Wed, 8 Jul 1998 13:29:34 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980708132743.23053E-100000@newton.phys>
- Subject: Configure indentation patch
+[ 4885] By: gsar on 2000/01/25 02:51:35
+ Log: workaround for rename('x','X') bug in Windows NT
Branch: perl
- ! Configure
+ ! t/io/fs.t win32/win32.c
____________________________________________________________________________
-[ 1386] By: gsar on 1998/07/09 01:33:31
- Log: don't try to hardlink perldiag.pod; that is no longer not needed
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Wed, 8 Jul 1998 12:18:32 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980708120844.23053D-100000@newton.phys>
- Subject: Re: pelr installation attempts hard links between file systems
+[ 4884] By: gsar on 2000/01/25 01:32:57
+ Log: windows build fixups from uniform DLL name change to perl56.dll
Branch: perl
- ! installperl
+ ! installperl makedef.pl win32/perllib.c
____________________________________________________________________________
-[ 1385] By: gsar on 1998/07/09 01:28:05
- Log: win32/makefile.mk =~ s|gcc -pipe|gcc|
+[ 4883] By: gsar on 2000/01/25 01:31:27
+ Log: more fixes for warnings from change#4840
Branch: perl
- ! win32/makefile.mk
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 1384] By: gsar on 1998/07/09 01:26:19
- Log: make t/TEST run 'perl $switches ./foo/test.t' everywhere
+[ 4882] By: gsar on 2000/01/24 15:35:12
+ Log: assorted little nits
Branch: perl
- ! t/TEST
+ ! mg.c win32/Makefile win32/makefile.mk win32/perlhost.h
+ ! win32/win32.c
____________________________________________________________________________
-[ 1383] By: gsar on 1998/07/09 01:06:47
- Log: manually apply patch with a dependency on unapplied patch
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 8 Jul 1998 07:03:51 -0400 (EDT)
- Message-Id: <199807081103.HAA25145@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_70] make quoted RE embeddable
+[ 4881] By: gsar on 2000/01/24 14:32:31
+ Log: add new warnings to perldelta
Branch: perl
- ! sv.c t/op/pat.t
+ ! Changes pod/perldelta.pod pod/perldiag.pod
____________________________________________________________________________
-[ 1382] By: gsar on 1998/07/09 01:02:23
- Log: change order of libs for extensions
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Date: Tue, 7 Jul 1998 23:48:05 +0200
- Message-ID: <19980707234805.C180@cdata.tvnet.hu>
- Subject: [PATCH _70] linking problem with modules
+[ 4880] By: jhi on 2000/01/24 14:14:23
+ Log: From: Stephane Payrard <properler@freesurf.fr>
+ To: Gurusamy Sarathy <gsar@ActiveState.com>
+ Cc: perl5-porters@perl.org
+ Subject: <patch> avoid division by 0 in Benchmark.pm
+ Date: Mon, 24 Jan 2000 16:15:38 +0100
+ Message-ID: <20000124161538.A995@freesurf.fr>
+ Branch: cfgperl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 4879] By: gsar on 2000/01/24 14:14:20
+ Log: force linkage of the function wrappers for globals in change#4878
Branch: perl
- ! lib/ExtUtils/MM_Unix.pm
+ ! embed.pl globals.c perlapi.h win32/win32.h
____________________________________________________________________________
-[ 1381] By: gsar on 1998/07/09 00:56:12
- Log: patch for more flexible initialization of xsub parameters
- From: Tye McQueen <tye@metronet.com>
- Date: Mon, 6 Jul 1998 19:04:27 -0500 (CDT)
- Message-Id: <199807070004.AA16454@metronet.com>
- Subject: Enhanced arg inits for xsubpp
+[ 4878] By: gsar on 2000/01/24 13:04:45
+ Log: enable function wrappers for access to globals under MULTIPLICITY
+ (provides binary compatibility in the face of changes in interpreter
+ structure)
Branch: perl
- ! lib/ExtUtils/xsubpp pod/perlxs.pod
+ ! Makefile.SH XSUB.h cflags.SH embed.pl makedef.pl objXSUB.h
+ ! perl.h perlapi.c perlapi.h win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 1380] By: gsar on 1998/07/09 00:44:01
- Log: From: Tye McQueen <tye@metronet.com>
- Date: Mon, 6 Jul 1998 17:34:54 -0500 (CDT)
- Message-Id: <16619-17073@lyris.activestate.com>
- Subject: New pl2bat.pl
+[ 4877] By: jhi on 2000/01/24 11:41:57
+ Log: perlhist update.
+ Branch: cfgperl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 4876] By: jhi on 2000/01/24 11:32:07
+ Log: Updates on the large file support status.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 4875] By: jhi on 2000/01/24 11:23:16
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> ext/DB_File/Makefile.PL ext/NDBM_File/NDBM_File.pm
+ !> ext/ODBM_File/ODBM_File.pm lib/AutoSplit.pm
+ !> lib/Math/Complex.pm lib/Math/Trig.pm lib/Shell.pm
+____________________________________________________________________________
+[ 4874] By: gsar on 2000/01/24 10:43:03
+ Log: fix typos; avoid use constant for lowercase constants (produces
+ warnings now)
Branch: perl
- ! win32/bin/pl2bat.pl
+ ! ext/DB_File/Makefile.PL lib/Math/Complex.pm lib/Math/Trig.pm
+ ! lib/Shell.pm
____________________________________________________________________________
-[ 1379] By: gsar on 1998/07/09 00:30:58
- Log: remove ordering dependency in posix.t
+[ 4873] By: gsar on 2000/01/24 09:40:24
+ Log: avoid warnings when there's no subs to autosplit
Branch: perl
- ! t/lib/posix.t
+ ! lib/AutoSplit.pm
+____________________________________________________________________________
+[ 4872] By: jhi on 2000/01/24 09:39:01
+ Log: Create a tool for converting a config_h.SH into a VOS config.h.
+ Branch: cfgperl
+ + vos/config.def vos/config.pl
+ ! MANIFEST vos/config.h vos/config_h.SH_orig
____________________________________________________________________________
-[ 1378] By: gsar on 1998/07/08 20:17:43
- Log: make -i'*suffix' work too
+[ 4871] By: gsar on 2000/01/24 09:15:20
+ Log: typos in change#4623
Branch: perl
- ! doio.c
+ ! ext/NDBM_File/NDBM_File.pm ext/ODBM_File/ODBM_File.pm
____________________________________________________________________________
-[ 1377] By: gsar on 1998/07/08 08:56:28
- Log: regen headers; result builds & tests on Solaris again (threaded)
+[ 4870] By: jhi on 2000/01/24 06:43:19
+ Log: Sync metaconfig units to comply with the typo fixes of #4869.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ + U/modified/cf_email.U U/modified/so.U
+ Branch: metaconfig/U/perl
+ ! dlsrc.U
+____________________________________________________________________________
+[ 4869] By: jhi on 2000/01/24 06:04:31
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/pragma/diagnostics.t
+ !> (integrate 120 files)
+____________________________________________________________________________
+[ 4868] By: gsar on 2000/01/23 21:49:28
+ Log: on windows, set seek position to end for files opened in append mode
+ (improves compatibility with Unix, avoids buffering issues)
Branch: perl
- ! embedvar.h
+ ! win32/win32.c
____________________________________________________________________________
-[ 1376] By: gsar on 1998/07/08 08:55:03
- Log: change#1350 breaks things, back it out
+[ 4867] By: gsar on 2000/01/23 21:19:31
+ Log: change#4866 was flawed; revert and add better fix for warning
Branch: perl
- ! embedvar.h gv.c interp.sym intrpvar.h perlvars.h
+ ! op.c op.h
____________________________________________________________________________
-[ 1375] By: gsar on 1998/07/08 07:47:00
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Wed, 8 Jul 1998 01:30:15 -0400 (EDT)
- Message-Id: <199807080530.BAA14072@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_70] Switch modifiers in RE off
+[ 4866] By: gsar on 2000/01/23 20:43:56
+ Log: optimize away runtime code for our($foo) (also avoid warnings)
Branch: perl
- ! pod/perlre.pod regcomp.c t/op/re_tests
+ ! op.c
____________________________________________________________________________
-[ 1374] By: gsar on 1998/07/08 07:41:06
- Log: From: Gisle Aas <gisle@aas.no>
- Date: 07 Jul 1998 23:08:59 +0200
- Message-ID: <m3vhp9z7v8.fsf@furu.g.aas.no>
- Subject: [PATCH] Faster copying from SvIV/SvNVs in sv_setsv()
+[ 4865] By: gsar on 2000/01/23 13:17:18
+ Log: DB_File 1.72 update from Paul Marquess <paul.marquess@bt.com>
Branch: perl
- ! sv.c
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/version.c
____________________________________________________________________________
-[ 1373] By: gsar on 1998/07/08 07:36:01
- Log: From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Date: Tue, 7 Jul 1998 23:47:50 +0200
- Message-ID: <19980707234750.A180@cdata.tvnet.hu>
- Subject: [PATCH _70] dos-djgpp update
+[ 4864] By: gsar on 2000/01/23 13:12:31
+ Log: system('VAR123=foo cmd') wasn't invoking shell (de-locale-ized patch
+ suggested by Dominic Dunlop <domo@computer.org>)
Branch: perl
- ! djgpp/config.over djgpp/djgppsed.sh
+ ! doio.c
____________________________________________________________________________
-[ 1372] By: gsar on 1998/07/08 07:12:47
- Log: add extension to support SysV IPC
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 7 Jul 1998 02:32:53 +0300 (EET DST)
- Message-Id: <199807062332.CAA25792@alpha.hut.fi>
- Subject: [PATCH] 5.004_70: IPC::SysV
- Branch: perl
- + ext/IPC/SysV/ChangeLog ext/IPC/SysV/MANIFEST
- + ext/IPC/SysV/Makefile.PL ext/IPC/SysV/Msg.pm
- + ext/IPC/SysV/README ext/IPC/SysV/Semaphore.pm
- + ext/IPC/SysV/SysV.pm ext/IPC/SysV/SysV.xs ext/IPC/SysV/t/msg.t
- + ext/IPC/SysV/t/sem.t
- ! Configure MANIFEST pod/perlfunc.pod pod/perlipc.pod
- ! t/op/ipcmsg.t t/op/ipcsem.t
-____________________________________________________________________________
-[ 1371] By: gsar on 1998/07/08 05:12:07
- Log: add patch for C<use re 'debug'>
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 6 Jul 1998 22:24:33 -0400 (EDT)
- Message-Id: <199807070224.WAA10318@monk.mps.ohio-state.edu>
- Subject: Re: _70 and Devel::RE
+[ 4863] By: gsar on 2000/01/23 13:01:35
+ Log: fix misclassified warnings
Branch: perl
- + ext/re/Makefile.PL ext/re/re.pm ext/re/re.xs
- - lib/re.pm
- ! MANIFEST Makefile.SH global.sym interp.sym intrpvar.h op.c
- ! perl.h pp.c pp_ctl.c pp_hot.c regcomp.c regexec.c
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 1370] By: gsar on 1998/07/08 04:27:27
- Log: added patch to generate PPDEF(pp_foo)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 6 Jul 1998 20:43:54 -0400 (EDT)
- Message-Id: <199807070043.UAA28572@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_70] Autogenerate declarations for opcodes
+[ 4862] By: gsar on 2000/01/23 12:52:12
+ Log: document bareword prototype incompatibility
Branch: perl
- + pp_proto.h
- ! MANIFEST Makefile.SH opcode.pl proto.h
+ ! pod/perldelta.pod pod/perlsub.pod
____________________________________________________________________________
-[ 1369] By: gsar on 1998/07/08 04:19:49
- Log: suggest 'make test' after make
+[ 4861] By: gsar on 2000/01/23 12:32:25
+ Log: faulty edit
Branch: perl
- ! Makefile.SH
+ ! lib/File/stat.pm
____________________________________________________________________________
-[ 1368] By: gsar on 1998/07/08 03:58:19
- Log: added patch for -i'foo*bar', made code somewhat simpler, tweaked doc
- From: Colin Kuskie <ckuskie@cadence.com>
- Date: Tue, 7 Jul 1998 09:44:33 -0700 (PDT)
- Message-ID: <Pine.GSO.3.96.980707093457.28681A-100000@pdxue150.cadence.com>
- Subject: Corrected -i prefix patch
+[ 4860] By: gsar on 2000/01/23 12:23:48
+ Log: s/use vars/our/g modules that aren't independently maintained on CPAN
Branch: perl
- + t/io/iprefix.t
- ! MANIFEST doio.c pod/perlrun.pod
+ ! ext/B/B/Asmdata.pm ext/Data/Dumper/Dumper.pm
+ ! ext/Devel/DProf/DProf.pm ext/Fcntl/Fcntl.pm
+ ! ext/File/Glob/Glob.pm ext/GDBM_File/GDBM_File.pm
+ ! ext/IO/lib/IO/Dir.pm ext/IO/lib/IO/File.pm
+ ! ext/IO/lib/IO/Handle.pm ext/IO/lib/IO/Pipe.pm
+ ! ext/IO/lib/IO/Poll.pm ext/IO/lib/IO/Seekable.pm
+ ! ext/IO/lib/IO/Socket.pm ext/IO/lib/IO/Socket/INET.pm
+ ! ext/IO/lib/IO/Socket/UNIX.pm ext/NDBM_File/NDBM_File.pm
+ ! ext/ODBM_File/ODBM_File.pm ext/Opcode/Opcode.pm
+ ! ext/Opcode/Safe.pm ext/POSIX/POSIX.pm
+ ! ext/SDBM_File/SDBM_File.pm ext/Socket/Socket.pm
+ ! ext/Thread/Thread.pm lib/AnyDBM_File.pm lib/AutoLoader.pm
+ ! lib/AutoSplit.pm lib/Class/Struct.pm lib/Dumpvalue.pm
+ ! lib/ExtUtils/Command.pm lib/ExtUtils/Install.pm
+ ! lib/ExtUtils/Installed.pm lib/ExtUtils/Liblist.pm
+ ! lib/ExtUtils/MM_VMS.pm lib/ExtUtils/Mksymlists.pm
+ ! lib/ExtUtils/Packlist.pm lib/Fatal.pm lib/File/Basename.pm
+ ! lib/File/Compare.pm lib/File/Copy.pm lib/File/Find.pm
+ ! lib/File/Path.pm lib/File/stat.pm lib/FileHandle.pm
+ ! lib/Math/Complex.pm lib/Math/Trig.pm lib/Net/Ping.pm
+ ! lib/Net/hostent.pm lib/Net/netent.pm lib/Net/protoent.pm
+ ! lib/Net/servent.pm lib/Shell.pm lib/Test.pm
+ ! lib/Test/Harness.pm lib/Tie/Array.pm lib/Tie/Handle.pm
+ ! lib/Time/gmtime.pm lib/Time/localtime.pm lib/User/grent.pm
+ ! lib/User/pwent.pm lib/base.pm lib/caller.pm lib/constant.pm
+ ! lib/diagnostics.pm lib/fields.pm lib/lib.pm lib/strict.pm
____________________________________________________________________________
-[ 1366] By: gsar on 1998/07/08 02:28:30
- Log: From: Gisle Aas <gisle@aas.no>
- Date: 07 Jul 1998 17:48:36 +0200
- Message-ID: <m3vhp94q7f.fsf@furu.g.aas.no>
- Subject: [PATCH] Remove some rendundant SvOOK_on tests
+[ 4859] By: gsar on 2000/01/23 11:29:22
+ Log: fix diagnostics to report "our" vs "my" correctly
Branch: perl
- ! sv.c sv.h
+ ! op.c pod/perldiag.pod
____________________________________________________________________________
-[ 1365] By: gsar on 1998/07/08 02:25:17
- Log: applied patch to clarify m//g
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Date: Tue, 7 Jul 1998 15:59:03 +0100
- Message-Id: <E0ytZCx-0006Bi-00@taurus.cus.cam.ac.uk>
- Subject: [PATCH] Re: m//g in perlop.pod
+[ 4858] By: gsar on 2000/01/23 10:14:46
+ Log: set api_version to 5.5.0 (binary compatibility needs to get tested
+ more widely)
Branch: perl
- ! pod/perlop.pod
+ ! patchlevel.h
____________________________________________________________________________
-[ 1364] By: gsar on 1998/07/08 02:13:07
- Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Subject: [PATCH] 5.004_70 bug in perlfaq.pod
- Message-Id: <E0ytVTJ-0002kb-00@taurus.cus.cam.ac.uk>
- Date: Tue, 7 Jul 1998 11:59:41 +0100
+[ 4857] By: gsar on 2000/01/23 10:04:03
+ Log: disallow our($foo::bar)
Branch: perl
- ! pod/perlfaq.pod
+ ! pod/perldiag.pod toke.c
____________________________________________________________________________
-[ 1363] By: gsar on 1998/07/08 02:11:11
- Log: applied tweak (via private mail)
- From: Jarkko Hietaniemi <jhi@cc.hut.fi>
- Date: Tue, 7 Jul 1998 13:27:47 +0300 (EET DST)
- Message-Id: <199807071027.NAA20829@alpha.hut.fi>
- Subject: tiny perllocale.pod patch for 5.004_70
+[ 4856] By: gsar on 2000/01/23 09:50:54
+ Log: dprofpp can't find Devel::DProf::VERSION due to change#4852
Branch: perl
- ! pod/perllocale.pod
+ ! utils/dprofpp.PL
____________________________________________________________________________
-[ 1362] By: gsar on 1998/07/08 02:07:48
- Log: applied patch, various tweaks to pander to pod2man tantrums
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 6 Jul 1998 22:47:30 -0400 (EDT)
- Message-Id: <199807070247.WAA10677@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_70] CONFIGPM
+[ 4855] By: gsar on 2000/01/23 09:36:51
+ Log: new test (from Michael G Schwern <schwern@pobox.com>)
Branch: perl
- ! Porting/Glossary configpm
+ + t/pragma/diagnostics.t
+ ! MANIFEST
____________________________________________________________________________
-[ 1361] By: gsar on 1998/07/07 22:13:11
- Log: From: Stephen McCamant <alias@mcs.com>
- Date: Mon, 6 Jul 1998 21:22:17 -0500 (CDT)
- Message-ID: <13729.33816.311236.995647@alias-2.pr.mcs.net>
- Subject: Re: Inconsistent arithmetics on refs
+[ 4854] By: gsar on 2000/01/23 09:24:40
+ Log: add PREREQ_PM to default template (suggested by Michael G Schwern
+ <schwern@pobox.com>)
Branch: perl
- ! sv.c
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 1360] By: gsar on 1998/07/07 22:11:11
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Mon, 6 Jul 1998 20:59:10 -0400 (EDT)
- Message-Id: <199807070059.UAA28815@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_70] Anohter ptags improvement
+[ 4853] By: gsar on 2000/01/23 09:08:30
+ Log: cygwin update (from Eric Fifer <EFifer@sanwaint.com>)
Branch: perl
- ! emacs/ptags
+ ! cygwin/Makefile.SHs hints/cygwin.sh t/io/tell.t
____________________________________________________________________________
-[ 1359] By: gsar on 1998/07/07 22:08:48
- Log: fix accidental RE-de-optimization
- From: larry@wall.org (Larry Wall)
- Date: Mon, 6 Jul 1998 17:49:31 -0700
- Message-Id: <199807070049.RAA23475@wall.org>
- Subject: Re: before you deluge us with patches
- --
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Date: Tue, 7 Jul 1998 03:10:56 -0400 (EDT)
- Message-Id: <199807070710.DAA25399@monk.mps.ohio-state.edu>
- Subject: Re: before you deluge us with patches
+[ 4852] By: gsar on 2000/01/23 08:52:44
+ Log: mark some extensions as "special versions" to avoid CPAN indexer
+ confusion (from Ilya Zakharevich)
Branch: perl
- ! pp_hot.c regexec.c
+ ! ext/Devel/DProf/DProf.pm ext/Devel/Peek/Peek.pm
____________________________________________________________________________
-[ 1358] By: gsar on 1998/07/07 21:36:29
- Log: From: Gisle Aas <gisle@aas.no>
- Subject: [PATCH] Evaluation of AVHVs in scalar context
- Date: 06 Jul 1998 21:41:14 +0200
- Message-ID: <m33ecedaxx.fsf@furu.g.aas.no>
+[ 4851] By: gsar on 2000/01/23 08:48:46
+ Log: prefer POSIX::uname() rather than syscalls, which require attempting
+ to load syscall.ph (from David Huggins-Daines <dhd@eradicator.org>)
Branch: perl
- ! pp_hot.c t/op/avhv.t
+ ! lib/Sys/Hostname.pm
____________________________________________________________________________
-[ 1357] By: gsar on 1998/07/07 21:29:46
- Log: doc tweaks suggested by Abigail, M.J.T. Guy, and Larry Wall
+[ 4850] By: gsar on 2000/01/23 08:36:43
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! lib/Math/Trig.pm lib/fields.pm thread.sym
+ !> Configure Policy_sh.SH Porting/Glossary Porting/config.sh
+ !> Porting/config_H config_h.SH perl.h
____________________________________________________________________________
-[ 1356] By: TimBunce on 1998/07/07 17:19:42
- Log: Assorted patches:
-
- ------ BUILD PROCESS ------
-
- Title: "Add Test.pm (from perl 5.004_70)"
- Files: MANIFEST lib/Test.pm
-
- ------ EXTENSIONS ------
-
- Title: "Add CR LF CRLF to Socket.pm"
- From: Chris Nandor <pudge@pobox.com>
- Msg-ID: <v04003a46b1b6067832a1@[24.48.28.52]>
- Files: ext/Socket/Socket.pm
-
- ------ LIBRARY ------
-
- Title: "AutoSplit upgrade (AutoSplit 1.0302 from 5.004_70)"
- Files: lib/AutoSplit.pm
-
- Title: "Upgrade base.pm (from perl 5.004_70)"
- Files: lib/base.pm
-
- Title: "Add File::Spec modules (from 5.004_70)"
- Files: lib/File/Spec.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
- lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
- lib/File/Spec/Win32.pm
-
- ------ TESTS ------
-
- Title: "fixup test for method call on undefined value"
- Files: t/op/misc.t
-
- ------ UTILITIES ------
-
- Title: "perlbug upgrade (from 5.004_70)"
- Files: utils/perlbug.PL
-
- Title: "Upgrade perldoc (from 5.004_70)"
- Files: utils/perldoc.PL
- Branch: maint-5.004/perl
- + lib/File/Spec.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
- + lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
- + lib/File/Spec/Win32.pm lib/Test.pm
- ! MANIFEST ext/Socket/Socket.pm lib/AutoSplit.pm lib/base.pm
- ! t/op/misc.t utils/perlbug.PL utils/perldoc.PL
-____________________________________________________________________________
-[ 1355] By: TimBunce on 1998/07/07 14:39:51
- Log: Title: "Fix memory leak in Safe module"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199806290544.BAA18463@aatma.engin.umich.edu>
- Files: ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
- Branch: maint-5.004/perl
- ! ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
-____________________________________________________________________________
-[ 1354] By: TimBunce on 1998/07/07 14:35:25
- Log: Title: "Better error message for $undef->method call"
- From: Tim Bunce <Tim.Bunce@ig.co.uk>, Graham Barr <gbarr@ti.com>,
- joshua.pritikin@db.com
- Msg-ID: <19980615171027.U4120@asic.sc.ti.com>, <H00000e500073a20@MHS>
- Files: pod/perldiag.pod pp_hot.c
- Branch: maint-5.004/perl
- ! pod/perldiag.pod pp_hot.c
+[ 4849] By: gsar on 2000/01/23 08:17:30
+ Log: fix localization in while BLOCK when there is a continue BLOCK
+ by introducing an explicit scope (c.f. change#4848)
+ Branch: perl
+ ! op.c pp_ctl.c t/cmd/while.t
____________________________________________________________________________
-[ 1353] By: gsar on 1998/07/06 23:33:38
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Mon, 6 Jul 1998 16:59:06 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980706165659.21068B-100000@newton.phys>
- Subject: [PATCH 5.004_70] Update metaconfig info
+[ 4848] By: gsar on 2000/01/23 06:43:51
+ Log: fix scope cleanup when next jumps to a continue block; this is rather
+ in the nature of a kludge; it doesn't fix the longstanding bug that
+ makes C<while (!$x++) { local $x = 7 } continue { print $x }> print "7"
+ instead of "1")
Branch: perl
- ! Porting/pumpkin.pod
+ ! pp_ctl.c t/cmd/while.t
____________________________________________________________________________
-[ 1352] By: gsar on 1998/07/06 23:30:54
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Mon, 6 Jul 1998 13:14:37 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980706130959.20719A-100000@newton.phys>
- Subject: [PATCH 5.004_70] Config_70-01: Remove default "/share"
+[ 4847] By: gsar on 2000/01/23 04:47:25
+ Log: don't warn about masked lexical in C<if (my $x = 1) { my $x; }>,
+ C<while (my $x = foo()) { my $x = bar(); }> etc.
Branch: perl
- ! Configure INSTALL Policy_sh.SH Porting/Glossary
- ! Porting/config.sh Porting/config_H
+ ! op.c
____________________________________________________________________________
-[ 1351] By: gsar on 1998/07/06 23:24:47
- Log: try harder to run non-executable tests
+[ 4846] By: gsar on 2000/01/23 04:44:17
+ Log: avoid warnings in change#4839
Branch: perl
- ! t/TEST
+ ! lib/Carp/Heavy.pm
____________________________________________________________________________
-[ 1350] By: gsar on 1998/07/06 23:12:17
- Log: add patch to improve method caching, regen headers
- From: joshua.pritikin@db.com
- Date: Mon, 6 Jul 1998 09:19:29 -0400
- Message-Id: <H00000e50008a518@MHS>
- Subject: [PATCH _70] cache missing methods
+[ 4845] By: gsar on 2000/01/22 13:12:38
+ Log: Configure typos (from Ray Phillips <r.phillips@mailbox.uq.edu.au>)
Branch: perl
- ! embedvar.h gv.c interp.sym intrpvar.h perlvars.h
+ ! Changes Configure
____________________________________________________________________________
-[ 1349] By: TimBunce on 1998/07/06 23:03:16
- Log: Assorted patches:
-
- ------ BUILD PROCESS ------
-
- Title: "Configure: Workaround bash CDPATH oddity"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980608121159.13706C-100000@newton.phys>
- Files: Configure
-
- Title: "Don't suppress display of Makefile recipes that invoke perl"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199806252213.SAA08545@aatma.engin.umich.edu>
- Files: Makefile.SH
-
- ------ CORE LANGUAGE ------
-
- Title: "one more^Wless quad unpack bug"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199806301132.OAA27353@alpha.hut.fi>
- Files: pp.c
-
- Title: "minor fixups to bring maint closer to devel for patching"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805200046.UAA19284@aatma.engin.umich.edu>
- Files: pod/perldiag.pod deb.c dump.c t/op/ref.t t/op/split.t taint.c util.c
-
- Title: "-Pw switches used together report bogus error"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199806252331.TAA10160@aatma.engin.umich.edu>
- Files: perl.c
-
- Title: "Add doc and perl home page info to -v output"
- From: Tom Christiansen <tchrist@jhereg.perl.com>
- Msg-ID: <199802172229.PAA29309@jhereg.perl.com>
- Files: perl.c
-
- Title: "Fix C<@a = (%a = 1)> bizarreness"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>, Tom Christiansen
- <tchrist@jhereg.perl.com>
- Msg-ID: <199807012026.OAA31507@jhereg.perl.com>,
- <199807012339.TAA26024@aatma.engin.umich.edu>
- Files: pp_hot.c
-
- Title: "make find_script() return saved string, reenable missing
- diagnostics"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199806262224.SAA00422@aatma.engin.umich.edu>
- Files: perl.c util.c
-
- Title: "minor e_script optimization"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807060704.DAA25988@aatma.engin.umich.edu>
- Files: perl.c
-
- ------ DOCUMENTATION ------
-
- Title: "Insecure $ENV{} message out of step with perldiag"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0yooQA-0003za-00@taurus.cus.cam.ac.uk>
- Files: pod/perldiag.pod pod/perlsec.pod
-
- Title: "documenting close without arguments"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980623084413.24075V-100000@user2.teleport.com>
- Files: pod/perlfunc.pod
-
- Title: "pod for scalar .. op"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0yqyN8-0006gv-00@taurus.cus.cam.ac.uk>
- Files: pod/perlop.pod
-
- ------ EXTENSIONS ------
-
- Title: "Fcntl: add few constants, enhance maintainability"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199806221558.SAA18626@alpha.hut.fi>
- Files: ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
-
- ------ LIBRARY ------
-
- Title: "Fix undef warnings in Text::Parsewords"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199806300842.LAA26409@alpha.hut.fi>
- Files: lib/Text/ParseWords.pm
-
- Title: "Add Symbol::delete_package()"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807060702.DAA25976@aatma.engin.umich.edu>
- Files: pod/perlembed.pod lib/Symbol.pm
- Branch: maint-5.004/perl
- ! Configure Makefile.SH deb.c dump.c ext/Fcntl/Fcntl.pm
- ! ext/Fcntl/Fcntl.xs lib/Symbol.pm lib/Text/ParseWords.pm perl.c
- ! pod/perldiag.pod pod/perlembed.pod pod/perlfunc.pod
- ! pod/perlop.pod pod/perlsec.pod pp.c pp_hot.c t/op/ref.t
- ! t/op/split.t taint.c util.c
+[ 4844] By: gsar on 2000/01/22 12:46:26
+ Log: wrong category for exec() warning
+ Branch: perl
+ ! op.c pod/perlop.pod
____________________________________________________________________________
-[ 1348] By: gsar on 1998/07/06 22:55:56
- Log: remove #! line from Errno_pm.PL
+[ 4843] By: gsar on 2000/01/22 12:42:40
+ Log: fix line continuations in argument lists (from Helmut Jarausch)
Branch: perl
- ! ext/Errno/Errno_pm.PL
+ ! lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 1347] By: gsar on 1998/07/06 22:51:34
- Log: added patch to fix Cwd.pm warnings, fixed a couple more places
- From: Gisle Aas <gisle@aas.no>
- Date: 06 Jul 1998 13:08:53 +0200
- Message-ID: <m3af6nfd8a.fsf@furu.g.aas.no>
- Subject: [PATCH] 5.004_70 Cwd.pm now give warnings
+[ 4842] By: gsar on 2000/01/22 12:34:39
+ Log: CGI.pm upgraded to v2.56 from CPAN
Branch: perl
- ! lib/Cwd.pm
+ ! eg/cgi/index.html lib/CGI.pm lib/CGI/Apache.pm
+ ! lib/CGI/Cookie.pm lib/CGI/Pretty.pm lib/CGI/Switch.pm
+ ! t/lib/cgi-html.t
____________________________________________________________________________
-[ 1346] By: gsar on 1998/07/06 22:20:29
- Log: much simpler fix to typecheck read/sysread/recv, as suggested by
- Stephen McCamant
+[ 4841] By: gsar on 2000/01/22 12:07:23
+ Log: avoid warnings due to lack of forward declarations
Branch: perl
- ! op.c
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 1345] By: gsar on 1998/07/06 21:58:52
- Log: undo ck_sysread() changes#1319,1337 in preparation for a much
- simpler fix
+[ 4840] By: gsar on 2000/01/22 12:04:30
+ Log: heavy cleanup of Pod::Html bug fixes (from Wolfgang Laun
+ <wolfgang.laun@alcatel.at>)
Branch: perl
- ! ObjXSub.h embed.h global.sym globals.c objpp.h op.c opcode.h
- ! opcode.pl proto.h
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 1344] By: TimBunce on 1998/07/06 21:51:05
- Log: Title: "Fix for broken goto &xsub"
- From: Albert Dvornik <bert@genscan.com>,
- Msg-ID: <tq4sxawf2h.fsf@puma.genscan.com>
- Files: MANIFEST pp_ctl.c t/op/goto_xs.t
- Branch: maint-5.004/perl
- + t/op/goto_xs.t
- ! MANIFEST pp_ctl.c
-____________________________________________________________________________
-[ 1343] By: TimBunce on 1998/07/06 21:40:14
- Log: Title: "Undo sub stub optimization and add comments on GV_FOO constants"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199807050841.EAA25114@aatma.engin.umich.edu>
- Files: gv.h gv.c op.c toke.c
- Branch: maint-5.004/perl
- ! gv.c gv.h op.c toke.c
+[ 4839] By: gsar on 2000/01/22 11:57:24
+ Log: better Carp reporting within subclassed modules (from Wolfgang Laun
+ <wolfgang.laun@alcatel.at>)
+ Branch: perl
+ ! lib/Carp/Heavy.pm pod/perldelta.pod
____________________________________________________________________________
-[ 1342] By: gsar on 1998/07/06 20:57:06
- Log: From: Gisle Aas <gisle@aas.no>
- Message-Id: <m3zpem4v0z.fsf@furu.g.aas.no>
- Date: 06 Jul 1998 21:52:12 +0200
- Subject: Keepers of the Patch Pumpkin
+[ 4838] By: gsar on 2000/01/22 10:53:06
+ Log: truncate(FH) flushes FH before truncating it
Branch: perl
- ! Changes
+ ! pp_sys.c t/io/fs.t
____________________________________________________________________________
-[ 1341] By: gsar on 1998/07/06 20:43:35
- Log: remove dup entry in perldiag
+[ 4837] By: gsar on 2000/01/22 10:37:16
+ Log: #line directives without a filename leave the file name as it was
+ instead of setting it to the script name (from Andrew Pimlott
+ <andrew@pimlott.ne.mediaone.net>)
Branch: perl
- ! pod/perldiag.pod
+ ! toke.c
____________________________________________________________________________
-[ 1340] By: gsar on 1998/07/06 20:31:44
- Log: more reasonable diagnostic on keyword vs. sub ambiguity
+[ 4836] By: gsar on 2000/01/22 10:06:53
+ Log: add patch for printf-style format typechecks (from Robin Barker
+ <rmb1@cise.npl.co.uk>); fixes for problems so identified
Branch: perl
- ! pod/perldiag.pod toke.c
+ ! XSUB.h doio.c dump.c embed.pl gv.c op.c perl.c perl.h pp_ctl.c
+ ! pp_hot.c pp_sys.c proto.h regcomp.c sv.c toke.c
____________________________________________________________________________
-[ 1339] By: gsar on 1998/07/06 19:23:06
- Log: rename s/\bSI_/PERLSI_/ to avoid collisions with sysinfo headers
+[ 4835] By: gsar on 2000/01/22 08:42:52
+ Log: From: John Tobey <jtobey@isay.com>
+ Date: Thu, 16 Dec 1999 20:20:38 -0500
+ Message-Id: <E11ym4U-0000c7-00@einstein.localnet>
+ Subject: [ID 19991216.006] [PATCH 5.005_63] Reloading modules that use 'fields'
Branch: perl
- ! av.c cop.h gv.c mg.c op.c perl.c pp_ctl.c pp_sys.c scope.c
- ! sv.c toke.c util.c
+ ! lib/base.pm lib/fields.pm t/lib/fields.t
____________________________________________________________________________
-[ 1338] By: gsar on 1998/07/06 18:45:35
- Log: per Larry suggestion, toss change#1327 and fix the documentation
- to match behavior instead
+[ 4834] By: gsar on 2000/01/22 08:08:08
+ Log: fix deeply nested closures that have no references to lexical in
+ intervening subs
Branch: perl
- ! pod/perlfunc.pod pp_sys.c
+ ! embed.h embed.pl op.c proto.h t/op/closure.t
____________________________________________________________________________
-[ 1337] By: gsar on 1998/07/06 17:15:26
- Log: allow read(FH,threadsv,...)
+[ 4833] By: gsar on 2000/01/21 17:04:21
+ Log: add $VERSION
Branch: perl
- ! op.c
-
-----------------
-Version 5.004_70
-----------------
-
+ ! lib/Text/Soundex.pm lib/Tie/Handle.pm
____________________________________________________________________________
-[ 1336] By: gsar on 1998/07/06 09:06:33
- Log: 5.004_70 tweaks
+[ 4832] By: gsar on 2000/01/21 16:49:09
+ Log: fix bug in dumping self-referential scalars
Branch: perl
- ! Changes win32/Makefile win32/makefile.mk
+ ! ext/Data/Dumper/Dumper.pm ext/Data/Dumper/Dumper.xs
+ ! t/lib/dumper.t
____________________________________________________________________________
-[ 1335] By: gsar on 1998/07/06 07:05:37
- Log: update Changes
+[ 4831] By: jhi on 2000/01/21 09:16:07
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/op/exists_sub.t
+ !> INSTALL MANIFEST embed.h embed.pl global.sym objXSUB.h op.c
+ !> op.h perlapi.c pod/perldelta.pod pod/perldiag.pod
+ !> pod/perlfunc.pod pod/perlop.pod pod/perlvar.pod pp.c pp_hot.c
+ !> pp_sys.c proto.h sv.c sv.h t/pragma/warn/pp_hot
+ !> t/pragma/warn/pp_sys util.c utils/h2xs.PL
+____________________________________________________________________________
+[ 4830] By: gsar on 2000/01/21 04:28:08
+ Log: patch to report warnings on bogus filehandles passed to flock(),
+ more consistent warnings, from Greg Bacon <gbacon@itsc.uah.edu>
+ (slightly modified)
Branch: perl
- ! Changes pod/perldiag.pod
+ ! embed.h embed.pl global.sym objXSUB.h perlapi.c
+ ! pod/perldiag.pod pp_hot.c pp_sys.c proto.h
+ ! t/pragma/warn/pp_hot t/pragma/warn/pp_sys util.c
____________________________________________________________________________
-[ 1334] By: gsar on 1998/07/06 06:41:17
- Log: allow eval-groups in patterns only if they C<use re 'eval';>
+[ 4829] By: gsar on 2000/01/21 03:43:46
+ Log: typo fix
Branch: perl
- ! lib/re.pm perl.h pod/perldiag.pod pod/perlre.pod regcomp.c
- ! t/op/misc.t t/op/pat.t t/op/regexp.t t/op/subst.t
+ ! pod/perlop.pod
____________________________________________________________________________
-[ 1333] By: gsar on 1998/07/06 03:22:52
- Log: From: Hans Mulder <hansm@icgroup.nl>
- Date: Mon, 6 Jul 98 02:11:32 +0200
- Message-Id: <9807060021.AA29027@icgned.icgroup.nl>
- Subject: [PATCH 5.00469] corrupt malloc ptr on NeXT
+[ 4828] By: gsar on 2000/01/21 03:32:31
+ Log: notes about $^H and %^H from Ilya Zakharevich; substantial
+ fixups of faulty facts and prose
Branch: perl
- ! malloc.c
+ ! pod/perlvar.pod
____________________________________________________________________________
-[ 1332] By: gsar on 1998/07/06 03:18:34
- Log: added Errno-1.09 from CPAN
+[ 4827] By: gsar on 2000/01/21 01:45:51
+ Log: support for C<exists &func> (from Spider Boardman)
Branch: perl
- ! ext/Errno/ChangeLog ext/Errno/Errno_pm.PL
+ + t/op/exists_sub.t
+ ! MANIFEST op.c op.h pod/perldelta.pod pod/perldiag.pod
+ ! pod/perlfunc.pod pp.c
____________________________________________________________________________
-[ 1331] By: gsar on 1998/07/06 02:59:09
- Log: fix small memleak on -e, don't try to find_script() when e_script
+[ 4826] By: gsar on 2000/01/21 01:35:46
+ Log: mention the fact that open(my $foo, ...) covers all handle
+ constructors
Branch: perl
- ! perl.c
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 1330] By: gsar on 1998/07/06 00:40:24
- Log: add Symbol::delete_package()
+[ 4825] By: gsar on 2000/01/21 01:03:34
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 19 Jan 2000 15:05:11 -0500
+ Message-ID: <20000119150511.A22859@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_63] h2xs goof and a depessimization
Branch: perl
- ! lib/Symbol.pm pod/perlembed.pod
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 1329] By: gsar on 1998/07/05 23:05:40
- Log: patch to remove assumptions about offset of IV being == sizeof(XPV)
- From: Stephen McCamant <alias@mcs.com>
- Date: Sun, 5 Jul 1998 17:36:14 -0500 (CDT)
- Message-ID: <13727.63831.95324.696098@alias-2.pr.mcs.net>
- Subject: [PATCH] alignment in X[IN]V allocation
+[ 4824] By: gsar on 2000/01/20 19:14:26
+ Log: INSTALL updates from Andy Dougherty
Branch: perl
- ! sv.c
+ ! INSTALL
____________________________________________________________________________
-[ 1328] By: gsar on 1998/07/05 22:47:57
- Log: make read() return undef on errors as documented, and clarify docs
+[ 4823] By: gsar on 2000/01/20 08:40:13
+ Log: sv_true() has a superfluous test
Branch: perl
- ! pod/perlfunc.pod pp_sys.c
+ ! sv.c sv.h
+____________________________________________________________________________
+[ 4822] By: bailey on 2000/01/20 02:03:35
+ Log: Minor cosmetic updates
+ Branch: vmsperl
+ ! configure.com
+____________________________________________________________________________
+[ 4821] By: bailey on 2000/01/20 00:25:30
+ Log: Quick integration of mainline changes to date
+ Branch: vmsperl
+ +> (branch 74 files)
+ - eg/cgi/dna.small.gif.uu eg/cgi/wilogo.gif.uu epoc/config.h
+ - epoc/perl.mmp epoc/perl.pkg ext/DynaLoader/dl_cygwin.xs
+ - lib/Pod/PlainText.pm lib/unicode/Eq/Latin1
+ - lib/unicode/Eq/Unicode lib/unicode/Jamo-2.txt
+ - lib/unicode/Unicode.html lib/unicode/UnicodeData-Latest.txt
+ - lib/warning.pm os2/POSIX.mkfifo warning.h
+ !> (integrate 462 files)
+____________________________________________________________________________
+[ 4820] By: jhi on 2000/01/19 22:46:42
+ Log: More robust inc_version_list from Andy.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+ Branch: metaconfig
+ ! U/installdirs/inc_version_list.U
+____________________________________________________________________________
+[ 4819] By: jhi on 2000/01/19 17:36:56
+ Log: Add NV_PRESERVES_UV.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h
+ Branch: metaconfig
+ ! U/protos/selecttype.U
+ Branch: metaconfig/U/perl
+ - nvpresuv.U
+ ! perlxv.U
+____________________________________________________________________________
+[ 4818] By: jhi on 2000/01/19 08:13:05
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes Configure win32/config.bc win32/config.gc
+ !> win32/config.vc win32/config_H.bc win32/config_H.gc
+ !> win32/config_H.vc
____________________________________________________________________________
-[ 1327] By: gsar on 1998/07/05 22:11:21
- Log: fix getc() to return empty string instead of undef on eof, as it was
- documented to behave; still returns undef on error
+[ 4817] By: gsar on 2000/01/19 05:25:43
+ Log: regen win32/config*
Branch: perl
- ! pp_sys.c
+ ! Configure win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
____________________________________________________________________________
-[ 1326] By: gsar on 1998/07/05 21:53:30
- Log: patch whitespace-mutiliated; applied manually
- From: Hans Mulder <hansm@icgroup.nl>
- Date: Sun, 5 Jul 98 23:23:20 +0200
- Message-Id: <9807052133.AA28626@icgned.icgroup.nl>
- Subject: [PATCH 5.004_69] building Errno.pm still fails on NeXT
+[ 4816] By: jhi on 2000/01/18 21:19:10
+ Log: Policy patch from Andy for installation directories,
+ removing the $apiversion.
+ Branch: cfgperl
+ ! Policy_sh.SH
+____________________________________________________________________________
+[ 4815] By: jhi on 2000/01/18 21:11:03
+ Log: Move _GNU_SOURCE into config_h.SH awaay from Configure
+ as suggested by Andy.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/compline/d_gnulibc.U U/modified/cc.U
+____________________________________________________________________________
+[ 4814] By: gsar on 2000/01/18 20:48:10
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! ext/Errno/Errno_pm.PL
+ ! Changes
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> Porting/pumpkin.pod config_h.SH doop.c patchlevel.h perl.c
+ !> perl.h t/lib/posix.t t/op/pack.t utf8.c
____________________________________________________________________________
-[ 1325] By: gsar on 1998/07/05 21:38:39
- Log: applied patch (via private mail), modulo retrohunks in pod/perlfaq2.pod
- From: Tom Christiansen <tchrist@jhereg.perl.com>
- Date: Sun, 05 Jul 1998 09:15:22 -0500
- Subject: Re: docpatch
- Message-Id: <199807051515.JAA03644@jhereg.perl.com>
+[ 4813] By: jhi on 2000/01/18 19:41:33
+ Log: metaconfig todo note from Andy.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/installdirs/inc_version_list.U
+____________________________________________________________________________
+[ 4812] By: jhi on 2000/01/18 15:02:55
+ Log: More -V.
+ Branch: cfgperl
+ ! perl.c
+____________________________________________________________________________
+[ 4811] By: jhi on 2000/01/18 10:35:30
+ Log: More compile-time options shown with -V.
+ Branch: cfgperl
+ ! perl.c
+____________________________________________________________________________
+[ 4810] By: jhi on 2000/01/17 08:35:49
+ Log: Add -D_GNU_SOURCE into ccflags for gcc (for now to expose
+ the strtold() and qgcvt() prototypes for long doubles, but
+ it should be okay in any case); fix bad assumptions in the
+ test suite about string->float conversions; though the out
+ parameter of strtold() (and strtoll()) is unused, it is nicer
+ to have it in correct type.
+ Branch: cfgperl
+ ! Configure config_h.SH perl.h t/lib/posix.t t/op/pack.t
+ Branch: metaconfig
+ ! U/modified/cc.U
+____________________________________________________________________________
+[ 4809] By: jhi on 2000/01/16 19:21:18
+ Log: strtoll works better ternary.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4808] By: jhi on 2000/01/16 19:12:58
+ Log: Know strtoll.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h
+____________________________________________________________________________
+[ 4807] By: jhi on 2000/01/16 17:57:03
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> dump.c gv.c gv.h lib/vars.pm op.c op.h perl.h pod/perlfunc.pod
+ !> sv.c sv.h t/pragma/strict-vars toke.c util.c
+____________________________________________________________________________
+[ 4806] By: jhi on 2000/01/16 16:37:47
+ Log: Continue qgcvt work; closer now but not yet there.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH doop.c utf8.c
+ Branch: metaconfig
+ ! U/compline/d_gconvert.U
+ Branch: metaconfig/U/perl
+ ! d_qgcvt.U
+____________________________________________________________________________
+[ 4805] By: jhi on 2000/01/15 22:26:16
+ Log: Metaconfig and Porting patches from Andy; start using the new
+ long long and long double thingies from #4804; regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! Porting/pumpkin.pod config_h.SH patchlevel.h perl.h util.c
+ Branch: metaconfig
+ + U/dist_patches/dist-p70a U/dist_patches/dist-p70b
+ + U/dist_patches/dist-p70c U/installdirs/inc_version_list.U
+ + U/modified/myhostname.U U/modified/nis.U U/nullified/fpu.U
+ + U/nullified/lib.U
+ ! U/README U/compline/d_gconvert.U U/installdirs/sitearch.U
+ ! U/installdirs/sitelib.U U/installdirs/vendorarch.U
+ ! U/installdirs/vendorlib.U U/modified/Cppsym.U U/modified/Loc.U
+ ! U/modified/Oldconfig.U U/modified/Signal.U
+ ! U/modified/sig_name.U U/threads/usethreads.U
+ Branch: metaconfig/U/perl
+ ! d_qgcvt.U d_strtold.U d_strtoll.U d_strtoq.U d_strtoull.U
+ ! d_strtouq.U dlsrc.U i_db.U libperl.U patchlevel.U
+ ! usemultiplicity.U
Branch: perl
- ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
- ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
- ! pod/perlfaq9.pod pod/perlfunc.pod pod/perlipc.pod
- ! pod/perlrun.pod
+ ! perl.h util.c
+____________________________________________________________________________
+[ 4804] By: jhi on 2000/01/14 14:22:24
+ Log: Add more quad/long long/long double sciency.
+ Branch: metaconfig/U/perl
+ + d_qgcvt.U d_strtold.U d_strtoll.U d_strtoq.U d_strtoull.U
+ + d_strtouq.U
____________________________________________________________________________
-[ 1324] By: gsar on 1998/07/05 21:06:56
- Log: applied patch, and undid change#1302 which it made unnecessary
- From: Billy <wdconsta@cs.adelaide.edu.au>
- Date: Sun, 5 Jul 1998 23:05:52 +0930 (CST)
- Subject: [PATCH] utils/h2ph.PL and t/lib/h2ph.t
- Message-ID: <Pine.SV4.3.93.980705230337.27658A-100000@xenon.teaching.cs.adelaide.edu.au>
+[ 4803] By: gsar on 2000/01/14 04:40:49
+ Log: minor optimization (avoid double sv_upgrade() for "our Foo $bar;")
Branch: perl
- ! t/lib/h2ph.t utils/h2ph.PL
+ ! op.c
____________________________________________________________________________
-[ 1323] By: gsar on 1998/07/05 20:56:39
- Log: fix t/lib/fields.t's @INC so make test runs
+[ 4802] By: gsar on 2000/01/14 04:35:55
+ Log: add note about "our"
Branch: perl
- ! t/lib/fields.t
+ ! lib/vars.pm
____________________________________________________________________________
-[ 1322] By: gsar on 1998/07/05 20:26:43
- Log: add comments on GV_FOO constants, s/8/GV_ADDINEVAL/
+[ 4801] By: gsar on 2000/01/14 04:16:51
+ Log: nailed "our" declarations, and better warnings on duplicate
+ "our" declarations
Branch: perl
- ! gv.c gv.h toke.c
+ ! dump.c gv.c gv.h op.c pod/perlfunc.pod sv.c sv.h
+ ! t/pragma/strict-vars toke.c
____________________________________________________________________________
-[ 1321] By: gsar on 1998/07/05 07:41:50
- Log: sundry win32 config tweaks
+[ 4800] By: gsar on 2000/01/14 01:27:13
+ Log: avoid spurious "Useless use of variable" warning on C<our $foo;>
Branch: perl
- ! Todo.5.005 t/op/stat.t win32/Makefile win32/config.bc
- ! win32/config.gc win32/config.vc win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/config_h.PL
- ! win32/config_sh.PL win32/makefile.mk
+ ! dump.c op.c op.h
____________________________________________________________________________
-[ 1320] By: gsar on 1998/07/05 06:30:35
- Log: update Changes
+[ 4799] By: gsar on 2000/01/14 01:17:15
+ Log: doc typo
Branch: perl
- ! Changes
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1319] By: gsar on 1998/07/05 06:27:37
- Log: add ck_sysread() for better sysread/read/recv sanity
+[ 4798] By: jhi on 2000/01/13 16:31:34
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> epoc/config.sh epoc/epocish.c epoc/link.pl
+ +> ext/DynaLoader/XSLoader_pm.PL ext/DynaLoader/hints/openbsd.pl
+ +> ext/IPC/SysV/hints/cygwin.pl ext/NDBM_File/hints/cygwin.pl
+ +> ext/ODBM_File/hints/cygwin.pl lib/byte.pm lib/byte_heavy.pl
+ +> lib/unicode/Unicode.300 pod/perlfork.pod t/lib/glob-case.t
+ +> win32/perlhost.h win32/vdir.h win32/vmem.h
+ - epoc/Config.pm epoc/autosplit.pl epoc/config.h epoc/perl.mmp
+ - epoc/perl.pkg ext/DynaLoader/dl_cygwin.xs
+ - lib/unicode/UnicodeData-Latest.txt os2/POSIX.mkfifo
+ !> (integrate 282 files)
+____________________________________________________________________________
+[ 4797] By: gsar on 2000/01/13 08:12:56
+ Log: clearer docs for change#4796; faster av_exists()
Branch: perl
- ! ObjXSub.h embed.h global.sym globals.c objpp.h op.c opcode.h
- ! opcode.pl proto.h
+ ! av.c pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
____________________________________________________________________________
-[ 1318] By: gsar on 1998/07/05 04:34:05
- Log: From: Stephen McCamant <alias@mcs.com>
- Date: Sat, 4 Jul 1998 23:24:47 -0500 (CDT)
- Subject: [PATCH] Document B::Deparse, add pp_threadsv
- Message-ID: <13726.65230.19324.216849@alias-2.pr.mcs.net>
+[ 4796] By: gsar on 2000/01/13 06:49:03
+ Log: support delete() and exists() on array, tied array, and pseudo-hash
+ elements or slices
Branch: perl
- ! ext/B/B/Deparse.pm
+ ! av.c embed.h embed.pl global.sym lib/Tie/Array.pm
+ ! lib/Tie/Hash.pm objXSUB.h op.c perlapi.c pod/perldelta.pod
+ ! pod/perlfunc.pod pod/perlref.pod pod/perltie.pod pp.c proto.h
+ ! t/op/avhv.t t/op/delete.t
____________________________________________________________________________
-[ 1317] By: gsar on 1998/07/05 04:15:25
- Log: added patch with tweak to doc
- From: Chip Salzenberg <chip@perl.org>
- Message-ID: <19980704205136.A16319@perlsupport.com>
- Date: Sat, 4 Jul 1998 20:51:36 -0400
- Subject: [PATCH _69] Take 2: Warn on C<sub log; log($msg)>
+[ 4795] By: gsar on 2000/01/11 20:52:30
+ Log: extend site_perl changes change#4773 to vendor_perl as well
Branch: perl
- ! ext/IO/lib/IO/Handle.pm pod/perldiag.pod toke.c
+ ! Configure
____________________________________________________________________________
-[ 1316] By: gsar on 1998/07/05 03:56:22
- Log: Porting/Glossary goes podly into Config.pm
+[ 4794] By: gsar on 2000/01/11 19:18:50
+ Log: rework INSTALL to reflect new logic for versioning sitelibs
Branch: perl
- ! Porting/Glossary configpm
+ ! INSTALL
____________________________________________________________________________
-[ 1315] By: gsar on 1998/07/05 02:50:18
- Log: add suggested tool as an example in ExtUtils::Packlist
- From: Alan Burlison <Alan.Burlison@UK.Sun.com>
- Message-Id: <199807031028.LAA10456@sale-wts>
- Date: Fri, 3 Jul 1998 11:28:03 +0100 (BST)
- Subject: Re: [make install] another horror story
+[ 4793] By: gsar on 2000/01/11 01:44:00
+ Log: test for change#4792
Branch: perl
- ! lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
+ ! t/op/fork.t
____________________________________________________________________________
-[ 1314] By: gsar on 1998/07/05 02:28:04
- Log: avoid race condition (storing ptr to SV before incrementing its
- REFCNT) and warning in newRV()
+[ 4792] By: gsar on 2000/01/11 01:22:36
+ Log: pseudo forked children inherit environment correctly
Branch: perl
- ! sv.c
+ ! win32/perlhost.h
____________________________________________________________________________
-[ 1313] By: gsar on 1998/07/05 02:06:40
- Log: applied suggested fix for xhv_array sizing, with portability tweaks
- From: Gisle Aas <gisle@aas.no>
- Subject: Re: [PATCH] Re: perl5.004_69 core dump
- Date: 04 Jul 1998 10:20:35 +0200
- Message-ID: <m3af6qowmk.fsf@furu.g.aas.no>
+[ 4791] By: gsar on 2000/01/10 19:14:03
+ Log: test tweak
Branch: perl
- ! hv.c
+ ! t/op/fork.t
____________________________________________________________________________
-[ 1312] By: gsar on 1998/07/05 01:36:45
- Log: From: Gisle Aas <gisle@aas.no>
- Subject: [PATCH] hv_max may be a few too many
- Date: 04 Jul 1998 09:28:46 +0200
- Message-ID: <m3d8bmoz0x.fsf@furu.g.aas.no>
+[ 4790] By: gsar on 2000/01/10 18:56:16
+ Log: check for USE_ITHREADS sanity was too restrictive
Branch: perl
- ! doop.c
+ ! perl.h
____________________________________________________________________________
-[ 1311] By: gsar on 1998/07/05 00:35:27
- Log: patchlevel up to 5.004_70, various tweaks
- * fix taint problems due to maintbranch regression
- * PERL_OBJECT now builds again
- * deal with C++ strong-typing problems in hv.c
- * fix mismatch in "reserved word" diagnostic
+[ 4789] By: gsar on 2000/01/10 18:30:24
+ Log: add workaround for textmode read() bug in MSVCRT; make chdir() do
+ a real SetCurrentDirectory() in toplevel host
Branch: perl
- ! av.c hv.c objpp.h patchlevel.h pp_ctl.c pp_hot.c proto.h
- ! regexec.c regexp.h toke.c win32/perlhost.h win32/win32.c
+ ! README.win32 win32/Makefile win32/makefile.mk win32/perlhost.h
+ ! win32/vdir.h win32/win32.c
____________________________________________________________________________
-[ 1310] By: TimBunce on 1998/07/04 11:35:25
- Log: Remove old RE //t flag from scan_subst().
- Branch: maint-5.004/perl
- ! toke.c
+[ 4782] By: gsar on 2000/01/10 05:27:03
+ Log: EPOC port update (from Olaf Flebbe <O.Flebbe@science-computing.de>)
+ Branch: perl
+ + epoc/config.sh epoc/epocish.c epoc/link.pl
+ - epoc/Config.pm epoc/autosplit.pl epoc/config.h epoc/perl.mmp
+ - epoc/perl.pkg
+ ! MANIFEST README.epoc epoc/createpkg.pl epoc/epoc.c
+ ! epoc/epoc_stubs.c epoc/epocish.h ext/IO/lib/IO/Socket.pm
+ ! lib/Sys/Hostname.pm
____________________________________________________________________________
-[ 1309] By: gsar on 1998/07/04 08:32:53
- Log: various small tweaks (still fails a few taint tests in {taint,locale}.t)
+[ 4781] By: gsar on 2000/01/10 05:11:03
+ Log: pod typos (from Abigail <abigail@delanet.com>)
Branch: perl
- ! Todo.5.005 lib/re.pm sv.c t/lib/fields.t
+ ! pod/perl.pod pod/perllexwarn.pod pod/perlxstut.pod
____________________________________________________________________________
-[ 1307] By: gsar on 1998/07/04 07:00:14
- Log: fix C<local $tied{foo} = $tied{foo}>, add tests
+[ 4780] By: gsar on 2000/01/10 05:07:35
+ Log: failing RE test added (from Robert Cunningham <rkc@ll.mit.edu>)
Branch: perl
- ! pp_hot.c t/op/local.t
+ ! t/lib/thread.t
____________________________________________________________________________
-[ 1306] By: gsar on 1998/07/04 05:52:34
- Log: fixes for mortalization bug in xsubpp, other efficiency tweaks
- From: joshua.pritikin@db.com
- Date: Wed, 1 Jul 1998 10:09:43 -0400
- Message-Id: <H00000e500086fb3@MHS>
- Subject: [PATCH _69] sv_2mortal fix
+[ 4779] By: gsar on 2000/01/10 05:06:16
+ Log: terminate -s switch processing only on C<-->, not on C<--foo>
Branch: perl
- ! lib/ExtUtils/xsubpp perl.c pp.c pp_hot.c proto.h sv.c sv.h
+ ! perl.c
____________________________________________________________________________
-[ 1305] By: gsar on 1998/07/04 05:46:42
- Log: add patch preextend global string table, tweak for 512 entries
- From: Gisle Aas <gisle@aas.no>
- Date: 04 Jul 1998 01:04:08 +0200
- Subject: Re: [PATCH] Re: perl5.004_69 core dump
- Message-ID: <m3ra02v8nr.fsf@furu.g.aas.no>
+[ 4778] By: gsar on 2000/01/10 04:38:45
+ Log: useithreads needs usemultiplicity
Branch: perl
- ! perl.c
+ ! Configure perl.h
____________________________________________________________________________
-[ 1304] By: gsar on 1998/07/04 05:40:35
- Log: simplify xhv_array sizing
- From: Gisle Aas <gisle@aas.no>
- Date: 04 Jul 1998 00:49:42 +0200
- Subject: Re: [PATCH] Re: perl5.004_69 core dump
- Message-ID: <m3yauav9bt.fsf@furu.g.aas.no>
+[ 4777] By: gsar on 2000/01/10 01:18:04
+ Log: use $Config{version} rather than $] where appropriate
Branch: perl
- ! hv.c
+ ! lib/CPAN.pm lib/ExtUtils/Installed.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/Mksymlists.pm lib/Pod/Man.pm lib/diagnostics.pm
+ ! lib/lib.pm
____________________________________________________________________________
-[ 1303] By: gsar on 1998/07/04 05:37:29
- Log: make 4-arg win32_select() sleep more reasonably on false values
- From: Blair Zajac <blair@gps.caltech.edu>
- Message-Id: <199807020225.TAA18740@gobi.gps.caltech.edu>
- Date: Wed, 1 Jul 1998 19:25:56 -0700 (PDT)
- Subject: [PATCH 5.004_69] select dumps core on MSWin32-x86
- --
- Message-Id: <199807030107.SAA08595@gobi.gps.caltech.edu>
- Date: Thu, 2 Jul 1998 18:07:19 -0700 (PDT)
- Subject: [PATCH 5.004_69] select dumps core on MSWin32-x86
+[ 4776] By: gsar on 2000/01/10 00:11:34
+ Log: enable fork.t on windows
Branch: perl
- ! win32/win32sck.c
+ ! t/op/fork.t
____________________________________________________________________________
-[ 1302] By: gsar on 1998/07/04 05:32:50
- Log: adjust h2ph.t for dos-specific problem
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Message-ID: <19980703234525.C208@cdata.tvnet.hu>
- Date: Fri, 3 Jul 1998 23:45:25 +0200
- Subject: Re: [PATCH _68] t/lib/h2ph.t problem
+[ 4775] By: gsar on 2000/01/10 00:07:29
+ Log: broken test for use5005threads
Branch: perl
- ! t/lib/h2ph.t
+ ! t/lib/safe2.t
____________________________________________________________________________
-[ 1301] By: gsar on 1998/07/04 05:31:04
- Log: fix CPAN.pm problem, OS2 tweaks
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199807030459.AAA00097@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_68] PAtch to CPAN first-time
- Date: Fri, 3 Jul 1998 00:59:35 -0400 (EDT)
+[ 4774] By: gsar on 2000/01/09 23:56:37
+ Log: more windows build tweaks
Branch: perl
- ! lib/CPAN/FirstTime.pm lib/ExtUtils/MM_OS2.pm
- ! lib/ExtUtils/MakeMaker.pm
+ ! installperl makedef.pl win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/config_sh.PL
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 1300] By: gsar on 1998/07/04 05:27:20
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199807030102.VAA26813@monk.mps.ohio-state.edu>
- Date: Thu, 2 Jul 1998 21:02:59 -0400 (EDT)
- Subject: [PATCH 5.004_68] Add elc target to to makefile
+[ 4773] By: gsar on 2000/01/09 22:27:19
+ Log: more changes for new-style version numbers (versions numbers on
+ the filesystem look like 5.5.640, except on DOS-DJGPP and VMS where
+ they look like 5_5_640; delete @Config{pm_apiversion,xs_apiversion};
+ split $Config{apiversion} into three, @Config{apirevision,apiversion,
+ apisubversion} for CPP friendliness; $Config{sitelib} now defaults
+ to .../site_perl/$version, just like $Config{privlib}, making sitelib
+ completely independent across versions and substantially eliminating
+ chances of breaking older installations by overwriting newly built
+ extensions; all this means compatibility inclusions for @INC will need
+ to take into account older sitelib versions (this still TODO)
+
+ windows, vms, dos tweaks for the above
Branch: perl
- ! Makefile.SH
+ ! Changes Configure INSTALL Porting/config.sh Porting/config_H
+ ! config_h.SH configure.com dosish.h installman installperl
+ ! patchlevel.h perl.c perl.h vms/vmsish.h win32/Makefile
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/config_h.PL win32/config_sh.PL win32/makefile.mk
+ ! win32/win32.c
____________________________________________________________________________
-[ 1299] By: gsar on 1998/07/04 05:25:56
- Log: newer emacs/cperl-mode.el (via private mail)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199807030104.VAA26825@monk.mps.ohio-state.edu>
- Date: Thu, 2 Jul 1998 21:04:29 -0400 (EDT)
- Subject: [PATCH 5.004_68] cperl-mode
+[ 4772] By: gsar on 2000/01/09 19:05:33
+ Log: s/usethreads/use5005threads/g
Branch: perl
- ! emacs/cperl-mode.el
+ ! myconfig.SH t/lib/english.t t/lib/thread.t t/op/nothread.t
____________________________________________________________________________
-[ 1298] By: gsar on 1998/07/04 05:22:41
- Log: From: Dominic Dunlop <domo@computer.org>
- Message-Id: <v03110701b1c1603eae52@[195.95.102.68]>
- Date: Thu, 2 Jul 1998 22:57:26 +0000
- Subject: [PATCH 5.004_69] Make Power MachTen use vfork and perl's malloc
+[ 4771] By: gsar on 2000/01/09 18:51:50
+ Log: Configure changes for new-style version numbers (from Andy Dougherty,
+ slightly altered)
Branch: perl
- ! hints/machten.sh malloc.c
+ ! Configure INSTALL Porting/Glossary Porting/config.sh
+ ! Porting/config_H config_h.SH perl.h win32/Makefile
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 1297] By: gsar on 1998/07/04 05:20:52
- Log: allow a flags args to fbm_instr() for future needs
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199807020749.DAA12379@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_68] mORE FBM_ CHANGES FOR FUTURE
- Date: Thu, 2 Jul 1998 03:49:32 -0400 (EDT)
+[ 4770] By: gsar on 2000/01/07 22:18:54
+ Log: fix for 'make utest' failures (from Ilya Zakharevich)
Branch: perl
- ! pod/perlguts.pod pp.c pp_hot.c proto.h regexec.c util.c
+ ! regexec.c
____________________________________________________________________________
-[ 1296] By: gsar on 1998/07/04 05:16:15
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Thu, 2 Jul 1998 11:50:41 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980702114956.18246B-100000@newton.phys>
- Subject: [PATCH 5.004_69] INSTALL-1.39
+[ 4769] By: gsar on 2000/01/07 18:23:16
+ Log: cygwin update (from Eric Fifer <EFifer@sanwaint.com>)
Branch: perl
- ! INSTALL
+ + ext/IPC/SysV/hints/cygwin.pl ext/NDBM_File/hints/cygwin.pl
+ + ext/ODBM_File/hints/cygwin.pl
+ ! Configure INSTALL MANIFEST ext/POSIX/Makefile.PL
+ ! hints/cygwin.sh installman installperl lib/Cwd.pm
+ ! lib/ExtUtils/MakeMaker.pm lib/File/Spec/Unix.pm lib/perl5db.pl
+ ! perlsdio.h t/op/magic.t t/op/stat.t utils/perlcc.PL
____________________________________________________________________________
-[ 1295] By: gsar on 1998/07/04 05:15:05
- Log: Configure update
- From: doughera@newton.phys.lafayette.edu (Andy Dougherty)
- Date: Wed, 1 Jul 98 23:07:50 EDT
- Message-Id: <9807020307.AA17848@newton.phys.lafayette.edu>
- Subject: [PATCH 5.004_69] Config_69-01
- Branch: perl
- ! Configure INSTALL MANIFEST Policy_sh.SH Porting/Glossary
- ! Porting/config.sh Porting/config_H Porting/pumpkin.pod
- ! config_h.SH win32/config.bc win32/config.gc win32/config.vc
-____________________________________________________________________________
-[ 1294] By: gsar on 1998/07/04 05:10:25
- Log: add perlbug -F switch to save message to file
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Message-Id: <l03130301b1c03a649e45@[194.222.64.89]>
- Date: Wed, 1 Jul 1998 21:14:22 +0200
- Subject: Re: [PATCH 5.004_69] perlbug -fok
- Branch: perl
- ! Makefile.SH utils/perlbug.PL
-____________________________________________________________________________
-[ 1293] By: gsar on 1998/07/04 05:06:52
- Log: catch nonexistent backrefs in REs
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Message-Id: <l03130304b1c027e1df9e@[194.222.64.89]>
- Date: Wed, 1 Jul 1998 20:14:05 +0200
- Subject: Re: [PATCH _66] for bad backrefs
- --
- Message-Id: <l03130300b1c03425261c@[194.222.64.89]>
- Date: Wed, 1 Jul 1998 20:47:16 +0200
- Subject: Re: [PATCH _66] for bad backrefs
+[ 4768] By: gsar on 2000/01/07 18:12:15
+ Log: typo on h2xs.PL (from Helmut Jarausch)
Branch: perl
- ! regcomp.c t/op/re_tests util.c
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 1292] By: gsar on 1998/07/04 05:02:01
- Log: fix perlcc to not rm output file, and other -w(arts)
+[ 4767] By: gsar on 2000/01/07 17:58:45
+ Log: VMS update (from Peter Prymmer <pvhp@forte.com>)
Branch: perl
- ! utils/perlcc.PL
+ ! README.vms configure.com vms/subconfigure.com
____________________________________________________________________________
-[ 1291] By: gsar on 1998/07/04 04:30:03
- Log: ignore stash entries that are not GVs in dump.c
+[ 4766] By: gsar on 2000/01/07 17:54:05
+ Log: os2/POSIX.mkfifo not needed (from Yitzchak Scott-Thoennes
+ <sthoenna@efn.org>)
Branch: perl
- ! dump.c
+ - os2/POSIX.mkfifo
+ ! MANIFEST README.os2
____________________________________________________________________________
-[ 1290] By: gsar on 1998/07/04 03:55:10
- Log: cleaner page headers from pod2man
+[ 4765] By: gsar on 2000/01/06 20:11:46
+ Log: add workaround for dlopen() bug on OpenBSD (relative paths that
+ match /^lib/ won't load properly)
Branch: perl
- ! pod/pod2man.PL
+ + ext/DynaLoader/hints/openbsd.pl
+ ! Changes MANIFEST ext/DynaLoader/dl_dlopen.xs
____________________________________________________________________________
-[ 1288] By: gsar on 1998/07/04 03:16:39
- Log: tweaks to Getopt::Std
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Date: Tue, 30 Jun 98 14:45:49 BST
- Message-Id: <14103.9806301345@tempest.cise.npl.co.uk>
- Subject: [PATCH perl5.004_69] lib/Getopt/Std.pm
- --
- Message-Id: <17918.9807021053@tempest.cise.npl.co.uk>
- To: perl5-porters@perl.org
- Subject: [PATCH perl5.004_69] second: lib/Getopt/Std.pm
+[ 4764] By: gsar on 2000/01/06 19:51:08
+ Log: add undocumented globals for compatibility--find.pl, and find2perl
+ generated code need them (from Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
Branch: perl
- ! lib/Getopt/Std.pm
+ ! lib/File/Find.pm
____________________________________________________________________________
-[ 1287] By: gsar on 1998/07/04 03:13:02
- Log: added patch, with tweaks
- From: Gisle Aas <gisle@aas.no>
- Date: 03 Jul 1998 00:50:15 +0200
- Message-ID: <m3btr7n9zs.fsf@furu.g.aas.no>
- Subject: [PATCH] Some AVHV documentation
+[ 4763] By: gsar on 2000/01/06 10:51:07
+ Log: fix various C-backend shenanigans
Branch: perl
- ! pod/perlref.pod
+ ! ext/B/B/C.pm
____________________________________________________________________________
-[ 1286] By: gsar on 1998/07/04 02:53:26
- Log: applied patch with tweaks to prose
- From: Gisle Aas <gisle@aas.no>
- Subject: [PATCH] Simplified AVHV support
- Date: 30 Jun 1998 13:34:07 +0200
- Message-ID: <m3k95z86og.fsf@furu.g.aas.no>
+[ 4762] By: gsar on 2000/01/06 04:09:00
+ Log: tweak test in change#4757 for Windows
Branch: perl
- ! ObjXSub.h av.c embed.h global.sym objpp.h pod/perldiag.pod
- ! pp.c proto.h t/op/avhv.t
+ ! t/io/open.t
____________________________________________________________________________
-[ 1285] By: gsar on 1998/07/04 02:30:48
- Log: tweak doc for ".."
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Subject: [PATCH] pod for scalar ..
- Message-Id: <E0yqyN8-0006gv-00@taurus.cus.cam.ac.uk>
- Date: Tue, 30 Jun 1998 12:14:50 +0100
+[ 4761] By: gsar on 2000/01/06 02:55:30
+ Log: USE_ITHREADS tweak (reused pad values could be SvREADONLY if
+ they belonged to freed OP_CONSTs)
Branch: perl
- ! pod/perlop.pod
+ ! op.c
____________________________________________________________________________
-[ 1284] By: gsar on 1998/07/04 02:28:43
- Log: fix use of uninitialized var in pp_unpack()
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 30 Jun 1998 14:32:17 +0300 (EET DST)
- Message-Id: <199806301132.OAA27353@alpha.hut.fi>
- Subject: [PATCH] 5.004_69 (also for 5.004_04) one more^Wless quad bug
+[ 4760] By: gsar on 2000/01/06 00:22:40
+ Log: constant ranges could escape bareword check in list context
Branch: perl
- ! pp.c
+ ! op.c t/pragma/strict-subs
____________________________________________________________________________
-[ 1283] By: gsar on 1998/07/04 02:26:37
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Tue, 30 Jun 1998 11:40:22 +0300 (EET DST)
- Message-Id: <199806300840.LAA04872@alpha.hut.fi>
- Subject: [PATCH] 5.004_69: Parsewords.pm: avoid undefined warnings
+[ 4759] By: gsar on 2000/01/05 20:52:50
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 05 Jan 2000 15:23:18 EST
+ Message-Id: <20000105152318.A7400@monk.mps.ohio-state.edu>
+ Subject: Re: minimal m//g matches appear busted
Branch: perl
- ! lib/Text/ParseWords.pm
+ ! regexec.c t/op/pat.t
____________________________________________________________________________
-[ 1282] By: gsar on 1998/07/04 02:24:32
- Log: VMS updates from Dan Sugalski <sugalskd@osshe.edu>
- Message-Id: <3.0.5.32.19980629165356.00a20730@ous.edu>
- Date: Mon, 29 Jun 1998 16:53:56 -0700
- Subject: [PATCH 5.004_69]README.vms doc patch
- --
- Message-Id: <3.0.5.32.19980629165125.00a4e100@ous.edu>
- Date: Mon, 29 Jun 1998 16:51:25 -0700
- --
- Message-Id: <3.0.5.32.19980702135357.00a5eb40@ous.edu>
- Date: Thu, 02 Jul 1998 13:53:57 -0700
- Subject: [PATCH 5.004_69]VMS filetest operator fixup
+[ 4758] By: gsar on 2000/01/05 12:49:40
+ Log: various nits identified by warnings unmasked by recent changes
Branch: perl
- ! README.vms vms/descrip_mms.template vms/vms.c
+ ! ext/B/Makefile.PL lib/ExtUtils/Install.pm pod/perlfunc.pod
____________________________________________________________________________
-[ 1281] By: gsar on 1998/07/04 02:17:48
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Message-Id: <3.0.5.32.19980629164625.00a4d7c0@ous.edu>
- Date: Mon, 29 Jun 1998 16:46:25 -0700
- Subject: [PATCH 5.004_69]Tweaks to VMS configuration procedure
+[ 4757] By: gsar on 2000/01/05 12:48:10
+ Log: severe bugs in change#3786 fixed
Branch: perl
- ! vms/subconfigure.com
+ ! doio.c t/io/open.t
____________________________________________________________________________
-[ 1280] By: gsar on 1998/07/04 02:16:03
- Log: don't attempt to copy directories on VMS
- From: Dan Sugalski <sugalskd@osshe.edu>
- Message-Id: <3.0.5.32.19980629163129.00a82140@ous.edu>
- Date: Mon, 29 Jun 1998 16:31:29 -0700
- Subject: [PATCH 5.004_69]Tweak to installperl
+[ 4756] By: gsar on 2000/01/05 11:25:10
+ Log: tweak change#4745 to make ebcdic output match for chars <= 037
Branch: perl
- ! installperl
+ ! ext/Data/Dumper/Dumper.pm
____________________________________________________________________________
-[ 1279] By: gsar on 1998/07/04 02:09:26
- Log: add 'installhtml*dir' to win32 config templates
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Subject: [PATCH 5.004_68] For Win32 config
- Date: Mon, 29 Jun 1998 09:00:13 -0700
- Message-ID: <000a01bda376$ffe8b0b0$a32fa8c0@tau.Active>
+[ 4755] By: gsar on 2000/01/05 06:56:05
+ Log: cygwin support tweaks (from Eric Fifer <EFifer@sanwaint.com>)
Branch: perl
- ! win32/config.bc win32/config.gc win32/config.vc
+ ! Configure util.c utils/perlcc.PL
____________________________________________________________________________
-[ 1278] By: gsar on 1998/07/04 02:06:23
- Log: implemented described fix for h2ph hanging on "enum"
- From: Billy <wdconsta@cs.adelaide.edu.au>
- Subject: Re: h2ph problem on Solaris 2.6/SPARC/Sun compiler
- Message-ID: <Pine.SV4.3.93.980627010407.21715A-100000@xenon.teaching.cs.adelaide.edu.au>
- Date: Sat, 27 Jun 1998 01:13:12 +0930 (CST)
+[ 4754] By: gsar on 2000/01/05 06:52:25
+ Log: avoid expensive Version_check (from Andreas Koenig)
Branch: perl
- ! utils/h2ph.PL
+ ! Changes lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
+ ! lib/ExtUtils/MM_Win32.pm lib/ExtUtils/MakeMaker.pm
____________________________________________________________________________
-[ 1277] By: gsar on 1998/07/04 01:51:47
- Log: merge changes#1210,1211,1270 from maintbranch
+[ 4753] By: gsar on 2000/01/05 06:48:22
+ Log: From: andreas.koenig@anima.de (Andreas J. Koenig)
+ Date: 03 Jan 2000 21:56:02 +0100
+ Message-ID: <sfcvh5azxgd.fsf@hohenstaufen.in-berlin.de>
+ Subject: Reloading File::Copy
Branch: perl
- + lib/re.pm
- ! MANIFEST dump.c installperl lib/File/Basename.pm mg.c op.c
- ! op.h perl.h pod/perlmodlib.pod pod/perlop.pod pp_ctl.c
- ! pp_hot.c t/lib/basename.t t/op/taint.t toke.c
+ ! Changes lib/File/Copy.pm t/lib/filecopy.t
____________________________________________________________________________
-[ 1276] By: gsar on 1998/07/04 00:33:37
- Log: deprecate use of reserved word "our" (Larry's idea)
- Date: Mon, 22 Jun 1998 08:55:09 -0700
- From: larry@wall.org (Larry Wall)
- Message-Id: <199806221555.IAA07212@wall.org>
- Subject: Re: our
+[ 4752] By: gsar on 2000/01/04 01:19:20
+ Log: s/USE_TEXTMODE_SCRIPTS/PERL_TEXTMODE_SCRIPTS/g
Branch: perl
- ! pod/perldiag.pod toke.c
+ ! win32/Makefile win32/makefile.mk win32/win32.h
____________________________________________________________________________
-[ 1275] By: nick on 1998/07/02 18:36:59
- Log: Integrate mainline, just to keep up.
- Branch: ansiperl
- +> t/lib/fields.t
- - lib/Math/Trig/Radial.pm
- !> MANIFEST lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
- !> lib/Math/Trig.pm lib/base.pm lib/fields.pm mg.c
- !> pod/perldiag.pod pod/perltrap.pod pp_hot.c scope.c scope.h
- !> t/lib/trig.t t/op/array.t toke.c utils/perldoc.PL
- !> win32/config.bc win32/config.gc win32/config.vc
- !> win32/include/dirent.h win32/makedef.pl win32/win32.c
- !> win32/win32iop.h
+[ 4751] By: gsar on 2000/01/03 18:26:08
+ Log: avoid using (custom) autoloader in MakeMaker (from Andreas Koenig)
+ Branch: perl
+ ! lib/ExtUtils/MakeMaker.pm
____________________________________________________________________________
-[ 1274] By: gsar on 1998/07/02 16:47:20
- Log: tweak win32/config.* variables
+[ 4750] By: gsar on 2000/01/02 21:58:02
+ Log: make DProf look at $ENV{PERL_DPROF_OUT_FILE_NAME} to make it possible
+ to write to a file other than tmon.out (suggested by Haakon Alstadheim
+ <Haakon.Alstadheim@sds.no>)
Branch: perl
- ! win32/config.bc win32/config.gc win32/config.vc
+ ! ext/Devel/DProf/DProf.pm ext/Devel/DProf/DProf.xs
____________________________________________________________________________
-[ 1273] By: gsar on 1998/07/02 16:33:53
- Log: export opendir() set of functions on win32
+[ 4749] By: gsar on 2000/01/02 21:37:29
+ Log: disable optimization in change#3612 for join() and quotemeta()--this
+ removes all the gross hacks for the special cases in that change; fix
+ pp_concat() for when TARG == arg (modified version of patch suggested
+ by Ilya Zakharevich)
Branch: perl
- ! win32/include/dirent.h win32/makedef.pl win32/win32.c
- ! win32/win32iop.h
+ ! op.c opcode.h opcode.pl pp_hot.c sv.c t/op/lex_assign.t
____________________________________________________________________________
-[ 1272] By: gsar on 1998/07/01 23:21:49
- Log: fix C<@a = (%a = 1)> bizarreness
+[ 4748] By: gsar on 2000/01/02 20:26:06
+ Log: MakeMaker should attempt to "require" rather than "use" prerequisites
+ to avoid imports (from Michael G Schwern <schwern@pobox.com>)
Branch: perl
- ! pp_hot.c
+ ! lib/ExtUtils/MakeMaker.pm
____________________________________________________________________________
-[ 1271] By: gsar on 1998/06/30 22:49:39
- Log: document perltrap on precedence of keys/values/each
+[ 4747] By: gsar on 2000/01/02 20:17:36
+ Log: fix 4-arg substr() when used as argument to subroutine
Branch: perl
- ! pod/perltrap.pod
+ ! pp.c t/op/substr.t
____________________________________________________________________________
-[ 1270] By: TimBunce on 1998/06/30 09:06:21
- Log: Added lib/re.pm missing from change 1210
- Branch: maint-5.004/perl
- + lib/re.pm
+[ 4746] By: gsar on 2000/01/02 18:45:58
+ Log: usethreads build fixups for NeXTstep (as suggested by Hans Mulder)
+ Branch: perl
+ ! embed.h embed.pl ext/DynaLoader/dl_beos.xs
+ ! ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_hpux.xs
+ ! ext/DynaLoader/dl_next.xs ext/DynaLoader/dl_rhapsody.xs
+ ! perlapi.c proto.h thread.h util.c
____________________________________________________________________________
-[ 1269] By: gsar on 1998/06/30 08:20:52
- Log: From: Murray Nesbitt <murray@ActiveState.com>
- Message-Id: <77180549BCE.AAA466A@mail.rdc1.bc.wave.home.com>
- Date: Mon, 29 Jun 1998 14:30:59 PDT
- Subject: Re: [PATCH 5.004_67] MakeMaker mods for PPD support
+[ 4745] By: gsar on 2000/01/02 18:15:44
+ Log: ebcdic fix for Data::Dumper from Peter Prymmer
Branch: perl
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ ! ext/Data/Dumper/Dumper.pm regcomp.c
____________________________________________________________________________
-[ 1268] By: gsar on 1998/06/30 05:38:34
- Log: From: Robin Barker <rmb1@cise.npl.co.uk>
- Message-Id: <13254.9806291404@tempest.cise.npl.co.uk>
- Date: Mon, 29 Jun 1998 15:04:57 -0000
- Subject: [PATCH perl5.004_69] perldoc.PL
+[ 4744] By: gsar on 1999/12/31 22:42:23
+ Log: missing files in previous submit
Branch: perl
- ! utils/perldoc.PL
+ ! embed.h embed.pl ext/Devel/DProf/DProf.xs globals.c
+ ! lib/ExtUtils/MM_Unix.pm objXSUB.h perlapi.c proto.h
____________________________________________________________________________
-[ 1267] By: gsar on 1998/06/30 05:34:06
- Log: add patch to integrate Math::Trig::Radial into Math::Trig
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Mon, 29 Jun 1998 16:28:53 +0300 (EET DST)
- Message-Id: <199806291328.QAA16916@alpha.hut.fi>
- Subject: [PATCH] 5.004_68 (or 5.004_04): radial trig
+[ 4743] By: gsar on 1999/12/31 06:47:18
+ Log: various Windows build tweaks
Branch: perl
- - lib/Math/Trig/Radial.pm
- ! MANIFEST lib/Math/Trig.pm t/lib/trig.t
+ ! win32/win32.h
____________________________________________________________________________
-[ 1266] By: gsar on 1998/06/30 05:17:33
- Log: From: Gisle Aas <gisle@aas.no>
- Message-Id: <m367hk4hra.fsf@furu.g.aas.no>
- Date: 29 Jun 1998 12:36:09 +0200
- Subject: Re: [PATCH] Simplified magic_setisa() and improved fields.pm
+[ 4742] By: gsar on 1999/12/30 21:32:36
+ Log: change#4705 breaks code that interpolates $], so leave string value
+ of $] as it was for compatibility (and perhaps introduce $^V or similar
+ for the utf8 representation, maybe?)
Branch: perl
- + t/lib/fields.t
- ! MANIFEST lib/base.pm lib/fields.pm mg.c pod/perldiag.pod
- ! t/op/array.t
+ ! configpm gv.c
____________________________________________________________________________
-[ 1265] By: gsar on 1998/06/30 05:12:57
- Log: tweaks to overloaded constants (change#1259)
+[ 4741] By: gsar on 1999/12/30 19:36:21
+ Log: avoid CRLF in byteloadable files created by perlcc
Branch: perl
- ! scope.c scope.h toke.c
+ ! utils/perlcc.PL
____________________________________________________________________________
-[ 1264] By: nick on 1998/06/29 17:38:03
- Log: Integrate mainline c. _69 to ansiperl
- Branch: ansiperl
- +> eg/cgi/caution.xbm eg/cgi/dna.small.gif.uu
- +> eg/cgi/nph-multipart.cgi ext/Errno/ChangeLog
- +> ext/Errno/Errno_pm.PL ext/Errno/Makefile.PL lib/CGI/Cookie.pm
- +> lib/Math/Trig/Radial.pm perlio.h t/lib/cgi-form.t
- +> t/lib/cgi-function.t t/lib/cgi-html.t t/lib/cgi-request.t
- +> t/lib/errno.t t/op/goto_xs.t t/op/splice.t
- !> (integrate 100 files)
-
-----------------
-Version 5.004_69
-----------------
-
+[ 4740] By: gsar on 1999/12/30 19:35:07
+ Log: leave DATA open in binmode if __END__ line doesn't have CRLF
+ Branch: perl
+ ! pod/perldelta.pod toke.c
____________________________________________________________________________
-[ 1263] By: gsar on 1998/06/29 09:17:28
- Log: update Changes and perlhist.pod
+[ 4739] By: gsar on 1999/12/30 05:44:21
+ Log: enable the PERL_BINMODE_SCRIPTS behavior by default on Windows
+ to allow ByteLoader to work; the DATA filehandles continue to
+ be left open in text mode for compatibility
Branch: perl
- ! Changes pod/perlhist.pod
+ ! embed.h embed.pl objXSUB.h pod/perldelta.pod proto.h sv.c
+ ! toke.c win32/Makefile win32/makefile.mk win32/win32.c
+ ! win32/win32.h
____________________________________________________________________________
-[ 1262] By: gsar on 1998/06/29 08:26:36
- Log: bump patchlevel to 69, various little tweaks (tested on win32, Solaris
- under several build configurations)
+[ 4738] By: gsar on 1999/12/30 04:36:12
+ Log: CR-LF support broken for formats
Branch: perl
- ! Todo.5.005 op.c patchlevel.h t/lib/cgi-function.t
- ! t/lib/cgi-request.t toke.c win32/Makefile win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+ ! toke.c
____________________________________________________________________________
-[ 1261] By: gsar on 1998/06/29 06:51:10
- Log: add missing SSCHECK() to rectify faulty SSPUSH*() logic in change#1259
+[ 4737] By: gsar on 1999/12/29 22:30:52
+ Log: make DProf functional under pseudo-fork()
Branch: perl
- ! scope.h
+ ! ext/Devel/DProf/DProf.xs
____________________________________________________________________________
-[ 1260] By: gsar on 1998/06/29 06:46:12
- Log: Message-Id: <199806290610.IAA19443@moulon.inra.fr>
- Date: Mon, 29 Jun 1998 08:10:46 +0200
- From: ts <decoux@moulon.inra.fr>
- Subject: {perlembed.pod] Re: Memory leak in Perl 5.004 and the fix
+[ 4736] By: gsar on 1999/12/29 21:04:59
+ Log: slurp mode fix in change#2910 wasn't quite right (spotted by Hans
+ Mulder)
Branch: perl
- ! pod/perlembed.pod
+ ! doio.c pp_hot.c t/io/argv.t
____________________________________________________________________________
-[ 1259] By: gsar on 1998/06/29 06:01:35
- Log: added patch for overloading constants, made PERL_OBJECT-aware
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806270328.XAA21088@monk.mps.ohio-state.edu>
- Date: Fri, 26 Jun 1998 23:28:41 -0400 (EDT)
+[ 4735] By: gsar on 1999/12/29 18:12:40
+ Log: re.pm is needed earlier, xsubpp now uses it (spotted by Andreas
+ Koenig)
Branch: perl
- ! ObjXSub.h embed.h embedvar.h global.sym hv.c interp.sym
- ! intrpvar.h lib/Math/BigInt.pm lib/overload.pm objpp.h op.c
- ! perl.c perl.h pp_ctl.c proto.h scope.c scope.h
- ! t/pragma/overload.t toke.c
+ ! Makefile.SH
____________________________________________________________________________
-[ 1258] By: gsar on 1998/06/29 05:32:25
- Log: fix Socket.pm typo from change#1240
+[ 4734] By: gsar on 1999/12/28 21:10:37
+ Log: Windows build tweaks
Branch: perl
- ! ext/Socket/Socket.pm
+ ! INTERN.h sv.c
____________________________________________________________________________
-[ 1257] By: gsar on 1998/06/29 05:09:24
- Log: applied patch, tweak for threads awareness
- From: Albert Dvornik <bert@genscan.com>
- Subject: [PATCH]5.004_04-m4 (CORE) fix for broken "goto &xsub"
- Date: 24 Jun 1998 19:33:09 -0400
- Message-Id: <tq4sxawf2h.fsf@puma.genscan.com>
+[ 4733] By: gsar on 1999/12/28 20:45:15
+ Log: remove never-taken branch for making getc() operate on ARGV (spotted
+ by Ralph Corderoy <ralph@inputplus.demon.co.uk>)
Branch: perl
- + t/op/goto_xs.t
- ! MANIFEST pp_ctl.c
+ ! pp_sys.c
____________________________________________________________________________
-[ 1256] By: gsar on 1998/06/29 03:34:18
- Log: applied patch, fixed one more leak, tweaked whitespace bugs
- From: Guy Decoux <decoux@moulon.inra.fr>
- (via)
- Date: Fri, 26 Jun 1998 09:59:32 -0400
- From: "Chunhui Teng" <cteng@nortel.ca>
- Message-Id: <199806261359.JAA02393@bmers357.nortel.ca>
- Subject: Memory leak in Perl 5.004 and the fix
+[ 4732] By: gsar on 1999/12/28 20:42:13
+ Log: tests for change#4642 and pod fixups suggested by Ralph Corderoy
+ <ralph@inputplus.demon.co.uk>
Branch: perl
- ! ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
+ ! pod/perldelta.pod pod/perlfunc.pod pod/perlre.pod t/io/argv.t
____________________________________________________________________________
-[ 1255] By: gsar on 1998/06/29 02:50:37
- Log: From: koenig@kulturbox.de (Andreas J. Koenig)
- Subject: Permissions in MakeMaker (Was: patch to MM_Unix.pm)
- Date: 28 Jun 1998 23:47:07 +0200
- Message-ID: <sfc1zs9gpwk.fsf@dubravka.in-berlin.de>
+[ 4731] By: gsar on 1999/12/28 20:23:17
+ Log: optimize XSUBs to use targets if the -nooptimize xsubpp option is
+ not supplied (variant of patch suggested by Ilya Zakharevich)
Branch: perl
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ ! XSUB.h lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 1254] By: gsar on 1998/06/28 21:35:02
- Log: From: joshua.pritikin@db.com
- Date: Fri, 26 Jun 1998 09:34:34 -0400
- Message-Id: <H00000e500081d23@MHS>
- Subject: [PATCH _68] PUSHSTACK renovation
+[ 4730] By: gsar on 1999/12/28 19:55:56
+ Log: range operator does magical string increment iff both operands
+ are non-numbers, from Tom Phoenix <rootbeer@redcat.com>; fixed
+ the "foreach (RANGE)" case as well
Branch: perl
- ! av.c cop.h gv.c mg.c perl.c pp_ctl.c pp_sys.c sv.c util.c
+ ! pp_ctl.c t/op/range.t
____________________________________________________________________________
-[ 1253] By: gsar on 1998/06/28 21:21:22
- Log: From: Stephen McCamant <alias@mcs.com>
- Message-Id: <m0yq2fr-000EalC@alias-2.pr.mcs.net>
- Date: Sat, 27 Jun 1998 16:38:19 -0500 (CDT)
- Subject: IV changes for long long (was Re: 5.004_68 on its way to the CPAN)
+[ 4729] By: gsar on 1999/12/28 18:40:19
+ Log: Win9x + GCC update from Benjamin Stuhl <sho_pi@hotmail.com>
Branch: perl
- ! perlvars.h sv.c
+ - win32/PerlCRT.def win32/gstartup.c win32/oldnames.def
+ ! EXTERN.h INTERN.h MANIFEST README.win32 iperlsys.h
+ ! lib/ExtUtils/MM_Win32.pm makedef.pl win32/Makefile
+ ! win32/config.gc win32/genmk95.pl win32/makefile.mk
+ ! win32/perlhost.h win32/perllib.c win32/runperl.c win32/win32.c
+ ! win32/win32.h
____________________________________________________________________________
-[ 1252] By: gsar on 1998/06/28 21:16:34
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806272359.TAA05436@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_68] Improve warning on zero-length chunks in RE
- Date: Sat, 27 Jun 1998 19:59:13 -0400 (EDT)
+[ 4728] By: gsar on 1999/12/28 07:44:19
+ Log: typecasts needed
Branch: perl
- ! regcomp.c
+ ! toke.c
____________________________________________________________________________
-[ 1251] By: gsar on 1998/06/28 21:14:32
- Log: add Math/Trig/Radial.pm, update MANIFEST
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Sat, 27 Jun 1998 17:28:14 +0300 (EET DST)
- Message-Id: <199806271428.RAA05307@alpha.hut.fi>
- Subject: Math::Trig::Radial ?
+[ 4727] By: gsar on 1999/12/28 06:23:08
+ Log: change#4721 needed line number adjustments
Branch: perl
- + lib/Math/Trig/Radial.pm
- ! MANIFEST
+ ! MANIFEST global.sym proto.h t/pragma/warn/doop
+ ! t/pragma/warn/pp t/pragma/warn/regcomp t/pragma/warn/sv
+ ! t/pragma/warn/toke t/pragma/warn/utf8
____________________________________________________________________________
-[ 1250] By: gsar on 1998/06/28 21:09:48
- Log: applied patch, tweaked doc, and regen regnodes.h
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806270655.CAA29144@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_68] \z in RE
- Date: Sat, 27 Jun 1998 02:55:26 -0400 (EDT)
+[ 4726] By: gsar on 1999/12/28 04:18:15
+ Log: integrate utfperl contents into mainline
Branch: perl
- ! pod/perlre.pod regcomp.c regcomp.sym regexec.c regnodes.h
- ! t/op/re_tests t/op/regexp.t toke.c
+ +> lib/byte.pm lib/byte_heavy.pl
+ !> configpm embed.h embed.pl embedvar.h gv.c intrpvar.h objXSUB.h
+ !> patchlevel.h perl.c perl.h perlapi.c pp_ctl.c pp_hot.c proto.h
+ !> regnodes.h sv.c sv.h t/comp/require.t toke.c utf8.h
+____________________________________________________________________________
+[ 4725] By: gsar on 1999/12/28 04:08:09
+ Log: integrate mainline contents
+ Branch: utfperl
+ - ext/DynaLoader/dl_cygwin.xs lib/unicode/Eq/Latin1
+ - lib/unicode/Eq/Unicode
+ !> (integrate 60 files)
____________________________________________________________________________
-[ 1249] By: gsar on 1998/06/28 20:56:38
- Log: From: mike@bill.iac.net
- Message-ID: <19980627034913.A32220@bill.minivend.com>
- Date: Sat, 27 Jun 1998 03:49:13 +0000
- Subject: [ PATCH 5.004 68 ] Text::ParseWords, ^W fixed, version 3.1
+[ 4724] By: gsar on 1999/12/28 03:44:10
+ Log: fix for /(^|a)b/ breakage from Ilya Zakharevich
Branch: perl
- ! lib/Text/ParseWords.pm t/lib/parsewords.t
+ ! regcomp.c t/op/re_tests
____________________________________________________________________________
-[ 1248] By: gsar on 1998/06/28 20:54:43
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806270352.XAA21174@monk.mps.ohio-state.edu>
- Subject: [PATCH] Fix ptags
- Date: Fri, 26 Jun 1998 23:52:54 -0400 (EDT)
+[ 4723] By: gsar on 1999/12/28 03:28:39
+ Log: more ebcdic testsuite fixups (from Peter Prymmer)
Branch: perl
- ! emacs/ptags
+ ! Changes lib/bigfloat.pl t/lib/charnames.t t/lib/dumper.t
+ ! t/pragma/overload.t t/pragma/utf8.t
____________________________________________________________________________
-[ 1247] By: gsar on 1998/06/28 20:42:54
- Log: apply patch sent via private mail
- From: Stephen McCamant <alias@mcs.com>
- Message-Id: <m0ypkmt-000EalC@alias-2.pr.mcs.net>
- Date: Fri, 26 Jun 1998 21:32:23 -0500 (CDT)
- Subject: Re: Enhanced B::Deparse
+[ 4722] By: gsar on 1999/12/28 03:14:48
+ Log: avoid "used once" warning
Branch: perl
- ! ext/B/B/Deparse.pm
+ ! lib/diagnostics.pm
____________________________________________________________________________
-[ 1246] By: gsar on 1998/06/28 20:38:24
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806270109.VAA14907@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_68] pat.t tests
- Date: Fri, 26 Jun 1998 21:09:02 -0400 (EDT)
+[ 4721] By: gsar on 1999/12/28 03:10:32
+ Log: ebcdic tweaks for tests from Peter Prymmer
Branch: perl
- ! t/op/pat.t
+ ! t/pragma/warn/doop t/pragma/warn/pp t/pragma/warn/regcomp
+ ! t/pragma/warn/sv t/pragma/warn/toke t/pragma/warn/utf8
____________________________________________________________________________
-[ 1245] By: gsar on 1998/06/28 20:36:08
- Log: From: joshua.pritikin@db.com
- Date: Fri, 26 Jun 1998 10:02:32 -0400
- Message-Id: <H00000e500081d28@MHS>
- Subject: [PATCH _68] improve recursive error messages!
+[ 4720] By: gsar on 1999/12/28 03:08:39
+ Log: pod nits from Simon Cozens <simon@brecon.co.uk> and others
Branch: perl
- ! gv.c pod/perldiag.pod universal.c
+ ! README.os2 lib/ExtUtils/Embed.pm lib/ExtUtils/Install.pm
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/ExtUtils/Mkbootstrap.pm pod/perlop.pod
____________________________________________________________________________
-[ 1244] By: gsar on 1998/06/28 20:09:02
- Log: From: Dominic Dunlop <domo@vo.lu>
- Message-Id: <v03110701b1b83a06733a@[195.95.102.101]>
- Date: Thu, 25 Jun 1998 17:46:55 +0000
- Subject: [PATCH 5.004_68]: Move REG_INFTY-dependent tests from op/regexp.t
- to op/pat.t; add tests for a few more regexp parse failures etc.
+[ 4719] By: gsar on 1999/12/28 03:01:04
+ Log: perlport v1.45 from Chris Nandor
Branch: perl
- ! t/op/pat.t t/op/re_tests t/op/regexp.t
+ ! pod/perlport.pod
____________________________________________________________________________
-[ 1243] By: gsar on 1998/06/28 20:06:30
- Log: specify *.sym files needed in perl_exp.SH instead of picking up all
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Thu, 25 Jun 1998 10:36:21 -0400 (EDT)
- Subject: Re: Not OK: perl 5.00468 on aix-thread 4.1.4.0
- Message-Id: <Pine.SUN.3.96.980625102459.11241F-100000@newton.phys>
+[ 4718] By: gsar on 1999/12/28 02:59:16
+ Log: newer version of constant.pm from Tom Phoenix; added Tom's notes to
+ perldelta; added STOP, DESTROY and AUTOLOAD to specials list
Branch: perl
- ! perl_exp.SH
+ ! lib/constant.pm pod/perldelta.pod pod/perlvar.pod
+ ! t/pragma/constant.t
____________________________________________________________________________
-[ 1242] By: gsar on 1998/06/28 20:01:28
- Log:
- From: Gisle Aas <gisle@aas.no>
- Subject: Re: [PATCH] 4-arg substr update for perl5.004_68
- Date: 25 Jun 1998 10:32:43 +0200
- Message-ID: <m3iulpubis.fsf@furu.g.aas.no>
+[ 4717] By: gsar on 1999/12/28 02:47:04
+ Log: cygwin update from Eric Fifer <EFifer@sanwaint.com>
Branch: perl
- ! op.c pod/perlfunc.pod pp.c t/op/substr.t
+ - ext/DynaLoader/dl_cygwin.xs
+ ! MAINTAIN MANIFEST ext/POSIX/POSIX.xs ext/SDBM_File/sdbm/pair.c
+ ! hints/cygwin.sh installperl mg.c pod/perlfaq3.pod t/op/stat.t
+ ! util.c
____________________________________________________________________________
-[ 1241] By: gsar on 1998/06/28 19:55:11
- Log: applied patch, tweaked opcode.pl for PERL_OBJECT, and regen opcode.h
- From: Stephen McCamant <alias@mcs.com>
- Message-Id: <m0yp1Ue-000EP2C@alias-2.pr.mcs.net>
- Date: Wed, 24 Jun 1998 21:10:32 -0500 (CDT)
- Subject: [PATCH REPOST] refgen in opcode.pl
+[ 4716] By: gsar on 1999/12/28 02:40:51
+ Log: tweak to show up db-linked-with-libpthread-but-not-perl problem
+ (from Andy Dougherty)
Branch: perl
- ! opcode.h opcode.pl
+ ! Configure
____________________________________________________________________________
-[ 1240] By: gsar on 1998/06/28 19:46:29
- Log: From: Chris Nandor <pudge@pobox.com>
- Message-Id: <v04011709b1b742cd7f0c@[24.48.29.192]>
- Date: Wed, 24 Jun 1998 19:58:28 -0400
- Subject: [PATCH 3d try] Add CR LF CRLF to Socket.pm
+[ 4715] By: gsar on 1999/12/28 02:38:44
+ Log: better variant of change#4644 (from Andy Dougherty)
Branch: perl
- ! ext/Socket/Socket.pm
+ ! Configure
____________________________________________________________________________
-[ 1239] By: gsar on 1998/06/28 19:44:19
- Log: From: Gisle Aas <gisle@aas.no>
- Subject: [PATCH] Optimize foreach (1..1000000)
- Date: 24 Jun 1998 20:26:48 +0200
- Message-ID: <m3lnqmwt93.fsf@furu.g.aas.no>
+[ 4714] By: gsar on 1999/12/28 02:36:40
+ Log: be defensive about setting {host,group,pass}cat (from Andy Dougherty)
Branch: perl
- ! Todo cop.h op.c pod/perldiag.pod pod/perlop.pod pp_ctl.c
- ! pp_hot.c t/op/range.t
+ ! Configure
____________________________________________________________________________
-[ 1238] By: gsar on 1998/06/28 19:28:13
- Log: avoid creation of %^R
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806241825.OAA06346@monk.mps.ohio-state.edu>
- Subject: Re: [5.004_68] What is %^R ? [PATCH?]
- Date: Wed, 24 Jun 1998 14:25:06 -0400 (EDT)
+[ 4713] By: gsar on 1999/12/28 02:35:15
+ Log: $sitelib should be $prefix/lib/perl5/site_perl, as documented in
+ INSTALL (from Andy Dougherty)
Branch: perl
- ! perl.c t/op/splice.t
+ ! Configure
____________________________________________________________________________
-[ 1237] By: gsar on 1998/06/28 19:23:40
- Log: From: Gisle Aas <gisle@aas.no>
- Subject: [PATCH] Negative LENGTH argument to splice
- Date: 24 Jun 1998 15:11:35 +0200
- Message-ID: <m3g1gvc5bs.fsf@furu.g.aas.no>
+[ 4712] By: gsar on 1999/12/28 02:30:55
+ Log: avoid creating new files during make install
Branch: perl
- + t/op/splice.t
- ! MANIFEST pod/perlfunc.pod pp.c
+ ! Makefile.SH
____________________________________________________________________________
-[ 1236] By: gsar on 1998/06/28 19:18:29
- Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Subject: [PATCH] Insecure $ENV{} message out of step with perldiag
- Message-Id: <E0yooQA-0003za-00@taurus.cus.cam.ac.uk>
- Date: Wed, 24 Jun 1998 13:13:02 +0100
+[ 4711] By: gsar on 1999/12/28 02:24:44
+ Log: pod edits from Paul Marquess and Mark-Jason Dominus
Branch: perl
- ! pod/perldiag.pod pod/perlsec.pod
+ ! AUTHORS Changes ext/DynaLoader/dl_aix.xs
+ ! ext/DynaLoader/dl_dlopen.xs lib/Net/Ping.pm pod/perlcall.pod
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 1235] By: gsar on 1998/06/28 19:16:13
- Log: Complex.pm update
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Wed, 24 Jun 1998 15:19:05 +0300 (EET DST)
- Message-Id: <199806241219.PAA04061@alpha.hut.fi>
- Subject: [PATCH] 5.004_68: Complex.pm, complex.t
+[ 4710] By: gsar on 1999/12/28 02:05:23
+ Log: miniperl build fixes for os2 (from Yitzchak Scott-Thoennes
+ <sthoenna@efn.org>); add explicit target for opmini.o
Branch: perl
- ! lib/Math/Complex.pm t/lib/complex.t
+ ! Makefile.SH cygwin/Makefile.SHs os2/Makefile.SHs
____________________________________________________________________________
-[ 1234] By: gsar on 1998/06/28 19:13:05
- Log: disable perl malloc on UNICOS for now
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Wed, 24 Jun 1998 12:37:14 +0300 (EET DST)
- Message-Id: <199806240937.MAA01669@alpha.hut.fi>
- Subject: [PATCH] 5.004_68: UNICOS hints
+[ 4709] By: gsar on 1999/12/28 01:20:39
+ Log: partly fix perldiag regressions identified by Tom Christiansen
Branch: perl
- ! hints/unicos.sh
+ ! doio.c lib/diagnostics.pm pod/perldiag.pod pp_hot.c pp_sys.c
+ ! t/pragma/warn/4lint t/pragma/warn/doio t/pragma/warn/pp_hot
+ ! t/pragma/warn/pp_sys
____________________________________________________________________________
-[ 1233] By: gsar on 1998/06/28 19:10:53
- Log: fixes unpack("q"...), and semctl() tests for UNICOS
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Date: Wed, 24 Jun 1998 11:55:09 +0300 (EET DST)
- Message-Id: <199806240855.LAA16152@alpha.hut.fi>
- Subject: [PATCH] 5.004_68: semctl() in UNICOS (was: pack/unpack)
+[ 4708] By: gsar on 1999/12/27 23:33:24
+ Log: update perldiag for change#4707
Branch: perl
- ! pp.c t/op/ipcsem.t t/op/pack.t
+ ! perl.c pod/perldiag.pod
____________________________________________________________________________
-[ 1232] By: gsar on 1998/06/28 19:01:23
- Log: tweak various places for iperlsys.h awareness
+[ 4707] By: gsar on 1999/12/27 23:23:39
+ Log: allow spaces in -I switch argument
Branch: perl
- ! MANIFEST Makefile.SH lib/ExtUtils/MM_Unix.pm
- ! lib/ExtUtils/MM_VMS.pm pod/perlapio.pod
+ ! perl.c
+____________________________________________________________________________
+[ 4706] By: gsar on 1999/12/26 23:44:53
+ Log: fix typos
+ Branch: utfperl
+ ! sv.h toke.c
____________________________________________________________________________
-[ 1231] By: gsar on 1998/06/28 18:37:07
- Log: add a perlio.h stub for compat (some extensions seem to #include it)
+[ 4705] By: gsar on 1999/12/24 04:02:35
+ Log: support for v5.5.640 style version numbers
+ Branch: utfperl
+ ! configpm embedvar.h gv.c intrpvar.h objXSUB.h patchlevel.h
+ ! perl.c perl.h pp_ctl.c sv.c sv.h t/comp/require.t toke.c
+____________________________________________________________________________
+[ 4704] By: gsar on 1999/12/23 08:54:27
+ Log: bring in basic threads stuff under USE_ITHREADS
Branch: perl
- + perlio.h
+ ! makedef.pl op.c perl.c perl.h perlvars.h pp_sys.c thread.h
+ ! util.c
____________________________________________________________________________
-[ 1230] By: gsar on 1998/06/28 18:35:23
- Log: Message-ID: <19980624003701.C161@cdata.tvnet.hu>
- Date: Wed, 24 Jun 1998 00:37:01 +0200
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Subject: Re: [PATCH for _66] Makefile.SH problem on dos/djgpp
+[ 4703] By: gsar on 1999/12/23 00:10:06
+ Log: integrate mainline contents into utfperl
+ Branch: utfperl
+ !> (integrate 33 files)
+____________________________________________________________________________
+[ 4702] By: gsar on 1999/12/20 17:18:23
+ Log: virtual directory handling broken on paths with trailing slash
Branch: perl
- ! pod/pod2text.PL
+ ! win32/Makefile win32/makefile.mk win32/vdir.h
____________________________________________________________________________
-[ 1229] By: gsar on 1998/06/28 18:33:42
- Log: hand apply mutiliated patch
- Message-Id: <3.0.5.32.19980623114100.00ab76e0@ous.edu>
- Date: Tue, 23 Jun 1998 11:41:00 -0700
- From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: [PATCH 5.004_68]Configure update for VMS
+[ 4701] By: gsar on 1999/12/20 17:09:55
+ Log: revert optimization in change#4700 (it appears OPpRUNTIME flag
+ isn't set for all m/$foo/o)
Branch: perl
- ! configure.com vms/descrip_mms.template vms/subconfigure.com
+ ! pp_ctl.c
____________________________________________________________________________
-[ 1228] By: gsar on 1998/06/28 17:17:35
- Log: hand apply whitespace mutiliated patch
- Date: Tue, 23 Jun 98 16:38:06 BST
- Message-Id: <5389.9806231538@tempest.cise.npl.co.uk>
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Subject: PATCH [perl5.004_68] perlbug.PL; was Re: Error message for Errno_pm.PL
+[ 4700] By: gsar on 1999/12/20 16:28:51
+ Log: avoid pp_regcomp() changing optree at run time under USE_*THREADS (or
+ we have a race on our hands)
Branch: perl
- ! utils/perlbug.PL
+ ! pp_ctl.c
____________________________________________________________________________
-[ 1227] By: gsar on 1998/06/28 17:14:34
- Log: Date: Tue, 23 Jun 1998 08:51:00 -0700 (PDT)
- From: Tom Phoenix <rootbeer@teleport.com>
- Subject: [PATCH] documenting close without arguments
- Message-ID: <Pine.GSO.3.96.980623084413.24075V-100000@user2.teleport.com>
+[ 4699] By: gsar on 1999/12/20 16:19:00
+ Log: pod tweaks
Branch: perl
- ! pod/perlfunc.pod
+ ! pod/perldelta.pod pod/perlfilter.pod pod/perlopentut.pod
____________________________________________________________________________
-[ 1226] By: gsar on 1998/06/28 17:12:56
- Log: Date: Tue, 23 Jun 1998 05:37:09 -0700 (PDT)
- From: Tom Phoenix <rootbeer@teleport.com>
- Subject: Better diags for vars.pm
- Message-ID: <Pine.GSO.3.96.980623052846.24075A-100000@user2.teleport.com>
+[ 4698] By: gsar on 1999/12/20 07:55:07
+ Log: uv_to_utf8() could lose 37th bit on HAS_QUAD platforms
Branch: perl
- ! lib/vars.pm
+ ! utf8.c
____________________________________________________________________________
-[ 1225] By: gsar on 1998/06/28 17:05:59
- Log: hand apply whitespace mutiliated perldoc.PL patches
- Date: Tue, 23 Jun 98 15:49:52 BST
- Message-Id: <5302.9806231449@tempest.cise.npl.co.uk>
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Subject: PATCH [5.004_68] perldoc.PL
- --
- Date: Fri, 26 Jun 98 17:50:05 BST
- Message-Id: <6834.9806261650@tempest.cise.npl.co.uk>
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Subject: [PATCH 5.004_68] perldoc.PL
+[ 4697] By: gsar on 1999/12/18 01:35:50
+ Log: fix from Larry for parsing C<{ 0x1 => 'foo'}> as an
+ anon hash rather than a block; test case for the same
Branch: perl
- ! utils/perldoc.PL
+ ! t/comp/term.t toke.c
____________________________________________________________________________
-[ 1224] By: gsar on 1998/06/28 16:50:59
- Log: integrate ansiperl to get makedef.pl tweak
+[ 4696] By: gsar on 1999/12/17 19:55:03
+ Log: leak in change#4694 spotted by Larry
Branch: perl
- ! Porting/pumpkin.pod win32/makedef.pl
+ ! hv.c
____________________________________________________________________________
-[ 1223] By: gsar on 1998/06/28 16:33:32
- Log: add CGI-2.42, its and testsuite
+[ 4695] By: gsar on 1999/12/17 18:14:11
+ Log: test case for change#4694
Branch: perl
- + eg/cgi/caution.xbm eg/cgi/dna.small.gif.uu
- + eg/cgi/nph-multipart.cgi lib/CGI/Cookie.pm t/lib/cgi-form.t
- + t/lib/cgi-function.t t/lib/cgi-html.t t/lib/cgi-request.t
- ! MANIFEST eg/cgi/RunMeFirst eg/cgi/file_upload.cgi
- ! eg/cgi/index.html eg/cgi/monty.cgi eg/cgi/save_state.cgi
- ! eg/cgi/wilogo.gif.uu lib/CGI.pm lib/CGI/Apache.pm
- ! lib/CGI/Carp.pm lib/CGI/Fast.pm lib/CGI/Push.pm
- ! lib/CGI/Switch.pm
+ ! t/op/delete.t
____________________________________________________________________________
-[ 1222] By: gsar on 1998/06/28 15:28:29
- Log: enable Errno build on win32, add Errno-1.08 files to repository
+[ 4694] By: gsar on 1999/12/17 18:09:08
+ Log: delete() should return the value as is, not a copy thereof
Branch: perl
- + ext/Errno/ChangeLog ext/Errno/Errno_pm.PL
- + ext/Errno/Makefile.PL t/lib/errno.t
- ! MANIFEST win32/Makefile win32/config.bc win32/config.gc
- ! win32/config.vc win32/makefile.mk
+ ! hv.c pod/perldelta.pod
____________________________________________________________________________
-[ 1221] By: gsar on 1998/06/28 14:34:06
- Log: tweak win32 config templates for cpp
+[ 4693] By: gsar on 1999/12/17 17:45:58
+ Log: fix for C<"\nx\taa\n" =~ /^\S\s+aa$/m> (from Ilya Zakharevich)
Branch: perl
- ! win32/config.bc win32/config.gc win32/config.vc
+ ! regexec.c t/op/re_tests
____________________________________________________________________________
-[ 1220] By: nick on 1998/06/26 16:46:13
- Log: Integrate mainline
- Branch: ansiperl
- !> Changes Makefile.SH ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
- !> ext/POSIX/POSIX.xs perl.c pod/perlre.pod pod/perlvar.pod sv.c
- !> util.c win32/win32.h
+[ 4692] By: gsar on 1999/12/17 17:41:10
+ Log: credits tweak
+ Branch: perl
+ ! lib/File/Spec.pm
____________________________________________________________________________
-[ 1219] By: gsar on 1998/06/26 04:33:57
- Log: make find_script() return saved string, reenable missing diagnostics
+[ 4691] By: gsar on 1999/12/17 07:12:53
+ Log: DynaLoader doesn't build properly when $(DLSRC) changes
+ (fix suggested by Hans Mulder)
Branch: perl
- ! perl.c util.c
+ ! ext/DynaLoader/Makefile.PL
____________________________________________________________________________
-[ 1218] By: gsar on 1998/06/25 23:24:53
- Log: avoid warning with -P switch
+[ 4690] By: gsar on 1999/12/17 06:26:34
+ Log: add missing new ops
Branch: perl
- ! perl.c
+ ! ext/B/ramblings/runtime.porting
____________________________________________________________________________
-[ 1217] By: gsar on 1998/06/25 22:06:58
- Log: don't suppress display of Makefile recipes that invoke perl
+[ 4689] By: gsar on 1999/12/17 06:16:49
+ Log: test harness tweak from Hans Mulder
Branch: perl
- ! Makefile.SH
+ ! t/TEST
____________________________________________________________________________
-[ 1216] By: gsar on 1998/06/25 21:32:06
- Log: tweak order of destruction so OBJECTs in GLOBs are visited after those
- in RVs
+[ 4688] By: gsar on 1999/12/17 06:14:23
+ Log: miniperl build fixes for NeXTstep and cygwin (from Hans Mulder
+ and Lucian CIONCA <Lucian.Cionca@algoritma.ro>)
Branch: perl
- ! sv.c
+ ! Makefile.SH cygwin/Makefile.SHs
____________________________________________________________________________
-[ 1215] By: gsar on 1998/06/25 18:56:59
- Log: mknod() is not POSIX, so remove the POSIX pieces from change#1199
+[ 4687] By: gsar on 1999/12/17 06:06:46
+ Log: applied suggested patch with whitespace adjustments
+ From: Helmut Jarausch <jarausch@numa1.igpm.rwth-aachen.de>
+ Date: Thu, 16 Dec 1999 08:57:55 +0100
+ Message-id: <38589B82.C4668E10@numa1.igpm.rwth-aachen.de>
+ Subject: Re: [ID 19991215.001] patch 5.005_63: Find::Fill cannot handle /
Branch: perl
- ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
+ ! lib/File/Find.pm
____________________________________________________________________________
-[ 1214] By: gsar on 1998/06/25 18:11:22
- Log: add FILE_SHARE_DELETE ifndef in win32.h
+[ 4686] By: gsar on 1999/12/17 05:48:53
+ Log: avoid warnings due to symbols unintroduced by XSLoader (spotted
+ by Hans Mulder)
Branch: perl
- ! win32/win32.h
+ ! ext/DynaLoader/dl_dld.xs ext/DynaLoader/dl_hpux.xs
+ ! ext/DynaLoader/dl_mpeix.xs ext/DynaLoader/dl_next.xs
+ ! ext/DynaLoader/dl_rhapsody.xs
____________________________________________________________________________
-[ 1213] By: nick on 1998/06/24 17:18:59
- Log: Correct perl malloc tweak to .def generation
- Branch: ansiperl
- ! win32/makedef.pl
+[ 4685] By: gsar on 1999/12/17 05:37:51
+ Log: fix bug when one of the operands is +0E+0 (from Ronald J Kimball
+ <rjk@linguist.dartmouth.edu>)
+ Branch: perl
+ ! lib/Math/BigFloat.pm t/lib/bigfltpm.t
____________________________________________________________________________
-[ 1212] By: gsar on 1998/06/24 12:40:13
- Log: check in what change#1182 didn't, and Changes
+[ 4684] By: gsar on 1999/12/16 09:32:48
+ Log: spell out how to get 4-digit year (from Micheal G Schwern
+ <schwern@pobox.com>)
Branch: perl
- ! Changes pod/perlre.pod pod/perlvar.pod
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1211] By: TimBunce on 1998/06/23 23:09:37
- Log: Update test count in t/lib/basename.t (see change 1210)
- Branch: maint-5.004/perl
- ! t/lib/basename.t
-____________________________________________________________________________
-[ 1210] By: TimBunce on 1998/06/23 22:58:18
- Log: Title: "Add C<use re 'taint'> pragma to propagate tainting in m// and s///"
- From: Chip Salzenberg <chip@perl.org>, Gurusamy Sarathy
- <gsar@engin.umich.edu>, Tim.Bunce@ig.co.uk (Tim Bunce)
- Msg-ID: <19980525155222.A18445@perlsupport.com>,
- <199805261143.MAA04260@toad.ig.co.uk>,
- <199805261235.IAA10371@aatma.engin.umich.edu>,
- Files: MANIFEST pod/perlmodlib.pod pod/perlop.pod op.h perl.h dump.c
- installperl lib/re.pm lib/File/Basename.pm mg.c op.c
- pp_ctl.c pp_hot.c t/lib/basename.t t/op/taint.t toke.c
- Branch: maint-5.004/perl
- ! MANIFEST dump.c embed.h installperl lib/File/Basename.pm mg.c
- ! op.c op.h perl.h pod/perlmodlib.pod pod/perlop.pod pp_ctl.c
- ! pp_hot.c t/lib/basename.t t/op/taint.t toke.c
+[ 4683] By: gsar on 1999/12/16 09:26:53
+ Log: type mismatch for %c format argument (spotted by Robin Barker
+ <rmb1@cise.npl.co.uk>)
+ Branch: perl
+ ! regcomp.c
____________________________________________________________________________
-[ 1209] By: nick on 1998/06/23 21:33:34
- Log: Perl_malloced_size() only available with perl's malloc
- Branch: ansiperl
- ! win32/makefile.mk
+[ 4682] By: gsar on 1999/12/16 08:33:28
+ Log: mingw32 doesn't have anonymous union (from Benjamin Stuhl
+ <sho_pi@hotmail.com>)
+ Branch: perl
+ ! win32/win32.c
____________________________________________________________________________
-[ 1208] By: nick on 1998/06/23 18:15:23
- Log: Integrate mainline c. 5.004_68 into ansiperl, mainly
- so see what has changed...
- Branch: ansiperl
- +> Porting/genlog iperlsys.h lib/File/Spec.pm
- +> lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
- +> lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
- +> lib/File/Spec/Win32.pm regcomp.pl regcomp.sym regnodes.h
- +> t/lib/filespec.t win32/perlhost.h
- - atomic.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h ipsock.h
- - ipstdio.h perldir.h perlenv.h perlio.h perllio.h perlmem.h
- - perlproc.h perlsock.h
- !> (integrate 96 files)
+[ 4681] By: gsar on 1999/12/16 08:31:15
+ Log: missing backslash (spotted by Johan Vromans)
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 4680] By: gsar on 1999/12/16 08:26:00
+ Log: avoid coredump on diagnostics when STDERR is closed
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 4679] By: gsar on 1999/12/12 18:09:41
+ Log: integrate mainline changes
+ Branch: utfperl
+ +> (branch 39 files)
+ - lib/unicode/Jamo-2.txt lib/unicode/Unicode.html
+ - lib/unicode/UnicodeData-Latest.txt
+ !> (integrate 447 files)
+____________________________________________________________________________
+[ 4678] By: gsar on 1999/12/10 01:39:13
+ Log: interpreter structure should be nulled under -DMULTIPLICITY
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 4677] By: gsar on 1999/12/09 11:10:27
+ Log: update Changes
+ Branch: perl
+ ! Changes
----------------
-Version 5.004_68
+Version 5.005_63
----------------
____________________________________________________________________________
-[ 1207] By: gsar on 1998/06/23 10:55:05
- Log: final touches to 5.004_68
+[ 4676] By: gsar on 1999/12/09 10:51:43
+ Log: fix File::Find testsuite bugs in symlink-less places
Branch: perl
- ! perl.c
+ ! t/lib/filefind.t
____________________________________________________________________________
-[ 1206] By: gsar on 1998/06/23 10:50:10
- Log: more MULTIPLICITY tweaks
+[ 4675] By: gsar on 1999/12/09 10:22:31
+ Log: USE_ITHREADS tweaks and notes
Branch: perl
- ! objpp.h perl.c perl.h proto.h win32/GenCAPI.pl win32/config.bc
- ! win32/config.gc win32/config.vc win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc
+ ! op.c pod/perldelta.pod sv.c
____________________________________________________________________________
-[ 1205] By: gsar on 1998/06/23 09:03:46
- Log: partial MULTIPLICITY cleanup
+[ 4674] By: gsar on 1999/12/09 10:21:53
+ Log: allow new style sort subs to work under usethreads
Branch: perl
- ! embedvar.h interp.sym intrpvar.h perl.c perlvars.h proto.h
- ! thrdvar.h
+ ! pp_ctl.c
____________________________________________________________________________
-[ 1204] By: gsar on 1998/06/23 09:00:48
- Log: tweak MANIFEST, add Dev_t to POSIX/typemap
+[ 4673] By: gsar on 1999/12/09 04:00:23
+ Log: document compatibility issue with literal list slices and NOTOP
+ (C<not (1,2,3)[0]> is now a syntax error)
Branch: perl
- ! MANIFEST Porting/makerel README.win32 ext/POSIX/typemap
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 1203] By: gsar on 1998/06/23 07:08:02
- Log: bump patchlevel to 68, Porting/makerel tweaks
+[ 4672] By: gsar on 1999/12/09 01:14:46
+ Log: avoid mismatched expectation <-> int types for C++ builds
Branch: perl
- ! Porting/makerel patchlevel.h win32/Makefile win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+ ! embed.pl intrpvar.h proto.h toke.c
____________________________________________________________________________
-[ 1202] By: gsar on 1998/06/23 06:16:19
- Log: remove atomic.h pending resolution of licensing issues,
- EMULATE_ATOMIC_REFCOUNTS everywhere
+[ 4671] By: gsar on 1999/12/09 00:36:24
+ Log: newer version of File::Find with support for following symlinks and
+ other features, from Helmut Jarausch <jarausch@igpm.rwth-aachen.de>
Branch: perl
- - atomic.h
- ! MANIFEST perl.h sv.h
+ ! lib/File/Find.pm pod/perldelta.pod t/lib/filefind.t
____________________________________________________________________________
-[ 1201] By: gsar on 1998/06/23 06:06:23
- Log: applied patch, regen headers
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806220819.EAA03295@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Malloc size feedback
- Date: Mon, 22 Jun 1998 04:19:45 -0400 (EDT)
- Branch: perl
- ! ObjXSub.h av.c embed.h global.sym hv.c malloc.c objpp.h perl.c
- ! pp_sys.c proto.h sv.c toke.c
-____________________________________________________________________________
-[ 1200] By: gsar on 1998/06/23 05:59:09
- Log: Message-Id: <m0yoIgR-000EP2C@alias-2.pr.mcs.net>
- Date: Mon, 22 Jun 1998 21:19:43 -0500 (CDT)
- From: Stephen McCamant <alias@mcs.com>
- Subject: [PATCH] Inheritance of B:: classes
- Branch: perl
- ! ext/B/B.pm
-____________________________________________________________________________
-[ 1199] By: gsar on 1998/06/23 05:57:58
- Log: applied patch, moved #define mkfifo ... from perl.h to POSIX.xs
- Date: Tue, 23 Jun 1998 00:01:02 +0300 (EET DST)
- Message-Id: <199806222101.AAA16456@alpha.hut.fi>
- Subject: [PATCH] _67: somebody said POSIX::mknod?
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 4670] By: gsar on 1999/12/09 00:13:06
+ Log: avoid initializing GvCV slot for autovivified filehandles
Branch: perl
- ! Configure config_h.SH ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
- ! ext/POSIX/POSIX.xs perl.h
+ ! pp.c
____________________________________________________________________________
-[ 1198] By: gsar on 1998/06/23 05:48:56
- Log: Date: Mon, 22 Jun 1998 14:10:46 -0600 (MDT)
- From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Subject: PATCH [5.004_67] perldoc.PL
- Message-ID: <Pine.LNX.3.96.980622135953.10412A-100000@perrin.dimensional.com>
+[ 4669] By: gsar on 1999/12/08 19:09:27
+ Log: apply change#4618 again along with Ilya's patch to fix bugs
+ in it (see change#4622)
Branch: perl
- ! utils/perldoc.PL
+ ! embed.h embed.pl perl.h proto.h regcomp.c regcomp.h regexec.c
+ ! t/op/re_tests t/op/subst.t
____________________________________________________________________________
-[ 1197] By: gsar on 1998/06/23 05:47:24
- Log: Message-Id: <3.0.5.32.19980622092918.00aa46e0@ous.edu>
- Date: Mon, 22 Jun 1998 09:29:18 -0700
- From: Dan Sugalski <sugalskd@ous.edu>
- Subject: [PATCH 5.004_67] Autosplit's not qite case-insensitive enough on VMS
+[ 4668] By: gsar on 1999/12/08 18:56:53
+ Log: patch to fix parser bug in C<${h{${a[0]}}} = 13>
+ From: Larry Wall <larry@wall.org>
+ Date: Tue, 7 Dec 1999 12:39:30 -0800 (PST)
+ Message-Id: <199912072039.MAA13257@kiev.wall.org>
+ Subject: Re: [ID 19991204.002] Inconsistency of ${hash{key}}
Branch: perl
- ! lib/AutoSplit.pm
+ ! embedvar.h intrpvar.h objXSUB.h sv.c toke.c
____________________________________________________________________________
-[ 1196] By: gsar on 1998/06/23 05:45:19
- Log: Date: Mon, 22 Jun 1998 18:58:55 +0300 (EET DST)
- Message-Id: <199806221558.SAA18626@alpha.hut.fi>
- Subject: [PATCH] 5.004_67: Fcntl: add few constants, enhance maintainability
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 4667] By: gsar on 1999/12/08 18:47:37
+ Log: patch to fix aix hints from ortmann@vnet.ibm.com
Branch: perl
- ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
+ ! hints/aix.sh
____________________________________________________________________________
-[ 1195] By: gsar on 1998/06/23 05:43:32
- Log: Message-Id: <v03110700b1b41e1760b2@[195.95.102.55]>
- Date: Mon, 22 Jun 1998 15:22:24 +0000
- From: Dominic Dunlop <domo@vo.lu>
- Subject: [PATCH 5.004_67] Amend tests/regexp.t for variable REG_INFTY;
- update machten.sh to vary REG_INFTY
+[ 4666] By: gsar on 1999/12/08 18:29:02
+ Log: documentation tweaks from M. J. T. Guy, Micheal Schwern, and
+ Tim Meadowcroft
Branch: perl
- ! hints/machten.sh t/op/re_tests t/op/regexp.t
+ ! Changes lib/Benchmark.pm pod/perlipc.pod pod/perlre.pod
____________________________________________________________________________
-[ 1194] By: gsar on 1998/06/23 05:38:36
- Log: filter out array subscripts when generating symbols for AIX
- Date: Mon, 22 Jun 1998 12:14:31 +0300 (EET DST)
- Message-Id: <199806220914.MAA13631@alpha.hut.fi>
- Subject: [PATCH] 5.004_67: perl.exp bug, AIX unhappy
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 4665] By: gsar on 1999/12/08 02:22:31
+ Log: introduce save_I8() for saving byte values
Branch: perl
- ! perl_exp.SH
+ ! embed.h embed.pl global.sym objXSUB.h perlapi.c proto.h
+ ! regcomp.c regexec.c scope.c scope.h sv.c
____________________________________________________________________________
-[ 1193] By: gsar on 1998/06/23 05:32:52
- Log: updated hints file to cope with buggy sigsetjmp() on Solaris-x86
- Message-Id: <199806221102.NAA12106@alanya.m.isar.de>
- Date: Mon, 22 Jun 1998 13:02:45 +0200 (MET DST)
- From: Lupe Christoph <lupe@alanya.m.isar.de>
- Subject: Re: Perl 5.004_67: Death is on vacation - miniperl can't die
+[ 4664] By: gsar on 1999/12/08 02:02:33
+ Log: use SAVEINT() rather than SAVEDESTRUCTOR() for saving PL_expect etc.
Branch: perl
- ! hints/solaris_2.sh
+ ! toke.c
____________________________________________________________________________
-[ 1192] By: gsar on 1998/06/23 05:27:13
- Log: add detailed changelogs and 'genlog'--the script which generates them
+[ 4663] By: gsar on 1999/12/08 01:11:44
+ Log: longstanding typo in lexer: PL_lex_expect was not properly
+ saved on reentry
Branch: perl
- + Porting/genlog
- ! Changes INSTALL
+ ! toke.c
____________________________________________________________________________
-[ 1191] By: gsar on 1998/06/22 15:56:27
- Log: tweak win32 makefiles for PERL_OBJECT build
+[ 4662] By: gsar on 1999/12/07 23:16:21
+ Log: typos in change#4546
Branch: perl
- ! win32/Makefile win32/makefile.mk
+ ! ext/B/B.xs ext/B/B/Bytecode.pm ext/B/B/C.pm sv.c
____________________________________________________________________________
-[ 1190] By: gsar on 1998/06/22 04:06:02
- Log: backout change#1178 as it was dependent on an unapplied patch,
- fix filespec.t to know its @INC
+[ 4661] By: gsar on 1999/12/07 09:33:50
+ Log: typos in change#4660
Branch: perl
- ! sv.c t/lib/filespec.t
+ ! embed.h embed.pl objXSUB.h perl.h perlapi.c pp_sys.c proto.h
____________________________________________________________________________
-[ 1189] By: gsar on 1998/06/22 03:47:43
- Log: eliminate use of tokenbuf in util.c
+[ 4660] By: gsar on 1999/12/06 23:42:55
+ Log: tweaks for building with -DUSE_ITHREADS on !WIN32 platforms;
+ fix bug where lc($readonly) could result in bogus errors
Branch: perl
- ! util.c
+ ! embed.h embed.pl iperlsys.h makedef.pl objXSUB.h perlapi.c
+ ! pp.c pp_sys.c proto.h sv.c
____________________________________________________________________________
-[ 1188] By: gsar on 1998/06/22 01:53:59
- Log: add patch that generates regnodes.h via regcomp.pl
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806212038.QAA29797@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] regcomp.h regnodes cleanup
- Date: Sun, 21 Jun 1998 16:38:21 -0400 (EDT)
+[ 4659] By: gsar on 1999/12/06 15:24:31
+ Log: allow IRIX 6.5 to build perl (from Helmut Jarausch
+ <jarausch@igpm.rwth-aachen.de>)
Branch: perl
- + regcomp.pl regcomp.sym regnodes.h
- ! MANIFEST Makefile.SH regcomp.h
+ ! perl.h
____________________________________________________________________________
-[ 1187] By: gsar on 1998/06/22 01:42:21
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806210145.VAA21629@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Avoid temporaries on recursion
- Date: Sat, 20 Jun 1998 21:45:03 -0400 (EDT)
+[ 4658] By: gsar on 1999/12/06 15:18:30
+ Log: fix for -Dp via $^D (suggested by Stephane Payrard
+ <stef@adnaccess.com>)
Branch: perl
- ! pp_ctl.c pp_hot.c
+ ! mg.c
____________________________________________________________________________
-[ 1186] By: gsar on 1998/06/22 01:14:14
- Log: merge relevant portions from maintbranch change#1155
+[ 4657] By: gsar on 1999/12/06 06:50:01
+ Log: change#4641 needs perldiag.pod edit
Branch: perl
- ! lib/Math/BigFloat.pm op.c pod/perlfunc.pod pod/perlop.pod
- ! pod/perlrun.pod pp_hot.c
+ - lib/unicode/UnicodeData-Latest.txt
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 1185] By: gsar on 1998/06/22 00:59:28
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806210827.EAA26322@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Zero-length matching bug
- Date: Sun, 21 Jun 1998 04:27:16 -0400 (EDT)
+[ 4656] By: gsar on 1999/12/06 01:36:56
+ Log: Makefile tweak for change#4649
Branch: perl
- ! regexec.c t/op/pat.t
+ ! Makefile.SH
____________________________________________________________________________
-[ 1184] By: gsar on 1998/06/22 00:57:27
- Log: fix alignment issues in malloc.c on 64-bit platforms (via private mail)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806170844.EAA24584@monk.mps.ohio-state.edu>
- Subject: Re: _67 not okay
- Date: Wed, 17 Jun 1998 04:44:26 -0400 (EDT)
+[ 4655] By: gsar on 1999/12/05 17:23:57
+ Log: change#4653 was missing a patch reject
Branch: perl
- ! malloc.c
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 1183] By: gsar on 1998/06/22 00:53:37
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806210727.DAA24072@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Test study/re/
- Date: Sun, 21 Jun 1998 03:27:13 -0400 (EDT)
+[ 4654] By: gsar on 1999/12/05 11:41:04
+ Log: windows build tweaks for Borland compiler
Branch: perl
- ! t/op/pat.t
+ ! win32/makefile.mk win32/perlhost.h win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 1182] By: gsar on 1998/06/21 21:25:07
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806210430.AAA21818@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] $^R documented
- Date: Sun, 21 Jun 1998 00:30:48 -0400 (EDT)
+[ 4653] By: gsar on 1999/12/05 11:07:37
+ Log: applied somewhat modified version of suggested patch
+ From: "Benjamin Stuhl" <sho_pi@hotmail.com>
+ Date: Thu, 18 Nov 1999 18:45:27 PST
+ Message-ID: <19991119024527.72749.qmail@hotmail.com>
+ Subject: [PATCH 5.005_62] Perl on Win95, Mark IIB
Branch: perl
- ! pod/perlre.pod pod/perlvar.pod
+ + win32/PerlCRT.def win32/gstartup.c win32/oldnames.def
+ ! MANIFEST ext/SDBM_File/Makefile.PL lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MM_Win32.pm win32/config_sh.PL win32/genmk95.pl
+ ! win32/makefile.mk win32/win32.h
____________________________________________________________________________
-[ 1181] By: gsar on 1998/06/21 21:23:41
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806210111.VAA17752@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Re docs
- Date: Sat, 20 Jun 1998 21:11:37 -0400 (EDT)
+[ 4652] By: gsar on 1999/12/05 09:24:45
+ Log: From: Mike Hopkirk (hops) <hops@scoot.pdev.sco.com>
+ Date: Thu, 4 Nov 1999 16:34:23 -0800 (PST)
+ Message-Id: <199911050034.QAA06499@scoot.pdev.sco.com>
+ Subject: [ID 19991104.005] modified hints file for UnixWare7 ( svr5)
Branch: perl
- ! pod/perlop.pod pod/perlre.pod
+ ! Changes hints/svr5.sh
____________________________________________________________________________
-[ 1180] By: gsar on 1998/06/21 21:22:16
- Log: adapted contents of message into comments in malloc.c and INSTALL
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806162240.SAA23597@monk.mps.ohio-state.edu>
- Subject: [5.004_67] malloc.c -Defines
- Date: Tue, 16 Jun 1998 18:40:41 -0400 (EDT)
+[ 4651] By: gsar on 1999/12/05 09:01:19
+ Log: on dosish platforms, avoid infinite recursion in File::Path::mkpath()
+ when given non-existent drive names
Branch: perl
- ! INSTALL malloc.c
+ ! lib/File/Path.pm
____________________________________________________________________________
-[ 1179] By: gsar on 1998/06/21 07:26:35
- Log: applied patch, with edits to the prose
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806201936.PAA17499@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Error variables compared
- Date: Sat, 20 Jun 1998 15:36:14 -0400 (EDT)
+[ 4650] By: gsar on 1999/12/05 08:47:11
+ Log: windows build tweaks for change#4649
Branch: perl
- ! pod/perlvar.pod
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 1178] By: gsar on 1998/06/21 07:07:16
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806200104.VAA11343@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] print study /re/ broken
- Date: Fri, 19 Jun 1998 21:04:54 -0400 (EDT)
+[ 4649] By: gsar on 1999/12/05 07:49:28
+ Log: make File::Glob::glob() the default for CORE::glob()
+ (old csh glob can still be had with -DPERL_EXTERNAL_GLOB)
Branch: perl
- ! sv.c
+ ! Makefile.SH op.c pod/perldelta.pod win32/Makefile
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 1177] By: gsar on 1998/06/21 07:06:10
- Log: applied patch, tweaked wording
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806200838.EAA13992@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Documentation patch for malloc
- Date: Sat, 20 Jun 1998 04:38:07 -0400 (EDT)
+[ 4648] By: gsar on 1999/12/05 00:33:34
+ Log: fix bug in processing L<> tags (from j.vavruska@post.cz)
Branch: perl
- ! malloc.c pod/perldiag.pod
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 1176] By: gsar on 1998/06/21 07:00:30
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806200829.EAA13974@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Cosmetic malloc patch
- Date: Sat, 20 Jun 1998 04:29:00 -0400 (EDT)
+[ 4647] By: gsar on 1999/12/05 00:14:01
+ Log: remove outdated entry
Branch: perl
- ! malloc.c
+ ! pod/perltrap.pod
____________________________________________________________________________
-[ 1175] By: gsar on 1998/06/21 06:58:37
- Log: Message-Id: <3.0.5.32.19980619160057.032e7480@ous.edu>
- Date: Fri, 19 Jun 1998 16:00:57 -0700
- From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: [PATCH 5.004_67] fixup patches for VMS
+[ 4646] By: gsar on 1999/12/04 22:48:51
+ Log: s/block/loop block/ in diagnostics about next, last, redo
Branch: perl
- ! ext/SDBM_File/sdbm/Makefile.PL t/lib/filecopy.t t/op/defins.t
- ! t/op/taint.t vms/test.com vms/vms.c
+ ! pod/perldiag.pod pp_ctl.c t/op/runlevel.t t/pragma/warn/pp_ctl
____________________________________________________________________________
-[ 1174] By: gsar on 1998/06/21 06:55:18
- Log: applied VMS patch from Dan Sugalski
- Date: Fri, 19 Jun 1998 15:36:34 -0700
- From: SYSTEM@cedar.osshe.edu
- Message-Id: <980619153634.2063ee12@cedar.osshe.edu>
- Subject: [PATCH 5.004_67] Enhancements to the VMS configuration procedures
+[ 4645] By: gsar on 1999/12/04 22:25:32
+ Log: readability tweak suggested by GRommel@sears.com
Branch: perl
- ! configure.com lib/ExtUtils/MM_VMS.pm perl.h
- ! vms/descrip_mms.template vms/gen_shrfls.pl
- ! vms/subconfigure.com
+ ! pp.c
____________________________________________________________________________
-[ 1173] By: gsar on 1998/06/21 06:51:38
- Log: applied patch, modified logic to avoid reentering lexer at compile-time
- Message-ID: <19980619113104.S9711@asic.sc.ti.com>
- Date: Fri, 19 Jun 1998 11:31:04 -0500
- From: Graham Barr <gbarr@ti.com>
- Subject: Re: [PATCH perl5.004_67] Add Errno in ext/
- Branch: perl
- ! Configure MANIFEST Makefile.SH ext/util/make_ext gv.c
- ! lib/English.pm
-____________________________________________________________________________
-[ 1172] By: gsar on 1998/06/21 06:27:57
- Log: applied patch, along with many changes:
- - ipfoo.h headers have been coalesced along with perlfoo.h into
- iperlsys.h
- - win32/cp*.h have been combined in perlhost.h
- - CPerlObj::PerlParse() takes an extra xsinit arg
- - tweaks to get dl_win32.xs compiling again w/ PERL_OBJECT
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Message-Id: <000001bd9b8c$0417fe90$a32fa8c0@tau.Active>
- Subject: RE: [PATCH 5.004_67] Fixes for broken MS compiler
- Date: Fri, 19 Jun 1998 10:59:50 -0700
- Branch: perl
- + iperlsys.h win32/perlhost.h
- - ipdir.h ipenv.h iplio.h ipmem.h ipproc.h ipsock.h ipstdio.h
- - perldir.h perlenv.h perlio.h perllio.h perlmem.h perlproc.h
- - perlsock.h
- ! MANIFEST mg.h op.h perl.h perlio.c proto.h util.c
- ! win32/Makefile win32/dl_win32.xs win32/makefile.mk
- ! win32/runperl.c win32/win32.h
+[ 4644] By: gsar on 1999/12/04 22:05:00
+ Log: Configure tweak from Peter Prymmer
+ Branch: perl
+ ! Configure
____________________________________________________________________________
-[ 1171] By: gsar on 1998/06/21 00:44:42
- Log: Date: Fri, 19 Jun 1998 07:55:19 -0600 (MDT)
- From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Subject: Re: PATCH _67 (Doc) perlop.pod
- Message-ID: <Pine.LNX.3.96.980619075203.13326A-100000@perrin.dimensional.com>
+[ 4643] By: gsar on 1999/12/04 21:55:27
+ Log: make weak keyword check look for defined(&lock), not
+ merely defined(*lock)
Branch: perl
- ! pod/perlop.pod
+ ! toke.c
____________________________________________________________________________
-[ 1170] By: gsar on 1998/06/21 00:43:06
- Log: a tweaked version of:
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Subject: [PATCH 5.004_67] Win32 using PerlCRT.dll
- Date: Wed, 17 Jun 1998 20:25:51 -0700
- Message-ID: <001b01bd9a68$cb752410$a32fa8c0@tau.Active>
+[ 4642] By: gsar on 1999/12/04 21:11:51
+ Log: make eof() open ARGV if it isn't open already; also fixes bug
+ where eof() would operate on any last-read filehandle, not
+ just ARGV
Branch: perl
- ! lib/ExtUtils/MM_Win32.pm win32/Makefile win32/makefile.mk
+ ! pp_sys.c
____________________________________________________________________________
-[ 1169] By: gsar on 1998/06/21 00:10:18
- Log: added patch, regen headers
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806190227.WAA07371@monk.mps.ohio-state.edu>
- Subject: Re: Ilya's patches
- Date: Thu, 18 Jun 1998 22:27:31 -0400 (EDT)
+[ 4641] By: gsar on 1999/12/04 04:42:25
+ Log: make uninitialized value warnings report opcode
Branch: perl
- ! ObjXSub.h embedvar.h interp.sym intrpvar.h toke.c
+ ! doio.c embed.h embed.pl global.sym objXSUB.h opcode.h
+ ! opcode.pl perl.h perlapi.c pp.c pp_hot.c proto.h sv.c
+ ! t/op/misc.t t/pragma/warn/1global t/pragma/warn/2use
+ ! t/pragma/warn/3both t/pragma/warn/4lint t/pragma/warn/7fatal
+ ! t/pragma/warn/doio t/pragma/warn/pp t/pragma/warn/pp_hot
+ ! t/pragma/warn/sv
____________________________________________________________________________
-[ 1168] By: gsar on 1998/06/21 00:05:01
- Log: Date: Thu, 18 Jun 1998 23:37:32 -0700 (PDT)
- From: Tom Phoenix <rootbeer@teleport.com>
- Subject: [PATCH] docs creating files via open
- Message-ID: <Pine.GSO.3.96.980618231856.17544S-100000@user2.teleport.com>
+[ 4640] By: gsar on 1999/12/04 02:40:44
+ Log: provide explicit functions timegm_nocheck() and timelocal_nocheck()
+ that don't do range checking
Branch: perl
- ! pod/perlfunc.pod
+ ! lib/Time/Local.pm
____________________________________________________________________________
-[ 1167] By: gsar on 1998/06/21 00:03:34
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806172151.RAA28441@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_67] Better version of malloc improver
- Date: Wed, 17 Jun 1998 17:51:54 -0400 (EDT)
+[ 4639] By: gsar on 1999/12/04 01:00:49
+ Log: better implementation of change#3326; open(local $foo,...) now
+ allowed in addition to any uninitialized variable, for consistency
+ with how autovivification works elsewhere; add code to use the
+ variable name as the name of the handle for simple variables, so
+ that diagnostics report the handle: "... at - line 1, <$foo> line 10."
Branch: perl
- ! malloc.c
+ ! op.c pod/perldelta.pod pp.c t/io/open.t
____________________________________________________________________________
-[ 1166] By: gsar on 1998/06/20 23:59:23
- Log: enhance perlre.pod to say C<)> can't appear in a (?#...) comment
+[ 4638] By: gsar on 1999/12/03 21:20:00
+ Log: pod nits
Branch: perl
- ! pod/perlre.pod
+ ! pod/perlfunc.pod pod/perlrun.pod
____________________________________________________________________________
-[ 1165] By: gsar on 1998/06/20 23:47:09
- Log: added patch, tweaked missed files, excised comment that doesn't really
- belong in the sources
- From: joshua.pritikin@db.com
- Date: Mon, 15 Jun 1998 10:03:37 -0400
- Message-Id: <H00000e500072c63@MHS>
- Subject: [PATCH 5.004_57] tied hash slice & do_kv cleanup
+[ 4637] By: gsar on 1999/12/03 08:59:04
+ Log: change#4431 was flawed
Branch: perl
- ! ObjXSub.h av.c doop.c embed.h global.sym objpp.h pp.c proto.h
- ! t/op/avhv.t
+ ! Makefile.SH
____________________________________________________________________________
-[ 1164] By: gsar on 1998/06/20 23:29:09
- Log: add File-Spec-0.6 from CPAN
+[ 4636] By: gsar on 1999/12/03 07:59:52
+ Log: pod embellishments from Nathan Torkington
Branch: perl
- + lib/File/Spec.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
- + lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
- + lib/File/Spec/Win32.pm t/lib/filespec.t
- ! MANIFEST
+ ! pod/perlfaq2.pod pod/perlhack.pod
____________________________________________________________________________
-[ 1163] By: gsar on 1998/06/20 23:15:41
- Log: tweaks to allow both mingw32{gcc-2.8.1,egcs-1.0.2} build and test
+[ 4635] By: gsar on 1999/12/03 07:56:04
+ Log: perlfaq4 typo (from Jeff Pinyan <jeffp@crusoe.net>)
Branch: perl
- ! ext/POSIX/POSIX.xs win32/Makefile win32/makefile.mk
+ ! pod/perlfaq4.pod
____________________________________________________________________________
-[ 1162] By: gsar on 1998/06/20 21:48:32
- Log: manual integration of all outstanding ansi branch stuff into mainline
+[ 4634] By: gsar on 1999/12/03 07:47:47
+ Log: test tweak for VMS (from Craig A. Berry)
Branch: perl
- ! ext/POSIX/POSIX.xs lib/ExtUtils/MM_Win32.pm t/op/ipcsem.t
- ! win32/config.gc win32/dl_win32.xs win32/makefile.mk
- ! win32/win32.h
+ ! t/io/nargv.t
____________________________________________________________________________
-[ 1161] By: gsar on 1998/06/20 21:12:01
- Log: undo goofed change 1157 (backed out the fix instead of keeping it)
+[ 4633] By: gsar on 1999/12/03 07:44:52
+ Log: patchls tweak from Andreas Koenig
Branch: perl
- ! utils/perldoc.PL
+ ! Porting/patchls
____________________________________________________________________________
-[ 1160] By: nick on 1998/06/20 21:05:51
- Log: Patches to build with EGCS-1.0.2 Mingw32 port.
- Branch: ansiperl
- ! ext/POSIX/POSIX.xs win32/config.gc win32/config_H.gc
- ! win32/dl_win32.xs win32/makefile.mk win32/win32.h
+[ 4632] By: gsar on 1999/12/03 07:42:23
+ Log: don't mess with the umask()
+ Branch: perl
+ ! installhtml installman installperl lib/ExtUtils/Install.pm
+ ! lib/ExtUtils/Manifest.pm
____________________________________________________________________________
-[ 1159] By: gsar on 1998/06/20 02:51:35
- Log: cleanup installation of utilities on win32
+[ 4631] By: gsar on 1999/12/03 06:52:50
+ Log: support -a switch to append bytecode to an existing file and make
+ perlcc use it (from Tom Hughes <tom@compton.nu>)
Branch: perl
- ! installperl pod/Makefile win32/Makefile win32/makefile.mk
- ! win32/pod.mak
+ ! ext/B/B/Bytecode.pm utils/perlcc.PL
____________________________________________________________________________
-[ 1158] By: gsar on 1998/06/20 02:50:35
- Log: intuit @INC pathnames from exe location only if dll location
- is unknown (ensures that multiple executables will coexist)
+[ 4630] By: gsar on 1999/12/03 06:46:16
+ Log: document incompatible perl4 vec() vs bitwise ops interaction trap
+ (from Tom Phoenix)
Branch: perl
- ! win32/win32.c
+ ! pod/perltrap.pod
____________________________________________________________________________
-[ 1157] By: gsar on 1998/06/20 02:48:34
- Log: make perldoc ignore null files (it tried to open() them)
+[ 4629] By: gsar on 1999/12/03 06:40:15
+ Log: use PerlIO abstraction rather than straight stdio (from
+ Chip Salzenberg)
Branch: perl
- ! utils/perldoc.PL
+ ! ext/ByteLoader/ByteLoader.xs
____________________________________________________________________________
-[ 1156] By: gsar on 1998/06/19 21:18:47
- Log: fix perldoc to ignore unfound null filenames
+[ 4628] By: gsar on 1999/12/03 06:15:54
+ Log: avoid warning in IO::Select::exists() if socket doesn't exist
Branch: perl
- ! utils/perldoc.PL
+ ! ext/IO/lib/IO/Select.pm
____________________________________________________________________________
-[ 1155] By: TimBunce on 1998/06/19 18:47:57
- Log: Assorted patches:
-
- ------ BUILD PROCESS ------
-
- Title: "Clarify varargs issues in INSTALL docs"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980603125427.8559C-100000@newton.phys>
- Files: INSTALL
-
- ------ CORE LANGUAGE ------
-
- Title: "Further fixes for updated SysV IPC support"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199805211644.TAA15139@alpha.hut.fi>
- Files: Configure perl.h doio.c
-
- Title: "Fixed SEGV caused by bug in pp_hot.c:pp_sassign()"
- From: Andrew Bettison <andrewb@zip.com.au>
- Msg-ID: <m0ykMQx-000OQCC@headroom.zip.com.au>
- Files: pp_hot.c
-
- Title: "Invalidate method cache on C<local *subname>"
- From: Chip Salzenberg <chip@perl.org>
- Msg-ID: <19980604134731.D24343@perlsupport.com>
- Files: scope.c t/op/method.t
-
- Title: "fix uninitialized cv variable in op.c"
- From: joshua.pritikin@db.com
- Msg-ID: <H00000e50005af05@MHS>
- Files: op.c
-
- Title: "fix for undef as last arg to setsockopt"
- From: Graham Barr <gbarr@ti.com>
- Msg-ID: <19980603112219.B7638@asic.sc.ti.com>
- Files: pp_sys.c
-
- Title: "Fix -i when @ARGV is empty"
- From: Chip Salzenberg <chip@perl.org>, Gurusamy Sarathy
- <gsar@engin.umich.edu>, Ilya Zakharevich
- <ilya@math.ohio-state.edu>, Tim.Bunce@ig.co.uk (Tim Bunce)
- Msg-ID: <19980606184942.A4583@perlsupport.com>,
- <199806070029.UAA18709@monk.mps.ohio-state.edu>,
- <199806071817.OAA28141@aatma.engin.umich.edu>,
- <199806191549.QAA16376@toad.ig.co.uk>
- Files: pp_hot.c
-
- ------ DOCUMENTATION ------
-
- Title: "Discrepancy between perlop.pod and m// operator docs"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980526092614.27437B-100000@user2.teleport.com>
- Files: pod/perlop.pod
-
- Title: "Doc addition for perlfunc entry for system()"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>, Mike Fletcher
- <fletch@phydeaux.org>
- Msg-ID: <199806011908.PAA31069@dewdrop2.mindspring.com>,
- <199806012057.QAA26830@monk.mps.ohio-state.edu>
- Files: pod/perlfunc.pod
-
- Title: "Clarify effects of using quotes with m operator"
- From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Msg-ID: <Pine.LNX.3.96.980617111641.25631B-100000@perrin.dimensional.com>
- Files: pod/perlop.pod
-
- Title: "Document -i with STDIN"
- From: joshua.pritikin@db.com
- Msg-ID: <H00000e50006a84a@MHS>
- Files: pod/perlrun.pod
-
- ------ EXTENSIONS ------
-
- Title: "Fix Liblist.pm to tolerate backslashen in paths"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199806011954.PAA10900@aatma.engin.umich.edu>
- Files: lib/ExtUtils/Liblist.pm
-
- ------ LIBRARY ------
-
- Title: "Typo fix for Math::BogFloat"
- From: Mike Stok <mike@stok.co.uk>
- Msg-ID: <Pine.LNX.3.96.980605101623.982F-100000@stok.co.uk>
- Files: lib/Math/BigFloat.pm
-
- ------ PORTABILITY - GENERAL ------
-
- Title: "Add docs about types of diff to Porting/patching.pod"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199806090105.VAA20005@aatma.engin.umich.edu>
- Files: Porting/patching.pod
-
- Title: "Set dont_use_nlink for PowerMAX OS 4.2"
- From: Tom Horsley <Tom.Horsley@mail.ccur.com>
- Msg-ID: <199806161354.NAA21316@cleo.ssd.hcsc.com>
- Files: hints/powerux.sh
-
- Title: "Assorted improvements to hints/solaris_2.sh"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980527135845.26608K-100000@newton.phys>
- Files: hints/solaris_2.sh
- Branch: maint-5.004/perl
- ! Configure INSTALL Porting/patching.pod doio.c hints/powerux.sh
- ! hints/solaris_2.sh lib/ExtUtils/Liblist.pm
- ! lib/Math/BigFloat.pm op.c perl.h pod/perlfunc.pod
- ! pod/perlop.pod pod/perlrun.pod pp_hot.c pp_sys.c scope.c
- ! t/op/method.t
+[ 4627] By: gsar on 1999/12/03 06:05:19
+ Log: two small patches from Peter Prymmer <pvhp@forte.com>
+ Branch: perl
+ ! makedepend.SH win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 1154] By: gsar on 1998/06/19 17:22:23
- Log: update repository copy of Asmdata.pm after `perl bytecode.pl`
+[ 4626] By: gsar on 1999/12/03 05:36:38
+ Log: From: Peter Prymmer <pvhp@forte.com>
+ Date: Thu, 25 Nov 1999 21:06:19 -0800 (PST)
+ Message-Id: <199911260506.VAA17230@brio.forte.com>
+ Subject: [PATCH: 5.005_62] implement /[:ascii:]/ on ebcdic machines
Branch: perl
- ! ext/B/B/Asmdata.pm regcomp.c
+ ! regcomp.c
____________________________________________________________________________
-[ 1153] By: nick on 1998/06/19 17:21:21
- Log: Use libxxx.a for -lxxx with GCC
- Branch: ansiperl
- ! lib/ExtUtils/MM_Win32.pm win32/config.gc win32/config_H.gc
- ! win32/makefile.mk
+[ 4625] By: gsar on 1999/12/03 05:20:21
+ Log: Windows build tweaks due to change#4623
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk win32/perlhost.h
____________________________________________________________________________
-[ 1152] By: TimBunce on 1998/06/19 17:08:18
- Log: Title: Tom's jumbo doc patch
- From: Tom Christiansen <tchrist@chthon.perl.com>
- Msg-Id: <199806140419.WAA20549@chthon.perl.com>
- Files: pod/perl.pod pod/perlbook.pod pod/perldata.pod pod/perldsc.pod
- pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
- pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
- pod/perlfaq9.pod pod/perlform.pod pod/perlfunc.pod
- pod/perlipc.pod pod/perllocale.pod pod/perllol.pod
- pod/perlmod.pod pod/perlmodlib.pod pod/perlobj.pod
- pod/perlop.pod pod/perlre.pod pod/perlref.pod
- pod/perlrun.pod pod/perlsec.pod pod/perlsub.pod
- pod/perlsyn.pod pod/perltie.pod pod/perltoot.pod
- pod/perlvar.pod
- Branch: maint-5.004/perl
- ! pod/perl.pod pod/perlbook.pod pod/perldata.pod pod/perldsc.pod
- ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
- ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
- ! pod/perlfaq9.pod pod/perlform.pod pod/perlfunc.pod
- ! pod/perlipc.pod pod/perllocale.pod pod/perllol.pod
- ! pod/perlmod.pod pod/perlmodlib.pod pod/perlobj.pod
- ! pod/perlop.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
- ! pod/perlsec.pod pod/perlsub.pod pod/perlsyn.pod
- ! pod/perltie.pod pod/perltoot.pod pod/perlvar.pod
+[ 4624] By: gsar on 1999/12/03 04:58:30
+ Log: add missing file
+ Branch: perl
+ + ext/DynaLoader/XSLoader_pm.PL
____________________________________________________________________________
-[ 1151] By: nick on 1998/06/19 15:38:28
- Log: Resolve latest
- Branch: ansiperl
- !> av.c embed.h embedvar.h ext/Socket/Socket.xs global.sym
- !> hints/powerux.sh mg.c perl.h pod/perlsub.pod pp_ctl.c proto.h
- !> sv.c t/TEST
+[ 4623] By: gsar on 1999/12/03 04:47:03
+ Log: applied suggested patch; removed $VERSION = $VERSION hack
+ (change#4043 fixed the need for that)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 16 Nov 1999 01:50:31 EST
+ Message-Id: <199911160650.BAA18874@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_62] XSLoader.pm
+ Branch: perl
+ ! MANIFEST ext/B/B.pm ext/ByteLoader/ByteLoader.pm
+ ! ext/DB_File/DB_File.pm ext/Data/Dumper/Dumper.pm
+ ! ext/Devel/DProf/DProf.pm ext/Devel/Peek/Peek.pm
+ ! ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/Makefile.PL
+ ! ext/DynaLoader/dlutils.c ext/Fcntl/Fcntl.pm
+ ! ext/File/Glob/Glob.pm ext/GDBM_File/GDBM_File.pm ext/IO/IO.pm
+ ! ext/NDBM_File/NDBM_File.pm ext/ODBM_File/ODBM_File.pm
+ ! ext/Opcode/Opcode.pm ext/POSIX/POSIX.pm
+ ! ext/SDBM_File/SDBM_File.pm ext/Socket/Socket.pm
+ ! ext/Thread/Thread.pm ext/attrs/attrs.pm ext/re/re.pm
+ ! lib/AutoLoader.pm lib/FindBin.pm lib/Getopt/Std.pm
____________________________________________________________________________
-[ 1150] By: gsar on 1998/06/18 20:43:07
- Log: Date: Tue, 16 Jun 1998 13:54:17 GMT
- Message-Id: <199806161354.NAA21316@cleo.ssd.hcsc.com>
- From: Tom Horsley <Tom.Horsley@mail.ccur.com>
- Subject: [PATCH] perl5.004 hints file (maint and dev paths)
+[ 4622] By: gsar on 1999/12/03 04:02:39
+ Log: revert change#4618 (breaks C<$_ = 'A:B'; s/^[a-z]:/x/>)
Branch: perl
- ! hints/powerux.sh
+ ! Changes embed.h embed.pl perl.h proto.h regcomp.c regcomp.h
____________________________________________________________________________
-[ 1149] By: gsar on 1998/06/18 20:41:30
- Log: hand apply whitespace-mutiliated patch
- From: joshua.pritikin@db.com
- Date: Mon, 15 Jun 1998 09:21:36 -0400
- Message-Id: <H00000e50007289b@MHS>
- Subject: [PATCH 5.004_67] SvREADONLY for av_clear
+[ 4621] By: gsar on 1999/12/02 22:24:53
+ Log: caveat about thread-safety of extensions
Branch: perl
- ! av.c
+ ! pod/perlfork.pod
____________________________________________________________________________
-[ 1148] By: gsar on 1998/06/18 20:33:59
- Log: hand apply whitespace-mutiliated and reversed patch
- Date: Tue, 16 Jun 1998 16:31:40 -0400
- From: Les Peters <lpeters@aol.net>
- Message-Id: <199806162031.QAA08202@ds9>
- Subject: [PATCH 5.004_67] Socket.xs tweak for IRIX 6.3
+[ 4620] By: gsar on 1999/12/02 20:31:02
+ Log: XS documentation patches suggested by Ilya, severally adjusted
Branch: perl
- ! ext/Socket/Socket.xs
+ ! pod/perlxs.pod pod/perlxstut.pod
____________________________________________________________________________
-[ 1147] By: gsar on 1998/06/18 20:26:59
- Log: close child pipe in t/TEST, other cosmetic tweaks
+[ 4619] By: gsar on 1999/12/02 17:52:50
+ Log: re-add missing Unicode database master
Branch: perl
- ! t/TEST
+ + lib/unicode/Unicode.300
____________________________________________________________________________
-[ 1146] By: gsar on 1998/06/18 19:37:41
- Log: back out problematic change#1105, tweak perlsub.pod
+[ 4618] By: gsar on 1999/12/02 06:56:18
+ Log: applied suggested patch with prototype changes
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 23 Nov 1999 22:55:55 EST
+ Message-Id: <199911240355.WAA23033@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_62] First char cognizance
Branch: perl
- ! embed.h embedvar.h global.sym mg.c perl.h pod/perlsub.pod
- ! pp_ctl.c proto.h sv.c
+ ! embed.h embed.pl perl.h proto.h regcomp.c regcomp.h
____________________________________________________________________________
-[ 1145] By: nick on 1998/06/18 19:31:07
- Log: Integrate and resolve -at mainline to ansiperl prior to Ming32 hacking
- Branch: ansiperl
- +> configure.com ext/DB_File/dbinfo
- +> ext/DynaLoader/DynaLoader_pm.PL t/base/rs.t
- +> t/op/regexp_noamp.t vms/descrip_mms.template vms/munchconfig.c
- +> vms/subconfigure.com
- - ext/DynaLoader/DynaLoader.pm.PL vms/config.vms vms/descrip.mms
- - vms/fndvers.com
- !> (integrate 499 files)
+[ 4617] By: gsar on 1999/12/02 06:04:57
+ Log: fixes for bugs in change#4586 and OS/2 pod tweak, from Ilya
+ Branch: perl
+ ! os2/OS2/REXX/REXX.pm regexec.c t/op/re_tests
____________________________________________________________________________
-[ 1144] By: gsar on 1998/06/18 16:35:11
- Log: fix spurious cxstack_max init that trampled memory
+[ 4616] By: gsar on 1999/12/02 04:30:22
+ Log: various documentation tweaks suggested by M. J. T. Guy
Branch: perl
- ! perl.c
+ ! INSTALL lib/strict.pm pod/perlfunc.pod pod/perlsyn.pod
____________________________________________________________________________
-[ 1143] By: gsar on 1998/06/18 16:33:01
- Log: fix memory leaks and uninitialized memory accesses found by Purify
+[ 4615] By: gsar on 1999/12/02 04:17:43
+ Log: various File::Glob fixes for DOSISH platforms
+ From: "Moore, Paul" <Paul.Moore@uk.origin-it.com>
+ Date: Tue, 02 Nov 1999 11:11:25 GMT
+ Message-Id: <714DFA46B9BBD0119CD000805FC1F53BDC38E3@UKRUX002.rundc.uk.origin-it.com>
+ Subject: File::Glob again. Final patch, honest!
Branch: perl
- ! doio.c perl.c regexec.c sv.c
+ + t/lib/glob-case.t
+ ! MANIFEST ext/File/Glob/Changes ext/File/Glob/Glob.pm
+ ! ext/File/Glob/Glob.xs ext/File/Glob/bsd_glob.c
+ ! ext/File/Glob/bsd_glob.h op.c t/lib/glob-global.t
____________________________________________________________________________
-[ 1142] By: gsar on 1998/06/18 16:28:48
- Log: fix off-by-one that trampled memory in re_croak2()
+[ 4614] By: gsar on 1999/12/02 03:42:55
+ Log: allow XSUBs and prototyped subroutines to be used with sort() (tweaked
+ variant of patch suggested by Peter Haworth <pmh@edison.ioppublishing.com>)
Branch: perl
- ! regcomp.c
+ ! pod/perldelta.pod pod/perlfunc.pod pp_ctl.c t/op/sort.t
____________________________________________________________________________
-[ 1141] By: gsar on 1998/06/18 16:26:59
- Log: fix AutoLoader to do the right thing when there are relative paths
- in @INC
+[ 4613] By: gsar on 1999/12/02 01:59:19
+ Log: ignore yet another known scalar leak
Branch: perl
- ! lib/AutoLoader.pm
+ ! t/pragma/warn/regcomp
____________________________________________________________________________
-[ 1140] By: gsar on 1998/06/18 16:22:47
- Log: fix Makefile.SH typo
+[ 4612] By: gsar on 1999/12/02 01:15:02
+ Log: avoid potential stack extension bug in pp_unpack() (spotted by Ilya)
Branch: perl
- ! Makefile.SH
+ ! pp.c
____________________________________________________________________________
-[ 1139] By: gsar on 1998/06/17 18:06:16
- Log: 5.004_67 niggles
+[ 4611] By: gsar on 1999/12/02 00:31:43
+ Log: a somewhat tweaked version of suggested patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 27 Oct 1999 18:57:41 -0400 (EDT)
+ Message-Id: <199910272257.SAA29928@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_62] Another round of pack/vec docs patches
Branch: perl
- ! Makefile.SH op.c
-
-----------------
-Version 5.004_67
-----------------
-
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1138] By: gsar on 1998/06/15 10:09:27
- Log: up patchlevel.h to 67, other small tweaks
+[ 4610] By: gsar on 1999/12/01 19:09:31
+ Log: more accurate require() pseudocode (from James P. Williams
+ <James.P.Williams@USAHQ.UnitedSpaceAlliance.com>)
Branch: perl
- ! patchlevel.h pod/perlhist.pod pod/perltoc.pod vms/perly_c.vms
- ! win32/Makefile win32/config_H.bc win32/config_H.gc
- ! win32/config_H.vc win32/makefile.mk
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1137] By: gsar on 1998/06/15 09:08:57
- Log: tweaks to get PERL_OBJECT building again; passes tests
- Branch: perl
- ! ObjXSub.h objpp.h proto.h
-____________________________________________________________________________
-[ 1136] By: gsar on 1998/06/15 08:51:54
- Log: back out previous change (it breaks PERL_OBJECT)
- Branch: perl
- ! ObjXSub.h cc_runtime.h embed.h embedvar.h global.sym
- ! interp.sym intrpvar.h objpp.h perl.c perl.h pod/perldiag.pod
- ! pod/perlguts.pod pp_ctl.c proto.h scope.c scope.h util.c
-____________________________________________________________________________
-[ 1135] By: gsar on 1998/06/15 05:32:01
- Log: added patch, fixed typo, reworked documentation
- Message-Id: <H00000e500071aa3@MHS>
- Date: Sun, 14 Jun 1998 14:03:15 EDT
- From: joshua.pritikin@db.com
- Subject: [PATCH 5.004_66] JMPENV!
- Branch: perl
- ! ObjXSub.h cc_runtime.h embed.h embedvar.h global.sym
- ! interp.sym intrpvar.h objpp.h perl.c perl.h pod/perldiag.pod
- ! pod/perlguts.pod pp_ctl.c proto.h scope.c scope.h util.c
-____________________________________________________________________________
-[ 1134] By: gsar on 1998/06/15 04:07:18
- Log: various win32 odds and ends
- - added support for waitpid(), open2/open3, and a bugfix for kill()
- from Ronald Schmidt <RonaldWS@aol.com>
- - tweak testsuite mods of above
- - regenerate win32/config_H.?c
- - change kill() to win32_kill() and export it
- - coalesce common code in win32.c
- - add PerlProc_waitpid() and export win32_waitpid()
- result builds and passes on the three win32 compilers
- Branch: perl
- ! ipproc.h lib/IPC/Open3.pm perlproc.h t/lib/open2.t
- ! t/lib/open3.t util.c win32/config.bc win32/config.gc
- ! win32/config.vc win32/config_H.bc win32/config_H.gc
- ! win32/config_H.vc win32/makedef.pl win32/runperl.c
- ! win32/win32.c win32/win32iop.h
+[ 4609] By: gsar on 1999/12/01 18:43:49
+ Log: avoid "Callback called exit" error on intentional exit()
+ Branch: perl
+ ! embedvar.h intrpvar.h objXSUB.h perl.c perl.h pp_ctl.c
____________________________________________________________________________
-[ 1133] By: gsar on 1998/06/15 01:39:13
- Log: newer Getopt/Long.pm from public distribution cited in:
- Message-Id: <m2n2bgm8en.fsf@phoenix.squirrel.nl>
- Date: 14 Jun 1998 15:15:28 +0200
- From: Johan Vromans <jvromans@squirrel.nl>
- Subject: Getopt::Long version 2.17 released
+[ 4608] By: gsar on 1999/12/01 18:42:38
+ Log: find_byclass() prototype was incoherent
Branch: perl
- ! lib/Getopt/Long.pm
+ ! regexec.c
____________________________________________________________________________
-[ 1132] By: gsar on 1998/06/15 01:37:12
- Log: documentation update from tchrist
- Message-Id: <199806140419.WAA20549@chthon.perl.com>
- Date: Sat, 13 Jun 1998 22:19:32 MDT
- From: Tom Christiansen <tchrist@chthon.perl.com>
- Subject: doc patches
+[ 4607] By: gsar on 1999/12/01 05:45:10
+ Log: better documentation for goto &NAME (from M. J. T. Guy)
Branch: perl
- ! pod/perl.pod pod/perlbook.pod pod/perldata.pod pod/perldsc.pod
- ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
- ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
- ! pod/perlfaq9.pod pod/perlform.pod pod/perlfunc.pod
- ! pod/perlipc.pod pod/perllocale.pod pod/perllol.pod
- ! pod/perlmod.pod pod/perlmodlib.pod pod/perlobj.pod
- ! pod/perlop.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
- ! pod/perlsec.pod pod/perlsub.pod pod/perlsyn.pod
- ! pod/perltie.pod pod/perltoot.pod pod/perlvar.pod
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1131] By: gsar on 1998/06/14 19:33:36
- Log: Message-ID: <pz3edaedog.fsf@eeyore.ibcinc.com>
- From: Roderick Schertler <roderick@argon.org>
- Subject: [PATCH] Re: Exceptions in IPC::Open2
- Date: 12 Jun 1998 13:24:15 -0400
+[ 4606] By: gsar on 1999/12/01 05:33:14
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! lib/IPC/Open3.pm
+ +> lib/unicode/Jamo.txt lib/unicode/NamesList.html
+ +> lib/unicode/UCD300.html lib/unicode/Unicode3.html
+ - lib/unicode/Jamo-2.txt lib/unicode/Unicode.html
+ ! Changes
+ !> (integrate 210 files)
____________________________________________________________________________
-[ 1130] By: gsar on 1998/06/14 19:32:25
- Log: fixup MANIFEST
+[ 4605] By: gsar on 1999/12/01 05:15:27
+ Log: avoid PTR->IV cast warnings
Branch: perl
- ! MANIFEST
+ ! mg.c op.c scope.h
____________________________________________________________________________
-[ 1129] By: gsar on 1998/06/14 18:51:53
- Log: various win32 fixes
- - fixes that silence VC noises about dup exports, non-default libs, and
- unsupported *.def file directives
- - s/inplace/inplace_label/ malloc.c
- - update Config{usemymalloc} based on d_mymalloc
- - export Perl_*Vars
- - fix makefiles to not build miniperl.exe twice, and to make it properly
- when defaults are changed
+[ 4604] By: gsar on 1999/12/01 03:59:56
+ Log: email address changes
Branch: perl
- ! lib/ExtUtils/MM_Win32.pm lib/ExtUtils/Mksymlists.pm malloc.c
- ! win32/Makefile win32/config_sh.PL win32/makedef.pl
- ! win32/makefile.mk win32/perllib.c win32/win32.h
+ ! AUTHORS Changes Porting/genlog Porting/p4d2p Porting/p4desc
+ ! README.win32 ext/Data/Dumper/Dumper.pm lib/DB.pm
+ ! lib/File/DosGlob.pm lib/Math/Complex.pm lib/Math/Trig.pm
+ ! pod/perl5005delta.pod pod/perlport.pod t/op/runlevel.t
+ ! utils/perlbug.PL utils/perldoc.PL win32/bin/perlglob.pl
____________________________________________________________________________
-[ 1128] By: gsar on 1998/06/14 01:38:39
- Log: remove unused global `scrgv'
+[ 4603] By: gsar on 1999/12/01 03:45:13
+ Log: minor USE_ITHREADS tweaks
Branch: perl
- ! ObjXSub.h cygwin32/cw32imp.h embedvar.h perlvars.h
+ ! doio.c op.c op.h pp_hot.c pp_sys.c run.c win32/Makefile
+ ! win32/perllib.c win32/win32.h
____________________________________________________________________________
-[ 1127] By: nick on 1998/06/13 08:39:07
- Log: Move specialsv_list to embed.sym, regen embed*.h
- Branch: win32/perl
- ! embed.h embedvar.h global.sym interp.sym
+[ 4602] By: gsar on 1999/12/01 01:00:09
+ Log: more complete pseudo-fork() support for Windows
+ Branch: perl
+ + pod/perlfork.pod win32/perlhost.h win32/vdir.h win32/vmem.h
+ ! MANIFEST XSUB.h cop.h dump.c embed.h embed.pl embedvar.h
+ ! ext/B/B/CC.pm ext/Opcode/Opcode.xs global.sym globals.c
+ ! globvar.sym gv.c hv.c intrpvar.h iperlsys.h makedef.pl mg.c
+ ! mpeix/mpeixish.h objXSUB.h op.c op.h os2/os2ish.h perl.c
+ ! perl.h perlapi.c plan9/plan9ish.h pod/Makefile pod/buildtoc
+ ! pod/perl.pod pod/roffitall pp.c pp_ctl.c pp_hot.c pp_sys.c
+ ! proto.h regcomp.c run.c scope.c scope.h sv.c t/op/fork.t
+ ! toke.c unixish.h util.c vos/vosish.h win32/Makefile
+ ! win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32thread.h
____________________________________________________________________________
-[ 1126] By: gsar on 1998/06/12 07:23:06
- Log: From: jan.dubois@ibm.net (Jan Dubois)
- Subject: Re: execv in toke.c [PATCH]: win32 wrapper for _66
- Date: Thu, 11 Jun 1998 21:13:31 +0200
- Message-ID: <35842ac5.7883075@smtp1.ibm.net>
+[ 4601] By: gsar on 1999/12/01 00:45:38
+ Log: rudimentary support for remote debugging, from aeons ago (somewhat
+ modified)
+ From: Graham TerMarsch <grahamt@ActiveState.com>
+ Date: Sat, 12 Sep 1998 10:46:55 -0700
+ Message-ID: <35FAB38F.EA9AAC50@activestate.com>
+ Subject: Re: Patches to perl5db.pl to allow for remote debugging
Branch: perl
- ! win32/makedef.pl win32/win32.c win32/win32iop.h
+ ! lib/perl5db.pl
____________________________________________________________________________
-[ 1125] By: gsar on 1998/06/12 07:21:29
- Log: added patch, undo earlier workaround
- From: jan.dubois@ibm.net (Jan Dubois)
- Subject: Re: Why does saferealloc(NULL,size) croak? [PATCH] against _66
- Date: Thu, 11 Jun 1998 20:28:36 +0200
- Message-ID: <35831f69.4975644@smtp1.ibm.net>
+[ 4600] By: chip on 1999/11/19 21:16:00
+ Log: Document known limitations of fdopen() on some systems,
+ as they apply to open() and sysopen().
Branch: perl
- ! perl.c util.c
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 1124] By: gsar on 1998/06/12 07:16:12
- Log: hand-applied patch with wrapped lines
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Subject: [PATCH 5.004_66] Win32::Reg... bloat in Win32
- Date: Thu, 11 Jun 1998 11:06:33 -0700
- Message-ID: <000101bd9563$aae0c4c0$a32fa8c0@tau.Active>
+[ 4599] By: chip on 1999/11/19 17:20:19
+ Log: Undef printf before redirecting it to PerlIO_stdoutf.
+ (Avoids an irritating warning when compiling with PerlIO.)
Branch: perl
- ! win32/win32.c
+ ! perl.h
+____________________________________________________________________________
+[ 4598] By: jhi on 1999/11/22 21:30:17
+ Log: Small VMS nits from Craig A. Berry, <craig.berry@metamor.com>.
+ Branch: cfgperl
+ ! README.vms t/io/open.t
+____________________________________________________________________________
+[ 4597] By: jhi on 1999/11/21 16:21:21
+ Log: Replace #4596 with the change done in 5.005_03.
+ Branch: cfgperl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 4596] By: jhi on 1999/11/21 16:07:20
+ Log: Skip processing a file if the file to be opened is '-'
+ (can happen in UNICOS)
+ Branch: cfgperl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 4595] By: jhi on 1999/11/21 14:05:10
+ Log: VMS patches from Peter Prymmer.
+ Branch: cfgperl
+ ! doio.c mg.c taint.c vms/subconfigure.com vms/vms.c
+____________________________________________________________________________
+[ 4594] By: jhi on 1999/11/18 17:07:14
+ Log: The find_byclass prototype is already in proto.h.
+ Branch: cfgperl
+ ! regexec.c
+____________________________________________________________________________
+[ 4593] By: gsar on 1999/11/16 21:25:21
+ Log: typo in flag checks
+ Branch: utfperl
+ ! sv.h
+____________________________________________________________________________
+[ 4592] By: jhi on 1999/11/16 21:17:25
+ Log: Regen Configure.
+ Branch: cfgperl
+ ! Configure config_h.SH pp.c pp.h vms/subconfigure.com
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U
____________________________________________________________________________
-[ 1123] By: gsar on 1998/06/12 07:07:25
- Log: Date: Thu, 11 Jun 1998 12:40:05 -0400 (EDT)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: [PATCH 5.004_66] Config_66-01-02.diff
- Message-Id: <Pine.SUN.3.96.980611123857.18493K-100000@newton.phys>
+[ 4591] By: jhi on 1999/11/16 14:53:19
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> cop.h deb.c embed.h embed.pl global.sym lib/Pod/Checker.pm
+ !> lib/Pod/InputObjects.pm lib/Pod/Parser.pm lib/Pod/Select.pm
+ !> lib/Pod/Usage.pm makedef.pl objXSUB.h perl.c perlapi.c
+ !> pod/podchecker.PL pp_sys.c proto.h sv.c t/pod/poderrs.t
+ !> t/pod/poderrs.xr
+____________________________________________________________________________
+[ 4590] By: gsar on 1999/11/16 05:57:56
+ Log: Pod::Parser updates (v1.091) from Brad Appleton <bradapp@enteract.com>
Branch: perl
- ! Configure
+ ! lib/Pod/Checker.pm lib/Pod/InputObjects.pm lib/Pod/Parser.pm
+ ! lib/Pod/Select.pm lib/Pod/Usage.pm pod/podchecker.PL
+ ! t/pod/poderrs.t t/pod/poderrs.xr
____________________________________________________________________________
-[ 1122] By: gsar on 1998/06/12 07:06:02
- Log: Message-Id: <Pine.SUN.3.96.980611122249.18493J-100000@newton.phys>
- Date: Thu, 11 Jun 1998 12:27:15 -0400 (EDT)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: Re: [PATCH for _66] Makefile.SH problem on dos/djgpp
+[ 4589] By: gsar on 1999/11/15 18:47:34
+ Log: add a synchronous stub fork() for USE_ITHREADS to prove that a simple
+ C<if (fork()) { print "parent" } else { print "child" }> works on
+ Windows (incidentally running a cloned^2 interpreter :)
Branch: perl
- ! pod/checkpods.PL pod/pod2html.PL pod/pod2latex.PL
- ! pod/pod2man.PL utils/c2ph.PL utils/h2ph.PL utils/h2xs.PL
- ! utils/perlbug.PL utils/perlcc.PL utils/perldoc.PL
- ! utils/pl2pm.PL utils/splain.PL x2p/find2perl.PL x2p/s2p.PL
+ ! embed.h embed.pl global.sym makedef.pl objXSUB.h perlapi.c
+ ! pp_sys.c proto.h sv.c
____________________________________________________________________________
-[ 1121] By: gsar on 1998/06/12 07:01:20
- Log: a tweaked version of:
- Message-Id: <l03130300b1a6143078cd@[194.222.64.89]>
- Date: Fri, 12 Jun 1998 01:26:53 +0200
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Subject: Re: Misparsing s///x
+[ 4588] By: gsar on 1999/11/15 14:34:36
+ Log: cloning the stack (part 1)
Branch: perl
- ! pod/perlre.pod
+ ! cop.h deb.c perl.c sv.c
____________________________________________________________________________
-[ 1120] By: gsar on 1998/06/12 06:51:08
- Log: applied patch, with indentation tweaks
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806110803.EAA09149@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_66] Remove REG_ALIGN junk
- Date: Thu, 11 Jun 1998 04:03:58 -0400 (EDT)
+[ 4587] By: jhi on 1999/11/15 00:22:20
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes embed.h embed.pl embedvar.h global.sym intrpvar.h
+ !> makedef.pl objXSUB.h op.c perl.h perlapi.c proto.h run.c sv.c
+ !> win32/perllib.c
+____________________________________________________________________________
+[ 4586] By: jhi on 1999/11/14 21:17:26
+ Log: Ilya's "hopscotch" patch, reworked by Ilya to fit.
+ Branch: cfgperl
+ ! embed.h embed.pl embedvar.h proto.h regexec.c t/op/re_tests
+____________________________________________________________________________
+[ 4585] By: gsar on 1999/11/14 20:01:45
+ Log: tweak for win32 build
Branch: perl
- ! regcomp.c regcomp.h regexec.c
+ ! embed.h embed.pl op.c proto.h
____________________________________________________________________________
-[ 1119] By: gsar on 1998/06/11 17:42:07
- Log: make REG_INFTY default to something saner when sizeof(short) > 2
- Message-Id: <Pine.SUN.3.96.980611114241.18493H-100000@newton.phys>
- Date: Thu, 11 Jun 1998 11:50:07 EDT
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: Re: [PATCH for tests] Regexp fails on long string
+[ 4584] By: gsar on 1999/11/14 19:46:25
+ Log: cosmetic tweaks
Branch: perl
- ! regcomp.h
+ ! embed.h embed.pl embedvar.h global.sym intrpvar.h makedef.pl
+ ! objXSUB.h perl.h perlapi.c proto.h sv.c win32/perllib.c
+____________________________________________________________________________
+[ 4583] By: gsar on 1999/11/14 17:38:32
+ Log: fix problem pointer casts
+ Branch: perl
+ ! Changes run.c sv.c
+____________________________________________________________________________
+[ 4582] By: jhi on 1999/11/14 17:10:01
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> cop.h dump.c ext/Opcode/Opcode.xs gv.c op.c perl.c perly.c
+ !> perly.y pp_ctl.c pp_sys.c sv.c t/op/misc.t toke.c util.c
+ !> vms/perly_c.vms win32/perllib.c
+____________________________________________________________________________
+[ 4581] By: jhi on 1999/11/14 17:08:23
+ Log: The separation of 64-bitness and largefileness continues
+ (with a setback, see hpux.sh).
+ Branch: cfgperl
+ ! Configure MANIFEST config_h.SH hints/aix.sh hints/hpux.sh
+ ! hints/solaris_2.sh
+ Branch: metaconfig
+ ! U/threads/archname.U U/typedefs/lseektype.U
+ Branch: metaconfig/U/perl
+ ! fpossize.U use64bits.U uselfs.U
+____________________________________________________________________________
+[ 4580] By: jhi on 1999/11/14 13:26:41
+ Log: Another Unicode update.
+ Branch: cfgperl
+ + lib/unicode/Jamo.txt lib/unicode/NamesList.html
+ + lib/unicode/UCD300.html lib/unicode/Unicode3.html
+ - lib/unicode/Jamo-2.txt lib/unicode/Unicode.html
+ ! (edit 189 files)
+____________________________________________________________________________
+[ 4579] By: gsar on 1999/11/14 10:21:49
+ Log: sundry cleanups for cloned interpreters (only known failure mode
+ is due to regexps keeping non-constant data in their compiled
+ structures)
+ Branch: perl
+ ! cop.h dump.c ext/Opcode/Opcode.xs gv.c op.c perl.c pp_ctl.c
+ ! pp_sys.c sv.c toke.c util.c win32/perllib.c
____________________________________________________________________________
-[ 1118] By: gsar on 1998/06/11 07:09:06
- Log: regen embedvar.h
+[ 4578] By: gsar on 1999/11/14 03:37:37
+ Log: fix bug in change#4515 (STOP blocks now see @ARGV like the rest)
Branch: perl
- ! embedvar.h
+ ! perly.c perly.y t/op/misc.t vms/perly_c.vms
+____________________________________________________________________________
+[ 4577] By: jhi on 1999/11/13 19:50:24
+ Log: Change #4576 accidentally leaked also parts of
+ Ilya's patch that won't apply cleanly anymore.
+ Branch: cfgperl
+ ! regexec.c t/op/re_tests
____________________________________________________________________________
-[ 1117] By: gsar on 1998/06/11 06:45:52
+[ 4576] By: jhi on 1999/11/13 19:43:37
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ ! embed.h embed.pl embedvar.h proto.h regexec.c t/op/re_tests
+ !> ext/Errno/Errno_pm.PL ext/IO/lib/IO/Socket.pm t/lib/dumper.t
+ !> t/op/regexp.t t/pragma/overload.t
+____________________________________________________________________________
+[ 4575] By: gsar on 1999/11/13 19:41:46
+ Log: typos in change#4561 and change#4565
+ Branch: perl
+ ! ext/Errno/Errno_pm.PL ext/IO/lib/IO/Socket.pm
+____________________________________________________________________________
+[ 4574] By: gsar on 1999/11/13 19:31:19
+ Log: revert non-kosher parts of change#4562 (sort order problems
+ should be ignored (on ebcdic) by fixing dumper.t/T() to sort
+ result and expected lines; /[:ascii:]/ not working should be
+ fixed, not ignored in regexp.t; result from sort should be
+ fixed to be ascii portable on ebcdic, not ebcdic-specific)
+ Branch: perl
+ ! t/lib/dumper.t t/op/regexp.t t/pragma/overload.t
+____________________________________________________________________________
+[ 4573] By: gsar on 1999/11/13 19:13:04
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ +> lib/unicode/Eq/Latin1.pl lib/unicode/Eq/Unicode.pl
+ +> lib/unicode/In/BopomofoExtended.pl
+ +> lib/unicode/In/BraillePatterns.pl
+ +> lib/unicode/In/CJKRadicalsSupplement.pl
+ +> lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
+ +> lib/unicode/In/Cherokee.pl
+ +> lib/unicode/In/IdeographicDescriptionCharacters.pl
+ +> lib/unicode/In/KangxiRadicals.pl lib/unicode/In/Khmer.pl
+ +> lib/unicode/In/Mongolian.pl lib/unicode/In/Myanmar.pl
+ +> lib/unicode/In/Ogham.pl lib/unicode/In/Runic.pl
+ +> lib/unicode/In/Sinhala.pl lib/unicode/In/Syriac.pl
+ +> lib/unicode/In/Thaana.pl
+ +> lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
+ +> lib/unicode/In/YiRadicals.pl lib/unicode/In/YiSyllables.pl
+ - lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ !> (integrate 213 files)
+____________________________________________________________________________
+[ 4572] By: jhi on 1999/11/13 18:44:50
+ Log: From: "Craig A. Berry" <craig.berry@metamor.com>
+ To: perl5-porters@perl.org, VMSPERL@perl.org
+ Subject: [PATCH 5.005_03 and 5.005_62] updates to README.vms
+ Date: Wed, 27 Oct 1999 11:02:54 -0500
+ Message-Id: <4.2.0.58.19991027105257.00addc10@mmtnt11.metamor.com>
+ Branch: cfgperl
+ ! README.vms
+____________________________________________________________________________
+[ 4571] By: jhi on 1999/11/13 18:33:39
+ Log: From: jand@activestate.com (Jan Dubois)
+ To: perl5-porters@perl.org, Perl-Win32-Porters@activestate.com
+ Cc: Douglas Lankshear <dougl@activestate.com>,
+ Gurusamy Sarathy <gsar@activestate.com>
+ Subject: [5.005_62 PATCH] support link() on WinNT and NTFS
+ Date: Tue, 09 Nov 1999 00:38:33 +0100
+ Message-ID: <382b5d24.10899522@smtprelay.t-online.de>
+ Branch: cfgperl
+ ! XSUB.h iperlsys.h pp_sys.c t/io/fs.t win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/perllib.c
+ ! win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 4570] By: jhi on 1999/11/13 18:30:37
Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806100751.DAA05441@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_66] Bugs with (?{}), $^R and many-to-many subst
- Date: Wed, 10 Jun 1998 03:51:47 -0400 (EDT)
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_62] makedef.pl goof
+ Date: Mon, 8 Nov 1999 23:55:21 -0500 (EST)
+ Message-Id: <199911090455.XAA25627@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! makedef.pl
+____________________________________________________________________________
+[ 4569] By: jhi on 1999/11/13 18:06:54
+ Log: From: Michael G Schwern <schwern@pobox.com>
+ To: perl5-porters@perl.org, pod-people@perl.org
+ Cc: tchrist@mox.perl.com, gnat@frii.com
+ Subject: [DOCPATCH 5.005_62 perlfaq9.pod] Mention HTML::FormatText
+ Date: Wed, 10 Nov 1999 17:21:46 -0500
+ Message-ID: <19991110172146.A23527@athens.aocn.com>
+ Branch: cfgperl
+ ! pod/perlfaq9.pod
+____________________________________________________________________________
+[ 4568] By: jhi on 1999/11/13 18:05:33
+ Log: From: "Paul Moore" <gustav@morpheus.demon.co.uk>
+ To: <perl5-porters@perl.org>
+ Subject: DynaLoader_pm.PL patch (backslashes in strings)
+ Date: Wed, 10 Nov 1999 22:52:02 -0000
+ Message-ID: <LPBBIIMJKJMPNOGHGLLCMEBFCAAA.gustav@morpheus.demon.co.uk>
+ Branch: cfgperl
+ ! ext/DynaLoader/DynaLoader_pm.PL
+____________________________________________________________________________
+[ 4567] By: jhi on 1999/11/13 18:03:52
+ Log: From: JD Laub <jdl@access-health.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19991112.002] patch: Exporter.pm not reporting path
+ Date: Fri, 12 Nov 1999 08:58:28 -0700 (MST)
+ Message-Id: <199911121558.IAA08915@mocha.iasi.com>
+ Branch: cfgperl
+ ! lib/Exporter/Heavy.pm
+____________________________________________________________________________
+[ 4566] By: jhi on 1999/11/13 18:01:24
+ Log: From: Bernard Quatermass <bernard@quatermass.co.uk>
+ To: perl5-porters@perl.org
+ Subject: small patch for perldoc
+ Date: Fri, 12 Nov 1999 23:11:43 GMT
+ Message-Id: <VA.0000001c.00d1e05a@quatermass.co.uk>
+ Branch: cfgperl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 4565] By: jhi on 1999/11/13 17:58:54
+ Log: From: Scott Gifford <sgifford@tir.com>
+ To: perl5-porters@perl.org
+ Cc: gbarr@pobox.com
+ Subject: [ID 19991112.004] Bug in IO::Socket (patch included)
+ Date: 12 Nov 1999 18:55:30 -0500
+ Message-Id: <m3emdvw9hp.fsf@sgifford.tir.com>
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Socket.pm
+____________________________________________________________________________
+[ 4564] By: jhi on 1999/11/13 17:45:39
+ Log: Applied manually:
+ From: "Craig A. Berry" <craig.berry@metamor.com>
+ To: perl5-porters@perl.org, VMSPERL@perl.org
+ Subject: [PATCH 5.005_62] patches required to build on VMS
+ Date: Tue, 09 Nov 1999 18:16:14 -0600
+ Message-Id: <4.2.2.19991109173839.00d12630@mmtnt11.metamor.com>
+ Branch: cfgperl
+ ! configure.com vms/descrip_mms.template vms/subconfigure.com
+ ! vms/vms.c vms/vmsish.h
+____________________________________________________________________________
+[ 4563] By: jhi on 1999/11/13 17:18:41
+ Log: Regen Unicode tables to include a warning:
+ Thou Shalt Not Edit Them By Hand; add missing
+ (Unicode 2.0 -introduced) tables to MANIFEST;
+ convert the equivalence tables to be valid Perl code.
+ Branch: cfgperl
+ + lib/unicode/Eq/Latin1.pl lib/unicode/Eq/Unicode.pl
+ + lib/unicode/In/BopomofoExtended.pl
+ + lib/unicode/In/BraillePatterns.pl
+ + lib/unicode/In/CJKRadicalsSupplement.pl
+ + lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
+ + lib/unicode/In/Cherokee.pl
+ + lib/unicode/In/IdeographicDescriptionCharacters.pl
+ + lib/unicode/In/KangxiRadicals.pl lib/unicode/In/Khmer.pl
+ + lib/unicode/In/Mongolian.pl lib/unicode/In/Myanmar.pl
+ + lib/unicode/In/Ogham.pl lib/unicode/In/Runic.pl
+ + lib/unicode/In/Sinhala.pl lib/unicode/In/Syriac.pl
+ + lib/unicode/In/Thaana.pl
+ + lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
+ + lib/unicode/In/YiRadicals.pl lib/unicode/In/YiSyllables.pl
+ - lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ ! (edit 169 files)
+____________________________________________________________________________
+[ 4562] By: jhi on 1999/11/13 16:53:00
+ Log: From: Peter Prymmer <pvhp@forte.com>
+ To: gsar@activestate.com, perl-mvs@perl.org, perlbug@perl.com
+ Subject: [PATCH: 5.005_62]was Re: [ID 19991102.003] perl on os390
+ Date: Wed, 10 Nov 1999 14:34:36 -0800 (PST)
+ Message-Id: <199911102234.OAA01018@brio.forte.com>
+ Branch: cfgperl
+ ! t/lib/dumper.t t/op/pack.t t/op/regexp.t t/pragma/locale.t
+ ! t/pragma/overload.t
+____________________________________________________________________________
+[ 4561] By: jhi on 1999/11/13 16:29:37
+ Log: $Config{myarchname} is not a good architecture identifier
+ because it may contain host/node identification like
+ CPU serial numbers.
+ Branch: cfgperl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 4560] By: jhi on 1999/11/13 16:26:13
+ Log: Continue largefileness separation from quadness;
+ move nv-preserving test out of perl.h into Configure;
+ use HAS_SETVBUF in IO.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH ext/IO/IO.xs hints/solaris_2.sh perl.h pp_sys.c
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U
+ Branch: metaconfig/U/perl
+ + nvpresuv.U
+ ! d_fseeko.U d_ftello.U io64.U perlxv.U
+____________________________________________________________________________
+[ 4559] By: jhi on 1999/11/13 13:46:38
+ Log: Try to fix largefileness so that it "works" without a quad IV.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h pp_sys.c t/lib/syslfs.t t/op/lfs.t
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U U/typedefs/lseektype.U
+ Branch: metaconfig/U/perl
+ ! io64.U
+____________________________________________________________________________
+[ 4558] By: jhi on 1999/11/13 11:36:19
+ Log: Undo drift from mainline.
+ Branch: cfgperl
+ ! regcomp.c util.c utils/h2xs.PL
+____________________________________________________________________________
+[ 4557] By: gsar on 1999/11/13 10:54:46
+ Log: typo
Branch: perl
- ! interp.sym intrpvar.h op.c op.h perl.c regcomp.c regcomp.h
- ! regexec.c regexp.h t/op/pat.t t/op/subst.t
+ ! util.c
____________________________________________________________________________
-[ 1116] By: gsar on 1998/06/11 06:35:54
- Log: misc win32 fixes
- From: "Douglas Lankshear" <dougl@ActiveState.com>
- Subject: [PATCH 5.004_66]
- Date: Wed, 10 Jun 1998 11:28:27 -0700
- Message-ID: <001a01bd949d$8fd18050$a32fa8c0@tau.Active>
+[ 4556] By: gsar on 1999/11/13 10:53:41
+ Log: integrate cfgperl contents (op.[ch] needed manual resolve)
Branch: perl
- ! ObjXSub.h perl.c win32/Makefile win32/makefile.mk
+ +> epoc/Config.pm epoc/autosplit.pl epoc/createpkg.pl
+ +> epoc/epoc_stubs.c
+ !> (integrate 48 files)
____________________________________________________________________________
-[ 1115] By: gsar on 1998/06/11 06:33:21
- Log: Message-ID: <19980610005325.D162@cdata.tvnet.hu>
- Date: Wed, 10 Jun 1998 00:53:25 +0200
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Subject: [PATCH for _66] Makefile.SH problem on dos/djgpp
+[ 4555] By: jhi on 1999/11/13 10:05:54
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> dump.c ext/Devel/DProf/DProf.xs gv.c mg.c op.c perl.c pp.c
+ !> sv.c warnings.h warnings.pl win32/Makefile win32/perllib.c
+____________________________________________________________________________
+[ 4554] By: jhi on 1999/11/13 10:03:07
+ Log: s/_SIGN$/_sign/g;
+ Branch: metaconfig
+ ! U/typedefs/gidsign.U U/typedefs/pidsign.U U/typedefs/uidsign.U
+____________________________________________________________________________
+[ 4553] By: gsar on 1999/11/13 02:17:53
+ Log: cloned interpreters now actually run and pass all but 55/10386
+ subtests; various subtle bugs, new and old, observed when running
+ cloned interpreters have been fixed
+
+ still to do:
+ | * dup psig_ptr table
+ | * merge PADOP GVs support with "our" SVs (existing PADOPs are too
+ | simple-minded and grab one pad entry each, heavily bloating
+ | the pad by not avoiding dups)
+ | * overloaded constants are not really immutable--they need to
+ | be PADOPs
+ | * allocator for constants and OPs need to be spelled differently
+ | (shared vs interpreter-local allocations)
+ | * optree refcounting is still missing locking (macros are in place)
+ | * curstackinfo, {mark,scope,save,ret}stack need to be cloned so
+ | perl_clone() can be called from within runops*()
+ Branch: perl
+ ! dump.c ext/Devel/DProf/DProf.xs gv.c mg.c op.c perl.c pp.c
+ ! sv.c warnings.h warnings.pl win32/Makefile win32/perllib.c
+____________________________________________________________________________
+[ 4552] By: jhi on 1999/11/11 23:17:43
+ Log: Turn on largefileness always if available and
+ continue 64-bit fixes.
+ Branch: cfgperl
+ ! Configure config_h.SH handy.h hints/aix.sh hints/dec_osf.sh
+ ! hints/hpux.sh hints/irix_6.sh hints/solaris_2.sh perl.h pp.c
+ ! sv.c t/lib/syslfs.t t/op/lfs.t utf8.c
+____________________________________________________________________________
+[ 4551] By: jhi on 1999/11/11 23:16:15
+ Log: Split int64type from i_inttypes, rename quadcase into quadkind.
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U
+ Branch: metaconfig/U/perl
+ + d_int64t.U
+ ! i_inttypes.U io64.U
+____________________________________________________________________________
+[ 4550] By: jhi on 1999/11/11 20:24:55
+ Log: Fix a thinko in 4548.
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 4549] By: jhi on 1999/11/11 19:48:21
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 56 files)
+____________________________________________________________________________
+[ 4548] By: jhi on 1999/11/11 19:41:56
+ Log: Try to do something if st_size, st_uid, st_gid are too big for an IV;
+ regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH pp_sys.c
+____________________________________________________________________________
+[ 4547] By: jhi on 1999/11/11 19:40:38
+ Log: s/_SIZE$/_size/g; add sizesize and ssizesize.
+ Branch: metaconfig
+ + U/typedefs/sizesize.U U/typedefs/ssizesize.U
+ ! U/typedefs/gidsize.U U/typedefs/pidsize.U U/typedefs/uidsize.U
+____________________________________________________________________________
+[ 4546] By: gsar on 1999/11/11 10:32:54
+ Log: avoid stash pointers in optree under USE_ITHREADS
Branch: perl
- ! Makefile.SH
+ ! bytecode.pl cop.h ext/B/B.xs ext/B/B/Asmdata.pm
+ ! ext/B/B/Bytecode.pm ext/B/B/C.pm ext/B/B/Debug.pm
+ ! ext/B/B/Deparse.pm ext/ByteLoader/bytecode.h
+ ! ext/ByteLoader/byterun.c ext/ByteLoader/byterun.h
+ ! ext/Opcode/Opcode.xs gv.c op.c perl.c pp.c pp_ctl.c pp_hot.c
+ ! scope.h sv.c
____________________________________________________________________________
-[ 1114] By: gsar on 1998/06/11 06:31:34
- Log: back out change#1111 and add alternative patch:
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806101538.LAA07293@monk.mps.ohio-state.edu>
- Subject: Re: PATCH for study/foo/
- Date: Wed, 10 Jun 1998 11:38:58 -0400 (EDT)
+[ 4545] By: gsar on 1999/11/11 06:04:20
+ Log: another change towards a shareable optree: avoid pointer to filegv
+ in COP; revert parts of change#4485 and s/xcv_filegv/xcv_file/
+ (CvFILE() may yet come in handy somewhere); adjust compiler doodads
+ to suit
Branch: perl
- ! pp.c sv.c
+ ! bytecode.pl cop.h cv.h dump.c ext/B/B.pm ext/B/B.xs
+ ! ext/B/B/Asmdata.pm ext/B/B/Bytecode.pm ext/B/B/C.pm
+ ! ext/B/B/CC.pm ext/B/B/Debug.pm ext/B/B/Deparse.pm
+ ! ext/B/B/Lint.pm ext/B/B/Xref.pm ext/ByteLoader/bytecode.h
+ ! ext/ByteLoader/byterun.c ext/ByteLoader/byterun.h
+ ! ext/Devel/Peek/Peek.pm gv.c gv.h op.c perl.c pp.c pp_ctl.c
+ ! pp_sys.c scope.c scope.h sv.c sv.h toke.c util.c util.h
+ ! win32/perllib.c
____________________________________________________________________________
-[ 1113] By: gsar on 1998/06/11 02:59:23
- Log: fix outdated bytecode.pl
+[ 4544] By: gsar on 1999/11/10 18:19:12
+ Log: more cleanups for change#4539
Branch: perl
- ! bytecode.h bytecode.pl byterun.c byterun.h
+ ! gv.h op.c op.h pp_ctl.c pp_hot.c
____________________________________________________________________________
-[ 1112] By: gsar on 1998/06/10 07:56:06
- Log: Added patch, regenerated perly.c and perly.c.diff
- Message-Id: <m0ygCL8-000Eb3C@alias-2.pr.mcs.net>
- Date: Sun, 31 May 1998 12:56:14 -0500 (CDT)
- From: Stephen McCamant <alias@mcs.com>
- Subject: [PATCH] too many RV2GVs in *foo{THING}
+[ 4543] By: gsar on 1999/11/10 01:52:22
+ Log: remove dead branch/infinite looper in change#3612
Branch: perl
- ! perly.c perly.c.diff perly.y t/op/gv.t
+ ! op.c
____________________________________________________________________________
-[ 1111] By: gsar on 1998/06/10 07:40:30
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806100309.XAA04974@monk.mps.ohio-state.edu>
- Subject: Re: PATCH for study/foo/
- Date: Tue, 9 Jun 1998 23:09:55 -0400 (EDT)
+[ 4542] By: gsar on 1999/11/09 20:05:47
+ Log: IoDIRP may be fake when used in source filters, mark as such
Branch: perl
- ! pp.c
+ ! sv.c sv.h toke.c
____________________________________________________________________________
-[ 1110] By: gsar on 1998/06/10 07:37:04
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806100219.WAA04865@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_66] -DL and PERL_DEBUG_MSTATS unravelled
- Date: Tue, 9 Jun 1998 22:19:02 -0400 (EDT)
+[ 4541] By: gsar on 1999/11/09 05:47:53
+ Log: small nits in changes#4538,4539
Branch: perl
- ! pod/perldebug.pod
+ ! op.c sv.c
____________________________________________________________________________
-[ 1109] By: gsar on 1998/06/10 07:35:29
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806100302.XAA04958@monk.mps.ohio-state.edu>
- Subject: Re: [PATCH 5.004_66] REG_INFTY patch corrected
- Date: Tue, 9 Jun 1998 23:02:52 -0400 (EDT)
+[ 4540] By: gsar on 1999/11/08 20:30:58
+ Log: win32 symbol export tweak
Branch: perl
- ! regcomp.h
+ ! makedef.pl win32/win32.c win32/win32iop.h
____________________________________________________________________________
-[ 1108] By: gsar on 1998/06/10 07:31:25
- Log: Added patch, tweaked other places affected by name change
- Message-ID: <19980610005417.G162@cdata.tvnet.hu>
- Date: Wed, 10 Jun 1998 00:54:17 +0200
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Subject: [PATCH] file name DynaLoader.pm.PL is 8.3 unfriendly
+[ 4539] By: gsar on 1999/11/08 18:50:40
+ Log: preliminary support for GVOP indirection via pad
Branch: perl
- +> ext/DynaLoader/DynaLoader_pm.PL
- - ext/DynaLoader/DynaLoader.pm.PL
- ! MANIFEST ext/DynaLoader/Makefile.PL win32/Makefile
- ! win32/makefile.mk
+ ! doio.c dump.c embed.h embed.pl global.sym objXSUB.h op.c op.h
+ ! opcode.pl perlapi.c pp_hot.c pp_sys.c proto.h run.c
____________________________________________________________________________
-[ 1107] By: gsar on 1998/06/10 07:24:20
- Log: Message-ID: <19980610005342.E162@cdata.tvnet.hu>
- Date: Wed, 10 Jun 1998 00:53:42 +0200
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Subject: [PATCH for _66] new version of README.dos
+[ 4538] By: gsar on 1999/11/08 11:25:49
+ Log: preliminary support for perl_clone() (still needs work in
+ the following areas: SVOPs must indirect via pad; context
+ stack, scope stack, and runlevels must be cloned; must
+ hook up the virtualized pseudo-process support provided by
+ "host"; ...)
Branch: perl
- ! README.dos
+ ! av.h embed.h embed.pl embedvar.h global.sym hv.c hv.h
+ ! intrpvar.h makedef.pl objXSUB.h perl.h perlapi.c proto.h sv.c
+ ! win32/perllib.c win32/win32.c
____________________________________________________________________________
-[ 1106] By: gsar on 1998/06/10 07:22:31
- Log: Message-ID: <19980610005404.F162@cdata.tvnet.hu>
- Date: Wed, 10 Jun 1998 00:54:04 +0200
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Subject: [PATCH for _66] op/taint.t problem on dos/djgpp
+[ 4537] By: gsar on 1999/11/08 11:19:18
+ Log: more thorough cleanup in perl_destroy()
Branch: perl
- ! t/op/taint.t
+ ! perl.c util.c
____________________________________________________________________________
-[ 1105] By: gsar on 1998/06/10 07:21:21
- Log: Applied patch, followed by tweaks to *.sym and `perl embed.pl`
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806090216.WAA02041@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_66] Resend of RE cache patch (modified)
- Date: Mon, 8 Jun 1998 22:16:56 -0400 (EDT)
+[ 4536] By: gsar on 1999/11/08 07:16:10
+ Log: win32 internal data must be interpreter-local
+ Branch: perl
+ ! win32/win32.c win32/win32.h win32/win32sck.c
+____________________________________________________________________________
+[ 4535] By: gsar on 1999/11/08 04:17:28
+ Log: tweak change#4502
+ Branch: perl
+ ! doio.c perl.c
+____________________________________________________________________________
+[ 4534] By: jhi on 1999/11/07 13:17:03
+ Log: Four special class subs, not three.
+ Branch: cfgperl
+ ! pod/perlmod.pod
+____________________________________________________________________________
+[ 4533] By: jhi on 1999/11/07 13:13:15
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> mg.c t/io/print.t
+____________________________________________________________________________
+[ 4532] By: jhi on 1999/11/07 12:36:10
+ Log: More test program maintenance.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/a_dvisory/intsize.U U/compline/alignbytes.U
+ ! U/compline/charsize.U U/compline/d_sigaction.U
+ ! U/compline/doublesize.U U/compline/floatsize.U
+ ! U/compline/nblock_io.U U/compline/ptrsize.U
+ ! U/modified/Signal.U U/typedefs/gidsize.U U/typedefs/pidsize.U
+ ! U/typedefs/uidsize.U
+ Branch: metaconfig/U/perl
+ ! fpossize.U
+____________________________________________________________________________
+[ 4531] By: jhi on 1999/11/07 00:34:09
+ Log: Tidy up the metaconfig test programs.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/a_dvisory/intsize.U U/compline/alignbytes.U
+ ! U/compline/charsize.U U/compline/doublesize.U
+ ! U/compline/nblock_io.U U/compline/ptrsize.U
+ ! U/modified/d_longlong.U U/typedefs/gidsize.U
+ ! U/typedefs/lseektype.U U/typedefs/pidsize.U
+ ! U/typedefs/uidsize.U
+ Branch: metaconfig/U/perl
+ ! fpossize.U
+____________________________________________________________________________
+[ 4530] By: jhi on 1999/11/06 23:51:34
+ Log: So many printfs, so little time.
+ Branch: cfgperl
+ ! op.c perl.c regcomp.c scope.c util.c
+____________________________________________________________________________
+[ 4529] By: jhi on 1999/11/06 23:27:35
+ Log: Replace the explicit zeros with NOOPs.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4528] By: jhi on 1999/11/06 23:10:54
+ Log: From: jand@activestate.com (Jan Dubois)
+ To: perl5-porters@perl.org
+ Cc: Mike Blazer <blazer@mail.nevalink.ru>,
+ Mark Borgerding <mborgerding@acm.org>
+ Subject: [5.005_62 PATCH] binmode and locale support for -T and -B filetest operators
+ Date: Sat, 06 Nov 1999 22:16:43 +0100
+ Message-ID: <38279207.46448719@smtprelay.t-online.de>
+ Branch: cfgperl
+ ! op.c op.h
+____________________________________________________________________________
+[ 4527] By: jhi on 1999/11/06 20:22:14
+ Log: ...and fewer.
+ Branch: cfgperl
+ ! dump.c
+____________________________________________________________________________
+[ 4526] By: jhi on 1999/11/06 20:19:04
+ Log: ...and they are getting fewer.
+ Branch: cfgperl
+ ! dump.c op.c util.c
+____________________________________________________________________________
+[ 4525] By: jhi on 1999/11/06 19:59:59
+ Log: More printf miscasts flushed out.
+ Branch: cfgperl
+ ! dump.c ext/B/B.xs ext/Data/Dumper/Dumper.xs regcomp.c
+ ! regexec.c
+____________________________________________________________________________
+[ 4524] By: jhi on 1999/11/06 15:39:05
+ Log: Crushing the remaining %ld guerillas.
+ Branch: cfgperl
+ ! ext/Devel/DProf/DProf.xs
+____________________________________________________________________________
+[ 4523] By: jhi on 1999/11/06 15:11:38
+ Log: Update CPAN sites list.
+ Branch: cfgperl
+ ! pod/perlmodlib.pod
+____________________________________________________________________________
+[ 4522] By: jhi on 1999/11/05 19:50:46
+ Log: The -n32 is normally part of $cc, not $ccflags.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 4521] By: gsar on 1999/11/05 04:35:30
+ Log: allow $\ to work right when set to a string with embedded nulls
Branch: perl
- ! embed.h embedvar.h global.sym intrpvar.h mg.c perl.h
- ! perlvars.h pp_ctl.c proto.h sv.c
+ ! mg.c t/io/print.t
+____________________________________________________________________________
+[ 4520] By: jhi on 1999/11/04 23:30:09
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> embedvar.h ext/B/B/Bytecode.pm ext/B/B/Lint.pm
+ !> ext/B/B/Stash.pm ext/B/NOTES ext/B/O.pm ext/File/Glob/Glob.pm
+ !> ext/File/Glob/bsd_glob.c ext/File/Glob/bsd_glob.h intrpvar.h
+ !> keywords.h keywords.pl objXSUB.h op.c perl.c pod/perldelta.pod
+ !> pod/perldiag.pod pod/perlfunc.pod pod/perlmod.pod
+ !> pod/perlrun.pod pod/perlsub.pod pod/perltodo.pod toke.c
+____________________________________________________________________________
+[ 4519] By: jhi on 1999/11/04 23:09:25
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_62] ref to non-lvalue method
+ Date: Wed, 3 Nov 1999 03:52:48 -0500 (EST)
+ Message-Id: <199911030852.DAA06563@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! op.c
____________________________________________________________________________
-[ 1104] By: gsar on 1998/06/10 07:06:01
+[ 4518] By: jhi on 1999/11/04 23:07:27
Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806090210.WAA02027@monk.mps.ohio-state.edu>
- Subject: Lost chunk of RE jumbo patch
- Date: Mon, 8 Jun 1998 22:10:52 -0400 (EDT)
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_62] xsubpp dependency
+ Date: Wed, 3 Nov 1999 02:57:23 -0500 (EST)
+ Message-Id: <199911030757.CAA06325@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 4517] By: jhi on 1999/11/04 23:05:59
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_62] regexp.h
+ Date: Wed, 3 Nov 1999 02:55:21 -0500 (EST)
+ Message-Id: <199911030755.CAA06311@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! regexp.h
+____________________________________________________________________________
+[ 4516] By: gsar on 1999/11/04 18:25:45
+ Log: change#4485 didn't do the right thing for B::Bytecode
+ Branch: perl
+ ! ext/B/B/Bytecode.pm
+____________________________________________________________________________
+[ 4515] By: gsar on 1999/11/04 17:28:29
+ Log: implement STOP blocks and fix compiler to use them (minimally
+ tested)
+ Branch: perl
+ ! embedvar.h ext/B/B/Lint.pm ext/B/B/Stash.pm ext/B/NOTES
+ ! ext/B/O.pm intrpvar.h keywords.h keywords.pl objXSUB.h op.c
+ ! perl.c pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! pod/perlmod.pod pod/perlrun.pod pod/perlsub.pod
+ ! pod/perltodo.pod toke.c
+____________________________________________________________________________
+[ 4514] By: gsar on 1999/11/04 15:59:46
+ Log: display BSD license in Glob.pm (for clause #2 conformity)
Branch: perl
- + t/op/regexp_noamp.t
+ ! ext/File/Glob/Glob.pm ext/File/Glob/bsd_glob.c
+ ! ext/File/Glob/bsd_glob.h
+____________________________________________________________________________
+[ 4513] By: jhi on 1999/11/04 08:26:19
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/io/nargv.t
+ !> (integrate 34 files)
+____________________________________________________________________________
+[ 4512] By: jhi on 1999/11/04 08:01:25
+ Log: Incremental Mac integration from Matthias.
+ Branch: cfgperl
+ ! perl.c perl.h pp_ctl.c pp_hot.c run.c sv.c t/pod/testpchk.pl
+ ! toke.c util.c
+____________________________________________________________________________
+[ 4511] By: gsar on 1999/11/04 02:53:37
+ Log: remove VIRTUAL tag, PERL_OBJECT doesn't need it anymore
+ Branch: perl
+ ! dosish.h embed.pl mg.c os2/os2ish.h perl.c perl.h perly.c
+ ! perly_c.diff pp_ctl.c proto.h regcomp.c regexec.c sv.c toke.c
+ ! universal.c vms/perly_c.vms vms/vmsish.h win32/win32.h
+ ! xsutils.c
+____________________________________________________________________________
+[ 4510] By: jhi on 1999/11/02 22:12:29
+ Log: S_init_interp is a better place to diddle with PL_opargs
+ than perl_construct.
+ Branch: cfgperl
+ ! perl.c
____________________________________________________________________________
-[ 1103] By: gsar on 1998/06/10 07:04:20
+[ 4509] By: jhi on 1999/11/02 21:30:02
+ Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ To: ben@mucus.advanced.org, perl5-porters@perl.org
+ Subject: Re: [ID 19991102.002] unpack('N', pack('N', -1)) not idempotent
+ Date: Tue, 02 Nov 1999 21:36:00 +0000
+ Message-Id: <E11ilay-00020o-00@taurus.cus.cam.ac.uk>
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 4508] By: jhi on 1999/11/02 20:46:27
+ Log: Initial integration of the MacPerl changes form Matthias.
+ Branch: cfgperl
+ ! doio.c ext/DynaLoader/DynaLoader_pm.PL ext/Fcntl/Fcntl.pm
+ ! ext/Fcntl/Fcntl.xs gv.c mg.c opcode.pl perl.c perl.h pp_ctl.c
+ ! pp_hot.c pp_sys.c run.c sv.c toke.c util.c
+____________________________________________________________________________
+[ 4507] By: jhi on 1999/11/01 23:05:07
Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Message-Id: <199806090207.WAA02015@monk.mps.ohio-state.edu>
- Subject: [PATCH 5.004_66] Combined OS/2 support
- Date: Mon, 8 Jun 1998 22:07:48 -0400 (EDT)
+ To: lvirden@cas.org (Larry W. Virden)
+ Cc: perl5-porters@perl.org, lvirden@cas.org
+ Subject: Re: [ID 19991026.001] perl segmentation fault report
+ Date: Mon, 1 Nov 1999 18:14:16 -0500 (EST)
+ Message-Id: <199911012314.SAA22664@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! regexec.c t/op/pat.t
+____________________________________________________________________________
+[ 4506] By: jhi on 1999/11/01 19:56:28
+ Log: From: Olaf Flebbe <olaf@science-computing.de>
+ To: perl5-porters@perl.org
+ Subject: [PATCH: 5.005_62] Patch for EPOC Support
+ Date: Mon, 1 Nov 1999 20:46:54 +0100 (MET)
+ Message-ID: <Pine.LNX.4.10.9911012045190.411-100000@dragon.science-computing.de>
+ Branch: cfgperl
+ + epoc/Config.pm epoc/autosplit.pl epoc/createpkg.pl
+ + epoc/epoc_stubs.c
+ ! MANIFEST README.epoc epoc/epocish.h epoc/perl.mmp
+ ! epoc/perl.pkg
+____________________________________________________________________________
+[ 4505] By: gsar on 1999/11/01 17:09:44
+ Log: macros for COP.cop_filegv access
Branch: perl
- ! os2/Changes os2/diff.configure os2/os2.c
+ ! cop.h deb.c gv.c op.c perl.c pp_ctl.c pp_sys.c scope.c toke.c
+ ! util.c
____________________________________________________________________________
-[ 1102] By: gsar on 1998/06/10 07:00:08
- Log: Message-Id: <199803140103.UAA04839@monk.mps.ohio-state.edu>
- Date: Fri, 13 Mar 1998 20:03:52 EST
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: [PATCH 5.004_62 5_004_04m1] pod2html again
+[ 4504] By: gsar on 1999/11/01 17:08:28
+ Log: enable better Win32::DomainName() by demand loading netapi32.dll
+ (from Jan Dubois)
Branch: perl
- ! lib/Pod/Html.pm
+ ! pod/Win32.pod win32/win32.c
+____________________________________________________________________________
+[ 4503] By: gsar on 1999/10/31 20:56:06
+ Log: change#4502 was missing a file
+ Branch: perl
+ + t/io/nargv.t
+____________________________________________________________________________
+[ 4502] By: gsar on 1999/10/31 20:46:02
+ Log: make nested ARGV/$^I loops work correctly; fixes several bugs
+ in the way ARGV state was handled in readline(); writing a
+ subroutine to do inplace edits is now possible, provided *ARGV,
+ *ARGVOUT, $^I and $_ are localized where needed
+ Branch: perl
+ ! MANIFEST doio.c embedvar.h intrpvar.h objXSUB.h perl.c
+ ! pp_hot.c scope.c
+____________________________________________________________________________
+[ 4501] By: jhi on 1999/10/31 12:43:54
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> perl.h win32/config.bc win32/config.gc win32/config.vc
+ !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 4500] By: gsar on 1999/10/31 10:01:17
+ Log: updated windows config* files
+ Branch: perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 4499] By: gsar on 1999/10/31 09:15:17
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH perl.h
+____________________________________________________________________________
+[ 4498] By: gsar on 1999/10/31 09:13:41
+ Log: remove unused struct Outrec
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 4497] By: jhi on 1999/10/30 12:41:50
+ Log: Add HAS_QUAD ($Config{d_quad}); use it.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h
+ Branch: metaconfig
+ ! U/a_dvisory/quadtype.U U/compline/charsize.U U/typedefs/gidf.U
+ ! U/typedefs/uidf.U
+ Branch: metaconfig/U/perl
+ ! perlxv.U
+____________________________________________________________________________
+[ 4496] By: gsar on 1999/10/30 00:28:32
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> Configure Policy_sh.SH Porting/Glossary Porting/config.sh
+ !> Porting/config_H README.hurd config_h.SH doop.c handy.h
+ !> hints/aix.sh hints/irix_6.sh hints/solaris_2.sh mg.c perl.c
+ !> perl.h pp.c pp.h regexec.c sv.c taint.c
+____________________________________________________________________________
+[ 4495] By: jhi on 1999/10/29 23:36:19
+ Log: Continue what #4494 started; introduce uid and gid formats.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH handy.h perl.h
+ Branch: metaconfig
+ + U/a_dvisory/quadtype.U U/typedefs/gidf.U U/typedefs/uidf.U
+ - U/typedefs/quadtype.U
+ Branch: metaconfig/U/perl
+ ! perlxv.U
+____________________________________________________________________________
+[ 4494] By: jhi on 1999/10/29 22:09:01
+ Log: Move the IV, UV, I8, U8, ..., and NV to metaconfig
+ from perl.h and handy.h.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH handy.h perl.h
+ Branch: metaconfig/U/perl
+ + perlxv.U perlxvf.U
+____________________________________________________________________________
+[ 4493] By: jhi on 1999/10/29 22:08:06
+ Log: Finetuning the output continues along the lines of #4490 and #4491.
+ Branch: metaconfig
+ ! U/modified/i_sysuio.U U/threads/d_pthreadj.U
+ ! U/typedefs/fpostype.U
+ Branch: metaconfig/U/perl
+ + fpossize.U
+ ! d_cmsghdr_s.U d_fs_data_s.U d_msghdr_s.U d_statfs3.U
+ ! d_statfs4.U d_statfs_f_flags.U d_statfs_s.U io64.U
+____________________________________________________________________________
+[ 4492] By: jhi on 1999/10/29 21:14:53
+ Log: Hurd update from Mark Kettenis.
+ Branch: cfgperl
+ ! README.hurd
+____________________________________________________________________________
+[ 4491] By: jhi on 1999/10/29 20:37:02
+ Log: A new try at what #4490 tried to accomplish.
+ Branch: metaconfig
+ ! U/modified/i_sysuio.U U/threads/d_pthreadj.U
+ Branch: metaconfig/U/perl
+ ! d_cmsghdr_s.U d_fs_data_s.U d_msghdr_s.U d_statfs3.U
+ ! d_statfs4.U d_statfs_f_flags.U d_statfs_s.U io64.U
+____________________________________________________________________________
+[ 4490] By: jhi on 1999/10/29 20:19:41
+ Log: metaconfig nits.
+ Branch: metaconfig
+ ! U/modified/i_sysuio.U U/threads/d_pthreadj.U
+ Branch: metaconfig/U/perl
+ + d_iovec_s.U
+ ! d_cmsghdr_s.U d_fs_data_s.U d_msghdr_s.U d_statfs3.U
+ ! d_statfs4.U d_statfs_f_flags.U d_statfs_s.U io64.U
+____________________________________________________________________________
+[ 4489] By: jhi on 1999/10/29 16:08:43
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 31 files)
____________________________________________________________________________
-[ 1101] By: gsar on 1998/06/10 06:55:20
+[ 4488] By: jhi on 1999/10/29 15:30:30
+ Log: Regen Configure and Glossary.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 4487] By: jhi on 1999/10/29 15:24:13
+ Log: Remove quad logic from perl.h; regen Configure;
+ add -DUSE_LONG_LONG to ccflags if not already there.
+ Branch: cfgperl
+ ! Configure config_h.SH doop.c hints/aix.sh hints/irix_6.sh
+ ! hints/solaris_2.sh perl.h pp.c pp.h regexec.c sv.c
+____________________________________________________________________________
+[ 4486] By: jhi on 1999/10/29 15:22:38
+ Log: metaconfig: moved quad logic from perl.h to Configure (quadtype.U);
+ fixed the use*.U to define their stuff only iff not already defined
+ (so that ccflags can have any -DUSE_* it wants);
+ uselonglong.U added; various small nits fixed.
+ Branch: metaconfig
+ + U/typedefs/quadtype.U
+ ! U/modified/d_longdbl.U U/modified/d_longlong.U
+ ! U/modified/d_statblks.U U/modified/usenm.U
+ ! U/threads/usethreads.U
+ Branch: metaconfig/U/perl
+ + uselonglong.U
+ ! d_cmsghdr_s.U d_fs_data_s.U d_msghdr_s.U d_statfs3.U
+ ! d_statfs4.U d_statfs_f_flags.U d_statfs_s.U i_inttypes.U
+ ! quadfio.U use64bits.U uselfs.U uselongdbl.U usemorebits.U
+ ! usemultiplicity.U useperlio.U usesocks.U
+____________________________________________________________________________
+[ 4485] By: gsar on 1999/10/29 06:08:50
+ Log: more cleanup: avoid unused knowledge of "file GV" notion in CV and GV
+ Branch: perl
+ ! bytecode.pl cv.h dump.c ext/B/B.pm ext/B/B.xs
+ ! ext/B/B/Asmdata.pm ext/B/B/Bytecode.pm ext/B/B/C.pm
+ ! ext/B/B/Debug.pm ext/B/B/Xref.pm ext/ByteLoader/byterun.c
+ ! ext/ByteLoader/byterun.h ext/Devel/Peek/Peek.pm gv.c gv.h op.c
+ ! sv.h
+____________________________________________________________________________
+[ 4484] By: gsar on 1999/10/29 03:00:21
+ Log: usurp GVOP slot for new PADOP (one small step to making optree
+ shareable across interpreters)
+ Branch: perl
+ ! bytecode.pl doio.c dump.c ext/B/B.pm ext/B/B.xs
+ ! ext/B/B/Asmdata.pm ext/B/B/Bytecode.pm ext/B/B/C.pm
+ ! ext/B/B/Debug.pm ext/B/B/Deparse.pm ext/B/B/Lint.pm
+ ! ext/B/B/Terse.pm ext/B/typemap ext/ByteLoader/byterun.c
+ ! ext/ByteLoader/byterun.h op.c op.h opcode.h opcode.pl perl.h
+ ! pp_hot.c pp_sys.c regexec.c run.c
+____________________________________________________________________________
+[ 4483] By: jhi on 1999/10/28 22:01:12
+ Log: Regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 4482] By: jhi on 1999/10/28 21:45:26
+ Log: Installdirs patches from Andy.
+ Branch: metaconfig
+ ! U/installdirs/sitearch.U U/installdirs/sitebin.U
+ ! U/installdirs/sitehtml1dir.U U/installdirs/sitehtml3dir.U
+ ! U/installdirs/sitelib.U U/installdirs/siteman1dir.U
+ ! U/installdirs/siteman3dir.U U/installdirs/siteprefix.U
+ ! U/installdirs/sitescriptdir.U U/installdirs/vendorarch.U
+ ! U/installdirs/vendorbin.U U/installdirs/vendorhtml1dir.U
+ ! U/installdirs/vendorhtml3dir.U U/installdirs/vendorlib.U
+ ! U/installdirs/vendorman1dir.U U/installdirs/vendorman3dir.U
+ ! U/installdirs/vendorprefix.U U/installdirs/vendorscriptdir.U
+____________________________________________________________________________
+[ 4481] By: gsar on 1999/10/28 17:33:49
+ Log: remove C<use Time::Local 'no_range_check'> misfeature (global
+ can still be directly set)
+ Branch: perl
+ ! lib/Time/Local.pm
+____________________________________________________________________________
+[ 4480] By: jhi on 1999/10/28 13:49:26
+ Log: Fix printing of uids and gids; regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH mg.c perl.c perl.h taint.c
+____________________________________________________________________________
+[ 4479] By: jhi on 1999/10/28 11:53:57
+ Log: Fix typo.
+ Branch: metaconfig
+ ! U/typedefs/gidsize.U
+____________________________________________________________________________
+[ 4478] By: jhi on 1999/10/28 06:50:02
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes iperlsys.h makedef.pl patchlevel.h perl.h
+ !> win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ !> win32/config_sh.PL win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 4477] By: jhi on 1999/10/28 06:40:54
+ Log: (Slightly) better comments for Policy_sh.SH from Andy.
+ Branch: cfgperl
+ ! Policy_sh.SH
+____________________________________________________________________________
+[ 4476] By: gsar on 1999/10/27 23:54:36
+ Log: regen config* stuff for windows
+ Branch: perl
+ ! Changes patchlevel.h win32/Makefile win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/config_sh.PL
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 4475] By: gsar on 1999/10/27 21:32:30
+ Log: integrate cfgperl contents into mainline; merge conflicts
+ Branch: perl
+ !> (integrate 46 files)
+____________________________________________________________________________
+[ 4474] By: gsar on 1999/10/27 21:15:07
+ Log: patch up egcs-1.1.2-mingw32 build (builds a working miniperl, but not
+ perl; stdout/stderr redirects seem broken as well)
+ Branch: perl
+ ! iperlsys.h makedef.pl perl.h win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 4473] By: jhi on 1999/10/27 21:11:11
+ Log: Do not block if no message queues available.
+ Branch: cfgperl
+ ! t/lib/ipc_sysv.t
+____________________________________________________________________________
+[ 4472] By: jhi on 1999/10/27 18:27:40
+ Log: Remove unused "squatter" symbols; regen Configure.
+ Branch: cfgperl
+ ! Configure Makefile.SH Porting/Glossary Porting/config.sh
+ ! Porting/config_H config_h.SH epoc/config.h iperlsys.h perl.h
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 4471] By: jhi on 1999/10/27 18:26:55
+ Log: metaconfig; split socket; fix output.
+ Branch: metaconfig
+ ! U/modified/d_socket.U U/modified/d_statblks.U
+ Branch: metaconfig/U/perl
+ + d_cmsghdr_s.U d_msghdr_s.U d_recvmsg.U d_sendmsg.U
+ ! i_sysstatfs.U i_sysvfs.U
+____________________________________________________________________________
+[ 4470] By: jhi on 1999/10/27 17:19:06
+ Log: Regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.c perl.h
+____________________________________________________________________________
+[ 4469] By: jhi on 1999/10/27 17:18:41
+ Log: metaconfig; split statfs.
+ Branch: metaconfig/U/perl
+ + d_fs_data_s.U d_statfs_f_flags.U d_statfs_s.U
+ ! d_statfs.U
+____________________________________________________________________________
+[ 4468] By: jhi on 1999/10/27 14:06:44
+ Log: Integrate with Sarathy; manual resolve on regcomp.c conflicts
+ (Ilya's changes won).
+ Branch: cfgperl
+ +> os2/OS2/REXX/DLL/Changes os2/OS2/REXX/DLL/DLL.pm
+ +> os2/OS2/REXX/DLL/DLL.xs os2/OS2/REXX/DLL/MANIFEST
+ +> os2/OS2/REXX/DLL/Makefile.PL os2/OS2/REXX/t/rx_emxrv.t
+ !> (integrate 65 files)
+____________________________________________________________________________
+[ 4467] By: jhi on 1999/10/27 13:38:41
+ Log: Regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 4466] By: jhi on 1999/10/27 13:18:06
+ Log: metaconfig fixes from Andy.
+ Branch: metaconfig
+ + U/modified/libnlist.U U/modified/usrinc.U
+ ! U/Glossary.patch U/mkglossary U/modified/libpth.U
+____________________________________________________________________________
+[ 4465] By: jhi on 1999/10/27 13:06:27
+ Log: Nosuid checking for statfs() people.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.c perl.h pod/perldiag.pod
+____________________________________________________________________________
+[ 4464] By: jhi on 1999/10/27 13:04:20
+ Log: metaconfig maintenance; fix Hasfield, statfs;
+ add Hasstruct, statfs3, statfs4, ustat, sysvfs;
+ split fstatfs away from statfs.
+ Branch: metaconfig
+ + U/protos/Hasstruct.U
+ ! U/protos/Hasfield.U
+ Branch: metaconfig/U/perl
+ + d_fstatfs.U d_statfs3.U d_statfs4.U d_ustat.U i_sysvfs.U
+ + i_ustat.U
+ ! d_statfs.U
+____________________________________________________________________________
+[ 4463] By: jhi on 1999/10/27 07:55:53
+ Log: We need cc to be able to test for cc -v.
+ Branch: cfgperl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 4462] By: gsar on 1999/10/27 01:31:41
+ Log: more GCC v2.95 induced adjustments
+ Branch: perl
+ ! globals.c mg.c opcode.h opcode.pl perl.h sv.c
+ ! win32/makefile.mk win32/win32.c x2p/walk.c
+____________________________________________________________________________
+[ 4461] By: gsar on 1999/10/26 21:42:59
+ Log: warnings and const violations identified by compiling in C++ mode
+ with GCC v2.95
+ Branch: perl
+ ! doio.c embed.pl mg.c op.c perl.c perlapi.c proto.h regcomp.c
+ ! sv.c taint.c toke.c win32/win32.c
+____________________________________________________________________________
+[ 4459] By: jhi on 1999/10/26 10:15:58
+ Log: Regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 4458] By: jhi on 1999/10/26 09:48:37
+ Log: Minor rewordings.
+ Branch: metaconfig/U/perl
+ ! d_getmnt.U d_getmntent.U d_statfs.U d_statvfs.U
+____________________________________________________________________________
+[ 4456] By: jhi on 1999/10/26 09:11:49
+ Log: Fix d_statfsflags; add d_getmnt.
+ Branch: metaconfig/U/perl
+ + d_getmnt.U
+ ! d_statfs.U
+____________________________________________________________________________
+[ 4455] By: jhi on 1999/10/26 08:12:27
+ Log: Massive multitypo in #4446.
+ Branch: cfgperl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 4454] By: jhi on 1999/10/25 08:28:45
+ Log: From: Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
+ To: Perl 5 Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_62] dos-djgpp update
+ Date: Mon, 25 Oct 1999 10:11:30 +0200
+ Message-ID: <19991025101130.K459@crater.eth.ericsson.se>
+ Branch: cfgperl
+ ! djgpp/config.over djgpp/configure.bat djgpp/djgppsed.sh
+ ! pod/perldelta.pod t/lib/io_unix.t
+____________________________________________________________________________
+[ 4453] By: jhi on 1999/10/25 08:25:50
Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: Re: 5.004_65 uninitialized variable regexec.c (2)
- Date: Thu, 28 May 1998 01:28:54 -0400 (EDT)
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_62] Remove the last regnode<==>char*
+ Date: Mon, 25 Oct 1999 03:06:21 -0400 (EDT)
+ Message-Id: <199910250706.DAA16825@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! embed.h embed.pl proto.h regcomp.c regcomp.h regexec.c
+____________________________________________________________________________
+[ 4452] By: jhi on 1999/10/25 08:16:55
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_62] Missing REx engine patch
+ Date: Sun, 24 Oct 1999 23:47:45 -0400 (EDT)
+ Message-Id: <199910250347.XAA16094@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! pod/perldiag.pod regcomp.c regexec.c
+____________________________________________________________________________
+[ 4451] By: jhi on 1999/10/25 08:13:06
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_62] charnames and UTEST
+ Date: Sun, 24 Oct 1999 23:39:49 -0400 (EDT)
+ Message-Id: <199910250339.XAA16058@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! t/lib/charnames.t
+____________________________________________________________________________
+[ 4450] By: gsar on 1999/10/25 07:38:15
+ Log: win32 tweak
Branch: perl
- ! regexec.c
+ ! win32/perllib.c
____________________________________________________________________________
-[ 1100] By: gsar on 1998/06/10 06:52:50
- Log: updated MANIFEST for previous change
+[ 4449] By: gsar on 1999/10/24 23:20:10
+ Log: remove inconsistent tainting behavior of sprintf("%e",...)
+ (all bets are off is "C" locale is compromised)
Branch: perl
- ! MANIFEST
+ ! pod/perlfunc.pod pod/perllocale.pod sv.c
____________________________________________________________________________
-[ 1099] By: gsar on 1998/06/10 06:51:08
- Log: Mangled patch, needed hand-tweaks, along with binmode for rs.t:
- Message-Id: <3.0.5.32.19980605110840.009e12b0@ous.edu>
- Date: Fri, 05 Jun 1998 11:08:40 -0700
- From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: Re: [PATCH 5.004_66]Add record read capability to <>
+[ 4448] By: gsar on 1999/10/24 22:20:42
+ Log: remove unused interpreter globals
Branch: perl
- + t/base/rs.t
- ! perl.h pod/perlvar.pod sv.c
+ ! deb.c dump.c embed.h embed.pl embedvar.h ext/POSIX/POSIX.xs
+ ! global.sym gv.c gv.h intrpvar.h objXSUB.h perl.c perlapi.c
+ ! proto.h toke.c
____________________________________________________________________________
-[ 1098] By: gsar on 1998/06/10 06:36:59
- Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- Message-Id: <9806042022.AA10418@claudius.bfsec.bt.co.uk>
- Subject: [PATCH fror 5.004_66] DB_File-1.60
- Date: Thu, 4 Jun 1998 21:22:35 +0100 (BST)
+[ 4447] By: jhi on 1999/10/24 21:49:52
+ Log: Another hints tweak.
+ Branch: cfgperl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 4446] By: jhi on 1999/10/24 21:48:02
+ Log: Hints tweak.
+ Branch: cfgperl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 4445] By: nick on 1999/10/24 21:03:28
+ Log: Integrate own changes to mainline.
+ Branch: utfperl
+ !> installperl pp.c
+____________________________________________________________________________
+[ 4444] By: nick on 1999/10/24 20:54:06
+ Log: Avoid creating GV with NULL name when vivifying nameless scalars.
+ (Fix/workround for [ID19991024.001])
Branch: perl
- + ext/DB_File/dbinfo
- ! MANIFEST ext/DB_File/Changes ext/DB_File/DB_File.pm
- ! ext/DB_File/DB_File.xs ext/DB_File/typemap t/lib/db-btree.t
- ! t/lib/db-hash.t t/lib/db-recno.t
+ ! pp.c
+____________________________________________________________________________
+[ 4443] By: nick on 1999/10/24 15:09:51
+ Log: Follow that camel ... another sync.
+ Branch: utfperl
+ +> os2/OS2/REXX/DLL/Changes os2/OS2/REXX/DLL/DLL.pm
+ +> os2/OS2/REXX/DLL/DLL.xs os2/OS2/REXX/DLL/MANIFEST
+ +> os2/OS2/REXX/DLL/Makefile.PL os2/OS2/REXX/t/rx_emxrv.t
+ !> (integrate 36 files)
____________________________________________________________________________
-[ 1097] By: gsar on 1998/06/10 06:33:16
- Log: Message-ID: <19980604134731.D24343@perlsupport.com>
- Date: Thu, 4 Jun 1998 13:47:31 -0400
- From: Chip Salzenberg <chip@perl.org>
- Subject: [PATCH] Invalidate method cache on C<local *subname>
+[ 4442] By: gsar on 1999/10/24 14:40:01
+ Log: typo in installperl (from Paul Moore <gustav@morpheus.demon.co.uk>)
Branch: perl
- ! scope.c t/op/method.t
+ ! installperl
____________________________________________________________________________
-[ 1096] By: gsar on 1998/06/10 06:30:51
- Log: From: Norton Allen <allen@huarp.harvard.edu>
- Message-Id: <199806031908.PAA04183@bottesini.harvard.edu>
- Subject: [PATCH] _66 MM_Unix.pm for QNX
- Date: Wed, 3 Jun 1998 15:08:33 -0400 (edt)
+[ 4441] By: gsar on 1999/10/24 14:33:11
+ Log: test in change#4428 needs strict interpretation of C modulus
Branch: perl
- ! lib/ExtUtils/MM_Unix.pm
+ ! t/op/int.t
____________________________________________________________________________
-[ 1095] By: gsar on 1998/06/10 06:29:21
- Log: From: Norton Allen <allen@huarp.harvard.edu>
- Message-Id: <199806031909.PAA04358@bottesini.harvard.edu>
- Subject: [PATCH] _66 proto.h
- Date: Wed, 3 Jun 1998 15:09:14 -0400 (edt)
+[ 4440] By: gsar on 1999/10/24 13:47:17
+ Log: don't allow SIGCHLD to be ignored at startup, or wait*() and
+ $? break
Branch: perl
- ! proto.h
+ ! perl.c pod/perldelta.pod pod/perldiag.pod
____________________________________________________________________________
-[ 1094] By: gsar on 1998/06/10 06:26:39
- Log: Applied relevant parts of:
- From: Paul Johnson <pjcj@transeda.com>
- Date: Wed, 3 Jun 1998 19:07:55 +0100 (BST)
- Message-Id: <199806031807.TAA04100@west-tip.transeda.com>
- Subject: [PATCH] Enhancing xsubpp's support for C++
+[ 4439] By: jhi on 1999/10/24 13:19:17
+ Log: test for #2835 (yeah, better later than never)
+ Branch: cfgperl
+ ! t/op/array.t
+____________________________________________________________________________
+[ 4438] By: gsar on 1999/10/24 12:59:12
+ Log: typo, doc tweak
Branch: perl
- ! lib/ExtUtils/xsubpp
+ ! lib/attributes.pm pod/perlop.pod
____________________________________________________________________________
-[ 1093] By: gsar on 1998/06/10 06:22:54
- Log: Message-ID: <19980603112219.B7638@asic.sc.ti.com>
- Date: Wed, 3 Jun 1998 11:22:19 -0500
- From: Graham Barr <gbarr@ti.com>
- Subject: [PATCH perl5.004_04-m4] fix for undef as last arg to setsockopt
+[ 4437] By: gsar on 1999/10/24 11:59:55
+ Log: allow get() and reftype() functions to be imported (from
+ Spider Boardman)
Branch: perl
- ! pp_sys.c
+ ! lib/attributes.pm
____________________________________________________________________________
-[ 1092] By: gsar on 1998/06/10 06:20:44
- Log: Message-Id: <199806030919.KAA03527@sale-wts>
- Date: Wed, 3 Jun 1998 10:20:06 +0100 (BST)
- From: Alan Burlison <Alan.Burlison@UK.Sun.com>
- Subject: [PATCH 5.004_66] ExtUtils::Installed.pm and ExtUtils::Packlist.pm
+[ 4436] By: gsar on 1999/10/24 11:52:53
+ Log: suppress scalar leak messages for known leaks (from
+ Robin Barker <rmb1@cise.npl.co.uk>)
Branch: perl
- ! lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
+ ! Changes t/op/lex_assign.t t/pragma/warn/op
____________________________________________________________________________
-[ 1091] By: gsar on 1998/06/10 06:18:42
- Log: Message-Id: <3.0.5.32.19980601122229.00a58420@ous.edu>
- Date: Mon, 01 Jun 1998 12:22:29 -0700
- From: SYSTEM@cedar.osshe.edu (by way of Dan Sugalski <sugalskd@ous.edu>)
- Subject: [PATCH 5.004_66] proto.h change to make byterun() visible to VMS
+[ 4435] By: gsar on 1999/10/24 11:39:42
+ Log: VMS tweak (suggested by Craig A. Berry <craig.berry@metamor.com>)
Branch: perl
- ! proto.h
+ ! ext/B/defsubs_h.PL
____________________________________________________________________________
-[ 1090] By: gsar on 1998/06/10 06:14:24
- Log: A tweaked version of:
- Date: Mon, 1 Jun 1998 12:05:47 -0700
- From: SYSTEM@cedar.osshe.edu
- Message-Id: <980601120547.20617d54@cedar.osshe.edu>
- Subject: [PATCH 5.004_66] Fix problem with SDBM makefile on VMS
+[ 4434] By: gsar on 1999/10/24 11:36:08
+ Log: relax range checking if they ask for it (from John L. Allen
+ <allen@grumman.com>)
Branch: perl
- ! ext/SDBM_File/sdbm/Makefile.PL
+ ! lib/Time/Local.pm
____________________________________________________________________________
-[ 1089] By: gsar on 1998/06/10 05:58:00
- Log: Message-Id: <m0yfdd4-000Eb2C@alias-2.pr.mcs.net>
- Date: Fri, 29 May 1998 23:52:26 -0500 (CDT)
- From: Stephen McCamant <alias@mcs.com>
- Subject: [PATCH] Re: Uninitialised error from -M()
+[ 4433] By: gsar on 1999/10/24 11:25:51
+ Log: README nits pointed out by Chris Nandor <pudge@pobox.com>
Branch: perl
- ! op.c t/op/stat.t
+ ! README lib/File/Path.pm
____________________________________________________________________________
-[ 1088] By: gsar on 1998/06/10 05:55:24
- Log: Date: Sat, 30 May 1998 08:07:01 -0400
- From: lvirden@cas.org (Larry Virden)
- Message-Id: <199805301207.IAA08856@cas.org>
- Subject: PATCH for pod and warning notice
+[ 4432] By: gsar on 1999/10/24 11:11:02
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 24 Oct 1999 03:24:28 -0400 (EDT)
+ Message-Id: <199910240724.DAA12230@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.005_62] OS/2 improvements
Branch: perl
- ! pod/perlguts.pod
+ + os2/OS2/REXX/DLL/Changes os2/OS2/REXX/DLL/DLL.pm
+ + os2/OS2/REXX/DLL/DLL.xs os2/OS2/REXX/DLL/MANIFEST
+ + os2/OS2/REXX/DLL/Makefile.PL os2/OS2/REXX/t/rx_emxrv.t
+ ! MANIFEST hints/os2.sh mg.c miniperlmain.c os2/Changes
+ ! os2/OS2/REXX/Changes os2/OS2/REXX/Makefile.PL
+ ! os2/OS2/REXX/REXX.pm os2/OS2/REXX/REXX.xs
+ ! os2/OS2/REXX/t/rx_dllld.t os2/OS2/REXX/t/rx_objcall.t
+ ! os2/OS2/REXX/t/rx_tievar.t os2/OS2/REXX/t/rx_tieydb.t
+ ! os2/OS2/REXX/t/rx_vrexx.t os2/dl_os2.c os2/os2.c os2/os2ish.h
+ ! perl.c perl.h t/io/fs.t t/op/magic.t
____________________________________________________________________________
-[ 1087] By: gsar on 1998/06/10 05:52:05
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Date: Mon, 8 Jun 1998 14:45:36 -0400 (EDT)
- Message-Id: <Pine.SUN.3.96.980608144437.13972A-100000@newton.phys>
- Subject: [PATCH 5.004_66] Config_66-01
+[ 4431] By: gsar on 1999/10/24 10:50:14
+ Log: install all README.foo with pod content as podfoo.pod
Branch: perl
- ! Configure MANIFEST Porting/Glossary Porting/config.sh
- ! Porting/config_H config_h.SH
+ ! Makefile.SH installman
____________________________________________________________________________
-[ 1086] By: gsar on 1998/06/10 05:46:38
- Log: Message-Id: <3.0.5.32.19980608161314.00a0a880@ous.edu>
- Date: Mon, 08 Jun 1998 16:13:14 -0700
- From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: [PATCH 5.004_66] Documentation patch for Semaphore.pm
+[ 4430] By: gsar on 1999/10/24 09:28:24
+ Log: @INC needs ../lib
Branch: perl
- ! ext/Thread/Thread/Semaphore.pm
+ ! t/op/int.t
____________________________________________________________________________
-[ 1085] By: gsar on 1998/06/10 05:44:44
- Log: Message-Id: <3.0.5.32.19980608161002.00a64a70@ous.edu>
- Date: Mon, 08 Jun 1998 16:10:02 -0700
- From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: [PATCH 5.004_66]Doc & feature patch for Thread::Queue
+[ 4429] By: jhi on 1999/10/23 21:47:49
+ Log: More printf-fixes (see also #4426).
+ Branch: cfgperl
+ ! deb.c dump.c ext/Data/Dumper/Dumper.xs
+ ! ext/Devel/DProf/DProf.xs malloc.c mg.c op.c perl.c pp.c
+ ! pp_ctl.c regcomp.c regexec.c run.c scope.c sv.c util.c
+____________________________________________________________________________
+[ 4428] By: gsar on 1999/10/23 20:28:56
+ Log: fix accidental C modulo semantics on integer-valued operations
+ (e.g. caused C<length("abc") % -10> to return 3 rather than -7)
Branch: perl
- - vms/descrip.mms
- ! ext/Thread/Thread/Queue.pm
+ ! op.c t/op/int.t
____________________________________________________________________________
-[ 1084] By: gsar on 1998/06/10 05:38:11
- Log: Message-Id: <3.0.5.32.19980608153828.00a81ea0@ous.edu>
- Date: Mon, 08 Jun 1998 15:38:28 -0700
- From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: [PATCH POINTER 5.004_66]A configuration system for VMS perl
- Branch: perl
- + configure.com vms/descrip_mms.template vms/munchconfig.c
- + vms/subconfigure.com
- - vms/config.vms vms/fndvers.com
- ! MANIFEST README.vms lib/ExtUtils/MM_VMS.pm
-____________________________________________________________________________
-[ 1083] By: gsar on 1998/06/10 05:07:04
- Log: xsubpp enhancements ($CPAN/authors/id/ILYAZ/patches/diff_xsubpp_65), a
- variant of:
- Message-Id: <199712131231.HAA04125@monk.mps.ohio-state.edu>
- Date: Sat, 13 Dec 1997 07:31:02 EST
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: 5.004_55: xsubpp: new keywords INTERFACE C_ARGS
+[ 4427] By: jhi on 1999/10/23 16:10:10
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> sv.c win32/win32.c
+____________________________________________________________________________
+[ 4426] By: jhi on 1999/10/23 16:04:02
+ Log: Fix the printfing nits pointed out by using gcc -Wall and
+ Configure -Duse64bits -Dccflags=-DDEBUGGING in Solaris,
+ plus few other warnings in Dumper.xs.
+ Branch: cfgperl
+ ! ext/Data/Dumper/Dumper.xs ext/Devel/DProf/DProf.xs
+ ! ext/Devel/Peek/Peek.xs regcomp.c regexec.c sv.c util.c
+____________________________________________________________________________
+[ 4425] By: jhi on 1999/10/23 15:16:41
+ Log: Configure regen to pick up the new installation directories
+ from Policy_sh.SH. The explanations of "public add-ons" and
+ "vendor-supplied" could do with more work.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 4424] By: nick on 1999/10/23 00:46:22
+ Log: Resolve mainline before possible hacking operertunity this weekend
+ Branch: utfperl
+ +> pod/perlfilter.pod
+ !> (integrate 32 files)
+____________________________________________________________________________
+[ 4423] By: jhi on 1999/10/22 22:53:17
+ Log: Update Policy_sh.SH to handle the newer installation directives.
+ From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_62] Policy_sh.SH update
+ Date: Fri, 22 Oct 1999 16:47:34 -0400 (EDT)
+ Message-ID: <Pine.SOL.4.10.9910221645470.15232-100000@maxwell.phys.lafayette.edu>
+ Branch: cfgperl
+ ! Policy_sh.SH
+____________________________________________________________________________
+[ 4422] By: jhi on 1999/10/22 22:44:44
+ Log: so back to 'so', from Stephanie Beals <bealzy@us.ibm.com>
+ Branch: cfgperl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 4421] By: gsar on 1999/10/22 21:16:44
+ Log: sv_vcatpvfn() bug: fell through to assuming intsize of 'q' for
+ C<"%ld", long_val>
Branch: perl
- ! XSUB.h lib/ExtUtils/xsubpp pod/perlxs.pod
+ ! sv.c
____________________________________________________________________________
-[ 1082] By: gsar on 1998/06/10 04:52:26
- Log: add newer malloc.c from Ilya Zakharevich <ilya@math.ohio-state.edu>
- (from $CPAN/authors/id/ILYAZ/patches/diff_malloc_65)
+[ 4420] By: gsar on 1999/10/22 16:36:46
+ Log: win32_utime() on directories should use localtime() rather
+ than gmtime() (from Jan Dubois)
Branch: perl
- ! malloc.c
+ ! win32/win32.c
+____________________________________________________________________________
+[ 4419] By: jhi on 1999/10/21 10:31:41
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Makefile.SH lib/CPAN/FirstTime.pm op.c opcode.h opcode.pl
+ !> t/lib/glob-basic.t t/op/sort.t
____________________________________________________________________________
-[ 1081] By: gsar on 1998/06/10 03:45:10
- Log: reverse integrate contents of win32 branch into mainline
+[ 4418] By: gsar on 1999/10/20 23:49:47
+ Log: add test for change#4417
Branch: perl
- !> (integrate 44 files)
+ ! t/op/sort.t
____________________________________________________________________________
-[ 1080] By: gsar on 1998/06/09 17:37:55
- Log: `p4 integrate -b ASPerl && p4 resolve -at`
- Branch: asperl
- !> (integrate 43 files)
+[ 4417] By: gsar on 1999/10/20 23:45:03
+ Log: avoid coredump on C<sort { my $c; return $a cmp $b } ...>
+ Branch: perl
+ ! op.c
____________________________________________________________________________
-[ 1079] By: gsar on 1998/06/09 00:59:06
- Log: add examples of diff(1) usage
- Branch: win32/perl
- ! Porting/patching.pod
+[ 4416] By: gsar on 1999/10/20 01:00:50
+ Log: fix prototype mismatch (from Hans Mulder <hansm@xs4all.nl>)
+ Branch: perl
+ ! lib/CPAN/FirstTime.pm
____________________________________________________________________________
-[ 1078] By: gsar on 1998/06/09 00:52:23
- Log: undo change#1077
- Branch: win32/perl
- ! sv.c
+[ 4415] By: gsar on 1999/10/20 00:52:34
+ Log: disable optimizing troublesome ops in change#3612
+ (from Ilya Zakharevich)
+ Branch: perl
+ ! Makefile.SH opcode.h opcode.pl
____________________________________________________________________________
-[ 1077] By: gsar on 1998/06/06 16:47:32
- Log: make sv_setsv() treat freed SVs like SVt_NULL
- Branch: win32/perl
- ! sv.c
+[ 4414] By: gsar on 1999/10/20 00:37:46
+ Log: skip unreadable directory test when running as root
+ Branch: perl
+ ! t/lib/glob-basic.t
____________________________________________________________________________
-[ 1076] By: gsar on 1998/06/05 19:03:14
- Log: delete undiscussed AS changes for PPD (broke .packlist
- mechanism)
- Branch: win32/perl
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
-____________________________________________________________________________
-[ 1075] By: gsar on 1998/06/05 18:18:44
- Log: add AS patch#26 (rename THIS to PERL_OBJEC_THIS to avoid clash
- with the xsubpp-generated symbol)
- Branch: win32/perl
- ! ObjXSub.h perl.c perl.h pp_ctl.c pp_hot.c toke.c
- ! win32/dl_win32.xs
-____________________________________________________________________________
-[ 1074] By: gsar on 1998/06/04 22:45:18
- Log: add AS patch#25 (allow B build with -DPERL_OBJECT)
- Branch: win32/perl
- ! ObjXSub.h byterun.h embed.h embedvar.h ext/B/B.xs intrpvar.h
- ! objpp.h proto.h util.c win32/Makefile win32/makefile.mk
-____________________________________________________________________________
-[ 1073] By: nick on 1998/06/04 17:18:14
- Log: resolve -at win32 branch into ansiperl
- Branch: ansiperl
- +> ObjXSub.h XSLock.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
- +> ipsock.h ipstdio.h objpp.h t/lib/h2ph.h t/lib/h2ph.pht
- +> t/lib/h2ph.t win32/GenCAPI.pl
- !> (integrate 127 files)
-____________________________________________________________________________
-[ 1072] By: gsar on 1998/06/04 01:49:24
- Log: document CORE::GLOBAL:: and global overriding, fix up
- File::DosGlob, testsuited and all
- Branch: win32/perl
- ! lib/File/DosGlob.pm pod/perlsub.pod t/lib/dosglob.t
-____________________________________________________________________________
-[ 1071] By: gsar on 1998/06/03 22:12:55
- Log: add AS patch#24, remove one other instance of error_no
- that was missed (patch#23 was intentionally skipped)
- Branch: win32/perl
- ! embedvar.h globals.c perlvars.h win32/makedef.pl
- ! win32/runperl.c
+[ 4413] By: jhi on 1999/10/19 09:26:52
+ Log: Avoid GNU ar if HP cc is being used.
+ Branch: cfgperl
+ ! hints/hpux.sh
____________________________________________________________________________
-[ 1070] By: gsar on 1998/06/01 19:42:06
- Log: fix Liblist.pm to tolerate backslashen in paths
- Branch: win32/perl
- ! lib/ExtUtils/Liblist.pm
-____________________________________________________________________________
-[ 1069] By: gsar on 1998/06/01 07:43:02
- Log: @INC construction on win32 cleaned up
- - perl.dll location based paths should be much more reliable now
- - registry stuff unchanged
- - Config.pm now has all the installfoolib entries for MakeMaker et al
- Branch: win32/perl
- ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/config_h.PL win32/config_sh.PL win32/makefile.mk
- ! win32/runperl.c win32/win32.c win32/win32.h
+[ 4412] By: jhi on 1999/10/19 07:24:29
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> perlvars.h
____________________________________________________________________________
-[ 1068] By: gsar on 1998/05/31 21:52:18
- Log: semctl tweak
- Message-Id: <199805312127.QAA06750@gbarr.connect.net>
- Date: Sun, 31 May 1998 16:27:33 CDT
- From: Graham Barr <gbarr@pobox.com>
- Subject: Not OK: perl 5.00466 on i586-linux-thread 2.0.31
- Branch: win32/perl
- ! doio.c
+[ 4411] By: jhi on 1999/10/19 07:22:34
+ Log: Long double support: sqrtl et al are not available everywhere,
+ e.g. not in Solaris, even when long doubles are.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h
____________________________________________________________________________
-[ 1067] By: gsar on 1998/05/31 21:07:44
- Log: minimal fix to enable compiling with -DMULTIPLICITY
- (non-threadsafe regcomp.c globals need revisiting)
- Branch: win32/perl
- ! ObjXSub.h embedvar.h interp.sym intrpvar.h regcomp.c
- ! win32/GenCAPI.pl win32/makedef.pl
+[ 4410] By: jhi on 1999/10/19 07:21:42
+ Log: Add sqrtl probe, add echo dependencies.
+ Branch: metaconfig
+ ! U/threads/d_pthreadj.U
+ Branch: metaconfig/U/perl
+ + d_sqrtl.U
+ ! i_inttypes.U io64.U
____________________________________________________________________________
-[ 1066] By: gsar on 1998/05/30 21:35:37
- Log: integrate mainline changes (ASPerl branch is identical to
- win32 branch as of this change)
- Branch: asperl
- !> MANIFEST Todo.5.005 embed.h ext/POSIX/POSIX.xs global.sym
- !> lib/ExtUtils/Mksymlists.pm pod/perldelta.pod pp_sys.c
- !> t/op/ipcmsg.t t/op/ipcsem.t win32/Makefile win32/config.bc
- !> win32/config.gc win32/config.vc win32/config_H.bc
- !> win32/config_H.gc win32/config_H.vc win32/makefile.mk
+[ 4409] By: gsar on 1999/10/19 02:18:54
+ Log: perl_mutex n/a if !USE_THREADS
+ Branch: perl
+ ! perlvars.h
+____________________________________________________________________________
+[ 4408] By: jhi on 1999/10/18 20:13:02
+ Log: Forgotten s/warning/warnings/.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 4407] By: jhi on 1999/10/18 20:02:12
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> pod/perlfilter.pod
+ !> (integrate 30 files)
+____________________________________________________________________________
+[ 4406] By: gsar on 1999/10/18 16:32:10
+ Log: added intro to source filters from Paul Marquess
+ Branch: perl
+ + pod/perlfilter.pod
+ ! MANIFEST pod/perldelta.pod
+____________________________________________________________________________
+[ 4405] By: gsar on 1999/10/18 05:53:06
+ Log: missing manpages
+ Branch: perl
+ ! installman
+____________________________________________________________________________
+[ 4404] By: gsar on 1999/10/18 05:09:22
+ Log: pod updates from Tom Christiansen
+ Branch: perl
+ ! lib/Pod/Man.pm pod/perldelta.pod pod/perlmodlib.pod
+____________________________________________________________________________
+[ 4403] By: gsar on 1999/10/17 23:43:59
+ Log: PL_malloc_mutex needs to be global, not per-interpreter
+ (malloc.c has static data)
+ Branch: perl
+ ! embedvar.h intrpvar.h objXSUB.h perl.c perlvars.h
+____________________________________________________________________________
+[ 4402] By: gsar on 1999/10/17 22:30:30
+ Log: support PERL_IMPLICIT_SYS with MULTIPLICITY/USE_THREADS on
+ windows
+ Branch: perl
+ ! XSUB.h ext/POSIX/POSIX.xs intrpvar.h makedef.pl malloc.c
+ ! perl.c perl.h perlio.c win32/perllib.c win32/win32.c
+ ! win32/win32.h
____________________________________________________________________________
-[ 1065] By: gsar on 1998/05/30 21:13:06
- Log: change#1060 was inexplicably missing some of the "ensure
- AS stuff does no harm" fixes
- Branch: win32/perl
- ! embed.h global.sym win32/Makefile win32/makefile.mk
+[ 4401] By: gsar on 1999/10/17 20:33:42
+ Log: serious bug introduced by G_VOID changes in 5.003_96: scalar
+ eval"" did not pop stack correctly; C<$a = eval "(1,2)x1">
+ is one symptom of the problem
+ Branch: perl
+ ! pp_ctl.c t/op/eval.t
+____________________________________________________________________________
+[ 4400] By: gsar on 1999/10/17 18:36:46
+ Log: remove FileHandle from list of PodParser dependencies (the
+ difference is 20 files vs 6 files loaded!)
+ Branch: perl
+ ! lib/Pod/Parser.pm lib/Pod/Select.pm pod/perldelta.pod
+ ! t/pod/testcmp.pl
____________________________________________________________________________
-[ 1064] By: gsar on 1998/05/30 21:10:27
- Log: integrate mainline to pick up trivial changes
- Branch: win32/perl
- !> MANIFEST pp_sys.c
+[ 4399] By: nick on 1999/10/17 14:51:35
+ Log: Pre-trip resolve
+ Branch: utfperl
+ !> installperl lib/Text/Tabs.pm perl.c pp_hot.c
+____________________________________________________________________________
+[ 4398] By: gsar on 1999/10/17 09:19:24
+ Log: make installperl ignore RCS files (from Michael G Schwern
+ <schwern@pobox.com>)
+ Branch: perl
+ ! installperl lib/Text/Tabs.pm
+____________________________________________________________________________
+[ 4397] By: gsar on 1999/10/16 18:30:14
+ Log: another bug in change#3386 (CATCH_SET wasn't reverted correctly)
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 4396] By: jhi on 1999/10/16 17:44:39
+ Log: Missing comma.
+ Branch: cfgperl
+ ! lib/diagnostics.pm
+____________________________________________________________________________
+[ 4395] By: gsar on 1999/10/16 17:18:36
+ Log: assumption about @_ always being non-REAL doesn't hold when
+ debugger is running; DB::sub() can call arbitrary stuff
+ that modifies @_ at will
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 4394] By: nick on 1999/10/16 09:35:20
+ Log: Resolve utfperl branch against mainline as of _62
+ Branch: utfperl
+ +> eg/cgi/dna_small_gif.uu eg/cgi/wilogo_gif.uu
+ +> ext/DB_File/hints/sco.pl ext/DynaLoader/hints/aix.pl
+ +> ext/File/Glob/Changes ext/File/Glob/Glob.pm
+ +> ext/File/Glob/Glob.xs ext/File/Glob/Makefile.PL
+ +> ext/File/Glob/TODO ext/File/Glob/bsd_glob.c
+ +> ext/File/Glob/bsd_glob.h ext/NDBM_File/hints/sco.pl
+ +> pod/perlhack.pod t/lib/glob-basic.t t/lib/glob-global.t
+ +> t/lib/glob-taint.t win32/genmk95.pl
+ - eg/cgi/dna.small.gif.uu eg/cgi/wilogo.gif.uu
+ !> (integrate 144 files)
+____________________________________________________________________________
+[ 4393] By: gsar on 1999/10/16 04:07:02
+ Log: OS/2 support bits (from Ilya Zakharevich)
+ Branch: perl
+ ! hints/os2.sh makedef.pl os2/Makefile.SHs t/lib/glob-basic.t
+____________________________________________________________________________
+[ 4392] By: jhi on 1999/10/15 10:28:09
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes MANIFEST Makefile.SH Porting/makerel lib/Pod/Man.pm
+ !> lib/Pod/Parser.pm op.c pod/perldelta.pod pod/perlopentut.pod
+ !> win32/Makefile win32/makefile.mk
----------------
-Version 5.004_66
+Version 5.005_62
----------------
____________________________________________________________________________
-[ 1063] By: mbeattie on 1998/05/29 15:19:55
- Log: Remove duplicate win32/TEST line from MANIFEST.
+[ 4391] By: gsar on 1999/10/15 10:12:42
+ Log: here be 5.005_62
Branch: perl
- ! MANIFEST
+ ! Changes MANIFEST Porting/makerel
____________________________________________________________________________
-[ 1062] By: mbeattie on 1998/05/29 15:18:33
- Log: Add missing ";" to pp_umask (spotted by Jarkko Hietaniemi).
+[ 4390] By: gsar on 1999/10/15 09:45:51
+ Log: lvalue subs patch (change#4081) breaks C<\(Foo->Bar())>;
+ avoid tickling it in Pod::Man for now; other nits in
+ Pod::*
Branch: perl
- ! pp_sys.c
+ ! lib/Pod/Man.pm lib/Pod/Parser.pm pod/perldelta.pod
+ ! pod/perlopentut.pod
____________________________________________________________________________
-[ 1061] By: mbeattie on 1998/05/29 12:02:17
- Log: Integrate from win32 branch into mainline (this now pulls in the
- asperl stuff).
- Branch: perl
- +> ObjXSub.h XSLock.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
- +> ipsock.h ipstdio.h objpp.h t/lib/h2ph.h t/lib/h2ph.pht
- +> t/lib/h2ph.t win32/GenCAPI.pl
- !> (integrate 104 files)
-____________________________________________________________________________
-[ 1060] By: gsar on 1998/05/29 11:05:50
- Log: reverse integrate asperl branch contents (phew!)
- - various fixups to ensure AS stuff does no harm
- - adjust win32/makefiles for the new directory layout (new layout
- looks rather a muddle--needs rework)
- - verified build & test on NT and Solaris/gcc
- Branch: win32/perl
- +> ObjXSub.h XSLock.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
- +> ipsock.h ipstdio.h objpp.h win32/GenCAPI.pl
- ! ext/POSIX/POSIX.xs lib/ExtUtils/Mksymlists.pm win32/Makefile
- ! win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/makefile.mk
- !> (integrate 77 files)
+[ 4389] By: gsar on 1999/10/15 08:55:01
+ Log: disable internal globbing for miniperl (or build breaks out
+ in a rash of failed dependencies)
+ Branch: perl
+ ! Makefile.SH op.c win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 1059] By: gsar on 1998/05/29 08:33:56
- Log: asperl branch verified to build w/o PERL_OBJECT on Solaris and NT
- Branch: asperl
- ! util.c
+[ 4388] By: jhi on 1999/10/15 08:07:49
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes ext/POSIX/POSIX.xs lib/Benchmark.pm pod/perldelta.pod
+ !> pod/perlfaq2.pod win32/include/dirent.h win32/win32.c
____________________________________________________________________________
-[ 1058] By: gsar on 1998/05/29 08:31:09
- Log: type xtext for *.t that were missing it
- Branch: asperl
- ! t/lib/thread.t t/op/nothread.t
+[ 4387] By: gsar on 1999/10/15 07:46:24
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ ! Changes
+ !> pod/perldelta.pod pod/perldiag.pod regcomp.c
+ !> t/pragma/warn/regcomp
____________________________________________________________________________
-[ 1057] By: gsar on 1998/05/29 08:28:46
- Log: stray t/op/ipc*.t fixups
- Branch: win32/perl
- ! t/op/ipcmsg.t t/op/ipcsem.t
+[ 4386] By: gsar on 1999/10/15 05:45:36
+ Log: various little goofs in change#4385
+ Branch: perl
+ ! win32/include/dirent.h win32/win32.c
____________________________________________________________________________
-[ 1056] By: gsar on 1998/05/29 07:41:49
- Log: fixups to make it build and pass tests under both compilers
- Branch: asperl
- ! ObjXSub.h objpp.h proto.h
+[ 4385] By: gsar on 1999/10/15 04:49:09
+ Log: win32_*dir() cleanup; win32_readdir() iterates as necessary
+ rather than win32_opendir() reading all files up front (untested)
+ Branch: perl
+ ! win32/include/dirent.h win32/win32.c
____________________________________________________________________________
-[ 1055] By: gsar on 1998/05/29 07:22:51
- Log: integrate mainline changes
- Branch: asperl
- +> t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t
- !> (integrate 69 files)
- Branch: win32/perl
- ! Todo.5.005 pod/perldelta.pod
-____________________________________________________________________________
-[ 1054] By: gsar on 1998/05/29 05:04:03
- Log: add a txt_compare() routine to t/h2ph.t for DOSISH sanity
- Branch: win32/perl
- ! t/lib/h2ph.t
-____________________________________________________________________________
-[ 1053] By: gsar on 1998/05/29 05:01:54
- Log: misc changes
- - remove code that works around lack of I_STDARG (we're a happy ANSI family)
- - leave dump_foo() stubs when not -DDEBUGGING for consistent symbol exports
- Branch: win32/perl
- ! deb.c dump.c ext/DynaLoader/dlutils.c ext/POSIX/POSIX.xs
- ! perl.h perlio.c proto.h regcomp.c run.c scope.c sv.c util.c
- ! x2p/util.c x2p/util.h
-____________________________________________________________________________
-[ 1052] By: gsar on 1998/05/29 02:31:44
- Log: merge changes#1014,1038 from maintbranch
- Branch: win32/perl
- + t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t
- ! MANIFEST Makefile.SH doio.c ext/POSIX/POSIX.xs gv.c
- ! lib/Benchmark.pm lib/ExtUtils/MM_Unix.pm pod/perldebug.pod
- ! pod/perldiag.pod pod/perlfunc.pod pod/perlop.pod
- ! pod/perlre.pod pod/perltie.pod pod/perltrap.pod sv.c
- ! t/io/pipe.t utils/h2ph.PL
-____________________________________________________________________________
-[ 1051] By: gsar on 1998/05/29 01:38:51
- Log: regenerate win32/config_H.?c
- Branch: win32/perl
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+[ 4384] By: gsar on 1999/10/15 01:34:09
+ Log: Benchmark notes (from Barrie Slaymaker <barries@slaysys.com>)
+ Branch: perl
+ ! lib/Benchmark.pm pod/perldelta.pod
____________________________________________________________________________
-[ 1050] By: gsar on 1998/05/29 01:32:41
- Log: integrate mainline
- Branch: win32/perl
- ! win32/Makefile win32/makefile.mk
- !> Configure INSTALL MANIFEST Porting/Glossary Porting/config.sh
- !> Porting/config_H Porting/patching.pod config_h.SH doio.c
- !> ext/POSIX/hints/sunos_4.pl hints/bsdos.sh hints/openbsd.sh
- !> hints/solaris_2.sh hints/sunos_4_1.sh hints/svr4.sh
- !> lib/FileHandle.pm patchlevel.h perl.h plan9/config.plan9
- !> vms/config.vms win32/config.bc win32/config.gc win32/config.vc
-____________________________________________________________________________
-[ 1049] By: gsar on 1998/05/29 00:57:05
- Log: fix various shenanigans with C<environ>, BC and VC builds now pass
- all tests
- Branch: asperl
- ! globals.c win32/Makefile win32/makefile.mk win32/runperl.c
- ! win32/win32.h win32/win32iop.h
-____________________________________________________________________________
-[ 1048] By: mbeattie on 1998/05/28 18:07:24
- Log: Integrated win32 branch into mainline. The changes to t/op/ipc*.t
- in change 1043 clashed badly with changes made in the win32
- branch. I did an accept on the win32 branch version for now.
- Branch: perl
- +> t/op/die.t
- !> (integrate 52 files)
-____________________________________________________________________________
-[ 1047] By: mbeattie on 1998/05/28 17:59:18
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: [PATCH 5.004_65] Config_65-02-03.diff: SunOS and Solaris hints
- Date: Thu, 28 May 1998 13:27:25 -0400 (EDT)
- Subject: [PATCH 5.004_65] Config_65-03-04.diff: semctl probing
- Date: Thu, 28 May 1998 13:28:21 -0400 (EDT)
- Branch: perl
- ! Configure MANIFEST Porting/Glossary Porting/config.sh
- ! Porting/config_H config_h.SH doio.c ext/POSIX/hints/sunos_4.pl
- ! hints/solaris_2.sh hints/sunos_4_1.sh perl.h vms/config.vms
- ! win32/config.bc win32/config.gc win32/config.vc
+[ 4383] By: gsar on 1999/10/15 01:22:32
+ Log: include info about Perl Mongers in perlfaq2 (from David H. Adler
+ <dha@panix.com>)
+ Branch: perl
+ ! pod/perlfaq2.pod
____________________________________________________________________________
-[ 1046] By: mbeattie on 1998/05/28 17:55:48
- Log: Back out change 1043 since Andy's forthcoming Config patch
- includes a modified version.
+[ 4382] By: gsar on 1999/10/15 01:14:22
+ Log: From: jand@ActiveState.com (Jan Dubois)
+ Date: Fri, 15 Oct 1999 01:14:23 +0200
+ Message-ID: <380f61ae.18202914@smtprelay.t-online.de>
+ Subject: [PATCH 5.005_61] Prevent "Out of memory" error in POSIX's strftime()
Branch: perl
- ! Configure config_h.SH doio.c perl.h
+ ! ext/POSIX/POSIX.xs
____________________________________________________________________________
-[ 1045] By: mbeattie on 1998/05/28 17:52:40
- Log: Bump patchlevel.h to 66.
+[ 4381] By: jhi on 1999/10/14 22:11:36
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> XSUB.h cop.h embed.h embed.pl ext/File/Glob/bsd_glob.c
+ !> lib/Time/Local.pm perl.c perlapi.c pod/perlop.pod pp_ctl.c
+ !> proto.h scope.c scope.h t/op/runlevel.t util.c win32/Makefile
+ !> win32/makefile.mk
+____________________________________________________________________________
+[ 4380] By: jhi on 1999/10/14 22:08:22
+ Log: Warn inside character classes about unknown backslash escapes
+ (that are not caught earlier because of being completely unknown,
+ such as \m), such as \z (because they make do sense inside regexen,
+ but not inside character classes).
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perldiag.pod regcomp.c
+ ! t/pragma/warn/regcomp
+____________________________________________________________________________
+[ 4379] By: gsar on 1999/10/14 18:26:56
+ Log: clarify significance of parens for "x" (from M.J.T. Guy
+ <mjtg@cus.cam.ac.uk>)
Branch: perl
- ! patchlevel.h
+ ! pod/perlop.pod
____________________________________________________________________________
-[ 1044] By: mbeattie on 1998/05/28 17:51:49
- Log: From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Subject: [PATCH] _04m2 <DOC> perlfunc.pod (fwd)
- Date: Fri, 15 May 1998 16:18:26 -0600 (MDT)
- (above minus the t/system.t test pending checking)
- Subject: [PATCH] 5.004[04|65] <DOC> FileHandle.pm
- Date: Wed, 20 May 1998 19:50:50 -0600 (MDT)
- Subject: [PATCH] _65 and _04 <DOC> patching.pod
- Date: Thu, 21 May 1998 16:33:03 -0600 (MDT)
+[ 4378] By: gsar on 1999/10/14 18:25:20
+ Log: make timelocal work better when time is close to the epoch
+ east of GMT (from Keiki SATOH <kki@wakusei.ne.jp>)
Branch: perl
- ! Porting/patching.pod lib/FileHandle.pm pod/perlfunc.pod
+ ! lib/Time/Local.pm
____________________________________________________________________________
-[ 1043] By: mbeattie on 1998/05/28 17:42:21
- Log: This change really is:
- Subject: [PATCH] 5.004_65: the infamous semctl()
- Date: Sun, 24 May 1998 16:13:21 +0300 (EET DST)
- From: Jarkko Hietaniemi <jhi@iki.fi>
-
- Change 1041 claimed to be this patch but was really:
- Subject: [PATCH] 5.004_65: t/op/ipc*.t
- Date: Sat, 16 May 1998 00:52:39 +0300 (EET DST)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 4377] By: gsar on 1999/10/14 18:15:11
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! Configure config_h.SH doio.c perl.h
+ +> ext/DB_File/hints/sco.pl
+ !> MANIFEST hints/aix.sh hints/linux.sh hints/svr5.sh
+ !> pod/perldelta.pod pod/perldiag.pod pod/perlop.pod
+ !> pod/perlre.pod regcomp.c t/op/re_tests t/pragma/warn/regcomp
____________________________________________________________________________
-[ 1042] By: mbeattie on 1998/05/28 17:36:57
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: [PATCH 5.004_65] Config_65-01: lchown() detection.
- Date: Thu, 28 May 1998 13:25:21 -0400 (EDT)
- Subject: [PATCH 5.004_65] Config_65-01-02.diff: INSTALL and hints fixes
- Date: Thu, 28 May 1998 13:26:18 -0400 (EDT)
+[ 4376] By: gsar on 1999/10/14 17:47:35
+ Log: fix POPSTACK panics that ensued from bad interaction between
+ runlevels and stack of stacks (change#3988 done right);
+ basically, we pop the runlevel if the stacklevel is not the
+ same one we started the runlevel with
Branch: perl
- ! Configure INSTALL Porting/Glossary Porting/config.sh
- ! Porting/config_H config_h.SH doio.c hints/bsdos.sh
- ! hints/openbsd.sh hints/svr4.sh plan9/config.plan9
- ! vms/config.vms win32/config.bc win32/config.gc win32/config.vc
+ ! cop.h perl.c pp_ctl.c t/op/runlevel.t util.c
____________________________________________________________________________
-[ 1041] By: mbeattie on 1998/05/28 17:34:26
- Log: Subject: [PATCH] 5.004_65: the infamous semctl()
- Date: Sun, 24 May 1998 16:13:21 +0300 (EET DST)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 4375] By: gsar on 1999/10/14 15:54:48
+ Log: avoid warnings
Branch: perl
- ! t/op/ipcmsg.t t/op/ipcsem.t
+ ! ext/File/Glob/bsd_glob.c
____________________________________________________________________________
-[ 1040] By: gsar on 1998/05/28 02:06:47
- Log: tweaks to enable Borland build
- Branch: asperl
- ! win32/makefile.mk win32/win32.c
+[ 4374] By: jhi on 1999/10/14 10:08:44
+ Log: Warn about false ranges like \d-\w (see the change #4355).
+ The invalid ranges (b-a) warning message also enhanced.
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perldiag.pod regcomp.c t/op/re_tests
+ ! t/pragma/warn/regcomp
____________________________________________________________________________
-[ 1039] By: gsar on 1998/05/27 23:29:22
- Log: remove C<#define index strchr> from win32.h (unused, and the
- pollution causes spurious variable name changes in extensions)
- Branch: win32/perl
- ! win32/win32.h
+[ 4373] By: gsar on 1999/10/14 03:49:54
+ Log: File::Glob fixes for Windows
+ Branch: perl
+ ! XSUB.h ext/File/Glob/bsd_glob.c win32/Makefile
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 1038] By: TimBunce on 1998/05/27 17:29:15
- Log: Assorted patches:
-
- ------ BUILD PROCESS ------
-
- Title: "add utilities to make test dependencies"
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Msg-ID: <2607.9805211303@tempest.cise.npl.co.uk>
- Files: Makefile.SH
-
- Title: "Add 'make nok' complement to 'make ok'"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0ycRDf-0005Wh-00@taurus.cus.cam.ac.uk>
- Files: Makefile.SH
-
- Title: "further h2ph patches (add enum support)"
- From: Billy <wdconsta@cs.adelaide.edu.au>
- Msg-ID: <Pine.SV4.3.93.980521025541.14577A-100000@xenon.teaching.cs.adelaide.edu.au>
- Files: MANIFEST t/lib/h2ph.pht t/lib/h2ph.t utils/h2ph.PL
-
- ------ CORE LANGUAGE ------
-
- Title: "Fix %! error spelling and add perldiag.pod entry"
- From: Graham Barr <gbarr@pobox.com>, Tim Bunce
- Msg-ID: <19980524193101.A573@pobox.com>
- Files: pod/perldiag.pod gv.c
-
- Title: "Remove obsolete Win32 uppercasing ENV code"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805201510.LAA28676@aatma.engin.umich.edu>
- Files: perl.c
-
- Title: "Don't mung $! on implicit close"
- From: Chip Salzenberg <chip@perl.org>
- Msg-ID: <19980525113309.A15845@perlsupport.com>
- Files: doio.c
-
- Title: "Maint trial 3 fails on SunOS 4.1.3 with Sun cc"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980527113114.26608D-100000@newton.phys>
- Files: doio.c
-
- ------ DOCUMENTATION ------
-
- Title: "doc patch: you canna return an array ( list context: || vs or)"
- From: Jarkko Hietaniemi <jhi@cc.hut.fi>
- Msg-ID: <oeeemxguf5h.fsf_-_@alpha.hut.fi>
- Files: pod/perldebug.pod pod/perlfunc.pod pod/perltie.pod pod/perltrap.pod
-
- Title: "doc patch: @ needs escaping in m/\Q\E/ environment"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0yecim-0002qr-00@taurus.cus.cam.ac.uk>
- Files: pod/perlop.pod pod/perlre.pod
-
- Title: "Discrepancy between perlop.pod and m// operator", "Doc fix: Only
- with /g does list context get matches without parens"
- From: Greg Chapman <glc@well.com>, Tom Christiansen
- <tchrist@jhereg.perl.com>, Tom Phoenix
- <rootbeer@teleport.com>
- Msg-ID: <000201bd865e$f3bf72e0$1f04400c@assigned.well.com>,
- <199805231559.JAA21316@jhereg.perl.com>,
- <Pine.GSO.3.96.980523084947.22348I-100000@user2.teleport.com>
- Files: pod/perlop.pod
-
- Title: "Documenting last/next/redo even further"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Tom Phoenix
- <rootbeer@teleport.com>
- Msg-ID: <E0yec2h-0000B9-00@taurus.cus.cam.ac.uk>,
- <Pine.GSO.3.96.980526111426.27437K-100000@user2.teleport.com>
- Files: pod/perlfunc.pod
-
- Title: "Documenting last/next/redo within continue block"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980525214558.7133H-100000@user2.teleport.com>
- Files: pod/perlfunc.pod
-
- Title: "Document stat return in scalar context"
- From: Mark-Jason Dominus <mjd@plover.com>
- Files: pod/perlfunc.pod
-
- ------ EXTENSIONS ------
-
- Title: "Better LD_RUN_PATH handling on IRIX"
- From: "W. Phillip Moore" <wpm@ms.com>
- Msg-ID: <199805212206.SAA07504@zappa.morgan.com>
- Files: lib/ExtUtils/MM_Unix.pm
-
- Title: "Dealing with <unistd.h> in POSIX and SunOS"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980527115256.26608F-100000@newton.phys>
- Files: ext/POSIX/hints/sunos_4.pl hints/sunos_4_1.sh ext/POSIX/POSIX.xs
-
- ------ LIBRARY ------
-
- Title: "Fix FileHandle.pm example bug"
- From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Msg-ID: <Pine.LNX.3.96.980520194825.10845C-100000@perrin.dimensional.com>
- Files: lib/FileHandle.pm
-
- Title: "Add zero/negative $count docs for Benchmark.pm"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0ydEAr-0006NV-00@taurus.cus.cam.ac.uk>
- Files: lib/Benchmark.pm
-
- ------ PORTABILITY - GENERAL ------
-
- Title: "Add test suite recommendations to Porting/patching.pod"
- From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Msg-ID: <Pine.LNX.3.96.980521162925.3568B-100000@perrin.dimensional.com>
- Files: Porting/patching.pod
-
- ------ TESTS ------
-
- Title: "Fix looping bug in t/io/pipe.t"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0yc737-0006fB-00@taurus.cus.cam.ac.uk>
- Files: t/io/pipe.t
- Branch: maint-5.004/perl
- ! MANIFEST Makefile.SH Porting/patching.pod doio.c
- ! ext/POSIX/POSIX.xs ext/POSIX/hints/sunos_4.pl gv.c
- ! hints/sunos_4_1.sh lib/Benchmark.pm lib/ExtUtils/MM_Unix.pm
- ! lib/FileHandle.pm perl.c pod/perldebug.pod pod/perldiag.pod
- ! pod/perlfunc.pod pod/perlop.pod pod/perlre.pod pod/perltie.pod
- ! pod/perltrap.pod t/io/pipe.t t/lib/h2ph.pht t/lib/h2ph.t
- ! utils/h2ph.PL
+[ 4372] By: gsar on 1999/10/14 02:21:31
+ Log: avoid inefficiency in change#3386 (every longjmp() was followed
+ by an avoidable call to setjmp())
+ Branch: perl
+ ! embed.h embed.pl perl.c perlapi.c pod/perldelta.pod pp_ctl.c
+ ! proto.h scope.c scope.h
____________________________________________________________________________
-[ 1037] By: gsar on 1998/05/27 16:18:30
- Log: add AS patch#22 (fix to make die_exit.t pass)
- Branch: asperl
- ! win32/runperl.c
+[ 4371] By: jhi on 1999/10/13 21:17:17
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> op.c pod/perldelta.pod
____________________________________________________________________________
-[ 1036] By: gsar on 1998/05/27 12:50:34
- Log: add AS patch#21 (misc. fixes)
- Branch: asperl
- ! ObjXSub.h lib/ExtUtils/MM_Unix.pm objpp.h perl.h
- ! win32/GenCAPI.pl win32/Makefile win32/makefile.mk
- ! win32/win32.c win32/win32sck.c
-____________________________________________________________________________
-[ 1035] By: gsar on 1998/05/26 17:26:17
- Log: more changes to satisfy non-debug VC build (C-API doesn't
- build, and the testsuite still won't run)
- Branch: asperl
- ! ObjXSub.h deb.c dump.c ext/POSIX/POSIX.xs globals.c proto.h
- ! regcomp.c run.c scope.c sv.c util.c win32/GenCAPI.pl
-____________________________________________________________________________
-[ 1034] By: gsar on 1998/05/26 17:20:22
- Log: remove doubled hunk (perforce auto-integrate oddity)
- Branch: win32/perl
- ! pod/perldiag.pod
+[ 4370] By: gsar on 1999/10/13 18:08:45
+ Log: misc tweaks
+ Branch: perl
+ ! op.c pod/perldelta.pod
____________________________________________________________________________
-[ 1033] By: gsar on 1998/05/26 13:39:14
- Log: tweaks to make it build with the Borland compiler. Won't run
- testsuite because @INC intuition from location of perlcore.dll seems
- to be broken. Also, system() and qx// seem broken as well.
- Branch: asperl
- ! ObjXSub.h doio.c embedvar.h ext/POSIX/POSIX.xs interp.sym
- ! intrpvar.h objpp.h perl.c perl.h perlvars.h proto.h regcomp.c
- ! regexec.c toke.c
-____________________________________________________________________________
-[ 1032] By: gsar on 1998/05/24 23:13:05
- Log: tweak Benchmark.pm to restore old timestr() behavior--show wall secs
- Branch: win32/perl
- ! lib/Benchmark.pm
-____________________________________________________________________________
-[ 1031] By: gsar on 1998/05/24 05:36:44
- Log: tweak makefiles
- Branch: asperl
- ! win32/Makefile win32/makefile.mk
+[ 4369] By: jhi on 1999/10/13 16:18:58
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
____________________________________________________________________________
-[ 1030] By: gsar on 1998/05/23 18:58:23
- Log: merge changes#1016,1018 from maintbranch (1017 is n/a)
- Branch: win32/perl
- ! pp_sys.c t/op/die.t
+[ 4368] By: gsar on 1999/10/13 16:14:16
+ Log: pod nits from various perl porters
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
____________________________________________________________________________
-[ 1029] By: gsar on 1998/05/23 18:55:13
- Log: merge change#1015 from maintbranch (must revisit 1014 later, is
- incomplete)
- Branch: win32/perl
- ! embed.h global.sym op.c pp.c proto.h sv.c
+[ 4367] By: jhi on 1999/10/13 12:10:30
+ Log: From: Vlad Harchev <hvv@hippo.ru>
+ To: perl5-porters@perl.org
+ Subject: [ID 19991013.002] fix for 'perlop.pod' shipped with perl5.00503
+ Date: Wed, 13 Oct 1999 15:48:59 +0500 (SAMST)
+ Message-Id: <Pine.LNX.4.10.9910131546580.3542-100000@localhost.localdomain>
+ Branch: cfgperl
+ ! pod/perlop.pod
____________________________________________________________________________
-[ 1028] By: gsar on 1998/05/23 18:25:14
- Log: merge change#1013 from maintbranch (1012 is n/a)
- Branch: win32/perl
- ! toke.c
+[ 4366] By: gsar on 1999/10/13 08:11:11
+ Log: typos and language goofs pointed out by Hugo van der Sanden
+ <hv@crypt.compulink.co.uk>
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod
____________________________________________________________________________
-[ 1027] By: gsar on 1998/05/23 18:02:21
- Log: merge change#1011 from maintbranch
- Branch: win32/perl
- ! perl.c pod/perldiag.pod pod/perlfunc.pod pp_ctl.c
- ! utils/perlbug.PL
+[ 4365] By: jhi on 1999/10/13 07:27:44
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> ext/File/Glob/Changes ext/File/Glob/Glob.pm
+ +> ext/File/Glob/Glob.xs ext/File/Glob/Makefile.PL
+ +> ext/File/Glob/TODO ext/File/Glob/bsd_glob.c
+ +> ext/File/Glob/bsd_glob.h ext/NDBM_File/hints/sco.pl
+ +> t/lib/glob-basic.t t/lib/glob-global.t t/lib/glob-taint.t
+ !> Changes MANIFEST README.win32 ext/ODBM_File/hints/sco.pl
+ !> lib/perl5db.pl op.c pod/perldelta.pod pod/perlfaq8.pod
+ !> pod/perlfunc.pod pod/perlop.pod pod/perlport.pod t/op/glob.t
+ !> t/op/readdir.t t/op/taint.t t/pragma/overload.t util.c
+____________________________________________________________________________
+[ 4364] By: gsar on 1999/10/13 07:06:04
+ Log: debugger tweak (from M.J.T. Guy <mjtg@cus.cam.ac.uk>)
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 4363] By: jhi on 1999/10/13 07:03:43
+ Log: From: Mike Hopkirk (hops) <hops@scoot.pdev.sco.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19991012.002] Latest UnixWare7 (svr5.sh) hints file
+ Date: Tue, 12 Oct 1999 19:48:11 -0700 (PDT)
+ Message-Id: <199910130248.TAA14636@scoot.pdev.sco.com>
+ Branch: cfgperl
+ ! hints/svr5.sh
____________________________________________________________________________
-[ 1026] By: nick on 1998/05/23 08:45:04
- Log: Ids of msgs and sems can be zero, so change || die to a defined() test
- Branch: win32/perl
- ! t/op/ipcmsg.t t/op/ipcsem.t
+[ 4362] By: jhi on 1999/10/13 06:57:16
+ Log: Add DB_File hint for SCO ODT.
+ From: hops@sco.com
+ To: perl5-porters@perl.org
+ Subject: [ID 19991012.004] Build patch for perl5.005_03 on ODT3 ( 3.2v4.2)
+ Date: Tue, 12 Oct 1999 20:16:04 PDT
+ Message-Id: <199910122016.aa18415@charmstr.pdev.sco.com>
+ Branch: cfgperl
+ + ext/DB_File/hints/sco.pl
+ ! MANIFEST
____________________________________________________________________________
-[ 1025] By: nick on 1998/05/23 08:36:36
- Log: Resolve win32 into ansiperl
- Branch: ansiperl
- +> t/op/die.t
- !> (integrate 42 files)
-____________________________________________________________________________
-[ 1024] By: gsar on 1998/05/21 21:11:12
- Log: more mingw32 tweaks
- Branch: win32/perl
- ! ext/POSIX/POSIX.xs t/pragma/locale.t
-____________________________________________________________________________
-[ 1023] By: gsar on 1998/05/21 19:15:02
- Log: fix problematic change#965 from maintbranch
- Message-Id: <199805162145.RAA02552@monk.mps.ohio-state.edu>
- Date: Sat, 16 May 1998 17:45:22 EDT
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: Re: Not OK (after all) : perl 5.00404 +MAINT_TRIAL_3 on sun4-solaris 2.5
- Branch: win32/perl
- ! gv.c op.c t/comp/proto.t
-____________________________________________________________________________
-[ 1022] By: gsar on 1998/05/21 01:37:04
- Log: fix POSIX for mingw32
- Branch: win32/perl
- ! ext/POSIX/POSIX.xs win32/config.gc win32/config_H.gc
-____________________________________________________________________________
-[ 1021] By: gsar on 1998/05/20 15:02:21
- Log: remove strupr() from perl.c
- Branch: win32/perl
- ! perl.c
+[ 4361] By: gsar on 1999/10/13 06:56:08
+ Log: PL_numeric_radix used without being defined (from Ilya
+ Zakharevich)
+ Branch: perl
+ ! util.c
____________________________________________________________________________
-[ 1020] By: TimBunce on 1998/05/19 22:41:40
- Log: Title: "fix up descrepancy in h2ph test"
- From: Tim Bunce
- Files: t/lib/h2ph.pht
- Branch: maint-5.004/perl
- ! t/lib/h2ph.pht
+[ 4360] By: gsar on 1999/10/13 06:43:03
+ Log: use libdbm.nfs.a if available (libdbm.a is missing dbmclose())
+ From: hops@sco.com
+ Date: Tue, 12 Oct 1999 20:16:04 PDT
+ Message-Id: <199910122016.aa18415@charmstr.pdev.sco.com>
+ Subject: [ID 19991012.004] Build patch for perl5.005_03 on ODT3 ( 3.2v4.2)
+ Branch: perl
+ + ext/NDBM_File/hints/sco.pl
+ ! MANIFEST ext/ODBM_File/hints/sco.pl
+____________________________________________________________________________
+[ 4359] By: gsar on 1999/10/13 06:34:53
+ Log: various pod tweaks (from M.J.T. Guy <mjtg@cus.cam.ac.uk>)
+ Branch: perl
+ ! README.win32 pod/perlfaq8.pod pod/perlfunc.pod pod/perlop.pod
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 4358] By: gsar on 1999/10/12 19:10:27
+ Log: perldelta updates
+ Branch: perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 4357] By: gsar on 1999/10/12 17:11:18
+ Log: update perldelta for change#4356
+ Branch: perl
+ ! Changes pod/perldelta.pod
____________________________________________________________________________
-[ 1019] By: TimBunce on 1998/05/19 22:17:15
- Log: Title: "add a test to check return value from successful s/// (there was none!)"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805161759.NAA12995@aatma.engin.umich.edu>
- Files: t/op/subst.t
+[ 4356] By: gsar on 1999/10/12 16:53:31
+ Log: add File::BSDGlob as File::Glob and load it at compile-time
+ if perl was built with -DPERL_INTERNAL_GLOB
- Title: "fix up descrepancy in h2ph test"
- From: Tim Bunce
- Files: t/lib/h2ph.t
- Branch: maint-5.004/perl
- ! t/lib/h2ph.t t/op/subst.t
+ TODO: we currently get a compile-time failure if File/Glob.pm
+ can't be found; such failure needs to be made to emit a warning
+ and use the csh implementation instead
+ Branch: perl
+ + ext/File/Glob/Changes ext/File/Glob/Glob.pm
+ + ext/File/Glob/Glob.xs ext/File/Glob/Makefile.PL
+ + ext/File/Glob/TODO ext/File/Glob/bsd_glob.c
+ + ext/File/Glob/bsd_glob.h t/lib/glob-basic.t
+ + t/lib/glob-global.t t/lib/glob-taint.t
+ ! MANIFEST op.c t/op/glob.t t/op/readdir.t t/op/taint.t
+ ! t/pragma/overload.t
____________________________________________________________________________
-[ 1018] By: TimBunce on 1998/05/19 21:56:32
- Log: Title: "fix mem leak and core dump from change 1016"
- From: Tim Bunce
- Files: pp_sys.c
- Branch: maint-5.004/perl
- ! pp_sys.c
+[ 4355] By: jhi on 1999/10/12 15:30:05
+ Log: Revert the parts of #3926 that outlawed character ranges
+ that have character classes such as \w as either endpoint.
+ This change re-establishes the old behavior which meant that
+ such ranges weren't really ranges, the "-" was literal.
+ Moreover, this change also fixes the old behavior to be
+ more consistent: [\w-.] and [\s-\w] worked, but [.-\w] didn't.
+ Now they all do work as described above. The #3926 outlawed
+ all of those.
+ Branch: cfgperl
+ ! pod/perldiag.pod pod/perlre.pod regcomp.c t/op/re_tests
____________________________________________________________________________
-[ 1017] By: TimBunce on 1998/05/19 21:26:03
- Log: Title: "qsort, Win32 "POSIX" plus other devel changes for patch-compatibility"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Files: MANIFEST cflags.SH pod/perlembed.pod pod/perlfunc.pod
- pod/perlguts.pod pod/perlref.pod pod/perlrun.pod
- pod/perlxstut.pod av.h embed.h hv.h op.h perl.h pp.h
- proto.h Todo av.c cygwin32/perlgcc cygwin32/perlld deb.c
- doio.c doop.c ext/ODBM_File/ODBM_File.xs
- ext/POSIX/Makefile.PL ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs
- gv.c hv.c interp.sym lib/AutoSplit.pm lib/Cwd.pm
- lib/FindBin.pm lib/strict.pm lib/ExtUtils/Command.pm
- lib/ExtUtils/Liblist.pm lib/ExtUtils/MakeMaker.pm
- lib/ExtUtils/Manifest.pm lib/File/Basename.pm
- lib/File/Find.pm lib/File/Path.pm lib/Getopt/Long.pm
- lib/Getopt/Std.pm lib/Net/Ping.pm lib/Pod/Html.pm
- lib/Pod/Text.pm lib/Term/Cap.pm lib/Test/Harness.pm mg.c
- op.c perl.c pod/pod2latex.PL pod/pod2man.PL pp.c pp_ctl.c
- pp_hot.c pp_sys.c scope.c sv.c t/lib/posix.t
- t/pragma/locale.t utils/perldoc.PL win32/win32.h toke.c
- universal.c util.c win32/Makefile win32/config_H.bc
- win32/config_H.vc win32/dl_win32.xs win32/makedef.pl
- win32/makefile.mk win32/perlglob.c win32/runperl.c
- win32/win32.c win32/win32sck.c x2p/s2p.PL
- Branch: maint-5.004/perl
- ! MANIFEST Todo av.c av.h cflags.SH cygwin32/perlgcc
- ! cygwin32/perlld deb.c doio.c doop.c embed.h
- ! ext/ODBM_File/ODBM_File.xs ext/POSIX/Makefile.PL
- ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs gv.c hv.c hv.h
- ! interp.sym lib/AutoSplit.pm lib/Cwd.pm lib/ExtUtils/Command.pm
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MakeMaker.pm
- ! lib/ExtUtils/Manifest.pm lib/File/Basename.pm lib/File/Find.pm
- ! lib/File/Path.pm lib/FindBin.pm lib/Getopt/Long.pm
- ! lib/Getopt/Std.pm lib/Net/Ping.pm lib/Pod/Html.pm
- ! lib/Pod/Text.pm lib/Term/Cap.pm lib/Test/Harness.pm
- ! lib/strict.pm mg.c op.c op.h perl.c perl.h pod/perlembed.pod
- ! pod/perlfunc.pod pod/perlguts.pod pod/perlref.pod
- ! pod/perlrun.pod pod/perlxstut.pod pod/pod2latex.PL
- ! pod/pod2man.PL pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h
- ! scope.c sv.c t/lib/posix.t t/pragma/locale.t toke.c
- ! universal.c util.c utils/perldoc.PL win32/Makefile
- ! win32/config_H.bc win32/config_H.vc win32/dl_win32.xs
- ! win32/makedef.pl win32/makefile.mk win32/perlglob.c
- ! win32/runperl.c win32/win32.c win32/win32.h win32/win32sck.c
- ! x2p/s2p.PL
+[ 4354] By: jhi on 1999/10/12 09:58:59
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 33 files)
____________________________________________________________________________
-[ 1016] By: TimBunce on 1998/05/19 20:37:42
- Log: Title: "eval { die $obj }; die; calls $obj->PROPAGATE"
- From: Graham Barr <gbarr@ti.com>
- Msg-ID: <3561D147.7F3E0C88@ti.com>
- Files: pp_sys.c t/op/die.t
- Branch: maint-5.004/perl
- ! pp_sys.c t/op/die.t
+[ 4353] By: gsar on 1999/10/12 05:53:40
+ Log: apply parts of LynxOS patches from Alan Johnson
+ <johnson@alonn.gemse.fr>
+ Branch: perl
+ ! Changes hints/lynxos.sh pod/perldelta.pod t/lib/safe2.t
+ ! t/op/groups.t
____________________________________________________________________________
-[ 1015] By: TimBunce on 1998/05/19 20:07:01
- Log: Title: "loosen const sub re-defined warnings"
- From: Doug MacEachern <dougm@pobox.com>
- Msg-ID: <355F713B.6A4C0F04@pobox.com>
- Files: proto.h global.sym op.c pp.c sv.c
- Branch: maint-5.004/perl
- ! global.sym op.c pp.c proto.h sv.c
+[ 4352] By: gsar on 1999/10/12 05:24:39
+ Log: allow any unpack specifier to take a count via '/'
+ (from Ilya Zakharevich)
+ Branch: perl
+ ! pp.c t/op/pack.t
____________________________________________________________________________
-[ 1014] By: TimBunce on 1998/05/19 19:48:18
- Log: Title: "s/FORMLINE/FORMAT/ in sv.c"
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Msg-ID: <l03130303b1837a243670@[194.222.64.89]>
- Files: sv.c
-
- Title: "Further h2ph patches (including a test suite)"
- From: Billy <wdconsta@cs.adelaide.edu.au>
- Msg-ID: <Pine.SV4.3.93.980516234652.2100A-100000@xenon.teaching.cs.adelaide.edu.au>
- Files: MANIFEST t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t utils/h2ph.PL
- Branch: maint-5.004/perl
- + t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t
- ! MANIFEST sv.c utils/h2ph.PL
-____________________________________________________________________________
-[ 1013] By: TimBunce on 1998/05/19 19:14:13
- Log: Title: "Remove change 673 (Allow empty BLOCK in code)"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>, Ilya Zakharevich
- <ilya@math.ohio-state.edu>
- Msg-ID: <199805151857.OAA29586@monk.mps.ohio-state.edu>,
- <199805151931.PAA23086@aatma.engin.umich.edu>,
- <19980129002112Z13378-6931+226@scapa.cs.ualberta.ca>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 4351] By: gsar on 1999/10/12 05:02:35
+ Log: avoid warnings
+ Branch: perl
+ ! malloc.c
____________________________________________________________________________
-[ 1012] By: TimBunce on 1998/05/19 19:03:32
- Log: Title: "Further SysV sem/msg fixes and removal of non-portable tests"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>, Jarkko Hietaniemi
- <jhi@iki.fi>
- Msg-ID: <199805182028.XAA15717@alpha.hut.fi>,
- <Pine.SUN.3.96.980518133606.17488A-100000@newton.phys>
- Files: MANIFEST Configure config_h.SH perl.h doio.c t/op/ipcmsg.t
- t/op/ipcsem.t
- Branch: maint-5.004/perl
- ! Configure MANIFEST config_h.SH doio.c perl.h t/op/ipcmsg.t
- ! t/op/ipcsem.t
-____________________________________________________________________________
-[ 1011] By: TimBunce on 1998/05/19 17:55:38
- Log: Title: "interp.sym is missing C<e_script> after -e fix"
- From: jan.dubois@ibm.net (Jan Dubois)
- Msg-ID: <355d460d.7621669@smtp1.ibm.net>
- Files: embed.h interp.sym
-
- Title: "Undo changed error message which breaks Tk"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805161557.LAA08106@aatma.engin.umich.edu>
- Files: pp_ctl.c
-
- Title: "Minor fixups to new -e script code"
- From: Tim Bunce
- Files: perl.c
-
- Title: "Remove old diags not relevant after -e fix"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>, Gurusamy Sarathy
- <gsar@engin.umich.edu>, Tim.Bunce@ig.co.uk (Tim Bunce)
- Msg-ID: <199805172143.RAA07896@aatma.engin.umich.edu>,
- <199805181335.OAA07008@toad.ig.co.uk>,
- <Pine.SUN.3.96.980517104819.16183B-100000@newton.phys>
- Files: pod/perldiag.pod
-
- Title: "more examples for vec()"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980518093728.28732P-100000@user2.teleport.com>
- Files: pod/perlfunc.pod
+[ 4350] By: gsar on 1999/10/12 04:50:52
+ Log: various cleanups
+ Branch: perl
+ ! ext/Devel/DProf/DProf.xs op.c perl.c perly.c perly.y
+ ! perly_c.diff pp_hot.c toke.c vms/perly_c.vms win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/config_sh.PL
+____________________________________________________________________________
+[ 4349] By: gsar on 1999/10/12 00:23:11
+ Log: update Changes, patchlevel etc.
+ Branch: perl
+ ! Changes Porting/findvars patchlevel.h win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 4348] By: gsar on 1999/10/11 23:11:57
+ Log: add vec() example from Chaim Frenkel <chaimf@pobox.com>
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 4347] By: jhi on 1999/10/11 21:25:03
+ Log: Sparc Linux -Duseshrplib fix.
- Title: ""make ok" (perlbug -ok) should not be interactive"
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>, Jarkko Hietaniemi
- <jhi@iki.fi>
- Msg-ID: <199805160942.MAA20171@alpha.hut.fi>,
- <l03130300b1834f9732a0@[194.222.64.89]>
- Files: utils/perlbug.PL
- Branch: maint-5.004/perl
- ! embed.h interp.sym perl.c pod/perldiag.pod pod/perlfunc.pod
- ! pp_ctl.c utils/perlbug.PL
-____________________________________________________________________________
-[ 1010] By: gsar on 1998/05/18 09:40:58
- Log: integrate mainline changes (untested)
- Branch: asperl
- +> Porting/Contract Porting/patching.pod README.beos beos/nm.c
- +> ext/DynaLoader/DynaLoader.pm.PL ext/POSIX/hints/bsdos.pl
- +> ext/POSIX/hints/freebsd.pl ext/POSIX/hints/netbsd.pl
- +> ext/POSIX/hints/openbsd.pl hints/beos.sh hints/openbsd.sh
- +> pod/perldelta4.pod t/op/defins.t t/op/die.t t/op/die_exit.t
- +> t/op/ipcmsg.t t/op/ipcsem.t t/op/pos.t utils/perlcc.PL
- - ext/DynaLoader/DynaLoader.pm
- ! win32/win32.c
- !> (integrate 234 files)
-____________________________________________________________________________
-[ 1009] By: gsar on 1998/05/18 07:51:19
- Log: more whitespace tweaks from maintbranch
- Branch: win32/perl
- ! av.c perl.c pp_ctl.c pp_sys.c toke.c
-____________________________________________________________________________
-[ 1008] By: gsar on 1998/05/17 22:37:20
- Log: sundry whitespace cleanups from maintbranch
- Branch: win32/perl
- ! Porting/Contract XSUB.h av.c gv.c mg.c perl.c
-____________________________________________________________________________
-[ 1007] By: gsar on 1998/05/16 21:59:46
- Log: integrate mainline
- Branch: win32/perl
- !> INSTALL doio.c lib/strict.pm perl.c perl.h pod/perldebug.pod
- !> t/op/ipcmsg.t t/op/ipcsem.t
-____________________________________________________________________________
-[ 1006] By: gsar on 1998/05/16 21:54:23
- Log: merge changes#996,998,999 from maintbranch
- Branch: win32/perl
- ! Changes5.004 Porting/makerel t/base/lex.t toke.c
-____________________________________________________________________________
-[ 1005] By: gsar on 1998/05/16 21:49:47
- Log: merge change#995 from maintbranch, tweak interp.sym and
- run embed.pl
- Branch: win32/perl
- ! embedvar.h interp.sym intrpvar.h perl.c
-____________________________________________________________________________
-[ 1004] By: gsar on 1998/05/16 21:27:18
- Log: merge changes#989,990,992 from maintbranch
- Branch: win32/perl
- + t/op/die.t
- ! MANIFEST installperl pod/perldiag.pod pp_ctl.c t/op/ipcmsg.t
-____________________________________________________________________________
-[ 1003] By: gsar on 1998/05/16 21:16:47
- Log: sync config*.gc with others, and verify that nothing from
- change#986 needs to be merged
- Branch: win32/perl
- ! win32/config.gc win32/config_H.gc
-____________________________________________________________________________
-[ 1002] By: gsar on 1998/05/16 21:04:04
- Log: merge change#985 from maintbranch
- Branch: win32/perl
- ! lib/AutoSplit.pm lib/ExtUtils/Manifest.pm pp_ctl.c pp_sys.c
- ! util.c
+ From: Brian Jepson <bjepson@home.com>
+ To: Nick Ing-Simmons <nick@ing-simmons.net>
+ cc: perl5-porters@perl.org
+ Subject: Re: [ID 19990813.002] Can't build Perl 5.005_60 on SPARC/Linux with -Duseshrplib
+ Date: Fri, 20 Aug 1999 11:25:17 -0500 (EST)
+ Message-ID: <Pine.LNX.4.10.9908201123570.5116-100000@cx384756-a.sking1.ri.home.com>
+ Branch: cfgperl
+ ! hints/linux.sh
____________________________________________________________________________
-[ 1001] By: gsar on 1998/05/16 17:53:16
- Log: add a test to check return value from successful s/// (there was none!)
- Branch: win32/perl
- ! t/op/subst.t
+[ 4346] By: gsar on 1999/10/11 20:28:32
+ Log: more pack/unpack documentation (from Ilya Zakharevich); changed
+ the behavior of 'Z*' and 'Z3' to always pack a trailing
+ null byte; changed documentation to suit; added test
+ Branch: perl
+ ! pod/perlfunc.pod pp.c t/op/pack.t
____________________________________________________________________________
-[ 1000] By: gsar on 1998/05/16 17:42:34
- Log: fix misplaced SPAGAIN that caused successful s/// to fail to
- return a value on the stack
- Branch: win32/perl
- ! pp_hot.c
+[ 4345] By: gsar on 1999/10/11 19:15:46
+ Log: writing to perllocal.pod fails if it was never created;
+ tweak pseudo-hash example (both suggested by Michael G Schwern
+ <schwern@pobox.com>)
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm pod/perlref.pod
____________________________________________________________________________
-[ 999] By: TimBunce on 1998/05/15 23:04:30
- Log: Title: "Update Porting/makerel script for perforce dir structure"
- From: Tim Bunce
- Files: Porting/makerel
- Branch: maint-5.004/perl
- ! Porting/makerel
+[ 4344] By: gsar on 1999/10/11 17:57:31
+ Log: slightly edited variant of suggested patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 9 Sep 1999 18:35:37 -0400
+ Message-ID: <19990909183537.A28682@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_58] How RExen match?
+ Branch: perl
+ ! pod/perlre.pod
____________________________________________________________________________
-[ 998] By: TimBunce on 1998/05/15 22:49:55
- Log: Title: "Updated Changes file for trial 3"
- From: Tim Bunce
- Files: Changes
- Branch: maint-5.004/perl
- ! Changes
+[ 4343] By: gsar on 1999/10/11 16:55:48
+ Log: change#4327 was inefficient
+ Branch: perl
+ ! lib/lib.pm
____________________________________________________________________________
-[ 997] By: gsar on 1998/05/15 22:21:41
- Log: merge changes#982,984 from maintbranch
- Branch: win32/perl
- ! gv.c lib/English.pm perl.c pod/perlfunc.pod t/io/pipe.t
- ! t/op/exec.t t/op/ipcsem.t util.c utils/h2ph.PL utils/h2xs.PL
-____________________________________________________________________________
-[ 996] By: TimBunce on 1998/05/15 22:19:32
- Log: Title: "Negative array subscript unrecognized in regex"
- From: Mark-Jason Dominus <mjd@plover.com>,
- h.sanden@elsevier.nl (Hugo van der Sanden)
- Msg-ID: <19980425040819.13828.qmail@plover.com>,
- <199805151514.RAA04121@dorlas.elsevier.nl>
- Files: t/base/lex.t toke.c
-
- Title: "Remove e_fp from toke.c after change 955"
- From: Tim Bunce
- Files: toke.c
- Branch: maint-5.004/perl
- ! t/base/lex.t toke.c
+[ 4342] By: jhi on 1999/10/11 07:01:46
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> pod/perlhack.pod
+ !> (integrate 28 files)
____________________________________________________________________________
-[ 995] By: TimBunce on 1998/05/15 22:08:32
- Log: Title: "Fix -e security hole (no longer uses temp file)"
- From: Tim Bunce
- Files: embed.h perl.h perl.c
- Branch: maint-5.004/perl
- ! embed.h perl.c perl.h
+[ 4341] By: jhi on 1999/10/11 06:37:47
+ Log: The 2.5th cut at the AIX C++ extension problems.
+ Branch: cfgperl
+ ! hints/aix.sh
____________________________________________________________________________
-[ 994] By: gsar on 1998/05/15 22:08:17
- Log: merge change#981 from maintbranch, add XXX comment about
- supporting %! for usethreads case
- Branch: win32/perl
- ! gv.c op.c
+[ 4340] By: gsar on 1999/10/10 23:48:07
+ Log: add perlhack.pod from Nathan Torkington <gnat@frii.com>
+ Branch: perl
+ + pod/perlhack.pod
+ ! MANIFEST pod/Makefile pod/perl.pod pod/roffitall
____________________________________________________________________________
-[ 992] By: TimBunce on 1998/05/15 22:01:32
- Log: Title: "install non-backwards compatible .pm files into archlib"
- From: Tim Bunce
- Files: installperl
-
- Title: "revert "Can't locate" message to original for maintenance"
- From: Tim Bunce
- Msg-ID: <199804240047.SAA24155@den-mdev1.co.csgsystems.com>
- Files: pod/perldiag.pod pp_ctl.c
- Branch: maint-5.004/perl
- ! installperl pod/perldiag.pod pp_ctl.c
-____________________________________________________________________________
-[ 991] By: gsar on 1998/05/15 21:35:00
- Log: reverse integrate ansiperl (all except the
- C<attrs qw(package locked)> stuff, and the duplicate hunks)
- i.e. prototype fixes, perldoc.PL enhancements, and s/comment/comment_t/g
- Branch: win32/perl
- !> bytecode.h byterun.c cv.h ext/attrs/attrs.pm
- !> ext/attrs/attrs.xs pod/perlop.pod pp_hot.c sv.c toke.c
- !> utils/perldoc.PL
-____________________________________________________________________________
-[ 990] By: TimBunce on 1998/05/15 16:54:18
- Log: Title: "Add tests for die $ref"
- From: Graham Barr <gbarr@ti.com>
- Msg-ID: <355C6297.121B576B@ti.com>
- Files: MANIFEST t/op/die.t
- Branch: maint-5.004/perl
- + t/op/die.t
- ! MANIFEST
+[ 4339] By: gsar on 1999/10/10 20:42:40
+ Log: revert SAVEDESTRUCTOR() to accepting void(*)(void*) for source
+ compatibility; introduce SAVEDESTRUCTOR_X() that accepts
+ void(*)(pTHX_ void*)
+ Branch: perl
+ ! embed.h embed.pl ext/Devel/DProf/DProf.xs global.sym mg.c
+ ! objXSUB.h perl.h perlapi.c perly.c perly.y perly_c.diff
+ ! pod/perlguts.pod pod/perltoc.pod pp.c pp_hot.c proto.h
+ ! regcomp.h regexec.c scope.c scope.h toke.c vms/perly_c.vms
____________________________________________________________________________
-[ 989] By: TimBunce on 1998/05/15 16:38:19
- Log: Title: "Fix t/op/ipcmsg.t for Digital UNIX"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199805151337.QAA01174@alpha.hut.fi>
- Files: t/op/ipcmsg.t
- Branch: maint-5.004/perl
- ! t/op/ipcmsg.t
+[ 4338] By: gsar on 1999/10/10 20:38:59
+ Log: add missing new diagnostics to perldelta
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 988] By: mbeattie on 1998/05/15 16:28:08
- Log: Patch from Sarathy to fix up win32 integration. Patch from Jarkko
- (manually applied and tweaked) to fix up SysV IPC semaphores for
- Solaris and Linux (pre-glibc and glibc). Fix up t/op/ipcmsg.t and
- t/op/ipcsem.t for platforms which wanted to skip test. Completely
- disable ipcsem.t since it doesn't seem to work properly even when
- not skipped. This is _65.
+[ 4337] By: gsar on 1999/10/10 17:40:13
+ Log: update perldelta for change#3406
Branch: perl
- ! INSTALL doio.c lib/strict.pm perl.c perl.h pod/perldebug.pod
- ! t/op/ipcmsg.t t/op/ipcsem.t
+ ! embed.pl pod/perldata.pod pod/perldelta.pod
____________________________________________________________________________
-[ 987] By: nick on 1998/05/15 16:03:35
- Log: Integrate win32
- Branch: ansiperl
- +> Porting/Contract Porting/patching.pod README.beos beos/nm.c
- +> ext/DynaLoader/DynaLoader.pm.PL ext/POSIX/hints/bsdos.pl
- +> ext/POSIX/hints/freebsd.pl ext/POSIX/hints/netbsd.pl
- +> ext/POSIX/hints/openbsd.pl hints/beos.sh hints/openbsd.sh
- +> pod/perldelta4.pod t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
- +> t/op/pos.t utils/perlcc.PL
- - ext/DynaLoader/DynaLoader.pm
- !> (integrate 208 files)
-____________________________________________________________________________
-[ 986] By: TimBunce on 1998/05/15 15:28:45
- Log: Title: "Patches for BeOS port of Perl, courtesy of Tom Spindler"
- From: Jarkko Hietaniemi <jhi@iki.fi>, Tom Spindler
- Msg-ID: <199805042312.CAA09025@alpha.hut.fi>
- Files: MANIFEST Configure config_h.SH hints/beos.sh pod/perlfunc.pod
- Porting/Glossary README.beos beos/nm.c lib/Term/ReadLine.pm
- plan9/config.plan9 pp_sys.c t/io/pipe.t vms/config.vms
- win32/config.bc win32/config.vc win32/config_H.bc
- win32/config_H.vc
- Branch: maint-5.004/perl
- + README.beos beos/nm.c hints/beos.sh
- ! Configure MANIFEST Porting/Glossary config_h.SH
- ! lib/Term/ReadLine.pm plan9/config.plan9 pod/perlfunc.pod
- ! pp_sys.c t/io/pipe.t vms/config.vms win32/config.bc
- ! win32/config.vc win32/config_H.bc win32/config_H.vc
-____________________________________________________________________________
-[ 985] By: TimBunce on 1998/05/15 15:02:43
- Log: Title: "allow die $ref"
- From: Graham Barr <gbarr@ti.com>, Tim.Bunce@ig.co.uk (Tim Bunce)
- Msg-ID: <199805151351.OAA01985@toad.ig.co.uk>, <355C3E67.AF25B9F7@ti.com>
- Files: pp_ctl.c pp_sys.c util.c
-
- Title: "ExtUtils::Manifest could truncate files during "make dist""
- From: "James E Jurach Jr." <muaddib@arrakis.int.ein.cz>,
- koenig@kulturbox.de (Andreas J. Koenig)
- Msg-ID: <199805111048.MAA02573@arrakis.int.ein.cz>,
- <sfc90o8bgie.fsf@dubravka.in-berlin.de>
- Files: lib/ExtUtils/Manifest.pm
-
- Title: "Autosplit doesn't like upper case letters in sub names on VMS"
- From: Dan Sugalski <sugalskd@osshe.edu>
- Msg-ID: <3.0.5.32.19980330152332.009cb130@osshe.edu>
- Files: lib/AutoSplit.pm
-
- Title: "AutoSplit/AutoLoaded subs: give useful line numbers in warnings etc"
- From: "Jesse N. Glick" <jglick@sig.bsh.com>, koenig@anna.mind.de (Andreas
- J. Koenig), larry@wall.org (Larry Wall)
- Msg-ID: <199709292015.NAA09627@wall.org>, <342FCDDF.23534195@sig.bsh.com>,
- <sfc202c9jsb.fsf@anna.in-berlin.de>,
- <sfc3efg5rhg.fsf@dubravka.in-berlin.de>
- Files: lib/AutoSplit.pm
- Branch: maint-5.004/perl
- ! lib/AutoSplit.pm lib/ExtUtils/Manifest.pm pp_ctl.c pp_sys.c
- ! util.c
+[ 4336] By: gsar on 1999/10/10 16:33:14
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> ext/DynaLoader/hints/aix.pl
+ !> MANIFEST ext/DynaLoader/dl_aix.xs hints/aix.sh hints/irix_6.sh
+ !> makedef.pl perl.h pod/perldelta.pod
____________________________________________________________________________
-[ 984] By: TimBunce on 1998/05/15 14:18:52
- Log: ------ CORE LANGUAGE ------
-
- Title: "Fix close pipe returning status from wrong child"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, kstar@chapin.edu@ig.co.uk ()
- Msg-ID: <199805142313.TAA02684@chapin.edu>,
- <E0yZ8ah-0005d8-00@taurus.cus.cam.ac.uk>
- Files: t/io/pipe.t util.c
-
- Title: "Avoid English.pm triggering load of Errno.pm"
- From: Tim Bunce
- Files: gv.c lib/English.pm
-
- ------ DOCUMENTATION ------
-
- Title: "Document child exit cause a parent sleep to end early"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0yZwMK-0000D9-00@taurus.cus.cam.ac.uk>
- Files: pod/perlfunc.pod
-
- ------ EXTENSIONS ------
-
- Title: "BSD Platforms need STRUCT_TM_HASZONE for POSIX"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980512095524.8158C-100000@newton.phys>
- Files: MANIFEST ext/POSIX/hints/bsdos.pl ext/POSIX/hints/freebsd.pl
- ext/POSIX/hints/netbsd.pl ext/POSIX/hints/openbsd.pl
-
- Title: "MM_VMS.pm fixes for building external library"
- From: Dan Sugalski <sugalskd@ous.edu>
- Msg-ID: <3.0.5.32.19980511160542.009dd480@ous.edu>
- Files: lib/ExtUtils/MM_VMS.pm
-
- Title: "Appease picky DEC compiler in POSIX.xs"
- From: Dan Sugalski <sugalskd@ous.edu>
- Msg-ID: <3.0.5.32.19980511161434.009f8bb0@ous.edu>
- Files: ext/POSIX/POSIX.xs
-
- ------ TESTS ------
+[ 4335] By: jhi on 1999/10/10 11:09:48
+ Log: Update perldelta.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 4334] By: jhi on 1999/10/10 10:31:46
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> win32/genmk95.pl
+ !> Changes MANIFEST README.win32 cop.h ext/Thread/Thread.pm
+ !> ext/Thread/Thread.xs ext/Thread/Thread/Queue.pm
+ !> ext/Thread/Thread/Semaphore.pm ext/Thread/Thread/Specific.pm
+ !> ext/Thread/sync.t ext/Thread/sync2.t installperl
+ !> lib/Exporter.pm lib/ExtUtils/MM_Unix.pm
+ !> lib/ExtUtils/MM_Win32.pm lib/diagnostics.pm lib/lib.pm perl.c
+ !> pod/perldelta.pod pod/perlfunc.pod pp_ctl.c pp_hot.c pp_sys.c
+ !> utils/perldoc.PL win32/makefile.mk
+____________________________________________________________________________
+[ 4333] By: gsar on 1999/10/10 06:33:15
+ Log: install pods to 'pods' rather than 'pod' on cygwin (modified
+ a patch suggested by cwilson@cc865179-c.chmbl1.ga.home.com)
+ Branch: perl
+ ! installperl lib/diagnostics.pm utils/perldoc.PL
+____________________________________________________________________________
+[ 4332] By: gsar on 1999/10/10 05:15:26
+ Log: add $VERSION
+ Branch: perl
+ ! lib/Exporter.pm
+____________________________________________________________________________
+[ 4331] By: gsar on 1999/10/10 05:10:22
+ Log: describe what can go in an export list (from Anno Siegel
+ <anno4000@lublin.zrz.tu-berlin.de>)
+ Branch: perl
+ ! lib/Exporter.pm
+____________________________________________________________________________
+[ 4330] By: gsar on 1999/10/10 04:50:43
+ Log: more basic support for building modules under Windows 95/98
+ (applied relevant parts from a patch suggested by
+ Jochen Wiedmann <joe@ispsoft.de>)
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 4329] By: gsar on 1999/10/10 04:28:38
+ Log: rudimentary support for building under Windows 95/98 (from
+ Benjamin Stuhl <sho_pi@hotmail.com>)
+ Branch: perl
+ + win32/genmk95.pl
+ ! MANIFEST README.win32 lib/ExtUtils/MM_Win32.pm
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 4328] By: gsar on 1999/10/10 03:37:21
+ Log: fix two leaks in Thread.xs (from Eugene Alterman
+ <Eugene.Alterman@bremer-inc.com>); convert places with
+ 'use attrs' to new attributes syntax
+ Branch: perl
+ ! ext/Thread/Thread.pm ext/Thread/Thread.xs
+ ! ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
+ ! ext/Thread/Thread/Specific.pm ext/Thread/sync.t
+ ! ext/Thread/sync2.t
+____________________________________________________________________________
+[ 4327] By: gsar on 1999/10/10 02:23:52
+ Log: avoid duplicates in @INC, they cause leaks in mod_perl etc
+ (suggested by Tod Irwin <irwin@stockmaster.com>)
+ Branch: perl
+ ! lib/lib.pm
+____________________________________________________________________________
+[ 4326] By: gsar on 1999/10/10 00:51:48
+ Log: better documentation for recv() (from Anton Berezin
+ <tobez@plab.ku.dk>)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 4325] By: gsar on 1999/10/09 22:46:23
+ Log: perldelta updates (see TODO markers)
+ Branch: perl
+ ! Changes pod/perldelta.pod pp_sys.c
+____________________________________________________________________________
+[ 4324] By: gsar on 1999/10/09 19:43:10
+ Log: fix Exporter::export_to_level() documentation
+ Branch: perl
+ ! lib/Exporter.pm
+____________________________________________________________________________
+[ 4323] By: gsar on 1999/10/09 18:48:31
+ Log: don't run END blocks when running under -c switch (older,
+ rarely useful behavior may still be obtained by putting
+ BEGIN { $^C = 0; exit; } at the end of the script)
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 4322] By: jhi on 1999/10/09 05:31:26
+ Log: While awaiting a good test program to detect the broken gcc.
+ From: Thomas Conté <tom@fr.uu.net>
+ To: <jhi@iki.fi>
+ Cc: <perl5-porters@perl.org>
+ Subject: Re: [ID 19990825.007] test t/lib/ipc_sysv.t failing under irix 6.4
+ Date: Wed, 6 Oct 1999 19:56:29 +0200
+ Message-ID: <000a01bf1024$1d938f20$252ad0d4@eng.iway.fr>
+ Branch: cfgperl
+ ! hints/irix_6.sh perl.h
+____________________________________________________________________________
+[ 4321] By: gsar on 1999/10/09 00:41:02
+ Log: POPSUB() gave up the refcount to the CV before LEAVE had a chance to
+ clear entries in the CV's pad, leading to coredumps when CV had no
+ other references to it; this is a slightly edited version of the
+ patch suggested by Russel O'Connor <roconnor@world.std.com>
+ Branch: perl
+ ! cop.h pp_ctl.c pp_hot.c
+____________________________________________________________________________
+[ 4320] By: gsar on 1999/10/08 22:50:51
+ Log: revert POP{SUB,LOOP}{1,2} logic to the simpler pre-5.003_24
+ situation (assumptions about cx invalidation are not valid
+ anymore)
+ Branch: perl
+ ! cop.h pp_ctl.c pp_hot.c
+____________________________________________________________________________
+[ 4319] By: jhi on 1999/10/08 14:33:31
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> cop.h ext/Thread/Thread.xs op.c opcode.h perl.c perl.h perly.c
+ !> perly.y pod/perldiag.pod pod/perlfunc.pod pp_ctl.c pp_sys.c
+ !> t/comp/bproto.t thrdvar.h toke.c util.c
+____________________________________________________________________________
+[ 4318] By: jhi on 1999/10/08 13:51:34
+ Log: The second cut at AIX C++ extension troubles.
+ Branch: cfgperl
+ ! ext/DynaLoader/dl_aix.xs ext/DynaLoader/hints/aix.pl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 4317] By: jhi on 1999/10/08 10:44:13
+ Log: The first cut at fixing Perl extensions written in C++ in AIX,
+ statics don't get initialized right. This patch at least
+ doesn't seem to break the build in my AIX, but unfortunately
+ I don't have the IBM C++ to do further testing.
- Title: "Fix constant detection in t/op/ipcsem.t for Digit UNIX"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199805121212.PAA15351@alpha.hut.fi>
- Files: t/op/ipcsem.t
+ Problem reported by Stephanie Beals in
+ From: bealzy@us.ibm.com
+ To: perl5-porters@perl.org
+ Subject: [ID 19991007.005] DynaLoader/dl_aix.xs problem using load and unload on AIX
+ Date: Thu, 7 Oct 1999 15:05:54 -0400
+ Message-Id: <85256803.0068E70D.00@D51MTA03.pok.ibm.com>
+ Branch: cfgperl
+ + ext/DynaLoader/hints/aix.pl
+ ! MANIFEST ext/DynaLoader/dl_aix.xs hints/aix.sh
+____________________________________________________________________________
+[ 4316] By: gsar on 1999/10/08 10:26:15
+ Log: remove kludgey duplicate background error avoidance (caused
+ "leaks"; %@ wasn't even user-visible under -Dusethreads);
+ only repeats of most recent error are now avoided
+ Branch: perl
+ ! ext/Thread/Thread.xs perl.c perl.h pp_ctl.c thrdvar.h util.c
+____________________________________________________________________________
+[ 4315] By: jhi on 1999/10/08 09:48:59
+ Log: Fix omission.
+ Branch: cfgperl
+ ! makedef.pl
+____________________________________________________________________________
+[ 4314] By: gsar on 1999/10/08 07:17:01
+ Log: extend change#2299 to C<use> (fixes scoping problems in
+ C<if (...) { use foo; ... }>)
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 4313] By: gsar on 1999/10/08 04:52:19
+ Log: small tweak for change#4309
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 4312] By: gsar on 1999/10/08 02:31:13
+ Log: add suggested patch =~ s/NOTOP/OP_NOT/ with tests
+ From: Larry Wall <larry@wall.org>
+ Date: Wed, 6 Oct 1999 09:55:57 -0700 (PDT)
+ Message-Id: <199910061655.JAA11333@kiev.wall.org>
+ Subject: Re: [ID 19991001.004] apparent parsing error with not(arg)
+ Branch: perl
+ ! opcode.h t/comp/bproto.t toke.c
+____________________________________________________________________________
+[ 4311] By: gsar on 1999/10/08 00:58:19
+ Log: typo
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 4310] By: gsar on 1999/10/07 23:51:38
+ Log: fix setpgrp vs getpgrp and POSIX vs BSD confusion (spotted by
+ Brian Mitchell <brian@chele.cais.net>)
+ Branch: perl
+ ! pod/perldiag.pod pod/perlfunc.pod pp_sys.c
+____________________________________________________________________________
+[ 4309] By: gsar on 1999/10/07 22:57:52
+ Log: change#3728 was flawed (loop contexts saw the wrong statement
+ info, causing loop control constructs to not find the label);
+ disable OP_SETSTATE entirely and add a fix that is specifically
+ targetted at disabling the OP_LINESEQ optimization in else BLOCK,
+ which was what the original patch was supposed to fix
- Title: "Fix doc bug for system() return value"
- From: Daniel Grisinger <dgris@perrin.dimensional.com>
- Msg-ID: <Pine.LNX.3.96.980514165608.4062A-100000@perrin.dimensional.com>
- Files: pod/perlfunc.pod t/op/exec.t
+ TODO: remove the remainder of the setstate logic if it can't
+ be used anywhere else (it isn't used anywhere now)
+ Branch: perl
+ ! cop.h op.c perly.c perly.y
+____________________________________________________________________________
+[ 4308] By: jhi on 1999/10/07 19:21:27
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/Pod/Man.pm lib/Pod/Text.pm pod/pod2man.PL
+____________________________________________________________________________
+[ 4307] By: gsar on 1999/10/07 15:12:24
+ Log: update to podlators-0.08 from Russ Allbery
+ Branch: perl
+ ! lib/Pod/Man.pm lib/Pod/Text.pm pod/pod2man.PL
+____________________________________________________________________________
+[ 4306] By: jhi on 1999/10/06 17:20:34
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 45 files)
+____________________________________________________________________________
+[ 4305] By: gsar on 1999/10/06 16:55:45
+ Log: some versions of mingw32 have __int64, define iff it isn't
+ Branch: perl
+ ! win32/win32.h
+____________________________________________________________________________
+[ 4304] By: gsar on 1999/10/06 03:45:44
+ Log: fix typos in change#4288
+ Branch: perl
+ ! Changes dump.c sv.c
+____________________________________________________________________________
+[ 4303] By: gsar on 1999/10/06 03:22:46
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> eg/cgi/dna_small_gif.uu eg/cgi/wilogo_gif.uu
+ - eg/cgi/dna.small.gif.uu eg/cgi/wilogo.gif.uu
+ !> (integrate 31 files)
+____________________________________________________________________________
+[ 4302] By: gsar on 1999/10/06 02:36:53
+ Log: make die/warn and other diagnostics go to wherever STDERR happens
+ to point at; change places that meant Perl_debug_log rather than
+ PerlIO_stderr()
+ Branch: perl
+ ! cop.h doio.c embedvar.h ext/Devel/Peek/Peek.xs
+ ! ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_beos.xs
+ ! ext/DynaLoader/dl_cygwin.xs ext/DynaLoader/dl_dld.xs
+ ! ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_hpux.xs
+ ! ext/DynaLoader/dl_mpeix.xs ext/DynaLoader/dl_next.xs
+ ! ext/DynaLoader/dl_rhapsody.xs ext/DynaLoader/dl_vmesa.xs
+ ! ext/DynaLoader/dl_vms.xs ext/DynaLoader/dlutils.c
+ ! ext/Thread/Thread.xs ext/Thread/typemap intrpvar.h malloc.c
+ ! mg.c objXSUB.h op.c perl.c perl.h perlio.c pp.c pp_ctl.c
+ ! pp_hot.c regexec.c scope.c scope.h sv.c thread.h toke.c util.c
+ ! win32/dl_win32.xs win32/win32.c win32/win32thread.c
+____________________________________________________________________________
+[ 4301] By: jhi on 1999/10/05 23:03:46
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: François Désarménien <desar@club-internet.fr>
+ Cc: "perl5-porters@perl.org" <perl5-porters@perl.org>
+ Subject: Re: Strange RE engine breakage in 5_61
+ Date: Mon, 4 Oct 1999 19:58:03 -0400
+ Message-ID: <19991004195803.A21760@monk.mps.ohio-state.edu>
+
+ (had to apply pat.t part manually because there
+ already were more tests than there was in _61)
+ Branch: cfgperl
+ ! regcomp.c regexec.c t/op/pat.t t/op/re_tests
+____________________________________________________________________________
+[ 4300] By: jhi on 1999/10/04 17:03:18
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Jarkko Hietaniemi <jhi@iki.fi>
+ cc: Perl Porters <perl5-porters@perl.org>, jhi@cc.hut.fi
+ Subject: Re: [ID 19991001.005] [_61] [PATCH] tarball fine on win32, zip isn't
+ Date: Mon, 4 Oct 1999 13:05:08 -0400 (EDT)
+ Message-ID: <Pine.SOL.4.10.9910041302550.6502-100000@maxwell.phys.lafayette.edu>
+ Branch: cfgperl
+ + eg/cgi/dna_small_gif.uu eg/cgi/wilogo_gif.uu
+ - eg/cgi/dna.small.gif.uu eg/cgi/wilogo.gif.uu
+ ! MANIFEST ext/B/defsubs_h.PL
+____________________________________________________________________________
+[ 4299] By: jhi on 1999/10/04 07:15:16
+ Log: From: Michael G Schwern <schwern@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: Re: [PATCH av.c, op.c, perldiag.pod] "array field" -> "pseudo-hash field"
+ Date: Sun, 3 Oct 1999 17:34:17 -0400
+ Message-ID: <19991003173417.A4351@blackrider>
+ Branch: cfgperl
+ ! t/lib/fields.t t/pragma/constant.t
+____________________________________________________________________________
+[ 4298] By: gsar on 1999/10/04 04:57:53
+ Log: some compatibility macros were busted
+ Branch: perl
+ ! embed.h embed.pl toke.c
+____________________________________________________________________________
+[ 4297] By: jhi on 1999/10/03 17:50:59
+ Log: A better version of #4296.
- ------ UTILITIES ------
+ From: Michael G Schwern <schwern@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH av.c, op.c, perldiag.pod] "array field" -> "pseudo-hash field"
+ Date: Sun, 3 Oct 1999 13:54:23 -0400
+ Message-ID: <19991003135423.A3050@blackrider>
+ Branch: cfgperl
+ ! av.c op.c pod/perldiag.pod
+____________________________________________________________________________
+[ 4296] By: jhi on 1999/10/03 17:21:01
+ Log: (Replaced by #4297.)
- Title: "Avoid possible constant autoload loop"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Graham Barr <gbarr@ti.com>, Ilya
- Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199805141910.PAA26994@monk.mps.ohio-state.edu>,
- <355B475A.C5AD4B90@ti.com>,
- <E0ya11X-0000hm-00@taurus.cus.cam.ac.uk>
- Files: utils/h2xs.PL
+ From: Michael G Schwern <schwern@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH av.c, perldiag.pod] Added field name to "No such array field"
+ Date: Sun, 3 Oct 1999 13:16:47 -0400
+ Message-ID: <19991003131647.A2816@blackrider>
- Title: "Further improvements to h2ph.PL"
- From: kstar@chapin.edu
- Msg-ID: <199805130241.WAA25459@chapin.edu>
- Files: utils/h2ph.PL
- Branch: maint-5.004/perl
- + ext/POSIX/hints/bsdos.pl ext/POSIX/hints/freebsd.pl
- + ext/POSIX/hints/netbsd.pl ext/POSIX/hints/openbsd.pl
- ! MANIFEST ext/POSIX/POSIX.xs gv.c lib/English.pm
- ! lib/ExtUtils/MM_VMS.pm pod/perlfunc.pod t/io/pipe.t
- ! t/op/exec.t t/op/ipcsem.t util.c utils/h2ph.PL utils/h2xs.PL
-
-----------------
-Version 5.004_64
-----------------
-
+ plus changed the error message to say "No such pseudo-hash field"
+ as discussed in the above mail message.
+ Branch: cfgperl
+ ! av.c pod/perldiag.pod
____________________________________________________________________________
-[ 983] By: mbeattie on 1998/05/15 14:04:17
- Log: Integrate win32 branch into mainline.
+[ 4295] By: gsar on 1999/10/03 16:09:36
+ Log: avoid doing irrelevant things on 'make perl'
Branch: perl
- +> Porting/patching.pod t/op/defins.t
- !> (integrate 107 files)
+ ! Makefile.SH
____________________________________________________________________________
-[ 982] By: TimBunce on 1998/05/15 12:33:26
- Log: Title: "comment init_postdump_symbols issues"
- From: Tim Bunce
- Files: perl.c
-
- Title: "Improve sort docs re SUBNAME"
- From: circle@azstarnet.com
- Msg-ID: <199804281828.LAA22737@andromeda.azstarnet.com>
- Files: pod/perlfunc.pod
- Branch: maint-5.004/perl
- ! perl.c pod/perlfunc.pod
+[ 4294] By: jhi on 1999/10/03 14:16:24
+ Log: Fix a typo in #4293 spotted by Graham Barr.
+ Branch: cfgperl
+ ! pod/perlref.pod
____________________________________________________________________________
-[ 981] By: TimBunce on 1998/05/15 11:47:28
- Log: Title: "Add hook to tie %! to external Errno.pm module (not included)"
- From: Graham Barr <gbarr@ti.com>
- Msg-ID: <355080CD.1111BC81@ti.com>
- Files: gv.c
- Branch: maint-5.004/perl
- ! gv.c
+[ 4293] By: jhi on 1999/10/03 11:31:22
+ Log: From: Michael G Schwern <schwern@blackrider.aocn.com>
+ To: perl5-porters@perl.org
+ Subject: Re: Should keys in pseudo-hashes -always- exist? [DOC PATCH]
+ Date: Sun, 3 Oct 1999 02:34:01 -0400
+ Message-ID: <19991003023401.A1520@blackrider>
+ Branch: cfgperl
+ ! pod/perlfunc.pod pod/perlref.pod
____________________________________________________________________________
-[ 980] By: gsar on 1998/05/15 06:16:13
- Log: add doc for C<+{}> vs. C<{;}> disambiguation
- Branch: win32/perl
- ! pod/perlref.pod
+[ 4292] By: jhi on 1999/10/03 09:23:16
+ Log: From: Barrie Slaymaker <barries@slaysys.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_61] Benchmark.pm bugfix, tweaks
+ Date: Sun, 3 Oct 1999 00:09:51 -0400
+ Message-Id: <199910030409.AAA18228@jester.slaysys.com>
+ Branch: cfgperl
+ ! lib/Benchmark.pm
____________________________________________________________________________
-[ 979] By: gsar on 1998/05/15 04:59:47
- Log: tweaks to win32 makefiles. This version builds and passes all
- tests on Solaris/gcc, win32/[bv]c. Looks all set to go.
- Branch: win32/perl
- ! win32/Makefile win32/makefile.mk
+[ 4291] By: jhi on 1999/10/02 23:43:53
+ Log: Be understanding about large file systems.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
____________________________________________________________________________
-[ 978] By: gsar on 1998/05/15 02:41:58
- Log: merge changes#922,944,949,965,970 from maintbranch
- Branch: win32/perl
- + Porting/patching.pod t/op/defins.t
- ! MANIFEST Porting/makerel ext/POSIX/POSIX.pod gv.c gv.h hv.c
- ! lib/File/Find.pm op.c pod/Makefile pod/perlfunc.pod
- ! pod/perlguts.pod pod/perlop.pod pod/pod2man.PL
- ! t/lib/filefind.t t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
- ! utils/perlbug.PL
+[ 4290] By: jhi on 1999/10/02 23:39:16
+ Log: Configure fixfest continues.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/d_longdbl.U U/modified/d_longlong.U
+ ! U/threads/d_pthreadj.U U/typedefs/gidsign.U
+ ! U/typedefs/gidsize.U U/typedefs/pidsign.U U/typedefs/pidsize.U
+ ! U/typedefs/uidsign.U U/typedefs/uidsize.U
+ Branch: metaconfig/U/perl
+ ! i_inttypes.U io64.U
+____________________________________________________________________________
+[ 4289] By: jhi on 1999/10/02 23:12:54
+ Log: Regen Porting stuff.
+ Branch: cfgperl
+ ! Porting/Glossary Porting/config.sh Porting/config_H
____________________________________________________________________________
-[ 977] By: gsar on 1998/05/15 02:15:25
- Log: merge changes#906,907,909,910 from maintbranch
- Branch: win32/perl
- ! MANIFEST doio.c doop.c embed.h embedvar.h global.sym
- ! keywords.h lib/Carp.pm lib/File/Basename.pm mg.c opcode.h
- ! perl.c perl.h pod/perldiag.pod pp.c pp_hot.c proto.h sv.c
- ! util.c
+[ 4288] By: jhi on 1999/10/02 23:05:50
+ Log: Untangle the IV_IS_QUAD jungle by introduding
+ macros to be used when doing formatted printing:
+ IVdf, UVuf, UVxf, UVof. Also introduce Uid_t_SIGN.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH doio.c dump.c op.c perl.h pp_hot.c pp_sys.c
+ ! regcomp.c sv.c taint.c toke.c util.c
+____________________________________________________________________________
+[ 4287] By: jhi on 1999/10/02 22:54:18
+ Log: metaconfig maintenance.
+ Branch: metaconfig
+ ! U/ebcdic/ebcdic.U U/typedefs/gidsign.U U/typedefs/gidsize.U
+ ! U/typedefs/pidsign.U U/typedefs/pidsize.U U/typedefs/uidsign.U
+ ! U/typedefs/uidsize.U
+____________________________________________________________________________
+[ 4286] By: nick on 1999/10/02 11:11:44
+ Log: Incremental merge of mainline
+ Branch: utfperl
+ +> README.Y2K hints/svr5.sh lib/Pod/Man.pm
+ +> lib/unicode/Unicode.html t/op/args.t t/pod/multiline_items.t
+ +> t/pod/multiline_items.xr t/pod/pod2usage.t t/pod/pod2usage.xr
+ +> t/pod/podselect.t t/pod/podselect.xr
+ - lib/Pod/PlainText.pm
+ !> (integrate 148 files)
+____________________________________________________________________________
+[ 4285] By: jhi on 1999/10/02 10:16:15
+ Log: Battle namespace pollution.
+ Branch: cfgperl
+ ! lib/Benchmark.pm
____________________________________________________________________________
-[ 976] By: gsar on 1998/05/15 01:34:53
- Log: merge change#905 from maintbranch, minor fixes to get
- clean build+test on Solaris
- Branch: win32/perl
- ! doop.c dump.c embed.h embedvar.h lib/strict.pm mg.c op.h
- ! opcode.h pod/perlop.pod pod/perlre.pod pp_ctl.c pp_hot.c
- ! regcomp.c sv.c t/op/taint.t toke.c
-____________________________________________________________________________
-[ 975] By: gsar on 1998/05/14 23:34:26
- Log: merge change#904 from maintbranch
- Branch: win32/perl
- ! doop.c ext/DynaLoader/dl_aix.xs ext/IO/lib/IO/Socket.pm
- ! ext/NDBM_File/NDBM_File.pm lib/strict.pm lib/subs.pm
- ! lib/vars.pm op.c perl.c pod/perldiag.pod pod/perlembed.pod
- ! pod/perlfunc.pod pod/perlsec.pod pp_ctl.c sv.c utils/h2ph.PL
- ! vms/descrip.mms
-____________________________________________________________________________
-[ 974] By: gsar on 1998/05/14 23:11:05
- Log: merge change#897 from maintbranch
- Branch: win32/perl
- ! Porting/Contract Todo doio.c emacs/ptags embed.h ext/IO/IO.pm
- ! ext/Opcode/Opcode.pm lib/Carp.pm lib/ExtUtils/MM_Unix.pm
- ! lib/Pod/Html.pm lib/Term/ReadLine.pm lib/chat2.pl opcode.h
- ! opcode.pl perl.c pod/perlapio.pod pod/perlcall.pod
- ! pod/perldebug.pod pod/perldelta.pod pod/perldelta4.pod
- ! pod/perldiag.pod pod/perlembed.pod pod/perlfaq2.pod
- ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- ! pod/perlfaq7.pod pod/perlfaq8.pod pod/perlform.pod
- ! pod/perlfunc.pod pod/perlguts.pod pod/perlhist.pod
- ! pod/perlipc.pod pod/perllocale.pod pod/perlmodlib.pod
- ! pod/perlop.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
- ! pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
- ! pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod pod/pod2man.PL
- ! pod/roffitall pp.c pp_sys.c t/TEST t/op/gv.t t/op/hashwarn.t
- ! t/op/substr.t vms/vms.c win32/config.bc win32/config.vc
- ! win32/config_H.bc win32/config_H.vc win32/win32.c
- ! x2p/find2perl.PL
+[ 4284] By: jhi on 1999/10/02 10:11:20
+ Log: Regen Configure, all of xs_apiversion didn't take.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH patchlevel.h
____________________________________________________________________________
-[ 973] By: gsar on 1998/05/14 22:24:26
- Log: integrate mainline
- Branch: win32/perl
- + Porting/Contract
- +> README.beos beos/nm.c ext/POSIX/hints/bsdos.pl
- +> ext/POSIX/hints/freebsd.pl ext/POSIX/hints/netbsd.pl
- +> ext/POSIX/hints/openbsd.pl hints/beos.sh pod/perldelta4.pod
- +> utils/perlcc.PL
- ! MANIFEST Todo doio.c emacs/ptags embed.h ext/IO/IO.pm
- ! ext/Opcode/Opcode.pm ext/Socket/Socket.xs hints/irix_5.sh
- ! hints/netbsd.sh hv.c lib/Benchmark.pm lib/Carp.pm
- ! lib/ExtUtils/Install.pm lib/ExtUtils/MM_Unix.pm
- ! lib/Pod/Html.pm lib/Term/ReadLine.pm lib/chat2.pl opcode.h
- ! opcode.pl perl.c perl.h pod/perlapio.pod pod/perlcall.pod
- ! pod/perldebug.pod pod/perldelta.pod pod/perldiag.pod
- ! pod/perlembed.pod pod/perlfaq2.pod pod/perlfaq3.pod
- ! pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfaq7.pod
- ! pod/perlfaq8.pod pod/perlform.pod pod/perlfunc.pod
- ! pod/perlguts.pod pod/perlhist.pod pod/perlipc.pod
- ! pod/perllocale.pod pod/perlmodlib.pod pod/perlop.pod
- ! pod/perlre.pod pod/perlref.pod pod/perlrun.pod
- ! pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
- ! pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod pod/pod2man.PL
- ! pod/roffitall pp.c pp_hot.c pp_sys.c sv.c t/TEST t/op/gv.t
- ! t/op/hashwarn.t t/op/substr.t vms/vms.c win32/config.bc
- ! win32/config.vc win32/config_H.bc win32/config_H.vc
- ! win32/win32.c x2p/find2perl.PL
- !> (integrate 59 files)
-____________________________________________________________________________
-[ 972] By: nick on 1998/05/14 18:09:01
- Log: Changes to allow compiler with gcc-2.8.1 in C++ mode,
- Remove K&R style functions, avoid struct/typedef clash.
- Branch: ansiperl
- ! bytecode.h byterun.c sv.c toke.c
-____________________________________________________________________________
-[ 971] By: TimBunce on 1998/05/14 16:52:19
- Log:
- Title: "fix C<print "foo ${\()}"> (pp_refgen fumbles when G_SCALAR, no args)"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805070402.AAA02858@aatma.engin.umich.edu>
- Files: pp.c
- Branch: maint-5.004/perl
- ! pp.c
+[ 4283] By: jhi on 1999/10/02 09:48:17
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/Pod/Man.pm t/pod/multiline_items.t
+ +> t/pod/multiline_items.xr t/pod/pod2usage.t t/pod/pod2usage.xr
+ +> t/pod/podselect.t t/pod/podselect.xr
+ - lib/Pod/PlainText.pm
+ !> (integrate 50 files)
____________________________________________________________________________
-[ 970] By: TimBunce on 1998/05/14 16:18:06
- Log:
- Title: "perlbug reformatted"
- From: Dominic Dunlop <domo@vo.lu>, Hugo van der Sanden
- <hv@crypt0.demon.co.uk>
- Msg-ID: <199805110954.LAA20367@dorlas.elsevier.nl>,
- <l03130300b17cebcb6d33@[194.222.64.89]>,
- <v03110702b17ccbab6824@[195.95.102.67]>
- Files: utils/perlbug.PL
- Branch: maint-5.004/perl
- ! utils/perlbug.PL
+[ 4282] By: gsar on 1999/10/02 06:39:14
+ Log: update pod2man, pod2text and related Pod:: modules with the
+ ones in podlators-0.07 from Russ Allbery
+ Branch: perl
+ + lib/Pod/Man.pm
+ ! lib/Pod/Text.pm lib/Pod/Text/Color.pm lib/Pod/Text/Termcap.pm
+ ! pod/pod2man.PL pod/pod2text.PL
____________________________________________________________________________
-[ 969] By: mbeattie on 1998/05/14 16:15:09
- Log: Integrate win32 branch into mainline
+[ 4281] By: gsar on 1999/10/02 06:14:44
+ Log: fix PodParser testsuite; Pod::Text subsumes Pod::PlainText
Branch: perl
- +> ext/DynaLoader/DynaLoader.pm.PL hints/openbsd.sh
- +> t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t t/op/pos.t
- - ext/DynaLoader/DynaLoader.pm
- !> (integrate 118 files)
+ - lib/Pod/PlainText.pm
+ ! MANIFEST lib/Pod/Text.pm lib/Pod/Usage.pm pod/pod2usage.PL
+ ! pod/podchecker.PL pod/podselect.PL t/pod/emptycmd.t
+ ! t/pod/for.t t/pod/headings.t t/pod/include.t t/pod/included.t
+ ! t/pod/lref.t t/pod/multiline_items.t t/pod/nested_items.t
+ ! t/pod/nested_seqs.t t/pod/oneline_cmds.t t/pod/pod2usage.t
+ ! t/pod/poderrs.t t/pod/poderrs.xr t/pod/podselect.t
+ ! t/pod/special_seqs.t t/pod/testp2pt.pl t/pod/testpchk.pl
____________________________________________________________________________
-[ 968] By: mbeattie on 1998/05/14 16:05:57
- Log: Bump patchlevel to 65
+[ 4280] By: gsar on 1999/10/02 04:39:38
+ Log: upgrade to PodParser-1.085 from Brad Appleton <bradapp@enteract.com>
Branch: perl
- ! patchlevel.h
+ + t/pod/multiline_items.t t/pod/multiline_items.xr
+ + t/pod/pod2usage.t t/pod/pod2usage.xr t/pod/podselect.t
+ + t/pod/podselect.xr
+ ! MANIFEST lib/Pod/Checker.pm lib/Pod/InputObjects.pm
+ ! lib/Pod/Parser.pm lib/Pod/PlainText.pm lib/Pod/Select.pm
+ ! lib/Pod/Usage.pm t/pod/for.xr t/pod/headings.xr
+ ! t/pod/include.xr t/pod/included.xr t/pod/lref.xr
+ ! t/pod/nested_items.xr t/pod/nested_seqs.xr
+ ! t/pod/oneline_cmds.xr t/pod/poderrs.xr t/pod/special_seqs.xr
+ ! t/pod/testp2pt.pl
____________________________________________________________________________
-[ 967] By: mbeattie on 1998/05/14 16:05:19
- Log: Another fixup of MANIFEST
+[ 4279] By: gsar on 1999/10/02 03:36:41
+ Log: make exists() work better on pseudo-hashes (reworked a patch suggested
+ by Michael G Schwern <schwern@pobox.com>)
Branch: perl
- ! MANIFEST
+ ! av.c t/op/avhv.t
____________________________________________________________________________
-[ 966] By: mbeattie on 1998/05/14 16:02:20
- Log: Add missing files to MANIFEST
+[ 4278] By: gsar on 1999/10/02 02:36:55
+ Log: deprecate C<use attrs>
Branch: perl
- ! MANIFEST
+ ! ext/attrs/attrs.pm ext/attrs/attrs.xs t/lib/attrs.t
+ ! t/lib/thread.t t/pragma/sub_lval.t
____________________________________________________________________________
-[ 965] By: TimBunce on 1998/05/14 16:00:11
- Log:
- Title: "Sub declaration cost reduced from ~500 to ~100 bytes"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199805050607.CAA02050@monk.mps.ohio-state.edu>
- Files: gv.h gv.c op.c
- Branch: maint-5.004/perl
- ! gv.c gv.h op.c
+[ 4277] By: gsar on 1999/10/02 01:43:25
+ Log: add notes about effect of loop control statements inside
+ LABEL BLOCK continue BLOCK
+ Branch: perl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 964] By: mbeattie on 1998/05/14 15:58:01
- Log: Subject: [PATCH] Using Getopts::* with strict vars
- Date: Wed, 29 Apr 1998 22:48:16 -0700 (PDT)
- From: Tom Phoenix <rootbeer@teleport.com>
+[ 4276] By: gsar on 1999/10/02 01:23:02
+ Log: indent nested =items properly (suggested by Bill Fenner
+ <fenner@research.att.com>)
Branch: perl
- ! lib/Getopt/Long.pm lib/Getopt/Std.pm lib/strict.pm
+ ! pod/pod2man.PL
____________________________________________________________________________
-[ 963] By: mbeattie on 1998/05/14 15:56:53
- Log: Subject: [ PATCH 5.004_64 ] Integrated regression tests for compiler
- Date: Wed, 29 Apr 1998 21:02:36 -0600 (MDT)
- From: epeschko@den-mdev1 (Ed Peschko)
+[ 4275] By: gsar on 1999/10/02 01:09:16
+ Log: updated ptags generator from Ilya Zakharevich
Branch: perl
- + utils/perlcc.PL
- ! MANIFEST Makefile.SH installperl lib/Test/Harness.pm
- ! pod/Makefile t/TEST t/harness utils/Makefile x2p/Makefile.SH
+ ! emacs/ptags
____________________________________________________________________________
-[ 962] By: mbeattie on 1998/05/14 15:45:28
- Log: From: Dan Sugalski <sugalskd@ous.edu>
- Subject: [PATCH 5.004_64] Final (I hope) doc patch for Thread.pm
- Date: Wed, 08 Apr 1998 17:08:48 -0700
- Subject: [PATCH 5.004_64] Revised second Thread.PM doc patch
- Date: Fri, 08 May 1998 10:49:16 -0700
+[ 4274] By: gsar on 1999/10/01 23:08:52
+ Log: update Changes
Branch: perl
- ! ext/Thread/Thread.pm
+ ! Changes
____________________________________________________________________________
-[ 961] By: mbeattie on 1998/05/14 15:43:39
- Log: Subject: Consolidated patch to 5.004_64
- Date: Wed, 08 Apr 1998 19:44:34 -0400 (EDT)
- From: Charles Bailey <BAILEY@newman.upenn.edu>
+[ 4273] By: gsar on 1999/10/01 22:58:55
+ Log: typo, whitespace adjustments
Branch: perl
- ! ext/B/byteperl.c lib/ExtUtils/MM_Unix.pm
- ! lib/ExtUtils/MM_VMS.pm lib/chat2.pl perl.c pod/perlsub.pod
- ! vms/config.vms vms/descrip.mms vms/genconfig.pl
- ! vms/perlvms.pod
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 960] By: mbeattie on 1998/05/14 15:41:41
- Log: Subject: Re: ANNOUNCE: Perl 5.005b1t3 (a.k.a. perl5.004_64) is available
- Date: 07 Apr 1998 18:31:21 +0200
- From: JVromans@Squirrel.nl (Johan Vromans)
+[ 4272] By: gsar on 1999/10/01 22:46:06
+ Log: remove dup hunks
Branch: perl
- ! lib/Getopt/Long.pm
+ ! configure.com vms/vms.c
____________________________________________________________________________
-[ 959] By: mbeattie on 1998/05/14 15:39:29
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Subject: Re: [PATCH] 5.004_04 or 5.004_64: Benchmark.pm: add run-for-some-time
- Date: Wed, 8 Apr 1998 09:47:45 +0300 (EET DST)
- Subject: [PATCH] perl 5.004_64+Config_04
- Date: Thu, 14 May 1998 12:14:07 +0300 (EET DST)
+[ 4271] By: gsar on 1999/10/01 22:33:02
+ Log: integrate cfgperl contents into mainline; resolve h2xs.PL conflict
+ by declaring new globals "our" (XXX this means h2xs generated code
+ won't run on earlier versions; a switch to generate compatible
+ source is needed)
+ Branch: perl
+ !> (integrate 35 files)
+____________________________________________________________________________
+[ 4270] By: jhi on 1999/10/01 12:05:56
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> ext/B/B/C.pm lib/ExtUtils/typemap lib/ExtUtils/xsubpp
+ !> pod/perldiag.pod util.c
+____________________________________________________________________________
+[ 4269] By: jhi on 1999/10/01 10:26:19
+ Log: From: Piotr Klaban <makler@oryl.man.torun.pl>
+ To: perl5-porters@perl.org
+ Subject: [ID 19991001.001] perlguts man page error
+ Date: Fri, 1 Oct 1999 10:23:49 +0200 (MET DST)
+ Message-Id: <199910010823.KAA05796@oryl.man.torun.pl>
+ Branch: cfgperl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 4268] By: jhi on 1999/10/01 07:32:33
+ Log: There *is* a month called October.
+ Branch: cfgperl
+ ! t/op/time.t
+____________________________________________________________________________
+[ 4267] By: jhi on 1999/10/01 06:58:10
+ Log: Temp file cleanliness.
+ Branch: cfgperl
+ ! t/lib/filecopy.t
+____________________________________________________________________________
+[ 4266] By: jhi on 1999/10/01 06:46:56
+ Log: From: Barrie Slaymaker <barries@slaysys.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_61] Benchmark.pm: Export countit(), cmpthese() by default
+ Date: Thu, 30 Sep 1999 22:16:26 -0400
+ Message-Id: <199910010216.WAA08309@jester.slaysys.com>
+ Branch: cfgperl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 4265] By: jhi on 1999/09/30 20:25:35
+ Log: From: Barrie Slaymaker <barries@slaysys.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_61] Benchmark tweaks, fixes, cmpthese()
+ Date: Thu, 30 Sep 1999 15:44:00 -0400
+ Message-Id: <199909301944.PAA07166@jester.slaysys.com>
+ (Replaces #4175.)
+ Branch: cfgperl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 4264] By: gsar on 1999/09/30 17:59:26
+ Log: re-add missing "Out of memory!" entry
Branch: perl
- ! lib/Benchmark.pm pod/perlfunc.pod
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 4263] By: jhi on 1999/09/30 17:05:43
+ Log: Regenerate Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 4261] By: jhi on 1999/09/30 16:15:05
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_61] rand() advisory for perldelta.pod
+ Date: Thu, 30 Sep 1999 12:24:00 -0400 (EDT)
+ Message-ID: <Pine.SOL.4.10.9909301218390.3343-100000@maxwell.phys.lafayette.edu>
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 4260] By: jhi on 1999/09/30 15:48:56
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Jarkko Hietaniemi <jhi@iki.fi>, Gurusamy Sarathy <gsar@activestate.com>
+ Subject: Re: Possible skeletal structure for searching multiple versions
+ Date: Thu, 30 Sep 1999 11:52:00 -0400 (EDT)
+ Message-ID: <Pine.SOL.4.10.9909301149090.3343-100000@maxwell.phys.lafayette.edu>
+ Branch: metaconfig
+ ! U/mkglossary
+ Branch: metaconfig/U/perl
+ + xs_apiversion.U
+ ! patchlevel.U
+____________________________________________________________________________
+[ 4259] By: jhi on 1999/09/30 15:07:16
+ Log: Further ?idsize.U fixing.
+ Branch: metaconfig
+ ! U/typedefs/gidsize.U U/typedefs/pidsize.U U/typedefs/uidsize.U
+____________________________________________________________________________
+[ 4258] By: jhi on 1999/09/30 15:00:14
+ Log: Fix the ?idsi{gn,ze} units, from Andy Dougherty.
+ Branch: metaconfig
+ ! U/typedefs/gidsign.U U/typedefs/gidsize.U U/typedefs/pidsign.U
+ ! U/typedefs/pidsize.U U/typedefs/uidsign.U U/typedefs/uidsize.U
+____________________________________________________________________________
+[ 4257] By: jhi on 1999/09/30 09:48:33
+ Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Gurusamy Sarathy <gsar@ActiveState.com>
+ Cc: tchrist@perl.com, Larry Wall <larry@wall.org>,
+ The Perl Porters Mailing List <perl5-porters@perl.org>
+ Subject: [PATCH] (Was: deprecating SIGDIE)
+ Date: Wed, 29 Sep 1999 15:16:50 -0400
+ Message-ID: <19990929151650.E26675@O2.chapin.edu>
+ Branch: cfgperl
+ ! Porting/findvars embedvar.h intrpvar.h mg.c objXSUB.h perl.c
+____________________________________________________________________________
+[ 4256] By: jhi on 1999/09/30 09:45:22
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Gurusamy Sarathy <gsar@activestate.com>
+ Cc: Barrie Slaymaker <barries@slaysys.com>, perl5-porters@perl.org
+ Subject: Re: _58, _61 Argument "" is not numeric in sprintf
+ Date: Wed, 29 Sep 1999 18:58:23 -0400
+ Message-ID: <19990929185823.A22099@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! Makefile.SH opcode.pl
____________________________________________________________________________
-[ 958] By: mbeattie on 1998/05/14 15:36:30
- Log: From: kstar@chapin.edu
- Subject: [PATCH] hints for Irix 6
- Date: Mon, 6 Apr 1998 15:14:14 -0400 (EDT)
- Subject: [PATCH 5.004_64] Threads - an easy way for dual installation
- Date: Wed, 29 Apr 1998 15:39:46 -0400 (EDT)
+[ 4255] By: gsar on 1999/09/30 09:03:48
+ Log: remove prehistoric XFree() gunk
Branch: perl
- ! INSTALL hints/irix_6.sh installperl
+ ! lib/ExtUtils/typemap lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 957] By: mbeattie on 1998/05/14 15:33:48
- Log: Subject: [PATCH] Install extensions with bootstrap (again) in $archlib
- Date: Mon, 06 Apr 1998 21:09:24 +0200
- From: Achim Bohnet <ach@mpe.mpg.de>
+[ 4254] By: gsar on 1999/09/30 08:40:14
+ Log: From: Vishal Bhatia <vishal@gol.com>
+ Date: Wed, 29 Sep 1999 23:27:28 +0900 (JST)
+ Message-ID: <Pine.LNX.4.10.9909292326280.5599-100000@localhost.localdomain>
+ Subject: [patch _61] Minor corrections in C.pm
Branch: perl
- ! lib/ExtUtils/Install.pm
+ ! ext/B/B/C.pm
____________________________________________________________________________
-[ 956] By: mbeattie on 1998/05/14 15:32:39
- Log: Subject: [PATCH] Config: Irix 5 hints
- Date: Mon, 6 Apr 1998 13:12:47 -0400 (EDT)
- From: kstar@O2.chapin.edu
+[ 4253] By: gsar on 1999/09/30 08:36:27
+ Log: off-by-one in fbm_compile() (spotted by John Bley
+ <jbley@cs.cmu.edu>); whitespace adjustments
Branch: perl
- ! hints/irix_5.sh
+ ! util.c
____________________________________________________________________________
-[ 955] By: mbeattie on 1998/05/14 15:31:12
- Log: Subject: PATCH: h2ph produces incorrect code
- Date: Mon, 6 Apr 1998 23:52:13 +0930 (CST)
- From: Billy <wdconsta@cs.adelaide.edu.au>
+[ 4251] By: jhi on 1999/09/30 08:09:13
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.00561+] Followup h2xs patch
+ Date: Thu, 30 Sep 1999 04:15:52 -0400 (EDT)
+ Message-Id: <199909300815.EAA25425@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! utils/h2xs.PL
+____________________________________________________________________________
+[ 4250] By: jhi on 1999/09/29 19:11:32
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> djgpp/configure.bat embed.h embed.pl lib/Exporter/Heavy.pm
+ !> lib/ExtUtils/MM_Unix.pm lib/Time/Local.pm proto.h
+ !> t/pragma/locale/latin1 win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 4249] By: bailey on 1999/09/29 02:21:31
+ Log: resync with mainline
+ Branch: vmsperl
+ +> (branch 32 files)
+ - ext/B/defsubs.h.PL lib/unicode/arabshp.txt
+ - lib/unicode/blocks.txt lib/unicode/index2.txt
+ - lib/unicode/jamo2.txt lib/unicode/names2.txt
+ - lib/unicode/props2.txt lib/unicode/readme.txt
+ - t/lib/bigfloatpm.t
+ !> (integrate 240 files)
+____________________________________________________________________________
+[ 4248] By: jhi on 1999/09/28 18:14:39
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_xx] Re: [Config 5.005_03] -DDEBUGGING
+ Date: Tue, 28 Sep 1999 12:20:50 -0400 (EDT)
+ Message-ID: <Pine.SOL.4.10.9909281019360.1890-100000@maxwell.phys.lafayette.edu>
+
+ From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [ANOTHER PATCH 5.005_61] Re: [Config 5.005_03] -DDEBUGGING
+ Date: Tue, 28 Sep 1999 13:39:49 -0400 (EDT)
+ Message-ID: <Pine.SOL.4.10.9909281338180.2012-100000@maxwell.phys.lafayette.edu>
+ Branch: cfgperl
+ ! hints/README.hints hints/amigaos.sh hints/cygwin.sh
+ ! hints/dynixptx.sh hints/epix.sh hints/esix4.sh hints/mint.sh
+ ! hints/mpeix.sh hints/next_3.sh hints/next_3_0.sh
+ ! hints/next_4.sh
+____________________________________________________________________________
+[ 4247] By: gsar on 1999/09/28 17:36:59
+ Log: revert change#4115 (breaks libwww's base/date.t); could be
+ reworked to enable it conditional on $Time::Local::nocroak
+ or some such
Branch: perl
- ! utils/h2ph.PL
+ ! lib/Time/Local.pm
____________________________________________________________________________
-[ 954] By: mbeattie on 1998/05/14 15:29:27
- Log: Subject: [PATCH] perldebug.pod
- Date: Mon, 6 Apr 1998 00:36:57 -0600
- From: jason stewart <jasons@sandy-home.arc.unm.edu>
+[ 4246] By: gsar on 1999/09/28 17:33:14
+ Log: tweak for win32 build
Branch: perl
- ! pod/perldebug.pod
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 953] By: mbeattie on 1998/05/14 15:28:00
- Log: From: Dominic Dunlop <domo@vo.lu>
- Subject: [PATCH 5.004_64]: hints/machten.sh: disable semctl()
- Date: Wed, 6 May 1998 14:39:32 +0000
- Subject: [PATCH] Not OK: perl 5.00464 on powerpc-machten 4.1 (hashwarn @INC problem)
- Date: Sat, 4 Apr 1998 19:44:34 +0000
- Branch: perl
- ! hints/machten.sh t/op/hashwarn.t
-____________________________________________________________________________
-[ 952] By: mbeattie on 1998/05/14 15:23:19
- Log: New pod/perldelta.pod (previous one branched in last change):
- Subject: [PATCH 5.004_64] Start new perldelta
- Date: Thu, 23 Apr 1998 12:12:38 -0400 (EDT)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Branch: perl
- + pod/perldelta.pod
-____________________________________________________________________________
-[ 951] By: mbeattie on 1998/05/14 15:20:43
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: [PATCH for 5.004_04 and 5.004_64] (Was: Obsoleted svr4.sh)
- Date: Thu, 23 Apr 1998 11:10:15 -0400 (EDT)
- Subject: [PATCH 5.004_64] Start new perldelta
- Date: Thu, 23 Apr 1998 12:12:38 -0400 (EDT)
- (above branched perldelta -> perldelta4, new perldelta will be
- created/added next change)
- Subject: [PATCH] BSD Platforms need STRUCT_TM_HASZONE
- Date: Tue, 12 May 1998 09:58:49 -0400 (EDT)
- Branch: perl
- + ext/POSIX/hints/bsdos.pl ext/POSIX/hints/freebsd.pl
- + ext/POSIX/hints/netbsd.pl ext/POSIX/hints/openbsd.pl
- +> pod/perldelta4.pod
- - pod/perldelta.pod
- ! MANIFEST hints/svr4.sh
-____________________________________________________________________________
-[ 949] By: TimBunce on 1998/05/14 15:11:30
- Log:
- Title: "while($x=<>) no longer warns (implicit defined added)"
- From: Nick Ing-Simmons <nik@tiuk.ti.com>
- Msg-ID: <199805051035.LAA27365@pluto.tiuk.ti.com>
- Files: MANIFEST op.c t/op/defins.t
- Branch: maint-5.004/perl
- + t/op/defins.t
- ! MANIFEST op.c
+[ 4245] By: gsar on 1999/09/28 17:31:34
+ Log: change#4236 fallout
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
____________________________________________________________________________
-[ 948] By: mbeattie on 1998/05/14 15:09:51
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: [PATCH for 5.004_64] Configure patch Config_64-01
- Date: Tue, 14 Apr 1998 13:04:58 -0400 (EDT)
- Subject: [PATCH for 5.004_64] Configure patch Config_64-01-02.diff
- Date: Fri, 17 Apr 1998 11:01:13 -0400 (EDT)
- Subject: [PATCH for 5.004_64] Configure patch Config_64-02-03.diff
- Date: Thu, 23 Apr 1998 15:03:20 -0400 (EDT)
- Subject: [PATCH 5.004_64] Config_64-03-04.diff
- Date: Wed, 13 May 1998 14:33:30 -0400 (EDT)
- Branch: perl
- + README.beos beos/nm.c hints/beos.sh
- ! Configure INSTALL MANIFEST Makefile.SH Policy_sh.SH
- ! Porting/Glossary Porting/config.sh Porting/config_H
- ! Porting/pumpkin.pod Todo cflags.SH config_h.SH
- ! djgpp/djgppsed.sh doop.c handy.h hints/dos_djgpp.sh
- ! hints/netbsd.sh hints/solaris_2.sh hints/unicos.sh
- ! hints/unicosmk.sh hv.h lib/Term/ReadLine.pm perl.h
- ! plan9/config.plan9 pod/perlfunc.pod pp.c pp_sys.c sv.h
- ! t/io/pipe.t thread.h vms/config.vms win32/config.bc
- ! win32/config.vc win32/config_H.bc win32/config_H.vc
-____________________________________________________________________________
-[ 946] By: TimBunce on 1998/05/14 15:07:06
- Log:
- Title: "Fix PERL_DESTRUCT_LEVEL core dumps"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805062301.TAA24599@aatma.engin.umich.edu>
- Files: perl.c sv.c t/op/misc.t
- Branch: maint-5.004/perl
- ! perl.c sv.c t/op/misc.t
-____________________________________________________________________________
-[ 945] By: mbeattie on 1998/05/14 15:00:31
- Log: Subject: Perl Social Contract
- Date: 13 Apr 1998 06:16:59 -0700
- From: Russ Allbery <rra@stanford.edu>
- Branch: perl
- + Porting/Contract
-____________________________________________________________________________
-[ 944] By: TimBunce on 1998/05/14 14:59:37
- Log:
- Title: "5.004_04-m2 Cleanup of test failures"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805070416.AAA03082@aatma.engin.umich.edu>
- Files: t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t t/op/taint.t
- win32/config.bc win32/config.vc
- Branch: maint-5.004/perl
- ! t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t t/op/taint.t
- ! win32/config.bc win32/config.vc
+[ 4244] By: gsar on 1999/09/28 17:29:31
+ Log: remove doubled new_xpv
+ Branch: perl
+ ! embed.h embed.pl proto.h
____________________________________________________________________________
-[ 943] By: mbeattie on 1998/05/14 14:58:13
- Log: From: Joshua.Pritikin@NewYork2.dmg.deuba.com
- Subject: [PATCH 5.004_64] Test.pm update
- Date: Sat, 4 Apr 1998 08:33:50 -0500
- Subject: [PATCH 5.004_64] modcount + comments
- Date: Fri, 17 Apr 1998 16:07:35 -0400
+[ 4243] By: jhi on 1999/09/27 19:13:20
+ Log: Artistic fine-tuning.
+ Branch: cfgperl
+ ! ext/B/defsubs_h.PL
+____________________________________________________________________________
+[ 4242] By: gsar on 1999/09/27 17:05:22
+ Log: avoid implicit split to @_ in change#4181; binary -> text file
+ types in p4
+ Branch: perl
+ ! djgpp/configure.bat lib/Exporter/Heavy.pm
+ ! t/pragma/locale/latin1
+____________________________________________________________________________
+[ 4241] By: jhi on 1999/09/27 07:48:19
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> INSTALL embed.h embed.pl malloc.c pod/perldiag.pod pp.c
+ !> pp_ctl.c pp_hot.c pp_sys.c win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 4240] By: jhi on 1999/09/27 07:47:11
+ Log: Finalize change #4232.
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Jarkko Hietaniemi <jhi@iki.fi>
+ Cc: gsar@activestate.com, Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: Re: xsubpp change breaks B, DB_File, POSIX builds
+ Date: Sun, 26 Sep 1999 16:52:31 -0400
+ Message-ID: <19990926165230.A26933@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! lib/ExtUtils/xsubpp
+____________________________________________________________________________
+[ 4239] By: gsar on 1999/09/27 02:48:42
+ Log: add notes in INSTALL about Configure -Accflags=-DFOO
Branch: perl
- ! lib/Test.pm op.c thrdvar.h
+ ! INSTALL
____________________________________________________________________________
-[ 942] By: mbeattie on 1998/05/14 14:49:43
+[ 4238] By: gsar on 1999/09/27 02:03:48
+ Log: PERL_POLLUTE isn't required for bincompat, so don't enable
+ it automatically
+ Branch: perl
+ ! embed.h embed.pl
+____________________________________________________________________________
+[ 4237] By: gsar on 1999/09/27 01:52:47
Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: [PATCH 5.004_64] newSV
- Date: Wed, 8 Apr 1998 03:21:03 -0400 (EDT)
- Subject: [PATCH 5.004_64] Cryptic error from B::CC
- Date: Sat, 11 Apr 1998 19:52:25 -0400 (EDT)
+ Date: Fri, 24 Sep 1999 23:25:36 -0400
+ Message-ID: <19990924232536.A16257@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_61] Malloc fixes and docs
Branch: perl
- ! ext/B/B/CC.pm handy.h proto.h sv.c
+ ! malloc.c pod/perldiag.pod
____________________________________________________________________________
-[ 941] By: mbeattie on 1998/05/14 14:47:29
+[ 4236] By: gsar on 1999/09/27 01:31:32
+ Log: avoid .exe in $Config{cc} (spotted by Vadim Konovalov
+ <vkonovalov@lucent.com>)
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 4235] By: gsar on 1999/09/26 17:02:03
+ Log: fix buggy popping of subroutine contexts in the lvalue
+ subroutines implementation (change#4081); correct the
+ plethora of cases where DIE() was more appropriate than
+ croak()
+ Branch: perl
+ ! pp.c pp_ctl.c pp_hot.c pp_sys.c
+____________________________________________________________________________
+[ 4234] By: jhi on 1999/09/26 12:06:28
+ Log: Fix #endif.
+ Branch: cfgperl
+ ! XSUB.h
+____________________________________________________________________________
+[ 4233] By: jhi on 1999/09/26 11:59:18
+ Log: Integrate with Sarathy. h2xs.PL had to be manually resolved,
+ I kept my (Ilya's) version.
+ Branch: cfgperl
+ !> gv.c gv.h intrpvar.h keywords.h keywords.pl lib/Shell.pm op.c
+ !> pod/perldiag.pod pod/perlembed.pod pod/perlfaq3.pod
+ !> pod/perlfaq7.pod pod/perlfunc.pod pod/perlmod.pod
+ !> pod/perlmodlib.pod pod/perlsub.pod pod/perltoot.pod
+ !> pod/perlxstut.pod sv.h t/pragma/strict-vars toke.c
+ !> utils/h2xs.PL win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 4232] By: jhi on 1999/09/26 09:53:43
Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: [PATCH 5.004_64] anydbm.t
- Date: Sat, 4 Apr 1998 01:39:03 -0500 (EST)
- Subject: [PATCH 5.004_64] threads on OS/2
- Date: Sat, 4 Apr 1998 01:44:29 -0500 (EST)
- Subject: [PATCH 5.004_64] Better handling of Perl DLLs under OS/2
- Date: Sat, 4 Apr 1998 01:47:58 -0500 (EST)
- Subject: [PATCH 5.004_64] Immediate stop in debugger
- Date: Sat, 11 Apr 1998 19:50:58 -0400 (EDT)
- Subject: [PATCH 5.005_64] ptags broken
- Date: Sat, 11 Apr 1998 22:08:21 -0400 (EDT)
- Subject: [PATCH 5.004_64] Document switch syntax via RE
- Date: Sun, 12 Apr 1998 01:12:33 -0400 (EDT)
- Branch: perl
- ! emacs/ptags lib/ExtUtils/MM_OS2.pm lib/ExtUtils/Mksymlists.pm
- ! lib/perl5db.pl os2/Changes os2/Makefile.SHs os2/os2.c
- ! os2/os2thread.h pod/perlsyn.pod t/lib/anydbm.t
-____________________________________________________________________________
-[ 940] By: mbeattie on 1998/05/14 14:38:44
- Log: Subject: [PATCH 5.004_64] Build Stdio and DCLSym modules as part of normal VMS perl build
- Date: Fri, 03 Apr 1998 16:01:57 -0800
- From: Dan Sugalski <sugalskd@osshe.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_61] teach xsubpp function pointers
+ Date: Sun, 26 Sep 1999 01:36:09 -0400
+ Message-ID: <19990926013609.A21148@monk.mps.ohio-state.edu>
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_61] Make h2xs -x almost bullet-proof
+ Date: Sun, 26 Sep 1999 03:00:50 -0400
+ Message-ID: <19990926030050.A21498@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! lib/ExtUtils/xsubpp utils/h2xs.PL
+____________________________________________________________________________
+[ 4231] By: jhi on 1999/09/26 09:48:49
+ Log: From: "Konovalov, Vadim" <vkonovalov@lucent.com>
+ To: perl5-porters@perl.org
+ Subject: misprint in perlguts
+ Date: Sun, 26 Sep 1999 12:48:36 +0400
+ Message-ID: <402099F49BEED211999700805FC7359F20D7A5@ru0028exch01.spb.lucent.com>
+ Branch: cfgperl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 4230] By: gsar on 1999/09/26 00:50:08
+ Log: add $installarchlib/CORE to default linker search path on windows
Branch: perl
- ! vms/descrip.mms vms/ext/DCLsym/Makefile.PL
- ! vms/ext/Stdio/Makefile.PL vms/ext/Stdio/Stdio.xs
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 939] By: mbeattie on 1998/05/14 14:35:42
- Log: Subject: [PATCH 5.004_64] perl dies in perl_construct when compiled with MULTIPLICITY
- Date: Fri, 03 Apr 1998 13:58:15 -0800
- From: Dan Sugalski <sugalskd@osshe.edu>
+[ 4229] By: gsar on 1999/09/25 20:05:03
+ Log: support C<use Shell> on Windows (reworked a patch suggested
+ by Jenda Krynicky <Jenda@McCann.cz>)
Branch: perl
- ! perl.c
+ ! lib/Shell.pm
____________________________________________________________________________
-[ 938] By: gsar on 1998/05/14 10:53:55
- Log: merge change#896 from maintbranch
- Branch: win32/perl
- ! doio.c ext/Socket/Socket.xs lib/Class/Struct.pm lib/Cwd.pm
- ! lib/File/Find.pm lib/Math/BigInt.pm lib/lib.pm lib/strict.pm
- ! op.c pod/perldiag.pod pod/perlfunc.pod pp.c pp_ctl.c sv.c
- ! t/op/gv.t t/op/misc.t t/op/pack.t
-____________________________________________________________________________
-[ 937] By: gsar on 1998/05/14 09:31:34
- Log: merge change#887 from maintbranch
- Branch: win32/perl
- + t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
- ! MANIFEST doio.c lib/File/CheckTree.pm lib/Getopt/Long.pm
- ! lib/Math/BigFloat.pm lib/Text/ParseWords.pm lib/Text/Wrap.pm
- ! lib/base.pm perl.c pod/perlre.pod t/lib/io_sock.t
- ! t/lib/io_udp.t t/lib/parsewords.t t/lib/timelocal.t
- ! t/op/stat.t toke.c utils/h2xs.PL
-____________________________________________________________________________
-[ 936] By: gsar on 1998/05/14 09:06:18
- Log: merge change#886 from maintbranch
- Branch: win32/perl
- ! README.os2 README.vms cop.h ext/DynaLoader/dl_hpux.xs
- ! ext/POSIX/POSIX.xs ext/POSIX/hints/linux.pl global.sym
- ! hints/aix.sh hints/bsdos.sh hints/dec_osf.sh hints/hpux.sh
- ! hints/linux.sh hints/netbsd.sh hints/os2.sh hints/svr4.sh
- ! lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm
- ! lib/File/Basename.pm lib/File/Path.pm op.c os2/Makefile.SHs
- ! os2/os2.c os2/perl2cmd.pl perl.c perl.h pod/perlguts.pod
- ! pod/pod2man.PL pp_ctl.c pp_hot.c pp_sys.c proto.h
- ! t/lib/filecopy.t util.c utils/perldoc.PL vms/config.vms
- ! vms/descrip.mms vms/ext/Filespec.pm vms/ext/filespec.t
- ! vms/test.com
-____________________________________________________________________________
-[ 935] By: gsar on 1998/05/14 07:00:02
- Log: merge changes#872,873 from maintbranch
- Branch: win32/perl
- ! Changes5.004 INSTALL lib/ExtUtils/MakeMaker.pm
- ! lib/FileHandle.pm lib/Tie/Hash.pm lib/constant.pm
- ! lib/integer.pm pod/perl.pod pod/perlbook.pod pod/perldsc.pod
- ! pod/perlfunc.pod pod/perlguts.pod pod/perlhist.pod
- ! pod/perlop.pod pod/perlre.pod pod/perlrun.pod pod/perlsec.pod
- ! pod/perltrap.pod pod/perlvar.pod pod/pod2latex.PL
- ! utils/perldoc.PL
+[ 4228] By: gsar on 1999/09/25 07:03:34
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> hints/svr5.sh
+ !> Configure MANIFEST Makefile.SH config_h.SH hints/sco.sh
+ !> lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ !> lib/unicode/mktables.PL pod/perldelta.pod pod/perlfaq9.pod
+ !> regcomp.c regexec.c t/lib/syslfs.t t/op/lfs.t
____________________________________________________________________________
-[ 934] By: gsar on 1998/05/14 06:24:38
- Log: merge changes#755..759,763,764 from maintbranch
- Branch: win32/perl
- + hints/openbsd.sh
- ! MANIFEST Porting/patchls perl.c perlsdio.h pod/perlfunc.pod
- ! t/op/pos.t utils/perldoc.PL
+[ 4227] By: gsar on 1999/09/25 06:44:47
+ Log: From: Larry Wall <larry@wall.org>
+ Date: Fri, 24 Sep 1999 21:59:37 PDT
+ Message-Id: <199909250459.VAA27506@kiev.wall.org>
+ Subject: Re: [PATCH 5.005_61] "our" declarations
+ Branch: perl
+ ! gv.c gv.h intrpvar.h keywords.h keywords.pl op.c
+ ! pod/perldiag.pod pod/perlembed.pod pod/perlfaq3.pod
+ ! pod/perlfaq7.pod pod/perlfunc.pod pod/perlmod.pod
+ ! pod/perlmodlib.pod pod/perlsub.pod pod/perltoot.pod
+ ! pod/perlxstut.pod sv.h t/pragma/strict-vars toke.c
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 933] By: gsar on 1998/05/14 06:07:31
- Log: merge change#754 from maintbranch
- Branch: win32/perl
- ! perl.c
+[ 4226] By: jhi on 1999/09/24 23:10:52
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> XSUB.h ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
+ !> ext/POSIX/hints/linux.pl pod/perldiag.pod pod/perlfunc.pod
+ !> pp.c t/lib/posix.t t/op/pack.t toke.c utils/perlcc.PL
____________________________________________________________________________
-[ 932] By: gsar on 1998/05/14 06:03:50
- Log: merge changes#752,753 from maintbranch
- Branch: win32/perl
- + t/op/pos.t
- ! README ext/GDBM_File/GDBM_File.pm
- ! ext/SDBM_File/sdbm/Makefile.PL pod/perlsyn.pod
-____________________________________________________________________________
-[ 931] By: gsar on 1998/05/14 05:51:19
- Log: merge change#745 from maintbranch
- Branch: win32/perl
- + ext/DynaLoader/DynaLoader.pm.PL
- - ext/DynaLoader/DynaLoader.pm
- ! MANIFEST ext/DynaLoader/Makefile.PL
-____________________________________________________________________________
-[ 930] By: nick on 1998/05/13 20:39:59
- Log: resolve -at //depot/win32 into ansiperl for C++ testing.
- Branch: ansiperl
- ! utils/perldoc.PL
- !> MANIFEST ext/Fcntl/Fcntl.pm hv.c lib/ExtUtils/Liblist.pm op.c
- !> perl.c pod/perlfunc.pod pod/perlguts.pod pp.c pp_ctl.c
- !> regcomp.c regcomp.h regexec.c t/op/hashwarn.t t/op/runlevel.t
- !> win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- !> win32/makedef.pl win32/makefile.mk
+[ 4225] By: gsar on 1999/09/24 18:19:54
+ Log: avoid infinite recursive exec()s of perl.exe when shebang
+ contains "Perl" rather than "perl" on DOSISH platforms
+ Branch: perl
+ ! toke.c
____________________________________________________________________________
-[ 929] By: gsar on 1998/05/13 10:13:36
- Log: merge change#687 from maintbranch
- Branch: win32/perl
- ! pod/perlfunc.pod
+[ 4224] By: gsar on 1999/09/24 16:09:23
+ Log: support cygwin and other platforms that link to import libraries
+ rather than directly with shared libraries (from a suggestion
+ by Lucian Cionca <Lucian.Cionca@algoritma.ro>)
+ Branch: perl
+ ! utils/perlcc.PL
____________________________________________________________________________
-[ 928] By: gsar on 1998/05/13 10:08:13
- Log: merge change#683 from maintbranch
- Branch: win32/perl
- ! pod/perlguts.pod
+[ 4223] By: gsar on 1999/09/24 05:05:06
+ Log: normalize time for strftime() (without the isdst effects of
+ mktime()) using a custom mini_mktime()
+ From: spider-perl@Orb.Nashua.NH.US
+ Date: Thu, 23 Sep 1999 17:54:53 -0400
+ Message-Id: <199909232154.RAA25151@leggy.zk3.dec.com>
+ Subject: Re: [ID 19990913.003] Possible bug using POSIX::strftime Digital UNIX Perl 5.005_03
+ Branch: perl
+ ! ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
+ ! ext/POSIX/hints/linux.pl t/lib/posix.t
____________________________________________________________________________
-[ 927] By: gsar on 1998/05/13 09:51:43
- Log: merge change#681 from maintbranch
- Branch: win32/perl
- ! ext/Fcntl/Fcntl.pm
+[ 4222] By: gsar on 1999/09/23 06:44:42
+ Log: change "#" to a comment starter in pack templates; "/" now
+ used for specifying counted types
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 22 Sep 1999 19:41:30 -0400
+ Message-ID: <19990922194130.A864@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_61] Enable comments in pack()/unpack() templates
+ Branch: perl
+ ! pod/perldiag.pod pod/perlfunc.pod pp.c t/op/pack.t
____________________________________________________________________________
-[ 926] By: gsar on 1998/05/13 09:47:11
- Log: merge change#664 from maint branch
- Branch: win32/perl
- ! regcomp.c regcomp.h regexec.c
+[ 4221] By: gsar on 1999/09/23 06:26:54
+ Log: From: Vishal Bhatia <vishal@gol.com>
+ Date: Thu, 23 Sep 1999 12:45:19 +0900 (JST)
+ Message-ID: <Pine.LNX.4.10.9909231218360.3428-100000@localhost.localdomain>
+ Subject: [patch _61] perlcc changes
+ Branch: perl
+ ! utils/perlcc.PL
____________________________________________________________________________
-[ 925] By: gsar on 1998/05/13 08:55:28
- Log: merge missing part of change#663 from maint branch
- Branch: win32/perl
- ! op.c
+[ 4220] By: gsar on 1999/09/23 01:12:24
+ Log: add include guard
+ Branch: perl
+ ! XSUB.h
____________________________________________________________________________
-[ 924] By: gsar on 1998/05/12 18:50:04
- Log: remove x586 code gen switch (-5) for Borland, it is non-generic,
- and seems to generate problematic code for PII.
- Branch: win32/perl
- ! win32/makefile.mk
+[ 4219] By: jhi on 1999/09/22 20:38:15
+ Log: Cleanup cleanup.
+ Branch: cfgperl
+ ! Makefile.SH t/lib/syslfs.t t/op/lfs.t
____________________________________________________________________________
-[ 923] By: gsar on 1998/05/12 16:24:02
- Log: fix test failure
- Message-Id: <199805120940.KAA01252@pluto.tiuk.ti.com>
- Date: Tue, 12 May 1998 10:40:57 BST
- From: Nick.Ing-Simmons@tiuk.ti.com
- Subject: test buglet
- Branch: win32/perl
- ! t/op/hashwarn.t
-____________________________________________________________________________
-[ 922] By: TimBunce on 1998/05/11 20:58:58
- Log: Assorted patches:
-
- ------ CORE LANGUAGE ------
-
- Title: "incorrect return value for hv_iterinit"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805031848.OAA20618@aatma.engin.umich.edu>
- Files: pod/perlguts.pod hv.c
-
- ------ DOCUMENTATION ------
-
- Title: "perlvar.pod buglet E<EVMSERR>"
- From: Achim Bohnet <ach@mpe.mpg.de>
- Msg-ID: <9805041415.AA22185@o09.xray.mpe.mpg.de>
- Files: pod/perlvar.pod
-
- Title: "Improve docs for warning about code after an exec()"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Chaim Frenkel
- <chaimf@concentric.net>
- Msg-ID: <E0yYUit-0003yb-00@taurus.cus.cam.ac.uk>,
- <m3ra22qn1z.fsf@chany-p100.emwp.com>
- Files: pod/perlfunc.pod
-
- Title: "Remove dead code from pod2man"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0yXmuT-0006Ll-00@ursa.cus.cam.ac.uk>
- Files: pod/pod2man.PL
-
- Title: "tweak doc for C<do FILENAME>"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199805090017.UAA06888@aatma.engin.umich.edu>
- Files: pod/perlfunc.pod
-
- Title: "Document integer pragma effect on % operator"
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <m3yawjmzhx.fsf@furu.g.aas.no>
- Files: pod/perlop.pod
-
- Title: "Reduce rm command line length in pod/Makefile"
- From: Hugo van der Sanden <h.sanden@elsevier.nl>
- Msg-ID: <199805041423.QAA13199@dorlas.elsevier.nl>
- Files: pod/Makefile
-
- ------ EXTENSIONS ------
-
- Title: "Clarify Termios usage in POSIX.pod"
- From: Rocco Caputo <troc@netrus.net>
- Msg-ID: <199805101952.PAA12738@ns.netrus.net>
- Files: ext/POSIX/POSIX.pod
-
- ------ LIBRARY ------
-
- Title: "Fix File::Find::finddepth typo in trial 2 release"
- From: koenig@kulturbox.de (Andreas J. Koenig)
- Msg-ID: <sfcbttflsjz.fsf@dubravka.in-berlin.de>
- Files: lib/File/Find.pm t/lib/filefind.t
-
- ------ PORTABILITY - GENERAL ------
-
- Title: "Add Porting/patching.pod document"
- From: Daniel Grisinger <dgris@tdrenterprises.com>
- Msg-ID: <199805030305.XAA16147@relay.pair.com>
- Files: MANIFEST Porting/patching.pod
+[ 4218] By: jhi on 1999/09/22 19:26:58
+ Log: Tweak the equivalence tables once again.
+ Branch: cfgperl
+ ! lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ ! lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 4215] By: jhi on 1999/09/22 06:47:03
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_61] regfree could segfault with -Mre=debug
+ Date: Tue, 21 Sep 1999 19:50:00 -0400
+ Message-ID: <19990921195000.A23938@monk.mps.ohio-state.edu>
- Title: "hints/machten.sh: disable semctl(), align with devel version"
- From: Dominic Dunlop <domo@vo.lu>
- Msg-ID: <v03110701b175fc029eb1@[195.95.102.115]>
- Files: hints/machten.sh
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_61] More verbose -Mre=debug
+ Date: Tue, 21 Sep 1999 22:29:55 -0400
+ Message-ID: <19990921222955.A25094@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! regcomp.c regexec.c
+____________________________________________________________________________
+[ 4214] By: jhi on 1999/09/21 21:08:43
+ Log: From: 0000-Admin (0000) <root@devsys0.zenez.com>
+ Reply-To: gerberb@zenez.com
+ To: perl5-porters@perl.org
+ Subject: [ID 19990921.004] Changes for SCO OpenServer and UnixWare 7
+ Date: Tue, 21 Sep 1999 11:07:46 -0600 (MDT)
+ Message-Id: <199909211707.LAA23611@devsys0.zenez.com>
- Title: "Add VMS specifics to Porting/makerel"
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- Msg-ID: <01IWDK1LONRQ0026P0@cor.newman.upenn.edu>,
- <199804271732.SAA13762@toad.ig.co.uk>,
- <9804250212.AA27695@forte.com>
- Files: Porting/makerel
- Branch: maint-5.004/perl
- + Porting/patching.pod
- ! MANIFEST Porting/makerel ext/POSIX/POSIX.pod hints/machten.sh
- ! hv.c lib/File/Find.pm pod/Makefile pod/perlfunc.pod
- ! pod/perlguts.pod pod/perlop.pod pod/perlvar.pod pod/pod2man.PL
- ! t/lib/filefind.t
-____________________________________________________________________________
-[ 921] By: gsar on 1998/05/10 02:28:03
- Log: various tweaks to makefiles
- Branch: win32/perl
- ! win32/Makefile win32/makedef.pl win32/makefile.mk
-____________________________________________________________________________
-[ 920] By: gsar on 1998/05/10 02:27:19
- Log: fix ExtUtils::Liblist mishandling paths with spaces
- Branch: win32/perl
- ! lib/ExtUtils/Liblist.pm
-____________________________________________________________________________
-[ 919] By: gsar on 1998/05/09 17:10:15
- Log: minor cleanup
- Branch: win32/perl
- ! MANIFEST perl.c
-____________________________________________________________________________
-[ 918] By: gsar on 1998/05/09 17:09:09
- Log: protect sortcop from C<sort { sort { ... } ... } ...>
- Message-Id: <199805082333.TAA06287@aatma.engin.umich.edu>
- Date: Fri, 08 May 1998 19:33:44 EDT
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: [PATCH] Re: double recursion in sort
- Branch: win32/perl
- ! pp_ctl.c t/op/runlevel.t
-____________________________________________________________________________
-[ 917] By: gsar on 1998/05/09 17:05:55
- Log: c
- Branch: win32/perl
- ! win32/config.bc win32/config.gc win32/config.vc
+ (Snipped away the last lines of svr5.sh a la change #3725)
+ Branch: cfgperl
+ + hints/svr5.sh
+ ! Configure MANIFEST config_h.SH hints/sco.sh
+ Branch: metaconfig
+ ! U/modified/Cppsym.U U/modified/Oldconfig.U
____________________________________________________________________________
-[ 916] By: gsar on 1998/05/07 03:40:15
- Log: fix C<print "foo ${\()}"> (pp_refgen fumbles when G_SCALAR, no args)
- Branch: win32/perl
- ! pp.c
+[ 4213] By: jhi on 1999/09/21 20:48:01
+ Log: From: Kragen Sitaker <kragen@dnaco.net>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990921.013] accidental list context in perlfaq9
+ Date: Tue, 21 Sep 1999 16:27:53 -0400 (EDT)
+ Reply-To: kragen@pobox.com
+ Message-Id: <199909212027.QAA03450@kirk.dnaco.net>
+ Branch: cfgperl
+ ! pod/perlfaq9.pod
____________________________________________________________________________
-[ 915] By: mbeattie on 1998/05/06 13:08:29
- Log: Speed up pp_entersub for usethreads with only 1 thread running.
+[ 4212] By: jhi on 1999/09/20 19:55:42
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> README.Y2K
+ !> Changes MANIFEST
+____________________________________________________________________________
+[ 4211] By: jhi on 1999/09/20 19:44:44
+ Log: Rename -Duselfs to -Duselargefiles. We don't need no stnkngbbrvtns.
+ Branch: cfgperl
+ ! Configure config_h.SH pod/perldelta.pod
+ Branch: metaconfig/U/perl
+ ! use64bits.U uselfs.U uselongdbl.U
+____________________________________________________________________________
+[ 4210] By: jhi on 1999/09/20 19:38:26
+ Log: Configure -A change: -Afoo=bar is equal to -Aappend:foo=" bar".
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Options.U
+____________________________________________________________________________
+[ 4209] By: gsar on 1999/09/20 19:35:39
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! pp_hot.c
+ +> lib/unicode/Unicode.html
+ ! Changes
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH doio.c perl.h pod/perldelta.pod pod/perlfunc.pod
____________________________________________________________________________
-[ 914] By: gsar on 1998/05/03 18:44:38
- Log: make hv_iterinit() return HvKEYS()
- Message-Id: <3.0.1.32.19980502162922.009e6320@www.syncad.com>
- Date: Sat, 02 May 1998 16:29:22 EDT
- From: "SynaptiCAD, Inc." <sales@syncad.com>
- Subject: incorrect return value for hv_iterinit
- Branch: win32/perl
- ! hv.c pod/perlguts.pod
-____________________________________________________________________________
-[ 913] By: TimBunce on 1998/05/01 22:38:38
- Log: Update MANIFEST for trial 2.
- (Porting/Contract lib/Tie/Handle.pm t/op/tiehandle.t)
- Branch: maint-5.004/perl
- ! MANIFEST
+[ 4208] By: gsar on 1999/09/20 18:28:44
+ Log: add README.Y2K (from Dominic Dunlop <domo@vo.lu>)
+ Branch: perl
+ + README.Y2K
+ ! MANIFEST
____________________________________________________________________________
-[ 912] By: TimBunce on 1998/05/01 22:30:29
- Log: Add t/op/tiehandle.t as xtext to repository (see change 911)
- Branch: maint-5.004/perl
- + t/op/tiehandle.t
-____________________________________________________________________________
-[ 911] By: TimBunce on 1998/05/01 21:35:03
- Log:
- Title: "Add ERRSV, ERRHV, DEFSV and SAVE_DEFSV for XS 5.005 compatibility"
- From: timbo@ig.co.uk (Tim Bunce)
- Msg-ID: <199804200854.JAA01482@toad.ig.co.uk>
- Files: perl.h
-
- Title: "Add WRITE & CLOSE to TIEHANDLE"
- From: Graham Barr <gbarr@pobox.com>
- Msg-ID: <34F63DC8.CA95670F@pobox.com>
- Files: pod/perltie.pod lib/Tie/Handle.pm pp_sys.c t/op/tiehandle.t
- Branch: maint-5.004/perl
- + lib/Tie/Handle.pm
- ! perl.h pod/perltie.pod pp_sys.c
-____________________________________________________________________________
-[ 910] By: TimBunce on 1998/05/01 20:47:47
- Log:
- Title: "Add warning for Illegal hex digit"
- From: Stephen P Potter <spp@spp.users.ds.net>, Stephen Potter
- <spp@psasolar.colltech.com>, Tim.Bunce@ig.co.uk (Tim Bunce)
- Msg-ID: <199804232219.SAA02267@spp.users.ds.net>,
- <199804271409.PAA12819@toad.ig.co.uk>,
- <199804280307.WAA12332@psasolar.psa.pencom.com>
- Files: pod/perldiag.pod util.c
-
- Title: "perl_call_method() bug fix (corrupt op pointer)"
- From: "Alterman, Eugene" <Eugene.Alterman@bremer-inc.com>
- Msg-ID: <510415F72ECFD111A31700A0C9B3CCDE3098@efx98digmasa.bremer-inc.com>
- Files: perl.c
-
- Title: "Fix printf segmentation fault"
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Msg-ID: <l03130300b16bebdbc314@[194.222.64.89]>
- Files: pp_hot.c
-
- Title: "Document changed local($a[$i],$b{$j}) behaviour re delete/splice"
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- Msg-ID: <01IVMVIHNZ36001NKH@cor.newman.upenn.edu>
- Files: pod/perlsub.pod
- Branch: maint-5.004/perl
- ! perl.c pod/perldiag.pod pod/perlsub.pod pp_hot.c util.c
+[ 4207] By: jhi on 1999/09/20 11:06:13
+ Log: Document -Duselfs, -Duselongdouble, and -Dusemorebits.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 909] By: TimBunce on 1998/05/01 19:44:47
- Log:
- Title: "Change Ilya's do_binmode to K&R prototype and move to doio.c"
- Files: doio.c util.c
- Branch: maint-5.004/perl
- ! doio.c util.c
-____________________________________________________________________________
-[ 908] By: gsar on 1998/05/01 19:21:02
- Log: add AS patch#20 (exposes more global constants)
- Branch: asperl
- ! ObjXSub.h byterun.h embed.h embedvar.h global.sym globals.c
- ! interp.sym ipsock.h ipstdio.h objpp.h perlio.h perlsock.h
- ! proto.h util.c win32/GenCAPI.pl win32/runperl.c
-____________________________________________________________________________
-[ 907] By: TimBunce on 1998/05/01 17:50:46
- Log:
- Title: "Runtime Carp verbosity without aliasing"
- From: Joshua.Pritikin@NewYork2.dmg.deuba.com, Tim Bunce
- Msg-ID: <H00000e50003936c@MHS>
- Files: lib/Carp.pm
-
- Title: "Fix File::Basename to not untaint results (using new //t flag)"
- From: Eric Hammond <erich@finity.citysearch.com>, Tom Phoenix
- <rootbeer@teleport.com>
- Msg-ID: <199710070515.WAA00682@finity.citysearch.com>,
- <Pine.GSO.3.96.971007074114.14211J-100000@usertest.teleport.com>
- Files: lib/File/Basename.pm
- Branch: maint-5.004/perl
- ! lib/Carp.pm lib/File/Basename.pm
+[ 4206] By: jhi on 1999/09/20 09:53:15
+ Log: Do not test for gccish things in non-gccish platforms.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/compline/ccflags.U
____________________________________________________________________________
-[ 906] By: TimBunce on 1998/04/28 11:04:49
- Log:
- ------ CORE LANGUAGE ------
-
- Title: "5.004_04m5t1: Fix dangling references in LVs", "Fix dangling
- references in LVs"
- From: Spider Boardman <spider@orb.nashua.nh.us>
- Msg-ID: <199804010541.AAA32615@Orb.Nashua.NH.US>,
- <19980422164037.D29222@perl.org>
- Files: embed.h keywords.h opcode.h perl.h proto.h doop.c global.sym mg.c
- pp.c sv.c
-
- Title: "Fix SvGMAGIC typo in change 904"
- Files: doop.c
- Branch: maint-5.004/perl
- ! doop.c embed.h global.sym keywords.h mg.c opcode.h perl.h pp.c
- ! proto.h sv.c
+[ 4205] By: jhi on 1999/09/20 09:41:22
+ Log: Prompt for uselfs.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+ Branch: metaconfig
+ ! U/mksample
+ Branch: metaconfig/U/perl
+ ! use64bits.U uselfs.U
+____________________________________________________________________________
+[ 4204] By: jhi on 1999/09/20 09:09:29
+ Log: Add usemorebits and uselfs.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH doio.c perl.h
+ Branch: metaconfig/U/perl
+ + uselfs.U usemorebits.U
+ ! use64bits.U uselongdbl.U
____________________________________________________________________________
-[ 905] By: TimBunce on 1998/04/28 10:32:20
- Log: Regexp patches
-
- Title: "New regex flag //t to leave $1 etc. tainted"
- From: Chip Salzenberg <chip@pobox.com>, Tim Bunce <Tim.Bunce@ig.co.uk>
- Msg-ID: <19980310192640.37826@cyprus>
- Files: pod/perlop.pod pod/perlre.pod op.h dump.c mg.c pp_hot.c sv.c
- t/op/taint.t toke.c
-
- Title: "Don't accidentally untaint target of s///"
- From: Chip Salzenberg <chip@pobox.com>
- Msg-ID: <19980310151756.24767@cyprus>
- Files: pp_ctl.c pp_hot.c t/op/taint.t
-
- Title: "Allow but ignore embedded /...(?o).../ in regexp"
- From: h.sanden@elsevier.nl (Hugo van der Sanden)
- Msg-ID: <199804201243.OAA08244@dorlas.elsevier.nl>
- Files: regcomp.c
- Branch: maint-5.004/perl
- ! dump.c mg.c op.h pod/perlop.pod pod/perlre.pod pp_ctl.c
- ! pp_hot.c regcomp.c sv.c t/op/taint.t toke.c
+[ 4203] By: jhi on 1999/09/20 07:48:48
+ Log: Dethinko.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 904] By: TimBunce on 1998/04/27 20:20:21
- Log: Assorted patches:
-
- ------ CORE LANGUAGE ------
-
- Title: "Protect join() against double reads on undef and SvGMAGICALs"
- From: Chip Salzenberg <chip@perlsupport.com>, Tim Bunce
- <Tim.Bunce@ig.co.uk>
- Msg-ID: <19980424080630.D13985@perl.org>
- Files: doop.c
-
- Title: "Better error message for require failure"
- From: epeschko@den-mdev1 (Ed Peschko)
- Msg-ID: <199804240047.SAA24155@den-mdev1.co.csgsystems.com>
- Files: pod/perldiag.pod pp_ctl.c
-
- Title: "fixes for various noises under PERL_DESTRUCT_LEVEL"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199804231926.PAA23969@aatma.engin.umich.edu>
- Files: perl.c
-
- Title: "Fix nice_chunk memory leak"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199804052347.TAA15699@aatma.engin.umich.edu>
- Files: sv.c
-
- Title: "-2.0 vs. -2 (was Number representations)"
- From: Chip Salzenberg <chip@pobox.com>
- Msg-ID: <19980309185652.11231@cyprus>
- Files: op.c
-
- Title: "perl.c fixes for -DUNEXEC"
- From: Matt Wette <mwette@mr-ed.jpl.nasa.gov>, Matthew R Wette
- <mwette@mr-ed.jpl.nasa.gov>
- Msg-ID: <199710152146.OAA07283@mr-ed.jpl.nasa.gov>
- Files: perl.c
-
- ------ DOCUMENTATION ------
-
- Title: "perlcall is Perl from C, not C from Perl"
- From: Steve A Fink <sfink@cs.berkeley.edu>
- Files: pod/perlembed.pod
-
- Title: "Clarify require "Foo::Bar" non-bareword issue"
- From: Dominique Dumont <domi@ss7serv.grenoble.hp.com>
- Msg-ID: <199804231527.AA153445256@ss7serv.grenoble.hp.com>
- Files: pod/perlfunc.pod
-
- Title: "(repost) new text for perlsec", "new text for perlsec"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980423161605.5518N-100000@user2.teleport.com>
- Files: pod/perlsec.pod
-
- ------ EXTENSIONS ------
-
- Title: "IO::Socket->socketpair broken (typo)"
- From: Olaf Titz <olaf@bigred.inka.de>
- Msg-ID: <19980425224535.2807.qmail@bigred.inka.de>
- Files: ext/IO/lib/IO/Socket.pm
-
- Title: "NDBM_File man page needs Fcntl"
- From: "Danny R. Faught" <faught@mailhost.rsn.hp.com>
- Msg-ID: <199707011500.IAA00601@palrel3.hp.com>
- Files: ext/NDBM_File/NDBM_File.pm
-
- ------ LIBRARY ------
-
- Title: "Documentation discrepancy: pragmatic modules"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, h.sanden@elsevier.nl (Hugo van der Sanden)
- Msg-ID: <199804221525.RAA12695@dorlas.elsevier.nl>,
- <E0ySPhk-00034f-00@taurus.cus.cam.ac.uk>
- Files: lib/strict.pm lib/subs.pm lib/vars.pm
-
- ------ PORTABILITY - GENERAL ------
-
- Title: "Updated hints file for svr4"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980423110522.26621A-100000@newton.phys>
- Files: hints/svr4.sh
-
- Title: "Pumpkin update -- shared libperl.so location"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980424115837.6222A-100000@newton.phys>
- Files: Porting/pumpkin.pod
-
- Title: "perl compile fix for AIX 4.3"
- From: Jens-Uwe Mager <jum@helios.de>
- Msg-ID: <199804261611.SAA34728@ans.helios.de>
- Files: ext/DynaLoader/dl_aix.xs
-
- Title: "Dynaloader build on VMS",
- From: pvhp@forte.com (Peter Prymmer), timbo@ig.co.uk (Tim Bunce)
- Msg-ID: <199804271732.SAA13762@toad.ig.co.uk>, <9804250212.AA27695@forte.com>
- Files: vms/descrip.mms
-
- ------ UTILITIES ------
-
- Title: "Major update to h2ph.PL"
- From: Billy <wdconsta@cs.adelaide.edu.au>
- Msg-ID: <Pine.SV4.3.93.980424031837.20782A-200000@ermintrude.teaching.cs.adelaide.edu.au>
- Files: utils/h2ph.PL
- Branch: maint-5.004/perl
- ! Porting/pumpkin.pod doop.c ext/DynaLoader/dl_aix.xs
- ! ext/IO/lib/IO/Socket.pm ext/NDBM_File/NDBM_File.pm
- ! hints/svr4.sh lib/strict.pm lib/subs.pm lib/vars.pm op.c
- ! perl.c pod/perldiag.pod pod/perlembed.pod pod/perlfunc.pod
- ! pod/perlsec.pod pp_ctl.c sv.c utils/h2ph.PL vms/descrip.mms
-____________________________________________________________________________
-[ 903] By: gsar on 1998/04/25 22:27:19
- Log: add AS patch#19 (adds socket layer generation to GenCAPI.pl)
- Branch: asperl
- ! win32/GenCAPI.pl
+[ 4202] By: jhi on 1999/09/20 07:33:32
+ Log: Fix a bug in the description of endianness. Reported in
+ From: "Konovalov, Vadim" <vkonovalov@lucent.com>
+ To: perl5-porters@perl.org
+ Subject: BUG: perldoc -f pack
+ Date: Mon, 20 Sep 1999 09:43:49 +0400
+ Message-ID: <402099F49BEED211999700805FC7359F20D3F5@ru0028exch01.spb.lucent.com>
+ Branch: cfgperl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 902] By: nick on 1998/04/25 16:35:08
- Log: Case sensitive tweak to perldoc.PL
- Branch: ansiperl
- ! utils/perldoc.PL
+[ 4201] By: jhi on 1999/09/20 07:01:26
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/op/args.t
+ !> (integrate 31 files)
+____________________________________________________________________________
+[ 4200] By: gsar on 1999/09/20 03:45:06
+ Log: From: Russ Allbery <rra@stanford.edu>
+ Date: 19 Aug 1999 04:35:44 -0700
+ Message-Id: <yl7lms9f5b.fsf@windlord.stanford.edu>
+ Subject: [ID 19990819.002] File::Find error when pruning top-level directories
+ Branch: perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 4199] By: gsar on 1999/09/20 03:27:49
+ Log: suppress warning (from John Tobey <jtobey@epsilondev.com>)
+ Branch: perl
+ ! ext/B/B/Terse.pm
+____________________________________________________________________________
+[ 4198] By: gsar on 1999/09/20 03:25:25
+ Log: add arenas for managing allocations of remaining xpv*v structures
+ From: Vishal Bhatia <vishal@gol.com>
+ Date: Wed, 25 Aug 1999 00:31:33 +0900 (JST)
+ Message-ID: <Pine.LNX.4.10.9908250031000.11727-100000@localhost.localdomain>
+ Subject: [PATCH 5.005_60] removing extra ref count (compiler)
+ Branch: perl
+ ! embed.h embed.pl embedvar.h ext/B/B/C.pm intrpvar.h objXSUB.h
+ ! proto.h sv.c
+____________________________________________________________________________
+[ 4197] By: gsar on 1999/09/20 03:06:10
+ Log: queue errors due to strictures rather than printing them as
+ warnings; symbols that violate strictures do *not* end up in
+ the symbol table anyway, making multiple evals of the same piece
+ of code produce the same errors; errors indicate all locations
+ of a global symbol rather than just the first one; these
+ changes make compile-time failures within evals reliably
+ visible via the return value or contents of $@, and trappable
+ using __DIE__ hooks
+ Branch: perl
+ ! embed.h embed.pl embedvar.h ext/DynaLoader/dlutils.c
+ ! ext/Thread/Thread.xs global.sym gv.c objXSUB.h op.c perl.c
+ ! perlapi.c pp_ctl.c proto.h regcomp.c t/pragma/strict-refs
+ ! t/pragma/strict-vars thrdvar.h toke.c util.c
+____________________________________________________________________________
+[ 4196] By: gsar on 1999/09/19 22:14:29
+ Log: control change#1914 via hints (causes problems on some platforms)
+ Branch: perl
+ ! ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
+ ! ext/POSIX/hints/linux.pl
____________________________________________________________________________
-[ 901] By: nick on 1998/04/25 15:16:54
- Log: Implement use attrs qw(locked package);
- Passes all tests except posix (hangs/dies) in sigaction test after
- printing "ok 9".
- Branch: ansiperl
- ! cv.h ext/attrs/attrs.pm ext/attrs/attrs.xs pp_hot.c
+[ 4195] By: gsar on 1999/09/19 21:30:18
+ Log: avoid clearing @_ at all for faster subroutine calls; fix bugs
+ in passing around references to @_, eg C<sub foo { \@_ }>; add
+ tests for the same
+ Branch: perl
+ + t/op/args.t
+ ! MANIFEST cop.h pp.c pp_ctl.c pp_hot.c
____________________________________________________________________________
-[ 900] By: nick on 1998/04/25 13:58:17
- Log: Auto-insert defined() test in while when test expression is
- readline (i.e. <>), glob, readdir, or each.
- Branch: ansiperl
- + t/op/defins.t
- ! op.c pod/perlop.pod
+[ 4194] By: jhi on 1999/09/18 18:57:45
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> opcode.h opcode.pl
+____________________________________________________________________________
+[ 4193] By: nick on 1999/09/18 15:24:56
+ Log: Re-integrate mainline
+ Basic SvUTF8 stuff in headers, no functional changes yet.
+ Branch: utfperl
+ + lib/byte.pm lib/byte_heavy.pl
+ +> ext/B/defsubs_h.PL ext/DB_File/version.c jpl/JNI/Closer.java
+ +> jpl/JNI/JNIConfig jpl/JNI/JNIConfig.Win32
+ +> jpl/JNI/JNIConfig.kaffe jpl/JNI/JNIConfig.noembed
+ +> jpl/JNI/JNIConfig.standard jpl/JNI/typemap.gcc
+ +> jpl/JNI/typemap.win32 jpl/SETVARS.PL lib/unicode/ArabShap.txt
+ +> lib/unicode/Blocks.txt lib/unicode/CompExcl.txt
+ +> lib/unicode/EAWidth.txt lib/unicode/Index.txt
+ +> lib/unicode/Jamo-2.txt lib/unicode/LineBrk.txt
+ +> lib/unicode/Names.txt lib/unicode/Props.txt
+ +> lib/unicode/ReadMe.txt lib/unicode/SpecCase.txt
+ +> t/lib/bigfltpm.t
+ - ext/B/defsubs.h.PL lib/unicode/arabshp.txt
+ - lib/unicode/blocks.txt lib/unicode/index2.txt
+ - lib/unicode/jamo2.txt lib/unicode/names2.txt
+ - lib/unicode/props2.txt lib/unicode/readme.txt
+ - t/lib/bigfloatpm.t
+ ! doop.c embed.h embed.pl gv.c mg.c objXSUB.h op.c op.h perl.h
+ ! perlapi.c pp.c pp_ctl.c pp_hot.c proto.h regcomp.c regcomp.h
+ ! regexec.c regexp.h regnodes.h sv.c sv.h toke.c utf8.c utf8.h
+ ! warnings.h
+ !> (integrate 142 files)
+____________________________________________________________________________
+[ 4192] By: gsar on 1999/09/18 15:11:47
+ Log: more op description tweaks
+ Branch: perl
+ ! opcode.h opcode.pl
+____________________________________________________________________________
+[ 4191] By: jhi on 1999/09/18 07:47:16
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes opcode.h opcode.pl t/io/open.t t/op/misc.t
+ !> t/pragma/warn/op
____________________________________________________________________________
-[ 899] By: nick on 1998/04/25 13:14:52
- Log: Resolve ansiperl against win32 branch
- Branch: ansiperl
- +> (branch 53 files)
- - config_H
- !> (integrate 227 files)
+[ 4190] By: jhi on 1999/09/18 07:35:45
+ Log: Add description of the Unicode database files.
+ Branch: cfgperl
+ + lib/unicode/Unicode.html
____________________________________________________________________________
-[ 898] By: gsar on 1998/04/24 17:01:05
- Log: add AS patch#18
- Branch: asperl
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/xsubpp win32/GenCAPI.pl
+[ 4189] By: gsar on 1999/09/18 03:14:58
+ Log: tweak some op names in change#4177 (will any of this break code that
+ gropes $@ ?)
+ Branch: perl
+ ! Changes opcode.h opcode.pl t/io/open.t t/op/misc.t
+ ! t/pragma/warn/op
____________________________________________________________________________
-[ 897] By: TimBunce on 1998/04/23 19:49:22
- Log: Assorted patches:
-
- ------ CORE LANGUAGE ------
-
- Title: "fix for "Unbalanced string table refcount""
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199804042251.RAA25527@aatma.engin.umich.edu>
- Files: sv.c
-
- Title: "Allow more lenient switch processing"
- From: "John L. Allen" <allen@grumman.com>
- Msg-ID: <199803251638.LAA22664@gateway.grumman.com>
- Files: perl.c
-
- Title: "Add fourth arg to substr: substr EXPR,OFFSET,LEN,REPLACEMENT"
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <m3g1jglqtm.fsf@furu.g.aas.no>
- Files: pod/perlfunc.pod Todo opcode.pl pp.c t/op/substr.t
-
- Title: "Odd number of elements in hash list."
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980328151929.29336D-100000@user2.teleport.com>
- Files: MANIFEST pod/perldiag.pod pp.c pp_hot.c t/op/hashwarn.t
-
- Title: "another destruct_level fix"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199804030105.UAA04400@aatma.engin.umich.edu>
- Files: hv.c
-
- Title: "bidirectional pipe warning blues"
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- Msg-ID: <9804082151.AA20399@claudius.bfsec.bt.co.uk>
- Files: doio.c
-
- Title: "stale pointers after realloc (MEXTEND in pp_print and pp_prtf)"
- From: Malcolm Beattie <mbeattie@sable.ox.ac.uk>
- Msg-ID: <199801191107.LAA17979@sable.ox.ac.uk>
- Files: pp_hot.c pp_sys.c
-
- Title: "unimplemented umask() should return undef not die"
- From: kstar@chapin.edu (Kurt D. Starsinic)
- Msg-ID: <199803120515.VAA08660@chapin.edu>
- Files: pod/perlfunc.pod pp_sys.c
-
- Title: "warning for: bless $foo, """
- From: Joshua.Pritikin@NewYork2.dmg.deuba.com
- Msg-ID: <H00000e5000378a0@MHS>
- Files: pod/perldiag.pod pp.c
-
- ------ DOCUMENTATION ------
-
- Title: "Mention SWIG in perlxs.pod"
- From: Steve A Fink <sfink@cs.berkeley.edu>
- Msg-ID: <Pine.HPP.3.96.980408154956.20990K-100000@brooksie.CS.Berkeley.EDU>
- Files: pod/perlxs.pod
-
- Title: "fix-up of previous perlre.pod patch"
- From: Ted Ashton <ashted@southern.edu>
- Msg-ID: <199803031540.KAA09388@ns.southern.edu>
- Files: pod/perlre.pod
-
- Title: "long list of man page nitpicks"
- From: Greg Bacon <gbacon@mickey.cs.uah.edu>, Tom Christiansen
- <tchrist@jhereg.perl.com>
- Msg-ID: <199804221844.NAA08338@pluto.cs.uah.edu>,
- <199804222204.QAA20805@jhereg.perl.com>
- Files: pod/perlapio.pod pod/perlcall.pod pod/perldebug.pod pod/perldelta.pod
- pod/perldiag.pod pod/perlembed.pod pod/perlfaq2.pod
- pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
- pod/perlfaq7.pod pod/perlfaq8.pod pod/perlform.pod
- pod/perlfunc.pod pod/perlguts.pod pod/perlipc.pod
- pod/perllocale.pod pod/perlmodlib.pod pod/perlop.pod
- pod/perlre.pod pod/perlref.pod pod/perlrun.pod
- pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
- pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod
- pod/pod2man.PL
-
- Title: "document that system() does not set $! when it fails"
- From: "Mark R. Levinson" <mrl@isc.upenn.edu>
- Msg-ID: <199803011946.OAA31942@anaximander.dccs.upenn.edu>
- Files: pod/perlfunc.pod
-
- Title: "Fix pod/roffitall execute permission"
- From: lvirden@cas.org
- Msg-ID: <1997Nov17.132031.2589892@cor.newman>
- Files: pod/roffitall
-
- Title: "document when split ignores trailing empty fields"
- From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
- Msg-ID: <l03130300b14fac832b77@[194.222.64.89]>
- Files: pod/perlfunc.pod
-
- ------ EXTENSIONS ------
-
- Title: "Buglet in Opcode.pm documentation"
- From: Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
- Msg-ID: <199804170349.XAA32445@sleipnir.valparaiso.cl>
- Files: ext/Opcode/Opcode.pm
-
- Title: "Failure to append to perllocal.pod should not be fatal"
- From: koenig@kulturbox.de (Andreas J. Koenig)
- Msg-ID: <sfciuogy67x.fsf@dubravka.in-berlin.de>
- Files: lib/ExtUtils/MM_Unix.pm
-
- Title: "Document that IO.pm does not load IO::Select etc"
- From: Graham Barr <gbarr@ti.com>
- Msg-ID: <353B48F1.64E35A63@ti.com>
- Files: ext/IO/IO.pm
-
- Title: "Install extensions with bootstrap (again) in $archlib"
- From: Achim Bohnet <ach@mpe.mpg.de>, koenig@kulturbox.de (Andreas J.
- Koenig)
- Msg-ID: <9804061909.AA12675@o09.xray.mpe.mpg.de>,
- <sfc90oxc0uj.fsf@dubravka.in-berlin.de>
- Files: lib/ExtUtils/Install.pm
-
- Title: "glibc2.0.6 missing MSG_* <sys/socket.h> defines."
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980406113950.3166L-100000@newton.phys>
- Files: ext/Socket/Socket.xs
-
- ------ LIBRARY ------
-
- Title: "Benchmark.pm: add run-for-some-time mode"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199804080647.JAA15136@alpha.hut.fi>
- Files: lib/Benchmark.pm
-
- Title: "Comments added to Carp.pm"
- From: Andy Wardley <abw@cre.canon.co.uk>, Chip Salzenberg
- <chip@perlsupport.com>, Tom Christiansen
- <tchrist@jhereg.perl.com>
- Msg-ID: <19980422164242.E29222@perl.org>,
- <199804222033.OAA17959@jhereg.perl.com>,
- <980409182357.ZM21638@bandanna>
- Files: lib/Carp.pm
-
- Title: "chat2.pl fix"
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- Msg-ID: <01IVMVF507PO001NKH@cor.newman.upenn.edu>
- Files: lib/chat2.pl
-
- Title: "lib/Pod/Html.pm"
- From: d-lewart@uiuc.edu (Daniel S. Lewart)
- Msg-ID: <199710170718.DAA25472@staff1.cso.uiuc.edu>,
- <199710180417.AAA19778@staff2.cso.uiuc.edu>
- Files: lib/Pod/Html.pm
-
- Title: "ormaments method in Term/ReadLine.pm causes warning with string
- arg."
- From: hiroo.hayashi@computer.org
- Msg-ID: <199804061519.AAA21907@mail.fb3.so-net.ne.jp>
- Files: lib/Term/ReadLine.pm
-
- ------ OTHER CHANGES ------
-
- Title: "ptags broken"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199804120208.WAA29264@monk.mps.ohio-state.edu>
- Files: emacs/ptags
-
- ------ PORTABILITY - WIN32 ------
-
- Title: "win32 tweaks (signals and crypt support)"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199804170505.BAA06413@aatma.engin.umich.edu>
- Files: perl.h win32/config.bc win32/config.vc win32/config_H.bc
- win32/config_H.vc win32/win32.c
-
- ------ PORTABILITY - GENERAL ------
-
- Title: "Add Social Contract (2nd Draft) as Porting/Contract"
- From: Russ Allbery <rra@stanford.edu>
- Msg-ID: <m3btw66n8i.fsf@windlord.Stanford.EDU>
- Files: Porting/Contract
-
- Title: "Config: Irix 5 hints"
- From: kstar@O2.chapin.edu
- Msg-ID: <199804061712.NAA22823@O2.chapin.edu>
- Files: hints/irix_5.sh
-
- Title: "VMS patches to 5.004_03"
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- Msg-ID: <01IVYJS0L8D200209B@cor.newman.upenn.edu>
- Files: vms/vms.c
-
- Title: "hints/netbsd.sh - enable vfork"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980417110749.19327B-100000@newton.phys>
- Files: hints/netbsd.sh
-
- ------ UTILITIES ------
-
- Title: "support find2perl -follow"
- From: Billy <wdconsta@cs.adelaide.edu.au>
- Msg-ID: <Pine.SV4.3.93.980408005903.24081A-100000@ermintrude.teaching.cs.adelaide.edu.au>
- Files: x2p/find2perl.PL
- Branch: maint-5.004/perl
- + Porting/Contract t/op/hashwarn.t
- ! MANIFEST Todo doio.c emacs/ptags embed.h ext/IO/IO.pm
- ! ext/Opcode/Opcode.pm ext/Socket/Socket.xs hints/irix_5.sh
- ! hints/netbsd.sh hv.c lib/Benchmark.pm lib/Carp.pm
- ! lib/ExtUtils/Install.pm lib/ExtUtils/MM_Unix.pm
- ! lib/Pod/Html.pm lib/Term/ReadLine.pm lib/chat2.pl opcode.h
- ! opcode.pl perl.c perl.h pod/perlapio.pod pod/perlcall.pod
- ! pod/perldebug.pod pod/perldelta.pod pod/perldiag.pod
- ! pod/perlembed.pod pod/perlfaq2.pod pod/perlfaq3.pod
- ! pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfaq7.pod
- ! pod/perlfaq8.pod pod/perlform.pod pod/perlfunc.pod
- ! pod/perlguts.pod pod/perlhist.pod pod/perlipc.pod
- ! pod/perllocale.pod pod/perlmodlib.pod pod/perlop.pod
- ! pod/perlre.pod pod/perlref.pod pod/perlrun.pod
- ! pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
- ! pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod pod/pod2man.PL
- ! pod/roffitall pp.c pp_hot.c pp_sys.c sv.c t/TEST t/op/gv.t
- ! t/op/substr.t vms/vms.c win32/config.bc win32/config.vc
- ! win32/config_H.bc win32/config_H.vc win32/win32.c
- ! x2p/find2perl.PL
+[ 4188] By: jhi on 1999/09/17 21:30:08
+ Log: Pick up the typo fix.
+ Branch: cfgperl
+ !> t/io/open.t
____________________________________________________________________________
-[ 896] By: TimBunce on 1998/04/22 11:49:24
- Log: Assorted patches:
-
- ------ CORE LANGUAGE ------
-
- Title: "Additional regex-cache patch"
- From: Chip Salzenberg <chip@atlantic.net>
- Msg-ID: <19980305104831.38100@cyprus>
- Files: pp_ctl.c
-
- Title: "Conservative C<*x = undef> patch"
- From: Chip Salzenberg <chip@atlantic.net>
- Msg-ID: <19980310163310.48509@cyprus>
- Files: pod/perldiag.pod pod/perlfunc.pod pp.c sv.c t/op/gv.t
-
- Title: "Consider @ARGV to be plain files if inplace (-i)"
- From: Chip Salzenberg <salzench@nielsenmedia.com>
- Msg-ID: <199802042106.QAA04082@nielsenmedia.com>
- Files: doio.c
-
- Title: "Fix semctl for Linux, Sun and SVR4"
- From: Graham Barr <gbarr@ti.com>, lvirden@cas.org (Larry W. Virden, x2487)
- Msg-ID: <3484247D.BB036D39@ti.com>, <9712021313.AA11495@cas.org>
- Files: doio.c
-
- Title: "C<dSP> entails using C<SP>, not C<sp>"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199803070149.UAA12217@aatma.engin.umich.edu>
- Files: pod/perlcall.pod pod/perlembed.pod pod/perlguts.pod pod/perlxs.pod
- doio.c doop.c ext/DB_File/DB_File.xs
- ext/DynaLoader/dl_dld.xs ext/Opcode/Opcode.xs
- ext/POSIX/POSIX.xs ext/Socket/Socket.xs gv.c
- lib/ExtUtils/typemap mg.c os2/OS2/REXX/REXX.xs
- win32/win32.c
-
- Title: "Make autouse -w-safe"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199803030236.VAA13244@monk.mps.ohio-state.edu>
- Files: lib/autouse.pm op.c sv.c
-
- Title: "Misleading error on close of unopened handle"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0y4R07-0003PH-00@ursa.cus.cam.ac.uk>
- Files: doio.c
-
- Title: "Confusing error from perl -e "x'""
- From: Hans Mulder <hansmu@xs4all.nl>
- Msg-ID: <1998Mar25.174320.2866352@cor.newman.upenn.edu>
- Files: toke.c
-
- Title: "Add HAS_GNULIBC define"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980305115202.9180K-100000@newton.phys>
- Files: config_H config_h.SH
-
- Title: "h_errno might not be an int"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980325165059.22255D-100000@newton.phys>
- Files: pp_sys.c
-
- Title: "Revised taint hole closer", "Revised taint hole closer"
- From: Chip Salzenberg <chip@atlantic.net>, Ilya Zakharevich
- <ilya@math.ohio-state.edu>
- Msg-ID: <19980310222127.09350@cyprus>,
- <199803110554.AAA29157@monk.mps.ohio-state.edu>
- Files: doio.c
-
- Title: "SEGV compiling localised lexical in perl5.004_05t1"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>, h.sanden@elsevier.nl (Hugo
- van der Sanden)
- Msg-ID: <199803171530.QAA24053@dorlas.elsevier.nl>,
- <199803171727.MAA05234@aatma.engin.umich.edu>
- Files: op.c t/op/misc.t
-
- Title: "Stale SP in pp_substr"
- From: Stephen McCamant <alias@mcs.com>
- Msg-ID: <m0yFsTS-000EZpC@alias-2.pr.mcs.net>
- Files: pp.c
-
- Title: "Statement unlikely to be reached warning"
- From: Hans Mulder <hansm@icgned.nl>
- Msg-ID: <1997Dec24.171511.2683516@cor.newman>
- Files: op.c
-
- Title: "Tainting propagates from nowhere"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199803140411.XAA09343@aatma.engin.umich.edu>
- Files: pp.c
-
- Title: "two trivial tweaks to 5.004m5t1"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199803060553.AAA28461@aatma.engin.umich.edu>
- Files: proto.h win32/Makefile
-
- Title: "unpacking negatives on Alpha"
- From: Achim Bohnet <ach@mpe.mpg.de>
- Msg-ID: <9710201503.AA24797@o09.xray.mpe.mpg.de>
- Files: pp.c t/op/pack.t
-
- ------ LIBRARY AND EXTENSIONS ------
-
- Title: "Cwd.pm: abs_path() and fast_abs_path() plus code merge"
- From: Graham Barr <gbarr@ti.com>
- Msg-ID: <3482F365.4A0486BA@ti.com>
- Files: lib/Cwd.pm
-
- Title: "Math/BigInt.pm, fixed use of undefined value."
- From: abigail@fnx.com
- Msg-ID: <19980313052452.27365.qmail@betelgeuse.wayne.fnx.com>
- Files: lib/Math/BigInt.pm
-
- Title: "File::Find rewrite"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199803052344.SAA01008@monk.mps.ohio-state.edu>
- Files: lib/File/Find.pm
-
- Title: "efficient version of strict.pm"
- From: koenig@anna.mind.de (Andreas J. Koenig)
- Msg-ID: <sfcpvonhdnc.fsf@anna.in-berlin.de>
- Files: lib/strict.pm
-
- Title: "Socket occasional SEGV in pack_sockaddr_un"
- From: Trevor Blackwell <tlb@viaweb.com>
- Msg-ID: <199710281804.NAA09632@wagg.viaweb.com>
- Files: ext/Socket/Socket.xs
-
- Title: "Warning on mis-use of 'use lib'"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Tom Phoenix
- <rootbeer@teleport.com>, chip@atlantic.net
- Msg-ID: <199801270435.XAA14147@cyprus.atlantic.net>,
- <E0xx9x4-0006jc-00@ursa.cus.cam.ac.uk>,
- <Pine.GSO.3.96.980126192445.22284N-100000@user2.teleport.com>
- Files: lib/lib.pm
-
- Title: "bug in Class::Struct"
- From: Tom Christiansen <tchrist@toy.perl.com>
- Msg-ID: <199803290814.KAA05699@toy.perl.com>
- Files: lib/Class/Struct.pm
-
- Title: "Allow POSIX to export nice()"
- From: bkeelerx@iwa.dp.intel.com (Bruce J. Keeler)
- Msg-ID: <eclg1kf5yf0.fsf@ws010.dp.intel.com>
- Files: ext/POSIX/POSIX.pm
-
- Title: "'use Env' on WinNT/95 fails"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199803280511.AAA15933@aatma.engin.umich.edu>
- Files: lib/Env.pm
-
- ------ OTHER CHANGES ------
-
- Title: "mv-if-diff"
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Msg-ID: <14572.9803271806@tempest.cise.npl.co.uk>
- Files: mv-if-diff
-
- ------ PORTABILITY - WIN32 ------
-
- Title: "fix various problems with backticks on win32"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199803070705.CAA15945@aatma.engin.umich.edu>
- Files: win32/config_h.PL win32/win32.c
+[ 4187] By: gsar on 1999/09/17 21:13:55
+ Log: fix typo
+ Branch: perl
+ ! t/io/open.t
+____________________________________________________________________________
+[ 4186] By: gsar on 1999/09/17 20:57:29
+ Log: integrate cfgperl change
+ Branch: perl
+ !> vms/subconfigure.com
+____________________________________________________________________________
+[ 4185] By: jhi on 1999/09/17 20:46:41
+ Log: Re-apply applicable parts of #3993, #3994, and #3995.
+ Branch: cfgperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 4184] By: gsar on 1999/09/17 20:26:02
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> lib/unicode/ArabShap.txt lib/unicode/Blocks.txt
+ +> lib/unicode/CompExcl.txt lib/unicode/EAWidth.txt
+ +> lib/unicode/Index.txt lib/unicode/Jamo-2.txt
+ +> lib/unicode/LineBrk.txt lib/unicode/Names.txt
+ +> lib/unicode/Props.txt lib/unicode/ReadMe.txt
+ +> lib/unicode/SpecCase.txt
+ - lib/unicode/arabshp.txt lib/unicode/blocks.txt
+ - lib/unicode/index2.txt lib/unicode/jamo2.txt
+ - lib/unicode/names2.txt lib/unicode/props2.txt
+ - lib/unicode/readme.txt
+ !> (integrate 73 files)
+____________________________________________________________________________
+[ 4183] By: jhi on 1999/09/17 20:25:51
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> configure.com ext/ByteLoader/byterun.h
+ !> ext/DynaLoader/DynaLoader_pm.PL lib/ExtUtils/MM_VMS.pm
+ !> lib/File/Spec/VMS.pm pod/perlhist.pod t/io/open.t
+ !> vms/descrip_mms.template vms/gen_shrfls.pl vms/perly_c.vms
+ !> vms/perly_h.vms vms/subconfigure.com vms/vms.c vms/vmsish.h
+____________________________________________________________________________
+[ 4182] By: gsar on 1999/09/17 20:16:28
+ Log: integrate vmsperl contents into mainline (where VMS files conflicted,
+ vmsperl contents have prevailed)
+ Branch: perl
+ !> configure.com ext/ByteLoader/byterun.h
+ !> ext/DynaLoader/DynaLoader_pm.PL lib/ExtUtils/MM_VMS.pm
+ !> lib/File/Spec/VMS.pm t/io/open.t vms/descrip_mms.template
+ !> vms/gen_shrfls.pl vms/perly_c.vms vms/perly_h.vms
+ !> vms/subconfigure.com vms/vms.c vms/vmsish.h
+____________________________________________________________________________
+[ 4181] By: jhi on 1999/09/17 20:12:37
+ Log: From: Michael G Schwern <schwern@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_60 lib/Exporter/Heavy.pm] export_to_level()
+ Date: Thu, 19 Aug 1999 21:30:01 -0400
+ Message-ID: <19990819213001.A22512@athens.aocn.com>
+ Branch: cfgperl
+ ! lib/Exporter/Heavy.pm
+____________________________________________________________________________
+[ 4180] By: gsar on 1999/09/17 20:11:00
+ Log: perlhist additions
+ Branch: perl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 4179] By: jhi on 1999/09/17 20:08:00
+ Log: The change #4176 should've undone only the test, not the code patch.
+ Branch: cfgperl
+ ! doio.c
+____________________________________________________________________________
+[ 4178] By: jhi on 1999/09/17 20:06:08
+ Log: From: Ian Phillipps <ian@dial.pipex.com>
+ To: Hans GINZEL <hgin2088@mail.kolej.mff.cuni.cz>, perl5-porters@perl.org
+ Subject: [PATCH 5.005_59] Re: [ID 19990820.007] Small typo in perlsyn.pod
+ Date: Sat, 21 Aug 1999 12:36:12 +0100
+ Message-ID: <19990821123612.A9955@homer.diplex.co.uk>
+ Branch: cfgperl
+ ! pod/perlsyn.pod
+____________________________________________________________________________
+[ 4177] By: jhi on 1999/09/17 20:00:19
+ Log: More descriptive names for operators.
- ------ TESTS ------
+ From: Michael G Schwern <schwern@pobox.com>
+ To: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Cc: perl5-porters@perl.org
+ Subject: Re: [ID 19990817.009] [BUG 5.005_60 & 5.005_03] == reported as eq in
+ Date: Tue, 17 Aug 1999 18:35:45 -0400
+ Message-ID: <19990817183545.A23073@toldyouso.com>
- Title: "Fix bug in locale.t"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199801042148.XAA08599@alpha.hut.fi>
- Files: t/pragma/locale.t
- Branch: maint-5.004/perl
- ! config_H config_h.SH doio.c doop.c ext/DB_File/DB_File.xs
- ! ext/DynaLoader/dl_dld.xs ext/Opcode/Opcode.xs
- ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs ext/Socket/Socket.xs
- ! gv.c lib/Class/Struct.pm lib/Cwd.pm lib/Env.pm
- ! lib/ExtUtils/typemap lib/File/Find.pm lib/Math/BigInt.pm
- ! lib/autouse.pm lib/lib.pm lib/strict.pm mg.c mv-if-diff op.c
- ! os2/OS2/REXX/REXX.xs pod/perlcall.pod pod/perldiag.pod
- ! pod/perlembed.pod pod/perlfunc.pod pod/perlguts.pod
- ! pod/perlxs.pod pp.c pp_ctl.c pp_sys.c proto.h sv.c t/op/gv.t
- ! t/op/misc.t t/op/pack.t t/pragma/locale.t toke.c
- ! win32/Makefile win32/config_h.PL win32/win32.c
-____________________________________________________________________________
-[ 895] By: gsar on 1998/04/22 03:13:19
- Log: intern -> sys_intern
- Branch: win32/perl
- ! embedvar.h interp.sym intrpvar.h win32/win32.h
-____________________________________________________________________________
-[ 894] By: gsar on 1998/04/22 02:42:20
- Log: hand-applied patch along with small tweaks
- Message-Id: <35400e2a.13538517@smtp1.ibm.net>
- Date: Tue, 21 Apr 1998 23:31:06 +0200
- From: jan.dubois@ibm.net (Jan Dubois)
- Subject: Re: Per-Interpreter variables for win32.c
- Branch: win32/perl
- ! embedvar.h interp.sym intrpvar.h perl.c perl.h proto.h
- ! win32/makedef.pl win32/win32.c win32/win32.h
-____________________________________________________________________________
-[ 893] By: gsar on 1998/04/21 03:42:21
- Log: add AS patch#17
- Branch: asperl
- + win32/GenCAPI.pl
- ! MANIFEST XSUB.h cv.h ipstdio.h lib/ExtUtils/MM_Unix.pm
- ! lib/ExtUtils/MM_Win32.pm lib/ExtUtils/MakeMaker.pm
- ! lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp op.c perl.h
- ! pp_ctl.c pp_hot.c proto.h sv.h thread.h win32/Makefile
- ! win32/dl_win32.xs win32/makefile.mk win32/runperl.c
- ! win32/win32.c
+ From: Michael G Schwern <schwern@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_60 opcode.pl and friends] Improved opcode descriptions
+ Date: Wed, 18 Aug 1999 03:53:38 -0400
+ Message-ID: <19990818035337.A31505@athens.aocn.com>
+ Branch: cfgperl
+ ! opcode.h opcode.pl pp.sym pp_proto.h sv.c t/op/misc.t
+ ! t/pragma/warn/op t/pragma/warn/sv
____________________________________________________________________________
-[ 892] By: gsar on 1998/04/20 20:51:50
- Log: add AS patch#16
- Branch: asperl
- ! globals.c ipdir.h perl.h perlvars.h regcomp.h win32/Makefile
- ! win32/makefile.mk
+[ 4176] By: jhi on 1999/09/17 18:19:18
+ Log: Take away the infamous io/dup.t #7.
+ It seems there simply is no way to portably
+ "flush" an input file handle.
+ Branch: cfgperl
+ ! doio.c t/io/dup.t
____________________________________________________________________________
-[ 891] By: gsar on 1998/04/19 23:50:34
- Log: tweak doc for C<do FILENAME>
- Branch: win32/perl
- ! pod/perlfunc.pod
+[ 4175] By: jhi on 1999/09/17 14:45:08
+ Log: From: Barrie Slaymaker <barries@slaysys.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_61] Benchmark: screwed patch format, try this instead
+ Date: Fri, 17 Sep 1999 11:16:48 -0400
+ Message-Id: <199909171516.LAA30887@jester.slaysys.com>
+ Branch: cfgperl
+ ! lib/Benchmark.pm
____________________________________________________________________________
-[ 890] By: gsar on 1998/04/19 01:08:11
- Log: use a pidtable that grows dynamically for popen()
- Message-Id: <3539f434.44835409@smtp1.ibm.net>
- Date: Sat, 18 Apr 1998 21:01:27 +0200
- From: jan.dubois@ibm.net (Jan Dubois)
- Subject: Re: [PATCH] for bug in 5.004_64 when compiled with MSC++ 4.2
- Branch: win32/perl
- ! win32/win32.c
+[ 4174] By: jhi on 1999/09/17 14:07:16
+ Log: UNICOS does support large files but doesn't support sparse files
+ so we cannot easily test for large file support.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 4173] By: jhi on 1999/09/17 14:03:44
+ Log: UNICOS has sloppy division/modulo for floating point numbers.
+ Branch: cfgperl
+ ! t/op/arith.t
+____________________________________________________________________________
+[ 4172] By: jhi on 1999/09/17 13:47:49
+ Log: Portable blocksize (replaces #4171).
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 4171] By: jhi on 1999/09/17 13:08:54
+ Log: (replaced by #4172)
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 4170] By: jhi on 1999/09/17 12:59:11
+ Log: Detypo #4169.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 4169] By: jhi on 1999/09/17 12:16:34
+ Log: Diagnose possible quota limits.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 4168] By: jhi on 1999/09/17 12:10:43
+ Log: UNICOS doesn't have getpgid(). Or, at least 9.0.1ai
+ doesn't have one that wouldn't cause SIGSYS. UNICOS
+ does have getpgrp(void) so Perl getpgrp() is happy.
+ Branch: cfgperl
+ ! hints/unicos.sh
____________________________________________________________________________
-[ 889] By: gsar on 1998/04/17 02:13:58
- Log: support POSIX, enable more locale tests
- Branch: win32/perl
- ! ext/POSIX/Makefile.PL ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs
- ! t/lib/posix.t t/pragma/locale.t win32/Makefile
- ! win32/makedef.pl win32/makefile.mk
+[ 4167] By: jhi on 1999/09/17 11:49:30
+ Log: Filesystem quotas may stop you from using large files.
+ Branch: cfgperl
+ ! pod/perldelta.pod t/lib/syslfs.t t/op/lfs.t
____________________________________________________________________________
-[ 888] By: mbeattie on 1998/04/14 16:22:51
- Log: CC did "<<" instead of ">>" for right-shift on ints.
+[ 4166] By: jhi on 1999/09/17 11:36:01
+ Log: Too strict pattern for parsing group lists.
+ Branch: cfgperl
+ ! t/op/groups.t
+____________________________________________________________________________
+[ 4165] By: jhi on 1999/09/17 09:06:18
+ Log: Configure maintenance. It's sigaction.sa_flags
+ and the Glossary regen'ed.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+ Branch: metaconfig
+ ! U/compline/d_sigaction.U
+____________________________________________________________________________
+[ 4164] By: jhi on 1999/09/15 06:57:51
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> jpl/JNI/Closer.java jpl/JNI/JNIConfig jpl/JNI/JNIConfig.Win32
+ +> jpl/JNI/JNIConfig.kaffe jpl/JNI/JNIConfig.noembed
+ +> jpl/JNI/JNIConfig.standard jpl/JNI/typemap.gcc
+ +> jpl/JNI/typemap.win32 jpl/SETVARS.PL
+ !> Changes MANIFEST embed.h embed.pl jpl/JNI/JNI.pm
+ !> jpl/JNI/JNI.xs jpl/JNI/Makefile.PL jpl/JNI/test.pl
+ !> jpl/JNI/typemap jpl/JPL/Makefile.PL
+ !> jpl/PerlInterpreter/Makefile.PL
+ !> jpl/PerlInterpreter/PerlInterpreter.c
+ !> jpl/PerlInterpreter/PerlInterpreter.h jpl/README
+ !> jpl/Sample/Makefile.PL jpl/install-jpl
+ !> lib/File/Spec/Functions.pm pod/perlhist.pod regexec.c
+ !> t/op/pat.t
+____________________________________________________________________________
+[ 4163] By: gsar on 1999/09/15 05:17:27
+ Log: add :ALL export tag (from Chris Nandor <pudge@pobox.com>)
+ Branch: perl
+ ! lib/File/Spec/Functions.pm
+____________________________________________________________________________
+[ 4162] By: gsar on 1999/09/15 05:09:14
+ Log: addendum to change#4136 (from Robin Barker <rmb1@cise.npl.co.uk>)
+ Branch: perl
+ ! Changes embed.h embed.pl
+____________________________________________________________________________
+[ 4161] By: gsar on 1999/09/15 04:08:25
+ Log: missing perlhist dates from Jeff Okamoto
+ Branch: perl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 4160] By: gsar on 1999/09/15 03:13:08
+ Log: jpl tweak
+ Branch: perl
+ ! MANIFEST jpl/JNI/Makefile.PL
+____________________________________________________________________________
+[ 4159] By: gsar on 1999/09/15 02:57:08
+ Log: update to JPL snapshot v09141999, with minor tweaks (from Brian
+ Jepson <bjepson@home.com>)
+ Branch: perl
+ + jpl/JNI/Closer.java jpl/JNI/JNIConfig jpl/JNI/JNIConfig.Win32
+ + jpl/JNI/JNIConfig.kaffe jpl/JNI/JNIConfig.noembed
+ + jpl/JNI/JNIConfig.standard jpl/JNI/typemap.gcc
+ + jpl/JNI/typemap.win32 jpl/SETVARS.PL
+ ! jpl/JNI/JNI.pm jpl/JNI/JNI.xs jpl/JNI/Makefile.PL
+ ! jpl/JNI/test.pl jpl/JNI/typemap jpl/JPL/Makefile.PL
+ ! jpl/PerlInterpreter/Makefile.PL
+ ! jpl/PerlInterpreter/PerlInterpreter.c
+ ! jpl/PerlInterpreter/PerlInterpreter.h jpl/README
+ ! jpl/Sample/Makefile.PL jpl/install-jpl
+____________________________________________________________________________
+[ 4158] By: gsar on 1999/09/15 01:27:14
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 14 Sep 1999 21:26:15 EDT
+ Message-Id: <199909150126.VAA24720@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_58+] Re: [ID 19990914.001] Perl_re_intuit_start() hangs in a loop
Branch: perl
- ! ext/B/B/CC.pm
+ ! regexec.c t/op/pat.t
____________________________________________________________________________
-[ 887] By: TimBunce on 1998/04/10 17:44:55
- Log: Assorted patches:
-
- ------ CORE LANGUAGE ------
-
- Title: "Re: die exits with 0"
- From: Robin Barker <rmb1@cise.npl.co.uk>
- Files: perl.c t/op/die_exit.t
-
- Title: "More toke.c commentary; fix oddity"
- From: h.sanden@elsevier.nl (Hugo van der Sanden)
- Msg-ID: <199803251022.LAA01308@dorlas.elsevier.nl>
- Files: toke.c
-
- Title: "for semctl on solaris"
- From: Graham Barr <gbarr@ti.com>
- Msg-ID: <34624B80.C014E841@ti.com>
- Files: doio.c t/op/ipcmsg.t t/op/ipcsem.t
-
- ------ DOCUMENTATION ------
-
- Title: "Add more 'see also's to perlre.pod.", "Perl regexp /g modifier bug"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>, epeschko@den-mdev1 (Ed
- Peschko), pjr@watcher.telstra.com.au (Peter Richardson)
- Msg-ID: <199803050000.LAA11476@watcher.telecom.com.au>,
- <199803050231.VAA19128@monk.mps.ohio-state.edu>,
- <199803050605.XAA09785@den-mdev1.co.csgsystems.com>
- Files: pod/perlre.pod
-
- ------ LIBRARY AND EXTENSIONS ------
-
- Title: "BigFloat - small neagtive numbers cause panic"
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199711201325.NAA09732@crypt.compulink.co.uk>
- Files: lib/Math/BigFloat.pm
-
- Title: "Update Getopt::Long to 2.16"
- From: JVromans@Squirrel.nl (Johan Vromans), Johan Vromans
- <jvromans@squirrel.nl>
- Msg-ID: <13571.48089.726787.147769@plume.nl.compuware.com>,
- <13572.6847.863219.973795@phoenix.squirrel.nl>
- Files: lib/Getopt/Long.pm
-
- Title: "New Text::ParseWords"
- From: pomeranz@netcom.com (Hal Pomeranz)
- Msg-ID: <199710162118.OAA06275@netcom7.netcom.com>
- Files: lib/Text/ParseWords.pm t/lib/parsewords.t
-
- Title: "Fixed Text/Wrap.pm bugs (2)"
- From: Jacqui Caren <Jacqui.Caren@ig.co.uk>
- Msg-ID: <199709291548.QAA08645@toad.ig.co.uk>
- Files: lib/Text/Wrap.pm
-
- Title: "Very *evil* File::CheckTree behavior! (now uses warn/die not
- print/exit)"
- From: Eryq <eryq@zeegee.com>, Randal Schwartz <merlyn@stonehenge.com>
- Msg-ID: <34B542FD.190A@zeegee.com>, <8cen2i9k6f.fsf@gadget.cscaper.com>
- Files: lib/File/CheckTree.pm
-
- ------ OTHER CHANGES ------
-
- Title: "Add ./emacs/ptags"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199803150847.DAA08196@monk.mps.ohio-state.edu>
- Files: emacs/ptags
-
- ------ TESTS ------
-
- Title: "Avoid stat test failure from build in /tmp (tmpfs)", "Build in /tmp"
- From: Andy Dougherty <doughera@newton.phys.lafayette.edu>, Greg Bacon
- <gbacon@adtran.com>, pudge@pobox.com (Chris Nandor)
- Msg-ID: <199710171616.LAA13435@crp-201.adtran.com>,
- <Pine.SUN.3.96.971017171023.2349A-100000@newton.phys>,
- <v02130515b06be80f1486@[205.228.240.16]>
- Files: t/op/stat.t
-
- Title: "for failure with lib/timelocal"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, jan.dubois@ibm.net (Jan Dubois)
- Msg-ID: <34c78f61.2529827@smtp1.ibm.net>,
- <E0xvdfI-00057d-00@ursa.cus.cam.ac.uk>
- Files: t/lib/timelocal.t
-
- Title: "Make "localhost" related failures more clear"
- From: Paul Hoffman <phoffman@proper.com>
- Msg-ID: <199801201859.KAA05686@mail.proper.com>
- Files: t/lib/io_sock.t t/lib/io_udp.t
-
- ------ UTILITIES ------
-
- Title: "Let h2xs read multiple header files"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>, Benjamin Sugars
- <bsugars@canoe.ca>
- Msg-ID: <Pine.SOL.3.95.980310091946.25236A-100000@interact>,
- <Pine.SUN.3.96.980310145455.638A-100000@newton.phys>
- Files: utils/h2xs.PL
- Branch: maint-5.004/perl
- + emacs/ptags t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
- ! MANIFEST doio.c lib/File/CheckTree.pm lib/Getopt/Long.pm
- ! lib/Math/BigFloat.pm lib/Text/ParseWords.pm lib/Text/Wrap.pm
- ! lib/base.pm perl.c pod/perlre.pod t/lib/io_sock.t
- ! t/lib/io_udp.t t/lib/parsewords.t t/lib/timelocal.t
- ! t/op/stat.t toke.c utils/h2xs.PL vms/perly_h.vms
-____________________________________________________________________________
-[ 886] By: TimBunce on 1998/04/10 14:35:34
- Log: Changes relating primarily to portability.
-
- ------ CORE LANGUAGE ------
-
- Title: "5.004_55: Another round of OS/2 patches"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199803050945.EAA20153@monk.mps.ohio-state.edu>
- Files: hints/os2.sh pod/perlguts.pod cop.h perl.h proto.h README.os2
- global.sym lib/ExtUtils/MM_OS2.pm lib/File/Path.pm op.c
- os2/Changes os2/Makefile.SHs os2/os2.c os2/perl2cmd.pl
- perl.c pod/pod2man.PL pp_ctl.c pp_hot.c pp_sys.c
- t/lib/filecopy.t util.c utils/perldoc.PL
-
- Title: "VMS: chdir() with empty arg list"
- From: lane@duphy4.drexel.edu (Charles Lane)
- Msg-ID: <980317125556.222041c7@DUPHY4.Physics.Drexel.Edu>
- Files: pp_sys.c
-
- ------ LIBRARY AND EXTENSIONS ------
-
- Title: "ExtUtils/MM_Unix.pm changed to use ld -rpath on IRIX"
- From: "W. Phillip Moore" <wpm@ms.com>
- Msg-ID: <199712011738.MAA21139@zappa.morgan.com>
- Files: lib/ExtUtils/MM_Unix.pm
-
- Title: "[Linux] POSIX::_[PS]C_.+ bug (add HINT_SC_EXIST)"
- From: Yutaka OIWA <oiwa@is.s.u-tokyo.ac.jp>
- Msg-ID: <199712251923.EAA08260@tjms1f.is.s.u-tokyo.ac.jp>
- Files: ext/POSIX/hints/linux.pl ext/POSIX/POSIX.xs
-
- Title: "5.004_04-m1] Use HAS_GNULIBC in POSIX.xs"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980305115517.9180L-100000@newton.phys>
- Files: ext/POSIX/POSIX.xs
-
- Title: ""ODBM_File.c", line 275: NULL undefined"
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- Msg-ID: <9803091310.AA23264@claudius.bfsec.bt.co.uk>
- Files: ext/ODBM_File/ODBM_File.xs
-
- ------ OTHER CHANGES ------
- Files:
-
- ------ PORTABILITY - GENERAL ------
-
- Title: "5.004_04 QNX getcwd"
- From: Norton Allen <allen@huarp.harvard.edu>
- Msg-ID: <199802121838.NAA20452@dolores.harvard.edu>,
- <199803061511.KAA22346@bottesini.harvard.edu>
- Files: hints/qnx.sh lib/Cwd.pm t/op/magic.t
-
- Title: "hints/netbsd.sh d_setrgid d_setruid"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199802281435.QAA10866@alpha.hut.fi>
- Files: hints/netbsd.sh
-
- Title: "osname=unixware, osvers=2.03, archname=i386-unixware
- d_casti32=undef"
- From: Tom Hughes <tom@compton.demon.co.uk>
- Msg-ID: <465398da47%tom@compton.demon.co.uk>
- Files: hints/svr4.sh
-
- Title: "hints/bsdos.sh patch for BSDI 3.1"
- From: Jan-Pieter Cornet <johnpc@xs4all.nl>
- Msg-ID: <6fbip6$3cp$1@xs1.xs4all.nl>
- Files: hints/bsdos.sh
-
- Title: "Remove BIND_NOSTART from DynaLoader for HP"
- From: Keong Lim <Keong.Lim@sr.com.au>
- Msg-ID: <01BD1D03.53B65E90@sieplan2.sr.com.au>
- Files: ext/DynaLoader/dl_hpux.xs
-
- Title: "Building Perl on AIX 4+ with shared libraries and dynamic loading"
- From: Juan Gallego <Little.Boss@physics.mcgill.ca>
- Msg-ID: <Pine.SGI.3.91.971022084517.17052F-100000@nazgul.physics.mcgill.ca>
- Files: hints/aix.sh
-
- Title: "alpha-dec_osf 5.0"
- From: Spider Boardman <spider@Orb.Nashua.NH.US>
- Msg-ID: <199712232305.SAA08359@Orb.Nashua.NH.US>
- Files: hints/dec_osf.sh
-
- Title: "Off-by-one error with OS2::PrfDB"
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199710170920.FAA00390@monk.mps.ohio-state.edu>
- Files: os2/OS2/PrfDB/PrfDB.xs
-
- Title: "5.004_04-m1] Allow overrides in hints/openbsd.sh"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980305115956.9180N-100000@newton.phys>
- Files: hints/openbsd.sh
-
- Title: "5.004_04-m1] Linux shouldn't use -lnet"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980305115843.9180M-100000@newton.phys>
- Files: hints/linux.sh
-
- Title: "5.004_(04|63)] Close VMS security hole"
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- Msg-ID: <01IV6LRJCSSC0009C4@cor.newman.upenn.edu>
- Files: vms/vms.c
-
- Title: "Re: Perl online documentation on OpenVMS"
- From: pvhp@forte.com (Peter Prymmer)
- Msg-ID: <9803192143.AA28120@forte.com>
- Files: README.vms
-
- Title: "Perl5.004_04m4t4 *almost* makes it for VMS", "Updated
- vms/perly_c.vms and vms/perly_h.vms"
- From: Andy Dougherty <doughera@newton.phys.lafayette.edu>, Dan Sugalski
- <sugalskd@osshe.edu>, larry@wall.org (Larry Wall)
- Msg-ID: <199710151650.JAA29185@wall.org>,
- <3.0.3.32.19971014150404.02fdef78@osshe.edu>,
- <Pine.SUN.3.96.971015121704.28456F-100000@newton.phys>
- Files: vms/perly_c.vms
-
- Title: "Updated, non-wordwrapped, patch to README.VMS"
- From: Dan Sugalski <sugalskd@osshe.edu>
- Msg-ID: <3.0.5.32.19980213133828.0092c870@osshe.edu>
- Files: README.vms
-
- Title: "VMS patches to 5.004_03 (excluding installperl and timelocal.t)"
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- Msg-ID: <01INZT9G2LZS0006YW@cor.newman.upenn.edu>
- Files: lib/File/Basename.pm lib/File/Path.pm vms/config.vms vms/descrip.mms
- vms/genconfig.pl vms/test.com vms/vms.c vms/ext/Filespec.pm
- vms/ext/filespec.t
-
- Title: "Re: VMSperl crashes on -Mblib argument"
- From: bailey@newman.upenn.edu (Charles Bailey)
- Msg-ID: <1997Dec10.004439.2635060@cor.newman>
- Files: lib/blib.pm vms/vms.c
-
- Title: "hints/linux.sh (MkLinux / PPC)"
- From: pudge@pobox.com (Chris Nandor)
- Msg-ID: <v0213050cb06c19682a25@[205.228.240.28]>
- Files: hints/linux.sh
-
- Title: "hpux.sh hints file clarification suggestion"
- From: root@qad.com
- Msg-ID: <199802192351.QAA09096@jhereg.perl.com>
- Files: hints/hpux.sh
-
- Title: "new hints/solaris_2.sh"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0xw80h-0005SV-00@ursa.cus.cam.ac.uk>
- Files: hints/solaris_2.sh
- Branch: maint-5.004/perl
- ! README.os2 README.vms cop.h ext/DynaLoader/dl_hpux.xs
- ! ext/ODBM_File/ODBM_File.xs ext/POSIX/POSIX.xs
- ! ext/POSIX/hints/linux.pl global.sym hints/aix.sh
- ! hints/bsdos.sh hints/dec_osf.sh hints/hpux.sh hints/linux.sh
- ! hints/netbsd.sh hints/openbsd.sh hints/os2.sh hints/qnx.sh
- ! hints/solaris_2.sh hints/svr4.sh lib/Cwd.pm
- ! lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm
- ! lib/File/Basename.pm lib/File/Path.pm lib/blib.pm op.c
- ! os2/Changes os2/Makefile.SHs os2/OS2/PrfDB/PrfDB.xs os2/os2.c
- ! os2/perl2cmd.pl perl.c perl.h pod/perlguts.pod pod/pod2man.PL
- ! pp_ctl.c pp_hot.c pp_sys.c proto.h t/lib/filecopy.t
- ! t/op/magic.t util.c utils/perldoc.PL vms/config.vms
- ! vms/descrip.mms vms/ext/Filespec.pm vms/ext/filespec.t
- ! vms/genconfig.pl vms/perly_c.vms vms/perly_h.vms vms/test.com
- ! vms/vms.c
+[ 4157] By: jhi on 1999/09/14 21:18:09
+ Log: config.h will define USE_64_BITS if need be.
+ Branch: cfgperl
+ ! hints/irix_6.sh
____________________________________________________________________________
-[ 885] By: gsar on 1998/04/08 01:14:29
- Log: small tweaks to make it compile (doesn't run)
- Branch: asperl
- ! objpp.h win32/Makefile win32/config.bc win32/config.gc
- ! win32/config.vc win32/makefile.mk
+[ 4156] By: jhi on 1999/09/14 20:30:00
+ Log: Change #4149 necessitates also a small code change.
+ Branch: cfgperl
+ ! ext/B/defsubs_h.PL
____________________________________________________________________________
-[ 884] By: gsar on 1998/04/08 00:14:13
- Log: integrate mainline changes
- Branch: asperl
- +> Changes5.004 ext/Thread/Thread/Signal.pm
- +> lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
- +> lib/ExtUtils/inst t/op/hashwarn.t
- ! ObjXSub.h embedvar.h interp.sym intrpvar.h objpp.h
- !> (integrate 127 files)
-____________________________________________________________________________
-[ 883] By: gsar on 1998/04/06 20:21:20
- Log: make old DomainName() implementation the default (so Win95
- is happy)
- Branch: win32/perl
- ! win32/win32.c
+[ 4155] By: jhi on 1999/09/14 20:15:53
+ Log: Update EPOC libdir names.
+ Branch: cfgperl
+ ! epoc/config.h
____________________________________________________________________________
-[ 882] By: gsar on 1998/04/05 23:32:33
- Log: fix memory leaks in offer_nice_chunk()
- Branch: win32/perl
- ! perl.h sv.c
+[ 4154] By: jhi on 1999/09/14 20:13:41
+ Log: Obsolete epoc/config.h caused #4153 to re-introduce already
+ deceased HAS.*DBM.*64 mumblings.
+ Branch: cfgperl
+ ! Configure config_h.SH epoc/config.h
____________________________________________________________________________
-[ 881] By: gsar on 1998/04/04 23:11:52
- Log: set up PUSHSTACK for __DIE__ and __WARN__ hooks also
- Branch: win32/perl
- ! cop.h util.c
+[ 4153] By: jhi on 1999/09/14 20:04:53
+ Log: Configure nits.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/compline/d_sigaction.U U/threads/i_pthread.U
____________________________________________________________________________
-[ 880] By: gsar on 1998/04/04 22:35:54
- Log: fix refcounting of GvSTASH() when glob becomes nought
- (this takes care of the "unbalanced strtab refcount" problem)
- Branch: win32/perl
- ! sv.c
+[ 4152] By: jhi on 1999/09/14 19:30:22
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> ext/B/defsubs_h.PL t/lib/bigfltpm.t
+ - ext/B/defsubs.h.PL t/lib/bigfloatpm.t
+ !> INSTALL MANIFEST ext/B/Makefile.PL pod/perldiag.pod
+ !> win32/config_sh.PL
+____________________________________________________________________________
+[ 4151] By: jhi on 1999/09/14 10:25:01
+ Log: Update Unicode database and recompute the tables.
+ Rename the .txt files to be more Unicode 3.0-like.
+ Unihan-3.0.txt not included because it is 16 MB.
+ syllables.txt is manually maintained.
+ See ReadMe.txt for description of the .txt files.
+ (not all of them are used yet)
+ Branch: cfgperl
+ + lib/unicode/ArabShap.txt lib/unicode/Blocks.txt
+ + lib/unicode/CompExcl.txt lib/unicode/EAWidth.txt
+ + lib/unicode/Index.txt lib/unicode/Jamo-2.txt
+ + lib/unicode/LineBrk.txt lib/unicode/Names.txt
+ + lib/unicode/Props.txt lib/unicode/ReadMe.txt
+ + lib/unicode/SpecCase.txt
+ - lib/unicode/arabshp.txt lib/unicode/blocks.txt
+ - lib/unicode/index2.txt lib/unicode/jamo2.txt
+ - lib/unicode/names2.txt lib/unicode/props2.txt
+ - lib/unicode/readme.txt
+ ! MANIFEST lib/unicode/ArabLink.pl lib/unicode/ArabLnkGrp.pl
+ ! lib/unicode/Bidirectional.pl lib/unicode/Block.pl
+ ! lib/unicode/Category.pl lib/unicode/CombiningClass.pl
+ ! lib/unicode/Decomposition.pl
+ ! lib/unicode/In/ArabicPresentationForms-B.pl
+ ! lib/unicode/In/Specials.pl lib/unicode/In/Tibetan.pl
+ ! lib/unicode/Is/Alnum.pl lib/unicode/Is/Alpha.pl
+ ! lib/unicode/Is/BidiCS.pl lib/unicode/Is/BidiL.pl
+ ! lib/unicode/Is/BidiON.pl lib/unicode/Is/BidiWS.pl
+ ! lib/unicode/Is/DCcompat.pl lib/unicode/Is/DecoCanon.pl
+ ! lib/unicode/Is/DecoCompat.pl lib/unicode/Is/L.pl
+ ! lib/unicode/Is/Ll.pl lib/unicode/Is/Lo.pl
+ ! lib/unicode/Is/Lower.pl lib/unicode/Is/Lu.pl
+ ! lib/unicode/Is/Pd.pl lib/unicode/Is/Po.pl lib/unicode/Is/S.pl
+ ! lib/unicode/Is/Sm.pl lib/unicode/Is/So.pl
+ ! lib/unicode/Is/Upper.pl lib/unicode/Is/Word.pl
+ ! lib/unicode/JamoShort.pl lib/unicode/UnicodeData-Latest.txt
+ ! lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 4150] By: gsar on 1999/09/14 09:31:57
+ Log: INSTALL tweak
+ Branch: perl
+ ! INSTALL
+____________________________________________________________________________
+[ 4149] By: gsar on 1999/09/14 09:00:45
+ Log: change some filenames to be 8.3-friendly
+ Branch: perl
+ +> ext/B/defsubs_h.PL t/lib/bigfltpm.t
+ - ext/B/defsubs.h.PL t/lib/bigfloatpm.t
+ ! MANIFEST ext/B/Makefile.PL pod/perldiag.pod
+____________________________________________________________________________
+[ 4148] By: gsar on 1999/09/14 08:35:00
+ Log: win32 config tweak (suggested by Greg Chapman <glc@well.com>)
+ Branch: perl
+ ! win32/config_sh.PL
+____________________________________________________________________________
+[ 4147] By: jhi on 1999/09/14 08:07:49
+ Log: Not that UVSIZE normally differs that much from IVSIZE...
+ Branch: cfgperl
+ ! perl.h
____________________________________________________________________________
-[ 879] By: gsar on 1998/04/04 21:16:17
- Log: change 866 was incomplete
- Branch: win32/perl
- ! hv.c
+[ 4146] By: jhi on 1999/09/14 08:04:40
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes ext/DB_File/DB_File.xs
____________________________________________________________________________
-[ 878] By: gsar on 1998/04/04 20:31:56
- Log: fixes for various noises under PERL_DESTRUCT_LEVEL
- Branch: win32/perl
- ! cop.h perl.c pp_ctl.c
-____________________________________________________________________________
-[ 877] By: gsar on 1998/04/04 17:55:30
- Log: integrate mainline
- Branch: win32/perl
- +> Changes5.004
- !> Changes MANIFEST sv.c t/op/misc.t
-____________________________________________________________________________
-[ 876] By: gsar on 1998/04/04 17:26:32
- Log: remove __declspec kludge in sdbm.h in favor of setting a
- flag for static symbols
- Branch: win32/perl
- ! EXTERN.h ext/SDBM_File/sdbm/Makefile.PL
- ! ext/SDBM_File/sdbm/sdbm.h
+[ 4145] By: jhi on 1999/09/14 07:10:02
+ Log: I_PTHREAD was PTHREADEAD.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/threads/i_pthread.U
____________________________________________________________________________
-[ 875] By: gsar on 1998/04/04 01:11:57
- Log: fix order of init
- Message-Id: <3.0.5.32.19980403135815.009d2440@osshe.edu>
- Date: Fri, 03 Apr 1998 13:58:15 PST
- From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: [PATCH 5.004_64] perl dies in perl_construct when compiled
- with MULTIPLICITY
- Branch: win32/perl
- ! perl.c
+[ 4144] By: gsar on 1999/09/14 06:46:47
+ Log: change#4113 was missing DB_File.xs changes
+ Branch: perl
+ ! ext/DB_File/DB_File.xs
____________________________________________________________________________
-[ 874] By: gsar on 1998/04/04 00:34:59
- Log: the EXTCONST in sdbm.h breaks SDBM on Borland, since
- the declared symbol is not in a DLL (so kludge it)
- Branch: win32/perl
- ! ext/SDBM_File/sdbm/sdbm.h
+[ 4143] By: jhi on 1999/09/13 20:16:20
+ Log: Small doc and whitespace edits.
+ Branch: cfgperl
+ ! ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_beos.xs
+ ! ext/DynaLoader/dl_cygwin.xs ext/DynaLoader/dl_dld.xs
+ ! ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_mpeix.xs
+ ! ext/DynaLoader/dl_next.xs ext/DynaLoader/dl_rhapsody.xs
+ ! ext/DynaLoader/dl_vmesa.xs ext/DynaLoader/dl_vms.xs
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 4142] By: gsar on 1999/09/13 19:32:31
+ Log: integrate cfgperl contents into mainline, update Changes
+ Branch: perl
+ +> ext/DB_File/version.c
+ ! Changes
+ !> (integrate 44 files)
+____________________________________________________________________________
+[ 4141] By: jhi on 1999/09/13 16:16:56
+ Log: Scan for <pthread.h> always.
+ Branch: cfgperl
+ ! Configure config_h.SH perl.h
+ Branch: metaconfig
+ ! U/threads/i_pthread.U
____________________________________________________________________________
-[ 873] By: TimBunce on 1998/04/03 22:17:40
- Log: Title: "FileHandle Documentation patch"
- From: "Darren/Torin/Who Ever..." <torin@daft.com>
- Msg-ID: <87emzqo49g.fsf@perv.daft.com>
- Files: lib/FileHandle.pm
- Branch: maint-5.004/perl
- ! lib/FileHandle.pm
+[ 4140] By: jhi on 1999/09/13 16:00:08
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 27 files)
____________________________________________________________________________
-[ 872] By: TimBunce on 1998/04/03 22:01:03
- Log: Documentation and documentation related patches:
-
- ------ BUILD PROCESS ------
-
- Title: "Docs re /usr/bin/perl quasi-standard location"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.971117080737.12318C-100000@usertest.teleport.com>
- Files: INSTALL pod/perlrun.pod
-
- ------ DOCUMENTATION ------
-
- Title: "/RFC|RFC-1305/ non-greedy"
- From: Jan-Pieter Cornet <johnpc@xs4all.nl>
- Msg-ID: <6epo02$c4r$1@xs1.xs4all.nl>
- Files: pod/perlre.pod
-
- Title: "5.004_04: perlhist.pod, buildtoc, perltoc.pod"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199802191543.RAA29231@alpha.hut.fi>
- Files: pod/perl.pod pod/perlhist.pod pod/perltoc.pod pod/buildtoc
-
- Title: "5.004_04: pod/perlfunc.pod: i18n example for localtime()"
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199711141555.RAA18875@alpha.hut.fi>
- Files: pod/perlfunc.pod
-
- Title: "typo-fix and suggestion for perlguts.pod"
- From: h.sanden@elsevier.nl (Hugo van der Sanden)
- Msg-ID: <199803051543.QAA03097@dorlas.elsevier.nl>
- Files: pod/perlguts.pod
-
- Title: "perlfunc/syscall curiosity"
- From: Roderick Schertler <roderick@argon.org>, Tkil
- <tkil@reptile.scrye.com>
- Msg-ID: <199711302259.PAA02134@reptile.scrye.com>,
- <pziut8snva.fsf@eeyore.ibcinc.com>
- Files: pod/perlfunc.pod
+[ 4139] By: jhi on 1999/09/13 15:35:18
+ Log: Add -A option to Configure to diddle with variables
+ after the hints file has been applied.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/Oldconfig.U U/modified/Options.U
+____________________________________________________________________________
+[ 4138] By: jhi on 1999/09/13 13:42:56
+ Log: Change #4136 edited DynaLoader.xs which is kind of fruitless.
+ Branch: cfgperl
+ ! ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_beos.xs
+ ! ext/DynaLoader/dl_cygwin.xs ext/DynaLoader/dl_dld.xs
+ ! ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_mpeix.xs
+ ! ext/DynaLoader/dl_next.xs ext/DynaLoader/dl_rhapsody.xs
+ ! ext/DynaLoader/dl_vmesa.xs ext/DynaLoader/dl_vms.xs
+____________________________________________________________________________
+[ 4137] By: jhi on 1999/09/13 13:25:31
+ Log: Applying change #4136 manually introduced patch residue.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4136] By: jhi on 1999/09/13 13:23:04
+ Log: Replace change #4100 with
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ To: gsar@activestate.com
+ Cc: perl5-porters@perl.org
+ Subject: Re: [ID 19990907.004] [PATCH perl5.005_61] compiler warnings with -Duse64bits
+ Date: Mon, 13 Sep 1999 14:15:11 +0100 (BST)
+ Message-Id: <199909131315.OAA24012@tempest.npl.co.uk>
+ Branch: cfgperl
+ ! doio.c dump.c ext/B/B.xs ext/B/typemap
+ ! ext/ByteLoader/bytecode.h ext/Devel/DProf/DProf.xs
+ ! ext/DynaLoader/dl_dlopen.xs ext/ODBM_File/ODBM_File.xs
+ ! ext/POSIX/POSIX.xs lib/ExtUtils/typemap malloc.c perl.h pp.c
+ ! pp_ctl.c pp_hot.c pp_sys.c sv.c
+____________________________________________________________________________
+[ 4135] By: jhi on 1999/09/13 10:22:31
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_61] MakeMaker supports uninstalled Perls
+ Date: Sat, 11 Sep 1999 05:31:03 -0400 (EDT)
+ Message-Id: <199909110931.FAA11036@monk.mps.ohio-state.edu>
+
+ From: andreas.koenig@anima.de (Andreas J. Koenig)
+ To: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Cc: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: Re: [PATCH 5.005_61] MakeMaker supports uninstalled Perls
+ Date: 11 Sep 1999 15:36:26 +0200
+ Message-ID: <sfc906dr2n9.fsf@hohenstaufen.in-berlin.de>
+ Branch: cfgperl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 4134] By: jhi on 1999/09/13 10:20:14
+ Log: From: Tom Phoenix <rootbeer@redcat.com>
+ To: Perl Porters Mailing List <perl5-porters@perl.org>
+ Subject: [DOCPATCH] Server errors and perldiag
+ Date: Fri, 10 Sep 1999 16:45:02 -0700 (PDT)
+ Message-ID: <Pine.GSO.4.10.9909101639490.16999-100000@user2.teleport.com>
+ Branch: cfgperl
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 4133] By: gsar on 1999/09/13 03:25:43
+ Log: avoid assertion failure on C<@a'>
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 4132] By: gsar on 1999/09/13 03:03:57
+ Log: add -DPERL_Y2KWARN build option that will generate additional
+ warnings on "19$yy" etc (reworked a patch suggested by
+ Ulrich Pfeifer <upf@de.uu.net>)
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perllexwarn.pod
+ ! pp_hot.c sv.c t/pragma/warn/pp_hot t/pragma/warn/sv
+____________________________________________________________________________
+[ 4131] By: gsar on 1999/09/12 22:06:25
+ Log: fix DATA leaks; reword documentation about the DATA filehandle
+ Branch: perl
+ ! ext/Opcode/Safe.pm lib/Pod/Functions.pm pod/perldata.pod
+____________________________________________________________________________
+[ 4130] By: gsar on 1999/09/12 20:08:56
+ Log: make sprintf("%g",...) threadsafe; only taint its result iff the
+ formatted result looks nonstandard
+ Branch: perl
+ ! embed.pl embedvar.h intrpvar.h objXSUB.h perl.c perlapi.c
+ ! pod/perlfunc.pod pod/perlguts.pod proto.h sv.c
+ ! t/pragma/locale.t thrdvar.h
+____________________________________________________________________________
+[ 4129] By: gsar on 1999/09/12 17:04:11
+ Log: From: Doug MacEachern <dougm@cp.net>
+ Date: Sun, 25 Jul 1999 15:49:00 -0700 (PDT)
+ Message-ID: <Pine.LNX.4.10.9907251538380.373-100000@mojo.eng.cp.net>
+ Subject: [PATCH 5.005_57] B::clearsym
+ Branch: perl
+ ! ext/B/B.pm ext/B/B/Bblock.pm ext/B/B/Debug.pm ext/B/B/Terse.pm
+____________________________________________________________________________
+[ 4128] By: gsar on 1999/09/12 16:59:12
+ Log: better debugger help output (from Ilya Zakharevich)
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 4127] By: jhi on 1999/09/11 20:50:37
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> pod/perlcompile.pod t/lib/gol-basic.t t/lib/gol-compat.t
+ +> t/lib/gol-linkage.t
+ !> (integrate 43 files)
+____________________________________________________________________________
+[ 4126] By: nick on 1999/09/10 20:44:22
+ Log: Get resolve -at mainline
+ Branch: utfperl
+ +> (branch 297 files)
+ - README.cygwin32 XSlock.h bytecode.h byterun.c byterun.h
+ - cygwin32/cw32imp.h cygwin32/gcc2 cygwin32/ld2 cygwin32/perlgcc
+ - cygwin32/perlld ext/B/byteperl.c ext/DynaLoader/dl_cygwin32.xs
+ - hints/cygwin32.sh interp.sym myconfig objpp.h perl_exp.SH
+ - t/pragma/warn-1global t/pragma/warning.t thread.sym
+ - win32/GenCAPI.pl win32/TEST win32/autosplit.pl
+ - win32/bin/network.pl win32/bin/webget.pl win32/bin/www.pl
+ - win32/genxsdef.pl win32/makedef.pl win32/makemain.pl
+ - win32/makeperldef.pl win32/perlhost.h
+ !> (integrate 847 files)
+____________________________________________________________________________
+[ 4125] By: gsar on 1999/09/10 19:22:14
+ Log: s/dXS_TARGET/dXSTARG/ in change#4044 (to match dARGS vs dXSARGS
+ etc.)
+ Branch: perl
+ ! XSUB.h pp.h
+____________________________________________________________________________
+[ 4124] By: gsar on 1999/09/10 19:14:35
+ Log: rewrote substantive parts of patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 27 Aug 1999 19:02:18 -0400
+ Message-ID: <19990827190218.A19561@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_58] REx documentation
+ Branch: perl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 4123] By: gsar on 1999/09/10 18:21:53
+ Log: note about AVf_*
+ Branch: perl
+ ! av.h
+____________________________________________________________________________
+[ 4122] By: gsar on 1999/09/10 17:55:42
+ Log: allow 'text' in L<text|A::B/"C"> (from Martin Lichtin
+ <lichtin@bivio.com>)
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 4121] By: gsar on 1999/09/10 17:49:35
+ Log: dos-djgpp update (from Laszlo Molnar <laszlo.molnar@eth.ericsson.se>)
+ Branch: perl
+ ! AUTHORS Changes README.dos djgpp/config.over
+ ! djgpp/configure.bat djgpp/djgpp.c djgpp/djgppsed.sh dosish.h
+ ! lib/ExtUtils/MM_Unix.pm pod/pod2usage.PL pod/podchecker.PL
+ ! pod/podselect.PL sv.h t/io/openpid.t util.c
+____________________________________________________________________________
+[ 4120] By: gsar on 1999/09/10 12:25:01
+ Log: add perlcompile.pod (edited content from Nathan Torkington
+ <gnat@frii.com> and others)
+ Branch: perl
+ + pod/perlcompile.pod
+ ! MANIFEST pod/Makefile pod/buildtoc pod/perl.pod pod/roffitall
+____________________________________________________________________________
+[ 4119] By: gsar on 1999/09/10 11:05:13
+ Log: avoid leaking static local_patches unless patchlevel.h is
+ explicitly included
+ Branch: perl
+ ! patchlevel.h perl.c
+____________________________________________________________________________
+[ 4118] By: gsar on 1999/09/10 10:44:54
+ Log: upgrade to Getopt::Long v2.20 (from Johan Vromans
+ <jvromans@squirrel.nl>)
+ Branch: perl
+ + t/lib/gol-basic.t t/lib/gol-compat.t t/lib/gol-linkage.t
+ ! Changes MANIFEST lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 4116] By: jhi on 1999/09/09 15:56:52
+ Log: perldeltify change #4115.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 4115] By: jhi on 1999/09/09 15:48:56
+ Log: From: "John L. Allen" <allen@grumman.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990901.003] Time::Local should not croak on "out-of-range" days
+ Date: Wed, 1 Sep 1999 13:33:39 -0400 (EDT)
+ Message-Id: <199909011733.NAA17356@gateway.grumman.com>
+ Branch: cfgperl
+ ! lib/Time/Local.pm
+____________________________________________________________________________
+[ 4114] By: jhi on 1999/09/09 15:42:30
+ Log: From: "Daniel S. Lewart" <lewart@www.cvm.uiuc.edu>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990909.003] MAXINT redefined warning on HP-UX 10.20
+ Date: Thu, 9 Sep 1999 10:33:37 -0500 (CDT)
+ Message-Id: <199909091533.KAA01242@www.cvm.uiuc.edu>
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 4113] By: jhi on 1999/09/09 10:17:45
+ Log: From: paul.marquess@bt.com
+ To: gsar@ActiveState.com
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.005_61] DB_File 1.71
+ Date: Thu, 9 Sep 1999 11:20:13 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB202D49BBE@mbtlipnt02.btlabs.bt.co.uk>
+ Branch: cfgperl
+ + ext/DB_File/version.c
+ ! MANIFEST ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/Makefile.PL ext/DB_File/dbinfo ext/DB_File/typemap
+ ! t/lib/db-btree.t
+____________________________________________________________________________
+[ 4112] By: jhi on 1999/09/09 09:05:32
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_58] Fix interaction of (?p{}) and (?>)
+ Date: Thu, 9 Sep 1999 04:40:11 -0400 (EDT)
+ Message-Id: <199909090840.EAA26471@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! regexec.c t/op/pat.t
+____________________________________________________________________________
+[ 4110] By: jhi on 1999/09/09 07:29:17
+ Log: Tidy up 64-bit situation in perldelta.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 4109] By: jhi on 1999/09/09 07:26:53
+ Log: Clear up PL_regcc issues.
- Title: "Document sprintf %#x behaviour for zero value"
- From: ilya@math.ohio-state.edu (Ilya Zakharevich)
- Msg-ID: <1997Nov5.185959.2539604@cor.newman>
- Files: pod/perlfunc.pod
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_60] Another regexec.c unobfuscation
+ Date: Thu, 9 Sep 1999 02:49:49 -0400 (EDT)
+ Message-Id: <199909090649.CAA26119@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! regexec.c
+____________________________________________________________________________
+[ 4108] By: gsar on 1999/09/08 20:52:51
+ Log: avoid ass_u_ming uppercase types are not user objects (spotted
+ by Kurt Starsinic)
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.pm
+____________________________________________________________________________
+[ 4107] By: gsar on 1999/09/08 20:35:18
+ Log: From: akim@epita.fr (DEMAILLE Akim)
+ Date: Wed, 8 Sep 1999 18:18:44 +0200 (CEST)
+ Message-Id: <m11OkQm-003A4IC@beyrouth.lrde.epita.fr>
+ Subject: [ID 19990908.014] s2p does not quote @
+ Branch: perl
+ ! x2p/s2p.PL
+____________________________________________________________________________
+[ 4106] By: gsar on 1999/09/08 20:25:12
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ !> (integrate 30 files)
+____________________________________________________________________________
+[ 4105] By: jhi on 1999/09/08 09:02:37
+ Log: Minor touches at the [:class:] description.
+ Branch: cfgperl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 4104] By: jhi on 1999/09/08 08:57:58
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_58] Fix debugging output for REx
+ Date: Wed, 8 Sep 1999 05:02:02 -0400
+ Message-ID: <19990908050201.A17682@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! regcomp.c
+____________________________________________________________________________
+[ 4103] By: gsar on 1999/09/08 00:53:50
+ Log: fix memory leak in C<sub f { split ' ', "a b" } f() while 1>
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 4102] By: gsar on 1999/09/08 00:52:50
+ Log: fix memory leak in C<sub f { @_ = 1 } f() while 1>
+ Branch: perl
+ ! cop.h pp_hot.c
+____________________________________________________________________________
+[ 4101] By: gsar on 1999/09/07 17:25:07
+ Log: various fixups for windows
+ Branch: perl
+ ! embed.h embed.pl objXSUB.h op.c perlapi.c proto.h
+ ! win32/Makefile win32/makefile.mk xsutils.c
+____________________________________________________________________________
+[ 4100] By: jhi on 1999/09/07 12:49:15
+ Log: Fix pointer casts.
- Title: "NUL termination (was Re: STOP THE PRESSES)"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0xsn5M-0002gw-00@ursa.cus.cam.ac.uk>
- Files: pod/perlguts.pod
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990907.004] [PATCH perl5.005_61] compiler warnings with
+ -Duse64bits
+ Date: Tue, 7 Sep 1999 12:30:18 +0100 (BST)
+ Message-Id: <199909071130.MAA11435@tempest.npl.co.uk>
+ Branch: cfgperl
+ ! doio.c dump.c ext/B/B.xs ext/B/typemap
+ ! ext/ByteLoader/bytecode.h ext/Devel/DProf/DProf.xs
+ ! ext/DynaLoader/dl_dlopen.xs ext/ODBM_File/ODBM_File.xs
+ ! ext/POSIX/POSIX.xs lib/ExtUtils/typemap malloc.c perl.h pp.c
+ ! pp_ctl.c pp_hot.c pp_sys.c sv.c
+____________________________________________________________________________
+[ 4099] By: jhi on 1999/09/07 10:29:04
+ Log: Add sig/pid/uid size and sign probes.
+ Branch: metaconfig
+ + U/typedefs/gidsign.U U/typedefs/gidsize.U U/typedefs/pidsign.U
+ + U/typedefs/pidsize.U U/typedefs/uidsign.U U/typedefs/uidsize.U
+____________________________________________________________________________
+[ 4098] By: jhi on 1999/09/07 10:27:06
+ Log: Band-aid until we've got %{Uid_t} or something similar
+ for sv_catpvfn().
+ Branch: cfgperl
+ ! taint.c
+____________________________________________________________________________
+[ 4097] By: jhi on 1999/09/07 09:41:23
+ Log: Fix a printf thinko: now quads must have the ll L q prefix.
+ (in other words, a bare %d is an int/unsigned)
+ Branch: cfgperl
+ ! pp_sys.c sv.c t/op/64bit.t
+____________________________________________________________________________
+[ 4096] By: jhi on 1999/09/07 07:36:17
+ Log: HP-UX 10.20 and gcc 2.8.1 break UINT32_MAX.
- Title: "Typo fix."
- From: abigail@fnx.com
- Msg-ID: <19971101120114.1030.qmail@betelgeuse.wayne.fnx.com>
- Files: pod/perlop.pod pod/perlvar.pod
+ From: "Daniel S. Lewart" <lewart@www.cvm.uiuc.edu>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990906.007] Not OK: perl 5.00561 on PA-RISC1.1 10.20
+ Date: Mon, 6 Sep 1999 21:18:12 -0500 (CDT)
+ Message-Id: <199909070218.VAA29232@www.cvm.uiuc.edu>
+ Branch: cfgperl
+ ! hints/hpux.sh perl.h
+____________________________________________________________________________
+[ 4095] By: gsar on 1999/09/06 20:47:02
+ Log: applied suggested patch with suitable test to detect MSVC
+ From: "Vishal Bhatia" <vishalb@my-deja.com>
+ Date: Wed, 11 Aug 1999 01:43:28 -0700
+ Message-ID: <GFCJELIOGEENAAAA@my-deja.com>
+ Subject: compiler on win32
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 4094] By: jhi on 1999/09/06 20:34:44
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> ext/B/B/Bytecode.pm lib/Test/Harness.pm t/TEST t/UTEST
+ !> t/harness t/pragma/sub_lval.t utils/Makefile utils/perlcc.PL
+____________________________________________________________________________
+[ 4093] By: jhi on 1999/09/06 20:33:43
+ Log: Fix UV_SIZEOF to UVSIZE; change the overflow tests
+ so that they overflow also on 64-bit platforms.
+ Branch: cfgperl
+ ! t/pragma/warn/toke t/pragma/warn/util toke.c util.c
+____________________________________________________________________________
+[ 4092] By: gsar on 1999/09/06 20:16:58
+ Log: support bytecode and C backends in perlcc (patch suggested
+ by Tom Hughes <tom@compton.au>); s/-opt/-noopt/ and make the
+ C backend the default; describe new switches in pod; introduce
+ PERLCC_OPTS and s/COMPILE_TIMEOUT/PERLCC_TIMEOUT/;
+ s/COMPILE_TEST/HARNESS_COMPILE_TEST/; document these %ENV
+ entries
+ Branch: perl
+ ! ext/B/B/Bytecode.pm lib/Test/Harness.pm t/TEST t/UTEST
+ ! t/harness utils/Makefile utils/perlcc.PL
+____________________________________________________________________________
+[ 4091] By: jhi on 1999/09/06 19:10:41
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/pragma/sub_lval.t
+ !> (integrate 52 files)
+____________________________________________________________________________
+[ 4090] By: gsar on 1999/09/06 19:09:06
+ Log: propagate changed error text
+ Branch: perl
+ ! t/pragma/sub_lval.t
+____________________________________________________________________________
+[ 4089] By: gsar on 1999/09/06 18:54:43
+ Log: sprintf doc tweak (from Ian Phillipps <ian@dial.pipex.com>)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 4088] By: gsar on 1999/09/06 18:52:10
+ Log: From: paul.marquess@bt.com
+ Date: Sun, 5 Sep 1999 15:11:08 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB202D49BAB@mbtlipnt02.btlabs.bt.co.uk>
+ Subject: [PATCH 5.005_61] Another patch for Lexical Warnings
+ Branch: perl
+ ! pp_sys.c t/pragma/warn/doio t/pragma/warn/op
+ ! t/pragma/warn/pp_hot t/pragma/warn/pp_sys
+ ! t/pragma/warn/regcomp t/pragma/warn/sv t/pragma/warn/toke
+ ! t/pragma/warn/universal t/pragma/warn/utf8 t/pragma/warn/util
+ ! toke.c
+____________________________________________________________________________
+[ 4087] By: gsar on 1999/09/06 18:06:06
+ Log: change#3612 is buggy when quotemeta argument matches target
+ (hope this is the last of the optimized-OP_SASSIGN bugs)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 5 Sep 1999 06:07:42 -0400 (EDT)
+ Message-Id: <199909051007.GAA06423@monk.mps.ohio-state.edu>
+ Subject: Re: [BUG: quotemeta]
+ Branch: perl
+ ! Changes op.c t/op/lex_assign.t
+____________________________________________________________________________
+[ 4086] By: gsar on 1999/09/06 17:57:52
+ Log: misc tweaks
+ Branch: perl
+ ! bytecode.pl ext/ByteLoader/byterun.h pod/perlsyn.pod toke.c
+____________________________________________________________________________
+[ 4085] By: gsar on 1999/09/06 03:54:23
+ Log: applied patch suggested by Hans Mulder to fix problems on
+ OPENSTEP-Mach; be more careful about PERL_POLLUTE_MALLOC
+ when they ask for bincompat (platforms that used to default
+ to EMBEDMYMALLOC continue to do so); disable warnings.t#192
+ (appears unsalvageable on some platforms)
+ Branch: perl
+ ! embed.h embed.pl handy.h perl.h pp_sys.c t/pragma/warn/pp_hot
+____________________________________________________________________________
+[ 4084] By: bailey on 1999/09/06 02:39:11
+ Log: Integrate mainline 5.05_61
+ Branch: vmsperl
+ +> (branch 32 files)
+ - lib/unicode/EthiopicSyllables.txt
+ - lib/unicode/MakeEthiopicSyllables.PL t/pragma/warning.t
+ - warning.pl
+ ! vms/descrip_mms.template vms/gen_shrfls.pl vms/perly_c.vms
+ ! vms/perly_h.vms vms/vms.c
+ !> (integrate 346 files)
+____________________________________________________________________________
+[ 4083] By: gsar on 1999/09/06 00:10:40
+ Log: optional warning on join(/foo/...) (reworked suggested patch
+ by Mark-Jason Dominus <mjd@plover.com>)
+ Branch: perl
+ ! embed.h objXSUB.h op.c opcode.h opcode.pl perlapi.c
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod pp.sym
+ ! pp_proto.h t/pragma/warn/op
+____________________________________________________________________________
+[ 4082] By: gsar on 1999/09/05 22:28:57
+ Log: fix data loss when more than one block is read from SDBM
+ *.dir file (suggested by Uwe Ohse <uwe@ohse.de>)
+ Branch: perl
+ ! ext/SDBM_File/sdbm/sdbm.c
+____________________________________________________________________________
+[ 4081] By: gsar on 1999/09/05 22:07:18
+ Log: initial implementation of lvalue subroutines (slightly fixed
+ version of patch suggested by Ilya Zakharevich, which in turn
+ is based on the one suggested by Tuomas J. Lukka <lukka@iki.fi>)
+ Branch: perl
+ + t/pragma/sub_lval.t
+ ! MANIFEST cop.h cv.h dump.c embed.h ext/Opcode/Opcode.pm
+ ! ext/attrs/attrs.pm ext/attrs/attrs.xs global.sym objXSUB.h
+ ! op.c op.h opcode.h opcode.pl opnames.h perlapi.c
+ ! pod/perldiag.pod pod/perlsub.pod pp.c pp.sym pp_hot.c
+ ! pp_proto.h proto.h t/pragma/warn/pp_ctl
+____________________________________________________________________________
+[ 4080] By: jhi on 1999/09/05 22:02:18
+ Log: Undo #4055 (related to #4079).
+ Branch: cfgperl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 4079] By: jhi on 1999/09/05 21:30:54
+ Log: Time is not yet ripe.
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perlop.pod pp.c t/op/64bit.t t/op/misc.t
+____________________________________________________________________________
+[ 4078] By: gsar on 1999/09/05 18:17:32
+ Log: modified suggested patch to handle cross-refs and qr// objects
+ correctly; unfollowed refs are represented as simple string
+ value, not just the bare type; $VERSION stays the same until
+ it is ready for prime time (avoids CPAN confustication)
+ From: John Nolan <jpnolan@Op.Net>
+ Date: Wed, 04 Aug 1999 20:21:10 EDT
+ Message-Id: <199908050021.UAA09693@monet.op.net>
+ Subject: [ID 19990804.006] [PATCH]5.005_60 (Data::Dumper) - implements Maxdepth setting
+ Branch: perl
+ ! Changes ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
+ ! ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Todo t/lib/dumper.t
+____________________________________________________________________________
+[ 4077] By: jhi on 1999/09/04 21:54:42
+ Log: timesum() wasn't @EXPORTed as promised by the documentation.
+ Bug reported by Alex Efros <powerman@inart.kharkov.com>.
+ Branch: cfgperl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 4076] By: gsar on 1999/09/04 20:21:59
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> lib/attributes.pm lib/warnings.pm t/lib/attrs.t t/op/attrs.t
+ +> t/pragma/warn/7fatal t/pragma/warn/8signal t/pragma/warnings.t
+ +> warnings.h warnings.pl xsutils.c
+ - lib/warning.pm t/pragma/warning.t warning.h warning.pl
+ !> (integrate 109 files)
+____________________________________________________________________________
+[ 4075] By: jhi on 1999/09/04 18:04:47
+ Log: use integer on the problematic subtest.
+ Branch: cfgperl
+ ! t/op/misc.t
+____________________________________________________________________________
+[ 4074] By: jhi on 1999/09/04 17:57:40
+ Log: Warn about numconvert.t in case somebody
+ wants to make sv_2pv more 64-bit aware.
+ Branch: cfgperl
+ ! sv.c
+____________________________________________________________________________
+[ 4073] By: jhi on 1999/09/04 17:54:51
+ Log: Comment upgrading: the quad situation isn't quite as
+ bad as it used to be.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4072] By: jhi on 1999/09/04 15:35:37
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> win32/win32.c
+____________________________________________________________________________
+[ 4071] By: jhi on 1999/09/04 15:28:11
+ Log: Fix LFS with -Duseperlio in Solaris. Reported in
- Title: "5.004_63 perlrun.pod: _DEBUG_MSTATS"
- From: Achim Bohnet <ach@mpe.mpg.de>
- Msg-ID: <9803181940.AA22587@o09.xray.mpe.mpg.de>
- Files: pod/perlrun.pod
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990823.009] [PATCH perl5.005_61] typo in perl.h
+ Date: Mon, 23 Aug 1999 16:41:11 +0100 (BST)
+ Message-Id: <199908231541.QAA10043@tempest.npl.co.uk>
+
+ and later (in private email) found to be dependent
+ on useperlio.
+
+ Mental note: the cpp magic done in perlsdio.h (and assumedly
+ also in perlsfio.h) may cause trouble later with lfs because
+ both the perlio scheme by Perl and the lfs support by vendors
+ like to play cpp games to map the stdio namespace back and forth.
+ The problem fixed here (fseek vs fseeko, ftell vs ftello) may be
+ just the beginning.
+ Branch: cfgperl
+ ! perlio.c
+____________________________________________________________________________
+[ 4070] By: jhi on 1999/09/04 13:12:14
+ Log: Enable 64-bit clean bit ops.
+ (Disables the t/op/misc.t substest 3 in 64-bit platforms.)
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perlop.pod pp.c pp_hot.c t/op/64bit.t
+ ! t/op/misc.t
+____________________________________________________________________________
+[ 4069] By: jhi on 1999/09/03 21:17:30
+ Log: Turn on USE_64_BIT_OFFSETS implicitly.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4068] By: jhi on 1999/09/03 08:19:59
+ Log: Fix from Spider for the sub attributes (there was an undocumented
+ dependency between force_word() and skipspace()).
+ Branch: cfgperl
+ ! toke.c
+____________________________________________________________________________
+[ 4067] By: jhi on 1999/09/01 23:17:06
+ Log: From: John Tobey <spam@john-edwin-tobey.org>
+ To: ilya@math.ohio-state.edu
+ CC: perl5-porters@perl.org
+ Subject: Re: [PATCH 5.005_60] distclean forgot two
+ Date: Mon, 23 Aug 1999 02:10:11 -0400 (EDT)
+ Message-Id: <m11InJ5-000FPCC@feynman.localnet>
+ Branch: cfgperl
+ ! t/lib/dprof.t
+____________________________________________________________________________
+[ 4066] By: jhi on 1999/09/01 23:14:50
+ Log: From: "Fifer, Eric" <EFifer@sanwaint.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990821.001] [PATCH] perl5.005_60 cygwin port
+ Date: Fri, 20 Aug 1999 15:37:27 +0100
+ Message-Id: <8A160D637356D311BC4300600849EC8122E217@POST>
+ Branch: cfgperl
+ ! cygwin/Makefile.SHs ext/ByteLoader/byterun.h
+ ! ext/SDBM_File/sdbm/sdbm.c hints/cygwin.sh perl.h pp_sys.c
+ ! t/io/fs.t t/io/tell.t t/lib/anydbm.t t/op/stat.t
+____________________________________________________________________________
+[ 4065] By: jhi on 1999/09/01 22:06:43
+ Log: From: Dominic Dunlop <domo@vo.lu>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990819.001] Not OK: perl 5.00560 on powerpc-machten 4.1.1
+ (UNINSTALLED) [PATCH]
+ Date: Thu, 19 Aug 1999 09:48:03 +0200
+ Message-Id: <v03110709b3e165b51dda@[212.24.192.132]>
- Title: "Re: Conservative C<*x = undef> patch"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0yCjHT-0005Dt-00@ursa.cus.cam.ac.uk>
- Files: pod/perltrap.pod
+ The PERL_POLLUTE_MALLOC part had to be manually applied.
+ Branch: cfgperl
+ ! hints/machten.sh perl.h
+____________________________________________________________________________
+[ 4064] By: jhi on 1999/09/01 13:56:14
+ Log: From: Martin Lichtin <lichtin@bivio.com>
+ To: jhi@iki.fi
+ CC: perl5-porters@perl.org
+ Subject: Re: [ID 19990829.001] ExtUtils::Install.pm, minor umask problem
+ Date: Wed, 01 Sep 1999 15:50:04 +0200
+ Message-ID: <37CD2F0C.944BFACE@bivio.com>
+ Branch: cfgperl
+ ! lib/ExtUtils/Install.pm
+____________________________________________________________________________
+[ 4063] By: jhi on 1999/09/01 13:16:11
+ Log: Enhance lfs tests: check every seek and sysseek
+ and test also that -e and -f detect largefiles.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 4062] By: jhi on 1999/09/01 12:08:04
+ Log: From: Colin Kuskie <ckuskie@Cadence.COM>
+ To: Ronald J Kimball <rjk@linguist.dartmouth.edu>
+ cc: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>,
+ The Perl Porters Mailing List <perl5-porters@perl.org>
+ Subject: [REPATCH 5.005_61] Re: perldiag.pod omissions
+ Date: Tue, 31 Aug 1999 11:24:31 -0700 (PDT)
+ Message-ID: <Pine.GSO.4.10.9908311055460.11290-100000@pdxult10a.cadence.com>
+ Branch: cfgperl
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 4061] By: jhi on 1999/09/01 12:03:03
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: ilya@math.ohio-state.edu (Ilya Zakharevich)
+ Cc: perl5-porters@perl.org, cloos@adamsmith.ai
+ Subject: Re: [ID 19990830.005] Assigning value of an op on an SV to said SV
+ Date: Wed, 1 Sep 1999 02:56:06 -0400 (EDT)
+ Message-Id: <199909010656.CAA04478@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! op.c t/op/join.t
+____________________________________________________________________________
+[ 4060] By: jhi on 1999/09/01 07:59:42
+ Log: IV_DIG and NV_DIG fixes.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4059] By: jhi on 1999/08/31 14:47:18
+ Log: \C{} -> \N{} residue.
+ Branch: cfgperl
+ ! toke.c
+____________________________________________________________________________
+[ 4057] By: gsar on 1999/08/30 22:08:19
+ Log: avoid hiding child process window
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 4055] By: jhi on 1999/08/30 21:20:50
+ Log: Document the undefinedness of overshifting.
+ Branch: cfgperl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 4054] By: jhi on 1999/08/30 20:18:18
+ Log: History fixes and updates.
+ Branch: cfgperl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 4053] By: jhi on 1999/08/30 19:34:02
+ Log: Shell quoting thinko broke installdirs.
+ From: JVromans@Squirrel.nl (Johan Vromans)
+ To: perl5-porters@perl.org
+ Subject: [ID 19990830.001] 5.005_61 Configure does not substitute
+ installprefix
+ Date: Mon, 30 Aug 1999 16:10:10 +0200 (MEST)
+ Message-Id: <14282.37058.934928.805633@plume.nl.compuware.com>
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/installdirs/archlib.U U/installdirs/bin.U
+ ! U/installdirs/html1dir.U U/installdirs/html3dir.U
+ ! U/installdirs/installprefix.U U/installdirs/man1dir.U
+ ! U/installdirs/man3dir.U U/installdirs/privlib.U
+ ! U/installdirs/scriptdir.U U/installdirs/sitearch.U
+ ! U/installdirs/sitebin.U U/installdirs/sitehtml1dir.U
+ ! U/installdirs/sitehtml3dir.U U/installdirs/sitelib.U
+ ! U/installdirs/siteman1dir.U U/installdirs/siteman3dir.U
+ ! U/installdirs/sitescriptdir.U U/installdirs/vendorarch.U
+ ! U/installdirs/vendorbin.U U/installdirs/vendorhtml1dir.U
+ ! U/installdirs/vendorhtml3dir.U U/installdirs/vendorlib.U
+ ! U/installdirs/vendorman1dir.U U/installdirs/vendorman3dir.U
+ ! U/installdirs/vendorscriptdir.U
+____________________________________________________________________________
+[ 4052] By: jhi on 1999/08/30 02:57:05
+ Log: Use \N{named characters} instead of \C.
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: jhi@iki.fi
+ Cc: larry@wall.org (Larry Wall), Tim.Bunce@ig.co.uk (Tim Bunce),
+ perl5-porters@perl.org (Mailing list Perl5)
+ Subject: Re: [PATCH 5.005_58] Named characters in Perl
+ Date: Sun, 29 Aug 1999 16:46:53 -0400 (EDT)
+ Message-Id: <199908292046.QAA05510@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! lib/charnames.pm lib/utf8.pm pod/perldiag.pod pod/perlop.pod
+ ! pod/perlre.pod regcomp.c t/lib/charnames.t toke.c
+____________________________________________________________________________
+[ 4051] By: jhi on 1999/08/30 02:54:20
+ Log: From: Spider Boardman <spider@Orb.Nashua.NH.US>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990829.004] Autoloaded &VERSION and UNIVERSAL::VERSION
+ don't mix
+ Date: Sun, 29 Aug 1999 19:04:53 -0400
+ Message-Id: <199908292304.TAA13738@Orb.Nashua.NH.US>
+ Branch: cfgperl
+ ! universal.c
+____________________________________________________________________________
+[ 4050] By: jhi on 1999/08/29 16:38:58
+ Log: Conditionally socksify the LIBS of Socket.
+ Branch: cfgperl
+ ! ext/Socket/Makefile.PL
+____________________________________________________________________________
+[ 4049] By: jhi on 1999/08/29 15:33:30
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: Re: [PATCH 5.005_60] fix @DB::typeahead
+ Date: Wed, 25 Aug 1999 16:19:58 -0400
+ Message-ID: <19990825161958.A4658@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 4048] By: jhi on 1999/08/29 15:31:36
+ Log: From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ To: perl5-porters@perl.org
+ Subject: [PATCH _61] Lost arguments to simplified sort
+ Date: Wed, 25 Aug 1999 23:22:32 -0700 (PDT)
+ Message-ID: <14276.56616.879390.562685@metonymy.hip.berkeley.edu>
+ Branch: cfgperl
+ ! op.c t/op/sort.t
+____________________________________________________________________________
+[ 4047] By: jhi on 1999/08/29 15:29:29
+ Log: From: Olaf Flebbe <olaf@science-computing.de>
+ Sender: owner-perl5-porters@perl.org
+ To: perl5-porters@perl.org
+ Subject: [ID 19990827.003] [PATCH]5.005_60 Patch for EPOC Support
+ Date: Fri, 27 Aug 1999 21:50:41 +0200 (MEST)
+ Branch: cfgperl
+ ! README.epoc epoc/config.h epoc/epoc.c epoc/epocish.h
+ ! epoc/perl.mmp epoc/perl.pkg
+____________________________________________________________________________
+[ 4046] By: jhi on 1999/08/29 15:21:18
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: perl5-porters@perl.org
+ Subject: [PATCH: 5.005_61] an EBCDIC friendly cgi-html.t test
+ Date: Fri, 27 Aug 99 18:51:04 PDT
+ Message-Id: <9908280151.AA05010@forte.com>
+ Branch: cfgperl
+ ! t/lib/cgi-html.t
+____________________________________________________________________________
+[ 4045] By: jhi on 1999/08/29 15:18:38
+ Log: Fix scalar gmtime (and localtime) in quad environments,
+ bug reported by Robin Parker.
- Title: "perlfunc.pod for flock()"
- From: "Jeremy D. Zawodny" <jzawodn@wcnet.org>
- Msg-ID: <3.0.5.32.19971118203119.00a723e0@woody.wcnet.org>
- Files: pod/perlfunc.pod
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ To: jhi@iki.fi
+ Cc: perl5-porters@perl.org
+ Subject: Re: [ID 19990823.009] [PATCH perl5.005_61] typo in perl.h
+ Date: Tue, 24 Aug 1999 11:09:24 +0100 (BST)
+ Message-Id: <199908241009.LAA24394@tempest.npl.co.uk>
+ Branch: cfgperl
+ ! pp_sys.c t/op/time.t
+____________________________________________________________________________
+[ 4044] By: jhi on 1999/08/29 11:24:03
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_60] Speeding up XSUB calls up to 66%
+ Date: Fri, 27 Aug 1999 03:33:01 -0400 (EDT)
+ Message-Id: <199908270733.DAA16927@monk.mps.ohio-state.edu>
- Title: "buglet: 'perltoc' not mentioned in perl.pod"
- From: Tkil <tkil@scrye.com>
- Msg-ID: <19971127035036.17668.qmail@scrye.com>
- Files: pod/perl.pod
+ Addendum: it's "only" 33% speedup.
+ Branch: cfgperl
+ ! dump.c op.c op.h pp.h
+____________________________________________________________________________
+[ 4043] By: jhi on 1999/08/29 11:10:33
+ Log: From: spider-perl@Orb.Nashua.NH.US
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_61 CORE] sub : attrlist
+ Date: Sun, 29 Aug 1999 03:02:11 -0400
+ Message-Id: <199908290702.DAA32191@Orb.Nashua.NH.US>
+ Branch: cfgperl
+ + lib/attributes.pm t/lib/attrs.t t/op/attrs.t xsutils.c
+ ! MANIFEST Makefile.SH embed.h embed.pl embedvar.h global.sym
+ ! gv.c lib/AutoSplit.pm lib/SelfLoader.pm objXSUB.h op.c perl.c
+ ! perl.h perlapi.c perlapi.h perly.c perly.fixer perly.h perly.y
+ ! perly_c.diff pod/perldelta.pod pod/perldiag.pod
+ ! pod/perlfunc.pod pod/perlmodlib.pod pod/perlsub.pod proto.h
+ ! toke.c vms/perly_c.vms vms/perly_h.vms warnings.h
+____________________________________________________________________________
+[ 4042] By: jhi on 1999/08/29 11:08:50
+ Log: Turn off gcc-2.95's strict-alias optimization.
+ This, of course, should be only temporary.
+ From Andy Dougherty.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/compline/ccflags.U U/modified/cc.U
+____________________________________________________________________________
+[ 4041] By: jhi on 1999/08/29 10:47:30
+ Log: Fix a typo in #4036.
+ Branch: cfgperl
+ ! mg.c
+____________________________________________________________________________
+[ 4040] By: jhi on 1999/08/29 10:34:58
+ Log: Add a missing #endif forgotten by #4035.
+ Branch: cfgperl
+ ! doop.c
+____________________________________________________________________________
+[ 4039] By: jhi on 1999/08/29 10:31:19
+ Log: Remove an extra #endif introduced by #4036.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4038] By: jhi on 1999/08/29 10:18:59
+ Log: Rename warning to warnings, from Paul Marquess.
+ Branch: cfgperl
+ + lib/warnings.pm t/pragma/warn/7fatal t/pragma/warn/8signal
+ + t/pragma/warnings.t warnings.h warnings.pl
+ - lib/warning.pm t/pragma/warning.t warning.h warning.pl
+ ! MANIFEST Makefile.SH gv.c mg.c perl.h pod/perldelta.pod
+ ! pod/perldiag.pod pod/perlfunc.pod pod/perllexwarn.pod
+ ! pod/perlmodlib.pod pod/perlrun.pod pod/perltoc.pod
+ ! pod/perlvar.pod t/op/64bit.t t/op/tie.t t/pragma/warn/2use
+ ! t/pragma/warn/3both t/pragma/warn/4lint t/pragma/warn/5nolint
+ ! t/pragma/warn/6default t/pragma/warn/doio t/pragma/warn/doop
+ ! t/pragma/warn/gv t/pragma/warn/mg t/pragma/warn/op
+ ! t/pragma/warn/perl t/pragma/warn/perly t/pragma/warn/pp
+ ! t/pragma/warn/pp_ctl t/pragma/warn/pp_hot t/pragma/warn/pp_sys
+ ! t/pragma/warn/regcomp t/pragma/warn/regexec t/pragma/warn/sv
+ ! t/pragma/warn/taint t/pragma/warn/toke t/pragma/warn/universal
+ ! t/pragma/warn/utf8 t/pragma/warn/util toke.c
+____________________________________________________________________________
+[ 4037] By: jhi on 1999/08/29 10:08:47
+ Log: Create the equivalence tables based on
+ the real Unicode decomposition, not on
+ the character name.
+ Branch: cfgperl
+ ! lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ ! lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 4036] By: jhi on 1999/08/29 09:29:08
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/unicode/Is/SylA.pl lib/unicode/Is/SylC.pl
+ +> lib/unicode/Is/SylE.pl lib/unicode/Is/SylI.pl
+ +> lib/unicode/Is/SylO.pl lib/unicode/Is/SylU.pl
+ +> lib/unicode/Is/SylV.pl lib/unicode/Is/SylWA.pl
+ +> lib/unicode/Is/SylWC.pl lib/unicode/Is/SylWE.pl
+ +> lib/unicode/Is/SylWI.pl lib/unicode/Is/SylWV.pl
+ !> (integrate 190 files)
+____________________________________________________________________________
+[ 4035] By: jhi on 1999/08/29 08:56:15
+ Log: Implement 64-bit vec().
+ Branch: cfgperl
+ ! doop.c pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! pp.h t/op/64bit.t
+____________________________________________________________________________
+[ 4034] By: gsar on 1999/08/29 03:35:18
+ Log: deadcode removal
+ Branch: perl
+ ! XSUB.h embed.h embed.pl global.sym mg.c op.c perl.h perlapi.h
+ ! pp_ctl.c proto.h run.c sv.c
+____________________________________________________________________________
+[ 4033] By: jhi on 1999/08/28 17:31:07
+ Log: From: Robin Barker <rmb1@cise.npl.co.uk>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990823.009] [PATCH perl5.005_61] typo in perl.h
+ Date: Mon, 23 Aug 1999 16:41:11 +0100 (BST)
+ Message-Id: <199908231541.QAA10043@tempest.npl.co.uk>
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4032] By: gsar on 1999/08/26 23:53:33
+ Log: new thread should set current interp in TLS
+ Branch: perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 4031] By: bailey on 1999/08/23 03:40:07
+ Log: When extension doesn't have a "main" object file to anchor linker search, pull in all objct files
+ Branch: vmsperl
+ ! lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 4030] By: bailey on 1999/08/23 03:37:43
+ Log: Patch up holes in realclean target
+ Branch: vmsperl
+ ! vms/descrip_mms.template
+____________________________________________________________________________
+[ 4029] By: bailey on 1999/08/23 03:36:24
+ Log: Fix handling of PERL_POLLUTE
+ Branch: vmsperl
+ ! lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 4028] By: bailey on 1999/08/23 03:34:08
+ Log: Update VMS version of perly.h
+ Branch: vmsperl
+ ! vms/perly_h.vms
+____________________________________________________________________________
+[ 4027] By: bailey on 1999/08/23 03:32:45
+ Log: Update dependencies in Descrip.MMS
+ Branch: vmsperl
+ ! vms/descrip_mms.template
+____________________________________________________________________________
+[ 4026] By: bailey on 1999/08/23 03:30:01
+ Log: Fix prototypes in perlapi.c (64-bit?)
+ Clear prior definition of getenv_len before defining VMS-specific macro
+ Branch: vmsperl
+ ! perlapi.c vms/vmsish.h
+____________________________________________________________________________
+[ 4025] By: bailey on 1999/08/23 03:25:51
+ Log: Add '-m' option to Configure.com which skips the MANIFEST check
+ Branch: vmsperl
+ ! configure.com
+____________________________________________________________________________
+[ 4024] By: bailey on 1999/08/23 03:23:34
+ Log: Skip open() tests that rely on Unix fork semantics
+ Branch: vmsperl
+ ! t/io/open.t
+____________________________________________________________________________
+[ 4023] By: bailey on 1999/08/23 03:21:46
+ Log: Loosen conditons for recognizing a function name in perl.h to accomodate revisions
+ Branch: vmsperl
+ ! vms/gen_shrfls.pl
+____________________________________________________________________________
+[ 4022] By: bailey on 1999/08/23 03:17:33
+ Log: update MM_VMS to use new File::Spec routines
+ Branch: vmsperl
+ ! lib/ExtUtils/MM_VMS.pm lib/File/Spec/VMS.pm
+____________________________________________________________________________
+[ 4021] By: bailey on 1999/08/23 03:13:40
+ Log: byteperl is now part of the ByteLoader ext
+ Branch: vmsperl
+ ! ext/ByteLoader/byterun.h vms/descrip_mms.template
+____________________________________________________________________________
+[ 4020] By: bailey on 1999/08/23 03:10:41
+ Log: Allow option to treat barewords at start of Unix paths as simple words rather than logicals
+ Branch: vmsperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 4019] By: bailey on 1999/08/23 03:07:28
+ Log: Update calls for new thread context handling
+ Branch: vmsperl
+ ! ext/Devel/DProf/DProf.xs ext/DynaLoader/dl_vms.xs
+ ! ext/POSIX/POSIX.xs vms/vms.c vms/vmsish.h vms/writemain.pl
+____________________________________________________________________________
+[ 4018] By: bailey on 1999/08/23 03:01:31
+ Log: Allow for file versions in library when looking for .bs files
+ Branch: vmsperl
+ ! ext/DynaLoader/DynaLoader_pm.PL
+____________________________________________________________________________
+[ 4017] By: bailey on 1999/08/23 02:58:55
+ Log: Update VMS configuration procedures for 5.005_60
+ Branch: vmsperl
+ ! configure.com vms/subconfigure.com
+____________________________________________________________________________
+[ 4016] By: gsar on 1999/08/20 22:19:56
+ Log: update Changes
+ Branch: perl
+ ! Changes
+
+----------------
+Version 5.005_61
+----------------
+
+____________________________________________________________________________
+[ 4015] By: gsar on 1999/08/20 22:17:41
+ Log: perl_free() should use PerlMem_free()
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 4014] By: gsar on 1999/08/20 22:10:46
+ Log: win32 tweaks
+ Branch: perl
+ ! XSUB.h mg.c perl.c win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc
+____________________________________________________________________________
+[ 4013] By: gsar on 1999/08/20 22:09:56
+ Log: DEBUG_m() adjusted to internalize dTHX
+ Branch: perl
+ ! malloc.c perl.h util.c
+____________________________________________________________________________
+[ 4012] By: gsar on 1999/08/20 17:51:06
+ Log: make autogenerated files writable
+ Branch: perl
+ ! (edit 171 files)
+____________________________________________________________________________
+[ 4011] By: gsar on 1999/08/20 17:43:47
+ Log: update Changes
+ Branch: perl
+ ! Changes perl.h pod/perldelta.pod pod/perlguts.pod
+____________________________________________________________________________
+[ 4010] By: gsar on 1999/08/20 17:21:53
+ Log: up patchlevel &c
+ Branch: perl
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 4009] By: gsar on 1999/08/20 16:46:26
+ Log: add missing Is/Syl*.pl files
+ Branch: perl
+ + lib/unicode/Is/SylA.pl lib/unicode/Is/SylC.pl
+ + lib/unicode/Is/SylE.pl lib/unicode/Is/SylI.pl
+ + lib/unicode/Is/SylO.pl lib/unicode/Is/SylU.pl
+ + lib/unicode/Is/SylV.pl lib/unicode/Is/SylWA.pl
+ + lib/unicode/Is/SylWC.pl lib/unicode/Is/SylWE.pl
+ + lib/unicode/Is/SylWI.pl lib/unicode/Is/SylWV.pl
+____________________________________________________________________________
+[ 4008] By: gsar on 1999/08/20 16:31:02
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> ext/ByteLoader/hints/sunos.pl lib/charnames.pm
+ +> lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ +> lib/unicode/syllables.txt t/lib/charnames.t t/lib/syslfs.t
+ +> t/op/lfs.t
+ - lib/unicode/EthiopicSyllables.txt
+ - lib/unicode/MakeEthiopicSyllables.PL
+ !> (integrate 261 files)
+____________________________________________________________________________
+[ 4007] By: gsar on 1999/08/20 15:24:08
+ Log: support USE_THREADS+MULTIPLICITY; source compat tweaks for
+ USE_THREADS and MULTIPLICITY; minor pod adjustments
+ Branch: perl
+ ! Porting/patching.pod Todo Todo-5.005 XSUB.h embed.pl
+ ! embedvar.h perl.c perl.h pod/perlguts.pod util.c
+____________________________________________________________________________
+[ 4006] By: jhi on 1999/08/19 19:01:41
+ Log: Tighten the vec() code so that naughty BITS cause an error.
+ Branch: cfgperl
+ ! doop.c
+____________________________________________________________________________
+[ 4005] By: jhi on 1999/08/19 15:55:09
+ Log: Don't document ill-defined vec() bits cases
+ (for which the code doesn't work right in any case)
+ Branch: cfgperl
+ ! pod/perldiag.pod pod/perlfunc.pod
+____________________________________________________________________________
+[ 4004] By: jhi on 1999/08/19 12:49:41
+ Log: Removed duplicated code (in pp.c and mg.c) by introducing
+ do_vecget(). NOTE: the calling convention of do_vecset()
+ changes, too: the `offset' that is assigned to LvTARGOFF(TARG)
+ in pp_vec() is no more multiplied by `size' in pp_vec(),
+ the multiplication is now done in do_vecset().
- Title: "for() and map() peculiarity"
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0y4YAa-0003Qu-00@ursa.cus.cam.ac.uk>
- Files: pod/perlsyn.pod
+ Also fix a cpp thinko in change #4002.
+ Branch: cfgperl
+ ! doop.c embed.h embed.pl embedvar.h global.sym mg.c objXSUB.h
+ ! perl.h perlapi.c pod/perldiag.pod pod/perlfunc.pod pp.c
+ ! proto.h
+____________________________________________________________________________
+[ 4003] By: jhi on 1999/08/18 08:27:22
+ Log: Warn about small spherical distances.
+ Branch: cfgperl
+ ! lib/Math/Trig.pm
+____________________________________________________________________________
+[ 4002] By: jhi on 1999/08/17 09:11:51
+ Log: Enhance IV_FITS_IN_IV (though it's still unused).
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 4001] By: jhi on 1999/08/17 08:13:34
+ Log: From: andreas.koenig@anima.de (Andreas J. Koenig)
+ Message-ID: <sfcogg7ylk7.fsf@hohenstaufen.in-berlin.de>
+ To: The Perl5 Porters Mailing List <perl5-porters@perl.org>
+ Subject: [PATCH] overload.pm str/num confu
+ Date: 17 Aug 1999 08:21:12 +0200
+ Branch: cfgperl
+ ! lib/overload.pm
+____________________________________________________________________________
+[ 4000] By: jhi on 1999/08/17 07:20:23
+ Log: From: merlyn@stonehenge.com (Randal L. Schwartz)
+ To: perl5-porters@perl.org
+ Subject: [ID 19990816.006] small patch to perlobj.pod from 5.005_03
+ Date: 16 Aug 1999 14:24:28 -0700
+ Message-Id: <m1ogg7to4z.fsf@halfdome.holdit.com>
+ Branch: cfgperl
+ ! pod/perlobj.pod
+____________________________________________________________________________
+[ 3999] By: jhi on 1999/08/16 19:49:09
+ Log: Integrate with Nick.
+ Branch: cfgperl
+ !> cop.h op.c perl.c t/op/eval.t t/pragma/warn/op util.c
+____________________________________________________________________________
+[ 3998] By: jhi on 1999/08/16 19:44:29
+ Log: Fix most of the pod2man moanings reported in
- Title: "Re: new text for perlsec"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.980328100418.22321T-100000@user2.teleport.com>
- Files: pod/perlsec.pod
+ From: "Larry W. Virden" <lvirden@cas.org>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990803.011] Not OK: perl 5.00560 on sun4-solaris 2.6
+ (UNINSTALLED)
+ Date: Tue, 3 Aug 1999 15:35:06 -0400 (EDT)
+ Message-Id: <199908031935.PAA27692@cas.org>
- Title: "perldsc's debugger x command"
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <10669.878352893@eeyore.ibcinc.com>
- Files: pod/perldsc.pod
+ Configure regen'ed.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH ext/B/B/Stash.pm lib/Carp/Heavy.pm
+ ! lib/Dumpvalue.pm lib/Exporter/Heavy.pm lib/filetest.pm
+ ! lib/utf8.pm pod/perllexwarn.pod pod/perlxstut.pod
+ ! utils/h2xs.PL utils/perlcc.PL
+____________________________________________________________________________
+[ 3997] By: jhi on 1999/08/16 19:20:37
+ Log: A fix of sorts for the flush-before-dup scenario.
+ Branch: cfgperl
+ ! doio.c
+____________________________________________________________________________
+[ 3996] By: jhi on 1999/08/16 19:14:37
+ Log: More paranoia.
+ Branch: cfgperl
+ ! sv.c
+____________________________________________________________________________
+[ 3995] By: jhi on 1999/08/16 18:55:35
+ Log: Batch of small 64-bit/long double/large file support tweaks:
+ - scan for LDBL_DIG
+ - from DBL_DIG and LDBL_DIG select NV_DIG
+ - introduce IVSIZE, UVSIZE, NVSIZE
+ - introduce IV_DIG
+ - remove stdio64
+ - AIX uses `oslevel` when others use `uname -r`
+ - already AIX 4.2 goes 64-bit
+ - in HP-UX require the 64-bit libc, just the directory isn't enough
+ - group ids are not NVs
+ - #undef USE_LONG_DOUBLE if long double is no better than double
+ - introduce NV_WITHIN_*() and IV_FITS_IN_IV
+ - mention large file support in perldelta
+ - introduce quad TOPpin' and POPpin'
+ - the svcat... buffer was tiny for printing quads in %b
+ - fix the multiplication test in 64bit.t
+ - try to make VMS to comply with all this removal and "introducal"
+ of symbols
+ Branch: cfgperl
+ ! Configure config_h.SH dump.c hints/aix.sh hints/hpux.sh mg.c
+ ! perl.h perlio.c pod/perldelta.pod pp.h sv.c t/lib/syslfs.t
+ ! t/op/64bit.t t/op/lfs.t utf8.c vms/subconfigure.com
+ Branch: metaconfig
+ ! U/modified/d_longdbl.U
+ Branch: metaconfig/U/perl
+ + d_ldbl_dig.U
+____________________________________________________________________________
+[ 3994] By: jhi on 1999/08/16 07:53:44
+ Log: More Configure/subconfigure.com syncing.
+ Branch: cfgperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 3993] By: jhi on 1999/08/14 22:09:26
+ Log: Remove from VMS what the change #3982 took away from Configure lands.
+ Branch: cfgperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 3992] By: jhi on 1999/08/14 13:29:13
+ Log: Small test tweaks.
+ Branch: cfgperl
+ ! t/io/dup.t t/lib/dprof.t t/lib/odbm.t
+____________________________________________________________________________
+[ 3991] By: jhi on 1999/08/14 13:08:41
+ Log: Augment filesize limit note.
+ Branch: cfgperl
+ ! doio.c
+____________________________________________________________________________
+[ 3990] By: jhi on 1999/08/14 13:06:12
+ Log: Note about filesize limits.
+ Branch: cfgperl
+ ! doio.c pp_sys.c
+____________________________________________________________________________
+[ 3989] By: jhi on 1999/08/14 11:31:58
+ Log: Catch the case of filesize limits.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 3988] By: nick on 1999/08/14 09:20:58
+ Log: New lightweight Carp has a require. If Carp is used in a __DIE__ handler
+ this causes a POPSTACK panic. The problem seems to be that although
+ die_where() has unwound the tail of perl_vdie() top_env setjmp has been
+ set to resume execution there. Avoiding setting CATCH_SET(TRUE) in
+ call_sv() avoids this. So invent a new G_NOCATCH flag to disable
+ messing with CATCH_SET() in call_sv, use it in perl_vdie().
+ Add test to op/eval.t which will fail (panic) if bug comes back.
+ >>> I AM NOT CONVINCED THIS IS CORRECT LONG TERM FIX <<<
+ Branch: perl
+ ! cop.h perl.c t/op/eval.t util.c
+____________________________________________________________________________
+[ 3987] By: jhi on 1999/08/13 23:57:52
+ Log: From: "Craig A. Berry" <craig.berry@metamor.com>
+ To: perl5-porters@perl.org, vmsperl@perl.org, sarathy@activestate.com
+ Subject: [PATCH 5.005_60] fix MM_VMS.pm for space-delimited lists
+ Date: Fri, 13 Aug 1999 17:42:47 -0500
+ Message-Id: <v04210105b3da3ed9599d@[172.16.246.133]>
+ Branch: cfgperl
+ ! lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 3986] By: jhi on 1999/08/13 23:56:44
+ Log: Don't quit before printing out the message.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 3985] By: jhi on 1999/08/13 23:35:49
+ Log: Remove more t/ trash on target "clean".
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 3984] By: jhi on 1999/08/13 23:02:53
+ Log: Avoid double long double.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! uselongdbl.U
+____________________________________________________________________________
+[ 3983] By: jhi on 1999/08/13 22:59:56
+ Log: BYTEORDER fix.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/compline/byteorder.U
+____________________________________________________________________________
+[ 3982] By: jhi on 1999/08/13 22:48:40
+ Log: Jumbo Configure and large file support update.
+ Remove a lot of unneeded 64-bitness cruft;
+ re-introduce BYTEORDER; update 64-bitness hints;
+ lfs should now work in Solaris; long doubles in AIX.
+ Branch: cfgperl
+ ! Configure config_h.SH doio.c hints/aix.sh hints/hpux.sh
+ ! hints/irix_6.sh hints/solaris_2.sh iperlsys.h perl.h perlio.c
+ ! perlsdio.h pp.h pp_sys.c
+ Branch: metaconfig
+ ! U/compline/byteorder.U U/compline/ccflags.U
+ Branch: metaconfig/U/perl
+ ! d_dlsymun.U io64.U uselongdbl.U
+____________________________________________________________________________
+[ 3980] By: jhi on 1999/08/13 15:09:11
+ Log: Introduce HAS_LLSEEK.
+ Branch: cfgperl
+ ! Configure config_h.SH perl.h
+____________________________________________________________________________
+[ 3979] By: jhi on 1999/08/13 14:29:47
+ Log: From: <dan@sidhe.org>
+ To: perl5-porters@perl.org, vmsperl@perl.org, bailey@newman.upenn.edu,
+ sarathy@activestate.com
+ Subject: [PATCH 5.005_60]fix up VMS->unix filename translation a bit
+ Date: Fri, 13 Aug 1999 09:00:42 -0700 (PDT)
+ Message-ID: <Pine.LNX.4.10.9908130849390.3950-100000@tuatha.sidhe.org>
+ Branch: cfgperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 3978] By: jhi on 1999/08/13 09:56:46
+ Log: Make the 64-bit tests more paranoid.
+ Branch: cfgperl
+ ! t/op/64bit.t
+____________________________________________________________________________
+[ 3976] By: jhi on 1999/08/12 21:49:16
+ Log: IRIX64 needs more -mabi=64 with gcc.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 3975] By: jhi on 1999/08/12 21:02:03
+ Log: Reincarnate change #3967, now in more modest form.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 3974] By: jhi on 1999/08/12 20:49:36
+ Log: Remove rt from libswanted (I added it many moons ago
+ when I thought it would be useful in Digital UNIX,
+ I was wrong); undo the recent IRIX hints changes,
+ getting rid of one warning brought new ones.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/irix_6.sh
+ Branch: metaconfig
+ ! U/modified/Myinit.U
+____________________________________________________________________________
+[ 3973] By: jhi on 1999/08/12 19:42:53
+ Log: st_blocks is in 512 byte blocks.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 3972] By: jhi on 1999/08/12 19:27:31
+ Log: Don't claim defeat too early.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! longdblfio.U
+____________________________________________________________________________
+[ 3971] By: jhi on 1999/08/12 19:24:14
+ Log: IRIX 64-bit hint tweak.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 3970] By: nick on 1999/08/12 19:17:20
+ Log: Turn of deprecated warnings for defined(@Sompack::ISA) type
+ tests i.e. RV2AV and RV2HV
+ Branch: perl
+ ! op.c t/pragma/warn/op
+____________________________________________________________________________
+[ 3969] By: jhi on 1999/08/12 19:06:17
+ Log: Add Configure -Duselongdouble and add a missing semicolon.
+ Branch: cfgperl
+ ! Configure config_h.SH sv.c
+ Branch: metaconfig/U/perl
+ + uselongdbl.U
+____________________________________________________________________________
+[ 3968] By: jhi on 1999/08/12 18:46:00
+ Log: Simply exit() early if lfs support seems unlikely.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 3967] By: jhi on 1999/08/12 18:44:05
+ Log: Suffer silently for unused libraries.
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 3966] By: jhi on 1999/08/12 13:18:44
+ Log: Update MANIFEST to follow change #3965.
+ Branch: cfgperl
+ ! MANIFEST
+____________________________________________________________________________
+[ 3965] By: jhi on 1999/08/12 13:15:38
+ Log: Regenerate Unicode tables based on new syllable lists
+ from Daniel Yacob.
+ Branch: cfgperl
+ ! (edit 159 files)
+____________________________________________________________________________
+[ 3964] By: jhi on 1999/08/12 10:06:24
+ Log: Remove more spurious casting.
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3963] By: jhi on 1999/08/12 08:18:53
+ Log: Minor niggles on the lfs tests.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 3962] By: jhi on 1999/08/11 22:48:25
+ Log: Don't bother with lfs testing if off_t is too small.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 3961] By: jhi on 1999/08/11 22:22:54
+ Log: Long double patches from Dan Sugalski.
+ Branch: cfgperl
+ ! sv.c
+____________________________________________________________________________
+[ 3960] By: jhi on 1999/08/11 22:17:55
+ Log: Flush buffer before duplicating file descriptor.
- Title: "perlre.pod"
- From: Ted Ashton <ashted@southern.edu>
- Msg-ID: <199802271501.KAA09279@ns.southern.edu>
- Files: pod/perlre.pod
+ From: Mark-Jason Dominus <mjd@plover.com>
+ To: Graham Barr <gbarr@pobox.com>
+ cc: Vicki Brown <vlb@cfcl.com>, perl5-porters@perl.org, mjd@plover.com
+ Subject: Re: [ID 19990811.002] can't dup DATA? (PATCH (5.005_57))
+ Date: Wed, 11 Aug 1999 15:56:09 -0400
+ Message-ID: <19990811195610.5933.qmail@plover.com>
- Title: "Re: printf and $\", "printf and $\"
- From: Roderick Schertler <roderick@argon.org>, Tom Phoenix
- <rootbeer@teleport.com>, nag <nick@flirble.org>
- Msg-ID: <199711141918.TAA08096@flirble.org>,
- <Pine.GSO.3.96.971117085421.12318J-100000@usertest.teleport
- .com>, <pzyb2ncr42.fsf@eeyore.ibcinc.com>
- Files: pod/perlfunc.pod
+ From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.org
+ Subject: Re: [ID 19990811.002] can't dup DATA? (PATCH (5.005_57))
+ Date: Wed, 11 Aug 1999 16:05:46 -0400
+ Message-ID: <19990811200546.6165.qmail@plover.com>
+ Branch: cfgperl
+ ! doio.c pod/perldelta.pod
+____________________________________________________________________________
+[ 3959] By: jhi on 1999/08/11 22:11:35
+ Log: Bypass fsync(NULL) (crashes miniperl compiled with DEC C 5.2)
+
+ From: "Craig A. Berry" <craig.berry@metamor.com>
+ Sender: owner-perl5-porters@perl.org
+ To: vmsperl@perl.org, perl5-porters@perl.org, sarathy@activestate.com,
+ bailey@newman.upenn.edu
+ Subject: [PATCH 5.005_60] vms.c my_flush patch to circumvent fileno
+ problem
+ Date: Wed, 11 Aug 1999 14:31:11 -0500
+ Message-Id: <4.2.0.58.19990811141007.00b8f8a0@mmtnt11.metamor.com>
+ Branch: cfgperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 3958] By: jhi on 1999/08/11 15:35:45
+ Log: Add a hopefully comforting message if there seems to be no LFS.
+ This seems to be the case with e.g. ext2fs, a somewhat popular fs.
+ The tests will fail on lfs tests only if quad is available,
+ if ENOQUAD, the lfs tests will be skipped.
+ Branch: cfgperl
+ ! t/lib/syslfs.t t/op/lfs.t
+____________________________________________________________________________
+[ 3957] By: jhi on 1999/08/11 12:25:59
+ Log: Unapply an experimental patch that accidentally escaped
+ from the lab by piggybacking with the change #3955.
+ Branch: cfgperl
+ ! pp.c pp.h pp_hot.c
+____________________________________________________________________________
+[ 3956] By: jhi on 1999/08/11 08:19:23
+ Log: Add sysio large file support testing.
+ Branch: cfgperl
+ + t/lib/syslfs.t
+ ! MANIFEST pod/perlfunc.pod t/op/64bit.t t/op/lfs.t
+____________________________________________________________________________
+[ 3955] By: jhi on 1999/08/10 22:39:11
+ Log: From: <dan@sidhe.org>
+ To: vmsperl@perl.org, perl5-porters@perl.org,
+ sarathy@activestate.com, bailey@newman.upenn.edu
+ Subject: [PATCH 5.005_60]Patches needed to get _60 building with
+ threads on VMS
+ Date: Tue, 10 Aug 1999 16:34:56 -0700 (PDT)
+ Message-ID: <Pine.LNX.4.10.9908101631030.18266-100000@tuatha.sidhe.org>
+ Branch: cfgperl
+ ! ext/Devel/DProf/DProf.xs ext/DynaLoader/dl_vms.xs
+ ! ext/POSIX/POSIX.xs pp.c pp.h pp_hot.c vms/vms.c vms/vmsish.h
+ ! vms/writemain.pl
+____________________________________________________________________________
+[ 3954] By: jhi on 1999/08/10 20:37:55
+ Log: LFS testing robustness.
+ Branch: cfgperl
+ ! t/op/lfs.t
+____________________________________________________________________________
+[ 3953] By: jhi on 1999/08/10 19:54:50
+ Log: From: <dan@sidhe.org>
+ To: vmsperl@perl.org, perp5-porters@perl.org, bailey@newman.upenn.edu,
+ sarathy@activestate.com
+ Subject: [PATCH 5.005_60]Pathces to get _60 building on VMS
+ Date: Tue, 10 Aug 1999 13:28:18 -0700 (PDT)
+ Message-ID: <Pine.LNX.4.10.9908101323130.18266-100000@tuatha.sidhe.org>
+ Branch: cfgperl
+ ! configure.com vms/descrip_mms.template vms/gen_shrfls.pl
+ ! vms/subconfigure.com vms/vmsish.h
+____________________________________________________________________________
+[ 3952] By: jhi on 1999/08/10 17:18:57
+ Log: AIX is different, again. Now in cc -E output.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig
+ ! U/modified/cppstdin.U
+____________________________________________________________________________
+[ 3951] By: jhi on 1999/08/10 14:37:08
+ Log: Use Pid_t on pgrp matters.
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3950] By: jhi on 1999/08/10 14:35:30
+ Log: Use Pid_t.
+ Branch: cfgperl
+ ! doio.c embed.h embed.pl embedvar.h global.sym perlapi.c
+ ! pp_sys.c proto.h util.c
+____________________________________________________________________________
+[ 3949] By: jhi on 1999/08/10 14:11:15
+ Log: Use Mode_t.
+ Branch: cfgperl
+ ! doio.c embed.h embed.pl embedvar.h global.sym perlapi.c
+ ! perlapi.h pp_sys.c proto.h
+____________________________________________________________________________
+[ 3948] By: jhi on 1999/08/10 13:53:19
+ Log: Small perlbug doc tweaks from Jon Orwant.
+ Branch: cfgperl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 3947] By: jhi on 1999/08/10 09:55:11
+ Log: Large file support testing.
+ Branch: cfgperl
+ + t/op/lfs.t
+ ! MANIFEST t/op/64bit.t
+____________________________________________________________________________
+[ 3946] By: jhi on 1999/08/10 09:13:54
+ Log: Remove I32 casting from time-related functions.
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3945] By: jhi on 1999/08/10 09:06:42
+ Log: Gratuitous uid and gid casts to I32s and ints removed.
+ There are still problem spots in printfing such ids:
+ width (%d vs %ld) and signedness %d vs %u.
+ Branch: cfgperl
+ ! doio.c embed.h embed.pl embedvar.h global.sym intrpvar.h mg.c
+ ! perl.c perlapi.c pp_hot.c proto.h
+____________________________________________________________________________
+[ 3944] By: jhi on 1999/08/10 07:43:03
+ Log: Remove I32 casts from pp_stat, these make stat()
+ very broken e.g. on files larger than 2 gigabytes.
+ Reported by
+ From: Phil Lobbes <phil@finchcomputer.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990810.001] Possible bug using stat w/large files Digital
+ UNIX Perl 5.005_03
+ Date: Mon, 09 Aug 1999 21:38:54 -0700
+ Message-Id: <199908100438.VAA08292@ultra.finchcomputer.com>
- Title: "recv() typo"
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <12064.877012073@eeyore.ibcinc.com>
- Files: pod/perlfunc.pod
+ There are more of these I32 casts all over pp_sys.c,
+ all of them should be checked.
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3943] By: jhi on 1999/08/10 07:38:30
+ Log: Remove blathering.
+ Branch: cfgperl
+ ! lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 3942] By: jhi on 1999/08/09 20:35:13
+ Log: lexwarn maintenance: new warning class unsafe
+ subclasses 'overflow' and 'portable' created,
+ used by the recent integer overflow warnings.
+ Class syntax subclass 'octal' renamed to 'digit',
+ binary and hexadecimal parsing errors also 'digit' warnings.
+ Branch: cfgperl
+ ! lib/warning.pm pod/perllexwarn.pod t/pragma/warn/util toke.c
+ ! util.c warning.h warning.pl
+____________________________________________________________________________
+[ 3941] By: jhi on 1999/08/09 10:40:47
+ Log: Integrate with Nick.
+ Branch: cfgperl
+ +> opnames.h
+ !> Changes MANIFEST embed.h embed.pl ext/B/B/C.pm ext/B/B/CC.pm
+ !> global.sym opcode.h opcode.pl perl.h perlapi.c pp.c
+____________________________________________________________________________
+[ 3940] By: jhi on 1999/08/09 10:32:43
+ Log: Regenerate the Unicode tables after having updated the Unicode
+ database (change #3939).
+ Branch: cfgperl
+ ! (edit 157 files)
+____________________________________________________________________________
+[ 3939] By: jhi on 1999/08/09 10:27:22
+ Log: Unicode data updated to be the latest beta of the Unicode 3.0.
+ Branch: cfgperl
+ ! lib/unicode/UnicodeData-Latest.txt
+____________________________________________________________________________
+[ 3938] By: jhi on 1999/08/09 10:25:54
+ Log: Ethiopic changes via private email from Daniel Yacob,
+ <dmulholl@cs.indiana.edu>. Ethiopic and Cherokee done,
+ Canadian Syllabics and Yi under construction.
+ Branch: cfgperl
+ + lib/unicode/syllables.txt
+ - lib/unicode/EthiopicSyllables.txt
+ - lib/unicode/MakeEthiopicSyllables.PL
+ ! MANIFEST lib/unicode/UnicodeData-Latest.txt
+ ! lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 3937] By: jhi on 1999/08/09 10:21:51
+ Log: Move the equivalence class creation last.
+ Branch: cfgperl
+ ! lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 3936] By: jhi on 1999/08/09 10:20:40
+ Log: Compute equivalence classes (diacritics stripping) only
+ for letters, not for ligatures.
+ Branch: cfgperl
+ ! lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ ! lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 3935] By: nick on 1999/08/08 13:53:57
+ Log: Will now correctly re-call
+ bootstrap "Foo";
+ if requested. This should allow build on Win32 and other
+ platforms where you cannot link to loadables directly.
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 3934] By: nick on 1999/08/07 12:23:55
+ Log: Vishal Bhatia <vishalb@my-deja.com>
+ Subject: [PATCH 5.005_60] fix for some obscure bugs (compiler)
+ Message-ID: <HLPEBPHPAKHKAAAA@my-deja.com>
+ Branch: perl
+ ! ext/B/B/CC.pm
+____________________________________________________________________________
+[ 3933] By: nick on 1999/08/07 12:19:46
+ Log: B::C changes to get simple Tk app. compiling again
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 3932] By: jhi on 1999/08/06 21:17:16
+ Log: Regen Configure to include change #3915.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3931] By: jhi on 1999/08/06 18:52:57
+ Log: Todo update.
+ Branch: cfgperl
+ ! Todo Todo-5.005 lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 3930] By: jhi on 1999/08/06 13:13:05
+ Log: Character class equivalence tables.
+ Branch: cfgperl
+ + lib/unicode/Eq/Latin1 lib/unicode/Eq/Unicode
+ ! MANIFEST lib/unicode/mktables.PL
+____________________________________________________________________________
+[ 3929] By: jhi on 1999/08/06 11:59:11
+ Log: More Fcntl constants. (This process really needs
+ to be automated, at least partly, see the Errno extension.)
+ Now also the SEEK_ constants are available via the Fcntl.
+ Yes, this is redundant (IO::Seekable and POSIX supply them already),
+ but now Fcntl is a one-stop shopping mall for all your
+ file-related constants.
+ Branch: cfgperl
+ ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs pod/perlfunc.pod
+____________________________________________________________________________
+[ 3928] By: jhi on 1999/08/06 08:08:03
+ Log: Protect against pack/unpack repeat count overflows,
+ based on:
- Title: "truncate return value"
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <5490.878337883@eeyore.ibcinc.com>
- Files: pod/perlfunc.pod
+ From: Nathan Torkington <gnat@frii.com>
+ To: Brian Keefer <mgomes@cwix.com>
+ Cc: perl5-porters@perl.org
+ Subject: Re: [ID 19990806.001] Core dump with obfuscated code
+ Date: Thu, 5 Aug 1999 23:01:51 -0600 (MDT)
+ Message-ID: <14250.27711.769942.100675@localhost.frii.com>
+ Branch: cfgperl
+ ! pod/perldiag.pod pp.c
+____________________________________________________________________________
+[ 3927] By: jhi on 1999/08/06 07:32:20
+ Log: Fix for Nathan's fix (#3920) from Guy Decoux.
- Title: "update to perlbook.pod"
- From: "Nathan V. Patwardhan" <nvp@mediaone.net>, Randal Schwartz
- <merlyn@stonehenge.com>, Stephen Potter
- <spp@psasolar.colltech.com>, Tom Phoenix
- <rootbeer@teleport.com>
- Msg-ID: <199803241354.HAA23938@psasolar.psa.pencom.com>,
- <199803241441.OAA01261@mediaone.net>,
- <8clnu0i05k.fsf@gadget.cscaper.com>,
- <Pine.GSO.3.96.980324111957.15753C-100000@user1.teleport.com>
- Files: pod/perlbook.pod
+ From: Nathan Torkington <gnat@frii.com>
+ To: perl5-porters@perl.org
+ Subject: Bugfix for my bugfix
+ Date: Thu, 5 Aug 1999 21:25:47 -0600 (MDT)
+ Message-ID: <14250.21947.765134.940583@localhost.frii.com>
+ Branch: cfgperl
+ ! ext/B/B/Assembler.pm
+____________________________________________________________________________
+[ 3926] By: jhi on 1999/08/05 17:25:19
+ Log: Fix regex charclass parsing so that bogus ranges
+ like [0-\d] and [[:word:]-z] are no more allowed.
+ The anomaly was noticed by Guy Decoux.
+ Branch: cfgperl
+ ! pod/perldiag.pod pod/perlre.pod regcomp.c t/op/re_tests
+____________________________________________________________________________
+[ 3925] By: jhi on 1999/08/05 10:31:47
+ Log: split /^/ deprecation warning should not be on by default.
+ Branch: cfgperl
+ ! pp.c
+____________________________________________________________________________
+[ 3923] By: jhi on 1999/08/05 09:16:57
+ Log: From: paul.marquess@bt.com
+ To: jhi@iki.fi, paul.marquess@bt.com
+ Cc: gsar@ActiveState.com, perl5-porters@perl.org
+ Subject: RE: [PATCH 5.005_60] anydbm.t + DB_File + Berkeley DB >= 2.4.10
+ Date: Thu, 5 Aug 1999 09:33:14 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB202D49B26@mbtlipnt02.btlabs.bt.co.uk>
+ Branch: cfgperl
+ ! t/lib/anydbm.t
+____________________________________________________________________________
+[ 3921] By: jhi on 1999/08/05 08:05:13
+ Log: From: paul.marquess@bt.com
+ To: perl5-porters@perl.org
+ Cc: gsar@activestate.com, nik@tiuk.ti.com, jhi@iki.fi,
+ randy@theoryx5.uwinnipeg.ca
+ Subject: [PATCH 5.005_60] DB_File 1.70
+ Date: Wed, 4 Aug 1999 23:22:22 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB202D49B21@mbtlipnt02.btlabs.bt.co.uk>
- Title: "utime documentation"
- From: "Brandon S. Allbery KF8NH" <bsa@kf8nh.apk.net>, "M.J.T. Guy"
- <mjtg@cus.cam.ac.uk>
- Msg-ID: <199802180256.VAA11369@speaker.kf8nh.apk.net>,
- <E0y4qd6-0000P6-00@ursa.cus.cam.ac.uk>
- Files: pod/perlfunc.pod
+ (Replaces change #3917)
+ Branch: cfgperl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs t/lib/db-btree.t t/lib/db-hash.t
+____________________________________________________________________________
+[ 3920] By: jhi on 1999/08/04 19:02:58
+ Log: From: Nathan Torkington <gnat@frii.com>
+ To: perl5-porters@perl.org
+ Subject: [5.005_60 PATCH] Make B::Bytecode work
+ Date: Wed, 4 Aug 1999 11:24:56 -0600 (MDT)
+ Message-ID: <14248.30568.769427.216092@localhost.frii.com>
+ Branch: cfgperl
+ ! ext/B/B/Assembler.pm
+____________________________________________________________________________
+[ 3919] By: jhi on 1999/08/04 10:56:26
+ Log: Update history records.
+ Branch: cfgperl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 3918] By: jhi on 1999/08/04 09:36:13
+ Log: Minor fixes to linux -Dusethreads -Duseperlio.
+ Branch: cfgperl
+ ! perlio.c
+____________________________________________________________________________
+[ 3917] By: jhi on 1999/08/04 08:13:20
+ Log: (Replaced by change #3921)
+ From: paul.marquess@bt.com
+ To: gsar@activestate.com
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.005_60] DB_File 1.69
+ Date: Tue, 3 Aug 1999 22:55:00 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB29C6D04@mbtlipnt02.btlabs.bt.co.uk>
+ Branch: cfgperl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs t/lib/db-btree.t t/lib/db-hash.t
+____________________________________________________________________________
+[ 3916] By: jhi on 1999/08/04 07:59:05
+ Log: Introduce the charnames pragma.
- Title: "(well, doc patch) use of // requires successful match"
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <pz7mb4bips.fsf@eeyore.ibcinc.com>
- Files: pod/perlop.pod
+ Subject: [PATCH 5.005_58] Free \C (for named chars), move to \O
+ From: Ilya Zakharevich <[9]ilya@math.ohio-state.edu>
+ To: Chip Salzenberg <[11]chip@perlsupport.com>
+ Cc: Mailing list Perl5 <[12]perl5-porters@perl.org>
+ Date: Sat, 31 Jul 1999 05:44:05 -0400
+ Message-Id: <[13]199907311407.IAA25042@localhost.frii.com>
- ------ LIBRARY AND EXTENSIONS ------
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_58] Named characters in Perl
+ Date: Mon, 2 Aug 1999 19:25:40 -0400
+ Message-ID: <19990802192540.B24407@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ + lib/charnames.pm t/lib/charnames.t
+ ! MAINTAIN MANIFEST lib/utf8.pm pod/perldiag.pod pod/perlop.pod
+ ! pod/perlre.pod regcomp.c toke.c
+____________________________________________________________________________
+[ 3915] By: jhi on 1999/08/03 21:18:49
+ Log: Support Configure -Dmake=pmake.
+ Via private email from Andy.
+ NOTE: assumes "basename" command.
+ Branch: metaconfig
+ ! U/modified/Config_sh.U
+____________________________________________________________________________
+[ 3914] By: jhi on 1999/08/03 21:11:11
+ Log: The op/filetest.t failed subtest 7 if testing as root.
- Title: "MakeMaker PM doc patch and a DIR buglet"
- From: Achim Bohnet <ach@mpe.mpg.de>
- Msg-ID: <9711101050.AA13868@o09.xray.mpe.mpg.de>
- Files: lib/ExtUtils/MakeMaker.pm
+ From: =?iso-8859-1?Q?Fran=E7ois=20D=E9sarm=E9nien?= <desar@club-internet.fr>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990727.039] Not OK: perl 5.00558 on i386-sco 3.2v5.0.4
+ Date: Tue, 27 Jul 1999 22:54:05 +0200
+ Message-Id: <379E1C6D.626DC765@club-internet.fr>
+ Branch: cfgperl
+ ! t/op/filetest.t
+____________________________________________________________________________
+[ 3911] By: jhi on 1999/08/03 19:52:38
+ Log: The "-Dusethreads -Duseperlio" combination failed.
- Title: "bareword clarification for constant.pm"
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <6460.878143077@eeyore.ibcinc.com>
- Files: lib/constant.pm
+ From: Spider Boardman <spider@leggy.zk3.dec.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990803.007] Not OK: perl 5.00560 on alpha-dec_osf-thread
+ 4.0 (UNINSTALLED)
+ Date: Tue, 3 Aug 1999 14:25:00 -0400
+ Message-Id: <199908031825.OAA29254@leggy.zk3.dec.com>
- Title: "integer rand - bug or feature?"
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <pzhg8lvgta.fsf@eeyore.ibcinc.com>
- Files: lib/integer.pm
+ See also change #3912.
+ Branch: cfgperl
+ ! perlio.c
+____________________________________________________________________________
+[ 3910] By: jhi on 1999/08/03 10:44:24
+ Log: From: Chris Nandor <pudge@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_58] perlbug.PL 1.27
+ Date: Wed, 28 Jul 1999 23:42:49 -0400
+ Message-Id: <v04210104b3c57ce9e3de@[152.167.11.247]>
+ Branch: cfgperl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 3909] By: jhi on 1999/08/03 10:41:04
+ Log: Hints for building ByteLoader in SunoS. Based on
+ From: Andy Dougherty <doughera@lafayette.edu>
+ To: Gurusamy Sarathy <gsar@activestate.com>
+ Cc: Perl Porters <perl5-porters@perl.org>
+ Subject: Re: 5.005_58 Not OK SunOS 4.1.3
+ Date: Mon, 2 Aug 1999 14:01:58 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9908021357410.5873-100000@newton.phys>
+ Branch: cfgperl
+ + ext/ByteLoader/hints/sunos.pl
+ ! MANIFEST ext/ByteLoader/ByteLoader.xs
+____________________________________________________________________________
+[ 3908] By: jhi on 1999/08/03 09:29:22
+ Log: Clarify RE engine code; inline a static function to a macro;
+ make exact string nodes smaller.
- ------ OTHER CHANGES ------
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_60] Cosmetic change to REx engine
+ Date: Mon, 2 Aug 1999 21:53:36 -0400 (EDT)
+ Message-Id: <199908030153.VAA10542@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! Makefile.SH embed.pl global.sym keywords.h lib/warning.pm
+ ! opcode.h pp.sym pp_proto.h regcomp.c regcomp.h regexec.c
+ ! regnodes.h warning.h
+____________________________________________________________________________
+[ 3907] By: jhi on 1999/08/03 08:11:49
+ Log: 5_59 configured with -Dd_bincompat5005 can't be made
+ binary compatible with a 5_03 which was built with -DEMBEDMYMALLOC.
- Title: "FileHandle Documentation patch"
- From: "Darren/Torin/Who Ever..." <torin@daft.com>
- Msg-ID: <87emzqo49g.fsf@perv.daft.com>
+ From: Spider Boardman <spider@leggy.zk3.dec.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990802.016] Not OK: perl 5.00559
+ Date: Mon, 2 Aug 1999 16:11:13 -0400
+ Message-Id: <199908022011.QAA30224@leggy.zk3.dec.com>
+ Branch: cfgperl
+ ! embed.pl
+____________________________________________________________________________
+[ 3906] By: jhi on 1999/08/03 07:48:59
+ Log: Change #3790 redemption: with a little additional
+ patch from Ilya it works okay.
+ Branch: cfgperl
+ ! ext/SDBM_File/Makefile.PL lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MakeMaker.pm os2/OS2/REXX/Makefile.PL perl.h
+____________________________________________________________________________
+[ 3905] By: gsar on 1999/08/02 21:03:23
+ Log: this will be 5.005_60
+ Branch: perl
+ ! Changes
+
+----------------
+Version 5.005_60
+----------------
+
+____________________________________________________________________________
+[ 3904] By: gsar on 1999/08/02 20:30:23
+ Log: don't enable PERL_POLLUTE_MALLOC when EMBEDMYMALLOC is
+ in effect (from Spider Boardman <spider@leggy.zk3.dec.com>);
+ regen headers
+ Branch: perl
+ ! embed.h embed.pl global.sym opcode.h perlapi.c
+____________________________________________________________________________
+[ 3903] By: gsar on 1999/08/02 20:26:07
+ Log: native int pack/unpack fixes (from Spider Boardman
+ <spider@leggy.zk3.dec.com>)
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 3902] By: gsar on 1999/08/02 20:24:41
+ Log: fix broken -DDEBUGGING_OPS (from Spider Boardman
+ <spider@leggy.zk3.dec.com>)
+ Branch: perl
+ + opnames.h
+ ! Changes MANIFEST opcode.pl perl.h
+____________________________________________________________________________
+[ 3901] By: gsar on 1999/08/02 18:51:18
+ Log: integrate cfgperl contents
+ Branch: perl
+ !> INSTALL README pod/perldelta.pod
+____________________________________________________________________________
+[ 3900] By: jhi on 1999/08/02 18:46:21
+ Log: Update README and INSTALL; partly based on the message
- Title: "perl5.004_61 myconfig updates"
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980305150629.11530G-100000@newton.phys>
- Files: myconfig
+ From: "John L. Allen" <allen@grumman.com>
+ To: Jarkko Hietaniemi <jhi@iki.fi>
+ cc: perl5-porters@perl.org
+ Subject: Re: Perl Installation Problem
+ Date: Thu, 29 Jul 1999 14:55:05 -0400 (EDT)
+ Message-ID: <Pine.SOL.3.91.990729144440.1035A-100000@gateway.grumman.com>
- Title: "small fixups in pod2latex.PL"
- From: "Darren/Torin/Who Ever..." <torin@daft.com>
- Msg-ID: <873eg6o3v2.fsf@perv.daft.com>
+ and private email from Andy Dougherty.
+ Branch: cfgperl
+ ! INSTALL README
+____________________________________________________________________________
+[ 3899] By: jhi on 1999/08/02 18:36:35
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> op.c
+____________________________________________________________________________
+[ 3898] By: jhi on 1999/08/02 18:34:49
+ Log: Update PERL_BINCOMPAT_5005; update 64-bitness.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 3897] By: gsar on 1999/08/02 18:18:37
+ Log: optimizations could sometimes bypass bareword check
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 3896] By: jhi on 1999/08/02 18:18:34
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes makedef.pl patchlevel.h win32/Makefile
+ !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ !> win32/makefile.mk
+____________________________________________________________________________
+[ 3895] By: gsar on 1999/08/02 17:22:40
+ Log: up patchlevel etc.
+ Branch: perl
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 3894] By: gsar on 1999/08/02 17:12:31
+ Log: integrate change#3893, make it conditional on bincompat5005
+ Branch: perl
+ ! makedef.pl
+____________________________________________________________________________
+[ 3893] By: jhi on 1999/08/02 16:49:08
+ Log: PERL_BINCOMPAT_5005 symbol translation.
+ (AIX wouldn't link neither perl nor extensions.)
+ Branch: cfgperl
+ ! makedef.pl
+____________________________________________________________________________
+[ 3892] By: gsar on 1999/08/02 16:09:13
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> t/op/64bit.t
+ ! Changes
+ !> Configure MANIFEST config_h.SH doio.c dump.c hints/aix.sh op.c
+ !> pod/perlfunc.pod pp_hot.c pp_sys.c regcomp.c sv.c t/io/open.t
+ !> t/pragma/utf8.t t/pragma/warn/pp_hot toke.c util.c
+____________________________________________________________________________
+[ 3891] By: jhi on 1999/08/02 14:52:40
+ Log: AIX long long probing requires LL suffix for
+ the ll constant. The suffix doesn't seem
+ to bother other ll platforms.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/aix.sh
+ Branch: metaconfig/U/perl
+ ! quadfio.U
+____________________________________________________________________________
+[ 3890] By: jhi on 1999/08/02 14:21:55
+ Log: Exact path to perl for open -|.
+ Branch: cfgperl
+ ! t/io/open.t
+____________________________________________________________________________
+[ 3889] By: jhi on 1999/08/02 14:18:03
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes patchlevel.h pod/perlhist.pod pp_ctl.c util.c
+ !> win32/Makefile win32/config_H.bc win32/config_H.gc
+ !> win32/config_H.vc win32/makefile.mk win32/win32.c
+____________________________________________________________________________
+[ 3888] By: jhi on 1999/08/02 14:14:29
+ Log: AIX -Duse64bits: old AIXen do not have the getconf variables.
+ Branch: cfgperl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 3887] By: jhi on 1999/08/02 12:53:10
+ Log: Fix some of the {IV_IS_QUAD,UV_IS_QUAD} cases so that
+ emacs code indentation doesn't get wrong ideas--
+ in other words, introduce a couple of "redundant" if:s.
+ Branch: cfgperl
+ ! doio.c dump.c op.c pp_hot.c pp_sys.c regcomp.c sv.c toke.c
+ ! util.c
+____________________________________________________________________________
+[ 3886] By: jhi on 1999/08/02 12:43:16
+ Log: Mention that also *BSD systems with glibc are known to stumble.
+ Branch: cfgperl
+ ! t/pragma/warn/pp_hot
+____________________________________________________________________________
+[ 3885] By: jhi on 1999/08/02 12:34:15
+ Log: Allow also non-long long but still quad platforms print quads.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! longdblfio.U quadfio.U
+____________________________________________________________________________
+[ 3884] By: jhi on 1999/08/02 11:56:14
+ Log: Fix regclass utf8 hex ranges for quads.
+ Branch: cfgperl
+ ! regcomp.c
+____________________________________________________________________________
+[ 3883] By: jhi on 1999/08/02 11:42:14
+ Log: Enhance the description of how to detect quad support.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3882] By: jhi on 1999/08/02 11:22:19
+ Log: Fix printf %D %U %O for quads.
+ Branch: cfgperl
+ ! sv.c t/op/64bit.t
+____________________________________________________________________________
+[ 3881] By: jhi on 1999/08/02 11:16:12
+ Log: Document quad printing.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3880] By: jhi on 1999/08/02 10:32:01
+ Log: More 64-bit fixing. One known bug of that kind
+ remains, 32-bit platforms using long long in
+ the test t/pragma/utf8 subtests 1-3 fail.
+ (Update: change #3884 fixed that one.)
+ Branch: cfgperl
+ + t/op/64bit.t
+ ! Configure MANIFEST config_h.SH regcomp.c sv.c t/pragma/utf8.t
+
+----------------
+Version 5.005_59
+----------------
+
+____________________________________________________________________________
+[ 3879] By: gsar on 1999/08/02 08:18:58
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure config_h.SH sv.c
+____________________________________________________________________________
+[ 3878] By: gsar on 1999/08/02 08:13:16
+ Log: change#3692 had an unintentional patch leak through!
+ (this would explain the mysterious C<next LABEL> failures
+ people have seen)
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 3877] By: gsar on 1999/08/02 08:00:29
+ Log: up patchlevel to 59
+ Branch: perl
+ ! Changes patchlevel.h pod/perlhist.pod win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 3876] By: gsar on 1999/08/02 07:51:18
+ Log: fix coredump under usethreads+debug
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 3875] By: jhi on 1999/08/02 07:50:51
+ Log: d_bincompat5005 could be left empty.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! bincompat5005.U
+____________________________________________________________________________
+[ 3874] By: jhi on 1999/08/02 07:42:45
+ Log: Fix printf %d when IV is quad.
+ Branch: cfgperl
+ ! sv.c
+____________________________________________________________________________
+[ 3873] By: gsar on 1999/08/02 07:41:03
+ Log: fix d_bincompat5005='' junking config.h
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 3872] By: gsar on 1999/08/02 07:38:48
+ Log: C needs parameter list, not merely type
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3871] By: jhi on 1999/08/02 07:20:51
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes ext/B/B/C.pm ext/B/B/CC.pm regexec.c
+____________________________________________________________________________
+[ 3870] By: gsar on 1999/08/02 07:12:18
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ ! Changes
+ !> Configure Makefile.SH Porting/Glossary Porting/config.sh
+ !> Porting/config_H config_h.SH doio.c dump.c mg.c op.c perl.h
+ !> pp_ctl.c pp_hot.c pp_sys.c scope.c sv.c t/pragma/warn/sv
+ !> toke.c util.c
+____________________________________________________________________________
+[ 3869] By: gsar on 1999/08/02 06:59:09
+ Log: From: "Vishal Bhatia" <vishalb@my-deja.com>
+ Date: Sat, 31 Jul 1999 19:08:33 -0700
+ Message-ID: <LAONLKLELDJAFAAA@my-deja.com>
+ Subject: [PATCH 5.005_58] "use constant" in the compiler
+ Branch: perl
+ ! ext/B/B/C.pm ext/B/B/CC.pm
+____________________________________________________________________________
+[ 3868] By: gsar on 1999/08/02 06:55:51
+ Log: debug build tweak
+ Branch: perl
+ ! regexec.c
+____________________________________________________________________________
+[ 3867] By: gsar on 1999/08/02 06:35:18
+ Log: create vmsperl branch (to be owned and operated by: cbailey)
+ Branch: vmsperl
+ +> (branch 1476 files)
+____________________________________________________________________________
+[ 3866] By: jhi on 1999/08/01 23:34:40
+ Log: so_locations once is enough.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 3865] By: jhi on 1999/08/01 23:13:05
+ Log: Simplicate duplicated code.
+ Branch: cfgperl
+ ! util.c
+____________________________________________________________________________
+[ 3864] By: jhi on 1999/08/01 22:41:41
+ Log: Integrate with Sarathy. perl.h and util.c required manual resolving.
+ Branch: cfgperl
+ +> README.cygwin cygwin/Makefile.SHs cygwin/ld2.in
+ +> cygwin/perlld.in ext/DynaLoader/dl_cygwin.xs hints/cygwin.sh
+ - README.cygwin32 cygwin32/Makefile.SHs
+ - cygwin32/build-instructions.READFIRST
+ - cygwin32/build-instructions.charles-wilson
+ - cygwin32/build-instructions.sebastien-barre
+ - cygwin32/build-instructions.steven-morlock
+ - cygwin32/build-instructions.steven-morlock2 cygwin32/ld2.in
+ - cygwin32/perlld.in ext/DynaLoader/dl_cygwin32.xs
+ - hints/cygwin32.sh
+ !> (integrate 61 files)
+____________________________________________________________________________
+[ 3863] By: jhi on 1999/08/01 22:36:02
+ Log: Regen Configure and Glossary once again.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 3862] By: jhi on 1999/08/01 22:26:09
+ Log: Glossary update for #3861.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 3861] By: jhi on 1999/08/01 22:22:51
+ Log: 64-bit work. Now 32-bit platforms get a 100% make test
+ with -Duse64bits (using long long).
+ Tested in Solaris 2.6 sparc RH Linux 6.0 x86
+ (and Digital IX 4.0D, to get a true 64-bit opinion). Now e.g.
+ 'print unpack "q", pack "q", 12345678901'
+ should work on such 32-bit platforms.
+ Still a lot of printf()s behind -D which wrongly assume
+ that %ld/%lx and (long) are a good combination.
+ Introducing a slew of new macros intended to be used in printf()
+ format strings: e. g. PERL_PRId64 is the string to be used
+ when printing an IV, printf("%" PERL_PRId64 "\n", iv).
+ The PRI... naming follows the C9X naming of <inttypes.h> macros.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH doio.c dump.c mg.c op.c perl.h pp_ctl.c pp_hot.c
+ ! pp_sys.c scope.c sv.c t/pragma/warn/sv toke.c util.c
+ Branch: metaconfig/U/perl
+ + atolf.U atoll.U longdblfio.U quadfio.U strtoull.U
+____________________________________________________________________________
+[ 3860] By: gsar on 1999/08/01 21:23:18
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ ! toke.c
+ !> (integrate 29 files)
+____________________________________________________________________________
+[ 3859] By: gsar on 1999/08/01 21:13:09
+ Log: From: Nathan Torkington <gnat@frii.com>
+ Date: Sun, 1 Aug 1999 11:23:35 -0600 (MDT)
+ Message-ID: <14244.33431.739419.806927@localhost.frii.com>
+ Subject: [PATCH 5.005_58] ext/B/B/Disassembler.pm patch
+ Branch: perl
+ ! ext/B/B/Disassembler.pm
+____________________________________________________________________________
+[ 3858] By: gsar on 1999/08/01 21:09:15
+ Log: DB_File 1.68 update from Paul Marquess
+ Branch: perl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs t/lib/db-btree.t t/lib/db-hash.t
+ ! t/lib/db-recno.t
+____________________________________________________________________________
+[ 3857] By: gsar on 1999/08/01 21:05:54
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 31 Jul 1999 05:13:38 -0400
+ Message-Id: <199907311407.IAA25038@localhost.frii.com>
+ Subject: [PATCH 5.005_58] More optimizations to REx engine
+ Branch: perl
+ ! embed.pl embedvar.h ext/Thread/Thread.xs objXSUB.h perl.c
+ ! perl.h proto.h regcomp.c regexec.c t/op/re_tests thrdvar.h
+____________________________________________________________________________
+[ 3856] By: gsar on 1999/08/01 20:59:59
+ Log: slightly modified version of suggested patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 31 Jul 1999 04:45:12 -0400
+ Message-Id: <199907311406.IAA25034@localhost.frii.com>
+ Subject: [PATCH 5.005_58] Fix OS/2 build
+ Branch: perl
+ ! Makefile.SH lib/ExtUtils/MM_OS2.pm lib/ExtUtils/Mksymlists.pm
+ ! makedef.pl os2/Makefile.SHs os2/diff.configure perl.h sv.h
+____________________________________________________________________________
+[ 3855] By: gsar on 1999/08/01 20:49:06
+ Log: cygwin update
+ From: "Fifer, Eric" <EFifer@sanwaint.com>
+ Date: Fri, 30 Jul 1999 18:31:48 +0100
+ Message-Id: <71E287AB0D94D111BBD600600849EC8185EE06@POST>
+ Subject: [ID 19990730.003] PATCH] perl5.005_58 cygwin port
+ Branch: perl
+ ! doio.c dosish.h lib/File/Spec/Unix.pm mg.c perl.h perlsdio.h
+ ! pp_sys.c unixish.h util.c
+____________________________________________________________________________
+[ 3854] By: gsar on 1999/08/01 20:41:53
+ Log: fixes from Stephen McCamant that address bugs in change#3612
+ (the optimization shouldn't be enabled in expressions where
+ the variable is introduced), and fix Deparse to grok the
+ optimization
+ Date: Thu, 29 Jul 1999 21:21:49 -0500 (CDT)
+ Message-ID: <14241.3133.979257.953396@alias-2.pr.mcs.net>
+ Subject: [PATCH _58] Set OPpTARGET_MY more consistently
+ --
+ Date: Thu, 29 Jul 1999 22:31:16 -0500 (CDT)
+ Message-ID: <14241.7300.181386.763503@alias-2.pr.mcs.net>
+ Subject: [PATCH _58] Disable TARGET_MY-ization on variable introduction
+ --
+ Date: Fri, 30 Jul 1999 22:25:27 -0500 (CDT)
+ Message-Id: <199907310326.VAA24376@localhost.frii.com>
+ Subject: [PATCH _58, long] B::Deparse (was Re: New warning 'Useless use of...')
+ Branch: perl
+ ! ext/B/B/Deparse.pm op.c
+____________________________________________________________________________
+[ 3853] By: gsar on 1999/08/01 20:31:32
+ Log: From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Thu, 29 Jul 1999 14:08:50 -0500 (CDT)
+ Message-ID: <14240.42690.292893.605292@alias-2.pr.mcs.net>
+ Subject: [PATCH _58] Two one-liner LOGOP tweaks
+ Branch: perl
+ ! op.c opcode.h opcode.pl
+____________________________________________________________________________
+[ 3852] By: gsar on 1999/08/01 20:29:17
+ Log: rename cygwin32 to cygwin (from Eric Fifer <EFifer@sanwaint.com>)
+ Branch: perl
+ ! AUTHORS EXTERN.h INSTALL MAINTAIN Makefile.SH Porting/patchls
+ ! README.cygwin README.win32 XSUB.h cygwin/Makefile.SHs
+ ! ext/DynaLoader/dl_cygwin.xs ext/POSIX/POSIX.xs
+ ! ext/SDBM_File/sdbm/pair.c hints/cygwin.sh
+ ! lib/ExtUtils/MM_Cygwin.pm makedepend.SH perl.h pod/perl.pod
+ ! pod/perlport.pod pp_sys.c util.c
+____________________________________________________________________________
+[ 3851] By: gsar on 1999/08/01 20:20:05
+ Log: move files around for s/cygwin32/cygwin/ renaming
+ Branch: perl
+ +> README.cygwin cygwin/Makefile.SHs cygwin/ld2.in
+ +> cygwin/perlld.in ext/DynaLoader/dl_cygwin.xs hints/cygwin.sh
+ - README.cygwin32 cygwin32/Makefile.SHs
+ - cygwin32/build-instructions.READFIRST
+ - cygwin32/build-instructions.charles-wilson
+ - cygwin32/build-instructions.sebastien-barre
+ - cygwin32/build-instructions.steven-morlock
+ - cygwin32/build-instructions.steven-morlock2 cygwin32/ld2.in
+ - cygwin32/perlld.in ext/DynaLoader/dl_cygwin32.xs
+ - hints/cygwin32.sh
+ ! MANIFEST
+____________________________________________________________________________
+[ 3850] By: gsar on 1999/08/01 20:05:14
+ Log: posix-bc hints tweak (via private mail from Thomas Dorner
+ <Thomas.Dorner@start.de>)
+ Branch: perl
+ ! Changes hints/posix-bc.sh
+____________________________________________________________________________
+[ 3849] By: gsar on 1999/08/01 19:50:20
+ Log: notes on PERL_IMPLICIT_CONTEXT (from a version by Nathan Torkington
+ <gnat@frii.com>)
+ Branch: perl
+ ! perl.h pod/perldelta.pod pod/perlguts.pod
+____________________________________________________________________________
+[ 3848] By: gsar on 1999/08/01 18:34:41
+ Log: fix defined(@foo) encarpments
+ Branch: perl
+ ! ext/B/B/C.pm lib/CGI.pm lib/Dumpvalue.pm lib/dumpvar.pl
+ ! pod/perltrap.pod
+____________________________________________________________________________
+[ 3847] By: jhi on 1999/08/01 17:17:07
+ Log: Undo #3790 and the patches that attempted to fix it
+ (#3837, #3838, #3845). The #3790 caused linkage failures
+ and/or core dumps in Solaris 2.6, Digital UNIX 4.0D, and
+ IRIX 6.5.
+ Branch: cfgperl
+ - ext/SDBM_File/hints/dec_osf.pl ext/SDBM_File/hints/solaris.pl
+ ! MANIFEST ext/SDBM_File/Makefile.PL lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MakeMaker.pm os2/OS2/REXX/Makefile.PL perl.h
+____________________________________________________________________________
+[ 3846] By: jhi on 1999/08/01 11:41:52
+ Log: Reading 64-bit decimal numbers was broken because
+ the NV was cast to an I32, not an IV.
+ Branch: cfgperl
+ ! toke.c
+____________________________________________________________________________
+[ 3845] By: jhi on 1999/08/01 11:00:24
+ Log: Solaris doesn't like PERL_MALLOC_OK in SDBM_File.
+ Branch: cfgperl
+ + ext/SDBM_File/hints/solaris.pl
+____________________________________________________________________________
+[ 3844] By: jhi on 1999/08/01 10:55:44
+ Log: Enable Solaris largefiles support only if -Duse64bits is used.
+ (Effectively removes #3311).
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 3843] By: jhi on 1999/07/31 22:44:56
+ Log: Integer overflow iteration.
+ Branch: cfgperl
+ ! t/op/oct.t toke.c util.c
+____________________________________________________________________________
+[ 3842] By: jhi on 1999/07/31 22:11:03
+ Log: Remove a lot of unused regnode codes.
+ Noticed by Ilya.
+ Branch: cfgperl
+ ! regcomp.c regcomp.sym regexec.c regnodes.h
+____________________________________________________________________________
+[ 3841] By: jhi on 1999/07/31 21:53:54
+ Log: Make the use64bits and usethreads friendlier/braver;
+ they no more wimp out if the platform is unknown.
+ On use64bits if gcc used -DUSE_LONG_LONG is added
+ to the ccflags (this dependency on gcc caused a slightly weird
+ reordering of Configure, but things still seem to work.)
+ Branch: cfgperl
+ ! Configure README.threads config_h.SH
+ Branch: metaconfig
+ ! U/threads/usethreads.U
+ Branch: metaconfig/U/perl
+ ! use64bits.U
+____________________________________________________________________________
+[ 3840] By: jhi on 1999/07/31 20:26:22
+ Log: Hack the "integer overflow" code some more.
+ Branch: cfgperl
+ ! perl.h toke.c util.c
+____________________________________________________________________________
+[ 3839] By: jhi on 1999/07/31 20:22:00
+ Log: Test oct() at the 2^32-1 limit.
+ Branch: cfgperl
+ ! t/op/oct.t
+____________________________________________________________________________
+[ 3838] By: jhi on 1999/07/31 20:08:43
+ Log: Update MANIFEST for #3837.
+ Branch: cfgperl
+ ! MANIFEST
+____________________________________________________________________________
+[ 3837] By: jhi on 1999/07/31 20:02:40
+ Log: Digital UNIX 4.0D doesn't like perl malloc on sdbm
+ (a core dump with a corrput stack ensues).
+ Branch: cfgperl
+ + ext/SDBM_File/hints/dec_osf.pl
+____________________________________________________________________________
+[ 3836] By: jhi on 1999/07/29 21:09:01
+ Log: Allow for Configure -Ubincompat5005 override.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: metaconfig/U/perl
+ ! bincompat5005.U
+____________________________________________________________________________
+[ 3835] By: jhi on 1999/07/29 21:04:02
+ Log: Make Configure support PERL_BINCOMPAT_5005.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+ Branch: metaconfig/U/perl
+ + bincompat5005.U
+____________________________________________________________________________
+[ 3834] By: jhi on 1999/07/29 19:25:35
+ Log: AIX tweak, need reported by David R. Fravor <dfavor@austin.ibm.com>
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 3833] By: jhi on 1999/07/29 14:07:09
+ Log: Integrate with Sarathy. I overruled on perldelta
+ and perldiag.
+ Branch: cfgperl
+ !> README.win32 emacs/cperl-mode.el globals.c installperl
+ !> iperlsys.h makedef.pl perl.h pod/perldelta.pod
+ !> pod/perldiag.pod pod/perllexwarn.pod toke.c utils/perldoc.PL
+ !> win32/Makefile win32/bin/pl2bat.pl win32/makefile.mk
+ !> win32/perllib.c win32/win32.c
+____________________________________________________________________________
+[ 3832] By: jhi on 1999/07/29 14:02:50
+ Log: Repent and make overly large integerish
+ constants non-fatal. They are now promoted
+ to NVs, accompanied by an overflow warning that
+ is by default on.
+ Branch: cfgperl
+ ! embed.pl global.sym pod/perldelta.pod pod/perldiag.pod pp.c
+ ! proto.h t/op/oct.t t/pragma/warn/6default t/pragma/warn/util
+ ! toke.c util.c
+____________________________________________________________________________
+[ 3831] By: jhi on 1999/07/29 11:40:04
+ Log: AIX exhibits different error on failed system().
+ Slightly modified patch via private email from
+ David R. Favor <dfavor@austin.ibm.com>
+ Branch: cfgperl
+ ! t/op/exec.t
+____________________________________________________________________________
+[ 3830] By: gsar on 1999/07/29 07:46:11
+ Log: cperl-mode.el v4.19
+ Branch: perl
+ ! emacs/cperl-mode.el
+____________________________________________________________________________
+[ 3829] By: gsar on 1999/07/29 07:30:35
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 28 Jul 1999 22:01:42 +0200
+ Message-ID: <37aa5f9b.12941448@smtp1.ibm.net>
+ Subject: [PATCH 5.005_58] win32/bin/pl2bat.pl doesn't work correctly
+ Branch: perl
+ ! win32/bin/pl2bat.pl
+____________________________________________________________________________
+[ 3828] By: gsar on 1999/07/29 07:19:27
+ Log: tweak previous change for multiple hits
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 3827] By: gsar on 1999/07/29 07:10:00
+ Log: band-aid for perldoc -t broken-ness (the new Pod::Text
+ really needs a pod2text() compatibility function)
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 3826] By: gsar on 1999/07/29 01:33:46
+ Log: minor tweaks to pods and toke.c comments
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perllexwarn.pod toke.c
+____________________________________________________________________________
+[ 3825] By: gsar on 1999/07/29 00:12:52
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> README.threads config_h.SH ext/IO/lib/IO/Handle.pm
+ !> ext/IO/lib/IO/Socket.pm ext/IO/lib/IO/Socket/INET.pm
+ !> ext/POSIX/POSIX.xs lib/ExtUtils/Install.pm perl.h
+ !> pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ !> pod/perllexwarn.pod pod/perlre.pod pp.c pp_sys.c
+ !> t/lib/io_unix.t t/op/oct.t t/pragma/warn/6default
+ !> t/pragma/warn/util toke.c util.c
+____________________________________________________________________________
+[ 3824] By: jhi on 1999/07/28 21:15:04
+ Log: Tiny patch to go over #3820 (via private mail from Lincoln).
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Handle.pm ext/IO/lib/IO/Socket.pm
+ ! ext/IO/lib/IO/Socket/INET.pm
+____________________________________________________________________________
+[ 3823] By: jhi on 1999/07/28 20:29:17
+ Log: Continue pack() doc honing.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3822] By: jhi on 1999/07/28 20:17:37
+ Log: Enhance pack() doc.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3821] By: jhi on 1999/07/28 18:34:50
+ Log: UNIX Domain Sockets are not implemented under QNX.
- ------ PORTABILITY - GENERAL ------
+ From: Norton Allen <allen@huarp.harvard.edu>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990728.010] Patch:t/lib/io_unix.t _58 QNX
+ Date: Wed, 28 Jul 1999 14:07:16 -0400 (edt)
+ Message-Id: <199907281807.OAA13167@bottesini.harvard.edu>
+ Branch: cfgperl
+ ! t/lib/io_unix.t
+____________________________________________________________________________
+[ 3820] By: jhi on 1999/07/28 18:13:37
+ Log: IO::* enhancements.
+
+ 1) write() and syswrite() will now accept a single-argument
+ form of the call, for consistency with Perl's syswrite().
+ 2) You can create a TCP-based IO::Socket::INET without forcing
+ a connect attempt. This allows you to configure its options
+ (like making it non-blocking) and then call connect() manually.
+ 3) Fixed a bug that prevented the IO::Socket::protocol() accessor
+ from ever returning the correct value.
+
+ From: Lincoln Stein <lstein@formaggio.cshl.org>
+ To: Graham Barr <gbarr@pobox.com>
+ Cc: Lincoln Stein <lstein@cshl.org>, perl5-porters@perl.org
+ Subject: Re: patch for IO::*
+ Date: Wed, 28 Jul 1999 13:55:05 -0400 (EDT)
+ Message-ID: <14239.17401.330408.145295@formaggio.cshl.org>
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Handle.pm ext/IO/lib/IO/Socket.pm
+ ! ext/IO/lib/IO/Socket/INET.pm
+____________________________________________________________________________
+[ 3819] By: gsar on 1999/07/28 18:08:06
+ Log: misc PERL_OBJECT tweaks; perlcore.dll is now perl56.dll
+ Branch: perl
+ ! README.win32 globals.c installperl iperlsys.h makedef.pl
+ ! perl.h win32/Makefile win32/makefile.mk win32/perllib.c
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3818] By: jhi on 1999/07/28 17:48:16
+ Log: Need to add QNX to the list for DONT_DECLARE_STD.
+ (The elimination of use of the _() macro apparently triggered
+ an incompatability with a #define of atof)
- Title: "Misc doc fixes for README.VMS"
- From: Dan Sugalski <sugalskd@osshe.edu>
- Msg-ID: <3.0.5.32.19980121113134.00924a20@osshe.edu>
- Files: README.vms
+ From: Norton Allen <allen@huarp.harvard.edu>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990728.008] Patch:perl.h _58 QNX
+ Date: Wed, 28 Jul 1999 13:06:23 -0400 (edt)
+ Message-Id: <199907281706.NAA07617@bottesini.harvard.edu>
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 3817] By: jhi on 1999/07/28 17:46:30
+ Log: Need to add some more conditions to deal with the case
+ defined(HAS_GETSPNAM) && ! defined(HAS_GETSPENT)
+ which is true for QNX4.
+ From: Norton Allen <allen@huarp.harvard.edu>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990728.009] Patch:pp_sys.c _58 QNX
+ Date: Wed, 28 Jul 1999 13:08:42 -0400 (edt)
+ Message-Id: <199907281708.NAA07947@bottesini.harvard.edu>
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3816] By: jhi on 1999/07/28 17:43:40
+ Log: The QNX shell needs a couple more semicolons.
- Title: "moved DynaLib"
- From: John Tobey <jtobey@channel1.com>
- Msg-ID: <199710182332.XAA21630@remote212>
- Files: ext/DynaLoader/DynaLoader.pm.PL
+ From: Norton Allen <allen@huarp.harvard.edu>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990728.007] Patch:Configure _58 QNX
+ Date: Wed, 28 Jul 1999 13:03:00 -0400 (edt)
+ Message-Id: <199907281703.NAA07363@bottesini.harvard.edu>
- ------ UTILITIES ------
+ plus silence metalint moanings on vendorprefix.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 3815] By: jhi on 1999/07/28 17:31:11
+ Log: Silence metalint on vendorprefix.U.
+ Branch: metaconfig
+ ! U/installdirs/vendorprefix.U
+____________________________________________________________________________
+[ 3814] By: jhi on 1999/07/28 17:13:29
+ Log: QNX shell needs more semicolons.
+ Branch: metaconfig/U/perl
+ ! Extensions.U
+____________________________________________________________________________
+[ 3813] By: jhi on 1999/07/28 17:05:08
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 3812] By: jhi on 1999/07/28 16:20:17
+ Log: Fix a typo, un-shout, and reformat the installation output.
+ Branch: cfgperl
+ ! lib/ExtUtils/Install.pm
+____________________________________________________________________________
+[ 3811] By: gsar on 1999/07/28 15:41:11
+ Log: fix typo that caused INSTALLPRIVLIB to have doubled 'perl5'
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 3810] By: jhi on 1999/07/28 13:55:57
+ Log: Talk more about subsecond things in perlfunc.
+ (Yes, redundant with perlfaq8.)
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3809] By: jhi on 1999/07/28 07:23:48
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> configpm hints/freebsd.sh lib/Pod/Html.pm perl.h t/op/grent.t
+ !> t/op/pwent.t
+____________________________________________________________________________
+[ 3808] By: jhi on 1999/07/28 07:23:03
+ Log: Document toke.c.
+ From: Nathan Torkington <gnat@frii.com>
+ To: perl5-porters@perl.org
+ Subject: Re: toke.c patch, work in progress
+ Date: Tue, 27 Jul 1999 23:02:09 -0600 (MDT)
+ Message-ID: <14238.36561.979473.667842@localhost.frii.com>
+ Branch: cfgperl
+ ! toke.c
+____________________________________________________________________________
+[ 3807] By: jhi on 1999/07/28 07:10:56
+ Log: perlre clarification.
- Title: "Searching for FAQs (patch to perldoc)"
- From: Piers Cawley <pdcawley@bofh.org.uk>, Russ Allbery <rra@stanford.edu>
- Msg-ID: <m3d8gsb8uk.fsf@windlord.Stanford.EDU>,
- <m3iuqkfmiq.fsf@tower.bofh.org.uk>
- Files: utils/perldoc.PL
+ From: Ian Phillipps <ian@dial.pipex.com>
+ To: Perl 5 Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.00557] Add definite article to perlre.pod
+ Date: Tue, 27 Jul 1999 10:46:29 +0100
+ Message-ID: <19990727104629.A10074@homer.diplex.co.uk>
+ Branch: cfgperl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 3806] By: gsar on 1999/07/28 07:07:46
+ Log: fix the perl -V breakage
- Title: "perldoc"
- From: Ted Ashton <ashted@southern.edu>
- Msg-ID: <199802271510.KAA10506@ns.southern.edu>
- Files: utils/perldoc.PL
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Jarkko Hietaniemi <jhi@iki.fi>
+ Cc: "John L. Allen" <allen@grumman.com>, perl5-porters@perl.org,
+ gsar@activestate.com
+ Subject: Re: Follow up to: _58 on AIX 431
+ Date: Tue, 27 Jul 1999 17:42:00 -0400
+ Message-ID: <19990727174200.A12775@monk.mps.ohio-state.edu>
+ Branch: perl
+ ! configpm
+____________________________________________________________________________
+[ 3805] By: gsar on 1999/07/28 07:03:34
+ Log: avoid warning (from Doug MacEachern)
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 3804] By: gsar on 1999/07/28 06:59:30
+ Log: Pod::Html tweak
- Title: "perldoc -f not using pod2man"
- From: Russ Allbery <rra@stanford.edu>
- Msg-ID: <m3hg4f9vyy.fsf@windlord.Stanford.EDU>
- Files: utils/perldoc.PL
+ From: jan.dubois@ibm.net (Jan Dubois)
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_58] pod2html: Missing chunk for VMS filenames
+ Date: Tue, 27 Jul 1999 22:14:12 +0200
+ Message-ID: <37a50af0.46171380@smtp1.ibm.net>
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 3803] By: gsar on 1999/07/28 06:56:38
+ Log: freebsd hints update
- Title: "perldoc -m should not require pod"
- From: Robin Houston <robin@nml.guardian.co.uk>
- Msg-ID: <199803241319.NAA24777@stringfellow.guardian.co.uk>
- Files: utils/perldoc.PL
+ From: Anton Berezin <tobez@plab.ku.dk>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990727.034] Not OK: perl 5.00558 on i386-freebsd-thread4.0-current (UNINSTALLED)
+ Date: Tue, 27 Jul 1999 20:29:39 +0200 (CEST)
+ Message-Id: <199907271829.UAA62861@lion.plab.ku.dk>
+ Branch: perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 3802] By: gsar on 1999/07/28 06:51:32
+ Log: cosmetic testsuite patch
- Title: "small fix for perldoc in perl 5.004_04"
- From: Julian Yip <julian@imoney.com>
- Msg-ID: <Roam.SIMC.2.0.6.884805579.5280.julian@imoney.com>
- Files: utils/perldoc.PL
- Branch: maint-5.004/perl
- - ext/DynaLoader/DynaLoader.pm
- ! Changes Configure INSTALL README.vms
- ! ext/DynaLoader/DynaLoader.pm.PL ext/Socket/Socket.pm
- ! lib/ExtUtils/MakeMaker.pm lib/Tie/Hash.pm lib/constant.pm
- ! lib/integer.pm myconfig pod/buildtoc pod/checkpods.PL
- ! pod/perl.pod pod/perlbook.pod pod/perldelta.pod
- ! pod/perldiag.pod pod/perldsc.pod pod/perlfunc.pod
- ! pod/perlguts.pod pod/perlhist.pod pod/perllocale.pod
- ! pod/perlmod.pod pod/perlop.pod pod/perlre.pod pod/perlrun.pod
- ! pod/perlsec.pod pod/perlstyle.pod pod/perlsyn.pod
- ! pod/perltoc.pod pod/perltrap.pod pod/perlvar.pod
- ! pod/pod2latex.PL toke.c utils/perldoc.PL
+ From: Graham Barr <gbarr@ti.com>
+ To: Perl5 Porters <perl5-porters@perl.org>
+ Subject: 5.005_58 build
+ Date: Tue, 27 Jul 1999 08:09:25 -0500
+ Message-ID: <19990727080925.F4683@dal.asp.ti.com>
+ Branch: perl
+ ! t/op/grent.t t/op/pwent.t
+____________________________________________________________________________
+[ 3801] By: jhi on 1999/07/27 13:49:39
+ Log: Minuscule cleanup of the integer overflow patch.
+ Branch: cfgperl
+ ! util.c
+____________________________________________________________________________
+[ 3800] By: jhi on 1999/07/27 13:37:23
+ Log: Test hex('x...').
+ Branch: cfgperl
+ ! t/op/oct.t
+____________________________________________________________________________
+[ 3799] By: jhi on 1999/07/27 12:45:45
+ Log: Integrate with Sarathy (5.005_58).
+ Branch: cfgperl
+ - ext/B/byteperl.c
+ !> Changes MANIFEST Porting/makerel configpm embed.h embed.pl
+ !> ext/Devel/DProf/DProf.xs ext/POSIX/POSIX.pm
+ !> ext/SDBM_File/Makefile.PL lib/AutoLoader.pm
+ !> lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ !> lib/Pod/Parser.pm lib/SelfLoader.pm os2/OS2/REXX/Makefile.PL
+ !> perl.h pod/perldelta.pod pod/perlfaq9.pod pod/perlhist.pod
+ !> win32/bin/pl2bat.pl win32/config_H.bc win32/config_H.gc
+ !> win32/config_H.vc
+____________________________________________________________________________
+[ 3798] By: jhi on 1999/07/27 12:42:43
+ Log: Integer constants (0x, 0[0-7], 0b) now overflow fatally,
+ they used to be just optional lexical warnings.
+ Also, with warnings turned on, constants > 2**32-1
+ trigger a non-portability warning.
+ Branch: cfgperl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perllexwarn.pod pp.c
+ ! t/op/oct.t t/pragma/warn/6default t/pragma/warn/util toke.c
+ ! util.c
+____________________________________________________________________________
+[ 3797] By: gsar on 1999/07/27 10:48:27
+ Log: here lies 5.005_58
+ Branch: perl
+ - ext/B/byteperl.c
+ ! Changes MANIFEST Porting/makerel pod/perldelta.pod
+ ! pod/perlfaq9.pod pod/perlhist.pod
----------------
-Version 5.004_64
+Version 5.005_58
----------------
____________________________________________________________________________
-[ 871] By: mbeattie on 1998/04/03 13:38:59
- Log: Update Changes5.004 and Changes, fix MANIFEST
+[ 3796] By: gsar on 1999/07/27 09:23:42
+ Log: regenerate win32/config_H.?c
Branch: perl
- + Changes
- ! Changes5.004 MANIFEST
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
____________________________________________________________________________
-[ 870] By: mbeattie on 1998/04/03 13:36:29
- Log: Rename Changes to Changes5.004 (via an integrate)
+[ 3795] By: gsar on 1999/07/27 09:02:31
+ Log: From: Tye McQueen <tye@metronet.com>
+ Date: Mon, 26 Jul 1999 19:19:22 -0500 (CDT)
+ Message-Id: <199907270019.AA08223@metronet.com>
+ Subject: Patch pl2bat.pl so batch file can fail
Branch: perl
- +> Changes5.004
- - Changes
+ ! win32/bin/pl2bat.pl
____________________________________________________________________________
-[ 869] By: mbeattie on 1998/04/03 11:53:00
- Log: Subject: [PATCH] Perl 5.005b1t2/perl5.004_63 (resend)
- Date: Wed, 18 Mar 1998 01:24:20 +0100 (MET)
- From: Jan-Pieter Cornet <johnpc@xs4all.net>
+[ 3794] By: gsar on 1999/07/27 08:59:58
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 26 Jul 1999 01:09:00 -0400 (EDT)
+ Message-Id: <199907260509.BAA26303@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] decrease memory footprint of standard modules
Branch: perl
- ! sv.c t/op/misc.t
+ ! configpm ext/POSIX/POSIX.pm lib/AutoLoader.pm
+ ! lib/SelfLoader.pm
____________________________________________________________________________
-[ 868] By: mbeattie on 1998/04/03 11:16:26
- Log: Integrate win32 branch into mainline
+[ 3793] By: gsar on 1999/07/27 08:19:16
+ Log: support -DPERL_BINCOMPAT_5005, still needs a Configure test
+ (from Andy Dougherty)
Branch: perl
- !> (integrate 31 files)
+ ! embed.h embed.pl
____________________________________________________________________________
-[ 867] By: gsar on 1998/04/03 08:47:55
- Log: config.* fixes
- Branch: win32/perl
- ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/makefile.mk
+[ 3792] By: gsar on 1999/07/27 08:04:19
+ Log: recognize more constructs such as C<$-> in pod (from Russ Allbery
+ and Brad Appleton)
+ Branch: perl
+ ! lib/Pod/Parser.pm
____________________________________________________________________________
-[ 866] By: gsar on 1998/04/03 07:22:50
- Log: fixup hv_free_ent() to not fail on null HeVAL()
- Branch: win32/perl
- ! hv.c perl.c
-____________________________________________________________________________
-[ 865] By: gsar on 1998/04/03 07:06:12
- Log: integrate mainline
- Branch: win32/perl
- +> ext/Thread/Thread/Signal.pm t/op/hashwarn.t
- !> (integrate 71 files)
-____________________________________________________________________________
-[ 864] By: gsar on 1998/04/03 06:59:37
- Log: implement stack-of-stacks so that magic invocations don't
- invalidate local stack pointer
- Branch: win32/perl
- ! av.c cop.h deb.c embed.h embedvar.h global.sym gv.c interp.sym
- ! intrpvar.h mg.c op.c perl.c pp.h pp_ctl.c pp_sys.c proto.h
- ! scope.c sv.c t/op/runlevel.t thrdvar.h util.c
-____________________________________________________________________________
-[ 863] By: gsar on 1998/04/03 01:26:09
- Log: add AS patch#15
- Branch: asperl
- ! ipenv.h lib/ExtUtils/MM_Unix.pm perl.c perlenv.h
- ! win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/config_h.PL win32/config_sh.PL win32/runperl.c
- ! win32/win32.c win32/win32.h
+[ 3791] By: gsar on 1999/07/27 07:50:54
+ Log: cover case where CLK_TCK is a float, not integer (from
+ alexander smishlajev <als@turnhere.com>)
+ Branch: perl
+ ! ext/Devel/DProf/DProf.xs
____________________________________________________________________________
-[ 862] By: mbeattie on 1998/04/02 17:08:43
- Log: Subject: [PATCH for 5.004_63] Config_63-04-05.diff
- Date: Thu, 2 Apr 1998 11:56:51 -0500 (EST)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+[ 3790] By: gsar on 1999/07/27 07:45:08
+ Log: provide MakeMaker attribute PERL_MALLOC_OK that allows extensions
+ to call Perl_malloc() as malloc() (from Ilya Zakharevich)
Branch: perl
- ! Configure ext/Socket/Socket.xs myconfig
+ ! ext/SDBM_File/Makefile.PL lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MakeMaker.pm os2/OS2/REXX/Makefile.PL perl.h
____________________________________________________________________________
-[ 861] By: mbeattie on 1998/04/02 16:32:53
- Log: Change 854 added { NULL, 0 } to sdbm.h which needs to be {0, 0}
- since appropriate headers aren't included.
+[ 3789] By: jhi on 1999/07/27 07:44:55
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> lib/Pod/Text/Color.pm lib/Pod/Text/Termcap.pm
+ !> MANIFEST doio.c embed.h embed.pl ext/B/B/CC.pm
+ !> ext/SDBM_File/sdbm/sdbm.h global.sym lib/Pod/Html.pm
+ !> lib/Pod/Text.pm objXSUB.h opcode.h opcode.pl perlapi.c
+ !> pod/perldiag.pod pod/perlfunc.pod pod/pod2text.PL pp_sys.c
+ !> proto.h t/comp/proto.t t/io/open.t
+____________________________________________________________________________
+[ 3788] By: gsar on 1999/07/27 07:29:59
+ Log: replace Pod::Text with Pod::SimpleText v0.01 (thanks
+ to Russ Allbery <rra@stanford.edu>); s/Simple// and
+ s/pod2txt/pod2text/ etc.
+ Branch: perl
+ + lib/Pod/Text/Color.pm lib/Pod/Text/Termcap.pm
+ ! MANIFEST lib/Pod/Text.pm pod/pod2text.PL
+____________________________________________________________________________
+[ 3787] By: gsar on 1999/07/27 06:48:40
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Wed, 16 Jun 1999 14:40:09 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9906161435390.248-100000@newton.phys>
+ Subject: Re: [ID 19990608.003] my_bcopy problem; Unixware 2.0.3
Branch: perl
- ! ext/SDBM_File/sdbm/sdbm.h
+ ! ext/SDBM_File/sdbm/sdbm.h
____________________________________________________________________________
-[ 860] By: mbeattie on 1998/04/02 16:17:11
- Log: Bumped patchlevel.h to 64
+[ 3786] By: gsar on 1999/07/27 06:30:09
+ Log: applied suggested patch; added missing prototype changes to
+ opcode.pl along with documentation typos (feature still needs
+ to be described in perlopentut.pod and summarized in
+ perldelta.pod)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 17 Jun 1999 00:39:34 -0400 (EDT)
+ Message-Id: <199906170439.AAA18154@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00557] 3-arg open
Branch: perl
- ! patchlevel.h
+ ! doio.c embed.h embed.pl global.sym objXSUB.h opcode.h
+ ! opcode.pl perlapi.c pod/perldiag.pod pod/perlfunc.pod pp_sys.c
+ ! proto.h t/comp/proto.t t/io/open.t
____________________________________________________________________________
-[ 859] By: mbeattie on 1998/04/02 16:16:26
- Log: Subject: Re: [PATCH] 5.004_63: UNICOS 9
- Date: Fri, 20 Mar 1998 19:39:28 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3785] By: gsar on 1999/07/27 04:36:39
+ Log: don't quit if =head* wasn't found (suggested by Roland Bauer
+ <roland.bauer@fff.at>)
Branch: perl
- ! hints/unicos.sh regcomp.h
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 858] By: mbeattie on 1998/04/02 16:13:24
- Log: Subject: [PATCH] Re: Odd number of elements in hash list.
- Date: Sat, 28 Mar 1998 15:26:46 -0800 (PST)
- From: Tom Phoenix <rootbeer@teleport.com>
+[ 3784] By: gsar on 1999/07/27 03:56:17
+ Log: change#3762 wasn't needed
Branch: perl
- + t/op/hashwarn.t
- ! MANIFEST pod/perldiag.pod pp.c pp_hot.c
+ ! ext/B/B/CC.pm
____________________________________________________________________________
-[ 857] By: mbeattie on 1998/04/02 16:08:43
- Log: Subject: [PATCH 5.004_(04|63)] Close VMS security hole
- Date: Sat, 28 Mar 1998 02:05:03 -0500 (EST)
- From: Charles Bailey <BAILEY@newman.upenn.edu>
+[ 3783] By: jhi on 1999/07/26 19:08:21
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes makedef.pl patchlevel.h pod/perlfunc.pod pp_ctl.c
+ !> toke.c utils/dprofpp.PL win32/Makefile win32/config_H.bc
+ !> win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 3782] By: gsar on 1999/07/26 18:16:50
+ Log: update Changes, patchlevel &c.
Branch: perl
- ! vms/vms.c
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 856] By: mbeattie on 1998/04/02 16:07:44
- Log: Subject: [PATCH] mv-if-diff
- Date: Fri, 27 Mar 98 18:06:11 GMT
- From: Robin Barker <rmb1@cise.npl.co.uk>
+[ 3781] By: gsar on 1999/07/26 17:54:47
+ Log: a more correct fix for change#2744
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Sun, 25 Jul 1999 14:02:25 -0500 (CDT)
+ Message-ID: <14235.24385.671437.246345@alias-2.pr.mcs.net>
+ Subject: [PATCH _57] Re: toke.c questions
Branch: perl
- ! mv-if-diff
+ ! toke.c
____________________________________________________________________________
-[ 855] By: mbeattie on 1998/04/02 16:06:54
- Log: From: Jan-Pieter Cornet <johnpc@xs4all.net>
- Subject: Re: [PATCH] [BUG 5.004_63] define/set of PERL_DESTRUCT_LEVEL
- Date: Fri, 27 Mar 1998 02:11:21 +0100 (MET)
- Subject: [PATCH] another destruct_level fix
- Date: Mon, 30 Mar 1998 23:48:12 +0200 (MET DST)
+[ 3780] By: gsar on 1999/07/26 17:37:04
+ Log: utime() doc typo from Greg Bacon <gbacon@itsc.uah.edu>
Branch: perl
- ! perl.c sv.c
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 854] By: mbeattie on 1998/04/02 16:03:37
- Log: Subject: Next wave of _63 VMS patches
- Date: Thu, 26 Mar 1998 15:11:50 -0500 (EST)
- From: Charles Bailey <BAILEY@newman.upenn.edu>
+[ 3779] By: jhi on 1999/07/26 16:37:23
+ Log: Dusting off.
+ Branch: cfgperl
+ ! README.threads
+____________________________________________________________________________
+[ 3778] By: gsar on 1999/07/26 13:28:46
+ Log: avoid DIVZERO
Branch: perl
- ! EXTERN.h INTERN.h ext/SDBM_File/Makefile.PL
- ! ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/dba.c
- ! ext/SDBM_File/sdbm/dbd.c ext/SDBM_File/sdbm/dbu.c
- ! ext/SDBM_File/sdbm/hash.c ext/SDBM_File/sdbm/pair.c
- ! ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
- ! ext/Thread/io.t installperl lib/ExtUtils/MM_VMS.pm
- ! lib/Net/Ping.pm perldir.h perlsdio.h t/lib/english.t
- ! vms/config.vms vms/descrip.mms vms/ext/Filespec.pm
- ! vms/ext/Stdio/0README.txt vms/ext/Stdio/Stdio.pm
- ! vms/ext/Stdio/Stdio.xs vms/ext/Stdio/test.pl
- ! vms/ext/filespec.t vms/genconfig.pl vms/perly_c.vms vms/vms.c
- ! vms/vmsish.h
-____________________________________________________________________________
-[ 853] By: mbeattie on 1998/04/02 15:55:46
- Log: Subject: [PATCH 5.00463] Confusing error from perl -e "x'"
- Date: Wed, 25 Mar 1998 17:43:17 -0500 (EST)
- From: Hans Mulder <hansmu@xs4all.nl>
+ ! utils/dprofpp.PL
+____________________________________________________________________________
+[ 3777] By: gsar on 1999/07/26 13:18:53
+ Log: warnings identified by Borland compiler
Branch: perl
- ! toke.c
+ ! makedef.pl pp_ctl.c
____________________________________________________________________________
-[ 852] By: mbeattie on 1998/04/02 15:54:24
- Log: Subject: [PATCH] small fixups in pod2latex.PL
- Date: 25 Mar 1998 13:30:25 -0800
- From: "Darren/Torin/Who Ever..." <torin@daft.com>
+[ 3776] By: jhi on 1999/07/26 13:07:36
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/Carp/Heavy.pm pp_ctl.c pp_hot.c
+____________________________________________________________________________
+[ 3775] By: gsar on 1999/07/26 12:55:43
+ Log: avoid infinite recursion when Thread.pm croaks during
+ bootstrap
Branch: perl
- ! pod/pod2latex.PL
+ ! lib/Carp/Heavy.pm
____________________________________________________________________________
-[ 851] By: mbeattie on 1998/04/02 15:50:58
- Log: Subject: [PATCH] hints/irix_6.sh with GCC
- Date: Tue, 24 Mar 1998 12:25:10 -0800 (EST)
- From: kstar@chapin.edu (Kurt D. Starsinic)
+[ 3774] By: gsar on 1999/07/26 12:43:02
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! hints/irix_6.sh
+ +> lib/Carp/Heavy.pm
+ !> MANIFEST Makefile.SH cflags.SH configpm ext/util/make_ext
+ !> lib/AutoSplit.pm lib/Carp.pm makedepend.SH pod/pod2html.PL
+ !> pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL
+ !> pod/pod2usage.PL pod/podchecker.PL pod/podselect.PL
+ !> writemain.SH x2p/Makefile.SH x2p/cflags.SH
____________________________________________________________________________
-[ 850] By: mbeattie on 1998/04/02 15:45:33
- Log: Subject: [PATCH] perldoc -m
- Date: Tue, 24 Mar 1998 13:19:38 GMT
- From: Robin Houston <robin@nml.guardian.co.uk>
+[ 3773] By: jhi on 1999/07/26 12:40:29
+ Log: Use long doubles only if they are useful.
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 3772] By: gsar on 1999/07/26 12:33:11
+ Log: typo in change#3768
Branch: perl
- ! utils/perldoc.PL
+ ! pp_hot.c
____________________________________________________________________________
-[ 849] By: mbeattie on 1998/04/02 15:42:52
- Log: Subject: [PATCH for 5.004_63] dos-djgpp update
- Date: Mon, 23 Mar 1998 14:13:46 +0100
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+[ 3771] By: gsar on 1999/07/26 12:08:27
+ Log: alpha-stage support for user-hooks in @INC
+ From: Ken Fox <kfox@ford.com>
+ Date: Mon, 19 Jul 1999 22:12:29 -0400 (EDT)
+ Message-Id: <199907200213.WAA02816@mailfw2.ford.com>
+ Subject: Re: loading remote modules
Branch: perl
- ! djgpp/config.over hints/dos_djgpp.sh
+ ! pp_ctl.c
____________________________________________________________________________
-[ 848] By: mbeattie on 1998/04/02 15:38:19
- Log: Subject: [PATCH] Stale SP in pp_substr
- Date: Thu, 19 Mar 1998 21:28:02 -0600 (CST)
- From: Stephen McCamant <alias@mcs.com>
+[ 3770] By: jhi on 1999/07/26 11:38:36
+ Log: Back out #3735. Needs more work.
+ Branch: cfgperl
+ ! Makefile.SH cflags.SH configpm ext/util/make_ext
+ ! lib/AutoSplit.pm makedepend.SH pod/pod2html.PL
+ ! pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL
+ ! pod/pod2usage.PL pod/podchecker.PL pod/podselect.PL
+ ! writemain.SH x2p/Makefile.SH x2p/cflags.SH
+____________________________________________________________________________
+[ 3769] By: jhi on 1999/07/26 11:24:45
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 35 files)
+____________________________________________________________________________
+[ 3768] By: gsar on 1999/07/26 11:03:07
+ Log: optimize method name lookup
+ From: Chip Salzenberg <chip@perlsupport.com>
+ Date: Thu, 22 Jul 1999 13:43:36 -0400
+ Message-ID: <19990722134336.Q391@perlsupport.com>
+ Subject: [PATCH] OP_METHOD_NAMED
+ Branch: perl
+ ! dump.c embed.h embed.pl ext/Opcode/Opcode.pm objXSUB.h op.c
+ ! opcode.h opcode.pl perlapi.c pp.sym pp_hot.c pp_proto.h
+ ! proto.h
+____________________________________________________________________________
+[ 3767] By: gsar on 1999/07/26 10:44:11
+ Log: allow arrow omission in $foo[10]->('foo') etc. (but not in
+ foo()->()); rework grammar to remove conflicts
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Fri, 23 Jul 1999 15:55:22 -0500 (CDT)
+ Message-ID: <14232.54970.771570.548676@alias-2.pr.mcs.net>
+ Subject: [PATCH _57, long] Re: optional arrow asymmetry
Branch: perl
- ! pp.c
+ ! Makefile.SH embed.h embed.pl global.sym objXSUB.h op.c
+ ! perlapi.c perly.c perly.h perly.y perly_c.diff proto.h
+ ! vms/perly_c.vms vms/perly_h.vms
____________________________________________________________________________
-[ 847] By: mbeattie on 1998/04/02 15:36:33
- Log: Add missing export of "nice" to ext/POSIX/POSIX.pm (Phil Tait)
+[ 3766] By: jhi on 1999/07/26 10:18:56
+ Log: Use $< instead of $*.c in *perlmain.o rules.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 3765] By: gsar on 1999/07/26 09:28:48
+ Log: From: Ian Phillipps <ian@dial.pipex.com>
+ Date: Fri, 23 Jul 1999 23:35:56 +0100
+ Message-ID: <19990723233556.B2435@homer.diplex.co.uk>
+ Subject: (Version 2) Extending unpack to deal with counted strings
Branch: perl
- ! ext/POSIX/POSIX.pm
+ ! pod/perldiag.pod pod/perlfunc.pod pp.c t/op/pack.t
____________________________________________________________________________
-[ 846] By: mbeattie on 1998/04/02 15:34:36
- Log: Subject: [PATCH] 5.004_63: further -e patching
- Date: Wed, 18 Mar 1998 23:21:08 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3764] By: jhi on 1999/07/26 09:17:26
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_57] Lean Carp.pm with Carp/Heavy.pm
+ Date: Mon, 26 Jul 1999 04:05:27 -0400 (EDT)
+ Message-Id: <199907260805.EAA26888@monk.mps.ohio-state.edu>
+
+ The patch was based on 5_57 so had to re-apply lib/Carp.pm
+ parts of changes #3498, #3696, and #3702 for the new
+ lib/Carp/Heavy.pm.
+ Branch: cfgperl
+ + lib/Carp/Heavy.pm
+ ! MANIFEST lib/Carp.pm
+____________________________________________________________________________
+[ 3763] By: gsar on 1999/07/26 09:03:17
+ Log: ~ isn't valid in VMS filenames
Branch: perl
- ! perl.c pod/perldiag.pod
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 845] By: mbeattie on 1998/04/02 15:25:18
- Log: Andy Dougherty's configuration patches (Config_63-01 up to 04).
+[ 3762] By: gsar on 1999/07/26 08:59:47
+ Log: setstate stop-gap from Vishal Bhatia
Branch: perl
- ! Configure INSTALL Policy_sh.SH Porting/Glossary
- ! Porting/config.sh Porting/config_H config_h.SH
- ! ext/POSIX/POSIX.xs handy.h hints/hpux.sh myconfig perlsock.h
- ! pp.c pp_sys.c regexec.c
+ ! ext/B/B/CC.pm
____________________________________________________________________________
-[ 844] By: mbeattie on 1998/04/02 14:28:17
- Log: Subject: [PATCH 5.004_63] perlrun.pod: PERL_DEBUG_MSTATS
- Date: Wed, 18 Mar 1998 20:40:19 +0100
- From: Achim Bohnet <ach@mpe.mpg.de>
+[ 3761] By: gsar on 1999/07/26 08:06:39
+ Log: patch for pp_foo -> Perl_pp_foo changes from Vishal Bhatia;
+ add B::OP::name() method that returns just the op_name;
+ convert Deparse et all to use that instead of B::OP::ppaddr();
+ add support for OP_SETSTATE in Deparse
Branch: perl
- ! pod/perlrun.pod
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/Bblock.pm ext/B/B/Bytecode.pm
+ ! ext/B/B/C.pm ext/B/B/CC.pm ext/B/B/Deparse.pm ext/B/B/Lint.pm
+ ! ext/B/B/Xref.pm opcode.h opcode.pl
____________________________________________________________________________
-[ 843] By: mbeattie on 1998/04/02 14:26:52
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: 5.004_63 picky compiler fixes [PATCH]
- Date: Wed, 18 Mar 1998 09:36:32 -0800
- Subject: [PATCH 5.004_63] Fix function prototype with long doubles
- Date: Wed, 18 Mar 1998 14:48:19 -0800
+[ 3760] By: jhi on 1999/07/26 07:14:43
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 43 files)
+____________________________________________________________________________
+[ 3759] By: gsar on 1999/07/26 05:12:24
+ Log: add disclaimer about perl 4 libraries (modified version of
+ patch suggested by Clinton Pierce <cpierce1@ford.com>)
Branch: perl
- ! ext/POSIX/POSIX.xs ext/Thread/Thread.xs vms/vms.c
+ ! lib/abbrev.pl lib/bigfloat.pl lib/bigint.pl lib/bigrat.pl
+ ! lib/cacheout.pl lib/chat2.pl lib/complete.pl lib/ctime.pl
+ ! lib/dotsh.pl lib/exceptions.pl lib/fastcwd.pl lib/flush.pl
+ ! lib/ftp.pl lib/getcwd.pl lib/getopt.pl lib/getopts.pl
+ ! lib/hostname.pl lib/look.pl lib/pwd.pl lib/termcap.pl
____________________________________________________________________________
-[ 842] By: mbeattie on 1998/04/02 14:22:41
- Log: From: Stephen Potter <spp@psasolar.colltech.com>
- Subject: Re: doc: perlrun typo
- Date: Wed, 18 Mar 1998 10:06:55 -0600
- Subject: Re: [PATCH 5.004_63] PerlLIO abstraction cleanup
- Date: Tue, 24 Mar 1998 21:20:51 -0600
+[ 3758] By: gsar on 1999/07/26 04:48:35
+ Log: make reset() behave with high-bit characters
+ From: Ian Phillipps <ian@dial.pipex.com>
+ Date: Thu, 22 Jul 1999 22:48:59 +0100
+ Message-ID: <19990722224859.A27987@homer.diplex.co.uk>
+ Subject: [PATCH 5.005_57] sv_reset can cause stack corruption
Branch: perl
- ! mg.c perl.c pod/perlrun.pod pp_hot.c pp_sys.c util.c
+ ! sv.c
____________________________________________________________________________
-[ 841] By: mbeattie on 1998/04/02 14:17:31
- Log: Subject: [PATCH] Add "Full 64 bit support" to Todo; document Todo in pumpkin.pod
- Date: Wed, 18 Mar 1998 12:44:58 +0100
- From: Dominic Dunlop <domo@vo.lu>
+[ 3757] By: gsar on 1999/07/26 04:40:32
+ Log: update to perlport-1.44 from Chris Nandor <pudge@pobox.com>
Branch: perl
- ! Porting/pumpkin.pod Todo
+ ! pod/perlport.pod
____________________________________________________________________________
-[ 840] By: mbeattie on 1998/04/02 14:14:22
- Log: Subject: [PATCH] Configure hints/ patches
- Date: Wed, 18 Mar 1998 02:47:38 +0100 (MET)
- From: Jan-Pieter Cornet <johnpc@xs4all.net>
+[ 3756] By: gsar on 1999/07/26 04:20:37
+ Log: dprofpp pod additions from Nathan Torkington <gnat@frii.com>
Branch: perl
- ! hints/linux.sh hints/qnx.sh
+ ! utils/dprofpp.PL
____________________________________________________________________________
-[ 839] By: mbeattie on 1998/04/02 14:13:13
- Log: Remove duplicate code in cygwin32/perlgcc (Blair Zajac)
+[ 3755] By: gsar on 1999/07/26 04:18:00
+ Log: disable VPATH for now (breaks x2p build)
Branch: perl
- ! cygwin32/perlgcc
+ ! x2p/Makefile.SH
____________________________________________________________________________
-[ 838] By: gsar on 1998/03/28 05:01:57
- Log: fix Env.pm to weed out illegal names
- Branch: win32/perl
- ! lib/Env.pm
+[ 3754] By: gsar on 1999/07/26 03:15:33
+ Log: INSTALL =~ s/5.006/5.6/; delay loading Errno until needed
+ (%! has the necessary magic); misc typos
+ Branch: perl
+ ! INSTALL ext/DB_File/DB_File.pm ext/Fcntl/Fcntl.pm
+ ! ext/GDBM_File/GDBM_File.pm gv.c jpl/JNI/JNI.pm
+ ! lib/AutoLoader.pm lib/CPAN.pm perl.c pod/perllocale.pod
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 837] By: gsar on 1998/03/28 04:39:43
- Log: fix typo in makefile.mk
- Branch: win32/perl
- ! win32/makefile.mk
+[ 3753] By: gsar on 1999/07/26 02:38:28
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> t/pragma/locale/latin1 t/pragma/locale/utf8
+ !> (integrate 53 files)
____________________________________________________________________________
-[ 836] By: gsar on 1998/03/23 17:40:15
- Log: add file: to installhtml URLs
- Branch: win32/perl
- ! win32/Makefile win32/makefile.mk
+[ 3752] By: gsar on 1999/07/26 02:11:31
+ Log: ensure implicitly closed handles don't set $? or $!
+ Branch: perl
+ ! doio.c embed.h embed.pl perlapi.c proto.h sv.c t/io/pipe.t
____________________________________________________________________________
-[ 835] By: mbeattie on 1998/03/18 11:03:11
- Log: Add Thread::Signal to run signal handlers reliably in a new thread
+[ 3751] By: gsar on 1999/07/26 01:28:34
+ Log: change#3534 didn't preserve undef return values from caller()
Branch: perl
- + ext/Thread/Thread/Signal.pm
- ! MANIFEST ext/Thread/Thread.xs
-
-----------------
-Version 5.004_63
-----------------
-
+ ! Changes pp_ctl.c
+____________________________________________________________________________
+[ 3750] By: jhi on 1999/07/25 20:59:29
+ Log: Back up a tiny bit from #3735.
+ This may break builds outside the source directory
+ but then again, they do not work that ell yet anyway.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 3750] By: jhi on 1999/07/25 20:59:29
+ Log: Back up a tiny bit from #3735.
+ This may break builds outside the source directory
+ but then again, they do not work that ell yet anyway.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 3749] By: jhi on 1999/07/25 19:15:55
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> lib/ExtUtils/MM_Unix.pm toke.c utils/h2xs.PL
+____________________________________________________________________________
+[ 3748] By: jhi on 1999/07/25 19:06:59
+ Log: Recode locale.t so that the change in #3730
+ is not needed and locale.t works both without
+ and with the utf8 pragma.
+ Branch: cfgperl
+ + t/pragma/locale/latin1 t/pragma/locale/utf8
+ ! MANIFEST t/pragma/locale.t
____________________________________________________________________________
-[ 834] By: mbeattie on 1998/03/17 16:19:10
- Log: Policy_sh.SH had extra $ in pager=$pager comment (Hallvard B Furuseth)
+[ 3747] By: jhi on 1999/07/25 19:01:46
+ Log: Like #3743.
+ Branch: cfgperl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 3746] By: gsar on 1999/07/25 18:08:58
+ Log: add option to omit Changes file, from Abigail <abigail@delanet.com>;
+ append a HISTORY section to POD if option is used
Branch: perl
- ! Policy_sh.SH
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 833] By: mbeattie on 1998/03/17 16:11:02
- Log: Integrate win32 branch into mainline.
+[ 3745] By: gsar on 1999/07/25 17:40:03
+ Log: warn rather than die when parse_version() can't cut it (from
+ Michael G Schwern <schwern@pobox.com>)
Branch: perl
- !> regcomp.c win32/config.bc win32/config.gc win32/config.vc
- !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
- !> win32/win32.c
+ ! lib/ExtUtils/MM_Unix.pm
____________________________________________________________________________
-[ 832] By: gsar on 1998/03/17 14:32:39
- Log: propagate bugfix @ change831 from asperl
- Branch: win32/perl
- ! regcomp.c
+[ 3744] By: gsar on 1999/07/25 16:32:48
+ Log: make map behave like grep wrt indirect object slot when
+ there are parentheses; revert an experimental mod by Larry
+ in change#2038 that failed to parse %{{qw(a b c)}} properly
+ (this means C<map {use Foo; ...} ...> still needs a proper
+ fix)
+ Branch: perl
+ ! toke.c
____________________________________________________________________________
-[ 831] By: gsar on 1998/03/17 14:02:51
- Log: fix buggy order of free() in regcomp.c (from AS)
- Branch: asperl
- ! regcomp.c
+[ 3743] By: jhi on 1999/07/25 16:24:55
+ Log: Fix a typo in #3725.
+ Branch: cfgperl
+ ! utils/perlbug.PL
____________________________________________________________________________
-[ 830] By: gsar on 1998/03/17 01:10:54
- Log: add a part of AS patch#14, backout incomplete variable
- name changes for gcc. Builds and tests under VC/BC once again.
- Branch: asperl
- ! bytecode.h mg.c pp.c pp_ctl.c pp_hot.c toke.c
+[ 3742] By: jhi on 1999/07/25 16:14:39
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 26 files)
____________________________________________________________________________
-[ 829] By: gsar on 1998/03/16 23:49:18
- Log: stray tweak to win32.c
- Branch: win32/perl
- ! win32/win32.c
+[ 3741] By: jhi on 1999/07/25 16:02:28
+ Log: Cut-and-pasto in #3737.
+ Branch: cfgperl
+ ! perl.c
____________________________________________________________________________
-[ 828] By: gsar on 1998/03/16 22:06:03
- Log: update win32/config* files
- Branch: win32/perl
- ! win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+[ 3740] By: gsar on 1999/07/25 15:59:34
+ Log: add note about glibc bug
+ Branch: perl
+ ! t/pragma/warn/pp_hot
+____________________________________________________________________________
+[ 3739] By: gsar on 1999/07/25 15:48:40
+ Log: fix bug in change#3728 that might free COPs prematurely;
+ null(op) now does more thorough scrubbing of the op, which
+ fixes a few compile-time memory "leaks"
+ Branch: perl
+ ! dump.c embed.h embed.pl op.c proto.h
+____________________________________________________________________________
+[ 3738] By: jhi on 1999/07/25 14:15:26
+ Log: In accordance with #3737.
+ Branch: metaconfig
+ ! U/installdirs/sitelib.U U/installdirs/vendorprefix.U
+ ! U/modified/Oldconfig.U
+ Branch: metaconfig/U/perl
+ ! Extensions.U
+____________________________________________________________________________
+[ 3737] By: jhi on 1999/07/25 14:12:34
+ Log: Use vendorprefixlib.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.c
+____________________________________________________________________________
+[ 3736] By: jhi on 1999/07/25 13:10:03
+ Log: Populate metaconfig branch.
+ Branch: metaconfig
+ + (add 1468 files)
+ Branch: metaconfig/U/perl
+ + (add 101 files)
+____________________________________________________________________________
+[ 3735] By: jhi on 1999/07/25 12:27:20
+ Log: First steps of making builds outside the source
+ directory possible. These should get us as far
+ as miniperl, then building DynaLoader falls into
+ tiny twinkling pieces as MakeMaker knows nothing
+ of VPATH mindset.
+ Branch: cfgperl
+ ! Configure Makefile.SH cflags.SH config_h.SH configpm
+ ! ext/util/make_ext lib/AutoSplit.pm makedepend.SH
+ ! pod/pod2html.PL pod/pod2latex.PL pod/pod2man.PL
+ ! pod/pod2text.PL pod/pod2usage.PL pod/podchecker.PL
+ ! pod/podselect.PL writemain.SH x2p/Makefile.SH x2p/cflags.SH
+____________________________________________________________________________
+[ 3734] By: jhi on 1999/07/25 11:19:28
+ Log: Poor Glossary--are we fixed yet?
+ Branch: cfgperl
+ ! Porting/Glossary
+____________________________________________________________________________
+[ 3733] By: jhi on 1999/07/25 11:15:06
+ Log: Change #3732 mistakenly clobbered Glossary.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
____________________________________________________________________________
-[ 827] By: gsar on 1998/03/16 19:09:30
- Log: trivial integrate of mainline
- Branch: win32/perl
- +> lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
- +> lib/ExtUtils/inst
- !> (integrate 61 files)
+[ 3732] By: jhi on 1999/07/25 10:46:39
+ Log: Andy's new installation scheme (note: a lot of this
+ leaked in already with change #3731). The vendor*
+ stuff is not used anywhere (in *.SH, say), so it
+ isn't in Configure, either.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
____________________________________________________________________________
-[ 826] By: mbeattie on 1998/03/16 16:39:23
- Log: newCONSTSUB had private MY_start_subparse.
+[ 3731] By: jhi on 1999/07/25 10:12:07
+ Log: Circumcode a strange shell(?) bug in AIX found
+ while trying to do -Duse64bits (which I couldn't do
+ in the end because the CPU isn't 64-bit in that box,
+ but at least now the probing doesn't crash.)
+ Branch: cfgperl
+ ! Configure config_h.SH hints/aix.sh
+____________________________________________________________________________
+[ 3730] By: gsar on 1999/07/25 04:56:56
+ Log: fix little utf8 nits in testsuite; add patch from Ilya that cures
+ a utf8 bug in one of the new RE optimizations
Branch: perl
- ! op.c
+ ! regcomp.c regexec.c t/harness t/lib/io_udp.t t/op/re_tests
+ ! t/pragma/locale.t
+____________________________________________________________________________
+[ 3729] By: jhi on 1999/07/23 19:56:27
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_57] INSTALL-1.58
+ Date: Fri, 23 Jul 1999 10:50:13 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9907231033190.3555-100000@newton.phys>
+
+ plus
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Andy Dougherty <doughera@lafayette.edu>
+ Cc: Perl Porters <perl5-porters@perl.org>
+ Subject: Re: [PATCH 5.005_57] INSTALL-1.58
+ Date: Fri, 23 Jul 1999 13:38:25 -0400
+ Message-ID: <19990723133825.A12033@O2.chapin.edu>
+ Branch: cfgperl
+ ! INSTALL
____________________________________________________________________________
-[ 825] By: mbeattie on 1998/03/16 16:36:55
- Log: Missing dTHR in hv_fetch_ent when statics moved to thread struct.
+[ 3728] By: gsar on 1999/07/23 17:24:42
+ Log: applied suggested patch for tracking line numbers correctly in
+ optimized blocks with a single statement; changed setcop to
+ setstate and added code for -Dx dumps
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Wed, 23 Jun 1999 17:27:42 +0100
+ Message-Id: <199906231627.RAA24033@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_57] Line number error in optimised else()
Branch: perl
- ! hv.c
+ ! dump.c embed.h ext/Devel/DProf/DProf.xs ext/Opcode/Opcode.pm
+ ! objXSUB.h op.c opcode.h opcode.pl perlapi.c pp.sym pp_hot.c
+ ! pp_proto.h t/op/misc.t
____________________________________________________________________________
-[ 824] By: mbeattie on 1998/03/16 16:27:43
- Log: Added missing entry for lib/ExtUtils/Packlist.pm to MANIFEST
+[ 3727] By: gsar on 1999/07/23 15:56:04
+ Log: avoid useless use of target for pp_each(); also fixes bugs due to
+ refcount held by the target
Branch: perl
- ! MANIFEST
+ ! opcode.h opcode.pl pp.c t/op/each.t
+____________________________________________________________________________
+[ 3726] By: jhi on 1999/07/23 12:08:30
+ Log: Change #3725 aftershock.
+ Branch: cfgperl
+ ! INSTALL jpl/JNI/JNI.pm
+____________________________________________________________________________
+[ 3725] By: jhi on 1999/07/23 11:58:49
+ Log: Introduce $Config{ldlibpthname} which contains
+ the name of the environment variable holding the
+ dynamic library search path, often LD_LIBRARY_PATH.
+ Use this new feature all over.
+ Also removed remnants of admonition "add LD_LIBRARY_PATH
+ before running make" because Makefile.SH does this for you.
+ Branch: cfgperl
+ ! Configure Makefile.SH config_h.SH
+ ! ext/DynaLoader/DynaLoader_pm.PL hints/README.hints
+ ! hints/aix.sh hints/beos.sh hints/cygwin32.sh hints/dgux.sh
+ ! hints/epix.sh hints/esix4.sh hints/hpux.sh hints/next_4.sh
+ ! hints/os2.sh hints/rhapsody.sh hints/svr4.sh jpl/JNI/JNI.pm
+ ! jpl/install-jpl utils/perlbug.PL
+____________________________________________________________________________
+[ 3724] By: jhi on 1999/07/23 08:03:36
+ Log: From: Spider Boardman <spider@orb.nashua.nh.us>
+ To: perl5-porters@perl.org
+ Subject: [PATCH] Re: [ID 19990715.003] [BUG] all perl5 versions: segfault on $#
+ Date: Thu, 22 Jul 1999 19:58:34 -0400
+ Message-Id: <199907222358.TAA27354@Orb.Nashua.NH.US>
+ Branch: cfgperl
+ ! av.c
+____________________________________________________________________________
+[ 3723] By: gsar on 1999/07/23 00:01:29
+ Log: emit warning about function calls that were encountered too early
+ to enforce their prototype
+ Branch: perl
+ ! op.c op.h pod/perldiag.pod
+____________________________________________________________________________
+[ 3722] By: jhi on 1999/07/22 21:19:59
+ Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: perl5-porters@perl.org
+ Cc: Chip Salzenberg <chip@perlsupport.com>, Gurusamy Sarathy <gsar@activestate.com>
+ Subject: [PATCH] MakeMaker documentation
+ Date: Wed, 21 Jul 1999 14:15:42 -0400
+ Message-ID: <19990721141542.A1800@O2.chapin.edu>
+ Branch: cfgperl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 3721] By: jhi on 1999/07/22 21:05:19
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: chip@perlsupport.com, gsar@activestate.com, perl-mvs@perl.org, perl5-porters@perl.org
+ Subject: [PATCH: 5.005_03 && 5.005_57]os390 hints file appendix stops bad builds
+ Date: Wed, 21 Jul 99 17:15:39 PDT
+ Message-Id: <9907220015.AA11931@forte.com>
+ Branch: cfgperl
+ ! hints/os390.sh
+____________________________________________________________________________
+[ 3720] By: jhi on 1999/07/22 20:51:17
+ Log: AIX magic: ccdlflags needs to be different for
+ Perl itself and for extra-core extensions
+ (as used by ExtUtilss::embed::ldopts).
+ Based on the problems described in
+
+ From: Mike W Ellwood <mwe@rl.ac.uk>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990722.002] Perl 5.00503 and AIX 4.1.5; perl.exp; build errors. Also Imagemagick...
+ Date: Thu, 22 Jul 1999 14:28:19 +0100 (BST)
+ Reply-To: m.w.ellwood@rl.ac.uk
+ Message-Id: <Pine.A41.3.96.990722141209.72660V-100000@unixfe.rl.ac.uk>
+ Branch: cfgperl
+ ! Configure Makefile.SH config_h.SH hints/aix.sh
+____________________________________________________________________________
+[ 3719] By: jhi on 1999/07/22 08:23:53
+ Log: Update history records.
+ Branch: cfgperl
+ ! pod/perlhist.pod
____________________________________________________________________________
-[ 823] By: mbeattie on 1998/03/16 16:26:02
- Log: Missed p4 add of lib/ExtUtils/Packlist.pm in change 814.
+[ 3718] By: jhi on 1999/07/21 13:54:42
+ Log: Todododobedobedo.
+ Branch: cfgperl
+ ! Todo
+____________________________________________________________________________
+[ 3717] By: jhi on 1999/07/21 12:10:48
+ Log: Even more Todo.
+ Branch: cfgperl
+ ! Todo
+____________________________________________________________________________
+[ 3716] By: jhi on 1999/07/21 11:40:39
+ Log: Use Errno more extensively so that error
+ messages are more portable (another way
+ would be to muck around with LC_MESSAGES).
+ Problem reported in
+
+ From: oracle@pcr8.pcr.com
+ To: perl5-porters@perl.org
+ Subject: [ID 19990719.003] LC_MESSAGES breaks h2xs autoloaded constants on AIX 4.1.4
+ Date: Mon, 19 Jul 1999 18:39:13 -0400
+ Message-Id: <9907192239.AA44990@pcr8.pcr.com>
+ Branch: cfgperl
+ ! ext/DB_File/DB_File.pm ext/Fcntl/Fcntl.pm
+ ! ext/GDBM_File/GDBM_File.pm jpl/JNI/JNI.pm lib/AutoLoader.pm
+ ! lib/CPAN.pm pod/perllocale.pod utils/h2xs.PL
+____________________________________________________________________________
+[ 3715] By: jhi on 1999/07/21 11:05:36
+ Log: Slightly modified patch.
+ From: Sean Sheedy <seans@ncube.com>
+ To: perl5-porters@perl.org
+ Subject: [ID 19990720.003] Perl 5.005_3 patch: Non-standard object extensions
+ Date: Tue, 20 Jul 1999 09:52:06 -0700
+ Message-Id: <3794A935.1C150E54@ncube.com>
+ Branch: cfgperl
+ ! cflags.SH x2p/cflags.SH
+____________________________________________________________________________
+[ 3714] By: jhi on 1999/07/20 21:26:19
+ Log: More Todo.
+ Branch: cfgperl
+ ! Todo
+____________________________________________________________________________
+[ 3713] By: jhi on 1999/07/20 18:02:45
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> ext/Devel/DProf/Changes ext/Devel/DProf/DProf.pm
+ +> ext/Devel/DProf/DProf.xs ext/Devel/DProf/Makefile.PL
+ +> ext/Devel/DProf/Todo t/lib/dprof.t t/lib/dprof/V.pm
+ +> t/lib/dprof/test1_t t/lib/dprof/test1_v t/lib/dprof/test2_t
+ +> t/lib/dprof/test2_v t/lib/dprof/test3_t t/lib/dprof/test3_v
+ +> t/lib/dprof/test4_t t/lib/dprof/test4_v t/lib/dprof/test5_t
+ +> t/lib/dprof/test5_v t/lib/dprof/test6_t t/lib/dprof/test6_v
+ +> utils/dprofpp.PL
+ !> INSTALL MAINTAIN MANIFEST configure.com
+ !> ext/Devel/Peek/Makefile.PL installman installperl
+ !> pod/roffitall utils/Makefile vms/descrip_mms.template
+ !> win32/Makefile win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 3712] By: gsar on 1999/07/20 15:29:01
+ Log: DProf tweak
+ Branch: perl
+ ! ext/Devel/DProf/DProf.xs
+____________________________________________________________________________
+[ 3711] By: gsar on 1999/07/20 07:56:19
+ Log: another DProf build tweak
+ Branch: perl
+ ! utils/dprofpp.PL
+____________________________________________________________________________
+[ 3710] By: gsar on 1999/07/20 07:36:36
+ Log: move DProf things around to where they are supposed to be
+ Branch: perl
+ + t/lib/dprof.t t/lib/dprof/V.pm t/lib/dprof/test1_t
+ + t/lib/dprof/test1_v t/lib/dprof/test2_t t/lib/dprof/test2_v
+ + t/lib/dprof/test3_t t/lib/dprof/test3_v t/lib/dprof/test4_t
+ + t/lib/dprof/test4_v t/lib/dprof/test5_t t/lib/dprof/test5_v
+ + t/lib/dprof/test6_t t/lib/dprof/test6_v
+ +> utils/dprofpp.PL
+ - ext/Devel/DProf/dprofpp.PL ext/Devel/DProf/t/V.pm
+ - ext/Devel/DProf/t/test1.pl ext/Devel/DProf/t/test1.t
+ - ext/Devel/DProf/t/test1.v ext/Devel/DProf/t/test2.t
+ - ext/Devel/DProf/t/test2.v ext/Devel/DProf/t/test3.t
+ - ext/Devel/DProf/t/test3.v ext/Devel/DProf/t/test4.t
+ - ext/Devel/DProf/t/test4.v ext/Devel/DProf/t/test5.t
+ - ext/Devel/DProf/t/test5.v ext/Devel/DProf/t/test6.t
+ - ext/Devel/DProf/t/test6.v ext/Devel/DProf/test.pl
+ ! INSTALL MANIFEST ext/Devel/DProf/Makefile.PL installman
+ ! installperl pod/roffitall utils/Makefile
+ ! vms/descrip_mms.template win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 3709] By: gsar on 1999/07/20 06:13:16
+ Log: DProf fixups for PERL_IMPLICIT_CONTEXT
+ Branch: perl
+ ! ext/Devel/DProf/DProf.xs ext/Devel/DProf/Makefile.PL
+ ! ext/Devel/Peek/Makefile.PL
+____________________________________________________________________________
+[ 3708] By: gsar on 1999/07/20 06:01:22
+ Log: move DProf to Devel/DProf
+ Branch: perl
+ +> ext/Devel/DProf/Changes ext/Devel/DProf/DProf.pm
+ +> ext/Devel/DProf/DProf.xs ext/Devel/DProf/Makefile.PL
+ +> ext/Devel/DProf/Todo ext/Devel/DProf/dprofpp.PL
+ +> ext/Devel/DProf/t/V.pm ext/Devel/DProf/t/test1.pl
+ +> ext/Devel/DProf/t/test1.t ext/Devel/DProf/t/test1.v
+ +> ext/Devel/DProf/t/test2.t ext/Devel/DProf/t/test2.v
+ +> ext/Devel/DProf/t/test3.t ext/Devel/DProf/t/test3.v
+ +> ext/Devel/DProf/t/test4.t ext/Devel/DProf/t/test4.v
+ +> ext/Devel/DProf/t/test5.t ext/Devel/DProf/t/test5.v
+ +> ext/Devel/DProf/t/test6.t ext/Devel/DProf/t/test6.v
+ +> ext/Devel/DProf/test.pl
+ - ext/DProf/Changes ext/DProf/DProf.pm ext/DProf/DProf.xs
+ - ext/DProf/Makefile.PL ext/DProf/Todo ext/DProf/dprofpp.PL
+ - ext/DProf/t/V.pm ext/DProf/t/test1.pl ext/DProf/t/test1.t
+ - ext/DProf/t/test1.v ext/DProf/t/test2.t ext/DProf/t/test2.v
+ - ext/DProf/t/test3.t ext/DProf/t/test3.v ext/DProf/t/test4.t
+ - ext/DProf/t/test4.v ext/DProf/t/test5.t ext/DProf/t/test5.v
+ - ext/DProf/t/test6.t ext/DProf/t/test6.v ext/DProf/test.pl
+ ! MAINTAIN MANIFEST configure.com win32/Makefile
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 3707] By: gsar on 1999/07/20 05:39:11
+ Log: add Devel::DProf v19990108 from CPAN, as it was
+ Branch: perl
+ + ext/DProf/Changes ext/DProf/DProf.pm ext/DProf/DProf.xs
+ + ext/DProf/Makefile.PL ext/DProf/Todo ext/DProf/dprofpp.PL
+ + ext/DProf/t/V.pm ext/DProf/t/test1.pl ext/DProf/t/test1.t
+ + ext/DProf/t/test1.v ext/DProf/t/test2.t ext/DProf/t/test2.v
+ + ext/DProf/t/test3.t ext/DProf/t/test3.v ext/DProf/t/test4.t
+ + ext/DProf/t/test4.v ext/DProf/t/test5.t ext/DProf/t/test5.v
+ + ext/DProf/t/test6.t ext/DProf/t/test6.v ext/DProf/test.pl
+ ! MANIFEST
+____________________________________________________________________________
+[ 3706] By: gsar on 1999/07/20 04:52:25
+ Log: C<union any> needs no PERL_OBJECT-treatment
+ Branch: perl
+ ! win32/win32.h
+____________________________________________________________________________
+[ 3705] By: gsar on 1999/07/20 04:11:54
+ Log: fix problem in default build
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 3704] By: jhi on 1999/07/19 07:06:36
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Changes lib/Carp.pm makedef.pl pod/perldiag.pod sv.h util.c
+ !> win32/win32.c
+____________________________________________________________________________
+[ 3703] By: gsar on 1999/07/19 05:55:57
+ Log: win32 nits
Branch: perl
- + lib/ExtUtils/Packlist.pm
+ ! makedef.pl sv.h
____________________________________________________________________________
-[ 822] By: mbeattie on 1998/03/16 16:22:58
- Log: Bump patchlevel.h to 63.
+[ 3702] By: gsar on 1999/07/19 04:29:34
+ Log: don't display tid from main thread (or testsuite breaks)
Branch: perl
- ! ext/IO/IO.xs patchlevel.h
- !> (integrate 41 files)
+ ! lib/Carp.pm util.c
____________________________________________________________________________
-[ 821] By: mbeattie on 1998/03/16 16:18:35
- Log: newCONSTSUB added (XSUB equivalent for inlinable sub () { 123 }).
- Subject: Bundling builtin.pm and newCONSTSUB with the core?
- From: jan.dubois@ibm.net (Jan Dubois)
- Date: Sun, 15 Mar 1998 19:09:05 +0100
+[ 3701] By: gsar on 1999/07/19 00:47:52
+ Log: remove several doubled (and tripled!) entries
+ Branch: perl
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 3700] By: gsar on 1999/07/19 00:42:34
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! embed.h global.sym op.c pod/perlguts.pod proto.h
+ +> makedef.pl
+ - perl_exp.SH win32/makedef.pl
+ !> MANIFEST Makefile.SH ext/DynaLoader/DynaLoader_pm.PL
+ !> ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_vms.xs hints/aix.sh
+ !> pod/perldiag.pod pp.c regexec.c t/pragma/warn/util toke.c
+ !> utf8.c util.c win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 820] By: mbeattie on 1998/03/16 16:02:50
- Log: Subject: [PATCH] STRESS_REALLOC
- Date: Fri, 13 Mar 1998 22:28:19 -0600 (CST)
- From: Stephen McCamant <alias@mcs.com>
+[ 3699] By: gsar on 1999/07/19 00:33:59
+ Log: avoid bug in win32_str_os_error() (from Jan Dubois)
Branch: perl
- ! malloc.c perl.c scope.c
+ ! Changes win32/win32.c
+____________________________________________________________________________
+[ 3698] By: jhi on 1999/07/18 21:33:57
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> t/op/chars.t
+ !> (integrate 57 files)
____________________________________________________________________________
-[ 819] By: mbeattie on 1998/03/16 16:01:06
- Log: Subject: [BUG+PATCH] _62 with -DDEBUGGING and -Duseperlio
- Date: Fri, 13 Mar 1998 23:21:25 +0100
- From: Jan-Pieter Cornet <john@pc.xs4all.nl>
+[ 3697] By: gsar on 1999/07/18 05:22:36
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Thu, 1 Jul 99 19:31:24 PDT
+ Message-Id: <9907020231.AA16942@forte.com>
+ Subject: [ID 19990701.031] 4 ctl chars on EBCDIC not asciiish enough
Branch: perl
- ! perly.c
+ + t/op/chars.t
+ ! MANIFEST ebcdic.c t/op/ord.t
+____________________________________________________________________________
+[ 3696] By: gsar on 1999/07/18 05:11:02
+ Log: display thread id in diagnostics (suggested by Dan Sugalski)
+ Branch: perl
+ ! lib/Carp.pm util.c
+____________________________________________________________________________
+[ 3695] By: gsar on 1999/07/18 04:57:47
+ Log: missing perldiag entry (from Dan Sugalski <sugalskd@osshe.edu>)
+ Branch: perl
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 818] By: mbeattie on 1998/03/16 15:59:16
- Log: Subject: [Configure PATCH] for OS/2
- Date: Fri, 13 Mar 1998 16:18:12 -0500 (EST)
+[ 3694] By: gsar on 1999/07/18 04:56:28
+ Log: cache [NIUP]V conversions of defined READONLY values
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- [Two hunks to Configure failed to apply due to clashes]
+ Date: Sun, 11 Jul 1999 04:39:44 -0400
+ Message-ID: <19990711043944.A25944@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] Allow caching of numeric/string conversion
Branch: perl
- ! Configure hints/os2.sh
+ ! sv.c
____________________________________________________________________________
-[ 817] By: mbeattie on 1998/03/16 15:55:28
- Log: Subject: [PATCH 5.004_62] VMS updates (direct)
- Date: Thu, 12 Mar 1998 16:02:29 -0500 (EST)
- From: Charles Bailey <BAILEY@newman.upenn.edu>
- [Needed manual tweaks on vms/config.vms since it clashed with other
- patches. I may have got it wrong.]
+[ 3693] By: gsar on 1999/07/18 03:53:38
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 17 Jul 1999 10:58:29 +0200
+ Message-ID: <379144ad.13616689@smtp1.ibm.net>
+ Subject: [PATCH 5.005] Some lib/ExtUtils/Manifest.pm POD fixes
Branch: perl
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_VMS.pm
- ! lib/ExtUtils/Mksymlists.pm perl.h pp.c pp_hot.c regcomp.c
- ! regcomp.h utils/perldoc.PL vms/config.vms vms/descrip.mms
- ! vms/ext/Stdio/Stdio.pm vms/ext/filespec.t vms/fndvers.com
- ! vms/gen_shrfls.pl vms/genconfig.pl vms/sockadapt.h
- ! vms/test.com vms/vms.c vms/vmsish.h
+ ! lib/ExtUtils/Manifest.pm
____________________________________________________________________________
-[ 816] By: mbeattie on 1998/03/16 15:26:04
- Log: Subject: [PATCH] Let h2xs read multiple header files
- Date: Tue, 10 Mar 1998 09:35:42 -0500 (EST)
- From: Benjamin Sugars <bsugars@canoe.ca>
+[ 3692] By: gsar on 1999/07/18 03:51:03
+ Log: remove spurious newSTATEOP() that causes goto to enter one too many
+ contexts when jumping between if and elsif blocks
Branch: perl
- ! utils/h2xs.PL
+ ! perly.c perly.y pp_ctl.c t/op/goto.t
____________________________________________________________________________
-[ 815] By: mbeattie on 1998/03/16 15:24:12
- Log: Subject: Re: Almost OK: Perl 5.004_62 on VMS 7.1
- Date: Mon, 09 Mar 1998 09:18:56 -0800
- From: Dan Sugalski <sugalskd@osshe.edu>
+[ 3691] By: gsar on 1999/07/18 01:49:59
+ Log: detypo, update Changes
Branch: perl
- ! vms/config.vms
+ ! Changes doio.c
____________________________________________________________________________
-[ 814] By: mbeattie on 1998/03/16 13:17:14
- Log: Subject: PATCH for 5.004_62 : Add .packlist handling classes to ExtUtils
- Date: Sun, 08 Mar 1998 12:50:23 +0000
- From: Alan Burlison <alan.burlison@UK.Sun.COM>
- plus manual update of MANIFEST
+[ 3690] By: gsar on 1999/07/18 01:16:59
+ Log: mention the -Minteger effect on modulus (from Nathan Torkington)
Branch: perl
- + lib/ExtUtils/Installed.pm lib/ExtUtils/inst
- ! MANIFEST installman installperl lib/ExtUtils/Install.pm
- ! lib/ExtUtils/MM_Unix.pm
+ ! lib/integer.pm
____________________________________________________________________________
-[ 813] By: mbeattie on 1998/03/16 13:08:55
- Log: From: Blair Zajac <blair@gps.caltech.edu>
- Subject: PATCH: util.c and util.h function declarations do not match
- Date: Fri, 6 Mar 1998 10:29:29 -0800 (PST)
- Subject: PATCH: cgywin32 patch for perlgcc
- Date: Fri, 6 Mar 1998 11:15:36 -0800 (PST)
- Subject: PATCH: perl5.004_62 on cygwin32
- Date: Fri, 6 Mar 1998 11:57:35 -0800 (PST)
+[ 3689] By: gsar on 1999/07/18 00:47:17
+ Log: ensure __END__ appears on a line by itself in wrapped
+ scripts (thanks to Steve Tolkin <tolkin@mediaone.net>);
+ mention caveat about successfull kill()
Branch: perl
- ! Configure cygwin32/perlgcc cygwin32/perlld pp_sys.c x2p/util.c
+ ! pod/perlfunc.pod win32/bin/pl2bat.pl
____________________________________________________________________________
-[ 812] By: mbeattie on 1998/03/16 12:55:39
- Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Subject: [PATCH 5.004_62} Config_62-01 patch available.
- Date: Mon, 9 Mar 1998 15:23:33 -0500 (EST)
- Subject: [PATCH 5.004_62] Tiny hint file updates
- Date: Mon, 9 Mar 1998 13:21:46 -0500 (EST)
+[ 3688] By: gsar on 1999/07/17 20:47:44
+ Log: noecho noops (from Nicholas Clark <nick@flirble.org>)
Branch: perl
- ! Configure Porting/Glossary Porting/config.sh Porting/config_H
- ! config_h.SH ext/ODBM_File/ODBM_File.xs handy.h hints/aix.sh
- ! hints/dec_osf.sh hints/dos_djgpp.sh hints/freebsd.sh
- ! hints/irix_6.sh hints/irix_6_0.sh hints/irix_6_1.sh
- ! hints/os2.sh hints/solaris_2.sh patchlevel.h perl.c perl.h
- ! perllio.h pod/perldiag.pod pp_sys.c vms/config.vms
+ ! ext/SDBM_File/sdbm/Makefile.PL
____________________________________________________________________________
-[ 811] By: mbeattie on 1998/03/16 12:13:55
- Log: DOS djgpp updates:
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
- Subject: [PATCH for 5.004_61] dos-djgpp update
- Date: Fri, 6 Mar 1998 10:41:01 +0100
- Subject: [PATCH 5.004_62] dos-djgpp update
- Date: Thu, 12 Mar 1998 13:34:51 +0100
- Branch: perl
- ! djgpp/config.over hints/dos_djgpp.sh
-____________________________________________________________________________
-[ 810] By: gsar on 1998/03/16 08:48:17
- Log: integrate mainline
- Branch: win32/perl
- !> pp_sys.c
-____________________________________________________________________________
-[ 809] By: gsar on 1998/03/16 08:44:37
- Log: various changes to get asperl working under Borland
- (passes all tests when built under PERL_OBJECT)
- Branch: asperl
- ! ObjXSub.h ext/Opcode/Opcode.xs globals.c mg.c objpp.h op.c
- ! perl.h perly.c perly.c.diff pp.c pp_ctl.c pp_hot.c pp_sys.c
- ! proto.h scope.h sv.c toke.c win32/Makefile win32/config_H.bc
- ! win32/config_H.gc win32/config_H.vc win32/makedef.pl
- ! win32/makefile.mk win32/runperl.c win32/win32.c win32/win32.h
- ! win32/win32sck.c
+[ 3687] By: gsar on 1999/07/17 20:43:27
+ Log: make CC.pm use a distinct CCPP() macro rather than PP()
+ (suggested by Vishal Bhatia <vishalb@my-deja.com>)
+ Branch: perl
+ ! cc_runtime.h ext/B/B/CC.pm
____________________________________________________________________________
-[ 808] By: gsar on 1998/03/12 19:50:20
- Log: set sockets to nonoverlapped mode for every thread
- Message-Id: <35081FE4.965A484D@enteract.com>
- Date: Thu, 12 Mar 1998 11:48:20 CST
- From: Steve Nielsen <spn@enteract.com>
- Subject: [PATCH 5.004_62] win32: set sockopt on a per-thread basis
- Branch: win32/perl
- ! win32/win32.h win32/win32sck.c
-____________________________________________________________________________
-[ 807] By: gsar on 1998/03/12 19:26:54
- Log: add AS patch#13
- Branch: asperl
- ! win32/Makefile
-____________________________________________________________________________
-[ 806] By: gsar on 1998/03/12 00:51:08
- Log: added AS patch#12 with minor changes
- Branch: asperl
- ! ObjXSub.h bytecode.h byterun.c doio.c iplio.h
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
- ! lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp objpp.h perl.c
- ! perllio.h proto.h regcomp.c win32/Makefile win32/config_h.PL
- ! win32/runperl.c
+[ 3686] By: gsar on 1999/07/17 20:39:08
+ Log: tiny bug in vars.pm (from John Dlugosz)
+ Branch: perl
+ ! lib/vars.pm
____________________________________________________________________________
-[ 805] By: gsar on 1998/03/10 20:35:10
- Log: reinstate some standard sig_names to avoid noise from
- modules (and in hopes of making them _do_ something in future)
- Branch: win32/perl
- ! win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
-____________________________________________________________________________
-[ 804] By: gsar on 1998/03/10 20:33:05
- Log: mingw32 tweaks
- Branch: win32/perl
- ! win32/makefile.mk win32/win32.c win32/win32.h
-____________________________________________________________________________
-[ 803] By: gsar on 1998/03/09 20:56:07
- Log: tweak Win32::DomainName() implementation
- Branch: win32/perl
- ! win32/Makefile win32/win32.c
-____________________________________________________________________________
-[ 802] By: gsar on 1998/03/09 03:51:01
- Log: merge C<local $tied{foo}> patch, also moved statics in
- [ah]v.c to thrdvar.h
- Branch: win32/perl
- ! av.c embedvar.h hv.c scope.c t/op/local.t thrdvar.h
-____________________________________________________________________________
-[ 801] By: gsar on 1998/03/09 02:38:35
- Log: minor win32 support fixes
- - add a better implementation of Win32::DomainName() (as
- suggested by Jutta M. Klebe <jmk@exc.bybyte.de>)
- - fix opendir() emulation was unsafe what given long paths
- Branch: win32/perl
- ! win32/win32.c
+[ 3685] By: gsar on 1999/07/17 20:37:27
+ Log: applied suggested patch, along with later tweak
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 14 Jul 1999 23:53:43 +0200
+ Message-ID: <37a902e7.15977234@smtp1.ibm.net>
+ Subject: Merge ActivePerl Stylesheet support etc into Pod::Html.pm
+ Branch: perl
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 800] By: nick on 1998/03/07 09:36:41
- Log: There has been a 'thaw' in config.h (the ICE has gone ;-))
- So pp_sys.c needs tweaking otherwise it does not believe getservby*()
- exist. (Breaks libnet).
+[ 3684] By: gsar on 1999/07/17 20:24:32
+ Log: avoid #ifdef DEBUGGING in thrdvar.h (from Dominic Dunlop <domo@vo.lu>)
Branch: perl
- ! pp_sys.c
+ ! thrdvar.h
____________________________________________________________________________
-[ 799] By: gsar on 1998/03/07 07:51:28
- Log: integrate mainline changes
- Branch: asperl
- !> (integrate 111 files)
-____________________________________________________________________________
-[ 798] By: gsar on 1998/03/07 07:01:55
- Log: integrate mainline
- Branch: win32/perl
- !> myconfig patchlevel.h
-____________________________________________________________________________
-[ 797] By: gsar on 1998/03/07 06:49:49
- Log: provide our own popen()/pclose() to fix problems with qx//:
- - qx// used to always invoke the shell, now does so only when needed
- - qx// didn't respect PERL5SHELL, now does
- Branch: win32/perl
- ! lib/ExtUtils/typemap win32/config_h.PL win32/win32.c
-____________________________________________________________________________
-[ 796] By: gsar on 1998/03/07 01:37:10
- Log: a missed s/sp/SP/
- Branch: win32/perl
- ! lib/ExtUtils/typemap pod/perlcall.pod
-____________________________________________________________________________
-[ 795] By: gsar on 1998/03/07 01:05:21
- Log: change all 'sp' to 'SP' in code and in the docs. Explicitly
- mention that local stack pointer should be called SP. This makes the
- API safer from source incompatibilities down the line.
- Branch: win32/perl
- ! av.c doio.c doop.c ext/DB_File/DB_File.xs
- ! ext/DynaLoader/dl_dld.xs ext/Opcode/Opcode.xs
- ! ext/POSIX/POSIX.xs ext/Socket/Socket.xs ext/Thread/Thread.xs
- ! gv.c mg.c op.c os2/OS2/REXX/REXX.xs perl.c pod/perlcall.pod
- ! pod/perlembed.pod pod/perlguts.pod pod/perlxs.pod pp.c
- ! pp_ctl.c pp_hot.c pp_sys.c util.c
-
-----------------
-Version 5.004_62
-----------------
-
+[ 3683] By: gsar on 1999/07/17 20:21:01
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 13 Jul 1999 05:44:28 -0400 (EDT)
+ Message-Id: <199907130944.FAA04473@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] Segfaults if $^P
+ Branch: perl
+ ! embed.h embed.pl global.sym mg.c objXSUB.h perl.c perlapi.c
+ ! proto.h
____________________________________________________________________________
-[ 794] By: mbeattie on 1998/03/06 09:38:08
- Log: Subject: [PATCH] perl5.004_61 myconfig updates
- Date: Thu, 5 Mar 1998 15:10:54 -0500 (EST)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+[ 3682] By: gsar on 1999/07/17 20:04:17
+ Log: use a better prefixify() heuristic than m/perl/ (prefix/lib/perl5
+ and prefix/lib/perl5/man are ass_u_med only if those directories
+ actually exist; else prefix/{lib,man} are used)
Branch: perl
- ! myconfig
+ ! lib/ExtUtils/MM_Unix.pm
____________________________________________________________________________
-[ 793] By: mbeattie on 1998/03/06 09:36:37
- Log: Bump patchlevel.h to 62.
+[ 3681] By: gsar on 1999/07/17 19:12:33
+ Log: allow $foo{$x} and $bar[$i] for (\$) prototype
Branch: perl
- ! patchlevel.h
+ ! op.c t/comp/proto.t
____________________________________________________________________________
-[ 792] By: mbeattie on 1998/03/06 09:35:57
- Log: Integrate win32 branch into mainline.
+[ 3680] By: gsar on 1999/07/17 18:23:55
+ Log: fix vec() on magic values
+ From: Ian Phillipps <ian@dial.pipex.com>
+ Date: Mon, 12 Jul 1999 12:30:05 +0100
+ Message-ID: <19990712123005.A11355@homer.diplex.co.uk>
+ Subject: [PATCH 5.005_57] Re: do_vecset is broken. Re: [ID 19990703.003].
Branch: perl
- !> bytecode.h op.c proto.h scope.c win32/Makefile win32/config.bc
- !> win32/config.gc win32/config.vc win32/config_H.bc
- !> win32/config_H.gc win32/config_H.vc win32/makefile.mk
+ ! doop.c t/op/tie.t
____________________________________________________________________________
-[ 791] By: gsar on 1998/03/06 06:00:08
- Log: various
- - s/PerlIO_fread/PerlIO_read/, the former doesn't exist
- - add missing prototypes
- - regenerate win32/config*.?c
- Branch: win32/perl
- ! bytecode.h proto.h win32/config.bc win32/config.gc
- ! win32/config.vc win32/config_H.bc win32/config_H.gc
- ! win32/config_H.vc win32/makefile.mk
+[ 3679] By: gsar on 1999/07/17 18:10:44
+ Log: make system() return -1 and set $! if exec of child failed
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 9 Jul 1999 05:21:13 -0400
+ Message-ID: <19990709052113.A6201@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] system()==-1 and $! from failing fork/exec
+ Branch: perl
+ ! doio.c embed.h embed.pl global.sym objXSUB.h perlapi.c
+ ! pod/perlfunc.pod pp_sys.c proto.h t/op/exec.t
+____________________________________________________________________________
+[ 3678] By: gsar on 1999/07/17 17:54:01
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 9 Jul 1999 04:27:51 -0400 (EDT)
+ Message-Id: <199907090827.EAA03321@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] File descriptor leak in do_exec3
+ Branch: perl
+ ! util.c
____________________________________________________________________________
-[ 790] By: gsar on 1998/03/06 03:19:23
- Log: fix typo in Makefile
- Branch: win32/perl
- ! win32/Makefile
-____________________________________________________________________________
-[ 789] By: gsar on 1998/03/05 22:55:53
- Log: integrate mainline
- Branch: win32/perl
- !> (integrate 47 files)
-____________________________________________________________________________
-[ 788] By: gsar on 1998/03/05 20:02:09
- Log: added AS patch#11
- Message-Id: <01BD4820.AFC70110.dougl@ActiveState.com>
- Date: Thu, 05 Mar 1998 10:23:04 PST
- From: Douglas Lankshear <dougl@ActiveState.com>
+[ 3677] By: gsar on 1999/07/17 17:34:38
+ Log: a modernized version of find2perl from Ken Pizzini <ken@halcyon.com>;
+ converted Ken's documentation outline into pod
+ Branch: perl
+ ! x2p/find2perl.PL
+____________________________________________________________________________
+[ 3676] By: gsar on 1999/07/17 16:34:09
+ Log: pod fixes (with minor edits) from Abigail, Ronald Kimball, Jon
+ Waddington, Tuomas Lukka, Steven Tolkin, Ian Phillipps, and
+ Steve Lidie
+ Branch: perl
+ ! pod/Win32.pod pod/perldelta.pod pod/perlfaq.pod
+ ! pod/perlfaq1.pod pod/perlfaq2.pod pod/perlfaq3.pod
+ ! pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perlhist.pod pod/perlop.pod
+ ! pod/perlport.pod pod/perltoc.pod pod/perltodo.pod
+ ! pod/perltoot.pod pod/perltootc.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 3675] By: gsar on 1999/07/17 00:16:53
+ Log: backout redundant change#3628
+ Branch: perl
+ ! Changes hints/bsdos.sh
+____________________________________________________________________________
+[ 3674] By: jhi on 1999/07/15 14:26:03
+ Log: Fix the bin/oct/hex constant overflow tests for
+ long long platforms.
+ Branch: cfgperl
+ ! t/pragma/warn/util
+____________________________________________________________________________
+[ 3673] By: jhi on 1999/07/14 21:59:11
+ Log: Fixed AIX dynamic loading and AIX shared Perl library.
+ Tested in: AIX 4.1.5 cc+useshrplib+usethreads, 4.1.5 cc,
+ 4.1.5 gcc+useshrplib+usethreads, 4.3.1 cc+useshrplib.
+ Hijacked win32/makedef.pl for more general purpose export
+ list building, now it is used (as toplevel makedef.pl)
+ for win32 and AIX (perl_exp.SH made unnecessary).
+ Because the export lists are now correct in AIX, no more linker
+ warnings about "Exported symbol not defined" should appear.
+ Branch: cfgperl
+ + makedef.pl
+ - perl_exp.SH win32/makedef.pl
+ ! MANIFEST Makefile.SH ext/DynaLoader/DynaLoader_pm.PL
+ ! ext/DynaLoader/dl_aix.xs hints/aix.sh win32/Makefile
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 3672] By: gsar on 1999/07/14 17:12:13
+ Log: minor efficiency tweak
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 3671] By: jhi on 1999/07/14 16:22:39
+ Log: The regexec.c change of #3606 caused a core dump in fbm_instr()
+ if its caller re_intuit_start() was entered with strend == strpos
+ because end_shift ended up as -1. The patch ain't necessarily
+ correct but least the core dump is avoided.
+ Branch: cfgperl
+ ! regexec.c
+____________________________________________________________________________
+[ 3670] By: jhi on 1999/07/13 07:59:09
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ - XSlock.h win32/GenCAPI.pl win32/TEST win32/autosplit.pl
+ - win32/genxsdef.pl win32/makemain.pl win32/makeperldef.pl
+ !> (integrate 67 files)
+____________________________________________________________________________
+[ 3669] By: gsar on 1999/07/12 06:14:54
+ Log: fixups for sundry warnings about function pointers
+ Branch: perl
+ ! ext/re/re.xs intrpvar.h op.c perl.c perl.h pp_ctl.c scope.h
+ ! sv.c thrdvar.h util.c win32/Makefile win32/makefile.mk
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 3668] By: gsar on 1999/07/12 04:11:58
+ Log: tweaks for win32/borland
+ Branch: perl
+ ! t/pragma/locale.t win32/makedef.pl win32/makefile.mk
+____________________________________________________________________________
+[ 3667] By: gsar on 1999/07/12 01:55:15
+ Log: yet more cleanups of the PERL_OBJECT, MULTIPLICITY and USE_THREADS
+ builds; passing the implicit context is unified among the three
+ flavors; PERL_IMPLICIT_CONTEXT is auto-enabled under all three
+ flavors (see the top of perl.h) for testing; all varargs functions
+ foo() have a va_list-taking variant vfoo() for generating the
+ context-free versions; the PERL_OBJECT build should now be
+ hyper-compatible with CPAN extensions (C++ is totally out of
+ the picture)
- This patch fixes a bug I introduced removing duplicate code.
- -- Doug
- Branch: asperl
- ! ObjXSub.h objpp.h win32/runperl.c
-____________________________________________________________________________
-[ 787] By: gsar on 1998/03/05 19:56:17
- Log: add Nick's dTHR fixes
- Branch: win32/perl
- ! op.c scope.c
-____________________________________________________________________________
-[ 786] By: gsar on 1998/03/05 19:54:49
- Log: maintpatch
- Message-Id: <199803050749.CAA15206@Orb.Nashua.NH.US>
- Date: Thu, 05 Mar 1998 02:49:46 EST
- From: Spider Boardman <spider@orb.nashua.nh.us>
- Subject: [PATCH] 5.004_04 +MAINT_TRIAL_1 broken when sizeof(int) != sizeof(void
- Branch: win32/perl
- ! scope.c
-____________________________________________________________________________
-[ 785] By: mbeattie on 1998/03/05 19:12:14
- Log: Subject: [5.004_61 PATCH] Make incompatible changes to RE engine NOW
- Date: Wed, 4 Mar 1998 23:55:54 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ result has only been tested on Windows
+
+ TODO: write docs on the THX rationale and idiomatic usage of
+ the Perl API
Branch: perl
- ! op.c proto.h regcomp.c regexp.h util.c
+ - XSlock.h win32/GenCAPI.pl win32/TEST win32/autosplit.pl
+ - win32/genxsdef.pl win32/makemain.pl win32/makeperldef.pl
+ ! MANIFEST XSUB.h bytecode.pl deb.c dump.c embed.h embed.pl
+ ! embedvar.h ext/B/B.xs ext/ByteLoader/ByteLoader.xs
+ ! ext/ByteLoader/byterun.c ext/Data/Dumper/Dumper.xs
+ ! ext/Devel/Peek/Peek.xs ext/Fcntl/Fcntl.xs ext/IO/IO.xs
+ ! ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs
+ ! ext/SDBM_File/SDBM_File.xs ext/Socket/Socket.xs
+ ! ext/Thread/Thread.xs ext/attrs/attrs.xs ext/re/re.xs
+ ! global.sym globals.c intrpvar.h iperlsys.h
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_Win32.pm
+ ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/xsubpp lib/base.pm
+ ! lib/warning.pm malloc.c objXSUB.h perl.c perl.h perlapi.c
+ ! perlapi.h perlio.c pp_sys.c proto.h regcomp.c regexec.c
+ ! scope.c sv.c thrdvar.h util.c win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/config_h.PL
+ ! win32/dl_win32.xs win32/include/dirent.h
+ ! win32/include/sys/socket.h win32/makedef.pl win32/makefile.mk
+ ! win32/perllib.c win32/runperl.c win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32sck.c
+____________________________________________________________________________
+[ 3666] By: jhi on 1999/07/11 22:00:13
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> op.c t/op/lex_assign.t
+____________________________________________________________________________
+[ 3665] By: jhi on 1999/07/11 21:59:01
+ Log: More manual sync.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 784] By: mbeattie on 1998/03/05 19:11:09
- Log: Subject: [PATCH] Re: perl 5.0061 unable to build on sparc 5 Sol2.5.1 threads.
- Date: Wed, 4 Mar 1998 10:18:03 GMT
- From: Nick Ing-Simmons <nik@tiuk.ti.com>
+[ 3664] By: gsar on 1999/07/11 19:11:07
+ Log: change#3612 was buggy and failed to build Tk; applied Ilya's
+ remedy and related tests via private mail
Branch: perl
- ! atomic.h
+ ! op.c t/op/lex_assign.t
____________________________________________________________________________
-[ 783] By: mbeattie on 1998/03/05 19:09:16
- Log: Subject: Configure patches -01 and -02 for 5.004_61.
- Date: Tue, 3 Mar 1998 16:41:16 -0500 (EST)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+[ 3663] By: jhi on 1999/07/11 15:04:37
+ Log: Manual synchronization with Sarathy (some files
+ had drifted apart for no apparent reason), plus
+ I had a typo in dl_vms.xs Sarathy had fixed.
+ Branch: cfgperl
+ ! ext/DynaLoader/dl_vms.xs pod/perldelta.pod pp.c pp_sys.c
+____________________________________________________________________________
+[ 3662] By: jhi on 1999/07/10 12:23:21
+ Log: Change t/pragma/warn oct()/hex() overflow tests to use %Config
+ to adapt to the underlying platform (the binary, 0b1..., test
+ was broken in 64-bit platforms). Also change "hex" in the
+ warning messages to "hexadecimal" to match "binary" and "octal".
+ Branch: cfgperl
+ ! pod/perldiag.pod t/pragma/warn/util util.c
+____________________________________________________________________________
+[ 3661] By: jhi on 1999/07/08 21:54:55
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ +> perlapi.c perlapi.h
+ !> (integrate 43 files)
+____________________________________________________________________________
+[ 3660] By: gsar on 1999/07/08 18:47:35
+ Log: more PERL_OBJECT cleanups (changes still untested on Unix!)
Branch: perl
- ! Configure INSTALL Policy_sh.SH Porting/Glossary
- ! Porting/config.sh Porting/config_H Porting/pumpkin.pod
- ! config_h.SH handy.h hints/README.hints hints/aix.sh
- ! hints/linux.sh hints/solaris_2.sh hints/unicos.sh
- ! makedepend.SH myconfig pp_sys.c
+ + perlapi.c perlapi.h
+ ! MANIFEST XSUB.h emacs/ptags embed.h embed.pl embedvar.h
+ ! ext/Opcode/Opcode.xs global.sym globals.c intrpvar.h
+ ! iperlsys.h mg.c miniperlmain.c objXSUB.h perl.c perl.h perly.c
+ ! pp.c pp_ctl.c pp_hot.c proto.h regcomp.c regcomp.h regexec.c
+ ! scope.c scope.h sv.c thrdvar.h toke.c util.c win32/GenCAPI.pl
+ ! win32/Makefile win32/makedef.pl win32/perllib.c win32/win32.c
+ ! win32/win32.h
____________________________________________________________________________
-[ 782] By: mbeattie on 1998/03/05 19:05:23
- Log: Subject: [PATCH] Compiling with OP_IN_REGISTER
- Date: 03 Mar 1998 18:05:07 +0100
- From: Gisle Aas <gisle@aas.no>
+[ 3659] By: gsar on 1999/07/08 18:41:45
+ Log: sundry cleanups for clean build on windows
Branch: perl
- ! perl.h pp_ctl.c
+ ! doio.c regcomp.c regcomp.h t/io/openpid.t utf8.c
____________________________________________________________________________
-[ 781] By: mbeattie on 1998/03/05 19:04:34
- Log: Subject: [PATCH] Make autouse -w-safe
- Date: Mon, 2 Mar 1998 21:36:02 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 3658] By: gsar on 1999/07/08 01:24:25
+ Log: fixes for logical bugs in the lexwarn patch; other tweaks to avoid
+ type mismatch problems
Branch: perl
- ! lib/autouse.pm op.c sv.c
+ ! doio.c gv.c op.c pp.c regcomp.c regexec.c run.c sv.c
+ ! t/pragma/warn/op toke.c utf8.c util.c
____________________________________________________________________________
-[ 780] By: mbeattie on 1998/03/05 19:02:50
- Log: Subject: [PATCH] External symbol re_croak2
- Date: 02 Mar 1998 13:00:45 +0100
- From: Gisle Aas <gisle@aas.no>
+[ 3657] By: jhi on 1999/07/07 23:01:16
+ Log: Integrate with Sarathy. perldiag.pod required manual editing.
+ Branch: cfgperl
+ ! pod/perldiag.pod
+ !> Changes configure.com ext/B/B/Deparse.pm
+ !> ext/ByteLoader/Makefile.PL ext/Fcntl/Fcntl.xs
+ !> ext/IO/lib/IO/File.pm gv.c iperlsys.h lib/ExtUtils/MM_VMS.pm
+ !> lib/File/Basename.pm lib/File/Spec/VMS.pm perlsfio.h
+ !> t/base/rs.t t/lib/io_multihomed.t t/lib/textfill.t
+ !> t/lib/textwrap.t t/op/filetest.t t/op/mkdir.t
+ !> t/pragma/overload.t thread.h vms/vms.c
+____________________________________________________________________________
+[ 3656] By: gsar on 1999/07/07 21:04:38
+ Log: integrate cfgperl contents
+ Branch: perl
+ +> lib/unicode/Is/ASCII.pl lib/unicode/Is/Cntrl.pl
+ +> lib/unicode/Is/Graph.pl lib/unicode/Is/Punct.pl
+ +> lib/unicode/Is/Word.pl lib/unicode/Is/XDigit.pl
+ ! Changes
+ !> (integrate 45 files)
+____________________________________________________________________________
+[ 3655] By: gsar on 1999/07/07 18:55:45
+ Log: filetest.t and ByteLoader build tweaks from Peter Prymmer
+ <pvhp@forte.com>
Branch: perl
- ! regcomp.c regcomp.h
+ ! ext/ByteLoader/Makefile.PL t/op/filetest.t
____________________________________________________________________________
-[ 779] By: mbeattie on 1998/03/05 19:01:25
- Log: Subject: [PATCH 5.004_61] Miscellaneous minor fixes
- Date: Mon, 02 Mar 1998 01:48:27 -0500 (EST)
- From: bailey@newman.upenn.edu (Charles Bailey)
+[ 3654] By: gsar on 1999/07/07 18:47:03
+ Log: change#1889 mistakenly removed F_SETLK
Branch: perl
- ! bytecode.h embedvar.h ext/B/Makefile.PL ext/B/byteperl.c
- ! ext/Thread/Makefile.PL lib/File/Path.pm patchlevel.h perldir.h
- ! sv.h
+ ! ext/Fcntl/Fcntl.xs
____________________________________________________________________________
-[ 778] By: mbeattie on 1998/03/05 18:53:13
- Log: Subject: [PATCH 5.004_61] USHRT range limit macros
- Date: Mon, 02 Mar 1998 01:41:41 -0500 (EST)
- From: bailey@newman.upenn.edu (Charles Bailey)
+[ 3653] By: gsar on 1999/07/07 18:42:42
+ Log: B::Deparse update
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Mon, 5 Jul 1999 17:57:03 -0500 (CDT)
+ Message-ID: <14209.13729.738691.610723@alias-2.pr.mcs.net>
+ Subject: [PATCH _57, long] B::Deparse 0.58
Branch: perl
- ! perl.h
+ ! ext/B/B/Deparse.pm
____________________________________________________________________________
-[ 777] By: mbeattie on 1998/03/05 18:50:25
- Log: Subject: [PATCH 5.004_61] File::Basename taint fix (revised)
- Date: Mon, 02 Mar 1998 01:39:47 -0500 (EST)
- From: bailey@newman.upenn.edu (Charles Bailey)
+[ 3652] By: gsar on 1999/07/07 18:41:07
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 5 Jul 1999 18:24:19 -0400 (EDT)
+ Message-Id: <199907052224.SAA10454@monk.mps.ohio-state.edu>
+ Subject: Re: [ID 19990705.001] Overloading boolean conversion
Branch: perl
- ! lib/File/Basename.pm
+ ! gv.c t/pragma/overload.t
____________________________________________________________________________
-[ 776] By: mbeattie on 1998/03/05 18:49:15
- Log: Subject: [PATCH] Take out version number in perlguts (perl5.004_61)
- Date: 01 Mar 1998 15:16:03 +0100
- From: Gisle Aas <gisle@aas.no>
+[ 3651] By: gsar on 1999/07/07 17:47:30
+ Log: missing PerlIO_reopen() (suggested by sam@daemoninc.com)
Branch: perl
- ! pod/perlguts.pod
+ ! perlsfio.h
____________________________________________________________________________
-[ 775] By: mbeattie on 1998/03/05 18:48:05
- Log: Subject: Re: [PATCH] 5.004_61: Makefile.SH (Re: 5.004_61: annoyingly missing patch)
- Date: Sun, 1 Mar 1998 12:14:44 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3650] By: gsar on 1999/07/07 17:45:52
+ Log: applied new parts of suggested patch
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Fri, 02 Jul 1999 19:18:41 -0400 (EDT)
+ Message-id: <01JD3M8W1VXS000S5G@mail.newman.upenn.edu>
+ Subject: [PATCH 5.005_57] Consolidated VMS patch
+ Branch: perl
+ ! configure.com ext/IO/lib/IO/File.pm iperlsys.h
+ ! lib/ExtUtils/MM_VMS.pm lib/File/Basename.pm
+ ! lib/File/Spec/VMS.pm pod/perldiag.pod t/base/rs.t
+ ! t/lib/io_multihomed.t t/lib/textfill.t t/lib/textwrap.t
+ ! t/op/filetest.t t/op/mkdir.t thread.h vms/vms.c
+____________________________________________________________________________
+[ 3649] By: jhi on 1999/07/07 13:38:02
+ Log: Sync regcomp warn with reality.
+ Branch: cfgperl
+ ! t/pragma/warn/regcomp
+____________________________________________________________________________
+[ 3648] By: jhi on 1999/07/07 13:04:55
+ Log: Integrate with Sarathy; one conflict in t/pragma/warn/recgomp
+ resolved manually.
+ Branch: cfgperl
+ +> pod/perllexwarn.pod t/pragma/warn/6default t/pragma/warn/av
+ +> t/pragma/warn/doop t/pragma/warn/hv t/pragma/warn/malloc
+ +> t/pragma/warn/perlio t/pragma/warn/run t/pragma/warn/utf8
+ - README.lexwarn
+ !> (integrate 79 files)
+____________________________________________________________________________
+[ 3647] By: gsar on 1999/07/07 10:32:03
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Thu, 01 Jul 1999 11:17:53 +0200
+ Message-ID: <377b2ca4.14467042@smtp1.ibm.net>
+ Subject: [PATCH 5.005_57] MakeMaker support for pod2html
Branch: perl
- ! Makefile.SH perl_exp.SH
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_Win32.pm
+ ! lib/ExtUtils/MakeMaker.pm
____________________________________________________________________________
-[ 774] By: mbeattie on 1998/03/05 18:46:32
- Log: Subject: Almost OK: 5.004_61 (threads, perlio)
- Date: Sun, 1 Mar 1998 02:02:47 -0500
- From: Spider Boardman <spider@orb.nashua.nh.us>
+[ 3646] By: gsar on 1999/07/07 10:27:55
+ Log: fix undocumented IO::Handle functions as suggested
+ by cj10@cam.ac.uk
Branch: perl
- ! bytecode.h bytecode.pl byterun.c byterun.h perlsdio.h
+ ! ext/IO/lib/IO/Handle.pm
____________________________________________________________________________
-[ 773] By: mbeattie on 1998/03/05 18:43:57
- Log: Subject: [PATCH 5.004_61] print sort {-1} 1..10; hangs
- Date: Sat, 28 Feb 1998 15:51:14 -0500 (EST)
- From: Hans Mulder <hansmu@xs4all.nl>
+[ 3645] By: gsar on 1999/07/07 10:18:55
+ Log: prohibit thread join()ing itself (from Dan Sugalski)
Branch: perl
- ! pp_ctl.c
+ ! ext/Thread/Thread.xs
____________________________________________________________________________
-[ 772] By: mbeattie on 1998/03/05 18:39:25
- Log: Subject: [PATCH] 5.004_61: Makefile.SH: 'ok' target needs perlbug...
- Date: Sat, 28 Feb 1998 17:06:41 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3644] By: gsar on 1999/07/07 10:14:26
+ Log: From: "Vishal Bhatia" <vishalb@my-deja.com>
+ Date: Wed, 30 Jun 1999 14:02:42 -0700
+ Message-ID: <LJHFKBDHMHHJDAAA@my-deja.com>
+ Subject: [PATCH 5.005_57] Compiler and XSUBS
Branch: perl
- ! Makefile.SH
+ ! ext/B/B/C.pm
____________________________________________________________________________
-[ 771] By: mbeattie on 1998/03/05 18:38:32
- Log: Subject: [PATCH] 5.004_61: hints/netbsd.sh
- Date: Sat, 28 Feb 1998 16:35:32 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3643] By: gsar on 1999/07/07 10:08:38
+ Log: mention C<foreach VAR (LIST) BLOCK continue BLOCK> syntax
+ (from François Désarménien <desar@club-internet.fr>)
Branch: perl
- ! hints/netbsd.sh
+ ! pod/perlsyn.pod
____________________________________________________________________________
-[ 770] By: mbeattie on 1998/03/05 18:36:50
- Log: Add byterun.c to cflags.SH (Dominic Dunlop <domo@vo.lu>)
+[ 3642] By: gsar on 1999/07/07 10:03:24
+ Log: From: Doug MacEachern <dougm@cp.net>
+ Date: Sun, 27 Jun 1999 22:43:25 -0700 (PDT)
+ Message-ID: <Pine.LNX.4.10.9906272236430.389-100000@mojo.eng.cp.net>
+ Subject: [PATCH 5.005_57] add B::PV::{LEN,CUR}
Branch: perl
- ! cflags.SH
+ ! ext/B/B.xs
____________________________________________________________________________
-[ 769] By: mbeattie on 1998/03/05 18:34:35
- Log: Change getc/fread to PerlIO_getc/fread in bytecode.h:
- Subject: [PATCH 5.004_61] bunch of small patches
- Date: Fri, 27 Feb 1998 20:03:29 -0500 (EST)
- From: Andrew Cohen <cohen@andy.bu.edu>
+[ 3641] By: gsar on 1999/07/07 10:00:57
+ Log: slightly modified version of suggested patch
+ From: Steven N. Hirsch <hirschs@stargate.btv.ibm.com>
+ Date: Mon, 28 Jun 1999 14:23:59 -0400
+ Message-Id: <199906281823.OAA24912@stargate.btv.ibm.com>
+ Subject: [ID 19990628.007] POSIX::tmpnam() broken for threaded 5.00503
Branch: perl
- ! bytecode.h
+ ! ext/POSIX/POSIX.xs
____________________________________________________________________________
-[ 768] By: mbeattie on 1998/03/05 18:13:06
- Log: Integrate win32 branch into mainline.
+[ 3640] By: gsar on 1999/07/07 09:45:43
+ Log: lexical warnings update (warning.t fails one test
+ due to leaked scalar, investigation pending)
+ From: paul.marquess@bt.com
+ Date: Sat, 26 Jun 1999 23:19:52 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB29C6C8E@mbtlipnt02.btlabs.bt.co.uk>
+ Subject: [PATCH 5.005_57] Lexical Warnings - mandatory warning are now default warnings
+ Branch: perl
+ + pod/perllexwarn.pod t/pragma/warn/6default t/pragma/warn/av
+ + t/pragma/warn/doop t/pragma/warn/hv t/pragma/warn/malloc
+ + t/pragma/warn/perlio t/pragma/warn/run t/pragma/warn/utf8
+ - README.lexwarn
+ ! Changes MANIFEST av.c djgpp/djgpp.c doio.c doop.c
+ ! ext/B/B/Asmdata.pm ext/ByteLoader/byterun.c
+ ! ext/ByteLoader/byterun.h gv.c hv.c jpl/JNI/JNI.xs
+ ! lib/warning.pm mg.c op.c os2/os2.c perl.c perlio.c
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! pod/perlmodlib.pod pod/perlrun.pod pod/perlvar.pod pp.c
+ ! pp_ctl.c run.c sv.c t/pragma/warn/3both t/pragma/warn/doio
+ ! t/pragma/warn/gv t/pragma/warn/mg t/pragma/warn/op
+ ! t/pragma/warn/perl t/pragma/warn/perly t/pragma/warn/pp
+ ! t/pragma/warn/pp_ctl t/pragma/warn/pp_hot t/pragma/warn/pp_sys
+ ! t/pragma/warn/regcomp t/pragma/warn/regexec t/pragma/warn/sv
+ ! t/pragma/warn/taint t/pragma/warn/toke t/pragma/warn/universal
+ ! t/pragma/warn/util t/pragma/warning.t toke.c utf8.c util.c
+ ! warning.h warning.pl win32/win32.c
+____________________________________________________________________________
+[ 3639] By: gsar on 1999/07/07 08:09:30
+ Log: From: Brian Jepson <bjepson@home.com>
+ Date: Sat, 26 Jun 1999 10:47:45 -0500 (EST)
+ Message-ID: <Pine.LNX.4.10.9906261044180.659-100000@cx384756-a.sking1.ri.home.com>
+ Subject: Patch to JPL example program
+ Branch: perl
+ ! jpl/JPL_Rolo/JPL_Rolo.jpl
+____________________________________________________________________________
+[ 3638] By: jhi on 1999/07/07 08:07:58
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 34 files)
+____________________________________________________________________________
+[ 3637] By: gsar on 1999/07/07 08:07:49
+ Log: From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Fri, 25 Jun 1999 13:38:44 -0500 (CDT)
+ Message-ID: <14193.25034.113373.245377@alias-2.pr.mcs.net>
+ Subject: [PATCH _57, long] Eliminate CONDOPs
Branch: perl
- !> (integrate 53 files)
+ ! bytecode.pl dump.c ext/B/B.pm ext/B/B.xs ext/B/B/Bblock.pm
+ ! ext/B/B/Bytecode.pm ext/B/B/C.pm ext/B/B/CC.pm
+ ! ext/B/B/Debug.pm ext/B/B/Xref.pm ext/B/ramblings/flip-flop
+ ! ext/B/typemap op.c op.h opcode.h opcode.pl perl.h
+ ! pod/perltoc.pod pp_ctl.c pp_hot.c
____________________________________________________________________________
-[ 767] By: TimBunce on 1998/03/05 11:48:09
- Log: Update to change 744.
- Branch: maint-5.004/perl
- ! lib/ExtUtils/Install.pm
+[ 3636] By: gsar on 1999/07/07 07:50:51
+ Log: adapted suggested patch for IO-1.20x
+ From: ian@dial.pipex.com
+ Date: Fri, 25 Jun 1999 10:39:42 +0100
+ Message-Id: <199906250939.KAA02152@homer.diplex.co.uk>
+ Subject: [ID 19990625.001] Minor fixes for IO::Socket.pm
+ Branch: perl
+ ! ext/IO/lib/IO/Socket.pm
____________________________________________________________________________
-[ 765] By: TimBunce on 1998/03/05 11:24:24
- Log: Update embed.h after make regen_headers.
- Branch: maint-5.004/perl
- ! embed.h
+[ 3635] By: gsar on 1999/07/07 07:26:05
+ Log: PowerMAX hints update from Tom Horsley <Tom.Horsley@mail.ccur.com>
+ Branch: perl
+ ! hints/powerux.sh
____________________________________________________________________________
-[ 764] By: TimBunce on 1998/03/05 11:05:13
- Log: APPLLIB_EXP now has arch and version dirs added to @INC
- Branch: maint-5.004/perl
- ! perl.c
+[ 3634] By: gsar on 1999/07/07 07:20:02
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Wed, 23 Jun 1999 16:16:05 +0100
+ Message-Id: <199906231516.QAA23851@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_57] memleak in optimizer
+ Branch: perl
+ ! embed.h embed.pl objXSUB.h op.c proto.h
____________________________________________________________________________
-[ 763] By: TimBunce on 1998/03/05 11:01:38
- Log: Added hints/openbsd.sh and t/op/pos.t to MANIFEST
- Added MAINT_TRIAL_1 local patch label to patchlevel.h
- Removed win32/win32io.c and win32/win32io.h from repository
- Branch: maint-5.004/perl
- - win32/win32io.c win32/win32io.h
- ! MANIFEST patchlevel.h
+[ 3633] By: gsar on 1999/07/07 07:10:52
+ Log: add do-not-edit caveats for files generated by opcode.pl
+ (suggested by Hugo van der Sanden)
+ Branch: perl
+ ! opcode.h opcode.pl pp.sym pp_proto.h
____________________________________________________________________________
-[ 762] By: TimBunce on 1998/03/05 10:05:34
- Log: Title: "5.004_04 +MAINT_TRIAL_1 broken when sizeof(int) != sizeof(void)"
- From: Spider Boardman <spider@orb.nashua.nh.us>
- Files: scope.c
- Branch: maint-5.004/perl
- ! scope.c
+[ 3632] By: gsar on 1999/07/07 06:41:13
+ Log: better diagnostics on read operations from write-only
+ filehandles
+ Branch: perl
+ ! doio.c perl.c pod/perldelta.pod pod/perldiag.pod pp_hot.c
+ ! pp_sys.c t/pragma/warn/pp_hot t/pragma/warn/pp_sys
____________________________________________________________________________
-[ 761] By: TimBunce on 1998/03/05 10:03:10
- Log: Title: "properly refcount localization, fix C<local $tied{foo}>"
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199802191207.MAA10742@toad.ig.co.uk>
- Files: av.c hv.c scope.c t/op/local.t
- Branch: maint-5.004/perl
- ! av.c hv.c scope.c t/op/local.t
-____________________________________________________________________________
-[ 760] By: gsar on 1998/03/04 20:58:21
- Log: added AS patch#10
- Message-Id: <01BD4691.963D1670.dougl@ActiveState.com>
- Date: Tue, 03 Mar 1998 10:46:13 PST
- From: Douglas Lankshear <dougl@ActiveState.com>
- Subject: [PATCH]
-
- Here's a patch to win32/dl_win32.xs that is a fix for the lookup of statically
- linked modules.
-
- -- Doug
- Branch: asperl
- ! win32/dl_win32.xs
+[ 3631] By: gsar on 1999/07/07 02:03:34
+ Log: make Sys::Hostname safe against C<$SIG{CHLD}='IGNORE'> (suggested
+ by David Muir Sharnoff <muir@idiom.com>)
+ Branch: perl
+ ! lib/Sys/Hostname.pm
____________________________________________________________________________
-[ 759] By: TimBunce on 1998/03/04 18:46:41
- Log: Update patchls utility
- Branch: maint-5.004/perl
- ! Porting/patchls
+[ 3630] By: gsar on 1999/07/07 01:57:16
+ Log: From: "Vishal Bhatia" <vishalb@my-deja.com>
+ Date: Sun, 20 Jun 1999 17:17:17 -0700
+ Message-ID: <AEBDBGKPMEAJAAAA@my-deja.com>
+ Subject: [PATCH 5.005_57] Minor bug fix in pp_require
+ Branch: perl
+ ! ext/B/B/CC.pm
____________________________________________________________________________
-[ 758] By: TimBunce on 1998/03/04 17:07:06
- Log: perldoc -f now uses pager if text is too long for screen
- Branch: maint-5.004/perl
- ! utils/perldoc.PL
+[ 3629] By: gsar on 1999/07/07 01:46:03
+ Log: installperl should write normal messages to STDOUT, not STDERR
+ Branch: perl
+ ! installperl
____________________________________________________________________________
-[ 757] By: TimBunce on 1998/03/04 16:57:04
- Log: Added OpenBSD hint file from <Todd.Miller@courtesan.com>
- Document 'warn with no args' behaviour, from <johnpc@xs4all.net>
- Branch: maint-5.004/perl
- + hints/openbsd.sh
- ! pod/perlfunc.pod
+[ 3628] By: gsar on 1999/07/07 01:41:25
+ Log: BSD/OS needs -DSTRUCT_TM_HASZONE as of 4.0.1 (from mab@alink.net)
+ Branch: perl
+ ! hints/bsdos.sh
____________________________________________________________________________
-[ 756] By: TimBunce on 1998/03/04 16:48:40
- Log: Fix for new gnulibc stdio.h when using sfio+perlio
- Branch: maint-5.004/perl
- ! perlsdio.h
+[ 3627] By: gsar on 1999/07/07 00:27:10
+ Log: make diagnostic on C<my $^I> etc., more readable
+ Branch: perl
+ ! op.c
____________________________________________________________________________
-[ 755] By: TimBunce on 1998/03/04 16:47:08
- Log: Fixed typo in vms/ext/Stdio/Stdio.pm AUTOLOAD
- Added details of split in scalar context to perlfunc.pod
- Branch: maint-5.004/perl
- ! pod/perlfunc.pod vms/ext/Stdio/Stdio.pm
+[ 3626] By: gsar on 1999/07/06 23:47:27
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Thu, 17 Jun 1999 12:07:11 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9906171204580.937-100000@newton.phys>
+ Subject: [ID 19990617.004 [PATCH 5.005_57] make distclean fixes]
+ Branch: perl
+ ! Makefile.SH utils/Makefile
____________________________________________________________________________
-[ 754] By: TimBunce on 1998/03/04 16:35:58
- Log: Updated perl -v info to include reference to docs and home page.
- Branch: maint-5.004/perl
- ! perl.c
+[ 3625] By: jhi on 1999/07/06 21:50:46
+ Log: Some new files of #3624 missing from MANIFEST.
+ Branch: cfgperl
+ ! MANIFEST
____________________________________________________________________________
-[ 753] By: TimBunce on 1998/03/04 16:31:29
- Log: Updated hints/bsdos.sh for BSD/OS 3.1
- Fixed typo in pod/perlsyn.pod
- Added workaround for old gmake in ext/SDBM_File/sdbm/Makefile.PL
- Fixed typo in ext/GDBM_File/GDBM_File.pm
- Branch: maint-5.004/perl
- ! ext/GDBM_File/GDBM_File.pm ext/SDBM_File/sdbm/Makefile.PL
- ! hints/bsdos.sh pod/perlsyn.pod
+[ 3624] By: jhi on 1999/07/06 21:47:04
+ Log: POSIX [[:character class:]] support for standard, locale,
+ and utf8. If both utf8 and locale are on, utf8 wins.
+ I don't fully understand why so many tables changed in
+ lib/unicode because of "make" -- maybe it was just overdue.
+ Branch: cfgperl
+ + lib/unicode/Is/ASCII.pl lib/unicode/Is/Cntrl.pl
+ + lib/unicode/Is/Graph.pl lib/unicode/Is/Punct.pl
+ + lib/unicode/Is/Word.pl lib/unicode/Is/XDigit.pl
+ ! MANIFEST Todo-5.005 embed.h embed.pl embedvar.h global.sym
+ ! handy.h intrpvar.h lib/unicode/Bidirectional.pl
+ ! lib/unicode/Block.pl lib/unicode/Category.pl
+ ! lib/unicode/Is/Alnum.pl lib/unicode/Is/Alpha.pl
+ ! lib/unicode/Is/BidiL.pl lib/unicode/Is/Digit.pl
+ ! lib/unicode/Is/L.pl lib/unicode/Is/Lo.pl
+ ! lib/unicode/Is/Lower.pl lib/unicode/Is/Print.pl
+ ! lib/unicode/Is/Space.pl lib/unicode/Is/Upper.pl
+ ! lib/unicode/Is/Z.pl lib/unicode/Is/Zs.pl lib/unicode/Name.pl
+ ! lib/unicode/To/Digit.pl lib/unicode/mktables.PL objXSUB.h
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlre.pod proto.h
+ ! regcomp.c regcomp.h regcomp.sym regexec.c regnodes.h
+ ! t/op/pat.t t/op/re_tests t/op/regexp.t t/pragma/utf8.t
+ ! t/pragma/warn/regcomp utf8.c
+____________________________________________________________________________
+[ 3623] By: gsar on 1999/07/06 20:52:48
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 16 Jun 1999 14:57:22 -0400
+ Message-ID: <19990616145722.B16258@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00557] Devel::Peek
+ Branch: perl
+ ! ext/Devel/Peek/Peek.pm ext/Devel/Peek/Peek.xs
____________________________________________________________________________
-[ 752] By: TimBunce on 1998/03/04 15:49:19
- Log: Changed bug address in README to perlbug@perl.com
- Changed Copyright in perl.c to 1998
- Added op/pos.t test from Robin Houston <robin@oneworld.org>
- Branch: maint-5.004/perl
- + t/op/pos.t
- ! README perl.c
+[ 3622] By: gsar on 1999/07/06 20:22:59
+ Log: applied patch after demunging headers with appropriate paths
+ From: "Vishal Bhatia" <vishalb@my-deja.com>
+ Date: Sat, 12 Jun 1999 08:23:59 -0700
+ Message-ID: <JIHEJPFDFKIBDAAA@my-deja.com>
+ Subject: [Patch 5.005_57] unsigned arithmetic (Compiler)
+ Branch: perl
+ ! cc_runtime.h ext/B/B.xs ext/B/B/CC.pm ext/B/B/Stackobj.pm
+ ! ext/B/defsubs.h.PL lib/ExtUtils/typemap t/harness
____________________________________________________________________________
-[ 751] By: TimBunce on 1998/03/04 14:47:15
- Log: Make t/comp/require.t and t/lib/ph.t executable in repository
- Branch: maint-5.004/perl
- ! t/comp/require.t t/lib/ph.t
+[ 3621] By: gsar on 1999/07/06 20:10:50
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 10 Jun 1999 04:05:22 -0400 (EDT)
+ Message-Id: <199906100805.EAA18216@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] Optimize 2>&1 in commands
+ Branch: perl
+ ! doio.c
____________________________________________________________________________
-[ 750] By: TimBunce on 1998/03/04 13:29:58
- Log: Added dTHR definition to ease backwards compatibility for XS
- source code from 5.005.
- Branch: maint-5.004/perl
- ! perl.h
+[ 3620] By: jhi on 1999/07/06 19:16:47
+ Log: Mention EPOC and SOCKS.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 749] By: TimBunce on 1998/03/04 12:19:19
- Log: Title: "rename local 'op' variables to 'o'", #F114
- From: Gurusamy Sarathy
- Files: op.h opcode.h proto.h dump.c op.c opcode.pl pp_ctl.c run.c scope.c
- toke.c
- Branch: maint-5.004/perl
- ! dump.c op.c op.h opcode.h opcode.pl pp_ctl.c proto.h run.c
- ! scope.c toke.c
-____________________________________________________________________________
-[ 748] By: TimBunce on 1998/03/04 12:12:27
- Log: Title: "consolidated win32 patch", #F112
- From: Gurusamy Sarathy
- Files: MANIFEST pod/perlfaq2.pod pod/perlrun.pod win32/include/sys/socket.h
- EXTERN.h INTERN.h dosish.h lib/ExtUtils/Command.pm
- lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
- lib/ExtUtils/Mksymlists.pm lib/File/DosGlob.pm t/TEST
- t/harness win32/win32.h win32/win32iop.h README.win32
- doio.c installhtml installperl pp_sys.c win32/Makefile
- win32/config.bc win32/config.vc win32/config_H.bc
- win32/config_H.vc win32/config_h.PL win32/config_sh.PL
- win32/dl_win32.xs win32/makedef.pl win32/makefile.mk
- win32/perllib.c win32/runperl.c win32/win32.c
- win32/win32sck.c win32/bin/perlglob.pl x2p/a2p.h x2p/a2p.c
- x2p/a2py.c
- Branch: maint-5.004/perl
- + win32/bin/perlglob.pl
- ! EXTERN.h INTERN.h MANIFEST README.win32 doio.c dosish.h
- ! installhtml installperl lib/ExtUtils/Command.pm
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
- ! lib/ExtUtils/Mksymlists.pm lib/File/DosGlob.pm
- ! pod/perlfaq2.pod pod/perlrun.pod pp_sys.c t/TEST t/harness
- ! win32/Makefile win32/config.bc win32/config.vc
- ! win32/config_H.bc win32/config_H.vc win32/config_h.PL
- ! win32/config_sh.PL win32/dl_win32.xs
- ! win32/include/sys/socket.h win32/makedef.pl win32/makefile.mk
- ! win32/perllib.c win32/runperl.c win32/win32.c win32/win32.h
- ! win32/win32iop.h win32/win32sck.c x2p/a2p.c x2p/a2p.h
- ! x2p/a2py.c
+[ 3619] By: gsar on 1999/07/06 16:52:37
+ Log: fix int vs STRLEN issue
+ Branch: perl
+ ! pp.c
____________________________________________________________________________
-[ 747] By: TimBunce on 1998/03/04 11:59:57
- Log: Title: "initialize @INC in ph.t, and fix up MANIFEST", #F111
- From: Gurusamy Sarathy
- Files: MANIFEST t/lib/ph.t
- Branch: maint-5.004/perl
- ! MANIFEST t/lib/ph.t
+[ 3618] By: jhi on 1999/07/06 16:52:20
+ Log: There ain't Perl_atonv().
+ Branch: cfgperl
+ ! ext/ByteLoader/bytecode.h
____________________________________________________________________________
-[ 746] By: TimBunce on 1998/03/04 11:47:43
- Log: Title: "properly save STDOUT during system() in debugger", #F110
- From: Jason Smith <smithj4@rpi.edu>
- Files: lib/perl5db.pl
- Branch: maint-5.004/perl
- ! lib/perl5db.pl
+[ 3617] By: jhi on 1999/07/06 15:55:22
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> Makefile.SH
____________________________________________________________________________
-[ 745] By: TimBunce on 1998/03/04 11:40:19
- Log: Title: "generate DynaLoader.pm at build time", #F109
- From: Achim Bohnet <ach@mpe.mpg.de>
- Msg-ID: <9802111938.AA26224@o09.xray.mpe.mpg.de>
- Files: MANIFEST ext/DynaLoader/DynaLoader.pm.PL ext/DynaLoader/Makefile.PL
- Branch: maint-5.004/perl
- + ext/DynaLoader/DynaLoader.pm.PL
- ! MANIFEST ext/DynaLoader/Makefile.PL
-____________________________________________________________________________
-[ 744] By: TimBunce on 1998/03/04 11:34:09
- Log: Title: "Install extensions with bootstrap in $archlib", #F108
- From: koenig@anna.mind.de (Andreas J. Koenig), koenig@kulturbox.de (Andreas
- J. Koenig)
- Msg-ID: <sfcra9fqx0n.fsf@anna.in-berlin.de>
- Files: lib/ExtUtils/Install.pm
- Branch: maint-5.004/perl
- ! lib/ExtUtils/Install.pm
+[ 3616] By: jhi on 1999/07/06 15:54:09
+ Log: Tweak for #3613.
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 743] By: TimBunce on 1998/03/04 10:45:05
- Log: Title: "Pod::Html trips over "C<0>"", #F107
- From: Chip Salzenberg
- Files: lib/Pod/Html.pm
- Branch: maint-5.004/perl
- ! lib/Pod/Html.pm
+[ 3615] By: gsar on 1999/07/06 11:00:21
+ Log: From: "Todd C. Miller" <Todd.Miller@courtesan.com>
+ Date: Sun, 13 Jun 1999 17:46:13 -0600 (MDT)
+ Message-Id: <199906132346.RAA26632@xerxes.courtesan.com>
+ Subject: [ID 19990613.003 linklibperl set incorrectly in Makefile.SH for OpenBSD]
+ Branch: perl
+ ! Makefile.SH
____________________________________________________________________________
-[ 742] By: TimBunce on 1998/03/04 10:12:54
- Log: Title: "5.004_58 | _04: pod2*,perlpod: L<show this|man/section>", #F106
- From: Achim Bohnet <ach@mpe.mpg.de>
- Msg-ID: <9802111629.AA00595@o09.xray.mpe.mpg.de>
- Files: pod/perlpod.pod lib/Pod/Html.pm lib/Pod/Text.pm pod/pod2man.PL
- Branch: maint-5.004/perl
- ! lib/Pod/Html.pm lib/Pod/Text.pm pod/perlpod.pod pod/pod2man.PL
+[ 3614] By: jhi on 1999/07/06 10:44:48
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> ext/IO/lib/IO/File.pm op.c op.h opcode.h opcode.pl perl.h pp.h
+ !> pp.sym pp_proto.h t/base/rs.t t/pragma/warn/op
+____________________________________________________________________________
+[ 3613] By: jhi on 1999/07/06 10:43:20
+ Log: From: Nathan Kurz <nate@valleytel.net>
+ Subject: [ID 19990612.001 compiling three deep modules within ext/]
+ ply-To: nate@valleytel.net
+ erl5-porters@perl.org
+ Date: Sat, 12 Jun 1999 01:26:04 -0500
+ Message-Id: <199906120626.BAA04996@trinkpad.valleytel.net>
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 741] By: TimBunce on 1998/03/04 10:08:31
- Log: Title: "New patch for $^E==GetLastError() under Win32", #F105
- From: Gurusamy Sarathy <gsar@engin.umich.edu>, Tye McQueen
- <tye@metronet.com>, ilya@math.ohio-state.edu (Ilya
- Zakharevich)
- Msg-ID: <199801040630.AA29298@metronet.com>,
- <199801041826.NAA11568@aatma.engin.umich.edu>,
- <1998Jan4.130412.2719461@cor.newman>
- Files: pod/perlfunc.pod pod/perlvar.pod doio.c lib/dumpvar.pl lib/perl5db.pl
- win32/win32.h mg.c util.c win32/makedef.pl win32/win32.c
- Branch: maint-5.004/perl
- ! doio.c lib/dumpvar.pl lib/perl5db.pl mg.c pod/perlfunc.pod
- ! pod/perlvar.pod util.c win32/makedef.pl win32/win32.c
- ! win32/win32.h
+[ 3612] By: gsar on 1999/07/06 10:17:52
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 12 Jun 1999 04:49:09 -0400 (EDT)
+ Message-Id: <199906120849.EAA26986@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] Optimize away OP_SASSIGN
+ Branch: perl
+ ! op.c op.h opcode.h opcode.pl pp.h pp.sym pp_proto.h
____________________________________________________________________________
-[ 740] By: TimBunce on 1998/03/04 09:55:57
- Log: Title: "5.004_56: Patch to Tie::Hash and docs", #F104
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199801120134.UAA05437@monk.mps.ohio-state.edu>
- Files: pod/perlfunc.pod lib/Tie/Hash.pm
- Branch: maint-5.004/perl
- ! lib/Tie/Hash.pm pod/perlfunc.pod
+[ 3611] By: gsar on 1999/07/06 09:51:20
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Fri, 11 Jun 99 17:07:19 PDT
+ Message-Id: <9906120007.AA13802@forte.com>
+ Subject: [PATCH _03 && _57]portability fix for IO::File and FileHandle
+ Branch: perl
+ ! ext/IO/lib/IO/File.pm
____________________________________________________________________________
-[ 739] By: TimBunce on 1998/03/04 09:26:01
- Log: Title: "more doc for perldoc", #F103
- From: Gurusamy Sarathy
- Files: utils/perldoc.PL
- Branch: maint-5.004/perl
- ! utils/perldoc.PL
+[ 3610] By: gsar on 1999/07/06 09:37:37
+ Log: fix for C<$/ = 42> setting paragraph mode (applied with small
+ tweak)
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Wed, 09 Jun 1999 18:27:51 +0100
+ Message-Id: <E10rm8l-00023T-00@ursa.cus.cam.ac.uk>
+ Subject: Re: [ID 19990608.002] Possible bug with binmode and <FH> on Perl 5.005_03 Win32
+ Branch: perl
+ ! perl.h t/base/rs.t
____________________________________________________________________________
-[ 738] By: TimBunce on 1998/03/04 09:23:16
- Log: Title: "Make perldoc look for an index file ", #F102
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <199801221220.NAA22902@furu.g.aas.no>
- Files: utils/perldoc.PL
- Branch: maint-5.004/perl
- ! utils/perldoc.PL
+[ 3609] By: jhi on 1999/07/06 09:28:48
+ Log: Integrate with Sarathy.
+ Branch: cfgperl
+ !> (integrate 49 files)
____________________________________________________________________________
-[ 737] By: TimBunce on 1998/03/04 09:21:15
- Log: Title: "perldoc -F filename", #F101
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199712120037.TAA00176@math.mps.ohio-state.edu>
- Files: utils/perldoc.PL
- Branch: maint-5.004/perl
- ! utils/perldoc.PL
+[ 3608] By: gsar on 1999/07/06 09:28:21
+ Log: test tweak
+ Branch: perl
+ ! t/pragma/warn/op
____________________________________________________________________________
-[ 736] By: TimBunce on 1998/03/04 09:16:20
- Log: Title: "sv_grow can fail for HAS_64K_LIMIT systems", #F100
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <m3iuqsl3oq.fsf@furu.g.aas.no>
- Files: sv.c
- Branch: maint-5.004/perl
+[ 3607] By: jhi on 1999/07/06 09:22:48
+ Log: Put back the cygwin32 Configure fix of 3582 undone by 3597.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3606] By: gsar on 1999/07/06 09:05:02
+ Log: applied slightly tweaked version of suggested patch for
+ improved RE API
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 9 Jun 1999 18:14:27 -0400 (EDT)
+ Message-Id: <199906092214.SAA14126@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_57] REx engine rehash
+ Branch: perl
+ ! Changes dump.c embed.h embed.pl embedvar.h ext/re/Makefile.PL
+ ! ext/re/re.xs global.sym objXSUB.h perl.c perl.h pp.c pp_hot.c
+ ! proto.h regcomp.c regcomp.h regexec.c regexp.h thrdvar.h
+ ! util.c
+____________________________________________________________________________
+[ 3605] By: gsar on 1999/07/06 08:54:03
+ Log: bug in change#3602 (cpp conditionals not allowed inside macro args)
+ Branch: perl
! sv.c
____________________________________________________________________________
-[ 735] By: TimBunce on 1998/03/04 09:08:51
- Log: Title: "Benchmark.pm: timethese corrupts $_", #F099
- From: abigail@fnx.com
- Msg-ID: <19980201114609.7779.qmail@betelgeuse.wayne.fnx.com>
- Files: lib/Benchmark.pm
- Branch: maint-5.004/perl
- ! lib/Benchmark.pm
+[ 3604] By: gsar on 1999/07/06 07:08:30
+ Log: From: paul.marquess@bt.com
+ Date: Tue, 8 Jun 1999 22:37:58 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB29C6C3C@mbtlipnt02.btlabs.bt.co.uk>
+ Subject: [PATCH 5.005_57] DB_File 1.67
+ Branch: perl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap
____________________________________________________________________________
-[ 734] By: TimBunce on 1998/03/04 08:59:58
- Log: Title: "STRANGE_MALLOC should test failed alloc", #F098
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <199802021406.PAA03285@furu.g.aas.no>
- Files: hv.c
- Branch: maint-5.004/perl
- ! hv.c
+[ 3603] By: gsar on 1999/07/06 07:04:50
+ Log: From: paul.marquess@bt.com
+ Date: Tue, 8 Jun 1999 22:34:01 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB29C6C3B@mbtlipnt02.btlabs.bt.co.uk>
+ Subject: [PATCH 5.005_57] DBM Filters
+ Branch: perl
+ ! ext/GDBM_File/GDBM_File.pm ext/GDBM_File/GDBM_File.xs
+ ! ext/NDBM_File/NDBM_File.pm ext/NDBM_File/NDBM_File.xs
+ ! ext/ODBM_File/ODBM_File.pm ext/ODBM_File/ODBM_File.xs
+ ! ext/SDBM_File/SDBM_File.pm ext/SDBM_File/SDBM_File.xs
____________________________________________________________________________
-[ 733] By: TimBunce on 1998/03/04 08:35:19
- Log: Title: "support caseless %ENV", #F097
- From: Gurusamy Sarathy
- Files: hv.c t/op/magic.t win32/win32.h
- Branch: maint-5.004/perl
- ! hv.c t/op/magic.t win32/win32.h
+[ 3602] By: gsar on 1999/07/06 07:00:01
+ Log: slightly tweaked version of suggested patch
+ From: Dan Sugalski <sugalskd@ous.edu>
+ Date: Tue, 08 Jun 1999 14:09:38 -0700
+ Message-Id: <3.0.6.32.19990608140938.030f12e0@ous.edu>
+ Subject: [PATCH 5.005_57]Use NV instead of double in the core
+ Branch: perl
+ ! av.h bytecode.pl cv.h doio.c dump.c embed.pl
+ ! ext/ByteLoader/bytecode.h ext/ByteLoader/byterun.c hv.h
+ ! intrpvar.h mg.c op.c perl.h pp.c pp.h pp_ctl.c pp_sys.c
+ ! proto.h sv.c sv.h toke.c universal.c util.c
____________________________________________________________________________
-[ 732] By: TimBunce on 1998/03/04 08:33:58
- Log: Title: "newer cperl-mode.el (from 5.004_60)", #F096
- From: Ilya Zakharevich
- Files: emacs/cperl-mode.el
- Branch: maint-5.004/perl
- ! emacs/cperl-mode.el
-____________________________________________________________________________
-[ 731] By: TimBunce on 1998/03/04 08:26:23
- Log: Title: "Handle set magic on xsub OUTPUT args, add API functions that handle
- magic", #F095
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199801190409.XAA26710@aatma.engin.umich.edu>
- Files: pod/perlguts.pod pod/perlxs.pod embed.h proto.h sv.h global.sym
- lib/ExtUtils/xsubpp sv.c
- Branch: maint-5.004/perl
- ! embed.h global.sym lib/ExtUtils/xsubpp pod/perlguts.pod
- ! pod/perlxs.pod proto.h sv.c sv.h
-____________________________________________________________________________
-[ 730] By: TimBunce on 1998/03/04 08:20:52
- Log: Title: "Fix flawed cleanup when signal handlers are not defined", #F094
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199710290106.UAA11485@aatma.engin.umich.edu>
- Files: mg.c
- Branch: maint-5.004/perl
+[ 3601] By: gsar on 1999/07/06 06:52:57
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> README.epoc epoc/config.h epoc/epoc.c epoc/epocish.h
+ +> epoc/perl.mmp epoc/perl.pkg
+ !> (integrate 30 files)
+____________________________________________________________________________
+[ 3598] By: jhi on 1999/07/05 20:02:55
+ Log: Integrate with mainperl.
+ Branch: cfgperl
+ +> lib/CGI/Pretty.pm
+ !> Changes ext/B/B/Bblock.pm ext/B/B/C.pm ext/B/B/CC.pm
+ !> ext/B/B/Stackobj.pm ext/GDBM_File/GDBM_File.xs mg.c op.c
+ !> opcode.h opcode.pl pp_sys.c t/lib/io_udp.t thread.h toke.c
+ !> vms/descrip_mms.template vms/subconfigure.com vms/vms.c
+ !> vms/vmsish.h
+____________________________________________________________________________
+[ 3597] By: jhi on 1999/07/05 19:59:48
+ Log: Hack SOCKS support some more plus a patch from Andy Dougherty
+ that addresses the notorious "Additional libraries" question.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH doio.c ext/Socket/Socket.xs hints/aix.sh perl.c
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3596] By: gsar on 1999/07/05 18:30:51
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 8 Jun 1999 04:47:58 -0400 (EDT)
+ Message-Id: <199906080847.EAA03810@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00557] Long-standing UDP sockets bug on OS/2
+ Branch: perl
+ ! pp_sys.c t/lib/io_udp.t
+____________________________________________________________________________
+[ 3595] By: gsar on 1999/07/05 18:29:08
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 8 Jun 1999 04:44:58 -0400 (EDT)
+ Message-Id: <199906080844.EAA03784@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00557] Setting $^E wipes out $!
+ Branch: perl
! mg.c
____________________________________________________________________________
-[ 729] By: TimBunce on 1998/03/04 08:18:02
- Log: Title: "Tests for C<sort 'foo','bar'>", #F093
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199711021247.MAA01743@crypt.compulink.co.uk>
- Files: t/op/sort.t
- Branch: maint-5.004/perl
- ! t/op/sort.t
+[ 3594] By: gsar on 1999/07/05 18:24:53
+ Log: hand-apply whitespace mutiliated patch
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Mon, 07 Jun 1999 14:46:42 -0700
+ Message-Id: <3.0.6.32.19990607144642.03079100@ous.edu>
+ Subject: [PATCH 5.005_57]Updated VMS patch
+ Branch: perl
+ ! thread.h vms/descrip_mms.template vms/subconfigure.com
+ ! vms/vms.c vms/vmsish.h
____________________________________________________________________________
-[ 728] By: TimBunce on 1998/03/04 08:17:07
- Log: Title: "Make search.pl work on win32", #F092
- From: Gurusamy Sarathy
- Files: win32/bin/search.pl
- Branch: maint-5.004/perl
- ! win32/bin/search.pl
+[ 3593] By: gsar on 1999/07/05 17:53:04
+ Log: applied parts not duplicated by previous patches
+ From: "Vishal Bhatia" <vishalb@my-deja.com>
+ Date: Sat, 05 Jun 1999 08:42:17 -0700
+ Message-ID: <JAMCAJKJEJDPAAAA@my-deja.com>
+ Subject: Fwd: [PATCH 5.005_57] consolidated compiler changes
+ Branch: perl
+ ! Changes ext/B/B/Bblock.pm ext/B/B/C.pm ext/B/B/CC.pm
+ ! ext/B/B/Stackobj.pm
+____________________________________________________________________________
+[ 3592] By: jhi on 1999/07/05 17:17:22
+ Log: AIX threaded build, plus few more on the side.
+ Branch: cfgperl
+ ! embed.h embed.pl ext/DynaLoader/dl_aix.xs
+ ! ext/DynaLoader/dl_next.xs ext/DynaLoader/dl_rhapsody.xs
+ ! ext/DynaLoader/dl_vms.xs hints/aix.sh objXSUB.h perl.h
+ ! perl_exp.SH pp_ctl.c proto.h toke.c util.c
+____________________________________________________________________________
+[ 3591] By: gsar on 1999/07/05 16:52:34
+ Log: "\e" and "\a" didn't produce right escape under EBCDIC
+ From: pvhp@forte.com (Peter Prymmer)
+ Date: Fri, 4 Jun 99 12:00:27 PDT
+ Message-Id: <9906041900.AA28387@forte.com>
+ Subject: [PATCH 5.005_57]lingering ASCIIism in tokener
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 3590] By: gsar on 1999/07/05 16:40:01
+ Log: s/scalar ref constructor/single ref constructor/ (suggested
+ by Stephen McCamant)
+ Branch: perl
+ ! opcode.h opcode.pl
+____________________________________________________________________________
+[ 3589] By: gsar on 1999/07/05 16:34:06
+ Log: no such thing as gdbm_clearerr() (from Andy Dougherty)
+ Branch: perl
+ ! ext/GDBM_File/GDBM_File.xs
____________________________________________________________________________
-[ 727] By: gsar on 1998/03/04 04:13:23
- Log: missing s/op/o/ from one of the mainpatches
- Branch: win32/perl
+[ 3588] By: gsar on 1999/07/05 16:29:39
+ Log: allow C<-foo> under C<use integer> (behavior of C<-$string>
+ is unchanged still)
+ Branch: perl
! op.c
____________________________________________________________________________
-[ 726] By: gsar on 1998/03/04 02:12:13
- Log: maintpatches #102 and #103 to perldoc.PL
- Branch: win32/perl
- ! utils/perldoc.PL
+[ 3587] By: jhi on 1999/07/05 10:31:43
+ Log: Make perl_exp.SH smarter about what to include and what to exclude.
+ Branch: cfgperl
+ ! perl_exp.SH
____________________________________________________________________________
-[ 725] By: gsar on 1998/03/04 02:00:15
- Log: renumber some tests to match maint branch
- Branch: win32/perl
- ! t/op/local.t
-____________________________________________________________________________
-[ 724] By: gsar on 1998/03/04 01:25:50
- Log: maintpatch
- #70: "Fix random whitespace errors in docs"
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <12726.877706444@eeyore.ibcinc.com>
- Date: Fri, 24 Oct 1997 11:20:44 -0400
- Files: pod/checkpods.PL pod/perlfunc.pod
- Branch: win32/perl
- ! pod/checkpods.PL
-____________________________________________________________________________
-[ 723] By: gsar on 1998/03/04 01:04:37
- Log: sync maintpatch
- #76: "Fix infinite loop on unlink() failure in File::Path::rmtree()
- From: Chip Salzenberg
- Files: lib/File/Path.pm
- Branch: win32/perl
- ! lib/File/Path.pm
+[ 3586] By: jhi on 1999/07/05 09:29:31
+ Log: Remove unnecessary and extraneous my $i = 0.
+ Branch: cfgperl
+ ! bytecode.pl
____________________________________________________________________________
-[ 722] By: gsar on 1998/03/04 00:46:46
- Log: remove redundancy in File::Find
- Branch: win32/perl
- ! lib/File/Find.pm
+[ 3585] By: jhi on 1999/07/05 07:28:59
+ Log: Integrate with mainperl.
+ Branch: cfgperl
+ !> (integrate 30 files)
____________________________________________________________________________
-[ 721] By: TimBunce on 1998/03/03 20:06:41
- Log: Title: "Fix spurious perldoc warnings on DOSISH platforms", #F091
- From: Molnar Laszlo <molnarl@cdata.tvnet.hu>
- Msg-ID: <34475659.1AA69855@cdata.tvnet.hu>
- Files: utils/perldoc.PL
- Branch: maint-5.004/perl
- ! utils/perldoc.PL
+[ 3584] By: gsar on 1999/07/05 05:36:28
+ Log: From: Vishal Bhatia <vishalb@hotmail.com>
+ Date: Thu, 03 Jun 1999 00:57:48 PDT
+ Message-ID: <19990603075749.86665.qmail@hotmail.com>
+ Subject: Re: [PATCH 5.005_57] pp_sort sorted out
+ Branch: perl
+ ! ext/B/B/Bblock.pm ext/B/B/C.pm ext/B/B/CC.pm
____________________________________________________________________________
-[ 720] By: TimBunce on 1998/03/03 20:03:59
- Log: Title: "Make ExtUtils::MM_Unix::fixin() do something meaningful on win32",
- #F090
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199801070016.TAA17766@aatma.engin.umich.edu>
- Files: lib/ExtUtils/MM_Unix.pm
- Branch: maint-5.004/perl
- ! lib/ExtUtils/MM_Unix.pm
+[ 3583] By: gsar on 1999/07/05 05:31:19
+ Log: suppress fancy display when in verbose mode (suggested by
+ Paul Johnson <pjcj@transeda.com>)
+ Branch: perl
+ ! lib/Test/Harness.pm
____________________________________________________________________________
-[ 719] By: TimBunce on 1998/03/03 20:02:06
- Log: Title: "Fix inconsistent case $ENV{Path} (vs $ENV{PATH})", #F089
- From: Gurusamy Sarathy
- Files: lib/FindBin.pm
- Branch: maint-5.004/perl
- ! lib/FindBin.pm
+[ 3582] By: gsar on 1999/07/05 05:17:12
+ Log: cygwin32 update
+ From: "Fifer, Eric" <EFifer@sanwaint.com>
+ Date: Wed, 2 Jun 1999 15:16:05 +0100
+ Message-Id: <71E287AB0D94D111BBD600600849EC8185EDD9@POST>
+ Subject: [ID 19990602.003] perl5.005_03 (CORE) cygwin32 port
+ Branch: perl
+ ! Configure Makefile.SH README.cygwin32 cygwin32/Makefile.SHs
+ ! cygwin32/build-instructions.READFIRST
+ ! cygwin32/build-instructions.charles-wilson
+ ! cygwin32/build-instructions.sebastien-barre
+ ! cygwin32/build-instructions.steven-morlock
+ ! cygwin32/build-instructions.steven-morlock2 doio.c dosish.h
+ ! ext/POSIX/Makefile.PL ext/POSIX/POSIX.xs hints/cygwin32.sh
+ ! lib/Cwd.pm lib/ExtUtils/MM_Cygwin.pm perl.h pp_hot.c
+ ! t/op/magic.t util.c
+____________________________________________________________________________
+[ 3581] By: gsar on 1999/07/05 02:46:18
+ Log: NeXT doesn't have FD_CLOEXEC (suggested by Hans Mulder)
+ Branch: perl
+ ! util.c
____________________________________________________________________________
-[ 718] By: TimBunce on 1998/03/03 20:00:26
- Log: Title: "Fix File::Find's longstanding confusion about win32 being like VMS",
- #F088
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199802020459.XAA04964@aatma.engin.umich.edu>
- Files: lib/File/Find.pm
- Branch: maint-5.004/perl
- ! lib/File/Find.pm
+[ 3580] By: gsar on 1999/07/05 02:38:03
+ Log: From: "Ed Peschko" <ed_peschko@csgsystems.com>
+ Date: Mon, 31 May 1999 18:18:13 -0600
+ Message-ID: <19990601001813.AAA17834@csgsystems.com>
+ Subject: [ PATCH perl5.005_57 ] new perlcc + regression tests
+ Branch: perl
+ ! t/TEST t/UTEST t/harness utils/perlcc.PL
____________________________________________________________________________
-[ 717] By: TimBunce on 1998/03/03 19:59:38
- Log: Title: "do_postponed breaks with multiple interpreters", #F087
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199710290316.WAA15888@aatma.engin.umich.edu>
- Files: op.c
- Branch: maint-5.004/perl
- ! op.c
+[ 3579] By: gsar on 1999/07/05 01:20:58
+ Log: compatibility tweak for Class::Struct
+ Branch: perl
+ ! lib/Class/Struct.pm
____________________________________________________________________________
-[ 716] By: TimBunce on 1998/03/03 19:57:17
- Log: Title: "Make warning on C<Nosuch::> optional, add to perl{diag,delta}.pod",
- #F086
- From: Gurusamy Sarathy
- Files: pod/perldelta.pod pod/perldiag.pod toke.c
- Branch: maint-5.004/perl
- ! pod/perldelta.pod pod/perldiag.pod toke.c
+[ 3578] By: jhi on 1999/07/04 23:26:01
+ Log: Miscellaneus AIX fixes + SOCKS support.
+ Branch: cfgperl
+ ! Configure Makefile.SH Porting/Glossary Porting/config.sh
+ ! Porting/config_H config_h.SH doio.c ext/Socket/Socket.xs
+ ! hints/aix.sh pp_sys.c
____________________________________________________________________________
-[ 715] By: TimBunce on 1998/03/03 19:51:33
- Log: Title: "Pod::Html bug and fix: missing </UL> in index", #F085
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199802192314.SAA23326@aatma.engin.umich.edu>
- Files: lib/Pod/Html.pm
- Branch: maint-5.004/perl
- ! lib/Pod/Html.pm
+[ 3577] By: gsar on 1999/07/04 23:07:39
+ Log: test tweak
+ Branch: perl
+ ! t/io/openpid.t
____________________________________________________________________________
-[ 714] By: TimBunce on 1998/03/03 19:50:28
- Log: Title: "New pod: perlhist", #F084
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199802191556.RAA09578@alpha.hut.fi>
- Files: MANIFEST pod/perl.pod pod/perlhist.pod pod/perltoc.pod pod/buildtoc
- Branch: maint-5.004/perl
- + pod/perlhist.pod
- ! MANIFEST pod/buildtoc pod/perl.pod pod/perltoc.pod
-____________________________________________________________________________
-[ 713] By: TimBunce on 1998/03/03 19:47:13
- Log: Title: "Fix restoration of locals on scope unwinding", #F083
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199802110515.AAA23700@aatma.engin.umich.edu>
- Files: pp_ctl.c t/op/local.t
- Branch: maint-5.004/perl
- ! pp_ctl.c t/op/local.t
+[ 3576] By: jhi on 1999/07/04 22:39:23
+ Log: Integrate with mainperl.
+ Branch: cfgperl
+ +> t/io/openpid.t
+ - win32/perlhost.h
+ !> (integrate 51 files)
____________________________________________________________________________
-[ 712] By: TimBunce on 1998/03/03 19:45:56
- Log: Title: "after an eval-ed bad require, requiring a string ref SEGVs", #F082
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199802102349.SAA16001@aatma.engin.umich.edu>
- Files: pp_ctl.c
- Branch: maint-5.004/perl
- ! pp_ctl.c
+[ 3575] By: jhi on 1999/07/04 22:26:48
+ Log: Added 64-bit support for AIX 4.3 or better
+ based on Martin H. Rusoff's observations.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/aix.sh
____________________________________________________________________________
-[ 711] By: TimBunce on 1998/03/03 19:44:41
- Log: Title: "Fix seg fault on eval/require and syntax errors", #F081
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199802102321.SAA15346@aatma.engin.umich.edu>
- Files: MANIFEST scope.h op.c pp_ctl.c scope.c t/comp/require.t toke.c
- Branch: maint-5.004/perl
- + t/comp/require.t
- ! MANIFEST op.c pp_ctl.c scope.c scope.h toke.c
-____________________________________________________________________________
-[ 710] By: TimBunce on 1998/03/03 19:36:34
- Log: Title: "5.004_58: the locale.t problem in IRIX", #F080
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199802091747.TAA01735@alpha.hut.fi>
- Files: t/pragma/locale.t
- Branch: maint-5.004/perl
+[ 3574] By: jhi on 1999/07/04 21:34:47
+ Log: Do not throw away gccvers compilation errors.
+ From: Andy Dougherty <doughera@lafayette.edu>
+ To: Ron Seguin <rseguin@on.bell.ca>
+ Cc: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH] Re: [ID 19990625.011] WHOA There
+ Date: Mon, 28 Jun 1999 12:36:38 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9906281230100.6265-100000@newton.phys>
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3573] By: gsar on 1999/07/04 21:10:32
+ Log: adapted suggested tests for addition to testsuite
+ From: RonaldWS@aol.com
+ Date: Sun, 30 May 1999 16:27:28 EDT
+ Message-Id: <25cd799f.2482f930@aol.com>
+ Subject: [19990530.007] Open with pipe | does not return pid under win32
+ Branch: perl
+ + t/io/openpid.t
+ ! MANIFEST win32/win32.c
+____________________________________________________________________________
+[ 3572] By: gsar on 1999/07/04 20:29:32
+ Log: perl_run() should call my_exit(0) for normal completion
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 3571] By: jhi on 1999/07/04 20:10:44
+ Log: Add test for change #3568 plus general cleanup.
+ Branch: cfgperl
! t/pragma/locale.t
____________________________________________________________________________
-[ 709] By: TimBunce on 1998/03/03 19:32:30
- Log: Title: "sv_setnv will upgrade SVt_NV to SVt_PVNV", #F079
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <m3g1lwl3bq.fsf@furu.g.aas.no>
- Files: sv.c
- Branch: maint-5.004/perl
- ! sv.c
+[ 3570] By: gsar on 1999/07/04 20:03:21
+ Log: make overload, Data::Dumper, and dumpvar understand qr// stringify
+ overloading
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.pm ext/Data/Dumper/Dumper.xs
+ ! lib/Dumpvalue.pm lib/dumpvar.pl lib/overload.pm pp_ctl.c
____________________________________________________________________________
-[ 708] By: TimBunce on 1998/03/03 19:28:06
- Log: Title: "Eliminate double warnings under C<package;>", #F077
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0y0paq-0000Ov-00@ursa.cus.cam.ac.uk>
- Files: gv.c op.c toke.c
- Branch: maint-5.004/perl
- ! gv.c op.c toke.c
-____________________________________________________________________________
-[ 707] By: TimBunce on 1998/03/03 19:13:17
- Log: Title: "Fix infinite loop on unlink() failure in File::Path::rmtree()",
- #F076
- From: Murray Nesbitt <mjn@pathcom.com>, Tim Bunce <Tim.Bunce@ig.co.uk>
- Msg-ID: <199802061100.LAA16423@toad.ig.co.uk>
- Files: lib/File/Path.pm
- Branch: maint-5.004/perl
- ! lib/File/Path.pm
+[ 3569] By: gsar on 1999/07/04 18:04:48
+ Log: make AIX dynaloading work when libperl is shared (and thus under
+ mod_perl etc.)
+ From: Jens-Uwe Mager <jum@helios.de>
+ Date: Sat, 29 May 1999 17:09:52 +0200
+ Message-Id: <199905291509.RAA43978@ans.helios.de>
+ Subject: [19990529.002] DynaLoader does not work properly if perl is not the main program (AIX)
+ Branch: perl
+ ! ext/DynaLoader/dl_aix.xs
____________________________________________________________________________
-[ 706] By: TimBunce on 1998/03/03 19:08:45
- Log: Title: "Update of h2ph", #F075
- From: kstar@www.chapin.edu (Kurt D. Starsinic)
- Msg-ID: <199802051354.FAA11452@www.chapin.edu>
- Files: t/lib/ph.t utils/h2ph.PL
- Branch: maint-5.004/perl
- + t/lib/ph.t
- ! utils/h2ph.PL
+[ 3568] By: jhi on 1999/07/04 14:54:23
+ Log: pp_lc/pp_lcfirst/pp_quotemeta/pp_uc/pp_ucfirst were not calling mg_set().
+ This resulted for example in the 'o' magic not being cleared by
+ magic_setcollxfrm(), which resulted in strange cmp results.
+ The bug was reported originally in the message
+ Subject: Bug with locale
+ From: Jan Starzynski <jan@planet.de>
+ To: perlbug@perl.com
+ Date: Fri, 09 Apr 1999 13:23:07 +0200
+ Message-ID: <370DE31B.DAEE1332@planet.de>
+ Branch: cfgperl
+ ! pp.c
____________________________________________________________________________
-[ 705] By: TimBunce on 1998/03/03 18:56:59
- Log: Title: "Fix AutoLoader for deep packages", #F074
- From: Zachary Miller <zcmiller@zappy.er.usgs.gov>
- Msg-ID: <199710092348.SAA02108@zappy.er.usgs.gov>
- Files: lib/AutoLoader.pm
- Branch: maint-5.004/perl
- ! lib/AutoLoader.pm
+[ 3567] By: gsar on 1999/07/04 02:38:34
+ Log: remove misleading info on defined(&func), unclutter deprecation
+ about defined(@array)
+ Branch: perl
+ ! op.c pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! t/pragma/warn/op
____________________________________________________________________________
-[ 704] By: TimBunce on 1998/03/03 18:35:36
- Log: Title: "Fix order of warnings for misplaced subscripts", #F073
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199710131023.LAA16796@crypt.compulink.co.uk>
- Files: op.c
- Branch: maint-5.004/perl
- ! op.c
+[ 3566] By: gsar on 1999/07/04 01:46:31
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 26 May 1999 22:07:17 +0200
+ Message-ID: <374c53ac.10322322@smtp1.ibm.net>
+ Subject: [PATCH 5.005_57] MINGW32 and EGCS 1.1.2 support
+ Branch: perl
+ ! Changes win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 703] By: TimBunce on 1998/03/03 18:32:28
- Log: Title: "Make recursive lexical analysis more robust", #F072
- From: Ilya Zakharevich and Chip Salzenberg
- Msg-ID: <199710160102.VAA28817@monk.mps.ohio-state.edu>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3565] By: gsar on 1999/07/04 01:26:02
+ Log: newer version of perlxstut from Jeff Okamoto (slightly edited
+ for win32 issues)
+ Branch: perl
+ ! pod/perlxstut.pod
____________________________________________________________________________
-[ 702] By: TimBunce on 1998/03/03 18:18:10
- Log: Title: "Fix random whitespace errors in docs", #F070
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <12726.877706444@eeyore.ibcinc.com>
- Files: pod/perlfunc.pod pod/checkpods.PL
- Branch: maint-5.004/perl
- ! pod/checkpods.PL pod/perlfunc.pod
+[ 3564] By: gsar on 1999/07/02 03:09:04
+ Log: avoid warnings
+ Branch: perl
+ ! ext/Thread/Thread/Specific.pm lib/fields.pm
____________________________________________________________________________
-[ 701] By: TimBunce on 1998/03/03 18:13:54
- Log: Title: "Fix line numbers after here documents in eval STRING", #F069
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199710241745.NAA08166@monk.mps.ohio-state.edu>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3563] By: gsar on 1999/06/28 19:23:47
+ Log: inc version (for CPAN.pm sanity)
+ Branch: perl
+ ! lib/Text/ParseWords.pm
____________________________________________________________________________
-[ 700] By: TimBunce on 1998/03/03 18:11:20
- Log: Title: "Fix SEGV from combining caller and C<package;>", #F068
- From: James Duncan <jduncan@epitome.hawk.igs.net>, Nicholas Clark
- <nick@flirble.org>
- Msg-ID: <199710241248.NAA00163@flirble.org>,
- <Pine.LNX.3.96.971024135912.12197A-100000@epitome.hawk.igs.
- net>
- Files: pp_ctl.c sv.c
- Branch: maint-5.004/perl
- ! pp_ctl.c sv.c
+[ 3562] By: gsar on 1999/06/28 19:19:01
+ Log: regen perltoc
+ Branch: perl
+ ! pod/perltoc.pod
____________________________________________________________________________
-[ 699] By: TimBunce on 1998/03/03 18:06:59
- Log: Title: "Don't fold string comparison under C<use locale>", #F067
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199711151506.RAA26287@alpha.hut.fi>
- Files: op.c
- Branch: maint-5.004/perl
- ! op.c
+[ 3561] By: gsar on 1999/06/28 19:08:41
+ Log: From: Damian Conway <damian@cs.monash.edu.au>
+ Date: Wed, 26 May 1999 00:58:35 -0400
+ Message-Id: <199905260458.AAA06411@defender.perl.org>
+ Subject: [19990526.002] Misc. improvements to Class:Struct
+ Branch: perl
+ ! MANIFEST lib/Class/Struct.pm
____________________________________________________________________________
-[ 698] By: TimBunce on 1998/03/03 18:04:51
- Log: Title: "Fix SEGV on constant at end of sort block", #F066
- From: Administration <fadmin@informatics.muni.cz>
- Msg-ID: <199711170838.JAA26073@thetis.fi.muni.cz>
- Files: op.c
- Branch: maint-5.004/perl
- ! op.c
+[ 3560] By: gsar on 1999/06/28 18:50:52
+ Log: remove bogus PL_optype_size
+ Branch: perl
+ ! bytecode.pl ext/ByteLoader/byterun.h
____________________________________________________________________________
-[ 697] By: TimBunce on 1998/03/03 18:02:54
- Log: Title: "Allow C<last()> to mean C<last>", #F065
- From: Chip Salzenberg
- Files: op.c
- Branch: maint-5.004/perl
- ! op.c
+[ 3559] By: gsar on 1999/06/28 18:22:26
+ Log: upgrade CGI.pm to v2.53 (CGI/{Apache,Switch}.pm NOT deleted)
+ Branch: perl
+ + lib/CGI/Pretty.pm
+ ! eg/cgi/file_upload.cgi lib/CGI.pm lib/CGI/Carp.pm
+ ! lib/CGI/Cookie.pm lib/CGI/Fast.pm t/lib/cgi-form.t
+ ! t/lib/cgi-html.t t/lib/cgi-request.t
____________________________________________________________________________
-[ 696] By: TimBunce on 1998/03/03 17:58:12
- Log: Title: "Fix extension version mismatch message", #F064
- From: Chip Salzenberg
- Files: XSUB.h
- Branch: maint-5.004/perl
- ! XSUB.h
+[ 3558] By: jhi on 1999/06/28 07:30:21
+ Log: Change Olaf Lebbe's email address.
+ Branch: cfgperl
+ ! README.epoc
____________________________________________________________________________
-[ 695] By: TimBunce on 1998/03/03 17:53:04
- Log: Title: "Better handle and test struct tm of Linux and SunOS", #F063
- From: Andy Dougherty <doughera@newton.phys.lafayette.edu>
- Msg-ID: <Pine.SUN.3.96.980205134340.15567B-100000@newton.phys>
- Files: MANIFEST ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
- hints/linux.sh hints/sunos_4_1.sh t/lib/posix.t
- Branch: maint-5.004/perl
- + ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
- ! MANIFEST hints/linux.sh hints/sunos_4_1.sh t/lib/posix.t
+[ 3557] By: gsar on 1999/06/28 00:07:33
+ Log: make autogenerated files writable
+ Branch: perl
+ - win32/perlhost.h
+ ! MANIFEST Porting/makerel embed.h embedvar.h ext/B/B/Asmdata.pm
+ ! ext/ByteLoader/byterun.c ext/ByteLoader/byterun.h global.sym
+ ! keywords.h lib/warning.pm objXSUB.h opcode.h pp.sym pp_proto.h
+ ! proto.h regnodes.h warning.h win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc
____________________________________________________________________________
-[ 694] By: TimBunce on 1998/03/03 17:40:47
- Log: Title: "Fix doc bug in getservbyname() examples", #F062
- From: Tom Christiansen
- Files: ext/Socket/Socket.pm
- Branch: maint-5.004/perl
- ! ext/Socket/Socket.pm
+[ 3556] By: jhi on 1999/06/27 19:22:53
+ Log: Update MANIFEST to match #3555.
+ Branch: cfgperl
+ ! MANIFEST
____________________________________________________________________________
-[ 693] By: TimBunce on 1998/03/03 17:32:57
- Log: Title: "Kill warning about parameter type", #F061
- From: Chip Salzenberg
- Files: op.c
- Branch: maint-5.004/perl
+[ 3555] By: jhi on 1999/06/27 19:16:22
+ Log: EPOC port to Psion5.
+ From: Olaf Flebbe <O.Flebbe@science-computing.de>
+ To: Jarkko Hietaniemi <jhi@iki.fi>
+ Cc: perl5-porters@perl.org
+ Subject: Re: Psion5
+ Date: Sun, 27 Jun 1999 20:50:30 +0200 (METDST)
+ Message-ID: <Pine.GHP.4.02.9906272048130.17736-100000@io.science-computing.de>
+ Branch: cfgperl
+ + README.epoc epoc/config.h epoc/epoc.c epoc/epocish.h
+ + epoc/perl.mmp epoc/perl.pkg
+ ! MANIFEST doio.c lib/Term/ReadLine.pm lib/perl5db.pl perl.c
+ ! perl.h sv.c util.c
+____________________________________________________________________________
+[ 3554] By: jhi on 1999/06/27 18:50:52
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 48 files)
+____________________________________________________________________________
+[ 3553] By: gsar on 1999/06/27 14:28:49
+ Log: somewhat untested PERL_OBJECT cleanups (C++isms mostly
+ gone from the public API); PERL_OBJECT builds again on
+ windows
+
+ TODO: namespace-clean the typedefs in iperlsys.h and
+ elsewhere; remove C++ remnants from public headers
+ Branch: perl
+ ! XSUB.h bytecode.pl cv.h embed.h embed.pl ext/B/B.xs
+ ! ext/ByteLoader/ByteLoader.xs ext/ByteLoader/bytecode.h
+ ! ext/ByteLoader/byterun.c ext/ByteLoader/byterun.h
+ ! ext/DynaLoader/dlutils.c global.sym globals.c iperlsys.h
+ ! lib/ExtUtils/Embed.pm lib/ExtUtils/xsubpp mg.c objXSUB.h
+ ! opcode.h opcode.pl perl.c perl.h pod/perlhist.pod pp_ctl.c
+ ! pp_hot.c proto.h scope.h sv.h toke.c universal.c util.c
+ ! win32/GenCAPI.pl win32/Makefile win32/config.bc
+ ! win32/config.gc win32/config.vc win32/dl_win32.xs
+ ! win32/makedef.pl win32/makefile.mk win32/perllib.c
+ ! win32/runperl.c win32/win32.c win32/win32.h win32/win32iop.h
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 3552] By: gsar on 1999/06/27 13:49:31
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> dump.c embed.h embed.pl embedvar.h global.sym intrpvar.h mg.c
+ !> objXSUB.h op.c perl.c perl.h perlvars.h pp.c pp_ctl.c
+ !> pp_proto.h pp_sys.c proto.h sv.c t/pragma/locale.t toke.c
+ !> util.c
+____________________________________________________________________________
+[ 3551] By: gsar on 1999/06/27 13:31:11
+ Log: fix indents
+ Branch: perl
! op.c
____________________________________________________________________________
-[ 692] By: TimBunce on 1998/03/03 17:11:07
- Log: Title: "Socket occasional SEGV", #F060
- From: Trevor Blackwell <tlb@viaweb.com>
- Msg-ID: <199710281804.NAA09632@wagg.viaweb.com>
- Files: ext/Socket/Socket.xs
- Branch: maint-5.004/perl
- ! ext/Socket/Socket.xs
+[ 3550] By: gsar on 1999/06/24 22:42:53
+ Log: update Changes
+ Branch: perl
+ ! Changes
____________________________________________________________________________
-[ 691] By: TimBunce on 1998/03/03 17:09:51
- Log: Title: "Avoid SEGV from local($@)", #F059
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199710290251.VAA14362@aatma.engin.umich.edu>
- Files: pp_ctl.c
- Branch: maint-5.004/perl
- ! pp_ctl.c
+[ 3549] By: gsar on 1999/06/24 22:41:17
+ Log: avoid race condition in the CAPI extension bootstrap handler
+ Branch: perl
+ ! lib/ExtUtils/xsubpp win32/GenCAPI.pl
____________________________________________________________________________
-[ 690] By: TimBunce on 1998/03/03 17:08:21
- Log: Title: "Don't use broken pad_reset() (was Re: Perl bug in 5.004_03 )", #F058
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199710300036.TAA01004@aatma.engin.umich.edu>
- Files: op.c
- Branch: maint-5.004/perl
+[ 3548] By: gsar on 1999/06/24 22:39:53
+ Log: sanity check to cover the case when perl is installed into the
+ X:\ (drive root)
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3547] By: gsar on 1999/06/22 19:30:32
+ Log: tweak RefHash to make intent clearer (suggested by John Dlugosz)
+ Branch: perl
+ ! lib/Tie/RefHash.pm
+____________________________________________________________________________
+[ 3544] By: jhi on 1999/06/18 19:24:28
+ Log: Tidy up #3542 and #3543.
+ Branch: cfgperl
+ ! t/pragma/locale.t util.c
+____________________________________________________________________________
+[ 3543] By: jhi on 1999/06/18 10:28:45
+ Log: Spice up locale.t.
+ Branch: cfgperl
+ ! t/pragma/locale.t
+____________________________________________________________________________
+[ 3542] By: jhi on 1999/06/17 22:42:03
+ Log: Fixed two long-standing locale bugs.
+
+ Both problems were related to numeric locale which
+ controls the radix character aka the decimal separator.
+ (1) printf (and sprintf) were resetting the numeric locale to C.
+ (2) Using locale-numerically formatted floating point
+ numbers (e.g. "1,23") together with -w caused warnings about
+ "isn't numeric". The operations were working fine, though,
+ because atof() was using the local locale.
+ Both problems reported by Stefan Vogtner.
+
+ Introduced a wrapper for atof() that attempts to convert
+ the string both ways. This helps Perl to understand
+ numbers like this "4.56" even when using a local locale
+ makes atof() understand only numbers like this "7,89".
+
+ Remaining related problems, both of which existed before
+ this patch and continue to exist after this patch:
+ (a) The behaviour of print() is _not_ as documented by perllocale.
+ Instead of always using the C locale, print() does use the
+ local locale, just like the *printf() do. This may be fixable
+ now that switching to-and-fro between locales has been made
+ more consistent, but fixing print() would change existing
+ behaviour. perllocale is not changed by this patch.
+ (b) If a number has been stringified (say, via "$number") under
+ a local locale, the cached string value persists even under
+ "no locale". This may or may not be a problem: operations
+ work fine because the original number is still there, but
+ that the string form keeps its locale-ish outlook may be
+ somewhat confusing.
+ Branch: cfgperl
+ ! dump.c embed.h embed.pl embedvar.h global.sym intrpvar.h mg.c
+ ! objXSUB.h op.c perl.c perl.h perlvars.h pp.c pp_ctl.c
+ ! pp_proto.h pp_sys.c proto.h sv.c t/pragma/locale.t toke.c
+ ! util.c
+____________________________________________________________________________
+[ 3541] By: jhi on 1999/06/17 20:00:16
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> ext/Data/Dumper/Dumper.pm op.c
+____________________________________________________________________________
+[ 3540] By: gsar on 1999/06/16 16:49:55
+ Log: dump C<0> as such, not C<'0'>
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.pm
+____________________________________________________________________________
+[ 3539] By: gsar on 1999/06/13 04:04:40
+ Log: fix coredumper in change#3498
+ Branch: perl
! op.c
____________________________________________________________________________
-[ 689] By: TimBunce on 1998/03/03 17:05:57
- Log: Title: "Use STMT_{START,END} in XSRETURN", #F057
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199710300245.VAA04244@aatma.engin.umich.edu>
- Files: XSUB.h
- Branch: maint-5.004/perl
- ! XSUB.h
+[ 3538] By: jhi on 1999/06/12 22:01:26
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> lib/caller.pm
+ !> (integrate 36 files)
____________________________________________________________________________
-[ 688] By: TimBunce on 1998/03/03 17:04:15
- Log: Title: "Re: Sort grammar bug", #F056
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199711011946.OAA18882@aatma.engin.umich.edu>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3537] By: gsar on 1999/06/12 06:43:03
+ Log: EXTERN_C declarations for global arrays in various
+ headers, so perl can be built even in C++ mode; win32
+ build fixups; regen headers
+ Branch: perl
+ ! XSUB.h embedvar.h ext/B/B.xs objXSUB.h opcode.h opcode.pl
+ ! perl.h regcomp.h regexec.c utf8.h win32/win32.c win32/win32.h
____________________________________________________________________________
-[ 687] By: TimBunce on 1998/03/03 17:01:32
- Log: Title: "Document indirect object cases for exec(), system()", #F055
- From: Dominic Dunlop <domo@slipper.ip.lu>
- Msg-ID: <v03110700b084e89234a7@[194.51.248.90]>
- Files: pod/perlfunc.pod
- Branch: maint-5.004/perl
- ! pod/perlfunc.pod
+[ 3536] By: gsar on 1999/06/12 06:38:21
+ Log: caller.pm typos
+ Branch: perl
+ ! lib/caller.pm
____________________________________________________________________________
-[ 686] By: TimBunce on 1998/03/03 16:56:44
- Log: Title: "Update docs on tr///", #F054
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.971103071602.10568C-100000@usertest.teleport.com>
- Files: pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
- pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
- pod/perlstyle.pod toke.c
- Branch: maint-5.004/perl
- ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
- ! pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
- ! pod/perlstyle.pod toke.c
-____________________________________________________________________________
-[ 685] By: TimBunce on 1998/03/03 16:38:50
- Log: Title: "Re: perlop bitwise & | ^ documentation", #F053
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.971106073858.29771O-100000@usertest.teleport.com>
- Files: pod/perlop.pod
- Branch: maint-5.004/perl
- ! pod/perlop.pod
+[ 3535] By: gsar on 1999/06/11 23:13:54
+ Log: various little tweaks; most globals are now in intrpvar.h, ninterps
+ is temporarily gone
+ Branch: perl
+ ! embed.pl intrpvar.h os2/os2.c perl.c perlvars.h
+ ! pod/perldelta.pod proto.h win32/perllib.c
____________________________________________________________________________
-[ 684] By: TimBunce on 1998/03/03 16:37:00
- Log: Title: "Fix SEGV on C<*glob{'SCALAR','ARRAY'}>", #F052
- From: "Joseph N. Hall" <joseph@cscaper.com>
- Msg-ID: <199711110552.WAA12613@gadget.cscaper.com>
- Files: perly.c perly.c.diff perly.y vms/perly_c.vms
- Branch: maint-5.004/perl
- ! perly.c perly.c.diff perly.y vms/perly_c.vms
-____________________________________________________________________________
-[ 683] By: TimBunce on 1998/03/03 16:31:15
- Log: Title: "for perlguts.pod: document sv_derived_from, sv_vcatpfn and
- sv_vsetpfn", #F051
- From: jan.dubois@ibm.net (Jan Dubois) and Chip Salzenberg
- Msg-ID: <346ae970.7444534@smtp1.ibm.net>
- Files: pod/perlguts.pod
- Branch: maint-5.004/perl
- ! pod/perlguts.pod
+[ 3534] By: gsar on 1999/06/11 20:41:51
+ Log: implement C<use caller 'encoding'>
+ Branch: perl
+ + lib/caller.pm
+ ! MANIFEST perl.h pod/perldelta.pod pod/perlfunc.pod pp_ctl.c
____________________________________________________________________________
-[ 682] By: TimBunce on 1998/03/03 16:28:30
- Log: Title: "5.004_04: locale startup failure (at last) documented", #F050
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199711172054.WAA08261@alpha.hut.fi>
- Files: INSTALL pod/perldiag.pod pod/perllocale.pod
- Branch: maint-5.004/perl
- ! INSTALL pod/perldiag.pod pod/perllocale.pod
+[ 3533] By: gsar on 1999/06/11 16:51:04
+ Log: truncate() has a peculiar exemption from strict barewords, even
+ though it has a non-filehandle prototype
+ Branch: perl
+ ! op.c t/io/fs.t
____________________________________________________________________________
-[ 681] By: TimBunce on 1998/03/03 16:24:12
- Log: Title: "Cope with lack of args in Fcntl::AUTOLOAD", #F049
- From: Jerome Abela <abela@hsc.fr>
- Msg-ID: <19971120183248.23588@coredump.hsc.fr>
- Files: ext/Fcntl/Fcntl.pm
- Branch: maint-5.004/perl
- ! ext/Fcntl/Fcntl.pm
+[ 3532] By: gsar on 1999/06/11 09:09:16
+ Log: GDBM tweak
+ Branch: perl
+ ! ext/GDBM_File/GDBM_File.xs ext/GDBM_File/typemap
____________________________________________________________________________
-[ 680] By: TimBunce on 1998/03/03 16:23:20
- Log: Title: "Commenting toke.c", #F048
- From: gnat@frii.com
- Msg-ID: <199801082138.OAA14186@prometheus.frii.com>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3531] By: gsar on 1999/06/10 23:34:19
+ Log: part of the platform changes for IMPLICIT_CONTEXT
+ Branch: perl
+ ! djgpp/djgpp.c jpl/JNI/JNI.xs jpl/JNI/typemap
+ ! jpl/PerlInterpreter/PerlInterpreter.c
+ ! jpl/PerlInterpreter/PerlInterpreter.h
+ ! os2/OS2/ExtAttr/ExtAttr.xs os2/OS2/PrfDB/PrfDB.xs
+ ! os2/OS2/Process/Process.xs os2/OS2/REXX/REXX.xs perl.h
____________________________________________________________________________
-[ 679] By: TimBunce on 1998/03/03 16:18:32
- Log: Title: "Re: 5.004_04 vec() fails with 32-bit values", #F047
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
- Msg-ID: <E0xsnr8-0007SS-00@taurus.cus.cam.ac.uk>
- Files: pod/perlguts.pod pp.c t/op/vec.t
- Branch: maint-5.004/perl
- ! pod/perlguts.pod pp.c t/op/vec.t
+[ 3530] By: jhi on 1999/06/10 20:55:56
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> ext/DB_File/DB_File.xs ext/DB_File/typemap
____________________________________________________________________________
-[ 678] By: TimBunce on 1998/03/03 16:15:44
- Log: Title: "A few perl5.004_03 bugs", #F046
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199801221211.MAA05315@crypt.compulink.co.uk>
- Files: mg.c t/op/magic.t
- Branch: maint-5.004/perl
- ! mg.c t/op/magic.t
+[ 3529] By: gsar on 1999/06/10 20:40:01
+ Log: DB_File tweaks for IMPLICIT CONTEXT
+ Branch: perl
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap
____________________________________________________________________________
-[ 677] By: TimBunce on 1998/03/03 16:13:11
- Log: Title: "Faster, cleaner av_unshift() ", #F045
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <199801221850.TAA23111@furu.g.aas.no>
- Files: av.c
- Branch: maint-5.004/perl
- ! av.c
+[ 3528] By: jhi on 1999/06/10 10:18:15
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 105 files)
____________________________________________________________________________
-[ 676] By: TimBunce on 1998/03/03 16:04:30
- Log: Title: "New hints/solaris2.sh", #F044
- From: Stephen Zander <srz@mckesson.com>
- Msg-ID: <87oh12y458.fsf@wsuse5.mckesson.com>
- Files: hints/solaris_2.sh
- Branch: maint-5.004/perl
- ! hints/solaris_2.sh
+[ 3527] By: gsar on 1999/06/10 09:30:35
+ Log: most globals are now interpreter local; locale initialization
+ was too early, defer it until interpreter is allocated and
+ initialized; multiple interpreters should now be
+ concurrency-safe (untested)
+ Branch: perl
+ ! embedvar.h intrpvar.h malloc.c miniperlmain.c perl.c perl.h
+ ! perlvars.h
____________________________________________________________________________
-[ 675] By: TimBunce on 1998/03/03 15:33:07
- Log: Title: "Refresh Complex.pm and test", #F043
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Msg-ID: <199802051608.SAA20262@alpha.hut.fi>
- Files: lib/Math/Complex.pm t/lib/complex.t
- Branch: maint-5.004/perl
- ! lib/Math/Complex.pm t/lib/complex.t
+[ 3526] By: gsar on 1999/06/10 08:38:00
+ Log: fix small nits
+ Branch: perl
+ ! cc_runtime.h ext/B/B/CC.pm run.c
____________________________________________________________________________
-[ 674] By: TimBunce on 1998/03/03 15:29:16
- Log: Title: "Fix (\@@) proto", #F042
- From: "Joseph N. Hall" <joseph@cscaper.com>
- Msg-ID: <199801240132.SAA25111@gadget.cscaper.com>
- Files: op.c t/comp/proto.t
- Branch: maint-5.004/perl
- ! op.c t/comp/proto.t
+[ 3525] By: gsar on 1999/06/10 04:41:38
+ Log: win32 build fixes
+ Branch: perl
+ ! bytecode.pl dosish.h embed.h embed.pl ext/B/B.xs
+ ! ext/ByteLoader/ByteLoader.xs ext/ByteLoader/bytecode.h
+ ! ext/ByteLoader/byterun.h ext/SDBM_File/sdbm/sdbm.c globals.c
+ ! mg.c objXSUB.h op.h perl.c perl.h pp_sys.c proto.h sv.c util.c
+ ! win32/Makefile win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/config_h.PL win32/dl_win32.xs
+ ! win32/makedef.pl win32/makefile.mk win32/perllib.c
+ ! win32/win32.c win32/win32.h win32/win32sck.c
+ ! win32/win32thread.c win32/win32thread.h
____________________________________________________________________________
-[ 673] By: TimBunce on 1998/03/03 15:26:31
- Log: Title: "Allow empty BLOCK in code", #F041
- From: Vladimir Alexiev <vladimir@cs.ualberta.ca>
- Msg-ID: <19980129002112Z13378-6931+226@scapa.cs.ualberta.ca>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3524] By: gsar on 1999/06/09 18:03:01
+ Log: more complete support for implicit thread/interpreter pointer,
+ enabled via -DPERL_IMPLICIT_CONTEXT (all changes are noops
+ without that enabled):
+ - USE_THREADS now enables PERL_IMPLICIT_CONTEXT, so dTHR
+ is a noop; tests pass on Solaris; should be faster now!
+ - MULTIPLICITY has been tested with and without
+ PERL_IMPLICIT_CONTEXT on Solaris
+ - improved function database now merged with embed.pl
+ - everything except the varargs functions have foo(a,b,c) macros
+ to provide compatibility
+ - varargs functions default to compatibility variants that
+ get the context pointer using dTHX
+ - there should be almost no source compatibility issues as a
+ result of all this
+ - dl_foo.xs changes other than dl_dlopen.xs untested
+ - still needs documentation, fixups for win32 etc
+ Next step: migrate most non-mutex variables from perlvars.h
+ to intrpvar.h
+ Branch: perl
+ - proto.pl
+ ! MANIFEST XSUB.h av.c bytecode.pl cv.h doio.c doop.c dump.c
+ ! ebcdic.c embed.h embed.pl embedvar.h ext/B/B.xs ext/B/typemap
+ ! ext/ByteLoader/ByteLoader.xs ext/ByteLoader/bytecode.h
+ ! ext/ByteLoader/byterun.c ext/ByteLoader/byterun.h
+ ! ext/Data/Dumper/Dumper.xs ext/Devel/Peek/Peek.xs
+ ! ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_beos.xs
+ ! ext/DynaLoader/dl_cygwin32.xs ext/DynaLoader/dl_dld.xs
+ ! ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_hpux.xs
+ ! ext/DynaLoader/dl_mpeix.xs ext/DynaLoader/dl_next.xs
+ ! ext/DynaLoader/dl_none.xs ext/DynaLoader/dl_rhapsody.xs
+ ! ext/DynaLoader/dl_vmesa.xs ext/DynaLoader/dl_vms.xs
+ ! ext/DynaLoader/dlutils.c ext/Opcode/Opcode.xs
+ ! ext/POSIX/POSIX.xs ext/Thread/Thread.xs ext/re/re.xs
+ ! global.sym globals.c gv.c hv.c lib/ExtUtils/typemap
+ ! lib/ExtUtils/xsubpp malloc.c mg.c mg.h miniperlmain.c
+ ! objXSUB.h op.c opcode.h opcode.pl perl.c perl.h perlio.c
+ ! perlsfio.h perly.c pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c
+ ! proto.h regcomp.c regcomp.h regexec.c run.c scope.c scope.h
+ ! sv.c taint.c thrdvar.h thread.h toke.c universal.c utf8.c
+ ! util.c win32/Makefile win32/makefile.mk writemain.SH
____________________________________________________________________________
-[ 672] By: TimBunce on 1998/03/03 15:23:55
- Log: Title: "Fix name of $Foo::{'Bar::'}: '*Foo::Bar::'", #F040
- From: Chip Salzenberg
- Files: gv.c t/op/gv.t
- Branch: maint-5.004/perl
- ! gv.c t/op/gv.t
+[ 3523] By: gsar on 1999/06/07 05:24:13
+ Log: missed a file
+ Branch: perl
+ + proto.pl
+ ! MANIFEST
____________________________________________________________________________
-[ 671] By: TimBunce on 1998/03/03 10:02:32
- Log: Title: "Keep accurate reference count on globs' stashes", #F038
- From: Gisle Aas <gisle@aas.no>
- Msg-ID: <m3zpk7sd3n.fsf@furu.g.aas.no>
- Files: gv.c sv.c
- Branch: maint-5.004/perl
- ! gv.c sv.c
+[ 3522] By: gsar on 1999/06/07 05:18:34
+ Log: initial stub implementation of implicit thread/this
+ pointer argument; builds/tests on Solaris, win32
+ hasn't been fixed up yet; proto.h, global.sym and
+ static function decls are now generated from a common
+ database in proto.pl; some inconsistently named
+ perl_foo() things are now Perl_foo(), compatibility
+ #defines provided; perl_foo() (lowercase 'p') reserved
+ for functions that take an explicit context argument;
+ next step: generate #define foo(a,b) Perl_foo(aTHX_ a,b)
+ Branch: perl
+ ! XSUB.h av.c cop.h deb.c doio.c doop.c dump.c ebcdic.c embed.h
+ ! embed.pl ext/POSIX/POSIX.xs global.sym globals.c gv.c gv.h
+ ! hv.c malloc.c mg.c miniperlmain.c objXSUB.h op.c opcode.h
+ ! opcode.pl perl.c perl.h perl_exp.SH perlio.c perly.c perly.y
+ ! pp.c pp.sym pp_ctl.c pp_hot.c pp_proto.h pp_sys.c proto.h
+ ! regcomp.c regexec.c run.c scope.c scope.h sv.c taint.c toke.c
+ ! universal.c utf8.c util.c
+____________________________________________________________________________
+[ 3521] By: gsar on 1999/06/04 23:00:22
+ Log: clean up some stray "global" symbols
+ Branch: perl
+ ! embed.h embed.pl global.sym objXSUB.h opcode.pl pp.sym
+ ! pp_proto.h proto.h
+____________________________________________________________________________
+[ 3520] By: jhi on 1999/06/02 21:33:28
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 94 files)
____________________________________________________________________________
-[ 670] By: TimBunce on 1998/03/03 09:59:48
- Log: Title: "Avoid memory allocation in gv_fetchpv(), for speed", #F037
- From: Chip Salzenberg
- Files: gv.c
- Branch: maint-5.004/perl
+[ 3519] By: gsar on 1999/06/02 07:16:10
+ Log: avoid dereferencing null pointer from getpwent() et al
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3518] By: gsar on 1999/06/02 04:47:10
+ Log: remove _() non-ansism
+ Branch: perl
+ ! Porting/config_H XSUB.h config_h.SH cv.h doio.c doop.c
+ ! ext/B/B/C.pm ext/B/B/CC.pm ext/B/byteperl.c
+ ! ext/ByteLoader/ByteLoader.xs ext/Data/Dumper/Dumper.xs
+ ! ext/DynaLoader/dl_beos.xs ext/DynaLoader/dl_dlopen.xs
+ ! ext/DynaLoader/dl_vmesa.xs ext/IO/poll.h ext/IPC/SysV/SysV.xs
+ ! ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs ext/Thread/Thread.xs
+ ! ext/re/re.xs handy.h hv.c iperlsys.h
+ ! jpl/PerlInterpreter/PerlInterpreter.c lib/ExtUtils/Embed.pm
+ ! malloc.c mg.c mg.h minimod.pl miniperlmain.c op.c op.h
+ ! opcode.h opcode.pl os2/POSIX.mkfifo perl.c perl.h
+ ! plan9/config.plan9 pod/perlembed.pod pod/perlguts.pod pp.c
+ ! pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c regexec.c run.c
+ ! scope.h sv.c sv.h thread.h toke.c util.c vms/sockadapt.h
+ ! vms/vmsish.h vms/writemain.pl vos/config.h
+ ! vos/config_h.SH_orig win32/GenCAPI.pl win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makemain.pl
+ ! win32/perllib.c win32/runperl.c win32/win32.h
+ ! win32/win32thread.h writemain.SH x2p/a2p.c x2p/a2p.h x2p/a2p.y
+ ! x2p/hash.h x2p/str.h x2p/util.h x2p/walk.c
+____________________________________________________________________________
+[ 3517] By: gsar on 1999/06/02 02:17:51
+ Log: missed a few files
+ Branch: perl
+ ! ext/POSIX/POSIX.xs jpl/JNI/JNI.xs
+____________________________________________________________________________
+[ 3516] By: gsar on 1999/06/02 01:37:33
+ Log: integrate cfgperl contents into mainline
+ Branch: perl
+ +> ext/ByteLoader/bytecode.h ext/ByteLoader/byterun.c
+ +> ext/ByteLoader/byterun.h
+ - bytecode.h byterun.c byterun.h
+ ! Changes
+ !> (integrate 58 files)
+____________________________________________________________________________
+[ 3515] By: gsar on 1999/06/02 00:48:50
+ Log: remove stray K&R-isms
+ Branch: perl
+ ! ext/SDBM_File/sdbm/dba.c ext/SDBM_File/sdbm/dbd.c
+ ! ext/SDBM_File/sdbm/dbe.c ext/SDBM_File/sdbm/dbm.c
+ ! ext/SDBM_File/sdbm/dbu.c mg.c op.c pp_ctl.c pp_sys.c sv.c
+ ! toke.c util.c win32/win32.c x2p/hash.c
+____________________________________________________________________________
+[ 3514] By: gsar on 1999/06/01 15:55:55
+ Log: change#3447 didn't do enough to exempt Foo->bar(qw/.../) from
+ strict 'subs'
+ Branch: perl
+ ! op.c t/pragma/strict-subs
+____________________________________________________________________________
+[ 3513] By: jhi on 1999/06/01 07:17:05
+ Log: Patch applying of #3499 had gone awry.
+ Branch: cfgperl
+ ! ext/ByteLoader/bytecode.h ext/ByteLoader/byterun.h
+____________________________________________________________________________
+[ 3512] By: gsar on 1999/05/31 19:21:30
+ Log: tighter -help output
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 3511] By: gsar on 1999/05/31 17:18:23
+ Log: fix memory leak in C<eval 'return sub {...}'>
+ Branch: perl
+ ! embed.h embed.pl objXSUB.h pp_ctl.c proto.h
+____________________________________________________________________________
+[ 3510] By: gsar on 1999/05/31 14:11:46
+ Log: tweak C++isms
+ Branch: perl
+ ! win32/dl_win32.xs win32/win32.c
+____________________________________________________________________________
+[ 3509] By: jhi on 1999/05/30 13:02:26
+ Log: Cleanup of #3488.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3508] By: jhi on 1999/05/30 11:16:01
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_57] Teach Socket and io_unix.t the syntax of OS/2
+ Date: Sat, 29 May 1999 20:18:13 -0400
+ Message-ID: <19990529201813.B9489@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! ext/Socket/Socket.xs os2/os2ish.h t/lib/io_unix.t
+____________________________________________________________________________
+[ 3507] By: jhi on 1999/05/29 20:05:40
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.com
+ Subject: PATCH (5.005_57): Document use of `SPECIAL' flag for `pushre':
+ Date: Sat, 29 May 1999 14:45:10 -0400
+ Message-ID: <19990529184510.27557.qmail@plover.com>
+ Branch: cfgperl
+ ! op.h
+____________________________________________________________________________
+[ 3506] By: gsar on 1999/05/29 16:49:39
+ Log: avoid gv_check() recursive pit
+ Branch: perl
! gv.c
____________________________________________________________________________
-[ 669] By: TimBunce on 1998/03/03 09:58:58
- Log: Title: "Make Configure less negative about PerlIO", #F036
- From: chip@atlantic.net
- Msg-ID: <199801312323.SAA15237@cyprus.atlantic.net>
- Files: Configure
+[ 3505] By: jhi on 1999/05/29 11:38:16
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ To: Gurusamy Sarathy <gsar@activestate.com>
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.005_57]Safeguard against unimplemented functions in pwuid.t and grent.t
+ Date: Sat, 29 May 1999 08:46:22 +0200
+ Message-ID: <374f8007.2016008@smtp1.ibm.net>
+ Branch: cfgperl
+ ! t/op/grent.t t/op/pwent.t
+____________________________________________________________________________
+[ 3504] By: jhi on 1999/05/29 11:07:10
+ Log: QNX needs <sys/select.h> to define fd_set.
+
+ From: Norton Allen <allen@huarp.harvard.edu>
+ To: perl5-porters@perl.org
+ Subject: [19990526.016] Not OK: perl 5.00503 on x86-qnx 424
+ Date: Wed, 26 May 1999 13:51:27 -0400 (EDT)
+ Message-Id: <199905261751.NAA20966@bottesini.harvard.edu>
+ Branch: cfgperl
+ ! ext/IO/poll.c
+____________________________________________________________________________
+[ 3503] By: jhi on 1999/05/29 10:53:31
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ To: Gurusamy Sarathy <gsar@activestate.com>, perl5-porters@perl.org
+ Subject: [PATCH all versions] (was Re: Unitialized Value Complaints in Math::BigFloat)
+ Date: Fri, 28 May 1999 20:14:35 +0200
+ Message-ID: <3751daa4.7188847@smtp1.ibm.net>
+ Branch: cfgperl
+ ! lib/Math/BigFloat.pm
+____________________________________________________________________________
+[ 3502] By: jhi on 1999/05/29 10:44:44
+ Log: Make Configure support the change #3367,
+ SysV shadow passwords.
+ Branch: cfgperl
+ ! Configure config_h.SH pp_sys.c
+____________________________________________________________________________
+[ 3501] By: gsar on 1999/05/28 21:22:23
+ Log: add wide versions of win32 system calls (first step in
+ globalization); delayload winsock for performance if compiling
+ with VC 6.0
+ Branch: perl
+ ! win32/Makefile win32/dl_win32.xs win32/makefile.mk
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 3500] By: jhi on 1999/05/28 21:17:24
+ Log: The new t/lib/io_linenum.t was using stricture
+ before @INC was set up.
+ Branch: cfgperl
+ ! t/lib/io_linenum.t
+____________________________________________________________________________
+[ 3499] By: jhi on 1999/05/28 17:13:23
+ Log: From: Tom Hughes <tom@compton.nu>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_57] ByteLoader mark 2
+ Date: Wed, 26 May 1999 23:59:49 +0100
+ Message-ID: <bf337a0849.tom@compton.compton.nu>
+
+ plus resolve tiny conflict with #3479
+ plus regen_headers.
+ Branch: cfgperl
+ + ext/ByteLoader/bytecode.h ext/ByteLoader/byterun.c
+ + ext/ByteLoader/byterun.h
+ - bytecode.h byterun.c byterun.h
+ ! MANIFEST Makefile.SH bytecode.pl embed.h embedvar.h ext/B/B.pm
+ ! ext/B/B.xs ext/B/B/Bytecode.pm ext/B/Makefile.PL
+ ! ext/ByteLoader/ByteLoader.pm ext/ByteLoader/ByteLoader.xs
+ ! ext/ByteLoader/Makefile.PL global.sym intrpvar.h objXSUB.h
+ ! perl.h perlvars.h proto.h util.c utils/Makefile
+____________________________________________________________________________
+[ 3498] By: jhi on 1999/05/28 16:53:04
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.com
+ Subject: PATCH (5.005_57): defined(@a) now deprecated
+ Date: Thu, 27 May 1999 16:05:44 -0400
+ Message-ID: <19990527200544.13330.qmail@plover.com>
+ Branch: cfgperl
+ ! lib/Carp.pm op.c opcode.h opcode.pl pod/perldelta.pod
+ ! pod/perldiag.pod pod/perlfunc.pod pp_proto.h t/pragma/warn/op
+____________________________________________________________________________
+[ 3497] By: jhi on 1999/05/28 16:50:54
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.00557] Cosmetic OS/2-related patches
+ Date: Fri, 28 May 1999 12:13:00 -0400 (EDT)
+ Message-Id: <199905281613.MAA02048@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! MANIFEST Makefile.SH ext/POSIX/POSIX.xs hints/os2.sh
+ ! os2/Makefile.SHs t/io/pipe.t t/lib/io_sock.t
+____________________________________________________________________________
+[ 3496] By: jhi on 1999/05/28 16:48:39
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.00557] Required OS/2-related patches
+ Date: Fri, 28 May 1999 12:11:48 -0400 (EDT)
+ Message-Id: <199905281611.MAA02037@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! os2/os2.c t/lib/bigfloatpm.t t/lib/io_unix.t t/op/groups.t
+ ! t/op/stat.t util.c
+____________________________________________________________________________
+[ 3495] By: jhi on 1999/05/28 16:45:56
+ Log: From: Paul Johnson <pjcj@transeda.com>
+ To: perl5-porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_57] Provide more useful test okay percentage
+ Date: Fri, 28 May 1999 15:13:54 +0100
+ Message-ID: <19990528151354.B289@west-tip.transeda.com>
+ Branch: cfgperl
+ ! t/TEST
+____________________________________________________________________________
+[ 3494] By: jhi on 1999/05/28 16:44:34
+ Log: From: Paul Johnson <pjcj@transeda.com>
+ To: perl5-porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_57] Fixes related to working local $.
+ Date: Fri, 28 May 1999 15:11:18 +0100
+ Message-ID: <19990528151118.A289@west-tip.transeda.com>
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Handle.pm pod/perlvar.pod t/lib/io_linenum.t
+____________________________________________________________________________
+[ 3493] By: gsar on 1999/05/28 16:37:26
+ Log: change#3449 wasn't doing enough
+ Branch: perl
+ ! op.c t/comp/proto.t
+____________________________________________________________________________
+[ 3492] By: jhi on 1999/05/28 08:12:23
+ Log: From: paul.marquess@bt.com
+ To: doughera@lafayette.edu
+ Cc: perl5-porters@perl.org
+ Subject: RE: [19990527.002] DBM Filters in _57 cause problems in NDBM_File
+ Date: Thu, 27 May 1999 23:31:38 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB29C6C03@mbtlipnt02.btlabs.bt.co.uk>
+
+ Had to be applied manually; some mailer had munged the patch slightly.
+ Branch: cfgperl
+ ! ext/NDBM_File/NDBM_File.xs
+____________________________________________________________________________
+[ 3491] By: jhi on 1999/05/28 07:51:17
+ Log: From: "Vishal Bhatia" <vishalb@my-deja.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_57] fixing eval in the compiler
+ Date: Thu, 27 May 1999 07:56:54 -0700
+ Message-ID: <JDIKFDKKLGHHBAAA@my-deja.com>
+ Branch: cfgperl
+ ! cc_runtime.h scope.h
+____________________________________________________________________________
+[ 3490] By: jhi on 1999/05/28 07:47:06
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: perlbug@perl.com
+ Cc: Jarkko Hietaniemi <jhi@iki.fi>
+ Subject: [PATCH] Configure updates for ISC 4.1
+ Date: Thu, 27 May 1999 15:19:21 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9905271513500.22115-100000@newton.phys>
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3489] By: jhi on 1999/05/28 07:39:17
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> malloc.c win32/makedef.pl win32/win32.c
+____________________________________________________________________________
+[ 3488] By: jhi on 1999/05/27 16:57:19
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH] Re: 5.005_57 NOT OK on SunOS 4.1.3
+ Date: Thu, 27 May 1999 12:26:28 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9905271120230.22115-100000@newton.phys>
+ Branch: cfgperl
+ ! Configure config_h.SH hints/sunos_4_1.sh util.c
+____________________________________________________________________________
+[ 3487] By: gsar on 1999/05/27 03:56:20
+ Log: make win32_spawnvp() inherit standard handles even when they
+ may be redirected
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3486] By: jhi on 1999/05/26 19:55:52
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: perl5-porters@perl.org
+ Subject: Re: BUG -> [19990526.004] perl5.005_57 error in util.c on sun4-solaris2.6
+ Date: Wed, 26 May 1999 14:49:52 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9905261448310.19172-100000@newton.phys>
+ Branch: cfgperl
+ ! util.c
+____________________________________________________________________________
+[ 3485] By: chip on 1999/05/26 17:19:11
+ Log: Look for Linux FILE structure in libio.h, for glibc-2.1.
Branch: maint-5.004/perl
! Configure
____________________________________________________________________________
-[ 668] By: TimBunce on 1998/03/03 09:55:51
- Log: Title: "Fix (mostly) pseudo-same-REs due to embedded NULs", #F035
- From: Martin Plechsmid <plechsmi@karlin.mff.cuni.cz>
- Msg-ID: <199802021217.NAA05230@albert.karlin.mff.cuni.cz>
- Files: pp_ctl.c
- Branch: maint-5.004/perl
+[ 3484] By: gsar on 1999/05/26 01:56:28
+ Log: fix missing exported symbol
+ Branch: perl
+ ! malloc.c win32/makedef.pl
+____________________________________________________________________________
+[ 3483] By: jhi on 1999/05/25 23:08:07
+ Log: Configure -Dopenbsd_distribution to build for the OpenBSD tree.
+
+ From: "Todd C. Miller" <Todd.Miller@courtesan.com>
+ To: perlbug@perl.com
+ Subject: OpenBSD hints file update
+ Date: Tue, 25 May 1999 12:12:38 -0600 (MDT)
+ Message-Id: <199905251812.MAA06032@xerxes.courtesan.com>
+ Branch: cfgperl
+ ! hints/openbsd.sh
+____________________________________________________________________________
+[ 3482] By: jhi on 1999/05/25 23:01:25
+ Log: From: Tom Hughes <tom@compton.nu>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_57] Make Configure recognise glibc 2.1 stdio
+ Date: Tue, 25 May 1999 23:10:23 +0100
+ Message-ID: <1ed7f10749.tom@compton.compton.nu>
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3481] By: jhi on 1999/05/25 22:31:50
+ Log: 3479, 3480, 3481 seems logical.
+ Branch: cfgperl
+ !> hints/aix.sh
+____________________________________________________________________________
+[ 3480] By: jhi on 1999/05/25 22:13:39
+ Log: The change #3479 wasn't perfect.
+ Branch: perl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 3479] By: jhi on 1999/05/25 21:59:21
+ Log: Cures for _57 in AIX 4.1.5.0.
+ (1) The lddlflags lost its -lc by change #3660
+ (and the politeness of change #3257).
+ (2) optype_size must end up in perl.exp (as PL_optype_size).
+ Added it to perlvars.h, fixed bytecode.pl,
+ regen'ed the relevant headers.
+ Branch: cfgperl
+ ! bytecode.h bytecode.pl byterun.h embed.h embedvar.h objXSUB.h
+ ! perlvars.h
+ Branch: perl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 3478] By: jhi on 1999/05/25 20:13:47
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> pod/perltootc.pod
+ !> (integrate 101 files)
+____________________________________________________________________________
+[ 3477] By: gsar on 1999/05/25 10:43:48
+ Log: here be 5.005_57
+ Branch: perl
+ ! Changes MANIFEST Porting/makerel
+ !> Changes5.005
+
+----------------
+Version 5.005_57
+----------------
+
+____________________________________________________________________________
+[ 3476] By: gsar on 1999/05/25 09:23:43
+ Log: up patchlevel &c
+ Branch: perl
+ ! Changes patchlevel.h pod/perlhist.pod win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 3475] By: gsar on 1999/05/25 09:14:51
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 25 May 1999 02:42:23 -0400 (EDT)
+ Message-Id: <199905250642.CAA06208@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_56] REx engine improvements
+ Branch: perl
+ ! embedvar.h mg.c objXSUB.h pp.c pp_ctl.c pp_hot.c regcomp.c
+ ! regexec.c regexp.h t/op/pat.t t/op/re_tests t/op/regexp.t
+ ! thrdvar.h util.c
+____________________________________________________________________________
+[ 3474] By: gsar on 1999/05/25 08:39:56
+ Log: test case for change#3470
+ Branch: perl
+ ! t/lib/bigintpm.t
+____________________________________________________________________________
+[ 3473] By: gsar on 1999/05/25 08:36:52
+ Log: perlport 1.43 update from Chris Nandor and Tom Christiansen
+ Branch: perl
+ ! Changes pod/perlport.pod
+____________________________________________________________________________
+[ 3472] By: gsar on 1999/05/25 08:28:57
+ Log: assorted tweaks
+ Branch: perl
+ ! doio.c iperlsys.h win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makedef.pl
+____________________________________________________________________________
+[ 3471] By: gsar on 1999/05/25 06:06:04
+ Log: perlref update from Tom Christiansen
+ Branch: perl
+ ! pod/perlref.pod
+____________________________________________________________________________
+[ 3470] By: gsar on 1999/05/25 06:03:27
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 24 May 1999 17:43:56 -0400
+ Message-ID: <19990524174356.A1944@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] hv.c calling negative malloc()
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 3469] By: gsar on 1999/05/25 05:59:22
+ Log: avoid temporary files that have a constant name (from a suggestion
+ by Anthony J. Lill <ajlill@ajlc.waterloo.on.ca>)
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 3468] By: gsar on 1999/05/25 05:54:29
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Mon, 24 May 99 11:20:25 PDT
+ Message-Id: <9905241820.AA28071@forte.com>
+ Subject: [PATCH: _56 and _03]EBCDIC %HTML_Escapes for Pod::Text, plus sync patch.
+ Branch: perl
+ ! lib/Pod/Text.pm
+____________________________________________________________________________
+[ 3467] By: gsar on 1999/05/25 04:08:50
+ Log: fix glob() bug that resulted in missing symlinks that don't point
+ anywhere
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 3466] By: gsar on 1999/05/25 03:00:00
+ Log: avoid enumerating @INC contents in diagnostic if @INC was never
+ searched
+ Branch: perl
+ ! pod/perldiag.pod pp_ctl.c
+____________________________________________________________________________
+[ 3465] By: gsar on 1999/05/25 02:24:08
+ Log: add caveat about close(PIPE) carelessness
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3464] By: gsar on 1999/05/24 23:55:53
+ Log: fix bogus line numbers for void context warnings
+ (change#2548 was overeager)
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 3463] By: gsar on 1999/05/24 23:31:58
+ Log: change#3455 had a typo
+ Branch: perl
! pp_ctl.c
____________________________________________________________________________
-[ 667] By: TimBunce on 1998/03/03 09:52:59
- Log: Title: "Make Getopt::Long avoid $&, $`, $'", #F034
- From: Irving Reid <irving@tor.securecomputing.com>
- Msg-ID: <98Feb3.005102est.11655@janus.tor.securecomputing.com>
- Files: lib/Getopt/Long.pm
- Branch: maint-5.004/perl
- ! lib/Getopt/Long.pm
+[ 3462] By: gsar on 1999/05/24 17:32:20
+ Log: more pod updates from Tom Christiansen; regen perltoc
+ Branch: perl
+ ! pod/perl.pod pod/perldelta.pod pod/perlmod.pod pod/perlobj.pod
+ ! pod/perlre.pod pod/perltoc.pod pod/perlvar.pod
____________________________________________________________________________
-[ 666] By: TimBunce on 1998/03/03 09:51:27
- Log: Title: "adding the newSVpvn API function", #F033
- From: Matthias Ulrich Neeracher <neeri@iis.ee.ethz.ch>
- Msg-ID: <199801310532.GAA23798@solar.ethz.ch>
- Files: pod/perlguts.pod pod/perltoc.pod proto.h global.sym sv.c
- Branch: maint-5.004/perl
- ! global.sym pod/perlguts.pod pod/perltoc.pod proto.h sv.c
+[ 3461] By: gsar on 1999/05/24 07:41:32
+ Log: perlmod notes from Damian Conway (via Tom Christiansen)
+ Branch: perl
+ ! pod/perlmod.pod
____________________________________________________________________________
-[ 665] By: TimBunce on 1998/03/03 09:43:30
- Log: Title: "Support C<Package::> as function-blind bearword", #F032
- From: Chip Salzenberg
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3460] By: gsar on 1999/05/24 07:24:11
+ Log: major pod update from Tom Christiansen
+ Branch: perl
+ + pod/perltootc.pod
+ ! MANIFEST lib/Pod/Functions.pm pod/Makefile pod/buildtoc
+ ! pod/perl.pod pod/perl5004delta.pod pod/perlcall.pod
+ ! pod/perldata.pod pod/perldebug.pod pod/perldelta.pod
+ ! pod/perldsc.pod pod/perlfunc.pod pod/perlipc.pod
+ ! pod/perllol.pod pod/perlmod.pod pod/perlmodinstall.pod
+ ! pod/perlmodlib.pod pod/perlobj.pod pod/perlop.pod
+ ! pod/perlopentut.pod pod/perlpod.pod pod/perlport.pod
+ ! pod/perlre.pod pod/perlref.pod pod/perlrun.pod pod/perlsec.pod
+ ! pod/perlsub.pod pod/perlsyn.pod pod/perlthrtut.pod
+ ! pod/perltie.pod pod/perltrap.pod pod/perlvar.pod
+ ! pod/perlxs.pod pod/pod2man.PL
____________________________________________________________________________
-[ 664] By: TimBunce on 1998/03/03 09:41:40
- Log: Title: "Re-optimize character classes", #F031
- From: Chip Salzenberg
- Files: regcomp.h regcomp.c regexec.c
- Branch: maint-5.004/perl
- ! regcomp.c regcomp.h regexec.c
+[ 3459] By: gsar on 1999/05/24 06:26:48
+ Log: perlfaq update from Tom Christiansen
+ Branch: perl
+ ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod
____________________________________________________________________________
-[ 663] By: TimBunce on 1998/03/03 09:39:55
- Log: Title: "Fix C<if (1) { local $x }> which needed ENTER/LEAVE", #F030
- From: dfh@dwroll.lucent.com (D461-David_F_Haertig(Dave)83040)
- Msg-ID: <EnKC0q.6qI@drnews.dr.lucent.com>
- Files: op.c t/op/local.t
- Branch: maint-5.004/perl
- ! op.c t/op/local.t
+[ 3458] By: gsar on 1999/05/24 05:55:11
+ Log: updated to v1.50 from CPAN
+ Branch: perl
+ ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
____________________________________________________________________________
-[ 662] By: TimBunce on 1998/03/03 09:37:51
- Log: Title: "Dramatically improve performance of // with parens or $&", #F029
- From: Chip Salzenberg
- Files: cop.h perl.h proto.h regexp.h gv.c interp.sym perl.c pp.c pp_ctl.c
- pp_hot.c regexec.c scope.c
- Branch: maint-5.004/perl
- ! cop.h gv.c interp.sym perl.c perl.h pp.c pp_ctl.c pp_hot.c
- ! proto.h regexec.c regexp.h scope.c
+[ 3457] By: gsar on 1999/05/24 05:46:20
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Sun, 23 May 1999 16:35:07 +0100
+ Message-Id: <199905231535.QAA00032@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_56] name PL_in_eval bits
+ Branch: perl
+ ! cop.h op.c perl.c pp_ctl.c toke.c util.c
____________________________________________________________________________
-[ 661] By: TimBunce on 1998/03/03 09:27:04
- Log: Title: "Don't warn on $x{shift}, ne => 1, or -f => 1", #F028
- From: Chip Salzenberg
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3456] By: gsar on 1999/05/24 05:18:06
+ Log: make -t mode the default on emacs/dumb terminals
+ Branch: perl
+ ! Changes utils/perldoc.PL
____________________________________________________________________________
-[ 660] By: TimBunce on 1998/03/03 09:24:41
- Log: Title: "Protect against weirdness with unreal @_ in C<local @_>", #F027
- From: Chip Salzenberg
- Files: scope.c
- Branch: maint-5.004/perl
- ! scope.c
+[ 3455] By: gsar on 1999/05/24 05:05:19
+ Log: return 0 rather than "" when scalar grep has nothing to iterate
+ on (brings behavior in line with documentation)
+ Branch: perl
+ ! pp_ctl.c
____________________________________________________________________________
-[ 659] By: TimBunce on 1998/03/03 09:24:00
- Log: Title: "Fix C<printf "%.0d", 0>", #F026
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199711021331.NAA01826@crypt.compulink.co.uk>
- Files: sv.c t/op/sprintf.t
- Branch: maint-5.004/perl
- ! sv.c t/op/sprintf.t
+[ 3454] By: gsar on 1999/05/24 04:52:52
+ Log: From: Tim Jenness <t.jenness@jach.hawaii.edu>
+ Date: Thu, 20 May 1999 13:27:02 -1000
+ Message-Id: <E10kcDN-0007TA-00@lapaki>
+ Subject: Problem with MM_Unix in 5.005_03
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
____________________________________________________________________________
-[ 658] By: TimBunce on 1998/03/03 09:22:13
- Log: Title: "Tiny core patch for source filters", #F025
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- Msg-ID: <9711202312.AA02937@claudius.bfsec.bt.co.uk>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3453] By: gsar on 1999/05/24 04:39:49
+ Log: avoid removing duplicates in user-generated warnings
+ From: byron@omix.com (Byron Brummer)
+ Date: Thu, 20 May 1999 04:01:17 -0700 (PDT)
+ Message-Id: <199905201101.EAA91175@thrush.omix.com>
+ Subject: [PATCH] Re: warn buffers/loses output in ?? - 5.005_03
+ Branch: perl
+ ! lib/diagnostics.pm
____________________________________________________________________________
-[ 657] By: TimBunce on 1998/03/03 09:20:00
- Log: Title: "Here-doc in s///e (was: Bug)", #F024
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199711221445.OAA14153@crypt.compulink.co.uk>
- Files: t/base/lex.t toke.c
- Branch: maint-5.004/perl
- ! t/base/lex.t toke.c
+[ 3452] By: gsar on 1999/05/24 04:23:10
+ Log: straighten some code to avoid NeXT compiler bugs (from
+ Geoff Kuenning <geoff@cs.hmc.edu>)
+ Branch: perl
+ ! pp_ctl.c
____________________________________________________________________________
-[ 656] By: TimBunce on 1998/03/03 09:17:56
- Log: Title: "Fix duplicate warnings on C<-e undef>", #F023
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199711221252.MAA14000@crypt.compulink.co.uk>
- Files: doio.c t/pragma/warn-1global
- Branch: maint-5.004/perl
- ! doio.c t/pragma/warn-1global
+[ 3451] By: gsar on 1999/05/24 03:03:05
+ Log: minor logic tweak for reserved word warning
+ Branch: perl
+ ! lib/Test/Harness.pm toke.c
____________________________________________________________________________
-[ 655] By: TimBunce on 1998/03/03 09:16:56
- Log: Title: "Fix '*' prototype", #F022
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199711212225.RAA00755@monk.mps.ohio-state.edu>
- Files: toke.c
- Branch: maint-5.004/perl
- ! toke.c
+[ 3450] By: gsar on 1999/05/24 02:34:20
+ Log: oops, some files missing in change#3449
+ Branch: perl
+ ! op.c op.h toke.c
____________________________________________________________________________
-[ 654] By: TimBunce on 1998/03/03 09:15:04
- Log: Title: "File::Find bugs (and patches)", "File::Find bugs & patches", #F021
- From: "Conrad E. Kimball" <cek@tblv021.ca.boeing.com>
- Msg-ID: <199711260703.XAA21257@mailgate2.boeing.com>
- Files: lib/File/Find.pm
- Branch: maint-5.004/perl
- ! lib/File/Find.pm
+[ 3449] By: gsar on 1999/05/24 02:33:12
+ Log: allow '*' prototype to autoquote even barewords that happen to be
+ function names; parens or ampersand continue to force the other
+ interpretation; makes C<sub Foo {'bar'} CORE::GLOBAL::require Foo;>
+ do the right thing, for example
+ Branch: perl
+ ! t/comp/proto.t
____________________________________________________________________________
-[ 653] By: TimBunce on 1998/03/03 09:11:55
- Log: Title: "Fix typo: FORM{,AT}LINE", #F020
- From: Chip Salzenberg
- Files: sv.c
- Branch: maint-5.004/perl
- ! sv.c
+[ 3448] By: gsar on 1999/05/24 01:51:24
+ Log: remove vestiges of PL_last_proto
+ Branch: perl
+ ! embedvar.h intrpvar.h objXSUB.h
____________________________________________________________________________
-[ 652] By: TimBunce on 1998/03/03 09:07:50
- Log: Title: "Fix use of unref mem when blessed object goes out of scope", #F019
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199711282326.SAA15090@aatma.engin.umich.edu>
- Files: scope.c
- Branch: maint-5.004/perl
- ! scope.c
+[ 3447] By: gsar on 1999/05/24 01:49:20
+ Log: redo change#2061 and parts of change#1169 with code in the
+ parser; PL_last_proto hackery gone, strict 'subs' in now
+ implemented in the optimizer where specifying the exceptional
+ cases is much more robust; '*' (bareword) prototype now works
+ reliably when used in second and subsequent arguments
+ Branch: perl
+ ! dump.c embed.h embed.pl objXSUB.h op.c op.h proto.h toke.c
____________________________________________________________________________
-[ 651] By: TimBunce on 1998/03/03 09:07:10
- Log: Title: "Fix C<my ($a, undef, $b) = @x>", #F018
- From: Stephane Payrard <stef@francenet.fr>
- Msg-ID: <199712040054.BAA04612@www.zweig.com>
- Files: op.c t/op/my.t
- Branch: maint-5.004/perl
- ! op.c t/op/my.t
+[ 3446] By: gsar on 1999/05/23 05:00:55
+ Log: remove redundant part of change#1169 superceded by change#2061;
+ avoid "future reserved word" warning on prototypical bearwords
+ Branch: perl
+ ! t/lib/fatal.t toke.c
____________________________________________________________________________
-[ 650] By: TimBunce on 1998/03/03 09:04:04
- Log: Title: "enhanced "use strict" warning", #F017
- From: Tkil <tkil@reptile.scrye.com>
- Msg-ID: <199712040938.CAA07628@reptile.scrye.com>
- Files: gv.c t/pragma/strict-subs t/pragma/strict-vars
- Branch: maint-5.004/perl
- ! gv.c t/pragma/strict-subs t/pragma/strict-vars
+[ 3445] By: gsar on 1999/05/21 23:36:49
+ Log: s/isspace/isSPACE/g and make sure the CRT version is always
+ passed an unsigned char (fixes random occurrence of spaces in
+ arguments containing high-bit chars passed to spawned children,
+ on win32)
+ Branch: perl
+ ! ext/SDBM_File/sdbm/dbe.c win32/perlhost.h win32/win32.c
____________________________________________________________________________
-[ 649] By: TimBunce on 1998/03/03 09:02:55
- Log: Title: "eval of sub gives spurious "uninitialised" warning", #F016
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199712061025.FAA14396@aatma.engin.umich.edu>
- Files: pod/perldelta.pod pod/perlfunc.pod op.c t/op/eval.t
- Branch: maint-5.004/perl
- ! op.c pod/perldelta.pod pod/perlfunc.pod t/op/eval.t
+[ 3444] By: gsar on 1999/05/21 23:08:55
+ Log: integrate Configure changes from cfgperl
+ Branch: perl
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH
____________________________________________________________________________
-[ 648] By: TimBunce on 1998/03/03 08:58:00
- Log: Title: "[PERL] Assigning result of pop scrambles unrelated reference", #F015
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199712061100.GAA14864@aatma.engin.umich.edu>
- Files: sv.c
- Branch: maint-5.004/perl
- ! sv.c
+[ 3443] By: jhi on 1999/05/21 22:00:56
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes doop.c ext/SDBM_File/sdbm/dba.c
+ !> ext/SDBM_File/sdbm/dbd.c ext/SDBM_File/sdbm/dbe.c os2/os2.c
+ !> perl.h pod/perldiag.pod pod/perlport.pod pp.c t/comp/proto.t
+ !> win32/perlhost.h win32/win32.c x2p/walk.c
____________________________________________________________________________
-[ 647] By: TimBunce on 1998/03/03 08:53:35
- Log: Title: "[PERL] Filedescriptor leak in 5.004_55 (and earlier)", #F014
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Msg-ID: <199712151922.OAA06410@monk.mps.ohio-state.edu>
- Files: os2/os2.c util.c
- Branch: maint-5.004/perl
- ! os2/os2.c util.c
+[ 3442] By: jhi on 1999/05/21 21:59:46
+ Log: fflush.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
____________________________________________________________________________
-[ 646] By: TimBunce on 1998/03/03 08:51:04
- Log: Title: "Fix fdopen() on STD{IN,OUT,ERR}", #F013
- From: Roderick Schertler <roderick@argon.org>
- Msg-ID: <pzg1npp6e3.fsf@eeyore.ibcinc.com>
- Files: doio.c t/op/misc.t
- Branch: maint-5.004/perl
- ! doio.c t/op/misc.t
+[ 3441] By: gsar on 1999/05/21 17:48:55
+ Log: integrate cfgperl changes
+ Branch: perl
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH hints/sunos_4_1.sh installperl
____________________________________________________________________________
-[ 645] By: TimBunce on 1998/03/03 08:49:34
- Log: Title: "Fix local $a[0] and local $h{a}", #F012
- From: Stephen McCamant <alias@mcs.com>
- Msg-ID: <m0xjWFq-000EZeC@alias-2.pr.mcs.net>
- Files: embed.h scope.h global.sym pp.c pp_hot.c scope.c t/op/local.t
- Branch: maint-5.004/perl
- ! embed.h global.sym pp.c pp_hot.c scope.c scope.h t/op/local.t
+[ 3440] By: gsar on 1999/05/21 17:42:49
+ Log: test tweak
+ Branch: perl
+ ! t/comp/proto.t
____________________________________________________________________________
-[ 644] By: TimBunce on 1998/03/03 08:43:06
- Log: Title: "Eliminate redundant mg_get() in SvTRUE()", #F011
- From: Spider Boardman <spider@orb.nashua.nh.us>
- Msg-ID: <199712251839.NAA14800@Orb.Nashua.NH.US>
- Files: sv.c
- Branch: maint-5.004/perl
- ! sv.c
+[ 3439] By: gsar on 1999/05/21 17:31:26
+ Log: fix breakage when neither FFLUSH_ALL nor FFLUSH_NULL are #defined.
+ (Configure fflush(NULL) detection seems broken on Solaris, which
+ is why I hit the problem)
+ Branch: perl
+ ! Changes perl.h
____________________________________________________________________________
-[ 643] By: TimBunce on 1998/03/03 08:41:07
- Log: Title: "Don't force scalar context on C<my @x> or C<my %x>", #F010
- From: Chip Salzenberg
- Files: op.c t/op/my.t
- Branch: maint-5.004/perl
- ! op.c t/op/my.t
+[ 3438] By: gsar on 1999/05/20 16:41:01
+ Log: perlport 1.41 update from Chris Nandor <pudge@pobox.com>
+ Branch: perl
+ ! pod/perlport.pod
____________________________________________________________________________
-[ 642] By: TimBunce on 1998/03/03 08:39:11
- Log: Title: "Fix assignment to $_[0] in DESTROY", #F009
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199801010030.TAA14274@aatma.engin.umich.edu>
- Files: pod/perlobj.pod sv.c t/op/ref.t
- Branch: maint-5.004/perl
- ! pod/perlobj.pod sv.c t/op/ref.t
-____________________________________________________________________________
-[ 641] By: gsar on 1998/03/03 04:39:49
- Log: merge problematic maintpatch to op.c
- #77: "Eliminate double warnings under C<package;>"
- From: Chip Salzenberg
- Files: gv.c op.c toke.c
- Branch: win32/perl
- ! gv.c op.c toke.c
-____________________________________________________________________________
-[ 640] By: gsar on 1998/03/03 04:30:22
- Log: merge another conflicting maintpatch to op.c
- #17: "Enhanced "use strict" warning"
- From: Tkil <tkil@reptile.scrye.com>
- Msg-ID: <199712040938.CAA07628@reptile.scrye.com>
- Date: Thu, 4 Dec 1997 02:38:26 -0700
- Files: gv.c t/pragma/strict-subs t/pragma/strict-vars
- Branch: win32/perl
- ! gv.c t/pragma/strict-subs t/pragma/strict-vars
-____________________________________________________________________________
-[ 639] By: gsar on 1998/03/03 04:09:11
- Log: maintpatch
- #73: "Fix order of warnings for misplaced subscripts"
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Msg-ID: <199710131023.LAA16796@crypt.compulink.co.uk>
- Date: Mon, 13 Oct 1997 11:23:56 +0100
- Files: op.c
- Branch: win32/perl
+[ 3437] By: jhi on 1999/05/20 07:14:39
+ Log: Patches to fflushing in SunOS 4 from Andy Dougherty
+ (via private email).
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH hints/sunos_4_1.sh
+____________________________________________________________________________
+[ 3436] By: gsar on 1999/05/20 05:18:26
+ Log: various little nits
+ Branch: perl
+ ! doop.c ext/SDBM_File/sdbm/dba.c ext/SDBM_File/sdbm/dbd.c
+ ! ext/SDBM_File/sdbm/dbe.c os2/os2.c pod/perldiag.pod pp.c
+ ! win32/perlhost.h win32/win32.c x2p/walk.c
+____________________________________________________________________________
+[ 3435] By: jhi on 1999/05/18 16:25:49
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ To: perl5-porters@perl.org
+ Subject: installperl
+ Date: Fri, 14 May 1999 21:34:58 +0100
+ Message-Id: <199905142034.VAA00865@crypt.compulink.co.uk>
+ Branch: cfgperl
+ ! installperl
+____________________________________________________________________________
+[ 3434] By: jhi on 1999/05/17 21:25:54
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> lib/ExtUtils/MM_Cygwin.pm
+ - cygwin32/impure_ptr.c
+ !> MANIFEST README.cygwin32 XSUB.h cygwin32/Makefile.SHs
+ !> cygwin32/perlld.in dosish.h ext/DynaLoader/dl_cygwin32.xs
+ !> ext/POSIX/POSIX.xs gv.c hints/cygwin32.sh installman
+ !> installperl perl.h pod/perldiag.pod pp.c pp_hot.c util.c
+ !> x2p/find2perl.PL
+____________________________________________________________________________
+[ 3433] By: gsar on 1999/05/17 09:49:01
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure INSTALL config_h.SH configure.com embed.h
+ !> ext/Devel/Peek/Peek.xs ext/Socket/Socket.xs global.sym
+ !> hints/dec_osf.sh objXSUB.h perl.h pod/perldiag.pod proto.h
+ !> util.c
+____________________________________________________________________________
+[ 3432] By: gsar on 1999/05/17 09:06:45
+ Log: emit more appropriate diagnostic for failed glob (variant
+ of patch suggested by Graham Barr)
+ Branch: perl
+ ! gv.c pod/perldiag.pod pp.c pp_hot.c
+____________________________________________________________________________
+[ 3431] By: gsar on 1999/05/17 08:38:09
+ Log: From: "Todd C. Miller" <Todd.Miller@courtesan.com>
+ Date: Thu, 13 May 1999 22:18:43 -0600 (MDT)
+ Message-Id: <199905140418.WAA18826@xerxes.courtesan.com>
+ Subject: find2perl does not grok the 'c' suffix to the -size argument
+ Branch: perl
+ ! x2p/find2perl.PL
+____________________________________________________________________________
+[ 3430] By: gsar on 1999/05/17 08:26:21
+ Log: additional cleanups for cygwin32 port
+ From: "Fifer, Eric" <EFifer@sanwaint.com>
+ Date: Wed, 12 May 1999 20:25:54 +0100
+ Message-ID: <71E287AB0D94D111BBD600600849EC8185EDAF@POST>
+ Subject: [PATCH]perl5.005_03 (CORE) cygwin32 port
+ Branch: perl
+ + lib/ExtUtils/MM_Cygwin.pm
+ - cygwin32/impure_ptr.c
+ ! MANIFEST README.cygwin32 XSUB.h cygwin32/Makefile.SHs
+ ! cygwin32/perlld.in dosish.h ext/DynaLoader/dl_cygwin32.xs
+ ! ext/POSIX/POSIX.xs hints/cygwin32.sh installman installperl
+ ! perl.h util.c
+____________________________________________________________________________
+[ 3429] By: gsar on 1999/05/17 08:01:04
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Wed, 12 May 1999 11:44:11 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9905121136520.25150-100000@newton.phys>
+ Subject: [PATCH] (Was Re: SunOS4.1 compilation error)
+ Branch: perl
+ ! INSTALL
+____________________________________________________________________________
+[ 3428] By: jhi on 1999/05/17 07:03:26
+ Log: Integrate from mainperl modulo the Socket.xs change.
+ Branch: cfgperl
+ !> ext/Socket/Socket.xs op.c win32/include/sys/socket.h
+ !> win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 3427] By: jhi on 1999/05/16 22:09:11
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_56] Devel::Peek::mstat not working
+ Date: Sun, 16 May 1999 01:28:18 -0400 (EDT)
+ Message-Id: <199905160528.BAA23376@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! ext/Devel/Peek/Peek.xs
+____________________________________________________________________________
+[ 3426] By: jhi on 1999/05/16 22:07:11
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.com
+ Subject: DOC PATCH (5.005_55): Error message missing from perldiag.pod
+ Date: Sat, 15 May 1999 12:43:47 -0400
+ Message-ID: <19990515164348.7313.qmail@plover.com>
+ Branch: cfgperl
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 3425] By: nick on 1999/05/15 15:56:10
+ Log: Mingw32 + w32api-0.1.5 tweaks
+ - now more like other Win32 compilers
+ Branch: perl
+ ! ext/Socket/Socket.xs win32/include/sys/socket.h win32/win32.c
+ ! win32/win32.h
+____________________________________________________________________________
+[ 3424] By: nick on 1999/05/14 21:04:22
+ Log: Experimental "slab" allocator for ops.
+ To try it -DPL_OP_SLAB_ALLOC for op.c
+ This is for proof of concept only, it leaks memory
+ (ops are not free'd) so don't use in embedded apps.
+ If this minimalist version does not show performance
+ gain then whole idea is worthless.
+ Nick see's approx 12% speed up vs perlmalloc running
+ perl -Ilib -MCPAN -e ''
+ Solaris2.6, gcc-2.8.1 but numbers are not repeatable.
+ Branch: perl
! op.c
____________________________________________________________________________
-[ 638] By: gsar on 1998/03/03 04:02:16
- Log: manually apply another conflicting maintpatch
- #64: "Fix extension version mismatch message"
- From: Chip Salzenberg
- Files: XSUB.h
- Branch: win32/perl
- ! XSUB.h
+[ 3423] By: gsar on 1999/05/14 19:55:04
+ Log: on win32, look for "site/5.XXX/lib" if "site/5.XXXYY/lib" isn't
+ found (brings sitelib intuition in line with privlib)
+ Branch: perl
+ ! win32/win32.c
____________________________________________________________________________
-[ 637] By: gsar on 1998/03/03 03:57:08
- Log: maintpatch
- #62: "Fix doc bug in getservbyname() examples"
- From: Tom Christiansen
- Files: ext/Socket/Socket.pm
- Branch: win32/perl
- ! ext/Socket/Socket.pm
-____________________________________________________________________________
-[ 636] By: gsar on 1998/03/03 03:55:13
- Log: maintpatch
- #60: "Socket occasional SEGV"
- From: Trevor Blackwell <tlb@viaweb.com>
- Msg-ID: <199710281804.NAA09632@wagg.viaweb.com>
- Date: Tue, 28 Oct 1997 13:04:43 -0500 (EST)
- Files: ext/Socket/Socket.xs
- Branch: win32/perl
- ! ext/Socket/Socket.xs
-____________________________________________________________________________
-[ 635] By: gsar on 1998/03/03 03:51:01
- Log: maintpatches for docs
- #53: "Perlop bitwise & | ^ documentation"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.971106073858.29771O-100000@usertest.teleport.c
- Date: Thu, 6 Nov 1997 07:44:52 -0800 (PST)
- Files: pod/perlfunc.pod
- --------
- #54: "Update docs on tr///"
- From: Tom Phoenix <rootbeer@teleport.com>
- Msg-ID: <Pine.GSO.3.96.971103071602.10568C-100000@usertest.teleport.c
- Date: Mon, 3 Nov 1997 07:28:39 -0800 (PST)
- Files: pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
- pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
- pod/perlstyle.pod toke.c
- Branch: win32/perl
- ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
- ! pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
- ! pod/perlstyle.pod toke.c
+[ 3422] By: jhi on 1999/05/14 08:08:01
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH: 5.005_56] add config.msg to VMS configure.com
+ Date: Thu, 13 May 99 15:29:57 PDT
+ Message-Id: <9905132229.AA15854@forte.com>
+ Branch: cfgperl
+ ! configure.com
____________________________________________________________________________
-[ 634] By: gsar on 1998/03/03 03:43:42
- Log: another maintpatch (this one needed adjust of test nos.)
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Message-Id: <199801221211.MAA05315@crypt.compulink.co.uk>
- Date: Thu, 22 Jan 1998 12:11:49 +0000
- Subject: Re: [PERL] A few perl5.004_03 bugs
- Branch: win32/perl
- ! mg.c t/op/magic.t
-____________________________________________________________________________
-[ 633] By: gsar on 1998/03/03 03:36:40
- Log: merge another toke.c patch and its dependent (very carefully)
- #32: "Support C<Package::> as function-blind bearword"
- From: Chip Salzenberg
- Files: toke.c
- --------
- #86: "Make warning on C<Nosuch::> optional, add to perl{diag,delta}.pod"
- From: Gurusamy Sarathy
- Files: toke.c pod/perldelta.pod pod/perldiag.pod
- Branch: win32/perl
- ! pod/perldelta.pod pod/perldiag.pod toke.c
-____________________________________________________________________________
-[ 632] By: gsar on 1998/03/03 03:12:16
- Log: another toke.c maintpatch
- #28: "Don't warn on $x{shift}, ne => 1, or -f => 1"
- From: Chip Salzenberg
- Files: toke.c
- Branch: win32/perl
- ! toke.c
+[ 3421] By: jhi on 1999/05/14 07:34:20
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> lib/ExtUtils/MM_Unix.pm win32/win32.c
____________________________________________________________________________
-[ 631] By: gsar on 1998/03/03 03:06:59
- Log: still another maintpatch
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Message-Id: <199711021331.NAA01826@crypt.compulink.co.uk>
- Date: Sun, 02 Nov 1997 13:31:54 +0000
- Subject: [PATCH] assorted sprintf bugs
- Branch: win32/perl
- ! sv.c t/op/sprintf.t
-____________________________________________________________________________
-[ 630] By: gsar on 1998/03/03 03:03:55
- Log: yet another maintpatch
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Message-Id: <199711221252.MAA14000@crypt.compulink.co.uk>
- Date: Sat, 22 Nov 1997 12:52:16 +0000
- Subject: Re: [PERL] Unexpected output
- Branch: win32/perl
- ! doio.c t/pragma/warn-1global
-____________________________________________________________________________
-[ 629] By: gsar on 1998/03/03 02:57:33
- Log: merge another maintpatch to toke.c
+[ 3420] By: jhi on 1999/05/14 07:33:26
+ Log: Still fflushing.
+ Branch: cfgperl
+ ! Configure config_h.SH util.c
+____________________________________________________________________________
+[ 3419] By: gsar on 1999/05/14 03:08:29
+ Log: mortalize string allocations by win32_get_{priv,site}lib()
+ (fixes small memory leak in interpreter)
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3418] By: gsar on 1999/05/14 03:06:50
+ Log: make win32_longname() preserve kind of slashes in argument
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3417] By: gsar on 1999/05/14 03:04:44
+ Log: canonicalize path for $(FULLPERL) and $(PERL) in MakeMaker
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 3416] By: jhi on 1999/05/13 21:18:06
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> pp_ctl.c
+____________________________________________________________________________
+[ 3415] By: jhi on 1999/05/13 21:16:49
+ Log: Fixes from Andy Dougherty (via private email).
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3414] By: nick on 1999/05/13 20:04:26
+ Log: valist vs va_list typo
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 3413] By: jhi on 1999/05/13 15:04:05
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: perlbug@perl.com
+ Subject: [PATCH] (Was Re: SunOS4.1 compilation error)
+ Date: Wed, 12 May 1999 11:44:11 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9905121136520.25150-100000@newton.phys>
+ Branch: cfgperl
+ ! INSTALL
+____________________________________________________________________________
+[ 3412] By: jhi on 1999/05/13 14:20:17
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> pp_ctl.c
+____________________________________________________________________________
+[ 3411] By: gsar on 1999/05/13 14:16:56
+ Log: docatch_body() declaration mismatch
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 3410] By: jhi on 1999/05/13 13:51:44
+ Log: Add HAS_MEMCHR and make memchr into a cpp macro if it already isn't.
+ Branch: cfgperl
+ ! Configure config_h.SH perl.h
+____________________________________________________________________________
+[ 3409] By: jhi on 1999/05/13 13:31:53
+ Log: Still fflushing strong.
+ Branch: cfgperl
+ ! Configure config_h.SH embed.h global.sym objXSUB.h perl.h
+ ! proto.h util.c
+____________________________________________________________________________
+[ 3408] By: jhi on 1999/05/12 14:30:23
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 30 files)
+____________________________________________________________________________
+[ 3407] By: jhi on 1999/05/12 12:28:31
+ Log: Be tidier with fflush(NULL) testing.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3406] By: gsar on 1999/05/12 11:26:03
+ Log: better range-checking on list slices, with test
From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Date: Sat, 22 Nov 1997 14:45:23 GMT
- Message-Id: <199711221445.OAA14153@crypt.compulink.co.uk>
- Subject: Re: [PERL] Here-doc in s///e (was: Bug)
- Branch: win32/perl
- ! t/base/lex.t toke.c
+ Date: Sun, 02 May 1999 17:02:53 +0100
+ Message-Id: <199905021602.RAA13905@crypt.compulink.co.uk>
+ Subject: Re: List slice of undefs returns 0 items
+ Branch: perl
+ ! pp.c t/op/list.t
____________________________________________________________________________
-[ 628] By: gsar on 1998/03/03 02:50:20
- Log: manually merge a maintpatch
- Date: Thu, 8 Jan 1998 14:38:04 -0700 (MST)
- Message-Id: <199801082138.OAA14186@prometheus.frii.com>
- From: gnat@frii.com
- Subject: [PERL] Commenting toke.c
- Branch: win32/perl
- ! toke.c
+[ 3405] By: gsar on 1999/05/12 11:22:27
+ Log: change#3397 needs test tweak
+ Branch: perl
+ ! Changes t/pragma/warn/sv
____________________________________________________________________________
-[ 627] By: TimBunce on 1998/03/02 22:34:47
- Log: Title: "Fix inefficient checks for TIEHANDLE", #F008
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Msg-ID: <199801080106.UAA05048@aatma.engin.umich.edu>
- Files: pp_hot.c pp_sys.c
- Branch: maint-5.004/perl
- ! pp_hot.c pp_sys.c
-____________________________________________________________________________
-[ 626] By: TimBunce on 1998/03/02 22:31:13
- Log: This is the change description for change 625
- Title: "Fix tr///s option", #F007
- From: Inaba Hiroto <inaba@st.rim.or.jp>
- Msg-ID: <19980110155333D.inaba@st.rim.or.jp>
- Files: doop.c
- Branch: maint-5.004/perl
+[ 3404] By: gsar on 1999/05/12 11:07:44
+ Log: typo in change#3397
+ Branch: perl
! doop.c
____________________________________________________________________________
-[ 625] By: TimBunce on 1998/03/02 22:23:48
- Log: Branch: maint-5.004/perl
+[ 3403] By: gsar on 1999/05/12 10:49:01
+ Log: From: Stephen Zander <gibreel@pobox.com>
+ Date: 12 May 1999 01:22:31 -0700
+ Message-ID: <87u2tik88o.fsf@pooh.fire-swamp.net>
+ Subject: Re: Test::Harness runs tainted tests with wrong library path
+ Branch: perl
+ ! lib/Test/Harness.pm
+____________________________________________________________________________
+[ 3402] By: gsar on 1999/05/12 10:42:06
+ Log: typo in change#3400
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 3401] By: jhi on 1999/05/12 10:40:42
+ Log: A better, shinier, and possibly even correctly working
+ reincarnation of #3398.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3400] By: gsar on 1999/05/12 10:40:11
+ Log: deparse \&func() as \(&func()) for clarity
+ From: Albert Dvornik <bert@genscan.com>
+ Date: 11 May 1999 13:32:04 -0400
+ Message-ID: <tqk8ufwm0b.fsf@puma.genscan.com>
+ Subject: [PATCH 5.005_56] Deparse and \&func() (was Re: File::Find...)
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 3399] By: gsar on 1999/05/12 10:36:02
+ Log: more testsuite smarts (many of them courtesy Ilya)
+ Branch: perl
+ ! lib/Test/Harness.pm t/comp/cpp.t t/io/pipe.t t/lib/db-btree.t
+ ! t/lib/db-hash.t t/lib/db-recno.t t/lib/gdbm.t
+ ! t/lib/io_multihomed.t t/lib/io_pipe.t t/lib/io_sock.t
+ ! t/lib/io_udp.t t/lib/io_unix.t t/lib/ipc_sysv.t t/lib/ndbm.t
+ ! t/lib/odbm.t t/lib/thread.t t/op/exec.t t/op/fork.t
+ ! t/op/grent.t t/op/groups.t t/op/nothread.t t/op/numconvert.t
+ ! t/op/pwent.t
+____________________________________________________________________________
+[ 3398] By: jhi on 1999/05/12 09:33:08
+ Log: Detect whether fflush(NULL) works as per change #3352.
+ Branch: cfgperl
+ ! Configure config_h.SH perl.h
+____________________________________________________________________________
+[ 3397] By: gsar on 1999/05/12 08:56:03
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 12 May 1999 01:01:00 +0200
+ Message-ID: <3741b5e8.20386944@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03] chop/chomp modify readonly values
+ Branch: perl
! doop.c
____________________________________________________________________________
-[ 623] By: TimBunce on 1998/03/02 21:51:53
- Log: Title: "Fix lexical lookup in eval-sub-eval", #F006
- From: Chip Salzenberg
- Files: pp_ctl.c
- Branch: maint-5.004/perl
- ! pp_ctl.c
+[ 3396] By: gsar on 1999/05/12 08:23:27
+ Log: opendir(D,"x:") on win32 opens cwd() for drive rather than root;
+ stat() behaves similarly
+ Branch: perl
+ ! win32/win32.c
____________________________________________________________________________
-[ 622] By: TimBunce on 1998/03/02 21:43:29
- Log: Title: "Don't upgrade target of assignment from LVALUE", #F005
- From: Chip Salzenberg
- Files: sv.c
- Branch: maint-5.004/perl
- ! sv.c
+[ 3395] By: jhi on 1999/05/11 22:21:32
+ Log: Redo parts of #3341 and #3358 that #3394 undid.
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 621] By: TimBunce on 1998/03/02 21:29:59
- Log: Title: "Fix compile-time warning line in while ()", #F004
- From: Chip Salzenberg
- Files: op.c
- Branch: maint-5.004/perl
- ! op.c
+[ 3394] By: jhi on 1999/05/11 22:03:48
+ Log: Add I_NETINET_TCP to help change #3391.
+ Branch: cfgperl
+ ! Configure config_h.SH ext/Socket/Socket.xs
____________________________________________________________________________
-[ 620] By: TimBunce on 1998/03/02 21:25:27
- Log: Title: "STMT foreach LIST;", #F002
- From: Chip Salzenberg
- Files: pod/perlsyn.pod perly.c perly.c.diff perly.y t/cmd/mod.t toke.c
- vms/perly_c.vms
- Branch: maint-5.004/perl
- ! perly.c perly.c.diff perly.y pod/perlsyn.pod t/cmd/mod.t
- ! toke.c vms/perly_c.vms
+[ 3393] By: jhi on 1999/05/11 21:44:59
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 55 files)
____________________________________________________________________________
-[ 619] By: TimBunce on 1998/03/02 21:12:58
- Log: Title: "Fix SIGSEGV on C<42 until forever>", #F001
- From: Chip Salzenberg
- Files: op.c
- Branch: maint-5.004/perl
- ! op.c
+[ 3392] By: gsar on 1999/05/11 20:56:43
+ Log: update embedvar.h
+ Branch: perl
+ ! embedvar.h ext/ByteLoader/ByteLoader.pm pod/perldelta.pod
____________________________________________________________________________
-[ 618] By: gsar on 1998/03/02 04:40:16
- Log: make t/lib/nothread.t type xtext also
- Branch: win32/perl
- ! t/op/nothread.t
-____________________________________________________________________________
-[ 617] By: gsar on 1998/03/02 04:35:15
- Log: make t/lib/thread.t type xtext
- Branch: win32/perl
- ! t/lib/thread.t
-____________________________________________________________________________
-[ 616] By: gsar on 1998/03/02 04:17:40
- Log: fix misapplied hunks in change#614
- Branch: win32/perl
- ! scope.c scope.h
-____________________________________________________________________________
-[ 615] By: gsar on 1998/03/02 03:39:16
- Log: another one down
- From: "Conrad E. Kimball" <cek@tblv021.ca.boeing.com>
- Message-Id: <199711260703.XAA21257@mailgate2.boeing.com>
- Date: Tue, 25 Nov 1997 23:03:48 -0800
- Subject: [PERL] File::Find bugs & patches
- Branch: win32/perl
- ! lib/File/Find.pm
+[ 3391] By: gsar on 1999/05/11 16:32:05
+ Log: From: Joshua Pritikin <joshua.pritikin@db.com>
+ Date: Tue, 11 May 1999 11:10:13 -0400 (EDT)
+ Message-ID: <Pine.GSO.4.02.9905111106460.1418-100000@eq1062.wks.na.deuba.com>
+ Subject: Socket IPPROTO_TCP [PATCH 5.005_5x]
+ Branch: perl
+ ! ext/Socket/Socket.pm ext/Socket/Socket.xs
____________________________________________________________________________
-[ 614] By: gsar on 1998/03/02 03:28:28
- Log: this one with adjusted test numbers
- Message-Id: <m0xjWFq-000EZeC@alias-2.pr.mcs.net>
- Date: Sat, 20 Dec 1997 15:16:14 -0600 (CST)
- From: Stephen McCamant <alias@mcs.com>
- Subject: [PERL] [PATCH] Fix local $a[0] and local $h{a}
- Branch: win32/perl
- ! embed.h global.sym pp.c pp_hot.c scope.c scope.h t/op/local.t
-____________________________________________________________________________
-[ 613] By: gsar on 1998/03/02 03:13:32
- Log: still another
- From: Inaba Hiroto <inaba@st.rim.or.jp>
- Subject: [PERL] tr///s bug
- Message-Id: <19980110155333D.inaba@st.rim.or.jp>
- Date: Sat, 10 Jan 1998 15:53:33 +0900
- Branch: win32/perl
- ! doop.c t/op/subst.t
-____________________________________________________________________________
-[ 612] By: gsar on 1998/03/02 03:01:27
- Log: yet another patch
- From: Chip Salzenberg <salzench@nielsenmedia.com>
- Message-Id: <199709161748.NAA08418@nielsenmedia.com>
- Subject: Tiny but massively cool: C<statement foreach @list>
- Date: Tue, 16 Sep 1997 13:47:28 -0400 (EDT)
- Branch: win32/perl
- ! perly.c perly.c.diff perly.y pod/perlsyn.pod t/cmd/mod.t
- ! toke.c vms/perly_c.vms
-____________________________________________________________________________
-[ 611] By: gsar on 1998/03/02 01:52:46
- Log: yet another 'old' patch
- From: Stephane Payrard <stef@francenet.fr>
- Message-Id: <199712040054.BAA04612@www.zweig.com>
- To: perl5-porters@perl.org
- Subject: Re: [PERL] buglet : minor but gratuitous inconsistency
- between `my' and `local' (Patch included)
- Branch: win32/perl
- ! op.c t/op/my.t
+[ 3390] By: gsar on 1999/05/11 15:27:40
+ Log: display more frequent progress messages when STDOUT is a tty
+ Branch: perl
+ ! lib/Test/Harness.pm
____________________________________________________________________________
-[ 610] By: gsar on 1998/03/02 01:45:55
- Log: another 'old' patch
- From: Roderick Schertler <roderick@argon.org>
- Date: 19 Dec 1997 12:52:36 -0500
- Message-Id: <pzg1npp6e3.fsf@eeyore.ibcinc.com>
- Subject: [PERL] [PATCH] Re: Problem with open >&=
- Branch: win32/perl
- ! doio.c t/op/misc.t
-____________________________________________________________________________
-[ 609] By: gsar on 1998/03/02 01:23:56
- Log: apply missing pieces from:
- From: Chip Salzenberg <salzench@nielsenmedia.com>
- Message-Id: <199711272044.PAA12102@nielsenmedia.com>
- Subject: [PATCH] Improved LVALUE patch
- Date: Thu, 27 Nov 1997 15:44:02 -0500 (EST)
- Branch: win32/perl
+[ 3389] By: gsar on 1999/05/11 14:40:58
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 10 May 1999 02:07:01 -0400 (EDT)
+ Message-Id: <199905100607.CAA26045@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Explanations by Test::Harness
+ Branch: perl
+ ! lib/Test/Harness.pm
+____________________________________________________________________________
+[ 3388] By: gsar on 1999/05/11 14:08:14
+ Log: avoid creating spurious subroutine stubs on failed subroutine
+ call and other places of sv_2cv() misuse; fixes problems with
+ failed subroutine calls "hiding" later attempts to lookup methods
+ in base classes
+ Branch: perl
+ ! gv.c perl.c pod/perlguts.pod pp_hot.c sv.c t/op/method.t
+____________________________________________________________________________
+[ 3387] By: gsar on 1999/05/11 09:34:13
+ Log: various fixes for clean build and test on win32; configpm broken,
+ needed to open myconfig.SH rather than myconfig; sundry adjustments
+ to bytecode stuff; tweaks to DYNAMIC_ENV_FETCH code to make it
+ work under win32; getenv_sv() changed to getenv_len() since SVs
+ aren't visible in the lower echelons; remove bogus exports from
+ config.sym; PERL_OBJECT-ness for C++ exception support; null out
+ IoDIRP in filter_del() or sv_free() will attempt to close it
+ Branch: perl
+ ! Changes bytecode.pl byterun.c byterun.h configpm embed.h
+ ! embed.pl ext/B/B/Asmdata.pm ext/ByteLoader/ByteLoader.xs
+ ! ext/DynaLoader/dlutils.c global.sym hv.c iperlsys.h objXSUB.h
+ ! op.c perl.c perl.h pp.c pp_ctl.c proto.h scope.c scope.h
+ ! t/io/open.t t/op/magic.t toke.c util.c vms/vms.c vms/vmsish.h
+ ! win32/GenCAPI.pl win32/Makefile win32/config.bc
+ ! win32/config.gc win32/config.vc win32/makedef.pl
+ ! win32/makefile.mk win32/perlhost.h win32/runperl.c
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 3386] By: gsar on 1999/05/11 02:49:07
+ Log: gutsupport for C++ exceptions
+ From: Chip Salzenberg <chip@perlsupport.com>
+ Date: Tue, 9 Mar 1999 11:51:57 -0500
+ Message-ID: <19990309115157.E7911@perlsupport.com>
+ Subject: [PATCH 5.005] Flexible Exceptions
+ Branch: perl
+ ! embed.h global.sym objXSUB.h perl.c perl.h pp_ctl.c proto.h
+ ! scope.c scope.h thrdvar.h util.c
+____________________________________________________________________________
+[ 3385] By: gsar on 1999/05/10 19:33:36
+ Log: "weak" references internals, still needs perlguts documentation
+ (somewhat modified version of patch suggested by Tuomas J. Lukka
+ <lukka@fas.harvard.edu>)
+ Branch: perl
+ ! dump.c embed.h embed.pl global.sym mg.c objXSUB.h perl.h
+ ! pod/perldiag.pod proto.h sv.c sv.h util.c
+____________________________________________________________________________
+[ 3384] By: jhi on 1999/05/10 18:21:43
+ Log: Circumnavigate Digital UNIX 4.0D miniperl core dump
+ (due to QAR 56761) (the bug has been fixed in 4.0E or better)
+ Branch: cfgperl
+ ! INSTALL hints/dec_osf.sh
+____________________________________________________________________________
+[ 3381] By: jhi on 1999/05/10 14:39:28
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> cygwin32/Makefile.SHs cygwin32/build-instructions.READFIRST
+ +> cygwin32/build-instructions.charles-wilson
+ +> cygwin32/build-instructions.sebastien-barre
+ +> cygwin32/build-instructions.steven-morlock
+ +> cygwin32/build-instructions.steven-morlock2
+ +> cygwin32/impure_ptr.c cygwin32/ld2.in cygwin32/perlld.in
+ +> ext/ByteLoader/ByteLoader.pm ext/ByteLoader/ByteLoader.xs
+ +> ext/ByteLoader/Makefile.PL pod/Win32.pod t/lib/io_linenum.t
+ +> t/op/numconvert.t utils/perlbc.PL
+ - cygwin32/cw32imp.h cygwin32/gcc2 cygwin32/ld2 cygwin32/perlgcc
+ - cygwin32/perlld
+ !> (integrate 105 files)
+____________________________________________________________________________
+[ 3380] By: gsar on 1999/05/10 12:27:14
+ Log: regen regnodes.h
+ Branch: perl
+ ! Changes regnodes.h
+____________________________________________________________________________
+[ 3379] By: gsar on 1999/05/10 12:17:26
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 01 May 1999 22:55:36 +0200
+ Message-ID: <373067e9.56194713@smtp1.ibm.net>
+ Subject: [PATCH 5.005_56] Win32 and VC++ 98 doesn't support CASTI
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlop.pod win32/config.vc
+ ! win32/config_H.vc
+____________________________________________________________________________
+[ 3378] By: gsar on 1999/05/10 12:07:13
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 30 Apr 1999 22:26:09 -0400 (EDT)
+ Message-Id: <199905010226.WAA19127@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_56] Self-consistent numeric conversion again
+ Branch: perl
+ + t/op/numconvert.t
+ ! MANIFEST doio.c dump.c perl.h pp.c pp_hot.c sv.c sv.h toke.c
+ ! util.c
+____________________________________________________________________________
+[ 3377] By: gsar on 1999/05/10 11:39:48
+ Log: pp_modulo comment tweak from Ilya
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 3376] By: gsar on 1999/05/10 11:30:40
+ Log: From: Joshua Pritikin <joshua.pritikin@db.com>
+ Date: Fri, 7 May 1999 11:31:00 -0400 (EDT)
+ Message-ID: <Pine.GSO.4.02.9905071127100.1449-100000@eq1062.wks.na.deuba.com>
+ Subject: Test.pm update [PATCH _56]
+ Branch: perl
+ ! lib/Test.pm
+____________________________________________________________________________
+[ 3375] By: gsar on 1999/05/10 11:28:30
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 07 May 1999 00:59:54 +0200
+ Message-ID: <373318ae.19292461@smtp1.ibm.net>
+ Subject: Re: Using existing memory for an SV's PV
+ Branch: perl
! sv.c
____________________________________________________________________________
-[ 608] By: gsar on 1998/03/02 01:13:01
- Log: merge two important 'old' patches
- From: Chip Salzenberg <salzench@nielsenmedia.com>
- Message-Id: <199709241632.MAA09164@nielsenmedia.com>
- Subject: [PATCH] Fix C<42 until forever> SIGSEGV
- Date: Wed, 24 Sep 1997 12:32:11 -0400 (EDT)
- ------
- From: Chip Salzenberg <salzench@nielsenmedia.com>
- Message-Id: <199710221332.JAA04814@nielsenmedia.com>
- Subject: [PATCH] Fix for compile-time while() warnings
- Date: Wed, 22 Oct 1997 09:31:50 -0400 (EDT)
- Branch: win32/perl
- ! op.c
+[ 3374] By: gsar on 1999/05/10 11:23:44
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 07 May 1999 00:59:52 +0200
+ Message-ID: <37321800.19118320@smtp1.ibm.net>
+ Subject: [PATCH 5.005_56] Fix -Dm memory debugging for PERL_OBJECT
+ Branch: perl
+ ! perl.h
____________________________________________________________________________
-[ 607] By: gsar on 1998/03/01 06:52:26
- Log: integrate mainline changes
- Branch: asperl
- +> Policy_sh.SH Porting/config.sh Porting/config_H atomic.h
- +> lib/Tie/Handle.pm t/op/tiehandle.t
- - config_H
- !> (integrate 89 files)
-____________________________________________________________________________
-[ 606] By: gsar on 1998/02/28 23:11:00
- Log: misc small tweaks
- - AutoLoader fix for long::pack::names
- - d_mymalloc can be set from makefiles now
- - make search.pl actually work on win32
- - revert podoc about $^E on OS/2 (per Ilya's wishes)
- Branch: win32/perl
- ! lib/AutoLoader.pm pod/perlvar.pod win32/Makefile
- ! win32/bin/search.pl win32/makefile.mk win32/win32.c
-____________________________________________________________________________
-[ 605] By: gsar on 1998/02/28 22:16:45
- Log: fix typo in sv.h, and run 'make regen_headers' to make it build
- Branch: win32/perl
- ! embedvar.h sv.h
-____________________________________________________________________________
-[ 604] By: gsar on 1998/02/28 21:08:58
- Log: integrate mainline
- Branch: win32/perl
- +> Policy_sh.SH atomic.h lib/Tie/Handle.pm t/op/tiehandle.t
- !> Configure MANIFEST Makefile.SH bytecode.h bytecode.pl
- !> byterun.c ext/SDBM_File/Makefile.PL
- !> ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/sdbm.h
- !> lib/ExtUtils/MM_VMS.pm os2/diff.configure os2/os2.c perl.c
- !> perlvars.h pod/perltie.pod pp_sys.c sv.c sv.h t/lib/anydbm.t
- !> t/lib/sdbm.t util.c vms/descrip.mms vms/perlvms.pod
- !> vms/test.com win32/makedef.pl
-____________________________________________________________________________
-[ 603] By: nick on 1998/02/28 11:31:15
- Log: Missed FREAD in bytecode.h
- Cannot export svref_mutex in non-threaded perl
- Branch: perl
- ! bytecode.h win32/makedef.pl
-
-----------------
-Version 5.004_61
-----------------
-
+[ 3373] By: gsar on 1999/05/10 11:22:10
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 6 May 1999 18:17:28 -0400
+ Message-ID: <19990506181728.A12433@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.005_56] Make open(F,"command |") return correct err(no)
+ Branch: perl
+ ! doio.c embed.h global.sym objXSUB.h pod/perldiag.pod proto.h
+ ! util.c
+____________________________________________________________________________
+[ 3372] By: gsar on 1999/05/10 10:57:49
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 6 May 1999 01:21:05 -0400 (EDT)
+ Message-Id: <199905060521.BAA03485@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_56] Cosmetic: data-driven REx-dump
+ Branch: perl
+ ! regcomp.c regcomp.pl
____________________________________________________________________________
-[ 602] By: mbeattie on 1998/02/27 18:35:27
- Log: Change FREAD/FGETC to BGET_FREAD/BGET_FGETC to avoid clash with
- preprocessor symbol on Digital UNIX.
+[ 3371] By: gsar on 1999/05/10 10:54:01
+ Log: From: lane@duphy4.physics.drexel.edu
+ Date: Tue, 04 May 1999 10:19:25 -0700
+ Message-Id: <3.0.6.32.19990504101925.02ecde30@ous.edu>
+ Subject: [PATCH 5.005.56] pod->html VMS fixes
Branch: perl
- ! bytecode.h bytecode.pl byterun.c
+ ! installhtml lib/Pod/Html.pm
____________________________________________________________________________
-[ 601] By: mbeattie on 1998/02/27 18:27:00
- Log: Fix stupid ATOMIC_DEC_AND_TEST typo in sv.h.
+[ 3370] By: gsar on 1999/05/10 10:45:52
+ Log: testsuite nits
Branch: perl
- ! sv.h
+ ! t/lib/io_linenum.t t/op/filetest.t
____________________________________________________________________________
-[ 600] By: mbeattie on 1998/02/27 18:15:07
- Log: Add atomic.h to MANIFEST
+[ 3369] By: gsar on 1999/05/10 10:35:22
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 3 May 1999 22:38:50 -0400 (EDT)
+ Message-Id: <199905040238.WAA01865@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Quickier thread-specific data on OS/2
Branch: perl
- ! MANIFEST
+ ! os2/os2ish.h os2/os2thread.h
____________________________________________________________________________
-[ 599] By: mbeattie on 1998/02/27 18:13:52
- Log: Integrate win32 branch into mainline.
+[ 3368] By: gsar on 1999/05/10 10:00:11
+ Log: From: Albert Dvornik <bert@genscan.com>
+ Date: 03 May 1999 12:20:57 -0400
+ Message-ID: <tqlnf6gm52.fsf@puma.genscan.com>
+ Subject: [PATCH 5.005_56] do_sv_dump does dump (core) on IO handles
Branch: perl
- ! bytecode.pl
- !> bytecode.h byterun.c byterun.h dosish.h embed.h embedvar.h
- !> ext/B/B.xs ext/B/Makefile.PL global.sym perl.h sv.c
- !> win32/Makefile win32/bin/pl2bat.pl win32/config.bc
- !> win32/config.gc win32/config.vc win32/config_H.bc
- !> win32/config_H.gc win32/config_H.vc win32/config_h.PL
- !> win32/makedef.pl win32/makefile.mk win32/win32.c win32/win32.h
- !> win32/win32thread.h
+ ! dump.c
____________________________________________________________________________
-[ 598] By: mbeattie on 1998/02/27 18:06:41
- Log: Make refcounts atomic for threading (dependent on appropriate
- arch-dependent and compiler-dependent definitions in atomic.h
- or else falls back to a global mutex to protect refcounts).
+[ 3367] By: gsar on 1999/05/10 09:55:51
+ Log: shadow password support for Solaris (needs Configure help to
+ determine HAS_GETSPENT)
+ From: "Patrick O'Brien" <pdo@cs.umd.edu>
+ Date: Sat, 01 May 1999 19:41:17 -0400
+ Message-Id: <199905012341.TAA23989@optimus.cs.umd.edu>
+ Subject: getpwent() under solaris
Branch: perl
- + atomic.h
- ! global.sym perl.c perlvars.h sv.c sv.h
+ ! pp_sys.c
+____________________________________________________________________________
+[ 3366] By: gsar on 1999/05/10 09:45:58
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 01 May 1999 23:45:47 +0200
+ Message-ID: <373373fb.59284266@smtp1.ibm.net>
+ Subject: [PATCH 5.005_56] Add POLLUTE=1 option to MakeMaker
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 3365] By: gsar on 1999/05/10 09:34:22
+ Log: test suite and fix input_line_number()
+ From: Paul Johnson <pjcj@transeda.com>
+ Date: Thu, 29 Apr 1999 06:28:14 +0100
+ Message-ID: <19990429062814.A17906@west-tip.transeda.com>
+ Subject: [PATCH] IO::Handle 1.20 (was Re: FAIL Gedcom-1.01 i86pc-solaris 2.6)
+ Branch: perl
+ + t/lib/io_linenum.t
+ ! MANIFEST ext/IO/lib/IO/Handle.pm
____________________________________________________________________________
-[ 597] By: mbeattie on 1998/02/27 15:37:22
- Log: Tiehandle stuff in change 595 didn't add to MANIFEST
+[ 3364] By: gsar on 1999/05/10 09:20:56
+ Log: fix overeager [:foo:] parsing
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Fri, 30 Apr 1999 09:26:18 +0100
+ Message-Id: <199904300826.JAA01257@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_{56,03}] Re: Regular expression difference b/n 5.004 & 5.005
+ Branch: perl
+ ! regcomp.c t/op/re_tests
+____________________________________________________________________________
+[ 3363] By: gsar on 1999/05/10 09:09:21
+ Log: documentation for Win32 builtins (somewhat modified)
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Tue, 30 Mar 1999 08:05:03 +0200
+ Message-ID: <37006783.1926460@smtp1.ibm.net>
+ Subject: Re: Issues with build 509
Branch: perl
+ + pod/Win32.pod
! MANIFEST
____________________________________________________________________________
-[ 596] By: mbeattie on 1998/02/27 15:34:55
- Log: Missed adding new file Policy_sh.SH in change 592.
+[ 3362] By: gsar on 1999/05/10 08:22:07
+ Log: provide File::Copy::syscopy() via Win32::CopyFile() on win32
Branch: perl
- + Policy_sh.SH
+ ! lib/File/Copy.pm win32/win32.c
____________________________________________________________________________
-[ 595] By: mbeattie on 1998/02/27 15:34:06
- Log: Subject: [PATCH] _60 & _04 - Add WRITE & CLOSE to TIEHANDLE
- Date: Fri, 27 Feb 1998 04:15:04 +0000
- From: Graham Barr <gbarr@pobox.com>
+[ 3361] By: gsar on 1999/05/10 08:11:29
+ Log: escape ampersands in <pre> sections
Branch: perl
- + lib/Tie/Handle.pm t/op/tiehandle.t
- ! pod/perltie.pod pp_sys.c
+ ! Changes lib/Pod/Html.pm
____________________________________________________________________________
-[ 594] By: mbeattie on 1998/02/27 15:31:12
- Log: From: Dan Sugalski <sugalskd@osshe.edu>
- Subject: [PATCH 5.004_60] Fix to MM_VMS.PM
- Date: Thu, 26 Feb 1998 11:09:55 -0800
- Subject: [PATCH 5.004_60] Get SDBM_File working on VMS
- Date: Thu, 26 Feb 1998 11:15:24 -0800
- Branch: perl
- ! ext/SDBM_File/Makefile.PL ext/SDBM_File/sdbm/Makefile.PL
- ! ext/SDBM_File/sdbm/sdbm.h lib/ExtUtils/MM_VMS.pm
- ! t/lib/anydbm.t t/lib/sdbm.t vms/descrip.mms vms/perlvms.pod
- ! vms/test.com
-____________________________________________________________________________
-[ 593] By: mbeattie on 1998/02/27 15:26:45
- Log: Fix file-descriptor leak when pipes fail via taint checks:
- Subject: [PATCH] Some patches went through cracks
- Date: Thu, 26 Feb 1998 02:47:46 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 3360] By: gsar on 1999/05/10 08:04:14
+ Log: AIX hints enhancements (threads build, SOCKS support)
+ From: "David R. Favor" <dfavor@austin.ibm.com>
+ Date: Wed, 28 Apr 1999 08:45:28 -0500
+ Message-ID: <372710F8.B1F73BEB@austin.ibm.com>
+ Subject: Working build for AIX + gcc + threading
Branch: perl
- ! os2/os2.c util.c
-____________________________________________________________________________
-[ 592] By: mbeattie on 1998/02/27 15:15:12
- Log: Subject: Config_60-03-04.diff patch for 5.004_60
- Date: Wed, 25 Feb 1998 17:14:39 -0500 (EST)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Branch: perl
- ! Configure MANIFEST Makefile.SH os2/diff.configure
-____________________________________________________________________________
-[ 591] By: gsar on 1998/02/26 19:34:50
- Log: added AS patch#9
- Branch: asperl
- - win32/ipdir.c win32/ipenv.c win32/iplio.c win32/ipmem.c
- - win32/ipproc.c win32/ipsock.c win32/ipstdio.c
- - win32/ipstdiowin.h win32/perlobj.def
- ! ObjXSub.h globals.c perl.c proto.h win32/Makefile
- ! win32/dl_win32.xs win32/runperl.c win32/win32.c win32/win32.h
- ! win32/win32sck.c win32/win32thread.c
-____________________________________________________________________________
-[ 590] By: gsar on 1998/02/26 04:25:40
- Log: various changes to make win32 build under the new Configure & co.
- - added byterun.c to core C build
- - makefile.mk now has a regen_config_h target to quickly update config_H.[bgv]c
- after adding new variables to config.[bgv]c
- - sig_name_init now has only the valid signals
- - we now have $Config{usethreads}
- - tested under the two commercial compilers w/ and w/o usethreads
- Branch: win32/perl
- ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/config_h.PL win32/makedef.pl win32/makefile.mk
-____________________________________________________________________________
-[ 589] By: gsar on 1998/02/26 03:56:19
- Log: various cleanups so that B can be built as "just another extension"
- - export symbols needed for building B
- - bset_obj_store() is needed by byterun(), so define it there instead
- of at B.xs, and export it
- - freadpv() is only used in B.xs, so move it there
- - byte*.h are now included by perl.h
- - regenerate embed*.h
- Branch: win32/perl
- ! bytecode.h bytecode.pl byterun.c byterun.h embed.h embedvar.h
- ! ext/B/B.xs ext/B/Makefile.PL global.sym perl.h
-____________________________________________________________________________
-[ 588] By: gsar on 1998/02/25 21:46:35
- Log: integrate mainline
- Branch: win32/perl
- +> Porting/config.sh Porting/config_H
- - config_H
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 3359] By: gsar on 1999/05/10 07:49:26
+ Log: more Compiler patches from Vishal Bhatia <vishalb@my-dejanews.com>
+ Date: Tue, 27 Apr 1999 23:47:24 PDT
+ Message-ID: <19990428064724.95244.qmail@hotmail.com>
+ Subject: [PATCH 5.005_56] Saving Tied hashes ( C.pm)
+ --
+ Date: Thu, 29 Apr 1999 18:21:06 -0700
+ Message-ID: <GEFPBFDJADFJBAAA@my-dejanews.com>
+ Subject: [PATCH 5.005_56] double constants ( C.pm)
+ --
+ Date: Mon, 03 May 1999 20:21:31 PDT
+ Message-ID: <19990504032131.81113.qmail@hotmail.com>
+ Subject: [PATCH 5.005_56] Overloading implementation ( Compiler)
+ --
+ Date: Thu, 06 May 1999 17:57:09 -0700
+ Message-ID: <FCJELBLAJBOBAAAA@my-dejanews.com>
+ Subject: Stash.pm
+ Branch: perl
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/Bblock.pm ext/B/B/C.pm
+ ! ext/B/B/CC.pm ext/B/B/Stash.pm t/harness
+____________________________________________________________________________
+[ 3358] By: gsar on 1999/05/10 04:39:15
+ Log: cygwin32 update (untested adaptation of patch against 5.005_03)
+ From: alexander smishlajev <als@turnhere.com>
+ Date: Sun, 25 Apr 1999 14:58:29 +0300
+ Message-ID: <37230365.5F68B460@turnhere.com>
+ Subject: [PATCH]5.005_03 (CORE) cygwin32 port
+ Branch: perl
+ + cygwin32/Makefile.SHs cygwin32/build-instructions.READFIRST
+ + cygwin32/build-instructions.charles-wilson
+ + cygwin32/build-instructions.sebastien-barre
+ + cygwin32/build-instructions.steven-morlock
+ + cygwin32/build-instructions.steven-morlock2
+ + cygwin32/impure_ptr.c cygwin32/ld2.in cygwin32/perlld.in
+ - cygwin32/cw32imp.h cygwin32/gcc2 cygwin32/ld2 cygwin32/perlgcc
+ - cygwin32/perlld
+ ! Configure EXTERN.h MANIFEST Makefile.SH README.cygwin32 XSUB.h
+ ! cflags.SH config_h.SH dosish.h ext/POSIX/Makefile.PL
+ ! ext/SDBM_File/sdbm/pair.c hints/cygwin32.sh installperl
+ ! lib/Cwd.pm lib/ExtUtils/MakeMaker.pm lib/perl5db.pl
+ ! makedepend.SH perl.h perlvars.h pp_hot.c pp_sys.c regcomp.c
+ ! t/io/fs.t t/io/tell.t t/lib/anydbm.t t/op/stat.t util.c
+____________________________________________________________________________
+[ 3357] By: gsar on 1999/05/10 04:07:07
+ Log: applied suggested patch, modulo already applied parts
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Sat, 24 Apr 1999 20:12:43 -0400 (EDT)
+ Message-id: <01JAF9UAV9XG002O0W@mail.newman.upenn.edu>
+ Subject: [Patch 5.005_56] VMS consolidated patch #2
+ Branch: perl
+ ! configure.com t/op/filetest.t t/op/taint.t t/pragma/warn/doio
+ ! t/pragma/warn/mg t/pragma/warn/pp_sys t/pragma/warn/sv
+ ! vms/descrip_mms.template vms/ext/vmsish.t vms/perlvms.pod
+ ! vms/subconfigure.com vms/test.com vms/vms.c
+____________________________________________________________________________
+[ 3356] By: gsar on 1999/05/10 03:48:08
+ Log: applied suggested patch, with win32 and PERL_OBJECT additions
+ From: Tom Hughes <tom@compton.nu>
+ Date: Sat, 24 Apr 1999 18:11:59 +0100
+ Message-ID: <609bdff748.tom@compton.compton.nu>
+ Subject: ByteLoader patch
+ Branch: perl
+ + ext/ByteLoader/ByteLoader.pm ext/ByteLoader/ByteLoader.xs
+ + ext/ByteLoader/Makefile.PL utils/perlbc.PL
+ ! MANIFEST bytecode.h bytecode.pl byterun.c byterun.h embed.h
+ ! embed.pl ext/B/B.xs ext/B/B/Asmdata.pm ext/B/B/Bytecode.pm
+ ! ext/B/B/Debug.pm objXSUB.h op.c pp_ctl.c proto.h
+ ! utils/Makefile win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 3355] By: gsar on 1999/05/10 03:22:49
+ Log: document 'test' attribute (from Andreas Koenig)
+ Branch: perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 3354] By: gsar on 1999/05/10 03:12:37
+ Log: From: pmarquess@bfsec.bt.co.uk
+ Date: Thu, 22 Apr 1999 23:12:08 +0100
+ Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB29C6B45@mbtlipnt02.btlabs.bt.co.uk>
+ Subject: PATCH for small bug in scan_bin
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 3353] By: gsar on 1999/05/10 02:39:33
+ Log: more bulletproof workaround for mangled paths (updates changes#3345,3350);
+ provide Win32::GetLongPathName() to complement Win32::GetShortPathName()
+ Branch: perl
+ ! t/op/magic.t win32/makedef.pl win32/runperl.c win32/win32.c
+ ! win32/win32iop.h
+____________________________________________________________________________
+[ 3352] By: gsar on 1999/05/09 22:47:39
+ Log: flush all open output buffers before fork(), exec(), system, qx//
+ and pipe open() operations, simplifying buffering headaches faced
+ by users; uses fflush(NULL), which may need Configure test
+ Branch: perl
+ ! perl.h pod/perldelta.pod pod/perlfunc.pod pod/perlipc.pod
+ ! pp_sys.c util.c vmesa/vmesa.c vms/vms.c win32/win32.c
+____________________________________________________________________________
+[ 3351] By: gsar on 1999/05/09 21:11:51
+ Log: perlcc on win32 (correct version of fix suggested by Jean-Louis
+ Leroy <jll@skynet.be>)
+ Branch: perl
+ ! utils/perlcc.PL
+____________________________________________________________________________
+[ 3350] By: gsar on 1999/05/09 20:39:11
+ Log: normalize $^X to full pathname on win32
+ Branch: perl
+ ! win32/runperl.c
+____________________________________________________________________________
+[ 3349] By: gsar on 1999/05/09 20:23:07
+ Log: allow readline($globref), <$globref> already works
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 3348] By: gsar on 1999/05/09 20:00:09
+ Log: perldoc cleanups (variant of changes suggested by Christian Lemburg
+ <lemburg@online-club.de>)
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 3347] By: gsar on 1999/05/09 18:47:21
+ Log: additions to Thread.pm docs from Tuomas J. Lukka
+ <lukka@fas.harvard.edu>
+ Branch: perl
+ ! ext/Thread/Thread.pm
+____________________________________________________________________________
+[ 3346] By: gsar on 1999/05/09 18:38:00
+ Log: From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Sat, 17 Apr 1999 02:46:13 -0700 (PDT)
+ Message-ID: <14103.57454.614253.598264@fre-76-120.reshall.berkeley.edu>
+ Subject: [PATCH _56] Re: pdt: Perl Development Tools?
+ Branch: perl
+ ! ext/B/B/Xref.pm
+____________________________________________________________________________
+[ 3345] By: gsar on 1999/05/09 18:22:43
+ Log: work around mangled archname on win32 while finding privlib/sitelib;
+ normalize lib paths to forward slashes internally
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3344] By: gsar on 1999/05/09 03:20:06
+ Log: fix typo in dbm filters that caused odbm.t to fail
+ Branch: perl
+ ! ext/ODBM_File/ODBM_File.xs t/lib/odbm.t
+____________________________________________________________________________
+[ 3343] By: gsar on 1999/05/09 02:02:59
+ Log: tweak test totals
+ Branch: perl
+ ! Changes t/lib/tie-stdhandle.t
+____________________________________________________________________________
+[ 3342] By: gsar on 1999/05/09 01:42:06
+ Log: import list propagation busted (pointed out by Ton Hospel
+ <thospel@mail.dma.be>)
+ Branch: perl
+ ! lib/autouse.pm
+____________________________________________________________________________
+[ 3341] By: gsar on 1999/05/09 00:54:18
+ Log: hpux needs {SHLIB_PATH,LDOPTS} rather than LD_{LIBRARY,RUN}_PATH
+ (as suggested by Eric Boehm <boehm@nortelnetworks.com>)
+ Branch: perl
+ ! Configure Makefile.SH
+____________________________________________________________________________
+[ 3340] By: gsar on 1999/05/09 00:40:41
+ Log: generate manpages for newly added utils
+ Branch: perl
+ ! installman
+____________________________________________________________________________
+[ 3339] By: gsar on 1999/05/09 00:33:50
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Sun, 02 May 1999 17:59:24 +0100
+ Message-Id: <199905021659.RAA14016@crypt.compulink.co.uk>
+ Subject: [PATCH] Re: ptr to realloced memory in yylex
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 3338] By: jhi on 1999/05/08 22:40:29
+ Log: Remove CONFIG item, add Digital UNIX 'ld' bug.
+ Branch: cfgperl
+ ! INSTALL
+____________________________________________________________________________
+[ 3337] By: jhi on 1999/05/08 22:22:26
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> pod/perldbmfilter.pod t/io/open.t t/lib/tie-stdhandle.t
!> (integrate 54 files)
____________________________________________________________________________
-[ 587] By: gsar on 1998/02/25 19:20:26
- Log: added AS patch#8
- Branch: asperl
- ! sv.c x2p/a2py.c x2p/util.c
-____________________________________________________________________________
-[ 586] By: gsar on 1998/02/25 19:08:06
- Log: added AS patch#7
- Message-Id: <01BD40F9.CE57B210.dougl@ActiveState.com>
- Date: Tue, 24 Feb 1998 07:57:07 PST
- From: Douglas Lankshear <dougl@ActiveState.com>
- Subject: [PATCH]
-
- Here's an attempt at
- 6. MANIFEST must be updated with new file names
- 5. Mktime(), Stat() etc., rather than MKtime()/STat() etc.
- And some changes to move toward
- 1. Merge PERL_OBJECT build support into regular Makefile and makefile.mk
+[ 3336] By: gsar on 1999/05/08 21:48:22
+ Log: make perldoc -f grok nested =items
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 3335] By: gsar on 1999/05/08 19:48:11
+ Log: allow AV/HV dereferences on pseudohashes ($ph->{foo}[1], etc.)
+ Branch: perl
+ ! op.c t/lib/fields.t
+____________________________________________________________________________
+[ 3334] By: gsar on 1999/05/08 19:09:41
+ Log: update test totals
+ Branch: perl
+ ! t/lib/bigintpm.t
+____________________________________________________________________________
+[ 3333] By: gsar on 1999/05/08 16:56:02
+ Log: mention unpack('pP',...) footshot (from Albert Dvornik <bert@genscan.com>)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3332] By: gsar on 1999/05/08 16:46:44
+ Log: applied suggested patch, added tests
+ From: William Mann <wmann@avici.com>
+ Date: Mon, 12 Apr 1999 12:25:22 -0400 (EDT)
+ Message-Id: <199904121625.MAA00983@hwsrv1.avici.com>
+ Subject: BigInt.pm extensions for logical operations
+ Branch: perl
+ ! lib/Math/BigInt.pm pod/perldelta.pod t/lib/bigintpm.t
+____________________________________________________________________________
+[ 3331] By: gsar on 1999/05/08 16:09:33
+ Log: avoid temporary files named 'tmp'
+ Branch: perl
+ ! Makefile.SH pp.c
+____________________________________________________________________________
+[ 3330] By: nick on 1999/05/08 14:16:30
+ Log: Implement OPEN, EOF, SEEK, TELL, BINMODE and FILENO as TIEHANDLE methods.
+ Provide Tie::StdHandle
+ Basic update of docs.
+ Branch: perl
+ + t/lib/tie-stdhandle.t
+ ! lib/Tie/Handle.pm pod/perltie.pod pp_sys.c
+____________________________________________________________________________
+[ 3329] By: nick on 1999/05/08 12:03:45
+ Log: Tweaks to open(my $fh,...) stuff
+ Branch: perl
+ ! op.c pp.c pp_sys.c t/io/open.t
+____________________________________________________________________________
+[ 3328] By: nick on 1999/05/08 11:18:42
+ Log: Bring SDBM_File.xs into line with new typemap
+ Branch: perl
+ ! ext/SDBM_File/SDBM_File.xs
+____________________________________________________________________________
+[ 3327] By: gsar on 1999/05/08 00:07:11
+ Log: add test case for AUTOLOAD reentrancy fix in change#3279
+ Branch: perl
+ ! t/lib/autoloader.t
+____________________________________________________________________________
+[ 3326] By: nick on 1999/05/07 21:24:50
+ Log: Implement open( my $fh, ...) and similar.
+ Set flag in op.c for "constructor ops"
+ In pp_rv2gv, if flag is set and arg is PADSV and uninit
+ vivify as reference to a detached GV.
+ (Name of GV is the pad name.)
+ This scheme should "just work" for pipe/socket etc. too.
- -- Doug
- Branch: asperl
- ! MANIFEST installperl ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
- ! ipsock.h ipstdio.h lib/ExtUtils/MM_Win32.pm perldir.h
- ! perlenv.h perlio.h perllio.h win32/Makefile
+ #if 0 out the open(FH,undef) for now.
+ Change t/io/open.t to test open(my $fh,...)
+ Branch: perl
+ ! op.c pp.c pp_sys.c t/io/open.t
____________________________________________________________________________
-[ 585] By: mbeattie on 1998/02/25 17:44:34
- Log: More compiler tweaks.
+[ 3325] By: nick on 1999/05/07 21:18:42
+ Log: Correct SvLEN vs SvCUR which leads to odd "chunk" vs "line" in mess().
Branch: perl
- ! Makefile.SH bytecode.pl byterun.c byterun.h ext/B/B/Asmdata.pm
+ ! util.c
____________________________________________________________________________
-[ 584] By: mbeattie on 1998/02/25 15:36:38
- Log: Subject: [PATCH 5.004_60] dos-djgpp update
- Date: Wed, 25 Feb 1998 11:17:07 +0100
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+[ 3324] By: gsar on 1999/05/07 20:28:31
+ Log: avoid using PL_sv_mutex in condpair_magic() (avoids hangs when
+ intervening code has to allocate SVs)
Branch: perl
- ! djgpp/djgpp.c dosish.h hints/dos_djgpp.sh perl.c thread.h
+ ! util.c
____________________________________________________________________________
-[ 583] By: mbeattie on 1998/02/25 15:34:48
- Log: Move find_threadsv to right bit of global.sym. Bump patchlevel to 61.
+[ 3323] By: gsar on 1999/05/07 19:45:08
+ Log: allow line numbers to show in diagnostics during global destruction
Branch: perl
- ! global.sym patchlevel.h
+ ! util.c
____________________________________________________________________________
-[ 582] By: mbeattie on 1998/02/25 15:28:08
- Log: Subject: Re: [PATCH 5.004_60] Fix goto-in-eval segfault (unwrapped!)
- Date: Tue, 24 Feb 1998 11:15:57 +0000
- From: Robin Houston <robin@oneworld.org>
+[ 3322] By: gsar on 1999/05/07 09:38:11
+ Log: From: Dan Sugalski <sugalskd@ous.edu>
+ Date: Fri, 09 Apr 1999 16:16:39 -0700
+ Message-Id: <3.0.6.32.19990409161639.02ea1050@ous.edu>
+ Subject: [PATCH 5.005_03]Bug in MM_VMS.PM
Branch: perl
- ! pod/perldiag.pod pp_ctl.c
+ ! lib/ExtUtils/MM_VMS.pm
____________________________________________________________________________
-[ 581] By: mbeattie on 1998/02/25 15:27:06
- Log: Subject: [PATCH] #ifdef CAN_PROTOTYPE cleanup
- Date: 23 Feb 1998 23:36:09 +0100
- From: Gisle Aas <gisle@aas.no>
+[ 3321] By: gsar on 1999/05/07 09:08:23
+ Log: From: kwzh@gnu.org (Karl Heuer)
+ Date: Wed, 7 Apr 1999 23:58:58 -0400
+ Message-Id: <199904080358.XAA01192@mescaline.gnu.org>
+ Subject: [perl-5.005.02] detect lack of /dev/tty
Branch: perl
- ! doio.c miniperlmain.c op.c perl.c pp.h regcomp.c toke.c util.c
+ ! Makefile.SH
____________________________________________________________________________
-[ 580] By: mbeattie on 1998/02/25 15:25:29
- Log: Subject: [PATCH 5.004_60] improved Test.pm
- Date: Sat, 21 Feb 1998 14:17:09 -0500
- From: Joshua Pritikin <pritikin@mindspring.com>
+[ 3320] By: gsar on 1999/05/07 08:52:14
+ Log: allow distinct prefix for versioned executables
+ From: Roderick Schertler <roderick@argon.org>
+ Date: Wed, 07 Apr 1999 15:34:56 -0400
+ Message-ID: <3003.923513696@eeyore.ibcinc.com>
+ Subject: perl55.00503 -> perl5.00503 patch for installperl
Branch: perl
- ! lib/Test.pm
+ ! INSTALL installperl
____________________________________________________________________________
-[ 579] By: mbeattie on 1998/02/25 15:23:24
- Log: HP-UX hints and AIX global.sym changes (with Makefile.SH rule)
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Subject: [PATCH] 5.004_60: AIX: global.sym and Makefile.SH
- Date: Sat, 21 Feb 1998 15:26:19 +0200 (EET)
- Subject: Re: your HP-UX perl patch
- Date: Mon, 23 Feb 1998 23:14:37 +0200 (EET)
+[ 3319] By: gsar on 1999/05/07 08:07:02
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Mon, 05 Apr 1999 15:38:42 -0700
+ Message-Id: <3.0.6.32.19990405153842.0367b650@ous.edu>
+ Subject: Re: chomp fails with $/ in fixed-length record mode
+ --
+ From: Roderick Schertler <roderick@argon.org>
+ Date: Tue, 06 Apr 1999 21:11:37 -0400
+ Message-ID: <2795.923447497@eeyore.ibcinc.com>
+ Subject: Re: chomp fails with $/ in fixed-length record mode
Branch: perl
- ! Makefile.SH embed.h global.sym hints/hpux.sh
+ ! doop.c pod/perlfunc.pod t/op/chop.t
____________________________________________________________________________
-[ 578] By: mbeattie on 1998/02/25 15:18:06
- Log: Back out DB_File patch (change _553) and tweak Configure.
- Subject: ANNOUNCE: perl5.004_60 is available
- Date: Mon, 23 Feb 1998 10:47:26 -0000
- From: Paul Marquess <pmarquess@bfsec.bt.co.uk>
+[ 3318] By: gsar on 1999/05/07 07:56:35
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 6 Apr 1999 01:40:36 -0400
+ Message-ID: <19990406014035.A1238@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Make % use fmod()
Branch: perl
- ! Configure ext/DB_File/DB_File.xs
+ ! pp.c t/op/arith.t
____________________________________________________________________________
-[ 577] By: mbeattie on 1998/02/25 15:04:00
- Log: Subject: [PATCH] Cwd.pm
- Date: Fri, 20 Feb 1998 10:27:54 -0600
- From: Graham Barr <gbarr@ti.com>
+[ 3317] By: gsar on 1999/05/07 04:18:11
+ Log: DBM Filters (via private mail)
+ From: pmarquess@bfsec.bt.co.uk
+ Date: Sun, 18 Apr 1999 21:05:52 +0100
+ Message-Id: <199904182009.NAA19152@activestate.com>
+ Subject: DBM Filters
Branch: perl
- ! lib/Cwd.pm
+ + pod/perldbmfilter.pod
+ ! MANIFEST ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap
+ ! ext/GDBM_File/GDBM_File.pm ext/GDBM_File/GDBM_File.xs
+ ! ext/GDBM_File/typemap ext/NDBM_File/NDBM_File.pm
+ ! ext/NDBM_File/NDBM_File.xs ext/NDBM_File/typemap
+ ! ext/ODBM_File/ODBM_File.pm ext/ODBM_File/ODBM_File.xs
+ ! ext/ODBM_File/typemap ext/SDBM_File/SDBM_File.pm
+ ! ext/SDBM_File/SDBM_File.xs ext/SDBM_File/typemap
+ ! lib/AnyDBM_File.pm pod/Makefile pod/buildtoc pod/perl.pod
+ ! pod/perldelta.pod t/lib/db-btree.t t/lib/db-hash.t
+ ! t/lib/db-recno.t t/lib/gdbm.t t/lib/ndbm.t t/lib/odbm.t
+ ! t/lib/sdbm.t
+____________________________________________________________________________
+[ 3316] By: gsar on 1999/05/07 03:28:53
+ Log: avoid negative return value from Win32::GetTickCount()
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 03 Apr 1999 19:04:18 +0200
+ Message-ID: <37084742.22824479@smtp1.ibm.net>
+ Subject: Re: Win32::GetTickCount
+ Branch: perl
+ ! win32/win32.c
____________________________________________________________________________
-[ 576] By: mbeattie on 1998/02/25 15:02:57
- Log: From: ilya@math.ohio-state.edu (Ilya Zakharevich)
- Subject: [5.004_5* PATCH] Make ornaments default in Term::ReadLine
- Date: Fri, 20 Feb 1998 00:09:52 -0500 (EST)
- Subject: [PATCH 5.004_5*] Fix debugger messages and the default package
- Date: Fri, 20 Feb 1998 00:12:28 -0500 (EST)
- Subject: Re: Continued presence of segmentation violation in study_chunk()[PATCH]
- Date: Sat, 21 Feb 1998 15:32:29 -0500 (EST)
- Branch: perl
- ! lib/Term/ReadLine.pm lib/perl5db.pl regcomp.c
-____________________________________________________________________________
-[ 575] By: mbeattie on 1998/02/25 14:58:00
- Log: Subject: Re: ANNOUNCE: perl5.004_60 Configure patch is available
- Date: Tue, 24 Feb 1998 16:02:43 -0500 (EST)
- From: Andy Dougherty <doughera@lafcol.lafayette.edu>
- Branch: perl
- + Porting/config.sh Porting/config_H
- - config_H
- ! Configure INSTALL MANIFEST Makefile.SH Porting/Glossary
- ! Porting/pumpkin.pod config_h.SH ext/POSIX/POSIX.xs
- ! hints/aix.sh hints/amigaos.sh hints/bsdos.sh hints/dec_osf.sh
- ! hints/freebsd.sh hints/irix_6.sh hints/linux.sh
- ! hints/netbsd.sh hints/next_3.sh hints/next_4.sh hints/os2.sh
- ! hints/solaris_2.sh makedepend.SH perl.c perl.h pp.c pp_sys.c
- ! t/lib/thread.t t/op/nothread.t x2p/Makefile.SH
-____________________________________________________________________________
-[ 574] By: gsar on 1998/02/24 02:21:14
- Log: fix typos in sv.c
- Branch: win32/perl
- ! sv.c
+[ 3314] By: gsar on 1999/05/06 08:01:23
+ Log: compiler fixes from Vishal Bhatia <vishalb@hotmail.com>
+ Date: Tue, 30 Mar 1999 23:40:34 PST
+ Message-ID: <19990331074034.6117.qmail@hotmail.com>
+ Subject: [PATCH 5.005_56] pp_entersub and pp_leavewrite(CC.pm)
+ --
+ Date: Wed, 07 Apr 1999 00:28:23 -0800
+ Message-ID: <FGBNLNPOEELFAAAA@my-dejanews.com>
+ Subject: [PATCH 5.005_56] function prototypes(B.pm)
+ --
+ Date: Thu, 22 Apr 1999 23:40:52 -0700
+ Message-ID: <OEAOMKBMLDADCAAA@my-dejanews.com>
+ Subject: [PATCH 5.005_56 ] discarding worthless padsvs
+ --
+ Date: Tue, 27 Apr 1999 01:14:49 PDT
+ Message-ID: <19990427081449.28615.qmail@hotmail.com>
+ Subject: [PATCH 5.005_56] pp_ncmp implementation ( CC.pm)
+ Branch: perl
+ ! ext/B/B.pm ext/B/B/CC.pm ext/B/B/Stackobj.pm t/op/gv.t
+ ! t/op/ref.t
____________________________________________________________________________
-[ 573] By: mbeattie on 1998/02/23 10:03:39
- Log: Remove old Linux+threads segfault degugging kludge.
+[ 3313] By: jhi on 1999/05/06 07:59:52
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 33 files)
+____________________________________________________________________________
+[ 3312] By: gsar on 1999/05/06 07:11:50
+ Log: add Ethiopic section to unicode master database (from Ken
+ Whistler <kenw@sybase.com>)
Branch: perl
- ! perl.c
+ ! lib/unicode/UnicodeData-Latest.txt
____________________________________________________________________________
-[ 572] By: gsar on 1998/02/23 09:45:26
- Log: undo previous change (no added value!)
- Branch: win32/perl
- ! win32/bin/pl2bat.pl
-____________________________________________________________________________
-[ 571] By: gsar on 1998/02/23 09:18:32
- Log: fix pl2bat.pl to tolerate trailing .bat (as suggested by
- John Cavanaugh <cavanaug@sdd.hp.com>)
- Branch: win32/perl
- ! win32/bin/pl2bat.pl
-____________________________________________________________________________
-[ 570] By: gsar on 1998/02/22 04:02:15
- Log: support chown() (just a noop for now)
- Branch: win32/perl
- ! dosish.h win32/win32.c win32/win32.h
-____________________________________________________________________________
-[ 569] By: gsar on 1998/02/22 03:09:55
- Log: integrate latest win32 branch
- Branch: asperl
- +> (branch 41 files)
- !> (integrate 59 files)
-____________________________________________________________________________
-[ 568] By: gsar on 1998/02/22 02:40:56
- Log: get compiler building under win32 (needed Makefile.PL
- hacks that could be applicable to other platforms)
- Branch: win32/perl
- ! ext/B/Makefile.PL win32/Makefile win32/makefile.mk
-____________________________________________________________________________
-[ 567] By: gsar on 1998/02/22 01:30:19
- Log: integrate mainline
- Branch: win32/perl
- +> (branch 41 files)
- !> (integrate 46 files)
+[ 3311] By: gsar on 1999/05/06 05:37:55
+ Log: From: Damon Atkins <n107844@sysmgtdev.nabaus.com.au>
+ Date: Tue, 30 Mar 1999 11:26:11 +1000 (EST)
+ Message-Id: <199903300126.LAA20870@sysmgtdev.nabaus.com.au>
+ Subject: Largefiles for Solaris
+ Branch: perl
+ ! hints/solaris_2.sh
____________________________________________________________________________
-[ 566] By: gsar on 1998/02/20 22:31:56
- Log: fix handle leak in join()
- Branch: win32/perl
- ! win32/win32thread.h
-
-----------------
-Version 5.004_60
-----------------
-
+[ 3310] By: gsar on 1999/05/06 05:14:35
+ Log: emit more accurate diagnostic for syntax errors involving <>
+ within eval""
+ Branch: perl
+ ! toke.c utils/perldoc.PL
____________________________________________________________________________
-[ 565] By: mbeattie on 1998/02/20 18:23:47
- Log: Remove compiler files from their old lib/B locations. The compiler
- now builds by default (without the byteperl executable so far) and
- seems to work at least minimally.
- Branch: perl
- - lib/B.pm lib/B/Asmdata.pm lib/B/Assembler.pm lib/B/Bblock.pm
- - lib/B/Bytecode.pm lib/B/C.pm lib/B/CC.pm lib/B/Debug.pm
- - lib/B/Deparse.pm lib/B/Disassembler.pm lib/B/Lint.pm
- - lib/B/Showlex.pm lib/B/Stackobj.pm lib/B/Terse.pm
- - lib/B/Xref.pm lib/B/assemble lib/B/cc_harness
- - lib/B/disassemble lib/B/makeliblinks lib/O.pm
- ! MANIFEST bytecode.pl
-____________________________________________________________________________
-[ 564] By: mbeattie on 1998/02/20 18:05:33
- Log: Move lib/B/... and lib/[BO].pm over to where they should be,
- under ext/B.
- Branch: perl
- +> ext/B/B.pm ext/B/B/Asmdata.pm ext/B/B/Assembler.pm
- +> ext/B/B/Bblock.pm ext/B/B/Bytecode.pm ext/B/B/C.pm
- +> ext/B/B/CC.pm ext/B/B/Debug.pm ext/B/B/Deparse.pm
- +> ext/B/B/Disassembler.pm ext/B/B/Lint.pm ext/B/B/Showlex.pm
- +> ext/B/B/Stackobj.pm ext/B/B/Terse.pm ext/B/B/Xref.pm
- +> ext/B/B/assemble ext/B/B/cc_harness ext/B/B/disassemble
- +> ext/B/B/makeliblinks ext/B/O.pm
-____________________________________________________________________________
-[ 563] By: mbeattie on 1998/02/20 17:54:58
- Log: Start getting compiler to work when built with the core.
- [Still won't work as of this change.]
- Branch: perl
- +> byterun.c byterun.h lib/B/Asmdata.pm lib/B/Assembler.pm
- +> lib/B/Bblock.pm lib/B/Bytecode.pm lib/B/C.pm lib/B/CC.pm
- +> lib/B/Debug.pm lib/B/Deparse.pm lib/B/Disassembler.pm
- +> lib/B/Lint.pm lib/B/Showlex.pm lib/B/Stackobj.pm
- +> lib/B/Terse.pm lib/B/Xref.pm
- ! MANIFEST Makefile.SH bytecode.pl ext/B/Makefile.PL
-____________________________________________________________________________
-[ 562] By: mbeattie on 1998/02/20 16:42:13
- Log: Merge perlext/Compiler/... into mainline. Some files move to
- ext/B/..., some to lib/B/..., O.pm and B.pm go in lib and some
- move to the base perl directory (e.g. headers). Will need some
- cleaning up before it builds properly, I would guess.
- Branch: perl
- +> bytecode.h bytecode.pl cc_runtime.h ext/B/B.xs
- +> ext/B/Makefile.PL ext/B/NOTES ext/B/README ext/B/TESTS
- +> ext/B/Todo ext/B/byteperl.c ext/B/ramblings/cc.notes
- +> ext/B/ramblings/curcop.runtime ext/B/ramblings/flip-flop
- +> ext/B/ramblings/magic ext/B/ramblings/reg.alloc
- +> ext/B/ramblings/runtime.porting ext/B/typemap lib/B.pm
- +> lib/B/assemble lib/B/cc_harness lib/B/disassemble
- +> lib/B/makeliblinks lib/O.pm
-____________________________________________________________________________
-[ 561] By: mbeattie on 1998/02/20 16:39:38
- Log: Win32 changes from Sarathy, tweaked slightly by me.
- Branch: perlext
- ! Compiler/B.xs Compiler/B/Asmdata.pm Compiler/B/Bytecode.pm
- ! Compiler/B/C.pm Compiler/Makefile.PL Compiler/assemble
- ! Compiler/bytecode.h Compiler/bytecode.pl Compiler/byteperl.c
- ! Compiler/byterun.c Compiler/byterun.h Compiler/cc_harness
-____________________________________________________________________________
-[ 560] By: mbeattie on 1998/02/20 15:46:15
- Log: Initialise $@ early (fixes t/lib/ph.t for threaded perl).
+[ 3309] By: gsar on 1999/05/06 04:36:31
+ Log: additional test for IPC::Open3 (courtesy RonaldWS@aol.com)
Branch: perl
- ! perl.c
+ ! t/lib/open3.t
____________________________________________________________________________
-[ 559] By: mbeattie on 1998/02/20 12:56:10
- Log: Add missing t/op/wantarray.t to MANIFEST. Bump patchlevel to 60.
+[ 3308] By: gsar on 1999/05/06 03:19:16
+ Log: applied first part of suggested patch (bug described cannot be
+ reproduced any longer, so the second inconclusive part has not
+ been applied)
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Sun, 28 Mar 1999 04:51:34 +0100
+ Message-Id: <199903280351.EAA20430@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_56] Re: A core dump
Branch: perl
- ! MANIFEST patchlevel.h
+ ! toke.c
____________________________________________________________________________
-[ 558] By: mbeattie on 1998/02/20 12:53:26
- Log: Integrate win32 branch into mainline.
+[ 3307] By: gsar on 1999/05/06 01:56:06
+ Log: fix bogus OPf_REF context in C<sort BLOCK @foo> (extension of
+ change#3180)
Branch: perl
- !> XSUB.h config_h.SH doio.c lib/Pod/Html.pm pp_sys.c
- !> win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
- !> win32/makedef.pl win32/makefile.mk win32/win32.c win32/win32.h
- !> win32/win32iop.h x2p/a2p.h
+ ! op.c
____________________________________________________________________________
-[ 557] By: mbeattie on 1998/02/20 12:51:42
- Log: Subject: retry [PATCH] 5.004_59: the perlhist.pod etc
- Date: Thu, 19 Feb 1998 17:54:52 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3306] By: gsar on 1999/05/05 17:17:34
+ Log: applied non-conflicting parts of suggested patch
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Sat, 27 Mar 1999 00:16:51 -0400 (EDT)
+ Message-id: <01J9AZY8I2PW001O2S@mail.newman.upenn.edu>
+ Subject: [Patch 5.005_56] Revised VMS patch
Branch: perl
- ! ext/Thread/Thread.pm ext/Thread/Thread/Queue.pm
- ! ext/Thread/Thread/Semaphore.pm ext/Thread/Thread/Specific.pm
- ! lib/fields.pm pod/buildtoc pod/perl.pod pod/perlhist.pod
- ! pod/perltoc.pod pod/perlvar.pod
+ ! Changes ext/B/defsubs.h.PL hv.c iperlsys.h perl.c
+ ! pod/perldiag.pod proto.h util.c vms/perlvms.pod vms/vms.c
____________________________________________________________________________
-[ 556] By: mbeattie on 1998/02/20 12:49:54
- Log: Subject: [PATCH] installperl
- Date: Wed, 18 Feb 1998 11:51:44 -0500 (est)
- From: Norton Allen <allen@huarp.harvard.edu>
+[ 3305] By: gsar on 1999/05/05 16:20:19
+ Log: make perldoc use backslashed pathnames within system() on win32
Branch: perl
- ! installperl
+ ! pod/perldiag.pod pod/perlthrtut.pod utils/perldoc.PL
____________________________________________________________________________
-[ 555] By: mbeattie on 1998/02/20 12:49:09
- Log: Subject: [PATCH:_59] t/op/wantarray.t
- Date: Wed, 18 Feb 1998 11:19:54 -0500 (est)
- From: Norton Allen <allen@huarp.harvard.edu>
+[ 3304] By: gsar on 1999/05/05 07:29:43
+ Log: upgrade Pod::Parser to v1.081 from CPAN
Branch: perl
- + t/op/wantarray.t
+ ! lib/Pod/Checker.pm lib/Pod/InputObjects.pm lib/Pod/Parser.pm
+ ! lib/Pod/PlainText.pm lib/Pod/Select.pm lib/Pod/Usage.pm
+ ! t/pod/special_seqs.t t/pod/special_seqs.xr t/pod/testp2pt.pl
____________________________________________________________________________
-[ 554] By: mbeattie on 1998/02/20 12:47:44
- Log: Subject: Misprint in regcomp.c [PATCH]
- Date: Tue, 17 Feb 1998 23:54:07 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 3303] By: gsar on 1999/05/05 07:02:07
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Fri, 19 Mar 1999 12:31:35 -0500 (EST)
+ Message-Id: <Pine.GSU.4.05.9903191208250.8899-100000@newton.phys>
+ Subject: [PATCH 5.005_03-MT3] INSTALL patches
Branch: perl
- ! regcomp.c
+ ! INSTALL
____________________________________________________________________________
-[ 553] By: mbeattie on 1998/02/20 12:45:08
- Log: Subject: DB_File ->length does not work just after tie.
- Date: Tue, 17 Feb 1998 13:19:18 GMT
- From: Nick Ing-Simmons <nik@tiuk.ti.com>
+[ 3302] By: gsar on 1999/05/05 06:55:21
+ Log: load base packages based on nonexistent $VERSION
+ From: andreas.koenig@anima.de (Andreas J. Koenig)
+ Date: 19 Mar 1999 06:00:28 +0100
+ Message-ID: <sfcsob2m5ub.fsf@dubravka.in-berlin.de>
+ Subject: Re: base.pm flaw
Branch: perl
- ! ext/DB_File/DB_File.xs
+ ! lib/base.pm lib/locale.pm
____________________________________________________________________________
-[ 552] By: mbeattie on 1998/02/20 12:43:32
- Log: Subject: [PATCH] - perl5.005_59, update Copyright
- Date: Mon, 16 Feb 1998 20:31:06 -0500 (EST)
- From: lusol@CS4.CC.Lehigh.EDU (Stephen O. Lidie)
+[ 3301] By: gsar on 1999/05/04 05:41:08
+ Log: pod2man outputs switched date and revision label (fix suggested by
+ EthanSasiela@mede.com)
Branch: perl
- ! perl.c
+ ! pod/pod2man.PL
____________________________________________________________________________
-[ 551] By: mbeattie on 1998/02/20 12:42:41
- Log: Subject: Re: for() and map() peculiarity
- Date: Mon, 16 Feb 1998 21:33:44 +0000
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+[ 3300] By: gsar on 1999/05/03 18:48:25
+ Log: adjust win32_stat() to cope with FindFirstFile() and stat() bugs
+ (makes opendir(D,"c:") work reliably)
Branch: perl
- ! pod/perlsyn.pod
+ ! win32/win32.c
____________________________________________________________________________
-[ 550] By: mbeattie on 1998/02/20 12:41:53
- Log: Subject: [PATCH 5.004_59] Updates to VMS/CONFIG.VMS
- Date: Mon, 16 Feb 1998 11:46:29 -0800
- From: Dan Sugalski <sugalskd@osshe.edu>
+[ 3299] By: gsar on 1999/05/02 19:39:55
+ Log: add test case for change#3298
Branch: perl
- ! vms/config.vms
+ ! sv.c t/op/readdir.t
____________________________________________________________________________
-[ 549] By: mbeattie on 1998/02/20 12:40:55
- Log: Subject: [PATCH] 5.004_59 global.sym for AIX 3.2.5
- Date: Mon, 16 Feb 1998 14:27:53 -0500 (EST)
- From: "Stephen O. Lidie" <lusol@turkey.cc.Lehigh.EDU>
+[ 3298] By: gsar on 1999/05/02 19:24:41
+ Log: close directory handles properly when localized
Branch: perl
- ! global.sym
+ ! sv.c
____________________________________________________________________________
-[ 548] By: mbeattie on 1998/02/20 12:39:56
- Log: Subject: [PATCH] 5.004_59: hints/irix_6.sh
- Date: Mon, 16 Feb 1998 15:44:57 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3297] By: jhi on 1999/04/30 11:42:14
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes config_h.SH configure.com lib/AutoLoader.pm
+ !> lib/AutoSplit.pm lib/File/Path.pm pod/perlre.pod pp.c pp_ctl.c
+ !> pp_sys.c proto.h regcomp.c t/op/die.t t/op/ref.t util.c
+ !> vms/descrip_mms.template vms/gen_shrfls.pl vms/munchconfig.c
+ !> vms/subconfigure.com win32/win32.c
+____________________________________________________________________________
+[ 3293] By: chip on 1999/04/29 18:50:49
+ Log: Fix shebang lines.
+ Branch: maint-5.004/perl
+ ! Porting/p4d2p h2pl/mksizes pod/checkpods.PL pod/pod2html.PL
+ ! pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL utils/c2ph.PL
+ ! utils/h2ph.PL utils/h2xs.PL utils/perlbug.PL utils/perldoc.PL
+ ! utils/pl2pm.PL utils/splain.PL win32/bin/search.pl
+ ! x2p/find2perl.PL x2p/s2p.PL
+____________________________________________________________________________
+[ 3284] By: gsar on 1999/04/27 00:48:42
+ Log: integrate change#3279 from maint-5.004
Branch: perl
- ! hints/irix_6.sh
+ ! lib/AutoLoader.pm
____________________________________________________________________________
-[ 547] By: mbeattie on 1998/02/20 12:38:58
- Log: Subject: [PATCH] perlguts update
- Date: 16 Feb 1998 11:23:53 +0100
- From: Gisle Aas <gisle@aas.no>
+[ 3279] By: chip on 1999/04/26 23:09:26
+ Log: Make &AutoLoad::AUTOLOAD reentrant.
+ Branch: maint-5.004/perl
+ ! lib/AutoLoader.pm
+____________________________________________________________________________
+[ 3276] By: chip on 1999/04/26 22:34:36
+ Log: Make porting scripts executable.
+ Branch: maint-5.004/perl
+ ! Changes Porting/genlog Porting/makerel Porting/p4desc
+ ! Porting/patchls
+____________________________________________________________________________
+[ 3274] By: gsar on 1999/04/26 17:30:31
+ Log: allow embedded null characters in diagnostics
Branch: perl
- ! pod/perlguts.pod
+ ! pp_ctl.c pp_sys.c proto.h regcomp.c t/op/die.t util.c
____________________________________________________________________________
-[ 546] By: mbeattie on 1998/02/20 12:38:01
- Log: Subject: [PATCH 5.004_59] bsdos/hints.sh is wrong
- Date: Sun, 15 Feb 1998 23:56:05 -0500
- From: Irving Reid <irving@tor.securecomputing.com>
+[ 3273] By: gsar on 1999/04/26 08:27:22
+ Log: hand-applied conflicting parts of suggested patch
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Wed, 17 Mar 1999 23:55:23 -0400 (EDT)
+ Message-id: <01J8YELSL7WK001E7S@mail.newman.upenn.edu>
+ Subject: [PATCH 5.005_56] VMS configuration/build
Branch: perl
- ! hints/bsdos.sh
+ ! configure.com vms/descrip_mms.template vms/gen_shrfls.pl
+ ! vms/munchconfig.c vms/subconfigure.com
____________________________________________________________________________
-[ 545] By: mbeattie on 1998/02/20 12:37:11
- Log: Subject: [PATCH] 5% speedup in an empty loop
- Date: Sun, 15 Feb 1998 17:49:46 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 3272] By: gsar on 1999/04/26 08:25:41
+ Log: update Changes; tweak minor regressions
Branch: perl
- ! op.c
+ ! Changes lib/AutoSplit.pm lib/File/Path.pm
____________________________________________________________________________
-[ 544] By: mbeattie on 1998/02/20 12:36:26
- Log: Subject: [PATCH for 5.004_59] netdb_host_type and netdb_hlen_type on NeXt
- Date: Sun, 15 Feb 98 23:06:16 +0100
- From: Hans Mulder <hansm@icgroup.nl>
+[ 3271] By: gsar on 1999/04/26 07:52:51
+ Log: integrate change#3229 from maint-5.004
Branch: perl
- ! hints/next_3.sh hints/next_4.sh
+ ! pp_ctl.c util.c
____________________________________________________________________________
-[ 543] By: mbeattie on 1998/02/20 12:35:39
- Log: Subject: [PATCH for 5.004_59] Perl_sbrk declared inconsistently
- Date: Sun, 15 Feb 98 23:05:20 +0100
- From: Hans Mulder <hansm@icgroup.nl>
+[ 3270] By: gsar on 1999/04/25 22:58:27
+ Log: fix buggy reference count on refs to SVs with autoviv magic
+ (resulted in C<my @a; $a[1] = 1; print \$_ for @a> and Data::Dumper
+ accessing free()d memory)
Branch: perl
- ! malloc.c
+ ! pp.c t/op/ref.t
____________________________________________________________________________
-[ 542] By: mbeattie on 1998/02/20 12:35:03
- Log: Subject: [PATCH for 5.004_59] "d_gethbyname" misspelled in Configure
- From: Hans Mulder <hansm@icgroup.nl>
- Date: Sun, 15 Feb 98 23:04:29 +0100
+[ 3269] By: gsar on 1999/04/24 17:07:55
+ Log: fix bug in change#3123 (off-by-one, caused C<qx[noargs]> to fail
+ on win32)
Branch: perl
- ! Configure
+ ! win32/win32.c
____________________________________________________________________________
-[ 541] By: mbeattie on 1998/02/20 12:33:56
- Log: Subject: [PATCH for 5.004_59] NeXT doesn't need DONT_DECLARE_STD (was:
- NeXT needs DONT_DECLARE_STD)
- Date: Sun, 15 Feb 98 23:04:19 +0100
- From: Hans Mulder <hansm@icgroup.nl>
+[ 3268] By: gsar on 1999/04/24 16:38:25
+ Log: kill dup hunk
Branch: perl
- ! perl.h
+ ! config_h.SH
+____________________________________________________________________________
+[ 3267] By: gsar on 1999/04/24 16:35:57
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ +> myconfig.SH
+ - myconfig
+ ! pod/perlre.pod
+ !> (integrate 38 files)
+____________________________________________________________________________
+[ 3266] By: jhi on 1999/04/23 18:42:44
+ Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: perl5-porters@perl.org, Jarkko Hietaniemi <jhi@iki.fi>,
+ Graham Barr <gbarr@pobox.com>, Gurusamy Sarathy <gsar@activestate.com>
+ Cc: Lionel Cons <lionel.cons@cern.ch>,
+ Ilya Zakharevich <ilya@math.ohio-state.edu>,
+ David Hayes <david@bdel.com>
+ Subject: [PATCH] h2ph
+ Date: Fri, 23 Apr 1999 12:37:23 -0400
+ Message-ID: <19990423123723.A49550@O2.chapin.edu>
+ Branch: cfgperl
+ ! utils/h2ph.PL
+____________________________________________________________________________
+[ 3265] By: jhi on 1999/04/21 18:17:12
+ Log: From: lane@duphy4.physics.drexel.edu (by way of Dan Sugalski <sugalskd@ous.edu>)
+ To: perlbug@perl.org
+ Subject: [PATCH Perl 5.005.56] descrip_mms.template installed files fix
+ Date: Wed, 21 Apr 1999 08:17:54 -0700
+ Message-Id: <3.0.6.32.19990421081754.03127b60@ous.edu>
+ Branch: cfgperl
+ ! vms/descrip_mms.template
+____________________________________________________________________________
+[ 3264] By: jhi on 1999/04/20 08:50:54
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: The Perl Porters Mailing List <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_56] Re: 5.006 Todo
+ Date: Mon, 19 Apr 1999 16:27:07 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9904191623470.7838-100000@newton.phys>
+ Branch: cfgperl
+ ! Porting/pumpkin.pod
+____________________________________________________________________________
+[ 3263] By: jhi on 1999/04/20 08:05:01
+ Log: From: Chip Salzenberg <chip@perlsupport.com>
+ To: Perl 5 Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_56] Configure: $sig_count
+ Date: Sun, 18 Apr 1999 17:54:36 -0400
+ Message-ID: <19990418175436.A27496@perlsupport.com>
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 3262] By: jhi on 1999/04/19 18:23:50
+ Log: Subject: PATCH wrong faq reference in perlbook.pod
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ To: perlbug@perl.com
+ Date: Fri, 9 Apr 1999 16:05:23 +0100 (BST)
+ Message-Id: <199904091505.QAA03757@cyclone.cise.npl.co.uk>
+ Branch: cfgperl
+ ! pod/perlbook.pod
+____________________________________________________________________________
+[ 3261] By: jhi on 1999/04/15 13:59:04
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Hugo van der Sanden <hugo@corp.netcom.net.uk>
+ Cc: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH] Re: 5.005_03 and gcc, GNU ld under Solaris 2.6
+ Date: Wed, 14 Apr 1999 17:07:43 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9904141658290.4262-100000@newton.phys>
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 3260] By: jhi on 1999/04/15 13:56:53
+ Log: From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: PATCH: 5.005_56: perldata.pod (UPDATE)
+ Date: Thu, 15 Apr 1999 07:13:41 -0600
+ Message-Id: <199904151313.HAA07682@jhereg.perl.com>
+ Branch: cfgperl
+ ! pod/perldata.pod
+____________________________________________________________________________
+[ 3259] By: jhi on 1999/04/13 23:12:52
+ Log: LDLIBPTH also on 'clean' targets.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 3258] By: jhi on 1999/04/13 21:38:46
+ Log: Add information about the two DEC C compiler optimizer bugs
+ (what patch levels of the compilers fix them).
+ Branch: cfgperl
+ ! pp.c t/op/repeat.t
+____________________________________________________________________________
+[ 3257] By: jhi on 1999/04/13 14:25:08
+ Log: Be polite about ccdlflags and lddflags, too.
+ Avoid Perl's malloc only when threaded.
+ Branch: cfgperl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 3256] By: jhi on 1999/04/13 10:21:33
+ Log: Croak if no known ways to semctl() (don't assume union semun).
+ Branch: cfgperl
+ ! doio.c perl.h
+____________________________________________________________________________
+[ 3255] By: jhi on 1999/04/13 09:10:26
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [Patch 5.005/5.006]Another MM_VMS.pm patch
+ Date: Mon, 12 Apr 1999 13:36:48 -0700
+ Message-Id: <3.0.6.32.19990412133648.030e7ec0@ous.edu>
+ Branch: cfgperl
+ ! lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 3254] By: jhi on 1999/04/13 06:56:26
+ Log: From: "Todd C. Miller" <Todd.Miller@courtesan.com>
+ To: perlbug@perl.com
+ Subject: Update for OpenBSD hints
+ Date: Mon, 12 Apr 1999 23:12:22 -0600 (MDT)
+ Message-Id: <199904130512.XAA27712@xerxes.courtesan.com>
+ Branch: cfgperl
+ ! hints/openbsd.sh
+____________________________________________________________________________
+[ 3229] By: chip on 1999/04/13 04:04:14
+ Log: Preserve errno from importunities of sfio.
+ Branch: maint-5.004/perl
+ ! pp_ctl.c util.c
+____________________________________________________________________________
+[ 3226] By: jhi on 1999/04/11 12:52:26
+ Log: If both ways to call semctl are broken, skip the tests.
+ Branch: cfgperl
+ ! t/lib/ipc_sysv.t
+____________________________________________________________________________
+[ 3225] By: jhi on 1999/04/10 22:27:28
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: dsembr01@ox.slug.louisville.edu
+ Cc: perlbug@perl.com
+ Subject: [PATCH 5.004_05 5.005_03 5.005_56] Re: Misspelled macro in ext/POSIX/POSIX.xs?
+ Date: Fri, 9 Apr 1999 16:58:08 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9904091648570.894-100000@newton.phys>
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 3224] By: jhi on 1999/04/09 18:50:32
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_56] Re: prefix= in hints
+ Date: Fri, 9 Apr 1999 14:54:18 -0400 (EDT)
+ Message-Id: <Pine.GSU.4.05.9904091445280.894-100000@newton.phys>
+
+ (Overrides change #3204 from Kurt)
+ Branch: cfgperl
+ ! hints/linux.sh
+____________________________________________________________________________
+[ 3223] By: jhi on 1999/04/09 18:37:55
+ Log: Understand Apollo's //node notation.
+
+ From: Johann Klasek <jk@auto.tuwien.ac.at>
+ To: jhi@iki.fi
+ Subject: Re: DomainPerl
+ Date: Fri, 9 Apr 1999 18:21:37 +0200
+ Message-ID: <19990409182137.A2299@euklid.auto.tuwien.ac.at>
+ Branch: cfgperl
+ ! lib/Cwd.pm
____________________________________________________________________________
-[ 540] By: mbeattie on 1998/02/20 12:32:25
- Log: Subject: [PATCH] sv_check_thinkfirst macroized
- Date: 15 Feb 1998 22:00:38 +0100
- From: Gisle Aas <gisle@aas.no>
+[ 3220] By: jhi on 1999/04/04 16:33:49
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 39 files)
+____________________________________________________________________________
+[ 3219] By: gsar on 1999/04/04 02:48:17
+ Log: tweak previous change
+ Branch: maint-5.005/perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3218] By: gsar on 1999/04/04 02:44:47
+ Log: be careful about extending the stack for the Win32:: builtins
+ Branch: maint-5.005/perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3217] By: gsar on 1999/04/04 01:59:26
+ Log: correct places that said newSVpv() when they meant newSVpvn()
+ Branch: perl
+ ! XSUB.h dump.c ext/B/B.xs ext/B/defsubs.h.PL
+ ! ext/DB_File/DB_File.xs ext/DynaLoader/dl_vms.xs
+ ! ext/IPC/SysV/SysV.xs ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs
+ ! ext/Socket/Socket.xs ext/attrs/attrs.xs gv.c hv.c hv.h
+ ! jpl/JNI/JNI.xs mg.c op.c perl.c pod/perlguts.pod pp.c pp_ctl.c
+ ! pp_sys.c regcomp.c toke.c util.c win32/dl_win32.xs
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3216] By: gsar on 1999/04/03 23:58:27
+ Log: avoid duplicate code
Branch: perl
! sv.c
____________________________________________________________________________
-[ 539] By: mbeattie on 1998/02/20 12:31:07
- Log: Subject: [PATCH 5.004_59] allow the Test::Harness to grok TODO-type tests docs
- Date: Sat, 14 Feb 1998 17:58:01 -0500
- From: Joshua Pritikin <pritikin@mindspring.com>
+[ 3215] By: gsar on 1999/04/03 23:14:34
+ Log: grow PL_tmps_stack more efficiently; make it more amenable to
+ STRESS_REALLOC testing
Branch: perl
- + lib/Test.pm
- ! MANIFEST lib/Test/Harness.pm
+ ! embed.h embed.pl global.sym objXSUB.h pp.h proto.h scope.c
+ ! sv.c
____________________________________________________________________________
-[ 538] By: mbeattie on 1998/02/20 12:24:31
- Log: Subject: [PATCH] 5.004_59: locale startup problems documentation++
- Date: Sat, 14 Feb 1998 15:40:44 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 3214] By: gsar on 1999/04/03 21:01:09
+ Log: scrounge and save three extra branches in pp_entersub()
Branch: perl
- ! INSTALL pod/perldiag.pod pod/perllocale.pod
+ ! cv.h pp_ctl.c pp_hot.c
____________________________________________________________________________
-[ 537] By: mbeattie on 1998/02/20 12:23:04
- Log: Subject: [PATCH] Updated, non-wordwrapped, patch to README.VMS
- Date: Fri, 13 Feb 1998 13:38:28 -0800
- From: Dan Sugalski <sugalskd@osshe.edu>
+[ 3213] By: gsar on 1999/04/03 17:43:23
+ Log: remove duplicate code and an extra branch in sv_setsv() and
+ other hot code by making SvTHINKFIRST() think about FAKE SVs
Branch: perl
- ! README.vms
+ ! doio.c embed.h embed.pl global.sym objXSUB.h pp.c pp_hot.c
+ ! proto.h scope.c sv.c sv.h
____________________________________________________________________________
-[ 536] By: mbeattie on 1998/02/20 12:20:29
- Log: Subject: [PATCH] 5.004_58, move intuition tests
- Date: Thu, 12 Feb 1998 17:11:05 -0600
- From: Stephen Potter <spp@psa.pencom.com>
- Branch: perl
- ! t/lib/anydbm.t t/lib/gdbm.t t/lib/ndbm.t t/lib/odbm.t
- ! t/lib/sdbm.t t/op/array.t t/op/delete.t t/op/each.t
- ! t/op/flip.t t/op/pat.t t/op/push.t
-____________________________________________________________________________
-[ 535] By: gsar on 1998/02/19 23:07:24
- Log: applied a version of this with tabs intact
- Message-Id: <wklnv7pdf5.fsf@turangalila.harmonixmusic.com>
- Date: 19 Feb 1998 15:06:38 EST
- From: dfan@harmonixmusic.com (Dan Schmidt)
- Subject: Pod::Html bug and fix: missing </UL> in index
- Branch: win32/perl
- ! lib/Pod/Html.pm
+[ 3212] By: jhi on 1999/04/03 16:20:09
+ Log: Fix up some _t nits (Pid_t, Gid_t, Uid_t, etc. instead of int).
+
+ From: John Bley <jbb6@acpub.duke.edu>
+ To: perlbug@perl.org
+ Subject: [PATCH]5.005_03 (CORE) Fix some _t nits
+ Date: Thu, 1 Apr 1999 02:01:47 -0500 (EST)
+ Message-ID: <Pine.SOL.3.91.990401015805.21458A-100000@soc13.acpub.duke.edu>
+ Branch: cfgperl
+ ! doio.c pp_sys.c
____________________________________________________________________________
-[ 534] By: gsar on 1998/02/19 19:40:27
- Log: Fix C<0> problem in Pod::Html
- Branch: win32/perl
- ! lib/Pod/Html.pm
+[ 3211] By: jhi on 1999/04/03 13:27:26
+ Log: Change #3210 was rather unportable. This is better.
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 533] By: gsar on 1998/02/18 18:11:08
- Log: non-debug VC builds are -O1 now (they say it works, and is
- faster)
- Branch: win32/perl
- ! win32/Makefile win32/makefile.mk
+[ 3210] By: jhi on 1999/04/03 13:16:20
+ Log: Avoid Digital UNIX' ksh.
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ To: Henrik Tougaard <ht000@siberut.foa.dk>
+ Cc: perlbug@perl.com, ht000@foa.dk
+ Subject: Re: Not OK perl5.005_03-MAINT_TRIAL_4
+ Date: Wed, 27 Jan 1999 16:52:33 +0200 (EET)
+ Message-ID: <13999.10289.319422.239987@alpha.hut.fi>
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3209] By: jhi on 1999/04/03 12:49:04
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes Makefile.SH README installperl t/lib/bigfloatpm.t
+____________________________________________________________________________
+[ 3208] By: jhi on 1999/04/03 12:27:24
+ Log: Add -mabi=64 to ccflags for 64-bit IRIX gcc.
+
+ From: Lionel Cons <lionel.cons@cern.ch>
+ To: jhi@iki.fi
+ Cc: perlbug@perl.com, kstar@isinet.com,
+ Philippe Defert <philippe.defert@cern.ch>
+ Subject: Re: Not OK: perl 5.00503 on IP27-irix 6.5 (UNINSTALLED)
+ Date: Thu, 1 Apr 1999 14:05:28 +0200 (METDST)
+ Message-Id: <199904011205.OAA11380@mercury.cern.ch>
+ Branch: cfgperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 3207] By: jhi on 1999/04/03 12:20:21
+ Log: Be polite about usemymalloc.
+ Branch: cfgperl
+ ! hints/aix.sh
____________________________________________________________________________
-[ 532] By: gsar on 1998/02/18 04:11:03
- Log: integrate nick's patch to mainline
- Branch: win32/perl
- !> pp.c
-____________________________________________________________________________
-[ 531] By: mbeattie on 1998/02/17 17:50:50
- Log: Assorted changes to the compiler
- Branch: perlext
- ! Compiler/B.pm Compiler/B.xs Compiler/B/Asmdata.pm
- ! Compiler/B/Bytecode.pm Compiler/B/C.pm Compiler/B/Debug.pm
- ! Compiler/NOTES Compiler/O.pm Compiler/bytecode.pl
- ! Compiler/byterun.c Compiler/byterun.h Compiler/typemap
-____________________________________________________________________________
-[ 530] By: gsar on 1998/02/17 01:47:35
- Log: DLLs are now ok on mingw32/gcc-2.8.0 after removing the
- FORCE_ARG_STRING() hack (that bug is fixed in gcc now). mingw32
- build passes all tests except t/lib/io_xs.t (seems to be due to
- broken tmpfile() in the CRT or import lib)
- Branch: win32/perl
- ! XSUB.h win32/makefile.mk win32/win32.h
-____________________________________________________________________________
-[ 529] By: gsar on 1998/02/16 23:03:31
- Log: fix mingw32 gcc 2.8.0 build (DLLs generated seem to be broken
- in this version of gcc!)
- Branch: win32/perl
- ! doio.c pp_sys.c win32/config.gc win32/makefile.mk
- ! win32/win32.c win32/win32.h win32/win32iop.h x2p/a2p.h
-____________________________________________________________________________
-[ 528] By: nick on 1998/02/16 22:13:04
- Log: Missing PUSHMARK in unshift TIEARRAY hook
+[ 3206] By: gsar on 1999/04/02 23:31:59
+ Log: a typo in change#3205
Branch: perl
- ! pp.c
+ ! t/lib/bigfloatpm.t
____________________________________________________________________________
-[ 527] By: gsar on 1998/02/15 20:59:07
- Log: integrate win32 branch
- Branch: asperl
- !> config_h.SH win32/config.bc win32/config.gc win32/config.vc
- !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
- !> win32/makedef.pl
+[ 3205] By: gsar on 1999/04/02 23:20:31
+ Log: make testsuite reflect change#3157 (Math::BigFloat->new now
+ returns NaNs faithfully)
+ Branch: perl
+ ! t/lib/bigfloatpm.t
____________________________________________________________________________
-[ 526] By: gsar on 1998/02/15 20:02:11
- Log: Fix typo: s/GETNETBYADD\b/GETNETBYADDR/
- Branch: win32/perl
- ! config_h.SH win32/config_H.bc win32/config_H.gc
- ! win32/config_H.vc
+[ 3204] By: jhi on 1999/04/02 22:03:23
+ Log: On -Uinstallusrbinperl and no -Dprefix, set prefix to /usr/local.
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: perl5-porters@perl.org
+ Subject: linux hints nit
+ Date: Fri, 2 Apr 1999 16:49:47 -0500
+ Message-ID: <19990402164947.E80926@O2.chapin.edu>
+ Branch: cfgperl
+ ! hints/linux.sh
____________________________________________________________________________
-[ 525] By: gsar on 1998/02/15 03:26:45
- Log: fix build problems due to renamed Config variables
- Branch: win32/perl
- ! win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/makedef.pl
-____________________________________________________________________________
-[ 524] By: gsar on 1998/02/14 01:00:15
- Log: bring ASPerl uptodate with mainline changes
- Branch: asperl
- +> ext/DB_File/Changes t/comp/require.t
- !> (integrate 41 files)
-____________________________________________________________________________
-[ 523] By: gsar on 1998/02/14 00:52:17
- Log: integrate mainline
- Branch: win32/perl
- !> hints/qnx.sh lib/Cwd.pm lib/ExtUtils/xsubpp patchlevel.h
- !> pp_hot.c t/op/magic.t
-____________________________________________________________________________
-[ 522] By: gsar on 1998/02/14 00:42:37
- Log: added AS patch#6
- Message-Id: <01BD3846.B29FB880.dougl@ActiveState.com>
- Date: Fri, 13 Feb 1998 06:14:51 PST
- From: Douglas Lankshear <dougl@ActiveState.com>
- Subject: [PATCH] command line build
+[ 3203] By: jhi on 1999/04/02 22:00:56
+ Log: Display exact glibc version in Linux.
+
+ From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: Displaying glibc version on Linux
+ Date: Mon, 29 Mar 1999 15:04:26 -0500 (EST)
+ Message-Id: <Pine.GSU.4.05.9903291417370.15335-100000@newton.phys>
+ Branch: cfgperl
+ ! hints/linux.sh
+____________________________________________________________________________
+[ 3202] By: gsar on 1999/04/02 21:23:18
+ Log: various little goofs
+ Branch: perl
+ ! Changes Makefile.SH README installperl
+____________________________________________________________________________
+[ 3201] By: jhi on 1999/04/02 13:13:39
+ Log: Configure regen.
- This patch is for the command line build of perl object.
- I'll merge the ipfoo.c function with win32_xxx functions next.
+ Add llseek + offset_t probing.
+ Change CONFIG to CONFIGDOTSH.
+ 'unset foo' is unportable, use foo=''.
+ Branch: cfgperl
+ ! Configure Makefile.SH Policy_sh.SH cflags.SH config_h.SH
+ ! configpm makeaperl.SH makedepend.SH makedir.SH myconfig.SH
+ ! perl_exp.SH writemain.SH
+____________________________________________________________________________
+[ 3200] By: jhi on 1999/04/02 12:06:22
+ Log: Introduce myconfig.SH.
- -- Doug
- Branch: asperl
- ! ObjXSub.h ext/Opcode/Opcode.xs lib/ExtUtils/MM_Win32.pm
- ! objpp.h proto.h sv.c win32/dl_win32.xs win32/ipenv.c
- ! win32/ipstdio.c win32/makedef.pl win32/runperl.c win32/win32.h
-____________________________________________________________________________
-[ 521] By: gsar on 1998/02/14 00:14:04
- Log: added AS patch#5 (patch #4 was intentionally skipped after
- discussion)
- Branch: asperl
- ! embed.h embedvar.h global.sym globals.c hv.c interp.sym
- ! intrpvar.h op.c perl.c perl.h pp_ctl.c proto.h regcomp.c
- ! regexec.c sv.c toke.c
-____________________________________________________________________________
-[ 520] By: nick on 1998/02/13 18:15:46
- Log: Resolve ansiperl against win32
- Branch: ansiperl
- +> ext/DB_File/Changes ext/POSIX/hints/linux.pl
- +> ext/POSIX/hints/sunos_4.pl lib/Fatal.pm t/comp/require.t
- +> t/lib/ph.t
- !> (integrate 898 files)
-
-----------------
-Version 5.004_59
-----------------
-
+ From: Andy Dougherty <doughera@lafayette.edu>
+ To: Jarkko Hietaniemi <jhi@iki.fi>
+ Cc: Nick Ing-Simmons <nik@tiuk.ti.com>, Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH] myconfig.SH (was Re: perl install bug on AIX 4.3.1.0)
+ Date: Tue, 30 Mar 1999 12:41:29 -0500 (EST)
+ Message-Id: <Pine.GSU.4.05.9903301222280.15987-100000@newton.phys>
+ Branch: cfgperl
+ + myconfig.SH
+ - myconfig
+ ! MANIFEST
+____________________________________________________________________________
+[ 3195] By: jhi on 1999/03/28 16:42:54
+ Log: Update perlhist on 5_03.
+ Branch: maint-5.005/perl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 3194] By: jhi on 1999/03/28 12:30:01
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> t/op/grep.t
+ ! lib/Math/BigFloat.pm lib/Math/BigInt.pm lib/bigfloat.pl
+ ! t/lib/bigintpm.t
+ !> MANIFEST Porting/p4desc ext/Thread/Thread.xs op.c
+ !> t/lib/thread.t
+____________________________________________________________________________
+[ 3189] By: gsar on 1999/03/28 08:22:00
+ Log: various pod niggles
+ Branch: maint-5.005/perl
+ ! pod/perl.pod pod/perldebug.pod pod/perldiag.pod
+ ! pod/perlfunc.pod pod/perlhist.pod
+____________________________________________________________________________
+[ 3187] By: gsar on 1999/03/28 07:31:16
+ Log: regularize CAPI declarations (CAPI extensions now build under
+ the Borland compiler)
+ Branch: maint-5.005/perl
+ ! win32/GenCAPI.pl
+____________________________________________________________________________
+[ 3186] By: gsar on 1999/03/28 07:26:33
+ Log: ensure XS_LOCKS stuff happens *before* XSUB is entered under
+ -DPERL_CAPI
+ Branch: maint-5.005/perl
+ ! XSlock.h win32/GenCAPI.pl win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 519] By: mbeattie on 1998/02/13 17:05:37
- Log: Integrate win32 into mainline.
+[ 3183] By: gsar on 1999/03/28 06:00:46
+ Log: update p4 utility to ignore non-text files
Branch: perl
- ! lib/ExtUtils/xsubpp
- !> win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- !> win32/makefile.mk
+ ! Porting/p4desc
____________________________________________________________________________
-[ 518] By: mbeattie on 1998/02/13 17:01:16
- Log: Bump patchlevel.h to 59.
+[ 3181] By: gsar on 1999/03/28 03:37:23
+ Log: integrate change#3179 from maint-5.005
Branch: perl
- ! patchlevel.h
+ !> ext/Thread/Thread.xs t/lib/thread.t
____________________________________________________________________________
-[ 517] By: mbeattie on 1998/02/13 16:57:59
- Log: Subject: [PATCH] _58: wantarray in void context broken
- Date: Fri, 13 Feb 1998 11:24:49 -0500 (est)
- From: Norton Allen <allen@huarp.harvard.edu>
+[ 3180] By: gsar on 1999/03/28 02:28:20
+ Log: fix bogus OPf_REF context for the BLOCK in C<grep BLOCK @foo>
+ (sometimes caused bizarreness in the BLOCK)
Branch: perl
- ! pp_hot.c
+ + t/op/grep.t
+ ! MANIFEST op.c
____________________________________________________________________________
-[ 516] By: mbeattie on 1998/02/13 16:55:33
- Log: Subject: [PATCH] 5.004_58 QNX getcwd
- Date: Thu, 12 Feb 1998 13:40:56 -0500 (est)
- From: Norton Allen <allen@huarp.harvard.edu>
+[ 3179] By: gsar on 1999/03/28 02:14:04
+ Log: fix thread segfault when passing large number of arguments to child
+ a la C<Thread->new($foo, 1..1000)>
+ Branch: maint-5.005/perl
+ ! ext/Thread/Thread.xs t/lib/thread.t
+____________________________________________________________________________
+[ 3178] By: gbarr on 1999/03/28 01:39:23
+ Log: fix $Config{'usethreads'} typo in perlthrtut
+
+ From: Ian Maloney <szhmf9@wsblob.ubs.com>
+ Date: Thu, 25 Mar 1999 16:40:14 +0100 (MET)
+ Message-Id: <199903251540.QAA02439@wsblob.>
+ Subject: perlthrtut documentation error
+ Branch: maint-5.005/perl
+ ! pod/perlthrtut.pod
+____________________________________________________________________________
+[ 3173] By: gbarr on 1999/03/27 18:19:47
+ Log: Update Test.pm to VERSION 1.122 from CPAN
+ Branch: maint-5.005/perl
+ ! lib/Test.pm
+____________________________________________________________________________
+[ 3171] By: jhi on 1999/03/26 22:38:28
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 37 files)
+____________________________________________________________________________
+[ 3170] By: gsar on 1999/03/26 01:30:25
+ Log: specify type of bracket in "Unmatched bracket" diagnostic;
+ prefer 'brace' or 'curly bracket' over 'curly brace'
Branch: perl
- ! hints/qnx.sh lib/Cwd.pm t/op/magic.t
+ ! pod/perldiag.pod pod/perlreftut.pod pod/perlstyle.pod
+ ! t/op/misc.t t/op/re_tests toke.c
____________________________________________________________________________
-[ 515] By: gsar on 1998/02/12 18:29:52
- Log: pickup lddlflags properly for Config.pm
- Branch: win32/perl
- ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
- ! win32/makefile.mk
+[ 3169] By: gsar on 1999/03/26 00:50:51
+ Log: better description of "Integer overflow" diagnostic
+ Branch: perl
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 514] By: gsar on 1998/02/12 18:16:09
- Log: fix xsubpp bug in SETMAGIC code
- Branch: win32/perl
- ! lib/ExtUtils/xsubpp
+[ 3168] By: gsar on 1999/03/25 11:02:46
+ Log: applied needful parts of suggested patch
+ From: "Vishal Bhatia" <vishalb@my-dejanews.com>
+ Date: Tue, 23 Mar 1999 16:21:43 -0800
+ Message-ID: <OOOKJGFMLFLHBAAA@my-dejanews.com>
+ Subject: [PATCH 5.005_56] pp_formline correction
+ Branch: perl
+ ! ext/B/B/Bblock.pm ext/B/B/CC.pm
____________________________________________________________________________
-[ 513] By: gsar on 1998/02/12 18:06:30
- Log: integrate mainline
- Branch: win32/perl
- +> ext/DB_File/Changes
- !> Configure MANIFEST config_h.SH ext/DB_File/DB_File.pm
- !> ext/DB_File/DB_File.xs hints/machten.sh
- !> lib/ExtUtils/Install.pm lib/Pod/Html.pm lib/Pod/Text.pm
- !> lib/perl5db.pl malloc.c pod/perldiag.pod pod/perlpod.pod
- !> pod/pod2man.PL pp_sys.c regcomp.c regexec.c scope.h sv.c
- !> t/lib/db-recno.t t/lib/filecopy.t t/op/misc.t t/op/pat.t
- !> t/op/re_tests t/pragma/locale.t
+[ 3167] By: gsar on 1999/03/25 10:39:02
+ Log: clarify what a "comment" means (due to Mark-Jason Dominus
+ <mjd@plover.com>)
+ Branch: perl
+ ! pod/perlsyn.pod
____________________________________________________________________________
-[ 512] By: mbeattie on 1998/02/12 17:34:02
- Log: Missing WITH_THR from new deb() in ENTER/LEAVE caused builds
- with -DUSE_THREADS -DDEBUGGING to fail.
+[ 3166] By: gsar on 1999/03/25 10:33:18
+ Log: describe current behavior on local($foo{nothere}) (suggested by
+ Lionel Cons <lionel.cons@cern.ch>)
Branch: perl
- ! scope.h
+ ! pod/perlsub.pod
____________________________________________________________________________
-[ 511] By: mbeattie on 1998/02/12 16:44:03
- Log: Integrate win32 into mainline
+[ 3165] By: gsar on 1999/03/25 06:21:05
+ Log: fix refcnt on PL_main_cv (variant of suggestion by Vishal Bhatia
+ <vishalb@hotmail.com>)
Branch: perl
- +> t/comp/require.t
- !> MANIFEST pp_ctl.c scope.c scope.h t/op/local.t toke.c
+ ! ext/B/B/C.pm
____________________________________________________________________________
-[ 510] By: mbeattie on 1998/02/12 16:42:26
- Log: Subject: Re: [PATCH] 5.004_58 | _04 DynaLoader.pm -> DynaLoader.pm.PL (resend)
- Date: 12 Feb 1998 14:25:55 +0100
- From: koenig@kulturbox.de (Andreas J. Koenig)
+[ 3164] By: gsar on 1999/03/25 06:17:27
+ Log: From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Tue, 23 Mar 1999 17:47:04 -0800 (PST)
+ Message-ID: <14072.16859.154428.241373@fre-76-120.reshall.berkeley.edu>
+ Subject: [PATCH _56] Compiler needs to know about utf8 SVOP tr///s
Branch: perl
- ! lib/ExtUtils/Install.pm
+ ! ext/B/B.xs op.h opcode.pl
____________________________________________________________________________
-[ 509] By: mbeattie on 1998/02/12 16:40:34
- Log: Subject: Re: wrong prototype for sbrk [PATCH]
- Date: Wed, 11 Feb 1998 15:37:31 -0500 (EST)
- From: Andy Dougherty <doughera@newton.phys.lafayette.edu>
+[ 3163] By: gsar on 1999/03/25 06:15:49
+ Log: B::Deparse update from Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Tue, 23 Mar 1999 02:41:34 -0800 (PST)
+ Message-ID: <14071.27445.867782.852353@fre-76-120.reshall.berkeley.edu>
+ Subject: [PATCH _56] B::Deparse 0.57
+ --
+ Date: Tue, 23 Mar 1999 13:08:12 -0800 (PST)
+ Message-ID: <14072.502.107712.175179@fre-76-120.reshall.berkeley.edu>
+ Subject: Re: [PATCH _56] B::Deparse 0.57
Branch: perl
- ! malloc.c
+ ! AUTHORS MAINTAIN ext/B/B/Deparse.pm
____________________________________________________________________________
-[ 508] By: mbeattie on 1998/02/12 16:36:53
- Log: Subject: [PATCH] 5.004_58 | _04: pod2*,perlpod: L<show this|man/section>
- Date: Wed, 11 Feb 1998 17:29:20 +0100
- From: Achim Bohnet <ach@mpe.mpg.de>
+[ 3162] By: gsar on 1999/03/25 06:11:46
+ Log: fix a few places that said 'int', but meant 'STRLEN'
Branch: perl
- ! lib/Pod/Html.pm lib/Pod/Text.pm pod/perlpod.pod pod/pod2man.PL
+ ! pod/perlguts.pod proto.h sv.c
____________________________________________________________________________
-[ 507] By: mbeattie on 1998/02/12 16:35:26
- Log: Subject: [PATCH] slight tweaks to hints/machten.sh
- Date: Wed, 11 Feb 1998 14:59:46 +0100
- From: Dominic Dunlop <domo@vo.lu>
+[ 3161] By: gsar on 1999/03/25 06:01:18
+ Log: From: Russ Allbery <rra@stanford.edu>
+ Date: 22 Mar 1999 04:26:26 -0800
+ Message-ID: <yl4sndr9ql.fsf@windlord.stanford.edu>
+ Subject: [5.005_56] Add EXISTS to SDBM_File and libsdbm
Branch: perl
- ! hints/machten.sh
+ ! ext/SDBM_File/SDBM_File.xs ext/SDBM_File/sdbm/README.too
+ ! ext/SDBM_File/sdbm/pair.c ext/SDBM_File/sdbm/pair.h
+ ! ext/SDBM_File/sdbm/sdbm.3 ext/SDBM_File/sdbm/sdbm.c
+ ! ext/SDBM_File/sdbm/sdbm.h pod/perldelta.pod t/lib/sdbm.t
____________________________________________________________________________
-[ 506] By: mbeattie on 1998/02/12 16:28:40
- Log: Subject: DB_File 1.58 patch
- Date: Tue, 10 Feb 1998 11:23:22 +0000 (GMT)
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+[ 3160] By: gsar on 1999/03/25 02:26:31
+ Log: better description of OP_UNSTACK (s/unstack/iteration finalizer/)
Branch: perl
- + ext/DB_File/Changes
- ! MANIFEST ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
- ! t/lib/db-recno.t
+ ! opcode.h opcode.pl
____________________________________________________________________________
-[ 505] By: mbeattie on 1998/02/12 16:24:26
- Log: Subject: 5.004_5*: [PATCH] restore old behaviour of \1 in RE
- Date: Tue, 10 Feb 1998 02:57:46 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 3159] By: gsar on 1999/03/25 02:18:17
+ Log: add statement-modifier loops to :base_loop class
Branch: perl
- ! regexec.c t/op/re_tests
+ ! ext/Opcode/Opcode.pm
____________________________________________________________________________
-[ 504] By: mbeattie on 1998/02/12 16:22:46
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Subject: [PATCH] 5.004_58: the locale.t problem in IRIX
- Date: Mon, 9 Feb 1998 19:47:22 +0200 (EET)
- Subject: [PATCH] 5.004_58: reserve the POSIX regexp extensions
- Date: Tue, 10 Feb 1998 15:12:12 +0200 (EET)
- Subject: [PATCH] 5.004_58: <netdb.h> API prototype probing
- Date: Wed, 11 Feb 1998 12:50:35 +0200 (EET)
- Branch: perl
- ! Configure config_h.SH pod/perldiag.pod pp_sys.c regcomp.c
- ! t/op/misc.t t/op/pat.t t/op/re_tests t/pragma/locale.t
-____________________________________________________________________________
-[ 503] By: mbeattie on 1998/02/12 16:15:43
- Log: Subject: [PATCH] filecopy.t #3 fails on dos-djgpp
- Date: Mon, 9 Feb 1998 13:19:45 +0100
- From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+[ 3158] By: gsar on 1999/03/25 00:36:57
+ Log: integrate changes#3105,3130,3154 from maint-5.005
Branch: perl
- ! t/lib/filecopy.t
+ !> Configure INSTALL hints/dec_osf.sh hints/netbsd.sh
____________________________________________________________________________
-[ 502] By: mbeattie on 1998/02/12 16:14:27
- Log: Assorted patches to sv.c:
- From: Gisle Aas <gisle@aas.no>
- Subject: [PATCH] sv_grow can fail for HAS_64K_LIMIT systems
- Date: 07 Feb 1998 00:21:57 +0100
- Subject: [PATCH] sv_setnv will upgrade SVt_NV to SVt_PVNV
- Date: 07 Feb 1998 00:29:45 +0100
- Subject: [PATCH] sv_upgrade() always returns TRUE
- Date: 09 Feb 1998 15:44:01 +0100
+[ 3157] By: gsar on 1999/03/25 00:24:17
+ Log: remove bogus panic()
Branch: perl
- ! sv.c
+ ! Changes lib/Math/BigFloat.pm
+____________________________________________________________________________
+[ 3156] By: jhi on 1999/03/24 22:43:43
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> (branch 38 files)
+ !> (integrate 68 files)
+____________________________________________________________________________
+[ 3155] By: jhi on 1999/03/24 22:12:17
+ Log: Configure regenerated because of changes #3130/#3154 and #3147.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3154] By: jhi on 1999/03/24 21:40:51
+ Log: Reword the shared library search path (LD_LIBRARY_PATH) info
+ based on suggestions from Andy Dougherty.
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 3153] By: gsar on 1999/03/24 10:38:05
+ Log: applied suggested patch, modulo superceded parts
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Thu, 18 Mar 1999 00:10:44 -0400 (EDT)
+ Message-id: <01J8YFGIHW2W001E7S@mail.newman.upenn.edu>
+ Subject: [PATCH 5.005_56] Miscellaneous VMS-specific fixes
+ Branch: perl
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_VMS.pm
+ ! t/comp/require.t t/op/lex_assign.t t/op/taint.t
+ ! utils/perldoc.PL vms/ext/Stdio/Stdio.pm vms/ext/Stdio/Stdio.xs
+ ! vms/ext/Stdio/test.pl vms/test.com vms/vmsish.h
+____________________________________________________________________________
+[ 3152] By: gsar on 1999/03/24 10:30:51
+ Log: applied suggested patch, modulo superceded parts
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Thu, 18 Mar 1999 00:04:31 -0400 (EDT)
+ Message-id: <01J8YF0EOWLU001E7S@mail.newman.upenn.edu>
+ Subject: [PATCH 5.005_56] Miscellaneous small fixes
+ Branch: perl
+ ! ext/B/defsubs.h.PL ext/re/re.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/File/Basename.pm
+____________________________________________________________________________
+[ 3151] By: gsar on 1999/03/24 10:15:00
+ Log: doc tweak suggested by M.J.T. Guy <mjtg@cus.cam.ac.uk>
+ Branch: perl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 3150] By: gsar on 1999/03/24 10:09:13
+ Log: missing integration in previous change
+ Branch: perl
+ !> README.apollo
+____________________________________________________________________________
+[ 3149] By: gsar on 1999/03/24 10:06:44
+ Log: integrate changes#3116,3119 from maint-5.005
+ Branch: perl
+ + README.apollo
+ +> apollo/netinet/in.h
+ !> MANIFEST hints/apollo.sh t/lib/io_udp.t
+____________________________________________________________________________
+[ 3148] By: gsar on 1999/03/24 10:01:56
+ Log: integrate changes#3091-3094 from maint-5.005
+ Branch: perl
+ !> README.hurd vms/subconfigure.com vos/config.h
+ !> vos/config_h.SH_orig
+____________________________________________________________________________
+[ 3147] By: gsar on 1999/03/24 09:31:49
+ Log: warn about newfangled vfork() caveats
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 3146] By: jhi on 1999/03/24 09:20:14
+ Log: Bring in changes #2808 and #2812 (from mainline perl)
+ that enhance the perlbug checklist.
+ Branch: maint-5.005/perl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 3145] By: gsar on 1999/03/24 08:37:02
+ Log: integrate change#3115 from maint-5.005
+ Branch: perl
+ !> ext/DB_File/Changes ext/DB_File/DB_File.pm
+ !> ext/DB_File/DB_File.xs ext/DB_File/typemap
+____________________________________________________________________________
+[ 3144] By: gsar on 1999/03/24 08:33:59
+ Log: add note about map in scalar context
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3143] By: gsar on 1999/03/24 08:25:59
+ Log: doc tweak
+ Branch: perl
+ ! lib/Time/Local.pm
+____________________________________________________________________________
+[ 3142] By: gsar on 1999/03/24 08:20:37
+ Log: applied suggested patch, modulo bogus hunk
+ From: "Vishal Bhatia" <vishalb@hotmail.com>
+ Date: Thu, 11 Mar 1999 07:40:27 PST
+ Message-ID: <19990311154027.25891.qmail@hotmail.com>
+ Subject: [PATCH 5.005_56] Minor fixes in perlcc
+ Branch: perl
+ ! ext/B/B/C.pm ext/B/B/CC.pm utils/perlcc.PL
____________________________________________________________________________
-[ 501] By: mbeattie on 1998/02/12 16:09:26
- Log: Fix saving of STDOUT during system() in lib/perl5db.pl:
- Subject: Perl debugger.
- Date: Fri, 6 Feb 1998 17:47:08 -0500
- From: "Jason A. Smith" <smithj4@rpi.edu>
+[ 3141] By: gsar on 1999/03/24 08:06:12
+ Log: integrate change#3104 from maint-5.005
+ Branch: perl
+ !> README.os390 t/lib/posix.t
+____________________________________________________________________________
+[ 3140] By: gsar on 1999/03/24 06:34:56
+ Log: fix failure of C<&locked_sub;> under -Dusethreads
+ Branch: perl
+ ! pp_hot.c t/lib/thread.t
+____________________________________________________________________________
+[ 3139] By: gsar on 1999/03/24 05:52:00
+ Log: debugger tweak (wasn't printing a newline after recalled commands)
Branch: perl
! lib/perl5db.pl
____________________________________________________________________________
-[ 500] By: gsar on 1998/02/12 03:20:55
- Log: merge another maint patch
- Message-Id: <199802102349.SAA16001@aatma.engin.umich.edu>
- Date: Tue, 10 Feb 1998 18:49:00 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: Re: after an eval-ed bad require, requiring a string ref gives a SEGV
- Branch: win32/perl
- ! pp_ctl.c
+[ 3138] By: gsar on 1999/03/24 05:33:28
+ Log: document OO exceptions (based on a suggestion by Andreas Koenig
+ <andreas.koenig@anima.de>)
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3137] By: gsar on 1999/03/24 02:50:20
+ Log: better "Illegal %s digit ignored" warnings
+ Branch: perl
+ ! MANIFEST pod/perldiag.pod pod/perlfunc.pod t/pragma/warn/util
+ ! toke.c util.c
____________________________________________________________________________
-[ 499] By: gsar on 1998/02/12 03:14:39
- Log: make t/comp/require.t type xtext
- Branch: win32/perl
- ! t/comp/require.t
-____________________________________________________________________________
-[ 498] By: gsar on 1998/02/12 03:09:58
- Log: fix extra LEAVE when require fails
- Message-Id: <199802102321.SAA15346@aatma.engin.umich.edu>
- Date: Tue, 10 Feb 1998 18:21:37 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: Re: evals and requires make seg-fault with bad require file
- Branch: win32/perl
- + t/comp/require.t
- ! MANIFEST pp_ctl.c scope.c scope.h toke.c
-____________________________________________________________________________
-[ 497] By: gsar on 1998/02/12 02:47:29
- Log: merge a maint patch
- Message-Id: <199802110515.AAA23700@aatma.engin.umich.edu>
- Date: Wed, 11 Feb 1998 00:15:51 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: Re: "local" can crash perl-4.00[34] on Solaris-x86 & FreeBSD
- Branch: win32/perl
- ! pp_ctl.c t/op/local.t
-____________________________________________________________________________
-[ 496] By: mbeattie on 1998/02/11 13:04:50
- Log: Integrate win32 into mainline.
- Branch: perl
- !> embed.h ext/GDBM_File/typemap ext/NDBM_File/typemap
- !> ext/ODBM_File/typemap ext/SDBM_File/typemap global.sym gv.c
- !> lib/ExtUtils/typemap lib/ExtUtils/xsubpp op.c
- !> os2/OS2/PrfDB/typemap pod/perlguts.pod pod/perlobj.pod
- !> pod/perlxs.pod pod/perlxstut.pod proto.h sv.c sv.h t/op/ref.t
- !> win32/makedef.pl win32/win32.c win32/win32iop.h
-____________________________________________________________________________
-[ 495] By: mbeattie on 1998/02/11 13:03:59
- Log: Fix special constants in Xref.pm
- Branch: perlext
- ! Compiler/B/Xref.pm
-____________________________________________________________________________
-[ 494] By: gsar on 1998/02/10 18:26:28
- Log: fix opendir() problem on share names
- Message-Id: <199802101828.NAA10420@aatma.engin.umich.edu>
- Date: Tue, 10 Feb 1998 13:28:53 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: Re: BUG: opendir and UNC names on NT
- Branch: win32/perl
+[ 3136] By: gsar on 1999/03/24 02:26:38
+ Log: fix off-by-one that resulted in misparse of C</[\x{80}-\x{81}]/>
+ Branch: perl
+ + t/pragma/utf8.t
+ ! regcomp.c
+____________________________________________________________________________
+[ 3135] By: gsar on 1999/03/24 01:29:09
+ Log: flip release & version in win32_uname()
+ Branch: perl
! win32/win32.c
____________________________________________________________________________
-[ 493] By: gsar on 1998/02/09 23:09:40
- Log: integrate win32 branch contents
- Branch: asperl
- +> ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
- +> lib/Fatal.pm t/lib/ph.t
- ! hv.c
- !> (integrate 895 files)
-____________________________________________________________________________
-[ 492] By: gsar on 1998/02/09 07:30:19
- Log: enhancements to previous patch for XSUB OUTPUT args
- Message-Id: <199802090731.CAA04438@aatma.engin.umich.edu>
- Date: Mon, 09 Feb 1998 02:31:55 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: Re: [PATCH] XSUB OUTPUT arguments and 'set' magic
- Branch: win32/perl
- ! embed.h ext/GDBM_File/typemap ext/NDBM_File/typemap
- ! ext/ODBM_File/typemap ext/SDBM_File/typemap global.sym
- ! lib/ExtUtils/typemap lib/ExtUtils/xsubpp os2/OS2/PrfDB/typemap
- ! pod/perlguts.pod pod/perlxs.pod pod/perlxstut.pod proto.h sv.c
- ! sv.h
+[ 3134] By: gsar on 1999/03/24 01:08:33
+ Log: support POSIX::uname() via win32_uname()
+ Branch: perl
+ ! XSUB.h iperlsys.h win32/GenCAPI.pl win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makedef.pl
+ ! win32/perlhost.h win32/win32.c win32/win32.h win32/win32iop.h
____________________________________________________________________________
-[ 491] By: gsar on 1998/02/09 03:00:52
- Log: don't share TARG unless -DUSE_BROKEN_PAD_RESET
- Message-Id: <199710300036.TAA01004@aatma.engin.umich.edu>
- Date: Wed, 29 Oct 1997 19:36:25 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: [PATCH] Don't use broken pad_reset() (was Re: Perl bug in 5.004_03 )
- Branch: win32/perl
- ! op.c
+[ 3133] By: gsar on 1999/03/23 22:20:10
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 06 Mar 1999 21:42:56 +0100
+ Message-ID: <36e49281.50337171@smtp1.ibm.net>
+ Subject: [PATCH 5.005_56] perldelta.pod changes for Win32::* functions
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 490] By: gsar on 1998/02/09 02:30:43
- Log: fix for bugs in handling DESTROY (adjusted test numbers)
- Message-Id: <199801010030.TAA14274@aatma.engin.umich.edu>
- Subject: Re: [PERL] RFD: iterative DESTROYing of objects
- Date: Wed, 31 Dec 1997 19:30:46 -0500
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Branch: win32/perl
- ! pod/perlobj.pod sv.c t/op/ref.t
+[ 3132] By: gsar on 1999/03/23 22:17:45
+ Log: File::Spec fixes from Jan Dubois <jan.dubois@ibm.net>
+ Date: Sat, 06 Mar 1999 17:50:49 +0100
+ Message-ID: <36e25209.33833760@smtp1.ibm.net>
+ Subject: [PATCH 5.005_56] Fixes for File::Spec::Functions.pm
+ --
+ Date: Sat, 06 Mar 1999 18:15:00 +0100
+ Message-ID: <36e36222.37954195@smtp1.ibm.net>
+ Subject: [PATCH 5.005_56] Fix for File::Spec::Win32.pm
+ Branch: perl
+ + t/lib/filefunc.t
+ ! MANIFEST lib/File/Spec/Functions.pm lib/File/Spec/Win32.pm
+ ! pod/perldelta.pod pod/perlmodlib.pod
____________________________________________________________________________
-[ 489] By: gsar on 1998/02/09 00:30:35
- Log: ansify prototype for my_safemalloc(), avoid warnings
- Branch: win32/perl
- ! sv.c
+[ 3131] By: gsar on 1999/03/23 22:07:59
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ +> ext/DynaLoader/dl_rhapsody.xs hints/rhapsody.sh
+ !> Configure Makefile.SH config_h.SH configure.gnu handy.h
+ !> installperl malloc.c perl.c perl.h pod/perl.pod
+ !> pod/perldelta.pod pp_sys.c t/op/stat.t x2p/util.c
____________________________________________________________________________
-[ 488] By: gsar on 1998/02/09 00:29:08
- Log: fix misapplied hunks in 5.004_58
- Message-Id: <199802080718.CAA18115@aatma.engin.umich.edu>
- Date: Sun, 08 Feb 1998 02:18:12 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: [PATCH] fixes for test failures in 5.004_58
- Branch: win32/perl
- ! gv.c op.c
+[ 3130] By: jhi on 1999/03/23 22:02:23
+ Log: Don't use config.msg to remind about the
+ LD_LIBRARY_PATH because Makefile.SH takes
+ care of that.
+
+ Use shrplib in DEC O^W^Digital U^W^WTru64 UNIX.
+ This used to be the default but in some MT or another it
+ was dropped because of some transient error or another.
+ Branch: maint-5.005/perl
+ ! Configure hints/dec_osf.sh
____________________________________________________________________________
-[ 487] By: gsar on 1998/02/09 00:27:16
- Log: win32_utime() tweaks to avoid warnings
- Branch: win32/perl
- ! win32/win32.c win32/win32iop.h
+[ 3129] By: gsar on 1999/03/23 21:38:03
+ Log: add Pod-Parser-1.08 (verbatim module =include tests elided owing
+ to size and better maintainability)
+ Branch: perl
+ + lib/Pod/Checker.pm lib/Pod/InputObjects.pm lib/Pod/Parser.pm
+ + lib/Pod/PlainText.pm lib/Pod/Select.pm lib/Pod/Usage.pm
+ + pod/pod2usage.PL pod/podchecker.PL pod/podselect.PL
+ + t/pod/emptycmd.t t/pod/emptycmd.xr t/pod/for.t t/pod/for.xr
+ + t/pod/headings.t t/pod/headings.xr t/pod/include.t
+ + t/pod/include.xr t/pod/included.t t/pod/included.xr
+ + t/pod/lref.t t/pod/lref.xr t/pod/nested_items.t
+ + t/pod/nested_items.xr t/pod/nested_seqs.t t/pod/nested_seqs.xr
+ + t/pod/oneline_cmds.t t/pod/oneline_cmds.xr t/pod/poderrs.t
+ + t/pod/poderrs.xr t/pod/special_seqs.t t/pod/special_seqs.xr
+ + t/pod/testcmp.pl t/pod/testp2pt.pl t/pod/testpchk.pl
+ ! AUTHORS MAINTAIN MANIFEST installperl pod/Makefile
+ ! win32/Makefile win32/makefile.mk win32/pod.mak
+____________________________________________________________________________
+[ 3128] By: jhi on 1999/03/23 10:14:54
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 46 files)
____________________________________________________________________________
-[ 486] By: gsar on 1998/02/07 23:45:22
- Log: integrate mainline, plus a few small win32 enhancements
- - remove Win32::GetCurrentDirectory()
- - add Win32::Sleep() for compat
- - add smarter utime() from Jan Dubois, and export it as win32_utime()
- Branch: win32/perl
- +> ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
- +> lib/Fatal.pm t/lib/ph.t
- ! win32/makedef.pl win32/win32.c win32/win32iop.h
- !> (integrate 61 files)
-
-----------------
-Version 5.004_58
-----------------
-
+[ 3127] By: gsar on 1999/03/23 06:57:30
+ Log: From: Tim Witham - FES <twitham@pcocd2.intel.com>
+ Date: Thu, 4 Mar 1999 10:54:01 -0800
+ Message-Id: <9903041854.AA46868@frc0000>
+ Subject: patch for useless Math::BigInt warnings
+ Branch: perl
+ ! lib/Math/BigInt.pm
+____________________________________________________________________________
+[ 3126] By: gsar on 1999/03/23 05:54:37
+ Log: avoid literal 'undef' in $lddlflags under `Configure -Uoptimize`
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ Date: Fri, 19 Feb 1999 15:47:59 -0500
+ Message-ID: <19990219154759.A32350@O2.chapin.edu>
+ Subject: [PATCH] OSF/1 hints
+ Branch: perl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 3125] By: gsar on 1999/03/23 00:56:38
+ Log: avoid typeglob persistence in pp_readline()
+ Branch: perl
+ ! sv.c t/op/gv.t
+____________________________________________________________________________
+[ 3124] By: gsar on 1999/03/22 21:12:23
+ Log: update copyright years
+ Branch: perl
+ ! Changes EXTERN.h INTERN.h av.c av.h bytecode.pl cop.h cv.h
+ ! deb.c doio.c doop.c dump.c form.h gv.c gv.h handy.h hv.c hv.h
+ ! malloc.c mg.c mg.h op.c op.h perl.c perl.h perlio.c pp.c pp.h
+ ! pp_ctl.c pp_hot.c pp_sys.c regcomp.c regexec.c run.c scope.c
+ ! sv.c sv.h toke.c utf8.c utf8.h util.c
+____________________________________________________________________________
+[ 3123] By: gsar on 1999/03/22 07:07:06
+ Log: implement win32_spawnvp() internally, making it return true PIDs
+ for asynchronous spawns; fix win32_kill() to always deal with
+ PIDs
+ Branch: perl
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 3122] By: jhi on 1999/03/19 21:12:14
+ Log: Describe the new Benchmark feature in more detail.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 3121] By: jhi on 1999/03/19 08:16:12
+ Log: AVAILABILITY tuning.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3120] By: jhi on 1999/03/17 14:52:17
+ Log: Rhapsody change assumed too much.
+ Branch: cfgperl
+ ! t/op/stat.t
+____________________________________________________________________________
+[ 3119] By: jhi on 1999/03/17 14:33:43
+ Log: More Apollo fixes.
+ Branch: maint-5.005/perl
+ ! README.apollo hints/apollo.sh t/lib/io_udp.t
+____________________________________________________________________________
+[ 3118] By: jhi on 1999/03/16 17:23:39
+ Log: Nada.
+ Branch: maint-5.005/perl
+ ! README.apollo
+____________________________________________________________________________
+[ 3117] By: jhi on 1999/03/16 17:18:49
+ Log: Apollo DomainOS AVAILABILITY.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3116] By: jhi on 1999/03/16 17:14:00
+ Log: Apollo DomainOS patch
+ From: Johann Klasek <jk@auto.tuwien.ac.at>
+ Subject: Re: DomainPerl
+ Date: Tue, 16 Mar 1999 17:46:32 +0100
+ Message-ID: <19990316174632.A19759@euklid.auto.tuwien.ac.at>
+ Branch: maint-5.005/perl
+ + README.apollo apollo/netinet/in.h
+ ! MANIFEST hints/apollo.sh
+____________________________________________________________________________
+[ 3115] By: jhi on 1999/03/16 14:23:54
+ Log: From: Paul Marquess <pmarquess@bfsec.bt.co.uk>
+ To: Gurusamy Sarathy <gsar@activestate.com>,
+ Graham Barr <gbarr@pobox.com>
+ Cc: Perl5 Porters <perl5-porters@perl.org>,
+ "Paul.Marquess" <Paul.Marquess@btinternet.com>
+ Subject: [PATCH 5.005_56 & 5.005_03_T6] Upgrade DB_File to version 1.65
+ Date: Sun, 14 Mar 1999 14:43:57 -0000
+ Message-Id: <199903141841.NAA17040@defender.perl.org>
+ Branch: maint-5.005/perl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap
+____________________________________________________________________________
+[ 3114] By: jhi on 1999/03/16 12:42:20
+ Log: Mention Rhapsody in 5.005_5X perldelta,
+ and in Rhapsody and Netware in 5.005_0X and 5.005_5X
+ *planned* AVAILABILITY.
+ Branch: cfgperl
+ ! pod/perl.pod pod/perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3113] By: jhi on 1999/03/16 10:38:53
+ Log: perldelta niggling.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 3112] By: jhi on 1999/03/16 10:35:21
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> lib/unicode/MakeEthiopicSyllables.PL pod/perldelta.pod
+ !> pod/perlhist.pod pod/perlmodinstall.pod pod/perltodo.pod
+____________________________________________________________________________
+[ 3111] By: jhi on 1999/03/16 10:28:10
+ Log: AVAILABILITY update: still mention PowerUX,
+ Novell Netware now has sources available.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 485] By: mbeattie on 1998/02/06 18:11:47
- Log: Bump patchlevel to 58.
+[ 3110] By: gsar on 1999/03/16 04:34:23
+ Log: sundry pod niggles
Branch: perl
- ! patchlevel.h
+ ! lib/unicode/MakeEthiopicSyllables.PL pod/perldelta.pod
+ ! pod/perlhist.pod pod/perlmodinstall.pod pod/perltodo.pod
____________________________________________________________________________
-[ 484] By: mbeattie on 1998/02/06 18:08:28
- Log: Fix up problem with gv.c from change 477.
- Fix up Config.pm use in t/lib/ph.t from change 478.
+[ 3109] By: jhi on 1999/03/15 17:00:11
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> lib/unicode/EthiopicSyllables.txt lib/unicode/In/Ethiopic.pl
+ +> lib/unicode/Is/Syllable.pl
+ +> lib/unicode/MakeEthiopicSyllables.PL
+ +> lib/unicode/README.Ethiopic
+ !> AUTHORS MAINTAIN MANIFEST lib/unicode/Block.pl
+ !> lib/unicode/Category.pl lib/unicode/Is/Alnum.pl
+ !> lib/unicode/Is/Alpha.pl lib/unicode/Is/Digit.pl
+ !> lib/unicode/Is/L.pl lib/unicode/Is/Lo.pl lib/unicode/Is/N.pl
+ !> lib/unicode/Is/Nd.pl lib/unicode/Is/No.pl lib/unicode/Is/P.pl
+ !> lib/unicode/Is/Po.pl lib/unicode/Is/Space.pl
+ !> lib/unicode/Is/Z.pl lib/unicode/Is/Zs.pl lib/unicode/Makefile
+ !> lib/unicode/Name.pl lib/unicode/Number.pl op.c
+____________________________________________________________________________
+[ 3108] By: jhi on 1999/03/15 16:58:12
+ Log: First pass of integrating the Rhapsody port,
+
+ From: Wilfredo Sanchez <wsanchez@apple.com>
+ Subject: Keeping the world in sync.
+ Reply-To: wsanchez@apple.com
+ To: perlbug@perl.com
+ Date: Fri, 13 Nov 1998 17:11:30 -0800
+ Message-Id: <199811140111.RAA41784@scv4.apple.com>
+ Branch: cfgperl
+ + ext/DynaLoader/dl_rhapsody.xs hints/rhapsody.sh
+ ! Configure Makefile.SH config_h.SH configure.gnu handy.h
+ ! installperl malloc.c perl.c perl.h pp_sys.c t/op/stat.t
+ ! x2p/util.c
+____________________________________________________________________________
+[ 3107] By: gsar on 1999/03/15 03:22:10
+ Log: applied suggested patch (mailed to perl-unicode@perl.org) with minor tweaks
+ From: Daniel Yacob <dmulholl@cs.indiana.edu>
+ Date: Tue, 23 Feb 1999 16:13:42 -0500 (EST)
+ Message-Id: <199902232113.QAA26135@drum.cs.indiana.edu>
+ Subject: ../lib/unicode/ Unicode 3.0 Extensions for Ethiopic
+ Branch: perl
+ + lib/unicode/EthiopicSyllables.txt lib/unicode/In/Ethiopic.pl
+ + lib/unicode/Is/Syllable.pl
+ + lib/unicode/MakeEthiopicSyllables.PL
+ + lib/unicode/README.Ethiopic
+ ! AUTHORS MAINTAIN MANIFEST lib/unicode/Block.pl
+ ! lib/unicode/Category.pl lib/unicode/Is/Alnum.pl
+ ! lib/unicode/Is/Alpha.pl lib/unicode/Is/Digit.pl
+ ! lib/unicode/Is/L.pl lib/unicode/Is/Lo.pl lib/unicode/Is/N.pl
+ ! lib/unicode/Is/Nd.pl lib/unicode/Is/No.pl lib/unicode/Is/P.pl
+ ! lib/unicode/Is/Po.pl lib/unicode/Is/Space.pl
+ ! lib/unicode/Is/Z.pl lib/unicode/Is/Zs.pl lib/unicode/Makefile
+ ! lib/unicode/Name.pl lib/unicode/Number.pl
+____________________________________________________________________________
+[ 3106] By: gsar on 1999/03/12 20:35:36
+ Log: change#3067 failed package.t due to needless creation of $a and $b;
+ fixed to do that only for C<sort BLOCK|CODE @foo>, not C<sort(@foo)>
Branch: perl
- ! gv.c t/lib/ph.t
+ ! op.c
+____________________________________________________________________________
+[ 3105] By: jhi on 1999/03/12 15:54:57
+ Log: Recognize the NetBSD packages collection.
+ Branch: maint-5.005/perl
+ ! hints/netbsd.sh
+____________________________________________________________________________
+[ 3104] By: jhi on 1999/03/12 09:07:04
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: jhi@iki.fi, perl-mvs@perl.org, perlbug@perl.com
+ Subject: [PATCH MT6,_56] was Re: Not OK: perl 5.00503 +MAINT_TRIAL_6 on os390 06.00 (UNINSTALLED)
+ Date: Thu, 11 Mar 99 14:24:54 PST
+ Message-Id: <9903112224.AA24346@forte.com>
+ Branch: maint-5.005/perl
+ ! README.os390 t/lib/posix.t
+____________________________________________________________________________
+[ 3103] By: jhi on 1999/03/10 11:07:46
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes embed.h embed.pl embedvar.h global.sym objXSUB.h op.c
+ !> perl.c perl.h pod/perldelta.pod pod/pod2man.PL t/base/lex.t
+ !> t/pragma/warn/1global toke.c win32/makedef.pl
+____________________________________________________________________________
+[ 3102] By: jhi on 1999/03/10 11:01:20
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: perl5-porters@perl.org
+ Subject: [5.005_03-MT6]Patch: time passes
+ Date: Tue, 9 Mar 99 18:42:17 PST
+ Message-Id: <9903100242.AA29057@forte.com>
+ Branch: maint-5.005/perl
+ ! perl.c
+____________________________________________________________________________
+[ 3101] By: jhi on 1999/03/10 10:30:15
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.com
+ Subject: Minor fix to perlfunc.pod
+ Date: Mon, 08 Mar 1999 20:05:53 -0500
+ Message-ID: <19990309010553.13757.qmail@plover.com>
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 483] By: mbeattie on 1998/02/06 17:34:34
- Log: Integrate win32 branch into mainline
+[ 3100] By: gsar on 1999/03/09 23:04:44
+ Log: change#3060 had the wrong quotes
Branch: perl
- !> win32/win32sck.c
+ ! pod/pod2man.PL
____________________________________________________________________________
-[ 482] By: mbeattie on 1998/02/06 17:26:41
- Log: lib/Fatal.pm missing from repository
+[ 3099] By: jhi on 1999/03/09 12:52:21
+ Log: d_uname was broken (probably since _53), reported by
+
+ From: Alan Burlison <Alan.Burlison@uk.sun.com>
+ To: p5p <perl5-porters@perl.org>, Gurusamy Sarathy <gsar@umich.edu>,
+ cpan-testers@perl.org
+ Subject: Not OK: perl 5.00556 on sun4-solaris 2.6
+ Date: Mon, 08 Mar 1999 13:22:31 +0000
+ Message-ID: <36E3CF17.EA1FEDAA@uk.sun.com>
+
+ and
+
+ From: lvirden@cas.org (Larry W. Virden)
+ To: perlbug@perl.com
+ Subject: configure not correctly identifying uname posix compatibility
+ Date: Mon, 8 Mar 1999 06:36:16 -0500 (EST)
+ Message-Id: <199903081136.GAA23682@cas.org>
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3098] By: gsar on 1999/03/09 03:16:07
+ Log: fix parsing of here documents in C<eval 's/.../<<FOO/e'>
Branch: perl
- + lib/Fatal.pm
+ ! op.c perl.h pod/perldelta.pod t/base/lex.t toke.c
____________________________________________________________________________
-[ 481] By: mbeattie on 1998/02/06 17:24:57
- Log: Subject: [PATCH] Re: posix::strftime (core dumped)
- Date: Thu, 5 Feb 1998 13:55:23 -0500 (EST)
- From: Andy Dougherty <doughera@newton.phys.lafayette.edu>
+[ 3097] By: gsar on 1999/03/09 02:50:43
+ Log: use yyerror() instead of croak() so that compile-time failures in
+ my(LIST) don't confuse globals with lexicals
Branch: perl
- + ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
- ! MANIFEST hints/linux.sh hints/sunos_4_1.sh t/lib/posix.t
+ ! op.c toke.c
____________________________________________________________________________
-[ 480] By: mbeattie on 1998/02/06 17:19:52
- Log: x2p/str.c was missing from list of changed files in change 466
+[ 3096] By: gsar on 1999/03/09 02:47:36
+ Log: adjust testsuite for change#3067
Branch: perl
- ! x2p/str.c
+ ! t/pragma/warn/1global
____________________________________________________________________________
-[ 479] By: mbeattie on 1998/02/06 17:16:54
- Log: Added t/lib/ph.t to MANIFEST
+[ 3095] By: gsar on 1999/03/08 21:04:48
+ Log: remove bogus symbols from global.sym
Branch: perl
- ! MANIFEST
+ ! Changes embed.h embed.pl embedvar.h global.sym objXSUB.h
+ ! perl.h win32/makedef.pl
+____________________________________________________________________________
+[ 3094] By: jhi on 1999/03/06 16:16:15
+ Log: From: Mark Kettenis <kettenis@wins.uva.nl>
+ To: jhi@iki.fi
+ Subject: Oops
+ Date: Sat, 6 Mar 1999 17:15:35 +0100 (CET)
+ Message-Id: <199903061615.RAA00207@delius.kettenis.nl>
+ Branch: maint-5.005/perl
+ ! README.hurd
+____________________________________________________________________________
+[ 3093] By: jhi on 1999/03/06 15:59:46
+ Log: From: Mark Kettenis <kettenis@wins.uva.nl>
+ To: jhi@iki.fi
+ Subject: New Hurd README
+ Date: Sat, 6 Mar 1999 16:46:12 +0100 (CET)
+ Message-Id: <199903061601.RAA00185@delius.kettenis.nl>
+ Branch: maint-5.005/perl
+ ! README.hurd
+____________________________________________________________________________
+[ 3092] By: jhi on 1999/03/06 12:52:06
+ Log: From: Paul_Green@stratus.com
+ To: perl5-porters@perl.org
+ Cc: jhi@iki.fi, Paul_Green@stratus.com
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_6]: platform: vos -- updates to VOS port of Perl5
+ Date: Fri, 5 Mar 1999 18:08:49 -0500
+ Message-ID: <1D1A4EF7AD4DD211A80D00A0C9D7DB665A035A@exna1.stratus.com>
+ Branch: maint-5.005/perl
+ ! vos/config.h vos/config_h.SH_orig
+____________________________________________________________________________
+[ 3091] By: jhi on 1999/03/06 12:42:21
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_03-MT6]VMS build patch
+ Date: Fri, 05 Mar 1999 12:36:19 -0800
+ Message-Id: <3.0.6.32.19990305123619.02d326a0@ous.edu>
+ Branch: maint-5.005/perl
+ ! vms/subconfigure.com
____________________________________________________________________________
-[ 478] By: mbeattie on 1998/02/06 17:15:38
- Log: Subject: [PATCH] h2ph.PL
- Date: Thu, 5 Feb 1998 05:53:54 -0800 (EST)
- From: kstar@www.chapin.edu (Kurt D. Starsinic)
+[ 3090] By: gsar on 1999/03/06 04:40:03
+ Log: integrate change#3089 from mainline
+
+ tolerate CRs after options
+ Branch: maint-5.005/perl
+ !> perl.c
+____________________________________________________________________________
+[ 3089] By: gsar on 1999/03/06 04:30:40
+ Log: tolerate CRs after options
Branch: perl
- + t/lib/ph.t
- ! utils/h2ph.PL
+ ! perl.c
+____________________________________________________________________________
+[ 3088] By: jhi on 1999/03/05 12:49:01
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> README.hurd
+ !> MANIFEST ext/Errno/Errno_pm.PL t/lib/io_sock.t
____________________________________________________________________________
-[ 477] By: mbeattie on 1998/02/06 17:10:46
- Log: Subject: [PATCH] Faster gv_fetchpv() for nested packages
- Date: 04 Feb 1998 14:49:46 +0100
- From: Gisle Aas <gisle@aas.no>
- as modified by
- From: chip@atlantic.net
- Date: Wed, 4 Feb 1998 11:46:49 -0500 (EST)
+[ 3087] By: gsar on 1999/03/05 06:41:16
+ Log: adjust timeouts to accomodate slow/busy systems
Branch: perl
- ! gv.c
+ ! t/lib/io_sock.t
____________________________________________________________________________
-[ 476] By: mbeattie on 1998/02/06 16:47:03
- Log: From: Jarkko Hietaniemi <jhi@iki.fi>
- Subject: [PATCH] almost OK: perl 5.00457 on i386-freebsd-thread 3.0
- Date: Wed, 4 Feb 1998 12:59:47 +0200 (EET)
- Subject: Re: [PATCH] 5.004_04 and 5.004_57: Complex.pm and complex.t
- Date: Thu, 5 Feb 1998 18:08:20 +0200 (EET)
+[ 3083] By: gsar on 1999/03/05 01:32:47
+ Log: integrate change#3081 from maint-5.005
Branch: perl
- ! hints/freebsd.sh lib/Math/Complex.pm t/lib/complex.t
+ !> ext/Errno/Errno_pm.PL
____________________________________________________________________________
-[ 475] By: mbeattie on 1998/02/06 16:44:57
- Log: Subject: [PATCH] nomemok
- Date: Mon, 2 Feb 1998 15:06:50 +0100
- From: Gisle Aas <gisle@aas.no>
+[ 3082] By: gsar on 1999/03/05 01:31:06
+ Log: integrate change#2904 from maint-5.005
Branch: perl
- ! hv.c
+ +> README.hurd
+ !> MANIFEST
____________________________________________________________________________
-[ 474] By: mbeattie on 1998/02/06 16:43:46
- Log: Subject: [PATCH] Benchmark.pm: timethese corrupts $_
- Date: Sun, 1 Feb 1998 06:46:08 -0500 (EST)
- From: abigail@fnx.com
+[ 3081] By: gsar on 1999/03/05 00:14:33
+ Log: protect against doubled backslashes
+ Branch: maint-5.005/perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 3077] By: jhi on 1999/03/04 08:10:13
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> ext/B/B/Stash.pm
+ !> MANIFEST README.hpux cc_runtime.h config_h.SH ext/B/B/C.pm
+ !> ext/B/B/CC.pm gv.c lib/File/Compare.pm lib/Test/Harness.pm
+ !> op.c pod/perldelta.pod pod/perlfunc.pod pod/pod2man.PL
+ !> t/lib/bigfloatpm.t t/lib/io_sock.t utils/perlcc.PL
+____________________________________________________________________________
+[ 3076] By: jhi on 1999/03/04 08:07:59
+ Log: Regen config_h.SH once more because of *size,
+ noticed by
+
+ From: Hans Mulder <hansm@icgned.icgroup.nl>
+ To: Jarkko Hietaniemi <jhi@iki.fi>
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH for _56] LONGSIZE used before it is set in config.h
+ Date: Thu, 4 Mar 99 00:10:45 +0100
+ Message-Id: <9903032317.AA23021@icgned.icgroup.nl>
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3068] By: gsar on 1999/03/04 05:48:03
+ Log: From: Hans Mulder <hansm@icgned.icgroup.nl>
+ Date: Thu, 4 Mar 99 00:10:45 +0100
+ Message-Id: <9903032317.AA23021@icgned.icgroup.nl>
+ Subject: [PATCH for _56] LONGSIZE used before it is set in config.h
Branch: perl
- ! lib/Benchmark.pm
+ ! config_h.SH
____________________________________________________________________________
-[ 473] By: mbeattie on 1998/02/06 16:42:53
- Log: Subject: [PATCH] adding the newSVpvn API function
- Date: Sat, 31 Jan 1998 06:32:42 +0100
- From: Matthias Ulrich Neeracher <neeri@iis.ee.ethz.ch>
+[ 3067] By: gsar on 1999/03/04 05:44:32
+ Log: exempt $foo::a,$foo::b from warnings only if sort() was seen in package foo
+ From: Graham Barr <gbarr@ti.com>
+ Date: Wed, 3 Mar 1999 17:23:56 -0600
+ Message-ID: <19990303172356.F7442@dal.asp.ti.com>
+ Subject: Re: 'use strict' doesn't work for one-letter variables
Branch: perl
- ! embed.h embedvar.h global.sym pod/perlguts.pod pod/perltoc.pod
- ! proto.h sv.c
+ ! gv.c op.c
____________________________________________________________________________
-[ 472] By: mbeattie on 1998/02/06 16:35:41
- Log: Subject: Re: [PATCH] new hints/solaris2.sh (was Re: make check fails 17% of it's tests on Solaris...)
- Date: 28 Jan 1998 17:40:37 -0800
- From: Stephen Zander <srz@mckesson.com>
+[ 3066] By: gsar on 1999/03/04 05:20:50
+ Log: updates to compiler modules
+ From: "Vishal Bhatia" <vishalb@hotmail.com>
+ Date: Tue, 02 Mar 1999 23:27:25 PST
+ Message-ID: <19990303072725.779.qmail@hotmail.com>
+ Subject: PATCH 5.005_56 + Test procedure
Branch: perl
- ! hints/solaris_2.sh
+ + ext/B/B/Stash.pm
+ ! MANIFEST cc_runtime.h ext/B/B/C.pm ext/B/B/CC.pm
+ ! lib/Test/Harness.pm utils/perlcc.PL
____________________________________________________________________________
-[ 471] By: mbeattie on 1998/02/06 16:02:57
- Log: Subject: [PATCH] Re: 5.004_04 vec() fails with 32-bit values
- Date: Thu, 15 Jan 1998 11:53:06 +0000
- From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+[ 3065] By: gsar on 1999/03/04 05:03:30
+ Log: more s/s_/s!/ etc.
Branch: perl
- ! pod/perlguts.pod pp.c t/op/vec.t
+ ! pod/perldelta.pod pod/perlfunc.pod
____________________________________________________________________________
-[ 470] By: mbeattie on 1998/02/06 16:01:36
- Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
- Subject: 5.004_56: Patch to Tie::Hash and docs
- Date: Sun, 11 Jan 1998 20:34:05 -0500 (EST)
- Subject: 5.004_56: Patch to (?{}) quoting + cosmetic
- Date: Mon, 2 Feb 1998 01:28:46 -0500 (EST)
+[ 3064] By: gsar on 1999/03/04 04:50:45
+ Log: integrate cfgperl contents into mainline
Branch: perl
- ! lib/Tie/Hash.pm pod/perlfunc.pod pod/perlre.pod regcomp.c
- ! t/op/misc.t t/op/pat.t toke.c
+ !> Configure README.vms bytecode.h config_h.SH configure.com
+ !> ext/B/defsubs.h.PL hints/hpux.sh pod/perldelta.pod
+ !> pod/perldiag.pod pp.c t/lib/ipc_sysv.t t/op/pack.t thread.h
+ !> vms/ext/vmsish.pm vms/subconfigure.com vms/vms.c vms/vmsish.h
____________________________________________________________________________
-[ 469] By: mbeattie on 1998/02/06 15:58:31
- Log: Subject: Another Array.pm patch
- Date: Wed, 4 Feb 1998 20:37:03 +0000 (GMT)
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+[ 3063] By: gsar on 1999/03/04 04:44:13
+ Log: HP-UX has yet another spelling for /NaNQ?/
Branch: perl
- ! lib/Tie/Array.pm
+ ! t/lib/bigfloatpm.t
____________________________________________________________________________
-[ 468] By: mbeattie on 1998/02/06 15:56:28
- Log: Subject: documentation patch for 5.004_57
- Date: Wed, 4 Feb 1998 14:54:13 +0000 (GMT)
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+[ 3062] By: gsar on 1999/03/04 04:36:08
+ Log: error-check for accept() test
Branch: perl
- ! lib/Tie/Array.pm
+ ! t/lib/io_sock.t
____________________________________________________________________________
-[ 467] By: mbeattie on 1998/02/06 15:55:34
- Log: Subject: 5.004_56: patch for `use Fatal' again
- Date: Thu, 29 Jan 1998 17:04:28 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 3061] By: gsar on 1999/03/04 03:40:25
+ Log: allow custom comparison function in File::Compare::compare_text()
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 26 Feb 1999 21:56:09 +0100
+ Message-ID: <36db0838.8805651@smtp1.ibm.net>
+ Subject: Re: PodParser 1.07 (was: RE: C<stuff()> vs stuff())
Branch: perl
- ! MANIFEST pod/perldiag.pod pod/perlfunc.pod pod/perlmodlib.pod
- ! pp.c t/comp/proto.t toke.c
+ ! lib/File/Compare.pm
____________________________________________________________________________
-[ 466] By: mbeattie on 1998/02/06 15:53:53
- Log: Subject: Newer -DLEAKTEST patch
- Date: Fri, 9 Jan 1998 17:55:09 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 3060] By: gsar on 1999/03/04 03:37:38
+ Log: better version of change#3038
+ From: abigail@fnx.com
+ Date: Mon, 1 Mar 1999 14:11:36 -0500 (EST)
+ Message-ID: <19990301191136.5557.qmail@alexandra.wayne.fnx.com>
+ Subject: Re: [PATCH 5.005_03 TRIAL-5 pod/pod2man.PL] Recognize -> and => inside
Branch: perl
- ! ext/DB_File/DB_File.xs ext/DynaLoader/dl_next.xs
- ! ext/DynaLoader/dl_vms.xs ext/Opcode/Opcode.xs handy.h hv.c
- ! perl.c perly.c perly.c.diff perly.fixer pod/perlembed.pod
- ! pod/perlguts.pod pod/perlrun.pod pod/perltoc.pod pp_hot.c sv.c
- ! toke.c util.c vms/perly_c.vms x2p/hash.c
-____________________________________________________________________________
-[ 465] By: mbeattie on 1998/02/06 15:46:35
- Log: More Chip patches (tweaked for _5x). The final one mentioned here
- (@ARGV with -i) actually went in at change 462 but I failed to
- add it to the change description:
- Subject: [PATCH] Fix typo: "FORM{,AT}LINE"
- Date: Sun, 11 Jan 1998 19:37:17 -0500 (EST)
- Subject: [PATCH] Fix for C<@x = my @y>
- Date: Sun, 11 Jan 1998 18:12:16 -0500 (EST)
- Subject: [PATCH] Fix SEGV on C<*glob{SCALAR,ARRAY}>
- Date: Thu, 5 Feb 1998 21:30:13 -0500 (EST)
- Subject: [PATCH] Allow last() to mean last
- Date: Thu, 5 Feb 1998 21:42:57 -0500 (EST)
- Subject: [PATCH] Consider @ARGV to be plain files if inplace (-i)
- Date: Wed, 4 Feb 1998 16:04:47 -0500 (EST)
- Branch: perl
- ! op.c perly.c perly.h perly.y sv.c t/op/my.t vms/perly_c.vms
- ! vms/perly_h.vms
-____________________________________________________________________________
-[ 464] By: mbeattie on 1998/02/06 15:06:18
- Log: More Chip patches:
- Subject: [PATCH] Fix SEGV from combining caller and C<package;>
- Date: Thu, 5 Feb 1998 21:47:50 -0500 (EST)
- Subject: [PATCH] Fix line numbers after here documents in eval STRING
- Date: Thu, 5 Feb 1998 21:50:08 -0500 (EST)
- Subject: [PATCH] Make recursive lexical analysis more robust
- Date: Thu, 5 Feb 1998 21:57:02 -0500 (EST)
- Branch: perl
- ! pp_ctl.c sv.c toke.c
-____________________________________________________________________________
-[ 463] By: mbeattie on 1998/02/06 15:04:17
- Log: Some more Chip patches (tweaked to match _5x):
- Subject: [PATCH] Fix empty BLOCK
- Date: Wed, 4 Feb 1998 16:52:28 -0500 (EST)
- Subject: [PATCH] fix (\@@) proto
- Date: Thu, 5 Feb 1998 10:24:29 -0500 (EST)
- Subject: [PATCH] Cope with lack of args in Fcntl::AUTOLOAD
- Date: Thu, 5 Feb 1998 21:26:55 -0500 (EST)
- Subject: [PATCH] Don't fold string comparison under C<use locale>
- Date: Thu, 5 Feb 1998 21:46:25 -0500 (EST)
- Branch: perl
- ! ext/Fcntl/Fcntl.pm op.c t/comp/proto.t toke.c
-____________________________________________________________________________
-[ 462] By: mbeattie on 1998/02/06 14:56:30
- Log: Some Chip patches (some tweaked to match _5x source):
- From: Chip Salzenberg <salzench@nielsenmedia.com>
- Subject: [PATCH] local leakage
- Date: Tue, 3 Feb 1998 09:16:50 -0500 (EST)
- Subject: [PATCH] NULs in patterns
- Date: Wed, 4 Feb 1998 01:33:51 -0500 (EST)
- Subject: [PATCH] Configure on PerlIO
- Date: Wed, 4 Feb 1998 01:38:43 -0500 (EST)
- Subject: [PATCH] Avoid core dump on package alias
- Date: Wed, 4 Feb 1998 15:38:42 -0500 (EST)
- Subject: [PATCH] Fix name of $Foo::{'Bar::'}
- Date: Wed, 4 Feb 1998 16:37:51 -0500 (EST)
- Branch: perl
- ! Configure doio.c gv.c op.c pp_ctl.c sv.c t/op/gv.t
- ! t/op/local.t
-____________________________________________________________________________
-[ 461] By: gsar on 1998/02/04 03:34:36
- Log: support win32_select(0,0,0,msec) (winsock doesn't)
- Branch: win32/perl
- ! win32/win32sck.c
+ ! pod/pod2man.PL
____________________________________________________________________________
-[ 460] By: gsar on 1998/02/04 00:44:47
- Log: bug: win32_select() must StartSockets()
- Branch: win32/perl
- ! win32/win32sck.c
+[ 3058] By: jhi on 1999/03/03 22:30:40
+ Log: Configure regen to
+ (1) match maint-5.005 patches #3056 and #3057
+ (2) better version of PHOSTNAME of #3050
+ (3) the crosscompile/multiarch config_h.SH trouble solved for now
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3054] By: jhi on 1999/03/03 09:57:59
+ Log: Change #3053 missed perldelta.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 3053] By: jhi on 1999/03/03 08:29:43
+ Log: Use '!' to mark native integer packings instead of '_'.
+ Branch: cfgperl
+ ! pod/perldiag.pod pp.c t/lib/ipc_sysv.t t/op/pack.t
+____________________________________________________________________________
+[ 3052] By: jhi on 1999/03/02 23:12:36
+ Log: The HP-UX threads patch (change #3028) is needed also here.
+ Branch: cfgperl
+ ! hints/hpux.sh thread.h
+____________________________________________________________________________
+[ 3051] By: jhi on 1999/03/02 08:24:52
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_0x and 5.005_5x]Minor update to README.VMS
+ Date: Mon, 01 Mar 1999 16:10:57 -0800
+ Message-Id: <3.0.6.32.19990301161057.03b1fc00@ous.edu>
+ Branch: cfgperl
+ ! README.vms
+ Branch: maint-5.005/perl
+ ! README.vms
+____________________________________________________________________________
+[ 3050] By: jhi on 1999/03/02 08:22:29
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH5.005_56]Diffs to get 5.005_56 building on VMS
+ Date: Mon, 01 Mar 1999 16:06:29 -0800
+ Message-Id: <3.0.6.32.19990301160629.02e09ec0@ous.edu>
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_56]vmsish.pm patch
+ Date: Mon, 01 Mar 1999 20:19:04 -0800
+ Message-Id: <3.0.6.32.19990301201904.02cff460@ous.edu>
+
+ plus Configure regen containing a "solution" to the
+ crosscompile/multiarch problem.
+ Branch: cfgperl
+ ! Configure config_h.SH configure.com ext/B/defsubs.h.PL
+ ! vms/ext/vmsish.pm vms/subconfigure.com vms/vms.c vms/vmsish.h
+____________________________________________________________________________
+[ 3049] By: jhi on 1999/03/02 07:34:21
+ Log: From: Spider Boardman <spider@leggy.zk3.dec.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH] Eliminate (valid) warning in byterun.c
+ Date: Mon, 01 Mar 1999 17:27:59 -0500
+ Message-Id: <199903012227.RAA00181@leggy.zk3.dec.com>
+ Branch: cfgperl
+ ! bytecode.h
+ Branch: maint-5.005/perl
+ ! bytecode.h
+____________________________________________________________________________
+[ 3048] By: gsar on 1999/03/02 06:41:21
+ Log: updated HP-UX notes from Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
+ Branch: perl
+ ! MANIFEST README.hpux
+____________________________________________________________________________
+[ 3047] By: jhi on 1999/03/01 06:34:43
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> README.hpux lib/File/Spec/Functions.pm
+ !> (integrate 28 files)
+____________________________________________________________________________
+[ 3046] By: gsar on 1999/03/01 05:34:28
+ Log: this is 5.005_56
+ Branch: perl
+ ! Changes
----------------
-Version 5.004_57
+Version 5.005_56
----------------
____________________________________________________________________________
-[ 459] By: mbeattie on 1998/02/03 16:00:07
- Log: Replaced two occurrences of THREADSV(find_thread_sv(...)) (order
- of execution causes core dump if threadsvp is moved). Replaced
- lvalue occurrence of AvARRAY(av) with SvPVX(av) (former does cast).
+[ 3045] By: gsar on 1999/03/01 03:32:30
+ Log: destroy PL_svref_mutex in perl_destruct()
Branch: perl
- ! av.c perl.c
+ ! perl.c
____________________________________________________________________________
-[ 458] By: mbeattie on 1998/02/03 14:40:02
- Log: Fix up MANIFEST.
+[ 3044] By: gsar on 1999/03/01 00:38:50
+ Log: up patchlevel &c.
Branch: perl
- ! MANIFEST
+ ! Changes patchlevel.h pod/perlhist.pod win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
____________________________________________________________________________
-[ 457] By: mbeattie on 1998/02/03 13:50:23
- Log: Integrate win32 into mainline. My last integration from ansiperl
- to the mainline was a dismal failure: I did -ay but meant -at.
- This should fix things now since win32 has already integrated
- all the necessary changes from ansiperl.
+[ 3043] By: gsar on 1999/03/01 00:14:15
+ Log: integrate cfgperl contents into mainline
Branch: perl
- !> (integrate 111 files)
+ ! pod/perldelta.pod
+ !> Configure config_h.SH
____________________________________________________________________________
-[ 456] By: gsar on 1998/02/03 04:48:08
- Log: Fix minor problems with non USE_THREADS build. win32 branch
- now looks 5.004_57-ready.
- Branch: win32/perl
- ! thread.h win32/makedef.pl
+[ 3042] By: gsar on 1999/02/28 23:55:08
+ Log: slightly edited version of suggested patch
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Mon, 01 Mar 1999 00:32:05 +0100
+ Message-ID: <36dbcf2c.12325433@smtp1.ibm.net>
+ Subject: Re: [PATCH 5.005_55] Cleanup of File::Spec module
+ Branch: perl
+ + lib/File/Spec/Functions.pm
+ ! MANIFEST lib/File/Spec.pm
____________________________________________________________________________
-[ 455] By: gsar on 1998/02/03 03:45:09
- Log: integrate mainline
- Branch: win32/perl
- !> (integrate 887 files)
+[ 3041] By: gsar on 1999/02/28 22:47:19
+ Log: fix subtle bug in eval'' testsuite
+ Branch: perl
+ ! t/op/eval.t
____________________________________________________________________________
-[ 454] By: mbeattie on 1998/02/02 16:44:24
- Log: The new dec_osf.sh didn't work so the new glibpth and useshrplib
- defaults have been commented out for now.
+[ 3040] By: gsar on 1999/02/28 22:46:24
+ Log: avoid literal control characters in change#3039
Branch: perl
- ! hints/dec_osf.sh
+ ! t/base/lex.t
____________________________________________________________________________
-[ 453] By: mbeattie on 1998/02/02 15:51:39
- Log: Introduced thr->threadsvp and THREADSV() for faster per-thread
- variables. Moved threadnum to a per-interpreter variable and
- made dTHR and lock/unlock of sv_mutex bypass the get/lock unless
- more than one thread may be running. Minor tweaks to Thread.xs.
+[ 3039] By: gsar on 1999/02/28 21:47:18
+ Log: todo item: permit extended control variables a la ${^Foo} (patch
+ courtesy Mark-Jason Dominus <mjd@plover.com>)
Branch: perl
- ! dosish.h embedvar.h ext/Thread/Thread.xs interp.sym intrpvar.h
- ! op.c perl.c perl.h pp.c pp_ctl.c scope.c sv.c thrdvar.h
- ! thread.h util.c
+ ! op.c pod/perldelta.pod pod/perltodo.pod pod/perlvar.pod
+ ! t/base/lex.t toke.c
____________________________________________________________________________
-[ 452] By: gsar on 1998/02/02 04:56:50
- Log: remove totally egregious s/\\dir// in File::Find
- Branch: win32/perl
- ! lib/File/Find.pm
+[ 3038] By: gsar on 1999/02/28 21:21:05
+ Log: From: abigail@fnx.com
+ Date: Sun, 28 Feb 1999 10:59:16 -0500 (EST)
+ Message-ID: <19990228155916.14496.qmail@alexandra.wayne.fnx.com>
+ Subject: Recognize -> and => inside [A-Z]<> sequences.
+ Branch: perl
+ ! pod/pod2man.PL
+____________________________________________________________________________
+[ 3037] By: gsar on 1999/02/28 21:12:22
+ Log: fix longstanding bug: searches for lexicals originating within eval''
+ weren't stopping at the subroutine boundary correctly
+ Branch: perl
+ ! op.c proto.h t/op/eval.t
+____________________________________________________________________________
+[ 3036] By: gsar on 1999/02/28 20:02:29
+ Log: revert parts of change#2990 to preserve predictable usage of Win32::Foo()
+ as stacked list values
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 27 Feb 1999 18:24:17 +0100
+ Message-ID: <36e22849.36531259@smtp1.ibm.net>
+ Subject: Re: resend [PATCH 5.005_55] Various win32/win32.c cleanup
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 3035] By: gsar on 1999/02/28 19:48:54
+ Log: remove superfluous stack_sp decl
+ Branch: perl
+ ! jpl/JNI/JNI.xs
+____________________________________________________________________________
+[ 3034] By: gsar on 1999/02/28 19:34:58
+ Log: s/print STDERR/warn/ suggested by abigail@fnx.com; add $VERSION
+ Branch: perl
+ ! lib/Getopt/Std.pm
+____________________________________________________________________________
+[ 3033] By: gsar on 1999/02/28 19:23:41
+ Log: add File::Compare::compare_text()
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 26 Feb 1999 00:20:41 +0100
+ Message-ID: <36dcd8ab.20195659@smtp1.ibm.net>
+ Subject: Re: PodParser 1.07 (was: RE: C<stuff()> vs stuff())
+ Branch: perl
+ ! lib/File/Compare.pm pod/perltodo.pod
+____________________________________________________________________________
+[ 3032] By: gsar on 1999/02/28 19:01:33
+ Log: add README.hpux
+ Branch: perl
+ + README.hpux
+ ! MAINTAIN MANIFEST
+____________________________________________________________________________
+[ 3031] By: gsar on 1999/02/28 18:49:08
+ Log: avoid escaping &amp; et al multiple times (variant of fix suggested by
+ James Cromie <jcromie@fossil.uswc.uswest.com>
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 3030] By: gsar on 1999/02/28 18:35:09
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 24 Feb 1999 22:34:56 +0100
+ Message-ID: <36d86f1e.11495549@smtp1.ibm.net>
+ Subject: [PATCH 5.005_55] Test::Harness setting $ENV{HARNESS_ACTIVE}
+ Branch: perl
+ ! lib/Test/Harness.pm
____________________________________________________________________________
-[ 451] By: gsar on 1998/02/01 22:20:20
- Log: added AS patch#3
- Message-Id: <01BD2EF2.53433A40.dougl@ActiveState.com>
- Date: Sun, 01 Feb 1998 09:18:13 PST
- From: Douglas Lankshear <dougl@ActiveState.com>
- To: "'Gurusamy Sarathy'" <gsar@umich.edu>
+[ 3029] By: gsar on 1999/02/28 18:28:18
+ Log: add note about env pollution
+ Branch: perl
+ ! INSTALL pod/perltodo.pod
+____________________________________________________________________________
+[ 3028] By: jhi on 1999/02/26 14:40:00
+ Log: HP-UX 11 threads.
+
+ From: Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
+ To: perl5-porters@perl.org
+ Cc: jhi@cc.hut.fi
+ Subject: Maint 5 and _54 with threading on HP-UX 11.00
+ Date: Wed, 3 Feb 1999 12:57:18 -0800 (PST)
+ Message-Id: <199902032057.MAA10218@xfiles.intercon.hp.com>
- Here's an additional diff against //depot/asperl
+ NOTE from jhi: the hpux hints could still be more robust by
+ disabling gdbm when necessary.
+
+ Currently if there's a libgdbm.sl (gdbm 1.7.3) which is pre-11,
+ linking -lgdbm -lpthread creates an executable that instantly
+ core dumps on a pthreads internal panic:
- The field name mg_length was changed back to mg_len
- The function name mg_len was change to mg_length
+ ./gdpt
- The need for sort_mutex removed thanks to the code derived
- from Tom Horsley's work.
+ Pthread internal error: message: __libc_reinit() failed, file: ../pthreads/pthread.c, line: 1096
+ Return Pointer is 0xc082bf33
+ 17639 quit (core dumped) ./gdpt
- -- Doug
- Branch: asperl
- + XSLock.h
- ! ObjXSub.h XSUB.h av.c embedvar.h ext/DynaLoader/dlutils.c
- ! globals.c ipstdio.h mg.c mg.h objpp.h perl.c perl.h perlio.h
- ! perlvars.h perly.c pp.c pp_ctl.c pp_hot.c proto.h regexec.c
- ! scope.c scope.h sv.c toke.c universal.c util.c
- ! win32/dl_win32.xs win32/iplio.c win32/ipstdio.c
- ! win32/perlobj.def win32/runperl.c
-____________________________________________________________________________
-[ 450] By: gsar on 1998/01/30 23:43:57
- Log: various tweaks
- - add new functions to proto.h
- - fix up makefile.mk for $(OBJECT)
- Branch: asperl
- ! pp_ctl.c proto.h win32/makefile.mk
-____________________________________________________________________________
-[ 449] By: gsar on 1998/01/30 21:23:15
- Log: fix up missing patches from AS patch#2
- Branch: asperl
- ! perldir.h perlenv.h perllio.h perlmem.h perlproc.h perlsock.h
- ! pp_ctl.c proto.h
-____________________________________________________________________________
-[ 448] By: gsar on 1998/01/30 18:23:17
- Log: fix htonlx typo
- Branch: win32/perl
- ! perlsock.h
-____________________________________________________________________________
-[ 447] By: mbeattie on 1998/01/30 16:03:49
- Log: Fix up MANIFEST to add missing files
+ You don't have to *use* either gdbm or pthreads in the executable,
+ just linking them together is enough. Workaround is to recompile
+ the GDBM under HP-UX 11, that makes the problem go away.
+ Branch: maint-5.005/perl
+ ! hints/hpux.sh thread.h
+____________________________________________________________________________
+[ 3025] By: jhi on 1999/02/25 20:41:07
+ Log: Temporary workaround for the config_h.SH versus
+ crosscompile and multiarch plus introduce 'rt'
+ to $libswanted: in UNIX98 sched_yield() lives there.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 3024] By: jhi on 1999/02/24 12:54:59
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> t/lib/fatal.t
+ !> (integrate 44 files)
+____________________________________________________________________________
+[ 3023] By: gsar on 1999/02/24 07:02:12
+ Log: integrate cfgperl contents
Branch: perl
- ! MANIFEST
+ !> (integrate 30 files)
____________________________________________________________________________
-[ 446] By: mbeattie on 1998/01/30 12:34:55
- Log: Bump patchlevel to 57.
+[ 3022] By: gsar on 1999/02/24 05:59:47
+ Log: From: Daniel Grisinger <dgris@moiraine.dimensional.com>
+ Date: 23 Feb 1999 17:53:22 -0700
+ Message-ID: <m3g17w62rh.fsf@moiraine.dimensional.com>
+ Subject: [PATCH: _55] perldoc -q broken
Branch: perl
- ! patchlevel.h
+ ! utils/perldoc.PL
____________________________________________________________________________
-[ 445] By: gsar on 1998/01/30 10:44:38
- Log: initial merge of latest win32 branch into ASPerl
- Branch: asperl
- +> lib/Tie/Array.pm pod/perlhist.pod t/lib/tie-push.t
- +> t/lib/tie-stdarray.t t/lib/tie-stdpush.t t/op/tiearray.t
- +> win32/bin/perlglob.pl
- !> (integrate 141 files)
+[ 3021] By: gsar on 1999/02/24 05:51:53
+ Log: ansify perlio.c, fix PerlIO-ish typos
+ Branch: perl
+ ! ext/DynaLoader/dl_beos.xs ext/DynaLoader/dl_cygwin32.xs
+ ! iperlsys.h perlio.c
____________________________________________________________________________
-[ 444] By: gsar on 1998/01/30 09:25:58
- Log: goofed branching, redo asperl branch
- Branch: asperl
+[ 3020] By: gsar on 1999/02/24 05:28:06
+ Log: adjust a Perl_malloc() flag for NeXT
+ From: Hans Mulder <hansm@icgned.icgroup.nl>
+ Date: Tue, 23 Feb 99 00:26:25 +0100
+ Message-Id: <9902222329.AA17516@icgned.icgroup.nl>
+ Subject: [PATCH for _55] MUTEX_INIT_CALLS_MALLOC no longer necessary
+ Branch: perl
! perl.h
____________________________________________________________________________
-[ 443] By: gsar on 1998/01/30 09:23:36
- Log: added AS patch#2
- Branch: asperl
- + ObjXSub.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h ipsock.h
- + ipstdio.h objpp.h win32/ipdir.c win32/ipenv.c win32/iplio.c
- + win32/ipmem.c win32/ipproc.c win32/ipsock.c win32/ipstdio.c
- + win32/ipstdiowin.h win32/perlobj.def
- ! EXTERN.h XSUB.h cv.h doio.c dosish.h dump.c embedvar.h
- ! globals.c gv.c hv.c intrpvar.h malloc.c mg.c mg.h op.c op.h
- ! opcode.h perl.c perl.h perldir.h perlenv.h perlio.h perllio.h
- ! perlmem.h perlproc.h perlsock.h perlvars.h perly.c pp.c pp.h
- ! pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c regcomp.h
- ! regexec.c run.c scope.c scope.h sv.c sv.h thread.h toke.c
- ! universal.c util.c vms/vms.c win32/Makefile win32/config_H.bc
- ! win32/config_H.vc win32/dl_win32.xs win32/include/sys/socket.h
- ! win32/makedef.pl win32/runperl.c win32/win32iop.h
-____________________________________________________________________________
-[ 441] By: gsar on 1998/01/30 08:54:19
- Log: Created new branch from win32@396, added AS patch#1
- Branch: asperl
- + doio.c malloc.c perl.c perl.h perldir.h perlenv.h perllio.h
- + perlmem.h perlproc.h perlsock.h pp.c pp_hot.c pp_sys.c
- + regcomp.c scope.h sv.c toke.c util.c
- +> (branch 915 files)
-____________________________________________________________________________
-[ 440] By: gsar on 1998/01/30 04:43:23
- Log: integrate winansi
- Branch: win32/perl
- +> pod/perlhist.pod
- !> MANIFEST av.c hv.c op.c perlsock.h pp_ctl.c pp_sys.c scope.c
- !> util.c
+[ 3019] By: gsar on 1999/02/24 05:19:42
+ Log: perltodo adjustments from Joshua Pritikin <joshua.pritikin@db.com>
+ Branch: perl
+ ! pod/perltodo.pod
____________________________________________________________________________
-[ 439] By: mbeattie on 1998/01/27 15:31:53
- Log: Integrate ansi branch into mainline (resolve -ay).
+[ 3018] By: gsar on 1999/02/24 04:15:18
+ Log: From: Joshua Pritikin <joshua.pritikin@db.com>
+ Date: Mon, 22 Feb 1999 11:29:09 -0500 (EST)
+ Message-ID: <Pine.GSO.4.02.9902221128200.500-100000@eq1062.wks.na.deuba.com>
+ Subject: improved error message [PATCH _55] [RESEND]
Branch: perl
- +> lib/Tie/Array.pm perldir.h perlenv.h perllio.h perlmem.h
- +> perlproc.h perlsock.h pod/perlhist.pod t/lib/tie-push.t
- +> t/lib/tie-stdarray.t t/lib/tie-stdpush.t t/op/tiearray.t
- +> win32/bin/perlglob.pl
- ! op.c
- !> (integrate 868 files)
+ ! sv.c
____________________________________________________________________________
-[ 438] By: nick on 1998/01/24 12:02:34
- Log: Gisle's av_unshift tweak, two small patches from chip
- and check for NULL in hv_delete in case '~' and tie magic
- are present
- Branch: ansiperl
- ! av.c hv.c op.c pp_ctl.c scope.c
-____________________________________________________________________________
-[ 437] By: nick on 1998/01/24 10:37:56
- Log: Get PerlXxx_yyyy() macro stuff to _compile_ on Solaris.
- Ugh! ...
- Macros were unsuitable for declaring the functions, extra () round
- parameters removed - non-function forms of PerlXxx_yyyy() need to
- add () themselves.
- Need to include perlmem.h in util.c (at least) if not using Perl's malloc.
- Branch: ansiperl
- ! perlsock.h pp_sys.c util.c
+[ 3017] By: gsar on 1999/02/24 03:50:34
+ Log: From: Tom Christiansen <tchrist@jhereg.perl.com>
+ Date: Sun, 21 Feb 1999 20:02:18 -0700
+ Message-Id: <199902220302.UAA09981@jhereg.perl.com>
+ Subject: perlfunc updates (against 55)
+ Branch: perl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 436] By: nick on 1998/01/24 10:03:03
- Log: Integrate win32 into ansiperl
- Branch: ansiperl
- +> perldir.h perlenv.h perllio.h perlmem.h perlproc.h perlsock.h
- +> win32/bin/perlglob.pl
- !> (integrate 38 files)
+[ 3016] By: gsar on 1999/02/24 03:17:05
+ Log: testsuite adjustments
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Sat, 20 Feb 1999 15:24:57 +0000
+ Message-Id: <E10EEH3-0003Wf-00@taurus.cus.cam.ac.uk>
+ Subject: Not quite OK: perl5.005_55 on SunOS 4.1.3 / gcc
+ Branch: perl
+ ! t/lib/io_sock.t t/op/lex_assign.t
____________________________________________________________________________
-[ 435] By: nick on 1998/01/24 09:47:49
- Log: Add perlhist.pod
- Branch: ansiperl
- + pod/perlhist.pod
- ! MANIFEST
+[ 3015] By: gsar on 1999/02/24 02:54:47
+ Log: avoid modifying readonly values from qw()
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
____________________________________________________________________________
-[ 434] By: gsar on 1998/01/19 05:01:47
- Log: s/PerlENV/PerlEnv/ just to be consistent
- Branch: win32/perl
- ! malloc.c perl.c perlenv.h regcomp.c toke.c util.c
-____________________________________________________________________________
-[ 433] By: gsar on 1998/01/19 04:52:18
- Log: foo() -> PerlGroup_foo() patch from ActiveState
- Branch: win32/perl
- + perldir.h perlenv.h perllio.h perlmem.h perlproc.h perlsock.h
- ! doio.c malloc.c perl.c perl.h pp.c pp_hot.c pp_sys.c regcomp.c
- ! scope.h sv.c toke.c util.c
-____________________________________________________________________________
-[ 432] By: gsar on 1998/01/19 04:42:26
- Log: integrate mainline
- Branch: win32/perl
- !> pod/perlfunc.pod
-____________________________________________________________________________
-[ 431] By: gsar on 1998/01/19 04:40:04
- Log: integrate changes in winansi
- Branch: win32/perl
- +> lib/Tie/Array.pm t/lib/tie-push.t t/lib/tie-stdarray.t
- +> t/lib/tie-stdpush.t t/op/tiearray.t
- !> (integrate 98 files)
-____________________________________________________________________________
-[ 430] By: gsar on 1998/01/19 04:10:43
- Log: Fix autovivification problems with XSUB OUTPUT args
- Message-Id: <199801190409.XAA26710@aatma.engin.umich.edu>
- Date: Sun, 18 Jan 1998 23:09:07 EST
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Subject: [PATCH] XSUB OUTPUT arguments and 'set' magic
- Branch: win32/perl
- ! ext/GDBM_File/typemap ext/NDBM_File/typemap
- ! ext/ODBM_File/typemap ext/SDBM_File/typemap
- ! lib/ExtUtils/typemap os2/OS2/PrfDB/typemap pod/perlguts.pod
- ! pod/perlxs.pod pod/perlxstut.pod sv.c sv.h win32/win32.h
-____________________________________________________________________________
-[ 429] By: nick on 1998/01/17 21:01:50
- Log: Subject: [PATCH] 5.004_56 threaded and "CONFIG key 'exe_ext' does not exist in Config.pm"
- Date: Thu, 25 Dec 1997 13:39:15 -0500
- From: Spider Boardman <spider@Orb.Nashua.NH.US>
- To: perl5-porters@perl.org
-
- It turns out that the potential for the "CONFIG key 'exe_ext'
- does not exist in Config.pm" problem has been around for a while,
- in the definition of SvTRUE(). It's just that non-gcc compilers
- are more or less being built as CRIPPLED_CC when USE_THREADS is
- defined (even if they can inline things). The inline macro for
- SvTRUE works with tied hashes and the EXISTS method, and the
- functional version (sv_true in 5.004_56, or SvTRUE in 5.004_04)
- does not, because it adds an excess mg_get() which replaces the
- EXISTS result with a FETCH result.
- Branch: ansiperl
- ! sv.c
+[ 3014] By: gsar on 1999/02/24 02:49:04
+ Log: more "correct" utbuf for utime()
+ Branch: perl
+ ! doio.c
____________________________________________________________________________
-[ 428] By: nick on 1998/01/17 20:59:11
- Log: From: Robin Barker <rmb1@cise.npl.co.uk>
- Date: Fri, 19 Dec 97 17:19:09 GMT
- Message-Id: <26260.9712191719@lightning.cise.npl.co.uk>
- Branch: ansiperl
- ! doio.c sv.c toke.c util.c
+[ 3013] By: jhi on 1999/02/22 19:27:44
+ Log: Fix MacPerl version, change PowerUX to PowerMAX.
+
+ From: Chris Nandor <pudge@pobox.com>
+ To: jhi@iki.fi
+ Cc: perl5-porters@perl.org
+ Subject: Re: perl current availability as documented by perl.pod
+ Date: Sun, 21 Feb 1999 11:06:03 -0500
+ Message-Id: <v04020a07b2f5df60c9e3@[192.168.0.77]>
+
+ From: Tom Horsley <Tom.Horsley@mail.ccur.com>
+ To: jhi@iki.fi
+ Cc: perl5-porters@perl.org
+ Subject: Re: perl current availability as documented by perl.pod
+ Date: Mon, 22 Feb 1999 13:08:30 GMT
+ Message-Id: <199902221308.NAA19971@cleo.ccur.com>
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 427] By: nick on 1998/01/17 12:01:53
- Log: Permit tie ?foo,$object
- tidy up dead #ifdef ORIGINAL_TIE)
- Remove 'P' magic from hash, before adding new one in dbm_open like tie does.
- Branch: ansiperl
- ! pp_sys.c
+[ 3012] By: jhi on 1999/02/22 10:26:11
+ Log: Snapshot the cross-compilation/multiarchitecture stuff
+ (currently broken in next)
+ Branch: cfgperl
+ ! Configure config_h.SH pp.c
____________________________________________________________________________
-[ 426] By: nick on 1998/01/15 18:06:36
- Log: First working TIEARRAY and other misc tie fixes
- Branch: ansiperl
- ! MANIFEST pp.c pp_hot.c t/op/tiearray.t
+[ 3011] By: jhi on 1999/02/22 10:24:51
+ Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ To: gsar@activestate.com (Gurusamy Sarathy)
+ Cc: perl5-porters@perl.org (Perl5 Porters)
+ Subject: [PATCH 5.005_55] DB_File 1.64 patch
+ Date: Mon, 22 Feb 1999 10:07:00 +0000 (GMT)
+ Message-Id: <9902221007.AA17751@claudius.bfsec.bt.co.uk>
+ Branch: cfgperl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap t/lib/db-recno.t
____________________________________________________________________________
-[ 425] By: nick on 1998/01/14 21:56:40
- Log: Not working yet - split problems ...
- Branch: ansiperl
- ! pp.c t/lib/thread.t t/op/tiearray.t
+[ 3009] By: jhi on 1999/02/22 09:14:26
+ Log: Scratch #3008 and introduce $crosscompile and $multiarch
+ also in non-Configure lands.
+ Branch: cfgperl
+ ! Configure config_h.SH hints/next_3.sh hints/next_3_0.sh
+ ! hints/next_4.sh vms/subconfigure.com win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc
____________________________________________________________________________
-[ 424] By: nick on 1998/01/14 18:49:25
- Log: TIEARRAY updates - almost works ...
- Branch: ansiperl
- + t/lib/tie-push.t t/lib/tie-stdarray.t t/lib/tie-stdpush.t
- ! MANIFEST av.c av.h ext/DB_File/DB_File.pm lib/Tie/Array.pm
- ! mg.c pod/perltie.pod pp.c pp_hot.c pp_sys.c scope.c
- ! t/op/avhv.t t/op/push.t t/op/tiearray.t
-____________________________________________________________________________
-[ 423] By: gsar on 1998/01/14 00:13:16
- Log: fix MakeMaker installbin problem
- Message-Id: <199801070016.TAA17766@aatma.engin.umich.edu>
- Subject: Re: can't modify message with HTML-Stream, v.1.42
- Date: Tue, 06 Jan 1998 19:16:35 -0500
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Branch: win32/perl
- ! lib/ExtUtils/MM_Unix.pm
+[ 3008] By: jhi on 1999/02/22 08:58:04
+ Log: Add -DMULTIARCH (see change #3006).
+ Branch: cfgperl
+ ! hints/next_3.sh hints/next_3_0.sh hints/next_4.sh
____________________________________________________________________________
-[ 422] By: gsar on 1998/01/13 23:53:02
- Log: add archname to *sitearch in config.{b,g,v}c
- Branch: win32/perl
- ! win32/config.bc win32/config.gc win32/config.vc
+[ 3007] By: jhi on 1999/02/22 08:54:06
+ Log: Undo the references to local{lib,arch} introduced by #3006.
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 421] By: gsar on 1998/01/13 23:15:14
- Log: set $ENV{PERL5LIB} in t/harness (so child perlglob.bat sees it)
- Branch: win32/perl
- ! t/harness
+[ 3006] By: jhi on 1999/02/22 08:43:50
+ Log: From: hansm@icgned.icgroup.nl
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00555 on OPENSTEP-Mach-thread 4_2 (UNINSTALLED)
+ Date: Sun, 21 Feb 1999 22:58:55 +0100
+ Reply-To: hansmu@xs4all.nl
+ Message-Id: <9902212201.AA13386@icgned.icgroup.nl>
+
+ plus other Configure changes: prepare for cross-compilation/
+ multiarchitecture builds.
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 420] By: nick on 1998/01/13 22:55:02
- Log: tiearray tweaks
- Branch: ansiperl
- ! av.c pp_sys.c t/op/nothread.t t/op/tiearray.t
+[ 3005] By: jhi on 1999/02/22 08:35:30
+ Log: Configure/Perl knew how to look for use Mach cthreads
+ but Configure didn't let them to be used ($osname 'next').
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: maint-5.005/perl
+ ! Configure
____________________________________________________________________________
-[ 419] By: nick on 1998/01/13 21:27:33
- Log: Skeleton Tie::Array
- Branch: ansiperl
- + lib/Tie/Array.pm
+[ 3004] By: jhi on 1999/02/21 15:46:02
+ Log: Update Acorn AVAILABILITY.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 418] By: nick on 1998/01/13 20:52:38
- Log: tie array changes to core and tests
- Branch: ansiperl
- + t/op/tiearray.t
- ! MANIFEST av.c av.h deb.c embed.h ext/DB_File/DB_File.pm
- ! global.sym gv.c mg.c op.c perl.c perl.h pp.c pp.h pp_ctl.c
- ! pp_hot.c proto.h sv.c toke.c universal.c util.c
-____________________________________________________________________________
-[ 417] By: gsar on 1998/01/13 20:49:52
- Log: fix perlglob.bat warnings by splitting it from File::DosGlob
- Branch: win32/perl
- + win32/bin/perlglob.pl
- ! MANIFEST README.win32 lib/File/DosGlob.pm win32/Makefile
- ! win32/makefile.mk
+[ 3003] By: jhi on 1999/02/21 14:50:42
+ Log: From: rjk@linguist.dartmouth.edu (Ronald J. Kimball)
+ To: perl5-porters@perl.org (Perl 5 Porters)
+ Subject: PATCH: perlref.pod - symbolic ref example
+ Date: Sat, 20 Feb 1999 17:32:11 -0500 (EST)
+ Message-Id: <199902202232.RAA62306@linguist.dartmouth.edu>
+ Branch: cfgperl
+ ! pod/perlref.pod
+ Branch: maint-5.005/perl
+ ! pod/perlref.pod
____________________________________________________________________________
-[ 416] By: gsar on 1998/01/13 02:46:53
- Log: various tweaks to build support (NOTE: meant for 5.004_57)
- - build and install x2p
- - fix installperl warnings on win32
- - `make install` now does puts the archlibs in right places
- - makefiles don't default to USE_THREADS anymore
- - sync config.{b,g,v}c
- - sync makefile.mk -> Makefile
- Branch: win32/perl
- ! installperl win32/Makefile win32/config.bc win32/config.gc
- ! win32/config.vc win32/config_sh.PL win32/makefile.mk x2p/a2p.h
- ! x2p/a2py.c
-____________________________________________________________________________
-[ 415] By: nick on 1998/01/11 16:54:26
- Log: Integrate win32 into ansiperl
- Branch: ansiperl
- !> Configure hints/dec_osf.sh hv.c lib/Getopt/Long.pm lib/blib.pm
- !> lib/newgetopt.pl perl.h perl_exp.SH pp_ctl.c pp_hot.c pp_sys.c
- !> proto.h regcomp.h regexec.c t/op/re_tests t/pragma/locale.t
- !> utils/perldoc.PL vms/config.vms vms/descrip.mms
- !> vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms vms/vms.c
- !> vms/vmsish.h x2p/s2p.PL
-____________________________________________________________________________
-[ 414] By: nick on 1998/01/11 15:13:49
- Log: Integratye mainline -> ansiperl
- Branch: ansiperl
- !> (integrate 64 files)
+[ 3002] By: jhi on 1999/02/21 14:35:22
+ Log: Sync cfgperl with maint-5.005 change #3000.
+ Branch: cfgperl
+ ! pod/perlfunc.pod t/op/pack.t
____________________________________________________________________________
-[ 413] By: mbeattie on 1998/01/09 12:57:58
- Log: Add missing blank line in pod/perlfunc.pod.
+[ 2999] By: gsar on 1999/02/20 22:48:30
+ Log: From: John Bley <jbb6@acpub.duke.edu>
+ Date: Sat, 20 Feb 1999 16:02:34 EST
+ Message-Id: <Pine.SOL.3.91.990220155832.9913A-100000@soc11.acpub.duke.edu>
+ Subject: [PATCH]5.005_55 (CORE) Sparse intializer in regcomp.c
Branch: perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 2998] By: jhi on 1999/02/20 14:13:06
+ Log: Enhanced the endianness description.
+ Branch: cfgperl
! pod/perlfunc.pod
____________________________________________________________________________
-[ 412] By: gsar on 1998/01/08 20:54:31
- Log: change#398 breaks ENV_IS_CASELESS, fix it
- Branch: win32/perl
- ! hv.c
+[ 2996] By: jhi on 1999/02/20 13:55:41
+ Log: Glossary now mostly fixed.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
____________________________________________________________________________
-[ 411] By: gsar on 1998/01/08 18:33:58
- Log: Integrate mainline
- Branch: win32/perl
- !> Configure hints/dec_osf.sh hv.c lib/Getopt/Long.pm lib/blib.pm
- !> lib/newgetopt.pl perl.h perl_exp.SH pp_ctl.c pp_hot.c pp_sys.c
- !> proto.h regcomp.h regexec.c t/op/re_tests t/pragma/locale.t
- !> utils/perldoc.PL vms/config.vms vms/descrip.mms
- !> vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms vms/vms.c
- !> vms/vmsish.h x2p/s2p.PL
-____________________________________________________________________________
-[ 410] By: mbeattie on 1998/01/08 16:06:22
- Log: Fix thinko in t/pragma/locale.t:
- Subject: [PATCH] _04 or _56: locale.t
- Date: Sun, 4 Jan 1998 23:48:44 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Branch: perl
- ! t/pragma/locale.t
+[ 2994] By: jhi on 1999/02/20 11:58:33
+ Log: Perldeltify GNU/Hurd.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 409] By: mbeattie on 1998/01/08 16:05:09
- Log: Use Tom Horley's qsort for sorting:
- Subject: Re: [PATCH for 5.004_56] Re: op/sort.t hangs under Solaris 2.5
- Date: Fri, 02 Jan 1998 19:33:24 -0500 (EST)
- From: Hans Mulder <hansm@icgned.nl>
+[ 2993] By: gsar on 1999/02/20 00:59:10
+ Log: fix typo in Perl_sbrk()
+ From: hansm@icgned.icgroup.nl
+ Date: Fri, 19 Feb 1999 23:19:31 +0100
+ Message-Id: <9902192221.AA07213@icgned.icgroup.nl>
+ Subject: Not OK: perl 5.00555 on OPENSTEP-Mach 4_2 (UNINSTALLED)
Branch: perl
- ! pp_ctl.c
+ ! malloc.c
____________________________________________________________________________
-[ 408] By: mbeattie on 1998/01/08 16:01:57
- Log: Make s2p not use cpp:
- Subject: [PATCH for 5.004_56] s2p shouldn't use cpp
- Date: Mon, 29 Dec 1997 19:38:18 -0500 (EST)
- From: Hans Mulder <hansm@icgned.nl>
+[ 2992] By: gsar on 1999/02/20 00:51:08
+ Log: integrate change#2980 from maint-5.005
Branch: perl
- ! x2p/s2p.PL
+ !> utils/h2xs.PL
____________________________________________________________________________
-[ 407] By: mbeattie on 1998/01/08 15:57:31
- Log: DG/UX tweaks to perl.h:
- Subject: [PATCH] _56 on dgux without threads
- Date: Sat, 20 Dec 1997 23:01:40 -0500
- From: Roderick Schertler <roderick@argon.org>
+[ 2991] By: gsar on 1999/02/20 00:34:01
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Thu, 18 Feb 1999 18:51:38 +0000
+ Message-Id: <199902181851.SAA14018@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_55] test failures with MIME-tools-4.122 and perl 5.005_55
Branch: perl
- ! perl.h
+ ! pp_hot.c t/op/pat.t
____________________________________________________________________________
-[ 406] By: mbeattie on 1998/01/08 15:56:02
- Log: Configure and hints/dec_osf.sh changes for Digital UNIX:
- Subject: [PATCH] perl5.004_56 NOT OK on alpha-dec_osf-thread (Digital UNIX X5.0-13)
- Date: Sat, 20 Dec 1997 02:30:01 -0500
- From: Spider Boardman <spider@web.zk3.dec.com>
+[ 2990] By: gsar on 1999/02/20 00:30:48
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Thu, 18 Feb 1999 19:14:07 +0100
+ Message-ID: <36d15809.40853323@smtp1.ibm.net>
+ Subject: resend [PATCH 5.005_55] Various win32/win32.c cleanup
Branch: perl
- ! Configure hints/dec_osf.sh
+ ! win32/win32.c
____________________________________________________________________________
-[ 405] By: mbeattie on 1998/01/08 15:53:40
- Log: Missing "" in Configure echo for gethbadd_addr_type.
+[ 2989] By: gsar on 1999/02/20 00:27:01
+ Log: do poll() emulation unless HAS_POLL && I_POLL
Branch: perl
- ! Configure
+ ! ext/IO/poll.h
____________________________________________________________________________
-[ 404] By: mbeattie on 1998/01/08 13:04:48
- Log: print/printf/... over-eager mg_find for glob magic:
- Subject: [PATCH] fix inefficient checks for TIEHANDLE
- Date: Wed, 07 Jan 1998 20:06:05 -0500
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
+[ 2988] By: gsar on 1999/02/19 23:52:12
+ Log: tweak RE for NaNQ? recognition
Branch: perl
- ! pp_hot.c pp_sys.c
+ ! t/lib/bigfloatpm.t
____________________________________________________________________________
-[ 403] By: mbeattie on 1998/01/08 12:56:31
- Log: Assorted VMS patches (mostly VMS makefile update for new headers):
- Subject: [PATCH] VMS update for 5.004_56
- Date: Sat, 03 Jan 1998 03:54:29 -0500 (EST)
- From: Charles Bailey <bailey@newman.upenn.edu>
+[ 2987] By: gsar on 1999/02/19 23:29:59
+ Log: mention C<use utf8> and C<use warning> in perldelta
Branch: perl
- ! lib/blib.pm proto.h regcomp.h vms/config.vms vms/descrip.mms
- ! vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms vms/vms.c
- ! vms/vmsish.h
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 402] By: mbeattie on 1998/01/08 12:46:15
- Log: Fix utils/perldoc.PL for dos-djgpp:
- Subject: 5.004_56: perldoc.PL dos-djgpp patches
- Date: Tue, 6 Jan 1998 18:14:59 +0100
- From: Molnar Laszlo <molnarl@cdata.tvnet.hu>
- Branch: perl
- ! utils/perldoc.PL
+[ 2985] By: jhi on 1999/02/19 20:43:19
+ Log: pack/unpack better in (network-)short-non-16-bits and
+ (network-)long-non-32-bits systems such as Cray C90.
+ Branch: cfgperl
+ ! perl.h pp.c t/op/pack.t
____________________________________________________________________________
-[ 401] By: mbeattie on 1998/01/08 12:40:14
- Log: Version 2.13 of GetoptLong:
- Subject: Re: ANNOUNCE: perl 5.004_56 is available
- Date: 06 Jan 1998 16:21:45 +0100
- From: JVromans@Squirrel.nl (Johan Vromans)
+[ 2984] By: jhi on 1999/02/19 20:38:54
+ Log: Regen Configure.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! perl.c
+____________________________________________________________________________
+[ 2982] By: jhi on 1999/02/19 19:51:49
+ Log: Configure update: fstatvfs/fstafs/getmntent/hasmntopt were
+ not probed for and
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Chaim Frenkel <chaimf@pobox.com>,
+ Russ Allbery <rra@stanford.edu>,
+ Jarkko Hietaniemi <jhi@iki.fi>,
+ Gurusamy Sarathy <gsar@activestate.com>,
+ Graham Barr <gbarr@pobox.com>
+ Cc: bdensch@ameritech.net, perlbug@perl.com
+ Subject: [PATCH] Re: Solaris 7 for Intel
+ Message-ID: <19990219124404.A30182@O2.chapin.edu>
+
+ Glossary is still missing some terms because
+ mkglossary is misbehaving (change #2981 updated
+ Glossary manually)
+ Branch: cfgperl
+ ! Configure Makefile.SH Porting/Glossary Porting/config.sh
+ ! Porting/config_H
+____________________________________________________________________________
+[ 2980] By: gbarr on 1999/02/19 16:06:53
+ Log: Make result of h2xs work when user adds C<use strict>
+ Branch: maint-5.005/perl
+ ! utils/h2xs.PL
+____________________________________________________________________________
+[ 2979] By: gsar on 1999/02/19 05:24:29
+ Log: doc for change#2978
Branch: perl
- ! lib/Getopt/Long.pm lib/newgetopt.pl
+ ! pod/perlsub.pod
____________________________________________________________________________
-[ 400] By: mbeattie on 1998/01/08 12:28:08
- Log: Fix variable export and threading configuration for AIX:
- Subject: [PATCH] 5.004_56: AIX 4.1.5.0: sans et avec threads
- Date: Tue, 23 Dec 1997 15:39:12 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 2978] By: gsar on 1999/02/19 05:08:29
+ Log: bring '*' prototype closer to how it behaves internally
Branch: perl
- ! Configure perl_exp.SH
+ + t/lib/fatal.t
+ ! MANIFEST lib/Fatal.pm op.c t/comp/proto.t
____________________________________________________________________________
-[ 399] By: mbeattie on 1998/01/08 12:25:38
- Log: Regexp fix: (?>a+)b doesn't match aaab:
- Subject: Re: Regexp [PATCH] 5.004_56 (?>...)
- Date: Fri, 19 Dec 1997 16:02:50 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 2977] By: gsar on 1999/02/19 02:50:31
+ Log: stem leakage of perly.h #defines #ifndef PERL_CORE
Branch: perl
- ! regexec.c t/op/re_tests
+ ! perly.h
____________________________________________________________________________
-[ 398] By: mbeattie on 1998/01/08 12:23:41
- Log: Fix hv_delete for 'm'-magic. Based on following patch, modified
- to cope with ENV_IS_CASELESS:
- Subject: [perl5.004_56] [PATCH] hv_delete and 'm' magic
- Date: Fri, 19 Dec 1997 11:31:36 -0500
- From: Owen Taylor <owt1@cornell.edu>
+[ 2975] By: gsar on 1999/02/18 21:41:57
+ Log: distinguish eval'' from BEGIN|INIT|END CVs (fixes buggy propagation
+ of lexical searches in BEGIN|INIT|END)
Branch: perl
- ! hv.c
+ ! cop.h cv.h op.c perly.c perly.y pp_ctl.c t/op/misc.t
+ ! vms/perly_c.vms
____________________________________________________________________________
-[ 397] By: mbeattie on 1998/01/08 12:10:29
- Log: Integrate win32 branch into mainline.
+[ 2974] By: gsar on 1999/02/18 21:03:06
+ Log: missing PERL_POLLUTE_MALLOC
Branch: perl
- !> (integrate 41 files)
+ ! ext/SDBM_File/sdbm/sdbm.h
____________________________________________________________________________
-[ 396] By: gsar on 1998/01/07 19:12:27
- Log: tweak case-insensitive ENV implementation
- Branch: win32/perl
- ! hv.c
+[ 2973] By: gsar on 1999/02/18 17:10:49
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Wed, 17 Feb 1999 17:22:50 EST
+ Message-Id: <Pine.GSU.4.05.9902171720490.17243-100000@newton.phys>
+ Subject: [PATCH 5.005_xx] dotsh.pl triggers new warnings
+ Branch: perl
+ ! lib/dotsh.pl
____________________________________________________________________________
-[ 395] By: nick on 1998/01/07 18:40:55
- Log: Integrate win32 branch
- Branch: ansiperl
- !> (integrate 31 files)
-____________________________________________________________________________
-[ 394] By: gsar on 1998/01/05 19:17:40
- Log: Allow $ENV{PERL5SHELL} to contain switches etc., and document
- the fact
- Branch: win32/perl
- ! pod/perlrun.pod win32/win32.c
-____________________________________________________________________________
-[ 393] By: gsar on 1998/01/05 05:43:33
- Log: Support case-tolerant %ENV
- - underlying system calls see the case-as-supplied by user
- - added tests to verify addition/deletion/enumeration case-tolerance
- - hv.c touched, but changes are fully conditional on -DENV_IS_CASELESS,
- which is default on win32 now
- Branch: win32/perl
- ! hv.c t/op/magic.t win32/win32.h
-____________________________________________________________________________
-[ 392] By: gsar on 1998/01/04 17:55:19
- Log: Add a tweaked version of:
- Message-Id: <199801040630.AA29298@metronet.com>
- Date: Sun, 04 Jan 1998 00:30:57 CST
- From: Tye McQueen <tye@metronet.com>
- Subject: New patch for $^E==GetLastError() under Win32
- Branch: win32/perl
- ! doio.c lib/dumpvar.pl lib/perl5db.pl mg.c perl.h
- ! pod/perlfunc.pod pod/perlvar.pod util.c win32/makedef.pl
- ! win32/win32.c win32/win32.h
+[ 2972] By: gsar on 1999/02/18 17:04:12
+ Log: s/#defined/#define/
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.xs
____________________________________________________________________________
-[ 391] By: gsar on 1998/01/04 07:59:44
- Log: Various win32 fixes
- - support spawn via system(&P_NOWAIT,...) like OS2
- - support wait() and waitpid()
- - s/GetCurrentDirectory/GetCwd/, long-named XS to be removed
- - support -lfoo properly in ExtUtils::Liblist
- - fix outdated info about Win32 support in perlfaq2
- - fix win32 bug in perldoc that causes spurious warnings
- - regularize global function/variable names yet more
- - fix bug in do_aspawn() (it was always invoking shell, instead of
- almost never)
- - implement and export win32_wait()
- - stub version of USE_RTL_THREAD_API
- Branch: win32/perl
- ! README.win32 dosish.h lib/Cwd.pm lib/ExtUtils/Liblist.pm
- ! pod/perlfaq2.pod pp_sys.c util.c utils/perldoc.PL
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/config_h.PL win32/perllib.c win32/win32.c win32/win32.h
- ! win32/win32iop.h win32/win32sck.c win32/win32thread.c
- ! win32/win32thread.h
+[ 2970] By: gsar on 1999/02/18 03:26:43
+ Log: ensure is data malloc()ed by GDBM is free()d (not Perl_mfree()d)
+ Branch: perl
+ ! ext/GDBM_File/GDBM_File.pm ext/GDBM_File/GDBM_File.xs
+ ! ext/GDBM_File/typemap
____________________________________________________________________________
-[ 390] By: gsar on 1997/12/30 21:00:28
- Log: Fix $ENV{Path} in FindBin.pm
- Branch: win32/perl
- ! lib/FindBin.pm
+[ 2969] By: gsar on 1999/02/17 23:30:47
+ Log: correct slurp mode doc
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlop.pod
____________________________________________________________________________
-[ 389] By: nick on 1997/12/29 10:33:23
- Log: Resolve ansiperl against win32
- Branch: ansiperl
- !> (integrate 105 files)
+[ 2968] By: jhi on 1999/02/17 23:15:49
+ Log: Ultrix hints update.
+
+ From: Spider Boardman <spider@zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00555 on RISC-ultrix 4.4 (UNINSTALLED)
+ Date: Tue, 16 Feb 1999 23:04:28 -0500
+ Message-Id: <9902170404.AA11036@abyss.zk3.dec.com>
+ Branch: cfgperl
+ ! hints/ultrix_4.sh
____________________________________________________________________________
-[ 388] By: gsar on 1997/12/24 04:59:28
- Log: make $? Unix (and ActiveWare) compatible
- Branch: win32/perl
- ! README.win32 win32/win32.c
+[ 2966] By: jhi on 1999/02/17 23:09:21
+ Log: Change #2965 wiped out some Sarathy's _55 changes.
+ Now unwiped.
+ Branch: cfgperl
+ ! Configure pp.c t/op/pack.t
____________________________________________________________________________
-[ 387] By: gsar on 1997/12/24 04:21:30
- Log: support ioctl() on sockets (does what ioctlsocket() does) to make
- non-blocking IO on sockets possible
- Branch: win32/perl
- ! README.win32 dosish.h win32/makedef.pl win32/win32.c
- ! win32/win32iop.h win32/win32sck.c
+[ 2965] By: jhi on 1999/02/17 23:00:04
+ Log: Configure tweaks.
+
+ Fix the Unixware/SCO uname scan:
+
+ From: Tom Hughes <thh@cyberscience.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00555 on i386-svr4 [actually Unixware 2.1] (UNINSTALLED)
+ Date: 17 Feb 1999 15:34:15 +0000
+ Message-ID: <yekg185nix4.fsf@elva.cyberscience.com>
+
+ AIX syscalls.exp scan: the syscall might be marked 32, 3264, or 64
+
+ From: Joe Buehler <jhpb@hekimian.com>
+ To: perl5-porters@perl.org
+ Subject: setsid not detected by perl 5.005_02 configure under AIX 4.3
+ Date: 12 Feb 1999 11:25:21 -0500
+ Message-ID: <yd3lni3613i.fsf@ganymede.hekimian.com>
+
+ Make the pthreads joinable constant scan to output to fd 4, not 2.
+ Branch: cfgperl
+ ! Configure
____________________________________________________________________________
-[ 386] By: gsar on 1997/12/24 03:10:55
- Log: support getlogin()
- Branch: win32/perl
- ! README.win32 win32/config.bc win32/config.gc win32/config.vc
- ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
- ! win32/win32.c win32/win32.h
+[ 2964] By: gsar on 1999/02/17 21:30:07
+ Log: From: Tom Christiansen <tchrist@jhereg.perl.com>
+ Date: Wed, 17 Feb 1999 06:53:13 -0700
+ Message-Id: <199902171353.GAA15682@jhereg.perl.com>
+ Subject: PATCH: lib/Pod/Functions.pm for perl5.005_55
+ Branch: perl
+ ! lib/Pod/Functions.pm
____________________________________________________________________________
-[ 385] By: gsar on 1997/12/24 02:24:59
- Log: add support for crypt() via user-supplied des_fcrypt() source or library.
- Update README.win32.
- Branch: win32/perl
- ! README.win32 perl.h win32/Makefile win32/makedef.pl
- ! win32/makefile.mk win32/win32.c win32/win32.h win32/win32iop.h
+[ 2963] By: gsar on 1999/02/17 21:18:21
+ Log: fix comppad handling for failures in eval 'qr/(?p{...})/'
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Wed, 17 Feb 1999 10:06:01 +0000
+ Message-Id: <199902171006.KAA10204@crypt.compulink.co.uk>
+ Subject: Re: [5.005_53] panic: pad_free curpad
+ Branch: perl
+ ! regcomp.c regexec.c t/op/misc.t
____________________________________________________________________________
-[ 384] By: gsar on 1997/12/24 02:22:42
- Log: tweak op.c to avoid warning
- Branch: win32/perl
- ! op.c
+[ 2962] By: gsar on 1999/02/16 21:26:28
+ Log: NaNQ? tweak
+ Branch: perl
+ ! t/lib/bigfloatpm.t
____________________________________________________________________________
-[ 383] By: gsar on 1997/12/23 21:12:42
- Log: Trivial bugfix#3 from local repository
- Message-Id: <199712061100.GAA14864@aatma.engin.umich.edu>
- Subject: Re: Assigning result of pop scrambles unrelated reference
- Date: Sat, 06 Dec 1997 06:00:45 -0500
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Branch: win32/perl
- ! sv.c
+[ 2961] By: jhi on 1999/02/16 19:26:38
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 37 files)
____________________________________________________________________________
-[ 382] By: gsar on 1997/12/23 21:09:32
- Log: Trivial bugfix#2 from local repository
- Message-Id: <199712061025.FAA14396@aatma.engin.umich.edu>
- Subject: Re: eval of sub gives spurious "uninitialised" warning
- Date: Sat, 06 Dec 1997 05:25:07 -0500
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Branch: win32/perl
- ! op.c pod/perldelta.pod pod/perlfunc.pod t/op/eval.t
-____________________________________________________________________________
-[ 381] By: gsar on 1997/12/23 21:01:04
- Log: Trivial bugfix#1 from local repository
- Message-Id: <199711282326.SAA15090@aatma.engin.umich.edu>
- Subject: [PATCH] Re: [5.004_04 BUG] bless broke scoping?
- Date: Fri, 28 Nov 1997 18:26:52 -0500
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Branch: win32/perl
- ! scope.c
+[ 2960] By: gsar on 1999/02/16 18:04:29
+ Log: undo change#2465 (qw[] is a real list now)
+ Branch: perl
+ ! pod/perlop.pod
____________________________________________________________________________
-[ 380] By: gsar on 1997/12/18 15:10:23
- Log: Integrate mainline
- Branch: win32/perl
- +> README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
- +> djgpp/djgppsed.sh djgpp/fixpmain hints/dos_djgpp.sh
- +> os2/os2.sym os2/os2thread.h
- !> (integrate 77 files)
+[ 2959] By: gsar on 1999/02/16 07:09:33
+ Log: this was 5.005_55
+ Branch: perl
+ ! Changes
----------------
-Version 5.004_56
+Version 5.005_55
----------------
____________________________________________________________________________
-[ 379] By: mbeattie on 1997/12/18 13:28:35
- Log: Integrate ansi @364,@366 into mainline.
+[ 2958] By: gsar on 1999/02/16 06:18:27
+ Log: integrate change#2852 from maint-5.005; integrate cfgperl contents;
+ elide dups and non-dependents from Changes
Branch: perl
- !> lib/ExtUtils/MakeMaker.pm miniperlmain.c perl.h
+ ! Changes pod/perlhist.pod
+ !> Configure INSTALL README.threads doio.c ext/IPC/SysV/SysV.xs
+ !> hints/ultrix_4.sh pod/perl.pod pod/perlfunc.pod
+ !> pod/perlport.pod pp.c t/op/pack.t
+____________________________________________________________________________
+[ 2957] By: gsar on 1999/02/16 04:09:47
+ Log: propagate PERL_VERSION everywhere, add to pod
+ Branch: perl
+ ! Configure configpm configure.com ext/B/B/C.pm ext/B/byteperl.c
+ ! ext/DB_File/DB_File.xs ext/Data/Dumper/Dumper.xs ext/IO/IO.xs
+ ! hints/freebsd.sh hints/os2.sh installman installperl myconfig
+ ! os2/Makefile.SHs os2/os2.c patchlevel.h perl.c perl.h
+ ! plan9/genconfig.pl plan9/myconfig.plan9 plan9/versnum
+ ! pod/perldebug.pod pod/perldelta.pod vms/genconfig.pl
+ ! vms/myconfig.com vms/subconfigure.com win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_sh.PL
+ ! win32/win32.c x2p/a2py.c
+____________________________________________________________________________
+[ 2955] By: jhi on 1999/02/15 16:15:03
+ Log: The pack tests now better in C90 (after the packnative patches).
+ Branch: cfgperl
+ ! t/op/pack.t
____________________________________________________________________________
-[ 378] By: mbeattie on 1997/12/18 13:20:15
- Log: Add a few missing files to MANIFEST
+[ 2954] By: gsar on 1999/02/15 14:11:50
+ Log: tweak Configure to follow new PERL_VERSION etc.
Branch: perl
- ! MANIFEST
+ ! Configure patchlevel.h pod/perlhist.pod
____________________________________________________________________________
-[ 377] By: mbeattie on 1997/12/18 13:00:16
- Log: Bump patchlevel to 56.
- Branch: perl
- ! patchlevel.h
+[ 2953] By: jhi on 1999/02/15 14:02:21
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> MANIFEST Porting/makerel
____________________________________________________________________________
-[ 376] By: nick on 1997/12/18 01:32:12
- Log: Resolve against mainline
- Branch: ansiperl
- +> README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
- +> djgpp/djgppsed.sh djgpp/fixpmain hints/dos_djgpp.sh
- +> os2/os2.sym os2/os2thread.h
- !> (integrate 74 files)
+[ 2952] By: jhi on 1999/02/15 13:50:07
+ Log: Enhance the packnative patch: use the packnative code
+ only if required. Also added hefty testing (hopefully
+ I didn't assume too much...). Tested on alpha, ix86, sparc.
+ Branch: cfgperl
+ ! pod/perlfunc.pod pp.c t/op/pack.t
____________________________________________________________________________
-[ 375] By: nick on 1997/12/18 01:06:15
- Log: Resolve against Win32
- Branch: ansiperl
- !> Configure README.threads config_h.SH doop.c embed.h
- !> ext/DynaLoader/dl_aix.xs global.sym hints/aix.sh
- !> hints/irix_6.sh op.c op.h perl.h perlvars.h pp_hot.c pp_sys.c
- !> sv.c sv.h thread.h util.c
-____________________________________________________________________________
-[ 374] By: mbeattie on 1997/12/17 14:44:26
- Log: Lots of VMS changes. vms/gen_shrfls.pl (which parses header files)
- needs rewriting now that we use perlvars.h and foovar.h:
- Subject: [PATCH] 5.004_54 under VMS (fwd)
- Date: Wed, 26 Nov 1997 12:32:09 -0400 (EDT)
- From: Charles Bailey <BAILEY@newman.upenn.edu>
+[ 2951] By: jhi on 1999/02/15 13:46:56
+ Log: AVAILABILITY from 5.005_03-tobe, will of course
+ require updating when 5.006 comes out.
+ Branch: cfgperl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2949] By: gsar on 1999/02/15 13:28:51
+ Log: will this be it for 5.005_55?
Branch: perl
- ! dosish.h handy.h intrpvar.h os2/os2ish.h perl.c perl.h
- ! plan9/plan9ish.h pp.c proto.h sv.c t/lib/thread.t
- ! t/lib/timelocal.t t/op/nothread.t taint.c thrdvar.h toke.c
- ! unixish.h vms/config.vms vms/descrip.mms vms/fndvers.com
- ! vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms
- ! vms/test.com vms/vms.c vms/vms_yfix.pl vms/vmsish.h
-____________________________________________________________________________
-[ 373] By: mbeattie on 1997/12/17 14:10:50
- Log: Major changes to the DOS/djgpp port (including threading):
- Subject: Re: dos-djgpp port not in perl 5.004_54
- Date: Fri, 21 Nov 1997 10:58:26 +0100
- From: Molnar Laszlo <molnarl@cdata.tvnet.hu>
- Branch: perl
- + README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
- + djgpp/djgppsed.sh djgpp/fixpmain hints/dos_djgpp.sh
- ! Configure MANIFEST Makefile.SH doio.c dosish.h
- ! ext/POSIX/POSIX.xs installhtml installperl lib/AutoSplit.pm
- ! lib/Cwd.pm lib/ExtUtils/Install.pm lib/ExtUtils/MM_Unix.pm
- ! lib/ExtUtils/Manifest.pm lib/File/Basename.pm lib/File/Find.pm
- ! lib/File/Path.pm lib/FindBin.pm lib/Pod/Html.pm
- ! lib/Pod/Text.pm lib/Term/Cap.pm lib/perl5db.pl makedepend.SH
- ! mg.c perl.c pod/pod2man.PL pp_hot.c t/io/fs.t t/lib/anydbm.t
- ! t/lib/filehand.t t/lib/gdbm.t t/lib/io_sel.t t/lib/io_tell.t
- ! t/lib/sdbm.t t/lib/thread.t t/op/magic.t t/op/stat.t
- ! t/op/sysio.t t/op/taint.t utils/perldoc.PL
-____________________________________________________________________________
-[ 372] By: mbeattie on 1997/12/17 13:18:34
- Log: Upgrade DB_File to 1.56:
- Subject: DB_File-1.56 for _55
- Date: Tue, 16 Dec 1997 22:25:29 +0000 (GMT)
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
- Branch: perl
- ! Configure ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
- ! ext/DB_File/Makefile.PL ext/DB_File/typemap t/lib/db-btree.t
-____________________________________________________________________________
-[ 371] By: mbeattie on 1997/12/17 12:02:03
- Log: Threading patches for OS/2 (missing files taken from previous patch):
- Subject: Re: 5.004_55: OS/2 patches again
- Date: Sat, 13 Dec 1997 18:09:15 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ ! MANIFEST Porting/makerel
+____________________________________________________________________________
+[ 2948] By: jhi on 1999/02/15 13:23:52
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes Makefile.SH ext/B/B/C.pm patchlevel.h perl.h
+ !> pod/perldiag.pod pod/perlembed.pod pod/perlfaq3.pod
+ !> pod/perlfaq4.pod pod/perlfaq9.pod pod/perlmodinstall.pod
+ !> pod/perlmodlib.pod pod/perltoc.pod t/io/argv.t
+ !> t/lib/bigfloatpm.t t/lib/h2ph.t win32/Makefile win32/config.bc
+ !> win32/config.gc win32/config.vc win32/config_H.bc
+ !> win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 2947] By: jhi on 1999/02/15 13:20:41
+ Log: perlport.pod 1.39 from Chris.
+ Branch: cfgperl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 2946] By: jhi on 1999/02/15 13:09:58
+ Log: Import Ultrix update, change #2864,
+
+ From: Spider Boardman <spider@zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on RISC-ultrix 4.4 (UNINSTALLED)
+ Date: Wed, 10 Feb 1999 23:33:31 -0500
+ Message-Id: <9902110433.AA12816@abyss.zk3.dec.com>
+ Branch: cfgperl
+ ! doio.c ext/IPC/SysV/SysV.xs hints/ultrix_4.sh
+____________________________________________________________________________
+[ 2945] By: jhi on 1999/02/15 13:04:50
+ Log: OpenBSD sparc SHMLBA.
+ Branch: cfgperl
+ ! ext/IPC/SysV/SysV.xs
+____________________________________________________________________________
+[ 2944] By: gsar on 1999/02/15 12:09:52
+ Log: update win32/config* stuff, Changes
Branch: perl
- + os2/os2.sym os2/os2thread.h
- ! MANIFEST hints/os2.sh os2/Changes os2/Makefile.SHs
- ! os2/OS2/PrfDB/PrfDB.xs os2/OS2/REXX/REXX.xs os2/os2.c
- ! os2/os2ish.h perl.h
+ ! Changes win32/Makefile win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 370] By: mbeattie on 1997/12/17 11:01:34
- Log: Add OS2 to list for DONT_DECLARE_STD in perl.h:
- Subject: Re: 5.004_55: OS/2 patches again
- Date: Sat, 13 Dec 1997 18:05:55 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 2943] By: gsar on 1999/02/15 11:54:08
+ Log: #include patchlevel.h by default, provide
+ PERL_{REVISION,VERSION,SUBVERSION}
+ Branch: perl
+ ! patchlevel.h perl.h
+____________________________________________________________________________
+[ 2942] By: gsar on 1999/02/15 10:26:59
+ Log: allow /0|NaN/ on some bigfloatpm.t tests for portability; other
+ misc fixes
+ Branch: perl
+ ! Makefile.SH t/io/argv.t t/lib/bigfloatpm.t t/lib/h2ph.t
+____________________________________________________________________________
+[ 2941] By: gsar on 1999/02/15 10:24:37
+ Log: broken URLs fixed (from Michael G Schwern <schwern@pobox.com>)
+ Message-ID: <19990207002851.B9185@toldyouso.com>
+ Message-ID: <19990207212152.A9765@toldyouso.com>
+ Message-ID: <19990207212041.A9622@toldyouso.com>
+ Message-ID: <19990207213127.A10244@toldyouso.com>
+ Message-ID: <19990207212559.A9950@toldyouso.com>
+ Message-ID: <19990207212842.A9994@toldyouso.com>
+ Message-ID: <19990207212500.A9860@toldyouso.com>
+ Message-ID: <19990207213013.A10105@toldyouso.com>
+ Branch: perl
+ ! pod/perldiag.pod pod/perlembed.pod pod/perlfaq3.pod
+ ! pod/perlfaq4.pod pod/perlfaq9.pod pod/perlmodinstall.pod
+ ! pod/perlmodlib.pod pod/perltoc.pod
+____________________________________________________________________________
+[ 2940] By: gsar on 1999/02/15 10:07:08
+ Log: enable dynaloading in C.pm-compiled programs (non-conflicting part
+ of suggested patch)
+ From: "Vishal Bhatia" <vishalb@my-dejanews.com>
+ Date: Mon, 08 Feb 1999 01:14:41 -0000
+ Message-ID: <DHIDFFOPMEFDBAAA@my-dejanews.com>
+ Subject: [PATCH 5.005_54] some pending C.pm stuff
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 2939] By: jhi on 1999/02/15 08:40:18
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> t/lib/bigfloat.t t/lib/bigfloatpm.t
+ - lib/File/PathConvert.pm
+ !> (integrate 81 files)
+____________________________________________________________________________
+[ 2938] By: gsar on 1999/02/15 06:56:39
+ Log: change#2839 was bogus, redo
Branch: perl
- ! perl.h
+ !> t/lib/h2ph.pht
____________________________________________________________________________
-[ 369] By: mbeattie on 1997/12/17 10:59:40
- Log: Fix typo in compiler B/C.pm.
- Branch: perlext
- ! Compiler/B/C.pm
+[ 2937] By: gsar on 1999/02/15 06:38:15
+ Log: support Win32::GetFullPathName() and Win32::SetLastError()
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Tue, 09 Feb 1999 22:27:31 +0100
+ Message-ID: <36c1a2ed.8007554@smtp1.ibm.net>
+ Subject: [PATCH _54] Win32::GetFullPathName (Re: File::Spec::Win32 and UNCs)
+ Branch: perl
+ ! win32/win32.c
____________________________________________________________________________
-[ 368] By: mbeattie on 1997/12/17 10:58:35
- Log: Allow "perldoc -F filename":
- Subject: 5.004_55: Patch to perldoc
- Date: Thu, 11 Dec 1997 19:37:00 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 2936] By: gsar on 1999/02/15 06:26:39
+ Log: support native integers, pack("L_",...) etc. (via private mail)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 10 Feb 1999 00:04:52 +0200 (EET)
+ Message-Id: <199902092204.AAA29065@alpha.hut.fi>
+ Subject: the "packnative" patch
Branch: perl
- ! utils/perldoc.PL
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod pp.c
+ ! t/lib/ipc_sysv.t t/op/pack.t
____________________________________________________________________________
-[ 367] By: mbeattie on 1997/12/17 10:54:47
- Log: Fix not-reached warning for pp_threadsv.
+[ 2935] By: gsar on 1999/02/15 06:04:02
+ Log: From: Michael G Schwern <schwern@pobox.com>
+ Date: Tue, 9 Feb 1999 04:13:12 -0500
+ Message-ID: <19990209041312.A15788@toldyouso.com>
+ Subject: [PATCH]5.005_03-MAINT_TRIAL_5 utils/h2xs fixing -A & more
Branch: perl
- ! pp.c
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 366] By: nick on 1997/12/14 16:06:24
- Log: Fix typo in Ilya's patch :-(
- Branch: ansiperl
- ! lib/ExtUtils/MakeMaker.pm
+[ 2934] By: gsar on 1999/02/15 05:30:13
+ Log: fix bugs in the handling of negative numbers, among other things
+ From: Steven Knight <knight@theopera.baldmt.citilink.com>
+ Date: Mon, 8 Feb 1999 01:16:24 -0600
+ Message-Id: <199902080716.BAA24652@theopera.baldmt.citilink.com>
+ Subject: Math::BigFloat and Math::BigInt
+ Branch: perl
+ + t/lib/bigfloat.t t/lib/bigfloatpm.t
+ ! lib/Math/BigFloat.pm lib/Math/BigInt.pm lib/bigfloat.pl
+ ! t/lib/bigintpm.t
____________________________________________________________________________
-[ 365] By: nick on 1997/12/14 15:30:25
- Log: #undef new PERLVARIC macro in appropriate places
- Branch: ansiperl
- ! miniperlmain.c perl.h
+[ 2933] By: gsar on 1999/02/15 04:57:52
+ Log: From: "J. van Krieken" <John.van.Krieken@ATComputing.nl>
+ Date: Thu, 4 Feb 1999 17:25:25 +0100 (MET)
+ Message-Id: <199902041625.RAA14489@atcmpg.ATComputing.nl>
+ Subject: s2p incorrectly handles hold space commands
+ Branch: perl
+ ! x2p/s2p.PL
____________________________________________________________________________
-[ 364] By: nick on 1997/12/14 15:04:36
- Log: Ilya's MakeMaker (empty makefile) patch
- Branch: ansiperl
- ! lib/ExtUtils/MakeMaker.pm
+[ 2932] By: gsar on 1999/02/15 04:45:55
+ Log: clarify what a "line" is
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlvar.pod
____________________________________________________________________________
-[ 363] By: gsar on 1997/12/13 05:57:13
- Log: Integrate mainline. Builds and passes (Borland).
- Branch: win32/perl
- !> Configure README.threads config_h.SH doop.c embed.h
- !> ext/DynaLoader/dl_aix.xs global.sym hints/aix.sh
- !> hints/irix_6.sh op.c op.h perl.h perlvars.h pp_hot.c pp_sys.c
- !> sv.c sv.h thread.h util.c
+[ 2931] By: gsar on 1999/02/15 04:23:29
+ Log: backout change#2811 and add newer version based on File::Spec
+ From: Barrie Slaymaker <rbs@telerama.com>
+ Date: Thu, 11 Feb 1999 16:29:24 -0500
+ Message-ID: <36C34BB4.A62090E0@telerama.com>
+ Subject: [PATCH]5.005_54 (pod2html) Relative URLs using new File::Spec
+ Branch: perl
+ - lib/File/PathConvert.pm
+ ! MANIFEST installhtml lib/Pod/Html.pm
____________________________________________________________________________
-[ 362] By: nick on 1997/12/13 02:53:03
- Log: Resolve ansiperl against mainline
- Branch: ansiperl
- !> (integrate 92 files)
+[ 2930] By: gsar on 1999/02/15 04:16:25
+ Log: From: Barrie Slaymaker <rbs@telerama.com>
+ Date: Thu, 11 Feb 1999 19:39:48 -0500
+ Message-ID: <36C37854.707D139@telerama.com>
+ Subject: [PATCH] 5.005_54 #2 Merging File::PathConvert in to File::Spec
+ Branch: perl
+ ! lib/File/Spec/Unix.pm lib/File/Spec/Win32.pm
____________________________________________________________________________
-[ 361] By: mbeattie on 1997/12/12 16:20:38
- Log: pp_print and pp_prtf handling of tied file handles used EXTEND
- instead of MEXTEND leading to core dumps. This fix needs
- propagating back to the maintenance branch.
+[ 2929] By: gsar on 1999/02/15 04:06:50
+ Log: patches suggested by John Bley <jbb6@acpub.duke.edu> (with minor edits)
+ Date: Wed, 3 Feb 1999 05:24:55 -0500 (EST)
+ Message-ID: <Pine.SOL.3.91.990203051924.302A-100000@soc11.acpub.duke.edu>
+ Subject: [PATCH]5.005_54 (DOC) fix many typos
+ --
+ Date: Wed, 3 Feb 1999 08:53:53 -0500 (EST)
+ Message-ID: <Pine.SOL.3.91.990203085157.895A-100000@soc11.acpub.duke.edu>
+ Subject: [PATCH]5.005_54 (DOC) typos
Branch: perl
- ! pp_hot.c pp_sys.c
+ ! pod/perl5004delta.pod pod/perl5005delta.pod pod/perlcall.pod
+ ! pod/perldebug.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod pod/perlfunc.pod pod/perlguts.pod
+ ! pod/perllol.pod pod/perlmod.pod pod/perlref.pod
+ ! pod/perlrun.pod pod/perlsub.pod pod/perltoc.pod
+ ! pod/perlvar.pod pod/perlxs.pod
____________________________________________________________________________
-[ 360] By: mbeattie on 1997/12/11 15:45:56
- Log: Add missing patch to op.c that didn't come across with win32 merge.
+[ 2928] By: gsar on 1999/02/15 03:39:53
+ Log: allow the Carp routines to pass through exception objects
Branch: perl
- ! op.c
+ ! lib/Carp.pm
____________________________________________________________________________
-[ 359] By: mbeattie on 1997/12/11 11:54:41
- Log: Stop tr/// from writing to target when only counting.
+[ 2927] By: gsar on 1999/02/15 03:22:57
+ Log: mention Proc::Daemon (suggested by Michael G Schwern <schwern@pobox.com>)
Branch: perl
- ! doop.c op.c op.h
+ ! pod/perlfaq8.pod
____________________________________________________________________________
-[ 358] By: mbeattie on 1997/12/10 18:36:26
- Log: Fix char*/unsigned char* clashes in util.c:fbm_instr and remove
- a few extraneous trailing semicolons in perlvars.h.
+[ 2926] By: gsar on 1999/02/15 03:19:39
+ Log: integrate h2ph.PL fixes from change#2809 (change#2838 was supposed to
+ have done that, but didn't)
Branch: perl
- ! perlvars.h util.c
+ !> utils/h2ph.PL
____________________________________________________________________________
-[ 357] By: mbeattie on 1997/12/10 18:33:53
- Log: Start overhauling compiler. It was working at least minimally
- right up until the final tweak of B.xs to add threadsv_names
- at which point building it provokes a seg fault in perl while
- doing the xsubpp :-(.
+[ 2925] By: gsar on 1999/02/15 03:17:01
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! op.h util.c
- Branch: perlext
- ! Compiler/B.pm Compiler/B.xs Compiler/B/Asmdata.pm
- ! Compiler/B/C.pm Compiler/B/CC.pm Compiler/Makefile.PL
- ! Compiler/bytecode.pl Compiler/byteperl.c Compiler/byterun.c
- ! Compiler/byterun.h Compiler/cc_harness Compiler/cc_runtime.h
- ! Compiler/ccop.c Compiler/ccop.h Compiler/test_harness
- ! Compiler/test_harness_cc
+ ! Changes
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH hints/openbsd.sh hints/ultrix_4.sh
+ !> pod/perlport.pod t/lib/h2ph.pht utils/h2ph.PL
+ !> vms/subconfigure.com
____________________________________________________________________________
-[ 356] By: mbeattie on 1997/12/10 13:43:32
- Log: Fix perl_os_thread typedef for pthreads. Tweak SvTAINT so that
- sv_setfoo functions go back to not needing dTHR. Fix Configure
- to check for already-existing -thread on archname and to check
- better for d_pthread_created_joinable.
+[ 2924] By: gsar on 1999/02/15 03:07:08
+ Log: add const qualifier to most char* prototypes, handle ripple effect
Branch: perl
- ! Configure perl.h sv.c sv.h thread.h
+ ! gv.c hv.c hv.h mg.c op.c perl.c pod/perlguts.pod proto.h sv.c
+ ! universal.c util.c
____________________________________________________________________________
-[ 355] By: mbeattie on 1997/12/10 10:53:58
- Log: Minor fix/speedup to util.c:fbm_instr:
- Subject: 5.004_55: Minor regexp patch
- Date: Fri, 5 Dec 1997 05:09:54 -0500 (EST)
- From: Ilya Zakharevich <ilya@MATH.OHIO-STATE.EDU>
+[ 2923] By: gsar on 1999/02/15 01:04:30
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Thu, 04 Feb 1999 02:37:31 +0000
+ Message-Id: <199902040237.CAA03255@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_54] Re: .. misinterpreted as flipflop
Branch: perl
- ! util.c
+ ! pp_ctl.c t/op/range.t
____________________________________________________________________________
-[ 354] By: mbeattie on 1997/12/10 10:41:25
- Log: Patches for IRIX, AIX and some generic stuff:
- Subject: [PATCH] _55: Mostly AIX stuff but also IRIX and generic
- Date: Sat, 29 Nov 1997 08:35:30 -0800 (PST)
- From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
- (checked/ignored a few rejects; tweaked wording).
+[ 2922] By: gsar on 1999/02/15 00:24:34
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Sun, 31 Jan 1999 01:50:06 +0000
+ Message-Id: <199901310150.BAA16299@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_03t4] regexp flags bug
Branch: perl
- ! Configure README.threads config_h.SH embed.h
- ! ext/DynaLoader/dl_aix.xs global.sym hints/aix.sh
- ! hints/irix_6.sh
+ ! regcomp.c t/op/re_tests
____________________________________________________________________________
-[ 353] By: mbeattie on 1997/12/10 10:10:19
- Log: Integrate win32 back into mainline (trivial).
+[ 2921] By: gsar on 1999/02/15 00:13:02
+ Log: use New() et al., rather than safemalloc() et al.
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 29 Jan 1999 23:27:22 +0100
+ Message-ID: <36bd33f2.51029616@smtp1.ibm.net>
+ Subject: [PATCH _03-MT5] POSIX.xs memory API
Branch: perl
- +> embedvar.h intrpvar.h perlvars.h thrdvar.h win32/config.gc
- +> win32/config_H.gc
- !> (integrate 36 files)
+ ! ext/POSIX/POSIX.xs
____________________________________________________________________________
-[ 352] By: nick on 1997/12/09 17:36:45
- Log: Resolve win32 - Sarathy's tweak.
- Branch: ansiperl
- !> win32/makedef.pl
+[ 2920] By: gsar on 1999/02/15 00:05:33
+ Log: tweak READ() docs to mention $buffer must be altered by reference
+ Branch: perl
+ ! pod/perltie.pod
____________________________________________________________________________
-[ 351] By: gsar on 1997/12/08 06:13:04
- Log: re-add PERLVARI?C? change that somehow went missing in makedef.pl
- Branch: win32/perl
- ! win32/makedef.pl
+[ 2919] By: gsar on 1999/02/14 23:50:39
+ Log: applied suggested patch, with several language/readability tweaks
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 29 Jan 1999 00:25:02 -0500
+ Message-ID: <19990129002502.C2898@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.005_*] Better parsing docs
+ Branch: perl
+ ! pod/perlop.pod
____________________________________________________________________________
-[ 350] By: nick on 1997/12/05 00:56:03
- Log: Resolve ansiperl against win32
- Branch: ansiperl
- - win32/makegcc.mk
- !> embed.h embed.pl embedvar.h global.sym miniperlmain.c perl.h
- !> perlvars.h win32/Makefile win32/config.gc win32/makedef.pl
- !> win32/makefile.mk win32/perllib.c win32/win32.h
-____________________________________________________________________________
-[ 349] By: gsar on 1997/12/02 07:28:23
- Log: Revert to keeping (some) constant strings as globals
- Branch: win32/perl
- ! embed.h embed.pl embedvar.h global.sym miniperlmain.c perl.h
- ! perlvars.h win32/makedef.pl win32/perllib.c
-____________________________________________________________________________
-[ 348] By: gsar on 1997/12/02 05:38:06
- Log: makegcc.mk merged into makefile.mk, so makegcc.mk is gone.
- Other minor fixes. Now is a good time to get the changes in win32 branch.
- Branch: win32/perl
- - win32/makegcc.mk
- ! win32/Makefile win32/config.gc win32/makefile.mk win32/win32.h
-____________________________________________________________________________
-[ 347] By: gsar on 1997/12/02 03:32:55
- Log: Integrate winansi again. Result builds and passes all tests on all
- three compilers.
- Branch: win32/perl
- !> lib/ExtUtils/MM_Win32.pm win32/config.gc win32/makefile.mk
- !> win32/makegcc.mk win32/win32.h
-____________________________________________________________________________
-[ 346] By: gsar on 1997/12/02 03:28:23
- Log: various hacks to get mingw32 to build. Sync Makefile with makefile.mk.
- makegcc.mk to be merged into makefile.mk soon.
- Branch: win32/perl
- ! lib/ExtUtils/MM_Win32.pm win32/Makefile win32/config.gc
- ! win32/makedef.pl win32/makefile.mk win32/makegcc.mk
- ! win32/win32.h
+[ 2918] By: gsar on 1999/02/14 23:20:42
+ Log: several bug fixes; now croak()s when date exceeds integer limits (instead
+ of silently returning bogus values)
+ From: Peter Chines <pchines@nhgri.nih.gov>
+ Date: Wed, 27 Jan 1999 16:11:31 -0500
+ Message-Id: <199901272117.QAA21458@kronos.nhgri.nih.gov>
+ Subject: Time::Local
+ Branch: perl
+ ! lib/Time/Local.pm pod/perldelta.pod
____________________________________________________________________________
-[ 345] By: nick on 1997/12/02 01:57:17
- Log: Add a 4th step (yes FOUR) to dll build process for gcc.
- Now runs again...
- Branch: ansiperl
- ! lib/ExtUtils/MM_Win32.pm
+[ 2917] By: gsar on 1999/02/14 11:21:43
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 28 Jan 1999 10:02:20 -0500
+ Message-ID: <19990128100220.A1321@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.005_53] Better perldoc
+ Branch: perl
+ ! utils/perldoc.PL
____________________________________________________________________________
-[ 344] By: nick on 1997/12/02 01:11:16
- Log: Sarathy's patch
- Branch: ansiperl
- ! lib/ExtUtils/MM_Win32.pm win32/config.gc win32/makefile.mk
- ! win32/makegcc.mk win32/win32.h
-____________________________________________________________________________
-[ 343] By: gsar on 1997/12/01 04:37:06
- Log: Reverse integrate to get all of Nick's changes over at winansi (win32/perl/*
- is identical to ansiperl/* now)
- Branch: win32/perl
- +> embedvar.h intrpvar.h perlvars.h thrdvar.h
- !> (integrate 34 files)
+[ 2916] By: gsar on 1999/02/14 10:59:38
+ Log: back out change#2751, apply updated version
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 06 Feb 1999 01:06:29 +0100
+ Message-ID: <36bc844c.18763049@smtp1.ibm.net>
+ Subject: [PATCH] Cleanup of File::Spec module
+ Branch: perl
+ ! lib/File/Spec.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
+ ! lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+ ! lib/File/Spec/Win32.pm
____________________________________________________________________________
-[ 342] By: nick on 1997/12/01 04:01:57
- Log: Builds and passes all tests with gcc on Win32 - phew!
- Branch: ansiperl
- ! embed.h embedvar.h ext/Opcode/Opcode.xs global.sym perl.h
- ! proto.h util.c win32/makedef.pl
-____________________________________________________________________________
-[ 341] By: nick on 1997/12/01 02:54:29
- Log: Create a struct for all perls globals (as an option)
- Mainly for Mingw32 which cannot import data.
- Now only Opcode tests fail (op_desc/op_name not
- handled yet stuff)
- Branch: ansiperl
- ! EXTERN.h embed.h embed.pl embedvar.h ext/Thread/Thread.xs
- ! global.sym miniperlmain.c perl.c perl.h perlvars.h pp_hot.c
- ! proto.h run.c util.c win32/Makefile win32/makedef.pl
- ! win32/makegcc.mk win32/perllib.c win32/win32.c win32/win32.h
- ! win32/win32iop.h win32/win32thread.c
-____________________________________________________________________________
-[ 340] By: nick on 1997/11/30 20:21:10
- Log: Fixup exports in non -DDEBUGGING case
- Branch: ansiperl
- ! win32/makedef.pl
+[ 2915] By: gsar on 1999/02/14 10:48:01
+ Log: tweak select() test
+ Branch: perl
+ ! pod/perlipc.pod t/op/fh.t
____________________________________________________________________________
-[ 339] By: nick on 1997/11/30 20:10:04
- Log: Disable hard-coded -DDEBUGGING
- Branch: ansiperl
- ! win32/config_h.PL
-____________________________________________________________________________
-[ 338] By: nick on 1997/11/30 20:00:19
- Log: embed.pl now reads *var*.h to do its stuff.
- Split generated embed.h into two - new embedvar.h
- is #included when 'op' etc. will not mess up proto.h etc.
- Removed #define foo (thr->Tfoo) from thread.h
- Added some 'missing' symbols to global.sym, removed
- those in the *var*.h files
- Has build all MULTIPLICITY/USE_THREADS options on win32
- with VC++ (and passed tests), but not with exactly this set
- of files.
- Branch: ansiperl
- + embedvar.h
- ! embed.h embed.pl global.sym interp.sym intrpvar.h perl.h
- ! perlvars.h regcomp.c thrdvar.h thread.h win32/Makefile
- ! win32/makedef.pl
-____________________________________________________________________________
-[ 337] By: nick on 1997/11/29 23:55:31
- Log: Globals and structs via macros - part 1 of N
- - introduce perlvars.h intrpvar.h and thrdvar.h
- - change perl.h and thread.h to include them with
- appropriate macros defined
- - result is status-quo but with macros
- - next step is to tweak embed.* to capitalize on
- new easy-to-find info.
- Branch: ansiperl
- + intrpvar.h perlvars.h thrdvar.h
- ! perl.h thread.h win32/Makefile
+[ 2914] By: gsar on 1999/02/14 10:25:55
+ Log: allow C<select('foo')> to autovivify *foo (SelectSaver expects that)
+ Branch: perl
+ ! op.c pod/perldiag.pod pp_sys.c t/op/misc.t
____________________________________________________________________________
-[ 336] By: nick on 1997/11/29 19:13:55
- Log: VC++ default to threaded
- Branch: ansiperl
- ! win32/Makefile
+[ 2913] By: gsar on 1999/02/14 10:03:51
+ Log: From: Kenneth Albanowski <kjahds@kjahds.com>
+ Date: Sat, 23 Jan 1999 21:52:15 -0500 (EST)
+ Message-ID: <Pine.LNX.3.93.990123212857.446B-100000@kjahds.kjahds.com>
+ Subject: Re: SvOPV() or SvPV_nolen() or ...
+ Branch: perl
+ ! pod/perlguts.pod
____________________________________________________________________________
-[ 335] By: nick on 1997/11/29 18:38:26
- Log: Avoid __declspec(thread) by default, for both scratch
- return areas and THR stuff. Use struct thread intern instead.
- Branch: ansiperl
- ! win32/win32.c win32/win32.h win32/win32sck.c
- ! win32/win32thread.c win32/win32thread.h
+[ 2912] By: gsar on 1999/02/14 09:57:29
+ Log: provide SvPV_nolen(sv) to avoid use of PL_na
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sun, 24 Jan 1999 02:45:32 +0100
+ Message-ID: <36bb7ada.68485547@smtp1.ibm.net>
+ Subject: [PATCH 5.005_54] _54 version of SvPV_nolen patch
+ Branch: perl
+ ! embed.h global.sym objXSUB.h pod/perlguts.pod proto.h sv.c
+ ! sv.h
____________________________________________________________________________
-[ 334] By: nick on 1997/11/29 17:49:04
- Log: Non-threaded build fix
- Branch: ansiperl
- ! win32/win32thread.c
+[ 2911] By: gsar on 1999/02/14 06:51:05
+ Log: elide stray effluvium
+ Branch: perl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 333] By: nick on 1997/11/29 17:29:07
- Log: Sort out malloc_mutex for perl's malloc
- Remove BINCOMPAT3 from embed.pl
- Add dependancy to CORE_H for PERL95_OBJ
- Branch: ansiperl
- ! dosish.h embed.h embed.pl global.sym perl.h win32/Makefile
- ! win32/win32.c
+[ 2910] By: gsar on 1999/02/14 05:51:56
+ Log: slurping an empty file should return '' rather than undef, with
+ commensurate effects on ARGV processing
+ Branch: perl
+ ! pod/perldelta.pod pod/perlfunc.pod pod/perlop.pod
+ ! pod/perlvar.pod pp_hot.c sv.h t/io/argv.t
____________________________________________________________________________
-[ 332] By: nick on 1997/11/29 16:21:01
- Log: Integrate win32 into ansiperl
- Branch: ansiperl
- !> README.threads hints/irix_6.sh lib/Test/Harness.pm
- !> lib/perl5db.pl malloc.c miniperlmain.c perl.h sv.c t/TEST
- !> t/lib/anydbm.t t/lib/db-btree.t t/lib/db-hash.t
- !> t/lib/db-recno.t t/lib/gdbm.t t/lib/ndbm.t t/lib/odbm.t
- !> t/lib/safe2.t t/lib/sdbm.t t/op/pat.t t/op/taint.t
- !> win32/perllib.c
-____________________________________________________________________________
-[ 331] By: nick on 1997/11/29 01:35:45
- Log: GCC + Threads on Win32 - best gcc results yet
- Branch: ansiperl
- ! XSUB.h perl.h thread.h win32/makedef.pl win32/makegcc.mk
- ! win32/win32.h win32/win32iop.h win32/win32thread.c
- ! win32/win32thread.h
+[ 2909] By: gsar on 1999/02/14 00:02:11
+ Log: perly_c.diff typo
+ Branch: perl
+ ! perly.c perly_c.diff vms/perly_c.vms
____________________________________________________________________________
-[ 330] By: nick on 1997/11/28 23:05:08
- Log: Un-botch gcc workround
- Branch: ansiperl
- ! XSUB.h
+[ 2908] By: gsar on 1999/02/13 18:20:13
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 13 Feb 1999 13:25:53 +0100
+ Message-Id: <36c9629c.13334874@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03-MT5] "goto must have label" message for C<goto ''>
+ Branch: perl
+ ! pod/perlfunc.pod pp_ctl.c t/lib/io_unix.t
____________________________________________________________________________
-[ 329] By: nick on 1997/11/28 22:39:39
- Log: Builds completely with Mingw32, dynamic loaded extensions
- don't work yet - suspect __declspec() non-implemented issues.
- Branch: ansiperl
- ! XSUB.h lib/ExtUtils/Command.pm lib/ExtUtils/MM_Win32.pm
- ! lib/ExtUtils/Mksymlists.pm win32/config.gc win32/makegcc.mk
- ! win32/runperl.c win32/win32.c win32/win32iop.h
-____________________________________________________________________________
-[ 328] By: gsar on 1997/11/28 05:48:15
- Log: integrate winansi.
- Branch: win32/perl
- +> win32/config.gc win32/config_H.gc win32/makegcc.mk
- ! perl.h
- !> dosish.h hv.c win32/dl_win32.xs win32/include/sys/socket.h
- !> win32/makedef.pl win32/makefile.mk win32/runperl.c
- !> win32/win32.c win32/win32.h win32/win32iop.h win32/win32sck.c
-____________________________________________________________________________
-[ 327] By: gsar on 1997/11/28 05:38:48
- Log: Integrate mainline.
- Branch: win32/perl
- !> README.threads hints/irix_6.sh lib/Test/Harness.pm
- !> lib/perl5db.pl malloc.c miniperlmain.c sv.c t/TEST
- !> t/lib/anydbm.t t/lib/db-btree.t t/lib/db-hash.t
- !> t/lib/db-recno.t t/lib/gdbm.t t/lib/ndbm.t t/lib/odbm.t
- !> t/lib/safe2.t t/lib/sdbm.t t/op/pat.t t/op/taint.t
- !> win32/perllib.c
-____________________________________________________________________________
-[ 326] By: nick on 1997/11/27 19:13:36
- Log: GCC builds perl.dll and perl.exe on Win32
- Branch: ansiperl
- ! win32/makedef.pl win32/makegcc.mk
-____________________________________________________________________________
-[ 325] By: nick on 1997/11/27 17:46:30
- Log: Add files and tweak others to get 'native' Mingw32 gcc port as
- far as building miniperl and perl.dll (but not import lib yet)
- Seems to lack popen()/pclose() and fcloseall() and fflushall().
- Also only CRTDLL not MCRTDLL so threading is probably not
- possible yet.
- Had to mess with win32iop.h's placement as we need __attribute__
- to get STDCALL, and #define of printf messes up proto.h
- Branch: ansiperl
- + win32/config.gc win32/config_H.gc win32/makegcc.mk
- ! dosish.h perl.h win32/dl_win32.xs win32/include/sys/socket.h
- ! win32/makefile.mk win32/runperl.c win32/win32.c win32/win32.h
- ! win32/win32iop.h win32/win32sck.c
+[ 2907] By: jhi on 1999/02/13 15:07:26
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> emacs/e2ctags.pl pod/perltodo.pod t/op/lop.t
+ !> (integrate 150 files)
____________________________________________________________________________
-[ 324] By: mbeattie on 1997/11/27 17:08:06
- Log: Give dire warnings about the IRIX 6.2 kernel panic.
+[ 2903] By: gsar on 1999/02/12 13:25:59
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sun, 24 Jan 1999 01:12:00 +0100
+ Message-ID: <36b66479.62756298@smtp1.ibm.net>
+ Subject: [PATCH 5.005_54] remove OVERLOAD conditionals
Branch: perl
- ! README.threads hints/irix_6.sh
+ ! XSUB.h dump.c gv.c hv.h mg.c perl.h perlvars.h pp.c pp.h
+ ! proto.h sv.c sv.h
____________________________________________________________________________
-[ 323] By: mbeattie on 1997/11/27 16:57:33
- Log: Fix prototypes of sv_vsetpvfn and sv_vcatpvfn:
- Subject: Re: ANNOUNCE: perl 5.004_55 is available
- Date: 27 Nov 1997 17:18:53 +0100
- From: koenig@kulturbox.de (Andreas J. Koenig)
+[ 2902] By: gsar on 1999/02/12 12:55:11
+ Log: script to generate ctags from etags
+ From: Colin Kuskie <ckuskie@cadence.com>
+ Date: Wed, 20 Jan 1999 16:29:35 -0800 (PST)
+ Message-ID: <Pine.GSO.3.96.990120160519.5755Q-100000@pdxue150.cadence.com>
+ Subject: [PATCH 5.005_54] adding ctags to the source, FAQ, make
Branch: perl
- ! sv.c
+ + emacs/e2ctags.pl
+ ! Makefile.SH pod/perlfaq3.pod
____________________________________________________________________________
-[ 322] By: mbeattie on 1997/11/27 16:12:15
- Log: Integrate win32 branch back into mainline.
+[ 2901] By: gsar on 1999/02/12 12:40:17
+ Log: allow boolean assign ops to be lvalues
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Mon, 11 Jan 1999 16:52:18 -0600 (CST)
+ Message-ID: <13978.32609.495338.544643@alias-2.pr.mcs.net>
+ --
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Mon, 18 Jan 1999 10:04:00 +0000
+ Message-Id: <199901181004.KAA17471@crypt.compulink.co.uk>
+ Subject: Re: [inconsistency 5.005_54] ||= not an lvalue
Branch: perl
- !> (integrate 42 files)
+ + t/op/lop.t
+ ! MANIFEST op.c
____________________________________________________________________________
-[ 321] By: mbeattie on 1997/11/27 15:06:36
- Log: Fix t/lib/safe2.t for SunOS 4.1.3:
- Subject: Re: ANNOUNCE: perl 5.004_55 is available
- Date: Thu, 27 Nov 1997 10:46:42 +0000 (GMT)
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+[ 2899] By: jhi on 1999/02/12 12:03:48
+ Log: Configure update: OpenBSD thread-awareness, SCO ODT/OSR osvers.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH hints/openbsd.sh
+____________________________________________________________________________
+[ 2898] By: gsar on 1999/02/12 11:49:25
+ Log: support win32_putenv()
Branch: perl
- ! t/lib/safe2.t
+ ! mg.c util.c win32/GenCAPI.pl win32/makedef.pl win32/perlhost.h
+ ! win32/win32.c win32/win32iop.h
____________________________________________________________________________
-[ 320] By: mbeattie on 1997/11/27 15:02:59
- Log: Fix MYMALLOC (wrong #define in malloc.c):
- Subject: 5.004_55: MYMALLOC completely busted
- Date: Thu, 27 Nov 1997 01:08:16 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 2894] By: gsar on 1999/02/12 11:09:27
+ Log: add missing hunk in change#2657
Branch: perl
- ! malloc.c
+ ! ext/B/B/CC.pm
____________________________________________________________________________
-[ 319] By: mbeattie on 1997/11/27 15:01:37
- Log: Fix newSVrv so sv_setref_foo work better:
- Subject: [PATCH] [5.004_55] newSVrv (again)
- Date: Thu, 27 Nov 1997 00:25:50 -0500
- From: Owen Taylor <owt1@cornell.edu>
+[ 2893] By: gsar on 1999/02/12 11:00:13
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 19 Jan 1999 20:13:15 -0500
+ Message-ID: <19990119201315.A21167@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Remove extraneous sh in test suites
Branch: perl
- ! sv.c
+ ! t/op/fh.t t/op/misc.t t/op/runlevel.t t/pragma/strict.t
+ ! t/pragma/subs.t t/pragma/warning.t
____________________________________________________________________________
-[ 318] By: mbeattie on 1997/11/27 14:59:03
- Log: Output skipped test information in test suite:
- Subject: 5.004_55: Making test harness platform_aware
- Date: Wed, 26 Nov 1997 17:16:55 -0500 (EST)
- Date: Wed, 26 Nov 1997 17:16:55 -0500 (EST)
+[ 2892] By: gsar on 1999/02/12 10:44:38
+ Log: update change#2670 to later version
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Sun, 31 Jan 1999 16:16:14 +0000
+ Message-Id: <199901311616.QAA17673@crypt.compulink.co.uk>
+ Subject: Re: [PATCH 5.005_54] Evalled substitution parsing
Branch: perl
- ! lib/Test/Harness.pm t/TEST t/lib/anydbm.t t/lib/db-btree.t
- ! t/lib/db-hash.t t/lib/db-recno.t t/lib/gdbm.t t/lib/ndbm.t
- ! t/lib/odbm.t t/lib/sdbm.t t/op/taint.t
+ ! t/op/subst.t toke.c
____________________________________________________________________________
-[ 317] By: mbeattie on 1997/11/27 14:55:15
- Log: Add 'W'atch command to debugger and improve help:
- Subject: 5.004_55: Debugger patch again
- Date: Wed, 26 Nov 1997 17:05:57 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 2891] By: gsar on 1999/02/12 10:31:17
+ Log: make testsuite somewhat location independent
Branch: perl
- ! lib/perl5db.pl
+ ! (edit 117 files)
____________________________________________________________________________
-[ 316] By: mbeattie on 1997/11/27 14:52:44
- Log: Stop double initialisation of malloc_mutex:
- Subject: 5.004_55: Double initialiazation of malloc_mutex
- Date: Wed, 26 Nov 1997 16:51:43 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 2890] By: gsar on 1999/02/12 10:00:30
+ Log: add $AutoLoader::VERSION
Branch: perl
- ! miniperlmain.c win32/perllib.c
+ ! lib/AutoLoader.pm
____________________________________________________________________________
-[ 315] By: mbeattie on 1997/11/27 14:48:58
- Log: Fix PVLV case in sv_setsv (plus tests in op/pat.t).
+[ 2889] By: gsar on 1999/02/12 09:55:48
+ Log: tweak PERL_STRICT_CR notes
Branch: perl
- ! sv.c t/op/pat.t
+ ! pod/perl5005delta.pod
____________________________________________________________________________
-[ 314] By: nick on 1997/11/27 01:03:19
- Log: Merge win32 and ansiperl branches post _55 tweaks from Sarathy.
- Branch: ansiperl
- !> (integrate 897 files)
+[ 2888] By: gsar on 1999/02/12 09:41:45
+ Log: add note about test-notty target
+ Branch: perl
+ ! README.win32
____________________________________________________________________________
-[ 313] By: gsar on 1997/11/26 03:20:55
- Log: merge win32-aware installperl in ansiperl branch.
- Branch: win32/perl
- !> installperl
+[ 2887] By: gsar on 1999/02/12 09:37:37
+ Log: add perltodo.pod
+ Branch: perl
+ + pod/perltodo.pod
+ ! MANIFEST Todo pod/Makefile pod/perl.pod pod/roffitall
+ ! win32/pod.mak
____________________________________________________________________________
-[ 312] By: gsar on 1997/11/26 01:50:37
- Log: Fix for C<sort 'foo'...> bug:
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Message-Id: <199711011946.OAA18882@aatma.engin.umich.edu>
- Subject: [PATCH] Re: Sort grammar bug
- Date: Sat, 01 Nov 1997 14:46:35 -0500
- ------
- From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
- Message-Id: <199711021247.MAA01743@crypt.compulink.co.uk>
- Subject: Re: Sort grammar bug
- Date: Sun, 02 Nov 1997 12:47:51 +0000
- Branch: win32/perl
- ! t/op/sort.t toke.c
-____________________________________________________________________________
-[ 311] By: nick on 1997/11/26 01:42:50
- Log: Win32-ize installperl
- Branch: ansiperl
- ! installperl
+[ 2886] By: jhi on 1999/02/12 08:52:14
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> t/op/fh.t
+ !> (integrate 30 files)
____________________________________________________________________________
-[ 310] By: gsar on 1997/11/26 01:36:39
- Log: Another trivial patch:
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Message-Id: <199710300245.VAA04244@aatma.engin.umich.edu>
- Subject: [PATCH] Re: Why doesn't XSRETURN have STMT_START/STMT_END brackets?
- Date: Wed, 29 Oct 1997 21:45:26 -0500
- Branch: win32/perl
- ! XSUB.h
+[ 2885] By: gsar on 1999/02/12 08:42:10
+ Log: note how to find REG_INFTY limit
+ Branch: perl
+ ! pod/perlre.pod
____________________________________________________________________________
-[ 309] By: nick on 1997/11/26 01:33:32
- Log: Fixup _55 for Win32:
- Missed thread :-> perl_thread changes
- Two #define THR (not the same)
- K&R style func in hv.c
- Branch: ansiperl
- ! hv.c win32/win32thread.c win32/win32thread.h
+[ 2884] By: jhi on 1999/02/12 08:36:14
+ Log: OpenBSD pthreads awareness, thanks to
+ David Leonard <david.leonard@csee.uq.edu.au>
+ Branch: maint-5.005/perl
+ ! Configure hints/openbsd.sh
____________________________________________________________________________
-[ 308] By: gsar on 1997/11/26 01:30:21
- Log: Sync yet another patch (this one manually edited):
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Message-Id: <199710290251.VAA14362@aatma.engin.umich.edu>
- Subject: [PATCH] Re: local($@) gives core dump
- Date: Tue, 28 Oct 1997 21:51:25 -0500
- Branch: win32/perl
- ! pp_ctl.c
+[ 2882] By: gsar on 1999/02/12 08:05:20
+ Log: IO is maintained by p5p (per Graham Barr's wishes)
+ Branch: perl
+ ! MAINTAIN ext/IO/ChangeLog ext/IO/README ext/IO/lib/IO/Dir.pm
+ ! ext/IO/lib/IO/Pipe.pm ext/IO/lib/IO/Poll.pm
+ ! ext/IO/lib/IO/Select.pm ext/IO/lib/IO/Socket.pm
+ ! ext/IO/lib/IO/Socket/INET.pm ext/IO/lib/IO/Socket/UNIX.pm
____________________________________________________________________________
-[ 307] By: gsar on 1997/11/26 01:22:10
- Log: Sync another change from local repository.
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Message-Id: <199710290316.WAA15888@aatma.engin.umich.edu>
- Subject: Re: do_postponed breaks with multiple interpreters
- Date: Tue, 28 Oct 1997 22:16:13 -0500
- Branch: win32/perl
- ! op.c
+[ 2881] By: gsar on 1999/02/12 07:57:13
+ Log: fh.t typo
+ Branch: perl
+ ! t/op/fh.t
____________________________________________________________________________
-[ 306] By: gsar on 1997/11/26 01:17:46
- Log: Sync a change from local repository.
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Message-Id: <199710290106.UAA11485@aatma.engin.umich.edu>
- Subject: [PATCH] Re: Core dump from using sockets w/ system or open(pipe) or "`"
- Date: Tue, 28 Oct 1997 20:06:06 -0500
- Branch: win32/perl
- ! mg.c
+[ 2880] By: gsar on 1999/02/12 07:38:16
+ Log: PERL5OPT=-T enables taint mode (suggested by Jason Riedy <ejr@cise.ufl.edu>)
+ Branch: perl
+ ! perl.c pod/perlrun.pod
____________________________________________________________________________
-[ 305] By: nick on 1997/11/26 00:50:10
- Log: Integrate mainline as of _55
- Branch: ansiperl
- +> emacs/ptags
- !> (integrate 36 files)
+[ 2879] By: gsar on 1999/02/12 05:39:29
+ Log: fix ops that are not filehandle constructors to not create GV if it
+ doesn't already exist (avoids leaks); extend semantics of defined()
+ so that defined(*{$foo}) works (experimental)
+ Branch: perl
+ + t/op/fh.t
+ ! MANIFEST embed.h embed.pl objXSUB.h op.c pod/perldiag.pod pp.c
+ ! pp_hot.c pp_sys.c proto.h t/op/gv.t t/op/misc.t
____________________________________________________________________________
-[ 304] By: gsar on 1997/11/26 00:27:57
- Log: Various changes to make it build cleanly and pass all tests:
- - needed to run `perl embed.pl`
- - use PERL_CORE instead of PERLDLL in places that do mean PERL_CORE
- - fix prototypes for a few declarations (Borland is finally quiet)
- - move declaration of Mymalloc etc to perl.h (since win32 and other
- ports may #define malloc themselves, to let extensions bind to
- the version that perl used)
- - move struct reg_data into a public header file, since it is
- referenced in a public datatype
- - win32 makefile fixes
- - fix remaining s/thread/perl_thread/
- Branch: win32/perl
- ! EXTERN.h embed.h ext/DynaLoader/dlutils.c
- ! ext/SDBM_File/sdbm/sdbm.h hv.c perl.h proto.h regcomp.h
- ! regexp.h win32/Makefile win32/dl_win32.xs win32/makefile.mk
- ! win32/win32.h win32/win32iop.h win32/win32thread.c
-____________________________________________________________________________
-[ 303] By: gsar on 1997/11/25 20:57:31
- Log: Fixup the places where the automatic merge got it wrong.
- Previous change (#302) was just a normal integration--ignore the
- "reverse" in there.
- Branch: win32/perl
- ! op.c perl.h
-____________________________________________________________________________
-[ 302] By: gsar on 1997/11/25 20:32:12
- Log: reverse integrate mainline
- Branch: win32/perl
- +> emacs/ptags
- !> (integrate 896 files)
-
-----------------
-Version 5.004_55
-----------------
-
+[ 2877] By: jhi on 1999/02/11 20:44:00
+ Log: From: Chris Nandor <pudge@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH] perlport.pod 1.39
+ Date: Thu, 11 Feb 1999 12:28:35 -0500
+ Message-Id: <v04020a2db2e8c3177123@[192.168.0.77]>
+ Branch: cfgperl
+ ! pod/perlport.pod
____________________________________________________________________________
-[ 301] By: mbeattie on 1997/11/25 17:59:53
- Log: Fix minor thinkos in hv.c and pp_ctl.c. This is 5.004_55.
+[ 2870] By: gsar on 1999/02/11 11:17:08
+ Log: remove double typeglob deref (suggested by RonaldWS <ronaldws@aol.com>)
Branch: perl
- ! hv.c pp_ctl.c
+ ! ext/IO/lib/IO/Pipe.pm
____________________________________________________________________________
-[ 300] By: mbeattie on 1997/11/25 16:29:36
- Log: Add t/avhv.t to MANIFEST and bump patchlevel.h to 55.
+[ 2869] By: gsar on 1999/02/11 11:00:56
+ Log: update win32/pod.mak
Branch: perl
- ! MANIFEST patchlevel.h
+ ! win32/pod.mak
____________________________________________________________________________
-[ 299] By: mbeattie on 1997/11/25 15:59:16
- Log: Move malloc_mutex initialisation/destruction:
- Subject: patch to 5.004_54 for pthreads with Perl's malloc
- From: ilya@math.ohio-state.edu (Ilya Zakharevich)
+[ 2868] By: gsar on 1999/02/11 10:42:44
+ Log: From: Benjamin Low <b.d.low@unsw.edu.au>
+ Date: Fri, 08 Jan 1999 14:36:53 +1100
+ Message-ID: <36957D55.1D65A0B2@unsw.edu.au>
+ Subject: Re: [Fwd: IO::Socket::connect and blocking]
Branch: perl
- ! malloc.c os2/os2.c os2/os2ish.h perl.c perl.h plan9/plan9ish.h
- ! unixish.h vms/vmsish.h
+ ! ext/IO/lib/IO/Socket.pm
____________________________________________________________________________
-[ 298] By: mbeattie on 1997/11/25 15:49:22
- Log: Make hv_ functions cope better with 'm'-magic:
- Subject: [5.004_54] Another neglected patch
- Date: Fri, 21 Nov 1997 22:28:17 -0500
- From: Owen Taylor <owt1@cornell.edu>
+[ 2867] By: gsar on 1999/02/11 09:43:03
+ Log: av_extend() doc tweak from Jan Dubois
Branch: perl
- ! hv.c
+ ! pod/perlguts.pod
____________________________________________________________________________
-[ 297] By: mbeattie on 1997/11/25 15:47:36
- Log: Fix typo in Thread.xs.
+[ 2866] By: gsar on 1999/02/11 09:27:17
+ Log: display full pathname of unreadable files
Branch: perl
- ! ext/Thread/Thread.xs
+ ! utils/perldoc.PL
____________________________________________________________________________
-[ 296] By: mbeattie on 1997/11/25 15:42:07
- Log: Integrate from ansi branch to mainline.
+[ 2865] By: gsar on 1999/02/11 09:02:31
+ Log: missing patch in change#2522
Branch: perl
- !> (integrate 890 files)
+ ! lib/Pod/Text.pm
____________________________________________________________________________
-[ 295] By: mbeattie on 1997/11/25 14:29:31
- Log: AIX patch for DynaLoader/dl_aix.xs and hints/aix.sh:
- Subject: Re: _54 on AIX
- Date: Tue, 25 Nov 1997 00:49:52 -0800 (PST)
- From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+[ 2864] By: jhi on 1999/02/11 08:45:00
+ Log: From: Spider Boardman <spider@zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on RISC-ultrix 4.4 (UNINSTALLED)
+ Date: Wed, 10 Feb 1999 23:33:31 -0500
+ Message-Id: <9902110433.AA12816@abyss.zk3.dec.com>
+ Branch: maint-5.005/perl
+ ! doio.c ext/IPC/SysV/SysV.xs hints/ultrix_4.sh
+____________________________________________________________________________
+[ 2862] By: gsar on 1999/02/11 08:14:34
+ Log: integrate changes#2738,2740 from maint-5.005
Branch: perl
- ! ext/DynaLoader/dl_aix.xs
+ !> lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2861] By: jhi on 1999/02/11 08:04:25
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes perl.h pod/perl5005delta.pod pp_ctl.c t/op/local.t
+ !> t/op/range.t win32/config.gc
____________________________________________________________________________
-[ 294] By: mbeattie on 1997/11/25 14:29:10
- Log: AIX patch for hints/aix.sh:
- Subject: Re: _54 on AIX
- Date: Tue, 25 Nov 1997 00:49:52 -0800 (PST)
- From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+[ 2860] By: gsar on 1999/02/11 07:30:08
+ Log: binmode() support for cygwin32 (suggested by Steven Morlock
+ <newspost@morlock.net>)
Branch: perl
- ! hints/aix.sh
+ ! perl.h
____________________________________________________________________________
-[ 291] By: mbeattie on 1997/11/25 14:17:05
- Log: Fix scalar dereference of threadsv variables (e.g. $$_).
+[ 2859] By: gsar on 1999/02/11 07:14:21
+ Log: update Changes
Branch: perl
- ! op.c op.h
+ ! Changes
+ !> pod/perl5005delta.pod
____________________________________________________________________________
-[ 290] By: mbeattie on 1997/11/25 14:16:29
- Log: AIX patch (including Configure support for {sched,pthread}_yield,
- pthread initial detach state, renaming perl_thread to perl_os_thread
- and struct thread to struct perl_thread):
- Subject: Re: _54 on AIX
- Date: Thu, 20 Nov 1997 06:10:51 -0800 (PST)
- From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+[ 2856] By: gsar on 1999/02/11 07:07:39
+ Log: integrate perldelta changes from maint-5.005
Branch: perl
- ! Configure config_h.SH cv.h ext/DB_File/DB_File.xs
- ! ext/Thread/Makefile.PL ext/Thread/Thread.pm
- ! ext/Thread/Thread.xs fakethr.h hints/aix.sh perl.c perl.h pp.h
- ! proto.h sv.h thread.h util.c win32/win32thread.c
- ! win32/win32thread.h
+ !> pod/perl5005delta.pod
____________________________________________________________________________
-[ 289] By: mbeattie on 1997/11/25 12:33:02
- Log: Rename perl_thread to perl_os_thread.
+[ 2855] By: gsar on 1999/02/11 06:31:50
+ Log: applied suggested patch; added tests
+ From: Adam Krolnik <adamk@gypsy.cyrix.com>
+ Date: Sat, 12 Dec 98 15:30:18 -0600
+ Message-Id: <9812122130.AA03717@gypsy.eng.cyrix.com>
+ Subject: Range operation doesn't handle IV_MAX
Branch: perl
- ! fakethr.h thread.h util.c win32/win32thread.h
+ ! pp_ctl.c t/op/range.t
____________________________________________________________________________
-[ 288] By: mbeattie on 1997/11/25 12:27:35
- Log: Remove bincompat3 support:
- Subject: Re: ANNOUNCE: perl5.004_54 is available
- Date: Wed, 19 Nov 1997 08:07:10 -0800 (PST)
- From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+[ 2854] By: gsar on 1999/02/11 05:00:55
+ Log: compatibility fix: magic non-propagation in foreach implicit localization
Branch: perl
- ! Configure INSTALL embed.h global.sym malloc.c
+ ! pp_ctl.c t/op/local.t win32/config.gc
____________________________________________________________________________
-[ 287] By: mbeattie on 1997/11/25 12:23:50
- Log: Emacs/tags update:
- Subject: Emacs/tags update for 5.004_54
- Date: Fri, 21 Nov 1997 15:02:09 -0500 (EST)
- From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+[ 2852] By: gsar on 1999/02/10 23:17:49
+ Log: fair warning about -Dusethreads
+ Branch: maint-5.005/perl
+ ! Configure INSTALL README.threads
+____________________________________________________________________________
+[ 2847] By: jhi on 1999/02/09 19:13:28
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> pod/perldelta.pod pod/perlfunc.pod pod/perlobj.pod
+ !> pod/perlop.pod pp.c t/op/method.t t/op/pack.t
+____________________________________________________________________________
+[ 2846] By: gsar on 1999/02/09 13:53:28
+ Log: a modified version of suggested patch for pack template 'Z'; added docs
+ From: "Valeriy E. Ushakov" <uwe@ptc.spbu.ru>
+ Date: Mon, 16 Jun 1997 03:00:31 +0400 (MSD)
+ Message-ID: <%lOHpzIuGV@snark.ptc.spbu.ru>
+ Subject: lack of pack/unpack letter with useful symmetry for C null delimited strings
Branch: perl
- + emacs/ptags
- ! MANIFEST Makefile.SH emacs/cperl-mode.el
+ ! pod/perldelta.pod pod/perlfunc.pod pp.c t/op/pack.t
____________________________________________________________________________
-[ 286] By: nick on 1997/11/23 23:03:56
- Log: Add $$_ test
- Branch: ansiperl
- ! t/op/ref.t
+[ 2845] By: gsar on 1999/02/09 00:03:26
+ Log: clarify docs for change#2835
+ Branch: perl
+ ! pod/perldelta.pod pod/perlop.pod
____________________________________________________________________________
-[ 285] By: gsar on 1997/11/23 08:26:00
- Log: Initial reverse integration of winansi branch.
- Branch: win32/perl
- !> (integrate 50 files)
+[ 2844] By: gsar on 1999/02/08 23:40:57
+ Log: addendum to change#2823
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Sun, 13 Dec 1998 16:06:04 -0800 (PST)
+ Message-ID: <13940.21805.470054.299@fre-76-120.reshall.berkeley.edu>
+ Subject: [PATCH] Docs and tests for method-call syntax
+ Branch: perl
+ ! pod/perlobj.pod t/op/method.t
____________________________________________________________________________
-[ 284] By: gsar on 1997/11/23 07:32:24
- Log: Add to docs about the BEGIN { shift } feature. Make the change
- yet simpler using CvUNIQUE(compcv) instead of subline (Chip's idea).
- Branch: win32/perl
- ! op.c perly.c perly.y pod/perlfunc.pod vms/perly_c.vms
+[ 2843] By: jhi on 1999/02/08 21:06:28
+ Log: Ultrix mmap tidbit.
+ Branch: cfgperl
+ ! hints/ultrix_4.sh
____________________________________________________________________________
-[ 283] By: nick on 1997/11/22 21:29:30
- Log: Duplicate perl_threadsv
- Branch: ansiperl
- ! global.sym
+[ 2842] By: jhi on 1999/02/08 20:22:55
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> t/op/subst_wamp.t
+ !> (integrate 35 files)
____________________________________________________________________________
-[ 282] By: nick on 1997/11/22 21:18:11
- Log: Munge pseudo-Configure stuff to add -thread to archname as
- Malcolm seems to think that is way to test for threads.
- Update @INC stuffing hackery to have traditional @INC
- search order archlib, privlib, sitearch, site.
- Branch: ansiperl
- ! t/lib/english.t win32/config.bc win32/config_H.bc
- ! win32/config_H.vc win32/config_h.PL win32/config_sh.PL
- ! win32/makefile.mk win32/win32.c win32/win32.h
+[ 2841] By: jhi on 1999/02/08 18:23:26
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_53] s/\ba/./g was over-optimized
+ Date: Sun, 7 Feb 1999 17:25:22 -0500
+ Message-ID: <19990207172522.B894@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ + t/op/subst_amp.t
+ ! MANIFEST regcomp.c t/op/subst.t
____________________________________________________________________________
-[ 281] By: nick on 1997/11/22 19:28:21
- Log: Builds and passes all but english.t on win32 VC++
- Branch: ansiperl
- ! global.sym pp_ctl.c win32/Makefile win32/config.vc
- ! win32/config_H.vc win32/win32thread.h
+[ 2840] By: jhi on 1999/02/08 18:16:54
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_53] Fix list-context //g with zero-length matches
+ Date: Sun, 7 Feb 1999 17:00:10 -0500
+ Message-ID: <19990207170009.A894@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! pp_hot.c t/op/pat.t
____________________________________________________________________________
-[ 280] By: nick on 1997/11/22 18:10:50
- Log: ansiperl builds with Borland C++ again
- Branch: ansiperl
- ! pp_ctl.c regcomp.c regcomp.h regexec.c toke.c util.c
- ! win32/config.bc win32/config_H.bc win32/perlglob.c
- ! win32/win32.c win32/win32.h
+[ 2839] By: jhi on 1999/02/08 17:25:30
+ Log: A require was missing.
+ Branch: cfgperl
+ ! t/lib/h2ph.pht
____________________________________________________________________________
-[ 279] By: nick on 1997/11/22 16:42:51
- Log: Resolve ansiperl against mainline
- Branch: ansiperl
- !> embed.h ext/Thread/Thread.xs global.sym op.c op.h perl.c
- !> perl.h pp.c pp_ctl.c pp_hot.c proto.h scope.c scope.h
- !> t/lib/english.t thread.h toke.c util.c
+[ 2838] By: jhi on 1999/02/08 16:38:41
+ Log: Bring in the change #2809 (the Configure part has been
+ modified rather a lot since the #2809, though.)
+ Branch: cfgperl
+ ! Configure utils/h2ph.PL
____________________________________________________________________________
-[ 278] By: nick on 1997/11/22 16:30:27
- Log: Resolve ansiperl against win32
- Branch: ansiperl
- !> (integrate 55 files)
+[ 2835] By: gsar on 1999/02/08 14:40:23
+ Log: make qw() into a true list at compile time (slightly modified
+ variant of patch suggested by Tom Hughes <tom@compton.demon.co.uk>)
+ Branch: perl
+ ! pod/perldelta.pod pod/perlop.pod pp_hot.c toke.c
____________________________________________________________________________
-[ 277] By: gsar on 1997/11/22 09:48:02
- Log: - shift() inside BEGIN|END|INIT now shifts @ARGV instead of @_
- - added a test for the above
- - fixed up perly.c.diff and vms/perl_c.vms for above and added the
- ansification hunks
- Branch: win32/perl
- ! op.c perly.c perly.c.diff perly.y t/op/misc.t vms/perly_c.vms
-____________________________________________________________________________
-[ 276] By: gsar on 1997/11/22 07:24:01
- Log: Generic change in win32 branch: don't just turn on CRIPPLED_CC
- when USE_THREADS. GCC for instance, can do without macros that use
- globals. Instead, selectively re#define only those macros
- that use globals to their functional equivalents. Tests 100% on
- Solaris/gcc (after `chmod +x t/op/nothread.t t/lib/thread.t` (hint,hint)).
- Branch: win32/perl
- ! perl.h sv.h
-____________________________________________________________________________
-[ 275] By: gsar on 1997/11/22 05:27:04
- Log: Integrate mainline.
- Branch: win32/perl
- +> ext/Thread/die.t ext/Thread/die2.t t/op/avhv.t
- - lib/Class/Fields.pm lib/ISA.pm
- !> (integrate 41 files)
-____________________________________________________________________________
-[ 274] By: mbeattie on 1997/11/21 18:28:22
- Log: $_ is now per-thread (rather a lot of changes). Only tested under
- *-linux-thread at the moment.
- Branch: perl
- ! embed.h ext/Thread/Thread.xs global.sym op.c op.h perl.c
- ! perl.h pp.c pp_ctl.c pp_hot.c proto.h scope.c scope.h
- ! t/lib/english.t thread.h toke.c util.c
-____________________________________________________________________________
-[ 273] By: mbeattie on 1997/11/21 10:31:29
- Log: Filter patch to toke.c:
- Subject: Tiny core patch for source filters
- Date: Thu, 20 Nov 1997 23:12:09 +0000 (GMT)
- From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+[ 2834] By: gsar on 1999/02/08 13:23:16
+ Log: make safesysmalloc() etc., always available; safemalloc() et al are
+ now macros that point to the right malloc; fix various places in
+ sources that need to always use safesysmalloc() et al
Branch: perl
- ! toke.c
+ ! embed.h embedvar.h global.sym iperlsys.h mg.c objXSUB.h perl.h
+ ! perl_exp.SH proto.h util.c vms/gen_shrfls.pl win32/makedef.pl
____________________________________________________________________________
-[ 272] By: nick on 1997/11/21 00:54:43
- Log: Basic integrate of lastest perl into ansiperl
- Branch: ansiperl
- +> ext/Thread/die.t ext/Thread/die2.t t/op/avhv.t
- - lib/Class/Fields.pm lib/ISA.pm
- ! win32/win32.c win32/win32.h
- !> (integrate 57 files)
+[ 2833] By: gsar on 1999/02/08 10:56:16
+ Log: remove spurious #endif in last change
+ Branch: perl
+ ! perl.h
____________________________________________________________________________
-[ 271] By: mbeattie on 1997/11/20 12:12:00
- Log: Initial stab at IRIX configuration support for threading. Manually
- applied parts of following patches:
- Subject: Perl 5.004_54 on IRIX
- Date: Wed, 19 Nov 1997 18:37:14 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
- Subject: Re: Perl 5.004_54 on IRIX
- Date: 19 Nov 1997 17:10:17 -0800
- From: Scott Henry <scotth@sgi.com>
+[ 2832] By: gsar on 1999/02/08 10:34:55
+ Log: make EMBEDMYMALLOC the default and provide PERL_POLLUTE_MALLOC to let
+ them ask for insanity (untested)
Branch: perl
- ! README.threads hints/irix_6.sh hints/irix_6_0.sh
- ! hints/irix_6_1.sh perl.h
+ ! INSTALL Todo-5.005 ext/SDBM_File/sdbm/sdbm.h hints/machten.sh
+ ! hints/next_3.sh hints/next_4.sh hints/qnx.sh iperlsys.h
+ ! malloc.c perl.h pod/perldelta.pod pod/perlguts.pod sv.c
____________________________________________________________________________
-[ 270] By: mbeattie on 1997/11/19 17:45:37
- Log: The new jumbo regexp stuff did SSPUSHINT on a char* instead of
- SSPUSHPTR causing Alpha to core dump in pat.t. While fixing it,
- also fixed two instances of referring to SVs after destruction.
+[ 2831] By: jhi on 1999/02/08 08:33:33
+ Log: Update vms/subconfigure.com along the lines of change #2829.
+ Branch: cfgperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 2830] By: gsar on 1999/02/08 00:19:46
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! regcomp.c regexec.c
+ +> ext/DynaLoader/dl_beos.xs ext/GDBM_File/hints/sco.pl
+ +> lib/File/PathConvert.pm pod/perlthrtut.pod
+ ! Changes
+ !> (integrate 93 files)
+____________________________________________________________________________
+[ 2829] By: jhi on 1999/02/07 23:49:46
+ Log: Configure update.
+
+ Probe for mmap() et alia.
+ The *cc*symbols patch (just Configure, no h2ph).
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH perl.h
____________________________________________________________________________
-[ 269] By: mbeattie on 1997/11/19 15:33:23
- Log: avhv_keys under Digital UNIX made avhv.t fail because *keysp was
- changed by mg_get(*keysp) (!). Introducing a new local variable
- fixed it but I don't know if it's a compiler problem or some
- other corruption happening elsewhere.
+[ 2828] By: gsar on 1999/02/07 23:38:47
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 7 Feb 1999 17:25:22 -0500
+ Message-ID: <19990207172522.B894@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] s/\ba/./g was over-optimized
Branch: perl
- ! av.c
+ + t/op/subst_amp.t t/op/subst_wamp.t
+ ! MANIFEST regcomp.c t/op/subst.t
____________________________________________________________________________
-[ 268] By: mbeattie on 1997/11/19 11:39:49
- Log: Let Configure sort out get{host,net}byaddr* prototypes:
- Subject: [PATCH] 5.004_54: little something for
- get{hos,ne}tbyaddr protos (Configure, config_h.SH, pp_sys.c)
- Date: Tue, 18 Nov 1997 19:08:19 +0200 (EET)
- From: Jarkko Hietaniemi <jhi@iki.fi>
+[ 2827] By: gsar on 1999/02/07 23:27:32
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 7 Feb 1999 17:00:10 -0500
+ Message-ID: <19990207170009.A894@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Fix list-context //g with zero-length matches
Branch: perl
- ! Configure config_h.SH pp_sys.c
+ ! pp_hot.c t/op/pat.t
____________________________________________________________________________
-[ 267] By: mbeattie on 1997/11/19 11:04:15
- Log: Jumbo regexp patch applied (with minor fix-up tweaks):
- Subject: Version 7 of Jumbo RE patch available
- Date: Sun, 16 Nov 1997 00:29:39 -0500 (EST)
+[ 2826] By: gsar on 1999/02/07 23:26:04
+ Log: patch for change#2822, done right; add PERL_OBJECT stuff; regen headers
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 7 Feb 1999 15:07:27 -0500
+ Message-ID: <19990207150726.A571@monk.mps.ohio-state.edu>
+ Subject: Re: fixing memory leaks in REx compilation
Branch: perl
- ! MANIFEST dump.c embed.h global.sym mg.c op.c op.h perl.c
- ! perl.h pod/perlre.pod pp.c pp_ctl.c pp_hot.c proto.h regcomp.c
- ! regcomp.h regexec.c regexp.h sv.c t/op/misc.t t/op/pat.t
- ! t/op/re_tests t/op/regexp.t t/op/split.t t/op/subst.t toke.c
- ! util.c
+ ! embed.h embed.pl objXSUB.h proto.h regcomp.c regcomp.h
+ ! regexec.c
+____________________________________________________________________________
+[ 2825] By: jhi on 1999/02/07 18:05:13
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> lib/DB.pm t/comp/bproto.t
+ !> MANIFEST ext/Data/Dumper/Dumper.pm ext/SDBM_File/sdbm/sdbm.c
+ !> lib/Pod/Html.pm op.c perly.c perly.y perly_c.diff
+ !> pod/perldelta.pod pod/perlfunc.pod pod/perlop.pod regcomp.h
+ !> toke.c vms/perly_c.vms
+____________________________________________________________________________
+[ 2824] By: gsar on 1999/02/07 14:21:48
+ Log: tweak doc on bitwise ops
+ Branch: perl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 2823] By: gsar on 1999/02/07 13:38:31
+ Log: applied suggested patch; regen perly* and vms/perly*
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Sun, 13 Dec 1998 01:10:12 -0800 (PST)
+ Message-ID: <13939.26706.620683.846776@fre-76-120.reshall.berkeley.edu>
+ Subject: [PATCH] Re: Suggestion for perlobj man page
+ Branch: perl
+ ! perly.c perly.y perly_c.diff toke.c vms/perly_c.vms
+____________________________________________________________________________
+[ 2822] By: gsar on 1999/02/07 12:39:09
+ Log: Ilya's idea for cleaning up failed regex allocs (substantive parts
+ disabled, fails tests)
+ Branch: perl
+ ! regcomp.h
____________________________________________________________________________
-[ 266] By: mbeattie on 1997/11/18 17:26:09
- Log: Separate avhv_foo() key handling into avhv_keys(). Slightly tweaked
- version of patch:
- Subject: tie fake hash patch for 5.004_54
- Date: Sat, 15 Nov 1997 19:18:30 -0500
- From: Joshua Pritikin <pritikin@mindspring.com>
+[ 2821] By: gsar on 1999/02/07 11:09:39
+ Log: pod2html misinterprets Foo::Bar as a URL (fix suggested by Alexander Barilo
+ <Alexander.Barilo@aexp.com>)
Branch: perl
- + t/op/avhv.t
- ! av.c embed.h global.sym proto.h
+ ! lib/Pod/Html.pm
____________________________________________________________________________
-[ 265] By: mbeattie on 1997/11/18 16:51:04
- Log: Bring MANIFEST up to date. Add new thread tests.
+[ 2820] By: gsar on 1999/02/07 10:20:35
+ Log: add draft debugging API implementation
Branch: perl
- + ext/Thread/die.t ext/Thread/die2.t
+ + lib/DB.pm
! MANIFEST
____________________________________________________________________________
-[ 264] By: mbeattie on 1997/11/18 16:41:27
- Log: magic_setisa enhanced to update %FIELDS automatically when @ISA
- is assigned to. Added tests to t/op/array.t. magic_setisa now
- warns about including non-existent packages in @ISA when -w is on.
+[ 2819] By: gsar on 1999/02/07 09:58:45
+ Log: avoid garbage in db->dirbuf
+ From: Masahiro KAJIURA <masahiro.kajiura@toshiba.co.jp>
+ Date: Sat, 05 Dec 1998 14:14:54 +0900
+ Message-Id: <199812050514.OAA23268@toshiba.co.jp>
+ Subject: SDBM bug
Branch: perl
- - lib/Class/Fields.pm lib/ISA.pm
- ! mg.c t/op/array.t
+ ! ext/SDBM_File/sdbm/sdbm.c
____________________________________________________________________________
-[ 263] By: mbeattie on 1997/11/18 16:38:57
- Log: Fix typo in win32 -> mainline integration.
+[ 2818] By: gsar on 1999/02/07 09:32:24
+ Log: missing entry
Branch: perl
- ! perl.h
+ ! MANIFEST
____________________________________________________________________________
-[ 262] By: mbeattie on 1997/11/18 11:56:09
- Log: Integrate win32 branch back into mainline.
+[ 2817] By: gsar on 1999/02/07 09:30:47
+ Log: properly prototype check parenthesized unary ops (e.g. defined(&a,&b))
Branch: perl
- - win32/win32io.c win32/win32io.h
- ! op.c
- !> (integrate 30 files)
+ + t/comp/bproto.t
+ ! op.c pod/perldelta.pod pod/perlfunc.pod pod/perlop.pod
____________________________________________________________________________
-[ 261] By: gsar on 1997/11/18 00:14:02
- Log: Export our own FD_SET() et al to complete sockets-as-handles pretense.
- Branch: win32/perl
- ! win32/config.bc win32/config.vc win32/config_H.bc
- ! win32/config_H.vc win32/include/sys/socket.h win32/win32sck.c
+[ 2816] By: gsar on 1999/02/06 00:14:29
+ Log: minor bug in dumping blessed subrefs
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.pm
____________________________________________________________________________
-[ 260] By: nick on 1997/11/16 23:16:16
- Log: Generic file changes for MYMALLOC
- Branch: ansiperl
- ! miniperlmain.c perl.c
-____________________________________________________________________________
-[ 259] By: nick on 1997/11/16 23:14:36
- Log: MYMALLOC for Win32:
- 1. Initialize malloc_mutex before it is used (all platforms!)
- 2. Adjust #ifdef muddle to allow MYMALLOC and win32_ to coexist
- 3. Tweak win32/config*.* to define MYMALLOC
- 4. Provide sbrk() in terms of VirtualAlloc().
+[ 2812] By: jhi on 1999/02/03 22:02:24
+ Log: Enhance change #2808.
- Also fixup -MT (perl95) build to handle Perl_current_thread
- via call to DLL (as though an extension).
- Branch: ansiperl
- ! win32/Makefile win32/config.bc win32/config.vc
- ! win32/config_H.bc win32/config_H.vc win32/makedef.pl
- ! win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
- ! win32/win32iop.h win32/win32thread.h
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ To: perl5-porters@perl.org
+ Subject: Re: [PATCH 5.00*]: perlbug checklist
+ Date: Wed, 3 Feb 1999 19:02:27 +0000
+ Message-Id: <E1087ZD-0005z1-00@taurus.cus.cam.ac.uk>
+ Branch: cfgperl
+ ! utils/perlbug.PL
____________________________________________________________________________
-[ 258] By: nick on 1997/11/15 20:42:28
- Log: Implement dTHR via __declspec(thread) - part 2
- Branch: ansiperl
- ! win32/makedef.pl win32/win32thread.c win32/win32thread.h
+[ 2811] By: jhi on 1999/02/03 21:53:23
+ Log: From: Barrie Slaymaker <rbs@telerama.com>
+ To: perl5-porters@perl.org
+ CC: pod-people@perl.org
+ Subject: [PATCH]5.005_54 (pod2html) Generate Relative URLs
+ Date: Wed, 03 Feb 1999 10:34:18 -0500
+ Message-ID: <36B86C7A.E99EFFF1@telerama.com>
+
+ Add File::PathConvert.pm.
+ Fix Pod::Html and installhtml to understand relative urls.
+ Branch: cfgperl
+ + lib/File/PathConvert.pm
+ ! MANIFEST installhtml lib/Pod/Html.pm
____________________________________________________________________________
-[ 257] By: nick on 1997/11/15 19:52:53
- Log: Use __declspec(thread) var rather tha TslAlloc & co.
- Branch: ansiperl
- ! win32/makedef.pl win32/win32thread.c win32/win32thread.h
+[ 2810] By: jhi on 1999/02/03 20:25:10
+ Log: From: Francois Desarmenien <desar@club-internet.fr>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH]5.005_54 (hints) SCO 3/5 hint files and SysV correction
+ Date: Wed, 03 Feb 1999 13:13:24 +0000
+ Message-ID: <36B84B74.5EC9B6C8@club-internet.fr>
+
+ (note: this patch completely overrides Tom Wolfe's patch,
+ change #2604)
+ Branch: cfgperl
+ + ext/GDBM_File/hints/sco.pl
+ ! MANIFEST ext/IPC/SysV/SysV.xs hints/sco.sh
____________________________________________________________________________
-[ 256] By: gsar on 1997/11/15 02:58:09
- Log: Add #include guard in Thread.xs so it will build even under
- no USE_THREADS (for win32). This was missed because of edit
- w/o checkout perforce kludge.
- Branch: win32/perl
- ! ext/Thread/Thread.xs
+[ 2809] By: jhi on 1999/02/03 19:54:16
+ Log: h2ph fixes + Configure patch to support them.
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Graham Barr <gbarr@pobox.com>, Jarkko Hietaniemi <jhi@iki.fi>,
+ Gurusamy Sarathy <gsar@engin.umich.edu>
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.00503_MT5] h2ph.PL
+ Date: Tue, 2 Feb 1999 19:48:06 -0500
+ Message-ID: <19990202194806.E10647@O2.chapin.edu>
+ Branch: maint-5.005/perl
+ ! Configure utils/h2ph.PL
____________________________________________________________________________
-[ 255] By: nick on 1997/11/15 00:33:46
- Log: Integrate mainline (5.004_54?) into ansiperl
- Branch: ansiperl
- !> MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
- !> ext/Thread/Thread/Specific.pm ext/Thread/join.t
- !> ext/Thread/specific.t global.sym lib/fields.pm mg.c op.c
- !> perl.c perl.h pp_ctl.c pp_hot.c pp_sys.c proto.h scope.c
- !> t/io/pipe.t t/lib/io_pipe.t t/op/magic.t thread.h
-____________________________________________________________________________
-[ 254] By: nick on 1997/11/15 00:25:26
- Log: Interate win32 into ansiperl
- Branch: ansiperl
- +> ext/Thread/Thread/Specific.pm ext/Thread/specific.t
- +> lib/fields.pm
- !> MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
- !> ext/Thread/join.t global.sym mg.c op.c perl.c perl.h pp_ctl.c
- !> pp_hot.c pp_sys.c proto.h scope.c t/io/pipe.t t/lib/io_pipe.t
- !> t/op/magic.t thread.h win32/Makefile win32/config.bc
- !> win32/config.vc win32/config_sh.PL win32/makefile.mk
-____________________________________________________________________________
-[ 253] By: gsar on 1997/11/14 22:04:58
- Log: Integrate mainline changes into win32 branch. Now would be a good time
- to reverse integrate the win32 branch into mainline.
- Branch: win32/perl
- +> ext/Thread/Thread/Specific.pm ext/Thread/specific.t
- +> lib/fields.pm
- !> MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
- !> ext/Thread/join.t global.sym mg.c op.c perl.c perl.h pp_ctl.c
- !> pp_hot.c pp_sys.c proto.h scope.c t/io/pipe.t t/lib/io_pipe.t
- !> t/op/magic.t thread.h
-
-----------------
-Version 5.004_54
-----------------
-
+[ 2808] By: jhi on 1999/02/03 16:59:55
+ Log: Enhance the perlbug checklist.
+ Branch: cfgperl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 2807] By: jhi on 1999/02/03 14:01:37
+ Log: Document the standard strftime %formats.
+
+ From: Dominic Dunlop <domo@vo.lu>
+ To: "Kurt D. Starsinic" <kstar@chapin.edu>, Ben Gertzfield <che@debian.org>
+ Subject: [PATCH] 5.00[45]*: Re: POSIX's strftime() does not enforce POSIX %C on Solaris
+ Date: Tue, 2 Feb 1999 15:55:29 +0100
+ Message-Id: <v0311070cb2dcb3f5f773@[212.24.192.188]>
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.pod
+____________________________________________________________________________
+[ 2806] By: jhi on 1999/02/03 13:58:00
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> perl.h
+____________________________________________________________________________
+[ 2805] By: gsar on 1999/02/03 03:32:31
+ Log: PL_uuemap[] init needs help for sizeof()
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 2804] By: jhi on 1999/02/02 20:44:30
+ Log: These should've been already in #2803.
+ Branch: cfgperl
+ ! Configure config_h.SH vms/subconfigure.com
+____________________________________________________________________________
+[ 2803] By: jhi on 1999/02/02 20:38:45
+ Log: telldir prototype issue, from mists of time...
+ Branch: cfgperl
+ ! hints/netbsd.sh pp_sys.c
+____________________________________________________________________________
+[ 2801] By: jhi on 1999/02/02 17:40:14
+ Log: From: John Bley <jbb6@acpub.duke.edu>
+ To: perlbug@perl.org
+ Subject: [PATCH]5.005_54 (DOC) fix minor typos
+ Date: Tue, 2 Feb 1999 07:52:52 -0500 (EST)
+ Message-ID: <Pine.SOL.3.91.990202075115.23589A-100000@soc11.acpub.duke.edu>
+ Branch: cfgperl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 2800] By: jhi on 1999/02/02 17:26:49
+ Log: Update todo with POSIX 1003.1 1996 Edition reminder.
+ Branch: cfgperl
+ ! Todo-5.005
+____________________________________________________________________________
+[ 2799] By: jhi on 1999/02/02 17:18:51
+ Log: Update FindBin from maint-5.005.
+ Branch: cfgperl
+ ! lib/FindBin.pm
+____________________________________________________________________________
+[ 2798] By: jhi on 1999/02/02 17:16:07
+ Log: Fix typecasts in #2797
+
+ From: "G. Del Merritt" <del@intranetics.com>
+ Date: Fri, 29 Jan 1999 11:47:25 -0700
+ Message-Id: <199901291847.LAA04828@jhereg.perl.com>
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on MSWin32-x86-object 4.0 (PATCH included)
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2797] By: jhi on 1999/02/02 17:14:37
+ Log: From: Ted Law <tedlaw@cibcwg.com>
+ Date: Wed, 27 Jan 1999 14:54:03 -0500 (EST)
+ Message-Id: <199901271954.OAA07391@dcm2.cibcwg.com>
+ Subject: POSIX::strftime buffer overflow problem
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2796] By: jhi on 1999/02/02 17:13:23
+ Log: Do not use File::Slurp.
+ Branch: cfgperl
+ ! t/lib/textfill.t
+____________________________________________________________________________
+[ 2795] By: jhi on 1999/02/02 17:11:48
+ Log: perlhist update from maint-5.005.
+ Branch: cfgperl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 2794] By: jhi on 1999/02/02 17:10:33
+ Log: POSIX::redef setv?buf() to IO::Handle:: (by gbarr).
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.pm
+____________________________________________________________________________
+[ 2793] By: jhi on 1999/02/02 17:08:39
+ Log: Missed the html test from change #2787.
+ Branch: cfgperl
+ ! t/lib/cgi-html.t
+____________________________________________________________________________
+[ 2792] By: jhi on 1999/02/02 17:01:24
+ Log: Update Getopt::Long to 2.19.
+ Branch: cfgperl
+ ! lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 2791] By: jhi on 1999/02/02 16:59:13
+ Log: overload syntax is no longer experimental
+ Branch: cfgperl
+ ! lib/overload.pm
+____________________________________________________________________________
+[ 2789] By: jhi on 1999/02/02 16:47:50
+ Log: Still doc fixes.
+ Branch: cfgperl
+ ! lib/diagnostics.pm
+____________________________________________________________________________
+[ 2788] By: jhi on 1999/02/02 16:47:07
+ Log: Doc fixes.
+ Branch: cfgperl
+ ! lib/CGI.pm lib/diagnostics.pm
+____________________________________________________________________________
+[ 2787] By: jhi on 1999/02/02 16:38:55
+ Log: CGI.pm updated to 2.46 (the CGI docs fixes redone
+ where applicable).
+ Branch: cfgperl
+ ! eg/cgi/RunMeFirst eg/cgi/caution.xbm
+ ! eg/cgi/clickable_image.cgi eg/cgi/cookie.cgi eg/cgi/crash.cgi
+ ! eg/cgi/customize.cgi eg/cgi/diff_upload.cgi
+ ! eg/cgi/dna.small.gif.uu eg/cgi/file_upload.cgi
+ ! eg/cgi/frameset.cgi eg/cgi/index.html
+ ! eg/cgi/internal_links.cgi eg/cgi/javascript.cgi
+ ! eg/cgi/monty.cgi eg/cgi/multiple_forms.cgi
+ ! eg/cgi/nph-clock.cgi eg/cgi/nph-multipart.cgi eg/cgi/popup.cgi
+ ! eg/cgi/save_state.cgi eg/cgi/tryit.cgi eg/cgi/wilogo.gif.uu
+ ! lib/CGI.pm lib/CGI/Apache.pm lib/CGI/Carp.pm lib/CGI/Cookie.pm
+ ! lib/CGI/Fast.pm lib/CGI/Push.pm lib/CGI/Switch.pm
+____________________________________________________________________________
+[ 2786] By: jhi on 1999/02/02 16:17:52
+ Log: Update CPAN to 1.47.
+ Branch: cfgperl
+ ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
+____________________________________________________________________________
+[ 2785] By: jhi on 1999/02/02 16:09:03
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ Date: Sat, 16 Jan 1999 17:22:06 -0500
+ Subject: Re: DOC PATCH (5.005_54 perlsub.pod)
+ Message-ID: <19990116222206.3674.qmail@plover.com>
+ Branch: cfgperl
+ ! pod/perlsub.pod
+____________________________________________________________________________
+[ 2784] By: jhi on 1999/02/02 16:01:31
+ Log: Fix incorrect "used only once" warnings
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 8 Jan 1999 04:37:10 -0500
+ Message-ID: <19990108043710.A14390@monk.mps.ohio-state.edu>
+ Subject: Re: change#965 flakiness
+ Branch: cfgperl
+ ! gv.c
+____________________________________________________________________________
+[ 2783] By: jhi on 1999/02/02 15:50:38
+ Log: perldelta updates.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 2782] By: jhi on 1999/02/02 14:28:26
+ Log: Mirror change #2781.
+ Branch: cfgperl
+ ! hints/linux.sh
+____________________________________________________________________________
+[ 2781] By: jhi on 1999/02/02 14:27:01
+ Log: Update the MkLinux note.
+ Branch: maint-5.005/perl
+ ! hints/linux.sh
+____________________________________________________________________________
+[ 2780] By: jhi on 1999/02/02 14:10:59
+ Log: Update todo.
+ Branch: cfgperl
+ ! Todo-5.005
+____________________________________________________________________________
+[ 2779] By: jhi on 1999/02/02 14:00:25
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ ! t/lib/textfill.t t/lib/textwrap.t
+ !> (integrate 32 files)
+____________________________________________________________________________
+[ 2778] By: jhi on 1999/02/02 13:56:23
+ Log: VMS update, applicable parts of
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_03MT3]VMS configure tweak
+ Date: Wed, 20 Jan 1999 12:05:18 -0800
+ Message-Id: <3.0.6.32.19990120120518.00a98470@ous.edu>
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perlbug@perl.com, vmsperl@perl.org
+ Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on VMSAXP (Patch included, of course)
+ Date: Tue, 26 Jan 1999 14:40:38 -0800
+ Message-Id: <3.0.6.32.19990126144038.02e5d650@ous.edu>
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_03-MAILT_TRIAL_4]VMS test patches
+ Date: Tue, 26 Jan 1999 14:55:29 -0800
+ Message-Id: <3.0.6.32.19990126145529.02f22280@ous.edu>
+ Branch: cfgperl
+ ! vms/ext/Stdio/test.pl vms/subconfigure.com
+____________________________________________________________________________
+[ 2777] By: jhi on 1999/02/02 13:43:24
+ Log: Synch usethreads parts from maint-5.005.
+ Branch: cfgperl
+ ! hints/aix.sh hints/dec_osf.sh hints/dos_djgpp.sh
+ ! hints/freebsd.sh hints/hpux.sh hints/irix_4.sh hints/irix_5.sh
+ ! hints/irix_6.sh hints/irix_6_0.sh hints/irix_6_1.sh
+ ! hints/linux.sh hints/os2.sh hints/solaris_2.sh hints/vmesa.sh
+____________________________________________________________________________
+[ 2776] By: jhi on 1999/02/02 13:17:16
+ Log: Jumbo FreeBSD update from Anton Berezin <tobez@plab.ku.dk>
+ Branch: cfgperl
+ ! Makefile.SH hints/freebsd.sh
+____________________________________________________________________________
+[ 2774] By: jhi on 1999/02/02 13:10:39
+ Log: Add perlthrtut, update pod/* machinery.
+ (a pod/Makefile.SH is sorely needed)
+ Branch: cfgperl
+ + pod/perlthrtut.pod
+ ! MANIFEST pod/Makefile pod/perl.pod pod/roffitall
+____________________________________________________________________________
+[ 2773] By: jhi on 1999/02/02 12:54:24
+ Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ To: perl5-porters@perl.org
+ Subject: Re: [PATCH] perl5.005_03-MAINT_TRIAL_3: clarify Sv[INU]V versus Sv[INU]VX in perlguts
+ Date: Tue, 26 Jan 1999 22:25:07 +0000
+ Message-Id: <E105Gux-0000Ac-00@taurus.cus.cam.ac.uk>
+ Branch: cfgperl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 2771] By: jhi on 1999/02/02 12:47:34
+ Log: Use perlbug instead of personal email address.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2770] By: jhi on 1999/02/02 12:42:06
+ Log: Miniperl fails to build (pp_sys.c was changed and iperlsys.h wasn't)
+
+ From: "G. Del Merritt" <del@intranetics.com>
+ To: perlbug@perl.com
+ Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included)
+ Date: Tue, 26 Jan 1999 12:09:09 -0700
+ Message-Id: <199901261909.MAA25525@jhereg.perl.com>
+ Branch: cfgperl
+ ! iperlsys.h
____________________________________________________________________________
-[ 252] By: mbeattie on 1997/11/14 15:07:19
- Log: Two more delays added to test suite to help *-solaris-thread.
+[ 2769] By: jhi on 1999/02/02 12:37:57
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_*] OS/2 threads
+ Date: Tue, 26 Jan 1999 13:39:46 -0500
+ Message-ID: <19990126133946.A11594@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! os2/os2ish.h
+____________________________________________________________________________
+[ 2768] By: jhi on 1999/02/02 12:36:16
+ Log: Apply change #2711 from maint-5.005:
+
+ make ok", "make okfile", and "make nok" were broken
+ with -Duseshrplib, because of a shared typo.
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 12:27:15 -0500
+ Message-Id: <199901271727.MAA233455@web.zk3.dec.com>
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2766] By: jhi on 1999/02/02 12:27:08
+ Log: Make Configure use "int main()" instead of bare "main()".
+ Like maint-5.005 change #2703 but now via metaconfig.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2765] By: jhi on 1999/02/02 11:59:30
+ Log: Undo part of change #2562.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2764] By: jhi on 1999/02/02 11:52:39
+ Log: NetBSD synch with maint-5.005.
+ Branch: cfgperl
+ ! Makefile.SH hints/netbsd.sh makedepend.SH unixish.h
+____________________________________________________________________________
+[ 2763] By: jhi on 1999/02/02 11:44:07
+ Log: $Config{installusrbinperl}
+ (maint-5.005 changes #2614 and #2709)
+ Branch: cfgperl
+ ! Configure installperl
+____________________________________________________________________________
+[ 2762] By: jhi on 1999/02/02 11:29:13
+ Log: Errno update from maint-5.005 (changes #2583, #2710).
+ Branch: cfgperl
+ ! Configure ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 2759] By: jhi on 1999/02/02 10:53:20
+ Log: Update Trig.pm from maint-5.005.
+ Branch: cfgperl
+ ! lib/Math/Trig.pm
+____________________________________________________________________________
+[ 2757] By: jhi on 1999/02/02 10:41:26
+ Log: MPE/iX update (mirror maint-5.005 change #2715)
+ Branch: cfgperl
+ ! hints/mpeix.sh mpeix/relink
+____________________________________________________________________________
+[ 2756] By: jhi on 1999/02/02 10:38:08
+ Log: BeOS update (Mirror maint-5.005 change #2727).
+ Branch: cfgperl
+ + ext/DynaLoader/dl_beos.xs
+ ! Configure MANIFEST Makefile.SH README.beos hints/beos.sh
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 2754] By: gsar on 1999/02/02 08:52:13
+ Log: Todo updates from Andy Dougherty <doughera@lafayette.edu>
Branch: perl
- ! t/io/pipe.t t/lib/io_pipe.t
+ ! Porting/pumpkin.pod Todo Todo-5.005
____________________________________________________________________________
-[ 251] By: mbeattie on 1997/11/14 15:05:57
- Log: Remove stale code from Thread.xs.
+[ 2753] By: gsar on 1999/02/02 08:46:21
+ Log: Todo tweaks
Branch: perl
- ! ext/Thread/Thread.xs
+ ! Todo Todo-5.005
____________________________________________________________________________
-[ 250] By: mbeattie on 1997/11/14 10:12:40
- Log: Add delay to signal handling in t/op/magic.t. (Solaris with pthreads
- doesn't run handlers for self-sent signals until kill has returned.)
- Branch: perl
- ! t/op/magic.t
-____________________________________________________________________________
-[ 249] By: gsar on 1997/11/14 05:14:44
- Log: Fix various details in win32 makefiles and Config.pm setup.
- - ldflags is set for both compilers now
- - extensions list is now correct
- - delete perl95.exe on distclean
- - cf_time now gets updated (once)
- - ccdlflags is set for Borland
- - fix startperl so dprofpp works
- Branch: win32/perl
- ! win32/Makefile win32/config.bc win32/config.vc
- ! win32/config_sh.PL win32/makefile.mk
-____________________________________________________________________________
-[ 248] By: mbeattie on 1997/11/13 18:01:27
- Log: Rewrite thread return code to distinguish between ordinary return
- and die() and make join propagate the die. Add tiny method eval
- which just does "return eval { shift->join; }". Add Thread::Specific
- class for access to thread specific user data along with specific.t.
- Rename Class to classname throughout Thread.xs for consistency.
- Fix pp_specific to pp_threadsv in global.sym. Add support to
- pp_entersub in pp_hot.c to lock stash for static locked methods.
- Branch: perl
- + ext/Thread/Thread/Specific.pm ext/Thread/specific.t
- + lib/fields.pm
- ! MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
- ! ext/Thread/join.t global.sym mg.c pp_hot.c thread.h
-____________________________________________________________________________
-[ 247] By: mbeattie on 1997/11/13 14:13:30
- Log: Change CONTEXT to PERL_CONTEXT throughout source (since the #define
- to avoid the Digital UNIX clash no longer works). Changed the #ifdef
- in pp_sys.c for whether getnet* function get protoyped (since the
- default had a broken prototype for getnetbyaddr).
- Branch: perl
- ! mg.c op.c perl.c perl.h pp_ctl.c pp_hot.c pp_sys.c proto.h
- ! scope.c thread.h
-____________________________________________________________________________
-[ 246] By: nick on 1997/11/13 02:44:40
- Log: Integrate Win32 branch
- Branch: ansiperl
- - configure ext/util/extliblist win32/bin/pl2bat.bat
- - win32/bin/search.bat win32/bin/test.bat win32/bin/webget.bat
- - win32/config.H win32/config.w32 win32/win32io.c
- - win32/win32io.h
- !> (integrate 905 files)
-____________________________________________________________________________
-[ 245] By: nick on 1997/11/13 00:47:54
- Log: Integrate (-ay) win32 branch at its creation to
- establish and ancestor as per perkforce technote #9
- Branch: ansiperl
- +> configure ext/util/extliblist win32/bin/pl2bat.bat
- +> win32/bin/search.bat win32/bin/test.bat win32/bin/webget.bat
- +> win32/config.H win32/config.w32
- !> (integrate 859 files)
-____________________________________________________________________________
-[ 244] By: gsar on 1997/11/12 22:26:39
- Log: More cleanups of win32/win32*.[ch] files. win32/win32iop.h now
- contains the all the declarations and macros for the win32io layer.
- New std-ish functions are exported now. All win32-specific exported
- functions begin with "win32_" consistently. win32 version of
- init_os_extras() is now exported, so embedders can get the in-core
- xsubs.
- Branch: win32/perl
- ! dosish.h win32/makedef.pl win32/win32.c win32/win32.h
- ! win32/win32iop.h win32/win32sck.c
+[ 2752] By: jhi on 1999/02/01 22:15:12
+ Log: Add perlthrtut.pod.
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org
+ Subject: perlthrtut.pod
+ Date: Mon, 01 Feb 1999 10:57:11 -0800
+ Message-Id: <3.0.6.32.19990201105711.02e62540@ous.edu>
+ Branch: maint-5.005/perl
+ + pod/perlthrtut.pod
+ ! MANIFEST pod/Makefile pod/buildtoc pod/perldelta.pod
+ ! pod/roffitall
____________________________________________________________________________
-[ 243] By: gsar on 1997/11/12 07:41:52
- Log: Really delete deleted files.
- Branch: win32/perl
- - win32/win32io.c win32/win32io.h
-____________________________________________________________________________
-[ 242] By: gsar on 1997/11/12 07:40:54
- Log: Egregious IOsubsystem code excised. Phew, what a relief! Two
- files (win32/win32io.[ch]) completely removed, as are all traces
- of them in makefiles and MANIFEST. RunPerl() retains the void* arg
- for later. Various myfoo() things regularized to my_foo(). CPP not
- required anymore to create a perl binary :)
- Branch: win32/perl
- ! MANIFEST win32/Makefile win32/makedef.pl win32/makefile.mk
- ! win32/perllib.c win32/runperl.c win32/win32.c win32/win32.h
- ! win32/win32io.c win32/win32io.h win32/win32iop.h
- ! win32/win32sck.c
+[ 2751] By: gsar on 1999/02/01 07:28:05
+ Log: devnull() support from Jan Dubois <jan.dubois@ibm.net> and others
+ Branch: perl
+ ! lib/File/Spec/OS2.pm lib/File/Spec/Unix.pm
+ ! lib/File/Spec/VMS.pm lib/File/Spec/Win32.pm
____________________________________________________________________________
-[ 241] By: gsar on 1997/11/12 05:31:28
- Log: Fix various win32 code blemishes:
- - s/stolen/win32/g
- - s/(CROAK|WARN)/lc($1)/eg
- - remove deadcode from most places
- Branch: win32/perl
- ! win32/makedef.pl win32/win32.c win32/win32io.c
- ! win32/win32iop.h
+[ 2750] By: gsar on 1999/02/01 07:09:20
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 4 Dec 1998 01:02:03 -0500 (EST)
+ Message-Id: <199812040602.BAA07215@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Debugging REx with lookbehind
+ Branch: perl
+ ! regexec.c
____________________________________________________________________________
-[ 240] By: gsar on 1997/11/12 04:36:29
- Log: Carry over changes in ansiperl branch. Win32 branch is now
- the leading edge.
- Branch: win32/perl
- ! embed.h global.sym perl.c win32/win32thread.c
- ! win32/win32thread.h
-____________________________________________________________________________
-[ 239] By: gsar on 1997/11/12 03:39:57
- Log: Add missing win32_closesocket() and export it (extension writers' complaint).
- Branch: win32/perl
- ! win32/include/sys/socket.h win32/makedef.pl win32/win32sck.c
-____________________________________________________________________________
-[ 238] By: gsar on 1997/11/12 03:25:17
- Log: Clean up win32/win32sck.c (runtime load of Winsock now gone, it can be
- done cleaner, if really needed (perhaps only for efficiency reasons?)).
- Redundant EXTERN_C definitions and related warnings fixed.
- Branch: win32/perl
- ! miniperlmain.c perl.h win32/perllib.c win32/win32io.c
- ! win32/win32iop.h win32/win32sck.c
+[ 2749] By: gsar on 1999/02/01 07:07:59
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 4 Dec 1998 00:05:41 -0500 (EST)
+ Message-Id: <199812040505.AAA16616@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Speed up .*? and half-fix UTF lookbehind
+ Branch: perl
+ ! regexec.c
____________________________________________________________________________
-[ 237] By: nick on 1997/11/12 02:45:15
- Log: Fixup Win32
- - #undef start_env before re-#defining it
- - change pp_specific pp_threadsv in global.sym
- - re-build embed.h
- - avoid HAVE_THREAD_INTERN - we don't and empty struct
- is a pain. If we did have it it would contain cached
- values of things we can only get at _IN_ the thread
- so new_struct_thread is wrong place to call it.
- - add new macro SET_THREAD_SELF - we must (in main thread)
- define in win32thread.h, support in win32thread.c,
- test and call in perl.c
- Branch: ansiperl
- ! embed.h global.sym perl.c thread.h win32/win32thread.c
- ! win32/win32thread.h
-____________________________________________________________________________
-[ 236] By: nick on 1997/11/12 01:54:23
- Log: Integrate mainline after it integrated us.
- Accepted 'theirs' everywhere - so two branches should
- now point to same files again.
- Almost all of these were what was suggested, others were
- whitespace diffs. A few dubious spots which we will now
- go fix.
- Branch: ansiperl
- !> embed.h ext/DB_File/DB_File.xs ext/GDBM_File/GDBM_File.xs
- !> ext/Opcode/Opcode.pm ext/Thread/Thread.xs interp.sym mg.c op.c
- !> opcode.h opcode.pl perl.c perl.h pp.c pp_ctl.c pp_sys.c t/TEST
- !> t/lib/safe2.t t/lib/thread.t t/op/nothread.t thread.h toke.c
- !> util.c
+[ 2748] By: gsar on 1999/02/01 06:47:06
+ Log: From: "Jonathan I. Kamens" <jik@kamens.brookline.ma.us>
+ Date: Thu, 3 Dec 1998 15:10:17 -0500
+ Message-Id: <199812032010.PAA09692@jik.shore.net>
+ Subject: sample checksum code in "perlfunc" man page is wrong
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2747] By: gsar on 1999/02/01 06:35:13
+ Log: typos in Pod/Text.pm
+ From: "Greg Chapman" <glc@well.com>
+ Date: Tue, 1 Dec 1998 10:50:18 -0800
+ Message-Id: <199812011849.KAA08816@smtp.well.com>
+ Subject: Glitch in Pod::Text
+ Branch: perl
+ ! lib/Pod/Text.pm
____________________________________________________________________________
-[ 235] By: gsar on 1997/11/12 01:22:26
- Log: Minor tweaks to add a thread_intern struct that should ultimately
- contain all the win32-specific statics.
- Win32 branch now passes all tests with or w/o USE_THREADS.
- Branch: win32/perl
- ! embed.h perl.c win32/win32thread.c win32/win32thread.h
+[ 2746] By: gsar on 1999/02/01 06:27:35
+ Log: various win32-ish changes merged from maint-5.005
+ Branch: perl
+ ! README.win32 embedvar.h globvar.sym lib/ExtUtils/MM_Unix.pm
+ ! objXSUB.h op.c perl.h perlvars.h pp.c sv.c t/io/fs.t toke.c
+ ! win32/Makefile win32/config.bc win32/config.vc
+ ! win32/config_sh.PL win32/makefile.mk win32/runperl.c
+ ! win32/win32.c
____________________________________________________________________________
-[ 234] By: gsar on 1997/11/11 23:08:54
- Log: Initial (untested) integration of mainline changes.
- Branch: win32/perl
- - configure
- !> (integrate 89 files)
+[ 2745] By: gsar on 1999/02/01 04:51:54
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> INSTALL hints/aix.sh lib/Time/Local.pm pod/perldelta.pod
____________________________________________________________________________
-[ 233] By: mbeattie on 1997/11/11 18:07:30
- Log: Typo in thread.h: ADD_THREAD_INTERN should be HAVE_THREAD_INTERN
+[ 2744] By: gsar on 1999/02/01 04:31:09
+ Log: improved diagnostic on syntax errors at EOL
Branch: perl
- ! thread.h
+ ! toke.c
____________________________________________________________________________
-[ 232] By: mbeattie on 1997/11/11 17:49:12
- Log: t/TEST (reverted to @229 version) should have been included in the
- previous change (231) but my way of recovering it didn't work
- properly. The change 231 comments about successful tests applies
- to this t/TEST (i.e. as of this change).
+[ 2743] By: gsar on 1999/02/01 03:59:13
+ Log: don't attempt connect() to bogus IP addresses
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sun, 31 Jan 1999 21:50:45 CST
+ Message-Id: <19990131215045.A633@pobox.com>
Branch: perl
- ! t/TEST
+ ! t/lib/io_multihomed.t
____________________________________________________________________________
-[ 231] By: mbeattie on 1997/11/11 17:46:59
- Log: Fix up ansiperl integration. Back to passing all expected tests
- with usethreads. Untested with non-threaded perl.
+[ 2742] By: gsar on 1999/02/01 03:08:58
+ Log: update Changes
Branch: perl
- ! embed.h ext/DB_File/DB_File.xs ext/GDBM_File/GDBM_File.xs
- ! perl.c perl.h pp.c t/lib/thread.t t/op/nothread.t util.c
+ ! Changes pod/perldelta.pod
+____________________________________________________________________________
+[ 2740] By: gsar on 1999/02/01 02:43:07
+ Log: CAPI inheritance tweak and doc
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2739] By: jhi on 1999/01/31 18:31:54
+ Log: Undo changes #2730 and #2731 and replace them
+ with an extensively tested patch from
+ Anton Berezin <tobez@plab.ku.dk> (via private email).
+ Branch: maint-5.005/perl
+ ! Makefile.SH hints/freebsd.sh
+____________________________________________________________________________
+[ 2738] By: gsar on 1999/01/31 05:04:32
+ Log: fix bogus CAPI inheritance from change#2541
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2731] By: jhi on 1999/01/29 14:33:12
+ Log: FreeBSD version numbers can be like "2.2.8-release".
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2730] By: jhi on 1999/01/29 12:40:38
+ Log: FreeBSD hints iteration (hopefully convergent).
+ usethreads: require at least FreeBSD 2.2.8.
+ signal type: mirror change #2429 in cfgperl.
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2727] By: gbarr on 1999/01/29 04:09:57
+ Log: From: Tom Spindler <dogcow@isi.net>
+ Date: Thu, 28 Jan 1999 17:15:11 -0800
+ Message-ID: <19990128171510.A11778@isi.net>
+ Subject: [PATCH] BeOS dynamic loading support for perl5.005_03_MT4
+ Branch: maint-5.005/perl
+ + ext/DynaLoader/dl_beos.xs
+ ! Configure MANIFEST Makefile.SH README.beos hints/beos.sh
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 2726] By: gbarr on 1999/01/29 03:30:51
+ Log: Remove use of File::Slurp in t/lib/textfill.t
+ Branch: maint-5.005/perl
+ ! t/lib/textfill.t
+____________________________________________________________________________
+[ 2725] By: gbarr on 1999/01/29 03:11:41
+ Log: From: Gurusamy Sarathy <gsar@ActiveState.com>
+ Date: Wed, 27 Jan 1999 23:14:33 -0800
+ Message-Id: <199901280714.XAA10176@activestate.com>
+ Subject: Re: NOT OK: "@INC contains: ." after make install - MAINT_TRIAL_4 - 5.005_03 maintenance trial 4 MSWin32-x86-object
+ Branch: maint-5.005/perl
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 230] By: mbeattie on 1997/11/11 16:36:22
- Log: Initial integration of ansi branch into mainline (untested).
+[ 2720] By: gsar on 1999/01/27 21:54:42
+ Log: missing space while munging CCFLAGS for PERL_CAPI
Branch: perl
- +> t/lib/thread.t t/op/nothread.t thread.sym
- - configure
- !> (integrate 84 files)
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 2718] By: jhi on 1999/01/27 19:46:04
+ Log: io/fs.t fails test #18 (sense of tests appears to have been
+ changed incompletely; this patch just skips the test attached,
+ a la test #17 preceding it).
+
+ From: "G. Del Merritt" <del@intranetics.com>
+ To: perlbug@perl.com
+ Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included)
+ Date: Tue, 26 Jan 1999 12:09:09 -0700
+ Message-Id: <199901261909.MAA25525@jhereg.perl.com>
+ Branch: maint-5.005/perl
+ ! t/io/fs.t
+____________________________________________________________________________
+[ 2717] By: jhi on 1999/01/27 19:44:46
+ Log: Miniperl fails to build (pp_sys.c was changed and iperlsys.h wasn't)
+
+ From: "G. Del Merritt" <del@intranetics.com>
+ To: perlbug@perl.com
+ Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included)
+ Date: Tue, 26 Jan 1999 12:09:09 -0700
+ Message-Id: <199901261909.MAA25525@jhereg.perl.com>
+ Branch: maint-5.005/perl
+ ! iperlsys.h
+____________________________________________________________________________
+[ 2715] By: jhi on 1999/01/27 19:34:28
+ Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
+ To: perl5-porters@perl.org
+ Subject: [PATCH perl5.005_03-MAINT_TRIAL_4] MPE port tweaks
+ Date: Tue, 26 Jan 1999 16:32:18 -0800 (PST)
+ Message-Id: <199901270032.QAA13395@spock.dis.cccd.edu>
+ Branch: maint-5.005/perl
+ ! hints/mpeix.sh mpeix/relink
+____________________________________________________________________________
+[ 2710] By: jhi on 1999/01/27 19:22:23
+ Log: Errno fixes:
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 12:27:15 -0500
+ Message-Id: <199901271727.MAA233455@web.zk3.dec.com>
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 13:31:16 -0500
+ Message-Id: <199901271831.NAA241001@web.zk3.dec.com>
+ Branch: maint-5.005/perl
+ ! Configure ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 2709] By: jhi on 1999/01/27 19:17:35
+ Log: Fix Configure installusrbinperl:
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: jhi@iki.fi
+ cc: perl5-porters@perl.org
+ Subject: Re: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 13:03:35 -0500
+ Message-Id: <199901271803.NAA238257@web.zk3.dec.com>
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2707] By: gbarr on 1999/01/26 02:06:17
+ Log: Add redef IO::Handle::* for setv?buf()
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.pm
+____________________________________________________________________________
+[ 2705] By: jhi on 1999/01/24 15:14:30
+ Log: Mention year-1900 and month 0..11.
+ Branch: cfgperl
+ ! lib/Time/Local.pm
+____________________________________________________________________________
+[ 2704] By: jhi on 1999/01/24 15:13:36
+ Log: Document Configure -Uinstallusrbinperl.
+ Branch: cfgperl
+ ! INSTALL pod/perldelta.pod
____________________________________________________________________________
-[ 229] By: mbeattie on 1997/11/11 15:20:43
- Log: Change name of OP_SPECIFIC to OP_THREADSV. Fixed perl_get_sv when
- getting per-thread magicals. Fixed thr->errsv initialisation.
+[ 2698] By: jhi on 1999/01/24 12:46:00
+ Log: Use only xlc_r for usethreads.
+ Branch: cfgperl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 2695] By: gsar on 1999/01/24 07:09:05
+ Log: integrate cfgperl changes into mainline
Branch: perl
- ! ext/Opcode/Opcode.pm op.c opcode.h opcode.pl perl.c pp.c
- ! t/lib/safe2.t toke.c
+ +> lib/Exporter/Heavy.pm
+ !> (integrate 65 files)
____________________________________________________________________________
-[ 228] By: mbeattie on 1997/11/11 12:48:26
- Log: Fix up $@ (ERRSV now refers to GvSV(errgv) for non-threaded perl and
- thr->errsv for threaded perl). Fix pp_tie and pp_dbmopen to use
- GvCV(gv) instead of gv so AUTOLOAD stuff works. All tests now pass
- again for non-threaded perl. Enhanced perl_get_sv to return
- per-thread magicals where necessary for threaded perl.
+[ 2694] By: gsar on 1999/01/24 01:28:49
+ Log: better notes on 'make' on win32
Branch: perl
- ! embed.h ext/Thread/Thread.xs interp.sym mg.c op.c perl.c
- ! perl.h pp_ctl.c pp_sys.c thread.h toke.c util.c
+ ! README.win32
+____________________________________________________________________________
+[ 2683] By: jhi on 1999/01/22 15:41:00
+ Log: More de-cut-and-pastos.
+ Branch: cfgperl
+ ! hints/irix_6.sh hints/os2.sh
+____________________________________________________________________________
+[ 2682] By: jhi on 1999/01/22 15:30:51
+ Log: usethreads.cbu cut-and-pasto.
+ Branch: cfgperl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 2681] By: jhi on 1999/01/22 14:54:55
+ Log: Better (I hope) LANGUAGE documentation.
+ Branch: cfgperl
+ ! pod/perllocale.pod
+____________________________________________________________________________
+[ 2680] By: jhi on 1999/01/22 09:20:29
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_03MT3]VMS configure tweak
+ Date: Wed, 20 Jan 1999 12:05:18 -0800
+ Message-Id: <3.0.6.32.19990120120518.00a98470@ous.edu>
+ Branch: cfgperl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 2679] By: jhi on 1999/01/22 09:13:18
+ Log: nosuid getmntent() branch.
+ Branch: cfgperl
+ ! perl.c perl.h
+____________________________________________________________________________
+[ 2678] By: jhi on 1999/01/22 08:54:19
+ Log: nosuid patch continued: *BSD needs <sys/param.h>.
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 2676] By: gbarr on 1999/01/22 01:54:02
+ Log: Fixup FindBin to use File::Spec
+
+ Message-Id: <19990120185157.D24479@west-tip.transeda.com>
+ Date: Wed, 20 Jan 1999 18:51:57 +0000
+ From: Paul Johnson <pjcj@transeda.com>
+ Subject: Re: [PATCH] 5005_54 Make FindBin work with UNC paths
+ Branch: maint-5.005/perl
+ ! lib/FindBin.pm
____________________________________________________________________________
-[ 227] By: mbeattie on 1997/11/11 11:00:02
- Log: hashlock bug.
+[ 2671] By: gbarr on 1999/01/22 00:40:13
+ Log: Fix win32 for Borland compiler and spaces in paths
- Jobs fixed ...
+ From: Gurusamy Sarathy <gsar@activestate.com>
+ Date: Mon, 18 Jan 1999 20:33:17 -0800
+ Message-Id: <199901190433.UAA03656@activestate.com>
+ Subject: [PATCH] 5.005_03-trial3 win32 issues
+ Branch: maint-5.005/perl
+ ! README.win32 win32/Makefile win32/config_sh.PL
+ ! win32/makefile.mk win32/runperl.c
+____________________________________________________________________________
+[ 2670] By: jhi on 1999/01/21 16:12:38
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ To: perl5-porters@perl.org
+ Subject: Re: [PATCH 5.005_54] Evalled substitution parsing
+ Date: Thu, 21 Jan 1999 12:08:01 +0000
+ Message-Id: <199901211208.MAA01228@crypt.compulink.co.uk>
+ Branch: cfgperl
+ ! pod/perldiag.pod t/op/subst.t toke.c
+____________________________________________________________________________
+[ 2669] By: jhi on 1999/01/21 16:11:46
+ Log: To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54] hints/freebsd.sh - reflect the birth of version 4.0
+ From: Anton Berezin <tobez@plab.ku.dk>
+ Date: 21 Jan 1999 17:07:28 +0100
+ Message-ID: <86emood2yn.fsf@lion.plab.ku.dk>
+ Branch: cfgperl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2668] By: jhi on 1999/01/21 15:38:34
+ Log: Add Daniel Grisinger <dgris@dimensional.com>.
+ Branch: cfgperl
+ ! AUTHORS MAINTAIN
+____________________________________________________________________________
+[ 2667] By: jhi on 1999/01/21 15:32:28
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_53] Lean Exporter.pm
+ Date: Thu, 21 Jan 1999 03:25:23 -0500
+ Message-ID: <19990121032523.A25704@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ + lib/Exporter/Heavy.pm
+ ! MANIFEST lib/Exporter.pm
+____________________________________________________________________________
+[ 2666] By: jhi on 1999/01/21 15:24:10
+ Log: From: "W. Phillip Moore" <wpm@ms.com>
+ To: Graham Barr <gbarr@ti.com>, perlbug@perl.org
+ Subject: Re: [PATCH] File::Path 1.04 bug (all perl5 core versions)
+ Date: Tue, 19 Jan 1999 11:39:11 -0500 (EST)
+ Message-ID: <13988.46383.298992.97303@zappa>
+ Branch: cfgperl
+ ! lib/File/Path.pm
+____________________________________________________________________________
+[ 2665] By: jhi on 1999/01/21 15:20:48
+ Log: CPAN update (CPAN-1.44_54) from Andreas and
+ jumbo doc patch from Abigail.
- hashlock fixed on 1997/11/11 by mbeattie@localhost
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL 3 lib/AutoLoader.pm] Typos
+ Date: Tue, 19 Jan 1999 19:14:10 -0500 (EST)
+ Message-ID: <19990120001410.19645.qmail@alexandra.wayne.fnx.com>
- Subject: [perl5.004_53; patch] Another hash-locking fix
- Date: 23 Oct 1997 14:13:55 -0400
- From: Owen Taylor <owt1@cornell.edu>
- Branch: bugs
- + hashlock
-____________________________________________________________________________
-[ 226] By: gsar on 1997/11/11 02:11:23
- Log: Slightly more refined lock() keyword recognition (using %INC).
- Branch: win32/perl
- ! toke.c
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/CGI.pm] Typos
+ Date: Tue, 19 Jan 1999 19:32:42 -0500 (EST)
+ Message-ID: <19990120003242.19938.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/CPAN.pm] Typos
+ Date: Tue, 19 Jan 1999 19:40:41 -0500 (EST)
+ Message-ID: <19990120004041.20052.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Carp.pm] Typo
+ Date: Tue, 19 Jan 1999 19:43:12 -0500 (EST)
+ Message-ID: <19990120004312.20152.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Cwd.pm] Typo
+ Date: Tue, 19 Jan 1999 19:44:29 -0500 (EST)
+ Message-ID: <19990120004429.20190.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Safe.pm] Typo
+ Date: Tue, 19 Jan 1999 19:52:41 -0500 (EST)
+ Message-ID: <19990120005241.20693.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/SelfLoader.pm] Typos
+ Date: Tue, 19 Jan 1999 19:55:25 -0500 (EST)
+ Message-ID: <19990120005525.20788.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Symbol.pm] Typo
+ Date: Tue, 19 Jan 1999 19:58:21 -0500 (EST)
+ Message-ID: <19990120005821.20926.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Test.pm] Typo
+ Date: Tue, 19 Jan 1999 20:00:02 -0500 (EST)
+ Message-ID: <19990120010002.20973.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/ops.pm] Typo
+ Date: Tue, 19 Jan 1999 20:39:09 -0500 (EST)
+ Message-ID: <19990120013909.23085.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/diagnostics.pm] Typos (ignore previous patch for this file...)
+ Date: Tue, 19 Jan 1999 20:38:23 -0500 (EST)
+ Message-ID: <19990120013823.23015.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/overload.pm] Typos
+ Date: Tue, 19 Jan 1999 20:58:16 -0500 (EST)
+ Message-ID: <19990120015817.24306.qmail@alexandra.wayne.fnx.com>
+
+ From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_03 TRIAL3 lib/re.pm] Typos
+ Date: Tue, 19 Jan 1999 21:03:26 -0500 (EST)
+ Message-ID: <19990120020326.24373.qmail@alexandra.wayne.fnx.com>
+ Branch: cfgperl
+ ! ext/Opcode/Safe.pm ext/Opcode/ops.pm lib/AutoLoader.pm
+ ! lib/CGI.pm lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
+ ! lib/Carp.pm lib/Cwd.pm lib/SelfLoader.pm lib/Symbol.pm
+ ! lib/Test.pm lib/diagnostics.pm lib/fields.pm lib/overload.pm
____________________________________________________________________________
-[ 225] By: gsar on 1997/11/11 00:26:09
- Log: "weak" lock keyword (hardcoded initial implementation) now works.
- if not defined(&Thread::join) and defined(&__PACKAGE__::lock), 'lock'
- is recognized as a sub, a regular keyword otherwise. Could be
- generalized by storing a flag for every op in OP struct, and turning
- the flag off when Thread.xs loads.
- Branch: win32/perl
- ! toke.c
+[ 2664] By: jhi on 1999/01/21 14:47:43
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_*] OS2::PrfDB was exploiting a bug in U32 XSUBs
+ Date: Thu, 21 Jan 1999 03:58:29 -0500
+ Message-ID: <19990121035829.A25822@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! os2/Changes os2/OS2/PrfDB/PrfDB.xs
____________________________________________________________________________
-[ 224] By: gsar on 1997/11/10 22:59:55
- Log: Merge a patch in preparation for "weak keywords":
- From: Gurusamy Sarathy <gsar@engin.umich.edu>
- Message-Id: <199710080618.CAA23899@aatma.engin.umich.edu>
- Subject: [PATCH] global overrides for keywords
- Date: Wed, 08 Oct 1997 02:18:23 -0400
- Branch: win32/perl
- ! embed.h interp.sym perl.c perl.h toke.c
-____________________________________________________________________________
-[ 223] By: gsar on 1997/11/10 22:41:31
- Log: Remove runlevel. It was used to count how many runops() calls
- we were in the process of executing, and longjmp() to the topmost
- one (if not already there). We use a null top_env->je_prev
- to distinguish that now.
- Branch: win32/perl
- ! embed.h interp.sym perl.h pp_ctl.c run.c thread.h util.c
-____________________________________________________________________________
-[ 222] By: gsar on 1997/11/10 04:47:48
- Log: Win32 branch now contains all non-ansification changes in ansiperl branch.
- USE_THREADS case builds and passes all tests using both compilers.
- Additional tweaks:
- - fixup win32/makedef.pl to skip more symbols for non-thread build.
- - sync win32/Makefile with win32/makefile.mk
- >>>Non-thread build fails a lot of tests.<<<
- Branch: win32/perl
- + thread.sym
- ! MANIFEST ext/Thread/Thread.xs perl.c perl.h pp_sys.c sv.c
- ! util.c win32/Makefile win32/config.bc win32/config_H.bc
- ! win32/makedef.pl win32/makefile.mk
-____________________________________________________________________________
-[ 221] By: gsar on 1997/11/10 00:57:53
- Log: Initial (untested) merge of all non-ansi changes on ansiperl branch
- into win32 branch.
- Branch: win32/perl
- + t/lib/thread.t t/op/nothread.t
- ! MANIFEST embed.h ext/Opcode/Opcode.pm global.sym interp.sym
- ! perl.c proto.h sv.h t/lib/english.t t/op/misc.t thread.h
- ! util.c win32/Makefile win32/config.bc win32/config.vc
- ! win32/config_H.bc win32/config_H.vc win32/makedef.pl
- ! win32/makefile.mk win32/win32.c win32/win32.h win32/win32io.c
- ! win32/win32io.h win32/win32iop.h win32/win32sck.c
- ! win32/win32thread.c win32/win32thread.h
+[ 2663] By: jhi on 1999/01/21 14:43:58
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_*] Errno.pm suffers from \\ too
+ Date: Thu, 21 Jan 1999 02:46:34 -0500
+ Message-ID: <19990121024634.A25600@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! ext/Errno/Errno_pm.PL
____________________________________________________________________________
-[ 220] By: gsar on 1997/11/09 22:44:41
- Log: Integrate latest mainline into win32 branch.
- Branch: win32/perl
- +> win32/win32thread.c win32/win32thread.h
- !> (integrate 39 files)
+[ 2662] By: jhi on 1999/01/21 14:42:42
+ Log: From: Daniel Grisinger <dgris@moiraine.dimensional.com>
+ To: Francois Desarmenien <desar@club-internet.fr>
+ Cc: Gurusamy Sarathy <gsar@activestate.com>,
+ Mailing list Perl5 <perl5-porters@perl.org>, bugmongers@perl.org
+ Subject: [PATCH] patching.pod, misc fixes (was Re: Which ? What ? Why ? When ?)
+ Date: 21 Jan 1999 00:17:35 -0700
+ Message-ID: <m31zkpqels.fsf_-_@moiraine.dimensional.com>
+ Branch: cfgperl
+ ! Porting/patching.pod
____________________________________________________________________________
-[ 219] By: nick on 1997/11/09 21:46:06
- Log: Conditionalize english.t,
- Enhance times() for NT,
- (Failed) attempt to implement alarm(),
- Fixed config.h dependancy in makefile.mk
- Branch: ansiperl
- ! t/lib/english.t win32/config.bc win32/config_H.bc
- ! win32/makefile.mk win32/win32.c
+[ 2661] By: jhi on 1999/01/21 14:41:13
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.00*] makedepend
+ Date: Thu, 21 Jan 1999 02:08:27 -0500
+ Message-ID: <19990121020827.A25509@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! makedepend.SH
____________________________________________________________________________
-[ 218] By: nick on 1997/11/09 15:38:00
- Log: Dick Hardt's patch for build on Alpha
- Branch: ansiperl
- ! win32/Makefile
+[ 2660] By: jhi on 1999/01/21 14:36:45
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_53] Pipes and 2>&1 on OS/2
+ Date: Tue, 19 Jan 1999 20:06:45 -0500
+ Message-ID: <19990119200645.A21154@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! os2/Changes os2/os2.c
____________________________________________________________________________
-[ 217] By: nick on 1997/11/09 03:31:20
- Log: MakeMaker not in vofig noise fix for dmake
- Branch: ansiperl
- ! win32/config.bc win32/makefile.mk
+[ 2657] By: jhi on 1999/01/21 11:40:35
+ Log: From: "Vishal Bhatia" <vishalb@hotmail.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54]pp_mapstart & pp_grepstart return val (CC.pm)
+ Date: Mon, 18 Jan 1999 01:32:31 PST
+ Message-ID: <19990118093231.18443.qmail@hotmail.com>
+ Branch: cfgperl
+ ! ext/B/B/CC.pm
____________________________________________________________________________
-[ 216] By: nick on 1997/11/09 03:15:06
- Log: Fix 'anydbm.t' - if the gv is passed 1st call to inherited
- TIEHASH works, but 2nd call (after db is closed, attempt
- to reopen) tries to AUTOLOAD TIEHASH rather than using
- cached value.
- Branch: ansiperl
+[ 2656] By: jhi on 1999/01/21 11:35:34
+ Log: From: Achim Bohnet <ach@mpe.mpg.de>
+ Subject: [PATCH] Not OK: perl 5.00503 +MAINT_TRIAL_3 on alpha-dec_osf 4.0 (UNINSTALLED)
+ Date: Wed, 20 Jan 1999 20:25:53 +0100
+ Message-Id: <199901201925.UAA16940@o06.xray.mpe.mpg.de>
+ Branch: cfgperl
+ ! pp.c
+____________________________________________________________________________
+[ 2655] By: jhi on 1999/01/21 10:46:01
+ Log: Handle NIS (and NetInfo) more robustly.
+ Branch: cfgperl
+ ! t/op/grent.t t/op/pwent.t
+____________________________________________________________________________
+[ 2654] By: jhi on 1999/01/21 10:17:20
+ Log: Two-argument eaccess() of SCO.
+ Branch: cfgperl
! pp_sys.c
____________________________________________________________________________
-[ 215] By: nick on 1997/11/08 16:41:24
- Log: Cleanup MakeMaker 'not in config' noise
- Branch: ansiperl
- ! win32/Makefile win32/config.vc
+[ 2653] By: jhi on 1999/01/21 08:53:14
+ Log: -DNO_NOSUID_CHECK for those platforms which have no way
+ of checking for nosuid but still want suidperl.
+ Branch: cfgperl
+ ! perl.c
____________________________________________________________________________
-[ 214] By: nick on 1997/11/08 15:07:24
- Log: Remove 'configure' leaving configure.gnu and Configure
- Win32 ignores case and keeps trying to update
- repository copy of 'configure' or 'Configure' with
- the other.
- Branch: ansiperl
- - configure
- ! MANIFEST
+[ 2652] By: jhi on 1999/01/21 08:22:50
+ Log: The LANGUAGE mirrors LC_ALL usage.
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 213] By: nick on 1997/11/08 15:03:39
- Log: Get threads working again on Win32
- Root cause of fail was init_thread_intern() in
- new_struct_thread() (which is called in parent thread)
- clobbering dTHR of parent thread.
- It is doubtfull if setting 'self' in new_struct_thread()
- is 'right' but left in for now.
- Branch: ansiperl
- ! ext/Thread/Thread.xs perl.c thread.h util.c win32/Makefile
- ! win32/win32thread.c win32/win32thread.h
+[ 2651] By: jhi on 1999/01/20 22:01:21
+ Log: I_MNTENT was missing.
+ Branch: cfgperl
+ ! Configure config_h.SH
____________________________________________________________________________
-[ 212] By: nick on 1997/11/08 00:34:03
- Log: Add :base_thread to :default in Opcode.pm
- This allows lib/safe.t to pass when threaded.
- It is unclear if 'lock' should be safe as it allows
- denial of service attack, but could not figure out
- how to add just 'specific' (sic) to :default
- without triggering 'already tagged' warning noise.
- Branch: ansiperl
- ! ext/Opcode/Opcode.pm win32/makefile.mk
+[ 2650] By: jhi on 1999/01/19 13:42:03
+ Log: NetBSD update, based on patches from the NetBSD packages system.
+ Branch: cfgperl
+ ! Makefile.SH hints/netbsd.sh makedepend.SH unixish.h
+____________________________________________________________________________
+[ 2649] By: jhi on 1999/01/19 12:44:02
+ Log: Jumbo Configure update.
+ * -Uinstallusrbinperl: disable /usr/bin/perl installation
+ by installperl
+ * usethreads.cbu
+ * use64bits.cbu
+ * "nosuid"
+ Branch: cfgperl
+ ! Configure config_h.SH hints/aix.sh hints/dec_osf.sh
+ ! hints/dos_djgpp.sh hints/freebsd.sh hints/hpux.sh
+ ! hints/irix_4.sh hints/irix_5.sh hints/irix_6.sh
+ ! hints/irix_6_0.sh hints/irix_6_1.sh hints/linux.sh
+ ! hints/os2.sh hints/solaris_2.sh hints/vmesa.sh perl.c perl.h
+ ! pod/perldiag.pod
____________________________________________________________________________
-[ 211] By: nick on 1997/11/07 23:59:31
- Log: Merge changes as of 18:00 CST
- Branch: ansiperl
- !> op.c pp.c pp_sys.c thread.h util.c
-____________________________________________________________________________
-[ 210] By: nick on 1997/11/07 23:52:35
- Log: Reverse integrate Malcolm's chanes into local
- repository, then import result back into my view
- of Malcolm's repository.
- Builds and passes (most) tests with GNU C++/Solaris
- and Borland C++, Win32.
- Branch: ansiperl
- ! doop.c embed.h ext/Thread/Thread.xs global.sym gv.c hv.c
- ! interp.sym mg.c op.c opcode.h opcode.pl patchlevel.h perl.c
- ! perl.h pp.c pp_ctl.c pp_sys.c proto.h sv.c sv.h taint.c
- ! thread.h toke.c util.c win32/makefile.mk
-____________________________________________________________________________
-[ 209] By: mbeattie on 1997/11/07 18:12:36
- Log: Change pp_tie and pp_dbmopen to use perl_call_sv instead of a
- DIY pp_entersub (in preparation for AUTOLOAD change). dbmopen
- not tested. ofslen now maps to thr->Tofslen in thread.h. Added
- missing #ifdef USE_THREADS around some DEBU_L statements in die().
- Building without USE_THREADS fails quite a lot of tests. It looks
- as though the move to per-thread magicals must be missing some
- #ifdef USE_THREADS.
- Branch: perl
- ! op.c pp.c pp_sys.c thread.h util.c
-____________________________________________________________________________
-[ 208] By: nick on 1997/11/07 01:37:28
- Log: Raw integrate of latest perl
- Branch: ansiperl
- ! t/TEST
- !> README.threads Todo.5.005 embed.h ext/Opcode/Opcode.pm
- !> ext/Thread/Thread.xs global.sym gv.c interp.sym op.c op.h
- !> perl.c perl.h pp.c pp_ctl.c pp_hot.c proto.h scope.h sv.h
- !> thread.h toke.c util.c
+[ 2648] By: jhi on 1999/01/19 09:16:44
+ Log: Mention /usr/share/locale.
+ Branch: cfgperl
+ ! pod/perllocale.pod
+____________________________________________________________________________
+[ 2647] By: jhi on 1999/01/19 09:11:11
+ Log: SHMLBA strikes back in NetBSD/sparc.
+
+ From: Dave Nelson <David.Nelson@bellcow.com>
+ To: jhi@iki.fi
+ Subject: perl5.005_02 + IPC::SysV + NetBSD/Sparc
+ Date: Mon, 18 Jan 1999 22:07:56 -0600
+ Message-Id: <199901190407.WAA02543@longhorn.bellcow.com>
+ Branch: cfgperl
+ ! ext/IPC/SysV/SysV.xs
+____________________________________________________________________________
+[ 2646] By: jhi on 1999/01/19 08:58:17
+ Log: Show LANGUAGE env var when needed. (Augment change #2645).
+ Branch: cfgperl
+ ! util.c utils/perlbug.PL
+____________________________________________________________________________
+[ 2645] By: jhi on 1999/01/19 08:52:15
+ Log: Document the GNU LANGUAGE env var.
+ Branch: cfgperl
+ ! pod/perllocale.pod
+____________________________________________________________________________
+[ 2644] By: jhi on 1999/01/19 08:42:25
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_53] Fixing \G bug by Francois Desarmenien
+ Date: Mon, 18 Jan 1999 20:57:02 -0500
+ Message-ID: <19990118205702.A18379@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! pp_hot.c t/op/pat.t
+____________________________________________________________________________
+[ 2643] By: jhi on 1999/01/18 11:23:41
+ Log: Add various cruft to "clean" target. (Time for t/Makefile?)
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2642] By: jhi on 1999/01/18 11:03:38
+ Log: GNU libc locale system has LANGUAGE env var that partly
+ overrides even LC_ALL.
+ Branch: cfgperl
+ ! t/lib/safe2.t t/op/groups.t t/op/mkdir.t
+____________________________________________________________________________
+[ 2641] By: jhi on 1999/01/18 10:55:04
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> ext/B/defsubs.h.PL
+ ! t/op/groups.t
+ !> (integrate 38 files)
____________________________________________________________________________
-[ 207] By: mbeattie on 1997/11/06 14:58:00
- Log: Update README.threads and Todo.5.005.
+[ 2640] By: gsar on 1999/01/18 10:06:29
+ Log: a few random cleanups
Branch: perl
- ! README.threads Todo.5.005
+ ! ext/B/Makefile.PL lib/Test/Harness.pm t/pragma/warn/doio
____________________________________________________________________________
-[ 206] By: mbeattie on 1997/11/06 14:37:37
- Log: Remove #ifdef DEPRECATED stuff: newXSUB, pp_entersubr, FREE_TMPS().
+[ 2639] By: gsar on 1999/01/18 05:56:21
+ Log: From: "Vishal Bhatia" <vishalb@hotmail.com>
+ Date: Sun, 17 Jan 1999 16:41:10 PST
+ Message-Id: <19990118004111.29667.qmail@hotmail.com>
+ Subject: [PATCH 5.005_54]Duplicate saved ops (CC.pm)
Branch: perl
- ! op.c pp_ctl.c proto.h scope.h
+ ! ext/B/B/C.pm
____________________________________________________________________________
-[ 205] By: mbeattie on 1997/11/06 14:31:38
- Log: Per-thread magicals now stored in their own thr->magicals and keyed
- more directly. cvcache and oursv become ordinary struct thread
- fields instead of #defined thr->Tfoo ones. SvREFCNT_inc now checks
- for 0 again. Main thread initialisation done by new function
- init_main_thread instead of (now fixed) new_struct_thread.
-
- Jobs fixed ...
-
- jmpenv fixed on 1997/11/06 by mbeattie@localhost
-
- Subject: [perl5.004_53; patch] eval's and threads
- Date: 23 Oct 1997 23:59:19 -0400
- From: Owen Taylor <owt1@cornell.edu>
- Branch: bugs
- + jmpenv
+[ 2638] By: gsar on 1999/01/18 05:41:21
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Mon, 18 Jan 1999 00:37:41 +0100
+ Message-Id: <36a271cd.2105507@smtp1.ibm.net>
+ Subject: [PATCH 5.005_54] fix bugs in do_sv_dump() from Devel::Peek integration
Branch: perl
- ! embed.h ext/Thread/Thread.xs global.sym gv.c op.c perl.c
- ! pp_ctl.c pp_hot.c proto.h sv.h thread.h toke.c util.c
+ ! dump.c
____________________________________________________________________________
-[ 204] By: mbeattie on 1997/11/05 17:18:18
- Log: Per-thread magicals mostly working (and localisable). Now getting
- intermittent occasional "Use of uninitialized value" warnings
- which may be due to some op flag black magic I've broken.
+[ 2633] By: gsar on 1999/01/17 13:39:59
+ Log: bogus assert()
Branch: perl
- ! embed.h ext/Opcode/Opcode.pm ext/Thread/Thread.xs gv.c
- ! interp.sym op.c op.h perl.c perl.h pp.c thread.h toke.c util.c
+ ! pp.c t/op/groups.t
____________________________________________________________________________
-[ 203] By: nick on 1997/11/05 01:04:10
- Log: Builds C++ Borland, MSVC++ (Win32) and GCC++ (Solaris)
- Branch: ansiperl
- ! XSUB.h doio.c doop.c embed.h ext/SDBM_File/sdbm/sdbm.h
- ! ext/Thread/Thread.xs global.sym gv.c hv.c interp.sym mg.c
- ! miniperlmain.c op.c op.h opcode.h opcode.pl patchlevel.h
- ! perl.c perl.h pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h
- ! sv.c sv.h taint.c thread.h toke.c util.c win32/Makefile
- ! win32/config.vc win32/config_H.vc win32/makedef.pl
- ! win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
- ! win32/win32io.c win32/win32io.h win32/win32iop.h
- ! win32/win32sck.c win32/win32thread.h
+[ 2632] By: gsar on 1999/01/17 13:22:04
+ Log: various tweaks for clean build and test on win32
+ Branch: perl
+ ! embed.h ext/B/Makefile.PL global.sym lib/FindBin.pm objXSUB.h
+ ! op.c t/pragma/warn/doio
____________________________________________________________________________
-[ 202] By: nick on 1997/11/05 00:50:27
- Log: Compile(d) at least once with threads on win32
- but did not work
- Branch: ansiperl
- ! embed.h perl.c thread.h
+[ 2631] By: gsar on 1999/01/17 12:28:06
+ Log: undo change#2336, and add clarification about subversive
+ CPAN distributions from Andreas Koenig
+ Branch: perl
+ ! Porting/pumpkin.pod lib/CPAN.pm
____________________________________________________________________________
-[ 201] By: nick on 1997/11/05 00:32:13
- Log: Trivial integrate
- Branch: ansiperl
- !> patchlevel.h
+[ 2630] By: gsar on 1999/01/17 12:04:06
+ Log: fix silent taint failures under -U
+ Branch: perl
+ ! doio.c
____________________________________________________________________________
-[ 200] By: mbeattie on 1997/11/04 12:06:09
- Log: Up patchlevel to 5.004_54 (I missed _53 for the last release).
+[ 2629] By: gsar on 1999/01/17 12:00:23
+ Log: sanity check piped opens (tweaked version of patch suggested
+ by Mark-Jason Dominus)
Branch: perl
- ! patchlevel.h
+ ! doio.c pod/perldelta.pod pod/perldiag.pod t/io/pipe.t
+ ! t/op/taint.t t/pragma/warn/doio
____________________________________________________________________________
-[ 199] By: nick on 1997/11/01 00:18:52
- Log: Integrate mainline @ 18:15 CST 31 Oct 1997
- Branch: ansiperl
- !> doop.c embed.h ext/Thread/Thread.xs global.sym gv.c hv.c
- !> interp.sym mg.c op.c opcode.h opcode.pl perl.c perl.h pp.c
- !> pp_ctl.c pp_sys.c proto.h sv.c sv.h taint.c thread.h toke.c
- !> util.c
+[ 2628] By: gsar on 1999/01/17 11:26:21
+ Log: regen headers
+ Branch: perl
+ ! embed.h embedvar.h objXSUB.h
____________________________________________________________________________
-[ 198] By: nick on 1997/11/01 00:08:33
- Log: win32thread.* not in MANIFEST which has muddled moving
- back and forth between depots.
- Branch: ansiperl
- ! MANIFEST win32/win32thread.c win32/win32thread.h
+[ 2627] By: gsar on 1999/01/17 11:23:37
+ Log: PERL_OBJECTness for change#2595
+ Branch: perl
+ ! embed.pl op.c pod/perlport.pod proto.h
____________________________________________________________________________
-[ 197] By: nick on 1997/11/01 00:02:49
- Log: Test changes
- Branch: ansiperl
- + t/lib/thread.t t/op/nothread.t thread.sym
- ! MANIFEST
+[ 2626] By: gsar on 1999/01/17 09:47:07
+ Log: PERL_OBJECT tweaks for change#2426
+ Branch: perl
+ ! embed.pl proto.h regcomp.c
____________________________________________________________________________
-[ 196] By: nick on 1997/10/31 23:54:01
- Log: Further ANSI changes now builds and passes (most) tests
- with gcc -x c++.
- Branch: ansiperl
- ! INTERN.h embed.h ext/DynaLoader/dl_dlopen.xs
- ! ext/Fcntl/Fcntl.xs ext/GDBM_File/GDBM_File.xs ext/IO/IO.xs
- ! ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs
- ! ext/SDBM_File/sdbm/hash.c ext/SDBM_File/sdbm/pair.c
- ! ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
- ! ext/SDBM_File/sdbm/util.c ext/Socket/Socket.xs
- ! ext/Thread/Thread.xs ext/attrs/attrs.xs global.sym perl.h
- ! perly.c sv.c t/lib/english.t t/op/misc.t thread.h util.c
- ! win32/Makefile win32/makedef.pl win32/makefile.mk x2p/a2p.c
- ! x2p/a2p.h x2p/a2py.c x2p/hash.c x2p/str.c x2p/util.c
- ! x2p/walk.c
-____________________________________________________________________________
-[ 195] By: mbeattie on 1997/10/31 18:05:31
- Log: Half way through moving per-thread magicals into per-thread fields
- and the associated new OP_SPECIFIC and find_thread_magical stuff.
- perl will compile but plenty of the magicals are still broken.
- Branch: perl
- ! doop.c embed.h ext/Thread/Thread.xs global.sym gv.c hv.c
- ! interp.sym mg.c op.c opcode.h opcode.pl perl.c perl.h pp.c
- ! pp_ctl.c pp_sys.c proto.h sv.c sv.h taint.c thread.h toke.c
- ! util.c
+[ 2625] By: gsar on 1999/01/17 09:37:58
+ Log: documentation in change#2596 is not quite right; fix it
+ Branch: perl
+ ! lib/Math/BigFloat.pm pod/perlguts.pod
____________________________________________________________________________
-[ 194] By: nick on 1997/10/31 01:43:49
- Log: Convert miniperl sources to ANSI C. Several passes of
- GNU C's 'protoize' plus a few hand edits.
- Will compile miniperl with gcc -x c++ (i.e. treat .c a C++ files)
- Does not link seems gcc's C++ does not define a symbol for
- const char foo[] = "....";
- i.e. with empty [].
- Branch: ansiperl
- ! av.c deb.c doio.c doop.c dump.c gv.c hv.c malloc.c mg.c
- ! miniperlmain.c op.c perl.c perl.h perlio.c perly.y pp.c
- ! pp_ctl.c pp_hot.c pp_sys.c regcomp.c regexec.c run.c scope.c
- ! sv.c taint.c toke.c universal.c util.c
+[ 2624] By: gsar on 1999/01/17 09:28:34
+ Log: undo change#2571; C<use File::Spec> instead
+ Branch: perl
+ ! lib/FindBin.pm
____________________________________________________________________________
-[ 193] By: nick on 1997/10/30 03:00:01
- Log: Make the ansi branch
- Branch: ansiperl
- +> (branch 907 files)
-____________________________________________________________________________
-[ 192] By: nick on 1997/10/30 02:48:17
- Log: Oneperl builds with THREADS/THISPTR Borland
- Manualy inserted Sarathy's new COND_XXXXX from his mail.
- Manual change if Tself -> self as was easier than resolve :-(
- Two aTHIS's in op.c
- Branch: oneperl
- ! embed.h op.c thread.h thread.sym win32/makefile.mk
- ! win32/win32thread.h
-____________________________________________________________________________
-[ 191] By: nick on 1997/10/30 01:54:50
- Log: Raw resolve of latest sources with oneperl
- Branch: oneperl
- !> Todo.5.005 ext/Thread/Thread.xs fakethr.h op.c op.h opcode.h
- !> opcode.pl perl.c thread.h win32/win32thread.c
- !> win32/win32thread.h
-____________________________________________________________________________
-[ 190] By: mbeattie on 1997/10/29 14:39:54
- Log: Remove global macro "self". Change thr->Tself to thr->self.
- Branch: perl
- ! ext/Thread/Thread.xs fakethr.h perl.c thread.h
- ! win32/win32thread.c win32/win32thread.h
+[ 2623] By: gsar on 1999/01/17 09:20:42
+ Log: change#2572 is not applicable; undo, retaining scan_bin addition
+ to global.sym
+ Branch: perl
+ ! global.sym perl.c proto.h
____________________________________________________________________________
-[ 189] By: mbeattie on 1997/10/29 12:49:01
- Log: Add to Todo: compiler with fake SvCUR in comppad_name entries.
+[ 2622] By: gsar on 1999/01/17 09:17:42
+ Log: change#2576 is based on a wrong premise; undo it
Branch: perl
- ! Todo.5.005
+ ! pp_ctl.c
____________________________________________________________________________
-[ 188] By: mbeattie on 1997/10/29 12:45:32
- Log: Add pp_lock knowledge to compiler
- Branch: perlext
- ! Compiler/ccop.c Compiler/ccop.h
+[ 2621] By: gsar on 1999/01/17 09:12:42
+ Log: fix change#2602 to not used hard coded constants
+ Branch: perl
+ ! ext/B/B/C.pm ext/B/defsubs.h.PL
____________________________________________________________________________
-[ 187] By: mbeattie on 1997/10/29 12:45:02
- Log: Change peep() to optimise away unneeded rv2av in lval->[] and lval->{}
+[ 2620] By: gsar on 1999/01/17 09:02:07
+ Log: integrate cfgperl changes into mainline, fix conflicts
Branch: perl
- ! op.c
+ +> AUTHORS MAINTAIN README.mint ext/DynaLoader/hints/linux.pl
+ +> ext/POSIX/hints/mint.pl hints/gnu.sh hints/mint.sh
+ +> lib/Dumpvalue.pm mint/Makefile mint/README mint/errno.h
+ +> mint/pwd.c mint/stdio.h mint/sys/time.h mint/time.h
+ +> pod/perlopentut.pod
+ !> (integrate 162 files)
____________________________________________________________________________
-[ 186] By: mbeattie on 1997/10/29 12:43:36
- Log: Move compiler OP class information into opcode.pl.
- Branch: perl
- ! op.h opcode.h opcode.pl
-____________________________________________________________________________
-[ 185] By: nick on 1997/10/26 22:52:05
- Log: Split failing test in op/misc.t into op/nothread.t
- so all tests can be passed where they apply.
- Cleanup other two cases of THREADS/THISPTR.
- Conditional compile option for CriticalSection's on Win32
- Branch: oneperl
- + t/op/nothread.t
- ! sv.h t/op/misc.t win32/Makefile win32/makedef.pl
- ! win32/win32thread.h
-____________________________________________________________________________
-[ 184] By: nick on 1997/10/26 19:42:00
- Log: USE_THISPTR fixes for CRIPPLED_CC (implied by threads)
- Branch: oneperl
- ! embed.h global.sym proto.h sv.c sv.h toke.c
-____________________________________________________________________________
-[ 183] By: nick on 1997/10/26 18:31:58
- Log: Make USE_THREADS imply CRIPPLED_CC.
- This avoids most of the uses of 'Sv' and hence many needs of
- dTHR in extension code.
- With this change Data::Dumper builds as-is
- and Tk only needs four tweaks:
- 1. Obscure dump-stack case which really needs dTHR
- 2. A curcop in error-message code
- 3. Two cases of SAVETMPS
- 4. A curcop == &compiling which is probably not required.
- IMHO the SAVETMPS case is only one which merits further automation.
- Branch: oneperl
- ! embed.h global.sym perl.h sv.c win32/Makefile win32/makedef.pl
-____________________________________________________________________________
-[ 182] By: nick on 1997/10/26 16:31:58
- Log: Change dSP to imply dTHR for extension source compatibility
- introduce djSP (Declare Just SP) for use in perl sources
- and thread-aware extensions. Use latter.
- Branch: oneperl
- ! XSUB.h doio.c doop.c ext/Thread/Thread.xs gv.c mg.c perl.c
- ! pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c sv.c
-____________________________________________________________________________
-[ 181] By: nick on 1997/10/26 00:39:57
- Log: More tests
- Branch: oneperl
- ! t/lib/thread.t
-____________________________________________________________________________
-[ 180] By: nick on 1997/10/25 22:18:27
- Log: Use return of THREAD_CREATE() - add basic thread test
- Branch: oneperl
- + t/lib/thread.t
- ! ext/Thread/Thread.xs
+[ 2619] By: gsar on 1999/01/17 08:42:04
+ Log: a few doc typos
+ Branch: perl
+ ! lib/utf8.pm pod/perlfunc.pod pod/perlre.pod
____________________________________________________________________________
-[ 179] By: nick on 1997/10/25 21:25:23
- Log: Builds with no thread/this
- Branch: oneperl
- ! ext/Thread/Thread.xs t/lib/english.t win32/makedef.pl
- ! win32/win32thread.c
+[ 2616] By: gbarr on 1999/01/16 18:59:55
+ Log: Win32 changes from Jan
+
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 15 Jan 1999 23:38:35 +0100
+ Message-ID: <36a7c10d.16311905@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03m2] Win32 Makefile patches
+
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 16 Jan 1999 13:02:45 +0100
+ Message-ID: <36a07da6.10722337@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03m2] minor tweaks to README.win32
+ Branch: maint-5.005/perl
+ ! README.win32 win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 178] By: nick on 1997/10/25 18:28:03
- Log: Cleanup dead #ifdef branch introduced by scruffy merging.
- Branch: oneperl
- ! perl.c
+[ 2615] By: gbarr on 1999/01/16 18:48:48
+ Log: Jumbo patch from Sarathy for PERL_OBJECT & USE_THREADS
+
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Thu, 07 Jan 1999 00:12:00 -0500
+ Message-Id: <199901070512.AAA23568@aatma.engin.umich.edu>
+ Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
+
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Thu, 14 Jan 1999 19:21:46 -0500
+ Message-Id: <199901150021.TAA01886@aatma.engin.umich.edu>
+ Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
+ Branch: maint-5.005/perl
+ ! embed.h global.sym lib/ExtUtils/MM_Unix.pm objXSUB.h objpp.h
+ ! op.c perl.c perl.h perly.c perly.y perly_c.diff pp.c proto.h
+ ! sv.c t/io/fs.t toke.c win32/GenCAPI.pl win32/config.bc
+ ! win32/makedef.pl win32/runperl.c win32/win32.c
+____________________________________________________________________________
+[ 2614] By: gbarr on 1999/01/16 16:48:38
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 15 Jan 1999 17:28:34 +0200 (EET)
+ Message-Id: <199901151528.RAA08785@alpha.hut.fi>
+ Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: NetBSD patches
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 15 Jan 1999 18:44:19 +0200 (EET)
+ Message-Id: <199901151644.SAA08184@alpha.hut.fi>
+ Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: allow skipping the "install also as /usr/bin/perl" question of installperl
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 15 Jan 1999 18:52:29 +0200 (EET)
+ Message-Id: <199901151652.SAA11259@alpha.hut.fi>
+ Subject: the promised "installusrbinperl + NetBSD" fix
+ Branch: maint-5.005/perl
+ ! Configure Makefile.SH hints/netbsd.sh installperl
+ ! makedepend.SH unixish.h
+____________________________________________________________________________
+[ 2611] By: jhi on 1999/01/14 12:16:14
+ Log: From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: perlopentut.pod
+ Date: Sat, 09 Jan 1999 08:13:18 -0700
+ Message-Id: <199901091513.IAA17512@jhereg.perl.com>
+ Branch: cfgperl
+ + pod/perlopentut.pod
+ ! MANIFEST pod/perl.pod pod/perldelta.pod pod/roffitall
+____________________________________________________________________________
+[ 2607] By: gbarr on 1999/01/14 02:53:40
+ Log: Added Carp::cluck to perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 2605] By: jhi on 1999/01/13 18:26:19
+ Log: From: "Jonathan Fine (IT- Borders Online)" <jfine@borders.com>
+ To: "'cpan@perl.org'" <cpan@perl.org>
+ Subject: "Bug" fix for File::Find.pm
+ Date: Thu, 31 Dec 1998 13:01:50 -0500
+ Message-ID: <311F144DB5E5D011B03F00805FE954B10708BE17@exchange01_ph.borders.com>
+ Branch: cfgperl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 2604] By: jhi on 1999/01/13 18:08:45
+ Log: From: Peter Wolfe <wolfe@teloseng.com>
+ Subject: SCO 3.2v5 patch for perl5.005_03-MAINT_TRIAL_1
+ To: perlbug@perl.com
+ Date: 11 Jan 1999 23:00:05 +0200
+ Message-ID: <MLIST_199901111950.LAA01703@titan.teloseng.com>
+ Branch: cfgperl
+ ! hints/sco.sh
+____________________________________________________________________________
+[ 2603] By: jhi on 1999/01/13 18:06:56
+ Log: From: hans@icgroup.nl (Hans Mulder)
+ Subject: [Patch for 5.005_54] re::debugcolors dumps core
+ To: perlbug@perl.com
+ Cc: hansmu@xs4all.nl
+ Date: 11 Jan 1999 22:22:45 +0200
+ Message-ID: <MLIST_9901111947.AA22109@icgned.icgroup.nl>
+ Branch: cfgperl
+ ! ext/re/re.pm regcomp.c
+____________________________________________________________________________
+[ 2602] By: jhi on 1999/01/13 18:05:43
+ Log: From: "Vishal Bhatia" <vishalb@hotmail.com>
+ Subject: [PATCH 5.005_54]B::MAGIC::PTR doesnot check for valid length.
+ Date: 11 Jan 1999 08:02:41 +0200
+ Lines: 134
+ Message-ID: <MLIST_19990111052126.27966.qmail@hotmail.com>
+ Branch: cfgperl
+ ! ext/B/B.xs ext/B/B/C.pm
+____________________________________________________________________________
+[ 2601] By: jhi on 1999/01/13 18:01:53
+ Log: From: James FitzGibbon <james@ican.net>
+ Subject: Trivial patch for HP-UX 11 and shared libperl
+ To: perl5-porters@perl.org
+ Date: 8 Jan 1999 19:13:23 +0200
+ Message-ID: <MLIST_Pine.BSF.4.05.9901081110090.21785-100000@staff1.tor.accglobal.net>
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2600] By: jhi on 1999/01/13 17:59:45
+ Log: From: "Vishal Bhatia" <vishalb@hotmail.com>
+ Subject: [PATCH 5.005_54] B::CC::pp_rv2cv problem
+ To: perl5-porters@perl.org
+ Date: 8 Jan 1999 12:43:36 +0200
+ Message-ID: <MLIST_19990108101557.4481.qmail@hotmail.com>
+ Branch: cfgperl
+ ! ext/B/B/CC.pm
+____________________________________________________________________________
+[ 2599] By: jhi on 1999/01/13 17:50:11
+ Log: From: Robin Barker <rmb1@cise.npl.co.uk>
+ Subject: PATCH to installperl
+ To: perl5-porters@perl.org
+ Date: 4 Jan 1999 16:15:18 +0200
+ Message-ID: <MLIST_199901041350.NAA19665@cyclone.cise.npl.co.uk>
+ Branch: cfgperl
+ ! installperl
+____________________________________________________________________________
+[ 2598] By: jhi on 1999/01/13 17:34:51
+ Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ To: gsar@engin.umich.edu (Gurusamy Sarathy), gbarr@pobox.com
+ Cc: perl5-porters@perl.org
+ Subject: PATCH DB_File 1.63 for 5.005_54 & 5.005_03
+ Date: Tue, 29 Dec 1998 16:23:54 +0000 (GMT)
+ Message-Id: <9812291623.AA20884@claudius.bfsec.bt.co.uk>
+ Branch: cfgperl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/dbinfo ext/DB_File/typemap
+____________________________________________________________________________
+[ 2597] By: jhi on 1999/01/13 17:30:33
+ Log: From: David Dyck <dcd@tc.fluke.com>
+ To: Perl Porters <perl5-porters@perl.org>,
+ Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: PATCH to perl5.005_54/pod/perldsc.pod (fix typo)
+ Date: Tue, 12 Jan 1999 11:14:19 -0800 (PST)
+ Message-ID: <Pine.LNX.4.05.9901121111250.22568-100000@dd.tc.fluke.com>
+ Branch: cfgperl
+ ! pod/perldsc.pod
+____________________________________________________________________________
+[ 2596] By: jhi on 1999/01/13 17:26:44
+ Log: From: Joshua Pritikin <joshua.pritikin@db.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH] modglobal w/ spelling fixes
+ Date: Tue, 12 Jan 1999 18:06:01 -0500 (EST)
+ Message-ID: <Pine.GSO.4.02.9901121805290.625-100000@eq1062.wks.na.deuba.com>
+ Branch: cfgperl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 2595] By: jhi on 1999/01/13 17:24:59
+ Log: From: Hans Mulder <hansm@icgroup.nl>
+ Optimize common sort routines. Thread started by the message
+
+ From: Hans Mulder <hansm@icgroup.nl>
+ Sender: owner-perl5-porters@perl.org
+ To: perl5-porters@perl.org
+ Subject: [Patch for 5.00554] From the Todo list: Optimize sort by { $a <=> $b
+ Message-Id: <9901092156.AA03831@icgned.icgroup.nl>
+
+ and the patch from the message
+
+ From: Hans Mulder <hans@icgroup.nl>
+ To: jhi@iki.fi
+ Cc: perl5-porters@perl.org
+ Subject: Re: [Patch for 5.00554] From the Todo list: Optimize sort by { $a <=>
+ $b }
+ Date: Wed, 13 Jan 1999 17:39:35 +0100
+ Message-Id: <9901131639.AA17419@icgned.icgroup.nl>
+ Branch: cfgperl
+ ! Todo op.c op.h pp_ctl.c t/op/sort.t
+____________________________________________________________________________
+[ 2594] By: jhi on 1999/01/13 16:50:17
+ Log: Atari MiNT port by Guido Flohr <gufl0000@stud.uni-sb.de>
+ (the diffs were based on 5.004_02). Tested by Guido
+ and Frank Naumann <fnaumann@prinz-atm.CS.Uni-Magdeburg.De>.
+ Branch: cfgperl
+ + README.mint ext/POSIX/hints/mint.pl hints/mint.sh
+ + mint/Makefile mint/README mint/errno.h mint/pwd.c mint/stdio.h
+ + mint/sys/time.h mint/time.h
+ ! MANIFEST doio.c malloc.c miniperlmain.c perl.c t/io/fs.t
+ ! t/lib/safe2.t t/op/groups.t t/op/mkdir.t t/op/taint.t util.c
+____________________________________________________________________________
+[ 2593] By: jhi on 1999/01/09 16:54:26
+ Log: Detypo.
+ Branch: cfgperl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 2592] By: jhi on 1999/01/09 16:17:13
+ Log: Move usethreads and use64bits logic from hints to Configure.
+ Branch: cfgperl
+ ! Configure hints/README.hints hints/aix.sh hints/dec_osf.sh
+ ! hints/dos_djgpp.sh hints/freebsd.sh hints/hpux.sh
+ ! hints/irix_6.sh hints/irix_6_0.sh hints/irix_6_1.sh
+ ! hints/linux.sh hints/os2.sh hints/solaris_2.sh hints/vmesa.sh
+____________________________________________________________________________
+[ 2591] By: jhi on 1999/01/09 14:45:24
+ Log: Missing dTHRs added.
+ Branch: cfgperl
+ ! regcomp.c toke.c
+____________________________________________________________________________
+[ 2590] By: jhi on 1999/01/08 15:27:17
+ Log: Finalize change #2589 and add better AIX nm scanning from:
+
+ Message-Id: <m0zyNW0-00017VC@gentoo.com>
+ From: bll@gentoo.com (Brad Lanam)
+ Subject: Re: mailhelp returned a non-zero status
+ In-Reply-To: <199901072155.WAA14369@hptnocou.grenoble.hp.com> from Raphael Manfredi at "Jan 7, 1999 10:55:24 pm"
+ To: ram@hptnocou.grenoble.hp.com (Raphael Manfredi)
+ Branch: cfgperl
+ ! Configure hints/freebsd.sh hints/linux.sh
+____________________________________________________________________________
+[ 2589] By: jhi on 1999/01/08 15:14:54
+ Log: Undo change #2581.
+ Branch: cfgperl
+ ! Configure hints/freebsd.sh hints/linux.sh
+____________________________________________________________________________
+[ 2588] By: jhi on 1999/01/08 11:51:52
+ Log: FAQ jumbo patch from tchrist.
+
+ Message-Id: <199901080605.XAA20229@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq.pod
+ Date: Thu, 7 Jan 1999 23:05:02 -0700
+
+ Message-Id: <199901080605.XAA20231@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq1.pod
+ Date: Thu, 7 Jan 1999 23:05:02 -0700
+
+ Message-Id: <199901080605.XAA20233@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq2.pod
+ Date: Thu, 7 Jan 1999 23:05:02 -0700
+
+ Message-Id: <199901080605.XAA20235@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq3.pod
+ Date: Thu, 7 Jan 1999 23:05:02 -0700
+
+ Message-Id: <199901080605.XAA20237@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq4.pod
+ Date: Thu, 7 Jan 1999 23:05:02 -0700
+
+ Message-Id: <199901080605.XAA20239@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq5.pod
+ Date: Thu, 7 Jan 1999 23:05:02 -0700
+
+ Message-Id: <199901080605.XAA20241@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq6.pod
+ Date: Thu, 7 Jan 1999 23:05:02 -0700
+
+ Message-Id: <199901080605.XAA20243@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq7.pod
+ Date: Thu, 7 Jan 1999 23:05:03 -0700
+
+ Message-Id: <199901080605.XAA20245@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq8.pod
+ Date: Thu, 7 Jan 1999 23:05:03 -0700
+
+ Message-Id: <199901080605.XAA20257@jhereg.perl.com>
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: pumpkings@jhereg.perl.com
+ Subject: newest version of perlfaq9.pod
+ Date: Thu, 7 Jan 1999 23:05:03 -0700
+ Branch: cfgperl
+ ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod
+____________________________________________________________________________
+[ 2587] By: jhi on 1999/01/08 11:17:43
+ Log: More doc fixes from Abigail.
+ Branch: cfgperl
+ ! lib/Time/gmtime.pm lib/Time/localtime.pm lib/User/grent.pm
+ ! lib/User/pwent.pm
+____________________________________________________________________________
+[ 2585] By: jhi on 1999/01/08 08:31:02
+ Log: Change #2584 from maint-5.005:
+
+ implemented Ilya's suggested fix, and added a testcase
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 5 Jan 1999 00:56:01 -0500 (EST)
+ Message-Id: <199901050556.AAA02597@monk.mps.ohio-state.edu>
+ Subject: Re: Text::ParseWords: regex fix
+ Branch: cfgperl
+ ! lib/Text/ParseWords.pm t/lib/parsewords.t
+____________________________________________________________________________
+[ 2583] By: gbarr on 1999/01/08 04:50:03
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Thu, 7 Jan 1999 12:47:38 +0200 (EET)
+ Message-Id: <199901071047.MAA24100@alpha.hut.fi>
+ Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: ext/Errno_pm.PL: understand wrapper cppstdins
+ Branch: maint-5.005/perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 2581] By: jhi on 1999/01/07 16:38:03
+ Log: Configure update:
+ - usethreads, use64bits, and usemultiplicity
+ are no more interactively asked by Configure
+ - "int main()" (vs bare "main()") enforced in test programs
+ Branch: cfgperl
+ ! Configure hints/freebsd.sh hints/linux.sh
+____________________________________________________________________________
+[ 2580] By: jhi on 1999/01/07 11:19:12
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Wed, 06 Jan 1999 13:47:34 -0800
+ Message-Id: <3.0.6.32.19990106134734.0334d260@ous.edu>
+ Subject: [PATCH 5.005_02-MT2, 5.005_5x]VMS.C tweak for occasional system() error
+ Branch: cfgperl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 2579] By: jhi on 1999/01/07 09:08:36
+ Log: Another set of doc patches from Abigail
+
+ From: abigail@fnx.com
+ Message-ID: <19990107032132.20124.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/Net/hostent.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:21:32 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107032445.20178.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Net/netent.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:24:45 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107032834.20362.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/Term/Complete.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:28:34 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107033136.20440.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/Term/ReadLine.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:31:36 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107033351.20540.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Apache.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:33:51 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107033933.20707.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Push.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:39:33 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107034548.20936.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/File/Copy.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 22:45:48 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107034856.21056.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:48:56 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107035113.21174.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec/Mac.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 22:51:13 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107035612.21522.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigFloat.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:56:12 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107035842.21585.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigInt.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 22:58:41 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107040644.22009.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Text/Wrap.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 23:06:44 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107040955.22087.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Array.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 23:09:55 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107041136.22174.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Hash.pm] Typo fix
+ Date: Wed, 6 Jan 1999 23:11:36 -0500 (EST)
+ Branch: cfgperl
+ ! lib/CGI/Apache.pm lib/CGI/Push.pm lib/File/Copy.pm
+ ! lib/File/Spec.pm lib/File/Spec/Mac.pm lib/Math/BigFloat.pm
+ ! lib/Math/BigInt.pm lib/Net/hostent.pm lib/Net/netent.pm
+ ! lib/Term/Complete.pm lib/Term/ReadLine.pm lib/Text/Wrap.pm
+ ! lib/Tie/Array.pm lib/Tie/Hash.pm
+____________________________________________________________________________
+[ 2576] By: jhi on 1999/01/06 17:05:20
+ Log: Change #2582 fallout: the amagic_cmp* are no more file static.
+ Branch: cfgperl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 2575] By: jhi on 1999/01/06 13:18:56
+ Log: Enhance the great_circle_distance() documentation.
+ Branch: cfgperl
+ ! lib/Math/Trig.pm
+____________________________________________________________________________
+[ 2574] By: jhi on 1999/01/06 12:58:03
+ Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
+ To: perlbug@perl.com
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_2] t/op/sysio.t for MPE/iX
+ Date: Mon, 4 Jan 1999 13:34:58 -0800 (PST)
+ Message-Id: <199901042134.NAA18852@spock.dis.cccd.edu>
+ Branch: cfgperl
+ ! t/op/sysio.t
+____________________________________________________________________________
+[ 2573] By: jhi on 1999/01/06 12:40:19
+ Log: From: "W. Phillip Moore" <wpm@ms.com>
+ To: perlbug@perl.org
+ Subject: [PATCH] POSIX getpgrp is not -w clean
+ Date: Tue, 5 Jan 1999 12:40:27 -0500 (EST)
+ Message-ID: <13970.20107.190314.549471@zappa>
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.pm
+____________________________________________________________________________
+[ 2572] By: jhi on 1999/01/06 12:25:24
+ Log: Based on
+ From: jan.dubois@ibm.net (Jan Dubois)
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
+ Date: Wed, 06 Jan 1999 01:24:09 +0100
+ Message-ID: <3696aa85.18259325@smtp1.ibm.net>
+ except that
+ - objXSUB.h was already okay
+ - embed.h patching is futile, global.sym patched instead
+ - objpp.h does not exist
+ - proto.h addition applied manually
+ - win32/GenCAPI.pl was already okay
+ - win32/makedef.pl was already okay
+ Branch: cfgperl
+ ! global.sym perl.c proto.h
+____________________________________________________________________________
+[ 2571] By: jhi on 1999/01/06 11:25:48
+ Log: From: Slaven Rezic <eserte@cs.tu-berlin.de>
+ To: perlbug@perl.com
+ Subject: FindBin.pm on Win32 systems
+ Date: Mon, 4 Jan 1999 23:01:46 +0100 (CET)
+ Message-Id: <199901042201.XAA01875@cabulja.herceg.de>
+ Branch: cfgperl
+ ! lib/FindBin.pm
+____________________________________________________________________________
+[ 2570] By: jhi on 1999/01/06 11:21:48
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_2]taint.c fix for VMS
+ Date: Tue, 05 Jan 1999 16:47:31 -0800
+ Message-Id: <3.0.6.32.19990105164731.00b5b2d0@ous.edu>
+
+ (the ext/IO/lib/IO/Socket.pm was not really changed here;
+ it was a leftover from #2569)
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Socket.pm taint.c
+____________________________________________________________________________
+[ 2569] By: jhi on 1999/01/06 11:18:22
+ Log: Jumbo doc patch from Abigail (almost identical to
+ the 5.005-maint change #2562 except for the
+ ext/IO/lib/IO/Socket.pm patch which was not
+ applicable because the IO version of 5.005-devel
+ is somewhat different (why?))
+
+ From: abigail@fnx.com
+ Message-ID: <19990105170142.4889.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03-TRIAL2 lib/ExtUtils/Liblist.pm] pod fixes
+ Date: Tue, 5 Jan 1999 12:01:42 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105172855.5115.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Commands.pm] Typo fix.
+ Date: Tue, 5 Jan 1999 12:28:55 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105173808.5260.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH perl5.005_03 MAINT3 lib/ExtUtils/Embed.pm] Typo fix
+ Date: Tue, 5 Jan 1999 12:38:08 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105174859.5533.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Install.pm] Typo fix
+ Date: Tue, 5 Jan 1999 12:48:59 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105174947.5547.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 lib/ExtUtils/MM_Unix.pm] Typo fixes
+ Date: Tue, 5 Jan 1999 12:49:46 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105182301.5966.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 lib/ExtUtils/MakeMaker.pm] Typos fixes.
+ Date: Tue, 5 Jan 1999 13:23:00 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105183344.6065.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Manifest.pm] Typo fixes
+ Date: Tue, 5 Jan 1999 13:33:44 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105184028.6220.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Mksymlists.pm] Typo fix
+ Date: Tue, 5 Jan 1999 13:40:28 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990106012015.9451.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/IO/Pipe.pm] Typo fixes.
+ Date: Tue, 5 Jan 1999 20:20:15 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990106012047.9459.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/IO/Seekable.pm] Typo fixes
+ Date: Tue, 5 Jan 1999 20:20:47 -0500 (EST)
+ Branch: cfgperl
+ ! ext/IO/lib/IO/Pipe.pm ext/IO/lib/IO/Seekable.pm
+ ! lib/ExtUtils/Command.pm lib/ExtUtils/Embed.pm
+ ! lib/ExtUtils/Install.pm lib/ExtUtils/Liblist.pm
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/ExtUtils/Manifest.pm lib/ExtUtils/Mksymlists.pm
+____________________________________________________________________________
+[ 2568] By: gbarr on 1999/01/06 03:13:15
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 06 Jan 1999 01:24:09 +0100
+ Message-ID: <3696aa85.18259325@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
+ Branch: maint-5.005/perl
+ ! embed.h global.sym objXSUB.h objpp.h perl.c proto.h
+ ! win32/GenCAPI.pl win32/makedef.pl
+____________________________________________________________________________
+[ 2566] By: gbarr on 1999/01/06 02:29:05
+ Log: From: "W. Phillip Moore" <wpm@ms.com>
+ Date: Tue, 5 Jan 1999 12:40:27 -0500 (EST)
+ Message-ID: <13970.20107.190314.549471@zappa>
+ Subject: [PATCH] POSIX getpgrp is not -w clean
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.pm
+____________________________________________________________________________
+[ 2565] By: gbarr on 1999/01/06 02:19:00
+ Log: From: Slaven Rezic <eserte@cs.tu-berlin.de>
+ Date: Mon, 4 Jan 1999 23:01:46 +0100 (CET)
+ Message-Id: <199901042201.XAA01875@cabulja.herceg.de>
+ Subject: FindBin.pm on Win32 systems
+ Branch: maint-5.005/perl
+ ! lib/FindBin.pm
+____________________________________________________________________________
+[ 2561] By: jhi on 1999/01/05 10:49:10
+ Log: Reword the setlocale() 1-arg case better.
+ Branch: cfgperl
+ ! ext/POSIX/POSIX.pod
+____________________________________________________________________________
+[ 2559] By: gbarr on 1999/01/02 15:37:35
+ Log: From: Blair Zajac <bzajac@geostaff.com>
+ Date: Wed, 23 Dec 1998 17:13:32 -0800
+ Message-ID: <3681953C.8B6A90AA@geostaff.com>
+ Subject: Tie::SubstrHash patch
+ Branch: maint-5.005/perl
+ ! lib/Tie/SubstrHash.pm
+____________________________________________________________________________
+[ 2554] By: jhi on 1999/01/02 14:55:06
+ Log: Object destruction order testing.
+ Branch: cfgperl
+ ! t/op/misc.t
____________________________________________________________________________
-[ 177] By: nick on 1997/10/25 18:11:33
- Log: Basic integrate of oneperl with threads, passes
- tests THISPTR+THREADs - win32/win32thread.* needed
- changes (where did they come from)?
- Branch: oneperl
- ! embed.h ext/Thread/Thread.xs perl.h thread.h win32/Makefile
- ! win32/makedef.pl win32/win32thread.c win32/win32thread.h
-____________________________________________________________________________
-[ 176] By: nick on 1997/10/25 17:05:52
- Log: Onepel builds THISPTR no threads
- Branch: oneperl
- ! ext/Thread/Thread.xs thread.h win32/makedef.pl
-____________________________________________________________________________
-[ 175] By: nick on 1997/10/25 16:40:10
- Log: Integrate oneperl with new style JOIN etc. macros
- Branch: oneperl
- +> win32/win32thread.c win32/win32thread.h
- !> Todo.5.005 ext/POSIX/POSIX.xs ext/Thread/Thread.xs fakethr.h
- !> global.sym gv.c hv.c mg.c op.c opcode.h opcode.pl perl.c
- !> perl.h pp.c pp_hot.c sv.h thread.h vms/descrip.mms
- !> vms/gen_shrfls.pl vms/vms.c vms/vmsish.h win32/Makefile
- !> win32/makefile.mk
-____________________________________________________________________________
-[ 174] By: mbeattie on 1997/10/24 17:14:00
- Log: Remove xcv_condp CV field which is no longer used.
+[ 2553] By: jhi on 1999/01/02 14:49:40
+ Log: perldelta the Dumpvalue.pm of change #2513.
+ Branch: cfgperl
+ ! lib/Dumpvalue.pm pod/perldelta.pod
+____________________________________________________________________________
+[ 2552] By: nick on 1999/01/02 14:45:38
+ Log: Tone down Makefile.PL so it works on Win32
Branch: perl
- ! sv.h
+ ! ext/B/Makefile.PL
____________________________________________________________________________
-[ 173] By: mbeattie on 1997/10/24 14:36:09
- Log: Patches for VMS [Dan Sugalski]
- Branch: bugs
- + vms2
+[ 2551] By: nick on 1999/01/02 14:06:30
+ Log: Export constant subs from B.xs for op.h, cop.h and a few others.
+ Use them in various B::* rather than have local defs.
Branch: perl
- ! ext/POSIX/POSIX.xs vms/descrip.mms vms/gen_shrfls.pl vms/vms.c
- ! vms/vmsish.h
+ + ext/B/defsubs.h.PL
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/Bytecode.pm ext/B/B/C.pm
+ ! ext/B/B/CC.pm ext/B/B/Deparse.pm ext/B/B/Lint.pm
+ ! ext/B/B/Stackobj.pm ext/B/B/Xref.pm ext/B/Makefile.PL
____________________________________________________________________________
-[ 172] By: mbeattie on 1997/10/24 13:50:59
- Log: Improve internal threading API. Introduce win32/win32thread.[ch]
- to use new API and patch win32 makefile stuff a little.
+[ 2550] By: nick on 1999/01/02 10:04:02
+ Log: Integrate ext/B changes from //depot/cfgperl
Branch: perl
- + win32/win32thread.c win32/win32thread.h
- ! Todo.5.005 ext/Thread/Thread.xs fakethr.h global.sym gv.c hv.c
- ! perl.c perl.h thread.h win32/Makefile win32/makefile.mk
+ !> ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm ext/B/B/Stackobj.pm
____________________________________________________________________________
-[ 171] By: mbeattie on 1997/10/23 14:00:27
- Log: Fix pp_hot.c:get_db_sub core dump when perl debugger used.
+[ 2549] By: jhi on 1999/01/01 13:54:16
+ Log: From: "Paul Holser" <Paul.Holser.pholser@nortelnetworks.com>
+ To: perlbug@perl.com
+ Subject: op/groups.t fails test 1 on HP-UX 10.20
+ Date: Wed, 30 Dec 1998 15:16:12 -0600 (CST)
+ Message-Id: <199812302116.PAA12439@crchh44c.us.nortel.com>
+ Branch: cfgperl
+ ! t/op/groups.t
+____________________________________________________________________________
+[ 2548] By: jhi on 1999/01/01 13:53:31
+ Log: From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ To: perl5-porters@perl.org
+ cc: hv@crypt0.demon.co.uk
+ Subject: [bug 5.004_54] duplicate error message
+ Date: Thu, 31 Dec 1998 04:05:25 +0000
+ Message-Id: <199812310405.EAA00386@crypt.compulink.co.uk>
- Jobs fixed ...
+ Message-ID: <13963.60672.134591.383377@alias-2.pr.mcs.net>
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ To: hv@crypt0.demon.co.uk
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH _54] Re: duplicate error message
+ Date: Thu, 31 Dec 1998 16:10:13 -0600 (CST)
- get_db_sub fixed on 1997/10/23 by mbeattie@squash
+ Message-Id: <199901010732.HAA02926@crypt.compulink.co.uk>
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ To: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ cc: hv@crypt0.demon.co.uk, perl5-porters@perl.org
+ Subject: [TEST PATCH _54] Re: duplicate error message
+ Date: Fri, 01 Jan 1999 07:32:14 +0000
+ Branch: cfgperl
+ ! op.c t/pragma/warn/op
+____________________________________________________________________________
+[ 2547] By: jhi on 1998/12/31 14:15:04
+ Log: From: Chris Nandor <pudge@pobox.com>
+ To: jhi@iki.fi
+ Cc: perl5-porters@perl.org
+ Subject: Re: [PATCH] perlport.pod 1.38
+ Date: Thu, 31 Dec 1998 09:06:48 -0500
+ Message-Id: <v04020a1db2b1352ec92a@[192.168.0.77]>
+ Branch: cfgperl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 2546] By: jhi on 1998/12/31 11:18:17
+ Log: From: Wilson P. Snyder II
+ To: perl5-porters@perl.org
+ Subject: [PATCH v5.5.53] REV2: Binary number support
+ Date: 1998/11/30
+ Message-ID: <199811301543.KAA15689@vulcan.maker.com>
+ Branch: cfgperl
+ ! pod/perldata.pod pod/perldelta.pod pod/perlfunc.pod pp.c
+ ! proto.h sv.c t/op/oct.t t/op/sprintf.t t/pragma/warn/util
+ ! toke.c util.c
+____________________________________________________________________________
+[ 2545] By: jhi on 1998/12/31 09:27:40
+ Log: From: "Todd C. Miller" <Todd.Miller@courtesan.com>
+ To: perlbug@perl.com
+ Subject: "perl -T -P" dumps core on OpenBSD and Linux
+ Date: Wed, 30 Dec 1998 21:11:05 -0700 (MST)
+ Message-Id: <199812310411.VAA37568@xerxes.courtesan.com>
+ Branch: cfgperl
+ ! taint.c
+____________________________________________________________________________
+[ 2544] By: jhi on 1998/12/31 09:21:45
+ Log: From: Tim Bunce <Tim.Bunce@ig.co.uk>
+ To: perlbug@perl.com
+ Subject: bug in pod2man search for perl binary [5.005_5x]
+ Date: Sat, 12 Dec 1998 23:08:51 +0000
+ Message-ID: <19981212230851.A20578@ig.co.uk>
+ Branch: cfgperl
+ ! pod/pod2man.PL
+____________________________________________________________________________
+[ 2541] By: gbarr on 1998/12/30 14:37:14
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 23 Dec 1998 21:26:38 +0100
+ Message-ID: <36895086.8849224@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03m1] subdirectory Makefiles should inherit CAPI setting from command line
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2540] By: jhi on 1998/12/30 08:42:04
+ Log: Evermore AUTHORS and MAINTAIN.
+ Branch: cfgperl
+ ! AUTHORS MAINTAIN
+____________________________________________________________________________
+[ 2539] By: jhi on 1998/12/29 15:10:34
+ Log: More AUTHORS and MAINTAIN.
+ Branch: cfgperl
+ ! AUTHORS MAINTAIN
+____________________________________________________________________________
+[ 2537] By: jhi on 1998/12/29 14:34:47
+ Log: From: Frank Ridderbusch <Frank.Ridderbusch@pdb.siemens.de>
+ Date: Tue, 15 Dec 1998 16:23:12 +0100 (MET)
+ Message-ID: <13942.32480.700000.640927@utensil>
+ Subject: Minor Bug in AutoSplit.qm in 5.005 and 5.004
+ (mirror change#2531 in the 5.005-maint)
+ Branch: cfgperl
+ ! lib/AutoSplit.pm
+____________________________________________________________________________
+[ 2531] By: gbarr on 1998/12/29 14:12:25
+ Log: change in_pod pattern to /^=\w/ from /^=/
+ From: Frank Ridderbusch <Frank.Ridderbusch@pdb.siemens.de>
+ Date: Tue, 15 Dec 1998 16:23:12 +0100 (MET)
+ Message-ID: <13942.32480.700000.640927@utensil>
+ Subject: Minor Bug in AutoSplit.qm in 5.005 and 5.004
+ Branch: maint-5.005/perl
+ ! lib/AutoSplit.pm
+____________________________________________________________________________
+[ 2525] By: jhi on 1998/12/29 13:06:26
+ Log: From: "Vishal Bhatia" <vishalb@hotmail.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54] More minor Fixes in CC.pm/C.pm
+ Date: 16 Dec 1998 03:17:03 +0200
+ Message-ID: <MLIST_199812160055.QAA06272@f10.hotmail.com>
+ Branch: cfgperl
+ ! ext/B/B/C.pm ext/B/B/CC.pm ext/B/B/Stackobj.pm
+____________________________________________________________________________
+[ 2524] By: jhi on 1998/12/29 13:00:06
+ Log: From: "Vishal Bhatia" <vishalb@hotmail.com>
+ To: perl5-porters@perl.org
+ Cc: rmb1@cise.npl.co.uk, nick@ni-s.u-net.com
+ Subject: [PATCH 5.005_54] Re:perlcc -e 'my $x = shift; print +($x ?...' failure
+ Date: 10 Dec 1998 08:30:02 +0200
+ Message-ID: <MLIST_19981210061651.29891.qmail@hotmail.com>
- Subject: [perl5.004_53] Debugger crash (patch)
- Date: Thu, 16 Oct 1997 22:03:09 -0400
- From: Owen Taylor <owt1@cornell.edu>
- Branch: bugs
- + get_db_sub
- Branch: perl
- ! pp_hot.c
+ (Nick's part was applied earlier, in change #2460)
+ Branch: cfgperl
+ ! ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm ext/B/B/Stackobj.pm
____________________________________________________________________________
-[ 170] By: mbeattie on 1997/10/23 09:22:40
- Log: Fix refcounts for lock/magic_mutexfree. Make OP_LOCK auto-ref
- its argument using ck_rfun as OP_DEFINED. Make pp_lock return
- a ref to its argument for AV, HV, CV.
- Branch: perl
- ! mg.c op.c opcode.h opcode.pl pp.c pp_hot.c
-____________________________________________________________________________
-[ 169] By: gsar on 1997/10/21 03:49:25
- Log: With these fixes, oneperl builds THISPTR && THREADS under both win32 compilers:
- - Fixup static functions that were missing aTHIS.
- - s/extern/EXT/ in dTHR macro, or Borland CC croaks.
- - Removed static functions from global.sym.
- - Typo in perl.h.
- - Additions to makefile.mk.
- Branch: oneperl
- ! embed.h embed.pl global.sym op.c perl.h pp_ctl.c toke.c
- ! win32/makefile.mk
+[ 2523] By: jhi on 1998/12/29 12:41:31
+ Log: From: "vishal bhatia" <vishalb@hotmail.com>
+ To: nick@ni-s.u-net.com
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54] return value of perlcc/B::CC generated functions.
+ Date: 9 Dec 1998 06:50:30 +0200
+ Message-ID: <MLIST_19981209043146.16829.qmail@hotmail.com>
+ Branch: cfgperl
+ ! ext/B/B/CC.pm
____________________________________________________________________________
-[ 168] By: nick on 1997/10/20 02:47:18
- Log: Passes expected tests with -DUSE_THREADS with/without -DUSE_THISPTR
- Branch: oneperl
- ! embed.h ext/Thread/Thread.xs mg.c pp.c pp_hot.c proto.h
- ! scope.h thread.h
-____________________________________________________________________________
-[ 167] By: nick on 1997/10/20 01:03:00
- Log: Add missing aTHIS in cast
- Branch: oneperl
- ! win32/dl_win32.xs
-____________________________________________________________________________
-[ 166] By: nick on 1997/10/20 00:44:42
- Log: Builds and passes test with -DUSE_THISPTR
- Branch: oneperl
- ! ext/Thread/Thread.xs win32/Makefile win32/makedef.pl
- ! win32/perllib.c
-____________________________________________________________________________
-[ 165] By: nick on 1997/10/19 21:45:36
- Log: Oneperl runs miniperl with THISPTR (Win32 threading patch included)
- Branch: oneperl
- ! embed.h ext/Thread/Thread.xs global.sym interp.sym perl.c
- ! perl.h t/TEST thread.h win32/Makefile win32/makedef.pl
- ! win32/makefile.mk win32/perllib.c
-____________________________________________________________________________
-[ 164] By: nick on 1997/10/19 20:09:13
- Log: oneperl compiles (but fails) with -DUSE_THISPTR
- Branch: oneperl
- ! av.c embed.h mg.c perl.c perl.h pp.c pp_ctl.c pp_hot.c
- ! pp_sys.c proto.h regexec.c sv.c thread.h thread.sym util.c
- ! win32/win32.c win32/win32.h
+[ 2522] By: jhi on 1998/12/29 12:15:18
+ Log: From: rjk@linguist.dartmouth.edu (Ronald J. Kimball)
+ To: perl5-porters@perl.org (Perl 5 Porters)
+ Subject: [PATCH 5.005_54] Pod::Text.pm reformating indented paragraphs
+ Date: 25 Dec 1998 23:02:28 +0200
+ Message-ID: <MLIST_199812252034.PAA27812@linguist.dartmouth.edu>
+ Branch: cfgperl
+ ! lib/Pod/Text.pm
____________________________________________________________________________
-[ 163] By: nick on 1997/10/19 16:46:09
- Log: Builds on NT4 without THISPTR or THREADS, passes all tests
- Branch: oneperl
- ! embed.h perl.h thread.h vars.h
-____________________________________________________________________________
-[ 162] By: nick on 1997/10/19 14:42:16
- Log: Dubious merge of oneperl's variable and struct thread
- Branch: oneperl
- !> perl.h thread.h
-____________________________________________________________________________
-[ 161] By: nick on 1997/10/18 18:05:13
- Log: integrate all but perl.h/thread.h
- Branch: oneperl
- +> Todo.5.005 perlio.sym
- !> (integrate 98 files)
-____________________________________________________________________________
-[ 160] By: nick on 1997/10/18 03:49:27
- Log: Integrate rest of sub-dirs into oneperl
- Branch: oneperl
- +> ext/Thread/Makefile.PL ext/Thread/Notes ext/Thread/README
- +> ext/Thread/Thread.pm ext/Thread/Thread.xs
- +> ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
- +> ext/Thread/create.t ext/Thread/io.t ext/Thread/join.t
- +> ext/Thread/join2.t ext/Thread/list.t ext/Thread/lock.t
- +> ext/Thread/queue.t ext/Thread/sync.t ext/Thread/sync2.t
- +> ext/Thread/typemap ext/Thread/unsync.t ext/Thread/unsync2.t
- +> ext/Thread/unsync3.t ext/Thread/unsync4.t hints/newsos4.sh
- +> hints/os390.sh
- - ext/util/extliblist
- !> (integrate 425 files)
-____________________________________________________________________________
-[ 159] By: nick on 1997/10/18 03:20:11
- Log: Integrate (accept) t and win32 into oneperl
- Branch: oneperl
- +> t/lib/dosglob.t win32/bin/pl2bat.pl win32/bin/runperl.pl
- +> win32/bin/search.pl win32/bin/webget.pl win32/config.bc
- +> win32/config.vc win32/config_H.bc win32/config_H.vc
- +> win32/makefile.mk
- !> (integrate 188 files)
-____________________________________________________________________________
-[ 158] By: nick on 1997/10/18 03:12:59
- Log: Integrate lib/... into oneperl
- Branch: oneperl
- +> lib/File/DosGlob.pm lib/base.pm lib/chat2.pl
- !> (integrate 138 files)
+[ 2521] By: jhi on 1998/12/29 12:07:54
+ Log: Undo #2519 (breaks universal.c).
+ Branch: cfgperl
+ ! XSUB.h
____________________________________________________________________________
-[ 157] By: nick on 1997/10/18 02:55:53
- Log: Make lib/Bundle/CPAN.pm text in oneperl too.
- Branch: oneperl
- ! lib/Bundle/CPAN.pm
+[ 2519] By: jhi on 1998/12/29 11:41:10
+ Log: From: Joshua Pritikin <joshua.pritikin@db.com>
+ To: perl5-porters@perl.org
+ Cc: perl-xs@perl.org
+ Subject: XSUB.h refinement [PATCH]
+ Date: 18 Dec 1998 03:58:44 +0200
+ Message-ID: <MLIST_Pine.GSO.4.02.9812171733330.589-100000@eq1062.wks.na.deuba.com>
+ Branch: cfgperl
+ ! XSUB.h
____________________________________________________________________________
-[ 156] By: nick on 1997/10/18 02:52:44
- Log: Make lib/Bundle/CPAN.pm a text file
- Branch: perl
- ! lib/Bundle/CPAN.pm
+[ 2518] By: jhi on 1998/12/29 11:36:19
+ Log: From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_02; lib/fields.pm] Typos in pod.
+ Date: 28 Dec 1998 21:39:15 +0200
+ Message-ID: <MLIST_19981228191612.8380.qmail@alexandra.wayne.fnx.com>
+ Branch: cfgperl
+ ! lib/fields.pm
____________________________________________________________________________
-[ 155] By: nick on 1997/10/18 02:33:02
- Log: Some weirdness in the intgrate process
- Branch: oneperl
- - win32/bin/pl2bat.bat win32/bin/search.bat win32/bin/test.bat
- - win32/bin/webget.bat win32/config.H win32/config.w32
+[ 2517] By: jhi on 1998/12/29 11:35:03
+ Log: Document change #2516.
+ Branch: cfgperl
+ ! pod/perldelta.pod
____________________________________________________________________________
-[ 153] By: nick on 1997/10/18 02:29:16
- Log: Let us try all the pure integrate stuff
- Branch: oneperl
- !> (integrate 647 files)
+[ 2516] By: jhi on 1998/12/29 11:32:26
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_53] Warn on unrecognized alpha escapes.
+ Date: 9 Dec 1998 10:39:31 +0200
+ Message-ID: <MLIST_199812090823.DAA17566@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! pod/perldiag.pod regcomp.c toke.c
____________________________________________________________________________
-[ 152] By: nick on 1997/10/18 02:13:35
- Log: Get more sub directories out of the way.
- Branch: oneperl
- !> (integrate 92 files)
+[ 2515] By: jhi on 1998/12/29 11:27:11
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_53] Bugs in hairy interactions of feature in REx
+ Date: 8 Dec 1998 09:02:04 +0200
+ Message-ID: <MLIST_199812080637.BAA16025@monk.mps.ohio-state.edu>
+
+ \G fixes (wasn't working right with //g, s///, and $_ in (?{})).
+ Branch: cfgperl
+ ! pp_ctl.c pp_hot.c regexec.c regexp.h t/op/pat.t t/op/subst.t
____________________________________________________________________________
-[ 151] By: nick on 1997/10/18 02:05:41
- Log: Integrate hints
- Branch: oneperl
- !> (integrate 68 files)
+[ 2514] By: jhi on 1998/12/29 11:21:31
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Subject: [PATCH 5.005_53] Regexp tests and UTF8
+ Date: 8 Dec 1998 07:02:01 +0200
+ Message-ID: <MLIST_199812080447.XAA05297@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! regcomp.c
____________________________________________________________________________
-[ 150] By: nick on 1997/10/18 01:57:20
- Log: Try reopening some non-contravertial files
- Branch: oneperl
- !> x2p/EXTERN.h x2p/INTERN.h x2p/Makefile.SH x2p/a2p.c x2p/a2p.h
- !> x2p/a2p.pod x2p/a2p.y x2p/a2py.c x2p/cflags.SH
- !> x2p/find2perl.PL x2p/hash.c x2p/hash.h x2p/proto.h x2p/s2p.PL
- !> x2p/str.c x2p/str.h x2p/util.c x2p/util.h x2p/walk.c
-____________________________________________________________________________
-[ 144] By: gsar on 1997/10/16 22:26:07
- Log: Merge changes to Thread and add makefile fixups to accomodate Thread
- build. Once again, builds and runs all Thread tests using either
- compiler.
- Branch: win32/perl
- ! embed.h ext/Thread/Thread.xs interp.sym perl.c win32/Makefile
- ! win32/makefile.mk
+[ 2513] By: jhi on 1998/12/29 11:18:34
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Dumpvar.pm
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Date: 7 Dec 1998 10:17:35 +0200
+ Message-ID: <MLIST_199812070744.CAA18949@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ + lib/Dumpvalue.pm
+ ! MANIFEST
+____________________________________________________________________________
+[ 2511] By: gbarr on 1998/12/28 14:55:28
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Tue, 01 Dec 1998 00:07:33 +0100
+ Message-ID: <366921b5.14512598@smtp1.ibm.net>
+ Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] to compile on Win32
+
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 02 Dec 1998 00:24:54 +0100
+ Message-ID: <366a77bb.19498126@smtp1.ibm.net>
+ Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] spaces in filenames support
+ Branch: maint-5.005/perl
+ ! perl.h proto.h taint.c win32/GenCAPI.pl win32/Makefile
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_sh.PL win32/makedef.pl
____________________________________________________________________________
-[ 143] By: gsar on 1997/10/16 20:45:58
- Log: A quick merge of latest mainline.
- Branch: win32/perl
- +> ext/Thread/Makefile.PL ext/Thread/Notes ext/Thread/README
- +> ext/Thread/Thread.pm ext/Thread/Thread.xs
- +> ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
- +> ext/Thread/create.t ext/Thread/io.t ext/Thread/join.t
- +> ext/Thread/join2.t ext/Thread/list.t ext/Thread/lock.t
- +> ext/Thread/queue.t ext/Thread/sync.t ext/Thread/sync2.t
- +> ext/Thread/typemap ext/Thread/unsync.t ext/Thread/unsync2.t
- +> ext/Thread/unsync3.t ext/Thread/unsync4.t hints/os390.sh
- +> lib/base.pm t/lib/dosglob.t
- - ext/util/extliblist
- !> (integrate 134 files)
+[ 2509] By: jhi on 1998/12/28 13:00:31
+ Log: Kickstart AUTHORS and MAINTAIN.
+ Branch: cfgperl
+ + AUTHORS MAINTAIN
+ ! MANIFEST
+____________________________________________________________________________
+[ 2508] By: jhi on 1998/12/28 08:04:00
+ Log: From: Nathan Torkington <gnat@frii.com>
+ To: perlbug@perl.com
+ Subject: [PATCH] perlxstut.pod fix
+ Date: Sat, 26 Dec 1998 14:28:21 +1300 (NZDT)
+ Message-ID: <13956.15285.933914.320849@localhost.frii.com>
+ Branch: cfgperl
+ ! pod/perlxstut.pod
+____________________________________________________________________________
+[ 2507] By: jhi on 1998/12/28 07:59:00
+ Log: From: abigail@fnx.com
+ To: perlbug@perl.com
+ Subject: [PATCH 5.005_02] Re: m// doc is buggy (was Re: m'$foo' is undocumented)
+ Date: Wed, 23 Dec 1998 22:59:59 -0500 (EST)
+ Message-ID: <19981224035959.16994.qmail@alexandra.wayne.fnx.com>
+ (slightly modified, a part of the patch was rejected)
+ (strange, I thought I had already submitted this one
+ but Perforce disagrees with me...)
+ Branch: cfgperl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 2506] By: jhi on 1998/12/28 07:56:59
+ Log: From: Artur <artur@vogon-solutions.com>
+ To: perlbug@perl.com
+ Subject: PATCH: perlmodlib.pod
+ Date: Fri, 25 Dec 1998 00:48:39 +0000
+ Message-ID: <3682E0E7.EBFB5D65@vogon-solutions.com>
+ Branch: cfgperl
+ ! pod/perlmodlib.pod pod/perlop.pod
+____________________________________________________________________________
+[ 2505] By: jhi on 1998/12/28 07:46:06
+ Log: From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_02] Typo in documentation of pod2html.
+ Date: Wed, 23 Dec 1998 22:32:07 -0500 (EST)
+ Message-ID: <19981224033207.16751.qmail@alexandra.wayne.fnx.com>
+ Branch: cfgperl
+ ! pod/pod2html.PL
+____________________________________________________________________________
+[ 2504] By: jhi on 1998/12/28 07:44:35
+ Log: From: Jim Avera <avera@fjst.com>
+ To: perlbug@perl.com
+ Subject: perlbug bug - shows dates reversed
+ Date: Wed, 23 Dec 1998 18:08:56 -0800 (PST)
+ Message-Id: <199812240208.SAA27616@membrane.ssd.hal.com>
+ Branch: cfgperl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 2503] By: jhi on 1998/12/28 07:41:39
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ To: makemaker@franz.ww.TU-Berlin.DE, perl5-porters@perl.org
+ Subject: [PATCH 5.005_03m1] subdirectory Makefiles should inherit CAPI setting from command line
+ Date: Wed, 23 Dec 1998 21:26:38 +0100
+ Message-ID: <36895086.8849224@smtp1.ibm.net>
+ Branch: cfgperl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2502] By: jhi on 1998/12/28 07:39:20
+ Log: From: Blair Zajac <bzajac@geostaff.com>
+ To: perl5-porters@perl.org
+ Subject: Tie::SubstrHash patch
+ Date: Wed, 23 Dec 1998 17:13:32 -0800
+ Message-ID: <3681953C.8B6A90AA@geostaff.com>
+ Branch: cfgperl
+ ! lib/Tie/SubstrHash.pm
+____________________________________________________________________________
+[ 2501] By: jhi on 1998/12/28 07:37:16
+ Log: From: Alan.Harder@Ebay.Sun.COM (Alan Harder)
+ To: perlbug@perl.com
+ Subject: perlfaq9 minor error
+ Date: Wed, 23 Dec 1998 14:54:19 -0800
+ Message-Id: <199812232254.OAA05986@moshpit.EBay.Sun.COM>
+ Branch: cfgperl
+ ! pod/perlfaq9.pod
+____________________________________________________________________________
+[ 2500] By: jhi on 1998/12/23 10:38:18
+ Log: More porting notes about filesystems, AmigaOS, and MiNT.
+ Branch: cfgperl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 2499] By: jhi on 1998/12/22 09:26:49
+ Log: Add few MSG_ and uio constants.
+ Branch: cfgperl
+ ! ext/Socket/Socket.pm ext/Socket/Socket.xs iperlsys.h
+____________________________________________________________________________
+[ 2498] By: jhi on 1998/12/22 08:39:30
+ Log: Slight recoding of util.c:repeatcpy() to circumnavigate
+ a Digital C compiler optimizer bug that broke the 'x'
+ operator under certain circumstances. See t/op/repeat.t
+ test #20 for graphic details. Reported in
+
+ From: Gisle Aas <gisle@aas.no>
+ To: Mark Martinec <Mark.Martinec@nsc.ijs.si>
+ Cc: ach@xray.mpe.mpg.de, cpan-testers@perl.org, perl5-porters@perl.org
+ Subject: Re: Digest-MD5-2.00 test fails on DEC Alpha - a patch
+ Date: 18 Dec 1998 14:27:40 +0100
+ Message-ID: <m37lvpa8c3.fsf@furu.g.aas.no>
+
+ and discussed further in the thread
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ To: Gisle Aas <gisle@aas.no>
+ Cc: Mark Martinec <Mark.Martinec@nsc.ijs.si>, ach@xray.mpe.mpg.de,
+ cpan-testers@perl.org, perl5-porters@perl.org
+ Subject: x operator broken in DEC Alpha for 8-bit characters (Re: Digest-MD5-2.00 test fails on DEC Alpha - a patch)
+ Date: Fri, 18 Dec 1998 16:18:37 +0200 (EET)
+ Message-ID: <13946.25661.193449.138023@alpha.hut.fi>
+ Branch: cfgperl
+ ! t/op/repeat.t util.c
+____________________________________________________________________________
+[ 2497] By: jhi on 1998/12/21 14:18:57
+ Log: Change #2483 update.
+ Branch: cfgperl
+ ! t/op/tr.t
+____________________________________________________________________________
+[ 2496] By: jhi on 1998/12/21 14:07:41
+ Log: Update on change #2493.
+ Branch: cfgperl
+ ! t/pragma/warn/op
+____________________________________________________________________________
+[ 2495] By: jhi on 1998/12/21 13:52:00
+ Log: Change #2487 aftershock.
+ Branch: cfgperl
+ ! warning.pl
+____________________________________________________________________________
+[ 2494] By: jhi on 1998/12/21 12:35:00
+ Log: From: Chris Nandor <pudge@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH] perlport.pod v1.37
+ Date: Sat, 19 Dec 1998 12:54:34 -0500
+ Message-Id: <v04020a03b2a194aaa676@[192.168.0.77]>
+ Branch: cfgperl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 2493] By: jhi on 1998/12/21 12:22:44
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.com
+ Subject: PATCH (5.005_02): Dejargonizing
+ Date: Sun, 20 Dec 1998 14:35:20 -0500
+ Message-ID: <19981220193520.11230.qmail@plover.com>
+
+ From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.com
+ Subject: PATCH (5.005_02): Spelling correction in warning message
+ Date: Sun, 20 Dec 1998 13:51:30 -0500
+ Message-ID: <19981220185130.11067.qmail@plover.com>
+ Branch: cfgperl
+ ! doio.c op.c
+____________________________________________________________________________
+[ 2492] By: jhi on 1998/12/21 09:00:05
+ Log: From: "Vishal Bhatia" <vishalb@hotmail.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54] pp_next/pp_last/pp_redo problems
+ Date: Sun, 20 Dec 1998 19:03:25 PST
+ Message-ID: <19981221030326.27660.qmail@hotmail.com>
+
+ (slightly reformatted)
+ Branch: cfgperl
+ ! ext/B/B/CC.pm
+____________________________________________________________________________
+[ 2491] By: nick on 1998/12/20 14:21:29
+ Log: Save _all_ GV's which have SV, AV or HV set.
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 2490] By: jhi on 1998/12/18 15:13:19
+ Log: Add idea about generalising cpp symbol probing of Errno.
+ Branch: cfgperl
+ ! Todo
+____________________________________________________________________________
+[ 2489] By: jhi on 1998/12/18 14:47:57
+ Log: Address some of the issues of:
+
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: perl-porters-active@jhereg.perl.com
+ Subject: Undocumentation Issues for 5.005
+ Date: Thu, 17 Dec 1998 14:46:24 -0700
+ Message-Id: <199812172146.OAA05316@jhereg.perl.com>
+ Branch: cfgperl
+ ! pod/perl5005delta.pod
+____________________________________________________________________________
+[ 2488] By: jhi on 1998/12/18 11:26:32
+ Log: From: root <root@dubravka.in-berlin.de>
+ To: perlbug@perl.com
+ Cc: k@dubravka.in-berlin.de
+ Subject: Please add no_modify to PERL_POLLUTE
+ Date: Fri, 18 Dec 1998 10:45:52 +0100
+ Message-Id: <199812180945.KAA05275@dubravka.in-berlin.de>
+
+ (Really from Andreas König)
+ Branch: cfgperl
+ ! embed.pl
+____________________________________________________________________________
+[ 2487] By: jhi on 1998/12/17 14:05:52
+ Log: Some (by far not all) issues of the below message addressed.
+
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ To: The Perl Porters Mailing List <perl5-porters@perl.org>
+ Subject: important UNDOC issues for 5.005_54
+ Date: Wed, 16 Dec 1998 21:14:53 -0700
+ Message-Id: <199812170414.VAA25860@jhereg.perl.com>
+ Branch: cfgperl
+ ! lib/warning.pm pod/perl5005delta.pod pod/perldelta.pod
+____________________________________________________________________________
+[ 2486] By: jhi on 1998/12/17 12:47:15
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: domo@computer.org
+ Cc: jhi@iki.fi, perl5-porters@perl.org
+ Subject: Re: stuff related to malloc.c
+ Date: Wed, 16 Dec 1998 16:40:27 -0500 (EST)
+ Message-Id: <199812162140.QAA04925@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! malloc.c
+____________________________________________________________________________
+[ 2485] By: jhi on 1998/12/17 12:17:19
+ Log: More porting notes.
+ Branch: cfgperl
+ ! Porting/pumpkin.pod
+____________________________________________________________________________
+[ 2484] By: jhi on 1998/12/15 08:38:05
+ Log: Undo #2386 and #2205.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2483] By: jhi on 1998/12/14 17:58:35
+ Log: lib was missing from @INC.
+ Branch: cfgperl
+ ! t/op/tr.t
+____________________________________________________________________________
+[ 2482] By: jhi on 1998/12/14 17:52:42
+ Log: Was missing use Text::Wrap.
+ Branch: cfgperl
+ ! t/lib/textfill.t
+____________________________________________________________________________
+[ 2481] By: jhi on 1998/12/14 16:00:22
+ Log: nlist.h not yet Configure-probed but DynaLoader Linux-hinted.
+
+ From: Jonathan Roy <roy@idle.com>
+ To: perl5-porters@perl.org
+ Subject: nlist.h add to Configure checks?
+ Date: Sun, 13 Dec 1998 22:22:49 -0500
+ Message-Id: <4.1.19981213221847.00a3e100@pop-server.tampabay.rr.com>
+ Branch: cfgperl
+ + ext/DynaLoader/hints/linux.pl
+ ! MANIFEST
+____________________________________________________________________________
+[ 2480] By: jhi on 1998/12/14 15:02:44
+ Log: Give up completely using nm in AIX.
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Gurusamy Sarathy <gsar@engin.umich.edu>, Jarkko Hietaniemi <jhi@iki.fi>
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54] AIX 4.3.1.0 fails to locate some functions
+ Date: Thu, 10 Dec 1998 00:51:46 -0500
+ Message-ID: <19981210005146.B29986@O2.chapin.edu>
+ Branch: cfgperl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 2479] By: jhi on 1998/12/14 14:39:52
+ Log: AIX' error messages are different.
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54] AIX 4.1.3.0 fails pragma/warning.t
+ Date: Thu, 10 Dec 1998 00:42:36 -0500
+ Message-ID: <19981210004236.A29986@O2.chapin.edu>
+
+ From: Michael Engel <engel@nms1.cc.huji.ac.il>
+ To: perlbug@perl.com
+ Subject: erroes in installing perl5*53 on IBM RS6000, aix 4.1
+ Date: Mon, 14 Dec 1998 16:15:20 +0200 (IST)
+ Message-ID: <Pine.A41.4.05_heb2.07.9812141609500.58712-300000@nms1.cc.huji.ac.il>
+ Branch: cfgperl
+ ! t/pragma/warn/doio
+____________________________________________________________________________
+[ 2475] By: jhi on 1998/12/13 12:35:55
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: jhi@iki.fi
+ Cc: Carl_Adler@idx.com, perl5-porters@perl.org
+ Subject: Re: stuff related to malloc.c
+ Date: Sat, 12 Dec 1998 19:39:44 -0500 (EST)
+ Message-Id: <199812130039.TAA21704@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! malloc.c
+____________________________________________________________________________
+[ 2474] By: jhi on 1998/12/13 12:32:42
+ Log: Some notes about porting issues.
+ Branch: cfgperl
+ ! Porting/pumpkin.pod
+____________________________________________________________________________
+[ 2473] By: jhi on 1998/12/13 12:03:58
+ Log: From: Laszlo Molnar <ml1050@freemail.c3.hu>
+ To: Perl 5 Porters <perl5-porters@perl.org>
+ Subject: [patch 5.005_02] dos-djgpp update
+ Date: Sun, 13 Dec 1998 00:08:44 +0100
+ Message-ID: <19981213000844.C264@beeblebrox>
+ Branch: cfgperl
+ ! djgpp/config.over
+____________________________________________________________________________
+[ 2472] By: gbarr on 1998/12/12 17:12:28
+ Log: undo changes to Exporter.pm from #2312
+ Branch: maint-5.005/perl
+ ! lib/Exporter.pm
+____________________________________________________________________________
+[ 2465] By: jhi on 1998/12/12 12:31:21
+ Log: Document that qw() taints.
+
+ From: Christian Burger <burger@terra.mpikg-teltow.mpg.de>
+ To: perlbug@perl.com
+ Subject: taint problems
+ Date: Sun, 1 Nov 1998 22:28:41 +0100 (MET)
+ Message-Id: <199811012128.WAA23381@terra.mpikg-teltow.mpg.de>
+ Branch: cfgperl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 2464] By: jhi on 1998/12/11 14:09:51
+ Log: From: Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
+ To: dist-users@foretune.co.jp
+ Subject: (dist-users 871) dist-3.0@70 generates lots of main() without type
+ Date: Mon, 07 Dec 1998 20:13:04 -0400
+ Message-Id: <199812072313.UAA06181@sleipnir.valparaiso.cl>
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2463] By: jhi on 1998/12/11 13:29:54
+ Log: MAXPATHLEN.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 2462] By: jhi on 1998/12/11 08:37:58
+ Log: From: Mark Kettenis <kettenis@phys.uva.nl>
+ To: perl5-porters@perl.org
+ Subject: [PATCH]5.005_54 (CONFIG) Added support for GNU/Hurd
+ Date: Thu, 10 Dec 1998 22:00:57 +0100 (CET)
+ Message-Id: <199812102100.WAA00097@delius.kettenis.nl>
+ Branch: cfgperl
+ + hints/gnu.sh
+____________________________________________________________________________
+[ 2461] By: nick on 1998/12/10 21:00:50
+ Log: Date: Wed, 09 Dec 1998 22:16:50 PST
+ From: Vishal Bhatia <vishalb@hotmail.com>
+ 1. Fixes the bug reported by Robin Barker <rmb1@cise.npl.co.uk>
+ 2. Fixes the bug regarding return value of c-functions generated out
+ of perl subs. ( Just includes the patch I sent earlier)
+ 3. Incorporates the other changes that need to be done to get CC.pm
+ use ISA search for packages and methods on the same lines as C.pm
+
+ Vishal would appreciate comments about B::Stackobj changes from
+ someone knowing that module well.
+ Branch: perl
+ ! ext/B/B/C.pm ext/B/B/CC.pm ext/B/B/Stackobj.pm
+____________________________________________________________________________
+[ 2460] By: jhi on 1998/12/08 08:11:27
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes ext/B/B.pm ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm
+ !> ext/B/B/Deparse.pm perl.h pod/perl.pod pod/perl5005delta.pod
+ !> pod/perldiag.pod pod/perlfunc.pod pp_sys.c t/lib/io_unix.t
+ !> toke.c util.c
+____________________________________________________________________________
+[ 2459] By: jhi on 1998/12/07 07:50:11
+ Log: From: hansm@icgroup.nl
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on OPENSTEP-Mach 4_1 (UNINSTALLED)
+ Reply-To: hansmu@xs4all.nl
+ To: perlbug@perl.com
+ Date: Sun, 6 Dec 98 22:19:54 +0100
+ Message-Id: <9812062116.AA26445@icgned.icgroup.nl>
+ Branch: cfgperl
+ ! util.c
+____________________________________________________________________________
+[ 2458] By: gsar on 1998/12/07 06:00:55
+ Log: fix dup lexical
+ Branch: perl
+ ! ext/B/B/Deparse.pm t/lib/io_unix.t
+____________________________________________________________________________
+[ 2457] By: gsar on 1998/12/06 14:38:59
+ Log: mention limit on line numbers reported by diagnostics
+ Branch: perl
+ ! pod/perl.pod toke.c
+____________________________________________________________________________
+[ 2456] By: gsar on 1998/12/06 13:49:02
+ Log: branch perldelta.pod
+ Branch: maint-5.005/perl
+ +> pod/perldelta.pod
+____________________________________________________________________________
+[ 2455] By: gsar on 1998/12/06 13:47:21
+ Log: clobber perldelta.pod to reestablish branch from perl5005delta.pod
+ Branch: maint-5.005/perl
+ - pod/perldelta.pod
+____________________________________________________________________________
+[ 2454] By: gsar on 1998/12/06 13:35:31
+ Log: fix outdated/incorrect info about arbitrary limits
+ Branch: perl
+ ! Changes perl.h pod/perl.pod pod/perl5005delta.pod
+ ! pod/perldiag.pod pod/perlfunc.pod pp_sys.c util.c
+____________________________________________________________________________
+[ 2453] By: nick on 1998/12/05 16:14:42
+ Log: Avoid hard-coding op numbers
+ Update CC.pm to save %INC, and to co-exist with new C.pm
+ Branch: perl
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm
+____________________________________________________________________________
+[ 2452] By: nick on 1998/12/05 10:44:28
+ Log: B.xs had its own code to calculate hash() which differed from
+ PERL_HASH in hv.h - so all saved HV's were mangled - including %INC
+ which meant that run-time require was re-done.
+ Removed some debug from C.pm
+ Branch: perl
+ ! ext/B/B.xs ext/B/B/C.pm
+____________________________________________________________________________
+[ 2451] By: nick on 1998/12/04 21:58:49
+ Log: Snapshot of re-worked B::C which compiles Tk apps at least as
+ well as _54, but with pre-scan for classes and save the ISA scheme.
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 2450] By: nick on 1998/12/04 17:58:44
+ Log: Vishal Bhatia's patch as a basis.
+ Branch: perl
+ ! ext/B/B/C.pm ext/B/B/CC.pm
+____________________________________________________________________________
+[ 2449] By: jhi on 1998/12/04 16:39:21
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> t/op/goto.t t/op/tr.t
+____________________________________________________________________________
+[ 2448] By: gsar on 1998/12/04 06:06:49
+ Log: tweak test for UTEST
+ Branch: perl
+ ! t/op/tr.t
+____________________________________________________________________________
+[ 2444] By: jhi on 1998/12/03 14:37:22
+ Log: s/\bthe the\b/the/g *.pod
+ Branch: cfgperl
+ ! pod/perlfaq8.pod pod/perlfunc.pod pod/perlguts.pod
+____________________________________________________________________________
+[ 2443] By: jhi on 1998/12/03 13:39:53
+ Log: Change#2441 aftermath.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH thread.h vms/subconfigure.com
+____________________________________________________________________________
+[ 2441] By: jhi on 1998/12/03 08:15:13
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@cor.newman.upenn.edu
+ Subject: [PATCH 5.005_54]Initial VMS patches
+ Date: 3 Dec 1998 01:05:55 +0200
+ Message-ID: <MLIST_3.0.6.32.19981202141057.0339a7f0@ous.edu>
+
+ The patch to config_h.SH requires more study because
+ metaconfig needs to agree.
+ Branch: cfgperl
+ ! config_h.SH configure.com global.sym lib/ExtUtils/MM_VMS.pm
+ ! t/lib/textfill.t t/pragma/warning.t vms/descrip_mms.template
+ ! vms/gen_shrfls.pl vms/subconfigure.com vms/vmsish.h
+____________________________________________________________________________
+[ 2440] By: gsar on 1998/12/03 01:32:16
+ Log: add failed check-in of goto.t from change#1867
+ Branch: perl
+ ! t/op/goto.t
+____________________________________________________________________________
+[ 2437] By: jhi on 1998/12/02 18:03:51
+ Log: Fix most of the bad L<> links of
+
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ Subject: bad L<> links
+ Reply-to: tchrist@perl.com
+ To: perlbug@jhereg.perl.com
+ Date: Tue, 11 Aug 1998 10:58:07 -0500
+ Message-Id: <199808111658.KAA00484@jhereg.perl.com>
+
+ The ones not fixed may require darker Pod::HTML magic,
+ for example the perlguts.html#tags should work fine, IMHO.
+ Branch: cfgperl
+ ! pod/perl5005delta.pod pod/perlcall.pod pod/perldata.pod
+ ! pod/perldiag.pod pod/perlfaq5.pod pod/perlfaq7.pod
+ ! pod/perlfunc.pod pod/perlguts.pod pod/perllocale.pod
+ ! pod/perlobj.pod pod/perlport.pod pod/perlsub.pod
+ ! pod/perlvar.pod
+____________________________________________________________________________
+[ 2436] By: jhi on 1998/12/02 16:35:04
+ Log: One paste too many in #2345.
+ Branch: cfgperl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 2435] By: jhi on 1998/12/02 16:32:33
+ Log: Pod::Html and Pod::Text were not locale-savvy:
+ for example in =head1 all non-ASCII-\w-runs were
+ turned into underscores in NAME tags. This could
+ result in several NAME tags becoming identical.
+ Reported by:
+
+ From: Fyodor Krasnov <fyodor@aha.ru>
+ Subject: pod2html vs Russian Characters
+ To: Tom.Christiansen@snn.aha.ru, tchrist@perl.com
+ Date: Tue, 24 Nov 1998 19:00:36 +0300 (MSK)
+ Message-Id: <199811241600.TAA05149@stat.aha.ru>
+ Branch: cfgperl
+ ! lib/Pod/Html.pm lib/Pod/Text.pm
+____________________________________________________________________________
+[ 2434] By: jhi on 1998/12/02 10:29:00
+ Log: The real Mc5_54 integration.
+ Branch: cfgperl
+ !> Changes MANIFEST pod/perlhist.pod pp_hot.c
+____________________________________________________________________________
+[ 2433] By: jhi on 1998/12/02 08:52:13
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_xx] Missing redirection of simple test program
+ Date: Tue, 1 Dec 1998 13:40:12 -0500 (EST)
+ Message-Id: <Pine.SUN.3.96.981201133546.4288K-100000@newton.phys>
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2432] By: jhi on 1998/12/02 08:49:47
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ To: Perl Porters <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_xx] erroneous 'none' in lddlflags
+ Date: Tue, 1 Dec 1998 12:50:27 -0500 (EST)
+ Message-Id: <Pine.SUN.3.96.981201124929.4288H-100000@newton.phys>
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2431] By: jhi on 1998/12/01 16:11:50
+ Log: From: achampio@lehman.com (Alan Champion)
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on sun4-solaris 2.3 (UNINSTALLED)
+ To: perlbug@perl.com
+ Date: 1 Dec 1998 17:36:33 +0200
+ Message-ID: <MLIST_9812011518.AA00005@lonhpov1.lehman.com>
+
+ Skip NIS includes.
+ Branch: cfgperl
+ ! t/op/pwent.t
+____________________________________________________________________________
+[ 2430] By: gsar on 1998/12/01 12:12:50
+ Log: 5.005_54, as released
+ Branch: perl
+ ! Changes MANIFEST pod/perlhist.pod pp_hot.c
+____________________________________________________________________________
+[ 2429] By: jhi on 1998/12/01 11:28:39
+ Log: From: Anton Berezin <tobez@plab.ku.dk>
+ To: perl5-porters@perl.org
+ Subject: [PATCH 5.005_54] Configure - hints/freebsd.sh signal handler type
+ Date: 30 Nov 1998 19:46:24 +0100
+ Message-ID: <864srhhvcv.fsf@lion.plab.ku.dk>
+ Branch: cfgperl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2428] By: jhi on 1998/12/01 11:08:16
+ Log: Integrate from _54 mainperl modulo the NetBSD ifdef in util.c.
+ Branch: cfgperl
+ +> (branch 30 files)
+ !> (integrate 71 files)
+____________________________________________________________________________
+[ 2427] By: jhi on 1998/12/01 10:51:37
+ Log: Default to accepting a hinted $randfunc even when $csym
+ does not find it. (the previous defaylt behaviour was not
+ to accept).
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2426] By: jhi on 1998/12/01 10:13:03
+ Log: Separated the [:foo:] parsing to its own function.
+ Passes all tests.
+ Branch: cfgperl
+ ! regcomp.c
+____________________________________________________________________________
+[ 2425] By: jhi on 1998/12/01 08:22:49
+ Log: Typo in comments.
+ Branch: cfgperl
+ ! regexec.c
+____________________________________________________________________________
+[ 2424] By: jhi on 1998/12/01 08:21:38
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Debugger 'v' command
+ To: perl5-porters@perl.org (Mailing list Perl5)
+ Date: 1 Dec 1998 07:55:11 +0200
+ Message-ID: <MLIST_199812010534.AAA21371@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 2423] By: jhi on 1998/12/01 08:19:08
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Subject: [PATCH 5.005_03t1 && 5.005_54]dll linkage side decks for OS/390
+ To: perl5-porters@perl.org
+ Date: 1 Dec 1998 07:27:11 +0200
+ Message-ID: <MLIST_9812010508.AA07791@forte.com>
+ Branch: cfgperl
+ ! hints/os390.sh
+____________________________________________________________________________
+[ 2417] By: jhi on 1998/11/30 08:14:00
+ Log: s/SCM_CREDENTIALSS/SCM_CREDENTIAL/
+ Branch: cfgperl
+ ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 2416] By: jhi on 1998/11/30 08:00:15
+ Log: Undo #2395, seems more like a problem in netbsd-current.
+ Branch: cfgperl
+ ! util.c
----------------
-Version 5.004_53
+Version 5.005_54
----------------
____________________________________________________________________________
-[ 142] By: mbeattie on 1997/10/16 16:52:55
- Log: Add newly moved perl/ext/Thread/... files to MANIFEST.
- Branch: perl
- ! MANIFEST
+[ 2414] By: gsar on 1998/11/30 02:23:55
+ Log: more JPL tweaks
+ Branch: perl
+ - jpl/JNI/MANIFEST jpl/PerlInterpreter/Makefile
+ ! Changes MANIFEST jpl/JNI/JNI.pm jpl/README
+____________________________________________________________________________
+[ 2413] By: gsar on 1998/11/30 01:35:56
+ Log: stub bin/jpl that just runs JPL::Compile::files()
+ Branch: perl
+ + jpl/bin/jpl
+____________________________________________________________________________
+[ 2412] By: gsar on 1998/11/30 01:32:14
+ Log: delete symlink
+ Branch: perl
+ - jpl/bin/jpl
+____________________________________________________________________________
+[ 2410] By: gsar on 1998/11/30 01:30:44
+ Log: branch jpl from perlext to perl
+ Branch: perl
+ +> (branch 30 files)
+____________________________________________________________________________
+[ 2407] By: gsar on 1998/11/30 01:24:53
+ Log: JPL tweaks to build with 5.005
+ Branch: perlext
+ ! jpl/JNI/JNI.xs jpl/JNI/typemap jpl/JPL/Compile.pm
+ ! jpl/PerlInterpreter/PerlInterpreter.c jpl/README
+____________________________________________________________________________
+[ 2406] By: gsar on 1998/11/30 00:55:54
+ Log: integrate changes#2273,2274,2288,2291 from maint-5.004
+ Branch: perl
+ ! Porting/patchls doio.c lib/Sys/Syslog.pm t/op/die_exit.t
+____________________________________________________________________________
+[ 2405] By: gsar on 1998/11/30 00:28:55
+ Log: patchlevel up to 54
+ Branch: perl
+ ! patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 2403] By: gsar on 1998/11/29 23:35:50
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure Porting/Glossary Porting/config.sh Porting/config_H
+ !> config_h.SH pod/perlfunc.pod t/op/grent.t t/op/pwent.t util.c
+____________________________________________________________________________
+[ 2402] By: gsar on 1998/11/29 23:08:42
+ Log: sync Text::Wrap version number
+ Branch: perl
+ ! lib/Text/Wrap.pm
+____________________________________________________________________________
+[ 2401] By: gsar on 1998/11/29 22:56:21
+ Log: textfill.t tweak
+ Branch: perl
+ ! t/lib/textfill.t
+____________________________________________________________________________
+[ 2400] By: gsar on 1998/11/29 22:50:41
+ Log: update to Text::Wrap 98.112901 from David Muir Sharnoff
+ <muir@idiom.com>
+ Branch: perl
+ + t/lib/textfill.t
+ ! MANIFEST lib/Text/Wrap.pm
+____________________________________________________________________________
+[ 2399] By: gsar on 1998/11/29 22:28:05
+ Log: updated to Text::Wrap 98.112801 from CPAN; one published change
+ has happened without the authors knowledge or consent; the subversive
+ version (which is in 5.00502) breaks one of the tests in the
+ authors testsuite; attempts are being made to find a fix that
+ avoids breaking code already running with the 5.005_02 version
+ From: David Muir Sharnoff <muir@idiom.com>
+ Date: Sat, 28 Nov 1998 04:34:17 PST
+ Message-Id: <199811281234.EAA03082@idiom.com>
+ Subject: Updated Text::Wrap, Time::ParseDate, File::Flock
+ Branch: perl
+ ! lib/Text/Wrap.pm t/lib/textwrap.t
+____________________________________________________________________________
+[ 2397] By: nick on 1998/11/29 20:13:58
+ Log: Update docs and English.pm for $^C
+ Branch: perl
+ ! lib/English.pm pod/perlvar.pod
+____________________________________________________________________________
+[ 2396] By: jhi on 1998/11/29 20:13:03
+ Log: Mirror #2384.
+ Branch: cfgperl
+ ! t/op/pwent.t
+____________________________________________________________________________
+[ 2395] By: jhi on 1998/11/29 19:59:12
+ Log: Newer NetBSDs don't have NSIG in <sys/signal.h>, they need <signal.h>.
+ Branch: cfgperl
+ ! util.c
+____________________________________________________________________________
+[ 2394] By: gsar on 1998/11/29 19:49:08
+ Log: updated perlreftut.pod
+ Branch: perl
+ ! pod/perlreftut.pod
+____________________________________________________________________________
+[ 2393] By: gsar on 1998/11/29 19:31:56
+ Log: misc tweaks
+ Branch: perl
+ ! ext/IO/Makefile.PL lib/Test.pm t/lib/io_poll.t t/op/sort.t
+____________________________________________________________________________
+[ 2392] By: gsar on 1998/11/29 19:31:18
+ Log: notes about -DPERL_POLLUTE
+ Branch: perl
+ ! INSTALL pod/perldelta.pod win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2391] By: gsar on 1998/11/29 19:13:52
+ Log: explain various win32 build caveats more clearly
+ Branch: perl
+ ! README.win32 win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2390] By: gsar on 1998/11/29 16:51:59
+ Log: remove I_POLL detection (Configure will do that now)
+ Branch: perl
+ ! ext/IO/Makefile.PL
+____________________________________________________________________________
+[ 2389] By: jhi on 1998/11/29 16:39:16
+ Log: Add I_POLL for IO 1.20.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH
+____________________________________________________________________________
+[ 2388] By: gsar on 1998/11/29 16:23:30
+ Log: add p4desc (augments 'p4 describe' output with diffs for new files)
+ Branch: perl
+ + Porting/p4desc
+ ! MANIFEST
+____________________________________________________________________________
+[ 2387] By: gsar on 1998/11/29 16:08:03
+ Log: another threads reliability fix: serialize writes to thr->threadsv
+ avoid most uses of PL_na (which is much more inefficient than a
+ simple local); update docs to suit; PL_na now being thr->Tna may
+ be a minor compatibility issue for extensions--will require dTHR
+ outside of XSUBs (those get automatic dTHR)
+ Branch: perl
+ ! XSUB.h djgpp/djgpp.c doio.c doop.c dump.c ext/B/B.xs
+ ! ext/DB_File/DB_File.xs ext/DynaLoader/dl_next.xs
+ ! ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs ext/Thread/Thread.xs
+ ! ext/attrs/attrs.xs gv.c malloc.c mg.c op.c
+ ! os2/OS2/REXX/REXX.xs os2/os2.c perl.c perly.c perly.y
+ ! pod/perlcall.pod pod/perlembed.pod pod/perlguts.pod
+ ! pod/perlxs.pod pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c run.c sv.c
+ ! t/op/pwent.t taint.c toke.c universal.c vmesa/vmesa.c
+ ! vms/ext/Stdio/Stdio.xs vms/perly_c.vms vms/vms.c win32/win32.c
+____________________________________________________________________________
+[ 2386] By: jhi on 1998/11/29 15:40:42
+ Log: Tune the "if" entry.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2385] By: gsar on 1998/11/29 12:40:28
+ Log: various fixes for race conditions under threads: mutex locks based
+ on PL_threadnum were seriously flawed, since it means more than one
+ thread could enter the critical region; PL_na was global instead of
+ thread-local; child thread could finish and free thr structures
+ before Thread->new() got around to creating the Thread object;
+ cv_clone() needed locking, as it mucks with PL_comppad and other
+ global data; new_struct_thread() needed to lock template-thread's
+ mutex while copying its data
+ Branch: perl
+ ! embedvar.h ext/Thread/Thread.xs gv.c op.c perl.c perlvars.h
+ ! pp_hot.c thrdvar.h thread.h util.c win32/win32thread.c
+____________________________________________________________________________
+[ 2384] By: gsar on 1998/11/29 10:54:38
+ Log: s/warn/print/ on multiply defined groups
+ Branch: perl
+ ! t/op/grent.t
+____________________________________________________________________________
+[ 2383] By: gsar on 1998/11/29 10:48:39
+ Log: backout change#2334
+ Branch: perl
+ ! pod/perlfunc.pod pp_hot.c sv.c thrdvar.h
+____________________________________________________________________________
+[ 2382] By: jhi on 1998/11/29 10:33:40
+ Log: Better NetInfo behaviour.
+ Branch: cfgperl
+ ! t/op/grent.t t/op/pwent.t
+____________________________________________________________________________
+[ 2381] By: jhi on 1998/11/29 10:08:15
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> ext/IO/ChangeLog ext/IO/lib/IO/Dir.pm ext/IO/lib/IO/Poll.pm
+ +> ext/IO/lib/IO/Socket/INET.pm ext/IO/lib/IO/Socket/UNIX.pm
+ +> ext/IO/poll.c ext/IO/poll.h pod/perlreftut.pod
+ +> t/lib/io_const.t t/lib/io_dir.t t/lib/io_multihomed.t
+ +> t/lib/io_poll.t t/lib/io_unix.t
+ !> (integrate 58 files)
+____________________________________________________________________________
+[ 2380] By: gsar on 1998/11/29 08:22:49
+ Log: prefer IO::Handle for IO if FileHandle:: is empty (as suggested by
+ Tim Bunce)
+ Branch: perl
+ ! gv.c
+____________________________________________________________________________
+[ 2379] By: gsar on 1998/11/29 07:06:43
+ Log: fix for pat.t failure under USE_THREADS
+ Branch: perl
+ ! pp_ctl.c regexec.c
+____________________________________________________________________________
+[ 2378] By: nick on 1998/11/28 22:46:57
+ Log: More C.pm tweaks
+ Save globs even if we have saved cv itself before - may be imported.
+
+ While we don't save "bootstrap" CV we need to provide a stub,
+ so that if we require it later we don't fall through and attempt
+ to DynaLoad module again.
+
+ Attempt to save %INC so that "require" does not reload things
+ we have compiled-in (does not work right yet - seems to be due
+ to PL_incgv being created in perl_parse() current scheme setting
+ GvHV() is "better" than saving the glob, but still does not
+ work as I expect).
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 2377] By: gsar on 1998/11/28 22:30:38
+ Log: various tweaks; result passes all tests for normal build on Solaris;
+ fails two pat.t tests under USE_THREADS; io_poll.t test#3 fails on
+ win32 due to lack of select() that works on non-socket fds
+ Branch: perl
+ ! ext/IO/poll.c regcomp.c regexec.c scope.c
+ ! t/lib/io_multihomed.t win32/makefile.mk
+____________________________________________________________________________
+[ 2376] By: gsar on 1998/11/28 20:44:39
+ Log: add $config_args to perl -V display (suggested by Ilya Zakharevich)
+ Branch: perl
+ ! myconfig
+____________________________________________________________________________
+[ 2375] By: gsar on 1998/11/28 20:42:58
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ !> Configure ext/POSIX/hints/dynixptx.pl myconfig t/op/grent.t
+ !> t/op/pwent.t t/op/undef.t t/pragma/locale.t util.c
+____________________________________________________________________________
+[ 2374] By: gsar on 1998/11/28 20:02:03
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 5 Nov 1998 02:21:12 -0500 (EST)
+ Message-Id: <199811050721.CAA27998@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00553] Yet another OS/2 patch
+ Branch: perl
+ ! os2/Changes os2/Makefile.SHs os2/os2.c t/pragma/warn/op
+____________________________________________________________________________
+[ 2373] By: gsar on 1998/11/28 19:30:06
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 28 Nov 1998 01:51:56 -0500 (EST)
+ Message-Id: <199811280651.BAA18095@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Change $#+
+ Branch: perl
+ ! mg.c pod/perlvar.pod t/op/pat.t
+____________________________________________________________________________
+[ 2372] By: gsar on 1998/11/28 19:28:00
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 28 Nov 1998 00:33:17 -0500 (EST)
+ Message-Id: <199811280533.AAA25654@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Finishing off SNOBOL: $1 in (?{})
+ Branch: perl
+ ! embedvar.h mg.c objXSUB.h perl.c regexec.c t/op/pat.t
+ ! thrdvar.h
+____________________________________________________________________________
+[ 2371] By: gsar on 1998/11/28 19:23:53
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 27 Nov 1998 16:16:48 -0500 (EST)
+ Message-Id: <199811272116.QAA03502@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] better -Mre=debugcolor
+ Branch: perl
+ ! embedvar.h objXSUB.h regexec.c thrdvar.h
+____________________________________________________________________________
+[ 2370] By: gsar on 1998/11/28 19:21:17
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 27 Nov 1998 15:22:19 -0500 (EST)
+ Message-Id: <199811272022.PAA17874@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] regcolors
+ Branch: perl
+ ! embed.h global.sym objXSUB.h proto.h regcomp.c regexec.c
+____________________________________________________________________________
+[ 2369] By: gsar on 1998/11/28 19:00:15
+ Log: allow final period in a file (not followed by a newline) to
+ terminate format spec
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 2368] By: gsar on 1998/11/28 18:58:25
+ Log: Liblist tweak suggested by Swen Thuemmler <Swen.Thuemmler@paderlinx.de>;
+ add C<$Config{installarchlib}/CORE> to the default locations searched
+ on win32
+ Branch: perl
+ ! lib/ExtUtils/Liblist.pm
+____________________________________________________________________________
+[ 2367] By: gsar on 1998/11/28 18:46:05
+ Log: applied suggested patch with PERL_OBJECT tweaks
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 26 Nov 1998 02:46:20 -0500 (EST)
+ Message-Id: <199811260746.CAA23164@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] Enable $_ and pos() inside (?{ CODE }) in RExen
+ Branch: perl
+ ! embed.h embed.pl embedvar.h objXSUB.h pp_ctl.c proto.h
+ ! regexec.c t/op/pat.t thrdvar.h
+____________________________________________________________________________
+[ 2366] By: gsar on 1998/11/28 18:38:34
+ Log: additional documentation for qr//
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199811260751.CAA24560@monk.mps.ohio-state.edu>
+ Date: Thu, 26 Nov 1998 02:51:09 -0500 (EST)
+ Subject: [PATCH 5.005_*] Documentation (fwd)
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlop.pod pod/perlpod.pod
+____________________________________________________________________________
+[ 2365] By: gsar on 1998/11/28 18:35:35
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 25 Nov 1998 23:33:45 -0500 (EST)
+ Message-Id: <199811260433.XAA29281@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Fix \G in REx without //g
+ Branch: perl
+ ! cop.h embedvar.h objXSUB.h pp.c pp_ctl.c pp_hot.c regexec.c
+ ! regexp.h t/op/pat.t thrdvar.h
+____________________________________________________________________________
+[ 2364] By: gsar on 1998/11/28 18:24:20
+ Log: update Test.pm to Test-1.12; tweak 're' detection
+ Branch: perl
+ ! lib/Test.pm
+____________________________________________________________________________
+[ 2363] By: gsar on 1998/11/28 18:12:04
+ Log: avoid command-line quoting portability problems in lex_assign.t
+ Branch: perl
+ ! t/op/lex_assign.t
+____________________________________________________________________________
+[ 2362] By: gsar on 1998/11/28 18:08:50
+ Log: From: John Tobey <jtobey@channel1.com>
+ Date: Thu, 19 Nov 1998 14:14:15 -0500 (EST)
+ Message-Id: <m0zgZWx-000FOgC@feynman.localnet>
+ Subject: PATCH: document English.pm sawampersand and thread issues
+ Branch: perl
+ ! lib/English.pm pod/perlvar.pod
+____________________________________________________________________________
+[ 2361] By: gsar on 1998/11/28 18:03:04
+ Log: fix uninitialized warnings
+ From: Brian Callaghan <callagh@itginc.com>
+ Date: Thu, 19 Nov 1998 17:49:10 -0800
+ Message-Id: <3654CA96.B64FCAEB@itginc.com>
+ Subject: Complete.pm patch (version 1.1)
+ Branch: perl
+ ! lib/Term/Complete.pm
+____________________________________________________________________________
+[ 2360] By: gsar on 1998/11/28 17:59:16
+ Log: s/Array/List/ suggested by John Tobey
+ Branch: perl
+ ! pod/perldata.pod
+____________________________________________________________________________
+[ 2359] By: gsar on 1998/11/28 17:47:48
+ Log: update tie() entry in perlfunc to reflect TIEARRAY and TIEHANDLE
+ Branch: perl
+ ! lib/Tie/Handle.pm pod/perlfunc.pod
+____________________________________________________________________________
+[ 2358] By: jhi on 1998/11/28 17:23:15
+ Log: Revamp the locale tests.
+ (0) Instead of rewiring a few locales scan for them.
+ (1) Bogus test #101 removed.
+ (2) All the locales are checked, the lists of failed
+ and non-failed ones are displayed.
+ (3) The test #103 is again 'active' so that it may fail.
+ (4) To balance (3) a hopefully pacifying message is shown
+ if the #103 fails.
+ Branch: cfgperl
+ ! t/pragma/locale.t
+____________________________________________________________________________
+[ 2357] By: gsar on 1998/11/28 17:21:07
+ Log: add perlreftut.pod
+ Branch: perl
+ + pod/perlreftut.pod
+ ! MANIFEST pod/Makefile pod/buildtoc pod/perl.pod
+ ! pod/perlref.pod pod/roffitall vms/descrip_mms.template
+ ! win32/pod.mak
+____________________________________________________________________________
+[ 2356] By: jhi on 1998/11/28 16:58:01
+ Log: Change #2346 fallout.
+ Branch: cfgperl
+ ! t/op/undef.t
+____________________________________________________________________________
+[ 2355] By: gsar on 1998/11/28 16:46:43
+ Log: IO.xs tweaks; avoid coredump in io_xs.t; remove newCONSTSUB();
+ ANSI prototypes
+ Branch: perl
+ ! ext/IO/IO.xs
+____________________________________________________________________________
+[ 2354] By: gsar on 1998/11/28 16:08:07
+ Log: add IO-1.20; mess with t/lib/io_*.t in an attempt to
+ keep platform hacks that aren't in the 1.20 dist; add new files
+ to MANIFEST; hack Makefile.PL; result hasn't been tested
+ anywhere
+ Branch: perl
+ + ext/IO/ChangeLog ext/IO/lib/IO/Dir.pm ext/IO/lib/IO/Poll.pm
+ + ext/IO/lib/IO/Socket/INET.pm ext/IO/lib/IO/Socket/UNIX.pm
+ + ext/IO/poll.c ext/IO/poll.h t/lib/io_const.t t/lib/io_dir.t
+ + t/lib/io_multihomed.t t/lib/io_poll.t t/lib/io_unix.t
+ ! MANIFEST ext/IO/IO.pm ext/IO/IO.xs ext/IO/Makefile.PL
+ ! ext/IO/README ext/IO/lib/IO/File.pm ext/IO/lib/IO/Handle.pm
+ ! ext/IO/lib/IO/Pipe.pm ext/IO/lib/IO/Seekable.pm
+ ! ext/IO/lib/IO/Select.pm ext/IO/lib/IO/Socket.pm
+ ! t/lib/io_sock.t t/lib/io_udp.t
+____________________________________________________________________________
+[ 2353] By: jhi on 1998/11/28 15:51:03
+ Log: Locale collation, ctype, and numeric, were initialized wrong
+ (if LC_ALL or LANG were unset, so were the collation/ctype/numeric),
+ as reported by
+
+ From: Ilya.Sandler@etak.com (Ilya Sandler)
+ Subject: a bug in locale handling: LC_COLLATE ignored sometimes
+ To: perlbug@perl.com
+ Date: 25 Nov 1998 04:53:52 +0200
+ Message-ID: <MLIST_199811250226.SAA12590@axi001.etak.sw>
+ Branch: cfgperl
+ ! util.c
+____________________________________________________________________________
+[ 2352] By: nick on 1998/11/28 15:21:59
+ Log: Implement $^C to allow perl access to -c flag - I think this
+ was agreed once...
+ Branch: perl
+ ! gv.c mg.c
+____________________________________________________________________________
+[ 2351] By: jhi on 1998/11/28 15:14:24
+ Log: Change #2251 fixup.
+ Branch: cfgperl
+ ! myconfig
+____________________________________________________________________________
+[ 2350] By: jhi on 1998/11/28 14:58:19
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> ext/Devel/Peek/Changes ext/Devel/Peek/Makefile.PL
+ +> ext/Devel/Peek/Peek.pm ext/Devel/Peek/Peek.xs
+ +> pod/perl5005delta.pod
+ !> (integrate 49 files)
+____________________________________________________________________________
+[ 2349] By: jhi on 1998/11/28 14:27:36
+ Log: Passwd and group file groveling.
+ Branch: cfgperl
+ ! t/op/grent.t t/op/pwent.t
+____________________________________________________________________________
+[ 2348] By: gsar on 1998/11/28 14:09:50
+ Log: more conservative version of changes#2345,2346,2347; those break
+ C<defined(@{"foo::ISA"})> which seems to be extensively used in
+ the libs :-(
+ Branch: perl
+ ! pp.c t/op/method.t
+____________________________________________________________________________
+[ 2347] By: gsar on 1998/11/28 13:36:08
+ Log: tweak bogus test
+ Branch: perl
+ ! t/op/method.t
+____________________________________________________________________________
+[ 2346] By: gsar on 1998/11/28 13:20:34
+ Log: test cases for previous change
+ Branch: perl
+ ! t/op/undef.t
+____________________________________________________________________________
+[ 2345] By: gsar on 1998/11/28 13:07:17
+ Log: fix typo in pp_defined() causing C<defined %tied> to fail
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 2344] By: gsar on 1998/11/28 13:03:29
+ Log: s/comment/comment_t/ tweak (suggested by John Gorman
+ <jgorman@webbysoft.com>)
+ Branch: perl
+ ! ext/B/B/Assembler.pm ext/B/B/Disassembler.pm
+____________________________________________________________________________
+[ 2343] By: gsar on 1998/11/28 12:52:40
+ Log: add (stub) perldelta.pod
+ Branch: perl
+ + pod/perldelta.pod
+____________________________________________________________________________
+[ 2342] By: gsar on 1998/11/28 12:49:26
+ Log: rename perldelta.pod to perl5005delta.pod in preparation for
+ starting a new one
+ Branch: perl
+ +> pod/perl5005delta.pod
+ - pod/perldelta.pod
+ ! MANIFEST pod/perl.pod
+____________________________________________________________________________
+[ 2341] By: gsar on 1998/11/28 12:41:55
+ Log: fix MALLOC_LOCK #define
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 2340] By: gsar on 1998/11/28 12:18:23
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 15 Nov 1998 20:25:50 -0500 (EST)
+ Message-Id: <199811160125.UAA05268@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_53] OS/2 events get closer to Perl
+ Branch: perl
+ ! os2/Changes os2/os2.c os2/os2.sym os2/os2ish.h
+____________________________________________________________________________
+[ 2339] By: jhi on 1998/11/28 11:59:01
+ Log: Add -lm to dynix/ptx POSIX hints.
+ From: "Martin J. Bligh" <mbligh@sequent.com>
+ To: jhi@iki.fi
+ Subject: Re: Making Perl work on DYNIX/ptx
+ Date: Wed, 25 Nov 1998 10:34:41 -0800
+ Message-ID: <1457015007.911990081@w-186d219.rhe.sequent.com>
+ Branch: cfgperl
+ ! ext/POSIX/hints/dynixptx.pl
+____________________________________________________________________________
+[ 2338] By: jhi on 1998/11/28 11:57:19
+ Log: Detypo.
+ Branch: cfgperl
+ ! lib/filetest.pm
+____________________________________________________________________________
+[ 2337] By: jhi on 1998/11/28 11:56:29
+ Log: Better LD_LIBRARY_PATH instructions for Bourneists.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2336] By: gsar on 1998/11/28 11:41:14
+ Log: teach CPAN.pm to ignore beta perl distributions when looking for
+ modules
+ From: root@dogberry.rutgers.edu (root)
+ Date: Thu, 12 Nov 1998 23:08:39 -0500
+ Message-Id: <199811130408.XAA10578@dogberry.rutgers.edu>
+ Subject: recompile tries getting a perl distribution
+ Branch: perl
+ ! lib/CPAN.pm
+____________________________________________________________________________
+[ 2335] By: gsar on 1998/11/28 11:27:46
+ Log: make $1 et al readonly under threads; make C<undef $1> fail like
+ C<$1 = undef> does
+ Branch: perl
+ ! op.c pp.c t/op/undef.t
+____________________________________________________________________________
+[ 2334] By: gsar on 1998/11/28 10:24:52
+ Log: s/Regexp/re/ and clarify policy on lowercased object namespaces
+ Branch: perl
+ ! pod/perlfunc.pod pp_hot.c sv.c thrdvar.h
+____________________________________________________________________________
+[ 2333] By: gsar on 1998/11/28 09:36:40
+ Log: document changed PERL_HASH()
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlguts.pod
+____________________________________________________________________________
+[ 2332] By: nick on 1998/11/27 21:10:27
+ Log: Handle INIT list in C.pm
+ 1. Provide init_av() from B.xs
+ 2. Export it in B.pm
+ 3. Use it in C.pm
+ Also disable some pruning in savecv() which seems to undo
+ my previous patch.
+ Experimental feature - save pathnames of .so files in easily
+ grep-able form for use in wrapper to feed to linker.
+ Branch: perl
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/C.pm
+____________________________________________________________________________
+[ 2327] By: gsar on 1998/11/27 15:12:01
+ Log: integrate change#2315 from maint-5.005
+ Branch: perl
+ ! t/op/sort.t
+ !> op.c sv.c
+____________________________________________________________________________
+[ 2326] By: gsar on 1998/11/27 15:00:42
+ Log: integrate changes#2304,2305,2306,2308 from maint-5.005
+ Branch: perl
+ !> ext/DynaLoader/dl_mpeix.xs installperl lib/ExtUtils/MM_Unix.pm
+ !> lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MakeMaker.pm
+ !> lib/ExtUtils/typemap
+____________________________________________________________________________
+[ 2325] By: gsar on 1998/11/27 14:46:18
+ Log: malloc bugfix and documentation from Ilya Zakharevich
+ Date: Tue, 24 Nov 1998 17:24:55 -0500 (EST)
+ Message-Id: <199811242224.RAA22618@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Re: Internal coredump
+ --
+ Date: Thu, 26 Nov 1998 03:06:10 -0500 (EST)
+ Message-Id: <199811260806.DAA28913@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] malloc.c documentation
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 2324] By: gsar on 1998/11/27 14:41:38
+ Log: B::C tweaks to allow Tk compiles from Nick Ing-Simmons
+ Branch: perl
+ ! ext/B/B/C.pm
+____________________________________________________________________________
+[ 2323] By: gsar on 1998/11/27 14:33:44
+ Log: From: maeda@src.ricoh.co.jp
+ Date: Tue, 24 Nov 1998 10:37:45 +0900
+ Message-Id: <199811240137.KAA05867@luna.src.ricoh.co.jp>
+ Subject: format "..." bug
+ Branch: perl
+ ! pp_ctl.c t/op/write.t
+____________________________________________________________________________
+[ 2322] By: gsar on 1998/11/27 14:20:12
+ Log: add ext/Devel/Peek
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Mon, 23 Nov 1998 00:48:11 +0100
+ Message-ID: <36589ec9.49964585@smtp1.ibm.net>
+ Subject: [PATCH 5.005_53] Devel::Peek integration
+ Branch: perl
+ + ext/Devel/Peek/Changes ext/Devel/Peek/Makefile.PL
+ + ext/Devel/Peek/Peek.pm ext/Devel/Peek/Peek.xs
+ ! MANIFEST dump.c embed.h embedvar.h global.sym intrpvar.h
+ ! objXSUB.h perl.c perl.h proto.h sv.c sv.h thrdvar.h
+ ! win32/GenCAPI.pl win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2321] By: gsar on 1998/11/27 13:03:08
+ Log: ensure 'make regen_headers' even without perl installed
+ (suggested by Ilya Zakharevich)
+ Branch: perl
+ ! bytecode.pl warning.pl
+____________________________________________________________________________
+[ 2320] By: gsar on 1998/11/27 12:58:36
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 9 Nov 1998 19:03:25 -0500 (EST)
+ Message-Id: <199811100003.TAA05815@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Cosmetic malloc patch
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 2319] By: gsar on 1998/11/27 12:56:13
+ Log: eliminate dup hunk from integration
+ Branch: perl
+ ! lib/filetest.pm perl.h
+____________________________________________________________________________
+[ 2318] By: gsar on 1998/11/27 12:50:08
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ +> ext/DB_File/hints/dynixptx.pl ext/POSIX/hints/dynixptx.pl
+ ! pod/perlfaq4.pod
+ !> (integrate 30 files)
+____________________________________________________________________________
+[ 2317] By: jhi on 1998/11/27 11:38:13
+ Log: C<-x>.
+ Branch: cfgperl
+ ! lib/filetest.pm
+____________________________________________________________________________
+[ 2316] By: jhi on 1998/11/27 11:10:22
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> XSUB.h embed.h embed.pl embedvar.h ext/Thread/Thread.xs
+ !> iperlsys.h mg.c objXSUB.h op.c pp_ctl.c pp_sys.c proto.h
+ !> t/comp/package.t t/lib/dumper.t t/pragma/warn/pp_ctl
+ !> universal.c util.c win32/GenCAPI.pl win32/win32.h
+ !> win32/win32sck.c
____________________________________________________________________________
-[ 141] By: mbeattie on 1997/10/16 16:42:13
- Log: Move perlext/Thread into perl/ext/Thread.
- Branch: perl
- +> ext/Thread/Makefile.PL ext/Thread/Notes ext/Thread/README
- +> ext/Thread/Thread.pm ext/Thread/Thread.xs
- +> ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
- +> ext/Thread/create.t ext/Thread/io.t ext/Thread/join.t
- +> ext/Thread/join2.t ext/Thread/list.t ext/Thread/lock.t
- +> ext/Thread/queue.t ext/Thread/sync.t ext/Thread/sync2.t
- +> ext/Thread/typemap ext/Thread/unsync.t ext/Thread/unsync2.t
- +> ext/Thread/unsync3.t ext/Thread/unsync4.t
- ! Configure
- Branch: perlext
- - Thread/Makefile.PL Thread/Notes Thread/README Thread/Thread.pm
- - Thread/Thread.xs Thread/Thread/Queue.pm
- - Thread/Thread/Semaphore.pm Thread/create.t Thread/io.t
- - Thread/join.t Thread/join2.t Thread/list.t Thread/lock.t
- - Thread/queue.t Thread/sync.t Thread/sync2.t Thread/typemap
- - Thread/unsync.t Thread/unsync2.t Thread/unsync3.t
- - Thread/unsync4.t
-____________________________________________________________________________
-[ 140] By: mbeattie on 1997/10/16 16:26:53
- Log: Correct threads_mutex locking in main thread destruction.
- Add per-interp thrsv to hold SV struct thread for main thread.
- Move Thread.xs MUTEX_DESTROY from end of threadstart to remove_thread.
- Add Thread/list.t test of Thread->list method.
- Let Thread::Semaphore methods up and down take an extra argument.
- Branch: perl
- ! embed.h interp.sym perl.c perl.h thread.h
- Branch: perlext
- + Thread/list.t
- ! Thread/Thread.xs Thread/Thread/Semaphore.pm
-____________________________________________________________________________
-[ 139] By: mbeattie on 1997/10/16 14:01:11
- Log: Fix up merge with 5.004_04.
- Branch: perl
- ! op.c perl.c t/lib/dosglob.t
-____________________________________________________________________________
-[ 138] By: TimBunce on 1997/10/16 12:58:22
- Log: Fix-up PerForce type for t/lib/dosglob.t from text to xtext
- Branch: maint-5.004/perl
- ! t/lib/dosglob.t
-____________________________________________________________________________
-[ 137] By: mbeattie on 1997/10/16 11:09:25
- Log: Merge maint-5.004 branch (5.004_04) with mainline.
- Branch: perl
- +> hints/os390.sh lib/base.pm t/lib/dosglob.t
- - ext/util/extliblist
- !> (integrate 132 files)
-____________________________________________________________________________
-[ 135] By: gsar on 1997/10/15 21:46:05
- Log: Win32 changes over 5.004_52:
- - rearranged MUTEX_LOCK()s in perl_destroy so that we don't call it
- on an already locked mutex.
- - other minor tweaks.
- Now builds and runs win32-version of Thread_52, passing all tests.
- Branch: win32/perl
- ! perl.c proto.h thread.h
-____________________________________________________________________________
-[ 134] By: gsar on 1997/10/15 18:19:31
- Log: fixup makefile.mk conflict.
- Branch: win32/perl
- ! win32/makefile.mk
+[ 2315] By: gbarr on 1998/11/27 05:16:50
+ Log: integrate change#2246 from mainline, while still allowing
+ C<sort $globref @foo>
+
+ allow C<sort $coderef @foo>
+ Branch: maint-5.005/perl
+ ! op.c sv.c
+ !> t/op/sort.t
+____________________________________________________________________________
+[ 2308] By: gbarr on 1998/11/27 00:11:44
+ Log: Updates for MPE/iX DynaLoader and installperl, via private mail
+ forwarded by Jarkko Hietaniemi from Mark Bixby
+ Branch: maint-5.005/perl
+ ! ext/DynaLoader/dl_mpeix.xs installperl
+____________________________________________________________________________
+[ 2306] By: gbarr on 1998/11/26 23:44:47
+ Log: Allow PL_FILES to have multiple targets from one source by allowing
+ an array ref as the value in the hash
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2305] By: gbarr on 1998/11/26 23:38:06
+ Log: fix unsigned variables to use SvUV and sv_setuv
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/typemap
____________________________________________________________________________
-[ 133] By: gsar on 1997/10/15 18:02:46
- Log: Integrated latest changes from mainline into win32.
- Branch: win32/perl
- +> fakethr.h
- !> MANIFEST Porting/makerel Porting/patchls README.threads
- !> Todo.5.005 perl.c pp_hot.c thread.h util.c win32/config.bc
- !> win32/config.vc win32/config_H.bc win32/config_H.vc
- !> win32/makefile.mk
+[ 2304] By: gbarr on 1998/11/26 23:36:17
+ Log: Fix embeded \n in ABSTRACT and <> in AUTHOR
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 2301] By: gsar on 1998/11/26 10:16:54
+ Log: fix PL_defoutgv leak under threads
+ Branch: perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 2300] By: gsar on 1998/11/26 09:04:44
+ Log: properly free temporaries created by threads
+ Branch: perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 2299] By: gsar on 1998/11/26 06:51:16
+ Log: fix C<if (...) { package Foo; ... }> misoptimization that fails
+ to set the package for the block properly
+ Branch: perl
+ ! op.c t/comp/package.t t/lib/dumper.t
+____________________________________________________________________________
+[ 2298] By: nick on 1998/11/24 22:04:20
+ Log: Part-1 of tweaks to allow Tk to be "compiled"
+ Make XS_UNIVERSAL_xxx non-static so they can be found in libperl.
+ (May also need attention to exports etc. - to follow.)
+ Branch: perl
+ ! universal.c
+____________________________________________________________________________
+[ 2294] By: jhi on 1998/11/23 10:44:26
+ Log: The new socket tests need in some platforms
+ to #include <sys/types.h>.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2293] By: jhi on 1998/11/23 10:33:42
+ Log: From: Gerben Wierda <G.C.Th.Wierda@AWT.nl>
+ To: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Subject: Re: Test results for perl5.005_53 under NEXTSTEP 3.3 (intel)
+ Date: Mon, 23 Nov 1998 10:07:04 +0100
+ Message-Id: <9811230907.AA06484@AWT.nl>
+
+ NeXTstep NetInfo uses nidump to get the user/group databases.
+ Branch: cfgperl
+ ! t/op/grent.t t/op/pwent.t
+____________________________________________________________________________
+[ 2291] By: TimBunce on 1998/11/22 22:23:09
+ Log: Updated Porting/patchls utility.
+ Branch: maint-5.004/perl
+ ! Porting/patchls
+____________________________________________________________________________
+[ 2288] By: TimBunce on 1998/11/22 21:46:11
+ Log: Title: "Buglet in Sys::Syslog.pm (with fix)"
+ From: Henrik Tougaard <ht.000@foa.dk>
+ Msg-ID: <Pine.OSF.3.95.981117092651.1492C-100000@sula.pensam.dk>
+ Files: lib/Sys/Syslog.pm
+ Branch: maint-5.004/perl
+ ! lib/Sys/Syslog.pm
+____________________________________________________________________________
+[ 2286] By: jhi on 1998/11/22 19:08:42
+ Log: Change#2284 aid: allow also for plain old MSG_ and SCM_ #defines.
+ Branch: cfgperl
+ ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 2285] By: jhi on 1998/11/22 18:21:07
+ Log: MSG_PROXY for GNU/Hurd (previously we believed that
+ all GNU libc platforms have MSG_PROXY. Untrue).
+ In fact this ended up as a major MSG_* and SCM_*
+ update. The MSG_XXX known to be enums in some
+ versions of the glibc are now probed for and respective
+ HAS_MSG_XXX are defined. While I was at it I noticed
+ SCM_RIGHTS being similarly an enum. This reminded me of
+ an ancient discussion in perl5-porters:
+ http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/9612/msg01017.html
+ The BSD socket interface has a nifty feature for passing
+ file descriptors and credentials--via sockets. It may be
+ too late to add this functionality to the CORE but
+ at least Configure now probes for the functions,
+ structs, and includes, defining the appropriate
+ HAS_YYY and I_ZZZ, and the Socket extension exports
+ the constants, in case somebody wants to write an
+ extension for this interface.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH ext/Socket/Socket.pm ext/Socket/Socket.xs
+ ! iperlsys.h
+____________________________________________________________________________
+[ 2284] By: jhi on 1998/11/22 18:13:21
+ Log: perlhist.pod 1.54, containing 5_53.
+ Branch: cfgperl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 2274] By: TimBunce on 1998/11/22 16:25:46
+ Log: Preserve errno around fcntl(fd,F_SETFD,fd > maxsysfd) in do_open()
+ Branch: maint-5.004/perl
+ ! doio.c
+____________________________________________________________________________
+[ 2273] By: TimBunce on 1998/11/22 16:17:43
+ Log: Improve op/die_exit.t test for implicit close changing $!
+ Branch: maint-5.004/perl
+ ! t/op/die_exit.t
+____________________________________________________________________________
+[ 2268] By: jhi on 1998/11/22 14:44:11
+ Log: Fix thinko.
+ Branch: cfgperl
+ ! hints/dynixptx.sh
+____________________________________________________________________________
+[ 2267] By: jhi on 1998/11/22 13:19:41
+ Log: Document the d_socket override.
+ Branch: cfgperl
+ ! hints/dynixptx.sh
+____________________________________________________________________________
+[ 2266] By: jhi on 1998/11/22 12:12:29
+ Log: From: John Tobey <jtobey@channel1.com>
+ Subject: [PATCH] perlfaq typos
+ To: perl5-porters@perl.com
+ Date: 22 Nov 1998 04:25:15 +0200
+ Message-ID: <MLIST_m0zhPeF-000FOgC@feynman.localnet>
+ Branch: cfgperl
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq7.pod pod/perlfaq8.pod
+____________________________________________________________________________
+[ 2265] By: jhi on 1998/11/22 12:06:29
+ Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Subject: DB_File 1.61 patch for 5.005_53 & 5.005_02
+ Newsgroups: hut.lists.perl5-porters
+ To: gsar@engin.umich.edu (Gurusamy Sarathy)
+ Cc: perl5-porters@perl.org (Perl5 Porters)
+ Date: 20 Nov 1998 12:20:41 +0200
+ Branch: cfgperl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs
+____________________________________________________________________________
+[ 2264] By: jhi on 1998/11/22 11:55:09
+ Log: NeXTstep /etc/group and /etc/passwd are used only at boot time,
+ From: Gerben Wierda <G.C.Th.Wierda@AWT.nl>
+ Subject: Test results for perl5.005_53 under NEXTSTEP 3.3 (intel)
+ To: perlbug@perl.com
+ Date: 20 Nov 1998 18:39:06 +0200
+ Lines: 47
+ Message-ID: <MLIST_9811201533.AA22148@AWT.nl>
+ Branch: cfgperl
+ ! t/op/grent.t t/op/pwent.t
+____________________________________________________________________________
+[ 2263] By: jhi on 1998/11/22 11:42:59
+ Log: Permission testing is tricky when we have too much power.
+ Problem reported in
+ From: Gerben Wierda <G.C.Th.Wierda@AWT.nl>
+ Subject: Test results for perl5.005_53 under NEXTSTEP 3.3 (intel)
+ To: perlbug@perl.com
+ Date: 20 Nov 1998 18:39:06 +0200
+ Message-ID: <MLIST_9811201533.AA22148@AWT.nl>
+ Branch: cfgperl
+ ! t/op/filetest.t
+____________________________________________________________________________
+[ 2262] By: gsar on 1998/11/22 11:37:02
+ Log: fix broken CAPI generation
+ Branch: perl
+ ! win32/GenCAPI.pl
+____________________________________________________________________________
+[ 2261] By: jhi on 1998/11/22 11:17:00
+ Log: -x should be C<-x>, reported by Gerben Wierda.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2260] By: gsar on 1998/11/22 11:12:02
+ Log: phase 2 of PERL_OBJECT cleanup; objXSUB.h autogeneration
+ Branch: perl
+ ! XSUB.h embed.h embed.pl embedvar.h iperlsys.h objXSUB.h
+ ! proto.h
+____________________________________________________________________________
+[ 2259] By: jhi on 1998/11/22 11:06:40
+ Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ Subject: Re: [PATCH] Re: pod2man bug in date generated line
+ To: Albert Dvornik <bert@genscan.com>, "Larry W. Virden" <lvirden@cas.org>
+ Cc: perlbug@perl.com
+ Date: 20 Nov 1998 21:30:17 +0200
+ Message-ID: <MLIST_19981120131523.A464@O2.chapin.edu>
+ Branch: cfgperl
+ ! pod/pod2man.PL
+____________________________________________________________________________
+[ 2256] By: jhi on 1998/11/21 10:44:01
+ Log: From: Thomas Bowditch <bowditch@inmet.com>
+ Subject: Benchmark.pm suggestion
+ To: jhi@iki.fi, Tim.Bunce@ig.co.uk
+ Date: Fri, 20 Nov 1998 17:43:46 -0500
+ Message-Id: <199811202243.RAA26252@harp.camb.inmet.com>
+
+ Added timesum().
+ Branch: cfgperl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 2255] By: gsar on 1998/11/21 08:45:06
+ Log: another win32 portability fix: make sysread() and syswrite()
+ work on sockets
+ Branch: perl
+ ! pp_sys.c win32/win32.h
+____________________________________________________________________________
+[ 2254] By: gsar on 1998/11/21 07:49:06
+ Log: win32_recvfrom() compatibility fix
+ Branch: perl
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 2253] By: jhi on 1998/11/20 08:22:06
+ Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
+ To: jhi@iki.fi
+ Subject: MPE/iX Perl 5.005_02 oops
+ Date: Thu, 19 Nov 1998 17:10:45 -0800 (PST)
+ Message-Id: <199811200110.RAA07395@spock.dis.cccd.edu>
+ Branch: cfgperl
+ ! ext/DynaLoader/dl_mpeix.xs installperl
+____________________________________________________________________________
+[ 2252] By: gsar on 1998/11/19 17:38:03
+ Log: mess_sv tweak for change#2249
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 2251] By: jhi on 1998/11/18 12:32:19
+ Log: Display use64bits and usemultiplicity but only if necessary.
+ Branch: cfgperl
+ ! myconfig
+____________________________________________________________________________
+[ 2250] By: jhi on 1998/11/18 12:26:50
+ Log: From: Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
+ Subject: pp.c uses 'unsigned Quad_t'
+ To: perlbug@perl.com
+ Date: Sun, 15 Nov 1998 20:57:05 -0300
+ Message-Id: <199811152357.UAA12768@sleipnir.valparaiso.cl>
+ Branch: cfgperl
+ ! perl.h pp.c
+____________________________________________________________________________
+[ 2249] By: gsar on 1998/11/18 05:43:11
+ Log: use PL_mess_sv only during global destruction (fixes problems with
+ overlapping invocations of form()/warn()/die()/croak() trampling on
+ each other's messages)
+ Branch: perl
+ ! mg.c util.c
+____________________________________________________________________________
+[ 2248] By: gsar on 1998/11/18 05:39:36
+ Log: tweak change#2245 to skip previous message if any
+ Branch: perl
+ ! pp_ctl.c t/pragma/warn/pp_ctl
+____________________________________________________________________________
+[ 2247] By: jhi on 1998/11/17 11:46:56
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 26 files)
+____________________________________________________________________________
+[ 2246] By: gsar on 1998/11/17 09:41:10
+ Log: allow C<sort $coderef @foo>
+ Branch: perl
+ ! op.c t/op/sort.t t/pragma/overload.t
+____________________________________________________________________________
+[ 2245] By: gsar on 1998/11/17 08:28:26
+ Log: propagate failures in DESTROY() as (optional) warnings
+ Branch: perl
+ ! pod/perldiag.pod pp_ctl.c t/pragma/warn/pp_ctl
+____________________________________________________________________________
+[ 2244] By: gsar on 1998/11/17 07:43:08
+ Log: ensure PL_dirty is reinit-ed properly under -DMULTIPLICITY
+ Branch: perl
+ ! perl.c thrdvar.h
+____________________________________________________________________________
+[ 2243] By: gsar on 1998/11/17 07:40:09
+ Log: sort WARN_FOO symbols to avoid hash traversal order dependency
+ Branch: perl
+ ! lib/warning.pm warning.h warning.pl
+____________________________________________________________________________
+[ 2242] By: gsar on 1998/11/17 06:32:39
+ Log: fix skipspace() to properly account for newlines in eval''-ed
+ strings (caused bogus line numbers in diagnostics and debugger)
+ Branch: perl
+ ! t/pragma/warn/pp_ctl t/pragma/warn/toke toke.c
+____________________________________________________________________________
+[ 2241] By: gsar on 1998/11/17 03:48:12
+ Log: s/Perl_utf8skip/PL_utf8skip/g
+ Branch: perl
+ ! embed.h embed.pl global.sym globvar.sym regexec.c utf8.h
+____________________________________________________________________________
+[ 2240] By: gsar on 1998/11/14 06:09:06
+ Log: rework op/groups.t
+ Branch: perl
+ ! t/op/filetest.t t/op/groups.t
+____________________________________________________________________________
+[ 2235] By: gsar on 1998/11/14 00:17:05
+ Log: catch a neophyte trap: open(<FH>), close(<FH>) etc.
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 2234] By: gsar on 1998/11/14 00:14:02
+ Log: update Changes
+ Branch: perl
+ ! Changes win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 2233] By: gsar on 1998/11/13 09:43:03
+ Log: doc tweak
+ Branch: perl
+ ! README.win32
+____________________________________________________________________________
+[ 2230] By: jhi on 1998/11/12 17:07:45
+ Log: Allow hints file override for d_socket
+ (based on Sequent-induced change #2229).
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2229] By: jhi on 1998/11/12 16:32:33
+ Log:
+ From: "Martin J. Bligh" <mbligh@sequent.com>
+ To: jhi@iki.fi
+ cc: gbarr@ti.com, gbarr@pobox.com, gsar@umich.edu
+ Subject: Re: Making Perl work on DYNIX/ptx
+ Date: Tue, 10 Nov 1998 16:24:26 -0800
+ Message-ID: <181999655.910715066@w-186d219.rhe.sequent.com>
+ Branch: cfgperl
+ ! hints/dynixptx.sh
+____________________________________________________________________________
+[ 2228] By: jhi on 1998/11/12 11:40:37
+ Log: From: "Martin J. Bligh" <mbligh@sequent.com>
+ Message-ID: <187803647.910720870@w-186d219.rhe.sequent.com>
+ To: jhi@iki.fi
+ cc: gbarr@ti.com, gbarr@pobox.com, gsar@umich.edu
+ Subject: Re: Making Perl work on DYNIX/ptx
+ Date: Tue, 10 Nov 1998 18:01:10 -0800
+ Branch: cfgperl
+ + ext/DB_File/hints/dynixptx.pl ext/POSIX/hints/dynixptx.pl
+____________________________________________________________________________
+[ 2227] By: jhi on 1998/11/12 11:17:42
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes XSUB.h av.c embed.h embed.pl embedvar.h
+ !> ext/IPC/SysV/Msg.pm global.sym hv.c lib/Text/Wrap.pm objXSUB.h
+ !> perl.c perl.h pod/perlfunc.pod pod/perlvar.pod pp_sys.c
+ !> proto.h regexec.c t/op/array.t util.c win32/makedef.pl
+ !> win32/win32.c x2p/s2p.PL
+____________________________________________________________________________
+[ 2226] By: gsar on 1998/11/11 21:05:42
+ Log: provide -DPERL_POLLUTE
+ Branch: perl
+ ! embed.pl embedvar.h
+____________________________________________________________________________
+[ 2225] By: jhi on 1998/11/09 07:45:12
+ Log: From: Hans Mulder <hansm@icgroup.nl>
+ To: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Cc: gsar@engin.umich.edu (Gurusamy Sarathy), jhi@iki.fi,
+ perl5-porters@perl.org
+ Subject: Re: [PATCH] Re: Not OK: perl 5.00553 on OPENSTEP-Mach 4_1
+ (UNINSTALLED)
+ Date: Sun, 8 Nov 98 22:20:23 +0100
+ Message-Id: <9811082119.AA11802@icgned.icgroup.nl>
+ Branch: cfgperl
+ ! malloc.c perl.h
+____________________________________________________________________________
+[ 2224] By: gsar on 1998/11/09 03:13:14
+ Log: avoid endless loops in Text::Wrap (from a suggestion by Lupe
+ Christoph <lupe@alanya.m.isar.de>)
+ Branch: perl
+ ! lib/Text/Wrap.pm
+____________________________________________________________________________
+[ 2223] By: gsar on 1998/11/09 02:09:06
+ Log: fix misplaced brace in s2p (as suggested by Lionel Fourquaux
+ <lionel.fourquaux@wanadoo.fr>)
+ Branch: perl
+ ! x2p/s2p.PL
+____________________________________________________________________________
+[ 2222] By: gsar on 1998/11/09 01:56:24
+ Log: patches from Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Wed, 04 Nov 1998 12:19:44 +0000
+ Message-Id: <199811041219.MAA05451@crypt.compulink.co.uk>
+ Subject: [PATCH] Re: [5.005_53] read overflow?
+ --
+ Date: Wed, 04 Nov 1998 13:15:18 +0000
+ Message-Id: <199811041315.NAA05711@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_53] perl -V fix
+ Branch: perl
+ ! perl.c regexec.c
+____________________________________________________________________________
+[ 2221] By: gsar on 1998/11/09 01:34:56
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sun, 01 Nov 1998 00:05:01 +0100
+ Message-ID: <364294bd.18052307@smtp1.ibm.net>
+ Subject: [PATCH v5.5.53, WIN32] PL_block_type undefined unless DEBUGGING
+ Branch: perl
+ ! Changes win32/makedef.pl
+____________________________________________________________________________
+[ 2220] By: gsar on 1998/11/08 21:13:07
+ Log: integrate changes#2120,2168,2218 from maint-5.005;
+ add new vtbls; s/\bvtbl_/PL_vtbl_/; remove trailing comma in
+ enum; make regen_headers
+ Branch: perl
+ ! XSUB.h embed.h embedvar.h ext/IPC/SysV/Msg.pm global.sym
+ ! objXSUB.h perl.h pod/perlfunc.pod proto.h util.c win32/win32.c
+____________________________________________________________________________
+[ 2219] By: gsar on 1998/11/08 19:42:57
+ Log: integrate cfgperl changes into mainline
+ Branch: perl
+ +> README.vmesa
+ !> Configure MANIFEST Porting/Glossary Porting/config.sh
+ !> Porting/config_H config_h.SH ext/Thread/Thread.xs
+ !> hints/hpux.sh hints/vmesa.sh lib/Math/Complex.pm malloc.c
+ !> perl.h pod/perlfunc.pod pod/perllocale.pod pod/perlport.pod
+ !> pp_sys.c sv.c t/lib/complex.t t/op/groups.t t/op/lex_assign.t
+ !> thread.h vms/subconfigure.com vos/config.h
+____________________________________________________________________________
+[ 2218] By: gbarr on 1998/11/08 16:48:44
+ Log: From: Graham Barr <gbarr@ti.com>
+ Date: Mon, 2 Nov 1998 07:38:52 -0600
+ Message-ID: <19981102073852.A12751@asic.sc.ti.com>
+ Subject: [PATCH 5.005_*] Re: IPC::Msg 1.03
+ Branch: maint-5.005/perl
+ ! ext/IPC/SysV/Msg.pm
+____________________________________________________________________________
+[ 2215] By: gsar on 1998/11/08 02:52:52
+ Log: set close-on-exec bit on pipe() FDs
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlvar.pod pp_sys.c
+____________________________________________________________________________
+[ 2214] By: gsar on 1998/11/08 02:27:57
+ Log: typo in newHVhv()
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 2211] By: jhi on 1998/11/07 21:14:18
+ Log: Finalize the Mach CThreads support.
+
+ From: Hans Mulder <hansm@icgroup.nl>
+ Date: Sat, 7 Nov 98 22:06:20 +0100
+ To: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Cc: jhi@iki.fi, perl5-porters@perl.org
+ Subject: [PATCH] Re: Not OK: perl 5.00553 on OPENSTEP-Mach 4_1 (UNINSTALLED)
+ Message-Id: <9811072105.AA07794@icgned.icgroup.nl>
+ Branch: cfgperl
+ ! malloc.c perl.h
+____________________________________________________________________________
+[ 2210] By: gsar on 1998/11/06 20:36:50
+ Log: fix AvREALISH bogusness
+ Branch: perl
+ ! av.c t/op/array.t
+____________________________________________________________________________
+[ 2209] By: jhi on 1998/11/06 08:05:31
+ Log: Renamed malloc.c ASSERT() macro to P_ASSERT() because
+ ASSERT() causes problems in {NeXTStep,OpenStep}.
+
+ From: Hans Mulder <hansm@icgroup.nl>
+ To: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Subject: Re: Not OK: perl 5.00553 on OPENSTEP-Mach 4_1 (UNINSTALLED)
+ Date: Fri, 6 Nov 98 01:27:41 +0100
+ Message-Id: <9811060025.AA27389@icgned.icgroup.nl>
+
+ and
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: Re: ASSERT() in malloc.c
+ To: jhi@iki.fi
+ Date: Fri, 6 Nov 1998 02:59:29 -0500 (EST)
+ Message-Id: <199811060759.CAA18915@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! malloc.c
+____________________________________________________________________________
+[ 2208] By: jhi on 1998/11/06 07:55:38
+ Log: Mach CThreads needs #include <mach/cthreads.h>.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 2206] By: jhi on 1998/11/05 14:54:52
+ Log: PERL_BADLANG wrongly documented.
+
+ From: ts <decoux@moulon.inra.fr>
+ To: jhi@cc.hut.fi
+ Subject: Re: Locale warning messages
+ Date: Thu, 5 Nov 1998 14:34:19 +0100 (MET)
+ Message-Id: <199811051334.OAA24863@moulon.inra.fr>
+
+ and
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: Re: PERL_BADLANG
+ To: jhi@iki.fi
+ Subject: Re: PERL_BADLANG
+ Date: Thu, 5 Nov 1998 09:49:00 -0500 (EST)
+ Message-Id: <199811051449.JAA04238@monk.mps.ohio-state.edu>
+ Branch: cfgperl
+ ! pod/perllocale.pod
+____________________________________________________________________________
+[ 2205] By: jhi on 1998/11/05 14:24:33
+ Log: Document all the control flow keywords in perlfunc
+ so that "perlfunc -f while" works.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2204] By: jhi on 1998/11/05 12:46:02
+ Log: Configure update. Remove last trace of PTHREADS_CREATED_JOINABLE
+ (from vos/config.h). Update Porting/{Glossary,config*}.
+ Branch: cfgperl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH vos/config.h
+____________________________________________________________________________
+[ 2203] By: jhi on 1998/11/05 08:34:39
+ Log: VM/ESA and VMS sig_num_init (change#2101) catchup.
+ Branch: cfgperl
+ ! hints/vmesa.sh vms/subconfigure.com
+____________________________________________________________________________
+[ 2202] By: jhi on 1998/11/05 08:03:20
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> Changes cop.h doop.c gv.c mg.c perl.c pp_ctl.c sv.c util.c
+ !> win32/Makefile win32/makefile.mk win32/win32.c
+____________________________________________________________________________
+[ 2201] By: gsar on 1998/11/05 04:40:44
+ Log: another POPSTACK victim
+ Branch: perl
+ ! cop.h sv.c
+____________________________________________________________________________
+[ 2196] By: gsar on 1998/11/05 02:07:54
+ Log: fix a location affected by change#2191, add note about POPSTACK
+ Branch: perl
+ ! cop.h gv.c pp_ctl.c
+____________________________________________________________________________
+[ 2195] By: gsar on 1998/11/05 02:04:45
+ Log: makefile notes
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2192] By: gsar on 1998/11/04 23:48:53
+ Log: indeterminate order-of-evaluation fixes
+ Branch: perl
+ ! mg.c
+____________________________________________________________________________
+[ 2191] By: gsar on 1998/11/04 23:02:16
+ Log: refetch local stack pointer in POPSTACK
+ Branch: perl
+ ! cop.h perl.c
+____________________________________________________________________________
+[ 2190] By: jhi on 1998/11/04 08:50:40
+ Log: Configure update.
+ Sequent DYNIX/ptx updates: osvers=$4 (instead of $3) of uname -a,
+
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ To: Martin Bligh <mbligh@sequent.com>
+ Cc: Jarkko Hietaniemi <jhi@iki.fi>
+ Subject: Re: Perl 5's configure on DYNIX/ptx
+ Message-Id: <Pine.SUN.3.96.981103090824.5533B-100000@newton.phys>
+ Date: Tue, 3 Nov 1998 09:35:26 -0500 (EST)
+
+ find sockets also from libsocket, not just libnet.
+ OS390: $compile_ok instead of $compile for <inttypes.h>,
+
+ From: pvhp@forte.com (Peter Prymmer)
+ To: Thomas.Dorner@start.de, jhi@iki.fi, neale@VMA.TABNSW.COM.AU
+ Subject: _53 not OK on os390 but looking better than ever
+ Date: Tue, 3 Nov 98 17:33:22 PST
+ Message-Id: <9811040133.AA09450@forte.com>
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2189] By: jhi on 1998/11/04 07:43:58
+ Log: sysio.t failure: fix undefined order of evaluation, from
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ Subject: Not OK: perl 5.00553 on alpha-thread 5.0 [PATCH]
+ To: perlbug@perl.com
+ Date: 4 Nov 1998 01:22:30 +0200
+ Message-ID: <MLIST_199811032227.RAA143892@web.zk3.dec.com>
+ Branch: cfgperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 2188] By: gsar on 1998/11/04 02:59:16
+ Log: fix return value of win32_pclose()
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 2187] By: gsar on 1998/11/04 02:56:34
+ Log: s/sv_upgrade/SvUPGRADE/ a couple of places
+ Branch: perl
+ ! Changes doop.c gv.c util.c
+____________________________________________________________________________
+[ 2186] By: jhi on 1998/11/03 08:17:52
+ Log: Document quads in pack.
+ Branch: cfgperl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2185] By: jhi on 1998/11/03 07:49:35
+ Log: (IV) vs (I32) vs I_V()
+
+ Subject: [PATCH 5.005_53] Reverting typecast in sv_upgrade()
+ From: Anton Berezin <tobez@plab.ku.dk>
+ To: "p5p" <perl5-porters@perl.org>
+ Date: 01 Nov 1998 15:09:11 +0100
+ Message-ID: <86hfwjtshk.fsf@lion.plab.ku.dk>
+
+ and
+
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 2 Nov 1998 10:17:34 -0500 (EST)
+ Message-Id: <Pine.SUN.3.96.981102101433.4479B-100000@newton.phys>
+ Branch: cfgperl
+ ! sv.c
+____________________________________________________________________________
+[ 2184] By: jhi on 1998/11/03 07:42:46
+ Log: VM/ESA updates.
+ Branch: cfgperl
+ + README.vmesa
+ ! MANIFEST pod/perlfunc.pod pod/perlport.pod
+____________________________________________________________________________
+[ 2183] By: jhi on 1998/11/02 12:58:13
+ Log: The id(1)-parsing is real fun.
+ Branch: cfgperl
+ ! t/op/groups.t
+____________________________________________________________________________
+[ 2182] By: jhi on 1998/11/02 12:07:43
+ Log: Decommission the symlink test.
+ Branch: cfgperl
+ ! t/op/lex_assign.t
+____________________________________________________________________________
+[ 2181] By: jhi on 1998/11/02 12:03:08
+ Log: Replace ATTR_JOINABLE with true Configure probe
+ for PTHREAD_CREATE_JOINABLE (or equivalent:
+ PTHREAD_CREATE_UNDETACHED or __UNDETACHED).
+ Remove ATTR_JOINABLE itself: Thread.xs uses
+ PTHREAD_CREATE_JOINABLE (or equivalent) directly.
+
+ Really scan for <mach/cthreads.h> only if usethreads.
+ Branch: cfgperl
+ ! Configure config_h.SH ext/Thread/Thread.xs thread.h
+____________________________________________________________________________
+[ 2180] By: jhi on 1998/11/02 11:07:34
+ Log: In HP-UX 10.X usethreads only if the required files are present.
+ Branch: cfgperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 2179] By: jhi on 1998/11/02 09:10:33
+ Log: Prefer groups(1).
+ id -Gn can be broken.
+ id -a can save the day.
+ Branch: cfgperl
+ ! t/op/groups.t
+____________________________________________________________________________
+[ 2178] By: jhi on 1998/11/02 08:35:29
+ Log: Detrail enum comma.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 2177] By: jhi on 1998/11/02 08:24:12
+ Log: 0**0 = 1, from
+
+ From: d-lewart@uiuc.edu (Daniel S. Lewart)
+ Subject: Math::Complex 0**0 patches
+ Date: Sun, 1 Nov 1998 19:21:48 -0600 (CST)
+ Message-Id: <199811020121.TAA28310@staff2.cso.uiuc.edu>
+ To: jhi@iki.fi (Jarkko Hietaniemi),
+ Raphael_Manfredi@grenoble.hp.com (Raphael Manfredi)
+ Branch: cfgperl
+ ! lib/Math/Complex.pm t/lib/complex.t
+____________________________________________________________________________
+[ 2168] By: gbarr on 1998/11/01 01:58:58
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 09 Oct 1998 23:28:31 +0200
+ Message-ID: <36217b7f.3193091@smtp1.ibm.net>
+ Subject: [PATCH 5.005_02] Allow XS access to vtbl_*s when compiled with PERL_OBJECT
+ Branch: maint-5.005/perl
+ ! XSUB.h
+____________________________________________________________________________
+[ 2164] By: jhi on 1998/10/31 15:50:02
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> t/op/lex_assign.t
+ !> (integrate 45 files)
----------------
-Version 5.004_52
+Version 5.005_53
----------------
____________________________________________________________________________
-[ 132] By: mbeattie on 1997/10/15 17:02:38
- Log: Remove out-of-date test Thread/cond.t.
- Branch: perlext
- - Thread/cond.t
+[ 2163] By: gsar on 1998/10/31 11:31:12
+ Log: bump patchlevel; other minor fixes for clean build and test on
+ Solaris and win32
+ Branch: perl
+ ! Changes ext/Data/Dumper/Dumper.xs patchlevel.h pp.h sv.c
+ ! t/lib/dumper.t t/op/groups.t t/op/lex_assign.t
+ ! t/pragma/warn/regexec win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+ ! x2p/a2p.c
+____________________________________________________________________________
+[ 2162] By: gsar on 1998/10/31 09:40:31
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 30 Oct 1998 18:36:20 -0500 (EST)
+ Message-Id: <199810302336.SAA17336@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.00552] Overloaded <> and deref again
+ Branch: perl
+ ! pp.h
+____________________________________________________________________________
+[ 2161] By: gsar on 1998/10/31 09:39:13
+ Log: From: Albert Dvornik <bert@genscan.com>
+ Date: 30 Oct 1998 17:50:04 -0500
+ Message-Id: <tqd879vf4z.fsf@puma.genscan.com>
+ Subject: [PATCH perl5.00[45]] a2p: make sprintf less greedy without -o
+ Branch: perl
+ ! x2p/Makefile.SH x2p/a2p.c x2p/a2p.pod x2p/a2p.y x2p/a2py.c
+____________________________________________________________________________
+[ 2160] By: gsar on 1998/10/31 09:35:03
+ Log: fix for bugs in -x mode
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 31 Oct 1998 00:30:57 -0500 (EST)
+ Message-Id: <199810310530.AAA22277@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Fix h2xs
+ Branch: perl
+ ! utils/h2xs.PL
+____________________________________________________________________________
+[ 2159] By: gsar on 1998/10/31 09:31:36
+ Log: Data::Dumper update
+ Branch: perl
+ ! ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
+ ! ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Todo
+____________________________________________________________________________
+[ 2153] By: gsar on 1998/10/30 21:40:09
+ Log: add testsuite portion of patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 29 Oct 1998 23:20:01 -0500 (EST)
+ Message-Id: <199810300420.XAA25651@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00321 ;-)] 87% speedup
+ Branch: perl
+ + t/op/lex_assign.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 2152] By: gsar on 1998/10/30 21:08:11
+ Log: mention the C<$SIG{CHLD} = 'IGNORE'> special case
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlipc.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 2151] By: gsar on 1998/10/30 20:18:09
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ Date: Fri, 30 Oct 1998 14:24:23 EST
+ Message-Id: <19981030192423.27276.qmail@plover.com>
+ Subject: PATCH: (5.005_02) a2p should use `chomp' instead of `chop'
+ Branch: perl
+ ! x2p/walk.c
+____________________________________________________________________________
+[ 2150] By: gsar on 1998/10/30 20:08:57
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 29 Oct 1998 22:04:54 -0500 (EST)
+ Message-Id: <199810300304.WAA23291@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Overloaded <> and deref again
+ Branch: perl
+ ! gv.c lib/overload.pm perl.h pp.c pp.h pp_hot.c pp_sys.c sv.c
+ ! t/pragma/overload.t toke.c
+____________________________________________________________________________
+[ 2149] By: gsar on 1998/10/30 19:38:15
+ Log: From: Roderick Schertler <roderick@argon.org>
+ Date: Thu, 29 Oct 1998 14:50:18 -0500
+ Message-ID: <17625.909690618@eeyore.ibcinc.com>
+ Subject: patch for daemonization docs in perlipc
+ Branch: perl
+ ! pod/perlipc.pod
+____________________________________________________________________________
+[ 2148] By: gsar on 1998/10/30 19:36:07
+ Log: From: Anton Berezin <tobez@plab.ku.dk>
+ Date: 29 Oct 1998 17:06:25 +0100
+ Message-ID: <86pvbbuzcu.fsf@lion.plab.ku.dk>
+ Subject: [PATCH 5.005_52] win32_opendir() fails on empty drives
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 2147] By: gsar on 1998/10/30 19:31:37
+ Log: tweaked version of suggested patch
+ From: Anton Berezin <tobez@plab.ku.dk>
+ Date: 29 Oct 1998 14:48:54 +0100
+ Message-ID: <86yapzv5q1.fsf@lion.plab.ku.dk>
+ Subject: [PATCH 5.005_52] One more problem with win32_stat and MSVC
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 2146] By: gsar on 1998/10/30 19:03:50
+ Log: hand-apply whitespace-mutiliated patch
+ From: "vishal bhatia" <vishalb@hotmail.com>
+ Date: Wed, 28 Oct 1998 23:45:32 PST
+ Message-ID: <19981029074534.2334.qmail@hotmail.com>
+ Subject: [PATCH 5.005_52]Compiling modules,more bugfixes for B
+ Branch: perl
+ ! ext/B/B/C.pm ext/B/B/CC.pm
+____________________________________________________________________________
+[ 2145] By: gsar on 1998/10/30 18:46:58
+ Log: remaining PL_foo stragglers
+ Branch: perl
+ ! doio.c ext/B/B.pm ext/IPC/SysV/SysV.xs ext/Opcode/Opcode.pm
+ ! op.h os2/os2.c vms/gen_shrfls.pl
+____________________________________________________________________________
+[ 2144] By: gsar on 1998/10/30 17:38:36
+ Log: integrate cfgperl tweaks into mainline
+ Branch: perl
+ !> Makefile.SH README.posix-bc doio.c ext/POSIX/POSIX.xs proto.h
+ !> t/op/misc.t t/pragma/subs.t t/pragma/warning.t
+____________________________________________________________________________
+[ 2143] By: jhi on 1998/10/30 13:27:39
+ Log: There can be multiple yacc/bison errors.
+ Branch: cfgperl
+ ! t/op/misc.t t/pragma/subs.t t/pragma/warning.t
+____________________________________________________________________________
+[ 2142] By: jhi on 1998/10/30 13:18:43
+ Log: README.posix-bc update.
+ Branch: cfgperl
+ ! README.posix-bc
+____________________________________________________________________________
+[ 2141] By: jhi on 1998/10/30 09:12:59
+ Log: #2133 fallout.
+ Branch: cfgperl
+ ! doio.c ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2140] By: jhi on 1998/10/30 08:43:18
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ +> globvar.sym pp.sym
+ - objpp.h thread.sym
+ !> (integrate 61 files)
+____________________________________________________________________________
+[ 2133] By: gsar on 1998/10/30 02:51:39
+ Log: phase 1 of somewhat major rearrangement of PERL_OBJECT stuff
+ (objpp.h is gone, embed.pl now does some of that); objXSUB.h
+ should soon be automated also; the global variables that
+ escaped the PL_foo conversion are now reined in; renamed
+ MAGIC in regcomp.h to REG_MAGIC to avoid collision with the
+ type of same name; duplicated lists of pp_things in various
+ places is now gone; result has only been tested on win32
+ Branch: perl
+ + globvar.sym pp.sym
+ - objpp.h thread.sym
+ ! MANIFEST Makefile.SH av.c bytecode.h byterun.h cop.h doio.c
+ ! doop.c dump.c embed.h embed.pl embedvar.h ext/B/B.xs
+ ! ext/POSIX/POSIX.xs ext/Thread/Thread.xs global.sym globals.c
+ ! gv.c malloc.c mg.c objXSUB.h op.c opcode.h opcode.pl perl.c
+ ! perl.h perl_exp.SH perlvars.h perly.c pod/perlguts.pod pp.c
+ ! pp.h pp_ctl.c pp_hot.c pp_proto.h pp_sys.c proto.h regcomp.c
+ ! regcomp.h regcomp.pl regcomp.sym regexec.c regnodes.h run.c
+ ! scope.c sv.c t/op/filetest.t taint.c thrdvar.h toke.c util.c
+ ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makedef.pl win32/makefile.mk win32/perlhost.h
+____________________________________________________________________________
+[ 2130] By: jhi on 1998/10/29 15:31:26
+ Log: Pure bison yylex() proto was broken.
+ Branch: cfgperl
+ ! proto.h
+____________________________________________________________________________
+[ 2126] By: jhi on 1998/10/29 08:35:54
+ Log: Integrate mainperl.
+ Branch: cfgperl
+ !> INSTALL README.cygwin32 cygwin32/gcc2 cygwin32/ld2
+ !> lib/ExtUtils/MakeMaker.pm lib/perl5db.pl malloc.c pp.c
+ !> pp_ctl.c proto.h regexec.c t/pragma/overload.t
+ !> t/pragma/warn/doio toke.c win32/makefile.mk
+____________________________________________________________________________
+[ 2125] By: jhi on 1998/10/29 08:32:38
+ Log: EBCDIC Makefile.SH iteration converges. Hopefully.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2124] By: jhi on 1998/10/29 08:06:44
+ Log: EBCDIC Makefile.SH tuneup.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2119] By: gsar on 1998/10/28 23:24:04
+ Log: remove doubled hunk from integration
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 2118] By: gsar on 1998/10/28 22:03:31
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 28 Oct 1998 01:23:27 -0500 (EST)
+ Message-Id: <199810280623.BAA06968@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Minor debugger tweaks
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 2117] By: gsar on 1998/10/28 22:02:30
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 28 Oct 1998 01:20:33 -0500 (EST)
+ Message-Id: <199810280620.BAA06893@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Make sort respect overloading
+ Branch: perl
+ ! pp_ctl.c proto.h t/pragma/overload.t
+____________________________________________________________________________
+[ 2116] By: gsar on 1998/10/28 21:51:11
+ Log: MM patches from Ilya Zakharevich
+ Date: Wed, 28 Oct 1998 01:27:04 -0500 (EST)
+ Message-Id: <199810280627.BAA07053@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Make MakeMaker more verbose
+ --
+ Date: Wed, 28 Oct 1998 01:25:36 -0500 (EST)
+ Message-Id: <199810280625.BAA06980@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Make MakeMaker ignore errors in kid Makefile.PL
+ Branch: perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2115] By: gsar on 1998/10/28 21:46:19
+ Log: add explicit references to perl source path in ld2 and gcc2
+ Branch: perl
+ ! README.cygwin32 cygwin32/gcc2 cygwin32/ld2
+____________________________________________________________________________
+[ 2114] By: gsar on 1998/10/28 21:39:56
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Tue, 27 Oct 1998 10:40:41 -0500 (EST)
+ Message-Id: <Pine.SUN.3.96.981027103726.28498E-100000@newton.phys>
+ Subject: [PATCH] Re: Problems with: Creating an installable tar archive
+ Branch: perl
+ ! INSTALL
+____________________________________________________________________________
+[ 2113] By: gsar on 1998/10/28 21:21:16
+ Log: integrate cfgperl into mainline
+ Branch: perl
+ +> t/op/filetest.t
+ !> Configure MANIFEST Makefile.SH config_h.SH perl.h perly.y
+ !> perly_c.diff pp.c proto.h t/comp/require.t t/io/pipe.t
+ !> t/op/groups.t t/op/misc.t t/pragma/subs.t t/pragma/warning.t
+ !> thread.h toke.c vmesa/Makefile
+____________________________________________________________________________
+[ 2112] By: gsar on 1998/10/28 21:14:18
+ Log: minor cleanup
+ Branch: perl
+ ! malloc.c regexec.c t/pragma/warn/doio win32/makefile.mk
+____________________________________________________________________________
+[ 2111] By: gsar on 1998/10/28 18:52:10
+ Log: smarter C<$SIG{FOO} = BAREWORD;> warning
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 2110] By: jhi on 1998/10/28 15:07:54
+ Log: posix-bc doesn't want to regenerate a2p.h from a2p.y.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2109] By: jhi on 1998/10/28 13:39:54
+ Log: a2p.y needs to generate also y.tab.h.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2108] By: jhi on 1998/10/28 10:33:36
+ Log: The "parse error" must be converted to "syntax error",
+ just matching it aint' enough.
+ Branch: cfgperl
+ ! t/comp/require.t t/op/misc.t t/pragma/subs.t
+ ! t/pragma/warning.t
+____________________________________________________________________________
+[ 2107] By: jhi on 1998/10/28 10:23:05
+ Log: Regen sig_n{ame,umber}* if slightest doubt.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2106] By: jhi on 1998/10/28 08:44:49
+ Log: Bison says 'parse error', not 'parser error'.
+ Branch: cfgperl
+ ! t/comp/require.t t/op/misc.t t/pragma/subs.t
+ ! t/pragma/warning.t
+____________________________________________________________________________
+[ 2105] By: jhi on 1998/10/28 08:42:09
+ Log: yylex() parametrization.
+ Branch: cfgperl
+ ! proto.h toke.c
+____________________________________________________________________________
+[ 2104] By: jhi on 1998/10/28 08:25:09
+ Log: Bring in #2102.
+ Branch: cfgperl
+ ! pp.c
+____________________________________________________________________________
+[ 2103] By: jhi on 1998/10/28 08:22:04
+ Log: From: Dominic Dunlop <domo@vo.lu>
+ Subject: [PATCH 5.005_02] Re: perl5.004_04 testing problem
+ Date: 27 Oct 1998 20:47:25 +0200
+ Message-ID: <MLIST_v03110700b25b7dc95bbc@[212.24.192.87]>
+ Branch: cfgperl
+ ! t/op/groups.t
+____________________________________________________________________________
+[ 2102] By: larry on 1998/10/27 18:58:55
+ Log: utf8 change to quotemeta broke EBCDIC
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 2101] By: jhi on 1998/10/27 12:55:34
+ Log: $Config{sig_num_init}.
+ Also, a new approach to the 'pthreads-created-joinable': drop
+ it and use {PTHREAD_CREATE_{JOINABLE,UNDETACHED},__UNDETACHED}
+ directly. (See also #2096).
+ Branch: cfgperl
+ ! Configure config_h.SH
+____________________________________________________________________________
+[ 2100] By: jhi on 1998/10/27 10:48:55
+ Log: Regenerated perly_c.diff.
+ Branch: cfgperl
+ ! perly_c.diff
+____________________________________________________________________________
+[ 2099] By: jhi on 1998/10/27 08:42:25
+ Log: First the mangler was Netscape, then it was me.
+ Branch: cfgperl
+ ! vmesa/Makefile
+____________________________________________________________________________
+[ 2098] By: jhi on 1998/10/27 08:34:40
+ Log: `id -Gn` might be available where `groups` is not.
+ Branch: cfgperl
+ ! t/op/groups.t
+____________________________________________________________________________
+[ 2097] By: jhi on 1998/10/27 08:05:17
+ Log: Netscape had mangled the tabs.
+ Branch: cfgperl
+ ! vmesa/Makefile
+____________________________________________________________________________
+[ 2096] By: jhi on 1998/10/27 08:03:05
+ Log: ATTR_JOINABLE logic, based on (private email)
+
+ From: Neale Ferguson <neale@VMA.TABNSW.COM.AU>
+ Subject: Some little diffs
+ Message-ID: <36350969.DA33E7B4@mailbox.tabnsw.com.au>
+ Date: Tue, 27 Oct 1998 13:44:42 +1300
+ Branch: cfgperl
+ ! thread.h
+____________________________________________________________________________
+[ 2095] By: jhi on 1998/10/27 07:56:57
+ Log: Mach cthreads support based on:
+
+ From: brie@corp.home.net (Brian Harrison)
+ Subject: perl5.005_02 patch for mthreads
+ To: perl5-porters@perl.org
+ Date: 24 Oct 1998 01:01:55 +0300
+ Message-ID: <MLIST_Pine.GSO.4.04.9810231410220.11111-200000@sulaco.eos.home.net>
+
+ Pthread yield probe (dejavu)
+ Cosmetic nanochange for the union semun output.
+ Better inttypes.h probe.
+ Undo the 'void *' $selecttype probe from #1971 because
+ it breaks the $selectminbits test.
+ Branch: cfgperl
+ ! Configure config_h.SH perl.h thread.h
+____________________________________________________________________________
+[ 2094] By: jhi on 1998/10/26 13:02:07
+ Log: Also posix-bc wants to reyacc.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2093] By: jhi on 1998/10/26 10:17:21
+ Log: Removed !(*s & 0x80) from pp_quotemeta(), introduced after
+ 5_02 and really breaking things in non-ASCII worlds.
+ Branch: cfgperl
+ ! pp.c
+____________________________________________________________________________
+[ 2092] By: jhi on 1998/10/26 09:08:00
+ Log: More robustness.
+ Branch: cfgperl
+ ! t/comp/require.t t/op/misc.t t/pragma/subs.t
+ ! t/pragma/warning.t
+____________________________________________________________________________
+[ 2091] By: jhi on 1998/10/26 08:47:32
+ Log: s/YYLEXPARAM/PERL_YYLEX_PARAM_DECL/g
+ Bison really wants YYLEX_PARAM.
+ Branch: cfgperl
+ ! perly.y proto.h toke.c
+____________________________________________________________________________
+[ 2090] By: jhi on 1998/10/26 08:21:25
+ Log: s/YYLEX_PARAM/YYLEXPARAM/
+ Branch: cfgperl
+ ! perly.y
+____________________________________________________________________________
+[ 2089] By: jhi on 1998/10/26 08:17:33
+ Log: Indicate skipped subtests.
+ Branch: cfgperl
+ ! t/io/pipe.t
+____________________________________________________________________________
+[ 2088] By: jhi on 1998/10/26 08:11:36
+ Log: Integrate from mainperl.
+ Branch: cfgperl
+ !> (integrate 54 files)
+____________________________________________________________________________
+[ 2087] By: jhi on 1998/10/26 08:08:02
+ Log: Add test for filetests.
+ Branch: cfgperl
+ + t/op/filetest.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 2086] By: gsar on 1998/10/26 02:44:44
+ Log: various win32 tweaks; disable new xs_cpp section (it creates
+ ambiguous inference graph for %.xs --> %.o)
+ Branch: perl
+ ! ext/Thread/Thread.xs gv.c lib/ExtUtils/MakeMaker.pm mg.c pp.c
+ ! pp_hot.c proto.h win32/GenCAPI.pl win32/Makefile
+ ! win32/config.gc win32/config_H.gc win32/makedef.pl
+ ! win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 2085] By: gsar on 1998/10/26 00:50:02
+ Log: sanity-check $Config{drand01} in rand.t
+ Branch: perl
+ ! t/op/rand.t win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 2078] By: gsar on 1998/10/25 10:22:04
+ Log: update win32/config*.?c
+ Branch: perl
+ ! Changes win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 2077] By: gsar on 1998/10/25 08:39:25
+ Log: From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 24 Oct 1998 21:45:50 -0500
+ Message-ID: <19981024214550.C508@pobox.com>
+ Subject: Re: die with a reference should use overload "" operator
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 2076] By: gsar on 1998/10/25 08:37:49
+ Log: From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 24 Oct 1998 12:45:21 -0500
+ Message-ID: <19981024124521.C512@pobox.com>
+ Subject: [PATCH 5.005_02] Re: Auto-incrementing tied scalar causes SEGV
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 2075] By: gsar on 1998/10/25 08:24:09
+ Log: fix C<print $n += 5;> etc.
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 2074] By: gsar on 1998/10/25 08:12:28
+ Log: list builtins with portability caveats
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 23 Oct 1998 14:05:23 +0300 (EET DST)
+ Message-Id: <199810231105.OAA02411@alpha.hut.fi>
+ Subject: [PATCH] 5.005_02 and 5.005_52: perlfunc.pod and perlport.pod
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2073] By: gsar on 1998/10/25 07:55:43
+ Log: fix stack overrun in file test operators
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 2072] By: gsar on 1998/10/25 07:29:45
+ Log: implement C<goto &func> and other fixes (via private mail)
+ From: "vishal bhatia" <vishalb@hotmail.com>
+ Date: Wed, 21 Oct 1998 22:59:03 PDT
+ Message-Id: <19981022055904.20083.qmail@hotmail.com>
+ Subject: [PATCH 5.005_52] More fixes for B
+ Branch: perl
+ ! ext/B/B.pm ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm
+____________________________________________________________________________
+[ 2071] By: gsar on 1998/10/25 07:14:41
+ Log: From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 17 Oct 1998 20:42:41 -0500
+ Message-ID: <19981017204241.G510@pobox.com>
+ Subject: Re: taint checking for: use lib "$ENV{'EVIL'}"
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 2070] By: gsar on 1998/10/25 07:07:29
+ Log: avoid bogus line number in XSUB redefined warnings
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 2069] By: gsar on 1998/10/25 06:59:03
+ Log: From: Martijn Koster <mak@excitecorp.com>
+ Date: Wed, 21 Oct 1998 13:12:03 +0100
+ Message-ID: <19981021131203.A15661@excitecorp.com>
+ Subject: File::Path::mkpath reports the wrong error
+ Branch: perl
+ ! lib/File/Path.pm
+____________________________________________________________________________
+[ 2068] By: gsar on 1998/10/25 06:54:43
+ Log: From: Zachary Miller <zcmiller@simon.er.usgs.gov>
+ Date: Tue, 20 Oct 1998 20:52:20 -0500
+ Message-Id: <199810210152.UAA07792@simon.er.usgs.gov>
+ Subject: Exporter.pm's export_to_level() argument handling buggy
+ Branch: perl
+ ! lib/Exporter.pm
+____________________________________________________________________________
+[ 2067] By: gsar on 1998/10/25 06:50:19
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 21 Oct 1998 00:55:51 +0200
+ Message-ID: <36380269.55370608@smtp1.ibm.net>
+ Subject: Make _really_ sure Dynaloader.xs code is initialized only once
+ Branch: perl
+ ! ext/DynaLoader/DynaLoader_pm.PL
+____________________________________________________________________________
+[ 2066] By: gsar on 1998/10/25 06:48:19
+ Log: recognize '%' as a shell metachar for win32
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Tue, 20 Oct 1998 21:57:35 +0200
+ Message-ID: <3636ea31.49170453@smtp1.ibm.net>
+ Subject: [PATCH 5.005_02, Win32] Re: %ENV% not expanded in backquotes?
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 2065] By: gsar on 1998/10/25 06:46:30
+ Log: remove FAST_SV_GETS remnant (as suggested by Gisle Aas)
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 2064] By: gsar on 1998/10/25 06:45:09
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 20 Oct 1998 14:24:44 +0200
+ Message-ID: <m34sszctf7.fsf@furu.g.aas.no>
+ Subject: ord() and unpack("U*",...) should not be negative
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 2063] By: gsar on 1998/10/25 06:42:29
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 18 Oct 1998 23:20:57 -0400 (EDT)
+ Message-Id: <199810190320.XAA28249@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Improve sbrk() on OS/2
+ Branch: perl
+ ! os2/os2.c
+____________________________________________________________________________
+[ 2062] By: gsar on 1998/10/25 06:41:26
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 18 Oct 1998 23:10:29 -0400 (EDT)
+ Message-Id: <199810190310.XAA28102@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Speed up aassign
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 2061] By: gsar on 1998/10/25 06:39:04
+ Log: From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 17 Oct 1998 22:22:02 -0500
+ Message-ID: <19981017222202.J510@pobox.com>
+ Subject: Re: '*' prototype does not allow bareword with strict
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 2060] By: gsar on 1998/10/25 06:37:34
+ Log: handle '::' in section names properly
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 17 Oct 1998 12:57:54 -0500
+ Message-ID: <19981017125754.C510@pobox.com>
+ Subject: Re: pod2html
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 2059] By: gsar on 1998/10/25 06:33:43
+ Log: integrate changes#1982,2014,2021 (from maint-5.005)
+ Branch: perl
+ !> av.c doop.c ext/POSIX/POSIX.xs hv.c lib/ExtUtils/MakeMaker.pm
+ !> mg.c mg.h pp.c pp_hot.c pp_sys.c scope.c t/op/tie.t
+____________________________________________________________________________
+[ 2058] By: gsar on 1998/10/25 05:44:17
+ Log: allow more win32 symbol exports (suggested by Jan Dubois)
+ Branch: perl
+ ! win32/makedef.pl
+____________________________________________________________________________
+[ 2057] By: gsar on 1998/10/25 05:40:40
+ Log: integrate change#2053 from maint-5.005
+ Branch: perl
+ !> cop.h t/cmd/while.t
+____________________________________________________________________________
+[ 2056] By: gsar on 1998/10/25 05:16:41
+ Log: commented version of a patch suggested by Drago Goricanec
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: 16 Oct 1998 15:24:45 +0300
+ Message-ID: <oeeogrc1ype.fsf@alpha.hut.fi>
+ Subject: Re: [PATCH 5.005_52] Linux select fails with more than 32 FDs
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 2055] By: gsar on 1998/10/25 05:11:03
+ Log: include eof() in description of buffering caveats
+ From: Anton Berezin <tobez@plab.ku.dk>
+ Date: Fri, 16 Oct 1998 19:22:41 +0200 (CEST)
+ Message-Id: <199810161722.TAA28813@lion.plab.ku.dk>
+ Subject: [DOCPATCH] pod/perlfunc.pod
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2054] By: gsar on 1998/10/25 05:07:42
+ Log: disallow 'x' in hex numbers (except leading '0x')
+ From: Gisle Aas <gisle@aas.no>
+ Date: 16 Oct 1998 16:33:12 +0200
+ Message-ID: <m3n26wtw47.fsf@furu.g.aas.no>
+ Subject: Re: [PATCH 5.005_52] 'x' is not a legal hex digit
+ Branch: perl
+ ! perlvars.h t/op/oct.t util.c
+____________________________________________________________________________
+[ 2052] By: gsar on 1998/10/25 04:49:04
+ Log: avoid the circular refcnt logic in magic_mutexfree()
+ Branch: perl
+ ! mg.c pp.c pp_hot.c
+____________________________________________________________________________
+[ 2051] By: gsar on 1998/10/25 04:35:07
+ Log: properly restore PL_rsfp_filters after require
+ Branch: perl
+ ! embed.h global.sym objXSUB.h objpp.h pp_ctl.c proto.h scope.c
+ ! scope.h
+____________________________________________________________________________
+[ 2050] By: gsar on 1998/10/25 02:42:32
+ Log: integrate cfgperl changes back into mainline
+ Branch: perl
+ +> README.posix-bc hints/posix-bc.sh hints/vmesa.sh
+ +> vmesa/Makefile vmesa/vmesa.c vmesa/vmesaish.h
+ !> (integrate 33 files)
+____________________________________________________________________________
+[ 2049] By: gsar on 1998/10/25 01:30:48
+ Log: avoid "mysterious" compile-time failures without messages
+ Branch: perl
+ ! gv.c
+____________________________________________________________________________
+[ 2041] By: gsar on 1998/10/23 21:11:56
+ Log: checkin jpl under //depot/perlext/jpl/...
+ Branch: perlext
+ + jpl/JNI/Changes jpl/JNI/JNI.pm jpl/JNI/JNI.xs jpl/JNI/MANIFEST
+ + jpl/JNI/Makefile.PL jpl/JNI/test.pl jpl/JNI/typemap
+ + jpl/JPL/AutoLoader.pm jpl/JPL/Class.pm jpl/JPL/Compile.pm
+ + jpl/JPL/Makefile.PL jpl/JPL_Rolo/JPL_Rolo.jpl
+ + jpl/JPL_Rolo/Makefile.PL jpl/JPL_Rolo/README
+ + jpl/JPL_Rolo/cardfile jpl/PerlInterpreter/Makefile
+ + jpl/PerlInterpreter/Makefile.PL
+ + jpl/PerlInterpreter/PerlInterpreter.c
+ + jpl/PerlInterpreter/PerlInterpreter.h
+ + jpl/PerlInterpreter/PerlInterpreter.java jpl/README
+ + jpl/Sample/Makefile.PL jpl/Sample/Sample.jpl
+ + jpl/Test/Makefile.PL jpl/Test/Test.jpl jpl/bin/jpl
+ + jpl/get_jdk/README jpl/get_jdk/get_jdk.pl
+ + jpl/get_jdk/jdk_hosts jpl/install-jpl
+____________________________________________________________________________
+[ 2040] By: larry on 1998/10/23 19:31:42
+ Log: chr(0xFFFFFFFF) didn't translate to utf8 character
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 2039] By: larry on 1998/10/23 18:48:34
+ Log: tr///d does not seem to work
+ Branch: perl
+ ! lib/utf8_heavy.pl
+____________________________________________________________________________
+[ 2038] By: larry on 1998/10/23 18:00:41
+ Log: Program with utf8 identifiers fails to compile
+ Branch: perl
+ ! doop.c gv.c op.c pp.c pp_hot.c toke.c
+____________________________________________________________________________
+[ 2037] By: jhi on 1998/10/23 14:04:51
+ Log: Test suite portability:
+ - posix-bc does not write to broken pipes
+ - filehand #11 only iff we have fork
+ - warning.t can now match $expected using regular expressions
+ Branch: cfgperl
+ ! t/io/pipe.t t/lib/filehand.t t/pragma/warn/doio
+ ! t/pragma/warning.t
+____________________________________________________________________________
+[ 2036] By: jhi on 1998/10/23 12:12:07
+ Log: yacc clarification.
+ Branch: cfgperl
+ ! README.posix-bc
+____________________________________________________________________________
+[ 2035] By: jhi on 1998/10/23 12:09:59
+ Log: Some C compilers get upset about 8-bit characters in /* comments. */
+ Branch: cfgperl
+ ! mg.c
+____________________________________________________________________________
+[ 2034] By: jhi on 1998/10/22 09:11:52
+ Log: Configure update: both for pthread_yield more robust
+ testing (all variants of pthread_attr_getdetachstate()) --
+ and because Configure was broken in major way! About 1000
+ last lines were truncated.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2033] By: jhi on 1998/10/22 07:47:10
+ Log: DJGPP feedback for #2028.
+ Branch: cfgperl
+ ! thread.h
+____________________________________________________________________________
+[ 2032] By: jhi on 1998/10/21 13:03:57
+ Log: yielding, the saga continues.
+ Branch: cfgperl
+ ! Configure config_h.SH
+ !> av.c lib/constant.pm op.c pod/perldiag.pod pp_ctl.c
+ !> t/op/goto.t t/pragma/constant.t
+____________________________________________________________________________
+[ 2031] By: jhi on 1998/10/21 09:15:42
+ Log: VM/ESA feedback for #2028.
+ Branch: cfgperl
+ ! Configure config_h.SH thread.h
+____________________________________________________________________________
+[ 2030] By: gsar on 1998/10/21 04:22:53
+ Log: fix handling of mayhaps-extended @_ in goto &sub
+ Branch: perl
+ ! av.c pp_ctl.c t/op/goto.t
+____________________________________________________________________________
+[ 2029] By: gsar on 1998/10/21 00:54:14
+ Log: restore sanity to "constant" references
+ Branch: perl
+ ! lib/constant.pm op.c pod/perldiag.pod t/pragma/constant.t
+____________________________________________________________________________
+[ 2028] By: jhi on 1998/10/20 15:01:20
+ Log: OLD_PTHREADS_API reorganizing.
+ Branch: cfgperl
+ ! dosish.h ext/Thread/Thread.xs perl.h thread.h util.c
+ ! vmesa/vmesaish.h
+____________________________________________________________________________
+[ 2027] By: jhi on 1998/10/20 14:14:51
+ Log: #2026 fallout.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2026] By: jhi on 1998/10/20 11:47:21
+ Log: VM/ESA update.
+ Branch: cfgperl
+ ! Makefile.SH vmesa/vmesa.c vmesa/vmesaish.h
+____________________________________________________________________________
+[ 2025] By: jhi on 1998/10/20 08:20:56
+ Log: 64-bitness, based on
+
+ From: Scott Henry <scotth@sgi.com>
+ To: perl-64bit@perl.org
+ Message-ID: <yd8u30zyerl.fsf@hoshi.engr.sgi.com>
+ Subject: Re: Configure problems/questions...
+ Date: 19 Oct 1998 22:38:06 -0700
+ Branch: cfgperl
+ ! hints/irix_6.sh perl.h
+____________________________________________________________________________
+[ 2024] By: jhi on 1998/10/20 08:09:07
+ Log: Add lseeksize.
+ Branch: cfgperl
+ ! config_h.SH
+____________________________________________________________________________
+[ 2023] By: jhi on 1998/10/20 08:08:33
+ Log: Mumble about _yields() only when threaded.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2022] By: jhi on 1998/10/20 07:46:26
+ Log: Thinko at PTHREADS_CREATED_JOINABLE.
+ Branch: cfgperl
+ ! thread.h
____________________________________________________________________________
-[ 131] By: mbeattie on 1997/10/15 16:57:45
- Log: Finish thread state machine: fixes global destruction of threads,
- detaching, joining etc. Alter FAKE_THREADS-specific fields to use
- new HAVE_THREAD_INTERN stuff. Updates docs. Various fixes to
- Thread.xs.
- Branch: perl
- ! MANIFEST README.threads Todo.5.005 perl.c util.c
- Branch: perlext
- ! Thread/Thread.xs Thread/queue.t
+[ 2021] By: gbarr on 1998/10/20 01:25:23
+ Log: From: Chip Salzenberg <chip@perlsupport.com>
+ Date: Tue, 6 Oct 1998 13:33:05 -0400
+ Message-ID: <19981006133305.A2348@perlsupport.com>
+ Subject: [PATCH] 5.005_02: Eliminate leak on self-ties
+ Branch: maint-5.005/perl
+ ! av.c doop.c hv.c mg.c mg.h pp.c pp_hot.c pp_sys.c scope.c
+ ! t/op/tie.t
+____________________________________________________________________________
+[ 2020] By: jhi on 1998/10/19 09:15:53
+ Log: YIELD more robustly.
+ Branch: cfgperl
+ ! thread.h
+____________________________________________________________________________
+[ 2019] By: jhi on 1998/10/19 08:48:33
+ Log: VM/ESA (and OS390) are in between of OLD_PTHREADS_API and
+ the 'new' one (just like DJGPP, it seems).
+ Branch: cfgperl
+ ! thread.h
+____________________________________________________________________________
+[ 2018] By: jhi on 1998/10/19 07:02:44
+ Log: vmesaish.h doesn't exclude unixish.h.
+ Branch: cfgperl
+ ! perl.h
+____________________________________________________________________________
+[ 2017] By: jhi on 1998/10/19 06:44:19
+ Log: 1<<$randbits is not good for randbits=48.
+ Branch: cfgperl
+ ! t/op/rand.t
+____________________________________________________________________________
+[ 2016] By: jhi on 1998/10/19 06:39:47
+ Log: Make #2012 glob pattern more portable.
+ Branch: cfgperl
+ ! Makefile.SH
____________________________________________________________________________
-[ 130] By: mbeattie on 1997/10/15 16:55:10
- Log: Add HAVE_THREAD_INTERN for platform-dependent struct thread additions.
- Fix ThrSETSTATE not to lock t->mutex itself.
- Branch: perl
- ! fakethr.h thread.h
+[ 2014] By: gbarr on 1998/10/17 20:31:42
+ Log: Fix POSIX::sigprocmask not to check type of $old parameter
+ as it is output only
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2012] By: jhi on 1998/10/17 15:04:23
+ Log: clean numbered core dumps and t/tmp[0-9]*.
+ Branch: cfgperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2011] By: jhi on 1998/10/17 14:59:15
+ Log: More robust yacc/bison failure output handling.
+ Branch: cfgperl
+ ! t/comp/require.t t/op/misc.t t/pragma/subs.t
+____________________________________________________________________________
+[ 2010] By: jhi on 1998/10/17 14:51:05
+ Log: BC2000 POSIX update.
+ Branch: cfgperl
+ ! MANIFEST
+____________________________________________________________________________
+[ 2009] By: jhi on 1998/10/17 14:49:46
+ Log: POSIX BC2000 port from perl-mvs:
+
+ Subject: Ported perl 5.005.02 to BS2000 / POSIX
+ From: Dorner Thomas <Thomas.Dorner@start.de>
+ Date: Tue, 29 Sep 1998 13:29:36 +0100
+ Message-ID: <9CE47B416A24D2118BC40000F84009B20B72C5@start.de>
+ Branch: cfgperl
+ + README.posix-bc hints/posix-bc.sh
+ ! Configure MANIFEST perl.c perly.y proto.h t/lib/cgi-html.t
+ ! t/op/magic.t t/op/pack.t t/op/quotemeta.t t/op/subst.t toke.c
+ ! unixish.h
+____________________________________________________________________________
+[ 2008] By: jhi on 1998/10/17 14:07:49
+ Log: VM/ESA-update.
+ Branch: cfgperl
+ ! MANIFEST
+____________________________________________________________________________
+[ 2007] By: jhi on 1998/10/17 13:55:34
+ Log: Forgot few S_I* imports.
+ Branch: cfgperl
+ ! t/lib/ipc_sysv.t
+____________________________________________________________________________
+[ 2006] By: jhi on 1998/10/17 13:43:54
+ Log: The VM/ESA port essentials, based on
+
+ perl-mvs:
+
+ From: Neale Ferguson <neale@VMA.TABNSW.COM.AU>
+ Subject: Re: Can't find Data/Dumper.pm
+ Date: Mon, 28 Sep 1998 07:40:49 +1300
+ Message-ID: <360E86B0.23847AF4@mailbox.tabnsw.com.au>
+
+ private email:
+
+ From: Neale Ferguson <neale@VMA.TABNSW.COM.AU>
+ Subject: Re: Perl thread problems in VM/ESA
+ Date: Thu, 15 Oct 1998 07:18:35 +1300
+ Message-ID: <3624EAFA.16163A2B@mailbox.tabnsw.com.au>
+
+ and private email:
+
+ From: Neale Ferguson <NEALE@PUCC.PRINCETON.EDU>
+ Subject: perl archive
+ Date: Sun, 11 Oct 1998 19:28:54 EDT
+ Message-Id: <19981011233112Z67215-26626+1513@outbound.Princeton.EDU>
+ which gave a pointer to
+
+ http://pucc.princeton.edu/~neale/perl.tar
+
+ (based on Perl 5.005_51)
+ Branch: cfgperl
+ + hints/vmesa.sh vmesa/Makefile vmesa/vmesa.c vmesa/vmesaish.h
+ ! ext/Errno/Errno_pm.PL perl.c perl.h perly.y pp_sys.c
+ ! t/io/pipe.t t/lib/cgi-html.t t/lib/ipc_sysv.t t/op/magic.t
+ ! t/op/pack.t t/op/quotemeta.t t/op/subst.t util.c x2p/a2p.h
+____________________________________________________________________________
+[ 2005] By: jhi on 1998/10/17 13:17:19
+ Log: Integrate mainperl.
+ Branch: cfgperl
+ !> Porting/genlog ext/B/B/CC.pm ext/POSIX/POSIX.pm
+ !> lib/ExtUtils/MM_Win32.pm lib/ExtUtils/MakeMaker.pm
+ !> lib/Term/Complete.pm op.c opcode.h opcode.pl os2/Makefile.SHs
+ !> os2/os2.c pod/perlfunc.pod pod/perlxs.pod pp.c sv.c
+ !> t/op/grent.t t/op/sysio.t t/op/tiehandle.t toke.c
+ !> utils/perldoc.PL vms/ext/Stdio/Stdio.pm win32/Makefile
+ !> win32/makefile.mk
+____________________________________________________________________________
+[ 2004] By: jhi on 1998/10/17 11:19:06
+ Log: Removed an extra ' from the int64_t test.
+ Branch: cfgperl
+ ! Configure
+____________________________________________________________________________
+[ 2003] By: gsar on 1998/10/17 04:11:40
+ Log: silence -w noises (suggested by Greg Bacon)
+ Branch: perl
+ ! lib/Term/Complete.pm
+____________________________________________________________________________
+[ 2002] By: gsar on 1998/10/17 04:07:48
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 14 Oct 1998 15:53:14 +0200
+ Message-ID: <m3g1cr9rn9.fsf@furu.g.aas.no>
+ Subject: Re: chr(0xFFFF_FFFF) and "\x{10_FFFF}" [PATCH 5.005_52]
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 2001] By: gsar on 1998/10/17 04:06:10
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 14 Oct 1998 15:17:44 +0200
+ Message-ID: <m3iuhn9taf.fsf@furu.g.aas.no>
+ Subject: [PATCH 5.005_52] Core dump from "Missing right brace on \x{}"
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 2000] By: gsar on 1998/10/17 03:06:33
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 14 Oct 1998 00:38:06 +0200
+ Message-ID: <m3iuhonl4h.fsf@furu.g.aas.no>
+ Subject: [PATCH 5.005_52] utf8 substr can access memory outside PVX buffer
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1999] By: gsar on 1998/10/17 03:04:48
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Tue, 13 Oct 1998 15:10:57 -0700
+ Message-Id: <3.0.6.32.19981013151057.00a947a0@ous.edu>
+ Subject: [PATCH 5.004/5.005/5.006]Doc patch to VMS::Stdio module
+ Branch: perl
+ ! vms/ext/Stdio/Stdio.pm
+____________________________________________________________________________
+[ 1998] By: gsar on 1998/10/17 03:00:40
+ Log: skip readonly vars and unref references when doing a reset()
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1997] By: gsar on 1998/10/17 02:49:19
+ Log: fix buggy treatment of large checksums on unicode strings
+ From: Gisle Aas <gisle@aas.no>
+ Date: 13 Oct 1998 21:35:39 +0200
+ Message-ID: <m31zocp850.fsf@furu.g.aas.no>
+ Subject: unpack("%48U*",...) [PATCH 5.005_52]
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 1996] By: gsar on 1998/10/17 02:43:22
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 13 Oct 1998 04:46:00 -0400 (EDT)
+ Message-Id: <199810130846.EAA00769@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_52] Memory overrun in os2.c
+ Branch: perl
+ ! os2/Makefile.SHs os2/os2.c
+____________________________________________________________________________
+[ 1995] By: gsar on 1998/10/17 02:42:01
+ Log: clarify section name rules for typemaps
+ Branch: perl
+ ! pod/perlxs.pod
+____________________________________________________________________________
+[ 1994] By: gsar on 1998/10/17 02:33:02
+ Log: whitespace-proof grent.t
+ Branch: perl
+ ! t/op/grent.t
+____________________________________________________________________________
+[ 1993] By: gsar on 1998/10/17 02:27:29
+ Log: fix bug in B::CC::pp_sassign()
+ From: "vishal bhatia" <vishalb@hotmail.com>
+ Date: Sun, 11 Oct 1998 18:41:38 PDT
+ Message-ID: <19981012014139.19614.qmail@hotmail.com>
+ Subject: B::CC problems with pp_sassign routine
+ Branch: perl
+ ! ext/B/B/CC.pm
+____________________________________________________________________________
+[ 1992] By: gsar on 1998/10/17 02:17:49
+ Log: applied suggested patch with small doc tweak
+ From: Gisle Aas <gisle@aas.no>
+ Date: 11 Oct 1998 12:53:13 +0200
+ Message-ID: <m3u31bfjza.fsf@furu.g.aas.no>
+ Subject: Re: [PATCH 5.005_52] Optional syswrite LENGTH argument
+ Branch: perl
+ ! opcode.h opcode.pl pod/perlfunc.pod pp_sys.c t/op/sysio.t
+ ! t/op/tiehandle.t
+____________________________________________________________________________
+[ 1991] By: gsar on 1998/10/17 02:08:30
+ Log: apply non-conflicting parts from suggested patch
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 10 Oct 1998 13:15:45 +0200
+ Message-ID: <36223ed7.18279374@smtp1.ibm.net>
+ Subject: [PATCH 5.005_52] Still more MakeMaker patches
+ Branch: perl
+ ! lib/ExtUtils/MM_Win32.pm lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1990] By: gsar on 1998/10/17 02:01:24
+ Log: provide option to enable optimization with VC (suggested by Jan
+ Dubois)
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1989] By: gsar on 1998/10/17 01:55:27
+ Log: Rhapsody DR2 has bsd/ctypes.h, not objc/NXCType.h (suggested by
+ Dave Leppik <dleppik@gage.com>
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 1988] By: gsar on 1998/10/17 01:49:05
+ Log: stray typo found by Hugo van der Sanden
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1987] By: gsar on 1998/10/17 01:45:52
+ Log: perldoc pod update
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Date: 06 Oct 1998 23:56:51 -0600
+ Message-ID: <m3g1d0kj8c.fsf@perrin.dimensional.com>
+ Subject: [PATCH _02 and _52] perldoc
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1986] By: gsar on 1998/10/17 01:41:40
+ Log: qualify names of builtins
+ Branch: perl
+ ! ext/POSIX/POSIX.pm
____________________________________________________________________________
-[ 129] By: mbeattie on 1997/10/15 16:53:35
- Log: Remove stale code from pp_entersub which breaks sub ownership locks.
+[ 1982] By: gbarr on 1998/10/17 00:20:57
+ Log: From: Jochen Wiedmann <joe@ispsoft.de>
+ Date: Thu, 17 Sep 1998 17:16:06 +0200
+ Message-ID: <360127B6.E44564A@ispsoft.de>
+ Subject: [PATCH] ExtUtils::MakeMaker::prompt cannot return 0
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1978] By: gsar on 1998/10/16 01:58:58
+ Log: integrate cfgperl mods into mainline
+ Branch: perl
+ +> ext/DynaLoader/dl_vmesa.xs
+ ! Porting/genlog
+ !> Configure MANIFEST Makefile.SH config_h.SH
+ !> ext/Thread/Thread.xs gv.c hints/hpux.sh hints/irix_6.sh
+ !> hints/linux.sh hints/os390.sh op.c t/op/pat.t thread.h
+ !> x2p/Makefile.SH
+____________________________________________________________________________
+[ 1976] By: gsar on 1998/10/16 00:10:52
+ Log: stray tweak
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1975] By: gsar on 1998/10/15 23:54:38
+ Log: propagate typeness of lexicals while cloning them
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1974] By: gsar on 1998/10/15 23:53:25
+ Log: s/last/first/ typo in append_list()
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1973] By: gsar on 1998/10/15 20:06:17
+ Log: nuke confperl branch and contents
+ Branch: confperl
+ - (delete 1284 files)
+____________________________________________________________________________
+[ 1972] By: jhi on 1998/10/15 07:07:35
+ Log: Test #162 had been added but the "print 1..161" had not been updated.
+ Branch: cfgperl
+ ! t/op/pat.t
+____________________________________________________________________________
+[ 1971] By: gsar on 1998/10/15 03:09:58
+ Log: check in all confperl changes as of change#1964 into cfgperl
+ Branch: cfgperl
+ + ext/DynaLoader/dl_vmesa.xs
+ ! Configure MANIFEST Makefile.SH config_h.SH
+ ! ext/Thread/Thread.xs gv.c hints/hpux.sh hints/irix_6.sh
+ ! hints/linux.sh hints/os390.sh op.c thread.h x2p/Makefile.SH
+____________________________________________________________________________
+[ 1970] By: gsar on 1998/10/15 03:05:59
+ Log: integrate mainline to get tr.t
+ Branch: cfgperl
+ +> t/op/tr.t
+____________________________________________________________________________
+[ 1969] By: gsar on 1998/10/15 03:04:17
+ Log: add missing tr.t to repository
+ Branch: perl
+ + t/op/tr.t
+____________________________________________________________________________
+[ 1968] By: gsar on 1998/10/15 03:02:43
+ Log: create cfgperl branch
+ Branch: cfgperl
+ +> (branch 1282 files)
+____________________________________________________________________________
+[ 1967] By: gsar on 1998/10/15 02:46:08
+ Log: correct bugs exposed in MM_Unix.pm by commenting out Selfloader
+ (MAN3PODS cannot be set to ' '; stray stricture violation)
+ Branch: perl
+ ! ext/B/Makefile.PL ext/DB_File/Makefile.PL
+ ! ext/Data/Dumper/Makefile.PL ext/DynaLoader/Makefile.PL
+ ! ext/Errno/Makefile.PL ext/Fcntl/Makefile.PL
+ ! ext/GDBM_File/Makefile.PL ext/IO/Makefile.PL
+ ! ext/IPC/SysV/Makefile.PL ext/NDBM_File/Makefile.PL
+ ! ext/ODBM_File/Makefile.PL ext/Opcode/Makefile.PL
+ ! ext/POSIX/Makefile.PL ext/SDBM_File/Makefile.PL
+ ! ext/Socket/Makefile.PL ext/Thread/Makefile.PL
+ ! ext/attrs/Makefile.PL ext/re/Makefile.PL
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 1966] By: gsar on 1998/10/15 02:19:03
+ Log: tweak to make fix in change#1944 behave correctly for closures
+ created within eval''
+ Branch: perl
+ ! op.c t/op/eval.t
+____________________________________________________________________________
+[ 1965] By: gsar on 1998/10/14 23:22:41
+ Log: use better numbers for exitstatus test
+ Branch: perl
+ ! t/op/die_exit.t
+____________________________________________________________________________
+[ 1964] By: jhi on 1998/10/14 17:25:41
+ Log: Add VM/ESA dynaloading (uses <dll.h>).
+ Branch: confperl
+ + ext/DynaLoader/dl_vmesa.xs
+ ! MANIFEST
+____________________________________________________________________________
+[ 1963] By: jhi on 1998/10/14 17:17:10
+ Log: Remove a2p.loadmap in 'clean' target.
+ Branch: confperl
+ ! x2p/Makefile.SH
+____________________________________________________________________________
+[ 1962] By: jhi on 1998/10/14 17:13:11
+ Log: VM/ESA produces also .prelmaps. (No, not .perlmaps...)
+ Branch: confperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1961] By: jhi on 1998/10/14 16:27:39
+ Log: VM/ESA creates executable.loadmaps.
+ Branch: confperl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1960] By: jhi on 1998/10/14 15:37:39
+ Log: Introduce SCHED_YIELD (one of sched_yield(),
+ pthread_yield(), or pthread_yield(NULL)).
+ YIELD is then defined using SCHED_YIELD unless
+ a platform-specific YIELD has already been defined.
+
+ Support pthread_attr_setdetachstate(pthread_attr_t*, int*).
+
+ The need for pthread_yield(NULL) and pthread_attr_setdet...
+ introduced by (private email)
+
+ From: Neale Ferguson <neale@VMA.TABNSW.COM.AU>
+ Date: Sat, 10 Oct 1998 21:08:15 +1300
+ Message-ID: <361F15EE.47376EC@mailbox.tabnsw.com.au>
+ Subject: Re: Perl thread problems in VM/ESA
+
+ Better select() protoprobe (for AIX), from (private email)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Fri, 2 Oct 1998 14:52:25 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.981002144601.11832D-100000@newton.phys>
+ Subject: AIX select (fwd)
+ From: Lars Hecking <lhecking@nmrc.ucc.ie>
+ To: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Fri, 2 Oct 1998 10:40:01 +0100
+ Subject: AIX select
+
+ Linux-avoid-so.X.Y, based on
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ Date: Tue, 13 Oct 1998 15:55:07 -0400
+ Message-ID: <19981013155507.B4004@O2.chapin.edu>
+ Subject: Re: [PATCH 5.005_52] [Was: Re: How can Debian accomodate new installation ?]
+ Branch: confperl
+ ! Configure config_h.SH ext/Thread/Thread.xs hints/linux.sh
+ ! thread.h
+____________________________________________________________________________
+[ 1959] By: jhi on 1998/10/14 12:51:26
+ Log: Some old pthread implementations have
+ pthread_attr_setdetachstate(pthread_attr_t*, int*).
+ Branch: confperl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 1958] By: jhi on 1998/10/14 12:41:11
+ Log: SCHED_YIELD and ATTR_JOINABLE fixes. Thread.xs and Configure
+ counterparts will follow soon.
+ Branch: confperl
+ ! thread.h
+____________________________________________________________________________
+[ 1957] By: jhi on 1998/10/14 12:38:11
+ Log: Add tr.t (MANIFEST already knew about it, strange)
+ Branch: confperl
+ + t/op/tr.t
+____________________________________________________________________________
+[ 1956] By: jhi on 1998/10/14 12:24:35
+ Log: Mutexen should be initialized only once.
+ Branch: confperl
+ ! gv.c op.c
+____________________________________________________________________________
+[ 1955] By: jhi on 1998/10/14 12:19:38
+ Log: os390 has its own cppstdin.
+ Branch: confperl
+ ! hints/os390.sh
+____________________________________________________________________________
+[ 1954] By: jhi on 1998/10/14 12:15:06
+ Log: Integrate with mainperl.
+ Branch: confperl
+ !> (integrate 1280 files)
+____________________________________________________________________________
+[ 1953] By: jhi on 1998/10/14 11:48:08
+ Log: Removed duplicate CMA threads code for HPUX 10.X.
+ (probably residue of patch(1) being too understanding)
+ Enhanced 64-bit settings. (redo change#1940)
+ Branch: confperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 1952] By: jhi on 1998/10/14 11:45:16
+ Log: (redo change#1949) Detypo in the d_open64 warning about
+ the impending WHOA.
+ Branch: confperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 1951] By: jhi on 1998/10/14 10:54:16
+ Log: Mutexen should only be inited once, after they have been New()ed.
+ Branch: confperl
+ ! gv.c op.c
+____________________________________________________________________________
+[ 1950] By: jhi on 1998/10/14 10:41:43
+ Log: Own cppstdin.
+ Branch: confperl
+ ! hints/os390.sh
+____________________________________________________________________________
+[ 1949] By: jhi on 1998/10/14 10:34:23
+ Log: Detypo in the d_open64 warning about the impending WHOA.
+ Branch: confperl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 1948] By: gsar on 1998/10/14 05:38:01
+ Log: two typos
+ Branch: perl
+ ! pp_hot.c t/op/eval.t
+____________________________________________________________________________
+[ 1947] By: gsar on 1998/10/14 05:37:10
+ Log: let docatch() pass the buck when restartop turns out to be null,
+ making exceptions in BEGIN{} propagate as expected
+ Branch: perl
+ ! pp_ctl.c t/op/misc.t
+____________________________________________________________________________
+[ 1946] By: gsar on 1998/10/13 03:41:49
+ Log: add missing file from change#1943
+ Branch: perl
+ ! proto.h
+____________________________________________________________________________
+[ 1945] By: gsar on 1998/10/13 03:32:02
+ Log: defer "deep recursion" warnings until CXt_SUB context is properly
+ set up
+ Branch: perl
+ ! pp_hot.c t/pragma/warn/pp_hot
+____________________________________________________________________________
+[ 1944] By: gsar on 1998/10/13 03:15:50
+ Log: change#1614 merely disabled earlier fix (doh!); undo it and properly
+ fixup the cop_seq value that must be seen by lexical lookups that
+ emanate within eval''
+ Branch: perl
+ ! cop.h op.c pp_ctl.c pp_hot.c scope.c t/op/eval.t
+____________________________________________________________________________
+[ 1943] By: gsar on 1998/10/13 02:06:09
+ Log: ensure recursive attempts to findlex()icals know enough about where
+ the last eval'' context was encountered
+ Branch: perl
+ ! op.c t/op/eval.t
+____________________________________________________________________________
+[ 1942] By: gsar on 1998/10/13 02:01:24
+ Log: force copy of substrings when matching against temporaries
+ Branch: perl
+ ! pp_hot.c t/op/pat.t
+____________________________________________________________________________
+[ 1941] By: gsar on 1998/10/13 01:49:16
+ Log: don't longjmp() in pp_goto() (regressive bug from old single-stack
+ implementation)
+ Branch: perl
+ ! pp_ctl.c t/op/runlevel.t
+____________________________________________________________________________
+[ 1940] By: jhi on 1998/10/12 09:57:44
+ Log: Removed duplicate CMA threads code for HPUX 10.X.
+ (probably residue of patch(1) being too understanding)
+ Enhanced 64-bit settings.
+ Branch: confperl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 1939] By: jhi on 1998/10/12 09:53:11
+ Log: Initial sync from mainline perl.
+ Branch: confperl
+ + (add 1282 files)
+____________________________________________________________________________
+[ 1937] By: gsar on 1998/10/06 21:16:34
+ Log: fix $/ init for USE_THREADS
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 1936] By: gsar on 1998/10/06 07:19:39
+ Log: fix globals caught by change#1927; builds and tests on Solaris
+ Branch: perl
+ ! Changes mg.c op.c perl.c pp_ctl.c regcomp.c utf8.c utf8.h
+ ! warning.h warning.pl
+____________________________________________________________________________
+[ 1935] By: gsar on 1998/10/06 06:50:35
+ Log: add test for previous fix
+ Branch: perl
+ ! ext/Thread/create.t
+____________________________________________________________________________
+[ 1934] By: gsar on 1998/10/06 06:37:36
+ Log: fix USE_THREADS coredump due to uninitialized PL_hv_fetch_ent_mh
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 1933] By: gsar on 1998/10/06 05:04:20
+ Log: undo bogus part of change#1903 (as pointed out by Larry)
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 1932] By: gsar on 1998/10/06 04:21:31
+ Log: added tweaked version of suggested patch
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 03 Oct 1998 19:04:48 +0200
+ Message-ID: <361d54b2.36841294@smtp1.ibm.net>
+ Subject: [PATCH 5.005_52] More MakeMaker patches
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/ExtUtils/Mkbootstrap.pm lib/ExtUtils/Mksymlists.pm
+____________________________________________________________________________
+[ 1931] By: gsar on 1998/10/06 04:04:33
+ Log: use cpp symbols instead of hardwired constants
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Mon, 05 Oct 1998 09:23:33 +0100
+ Message-Id: <199810050823.JAA00891@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_52] By the numbers (resend)
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1930] By: gsar on 1998/10/06 04:01:55
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199810050637.CAA07781@monk.mps.ohio-state.edu>
+ Date: Mon, 5 Oct 1998 02:37:43 -0400 (EDT)
+ Subject: [PATCH 5.005_52] Cumulative OS/2-related patch
+ Branch: perl
+ ! Makefile.SH hints/os2.sh lib/ExtUtils/MM_OS2.pm mg.c
+ ! os2/Changes os2/Makefile.SHs os2/os2.c perl_exp.SH util.c
+____________________________________________________________________________
+[ 1929] By: gsar on 1998/10/06 03:50:36
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 5 Oct 1998 02:39:00 -0400 (EDT)
+ Message-Id: <199810050639.CAA07803@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Minor test improvement
+ Branch: perl
+ ! t/op/magic.t
+____________________________________________________________________________
+[ 1928] By: gsar on 1998/10/06 03:49:03
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 5 Oct 1998 02:38:23 -0400 (EDT)
+ Message-Id: <199810050638.CAA07792@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] emacs/ptags inprovements
+ Branch: perl
+ ! emacs/ptags
+____________________________________________________________________________
+[ 1927] By: gsar on 1998/10/06 03:47:44
+ Log: disable C<#define dirty PL_dirty> et al.
+ Branch: perl
+ ! embed.pl embedvar.h
+____________________________________________________________________________
+[ 1926] By: gsar on 1998/10/06 03:43:32
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ Date: Sun, 04 Oct 1998 14:48:11 -0400
+ Message-ID: <19981004184811.16048.qmail@plover.com>
+ Subject: PATCH: perldoc -f does not locate -e, -r, -x, etc.
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1925] By: gsar on 1998/10/06 03:27:35
+ Log: disable USE_THREADS when PERL_OBJECT is enabled
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1924] By: gsar on 1998/10/06 03:26:54
+ Log: remove spurious unused conflicting globals (PL_yy{v,s}sp)
+ Branch: perl
+ ! Makefile.SH Todo-5.005 embedvar.h perlvars.h perly.c toke.c
+ ! vms/perly_c.vms
+____________________________________________________________________________
+[ 1923] By: gsar on 1998/10/03 05:19:56
+ Log: make C<use> recognize C<require> overrides; allow C<do EXPR> to be
+ overridden
+ Branch: perl
+ ! embed.h global.sym objXSUB.h objpp.h op.c perly.c perly.y
+ ! proto.h vms/perly_c.vms
+____________________________________________________________________________
+[ 1922] By: gsar on 1998/10/03 03:59:50
+ Log: suppress manifypods leak in extensions
+ Branch: perl
+ ! ext/Errno/Makefile.PL ext/IPC/SysV/Makefile.PL pod/pod2man.PL
+____________________________________________________________________________
+[ 1921] By: gsar on 1998/10/02 22:30:15
+ Log: os390 fixes (suggested by Peter Prymmer)
+ Branch: perl
+ ! Makefile.SH regcomp.c
+____________________________________________________________________________
+[ 1920] By: gsar on 1998/10/02 21:41:19
+ Log: squelch undef warnings
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Fri, 02 Oct 1998 11:01:14 +0100
+ Message-Id: <199810021001.LAA19214@crypt.compulink.co.uk>
+ Subject: [PATCH] Re: Apparent bug in Math::BigInt
+ Branch: perl
+ ! Changes lib/Math/BigInt.pm
+____________________________________________________________________________
+[ 1919] By: gsar on 1998/10/02 04:59:13
+ Log: add note to INSTALL about ANSI C
+ Branch: perl
+ ! INSTALL
+____________________________________________________________________________
+[ 1918] By: gsar on 1998/10/02 04:21:10
+ Log: tolerate spaces when fixing up __cplusplus output by old h2xs
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 30 Sep 1998 23:35:30 +0200
+ Message-ID: <3619a1e8.12336659@smtp1.ibm.net>
+ Subject: [PATCH 5.005_52]: xsubpp and PERL_OBJECT
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
+____________________________________________________________________________
+[ 1917] By: gsar on 1998/10/02 04:16:02
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Thu, 1 Oct 1998 11:37:26 +0300 (EET DST)
+ Message-Id: <199810010837.LAA31371@alpha.hut.fi>
+ Subject: Re: Configure test for selectbits busted
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 1916] By: gsar on 1998/10/02 04:14:17
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Wed, 30 Sep 1998 17:15:20 -0700
+ Message-Id: <3.0.6.32.19980930171520.00b22eb0@ous.edu>
+ Subject: [PATCH 5.005_02]VMS config tweaks
+ Branch: perl
+ ! vms/descrip_mms.template vms/subconfigure.com
+____________________________________________________________________________
+[ 1915] By: gsar on 1998/10/02 04:10:47
+ Log: use Off_t to permit 64-bit seek()
+ From: Scott Henry <scotth@sgi.com>
+ Date: 29 Sep 1998 17:38:46 -0700
+ Message-ID: <yd8lnn2zb6x.fsf_-_@hoshi.engr.sgi.com>
+ Subject: Re: [PATCH] 5.005_02: Configure "Massive Attack"
+ --
+ Date: 28 Sep 1998 18:55:37 -0700
+ Message-ID: <yd8ogrz1y3q.fsf@hoshi.engr.sgi.com>
+ Subject: Re: [PATCH] 5.005_51: Configure "Massive Attack"
+ Branch: perl
+ ! doio.c pp_sys.c proto.h sv.c
+____________________________________________________________________________
+[ 1914] By: gsar on 1998/10/02 04:05:36
+ Log: normalize tm struct passed to strftime() with mktime()
+ From: Spider Boardman <spider@orb.nashua.nh.us>
+ Date: Wed, 30 Sep 1998 15:12:09 -0400
+ Message-Id: <199809301912.PAA26119@Orb.Nashua.NH.US>
+ Subject: [PATCH 5.005_52] Re: POSIX::strftime returns incorrect date
+ Branch: perl
+ ! ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 1913] By: gsar on 1998/10/02 03:59:46
+ Log: don't try to run foo_SH.orig etc.
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 1912] By: gsar on 1998/10/02 03:45:37
+ Log: make warning about glob process failure optional
+ Branch: perl
+ ! pod/perldiag.pod pp_hot.c
+____________________________________________________________________________
+[ 1911] By: gsar on 1998/10/02 02:52:21
+ Log: document yet another RE diagnostic, make it consistent with REG_INFTY
+ From: Dominic Dunlop <domo@vo.lu>
+ Date: Tue, 29 Sep 1998 21:06:30 +0000
+ Message-Id: <v03110700b236f60b1375@[212.24.192.106]>
+ Subject: [PATCH 5.005_52] Fix hard-coded "matches null string many times" limit
+ --
+ Date: Wed, 30 Sep 1998 11:46:44 +0000
+ Message-Id: <v03110702b237beb04830@[212.24.192.74]>
+ Subject: [PATCH 5.005_52] Add "Strange *+?{} ..." to perldiag
+ Branch: perl
+ ! pod/perldiag.pod regcomp.c
+____________________________________________________________________________
+[ 1910] By: gsar on 1998/10/02 02:48:48
+ Log: minor Configure tweaks (via private mail)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 30 Sep 1998 02:25:06 +0300 (EET DST)
+ Message-Id: <199809292325.CAA19737@alpha.hut.fi>
+ Subject: [PATCH] 5.005_52: the drizzle continues
+ Branch: perl
+ ! Configure config_h.SH handy.h
+____________________________________________________________________________
+[ 1909] By: gsar on 1998/10/02 02:46:39
+ Log: update SCO hints for dynamic loading
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 28 Sep 1998 16:50:38 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980928164648.8130E-100000@newton.phys>
+ Subject: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV
+ --
+ Date: Tue, 29 Sep 1998 16:48:55 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980929164612.8634A-100000@newton.phys>
+ Subject: Re: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV
+ Branch: perl
+ ! hints/sco.sh
+____________________________________________________________________________
+[ 1908] By: gsar on 1998/10/02 02:33:39
+ Log: make File::Find work when wanted() is autoloaded or a symbolic ref
+ Branch: perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 1907] By: gsar on 1998/10/02 02:21:52
+ Log: applied patches, but retained old behavior for win32 (where compilers
+ can't read from stdin at all)
+ From: Graham Barr <gbarr@ti.com>
+ Date: Mon, 28 Sep 1998 09:41:49 -0500
+ Message-ID: <19980928094149.B26576@asic.sc.ti.com>
+ Subject: Re: 5.005_51 Errno invokes cpprun incorrectly
+ --
+ Date: Tue, 29 Sep 1998 12:35:43 -0500
+ Message-ID: <19980929123543.Z26576@asic.sc.ti.com>
+ Subject: Re: 5.005_51 Errno invokes cpprun incorrectly
+ Branch: perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 1906] By: gsar on 1998/10/02 02:02:19
+ Log: tolerate whitespace in /etc/group entries (suggested by Jarkko
+ Hietaniemi)
+ Branch: perl
+ ! t/op/grent.t
+____________________________________________________________________________
+[ 1905] By: gsar on 1998/10/02 01:59:56
+ Log: win32 caveats about truncate()
+ Branch: perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 1904] By: gsar on 1998/10/02 01:53:25
+ Log: various Configure and hints updates (prefer drand48() or random()
+ over rand(); add -Dusemultiplicity; enhanced 64-bitness); patch
+ applied modulo SCO hints superceded by later patch
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 29 Sep 1998 00:56:33 +0300 (EET DST)
+ Message-Id: <199809282156.AAA18615@alpha.hut.fi>
+ Subject: [PATCH] 5.005_52: Configure et al:
+ Branch: perl
+ + ext/IPC/SysV/hints/next_3.pl
+ ! Configure INSTALL MANIFEST config_h.SH ext/IPC/SysV/SysV.xs
+ ! hints/dec_osf.sh hints/irix_6.sh hints/next_3.sh
+ ! hints/solaris_2.sh perl.h pod/perldiag.pod pp.c pp_sys.c
+____________________________________________________________________________
+[ 1903] By: gsar on 1998/10/02 01:42:37
+ Log: fixes for bugs in /RE/p from Hugo van der Sanden
+ Date: Mon, 28 Sep 1998 17:41:49 +0100
+ Message-Id: <199809281641.RAA02450@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_52] Re: More on ?p
+ --
+ Date: Thu, 01 Oct 1998 09:10:58 +0100
+ Message-Id: <199810010810.JAA16426@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_52] ?p fix
+ --
+ Date: Thu, 01 Oct 1998 10:45:56 +0100
+ Message-Id: <199810010945.KAA16733@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_52] more on ?p
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 1902] By: gsar on 1998/10/02 01:36:14
+ Log: From: Kenneth Duda <kjd@cisco.com>
+ Date: Sun, 27 Sep 1998 20:22:12 -0700 (PDT)
+ Message-Id: <199809280322.UAA01261@scorpion.cisco.com>
+ Subject: writemain dies when there are more than 4000 characters of extensions
+ Branch: perl
+ ! writemain.SH
+____________________________________________________________________________
+[ 1901] By: gsar on 1998/10/02 01:33:16
+ Log: tweak run_byacc recipe
+ Branch: perl
+ ! Makefile.SH Porting/pumpkin.pod
+____________________________________________________________________________
+[ 1900] By: gsar on 1998/10/02 01:02:09
+ Log: use SETERRNO() to reset errno (suggested by Charles Bailey)
+ Branch: perl
+ ! perl.h pp_ctl.c
+____________________________________________________________________________
+[ 1899] By: gsar on 1998/09/28 20:46:30
+ Log: fix various 5.00552 mishaps (fixes suggested by Jan Dubois,
+ Kurt Starsinic, Spider Boardman, Dan Sugalski and Albert
+ Dvornik)
+ Branch: perl
+ ! hints/irix_6.sh lib/ExtUtils/MakeMaker.pm mg.c scope.c
+____________________________________________________________________________
+[ 1898] By: gsar on 1998/09/28 20:42:52
+ Log: flush unsubmitted 5.00552 change
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 1897] By: gsar on 1998/09/27 04:43:06
+ Log: run vms_yfix.pl
+ Branch: perl
+ ! vms/perly_c.vms
+____________________________________________________________________________
+[ 1896] By: gsar on 1998/09/27 03:38:55
+ Log: small tweak on last change
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 1895] By: gsar on 1998/09/27 03:17:17
+ Log: fix win32_stat() to do the right thing for share names
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 1891] By: larry on 1998/09/25 18:50:40
+ Log: Fixed apostrophe problem from Mark Knutsen.
+ Branch: perl
+ ! sv.h
+
+----------------
+Version 5.005_52
+----------------
+
+____________________________________________________________________________
+[ 1890] By: gsar on 1998/09/25 10:25:00
+ Log: update template config.sh, add new config vars to win32 stuff
+ Branch: perl
+ ! Changes Porting/config.sh Porting/config_H config_h.SH objpp.h
+ ! pp_sys.c proto.h win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/win32.h
+____________________________________________________________________________
+[ 1889] By: gsar on 1998/09/25 07:13:13
+ Log: big Configure update from Jarkko: sync metaconfig units; d_statblks fix
+ for Linux; hpux CMA-threads hints; ELF support for FreeBSD; beginnings
+ of full-fledged 64-bit support (including support for: fseeko/ftello,
+ Quad_t aka long long, hpux and irix 64-bits hints, new 64-bit constants
+ in Fcntl)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 11 Sep 1998 23:56:11 +0300 (EET DST)
+ Message-Id: <199809112056.XAA04720@alpha.hut.fi>
+ Subject: [PATCH] 5.005_51: Configure "Massive Attack"
+ --
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: 12 Sep 1998 09:44:25 +0300
+ Message-ID: <oeeaf45bzjq.fsf@alpha.hut.fi>
+ Subject: Re: [PATCH] 5.005_51: Configure "Massive Attack"
+ Branch: perl
+ + lib/filetest.pm
+ ! Configure MANIFEST Makefile.SH config_h.SH doio.c embedvar.h
+ ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs handy.h hints/dec_osf.sh
+ ! hints/freebsd.sh hints/hpux.sh hints/irix_6.sh objXSUB.h
+ ! perl.c perl.h perl_exp.SH perlio.c perlvars.h pod/perldiag.pod
+ ! pod/perlfunc.pod pp_sys.c proto.h win32/GenCAPI.pl
+ ! win32/makedef.pl
+____________________________________________________________________________
+[ 1888] By: gsar on 1998/09/25 06:27:12
+ Log: bump patchlevel to 52; other little tweaks for threads, win32 builds
+ Branch: perl
+ ! doop.c mg.c patchlevel.h regexec.c win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makedef.pl win32/makefile.mk win32/win32.c
+____________________________________________________________________________
+[ 1887] By: gsar on 1998/09/25 04:50:49
+ Log: win32.c tweak
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 1886] By: gsar on 1998/09/25 04:47:32
+ Log: s/MAKEMAKEROPT/PERL_MM_OPT/
+ Branch: perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1885] By: gsar on 1998/09/25 04:05:09
+ Log: From: Dominic Dunlop <domo@vo.lu>
+ Date: Thu, 10 Sep 1998 11:02:46 +0000
+ Message-Id: <v03110703b21d581d7ef1@[212.24.192.107]>
+ Subject: MM_Unix::canonpath erroneously turns leading // into /
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 1884] By: gsar on 1998/09/25 03:06:10
+ Log: temporarily disable perl malloc for a2p until we clean up
+ conflicting malloc() declarations everywhere
+ Branch: perl
+ ! x2p/Makefile.SH
+____________________________________________________________________________
+[ 1883] By: gsar on 1998/09/25 02:27:00
+ Log: remove obsolete win32/bin/*.pl
+ Branch: perl
+ - win32/bin/network.pl win32/bin/webget.pl win32/bin/www.pl
+ ! Changes MANIFEST win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1882] By: gsar on 1998/09/25 02:04:43
+ Log: missing file in last submit
+ Branch: perl
+ ! proto.h
+____________________________________________________________________________
+[ 1881] By: gsar on 1998/09/25 01:56:54
+ Log: serial access to PL_x[inpr]v_root for USE_THREADS
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1880] By: gsar on 1998/09/25 01:19:38
+ Log: lock sv_mutex in new_he() and del_he() for USE_THREADS
+ From: Drago Goricanec <drago@king.otsd.ts.fujitsu.co.jp>
+ Date: Thu, 24 Sep 1998 22:01:09 +0900
+ Message-Id: <19980924220109J.drago@otsd.ts.fujitsu.co.jp>
+ Subject: [PATCH 5.005_51] Re: Perl 5.005_51 not yet multi Thread safe
+ Branch: perl
+ ! hv.c proto.h
+____________________________________________________________________________
+[ 1879] By: gsar on 1998/09/25 00:20:07
+ Log: tweaks to enable PERL_OBJECT to build & test on win32
+ Branch: perl
+ ! Changes doop.c mg.c objpp.h proto.h regexec.c util.c
+ ! win32/GenCAPI.pl
+____________________________________________________________________________
+[ 1878] By: gsar on 1998/09/25 00:13:36
+ Log: fix change#1861, which breaks default boot_xxx symbol generation
+ Branch: perl
+ ! lib/ExtUtils/Mksymlists.pm
+____________________________________________________________________________
+[ 1877] By: gsar on 1998/09/24 10:29:54
+ Log: two tweaks for clean build and test on Solaris
+ Branch: perl
+ ! op.c t/op/subst.t
+____________________________________________________________________________
+[ 1876] By: gsar on 1998/09/24 09:04:43
+ Log: From: Colin Kuskie <ckuskie@cadence.com>
+ Date: Wed, 26 Aug 1998 14:53:01 -0700 (PDT)
+ Message-ID: <Pine.GSO.3.96.980826143507.3258K-100000@pdxmail.cadence.com>
+ Subject: [PATCH 5.005_51] perlform.pod
+ Branch: perl
+ ! pod/perlform.pod
+____________________________________________________________________________
+[ 1875] By: gsar on 1998/09/24 08:47:47
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 25 Aug 1998 15:35:58 -0400 (EDT)
+ Message-Id: <199808251935.PAA11384@monk.mps.ohio-state.edu>
+ Subject: Re: problem with (?p{}) [PATCH 5.005_5*]
+ Branch: perl
+ ! regexec.c
+____________________________________________________________________________
+[ 1874] By: gsar on 1998/09/24 08:44:55
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 25 Aug 1998 14:56:06 -0400 (EDT)
+ Message-Id: <199808251856.OAA10825@monk.mps.ohio-state.edu>
+ Subject: Re: your Regexp.patch dated 21.8 [PATCH]
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 1873] By: gsar on 1998/09/24 08:39:41
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 25 Aug 1998 04:29:49 -0400 (EDT)
+ Message-Id: <199808250829.EAA02470@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Extraneous warning for (?()A|B)
+ Branch: perl
+ ! Changes regcomp.c
+____________________________________________________________________________
+[ 1872] By: gsar on 1998/09/24 08:37:00
+ Log: From: Krishna Sethuraman <krishpl@shamu.engr.sgi.com>
+ Date: Sun, 23 Aug 1998 23:18:38 PDT
+ Message-Id: <199808240618.XAA05329@shamu.engr.sgi.com>
+ Subject: new irix_6.sh hints file
+ Branch: perl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 1871] By: gsar on 1998/09/24 07:26:37
+ Log: correct FSF address in various places
+ Branch: perl
+ ! Copying README ext/B/README lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 1870] By: gsar on 1998/09/24 07:11:56
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Fri, 14 Aug 1998 09:20:16 PDT
+ Message-Id: <3.0.5.32.19980814092016.00b37dc0@ous.edu>
+ Subject: [PATCH 5.005_02] (and _5x I expect) VMS config procedure patch
+ Branch: perl
+ ! configure.com
+____________________________________________________________________________
+[ 1869] By: gsar on 1998/09/24 06:55:59
+ Log: use STRICT_ALIGNMENT on IRIX to allow usemymalloc=y again
+ From: Scott Henry <scotth@sgi.com>
+ Date: 13 Aug 1998 09:52:15 PDT
+ Message-Id: <yd8pve46czk.fsf@hoshi.engr.sgi.com>
+ Subject: [PATCH] Irix USE_LONG_LONG/malloc.c incompatibility (was...)
+ Branch: perl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 1868] By: gsar on 1998/09/24 06:51:23
+ Log: From: Nathan Torkington <gnat@frii.com>
+ Date: Thu, 13 Aug 1998 10:59:48 MDT
+ Message-Id: <199808131659.KAA06179@prometheus.frii.com>
+ Subject: [PATCH] 5.005_02 perlfunc.pod, improve umask entry
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1867] By: gsar on 1998/09/24 06:45:13
+ Log: make C<goto &sub> AUTOLOAD-aware (autouse now works for modules
+ that are autoloaded)
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 1866] By: gsar on 1998/09/24 05:21:19
+ Log: grandfather deprecated "$$<digit>" no more
+ Branch: perl
+ ! pod/perldiag.pod toke.c
+____________________________________________________________________________
+[ 1865] By: gsar on 1998/09/24 04:52:48
+ Log: tweak PERL_HASH() to h=h+(h>>5) in order to improve distribution of
+ low bits (suggested by Ilya Zakharevich)
+ Branch: perl
+ ! hv.h
+____________________________________________________________________________
+[ 1864] By: gsar on 1998/09/24 04:29:14
+ Log: move yyglobal decls from perly.c to perlvars.h, regen headers, tweak
+ perly_c.diff
+ Branch: perl
+ ! embed.h embedvar.h global.sym perlvars.h perly.c perly.h
+ ! perly_c.diff toke.c
+____________________________________________________________________________
+[ 1863] By: gsar on 1998/09/24 03:36:30
+ Log: provide locked access to string table for USE_THREADS
+ Branch: perl
+ ! embedvar.h hv.c intrpvar.h objXSUB.h perl.c thread.h
+____________________________________________________________________________
+[ 1862] By: gsar on 1998/09/24 03:30:32
+ Log: remove bogus warn()
+ Branch: perl
+ ! embed.pl
+____________________________________________________________________________
+[ 1861] By: gsar on 1998/09/24 02:58:51
+ Log: applied suggested patch, adapted for all platforms
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sun, 20 Sep 1998 12:56:38 +0200
+ Message-ID: <3604de0c.12319885@smtp1.ibm.net>
+ Subject: [New PATCH 5.005_02] Support Mksymlists FUNCLIST argument in MakeMaker
+ Branch: perl
+ ! lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MM_Win32.pm
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1860] By: gsar on 1998/09/24 02:16:14
+ Log: upgrade to CPAN-1.40
+ Branch: perl
+ ! Changes lib/CPAN.pm lib/CPAN/FirstTime.pm
+____________________________________________________________________________
+[ 1859] By: gsar on 1998/09/24 02:08:59
+ Log: use $ENV{MAKEMAKEROPT} to set default command line args
+ Branch: perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1857] By: gsar on 1998/09/23 10:58:36
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 22 Sep 1998 17:30:16 -0400 (EDT)
+ Message-Id: <199809222130.RAA17034@monk.mps.ohio-state.edu>
+ Subject: More verbose Test::Harness [PATCH]
+ Branch: perl
+ ! lib/Test/Harness.pm
+____________________________________________________________________________
+[ 1856] By: gsar on 1998/09/23 10:56:24
+ Log: update hints for OPENSTEP 4.2 on i386
+ From: Gerben Wierda <Gerben_Wierda@RnA.nl>
+ Date: Sun, 20 Sep 1998 01:03:18 +0200
+ Message-Id: <9809192303.AA29190@Spike>
+ Subject: Perl 5.005_02 compilation problems
+ Branch: perl
+ ! hints/next_4.sh
+____________________________________________________________________________
+[ 1855] By: gsar on 1998/09/23 10:52:27
+ Log: reset errno after C<require> search (as suggested by Larry)
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 1854] By: gsar on 1998/09/23 10:50:26
+ Log: misc pod tweaks
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlport.pod
+____________________________________________________________________________
+[ 1853] By: gsar on 1998/09/23 10:46:06
+ Log: make Pod/Html.pm handle the --title option properly (as suggested
+ by gml4410@ggr.co.uk)
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 1852] By: gsar on 1998/09/23 10:41:39
+ Log: SSNEW() API for allocating memory on the savestack
+ From: Albert Dvornik <bert@genscan.com>
+ Date: 17 Sep 1998 19:23:07 -0400
+ Message-Id: <tqemtae338.fsf@puma.genscan.com>
+ Subject: [PATCH 5.005_51] (was: why SAVEDESTRUCTOR()...)
+ Branch: perl
+ ! Changes Changes5.005 embed.h global.sym mg.c objXSUB.h objpp.h
+ ! perl.h proto.h scope.c scope.h t/io/tell.t
+____________________________________________________________________________
+[ 1851] By: gsar on 1998/09/23 10:37:05
+ Log: From: Jochen Wiedmann <joe@ispsoft.de>
+ Date: Thu, 17 Sep 1998 17:16:06 +0200
+ Message-ID: <360127B6.E44564A@ispsoft.de>
+ Subject: [PATCH] ExtUtils::MakeMaker::prompt cannot return 0
+ Branch: perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1850] By: gsar on 1998/09/23 10:33:05
+ Log: From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
+ Date: 15 Sep 1998 01:32:31 +0200
+ Message-ID: <sfchfya46eo.fsf@dubravka.in-berlin.de>
+ Subject: Re: [PATCH] MakeMaker "test" target doesn't depend on "all"
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 1849] By: gsar on 1998/09/23 10:29:04
+ Log: From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Sat, 12 Sep 1998 19:25:32 -0400 (EDT)
+ Message-id: <01J1QBJUAY1I002KOW@cor.newman.upenn.edu>
+ Subject: Re: extralibs.ld problem in MM_VMS.pm
+ Branch: perl
+ ! lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 1848] By: gsar on 1998/09/23 10:25:24
+ Log: From: Roderick Schertler <roderick@argon.org>
+ Date: 11 Sep 1998 16:19:21 -0400
+ Message-ID: <pzyarqpfli.fsf@eeyore.ibcinc.com>
+ Subject: Re: Open2 and memory leaks
+ Branch: perl
+ ! lib/IPC/Open3.pm
+____________________________________________________________________________
+[ 1847] By: gsar on 1998/09/23 10:18:31
+ Log: From: Roderick Schertler <roderick@argon.org>
+ Date: Wed, 09 Sep 1998 23:52:48 -0400
+ Message-ID: <20567.905399568@eeyore.ibcinc.com>
+ Subject: seed srand from /dev/urandom when possible
+ Branch: perl
+ ! pod/perlfunc.pod pp.c
+____________________________________________________________________________
+[ 1846] By: gsar on 1998/09/23 10:12:22
+ Log: From: Roderick Schertler <roderick@argon.org>
+ Date: Thu, 10 Sep 1998 00:32:17 -0400
+ Message-ID: <21142.905401937@eeyore.ibcinc.com>
+ Subject: doc update for crypt()'s salt
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1845] By: gsar on 1998/09/23 10:09:23
+ Log: fix h2ph handling of C<#error "foo">
+ From: SAKAI Kiyotaka <ksakai@netwk.ntt-at.co.jp>
+ Date: Thu, 10 Sep 1998 09:59:33 +0900
+ Message-Id: <19980910095933N.ksakai@netwk.ntt-at.co.jp>
+ Subject: [5.005_02] h2ph problem
+ Branch: perl
+ ! utils/h2ph.PL
+____________________________________________________________________________
+[ 1844] By: gsar on 1998/09/23 10:06:13
+ Log: plug strictly private function leaks in API listing
+ Branch: perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 1843] By: gsar on 1998/09/23 10:02:57
+ Log: hide symbol for static build
+ From: Dominic Dunlop <domo@vo.lu>
+ Date: Tue, 8 Sep 1998 21:40:46 +0000
+ Message-Id: <v03110700b21b52db318d@[212.24.192.111]>
+ Subject: Not OK: perl 5.00551 on powerpc-machten 4.1.1 [PATCH]
+ Branch: perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 1842] By: gsar on 1998/09/23 09:52:46
+ Log: define PUT_svindex(), PUT_opindex()
+ Branch: perl
+ ! ext/B/B/Assembler.pm
+____________________________________________________________________________
+[ 1841] By: gsar on 1998/09/23 09:44:25
+ Log: From: Dominic Dunlop <domo@vo.lu>
+ Date: Tue, 8 Sep 1998 15:34:53 +0000
+ Message-Id: <v03110701b21afbdc7cfb@[212.24.192.76]>
+ Subject: [PATCH 5.005_51] Eliminate pragma/warn-regexec test dependence on REG_INFTY value
+ Branch: perl
+ ! t/pragma/warn/regexec
+____________________________________________________________________________
+[ 1840] By: gsar on 1998/09/23 09:42:17
+ Log: pl2bat tweak from Tye McQueen <tye@metronet.com>
+ Branch: perl
+ ! win32/bin/pl2bat.pl
+____________________________________________________________________________
+[ 1839] By: gsar on 1998/09/23 09:38:18
+ Log: From: Drago Goricanec <drago@raptor.otsd.ts.fujitsu.co.jp>
+ Date: Mon, 7 Sep 1998 17:36:09 +0900
+ Message-Id: <199809070836.RAA14631@raptor.otsd.ts.fujitsu.co.jp>
+ Subject: Thread::cond_wait bug in 5.005.51 causes deadlock
+ Branch: perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 1838] By: gsar on 1998/09/23 09:21:11
+ Log: From: "Green, Paul" <pgreen@seussnt.stratus.com>
+ Date: Thu, 10 Sep 1998 00:02:07 -0400
+ Message-ID: <646CD0392810D211B04A00A024BF26FB1022EB@terminator.sw.stratus.com>
+ Subject: RE: [PATCH] 5.005_02 and 5.005_51: Stratus VOS port
+ Branch: perl
+ + README.vos vos/Changes vos/build.cm vos/compile_perl.cm
+ + vos/config.h vos/config_h.SH_orig vos/perl.bind
+ + vos/test_vos_dummies.c vos/vos_dummies.c vos/vosish.h
+ ! MANIFEST perl.c perl.h pod/perlport.pod
+____________________________________________________________________________
+[ 1837] By: gsar on 1998/09/23 08:45:58
+ Log: (via private mail)
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Sat, 05 Sep 1998 01:23:58 -0400 (EDT)
+ Message-id: <01J1FH7R43NS002F14@cor.newman.upenn.edu>
+ Subject: [Patch 5.005_02] Miscellaneous VMS cleanup
+ Branch: perl
+ ! Changes Changes5.005 README.vms ext/DynaLoader/dl_vms.xs
+ ! lib/Cwd.pm lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/ExtUtils/Mksymlists.pm lib/File/Copy.pm lib/File/Path.pm
+ ! lib/File/Spec.pm pod/perldiag.pod pod/perlfaq1.pod
+ ! pod/perlport.pod pod/perlrun.pod vms/ext/DCLsym/0README.txt
+ ! vms/ext/DCLsym/DCLsym.pm vms/ext/DCLsym/DCLsym.xs
+ ! vms/ext/Filespec.pm vms/ext/XSSymSet.pm vms/gen_shrfls.pl
+ ! vms/mms2make.pl vms/perly_c.vms vms/sockadapt.c
+ ! vms/sockadapt.h vms/test.com vms/vms.c vms/vms_yfix.pl
+ ! vms/writemain.pl
+____________________________________________________________________________
+[ 1836] By: gsar on 1998/09/23 08:17:42
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 5 Sep 1998 00:14:51 -0400 (EDT)
+ Message-Id: <199809050414.AAA19801@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] OS/2 spawning typos
+ Branch: perl
+ ! os2/os2.c
+____________________________________________________________________________
+[ 1835] By: gsar on 1998/09/23 08:09:55
+ Log: warn on C<my($foo,$foo)>
+ Branch: perl
+ ! op.c pod/perldiag.pod
+____________________________________________________________________________
+[ 1834] By: gsar on 1998/09/23 07:35:56
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Fri, 4 Sep 98 13:27:41 PDT
+ Message-Id: <9809042027.AA04463@forte.com>
+ Subject: [PATCH 5.005_02 && 5.005_51] general updates to README.vms
+ Branch: perl
+ ! README.vms
+____________________________________________________________________________
+[ 1833] By: gsar on 1998/09/23 07:27:34
+ Log: From: Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
+ Date: Wed, 2 Sep 1998 10:06:49 -0700 (PDT)
+ Message-Id: <199809021706.KAA26349@xfiles.intercon.hp.com>
+ Subject: PATCH: 5.005_02 hint/hpux.sh
+ Branch: perl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 1832] By: gsar on 1998/09/23 07:22:40
+ Log: fix (some) installhtml bugs
+ From: Larry Parmelee <parmelee@CS.Cornell.EDU>
+ Date: Tue, 1 Sep 1998 12:43:40 -0400 (EDT)
+ Message-Id: <199809011643.MAA05702@sundown.cs.cornell.edu>
+ Subject: installhtml script needs work
+ Branch: perl
+ ! installhtml
+____________________________________________________________________________
+[ 1831] By: gsar on 1998/09/23 07:19:30
+ Log: document 'U' magic with examples
+ From: Alan Burlison <Alan.Burlison@UK.Sun.com>
+ Date: Tue, 1 Sep 1998 15:54:06 +0100 (BST)
+ Message-Id: <199809011455.PAA00631@sale-wts>
+ Subject: Re: Looking for some XS MAGIC examples...
+ Branch: perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 1830] By: gsar on 1998/09/23 07:16:43
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Mon, 31 Aug 98 17:13:49 PDT
+ Message-Id: <9809010013.AA06737@forte.com>
+ Subject: [PATCH: 5.005_02; yet another system configuration tip for OS/390]
+ Branch: perl
+ ! README.os390
+____________________________________________________________________________
+[ 1829] By: gsar on 1998/09/23 07:15:08
+ Log: fix problematic typecast in filter_del()
+ From: Mark P Lutz <tecmpl1@triton.ca.boeing.com>
+ Date: Mon, 31 Aug 1998 21:13:11 GMT
+ Message-Id: <199808312113.VAA53356@triton.ca.boeing.com>
+ Subject: perl5.005_02 does not build on Cray T90
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 1828] By: gsar on 1998/09/23 07:11:34
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 31 Aug 1998 14:52:10 -0400 (EDT)
+ Message-Id: <199808311852.OAA24676@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_5*] (?>) broken in RE
+ Branch: perl
+ ! regexec.c t/op/re_tests
+____________________________________________________________________________
+[ 1827] By: gsar on 1998/09/23 07:09:50
+ Log: U/WIN testsuite patches from Joe Buehler <jhpb@hekimian.com>
+ Branch: perl
+ ! t/op/grent.t t/op/groups.t
+____________________________________________________________________________
+[ 1826] By: gsar on 1998/09/23 07:03:16
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 12 Aug 1998 22:41:37 +0300 (EET DST)
+ Message-Id: <199808121941.WAA06263@alpha.hut.fi>
+ Subject: [PATCH] 5.004_50 or 5.005_02: get rid of interp.sym because not even AIX needs it
+ Branch: perl
+ - interp.sym
+ ! MANIFEST Makefile.SH embed.pl perl_exp.SH
+____________________________________________________________________________
+[ 1825] By: gsar on 1998/09/23 06:56:40
+ Log: re-introduce change#1703
+ Branch: perl
+ ! ext/re/re.pm pod/perlre.pod regcomp.c regexec.c thrdvar.h
+____________________________________________________________________________
+[ 1824] By: gsar on 1998/09/23 06:44:19
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 29 Aug 1998 17:38:30 -0400 (EDT)
+ Message-Id: <199808292138.RAA18359@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Protect debugger from nonlocal exits
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 1823] By: gsar on 1998/09/23 06:41:34
+ Log: From: Joe Buehler <jhpb@hekimian.com>
+ Date: 29 Aug 1998 17:13:28 -0400
+ Message-ID: <yd37lzro5jb.fsf@pandora.hekimian.com>
+ Subject: patches for perl 5.005_51 under U/WIN
Branch: perl
- ! pp_hot.c
+ + hints/uwin.sh
+ ! Configure installman lib/ExtUtils/MM_Unix.pm makedepend.SH
+ ! t/lib/posix.t
____________________________________________________________________________
-[ 128] By: TimBunce on 1997/10/15 15:55:26
- Log: Maintenance 5.004_04 changes
- Branch: maint-5.004/perl
- + hints/os390.sh lib/base.pm t/lib/dosglob.t
- - ext/util/extliblist
- ! Changes Configure INSTALL MANIFEST Makefile.SH Porting/makerel
- ! Porting/patchls Porting/pumpkin.pod README.vms av.c configpm
- ! doop.c eg/sysvipc/ipcsem emacs/cperl-mode.el embed.h
- ! ext/DynaLoader/DynaLoader.pm ext/IO/lib/IO/Socket.pm
- ! ext/util/make_ext global.sym gv.c hints/bsdos.sh
- ! hints/dec_osf.sh hints/dynixptx.sh hints/irix_6.sh
- ! hints/linux.sh hints/machten.sh hints/os2.sh hints/qnx.sh hv.c
- ! installperl lib/AutoLoader.pm lib/CPAN.pm
- ! lib/CPAN/FirstTime.pm lib/Carp.pm lib/Cwd.pm lib/English.pm
- ! lib/ExtUtils/Install.pm lib/ExtUtils/Liblist.pm
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/xsubpp
- ! lib/File/DosGlob.pm lib/File/Find.pm lib/FileHandle.pm
- ! lib/Getopt/Long.pm lib/Getopt/Std.pm lib/Math/Complex.pm
- ! lib/Sys/Hostname.pm lib/Sys/Syslog.pm lib/Test/Harness.pm
- ! lib/Time/Local.pm lib/autouse.pm lib/blib.pm
- ! lib/diagnostics.pm lib/getopt.pl lib/perl5db.pl lib/vars.pm
- ! makedepend.SH malloc.c mg.c miniperlmain.c myconfig op.c
- ! opcode.h os2/Changes os2/OS2/REXX/Makefile.PL
- ! os2/OS2/REXX/REXX.pm os2/os2.c patchlevel.h perl.c perl.h
- ! perly.c perly.fixer perly.y pod/perl.pod pod/perlapio.pod
- ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
- ! pod/perlguts.pod pod/perlipc.pod pod/perlop.pod
- ! pod/perlrun.pod pod/perlsec.pod pod/perlsub.pod
- ! pod/perltrap.pod pod/perlvar.pod pod/perlxs.pod pp.c pp_ctl.c
- ! pp_hot.c pp_sys.c proto.h regcomp.c regexec.c scope.c sv.c
- ! t/TEST t/comp/proto.t t/lib/complex.t t/lib/io_sock.t
- ! t/lib/io_udp.t t/op/glob.t t/op/method.t t/op/misc.t
- ! t/op/ref.t t/op/runlevel.t t/op/split.t t/op/sprintf.t
- ! t/op/subst.t t/op/taint.t t/pragma/locale.t taint.c toke.c
- ! unixish.h util.c utils/h2ph.PL utils/h2xs.PL utils/perlbug.PL
- ! utils/perldoc.PL vms/perly_c.vms vms/vms.c vms/vmsish.h
- ! win32/Makefile win32/config_H.bc win32/config_H.vc
- ! win32/makefile.mk win32/pod.mak win32/win32.c win32/win32io.c
- ! win32/win32sck.c x2p/Makefile.SH x2p/util.c
-____________________________________________________________________________
-[ 127] By: mbeattie on 1997/10/15 10:00:18
- Log: Added fakethr.h.
- Branch: perl
- + fakethr.h
-____________________________________________________________________________
-[ 126] By: mbeattie on 1997/10/15 09:50:57
- Log: pthread_condattr_init in thread.h for OLD_PTHREADS_API.
- Branch: perl
- ! thread.h
-____________________________________________________________________________
-[ 125] By: mbeattie on 1997/10/15 09:09:24
- Log: Started rewriting thread state machine.
- Branch: perl
- ! perl.c thread.h
- Branch: perlext
- ! Thread/Thread.xs
-____________________________________________________________________________
-[ 124] By: gsar on 1997/10/14 00:23:15
- Log: Remove spurious extra MUTEX_LOCK in pp_entersub(). Now builds and passes
- tests in win32 version of latest perlext/Thread.
- Branch: win32/perl
- ! pp_hot.c
+[ 1822] By: gsar on 1998/09/23 06:36:59
+ Log: add missing C<no utf8;> tweak from Larry
+ Branch: perl
+ ! t/op/subst.t
____________________________________________________________________________
-[ 123] By: gsar on 1997/10/13 23:18:38
- Log: Initial merge of win32 threads patch.
- Branch: win32/perl
- ! embed.h global.sym interp.sym perl.c perl.h pp_hot.c thread.h
- ! win32/Makefile win32/makedef.pl win32/makefile.mk
- ! win32/perllib.c win32/pod.mak win32/win32.h
-____________________________________________________________________________
-[ 122] By: gsar on 1997/10/10 20:58:40
- Log: Integrated changes on mainline into the win32 branch. Had to set
- P4USER=mbeattie for the resolve step (due to the presence of newly
- branched files that had not been submitted?)
- Branch: win32/perl
- +> Porting/makerel Porting/patchls README.threads Todo.5.005
- +> ext/attrs/Makefile.PL ext/attrs/attrs.pm ext/attrs/attrs.xs
- +> hints/newsos4.sh lib/File/DosGlob.pm lib/chat2.pl perlio.sym
- +> win32/bin/pl2bat.pl win32/bin/runperl.pl win32/bin/search.pl
- +> win32/bin/webget.pl win32/config.bc win32/config.vc
- +> win32/config_H.bc win32/config_H.vc win32/makefile.mk
- - win32/bin/pl2bat.bat win32/bin/search.bat win32/bin/test.bat
- - win32/bin/webget.bat win32/config.H win32/config.w32
- ! thread.h
- !> (integrate 858 files)
-____________________________________________________________________________
-[ 121] By: mbeattie on 1997/10/10 17:23:41
- Log: Tweak a few Thread tests.
- Branch: perlext
- + Thread/join2.t
- ! Thread/io.t Thread/sync2.t
-____________________________________________________________________________
-[ 120] By: mbeattie on 1997/10/10 17:22:46
- Log: Rewrite thread destruction system using linked list of threads.
- Still not completely done. Add methods self, equal, flags, list
- to Thread.xs. Add Thread_MAGIC_SIGNATURE check to typemap.
- Branch: perl
- ! perl.c perl.h thread.h
- Branch: perlext
- ! Thread/Thread.xs Thread/typemap
-____________________________________________________________________________
-[ 119] By: mbeattie on 1997/10/10 17:19:55
- Log: Fix up locking/synchronisation for pp_entersub.
+[ 1821] By: gsar on 1998/09/23 06:27:51
+ Log: s/runops/CALLRUNOPS/
+ Branch: perl
+ ! cc_runtime.h
+____________________________________________________________________________
+[ 1820] By: gsar on 1998/09/23 06:24:49
+ Log: rename t/pragma/warn-* to t/pragma/warn/*, be 8.3-friendly
+ Branch: perl
+ +> t/pragma/warn/1global t/pragma/warn/2use t/pragma/warn/3both
+ +> t/pragma/warn/4lint t/pragma/warn/5nolint t/pragma/warn/doio
+ +> t/pragma/warn/gv t/pragma/warn/mg t/pragma/warn/op
+ +> t/pragma/warn/perl t/pragma/warn/perly t/pragma/warn/pp
+ +> t/pragma/warn/pp_ctl t/pragma/warn/pp_hot t/pragma/warn/pp_sys
+ +> t/pragma/warn/regcomp t/pragma/warn/regexec t/pragma/warn/sv
+ +> t/pragma/warn/taint t/pragma/warn/toke t/pragma/warn/universal
+ +> t/pragma/warn/util
+ - t/pragma/warn-1global t/pragma/warn-2use t/pragma/warn-3both
+ - t/pragma/warn-4lint t/pragma/warn-5nolint t/pragma/warn-doio
+ - t/pragma/warn-gv t/pragma/warn-mg t/pragma/warn-op
+ - t/pragma/warn-perl t/pragma/warn-perly t/pragma/warn-pp
+ - t/pragma/warn-pp_ctl t/pragma/warn-pp_hot t/pragma/warn-pp_sys
+ - t/pragma/warn-regcomp t/pragma/warn-regexec t/pragma/warn-sv
+ - t/pragma/warn-taint t/pragma/warn-toke t/pragma/warn-universal
+ - t/pragma/warn-util
+ ! MANIFEST t/pragma/warning.t
+____________________________________________________________________________
+[ 1819] By: gsar on 1998/09/23 06:08:46
+ Log: make \(%foo) return refs to values (not copies of values)
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ Date: Fri, 28 Aug 1998 20:46:10 -0700 (PDT)
+ Message-ID: <13799.30680.47765.352558@fre-76-120.reshall.berkeley.edu>
+ --
+ From: Roderick Schertler <roderick@argon.org>
+ Date: Sat, 29 Aug 1998 00:58:33 -0400
+ Message-ID: <29894.904366713@eeyore.ibcinc.com>
+ Subject: Re: \(%x) problems
Branch: perl
- ! pp_hot.c
+ ! doop.c pod/perlref.pod
____________________________________________________________________________
-[ 118] By: mbeattie on 1997/10/10 09:55:32
- Log: Put back entries in MANIFEST for the four now-returned win32/* files
+[ 1818] By: gsar on 1998/09/23 06:05:08
+ Log: make h2xs generate ANSI prototypes
Branch: perl
- ! MANIFEST
+ ! utils/h2xs.PL
____________________________________________________________________________
-[ 117] By: mbeattie on 1997/10/10 08:12:23
- Log: Took out mystack_foo for good, fixed up interp.sym and win32/makedef.pl
+[ 1817] By: gsar on 1998/09/23 05:57:16
+ Log: updated usethreads hints for hpux 10.X
+ From: Matthew T Harden <mthard@mthard1.monsanto.com>
+ Date: Fri, 28 Aug 1998 14:10:42 GMT
+ Message-Id: <199808281410.AA11058@mthard1.monsanto.com>
+ Subject: Re: OK: perl 5.00502 on PA-RISC1.1-thread 10.20 (UNINSTALLED)
Branch: perl
- ! Todo.5.005 embed.h interp.sym perl.h win32/makedef.pl
+ ! hints/hpux.sh perl.h
____________________________________________________________________________
-[ 116] By: mbeattie on 1997/10/08 15:41:08
- Log: Add missing sig_pipe definition to Thread.xs.
- Branch: perlext
- ! Thread/Thread.xs
+[ 1816] By: gsar on 1998/09/23 05:53:31
+ Log: don't create empty directories in installperl
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Fri, 21 Aug 1998 11:29:24 +0100 (BST)
+ Message-Id: <199808211029.LAA00551@cyclone.cise.npl.co.uk>
+ Subject: [PATCH 5.005_02] install: empty dirs
+ Branch: perl
+ ! installperl
____________________________________________________________________________
-[ 115] By: mbeattie on 1997/10/08 15:40:46
- Log: Fix up 5.004_03 merge: remove missing win32 files from MANIFEST,
- add missing dTHR; to new function unwind_handler_stack() in mg.c
- and bump patchlevel.h to 5.004_52.
+[ 1815] By: gsar on 1998/09/23 05:50:36
+ Log: make behavior of /(a{3})+/ like /(aaa)+/ w.r.t where it matches
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 21 Aug 1998 05:41:02 -0400 (EDT)
+ Message-Id: <199808210941.FAA16467@monk.mps.ohio-state.edu>
+ Subject: Re: your mail
Branch: perl
- ! MANIFEST mg.c patchlevel.h
+ ! regexec.c t/op/re_tests
____________________________________________________________________________
-[ 114] By: mbeattie on 1997/10/08 10:19:27
- Log: Merge maint-5.004 branch (5.004_03) with mainline.
- MANIFEST is out of sync.
+[ 1814] By: gsar on 1998/09/23 05:45:17
+ Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ Date: Thu, 20 Aug 1998 20:59:03 -0400
+ Message-ID: <19980820205903.A12908@O2.chapin.edu>
+ Subject: [PATCH] h2ph misquotes #error directives
Branch: perl
- +> win32/bin/pl2bat.pl win32/bin/runperl.pl win32/bin/search.pl
- +> win32/bin/webget.pl
- - win32/bin/pl2bat.bat win32/bin/search.bat win32/bin/test.bat
- - win32/bin/webget.bat
- !> (integrate 168 files)
+ ! t/lib/h2ph.pht utils/h2ph.PL
____________________________________________________________________________
-[ 113] By: mbeattie on 1997/10/05 17:52:49
- Log: Move init of global mutexes/cond vars earlier.
+[ 1813] By: gsar on 1998/09/23 05:42:41
+ Log: patch to support computed regular subexpressions
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 20 Aug 1998 15:19:50 -0400 (EDT)
+ Message-Id: <199808201919.PAA04692@monk.mps.ohio-state.edu>
+ Subject: [5.005_5* PATCH] Postponed RE - now!
Branch: perl
- ! perl.c
+ ! embedvar.h objXSUB.h pod/perlre.pod regcomp.c regexec.c
+ ! t/op/pat.t t/op/re_tests thrdvar.h toke.c
____________________________________________________________________________
-[ 112] By: nick on 1997/10/04 15:25:28
- Log: Add perl.sym to MANIFEST
- Branch: oneperl
- ! MANIFEST
+[ 1812] By: gsar on 1998/09/23 05:26:26
+ Log: better CR-handling on shebang line and in formats (fixed variant of
+ patch suggested by Igor Sysoev <igor@nitek.ru>)
+ Branch: perl
+ ! perl.c toke.c
____________________________________________________________________________
-[ 111] By: nick on 1997/10/04 15:23:37
- Log: Missing file
- Branch: oneperl
- + perl.sym
-____________________________________________________________________________
-[ 110] By: nick on 1997/10/04 13:04:26
- Log: Now builds the extensions as well
- Passes all tests
- Branch: oneperl
- ! XSUB.h embed.pl ext/DynaLoader/dlutils.c ext/Opcode/Opcode.xs
- ! mg.c op.c perl.c pp_ctl.c pp_hot.c pp_sys.c proto.h sv.c
- ! toke.c util.c writemain.SH
-____________________________________________________________________________
-[ 109] By: nick on 1997/10/04 12:02:14
- Log: Odd checkin issue
- Branch: oneperl
- ! dump.c global.sym gv.c hv.c malloc.c mg.c op.c opcode.h perl.c
- ! perly.c perly.c.diff perly.h perly.y pp.c pp_hot.c pp_sys.c
- ! proto.h scope.c sv.c toke.c universal.c util.c vms/perly_c.vms
- ! vms/perly_h.vms writemain.SH
-____________________________________________________________________________
-[ 108] By: nick on 1997/10/04 11:12:52
- Log: Added lots of (missing) prototypes (ckprotos is util to check)
- Fixed missing aTHIS flagged by above.
- -DUSE_THISPTR passes minitest!
- Branch: oneperl
- + ckprotos
- ! dump.c global.sym gv.c hv.c malloc.c mg.c op.c opcode.h perl.c
- ! perly.c perly.c.diff perly.h perly.y pp.c pp_hot.c pp_sys.c
- ! proto.h scope.c sv.c toke.c universal.c util.c vms/perly_c.vms
- ! vms/perly_h.vms
-____________________________________________________________________________
-[ 107] By: nick on 1997/10/03 22:36:52
- Log: .y muddle fixup - will get this sorted oneday ...
- Branch: oneperl
- ! miniperlmain.c perly.c perly.c.diff perly.h vms/perly_c.vms
- ! vms/perly_h.vms
-____________________________________________________________________________
-[ 106] By: mbeattie on 1997/10/03 17:12:33
- Log: Remove last traces of "tokenbuf as temp buffer" and removed it
- from struct thread. Added missing thr->Tfoo defines for statbuf
- and timesbuf and removed unused Tbuf field.
- Branch: perl
- ! doio.c mg.c perl.c pp_sys.c sv.c thread.h
-____________________________________________________________________________
-[ 105] By: nick on 1997/10/03 15:56:50
- Log: dTHIS -> hasTHIS, dTHR -> dTHR; builds without THISPTR with/without USE_THREADS
- Branch: oneperl
- ! XSUB.h av.c deb.c doio.c doop.c dump.c embed.pl global.sym
- ! gv.c hv.c mg.c op.c perl.c perl.h perlio.c perly.c pp.c pp.h
- ! pp_ctl.c pp_hot.c pp_sys.c regcomp.c regexec.c run.c scope.c
- ! sv.c taint.c thread.h toke.c universal.c util.c
+[ 1811] By: gsar on 1998/09/23 04:35:46
+ Log: document non-loopish blocks better
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Tue, 18 Aug 1998 12:28:36 +0100
+ Message-Id: <E0z8jwK-00057Z-00@ursa.cus.cam.ac.uk>
+ Subject: Re: next in do {} while block gives error message
+ Branch: perl
+ ! pod/perlfunc.pod
____________________________________________________________________________
-[ 104] By: mbeattie on 1997/10/03 15:23:25
- Log: Back out sv_bless3 change which made pp_bless zap '~'-magic.
+[ 1810] By: gsar on 1998/09/23 04:12:05
+ Log: fix bogus integerization of pop()'s return value
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Sat, 15 Aug 1998 23:27:54 -0400
+ Message-Id: <199808160327.XAA05186@aatma.engin.umich.edu>
+ Subject: Re: Complex expression does integer arithmetic
Branch: perl
- ! global.sym pp.c proto.h sv.c
+ ! opcode.h opcode.pl
____________________________________________________________________________
-[ 103] By: mbeattie on 1997/10/03 15:17:39
- Log: Fixed sv_mutex locking for new_SV, del_SV and nice_chunks.
+[ 1809] By: gsar on 1998/09/23 04:09:43
+ Log: tweak README.win32
Branch: perl
- ! av.c hv.c perl.h sv.c
+ ! README.win32
____________________________________________________________________________
-[ 102] By: mbeattie on 1997/10/03 11:53:51
- Log: Reliable thread signal handling.
+[ 1808] By: gsar on 1998/09/23 03:40:57
+ Log: better diagnostic for do{} used as lvalue
Branch: perl
- ! global.sym mg.c perl.c perl.h
- Branch: perlext
- ! Thread/Thread.xs
+ ! op.c pod/perlport.pod
____________________________________________________________________________
-[ 101] By: nick on 1997/10/02 20:43:17
- Log: Cleanup perly.y stuff
- Branch: oneperl
- ! embed.h perly.c perly.c.diff vms/perly_c.vms vms/perly_h.vms
+[ 1807] By: gsar on 1998/09/23 03:38:30
+ Log: enable PERL_SBRK_VIA_MALLOC on OPENSTEP-Mach
+ From: hansm@icgroup.nl
+ Date: Tue, 11 Aug 98 21:08:51 +0200
+ Message-Id: <9808111907.AA21903@icgned.icgroup.nl>
+ Subject: Not OK: perl 5.00551 on OPENSTEP-Mach 4_1 (UNINSTALLED)
+ Branch: perl
+ ! malloc.c
____________________________________________________________________________
-[ 100] By: nick on 1997/10/02 18:54:08
- Log: Compiles with less invasive aTHIS adding
- Branch: oneperl
- + nothis.sym
- ! MANIFEST XSUB.h av.c cop.h deb.c doio.c doop.c dump.c embed.h
- ! embed.pl global.sym gv.c gv.h handy.h hv.c hv.h mg.c op.c op.h
- ! opcode.h perl.c perl.h perlio.c perlsdio.h perly.c
- ! perly.c.diff perly.y pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c
- ! proto.h regcomp.c regcomp.h regexec.c run.c scope.c scope.h
- ! sv.c sv.h t/op/sort.t taint.c thread.h toke.c universal.c
- ! util.c vars.h
-
-----------------
-Version 5.004_51
-----------------
-
+[ 1806] By: gsar on 1998/09/23 03:36:08
+ Log: support make written in perl (aka "pmake") on win32
+ Branch: perl
+ ! lib/ExtUtils/MM_Win32.pm
____________________________________________________________________________
-[ 99] By: mbeattie on 1997/10/02 17:23:48
- Log: Added Thread/queue.t.
- Branch: perlext
- + Thread/queue.t
+[ 1805] By: gsar on 1998/09/23 03:30:07
+ Log: fix mismatched UV/U32 types for to_utf8_*()
+ Branch: perl
+ ! utf8.c
____________________________________________________________________________
-[ 98] By: mbeattie on 1997/10/02 17:19:44
- Log: Bumped patchlevel to 51. Updated Todo.5.005.
+[ 1804] By: gsar on 1998/09/23 03:22:22
+ Log: From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Sun, 9 Aug 1998 22:38:23 +0200
+ Message-ID: <19980809223823.A215@cdata.tvnet.hu>
+ Subject: [PATCH 5.5002] dos-djgpp update
Branch: perl
- ! Todo.5.005 patchlevel.h
+ ! t/io/fs.t
____________________________________________________________________________
-[ 97] By: mbeattie on 1997/10/02 17:07:47
- Log: Update README.threads amd Thread/README
+[ 1803] By: gsar on 1998/09/23 03:20:13
+ Log: apply minimal variant of patch (sent via private mail)
+ From: jarkko.hietaniemi@research.nokia.com (Jarkko Hietaniemi)
+ Date: Wed, 12 Aug 1998 15:42:35 +0300
+ Message-Id: <199808121242.PAA29761@comanche.spices>
+ Subject: [PATCH] 5.004_02 or 5.005_51: fix regexp and tr character ranges in non-ASCII lands
Branch: perl
- ! README.threads
- Branch: perlext
- ! Thread/README
+ ! MANIFEST perl.h pod/perllocale.pod pod/perlop.pod
+ ! pod/perlre.pod regcomp.c t/pragma/locale.t toke.c
____________________________________________________________________________
-[ 96] By: mbeattie on 1997/10/02 16:58:47
- Log: Configure -Dusethreads hints for dec_osf and solaris_2 and
- fix sv_bless3 prototype.
+[ 1802] By: gsar on 1998/09/23 03:03:39
+ Log: adjust searchdict.t for EBCDIC (still needs documenting)
+ From: pvhp@forte.com (Peter Prymmer)
+ Date: Thu, 6 Aug 98 18:09:39 PDT
+ Message-Id: <9808070109.AA06158@forte.com>
+ Subject: [PATCH 5.005_02-TRIAL2] potential modification to t/lib/searchdict.t
Branch: perl
- ! hints/dec_osf.sh hints/solaris_2.sh sv.c
+ ! README.os390 t/lib/searchdict.t
____________________________________________________________________________
-[ 95] By: mbeattie on 1997/10/02 16:50:21
- Log: Fixed broken typemap for Thread.
- Branch: perlext
- ! Thread/typemap
+[ 1801] By: gsar on 1998/09/23 02:54:15
+ Log: silence redefined warning for XS(INIT) {}
+ Branch: perl
+ ! op.c
____________________________________________________________________________
-[ 94] By: mbeattie on 1997/10/02 16:34:03
- Log: Fix pod text in Lint.pm for private-names option.
- Branch: perlext
- ! Compiler/B/Lint.pm
+[ 1800] By: gsar on 1998/09/23 02:42:23
+ Log: support match indices via special variables @- and @+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 21 Jul 1998 23:00:35 -0400 (EDT)
+ Message-Id: <199807220300.XAA16081@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_76] @- and @+
+ Branch: perl
+ ! av.c embed.h global.sym gv.c mg.c objXSUB.h objpp.h perl.h
+ ! pod/perlvar.pod proto.h regnodes.h sv.c t/op/pat.t toke.c
____________________________________________________________________________
-[ 93] By: mbeattie on 1997/10/02 13:44:46
- Log: Add Todo.5.005 to MANIFEST and submit remade embed.h.
+[ 1799] By: gsar on 1998/09/23 01:44:31
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 11 Aug 1998 18:43:29 -0400 (EDT)
+ Message-Id: <199808112243.SAA14243@monk.mps.ohio-state.edu>
+ Subject: Re: Segmentation fault for /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
Branch: perl
- ! MANIFEST embed.h
+ ! regcomp.c t/op/re_tests
____________________________________________________________________________
-[ 92] By: mbeattie on 1997/10/02 13:27:10
- Log: Add Todo.5.005
+[ 1798] By: gsar on 1998/09/23 01:39:23
+ Log: integrate maint-5.005 changes (except conflicting change#1794)
Branch: perl
- + Todo.5.005
+ ! Changes
+ !> objXSUB.h op.c pod/perlfunc.pod pp.c regcomp.c t/op/re_tests
+ !> toke.c util.c win32/config.bc win32/config.gc win32/config.vc
+ !> win32/win32.h
____________________________________________________________________________
-[ 91] By: nick on 1997/10/01 20:23:38
- Log: Raw _T# trial
- Branch: oneperl
- ! embed.h embed.pl proto.h sv.c
+[ 1797] By: gsar on 1998/09/23 01:32:36
+ Log: add note to win32/Makefile about setting CCHOME
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 90] By: nick on 1997/10/01 18:22:03
- Log: THIS + new sort stuff
- Branch: oneperl
- ! miniperlmain.c perl.c pp_ctl.c proto.h util.c
+[ 1796] By: gsar on 1998/09/23 01:31:32
+ Log: perl.pod tweak
+ Branch: perl
+ ! pod/perl.pod
____________________________________________________________________________
-[ 89] By: nick on 1997/10/01 18:03:05
- Log: qsort cleanup - now tailored to perl's use and 'this' aware.
- Branch: oneperl
- ! pp_ctl.c proto.h util.c
+[ 1795] By: gsar on 1998/09/21 20:34:10
+ Log: make xsubpp generate well-formed code with CAPI && !PERL_OBJECT
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
____________________________________________________________________________
-[ 88] By: mbeattie on 1997/10/01 17:04:12
- Log: Start of Configure support for -Dusethreads plus associated
- Linux hints.
+[ 1789] By: gsar on 1998/09/18 18:01:37
+ Log: delay freeing itervar so C<for $i (@a) { return($i) }> works
Branch: perl
- ! Configure hints/linux.sh
+ ! cop.h t/cmd/for.t
____________________________________________________________________________
-[ 87] By: mbeattie on 1997/10/01 17:03:34
- Log: Move runops_foo prototypes from proto.h to early in perl.h.
+[ 1788] By: gsar on 1998/09/17 02:19:11
+ Log: resync win32/config.?c with Porting/config.sh to pick up apiversion
Branch: perl
- ! perl.h proto.h
+ ! win32/config.bc win32/config.gc win32/config.vc
____________________________________________________________________________
-[ 86] By: nick on 1997/09/30 19:15:21
- Log: Debug hackery to thread.h - temporary
- Quick-fix qsort() replacement - more to come.
- Branch: oneperl
- ! thread.h util.c
+[ 1787] By: gsar on 1998/09/17 01:45:14
+ Log: suppress bogus warning on C<sub x {} x()>
+ Branch: perl
+ ! toke.c
____________________________________________________________________________
-[ 85] By: mbeattie on 1997/09/30 15:50:27
- Log: Added Lint option regexp-variables.
- Branch: perlext
- ! Compiler/B/Lint.pm
+[ 1786] By: gsar on 1998/09/17 01:42:51
+ Log: ntohl typo in objXSUB.h
+ Branch: perl
+ ! objXSUB.h
____________________________________________________________________________
-[ 84] By: mbeattie on 1997/09/30 15:11:07
- Log: Merge maint-5.004 branch (5.004_01) with mainline.
+[ 1785] By: gsar on 1998/09/17 01:41:48
+ Log: fill gaps in sig_* entries in win32/config.?c
Branch: perl
- +> Porting/makerel Porting/patchls hints/newsos4.sh
- +> lib/File/DosGlob.pm lib/chat2.pl perlio.sym win32/config.bc
- +> win32/config.vc win32/config_H.bc win32/config_H.vc
- +> win32/makefile.mk
- - win32/config.H win32/config.w32
- !> (integrate 109 files)
+ ! win32/config.bc win32/config.gc win32/config.vc
____________________________________________________________________________
-[ 83] By: TimBunce on 1997/09/30 14:27:09
- Log: Maintenance 5.004_03 changes (addendum)
- Branch: maint-5.004/perl
- - win32/bin/search.bat
+[ 1781] By: larry on 1998/09/05 23:48:24
+ Log: tr/// logic was hosed under utf8
+ Branch: perl
+ ! doop.c op.c op.h pp.c proto.h
____________________________________________________________________________
-[ 82] By: TimBunce on 1997/09/30 14:11:29
- Log: Maintenance 5.004_03 changes
- Branch: maint-5.004/perl
- + win32/bin/pl2bat.pl win32/bin/runperl.pl win32/bin/search.pl
- + win32/bin/webget.pl
- - win32/bin/pl2bat.bat win32/bin/runperl.bat win32/bin/test.bat
- - win32/bin/webget.bat
- ! Changes Configure MANIFEST Makefile.SH Porting/makerel
- ! ext/DynaLoader/DynaLoader.pm hints/hpux.sh hints/linux.sh
- ! hints/sco.sh hints/sunos_4_1.sh installhtml lib/CPAN.pm
- ! lib/ExtUtils/MM_Unix.pm lib/FileCache.pm lib/Math/Complex.pm
- ! lib/Math/Trig.pm lib/blib.pm os2/diff.configure patchlevel.h
- ! perl.c pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
- ! pod/perlop.pod pod/perlre.pod pod/perlrun.pod pod/pod2man.PL
- ! pp_ctl.c pp_sys.c t/lib/complex.t t/pragma/locale.t toke.c
- ! utils/perlbug.PL win32/Makefile win32/makefile.mk
- ! win32/win32.c
+[ 1780] By: larry on 1998/09/05 23:44:16
+ Log: several new tests needed tweaking to work under utf8
+ Branch: perl
+ ! t/comp/require.t t/op/pack.t t/op/substr.t
____________________________________________________________________________
-[ 81] By: TimBunce on 1997/09/30 13:17:27
- Log: Maintenance 5.004_02 changes
- Branch: maint-5.004/perl
- + win32/bin/runperl.bat
- ! Changes Configure INSTALL MANIFEST Makefile.SH Porting/patchls
- ! README.os2 README.win32 Todo XSUB.h av.c configpm doio.c
- ! dosish.h embed.h ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
- ! ext/DB_File/typemap ext/GDBM_File/typemap ext/IO/IO.xs
- ! ext/IO/lib/IO/File.pm ext/IO/lib/IO/Handle.pm
- ! ext/IO/lib/IO/Socket.pm ext/NDBM_File/typemap
- ! ext/ODBM_File/ODBM_File.xs ext/POSIX/POSIX.xs
- ! ext/SDBM_File/typemap global.sym gv.c hints/cxux.sh
- ! hints/os2.sh hints/sunos_4_1.sh hints/svr4.sh installhtml
- ! lib/Bundle/CPAN.pm lib/CPAN.pm lib/CPAN/FirstTime.pm
- ! lib/CPAN/Nox.pm lib/Carp.pm lib/Class/Struct.pm
- ! lib/Exporter.pm lib/ExtUtils/Command.pm lib/ExtUtils/Embed.pm
- ! lib/ExtUtils/Install.pm lib/ExtUtils/Liblist.pm
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
- ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mksymlists.pm
- ! lib/ExtUtils/xsubpp lib/File/Compare.pm lib/File/Copy.pm
- ! lib/File/Find.pm lib/File/Path.pm lib/FileHandle.pm
- ! lib/I18N/Collate.pm lib/IPC/Open3.pm lib/Net/hostent.pm
- ! lib/Pod/Html.pm lib/Shell.pm lib/Sys/Hostname.pm
- ! lib/Sys/Syslog.pm lib/Term/ReadLine.pm lib/Time/Local.pm
- ! lib/UNIVERSAL.pm lib/dumpvar.pl lib/ftp.pl lib/perl5db.pl
- ! malloc.c mg.c op.c opcode.pl os2/Changes os2/Makefile.SHs
- ! os2/diff.configure os2/os2.c os2/os2ish.h patchlevel.h perl.c
- ! perl.h pod/perlapio.pod pod/perlbook.pod pod/perldebug.pod
- ! pod/perldelta.pod pod/perldiag.pod pod/perlembed.pod
- ! pod/perlfunc.pod pod/perlguts.pod pod/perlop.pod
- ! pod/perlre.pod pod/perlrun.pod pod/perltoc.pod
- ! pod/perltrap.pod pod/perlvar.pod pod/perlxstut.pod
- ! pod/pod2man.PL pod/splitpod pp.c pp_ctl.c pp_hot.c pp_sys.c
- ! proto.h regcomp.c regexec.c scope.c sv.c t/TEST t/base/lex.t
- ! t/comp/cmdopt.t t/comp/term.t t/lib/db-btree.t t/lib/db-hash.t
- ! t/lib/db-recno.t t/lib/filehand.t t/lib/gdbm.t t/lib/ndbm.t
- ! t/lib/odbm.t t/lib/sdbm.t t/op/local.t t/op/magic.t
- ! t/op/pack.t t/op/re_tests t/op/ref.t t/op/regexp.t t/op/stat.t
- ! t/op/substr.t t/op/universal.t toke.c universal.c util.c
- ! utils/Makefile utils/h2ph.PL utils/perlbug.PL utils/perldoc.PL
- ! vms/config.vms vms/descrip.mms vms/ext/filespec.t
- ! vms/sockadapt.c vms/sockadapt.h vms/test.com vms/vms.c
- ! vms/vmsish.h win32/Makefile win32/bin/pl2bat.bat
- ! win32/config.bc win32/config.vc win32/config_H.bc
- ! win32/config_H.vc win32/config_h.PL win32/makedef.pl
- ! win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
- ! win32/win32io.c win32/win32io.h win32/win32iop.h
- ! win32/win32sck.c
+[ 1779] By: larry on 1998/09/05 23:41:42
+ Log: index() applied BM optimization to wrong argument
+ Branch: perl
+ ! op.c util.c
____________________________________________________________________________
-[ 80] By: nick on 1997/09/29 20:31:43
- Log: Add some prototypes in attempt to flush out errors
- Tidy up vars.h usage.
- Branch: oneperl
- ! av.c embed.h hv.c opcode.h perl.c perl.h perlio.c pp_sys.c
- ! proto.h util.c vars.h
-____________________________________________________________________________
-[ 79] By: nick on 1997/09/29 17:12:07
- Log: Builds and passes tests without THISPTR
- Branch: oneperl
- ! MANIFEST global.sym perl.c perl.h vars.h
-____________________________________________________________________________
-[ 78] By: mbeattie on 1997/09/29 16:57:23
- Log: Re-introduce the changes from change 68 (runops becomes a
- function pointer and sv_bless3 for '~'-magic) which got lost
- during the preparation for the maint-merge.
- Branch: perl
- ! global.sym perl.h pp.c proto.h run.c sv.c
-____________________________________________________________________________
-[ 77] By: mbeattie on 1997/09/29 16:44:16
- Log: Start merge with maint-5.004 branch by creating an ancestral
- branch point via a fake resolution with the maint-merge branch.
- See Perforce Tech Note 9 for details.
- Branch: perl
- !> (integrate 864 files)
-____________________________________________________________________________
-[ 76] By: nick on 1997/09/28 19:04:42
- Log: Code with this pointer compiles (but core dumps)
- Branch: oneperl
- ! EXTERN.h INTERN.h XSUB.h av.c av.h cop.h cv.h deb.c doio.c
- ! doop.c dosish.h dump.c form.h gv.c gv.h handy.h hv.c hv.h
- ! keywords.h mg.c mg.h miniperlmain.c nostdio.h op.c op.h
- ! opcode.h patchlevel.h perl.c perl.h perlio.c perlio.h
- ! perlsdio.h perlsfio.h perly.c perly.c.diff perly.h perly.y
- ! pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c
- ! regcomp.h regexec.c regexp.h run.c scope.c scope.h sv.c sv.h
- ! taint.c thread.h toke.c universal.c unixish.h util.c util.h
- ! vars.h
-____________________________________________________________________________
-[ 75] By: nick on 1997/09/28 15:45:35
- Log: Quasi sensible starting point for aTHIS addition.
- Branch: oneperl
- ! perl.c perl.h pp_ctl.c sv.c thread.h toke.c util.c
-____________________________________________________________________________
-[ 74] By: nick on 1997/09/28 11:23:32
- Log: Ooops - unwind perly.* stuff for now
- Branch: oneperl
- ! perly.c perly.h perly.y vms/perly_c.vms vms/perly_h.vms
-____________________________________________________________________________
-[ 73] By: nick on 1997/09/28 11:17:23
- Log: Builds and passes all tests again
- Branch: oneperl
- ! embed.pl ext/DB_File/DB_File.xs gv.c perl.c perl.h perly.y
- ! pp.h proto.h thread.sym vms/perly_c.vms vms/perly_h.vms
-____________________________________________________________________________
-[ 72] By: nick on 1997/09/28 10:47:01
- Log: Save "important things" before re-try
- Branch: oneperl
- + vars.h
- ! embed.pl thread.h thread.sym
-____________________________________________________________________________
-[ 71] By: nick on 1997/09/26 17:47:31
- Log: Basic hacks to build with USE_THISPTR, not yet useful
- but builds miniperl and passes minitest with all thread
- variables via a _GLOBAL_ thr variable rather than globals.
- Now for the local thr variable ...
- Branch: oneperl
- + thread.sym
- ! MANIFEST README.threads XSUB.h av.c cv.h deb.c doio.c doop.c
- ! dump.c embed.pl ext/DB_File/DB_File.xs gv.c hints/solaris_2.sh
- ! hv.c mg.c op.c perl.c perl.h pp.c pp_ctl.c pp_hot.c pp_sys.c
- ! proto.h regcomp.c regexec.c run.c scope.c sv.c thread.h toke.c
- ! util.c vms/vms.c
-____________________________________________________________________________
-[ 70] By: mbeattie on 1997/09/23 14:29:23
- Log: Branch oneperl from mainline.
- Branch: oneperl
- +> (branch 871 files)
-____________________________________________________________________________
-[ 69] By: mbeattie on 1997/09/22 16:02:37
- Log: struct thread now stored in an SV and uses '~'-magic for access.
- Branch: perl
- ! thread.h
- Branch: perlext
- ! Thread/Thread.xs Thread/typemap
-____________________________________________________________________________
-[ 68] By: mbeattie on 1997/09/22 16:01:48
- Log: runops becomes a funtion pointer and sv_bless3 created
- to avoid pointer forgery with '~'-magic.
- Branch: perl
- ! global.sym perl.c perl.h pp.c proto.h run.c sv.c
-____________________________________________________________________________
-[ 67] By: mbeattie on 1997/09/22 15:45:56
- Log: More fprintf -> PerlIO_printf changes.
- Branch: perl
- ! perl.c pp_hot.c util.c
-____________________________________________________________________________
-[ 66] By: mbeattie on 1997/09/22 15:10:40
- Log: Minor multi-threading patches for VMS.
- Branch: perl
- ! mg.c thread.h vms/vms.c
-____________________________________________________________________________
-[ 65] By: mbeattie on 1997/09/15 14:09:11
- Log: Add undefined-subs option to Lint.pm.
- Branch: perlext
- ! Compiler/B/Lint.pm
-____________________________________________________________________________
-[ 64] By: mbeattie on 1997/09/10 16:39:41
- Log: Debugging output for lock handling.
- Branch: perl
- ! mg.c pp.c pp_hot.c util.c
-____________________________________________________________________________
-[ 63] By: mbeattie on 1997/09/10 14:49:00
- Log: Move Thread/Semaphore.pm to Thread/Thread/Semaphore.pm
- Branch: perlext
- +> Thread/Thread/Semaphore.pm
- - Thread/Semaphore.pm
-____________________________________________________________________________
-[ 62] By: mbeattie on 1997/09/10 14:47:31
- Log: Move Thread/Queue.pm to Thread/Thread/Queue.pm
- Branch: perlext
- +> Thread/Thread/Queue.pm
- - Thread/Queue.pm
-____________________________________________________________________________
-[ 61] By: mbeattie on 1997/09/10 13:56:50
- Log: Solaris fixes: delete pad and padname from thread.h and remove
- MUTEX_* stuff when malloc.c gets copied to x2p/malloc.c.
- Branch: perl
- ! thread.h x2p/Makefile.SH
+[ 1778] By: larry on 1998/09/05 23:38:29
+ Log: Implicit require during compile reset line numbering
+ Branch: perl
+ ! pp_ctl.c
----------------
-Version 5.004_50 First developer release towards 5.005
+Version 5.005_51
----------------
-Maintenance of the 5.004 version of perl continues with the 5.004_xx
-series, where 'xx' is <= 49. Development of the next version, 5.005,
-starts with 5.004_50.
-
____________________________________________________________________________
-[ 60] By: mbeattie on 1997/09/09 16:57:41
- Log: Update README.threads to mention -DL.
+[ 1777] By: gsar on 1998/08/10 07:02:38
+ Log: various tweaks: fix signed vs. unsigned problems that prevented C++
+ builds; add sundry PERL_OBJECT scaffolding to get it to build; fix
+ lexical warning testsuite for win32
Branch: perl
- ! README.threads
-____________________________________________________________________________
-[ 59] By: mbeattie on 1997/09/09 16:49:08
- Log: Add Thread modules Queue.pm and Semaphore.pm
- Branch: perlext
- + Thread/Queue.pm Thread/Semaphore.pm
+ ! Changes doop.c embed.h global.sym objXSUB.h objpp.h op.c
+ ! pod/perlhist.pod pp.c pp_hot.c proto.h regcomp.c regexec.c
+ ! sv.c t/pragma/warn-doio t/pragma/warn-mg t/pragma/warn-op
+ ! t/pragma/warn-regexec toke.c utf8.c win32/GenCAPI.pl
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 58] By: mbeattie on 1997/09/09 16:33:45
- Log: Update README.threads
+[ 1776] By: gsar on 1998/08/09 17:53:48
+ Log: fix coredump with MULTIPLICITY (ckWARN() needs early curcop init)
Branch: perl
- ! README.threads
+ ! Changes MANIFEST perl.c pod/perlhist.pod
____________________________________________________________________________
-[ 57] By: mbeattie on 1997/09/09 16:26:47
- Log: Add debug info to Thread typemap.
- Branch: perlext
- ! Thread/typemap
+[ 1775] By: gsar on 1998/08/09 14:35:33
+ Log: tweak warning test
+ Branch: perl
+ ! t/pragma/warn-toke
____________________________________________________________________________
-[ 56] By: mbeattie on 1997/09/09 15:04:26
- Log: Rewrite synchronisation of subs/methods and add attrs
- extension for specifying 'locked' and 'method' attributes.
+[ 1774] By: gsar on 1998/08/09 14:13:46
+ Log: add missing dTHR; notes for test failures due to small stacksize
Branch: perl
- + ext/attrs/Makefile.PL ext/attrs/attrs.pm ext/attrs/attrs.xs
- ! MANIFEST cv.h embed.h global.sym op.c perl.c pp.c pp_ctl.c
- ! pp_hot.c proto.h sv.c sv.h toke.c
- Branch: perlext
- ! Thread/Thread.pm Thread/Thread.xs Thread/sync.t Thread/sync2.t
+ ! doio.c gv.c op.c sv.c t/pragma/warn-mg t/pragma/warn-regexec
+ ! toke.c universal.c util.c
____________________________________________________________________________
-[ 55] By: mbeattie on 1997/09/03 16:34:47
- Log: Add new keyword "lock" to Opcode.pm
+[ 1773] By: gsar on 1998/08/09 11:31:53
+ Log: lexical warnings; tweaks to places that didn't apply correctly
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Date: Wed, 29 Jul 1998 09:28:45 BST
+ Message-Id: <9807290828.AA26286@claudius.bfsec.bt.co.uk>
+ Subject: lexical warnings patch for 5.005_50
Branch: perl
- ! ext/Opcode/Opcode.pm
+ + README.lexwarn lib/warning.pm t/pragma/warn-2use
+ + t/pragma/warn-3both t/pragma/warn-4lint t/pragma/warn-5nolint
+ + t/pragma/warn-doio t/pragma/warn-gv t/pragma/warn-mg
+ + t/pragma/warn-op t/pragma/warn-perl t/pragma/warn-perly
+ + t/pragma/warn-pp t/pragma/warn-pp_ctl t/pragma/warn-pp_hot
+ + t/pragma/warn-pp_sys t/pragma/warn-regcomp
+ + t/pragma/warn-regexec t/pragma/warn-sv t/pragma/warn-taint
+ + t/pragma/warn-toke t/pragma/warn-universal t/pragma/warn-util
+ + warning.h warning.pl
+ ! Changes MANIFEST Makefile.SH cop.h doio.c global.sym gv.c
+ ! lib/diagnostics.pm mg.c op.c op.h perl.c perl.h pp.c pp_ctl.c
+ ! pp_hot.c pp_sys.c proto.h regcomp.c regexec.c sv.c t/op/tie.t
+ ! t/pragma/warn-1global t/pragma/warning.t taint.c toke.c
+ ! universal.c util.c
____________________________________________________________________________
-[ 54] By: mbeattie on 1997/09/03 14:44:44
- Log: Run embed.pl and keywords.pl to complete RESTART -> INIT change
+[ 1772] By: gsar on 1998/08/08 23:06:00
+ Log: bump patchlevel to 5.005_51
Branch: perl
- ! embed.h keywords.h
+ ! patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 53] By: mbeattie on 1997/09/03 13:52:24
- Log: Add to MANIFEST: README.threads, lib/ISA.pm, lib/Class/Fields.pm
+[ 1771] By: gsar on 1998/08/08 23:01:57
+ Log: fix bogus warning on "\x{123}"
+ From: pmarquess@claudius.bfsec.bt.co.uk (Paul Marquess)
+ Date: Mon, 27 Jul 1998 06:16:15 +0100 (BST)
+ Message-Id: <9807270534.AA11102@claudius.bfsec.bt.co.uk>
+ Subject: [5.005_50 PATCH] Some unicode problems
Branch: perl
- ! MANIFEST
+ ! regcomp.c toke.c
____________________________________________________________________________
-[ 52] By: mbeattie on 1997/09/03 13:41:20
- Log: Let Lint private_names catch out-of-package _foo methods.
- Branch: perlext
- ! Compiler/B/Lint.pm
+[ 1770] By: gsar on 1998/08/08 22:56:55
+ Log: hide dup symbol for static build of ext/re
+ From: Dominic Dunlop <domo@ppp72.vo.lu>
+ Date: Wed, 29 Jul 1998 11:09:56 +0100 (WET DST)
+ Message-Id: <199807291009.LAA08935@ppp72.vo.lu>
+ Subject: Not OK: perl 5.00550 on powerpc-machten 4.1 [BOGUS PATCH]
+ Branch: perl
+ ! regcomp.c
____________________________________________________________________________
-[ 51] By: mbeattie on 1997/09/03 13:20:12
- Log: Bump patchlevel.h to 5.004_50
+[ 1769] By: gsar on 1998/08/08 22:45:06
+ Log: fix double free on -Mutf8 -e '$b=uc("")'
+ From: larry@wall.org (Larry Wall)
+ Date: Fri, 7 Aug 1998 14:42:43 -0700
+ Message-Id: <199808072142.OAA14920@wall.org>
+ Subject: [PATCH 5.005_50]: uc("") and lc("") under utf8 fails
Branch: perl
- ! patchlevel.h
+ ! pp.c
____________________________________________________________________________
-[ 50] By: mbeattie on 1997/09/03 12:31:48
- Log: Make compiler build/work with devel 5.005
- Branch: perlext
- ! Compiler/B.xs Compiler/B/Asmdata.pm Compiler/bytecode.h
- ! Compiler/bytecode.pl Compiler/byterun.c Compiler/byterun.h
+[ 1768] By: gsar on 1998/08/08 22:42:29
+ Log: substr() assumes utf8 without say-so
+ From: larry@wall.org (Larry Wall)
+ Date: Fri, 7 Aug 1998 12:25:12 -0700
+ Message-Id: <199808071925.MAA13436@wall.org>
+ Subject: [PATCH 5.005_50] substr bug?
+ Branch: perl
+ ! pp.c
____________________________________________________________________________
-[ 49] By: mbeattie on 1997/09/03 12:28:05
- Log: Rename RESTART to INIT and associated changes
+[ 1767] By: gsar on 1998/08/08 22:38:25
+ Log: fix intolerance of SWASHes for blank lines
+ From: Gisle Aas <aas@sn.no>
+ Date: 06 Aug 1998 23:28:57 +0200
+ Message-ID: <m3emutkdeu.fsf@furu.g.aas.no>
+ Subject: Re: Re[2]: another joyride begins
Branch: perl
- ! interp.sym keywords.pl op.c perl.c perl.h perly.c perly.y
- ! toke.c vms/perly_c.vms
+ ! lib/utf8_heavy.pl
____________________________________________________________________________
-[ 48] By: mbeattie on 1997/09/02 15:54:27
- Log: Added private-names option.
- Branch: perlext
- ! Compiler/B/Lint.pm
+[ 1766] By: gsar on 1998/08/08 22:33:10
+ Log: utf8 doc tweak
+ From: Gisle Aas <aas@sn.no>
+ Date: 05 Aug 1998 00:41:04 +0200
+ Message-ID: <m3yat4wetb.fsf@furu.g.aas.no>
+ Subject: Matching clumps
+ Branch: perl
+ ! lib/utf8.pm
____________________________________________________________________________
-[ 47] By: mbeattie on 1997/09/02 11:54:55
- Log: For compiler's CC, make PP_EVAL, PP_ENTERTRY work with JMPENV.
- Branch: perlext
- ! Compiler/cc_runtime.h
+[ 1765] By: gsar on 1998/08/08 22:31:37
+ Log: kill bogus warning from -we 'use utf8; $_="\x{FF}"'
+ From: Gisle Aas <aas@sn.no>
+ Date: 04 Aug 1998 22:56:11 +0200
+ Message-ID: <m3yat4sbys.fsf@furu.g.aas.no>
+ Subject: Re: another joyride begins
+ Branch: perl
+ ! lib/utf8_heavy.pl
____________________________________________________________________________
-[ 46] By: mbeattie on 1997/08/28 19:40:08
- Log: Missing sprintf in try_autoload.
- Branch: perlext
- ! Compiler/B/C.pm
+[ 1764] By: gsar on 1998/08/08 22:28:43
+ Log: From: larry@wall.org (Larry Wall)
+ Date: Tue, 4 Aug 1998 17:04:51 -0700
+ Message-Id: <199808050004.RAA22592@wall.org>
+ Subject: [PATCH 5.005_50] \pX not implemented!
+ Branch: perl
+ ! regcomp.c
____________________________________________________________________________
-[ 45] By: mbeattie on 1997/08/13 16:15:25
- Log: Threading fixups for Digital UNIX.
+[ 1763] By: gsar on 1998/08/08 22:27:15
+ Log: From: Stephen McCamant <alias@mcs.com>
+ Date: Sun, 2 Aug 1998 16:33:18 -0500 (CDT)
+ Message-ID: <13764.55116.921952.837027@alias-2.pr.mcs.net>
+ Subject: [PATCH] Eliminate superfluous RV2p[AH]Vs in oops[AH]V()
Branch: perl
- ! README.threads malloc.c perl.h toke.c
+ ! op.c
____________________________________________________________________________
-[ 44] By: mbeattie on 1997/08/11 15:46:29
- Log: Assorted changes for multi-threading (now works rather more).
+[ 1762] By: gsar on 1998/08/08 22:26:09
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Sun, 2 Aug 1998 22:05:28 +0300 (EET DST)
+ Message-Id: <199808021905.WAA10592@alpha.hut.fi>
+ Subject: [PATCH] 5.005_02-TRIAL1 or 5.004_05-MAINT_TRIAL_5: t/op/{pw,gr}ent.t
Branch: perl
- + README.threads
- ! gv.c mg.c op.c perl.c perl.h pp_ctl.c pp_hot.c sv.c thread.h
- ! toke.c util.c
- Branch: perlext
- ! Thread/Makefile.PL Thread/Thread.xs Thread/lock.t
- ! Thread/unsync.t
-____________________________________________________________________________
-[ 43] By: mbeattie on 1997/08/08 14:11:00
- Log: Made Lint check subs (and -u packages).
- Added support for dollar_underscore and implicit $_ in foreach.
- Branch: perlext
- ! Compiler/B/Lint.pm
-____________________________________________________________________________
-[ 42] By: TimBunce on 1997/07/25 17:15:57
- Log: Maintenance 5.004_01 changes
- Branch: maint-5.004/perl
- + Porting/makerel Porting/patchls hints/newsos4.sh
- + lib/File/DosGlob.pm lib/chat2.pl perlio.sym win32/config.bc
- + win32/config.vc win32/config_H.bc win32/config_H.vc
- + win32/makefile.mk
- - win32/config.H win32/config.w32
- ! Changes Configure EXTERN.h INSTALL MANIFEST Makefile.SH
- ! Porting/pumpkin.pod README README.win32 doio.c embed.h
- ! ext/DynaLoader/dl_aix.xs ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
- ! ext/SDBM_File/Makefile.PL ext/SDBM_File/sdbm/Makefile.PL
- ! global.sym hints/next_3.sh hints/next_4.sh hints/svr4.sh
- ! installhtml installman lib/AutoLoader.pm lib/AutoSplit.pm
- ! lib/CGI/Push.pm lib/CPAN.pm lib/ExtUtils/Install.pm
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm
- ! lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MM_Win32.pm
- ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mksymlists.pm
- ! lib/ExtUtils/xsubpp lib/Pod/Html.pm lib/Pod/Text.pm
- ! lib/Sys/Syslog.pm lib/Term/ReadLine.pm lib/Test/Harness.pm
- ! lib/ftp.pl mg.c op.c patchlevel.h perl.c perl.h perl_exp.SH
- ! perlio.c pod/checkpods.PL pod/perlbook.pod pod/perldata.pod
- ! pod/perldebug.pod pod/perldelta.pod pod/perldiag.pod
- ! pod/perlembed.pod pod/perlfaq4.pod pod/perlfaq8.pod
- ! pod/perlfaq9.pod pod/perlfunc.pod pod/perlguts.pod
- ! pod/perllol.pod pod/perlop.pod pod/perlrun.pod pod/perlsub.pod
- ! pod/perltoc.pod pod/perltoot.pod pod/pod2man.PL pod/roffitall
- ! pod/splitpod pp.c pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c
- ! regcomp.h regexec.c sv.c t/lib/safe2.t t/op/flip.t
- ! t/op/groups.t t/op/magic.t t/op/mkdir.t t/op/re_tests
- ! t/op/regexp.t t/op/split.t t/op/stat.t t/op/subst.t
- ! t/op/taint.t util.c utils/Makefile utils/h2xs.PL
- ! utils/perlbug.PL vms/ext/DCLsym/DCLsym.pm
- ! vms/ext/Stdio/Stdio.pm vms/gen_shrfls.pl vms/perlvms.pod
- ! win32/Makefile win32/config_sh.PL win32/include/sys/socket.h
- ! win32/makedef.pl win32/makeperldef.pl win32/perlglob.c
- ! win32/perllib.c win32/win32.c win32/win32.h win32/win32io.c
- ! win32/win32io.h win32/win32iop.h win32/win32sck.c
-____________________________________________________________________________
-[ 41] By: mbeattie on 1997/07/24 14:57:53
- Log: Start support for fake threads.
- pp_lock now returns its argument.
- Branch: perl
- ! MANIFEST Makefile.SH cv.h op.c opcode.h opcode.pl perl.c
- ! perl.h pp.c pp_ctl.c pp_hot.c proto.h sv.h thread.h toke.c
- ! util.c
- Branch: perlext
- ! Thread/Thread.xs
+ + t/op/grent.t t/op/pwent.t
+ ! MANIFEST
____________________________________________________________________________
-[ 40] By: mbeattie on 1997/07/24 14:55:07
- Log: Add missing reset of eval_owner if doeval() fails to parse.
+[ 1761] By: gsar on 1998/08/08 22:21:52
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 30 Jul 1998 19:23:56 -0400 (EDT)
+ Message-Id: <199807302323.TAA21175@monk.mps.ohio-state.edu>
+ Subject: [5.005_50 PATCH] misprint in RE engine
Branch: perl
- ! pp_ctl.c
+ ! regexec.c t/op/re_tests
____________________________________________________________________________
-[ 39] By: mbeattie on 1997/07/17 13:35:51
- Log: Fix multiple problems with lexical @_.
+[ 1760] By: gsar on 1998/08/08 22:18:54
+ Log: integrate maint-5.005 changes into mainline
Branch: perl
- ! cop.h op.c perl.c pp.c pp_ctl.c pp_hot.c t/op/do.t thread.h
- ! toke.c
+ +> Porting/fixCORE README.os390 ebcdic.c win32/des_fcrypt.patch
+ !> (integrate 138 files)
____________________________________________________________________________
-[ 38] By: mbeattie on 1997/07/16 17:02:09
- Log: Change %lx to %x in B::CV::save to prevent some CV
- fields becoming 0 in the init section. Add missing
- write_back in B::Stackobj::Padsv::load_double to fix
- test 22 of op/my.t.
- Branch: perlext
- ! Compiler/B/C.pm Compiler/B/Stackobj.pm
-____________________________________________________________________________
-[ 37] By: mbeattie on 1997/07/10 11:28:16
- Log: Branch win32 developments from main perl branch.
- Branch: win32/perl
- +> (branch 867 files)
-____________________________________________________________________________
-[ 36] By: mbeattie on 1997/07/05 11:58:05
- Log: B::CC::pp_padsv must cope with vivify_ref (5.004)
- as well as provide_ref (5.003).
- Branch: perlext
- ! Compiler/B/C.pm Compiler/B/CC.pm Compiler/NOTES
-____________________________________________________________________________
-[ 35] By: mbeattie on 1997/07/05 11:55:18
- Log: Introduce pp_lock.
- Branch: perl
- ! embed.h global.sym keywords.h keywords.pl opcode.h opcode.pl
- ! pp.c pp_ctl.c toke.c
-____________________________________________________________________________
-[ 34] By: mbeattie on 1997/07/01 12:24:28
- Log: Support for op in global register (still buggy)
- Branch: perl
- ! embed.h global.sym gv.c op.c perl.c perl.h pp_ctl.c pp_sys.c
- ! proto.h scope.c scope.h thread.h
-____________________________________________________________________________
-[ 33] By: mbeattie on 1997/06/24 16:34:24
- Log: Branch lexical warnings from perl branch.
- Branch: lexwarn/perl
- +> (branch 867 files)
-____________________________________________________________________________
-[ 32] By: mbeattie on 1997/06/24 14:33:57
- Log: Branch integration of maint-5.004 from relperl.
- Branch: mainline/perl
- +> (branch 600 files)
- Branch: maint-5.004/perl
- +> (branch 864 files)
+[ 1672] By: gsar on 1998/07/27 18:35:28
+ Log: create new Changes
+ Branch: perl
+ + Changes
+ ! Changes5.005 MANIFEST
____________________________________________________________________________
-[ 31] By: mbeattie on 1997/06/20 11:46:50
- Log: corrected bad_type() prototype.
+[ 1671] By: gsar on 1998/07/27 18:30:57
+ Log: rename Changes --> Changes5.005
Branch: perl
- ! op.c
+ +> Changes5.005
+ - Changes
____________________________________________________________________________
-[ 30] By: mbeattie on 1997/06/12 12:38:05
- Log: Tweak README.
- Branch: perlext
- ! Thread/README
+[ 1670] By: gsar on 1998/07/27 18:10:14
+ Log: integrate 5.005_01 changes from maint
+ Branch: perl
+ ! Changes
+ !> README.win32 pod/perldelta.pod proto.h toke.c win32/GenCAPI.pl
+ !> win32/win32.c
____________________________________________________________________________
-[ 29] By: mbeattie on 1997/06/12 12:34:59
- Log: Document -m option of CC backend.
- Branch: perlext
- ! Compiler/NOTES
+[ 1667] By: nick on 1998/07/26 14:31:01
+ Log: Add dTHR so that it compiles miniperl in threaded mode
+ Branch: perl
+ ! doop.c mg.c regcomp.c regexec.c
____________________________________________________________________________
-[ 28] By: mbeattie on 1997/06/12 12:25:05
- Log: Support sysseek introduced in 5.004.
- Branch: perlext
- ! Compiler/ccop.c Compiler/ccop.h
+[ 1666] By: nick on 1998/07/26 13:01:10
+ Log: Resolve ansiperl against mainline (@1648?)
+ Unclear that change number has "taken".
+ Branch: ansiperl
+ +> (branch 169 files)
+ - ObjXSub.h XSLock.h compat3.sym fixvars pod/perld4.pod
+ !> (integrate 131 files)
+
+----------------
+Version 5.005_50
+----------------
+
____________________________________________________________________________
-[ 27] By: mbeattie on 1997/06/05 14:20:51
- Log: More fixups for thrperl integration.
+[ 1665] By: gsar on 1998/07/26 05:38:48
+ Log: add trailing newline to file
Branch: perl
- ! ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
- ! ext/Opcode/Makefile.PL ext/Opcode/Opcode.pm
- ! ext/Opcode/Opcode.xs gv.c hv.c mg.c op.c perl.c perly.c
- ! perly.y pp.c pp_ctl.c run.c scope.c sv.c sv.h thread.h toke.c
- ! util.c
+ ! Changes lib/unicode/blocks.txt
____________________________________________________________________________
-[ 25] By: mbeattie on 1997/05/28 15:11:24
- Log: Fixups for thrperl integration.
+[ 1664] By: gsar on 1998/07/26 05:08:48
+ Log: integrate proto.h additions from maint-5.005
Branch: perl
- ! embed.h keywords.h op.c opcode.h perl.c util.c
+ !> pod/perlhist.pod proto.h
____________________________________________________________________________
-[ 24] By: mbeattie on 1997/05/26 20:10:42
- Log: Integrate thrperl 5.003->5.004.
+[ 1663] By: gsar on 1998/07/26 05:07:05
+ Log: add new files to MANIFEST; add missing prototypes to proto.h;
+ s/PL_utf8skip/utf8skip/ for now, or we end up with Perl_PL_;
+ add typecasts to silence warnings; tweaks for win32 builds
Branch: perl
- +> thread.h
- !> (integrate 33 files)
-____________________________________________________________________________
-[ 23] By: mbeattie on 1997/05/26 11:45:39
- Log: Fix ppname when saving subs.
- Branch: perlext
- ! Compiler/B/C.pm
+ ! MANIFEST embed.h global.sym proto.h regexec.c toke.c utf8.h
+ ! win32/Makefile win32/makefile.mk
____________________________________________________________________________
-[ 22] By: mbeattie on 1997/05/26 11:45:03
- Log: -mFoo option now forces -uFoo.
- Branch: perlext
- ! Compiler/B/CC.pm
+[ 1662] By: gsar on 1998/07/26 05:01:52
+ Log: add missing sv_*_mg() prototypes in proto.h, update perlhist.pod
+ Branch: maint-5.005/perl
+ ! pod/perlhist.pod proto.h
____________________________________________________________________________
-[ 21] By: mbeattie on 1997/05/26 11:43:37
- Log: Put back objsym/savesym (used by walkoptree_exec).
- Branch: perlext
- ! Compiler/B.pm
+[ 1661] By: gsar on 1998/07/26 02:52:48
+ Log: up patchlevel to 5.005_50
+ Branch: perl
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
____________________________________________________________________________
-[ 20] By: mbeattie on 1997/05/26 11:38:45
- Log: Add avhv_store_ent. Add missing avhv_* to global.sym.
+[ 1660] By: gsar on 1998/07/26 02:43:57
+ Log: integrate utfperl
Branch: perl
- ! av.c global.sym
+ +> (branch 162 files)
+ !> (integrate 29 files)
____________________________________________________________________________
-[ 19] By: mbeattie on 1997/05/25 21:19:38
- Log: Fix up integration 5.003->5.004.
+[ 1659] By: gsar on 1998/07/26 02:38:22
+ Log: integrate maint-5.005 changes
Branch: perl
- + lib/Class/Fields.pm lib/ISA.pm
- ! av.c ext/DB_File/DB_File.xs perl.c pp.c pp_hot.c proto.h
- ! toke.c
+ !> Changes README.vms djgpp/fixpmain emacs/ptags hints/beos.sh
+ !> lib/Math/BigInt.pm pod/perldelta.pod pod/perlmodinstall.pod
+ !> pod/perltoc.pod pp_sys.c t/lib/bigintpm.t
+ !> vms/descrip_mms.template vms/subconfigure.com
____________________________________________________________________________
-[ 18] By: mbeattie on 1997/05/25 10:31:21
- Log: First stab at 5.003 -> 5.004 integration.
- Branch: perl
- +> (branch 291 files)
- - Changes.Conf ext/DynaLoader/dl_os2.xs
- - ext/FileHandle/FileHandle.pm ext/FileHandle/FileHandle.xs
- - ext/FileHandle/Makefile.PL ext/SDBM_File/sdbm/readme.ps
- - ext/Safe/Makefile.PL ext/Safe/Safe.pm ext/Safe/Safe.xs
- - hints/aux.sh hints/dnix.sh hints/irix_6_2.sh lib/chat2.inter
- - lib/chat2.pl lib/splain os2/README os2/README.old
- - os2/diff.db_file os2/notes pod/perlovl.pod t/lib/safe.t
- - t/op/overload.t t/re_tests vms/Makefile x2p/a2p.man
- - x2p/handy.h x2p/s2p.man
- !> (integrate 392 files)
-____________________________________________________________________________
-[ 17] By: mbeattie on 1997/05/24 18:46:49
- Log: Wholesale update to 5.004.
- Branch: relperl
- + Changes5.000 Changes5.001 Changes5.002 Changes5.003
- + Porting/Glossary Porting/pumpkin.pod README.amiga
- + README.cygwin32 README.os2 README.plan9 README.qnx
- + README.win32 compat3.sym configure.gnu cygwin32/cw32imp.h
- + cygwin32/gcc2 cygwin32/ld2 cygwin32/perlgcc cygwin32/perlld
- + eg/cgi/RunMeFirst eg/cgi/clickable_image.cgi eg/cgi/cookie.cgi
- + eg/cgi/crash.cgi eg/cgi/customize.cgi eg/cgi/diff_upload.cgi
- + eg/cgi/file_upload.cgi eg/cgi/frameset.cgi eg/cgi/index.html
- + eg/cgi/internal_links.cgi eg/cgi/javascript.cgi
- + eg/cgi/monty.cgi eg/cgi/multiple_forms.cgi
- + eg/cgi/nph-clock.cgi eg/cgi/popup.cgi eg/cgi/save_state.cgi
- + eg/cgi/tryit.cgi eg/cgi/wilogo.gif.uu
- + ext/DynaLoader/dl_cygwin32.xs ext/IO/IO.pm ext/IO/IO.xs
- + ext/IO/Makefile.PL ext/IO/README ext/IO/lib/IO/File.pm
- + ext/IO/lib/IO/Handle.pm ext/IO/lib/IO/Pipe.pm
- + ext/IO/lib/IO/Seekable.pm ext/IO/lib/IO/Select.pm
- + ext/IO/lib/IO/Socket.pm ext/NDBM_File/hints/dec_osf.pl
- + ext/NDBM_File/hints/dynixptx.pl ext/ODBM_File/hints/hpux.pl
- + ext/ODBM_File/hints/ultrix.pl ext/Opcode/Makefile.PL
- + ext/Opcode/Opcode.pm ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
- + ext/Opcode/ops.pm ext/POSIX/hints/next_3.pl hints/amigaos.sh
- + hints/aux_3.sh hints/broken-db.msg hints/cygwin32.sh
- + hints/dcosx.sh hints/irix_6_0.sh hints/irix_6_1.sh
- + hints/lynxos.sh hints/next_4.sh hints/qnx.sh hints/umips.sh
- + hints/unicosmk.sh installhtml lib/Bundle/CPAN.pm lib/CGI.pm
- + lib/CGI/Apache.pm lib/CGI/Carp.pm lib/CGI/Fast.pm
- + lib/CGI/Push.pm lib/CGI/Switch.pm lib/CPAN.pm
- + lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm lib/Class/Struct.pm
- + lib/ExtUtils/Command.pm lib/ExtUtils/Embed.pm
- + lib/ExtUtils/MM_Win32.pm lib/File/Compare.pm lib/File/stat.pm
- + lib/FileHandle.pm lib/FindBin.pm lib/Math/Trig.pm
- + lib/Net/hostent.pm lib/Net/netent.pm lib/Net/protoent.pm
- + lib/Net/servent.pm lib/Pod/Html.pm lib/Tie/RefHash.pm
- + lib/Time/gmtime.pm lib/Time/localtime.pm lib/Time/tm.pm
- + lib/UNIVERSAL.pm lib/User/grent.pm lib/User/pwent.pm
- + lib/autouse.pm lib/blib.pm lib/constant.pm lib/locale.pm
- + nostdio.h os2/Changes os2/OS2/ExtAttr/Changes
- + os2/OS2/ExtAttr/ExtAttr.pm os2/OS2/ExtAttr/ExtAttr.xs
- + os2/OS2/ExtAttr/MANIFEST os2/OS2/ExtAttr/Makefile.PL
- + os2/OS2/ExtAttr/myea.h os2/OS2/ExtAttr/t/os2_ea.t
- + os2/OS2/ExtAttr/typemap os2/OS2/PrfDB/Changes
- + os2/OS2/PrfDB/MANIFEST os2/OS2/PrfDB/Makefile.PL
- + os2/OS2/PrfDB/PrfDB.pm os2/OS2/PrfDB/PrfDB.xs
- + os2/OS2/PrfDB/t/os2_prfdb.t os2/OS2/PrfDB/typemap
- + os2/OS2/Process/MANIFEST os2/OS2/Process/Makefile.PL
- + os2/OS2/Process/Process.pm os2/OS2/Process/Process.xs
- + os2/OS2/REXX/Changes os2/OS2/REXX/MANIFEST
- + os2/OS2/REXX/Makefile.PL os2/OS2/REXX/REXX.pm
- + os2/OS2/REXX/REXX.xs os2/OS2/REXX/t/rx_cmprt.t
- + os2/OS2/REXX/t/rx_dllld.t os2/OS2/REXX/t/rx_objcall.t
- + os2/OS2/REXX/t/rx_sql.test os2/OS2/REXX/t/rx_tiesql.test
- + os2/OS2/REXX/t/rx_tievar.t os2/OS2/REXX/t/rx_tieydb.t
- + os2/OS2/REXX/t/rx_varset.t os2/OS2/REXX/t/rx_vrexx.t
- + os2/dl_os2.c os2/dlfcn.h perlio.c perlio.h perlsdio.h
- + perlsfio.h plan9/aperl plan9/arpa/inet.h plan9/buildinfo
- + plan9/config.plan9 plan9/exclude plan9/fndvers
- + plan9/genconfig.pl plan9/mkfile plan9/myconfig.plan9
- + plan9/perlplan9.doc plan9/perlplan9.pod plan9/plan9.c
- + plan9/plan9ish.h plan9/setup.rc plan9/versnum pod/checkpods.PL
- + pod/perlapio.pod pod/perldelta.pod pod/perlfaq.pod
- + pod/perlfaq1.pod pod/perlfaq2.pod pod/perlfaq3.pod
- + pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfaq6.pod
- + pod/perlfaq7.pod pod/perlfaq8.pod pod/perlfaq9.pod
- + pod/perllocale.pod pod/perlmodlib.pod pod/perltoot.pod
- + pod/rofftoc qnx/ar qnx/cpp t/comp/colon.t t/comp/proto.t
- + t/comp/redef.t t/comp/use.t t/io/read.t t/lib/abbrev.t
- + t/lib/autoloader.t t/lib/basename.t t/lib/checktree.t
- + t/lib/complex.t t/lib/env.t t/lib/filecache.t t/lib/filecopy.t
- + t/lib/filefind.t t/lib/filepath.t t/lib/findbin.t
- + t/lib/getopt.t t/lib/hostname.t t/lib/io_dup.t t/lib/io_pipe.t
- + t/lib/io_sel.t t/lib/io_sock.t t/lib/io_taint.t
- + t/lib/io_tell.t t/lib/io_udp.t t/lib/io_xs.t t/lib/opcode.t
- + t/lib/open2.t t/lib/open3.t t/lib/ops.t t/lib/parsewords.t
- + t/lib/safe1.t t/lib/safe2.t t/lib/searchdict.t
- + t/lib/selectsaver.t t/lib/symbol.t t/lib/texttabs.t
- + t/lib/textwrap.t t/lib/timelocal.t t/lib/trig.t t/op/arith.t
- + t/op/assignwarn.t t/op/bop.t t/op/closure.t t/op/cmp.t
- + t/op/gv.t t/op/inc.t t/op/method.t t/op/recurse.t
- + t/op/runlevel.t t/op/sysio.t t/op/taint.t t/op/tie.t
- + t/op/universal.t t/pragma/constant.t t/pragma/locale.t
- + t/pragma/overload.t t/pragma/strict-refs t/pragma/strict-subs
- + t/pragma/strict-vars t/pragma/strict.t t/pragma/subs.t
- + t/pragma/warn-1global t/pragma/warning.t universal.c
- + utils/splain.PL vms/ext/DCLsym/0README.txt
- + vms/ext/DCLsym/DCLsym.pm vms/ext/DCLsym/DCLsym.xs
- + vms/ext/DCLsym/Makefile.PL vms/ext/DCLsym/test.pl
- + vms/ext/XSSymSet.pm vms/ext/filespec.t vms/ext/vmsish.pm
- + vms/ext/vmsish.t win32/Makefile win32/TEST win32/autosplit.pl
- + win32/bin/network.pl win32/bin/pl2bat.bat win32/bin/search.bat
- + win32/bin/test.bat win32/bin/webget.bat win32/bin/www.pl
- + win32/config.H win32/config.w32 win32/config_h.PL
- + win32/config_sh.PL win32/dl_win32.xs win32/genxsdef.pl
- + win32/include/arpa/inet.h win32/include/dirent.h
- + win32/include/netdb.h win32/include/sys/socket.h
- + win32/makedef.pl win32/makemain.pl win32/makeperldef.pl
- + win32/perlglob.c win32/perllib.c win32/pod.mak win32/runperl.c
- + win32/splittree.pl win32/win32.c win32/win32.h win32/win32io.c
- + win32/win32io.h win32/win32iop.h win32/win32sck.c x2p/a2p.pod
- + x2p/proto.h
- - Changes.Conf ext/DynaLoader/dl_os2.xs
- - ext/FileHandle/FileHandle.pm ext/FileHandle/FileHandle.xs
- - ext/FileHandle/Makefile.PL ext/SDBM_File/sdbm/readme.ps
- - ext/Safe/Makefile.PL ext/Safe/Safe.pm ext/Safe/Safe.xs
- - hints/aux.sh hints/dnix.sh hints/irix_6_2.sh lib/chat2.inter
- - lib/chat2.pl lib/splain os2/README os2/README.old
- - os2/diff.db_file os2/notes pod/perlovl.pod t/lib/safe.t
- - t/op/overload.t t/re_tests vms/Makefile x2p/a2p.man
- - x2p/handy.h x2p/s2p.man
- ! Artistic Changes Configure EXTERN.h INSTALL INTERN.h MANIFEST
- ! Makefile.SH README README.vms Todo XSUB.h av.c av.h cflags.SH
- ! config_H config_h.SH configpm configure cop.h cv.h deb.c
- ! doio.c doop.c dosish.h dump.c eg/README eg/nih
- ! eg/sysvipc/ipcmsg eg/sysvipc/ipcsem eg/sysvipc/ipcshm
- ! emacs/cperl-mode.el embed.h embed.pl ext/DB_File/DB_File.pm
- ! ext/DB_File/DB_File.xs ext/DB_File/Makefile.PL
- ! ext/DB_File/typemap ext/DynaLoader/DynaLoader.pm
- ! ext/DynaLoader/Makefile.PL ext/DynaLoader/dl_aix.xs
- ! ext/DynaLoader/dl_dld.xs ext/DynaLoader/dl_dlopen.xs
- ! ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_next.xs
- ! ext/DynaLoader/dl_vms.xs ext/DynaLoader/dlutils.c
- ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
- ! ext/GDBM_File/GDBM_File.pm ext/NDBM_File/NDBM_File.pm
- ! ext/ODBM_File/ODBM_File.pm ext/ODBM_File/ODBM_File.xs
- ! ext/ODBM_File/hints/dec_osf.pl ext/POSIX/POSIX.pm
- ! ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
- ! ext/SDBM_File/Makefile.PL ext/SDBM_File/SDBM_File.pm
- ! ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/pair.c
- ! ext/SDBM_File/sdbm/pair.h ext/SDBM_File/sdbm/sdbm.3
- ! ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
- ! ext/Socket/Socket.pm ext/Socket/Socket.xs ext/util/make_ext
- ! form.h global.sym gv.c gv.h handy.h hints/3b1.sh
- ! hints/README.hints hints/aix.sh hints/apollo.sh hints/bsdos.sh
- ! hints/convexos.sh hints/cxux.sh hints/dec_osf.sh hints/dgux.sh
- ! hints/dynixptx.sh hints/epix.sh hints/esix4.sh
- ! hints/freebsd.sh hints/hpux.sh hints/irix_4.sh hints/irix_5.sh
- ! hints/irix_6.sh hints/isc.sh hints/linux.sh hints/machten.sh
- ! hints/machten_2.sh hints/mips.sh hints/mpeix.sh
- ! hints/netbsd.sh hints/next_3.sh hints/next_3_0.sh hints/os2.sh
- ! hints/powerux.sh hints/sco.sh hints/sco_2_3_3.sh
- ! hints/sco_2_3_4.sh hints/solaris_2.sh hints/sunos_4_0.sh
- ! hints/sunos_4_1.sh hints/svr4.sh hints/titanos.sh
- ! hints/ultrix_4.sh hints/unicos.sh hints/utekv.sh hv.c hv.h
- ! installman installperl interp.sym keywords.h keywords.pl
- ! lib/AnyDBM_File.pm lib/AutoLoader.pm lib/AutoSplit.pm
- ! lib/Benchmark.pm lib/Carp.pm lib/Cwd.pm
- ! lib/Devel/SelfStubber.pm lib/English.pm lib/Env.pm
- ! lib/Exporter.pm lib/ExtUtils/Install.pm
- ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_OS2.pm
- ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
- ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Manifest.pm
- ! lib/ExtUtils/Mkbootstrap.pm lib/ExtUtils/Mksymlists.pm
- ! lib/ExtUtils/testlib.pm lib/ExtUtils/typemap
- ! lib/ExtUtils/xsubpp lib/File/Basename.pm lib/File/Copy.pm
- ! lib/File/Find.pm lib/File/Path.pm lib/FileCache.pm
- ! lib/Getopt/Long.pm lib/Getopt/Std.pm lib/I18N/Collate.pm
- ! lib/IPC/Open2.pm lib/IPC/Open3.pm lib/Math/BigInt.pm
- ! lib/Math/Complex.pm lib/Net/Ping.pm lib/Pod/Functions.pm
- ! lib/Pod/Text.pm lib/Search/Dict.pm lib/SelectSaver.pm
- ! lib/SelfLoader.pm lib/Symbol.pm lib/Sys/Hostname.pm
- ! lib/Sys/Syslog.pm lib/Term/Cap.pm lib/Term/Complete.pm
- ! lib/Term/ReadLine.pm lib/Test/Harness.pm lib/Text/Abbrev.pm
- ! lib/Text/ParseWords.pm lib/Text/Soundex.pm lib/Text/Tabs.pm
- ! lib/Text/Wrap.pm lib/Tie/Hash.pm lib/Tie/Scalar.pm
- ! lib/Tie/SubstrHash.pm lib/Time/Local.pm lib/abbrev.pl
- ! lib/bigfloat.pl lib/bigint.pl lib/cacheout.pl lib/complete.pl
- ! lib/diagnostics.pm lib/dotsh.pl lib/dumpvar.pl lib/find.pl
- ! lib/finddepth.pl lib/ftp.pl lib/getcwd.pl lib/getopts.pl
- ! lib/importenv.pl lib/lib.pm lib/look.pl lib/newgetopt.pl
- ! lib/open2.pl lib/open3.pl lib/overload.pm lib/perl5db.pl
- ! lib/sigtrap.pm lib/strict.pm lib/subs.pm lib/syslog.pl
- ! lib/termcap.pl lib/timelocal.pl lib/validate.pl lib/vars.pm
- ! makeaperl.SH makedepend.SH malloc.c mg.c mg.h minimod.pl
- ! miniperlmain.c myconfig op.c op.h opcode.h opcode.pl
- ! os2/Makefile.SHs os2/diff.configure os2/os2.c os2/os2ish.h
- ! os2/perl2cmd.pl patchlevel.h perl.c perl.h perl_exp.SH perlsh
- ! perly.c perly.c.diff perly.h perly.y pod/Makefile pod/buildtoc
- ! pod/perl.pod pod/perlbook.pod pod/perlbot.pod pod/perlcall.pod
- ! pod/perldata.pod pod/perldebug.pod pod/perldiag.pod
- ! pod/perldsc.pod pod/perlembed.pod pod/perlform.pod
- ! pod/perlfunc.pod pod/perlguts.pod pod/perlipc.pod
- ! pod/perllol.pod pod/perlmod.pod pod/perlobj.pod pod/perlop.pod
- ! pod/perlpod.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
- ! pod/perlsec.pod pod/perlstyle.pod pod/perlsub.pod
- ! pod/perlsyn.pod pod/perltie.pod pod/perltoc.pod
- ! pod/perltrap.pod pod/perlvar.pod pod/perlxs.pod
- ! pod/perlxstut.pod pod/pod2html.PL pod/pod2latex.PL
- ! pod/pod2man.PL pod/pod2text.PL pod/roffitall pp.c pp.h
- ! pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c regcomp.h
- ! regexec.c regexp.h run.c scope.c scope.h sv.c sv.h t/README
- ! t/TEST t/base/lex.t t/base/term.t t/cmd/mod.t t/cmd/while.t
- ! t/comp/cpp.t t/comp/multiline.t t/comp/package.t
- ! t/comp/script.t t/harness t/io/argv.t t/io/dup.t t/io/fs.t
- ! t/io/inplace.t t/io/pipe.t t/io/tell.t t/lib/anydbm.t
- ! t/lib/bigintpm.t t/lib/db-btree.t t/lib/db-hash.t
- ! t/lib/db-recno.t t/lib/dirhand.t t/lib/filehand.t t/lib/gdbm.t
- ! t/lib/ndbm.t t/lib/odbm.t t/lib/posix.t t/lib/sdbm.t
- ! t/lib/socket.t t/op/chop.t t/op/delete.t t/op/each.t
- ! t/op/exec.t t/op/fork.t t/op/glob.t t/op/goto.t t/op/groups.t
- ! t/op/magic.t t/op/misc.t t/op/mkdir.t t/op/my.t t/op/oct.t
- ! t/op/pack.t t/op/pat.t t/op/quotemeta.t t/op/rand.t
- ! t/op/re_tests t/op/readdir.t t/op/ref.t t/op/regexp.t
- ! t/op/sleep.t t/op/sort.t t/op/split.t t/op/stat.t t/op/subst.t
- ! t/op/substr.t t/op/write.t taint.c toke.c unixish.h util.c
- ! util.h utils/Makefile utils/c2ph.PL utils/h2ph.PL
- ! utils/h2xs.PL utils/perlbug.PL utils/perldoc.PL utils/pl2pm.PL
- ! vms/config.vms vms/descrip.mms vms/ext/Filespec.pm
- ! vms/ext/Stdio/Stdio.pm vms/ext/Stdio/Stdio.xs
- ! vms/ext/Stdio/test.pl vms/fndvers.com vms/gen_shrfls.pl
- ! vms/genconfig.pl vms/genopt.com vms/myconfig.com
- ! vms/perlvms.pod vms/perly_c.vms vms/perly_h.vms
- ! vms/sockadapt.c vms/sockadapt.h vms/test.com vms/vms.c
- ! vms/vms_yfix.pl vms/vmsish.h vms/writemain.pl writemain.SH
- ! x2p/EXTERN.h x2p/INTERN.h x2p/Makefile.SH x2p/a2p.c x2p/a2p.h
- ! x2p/a2p.y x2p/a2py.c x2p/cflags.SH x2p/find2perl.PL x2p/hash.c
- ! x2p/hash.h x2p/s2p.PL x2p/str.c x2p/str.h x2p/util.c
- ! x2p/util.h x2p/walk.c
-____________________________________________________________________________
-[ 16] By: mbeattie on 1997/05/23 22:42:08
- Log: Initial integration of relperl from 5.003.
- Branch: relperl
- +> (branch 600 files)
-____________________________________________________________________________
-[ 14] By: mbeattie on 1997/05/12 20:22:56
- Log: Finish code generation rewrite. Clean up B::Section class and
- handle symbol table translation internally. Simple .pm modules
- now compile OK.
- Branch: perlext
- ! Compiler/B.pm Compiler/B/Bblock.pm Compiler/B/C.pm
- ! Compiler/B/CC.pm
-____________________________________________________________________________
-[ 13] By: mbeattie on 1997/05/05 19:41:18
- Log: Don't make pp_enter and pp_return trigger basic blocks.
- Branch: perlext
- ! Compiler/B/Bblock.pm
-____________________________________________________________________________
-[ 12] By: mbeattie on 1997/05/05 19:40:16
- Log: Rewrite code generation. Sections (de)multiplexed into a
- temporary file instead of stored in arrays.
- Branch: perlext
- ! Compiler/B.pm Compiler/B/C.pm Compiler/B/CC.pm
-____________________________________________________________________________
-[ 11] By: mbeattie on 1997/05/03 20:20:59
- Log: Development to pre-alpha4
- Branch: perlext
- + Compiler/B/Deparse.pm Compiler/B/Lint.pm Compiler/makeliblinks
- ! Compiler/B.pm Compiler/B.xs Compiler/B/Bblock.pm
- ! Compiler/B/Bytecode.pm Compiler/B/C.pm Compiler/B/CC.pm
- ! Compiler/B/Debug.pm Compiler/B/Terse.pm Compiler/B/Xref.pm
- ! Compiler/Makefile.PL Compiler/README Compiler/TESTS
- ! Compiler/assemble Compiler/bytecode.pl Compiler/byteperl.c
- ! Compiler/byterun.c Compiler/cc_runtime.h Compiler/disassemble
- ! Compiler/test_harness Compiler/test_harness_cc
-____________________________________________________________________________
-[ 10] By: mbeattie on 1997/05/03 14:47:06
- Log: Initial check-in of perl compiler.
- Branch: perlext
- + Compiler/Artistic Compiler/B.pm Compiler/B.xs
- + Compiler/B/Asmdata.pm Compiler/B/Assembler.pm
- + Compiler/B/Bblock.pm Compiler/B/Bytecode.pm Compiler/B/C.pm
- + Compiler/B/CC.pm Compiler/B/Debug.pm
- + Compiler/B/Disassembler.pm Compiler/B/Showlex.pm
- + Compiler/B/Stackobj.pm Compiler/B/Terse.pm Compiler/B/Xref.pm
- + Compiler/Copying Compiler/Makefile.PL Compiler/NOTES
- + Compiler/O.pm Compiler/README Compiler/TESTS
- + Compiler/TESTS.alpha2 Compiler/Todo Compiler/assemble
- + Compiler/bytecode.h Compiler/bytecode.pl Compiler/byteperl.c
- + Compiler/byterun.c Compiler/byterun.h Compiler/cc_harness
- + Compiler/cc_runtime.h Compiler/ccop.c Compiler/ccop.h
- + Compiler/disassemble Compiler/old/README.feb11
- + Compiler/old/TESTS.mar11 Compiler/old/TESTS.mar20
- + Compiler/old/TESTS.may11 Compiler/old/TESTS.pre-jul27
- + Compiler/op.patch Compiler/ramblings/cc.notes
- + Compiler/ramblings/curcop.runtime
- + Compiler/ramblings/dontparse.c Compiler/ramblings/flip-flop
- + Compiler/ramblings/foo.bench Compiler/ramblings/foo2.bench
- + Compiler/ramblings/foo3.bench Compiler/ramblings/magic
- + Compiler/ramblings/pp_i_add Compiler/ramblings/reg.alloc
- + Compiler/ramblings/runtime.porting
- + Compiler/ramblings/sort.notes Compiler/ramblings/sub.call
- + Compiler/ramblings/subst.notes Compiler/run_bytecode_test
- + Compiler/run_cc_test Compiler/run_test Compiler/test_harness
- + Compiler/test_harness_bytecode Compiler/test_harness_cc
- + Compiler/typemap
-____________________________________________________________________________
-[ 9] By: mbeattie on 1997/05/02 19:03:49
- Log: Don't require CvDEPTH == 0 when bombing out of subs.
- Branch: thrperl
- ! pp_hot.c
+[ 1658] By: gsar on 1998/07/26 02:23:46
+ Log: VMS patches from Dan Sugalski <sugalskd@osshe.edu>
+ Date: Fri, 24 Jul 1998 11:38:25 -0700
+ Message-Id: <3.0.5.32.19980724113825.00a067b0@ous.edu>
+ Subject: [PATCH 5.005] version number problem with VMS (Corrected)
+ --
+ Date: Fri, 24 Jul 1998 12:30:36 -0700
+ Message-Id: <3.0.5.32.19980724123036.009f0390@ous.edu>
+ Subject: [PATCH 5.005]Tweaks to README.vms
+ --
+ Date: Sat, 25 Jul 1998 17:56:55 -0700 (PDT)
+ Message-ID: <Pine.GSO.3.96.980725175626.15740D-100000@netserve.ous.edu>
+ Subject: [PATCH 5.005] Final build cleanup patch
+ Branch: maint-5.005/perl
+ ! README.vms vms/descrip_mms.template vms/subconfigure.com
____________________________________________________________________________
-[ 8] By: mbeattie on 1997/04/23 19:06:45
- Log: Added programmer-level condition variables via "condpair" magic.
- Added support for detached threads and tweaked a few things.
- Branch: thrperl
- ! embed.h global.sym keywords.h mg.c opcode.h perl.c perl.h
- ! pp_ctl.c pp_hot.c proto.h run.c scope.c sv.c sv.h thread.h
- ! util.c
+[ 1657] By: gsar on 1998/07/26 02:19:50
+ Log: another platform where pp_sselect() needs a whole fd_set buffer
+ From: Lupe Christoph <lupe@alanya.m.isar.de>
+ Date: Sat, 25 Jul 1998 19:49:33 +0200 (MET DST)
+ Message-Id: <199807251749.TAA22347@alanya.m.isar.de>
+ Subject: Patch for Not OK: perl 5.005 on i86pc-solaris-thread 2.6
+ Branch: maint-5.005/perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1656] By: gsar on 1998/07/26 02:12:46
+ Log: fix problem building modules on dos-djgpp
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Sat, 25 Jul 1998 00:53:39 +0200
+ Message-ID: <19980725005339.C222@cdata.tvnet.hu>
+ Subject: [PATCH 5.005] dos-djgpp and modules problem
+ Branch: maint-5.005/perl
+ ! djgpp/fixpmain
+____________________________________________________________________________
+[ 1655] By: gsar on 1998/07/26 02:11:09
+ Log: From: Tom Spindler <dogcow@home.merit.edu>
+ Date: Wed, 22 Jul 1998 16:11:07 -0400
+ Message-ID: <19980722161107.A16813@home.merit.edu>
+ Subject: [PATCH 5.005] BeOS tweak
+ Branch: maint-5.005/perl
+ ! hints/beos.sh
____________________________________________________________________________
-[ 7] By: mbeattie on 1997/04/23 19:04:18
- Log: Rewrote programmer-level condition variables from scratch. Added
- support for detaching threads. Fixed handling for arguments
- passed in to threads and return values for joined threads.
- Branch: perlext
- + Thread/lock.t
- ! Thread/README Thread/Thread.pm Thread/Thread.xs Thread/cond.t
- ! Thread/typemap
-____________________________________________________________________________
-[ 6] By: mbeattie on 1997/04/10 20:17:26
- Log: Initial check-in of Thread module.
- Branch: perlext
- + Thread/Makefile.PL Thread/Notes Thread/README Thread/Thread.pm
- + Thread/Thread.xs Thread/cond.t Thread/create.t Thread/io.t
- + Thread/join.t Thread/sync.t Thread/sync2.t Thread/typemap
- + Thread/unsync.t Thread/unsync2.t Thread/unsync3.t
- + Thread/unsync4.t
-____________________________________________________________________________
-[ 5] By: mbeattie on 1997/04/10 20:05:52
- Log: Tweaks to allow compilation without -DUSE_THREADS and fix
- missing parens (pad allocation) in the tokener.
- Branch: thrperl
- ! op.c pp_ctl.c toke.c
-____________________________________________________________________________
-[ 4] By: mbeattie on 1997/03/28 18:40:44
- Log: Initial 3-way merge from (5.001m, thr1m, 5.003) plus fixups.
- Branch: thrperl
- + thread.h
- ! XSUB.h av.c cv.h deb.c doio.c doop.c dump.c global.sym gv.c
- ! hv.c malloc.c mg.c op.c op.h opcode.h opcode.pl perl.c perl.h
- ! pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c regexec.c
- ! run.c scope.c sv.c sv.h toke.c util.c
-____________________________________________________________________________
-[ 3] By: mbeattie on 1997/03/28 13:36:23
- Log: Branch 5.003 -> thrperl
- Branch: thrperl
- +> (branch 600 files)
-____________________________________________________________________________
-[ 2] By: mbeattie on 1997/03/28 13:32:21
- Log: Initial devel changes.
- Pseudo-hashes. Optional strong typing. RESTART {}.
- Branch: perl
- ! av.c doop.c embed.h ext/DB_File/DB_File.xs global.sym
- ! interp.sym keywords.h keywords.pl lib/ExtUtils/xsubpp op.c
- ! perl.c perl.h pp.c pp_hot.c proto.h t/op/groups.t toke.c
-____________________________________________________________________________
-[ 1] By: mbeattie on 1997/03/28 13:17:33
- Log: Perl 5.003 check-in
- Branch: perl
- + Artistic Changes Changes.Conf Configure Copying EXTERN.h
- + INSTALL INTERN.h MANIFEST Makefile.SH README README.vms Todo
- + XSUB.h av.c av.h cflags.SH config_H config_h.SH configpm
- + configure cop.h cv.h deb.c doio.c doop.c dosish.h dump.c
- + eg/ADB eg/README eg/changes eg/client eg/down eg/dus eg/findcp
- + eg/findtar eg/g/gcp eg/g/gcp.man eg/g/ged eg/g/ghosts eg/g/gsh
- + eg/g/gsh.man eg/muck eg/muck.man eg/myrup eg/nih eg/relink
- + eg/rename eg/rmfrom eg/scan/scan_df eg/scan/scan_last
- + eg/scan/scan_messages eg/scan/scan_passwd eg/scan/scan_ps
- + eg/scan/scan_sudo eg/scan/scan_suid eg/scan/scanner eg/server
- + eg/shmkill eg/sysvipc/README eg/sysvipc/ipcmsg
- + eg/sysvipc/ipcsem eg/sysvipc/ipcshm eg/travesty eg/unuc
- + eg/uudecode eg/van/empty eg/van/unvanish eg/van/vanexp
- + eg/van/vanish eg/who eg/wrapsuid emacs/cperl-mode.el embed.h
- + embed.pl ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
- + ext/DB_File/DB_File_BS ext/DB_File/Makefile.PL
- + ext/DB_File/typemap ext/DynaLoader/DynaLoader.pm
- + ext/DynaLoader/Makefile.PL ext/DynaLoader/README
- + ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_dld.xs
- + ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_hpux.xs
- + ext/DynaLoader/dl_next.xs ext/DynaLoader/dl_none.xs
- + ext/DynaLoader/dl_os2.xs ext/DynaLoader/dl_vms.xs
- + ext/DynaLoader/dlutils.c ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
- + ext/Fcntl/Makefile.PL ext/FileHandle/FileHandle.pm
- + ext/FileHandle/FileHandle.xs ext/FileHandle/Makefile.PL
- + ext/GDBM_File/GDBM_File.pm ext/GDBM_File/GDBM_File.xs
- + ext/GDBM_File/Makefile.PL ext/GDBM_File/typemap
- + ext/NDBM_File/Makefile.PL ext/NDBM_File/NDBM_File.pm
- + ext/NDBM_File/NDBM_File.xs ext/NDBM_File/hints/solaris.pl
- + ext/NDBM_File/hints/svr4.pl ext/NDBM_File/typemap
- + ext/ODBM_File/Makefile.PL ext/ODBM_File/ODBM_File.pm
- + ext/ODBM_File/ODBM_File.xs ext/ODBM_File/hints/dec_osf.pl
- + ext/ODBM_File/hints/sco.pl ext/ODBM_File/hints/solaris.pl
- + ext/ODBM_File/hints/svr4.pl ext/ODBM_File/typemap
- + ext/POSIX/Makefile.PL ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
- + ext/POSIX/POSIX.xs ext/POSIX/typemap ext/SDBM_File/Makefile.PL
- + ext/SDBM_File/SDBM_File.pm ext/SDBM_File/SDBM_File.xs
- + ext/SDBM_File/sdbm/CHANGES ext/SDBM_File/sdbm/COMPARE
- + ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/README
- + ext/SDBM_File/sdbm/README.too ext/SDBM_File/sdbm/biblio
- + ext/SDBM_File/sdbm/dba.c ext/SDBM_File/sdbm/dbd.c
- + ext/SDBM_File/sdbm/dbe.1 ext/SDBM_File/sdbm/dbe.c
- + ext/SDBM_File/sdbm/dbm.c ext/SDBM_File/sdbm/dbm.h
- + ext/SDBM_File/sdbm/dbu.c ext/SDBM_File/sdbm/grind
- + ext/SDBM_File/sdbm/hash.c ext/SDBM_File/sdbm/linux.patches
- + ext/SDBM_File/sdbm/makefile.sdbm ext/SDBM_File/sdbm/pair.c
- + ext/SDBM_File/sdbm/pair.h ext/SDBM_File/sdbm/readme.ms
- + ext/SDBM_File/sdbm/readme.ps ext/SDBM_File/sdbm/sdbm.3
- + ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
- + ext/SDBM_File/sdbm/tune.h ext/SDBM_File/sdbm/util.c
- + ext/SDBM_File/typemap ext/Safe/Makefile.PL ext/Safe/Safe.pm
- + ext/Safe/Safe.xs ext/Socket/Makefile.PL ext/Socket/Socket.pm
- + ext/Socket/Socket.xs ext/util/extliblist ext/util/make_ext
- + ext/util/mkbootstrap form.h global.sym globals.c gv.c gv.h
- + h2pl/README h2pl/cbreak.pl h2pl/cbreak2.pl h2pl/eg/sizeof.ph
- + h2pl/eg/sys/errno.pl h2pl/eg/sys/ioctl.pl h2pl/eg/sysexits.pl
- + h2pl/getioctlsizes h2pl/mksizes h2pl/mkvars h2pl/tcbreak
- + h2pl/tcbreak2 handy.h hints/3b1.sh hints/3b1cc
- + hints/README.hints hints/aix.sh hints/altos486.sh
- + hints/apollo.sh hints/aux.sh hints/bsdos.sh hints/convexos.sh
- + hints/cxux.sh hints/dec_osf.sh hints/dgux.sh hints/dnix.sh
- + hints/dynix.sh hints/dynixptx.sh hints/epix.sh hints/esix4.sh
- + hints/fps.sh hints/freebsd.sh hints/genix.sh
- + hints/greenhills.sh hints/hpux.sh hints/i386.sh
- + hints/irix_4.sh hints/irix_5.sh hints/irix_6.sh
- + hints/irix_6_2.sh hints/isc.sh hints/isc_2.sh hints/linux.sh
- + hints/machten.sh hints/machten_2.sh hints/mips.sh hints/mpc.sh
- + hints/mpeix.sh hints/ncr_tower.sh hints/netbsd.sh
- + hints/next_3.sh hints/next_3_0.sh hints/opus.sh hints/os2.sh
- + hints/powerux.sh hints/sco.sh hints/sco_2_3_0.sh
- + hints/sco_2_3_1.sh hints/sco_2_3_2.sh hints/sco_2_3_3.sh
- + hints/sco_2_3_4.sh hints/solaris_2.sh hints/stellar.sh
- + hints/sunos_4_0.sh hints/sunos_4_1.sh hints/svr4.sh
- + hints/ti1500.sh hints/titanos.sh hints/ultrix_4.sh
- + hints/unicos.sh hints/unisysdynix.sh hints/utekv.sh
- + hints/uts.sh hv.c hv.h installman installperl interp.sym
- + keywords.h keywords.pl lib/AnyDBM_File.pm lib/AutoLoader.pm
- + lib/AutoSplit.pm lib/Benchmark.pm lib/Carp.pm lib/Cwd.pm
- + lib/Devel/SelfStubber.pm lib/DirHandle.pm lib/English.pm
- + lib/Env.pm lib/Exporter.pm lib/ExtUtils/Install.pm
- + lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_OS2.pm
- + lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
- + lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Manifest.pm
- + lib/ExtUtils/Mkbootstrap.pm lib/ExtUtils/Mksymlists.pm
- + lib/ExtUtils/testlib.pm lib/ExtUtils/typemap
- + lib/ExtUtils/xsubpp lib/File/Basename.pm lib/File/CheckTree.pm
- + lib/File/Copy.pm lib/File/Find.pm lib/File/Path.pm
- + lib/FileCache.pm lib/Getopt/Long.pm lib/Getopt/Std.pm
- + lib/I18N/Collate.pm lib/IPC/Open2.pm lib/IPC/Open3.pm
- + lib/Math/BigFloat.pm lib/Math/BigInt.pm lib/Math/Complex.pm
- + lib/Net/Ping.pm lib/Pod/Functions.pm lib/Pod/Text.pm
- + lib/Search/Dict.pm lib/SelectSaver.pm lib/SelfLoader.pm
- + lib/Shell.pm lib/Symbol.pm lib/Sys/Hostname.pm
- + lib/Sys/Syslog.pm lib/Term/Cap.pm lib/Term/Complete.pm
- + lib/Term/ReadLine.pm lib/Test/Harness.pm lib/Text/Abbrev.pm
- + lib/Text/ParseWords.pm lib/Text/Soundex.pm lib/Text/Tabs.pm
- + lib/Text/Wrap.pm lib/Tie/Hash.pm lib/Tie/Scalar.pm
- + lib/Tie/SubstrHash.pm lib/Time/Local.pm lib/abbrev.pl
- + lib/assert.pl lib/bigfloat.pl lib/bigint.pl lib/bigrat.pl
- + lib/cacheout.pl lib/chat2.inter lib/chat2.pl lib/complete.pl
- + lib/ctime.pl lib/diagnostics.pm lib/dotsh.pl lib/dumpvar.pl
- + lib/exceptions.pl lib/fastcwd.pl lib/find.pl lib/finddepth.pl
- + lib/flush.pl lib/ftp.pl lib/getcwd.pl lib/getopt.pl
- + lib/getopts.pl lib/hostname.pl lib/importenv.pl lib/integer.pm
- + lib/less.pm lib/lib.pm lib/look.pl lib/newgetopt.pl
- + lib/open2.pl lib/open3.pl lib/overload.pm lib/perl5db.pl
- + lib/pwd.pl lib/shellwords.pl lib/sigtrap.pm lib/splain
- + lib/stat.pl lib/strict.pm lib/subs.pm lib/syslog.pl
- + lib/tainted.pl lib/termcap.pl lib/timelocal.pl lib/validate.pl
- + lib/vars.pm makeaperl.SH makedepend.SH makedir.SH malloc.c
- + mg.c mg.h minimod.pl miniperlmain.c mv-if-diff myconfig op.c
- + op.h opcode.h opcode.pl os2/Makefile.SHs os2/POSIX.mkfifo
- + os2/README os2/README.old os2/diff.configure os2/diff.db_file
- + os2/notes os2/os2.c os2/os2ish.h os2/perl2cmd.pl patchlevel.h
- + perl.c perl.h perl_exp.SH perlsh perly.c perly.c.diff
- + perly.fixer perly.h perly.y pod/Makefile pod/buildtoc
- + pod/perl.pod pod/perlbook.pod pod/perlbot.pod pod/perlcall.pod
- + pod/perldata.pod pod/perldebug.pod pod/perldiag.pod
- + pod/perldsc.pod pod/perlembed.pod pod/perlform.pod
- + pod/perlfunc.pod pod/perlguts.pod pod/perlipc.pod
- + pod/perllol.pod pod/perlmod.pod pod/perlobj.pod pod/perlop.pod
- + pod/perlovl.pod pod/perlpod.pod pod/perlre.pod pod/perlref.pod
- + pod/perlrun.pod pod/perlsec.pod pod/perlstyle.pod
- + pod/perlsub.pod pod/perlsyn.pod pod/perltie.pod
- + pod/perltoc.pod pod/perltrap.pod pod/perlvar.pod
- + pod/perlxs.pod pod/perlxstut.pod pod/pod2html.PL
- + pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL pod/roffitall
- + pod/splitman pod/splitpod pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c
- + proto.h regcomp.c regcomp.h regexec.c regexp.h run.c scope.c
- + scope.h sv.c sv.h t/README t/TEST t/base/cond.t t/base/if.t
- + t/base/lex.t t/base/pat.t t/base/term.t t/cmd/elsif.t
- + t/cmd/for.t t/cmd/mod.t t/cmd/subval.t t/cmd/switch.t
- + t/cmd/while.t t/comp/cmdopt.t t/comp/cpp.aux t/comp/cpp.t
- + t/comp/decl.t t/comp/multiline.t t/comp/package.t
- + t/comp/script.t t/comp/term.t t/harness t/io/argv.t t/io/dup.t
- + t/io/fs.t t/io/inplace.t t/io/pipe.t t/io/print.t t/io/tell.t
- + t/lib/anydbm.t t/lib/bigint.t t/lib/bigintpm.t
- + t/lib/db-btree.t t/lib/db-hash.t t/lib/db-recno.t
- + t/lib/dirhand.t t/lib/english.t t/lib/filehand.t t/lib/gdbm.t
- + t/lib/ndbm.t t/lib/odbm.t t/lib/posix.t t/lib/safe.t
- + t/lib/sdbm.t t/lib/socket.t t/lib/soundex.t t/op/append.t
- + t/op/array.t t/op/auto.t t/op/chop.t t/op/cond.t t/op/delete.t
- + t/op/do.t t/op/each.t t/op/eval.t t/op/exec.t t/op/exp.t
- + t/op/flip.t t/op/fork.t t/op/glob.t t/op/goto.t t/op/groups.t
- + t/op/index.t t/op/int.t t/op/join.t t/op/list.t t/op/local.t
- + t/op/magic.t t/op/misc.t t/op/mkdir.t t/op/my.t t/op/oct.t
- + t/op/ord.t t/op/overload.t t/op/pack.t t/op/pat.t t/op/push.t
- + t/op/quotemeta.t t/op/rand.t t/op/range.t t/op/re_tests
- + t/op/read.t t/op/readdir.t t/op/ref.t t/op/regexp.t
- + t/op/repeat.t t/op/sleep.t t/op/sort.t t/op/split.t
- + t/op/sprintf.t t/op/stat.t t/op/study.t t/op/subst.t
- + t/op/substr.t t/op/time.t t/op/undef.t t/op/unshift.t
- + t/op/vec.t t/op/write.t t/re_tests taint.c toke.c unixish.h
- + util.c util.h utils/Makefile utils/c2ph.PL utils/h2ph.PL
- + utils/h2xs.PL utils/perlbug.PL utils/perldoc.PL utils/pl2pm.PL
- + vms/Makefile vms/config.vms vms/descrip.mms
- + vms/ext/Filespec.pm vms/ext/Stdio/0README.txt
- + vms/ext/Stdio/Makefile.PL vms/ext/Stdio/Stdio.pm
- + vms/ext/Stdio/Stdio.xs vms/ext/Stdio/test.pl vms/fndvers.com
- + vms/gen_shrfls.pl vms/genconfig.pl vms/genopt.com
- + vms/make_command.com vms/mms2make.pl vms/myconfig.com
- + vms/perlvms.pod vms/perly_c.vms vms/perly_h.vms
- + vms/sockadapt.c vms/sockadapt.h vms/test.com vms/vms.c
- + vms/vms_yfix.pl vms/vmsish.h vms/writemain.pl writemain.SH
- + x2p/EXTERN.h x2p/INTERN.h x2p/Makefile.SH x2p/a2p.c x2p/a2p.h
- + x2p/a2p.man x2p/a2p.y x2p/a2py.c x2p/cflags.SH
- + x2p/find2perl.PL x2p/handy.h x2p/hash.c x2p/hash.h x2p/s2p.PL
- + x2p/s2p.man x2p/str.c x2p/str.h x2p/util.c x2p/util.h
- + x2p/walk.c
+[ 1654] By: gsar on 1998/07/26 02:09:29
+ Log: various pod tweaks
+ Branch: maint-5.005/perl
+ ! Changes pod/perldelta.pod pod/perlmodinstall.pod
+ ! pod/perltoc.pod
+____________________________________________________________________________
+[ 1653] By: gsar on 1998/07/26 02:05:46
+ Log: fix emacs/ptags for PL_* changes
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 24 Jul 1998 03:12:35 -0400 (EDT)
+ Message-Id: <199807240712.DAA04204@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_76] Yet better ptags
+ Branch: maint-5.005/perl
+ ! emacs/ptags
+____________________________________________________________________________
+[ 1652] By: gsar on 1998/07/26 02:03:01
+ Log: fix behavior of <=> on bigints
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Message-Id: <E0yzlfF-0004kz-00@taurus.cus.cam.ac.uk>
+ Date: Fri, 24 Jul 1998 18:29:53 +0100
+ Subject: [PATCH] Re: Math::BigInt <=> op is not correct.
+ Branch: maint-5.005/perl
+ ! lib/Math/BigInt.pm t/lib/bigintpm.t
+____________________________________________________________________________
+[ 1651] By: larry on 1998/07/24 05:44:33
+ Log: Here are the long-expected Unicode/UTF-8 modifications.
+ Branch: utfperl
+ + lib/unicode/ArabLink.pl lib/unicode/ArabLnkGrp.pl
+ + lib/unicode/Bidirectional.pl lib/unicode/Block.pl
+ + lib/unicode/Category.pl lib/unicode/CombiningClass.pl
+ + lib/unicode/Decomposition.pl
+ + lib/unicode/In/AlphabeticPresentationForms.pl
+ + lib/unicode/In/Arabic.pl
+ + lib/unicode/In/ArabicPresentationForms-A.pl
+ + lib/unicode/In/ArabicPresentationForms-B.pl
+ + lib/unicode/In/Armenian.pl lib/unicode/In/Arrows.pl
+ + lib/unicode/In/BasicLatin.pl lib/unicode/In/Bengali.pl
+ + lib/unicode/In/BlockElements.pl lib/unicode/In/Bopomofo.pl
+ + lib/unicode/In/BoxDrawing.pl
+ + lib/unicode/In/CJKCompatibility.pl
+ + lib/unicode/In/CJKCompatibilityForms.pl
+ + lib/unicode/In/CJKCompatibilityIdeographs.pl
+ + lib/unicode/In/CJKSymbolsandPunctuation.pl
+ + lib/unicode/In/CJKUnifiedIdeographs.pl
+ + lib/unicode/In/CombiningDiacriticalMarks.pl
+ + lib/unicode/In/CombiningHalfMarks.pl
+ + lib/unicode/In/CombiningMarksforSymbols.pl
+ + lib/unicode/In/ControlPictures.pl
+ + lib/unicode/In/CurrencySymbols.pl lib/unicode/In/Cyrillic.pl
+ + lib/unicode/In/Devanagari.pl lib/unicode/In/Dingbats.pl
+ + lib/unicode/In/EnclosedAlphanumerics.pl
+ + lib/unicode/In/EnclosedCJKLettersandMonths.pl
+ + lib/unicode/In/GeneralPunctuation.pl
+ + lib/unicode/In/GeometricShapes.pl lib/unicode/In/Georgian.pl
+ + lib/unicode/In/Greek.pl lib/unicode/In/GreekExtended.pl
+ + lib/unicode/In/Gujarati.pl lib/unicode/In/Gurmukhi.pl
+ + lib/unicode/In/HalfwidthandFullwidthForms.pl
+ + lib/unicode/In/HangulCompatibilityJamo.pl
+ + lib/unicode/In/HangulJamo.pl lib/unicode/In/HangulSyllables.pl
+ + lib/unicode/In/Hebrew.pl
+ + lib/unicode/In/HighPrivateUseSurrogates.pl
+ + lib/unicode/In/HighSurrogates.pl lib/unicode/In/Hiragana.pl
+ + lib/unicode/In/IPAExtensions.pl lib/unicode/In/Kanbun.pl
+ + lib/unicode/In/Kannada.pl lib/unicode/In/Katakana.pl
+ + lib/unicode/In/Lao.pl lib/unicode/In/Latin-1Supplement.pl
+ + lib/unicode/In/LatinExtended-A.pl
+ + lib/unicode/In/LatinExtended-B.pl
+ + lib/unicode/In/LatinExtendedAdditional.pl
+ + lib/unicode/In/LetterlikeSymbols.pl
+ + lib/unicode/In/LowSurrogates.pl lib/unicode/In/Malayalam.pl
+ + lib/unicode/In/MathematicalOperators.pl
+ + lib/unicode/In/MiscellaneousSymbols.pl
+ + lib/unicode/In/MiscellaneousTechnical.pl
+ + lib/unicode/In/NumberForms.pl
+ + lib/unicode/In/OpticalCharacterRecognition.pl
+ + lib/unicode/In/Oriya.pl lib/unicode/In/PrivateUse.pl
+ + lib/unicode/In/SmallFormVariants.pl
+ + lib/unicode/In/SpacingModifierLetters.pl
+ + lib/unicode/In/Specials.pl
+ + lib/unicode/In/SuperscriptsandSubscripts.pl
+ + lib/unicode/In/Tamil.pl lib/unicode/In/Telugu.pl
+ + lib/unicode/In/Thai.pl lib/unicode/In/Tibetan.pl
+ + lib/unicode/Is/Alnum.pl lib/unicode/Is/Alpha.pl
+ + lib/unicode/Is/BidiAN.pl lib/unicode/Is/BidiB.pl
+ + lib/unicode/Is/BidiCS.pl lib/unicode/Is/BidiEN.pl
+ + lib/unicode/Is/BidiES.pl lib/unicode/Is/BidiET.pl
+ + lib/unicode/Is/BidiL.pl lib/unicode/Is/BidiON.pl
+ + lib/unicode/Is/BidiR.pl lib/unicode/Is/BidiS.pl
+ + lib/unicode/Is/BidiWS.pl lib/unicode/Is/C.pl
+ + lib/unicode/Is/Cc.pl lib/unicode/Is/Cn.pl lib/unicode/Is/Co.pl
+ + lib/unicode/Is/DCcircle.pl lib/unicode/Is/DCcompat.pl
+ + lib/unicode/Is/DCfinal.pl lib/unicode/Is/DCfont.pl
+ + lib/unicode/Is/DCinital.pl lib/unicode/Is/DCinitial.pl
+ + lib/unicode/Is/DCisolated.pl lib/unicode/Is/DCnarrow.pl
+ + lib/unicode/Is/DCnoBreak.pl lib/unicode/Is/DCsmall.pl
+ + lib/unicode/Is/DCsquare.pl lib/unicode/Is/DCsub.pl
+ + lib/unicode/Is/DCsuper.pl lib/unicode/Is/DCvertical.pl
+ + lib/unicode/Is/DCwide.pl lib/unicode/Is/DecoCanon.pl
+ + lib/unicode/Is/DecoCompat.pl lib/unicode/Is/Digit.pl
+ + lib/unicode/Is/L.pl lib/unicode/Is/Ll.pl lib/unicode/Is/Lm.pl
+ + lib/unicode/Is/Lo.pl lib/unicode/Is/Lower.pl
+ + lib/unicode/Is/Lt.pl lib/unicode/Is/Lu.pl lib/unicode/Is/M.pl
+ + lib/unicode/Is/Mc.pl lib/unicode/Is/Mirrored.pl
+ + lib/unicode/Is/Mn.pl lib/unicode/Is/N.pl lib/unicode/Is/Nd.pl
+ + lib/unicode/Is/No.pl lib/unicode/Is/P.pl lib/unicode/Is/Pd.pl
+ + lib/unicode/Is/Pe.pl lib/unicode/Is/Po.pl
+ + lib/unicode/Is/Print.pl lib/unicode/Is/Ps.pl
+ + lib/unicode/Is/S.pl lib/unicode/Is/Sc.pl lib/unicode/Is/Sm.pl
+ + lib/unicode/Is/So.pl lib/unicode/Is/Space.pl
+ + lib/unicode/Is/Upper.pl lib/unicode/Is/Z.pl
+ + lib/unicode/Is/Zl.pl lib/unicode/Is/Zp.pl lib/unicode/Is/Zs.pl
+ + lib/unicode/JamoShort.pl lib/unicode/Makefile
+ + lib/unicode/Name.pl lib/unicode/Number.pl
+ + lib/unicode/To/Digit.pl lib/unicode/To/Lower.pl
+ + lib/unicode/To/Title.pl lib/unicode/To/Upper.pl
+ + lib/unicode/UnicodeData-Latest.txt lib/unicode/arabshp.txt
+ + lib/unicode/blocks.txt lib/unicode/index2.txt
+ + lib/unicode/jamo2.txt lib/unicode/mktables.PL
+ + lib/unicode/names2.txt lib/unicode/props2.txt
+ + lib/unicode/readme.txt lib/utf8.pm lib/utf8_heavy.pl t/UTEST
+ + utf8.c utf8.h
+ ! Makefile.SH doop.c embed.h embedvar.h global.sym handy.h mg.c
+ ! op.c op.h perl.h perlvars.h pod/perlfunc.pod pod/perlop.pod
+ ! pod/perlre.pod pp.c pp_ctl.c pp_hot.c proto.h regcomp.c
+ ! regcomp.h regcomp.sym regexec.c regexp.h regnodes.h sv.c
+ ! t/op/vec.t toke.c util.c vms/vmsish.h
+____________________________________________________________________________
+[ 1650] By: gsar on 1998/07/24 04:06:48
+ Log: create utfperl branch
+ Branch: utfperl
+ +> (branch 1079 files)
+____________________________________________________________________________
+[ 1649] By: gsar on 1998/07/24 03:56:56
+ Log: create maint-5.005 branch
+ Branch: maint-5.005/perl
+ +> (branch 1079 files)
+____________________________________________________________________________
+[ 1648] By: gsar on 1998/07/24 03:36:35
+ Log: un-checked-in 5.005 Changes (this is 5.005 *exactly*)
+ Branch: perl
+ ! Changes
+
diff --git a/contrib/perl5/Changes5.005 b/contrib/perl5/Changes5.005
new file mode 100644
index 0000000..d0d19a2
--- /dev/null
+++ b/contrib/perl5/Changes5.005
@@ -0,0 +1,19336 @@
+Please note: This file provides a summary of significant changes
+between versions and sub-versions of Perl, not necessarily a complete
+list of each modification. If you'd like more detailed information,
+please consult the comments in the patches on which the relevant
+release of Perl is based. (Patches can be found on any CPAN
+site, in the .../src/5.0 directory for full version releases,
+or in the .../src/5/0/unsupported directory for sub-version
+releases.)
+
+
+ ---------------
+ CAST AND CREW
+ ---------------
+
+To give due honor to those who have made Perl what is is today,
+here are some of the more common names in the Changes file, and their
+current addresses (as of July 1998):
+
+ Gisle Aas <gisle@aas.no>
+ Abigail <abigail@fnx.com>
+ Kenneth Albanowski <kjahds@kjahds.com>
+ Russ Allbery <rra@stanford.edu>
+ Spider Boardman <spider@orb.nashua.nh.us>
+ Tom Christiansen <tchrist@perl.com>
+ Hallvard B Furuseth <h.b.furuseth@usit.uio.no>
+ M. J. T. Guy <mjtg@cus.cam.ac.uk>
+ Jarkko Hietaniemi <jhi@iki.fi>
+ Nick Ing-Simmons <nik@tiuk.ti.com>
+ Andreas Koenig <a.koenig@mind.de>
+ Doug MacEachern <dougm@opengroup.org>
+ Paul Marquess <pmarquess@bfsec.bt.co.uk>
+ Stephen McCamant <alias@mcs.com>
+ Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Hans Mulder <hansmu@xs4all.nl>
+ Matthias Neeracher <neeri@iis.ee.ethz.ch>
+ Jeff Okamoto <okamoto@hpcc123.corp.hp.com>
+ Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
+ Tom Phoenix <rootbeer@teleport.com>
+ Joshua Pritikin <joshua.pritikin@db.com>
+ Norbert Pueschel <pueschel@imsdd.meb.uni-bonn.de>
+ Dean Roehrich <roehrich@cray.com>
+ Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Roderick Schertler <roderick@argon.org>
+ Kurt D. Starsinic <kstar@isinet.com>
+ Dan Sugalski <sugalskd@osshe.edu>
+ Larry W. Virden <lvirden@cas.org>
+ Ilya Zakharevich <ilya@math.ohio-state.edu>
+
+And the Keepers of the Patch Pumpkin:
+
+ Charles Bailey <bailey@newman.upenn.edu>
+ Graham Barr <gbarr@pobox.com>
+ Malcolm Beattie <mbeattie@sable.ox.ac.uk>
+ Tim Bunce <Tim.Bunce@ig.co.uk>
+ Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Gurusamy Sarathy <gsar@umich.edu>
+ Chip Salzenberg <chip@perl.com>
+
+And, of course, the Author of Perl:
+
+ Larry Wall <larry@wall.org>
+
+
+NOTE: Each change entry shows the change number; who checked it into the
+repository; when; description of the change; which branch the change
+happened in; and the affected files. The file lists have a short symbolic
+indicator:
+
+ ! modified
+ + added
+ - deleted
+ +> branched (from elsewhere)
+ !> merged changes (from elsewhere)
+
+
+----------------
+Version 5.005_03 Third maintenance release of 5.005
+----------------
+
+____________________________________________________________________________
+[ 3198] By: gbarr on 1999/03/28 22:21:49
+ Log: redo #3193 which #3195 undid
+ Branch: maint-5.005/perl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 3197] By: gbarr on 1999/03/28 21:04:04
+ Log: Updated CPAN.pm to 1.48
+ Branch: maint-5.005/perl
+ ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
+____________________________________________________________________________
+[ 3196] By: gbarr on 1999/03/28 17:21:27
+ Log: AIX hints update from Jarkko
+ Branch: maint-5.005/perl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 3195] By: jhi on 1999/03/28 16:42:54
+ Log: Update perlhist on 5_03.
+ Branch: maint-5.005/perl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 3193] By: gsar on 1999/03/28 09:46:29
+ Log: =end needs matching =begin (or installhtml will croak)
+ Branch: maint-5.005/perl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 3192] By: gsar on 1999/03/28 09:10:15
+ Log: update pod/Makefile
+ Branch: maint-5.005/perl
+ ! pod/Makefile
+____________________________________________________________________________
+[ 3191] By: gsar on 1999/03/28 08:43:47
+ Log: integrate change#3180 from mainline
+
+ fix bogus OPf_REF context for the BLOCK in C<grep BLOCK @foo>
+ (sometimes caused bizarreness in the BLOCK)
+ Branch: maint-5.005/perl
+ +> t/op/grep.t
+ !> MANIFEST op.c
+____________________________________________________________________________
+[ 3190] By: gsar on 1999/03/28 08:29:51
+ Log: integrate change#3147 from mainline
+
+ warn about newfangled vfork() caveats
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 3189] By: gsar on 1999/03/28 08:22:00
+ Log: various pod niggles
+ Branch: maint-5.005/perl
+ ! pod/perl.pod pod/perldebug.pod pod/perldiag.pod
+ ! pod/perlfunc.pod pod/perlhist.pod
+____________________________________________________________________________
+[ 3188] By: gsar on 1999/03/28 07:37:43
+ Log: integrate binary compatible variant of change#3098 from mainline
+ Branch: maint-5.005/perl
+ ! op.c perl.h t/base/lex.t toke.c
+____________________________________________________________________________
+[ 3187] By: gsar on 1999/03/28 07:31:16
+ Log: regularize CAPI declarations (CAPI extensions now build under
+ the Borland compiler)
+ Branch: maint-5.005/perl
+ ! win32/GenCAPI.pl
+____________________________________________________________________________
+[ 3186] By: gsar on 1999/03/28 07:26:33
+ Log: ensure XS_LOCKS stuff happens *before* XSUB is entered under
+ -DPERL_CAPI
+ Branch: maint-5.005/perl
+ ! XSlock.h win32/GenCAPI.pl win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 3185] By: gbarr on 1999/03/28 06:37:41
+ Log: integrate change #2846 from mainline
+
+ a modified version of suggested patch for pack template 'Z'; added docs
+ From: "Valeriy E. Ushakov" <uwe@ptc.spbu.ru>
+ Date: Mon, 16 Jun 1997 03:00:31 +0400 (MSD)
+ Message-ID: <%lOHpzIuGV@snark.ptc.spbu.ru>
+ Subject: lack of pack/unpack letter with useful symmetry for C null delimited strings
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod pod/perlfunc.pod pp.c
+ !> t/op/pack.t
+____________________________________________________________________________
+[ 3184] By: gbarr on 1999/03/28 06:35:50
+ Log: integrate change # 3160 from mainline
+
+ better description of OP_UNSTACK (s/unstack/iteration finalizer/)
+ Branch: maint-5.005/perl
+ ! opcode.h opcode.pl
+____________________________________________________________________________
+[ 3182] By: gbarr on 1999/03/28 03:40:28
+ Log: Integrate changes #3067 and #3106 from mainline
+
+ exempt $foo::a,$foo::b from warnings only if sort() was seen in package foo
+ From: Graham Barr <gbarr@ti.com>
+ Date: Wed, 3 Mar 1999 17:23:56 -0600
+ Message-ID: <19990303172356.F7442@dal.asp.ti.com>
+ Subject: Re: 'use strict' doesn't work for one-letter variables
+
+ change#3067 failed package.t due to needless creation of $a and $b;
+ fixed to do that only for C<sort BLOCK|CODE @foo>, not C<sort(@foo)>
+ Branch: maint-5.005/perl
+ ! gv.c op.c t/pragma/warn-1global
+____________________________________________________________________________
+[ 3179] By: gsar on 1999/03/28 02:14:04
+ Log: fix thread segfault when passing large number of arguments to child
+ a la C<Thread->new($foo, 1..1000)>
+ Branch: maint-5.005/perl
+ ! ext/Thread/Thread.xs t/lib/thread.t
+____________________________________________________________________________
+[ 3178] By: gbarr on 1999/03/28 01:39:23
+ Log: fix $Config{'usethreads'} typo in perlthrtut
+
+ From: Ian Maloney <szhmf9@wsblob.ubs.com>
+ Date: Thu, 25 Mar 1999 16:40:14 +0100 (MET)
+ Message-Id: <199903251540.QAA02439@wsblob.>
+ Subject: perlthrtut documentation error
+ Branch: maint-5.005/perl
+ ! pod/perlthrtut.pod
+____________________________________________________________________________
+[ 3177] By: gbarr on 1999/03/28 01:09:59
+ Log: Integrate #2910 from mainline
+
+ slurping an empty file should return '' rather than undef, with
+ commensurate effects on ARGV processing
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod pp_hot.c sv.h
+ !> t/io/argv.t
+____________________________________________________________________________
+[ 3176] By: gbarr on 1999/03/28 00:00:30
+ Log: Integrate relevant doc changes from mainline
+ Branch: maint-5.005/perl
+ !> (integrate 34 files)
+____________________________________________________________________________
+[ 3175] By: gbarr on 1999/03/27 19:20:32
+ Log: Integrated #2352 and #2397 from mainline
+
+ Implement $^C to allow perl access to -c flag - I think this
+ was agreed once...
+
+ Update docs and English.pm for $^C
+ Branch: maint-5.005/perl
+ ! gv.c mg.c
+ !> lib/English.pm
+____________________________________________________________________________
+[ 3174] By: gbarr on 1999/03/27 18:21:01
+ Log: Update Copyright year
+ Branch: maint-5.005/perl
+ ! EXTERN.h INTERN.h README av.c av.h cop.h cv.h deb.c doio.c
+ ! doop.c dump.c form.h gv.c gv.h handy.h hv.c hv.h mg.c mg.h
+ ! op.c op.h perl.h perly.y pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c
+ ! regcomp.c regexec.c run.c scope.c sv.c sv.h toke.c util.c
+ ! util.h
+____________________________________________________________________________
+[ 3173] By: gbarr on 1999/03/27 18:19:47
+ Log: Update Test.pm to VERSION 1.122 from CPAN
+ Branch: maint-5.005/perl
+ ! lib/Test.pm
+____________________________________________________________________________
+[ 3154] By: jhi on 1999/03/24 21:40:51
+ Log: Reword the shared library search path (LD_LIBRARY_PATH) info
+ based on suggestions from Andy Dougherty.
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 3146] By: jhi on 1999/03/24 09:20:14
+ Log: Bring in changes #2808 and #2812 (from mainline perl)
+ that enhance the perlbug checklist.
+ Branch: maint-5.005/perl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 3130] By: jhi on 1999/03/23 22:02:23
+ Log: Don't use config.msg to remind about the
+ LD_LIBRARY_PATH because Makefile.SH takes
+ care of that.
+
+ Use shrplib in DEC O^W^Digital U^W^WTru64 UNIX.
+ This used to be the default but in some MT or another it
+ was dropped because of some transient error or another.
+ Branch: maint-5.005/perl
+ ! Configure hints/dec_osf.sh
+____________________________________________________________________________
+[ 3122] By: jhi on 1999/03/19 21:12:14
+ Log: Describe the new Benchmark feature in more detail.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 3121] By: jhi on 1999/03/19 08:16:12
+ Log: AVAILABILITY tuning.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3119] By: jhi on 1999/03/17 14:33:43
+ Log: More Apollo fixes.
+ Branch: maint-5.005/perl
+ ! README.apollo hints/apollo.sh t/lib/io_udp.t
+____________________________________________________________________________
+[ 3118] By: jhi on 1999/03/16 17:23:39
+ Log: Nada.
+ Branch: maint-5.005/perl
+ ! README.apollo
+____________________________________________________________________________
+[ 3117] By: jhi on 1999/03/16 17:18:49
+ Log: Apollo DomainOS AVAILABILITY.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3116] By: jhi on 1999/03/16 17:14:00
+ Log: Apollo DomainOS patch
+ From: Johann Klasek <jk@auto.tuwien.ac.at>
+ Subject: Re: DomainPerl
+ Date: Tue, 16 Mar 1999 17:46:32 +0100
+ Message-ID: <19990316174632.A19759@euklid.auto.tuwien.ac.at>
+ Branch: maint-5.005/perl
+ + README.apollo apollo/netinet/in.h
+ ! MANIFEST hints/apollo.sh
+____________________________________________________________________________
+[ 3115] By: jhi on 1999/03/16 14:23:54
+ Log: From: Paul Marquess <pmarquess@bfsec.bt.co.uk>
+ To: Gurusamy Sarathy <gsar@activestate.com>,
+ Graham Barr <gbarr@pobox.com>
+ Cc: Perl5 Porters <perl5-porters@perl.org>,
+ "Paul.Marquess" <Paul.Marquess@btinternet.com>
+ Subject: [PATCH 5.005_56 & 5.005_03_T6] Upgrade DB_File to version 1.65
+ Date: Sun, 14 Mar 1999 14:43:57 -0000
+ Message-Id: <199903141841.NAA17040@defender.perl.org>
+ Branch: maint-5.005/perl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap
+____________________________________________________________________________
+[ 3114] By: jhi on 1999/03/16 12:42:20
+ Log: Mention Rhapsody in 5.005_5X perldelta,
+ and in Rhapsody and Netware in 5.005_0X and 5.005_5X
+ *planned* AVAILABILITY.
+ Branch: cfgperl
+ ! pod/perl.pod pod/perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3113] By: jhi on 1999/03/16 10:38:53
+ Log: perldelta niggling.
+ Branch: cfgperl
+ ! pod/perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 3111] By: jhi on 1999/03/16 10:28:10
+ Log: AVAILABILITY update: still mention PowerUX,
+ Novell Netware now has sources available.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3105] By: jhi on 1999/03/12 15:54:57
+ Log: Recognize the NetBSD packages collection.
+ Branch: maint-5.005/perl
+ ! hints/netbsd.sh
+____________________________________________________________________________
+[ 3104] By: jhi on 1999/03/12 09:07:04
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: jhi@iki.fi, perl-mvs@perl.org, perlbug@perl.com
+ Subject: [PATCH MT6,_56] was Re: Not OK: perl 5.00503 +MAINT_TRIAL_6 on os390 06.00 (UNINSTALLED)
+ Date: Thu, 11 Mar 99 14:24:54 PST
+ Message-Id: <9903112224.AA24346@forte.com>
+ Branch: maint-5.005/perl
+ ! README.os390 t/lib/posix.t
+____________________________________________________________________________
+[ 3102] By: jhi on 1999/03/10 11:01:20
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: perl5-porters@perl.org
+ Subject: [5.005_03-MT6]Patch: time passes
+ Date: Tue, 9 Mar 99 18:42:17 PST
+ Message-Id: <9903100242.AA29057@forte.com>
+ Branch: maint-5.005/perl
+ ! perl.c
+____________________________________________________________________________
+[ 3101] By: jhi on 1999/03/10 10:30:15
+ Log: From: Mark-Jason Dominus <mjd@plover.com>
+ To: perl5-porters@perl.com
+ Subject: Minor fix to perlfunc.pod
+ Date: Mon, 08 Mar 1999 20:05:53 -0500
+ Message-ID: <19990309010553.13757.qmail@plover.com>
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 3094] By: jhi on 1999/03/06 16:16:15
+ Log: From: Mark Kettenis <kettenis@wins.uva.nl>
+ To: jhi@iki.fi
+ Subject: Oops
+ Date: Sat, 6 Mar 1999 17:15:35 +0100 (CET)
+ Message-Id: <199903061615.RAA00207@delius.kettenis.nl>
+ Branch: maint-5.005/perl
+ ! README.hurd
+____________________________________________________________________________
+[ 3093] By: jhi on 1999/03/06 15:59:46
+ Log: From: Mark Kettenis <kettenis@wins.uva.nl>
+ To: jhi@iki.fi
+ Subject: New Hurd README
+ Date: Sat, 6 Mar 1999 16:46:12 +0100 (CET)
+ Message-Id: <199903061601.RAA00185@delius.kettenis.nl>
+ Branch: maint-5.005/perl
+ ! README.hurd
+____________________________________________________________________________
+[ 3092] By: jhi on 1999/03/06 12:52:06
+ Log: From: Paul_Green@stratus.com
+ To: perl5-porters@perl.org
+ Cc: jhi@iki.fi, Paul_Green@stratus.com
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_6]: platform: vos -- updates to VOS port of Perl5
+ Date: Fri, 5 Mar 1999 18:08:49 -0500
+ Message-ID: <1D1A4EF7AD4DD211A80D00A0C9D7DB665A035A@exna1.stratus.com>
+ Branch: maint-5.005/perl
+ ! vos/config.h vos/config_h.SH_orig
+____________________________________________________________________________
+[ 3091] By: jhi on 1999/03/06 12:42:21
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_03-MT6]VMS build patch
+ Date: Fri, 05 Mar 1999 12:36:19 -0800
+ Message-Id: <3.0.6.32.19990305123619.02d326a0@ous.edu>
+ Branch: maint-5.005/perl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 3090] By: gsar on 1999/03/06 04:40:03
+ Log: integrate change#3089 from mainline
+
+ tolerate CRs after options
+ Branch: maint-5.005/perl
+ !> perl.c
+____________________________________________________________________________
+[ 3086] By: gbarr on 1999/03/05 01:48:05
+ Log: #3085 was a bit premature, this is MT6 as 2 files were
+ missing from MANIFEST
+ Branch: maint-5.005/perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 3085] By: gbarr on 1999/03/05 01:41:06
+ Log: Trial release 6
+ Branch: maint-5.005/perl
+ ! Changes
+____________________________________________________________________________
+[ 3084] By: gbarr on 1999/03/05 01:34:07
+ Log: Don't process - as a file in Errno_pm.PL
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Thu, 4 Mar 1999 13:29:23 +0200 (EET)
+ Message-ID: <14046.28307.561693.849859@alpha.hut.fi>
+ Subject: Re: maint-5.005
+ Branch: maint-5.005/perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 3081] By: gsar on 1999/03/05 00:14:33
+ Log: protect against doubled backslashes
+ Branch: maint-5.005/perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 3080] By: gsar on 1999/03/04 23:37:20
+ Log: pick up AIX hints from mainline
+ Branch: maint-5.005/perl
+ !> hints/aix.sh
+____________________________________________________________________________
+[ 3079] By: gsar on 1999/03/04 21:09:43
+ Log: tweak cast and crew
+ Branch: maint-5.005/perl
+ ! Changes
+____________________________________________________________________________
+[ 3078] By: gsar on 1999/03/04 21:03:04
+ Log: update patchlevel, Changes
+ Branch: maint-5.005/perl
+ ! Changes README.win32 patchlevel.h
+ !> pod/perlhist.pod
+____________________________________________________________________________
+[ 3075] By: gsar on 1999/03/04 07:36:53
+ Log: integrate changes#3037,3041 from mainline
+
+ fix longstanding bug: searches for lexicals originating within eval''
+ weren't stopping at the subroutine boundary correctly
+ --
+ fix subtle bug in eval'' testsuite
+ Branch: maint-5.005/perl
+ !> op.c proto.h t/op/eval.t
+____________________________________________________________________________
+[ 3074] By: gsar on 1999/03/04 07:32:15
+ Log: integrate change#3048 from mainline
+
+ updated HP-UX notes from Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
+ Branch: maint-5.005/perl
+ !> MANIFEST README.hpux
+____________________________________________________________________________
+[ 3073] By: gsar on 1999/03/04 07:29:43
+ Log: integrate changes#3014,3015,3021,3032,3034,3045 from mainline
+
+ more "correct" utbuf for utime()
+ --
+ avoid modifying readonly values from qw()
+ --
+ ansify perlio.c, fix PerlIO-ish typos
+ --
+ add README.hpux
+ --
+ s/print STDERR/warn/ suggested by abigail@fnx.com; add $VERSION
+ --
+ destroy PL_svref_mutex in perl_destruct()
+ Branch: maint-5.005/perl
+ +> README.hpux
+ !> MANIFEST doio.c ext/DynaLoader/dl_beos.xs
+ !> ext/DynaLoader/dl_cygwin32.xs iperlsys.h
+ !> lib/ExtUtils/MM_Unix.pm lib/Getopt/Std.pm perl.c perlio.c
+____________________________________________________________________________
+[ 3072] By: gsar on 1999/03/04 07:12:15
+ Log: integrate changes#2978,2979 from mainline
+
+ bring '*' prototype closer to how it behaves internally
+ --
+ doc for change#2978
+ Branch: maint-5.005/perl
+ +> t/lib/fatal.t
+ !> MANIFEST lib/Fatal.pm op.c pod/perlsub.pod t/comp/proto.t
+____________________________________________________________________________
+[ 3071] By: gsar on 1999/03/04 07:05:50
+ Log: integrate changes#2919,2920,2921,2928,2932,2933 from mainline
+
+ applied suggested patch, with several language/readability tweaks
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 29 Jan 1999 00:25:02 -0500
+ Message-ID: <19990129002502.C2898@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.005_*] Better parsing docs
+ --
+ tweak READ() docs to mention $buffer must be altered by reference
+ --
+ use New() et al., rather than safemalloc() et al.
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 29 Jan 1999 23:27:22 +0100
+ Message-ID: <36bd33f2.51029616@smtp1.ibm.net>
+ Subject: [PATCH _03-MT5] POSIX.xs memory API
+ --
+ allow the Carp routines to pass through exception objects
+ --
+ clarify what a "line" is
+ --
+ From: "J. van Krieken" <John.van.Krieken@ATComputing.nl>
+ Date: Thu, 4 Feb 1999 17:25:25 +0100 (MET)
+ Message-Id: <199902041625.RAA14489@atcmpg.ATComputing.nl>
+ Subject: s2p incorrectly handles hold space commands
+ Branch: maint-5.005/perl
+ !> ext/POSIX/POSIX.xs lib/Carp.pm pod/perlfunc.pod pod/perlop.pod
+ !> pod/perltie.pod pod/perlvar.pod x2p/s2p.PL
+____________________________________________________________________________
+[ 3070] By: gsar on 1999/03/04 06:43:57
+ Log: integrate changes#2748,2753,2754,2819,2824,2855,2866,2867,2869,2885,2888,2889
+ from mainline
+
+ From: "Jonathan I. Kamens" <jik@kamens.brookline.ma.us>
+ Date: Thu, 3 Dec 1998 15:10:17 -0500
+ Message-Id: <199812032010.PAA09692@jik.shore.net>
+ Subject: sample checksum code in "perlfunc" man page is wrong
+ --
+ Todo tweaks
+ --
+ Todo updates from Andy Dougherty <doughera@lafayette.edu>
+ --
+ avoid garbage in db->dirbuf
+ From: Masahiro KAJIURA <masahiro.kajiura@toshiba.co.jp>
+ Date: Sat, 05 Dec 1998 14:14:54 +0900
+ Message-Id: <199812050514.OAA23268@toshiba.co.jp>
+ Subject: SDBM bug
+ --
+ tweak doc on bitwise ops
+ --
+ applied suggested patch; added tests
+ From: Adam Krolnik <adamk@gypsy.cyrix.com>
+ Date: Sat, 12 Dec 98 15:30:18 -0600
+ Message-Id: <9812122130.AA03717@gypsy.eng.cyrix.com>
+ Subject: Range operation doesn't handle IV_MAX
+ --
+ display full pathname of unreadable files
+ --
+ av_extend() doc tweak from Jan Dubois
+ --
+ update win32/pod.mak
+ --
+ note how to find REG_INFTY limit
+ --
+ add note about test-notty target
+ --
+ tweak PERL_STRICT_CR notes
+ Branch: maint-5.005/perl
+ !> Porting/pumpkin.pod README.win32 Todo Todo-5.005
+ !> ext/SDBM_File/sdbm/sdbm.c pod/perldelta.pod pod/perlfunc.pod
+ !> pod/perlguts.pod pod/perlop.pod pod/perlre.pod pp_ctl.c
+ !> t/op/range.t utils/perldoc.PL win32/pod.mak
+____________________________________________________________________________
+[ 3069] By: gsar on 1999/03/04 06:02:29
+ Log: integrate change#2747 from mainline
+
+ typos in Pod/Text.pm
+ Branch: maint-5.005/perl
+ !> lib/Pod/Text.pm
+____________________________________________________________________________
+[ 3059] By: jhi on 1999/03/03 22:46:43
+ Log: Document HP-UX 11 Y2K patch effect, based on
+
+ From: "Richard L. England" <richard_england@mentorg.com>
+ To: perlbug@perl.com
+ CC: "England, Richard" <richard_england@mentorg.com>
+ Subject: test io/fs.t number 18 fails on HPUX 11.0 when Y2K patch installed.
+ Date: Fri, 26 Feb 1999 15:35:49 -0800
+ Message-ID: <36D72FD4.4136C84F@mentorg.com>
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 3057] By: jhi on 1999/03/03 21:42:22
+ Log: The *symbols patch (for Kurt's h2ph fixes) haunted us in AIX.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 3056] By: jhi on 1999/03/03 21:21:46
+ Log: Fixed the pthreads_created_joinable test messed up
+ by the Mach cthreads change.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 3055] By: jhi on 1999/03/03 18:17:55
+ Log: Configure and make gotchas.
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 3051] By: jhi on 1999/03/02 08:24:52
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_0x and 5.005_5x]Minor update to README.VMS
+ Date: Mon, 01 Mar 1999 16:10:57 -0800
+ Message-Id: <3.0.6.32.19990301161057.03b1fc00@ous.edu>
+ Branch: cfgperl
+ ! README.vms
+ Branch: maint-5.005/perl
+ ! README.vms
+____________________________________________________________________________
+[ 3049] By: jhi on 1999/03/02 07:34:21
+ Log: From: Spider Boardman <spider@leggy.zk3.dec.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH] Eliminate (valid) warning in byterun.c
+ Date: Mon, 01 Mar 1999 17:27:59 -0500
+ Message-Id: <199903012227.RAA00181@leggy.zk3.dec.com>
+ Branch: cfgperl
+ ! bytecode.h
+ Branch: maint-5.005/perl
+ ! bytecode.h
+____________________________________________________________________________
+[ 3028] By: jhi on 1999/02/26 14:40:00
+ Log: HP-UX 11 threads.
+
+ From: Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
+ To: perl5-porters@perl.org
+ Cc: jhi@cc.hut.fi
+ Subject: Maint 5 and _54 with threading on HP-UX 11.00
+ Date: Wed, 3 Feb 1999 12:57:18 -0800 (PST)
+ Message-Id: <199902032057.MAA10218@xfiles.intercon.hp.com>
+
+ NOTE from jhi: the hpux hints could still be more robust by
+ disabling gdbm when necessary.
+
+ Currently if there's a libgdbm.sl (gdbm 1.7.3) which is pre-11,
+ linking -lgdbm -lpthread creates an executable that instantly
+ core dumps on a pthreads internal panic:
+
+ ./gdpt
+
+ Pthread internal error: message: __libc_reinit() failed, file: ../pthreads/pthread.c, line: 1096
+ Return Pointer is 0xc082bf33
+ 17639 quit (core dumped) ./gdpt
+
+ You don't have to *use* either gdbm or pthreads in the executable,
+ just linking them together is enough. Workaround is to recompile
+ the GDBM under HP-UX 11, that makes the problem to go away.
+ Branch: maint-5.005/perl
+ ! hints/hpux.sh thread.h
+____________________________________________________________________________
+[ 3027] By: jhi on 1999/02/26 09:04:29
+ Log: From: abigail@fnx.com
+ To: perl5-porters@perl.org (Perl Porters)
+ Subject: [PATCH 5.005_02 Getopt::Std] warn() instead of print STDERR.
+ Date: Thu, 25 Feb 1999 22:08:41 -0500 (EST)
+ Message-ID: <19990226030841.5985.qmail@alexandra.wayne.fnx.com>
+ Branch: maint-5.005/perl
+ ! lib/Getopt/Std.pm
+____________________________________________________________________________
+[ 3026] By: jhi on 1999/02/26 08:18:26
+ Log: full_ar wasn't propagated.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 3013] By: jhi on 1999/02/22 19:27:44
+ Log: Fix MacPerl version, change PowerUX to PowerMAX.
+
+ From: Chris Nandor <pudge@pobox.com>
+ To: jhi@iki.fi
+ Cc: perl5-porters@perl.org
+ Subject: Re: perl current availability as documented by perl.pod
+ Date: Sun, 21 Feb 1999 11:06:03 -0500
+ Message-Id: <v04020a07b2f5df60c9e3@[192.168.0.77]>
+
+ From: Tom Horsley <Tom.Horsley@mail.ccur.com>
+ To: jhi@iki.fi
+ Cc: perl5-porters@perl.org
+ Subject: Re: perl current availability as documented by perl.pod
+ Date: Mon, 22 Feb 1999 13:08:30 GMT
+ Message-Id: <199902221308.NAA19971@cleo.ccur.com>
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3010] By: jhi on 1999/02/22 10:21:55
+ Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ To: gbarr@pobox.com (Graham Barr)
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.005_03-MT5] DB_File 1.64 patch
+ Date: Mon, 22 Feb 1999 10:12:34 +0000 (GMT)
+ Message-Id: <9902221012.AA17784@claudius.bfsec.bt.co.uk>
+ Branch: maint-5.005/perl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap t/lib/db-recno.t
+____________________________________________________________________________
+[ 3005] By: jhi on 1999/02/22 08:35:30
+ Log: Configure/Perl knew how to look for use Mach cthreads
+ but Configure didn't let them to be used ($osname 'next').
+ Branch: cfgperl
+ ! Configure config_h.SH
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 3004] By: jhi on 1999/02/21 15:46:02
+ Log: Update Acorn AVAILABILITY.
+ Branch: cfgperl
+ ! pod/perl.pod
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 3003] By: jhi on 1999/02/21 14:50:42
+ Log: From: rjk@linguist.dartmouth.edu (Ronald J. Kimball)
+ To: perl5-porters@perl.org (Perl 5 Porters)
+ Subject: PATCH: perlref.pod - symbolic ref example
+ Date: Sat, 20 Feb 1999 17:32:11 -0500 (EST)
+ Message-Id: <199902202232.RAA62306@linguist.dartmouth.edu>
+ Branch: cfgperl
+ ! pod/perlref.pod
+ Branch: maint-5.005/perl
+ ! pod/perlref.pod
+____________________________________________________________________________
+[ 3000] By: jhi on 1999/02/21 14:15:31
+ Log: pack s/l for negative numbers was broken on platforms
+ where sizeof(short) != 2 or sizeof(long) != 4 (Alpha, Cray).
+ pack v was broken for sizeof(short) == 8 big-endian platforms
+ (Cray), only zeros were produced.
+ Branch: maint-5.005/perl
+ ! perl.h pod/perlfunc.pod pp.c t/op/pack.t
+____________________________________________________________________________
+[ 2997] By: jhi on 1999/02/20 14:00:26
+ Log: Glossary update.
+ Branch: maint-5.005/perl
+ ! Porting/Glossary
+____________________________________________________________________________
+[ 2995] By: jhi on 1999/02/20 12:25:10
+ Log: Document #2893, Mach cthreads support.
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 2986] By: jhi on 1999/02/19 23:26:34
+ Log: Remove the unnecessary osf1 -D__LANGUAGE_C__.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2983] By: jhi on 1999/02/19 20:35:51
+ Log: Mach cthreads:
+ From: brie@corp.home.net (Brian Harrison)
+ Subject: perl5.005_02 patch for mthreads
+ To: perl5-porters@perl.org
+ Date: Fri, 23 Oct 1998 14:20:57 -0700 (PDT)
+ Message-ID: <Pine.GSO.4.04.9810231410220.11111-200000@sulaco.eos.home.net>
+ Branch: maint-5.005/perl
+ ! Configure Porting/Glossary config_h.SH malloc.c perl.h
+ ! thread.h
+____________________________________________________________________________
+[ 2981] By: jhi on 1999/02/19 19:49:03
+ Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Chaim Frenkel <chaimf@pobox.com>,
+ Russ Allbery <rra@stanford.edu>,
+ Jarkko Hietaniemi <jhi@iki.fi>,
+ Gurusamy Sarathy <gsar@activestate.com>,
+ Graham Barr <gbarr@pobox.com>
+ Cc: bdensch@ameritech.net, perlbug@perl.com
+ Subject: [PATCH] Re: Solaris 7 for Intel
+ Message-ID: <19990219124404.A30182@O2.chapin.edu>
+
+ and Glossary update.
+ Branch: maint-5.005/perl
+ ! Configure Makefile.SH Porting/Glossary
+____________________________________________________________________________
+[ 2980] By: gbarr on 1999/02/19 16:06:53
+ Log: Make result of h2xs work when user adds C<use strict>
+ Branch: maint-5.005/perl
+ ! utils/h2xs.PL
+____________________________________________________________________________
+[ 2976] By: gsar on 1999/02/18 21:54:09
+ Log: integrate change#2975 from mainline
+
+ distinguish eval'' from BEGIN|INIT|END CVs (fixes buggy propagation
+ of lexical searches in BEGIN|INIT|END)
+ Branch: maint-5.005/perl
+ !> cop.h cv.h op.c perly.c perly.y pp_ctl.c t/op/misc.t
+ !> vms/perly_c.vms
+____________________________________________________________________________
+[ 2971] By: jhi on 1999/02/18 11:14:24
+ Log: AIX syscalls.exp scan missed explicitly 32/64-bit syscalls.
+
+ From: Joe Buehler <jhpb@hekimian.com>
+ To: perl5-porters@perl.org
+ Subject: setsid not detected by perl 5.005_02 configure under AIX 4.3
+ Date: 12 Feb 1999 11:25:21 -0500
+ Message-ID: <yd3lni3613i.fsf@ganymede.hekimian.com>
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2967] By: jhi on 1999/02/17 23:12:59
+ Log: Make SCO/Unixware scan to work in Unixware, too.
+
+ From: Tom Hughes <thh@cyberscience.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00555 on i386-svr4 [actually Unixware 2.1] (UNINSTALLED)
+ Date: 17 Feb 1999 15:34:15 +0000
+ Message-ID: <yekg185nix4.fsf@elva.cyberscience.com>
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2956] By: jhi on 1999/02/15 21:03:28
+ Log: OpenBSD sparc SHMLBA (like change #2945).
+ Branch: maint-5.005/perl
+ ! ext/IPC/SysV/SysV.xs
+____________________________________________________________________________
+[ 2950] By: jhi on 1999/02/15 13:37:28
+ Log: AVAILABILITY sync.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2906] By: jhi on 1999/02/13 14:55:47
+ Log: AVAILABILITY sync.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2905] By: gsar on 1999/02/13 00:12:53
+ Log: integrate change#2898 from mainline
+
+ support win32_putenv()
+ Branch: maint-5.005/perl
+ !> mg.c util.c win32/GenCAPI.pl win32/makedef.pl win32/perlhost.h
+ !> win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 2904] By: jhi on 1999/02/12 21:23:30
+ Log: Add README.hurd, from Mark Kettenis <kettenis@wins.uva.nl>.
+ Branch: maint-5.005/perl
+ + README.hurd
+ ! MANIFEST
+____________________________________________________________________________
+[ 2900] By: jhi on 1999/02/12 12:07:28
+ Log: SCO ODT/OSR release scanning.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2897] By: jhi on 1999/02/12 11:24:25
+ Log: Undo a big bad paste from change #2884.
+ Branch: maint-5.005/perl
+ ! hints/openbsd.sh
+____________________________________________________________________________
+[ 2896] By: jhi on 1999/02/12 11:19:52
+ Log: Update the error message of db-recno.t to DB version 1.86
+ and the URL to www.sleepycat.com instead of www.bostic.com.
+ Branch: maint-5.005/perl
+ ! t/lib/db-recno.t
+____________________________________________________________________________
+[ 2895] By: gsar on 1999/02/12 11:18:59
+ Log: integrate change#2854 from mainline
+
+ compatibility fix: magic non-propagation in foreach implicit localization
+ Branch: maint-5.005/perl
+ !> pp_ctl.c t/op/local.t
+____________________________________________________________________________
+[ 2884] By: jhi on 1999/02/12 08:36:14
+ Log: OpenBSD pthreads awareness, thanks to
+ David Leonard <david.leonard@csee.uq.edu.au>
+ Branch: maint-5.005/perl
+ ! Configure hints/openbsd.sh
+____________________________________________________________________________
+[ 2883] By: jhi on 1999/02/12 08:29:51
+ Log: AVAILABILITY sync.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2878] By: jhi on 1999/02/11 22:00:50
+ Log: Replace changes #2783, #2784, #2785, with a single tested
+ patch from Francois Desarmenien <desar@club-internet.fr>.
+ Branch: maint-5.005/perl
+ ! MANIFEST ext/GDBM_File/hints/sco.pl ext/IPC/SysV/SysV.xs
+ ! hints/sco.sh
+____________________________________________________________________________
+[ 2876] By: jhi on 1999/02/11 20:43:17
+ Log: From: Chris Nandor <pudge@pobox.com>
+ To: perl5-porters@perl.org
+ Subject: [PATCH] perlport.pod 1.39
+ Date: Thu, 11 Feb 1999 12:28:35 -0500
+ Message-Id: <v04020a2db2e8c3177123@[192.168.0.77]>
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 2875] By: jhi on 1999/02/11 20:35:08
+ Log: The fpsetmask() really is SCO5 only.
+ Branch: maint-5.005/perl
+ ! unixish.h
+____________________________________________________________________________
+[ 2874] By: jhi on 1999/02/11 20:32:06
+ Log: Change #2783 missed these.
+ Branch: maint-5.005/perl
+ ! ext/IPC/SysV/SysV.xs unixish.h
+____________________________________________________________________________
+[ 2873] By: jhi on 1999/02/11 20:27:45
+ Log: Import the change #2810 from cfgperl.
+ Branch: maint-5.005/perl
+ + ext/GDBM_File/hints/sco.pl
+ ! MANIFEST hints/sco.sh unixish.h
+____________________________________________________________________________
+[ 2872] By: jhi on 1999/02/11 19:57:37
+ Log: Sync the current AVAILABILITY.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod pod/perldelta.pod
+____________________________________________________________________________
+[ 2871] By: jhi on 1999/02/11 19:42:54
+ Log: Copied the GNU/Hurd hints file over from cfgperl
+ because it works well enough (there are still some
+ rough edges in Hurd), verified via private
+ email from Mark Kettenis <kettenis@wins.uva.nl>
+ Branch: maint-5.005/perl
+ + hints/gnu.sh
+____________________________________________________________________________
+[ 2864] By: jhi on 1999/02/11 08:45:00
+ Log: From: Spider Boardman <spider@zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on RISC-ultrix 4.4 (UNINSTALLED)
+ Date: Wed, 10 Feb 1999 23:33:31 -0500
+ Message-Id: <9902110433.AA12816@abyss.zk3.dec.com>
+ Branch: maint-5.005/perl
+ ! doio.c ext/IPC/SysV/SysV.xs hints/ultrix_4.sh
+____________________________________________________________________________
+[ 2863] By: jhi on 1999/02/11 08:35:35
+ Log: AVAILABILITY.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2858] By: gsar on 1999/02/11 07:10:59
+ Log: remove dup hunk
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 2857] By: gsar on 1999/02/11 07:09:20
+ Log: sync with parent version of perldelta.pod
+ Branch: maint-5.005/perl
+ !> pod/perldelta.pod
+____________________________________________________________________________
+[ 2853] By: gsar on 1999/02/11 00:33:06
+ Log: integrate change#2816 from mainline
+
+ minor bug in dumping blessed subrefs
+ Branch: maint-5.005/perl
+ !> ext/Data/Dumper/Dumper.pm
+____________________________________________________________________________
+[ 2852] By: gsar on 1999/02/10 23:17:49
+ Log: fair warning about -Dusethreads
+ Branch: maint-5.005/perl
+ ! Configure INSTALL README.threads
+____________________________________________________________________________
+[ 2851] By: jhi on 1999/02/10 23:00:39
+ Log: Snapshot of the ongoing AVAILABILITY discussion.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2850] By: jhi on 1999/02/10 16:07:32
+ Log: OS390 and Windows AVAILABILITY entries enhanced.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2849] By: jhi on 1999/02/10 12:39:46
+ Log: AS/400 and Mac were not described right.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2848] By: jhi on 1999/02/10 09:13:49
+ Log: Added AVAILABILITY section.
+ Branch: maint-5.005/perl
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 2837] By: jhi on 1999/02/08 14:51:39
+ Log: Fix typo introduced in change #2836.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2836] By: jhi on 1999/02/08 14:44:31
+ Log: Augment change #2809, the h2ph-*symbols patch.
+ Branch: maint-5.005/perl
+ ! Configure t/lib/h2ph.pht
+____________________________________________________________________________
+[ 2815] By: gsar on 1999/02/05 03:44:50
+ Log: integrate change#2242 from mainline
+
+ fix skipspace() to properly account for newlines in eval''-ed
+ strings (caused bogus line numbers in diagnostics and debugger)
+ Branch: maint-5.005/perl
+ !> toke.c
+____________________________________________________________________________
+[ 2814] By: jhi on 1999/02/04 21:21:39
+ Log: Stratus perlport update.
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 2813] By: jhi on 1999/02/04 21:16:54
+ Log: Stratus VOS update.
+
+ From: Paul_Green@stratus.com
+ To: jhi@iki.fi
+ Subject: RE: VOS changes for Perl5.005_03 are ready!
+ Date: Thu, 4 Feb 1999 14:51:07 -0500
+ Message-ID: <1D1A4EF7AD4DD211A80D00A0C9D7DB665A0168@exna1.stratus.com>
+ Branch: maint-5.005/perl
+ + vos/vos_accept.c
+ ! MANIFEST README.vos perl.c pod/perlport.pod vos/Changes
+ ! vos/build.cm vos/compile_perl.cm vos/config.h
+ ! vos/config_h.SH_orig vos/perl.bind vos/test_vos_dummies.c
+ ! vos/vos_dummies.c vos/vosish.h
+____________________________________________________________________________
+[ 2809] By: jhi on 1999/02/03 19:54:16
+ Log: h2ph fixes + Configure patch to support them.
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ To: Graham Barr <gbarr@pobox.com>, Jarkko Hietaniemi <jhi@iki.fi>,
+ Gurusamy Sarathy <gsar@engin.umich.edu>
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH 5.00503_MT5] h2ph.PL
+ Date: Tue, 2 Feb 1999 19:48:06 -0500
+ Message-ID: <19990202194806.E10647@O2.chapin.edu>
+ Branch: maint-5.005/perl
+ ! Configure utils/h2ph.PL
+____________________________________________________________________________
+[ 2802] By: jhi on 1999/02/02 17:41:23
+ Log: From: John Bley <jbb6@acpub.duke.edu>
+ To: perlbug@perl.org
+ Subject: [PATCH]5.005_54 (DOC) fix minor typos
+ Date: Tue, 2 Feb 1999 07:52:52 -0500 (EST)
+ Message-ID: <Pine.SOL.3.91.990202075115.23589A-100000@soc11.acpub.duke.edu>
+ Branch: maint-5.005/perl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 2790] By: jhi on 1999/02/02 16:51:45
+ Log: Re-introduce the typo corrections (update to CGI 2.46
+ overran them).
+ Branch: maint-5.005/perl
+ ! lib/CGI.pm
+____________________________________________________________________________
+[ 2781] By: jhi on 1999/02/02 14:27:01
+ Log: Update the MkLinux note.
+ Branch: maint-5.005/perl
+ ! hints/linux.sh
+____________________________________________________________________________
+[ 2775] By: jhi on 1999/02/02 13:13:24
+ Log: Mention lib/Dumpvalue.pm.
+ Branch: maint-5.005/perl
+ ! pod/roffitall
+____________________________________________________________________________
+[ 2767] By: jhi on 1999/02/02 12:29:57
+ Log: Demangle spaces to tab+space.
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2758] By: jhi on 1999/02/02 10:51:26
+ Log: Detypo.
+ Branch: maint-5.005/perl
+ ! lib/Math/Trig.pm
+____________________________________________________________________________
+[ 2755] By: jhi on 1999/02/02 09:07:51
+ Log: Make FreeBSD 2.2.7 work with -Duseshrplib -ders.
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2752] By: jhi on 1999/02/01 22:15:12
+ Log: Add perlthrtut.pod.
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org
+ Subject: perlthrtut.pod
+ Date: Mon, 01 Feb 1999 10:57:11 -0800
+ Message-Id: <3.0.6.32.19990201105711.02e62540@ous.edu>
+ Branch: maint-5.005/perl
+ + pod/perlthrtut.pod
+ ! MANIFEST pod/Makefile pod/buildtoc pod/perldelta.pod
+ ! pod/roffitall
+____________________________________________________________________________
+[ 2741] By: gbarr on 1999/02/01 03:00:42
+ Log: Fix typecasts in #2728
+
+ From: "G. Del Merritt" <del@intranetics.com>
+ Date: Fri, 29 Jan 1999 11:47:25 -0700
+ Message-Id: <199901291847.LAA04828@jhereg.perl.com>
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on MSWin32-x86-object 4.0 (PATCH included)
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2740] By: gsar on 1999/02/01 02:43:07
+ Log: CAPI inheritance tweak and doc
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2739] By: jhi on 1999/01/31 18:31:54
+ Log: Undo changes #2730 and #2731 and replace them
+ with an extensively tested patch from
+ Anton Berezin <tobez@plab.ku.dk> (via private email).
+ Branch: maint-5.005/perl
+ ! Makefile.SH hints/freebsd.sh
+____________________________________________________________________________
+[ 2738] By: gsar on 1999/01/31 05:04:32
+ Log: fix bogus CAPI inheritance from change#2541
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2737] By: gsar on 1999/01/31 04:55:06
+ Log: remove the big ugly thing jhi sneezed into INSTALL :-)
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 2736] By: jhi on 1999/01/30 12:57:06
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ To: perl-mvs@perl.org, perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_5 on os390 05.00 (UNINSTALLED)
+ Date: Fri, 29 Jan 99 19:22:31 PST
+ Message-Id: <9901300322.AA19136@forte.com>
+
+ (slighty edited at the end)
+ Branch: maint-5.005/perl
+ ! README.os390
+____________________________________________________________________________
+[ 2735] By: jhi on 1999/01/30 11:49:54
+ Log: Undo 5.005-devel random, srandom mention.
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 2734] By: jhi on 1999/01/29 22:22:00
+ Log: Add perlreftut.
+ Branch: maint-5.005/perl
+ + pod/perlreftut.pod
+ ! MANIFEST pod/perl.pod pod/perldelta.pod pod/roffitall
+____________________________________________________________________________
+[ 2732] By: gsar on 1999/01/29 20:09:44
+ Log: integrate change#2720 from mainline
+
+ missing space while munging CCFLAGS for PERL_CAPI
+ Branch: maint-5.005/perl
+ !> lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 2731] By: jhi on 1999/01/29 14:33:12
+ Log: FreeBSD version numbers can be like "2.2.8-release".
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2730] By: jhi on 1999/01/29 12:40:38
+ Log: FreeBSD hints iteration (hopefully convergent).
+ usethreads: require at least FreeBSD 2.2.8.
+ signal type: mirror change #2429 in cfgperl.
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2729] By: gbarr on 1999/01/29 05:06:32
+ Log: Trial release 5
+ Branch: maint-5.005/perl
+ ! Changes patchlevel.h pod/perlhist.pod
+____________________________________________________________________________
+[ 2728] By: gbarr on 1999/01/29 04:10:37
+ Log: From: Ted Law <tedlaw@cibcwg.com>
+ Date: Wed, 27 Jan 1999 14:54:03 -0500 (EST)
+ Message-Id: <199901271954.OAA07391@dcm2.cibcwg.com>
+ Subject: POSIX::strftime buffer overflow problem
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2728] By: gbarr on 1999/01/29 04:10:37
+ Log: From: Ted Law <tedlaw@cibcwg.com>
+ Date: Wed, 27 Jan 1999 14:54:03 -0500 (EST)
+ Message-Id: <199901271954.OAA07391@dcm2.cibcwg.com>
+ Subject: POSIX::strftime buffer overflow problem
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2727] By: gbarr on 1999/01/29 04:09:57
+ Log: From: Tom Spindler <dogcow@isi.net>
+ Date: Thu, 28 Jan 1999 17:15:11 -0800
+ Message-ID: <19990128171510.A11778@isi.net>
+ Subject: [PATCH] BeOS dynamic loading support for perl5.005_03_MT4
+ Branch: maint-5.005/perl
+ + ext/DynaLoader/dl_beos.xs
+ ! Configure MANIFEST Makefile.SH README.beos hints/beos.sh
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 2726] By: gbarr on 1999/01/29 03:30:51
+ Log: Remove use of File::Slurp in t/lib/textfill.t
+ Branch: maint-5.005/perl
+ ! t/lib/textfill.t
+____________________________________________________________________________
+[ 2725] By: gbarr on 1999/01/29 03:11:41
+ Log: From: Gurusamy Sarathy <gsar@ActiveState.com>
+ Date: Wed, 27 Jan 1999 23:14:33 -0800
+ Message-Id: <199901280714.XAA10176@activestate.com>
+ Subject: Re: NOT OK: "@INC contains: ." after make install - MAINT_TRIAL_4 - 5.005_03 maintenance trial 4 MSWin32-x86-object
+ Branch: maint-5.005/perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2724] By: jhi on 1999/01/28 19:27:15
+ Log: Change jhi@iki.fi to perlbug@perl.com.
+ Cosmetic change in semctl probing messages.
+ Branch: maint-5.005/perl
+ ! Configure hints/freebsd.sh
+____________________________________________________________________________
+[ 2723] By: jhi on 1999/01/28 17:27:49
+ Log: Yet another typo in a test program.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2722] By: jhi on 1999/01/28 17:13:52
+ Log: The pthreads_created_joinable test had a typo,
+ by blind luck the default value works almost anywhere.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2721] By: jhi on 1999/01/28 13:04:23
+ Log: MinT support, adapted from change #2594.
+ Branch: maint-5.005/perl
+ + README.mint ext/POSIX/hints/mint.pl hints/mint.sh
+ + mint/Makefile mint/README mint/errno.h mint/pwd.c mint/stdio.h
+ + mint/sys/time.h mint/time.h
+ ! MANIFEST doio.c malloc.c miniperlmain.c perl.c
+ ! pod/perldelta.pod t/io/fs.t t/lib/safe2.t t/op/groups.t
+ ! t/op/mkdir.t t/op/taint.t
+____________________________________________________________________________
+[ 2719] By: jhi on 1999/01/27 19:49:49
+ Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ To: perl5-porters@perl.org
+ Subject: Re: [PATCH] perl5.005_03-MAINT_TRIAL_3: clarify Sv[INU]V versus Sv[INU]VX in perlguts
+ Date: Tue, 26 Jan 1999 22:25:07 +0000
+ Message-Id: <E105Gux-0000Ac-00@taurus.cus.cam.ac.uk>
+ Branch: maint-5.005/perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 2718] By: jhi on 1999/01/27 19:46:04
+ Log: io/fs.t fails test #18 (sense of tests appears to have been
+ changed incompletely; this patch just skips the test attached,
+ a la test #17 preceding it).
+
+ From: "G. Del Merritt" <del@intranetics.com>
+ To: perlbug@perl.com
+ Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included)
+ Date: Tue, 26 Jan 1999 12:09:09 -0700
+ Message-Id: <199901261909.MAA25525@jhereg.perl.com>
+ Branch: maint-5.005/perl
+ ! t/io/fs.t
+____________________________________________________________________________
+[ 2717] By: jhi on 1999/01/27 19:44:46
+ Log: Miniperl fails to build (pp_sys.c was changed and iperlsys.h wasn't)
+
+ From: "G. Del Merritt" <del@intranetics.com>
+ To: perlbug@perl.com
+ Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on MSWin32-x86-object (PATCHES included)
+ Date: Tue, 26 Jan 1999 12:09:09 -0700
+ Message-Id: <199901261909.MAA25525@jhereg.perl.com>
+ Branch: maint-5.005/perl
+ ! iperlsys.h
+____________________________________________________________________________
+[ 2716] By: jhi on 1999/01/27 19:38:36
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perlbug@perl.com, vmsperl@perl.org
+ Subject: NOT OK: perl 5.00503 +MAINT_TRIAL_4 on VMSAXP (Patch included, of course)
+ Date: Tue, 26 Jan 1999 14:40:38 -0800
+ Message-Id: <3.0.6.32.19990126144038.02e5d650@ous.edu>
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ To: perl5-porters@perl.org, vmsperl@perl.org
+ Subject: [PATCH 5.005_03-MAILT_TRIAL_4]VMS test patches
+ Date: Tue, 26 Jan 1999 14:55:29 -0800
+ Message-Id: <3.0.6.32.19990126145529.02f22280@ous.edu>
+ Branch: maint-5.005/perl
+ ! t/lib/textfill.t t/lib/textwrap.t vms/ext/Stdio/test.pl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 2715] By: jhi on 1999/01/27 19:34:28
+ Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
+ To: perl5-porters@perl.org
+ Subject: [PATCH perl5.005_03-MAINT_TRIAL_4] MPE port tweaks
+ Date: Tue, 26 Jan 1999 16:32:18 -0800 (PST)
+ Message-Id: <199901270032.QAA13395@spock.dis.cccd.edu>
+ Branch: maint-5.005/perl
+ ! hints/mpeix.sh mpeix/relink
+____________________________________________________________________________
+[ 2714] By: jhi on 1999/01/27 19:32:41
+ Log: NetBSD does not do setruid, setrgid.
+ Branch: maint-5.005/perl
+ ! hints/netbsd.sh
+____________________________________________________________________________
+[ 2713] By: jhi on 1999/01/27 19:28:53
+ Log: FreeBSD usethreads, based on private email with
+ Anton Berezin <tobez@plab.ku.dk>.
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2712] By: jhi on 1999/01/27 19:26:17
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ To: Mailing list Perl5 <perl5-porters@perl.org>
+ Subject: [PATCH 5.005_*] OS/2 threads
+ Date: Tue, 26 Jan 1999 13:39:46 -0500
+ Message-ID: <19990126133946.A11594@monk.mps.ohio-state.edu>
+ Branch: maint-5.005/perl
+ ! os2/os2ish.h
+____________________________________________________________________________
+[ 2711] By: jhi on 1999/01/27 19:24:28
+ Log: "make ok", "make okfile", and "make nok" were broken
+ with -Duseshrplib, because of a shared typo.
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 12:27:15 -0500
+ Message-Id: <199901271727.MAA233455@web.zk3.dec.com>
+ Branch: maint-5.005/perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 2710] By: jhi on 1999/01/27 19:22:23
+ Log: Errno fixes:
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 12:27:15 -0500
+ Message-Id: <199901271727.MAA233455@web.zk3.dec.com>
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: perlbug@perl.com
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 13:31:16 -0500
+ Message-Id: <199901271831.NAA241001@web.zk3.dec.com>
+ Branch: maint-5.005/perl
+ ! Configure ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 2709] By: jhi on 1999/01/27 19:17:35
+ Log: Fix Configure installusrbinperl:
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ To: jhi@iki.fi
+ cc: perl5-porters@perl.org
+ Subject: Re: Not OK: perl 5.00503 +MAINT_TRIAL_4 on alpha-dec_osf-thread 5.0 (UNINSTALLED)
+ Date: Wed, 27 Jan 1999 13:03:35 -0500
+ Message-Id: <199901271803.NAA238257@web.zk3.dec.com>
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2708] By: gbarr on 1999/01/26 04:14:42
+ Log: Trial release 4
+ Branch: maint-5.005/perl
+ ! Changes patchlevel.h pod/perlhist.pod
+____________________________________________________________________________
+[ 2707] By: gbarr on 1999/01/26 02:06:17
+ Log: Add redef IO::Handle::* for setv?buf()
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.pm
+____________________________________________________________________________
+[ 2706] By: jhi on 1999/01/24 22:26:12
+ Log: Better AIX libc nm scan.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2703] By: jhi on 1999/01/24 14:26:18
+ Log: Minor Configure adjustments.
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2702] By: jhi on 1999/01/24 13:57:33
+ Log: Use usethreads.cbu consistently.
+ Branch: maint-5.005/perl
+ ! Configure hints/aix.sh hints/dec_osf.sh hints/dos_djgpp.sh
+ ! hints/freebsd.sh hints/hpux.sh hints/irix_4.sh hints/irix_5.sh
+ ! hints/irix_6.sh hints/irix_6_0.sh hints/irix_6_1.sh
+ ! hints/linux.sh hints/os2.sh hints/solaris_2.sh
+____________________________________________________________________________
+[ 2701] By: jhi on 1999/01/24 13:55:43
+ Log: Mention year-1900 and month 0..11 also here.
+ Branch: maint-5.005/perl
+ ! lib/Time/Local.pm
+____________________________________________________________________________
+[ 2700] By: jhi on 1999/01/24 13:52:36
+ Log: Document Configure -Uinstallusrbinperl.
+ Branch: maint-5.005/perl
+ ! INSTALL pod/perldelta.pod
+____________________________________________________________________________
+[ 2699] By: jhi on 1999/01/24 13:01:57
+ Log: perlopentut was missing.
+ Branch: maint-5.005/perl
+ + pod/perlopentut.pod
+ ! MANIFEST pod/perldelta.pod
+____________________________________________________________________________
+[ 2697] By: jhi on 1999/01/24 12:31:33
+ Log: Remove t/op/grent.t (t/op/pwent.t was removed by #2685).
+ Branch: maint-5.005/perl
+ - t/op/grent.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 2696] By: gsar on 1999/01/24 11:39:39
+ Log: integrate changes#2255,2694 from mainline
+
+ another win32 portability fix: make sysread() and syswrite()
+ work on sockets
+
+ better notes on 'make' on win32
+ Branch: maint-5.005/perl
+ ! README.win32 pp_sys.c win32/win32.h
+____________________________________________________________________________
+[ 2693] By: gbarr on 1999/01/24 00:53:31
+ Log: Integrate changes #2646,2647 from cfgperl
+
+ Show LANGUAGE env var when needed. (Augment change #2645).
+
+ SHMLBA strikes back in NetBSD/sparc.
+
+ From: Dave Nelson <David.Nelson@bellcow.com>
+ To: jhi@iki.fi
+ Subject: perl5.005_02 + IPC::SysV + NetBSD/Sparc
+ Date: Mon, 18 Jan 1999 22:07:56 -0600
+ Message-Id: <199901190407.WAA02543@longhorn.bellcow.com>
+ Branch: maint-5.005/perl
+ ! util.c utils/perlbug.PL
+ !> ext/IPC/SysV/SysV.xs
+____________________________________________________________________________
+[ 2692] By: gbarr on 1999/01/24 00:28:52
+ Log: Integrate #2630 from mainline and an errno save fix
+ Branch: maint-5.005/perl
+ !> doio.c
+____________________________________________________________________________
+[ 2691] By: gbarr on 1999/01/24 00:28:37
+ Log: Update CGI modules to 2.46 and Getopt::Long to 2.19
+ Branch: maint-5.005/perl
+ ! lib/CGI.pm lib/CGI/Carp.pm lib/CGI/Cookie.pm lib/CGI/Fast.pm
+ ! lib/CGI/Push.pm lib/Getopt/Long.pm t/lib/cgi-html.t
+____________________________________________________________________________
+[ 2690] By: gbarr on 1999/01/23 23:35:39
+ Log: Integrate #2681 from cfgperl
+
+ Better (I hope) LANGUAGE documentation.
+ Branch: maint-5.005/perl
+ !> pod/perllocale.pod
+____________________________________________________________________________
+[ 2689] By: gbarr on 1999/01/23 23:31:59
+ Log: More nosuid patches
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 22 Jan 1999 12:12:45 +0200 (EET)
+ Message-ID: <13992.20253.269284.841300@alpha.hut.fi>
+ Subject: Re: [PATCH] 5.005*: the "nosuid" problem: v2
+ Branch: maint-5.005/perl
+ ! Configure config_h.SH perl.c perl.h pod/perldelta.pod
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 2688] By: gbarr on 1999/01/23 23:03:39
+ Log: From: Anton Berezin <tobez@plab.ku.dk>
+ Date: 21 Jan 1999 17:07:28 +0100
+ Message-ID: <86emood2yn.fsf@lion.plab.ku.dk>
+ Subject: [PATCH 5.005_54] hints/freebsd.sh - reflect the birth of version 4.0
+ Branch: maint-5.005/perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 2687] By: gbarr on 1999/01/23 22:52:58
+ Log: overload syntax is no longer experimental
+ Branch: maint-5.005/perl
+ ! lib/overload.pm
+____________________________________________________________________________
+[ 2685] By: gbarr on 1999/01/23 22:15:46
+ Log: Remove t/op/pwent.t added from cfgperl, but is not robust.
+ Branch: maint-5.005/perl
+ - t/op/pwent.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 2684] By: gbarr on 1999/01/23 22:13:07
+ Log: More doc typos from Abigail, and undo some in lib/diagnostics.pm
+ from change #2672
+
+ From: abigail@fnx.com
+ Date: Tue, 19 Jan 1999 19:32:42 -0500 (EST)
+ Message-Id: <19990120003242.19938.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/CGI.pm] Typos
+
+ From: abigail@fnx.com
+ Date: Tue, 19 Jan 1999 19:40:41 -0500 (EST)
+ Message-Id: <19990120004041.20052.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/CPAN.pm] Typos
+ Branch: maint-5.005/perl
+ ! lib/CGI.pm lib/CPAN.pm lib/diagnostics.pm
+____________________________________________________________________________
+[ 2677] By: gbarr on 1999/01/22 03:38:07
+ Log: Integrate #2645, #2648 and update patching.pod
+
+ Document the GNU LANGUAGE env var.
+
+ Mention /usr/share/locale.
+
+ From: Daniel Grisinger <dgris@moiraine.dimensional.com>
+ Date: 21 Jan 1999 00:17:35 -0700
+ Message-Id: <m31zkpqels.fsf_-_@moiraine.dimensional.com>
+ Subject: [PATCH] patching.pod, misc fixes (was Re: Which ? What ? Why ? When ?)
+ Branch: maint-5.005/perl
+ ! Porting/patching.pod
+ !> pod/perllocale.pod
+____________________________________________________________________________
+[ 2676] By: gbarr on 1999/01/22 01:54:02
+ Log: Fixup FindBin to use File::Spec
+
+ Message-Id: <19990120185157.D24479@west-tip.transeda.com>
+ Date: Wed, 20 Jan 1999 18:51:57 +0000
+ From: Paul Johnson <pjcj@transeda.com>
+ Subject: Re: [PATCH] 5005_54 Make FindBin work with UNC paths
+ Branch: maint-5.005/perl
+ ! lib/FindBin.pm
+____________________________________________________________________________
+[ 2675] By: gbarr on 1999/01/22 01:38:31
+ Log: Add new config values added for nosuid fix into VMS configure
+
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Wed, 20 Jan 1999 12:05:18 -0800
+ Message-Id: <3.0.6.32.19990120120518.00a98470@ous.edu>
+ Subject: [PATCH 5.005_03MT3]VMS configure tweak
+ Branch: maint-5.005/perl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 2674] By: gbarr on 1999/01/22 01:36:35
+ Log: Fix for buggy compiler optimization on dec for pack("I",...)
+
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Date: Wed, 20 Jan 1999 20:25:53 +0100
+ Message-Id: <199901201925.UAA16940@o06.xray.mpe.mpg.de>
+ Subject: [PATCH] Not OK: perl 5.00503 +MAINT_TRIAL_3 on alpha-dec_osf 4.0
+ Branch: maint-5.005/perl
+ ! pp.c
+____________________________________________________________________________
+[ 2673] By: gbarr on 1999/01/22 01:29:37
+ Log: OS/2 patches from Ilya
+
+ Date: Thu, 21 Jan 1999 02:08:27 -0500
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.00*] makedepend
+ Message-Id: <19990121020827.A25509@monk.mps.ohio-state.edu>
+
+ Date: Thu, 21 Jan 1999 02:46:34 -0500
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Errno.pm suffers from \\ too
+ Message-Id: <19990121024634.A25600@monk.mps.ohio-state.edu>
+
+ Date: Thu, 21 Jan 1999 02:50:16 -0500
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.005_03] Resend of OS/2 patch
+ Message-Id: <19990121025016.A25612@monk.mps.ohio-state.edu>
+
+ Date: Thu, 21 Jan 1999 03:58:29 -0500
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.005_*] OS2::PrfDB was exploiting a bug in U32 XSUBs
+ Message-Id: <19990121035829.A25822@monk.mps.ohio-state.edu>
+ Branch: maint-5.005/perl
+ ! ext/Errno/Errno_pm.PL makedepend.SH os2/Changes
+ ! os2/Makefile.SHs os2/OS2/PrfDB/PrfDB.xs os2/os2.c
+____________________________________________________________________________
+[ 2672] By: gbarr on 1999/01/22 01:05:45
+ Log: More doc typo patches from Abigail
+
+ From: abigail@fnx.com
+ Message-Id: <19990120001410.19645.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL 3 lib/AutoLoader.pm] Typos
+ Date: Tue, 19 Jan 1999 19:14:10 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120004312.20152.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Carp.pm] Typo
+ Date: Tue, 19 Jan 1999 19:43:12 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120004429.20190.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Cwd.pm] Typo
+ Date: Tue, 19 Jan 1999 19:44:29 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120005241.20693.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Safe.pm] Typo
+ Date: Tue, 19 Jan 1999 19:52:41 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120005525.20788.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/SelfLoader.pm] Typos
+ Date: Tue, 19 Jan 1999 19:55:25 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120005821.20926.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Symbol.pm] Typo
+ Date: Tue, 19 Jan 1999 19:58:21 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120010002.20973.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/Test.pm] Typo
+ Date: Tue, 19 Jan 1999 20:00:02 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120013823.23015.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/diagnostics.pm] Typos (ignore
+ Date: Tue, 19 Jan 1999 20:38:23 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120013909.23085.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/ops.pm] Typo
+ Date: Tue, 19 Jan 1999 20:39:09 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120015817.24306.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/overload.pm] Typos
+ Date: Tue, 19 Jan 1999 20:58:16 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-Id: <19990120020326.24373.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL3 lib/re.pm] Typos
+ Date: Tue, 19 Jan 1999 21:03:26 -0500 (EST)
+ Branch: maint-5.005/perl
+ ! ext/Opcode/Safe.pm ext/Opcode/ops.pm ext/re/re.pm
+ ! lib/AutoLoader.pm lib/Carp.pm lib/Cwd.pm lib/SelfLoader.pm
+ ! lib/Symbol.pm lib/Test.pm lib/diagnostics.pm lib/overload.pm
+____________________________________________________________________________
+[ 2671] By: gbarr on 1999/01/22 00:40:13
+ Log: Fix win32 for Borland compiler and spaces in paths
+
+ From: Gurusamy Sarathy <gsar@activestate.com>
+ Date: Mon, 18 Jan 1999 20:33:17 -0800
+ Message-Id: <199901190433.UAA03656@activestate.com>
+ Subject: [PATCH] 5.005_03-trial3 win32 issues
+ Branch: maint-5.005/perl
+ ! README.win32 win32/Makefile win32/config_sh.PL
+ ! win32/makefile.mk win32/runperl.c
+____________________________________________________________________________
+[ 2637] By: gbarr on 1999/01/18 02:52:18
+ Log: Update DB_File to 1.63
+
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Date: Tue, 29 Dec 1998 16:23:54 +0000 (GMT)
+ Message-Id: <9812291623.AA20884@claudius.bfsec.bt.co.uk>
+ Subject: PATCH DB_File 1.63 for 5.005_54 & 5.005_03
+ Branch: maint-5.005/perl
+ ! ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/dbinfo ext/DB_File/typemap
+____________________________________________________________________________
+[ 2636] By: gbarr on 1999/01/17 18:03:31
+ Log: Trial release 3
+ Branch: maint-5.005/perl
+ ! Changes patchlevel.h
+____________________________________________________________________________
+[ 2635] By: gbarr on 1999/01/17 17:32:01
+ Log: Update to CPAN-1.44
+
+ From: Mark-Jason Dominus <mjd@plover.com>
+ Date: Sat, 16 Jan 1999 17:22:06 -0500
+ Message-ID: <19990116222206.3674.qmail@plover.com>
+ Subject: Re: DOC PATCH (5.005_54 perlsub.pod)
+ Branch: maint-5.005/perl
+ ! lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
+ ! pod/perlsub.pod
+____________________________________________________________________________
+[ 2634] By: gbarr on 1999/01/17 17:27:12
+ Log: Fix for suidperl when script is on a nosuid filesystem
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Sun, 17 Jan 1999 16:27:06 +0200 (EET)
+ Message-ID: <13985.62266.324824.292401@alpha.hut.fi>
+ Subject: [PATCH] 5.005*: the "nosuid" problem: v2
+ Branch: maint-5.005/perl
+ ! Configure config_h.SH perl.c perl.h pod/perldiag.pod
+____________________________________________________________________________
+[ 2618] By: gbarr on 1999/01/16 19:18:26
+ Log: Added Dumpvalue.pm
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 7 Dec 1998 02:44:25 -0500 (EST)
+ Message-Id: <199812070744.CAA18949@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Dumpvar.pm
+ Branch: maint-5.005/perl
+ + lib/Dumpvalue.pm
+ ! MANIFEST pod/perldelta.pod
+____________________________________________________________________________
+[ 2617] By: gbarr on 1999/01/16 19:09:36
+ Log: Minor change to perlxstut and added perlopentut.pod
+
+ From: Nathan Torkington <gnat@frii.com>
+ Date: Sat, 26 Dec 1998 14:28:21 +1300 (NZDT)
+ Message-ID: <13956.15285.933914.320849@localhost.frii.com>
+ Subject: [PATCH] perlxstut.pod fix
+
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ Date: Sat, 09 Jan 1999 08:13:18 -0700
+ Message-Id: <199901091513.IAA17512@jhereg.perl.com>
+ Subject: perlopentut.pod
+ Branch: maint-5.005/perl
+ ! MANIFEST pod/perl.pod pod/perldelta.pod pod/perlxstut.pod
+ ! pod/roffitall
+____________________________________________________________________________
+[ 2616] By: gbarr on 1999/01/16 18:59:55
+ Log: Win32 changes from Jan
+
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 15 Jan 1999 23:38:35 +0100
+ Message-ID: <36a7c10d.16311905@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03m2] Win32 Makefile patches
+
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sat, 16 Jan 1999 13:02:45 +0100
+ Message-ID: <36a07da6.10722337@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03m2] minor tweaks to README.win32
+ Branch: maint-5.005/perl
+ ! README.win32 win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2615] By: gbarr on 1999/01/16 18:48:48
+ Log: Jumbo patch from Sarathy for PERL_OBJECT & USE_THREADS
+
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Thu, 07 Jan 1999 00:12:00 -0500
+ Message-Id: <199901070512.AAA23568@aatma.engin.umich.edu>
+ Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
+
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Thu, 14 Jan 1999 19:21:46 -0500
+ Message-Id: <199901150021.TAA01886@aatma.engin.umich.edu>
+ Subject: Re: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
+ Branch: maint-5.005/perl
+ ! embed.h global.sym lib/ExtUtils/MM_Unix.pm objXSUB.h objpp.h
+ ! op.c perl.c perl.h perly.c perly.y perly_c.diff pp.c proto.h
+ ! sv.c t/io/fs.t toke.c win32/GenCAPI.pl win32/config.bc
+ ! win32/makedef.pl win32/runperl.c win32/win32.c
+____________________________________________________________________________
+[ 2614] By: gbarr on 1999/01/16 16:48:38
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 15 Jan 1999 17:28:34 +0200 (EET)
+ Message-Id: <199901151528.RAA08785@alpha.hut.fi>
+ Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: NetBSD patches
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 15 Jan 1999 18:44:19 +0200 (EET)
+ Message-Id: <199901151644.SAA08184@alpha.hut.fi>
+ Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: allow skipping the "install also as /usr/bin/perl" question of installperl
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 15 Jan 1999 18:52:29 +0200 (EET)
+ Message-Id: <199901151652.SAA11259@alpha.hut.fi>
+ Subject: the promised "installusrbinperl + NetBSD" fix
+ Branch: maint-5.005/perl
+ ! Configure Makefile.SH hints/netbsd.sh installperl
+ ! makedepend.SH unixish.h
+____________________________________________________________________________
+[ 2613] By: gbarr on 1999/01/16 16:28:40
+ Log: From: Laszlo Molnar <ml1050@freemail.c3.hu>
+ Date: Thu, 14 Jan 1999 22:37:26 +0100
+ Message-ID: <19990114223726.A177@beeblebrox>
+ Subject: [PATCH for 5.005_03-MAINT_TRIAL_2] dos-djgpp update
+ Branch: maint-5.005/perl
+ ! djgpp/config.over djgpp/djgpp.c
+____________________________________________________________________________
+[ 2612] By: gbarr on 1999/01/16 16:27:25
+ Log: Hints for sco.sh to automatically support dynamic linking
+
+ From: Peter Wolfe <wolfe@teloseng.com>
+ Date: Mon, 11 Jan 1999 11:50:20 -0800 (PST)
+ Message-Id: <199901111950.LAA01703@titan.teloseng.com>
+ Subject: SCO 3.2v5 patch for perl5.005_03-MAINT_TRIAL_1
+ Branch: maint-5.005/perl
+ ! hints/sco.sh
+____________________________________________________________________________
+[ 2610] By: gbarr on 1999/01/14 03:07:33
+ Log: Fix login in installperl for pods
+
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Mon, 4 Jan 1999 13:50:10 GMT
+ Message-Id: <199901041350.NAA19665@cyclone.cise.npl.co.uk>
+ Subject: PATCH to installperl
+ Branch: maint-5.005/perl
+ ! installperl
+____________________________________________________________________________
+[ 2609] By: gbarr on 1999/01/14 03:04:37
+ Log: Fix incorrect "used only once" warnings
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 8 Jan 1999 04:37:10 -0500
+ Message-ID: <19990108043710.A14390@monk.mps.ohio-state.edu>
+ Subject: Re: change#965 flakiness
+ Branch: maint-5.005/perl
+ ! gv.c
+____________________________________________________________________________
+[ 2608] By: gbarr on 1999/01/14 02:56:46
+ Log: Fixed double GLOB de-reference
+
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Sat, 09 Jan 1999 23:40:24 -0500
+ Message-Id: <199901100440.XAA12360@aatma.engin.umich.edu>
+ Subject: Re: IO::Pipe with perl -d (on HPUX)
+ Branch: maint-5.005/perl
+ ! ext/IO/lib/IO/Pipe.pm
+____________________________________________________________________________
+[ 2607] By: gbarr on 1999/01/14 02:53:40
+ Log: Added Carp::cluck to perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 2606] By: gbarr on 1999/01/14 02:44:04
+ Log: New perlfaq*.pod from Tom (private mail)
+ Branch: maint-5.005/perl
+ ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod
+____________________________________________________________________________
+[ 2584] By: gbarr on 1999/01/08 04:50:56
+ Log: implemented Ilya's suggested fix, and added a testcase
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 5 Jan 1999 00:56:01 -0500 (EST)
+ Message-Id: <199901050556.AAA02597@monk.mps.ohio-state.edu>
+ Subject: Re: Text::ParseWords: regex fix
+ Branch: maint-5.005/perl
+ ! lib/Text/ParseWords.pm t/lib/parsewords.t
+____________________________________________________________________________
+[ 2583] By: gbarr on 1999/01/08 04:50:03
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Thu, 7 Jan 1999 12:47:38 +0200 (EET)
+ Message-Id: <199901071047.MAA24100@alpha.hut.fi>
+ Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: ext/Errno_pm.PL: understand wrapper cppstdins
+ Branch: maint-5.005/perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 2582] By: gbarr on 1999/01/08 03:37:55
+ Log: More doc changes from Abigail, and included change #2575 from cfgperl
+
+ From: abigail@fnx.com
+ Message-ID: <19990107041434.22326.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Time/gmtime.pm] Typo fix
+ Date: Wed, 6 Jan 1999 23:14:34 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107041746.22376.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Time/localtime.pm] Typo fix
+ Date: Wed, 6 Jan 1999 23:17:46 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107042105.22527.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/User/grent.pm] Typo fix
+ Date: Wed, 6 Jan 1999 23:21:05 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107042254.22624.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/User/pwent.pw] Typo fix
+ Date: Wed, 6 Jan 1999 23:22:54 -0500 (EST)
+ Branch: maint-5.005/perl
+ ! lib/Math/Trig.pm lib/Time/gmtime.pm lib/Time/localtime.pm
+ ! lib/User/grent.pm lib/User/pwent.pm
+____________________________________________________________________________
+[ 2578] By: gbarr on 1999/01/07 04:30:26
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Wed, 06 Jan 1999 13:47:34 -0800
+ Message-Id: <3.0.6.32.19990106134734.0334d260@ous.edu>
+ Subject: [PATCH 5.005_02-MT2, 5.005_5x]VMS.C tweak for occasional system() error
+ Branch: maint-5.005/perl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 2577] By: gbarr on 1999/01/07 04:26:28
+ Log: Another set of doc patches from Abigail
+
+ From: abigail@fnx.com
+ Message-ID: <19990107032132.20124.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/Net/hostent.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:21:32 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107032445.20178.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Net/netent.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:24:45 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107032834.20362.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/Term/Complete.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:28:34 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107033136.20440.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/Term/ReadLine.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:31:36 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107033351.20540.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Apache.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:33:51 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107033933.20707.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/CGI/Push.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:39:33 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107034548.20936.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/File/Copy.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 22:45:48 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107034856.21056.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:48:56 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107035113.21174.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/File/Spec/Mac.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 22:51:13 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107035612.21522.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigFloat.pm] Typo fix
+ Date: Wed, 6 Jan 1999 22:56:12 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107035842.21585.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Math/BigInt.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 22:58:41 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107040644.22009.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Text/Wrap.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 23:06:44 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107040955.22087.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Array.pm] Typo fixes
+ Date: Wed, 6 Jan 1999 23:09:55 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990107041136.22174.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/Tie/Hash.pm] Typo fix
+ Date: Wed, 6 Jan 1999 23:11:36 -0500 (EST)
+ Branch: maint-5.005/perl
+ ! lib/CGI/Apache.pm lib/CGI/Push.pm lib/File/Copy.pm
+ ! lib/File/Spec.pm lib/File/Spec/Mac.pm lib/Math/BigFloat.pm
+ ! lib/Math/BigInt.pm lib/Net/hostent.pm lib/Net/netent.pm
+ ! lib/Term/Complete.pm lib/Term/ReadLine.pm lib/Text/Wrap.pm
+ ! lib/Tie/Array.pm lib/Tie/Hash.pm
+____________________________________________________________________________
+[ 2568] By: gbarr on 1999/01/06 03:13:15
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 06 Jan 1999 01:24:09 +0100
+ Message-ID: <3696aa85.18259325@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03-MAINT_TRIAL2] fixes for PERL_OBJECT and USE_THREADS builds
+ Branch: maint-5.005/perl
+ ! embed.h global.sym objXSUB.h objpp.h perl.c proto.h
+ ! win32/GenCAPI.pl win32/makedef.pl
+____________________________________________________________________________
+[ 2567] By: gbarr on 1999/01/06 02:31:28
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Tue, 05 Jan 1999 16:47:31 -0800
+ Message-Id: <3.0.6.32.19990105164731.00b5b2d0@ous.edu>
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_2]taint.c fix for VMS
+ Branch: maint-5.005/perl
+ ! taint.c
+____________________________________________________________________________
+[ 2566] By: gbarr on 1999/01/06 02:29:05
+ Log: From: "W. Phillip Moore" <wpm@ms.com>
+ Date: Tue, 5 Jan 1999 12:40:27 -0500 (EST)
+ Message-ID: <13970.20107.190314.549471@zappa>
+ Subject: [PATCH] POSIX getpgrp is not -w clean
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.pm
+____________________________________________________________________________
+[ 2565] By: gbarr on 1999/01/06 02:19:00
+ Log: From: Slaven Rezic <eserte@cs.tu-berlin.de>
+ Date: Mon, 4 Jan 1999 23:01:46 +0100 (CET)
+ Message-Id: <199901042201.XAA01875@cabulja.herceg.de>
+ Subject: FindBin.pm on Win32 systems
+ Branch: maint-5.005/perl
+ ! lib/FindBin.pm
+____________________________________________________________________________
+[ 2564] By: gbarr on 1999/01/06 02:13:23
+ Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
+ Date: Mon, 4 Jan 1999 13:34:58 -0800 (PST)
+ Message-Id: <199901042134.NAA18852@spock.dis.cccd.edu>
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_2] t/op/sysio.t for MPE/iX
+ Branch: maint-5.005/perl
+ ! t/op/sysio.t
+____________________________________________________________________________
+[ 2563] By: gbarr on 1999/01/06 02:03:44
+ Log: From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: Mon, 4 Jan 1999 19:25:03 +0200 (EET)
+ Message-Id: <199901041725.TAA30462@alpha.hut.fi>
+ Subject: [PATCH] 5.005_03-MAINT_TRIAL_2: undo untrue HP-UX 64-bitness (mostly harmless but misleading)
+ Branch: maint-5.005/perl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 2562] By: gbarr on 1999/01/06 02:02:18
+ Log: Jumbo doc patch from Abigail
+
+ From: abigail@fnx.com
+ Message-ID: <19990105170142.4889.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03-TRIAL2 lib/ExtUtils/Liblist.pm] pod fixes
+ Date: Tue, 5 Jan 1999 12:01:42 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105172855.5115.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Commands.pm] Typo fix.
+ Date: Tue, 5 Jan 1999 12:28:55 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105173808.5260.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH perl5.005_03 MAINT3 lib/ExtUtils/Embed.pm] Typo fix
+ Date: Tue, 5 Jan 1999 12:38:08 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105174859.5533.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 MAINT2 lib/ExtUtils/Install.pm] Typo fix
+ Date: Tue, 5 Jan 1999 12:48:59 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105174947.5547.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 lib/ExtUtils/MM_Unix.pm] Typo fixes
+ Date: Tue, 5 Jan 1999 12:49:46 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105182301.5966.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 lib/ExtUtils/MakeMaker.pm] Typos fixes.
+ Date: Tue, 5 Jan 1999 13:23:00 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105183344.6065.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Manifest.pm] Typo fixes
+ Date: Tue, 5 Jan 1999 13:33:44 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990105184028.6220.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/ExtUtils/Mksymlists.pm] Typo fix
+ Date: Tue, 5 Jan 1999 13:40:28 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990106012015.9451.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/IO/Pipe.pm] Typo fixes.
+ Date: Tue, 5 Jan 1999 20:20:15 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990106012047.9459.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRAIL2 lib/IO/Seekable.pm] Typo fixes
+ Date: Tue, 5 Jan 1999 20:20:47 -0500 (EST)
+
+ From: abigail@fnx.com
+ Message-ID: <19990106012338.9536.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_03 TRIAL2 lib/IO/Socket.pm] Typo fix
+ Date: Tue, 5 Jan 1999 20:23:38 -0500 (EST)
+ Branch: maint-5.005/perl
+ ! ext/IO/lib/IO/Pipe.pm ext/IO/lib/IO/Seekable.pm
+ ! ext/IO/lib/IO/Socket.pm lib/ExtUtils/Command.pm
+ ! lib/ExtUtils/Embed.pm lib/ExtUtils/Install.pm
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Manifest.pm
+ ! lib/ExtUtils/Mksymlists.pm
+____________________________________________________________________________
+[ 2560] By: gbarr on 1999/01/03 16:59:01
+ Log: Trial release 2
+ Branch: maint-5.005/perl
+ ! Changes patchlevel.h
+____________________________________________________________________________
+[ 2559] By: gbarr on 1999/01/02 15:37:35
+ Log: From: Blair Zajac <bzajac@geostaff.com>
+ Date: Wed, 23 Dec 1998 17:13:32 -0800
+ Message-ID: <3681953C.8B6A90AA@geostaff.com>
+ Subject: Tie::SubstrHash patch
+ Branch: maint-5.005/perl
+ ! lib/Tie/SubstrHash.pm
+____________________________________________________________________________
+[ 2558] By: gbarr on 1999/01/02 15:30:01
+ Log: integrate change #2544
+
+ From: Tim Bunce <Tim.Bunce@ig.co.uk>
+ Subject: bug in pod2man search for perl binary [5.005_5x]
+ Date: Sat, 12 Dec 1998 23:08:51 +0000
+ Message-ID: <19981212230851.A20578@ig.co.uk>
+ Branch: maint-5.005/perl
+ !> pod/pod2man.PL
+____________________________________________________________________________
+[ 2557] By: gbarr on 1999/01/02 15:20:42
+ Log: integrate change #2548
+
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ To: perl5-porters@perl.org
+ cc: hv@crypt0.demon.co.uk
+ Subject: [bug 5.004_54] duplicate error message
+ Date: Thu, 31 Dec 1998 04:05:25 +0000
+ Message-Id: <199812310405.EAA00386@crypt.compulink.co.uk>
+
+ Message-ID: <13963.60672.134591.383377@alias-2.pr.mcs.net>
+ From: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ To: hv@crypt0.demon.co.uk
+ Cc: perl5-porters@perl.org
+ Subject: [PATCH _54] Re: duplicate error message
+ Date: Thu, 31 Dec 1998 16:10:13 -0600 (CST)
+
+ Message-Id: <199901010732.HAA02926@crypt.compulink.co.uk>
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ To: Stephen McCamant <smccam@uclink4.berkeley.edu>
+ cc: hv@crypt0.demon.co.uk, perl5-porters@perl.org
+ Subject: [TEST PATCH _54] Re: duplicate error message
+ Date: Fri, 01 Jan 1999 07:32:14 +0000
+ Branch: maint-5.005/perl
+ ! op.c t/pragma/warn-1global taint.c
+____________________________________________________________________________
+[ 2556] By: gbarr on 1999/01/02 15:18:58
+ Log: From: abigail@fnx.com
+ Date: Mon, 28 Dec 1998 14:16:12 -0500 (EST)
+ Message-ID: <19981228191612.8380.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_02; lib/fields.pm] Typos in pod.
+ Branch: maint-5.005/perl
+ ! lib/fields.pm
+____________________________________________________________________________
+[ 2555] By: gbarr on 1999/01/02 15:11:45
+ Log: intregrate change #2547
+
+ From: Chris Nandor <pudge@pobox.com>
+ Subject: Re: [PATCH] perlport.pod 1.38
+ Date: Thu, 31 Dec 1998 09:06:48 -0500
+ Message-Id: <v04020a1db2b1352ec92a@[192.168.0.77]>
+ Branch: maint-5.005/perl
+ !> pod/perlport.pod
+____________________________________________________________________________
+[ 2543] By: gbarr on 1998/12/31 06:17:13
+ Log: integrated relevant parts og changes #2385 & #2387 from mainline
+
+ various fixes for race conditions under threads: mutex locks based
+ on PL_threadnum were seriously flawed, since it means more than one
+ thread could enter the critical region; PL_na was global instead of
+ thread-local; child thread could finish and free thr structures
+ before Thread->new() got around to creating the Thread object;
+ cv_clone() needed locking, as it mucks with PL_comppad and other
+ global data; new_struct_thread() needed to lock template-thread's
+ mutex while copying its data
+
+ another threads reliability fix: serialize writes to thr->threadsv
+ avoid most uses of PL_na (which is much more inefficient than a
+ simple local); update docs to suit; PL_na now being thr->Tna may
+ be a minor compatibility issue for extensions--will require dTHR
+ outside of XSUBs (those get automatic dTHR)
+ Branch: maint-5.005/perl
+ ! XSUB.h djgpp/djgpp.c doio.c doop.c dump.c embedvar.h
+ ! ext/DynaLoader/dl_next.xs ext/IO/IO.xs ext/Opcode/Opcode.xs
+ ! ext/POSIX/POSIX.xs ext/Thread/Thread.xs ext/attrs/attrs.xs
+ ! gv.c malloc.c mg.c objXSUB.h op.c os2/OS2/REXX/REXX.xs
+ ! os2/os2.c perl.c perlvars.h perly.c perly.y pod/perlcall.pod
+ ! pod/perlembed.pod pod/perlguts.pod pod/perlxs.pod pp.c pp.h
+ ! pp_ctl.c pp_hot.c pp_sys.c run.c sv.c taint.c thread.h toke.c
+ ! universal.c util.c vms/ext/Stdio/Stdio.xs vms/perly_c.vms
+ ! vms/vms.c win32/win32.c win32/win32thread.c
+____________________________________________________________________________
+[ 2542] By: gbarr on 1998/12/30 14:46:40
+ Log: doc updates
+
+ From: abigail@fnx.com
+ Date: Wed, 23 Dec 1998 22:32:07 -0500 (EST)
+ Message-ID: <19981224033207.16751.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_02] Typo in documentation of pod2html.
+
+ From: abigail@fnx.com
+ Date: Wed, 23 Dec 1998 22:59:59 -0500 (EST)
+ Message-ID: <19981224035959.16994.qmail@alexandra.wayne.fnx.com>
+ Subject: [PATCH 5.005_02] Re: m// doc is buggy (was Re: m'$foo' is undocumented)
+
+ pod/perldelta.pod from:
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Thu, 17 Dec 1998 16:13:34 +0200 (EET)
+ Message-ID: <13945.4494.140163.973953@alpha.hut.fi>
+ Subject: Re: important UNDOC issues for 5.005_54
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod pod/perlop.pod pod/pod2html.PL
+____________________________________________________________________________
+[ 2541] By: gbarr on 1998/12/30 14:37:14
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 23 Dec 1998 21:26:38 +0100
+ Message-ID: <36895086.8849224@smtp1.ibm.net>
+ Subject: [PATCH 5.005_03m1] subdirectory Makefiles should inherit CAPI setting from command line
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2538] By: gbarr on 1998/12/29 14:41:29
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 22 Dec 1998 10:57:48 +0200 (EET)
+ Message-ID: <13951.24332.932827.831376@alpha.hut.fi>
+ Subject: Re: x operator broken in DEC Alpha for 8-bit characters (Re: Digest-MD5-2.00 test fails on DEC Alpha - a patch)
+ Branch: maint-5.005/perl
+ ! t/op/repeat.t util.c
+____________________________________________________________________________
+[ 2535] By: gbarr on 1998/12/29 14:27:56
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 18 Dec 1998 16:39:27 +0200 (EET)
+ Message-ID: <13946.26911.140905.387070@alpha.hut.fi>
+ Subject: Math::Trig, Math::Complex, Fcntl, addressed (Re: Undocumentation Issues for 5.005)
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 2534] By: gbarr on 1998/12/29 14:23:02
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 15 Dec 1998 17:52:32 +0200 (EET)
+ Message-ID: <13942.34240.66558.169330@alpha.hut.fi>
+ Subject: some doc link fixes
+ Branch: maint-5.005/perl
+ ! pod/perlcall.pod pod/perldata.pod pod/perldiag.pod
+ ! pod/perlfaq5.pod pod/perlfaq7.pod pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perllocale.pod pod/perlobj.pod
+ ! pod/perlsub.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 2533] By: gbarr on 1998/12/29 14:23:00
+ Log: From: Chris Nandor <pudge@pobox.com>
+ Date: Sat, 19 Dec 1998 12:54:34 -0500
+ Message-Id: <v04020a03b2a194aaa676@[192.168.0.77]>
+ Subject: [PATCH] perlport.pod v1.37
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 2531] By: gbarr on 1998/12/29 14:12:25
+ Log: change in_pod pattern to /^=\w/ from /^=/
+ From: Frank Ridderbusch <Frank.Ridderbusch@pdb.siemens.de>
+ Date: Tue, 15 Dec 1998 16:23:12 +0100 (MET)
+ Message-ID: <13942.32480.700000.640927@utensil>
+ Subject: Minor Bug in AutoSplit.qm in 5.005 and 5.004
+ Branch: maint-5.005/perl
+ ! lib/AutoSplit.pm
+____________________________________________________________________________
+[ 2530] By: gbarr on 1998/12/29 14:09:51
+ Log: undo the "perlsyn intrusion" into perlfunc
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2529] By: gbarr on 1998/12/29 14:04:35
+ Log: From: Jarkko Hietaniemi <hietanie@koah.research.nokia.com>
+ Date: Sun, 13 Dec 1998 14:54:56 +0200 (EET)
+ Message-Id: <199812131254.OAA24494@koah.research.nokia.com>
+ Subject: ignore_versioned_libs isn't used anywhere (it became ignore_versioned_solibs)
+ Branch: maint-5.005/perl
+ ! hints/linux.sh
+____________________________________________________________________________
+[ 2528] By: gbarr on 1998/12/29 13:59:49
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 28 Oct 1998 01:20:33 -0500 (EST)
+ Message-Id: <199810280620.BAA06893@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Make sort respect overloading
+ Branch: maint-5.005/perl
+ ! pp_ctl.c t/pragma/overload.t
+____________________________________________________________________________
+[ 2527] By: gbarr on 1998/12/29 13:58:56
+ Log: doc update, quads only work on 64-but platforms
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2526] By: gbarr on 1998/12/29 13:49:55
+ Log: From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Tue, 1 Dec 1998 12:50:27 -0500 (EST)
+ Message-Id: <Pine.SUN.3.96.981201124929.4288H-100000@newton.phys>
+ Subject: [PATCH 5.005_xx] erroneous 'none' in lddlflags
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2512] By: gbarr on 1998/12/28 14:56:36
+ Log: change t/op/pwent.t to ignore NIS includes
+ From: achampio@lehman.com (Alan Champion)
+ Date: Tue, 1 Dec 1998 15:18:03 GMT
+ Message-Id: <9812011518.AA00005@lonhpov1.lehman.com>
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on sun4-solaris 2.3 (UNINSTALLED)
+
+ From: pvhp@forte.com (Peter Prymmer)
+ Date: Fri, 4 Dec 98 17:11:41 PST
+ Message-Id: <9812050111.AA16778@forte.com>
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_1 && 5.005_54]dumper and searchdict ebcdic style
+ Branch: maint-5.005/perl
+ ! t/lib/dumper.t t/lib/searchdict.t t/op/pwent.t
+____________________________________________________________________________
+[ 2511] By: gbarr on 1998/12/28 14:55:28
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Tue, 01 Dec 1998 00:07:33 +0100
+ Message-ID: <366921b5.14512598@smtp1.ibm.net>
+ Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] to compile on Win32
+
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 02 Dec 1998 00:24:54 +0100
+ Message-ID: <366a77bb.19498126@smtp1.ibm.net>
+ Subject: Re: 5.005_03-MAINT-TRIAL1, [PATCH] spaces in filenames support
+ Branch: maint-5.005/perl
+ ! perl.h proto.h taint.c win32/GenCAPI.pl win32/Makefile
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_sh.PL win32/makedef.pl
+____________________________________________________________________________
+[ 2510] By: gbarr on 1998/12/28 14:37:35
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 1 Dec 1998 00:34:08 -0500 (EST)
+ Message-Id: <199812010534.AAA21371@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Debugger 'v' command
+ Branch: maint-5.005/perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 2478] By: gbarr on 1998/12/13 16:02:24
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Mon, 30 Nov 98 21:08:36 PST
+ Message-Id: <9812010508.AA07791@forte.com>
+ Subject: [PATCH 5.005_03t1 && 5.005_54]dll linkage side decks for OS/390
+ Branch: maint-5.005/perl
+ ! hints/os390.sh
+____________________________________________________________________________
+[ 2477] By: gbarr on 1998/12/13 16:00:23
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Mon, 30 Nov 1998 17:08:12 -0800
+ Message-Id: <3.0.6.32.19981130170812.00b12b70@ous.edu>
+ Subject: [PATCH 5.005_03]Minor VMS patches needed to build
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MM_VMS.pm vms/subconfigure.com
+____________________________________________________________________________
+[ 2476] By: gbarr on 1998/12/13 15:30:58
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Fri, 4 Dec 98 00:37:32 PST
+ Message-Id: <9812040837.AA10908@forte.com>
+ Subject: Re: [PATCH 5.005_03-MAINT-TRIAL1] some tweaks to the build process for OS/390
+ Branch: maint-5.005/perl
+ ! Makefile.SH regcomp.c
+____________________________________________________________________________
+[ 2472] By: gbarr on 1998/12/12 17:12:28
+ Log: undo changes to Exporter.pm from #2312
+ Branch: maint-5.005/perl
+ ! lib/Exporter.pm
+____________________________________________________________________________
+[ 2471] By: gbarr on 1998/12/12 17:09:39
+ Log: integrate change#2459 from cfgperl
+
+ enclose case want_vtbl_collxfrm with #ifdef USE_LOCALE_COLLATE
+
+ From: hansm@icgroup.nl
+ Subject: Not OK: perl 5.00503 +MAINT_TRIAL_1 on OPENSTEP-Mach 4_1 (UNINSTALLED)
+ Date: Sun, 6 Dec 98 22:19:54 +0100
+ Message-Id: <9812062116.AA26445@icgned.icgroup.nl>
+ Branch: maint-5.005/perl
+ ! util.c
+____________________________________________________________________________
+[ 2470] By: gbarr on 1998/12/12 16:46:03
+ Log: re-sync'd Text::Wrap with new version from CPAN
+ Branch: maint-5.005/perl
+ +> t/lib/textfill.t
+ ! MANIFEST
+ !> lib/Text/Wrap.pm t/lib/textwrap.t
+____________________________________________________________________________
+[ 2469] By: gbarr on 1998/12/12 15:58:43
+ Log: integrate changes#2435,2436 from cfgperl
+
+ Pod::Html and Pod::Text were not locale-savvy:
+ for example in =head1 all non-ASCII-\w-runs were
+ turned into underscores in NAME tags. This could
+ result in several NAME tags becoming identical.
+ Reported by:
+
+ From: Fyodor Krasnov <fyodor@aha.ru>
+ Subject: pod2html vs Russian Characters
+ To: Tom.Christiansen@snn.aha.ru, tchrist@perl.com
+ Date: Tue, 24 Nov 1998 19:00:36 +0300 (MSK)
+ Message-Id: <199811241600.TAA05149@stat.aha.ru>
+
+ One paste too many in #2435.
+ Branch: maint-5.005/perl
+ !> lib/Pod/Html.pm lib/Pod/Text.pm
+____________________________________________________________________________
+[ 2468] By: gbarr on 1998/12/12 15:01:58
+ Log: redirect trail program to error msg file in Configure
+
+ From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Tue, 1 Dec 1998 13:40:12 -0500 (EST)
+ Message-Id: <Pine.SUN.3.96.981201133546.4288K-100000@newton.phys>
+ Subject: [PATCH 5.005_xx] Missing redirection of simple test program
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2467] By: gbarr on 1998/12/12 14:52:24
+ Log: Change reall_srchlen back to an int from a #define
+
+ From: Graham Barr <gbarr@ti.com>
+ Date: Mon, 30 Nov 1998 14:29:14 -0600
+ Message-ID: <19981130142914.X1504@asic.sc.ti.com>
+ Subject: [PATCH 5.005_03-MT!] Re: one compilation warning from 5_03-MT1
+ Branch: maint-5.005/perl
+ ! malloc.c
+____________________________________________________________________________
+[ 2466] By: gbarr on 1998/12/12 14:40:56
+ Log: s/SCM_CREDENTIALSS/SCM_CREDENTIALs/ in Socket.xs
+
+ From: Andy Dougherty <doughera@lafayette.edu>
+ Date: Thu, 3 Dec 1998 11:26:25 -0500 (EST)
+ Message-Id: <Pine.SUN.3.96.981203112330.8800H-100000@newton.phys>
+ Subject: [PATCH 5.005_03-MAINT_TRIAL_1] Trivial grammar patch
+ Branch: maint-5.005/perl
+ ! Porting/Glossary
+ !> ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 2456] By: gsar on 1998/12/06 13:49:02
+ Log: branch perldelta.pod
+ Branch: maint-5.005/perl
+ +> pod/perldelta.pod
+____________________________________________________________________________
+[ 2455] By: gsar on 1998/12/06 13:47:21
+ Log: clobber perldelta.pod to reestablish branch from perl5005delta.pod
+ Branch: maint-5.005/perl
+ - pod/perldelta.pod
+____________________________________________________________________________
+[ 2415] By: gbarr on 1998/11/30 02:31:15
+ Log: Chnages,patchlevel.h etc...
+ Branch: maint-5.005/perl
+ ! Changes MANIFEST patchlevel.h t/op/tr.t win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 2411] By: gbarr on 1998/11/30 01:31:22
+ Log: integrated changes#2323,2353,2369
+
+ From: maeda@src.ricoh.co.jp
+ Date: Tue, 24 Nov 1998 10:37:45 +0900
+ Message-Id: <199811240137.KAA05867@luna.src.ricoh.co.jp>
+ Subject: format "..." bug
+
+ Locale collation, ctype, and numeric, were initialized wrong
+ (if LC_ALL or LANG were unset, so were the collation/ctype/numeric),
+ as reported by
+
+ From: Ilya.Sandler@etak.com (Ilya Sandler)
+ Subject: a bug in locale handling: LC_COLLATE ignored sometimes
+ Date: 25 Nov 1998 04:53:52 +0200
+ Message-ID: <MLIST_199811250226.SAA12590@axi001.etak.sw>
+
+ allow final period in a file (not followed by a newline) to
+ terminate format spec
+ Branch: maint-5.005/perl
+ ! pp_ctl.c toke.c util.c
+ !> t/op/write.t
+____________________________________________________________________________
+[ 2408] By: gbarr on 1998/11/30 01:29:19
+ Log: integrated ext/B/... changes from mainline
+ Branch: maint-5.005/perl
+ !> ext/B/B.pm ext/B/B.xs ext/B/B/Assembler.pm ext/B/B/C.pm
+ !> ext/B/B/Disassembler.pm
+____________________________________________________________________________
+[ 2404] By: gbarr on 1998/11/30 00:26:36
+ Log: integrate some of change#2318 from mainline
+ Branch: maint-5.005/perl
+ +> t/op/grent.t t/op/pwent.t
+ !> ext/DB_File/Changes ext/DB_File/DB_File.pm
+ !> ext/DB_File/DB_File.xs ext/POSIX/hints/dynixptx.pl
+ !> ext/Socket/Socket.pm ext/Socket/Socket.xs lib/Benchmark.pm
+ !> pod/perldata.pod t/op/sort.t
+____________________________________________________________________________
+[ 2398] By: gbarr on 1998/11/29 22:11:16
+ Log: integrate changes#2254,2259,2335,2345,2348,2361,2368,2380 from mainline
+
+ win32_recvfrom() compatibility fix
+
+ From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ Subject: Re: [PATCH] Re: pod2man bug in date generated line
+ To: Albert Dvornik <bert@genscan.com>, "Larry W. Virden" <lvirden@cas.org>
+ Cc: perlbug@perl.com
+ Date: 20 Nov 1998 21:30:17 +0200
+ Message-ID: <MLIST_19981120131523.A464@O2.chapin.edu>
+
+ make $1 et al readonly under threads; make C<undef $1> fail like
+ C<$1 = undef> does
+
+ fix typo in pp_defined() causing C<defined %tied> to fail
+
+ more conservative version of changes#2345,2346,2347; those break
+ C<defined(@{"foo::ISA"})> which seems to be extensively used in
+ the libs :-(
+
+ fix uninitialized warnings
+ From: Brian Callaghan <callagh@itginc.com>
+ Date: Thu, 19 Nov 1998 17:49:10 -0800
+ Message-Id: <3654CA96.B64FCAEB@itginc.com>
+ Subject: Complete.pm patch (version 1.1)
+
+ Liblist tweak suggested by Swen Thuemmler <Swen.Thuemmler@paderlinx.de>;
+ add C<$Config{installarchlib}/CORE> to the default locations searched
+ on win32
+
+ prefer IO::Handle for IO if FileHandle:: is empty (as suggested by
+ Tim Bunce)
+ Branch: maint-5.005/perl
+ ! gv.c op.c pp.c
+ !> lib/ExtUtils/Liblist.pm lib/Term/Complete.pm pod/perlfaq4.pod
+ !> pod/pod2man.PL t/op/undef.t win32/win32sck.c
+____________________________________________________________________________
+[ 2315] By: gbarr on 1998/11/27 05:16:50
+ Log: integrate change#2246 from mainline, while still allowing
+ C<sort $globref @foo>
+
+ allow C<sort $coderef @foo>
+ Branch: maint-5.005/perl
+ ! op.c sv.c
+ !> t/op/sort.t
+____________________________________________________________________________
+[ 2314] By: gbarr on 1998/11/27 04:03:58
+ Log: integrate change#2159 from mainline
+
+ Data::Dumper update
+ Branch: maint-5.005/perl
+ !> ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
+ !> ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Todo t/lib/dumper.t
+____________________________________________________________________________
+[ 2313] By: gbarr on 1998/11/27 03:04:21
+ Log: Fix typo in change#2312
+ Branch: maint-5.005/perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 2312] By: gbarr on 1998/11/27 03:03:03
+ Log: integrate change#1837,1967,1986,2060,2068,2146,2214,2224,2300,2301 from mainline
+
+ (via private mail)
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Date: Sat, 05 Sep 1998 01:23:58 -0400 (EDT)
+ Message-id: <01J1FH7R43NS002F14@cor.newman.upenn.edu>
+ Subject: [Patch 5.005_02] Miscellaneous VMS cleanup
+
+ correct bugs exposed in MM_Unix.pm by commenting out Selfloader
+ (MAN3PODS cannot be set to ' '; stray stricture violation)
+
+ qualify names of builtins
+
+ handle '::' in section names properly
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 17 Oct 1998 12:57:54 -0500
+ Message-ID: <19981017125754.C510@pobox.com>
+ Subject: Re: pod2html
+
+ From: Zachary Miller <zcmiller@simon.er.usgs.gov>
+ Date: Tue, 20 Oct 1998 20:52:20 -0500
+ Message-Id: <199810210152.UAA07792@simon.er.usgs.gov>
+ Subject: Exporter.pm's export_to_level() argument handling buggy
+
+ hand-apply whitespace-mutiliated patch
+ From: "vishal bhatia" <vishalb@hotmail.com>
+ Date: Wed, 28 Oct 1998 23:45:32 PST
+ Message-ID: <19981029074534.2334.qmail@hotmail.com>
+ Subject: [PATCH 5.005_52]Compiling modules,more bugfixes for B
+
+ typo in newHVhv()
+
+ avoid endless loops in Text::Wrap (from a suggestion by Lupe
+ Christoph <lupe@alanya.m.isar.de>)
+
+ properly free temporaries created by threads
+
+ fix PL_defoutgv leak under threads
+ Branch: maint-5.005/perl
+ !> (integrate 31 files)
+____________________________________________________________________________
+[ 2311] By: gbarr on 1998/11/27 01:31:36
+ Log: integrate change#2210 from mainline
+
+ fix AvREALISH bogusness
+ Branch: maint-5.005/perl
+ ! av.c
+ !> t/op/array.t
+____________________________________________________________________________
+[ 2310] By: gbarr on 1998/11/27 00:20:21
+ Log: integrate changes#2235,2299,2300 from mainline
+
+ catch a neophyte trap: open(<FH>), close(<FH>) etc.
+
+ fix C<if (...) { package Foo; ... }> misoptimization that fails
+ to set the package for the block properly
+
+ properly free temporaries created by threads
+ Branch: maint-5.005/perl
+ ! ext/Thread/Thread.xs op.c perl.h util.c
+ !> t/comp/package.t
+____________________________________________________________________________
+[ 2309] By: gbarr on 1998/11/27 00:16:36
+ Log: integrate change#2298 from mainline
+ Branch: maint-5.005/perl
+ !> universal.c
+____________________________________________________________________________
+[ 2308] By: gbarr on 1998/11/27 00:11:44
+ Log: Updates for MPE/iX DynaLoader and installperl, via private mail
+ forwarded by Jarkko Hietaniemi from Mark Bixby
+ Branch: maint-5.005/perl
+ ! ext/DynaLoader/dl_mpeix.xs installperl
+____________________________________________________________________________
+[ 2307] By: gbarr on 1998/11/27 00:07:27
+ Log: Remove docs for feature not in _0*
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 2306] By: gbarr on 1998/11/26 23:44:47
+ Log: Allow PL_FILES to have multiple targets from one source by allowing
+ an array ref as the value in the hash
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 2305] By: gbarr on 1998/11/26 23:38:06
+ Log: fix unsigned variables to use SvUV and sv_setuv
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/typemap
+____________________________________________________________________________
+[ 2304] By: gbarr on 1998/11/26 23:36:17
+ Log: Fix embeded \n in ABSTRACT and <> in AUTHOR
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 2302] By: gbarr on 1998/11/26 15:27:03
+ Log: integrate changes#2177,2189,2228,2229 from cfgperl
+
+ 0**0 = 1, from
+
+ From: d-lewart@uiuc.edu (Daniel S. Lewart)
+ Subject: Math::Complex 0**0 patches
+ Date: Sun, 1 Nov 1998 19:21:48 -0600 (CST)
+ Message-Id: <199811020121.TAA28310@staff2.cso.uiuc.edu>
+
+ sysio.t failure: fix undefined order of evaluation, from
+
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ Subject: Not OK: perl 5.00553 on alpha-thread 5.0 [PATCH]
+ Date: 4 Nov 1998 01:22:30 +0200
+ Message-ID: <MLIST_199811032227.RAA143892@web.zk3.dec.com>
+
+ From: "Martin J. Bligh" <mbligh@sequent.com>
+ Message-ID: <187803647.910720870@w-186d219.rhe.sequent.com>
+ Subject: Re: Making Perl work on DYNIX/ptx
+ Date: Tue, 10 Nov 1998 18:01:10 -0800
+
+ From: "Martin J. Bligh" <mbligh@sequent.com>
+ Subject: Re: Making Perl work on DYNIX/ptx
+ Date: Tue, 10 Nov 1998 16:24:26 -0800
+ Message-ID: <181999655.910715066@w-186d219.rhe.sequent.com>
+ Branch: maint-5.005/perl
+ +> ext/DB_File/hints/dynixptx.pl ext/POSIX/hints/dynixptx.pl
+ ! pp_sys.c
+ !> hints/dynixptx.sh lib/Math/Complex.pm t/lib/complex.t
+____________________________________________________________________________
+[ 2297] By: gbarr on 1998/11/24 02:32:38
+ Log: integrate change#2266 from cfgperl
+ From: John Tobey <jtobey@channel1.com>
+ Subject: [PATCH] perlfaq typos
+ To: perl5-porters@perl.com
+ Date: 22 Nov 1998 04:25:15 +0200
+ Message-ID: <MLIST_m0zhPeF-000FOgC@feynman.localnet>
+ Branch: maint-5.005/perl
+ !> pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ !> pod/perlfaq7.pod pod/perlfaq8.pod
+____________________________________________________________________________
+[ 2296] By: gbarr on 1998/11/24 01:39:18
+ Log: integrated changes#2011,2092,2106,2108,2143 from cfgperl
+
+ More robust yacc/bison failure output handling.
+
+ More robustness.
+
+ Bison says 'parse error', not 'parser error'.
+
+ The "parse error" must be converted to "syntax error",
+ just matching it aint' enough.
+
+ There can be multiple yacc/bison errors.
+ Branch: maint-5.005/perl
+ !> t/comp/require.t t/op/misc.t t/pragma/subs.t
+ !> t/pragma/warning.t
+____________________________________________________________________________
+[ 2295] By: gbarr on 1998/11/24 00:49:28
+ Log: integrate change#1823 from mainline
+ From: Joe Buehler <jhpb@hekimian.com>
+ Date: 29 Aug 1998 17:13:28 -0400
+ Message-ID: <yd37lzro5jb.fsf@pandora.hekimian.com>
+ Subject: patches for perl 5.005_51 under U/WIN
+ Branch: maint-5.005/perl
+ +> hints/uwin.sh
+ ! Configure
+ !> installman makedepend.SH t/lib/posix.t
+____________________________________________________________________________
+[ 2258] By: gbarr on 1998/11/21 20:48:02
+ Log: Another Configure patch from Jarkko
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 2257] By: gbarr on 1998/11/21 17:23:13
+ Log: Big Configure patch from Jarkko Hietaniemi <jhi@iki.fi> via
+ private mail
+ Branch: maint-5.005/perl
+ ! Configure Makefile.SH config_h.SH hints/dec_osf.sh
+ ! hints/freebsd.sh hints/irix_6.sh hints/linux.sh
+ ! hints/next_3.sh hints/os390.sh pp_sys.c
+____________________________________________________________________________
+[ 2239] By: gbarr on 1998/11/14 03:59:58
+ Log: more doc changes from mainline
+ Branch: maint-5.005/perl
+ ! pod/perldiag.pod pod/perlfunc.pod pod/perlre.pod
+ !> INSTALL README.vms vms/ext/Stdio/Stdio.pm
+____________________________________________________________________________
+[ 2238] By: gbarr on 1998/11/14 02:51:51
+ Log: integrate doc changes from mainline, including
+ changes#1796,1811,1830,1831,1844,1846,1876,1905,2149,2152
+ Branch: maint-5.005/perl
+ !> README.os390 pod/perl.pod pod/perldelta.pod pod/perlfaq1.pod
+ !> pod/perlform.pod pod/perlfunc.pod pod/perlguts.pod
+ !> pod/perlipc.pod pod/perllocale.pod pod/perlport.pod
+ !> pod/perlref.pod pod/perlrun.pod pod/perlvar.pod pod/perlxs.pod
+ !> pod/pod2man.PL
+____________________________________________________________________________
+[ 2237] By: gbarr on 1998/11/14 02:51:49
+ Log: integrate change#1847 from mainline
+ From: Roderick Schertler <roderick@argon.org>
+ Date: Wed, 09 Sep 1998 23:52:48 -0400
+ Message-ID: <20567.905399568@eeyore.ibcinc.com>
+ Subject: seed srand from /dev/urandom when possible
+ Branch: maint-5.005/perl
+ ! pp.c
+____________________________________________________________________________
+[ 2232] By: gbarr on 1998/11/13 03:12:37
+ Log: integrate change#2215 from mainline
+ set close-on-exec bit on pipe() FDs
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod pod/perlvar.pod pp_sys.c
+____________________________________________________________________________
+[ 2231] By: gbarr on 1998/11/13 02:16:03
+ Log: integrate change#2188 from mainline
+ fix return value of win32_pclose()
+ Branch: maint-5.005/perl
+ !> win32/win32.c
+____________________________________________________________________________
+[ 2218] By: gbarr on 1998/11/08 16:48:44
+ Log: From: Graham Barr <gbarr@ti.com>
+ Date: Mon, 2 Nov 1998 07:38:52 -0600
+ Message-ID: <19981102073852.A12751@asic.sc.ti.com>
+ Subject: [PATCH 5.005_*] Re: IPC::Msg 1.03
+ Branch: maint-5.005/perl
+ ! ext/IPC/SysV/Msg.pm
+____________________________________________________________________________
+[ 2217] By: gbarr on 1998/11/08 05:22:39
+ Log: fix changes in 2213 not to break binary compat
+ Branch: maint-5.005/perl
+ ! pp_ctl.c proto.h
+____________________________________________________________________________
+[ 2216] By: gbarr on 1998/11/08 04:21:01
+ Log: integrate change#2192 from mainline
+ indeterminate order-of-evaluation fixes
+ Branch: maint-5.005/perl
+ ! mg.c
+____________________________________________________________________________
+[ 2213] By: gbarr on 1998/11/08 00:39:44
+ Log: integrate change#2051 from mainline
+ properly restore PL_rsfp_filters after require
+ Branch: maint-5.005/perl
+ ! embed.h global.sym objXSUB.h objpp.h pp_ctl.c proto.h scope.c
+ ! scope.h
+____________________________________________________________________________
+[ 2212] By: gbarr on 1998/11/07 23:13:29
+ Log: integrate changes#1914,1925,1926,1945,1956,1987 from mainline
+
+ normalize tm struct passed to strftime() with mktime()
+ From: Spider Boardman <spider@orb.nashua.nh.us>
+ Date: Wed, 30 Sep 1998 15:12:09 -0400
+ Message-Id: <199809301912.PAA26119@Orb.Nashua.NH.US>
+ Subject: [PATCH 5.005_52] Re: POSIX::strftime returns incorrect date
+
+ disable USE_THREADS when PERL_OBJECT is enabled
+
+ From: Mark-Jason Dominus <mjd@plover.com>
+ Date: Sun, 04 Oct 1998 14:48:11 -0400
+ Message-ID: <19981004184811.16048.qmail@plover.com>
+ Subject: PATCH: perldoc -f does not locate -e, -r, -x, etc.
+
+ defer "deep recursion" warnings until CXt_SUB context is properly
+ set up
+
+ Mutexen should be initialized only once.
+
+ perldoc pod update
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Date: 06 Oct 1998 23:56:51 -0600
+ Message-ID: <m3g1d0kj8c.fsf@perrin.dimensional.com>
+ Subject: [PATCH _02 and _52] perldoc
+ Branch: maint-5.005/perl
+ ! gv.c op.c pp_hot.c
+ !> ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs utils/perldoc.PL
+ !> win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2207] By: gbarr on 1998/11/06 01:36:17
+ Log: integrate changes#1912,1948 from mainline
+ change warning about glob process failure
+ Branch: maint-5.005/perl
+ ! pod/perldiag.pod pp_hot.c
+____________________________________________________________________________
+[ 2200] By: gbarr on 1998/11/05 04:26:26
+ Log: integrate changes#1840,1855,1860,1882,1884,1891,1900,1907 from mainline
+ pl2bat tweak from Tye McQueen <tye@metronet.com>
+
+ reset errno after C<require> search (as suggested by Larry)
+
+ upgrade to CPAN-1.40
+
+ missing file in last submit (1881)
+
+ temporarily disable perl malloc for a2p until we clean up
+ conflicting malloc() declarations everywhere
+
+ Fixed apostrophe problem from Mark Knutsen.
+
+ use SETERRNO() to reset errno (suggested by Charles Bailey)
+
+ applied patches, but retained old behavior for win32 (where compilers
+ can't read from stdin at all)
+ From: Graham Barr <gbarr@ti.com>
+ Date: Mon, 28 Sep 1998 09:41:49 -0500
+ Message-ID: <19980928094149.B26576@asic.sc.ti.com>
+ Subject: Re: 5.005_51 Errno invokes cpprun incorrectly
+ --
+ Date: Tue, 29 Sep 1998 12:35:43 -0500
+ Message-ID: <19980929123543.Z26576@asic.sc.ti.com>
+ Subject: Re: 5.005_51 Errno invokes cpprun incorrectly
+
+ and ext/Errno/Errno_pm.PL from change#2050
+ Branch: maint-5.005/perl
+ ! perl.h pp_ctl.c proto.h sv.h
+ !> ext/Errno/Errno_pm.PL lib/CPAN.pm lib/CPAN/FirstTime.pm
+ !> win32/bin/pl2bat.pl x2p/Makefile.SH
+____________________________________________________________________________
+[ 2199] By: gbarr on 1998/11/05 03:35:00
+ Log: integrate changes#1817,1856,1869,1909 from mainline
+ updated usethreads hints for hpux 10.X
+ From: Matthew T Harden <mthard@mthard1.monsanto.com>
+ Date: Fri, 28 Aug 1998 14:10:42 GMT
+ Message-Id: <199808281410.AA11058@mthard1.monsanto.com>
+ Subject: Re: OK: perl 5.00502 on PA-RISC1.1-thread 10.20 (UNINSTALLED)
+
+ update hints for OPENSTEP 4.2 on i386
+ From: Gerben Wierda <Gerben_Wierda@RnA.nl>
+ Date: Sun, 20 Sep 1998 01:03:18 +0200
+ Message-Id: <9809192303.AA29190@Spike>
+ Subject: Perl 5.005_02 compilation problems
+
+ use STRICT_ALIGNMENT on IRIX to allow usemymalloc=y again
+ From: Scott Henry <scotth@sgi.com>
+ Date: 13 Aug 1998 09:52:15 PDT
+ Message-Id: <yd8pve46czk.fsf@hoshi.engr.sgi.com>
+ Subject: [PATCH] Irix USE_LONG_LONG/malloc.c incompatibility (was...)
+
+ update SCO hints for dynamic loading
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 28 Sep 1998 16:50:38 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980928164648.8130E-100000@newton.phys>
+ Subject: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV
+ --
+ Date: Tue, 29 Sep 1998 16:48:55 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980929164612.8634A-100000@newton.phys>
+ Subject: Re: [PATCH 5.004_04-MAINT_TRIAL_5 and 5.005_xx] Re: Perl on SCO_SV
+ Branch: maint-5.005/perl
+ !> hints/hpux.sh hints/irix_6.sh hints/next_4.sh hints/sco.sh
+____________________________________________________________________________
+[ 2198] By: gbarr on 1998/11/05 03:00:51
+ Log: integrate OS2 changes from mainline, change#1836,1930,1996,2063
+ and os2/os2,c from #2145
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 5 Sep 1998 00:14:51 -0400 (EDT)
+ Message-Id: <199809050414.AAA19801@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] OS/2 spawning typos
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199810050637.CAA07781@monk.mps.ohio-state.edu>
+ Date: Mon, 5 Oct 1998 02:37:43 -0400 (EDT)
+ Subject: [PATCH 5.005_52] Cumulative OS/2-related patch
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 13 Oct 1998 04:46:00 -0400 (EDT)
+ Message-Id: <199810130846.EAA00769@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_52] Memory overrun in os2.c
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 18 Oct 1998 23:20:57 -0400 (EDT)
+ Message-Id: <199810190320.XAA28249@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Improve sbrk() on OS/2
+
+ remaining PL_foo stragglers
+ Branch: maint-5.005/perl
+ ! mg.c perl_exp.SH util.c
+ !> hints/os2.sh os2/Changes os2/Makefile.SHs os2/os2.c
+____________________________________________________________________________
+[ 2197] By: gbarr on 1998/11/05 02:15:53
+ Log: integrate changes#1826,1862 from mainline
+
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 12 Aug 1998 22:41:37 +0300 (EET DST)
+ Message-Id: <199808121941.WAA06263@alpha.hut.fi>
+ Subject: [PATCH] 5.004_50 or 5.005_02: get rid of interp.sym because not even AIX needs it
+
+ remove bogus warn()
+ Branch: maint-5.005/perl
+ - interp.sym
+ ! MANIFEST Makefile.SH embed.pl perl_exp.SH
+____________________________________________________________________________
+[ 2194] By: gbarr on 1998/11/05 01:26:46
+ Log: integarte malloc.c changes from mainline change#1807,2112,2133
+ Branch: maint-5.005/perl
+ !> malloc.c
+____________________________________________________________________________
+[ 2193] By: gbarr on 1998/11/05 01:25:31
+ Log: integrate changes#1763,1778,1801,1804 from mainline
+
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Sun, 2 Aug 1998 16:33:18 -0500 (CDT)
+ Message-ID: <13764.55116.921952.837027@alias-2.pr.mcs.net>
+ Subject: [PATCH] Eliminate superfluous RV2p[AH]Vs in oops[AH]V()
+
+ Implicit require during compile reset line numbering
+
+ silence redefined warning for XS(INIT) {}
+
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Sun, 9 Aug 1998 22:38:23 +0200
+ Message-ID: <19980809223823.A215@cdata.tvnet.hu>
+ Subject: [PATCH 5.5002] dos-djgpp update
+ Branch: maint-5.005/perl
+ ! op.c pp_ctl.c
+ !> t/io/fs.t
+____________________________________________________________________________
+[ 2176] By: gbarr on 1998/11/02 04:51:48
+ Log: integrate change#2030 from mainline
+
+ fix handling of mayhaps-extended @_ in goto &sub
+ Branch: maint-5.005/perl
+ ! av.c pp_ctl.c
+ !> t/op/goto.t
+____________________________________________________________________________
+[ 2175] By: gbarr on 1998/11/02 04:32:02
+ Log: integrate chnage#1934,1935 from mainline
+ fix USE_THREADS coredump due to uninitialized PL_hv_fetch_ent_mh
+ add test for previous fix
+ Branch: maint-5.005/perl
+ ! util.c
+ !> ext/Thread/create.t
+____________________________________________________________________________
+[ 2174] By: gbarr on 1998/11/02 04:22:20
+ Log: integrate change#1863,1881 from mainline
+
+ provide locked access to string table for USE_THREADS
+
+ serial access to PL_x[inpr]v_root for USE_THREADS
+ Branch: maint-5.005/perl
+ ! embedvar.h objXSUB.h perl.c proto.h sv.c
+ !> hv.c intrpvar.h thread.h
+____________________________________________________________________________
+[ 2173] By: gbarr on 1998/11/02 04:10:46
+ Log: integrate change#1990 from mainline
+
+ provide option to enable optimization with VC (suggested by Jan
+ Dubois)
+ Branch: maint-5.005/perl
+ !> win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 2172] By: gbarr on 1998/11/02 02:52:29
+ Log: integrate changes#1944,1948,1966 from mainline
+
+ change#1614 merely disabled earlier fix (doh!); undo it and properly
+ fixup the cop_seq value that must be seen by lexical lookups that
+ emanate within eval''
+
+ tweak to make fix in change#1944 behave correctly for closures
+ created within eval''
+ Branch: maint-5.005/perl
+ ! op.c pp_ctl.c pp_hot.c scope.c
+ !> cop.h t/op/eval.t
+____________________________________________________________________________
+[ 2171] By: gbarr on 1998/11/01 03:59:39
+ Log: integrate changes 1835,2003,2067 and File::Find change in 1938
+ warn on C<my($foo,$foo)>
+
+ silence -w noises (suggested by Greg Bacon) Term::Complete
+
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Wed, 21 Oct 1998 00:55:51 +0200
+ Message-ID: <36380269.55370608@smtp1.ibm.net>
+ Subject: Make _really_ sure Dynaloader.xs code is initialized only once
+ Branch: maint-5.005/perl
+ ! op.c pod/perldiag.pod
+ !> ext/DynaLoader/DynaLoader_pm.PL lib/File/Find.pm
+ !> lib/Term/Complete.pm
+____________________________________________________________________________
+[ 2170] By: gbarr on 1998/11/01 03:48:38
+ Log: integrate change 1992 from mainline
+
+ applied suggested patch with small doc tweak
+ From: Gisle Aas <gisle@aas.no>
+ Date: 11 Oct 1998 12:53:13 +0200
+ Message-ID: <m3u31bfjza.fsf@furu.g.aas.no>
+ Subject: Re: [PATCH 5.005_52] Optional syswrite LENGTH argument
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod pp_sys.c
+ !> opcode.h opcode.pl t/op/sysio.t t/op/tiehandle.t
+____________________________________________________________________________
+[ 2168] By: gbarr on 1998/11/01 01:58:58
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Fri, 09 Oct 1998 23:28:31 +0200
+ Message-ID: <36217b7f.3193091@smtp1.ibm.net>
+ Subject: [PATCH 5.005_02] Allow XS access to vtbl_*s when compiled with PERL_OBJECT
+ Branch: maint-5.005/perl
+ ! XSUB.h
+____________________________________________________________________________
+[ 2167] By: gbarr on 1998/11/01 01:22:41
+ Log: integrate change#2029 from mainline
+ restore sanity to "constant" references
+ Branch: maint-5.005/perl
+ ! op.c pod/perldiag.pod
+ !> lib/constant.pm t/pragma/constant.t
+____________________________________________________________________________
+[ 2166] By: gbarr on 1998/11/01 01:04:24
+ Log: integrate changes#1895,1896,2066,2147,2148 from mainline
+ fix win32_stat() to do the right thing for share names
+
+ small tweak on last change
+
+ recognize '%' as a shell metachar for win32
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Tue, 20 Oct 1998 21:57:35 +0200
+ Message-ID: <3636ea31.49170453@smtp1.ibm.net>
+ Subject: [PATCH 5.005_02, Win32] Re: %ENV% not expanded in backquotes?
+
+ tweaked version of suggested patch
+ From: Anton Berezin <tobez@plab.ku.dk>
+ Date: 29 Oct 1998 14:48:54 +0100
+ Message-ID: <86yapzv5q1.fsf@lion.plab.ku.dk>
+ Subject: [PATCH 5.005_52] One more problem with win32_stat and MSVC
+
+ From: Anton Berezin <tobez@plab.ku.dk>
+ Date: 29 Oct 1998 17:06:25 +0100
+ Message-ID: <86pvbbuzcu.fsf@lion.plab.ku.dk>
+ Subject: [PATCH 5.005_52] win32_opendir() fails on empty drives
+ Branch: maint-5.005/perl
+ !> win32/win32.c
+____________________________________________________________________________
+[ 2165] By: gbarr on 1998/11/01 00:10:15
+ Log: integrated changes#1941,1942,1943,1975,2061,2111,2151 from mainline
+
+ don't longjmp() in pp_goto() (regressive bug from old single-stack
+ implementation)
+
+ force copy of substrings when matching against temporaries
+
+ ensure recursive attempts to findlex()icals know enough about where
+ the last eval'' context was encountered
+
+ propagate typeness of lexicals while cloning them
+
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 17 Oct 1998 22:22:02 -0500
+ Message-ID: <19981017222202.J510@pobox.com>
+ Subject: Re: '*' prototype does not allow bareword with strict
+
+ smarter C<$SIG{FOO} = BAREWORD;> warning
+
+ From: Mark-Jason Dominus <mjd@plover.com>
+ Date: Fri, 30 Oct 1998 14:24:23 EST
+ Message-Id: <19981030192423.27276.qmail@plover.com>
+ Subject: PATCH: (5.005_02) a2p should use `chomp' instead of `chop'
+ Branch: maint-5.005/perl
+ ! op.c pp_ctl.c pp_hot.c t/op/pat.t toke.c
+ !> t/op/eval.t t/op/runlevel.t x2p/walk.c
+____________________________________________________________________________
+[ 2158] By: gbarr on 1998/10/31 05:03:02
+ Log: integrate changes#1821 & 1857 from mainline
+
+ s/runops/CALLRUNOPS/
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 22 Sep 1998 17:30:16 -0400 (EDT)
+ Message-Id: <199809222130.RAA17034@monk.mps.ohio-state.edu>
+ Subject: More verbose Test::Harness [PATCH]
+ Branch: maint-5.005/perl
+ !> cc_runtime.h lib/Test/Harness.pm
+____________________________________________________________________________
+[ 2157] By: gbarr on 1998/10/31 02:35:07
+ Log: integrate change#1839 from mainline
+ From: Drago Goricanec <drago@raptor.otsd.ts.fujitsu.co.jp>
+ Date: Mon, 7 Sep 1998 17:36:09 +0900
+ Message-Id: <199809070836.RAA14631@raptor.otsd.ts.fujitsu.co.jp>
+ Subject: Thread::cond_wait bug in 5.005.51 causes deadlock
+ Branch: maint-5.005/perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 2156] By: gbarr on 1998/10/31 02:22:11
+ Log: integrate change#1829 from mainline
+ fix problematic typecast in filter_del()
+ From: Mark P Lutz <tecmpl1@triton.ca.boeing.com>
+ Date: Mon, 31 Aug 1998 21:13:11 GMT
+ Message-Id: <199808312113.VAA53356@triton.ca.boeing.com>
+ Subject: perl5.005_02 does not build on Cray T90
+ Branch: maint-5.005/perl
+ ! toke.c
+____________________________________________________________________________
+[ 2155] By: gbarr on 1998/10/31 01:59:08
+ Log: integrate chnages#1824,2118 from mainline
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 29 Aug 1998 17:38:30 -0400 (EDT)
+ Message-Id: <199808292138.RAA18359@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Protect debugger from nonlocal exits
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 28 Oct 1998 01:23:27 -0500 (EST)
+ Message-Id: <199810280623.BAA06968@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.00552] Minor debugger tweaks
+ Branch: maint-5.005/perl
+ !> lib/perl5db.pl
+____________________________________________________________________________
+[ 2154] By: gbarr on 1998/10/31 01:06:35
+ Log: integrate all lib/ExtUtils/... changes from mainline
+ Branch: maint-5.005/perl
+ !> lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm
+ !> lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MM_Win32.pm
+ !> lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mkbootstrap.pm
+ !> lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp
+____________________________________________________________________________
+[ 2139] By: gbarr on 1998/10/30 04:17:53
+ Log: apply chnage#2071 from mainline
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 17 Oct 1998 20:42:41 -0500
+ Message-ID: <19981017204241.G510@pobox.com>
+ Subject: Re: taint checking for: use lib "$ENV{'EVIL'}"
+ Branch: maint-5.005/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 2138] By: gbarr on 1998/10/30 04:14:35
+ Log: apply change#2077 from mainline
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 24 Oct 1998 21:45:50 -0500
+ Message-ID: <19981024214550.C508@pobox.com>
+ Subject: Re: die with a reference should use overload "" operator
+ Branch: maint-5.005/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 2137] By: gbarr on 1998/10/30 04:01:06
+ Log: integrate change#1937 from mainline
+ fix $/ init for USE_THREADS
+ Branch: maint-5.005/perl
+ ! perl.c
+____________________________________________________________________________
+[ 2136] By: gbarr on 1998/10/30 03:40:55
+ Log: apply change#2076 from mainline
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 24 Oct 1998 12:45:21 -0500
+ Message-ID: <19981024124521.C512@pobox.com>
+ Subject: [PATCH 5.005_02] Re: Auto-incrementing tied scalar causes SEGV
+ Branch: maint-5.005/perl
+ ! sv.c
+____________________________________________________________________________
+[ 2135] By: gbarr on 1998/10/30 03:28:29
+ Log: integrate change#1873 from mainline
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 25 Aug 1998 04:29:49 -0400 (EDT)
+ Message-Id: <199808250829.EAA02470@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Extraneous warning for (?()A|B)
+ Branch: maint-5.005/perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 2134] By: gbarr on 1998/10/30 03:15:12
+ Log: integrate change#1816 from mainline
+ don't create empty directories in installperl
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Fri, 21 Aug 1998 11:29:24 +0100 (BST)
+ Message-Id: <199808211029.LAA00551@cyclone.cise.npl.co.uk>
+ Subject: [PATCH 5.005_02] install: empty dirs
+ Branch: maint-5.005/perl
+ !> installperl
+____________________________________________________________________________
+[ 2132] By: gbarr on 1998/10/30 01:39:00
+ Log: integrate changes#1815 & 1828 from mainline
+ make behavior of /(a{3})+/ like /(aaa)+/ w.r.t where it matches
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 21 Aug 1998 05:41:02 -0400 (EDT)
+ Message-Id: <199808210941.FAA16467@monk.mps.ohio-state.edu>
+ Subject: Re: your mail
+
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 31 Aug 1998 14:52:10 -0400 (EDT)
+ Message-Id: <199808311852.OAA24676@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_5*] (?>) broken in RE
+ Branch: maint-5.005/perl
+ ! regexec.c
+ !> t/op/re_tests
+____________________________________________________________________________
+[ 2131] By: gbarr on 1998/10/30 01:09:19
+ Log: integrate change#1947 from mainline
+ let docatch() pass the buck when restartop turns out to be null,
+ making exceptions in BEGIN{} propagate as expected
+ Branch: maint-5.005/perl
+ ! pp_ctl.c
+ !> t/op/misc.t
+____________________________________________________________________________
+[ 2129] By: gbarr on 1998/10/29 14:53:11
+ Log: integrate change#1810 from mainline
+ fix bogus integerization of pop()'s return value
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Sat, 15 Aug 1998 23:27:54 -0400
+ Message-Id: <199808160327.XAA05186@aatma.engin.umich.edu>
+ Subject: Re: Complex expression does integer arithmetic
+ Branch: maint-5.005/perl
+ !> opcode.h opcode.pl
+____________________________________________________________________________
+[ 2128] By: gbarr on 1998/10/29 14:28:13
+ Log: integrate change#1870 from mainline
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Fri, 14 Aug 1998 09:20:16 PDT
+ Message-Id: <3.0.5.32.19980814092016.00b37dc0@ous.edu>
+ Subject: [PATCH 5.005_02] (and _5x I expect) VMS config procedure patch
+ Branch: maint-5.005/perl
+ !> configure.com
+____________________________________________________________________________
+[ 2127] By: gbarr on 1998/10/29 13:36:29
+ Log: Integrate change#1789 from mainline
+ delay freeing itervar so C<for $i (@a) { return($i) }> works
+ Branch: maint-5.005/perl
+ !> cop.h t/cmd/for.t
+____________________________________________________________________________
+[ 2123] By: gbarr on 1998/10/29 02:43:01
+ Log: Apply change#2075 from mainline
+ fix C<print $n += 5;> etc.
+ Branch: maint-5.005/perl
+ ! toke.c
+____________________________________________________________________________
+[ 2122] By: gbarr on 1998/10/29 02:40:31
+ Log: Apply change#2070 from mainline
+ avoid bogus line number in XSUB redefined warnings
+ Branch: maint-5.005/perl
+ ! op.c
+____________________________________________________________________________
+[ 2121] By: gbarr on 1998/10/29 02:38:59
+ Log: Apply change#2052 from mainline
+ avoid the circular refcnt logic in magic_mutexfree()
+ Branch: maint-5.005/perl
+ ! mg.c pp.c pp_hot.c
+____________________________________________________________________________
+[ 2120] By: gbarr on 1998/10/29 02:36:23
+ Log: Remove "5.005" hard-coded and expose vtbl_* from the perl DLL
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Date: Mon, 28 Sep 1998 08:49:13 -0700
+ Message-ID: <000001bdeaf7$8a189350$a32fa8c0@tau.Active>
+ Subject: PATCH [5.005_02] update
+ Branch: maint-5.005/perl
+ ! embed.h global.sym objXSUB.h objpp.h perl.h proto.h util.c
+ ! win32/win32.c
+____________________________________________________________________________
+[ 2084] By: gbarr on 1998/10/25 19:09:11
+ Log: Integrate change#2069 from mainline
+ From: Martijn Koster <mak@excitecorp.com>
+ Date: Wed, 21 Oct 1998 13:12:03 +0100
+ Message-ID: <19981021131203.A15661@excitecorp.com>
+ Subject: File::Path::mkpath reports the wrong error
+ Branch: maint-5.005/perl
+ !> lib/File/Path.pm
+____________________________________________________________________________
+[ 2083] By: gbarr on 1998/10/25 18:48:39
+ Log: Integrate change#1965 from mainline
+ use better numbers for exitstatus test
+ Branch: maint-5.005/perl
+ !> t/op/die_exit.t
+____________________________________________________________________________
+[ 2082] By: gbarr on 1998/10/25 18:22:54
+ Log: Apply change 2054 from mainline
+ disallow 'x' in hex numbers (except leading '0x')
+ From: Gisle Aas <gisle@aas.no>
+ Date: 16 Oct 1998 16:33:12 +0200
+ Message-ID: <m3n26wtw47.fsf@furu.g.aas.no>
+ Subject: Re: [PATCH 5.005_52] 'x' is not a legal hex digit
+ Branch: maint-5.005/perl
+ ! perlvars.h util.c
+ !> t/op/oct.t
+____________________________________________________________________________
+[ 2081] By: gbarr on 1998/10/25 17:58:04
+ Log: Apply change #1998 from mainline
+ skip readonly vars and unref references when doing a reset()
+ Branch: maint-5.005/perl
+ ! sv.c
+____________________________________________________________________________
+[ 2080] By: gbarr on 1998/10/25 16:06:35
+ Log: Integrate changes #2072 & #1993 from mainline
+ fix bug in B::CC::pp_sassign()
+ From: "vishal bhatia" <vishalb@hotmail.com>
+ Date: Sun, 11 Oct 1998 18:41:38 PDT
+ Message-ID: <19981012014139.19614.qmail@hotmail.com>
+ Subject: B::CC problems with pp_sassign routine
+ implement C<goto &func> and other fixes (via private mail)
+ From: "vishal bhatia" <vishalb@hotmail.com>
+ Date: Wed, 21 Oct 1998 22:59:03 PDT
+ Message-Id: <19981022055904.20083.qmail@hotmail.com>
+ Subject: [PATCH 5.005_52] More fixes for B
+ Branch: maint-5.005/perl
+ !> ext/B/B.pm ext/B/B.xs ext/B/B/C.pm ext/B/B/CC.pm
+____________________________________________________________________________
+[ 2079] By: gbarr on 1998/10/25 14:08:00
+ Log: integrate from mainline more FSF address changes
+ Branch: maint-5.005/perl
+ !> Copying ext/B/README lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 2053] By: gbarr on 1998/10/25 04:56:47
+ Log: From: Graham Barr <gbarr@pobox.com>
+ Date: Sat, 17 Oct 1998 23:05:18 -0500
+ Message-ID: <19981017230518.K510@pobox.com>
+ Subject: Re: redo LOOP not restoring $` $' $&
+ Branch: maint-5.005/perl
+ ! cop.h t/cmd/while.t
+____________________________________________________________________________
+[ 2048] By: gbarr on 1998/10/24 04:20:10
+ Log: Change Free Software Foundation address in README
+ Branch: maint-5.005/perl
+ !> README
+____________________________________________________________________________
+[ 2047] By: gbarr on 1998/10/24 04:02:20
+ Log: Remove #ifdef DEBUGGING around SvTEMP_off
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Mon, 28 Sep 1998 15:23:39 -0400
+ Message-Id: <199809281923.PAA10303@aatma.engin.umich.edu>
+ Subject: Re: [PATCH] Re: 5.005_52: the miniperl coredump: touch magic and you're toast
+ Branch: maint-5.005/perl
+ ! scope.c
+____________________________________________________________________________
+[ 2046] By: gbarr on 1998/10/24 04:00:54
+ Log: use cpp symbols instead of hardwired constants
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Mon, 05 Oct 1998 09:23:33 +0100
+ Message-Id: <199810050823.JAA00891@crypt.compulink.co.uk>
+ Subject: [PATCH 5.005_52] By the numbers (resend)
+ Branch: maint-5.005/perl
+ ! op.c
+____________________________________________________________________________
+[ 2045] By: gbarr on 1998/10/24 03:50:25
+ Log: squelch undef warnings
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Fri, 02 Oct 1998 11:01:14 +0100
+ Message-Id: <199810021001.LAA19214@crypt.compulink.co.uk>
+ Subject: [PATCH] Re: Apparent bug in Math::BigInt
+ Branch: maint-5.005/perl
+ !> lib/Math/BigInt.pm
+____________________________________________________________________________
+[ 2044] By: gbarr on 1998/10/24 03:47:24
+ Log: Add note to INSTALL about ANSI C
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 2043] By: gbarr on 1998/10/24 02:38:12
+ Log: make C<goto &sub> AUTOLOAD-aware (autouse now works for modules
+ that are autoloaded)
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Thu, 24 Sep 1998 03:01:01 -0400
+ Message-Id: <199809240701.DAA16223@aatma.engin.umich.edu>
+ Subject: Re: autouse and Getopt::Long don't work together anymore
+ Branch: maint-5.005/perl
+ ! pp_ctl.c t/op/goto.t
+____________________________________________________________________________
+[ 2042] By: gbarr on 1998/10/24 02:16:26
+ Log: From: jarkko.hietaniemi@research.nokia.com (Jarkko Hietaniemi)
+ Date: Wed, 12 Aug 1998 15:42:35 +0300
+ Message-Id: <199808121242.PAA29761@comanche.spices>
+ Subject: [PATCH] 5.004_02 or 5.005_51: fix regexp and tr character ranges in non-ASCII lands
+ Branch: maint-5.005/perl
+ + t/op/tr.t
+ ! MANIFEST perl.h pod/perllocale.pod pod/perlop.pod
+ ! pod/perlre.pod regcomp.c t/pragma/locale.t toke.c
+____________________________________________________________________________
+[ 2021] By: gbarr on 1998/10/20 01:25:23
+ Log: From: Chip Salzenberg <chip@perlsupport.com>
+ Date: Tue, 6 Oct 1998 13:33:05 -0400
+ Message-ID: <19981006133305.A2348@perlsupport.com>
+ Subject: [PATCH] 5.005_02: Eliminate leak on self-ties
+ Branch: maint-5.005/perl
+ ! av.c doop.c hv.c mg.c mg.h pp.c pp_hot.c pp_sys.c scope.c
+ ! t/op/tie.t
+____________________________________________________________________________
+[ 2015] By: gbarr on 1998/10/17 21:49:56
+ Log: make h2xs generate ANSI prototypes
+ Branch: maint-5.005/perl
+ !> utils/h2xs.PL
+____________________________________________________________________________
+[ 2014] By: gbarr on 1998/10/17 20:31:42
+ Log: Fix POSIX::sigprocmask not to check type of $old parameter
+ as it is output only
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 2013] By: gbarr on 1998/10/17 17:51:16
+ Log: From: "Kurt D. Starsinic" <kstar@chapin.edu>
+ Date: Thu, 20 Aug 1998 20:59:03 -0400
+ Message-ID: <19980820205903.A12908@O2.chapin.edu>
+ Subject: [PATCH] h2ph misquotes #error directives
+
+ fix h2ph handling of C<#error "foo">
+ From: SAKAI Kiyotaka <ksakai@netwk.ntt-at.co.jp>
+ Date: Thu, 10 Sep 1998 09:59:33 +0900
+ Message-Id: <19980910095933N.ksakai@netwk.ntt-at.co.jp>
+ Subject: [5.005_02] h2ph problem
+ Branch: maint-5.005/perl
+ !> t/lib/h2ph.pht utils/h2ph.PL
+____________________________________________________________________________
+[ 1985] By: gbarr on 1998/10/17 00:41:40
+ Log: s/last/first/ typo in append_list()
+ Branch: maint-5.005/perl
+ ! op.c
+____________________________________________________________________________
+[ 1984] By: gbarr on 1998/10/17 00:36:51
+ Log: From: "Green, Paul" <pgreen@seussnt.stratus.com>
+ Date: Thu, 10 Sep 1998 00:02:07 -0400
+ Message-ID: <646CD0392810D211B04A00A024BF26FB1022EB@terminator.sw.stratus.com>
+ Subject: RE: [PATCH] 5.005_02 and 5.005_51: Stratus VOS port
+ Branch: maint-5.005/perl
+ + README.vos vos/Changes vos/build.cm vos/compile_perl.cm
+ + vos/config.h vos/config_h.SH_orig vos/perl.bind
+ + vos/test_vos_dummies.c vos/vos_dummies.c vos/vosish.h
+ ! MANIFEST perl.c perl.h pod/perlport.pod
+____________________________________________________________________________
+[ 1983] By: gbarr on 1998/10/17 00:23:31
+ Log: define PUT_svindex(), PUT_opindex()
+ Branch: maint-5.005/perl
+ !> ext/B/B/Assembler.pm
+____________________________________________________________________________
+[ 1982] By: gbarr on 1998/10/17 00:20:57
+ Log: From: Jochen Wiedmann <joe@ispsoft.de>
+ Date: Thu, 17 Sep 1998 17:16:06 +0200
+ Message-ID: <360127B6.E44564A@ispsoft.de>
+ Subject: [PATCH] ExtUtils::MakeMaker::prompt cannot return 0
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1981] By: gbarr on 1998/10/16 02:58:10
+ Log: better CR-handling on shebang line and in formats (fixed variant of
+ patch suggested by Igor Sysoev <igor@nitek.ru>)
+ Branch: maint-5.005/perl
+ ! perl.c toke.c
+____________________________________________________________________________
+[ 1980] By: gbarr on 1998/10/16 02:21:57
+ Log: From: Roderick Schertler <roderick@argon.org>
+ Date: 11 Sep 1998 16:19:21 -0400
+ Message-ID: <pzyarqpfli.fsf@eeyore.ibcinc.com>
+ Subject: Re: Open2 and memory leaks
+ Branch: maint-5.005/perl
+ !> lib/IPC/Open3.pm
+____________________________________________________________________________
+[ 1979] By: gbarr on 1998/10/16 02:15:54
+ Log: integrate change #1908 from mainline
+ Branch: maint-5.005/perl
+ !> lib/File/Find.pm
+____________________________________________________________________________
+[ 1977] By: gbarr on 1998/10/16 01:52:46
+ Log: tests missing from change #1794
+ Branch: maint-5.005/perl
+ ! t/op/re_tests
+____________________________________________________________________________
+[ 1794] By: gbarr on 1998/09/20 15:59:20
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 11 Aug 1998 18:43:29 -0400 (EDT)
+ Message-Id: <199808112243.SAA14243@monk.mps.ohio-state.edu>
+ Subject: Re: Segmentation fault for /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
+ Branch: maint-5.005/perl
+ ! regcomp.c t/op/re_tests
+____________________________________________________________________________
+[ 1793] By: gbarr on 1998/09/20 15:39:41
+ Log: From: Peter Prymmer <pvhp@forte.com>
+ Date: Mon, 10 Aug 98 16:58:22 PDT
+ Message-Id: <9808102358.AA10616@forte.com>
+ Subject: fix for unpack('u') failures on OS/390
+ Branch: maint-5.005/perl
+ ! pp.c
+____________________________________________________________________________
+[ 1792] By: gbarr on 1998/09/20 15:11:33
+ Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Sun, 9 Aug 1998 15:51:48 +0100
+ Message-Id: <E0z5Wp2-00071p-00@taurus.cus.cam.ac.uk>
+ Subject: Fix typo, change "an array" to "a hash"
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1791] By: gbarr on 1998/09/20 14:49:26
+ Log: From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Wed, 16 Sep 1998 22:13:17 -0400
+ Message-Id: <199809170213.WAA10546@aatma.engin.umich.edu>
+ Subject: fill gaps in sig_* entries in win32/config.?c
+ and resync win32/config.?c with Porting/config.sh to pick up apiversion
+ Branch: maint-5.005/perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1790] By: gbarr on 1998/09/20 14:40:56
+ Log: From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Sun, 06 Sep 1998 15:35:11 -0400
+ Message-Id: <199809061935.PAA21531@aatma.engin.umich.edu>
+ Subject: suppress bogus warning on C<sub x {} x()>
+ Branch: maint-5.005/perl
+ ! toke.c
+____________________________________________________________________________
+[ 1784] By: nick on 1998/09/12 09:53:36
+ Log: Two tweaks to allow quiet compile qith egcs-1.1
+ Branch: maint-5.005/perl
+ ! win32/win32.h
+____________________________________________________________________________
+[ 1783] By: gbarr on 1998/09/07 20:33:11
+ Log: Subject: index() applied BM optimization to wrong argument
+ From: larry@wall.org (Larry Wall)
+ Date: Thu, 3 Sep 1998 12:49:13 -0700
+ Message-Id: <199809031949.MAA29566@wall.org>, <199809060004.RAA23792@wall.org>
+ Branch: maint-5.005/perl
+ ! op.c util.c
+____________________________________________________________________________
+[ 1782] By: gbarr on 1998/09/07 18:54:49
+ Log: From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Date: Fri, 28 Aug 1998 00:33:15 -0400
+ Mssage-Id: <199808280433.AAA06767@aatma.engin.umich.edu>
+ Subject: socket problems on NT
+ Branch: maint-5.005/perl
+ ! objXSUB.h
+____________________________________________________________________________
+[ 1759] By: gsar on 1998/08/08 20:57:47
+ Log: pending submit of 5.005_02
+ Branch: maint-5.005/perl
+ ! Changes
+
+----------------
+Version 5.005_02 Second maintenance release of 5.005
+----------------
+
+____________________________________________________________________________
+[ 1758] By: gsar on 1998/08/08 03:45:04
+ Log: set patchlevel.h, other minor tweaks
+ Branch: maint-5.005/perl
+ ! Changes patchlevel.h pod/perlhist.pod pod/perlport.pod
+____________________________________________________________________________
+[ 1757] By: gsar on 1998/08/08 03:33:33
+ Log: prevent lexical leaks from Benchmark into target code (inspired by
+ an attempt by John Allen)
+ Branch: maint-5.005/perl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 1755] By: gsar on 1998/08/07 23:58:33
+ Log: temporary opcode.pl workaround for ebcdic (suggested by
+ David J. Fiander <davidf@mks.com> and M.J.T. Guy)
+ Branch: maint-5.005/perl
+ ! opcode.pl
+____________________________________________________________________________
+[ 1754] By: gsar on 1998/08/07 22:21:10
+ Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Date: Fri, 7 Aug 1998 09:56:01 +0100 (BST)
+ Message-Id: <9808070856.AA28065@claudius.bfsec.bt.co.uk>
+ Subject: [PATCH 5.005_50 & 5.005_02] Fix for command line use of source filters
+ Branch: maint-5.005/perl
+ ! perl.c
+____________________________________________________________________________
+[ 1753] By: gsar on 1998/08/07 22:19:42
+ Log: perlport.pod notes from Jarkko Hietaniemi; utime() note for Win32
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 1752] By: gsar on 1998/08/07 22:08:29
+ Log: perlport.pod v1.33 from Chris Nandor <pudge@pobox.com>
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 1751] By: gsar on 1998/08/07 22:01:04
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 6 Aug 1998 19:44:16 -0400 (EDT)
+ Message-Id: <199808062344.TAA09505@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Minor cleanup of RE tests and docs
+ Branch: maint-5.005/perl
+ ! pod/perlre.pod t/op/regexp.t
+____________________________________________________________________________
+[ 1750] By: gsar on 1998/08/07 21:51:52
+ Log: allow more compatible interpretation of spaces File::DosGlob::glob()
+ patterns
+ Branch: maint-5.005/perl
+ ! lib/File/DosGlob.pm
+____________________________________________________________________________
+[ 1749] By: gsar on 1998/08/07 21:36:04
+ Log: don't use © in Test.pm (suggested by M.J.T. Guy)
+ Branch: maint-5.005/perl
+ ! lib/Test.pm
+____________________________________________________________________________
+[ 1748] By: gsar on 1998/08/07 21:31:46
+ Log: From: Dominic Dunlop <domo@computer.org>
+ Date: Thu, 6 Aug 1998 12:38:07 +0000
+ Message-Id: <v03110702b1ef5274635a@[195.95.102.104]>
+ Subject: [Patch perl5.005_02-TRIAL2] Update hints, Configure for MachTen 4.1.1
+ Branch: maint-5.005/perl
+ ! Configure hints/machten.sh
+____________________________________________________________________________
+[ 1746] By: gsar on 1998/08/05 22:55:59
+ Log: MM_Win32.pm and Liblist.pm tweaks
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
+____________________________________________________________________________
+[ 1745] By: gsar on 1998/08/05 21:57:00
+ Log: pod/perlfaq* update from Tom Christiansen <tchrist@perl.com>
+ Branch: maint-5.005/perl
+ ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq8.pod
+____________________________________________________________________________
+[ 1744] By: gsar on 1998/08/05 21:53:30
+ Log: From: Chris Nandor <pudge@pobox.com>
+ Date: Wed, 5 Aug 1998 15:38:48 -0400
+ Message-Id: <v04011701b1ee58b86c63@[192.168.0.3]>
+ Subject: [PATCH] perlport 1.32
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 1743] By: gsar on 1998/08/05 21:52:05
+ Log: README.os2 update
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 5 Aug 1998 05:44:46 -0400 (EDT)
+ Message-Id: <199808050944.FAA09053@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Additional OS/2 tweaks: docs, tests
+ Branch: maint-5.005/perl
+ ! README.os2 t/lib/posix.t t/op/exec.t
+____________________________________________________________________________
+[ 1742] By: gsar on 1998/08/05 21:50:07
+ Log: additional INSTALL notes from Jarkko Hietaniemi <jhi@cc.hut.fi>
+ on semget failure in t/lib/ipc_sysv.t
+ Branch: maint-5.005/perl
+ ! INSTALL
+____________________________________________________________________________
+[ 1741] By: gsar on 1998/08/05 21:46:13
+ Log: correct URL for perlcrt.dll
+ Branch: maint-5.005/perl
+ ! Changes win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1740] By: gsar on 1998/08/05 10:05:46
+ Log: update Changes, patchlevel, tweak Liblist.pm
+ Branch: maint-5.005/perl
+ ! Changes lib/ExtUtils/Liblist.pm patchlevel.h
+____________________________________________________________________________
+[ 1739] By: gsar on 1998/08/05 09:10:45
+ Log: newer cperl-mode.el
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 5 Aug 1998 03:50:16 -0400 (EDT)
+ Message-Id: <199808050750.DAA07240@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] CPerl update
+ Branch: maint-5.005/perl
+ ! emacs/cperl-mode.el
+____________________________________________________________________________
+[ 1738] By: gsar on 1998/08/05 09:08:33
+ Log: support :nosearch in ExtUtils::Liblist for win32, and make -lfoo
+ processing (somewhat) compiler-specific
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
+____________________________________________________________________________
+[ 1737] By: gsar on 1998/08/05 03:20:03
+ Log: add index entries for -X
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 02 Aug 1998 16:33:18 EDT
+ Message-Id: <199808022033.QAA18778@monk.mps.ohio-state.edu>
+ Subject: [PATCH] A missing docu patch
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1736] By: gsar on 1998/08/05 03:09:58
+ Log: make Test::Harness optionally check for stray files when running tests
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 2 Aug 1998 18:12:48 -0400 (EDT)
+ Message-Id: <199808022212.SAA20126@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] File leaked from test suite
+ Branch: maint-5.005/perl
+ ! lib/Test/Harness.pm
+____________________________________________________________________________
+[ 1735] By: gsar on 1998/08/05 02:29:46
+ Log: back out change#1703 that break bincompat with PERL_OBJECT and
+ MULTIPLICITY
+ Branch: maint-5.005/perl
+ ! ext/re/re.pm regcomp.c regexec.c thrdvar.h
+____________________________________________________________________________
+[ 1734] By: gsar on 1998/08/05 02:23:47
+ Log: fixes to enable ISC to build IPC/SysV
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: 05 Aug 1998 00:59:13 +0300
+ Message-ID: <oee3ebce7da.fsf@alpha.hut.fi>
+ Subject: [PATCH] 5.005_02-TRIAL1: (Re: Bug in pp_rename and ISC hint)
+ Branch: maint-5.005/perl
+ ! ext/IPC/SysV/SysV.xs hints/isc.sh hints/isc_2.sh
+____________________________________________________________________________
+[ 1733] By: gsar on 1998/08/05 01:20:29
+ Log: let some 'tr' be '$tr' for occult reasons
+ From: Jeff Okamoto <okamoto@xfiles.intercon.hp.com>
+ Date: Mon, 3 Aug 1998 11:04:30 -0700 (PDT)
+ Message-Id: <199808031804.LAA25595@xfiles.intercon.hp.com>
+ Subject: PATCH: Configure uses tr, not $tr
+ Branch: maint-5.005/perl
+ ! Configure
+____________________________________________________________________________
+[ 1732] By: gsar on 1998/08/05 01:16:40
+ Log: perlre.pod tweak suggested by Mike Wescott <mike.wescott@columbiasc.ncr.com>
+ Branch: maint-5.005/perl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 1731] By: gsar on 1998/08/05 01:10:41
+ Log: explain caveat about use of numeric constants in podoc for sysopen()
+ From: "David J. Fiander" <davidf@mks.com>
+ Date: Tue, 4 Aug 1998 13:09:58 -0400
+ Message-Id: <199808041709.NAA01750@mks.com>
+ Subject: Re: [PATCH] 5.005_01: OE MVS
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1730] By: gsar on 1998/08/05 00:46:53
+ Log: end pod processing when source file is closed (prevents it carrying
+ over into require()d files)
+ Branch: maint-5.005/perl
+ ! t/comp/require.t toke.c
+____________________________________________________________________________
+[ 1729] By: gsar on 1998/08/04 23:03:23
+ Log: correct prototype for des_fcrypt(), explain how to add it in more
+ detail, and supply a patch for libdes-3.06
+ Branch: maint-5.005/perl
+ + win32/des_fcrypt.patch
+ ! MANIFEST README.win32 win32/Makefile win32/makefile.mk
+ ! win32/win32.c
+____________________________________________________________________________
+[ 1728] By: gsar on 1998/08/04 21:50:40
+ Log: tweak to avoid ambiguity warnings
+ Branch: maint-5.005/perl
+ ! pp.c
+____________________________________________________________________________
+[ 1727] By: gsar on 1998/08/04 20:31:04
+ Log: remove useless 'rcsid' (extension of a suggestion by
+ Stephen McCamant)
+ Branch: maint-5.005/perl
+ ! embed.h ext/SDBM_File/sdbm/pair.c ext/SDBM_File/sdbm/sdbm.c
+ ! global.sym gv.c perl.c vms/gen_shrfls.pl
+____________________________________________________________________________
+[ 1726] By: gsar on 1998/08/04 19:52:43
+ Log: correct Pod::Html's notion of email addresses
+ From: abigail@fnx.com
+ Date: Mon, 3 Aug 1998 20:22:49 -0400 (EDT)
+ Message-ID: <19980804002249.2011.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.005_01] lib/Pod/Html.pm
+ Branch: maint-5.005/perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 1725] By: gsar on 1998/08/04 19:50:06
+ Log: perlport.pod additions from Peter Prymmer <pvhp@forte.com>
+ Date: Mon, 3 Aug 98 15:31:35 PDT
+ Message-Id: <9808032231.AA22324@forte.com>
+ --
+ Date: Tue, 4 Aug 98 12:44:20 PDT
+ Message-Id: <9808041944.AA04815@forte.com>
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 1724] By: gsar on 1998/08/04 18:08:07
+ Log: From: Chris Nandor <pudge@pobox.com>
+ Date: Mon, 3 Aug 1998 13:35:25 -0400
+ Message-Id: <v04011711b1eba46d0827@[192.168.0.3]>
+ Subject: [PATCH] perlport 1.30
+ Branch: maint-5.005/perl
+ ! pod/perlport.pod
+____________________________________________________________________________
+[ 1723] By: gsar on 1998/08/04 18:06:13
+ Log: update postscript generator
+ From: Tom Christiansen <tchrist@chthon.perl.com>
+ Date: Mon, 3 Aug 1998 05:29:25 -0600
+ Message-Id: <199808031129.FAA24985@chthon.perl.com>
+ Subject: PATCH: pod/roffitall (5.005_02)
+ Branch: maint-5.005/perl
+ ! pod/roffitall
+____________________________________________________________________________
+[ 1722] By: gsar on 1998/08/03 17:01:12
+ Log: applied suggested patch, slightly tweaked
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: Mon, 3 Aug 1998 11:52:30 +0300 (EET DST)
+ Message-Id: <199808030852.LAA14153@alpha.hut.fi>
+ Subject: [PATCH] perl5.005_02-TRIAL1: pod/perlhist.pod
+ Branch: maint-5.005/perl
+ ! pod/perlhist.pod
+____________________________________________________________________________
+[ 1721] By: gsar on 1998/08/03 16:30:20
+ Log: fix segfault when threadsv is used as foreach itervar
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Sun, 02 Aug 1998 21:44:34 CDT
+ Message-Id: <13765.8641.997452.14516@alias-2.pr.mcs.net>
+ Subject: [PATCH] threadsv index in enteriter targ in op_free()
+ Branch: maint-5.005/perl
+ ! op.c
+____________________________________________________________________________
+[ 1720] By: gsar on 1998/08/02 23:33:42
+ Log: close() open files before unlink()
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 2 Aug 1998 18:14:22 -0400 (EDT)
+ Message-Id: <199808022214.SAA20135@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] File leaked from test suite - tests
+ Branch: maint-5.005/perl
+ ! t/base/rs.t t/op/defins.t
+____________________________________________________________________________
+[ 1719] By: gsar on 1998/08/02 23:31:51
+ Log: more pack() tests
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Mon, 3 Aug 1998 00:59:41 +0300 (EET DST)
+ Message-Id: <199808022159.AAA17160@alpha.hut.fi>
+ Subject: Re: uudecode 'u' problem
+ Branch: maint-5.005/perl
+ ! t/op/pack.t
+____________________________________________________________________________
+[ 1718] By: gsar on 1998/08/02 23:26:51
+ Log: t/TEST aesthetic tweak suggested by Jarkko
+ Branch: maint-5.005/perl
+ ! t/TEST
+____________________________________________________________________________
+[ 1717] By: gsar on 1998/08/02 23:23:43
+ Log: add Digital Unix 3.x notes to README.threads (as suggested by
+ Phoenix <awrobel@jedi.cis.temple.edu>)
+ Branch: maint-5.005/perl
+ ! README.threads
+____________________________________________________________________________
+[ 1716] By: gsar on 1998/08/02 23:15:00
+ Log: allow *FOO{BAR}[0] etc. (without intervening arrow)
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Sun, 2 Aug 1998 16:16:50 -0500 (CDT)
+ Message-ID: <13764.54929.60137.104838@alias-2.pr.mcs.net>
+ Subject: [PATCH] Re: Minor nit in glob notation
+ Branch: maint-5.005/perl
+ ! Changes op.c
+____________________________________________________________________________
+[ 1715] By: gsar on 1998/08/02 22:49:53
+ Log: fix unpack('u',...) problem with spaces in input
+ Branch: maint-5.005/perl
+ ! pp.c t/op/pack.t
+____________________________________________________________________________
+[ 1714] By: gsar on 1998/08/02 21:27:19
+ Log: update location of perlcrt.dll for win32 builds
+ Branch: maint-5.005/perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1713] By: gsar on 1998/08/02 09:28:32
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 2 Aug 1998 04:35:11 -0400 (EDT)
+ Message-Id: <199808020835.EAA09367@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Better debugging output from malloc.c
+ Branch: maint-5.005/perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1712] By: gsar on 1998/08/02 09:16:55
+ Log: fix longstanding bug in pack('u',...) (reads garbage beyond the end
+ of the input string)
+ Branch: maint-5.005/perl
+ ! pp.c
+____________________________________________________________________________
+[ 1711] By: gsar on 1998/08/02 08:14:25
+ Log: update Changes, tweak Porting/makerel
+ Branch: maint-5.005/perl
+ ! Changes Porting/makerel
+____________________________________________________________________________
+[ 1710] By: gsar on 1998/08/02 07:31:37
+ Log: remove CRs from djgpp/configure.bat (Porting/makerel adds them)
+ Branch: maint-5.005/perl
+ ! djgpp/configure.bat
+____________________________________________________________________________
+[ 1709] By: gsar on 1998/08/02 07:27:34
+ Log: Porting/makerel tweaks
+ Branch: maint-5.005/perl
+ ! Porting/makerel
+____________________________________________________________________________
+[ 1708] By: gsar on 1998/08/02 07:09:35
+ Log: fixes for pod noises
+ Branch: maint-5.005/perl
+ ! ext/B/B/Bytecode.pm ext/Thread/Thread/Specific.pm
+ ! pod/perlembed.pod pod/perlfaq.pod
+____________________________________________________________________________
+[ 1707] By: gsar on 1998/08/02 06:59:47
+ Log: malloc.c tweaks
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 01 Aug 1998 18:46:32 EDT
+ Message-Id: <199808012246.SAA00699@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.005_*] Better malloc.c
+ Branch: maint-5.005/perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1706] By: gsar on 1998/08/02 06:56:37
+ Log: fix quoting of keys with embedded nulls
+ From: Slaven Rezic <eserte@cs.tu-berlin.de>
+ Date: Sat, 01 Aug 1998 13:38:03 +0200
+ Message-Id: <199808011138.NAA05189@mail.cs.tu-berlin.de>
+ Subject: Data::Dumper 2.09, patch
+ Branch: maint-5.005/perl
+ ! ext/Data/Dumper/Dumper.xs
+____________________________________________________________________________
+[ 1705] By: gsar on 1998/08/02 06:50:07
+ Log: From: pvhp@forte.com (Peter Prymmer)
+ Date: Fri, 31 Jul 1998 14:50:41 PDT
+ Message-Id: <9807312150.AA08867@forte.com>
+ Subject: Re: \Q doesn't work in interpolated regular expressions
+ Branch: maint-5.005/perl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 1704] By: gsar on 1998/08/02 06:37:06
+ Log: add test for magic autovivification
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Thu, 30 Jul 1998 12:18:15 +0100
+ Message-Id: <E0z1qit-0003O5-00@taurus.cus.cam.ac.uk>
+ Subject: Re: Perl5.005_01 failing to autovivify subroutine args
+ Branch: maint-5.005/perl
+ ! pod/perldiag.pod t/cmd/subval.t
+____________________________________________________________________________
+[ 1703] By: gsar on 1998/08/02 06:26:57
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 21 Jul 1998 23:58:53 -0400 (EDT)
+ Message-Id: <199807220358.XAA19811@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_76] better RE colors
+ Branch: maint-5.005/perl
+ ! ext/re/re.pm regcomp.c regexec.c thrdvar.h
+____________________________________________________________________________
+[ 1702] By: gsar on 1998/08/02 06:22:15
+ Log: mark link type of exported functions for OS/2
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 26 Jul 1998 21:03:03 -0400 (EDT)
+ Message-Id: <199807270103.VAA04977@monk.mps.ohio-state.edu>
+ Subject: Re: Compiler linkage's types [PATCH 5.005]
+ Branch: maint-5.005/perl
+ ! os2/os2ish.h proto.h
+____________________________________________________________________________
+[ 1701] By: gsar on 1998/08/02 06:16:03
+ Log: tweaked version of suggested patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 20 Jul 1998 21:40:00 -0400 (EDT)
+ Message-Id: <199807210140.VAA17186@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_75] Enable -DS
+ Branch: maint-5.005/perl
+ ! README.threads ext/Thread/Thread.xs ext/Thread/typemap mg.c
+ ! op.c perl.c perl.h pod/perlrun.pod pp.c pp_hot.c scope.c
+ ! thread.h util.c win32/win32thread.c
+____________________________________________________________________________
+[ 1700] By: gsar on 1998/08/02 05:54:00
+ Log: up patchlevel to 5.005_02
+ Branch: maint-5.005/perl
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1699] By: gsar on 1998/08/02 05:50:01
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199807180809.EAA09379@monk.mps.ohio-state.edu>
+ Date: Sat, 18 Jul 1998 04:09:26 -0400 (EDT)
+ Subject: [PATCH 5.004_72] Make tests succeed on OS/2
+ Branch: maint-5.005/perl
+ ! t/io/fs.t t/lib/io_pipe.t t/lib/io_sock.t t/op/stat.t
+____________________________________________________________________________
+[ 1698] By: gsar on 1998/08/02 05:41:41
+ Log: use I32_MAX as the limit when U16_MAX > I32_MAX (for CRAY)
+ Branch: maint-5.005/perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 1697] By: gsar on 1998/08/02 05:20:12
+ Log: support OE/MVS
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Message-Id: <199808010903.MAA09371@alpha.hut.fi>
+ Date: Sat, 1 Aug 1998 12:03:02 +0300 (EET DST)
+ Subject: [PATCH] 5.005_01: OE MVS
+ Branch: maint-5.005/perl
+ + README.os390 ebcdic.c
+ ! Configure MANIFEST doio.c ext/Errno/Errno_pm.PL gv.c handy.h
+ ! hints/os390.sh lib/bigint.pl mg.c patchlevel.h perl.c perl.h
+ ! perly.c perly.h perly.y perly_c.diff pod/perldelta.pod
+ ! pod/perlport.pod pp.c pp_ctl.c pp_hot.c pp_sys.c sv.c
+ ! t/base/term.t t/comp/package.t t/comp/require.t
+ ! t/lib/bigintpm.t t/lib/cgi-html.t t/lib/filehand.t t/lib/ph.t
+ ! t/op/auto.t t/op/bop.t t/op/each.t t/op/magic.t t/op/misc.t
+ ! t/op/ord.t t/op/pack.t t/op/quotemeta.t t/op/re_tests
+ ! t/op/regexp.t t/op/sort.t t/op/sprintf.t t/op/subst.t
+ ! t/op/taint.t t/op/universal.t t/pragma/constant.t
+ ! t/pragma/overload.t t/pragma/subs.t toke.c x2p/a2p.h
+ ! x2p/a2py.c
+____________________________________________________________________________
+[ 1696] By: gsar on 1998/08/02 05:03:09
+ Log: VMS patches
+ From: pvhp@forte.com (Peter Prymmer)
+ Message-Id: <9807290017.AA01833@forte.com>
+ Date: Tue, 28 Jul 98 17:17:33 PDT
+ Subject: Re: Not OK: perl 5.00501 on VMS_AXP-thread I7.2
+ --
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Message-Id: <3.0.5.32.19980729125623.00b562b0@ous.edu>
+ Date: Wed, 29 Jul 1998 12:56:23 -0700
+ Subject: [PATCH 5.005_01]Typo in CONFIGURE.COM (vms)
+ --
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Thu, 30 Jul 1998 09:02:24 -0700
+ Message-Id: <3.0.5.32.19980730090224.00b70eb0@ous.edu>
+ Subject: [PATCH 5.005_01]VMS config SOCKETSHR typo patch and fcntl check
+ Branch: maint-5.005/perl
+ ! configure.com vms/subconfigure.com
+____________________________________________________________________________
+[ 1695] By: gsar on 1998/08/02 04:49:32
+ Log: rename duplicate warning in regexec.c
+ Branch: maint-5.005/perl
+ ! regexec.c
+____________________________________________________________________________
+[ 1694] By: gsar on 1998/08/02 04:44:20
+ Log: beware egcs' ld on Solaris
+ From: Tom Spindler <dogcow@home.merit.edu>
+ Message-ID: <19980801212158.A2934@home.merit.edu>
+ Date: Sat, 1 Aug 1998 21:21:58 -0400
+ Subject: Re: [PATCH perl5.005_01] hints/solaris_2.sh, egcs, and ld
+ Branch: maint-5.005/perl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 1693] By: gsar on 1998/08/02 04:41:43
+ Log: de-utf-ized variation of Ilya's patch
+ From: Jan-Pieter Cornet <johnpc@xs4all.net>
+ Date: 31 Jul 1998 12:44:57 +0200
+ Message-ID: <6ps779$hmj$1@xs1.xs4all.nl>
+ Subject: Re: s/\s*$//g in majordomo causes segfault under 5.005_01
+ Branch: maint-5.005/perl
+ ! regexec.c
+____________________________________________________________________________
+[ 1692] By: gsar on 1998/08/02 04:39:14
+ Log: better validation of SysV IPC availability
+ From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+ Date: Fri, 31 Jul 1998 13:13:57 +0300 (EEST)
+ Message-Id: <199807311013.NAA28887@koah.research.nokia.com>
+ Subject: Re: lib/ipc_sysv.t fails under FreeBSD 2.2.1
+ Branch: maint-5.005/perl
+ ! Configure INSTALL ext/IPC/SysV/SysV.xs pod/perldiag.pod
+ ! t/lib/ipc_sysv.t
+____________________________________________________________________________
+[ 1691] By: gsar on 1998/08/02 04:32:30
+ Log: fix bug in display of watched expressions
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 30 Jul 1998 20:02:04 -0400 (EDT)
+ Message-Id: <199807310002.UAA21681@monk.mps.ohio-state.edu>
+ Subject: Re: Bug? in perl5db.pl [PATCH]
+ Branch: maint-5.005/perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 1690] By: gsar on 1998/08/02 04:29:08
+ Log: applied all but one hunk
+ From: Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
+ Date: Thu, 30 Jul 1998 17:19:42 -0400
+ Message-Id: <199807302119.RAA06852@sleipnir.valparaiso.cl>
+ Subject: Some typos in perldelta.pod
+ Branch: maint-5.005/perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 1689] By: gsar on 1998/08/02 04:27:02
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Thu, 30 Jul 1998 10:22:36 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980730101627.17514B-100000@newton.phys>
+ Subject: [PATCH 5.005_05] Remove redundant dTHR
+ Branch: maint-5.005/perl
+ ! mg.c sv.c
+____________________________________________________________________________
+[ 1688] By: gsar on 1998/08/02 04:25:49
+ Log: From: Tom Hughes <thh@cyberscience.com>
+ Date: 30 Jul 1998 09:47:31 +0100
+ Message-ID: <yek1zr3vi70.fsf@elva.cyberscience.com>
+ Subject: Class::Struct has an incomplete tied array package
+ Branch: maint-5.005/perl
+ ! lib/Class/Struct.pm
+____________________________________________________________________________
+[ 1687] By: gsar on 1998/08/02 04:21:48
+ Log: ensure implicit close on local(*FH) doesn't affect $! and thence $?
+ Branch: maint-5.005/perl
+ ! sv.c t/op/die_exit.t
+____________________________________________________________________________
+[ 1686] By: gsar on 1998/08/02 03:57:28
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Thu, 30 Jul 1998 00:39:30 +0300 (EET DST)
+ Message-Id: <199807292139.AAA01795@alpha.hut.fi>
+ Subject: Re: [PATCH] 5.004_05-MAINT_TRIAL_5: three locale fixes
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.xs pod/perllocale.pod
+____________________________________________________________________________
+[ 1685] By: gsar on 1998/08/02 03:54:15
+ Log: PERL_OBJECT bincompat fixes from Douglas Lankshear <dougl@ActiveState.com>
+ Date: Wed, 29 Jul 1998 10:45:31 -0700
+ Message-ID: <000101bdbb18$ae767550$a32fa8c0@tau.Active>
+ Subject: [PATCH 5.005_01] Fixes binary compatibility for PERL_OBJECT
+ --
+ Date: Sat, 1 Aug 1998 09:33:19 -0700
+ Message-ID: <000701bdbd6a$17ada180$a32fa8c0@tau.Active>
+ Subject: [PATCH 5.005_01]
+ Branch: maint-5.005/perl
+ ! perl.h proto.h
+____________________________________________________________________________
+[ 1684] By: gsar on 1998/08/02 03:49:33
+ Log: hand-apply whitespace-mutiliated patch
+ From: Nicholas Clark <nick@flirble.org>
+ Date: Tue, 28 Jul 1998 16:40:42 +0100 (BST)
+ Message-Id: <199807281540.QAA04640@flirble.org>
+ Subject: [PATCH] POSIX::ELOOP
+ Branch: maint-5.005/perl
+ ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 1683] By: gsar on 1998/08/02 03:45:26
+ Log: document return values of do() better
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Tue, 28 Jul 1998 12:44:36 +0100
+ Message-Id: <E0z18BI-0003cH-00@taurus.cus.cam.ac.uk>
+ Subject: [PATCH] Re: Obscurity of lexicals with do ""
+ Branch: maint-5.005/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1682] By: gsar on 1998/08/02 03:42:26
+ Log: avoid reusing foreach itervar if magic got tacked onto it
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Tue, 28 Jul 1998 22:18:25 -0500 (CDT)
+ Message-ID: <13758.36756.215424.719750@alias-2.pr.mcs.net>
+ Subject: [PATCH] Re: pos() resetting changed with 5.005?
+ Branch: maint-5.005/perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 1681] By: gsar on 1998/08/02 03:39:27
+ Log: From: Nick Ing-Simmons <nik@tiuk.ti.com>
+ Date: Wed, 29 Jul 1998 13:28:14 +0100
+ Message-Id: <199807291228.NAA20055@tiuk.ti.com>
+ Subject: [Patch] Math::Complex - Ambiguous call resolved as CORE::foo()
+ Branch: maint-5.005/perl
+ + Porting/fixCORE
+ ! MANIFEST lib/Math/Complex.pm
+____________________________________________________________________________
+[ 1680] By: gsar on 1998/08/02 03:33:07
+ Log: From: h.sanden@elsevier.nl (Hugo van der Sanden)
+ Date: Mon, 27 Jul 1998 13:34:45 +0200
+ Message-Id: <199807271134.NAA24475@dorlas.elsevier.nl>
+ Subject: perlcall.pod
+ Branch: maint-5.005/perl
+ ! pod/perlcall.pod
+____________________________________________________________________________
+[ 1679] By: gsar on 1998/08/02 03:29:41
+ Log: MM_Win32::maybe_command() case-insesitivity tweak
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MM_Win32.pm
+____________________________________________________________________________
+[ 1678] By: gsar on 1998/08/02 03:24:29
+ Log: fix MM_Win32::maybe_command()
+ Branch: maint-5.005/perl
+ ! lib/ExtUtils/MM_Win32.pm
+____________________________________________________________________________
+[ 1677] By: gsar on 1998/08/01 19:52:19
+ Log: fixes for overloading bugs and docs, tweaked some
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 25 Jul 1998 21:28:16 -0400 (EDT)
+ Message-Id: <199807260128.VAA10543@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_76] better overloading
+ Branch: maint-5.005/perl
+ ! Changes gv.c lib/dumpvar.pl lib/overload.pm lib/perl5db.pl
+ ! t/pragma/overload.t
+____________________________________________________________________________
+[ 1676] By: gsar on 1998/08/01 19:37:13
+ Log: stray s/foo/PL_foo/
+ From: win@in.rhein-main.de (Winfried Koenig)
+ Date: Mon, 27 Jul 98 21:13 MET
+ Message-Id: <m0z0teW-00019aC@incom.rhein-main.de>
+ Subject: Bug in pp_rename and ISC hint
+ Branch: maint-5.005/perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1675] By: gsar on 1998/08/01 19:22:13
+ Log: newer Porting/patchls from maint-5.004
+ Branch: maint-5.005/perl
+ ! Porting/patchls
+____________________________________________________________________________
+[ 1674] By: gsar on 1998/08/01 17:50:44
+ Log: fix buggy detection of failed glob()
+ Branch: maint-5.005/perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 1673] By: gsar on 1998/07/29 18:14:32
+ Log: fix typo in change#1489 that prevented magic-autovivification
+ Branch: maint-5.005/perl
+ ! mg.c
+
+----------------
+Version 5.005_01 First maintenance release of 5.005
+----------------
+
+____________________________________________________________________________
+[ 1669] By: gsar on 1998/07/26 23:19:02
+ Log: update Changes; add sv_*_mg() entries in win32/GenCAPI.pl
+ Branch: maint-5.005/perl
+ ! Changes proto.h win32/GenCAPI.pl
+____________________________________________________________________________
+[ 1668] By: gsar on 1998/07/26 21:12:11
+ Log: s/TMP_CRLF_PATCH/PERL_STRICT_CR/ with sense reversed, so they
+ can disable it from config.sh if they want; up patchlevel to 5_01;
+ little tweaks to pods
+ Branch: maint-5.005/perl
+ ! README.win32 patchlevel.h pod/perldelta.pod toke.c
+ ! win32/Makefile win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makefile.mk win32/win32.c
+____________________________________________________________________________
+[ 1662] By: gsar on 1998/07/26 05:01:52
+ Log: add missing sv_*_mg() prototypes in proto.h, update perlhist.pod
+ Branch: maint-5.005/perl
+ ! pod/perlhist.pod proto.h
+____________________________________________________________________________
+[ 1658] By: gsar on 1998/07/26 02:23:46
+ Log: VMS patches from Dan Sugalski <sugalskd@osshe.edu>
+ Date: Fri, 24 Jul 1998 11:38:25 -0700
+ Message-Id: <3.0.5.32.19980724113825.00a067b0@ous.edu>
+ Subject: [PATCH 5.005] version number problem with VMS (Corrected)
+ --
+ Date: Fri, 24 Jul 1998 12:30:36 -0700
+ Message-Id: <3.0.5.32.19980724123036.009f0390@ous.edu>
+ Subject: [PATCH 5.005]Tweaks to README.vms
+ --
+ Date: Sat, 25 Jul 1998 17:56:55 -0700 (PDT)
+ Message-ID: <Pine.GSO.3.96.980725175626.15740D-100000@netserve.ous.edu>
+ Subject: [PATCH 5.005] Final build cleanup patch
+ Branch: maint-5.005/perl
+ ! README.vms vms/descrip_mms.template vms/subconfigure.com
+____________________________________________________________________________
+[ 1657] By: gsar on 1998/07/26 02:19:50
+ Log: another platform where pp_sselect() needs a whole fd_set buffer
+ From: Lupe Christoph <lupe@alanya.m.isar.de>
+ Date: Sat, 25 Jul 1998 19:49:33 +0200 (MET DST)
+ Message-Id: <199807251749.TAA22347@alanya.m.isar.de>
+ Subject: Patch for Not OK: perl 5.005 on i86pc-solaris-thread 2.6
+ Branch: maint-5.005/perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1656] By: gsar on 1998/07/26 02:12:46
+ Log: fix problem building modules on dos-djgpp
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Sat, 25 Jul 1998 00:53:39 +0200
+ Message-ID: <19980725005339.C222@cdata.tvnet.hu>
+ Subject: [PATCH 5.005] dos-djgpp and modules problem
+ Branch: maint-5.005/perl
+ ! djgpp/fixpmain
+____________________________________________________________________________
+[ 1655] By: gsar on 1998/07/26 02:11:09
+ Log: From: Tom Spindler <dogcow@home.merit.edu>
+ Date: Wed, 22 Jul 1998 16:11:07 -0400
+ Message-ID: <19980722161107.A16813@home.merit.edu>
+ Subject: [PATCH 5.005] BeOS tweak
+ Branch: maint-5.005/perl
+ ! hints/beos.sh
+____________________________________________________________________________
+[ 1654] By: gsar on 1998/07/26 02:09:29
+ Log: various pod tweaks
+ Branch: maint-5.005/perl
+ ! Changes pod/perldelta.pod pod/perlmodinstall.pod
+ ! pod/perltoc.pod
+____________________________________________________________________________
+[ 1653] By: gsar on 1998/07/26 02:05:46
+ Log: fix emacs/ptags for PL_* changes
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 24 Jul 1998 03:12:35 -0400 (EDT)
+ Message-Id: <199807240712.DAA04204@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_76] Yet better ptags
+ Branch: maint-5.005/perl
+ ! emacs/ptags
+____________________________________________________________________________
+[ 1652] By: gsar on 1998/07/26 02:03:01
+ Log: fix behavior of <=> on bigints
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Message-Id: <E0yzlfF-0004kz-00@taurus.cus.cam.ac.uk>
+ Date: Fri, 24 Jul 1998 18:29:53 +0100
+ Subject: [PATCH] Re: Math::BigInt <=> op is not correct.
+ Branch: maint-5.005/perl
+ ! lib/Math/BigInt.pm t/lib/bigintpm.t
+____________________________________________________________________________
+[ 1649] By: gsar on 1998/07/24 03:56:56
+ Log: create maint-5.005 branch
+ Branch: maint-5.005/perl
+ +> (branch 1079 files)
+____________________________________________________________________________
+[ 1648] By: gsar on 1998/07/24 03:36:35
+ Log: un-checked-in 5.005 Changes (this is 5.005 *exactly*)
+ Branch: perl
+ ! Changes
+
+-------------
+Version 5.005 Production release
+-------------
+
+____________________________________________________________________________
+[ 1647] By: gsar on 1998/07/22 21:11:29
+ Log: sneak in hints/irix_6.sh update
+ Branch: perl
+ ! Changes hints/irix_6.sh
+____________________________________________________________________________
+[ 1646] By: gsar on 1998/07/22 21:00:44
+ Log: Update perldelta and Changes; refresh perltoc; newer perlembed.pod
+ from Jon Orwant <orwant@media.mit.edu>; update guts documentation
+ to reflect PL_* changes; is this *it* for 5.005?
+ Branch: perl
+ ! Changes README.win32 patchlevel.h pod/perlcall.pod
+ ! pod/perldelta.pod pod/perlembed.pod pod/perlguts.pod
+ ! pod/perltoc.pod pod/perlxs.pod
+____________________________________________________________________________
+[ 1645] By: gsar on 1998/07/22 19:37:41
+ Log: don't use qualify() in class methods
+ From: Albert Dvornik <bert@genscan.com>
+ Date: 22 Jul 1998 15:14:46 EDT
+ Message-Id: <tqbtqhlmu1.fsf_-_@puma.genscan.com>
+ Subject: [PATCH 5.005-MAYBE] Bug in IO::Handle->input_record_separator
+ Branch: perl
+ ! ext/IO/lib/IO/Handle.pm
+____________________________________________________________________________
+[ 1644] By: gsar on 1998/07/22 18:13:31
+ Log: newer perlembed.pod
+ Branch: perl
+ ! pod/perlembed.pod
+____________________________________________________________________________
+[ 1643] By: gsar on 1998/07/22 18:03:42
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Wed, 22 Jul 1998 13:42:20 EDT
+ Message-Id: <Pine.SUN.3.96.980722134049.10073C-100000@newton.phys>
+ Subject: Re: 5.005 - a sneak preview
+ Branch: perl
+ ! Porting/pumpkin.pod
+____________________________________________________________________________
+[ 1642] By: gsar on 1998/07/22 17:58:42
+ Log: add perlmodinstall, regen perltoc
+ Branch: perl
+ + pod/perlmodinstall.pod
+ ! MANIFEST pod/Makefile pod/buildtoc pod/perl.pod
+ ! pod/perltoc.pod win32/pod.mak
+____________________________________________________________________________
+[ 1641] By: gsar on 1998/07/22 17:11:55
+ Log: support optional crypt() with PERL_OBJECT
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Date: Wed, 22 Jul 1998 08:21:10 PDT
+ Message-Id: <000701bdb584$5b57c070$a32fa8c0@tau.Active>
+ Subject: [PATCH 5.005 maybe] for crypt with PERL_OBJECT
+ Branch: perl
+ ! iperlsys.h pp.c win32/Makefile win32/makefile.mk
+ ! win32/perlhost.h win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 1640] By: gsar on 1998/07/22 17:09:11
+ Log: win32 tweaks
+ Date: Wed, 22 Jul 1998 07:09:09 PDT
+ Message-Id: <000001bdb57a$4bc9dd00$a32fa8c0@tau.Active>
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 1639] By: gsar on 1998/07/22 17:00:30
+ Log: From: d-lewart@uiuc.edu (Daniel S. Lewart)
+ Date: Wed, 22 Jul 1998 06:20:08 CDT
+ Message-Id: <199807221120.GAA07962@staff2.cso.uiuc.edu>
+ Subject: [PATCH] lib/Sys/Syslog.pm doc
+ Branch: perl
+ ! Changes lib/Sys/Syslog.pm
+____________________________________________________________________________
+[ 1638] By: gsar on 1998/07/22 09:12:26
+ Log: up patchlevel etc (only doc patching from now on, testing in progress)
+ Branch: perl
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1637] By: gsar on 1998/07/22 08:27:09
+ Log: VMS patches from Dan Sugalski <sugalskd@osshe.edu>
+ Date: Tue, 21 Jul 1998 16:04:40 PDT
+ Message-Id: <3.0.5.32.19980721160440.00a916f0@ous.edu>
+ Subject: [PATCH 5.004_76]Document Vax C's death for VMS
+ --
+ Date: Tue, 21 Jul 1998 16:08:57 PDT
+ Message-Id: <3.0.5.32.19980721160857.00a6d250@ous.edu>
+ Subject: [PATCH 5.004_76]fix clean/realclean targets of VMS' makefile
+ --
+ Date: Tue, 21 Jul 1998 16:05:56 PDT
+ Message-Id: <3.0.5.32.19980721160556.00a1a100@ous.edu>
+ Subject: [PATCH 5.004_76]Note the record-read capabilities of $/ in perldelta.pod
+ Branch: perl
+ ! README.vms pod/perldelta.pod vms/descrip_mms.template
+____________________________________________________________________________
+[ 1636] By: gsar on 1998/07/22 08:04:37
+ Log: fix quoting in t/io/inplace.t
+ Branch: perl
+ ! t/io/inplace.t
+____________________________________________________________________________
+[ 1635] By: gsar on 1998/07/22 07:59:30
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Tue, 21 Jul 1998 13:06:44 PDT
+ Message-Id: <3.0.5.32.19980721130644.00ac5100@ous.edu>
+ Subject: [PATCH 5.004_76]t/io/inplace.t enabled for VMS
+ Branch: perl
+ ! t/io/inplace.t vms/test.com
+____________________________________________________________________________
+[ 1634] By: gsar on 1998/07/22 07:55:35
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Tue, 21 Jul 1998 12:42:20 PDT
+ Message-Id: <3.0.5.32.19980721124220.00a82a20@ous.edu>
+ Subject: [PATCH 5.004_76]Fix inplace editing for VMS
+ Branch: perl
+ ! doio.c
+____________________________________________________________________________
+[ 1633] By: gsar on 1998/07/22 07:53:53
+ Log: fix AIX hints for PL_* changes
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 21 Jul 1998 22:53:54 +0300
+ Message-Id: <199807211953.WAA55724@vipunen.hut.fi>
+ Subject: Re: _76 fails to link B extension on AIX 414
+ Branch: perl
+ ! perl_exp.SH
+____________________________________________________________________________
+[ 1632] By: gsar on 1998/07/22 07:51:56
+ Log: From: Anton Berezin <tobez@plab.ku.dk>
+ Date: Tue, 21 Jul 1998 21:46:45 +0200
+ Message-Id: <199807211946.VAA01301@lion.plab.ku.dk>
+ Subject: [PATCH _76] t/op/eval.t test for eval & scoping of lexicals
+ Branch: perl
+ ! t/op/eval.t
+____________________________________________________________________________
+[ 1631] By: gsar on 1998/07/22 07:48:20
+ Log: applied patch, with tweak suggested by Michael Parker
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Tue, 21 Jul 1998 14:30:05 EDT
+ Message-Id: <Pine.SUN.3.96.980721142928.8231Q-100000@newton.phys>
+ Subject: Re: Not OK: _76 on IP22-irix6.2 fails tests
+ Branch: perl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 1630] By: gsar on 1998/07/22 07:40:25
+ Log: better diagnostic on errno.t failure
+ From: Graham Barr <gbarr@ti.com>
+ Date: Tue, 21 Jul 1998 13:07:29 CDT
+ Message-Id: <19980721130729.K4337@asic.sc.ti.com>
+ Branch: perl
+ ! t/lib/errno.t
+____________________________________________________________________________
+[ 1629] By: gsar on 1998/07/22 07:36:38
+ Log: win32 tweaks: disable XSLOCKS in perl.c, correct typo, search
+ the registry for anything that begins with "PERL", not "PERL5"
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Date: Tue, 21 Jul 1998 11:08:00 PDT
+ Message-Id: <000601bdb4d2$7ee74720$a32fa8c0@tau.Active>
+ Branch: perl
+ ! perl.c win32/perlhost.h win32/win32.c
+____________________________________________________________________________
+[ 1628] By: gsar on 1998/07/22 07:28:35
+ Log: suppress redefined warnings on C<INIT {} INIT {}>
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1627] By: gsar on 1998/07/22 07:15:19
+ Log: remove spurious $VERSION line that confuses CPAN
+ From: Johan Vromans <jvromans@squirrel.nl>
+ Date: Tue, 21 Jul 1998 20:01:36 +0200
+ Message-Id: <13748.55168.397720.564438@phoenix.squirrel.nl>
+ Subject: Re: 5.004_76 missing version numbers
+ Branch: perl
+ ! lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 1626] By: gsar on 1998/07/22 06:57:56
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Tue, 21 Jul 1998 10:20:13 EDT
+ Message-Id: <Pine.SUN.3.96.980721101922.8078A-100000@newton.phys>
+ Subject: [PATCH] Porting/config* updates for 5.005
+ Branch: perl
+ ! Changes Porting/config.sh Porting/config_H
+____________________________________________________________________________
+[ 1625] By: gsar on 1998/07/22 06:46:38
+ Log: add a few more globals with old names #defined
+ Branch: perl
+ ! embed.pl embedvar.h
+____________________________________________________________________________
+[ 1624] By: gsar on 1998/07/22 06:39:22
+ Log: allow extensions to be specified as paths
+ From: Paul Johnson <pjcj@transeda.com>
+ Date: Tue, 21 Jul 1998 12:04:27 BST
+ Message-Id: <19980721120427.F903@west-tip.transeda.com>
+ Subject: [PATCH] 5.004_75 Embed and static extensions
+ Branch: perl
+ ! lib/ExtUtils/Embed.pm
+____________________________________________________________________________
+[ 1623] By: gsar on 1998/07/22 06:12:50
+ Log: make $ prototype to accept THREADSVs
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1622] By: gsar on 1998/07/22 06:04:25
+ Log: fix Liblist.pm to find entries that are plain pathnames on win32
+ Branch: perl
+ ! lib/ExtUtils/Liblist.pm
+____________________________________________________________________________
+[ 1621] By: gsar on 1998/07/22 05:10:53
+ Log: perlfaq update from From Tom Christiansen and Nathan Torkington
+ (removes all mention of training courses from perlfaq*.pod)
+ Branch: perl
+ ! pod/perlfaq.pod pod/perlfaq2.pod pod/perlfaq3.pod
+ ! pod/perlfaq4.pod pod/perlfaq6.pod pod/perlfaq7.pod
+ ! pod/perlfaq8.pod pod/perlfaq9.pod
+____________________________________________________________________________
+[ 1620] By: gsar on 1998/07/22 02:51:13
+ Log: applied patch, modulo parts already added to perldelta
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Tue, 21 Jul 1998 17:06:23 CDT
+ Message-Id: <13749.3106.995764.413053@alias-2.pr.mcs.net>
+ Subject: [PATCH] Re: Beta2 is available
+ Branch: perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 1619] By: gsar on 1998/07/22 02:45:55
+ Log: applied patch, add new message to perldeta
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Tue, 21 Jul 1998 16:12:25 CDT
+ Message-Id: <13749.910.83378.949909@alias-2.pr.mcs.net>
+ Subject: [PATCH] Band-aid patch for local($avhv->{a})
+ Branch: perl
+ ! pod/perldelta.pod pod/perldiag.pod pp.c pp_hot.c
+____________________________________________________________________________
+[ 1618] By: gsar on 1998/07/22 02:08:00
+ Log: fix up B modules for PL_* changes
+ Branch: perl
+ ! ext/B/B/C.pm ext/B/B/CC.pm ext/B/B/Stackobj.pm
+____________________________________________________________________________
+[ 1617] By: gsar on 1998/07/22 01:42:14
+ Log: From: Malcolm Beattie <mbeattie@sable.ox.ac.uk>
+ Date: Tue, 21 Jul 1998 18:13:16 BST
+ Message-Id: <199807211713.SAA20735@sable.ox.ac.uk>
+ Subject: Compiler docs for 5.005
+ Branch: perl
+ ! ext/B/B.pm ext/B/B/Bytecode.pm ext/B/B/C.pm ext/B/B/CC.pm
+ ! ext/B/O.pm
+____________________________________________________________________________
+[ 1616] By: gsar on 1998/07/22 01:29:09
+ Log: s/PL_sv/PL_bytecode_sv/ etc., so we have unique, case-insensitive
+ names
+ Branch: perl
+ ! bytecode.h bytecode.pl byterun.c embedvar.h interp.sym
+ ! intrpvar.h
+____________________________________________________________________________
+[ 1615] By: nick on 1998/07/21 22:26:34
+ Log: Mingw32 PERL_OBJECT tweaks
+ Branch: perl
+ ! ext/Fcntl/Fcntl.xs ext/IO/IO.xs ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 1614] By: gsar on 1998/07/21 19:43:32
+ Log: fix off-by-one in change#623 that broke lexical lookups in eval''
+ Branch: perl
+ ! pp_ctl.c
+
+----------------
+Version 5.004_76 5.005 Public Beta, Issue 2
+----------------
+
+____________________________________________________________________________
+[ 1613] By: gsar on 1998/07/21 10:26:01
+ Log: final tweaks before beta2
+ Branch: perl
+ + Porting/findvars
+ +> Porting/fixvars
+ - fixvars
+ ! Changes MANIFEST intrpvar.h iperlsys.h
+ ! lib/ExtUtils/MM_Win32.pm win32/perlhost.h
+____________________________________________________________________________
+[ 1612] By: gsar on 1998/07/21 07:15:54
+ Log: fixes to enable PERL_OBJECT build with mingw32/egcs-1.0.2
+ Branch: perl
+ ! ext/Opcode/Opcode.xs proto.h win32/makedef.pl
+ ! win32/makefile.mk win32/perlhost.h win32/win32.c win32/win32.h
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 1611] By: gsar on 1998/07/21 07:12:00
+ Log: fix bytecode.pl with moved var names
+ Branch: perl
+ ! bytecode.pl byterun.c byterun.h ext/B/B/Asmdata.pm
+____________________________________________________________________________
+[ 1610] By: gsar on 1998/07/21 05:51:10
+ Log: tweak toke.c
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 1609] By: gsar on 1998/07/21 05:46:59
+ Log: change case of PERL_OBJECT filenames, consistent with the rest
+ Branch: perl
+ + XSlock.h objXSUB.h
+ - ObjXSub.h XSLock.h
+ ! MANIFEST XSUB.h lib/ExtUtils/MM_Win32.pm perl.h
+ ! win32/GenCAPI.pl win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1608] By: gsar on 1998/07/21 05:31:13
+ Log: part 2 of PERL_OBJECT fixes (globals in bytecode.h moved to intrpvar.h)
+ Branch: perl
+ ! bytecode.h byterun.c embedvar.h interp.sym intrpvar.h
+____________________________________________________________________________
+[ 1607] By: gsar on 1998/07/21 05:29:10
+ Log: part 1 of PERL_OBJECT fixes for new var names
+ Branch: perl
+ ! ObjXSub.h bytecode.h globals.c iperlsys.h perl.h pp_ctl.c
+ ! run.c win32/GenCAPI.pl
+____________________________________________________________________________
+[ 1606] By: gsar on 1998/07/21 05:17:26
+ Log: From: Stephen McCamant <alias@mcs.com>
+ Date: Mon, 20 Jul 1998 23:53:32 CDT
+ Message-Id: <13748.6947.311341.657005@alias-2.pr.mcs.net>
+ Subject: [PATCH] redundant RV2GVs in ck_fun()
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1605] By: gsar on 1998/07/21 05:13:28
+ Log: From: Stephen McCamant <alias@mcs.com>
+ Date: Mon, 20 Jul 1998 23:32:42 CDT
+ Message-Id: <13748.6392.921893.643238@alias-2.pr.mcs.net>
+ Subject: B::Deparse 0.56 (first testsuite fixes; big)
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 1604] By: gsar on 1998/07/21 05:07:29
+ Log: applied a slightly tweaked version of suggested patch
+ From: Colin Kuskie <ckuskie@cadence.com>
+ Date: Mon, 20 Jul 1998 15:58:31 -0700 (PDT)
+ Message-ID: <Pine.GSO.3.96.980720154841.6188M-100000@pdxmail.cadence.com>
+ Subject: [PATCH _75] More documentation for -i prefix
+ Branch: perl
+ ! pod/perlrun.pod
+____________________________________________________________________________
+[ 1603] By: gsar on 1998/07/21 04:59:19
+ Log: disable malloced_size() feedback with -DLEAKTEST
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 20 Jul 1998 21:20:21 -0400 (EDT)
+ Message-Id: <199807210120.VAA15031@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_75] -DLEAKTEST broken
+ Branch: perl
+ ! av.c sv.c
+____________________________________________________________________________
+[ 1602] By: gsar on 1998/07/21 04:57:43
+ Log: fix hints/hpux.sh for cpp recognition
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 20 Jul 1998 12:46:33 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980720124202.6585B-100000@newton.phys>
+ Subject: RE: Configure misses preprocessor on HP-UX
+ Branch: perl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 1601] By: gsar on 1998/07/21 04:55:51
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sun, 19 Jul 1998 18:16:38 -0400 (EDT)
+ Message-Id: <199807192216.SAA10482@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Compile (?{}) into a correct package
+ Branch: perl
+ ! pp_ctl.c t/op/pat.t
+____________________________________________________________________________
+[ 1600] By: gsar on 1998/07/21 04:48:32
+ Log: allocate a whole fd_set for pp_sselect() on more platforms
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: 20 Jul 1998 00:14:18 +0300
+ Message-ID: <oeen2a5y251.fsf@alpha.hut.fi>
+ Subject: Re: Not OK: perl 5.00475 +DEVEL_BETA_ISSUE_1 on OPENSTEP-Mach 4_1 (UNINSTALLED)
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1599] By: gsar on 1998/07/21 04:44:04
+ Log: add tests to check if context propagation works
+ From: Francois Desarmenien <desar@club-internet.fr>
+ Date: Sun, 19 Jul 1998 12:28:33 +0200
+ Message-ID: <35B1CA51.A606AD27@club-internet.fr>
+ Subject: Re: m//g strange behaviour in 5.004
+ Branch: perl
+ + t/op/context.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 1598] By: gsar on 1998/07/21 04:37:49
+ Log: applied RE doc patches, with tweaks to the prose
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 18 Jul 1998 23:11:13 -0400 (EDT)
+ Message-Id: <199807190311.XAA25080@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Document irregular zero-length matches
+ --
+ Date: Sun, 19 Jul 1998 00:38:44 -0400 (EDT)
+ Message-Id: <199807190438.AAA26226@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Another irregularity of expressions documented
+ Branch: perl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 1597] By: gsar on 1998/07/21 04:16:51
+ Log: pod tweak suggested by Ilya
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1596] By: gsar on 1998/07/21 04:12:39
+ Log: enable color output with -Mre=debugcolor with -DDEBUGGING
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 18 Jul 1998 17:34:00 -0400 (EDT)
+ Message-Id: <199807182134.RAA20644@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Better -Mre=colordb
+ Branch: perl
+ ! ext/re/re.xs
+____________________________________________________________________________
+[ 1595] By: gsar on 1998/07/21 04:07:44
+ Log: From: "John L. Allen" <allen@grumman.com>
+ Date: Thu, 16 Jul 1998 11:43:54 -0400 (EDT)
+ Message-ID: <Pine.SOL.3.91.980716113018.14617A-100000@gateway.grumman.com>
+ Subject: [PATCH _75 & _05] perlbug does not report usage on invalid flags
+ Branch: perl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 1594] By: gsar on 1998/07/21 04:06:06
+ Log: don't use SelectSaver on IO::Handle->input_*() methods
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Thu, 16 Jul 1998 15:00:39 +0100 (BST)
+ Message-Id: <199807161400.PAA25532@tempest.cise.npl.co.uk>
+ Subject: Re: Bug in IO::Handle->input_record_separator
+ Branch: perl
+ ! ext/IO/lib/IO/Handle.pm
+____________________________________________________________________________
+[ 1593] By: gsar on 1998/07/21 04:03:46
+ Log: applied a tweaked version of suggested patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 15 Jul 1998 17:02:48 -0400 (EDT)
+ Message-Id: <199807152102.RAA19952@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Enable/document colors in re.pm
+ Branch: perl
+ ! ext/re/re.pm
+____________________________________________________________________________
+[ 1592] By: gsar on 1998/07/21 03:49:55
+ Log: remove compat3.sym and rename perld4.pod
+ Branch: perl
+ +> pod/perl5004delta.pod
+ - compat3.sym pod/perld4.pod
+ ! MANIFEST
+____________________________________________________________________________
+[ 1591] By: gsar on 1998/07/21 03:38:16
+ Log: update patchlevel, Changes
+ Branch: perl
+ ! Changes patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1590] By: gsar on 1998/07/21 03:06:04
+ Log: documentation tweaks from Abigail <abigail@fnx.com>
+ Date: Fri, 17 Jul 1998 20:52:36 -0400 (EDT)
+ Message-ID: <19980718005236.5154.qmail@betelgeuse.wayne.fnx.com>
+ Subject: Re: [PATCH 5.00475] pod/perlsyn.pod
+ --
+ Date: Thu, 16 Jul 1998 17:00:49 -0400 (EDT)
+ Message-ID: <19980716210049.16156.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.00475] pod/perlguts.pod
+ --
+ Date: Thu, 16 Jul 1998 16:52:05 -0400 (EDT)
+ Message-ID: <19980716205205.15949.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.00475] Tweaking pod/perlfunc.pod
+ --
+ Date: Fri, 17 Jul 1998 22:58:05 -0400 (EDT)
+ Message-ID: <19980718025805.7135.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH, 5.00475], pod/perlsub.pod
+ --
+ Date: Sat, 18 Jul 1998 04:02:00 -0400 (EDT)
+ Message-ID: <19980718080200.9927.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.00475] pod/perlfunc.pod
+ Branch: perl
+ ! pod/perlfunc.pod pod/perlguts.pod pod/perlsub.pod
+ ! pod/perlsyn.pod
+____________________________________________________________________________
+[ 1589] By: gsar on 1998/07/21 02:44:25
+ Log: VMS patches from Dan Sugalski <sugalskd@osshe.edu>
+ Date: Wed, 15 Jul 1998 09:38:12 -0700
+ Message-Id: <3.0.5.32.19980715093812.00a42a50@ous.edu>
+ Subject: [PATCH 5.005-beta1]Quick VMS config update
+ --
+ Date: Wed, 15 Jul 1998 12:53:52 -0700
+ Message-Id: <3.0.5.32.19980715125352.00a25cb0@ous.edu>
+ Subject: Re: $ebcdic has broken VMS in _75 (Now with doc patch!)
+ --
+ Date: Thu, 16 Jul 1998 11:15:44 -0700
+ Message-Id: <3.0.5.32.19980716111544.00b78770@ous.edu>
+ Subject: [PATCH 5.004_75]Another VMS tweak for the Vax C compiler
+ --
+ Date: Thu, 16 Jul 1998 11:21:55 -0700
+ Message-Id: <3.0.5.32.19980716112155.00a66c50@ous.edu>
+ Subject: [PATCH 5.004_75]Get archname correct for thread build on VMS
+ --
+ Date: Thu, 16 Jul 1998 11:25:04 -0700
+ Message-Id: <3.0.5.32.19980716112504.00ae0d50@ous.edu>
+ Subject: [PATCH 5.004_75]Thread build tweaks for VMS 6.2 and older
+ --
+ Date: Fri, 17 Jul 1998 15:29:13 -0700
+ Message-Id: <3.0.5.32.19980717152913.00a469b0@ous.edu>
+ Subject: [PATCH 5.004_75]Missed a header file in VMS build procedure
+ --
+ Date: Mon, 20 Jul 1998 10:20:49 -0700
+ Message-Id: <3.0.5.32.19980720102049.00a05100@ous.edu>
+ Subject: [PATCH 5.004_75]Tweaks to Thread.XS for OLD_PTHREADS_API build
+ --
+ Date: Mon, 20 Jul 1998 10:13:03 -0700
+ Message-Id: <3.0.5.32.19980720101303.00a17100@ous.edu>
+ Subject: [PATCH 5.004_75]Explicitly specify extensions during VMS config process
+ --
+ From: Brad Hughes <brad@tgsmc.com>
+ Date: Mon, 20 Jul 1998 15:51:22 -0700
+ Message-Id: <3.0.5.32.19980720155122.00a41950@ous.edu>
+ Subject: patch for readme.vms
+ Branch: perl
+ ! README.vms ext/Thread/Thread.xs vms/descrip_mms.template
+ ! vms/gen_shrfls.pl vms/subconfigure.com
+____________________________________________________________________________
+[ 1588] By: gsar on 1998/07/21 01:26:20
+ Log: change#1481 didn't go through at all, redo it
+ Branch: perl
+ ! t/base/rs.t
+____________________________________________________________________________
+[ 1587] By: gsar on 1998/07/21 01:21:41
+ Log: workaround C<"foo" "bar"> catenation-intolerant compilers
+ Branch: perl
+ ! regexec.c toke.c
+____________________________________________________________________________
+[ 1586] By: gsar on 1998/07/21 01:05:49
+ Log: do not override PERL_DESTRUCT_LEVEL if use has it set
+ Branch: perl
+ ! t/TEST
+____________________________________________________________________________
+[ 1585] By: gsar on 1998/07/21 00:39:17
+ Log: fix small memory leak when mess_sv happens to be touched by magic
+ Branch: perl
+ ! perl.c t/lib/thread.t t/op/local.t t/op/pat.t t/op/regexp.t
+____________________________________________________________________________
+[ 1584] By: gsar on 1998/07/21 00:37:32
+ Log: fix memory leak in C<local(*foo) = 'bar'>
+ Branch: perl
+ ! scope.c
+____________________________________________________________________________
+[ 1583] By: TimBunce on 1998/07/20 22:14:11
+ Log: Update Changes and patchlevel.h for release. At last.
+ Branch: maint-5.004/perl
+ ! Changes patchlevel.h
+____________________________________________________________________________
+[ 1582] By: gsar on 1998/07/20 21:28:43
+ Log: add rsfp_filters and perldb to pollutants list
+ Branch: perl
+ ! embed.pl
+____________________________________________________________________________
+[ 1581] By: nick on 1998/07/20 19:22:37
+ Log: Integrate mainline pre-beta2 - just in case
+ Branch: ansiperl
+ !> (integrate 66 files)
+____________________________________________________________________________
+[ 1580] By: TimBunce on 1998/07/20 17:16:38
+ Log: Assorted patches:
+
+ Title: "Clean up hash array allocation"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807201052.GAA13336@aatma.engin.umich.edu>
+ Files: hv.c
+
+ Title: "Further fixes for cppstdin on HP-UX 11"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980720124202.6585B-100000@newton.phys>
+ Files: hints/hpux.sh
+ Branch: maint-5.004/perl
+ ! hints/hpux.sh hv.c
+____________________________________________________________________________
+[ 1579] By: TimBunce on 1998/07/20 09:46:14
+ Log: Assorted patches:
+
+ Title: "Fix C<$1 .. $2> coredump under debugger"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807200042.UAA23288@aatma.engin.umich.edu>
+ Files: pp_ctl.c
+
+ Title: "Fix lvalue leaks stemming from failure to free LvTARG(sv)"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807191829.OAA12433@aatma.engin.umich.edu>
+ Files: embed.h perl.h proto.h global.sym mg.c sv.c t/op/substr.t t/op/vec.t
+
+ Title: "fix major bug (from 5.003_96); void contexts were using the context
+ of the enclosing sub!"
+ From: Francois Desarmenien <desar@club-internet.fr>, Gurusamy Sarathy
+ <gsar@engin.umich.edu>
+ Msg-ID: <199807180927.FAA08032@aatma.engin.umich.edu>,
+ <35B1CA51.A606AD27@club-internet.fr>
+ Files: op.h
+
+ Title: "Update lib/Getopt/Long.pm (from perl5.005 beta 1)"
+ From: Johan Vromans <jvromans@squirrel.nl>
+ Msg-ID: <13745.47704.943964.34613@phoenix.squirrel.nl>
+ Files: lib/Getopt/Long.pm
+
+ Title: "Add Porting/p4d2p utility for converting perforce diffs"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807200002.UAA21398@aatma.engin.umich.edu>
+ Files: MANIFEST Porting/p4d2p
+ Branch: maint-5.004/perl
+ + Porting/p4d2p
+ ! MANIFEST embed.h global.sym lib/Getopt/Long.pm mg.c op.h
+ ! perl.h pp_ctl.c proto.h sv.c t/op/substr.t t/op/vec.t
+____________________________________________________________________________
+[ 1578] By: gsar on 1998/07/20 09:38:39
+ Log: complete s/foo/PL_foo/ changes (all escaped cases identified with
+ brute force search script). Result builds and passes all tests on
+ Solaris. win32 and PERL_OBJECT are still untested.
+ Branch: perl
+ ! XSLock.h XSUB.h bytecode.h bytecode.pl byterun.c cc_runtime.h
+ ! djgpp/djgpp.c embed.pl ext/B/B.xs ext/B/B/Asmdata.pm
+ ! ext/B/byteperl.c ext/DB_File/DB_File.xs ext/DB_File/typemap
+ ! ext/DynaLoader/dl_dld.xs ext/DynaLoader/dl_next.xs
+ ! ext/DynaLoader/dl_vms.xs ext/GDBM_File/typemap ext/IO/IO.xs
+ ! ext/IPC/SysV/SysV.xs ext/NDBM_File/typemap
+ ! ext/ODBM_File/ODBM_File.xs ext/ODBM_File/typemap
+ ! ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs ext/SDBM_File/typemap
+ ! ext/Thread/Thread.xs ext/attrs/attrs.xs fakethr.h gv.c hv.c
+ ! lib/ExtUtils/typemap malloc.c mg.c op.c os2/OS2/PrfDB/PrfDB.xs
+ ! os2/OS2/PrfDB/typemap os2/OS2/REXX/REXX.xs os2/os2.c
+ ! os2/os2ish.h perl.c perl.h pp.c pp_ctl.c pp_hot.c pp_sys.c
+ ! regcomp.c regcomp.h regexec.c scope.c scope.h sv.h taint.c
+ ! toke.c util.c vms/ext/DCLsym/DCLsym.xs vms/ext/Stdio/Stdio.xs
+ ! vms/vms.c vms/vmsish.h win32/win32.c win32/win32thread.c
+____________________________________________________________________________
+[ 1577] By: TimBunce on 1998/07/20 08:28:17
+ Log: Title: "Make failed matches return empty list in list context"
+ From: "Paul E. Maisano" <pem@aaii.oz.au>, Gurusamy Sarathy
+ <gsar@engin.umich.edu>, Paul Maisano <pem@aaii.oz.au>
+ Msg-ID: <199807200002.UAA21398@aatma.engin.umich.edu>,
+ <199807200027.KAA27815@ironbark-ridge.aaii.oz.au>,
+ <35B156FB.504E66E@aaii.oz.au>
+ Files: pod/perlop.pod pp_hot.c t/op/pat.t
+ Branch: maint-5.004/perl
+ ! pod/perlop.pod pp_hot.c t/op/pat.t
+____________________________________________________________________________
+[ 1576] By: TimBunce on 1998/07/20 08:11:37
+ Log: Title: "win32 update from 5.005 beta 2 for 5.004_05"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807192332.TAA20905@aatma.engin.umich.edu>
+ Files: win32/include/dirent.h win32/include/sys/socket.h proto.h
+ lib/ExtUtils/Liblist.pm lib/ExtUtils/Mksymlists.pm
+ win32/win32.h win32/win32iop.h README.win32 installperl
+ pp_ctl.c win32/Makefile win32/config.bc win32/config.vc
+ win32/config_H.bc win32/config_H.vc win32/config_h.PL
+ win32/config_sh.PL win32/dl_win32.xs win32/makedef.pl
+ win32/makefile.mk win32/pod.mak win32/win32.c
+ win32/win32sck.c win32/bin/pl2bat.pl
+ Branch: maint-5.004/perl
+ ! README.win32 installperl lib/ExtUtils/Liblist.pm
+ ! lib/ExtUtils/Mksymlists.pm pp_ctl.c proto.h win32/Makefile
+ ! win32/bin/pl2bat.pl win32/config.bc win32/config.vc
+ ! win32/config_H.bc win32/config_H.vc win32/config_h.PL
+ ! win32/config_sh.PL win32/dl_win32.xs win32/include/dirent.h
+ ! win32/include/sys/socket.h win32/makedef.pl win32/makefile.mk
+ ! win32/pod.mak win32/win32.c win32/win32.h win32/win32iop.h
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 1575] By: gsar on 1998/07/20 01:27:14
+ Log: integrate ansi branch to get s/foo/PL_foo/ changes
+ Branch: perl
+ +> fixvars
+ !> (integrate 537 files)
+____________________________________________________________________________
+[ 1574] By: gsar on 1998/07/20 00:33:43
+ Log: fix C<$1 .. $2> coredump under debugger
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 1573] By: gsar on 1998/07/20 00:28:27
+ Log: misc win32 config tweaks
+ Branch: perl
+ ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_h.PL win32/makefile.mk
+____________________________________________________________________________
+[ 1572] By: nick on 1998/07/19 19:04:58
+ Log: Missed file that had changed
+ Branch: ansiperl
+ ! embedvar.h
+____________________________________________________________________________
+[ 1571] By: nick on 1998/07/19 18:57:35
+ Log: Another threaded, perl malloc issue, x2p's Makefile.SH has a
+ pattern match...
+ Branch: ansiperl
+ ! x2p/Makefile.SH
+____________________________________________________________________________
+[ 1570] By: nick on 1998/07/19 18:16:20
+ Log: Drat! - threaded perl-malloc has mutex that needs PL_
+ Branch: ansiperl
+ ! malloc.c perl.h
+____________________________________________________________________________
+[ 1569] By: nick on 1998/07/19 17:55:22
+ Log: PL_ for perl's malloc
+ Branch: ansiperl
+ ! hv.c malloc.c
+____________________________________________________________________________
+[ 1568] By: nick on 1998/07/19 16:23:30
+ Log: PL_ minir tidy up
+ Branch: ansiperl
+ ! embed.pl ext/Thread/Thread.xs util.c
+____________________________________________________________________________
+[ 1567] By: nick on 1998/07/19 13:21:07
+ Log: Add PL_ to merged file
+ Branch: ansiperl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 1566] By: nick on 1998/07/19 12:38:30
+ Log: Merge Mainline
+ Branch: ansiperl
+ + fixvars
+ !> (integrate 29 files)
+____________________________________________________________________________
+[ 1565] By: gsar on 1998/07/19 07:06:54
+ Log: tweak pod in MakeMaker.pm
+ From: Paul Johnson <pjcj@transeda.com>
+ Date: Sat, 18 Jul 1998 15:58:48 +0100
+ Message-ID: <19980718155847.D903@west-tip.transeda.com>
+ Subject: [PATCH]5.004_75 (DOC) MakeMaker.pm
+ Branch: perl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1564] By: gsar on 1998/07/19 07:04:45
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 17 Jul 1998 22:49:32 +0200
+ Message-ID: <m390lsb3tv.fsf@furu.g.aas.no>
+ Subject: [PATCH _75] sv_gets() did not NUL-terminate SV when reading records
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1563] By: gsar on 1998/07/19 07:03:32
+ Log: update freebsd hints
+ From: Mik Firestone <fireston@lexmark.com>
+ Date: Fri, 17 Jul 1998 15:24:26 -0400 (EDT)
+ Message-Id: <199807171924.AA05297@interlock2.lexmark.com>
+ Subject: [PATCH 5.005b1] hints/freebsd.sh
+ Branch: perl
+ ! hints/freebsd.sh
+____________________________________________________________________________
+[ 1562] By: gsar on 1998/07/19 07:01:33
+ Log: From: Mark Bixby <markb@spock.dis.cccd.edu>
+ Date: Fri, 17 Jul 1998 10:37:49 -0700 (PDT)
+ Message-Id: <199807171737.KAA06967@spock.dis.cccd.edu>
+ Subject: [PATCH 5.005b1] MPE/iX hints and readme tweaks
+ Branch: perl
+ ! README.mpeix hints/mpeix.sh
+____________________________________________________________________________
+[ 1561] By: gsar on 1998/07/19 07:00:19
+ Log: From: Norton Allen <allen@huarp.harvard.edu>
+ Date: Fri, 17 Jul 1998 12:37:27 -0400 (edt)
+ Message-Id: <199807171637.MAA24830@bottesini.harvard.edu>
+ Subject: [PATCH: 75] make install fails
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1560] By: gsar on 1998/07/19 06:58:55
+ Log: fix flawed substitution-loop detection on zero-length matches
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Fri, 17 Jul 1998 13:55:38 -0400 (EDT)
+ Message-Id: <199807171755.NAA27720@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Substitution loop in devel branch
+ Branch: perl
+ ! pp_hot.c t/op/subst.t
+____________________________________________________________________________
+[ 1559] By: gsar on 1998/07/19 06:56:19
+ Log: add perltrap entry about "${#a}", as suggested by
+ andy barfoot <abarfoot@eng.auburn.edu>
+ Branch: perl
+ ! pod/perltrap.pod
+____________________________________________________________________________
+[ 1558] By: gsar on 1998/07/19 06:43:53
+ Log: From: Anton Berezin <tobez@plab.ku.dk>
+ Date: Fri, 17 Jul 1998 11:49:30 +0200 (CEST)
+ Message-Id: <199807170949.LAA18099@lion.plab.ku.dk>
+ Subject: [PATCH 5.005b1] perlcall.pod SAVETMPS/FREETMPS bracket
+ Branch: perl
+ ! pod/perlcall.pod
+____________________________________________________________________________
+[ 1557] By: gsar on 1998/07/19 06:40:33
+ Log: From: "Art Green" <Art_Green@mercmarine.com>
+ Date: Thu, 16 Jul 1998 21:37:05 -0500
+ Message-ID: <86256644.000E61D4.00@FDLTest1.mercmarine.com>
+ Subject: [PATCH]:_75 - Update hints/aix.sh for c_r library
+ Branch: perl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 1556] By: gsar on 1998/07/19 06:38:17
+ Log: update README.threads
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Thu, 16 Jul 1998 11:10:33 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980716110949.2651J-100000@newton.phys>
+ Subject: Re: Sort of OK: 5.005-beta1 and threads on ppc-powerux-threads
+ Branch: perl
+ ! README.threads
+____________________________________________________________________________
+[ 1555] By: gsar on 1998/07/19 06:36:32
+ Log: From: Scott Henry <scotth@sgi.com>
+ Date: 15 Jul 1998 20:23:02 -0700
+ Message-ID: <yd890lu1nu1.fsf@hoshi.engr.sgi.com>
+ Subject: [PATCH 5.005-beta1] update hints/irix_6.sh
+ Branch: perl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 1554] By: gsar on 1998/07/19 06:35:10
+ Log: From: Spider Boardman <spider@web.zk3.dec.com>
+ Date: Wed, 15 Jul 1998 16:56:48 -0400
+ Message-Id: <199807152056.QAA369057@web.zk3.dec.com>
+ Subject: [PATCH _75] dec_osf hints still wrong
+ Branch: perl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 1553] By: gsar on 1998/07/19 06:33:29
+ Log: tweak hpux hints in vain attempt to get cppstdin set properly
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Wed, 15 Jul 1998 16:11:43 -0400 (EDT)
+ Subject: Re: HP-UX 11, perl 5.004_04, Oracle 7.3.3.4, DBI 0.93
+ Message-Id: <Pine.SUN.3.96.980715161018.1560D-100000@newton.phys>
+ --
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Thu, 16 Jul 1998 11:37:58 -0400 (EDT)
+ Subject: Re: Configure misses preprocessor on HP-UX
+ Message-Id: <Pine.SUN.3.96.980716113128.2651N-100000@newton.phys>
+ Branch: perl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 1552] By: gsar on 1998/07/19 06:26:24
+ Log: From: Tye McQueen <tye@metronet.com>
+ Date: Wed, 15 Jul 1998 13:46:44 -0500 (CDT)
+ Message-Id: <199807151846.AA12653@metronet.com>
+ Subject: Minor debugger fix
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 1551] By: gsar on 1998/07/19 06:25:05
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Wed, 15 Jul 1998 14:23:39 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980715135257.1310F-100000@newton.phys>
+ Subject: Re: Configure s?rand support [PATCH 5.004_75] -- better patch
+ Branch: perl
+ ! INSTALL pp.c
+____________________________________________________________________________
+[ 1550] By: gsar on 1998/07/19 06:23:10
+ Log: minor re.pm cleanup
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Wed, 15 Jul 1998 12:41:14 +0100
+ Message-Id: <E0ywPvu-0003V7-00@ursa.cus.cam.ac.uk>
+ Subject: Re: [PATCH 5.004_74]Don't use tainted REs in Basename.pm when building perl
+ Branch: perl
+ ! ext/re/re.pm pod/perldiag.pod
+____________________________________________________________________________
+[ 1549] By: gsar on 1998/07/19 06:20:49
+ Log: export additional symbols on OS/2
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 15 Jul 1998 06:13:07 -0400 (EDT)
+ Message-Id: <199807151013.GAA11279@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Export more symbols from Perl DLL
+ Branch: perl
+ ! os2/os2.sym
+____________________________________________________________________________
+[ 1548] By: gsar on 1998/07/19 06:18:58
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 15 Jul 1998 06:10:36 -0400 (EDT)
+ Message-Id: <199807151010.GAA11270@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Minor improvements to perlcc
+ Branch: perl
+ ! utils/perlcc.PL
+____________________________________________________________________________
+[ 1547] By: gsar on 1998/07/19 06:17:22
+ Log: applied slightly tweaked version of patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 16 Jul 1998 15:49:15 -0400 (EDT)
+ Message-Id: <199807161949.PAA08214@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Updated patch to Test::Harness
+ Branch: perl
+ ! lib/Test/Harness.pm
+____________________________________________________________________________
+[ 1546] By: gsar on 1998/07/19 06:11:03
+ Log: improve 'frame' handling in debugger
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 15 Jul 1998 00:52:10 -0400 (EDT)
+ Message-Id: <199807150452.AAA06685@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Better debugger trace
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 1545] By: gsar on 1998/07/19 06:07:51
+ Log: fix and test handling of literal newlines in heredocs
+ From: Gisle Aas <gisle@aas.no>
+ Date: 17 Jul 1998 14:58:25 +0200
+ Message-ID: <m3iukw63da.fsf@furu.g.aas.no>
+ Subject: Re: [PATCH _71] CRs et al
+ --
+ From: larry@wall.org (Larry Wall)
+ Date: Fri, 17 Jul 1998 09:32:35 -0700
+ Message-Id: <199807171632.JAA12959@wall.org>
+ Subject: Re: [PATCH _71] CRs et al
+ Branch: perl
+ ! t/comp/multiline.t toke.c
+____________________________________________________________________________
+[ 1544] By: gsar on 1998/07/19 06:00:12
+ Log: remove possibly unwritable lib/re.pm before overwrite
+ From: larry@wall.org (Larry Wall)
+ Date: Wed, 15 Jul 1998 14:26:03 -0700
+ Message-Id: <199807152126.OAA04623@wall.org>
+ Subject: Re: bug encountered building perl5.005beta1
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1543] By: gsar on 1998/07/19 05:56:18
+ Log: unsubmitted Changes tweak
+ Branch: perl
+ ! Changes cygwin32/ld2
+____________________________________________________________________________
+[ 1542] By: gsar on 1998/07/19 01:21:22
+ Log: make failed matches return empty list in list context
+ Branch: perl
+ ! pod/perlop.pod pp_hot.c t/op/pat.t
+____________________________________________________________________________
+[ 1541] By: gsar on 1998/07/18 22:27:59
+ Log: remove obsolete perltrap about m//g's pos() reset behavior
+ Branch: perl
+ ! pod/perltrap.pod
+____________________________________________________________________________
+[ 1540] By: nick on 1998/07/18 22:16:26
+ Log: PL_ stuff passes non-threaded on Mingw32
+ (Why did it compile without this fix?)
+ Branch: ansiperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1539] By: TimBunce on 1998/07/18 22:04:58
+ Log: Assorted patches:
+
+ Title: "Minor fixes to MakeMaker docs re ExtUtils::Embed"
+ From: Paul Johnson <pjcj@transeda.com>
+ Msg-ID: <19980718155847.D903@west-tip.transeda.com>
+ Files: lib/ExtUtils/MakeMaker.pm
+
+ Title: "Update t/op/array.t (from 5.005 beta 1)"
+ Files: t/op/array.t
+ Branch: maint-5.004/perl
+ ! lib/ExtUtils/MakeMaker.pm t/op/array.t
+____________________________________________________________________________
+[ 1538] By: TimBunce on 1998/07/18 21:57:50
+ Log: Title: "Remove flawed '// with parens or $&' performance patch (Change 662)"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Tim Bunce <Tim.Bunce@ig.co.uk>,
+ larry@wall.org (Larry Wall)
+ Msg-ID: <19980717015308.E6244@ig.co.uk>, <199807171819.LAA13771@wall.org>,
+ <E0yvtzn-0002F9-00@ursa.cus.cam.ac.uk>
+ Files: cop.h embed.h perl.h proto.h regexp.h gv.c interp.sym perl.c pp.c
+ pp_ctl.c pp_hot.c regexec.c scope.c
+ Branch: maint-5.004/perl
+ ! cop.h embed.h gv.c interp.sym perl.c perl.h pp.c pp_ctl.c
+ ! pp_hot.c proto.h regexec.c regexp.h scope.c
+____________________________________________________________________________
+[ 1537] By: nick on 1998/07/18 20:56:58
+ Log: PL_ scheme Builds under Minw32 - some SEGFAULT snags
+ Branch: ansiperl
+ ! doio.c mg.c perl.c pp_hot.c pp_sys.c util.c win32/perllib.c
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 1536] By: nick on 1998/07/18 20:50:26
+ Log: Merge latest mainline
+ Branch: ansiperl
+ ! patchlevel.h
+ !> ext/Thread/Thread.xs op.h util.c
+____________________________________________________________________________
+[ 1535] By: nick on 1998/07/18 16:45:29
+ Log: Edited "behind my back" ...
+ Branch: ansiperl
+ ! vms/perly_c.vms
+____________________________________________________________________________
+[ 1534] By: nick on 1998/07/18 16:38:27
+ Log: PL_ stuff for threads
+ Branch: ansiperl
+ ! byterun.c cop.h deb.c doio.c doop.c embed.pl embedvar.h
+ ! ext/B/B.xs ext/Thread/Thread.xs gv.c intrpvar.h mg.c
+ ! miniperlmain.c op.c op.h perl.c perl.h perly.y pp.c pp.h
+ ! pp_ctl.c pp_hot.c pp_sys.c regexec.c run.c scope.c sv.c sv.h
+ ! thread.h toke.c util.c win32/perllib.c
+____________________________________________________________________________
+[ 1533] By: nick on 1998/07/18 14:30:54
+ Log: Builds and passes tests with -DMULTIPLICITY and -DCRIPPLED_CC
+ (still with PERL_GLOBAL_STRUCT) - to cover more #if branches
+ Branch: ansiperl
+ ! embed.pl intrpvar.h perl.c toke.c
+____________________________________________________________________________
+[ 1532] By: nick on 1998/07/18 13:53:03
+ Log: PL_ prefix to all perlvars, part1
+ Builds and passes all tests at one limit i.e. -DPERL_GLOBAL_STRUCT
+ Branch: ansiperl
+ ! XSUB.h av.c bytecode.h byterun.c byterun.h cop.h deb.c doio.c
+ ! doop.c dump.c embed.h embed.pl embedvar.h ext/B/B.xs
+ ! ext/Data/Dumper/Dumper.xs ext/DynaLoader/dl_next.xs
+ ! ext/ODBM_File/ODBM_File.xs ext/Opcode/Opcode.xs
+ ! ext/POSIX/POSIX.xs ext/Socket/Socket.xs ext/attrs/attrs.xs
+ ! ext/re/re.xs gv.c hv.c hv.h lib/ExtUtils/typemap
+ ! lib/ExtUtils/xsubpp mg.c miniperlmain.c op.c perl.c perl.h
+ ! perly.c perly.y pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c regcomp.c
+ ! regcomp.h regexec.c run.c scope.c scope.h sv.c sv.h taint.c
+ ! thrdvar.h toke.c universal.c util.c
+____________________________________________________________________________
+[ 1531] By: gsar on 1998/07/18 08:48:13
+ Log: fix yet another USE_THREADS leak due to failure to free stacks
+ Branch: perl
+ ! ext/Thread/Thread.xs util.c
+____________________________________________________________________________
+[ 1530] By: gsar on 1998/07/18 08:46:58
+ Log: fix major bug in GIMME (introduced in 5.003_96); void contexts were
+ using the context of the enclosing sub!
+ Branch: perl
+ ! op.h
+____________________________________________________________________________
+[ 1529] By: nick on 1998/07/18 08:18:03
+ Log: Integrate post-beta tweaks to ansiperl
+ Branch: ansiperl
+ !> ObjXSub.h embed.h ext/Thread/Thread.xs global.sym gv.c mg.c
+ !> objpp.h op.c perl.c perl.h pp_sys.c proto.h sv.c t/op/substr.t
+ !> t/op/vec.t toke.c util.c
+____________________________________________________________________________
+[ 1528] By: gsar on 1998/07/18 04:23:12
+ Log: fix lvalue leaks stemming from failure to free LvTARG(sv)
+ Branch: perl
+ ! ObjXSub.h embed.h global.sym mg.c objpp.h perl.h proto.h sv.c
+ ! t/op/substr.t t/op/vec.t
+____________________________________________________________________________
+[ 1527] By: gsar on 1998/07/18 02:16:40
+ Log: check ferror() only if read() returned 0
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1526] By: gsar on 1998/07/18 02:08:01
+ Log: fix another CvMUTEXP() leak
+ Branch: perl
+ ! gv.c
+____________________________________________________________________________
+[ 1525] By: TimBunce on 1998/07/18 01:51:52
+ Log: Assorted patches:
+
+ Title: "Fix @a=@a=qw(...) properly"
+ From: Stephen McCamant <alias@mcs.com>
+ Msg-ID: <13742.49404.367751.437966@alias-2.pr.mcs.net>
+ Files: opcode.h
+
+ Title: "Larry's patch to support CR LF in scripts (updated)"
+ From: Gisle Aas <gisle@aas.no>, larry@wall.org (Larry Wall)
+ Msg-ID: <199807120054.RAA19550@wall.org>, <m3iukw63da.fsf@furu.g.aas.no>
+ Files: t/comp/multiline.t toke.c
+
+ Title: "Change getc() docs to match behaviour. Make read() return undef on
+ error."
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807052257.SAA10004@aatma.engin.umich.edu>
+ Files: pod/perlfunc.pod pp_sys.c
+
+ Title: "Update patchls utility"
+ Files: Porting/patchls
+ Branch: maint-5.004/perl
+ ! Porting/patchls opcode.h pod/perlfunc.pod pp_sys.c
+ ! t/comp/multiline.t toke.c
+____________________________________________________________________________
+[ 1524] By: gsar on 1998/07/18 01:22:35
+ Log: fix CvMUTEXP() leaks with -Dusethreads
+ Branch: perl
+ ! op.c toke.c
+____________________________________________________________________________
+[ 1523] By: gsar on 1998/07/18 01:17:28
+ Log: fix $/ init for multiple interpreters/threads
+ Branch: perl
+ ! ext/Thread/Thread.xs perl.c util.c
+____________________________________________________________________________
+[ 1522] By: gsar on 1998/07/18 01:11:07
+ Log: fix missing init that caused RE alternations to fail under
+ -Dusethreads
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 1521] By: TimBunce on 1998/07/16 22:23:25
+ Log: Assorted patches:
+
+ Title: "Allow $SIG{CHLD}='IGNORE' to work (reap zombies) on Solaris"
+ From: Albert Dvornik <bert@genscan.com>, Chip Salzenberg <chip@perl.org>
+ Msg-ID: <19980708181055.A8005@perlsupport.com>,
+ <tqn2adkvge.fsf@puma.genscan.com>
+ Files: util.c
+
+ Title: "Document perltrap on precedence of keys/values/each"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807151857.OAA04704@aatma.engin.umich.edu>
+ Files: pod/perltrap.pod
+
+ Title: "perlbook.pod patch"
+ From: Tom Christiansen <tchrist@chthon.perl.com>
+ Msg-ID: <199807140037.SAA04556@chthon.perl.com>
+ Files: pod/perlbook.pod
+
+ Title: "perlmod.pod patch"
+ From: Tom Christiansen <tchrist@chthon.perl.com>
+ Msg-ID: <199807140109.TAA04678@chthon.perl.com>
+ Files: pod/perlmod.pod
+
+ Title: "Fix bug in IO::Handle->input_record_separator"
+ From: Robin Barker <rmb1@cise.npl.co.uk>, Swen Thuemmler
+ <Swen.Thuemmler@paderlinx.de>
+ Msg-ID: <199807161400.PAA25532@tempest.cise.npl.co.uk>,
+ <Pine.GSO.4.00.9807161649380.6537-100000@rmail>
+ Files: ext/IO/lib/IO/Handle.pm
+
+ Title: "update h2ph, Math::Complex and Math::Trig (from 5.005 beta 1)"
+ Files: lib/Math/Complex.pm lib/Math/Trig.pm t/lib/complex.t t/lib/h2ph.t
+ t/lib/trig.t utils/h2ph.PL
+
+ Title: "Update hints/irix_6.sh"
+ From: Scott Henry <scotth@sgi.com>
+ Msg-ID: <yd890lu1nu1.fsf@hoshi.engr.sgi.com>
+ Files: hints/irix_6.sh
+
+ Title: "Configure misses preprocessor on HP-UX (further fix)"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980716113128.2651N-100000@newton.phys>
+ Files: hints/hpux.sh
+
+ Title: "update perlbug to v1.26 (from 5.005 beta 1)"
+ Files: utils/perlbug.PL
+ Branch: maint-5.004/perl
+ ! ext/IO/lib/IO/Handle.pm hints/hpux.sh hints/irix_6.sh
+ ! lib/Math/Complex.pm lib/Math/Trig.pm pod/perlbook.pod
+ ! pod/perlmod.pod pod/perltrap.pod t/lib/complex.t t/lib/h2ph.t
+ ! t/lib/trig.t util.c utils/h2ph.PL utils/perlbug.PL
+____________________________________________________________________________
+[ 1520] By: TimBunce on 1998/07/15 21:24:12
+ Log: Assorted patches:
+
+ Title: "Add stub attrs.pm"
+ From: Graham Barr <gbarr@ti.com>, Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <19980713163312.A18222@asic.sc.ti.com>,
+ <199807132140.RAA09583@aatma.engin.umich.edu>
+ Files: MANIFEST lib/attrs.pm
+
+ Title: "Fix @a=@a=qw(...)"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>, Stephen McCamant
+ <alias@mcs.com>
+ Msg-ID: <13737.12300.950886.821143@alias-2.pr.mcs.net>,
+ <199807122351.TAA05649@aatma.engin.umich.edu>
+ Files: op.c opcode.pl t/op/array.t
+
+ Title: "Fix 'PERL_DESTRUCT_LEVEL=2 ./perl -DD -e 1' loop"
+ From: Gisle Aas <gisle@aas.no>, Stephen McCamant <alias@mcs.com>
+ Msg-ID: <13739.55551.205810.338648@alias-2.pr.mcs.net>,
+ <m33ec4jdwn.fsf@furu.g.aas.no>
+ Files: sv.c
+
+ Title: "Make Power MachTen use vfork() and system malloc()"
+ From: Dominic Dunlop <domo@computer.org>, Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <v03110700b1c95b010820@[195.95.102.91]>
+ Files: hints/machten.sh malloc.c
+
+ Title: "Use REG_INFTY in place of hardwired constant"
+ From: Dominic Dunlop <domo@computer.org>
+ Msg-ID: <v03110703b1ca662c44f8@[195.95.102.91]>
+ Files: regcomp.h regcomp.c regexec.c
+
+ Title: "Minor debugger fix (history adds an extra newline)"
+ From: Tye McQueen <tye@metronet.com>
+ Msg-ID: <199807151846.AA12653@metronet.com>
+ Files: lib/perl5db.pl
+
+ Title: "Protect Term::ReadLine against non-default $/ value"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>,
+ kstar@chapin.edu@ig.co.uk ()
+ Msg-ID: <19980713151749.G8596@O2.chapin.edu>,
+ <199807132139.RAA11270@monk.mps.ohio-state.edu>
+ Files: lib/Term/ReadLine.pm
+
+ Title: "Fix HP-UX 11 build (cppstdin)"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980715161018.1560D-100000@newton.phys>
+ Files: Configure hints/hpux.sh
+
+ Title: "VMS filetest operator fixup (SS$_ACCONFLICT)"
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Msg-ID: <3.0.5.32.19980702135255.00a6ad90@ous.edu>
+ Files: vms/vms.c
+ Branch: maint-5.004/perl
+ + lib/attrs.pm
+ ! Configure MANIFEST hints/hpux.sh hints/machten.sh
+ ! lib/Term/ReadLine.pm lib/perl5db.pl malloc.c op.c opcode.pl
+ ! regcomp.c regcomp.h regexec.c sv.c t/op/array.t vms/vms.c
+____________________________________________________________________________
+[ 1519] By: nick on 1998/07/15 18:56:17
+ Log: Integrate mainline at beta1
+ Branch: ansiperl
+ +> Porting/p4d2p README.mpeix Todo-5.005
+ +> ext/DynaLoader/dl_mpeix.xs ext/re/hints/mpeix.pl
+ +> mpeix/mpeixish.h mpeix/nm mpeix/relink perly_c.diff
+ +> pod/perld4.pod pod/perlport.pod t/lib/ipc_sysv.t
+ - Todo.5.005 lib/Bundle/CPAN.pm perly.c.diff pod/perldelta4.pod
+ - t/op/ipcmsg.t t/op/ipcsem.t
+ !> (integrate 167 files)
+
+----------------
+Version 5.004_75 5.005 Public Beta, Issue 1
+----------------
+
+____________________________________________________________________________
+[ 1518] By: gsar on 1998/07/15 10:01:41
+ Log: add stub docs for ext/B, other minor tweaks
+ Branch: perl
+ ! Changes Porting/config_H config_h.SH ext/B/B.pm
+ ! ext/B/B/Asmdata.pm ext/B/B/Assembler.pm ext/B/B/Bblock.pm
+ ! ext/B/B/Bytecode.pm ext/B/B/C.pm ext/B/B/CC.pm
+ ! ext/B/B/Debug.pm ext/B/B/Disassembler.pm ext/B/B/Showlex.pm
+ ! ext/B/B/Stackobj.pm ext/B/B/Terse.pm ext/B/O.pm sv.c
+____________________________________________________________________________
+[ 1517] By: gsar on 1998/07/15 08:27:15
+ Log: up patchlevel to 75 (Beta, Issue 1), add podpatch
+ From: abigail@fnx.com
+ Date: Wed, 15 Jul 1998 04:03:44 -0400 (EDT)
+ Message-ID: <19980715080344.21975.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.004_74] pod/perlop.pod
+ Branch: perl
+ ! Changes patchlevel.h pod/perlop.pod win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1516] By: gsar on 1998/07/15 08:04:24
+ Log: From: abigail@fnx.com
+ Date: Wed, 15 Jul 1998 03:47:56 EDT
+ Message-Id: <19980715074756.21868.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.004_74] pod/pod2man.PL Fix use of < inside C<>
+ Branch: perl
+ ! pod/pod2man.PL
+____________________________________________________________________________
+[ 1515] By: gsar on 1998/07/15 08:02:14
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 15 Jul 1998 03:49:24 EDT
+ Message-Id: <199807150749.DAA09177@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] Additional targets for OS/2 build
+ Branch: perl
+ ! os2/Makefile.SHs
+____________________________________________________________________________
+[ 1514] By: gsar on 1998/07/15 07:58:29
+ Log: rename some long file names to be 8.3 truncation-safe
+ Branch: perl
+ +> Todo-5.005 perly_c.diff pod/perld4.pod
+ - Todo.5.005 perly.c.diff pod/perldelta4.pod
+ ! MANIFEST Porting/pumpkin.pod perly.fixer
+____________________________________________________________________________
+[ 1513] By: gsar on 1998/07/15 07:35:29
+ Log: minor tweaks to docs on qr//
+ Branch: perl
+ ! ext/re/re.pm pod/perldelta.pod pod/perlop.pod pod/perlre.pod
+____________________________________________________________________________
+[ 1512] By: gsar on 1998/07/15 07:06:02
+ Log: applied patch, with tab tweak suggest by Peter Prymmer
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Tue, 14 Jul 1998 16:41:14 -0700
+ Message-Id: <3.0.5.32.19980714164114.00a3e2a0@ous.edu>
+ Subject: [PATCH 5.004_74]VMS build cleanups
+ Branch: perl
+ ! vms/descrip_mms.template
+____________________________________________________________________________
+[ 1511] By: gsar on 1998/07/15 07:03:33
+ Log: allow perlbug -ok when STDIN it not a tty
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Date: Wed, 15 Jul 1998 03:24:56 +0200
+ Message-Id: <l03130302b1d1b1e7c2a0@[194.222.64.89]>
+ Subject: Re: [NOT OK] 5.004_74: "make ok" not ok in IRIX 6.2
+ Branch: perl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 1510] By: gsar on 1998/07/15 06:59:43
+ Log: From: "Art Green" <Art_Green@mercmarine.com>
+ Date: Tue, 14 Jul 1998 20:53:48 -0500
+ Message-ID: <86256642.0004D7AB.00@FDLTest1.mercmarine.com>
+ Subject: [PATCH]:_74 - Allow Configure to recognize _AIX41 & _POWER compiler defines
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 1509] By: gsar on 1998/07/15 06:57:50
+ Log: typecast long vs. IV compares in pp_flip/pp_flop
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 1508] By: gsar on 1998/07/15 06:50:49
+ Log: don't copy foreach itervar when no external refs exist
+ From: Gisle Aas <gisle@aas.no>
+ Date: 15 Jul 1998 03:35:25 +0200
+ Message-ID: <m33ec3nbfm.fsf@furu.g.aas.no>
+ Subject: Re: Testcase for 1..n closure change
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 1507] By: gsar on 1998/07/15 06:46:41
+ Log: applied patch, regen headers
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Tue, 14 Jul 1998 19:56:47 -0500 (CDT)
+ Message-ID: <13739.64763.792570.626015@alias-2.pr.mcs.net>
+ Subject: B::Deparse update for qr// and regcreset
+ Branch: perl
+ ! ext/B/B/Deparse.pm opcode.h opcode.pl
+____________________________________________________________________________
+[ 1506] By: gsar on 1998/07/15 06:43:04
+ Log: make pregcomp et al VIRTUAL again for PERL_OBJECT
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Date: Tue, 14 Jul 1998 16:40:30 -0700
+ Message-ID: <000301bdaf80$c93d14a0$a32fa8c0@tau.Active>
+ Subject: [PATCH 5.004_74]
+ Branch: perl
+ ! proto.h
+____________________________________________________________________________
+[ 1505] By: gsar on 1998/07/15 06:41:43
+ Log: dont use sv_dump() in -DD diagnostic
+ From: Gisle Aas <gisle@aas.no>
+ Date: 14 Jul 1998 23:55:36 +0200
+ Message-ID: <m33ec4jdwn.fsf@furu.g.aas.no>
+ Subject: [PATCH] Fix 'PERL_DESTRUCT_LEVEL=2 ./perl -DD -e 1' loop
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1504] By: gsar on 1998/07/15 06:39:37
+ Log: add a few more thread.t tests
+ Branch: perl
+ ! t/lib/thread.t
+____________________________________________________________________________
+[ 1503] By: gsar on 1998/07/15 06:31:33
+ Log: fix thread.t ('join $t' ne '$t->join' !)
+ Branch: perl
+ ! t/lib/thread.t
+____________________________________________________________________________
+[ 1502] By: gsar on 1998/07/15 06:26:00
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 15 Jul 1998 01:45:57 +0300 (EET DST)
+ Message-Id: <199807142245.BAA09651@alpha.hut.fi>
+ Subject: [PATCH] 5.004_74: MPE/iX final touches
+ Branch: perl
+ ! installperl lib/File/Copy.pm
+____________________________________________________________________________
+[ 1501] By: gsar on 1998/07/15 05:59:49
+ Log: apply (reversed) patch
+ From: Peter Wolfe <wolfe@titan.teloseng.com>
+ Date: Tue, 14 Jul 1998 13:01:58 -0700 (PDT)
+ Message-Id: <199807142001.NAA26550@titan.teloseng.com>
+ Subject: NOT_OK: perl 5.00474 on SCO 3.2v5.0.4
+ Branch: perl
+ ! ext/IPC/SysV/SysV.xs
+____________________________________________________________________________
+[ 1500] By: gsar on 1998/07/15 05:57:39
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Tue, 14 Jul 1998 14:14:59 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980714141346.29710D-100000@newton.phys>
+ Subject: [PATCH 5.004_74] Config_74-01
+ Branch: perl
+ ! Configure MANIFEST Porting/Glossary Porting/config.sh
+ ! Porting/config_H Porting/pumpkin.pod config_h.SH
+ ! vms/subconfigure.com win32/config.bc win32/config.gc
+ ! win32/config.vc
+____________________________________________________________________________
+[ 1499] By: gsar on 1998/07/15 05:48:38
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 14 Jul 1998 21:35:02 +0300 (EET DST)
+ Message-Id: <199807141835.VAA09030@alpha.hut.fi>
+ Subject: [PATCH] 5.004_74: trig.t: math inaccuracy fudge for unicos
+ Branch: perl
+ ! t/lib/trig.t
+____________________________________________________________________________
+[ 1498] By: gsar on 1998/07/15 05:47:33
+ Log: -w, strict clean perldoc (via PM)
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Tue, 14 Jul 98 17:22:01 BST
+ Message-Id: <18695.9807141622@tempest.cise.npl.co.uk>
+ Subject: [PATCH 5.004_74] perldoc.PL
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1497] By: gsar on 1998/07/15 05:35:54
+ Log: add comment about cpprun etc., to hints/hpux.sh
+ Branch: perl
+ ! hints/hpux.sh
+____________________________________________________________________________
+[ 1496] By: gsar on 1998/07/15 05:15:16
+ Log: fix warning from CGI::Carp
+ Branch: perl
+ ! lib/CGI/Carp.pm
+____________________________________________________________________________
+[ 1495] By: gsar on 1998/07/14 23:47:18
+ Log: fix off-by-one in win32 registry handling
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Date: Tue, 14 Jul 1998 07:39:06 -0700
+ Message-ID: <000401bdaf35$27489e80$a32fa8c0@tau.Active>
+ Subject: [PATCH 5.004_73]
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 1494] By: gsar on 1998/07/14 23:45:58
+ Log: doc patches from Gisle Aas <gisle@aas.no>
+ Date: 14 Jul 1998 16:18:31 +0200
+ Message-ID: <m33ec4cy88.fsf@furu.g.aas.no>
+ Subject: [PATCH] substr/splice changes for perldelta.pod
+ --
+ Date: 14 Jul 1998 20:31:27 +0200
+ Message-ID: <m3hg0kqo74.fsf@furu.g.aas.no>
+ Subject: [PATCH] Duplicate description of use integer %
+ Branch: perl
+ ! pod/perldelta.pod pod/perlop.pod
+____________________________________________________________________________
+[ 1493] By: gsar on 1998/07/14 23:39:31
+ Log: File/Spec.pm needs trailing newline
+ Branch: perl
+ ! lib/File/Spec.pm
+____________________________________________________________________________
+[ 1492] By: gsar on 1998/07/14 21:43:03
+ Log: unsubmitted _74 tweaks
+ Branch: perl
+ ! Changes mpeix/nm mpeix/relink pod/perldelta.pod
+ ! pod/perldiag.pod
+
+----------------
+Version 5.004_74
+----------------
+
+____________________________________________________________________________
+[ 1491] By: gsar on 1998/07/14 08:48:28
+ Log: up patchlevel to 74; introduce distinct archname for PERL_OBJECT
+ Branch: perl
+ ! Changes patchlevel.h pod/perlhist.pod win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1490] By: gsar on 1998/07/14 08:31:13
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 14 Jul 1998 10:20:34 +0200
+ Message-Id: <m3hg0k973h.fsf@furu.g.aas.no>
+ Subject: [PATCH] Make -DP work (and readable)
+ Branch: perl
+ ! run.c
+____________________________________________________________________________
+[ 1489] By: gsar on 1998/07/14 08:23:46
+ Log: fix function parameter autovivification for pseudohashes
+ Branch: perl
+ ! mg.c t/op/avhv.t
+____________________________________________________________________________
+[ 1488] By: gsar on 1998/07/14 07:34:45
+ Log: merge changes#1423,1465 from maintbranch; checkin two missed files
+ from earlier changes#1461,1478
+ Branch: perl
+ ! pod/perldiag.pod pod/perlfunc.pod pod/perlop.pod pp_sys.c
+ ! t/TEST t/lib/thread.t t/op/local.t t/op/pat.t t/op/regexp.t
+ ! t/op/substr.t t/op/vec.t
+____________________________________________________________________________
+[ 1487] By: gsar on 1998/07/14 07:04:54
+ Log: tweak t/lib/thread.t
+ Branch: perl
+ ! t/lib/thread.t
+____________________________________________________________________________
+[ 1486] By: gsar on 1998/07/14 06:38:15
+ Log: applied patch, slightly tweaked
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Mon, 13 Jul 1998 11:52:27 -0700
+ Message-Id: <3.0.5.32.19980713115227.00a73970@ous.edu>
+ Subject: [PATCH 5.004_73]Get re module working on VMS
+ Branch: perl
+ ! ext/re/Makefile.PL perl.h proto.h
+____________________________________________________________________________
+[ 1485] By: gsar on 1998/07/14 06:32:58
+ Log: add Porting/p4d2p
+ Branch: perl
+ + Porting/p4d2p
+ ! MANIFEST
+____________________________________________________________________________
+[ 1484] By: gsar on 1998/07/14 06:08:20
+ Log: doc patches from Tom Christiansen <tchrist@chthon.perl.com> (via PM)
+ Date: Mon, 13 Jul 1998 19:09:09 -0600
+ Message-Id: <199807140109.TAA04678@chthon.perl.com>
+ Subject: perlmod.pod patch
+ --
+ Date: Mon, 13 Jul 1998 18:37:07 -0600
+ Message-Id: <199807140037.SAA04556@chthon.perl.com>
+ Subject: perlbook.pod patch
+ Branch: perl
+ ! pod/perlbook.pod pod/perlmod.pod
+____________________________________________________________________________
+[ 1483] By: gsar on 1998/07/14 06:04:25
+ Log: OS/2 update
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199807132336.TAA12967@monk.mps.ohio-state.edu>
+ Date: Mon, 13 Jul 1998 19:36:05 -0400 (EDT)
+ Subject: [PATCH 5.004_72] OS/2 system() and friends additions
+ Branch: perl
+ ! README.os2 hints/os2.sh os2/Changes os2/os2.c t/op/magic.t
+____________________________________________________________________________
+[ 1482] By: gsar on 1998/07/14 06:01:12
+ Log: more VMS patches from Dan Sugalski <sugalskd@osshe.edu>
+ Date: Mon, 13 Jul 1998 16:37:49 -0700
+ Message-Id: <3.0.5.32.19980713163749.00af1c40@ous.edu>
+ Subject: [PATCH 5.004_73]t/io/iprefix.t patch for VMS
+ --
+ Date: Mon, 13 Jul 1998 15:51:09 -0700
+ Message-Id: <3.0.5.32.19980713155109.00a52c30@ous.edu>
+ Subject: [PATCH5.004_73]Tweak t/lib/cgi-html.t to work on VMS
+ Branch: perl
+ ! t/io/iprefix.t t/lib/cgi-html.t
+____________________________________________________________________________
+[ 1481] By: gsar on 1998/07/14 05:57:36
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Mon, 13 Jul 1998 15:41:53 -0700
+ Message-Id: <3.0.5.32.19980713154153.00a87be0@ous.edu>
+ Subject: [PATCH 5.004_73]Fix t/base/rs.t test failures on VMS
+ Branch: perl
+ ! t/base/rs.t
+____________________________________________________________________________
+[ 1480] By: gsar on 1998/07/14 05:56:14
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Message-Id: <3.0.5.32.19980713150427.00b2a540@ous.edu>
+ Date: Mon, 13 Jul 1998 15:04:27 -0700
+ Subject: [PATCH 5.004_73]Thread tweak for VMS.C
+ Branch: perl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 1479] By: gsar on 1998/07/14 05:55:13
+ Log: From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Mon, 13 Jul 1998 23:13:43 +0200
+ Message-ID: <19980713231343.A178@cdata.tvnet.hu>
+ Subject: [PATCH _72] Configure problem on dos-djgpp
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 1478] By: gsar on 1998/07/14 05:53:08
+ Log: add files and tweaks needed for MPE/iX port (via PM)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 14 Jul 1998 00:07:30 +0300 (EET DST)
+ Message-Id: <199807132107.AAA20603@alpha.hut.fi>
+ Subject: MPE/iX patches for _73
+ Branch: perl
+ + README.mpeix ext/DynaLoader/dl_mpeix.xs ext/re/hints/mpeix.pl
+ + mpeix/mpeixish.h mpeix/nm mpeix/relink
+ ! MANIFEST ext/Socket/Socket.xs hints/mpeix.sh installperl
+ ! lib/File/Copy.pm perl.c perl.h pod/perldelta.pod
+____________________________________________________________________________
+[ 1477] By: gsar on 1998/07/14 04:23:28
+ Log: added suggested patch (via PM), tweaked to implicitly specify -DDEBUGGING
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 13 Jul 1998 16:50:55 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980713164922.28314B-100000@newton.phys>
+ Subject: Re: _70 and Devel::RE
+ Branch: perl
+ ! ext/re/Makefile.PL ext/re/re.xs regcomp.c regexec.c
+____________________________________________________________________________
+[ 1476] By: gsar on 1998/07/14 04:06:25
+ Log: minor Configure nits
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Mon, 13 Jul 1998 23:25:27 +0300 (EET DST)
+ Message-Id: <199807132025.XAA10771@alpha.hut.fi>
+ Subject: Configure patches for MVS (and one x2p/Makefile.SH)
+ Branch: perl
+ ! Configure x2p/Makefile.SH
+____________________________________________________________________________
+[ 1475] By: gsar on 1998/07/14 03:59:56
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Mon, 13 Jul 1998 12:54:19 -0700
+ Message-Id: <3.0.5.32.19980713125419.009e0100@ous.edu>
+ Subject: [PATCH 5.004_73] Fixes to the VMS configuration system
+ Branch: perl
+ ! vms/munchconfig.c vms/subconfigure.com
+____________________________________________________________________________
+[ 1474] By: gsar on 1998/07/14 03:58:13
+ Log: make Term::Readline::get_line() independent of caller's $/
+ From: kstar@chapin.edu
+ Date: Mon, 13 Jul 1998 15:17:49 -0400
+ Message-ID: <19980713151749.G8596@O2.chapin.edu>
+ Subject: [PATCH] Was: CPAN.pm still fails
+ Branch: perl
+ ! lib/Term/ReadLine.pm
+____________________________________________________________________________
+[ 1473] By: gsar on 1998/07/14 03:55:29
+ Log: fix $trnl interpolation in here-docs (via PM)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 13 Jul 1998 15:49:00 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980713151243.28129F-100000@newton.phys>
+ Subject: Re: [PATCH] 5.004_73: Re: Configure/trnl craziness
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 1472] By: gsar on 1998/07/14 03:50:18
+ Log: From: Dominic Dunlop <domo@ppp52.vo.lu>
+ Date: Mon, 13 Jul 1998 15:55:09 +0100 (WET DST)
+ Message-Id: <199807131455.PAA23621@ppp52.vo.lu>
+ Subject: Not OK: perl 5.00473 on powerpc-machten 4.1 [PATCH 5.004_73]
+ Branch: perl
+ ! hints/machten.sh
+____________________________________________________________________________
+[ 1471] By: gsar on 1998/07/14 03:49:07
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Message-Id: <3.0.5.32.19980713123005.00b6be50@ous.edu>
+ Date: Mon, 13 Jul 1998 12:30:05 -0700
+ Subject: [PATCH 5.004_73] Add Data::Dumper and re modules to VMS config stuff
+ Branch: perl
+ ! configure.com vms/descrip_mms.template
+____________________________________________________________________________
+[ 1470] By: gsar on 1998/07/14 03:40:14
+ Log: consistently refer to functions as C<foo()>
+ From: abigail@fnx.com
+ Date: Mon, 13 Jul 1998 03:04:24 -0400 (EDT)
+ Message-ID: <19980713070424.19841.qmail@betelgeuse.wayne.fnx.com>
+ Subject: Re: [PATCH 5.004_71] pod/perlfunc.pod
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1469] By: gsar on 1998/07/14 03:35:06
+ Log: From: Tom Hughes <thh@cyberscience.com>
+ Date: 13 Jul 1998 09:34:16 +0100
+ Message-ID: <yekk95i175j.fsf@elva.cyberscience.com>
+ Subject: [PATCH 5.004_72] Fix d_Gconvert definition in hints/svr4.sh
+ Branch: perl
+ ! hints/svr4.sh
+____________________________________________________________________________
+[ 1468] By: gsar on 1998/07/14 03:34:03
+ Log: From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
+ Date: 13 Jul 1998 11:16:27 +0200
+ Message-ID: <sfc90lyqff8.fsf@dubravka.in-berlin.de>
+ Subject: Parallel Makefiles
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 1467] By: gsar on 1998/07/14 03:31:39
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 13 Jul 1998 00:12:19 -0400 (EDT)
+ Message-Id: <199807130412.AAA27128@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_72] t/io/pipe.t - completely broken?
+ Branch: perl
+ ! t/io/pipe.t
+____________________________________________________________________________
+[ 1466] By: gsar on 1998/07/14 03:29:25
+ Log: minor tweaks to perldelta and README.win32
+ Branch: perl
+ ! Changes README.win32 pod/perldelta.pod
+____________________________________________________________________________
+[ 1465] By: TimBunce on 1998/07/13 21:33:45
+ Log: Assorted patches:
+
+ Title: "Fix string substitution returncode problem"
+ From: Dominic Dunlop <domo@vo.lu>, Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805271236.IAA28213@aatma.engin.umich.edu>,
+ <v03110700b191a557f041@[195.95.102.114]>
+ Files: pp_hot.c
+
+ Title: "umask EXPR is fatal only if (EXPR & 0700) > 0"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807111656.MAA03310@aatma.engin.umich.edu>
+ Files: pod/perldiag.pod pp_sys.c
+
+ Title: "Remove reference to qsort from perlfunc.pod"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807111923.PAA05124@aatma.engin.umich.edu>
+ Files: pod/perlfunc.pod
+
+ Title: "Deprecate AvFILL in favor of av_len()"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807111945.PAA05489@aatma.engin.umich.edu>
+ Files: pod/perlguts.pod
+
+ Title: "Further clarify effects of using quotes with m operator"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199806201921.PAA03829@aatma.engin.umich.edu>
+ Files: pod/perlop.pod
+
+ Title: "Add PERL_DESTRUCT_LEVEL=2 to test suite"
+ From: Tim Bunce
+ Files: t/TEST t/op/local.t t/op/pat.t t/op/regexp.t t/op/substr.t t/op/vec.t
+ Branch: maint-5.004/perl
+ ! pod/perldiag.pod pod/perlfunc.pod pod/perlguts.pod
+ ! pod/perlop.pod pp_hot.c pp_sys.c t/TEST t/op/local.t
+ ! t/op/pat.t t/op/regexp.t t/op/substr.t t/op/vec.t toke.c
+
+----------------
+Version 5.004_73
+----------------
+
+____________________________________________________________________________
+[ 1464] By: gsar on 1998/07/13 04:41:07
+ Log: up patchlevel to 73, update Changes &c.
+ Branch: perl
+ ! Changes patchlevel.h pod/perlhist.pod t/op/array.t
+ ! win32/Makefile win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1463] By: gsar on 1998/07/13 02:58:51
+ Log: avoid empty rm -f in MM_Unix.pm
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 1462] By: gsar on 1998/07/13 02:54:52
+ Log: update perldelta
+ Branch: perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 1461] By: gsar on 1998/07/13 02:44:30
+ Log: added patch, tweaked PERL_OBJECT things
+ From: Graham Barr <gbarr@pobox.com>
+ Date: Sun, 12 Jul 1998 19:57:47 CDT
+ Message-Id: <19980712195747.C493@pobox.com>
+ Subject: [ PATCH perl5.004_72] patch to add qr//
+ Branch: perl
+ ! dump.c embed.h ext/Opcode/Opcode.pm global.sym globals.c
+ ! keywords.h keywords.pl op.c op.h opcode.h opcode.pl
+ ! pod/perlfunc.pod pp.c pp_hot.c pp_proto.h proto.h regcomp.c
+ ! regexp.h sv.c t/op/pat.t toke.c
+____________________________________________________________________________
+[ 1460] By: gsar on 1998/07/13 01:25:07
+ Log: add a few more PURIFY guards
+ Branch: perl
+ ! av.c sv.c
+____________________________________________________________________________
+[ 1459] By: gsar on 1998/07/12 23:38:31
+ Log: add tests for change#1458 and then some
+ Branch: perl
+ ! t/op/array.t
+____________________________________________________________________________
+[ 1458] By: gsar on 1998/07/12 22:42:47
+ Log: apply patch for smarter AASSIGN_COMMON detection; regen headers
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Sun, 12 Jul 1998 17:17:00 CDT
+ Message-Id: <13737.12300.950886.821143@alias-2.pr.mcs.net>
+ Subject: [PATCH] @a=@a=qw(1) not working, both 5.004_04 and 5.004_71
+ Branch: perl
+ ! op.c opcode.h opcode.pl
+____________________________________________________________________________
+[ 1457] By: gsar on 1998/07/12 22:06:05
+ Log: small tweaks from Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Branch: perl
+ ! Configure Makefile.SH ext/Socket/Socket.xs perl.c
+____________________________________________________________________________
+[ 1456] By: gsar on 1998/07/12 21:56:39
+ Log: From: Doug MacEachern <dougm@pobox.com>
+ Date: Sun, 12 Jul 1998 14:29:29 -0400
+ Message-Id: <199807121829.OAA00525@postman.opengroup.org>
+ Subject: [PATCH 5.004_72] Embed.pm support for PERL_OBJECT
+ Branch: perl
+ ! lib/ExtUtils/Embed.pm
+____________________________________________________________________________
+[ 1455] By: gsar on 1998/07/12 21:54:02
+ Log: applied installperl patch, corrected other little nits
+ From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
+ Date: 12 Jul 1998 16:27:21 +0200
+ Message-ID: <sfcn2afrvp2.fsf@dubravka.in-berlin.de>
+ Subject: [5.004_72] installperl tweak
+ Branch: perl
+ ! Changes Configure README.win32 installperl win32/makefile.mk
+____________________________________________________________________________
+[ 1454] By: gsar on 1998/07/12 10:14:24
+ Log: update MANIFEST, Changes
+ Branch: perl
+ - lib/Bundle/CPAN.pm
+ ! Changes MANIFEST
+
+----------------
+Version 5.004_72
+----------------
+
+____________________________________________________________________________
+[ 1453] By: gsar on 1998/07/12 10:04:33
+ Log: merge changes 1424, 1428 from maintbranch
+ Branch: perl
+ ! Porting/makerel ext/re/re.pm lib/Sys/Syslog.pm
+____________________________________________________________________________
+[ 1452] By: gsar on 1998/07/12 09:46:40
+ Log: patchlevel up to 72, update Changes, minor tweaks to win32/config*
+ and README.win32
+ Branch: perl
+ ! Changes README.win32 patchlevel.h win32/Makefile
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1451] By: gsar on 1998/07/12 07:01:26
+ Log: generic Configure mods and HAS_GROUP additions to help MiNT/MPEix/MVS
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Sat, 11 Jul 1998 17:51:07 +0300 (EET DST)
+ Message-Id: <199807111451.RAA27010@alpha.hut.fi>
+ Subject: M3 "generic" parts
+ Branch: perl
+ ! Configure Makefile.SH config_h.SH ext/POSIX/POSIX.xs
+ ! ext/SDBM_File/sdbm/sdbm.h lib/ExtUtils/MM_Unix.pm
+ ! makedepend.SH mv-if-diff perl.h plan9/plan9ish.h pp_sys.c
+ ! unixish.h vms/subconfigure.com vms/vmsish.h win32/config_H.bc
+ ! win32/config_H.gc x2p/Makefile.SH
+____________________________________________________________________________
+[ 1450] By: gsar on 1998/07/12 06:38:27
+ Log: various tweaks for PERL_OBJECT build & test
+ Branch: perl
+ ! globals.c iperlsys.h win32/GenCAPI.pl win32/Makefile
+ ! win32/makefile.mk win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 1449] By: gsar on 1998/07/12 06:29:23
+ Log: From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
+ Date: 12 Jul 1998 08:22:16 +0200
+ Message-Id: <sfck95jtwpz.fsf@dubravka.in-berlin.de>
+ Subject: [5.004_71] Patch: let CPAN.pm work with threaded perl
+ Branch: perl
+ ! lib/CPAN.pm lib/SelfLoader.pm
+____________________________________________________________________________
+[ 1448] By: gsar on 1998/07/12 05:10:50
+ Log: make RE engine threadsafe; -Dusethreads builds, tests on Solaris,
+ and runs regexes in 1000s of threads without crashing; also fixed
+ statcache not being thread-local
+ Branch: perl
+ ! embed.h embedvar.h ext/Thread/Thread.xs ext/re/re.xs
+ ! intrpvar.h op.c perl.c pp_ctl.c regcomp.c regexec.c sv.c
+ ! t/lib/thread.t thrdvar.h util.c
+____________________________________________________________________________
+[ 1447] By: gsar on 1998/07/12 02:40:45
+ Log: From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Date: Sun, 12 Jul 1998 03:23:04 +0200
+ Message-Id: <l03130300b1cdbff87621@[194.222.64.89]>
+ Subject: Re: perlbug doesn't check that save succeeded
+ Branch: perl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 1446] By: gsar on 1998/07/12 02:39:24
+ Log: be generous about CRs
+ From: larry@wall.org (Larry Wall)
+ Date: Sat, 11 Jul 1998 17:54:21 PDT
+ Message-Id: <199807120054.RAA19550@wall.org>
+ Subject: [PATCH _71] CRs et al
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 1445] By: gsar on 1998/07/12 02:11:16
+ Log: fix pp_caller() to fully traverse stacklevels
+ Branch: perl
+ ! objpp.h pp_ctl.c proto.h t/op/runlevel.t
+____________________________________________________________________________
+[ 1444] By: gsar on 1998/07/11 23:43:37
+ Log: add patch, along with all the missing bits, and doc tweaks
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 9 Jul 1998 18:47:25 -0400 (EDT)
+ Message-Id: <199807092247.SAA06314@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.004_71] Secure RE update
+ Branch: perl
+ ! ObjXSub.h embed.h embedvar.h ext/Opcode/Opcode.pm ext/re/re.pm
+ ! global.sym globals.c interp.sym intrpvar.h op.c opcode.h
+ ! opcode.pl pp_ctl.c pp_proto.h regcomp.c sv.c t/op/misc.t
+ ! t/op/pat.t t/op/subst.t
+____________________________________________________________________________
+[ 1443] By: gsar on 1998/07/11 23:08:14
+ Log: tweak to get BSDI to build IPC/SysV
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: 11 Jul 1998 16:26:44 +0300
+ Message-ID: <oeeww9kecx7.fsf@alpha.hut.fi>
+ Subject: Re: NOT OK: perl5.004_71 on BSDI 3.1
+ Branch: perl
+ ! ext/IPC/SysV/SysV.xs
+____________________________________________________________________________
+[ 1442] By: gsar on 1998/07/11 23:03:39
+ Log: fix closures in optimized C<for (1..5)> (only the tests are in this
+ change, the pp_hot.c fix accidentally went in change#1441)
+ Branch: perl
+ ! t/op/closure.t
+____________________________________________________________________________
+[ 1441] By: gsar on 1998/07/11 22:35:40
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Sat, 11 Jul 1998 18:21:21 -0400 (EDT)
+ Message-Id: <199807112221.SAA03221@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_71] Update os2's OS2::Process
+ Branch: perl
+ ! os2/OS2/Process/Makefile.PL os2/OS2/Process/Process.pm
+ ! os2/OS2/Process/Process.xs pp_hot.c
+____________________________________________________________________________
+[ 1440] By: gsar on 1998/07/11 19:41:59
+ Log: From: andreas.koenig@kulturbox.de (Andreas J. Koenig)
+ Date: 11 Jul 1998 17:00:21 +0200
+ Message-ID: <sfc1zrsxwje.fsf@dubravka.in-berlin.de>
+ Subject: [perl5.004_71] Patch: change MakeMaker default compress --> gzip
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1439] By: gsar on 1998/07/11 19:36:58
+ Log: export newRV_noinc on win32, deprecate AvFILL in favor of av_len()
+ Branch: perl
+ ! pod/perlguts.pod win32/makedef.pl
+____________________________________________________________________________
+[ 1438] By: gsar on 1998/07/11 19:14:21
+ Log: applied patch for perlfunc tweaks, removed reference to system qsort()
+ From: abigail@fnx.com
+ Date: Sat, 11 Jul 1998 04:20:54 -0400 (EDT)
+ Message-ID: <19980711082054.2184.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.004_71] pod/perlfunc.pod
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1437] By: gsar on 1998/07/11 19:05:00
+ Log: From: abigail@fnx.com
+ Date: Sat, 11 Jul 1998 04:09:57 -0400 (EDT)
+ Message-ID: <19980711080957.2106.qmail@betelgeuse.wayne.fnx.com>
+ Subject: [PATCH 5.004_71] pod/pod2man.PL
+ Branch: perl
+ ! pod/pod2man.PL
+____________________________________________________________________________
+[ 1436] By: gsar on 1998/07/11 18:58:03
+ Log: more complete version of change#1421
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Fri, 10 Jul 1998 23:46:46 -0500 (CDT)
+ Message-ID: <13734.58994.735473.859218@alias-2.pr.mcs.net>
+ Subject: [PATCH] Re: B::Deparse for(1..100000)
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 1435] By: gsar on 1998/07/11 18:54:42
+ Log: win32 fixes for VC 6.0 nits
+ Branch: perl
+ ! ext/Data/Dumper/Dumper.xs win32/Makefile win32/makefile.mk
+ ! win32/win32.h
+____________________________________________________________________________
+[ 1434] By: gsar on 1998/07/11 18:45:32
+ Log: s/AVHV/pseudo-hash/ (via PM)
+ From: Gisle Aas <gisle@aas.no>
+ Date: 11 Jul 1998 00:16:53 +0200
+ Message-ID: <m3hg0pbbca.fsf@furu.g.aas.no>
+ Subject: [PATCH] trivial fields.pm doc patch
+ Branch: perl
+ ! lib/fields.pm
+____________________________________________________________________________
+[ 1433] By: gsar on 1998/07/11 18:43:11
+ Log: From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Fri, 10 Jul 1998 23:12:11 +0200
+ Message-ID: <19980710231211.A161@cdata.tvnet.hu>
+ Subject: [PATCH _71] dos-djgpp update
+ Branch: perl
+ ! Configure djgpp/config.over djgpp/djgppsed.sh djgpp/fixpmain
+____________________________________________________________________________
+[ 1432] By: gsar on 1998/07/11 18:41:00
+ Log: applied patch, reformatted long lines in places
+ From: Dominic Dunlop <domo@computer.org>
+ Date: Fri, 10 Jul 1998 23:11:30 +0000
+ Message-Id: <v03110703b1cc32a02438@[195.95.102.91]>
+ Subject: [PATCH 5.004_71] Re: Document "count exceeded" regular expression
+ warning
+ Branch: perl
+ ! pod/perldiag.pod regexec.c
+____________________________________________________________________________
+[ 1431] By: gsar on 1998/07/11 18:29:18
+ Log: From: "John L. Allen" <allen@grumman.com>
+ Date: Fri, 10 Jul 1998 13:57:01 -0400 (EDT)
+ Message-ID: <Pine.SOL.3.91.980710134236.15717A-100000@gateway.grumman.com>
+ Subject: [PATCH]: _71 & _04 - Make AIX hints preserve ccflags as per docs
+ Branch: perl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 1430] By: TimBunce on 1998/07/11 18:15:09
+ Log: Title: "Fix string substitution returncode problem"
+ From: Dominic Dunlop <domo@vo.lu>, Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805271236.IAA28213@aatma.engin.umich.edu>,
+ <v03110700b191a557f041@[195.95.102.114]>
+ Files: pp_hot.c
+ Branch: maint-5.004/perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 1429] By: gsar on 1998/07/11 18:07:52
+ Log: applied patch, tweaked doc and code that does labels/indentation
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Thu, 9 Jul 1998 21:39:40 -0400 (EDT)
+ Message-Id: <199807100139.VAA08617@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_71] perldebug.pod and RE
+ Branch: perl
+ ! pod/perldebug.pod regcomp.c regexec.c
+____________________________________________________________________________
+[ 1428] By: TimBunce on 1998/07/11 17:45:56
+ Log: Assorted patches:
+
+ Title: "makerel now reads local patch list from patchlevel.h"
+ Files: patchlevel.h Porting/makerel
+
+ Title: "pod/pod2man.PL"
+ From: abigail@fnx.com
+ Msg-ID: <19980711080957.2106.qmail@betelgeuse.wayne.fnx.com>
+ Files: pod/pod2man.PL
+
+ Title: "Clarify taint example in re.pm"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980623155803.3227X-100000@user2.teleport.com>
+ Files: lib/re.pm
+
+ Title: "Anohter ptags improvement"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199807070059.UAA28815@monk.mps.ohio-state.edu>
+ Files: emacs/ptags
+
+ Title: "_71 & _04 - Make AIX hints preserve ccflags as per docs"
+ From: "John L. Allen" <allen@grumman.com>
+ Msg-ID: <Pine.SOL.3.91.980710134236.15717A-100000@gateway.grumman.com>
+ Files: hints/aix.sh
+ Branch: maint-5.004/perl
+ ! Porting/makerel emacs/ptags hints/aix.sh lib/re.pm
+ ! patchlevel.h pod/pod2man.PL
+____________________________________________________________________________
+[ 1427] By: gsar on 1998/07/11 17:04:47
+ Log: make Liblist return consistently backslashed paths
+ Branch: perl
+ ! lib/ExtUtils/Liblist.pm
+____________________________________________________________________________
+[ 1426] By: gsar on 1998/07/11 16:53:56
+ Log: don't 'touch a2p.c', it might readonly (via PM)
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Fri, 10 Jul 98 17:19:54 BST
+ Message-Id: <20430.9807101619@tempest.cise.npl.co.uk>
+ Branch: perl
+ ! x2p/Makefile.SH
+____________________________________________________________________________
+[ 1425] By: TimBunce on 1998/07/11 16:42:26
+ Log: Title: "Add newCONSTSUB (from 5.005_70)"
+ Files: embed.h proto.h global.sym op.c
+ Branch: maint-5.004/perl
+ ! embed.h global.sym op.c proto.h
+____________________________________________________________________________
+[ 1424] By: TimBunce on 1998/07/11 16:20:21
+ Log: Title: "Assorted fixes for Sys::Syslog.pm"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Sean Robinson
+ <ROBINSON_S@sc.maricopa.edu>, Tim.Bunce@ig.co.uk
+ Msg-ID: <01IXGLISWJ7Q0001B6@sc.maricopa.edu>,
+ <199805270939.KAA08453@toad.ig.co.uk>,
+ <E0yeHPI-00047D-00@taurus.cus.cam.ac.uk>
+ Files: lib/Sys/Syslog.pm
+ Branch: maint-5.004/perl
+ ! lib/Sys/Syslog.pm
+____________________________________________________________________________
+[ 1423] By: TimBunce on 1998/07/11 15:53:37
+ Log: Assorted patches:
+
+ Title: "umask: die if EXPR & 0700 else return undef"
+ From: Chip Salzenberg <chip@perl.org>, Jarkko Hietaniemi <jhi@cc.hut.fi>,
+ Jarkko Hietaniemi <jhi@iki.fi>, Malcolm Beattie
+ <mbeattie@sable.ox.ac.uk>, Tim.Bunce@ig.co.uk (Tim Bunce),
+ kstar@chapin.ed, kstar@chapin.edu@ig.co.uk ()
+ Msg-ID: <199805291520.QAA01615@sable.ox.ac.uk>,
+ <199805291549.SAA01439@alpha.hut.fi>,
+ <199805291608.RAA29283@toad.ig.co.uk>,
+ <19980530105129.A24006@O2.chapin.edu>,
+ <19980608133037.A8793@perlsupport.com>
+ Files: pod/perldiag.pod pod/perlfunc.pod pp_sys.c
+
+ Title: "File name DynaLoader.pm.PL is 8.3 unfriendly"
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Msg-ID: <19980610005417.G162@cdata.tvnet.hu>
+ Files: MANIFEST ext/DynaLoader/Makefile.PL
+ Branch: maint-5.004/perl
+ +> ext/DynaLoader/DynaLoader_pm.PL
+ - ext/DynaLoader/DynaLoader.pm.PL
+ ! MANIFEST ext/DynaLoader/Makefile.PL pod/perldiag.pod
+ ! pod/perlfunc.pod pp_sys.c
+____________________________________________________________________________
+[ 1421] By: gsar on 1998/07/11 02:54:02
+ Log: From: Gisle Aas <gisle@aas.no>
+ Subject: [PATCH] B::Deparse for(1..100000)
+ Date: 10 Jul 1998 14:04:44 +0200
+ Message-ID: <m3n2ahx677.fsf@furu.g.aas.no>
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 1420] By: gsar on 1998/07/11 02:28:18
+ Log: add 'clean' target for ext/re
+ Branch: perl
+ ! ext/re/Makefile.PL
+____________________________________________________________________________
+[ 1419] By: gsar on 1998/07/11 02:20:32
+ Log: From: Tom Hughes <thh@cyberscience.com>
+ Date: 10 Jul 1998 10:25:18 +0100
+ Message-ID: <yekn2ai5a81.fsf@elva.cyberscience.com>
+ Subject: [5.004_71] Patch: svr4 hints updates for Unixware
+ Branch: perl
+ ! hints/svr4.sh
+____________________________________________________________________________
+[ 1418] By: gsar on 1998/07/11 02:19:12
+ Log: move op/ipc{msg,sem}.t into lib/ipc_sysv.t
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Fri, 10 Jul 1998 13:08:08 +0300 (EET DST)
+ Message-Id: <199807101008.NAA10817@alpha.hut.fi>
+ Subject: Re: make minitest does not work out of the box - test subset
+ needs pruning
+ Branch: perl
+ + t/lib/ipc_sysv.t
+ - t/op/ipcmsg.t t/op/ipcsem.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 1417] By: gsar on 1998/07/11 02:14:16
+ Log: disable CR croaking (via #define, default off) in lieu of more
+ complete fix
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 1416] By: gsar on 1998/07/11 02:06:11
+ Log: added patch, made linking with setargv a build option
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Date: Thu, 9 Jul 1998 09:51:42 -0700
+ Message-ID: <000101bdab59$d9602dc0$a32fa8c0@tau.Active>
+ Subject: [PATCH 5.004_71]
+ Branch: perl
+ ! perl.c pp_sys.c win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1415] By: gsar on 1998/07/11 01:47:19
+ Log: From: Tom Hughes <thh@cyberscience.com>
+ Date: 10 Jul 1998 09:01:12 +0100
+ Message-ID: <yekr9zu5e47.fsf@elva.cyberscience.com>
+ Subject: [5.004_71] Patch: Fix perl_exp.SH for Unixware
+ Branch: perl
+ ! perl_exp.SH
+____________________________________________________________________________
+[ 1414] By: gsar on 1998/07/11 01:45:45
+ Log: make lib/re.pm a prereq for minitest
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1413] By: gsar on 1998/07/11 01:40:56
+ Log: add patch (via PM)
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Fri, 10 Jul 1998 01:14:11 -0500 (CDT)
+ Message-ID: <13733.45251.47363.431138@alias-2.pr.mcs.net>
+ Subject: Big B::Deparse update
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 1412] By: gsar on 1998/07/11 00:25:17
+ Log: add perlport.pod v1.23 from Chris Nandor <pudge@pobox.com>
+ Branch: perl
+ + pod/perlport.pod
+ ! pod/perl.pod
+____________________________________________________________________________
+[ 1411] By: gsar on 1998/07/10 21:53:06
+ Log: make binmode(STDIN) not whine
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Thu, 09 Jul 1998 16:51:27 -0700
+ Message-Id: <3.0.5.32.19980709165127.00a692e0@ous.edu>
+ Subject: [PATCH 5.004_70] Fix up binmode() for VMS
+ Branch: perl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 1410] By: gsar on 1998/07/10 21:50:57
+ Log: CPAN-1.39 update
+ From: koenig@kulturbox.de (Andreas J. Koenig)
+ Date: 10 Jul 1998 00:45:36 +0200
+ Message-ID: <sfcbtqytzhr.fsf@dubravka.in-berlin.de>
+ Subject: Re: perl5.004_71 hit the stands this morn
+ Branch: perl
+ ! MANIFEST lib/CPAN.pm lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm
+____________________________________________________________________________
+[ 1409] By: gsar on 1998/07/10 21:45:10
+ Log: manually apply patch with conflicts
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Date: Thu, 09 Jul 1998 12:08:33 -0700
+ Message-Id: <3.0.5.32.19980709120833.009eb100@ous.edu>
+ Subject: [PATCH 5.004_70] Updated duble-quotes in config.h/config.pm patch
+ Branch: perl
+ ! configpm
+____________________________________________________________________________
+[ 1408] By: gsar on 1998/07/10 21:36:54
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Thu, 9 Jul 1998 11:58:30 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980709115556.24236D-100000@newton.phys>
+ Subject: Re: perldelta.pod [PATCH]
+ Branch: perl
+ ! pod/perldelta.pod
+____________________________________________________________________________
+[ 1407] By: gsar on 1998/07/10 21:35:13
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Thu, 9 Jul 1998 11:26:03 -0400 (EDT)
+ Subject: [PATCH 5.004_71] Allow static build of IPC::SysV
+ Message-Id: <Pine.SUN.3.96.980709112507.24236B-100000@newton.phys>
+ Branch: perl
+ ! ext/IPC/SysV/Makefile.PL
+____________________________________________________________________________
+[ 1406] By: gsar on 1998/07/10 21:33:30
+ Log: manually apply patch with conflicts
+ From: kstar@chapin.edu
+ Message-ID: <19980709093621.B7857@O2.chapin.edu>
+ Date: Thu, 9 Jul 1998 09:36:21 -0400
+ Subject: Re: [PATCH] 5.004_70 installperl and docs
+ Branch: perl
+ ! installperl
+____________________________________________________________________________
+[ 1405] By: gsar on 1998/07/10 21:28:29
+ Log: misc tweaks to docs and qsortsv() warning
+ Branch: perl
+ ! Changes pod/perldelta.pod pod/perlsub.pod pp_ctl.c
+____________________________________________________________________________
+[ 1404] By: gsar on 1998/07/10 21:23:53
+ Log: add more correct version of change#1350 (as yet untested)
+ From: joshua.pritikin@db.com
+ Date: Thu, 9 Jul 1998 09:22:46 -0400
+ Message-Id: <H00000e50008f277@MHS>
+ Subject: Re: [PATCH _70] cache missing methods
+ Branch: perl
+ ! embedvar.h gv.c interp.sym intrpvar.h perlvars.h
+____________________________________________________________________________
+[ 1403] By: gsar on 1998/07/10 20:46:12
+ Log: add win32_rename() that does what docs say
+ Branch: perl
+ ! win32/GenCAPI.pl win32/makedef.pl win32/perlhost.h
+ ! win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 1402] By: gsar on 1998/07/10 20:19:18
+ Log: inet_aton() should do DNS lookup only if arg isn't a dotted-quad
+ (suggested by Philippe.Simonet@swisscom.com)
+ Branch: perl
+ ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 1401] By: gsar on 1998/07/10 03:24:45
+ Log: undo change#1379 (order of tests *is* significant)
+ Branch: perl
+ ! t/lib/posix.t
+____________________________________________________________________________
+[ 1400] By: nick on 1998/07/09 17:43:14
+ Log: Integrate mainline (_071-ish)
+ Branch: ansiperl
+ +> ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
+ +> ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Makefile.PL
+ +> ext/Data/Dumper/Todo ext/IPC/SysV/ChangeLog
+ +> ext/IPC/SysV/MANIFEST ext/IPC/SysV/Makefile.PL
+ +> ext/IPC/SysV/Msg.pm ext/IPC/SysV/README
+ +> ext/IPC/SysV/Semaphore.pm ext/IPC/SysV/SysV.pm
+ +> ext/IPC/SysV/SysV.xs ext/IPC/SysV/t/msg.t ext/IPC/SysV/t/sem.t
+ +> ext/re/Makefile.PL ext/re/re.pm ext/re/re.xs pp_proto.h
+ +> t/io/iprefix.t t/lib/dumper-ovl.t t/lib/dumper.t
+ !> (integrate 145 files)
+
+----------------
+Version 5.004_71
+----------------
+
+____________________________________________________________________________
+[ 1399] By: gsar on 1998/07/09 12:15:12
+ Log: update Changes, perlhist.pod, beginnings of perldelta.pod
+ Branch: perl
+ ! Changes pod/perldelta.pod pod/perlhist.pod
+____________________________________________________________________________
+[ 1397] By: gsar on 1998/07/09 08:35:39
+ Log: merge changes from maintbranch (1354, and relevant part of 1356); all
+ maintenance changes upto 1356 merged
+ Branch: perl
+ ! pod/perldiag.pod pp_hot.c t/op/misc.t
+____________________________________________________________________________
+[ 1396] By: gsar on 1998/07/09 08:02:52
+ Log: add Data-Dumper, up patchlevel to 71, various misc tweaks to
+ make all configs build on Solaris and win32
+ Branch: perl
+ + ext/Data/Dumper/Changes ext/Data/Dumper/Dumper.pm
+ + ext/Data/Dumper/Dumper.xs ext/Data/Dumper/Makefile.PL
+ + ext/Data/Dumper/Todo t/lib/dumper-ovl.t t/lib/dumper.t
+ ! MANIFEST Todo patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1395] By: gsar on 1998/07/09 05:39:48
+ Log: From: Stephen McCamant <alias@mcs.com>
+ Date: Wed, 08 Jul 1998 23:16:49 CDT
+ Message-Id: <13732.16626.904108.608743@alias-2.pr.mcs.net>
+ Subject: [PATCH] UNOP opclass test in B.xs
+ Branch: perl
+ ! ext/B/B.xs
+____________________________________________________________________________
+[ 1394] By: gsar on 1998/07/09 05:37:48
+ Log: get it building again on win32
+ Branch: perl
+ ! bytecode.h embed.h ext/re/Makefile.PL global.sym intrpvar.h
+ ! op.c opcode.pl perl.h pp.c pp_ctl.c pp_hot.c pp_proto.h
+ ! pp_sys.c proto.h win32/Makefile win32/makedef.pl
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1393] By: gsar on 1998/07/09 05:20:31
+ Log: applied patch from Ilya, tweaked some to get clean static build of
+ the ext/re stuff (untested on win32)
+ Branch: perl
+ ! regcomp.c regexec.c
+____________________________________________________________________________
+[ 1392] By: gsar on 1998/07/09 03:56:45
+ Log: fix installperl typo
+ From: kstar@chapin.edu
+ Date: Wed, 08 Jul 1998 23:51:57 EDT
+ Message-Id: <19980708235157.D1380@O2.chapin.edu>
+ Subject: Re: [PATCH] 5.004_70 installperl and docs
+ Branch: perl
+ ! installperl
+____________________________________________________________________________
+[ 1391] By: gsar on 1998/07/09 01:48:16
+ Log: From: Chip Salzenberg <chip@perl.org>
+ Date: Wed, 8 Jul 1998 18:10:55 -0400
+ Message-ID: <19980708181055.A8005@perlsupport.com>
+ Subject: [PATCH _70] Allow $SIG{CHLD}='IGNORE' to work on Solaris
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 1390] By: gsar on 1998/07/09 01:45:16
+ Log: added patch, tweaked per Ilya's suggestion
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Wed, 8 Jul 1998 13:34:42 +0100
+ Message-Id: <E0yttQo-0002aH-00@taurus.cus.cam.ac.uk>
+ Subject: [PATCH] perl5db.pl complains about non-integer condition
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 1389] By: gsar on 1998/07/09 01:42:13
+ Log: reenable misaligned memory checks, cast to UV & check alignment
+ From: Dominic Dunlop <domo@computer.org>
+ Date: Wed, 8 Jul 1998 11:21:48 +0000
+ Message-Id: <v03110703b1c8ffdb68ed@[195.95.102.91]>
+ Subject: Re: [PATCH 5.00469] corrupt malloc ptr on NeXT
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1388] By: gsar on 1998/07/09 01:36:22
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Wed, 8 Jul 1998 13:32:07 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980708133010.23053F-100000@newton.phys>
+ Subject: [PATCH 5.004_70] more on finding metaconfig units.
+ Branch: perl
+ ! Porting/pumpkin.pod
+____________________________________________________________________________
+[ 1387] By: gsar on 1998/07/09 01:35:23
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Wed, 8 Jul 1998 13:29:34 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980708132743.23053E-100000@newton.phys>
+ Subject: Configure indentation patch
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 1386] By: gsar on 1998/07/09 01:33:31
+ Log: don't try to hardlink perldiag.pod; that is no longer not needed
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Wed, 8 Jul 1998 12:18:32 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980708120844.23053D-100000@newton.phys>
+ Subject: Re: pelr installation attempts hard links between file systems
+ Branch: perl
+ ! installperl
+____________________________________________________________________________
+[ 1385] By: gsar on 1998/07/09 01:28:05
+ Log: win32/makefile.mk =~ s|gcc -pipe|gcc|
+ Branch: perl
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1384] By: gsar on 1998/07/09 01:26:19
+ Log: make t/TEST run 'perl $switches ./foo/test.t' everywhere
+ Branch: perl
+ ! t/TEST
+____________________________________________________________________________
+[ 1383] By: gsar on 1998/07/09 01:06:47
+ Log: manually apply patch with a dependency on unapplied patch
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 8 Jul 1998 07:03:51 -0400 (EDT)
+ Message-Id: <199807081103.HAA25145@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_70] make quoted RE embeddable
+ Branch: perl
+ ! sv.c t/op/pat.t
+____________________________________________________________________________
+[ 1382] By: gsar on 1998/07/09 01:02:23
+ Log: change order of libs for extensions
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Tue, 7 Jul 1998 23:48:05 +0200
+ Message-ID: <19980707234805.C180@cdata.tvnet.hu>
+ Subject: [PATCH _70] linking problem with modules
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 1381] By: gsar on 1998/07/09 00:56:12
+ Log: patch for more flexible initialization of xsub parameters
+ From: Tye McQueen <tye@metronet.com>
+ Date: Mon, 6 Jul 1998 19:04:27 -0500 (CDT)
+ Message-Id: <199807070004.AA16454@metronet.com>
+ Subject: Enhanced arg inits for xsubpp
+ Branch: perl
+ ! lib/ExtUtils/xsubpp pod/perlxs.pod
+____________________________________________________________________________
+[ 1380] By: gsar on 1998/07/09 00:44:01
+ Log: From: Tye McQueen <tye@metronet.com>
+ Date: Mon, 6 Jul 1998 17:34:54 -0500 (CDT)
+ Message-Id: <16619-17073@lyris.activestate.com>
+ Subject: New pl2bat.pl
+ Branch: perl
+ ! win32/bin/pl2bat.pl
+____________________________________________________________________________
+[ 1379] By: gsar on 1998/07/09 00:30:58
+ Log: remove ordering dependency in posix.t
+ Branch: perl
+ ! t/lib/posix.t
+____________________________________________________________________________
+[ 1378] By: gsar on 1998/07/08 20:17:43
+ Log: make -i'*suffix' work too
+ Branch: perl
+ ! doio.c
+____________________________________________________________________________
+[ 1377] By: gsar on 1998/07/08 08:56:28
+ Log: regen headers; result builds & tests on Solaris again (threaded)
+ Branch: perl
+ ! embedvar.h
+____________________________________________________________________________
+[ 1376] By: gsar on 1998/07/08 08:55:03
+ Log: change#1350 breaks things, back it out
+ Branch: perl
+ ! embedvar.h gv.c interp.sym intrpvar.h perlvars.h
+____________________________________________________________________________
+[ 1375] By: gsar on 1998/07/08 07:47:00
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Wed, 8 Jul 1998 01:30:15 -0400 (EDT)
+ Message-Id: <199807080530.BAA14072@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_70] Switch modifiers in RE off
+ Branch: perl
+ ! pod/perlre.pod regcomp.c t/op/re_tests
+____________________________________________________________________________
+[ 1374] By: gsar on 1998/07/08 07:41:06
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 07 Jul 1998 23:08:59 +0200
+ Message-ID: <m3vhp9z7v8.fsf@furu.g.aas.no>
+ Subject: [PATCH] Faster copying from SvIV/SvNVs in sv_setsv()
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1373] By: gsar on 1998/07/08 07:36:01
+ Log: From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Date: Tue, 7 Jul 1998 23:47:50 +0200
+ Message-ID: <19980707234750.A180@cdata.tvnet.hu>
+ Subject: [PATCH _70] dos-djgpp update
+ Branch: perl
+ ! djgpp/config.over djgpp/djgppsed.sh
+____________________________________________________________________________
+[ 1372] By: gsar on 1998/07/08 07:12:47
+ Log: add extension to support SysV IPC
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 7 Jul 1998 02:32:53 +0300 (EET DST)
+ Message-Id: <199807062332.CAA25792@alpha.hut.fi>
+ Subject: [PATCH] 5.004_70: IPC::SysV
+ Branch: perl
+ + ext/IPC/SysV/ChangeLog ext/IPC/SysV/MANIFEST
+ + ext/IPC/SysV/Makefile.PL ext/IPC/SysV/Msg.pm
+ + ext/IPC/SysV/README ext/IPC/SysV/Semaphore.pm
+ + ext/IPC/SysV/SysV.pm ext/IPC/SysV/SysV.xs ext/IPC/SysV/t/msg.t
+ + ext/IPC/SysV/t/sem.t
+ ! Configure MANIFEST pod/perlfunc.pod pod/perlipc.pod
+ ! t/op/ipcmsg.t t/op/ipcsem.t
+____________________________________________________________________________
+[ 1371] By: gsar on 1998/07/08 05:12:07
+ Log: add patch for C<use re 'debug'>
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 6 Jul 1998 22:24:33 -0400 (EDT)
+ Message-Id: <199807070224.WAA10318@monk.mps.ohio-state.edu>
+ Subject: Re: _70 and Devel::RE
+ Branch: perl
+ + ext/re/Makefile.PL ext/re/re.pm ext/re/re.xs
+ - lib/re.pm
+ ! MANIFEST Makefile.SH global.sym interp.sym intrpvar.h op.c
+ ! perl.h pp.c pp_ctl.c pp_hot.c regcomp.c regexec.c
+____________________________________________________________________________
+[ 1370] By: gsar on 1998/07/08 04:27:27
+ Log: added patch to generate PPDEF(pp_foo)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 6 Jul 1998 20:43:54 -0400 (EDT)
+ Message-Id: <199807070043.UAA28572@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_70] Autogenerate declarations for opcodes
+ Branch: perl
+ + pp_proto.h
+ ! MANIFEST Makefile.SH opcode.pl proto.h
+____________________________________________________________________________
+[ 1369] By: gsar on 1998/07/08 04:19:49
+ Log: suggest 'make test' after make
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1368] By: gsar on 1998/07/08 03:58:19
+ Log: added patch for -i'foo*bar', made code somewhat simpler, tweaked doc
+ From: Colin Kuskie <ckuskie@cadence.com>
+ Date: Tue, 7 Jul 1998 09:44:33 -0700 (PDT)
+ Message-ID: <Pine.GSO.3.96.980707093457.28681A-100000@pdxue150.cadence.com>
+ Subject: Corrected -i prefix patch
+ Branch: perl
+ + t/io/iprefix.t
+ ! MANIFEST doio.c pod/perlrun.pod
+____________________________________________________________________________
+[ 1366] By: gsar on 1998/07/08 02:28:30
+ Log: From: Gisle Aas <gisle@aas.no>
+ Date: 07 Jul 1998 17:48:36 +0200
+ Message-ID: <m3vhp94q7f.fsf@furu.g.aas.no>
+ Subject: [PATCH] Remove some rendundant SvOOK_on tests
+ Branch: perl
+ ! sv.c sv.h
+____________________________________________________________________________
+[ 1365] By: gsar on 1998/07/08 02:25:17
+ Log: applied patch to clarify m//g
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Date: Tue, 7 Jul 1998 15:59:03 +0100
+ Message-Id: <E0ytZCx-0006Bi-00@taurus.cus.cam.ac.uk>
+ Subject: [PATCH] Re: m//g in perlop.pod
+ Branch: perl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 1364] By: gsar on 1998/07/08 02:13:07
+ Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Subject: [PATCH] 5.004_70 bug in perlfaq.pod
+ Message-Id: <E0ytVTJ-0002kb-00@taurus.cus.cam.ac.uk>
+ Date: Tue, 7 Jul 1998 11:59:41 +0100
+ Branch: perl
+ ! pod/perlfaq.pod
+____________________________________________________________________________
+[ 1363] By: gsar on 1998/07/08 02:11:11
+ Log: applied tweak (via private mail)
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Date: Tue, 7 Jul 1998 13:27:47 +0300 (EET DST)
+ Message-Id: <199807071027.NAA20829@alpha.hut.fi>
+ Subject: tiny perllocale.pod patch for 5.004_70
+ Branch: perl
+ ! pod/perllocale.pod
+____________________________________________________________________________
+[ 1362] By: gsar on 1998/07/08 02:07:48
+ Log: applied patch, various tweaks to pander to pod2man tantrums
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 6 Jul 1998 22:47:30 -0400 (EDT)
+ Message-Id: <199807070247.WAA10677@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_70] CONFIGPM
+ Branch: perl
+ ! Porting/Glossary configpm
+____________________________________________________________________________
+[ 1361] By: gsar on 1998/07/07 22:13:11
+ Log: From: Stephen McCamant <alias@mcs.com>
+ Date: Mon, 6 Jul 1998 21:22:17 -0500 (CDT)
+ Message-ID: <13729.33816.311236.995647@alias-2.pr.mcs.net>
+ Subject: Re: Inconsistent arithmetics on refs
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1360] By: gsar on 1998/07/07 22:11:11
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Mon, 6 Jul 1998 20:59:10 -0400 (EDT)
+ Message-Id: <199807070059.UAA28815@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_70] Anohter ptags improvement
+ Branch: perl
+ ! emacs/ptags
+____________________________________________________________________________
+[ 1359] By: gsar on 1998/07/07 22:08:48
+ Log: fix accidental RE-de-optimization
+ From: larry@wall.org (Larry Wall)
+ Date: Mon, 6 Jul 1998 17:49:31 -0700
+ Message-Id: <199807070049.RAA23475@wall.org>
+ Subject: Re: before you deluge us with patches
+ --
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Date: Tue, 7 Jul 1998 03:10:56 -0400 (EDT)
+ Message-Id: <199807070710.DAA25399@monk.mps.ohio-state.edu>
+ Subject: Re: before you deluge us with patches
+ Branch: perl
+ ! pp_hot.c regexec.c
+____________________________________________________________________________
+[ 1358] By: gsar on 1998/07/07 21:36:29
+ Log: From: Gisle Aas <gisle@aas.no>
+ Subject: [PATCH] Evaluation of AVHVs in scalar context
+ Date: 06 Jul 1998 21:41:14 +0200
+ Message-ID: <m33ecedaxx.fsf@furu.g.aas.no>
+ Branch: perl
+ ! pp_hot.c t/op/avhv.t
+____________________________________________________________________________
+[ 1357] By: gsar on 1998/07/07 21:29:46
+ Log: doc tweaks suggested by Abigail, M.J.T. Guy, and Larry Wall
+ Branch: perl
+ ! lib/Math/Trig.pm lib/fields.pm thread.sym
+____________________________________________________________________________
+[ 1356] By: TimBunce on 1998/07/07 17:19:42
+ Log: Assorted patches:
+
+ ------ BUILD PROCESS ------
+
+ Title: "Add Test.pm (from perl 5.004_70)"
+ Files: MANIFEST lib/Test.pm
+
+ ------ EXTENSIONS ------
+
+ Title: "Add CR LF CRLF to Socket.pm"
+ From: Chris Nandor <pudge@pobox.com>
+ Msg-ID: <v04003a46b1b6067832a1@[24.48.28.52]>
+ Files: ext/Socket/Socket.pm
+
+ ------ LIBRARY ------
+
+ Title: "AutoSplit upgrade (AutoSplit 1.0302 from 5.004_70)"
+ Files: lib/AutoSplit.pm
+
+ Title: "Upgrade base.pm (from perl 5.004_70)"
+ Files: lib/base.pm
+
+ Title: "Add File::Spec modules (from 5.004_70)"
+ Files: lib/File/Spec.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
+ lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+ lib/File/Spec/Win32.pm
+
+ ------ TESTS ------
+
+ Title: "fixup test for method call on undefined value"
+ Files: t/op/misc.t
+
+ ------ UTILITIES ------
+
+ Title: "perlbug upgrade (from 5.004_70)"
+ Files: utils/perlbug.PL
+
+ Title: "Upgrade perldoc (from 5.004_70)"
+ Files: utils/perldoc.PL
+ Branch: maint-5.004/perl
+ + lib/File/Spec.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
+ + lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+ + lib/File/Spec/Win32.pm lib/Test.pm
+ ! MANIFEST ext/Socket/Socket.pm lib/AutoSplit.pm lib/base.pm
+ ! t/op/misc.t utils/perlbug.PL utils/perldoc.PL
+____________________________________________________________________________
+[ 1355] By: TimBunce on 1998/07/07 14:39:51
+ Log: Title: "Fix memory leak in Safe module"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199806290544.BAA18463@aatma.engin.umich.edu>
+ Files: ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
+ Branch: maint-5.004/perl
+ ! ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
+____________________________________________________________________________
+[ 1354] By: TimBunce on 1998/07/07 14:35:25
+ Log: Title: "Better error message for $undef->method call"
+ From: Tim Bunce <Tim.Bunce@ig.co.uk>, Graham Barr <gbarr@ti.com>,
+ joshua.pritikin@db.com
+ Msg-ID: <19980615171027.U4120@asic.sc.ti.com>, <H00000e500073a20@MHS>
+ Files: pod/perldiag.pod pp_hot.c
+ Branch: maint-5.004/perl
+ ! pod/perldiag.pod pp_hot.c
+____________________________________________________________________________
+[ 1353] By: gsar on 1998/07/06 23:33:38
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 6 Jul 1998 16:59:06 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980706165659.21068B-100000@newton.phys>
+ Subject: [PATCH 5.004_70] Update metaconfig info
+ Branch: perl
+ ! Porting/pumpkin.pod
+____________________________________________________________________________
+[ 1352] By: gsar on 1998/07/06 23:30:54
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 6 Jul 1998 13:14:37 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980706130959.20719A-100000@newton.phys>
+ Subject: [PATCH 5.004_70] Config_70-01: Remove default "/share"
+ Branch: perl
+ ! Configure INSTALL Policy_sh.SH Porting/Glossary
+ ! Porting/config.sh Porting/config_H
+____________________________________________________________________________
+[ 1351] By: gsar on 1998/07/06 23:24:47
+ Log: try harder to run non-executable tests
+ Branch: perl
+ ! t/TEST
+____________________________________________________________________________
+[ 1350] By: gsar on 1998/07/06 23:12:17
+ Log: add patch to improve method caching, regen headers
+ From: joshua.pritikin@db.com
+ Date: Mon, 6 Jul 1998 09:19:29 -0400
+ Message-Id: <H00000e50008a518@MHS>
+ Subject: [PATCH _70] cache missing methods
+ Branch: perl
+ ! embedvar.h gv.c interp.sym intrpvar.h perlvars.h
+____________________________________________________________________________
+[ 1349] By: TimBunce on 1998/07/06 23:03:16
+ Log: Assorted patches:
+
+ ------ BUILD PROCESS ------
+
+ Title: "Configure: Workaround bash CDPATH oddity"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980608121159.13706C-100000@newton.phys>
+ Files: Configure
+
+ Title: "Don't suppress display of Makefile recipes that invoke perl"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199806252213.SAA08545@aatma.engin.umich.edu>
+ Files: Makefile.SH
+
+ ------ CORE LANGUAGE ------
+
+ Title: "one more^Wless quad unpack bug"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199806301132.OAA27353@alpha.hut.fi>
+ Files: pp.c
+
+ Title: "minor fixups to bring maint closer to devel for patching"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805200046.UAA19284@aatma.engin.umich.edu>
+ Files: pod/perldiag.pod deb.c dump.c t/op/ref.t t/op/split.t taint.c util.c
+
+ Title: "-Pw switches used together report bogus error"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199806252331.TAA10160@aatma.engin.umich.edu>
+ Files: perl.c
+
+ Title: "Add doc and perl home page info to -v output"
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ Msg-ID: <199802172229.PAA29309@jhereg.perl.com>
+ Files: perl.c
+
+ Title: "Fix C<@a = (%a = 1)> bizarreness"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>, Tom Christiansen
+ <tchrist@jhereg.perl.com>
+ Msg-ID: <199807012026.OAA31507@jhereg.perl.com>,
+ <199807012339.TAA26024@aatma.engin.umich.edu>
+ Files: pp_hot.c
+
+ Title: "make find_script() return saved string, reenable missing
+ diagnostics"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199806262224.SAA00422@aatma.engin.umich.edu>
+ Files: perl.c util.c
+
+ Title: "minor e_script optimization"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807060704.DAA25988@aatma.engin.umich.edu>
+ Files: perl.c
+
+ ------ DOCUMENTATION ------
+
+ Title: "Insecure $ENV{} message out of step with perldiag"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0yooQA-0003za-00@taurus.cus.cam.ac.uk>
+ Files: pod/perldiag.pod pod/perlsec.pod
+
+ Title: "documenting close without arguments"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980623084413.24075V-100000@user2.teleport.com>
+ Files: pod/perlfunc.pod
+
+ Title: "pod for scalar .. op"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0yqyN8-0006gv-00@taurus.cus.cam.ac.uk>
+ Files: pod/perlop.pod
+
+ ------ EXTENSIONS ------
+
+ Title: "Fcntl: add few constants, enhance maintainability"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199806221558.SAA18626@alpha.hut.fi>
+ Files: ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
+
+ ------ LIBRARY ------
+
+ Title: "Fix undef warnings in Text::Parsewords"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199806300842.LAA26409@alpha.hut.fi>
+ Files: lib/Text/ParseWords.pm
+
+ Title: "Add Symbol::delete_package()"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807060702.DAA25976@aatma.engin.umich.edu>
+ Files: pod/perlembed.pod lib/Symbol.pm
+ Branch: maint-5.004/perl
+ ! Configure Makefile.SH deb.c dump.c ext/Fcntl/Fcntl.pm
+ ! ext/Fcntl/Fcntl.xs lib/Symbol.pm lib/Text/ParseWords.pm perl.c
+ ! pod/perldiag.pod pod/perlembed.pod pod/perlfunc.pod
+ ! pod/perlop.pod pod/perlsec.pod pp.c pp_hot.c t/op/ref.t
+ ! t/op/split.t taint.c util.c
+____________________________________________________________________________
+[ 1348] By: gsar on 1998/07/06 22:55:56
+ Log: remove #! line from Errno_pm.PL
+ Branch: perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 1347] By: gsar on 1998/07/06 22:51:34
+ Log: added patch to fix Cwd.pm warnings, fixed a couple more places
+ From: Gisle Aas <gisle@aas.no>
+ Date: 06 Jul 1998 13:08:53 +0200
+ Message-ID: <m3af6nfd8a.fsf@furu.g.aas.no>
+ Subject: [PATCH] 5.004_70 Cwd.pm now give warnings
+ Branch: perl
+ ! lib/Cwd.pm
+____________________________________________________________________________
+[ 1346] By: gsar on 1998/07/06 22:20:29
+ Log: much simpler fix to typecheck read/sysread/recv, as suggested by
+ Stephen McCamant
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 1345] By: gsar on 1998/07/06 21:58:52
+ Log: undo ck_sysread() changes#1319,1337 in preparation for a much
+ simpler fix
+ Branch: perl
+ ! ObjXSub.h embed.h global.sym globals.c objpp.h op.c opcode.h
+ ! opcode.pl proto.h
+____________________________________________________________________________
+[ 1344] By: TimBunce on 1998/07/06 21:51:05
+ Log: Title: "Fix for broken goto &xsub"
+ From: Albert Dvornik <bert@genscan.com>,
+ Msg-ID: <tq4sxawf2h.fsf@puma.genscan.com>
+ Files: MANIFEST pp_ctl.c t/op/goto_xs.t
+ Branch: maint-5.004/perl
+ + t/op/goto_xs.t
+ ! MANIFEST pp_ctl.c
+____________________________________________________________________________
+[ 1343] By: TimBunce on 1998/07/06 21:40:14
+ Log: Title: "Undo sub stub optimization and add comments on GV_FOO constants"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199807050841.EAA25114@aatma.engin.umich.edu>
+ Files: gv.h gv.c op.c toke.c
+ Branch: maint-5.004/perl
+ ! gv.c gv.h op.c toke.c
+____________________________________________________________________________
+[ 1342] By: gsar on 1998/07/06 20:57:06
+ Log: From: Gisle Aas <gisle@aas.no>
+ Message-Id: <m3zpem4v0z.fsf@furu.g.aas.no>
+ Date: 06 Jul 1998 21:52:12 +0200
+ Subject: Keepers of the Patch Pumpkin
+ Branch: perl
+ ! Changes
+____________________________________________________________________________
+[ 1341] By: gsar on 1998/07/06 20:43:35
+ Log: remove dup entry in perldiag
+ Branch: perl
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 1340] By: gsar on 1998/07/06 20:31:44
+ Log: more reasonable diagnostic on keyword vs. sub ambiguity
+ Branch: perl
+ ! pod/perldiag.pod toke.c
+____________________________________________________________________________
+[ 1339] By: gsar on 1998/07/06 19:23:06
+ Log: rename s/\bSI_/PERLSI_/ to avoid collisions with sysinfo headers
+ Branch: perl
+ ! av.c cop.h gv.c mg.c op.c perl.c pp_ctl.c pp_sys.c scope.c
+ ! sv.c toke.c util.c
+____________________________________________________________________________
+[ 1338] By: gsar on 1998/07/06 18:45:35
+ Log: per Larry suggestion, toss change#1327 and fix the documentation
+ to match behavior instead
+ Branch: perl
+ ! pod/perlfunc.pod pp_sys.c
+____________________________________________________________________________
+[ 1337] By: gsar on 1998/07/06 17:15:26
+ Log: allow read(FH,threadsv,...)
+ Branch: perl
+ ! op.c
+
+----------------
+Version 5.004_70
+----------------
+
+____________________________________________________________________________
+[ 1336] By: gsar on 1998/07/06 09:06:33
+ Log: 5.004_70 tweaks
+ Branch: perl
+ ! Changes win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1335] By: gsar on 1998/07/06 07:05:37
+ Log: update Changes
+ Branch: perl
+ ! Changes pod/perldiag.pod
+____________________________________________________________________________
+[ 1334] By: gsar on 1998/07/06 06:41:17
+ Log: allow eval-groups in patterns only if they C<use re 'eval';>
+ Branch: perl
+ ! lib/re.pm perl.h pod/perldiag.pod pod/perlre.pod regcomp.c
+ ! t/op/misc.t t/op/pat.t t/op/regexp.t t/op/subst.t
+____________________________________________________________________________
+[ 1333] By: gsar on 1998/07/06 03:22:52
+ Log: From: Hans Mulder <hansm@icgroup.nl>
+ Date: Mon, 6 Jul 98 02:11:32 +0200
+ Message-Id: <9807060021.AA29027@icgned.icgroup.nl>
+ Subject: [PATCH 5.00469] corrupt malloc ptr on NeXT
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1332] By: gsar on 1998/07/06 03:18:34
+ Log: added Errno-1.09 from CPAN
+ Branch: perl
+ ! ext/Errno/ChangeLog ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 1331] By: gsar on 1998/07/06 02:59:09
+ Log: fix small memleak on -e, don't try to find_script() when e_script
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 1330] By: gsar on 1998/07/06 00:40:24
+ Log: add Symbol::delete_package()
+ Branch: perl
+ ! lib/Symbol.pm pod/perlembed.pod
+____________________________________________________________________________
+[ 1329] By: gsar on 1998/07/05 23:05:40
+ Log: patch to remove assumptions about offset of IV being == sizeof(XPV)
+ From: Stephen McCamant <alias@mcs.com>
+ Date: Sun, 5 Jul 1998 17:36:14 -0500 (CDT)
+ Message-ID: <13727.63831.95324.696098@alias-2.pr.mcs.net>
+ Subject: [PATCH] alignment in X[IN]V allocation
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1328] By: gsar on 1998/07/05 22:47:57
+ Log: make read() return undef on errors as documented, and clarify docs
+ Branch: perl
+ ! pod/perlfunc.pod pp_sys.c
+____________________________________________________________________________
+[ 1327] By: gsar on 1998/07/05 22:11:21
+ Log: fix getc() to return empty string instead of undef on eof, as it was
+ documented to behave; still returns undef on error
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1326] By: gsar on 1998/07/05 21:53:30
+ Log: patch whitespace-mutiliated; applied manually
+ From: Hans Mulder <hansm@icgroup.nl>
+ Date: Sun, 5 Jul 98 23:23:20 +0200
+ Message-Id: <9807052133.AA28626@icgned.icgroup.nl>
+ Subject: [PATCH 5.004_69] building Errno.pm still fails on NeXT
+ Branch: perl
+ ! ext/Errno/Errno_pm.PL
+____________________________________________________________________________
+[ 1325] By: gsar on 1998/07/05 21:38:39
+ Log: applied patch (via private mail), modulo retrohunks in pod/perlfaq2.pod
+ From: Tom Christiansen <tchrist@jhereg.perl.com>
+ Date: Sun, 05 Jul 1998 09:15:22 -0500
+ Subject: Re: docpatch
+ Message-Id: <199807051515.JAA03644@jhereg.perl.com>
+ Branch: perl
+ ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod pod/perlfunc.pod pod/perlipc.pod
+ ! pod/perlrun.pod
+____________________________________________________________________________
+[ 1324] By: gsar on 1998/07/05 21:06:56
+ Log: applied patch, and undid change#1302 which it made unnecessary
+ From: Billy <wdconsta@cs.adelaide.edu.au>
+ Date: Sun, 5 Jul 1998 23:05:52 +0930 (CST)
+ Subject: [PATCH] utils/h2ph.PL and t/lib/h2ph.t
+ Message-ID: <Pine.SV4.3.93.980705230337.27658A-100000@xenon.teaching.cs.adelaide.edu.au>
+ Branch: perl
+ ! t/lib/h2ph.t utils/h2ph.PL
+____________________________________________________________________________
+[ 1323] By: gsar on 1998/07/05 20:56:39
+ Log: fix t/lib/fields.t's @INC so make test runs
+ Branch: perl
+ ! t/lib/fields.t
+____________________________________________________________________________
+[ 1322] By: gsar on 1998/07/05 20:26:43
+ Log: add comments on GV_FOO constants, s/8/GV_ADDINEVAL/
+ Branch: perl
+ ! gv.c gv.h toke.c
+____________________________________________________________________________
+[ 1321] By: gsar on 1998/07/05 07:41:50
+ Log: sundry win32 config tweaks
+ Branch: perl
+ ! Todo.5.005 t/op/stat.t win32/Makefile win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/config_h.PL
+ ! win32/config_sh.PL win32/makefile.mk
+____________________________________________________________________________
+[ 1320] By: gsar on 1998/07/05 06:30:35
+ Log: update Changes
+ Branch: perl
+ ! Changes
+____________________________________________________________________________
+[ 1319] By: gsar on 1998/07/05 06:27:37
+ Log: add ck_sysread() for better sysread/read/recv sanity
+ Branch: perl
+ ! ObjXSub.h embed.h global.sym globals.c objpp.h op.c opcode.h
+ ! opcode.pl proto.h
+____________________________________________________________________________
+[ 1318] By: gsar on 1998/07/05 04:34:05
+ Log: From: Stephen McCamant <alias@mcs.com>
+ Date: Sat, 4 Jul 1998 23:24:47 -0500 (CDT)
+ Subject: [PATCH] Document B::Deparse, add pp_threadsv
+ Message-ID: <13726.65230.19324.216849@alias-2.pr.mcs.net>
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 1317] By: gsar on 1998/07/05 04:15:25
+ Log: added patch with tweak to doc
+ From: Chip Salzenberg <chip@perl.org>
+ Message-ID: <19980704205136.A16319@perlsupport.com>
+ Date: Sat, 4 Jul 1998 20:51:36 -0400
+ Subject: [PATCH _69] Take 2: Warn on C<sub log; log($msg)>
+ Branch: perl
+ ! ext/IO/lib/IO/Handle.pm pod/perldiag.pod toke.c
+____________________________________________________________________________
+[ 1316] By: gsar on 1998/07/05 03:56:22
+ Log: Porting/Glossary goes podly into Config.pm
+ Branch: perl
+ ! Porting/Glossary configpm
+____________________________________________________________________________
+[ 1315] By: gsar on 1998/07/05 02:50:18
+ Log: add suggested tool as an example in ExtUtils::Packlist
+ From: Alan Burlison <Alan.Burlison@UK.Sun.com>
+ Message-Id: <199807031028.LAA10456@sale-wts>
+ Date: Fri, 3 Jul 1998 11:28:03 +0100 (BST)
+ Subject: Re: [make install] another horror story
+ Branch: perl
+ ! lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
+____________________________________________________________________________
+[ 1314] By: gsar on 1998/07/05 02:28:04
+ Log: avoid race condition (storing ptr to SV before incrementing its
+ REFCNT) and warning in newRV()
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1313] By: gsar on 1998/07/05 02:06:40
+ Log: applied suggested fix for xhv_array sizing, with portability tweaks
+ From: Gisle Aas <gisle@aas.no>
+ Subject: Re: [PATCH] Re: perl5.004_69 core dump
+ Date: 04 Jul 1998 10:20:35 +0200
+ Message-ID: <m3af6qowmk.fsf@furu.g.aas.no>
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 1312] By: gsar on 1998/07/05 01:36:45
+ Log: From: Gisle Aas <gisle@aas.no>
+ Subject: [PATCH] hv_max may be a few too many
+ Date: 04 Jul 1998 09:28:46 +0200
+ Message-ID: <m3d8bmoz0x.fsf@furu.g.aas.no>
+ Branch: perl
+ ! doop.c
+____________________________________________________________________________
+[ 1311] By: gsar on 1998/07/05 00:35:27
+ Log: patchlevel up to 5.004_70, various tweaks
+ * fix taint problems due to maintbranch regression
+ * PERL_OBJECT now builds again
+ * deal with C++ strong-typing problems in hv.c
+ * fix mismatch in "reserved word" diagnostic
+ Branch: perl
+ ! av.c hv.c objpp.h patchlevel.h pp_ctl.c pp_hot.c proto.h
+ ! regexec.c regexp.h toke.c win32/perlhost.h win32/win32.c
+____________________________________________________________________________
+[ 1310] By: TimBunce on 1998/07/04 11:35:25
+ Log: Remove old RE //t flag from scan_subst().
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 1309] By: gsar on 1998/07/04 08:32:53
+ Log: various small tweaks (still fails a few taint tests in {taint,locale}.t)
+ Branch: perl
+ ! Todo.5.005 lib/re.pm sv.c t/lib/fields.t
+____________________________________________________________________________
+[ 1307] By: gsar on 1998/07/04 07:00:14
+ Log: fix C<local $tied{foo} = $tied{foo}>, add tests
+ Branch: perl
+ ! pp_hot.c t/op/local.t
+____________________________________________________________________________
+[ 1306] By: gsar on 1998/07/04 05:52:34
+ Log: fixes for mortalization bug in xsubpp, other efficiency tweaks
+ From: joshua.pritikin@db.com
+ Date: Wed, 1 Jul 1998 10:09:43 -0400
+ Message-Id: <H00000e500086fb3@MHS>
+ Subject: [PATCH _69] sv_2mortal fix
+ Branch: perl
+ ! lib/ExtUtils/xsubpp perl.c pp.c pp_hot.c proto.h sv.c sv.h
+____________________________________________________________________________
+[ 1305] By: gsar on 1998/07/04 05:46:42
+ Log: add patch preextend global string table, tweak for 512 entries
+ From: Gisle Aas <gisle@aas.no>
+ Date: 04 Jul 1998 01:04:08 +0200
+ Subject: Re: [PATCH] Re: perl5.004_69 core dump
+ Message-ID: <m3ra02v8nr.fsf@furu.g.aas.no>
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 1304] By: gsar on 1998/07/04 05:40:35
+ Log: simplify xhv_array sizing
+ From: Gisle Aas <gisle@aas.no>
+ Date: 04 Jul 1998 00:49:42 +0200
+ Subject: Re: [PATCH] Re: perl5.004_69 core dump
+ Message-ID: <m3yauav9bt.fsf@furu.g.aas.no>
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 1303] By: gsar on 1998/07/04 05:37:29
+ Log: make 4-arg win32_select() sleep more reasonably on false values
+ From: Blair Zajac <blair@gps.caltech.edu>
+ Message-Id: <199807020225.TAA18740@gobi.gps.caltech.edu>
+ Date: Wed, 1 Jul 1998 19:25:56 -0700 (PDT)
+ Subject: [PATCH 5.004_69] select dumps core on MSWin32-x86
+ --
+ Message-Id: <199807030107.SAA08595@gobi.gps.caltech.edu>
+ Date: Thu, 2 Jul 1998 18:07:19 -0700 (PDT)
+ Subject: [PATCH 5.004_69] select dumps core on MSWin32-x86
+ Branch: perl
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 1302] By: gsar on 1998/07/04 05:32:50
+ Log: adjust h2ph.t for dos-specific problem
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Message-ID: <19980703234525.C208@cdata.tvnet.hu>
+ Date: Fri, 3 Jul 1998 23:45:25 +0200
+ Subject: Re: [PATCH _68] t/lib/h2ph.t problem
+ Branch: perl
+ ! t/lib/h2ph.t
+____________________________________________________________________________
+[ 1301] By: gsar on 1998/07/04 05:31:04
+ Log: fix CPAN.pm problem, OS2 tweaks
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199807030459.AAA00097@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_68] PAtch to CPAN first-time
+ Date: Fri, 3 Jul 1998 00:59:35 -0400 (EDT)
+ Branch: perl
+ ! lib/CPAN/FirstTime.pm lib/ExtUtils/MM_OS2.pm
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1300] By: gsar on 1998/07/04 05:27:20
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199807030102.VAA26813@monk.mps.ohio-state.edu>
+ Date: Thu, 2 Jul 1998 21:02:59 -0400 (EDT)
+ Subject: [PATCH 5.004_68] Add elc target to to makefile
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1299] By: gsar on 1998/07/04 05:25:56
+ Log: newer emacs/cperl-mode.el (via private mail)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199807030104.VAA26825@monk.mps.ohio-state.edu>
+ Date: Thu, 2 Jul 1998 21:04:29 -0400 (EDT)
+ Subject: [PATCH 5.004_68] cperl-mode
+ Branch: perl
+ ! emacs/cperl-mode.el
+____________________________________________________________________________
+[ 1298] By: gsar on 1998/07/04 05:22:41
+ Log: From: Dominic Dunlop <domo@computer.org>
+ Message-Id: <v03110701b1c1603eae52@[195.95.102.68]>
+ Date: Thu, 2 Jul 1998 22:57:26 +0000
+ Subject: [PATCH 5.004_69] Make Power MachTen use vfork and perl's malloc
+ Branch: perl
+ ! hints/machten.sh malloc.c
+____________________________________________________________________________
+[ 1297] By: gsar on 1998/07/04 05:20:52
+ Log: allow a flags args to fbm_instr() for future needs
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199807020749.DAA12379@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_68] mORE FBM_ CHANGES FOR FUTURE
+ Date: Thu, 2 Jul 1998 03:49:32 -0400 (EDT)
+ Branch: perl
+ ! pod/perlguts.pod pp.c pp_hot.c proto.h regexec.c util.c
+____________________________________________________________________________
+[ 1296] By: gsar on 1998/07/04 05:16:15
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Thu, 2 Jul 1998 11:50:41 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980702114956.18246B-100000@newton.phys>
+ Subject: [PATCH 5.004_69] INSTALL-1.39
+ Branch: perl
+ ! INSTALL
+____________________________________________________________________________
+[ 1295] By: gsar on 1998/07/04 05:15:05
+ Log: Configure update
+ From: doughera@newton.phys.lafayette.edu (Andy Dougherty)
+ Date: Wed, 1 Jul 98 23:07:50 EDT
+ Message-Id: <9807020307.AA17848@newton.phys.lafayette.edu>
+ Subject: [PATCH 5.004_69] Config_69-01
+ Branch: perl
+ ! Configure INSTALL MANIFEST Policy_sh.SH Porting/Glossary
+ ! Porting/config.sh Porting/config_H Porting/pumpkin.pod
+ ! config_h.SH win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1294] By: gsar on 1998/07/04 05:10:25
+ Log: add perlbug -F switch to save message to file
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Message-Id: <l03130301b1c03a649e45@[194.222.64.89]>
+ Date: Wed, 1 Jul 1998 21:14:22 +0200
+ Subject: Re: [PATCH 5.004_69] perlbug -fok
+ Branch: perl
+ ! Makefile.SH utils/perlbug.PL
+____________________________________________________________________________
+[ 1293] By: gsar on 1998/07/04 05:06:52
+ Log: catch nonexistent backrefs in REs
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Message-Id: <l03130304b1c027e1df9e@[194.222.64.89]>
+ Date: Wed, 1 Jul 1998 20:14:05 +0200
+ Subject: Re: [PATCH _66] for bad backrefs
+ --
+ Message-Id: <l03130300b1c03425261c@[194.222.64.89]>
+ Date: Wed, 1 Jul 1998 20:47:16 +0200
+ Subject: Re: [PATCH _66] for bad backrefs
+ Branch: perl
+ ! regcomp.c t/op/re_tests util.c
+____________________________________________________________________________
+[ 1292] By: gsar on 1998/07/04 05:02:01
+ Log: fix perlcc to not rm output file, and other -w(arts)
+ Branch: perl
+ ! utils/perlcc.PL
+____________________________________________________________________________
+[ 1291] By: gsar on 1998/07/04 04:30:03
+ Log: ignore stash entries that are not GVs in dump.c
+ Branch: perl
+ ! dump.c
+____________________________________________________________________________
+[ 1290] By: gsar on 1998/07/04 03:55:10
+ Log: cleaner page headers from pod2man
+ Branch: perl
+ ! pod/pod2man.PL
+____________________________________________________________________________
+[ 1288] By: gsar on 1998/07/04 03:16:39
+ Log: tweaks to Getopt::Std
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Tue, 30 Jun 98 14:45:49 BST
+ Message-Id: <14103.9806301345@tempest.cise.npl.co.uk>
+ Subject: [PATCH perl5.004_69] lib/Getopt/Std.pm
+ --
+ Message-Id: <17918.9807021053@tempest.cise.npl.co.uk>
+ To: perl5-porters@perl.org
+ Subject: [PATCH perl5.004_69] second: lib/Getopt/Std.pm
+ Branch: perl
+ ! lib/Getopt/Std.pm
+____________________________________________________________________________
+[ 1287] By: gsar on 1998/07/04 03:13:02
+ Log: added patch, with tweaks
+ From: Gisle Aas <gisle@aas.no>
+ Date: 03 Jul 1998 00:50:15 +0200
+ Message-ID: <m3btr7n9zs.fsf@furu.g.aas.no>
+ Subject: [PATCH] Some AVHV documentation
+ Branch: perl
+ ! pod/perlref.pod
+____________________________________________________________________________
+[ 1286] By: gsar on 1998/07/04 02:53:26
+ Log: applied patch with tweaks to prose
+ From: Gisle Aas <gisle@aas.no>
+ Subject: [PATCH] Simplified AVHV support
+ Date: 30 Jun 1998 13:34:07 +0200
+ Message-ID: <m3k95z86og.fsf@furu.g.aas.no>
+ Branch: perl
+ ! ObjXSub.h av.c embed.h global.sym objpp.h pod/perldiag.pod
+ ! pp.c proto.h t/op/avhv.t
+____________________________________________________________________________
+[ 1285] By: gsar on 1998/07/04 02:30:48
+ Log: tweak doc for ".."
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Subject: [PATCH] pod for scalar ..
+ Message-Id: <E0yqyN8-0006gv-00@taurus.cus.cam.ac.uk>
+ Date: Tue, 30 Jun 1998 12:14:50 +0100
+ Branch: perl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 1284] By: gsar on 1998/07/04 02:28:43
+ Log: fix use of uninitialized var in pp_unpack()
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 30 Jun 1998 14:32:17 +0300 (EET DST)
+ Message-Id: <199806301132.OAA27353@alpha.hut.fi>
+ Subject: [PATCH] 5.004_69 (also for 5.004_04) one more^Wless quad bug
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 1283] By: gsar on 1998/07/04 02:26:37
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Tue, 30 Jun 1998 11:40:22 +0300 (EET DST)
+ Message-Id: <199806300840.LAA04872@alpha.hut.fi>
+ Subject: [PATCH] 5.004_69: Parsewords.pm: avoid undefined warnings
+ Branch: perl
+ ! lib/Text/ParseWords.pm
+____________________________________________________________________________
+[ 1282] By: gsar on 1998/07/04 02:24:32
+ Log: VMS updates from Dan Sugalski <sugalskd@osshe.edu>
+ Message-Id: <3.0.5.32.19980629165356.00a20730@ous.edu>
+ Date: Mon, 29 Jun 1998 16:53:56 -0700
+ Subject: [PATCH 5.004_69]README.vms doc patch
+ --
+ Message-Id: <3.0.5.32.19980629165125.00a4e100@ous.edu>
+ Date: Mon, 29 Jun 1998 16:51:25 -0700
+ --
+ Message-Id: <3.0.5.32.19980702135357.00a5eb40@ous.edu>
+ Date: Thu, 02 Jul 1998 13:53:57 -0700
+ Subject: [PATCH 5.004_69]VMS filetest operator fixup
+ Branch: perl
+ ! README.vms vms/descrip_mms.template vms/vms.c
+____________________________________________________________________________
+[ 1281] By: gsar on 1998/07/04 02:17:48
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Message-Id: <3.0.5.32.19980629164625.00a4d7c0@ous.edu>
+ Date: Mon, 29 Jun 1998 16:46:25 -0700
+ Subject: [PATCH 5.004_69]Tweaks to VMS configuration procedure
+ Branch: perl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 1280] By: gsar on 1998/07/04 02:16:03
+ Log: don't attempt to copy directories on VMS
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Message-Id: <3.0.5.32.19980629163129.00a82140@ous.edu>
+ Date: Mon, 29 Jun 1998 16:31:29 -0700
+ Subject: [PATCH 5.004_69]Tweak to installperl
+ Branch: perl
+ ! installperl
+____________________________________________________________________________
+[ 1279] By: gsar on 1998/07/04 02:09:26
+ Log: add 'installhtml*dir' to win32 config templates
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Subject: [PATCH 5.004_68] For Win32 config
+ Date: Mon, 29 Jun 1998 09:00:13 -0700
+ Message-ID: <000a01bda376$ffe8b0b0$a32fa8c0@tau.Active>
+ Branch: perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1278] By: gsar on 1998/07/04 02:06:23
+ Log: implemented described fix for h2ph hanging on "enum"
+ From: Billy <wdconsta@cs.adelaide.edu.au>
+ Subject: Re: h2ph problem on Solaris 2.6/SPARC/Sun compiler
+ Message-ID: <Pine.SV4.3.93.980627010407.21715A-100000@xenon.teaching.cs.adelaide.edu.au>
+ Date: Sat, 27 Jun 1998 01:13:12 +0930 (CST)
+ Branch: perl
+ ! utils/h2ph.PL
+____________________________________________________________________________
+[ 1277] By: gsar on 1998/07/04 01:51:47
+ Log: merge changes#1210,1211,1270 from maintbranch
+ Branch: perl
+ + lib/re.pm
+ ! MANIFEST dump.c installperl lib/File/Basename.pm mg.c op.c
+ ! op.h perl.h pod/perlmodlib.pod pod/perlop.pod pp_ctl.c
+ ! pp_hot.c t/lib/basename.t t/op/taint.t toke.c
+____________________________________________________________________________
+[ 1276] By: gsar on 1998/07/04 00:33:37
+ Log: deprecate use of reserved word "our" (Larry's idea)
+ Date: Mon, 22 Jun 1998 08:55:09 -0700
+ From: larry@wall.org (Larry Wall)
+ Message-Id: <199806221555.IAA07212@wall.org>
+ Subject: Re: our
+ Branch: perl
+ ! pod/perldiag.pod toke.c
+____________________________________________________________________________
+[ 1275] By: nick on 1998/07/02 18:36:59
+ Log: Integrate mainline, just to keep up.
+ Branch: ansiperl
+ +> t/lib/fields.t
+ - lib/Math/Trig/Radial.pm
+ !> MANIFEST lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ !> lib/Math/Trig.pm lib/base.pm lib/fields.pm mg.c
+ !> pod/perldiag.pod pod/perltrap.pod pp_hot.c scope.c scope.h
+ !> t/lib/trig.t t/op/array.t toke.c utils/perldoc.PL
+ !> win32/config.bc win32/config.gc win32/config.vc
+ !> win32/include/dirent.h win32/makedef.pl win32/win32.c
+ !> win32/win32iop.h
+____________________________________________________________________________
+[ 1274] By: gsar on 1998/07/02 16:47:20
+ Log: tweak win32/config.* variables
+ Branch: perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1273] By: gsar on 1998/07/02 16:33:53
+ Log: export opendir() set of functions on win32
+ Branch: perl
+ ! win32/include/dirent.h win32/makedef.pl win32/win32.c
+ ! win32/win32iop.h
+____________________________________________________________________________
+[ 1272] By: gsar on 1998/07/01 23:21:49
+ Log: fix C<@a = (%a = 1)> bizarreness
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 1271] By: gsar on 1998/06/30 22:49:39
+ Log: document perltrap on precedence of keys/values/each
+ Branch: perl
+ ! pod/perltrap.pod
+____________________________________________________________________________
+[ 1270] By: TimBunce on 1998/06/30 09:06:21
+ Log: Added lib/re.pm missing from change 1210
+ Branch: maint-5.004/perl
+ + lib/re.pm
+____________________________________________________________________________
+[ 1269] By: gsar on 1998/06/30 08:20:52
+ Log: From: Murray Nesbitt <murray@ActiveState.com>
+ Message-Id: <77180549BCE.AAA466A@mail.rdc1.bc.wave.home.com>
+ Date: Mon, 29 Jun 1998 14:30:59 PDT
+ Subject: Re: [PATCH 5.004_67] MakeMaker mods for PPD support
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1268] By: gsar on 1998/06/30 05:38:34
+ Log: From: Robin Barker <rmb1@cise.npl.co.uk>
+ Message-Id: <13254.9806291404@tempest.cise.npl.co.uk>
+ Date: Mon, 29 Jun 1998 15:04:57 -0000
+ Subject: [PATCH perl5.004_69] perldoc.PL
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1267] By: gsar on 1998/06/30 05:34:06
+ Log: add patch to integrate Math::Trig::Radial into Math::Trig
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Mon, 29 Jun 1998 16:28:53 +0300 (EET DST)
+ Message-Id: <199806291328.QAA16916@alpha.hut.fi>
+ Subject: [PATCH] 5.004_68 (or 5.004_04): radial trig
+ Branch: perl
+ - lib/Math/Trig/Radial.pm
+ ! MANIFEST lib/Math/Trig.pm t/lib/trig.t
+____________________________________________________________________________
+[ 1266] By: gsar on 1998/06/30 05:17:33
+ Log: From: Gisle Aas <gisle@aas.no>
+ Message-Id: <m367hk4hra.fsf@furu.g.aas.no>
+ Date: 29 Jun 1998 12:36:09 +0200
+ Subject: Re: [PATCH] Simplified magic_setisa() and improved fields.pm
+ Branch: perl
+ + t/lib/fields.t
+ ! MANIFEST lib/base.pm lib/fields.pm mg.c pod/perldiag.pod
+ ! t/op/array.t
+____________________________________________________________________________
+[ 1265] By: gsar on 1998/06/30 05:12:57
+ Log: tweaks to overloaded constants (change#1259)
+ Branch: perl
+ ! scope.c scope.h toke.c
+____________________________________________________________________________
+[ 1264] By: nick on 1998/06/29 17:38:03
+ Log: Integrate mainline c. _69 to ansiperl
+ Branch: ansiperl
+ +> eg/cgi/caution.xbm eg/cgi/dna.small.gif.uu
+ +> eg/cgi/nph-multipart.cgi ext/Errno/ChangeLog
+ +> ext/Errno/Errno_pm.PL ext/Errno/Makefile.PL lib/CGI/Cookie.pm
+ +> lib/Math/Trig/Radial.pm perlio.h t/lib/cgi-form.t
+ +> t/lib/cgi-function.t t/lib/cgi-html.t t/lib/cgi-request.t
+ +> t/lib/errno.t t/op/goto_xs.t t/op/splice.t
+ !> (integrate 100 files)
+
+----------------
+Version 5.004_69
+----------------
+
+____________________________________________________________________________
+[ 1263] By: gsar on 1998/06/29 09:17:28
+ Log: update Changes and perlhist.pod
+ Branch: perl
+ ! Changes pod/perlhist.pod
+____________________________________________________________________________
+[ 1262] By: gsar on 1998/06/29 08:26:36
+ Log: bump patchlevel to 69, various little tweaks (tested on win32, Solaris
+ under several build configurations)
+ Branch: perl
+ ! Todo.5.005 op.c patchlevel.h t/lib/cgi-function.t
+ ! t/lib/cgi-request.t toke.c win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1261] By: gsar on 1998/06/29 06:51:10
+ Log: add missing SSCHECK() to rectify faulty SSPUSH*() logic in change#1259
+ Branch: perl
+ ! scope.h
+____________________________________________________________________________
+[ 1260] By: gsar on 1998/06/29 06:46:12
+ Log: Message-Id: <199806290610.IAA19443@moulon.inra.fr>
+ Date: Mon, 29 Jun 1998 08:10:46 +0200
+ From: ts <decoux@moulon.inra.fr>
+ Subject: {perlembed.pod] Re: Memory leak in Perl 5.004 and the fix
+ Branch: perl
+ ! pod/perlembed.pod
+____________________________________________________________________________
+[ 1259] By: gsar on 1998/06/29 06:01:35
+ Log: added patch for overloading constants, made PERL_OBJECT-aware
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806270328.XAA21088@monk.mps.ohio-state.edu>
+ Date: Fri, 26 Jun 1998 23:28:41 -0400 (EDT)
+ Branch: perl
+ ! ObjXSub.h embed.h embedvar.h global.sym hv.c interp.sym
+ ! intrpvar.h lib/Math/BigInt.pm lib/overload.pm objpp.h op.c
+ ! perl.c perl.h pp_ctl.c proto.h scope.c scope.h
+ ! t/pragma/overload.t toke.c
+____________________________________________________________________________
+[ 1258] By: gsar on 1998/06/29 05:32:25
+ Log: fix Socket.pm typo from change#1240
+ Branch: perl
+ ! ext/Socket/Socket.pm
+____________________________________________________________________________
+[ 1257] By: gsar on 1998/06/29 05:09:24
+ Log: applied patch, tweak for threads awareness
+ From: Albert Dvornik <bert@genscan.com>
+ Subject: [PATCH]5.004_04-m4 (CORE) fix for broken "goto &xsub"
+ Date: 24 Jun 1998 19:33:09 -0400
+ Message-Id: <tq4sxawf2h.fsf@puma.genscan.com>
+ Branch: perl
+ + t/op/goto_xs.t
+ ! MANIFEST pp_ctl.c
+____________________________________________________________________________
+[ 1256] By: gsar on 1998/06/29 03:34:18
+ Log: applied patch, fixed one more leak, tweaked whitespace bugs
+ From: Guy Decoux <decoux@moulon.inra.fr>
+ (via)
+ Date: Fri, 26 Jun 1998 09:59:32 -0400
+ From: "Chunhui Teng" <cteng@nortel.ca>
+ Message-Id: <199806261359.JAA02393@bmers357.nortel.ca>
+ Subject: Memory leak in Perl 5.004 and the fix
+ Branch: perl
+ ! ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
+____________________________________________________________________________
+[ 1255] By: gsar on 1998/06/29 02:50:37
+ Log: From: koenig@kulturbox.de (Andreas J. Koenig)
+ Subject: Permissions in MakeMaker (Was: patch to MM_Unix.pm)
+ Date: 28 Jun 1998 23:47:07 +0200
+ Message-ID: <sfc1zs9gpwk.fsf@dubravka.in-berlin.de>
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1254] By: gsar on 1998/06/28 21:35:02
+ Log: From: joshua.pritikin@db.com
+ Date: Fri, 26 Jun 1998 09:34:34 -0400
+ Message-Id: <H00000e500081d23@MHS>
+ Subject: [PATCH _68] PUSHSTACK renovation
+ Branch: perl
+ ! av.c cop.h gv.c mg.c perl.c pp_ctl.c pp_sys.c sv.c util.c
+____________________________________________________________________________
+[ 1253] By: gsar on 1998/06/28 21:21:22
+ Log: From: Stephen McCamant <alias@mcs.com>
+ Message-Id: <m0yq2fr-000EalC@alias-2.pr.mcs.net>
+ Date: Sat, 27 Jun 1998 16:38:19 -0500 (CDT)
+ Subject: IV changes for long long (was Re: 5.004_68 on its way to the CPAN)
+ Branch: perl
+ ! perlvars.h sv.c
+____________________________________________________________________________
+[ 1252] By: gsar on 1998/06/28 21:16:34
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806272359.TAA05436@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_68] Improve warning on zero-length chunks in RE
+ Date: Sat, 27 Jun 1998 19:59:13 -0400 (EDT)
+ Branch: perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 1251] By: gsar on 1998/06/28 21:14:32
+ Log: add Math/Trig/Radial.pm, update MANIFEST
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Sat, 27 Jun 1998 17:28:14 +0300 (EET DST)
+ Message-Id: <199806271428.RAA05307@alpha.hut.fi>
+ Subject: Math::Trig::Radial ?
+ Branch: perl
+ + lib/Math/Trig/Radial.pm
+ ! MANIFEST
+____________________________________________________________________________
+[ 1250] By: gsar on 1998/06/28 21:09:48
+ Log: applied patch, tweaked doc, and regen regnodes.h
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806270655.CAA29144@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_68] \z in RE
+ Date: Sat, 27 Jun 1998 02:55:26 -0400 (EDT)
+ Branch: perl
+ ! pod/perlre.pod regcomp.c regcomp.sym regexec.c regnodes.h
+ ! t/op/re_tests t/op/regexp.t toke.c
+____________________________________________________________________________
+[ 1249] By: gsar on 1998/06/28 20:56:38
+ Log: From: mike@bill.iac.net
+ Message-ID: <19980627034913.A32220@bill.minivend.com>
+ Date: Sat, 27 Jun 1998 03:49:13 +0000
+ Subject: [ PATCH 5.004 68 ] Text::ParseWords, ^W fixed, version 3.1
+ Branch: perl
+ ! lib/Text/ParseWords.pm t/lib/parsewords.t
+____________________________________________________________________________
+[ 1248] By: gsar on 1998/06/28 20:54:43
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806270352.XAA21174@monk.mps.ohio-state.edu>
+ Subject: [PATCH] Fix ptags
+ Date: Fri, 26 Jun 1998 23:52:54 -0400 (EDT)
+ Branch: perl
+ ! emacs/ptags
+____________________________________________________________________________
+[ 1247] By: gsar on 1998/06/28 20:42:54
+ Log: apply patch sent via private mail
+ From: Stephen McCamant <alias@mcs.com>
+ Message-Id: <m0ypkmt-000EalC@alias-2.pr.mcs.net>
+ Date: Fri, 26 Jun 1998 21:32:23 -0500 (CDT)
+ Subject: Re: Enhanced B::Deparse
+ Branch: perl
+ ! ext/B/B/Deparse.pm
+____________________________________________________________________________
+[ 1246] By: gsar on 1998/06/28 20:38:24
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806270109.VAA14907@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_68] pat.t tests
+ Date: Fri, 26 Jun 1998 21:09:02 -0400 (EDT)
+ Branch: perl
+ ! t/op/pat.t
+____________________________________________________________________________
+[ 1245] By: gsar on 1998/06/28 20:36:08
+ Log: From: joshua.pritikin@db.com
+ Date: Fri, 26 Jun 1998 10:02:32 -0400
+ Message-Id: <H00000e500081d28@MHS>
+ Subject: [PATCH _68] improve recursive error messages!
+ Branch: perl
+ ! gv.c pod/perldiag.pod universal.c
+____________________________________________________________________________
+[ 1244] By: gsar on 1998/06/28 20:09:02
+ Log: From: Dominic Dunlop <domo@vo.lu>
+ Message-Id: <v03110701b1b83a06733a@[195.95.102.101]>
+ Date: Thu, 25 Jun 1998 17:46:55 +0000
+ Subject: [PATCH 5.004_68]: Move REG_INFTY-dependent tests from op/regexp.t
+ to op/pat.t; add tests for a few more regexp parse failures etc.
+ Branch: perl
+ ! t/op/pat.t t/op/re_tests t/op/regexp.t
+____________________________________________________________________________
+[ 1243] By: gsar on 1998/06/28 20:06:30
+ Log: specify *.sym files needed in perl_exp.SH instead of picking up all
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Thu, 25 Jun 1998 10:36:21 -0400 (EDT)
+ Subject: Re: Not OK: perl 5.00468 on aix-thread 4.1.4.0
+ Message-Id: <Pine.SUN.3.96.980625102459.11241F-100000@newton.phys>
+ Branch: perl
+ ! perl_exp.SH
+____________________________________________________________________________
+[ 1242] By: gsar on 1998/06/28 20:01:28
+ Log:
+ From: Gisle Aas <gisle@aas.no>
+ Subject: Re: [PATCH] 4-arg substr update for perl5.004_68
+ Date: 25 Jun 1998 10:32:43 +0200
+ Message-ID: <m3iulpubis.fsf@furu.g.aas.no>
+ Branch: perl
+ ! op.c pod/perlfunc.pod pp.c t/op/substr.t
+____________________________________________________________________________
+[ 1241] By: gsar on 1998/06/28 19:55:11
+ Log: applied patch, tweaked opcode.pl for PERL_OBJECT, and regen opcode.h
+ From: Stephen McCamant <alias@mcs.com>
+ Message-Id: <m0yp1Ue-000EP2C@alias-2.pr.mcs.net>
+ Date: Wed, 24 Jun 1998 21:10:32 -0500 (CDT)
+ Subject: [PATCH REPOST] refgen in opcode.pl
+ Branch: perl
+ ! opcode.h opcode.pl
+____________________________________________________________________________
+[ 1240] By: gsar on 1998/06/28 19:46:29
+ Log: From: Chris Nandor <pudge@pobox.com>
+ Message-Id: <v04011709b1b742cd7f0c@[24.48.29.192]>
+ Date: Wed, 24 Jun 1998 19:58:28 -0400
+ Subject: [PATCH 3d try] Add CR LF CRLF to Socket.pm
+ Branch: perl
+ ! ext/Socket/Socket.pm
+____________________________________________________________________________
+[ 1239] By: gsar on 1998/06/28 19:44:19
+ Log: From: Gisle Aas <gisle@aas.no>
+ Subject: [PATCH] Optimize foreach (1..1000000)
+ Date: 24 Jun 1998 20:26:48 +0200
+ Message-ID: <m3lnqmwt93.fsf@furu.g.aas.no>
+ Branch: perl
+ ! Todo cop.h op.c pod/perldiag.pod pod/perlop.pod pp_ctl.c
+ ! pp_hot.c t/op/range.t
+____________________________________________________________________________
+[ 1238] By: gsar on 1998/06/28 19:28:13
+ Log: avoid creation of %^R
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806241825.OAA06346@monk.mps.ohio-state.edu>
+ Subject: Re: [5.004_68] What is %^R ? [PATCH?]
+ Date: Wed, 24 Jun 1998 14:25:06 -0400 (EDT)
+ Branch: perl
+ ! perl.c t/op/splice.t
+____________________________________________________________________________
+[ 1237] By: gsar on 1998/06/28 19:23:40
+ Log: From: Gisle Aas <gisle@aas.no>
+ Subject: [PATCH] Negative LENGTH argument to splice
+ Date: 24 Jun 1998 15:11:35 +0200
+ Message-ID: <m3g1gvc5bs.fsf@furu.g.aas.no>
+ Branch: perl
+ + t/op/splice.t
+ ! MANIFEST pod/perlfunc.pod pp.c
+____________________________________________________________________________
+[ 1236] By: gsar on 1998/06/28 19:18:29
+ Log: From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Subject: [PATCH] Insecure $ENV{} message out of step with perldiag
+ Message-Id: <E0yooQA-0003za-00@taurus.cus.cam.ac.uk>
+ Date: Wed, 24 Jun 1998 13:13:02 +0100
+ Branch: perl
+ ! pod/perldiag.pod pod/perlsec.pod
+____________________________________________________________________________
+[ 1235] By: gsar on 1998/06/28 19:16:13
+ Log: Complex.pm update
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 24 Jun 1998 15:19:05 +0300 (EET DST)
+ Message-Id: <199806241219.PAA04061@alpha.hut.fi>
+ Subject: [PATCH] 5.004_68: Complex.pm, complex.t
+ Branch: perl
+ ! lib/Math/Complex.pm t/lib/complex.t
+____________________________________________________________________________
+[ 1234] By: gsar on 1998/06/28 19:13:05
+ Log: disable perl malloc on UNICOS for now
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 24 Jun 1998 12:37:14 +0300 (EET DST)
+ Message-Id: <199806240937.MAA01669@alpha.hut.fi>
+ Subject: [PATCH] 5.004_68: UNICOS hints
+ Branch: perl
+ ! hints/unicos.sh
+____________________________________________________________________________
+[ 1233] By: gsar on 1998/06/28 19:10:53
+ Log: fixes unpack("q"...), and semctl() tests for UNICOS
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Date: Wed, 24 Jun 1998 11:55:09 +0300 (EET DST)
+ Message-Id: <199806240855.LAA16152@alpha.hut.fi>
+ Subject: [PATCH] 5.004_68: semctl() in UNICOS (was: pack/unpack)
+ Branch: perl
+ ! pp.c t/op/ipcsem.t t/op/pack.t
+____________________________________________________________________________
+[ 1232] By: gsar on 1998/06/28 19:01:23
+ Log: tweak various places for iperlsys.h awareness
+ Branch: perl
+ ! MANIFEST Makefile.SH lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MM_VMS.pm pod/perlapio.pod
+____________________________________________________________________________
+[ 1231] By: gsar on 1998/06/28 18:37:07
+ Log: add a perlio.h stub for compat (some extensions seem to #include it)
+ Branch: perl
+ + perlio.h
+____________________________________________________________________________
+[ 1230] By: gsar on 1998/06/28 18:35:23
+ Log: Message-ID: <19980624003701.C161@cdata.tvnet.hu>
+ Date: Wed, 24 Jun 1998 00:37:01 +0200
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Subject: Re: [PATCH for _66] Makefile.SH problem on dos/djgpp
+ Branch: perl
+ ! pod/pod2text.PL
+____________________________________________________________________________
+[ 1229] By: gsar on 1998/06/28 18:33:42
+ Log: hand apply mutiliated patch
+ Message-Id: <3.0.5.32.19980623114100.00ab76e0@ous.edu>
+ Date: Tue, 23 Jun 1998 11:41:00 -0700
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: [PATCH 5.004_68]Configure update for VMS
+ Branch: perl
+ ! configure.com vms/descrip_mms.template vms/subconfigure.com
+____________________________________________________________________________
+[ 1228] By: gsar on 1998/06/28 17:17:35
+ Log: hand apply whitespace mutiliated patch
+ Date: Tue, 23 Jun 98 16:38:06 BST
+ Message-Id: <5389.9806231538@tempest.cise.npl.co.uk>
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Subject: PATCH [perl5.004_68] perlbug.PL; was Re: Error message for Errno_pm.PL
+ Branch: perl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 1227] By: gsar on 1998/06/28 17:14:34
+ Log: Date: Tue, 23 Jun 1998 08:51:00 -0700 (PDT)
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Subject: [PATCH] documenting close without arguments
+ Message-ID: <Pine.GSO.3.96.980623084413.24075V-100000@user2.teleport.com>
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1226] By: gsar on 1998/06/28 17:12:56
+ Log: Date: Tue, 23 Jun 1998 05:37:09 -0700 (PDT)
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Subject: Better diags for vars.pm
+ Message-ID: <Pine.GSO.3.96.980623052846.24075A-100000@user2.teleport.com>
+ Branch: perl
+ ! lib/vars.pm
+____________________________________________________________________________
+[ 1225] By: gsar on 1998/06/28 17:05:59
+ Log: hand apply whitespace mutiliated perldoc.PL patches
+ Date: Tue, 23 Jun 98 15:49:52 BST
+ Message-Id: <5302.9806231449@tempest.cise.npl.co.uk>
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Subject: PATCH [5.004_68] perldoc.PL
+ --
+ Date: Fri, 26 Jun 98 17:50:05 BST
+ Message-Id: <6834.9806261650@tempest.cise.npl.co.uk>
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Subject: [PATCH 5.004_68] perldoc.PL
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1224] By: gsar on 1998/06/28 16:50:59
+ Log: integrate ansiperl to get makedef.pl tweak
+ Branch: perl
+ ! Porting/pumpkin.pod win32/makedef.pl
+____________________________________________________________________________
+[ 1223] By: gsar on 1998/06/28 16:33:32
+ Log: add CGI-2.42, its and testsuite
+ Branch: perl
+ + eg/cgi/caution.xbm eg/cgi/dna.small.gif.uu
+ + eg/cgi/nph-multipart.cgi lib/CGI/Cookie.pm t/lib/cgi-form.t
+ + t/lib/cgi-function.t t/lib/cgi-html.t t/lib/cgi-request.t
+ ! MANIFEST eg/cgi/RunMeFirst eg/cgi/file_upload.cgi
+ ! eg/cgi/index.html eg/cgi/monty.cgi eg/cgi/save_state.cgi
+ ! eg/cgi/wilogo.gif.uu lib/CGI.pm lib/CGI/Apache.pm
+ ! lib/CGI/Carp.pm lib/CGI/Fast.pm lib/CGI/Push.pm
+ ! lib/CGI/Switch.pm
+____________________________________________________________________________
+[ 1222] By: gsar on 1998/06/28 15:28:29
+ Log: enable Errno build on win32, add Errno-1.08 files to repository
+ Branch: perl
+ + ext/Errno/ChangeLog ext/Errno/Errno_pm.PL
+ + ext/Errno/Makefile.PL t/lib/errno.t
+ ! MANIFEST win32/Makefile win32/config.bc win32/config.gc
+ ! win32/config.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1221] By: gsar on 1998/06/28 14:34:06
+ Log: tweak win32 config templates for cpp
+ Branch: perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1220] By: nick on 1998/06/26 16:46:13
+ Log: Integrate mainline
+ Branch: ansiperl
+ !> Changes Makefile.SH ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
+ !> ext/POSIX/POSIX.xs perl.c pod/perlre.pod pod/perlvar.pod sv.c
+ !> util.c win32/win32.h
+____________________________________________________________________________
+[ 1219] By: gsar on 1998/06/26 04:33:57
+ Log: make find_script() return saved string, reenable missing diagnostics
+ Branch: perl
+ ! perl.c util.c
+____________________________________________________________________________
+[ 1218] By: gsar on 1998/06/25 23:24:53
+ Log: avoid warning with -P switch
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 1217] By: gsar on 1998/06/25 22:06:58
+ Log: don't suppress display of Makefile recipes that invoke perl
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1216] By: gsar on 1998/06/25 21:32:06
+ Log: tweak order of destruction so OBJECTs in GLOBs are visited after those
+ in RVs
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1215] By: gsar on 1998/06/25 18:56:59
+ Log: mknod() is not POSIX, so remove the POSIX pieces from change#1199
+ Branch: perl
+ ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
+____________________________________________________________________________
+[ 1214] By: gsar on 1998/06/25 18:11:22
+ Log: add FILE_SHARE_DELETE ifndef in win32.h
+ Branch: perl
+ ! win32/win32.h
+____________________________________________________________________________
+[ 1213] By: nick on 1998/06/24 17:18:59
+ Log: Correct perl malloc tweak to .def generation
+ Branch: ansiperl
+ ! win32/makedef.pl
+____________________________________________________________________________
+[ 1212] By: gsar on 1998/06/24 12:40:13
+ Log: check in what change#1182 didn't, and Changes
+ Branch: perl
+ ! Changes pod/perlre.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 1211] By: TimBunce on 1998/06/23 23:09:37
+ Log: Update test count in t/lib/basename.t (see change 1210)
+ Branch: maint-5.004/perl
+ ! t/lib/basename.t
+____________________________________________________________________________
+[ 1210] By: TimBunce on 1998/06/23 22:58:18
+ Log: Title: "Add C<use re 'taint'> pragma to propagate tainting in m// and s///"
+ From: Chip Salzenberg <chip@perl.org>, Gurusamy Sarathy
+ <gsar@engin.umich.edu>, Tim.Bunce@ig.co.uk (Tim Bunce)
+ Msg-ID: <19980525155222.A18445@perlsupport.com>,
+ <199805261143.MAA04260@toad.ig.co.uk>,
+ <199805261235.IAA10371@aatma.engin.umich.edu>,
+ Files: MANIFEST pod/perlmodlib.pod pod/perlop.pod op.h perl.h dump.c
+ installperl lib/re.pm lib/File/Basename.pm mg.c op.c
+ pp_ctl.c pp_hot.c t/lib/basename.t t/op/taint.t toke.c
+ Branch: maint-5.004/perl
+ ! MANIFEST dump.c embed.h installperl lib/File/Basename.pm mg.c
+ ! op.c op.h perl.h pod/perlmodlib.pod pod/perlop.pod pp_ctl.c
+ ! pp_hot.c t/lib/basename.t t/op/taint.t toke.c
+____________________________________________________________________________
+[ 1209] By: nick on 1998/06/23 21:33:34
+ Log: Perl_malloced_size() only available with perl's malloc
+ Branch: ansiperl
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1208] By: nick on 1998/06/23 18:15:23
+ Log: Integrate mainline c. 5.004_68 into ansiperl, mainly
+ so see what has changed...
+ Branch: ansiperl
+ +> Porting/genlog iperlsys.h lib/File/Spec.pm
+ +> lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
+ +> lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+ +> lib/File/Spec/Win32.pm regcomp.pl regcomp.sym regnodes.h
+ +> t/lib/filespec.t win32/perlhost.h
+ - atomic.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h ipsock.h
+ - ipstdio.h perldir.h perlenv.h perlio.h perllio.h perlmem.h
+ - perlproc.h perlsock.h
+ !> (integrate 96 files)
+
+----------------
+Version 5.004_68
+----------------
+
+____________________________________________________________________________
+[ 1207] By: gsar on 1998/06/23 10:55:05
+ Log: final touches to 5.004_68
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 1206] By: gsar on 1998/06/23 10:50:10
+ Log: more MULTIPLICITY tweaks
+ Branch: perl
+ ! objpp.h perl.c perl.h proto.h win32/GenCAPI.pl win32/config.bc
+ ! win32/config.gc win32/config.vc win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 1205] By: gsar on 1998/06/23 09:03:46
+ Log: partial MULTIPLICITY cleanup
+ Branch: perl
+ ! embedvar.h interp.sym intrpvar.h perl.c perlvars.h proto.h
+ ! thrdvar.h
+____________________________________________________________________________
+[ 1204] By: gsar on 1998/06/23 09:00:48
+ Log: tweak MANIFEST, add Dev_t to POSIX/typemap
+ Branch: perl
+ ! MANIFEST Porting/makerel README.win32 ext/POSIX/typemap
+____________________________________________________________________________
+[ 1203] By: gsar on 1998/06/23 07:08:02
+ Log: bump patchlevel to 68, Porting/makerel tweaks
+ Branch: perl
+ ! Porting/makerel patchlevel.h win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1202] By: gsar on 1998/06/23 06:16:19
+ Log: remove atomic.h pending resolution of licensing issues,
+ EMULATE_ATOMIC_REFCOUNTS everywhere
+ Branch: perl
+ - atomic.h
+ ! MANIFEST perl.h sv.h
+____________________________________________________________________________
+[ 1201] By: gsar on 1998/06/23 06:06:23
+ Log: applied patch, regen headers
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806220819.EAA03295@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Malloc size feedback
+ Date: Mon, 22 Jun 1998 04:19:45 -0400 (EDT)
+ Branch: perl
+ ! ObjXSub.h av.c embed.h global.sym hv.c malloc.c objpp.h perl.c
+ ! pp_sys.c proto.h sv.c toke.c
+____________________________________________________________________________
+[ 1200] By: gsar on 1998/06/23 05:59:09
+ Log: Message-Id: <m0yoIgR-000EP2C@alias-2.pr.mcs.net>
+ Date: Mon, 22 Jun 1998 21:19:43 -0500 (CDT)
+ From: Stephen McCamant <alias@mcs.com>
+ Subject: [PATCH] Inheritance of B:: classes
+ Branch: perl
+ ! ext/B/B.pm
+____________________________________________________________________________
+[ 1199] By: gsar on 1998/06/23 05:57:58
+ Log: applied patch, moved #define mkfifo ... from perl.h to POSIX.xs
+ Date: Tue, 23 Jun 1998 00:01:02 +0300 (EET DST)
+ Message-Id: <199806222101.AAA16456@alpha.hut.fi>
+ Subject: [PATCH] _67: somebody said POSIX::mknod?
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! Configure config_h.SH ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
+ ! ext/POSIX/POSIX.xs perl.h
+____________________________________________________________________________
+[ 1198] By: gsar on 1998/06/23 05:48:56
+ Log: Date: Mon, 22 Jun 1998 14:10:46 -0600 (MDT)
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Subject: PATCH [5.004_67] perldoc.PL
+ Message-ID: <Pine.LNX.3.96.980622135953.10412A-100000@perrin.dimensional.com>
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1197] By: gsar on 1998/06/23 05:47:24
+ Log: Message-Id: <3.0.5.32.19980622092918.00aa46e0@ous.edu>
+ Date: Mon, 22 Jun 1998 09:29:18 -0700
+ From: Dan Sugalski <sugalskd@ous.edu>
+ Subject: [PATCH 5.004_67] Autosplit's not qite case-insensitive enough on VMS
+ Branch: perl
+ ! lib/AutoSplit.pm
+____________________________________________________________________________
+[ 1196] By: gsar on 1998/06/23 05:45:19
+ Log: Date: Mon, 22 Jun 1998 18:58:55 +0300 (EET DST)
+ Message-Id: <199806221558.SAA18626@alpha.hut.fi>
+ Subject: [PATCH] 5.004_67: Fcntl: add few constants, enhance maintainability
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
+____________________________________________________________________________
+[ 1195] By: gsar on 1998/06/23 05:43:32
+ Log: Message-Id: <v03110700b1b41e1760b2@[195.95.102.55]>
+ Date: Mon, 22 Jun 1998 15:22:24 +0000
+ From: Dominic Dunlop <domo@vo.lu>
+ Subject: [PATCH 5.004_67] Amend tests/regexp.t for variable REG_INFTY;
+ update machten.sh to vary REG_INFTY
+ Branch: perl
+ ! hints/machten.sh t/op/re_tests t/op/regexp.t
+____________________________________________________________________________
+[ 1194] By: gsar on 1998/06/23 05:38:36
+ Log: filter out array subscripts when generating symbols for AIX
+ Date: Mon, 22 Jun 1998 12:14:31 +0300 (EET DST)
+ Message-Id: <199806220914.MAA13631@alpha.hut.fi>
+ Subject: [PATCH] 5.004_67: perl.exp bug, AIX unhappy
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! perl_exp.SH
+____________________________________________________________________________
+[ 1193] By: gsar on 1998/06/23 05:32:52
+ Log: updated hints file to cope with buggy sigsetjmp() on Solaris-x86
+ Message-Id: <199806221102.NAA12106@alanya.m.isar.de>
+ Date: Mon, 22 Jun 1998 13:02:45 +0200 (MET DST)
+ From: Lupe Christoph <lupe@alanya.m.isar.de>
+ Subject: Re: Perl 5.004_67: Death is on vacation - miniperl can't die
+ Branch: perl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 1192] By: gsar on 1998/06/23 05:27:13
+ Log: add detailed changelogs and 'genlog'--the script which generates them
+ Branch: perl
+ + Porting/genlog
+ ! Changes INSTALL
+____________________________________________________________________________
+[ 1191] By: gsar on 1998/06/22 15:56:27
+ Log: tweak win32 makefiles for PERL_OBJECT build
+ Branch: perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1190] By: gsar on 1998/06/22 04:06:02
+ Log: backout change#1178 as it was dependent on an unapplied patch,
+ fix filespec.t to know its @INC
+ Branch: perl
+ ! sv.c t/lib/filespec.t
+____________________________________________________________________________
+[ 1189] By: gsar on 1998/06/22 03:47:43
+ Log: eliminate use of tokenbuf in util.c
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 1188] By: gsar on 1998/06/22 01:53:59
+ Log: add patch that generates regnodes.h via regcomp.pl
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806212038.QAA29797@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] regcomp.h regnodes cleanup
+ Date: Sun, 21 Jun 1998 16:38:21 -0400 (EDT)
+ Branch: perl
+ + regcomp.pl regcomp.sym regnodes.h
+ ! MANIFEST Makefile.SH regcomp.h
+____________________________________________________________________________
+[ 1187] By: gsar on 1998/06/22 01:42:21
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806210145.VAA21629@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Avoid temporaries on recursion
+ Date: Sat, 20 Jun 1998 21:45:03 -0400 (EDT)
+ Branch: perl
+ ! pp_ctl.c pp_hot.c
+____________________________________________________________________________
+[ 1186] By: gsar on 1998/06/22 01:14:14
+ Log: merge relevant portions from maintbranch change#1155
+ Branch: perl
+ ! lib/Math/BigFloat.pm op.c pod/perlfunc.pod pod/perlop.pod
+ ! pod/perlrun.pod pp_hot.c
+____________________________________________________________________________
+[ 1185] By: gsar on 1998/06/22 00:59:28
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806210827.EAA26322@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Zero-length matching bug
+ Date: Sun, 21 Jun 1998 04:27:16 -0400 (EDT)
+ Branch: perl
+ ! regexec.c t/op/pat.t
+____________________________________________________________________________
+[ 1184] By: gsar on 1998/06/22 00:57:27
+ Log: fix alignment issues in malloc.c on 64-bit platforms (via private mail)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806170844.EAA24584@monk.mps.ohio-state.edu>
+ Subject: Re: _67 not okay
+ Date: Wed, 17 Jun 1998 04:44:26 -0400 (EDT)
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1183] By: gsar on 1998/06/22 00:53:37
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806210727.DAA24072@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Test study/re/
+ Date: Sun, 21 Jun 1998 03:27:13 -0400 (EDT)
+ Branch: perl
+ ! t/op/pat.t
+____________________________________________________________________________
+[ 1182] By: gsar on 1998/06/21 21:25:07
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806210430.AAA21818@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] $^R documented
+ Date: Sun, 21 Jun 1998 00:30:48 -0400 (EDT)
+ Branch: perl
+ ! pod/perlre.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 1181] By: gsar on 1998/06/21 21:23:41
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806210111.VAA17752@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Re docs
+ Date: Sat, 20 Jun 1998 21:11:37 -0400 (EDT)
+ Branch: perl
+ ! pod/perlop.pod pod/perlre.pod
+____________________________________________________________________________
+[ 1180] By: gsar on 1998/06/21 21:22:16
+ Log: adapted contents of message into comments in malloc.c and INSTALL
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806162240.SAA23597@monk.mps.ohio-state.edu>
+ Subject: [5.004_67] malloc.c -Defines
+ Date: Tue, 16 Jun 1998 18:40:41 -0400 (EDT)
+ Branch: perl
+ ! INSTALL malloc.c
+____________________________________________________________________________
+[ 1179] By: gsar on 1998/06/21 07:26:35
+ Log: applied patch, with edits to the prose
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806201936.PAA17499@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Error variables compared
+ Date: Sat, 20 Jun 1998 15:36:14 -0400 (EDT)
+ Branch: perl
+ ! pod/perlvar.pod
+____________________________________________________________________________
+[ 1178] By: gsar on 1998/06/21 07:07:16
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806200104.VAA11343@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] print study /re/ broken
+ Date: Fri, 19 Jun 1998 21:04:54 -0400 (EDT)
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 1177] By: gsar on 1998/06/21 07:06:10
+ Log: applied patch, tweaked wording
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806200838.EAA13992@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Documentation patch for malloc
+ Date: Sat, 20 Jun 1998 04:38:07 -0400 (EDT)
+ Branch: perl
+ ! malloc.c pod/perldiag.pod
+____________________________________________________________________________
+[ 1176] By: gsar on 1998/06/21 07:00:30
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806200829.EAA13974@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Cosmetic malloc patch
+ Date: Sat, 20 Jun 1998 04:29:00 -0400 (EDT)
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1175] By: gsar on 1998/06/21 06:58:37
+ Log: Message-Id: <3.0.5.32.19980619160057.032e7480@ous.edu>
+ Date: Fri, 19 Jun 1998 16:00:57 -0700
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: [PATCH 5.004_67] fixup patches for VMS
+ Branch: perl
+ ! ext/SDBM_File/sdbm/Makefile.PL t/lib/filecopy.t t/op/defins.t
+ ! t/op/taint.t vms/test.com vms/vms.c
+____________________________________________________________________________
+[ 1174] By: gsar on 1998/06/21 06:55:18
+ Log: applied VMS patch from Dan Sugalski
+ Date: Fri, 19 Jun 1998 15:36:34 -0700
+ From: SYSTEM@cedar.osshe.edu
+ Message-Id: <980619153634.2063ee12@cedar.osshe.edu>
+ Subject: [PATCH 5.004_67] Enhancements to the VMS configuration procedures
+ Branch: perl
+ ! configure.com lib/ExtUtils/MM_VMS.pm perl.h
+ ! vms/descrip_mms.template vms/gen_shrfls.pl
+ ! vms/subconfigure.com
+____________________________________________________________________________
+[ 1173] By: gsar on 1998/06/21 06:51:38
+ Log: applied patch, modified logic to avoid reentering lexer at compile-time
+ Message-ID: <19980619113104.S9711@asic.sc.ti.com>
+ Date: Fri, 19 Jun 1998 11:31:04 -0500
+ From: Graham Barr <gbarr@ti.com>
+ Subject: Re: [PATCH perl5.004_67] Add Errno in ext/
+ Branch: perl
+ ! Configure MANIFEST Makefile.SH ext/util/make_ext gv.c
+ ! lib/English.pm
+____________________________________________________________________________
+[ 1172] By: gsar on 1998/06/21 06:27:57
+ Log: applied patch, along with many changes:
+ - ipfoo.h headers have been coalesced along with perlfoo.h into
+ iperlsys.h
+ - win32/cp*.h have been combined in perlhost.h
+ - CPerlObj::PerlParse() takes an extra xsinit arg
+ - tweaks to get dl_win32.xs compiling again w/ PERL_OBJECT
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Message-Id: <000001bd9b8c$0417fe90$a32fa8c0@tau.Active>
+ Subject: RE: [PATCH 5.004_67] Fixes for broken MS compiler
+ Date: Fri, 19 Jun 1998 10:59:50 -0700
+ Branch: perl
+ + iperlsys.h win32/perlhost.h
+ - ipdir.h ipenv.h iplio.h ipmem.h ipproc.h ipsock.h ipstdio.h
+ - perldir.h perlenv.h perlio.h perllio.h perlmem.h perlproc.h
+ - perlsock.h
+ ! MANIFEST mg.h op.h perl.h perlio.c proto.h util.c
+ ! win32/Makefile win32/dl_win32.xs win32/makefile.mk
+ ! win32/runperl.c win32/win32.h
+____________________________________________________________________________
+[ 1171] By: gsar on 1998/06/21 00:44:42
+ Log: Date: Fri, 19 Jun 1998 07:55:19 -0600 (MDT)
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Subject: Re: PATCH _67 (Doc) perlop.pod
+ Message-ID: <Pine.LNX.3.96.980619075203.13326A-100000@perrin.dimensional.com>
+ Branch: perl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 1170] By: gsar on 1998/06/21 00:43:06
+ Log: a tweaked version of:
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Subject: [PATCH 5.004_67] Win32 using PerlCRT.dll
+ Date: Wed, 17 Jun 1998 20:25:51 -0700
+ Message-ID: <001b01bd9a68$cb752410$a32fa8c0@tau.Active>
+ Branch: perl
+ ! lib/ExtUtils/MM_Win32.pm win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1169] By: gsar on 1998/06/21 00:10:18
+ Log: added patch, regen headers
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806190227.WAA07371@monk.mps.ohio-state.edu>
+ Subject: Re: Ilya's patches
+ Date: Thu, 18 Jun 1998 22:27:31 -0400 (EDT)
+ Branch: perl
+ ! ObjXSub.h embedvar.h interp.sym intrpvar.h toke.c
+____________________________________________________________________________
+[ 1168] By: gsar on 1998/06/21 00:05:01
+ Log: Date: Thu, 18 Jun 1998 23:37:32 -0700 (PDT)
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Subject: [PATCH] docs creating files via open
+ Message-ID: <Pine.GSO.3.96.980618231856.17544S-100000@user2.teleport.com>
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 1167] By: gsar on 1998/06/21 00:03:34
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806172151.RAA28441@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_67] Better version of malloc improver
+ Date: Wed, 17 Jun 1998 17:51:54 -0400 (EDT)
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1166] By: gsar on 1998/06/20 23:59:23
+ Log: enhance perlre.pod to say C<)> can't appear in a (?#...) comment
+ Branch: perl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 1165] By: gsar on 1998/06/20 23:47:09
+ Log: added patch, tweaked missed files, excised comment that doesn't really
+ belong in the sources
+ From: joshua.pritikin@db.com
+ Date: Mon, 15 Jun 1998 10:03:37 -0400
+ Message-Id: <H00000e500072c63@MHS>
+ Subject: [PATCH 5.004_57] tied hash slice & do_kv cleanup
+ Branch: perl
+ ! ObjXSub.h av.c doop.c embed.h global.sym objpp.h pp.c proto.h
+ ! t/op/avhv.t
+____________________________________________________________________________
+[ 1164] By: gsar on 1998/06/20 23:29:09
+ Log: add File-Spec-0.6 from CPAN
+ Branch: perl
+ + lib/File/Spec.pm lib/File/Spec/Mac.pm lib/File/Spec/OS2.pm
+ + lib/File/Spec/Unix.pm lib/File/Spec/VMS.pm
+ + lib/File/Spec/Win32.pm t/lib/filespec.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 1163] By: gsar on 1998/06/20 23:15:41
+ Log: tweaks to allow both mingw32{gcc-2.8.1,egcs-1.0.2} build and test
+ Branch: perl
+ ! ext/POSIX/POSIX.xs win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1162] By: gsar on 1998/06/20 21:48:32
+ Log: manual integration of all outstanding ansi branch stuff into mainline
+ Branch: perl
+ ! ext/POSIX/POSIX.xs lib/ExtUtils/MM_Win32.pm t/op/ipcsem.t
+ ! win32/config.gc win32/dl_win32.xs win32/makefile.mk
+ ! win32/win32.h
+____________________________________________________________________________
+[ 1161] By: gsar on 1998/06/20 21:12:01
+ Log: undo goofed change 1157 (backed out the fix instead of keeping it)
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1160] By: nick on 1998/06/20 21:05:51
+ Log: Patches to build with EGCS-1.0.2 Mingw32 port.
+ Branch: ansiperl
+ ! ext/POSIX/POSIX.xs win32/config.gc win32/config_H.gc
+ ! win32/dl_win32.xs win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 1159] By: gsar on 1998/06/20 02:51:35
+ Log: cleanup installation of utilities on win32
+ Branch: perl
+ ! installperl pod/Makefile win32/Makefile win32/makefile.mk
+ ! win32/pod.mak
+____________________________________________________________________________
+[ 1158] By: gsar on 1998/06/20 02:50:35
+ Log: intuit @INC pathnames from exe location only if dll location
+ is unknown (ensures that multiple executables will coexist)
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 1157] By: gsar on 1998/06/20 02:48:34
+ Log: make perldoc ignore null files (it tried to open() them)
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1156] By: gsar on 1998/06/19 21:18:47
+ Log: fix perldoc to ignore unfound null filenames
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 1155] By: TimBunce on 1998/06/19 18:47:57
+ Log: Assorted patches:
+
+ ------ BUILD PROCESS ------
+
+ Title: "Clarify varargs issues in INSTALL docs"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980603125427.8559C-100000@newton.phys>
+ Files: INSTALL
+
+ ------ CORE LANGUAGE ------
+
+ Title: "Further fixes for updated SysV IPC support"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199805211644.TAA15139@alpha.hut.fi>
+ Files: Configure perl.h doio.c
+
+ Title: "Fixed SEGV caused by bug in pp_hot.c:pp_sassign()"
+ From: Andrew Bettison <andrewb@zip.com.au>
+ Msg-ID: <m0ykMQx-000OQCC@headroom.zip.com.au>
+ Files: pp_hot.c
+
+ Title: "Invalidate method cache on C<local *subname>"
+ From: Chip Salzenberg <chip@perl.org>
+ Msg-ID: <19980604134731.D24343@perlsupport.com>
+ Files: scope.c t/op/method.t
+
+ Title: "fix uninitialized cv variable in op.c"
+ From: joshua.pritikin@db.com
+ Msg-ID: <H00000e50005af05@MHS>
+ Files: op.c
+
+ Title: "fix for undef as last arg to setsockopt"
+ From: Graham Barr <gbarr@ti.com>
+ Msg-ID: <19980603112219.B7638@asic.sc.ti.com>
+ Files: pp_sys.c
+
+ Title: "Fix -i when @ARGV is empty"
+ From: Chip Salzenberg <chip@perl.org>, Gurusamy Sarathy
+ <gsar@engin.umich.edu>, Ilya Zakharevich
+ <ilya@math.ohio-state.edu>, Tim.Bunce@ig.co.uk (Tim Bunce)
+ Msg-ID: <19980606184942.A4583@perlsupport.com>,
+ <199806070029.UAA18709@monk.mps.ohio-state.edu>,
+ <199806071817.OAA28141@aatma.engin.umich.edu>,
+ <199806191549.QAA16376@toad.ig.co.uk>
+ Files: pp_hot.c
+
+ ------ DOCUMENTATION ------
+
+ Title: "Discrepancy between perlop.pod and m// operator docs"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980526092614.27437B-100000@user2.teleport.com>
+ Files: pod/perlop.pod
+
+ Title: "Doc addition for perlfunc entry for system()"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>, Mike Fletcher
+ <fletch@phydeaux.org>
+ Msg-ID: <199806011908.PAA31069@dewdrop2.mindspring.com>,
+ <199806012057.QAA26830@monk.mps.ohio-state.edu>
+ Files: pod/perlfunc.pod
+
+ Title: "Clarify effects of using quotes with m operator"
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Msg-ID: <Pine.LNX.3.96.980617111641.25631B-100000@perrin.dimensional.com>
+ Files: pod/perlop.pod
+
+ Title: "Document -i with STDIN"
+ From: joshua.pritikin@db.com
+ Msg-ID: <H00000e50006a84a@MHS>
+ Files: pod/perlrun.pod
+
+ ------ EXTENSIONS ------
+
+ Title: "Fix Liblist.pm to tolerate backslashen in paths"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199806011954.PAA10900@aatma.engin.umich.edu>
+ Files: lib/ExtUtils/Liblist.pm
+
+ ------ LIBRARY ------
+
+ Title: "Typo fix for Math::BogFloat"
+ From: Mike Stok <mike@stok.co.uk>
+ Msg-ID: <Pine.LNX.3.96.980605101623.982F-100000@stok.co.uk>
+ Files: lib/Math/BigFloat.pm
+
+ ------ PORTABILITY - GENERAL ------
+
+ Title: "Add docs about types of diff to Porting/patching.pod"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199806090105.VAA20005@aatma.engin.umich.edu>
+ Files: Porting/patching.pod
+
+ Title: "Set dont_use_nlink for PowerMAX OS 4.2"
+ From: Tom Horsley <Tom.Horsley@mail.ccur.com>
+ Msg-ID: <199806161354.NAA21316@cleo.ssd.hcsc.com>
+ Files: hints/powerux.sh
+
+ Title: "Assorted improvements to hints/solaris_2.sh"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980527135845.26608K-100000@newton.phys>
+ Files: hints/solaris_2.sh
+ Branch: maint-5.004/perl
+ ! Configure INSTALL Porting/patching.pod doio.c hints/powerux.sh
+ ! hints/solaris_2.sh lib/ExtUtils/Liblist.pm
+ ! lib/Math/BigFloat.pm op.c perl.h pod/perlfunc.pod
+ ! pod/perlop.pod pod/perlrun.pod pp_hot.c pp_sys.c scope.c
+ ! t/op/method.t
+____________________________________________________________________________
+[ 1154] By: gsar on 1998/06/19 17:22:23
+ Log: update repository copy of Asmdata.pm after `perl bytecode.pl`
+ Branch: perl
+ ! ext/B/B/Asmdata.pm regcomp.c
+____________________________________________________________________________
+[ 1153] By: nick on 1998/06/19 17:21:21
+ Log: Use libxxx.a for -lxxx with GCC
+ Branch: ansiperl
+ ! lib/ExtUtils/MM_Win32.pm win32/config.gc win32/config_H.gc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1152] By: TimBunce on 1998/06/19 17:08:18
+ Log: Title: Tom's jumbo doc patch
+ From: Tom Christiansen <tchrist@chthon.perl.com>
+ Msg-Id: <199806140419.WAA20549@chthon.perl.com>
+ Files: pod/perl.pod pod/perlbook.pod pod/perldata.pod pod/perldsc.pod
+ pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ pod/perlfaq9.pod pod/perlform.pod pod/perlfunc.pod
+ pod/perlipc.pod pod/perllocale.pod pod/perllol.pod
+ pod/perlmod.pod pod/perlmodlib.pod pod/perlobj.pod
+ pod/perlop.pod pod/perlre.pod pod/perlref.pod
+ pod/perlrun.pod pod/perlsec.pod pod/perlsub.pod
+ pod/perlsyn.pod pod/perltie.pod pod/perltoot.pod
+ pod/perlvar.pod
+ Branch: maint-5.004/perl
+ ! pod/perl.pod pod/perlbook.pod pod/perldata.pod pod/perldsc.pod
+ ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod pod/perlform.pod pod/perlfunc.pod
+ ! pod/perlipc.pod pod/perllocale.pod pod/perllol.pod
+ ! pod/perlmod.pod pod/perlmodlib.pod pod/perlobj.pod
+ ! pod/perlop.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ ! pod/perlsec.pod pod/perlsub.pod pod/perlsyn.pod
+ ! pod/perltie.pod pod/perltoot.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 1151] By: nick on 1998/06/19 15:38:28
+ Log: Resolve latest
+ Branch: ansiperl
+ !> av.c embed.h embedvar.h ext/Socket/Socket.xs global.sym
+ !> hints/powerux.sh mg.c perl.h pod/perlsub.pod pp_ctl.c proto.h
+ !> sv.c t/TEST
+____________________________________________________________________________
+[ 1150] By: gsar on 1998/06/18 20:43:07
+ Log: Date: Tue, 16 Jun 1998 13:54:17 GMT
+ Message-Id: <199806161354.NAA21316@cleo.ssd.hcsc.com>
+ From: Tom Horsley <Tom.Horsley@mail.ccur.com>
+ Subject: [PATCH] perl5.004 hints file (maint and dev paths)
+ Branch: perl
+ ! hints/powerux.sh
+____________________________________________________________________________
+[ 1149] By: gsar on 1998/06/18 20:41:30
+ Log: hand apply whitespace-mutiliated patch
+ From: joshua.pritikin@db.com
+ Date: Mon, 15 Jun 1998 09:21:36 -0400
+ Message-Id: <H00000e50007289b@MHS>
+ Subject: [PATCH 5.004_67] SvREADONLY for av_clear
+ Branch: perl
+ ! av.c
+____________________________________________________________________________
+[ 1148] By: gsar on 1998/06/18 20:33:59
+ Log: hand apply whitespace-mutiliated and reversed patch
+ Date: Tue, 16 Jun 1998 16:31:40 -0400
+ From: Les Peters <lpeters@aol.net>
+ Message-Id: <199806162031.QAA08202@ds9>
+ Subject: [PATCH 5.004_67] Socket.xs tweak for IRIX 6.3
+ Branch: perl
+ ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 1147] By: gsar on 1998/06/18 20:26:59
+ Log: close child pipe in t/TEST, other cosmetic tweaks
+ Branch: perl
+ ! t/TEST
+____________________________________________________________________________
+[ 1146] By: gsar on 1998/06/18 19:37:41
+ Log: back out problematic change#1105, tweak perlsub.pod
+ Branch: perl
+ ! embed.h embedvar.h global.sym mg.c perl.h pod/perlsub.pod
+ ! pp_ctl.c proto.h sv.c
+____________________________________________________________________________
+[ 1145] By: nick on 1998/06/18 19:31:07
+ Log: Integrate and resolve -at mainline to ansiperl prior to Ming32 hacking
+ Branch: ansiperl
+ +> configure.com ext/DB_File/dbinfo
+ +> ext/DynaLoader/DynaLoader_pm.PL t/base/rs.t
+ +> t/op/regexp_noamp.t vms/descrip_mms.template vms/munchconfig.c
+ +> vms/subconfigure.com
+ - ext/DynaLoader/DynaLoader.pm.PL vms/config.vms vms/descrip.mms
+ - vms/fndvers.com
+ !> (integrate 499 files)
+____________________________________________________________________________
+[ 1144] By: gsar on 1998/06/18 16:35:11
+ Log: fix spurious cxstack_max init that trampled memory
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 1143] By: gsar on 1998/06/18 16:33:01
+ Log: fix memory leaks and uninitialized memory accesses found by Purify
+ Branch: perl
+ ! doio.c perl.c regexec.c sv.c
+____________________________________________________________________________
+[ 1142] By: gsar on 1998/06/18 16:28:48
+ Log: fix off-by-one that trampled memory in re_croak2()
+ Branch: perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 1141] By: gsar on 1998/06/18 16:26:59
+ Log: fix AutoLoader to do the right thing when there are relative paths
+ in @INC
+ Branch: perl
+ ! lib/AutoLoader.pm
+____________________________________________________________________________
+[ 1140] By: gsar on 1998/06/18 16:22:47
+ Log: fix Makefile.SH typo
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1139] By: gsar on 1998/06/17 18:06:16
+ Log: 5.004_67 niggles
+ Branch: perl
+ ! Makefile.SH op.c
+
+----------------
+Version 5.004_67
+----------------
+
+____________________________________________________________________________
+[ 1138] By: gsar on 1998/06/15 10:09:27
+ Log: up patchlevel.h to 67, other small tweaks
+ Branch: perl
+ ! patchlevel.h pod/perlhist.pod pod/perltoc.pod vms/perly_c.vms
+ ! win32/Makefile win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1137] By: gsar on 1998/06/15 09:08:57
+ Log: tweaks to get PERL_OBJECT building again; passes tests
+ Branch: perl
+ ! ObjXSub.h objpp.h proto.h
+____________________________________________________________________________
+[ 1136] By: gsar on 1998/06/15 08:51:54
+ Log: back out previous change (it breaks PERL_OBJECT)
+ Branch: perl
+ ! ObjXSub.h cc_runtime.h embed.h embedvar.h global.sym
+ ! interp.sym intrpvar.h objpp.h perl.c perl.h pod/perldiag.pod
+ ! pod/perlguts.pod pp_ctl.c proto.h scope.c scope.h util.c
+____________________________________________________________________________
+[ 1135] By: gsar on 1998/06/15 05:32:01
+ Log: added patch, fixed typo, reworked documentation
+ Message-Id: <H00000e500071aa3@MHS>
+ Date: Sun, 14 Jun 1998 14:03:15 EDT
+ From: joshua.pritikin@db.com
+ Subject: [PATCH 5.004_66] JMPENV!
+ Branch: perl
+ ! ObjXSub.h cc_runtime.h embed.h embedvar.h global.sym
+ ! interp.sym intrpvar.h objpp.h perl.c perl.h pod/perldiag.pod
+ ! pod/perlguts.pod pp_ctl.c proto.h scope.c scope.h util.c
+____________________________________________________________________________
+[ 1134] By: gsar on 1998/06/15 04:07:18
+ Log: various win32 odds and ends
+ - added support for waitpid(), open2/open3, and a bugfix for kill()
+ from Ronald Schmidt <RonaldWS@aol.com>
+ - tweak testsuite mods of above
+ - regenerate win32/config_H.?c
+ - change kill() to win32_kill() and export it
+ - coalesce common code in win32.c
+ - add PerlProc_waitpid() and export win32_waitpid()
+ result builds and passes on the three win32 compilers
+ Branch: perl
+ ! ipproc.h lib/IPC/Open3.pm perlproc.h t/lib/open2.t
+ ! t/lib/open3.t util.c win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makedef.pl win32/runperl.c
+ ! win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 1133] By: gsar on 1998/06/15 01:39:13
+ Log: newer Getopt/Long.pm from public distribution cited in:
+ Message-Id: <m2n2bgm8en.fsf@phoenix.squirrel.nl>
+ Date: 14 Jun 1998 15:15:28 +0200
+ From: Johan Vromans <jvromans@squirrel.nl>
+ Subject: Getopt::Long version 2.17 released
+ Branch: perl
+ ! lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 1132] By: gsar on 1998/06/15 01:37:12
+ Log: documentation update from tchrist
+ Message-Id: <199806140419.WAA20549@chthon.perl.com>
+ Date: Sat, 13 Jun 1998 22:19:32 MDT
+ From: Tom Christiansen <tchrist@chthon.perl.com>
+ Subject: doc patches
+ Branch: perl
+ ! pod/perl.pod pod/perlbook.pod pod/perldata.pod pod/perldsc.pod
+ ! pod/perlfaq.pod pod/perlfaq1.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq6.pod pod/perlfaq7.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod pod/perlform.pod pod/perlfunc.pod
+ ! pod/perlipc.pod pod/perllocale.pod pod/perllol.pod
+ ! pod/perlmod.pod pod/perlmodlib.pod pod/perlobj.pod
+ ! pod/perlop.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ ! pod/perlsec.pod pod/perlsub.pod pod/perlsyn.pod
+ ! pod/perltie.pod pod/perltoot.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 1131] By: gsar on 1998/06/14 19:33:36
+ Log: Message-ID: <pz3edaedog.fsf@eeyore.ibcinc.com>
+ From: Roderick Schertler <roderick@argon.org>
+ Subject: [PATCH] Re: Exceptions in IPC::Open2
+ Date: 12 Jun 1998 13:24:15 -0400
+ Branch: perl
+ ! lib/IPC/Open3.pm
+____________________________________________________________________________
+[ 1130] By: gsar on 1998/06/14 19:32:25
+ Log: fixup MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 1129] By: gsar on 1998/06/14 18:51:53
+ Log: various win32 fixes
+ - fixes that silence VC noises about dup exports, non-default libs, and
+ unsupported *.def file directives
+ - s/inplace/inplace_label/ malloc.c
+ - update Config{usemymalloc} based on d_mymalloc
+ - export Perl_*Vars
+ - fix makefiles to not build miniperl.exe twice, and to make it properly
+ when defaults are changed
+ Branch: perl
+ ! lib/ExtUtils/MM_Win32.pm lib/ExtUtils/Mksymlists.pm malloc.c
+ ! win32/Makefile win32/config_sh.PL win32/makedef.pl
+ ! win32/makefile.mk win32/perllib.c win32/win32.h
+____________________________________________________________________________
+[ 1128] By: gsar on 1998/06/14 01:38:39
+ Log: remove unused global `scrgv'
+ Branch: perl
+ ! ObjXSub.h cygwin32/cw32imp.h embedvar.h perlvars.h
+____________________________________________________________________________
+[ 1127] By: nick on 1998/06/13 08:39:07
+ Log: Move specialsv_list to embed.sym, regen embed*.h
+ Branch: win32/perl
+ ! embed.h embedvar.h global.sym interp.sym
+____________________________________________________________________________
+[ 1126] By: gsar on 1998/06/12 07:23:06
+ Log: From: jan.dubois@ibm.net (Jan Dubois)
+ Subject: Re: execv in toke.c [PATCH]: win32 wrapper for _66
+ Date: Thu, 11 Jun 1998 21:13:31 +0200
+ Message-ID: <35842ac5.7883075@smtp1.ibm.net>
+ Branch: perl
+ ! win32/makedef.pl win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 1125] By: gsar on 1998/06/12 07:21:29
+ Log: added patch, undo earlier workaround
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Subject: Re: Why does saferealloc(NULL,size) croak? [PATCH] against _66
+ Date: Thu, 11 Jun 1998 20:28:36 +0200
+ Message-ID: <35831f69.4975644@smtp1.ibm.net>
+ Branch: perl
+ ! perl.c util.c
+____________________________________________________________________________
+[ 1124] By: gsar on 1998/06/12 07:16:12
+ Log: hand-applied patch with wrapped lines
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Subject: [PATCH 5.004_66] Win32::Reg... bloat in Win32
+ Date: Thu, 11 Jun 1998 11:06:33 -0700
+ Message-ID: <000101bd9563$aae0c4c0$a32fa8c0@tau.Active>
+ Branch: perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 1123] By: gsar on 1998/06/12 07:07:25
+ Log: Date: Thu, 11 Jun 1998 12:40:05 -0400 (EDT)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: [PATCH 5.004_66] Config_66-01-02.diff
+ Message-Id: <Pine.SUN.3.96.980611123857.18493K-100000@newton.phys>
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 1122] By: gsar on 1998/06/12 07:06:02
+ Log: Message-Id: <Pine.SUN.3.96.980611122249.18493J-100000@newton.phys>
+ Date: Thu, 11 Jun 1998 12:27:15 -0400 (EDT)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: Re: [PATCH for _66] Makefile.SH problem on dos/djgpp
+ Branch: perl
+ ! pod/checkpods.PL pod/pod2html.PL pod/pod2latex.PL
+ ! pod/pod2man.PL utils/c2ph.PL utils/h2ph.PL utils/h2xs.PL
+ ! utils/perlbug.PL utils/perlcc.PL utils/perldoc.PL
+ ! utils/pl2pm.PL utils/splain.PL x2p/find2perl.PL x2p/s2p.PL
+____________________________________________________________________________
+[ 1121] By: gsar on 1998/06/12 07:01:20
+ Log: a tweaked version of:
+ Message-Id: <l03130300b1a6143078cd@[194.222.64.89]>
+ Date: Fri, 12 Jun 1998 01:26:53 +0200
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Subject: Re: Misparsing s///x
+ Branch: perl
+ ! pod/perlre.pod
+____________________________________________________________________________
+[ 1120] By: gsar on 1998/06/12 06:51:08
+ Log: applied patch, with indentation tweaks
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806110803.EAA09149@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_66] Remove REG_ALIGN junk
+ Date: Thu, 11 Jun 1998 04:03:58 -0400 (EDT)
+ Branch: perl
+ ! regcomp.c regcomp.h regexec.c
+____________________________________________________________________________
+[ 1119] By: gsar on 1998/06/11 17:42:07
+ Log: make REG_INFTY default to something saner when sizeof(short) > 2
+ Message-Id: <Pine.SUN.3.96.980611114241.18493H-100000@newton.phys>
+ Date: Thu, 11 Jun 1998 11:50:07 EDT
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: Re: [PATCH for tests] Regexp fails on long string
+ Branch: perl
+ ! regcomp.h
+____________________________________________________________________________
+[ 1118] By: gsar on 1998/06/11 07:09:06
+ Log: regen embedvar.h
+ Branch: perl
+ ! embedvar.h
+____________________________________________________________________________
+[ 1117] By: gsar on 1998/06/11 06:45:52
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806100751.DAA05441@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_66] Bugs with (?{}), $^R and many-to-many subst
+ Date: Wed, 10 Jun 1998 03:51:47 -0400 (EDT)
+ Branch: perl
+ ! interp.sym intrpvar.h op.c op.h perl.c regcomp.c regcomp.h
+ ! regexec.c regexp.h t/op/pat.t t/op/subst.t
+____________________________________________________________________________
+[ 1116] By: gsar on 1998/06/11 06:35:54
+ Log: misc win32 fixes
+ From: "Douglas Lankshear" <dougl@ActiveState.com>
+ Subject: [PATCH 5.004_66]
+ Date: Wed, 10 Jun 1998 11:28:27 -0700
+ Message-ID: <001a01bd949d$8fd18050$a32fa8c0@tau.Active>
+ Branch: perl
+ ! ObjXSub.h perl.c win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1115] By: gsar on 1998/06/11 06:33:21
+ Log: Message-ID: <19980610005325.D162@cdata.tvnet.hu>
+ Date: Wed, 10 Jun 1998 00:53:25 +0200
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Subject: [PATCH for _66] Makefile.SH problem on dos/djgpp
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 1114] By: gsar on 1998/06/11 06:31:34
+ Log: back out change#1111 and add alternative patch:
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806101538.LAA07293@monk.mps.ohio-state.edu>
+ Subject: Re: PATCH for study/foo/
+ Date: Wed, 10 Jun 1998 11:38:58 -0400 (EDT)
+ Branch: perl
+ ! pp.c sv.c
+____________________________________________________________________________
+[ 1113] By: gsar on 1998/06/11 02:59:23
+ Log: fix outdated bytecode.pl
+ Branch: perl
+ ! bytecode.h bytecode.pl byterun.c byterun.h
+____________________________________________________________________________
+[ 1112] By: gsar on 1998/06/10 07:56:06
+ Log: Added patch, regenerated perly.c and perly.c.diff
+ Message-Id: <m0ygCL8-000Eb3C@alias-2.pr.mcs.net>
+ Date: Sun, 31 May 1998 12:56:14 -0500 (CDT)
+ From: Stephen McCamant <alias@mcs.com>
+ Subject: [PATCH] too many RV2GVs in *foo{THING}
+ Branch: perl
+ ! perly.c perly.c.diff perly.y t/op/gv.t
+____________________________________________________________________________
+[ 1111] By: gsar on 1998/06/10 07:40:30
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806100309.XAA04974@monk.mps.ohio-state.edu>
+ Subject: Re: PATCH for study/foo/
+ Date: Tue, 9 Jun 1998 23:09:55 -0400 (EDT)
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 1110] By: gsar on 1998/06/10 07:37:04
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806100219.WAA04865@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_66] -DL and PERL_DEBUG_MSTATS unravelled
+ Date: Tue, 9 Jun 1998 22:19:02 -0400 (EDT)
+ Branch: perl
+ ! pod/perldebug.pod
+____________________________________________________________________________
+[ 1109] By: gsar on 1998/06/10 07:35:29
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806100302.XAA04958@monk.mps.ohio-state.edu>
+ Subject: Re: [PATCH 5.004_66] REG_INFTY patch corrected
+ Date: Tue, 9 Jun 1998 23:02:52 -0400 (EDT)
+ Branch: perl
+ ! regcomp.h
+____________________________________________________________________________
+[ 1108] By: gsar on 1998/06/10 07:31:25
+ Log: Added patch, tweaked other places affected by name change
+ Message-ID: <19980610005417.G162@cdata.tvnet.hu>
+ Date: Wed, 10 Jun 1998 00:54:17 +0200
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Subject: [PATCH] file name DynaLoader.pm.PL is 8.3 unfriendly
+ Branch: perl
+ +> ext/DynaLoader/DynaLoader_pm.PL
+ - ext/DynaLoader/DynaLoader.pm.PL
+ ! MANIFEST ext/DynaLoader/Makefile.PL win32/Makefile
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 1107] By: gsar on 1998/06/10 07:24:20
+ Log: Message-ID: <19980610005342.E162@cdata.tvnet.hu>
+ Date: Wed, 10 Jun 1998 00:53:42 +0200
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Subject: [PATCH for _66] new version of README.dos
+ Branch: perl
+ ! README.dos
+____________________________________________________________________________
+[ 1106] By: gsar on 1998/06/10 07:22:31
+ Log: Message-ID: <19980610005404.F162@cdata.tvnet.hu>
+ Date: Wed, 10 Jun 1998 00:54:04 +0200
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Subject: [PATCH for _66] op/taint.t problem on dos/djgpp
+ Branch: perl
+ ! t/op/taint.t
+____________________________________________________________________________
+[ 1105] By: gsar on 1998/06/10 07:21:21
+ Log: Applied patch, followed by tweaks to *.sym and `perl embed.pl`
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806090216.WAA02041@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_66] Resend of RE cache patch (modified)
+ Date: Mon, 8 Jun 1998 22:16:56 -0400 (EDT)
+ Branch: perl
+ ! embed.h embedvar.h global.sym intrpvar.h mg.c perl.h
+ ! perlvars.h pp_ctl.c proto.h sv.c
+____________________________________________________________________________
+[ 1104] By: gsar on 1998/06/10 07:06:01
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806090210.WAA02027@monk.mps.ohio-state.edu>
+ Subject: Lost chunk of RE jumbo patch
+ Date: Mon, 8 Jun 1998 22:10:52 -0400 (EDT)
+ Branch: perl
+ + t/op/regexp_noamp.t
+____________________________________________________________________________
+[ 1103] By: gsar on 1998/06/10 07:04:20
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Message-Id: <199806090207.WAA02015@monk.mps.ohio-state.edu>
+ Subject: [PATCH 5.004_66] Combined OS/2 support
+ Date: Mon, 8 Jun 1998 22:07:48 -0400 (EDT)
+ Branch: perl
+ ! os2/Changes os2/diff.configure os2/os2.c
+____________________________________________________________________________
+[ 1102] By: gsar on 1998/06/10 07:00:08
+ Log: Message-Id: <199803140103.UAA04839@monk.mps.ohio-state.edu>
+ Date: Fri, 13 Mar 1998 20:03:52 EST
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.004_62 5_004_04m1] pod2html again
+ Branch: perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 1101] By: gsar on 1998/06/10 06:55:20
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: Re: 5.004_65 uninitialized variable regexec.c (2)
+ Date: Thu, 28 May 1998 01:28:54 -0400 (EDT)
+ Branch: perl
+ ! regexec.c
+____________________________________________________________________________
+[ 1100] By: gsar on 1998/06/10 06:52:50
+ Log: updated MANIFEST for previous change
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 1099] By: gsar on 1998/06/10 06:51:08
+ Log: Mangled patch, needed hand-tweaks, along with binmode for rs.t:
+ Message-Id: <3.0.5.32.19980605110840.009e12b0@ous.edu>
+ Date: Fri, 05 Jun 1998 11:08:40 -0700
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: Re: [PATCH 5.004_66]Add record read capability to <>
+ Branch: perl
+ + t/base/rs.t
+ ! perl.h pod/perlvar.pod sv.c
+____________________________________________________________________________
+[ 1098] By: gsar on 1998/06/10 06:36:59
+ Log: From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Message-Id: <9806042022.AA10418@claudius.bfsec.bt.co.uk>
+ Subject: [PATCH fror 5.004_66] DB_File-1.60
+ Date: Thu, 4 Jun 1998 21:22:35 +0100 (BST)
+ Branch: perl
+ + ext/DB_File/dbinfo
+ ! MANIFEST ext/DB_File/Changes ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/typemap t/lib/db-btree.t
+ ! t/lib/db-hash.t t/lib/db-recno.t
+____________________________________________________________________________
+[ 1097] By: gsar on 1998/06/10 06:33:16
+ Log: Message-ID: <19980604134731.D24343@perlsupport.com>
+ Date: Thu, 4 Jun 1998 13:47:31 -0400
+ From: Chip Salzenberg <chip@perl.org>
+ Subject: [PATCH] Invalidate method cache on C<local *subname>
+ Branch: perl
+ ! scope.c t/op/method.t
+____________________________________________________________________________
+[ 1096] By: gsar on 1998/06/10 06:30:51
+ Log: From: Norton Allen <allen@huarp.harvard.edu>
+ Message-Id: <199806031908.PAA04183@bottesini.harvard.edu>
+ Subject: [PATCH] _66 MM_Unix.pm for QNX
+ Date: Wed, 3 Jun 1998 15:08:33 -0400 (edt)
+ Branch: perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 1095] By: gsar on 1998/06/10 06:29:21
+ Log: From: Norton Allen <allen@huarp.harvard.edu>
+ Message-Id: <199806031909.PAA04358@bottesini.harvard.edu>
+ Subject: [PATCH] _66 proto.h
+ Date: Wed, 3 Jun 1998 15:09:14 -0400 (edt)
+ Branch: perl
+ ! proto.h
+____________________________________________________________________________
+[ 1094] By: gsar on 1998/06/10 06:26:39
+ Log: Applied relevant parts of:
+ From: Paul Johnson <pjcj@transeda.com>
+ Date: Wed, 3 Jun 1998 19:07:55 +0100 (BST)
+ Message-Id: <199806031807.TAA04100@west-tip.transeda.com>
+ Subject: [PATCH] Enhancing xsubpp's support for C++
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
+____________________________________________________________________________
+[ 1093] By: gsar on 1998/06/10 06:22:54
+ Log: Message-ID: <19980603112219.B7638@asic.sc.ti.com>
+ Date: Wed, 3 Jun 1998 11:22:19 -0500
+ From: Graham Barr <gbarr@ti.com>
+ Subject: [PATCH perl5.004_04-m4] fix for undef as last arg to setsockopt
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1092] By: gsar on 1998/06/10 06:20:44
+ Log: Message-Id: <199806030919.KAA03527@sale-wts>
+ Date: Wed, 3 Jun 1998 10:20:06 +0100 (BST)
+ From: Alan Burlison <Alan.Burlison@UK.Sun.com>
+ Subject: [PATCH 5.004_66] ExtUtils::Installed.pm and ExtUtils::Packlist.pm
+ Branch: perl
+ ! lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
+____________________________________________________________________________
+[ 1091] By: gsar on 1998/06/10 06:18:42
+ Log: Message-Id: <3.0.5.32.19980601122229.00a58420@ous.edu>
+ Date: Mon, 01 Jun 1998 12:22:29 -0700
+ From: SYSTEM@cedar.osshe.edu (by way of Dan Sugalski <sugalskd@ous.edu>)
+ Subject: [PATCH 5.004_66] proto.h change to make byterun() visible to VMS
+ Branch: perl
+ ! proto.h
+____________________________________________________________________________
+[ 1090] By: gsar on 1998/06/10 06:14:24
+ Log: A tweaked version of:
+ Date: Mon, 1 Jun 1998 12:05:47 -0700
+ From: SYSTEM@cedar.osshe.edu
+ Message-Id: <980601120547.20617d54@cedar.osshe.edu>
+ Subject: [PATCH 5.004_66] Fix problem with SDBM makefile on VMS
+ Branch: perl
+ ! ext/SDBM_File/sdbm/Makefile.PL
+____________________________________________________________________________
+[ 1089] By: gsar on 1998/06/10 05:58:00
+ Log: Message-Id: <m0yfdd4-000Eb2C@alias-2.pr.mcs.net>
+ Date: Fri, 29 May 1998 23:52:26 -0500 (CDT)
+ From: Stephen McCamant <alias@mcs.com>
+ Subject: [PATCH] Re: Uninitialised error from -M()
+ Branch: perl
+ ! op.c t/op/stat.t
+____________________________________________________________________________
+[ 1088] By: gsar on 1998/06/10 05:55:24
+ Log: Date: Sat, 30 May 1998 08:07:01 -0400
+ From: lvirden@cas.org (Larry Virden)
+ Message-Id: <199805301207.IAA08856@cas.org>
+ Subject: PATCH for pod and warning notice
+ Branch: perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 1087] By: gsar on 1998/06/10 05:52:05
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Date: Mon, 8 Jun 1998 14:45:36 -0400 (EDT)
+ Message-Id: <Pine.SUN.3.96.980608144437.13972A-100000@newton.phys>
+ Subject: [PATCH 5.004_66] Config_66-01
+ Branch: perl
+ ! Configure MANIFEST Porting/Glossary Porting/config.sh
+ ! Porting/config_H config_h.SH
+____________________________________________________________________________
+[ 1086] By: gsar on 1998/06/10 05:46:38
+ Log: Message-Id: <3.0.5.32.19980608161314.00a0a880@ous.edu>
+ Date: Mon, 08 Jun 1998 16:13:14 -0700
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: [PATCH 5.004_66] Documentation patch for Semaphore.pm
+ Branch: perl
+ ! ext/Thread/Thread/Semaphore.pm
+____________________________________________________________________________
+[ 1085] By: gsar on 1998/06/10 05:44:44
+ Log: Message-Id: <3.0.5.32.19980608161002.00a64a70@ous.edu>
+ Date: Mon, 08 Jun 1998 16:10:02 -0700
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: [PATCH 5.004_66]Doc & feature patch for Thread::Queue
+ Branch: perl
+ - vms/descrip.mms
+ ! ext/Thread/Thread/Queue.pm
+____________________________________________________________________________
+[ 1084] By: gsar on 1998/06/10 05:38:11
+ Log: Message-Id: <3.0.5.32.19980608153828.00a81ea0@ous.edu>
+ Date: Mon, 08 Jun 1998 15:38:28 -0700
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: [PATCH POINTER 5.004_66]A configuration system for VMS perl
+ Branch: perl
+ + configure.com vms/descrip_mms.template vms/munchconfig.c
+ + vms/subconfigure.com
+ - vms/config.vms vms/fndvers.com
+ ! MANIFEST README.vms lib/ExtUtils/MM_VMS.pm
+____________________________________________________________________________
+[ 1083] By: gsar on 1998/06/10 05:07:04
+ Log: xsubpp enhancements ($CPAN/authors/id/ILYAZ/patches/diff_xsubpp_65), a
+ variant of:
+ Message-Id: <199712131231.HAA04125@monk.mps.ohio-state.edu>
+ Date: Sat, 13 Dec 1997 07:31:02 EST
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: 5.004_55: xsubpp: new keywords INTERFACE C_ARGS
+ Branch: perl
+ ! XSUB.h lib/ExtUtils/xsubpp pod/perlxs.pod
+____________________________________________________________________________
+[ 1082] By: gsar on 1998/06/10 04:52:26
+ Log: add newer malloc.c from Ilya Zakharevich <ilya@math.ohio-state.edu>
+ (from $CPAN/authors/id/ILYAZ/patches/diff_malloc_65)
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 1081] By: gsar on 1998/06/10 03:45:10
+ Log: reverse integrate contents of win32 branch into mainline
+ Branch: perl
+ !> (integrate 44 files)
+____________________________________________________________________________
+[ 1080] By: gsar on 1998/06/09 17:37:55
+ Log: `p4 integrate -b ASPerl && p4 resolve -at`
+ Branch: asperl
+ !> (integrate 43 files)
+____________________________________________________________________________
+[ 1079] By: gsar on 1998/06/09 00:59:06
+ Log: add examples of diff(1) usage
+ Branch: win32/perl
+ ! Porting/patching.pod
+____________________________________________________________________________
+[ 1078] By: gsar on 1998/06/09 00:52:23
+ Log: undo change#1077
+ Branch: win32/perl
+ ! sv.c
+____________________________________________________________________________
+[ 1077] By: gsar on 1998/06/06 16:47:32
+ Log: make sv_setsv() treat freed SVs like SVt_NULL
+ Branch: win32/perl
+ ! sv.c
+____________________________________________________________________________
+[ 1076] By: gsar on 1998/06/05 19:03:14
+ Log: delete undiscussed AS changes for PPD (broke .packlist
+ mechanism)
+ Branch: win32/perl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 1075] By: gsar on 1998/06/05 18:18:44
+ Log: add AS patch#26 (rename THIS to PERL_OBJEC_THIS to avoid clash
+ with the xsubpp-generated symbol)
+ Branch: win32/perl
+ ! ObjXSub.h perl.c perl.h pp_ctl.c pp_hot.c toke.c
+ ! win32/dl_win32.xs
+____________________________________________________________________________
+[ 1074] By: gsar on 1998/06/04 22:45:18
+ Log: add AS patch#25 (allow B build with -DPERL_OBJECT)
+ Branch: win32/perl
+ ! ObjXSub.h byterun.h embed.h embedvar.h ext/B/B.xs intrpvar.h
+ ! objpp.h proto.h util.c win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1073] By: nick on 1998/06/04 17:18:14
+ Log: resolve -at win32 branch into ansiperl
+ Branch: ansiperl
+ +> ObjXSub.h XSLock.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
+ +> ipsock.h ipstdio.h objpp.h t/lib/h2ph.h t/lib/h2ph.pht
+ +> t/lib/h2ph.t win32/GenCAPI.pl
+ !> (integrate 127 files)
+____________________________________________________________________________
+[ 1072] By: gsar on 1998/06/04 01:49:24
+ Log: document CORE::GLOBAL:: and global overriding, fix up
+ File::DosGlob, testsuited and all
+ Branch: win32/perl
+ ! lib/File/DosGlob.pm pod/perlsub.pod t/lib/dosglob.t
+____________________________________________________________________________
+[ 1071] By: gsar on 1998/06/03 22:12:55
+ Log: add AS patch#24, remove one other instance of error_no
+ that was missed (patch#23 was intentionally skipped)
+ Branch: win32/perl
+ ! embedvar.h globals.c perlvars.h win32/makedef.pl
+ ! win32/runperl.c
+____________________________________________________________________________
+[ 1070] By: gsar on 1998/06/01 19:42:06
+ Log: fix Liblist.pm to tolerate backslashen in paths
+ Branch: win32/perl
+ ! lib/ExtUtils/Liblist.pm
+____________________________________________________________________________
+[ 1069] By: gsar on 1998/06/01 07:43:02
+ Log: @INC construction on win32 cleaned up
+ - perl.dll location based paths should be much more reliable now
+ - registry stuff unchanged
+ - Config.pm now has all the installfoolib entries for MakeMaker et al
+ Branch: win32/perl
+ ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/config_h.PL win32/config_sh.PL win32/makefile.mk
+ ! win32/runperl.c win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 1068] By: gsar on 1998/05/31 21:52:18
+ Log: semctl tweak
+ Message-Id: <199805312127.QAA06750@gbarr.connect.net>
+ Date: Sun, 31 May 1998 16:27:33 CDT
+ From: Graham Barr <gbarr@pobox.com>
+ Subject: Not OK: perl 5.00466 on i586-linux-thread 2.0.31
+ Branch: win32/perl
+ ! doio.c
+____________________________________________________________________________
+[ 1067] By: gsar on 1998/05/31 21:07:44
+ Log: minimal fix to enable compiling with -DMULTIPLICITY
+ (non-threadsafe regcomp.c globals need revisiting)
+ Branch: win32/perl
+ ! ObjXSub.h embedvar.h interp.sym intrpvar.h regcomp.c
+ ! win32/GenCAPI.pl win32/makedef.pl
+____________________________________________________________________________
+[ 1066] By: gsar on 1998/05/30 21:35:37
+ Log: integrate mainline changes (ASPerl branch is identical to
+ win32 branch as of this change)
+ Branch: asperl
+ !> MANIFEST Todo.5.005 embed.h ext/POSIX/POSIX.xs global.sym
+ !> lib/ExtUtils/Mksymlists.pm pod/perldelta.pod pp_sys.c
+ !> t/op/ipcmsg.t t/op/ipcsem.t win32/Makefile win32/config.bc
+ !> win32/config.gc win32/config.vc win32/config_H.bc
+ !> win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 1065] By: gsar on 1998/05/30 21:13:06
+ Log: change#1060 was inexplicably missing some of the "ensure
+ AS stuff does no harm" fixes
+ Branch: win32/perl
+ ! embed.h global.sym win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1064] By: gsar on 1998/05/30 21:10:27
+ Log: integrate mainline to pick up trivial changes
+ Branch: win32/perl
+ !> MANIFEST pp_sys.c
+
+----------------
+Version 5.004_66
+----------------
+
+____________________________________________________________________________
+[ 1063] By: mbeattie on 1998/05/29 15:19:55
+ Log: Remove duplicate win32/TEST line from MANIFEST.
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 1062] By: mbeattie on 1998/05/29 15:18:33
+ Log: Add missing ";" to pp_umask (spotted by Jarkko Hietaniemi).
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1061] By: mbeattie on 1998/05/29 12:02:17
+ Log: Integrate from win32 branch into mainline (this now pulls in the
+ asperl stuff).
+ Branch: perl
+ +> ObjXSub.h XSLock.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
+ +> ipsock.h ipstdio.h objpp.h t/lib/h2ph.h t/lib/h2ph.pht
+ +> t/lib/h2ph.t win32/GenCAPI.pl
+ !> (integrate 104 files)
+____________________________________________________________________________
+[ 1060] By: gsar on 1998/05/29 11:05:50
+ Log: reverse integrate asperl branch contents (phew!)
+ - various fixups to ensure AS stuff does no harm
+ - adjust win32/makefiles for the new directory layout (new layout
+ looks rather a muddle--needs rework)
+ - verified build & test on NT and Solaris/gcc
+ Branch: win32/perl
+ +> ObjXSub.h XSLock.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
+ +> ipsock.h ipstdio.h objpp.h win32/GenCAPI.pl
+ ! ext/POSIX/POSIX.xs lib/ExtUtils/Mksymlists.pm win32/Makefile
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+ !> (integrate 77 files)
+____________________________________________________________________________
+[ 1059] By: gsar on 1998/05/29 08:33:56
+ Log: asperl branch verified to build w/o PERL_OBJECT on Solaris and NT
+ Branch: asperl
+ ! util.c
+____________________________________________________________________________
+[ 1058] By: gsar on 1998/05/29 08:31:09
+ Log: type xtext for *.t that were missing it
+ Branch: asperl
+ ! t/lib/thread.t t/op/nothread.t
+____________________________________________________________________________
+[ 1057] By: gsar on 1998/05/29 08:28:46
+ Log: stray t/op/ipc*.t fixups
+ Branch: win32/perl
+ ! t/op/ipcmsg.t t/op/ipcsem.t
+____________________________________________________________________________
+[ 1056] By: gsar on 1998/05/29 07:41:49
+ Log: fixups to make it build and pass tests under both compilers
+ Branch: asperl
+ ! ObjXSub.h objpp.h proto.h
+____________________________________________________________________________
+[ 1055] By: gsar on 1998/05/29 07:22:51
+ Log: integrate mainline changes
+ Branch: asperl
+ +> t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t
+ !> (integrate 69 files)
+ Branch: win32/perl
+ ! Todo.5.005 pod/perldelta.pod
+____________________________________________________________________________
+[ 1054] By: gsar on 1998/05/29 05:04:03
+ Log: add a txt_compare() routine to t/h2ph.t for DOSISH sanity
+ Branch: win32/perl
+ ! t/lib/h2ph.t
+____________________________________________________________________________
+[ 1053] By: gsar on 1998/05/29 05:01:54
+ Log: misc changes
+ - remove code that works around lack of I_STDARG (we're a happy ANSI family)
+ - leave dump_foo() stubs when not -DDEBUGGING for consistent symbol exports
+ Branch: win32/perl
+ ! deb.c dump.c ext/DynaLoader/dlutils.c ext/POSIX/POSIX.xs
+ ! perl.h perlio.c proto.h regcomp.c run.c scope.c sv.c util.c
+ ! x2p/util.c x2p/util.h
+____________________________________________________________________________
+[ 1052] By: gsar on 1998/05/29 02:31:44
+ Log: merge changes#1014,1038 from maintbranch
+ Branch: win32/perl
+ + t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t
+ ! MANIFEST Makefile.SH doio.c ext/POSIX/POSIX.xs gv.c
+ ! lib/Benchmark.pm lib/ExtUtils/MM_Unix.pm pod/perldebug.pod
+ ! pod/perldiag.pod pod/perlfunc.pod pod/perlop.pod
+ ! pod/perlre.pod pod/perltie.pod pod/perltrap.pod sv.c
+ ! t/io/pipe.t utils/h2ph.PL
+____________________________________________________________________________
+[ 1051] By: gsar on 1998/05/29 01:38:51
+ Log: regenerate win32/config_H.?c
+ Branch: win32/perl
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 1050] By: gsar on 1998/05/29 01:32:41
+ Log: integrate mainline
+ Branch: win32/perl
+ ! win32/Makefile win32/makefile.mk
+ !> Configure INSTALL MANIFEST Porting/Glossary Porting/config.sh
+ !> Porting/config_H Porting/patching.pod config_h.SH doio.c
+ !> ext/POSIX/hints/sunos_4.pl hints/bsdos.sh hints/openbsd.sh
+ !> hints/solaris_2.sh hints/sunos_4_1.sh hints/svr4.sh
+ !> lib/FileHandle.pm patchlevel.h perl.h plan9/config.plan9
+ !> vms/config.vms win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1049] By: gsar on 1998/05/29 00:57:05
+ Log: fix various shenanigans with C<environ>, BC and VC builds now pass
+ all tests
+ Branch: asperl
+ ! globals.c win32/Makefile win32/makefile.mk win32/runperl.c
+ ! win32/win32.h win32/win32iop.h
+____________________________________________________________________________
+[ 1048] By: mbeattie on 1998/05/28 18:07:24
+ Log: Integrated win32 branch into mainline. The changes to t/op/ipc*.t
+ in change 1043 clashed badly with changes made in the win32
+ branch. I did an accept on the win32 branch version for now.
+ Branch: perl
+ +> t/op/die.t
+ !> (integrate 52 files)
+____________________________________________________________________________
+[ 1047] By: mbeattie on 1998/05/28 17:59:18
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: [PATCH 5.004_65] Config_65-02-03.diff: SunOS and Solaris hints
+ Date: Thu, 28 May 1998 13:27:25 -0400 (EDT)
+ Subject: [PATCH 5.004_65] Config_65-03-04.diff: semctl probing
+ Date: Thu, 28 May 1998 13:28:21 -0400 (EDT)
+ Branch: perl
+ ! Configure MANIFEST Porting/Glossary Porting/config.sh
+ ! Porting/config_H config_h.SH doio.c ext/POSIX/hints/sunos_4.pl
+ ! hints/solaris_2.sh hints/sunos_4_1.sh perl.h vms/config.vms
+ ! win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1046] By: mbeattie on 1998/05/28 17:55:48
+ Log: Back out change 1043 since Andy's forthcoming Config patch
+ includes a modified version.
+ Branch: perl
+ ! Configure config_h.SH doio.c perl.h
+____________________________________________________________________________
+[ 1045] By: mbeattie on 1998/05/28 17:52:40
+ Log: Bump patchlevel.h to 66.
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 1044] By: mbeattie on 1998/05/28 17:51:49
+ Log: From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Subject: [PATCH] _04m2 <DOC> perlfunc.pod (fwd)
+ Date: Fri, 15 May 1998 16:18:26 -0600 (MDT)
+ (above minus the t/system.t test pending checking)
+ Subject: [PATCH] 5.004[04|65] <DOC> FileHandle.pm
+ Date: Wed, 20 May 1998 19:50:50 -0600 (MDT)
+ Subject: [PATCH] _65 and _04 <DOC> patching.pod
+ Date: Thu, 21 May 1998 16:33:03 -0600 (MDT)
+ Branch: perl
+ ! Porting/patching.pod lib/FileHandle.pm pod/perlfunc.pod
+____________________________________________________________________________
+[ 1043] By: mbeattie on 1998/05/28 17:42:21
+ Log: This change really is:
+ Subject: [PATCH] 5.004_65: the infamous semctl()
+ Date: Sun, 24 May 1998 16:13:21 +0300 (EET DST)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+
+ Change 1041 claimed to be this patch but was really:
+ Subject: [PATCH] 5.004_65: t/op/ipc*.t
+ Date: Sat, 16 May 1998 00:52:39 +0300 (EET DST)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! Configure config_h.SH doio.c perl.h
+____________________________________________________________________________
+[ 1042] By: mbeattie on 1998/05/28 17:36:57
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: [PATCH 5.004_65] Config_65-01: lchown() detection.
+ Date: Thu, 28 May 1998 13:25:21 -0400 (EDT)
+ Subject: [PATCH 5.004_65] Config_65-01-02.diff: INSTALL and hints fixes
+ Date: Thu, 28 May 1998 13:26:18 -0400 (EDT)
+ Branch: perl
+ ! Configure INSTALL Porting/Glossary Porting/config.sh
+ ! Porting/config_H config_h.SH doio.c hints/bsdos.sh
+ ! hints/openbsd.sh hints/svr4.sh plan9/config.plan9
+ ! vms/config.vms win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 1041] By: mbeattie on 1998/05/28 17:34:26
+ Log: Subject: [PATCH] 5.004_65: the infamous semctl()
+ Date: Sun, 24 May 1998 16:13:21 +0300 (EET DST)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! t/op/ipcmsg.t t/op/ipcsem.t
+____________________________________________________________________________
+[ 1040] By: gsar on 1998/05/28 02:06:47
+ Log: tweaks to enable Borland build
+ Branch: asperl
+ ! win32/makefile.mk win32/win32.c
+____________________________________________________________________________
+[ 1039] By: gsar on 1998/05/27 23:29:22
+ Log: remove C<#define index strchr> from win32.h (unused, and the
+ pollution causes spurious variable name changes in extensions)
+ Branch: win32/perl
+ ! win32/win32.h
+____________________________________________________________________________
+[ 1038] By: TimBunce on 1998/05/27 17:29:15
+ Log: Assorted patches:
+
+ ------ BUILD PROCESS ------
+
+ Title: "add utilities to make test dependencies"
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Msg-ID: <2607.9805211303@tempest.cise.npl.co.uk>
+ Files: Makefile.SH
+
+ Title: "Add 'make nok' complement to 'make ok'"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0ycRDf-0005Wh-00@taurus.cus.cam.ac.uk>
+ Files: Makefile.SH
+
+ Title: "further h2ph patches (add enum support)"
+ From: Billy <wdconsta@cs.adelaide.edu.au>
+ Msg-ID: <Pine.SV4.3.93.980521025541.14577A-100000@xenon.teaching.cs.adelaide.edu.au>
+ Files: MANIFEST t/lib/h2ph.pht t/lib/h2ph.t utils/h2ph.PL
+
+ ------ CORE LANGUAGE ------
+
+ Title: "Fix %! error spelling and add perldiag.pod entry"
+ From: Graham Barr <gbarr@pobox.com>, Tim Bunce
+ Msg-ID: <19980524193101.A573@pobox.com>
+ Files: pod/perldiag.pod gv.c
+
+ Title: "Remove obsolete Win32 uppercasing ENV code"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805201510.LAA28676@aatma.engin.umich.edu>
+ Files: perl.c
+
+ Title: "Don't mung $! on implicit close"
+ From: Chip Salzenberg <chip@perl.org>
+ Msg-ID: <19980525113309.A15845@perlsupport.com>
+ Files: doio.c
+
+ Title: "Maint trial 3 fails on SunOS 4.1.3 with Sun cc"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980527113114.26608D-100000@newton.phys>
+ Files: doio.c
+
+ ------ DOCUMENTATION ------
+
+ Title: "doc patch: you canna return an array ( list context: || vs or)"
+ From: Jarkko Hietaniemi <jhi@cc.hut.fi>
+ Msg-ID: <oeeemxguf5h.fsf_-_@alpha.hut.fi>
+ Files: pod/perldebug.pod pod/perlfunc.pod pod/perltie.pod pod/perltrap.pod
+
+ Title: "doc patch: @ needs escaping in m/\Q\E/ environment"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0yecim-0002qr-00@taurus.cus.cam.ac.uk>
+ Files: pod/perlop.pod pod/perlre.pod
+
+ Title: "Discrepancy between perlop.pod and m// operator", "Doc fix: Only
+ with /g does list context get matches without parens"
+ From: Greg Chapman <glc@well.com>, Tom Christiansen
+ <tchrist@jhereg.perl.com>, Tom Phoenix
+ <rootbeer@teleport.com>
+ Msg-ID: <000201bd865e$f3bf72e0$1f04400c@assigned.well.com>,
+ <199805231559.JAA21316@jhereg.perl.com>,
+ <Pine.GSO.3.96.980523084947.22348I-100000@user2.teleport.com>
+ Files: pod/perlop.pod
+
+ Title: "Documenting last/next/redo even further"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Tom Phoenix
+ <rootbeer@teleport.com>
+ Msg-ID: <E0yec2h-0000B9-00@taurus.cus.cam.ac.uk>,
+ <Pine.GSO.3.96.980526111426.27437K-100000@user2.teleport.com>
+ Files: pod/perlfunc.pod
+
+ Title: "Documenting last/next/redo within continue block"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980525214558.7133H-100000@user2.teleport.com>
+ Files: pod/perlfunc.pod
+
+ Title: "Document stat return in scalar context"
+ From: Mark-Jason Dominus <mjd@plover.com>
+ Files: pod/perlfunc.pod
+
+ ------ EXTENSIONS ------
+
+ Title: "Better LD_RUN_PATH handling on IRIX"
+ From: "W. Phillip Moore" <wpm@ms.com>
+ Msg-ID: <199805212206.SAA07504@zappa.morgan.com>
+ Files: lib/ExtUtils/MM_Unix.pm
+
+ Title: "Dealing with <unistd.h> in POSIX and SunOS"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980527115256.26608F-100000@newton.phys>
+ Files: ext/POSIX/hints/sunos_4.pl hints/sunos_4_1.sh ext/POSIX/POSIX.xs
+
+ ------ LIBRARY ------
+
+ Title: "Fix FileHandle.pm example bug"
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Msg-ID: <Pine.LNX.3.96.980520194825.10845C-100000@perrin.dimensional.com>
+ Files: lib/FileHandle.pm
+
+ Title: "Add zero/negative $count docs for Benchmark.pm"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0ydEAr-0006NV-00@taurus.cus.cam.ac.uk>
+ Files: lib/Benchmark.pm
+
+ ------ PORTABILITY - GENERAL ------
+
+ Title: "Add test suite recommendations to Porting/patching.pod"
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Msg-ID: <Pine.LNX.3.96.980521162925.3568B-100000@perrin.dimensional.com>
+ Files: Porting/patching.pod
+
+ ------ TESTS ------
+
+ Title: "Fix looping bug in t/io/pipe.t"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0yc737-0006fB-00@taurus.cus.cam.ac.uk>
+ Files: t/io/pipe.t
+ Branch: maint-5.004/perl
+ ! MANIFEST Makefile.SH Porting/patching.pod doio.c
+ ! ext/POSIX/POSIX.xs ext/POSIX/hints/sunos_4.pl gv.c
+ ! hints/sunos_4_1.sh lib/Benchmark.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/FileHandle.pm perl.c pod/perldebug.pod pod/perldiag.pod
+ ! pod/perlfunc.pod pod/perlop.pod pod/perlre.pod pod/perltie.pod
+ ! pod/perltrap.pod t/io/pipe.t t/lib/h2ph.pht t/lib/h2ph.t
+ ! utils/h2ph.PL
+____________________________________________________________________________
+[ 1037] By: gsar on 1998/05/27 16:18:30
+ Log: add AS patch#22 (fix to make die_exit.t pass)
+ Branch: asperl
+ ! win32/runperl.c
+____________________________________________________________________________
+[ 1036] By: gsar on 1998/05/27 12:50:34
+ Log: add AS patch#21 (misc. fixes)
+ Branch: asperl
+ ! ObjXSub.h lib/ExtUtils/MM_Unix.pm objpp.h perl.h
+ ! win32/GenCAPI.pl win32/Makefile win32/makefile.mk
+ ! win32/win32.c win32/win32sck.c
+____________________________________________________________________________
+[ 1035] By: gsar on 1998/05/26 17:26:17
+ Log: more changes to satisfy non-debug VC build (C-API doesn't
+ build, and the testsuite still won't run)
+ Branch: asperl
+ ! ObjXSub.h deb.c dump.c ext/POSIX/POSIX.xs globals.c proto.h
+ ! regcomp.c run.c scope.c sv.c util.c win32/GenCAPI.pl
+____________________________________________________________________________
+[ 1034] By: gsar on 1998/05/26 17:20:22
+ Log: remove doubled hunk (perforce auto-integrate oddity)
+ Branch: win32/perl
+ ! pod/perldiag.pod
+____________________________________________________________________________
+[ 1033] By: gsar on 1998/05/26 13:39:14
+ Log: tweaks to make it build with the Borland compiler. Won't run
+ testsuite because @INC intuition from location of perlcore.dll seems
+ to be broken. Also, system() and qx// seem broken as well.
+ Branch: asperl
+ ! ObjXSub.h doio.c embedvar.h ext/POSIX/POSIX.xs interp.sym
+ ! intrpvar.h objpp.h perl.c perl.h perlvars.h proto.h regcomp.c
+ ! regexec.c toke.c
+____________________________________________________________________________
+[ 1032] By: gsar on 1998/05/24 23:13:05
+ Log: tweak Benchmark.pm to restore old timestr() behavior--show wall secs
+ Branch: win32/perl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 1031] By: gsar on 1998/05/24 05:36:44
+ Log: tweak makefiles
+ Branch: asperl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 1030] By: gsar on 1998/05/23 18:58:23
+ Log: merge changes#1016,1018 from maintbranch (1017 is n/a)
+ Branch: win32/perl
+ ! pp_sys.c t/op/die.t
+____________________________________________________________________________
+[ 1029] By: gsar on 1998/05/23 18:55:13
+ Log: merge change#1015 from maintbranch (must revisit 1014 later, is
+ incomplete)
+ Branch: win32/perl
+ ! embed.h global.sym op.c pp.c proto.h sv.c
+____________________________________________________________________________
+[ 1028] By: gsar on 1998/05/23 18:25:14
+ Log: merge change#1013 from maintbranch (1012 is n/a)
+ Branch: win32/perl
+ ! toke.c
+____________________________________________________________________________
+[ 1027] By: gsar on 1998/05/23 18:02:21
+ Log: merge change#1011 from maintbranch
+ Branch: win32/perl
+ ! perl.c pod/perldiag.pod pod/perlfunc.pod pp_ctl.c
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 1026] By: nick on 1998/05/23 08:45:04
+ Log: Ids of msgs and sems can be zero, so change || die to a defined() test
+ Branch: win32/perl
+ ! t/op/ipcmsg.t t/op/ipcsem.t
+____________________________________________________________________________
+[ 1025] By: nick on 1998/05/23 08:36:36
+ Log: Resolve win32 into ansiperl
+ Branch: ansiperl
+ +> t/op/die.t
+ !> (integrate 42 files)
+____________________________________________________________________________
+[ 1024] By: gsar on 1998/05/21 21:11:12
+ Log: more mingw32 tweaks
+ Branch: win32/perl
+ ! ext/POSIX/POSIX.xs t/pragma/locale.t
+____________________________________________________________________________
+[ 1023] By: gsar on 1998/05/21 19:15:02
+ Log: fix problematic change#965 from maintbranch
+ Message-Id: <199805162145.RAA02552@monk.mps.ohio-state.edu>
+ Date: Sat, 16 May 1998 17:45:22 EDT
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: Re: Not OK (after all) : perl 5.00404 +MAINT_TRIAL_3 on sun4-solaris 2.5
+ Branch: win32/perl
+ ! gv.c op.c t/comp/proto.t
+____________________________________________________________________________
+[ 1022] By: gsar on 1998/05/21 01:37:04
+ Log: fix POSIX for mingw32
+ Branch: win32/perl
+ ! ext/POSIX/POSIX.xs win32/config.gc win32/config_H.gc
+____________________________________________________________________________
+[ 1021] By: gsar on 1998/05/20 15:02:21
+ Log: remove strupr() from perl.c
+ Branch: win32/perl
+ ! perl.c
+____________________________________________________________________________
+[ 1020] By: TimBunce on 1998/05/19 22:41:40
+ Log: Title: "fix up descrepancy in h2ph test"
+ From: Tim Bunce
+ Files: t/lib/h2ph.pht
+ Branch: maint-5.004/perl
+ ! t/lib/h2ph.pht
+____________________________________________________________________________
+[ 1019] By: TimBunce on 1998/05/19 22:17:15
+ Log: Title: "add a test to check return value from successful s/// (there was none!)"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805161759.NAA12995@aatma.engin.umich.edu>
+ Files: t/op/subst.t
+
+ Title: "fix up descrepancy in h2ph test"
+ From: Tim Bunce
+ Files: t/lib/h2ph.t
+ Branch: maint-5.004/perl
+ ! t/lib/h2ph.t t/op/subst.t
+____________________________________________________________________________
+[ 1018] By: TimBunce on 1998/05/19 21:56:32
+ Log: Title: "fix mem leak and core dump from change 1016"
+ From: Tim Bunce
+ Files: pp_sys.c
+ Branch: maint-5.004/perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 1017] By: TimBunce on 1998/05/19 21:26:03
+ Log: Title: "qsort, Win32 "POSIX" plus other devel changes for patch-compatibility"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Files: MANIFEST cflags.SH pod/perlembed.pod pod/perlfunc.pod
+ pod/perlguts.pod pod/perlref.pod pod/perlrun.pod
+ pod/perlxstut.pod av.h embed.h hv.h op.h perl.h pp.h
+ proto.h Todo av.c cygwin32/perlgcc cygwin32/perlld deb.c
+ doio.c doop.c ext/ODBM_File/ODBM_File.xs
+ ext/POSIX/Makefile.PL ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs
+ gv.c hv.c interp.sym lib/AutoSplit.pm lib/Cwd.pm
+ lib/FindBin.pm lib/strict.pm lib/ExtUtils/Command.pm
+ lib/ExtUtils/Liblist.pm lib/ExtUtils/MakeMaker.pm
+ lib/ExtUtils/Manifest.pm lib/File/Basename.pm
+ lib/File/Find.pm lib/File/Path.pm lib/Getopt/Long.pm
+ lib/Getopt/Std.pm lib/Net/Ping.pm lib/Pod/Html.pm
+ lib/Pod/Text.pm lib/Term/Cap.pm lib/Test/Harness.pm mg.c
+ op.c perl.c pod/pod2latex.PL pod/pod2man.PL pp.c pp_ctl.c
+ pp_hot.c pp_sys.c scope.c sv.c t/lib/posix.t
+ t/pragma/locale.t utils/perldoc.PL win32/win32.h toke.c
+ universal.c util.c win32/Makefile win32/config_H.bc
+ win32/config_H.vc win32/dl_win32.xs win32/makedef.pl
+ win32/makefile.mk win32/perlglob.c win32/runperl.c
+ win32/win32.c win32/win32sck.c x2p/s2p.PL
+ Branch: maint-5.004/perl
+ ! MANIFEST Todo av.c av.h cflags.SH cygwin32/perlgcc
+ ! cygwin32/perlld deb.c doio.c doop.c embed.h
+ ! ext/ODBM_File/ODBM_File.xs ext/POSIX/Makefile.PL
+ ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs gv.c hv.c hv.h
+ ! interp.sym lib/AutoSplit.pm lib/Cwd.pm lib/ExtUtils/Command.pm
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/ExtUtils/Manifest.pm lib/File/Basename.pm lib/File/Find.pm
+ ! lib/File/Path.pm lib/FindBin.pm lib/Getopt/Long.pm
+ ! lib/Getopt/Std.pm lib/Net/Ping.pm lib/Pod/Html.pm
+ ! lib/Pod/Text.pm lib/Term/Cap.pm lib/Test/Harness.pm
+ ! lib/strict.pm mg.c op.c op.h perl.c perl.h pod/perlembed.pod
+ ! pod/perlfunc.pod pod/perlguts.pod pod/perlref.pod
+ ! pod/perlrun.pod pod/perlxstut.pod pod/pod2latex.PL
+ ! pod/pod2man.PL pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h
+ ! scope.c sv.c t/lib/posix.t t/pragma/locale.t toke.c
+ ! universal.c util.c utils/perldoc.PL win32/Makefile
+ ! win32/config_H.bc win32/config_H.vc win32/dl_win32.xs
+ ! win32/makedef.pl win32/makefile.mk win32/perlglob.c
+ ! win32/runperl.c win32/win32.c win32/win32.h win32/win32sck.c
+ ! x2p/s2p.PL
+____________________________________________________________________________
+[ 1016] By: TimBunce on 1998/05/19 20:37:42
+ Log: Title: "eval { die $obj }; die; calls $obj->PROPAGATE"
+ From: Graham Barr <gbarr@ti.com>
+ Msg-ID: <3561D147.7F3E0C88@ti.com>
+ Files: pp_sys.c t/op/die.t
+ Branch: maint-5.004/perl
+ ! pp_sys.c t/op/die.t
+____________________________________________________________________________
+[ 1015] By: TimBunce on 1998/05/19 20:07:01
+ Log: Title: "loosen const sub re-defined warnings"
+ From: Doug MacEachern <dougm@pobox.com>
+ Msg-ID: <355F713B.6A4C0F04@pobox.com>
+ Files: proto.h global.sym op.c pp.c sv.c
+ Branch: maint-5.004/perl
+ ! global.sym op.c pp.c proto.h sv.c
+____________________________________________________________________________
+[ 1014] By: TimBunce on 1998/05/19 19:48:18
+ Log: Title: "s/FORMLINE/FORMAT/ in sv.c"
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Msg-ID: <l03130303b1837a243670@[194.222.64.89]>
+ Files: sv.c
+
+ Title: "Further h2ph patches (including a test suite)"
+ From: Billy <wdconsta@cs.adelaide.edu.au>
+ Msg-ID: <Pine.SV4.3.93.980516234652.2100A-100000@xenon.teaching.cs.adelaide.edu.au>
+ Files: MANIFEST t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t utils/h2ph.PL
+ Branch: maint-5.004/perl
+ + t/lib/h2ph.h t/lib/h2ph.pht t/lib/h2ph.t
+ ! MANIFEST sv.c utils/h2ph.PL
+____________________________________________________________________________
+[ 1013] By: TimBunce on 1998/05/19 19:14:13
+ Log: Title: "Remove change 673 (Allow empty BLOCK in code)"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>, Ilya Zakharevich
+ <ilya@math.ohio-state.edu>
+ Msg-ID: <199805151857.OAA29586@monk.mps.ohio-state.edu>,
+ <199805151931.PAA23086@aatma.engin.umich.edu>,
+ <19980129002112Z13378-6931+226@scapa.cs.ualberta.ca>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 1012] By: TimBunce on 1998/05/19 19:03:32
+ Log: Title: "Further SysV sem/msg fixes and removal of non-portable tests"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>, Jarkko Hietaniemi
+ <jhi@iki.fi>
+ Msg-ID: <199805182028.XAA15717@alpha.hut.fi>,
+ <Pine.SUN.3.96.980518133606.17488A-100000@newton.phys>
+ Files: MANIFEST Configure config_h.SH perl.h doio.c t/op/ipcmsg.t
+ t/op/ipcsem.t
+ Branch: maint-5.004/perl
+ ! Configure MANIFEST config_h.SH doio.c perl.h t/op/ipcmsg.t
+ ! t/op/ipcsem.t
+____________________________________________________________________________
+[ 1011] By: TimBunce on 1998/05/19 17:55:38
+ Log: Title: "interp.sym is missing C<e_script> after -e fix"
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Msg-ID: <355d460d.7621669@smtp1.ibm.net>
+ Files: embed.h interp.sym
+
+ Title: "Undo changed error message which breaks Tk"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805161557.LAA08106@aatma.engin.umich.edu>
+ Files: pp_ctl.c
+
+ Title: "Minor fixups to new -e script code"
+ From: Tim Bunce
+ Files: perl.c
+
+ Title: "Remove old diags not relevant after -e fix"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>, Gurusamy Sarathy
+ <gsar@engin.umich.edu>, Tim.Bunce@ig.co.uk (Tim Bunce)
+ Msg-ID: <199805172143.RAA07896@aatma.engin.umich.edu>,
+ <199805181335.OAA07008@toad.ig.co.uk>,
+ <Pine.SUN.3.96.980517104819.16183B-100000@newton.phys>
+ Files: pod/perldiag.pod
+
+ Title: "more examples for vec()"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980518093728.28732P-100000@user2.teleport.com>
+ Files: pod/perlfunc.pod
+
+ Title: ""make ok" (perlbug -ok) should not be interactive"
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>, Jarkko Hietaniemi
+ <jhi@iki.fi>
+ Msg-ID: <199805160942.MAA20171@alpha.hut.fi>,
+ <l03130300b1834f9732a0@[194.222.64.89]>
+ Files: utils/perlbug.PL
+ Branch: maint-5.004/perl
+ ! embed.h interp.sym perl.c pod/perldiag.pod pod/perlfunc.pod
+ ! pp_ctl.c utils/perlbug.PL
+____________________________________________________________________________
+[ 1010] By: gsar on 1998/05/18 09:40:58
+ Log: integrate mainline changes (untested)
+ Branch: asperl
+ +> Porting/Contract Porting/patching.pod README.beos beos/nm.c
+ +> ext/DynaLoader/DynaLoader.pm.PL ext/POSIX/hints/bsdos.pl
+ +> ext/POSIX/hints/freebsd.pl ext/POSIX/hints/netbsd.pl
+ +> ext/POSIX/hints/openbsd.pl hints/beos.sh hints/openbsd.sh
+ +> pod/perldelta4.pod t/op/defins.t t/op/die.t t/op/die_exit.t
+ +> t/op/ipcmsg.t t/op/ipcsem.t t/op/pos.t utils/perlcc.PL
+ - ext/DynaLoader/DynaLoader.pm
+ ! win32/win32.c
+ !> (integrate 234 files)
+____________________________________________________________________________
+[ 1009] By: gsar on 1998/05/18 07:51:19
+ Log: more whitespace tweaks from maintbranch
+ Branch: win32/perl
+ ! av.c perl.c pp_ctl.c pp_sys.c toke.c
+____________________________________________________________________________
+[ 1008] By: gsar on 1998/05/17 22:37:20
+ Log: sundry whitespace cleanups from maintbranch
+ Branch: win32/perl
+ ! Porting/Contract XSUB.h av.c gv.c mg.c perl.c
+____________________________________________________________________________
+[ 1007] By: gsar on 1998/05/16 21:59:46
+ Log: integrate mainline
+ Branch: win32/perl
+ !> INSTALL doio.c lib/strict.pm perl.c perl.h pod/perldebug.pod
+ !> t/op/ipcmsg.t t/op/ipcsem.t
+____________________________________________________________________________
+[ 1006] By: gsar on 1998/05/16 21:54:23
+ Log: merge changes#996,998,999 from maintbranch
+ Branch: win32/perl
+ ! Changes5.004 Porting/makerel t/base/lex.t toke.c
+____________________________________________________________________________
+[ 1005] By: gsar on 1998/05/16 21:49:47
+ Log: merge change#995 from maintbranch, tweak interp.sym and
+ run embed.pl
+ Branch: win32/perl
+ ! embedvar.h interp.sym intrpvar.h perl.c
+____________________________________________________________________________
+[ 1004] By: gsar on 1998/05/16 21:27:18
+ Log: merge changes#989,990,992 from maintbranch
+ Branch: win32/perl
+ + t/op/die.t
+ ! MANIFEST installperl pod/perldiag.pod pp_ctl.c t/op/ipcmsg.t
+____________________________________________________________________________
+[ 1003] By: gsar on 1998/05/16 21:16:47
+ Log: sync config*.gc with others, and verify that nothing from
+ change#986 needs to be merged
+ Branch: win32/perl
+ ! win32/config.gc win32/config_H.gc
+____________________________________________________________________________
+[ 1002] By: gsar on 1998/05/16 21:04:04
+ Log: merge change#985 from maintbranch
+ Branch: win32/perl
+ ! lib/AutoSplit.pm lib/ExtUtils/Manifest.pm pp_ctl.c pp_sys.c
+ ! util.c
+____________________________________________________________________________
+[ 1001] By: gsar on 1998/05/16 17:53:16
+ Log: add a test to check return value from successful s/// (there was none!)
+ Branch: win32/perl
+ ! t/op/subst.t
+____________________________________________________________________________
+[ 1000] By: gsar on 1998/05/16 17:42:34
+ Log: fix misplaced SPAGAIN that caused successful s/// to fail to
+ return a value on the stack
+ Branch: win32/perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 999] By: TimBunce on 1998/05/15 23:04:30
+ Log: Title: "Update Porting/makerel script for perforce dir structure"
+ From: Tim Bunce
+ Files: Porting/makerel
+ Branch: maint-5.004/perl
+ ! Porting/makerel
+____________________________________________________________________________
+[ 998] By: TimBunce on 1998/05/15 22:49:55
+ Log: Title: "Updated Changes file for trial 3"
+ From: Tim Bunce
+ Files: Changes
+ Branch: maint-5.004/perl
+ ! Changes
+____________________________________________________________________________
+[ 997] By: gsar on 1998/05/15 22:21:41
+ Log: merge changes#982,984 from maintbranch
+ Branch: win32/perl
+ ! gv.c lib/English.pm perl.c pod/perlfunc.pod t/io/pipe.t
+ ! t/op/exec.t t/op/ipcsem.t util.c utils/h2ph.PL utils/h2xs.PL
+____________________________________________________________________________
+[ 996] By: TimBunce on 1998/05/15 22:19:32
+ Log: Title: "Negative array subscript unrecognized in regex"
+ From: Mark-Jason Dominus <mjd@plover.com>,
+ h.sanden@elsevier.nl (Hugo van der Sanden)
+ Msg-ID: <19980425040819.13828.qmail@plover.com>,
+ <199805151514.RAA04121@dorlas.elsevier.nl>
+ Files: t/base/lex.t toke.c
+
+ Title: "Remove e_fp from toke.c after change 955"
+ From: Tim Bunce
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! t/base/lex.t toke.c
+____________________________________________________________________________
+[ 995] By: TimBunce on 1998/05/15 22:08:32
+ Log: Title: "Fix -e security hole (no longer uses temp file)"
+ From: Tim Bunce
+ Files: embed.h perl.h perl.c
+ Branch: maint-5.004/perl
+ ! embed.h perl.c perl.h
+____________________________________________________________________________
+[ 994] By: gsar on 1998/05/15 22:08:17
+ Log: merge change#981 from maintbranch, add XXX comment about
+ supporting %! for usethreads case
+ Branch: win32/perl
+ ! gv.c op.c
+____________________________________________________________________________
+[ 992] By: TimBunce on 1998/05/15 22:01:32
+ Log: Title: "install non-backwards compatible .pm files into archlib"
+ From: Tim Bunce
+ Files: installperl
+
+ Title: "revert "Can't locate" message to original for maintenance"
+ From: Tim Bunce
+ Msg-ID: <199804240047.SAA24155@den-mdev1.co.csgsystems.com>
+ Files: pod/perldiag.pod pp_ctl.c
+ Branch: maint-5.004/perl
+ ! installperl pod/perldiag.pod pp_ctl.c
+____________________________________________________________________________
+[ 991] By: gsar on 1998/05/15 21:35:00
+ Log: reverse integrate ansiperl (all except the
+ C<attrs qw(package locked)> stuff, and the duplicate hunks)
+ i.e. prototype fixes, perldoc.PL enhancements, and s/comment/comment_t/g
+ Branch: win32/perl
+ !> bytecode.h byterun.c cv.h ext/attrs/attrs.pm
+ !> ext/attrs/attrs.xs pod/perlop.pod pp_hot.c sv.c toke.c
+ !> utils/perldoc.PL
+____________________________________________________________________________
+[ 990] By: TimBunce on 1998/05/15 16:54:18
+ Log: Title: "Add tests for die $ref"
+ From: Graham Barr <gbarr@ti.com>
+ Msg-ID: <355C6297.121B576B@ti.com>
+ Files: MANIFEST t/op/die.t
+ Branch: maint-5.004/perl
+ + t/op/die.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 989] By: TimBunce on 1998/05/15 16:38:19
+ Log: Title: "Fix t/op/ipcmsg.t for Digital UNIX"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199805151337.QAA01174@alpha.hut.fi>
+ Files: t/op/ipcmsg.t
+ Branch: maint-5.004/perl
+ ! t/op/ipcmsg.t
+____________________________________________________________________________
+[ 988] By: mbeattie on 1998/05/15 16:28:08
+ Log: Patch from Sarathy to fix up win32 integration. Patch from Jarkko
+ (manually applied and tweaked) to fix up SysV IPC semaphores for
+ Solaris and Linux (pre-glibc and glibc). Fix up t/op/ipcmsg.t and
+ t/op/ipcsem.t for platforms which wanted to skip test. Completely
+ disable ipcsem.t since it doesn't seem to work properly even when
+ not skipped. This is _65.
+ Branch: perl
+ ! INSTALL doio.c lib/strict.pm perl.c perl.h pod/perldebug.pod
+ ! t/op/ipcmsg.t t/op/ipcsem.t
+____________________________________________________________________________
+[ 987] By: nick on 1998/05/15 16:03:35
+ Log: Integrate win32
+ Branch: ansiperl
+ +> Porting/Contract Porting/patching.pod README.beos beos/nm.c
+ +> ext/DynaLoader/DynaLoader.pm.PL ext/POSIX/hints/bsdos.pl
+ +> ext/POSIX/hints/freebsd.pl ext/POSIX/hints/netbsd.pl
+ +> ext/POSIX/hints/openbsd.pl hints/beos.sh hints/openbsd.sh
+ +> pod/perldelta4.pod t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
+ +> t/op/pos.t utils/perlcc.PL
+ - ext/DynaLoader/DynaLoader.pm
+ !> (integrate 208 files)
+____________________________________________________________________________
+[ 986] By: TimBunce on 1998/05/15 15:28:45
+ Log: Title: "Patches for BeOS port of Perl, courtesy of Tom Spindler"
+ From: Jarkko Hietaniemi <jhi@iki.fi>, Tom Spindler
+ Msg-ID: <199805042312.CAA09025@alpha.hut.fi>
+ Files: MANIFEST Configure config_h.SH hints/beos.sh pod/perlfunc.pod
+ Porting/Glossary README.beos beos/nm.c lib/Term/ReadLine.pm
+ plan9/config.plan9 pp_sys.c t/io/pipe.t vms/config.vms
+ win32/config.bc win32/config.vc win32/config_H.bc
+ win32/config_H.vc
+ Branch: maint-5.004/perl
+ + README.beos beos/nm.c hints/beos.sh
+ ! Configure MANIFEST Porting/Glossary config_h.SH
+ ! lib/Term/ReadLine.pm plan9/config.plan9 pod/perlfunc.pod
+ ! pp_sys.c t/io/pipe.t vms/config.vms win32/config.bc
+ ! win32/config.vc win32/config_H.bc win32/config_H.vc
+____________________________________________________________________________
+[ 985] By: TimBunce on 1998/05/15 15:02:43
+ Log: Title: "allow die $ref"
+ From: Graham Barr <gbarr@ti.com>, Tim.Bunce@ig.co.uk (Tim Bunce)
+ Msg-ID: <199805151351.OAA01985@toad.ig.co.uk>, <355C3E67.AF25B9F7@ti.com>
+ Files: pp_ctl.c pp_sys.c util.c
+
+ Title: "ExtUtils::Manifest could truncate files during "make dist""
+ From: "James E Jurach Jr." <muaddib@arrakis.int.ein.cz>,
+ koenig@kulturbox.de (Andreas J. Koenig)
+ Msg-ID: <199805111048.MAA02573@arrakis.int.ein.cz>,
+ <sfc90o8bgie.fsf@dubravka.in-berlin.de>
+ Files: lib/ExtUtils/Manifest.pm
+
+ Title: "Autosplit doesn't like upper case letters in sub names on VMS"
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Msg-ID: <3.0.5.32.19980330152332.009cb130@osshe.edu>
+ Files: lib/AutoSplit.pm
+
+ Title: "AutoSplit/AutoLoaded subs: give useful line numbers in warnings etc"
+ From: "Jesse N. Glick" <jglick@sig.bsh.com>, koenig@anna.mind.de (Andreas
+ J. Koenig), larry@wall.org (Larry Wall)
+ Msg-ID: <199709292015.NAA09627@wall.org>, <342FCDDF.23534195@sig.bsh.com>,
+ <sfc202c9jsb.fsf@anna.in-berlin.de>,
+ <sfc3efg5rhg.fsf@dubravka.in-berlin.de>
+ Files: lib/AutoSplit.pm
+ Branch: maint-5.004/perl
+ ! lib/AutoSplit.pm lib/ExtUtils/Manifest.pm pp_ctl.c pp_sys.c
+ ! util.c
+____________________________________________________________________________
+[ 984] By: TimBunce on 1998/05/15 14:18:52
+ Log: ------ CORE LANGUAGE ------
+
+ Title: "Fix close pipe returning status from wrong child"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, kstar@chapin.edu@ig.co.uk ()
+ Msg-ID: <199805142313.TAA02684@chapin.edu>,
+ <E0yZ8ah-0005d8-00@taurus.cus.cam.ac.uk>
+ Files: t/io/pipe.t util.c
+
+ Title: "Avoid English.pm triggering load of Errno.pm"
+ From: Tim Bunce
+ Files: gv.c lib/English.pm
+
+ ------ DOCUMENTATION ------
+
+ Title: "Document child exit cause a parent sleep to end early"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0yZwMK-0000D9-00@taurus.cus.cam.ac.uk>
+ Files: pod/perlfunc.pod
+
+ ------ EXTENSIONS ------
+
+ Title: "BSD Platforms need STRUCT_TM_HASZONE for POSIX"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980512095524.8158C-100000@newton.phys>
+ Files: MANIFEST ext/POSIX/hints/bsdos.pl ext/POSIX/hints/freebsd.pl
+ ext/POSIX/hints/netbsd.pl ext/POSIX/hints/openbsd.pl
+
+ Title: "MM_VMS.pm fixes for building external library"
+ From: Dan Sugalski <sugalskd@ous.edu>
+ Msg-ID: <3.0.5.32.19980511160542.009dd480@ous.edu>
+ Files: lib/ExtUtils/MM_VMS.pm
+
+ Title: "Appease picky DEC compiler in POSIX.xs"
+ From: Dan Sugalski <sugalskd@ous.edu>
+ Msg-ID: <3.0.5.32.19980511161434.009f8bb0@ous.edu>
+ Files: ext/POSIX/POSIX.xs
+
+ ------ TESTS ------
+
+ Title: "Fix constant detection in t/op/ipcsem.t for Digit UNIX"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199805121212.PAA15351@alpha.hut.fi>
+ Files: t/op/ipcsem.t
+
+ Title: "Fix doc bug for system() return value"
+ From: Daniel Grisinger <dgris@perrin.dimensional.com>
+ Msg-ID: <Pine.LNX.3.96.980514165608.4062A-100000@perrin.dimensional.com>
+ Files: pod/perlfunc.pod t/op/exec.t
+
+ ------ UTILITIES ------
+
+ Title: "Avoid possible constant autoload loop"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Graham Barr <gbarr@ti.com>, Ilya
+ Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199805141910.PAA26994@monk.mps.ohio-state.edu>,
+ <355B475A.C5AD4B90@ti.com>,
+ <E0ya11X-0000hm-00@taurus.cus.cam.ac.uk>
+ Files: utils/h2xs.PL
+
+ Title: "Further improvements to h2ph.PL"
+ From: kstar@chapin.edu
+ Msg-ID: <199805130241.WAA25459@chapin.edu>
+ Files: utils/h2ph.PL
+ Branch: maint-5.004/perl
+ + ext/POSIX/hints/bsdos.pl ext/POSIX/hints/freebsd.pl
+ + ext/POSIX/hints/netbsd.pl ext/POSIX/hints/openbsd.pl
+ ! MANIFEST ext/POSIX/POSIX.xs gv.c lib/English.pm
+ ! lib/ExtUtils/MM_VMS.pm pod/perlfunc.pod t/io/pipe.t
+ ! t/op/exec.t t/op/ipcsem.t util.c utils/h2ph.PL utils/h2xs.PL
+
+----------------
+Version 5.004_64
+----------------
+
+____________________________________________________________________________
+[ 983] By: mbeattie on 1998/05/15 14:04:17
+ Log: Integrate win32 branch into mainline.
+ Branch: perl
+ +> Porting/patching.pod t/op/defins.t
+ !> (integrate 107 files)
+____________________________________________________________________________
+[ 982] By: TimBunce on 1998/05/15 12:33:26
+ Log: Title: "comment init_postdump_symbols issues"
+ From: Tim Bunce
+ Files: perl.c
+
+ Title: "Improve sort docs re SUBNAME"
+ From: circle@azstarnet.com
+ Msg-ID: <199804281828.LAA22737@andromeda.azstarnet.com>
+ Files: pod/perlfunc.pod
+ Branch: maint-5.004/perl
+ ! perl.c pod/perlfunc.pod
+____________________________________________________________________________
+[ 981] By: TimBunce on 1998/05/15 11:47:28
+ Log: Title: "Add hook to tie %! to external Errno.pm module (not included)"
+ From: Graham Barr <gbarr@ti.com>
+ Msg-ID: <355080CD.1111BC81@ti.com>
+ Files: gv.c
+ Branch: maint-5.004/perl
+ ! gv.c
+____________________________________________________________________________
+[ 980] By: gsar on 1998/05/15 06:16:13
+ Log: add doc for C<+{}> vs. C<{;}> disambiguation
+ Branch: win32/perl
+ ! pod/perlref.pod
+____________________________________________________________________________
+[ 979] By: gsar on 1998/05/15 04:59:47
+ Log: tweaks to win32 makefiles. This version builds and passes all
+ tests on Solaris/gcc, win32/[bv]c. Looks all set to go.
+ Branch: win32/perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 978] By: gsar on 1998/05/15 02:41:58
+ Log: merge changes#922,944,949,965,970 from maintbranch
+ Branch: win32/perl
+ + Porting/patching.pod t/op/defins.t
+ ! MANIFEST Porting/makerel ext/POSIX/POSIX.pod gv.c gv.h hv.c
+ ! lib/File/Find.pm op.c pod/Makefile pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perlop.pod pod/pod2man.PL
+ ! t/lib/filefind.t t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 977] By: gsar on 1998/05/15 02:15:25
+ Log: merge changes#906,907,909,910 from maintbranch
+ Branch: win32/perl
+ ! MANIFEST doio.c doop.c embed.h embedvar.h global.sym
+ ! keywords.h lib/Carp.pm lib/File/Basename.pm mg.c opcode.h
+ ! perl.c perl.h pod/perldiag.pod pp.c pp_hot.c proto.h sv.c
+ ! util.c
+____________________________________________________________________________
+[ 976] By: gsar on 1998/05/15 01:34:53
+ Log: merge change#905 from maintbranch, minor fixes to get
+ clean build+test on Solaris
+ Branch: win32/perl
+ ! doop.c dump.c embed.h embedvar.h lib/strict.pm mg.c op.h
+ ! opcode.h pod/perlop.pod pod/perlre.pod pp_ctl.c pp_hot.c
+ ! regcomp.c sv.c t/op/taint.t toke.c
+____________________________________________________________________________
+[ 975] By: gsar on 1998/05/14 23:34:26
+ Log: merge change#904 from maintbranch
+ Branch: win32/perl
+ ! doop.c ext/DynaLoader/dl_aix.xs ext/IO/lib/IO/Socket.pm
+ ! ext/NDBM_File/NDBM_File.pm lib/strict.pm lib/subs.pm
+ ! lib/vars.pm op.c perl.c pod/perldiag.pod pod/perlembed.pod
+ ! pod/perlfunc.pod pod/perlsec.pod pp_ctl.c sv.c utils/h2ph.PL
+ ! vms/descrip.mms
+____________________________________________________________________________
+[ 974] By: gsar on 1998/05/14 23:11:05
+ Log: merge change#897 from maintbranch
+ Branch: win32/perl
+ ! Porting/Contract Todo doio.c emacs/ptags embed.h ext/IO/IO.pm
+ ! ext/Opcode/Opcode.pm lib/Carp.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/Pod/Html.pm lib/Term/ReadLine.pm lib/chat2.pl opcode.h
+ ! opcode.pl perl.c pod/perlapio.pod pod/perlcall.pod
+ ! pod/perldebug.pod pod/perldelta.pod pod/perldelta4.pod
+ ! pod/perldiag.pod pod/perlembed.pod pod/perlfaq2.pod
+ ! pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ ! pod/perlfaq7.pod pod/perlfaq8.pod pod/perlform.pod
+ ! pod/perlfunc.pod pod/perlguts.pod pod/perlhist.pod
+ ! pod/perlipc.pod pod/perllocale.pod pod/perlmodlib.pod
+ ! pod/perlop.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ ! pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
+ ! pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod pod/pod2man.PL
+ ! pod/roffitall pp.c pp_sys.c t/TEST t/op/gv.t t/op/hashwarn.t
+ ! t/op/substr.t vms/vms.c win32/config.bc win32/config.vc
+ ! win32/config_H.bc win32/config_H.vc win32/win32.c
+ ! x2p/find2perl.PL
+____________________________________________________________________________
+[ 973] By: gsar on 1998/05/14 22:24:26
+ Log: integrate mainline
+ Branch: win32/perl
+ + Porting/Contract
+ +> README.beos beos/nm.c ext/POSIX/hints/bsdos.pl
+ +> ext/POSIX/hints/freebsd.pl ext/POSIX/hints/netbsd.pl
+ +> ext/POSIX/hints/openbsd.pl hints/beos.sh pod/perldelta4.pod
+ +> utils/perlcc.PL
+ ! MANIFEST Todo doio.c emacs/ptags embed.h ext/IO/IO.pm
+ ! ext/Opcode/Opcode.pm ext/Socket/Socket.xs hints/irix_5.sh
+ ! hints/netbsd.sh hv.c lib/Benchmark.pm lib/Carp.pm
+ ! lib/ExtUtils/Install.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/Pod/Html.pm lib/Term/ReadLine.pm lib/chat2.pl opcode.h
+ ! opcode.pl perl.c perl.h pod/perlapio.pod pod/perlcall.pod
+ ! pod/perldebug.pod pod/perldelta.pod pod/perldiag.pod
+ ! pod/perlembed.pod pod/perlfaq2.pod pod/perlfaq3.pod
+ ! pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfaq7.pod
+ ! pod/perlfaq8.pod pod/perlform.pod pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perlhist.pod pod/perlipc.pod
+ ! pod/perllocale.pod pod/perlmodlib.pod pod/perlop.pod
+ ! pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ ! pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
+ ! pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod pod/pod2man.PL
+ ! pod/roffitall pp.c pp_hot.c pp_sys.c sv.c t/TEST t/op/gv.t
+ ! t/op/hashwarn.t t/op/substr.t vms/vms.c win32/config.bc
+ ! win32/config.vc win32/config_H.bc win32/config_H.vc
+ ! win32/win32.c x2p/find2perl.PL
+ !> (integrate 59 files)
+____________________________________________________________________________
+[ 972] By: nick on 1998/05/14 18:09:01
+ Log: Changes to allow compiler with gcc-2.8.1 in C++ mode,
+ Remove K&R style functions, avoid struct/typedef clash.
+ Branch: ansiperl
+ ! bytecode.h byterun.c sv.c toke.c
+____________________________________________________________________________
+[ 971] By: TimBunce on 1998/05/14 16:52:19
+ Log:
+ Title: "fix C<print "foo ${\()}"> (pp_refgen fumbles when G_SCALAR, no args)"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805070402.AAA02858@aatma.engin.umich.edu>
+ Files: pp.c
+ Branch: maint-5.004/perl
+ ! pp.c
+____________________________________________________________________________
+[ 970] By: TimBunce on 1998/05/14 16:18:06
+ Log:
+ Title: "perlbug reformatted"
+ From: Dominic Dunlop <domo@vo.lu>, Hugo van der Sanden
+ <hv@crypt0.demon.co.uk>
+ Msg-ID: <199805110954.LAA20367@dorlas.elsevier.nl>,
+ <l03130300b17cebcb6d33@[194.222.64.89]>,
+ <v03110702b17ccbab6824@[195.95.102.67]>
+ Files: utils/perlbug.PL
+ Branch: maint-5.004/perl
+ ! utils/perlbug.PL
+____________________________________________________________________________
+[ 969] By: mbeattie on 1998/05/14 16:15:09
+ Log: Integrate win32 branch into mainline
+ Branch: perl
+ +> ext/DynaLoader/DynaLoader.pm.PL hints/openbsd.sh
+ +> t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t t/op/pos.t
+ - ext/DynaLoader/DynaLoader.pm
+ !> (integrate 118 files)
+____________________________________________________________________________
+[ 968] By: mbeattie on 1998/05/14 16:05:57
+ Log: Bump patchlevel to 65
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 967] By: mbeattie on 1998/05/14 16:05:19
+ Log: Another fixup of MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 966] By: mbeattie on 1998/05/14 16:02:20
+ Log: Add missing files to MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 965] By: TimBunce on 1998/05/14 16:00:11
+ Log:
+ Title: "Sub declaration cost reduced from ~500 to ~100 bytes"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199805050607.CAA02050@monk.mps.ohio-state.edu>
+ Files: gv.h gv.c op.c
+ Branch: maint-5.004/perl
+ ! gv.c gv.h op.c
+____________________________________________________________________________
+[ 964] By: mbeattie on 1998/05/14 15:58:01
+ Log: Subject: [PATCH] Using Getopts::* with strict vars
+ Date: Wed, 29 Apr 1998 22:48:16 -0700 (PDT)
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Branch: perl
+ ! lib/Getopt/Long.pm lib/Getopt/Std.pm lib/strict.pm
+____________________________________________________________________________
+[ 963] By: mbeattie on 1998/05/14 15:56:53
+ Log: Subject: [ PATCH 5.004_64 ] Integrated regression tests for compiler
+ Date: Wed, 29 Apr 1998 21:02:36 -0600 (MDT)
+ From: epeschko@den-mdev1 (Ed Peschko)
+ Branch: perl
+ + utils/perlcc.PL
+ ! MANIFEST Makefile.SH installperl lib/Test/Harness.pm
+ ! pod/Makefile t/TEST t/harness utils/Makefile x2p/Makefile.SH
+____________________________________________________________________________
+[ 962] By: mbeattie on 1998/05/14 15:45:28
+ Log: From: Dan Sugalski <sugalskd@ous.edu>
+ Subject: [PATCH 5.004_64] Final (I hope) doc patch for Thread.pm
+ Date: Wed, 08 Apr 1998 17:08:48 -0700
+ Subject: [PATCH 5.004_64] Revised second Thread.PM doc patch
+ Date: Fri, 08 May 1998 10:49:16 -0700
+ Branch: perl
+ ! ext/Thread/Thread.pm
+____________________________________________________________________________
+[ 961] By: mbeattie on 1998/05/14 15:43:39
+ Log: Subject: Consolidated patch to 5.004_64
+ Date: Wed, 08 Apr 1998 19:44:34 -0400 (EDT)
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Branch: perl
+ ! ext/B/byteperl.c lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MM_VMS.pm lib/chat2.pl perl.c pod/perlsub.pod
+ ! vms/config.vms vms/descrip.mms vms/genconfig.pl
+ ! vms/perlvms.pod
+____________________________________________________________________________
+[ 960] By: mbeattie on 1998/05/14 15:41:41
+ Log: Subject: Re: ANNOUNCE: Perl 5.005b1t3 (a.k.a. perl5.004_64) is available
+ Date: 07 Apr 1998 18:31:21 +0200
+ From: JVromans@Squirrel.nl (Johan Vromans)
+ Branch: perl
+ ! lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 959] By: mbeattie on 1998/05/14 15:39:29
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Subject: Re: [PATCH] 5.004_04 or 5.004_64: Benchmark.pm: add run-for-some-time
+ Date: Wed, 8 Apr 1998 09:47:45 +0300 (EET DST)
+ Subject: [PATCH] perl 5.004_64+Config_04
+ Date: Thu, 14 May 1998 12:14:07 +0300 (EET DST)
+ Branch: perl
+ ! lib/Benchmark.pm pod/perlfunc.pod
+____________________________________________________________________________
+[ 958] By: mbeattie on 1998/05/14 15:36:30
+ Log: From: kstar@chapin.edu
+ Subject: [PATCH] hints for Irix 6
+ Date: Mon, 6 Apr 1998 15:14:14 -0400 (EDT)
+ Subject: [PATCH 5.004_64] Threads - an easy way for dual installation
+ Date: Wed, 29 Apr 1998 15:39:46 -0400 (EDT)
+ Branch: perl
+ ! INSTALL hints/irix_6.sh installperl
+____________________________________________________________________________
+[ 957] By: mbeattie on 1998/05/14 15:33:48
+ Log: Subject: [PATCH] Install extensions with bootstrap (again) in $archlib
+ Date: Mon, 06 Apr 1998 21:09:24 +0200
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Branch: perl
+ ! lib/ExtUtils/Install.pm
+____________________________________________________________________________
+[ 956] By: mbeattie on 1998/05/14 15:32:39
+ Log: Subject: [PATCH] Config: Irix 5 hints
+ Date: Mon, 6 Apr 1998 13:12:47 -0400 (EDT)
+ From: kstar@O2.chapin.edu
+ Branch: perl
+ ! hints/irix_5.sh
+____________________________________________________________________________
+[ 955] By: mbeattie on 1998/05/14 15:31:12
+ Log: Subject: PATCH: h2ph produces incorrect code
+ Date: Mon, 6 Apr 1998 23:52:13 +0930 (CST)
+ From: Billy <wdconsta@cs.adelaide.edu.au>
+ Branch: perl
+ ! utils/h2ph.PL
+____________________________________________________________________________
+[ 954] By: mbeattie on 1998/05/14 15:29:27
+ Log: Subject: [PATCH] perldebug.pod
+ Date: Mon, 6 Apr 1998 00:36:57 -0600
+ From: jason stewart <jasons@sandy-home.arc.unm.edu>
+ Branch: perl
+ ! pod/perldebug.pod
+____________________________________________________________________________
+[ 953] By: mbeattie on 1998/05/14 15:28:00
+ Log: From: Dominic Dunlop <domo@vo.lu>
+ Subject: [PATCH 5.004_64]: hints/machten.sh: disable semctl()
+ Date: Wed, 6 May 1998 14:39:32 +0000
+ Subject: [PATCH] Not OK: perl 5.00464 on powerpc-machten 4.1 (hashwarn @INC problem)
+ Date: Sat, 4 Apr 1998 19:44:34 +0000
+ Branch: perl
+ ! hints/machten.sh t/op/hashwarn.t
+____________________________________________________________________________
+[ 952] By: mbeattie on 1998/05/14 15:23:19
+ Log: New pod/perldelta.pod (previous one branched in last change):
+ Subject: [PATCH 5.004_64] Start new perldelta
+ Date: Thu, 23 Apr 1998 12:12:38 -0400 (EDT)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Branch: perl
+ + pod/perldelta.pod
+____________________________________________________________________________
+[ 951] By: mbeattie on 1998/05/14 15:20:43
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: [PATCH for 5.004_04 and 5.004_64] (Was: Obsoleted svr4.sh)
+ Date: Thu, 23 Apr 1998 11:10:15 -0400 (EDT)
+ Subject: [PATCH 5.004_64] Start new perldelta
+ Date: Thu, 23 Apr 1998 12:12:38 -0400 (EDT)
+ (above branched perldelta -> perldelta4, new perldelta will be
+ created/added next change)
+ Subject: [PATCH] BSD Platforms need STRUCT_TM_HASZONE
+ Date: Tue, 12 May 1998 09:58:49 -0400 (EDT)
+ Branch: perl
+ + ext/POSIX/hints/bsdos.pl ext/POSIX/hints/freebsd.pl
+ + ext/POSIX/hints/netbsd.pl ext/POSIX/hints/openbsd.pl
+ +> pod/perldelta4.pod
+ - pod/perldelta.pod
+ ! MANIFEST hints/svr4.sh
+____________________________________________________________________________
+[ 949] By: TimBunce on 1998/05/14 15:11:30
+ Log:
+ Title: "while($x=<>) no longer warns (implicit defined added)"
+ From: Nick Ing-Simmons <nik@tiuk.ti.com>
+ Msg-ID: <199805051035.LAA27365@pluto.tiuk.ti.com>
+ Files: MANIFEST op.c t/op/defins.t
+ Branch: maint-5.004/perl
+ + t/op/defins.t
+ ! MANIFEST op.c
+____________________________________________________________________________
+[ 948] By: mbeattie on 1998/05/14 15:09:51
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: [PATCH for 5.004_64] Configure patch Config_64-01
+ Date: Tue, 14 Apr 1998 13:04:58 -0400 (EDT)
+ Subject: [PATCH for 5.004_64] Configure patch Config_64-01-02.diff
+ Date: Fri, 17 Apr 1998 11:01:13 -0400 (EDT)
+ Subject: [PATCH for 5.004_64] Configure patch Config_64-02-03.diff
+ Date: Thu, 23 Apr 1998 15:03:20 -0400 (EDT)
+ Subject: [PATCH 5.004_64] Config_64-03-04.diff
+ Date: Wed, 13 May 1998 14:33:30 -0400 (EDT)
+ Branch: perl
+ + README.beos beos/nm.c hints/beos.sh
+ ! Configure INSTALL MANIFEST Makefile.SH Policy_sh.SH
+ ! Porting/Glossary Porting/config.sh Porting/config_H
+ ! Porting/pumpkin.pod Todo cflags.SH config_h.SH
+ ! djgpp/djgppsed.sh doop.c handy.h hints/dos_djgpp.sh
+ ! hints/netbsd.sh hints/solaris_2.sh hints/unicos.sh
+ ! hints/unicosmk.sh hv.h lib/Term/ReadLine.pm perl.h
+ ! plan9/config.plan9 pod/perlfunc.pod pp.c pp_sys.c sv.h
+ ! t/io/pipe.t thread.h vms/config.vms win32/config.bc
+ ! win32/config.vc win32/config_H.bc win32/config_H.vc
+____________________________________________________________________________
+[ 946] By: TimBunce on 1998/05/14 15:07:06
+ Log:
+ Title: "Fix PERL_DESTRUCT_LEVEL core dumps"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805062301.TAA24599@aatma.engin.umich.edu>
+ Files: perl.c sv.c t/op/misc.t
+ Branch: maint-5.004/perl
+ ! perl.c sv.c t/op/misc.t
+____________________________________________________________________________
+[ 945] By: mbeattie on 1998/05/14 15:00:31
+ Log: Subject: Perl Social Contract
+ Date: 13 Apr 1998 06:16:59 -0700
+ From: Russ Allbery <rra@stanford.edu>
+ Branch: perl
+ + Porting/Contract
+____________________________________________________________________________
+[ 944] By: TimBunce on 1998/05/14 14:59:37
+ Log:
+ Title: "5.004_04-m2 Cleanup of test failures"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805070416.AAA03082@aatma.engin.umich.edu>
+ Files: t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t t/op/taint.t
+ win32/config.bc win32/config.vc
+ Branch: maint-5.004/perl
+ ! t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t t/op/taint.t
+ ! win32/config.bc win32/config.vc
+____________________________________________________________________________
+[ 943] By: mbeattie on 1998/05/14 14:58:13
+ Log: From: Joshua.Pritikin@NewYork2.dmg.deuba.com
+ Subject: [PATCH 5.004_64] Test.pm update
+ Date: Sat, 4 Apr 1998 08:33:50 -0500
+ Subject: [PATCH 5.004_64] modcount + comments
+ Date: Fri, 17 Apr 1998 16:07:35 -0400
+ Branch: perl
+ ! lib/Test.pm op.c thrdvar.h
+____________________________________________________________________________
+[ 942] By: mbeattie on 1998/05/14 14:49:43
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.004_64] newSV
+ Date: Wed, 8 Apr 1998 03:21:03 -0400 (EDT)
+ Subject: [PATCH 5.004_64] Cryptic error from B::CC
+ Date: Sat, 11 Apr 1998 19:52:25 -0400 (EDT)
+ Branch: perl
+ ! ext/B/B/CC.pm handy.h proto.h sv.c
+____________________________________________________________________________
+[ 941] By: mbeattie on 1998/05/14 14:47:29
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: [PATCH 5.004_64] anydbm.t
+ Date: Sat, 4 Apr 1998 01:39:03 -0500 (EST)
+ Subject: [PATCH 5.004_64] threads on OS/2
+ Date: Sat, 4 Apr 1998 01:44:29 -0500 (EST)
+ Subject: [PATCH 5.004_64] Better handling of Perl DLLs under OS/2
+ Date: Sat, 4 Apr 1998 01:47:58 -0500 (EST)
+ Subject: [PATCH 5.004_64] Immediate stop in debugger
+ Date: Sat, 11 Apr 1998 19:50:58 -0400 (EDT)
+ Subject: [PATCH 5.005_64] ptags broken
+ Date: Sat, 11 Apr 1998 22:08:21 -0400 (EDT)
+ Subject: [PATCH 5.004_64] Document switch syntax via RE
+ Date: Sun, 12 Apr 1998 01:12:33 -0400 (EDT)
+ Branch: perl
+ ! emacs/ptags lib/ExtUtils/MM_OS2.pm lib/ExtUtils/Mksymlists.pm
+ ! lib/perl5db.pl os2/Changes os2/Makefile.SHs os2/os2.c
+ ! os2/os2thread.h pod/perlsyn.pod t/lib/anydbm.t
+____________________________________________________________________________
+[ 940] By: mbeattie on 1998/05/14 14:38:44
+ Log: Subject: [PATCH 5.004_64] Build Stdio and DCLSym modules as part of normal VMS perl build
+ Date: Fri, 03 Apr 1998 16:01:57 -0800
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Branch: perl
+ ! vms/descrip.mms vms/ext/DCLsym/Makefile.PL
+ ! vms/ext/Stdio/Makefile.PL vms/ext/Stdio/Stdio.xs
+____________________________________________________________________________
+[ 939] By: mbeattie on 1998/05/14 14:35:42
+ Log: Subject: [PATCH 5.004_64] perl dies in perl_construct when compiled with MULTIPLICITY
+ Date: Fri, 03 Apr 1998 13:58:15 -0800
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 938] By: gsar on 1998/05/14 10:53:55
+ Log: merge change#896 from maintbranch
+ Branch: win32/perl
+ ! doio.c ext/Socket/Socket.xs lib/Class/Struct.pm lib/Cwd.pm
+ ! lib/File/Find.pm lib/Math/BigInt.pm lib/lib.pm lib/strict.pm
+ ! op.c pod/perldiag.pod pod/perlfunc.pod pp.c pp_ctl.c sv.c
+ ! t/op/gv.t t/op/misc.t t/op/pack.t
+____________________________________________________________________________
+[ 937] By: gsar on 1998/05/14 09:31:34
+ Log: merge change#887 from maintbranch
+ Branch: win32/perl
+ + t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
+ ! MANIFEST doio.c lib/File/CheckTree.pm lib/Getopt/Long.pm
+ ! lib/Math/BigFloat.pm lib/Text/ParseWords.pm lib/Text/Wrap.pm
+ ! lib/base.pm perl.c pod/perlre.pod t/lib/io_sock.t
+ ! t/lib/io_udp.t t/lib/parsewords.t t/lib/timelocal.t
+ ! t/op/stat.t toke.c utils/h2xs.PL
+____________________________________________________________________________
+[ 936] By: gsar on 1998/05/14 09:06:18
+ Log: merge change#886 from maintbranch
+ Branch: win32/perl
+ ! README.os2 README.vms cop.h ext/DynaLoader/dl_hpux.xs
+ ! ext/POSIX/POSIX.xs ext/POSIX/hints/linux.pl global.sym
+ ! hints/aix.sh hints/bsdos.sh hints/dec_osf.sh hints/hpux.sh
+ ! hints/linux.sh hints/netbsd.sh hints/os2.sh hints/svr4.sh
+ ! lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/File/Basename.pm lib/File/Path.pm op.c os2/Makefile.SHs
+ ! os2/os2.c os2/perl2cmd.pl perl.c perl.h pod/perlguts.pod
+ ! pod/pod2man.PL pp_ctl.c pp_hot.c pp_sys.c proto.h
+ ! t/lib/filecopy.t util.c utils/perldoc.PL vms/config.vms
+ ! vms/descrip.mms vms/ext/Filespec.pm vms/ext/filespec.t
+ ! vms/test.com
+____________________________________________________________________________
+[ 935] By: gsar on 1998/05/14 07:00:02
+ Log: merge changes#872,873 from maintbranch
+ Branch: win32/perl
+ ! Changes5.004 INSTALL lib/ExtUtils/MakeMaker.pm
+ ! lib/FileHandle.pm lib/Tie/Hash.pm lib/constant.pm
+ ! lib/integer.pm pod/perl.pod pod/perlbook.pod pod/perldsc.pod
+ ! pod/perlfunc.pod pod/perlguts.pod pod/perlhist.pod
+ ! pod/perlop.pod pod/perlre.pod pod/perlrun.pod pod/perlsec.pod
+ ! pod/perltrap.pod pod/perlvar.pod pod/pod2latex.PL
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 934] By: gsar on 1998/05/14 06:24:38
+ Log: merge changes#755..759,763,764 from maintbranch
+ Branch: win32/perl
+ + hints/openbsd.sh
+ ! MANIFEST Porting/patchls perl.c perlsdio.h pod/perlfunc.pod
+ ! t/op/pos.t utils/perldoc.PL
+____________________________________________________________________________
+[ 933] By: gsar on 1998/05/14 06:07:31
+ Log: merge change#754 from maintbranch
+ Branch: win32/perl
+ ! perl.c
+____________________________________________________________________________
+[ 932] By: gsar on 1998/05/14 06:03:50
+ Log: merge changes#752,753 from maintbranch
+ Branch: win32/perl
+ + t/op/pos.t
+ ! README ext/GDBM_File/GDBM_File.pm
+ ! ext/SDBM_File/sdbm/Makefile.PL pod/perlsyn.pod
+____________________________________________________________________________
+[ 931] By: gsar on 1998/05/14 05:51:19
+ Log: merge change#745 from maintbranch
+ Branch: win32/perl
+ + ext/DynaLoader/DynaLoader.pm.PL
+ - ext/DynaLoader/DynaLoader.pm
+ ! MANIFEST ext/DynaLoader/Makefile.PL
+____________________________________________________________________________
+[ 930] By: nick on 1998/05/13 20:39:59
+ Log: resolve -at //depot/win32 into ansiperl for C++ testing.
+ Branch: ansiperl
+ ! utils/perldoc.PL
+ !> MANIFEST ext/Fcntl/Fcntl.pm hv.c lib/ExtUtils/Liblist.pm op.c
+ !> perl.c pod/perlfunc.pod pod/perlguts.pod pp.c pp_ctl.c
+ !> regcomp.c regcomp.h regexec.c t/op/hashwarn.t t/op/runlevel.t
+ !> win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ !> win32/makedef.pl win32/makefile.mk
+____________________________________________________________________________
+[ 929] By: gsar on 1998/05/13 10:13:36
+ Log: merge change#687 from maintbranch
+ Branch: win32/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 928] By: gsar on 1998/05/13 10:08:13
+ Log: merge change#683 from maintbranch
+ Branch: win32/perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 927] By: gsar on 1998/05/13 09:51:43
+ Log: merge change#681 from maintbranch
+ Branch: win32/perl
+ ! ext/Fcntl/Fcntl.pm
+____________________________________________________________________________
+[ 926] By: gsar on 1998/05/13 09:47:11
+ Log: merge change#664 from maint branch
+ Branch: win32/perl
+ ! regcomp.c regcomp.h regexec.c
+____________________________________________________________________________
+[ 925] By: gsar on 1998/05/13 08:55:28
+ Log: merge missing part of change#663 from maint branch
+ Branch: win32/perl
+ ! op.c
+____________________________________________________________________________
+[ 924] By: gsar on 1998/05/12 18:50:04
+ Log: remove x586 code gen switch (-5) for Borland, it is non-generic,
+ and seems to generate problematic code for PII.
+ Branch: win32/perl
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 923] By: gsar on 1998/05/12 16:24:02
+ Log: fix test failure
+ Message-Id: <199805120940.KAA01252@pluto.tiuk.ti.com>
+ Date: Tue, 12 May 1998 10:40:57 BST
+ From: Nick.Ing-Simmons@tiuk.ti.com
+ Subject: test buglet
+ Branch: win32/perl
+ ! t/op/hashwarn.t
+____________________________________________________________________________
+[ 922] By: TimBunce on 1998/05/11 20:58:58
+ Log: Assorted patches:
+
+ ------ CORE LANGUAGE ------
+
+ Title: "incorrect return value for hv_iterinit"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805031848.OAA20618@aatma.engin.umich.edu>
+ Files: pod/perlguts.pod hv.c
+
+ ------ DOCUMENTATION ------
+
+ Title: "perlvar.pod buglet E<EVMSERR>"
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Msg-ID: <9805041415.AA22185@o09.xray.mpe.mpg.de>
+ Files: pod/perlvar.pod
+
+ Title: "Improve docs for warning about code after an exec()"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Chaim Frenkel
+ <chaimf@concentric.net>
+ Msg-ID: <E0yYUit-0003yb-00@taurus.cus.cam.ac.uk>,
+ <m3ra22qn1z.fsf@chany-p100.emwp.com>
+ Files: pod/perlfunc.pod
+
+ Title: "Remove dead code from pod2man"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0yXmuT-0006Ll-00@ursa.cus.cam.ac.uk>
+ Files: pod/pod2man.PL
+
+ Title: "tweak doc for C<do FILENAME>"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199805090017.UAA06888@aatma.engin.umich.edu>
+ Files: pod/perlfunc.pod
+
+ Title: "Document integer pragma effect on % operator"
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <m3yawjmzhx.fsf@furu.g.aas.no>
+ Files: pod/perlop.pod
+
+ Title: "Reduce rm command line length in pod/Makefile"
+ From: Hugo van der Sanden <h.sanden@elsevier.nl>
+ Msg-ID: <199805041423.QAA13199@dorlas.elsevier.nl>
+ Files: pod/Makefile
+
+ ------ EXTENSIONS ------
+
+ Title: "Clarify Termios usage in POSIX.pod"
+ From: Rocco Caputo <troc@netrus.net>
+ Msg-ID: <199805101952.PAA12738@ns.netrus.net>
+ Files: ext/POSIX/POSIX.pod
+
+ ------ LIBRARY ------
+
+ Title: "Fix File::Find::finddepth typo in trial 2 release"
+ From: koenig@kulturbox.de (Andreas J. Koenig)
+ Msg-ID: <sfcbttflsjz.fsf@dubravka.in-berlin.de>
+ Files: lib/File/Find.pm t/lib/filefind.t
+
+ ------ PORTABILITY - GENERAL ------
+
+ Title: "Add Porting/patching.pod document"
+ From: Daniel Grisinger <dgris@tdrenterprises.com>
+ Msg-ID: <199805030305.XAA16147@relay.pair.com>
+ Files: MANIFEST Porting/patching.pod
+
+ Title: "hints/machten.sh: disable semctl(), align with devel version"
+ From: Dominic Dunlop <domo@vo.lu>
+ Msg-ID: <v03110701b175fc029eb1@[195.95.102.115]>
+ Files: hints/machten.sh
+
+ Title: "Add VMS specifics to Porting/makerel"
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Msg-ID: <01IWDK1LONRQ0026P0@cor.newman.upenn.edu>,
+ <199804271732.SAA13762@toad.ig.co.uk>,
+ <9804250212.AA27695@forte.com>
+ Files: Porting/makerel
+ Branch: maint-5.004/perl
+ + Porting/patching.pod
+ ! MANIFEST Porting/makerel ext/POSIX/POSIX.pod hints/machten.sh
+ ! hv.c lib/File/Find.pm pod/Makefile pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perlop.pod pod/perlvar.pod pod/pod2man.PL
+ ! t/lib/filefind.t
+____________________________________________________________________________
+[ 921] By: gsar on 1998/05/10 02:28:03
+ Log: various tweaks to makefiles
+ Branch: win32/perl
+ ! win32/Makefile win32/makedef.pl win32/makefile.mk
+____________________________________________________________________________
+[ 920] By: gsar on 1998/05/10 02:27:19
+ Log: fix ExtUtils::Liblist mishandling paths with spaces
+ Branch: win32/perl
+ ! lib/ExtUtils/Liblist.pm
+____________________________________________________________________________
+[ 919] By: gsar on 1998/05/09 17:10:15
+ Log: minor cleanup
+ Branch: win32/perl
+ ! MANIFEST perl.c
+____________________________________________________________________________
+[ 918] By: gsar on 1998/05/09 17:09:09
+ Log: protect sortcop from C<sort { sort { ... } ... } ...>
+ Message-Id: <199805082333.TAA06287@aatma.engin.umich.edu>
+ Date: Fri, 08 May 1998 19:33:44 EDT
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: [PATCH] Re: double recursion in sort
+ Branch: win32/perl
+ ! pp_ctl.c t/op/runlevel.t
+____________________________________________________________________________
+[ 917] By: gsar on 1998/05/09 17:05:55
+ Log: c
+ Branch: win32/perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 916] By: gsar on 1998/05/07 03:40:15
+ Log: fix C<print "foo ${\()}"> (pp_refgen fumbles when G_SCALAR, no args)
+ Branch: win32/perl
+ ! pp.c
+____________________________________________________________________________
+[ 915] By: mbeattie on 1998/05/06 13:08:29
+ Log: Speed up pp_entersub for usethreads with only 1 thread running.
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 914] By: gsar on 1998/05/03 18:44:38
+ Log: make hv_iterinit() return HvKEYS()
+ Message-Id: <3.0.1.32.19980502162922.009e6320@www.syncad.com>
+ Date: Sat, 02 May 1998 16:29:22 EDT
+ From: "SynaptiCAD, Inc." <sales@syncad.com>
+ Subject: incorrect return value for hv_iterinit
+ Branch: win32/perl
+ ! hv.c pod/perlguts.pod
+____________________________________________________________________________
+[ 913] By: TimBunce on 1998/05/01 22:38:38
+ Log: Update MANIFEST for trial 2.
+ (Porting/Contract lib/Tie/Handle.pm t/op/tiehandle.t)
+ Branch: maint-5.004/perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 912] By: TimBunce on 1998/05/01 22:30:29
+ Log: Add t/op/tiehandle.t as xtext to repository (see change 911)
+ Branch: maint-5.004/perl
+ + t/op/tiehandle.t
+____________________________________________________________________________
+[ 911] By: TimBunce on 1998/05/01 21:35:03
+ Log:
+ Title: "Add ERRSV, ERRHV, DEFSV and SAVE_DEFSV for XS 5.005 compatibility"
+ From: timbo@ig.co.uk (Tim Bunce)
+ Msg-ID: <199804200854.JAA01482@toad.ig.co.uk>
+ Files: perl.h
+
+ Title: "Add WRITE & CLOSE to TIEHANDLE"
+ From: Graham Barr <gbarr@pobox.com>
+ Msg-ID: <34F63DC8.CA95670F@pobox.com>
+ Files: pod/perltie.pod lib/Tie/Handle.pm pp_sys.c t/op/tiehandle.t
+ Branch: maint-5.004/perl
+ + lib/Tie/Handle.pm
+ ! perl.h pod/perltie.pod pp_sys.c
+____________________________________________________________________________
+[ 910] By: TimBunce on 1998/05/01 20:47:47
+ Log:
+ Title: "Add warning for Illegal hex digit"
+ From: Stephen P Potter <spp@spp.users.ds.net>, Stephen Potter
+ <spp@psasolar.colltech.com>, Tim.Bunce@ig.co.uk (Tim Bunce)
+ Msg-ID: <199804232219.SAA02267@spp.users.ds.net>,
+ <199804271409.PAA12819@toad.ig.co.uk>,
+ <199804280307.WAA12332@psasolar.psa.pencom.com>
+ Files: pod/perldiag.pod util.c
+
+ Title: "perl_call_method() bug fix (corrupt op pointer)"
+ From: "Alterman, Eugene" <Eugene.Alterman@bremer-inc.com>
+ Msg-ID: <510415F72ECFD111A31700A0C9B3CCDE3098@efx98digmasa.bremer-inc.com>
+ Files: perl.c
+
+ Title: "Fix printf segmentation fault"
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Msg-ID: <l03130300b16bebdbc314@[194.222.64.89]>
+ Files: pp_hot.c
+
+ Title: "Document changed local($a[$i],$b{$j}) behaviour re delete/splice"
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Msg-ID: <01IVMVIHNZ36001NKH@cor.newman.upenn.edu>
+ Files: pod/perlsub.pod
+ Branch: maint-5.004/perl
+ ! perl.c pod/perldiag.pod pod/perlsub.pod pp_hot.c util.c
+____________________________________________________________________________
+[ 909] By: TimBunce on 1998/05/01 19:44:47
+ Log:
+ Title: "Change Ilya's do_binmode to K&R prototype and move to doio.c"
+ Files: doio.c util.c
+ Branch: maint-5.004/perl
+ ! doio.c util.c
+____________________________________________________________________________
+[ 908] By: gsar on 1998/05/01 19:21:02
+ Log: add AS patch#20 (exposes more global constants)
+ Branch: asperl
+ ! ObjXSub.h byterun.h embed.h embedvar.h global.sym globals.c
+ ! interp.sym ipsock.h ipstdio.h objpp.h perlio.h perlsock.h
+ ! proto.h util.c win32/GenCAPI.pl win32/runperl.c
+____________________________________________________________________________
+[ 907] By: TimBunce on 1998/05/01 17:50:46
+ Log:
+ Title: "Runtime Carp verbosity without aliasing"
+ From: Joshua.Pritikin@NewYork2.dmg.deuba.com, Tim Bunce
+ Msg-ID: <H00000e50003936c@MHS>
+ Files: lib/Carp.pm
+
+ Title: "Fix File::Basename to not untaint results (using new //t flag)"
+ From: Eric Hammond <erich@finity.citysearch.com>, Tom Phoenix
+ <rootbeer@teleport.com>
+ Msg-ID: <199710070515.WAA00682@finity.citysearch.com>,
+ <Pine.GSO.3.96.971007074114.14211J-100000@usertest.teleport.com>
+ Files: lib/File/Basename.pm
+ Branch: maint-5.004/perl
+ ! lib/Carp.pm lib/File/Basename.pm
+____________________________________________________________________________
+[ 906] By: TimBunce on 1998/04/28 11:04:49
+ Log:
+ ------ CORE LANGUAGE ------
+
+ Title: "5.004_04m5t1: Fix dangling references in LVs", "Fix dangling
+ references in LVs"
+ From: Spider Boardman <spider@orb.nashua.nh.us>
+ Msg-ID: <199804010541.AAA32615@Orb.Nashua.NH.US>,
+ <19980422164037.D29222@perl.org>
+ Files: embed.h keywords.h opcode.h perl.h proto.h doop.c global.sym mg.c
+ pp.c sv.c
+
+ Title: "Fix SvGMAGIC typo in change 904"
+ Files: doop.c
+ Branch: maint-5.004/perl
+ ! doop.c embed.h global.sym keywords.h mg.c opcode.h perl.h pp.c
+ ! proto.h sv.c
+____________________________________________________________________________
+[ 905] By: TimBunce on 1998/04/28 10:32:20
+ Log: Regexp patches
+
+ Title: "New regex flag //t to leave $1 etc. tainted"
+ From: Chip Salzenberg <chip@pobox.com>, Tim Bunce <Tim.Bunce@ig.co.uk>
+ Msg-ID: <19980310192640.37826@cyprus>
+ Files: pod/perlop.pod pod/perlre.pod op.h dump.c mg.c pp_hot.c sv.c
+ t/op/taint.t toke.c
+
+ Title: "Don't accidentally untaint target of s///"
+ From: Chip Salzenberg <chip@pobox.com>
+ Msg-ID: <19980310151756.24767@cyprus>
+ Files: pp_ctl.c pp_hot.c t/op/taint.t
+
+ Title: "Allow but ignore embedded /...(?o).../ in regexp"
+ From: h.sanden@elsevier.nl (Hugo van der Sanden)
+ Msg-ID: <199804201243.OAA08244@dorlas.elsevier.nl>
+ Files: regcomp.c
+ Branch: maint-5.004/perl
+ ! dump.c mg.c op.h pod/perlop.pod pod/perlre.pod pp_ctl.c
+ ! pp_hot.c regcomp.c sv.c t/op/taint.t toke.c
+____________________________________________________________________________
+[ 904] By: TimBunce on 1998/04/27 20:20:21
+ Log: Assorted patches:
+
+ ------ CORE LANGUAGE ------
+
+ Title: "Protect join() against double reads on undef and SvGMAGICALs"
+ From: Chip Salzenberg <chip@perlsupport.com>, Tim Bunce
+ <Tim.Bunce@ig.co.uk>
+ Msg-ID: <19980424080630.D13985@perl.org>
+ Files: doop.c
+
+ Title: "Better error message for require failure"
+ From: epeschko@den-mdev1 (Ed Peschko)
+ Msg-ID: <199804240047.SAA24155@den-mdev1.co.csgsystems.com>
+ Files: pod/perldiag.pod pp_ctl.c
+
+ Title: "fixes for various noises under PERL_DESTRUCT_LEVEL"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199804231926.PAA23969@aatma.engin.umich.edu>
+ Files: perl.c
+
+ Title: "Fix nice_chunk memory leak"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199804052347.TAA15699@aatma.engin.umich.edu>
+ Files: sv.c
+
+ Title: "-2.0 vs. -2 (was Number representations)"
+ From: Chip Salzenberg <chip@pobox.com>
+ Msg-ID: <19980309185652.11231@cyprus>
+ Files: op.c
+
+ Title: "perl.c fixes for -DUNEXEC"
+ From: Matt Wette <mwette@mr-ed.jpl.nasa.gov>, Matthew R Wette
+ <mwette@mr-ed.jpl.nasa.gov>
+ Msg-ID: <199710152146.OAA07283@mr-ed.jpl.nasa.gov>
+ Files: perl.c
+
+ ------ DOCUMENTATION ------
+
+ Title: "perlcall is Perl from C, not C from Perl"
+ From: Steve A Fink <sfink@cs.berkeley.edu>
+ Files: pod/perlembed.pod
+
+ Title: "Clarify require "Foo::Bar" non-bareword issue"
+ From: Dominique Dumont <domi@ss7serv.grenoble.hp.com>
+ Msg-ID: <199804231527.AA153445256@ss7serv.grenoble.hp.com>
+ Files: pod/perlfunc.pod
+
+ Title: "(repost) new text for perlsec", "new text for perlsec"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980423161605.5518N-100000@user2.teleport.com>
+ Files: pod/perlsec.pod
+
+ ------ EXTENSIONS ------
+
+ Title: "IO::Socket->socketpair broken (typo)"
+ From: Olaf Titz <olaf@bigred.inka.de>
+ Msg-ID: <19980425224535.2807.qmail@bigred.inka.de>
+ Files: ext/IO/lib/IO/Socket.pm
+
+ Title: "NDBM_File man page needs Fcntl"
+ From: "Danny R. Faught" <faught@mailhost.rsn.hp.com>
+ Msg-ID: <199707011500.IAA00601@palrel3.hp.com>
+ Files: ext/NDBM_File/NDBM_File.pm
+
+ ------ LIBRARY ------
+
+ Title: "Documentation discrepancy: pragmatic modules"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, h.sanden@elsevier.nl (Hugo van der Sanden)
+ Msg-ID: <199804221525.RAA12695@dorlas.elsevier.nl>,
+ <E0ySPhk-00034f-00@taurus.cus.cam.ac.uk>
+ Files: lib/strict.pm lib/subs.pm lib/vars.pm
+
+ ------ PORTABILITY - GENERAL ------
+
+ Title: "Updated hints file for svr4"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980423110522.26621A-100000@newton.phys>
+ Files: hints/svr4.sh
+
+ Title: "Pumpkin update -- shared libperl.so location"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980424115837.6222A-100000@newton.phys>
+ Files: Porting/pumpkin.pod
+
+ Title: "perl compile fix for AIX 4.3"
+ From: Jens-Uwe Mager <jum@helios.de>
+ Msg-ID: <199804261611.SAA34728@ans.helios.de>
+ Files: ext/DynaLoader/dl_aix.xs
+
+ Title: "Dynaloader build on VMS",
+ From: pvhp@forte.com (Peter Prymmer), timbo@ig.co.uk (Tim Bunce)
+ Msg-ID: <199804271732.SAA13762@toad.ig.co.uk>, <9804250212.AA27695@forte.com>
+ Files: vms/descrip.mms
+
+ ------ UTILITIES ------
+
+ Title: "Major update to h2ph.PL"
+ From: Billy <wdconsta@cs.adelaide.edu.au>
+ Msg-ID: <Pine.SV4.3.93.980424031837.20782A-200000@ermintrude.teaching.cs.adelaide.edu.au>
+ Files: utils/h2ph.PL
+ Branch: maint-5.004/perl
+ ! Porting/pumpkin.pod doop.c ext/DynaLoader/dl_aix.xs
+ ! ext/IO/lib/IO/Socket.pm ext/NDBM_File/NDBM_File.pm
+ ! hints/svr4.sh lib/strict.pm lib/subs.pm lib/vars.pm op.c
+ ! perl.c pod/perldiag.pod pod/perlembed.pod pod/perlfunc.pod
+ ! pod/perlsec.pod pp_ctl.c sv.c utils/h2ph.PL vms/descrip.mms
+____________________________________________________________________________
+[ 903] By: gsar on 1998/04/25 22:27:19
+ Log: add AS patch#19 (adds socket layer generation to GenCAPI.pl)
+ Branch: asperl
+ ! win32/GenCAPI.pl
+____________________________________________________________________________
+[ 902] By: nick on 1998/04/25 16:35:08
+ Log: Case sensitive tweak to perldoc.PL
+ Branch: ansiperl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 901] By: nick on 1998/04/25 15:16:54
+ Log: Implement use attrs qw(locked package);
+ Passes all tests except posix (hangs/dies) in sigaction test after
+ printing "ok 9".
+ Branch: ansiperl
+ ! cv.h ext/attrs/attrs.pm ext/attrs/attrs.xs pp_hot.c
+____________________________________________________________________________
+[ 900] By: nick on 1998/04/25 13:58:17
+ Log: Auto-insert defined() test in while when test expression is
+ readline (i.e. <>), glob, readdir, or each.
+ Branch: ansiperl
+ + t/op/defins.t
+ ! op.c pod/perlop.pod
+____________________________________________________________________________
+[ 899] By: nick on 1998/04/25 13:14:52
+ Log: Resolve ansiperl against win32 branch
+ Branch: ansiperl
+ +> (branch 53 files)
+ - config_H
+ !> (integrate 227 files)
+____________________________________________________________________________
+[ 898] By: gsar on 1998/04/24 17:01:05
+ Log: add AS patch#18
+ Branch: asperl
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/xsubpp win32/GenCAPI.pl
+____________________________________________________________________________
+[ 897] By: TimBunce on 1998/04/23 19:49:22
+ Log: Assorted patches:
+
+ ------ CORE LANGUAGE ------
+
+ Title: "fix for "Unbalanced string table refcount""
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199804042251.RAA25527@aatma.engin.umich.edu>
+ Files: sv.c
+
+ Title: "Allow more lenient switch processing"
+ From: "John L. Allen" <allen@grumman.com>
+ Msg-ID: <199803251638.LAA22664@gateway.grumman.com>
+ Files: perl.c
+
+ Title: "Add fourth arg to substr: substr EXPR,OFFSET,LEN,REPLACEMENT"
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <m3g1jglqtm.fsf@furu.g.aas.no>
+ Files: pod/perlfunc.pod Todo opcode.pl pp.c t/op/substr.t
+
+ Title: "Odd number of elements in hash list."
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980328151929.29336D-100000@user2.teleport.com>
+ Files: MANIFEST pod/perldiag.pod pp.c pp_hot.c t/op/hashwarn.t
+
+ Title: "another destruct_level fix"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199804030105.UAA04400@aatma.engin.umich.edu>
+ Files: hv.c
+
+ Title: "bidirectional pipe warning blues"
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Msg-ID: <9804082151.AA20399@claudius.bfsec.bt.co.uk>
+ Files: doio.c
+
+ Title: "stale pointers after realloc (MEXTEND in pp_print and pp_prtf)"
+ From: Malcolm Beattie <mbeattie@sable.ox.ac.uk>
+ Msg-ID: <199801191107.LAA17979@sable.ox.ac.uk>
+ Files: pp_hot.c pp_sys.c
+
+ Title: "unimplemented umask() should return undef not die"
+ From: kstar@chapin.edu (Kurt D. Starsinic)
+ Msg-ID: <199803120515.VAA08660@chapin.edu>
+ Files: pod/perlfunc.pod pp_sys.c
+
+ Title: "warning for: bless $foo, """
+ From: Joshua.Pritikin@NewYork2.dmg.deuba.com
+ Msg-ID: <H00000e5000378a0@MHS>
+ Files: pod/perldiag.pod pp.c
+
+ ------ DOCUMENTATION ------
+
+ Title: "Mention SWIG in perlxs.pod"
+ From: Steve A Fink <sfink@cs.berkeley.edu>
+ Msg-ID: <Pine.HPP.3.96.980408154956.20990K-100000@brooksie.CS.Berkeley.EDU>
+ Files: pod/perlxs.pod
+
+ Title: "fix-up of previous perlre.pod patch"
+ From: Ted Ashton <ashted@southern.edu>
+ Msg-ID: <199803031540.KAA09388@ns.southern.edu>
+ Files: pod/perlre.pod
+
+ Title: "long list of man page nitpicks"
+ From: Greg Bacon <gbacon@mickey.cs.uah.edu>, Tom Christiansen
+ <tchrist@jhereg.perl.com>
+ Msg-ID: <199804221844.NAA08338@pluto.cs.uah.edu>,
+ <199804222204.QAA20805@jhereg.perl.com>
+ Files: pod/perlapio.pod pod/perlcall.pod pod/perldebug.pod pod/perldelta.pod
+ pod/perldiag.pod pod/perlembed.pod pod/perlfaq2.pod
+ pod/perlfaq3.pod pod/perlfaq4.pod pod/perlfaq5.pod
+ pod/perlfaq7.pod pod/perlfaq8.pod pod/perlform.pod
+ pod/perlfunc.pod pod/perlguts.pod pod/perlipc.pod
+ pod/perllocale.pod pod/perlmodlib.pod pod/perlop.pod
+ pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
+ pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod
+ pod/pod2man.PL
+
+ Title: "document that system() does not set $! when it fails"
+ From: "Mark R. Levinson" <mrl@isc.upenn.edu>
+ Msg-ID: <199803011946.OAA31942@anaximander.dccs.upenn.edu>
+ Files: pod/perlfunc.pod
+
+ Title: "Fix pod/roffitall execute permission"
+ From: lvirden@cas.org
+ Msg-ID: <1997Nov17.132031.2589892@cor.newman>
+ Files: pod/roffitall
+
+ Title: "document when split ignores trailing empty fields"
+ From: Hugo van der Sanden <hv@crypt0.demon.co.uk>
+ Msg-ID: <l03130300b14fac832b77@[194.222.64.89]>
+ Files: pod/perlfunc.pod
+
+ ------ EXTENSIONS ------
+
+ Title: "Buglet in Opcode.pm documentation"
+ From: Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
+ Msg-ID: <199804170349.XAA32445@sleipnir.valparaiso.cl>
+ Files: ext/Opcode/Opcode.pm
+
+ Title: "Failure to append to perllocal.pod should not be fatal"
+ From: koenig@kulturbox.de (Andreas J. Koenig)
+ Msg-ID: <sfciuogy67x.fsf@dubravka.in-berlin.de>
+ Files: lib/ExtUtils/MM_Unix.pm
+
+ Title: "Document that IO.pm does not load IO::Select etc"
+ From: Graham Barr <gbarr@ti.com>
+ Msg-ID: <353B48F1.64E35A63@ti.com>
+ Files: ext/IO/IO.pm
+
+ Title: "Install extensions with bootstrap (again) in $archlib"
+ From: Achim Bohnet <ach@mpe.mpg.de>, koenig@kulturbox.de (Andreas J.
+ Koenig)
+ Msg-ID: <9804061909.AA12675@o09.xray.mpe.mpg.de>,
+ <sfc90oxc0uj.fsf@dubravka.in-berlin.de>
+ Files: lib/ExtUtils/Install.pm
+
+ Title: "glibc2.0.6 missing MSG_* <sys/socket.h> defines."
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980406113950.3166L-100000@newton.phys>
+ Files: ext/Socket/Socket.xs
+
+ ------ LIBRARY ------
+
+ Title: "Benchmark.pm: add run-for-some-time mode"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199804080647.JAA15136@alpha.hut.fi>
+ Files: lib/Benchmark.pm
+
+ Title: "Comments added to Carp.pm"
+ From: Andy Wardley <abw@cre.canon.co.uk>, Chip Salzenberg
+ <chip@perlsupport.com>, Tom Christiansen
+ <tchrist@jhereg.perl.com>
+ Msg-ID: <19980422164242.E29222@perl.org>,
+ <199804222033.OAA17959@jhereg.perl.com>,
+ <980409182357.ZM21638@bandanna>
+ Files: lib/Carp.pm
+
+ Title: "chat2.pl fix"
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Msg-ID: <01IVMVF507PO001NKH@cor.newman.upenn.edu>
+ Files: lib/chat2.pl
+
+ Title: "lib/Pod/Html.pm"
+ From: d-lewart@uiuc.edu (Daniel S. Lewart)
+ Msg-ID: <199710170718.DAA25472@staff1.cso.uiuc.edu>,
+ <199710180417.AAA19778@staff2.cso.uiuc.edu>
+ Files: lib/Pod/Html.pm
+
+ Title: "ormaments method in Term/ReadLine.pm causes warning with string
+ arg."
+ From: hiroo.hayashi@computer.org
+ Msg-ID: <199804061519.AAA21907@mail.fb3.so-net.ne.jp>
+ Files: lib/Term/ReadLine.pm
+
+ ------ OTHER CHANGES ------
+
+ Title: "ptags broken"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199804120208.WAA29264@monk.mps.ohio-state.edu>
+ Files: emacs/ptags
+
+ ------ PORTABILITY - WIN32 ------
+
+ Title: "win32 tweaks (signals and crypt support)"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199804170505.BAA06413@aatma.engin.umich.edu>
+ Files: perl.h win32/config.bc win32/config.vc win32/config_H.bc
+ win32/config_H.vc win32/win32.c
+
+ ------ PORTABILITY - GENERAL ------
+
+ Title: "Add Social Contract (2nd Draft) as Porting/Contract"
+ From: Russ Allbery <rra@stanford.edu>
+ Msg-ID: <m3btw66n8i.fsf@windlord.Stanford.EDU>
+ Files: Porting/Contract
+
+ Title: "Config: Irix 5 hints"
+ From: kstar@O2.chapin.edu
+ Msg-ID: <199804061712.NAA22823@O2.chapin.edu>
+ Files: hints/irix_5.sh
+
+ Title: "VMS patches to 5.004_03"
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Msg-ID: <01IVYJS0L8D200209B@cor.newman.upenn.edu>
+ Files: vms/vms.c
+
+ Title: "hints/netbsd.sh - enable vfork"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980417110749.19327B-100000@newton.phys>
+ Files: hints/netbsd.sh
+
+ ------ UTILITIES ------
+
+ Title: "support find2perl -follow"
+ From: Billy <wdconsta@cs.adelaide.edu.au>
+ Msg-ID: <Pine.SV4.3.93.980408005903.24081A-100000@ermintrude.teaching.cs.adelaide.edu.au>
+ Files: x2p/find2perl.PL
+ Branch: maint-5.004/perl
+ + Porting/Contract t/op/hashwarn.t
+ ! MANIFEST Todo doio.c emacs/ptags embed.h ext/IO/IO.pm
+ ! ext/Opcode/Opcode.pm ext/Socket/Socket.xs hints/irix_5.sh
+ ! hints/netbsd.sh hv.c lib/Benchmark.pm lib/Carp.pm
+ ! lib/ExtUtils/Install.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/Pod/Html.pm lib/Term/ReadLine.pm lib/chat2.pl opcode.h
+ ! opcode.pl perl.c perl.h pod/perlapio.pod pod/perlcall.pod
+ ! pod/perldebug.pod pod/perldelta.pod pod/perldiag.pod
+ ! pod/perlembed.pod pod/perlfaq2.pod pod/perlfaq3.pod
+ ! pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfaq7.pod
+ ! pod/perlfaq8.pod pod/perlform.pod pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perlhist.pod pod/perlipc.pod
+ ! pod/perllocale.pod pod/perlmodlib.pod pod/perlop.pod
+ ! pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ ! pod/perlstyle.pod pod/perlsub.pod pod/perlsyn.pod
+ ! pod/perltoot.pod pod/perlvar.pod pod/perlxs.pod pod/pod2man.PL
+ ! pod/roffitall pp.c pp_hot.c pp_sys.c sv.c t/TEST t/op/gv.t
+ ! t/op/substr.t vms/vms.c win32/config.bc win32/config.vc
+ ! win32/config_H.bc win32/config_H.vc win32/win32.c
+ ! x2p/find2perl.PL
+____________________________________________________________________________
+[ 896] By: TimBunce on 1998/04/22 11:49:24
+ Log: Assorted patches:
+
+ ------ CORE LANGUAGE ------
+
+ Title: "Additional regex-cache patch"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Msg-ID: <19980305104831.38100@cyprus>
+ Files: pp_ctl.c
+
+ Title: "Conservative C<*x = undef> patch"
+ From: Chip Salzenberg <chip@atlantic.net>
+ Msg-ID: <19980310163310.48509@cyprus>
+ Files: pod/perldiag.pod pod/perlfunc.pod pp.c sv.c t/op/gv.t
+
+ Title: "Consider @ARGV to be plain files if inplace (-i)"
+ From: Chip Salzenberg <salzench@nielsenmedia.com>
+ Msg-ID: <199802042106.QAA04082@nielsenmedia.com>
+ Files: doio.c
+
+ Title: "Fix semctl for Linux, Sun and SVR4"
+ From: Graham Barr <gbarr@ti.com>, lvirden@cas.org (Larry W. Virden, x2487)
+ Msg-ID: <3484247D.BB036D39@ti.com>, <9712021313.AA11495@cas.org>
+ Files: doio.c
+
+ Title: "C<dSP> entails using C<SP>, not C<sp>"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199803070149.UAA12217@aatma.engin.umich.edu>
+ Files: pod/perlcall.pod pod/perlembed.pod pod/perlguts.pod pod/perlxs.pod
+ doio.c doop.c ext/DB_File/DB_File.xs
+ ext/DynaLoader/dl_dld.xs ext/Opcode/Opcode.xs
+ ext/POSIX/POSIX.xs ext/Socket/Socket.xs gv.c
+ lib/ExtUtils/typemap mg.c os2/OS2/REXX/REXX.xs
+ win32/win32.c
+
+ Title: "Make autouse -w-safe"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199803030236.VAA13244@monk.mps.ohio-state.edu>
+ Files: lib/autouse.pm op.c sv.c
+
+ Title: "Misleading error on close of unopened handle"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0y4R07-0003PH-00@ursa.cus.cam.ac.uk>
+ Files: doio.c
+
+ Title: "Confusing error from perl -e "x'""
+ From: Hans Mulder <hansmu@xs4all.nl>
+ Msg-ID: <1998Mar25.174320.2866352@cor.newman.upenn.edu>
+ Files: toke.c
+
+ Title: "Add HAS_GNULIBC define"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980305115202.9180K-100000@newton.phys>
+ Files: config_H config_h.SH
+
+ Title: "h_errno might not be an int"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980325165059.22255D-100000@newton.phys>
+ Files: pp_sys.c
+
+ Title: "Revised taint hole closer", "Revised taint hole closer"
+ From: Chip Salzenberg <chip@atlantic.net>, Ilya Zakharevich
+ <ilya@math.ohio-state.edu>
+ Msg-ID: <19980310222127.09350@cyprus>,
+ <199803110554.AAA29157@monk.mps.ohio-state.edu>
+ Files: doio.c
+
+ Title: "SEGV compiling localised lexical in perl5.004_05t1"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>, h.sanden@elsevier.nl (Hugo
+ van der Sanden)
+ Msg-ID: <199803171530.QAA24053@dorlas.elsevier.nl>,
+ <199803171727.MAA05234@aatma.engin.umich.edu>
+ Files: op.c t/op/misc.t
+
+ Title: "Stale SP in pp_substr"
+ From: Stephen McCamant <alias@mcs.com>
+ Msg-ID: <m0yFsTS-000EZpC@alias-2.pr.mcs.net>
+ Files: pp.c
+
+ Title: "Statement unlikely to be reached warning"
+ From: Hans Mulder <hansm@icgned.nl>
+ Msg-ID: <1997Dec24.171511.2683516@cor.newman>
+ Files: op.c
+
+ Title: "Tainting propagates from nowhere"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199803140411.XAA09343@aatma.engin.umich.edu>
+ Files: pp.c
+
+ Title: "two trivial tweaks to 5.004m5t1"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199803060553.AAA28461@aatma.engin.umich.edu>
+ Files: proto.h win32/Makefile
+
+ Title: "unpacking negatives on Alpha"
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Msg-ID: <9710201503.AA24797@o09.xray.mpe.mpg.de>
+ Files: pp.c t/op/pack.t
+
+ ------ LIBRARY AND EXTENSIONS ------
+
+ Title: "Cwd.pm: abs_path() and fast_abs_path() plus code merge"
+ From: Graham Barr <gbarr@ti.com>
+ Msg-ID: <3482F365.4A0486BA@ti.com>
+ Files: lib/Cwd.pm
+
+ Title: "Math/BigInt.pm, fixed use of undefined value."
+ From: abigail@fnx.com
+ Msg-ID: <19980313052452.27365.qmail@betelgeuse.wayne.fnx.com>
+ Files: lib/Math/BigInt.pm
+
+ Title: "File::Find rewrite"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199803052344.SAA01008@monk.mps.ohio-state.edu>
+ Files: lib/File/Find.pm
+
+ Title: "efficient version of strict.pm"
+ From: koenig@anna.mind.de (Andreas J. Koenig)
+ Msg-ID: <sfcpvonhdnc.fsf@anna.in-berlin.de>
+ Files: lib/strict.pm
+
+ Title: "Socket occasional SEGV in pack_sockaddr_un"
+ From: Trevor Blackwell <tlb@viaweb.com>
+ Msg-ID: <199710281804.NAA09632@wagg.viaweb.com>
+ Files: ext/Socket/Socket.xs
+
+ Title: "Warning on mis-use of 'use lib'"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, Tom Phoenix
+ <rootbeer@teleport.com>, chip@atlantic.net
+ Msg-ID: <199801270435.XAA14147@cyprus.atlantic.net>,
+ <E0xx9x4-0006jc-00@ursa.cus.cam.ac.uk>,
+ <Pine.GSO.3.96.980126192445.22284N-100000@user2.teleport.com>
+ Files: lib/lib.pm
+
+ Title: "bug in Class::Struct"
+ From: Tom Christiansen <tchrist@toy.perl.com>
+ Msg-ID: <199803290814.KAA05699@toy.perl.com>
+ Files: lib/Class/Struct.pm
+
+ Title: "Allow POSIX to export nice()"
+ From: bkeelerx@iwa.dp.intel.com (Bruce J. Keeler)
+ Msg-ID: <eclg1kf5yf0.fsf@ws010.dp.intel.com>
+ Files: ext/POSIX/POSIX.pm
+
+ Title: "'use Env' on WinNT/95 fails"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199803280511.AAA15933@aatma.engin.umich.edu>
+ Files: lib/Env.pm
+
+ ------ OTHER CHANGES ------
+
+ Title: "mv-if-diff"
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Msg-ID: <14572.9803271806@tempest.cise.npl.co.uk>
+ Files: mv-if-diff
+
+ ------ PORTABILITY - WIN32 ------
+
+ Title: "fix various problems with backticks on win32"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199803070705.CAA15945@aatma.engin.umich.edu>
+ Files: win32/config_h.PL win32/win32.c
+
+ ------ TESTS ------
+
+ Title: "Fix bug in locale.t"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199801042148.XAA08599@alpha.hut.fi>
+ Files: t/pragma/locale.t
+ Branch: maint-5.004/perl
+ ! config_H config_h.SH doio.c doop.c ext/DB_File/DB_File.xs
+ ! ext/DynaLoader/dl_dld.xs ext/Opcode/Opcode.xs
+ ! ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs ext/Socket/Socket.xs
+ ! gv.c lib/Class/Struct.pm lib/Cwd.pm lib/Env.pm
+ ! lib/ExtUtils/typemap lib/File/Find.pm lib/Math/BigInt.pm
+ ! lib/autouse.pm lib/lib.pm lib/strict.pm mg.c mv-if-diff op.c
+ ! os2/OS2/REXX/REXX.xs pod/perlcall.pod pod/perldiag.pod
+ ! pod/perlembed.pod pod/perlfunc.pod pod/perlguts.pod
+ ! pod/perlxs.pod pp.c pp_ctl.c pp_sys.c proto.h sv.c t/op/gv.t
+ ! t/op/misc.t t/op/pack.t t/pragma/locale.t toke.c
+ ! win32/Makefile win32/config_h.PL win32/win32.c
+____________________________________________________________________________
+[ 895] By: gsar on 1998/04/22 03:13:19
+ Log: intern -> sys_intern
+ Branch: win32/perl
+ ! embedvar.h interp.sym intrpvar.h win32/win32.h
+____________________________________________________________________________
+[ 894] By: gsar on 1998/04/22 02:42:20
+ Log: hand-applied patch along with small tweaks
+ Message-Id: <35400e2a.13538517@smtp1.ibm.net>
+ Date: Tue, 21 Apr 1998 23:31:06 +0200
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Subject: Re: Per-Interpreter variables for win32.c
+ Branch: win32/perl
+ ! embedvar.h interp.sym intrpvar.h perl.c perl.h proto.h
+ ! win32/makedef.pl win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 893] By: gsar on 1998/04/21 03:42:21
+ Log: add AS patch#17
+ Branch: asperl
+ + win32/GenCAPI.pl
+ ! MANIFEST XSUB.h cv.h ipstdio.h lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MM_Win32.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp op.c perl.h
+ ! pp_ctl.c pp_hot.c proto.h sv.h thread.h win32/Makefile
+ ! win32/dl_win32.xs win32/makefile.mk win32/runperl.c
+ ! win32/win32.c
+____________________________________________________________________________
+[ 892] By: gsar on 1998/04/20 20:51:50
+ Log: add AS patch#16
+ Branch: asperl
+ ! globals.c ipdir.h perl.h perlvars.h regcomp.h win32/Makefile
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 891] By: gsar on 1998/04/19 23:50:34
+ Log: tweak doc for C<do FILENAME>
+ Branch: win32/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 890] By: gsar on 1998/04/19 01:08:11
+ Log: use a pidtable that grows dynamically for popen()
+ Message-Id: <3539f434.44835409@smtp1.ibm.net>
+ Date: Sat, 18 Apr 1998 21:01:27 +0200
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Subject: Re: [PATCH] for bug in 5.004_64 when compiled with MSC++ 4.2
+ Branch: win32/perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 889] By: gsar on 1998/04/17 02:13:58
+ Log: support POSIX, enable more locale tests
+ Branch: win32/perl
+ ! ext/POSIX/Makefile.PL ext/POSIX/POSIX.pm ext/POSIX/POSIX.xs
+ ! t/lib/posix.t t/pragma/locale.t win32/Makefile
+ ! win32/makedef.pl win32/makefile.mk
+____________________________________________________________________________
+[ 888] By: mbeattie on 1998/04/14 16:22:51
+ Log: CC did "<<" instead of ">>" for right-shift on ints.
+ Branch: perl
+ ! ext/B/B/CC.pm
+____________________________________________________________________________
+[ 887] By: TimBunce on 1998/04/10 17:44:55
+ Log: Assorted patches:
+
+ ------ CORE LANGUAGE ------
+
+ Title: "Re: die exits with 0"
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Files: perl.c t/op/die_exit.t
+
+ Title: "More toke.c commentary; fix oddity"
+ From: h.sanden@elsevier.nl (Hugo van der Sanden)
+ Msg-ID: <199803251022.LAA01308@dorlas.elsevier.nl>
+ Files: toke.c
+
+ Title: "for semctl on solaris"
+ From: Graham Barr <gbarr@ti.com>
+ Msg-ID: <34624B80.C014E841@ti.com>
+ Files: doio.c t/op/ipcmsg.t t/op/ipcsem.t
+
+ ------ DOCUMENTATION ------
+
+ Title: "Add more 'see also's to perlre.pod.", "Perl regexp /g modifier bug"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>, epeschko@den-mdev1 (Ed
+ Peschko), pjr@watcher.telstra.com.au (Peter Richardson)
+ Msg-ID: <199803050000.LAA11476@watcher.telecom.com.au>,
+ <199803050231.VAA19128@monk.mps.ohio-state.edu>,
+ <199803050605.XAA09785@den-mdev1.co.csgsystems.com>
+ Files: pod/perlre.pod
+
+ ------ LIBRARY AND EXTENSIONS ------
+
+ Title: "BigFloat - small neagtive numbers cause panic"
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199711201325.NAA09732@crypt.compulink.co.uk>
+ Files: lib/Math/BigFloat.pm
+
+ Title: "Update Getopt::Long to 2.16"
+ From: JVromans@Squirrel.nl (Johan Vromans), Johan Vromans
+ <jvromans@squirrel.nl>
+ Msg-ID: <13571.48089.726787.147769@plume.nl.compuware.com>,
+ <13572.6847.863219.973795@phoenix.squirrel.nl>
+ Files: lib/Getopt/Long.pm
+
+ Title: "New Text::ParseWords"
+ From: pomeranz@netcom.com (Hal Pomeranz)
+ Msg-ID: <199710162118.OAA06275@netcom7.netcom.com>
+ Files: lib/Text/ParseWords.pm t/lib/parsewords.t
+
+ Title: "Fixed Text/Wrap.pm bugs (2)"
+ From: Jacqui Caren <Jacqui.Caren@ig.co.uk>
+ Msg-ID: <199709291548.QAA08645@toad.ig.co.uk>
+ Files: lib/Text/Wrap.pm
+
+ Title: "Very *evil* File::CheckTree behavior! (now uses warn/die not
+ print/exit)"
+ From: Eryq <eryq@zeegee.com>, Randal Schwartz <merlyn@stonehenge.com>
+ Msg-ID: <34B542FD.190A@zeegee.com>, <8cen2i9k6f.fsf@gadget.cscaper.com>
+ Files: lib/File/CheckTree.pm
+
+ ------ OTHER CHANGES ------
+
+ Title: "Add ./emacs/ptags"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199803150847.DAA08196@monk.mps.ohio-state.edu>
+ Files: emacs/ptags
+
+ ------ TESTS ------
+
+ Title: "Avoid stat test failure from build in /tmp (tmpfs)", "Build in /tmp"
+ From: Andy Dougherty <doughera@newton.phys.lafayette.edu>, Greg Bacon
+ <gbacon@adtran.com>, pudge@pobox.com (Chris Nandor)
+ Msg-ID: <199710171616.LAA13435@crp-201.adtran.com>,
+ <Pine.SUN.3.96.971017171023.2349A-100000@newton.phys>,
+ <v02130515b06be80f1486@[205.228.240.16]>
+ Files: t/op/stat.t
+
+ Title: "for failure with lib/timelocal"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>, jan.dubois@ibm.net (Jan Dubois)
+ Msg-ID: <34c78f61.2529827@smtp1.ibm.net>,
+ <E0xvdfI-00057d-00@ursa.cus.cam.ac.uk>
+ Files: t/lib/timelocal.t
+
+ Title: "Make "localhost" related failures more clear"
+ From: Paul Hoffman <phoffman@proper.com>
+ Msg-ID: <199801201859.KAA05686@mail.proper.com>
+ Files: t/lib/io_sock.t t/lib/io_udp.t
+
+ ------ UTILITIES ------
+
+ Title: "Let h2xs read multiple header files"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>, Benjamin Sugars
+ <bsugars@canoe.ca>
+ Msg-ID: <Pine.SOL.3.95.980310091946.25236A-100000@interact>,
+ <Pine.SUN.3.96.980310145455.638A-100000@newton.phys>
+ Files: utils/h2xs.PL
+ Branch: maint-5.004/perl
+ + emacs/ptags t/op/die_exit.t t/op/ipcmsg.t t/op/ipcsem.t
+ ! MANIFEST doio.c lib/File/CheckTree.pm lib/Getopt/Long.pm
+ ! lib/Math/BigFloat.pm lib/Text/ParseWords.pm lib/Text/Wrap.pm
+ ! lib/base.pm perl.c pod/perlre.pod t/lib/io_sock.t
+ ! t/lib/io_udp.t t/lib/parsewords.t t/lib/timelocal.t
+ ! t/op/stat.t toke.c utils/h2xs.PL vms/perly_h.vms
+____________________________________________________________________________
+[ 886] By: TimBunce on 1998/04/10 14:35:34
+ Log: Changes relating primarily to portability.
+
+ ------ CORE LANGUAGE ------
+
+ Title: "5.004_55: Another round of OS/2 patches"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199803050945.EAA20153@monk.mps.ohio-state.edu>
+ Files: hints/os2.sh pod/perlguts.pod cop.h perl.h proto.h README.os2
+ global.sym lib/ExtUtils/MM_OS2.pm lib/File/Path.pm op.c
+ os2/Changes os2/Makefile.SHs os2/os2.c os2/perl2cmd.pl
+ perl.c pod/pod2man.PL pp_ctl.c pp_hot.c pp_sys.c
+ t/lib/filecopy.t util.c utils/perldoc.PL
+
+ Title: "VMS: chdir() with empty arg list"
+ From: lane@duphy4.drexel.edu (Charles Lane)
+ Msg-ID: <980317125556.222041c7@DUPHY4.Physics.Drexel.Edu>
+ Files: pp_sys.c
+
+ ------ LIBRARY AND EXTENSIONS ------
+
+ Title: "ExtUtils/MM_Unix.pm changed to use ld -rpath on IRIX"
+ From: "W. Phillip Moore" <wpm@ms.com>
+ Msg-ID: <199712011738.MAA21139@zappa.morgan.com>
+ Files: lib/ExtUtils/MM_Unix.pm
+
+ Title: "[Linux] POSIX::_[PS]C_.+ bug (add HINT_SC_EXIST)"
+ From: Yutaka OIWA <oiwa@is.s.u-tokyo.ac.jp>
+ Msg-ID: <199712251923.EAA08260@tjms1f.is.s.u-tokyo.ac.jp>
+ Files: ext/POSIX/hints/linux.pl ext/POSIX/POSIX.xs
+
+ Title: "5.004_04-m1] Use HAS_GNULIBC in POSIX.xs"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980305115517.9180L-100000@newton.phys>
+ Files: ext/POSIX/POSIX.xs
+
+ Title: ""ODBM_File.c", line 275: NULL undefined"
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Msg-ID: <9803091310.AA23264@claudius.bfsec.bt.co.uk>
+ Files: ext/ODBM_File/ODBM_File.xs
+
+ ------ OTHER CHANGES ------
+ Files:
+
+ ------ PORTABILITY - GENERAL ------
+
+ Title: "5.004_04 QNX getcwd"
+ From: Norton Allen <allen@huarp.harvard.edu>
+ Msg-ID: <199802121838.NAA20452@dolores.harvard.edu>,
+ <199803061511.KAA22346@bottesini.harvard.edu>
+ Files: hints/qnx.sh lib/Cwd.pm t/op/magic.t
+
+ Title: "hints/netbsd.sh d_setrgid d_setruid"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199802281435.QAA10866@alpha.hut.fi>
+ Files: hints/netbsd.sh
+
+ Title: "osname=unixware, osvers=2.03, archname=i386-unixware
+ d_casti32=undef"
+ From: Tom Hughes <tom@compton.demon.co.uk>
+ Msg-ID: <465398da47%tom@compton.demon.co.uk>
+ Files: hints/svr4.sh
+
+ Title: "hints/bsdos.sh patch for BSDI 3.1"
+ From: Jan-Pieter Cornet <johnpc@xs4all.nl>
+ Msg-ID: <6fbip6$3cp$1@xs1.xs4all.nl>
+ Files: hints/bsdos.sh
+
+ Title: "Remove BIND_NOSTART from DynaLoader for HP"
+ From: Keong Lim <Keong.Lim@sr.com.au>
+ Msg-ID: <01BD1D03.53B65E90@sieplan2.sr.com.au>
+ Files: ext/DynaLoader/dl_hpux.xs
+
+ Title: "Building Perl on AIX 4+ with shared libraries and dynamic loading"
+ From: Juan Gallego <Little.Boss@physics.mcgill.ca>
+ Msg-ID: <Pine.SGI.3.91.971022084517.17052F-100000@nazgul.physics.mcgill.ca>
+ Files: hints/aix.sh
+
+ Title: "alpha-dec_osf 5.0"
+ From: Spider Boardman <spider@Orb.Nashua.NH.US>
+ Msg-ID: <199712232305.SAA08359@Orb.Nashua.NH.US>
+ Files: hints/dec_osf.sh
+
+ Title: "Off-by-one error with OS2::PrfDB"
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199710170920.FAA00390@monk.mps.ohio-state.edu>
+ Files: os2/OS2/PrfDB/PrfDB.xs
+
+ Title: "5.004_04-m1] Allow overrides in hints/openbsd.sh"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980305115956.9180N-100000@newton.phys>
+ Files: hints/openbsd.sh
+
+ Title: "5.004_04-m1] Linux shouldn't use -lnet"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980305115843.9180M-100000@newton.phys>
+ Files: hints/linux.sh
+
+ Title: "5.004_(04|63)] Close VMS security hole"
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Msg-ID: <01IV6LRJCSSC0009C4@cor.newman.upenn.edu>
+ Files: vms/vms.c
+
+ Title: "Re: Perl online documentation on OpenVMS"
+ From: pvhp@forte.com (Peter Prymmer)
+ Msg-ID: <9803192143.AA28120@forte.com>
+ Files: README.vms
+
+ Title: "Perl5.004_04m4t4 *almost* makes it for VMS", "Updated
+ vms/perly_c.vms and vms/perly_h.vms"
+ From: Andy Dougherty <doughera@newton.phys.lafayette.edu>, Dan Sugalski
+ <sugalskd@osshe.edu>, larry@wall.org (Larry Wall)
+ Msg-ID: <199710151650.JAA29185@wall.org>,
+ <3.0.3.32.19971014150404.02fdef78@osshe.edu>,
+ <Pine.SUN.3.96.971015121704.28456F-100000@newton.phys>
+ Files: vms/perly_c.vms
+
+ Title: "Updated, non-wordwrapped, patch to README.VMS"
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Msg-ID: <3.0.5.32.19980213133828.0092c870@osshe.edu>
+ Files: README.vms
+
+ Title: "VMS patches to 5.004_03 (excluding installperl and timelocal.t)"
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Msg-ID: <01INZT9G2LZS0006YW@cor.newman.upenn.edu>
+ Files: lib/File/Basename.pm lib/File/Path.pm vms/config.vms vms/descrip.mms
+ vms/genconfig.pl vms/test.com vms/vms.c vms/ext/Filespec.pm
+ vms/ext/filespec.t
+
+ Title: "Re: VMSperl crashes on -Mblib argument"
+ From: bailey@newman.upenn.edu (Charles Bailey)
+ Msg-ID: <1997Dec10.004439.2635060@cor.newman>
+ Files: lib/blib.pm vms/vms.c
+
+ Title: "hints/linux.sh (MkLinux / PPC)"
+ From: pudge@pobox.com (Chris Nandor)
+ Msg-ID: <v0213050cb06c19682a25@[205.228.240.28]>
+ Files: hints/linux.sh
+
+ Title: "hpux.sh hints file clarification suggestion"
+ From: root@qad.com
+ Msg-ID: <199802192351.QAA09096@jhereg.perl.com>
+ Files: hints/hpux.sh
+
+ Title: "new hints/solaris_2.sh"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0xw80h-0005SV-00@ursa.cus.cam.ac.uk>
+ Files: hints/solaris_2.sh
+ Branch: maint-5.004/perl
+ ! README.os2 README.vms cop.h ext/DynaLoader/dl_hpux.xs
+ ! ext/ODBM_File/ODBM_File.xs ext/POSIX/POSIX.xs
+ ! ext/POSIX/hints/linux.pl global.sym hints/aix.sh
+ ! hints/bsdos.sh hints/dec_osf.sh hints/hpux.sh hints/linux.sh
+ ! hints/netbsd.sh hints/openbsd.sh hints/os2.sh hints/qnx.sh
+ ! hints/solaris_2.sh hints/svr4.sh lib/Cwd.pm
+ ! lib/ExtUtils/MM_OS2.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/File/Basename.pm lib/File/Path.pm lib/blib.pm op.c
+ ! os2/Changes os2/Makefile.SHs os2/OS2/PrfDB/PrfDB.xs os2/os2.c
+ ! os2/perl2cmd.pl perl.c perl.h pod/perlguts.pod pod/pod2man.PL
+ ! pp_ctl.c pp_hot.c pp_sys.c proto.h t/lib/filecopy.t
+ ! t/op/magic.t util.c utils/perldoc.PL vms/config.vms
+ ! vms/descrip.mms vms/ext/Filespec.pm vms/ext/filespec.t
+ ! vms/genconfig.pl vms/perly_c.vms vms/perly_h.vms vms/test.com
+ ! vms/vms.c
+____________________________________________________________________________
+[ 885] By: gsar on 1998/04/08 01:14:29
+ Log: small tweaks to make it compile (doesn't run)
+ Branch: asperl
+ ! objpp.h win32/Makefile win32/config.bc win32/config.gc
+ ! win32/config.vc win32/makefile.mk
+____________________________________________________________________________
+[ 884] By: gsar on 1998/04/08 00:14:13
+ Log: integrate mainline changes
+ Branch: asperl
+ +> Changes5.004 ext/Thread/Thread/Signal.pm
+ +> lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
+ +> lib/ExtUtils/inst t/op/hashwarn.t
+ ! ObjXSub.h embedvar.h interp.sym intrpvar.h objpp.h
+ !> (integrate 127 files)
+____________________________________________________________________________
+[ 883] By: gsar on 1998/04/06 20:21:20
+ Log: make old DomainName() implementation the default (so Win95
+ is happy)
+ Branch: win32/perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 882] By: gsar on 1998/04/05 23:32:33
+ Log: fix memory leaks in offer_nice_chunk()
+ Branch: win32/perl
+ ! perl.h sv.c
+____________________________________________________________________________
+[ 881] By: gsar on 1998/04/04 23:11:52
+ Log: set up PUSHSTACK for __DIE__ and __WARN__ hooks also
+ Branch: win32/perl
+ ! cop.h util.c
+____________________________________________________________________________
+[ 880] By: gsar on 1998/04/04 22:35:54
+ Log: fix refcounting of GvSTASH() when glob becomes nought
+ (this takes care of the "unbalanced strtab refcount" problem)
+ Branch: win32/perl
+ ! sv.c
+____________________________________________________________________________
+[ 879] By: gsar on 1998/04/04 21:16:17
+ Log: change 866 was incomplete
+ Branch: win32/perl
+ ! hv.c
+____________________________________________________________________________
+[ 878] By: gsar on 1998/04/04 20:31:56
+ Log: fixes for various noises under PERL_DESTRUCT_LEVEL
+ Branch: win32/perl
+ ! cop.h perl.c pp_ctl.c
+____________________________________________________________________________
+[ 877] By: gsar on 1998/04/04 17:55:30
+ Log: integrate mainline
+ Branch: win32/perl
+ +> Changes5.004
+ !> Changes MANIFEST sv.c t/op/misc.t
+____________________________________________________________________________
+[ 876] By: gsar on 1998/04/04 17:26:32
+ Log: remove __declspec kludge in sdbm.h in favor of setting a
+ flag for static symbols
+ Branch: win32/perl
+ ! EXTERN.h ext/SDBM_File/sdbm/Makefile.PL
+ ! ext/SDBM_File/sdbm/sdbm.h
+____________________________________________________________________________
+[ 875] By: gsar on 1998/04/04 01:11:57
+ Log: fix order of init
+ Message-Id: <3.0.5.32.19980403135815.009d2440@osshe.edu>
+ Date: Fri, 03 Apr 1998 13:58:15 PST
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: [PATCH 5.004_64] perl dies in perl_construct when compiled
+ with MULTIPLICITY
+ Branch: win32/perl
+ ! perl.c
+____________________________________________________________________________
+[ 874] By: gsar on 1998/04/04 00:34:59
+ Log: the EXTCONST in sdbm.h breaks SDBM on Borland, since
+ the declared symbol is not in a DLL (so kludge it)
+ Branch: win32/perl
+ ! ext/SDBM_File/sdbm/sdbm.h
+____________________________________________________________________________
+[ 873] By: TimBunce on 1998/04/03 22:17:40
+ Log: Title: "FileHandle Documentation patch"
+ From: "Darren/Torin/Who Ever..." <torin@daft.com>
+ Msg-ID: <87emzqo49g.fsf@perv.daft.com>
+ Files: lib/FileHandle.pm
+ Branch: maint-5.004/perl
+ ! lib/FileHandle.pm
+____________________________________________________________________________
+[ 872] By: TimBunce on 1998/04/03 22:01:03
+ Log: Documentation and documentation related patches:
+
+ ------ BUILD PROCESS ------
+
+ Title: "Docs re /usr/bin/perl quasi-standard location"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.971117080737.12318C-100000@usertest.teleport.com>
+ Files: INSTALL pod/perlrun.pod
+
+ ------ DOCUMENTATION ------
+
+ Title: "/RFC|RFC-1305/ non-greedy"
+ From: Jan-Pieter Cornet <johnpc@xs4all.nl>
+ Msg-ID: <6epo02$c4r$1@xs1.xs4all.nl>
+ Files: pod/perlre.pod
+
+ Title: "5.004_04: perlhist.pod, buildtoc, perltoc.pod"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199802191543.RAA29231@alpha.hut.fi>
+ Files: pod/perl.pod pod/perlhist.pod pod/perltoc.pod pod/buildtoc
+
+ Title: "5.004_04: pod/perlfunc.pod: i18n example for localtime()"
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199711141555.RAA18875@alpha.hut.fi>
+ Files: pod/perlfunc.pod
+
+ Title: "typo-fix and suggestion for perlguts.pod"
+ From: h.sanden@elsevier.nl (Hugo van der Sanden)
+ Msg-ID: <199803051543.QAA03097@dorlas.elsevier.nl>
+ Files: pod/perlguts.pod
+
+ Title: "perlfunc/syscall curiosity"
+ From: Roderick Schertler <roderick@argon.org>, Tkil
+ <tkil@reptile.scrye.com>
+ Msg-ID: <199711302259.PAA02134@reptile.scrye.com>,
+ <pziut8snva.fsf@eeyore.ibcinc.com>
+ Files: pod/perlfunc.pod
+
+ Title: "Document sprintf %#x behaviour for zero value"
+ From: ilya@math.ohio-state.edu (Ilya Zakharevich)
+ Msg-ID: <1997Nov5.185959.2539604@cor.newman>
+ Files: pod/perlfunc.pod
+
+ Title: "NUL termination (was Re: STOP THE PRESSES)"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0xsn5M-0002gw-00@ursa.cus.cam.ac.uk>
+ Files: pod/perlguts.pod
+
+ Title: "Typo fix."
+ From: abigail@fnx.com
+ Msg-ID: <19971101120114.1030.qmail@betelgeuse.wayne.fnx.com>
+ Files: pod/perlop.pod pod/perlvar.pod
+
+ Title: "5.004_63 perlrun.pod: _DEBUG_MSTATS"
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Msg-ID: <9803181940.AA22587@o09.xray.mpe.mpg.de>
+ Files: pod/perlrun.pod
+
+ Title: "Re: Conservative C<*x = undef> patch"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0yCjHT-0005Dt-00@ursa.cus.cam.ac.uk>
+ Files: pod/perltrap.pod
+
+ Title: "perlfunc.pod for flock()"
+ From: "Jeremy D. Zawodny" <jzawodn@wcnet.org>
+ Msg-ID: <3.0.5.32.19971118203119.00a723e0@woody.wcnet.org>
+ Files: pod/perlfunc.pod
+
+ Title: "buglet: 'perltoc' not mentioned in perl.pod"
+ From: Tkil <tkil@scrye.com>
+ Msg-ID: <19971127035036.17668.qmail@scrye.com>
+ Files: pod/perl.pod
+
+ Title: "for() and map() peculiarity"
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0y4YAa-0003Qu-00@ursa.cus.cam.ac.uk>
+ Files: pod/perlsyn.pod
+
+ Title: "Re: new text for perlsec"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.980328100418.22321T-100000@user2.teleport.com>
+ Files: pod/perlsec.pod
+
+ Title: "perldsc's debugger x command"
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <10669.878352893@eeyore.ibcinc.com>
+ Files: pod/perldsc.pod
+
+ Title: "perlre.pod"
+ From: Ted Ashton <ashted@southern.edu>
+ Msg-ID: <199802271501.KAA09279@ns.southern.edu>
+ Files: pod/perlre.pod
+
+ Title: "Re: printf and $\", "printf and $\"
+ From: Roderick Schertler <roderick@argon.org>, Tom Phoenix
+ <rootbeer@teleport.com>, nag <nick@flirble.org>
+ Msg-ID: <199711141918.TAA08096@flirble.org>,
+ <Pine.GSO.3.96.971117085421.12318J-100000@usertest.teleport
+ .com>, <pzyb2ncr42.fsf@eeyore.ibcinc.com>
+ Files: pod/perlfunc.pod
+
+ Title: "recv() typo"
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <12064.877012073@eeyore.ibcinc.com>
+ Files: pod/perlfunc.pod
+
+ Title: "truncate return value"
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <5490.878337883@eeyore.ibcinc.com>
+ Files: pod/perlfunc.pod
+
+ Title: "update to perlbook.pod"
+ From: "Nathan V. Patwardhan" <nvp@mediaone.net>, Randal Schwartz
+ <merlyn@stonehenge.com>, Stephen Potter
+ <spp@psasolar.colltech.com>, Tom Phoenix
+ <rootbeer@teleport.com>
+ Msg-ID: <199803241354.HAA23938@psasolar.psa.pencom.com>,
+ <199803241441.OAA01261@mediaone.net>,
+ <8clnu0i05k.fsf@gadget.cscaper.com>,
+ <Pine.GSO.3.96.980324111957.15753C-100000@user1.teleport.com>
+ Files: pod/perlbook.pod
+
+ Title: "utime documentation"
+ From: "Brandon S. Allbery KF8NH" <bsa@kf8nh.apk.net>, "M.J.T. Guy"
+ <mjtg@cus.cam.ac.uk>
+ Msg-ID: <199802180256.VAA11369@speaker.kf8nh.apk.net>,
+ <E0y4qd6-0000P6-00@ursa.cus.cam.ac.uk>
+ Files: pod/perlfunc.pod
+
+ Title: "(well, doc patch) use of // requires successful match"
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <pz7mb4bips.fsf@eeyore.ibcinc.com>
+ Files: pod/perlop.pod
+
+ ------ LIBRARY AND EXTENSIONS ------
+
+ Title: "MakeMaker PM doc patch and a DIR buglet"
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Msg-ID: <9711101050.AA13868@o09.xray.mpe.mpg.de>
+ Files: lib/ExtUtils/MakeMaker.pm
+
+ Title: "bareword clarification for constant.pm"
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <6460.878143077@eeyore.ibcinc.com>
+ Files: lib/constant.pm
+
+ Title: "integer rand - bug or feature?"
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <pzhg8lvgta.fsf@eeyore.ibcinc.com>
+ Files: lib/integer.pm
+
+ ------ OTHER CHANGES ------
+
+ Title: "FileHandle Documentation patch"
+ From: "Darren/Torin/Who Ever..." <torin@daft.com>
+ Msg-ID: <87emzqo49g.fsf@perv.daft.com>
+
+ Title: "perl5.004_61 myconfig updates"
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980305150629.11530G-100000@newton.phys>
+ Files: myconfig
+
+ Title: "small fixups in pod2latex.PL"
+ From: "Darren/Torin/Who Ever..." <torin@daft.com>
+ Msg-ID: <873eg6o3v2.fsf@perv.daft.com>
+
+ ------ PORTABILITY - GENERAL ------
+
+ Title: "Misc doc fixes for README.VMS"
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Msg-ID: <3.0.5.32.19980121113134.00924a20@osshe.edu>
+ Files: README.vms
+
+ Title: "moved DynaLib"
+ From: John Tobey <jtobey@channel1.com>
+ Msg-ID: <199710182332.XAA21630@remote212>
+ Files: ext/DynaLoader/DynaLoader.pm.PL
+
+ ------ UTILITIES ------
+
+ Title: "Searching for FAQs (patch to perldoc)"
+ From: Piers Cawley <pdcawley@bofh.org.uk>, Russ Allbery <rra@stanford.edu>
+ Msg-ID: <m3d8gsb8uk.fsf@windlord.Stanford.EDU>,
+ <m3iuqkfmiq.fsf@tower.bofh.org.uk>
+ Files: utils/perldoc.PL
+
+ Title: "perldoc"
+ From: Ted Ashton <ashted@southern.edu>
+ Msg-ID: <199802271510.KAA10506@ns.southern.edu>
+ Files: utils/perldoc.PL
+
+ Title: "perldoc -f not using pod2man"
+ From: Russ Allbery <rra@stanford.edu>
+ Msg-ID: <m3hg4f9vyy.fsf@windlord.Stanford.EDU>
+ Files: utils/perldoc.PL
+
+ Title: "perldoc -m should not require pod"
+ From: Robin Houston <robin@nml.guardian.co.uk>
+ Msg-ID: <199803241319.NAA24777@stringfellow.guardian.co.uk>
+ Files: utils/perldoc.PL
+
+ Title: "small fix for perldoc in perl 5.004_04"
+ From: Julian Yip <julian@imoney.com>
+ Msg-ID: <Roam.SIMC.2.0.6.884805579.5280.julian@imoney.com>
+ Files: utils/perldoc.PL
+ Branch: maint-5.004/perl
+ - ext/DynaLoader/DynaLoader.pm
+ ! Changes Configure INSTALL README.vms
+ ! ext/DynaLoader/DynaLoader.pm.PL ext/Socket/Socket.pm
+ ! lib/ExtUtils/MakeMaker.pm lib/Tie/Hash.pm lib/constant.pm
+ ! lib/integer.pm myconfig pod/buildtoc pod/checkpods.PL
+ ! pod/perl.pod pod/perlbook.pod pod/perldelta.pod
+ ! pod/perldiag.pod pod/perldsc.pod pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perlhist.pod pod/perllocale.pod
+ ! pod/perlmod.pod pod/perlop.pod pod/perlre.pod pod/perlrun.pod
+ ! pod/perlsec.pod pod/perlstyle.pod pod/perlsyn.pod
+ ! pod/perltoc.pod pod/perltrap.pod pod/perlvar.pod
+ ! pod/pod2latex.PL toke.c utils/perldoc.PL
+
+----------------
+Version 5.004_64
+----------------
+
+____________________________________________________________________________
+[ 871] By: mbeattie on 1998/04/03 13:38:59
+ Log: Update Changes5.004 and Changes, fix MANIFEST
+ Branch: perl
+ + Changes
+ ! Changes5.004 MANIFEST
+____________________________________________________________________________
+[ 870] By: mbeattie on 1998/04/03 13:36:29
+ Log: Rename Changes to Changes5.004 (via an integrate)
+ Branch: perl
+ +> Changes5.004
+ - Changes
+____________________________________________________________________________
+[ 869] By: mbeattie on 1998/04/03 11:53:00
+ Log: Subject: [PATCH] Perl 5.005b1t2/perl5.004_63 (resend)
+ Date: Wed, 18 Mar 1998 01:24:20 +0100 (MET)
+ From: Jan-Pieter Cornet <johnpc@xs4all.net>
+ Branch: perl
+ ! sv.c t/op/misc.t
+____________________________________________________________________________
+[ 868] By: mbeattie on 1998/04/03 11:16:26
+ Log: Integrate win32 branch into mainline
+ Branch: perl
+ !> (integrate 31 files)
+____________________________________________________________________________
+[ 867] By: gsar on 1998/04/03 08:47:55
+ Log: config.* fixes
+ Branch: win32/perl
+ ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 866] By: gsar on 1998/04/03 07:22:50
+ Log: fixup hv_free_ent() to not fail on null HeVAL()
+ Branch: win32/perl
+ ! hv.c perl.c
+____________________________________________________________________________
+[ 865] By: gsar on 1998/04/03 07:06:12
+ Log: integrate mainline
+ Branch: win32/perl
+ +> ext/Thread/Thread/Signal.pm t/op/hashwarn.t
+ !> (integrate 71 files)
+____________________________________________________________________________
+[ 864] By: gsar on 1998/04/03 06:59:37
+ Log: implement stack-of-stacks so that magic invocations don't
+ invalidate local stack pointer
+ Branch: win32/perl
+ ! av.c cop.h deb.c embed.h embedvar.h global.sym gv.c interp.sym
+ ! intrpvar.h mg.c op.c perl.c pp.h pp_ctl.c pp_sys.c proto.h
+ ! scope.c sv.c t/op/runlevel.t thrdvar.h util.c
+____________________________________________________________________________
+[ 863] By: gsar on 1998/04/03 01:26:09
+ Log: add AS patch#15
+ Branch: asperl
+ ! ipenv.h lib/ExtUtils/MM_Unix.pm perl.c perlenv.h
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/config_h.PL win32/config_sh.PL win32/runperl.c
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 862] By: mbeattie on 1998/04/02 17:08:43
+ Log: Subject: [PATCH for 5.004_63] Config_63-04-05.diff
+ Date: Thu, 2 Apr 1998 11:56:51 -0500 (EST)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Branch: perl
+ ! Configure ext/Socket/Socket.xs myconfig
+____________________________________________________________________________
+[ 861] By: mbeattie on 1998/04/02 16:32:53
+ Log: Change 854 added { NULL, 0 } to sdbm.h which needs to be {0, 0}
+ since appropriate headers aren't included.
+ Branch: perl
+ ! ext/SDBM_File/sdbm/sdbm.h
+____________________________________________________________________________
+[ 860] By: mbeattie on 1998/04/02 16:17:11
+ Log: Bumped patchlevel.h to 64
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 859] By: mbeattie on 1998/04/02 16:16:26
+ Log: Subject: Re: [PATCH] 5.004_63: UNICOS 9
+ Date: Fri, 20 Mar 1998 19:39:28 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! hints/unicos.sh regcomp.h
+____________________________________________________________________________
+[ 858] By: mbeattie on 1998/04/02 16:13:24
+ Log: Subject: [PATCH] Re: Odd number of elements in hash list.
+ Date: Sat, 28 Mar 1998 15:26:46 -0800 (PST)
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Branch: perl
+ + t/op/hashwarn.t
+ ! MANIFEST pod/perldiag.pod pp.c pp_hot.c
+____________________________________________________________________________
+[ 857] By: mbeattie on 1998/04/02 16:08:43
+ Log: Subject: [PATCH 5.004_(04|63)] Close VMS security hole
+ Date: Sat, 28 Mar 1998 02:05:03 -0500 (EST)
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Branch: perl
+ ! vms/vms.c
+____________________________________________________________________________
+[ 856] By: mbeattie on 1998/04/02 16:07:44
+ Log: Subject: [PATCH] mv-if-diff
+ Date: Fri, 27 Mar 98 18:06:11 GMT
+ From: Robin Barker <rmb1@cise.npl.co.uk>
+ Branch: perl
+ ! mv-if-diff
+____________________________________________________________________________
+[ 855] By: mbeattie on 1998/04/02 16:06:54
+ Log: From: Jan-Pieter Cornet <johnpc@xs4all.net>
+ Subject: Re: [PATCH] [BUG 5.004_63] define/set of PERL_DESTRUCT_LEVEL
+ Date: Fri, 27 Mar 1998 02:11:21 +0100 (MET)
+ Subject: [PATCH] another destruct_level fix
+ Date: Mon, 30 Mar 1998 23:48:12 +0200 (MET DST)
+ Branch: perl
+ ! perl.c sv.c
+____________________________________________________________________________
+[ 854] By: mbeattie on 1998/04/02 16:03:37
+ Log: Subject: Next wave of _63 VMS patches
+ Date: Thu, 26 Mar 1998 15:11:50 -0500 (EST)
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Branch: perl
+ ! EXTERN.h INTERN.h ext/SDBM_File/Makefile.PL
+ ! ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/dba.c
+ ! ext/SDBM_File/sdbm/dbd.c ext/SDBM_File/sdbm/dbu.c
+ ! ext/SDBM_File/sdbm/hash.c ext/SDBM_File/sdbm/pair.c
+ ! ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
+ ! ext/Thread/io.t installperl lib/ExtUtils/MM_VMS.pm
+ ! lib/Net/Ping.pm perldir.h perlsdio.h t/lib/english.t
+ ! vms/config.vms vms/descrip.mms vms/ext/Filespec.pm
+ ! vms/ext/Stdio/0README.txt vms/ext/Stdio/Stdio.pm
+ ! vms/ext/Stdio/Stdio.xs vms/ext/Stdio/test.pl
+ ! vms/ext/filespec.t vms/genconfig.pl vms/perly_c.vms vms/vms.c
+ ! vms/vmsish.h
+____________________________________________________________________________
+[ 853] By: mbeattie on 1998/04/02 15:55:46
+ Log: Subject: [PATCH 5.00463] Confusing error from perl -e "x'"
+ Date: Wed, 25 Mar 1998 17:43:17 -0500 (EST)
+ From: Hans Mulder <hansmu@xs4all.nl>
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 852] By: mbeattie on 1998/04/02 15:54:24
+ Log: Subject: [PATCH] small fixups in pod2latex.PL
+ Date: 25 Mar 1998 13:30:25 -0800
+ From: "Darren/Torin/Who Ever..." <torin@daft.com>
+ Branch: perl
+ ! pod/pod2latex.PL
+____________________________________________________________________________
+[ 851] By: mbeattie on 1998/04/02 15:50:58
+ Log: Subject: [PATCH] hints/irix_6.sh with GCC
+ Date: Tue, 24 Mar 1998 12:25:10 -0800 (EST)
+ From: kstar@chapin.edu (Kurt D. Starsinic)
+ Branch: perl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 850] By: mbeattie on 1998/04/02 15:45:33
+ Log: Subject: [PATCH] perldoc -m
+ Date: Tue, 24 Mar 1998 13:19:38 GMT
+ From: Robin Houston <robin@nml.guardian.co.uk>
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 849] By: mbeattie on 1998/04/02 15:42:52
+ Log: Subject: [PATCH for 5.004_63] dos-djgpp update
+ Date: Mon, 23 Mar 1998 14:13:46 +0100
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Branch: perl
+ ! djgpp/config.over hints/dos_djgpp.sh
+____________________________________________________________________________
+[ 848] By: mbeattie on 1998/04/02 15:38:19
+ Log: Subject: [PATCH] Stale SP in pp_substr
+ Date: Thu, 19 Mar 1998 21:28:02 -0600 (CST)
+ From: Stephen McCamant <alias@mcs.com>
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 847] By: mbeattie on 1998/04/02 15:36:33
+ Log: Add missing export of "nice" to ext/POSIX/POSIX.pm (Phil Tait)
+ Branch: perl
+ ! ext/POSIX/POSIX.pm
+____________________________________________________________________________
+[ 846] By: mbeattie on 1998/04/02 15:34:36
+ Log: Subject: [PATCH] 5.004_63: further -e patching
+ Date: Wed, 18 Mar 1998 23:21:08 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! perl.c pod/perldiag.pod
+____________________________________________________________________________
+[ 845] By: mbeattie on 1998/04/02 15:25:18
+ Log: Andy Dougherty's configuration patches (Config_63-01 up to 04).
+ Branch: perl
+ ! Configure INSTALL Policy_sh.SH Porting/Glossary
+ ! Porting/config.sh Porting/config_H config_h.SH
+ ! ext/POSIX/POSIX.xs handy.h hints/hpux.sh myconfig perlsock.h
+ ! pp.c pp_sys.c regexec.c
+____________________________________________________________________________
+[ 844] By: mbeattie on 1998/04/02 14:28:17
+ Log: Subject: [PATCH 5.004_63] perlrun.pod: PERL_DEBUG_MSTATS
+ Date: Wed, 18 Mar 1998 20:40:19 +0100
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Branch: perl
+ ! pod/perlrun.pod
+____________________________________________________________________________
+[ 843] By: mbeattie on 1998/04/02 14:26:52
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: 5.004_63 picky compiler fixes [PATCH]
+ Date: Wed, 18 Mar 1998 09:36:32 -0800
+ Subject: [PATCH 5.004_63] Fix function prototype with long doubles
+ Date: Wed, 18 Mar 1998 14:48:19 -0800
+ Branch: perl
+ ! ext/POSIX/POSIX.xs ext/Thread/Thread.xs vms/vms.c
+____________________________________________________________________________
+[ 842] By: mbeattie on 1998/04/02 14:22:41
+ Log: From: Stephen Potter <spp@psasolar.colltech.com>
+ Subject: Re: doc: perlrun typo
+ Date: Wed, 18 Mar 1998 10:06:55 -0600
+ Subject: Re: [PATCH 5.004_63] PerlLIO abstraction cleanup
+ Date: Tue, 24 Mar 1998 21:20:51 -0600
+ Branch: perl
+ ! mg.c perl.c pod/perlrun.pod pp_hot.c pp_sys.c util.c
+____________________________________________________________________________
+[ 841] By: mbeattie on 1998/04/02 14:17:31
+ Log: Subject: [PATCH] Add "Full 64 bit support" to Todo; document Todo in pumpkin.pod
+ Date: Wed, 18 Mar 1998 12:44:58 +0100
+ From: Dominic Dunlop <domo@vo.lu>
+ Branch: perl
+ ! Porting/pumpkin.pod Todo
+____________________________________________________________________________
+[ 840] By: mbeattie on 1998/04/02 14:14:22
+ Log: Subject: [PATCH] Configure hints/ patches
+ Date: Wed, 18 Mar 1998 02:47:38 +0100 (MET)
+ From: Jan-Pieter Cornet <johnpc@xs4all.net>
+ Branch: perl
+ ! hints/linux.sh hints/qnx.sh
+____________________________________________________________________________
+[ 839] By: mbeattie on 1998/04/02 14:13:13
+ Log: Remove duplicate code in cygwin32/perlgcc (Blair Zajac)
+ Branch: perl
+ ! cygwin32/perlgcc
+____________________________________________________________________________
+[ 838] By: gsar on 1998/03/28 05:01:57
+ Log: fix Env.pm to weed out illegal names
+ Branch: win32/perl
+ ! lib/Env.pm
+____________________________________________________________________________
+[ 837] By: gsar on 1998/03/28 04:39:43
+ Log: fix typo in makefile.mk
+ Branch: win32/perl
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 836] By: gsar on 1998/03/23 17:40:15
+ Log: add file: to installhtml URLs
+ Branch: win32/perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 835] By: mbeattie on 1998/03/18 11:03:11
+ Log: Add Thread::Signal to run signal handlers reliably in a new thread
+ Branch: perl
+ + ext/Thread/Thread/Signal.pm
+ ! MANIFEST ext/Thread/Thread.xs
+
+----------------
+Version 5.004_63
+----------------
+
+____________________________________________________________________________
+[ 834] By: mbeattie on 1998/03/17 16:19:10
+ Log: Policy_sh.SH had extra $ in pager=$pager comment (Hallvard B Furuseth)
+ Branch: perl
+ ! Policy_sh.SH
+____________________________________________________________________________
+[ 833] By: mbeattie on 1998/03/17 16:11:02
+ Log: Integrate win32 branch into mainline.
+ Branch: perl
+ !> regcomp.c win32/config.bc win32/config.gc win32/config.vc
+ !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ !> win32/win32.c
+____________________________________________________________________________
+[ 832] By: gsar on 1998/03/17 14:32:39
+ Log: propagate bugfix @ change831 from asperl
+ Branch: win32/perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 831] By: gsar on 1998/03/17 14:02:51
+ Log: fix buggy order of free() in regcomp.c (from AS)
+ Branch: asperl
+ ! regcomp.c
+____________________________________________________________________________
+[ 830] By: gsar on 1998/03/17 01:10:54
+ Log: add a part of AS patch#14, backout incomplete variable
+ name changes for gcc. Builds and tests under VC/BC once again.
+ Branch: asperl
+ ! bytecode.h mg.c pp.c pp_ctl.c pp_hot.c toke.c
+____________________________________________________________________________
+[ 829] By: gsar on 1998/03/16 23:49:18
+ Log: stray tweak to win32.c
+ Branch: win32/perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 828] By: gsar on 1998/03/16 22:06:03
+ Log: update win32/config* files
+ Branch: win32/perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 827] By: gsar on 1998/03/16 19:09:30
+ Log: trivial integrate of mainline
+ Branch: win32/perl
+ +> lib/ExtUtils/Installed.pm lib/ExtUtils/Packlist.pm
+ +> lib/ExtUtils/inst
+ !> (integrate 61 files)
+____________________________________________________________________________
+[ 826] By: mbeattie on 1998/03/16 16:39:23
+ Log: newCONSTSUB had private MY_start_subparse.
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 825] By: mbeattie on 1998/03/16 16:36:55
+ Log: Missing dTHR in hv_fetch_ent when statics moved to thread struct.
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 824] By: mbeattie on 1998/03/16 16:27:43
+ Log: Added missing entry for lib/ExtUtils/Packlist.pm to MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 823] By: mbeattie on 1998/03/16 16:26:02
+ Log: Missed p4 add of lib/ExtUtils/Packlist.pm in change 814.
+ Branch: perl
+ + lib/ExtUtils/Packlist.pm
+____________________________________________________________________________
+[ 822] By: mbeattie on 1998/03/16 16:22:58
+ Log: Bump patchlevel.h to 63.
+ Branch: perl
+ ! ext/IO/IO.xs patchlevel.h
+ !> (integrate 41 files)
+____________________________________________________________________________
+[ 821] By: mbeattie on 1998/03/16 16:18:35
+ Log: newCONSTSUB added (XSUB equivalent for inlinable sub () { 123 }).
+ Subject: Bundling builtin.pm and newCONSTSUB with the core?
+ From: jan.dubois@ibm.net (Jan Dubois)
+ Date: Sun, 15 Mar 1998 19:09:05 +0100
+ Branch: perl
+ ! embed.h global.sym op.c pod/perlguts.pod proto.h
+____________________________________________________________________________
+[ 820] By: mbeattie on 1998/03/16 16:02:50
+ Log: Subject: [PATCH] STRESS_REALLOC
+ Date: Fri, 13 Mar 1998 22:28:19 -0600 (CST)
+ From: Stephen McCamant <alias@mcs.com>
+ Branch: perl
+ ! malloc.c perl.c scope.c
+____________________________________________________________________________
+[ 819] By: mbeattie on 1998/03/16 16:01:06
+ Log: Subject: [BUG+PATCH] _62 with -DDEBUGGING and -Duseperlio
+ Date: Fri, 13 Mar 1998 23:21:25 +0100
+ From: Jan-Pieter Cornet <john@pc.xs4all.nl>
+ Branch: perl
+ ! perly.c
+____________________________________________________________________________
+[ 818] By: mbeattie on 1998/03/16 15:59:16
+ Log: Subject: [Configure PATCH] for OS/2
+ Date: Fri, 13 Mar 1998 16:18:12 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ [Two hunks to Configure failed to apply due to clashes]
+ Branch: perl
+ ! Configure hints/os2.sh
+____________________________________________________________________________
+[ 817] By: mbeattie on 1998/03/16 15:55:28
+ Log: Subject: [PATCH 5.004_62] VMS updates (direct)
+ Date: Thu, 12 Mar 1998 16:02:29 -0500 (EST)
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ [Needed manual tweaks on vms/config.vms since it clashed with other
+ patches. I may have got it wrong.]
+ Branch: perl
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_VMS.pm
+ ! lib/ExtUtils/Mksymlists.pm perl.h pp.c pp_hot.c regcomp.c
+ ! regcomp.h utils/perldoc.PL vms/config.vms vms/descrip.mms
+ ! vms/ext/Stdio/Stdio.pm vms/ext/filespec.t vms/fndvers.com
+ ! vms/gen_shrfls.pl vms/genconfig.pl vms/sockadapt.h
+ ! vms/test.com vms/vms.c vms/vmsish.h
+____________________________________________________________________________
+[ 816] By: mbeattie on 1998/03/16 15:26:04
+ Log: Subject: [PATCH] Let h2xs read multiple header files
+ Date: Tue, 10 Mar 1998 09:35:42 -0500 (EST)
+ From: Benjamin Sugars <bsugars@canoe.ca>
+ Branch: perl
+ ! utils/h2xs.PL
+____________________________________________________________________________
+[ 815] By: mbeattie on 1998/03/16 15:24:12
+ Log: Subject: Re: Almost OK: Perl 5.004_62 on VMS 7.1
+ Date: Mon, 09 Mar 1998 09:18:56 -0800
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Branch: perl
+ ! vms/config.vms
+____________________________________________________________________________
+[ 814] By: mbeattie on 1998/03/16 13:17:14
+ Log: Subject: PATCH for 5.004_62 : Add .packlist handling classes to ExtUtils
+ Date: Sun, 08 Mar 1998 12:50:23 +0000
+ From: Alan Burlison <alan.burlison@UK.Sun.COM>
+ plus manual update of MANIFEST
+ Branch: perl
+ + lib/ExtUtils/Installed.pm lib/ExtUtils/inst
+ ! MANIFEST installman installperl lib/ExtUtils/Install.pm
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 813] By: mbeattie on 1998/03/16 13:08:55
+ Log: From: Blair Zajac <blair@gps.caltech.edu>
+ Subject: PATCH: util.c and util.h function declarations do not match
+ Date: Fri, 6 Mar 1998 10:29:29 -0800 (PST)
+ Subject: PATCH: cgywin32 patch for perlgcc
+ Date: Fri, 6 Mar 1998 11:15:36 -0800 (PST)
+ Subject: PATCH: perl5.004_62 on cygwin32
+ Date: Fri, 6 Mar 1998 11:57:35 -0800 (PST)
+ Branch: perl
+ ! Configure cygwin32/perlgcc cygwin32/perlld pp_sys.c x2p/util.c
+____________________________________________________________________________
+[ 812] By: mbeattie on 1998/03/16 12:55:39
+ Log: From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Subject: [PATCH 5.004_62} Config_62-01 patch available.
+ Date: Mon, 9 Mar 1998 15:23:33 -0500 (EST)
+ Subject: [PATCH 5.004_62] Tiny hint file updates
+ Date: Mon, 9 Mar 1998 13:21:46 -0500 (EST)
+ Branch: perl
+ ! Configure Porting/Glossary Porting/config.sh Porting/config_H
+ ! config_h.SH ext/ODBM_File/ODBM_File.xs handy.h hints/aix.sh
+ ! hints/dec_osf.sh hints/dos_djgpp.sh hints/freebsd.sh
+ ! hints/irix_6.sh hints/irix_6_0.sh hints/irix_6_1.sh
+ ! hints/os2.sh hints/solaris_2.sh patchlevel.h perl.c perl.h
+ ! perllio.h pod/perldiag.pod pp_sys.c vms/config.vms
+____________________________________________________________________________
+[ 811] By: mbeattie on 1998/03/16 12:13:55
+ Log: DOS djgpp updates:
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Subject: [PATCH for 5.004_61] dos-djgpp update
+ Date: Fri, 6 Mar 1998 10:41:01 +0100
+ Subject: [PATCH 5.004_62] dos-djgpp update
+ Date: Thu, 12 Mar 1998 13:34:51 +0100
+ Branch: perl
+ ! djgpp/config.over hints/dos_djgpp.sh
+____________________________________________________________________________
+[ 810] By: gsar on 1998/03/16 08:48:17
+ Log: integrate mainline
+ Branch: win32/perl
+ !> pp_sys.c
+____________________________________________________________________________
+[ 809] By: gsar on 1998/03/16 08:44:37
+ Log: various changes to get asperl working under Borland
+ (passes all tests when built under PERL_OBJECT)
+ Branch: asperl
+ ! ObjXSub.h ext/Opcode/Opcode.xs globals.c mg.c objpp.h op.c
+ ! perl.h perly.c perly.c.diff pp.c pp_ctl.c pp_hot.c pp_sys.c
+ ! proto.h scope.h sv.c toke.c win32/Makefile win32/config_H.bc
+ ! win32/config_H.gc win32/config_H.vc win32/makedef.pl
+ ! win32/makefile.mk win32/runperl.c win32/win32.c win32/win32.h
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 808] By: gsar on 1998/03/12 19:50:20
+ Log: set sockets to nonoverlapped mode for every thread
+ Message-Id: <35081FE4.965A484D@enteract.com>
+ Date: Thu, 12 Mar 1998 11:48:20 CST
+ From: Steve Nielsen <spn@enteract.com>
+ Subject: [PATCH 5.004_62] win32: set sockopt on a per-thread basis
+ Branch: win32/perl
+ ! win32/win32.h win32/win32sck.c
+____________________________________________________________________________
+[ 807] By: gsar on 1998/03/12 19:26:54
+ Log: add AS patch#13
+ Branch: asperl
+ ! win32/Makefile
+____________________________________________________________________________
+[ 806] By: gsar on 1998/03/12 00:51:08
+ Log: added AS patch#12 with minor changes
+ Branch: asperl
+ ! ObjXSub.h bytecode.h byterun.c doio.c iplio.h
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm
+ ! lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp objpp.h perl.c
+ ! perllio.h proto.h regcomp.c win32/Makefile win32/config_h.PL
+ ! win32/runperl.c
+____________________________________________________________________________
+[ 805] By: gsar on 1998/03/10 20:35:10
+ Log: reinstate some standard sig_names to avoid noise from
+ modules (and in hopes of making them _do_ something in future)
+ Branch: win32/perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+____________________________________________________________________________
+[ 804] By: gsar on 1998/03/10 20:33:05
+ Log: mingw32 tweaks
+ Branch: win32/perl
+ ! win32/makefile.mk win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 803] By: gsar on 1998/03/09 20:56:07
+ Log: tweak Win32::DomainName() implementation
+ Branch: win32/perl
+ ! win32/Makefile win32/win32.c
+____________________________________________________________________________
+[ 802] By: gsar on 1998/03/09 03:51:01
+ Log: merge C<local $tied{foo}> patch, also moved statics in
+ [ah]v.c to thrdvar.h
+ Branch: win32/perl
+ ! av.c embedvar.h hv.c scope.c t/op/local.t thrdvar.h
+____________________________________________________________________________
+[ 801] By: gsar on 1998/03/09 02:38:35
+ Log: minor win32 support fixes
+ - add a better implementation of Win32::DomainName() (as
+ suggested by Jutta M. Klebe <jmk@exc.bybyte.de>)
+ - fix opendir() emulation was unsafe what given long paths
+ Branch: win32/perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 800] By: nick on 1998/03/07 09:36:41
+ Log: There has been a 'thaw' in config.h (the ICE has gone ;-))
+ So pp_sys.c needs tweaking otherwise it does not believe getservby*()
+ exist. (Breaks libnet).
+ Branch: perl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 799] By: gsar on 1998/03/07 07:51:28
+ Log: integrate mainline changes
+ Branch: asperl
+ !> (integrate 111 files)
+____________________________________________________________________________
+[ 798] By: gsar on 1998/03/07 07:01:55
+ Log: integrate mainline
+ Branch: win32/perl
+ !> myconfig patchlevel.h
+____________________________________________________________________________
+[ 797] By: gsar on 1998/03/07 06:49:49
+ Log: provide our own popen()/pclose() to fix problems with qx//:
+ - qx// used to always invoke the shell, now does so only when needed
+ - qx// didn't respect PERL5SHELL, now does
+ Branch: win32/perl
+ ! lib/ExtUtils/typemap win32/config_h.PL win32/win32.c
+____________________________________________________________________________
+[ 796] By: gsar on 1998/03/07 01:37:10
+ Log: a missed s/sp/SP/
+ Branch: win32/perl
+ ! lib/ExtUtils/typemap pod/perlcall.pod
+____________________________________________________________________________
+[ 795] By: gsar on 1998/03/07 01:05:21
+ Log: change all 'sp' to 'SP' in code and in the docs. Explicitly
+ mention that local stack pointer should be called SP. This makes the
+ API safer from source incompatibilities down the line.
+ Branch: win32/perl
+ ! av.c doio.c doop.c ext/DB_File/DB_File.xs
+ ! ext/DynaLoader/dl_dld.xs ext/Opcode/Opcode.xs
+ ! ext/POSIX/POSIX.xs ext/Socket/Socket.xs ext/Thread/Thread.xs
+ ! gv.c mg.c op.c os2/OS2/REXX/REXX.xs perl.c pod/perlcall.pod
+ ! pod/perlembed.pod pod/perlguts.pod pod/perlxs.pod pp.c
+ ! pp_ctl.c pp_hot.c pp_sys.c util.c
+
+----------------
+Version 5.004_62
+----------------
+
+____________________________________________________________________________
+[ 794] By: mbeattie on 1998/03/06 09:38:08
+ Log: Subject: [PATCH] perl5.004_61 myconfig updates
+ Date: Thu, 5 Mar 1998 15:10:54 -0500 (EST)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Branch: perl
+ ! myconfig
+____________________________________________________________________________
+[ 793] By: mbeattie on 1998/03/06 09:36:37
+ Log: Bump patchlevel.h to 62.
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 792] By: mbeattie on 1998/03/06 09:35:57
+ Log: Integrate win32 branch into mainline.
+ Branch: perl
+ !> bytecode.h op.c proto.h scope.c win32/Makefile win32/config.bc
+ !> win32/config.gc win32/config.vc win32/config_H.bc
+ !> win32/config_H.gc win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 791] By: gsar on 1998/03/06 06:00:08
+ Log: various
+ - s/PerlIO_fread/PerlIO_read/, the former doesn't exist
+ - add missing prototypes
+ - regenerate win32/config*.?c
+ Branch: win32/perl
+ ! bytecode.h proto.h win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc win32/makefile.mk
+____________________________________________________________________________
+[ 790] By: gsar on 1998/03/06 03:19:23
+ Log: fix typo in Makefile
+ Branch: win32/perl
+ ! win32/Makefile
+____________________________________________________________________________
+[ 789] By: gsar on 1998/03/05 22:55:53
+ Log: integrate mainline
+ Branch: win32/perl
+ !> (integrate 47 files)
+____________________________________________________________________________
+[ 788] By: gsar on 1998/03/05 20:02:09
+ Log: added AS patch#11
+ Message-Id: <01BD4820.AFC70110.dougl@ActiveState.com>
+ Date: Thu, 05 Mar 1998 10:23:04 PST
+ From: Douglas Lankshear <dougl@ActiveState.com>
+
+ This patch fixes a bug I introduced removing duplicate code.
+ -- Doug
+ Branch: asperl
+ ! ObjXSub.h objpp.h win32/runperl.c
+____________________________________________________________________________
+[ 787] By: gsar on 1998/03/05 19:56:17
+ Log: add Nick's dTHR fixes
+ Branch: win32/perl
+ ! op.c scope.c
+____________________________________________________________________________
+[ 786] By: gsar on 1998/03/05 19:54:49
+ Log: maintpatch
+ Message-Id: <199803050749.CAA15206@Orb.Nashua.NH.US>
+ Date: Thu, 05 Mar 1998 02:49:46 EST
+ From: Spider Boardman <spider@orb.nashua.nh.us>
+ Subject: [PATCH] 5.004_04 +MAINT_TRIAL_1 broken when sizeof(int) != sizeof(void
+ Branch: win32/perl
+ ! scope.c
+____________________________________________________________________________
+[ 785] By: mbeattie on 1998/03/05 19:12:14
+ Log: Subject: [5.004_61 PATCH] Make incompatible changes to RE engine NOW
+ Date: Wed, 4 Mar 1998 23:55:54 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! op.c proto.h regcomp.c regexp.h util.c
+____________________________________________________________________________
+[ 784] By: mbeattie on 1998/03/05 19:11:09
+ Log: Subject: [PATCH] Re: perl 5.0061 unable to build on sparc 5 Sol2.5.1 threads.
+ Date: Wed, 4 Mar 1998 10:18:03 GMT
+ From: Nick Ing-Simmons <nik@tiuk.ti.com>
+ Branch: perl
+ ! atomic.h
+____________________________________________________________________________
+[ 783] By: mbeattie on 1998/03/05 19:09:16
+ Log: Subject: Configure patches -01 and -02 for 5.004_61.
+ Date: Tue, 3 Mar 1998 16:41:16 -0500 (EST)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Branch: perl
+ ! Configure INSTALL Policy_sh.SH Porting/Glossary
+ ! Porting/config.sh Porting/config_H Porting/pumpkin.pod
+ ! config_h.SH handy.h hints/README.hints hints/aix.sh
+ ! hints/linux.sh hints/solaris_2.sh hints/unicos.sh
+ ! makedepend.SH myconfig pp_sys.c
+____________________________________________________________________________
+[ 782] By: mbeattie on 1998/03/05 19:05:23
+ Log: Subject: [PATCH] Compiling with OP_IN_REGISTER
+ Date: 03 Mar 1998 18:05:07 +0100
+ From: Gisle Aas <gisle@aas.no>
+ Branch: perl
+ ! perl.h pp_ctl.c
+____________________________________________________________________________
+[ 781] By: mbeattie on 1998/03/05 19:04:34
+ Log: Subject: [PATCH] Make autouse -w-safe
+ Date: Mon, 2 Mar 1998 21:36:02 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! lib/autouse.pm op.c sv.c
+____________________________________________________________________________
+[ 780] By: mbeattie on 1998/03/05 19:02:50
+ Log: Subject: [PATCH] External symbol re_croak2
+ Date: 02 Mar 1998 13:00:45 +0100
+ From: Gisle Aas <gisle@aas.no>
+ Branch: perl
+ ! regcomp.c regcomp.h
+____________________________________________________________________________
+[ 779] By: mbeattie on 1998/03/05 19:01:25
+ Log: Subject: [PATCH 5.004_61] Miscellaneous minor fixes
+ Date: Mon, 02 Mar 1998 01:48:27 -0500 (EST)
+ From: bailey@newman.upenn.edu (Charles Bailey)
+ Branch: perl
+ ! bytecode.h embedvar.h ext/B/Makefile.PL ext/B/byteperl.c
+ ! ext/Thread/Makefile.PL lib/File/Path.pm patchlevel.h perldir.h
+ ! sv.h
+____________________________________________________________________________
+[ 778] By: mbeattie on 1998/03/05 18:53:13
+ Log: Subject: [PATCH 5.004_61] USHRT range limit macros
+ Date: Mon, 02 Mar 1998 01:41:41 -0500 (EST)
+ From: bailey@newman.upenn.edu (Charles Bailey)
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 777] By: mbeattie on 1998/03/05 18:50:25
+ Log: Subject: [PATCH 5.004_61] File::Basename taint fix (revised)
+ Date: Mon, 02 Mar 1998 01:39:47 -0500 (EST)
+ From: bailey@newman.upenn.edu (Charles Bailey)
+ Branch: perl
+ ! lib/File/Basename.pm
+____________________________________________________________________________
+[ 776] By: mbeattie on 1998/03/05 18:49:15
+ Log: Subject: [PATCH] Take out version number in perlguts (perl5.004_61)
+ Date: 01 Mar 1998 15:16:03 +0100
+ From: Gisle Aas <gisle@aas.no>
+ Branch: perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 775] By: mbeattie on 1998/03/05 18:48:05
+ Log: Subject: Re: [PATCH] 5.004_61: Makefile.SH (Re: 5.004_61: annoyingly missing patch)
+ Date: Sun, 1 Mar 1998 12:14:44 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! Makefile.SH perl_exp.SH
+____________________________________________________________________________
+[ 774] By: mbeattie on 1998/03/05 18:46:32
+ Log: Subject: Almost OK: 5.004_61 (threads, perlio)
+ Date: Sun, 1 Mar 1998 02:02:47 -0500
+ From: Spider Boardman <spider@orb.nashua.nh.us>
+ Branch: perl
+ ! bytecode.h bytecode.pl byterun.c byterun.h perlsdio.h
+____________________________________________________________________________
+[ 773] By: mbeattie on 1998/03/05 18:43:57
+ Log: Subject: [PATCH 5.004_61] print sort {-1} 1..10; hangs
+ Date: Sat, 28 Feb 1998 15:51:14 -0500 (EST)
+ From: Hans Mulder <hansmu@xs4all.nl>
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 772] By: mbeattie on 1998/03/05 18:39:25
+ Log: Subject: [PATCH] 5.004_61: Makefile.SH: 'ok' target needs perlbug...
+ Date: Sat, 28 Feb 1998 17:06:41 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! Makefile.SH
+____________________________________________________________________________
+[ 771] By: mbeattie on 1998/03/05 18:38:32
+ Log: Subject: [PATCH] 5.004_61: hints/netbsd.sh
+ Date: Sat, 28 Feb 1998 16:35:32 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! hints/netbsd.sh
+____________________________________________________________________________
+[ 770] By: mbeattie on 1998/03/05 18:36:50
+ Log: Add byterun.c to cflags.SH (Dominic Dunlop <domo@vo.lu>)
+ Branch: perl
+ ! cflags.SH
+____________________________________________________________________________
+[ 769] By: mbeattie on 1998/03/05 18:34:35
+ Log: Change getc/fread to PerlIO_getc/fread in bytecode.h:
+ Subject: [PATCH 5.004_61] bunch of small patches
+ Date: Fri, 27 Feb 1998 20:03:29 -0500 (EST)
+ From: Andrew Cohen <cohen@andy.bu.edu>
+ Branch: perl
+ ! bytecode.h
+____________________________________________________________________________
+[ 768] By: mbeattie on 1998/03/05 18:13:06
+ Log: Integrate win32 branch into mainline.
+ Branch: perl
+ !> (integrate 53 files)
+____________________________________________________________________________
+[ 767] By: TimBunce on 1998/03/05 11:48:09
+ Log: Update to change 744.
+ Branch: maint-5.004/perl
+ ! lib/ExtUtils/Install.pm
+____________________________________________________________________________
+[ 765] By: TimBunce on 1998/03/05 11:24:24
+ Log: Update embed.h after make regen_headers.
+ Branch: maint-5.004/perl
+ ! embed.h
+____________________________________________________________________________
+[ 764] By: TimBunce on 1998/03/05 11:05:13
+ Log: APPLLIB_EXP now has arch and version dirs added to @INC
+ Branch: maint-5.004/perl
+ ! perl.c
+____________________________________________________________________________
+[ 763] By: TimBunce on 1998/03/05 11:01:38
+ Log: Added hints/openbsd.sh and t/op/pos.t to MANIFEST
+ Added MAINT_TRIAL_1 local patch label to patchlevel.h
+ Removed win32/win32io.c and win32/win32io.h from repository
+ Branch: maint-5.004/perl
+ - win32/win32io.c win32/win32io.h
+ ! MANIFEST patchlevel.h
+____________________________________________________________________________
+[ 762] By: TimBunce on 1998/03/05 10:05:34
+ Log: Title: "5.004_04 +MAINT_TRIAL_1 broken when sizeof(int) != sizeof(void)"
+ From: Spider Boardman <spider@orb.nashua.nh.us>
+ Files: scope.c
+ Branch: maint-5.004/perl
+ ! scope.c
+____________________________________________________________________________
+[ 761] By: TimBunce on 1998/03/05 10:03:10
+ Log: Title: "properly refcount localization, fix C<local $tied{foo}>"
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199802191207.MAA10742@toad.ig.co.uk>
+ Files: av.c hv.c scope.c t/op/local.t
+ Branch: maint-5.004/perl
+ ! av.c hv.c scope.c t/op/local.t
+____________________________________________________________________________
+[ 760] By: gsar on 1998/03/04 20:58:21
+ Log: added AS patch#10
+ Message-Id: <01BD4691.963D1670.dougl@ActiveState.com>
+ Date: Tue, 03 Mar 1998 10:46:13 PST
+ From: Douglas Lankshear <dougl@ActiveState.com>
+ Subject: [PATCH]
+
+ Here's a patch to win32/dl_win32.xs that is a fix for the lookup of statically
+ linked modules.
+
+ -- Doug
+ Branch: asperl
+ ! win32/dl_win32.xs
+____________________________________________________________________________
+[ 759] By: TimBunce on 1998/03/04 18:46:41
+ Log: Update patchls utility
+ Branch: maint-5.004/perl
+ ! Porting/patchls
+____________________________________________________________________________
+[ 758] By: TimBunce on 1998/03/04 17:07:06
+ Log: perldoc -f now uses pager if text is too long for screen
+ Branch: maint-5.004/perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 757] By: TimBunce on 1998/03/04 16:57:04
+ Log: Added OpenBSD hint file from <Todd.Miller@courtesan.com>
+ Document 'warn with no args' behaviour, from <johnpc@xs4all.net>
+ Branch: maint-5.004/perl
+ + hints/openbsd.sh
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 756] By: TimBunce on 1998/03/04 16:48:40
+ Log: Fix for new gnulibc stdio.h when using sfio+perlio
+ Branch: maint-5.004/perl
+ ! perlsdio.h
+____________________________________________________________________________
+[ 755] By: TimBunce on 1998/03/04 16:47:08
+ Log: Fixed typo in vms/ext/Stdio/Stdio.pm AUTOLOAD
+ Added details of split in scalar context to perlfunc.pod
+ Branch: maint-5.004/perl
+ ! pod/perlfunc.pod vms/ext/Stdio/Stdio.pm
+____________________________________________________________________________
+[ 754] By: TimBunce on 1998/03/04 16:35:58
+ Log: Updated perl -v info to include reference to docs and home page.
+ Branch: maint-5.004/perl
+ ! perl.c
+____________________________________________________________________________
+[ 753] By: TimBunce on 1998/03/04 16:31:29
+ Log: Updated hints/bsdos.sh for BSD/OS 3.1
+ Fixed typo in pod/perlsyn.pod
+ Added workaround for old gmake in ext/SDBM_File/sdbm/Makefile.PL
+ Fixed typo in ext/GDBM_File/GDBM_File.pm
+ Branch: maint-5.004/perl
+ ! ext/GDBM_File/GDBM_File.pm ext/SDBM_File/sdbm/Makefile.PL
+ ! hints/bsdos.sh pod/perlsyn.pod
+____________________________________________________________________________
+[ 752] By: TimBunce on 1998/03/04 15:49:19
+ Log: Changed bug address in README to perlbug@perl.com
+ Changed Copyright in perl.c to 1998
+ Added op/pos.t test from Robin Houston <robin@oneworld.org>
+ Branch: maint-5.004/perl
+ + t/op/pos.t
+ ! README perl.c
+____________________________________________________________________________
+[ 751] By: TimBunce on 1998/03/04 14:47:15
+ Log: Make t/comp/require.t and t/lib/ph.t executable in repository
+ Branch: maint-5.004/perl
+ ! t/comp/require.t t/lib/ph.t
+____________________________________________________________________________
+[ 750] By: TimBunce on 1998/03/04 13:29:58
+ Log: Added dTHR definition to ease backwards compatibility for XS
+ source code from 5.005.
+ Branch: maint-5.004/perl
+ ! perl.h
+____________________________________________________________________________
+[ 749] By: TimBunce on 1998/03/04 12:19:19
+ Log: Title: "rename local 'op' variables to 'o'", #F114
+ From: Gurusamy Sarathy
+ Files: op.h opcode.h proto.h dump.c op.c opcode.pl pp_ctl.c run.c scope.c
+ toke.c
+ Branch: maint-5.004/perl
+ ! dump.c op.c op.h opcode.h opcode.pl pp_ctl.c proto.h run.c
+ ! scope.c toke.c
+____________________________________________________________________________
+[ 748] By: TimBunce on 1998/03/04 12:12:27
+ Log: Title: "consolidated win32 patch", #F112
+ From: Gurusamy Sarathy
+ Files: MANIFEST pod/perlfaq2.pod pod/perlrun.pod win32/include/sys/socket.h
+ EXTERN.h INTERN.h dosish.h lib/ExtUtils/Command.pm
+ lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
+ lib/ExtUtils/Mksymlists.pm lib/File/DosGlob.pm t/TEST
+ t/harness win32/win32.h win32/win32iop.h README.win32
+ doio.c installhtml installperl pp_sys.c win32/Makefile
+ win32/config.bc win32/config.vc win32/config_H.bc
+ win32/config_H.vc win32/config_h.PL win32/config_sh.PL
+ win32/dl_win32.xs win32/makedef.pl win32/makefile.mk
+ win32/perllib.c win32/runperl.c win32/win32.c
+ win32/win32sck.c win32/bin/perlglob.pl x2p/a2p.h x2p/a2p.c
+ x2p/a2py.c
+ Branch: maint-5.004/perl
+ + win32/bin/perlglob.pl
+ ! EXTERN.h INTERN.h MANIFEST README.win32 doio.c dosish.h
+ ! installhtml installperl lib/ExtUtils/Command.pm
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Win32.pm
+ ! lib/ExtUtils/Mksymlists.pm lib/File/DosGlob.pm
+ ! pod/perlfaq2.pod pod/perlrun.pod pp_sys.c t/TEST t/harness
+ ! win32/Makefile win32/config.bc win32/config.vc
+ ! win32/config_H.bc win32/config_H.vc win32/config_h.PL
+ ! win32/config_sh.PL win32/dl_win32.xs
+ ! win32/include/sys/socket.h win32/makedef.pl win32/makefile.mk
+ ! win32/perllib.c win32/runperl.c win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32sck.c x2p/a2p.c x2p/a2p.h
+ ! x2p/a2py.c
+____________________________________________________________________________
+[ 747] By: TimBunce on 1998/03/04 11:59:57
+ Log: Title: "initialize @INC in ph.t, and fix up MANIFEST", #F111
+ From: Gurusamy Sarathy
+ Files: MANIFEST t/lib/ph.t
+ Branch: maint-5.004/perl
+ ! MANIFEST t/lib/ph.t
+____________________________________________________________________________
+[ 746] By: TimBunce on 1998/03/04 11:47:43
+ Log: Title: "properly save STDOUT during system() in debugger", #F110
+ From: Jason Smith <smithj4@rpi.edu>
+ Files: lib/perl5db.pl
+ Branch: maint-5.004/perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 745] By: TimBunce on 1998/03/04 11:40:19
+ Log: Title: "generate DynaLoader.pm at build time", #F109
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Msg-ID: <9802111938.AA26224@o09.xray.mpe.mpg.de>
+ Files: MANIFEST ext/DynaLoader/DynaLoader.pm.PL ext/DynaLoader/Makefile.PL
+ Branch: maint-5.004/perl
+ + ext/DynaLoader/DynaLoader.pm.PL
+ ! MANIFEST ext/DynaLoader/Makefile.PL
+____________________________________________________________________________
+[ 744] By: TimBunce on 1998/03/04 11:34:09
+ Log: Title: "Install extensions with bootstrap in $archlib", #F108
+ From: koenig@anna.mind.de (Andreas J. Koenig), koenig@kulturbox.de (Andreas
+ J. Koenig)
+ Msg-ID: <sfcra9fqx0n.fsf@anna.in-berlin.de>
+ Files: lib/ExtUtils/Install.pm
+ Branch: maint-5.004/perl
+ ! lib/ExtUtils/Install.pm
+____________________________________________________________________________
+[ 743] By: TimBunce on 1998/03/04 10:45:05
+ Log: Title: "Pod::Html trips over "C<0>"", #F107
+ From: Chip Salzenberg
+ Files: lib/Pod/Html.pm
+ Branch: maint-5.004/perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 742] By: TimBunce on 1998/03/04 10:12:54
+ Log: Title: "5.004_58 | _04: pod2*,perlpod: L<show this|man/section>", #F106
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Msg-ID: <9802111629.AA00595@o09.xray.mpe.mpg.de>
+ Files: pod/perlpod.pod lib/Pod/Html.pm lib/Pod/Text.pm pod/pod2man.PL
+ Branch: maint-5.004/perl
+ ! lib/Pod/Html.pm lib/Pod/Text.pm pod/perlpod.pod pod/pod2man.PL
+____________________________________________________________________________
+[ 741] By: TimBunce on 1998/03/04 10:08:31
+ Log: Title: "New patch for $^E==GetLastError() under Win32", #F105
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>, Tye McQueen
+ <tye@metronet.com>, ilya@math.ohio-state.edu (Ilya
+ Zakharevich)
+ Msg-ID: <199801040630.AA29298@metronet.com>,
+ <199801041826.NAA11568@aatma.engin.umich.edu>,
+ <1998Jan4.130412.2719461@cor.newman>
+ Files: pod/perlfunc.pod pod/perlvar.pod doio.c lib/dumpvar.pl lib/perl5db.pl
+ win32/win32.h mg.c util.c win32/makedef.pl win32/win32.c
+ Branch: maint-5.004/perl
+ ! doio.c lib/dumpvar.pl lib/perl5db.pl mg.c pod/perlfunc.pod
+ ! pod/perlvar.pod util.c win32/makedef.pl win32/win32.c
+ ! win32/win32.h
+____________________________________________________________________________
+[ 740] By: TimBunce on 1998/03/04 09:55:57
+ Log: Title: "5.004_56: Patch to Tie::Hash and docs", #F104
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199801120134.UAA05437@monk.mps.ohio-state.edu>
+ Files: pod/perlfunc.pod lib/Tie/Hash.pm
+ Branch: maint-5.004/perl
+ ! lib/Tie/Hash.pm pod/perlfunc.pod
+____________________________________________________________________________
+[ 739] By: TimBunce on 1998/03/04 09:26:01
+ Log: Title: "more doc for perldoc", #F103
+ From: Gurusamy Sarathy
+ Files: utils/perldoc.PL
+ Branch: maint-5.004/perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 738] By: TimBunce on 1998/03/04 09:23:16
+ Log: Title: "Make perldoc look for an index file ", #F102
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <199801221220.NAA22902@furu.g.aas.no>
+ Files: utils/perldoc.PL
+ Branch: maint-5.004/perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 737] By: TimBunce on 1998/03/04 09:21:15
+ Log: Title: "perldoc -F filename", #F101
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199712120037.TAA00176@math.mps.ohio-state.edu>
+ Files: utils/perldoc.PL
+ Branch: maint-5.004/perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 736] By: TimBunce on 1998/03/04 09:16:20
+ Log: Title: "sv_grow can fail for HAS_64K_LIMIT systems", #F100
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <m3iuqsl3oq.fsf@furu.g.aas.no>
+ Files: sv.c
+ Branch: maint-5.004/perl
+ ! sv.c
+____________________________________________________________________________
+[ 735] By: TimBunce on 1998/03/04 09:08:51
+ Log: Title: "Benchmark.pm: timethese corrupts $_", #F099
+ From: abigail@fnx.com
+ Msg-ID: <19980201114609.7779.qmail@betelgeuse.wayne.fnx.com>
+ Files: lib/Benchmark.pm
+ Branch: maint-5.004/perl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 734] By: TimBunce on 1998/03/04 08:59:58
+ Log: Title: "STRANGE_MALLOC should test failed alloc", #F098
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <199802021406.PAA03285@furu.g.aas.no>
+ Files: hv.c
+ Branch: maint-5.004/perl
+ ! hv.c
+____________________________________________________________________________
+[ 733] By: TimBunce on 1998/03/04 08:35:19
+ Log: Title: "support caseless %ENV", #F097
+ From: Gurusamy Sarathy
+ Files: hv.c t/op/magic.t win32/win32.h
+ Branch: maint-5.004/perl
+ ! hv.c t/op/magic.t win32/win32.h
+____________________________________________________________________________
+[ 732] By: TimBunce on 1998/03/04 08:33:58
+ Log: Title: "newer cperl-mode.el (from 5.004_60)", #F096
+ From: Ilya Zakharevich
+ Files: emacs/cperl-mode.el
+ Branch: maint-5.004/perl
+ ! emacs/cperl-mode.el
+____________________________________________________________________________
+[ 731] By: TimBunce on 1998/03/04 08:26:23
+ Log: Title: "Handle set magic on xsub OUTPUT args, add API functions that handle
+ magic", #F095
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199801190409.XAA26710@aatma.engin.umich.edu>
+ Files: pod/perlguts.pod pod/perlxs.pod embed.h proto.h sv.h global.sym
+ lib/ExtUtils/xsubpp sv.c
+ Branch: maint-5.004/perl
+ ! embed.h global.sym lib/ExtUtils/xsubpp pod/perlguts.pod
+ ! pod/perlxs.pod proto.h sv.c sv.h
+____________________________________________________________________________
+[ 730] By: TimBunce on 1998/03/04 08:20:52
+ Log: Title: "Fix flawed cleanup when signal handlers are not defined", #F094
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199710290106.UAA11485@aatma.engin.umich.edu>
+ Files: mg.c
+ Branch: maint-5.004/perl
+ ! mg.c
+____________________________________________________________________________
+[ 729] By: TimBunce on 1998/03/04 08:18:02
+ Log: Title: "Tests for C<sort 'foo','bar'>", #F093
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199711021247.MAA01743@crypt.compulink.co.uk>
+ Files: t/op/sort.t
+ Branch: maint-5.004/perl
+ ! t/op/sort.t
+____________________________________________________________________________
+[ 728] By: TimBunce on 1998/03/04 08:17:07
+ Log: Title: "Make search.pl work on win32", #F092
+ From: Gurusamy Sarathy
+ Files: win32/bin/search.pl
+ Branch: maint-5.004/perl
+ ! win32/bin/search.pl
+____________________________________________________________________________
+[ 727] By: gsar on 1998/03/04 04:13:23
+ Log: missing s/op/o/ from one of the mainpatches
+ Branch: win32/perl
+ ! op.c
+____________________________________________________________________________
+[ 726] By: gsar on 1998/03/04 02:12:13
+ Log: maintpatches #102 and #103 to perldoc.PL
+ Branch: win32/perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 725] By: gsar on 1998/03/04 02:00:15
+ Log: renumber some tests to match maint branch
+ Branch: win32/perl
+ ! t/op/local.t
+____________________________________________________________________________
+[ 724] By: gsar on 1998/03/04 01:25:50
+ Log: maintpatch
+ #70: "Fix random whitespace errors in docs"
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <12726.877706444@eeyore.ibcinc.com>
+ Date: Fri, 24 Oct 1997 11:20:44 -0400
+ Files: pod/checkpods.PL pod/perlfunc.pod
+ Branch: win32/perl
+ ! pod/checkpods.PL
+____________________________________________________________________________
+[ 723] By: gsar on 1998/03/04 01:04:37
+ Log: sync maintpatch
+ #76: "Fix infinite loop on unlink() failure in File::Path::rmtree()
+ From: Chip Salzenberg
+ Files: lib/File/Path.pm
+ Branch: win32/perl
+ ! lib/File/Path.pm
+____________________________________________________________________________
+[ 722] By: gsar on 1998/03/04 00:46:46
+ Log: remove redundancy in File::Find
+ Branch: win32/perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 721] By: TimBunce on 1998/03/03 20:06:41
+ Log: Title: "Fix spurious perldoc warnings on DOSISH platforms", #F091
+ From: Molnar Laszlo <molnarl@cdata.tvnet.hu>
+ Msg-ID: <34475659.1AA69855@cdata.tvnet.hu>
+ Files: utils/perldoc.PL
+ Branch: maint-5.004/perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 720] By: TimBunce on 1998/03/03 20:03:59
+ Log: Title: "Make ExtUtils::MM_Unix::fixin() do something meaningful on win32",
+ #F090
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199801070016.TAA17766@aatma.engin.umich.edu>
+ Files: lib/ExtUtils/MM_Unix.pm
+ Branch: maint-5.004/perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 719] By: TimBunce on 1998/03/03 20:02:06
+ Log: Title: "Fix inconsistent case $ENV{Path} (vs $ENV{PATH})", #F089
+ From: Gurusamy Sarathy
+ Files: lib/FindBin.pm
+ Branch: maint-5.004/perl
+ ! lib/FindBin.pm
+____________________________________________________________________________
+[ 718] By: TimBunce on 1998/03/03 20:00:26
+ Log: Title: "Fix File::Find's longstanding confusion about win32 being like VMS",
+ #F088
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199802020459.XAA04964@aatma.engin.umich.edu>
+ Files: lib/File/Find.pm
+ Branch: maint-5.004/perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 717] By: TimBunce on 1998/03/03 19:59:38
+ Log: Title: "do_postponed breaks with multiple interpreters", #F087
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199710290316.WAA15888@aatma.engin.umich.edu>
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 716] By: TimBunce on 1998/03/03 19:57:17
+ Log: Title: "Make warning on C<Nosuch::> optional, add to perl{diag,delta}.pod",
+ #F086
+ From: Gurusamy Sarathy
+ Files: pod/perldelta.pod pod/perldiag.pod toke.c
+ Branch: maint-5.004/perl
+ ! pod/perldelta.pod pod/perldiag.pod toke.c
+____________________________________________________________________________
+[ 715] By: TimBunce on 1998/03/03 19:51:33
+ Log: Title: "Pod::Html bug and fix: missing </UL> in index", #F085
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199802192314.SAA23326@aatma.engin.umich.edu>
+ Files: lib/Pod/Html.pm
+ Branch: maint-5.004/perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 714] By: TimBunce on 1998/03/03 19:50:28
+ Log: Title: "New pod: perlhist", #F084
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199802191556.RAA09578@alpha.hut.fi>
+ Files: MANIFEST pod/perl.pod pod/perlhist.pod pod/perltoc.pod pod/buildtoc
+ Branch: maint-5.004/perl
+ + pod/perlhist.pod
+ ! MANIFEST pod/buildtoc pod/perl.pod pod/perltoc.pod
+____________________________________________________________________________
+[ 713] By: TimBunce on 1998/03/03 19:47:13
+ Log: Title: "Fix restoration of locals on scope unwinding", #F083
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199802110515.AAA23700@aatma.engin.umich.edu>
+ Files: pp_ctl.c t/op/local.t
+ Branch: maint-5.004/perl
+ ! pp_ctl.c t/op/local.t
+____________________________________________________________________________
+[ 712] By: TimBunce on 1998/03/03 19:45:56
+ Log: Title: "after an eval-ed bad require, requiring a string ref SEGVs", #F082
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199802102349.SAA16001@aatma.engin.umich.edu>
+ Files: pp_ctl.c
+ Branch: maint-5.004/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 711] By: TimBunce on 1998/03/03 19:44:41
+ Log: Title: "Fix seg fault on eval/require and syntax errors", #F081
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199802102321.SAA15346@aatma.engin.umich.edu>
+ Files: MANIFEST scope.h op.c pp_ctl.c scope.c t/comp/require.t toke.c
+ Branch: maint-5.004/perl
+ + t/comp/require.t
+ ! MANIFEST op.c pp_ctl.c scope.c scope.h toke.c
+____________________________________________________________________________
+[ 710] By: TimBunce on 1998/03/03 19:36:34
+ Log: Title: "5.004_58: the locale.t problem in IRIX", #F080
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199802091747.TAA01735@alpha.hut.fi>
+ Files: t/pragma/locale.t
+ Branch: maint-5.004/perl
+ ! t/pragma/locale.t
+____________________________________________________________________________
+[ 709] By: TimBunce on 1998/03/03 19:32:30
+ Log: Title: "sv_setnv will upgrade SVt_NV to SVt_PVNV", #F079
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <m3g1lwl3bq.fsf@furu.g.aas.no>
+ Files: sv.c
+ Branch: maint-5.004/perl
+ ! sv.c
+____________________________________________________________________________
+[ 708] By: TimBunce on 1998/03/03 19:28:06
+ Log: Title: "Eliminate double warnings under C<package;>", #F077
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0y0paq-0000Ov-00@ursa.cus.cam.ac.uk>
+ Files: gv.c op.c toke.c
+ Branch: maint-5.004/perl
+ ! gv.c op.c toke.c
+____________________________________________________________________________
+[ 707] By: TimBunce on 1998/03/03 19:13:17
+ Log: Title: "Fix infinite loop on unlink() failure in File::Path::rmtree()",
+ #F076
+ From: Murray Nesbitt <mjn@pathcom.com>, Tim Bunce <Tim.Bunce@ig.co.uk>
+ Msg-ID: <199802061100.LAA16423@toad.ig.co.uk>
+ Files: lib/File/Path.pm
+ Branch: maint-5.004/perl
+ ! lib/File/Path.pm
+____________________________________________________________________________
+[ 706] By: TimBunce on 1998/03/03 19:08:45
+ Log: Title: "Update of h2ph", #F075
+ From: kstar@www.chapin.edu (Kurt D. Starsinic)
+ Msg-ID: <199802051354.FAA11452@www.chapin.edu>
+ Files: t/lib/ph.t utils/h2ph.PL
+ Branch: maint-5.004/perl
+ + t/lib/ph.t
+ ! utils/h2ph.PL
+____________________________________________________________________________
+[ 705] By: TimBunce on 1998/03/03 18:56:59
+ Log: Title: "Fix AutoLoader for deep packages", #F074
+ From: Zachary Miller <zcmiller@zappy.er.usgs.gov>
+ Msg-ID: <199710092348.SAA02108@zappy.er.usgs.gov>
+ Files: lib/AutoLoader.pm
+ Branch: maint-5.004/perl
+ ! lib/AutoLoader.pm
+____________________________________________________________________________
+[ 704] By: TimBunce on 1998/03/03 18:35:36
+ Log: Title: "Fix order of warnings for misplaced subscripts", #F073
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199710131023.LAA16796@crypt.compulink.co.uk>
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 703] By: TimBunce on 1998/03/03 18:32:28
+ Log: Title: "Make recursive lexical analysis more robust", #F072
+ From: Ilya Zakharevich and Chip Salzenberg
+ Msg-ID: <199710160102.VAA28817@monk.mps.ohio-state.edu>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 702] By: TimBunce on 1998/03/03 18:18:10
+ Log: Title: "Fix random whitespace errors in docs", #F070
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <12726.877706444@eeyore.ibcinc.com>
+ Files: pod/perlfunc.pod pod/checkpods.PL
+ Branch: maint-5.004/perl
+ ! pod/checkpods.PL pod/perlfunc.pod
+____________________________________________________________________________
+[ 701] By: TimBunce on 1998/03/03 18:13:54
+ Log: Title: "Fix line numbers after here documents in eval STRING", #F069
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199710241745.NAA08166@monk.mps.ohio-state.edu>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 700] By: TimBunce on 1998/03/03 18:11:20
+ Log: Title: "Fix SEGV from combining caller and C<package;>", #F068
+ From: James Duncan <jduncan@epitome.hawk.igs.net>, Nicholas Clark
+ <nick@flirble.org>
+ Msg-ID: <199710241248.NAA00163@flirble.org>,
+ <Pine.LNX.3.96.971024135912.12197A-100000@epitome.hawk.igs.
+ net>
+ Files: pp_ctl.c sv.c
+ Branch: maint-5.004/perl
+ ! pp_ctl.c sv.c
+____________________________________________________________________________
+[ 699] By: TimBunce on 1998/03/03 18:06:59
+ Log: Title: "Don't fold string comparison under C<use locale>", #F067
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199711151506.RAA26287@alpha.hut.fi>
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 698] By: TimBunce on 1998/03/03 18:04:51
+ Log: Title: "Fix SEGV on constant at end of sort block", #F066
+ From: Administration <fadmin@informatics.muni.cz>
+ Msg-ID: <199711170838.JAA26073@thetis.fi.muni.cz>
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 697] By: TimBunce on 1998/03/03 18:02:54
+ Log: Title: "Allow C<last()> to mean C<last>", #F065
+ From: Chip Salzenberg
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 696] By: TimBunce on 1998/03/03 17:58:12
+ Log: Title: "Fix extension version mismatch message", #F064
+ From: Chip Salzenberg
+ Files: XSUB.h
+ Branch: maint-5.004/perl
+ ! XSUB.h
+____________________________________________________________________________
+[ 695] By: TimBunce on 1998/03/03 17:53:04
+ Log: Title: "Better handle and test struct tm of Linux and SunOS", #F063
+ From: Andy Dougherty <doughera@newton.phys.lafayette.edu>
+ Msg-ID: <Pine.SUN.3.96.980205134340.15567B-100000@newton.phys>
+ Files: MANIFEST ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
+ hints/linux.sh hints/sunos_4_1.sh t/lib/posix.t
+ Branch: maint-5.004/perl
+ + ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
+ ! MANIFEST hints/linux.sh hints/sunos_4_1.sh t/lib/posix.t
+____________________________________________________________________________
+[ 694] By: TimBunce on 1998/03/03 17:40:47
+ Log: Title: "Fix doc bug in getservbyname() examples", #F062
+ From: Tom Christiansen
+ Files: ext/Socket/Socket.pm
+ Branch: maint-5.004/perl
+ ! ext/Socket/Socket.pm
+____________________________________________________________________________
+[ 693] By: TimBunce on 1998/03/03 17:32:57
+ Log: Title: "Kill warning about parameter type", #F061
+ From: Chip Salzenberg
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 692] By: TimBunce on 1998/03/03 17:11:07
+ Log: Title: "Socket occasional SEGV", #F060
+ From: Trevor Blackwell <tlb@viaweb.com>
+ Msg-ID: <199710281804.NAA09632@wagg.viaweb.com>
+ Files: ext/Socket/Socket.xs
+ Branch: maint-5.004/perl
+ ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 691] By: TimBunce on 1998/03/03 17:09:51
+ Log: Title: "Avoid SEGV from local($@)", #F059
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199710290251.VAA14362@aatma.engin.umich.edu>
+ Files: pp_ctl.c
+ Branch: maint-5.004/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 690] By: TimBunce on 1998/03/03 17:08:21
+ Log: Title: "Don't use broken pad_reset() (was Re: Perl bug in 5.004_03 )", #F058
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199710300036.TAA01004@aatma.engin.umich.edu>
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 689] By: TimBunce on 1998/03/03 17:05:57
+ Log: Title: "Use STMT_{START,END} in XSRETURN", #F057
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199710300245.VAA04244@aatma.engin.umich.edu>
+ Files: XSUB.h
+ Branch: maint-5.004/perl
+ ! XSUB.h
+____________________________________________________________________________
+[ 688] By: TimBunce on 1998/03/03 17:04:15
+ Log: Title: "Re: Sort grammar bug", #F056
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199711011946.OAA18882@aatma.engin.umich.edu>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 687] By: TimBunce on 1998/03/03 17:01:32
+ Log: Title: "Document indirect object cases for exec(), system()", #F055
+ From: Dominic Dunlop <domo@slipper.ip.lu>
+ Msg-ID: <v03110700b084e89234a7@[194.51.248.90]>
+ Files: pod/perlfunc.pod
+ Branch: maint-5.004/perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 686] By: TimBunce on 1998/03/03 16:56:44
+ Log: Title: "Update docs on tr///", #F054
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.971103071602.10568C-100000@usertest.teleport.com>
+ Files: pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
+ pod/perlstyle.pod toke.c
+ Branch: maint-5.004/perl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
+ ! pod/perlstyle.pod toke.c
+____________________________________________________________________________
+[ 685] By: TimBunce on 1998/03/03 16:38:50
+ Log: Title: "Re: perlop bitwise & | ^ documentation", #F053
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.971106073858.29771O-100000@usertest.teleport.com>
+ Files: pod/perlop.pod
+ Branch: maint-5.004/perl
+ ! pod/perlop.pod
+____________________________________________________________________________
+[ 684] By: TimBunce on 1998/03/03 16:37:00
+ Log: Title: "Fix SEGV on C<*glob{'SCALAR','ARRAY'}>", #F052
+ From: "Joseph N. Hall" <joseph@cscaper.com>
+ Msg-ID: <199711110552.WAA12613@gadget.cscaper.com>
+ Files: perly.c perly.c.diff perly.y vms/perly_c.vms
+ Branch: maint-5.004/perl
+ ! perly.c perly.c.diff perly.y vms/perly_c.vms
+____________________________________________________________________________
+[ 683] By: TimBunce on 1998/03/03 16:31:15
+ Log: Title: "for perlguts.pod: document sv_derived_from, sv_vcatpfn and
+ sv_vsetpfn", #F051
+ From: jan.dubois@ibm.net (Jan Dubois) and Chip Salzenberg
+ Msg-ID: <346ae970.7444534@smtp1.ibm.net>
+ Files: pod/perlguts.pod
+ Branch: maint-5.004/perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 682] By: TimBunce on 1998/03/03 16:28:30
+ Log: Title: "5.004_04: locale startup failure (at last) documented", #F050
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199711172054.WAA08261@alpha.hut.fi>
+ Files: INSTALL pod/perldiag.pod pod/perllocale.pod
+ Branch: maint-5.004/perl
+ ! INSTALL pod/perldiag.pod pod/perllocale.pod
+____________________________________________________________________________
+[ 681] By: TimBunce on 1998/03/03 16:24:12
+ Log: Title: "Cope with lack of args in Fcntl::AUTOLOAD", #F049
+ From: Jerome Abela <abela@hsc.fr>
+ Msg-ID: <19971120183248.23588@coredump.hsc.fr>
+ Files: ext/Fcntl/Fcntl.pm
+ Branch: maint-5.004/perl
+ ! ext/Fcntl/Fcntl.pm
+____________________________________________________________________________
+[ 680] By: TimBunce on 1998/03/03 16:23:20
+ Log: Title: "Commenting toke.c", #F048
+ From: gnat@frii.com
+ Msg-ID: <199801082138.OAA14186@prometheus.frii.com>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 679] By: TimBunce on 1998/03/03 16:18:32
+ Log: Title: "Re: 5.004_04 vec() fails with 32-bit values", #F047
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Msg-ID: <E0xsnr8-0007SS-00@taurus.cus.cam.ac.uk>
+ Files: pod/perlguts.pod pp.c t/op/vec.t
+ Branch: maint-5.004/perl
+ ! pod/perlguts.pod pp.c t/op/vec.t
+____________________________________________________________________________
+[ 678] By: TimBunce on 1998/03/03 16:15:44
+ Log: Title: "A few perl5.004_03 bugs", #F046
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199801221211.MAA05315@crypt.compulink.co.uk>
+ Files: mg.c t/op/magic.t
+ Branch: maint-5.004/perl
+ ! mg.c t/op/magic.t
+____________________________________________________________________________
+[ 677] By: TimBunce on 1998/03/03 16:13:11
+ Log: Title: "Faster, cleaner av_unshift() ", #F045
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <199801221850.TAA23111@furu.g.aas.no>
+ Files: av.c
+ Branch: maint-5.004/perl
+ ! av.c
+____________________________________________________________________________
+[ 676] By: TimBunce on 1998/03/03 16:04:30
+ Log: Title: "New hints/solaris2.sh", #F044
+ From: Stephen Zander <srz@mckesson.com>
+ Msg-ID: <87oh12y458.fsf@wsuse5.mckesson.com>
+ Files: hints/solaris_2.sh
+ Branch: maint-5.004/perl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 675] By: TimBunce on 1998/03/03 15:33:07
+ Log: Title: "Refresh Complex.pm and test", #F043
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Msg-ID: <199802051608.SAA20262@alpha.hut.fi>
+ Files: lib/Math/Complex.pm t/lib/complex.t
+ Branch: maint-5.004/perl
+ ! lib/Math/Complex.pm t/lib/complex.t
+____________________________________________________________________________
+[ 674] By: TimBunce on 1998/03/03 15:29:16
+ Log: Title: "Fix (\@@) proto", #F042
+ From: "Joseph N. Hall" <joseph@cscaper.com>
+ Msg-ID: <199801240132.SAA25111@gadget.cscaper.com>
+ Files: op.c t/comp/proto.t
+ Branch: maint-5.004/perl
+ ! op.c t/comp/proto.t
+____________________________________________________________________________
+[ 673] By: TimBunce on 1998/03/03 15:26:31
+ Log: Title: "Allow empty BLOCK in code", #F041
+ From: Vladimir Alexiev <vladimir@cs.ualberta.ca>
+ Msg-ID: <19980129002112Z13378-6931+226@scapa.cs.ualberta.ca>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 672] By: TimBunce on 1998/03/03 15:23:55
+ Log: Title: "Fix name of $Foo::{'Bar::'}: '*Foo::Bar::'", #F040
+ From: Chip Salzenberg
+ Files: gv.c t/op/gv.t
+ Branch: maint-5.004/perl
+ ! gv.c t/op/gv.t
+____________________________________________________________________________
+[ 671] By: TimBunce on 1998/03/03 10:02:32
+ Log: Title: "Keep accurate reference count on globs' stashes", #F038
+ From: Gisle Aas <gisle@aas.no>
+ Msg-ID: <m3zpk7sd3n.fsf@furu.g.aas.no>
+ Files: gv.c sv.c
+ Branch: maint-5.004/perl
+ ! gv.c sv.c
+____________________________________________________________________________
+[ 670] By: TimBunce on 1998/03/03 09:59:48
+ Log: Title: "Avoid memory allocation in gv_fetchpv(), for speed", #F037
+ From: Chip Salzenberg
+ Files: gv.c
+ Branch: maint-5.004/perl
+ ! gv.c
+____________________________________________________________________________
+[ 669] By: TimBunce on 1998/03/03 09:58:58
+ Log: Title: "Make Configure less negative about PerlIO", #F036
+ From: chip@atlantic.net
+ Msg-ID: <199801312323.SAA15237@cyprus.atlantic.net>
+ Files: Configure
+ Branch: maint-5.004/perl
+ ! Configure
+____________________________________________________________________________
+[ 668] By: TimBunce on 1998/03/03 09:55:51
+ Log: Title: "Fix (mostly) pseudo-same-REs due to embedded NULs", #F035
+ From: Martin Plechsmid <plechsmi@karlin.mff.cuni.cz>
+ Msg-ID: <199802021217.NAA05230@albert.karlin.mff.cuni.cz>
+ Files: pp_ctl.c
+ Branch: maint-5.004/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 667] By: TimBunce on 1998/03/03 09:52:59
+ Log: Title: "Make Getopt::Long avoid $&, $`, $'", #F034
+ From: Irving Reid <irving@tor.securecomputing.com>
+ Msg-ID: <98Feb3.005102est.11655@janus.tor.securecomputing.com>
+ Files: lib/Getopt/Long.pm
+ Branch: maint-5.004/perl
+ ! lib/Getopt/Long.pm
+____________________________________________________________________________
+[ 666] By: TimBunce on 1998/03/03 09:51:27
+ Log: Title: "adding the newSVpvn API function", #F033
+ From: Matthias Ulrich Neeracher <neeri@iis.ee.ethz.ch>
+ Msg-ID: <199801310532.GAA23798@solar.ethz.ch>
+ Files: pod/perlguts.pod pod/perltoc.pod proto.h global.sym sv.c
+ Branch: maint-5.004/perl
+ ! global.sym pod/perlguts.pod pod/perltoc.pod proto.h sv.c
+____________________________________________________________________________
+[ 665] By: TimBunce on 1998/03/03 09:43:30
+ Log: Title: "Support C<Package::> as function-blind bearword", #F032
+ From: Chip Salzenberg
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 664] By: TimBunce on 1998/03/03 09:41:40
+ Log: Title: "Re-optimize character classes", #F031
+ From: Chip Salzenberg
+ Files: regcomp.h regcomp.c regexec.c
+ Branch: maint-5.004/perl
+ ! regcomp.c regcomp.h regexec.c
+____________________________________________________________________________
+[ 663] By: TimBunce on 1998/03/03 09:39:55
+ Log: Title: "Fix C<if (1) { local $x }> which needed ENTER/LEAVE", #F030
+ From: dfh@dwroll.lucent.com (D461-David_F_Haertig(Dave)83040)
+ Msg-ID: <EnKC0q.6qI@drnews.dr.lucent.com>
+ Files: op.c t/op/local.t
+ Branch: maint-5.004/perl
+ ! op.c t/op/local.t
+____________________________________________________________________________
+[ 662] By: TimBunce on 1998/03/03 09:37:51
+ Log: Title: "Dramatically improve performance of // with parens or $&", #F029
+ From: Chip Salzenberg
+ Files: cop.h perl.h proto.h regexp.h gv.c interp.sym perl.c pp.c pp_ctl.c
+ pp_hot.c regexec.c scope.c
+ Branch: maint-5.004/perl
+ ! cop.h gv.c interp.sym perl.c perl.h pp.c pp_ctl.c pp_hot.c
+ ! proto.h regexec.c regexp.h scope.c
+____________________________________________________________________________
+[ 661] By: TimBunce on 1998/03/03 09:27:04
+ Log: Title: "Don't warn on $x{shift}, ne => 1, or -f => 1", #F028
+ From: Chip Salzenberg
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 660] By: TimBunce on 1998/03/03 09:24:41
+ Log: Title: "Protect against weirdness with unreal @_ in C<local @_>", #F027
+ From: Chip Salzenberg
+ Files: scope.c
+ Branch: maint-5.004/perl
+ ! scope.c
+____________________________________________________________________________
+[ 659] By: TimBunce on 1998/03/03 09:24:00
+ Log: Title: "Fix C<printf "%.0d", 0>", #F026
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199711021331.NAA01826@crypt.compulink.co.uk>
+ Files: sv.c t/op/sprintf.t
+ Branch: maint-5.004/perl
+ ! sv.c t/op/sprintf.t
+____________________________________________________________________________
+[ 658] By: TimBunce on 1998/03/03 09:22:13
+ Log: Title: "Tiny core patch for source filters", #F025
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Msg-ID: <9711202312.AA02937@claudius.bfsec.bt.co.uk>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 657] By: TimBunce on 1998/03/03 09:20:00
+ Log: Title: "Here-doc in s///e (was: Bug)", #F024
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199711221445.OAA14153@crypt.compulink.co.uk>
+ Files: t/base/lex.t toke.c
+ Branch: maint-5.004/perl
+ ! t/base/lex.t toke.c
+____________________________________________________________________________
+[ 656] By: TimBunce on 1998/03/03 09:17:56
+ Log: Title: "Fix duplicate warnings on C<-e undef>", #F023
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199711221252.MAA14000@crypt.compulink.co.uk>
+ Files: doio.c t/pragma/warn-1global
+ Branch: maint-5.004/perl
+ ! doio.c t/pragma/warn-1global
+____________________________________________________________________________
+[ 655] By: TimBunce on 1998/03/03 09:16:56
+ Log: Title: "Fix '*' prototype", #F022
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199711212225.RAA00755@monk.mps.ohio-state.edu>
+ Files: toke.c
+ Branch: maint-5.004/perl
+ ! toke.c
+____________________________________________________________________________
+[ 654] By: TimBunce on 1998/03/03 09:15:04
+ Log: Title: "File::Find bugs (and patches)", "File::Find bugs & patches", #F021
+ From: "Conrad E. Kimball" <cek@tblv021.ca.boeing.com>
+ Msg-ID: <199711260703.XAA21257@mailgate2.boeing.com>
+ Files: lib/File/Find.pm
+ Branch: maint-5.004/perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 653] By: TimBunce on 1998/03/03 09:11:55
+ Log: Title: "Fix typo: FORM{,AT}LINE", #F020
+ From: Chip Salzenberg
+ Files: sv.c
+ Branch: maint-5.004/perl
+ ! sv.c
+____________________________________________________________________________
+[ 652] By: TimBunce on 1998/03/03 09:07:50
+ Log: Title: "Fix use of unref mem when blessed object goes out of scope", #F019
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199711282326.SAA15090@aatma.engin.umich.edu>
+ Files: scope.c
+ Branch: maint-5.004/perl
+ ! scope.c
+____________________________________________________________________________
+[ 651] By: TimBunce on 1998/03/03 09:07:10
+ Log: Title: "Fix C<my ($a, undef, $b) = @x>", #F018
+ From: Stephane Payrard <stef@francenet.fr>
+ Msg-ID: <199712040054.BAA04612@www.zweig.com>
+ Files: op.c t/op/my.t
+ Branch: maint-5.004/perl
+ ! op.c t/op/my.t
+____________________________________________________________________________
+[ 650] By: TimBunce on 1998/03/03 09:04:04
+ Log: Title: "enhanced "use strict" warning", #F017
+ From: Tkil <tkil@reptile.scrye.com>
+ Msg-ID: <199712040938.CAA07628@reptile.scrye.com>
+ Files: gv.c t/pragma/strict-subs t/pragma/strict-vars
+ Branch: maint-5.004/perl
+ ! gv.c t/pragma/strict-subs t/pragma/strict-vars
+____________________________________________________________________________
+[ 649] By: TimBunce on 1998/03/03 09:02:55
+ Log: Title: "eval of sub gives spurious "uninitialised" warning", #F016
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199712061025.FAA14396@aatma.engin.umich.edu>
+ Files: pod/perldelta.pod pod/perlfunc.pod op.c t/op/eval.t
+ Branch: maint-5.004/perl
+ ! op.c pod/perldelta.pod pod/perlfunc.pod t/op/eval.t
+____________________________________________________________________________
+[ 648] By: TimBunce on 1998/03/03 08:58:00
+ Log: Title: "[PERL] Assigning result of pop scrambles unrelated reference", #F015
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199712061100.GAA14864@aatma.engin.umich.edu>
+ Files: sv.c
+ Branch: maint-5.004/perl
+ ! sv.c
+____________________________________________________________________________
+[ 647] By: TimBunce on 1998/03/03 08:53:35
+ Log: Title: "[PERL] Filedescriptor leak in 5.004_55 (and earlier)", #F014
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID: <199712151922.OAA06410@monk.mps.ohio-state.edu>
+ Files: os2/os2.c util.c
+ Branch: maint-5.004/perl
+ ! os2/os2.c util.c
+____________________________________________________________________________
+[ 646] By: TimBunce on 1998/03/03 08:51:04
+ Log: Title: "Fix fdopen() on STD{IN,OUT,ERR}", #F013
+ From: Roderick Schertler <roderick@argon.org>
+ Msg-ID: <pzg1npp6e3.fsf@eeyore.ibcinc.com>
+ Files: doio.c t/op/misc.t
+ Branch: maint-5.004/perl
+ ! doio.c t/op/misc.t
+____________________________________________________________________________
+[ 645] By: TimBunce on 1998/03/03 08:49:34
+ Log: Title: "Fix local $a[0] and local $h{a}", #F012
+ From: Stephen McCamant <alias@mcs.com>
+ Msg-ID: <m0xjWFq-000EZeC@alias-2.pr.mcs.net>
+ Files: embed.h scope.h global.sym pp.c pp_hot.c scope.c t/op/local.t
+ Branch: maint-5.004/perl
+ ! embed.h global.sym pp.c pp_hot.c scope.c scope.h t/op/local.t
+____________________________________________________________________________
+[ 644] By: TimBunce on 1998/03/03 08:43:06
+ Log: Title: "Eliminate redundant mg_get() in SvTRUE()", #F011
+ From: Spider Boardman <spider@orb.nashua.nh.us>
+ Msg-ID: <199712251839.NAA14800@Orb.Nashua.NH.US>
+ Files: sv.c
+ Branch: maint-5.004/perl
+ ! sv.c
+____________________________________________________________________________
+[ 643] By: TimBunce on 1998/03/03 08:41:07
+ Log: Title: "Don't force scalar context on C<my @x> or C<my %x>", #F010
+ From: Chip Salzenberg
+ Files: op.c t/op/my.t
+ Branch: maint-5.004/perl
+ ! op.c t/op/my.t
+____________________________________________________________________________
+[ 642] By: TimBunce on 1998/03/03 08:39:11
+ Log: Title: "Fix assignment to $_[0] in DESTROY", #F009
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199801010030.TAA14274@aatma.engin.umich.edu>
+ Files: pod/perlobj.pod sv.c t/op/ref.t
+ Branch: maint-5.004/perl
+ ! pod/perlobj.pod sv.c t/op/ref.t
+____________________________________________________________________________
+[ 641] By: gsar on 1998/03/03 04:39:49
+ Log: merge problematic maintpatch to op.c
+ #77: "Eliminate double warnings under C<package;>"
+ From: Chip Salzenberg
+ Files: gv.c op.c toke.c
+ Branch: win32/perl
+ ! gv.c op.c toke.c
+____________________________________________________________________________
+[ 640] By: gsar on 1998/03/03 04:30:22
+ Log: merge another conflicting maintpatch to op.c
+ #17: "Enhanced "use strict" warning"
+ From: Tkil <tkil@reptile.scrye.com>
+ Msg-ID: <199712040938.CAA07628@reptile.scrye.com>
+ Date: Thu, 4 Dec 1997 02:38:26 -0700
+ Files: gv.c t/pragma/strict-subs t/pragma/strict-vars
+ Branch: win32/perl
+ ! gv.c t/pragma/strict-subs t/pragma/strict-vars
+____________________________________________________________________________
+[ 639] By: gsar on 1998/03/03 04:09:11
+ Log: maintpatch
+ #73: "Fix order of warnings for misplaced subscripts"
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Msg-ID: <199710131023.LAA16796@crypt.compulink.co.uk>
+ Date: Mon, 13 Oct 1997 11:23:56 +0100
+ Files: op.c
+ Branch: win32/perl
+ ! op.c
+____________________________________________________________________________
+[ 638] By: gsar on 1998/03/03 04:02:16
+ Log: manually apply another conflicting maintpatch
+ #64: "Fix extension version mismatch message"
+ From: Chip Salzenberg
+ Files: XSUB.h
+ Branch: win32/perl
+ ! XSUB.h
+____________________________________________________________________________
+[ 637] By: gsar on 1998/03/03 03:57:08
+ Log: maintpatch
+ #62: "Fix doc bug in getservbyname() examples"
+ From: Tom Christiansen
+ Files: ext/Socket/Socket.pm
+ Branch: win32/perl
+ ! ext/Socket/Socket.pm
+____________________________________________________________________________
+[ 636] By: gsar on 1998/03/03 03:55:13
+ Log: maintpatch
+ #60: "Socket occasional SEGV"
+ From: Trevor Blackwell <tlb@viaweb.com>
+ Msg-ID: <199710281804.NAA09632@wagg.viaweb.com>
+ Date: Tue, 28 Oct 1997 13:04:43 -0500 (EST)
+ Files: ext/Socket/Socket.xs
+ Branch: win32/perl
+ ! ext/Socket/Socket.xs
+____________________________________________________________________________
+[ 635] By: gsar on 1998/03/03 03:51:01
+ Log: maintpatches for docs
+ #53: "Perlop bitwise & | ^ documentation"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.971106073858.29771O-100000@usertest.teleport.c
+ Date: Thu, 6 Nov 1997 07:44:52 -0800 (PST)
+ Files: pod/perlfunc.pod
+ --------
+ #54: "Update docs on tr///"
+ From: Tom Phoenix <rootbeer@teleport.com>
+ Msg-ID: <Pine.GSO.3.96.971103071602.10568C-100000@usertest.teleport.c
+ Date: Mon, 3 Nov 1997 07:28:39 -0800 (PST)
+ Files: pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
+ pod/perlstyle.pod toke.c
+ Branch: win32/perl
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! pod/perllocale.pod pod/perlmod.pod pod/perlop.pod
+ ! pod/perlstyle.pod toke.c
+____________________________________________________________________________
+[ 634] By: gsar on 1998/03/03 03:43:42
+ Log: another maintpatch (this one needed adjust of test nos.)
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Message-Id: <199801221211.MAA05315@crypt.compulink.co.uk>
+ Date: Thu, 22 Jan 1998 12:11:49 +0000
+ Subject: Re: [PERL] A few perl5.004_03 bugs
+ Branch: win32/perl
+ ! mg.c t/op/magic.t
+____________________________________________________________________________
+[ 633] By: gsar on 1998/03/03 03:36:40
+ Log: merge another toke.c patch and its dependent (very carefully)
+ #32: "Support C<Package::> as function-blind bearword"
+ From: Chip Salzenberg
+ Files: toke.c
+ --------
+ #86: "Make warning on C<Nosuch::> optional, add to perl{diag,delta}.pod"
+ From: Gurusamy Sarathy
+ Files: toke.c pod/perldelta.pod pod/perldiag.pod
+ Branch: win32/perl
+ ! pod/perldelta.pod pod/perldiag.pod toke.c
+____________________________________________________________________________
+[ 632] By: gsar on 1998/03/03 03:12:16
+ Log: another toke.c maintpatch
+ #28: "Don't warn on $x{shift}, ne => 1, or -f => 1"
+ From: Chip Salzenberg
+ Files: toke.c
+ Branch: win32/perl
+ ! toke.c
+____________________________________________________________________________
+[ 631] By: gsar on 1998/03/03 03:06:59
+ Log: still another maintpatch
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Message-Id: <199711021331.NAA01826@crypt.compulink.co.uk>
+ Date: Sun, 02 Nov 1997 13:31:54 +0000
+ Subject: [PATCH] assorted sprintf bugs
+ Branch: win32/perl
+ ! sv.c t/op/sprintf.t
+____________________________________________________________________________
+[ 630] By: gsar on 1998/03/03 03:03:55
+ Log: yet another maintpatch
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Message-Id: <199711221252.MAA14000@crypt.compulink.co.uk>
+ Date: Sat, 22 Nov 1997 12:52:16 +0000
+ Subject: Re: [PERL] Unexpected output
+ Branch: win32/perl
+ ! doio.c t/pragma/warn-1global
+____________________________________________________________________________
+[ 629] By: gsar on 1998/03/03 02:57:33
+ Log: merge another maintpatch to toke.c
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Date: Sat, 22 Nov 1997 14:45:23 GMT
+ Message-Id: <199711221445.OAA14153@crypt.compulink.co.uk>
+ Subject: Re: [PERL] Here-doc in s///e (was: Bug)
+ Branch: win32/perl
+ ! t/base/lex.t toke.c
+____________________________________________________________________________
+[ 628] By: gsar on 1998/03/03 02:50:20
+ Log: manually merge a maintpatch
+ Date: Thu, 8 Jan 1998 14:38:04 -0700 (MST)
+ Message-Id: <199801082138.OAA14186@prometheus.frii.com>
+ From: gnat@frii.com
+ Subject: [PERL] Commenting toke.c
+ Branch: win32/perl
+ ! toke.c
+____________________________________________________________________________
+[ 627] By: TimBunce on 1998/03/02 22:34:47
+ Log: Title: "Fix inefficient checks for TIEHANDLE", #F008
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Msg-ID: <199801080106.UAA05048@aatma.engin.umich.edu>
+ Files: pp_hot.c pp_sys.c
+ Branch: maint-5.004/perl
+ ! pp_hot.c pp_sys.c
+____________________________________________________________________________
+[ 626] By: TimBunce on 1998/03/02 22:31:13
+ Log: This is the change description for change 625
+ Title: "Fix tr///s option", #F007
+ From: Inaba Hiroto <inaba@st.rim.or.jp>
+ Msg-ID: <19980110155333D.inaba@st.rim.or.jp>
+ Files: doop.c
+ Branch: maint-5.004/perl
+ ! doop.c
+____________________________________________________________________________
+[ 625] By: TimBunce on 1998/03/02 22:23:48
+ Log: Branch: maint-5.004/perl
+ ! doop.c
+____________________________________________________________________________
+[ 623] By: TimBunce on 1998/03/02 21:51:53
+ Log: Title: "Fix lexical lookup in eval-sub-eval", #F006
+ From: Chip Salzenberg
+ Files: pp_ctl.c
+ Branch: maint-5.004/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 622] By: TimBunce on 1998/03/02 21:43:29
+ Log: Title: "Don't upgrade target of assignment from LVALUE", #F005
+ From: Chip Salzenberg
+ Files: sv.c
+ Branch: maint-5.004/perl
+ ! sv.c
+____________________________________________________________________________
+[ 621] By: TimBunce on 1998/03/02 21:29:59
+ Log: Title: "Fix compile-time warning line in while ()", #F004
+ From: Chip Salzenberg
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 620] By: TimBunce on 1998/03/02 21:25:27
+ Log: Title: "STMT foreach LIST;", #F002
+ From: Chip Salzenberg
+ Files: pod/perlsyn.pod perly.c perly.c.diff perly.y t/cmd/mod.t toke.c
+ vms/perly_c.vms
+ Branch: maint-5.004/perl
+ ! perly.c perly.c.diff perly.y pod/perlsyn.pod t/cmd/mod.t
+ ! toke.c vms/perly_c.vms
+____________________________________________________________________________
+[ 619] By: TimBunce on 1998/03/02 21:12:58
+ Log: Title: "Fix SIGSEGV on C<42 until forever>", #F001
+ From: Chip Salzenberg
+ Files: op.c
+ Branch: maint-5.004/perl
+ ! op.c
+____________________________________________________________________________
+[ 618] By: gsar on 1998/03/02 04:40:16
+ Log: make t/lib/nothread.t type xtext also
+ Branch: win32/perl
+ ! t/op/nothread.t
+____________________________________________________________________________
+[ 617] By: gsar on 1998/03/02 04:35:15
+ Log: make t/lib/thread.t type xtext
+ Branch: win32/perl
+ ! t/lib/thread.t
+____________________________________________________________________________
+[ 616] By: gsar on 1998/03/02 04:17:40
+ Log: fix misapplied hunks in change#614
+ Branch: win32/perl
+ ! scope.c scope.h
+____________________________________________________________________________
+[ 615] By: gsar on 1998/03/02 03:39:16
+ Log: another one down
+ From: "Conrad E. Kimball" <cek@tblv021.ca.boeing.com>
+ Message-Id: <199711260703.XAA21257@mailgate2.boeing.com>
+ Date: Tue, 25 Nov 1997 23:03:48 -0800
+ Subject: [PERL] File::Find bugs & patches
+ Branch: win32/perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 614] By: gsar on 1998/03/02 03:28:28
+ Log: this one with adjusted test numbers
+ Message-Id: <m0xjWFq-000EZeC@alias-2.pr.mcs.net>
+ Date: Sat, 20 Dec 1997 15:16:14 -0600 (CST)
+ From: Stephen McCamant <alias@mcs.com>
+ Subject: [PERL] [PATCH] Fix local $a[0] and local $h{a}
+ Branch: win32/perl
+ ! embed.h global.sym pp.c pp_hot.c scope.c scope.h t/op/local.t
+____________________________________________________________________________
+[ 613] By: gsar on 1998/03/02 03:13:32
+ Log: still another
+ From: Inaba Hiroto <inaba@st.rim.or.jp>
+ Subject: [PERL] tr///s bug
+ Message-Id: <19980110155333D.inaba@st.rim.or.jp>
+ Date: Sat, 10 Jan 1998 15:53:33 +0900
+ Branch: win32/perl
+ ! doop.c t/op/subst.t
+____________________________________________________________________________
+[ 612] By: gsar on 1998/03/02 03:01:27
+ Log: yet another patch
+ From: Chip Salzenberg <salzench@nielsenmedia.com>
+ Message-Id: <199709161748.NAA08418@nielsenmedia.com>
+ Subject: Tiny but massively cool: C<statement foreach @list>
+ Date: Tue, 16 Sep 1997 13:47:28 -0400 (EDT)
+ Branch: win32/perl
+ ! perly.c perly.c.diff perly.y pod/perlsyn.pod t/cmd/mod.t
+ ! toke.c vms/perly_c.vms
+____________________________________________________________________________
+[ 611] By: gsar on 1998/03/02 01:52:46
+ Log: yet another 'old' patch
+ From: Stephane Payrard <stef@francenet.fr>
+ Message-Id: <199712040054.BAA04612@www.zweig.com>
+ To: perl5-porters@perl.org
+ Subject: Re: [PERL] buglet : minor but gratuitous inconsistency
+ between `my' and `local' (Patch included)
+ Branch: win32/perl
+ ! op.c t/op/my.t
+____________________________________________________________________________
+[ 610] By: gsar on 1998/03/02 01:45:55
+ Log: another 'old' patch
+ From: Roderick Schertler <roderick@argon.org>
+ Date: 19 Dec 1997 12:52:36 -0500
+ Message-Id: <pzg1npp6e3.fsf@eeyore.ibcinc.com>
+ Subject: [PERL] [PATCH] Re: Problem with open >&=
+ Branch: win32/perl
+ ! doio.c t/op/misc.t
+____________________________________________________________________________
+[ 609] By: gsar on 1998/03/02 01:23:56
+ Log: apply missing pieces from:
+ From: Chip Salzenberg <salzench@nielsenmedia.com>
+ Message-Id: <199711272044.PAA12102@nielsenmedia.com>
+ Subject: [PATCH] Improved LVALUE patch
+ Date: Thu, 27 Nov 1997 15:44:02 -0500 (EST)
+ Branch: win32/perl
+ ! sv.c
+____________________________________________________________________________
+[ 608] By: gsar on 1998/03/02 01:13:01
+ Log: merge two important 'old' patches
+ From: Chip Salzenberg <salzench@nielsenmedia.com>
+ Message-Id: <199709241632.MAA09164@nielsenmedia.com>
+ Subject: [PATCH] Fix C<42 until forever> SIGSEGV
+ Date: Wed, 24 Sep 1997 12:32:11 -0400 (EDT)
+ ------
+ From: Chip Salzenberg <salzench@nielsenmedia.com>
+ Message-Id: <199710221332.JAA04814@nielsenmedia.com>
+ Subject: [PATCH] Fix for compile-time while() warnings
+ Date: Wed, 22 Oct 1997 09:31:50 -0400 (EDT)
+ Branch: win32/perl
+ ! op.c
+____________________________________________________________________________
+[ 607] By: gsar on 1998/03/01 06:52:26
+ Log: integrate mainline changes
+ Branch: asperl
+ +> Policy_sh.SH Porting/config.sh Porting/config_H atomic.h
+ +> lib/Tie/Handle.pm t/op/tiehandle.t
+ - config_H
+ !> (integrate 89 files)
+____________________________________________________________________________
+[ 606] By: gsar on 1998/02/28 23:11:00
+ Log: misc small tweaks
+ - AutoLoader fix for long::pack::names
+ - d_mymalloc can be set from makefiles now
+ - make search.pl actually work on win32
+ - revert podoc about $^E on OS/2 (per Ilya's wishes)
+ Branch: win32/perl
+ ! lib/AutoLoader.pm pod/perlvar.pod win32/Makefile
+ ! win32/bin/search.pl win32/makefile.mk win32/win32.c
+____________________________________________________________________________
+[ 605] By: gsar on 1998/02/28 22:16:45
+ Log: fix typo in sv.h, and run 'make regen_headers' to make it build
+ Branch: win32/perl
+ ! embedvar.h sv.h
+____________________________________________________________________________
+[ 604] By: gsar on 1998/02/28 21:08:58
+ Log: integrate mainline
+ Branch: win32/perl
+ +> Policy_sh.SH atomic.h lib/Tie/Handle.pm t/op/tiehandle.t
+ !> Configure MANIFEST Makefile.SH bytecode.h bytecode.pl
+ !> byterun.c ext/SDBM_File/Makefile.PL
+ !> ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/sdbm.h
+ !> lib/ExtUtils/MM_VMS.pm os2/diff.configure os2/os2.c perl.c
+ !> perlvars.h pod/perltie.pod pp_sys.c sv.c sv.h t/lib/anydbm.t
+ !> t/lib/sdbm.t util.c vms/descrip.mms vms/perlvms.pod
+ !> vms/test.com win32/makedef.pl
+____________________________________________________________________________
+[ 603] By: nick on 1998/02/28 11:31:15
+ Log: Missed FREAD in bytecode.h
+ Cannot export svref_mutex in non-threaded perl
+ Branch: perl
+ ! bytecode.h win32/makedef.pl
+
+----------------
+Version 5.004_61
+----------------
+
+____________________________________________________________________________
+[ 602] By: mbeattie on 1998/02/27 18:35:27
+ Log: Change FREAD/FGETC to BGET_FREAD/BGET_FGETC to avoid clash with
+ preprocessor symbol on Digital UNIX.
+ Branch: perl
+ ! bytecode.h bytecode.pl byterun.c
+____________________________________________________________________________
+[ 601] By: mbeattie on 1998/02/27 18:27:00
+ Log: Fix stupid ATOMIC_DEC_AND_TEST typo in sv.h.
+ Branch: perl
+ ! sv.h
+____________________________________________________________________________
+[ 600] By: mbeattie on 1998/02/27 18:15:07
+ Log: Add atomic.h to MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 599] By: mbeattie on 1998/02/27 18:13:52
+ Log: Integrate win32 branch into mainline.
+ Branch: perl
+ ! bytecode.pl
+ !> bytecode.h byterun.c byterun.h dosish.h embed.h embedvar.h
+ !> ext/B/B.xs ext/B/Makefile.PL global.sym perl.h sv.c
+ !> win32/Makefile win32/bin/pl2bat.pl win32/config.bc
+ !> win32/config.gc win32/config.vc win32/config_H.bc
+ !> win32/config_H.gc win32/config_H.vc win32/config_h.PL
+ !> win32/makedef.pl win32/makefile.mk win32/win32.c win32/win32.h
+ !> win32/win32thread.h
+____________________________________________________________________________
+[ 598] By: mbeattie on 1998/02/27 18:06:41
+ Log: Make refcounts atomic for threading (dependent on appropriate
+ arch-dependent and compiler-dependent definitions in atomic.h
+ or else falls back to a global mutex to protect refcounts).
+ Branch: perl
+ + atomic.h
+ ! global.sym perl.c perlvars.h sv.c sv.h
+____________________________________________________________________________
+[ 597] By: mbeattie on 1998/02/27 15:37:22
+ Log: Tiehandle stuff in change 595 didn't add to MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 596] By: mbeattie on 1998/02/27 15:34:55
+ Log: Missed adding new file Policy_sh.SH in change 592.
+ Branch: perl
+ + Policy_sh.SH
+____________________________________________________________________________
+[ 595] By: mbeattie on 1998/02/27 15:34:06
+ Log: Subject: [PATCH] _60 & _04 - Add WRITE & CLOSE to TIEHANDLE
+ Date: Fri, 27 Feb 1998 04:15:04 +0000
+ From: Graham Barr <gbarr@pobox.com>
+ Branch: perl
+ + lib/Tie/Handle.pm t/op/tiehandle.t
+ ! pod/perltie.pod pp_sys.c
+____________________________________________________________________________
+[ 594] By: mbeattie on 1998/02/27 15:31:12
+ Log: From: Dan Sugalski <sugalskd@osshe.edu>
+ Subject: [PATCH 5.004_60] Fix to MM_VMS.PM
+ Date: Thu, 26 Feb 1998 11:09:55 -0800
+ Subject: [PATCH 5.004_60] Get SDBM_File working on VMS
+ Date: Thu, 26 Feb 1998 11:15:24 -0800
+ Branch: perl
+ ! ext/SDBM_File/Makefile.PL ext/SDBM_File/sdbm/Makefile.PL
+ ! ext/SDBM_File/sdbm/sdbm.h lib/ExtUtils/MM_VMS.pm
+ ! t/lib/anydbm.t t/lib/sdbm.t vms/descrip.mms vms/perlvms.pod
+ ! vms/test.com
+____________________________________________________________________________
+[ 593] By: mbeattie on 1998/02/27 15:26:45
+ Log: Fix file-descriptor leak when pipes fail via taint checks:
+ Subject: [PATCH] Some patches went through cracks
+ Date: Thu, 26 Feb 1998 02:47:46 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! os2/os2.c util.c
+____________________________________________________________________________
+[ 592] By: mbeattie on 1998/02/27 15:15:12
+ Log: Subject: Config_60-03-04.diff patch for 5.004_60
+ Date: Wed, 25 Feb 1998 17:14:39 -0500 (EST)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Branch: perl
+ ! Configure MANIFEST Makefile.SH os2/diff.configure
+____________________________________________________________________________
+[ 591] By: gsar on 1998/02/26 19:34:50
+ Log: added AS patch#9
+ Branch: asperl
+ - win32/ipdir.c win32/ipenv.c win32/iplio.c win32/ipmem.c
+ - win32/ipproc.c win32/ipsock.c win32/ipstdio.c
+ - win32/ipstdiowin.h win32/perlobj.def
+ ! ObjXSub.h globals.c perl.c proto.h win32/Makefile
+ ! win32/dl_win32.xs win32/runperl.c win32/win32.c win32/win32.h
+ ! win32/win32sck.c win32/win32thread.c
+____________________________________________________________________________
+[ 590] By: gsar on 1998/02/26 04:25:40
+ Log: various changes to make win32 build under the new Configure & co.
+ - added byterun.c to core C build
+ - makefile.mk now has a regen_config_h target to quickly update config_H.[bgv]c
+ after adding new variables to config.[bgv]c
+ - sig_name_init now has only the valid signals
+ - we now have $Config{usethreads}
+ - tested under the two commercial compilers w/ and w/o usethreads
+ Branch: win32/perl
+ ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/config_h.PL win32/makedef.pl win32/makefile.mk
+____________________________________________________________________________
+[ 589] By: gsar on 1998/02/26 03:56:19
+ Log: various cleanups so that B can be built as "just another extension"
+ - export symbols needed for building B
+ - bset_obj_store() is needed by byterun(), so define it there instead
+ of at B.xs, and export it
+ - freadpv() is only used in B.xs, so move it there
+ - byte*.h are now included by perl.h
+ - regenerate embed*.h
+ Branch: win32/perl
+ ! bytecode.h bytecode.pl byterun.c byterun.h embed.h embedvar.h
+ ! ext/B/B.xs ext/B/Makefile.PL global.sym perl.h
+____________________________________________________________________________
+[ 588] By: gsar on 1998/02/25 21:46:35
+ Log: integrate mainline
+ Branch: win32/perl
+ +> Porting/config.sh Porting/config_H
+ - config_H
+ !> (integrate 54 files)
+____________________________________________________________________________
+[ 587] By: gsar on 1998/02/25 19:20:26
+ Log: added AS patch#8
+ Branch: asperl
+ ! sv.c x2p/a2py.c x2p/util.c
+____________________________________________________________________________
+[ 586] By: gsar on 1998/02/25 19:08:06
+ Log: added AS patch#7
+ Message-Id: <01BD40F9.CE57B210.dougl@ActiveState.com>
+ Date: Tue, 24 Feb 1998 07:57:07 PST
+ From: Douglas Lankshear <dougl@ActiveState.com>
+ Subject: [PATCH]
+
+ Here's an attempt at
+ 6. MANIFEST must be updated with new file names
+ 5. Mktime(), Stat() etc., rather than MKtime()/STat() etc.
+ And some changes to move toward
+ 1. Merge PERL_OBJECT build support into regular Makefile and makefile.mk
+
+ -- Doug
+ Branch: asperl
+ ! MANIFEST installperl ipdir.h ipenv.h iplio.h ipmem.h ipproc.h
+ ! ipsock.h ipstdio.h lib/ExtUtils/MM_Win32.pm perldir.h
+ ! perlenv.h perlio.h perllio.h win32/Makefile
+____________________________________________________________________________
+[ 585] By: mbeattie on 1998/02/25 17:44:34
+ Log: More compiler tweaks.
+ Branch: perl
+ ! Makefile.SH bytecode.pl byterun.c byterun.h ext/B/B/Asmdata.pm
+____________________________________________________________________________
+[ 584] By: mbeattie on 1998/02/25 15:36:38
+ Log: Subject: [PATCH 5.004_60] dos-djgpp update
+ Date: Wed, 25 Feb 1998 11:17:07 +0100
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Branch: perl
+ ! djgpp/djgpp.c dosish.h hints/dos_djgpp.sh perl.c thread.h
+____________________________________________________________________________
+[ 583] By: mbeattie on 1998/02/25 15:34:48
+ Log: Move find_threadsv to right bit of global.sym. Bump patchlevel to 61.
+ Branch: perl
+ ! global.sym patchlevel.h
+____________________________________________________________________________
+[ 582] By: mbeattie on 1998/02/25 15:28:08
+ Log: Subject: Re: [PATCH 5.004_60] Fix goto-in-eval segfault (unwrapped!)
+ Date: Tue, 24 Feb 1998 11:15:57 +0000
+ From: Robin Houston <robin@oneworld.org>
+ Branch: perl
+ ! pod/perldiag.pod pp_ctl.c
+____________________________________________________________________________
+[ 581] By: mbeattie on 1998/02/25 15:27:06
+ Log: Subject: [PATCH] #ifdef CAN_PROTOTYPE cleanup
+ Date: 23 Feb 1998 23:36:09 +0100
+ From: Gisle Aas <gisle@aas.no>
+ Branch: perl
+ ! doio.c miniperlmain.c op.c perl.c pp.h regcomp.c toke.c util.c
+____________________________________________________________________________
+[ 580] By: mbeattie on 1998/02/25 15:25:29
+ Log: Subject: [PATCH 5.004_60] improved Test.pm
+ Date: Sat, 21 Feb 1998 14:17:09 -0500
+ From: Joshua Pritikin <pritikin@mindspring.com>
+ Branch: perl
+ ! lib/Test.pm
+____________________________________________________________________________
+[ 579] By: mbeattie on 1998/02/25 15:23:24
+ Log: HP-UX hints and AIX global.sym changes (with Makefile.SH rule)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Subject: [PATCH] 5.004_60: AIX: global.sym and Makefile.SH
+ Date: Sat, 21 Feb 1998 15:26:19 +0200 (EET)
+ Subject: Re: your HP-UX perl patch
+ Date: Mon, 23 Feb 1998 23:14:37 +0200 (EET)
+ Branch: perl
+ ! Makefile.SH embed.h global.sym hints/hpux.sh
+____________________________________________________________________________
+[ 578] By: mbeattie on 1998/02/25 15:18:06
+ Log: Back out DB_File patch (change _553) and tweak Configure.
+ Subject: ANNOUNCE: perl5.004_60 is available
+ Date: Mon, 23 Feb 1998 10:47:26 -0000
+ From: Paul Marquess <pmarquess@bfsec.bt.co.uk>
+ Branch: perl
+ ! Configure ext/DB_File/DB_File.xs
+____________________________________________________________________________
+[ 577] By: mbeattie on 1998/02/25 15:04:00
+ Log: Subject: [PATCH] Cwd.pm
+ Date: Fri, 20 Feb 1998 10:27:54 -0600
+ From: Graham Barr <gbarr@ti.com>
+ Branch: perl
+ ! lib/Cwd.pm
+____________________________________________________________________________
+[ 576] By: mbeattie on 1998/02/25 15:02:57
+ Log: From: ilya@math.ohio-state.edu (Ilya Zakharevich)
+ Subject: [5.004_5* PATCH] Make ornaments default in Term::ReadLine
+ Date: Fri, 20 Feb 1998 00:09:52 -0500 (EST)
+ Subject: [PATCH 5.004_5*] Fix debugger messages and the default package
+ Date: Fri, 20 Feb 1998 00:12:28 -0500 (EST)
+ Subject: Re: Continued presence of segmentation violation in study_chunk()[PATCH]
+ Date: Sat, 21 Feb 1998 15:32:29 -0500 (EST)
+ Branch: perl
+ ! lib/Term/ReadLine.pm lib/perl5db.pl regcomp.c
+____________________________________________________________________________
+[ 575] By: mbeattie on 1998/02/25 14:58:00
+ Log: Subject: Re: ANNOUNCE: perl5.004_60 Configure patch is available
+ Date: Tue, 24 Feb 1998 16:02:43 -0500 (EST)
+ From: Andy Dougherty <doughera@lafcol.lafayette.edu>
+ Branch: perl
+ + Porting/config.sh Porting/config_H
+ - config_H
+ ! Configure INSTALL MANIFEST Makefile.SH Porting/Glossary
+ ! Porting/pumpkin.pod config_h.SH ext/POSIX/POSIX.xs
+ ! hints/aix.sh hints/amigaos.sh hints/bsdos.sh hints/dec_osf.sh
+ ! hints/freebsd.sh hints/irix_6.sh hints/linux.sh
+ ! hints/netbsd.sh hints/next_3.sh hints/next_4.sh hints/os2.sh
+ ! hints/solaris_2.sh makedepend.SH perl.c perl.h pp.c pp_sys.c
+ ! t/lib/thread.t t/op/nothread.t x2p/Makefile.SH
+____________________________________________________________________________
+[ 574] By: gsar on 1998/02/24 02:21:14
+ Log: fix typos in sv.c
+ Branch: win32/perl
+ ! sv.c
+____________________________________________________________________________
+[ 573] By: mbeattie on 1998/02/23 10:03:39
+ Log: Remove old Linux+threads segfault degugging kludge.
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 572] By: gsar on 1998/02/23 09:45:26
+ Log: undo previous change (no added value!)
+ Branch: win32/perl
+ ! win32/bin/pl2bat.pl
+____________________________________________________________________________
+[ 571] By: gsar on 1998/02/23 09:18:32
+ Log: fix pl2bat.pl to tolerate trailing .bat (as suggested by
+ John Cavanaugh <cavanaug@sdd.hp.com>)
+ Branch: win32/perl
+ ! win32/bin/pl2bat.pl
+____________________________________________________________________________
+[ 570] By: gsar on 1998/02/22 04:02:15
+ Log: support chown() (just a noop for now)
+ Branch: win32/perl
+ ! dosish.h win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 569] By: gsar on 1998/02/22 03:09:55
+ Log: integrate latest win32 branch
+ Branch: asperl
+ +> (branch 41 files)
+ !> (integrate 59 files)
+____________________________________________________________________________
+[ 568] By: gsar on 1998/02/22 02:40:56
+ Log: get compiler building under win32 (needed Makefile.PL
+ hacks that could be applicable to other platforms)
+ Branch: win32/perl
+ ! ext/B/Makefile.PL win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 567] By: gsar on 1998/02/22 01:30:19
+ Log: integrate mainline
+ Branch: win32/perl
+ +> (branch 41 files)
+ !> (integrate 46 files)
+____________________________________________________________________________
+[ 566] By: gsar on 1998/02/20 22:31:56
+ Log: fix handle leak in join()
+ Branch: win32/perl
+ ! win32/win32thread.h
+
+----------------
+Version 5.004_60
+----------------
+
+____________________________________________________________________________
+[ 565] By: mbeattie on 1998/02/20 18:23:47
+ Log: Remove compiler files from their old lib/B locations. The compiler
+ now builds by default (without the byteperl executable so far) and
+ seems to work at least minimally.
+ Branch: perl
+ - lib/B.pm lib/B/Asmdata.pm lib/B/Assembler.pm lib/B/Bblock.pm
+ - lib/B/Bytecode.pm lib/B/C.pm lib/B/CC.pm lib/B/Debug.pm
+ - lib/B/Deparse.pm lib/B/Disassembler.pm lib/B/Lint.pm
+ - lib/B/Showlex.pm lib/B/Stackobj.pm lib/B/Terse.pm
+ - lib/B/Xref.pm lib/B/assemble lib/B/cc_harness
+ - lib/B/disassemble lib/B/makeliblinks lib/O.pm
+ ! MANIFEST bytecode.pl
+____________________________________________________________________________
+[ 564] By: mbeattie on 1998/02/20 18:05:33
+ Log: Move lib/B/... and lib/[BO].pm over to where they should be,
+ under ext/B.
+ Branch: perl
+ +> ext/B/B.pm ext/B/B/Asmdata.pm ext/B/B/Assembler.pm
+ +> ext/B/B/Bblock.pm ext/B/B/Bytecode.pm ext/B/B/C.pm
+ +> ext/B/B/CC.pm ext/B/B/Debug.pm ext/B/B/Deparse.pm
+ +> ext/B/B/Disassembler.pm ext/B/B/Lint.pm ext/B/B/Showlex.pm
+ +> ext/B/B/Stackobj.pm ext/B/B/Terse.pm ext/B/B/Xref.pm
+ +> ext/B/B/assemble ext/B/B/cc_harness ext/B/B/disassemble
+ +> ext/B/B/makeliblinks ext/B/O.pm
+____________________________________________________________________________
+[ 563] By: mbeattie on 1998/02/20 17:54:58
+ Log: Start getting compiler to work when built with the core.
+ [Still won't work as of this change.]
+ Branch: perl
+ +> byterun.c byterun.h lib/B/Asmdata.pm lib/B/Assembler.pm
+ +> lib/B/Bblock.pm lib/B/Bytecode.pm lib/B/C.pm lib/B/CC.pm
+ +> lib/B/Debug.pm lib/B/Deparse.pm lib/B/Disassembler.pm
+ +> lib/B/Lint.pm lib/B/Showlex.pm lib/B/Stackobj.pm
+ +> lib/B/Terse.pm lib/B/Xref.pm
+ ! MANIFEST Makefile.SH bytecode.pl ext/B/Makefile.PL
+____________________________________________________________________________
+[ 562] By: mbeattie on 1998/02/20 16:42:13
+ Log: Merge perlext/Compiler/... into mainline. Some files move to
+ ext/B/..., some to lib/B/..., O.pm and B.pm go in lib and some
+ move to the base perl directory (e.g. headers). Will need some
+ cleaning up before it builds properly, I would guess.
+ Branch: perl
+ +> bytecode.h bytecode.pl cc_runtime.h ext/B/B.xs
+ +> ext/B/Makefile.PL ext/B/NOTES ext/B/README ext/B/TESTS
+ +> ext/B/Todo ext/B/byteperl.c ext/B/ramblings/cc.notes
+ +> ext/B/ramblings/curcop.runtime ext/B/ramblings/flip-flop
+ +> ext/B/ramblings/magic ext/B/ramblings/reg.alloc
+ +> ext/B/ramblings/runtime.porting ext/B/typemap lib/B.pm
+ +> lib/B/assemble lib/B/cc_harness lib/B/disassemble
+ +> lib/B/makeliblinks lib/O.pm
+____________________________________________________________________________
+[ 561] By: mbeattie on 1998/02/20 16:39:38
+ Log: Win32 changes from Sarathy, tweaked slightly by me.
+ Branch: perlext
+ ! Compiler/B.xs Compiler/B/Asmdata.pm Compiler/B/Bytecode.pm
+ ! Compiler/B/C.pm Compiler/Makefile.PL Compiler/assemble
+ ! Compiler/bytecode.h Compiler/bytecode.pl Compiler/byteperl.c
+ ! Compiler/byterun.c Compiler/byterun.h Compiler/cc_harness
+____________________________________________________________________________
+[ 560] By: mbeattie on 1998/02/20 15:46:15
+ Log: Initialise $@ early (fixes t/lib/ph.t for threaded perl).
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 559] By: mbeattie on 1998/02/20 12:56:10
+ Log: Add missing t/op/wantarray.t to MANIFEST. Bump patchlevel to 60.
+ Branch: perl
+ ! MANIFEST patchlevel.h
+____________________________________________________________________________
+[ 558] By: mbeattie on 1998/02/20 12:53:26
+ Log: Integrate win32 branch into mainline.
+ Branch: perl
+ !> XSUB.h config_h.SH doio.c lib/Pod/Html.pm pp_sys.c
+ !> win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ !> win32/makedef.pl win32/makefile.mk win32/win32.c win32/win32.h
+ !> win32/win32iop.h x2p/a2p.h
+____________________________________________________________________________
+[ 557] By: mbeattie on 1998/02/20 12:51:42
+ Log: Subject: retry [PATCH] 5.004_59: the perlhist.pod etc
+ Date: Thu, 19 Feb 1998 17:54:52 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! ext/Thread/Thread.pm ext/Thread/Thread/Queue.pm
+ ! ext/Thread/Thread/Semaphore.pm ext/Thread/Thread/Specific.pm
+ ! lib/fields.pm pod/buildtoc pod/perl.pod pod/perlhist.pod
+ ! pod/perltoc.pod pod/perlvar.pod
+____________________________________________________________________________
+[ 556] By: mbeattie on 1998/02/20 12:49:54
+ Log: Subject: [PATCH] installperl
+ Date: Wed, 18 Feb 1998 11:51:44 -0500 (est)
+ From: Norton Allen <allen@huarp.harvard.edu>
+ Branch: perl
+ ! installperl
+____________________________________________________________________________
+[ 555] By: mbeattie on 1998/02/20 12:49:09
+ Log: Subject: [PATCH:_59] t/op/wantarray.t
+ Date: Wed, 18 Feb 1998 11:19:54 -0500 (est)
+ From: Norton Allen <allen@huarp.harvard.edu>
+ Branch: perl
+ + t/op/wantarray.t
+____________________________________________________________________________
+[ 554] By: mbeattie on 1998/02/20 12:47:44
+ Log: Subject: Misprint in regcomp.c [PATCH]
+ Date: Tue, 17 Feb 1998 23:54:07 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! regcomp.c
+____________________________________________________________________________
+[ 553] By: mbeattie on 1998/02/20 12:45:08
+ Log: Subject: DB_File ->length does not work just after tie.
+ Date: Tue, 17 Feb 1998 13:19:18 GMT
+ From: Nick Ing-Simmons <nik@tiuk.ti.com>
+ Branch: perl
+ ! ext/DB_File/DB_File.xs
+____________________________________________________________________________
+[ 552] By: mbeattie on 1998/02/20 12:43:32
+ Log: Subject: [PATCH] - perl5.005_59, update Copyright
+ Date: Mon, 16 Feb 1998 20:31:06 -0500 (EST)
+ From: lusol@CS4.CC.Lehigh.EDU (Stephen O. Lidie)
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 551] By: mbeattie on 1998/02/20 12:42:41
+ Log: Subject: Re: for() and map() peculiarity
+ Date: Mon, 16 Feb 1998 21:33:44 +0000
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Branch: perl
+ ! pod/perlsyn.pod
+____________________________________________________________________________
+[ 550] By: mbeattie on 1998/02/20 12:41:53
+ Log: Subject: [PATCH 5.004_59] Updates to VMS/CONFIG.VMS
+ Date: Mon, 16 Feb 1998 11:46:29 -0800
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Branch: perl
+ ! vms/config.vms
+____________________________________________________________________________
+[ 549] By: mbeattie on 1998/02/20 12:40:55
+ Log: Subject: [PATCH] 5.004_59 global.sym for AIX 3.2.5
+ Date: Mon, 16 Feb 1998 14:27:53 -0500 (EST)
+ From: "Stephen O. Lidie" <lusol@turkey.cc.Lehigh.EDU>
+ Branch: perl
+ ! global.sym
+____________________________________________________________________________
+[ 548] By: mbeattie on 1998/02/20 12:39:56
+ Log: Subject: [PATCH] 5.004_59: hints/irix_6.sh
+ Date: Mon, 16 Feb 1998 15:44:57 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 547] By: mbeattie on 1998/02/20 12:38:58
+ Log: Subject: [PATCH] perlguts update
+ Date: 16 Feb 1998 11:23:53 +0100
+ From: Gisle Aas <gisle@aas.no>
+ Branch: perl
+ ! pod/perlguts.pod
+____________________________________________________________________________
+[ 546] By: mbeattie on 1998/02/20 12:38:01
+ Log: Subject: [PATCH 5.004_59] bsdos/hints.sh is wrong
+ Date: Sun, 15 Feb 1998 23:56:05 -0500
+ From: Irving Reid <irving@tor.securecomputing.com>
+ Branch: perl
+ ! hints/bsdos.sh
+____________________________________________________________________________
+[ 545] By: mbeattie on 1998/02/20 12:37:11
+ Log: Subject: [PATCH] 5% speedup in an empty loop
+ Date: Sun, 15 Feb 1998 17:49:46 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 544] By: mbeattie on 1998/02/20 12:36:26
+ Log: Subject: [PATCH for 5.004_59] netdb_host_type and netdb_hlen_type on NeXt
+ Date: Sun, 15 Feb 98 23:06:16 +0100
+ From: Hans Mulder <hansm@icgroup.nl>
+ Branch: perl
+ ! hints/next_3.sh hints/next_4.sh
+____________________________________________________________________________
+[ 543] By: mbeattie on 1998/02/20 12:35:39
+ Log: Subject: [PATCH for 5.004_59] Perl_sbrk declared inconsistently
+ Date: Sun, 15 Feb 98 23:05:20 +0100
+ From: Hans Mulder <hansm@icgroup.nl>
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 542] By: mbeattie on 1998/02/20 12:35:03
+ Log: Subject: [PATCH for 5.004_59] "d_gethbyname" misspelled in Configure
+ From: Hans Mulder <hansm@icgroup.nl>
+ Date: Sun, 15 Feb 98 23:04:29 +0100
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 541] By: mbeattie on 1998/02/20 12:33:56
+ Log: Subject: [PATCH for 5.004_59] NeXT doesn't need DONT_DECLARE_STD (was:
+ NeXT needs DONT_DECLARE_STD)
+ Date: Sun, 15 Feb 98 23:04:19 +0100
+ From: Hans Mulder <hansm@icgroup.nl>
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 540] By: mbeattie on 1998/02/20 12:32:25
+ Log: Subject: [PATCH] sv_check_thinkfirst macroized
+ Date: 15 Feb 1998 22:00:38 +0100
+ From: Gisle Aas <gisle@aas.no>
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 539] By: mbeattie on 1998/02/20 12:31:07
+ Log: Subject: [PATCH 5.004_59] allow the Test::Harness to grok TODO-type tests docs
+ Date: Sat, 14 Feb 1998 17:58:01 -0500
+ From: Joshua Pritikin <pritikin@mindspring.com>
+ Branch: perl
+ + lib/Test.pm
+ ! MANIFEST lib/Test/Harness.pm
+____________________________________________________________________________
+[ 538] By: mbeattie on 1998/02/20 12:24:31
+ Log: Subject: [PATCH] 5.004_59: locale startup problems documentation++
+ Date: Sat, 14 Feb 1998 15:40:44 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! INSTALL pod/perldiag.pod pod/perllocale.pod
+____________________________________________________________________________
+[ 537] By: mbeattie on 1998/02/20 12:23:04
+ Log: Subject: [PATCH] Updated, non-wordwrapped, patch to README.VMS
+ Date: Fri, 13 Feb 1998 13:38:28 -0800
+ From: Dan Sugalski <sugalskd@osshe.edu>
+ Branch: perl
+ ! README.vms
+____________________________________________________________________________
+[ 536] By: mbeattie on 1998/02/20 12:20:29
+ Log: Subject: [PATCH] 5.004_58, move intuition tests
+ Date: Thu, 12 Feb 1998 17:11:05 -0600
+ From: Stephen Potter <spp@psa.pencom.com>
+ Branch: perl
+ ! t/lib/anydbm.t t/lib/gdbm.t t/lib/ndbm.t t/lib/odbm.t
+ ! t/lib/sdbm.t t/op/array.t t/op/delete.t t/op/each.t
+ ! t/op/flip.t t/op/pat.t t/op/push.t
+____________________________________________________________________________
+[ 535] By: gsar on 1998/02/19 23:07:24
+ Log: applied a version of this with tabs intact
+ Message-Id: <wklnv7pdf5.fsf@turangalila.harmonixmusic.com>
+ Date: 19 Feb 1998 15:06:38 EST
+ From: dfan@harmonixmusic.com (Dan Schmidt)
+ Subject: Pod::Html bug and fix: missing </UL> in index
+ Branch: win32/perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 534] By: gsar on 1998/02/19 19:40:27
+ Log: Fix C<0> problem in Pod::Html
+ Branch: win32/perl
+ ! lib/Pod/Html.pm
+____________________________________________________________________________
+[ 533] By: gsar on 1998/02/18 18:11:08
+ Log: non-debug VC builds are -O1 now (they say it works, and is
+ faster)
+ Branch: win32/perl
+ ! win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 532] By: gsar on 1998/02/18 04:11:03
+ Log: integrate nick's patch to mainline
+ Branch: win32/perl
+ !> pp.c
+____________________________________________________________________________
+[ 531] By: mbeattie on 1998/02/17 17:50:50
+ Log: Assorted changes to the compiler
+ Branch: perlext
+ ! Compiler/B.pm Compiler/B.xs Compiler/B/Asmdata.pm
+ ! Compiler/B/Bytecode.pm Compiler/B/C.pm Compiler/B/Debug.pm
+ ! Compiler/NOTES Compiler/O.pm Compiler/bytecode.pl
+ ! Compiler/byterun.c Compiler/byterun.h Compiler/typemap
+____________________________________________________________________________
+[ 530] By: gsar on 1998/02/17 01:47:35
+ Log: DLLs are now ok on mingw32/gcc-2.8.0 after removing the
+ FORCE_ARG_STRING() hack (that bug is fixed in gcc now). mingw32
+ build passes all tests except t/lib/io_xs.t (seems to be due to
+ broken tmpfile() in the CRT or import lib)
+ Branch: win32/perl
+ ! XSUB.h win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 529] By: gsar on 1998/02/16 23:03:31
+ Log: fix mingw32 gcc 2.8.0 build (DLLs generated seem to be broken
+ in this version of gcc!)
+ Branch: win32/perl
+ ! doio.c pp_sys.c win32/config.gc win32/makefile.mk
+ ! win32/win32.c win32/win32.h win32/win32iop.h x2p/a2p.h
+____________________________________________________________________________
+[ 528] By: nick on 1998/02/16 22:13:04
+ Log: Missing PUSHMARK in unshift TIEARRAY hook
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 527] By: gsar on 1998/02/15 20:59:07
+ Log: integrate win32 branch
+ Branch: asperl
+ !> config_h.SH win32/config.bc win32/config.gc win32/config.vc
+ !> win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ !> win32/makedef.pl
+____________________________________________________________________________
+[ 526] By: gsar on 1998/02/15 20:02:11
+ Log: Fix typo: s/GETNETBYADD\b/GETNETBYADDR/
+ Branch: win32/perl
+ ! config_h.SH win32/config_H.bc win32/config_H.gc
+ ! win32/config_H.vc
+____________________________________________________________________________
+[ 525] By: gsar on 1998/02/15 03:26:45
+ Log: fix build problems due to renamed Config variables
+ Branch: win32/perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/makedef.pl
+____________________________________________________________________________
+[ 524] By: gsar on 1998/02/14 01:00:15
+ Log: bring ASPerl uptodate with mainline changes
+ Branch: asperl
+ +> ext/DB_File/Changes t/comp/require.t
+ !> (integrate 41 files)
+____________________________________________________________________________
+[ 523] By: gsar on 1998/02/14 00:52:17
+ Log: integrate mainline
+ Branch: win32/perl
+ !> hints/qnx.sh lib/Cwd.pm lib/ExtUtils/xsubpp patchlevel.h
+ !> pp_hot.c t/op/magic.t
+____________________________________________________________________________
+[ 522] By: gsar on 1998/02/14 00:42:37
+ Log: added AS patch#6
+ Message-Id: <01BD3846.B29FB880.dougl@ActiveState.com>
+ Date: Fri, 13 Feb 1998 06:14:51 PST
+ From: Douglas Lankshear <dougl@ActiveState.com>
+ Subject: [PATCH] command line build
+
+ This patch is for the command line build of perl object.
+ I'll merge the ipfoo.c function with win32_xxx functions next.
+
+ -- Doug
+ Branch: asperl
+ ! ObjXSub.h ext/Opcode/Opcode.xs lib/ExtUtils/MM_Win32.pm
+ ! objpp.h proto.h sv.c win32/dl_win32.xs win32/ipenv.c
+ ! win32/ipstdio.c win32/makedef.pl win32/runperl.c win32/win32.h
+____________________________________________________________________________
+[ 521] By: gsar on 1998/02/14 00:14:04
+ Log: added AS patch#5 (patch #4 was intentionally skipped after
+ discussion)
+ Branch: asperl
+ ! embed.h embedvar.h global.sym globals.c hv.c interp.sym
+ ! intrpvar.h op.c perl.c perl.h pp_ctl.c proto.h regcomp.c
+ ! regexec.c sv.c toke.c
+____________________________________________________________________________
+[ 520] By: nick on 1998/02/13 18:15:46
+ Log: Resolve ansiperl against win32
+ Branch: ansiperl
+ +> ext/DB_File/Changes ext/POSIX/hints/linux.pl
+ +> ext/POSIX/hints/sunos_4.pl lib/Fatal.pm t/comp/require.t
+ +> t/lib/ph.t
+ !> (integrate 898 files)
+
+----------------
+Version 5.004_59
+----------------
+
+____________________________________________________________________________
+[ 519] By: mbeattie on 1998/02/13 17:05:37
+ Log: Integrate win32 into mainline.
+ Branch: perl
+ ! lib/ExtUtils/xsubpp
+ !> win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ !> win32/makefile.mk
+____________________________________________________________________________
+[ 518] By: mbeattie on 1998/02/13 17:01:16
+ Log: Bump patchlevel.h to 59.
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 517] By: mbeattie on 1998/02/13 16:57:59
+ Log: Subject: [PATCH] _58: wantarray in void context broken
+ Date: Fri, 13 Feb 1998 11:24:49 -0500 (est)
+ From: Norton Allen <allen@huarp.harvard.edu>
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 516] By: mbeattie on 1998/02/13 16:55:33
+ Log: Subject: [PATCH] 5.004_58 QNX getcwd
+ Date: Thu, 12 Feb 1998 13:40:56 -0500 (est)
+ From: Norton Allen <allen@huarp.harvard.edu>
+ Branch: perl
+ ! hints/qnx.sh lib/Cwd.pm t/op/magic.t
+____________________________________________________________________________
+[ 515] By: gsar on 1998/02/12 18:29:52
+ Log: pickup lddlflags properly for Config.pm
+ Branch: win32/perl
+ ! win32/Makefile win32/config.bc win32/config.gc win32/config.vc
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 514] By: gsar on 1998/02/12 18:16:09
+ Log: fix xsubpp bug in SETMAGIC code
+ Branch: win32/perl
+ ! lib/ExtUtils/xsubpp
+____________________________________________________________________________
+[ 513] By: gsar on 1998/02/12 18:06:30
+ Log: integrate mainline
+ Branch: win32/perl
+ +> ext/DB_File/Changes
+ !> Configure MANIFEST config_h.SH ext/DB_File/DB_File.pm
+ !> ext/DB_File/DB_File.xs hints/machten.sh
+ !> lib/ExtUtils/Install.pm lib/Pod/Html.pm lib/Pod/Text.pm
+ !> lib/perl5db.pl malloc.c pod/perldiag.pod pod/perlpod.pod
+ !> pod/pod2man.PL pp_sys.c regcomp.c regexec.c scope.h sv.c
+ !> t/lib/db-recno.t t/lib/filecopy.t t/op/misc.t t/op/pat.t
+ !> t/op/re_tests t/pragma/locale.t
+____________________________________________________________________________
+[ 512] By: mbeattie on 1998/02/12 17:34:02
+ Log: Missing WITH_THR from new deb() in ENTER/LEAVE caused builds
+ with -DUSE_THREADS -DDEBUGGING to fail.
+ Branch: perl
+ ! scope.h
+____________________________________________________________________________
+[ 511] By: mbeattie on 1998/02/12 16:44:03
+ Log: Integrate win32 into mainline
+ Branch: perl
+ +> t/comp/require.t
+ !> MANIFEST pp_ctl.c scope.c scope.h t/op/local.t toke.c
+____________________________________________________________________________
+[ 510] By: mbeattie on 1998/02/12 16:42:26
+ Log: Subject: Re: [PATCH] 5.004_58 | _04 DynaLoader.pm -> DynaLoader.pm.PL (resend)
+ Date: 12 Feb 1998 14:25:55 +0100
+ From: koenig@kulturbox.de (Andreas J. Koenig)
+ Branch: perl
+ ! lib/ExtUtils/Install.pm
+____________________________________________________________________________
+[ 509] By: mbeattie on 1998/02/12 16:40:34
+ Log: Subject: Re: wrong prototype for sbrk [PATCH]
+ Date: Wed, 11 Feb 1998 15:37:31 -0500 (EST)
+ From: Andy Dougherty <doughera@newton.phys.lafayette.edu>
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 508] By: mbeattie on 1998/02/12 16:36:53
+ Log: Subject: [PATCH] 5.004_58 | _04: pod2*,perlpod: L<show this|man/section>
+ Date: Wed, 11 Feb 1998 17:29:20 +0100
+ From: Achim Bohnet <ach@mpe.mpg.de>
+ Branch: perl
+ ! lib/Pod/Html.pm lib/Pod/Text.pm pod/perlpod.pod pod/pod2man.PL
+____________________________________________________________________________
+[ 507] By: mbeattie on 1998/02/12 16:35:26
+ Log: Subject: [PATCH] slight tweaks to hints/machten.sh
+ Date: Wed, 11 Feb 1998 14:59:46 +0100
+ From: Dominic Dunlop <domo@vo.lu>
+ Branch: perl
+ ! hints/machten.sh
+____________________________________________________________________________
+[ 506] By: mbeattie on 1998/02/12 16:28:40
+ Log: Subject: DB_File 1.58 patch
+ Date: Tue, 10 Feb 1998 11:23:22 +0000 (GMT)
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Branch: perl
+ + ext/DB_File/Changes
+ ! MANIFEST ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
+ ! t/lib/db-recno.t
+____________________________________________________________________________
+[ 505] By: mbeattie on 1998/02/12 16:24:26
+ Log: Subject: 5.004_5*: [PATCH] restore old behaviour of \1 in RE
+ Date: Tue, 10 Feb 1998 02:57:46 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! regexec.c t/op/re_tests
+____________________________________________________________________________
+[ 504] By: mbeattie on 1998/02/12 16:22:46
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Subject: [PATCH] 5.004_58: the locale.t problem in IRIX
+ Date: Mon, 9 Feb 1998 19:47:22 +0200 (EET)
+ Subject: [PATCH] 5.004_58: reserve the POSIX regexp extensions
+ Date: Tue, 10 Feb 1998 15:12:12 +0200 (EET)
+ Subject: [PATCH] 5.004_58: <netdb.h> API prototype probing
+ Date: Wed, 11 Feb 1998 12:50:35 +0200 (EET)
+ Branch: perl
+ ! Configure config_h.SH pod/perldiag.pod pp_sys.c regcomp.c
+ ! t/op/misc.t t/op/pat.t t/op/re_tests t/pragma/locale.t
+____________________________________________________________________________
+[ 503] By: mbeattie on 1998/02/12 16:15:43
+ Log: Subject: [PATCH] filecopy.t #3 fails on dos-djgpp
+ Date: Mon, 9 Feb 1998 13:19:45 +0100
+ From: Laszlo Molnar <molnarl@cdata.tvnet.hu>
+ Branch: perl
+ ! t/lib/filecopy.t
+____________________________________________________________________________
+[ 502] By: mbeattie on 1998/02/12 16:14:27
+ Log: Assorted patches to sv.c:
+ From: Gisle Aas <gisle@aas.no>
+ Subject: [PATCH] sv_grow can fail for HAS_64K_LIMIT systems
+ Date: 07 Feb 1998 00:21:57 +0100
+ Subject: [PATCH] sv_setnv will upgrade SVt_NV to SVt_PVNV
+ Date: 07 Feb 1998 00:29:45 +0100
+ Subject: [PATCH] sv_upgrade() always returns TRUE
+ Date: 09 Feb 1998 15:44:01 +0100
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 501] By: mbeattie on 1998/02/12 16:09:26
+ Log: Fix saving of STDOUT during system() in lib/perl5db.pl:
+ Subject: Perl debugger.
+ Date: Fri, 6 Feb 1998 17:47:08 -0500
+ From: "Jason A. Smith" <smithj4@rpi.edu>
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 500] By: gsar on 1998/02/12 03:20:55
+ Log: merge another maint patch
+ Message-Id: <199802102349.SAA16001@aatma.engin.umich.edu>
+ Date: Tue, 10 Feb 1998 18:49:00 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: Re: after an eval-ed bad require, requiring a string ref gives a SEGV
+ Branch: win32/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 499] By: gsar on 1998/02/12 03:14:39
+ Log: make t/comp/require.t type xtext
+ Branch: win32/perl
+ ! t/comp/require.t
+____________________________________________________________________________
+[ 498] By: gsar on 1998/02/12 03:09:58
+ Log: fix extra LEAVE when require fails
+ Message-Id: <199802102321.SAA15346@aatma.engin.umich.edu>
+ Date: Tue, 10 Feb 1998 18:21:37 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: Re: evals and requires make seg-fault with bad require file
+ Branch: win32/perl
+ + t/comp/require.t
+ ! MANIFEST pp_ctl.c scope.c scope.h toke.c
+____________________________________________________________________________
+[ 497] By: gsar on 1998/02/12 02:47:29
+ Log: merge a maint patch
+ Message-Id: <199802110515.AAA23700@aatma.engin.umich.edu>
+ Date: Wed, 11 Feb 1998 00:15:51 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: Re: "local" can crash perl-4.00[34] on Solaris-x86 & FreeBSD
+ Branch: win32/perl
+ ! pp_ctl.c t/op/local.t
+____________________________________________________________________________
+[ 496] By: mbeattie on 1998/02/11 13:04:50
+ Log: Integrate win32 into mainline.
+ Branch: perl
+ !> embed.h ext/GDBM_File/typemap ext/NDBM_File/typemap
+ !> ext/ODBM_File/typemap ext/SDBM_File/typemap global.sym gv.c
+ !> lib/ExtUtils/typemap lib/ExtUtils/xsubpp op.c
+ !> os2/OS2/PrfDB/typemap pod/perlguts.pod pod/perlobj.pod
+ !> pod/perlxs.pod pod/perlxstut.pod proto.h sv.c sv.h t/op/ref.t
+ !> win32/makedef.pl win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 495] By: mbeattie on 1998/02/11 13:03:59
+ Log: Fix special constants in Xref.pm
+ Branch: perlext
+ ! Compiler/B/Xref.pm
+____________________________________________________________________________
+[ 494] By: gsar on 1998/02/10 18:26:28
+ Log: fix opendir() problem on share names
+ Message-Id: <199802101828.NAA10420@aatma.engin.umich.edu>
+ Date: Tue, 10 Feb 1998 13:28:53 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: Re: BUG: opendir and UNC names on NT
+ Branch: win32/perl
+ ! win32/win32.c
+____________________________________________________________________________
+[ 493] By: gsar on 1998/02/09 23:09:40
+ Log: integrate win32 branch contents
+ Branch: asperl
+ +> ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
+ +> lib/Fatal.pm t/lib/ph.t
+ ! hv.c
+ !> (integrate 895 files)
+____________________________________________________________________________
+[ 492] By: gsar on 1998/02/09 07:30:19
+ Log: enhancements to previous patch for XSUB OUTPUT args
+ Message-Id: <199802090731.CAA04438@aatma.engin.umich.edu>
+ Date: Mon, 09 Feb 1998 02:31:55 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: Re: [PATCH] XSUB OUTPUT arguments and 'set' magic
+ Branch: win32/perl
+ ! embed.h ext/GDBM_File/typemap ext/NDBM_File/typemap
+ ! ext/ODBM_File/typemap ext/SDBM_File/typemap global.sym
+ ! lib/ExtUtils/typemap lib/ExtUtils/xsubpp os2/OS2/PrfDB/typemap
+ ! pod/perlguts.pod pod/perlxs.pod pod/perlxstut.pod proto.h sv.c
+ ! sv.h
+____________________________________________________________________________
+[ 491] By: gsar on 1998/02/09 03:00:52
+ Log: don't share TARG unless -DUSE_BROKEN_PAD_RESET
+ Message-Id: <199710300036.TAA01004@aatma.engin.umich.edu>
+ Date: Wed, 29 Oct 1997 19:36:25 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: [PATCH] Don't use broken pad_reset() (was Re: Perl bug in 5.004_03 )
+ Branch: win32/perl
+ ! op.c
+____________________________________________________________________________
+[ 490] By: gsar on 1998/02/09 02:30:43
+ Log: fix for bugs in handling DESTROY (adjusted test numbers)
+ Message-Id: <199801010030.TAA14274@aatma.engin.umich.edu>
+ Subject: Re: [PERL] RFD: iterative DESTROYing of objects
+ Date: Wed, 31 Dec 1997 19:30:46 -0500
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Branch: win32/perl
+ ! pod/perlobj.pod sv.c t/op/ref.t
+____________________________________________________________________________
+[ 489] By: gsar on 1998/02/09 00:30:35
+ Log: ansify prototype for my_safemalloc(), avoid warnings
+ Branch: win32/perl
+ ! sv.c
+____________________________________________________________________________
+[ 488] By: gsar on 1998/02/09 00:29:08
+ Log: fix misapplied hunks in 5.004_58
+ Message-Id: <199802080718.CAA18115@aatma.engin.umich.edu>
+ Date: Sun, 08 Feb 1998 02:18:12 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: [PATCH] fixes for test failures in 5.004_58
+ Branch: win32/perl
+ ! gv.c op.c
+____________________________________________________________________________
+[ 487] By: gsar on 1998/02/09 00:27:16
+ Log: win32_utime() tweaks to avoid warnings
+ Branch: win32/perl
+ ! win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 486] By: gsar on 1998/02/07 23:45:22
+ Log: integrate mainline, plus a few small win32 enhancements
+ - remove Win32::GetCurrentDirectory()
+ - add Win32::Sleep() for compat
+ - add smarter utime() from Jan Dubois, and export it as win32_utime()
+ Branch: win32/perl
+ +> ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
+ +> lib/Fatal.pm t/lib/ph.t
+ ! win32/makedef.pl win32/win32.c win32/win32iop.h
+ !> (integrate 61 files)
+
+----------------
+Version 5.004_58
+----------------
+
+____________________________________________________________________________
+[ 485] By: mbeattie on 1998/02/06 18:11:47
+ Log: Bump patchlevel to 58.
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 484] By: mbeattie on 1998/02/06 18:08:28
+ Log: Fix up problem with gv.c from change 477.
+ Fix up Config.pm use in t/lib/ph.t from change 478.
+ Branch: perl
+ ! gv.c t/lib/ph.t
+____________________________________________________________________________
+[ 483] By: mbeattie on 1998/02/06 17:34:34
+ Log: Integrate win32 branch into mainline
+ Branch: perl
+ !> win32/win32sck.c
+____________________________________________________________________________
+[ 482] By: mbeattie on 1998/02/06 17:26:41
+ Log: lib/Fatal.pm missing from repository
+ Branch: perl
+ + lib/Fatal.pm
+____________________________________________________________________________
+[ 481] By: mbeattie on 1998/02/06 17:24:57
+ Log: Subject: [PATCH] Re: posix::strftime (core dumped)
+ Date: Thu, 5 Feb 1998 13:55:23 -0500 (EST)
+ From: Andy Dougherty <doughera@newton.phys.lafayette.edu>
+ Branch: perl
+ + ext/POSIX/hints/linux.pl ext/POSIX/hints/sunos_4.pl
+ ! MANIFEST hints/linux.sh hints/sunos_4_1.sh t/lib/posix.t
+____________________________________________________________________________
+[ 480] By: mbeattie on 1998/02/06 17:19:52
+ Log: x2p/str.c was missing from list of changed files in change 466
+ Branch: perl
+ ! x2p/str.c
+____________________________________________________________________________
+[ 479] By: mbeattie on 1998/02/06 17:16:54
+ Log: Added t/lib/ph.t to MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 478] By: mbeattie on 1998/02/06 17:15:38
+ Log: Subject: [PATCH] h2ph.PL
+ Date: Thu, 5 Feb 1998 05:53:54 -0800 (EST)
+ From: kstar@www.chapin.edu (Kurt D. Starsinic)
+ Branch: perl
+ + t/lib/ph.t
+ ! utils/h2ph.PL
+____________________________________________________________________________
+[ 477] By: mbeattie on 1998/02/06 17:10:46
+ Log: Subject: [PATCH] Faster gv_fetchpv() for nested packages
+ Date: 04 Feb 1998 14:49:46 +0100
+ From: Gisle Aas <gisle@aas.no>
+ as modified by
+ From: chip@atlantic.net
+ Date: Wed, 4 Feb 1998 11:46:49 -0500 (EST)
+ Branch: perl
+ ! gv.c
+____________________________________________________________________________
+[ 476] By: mbeattie on 1998/02/06 16:47:03
+ Log: From: Jarkko Hietaniemi <jhi@iki.fi>
+ Subject: [PATCH] almost OK: perl 5.00457 on i386-freebsd-thread 3.0
+ Date: Wed, 4 Feb 1998 12:59:47 +0200 (EET)
+ Subject: Re: [PATCH] 5.004_04 and 5.004_57: Complex.pm and complex.t
+ Date: Thu, 5 Feb 1998 18:08:20 +0200 (EET)
+ Branch: perl
+ ! hints/freebsd.sh lib/Math/Complex.pm t/lib/complex.t
+____________________________________________________________________________
+[ 475] By: mbeattie on 1998/02/06 16:44:57
+ Log: Subject: [PATCH] nomemok
+ Date: Mon, 2 Feb 1998 15:06:50 +0100
+ From: Gisle Aas <gisle@aas.no>
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 474] By: mbeattie on 1998/02/06 16:43:46
+ Log: Subject: [PATCH] Benchmark.pm: timethese corrupts $_
+ Date: Sun, 1 Feb 1998 06:46:08 -0500 (EST)
+ From: abigail@fnx.com
+ Branch: perl
+ ! lib/Benchmark.pm
+____________________________________________________________________________
+[ 473] By: mbeattie on 1998/02/06 16:42:53
+ Log: Subject: [PATCH] adding the newSVpvn API function
+ Date: Sat, 31 Jan 1998 06:32:42 +0100
+ From: Matthias Ulrich Neeracher <neeri@iis.ee.ethz.ch>
+ Branch: perl
+ ! embed.h embedvar.h global.sym pod/perlguts.pod pod/perltoc.pod
+ ! proto.h sv.c
+____________________________________________________________________________
+[ 472] By: mbeattie on 1998/02/06 16:35:41
+ Log: Subject: Re: [PATCH] new hints/solaris2.sh (was Re: make check fails 17% of it's tests on Solaris...)
+ Date: 28 Jan 1998 17:40:37 -0800
+ From: Stephen Zander <srz@mckesson.com>
+ Branch: perl
+ ! hints/solaris_2.sh
+____________________________________________________________________________
+[ 471] By: mbeattie on 1998/02/06 16:02:57
+ Log: Subject: [PATCH] Re: 5.004_04 vec() fails with 32-bit values
+ Date: Thu, 15 Jan 1998 11:53:06 +0000
+ From: "M.J.T. Guy" <mjtg@cus.cam.ac.uk>
+ Branch: perl
+ ! pod/perlguts.pod pp.c t/op/vec.t
+____________________________________________________________________________
+[ 470] By: mbeattie on 1998/02/06 16:01:36
+ Log: From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Subject: 5.004_56: Patch to Tie::Hash and docs
+ Date: Sun, 11 Jan 1998 20:34:05 -0500 (EST)
+ Subject: 5.004_56: Patch to (?{}) quoting + cosmetic
+ Date: Mon, 2 Feb 1998 01:28:46 -0500 (EST)
+ Branch: perl
+ ! lib/Tie/Hash.pm pod/perlfunc.pod pod/perlre.pod regcomp.c
+ ! t/op/misc.t t/op/pat.t toke.c
+____________________________________________________________________________
+[ 469] By: mbeattie on 1998/02/06 15:58:31
+ Log: Subject: Another Array.pm patch
+ Date: Wed, 4 Feb 1998 20:37:03 +0000 (GMT)
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Branch: perl
+ ! lib/Tie/Array.pm
+____________________________________________________________________________
+[ 468] By: mbeattie on 1998/02/06 15:56:28
+ Log: Subject: documentation patch for 5.004_57
+ Date: Wed, 4 Feb 1998 14:54:13 +0000 (GMT)
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Branch: perl
+ ! lib/Tie/Array.pm
+____________________________________________________________________________
+[ 467] By: mbeattie on 1998/02/06 15:55:34
+ Log: Subject: 5.004_56: patch for `use Fatal' again
+ Date: Thu, 29 Jan 1998 17:04:28 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! MANIFEST pod/perldiag.pod pod/perlfunc.pod pod/perlmodlib.pod
+ ! pp.c t/comp/proto.t toke.c
+____________________________________________________________________________
+[ 466] By: mbeattie on 1998/02/06 15:53:53
+ Log: Subject: Newer -DLEAKTEST patch
+ Date: Fri, 9 Jan 1998 17:55:09 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! ext/DB_File/DB_File.xs ext/DynaLoader/dl_next.xs
+ ! ext/DynaLoader/dl_vms.xs ext/Opcode/Opcode.xs handy.h hv.c
+ ! perl.c perly.c perly.c.diff perly.fixer pod/perlembed.pod
+ ! pod/perlguts.pod pod/perlrun.pod pod/perltoc.pod pp_hot.c sv.c
+ ! toke.c util.c vms/perly_c.vms x2p/hash.c
+____________________________________________________________________________
+[ 465] By: mbeattie on 1998/02/06 15:46:35
+ Log: More Chip patches (tweaked for _5x). The final one mentioned here
+ (@ARGV with -i) actually went in at change 462 but I failed to
+ add it to the change description:
+ Subject: [PATCH] Fix typo: "FORM{,AT}LINE"
+ Date: Sun, 11 Jan 1998 19:37:17 -0500 (EST)
+ Subject: [PATCH] Fix for C<@x = my @y>
+ Date: Sun, 11 Jan 1998 18:12:16 -0500 (EST)
+ Subject: [PATCH] Fix SEGV on C<*glob{SCALAR,ARRAY}>
+ Date: Thu, 5 Feb 1998 21:30:13 -0500 (EST)
+ Subject: [PATCH] Allow last() to mean last
+ Date: Thu, 5 Feb 1998 21:42:57 -0500 (EST)
+ Subject: [PATCH] Consider @ARGV to be plain files if inplace (-i)
+ Date: Wed, 4 Feb 1998 16:04:47 -0500 (EST)
+ Branch: perl
+ ! op.c perly.c perly.h perly.y sv.c t/op/my.t vms/perly_c.vms
+ ! vms/perly_h.vms
+____________________________________________________________________________
+[ 464] By: mbeattie on 1998/02/06 15:06:18
+ Log: More Chip patches:
+ Subject: [PATCH] Fix SEGV from combining caller and C<package;>
+ Date: Thu, 5 Feb 1998 21:47:50 -0500 (EST)
+ Subject: [PATCH] Fix line numbers after here documents in eval STRING
+ Date: Thu, 5 Feb 1998 21:50:08 -0500 (EST)
+ Subject: [PATCH] Make recursive lexical analysis more robust
+ Date: Thu, 5 Feb 1998 21:57:02 -0500 (EST)
+ Branch: perl
+ ! pp_ctl.c sv.c toke.c
+____________________________________________________________________________
+[ 463] By: mbeattie on 1998/02/06 15:04:17
+ Log: Some more Chip patches (tweaked to match _5x):
+ Subject: [PATCH] Fix empty BLOCK
+ Date: Wed, 4 Feb 1998 16:52:28 -0500 (EST)
+ Subject: [PATCH] fix (\@@) proto
+ Date: Thu, 5 Feb 1998 10:24:29 -0500 (EST)
+ Subject: [PATCH] Cope with lack of args in Fcntl::AUTOLOAD
+ Date: Thu, 5 Feb 1998 21:26:55 -0500 (EST)
+ Subject: [PATCH] Don't fold string comparison under C<use locale>
+ Date: Thu, 5 Feb 1998 21:46:25 -0500 (EST)
+ Branch: perl
+ ! ext/Fcntl/Fcntl.pm op.c t/comp/proto.t toke.c
+____________________________________________________________________________
+[ 462] By: mbeattie on 1998/02/06 14:56:30
+ Log: Some Chip patches (some tweaked to match _5x source):
+ From: Chip Salzenberg <salzench@nielsenmedia.com>
+ Subject: [PATCH] local leakage
+ Date: Tue, 3 Feb 1998 09:16:50 -0500 (EST)
+ Subject: [PATCH] NULs in patterns
+ Date: Wed, 4 Feb 1998 01:33:51 -0500 (EST)
+ Subject: [PATCH] Configure on PerlIO
+ Date: Wed, 4 Feb 1998 01:38:43 -0500 (EST)
+ Subject: [PATCH] Avoid core dump on package alias
+ Date: Wed, 4 Feb 1998 15:38:42 -0500 (EST)
+ Subject: [PATCH] Fix name of $Foo::{'Bar::'}
+ Date: Wed, 4 Feb 1998 16:37:51 -0500 (EST)
+ Branch: perl
+ ! Configure doio.c gv.c op.c pp_ctl.c sv.c t/op/gv.t
+ ! t/op/local.t
+____________________________________________________________________________
+[ 461] By: gsar on 1998/02/04 03:34:36
+ Log: support win32_select(0,0,0,msec) (winsock doesn't)
+ Branch: win32/perl
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 460] By: gsar on 1998/02/04 00:44:47
+ Log: bug: win32_select() must StartSockets()
+ Branch: win32/perl
+ ! win32/win32sck.c
+
+----------------
+Version 5.004_57
+----------------
+
+____________________________________________________________________________
+[ 459] By: mbeattie on 1998/02/03 16:00:07
+ Log: Replaced two occurrences of THREADSV(find_thread_sv(...)) (order
+ of execution causes core dump if threadsvp is moved). Replaced
+ lvalue occurrence of AvARRAY(av) with SvPVX(av) (former does cast).
+ Branch: perl
+ ! av.c perl.c
+____________________________________________________________________________
+[ 458] By: mbeattie on 1998/02/03 14:40:02
+ Log: Fix up MANIFEST.
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 457] By: mbeattie on 1998/02/03 13:50:23
+ Log: Integrate win32 into mainline. My last integration from ansiperl
+ to the mainline was a dismal failure: I did -ay but meant -at.
+ This should fix things now since win32 has already integrated
+ all the necessary changes from ansiperl.
+ Branch: perl
+ !> (integrate 111 files)
+____________________________________________________________________________
+[ 456] By: gsar on 1998/02/03 04:48:08
+ Log: Fix minor problems with non USE_THREADS build. win32 branch
+ now looks 5.004_57-ready.
+ Branch: win32/perl
+ ! thread.h win32/makedef.pl
+____________________________________________________________________________
+[ 455] By: gsar on 1998/02/03 03:45:09
+ Log: integrate mainline
+ Branch: win32/perl
+ !> (integrate 887 files)
+____________________________________________________________________________
+[ 454] By: mbeattie on 1998/02/02 16:44:24
+ Log: The new dec_osf.sh didn't work so the new glibpth and useshrplib
+ defaults have been commented out for now.
+ Branch: perl
+ ! hints/dec_osf.sh
+____________________________________________________________________________
+[ 453] By: mbeattie on 1998/02/02 15:51:39
+ Log: Introduced thr->threadsvp and THREADSV() for faster per-thread
+ variables. Moved threadnum to a per-interpreter variable and
+ made dTHR and lock/unlock of sv_mutex bypass the get/lock unless
+ more than one thread may be running. Minor tweaks to Thread.xs.
+ Branch: perl
+ ! dosish.h embedvar.h ext/Thread/Thread.xs interp.sym intrpvar.h
+ ! op.c perl.c perl.h pp.c pp_ctl.c scope.c sv.c thrdvar.h
+ ! thread.h util.c
+____________________________________________________________________________
+[ 452] By: gsar on 1998/02/02 04:56:50
+ Log: remove totally egregious s/\\dir// in File::Find
+ Branch: win32/perl
+ ! lib/File/Find.pm
+____________________________________________________________________________
+[ 451] By: gsar on 1998/02/01 22:20:20
+ Log: added AS patch#3
+ Message-Id: <01BD2EF2.53433A40.dougl@ActiveState.com>
+ Date: Sun, 01 Feb 1998 09:18:13 PST
+ From: Douglas Lankshear <dougl@ActiveState.com>
+ To: "'Gurusamy Sarathy'" <gsar@umich.edu>
+
+ Here's an additional diff against //depot/asperl
+
+ The field name mg_length was changed back to mg_len
+ The function name mg_len was change to mg_length
+
+ The need for sort_mutex removed thanks to the code derived
+ from Tom Horsley's work.
+
+ -- Doug
+ Branch: asperl
+ + XSLock.h
+ ! ObjXSub.h XSUB.h av.c embedvar.h ext/DynaLoader/dlutils.c
+ ! globals.c ipstdio.h mg.c mg.h objpp.h perl.c perl.h perlio.h
+ ! perlvars.h perly.c pp.c pp_ctl.c pp_hot.c proto.h regexec.c
+ ! scope.c scope.h sv.c toke.c universal.c util.c
+ ! win32/dl_win32.xs win32/iplio.c win32/ipstdio.c
+ ! win32/perlobj.def win32/runperl.c
+____________________________________________________________________________
+[ 450] By: gsar on 1998/01/30 23:43:57
+ Log: various tweaks
+ - add new functions to proto.h
+ - fix up makefile.mk for $(OBJECT)
+ Branch: asperl
+ ! pp_ctl.c proto.h win32/makefile.mk
+____________________________________________________________________________
+[ 449] By: gsar on 1998/01/30 21:23:15
+ Log: fix up missing patches from AS patch#2
+ Branch: asperl
+ ! perldir.h perlenv.h perllio.h perlmem.h perlproc.h perlsock.h
+ ! pp_ctl.c proto.h
+____________________________________________________________________________
+[ 448] By: gsar on 1998/01/30 18:23:17
+ Log: fix htonlx typo
+ Branch: win32/perl
+ ! perlsock.h
+____________________________________________________________________________
+[ 447] By: mbeattie on 1998/01/30 16:03:49
+ Log: Fix up MANIFEST to add missing files
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 446] By: mbeattie on 1998/01/30 12:34:55
+ Log: Bump patchlevel to 57.
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 445] By: gsar on 1998/01/30 10:44:38
+ Log: initial merge of latest win32 branch into ASPerl
+ Branch: asperl
+ +> lib/Tie/Array.pm pod/perlhist.pod t/lib/tie-push.t
+ +> t/lib/tie-stdarray.t t/lib/tie-stdpush.t t/op/tiearray.t
+ +> win32/bin/perlglob.pl
+ !> (integrate 141 files)
+____________________________________________________________________________
+[ 444] By: gsar on 1998/01/30 09:25:58
+ Log: goofed branching, redo asperl branch
+ Branch: asperl
+ ! perl.h
+____________________________________________________________________________
+[ 443] By: gsar on 1998/01/30 09:23:36
+ Log: added AS patch#2
+ Branch: asperl
+ + ObjXSub.h ipdir.h ipenv.h iplio.h ipmem.h ipproc.h ipsock.h
+ + ipstdio.h objpp.h win32/ipdir.c win32/ipenv.c win32/iplio.c
+ + win32/ipmem.c win32/ipproc.c win32/ipsock.c win32/ipstdio.c
+ + win32/ipstdiowin.h win32/perlobj.def
+ ! EXTERN.h XSUB.h cv.h doio.c dosish.h dump.c embedvar.h
+ ! globals.c gv.c hv.c intrpvar.h malloc.c mg.c mg.h op.c op.h
+ ! opcode.h perl.c perl.h perldir.h perlenv.h perlio.h perllio.h
+ ! perlmem.h perlproc.h perlsock.h perlvars.h perly.c pp.c pp.h
+ ! pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c regcomp.h
+ ! regexec.c run.c scope.c scope.h sv.c sv.h thread.h toke.c
+ ! universal.c util.c vms/vms.c win32/Makefile win32/config_H.bc
+ ! win32/config_H.vc win32/dl_win32.xs win32/include/sys/socket.h
+ ! win32/makedef.pl win32/runperl.c win32/win32iop.h
+____________________________________________________________________________
+[ 441] By: gsar on 1998/01/30 08:54:19
+ Log: Created new branch from win32@396, added AS patch#1
+ Branch: asperl
+ + doio.c malloc.c perl.c perl.h perldir.h perlenv.h perllio.h
+ + perlmem.h perlproc.h perlsock.h pp.c pp_hot.c pp_sys.c
+ + regcomp.c scope.h sv.c toke.c util.c
+ +> (branch 915 files)
+____________________________________________________________________________
+[ 440] By: gsar on 1998/01/30 04:43:23
+ Log: integrate winansi
+ Branch: win32/perl
+ +> pod/perlhist.pod
+ !> MANIFEST av.c hv.c op.c perlsock.h pp_ctl.c pp_sys.c scope.c
+ !> util.c
+____________________________________________________________________________
+[ 439] By: mbeattie on 1998/01/27 15:31:53
+ Log: Integrate ansi branch into mainline (resolve -ay).
+ Branch: perl
+ +> lib/Tie/Array.pm perldir.h perlenv.h perllio.h perlmem.h
+ +> perlproc.h perlsock.h pod/perlhist.pod t/lib/tie-push.t
+ +> t/lib/tie-stdarray.t t/lib/tie-stdpush.t t/op/tiearray.t
+ +> win32/bin/perlglob.pl
+ ! op.c
+ !> (integrate 868 files)
+____________________________________________________________________________
+[ 438] By: nick on 1998/01/24 12:02:34
+ Log: Gisle's av_unshift tweak, two small patches from chip
+ and check for NULL in hv_delete in case '~' and tie magic
+ are present
+ Branch: ansiperl
+ ! av.c hv.c op.c pp_ctl.c scope.c
+____________________________________________________________________________
+[ 437] By: nick on 1998/01/24 10:37:56
+ Log: Get PerlXxx_yyyy() macro stuff to _compile_ on Solaris.
+ Ugh! ...
+ Macros were unsuitable for declaring the functions, extra () round
+ parameters removed - non-function forms of PerlXxx_yyyy() need to
+ add () themselves.
+ Need to include perlmem.h in util.c (at least) if not using Perl's malloc.
+ Branch: ansiperl
+ ! perlsock.h pp_sys.c util.c
+____________________________________________________________________________
+[ 436] By: nick on 1998/01/24 10:03:03
+ Log: Integrate win32 into ansiperl
+ Branch: ansiperl
+ +> perldir.h perlenv.h perllio.h perlmem.h perlproc.h perlsock.h
+ +> win32/bin/perlglob.pl
+ !> (integrate 38 files)
+____________________________________________________________________________
+[ 435] By: nick on 1998/01/24 09:47:49
+ Log: Add perlhist.pod
+ Branch: ansiperl
+ + pod/perlhist.pod
+ ! MANIFEST
+____________________________________________________________________________
+[ 434] By: gsar on 1998/01/19 05:01:47
+ Log: s/PerlENV/PerlEnv/ just to be consistent
+ Branch: win32/perl
+ ! malloc.c perl.c perlenv.h regcomp.c toke.c util.c
+____________________________________________________________________________
+[ 433] By: gsar on 1998/01/19 04:52:18
+ Log: foo() -> PerlGroup_foo() patch from ActiveState
+ Branch: win32/perl
+ + perldir.h perlenv.h perllio.h perlmem.h perlproc.h perlsock.h
+ ! doio.c malloc.c perl.c perl.h pp.c pp_hot.c pp_sys.c regcomp.c
+ ! scope.h sv.c toke.c util.c
+____________________________________________________________________________
+[ 432] By: gsar on 1998/01/19 04:42:26
+ Log: integrate mainline
+ Branch: win32/perl
+ !> pod/perlfunc.pod
+____________________________________________________________________________
+[ 431] By: gsar on 1998/01/19 04:40:04
+ Log: integrate changes in winansi
+ Branch: win32/perl
+ +> lib/Tie/Array.pm t/lib/tie-push.t t/lib/tie-stdarray.t
+ +> t/lib/tie-stdpush.t t/op/tiearray.t
+ !> (integrate 98 files)
+____________________________________________________________________________
+[ 430] By: gsar on 1998/01/19 04:10:43
+ Log: Fix autovivification problems with XSUB OUTPUT args
+ Message-Id: <199801190409.XAA26710@aatma.engin.umich.edu>
+ Date: Sun, 18 Jan 1998 23:09:07 EST
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Subject: [PATCH] XSUB OUTPUT arguments and 'set' magic
+ Branch: win32/perl
+ ! ext/GDBM_File/typemap ext/NDBM_File/typemap
+ ! ext/ODBM_File/typemap ext/SDBM_File/typemap
+ ! lib/ExtUtils/typemap os2/OS2/PrfDB/typemap pod/perlguts.pod
+ ! pod/perlxs.pod pod/perlxstut.pod sv.c sv.h win32/win32.h
+____________________________________________________________________________
+[ 429] By: nick on 1998/01/17 21:01:50
+ Log: Subject: [PATCH] 5.004_56 threaded and "CONFIG key 'exe_ext' does not exist in Config.pm"
+ Date: Thu, 25 Dec 1997 13:39:15 -0500
+ From: Spider Boardman <spider@Orb.Nashua.NH.US>
+ To: perl5-porters@perl.org
+
+ It turns out that the potential for the "CONFIG key 'exe_ext'
+ does not exist in Config.pm" problem has been around for a while,
+ in the definition of SvTRUE(). It's just that non-gcc compilers
+ are more or less being built as CRIPPLED_CC when USE_THREADS is
+ defined (even if they can inline things). The inline macro for
+ SvTRUE works with tied hashes and the EXISTS method, and the
+ functional version (sv_true in 5.004_56, or SvTRUE in 5.004_04)
+ does not, because it adds an excess mg_get() which replaces the
+ EXISTS result with a FETCH result.
+ Branch: ansiperl
+ ! sv.c
+____________________________________________________________________________
+[ 428] By: nick on 1998/01/17 20:59:11
+ Log: From: Robin Barker <rmb1@cise.npl.co.uk>
+ Date: Fri, 19 Dec 97 17:19:09 GMT
+ Message-Id: <26260.9712191719@lightning.cise.npl.co.uk>
+ Branch: ansiperl
+ ! doio.c sv.c toke.c util.c
+____________________________________________________________________________
+[ 427] By: nick on 1998/01/17 12:01:53
+ Log: Permit tie ?foo,$object
+ tidy up dead #ifdef ORIGINAL_TIE)
+ Remove 'P' magic from hash, before adding new one in dbm_open like tie does.
+ Branch: ansiperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 426] By: nick on 1998/01/15 18:06:36
+ Log: First working TIEARRAY and other misc tie fixes
+ Branch: ansiperl
+ ! MANIFEST pp.c pp_hot.c t/op/tiearray.t
+____________________________________________________________________________
+[ 425] By: nick on 1998/01/14 21:56:40
+ Log: Not working yet - split problems ...
+ Branch: ansiperl
+ ! pp.c t/lib/thread.t t/op/tiearray.t
+____________________________________________________________________________
+[ 424] By: nick on 1998/01/14 18:49:25
+ Log: TIEARRAY updates - almost works ...
+ Branch: ansiperl
+ + t/lib/tie-push.t t/lib/tie-stdarray.t t/lib/tie-stdpush.t
+ ! MANIFEST av.c av.h ext/DB_File/DB_File.pm lib/Tie/Array.pm
+ ! mg.c pod/perltie.pod pp.c pp_hot.c pp_sys.c scope.c
+ ! t/op/avhv.t t/op/push.t t/op/tiearray.t
+____________________________________________________________________________
+[ 423] By: gsar on 1998/01/14 00:13:16
+ Log: fix MakeMaker installbin problem
+ Message-Id: <199801070016.TAA17766@aatma.engin.umich.edu>
+ Subject: Re: can't modify message with HTML-Stream, v.1.42
+ Date: Tue, 06 Jan 1998 19:16:35 -0500
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Branch: win32/perl
+ ! lib/ExtUtils/MM_Unix.pm
+____________________________________________________________________________
+[ 422] By: gsar on 1998/01/13 23:53:02
+ Log: add archname to *sitearch in config.{b,g,v}c
+ Branch: win32/perl
+ ! win32/config.bc win32/config.gc win32/config.vc
+____________________________________________________________________________
+[ 421] By: gsar on 1998/01/13 23:15:14
+ Log: set $ENV{PERL5LIB} in t/harness (so child perlglob.bat sees it)
+ Branch: win32/perl
+ ! t/harness
+____________________________________________________________________________
+[ 420] By: nick on 1998/01/13 22:55:02
+ Log: tiearray tweaks
+ Branch: ansiperl
+ ! av.c pp_sys.c t/op/nothread.t t/op/tiearray.t
+____________________________________________________________________________
+[ 419] By: nick on 1998/01/13 21:27:33
+ Log: Skeleton Tie::Array
+ Branch: ansiperl
+ + lib/Tie/Array.pm
+____________________________________________________________________________
+[ 418] By: nick on 1998/01/13 20:52:38
+ Log: tie array changes to core and tests
+ Branch: ansiperl
+ + t/op/tiearray.t
+ ! MANIFEST av.c av.h deb.c embed.h ext/DB_File/DB_File.pm
+ ! global.sym gv.c mg.c op.c perl.c perl.h pp.c pp.h pp_ctl.c
+ ! pp_hot.c proto.h sv.c toke.c universal.c util.c
+____________________________________________________________________________
+[ 417] By: gsar on 1998/01/13 20:49:52
+ Log: fix perlglob.bat warnings by splitting it from File::DosGlob
+ Branch: win32/perl
+ + win32/bin/perlglob.pl
+ ! MANIFEST README.win32 lib/File/DosGlob.pm win32/Makefile
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 416] By: gsar on 1998/01/13 02:46:53
+ Log: various tweaks to build support (NOTE: meant for 5.004_57)
+ - build and install x2p
+ - fix installperl warnings on win32
+ - `make install` now does puts the archlibs in right places
+ - makefiles don't default to USE_THREADS anymore
+ - sync config.{b,g,v}c
+ - sync makefile.mk -> Makefile
+ Branch: win32/perl
+ ! installperl win32/Makefile win32/config.bc win32/config.gc
+ ! win32/config.vc win32/config_sh.PL win32/makefile.mk x2p/a2p.h
+ ! x2p/a2py.c
+____________________________________________________________________________
+[ 415] By: nick on 1998/01/11 16:54:26
+ Log: Integrate win32 into ansiperl
+ Branch: ansiperl
+ !> Configure hints/dec_osf.sh hv.c lib/Getopt/Long.pm lib/blib.pm
+ !> lib/newgetopt.pl perl.h perl_exp.SH pp_ctl.c pp_hot.c pp_sys.c
+ !> proto.h regcomp.h regexec.c t/op/re_tests t/pragma/locale.t
+ !> utils/perldoc.PL vms/config.vms vms/descrip.mms
+ !> vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms vms/vms.c
+ !> vms/vmsish.h x2p/s2p.PL
+____________________________________________________________________________
+[ 414] By: nick on 1998/01/11 15:13:49
+ Log: Integratye mainline -> ansiperl
+ Branch: ansiperl
+ !> (integrate 64 files)
+____________________________________________________________________________
+[ 413] By: mbeattie on 1998/01/09 12:57:58
+ Log: Add missing blank line in pod/perlfunc.pod.
+ Branch: perl
+ ! pod/perlfunc.pod
+____________________________________________________________________________
+[ 412] By: gsar on 1998/01/08 20:54:31
+ Log: change#398 breaks ENV_IS_CASELESS, fix it
+ Branch: win32/perl
+ ! hv.c
+____________________________________________________________________________
+[ 411] By: gsar on 1998/01/08 18:33:58
+ Log: Integrate mainline
+ Branch: win32/perl
+ !> Configure hints/dec_osf.sh hv.c lib/Getopt/Long.pm lib/blib.pm
+ !> lib/newgetopt.pl perl.h perl_exp.SH pp_ctl.c pp_hot.c pp_sys.c
+ !> proto.h regcomp.h regexec.c t/op/re_tests t/pragma/locale.t
+ !> utils/perldoc.PL vms/config.vms vms/descrip.mms
+ !> vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms vms/vms.c
+ !> vms/vmsish.h x2p/s2p.PL
+____________________________________________________________________________
+[ 410] By: mbeattie on 1998/01/08 16:06:22
+ Log: Fix thinko in t/pragma/locale.t:
+ Subject: [PATCH] _04 or _56: locale.t
+ Date: Sun, 4 Jan 1998 23:48:44 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! t/pragma/locale.t
+____________________________________________________________________________
+[ 409] By: mbeattie on 1998/01/08 16:05:09
+ Log: Use Tom Horley's qsort for sorting:
+ Subject: Re: [PATCH for 5.004_56] Re: op/sort.t hangs under Solaris 2.5
+ Date: Fri, 02 Jan 1998 19:33:24 -0500 (EST)
+ From: Hans Mulder <hansm@icgned.nl>
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 408] By: mbeattie on 1998/01/08 16:01:57
+ Log: Make s2p not use cpp:
+ Subject: [PATCH for 5.004_56] s2p shouldn't use cpp
+ Date: Mon, 29 Dec 1997 19:38:18 -0500 (EST)
+ From: Hans Mulder <hansm@icgned.nl>
+ Branch: perl
+ ! x2p/s2p.PL
+____________________________________________________________________________
+[ 407] By: mbeattie on 1998/01/08 15:57:31
+ Log: DG/UX tweaks to perl.h:
+ Subject: [PATCH] _56 on dgux without threads
+ Date: Sat, 20 Dec 1997 23:01:40 -0500
+ From: Roderick Schertler <roderick@argon.org>
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 406] By: mbeattie on 1998/01/08 15:56:02
+ Log: Configure and hints/dec_osf.sh changes for Digital UNIX:
+ Subject: [PATCH] perl5.004_56 NOT OK on alpha-dec_osf-thread (Digital UNIX X5.0-13)
+ Date: Sat, 20 Dec 1997 02:30:01 -0500
+ From: Spider Boardman <spider@web.zk3.dec.com>
+ Branch: perl
+ ! Configure hints/dec_osf.sh
+____________________________________________________________________________
+[ 405] By: mbeattie on 1998/01/08 15:53:40
+ Log: Missing "" in Configure echo for gethbadd_addr_type.
+ Branch: perl
+ ! Configure
+____________________________________________________________________________
+[ 404] By: mbeattie on 1998/01/08 13:04:48
+ Log: print/printf/... over-eager mg_find for glob magic:
+ Subject: [PATCH] fix inefficient checks for TIEHANDLE
+ Date: Wed, 07 Jan 1998 20:06:05 -0500
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Branch: perl
+ ! pp_hot.c pp_sys.c
+____________________________________________________________________________
+[ 403] By: mbeattie on 1998/01/08 12:56:31
+ Log: Assorted VMS patches (mostly VMS makefile update for new headers):
+ Subject: [PATCH] VMS update for 5.004_56
+ Date: Sat, 03 Jan 1998 03:54:29 -0500 (EST)
+ From: Charles Bailey <bailey@newman.upenn.edu>
+ Branch: perl
+ ! lib/blib.pm proto.h regcomp.h vms/config.vms vms/descrip.mms
+ ! vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms vms/vms.c
+ ! vms/vmsish.h
+____________________________________________________________________________
+[ 402] By: mbeattie on 1998/01/08 12:46:15
+ Log: Fix utils/perldoc.PL for dos-djgpp:
+ Subject: 5.004_56: perldoc.PL dos-djgpp patches
+ Date: Tue, 6 Jan 1998 18:14:59 +0100
+ From: Molnar Laszlo <molnarl@cdata.tvnet.hu>
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 401] By: mbeattie on 1998/01/08 12:40:14
+ Log: Version 2.13 of GetoptLong:
+ Subject: Re: ANNOUNCE: perl 5.004_56 is available
+ Date: 06 Jan 1998 16:21:45 +0100
+ From: JVromans@Squirrel.nl (Johan Vromans)
+ Branch: perl
+ ! lib/Getopt/Long.pm lib/newgetopt.pl
+____________________________________________________________________________
+[ 400] By: mbeattie on 1998/01/08 12:28:08
+ Log: Fix variable export and threading configuration for AIX:
+ Subject: [PATCH] 5.004_56: AIX 4.1.5.0: sans et avec threads
+ Date: Tue, 23 Dec 1997 15:39:12 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! Configure perl_exp.SH
+____________________________________________________________________________
+[ 399] By: mbeattie on 1998/01/08 12:25:38
+ Log: Regexp fix: (?>a+)b doesn't match aaab:
+ Subject: Re: Regexp [PATCH] 5.004_56 (?>...)
+ Date: Fri, 19 Dec 1997 16:02:50 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! regexec.c t/op/re_tests
+____________________________________________________________________________
+[ 398] By: mbeattie on 1998/01/08 12:23:41
+ Log: Fix hv_delete for 'm'-magic. Based on following patch, modified
+ to cope with ENV_IS_CASELESS:
+ Subject: [perl5.004_56] [PATCH] hv_delete and 'm' magic
+ Date: Fri, 19 Dec 1997 11:31:36 -0500
+ From: Owen Taylor <owt1@cornell.edu>
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 397] By: mbeattie on 1998/01/08 12:10:29
+ Log: Integrate win32 branch into mainline.
+ Branch: perl
+ !> (integrate 41 files)
+____________________________________________________________________________
+[ 396] By: gsar on 1998/01/07 19:12:27
+ Log: tweak case-insensitive ENV implementation
+ Branch: win32/perl
+ ! hv.c
+____________________________________________________________________________
+[ 395] By: nick on 1998/01/07 18:40:55
+ Log: Integrate win32 branch
+ Branch: ansiperl
+ !> (integrate 31 files)
+____________________________________________________________________________
+[ 394] By: gsar on 1998/01/05 19:17:40
+ Log: Allow $ENV{PERL5SHELL} to contain switches etc., and document
+ the fact
+ Branch: win32/perl
+ ! pod/perlrun.pod win32/win32.c
+____________________________________________________________________________
+[ 393] By: gsar on 1998/01/05 05:43:33
+ Log: Support case-tolerant %ENV
+ - underlying system calls see the case-as-supplied by user
+ - added tests to verify addition/deletion/enumeration case-tolerance
+ - hv.c touched, but changes are fully conditional on -DENV_IS_CASELESS,
+ which is default on win32 now
+ Branch: win32/perl
+ ! hv.c t/op/magic.t win32/win32.h
+____________________________________________________________________________
+[ 392] By: gsar on 1998/01/04 17:55:19
+ Log: Add a tweaked version of:
+ Message-Id: <199801040630.AA29298@metronet.com>
+ Date: Sun, 04 Jan 1998 00:30:57 CST
+ From: Tye McQueen <tye@metronet.com>
+ Subject: New patch for $^E==GetLastError() under Win32
+ Branch: win32/perl
+ ! doio.c lib/dumpvar.pl lib/perl5db.pl mg.c perl.h
+ ! pod/perlfunc.pod pod/perlvar.pod util.c win32/makedef.pl
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 391] By: gsar on 1998/01/04 07:59:44
+ Log: Various win32 fixes
+ - support spawn via system(&P_NOWAIT,...) like OS2
+ - support wait() and waitpid()
+ - s/GetCurrentDirectory/GetCwd/, long-named XS to be removed
+ - support -lfoo properly in ExtUtils::Liblist
+ - fix outdated info about Win32 support in perlfaq2
+ - fix win32 bug in perldoc that causes spurious warnings
+ - regularize global function/variable names yet more
+ - fix bug in do_aspawn() (it was always invoking shell, instead of
+ almost never)
+ - implement and export win32_wait()
+ - stub version of USE_RTL_THREAD_API
+ Branch: win32/perl
+ ! README.win32 dosish.h lib/Cwd.pm lib/ExtUtils/Liblist.pm
+ ! pod/perlfaq2.pod pp_sys.c util.c utils/perldoc.PL
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/config_h.PL win32/perllib.c win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32sck.c win32/win32thread.c
+ ! win32/win32thread.h
+____________________________________________________________________________
+[ 390] By: gsar on 1997/12/30 21:00:28
+ Log: Fix $ENV{Path} in FindBin.pm
+ Branch: win32/perl
+ ! lib/FindBin.pm
+____________________________________________________________________________
+[ 389] By: nick on 1997/12/29 10:33:23
+ Log: Resolve ansiperl against win32
+ Branch: ansiperl
+ !> (integrate 105 files)
+____________________________________________________________________________
+[ 388] By: gsar on 1997/12/24 04:59:28
+ Log: make $? Unix (and ActiveWare) compatible
+ Branch: win32/perl
+ ! README.win32 win32/win32.c
+____________________________________________________________________________
+[ 387] By: gsar on 1997/12/24 04:21:30
+ Log: support ioctl() on sockets (does what ioctlsocket() does) to make
+ non-blocking IO on sockets possible
+ Branch: win32/perl
+ ! README.win32 dosish.h win32/makedef.pl win32/win32.c
+ ! win32/win32iop.h win32/win32sck.c
+____________________________________________________________________________
+[ 386] By: gsar on 1997/12/24 03:10:55
+ Log: support getlogin()
+ Branch: win32/perl
+ ! README.win32 win32/config.bc win32/config.gc win32/config.vc
+ ! win32/config_H.bc win32/config_H.gc win32/config_H.vc
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 385] By: gsar on 1997/12/24 02:24:59
+ Log: add support for crypt() via user-supplied des_fcrypt() source or library.
+ Update README.win32.
+ Branch: win32/perl
+ ! README.win32 perl.h win32/Makefile win32/makedef.pl
+ ! win32/makefile.mk win32/win32.c win32/win32.h win32/win32iop.h
+____________________________________________________________________________
+[ 384] By: gsar on 1997/12/24 02:22:42
+ Log: tweak op.c to avoid warning
+ Branch: win32/perl
+ ! op.c
+____________________________________________________________________________
+[ 383] By: gsar on 1997/12/23 21:12:42
+ Log: Trivial bugfix#3 from local repository
+ Message-Id: <199712061100.GAA14864@aatma.engin.umich.edu>
+ Subject: Re: Assigning result of pop scrambles unrelated reference
+ Date: Sat, 06 Dec 1997 06:00:45 -0500
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Branch: win32/perl
+ ! sv.c
+____________________________________________________________________________
+[ 382] By: gsar on 1997/12/23 21:09:32
+ Log: Trivial bugfix#2 from local repository
+ Message-Id: <199712061025.FAA14396@aatma.engin.umich.edu>
+ Subject: Re: eval of sub gives spurious "uninitialised" warning
+ Date: Sat, 06 Dec 1997 05:25:07 -0500
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Branch: win32/perl
+ ! op.c pod/perldelta.pod pod/perlfunc.pod t/op/eval.t
+____________________________________________________________________________
+[ 381] By: gsar on 1997/12/23 21:01:04
+ Log: Trivial bugfix#1 from local repository
+ Message-Id: <199711282326.SAA15090@aatma.engin.umich.edu>
+ Subject: [PATCH] Re: [5.004_04 BUG] bless broke scoping?
+ Date: Fri, 28 Nov 1997 18:26:52 -0500
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Branch: win32/perl
+ ! scope.c
+____________________________________________________________________________
+[ 380] By: gsar on 1997/12/18 15:10:23
+ Log: Integrate mainline
+ Branch: win32/perl
+ +> README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
+ +> djgpp/djgppsed.sh djgpp/fixpmain hints/dos_djgpp.sh
+ +> os2/os2.sym os2/os2thread.h
+ !> (integrate 77 files)
+
+----------------
+Version 5.004_56
+----------------
+
+____________________________________________________________________________
+[ 379] By: mbeattie on 1997/12/18 13:28:35
+ Log: Integrate ansi @364,@366 into mainline.
+ Branch: perl
+ !> lib/ExtUtils/MakeMaker.pm miniperlmain.c perl.h
+____________________________________________________________________________
+[ 378] By: mbeattie on 1997/12/18 13:20:15
+ Log: Add a few missing files to MANIFEST
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 377] By: mbeattie on 1997/12/18 13:00:16
+ Log: Bump patchlevel to 56.
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 376] By: nick on 1997/12/18 01:32:12
+ Log: Resolve against mainline
+ Branch: ansiperl
+ +> README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
+ +> djgpp/djgppsed.sh djgpp/fixpmain hints/dos_djgpp.sh
+ +> os2/os2.sym os2/os2thread.h
+ !> (integrate 74 files)
+____________________________________________________________________________
+[ 375] By: nick on 1997/12/18 01:06:15
+ Log: Resolve against Win32
+ Branch: ansiperl
+ !> Configure README.threads config_h.SH doop.c embed.h
+ !> ext/DynaLoader/dl_aix.xs global.sym hints/aix.sh
+ !> hints/irix_6.sh op.c op.h perl.h perlvars.h pp_hot.c pp_sys.c
+ !> sv.c sv.h thread.h util.c
+____________________________________________________________________________
+[ 374] By: mbeattie on 1997/12/17 14:44:26
+ Log: Lots of VMS changes. vms/gen_shrfls.pl (which parses header files)
+ needs rewriting now that we use perlvars.h and foovar.h:
+ Subject: [PATCH] 5.004_54 under VMS (fwd)
+ Date: Wed, 26 Nov 1997 12:32:09 -0400 (EDT)
+ From: Charles Bailey <BAILEY@newman.upenn.edu>
+ Branch: perl
+ ! dosish.h handy.h intrpvar.h os2/os2ish.h perl.c perl.h
+ ! plan9/plan9ish.h pp.c proto.h sv.c t/lib/thread.t
+ ! t/lib/timelocal.t t/op/nothread.t taint.c thrdvar.h toke.c
+ ! unixish.h vms/config.vms vms/descrip.mms vms/fndvers.com
+ ! vms/gen_shrfls.pl vms/genconfig.pl vms/perly_c.vms
+ ! vms/test.com vms/vms.c vms/vms_yfix.pl vms/vmsish.h
+____________________________________________________________________________
+[ 373] By: mbeattie on 1997/12/17 14:10:50
+ Log: Major changes to the DOS/djgpp port (including threading):
+ Subject: Re: dos-djgpp port not in perl 5.004_54
+ Date: Fri, 21 Nov 1997 10:58:26 +0100
+ From: Molnar Laszlo <molnarl@cdata.tvnet.hu>
+ Branch: perl
+ + README.dos djgpp/config.over djgpp/configure.bat djgpp/djgpp.c
+ + djgpp/djgppsed.sh djgpp/fixpmain hints/dos_djgpp.sh
+ ! Configure MANIFEST Makefile.SH doio.c dosish.h
+ ! ext/POSIX/POSIX.xs installhtml installperl lib/AutoSplit.pm
+ ! lib/Cwd.pm lib/ExtUtils/Install.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/Manifest.pm lib/File/Basename.pm lib/File/Find.pm
+ ! lib/File/Path.pm lib/FindBin.pm lib/Pod/Html.pm
+ ! lib/Pod/Text.pm lib/Term/Cap.pm lib/perl5db.pl makedepend.SH
+ ! mg.c perl.c pod/pod2man.PL pp_hot.c t/io/fs.t t/lib/anydbm.t
+ ! t/lib/filehand.t t/lib/gdbm.t t/lib/io_sel.t t/lib/io_tell.t
+ ! t/lib/sdbm.t t/lib/thread.t t/op/magic.t t/op/stat.t
+ ! t/op/sysio.t t/op/taint.t utils/perldoc.PL
+____________________________________________________________________________
+[ 372] By: mbeattie on 1997/12/17 13:18:34
+ Log: Upgrade DB_File to 1.56:
+ Subject: DB_File-1.56 for _55
+ Date: Tue, 16 Dec 1997 22:25:29 +0000 (GMT)
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Branch: perl
+ ! Configure ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
+ ! ext/DB_File/Makefile.PL ext/DB_File/typemap t/lib/db-btree.t
+____________________________________________________________________________
+[ 371] By: mbeattie on 1997/12/17 12:02:03
+ Log: Threading patches for OS/2 (missing files taken from previous patch):
+ Subject: Re: 5.004_55: OS/2 patches again
+ Date: Sat, 13 Dec 1997 18:09:15 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ + os2/os2.sym os2/os2thread.h
+ ! MANIFEST hints/os2.sh os2/Changes os2/Makefile.SHs
+ ! os2/OS2/PrfDB/PrfDB.xs os2/OS2/REXX/REXX.xs os2/os2.c
+ ! os2/os2ish.h perl.h
+____________________________________________________________________________
+[ 370] By: mbeattie on 1997/12/17 11:01:34
+ Log: Add OS2 to list for DONT_DECLARE_STD in perl.h:
+ Subject: Re: 5.004_55: OS/2 patches again
+ Date: Sat, 13 Dec 1997 18:05:55 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 369] By: mbeattie on 1997/12/17 10:59:40
+ Log: Fix typo in compiler B/C.pm.
+ Branch: perlext
+ ! Compiler/B/C.pm
+____________________________________________________________________________
+[ 368] By: mbeattie on 1997/12/17 10:58:35
+ Log: Allow "perldoc -F filename":
+ Subject: 5.004_55: Patch to perldoc
+ Date: Thu, 11 Dec 1997 19:37:00 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! utils/perldoc.PL
+____________________________________________________________________________
+[ 367] By: mbeattie on 1997/12/17 10:54:47
+ Log: Fix not-reached warning for pp_threadsv.
+ Branch: perl
+ ! pp.c
+____________________________________________________________________________
+[ 366] By: nick on 1997/12/14 16:06:24
+ Log: Fix typo in Ilya's patch :-(
+ Branch: ansiperl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 365] By: nick on 1997/12/14 15:30:25
+ Log: #undef new PERLVARIC macro in appropriate places
+ Branch: ansiperl
+ ! miniperlmain.c perl.h
+____________________________________________________________________________
+[ 364] By: nick on 1997/12/14 15:04:36
+ Log: Ilya's MakeMaker (empty makefile) patch
+ Branch: ansiperl
+ ! lib/ExtUtils/MakeMaker.pm
+____________________________________________________________________________
+[ 363] By: gsar on 1997/12/13 05:57:13
+ Log: Integrate mainline. Builds and passes (Borland).
+ Branch: win32/perl
+ !> Configure README.threads config_h.SH doop.c embed.h
+ !> ext/DynaLoader/dl_aix.xs global.sym hints/aix.sh
+ !> hints/irix_6.sh op.c op.h perl.h perlvars.h pp_hot.c pp_sys.c
+ !> sv.c sv.h thread.h util.c
+____________________________________________________________________________
+[ 362] By: nick on 1997/12/13 02:53:03
+ Log: Resolve ansiperl against mainline
+ Branch: ansiperl
+ !> (integrate 92 files)
+____________________________________________________________________________
+[ 361] By: mbeattie on 1997/12/12 16:20:38
+ Log: pp_print and pp_prtf handling of tied file handles used EXTEND
+ instead of MEXTEND leading to core dumps. This fix needs
+ propagating back to the maintenance branch.
+ Branch: perl
+ ! pp_hot.c pp_sys.c
+____________________________________________________________________________
+[ 360] By: mbeattie on 1997/12/11 15:45:56
+ Log: Add missing patch to op.c that didn't come across with win32 merge.
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 359] By: mbeattie on 1997/12/11 11:54:41
+ Log: Stop tr/// from writing to target when only counting.
+ Branch: perl
+ ! doop.c op.c op.h
+____________________________________________________________________________
+[ 358] By: mbeattie on 1997/12/10 18:36:26
+ Log: Fix char*/unsigned char* clashes in util.c:fbm_instr and remove
+ a few extraneous trailing semicolons in perlvars.h.
+ Branch: perl
+ ! perlvars.h util.c
+____________________________________________________________________________
+[ 357] By: mbeattie on 1997/12/10 18:33:53
+ Log: Start overhauling compiler. It was working at least minimally
+ right up until the final tweak of B.xs to add threadsv_names
+ at which point building it provokes a seg fault in perl while
+ doing the xsubpp :-(.
+ Branch: perl
+ ! op.h util.c
+ Branch: perlext
+ ! Compiler/B.pm Compiler/B.xs Compiler/B/Asmdata.pm
+ ! Compiler/B/C.pm Compiler/B/CC.pm Compiler/Makefile.PL
+ ! Compiler/bytecode.pl Compiler/byteperl.c Compiler/byterun.c
+ ! Compiler/byterun.h Compiler/cc_harness Compiler/cc_runtime.h
+ ! Compiler/ccop.c Compiler/ccop.h Compiler/test_harness
+ ! Compiler/test_harness_cc
+____________________________________________________________________________
+[ 356] By: mbeattie on 1997/12/10 13:43:32
+ Log: Fix perl_os_thread typedef for pthreads. Tweak SvTAINT so that
+ sv_setfoo functions go back to not needing dTHR. Fix Configure
+ to check for already-existing -thread on archname and to check
+ better for d_pthread_created_joinable.
+ Branch: perl
+ ! Configure perl.h sv.c sv.h thread.h
+____________________________________________________________________________
+[ 355] By: mbeattie on 1997/12/10 10:53:58
+ Log: Minor fix/speedup to util.c:fbm_instr:
+ Subject: 5.004_55: Minor regexp patch
+ Date: Fri, 5 Dec 1997 05:09:54 -0500 (EST)
+ From: Ilya Zakharevich <ilya@MATH.OHIO-STATE.EDU>
+ Branch: perl
+ ! util.c
+____________________________________________________________________________
+[ 354] By: mbeattie on 1997/12/10 10:41:25
+ Log: Patches for IRIX, AIX and some generic stuff:
+ Subject: [PATCH] _55: Mostly AIX stuff but also IRIX and generic
+ Date: Sat, 29 Nov 1997 08:35:30 -0800 (PST)
+ From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+ (checked/ignored a few rejects; tweaked wording).
+ Branch: perl
+ ! Configure README.threads config_h.SH embed.h
+ ! ext/DynaLoader/dl_aix.xs global.sym hints/aix.sh
+ ! hints/irix_6.sh
+____________________________________________________________________________
+[ 353] By: mbeattie on 1997/12/10 10:10:19
+ Log: Integrate win32 back into mainline (trivial).
+ Branch: perl
+ +> embedvar.h intrpvar.h perlvars.h thrdvar.h win32/config.gc
+ +> win32/config_H.gc
+ !> (integrate 36 files)
+____________________________________________________________________________
+[ 352] By: nick on 1997/12/09 17:36:45
+ Log: Resolve win32 - Sarathy's tweak.
+ Branch: ansiperl
+ !> win32/makedef.pl
+____________________________________________________________________________
+[ 351] By: gsar on 1997/12/08 06:13:04
+ Log: re-add PERLVARI?C? change that somehow went missing in makedef.pl
+ Branch: win32/perl
+ ! win32/makedef.pl
+____________________________________________________________________________
+[ 350] By: nick on 1997/12/05 00:56:03
+ Log: Resolve ansiperl against win32
+ Branch: ansiperl
+ - win32/makegcc.mk
+ !> embed.h embed.pl embedvar.h global.sym miniperlmain.c perl.h
+ !> perlvars.h win32/Makefile win32/config.gc win32/makedef.pl
+ !> win32/makefile.mk win32/perllib.c win32/win32.h
+____________________________________________________________________________
+[ 349] By: gsar on 1997/12/02 07:28:23
+ Log: Revert to keeping (some) constant strings as globals
+ Branch: win32/perl
+ ! embed.h embed.pl embedvar.h global.sym miniperlmain.c perl.h
+ ! perlvars.h win32/makedef.pl win32/perllib.c
+____________________________________________________________________________
+[ 348] By: gsar on 1997/12/02 05:38:06
+ Log: makegcc.mk merged into makefile.mk, so makegcc.mk is gone.
+ Other minor fixes. Now is a good time to get the changes in win32 branch.
+ Branch: win32/perl
+ - win32/makegcc.mk
+ ! win32/Makefile win32/config.gc win32/makefile.mk win32/win32.h
+____________________________________________________________________________
+[ 347] By: gsar on 1997/12/02 03:32:55
+ Log: Integrate winansi again. Result builds and passes all tests on all
+ three compilers.
+ Branch: win32/perl
+ !> lib/ExtUtils/MM_Win32.pm win32/config.gc win32/makefile.mk
+ !> win32/makegcc.mk win32/win32.h
+____________________________________________________________________________
+[ 346] By: gsar on 1997/12/02 03:28:23
+ Log: various hacks to get mingw32 to build. Sync Makefile with makefile.mk.
+ makegcc.mk to be merged into makefile.mk soon.
+ Branch: win32/perl
+ ! lib/ExtUtils/MM_Win32.pm win32/Makefile win32/config.gc
+ ! win32/makedef.pl win32/makefile.mk win32/makegcc.mk
+ ! win32/win32.h
+____________________________________________________________________________
+[ 345] By: nick on 1997/12/02 01:57:17
+ Log: Add a 4th step (yes FOUR) to dll build process for gcc.
+ Now runs again...
+ Branch: ansiperl
+ ! lib/ExtUtils/MM_Win32.pm
+____________________________________________________________________________
+[ 344] By: nick on 1997/12/02 01:11:16
+ Log: Sarathy's patch
+ Branch: ansiperl
+ ! lib/ExtUtils/MM_Win32.pm win32/config.gc win32/makefile.mk
+ ! win32/makegcc.mk win32/win32.h
+____________________________________________________________________________
+[ 343] By: gsar on 1997/12/01 04:37:06
+ Log: Reverse integrate to get all of Nick's changes over at winansi (win32/perl/*
+ is identical to ansiperl/* now)
+ Branch: win32/perl
+ +> embedvar.h intrpvar.h perlvars.h thrdvar.h
+ !> (integrate 34 files)
+____________________________________________________________________________
+[ 342] By: nick on 1997/12/01 04:01:57
+ Log: Builds and passes all tests with gcc on Win32 - phew!
+ Branch: ansiperl
+ ! embed.h embedvar.h ext/Opcode/Opcode.xs global.sym perl.h
+ ! proto.h util.c win32/makedef.pl
+____________________________________________________________________________
+[ 341] By: nick on 1997/12/01 02:54:29
+ Log: Create a struct for all perls globals (as an option)
+ Mainly for Mingw32 which cannot import data.
+ Now only Opcode tests fail (op_desc/op_name not
+ handled yet stuff)
+ Branch: ansiperl
+ ! EXTERN.h embed.h embed.pl embedvar.h ext/Thread/Thread.xs
+ ! global.sym miniperlmain.c perl.c perl.h perlvars.h pp_hot.c
+ ! proto.h run.c util.c win32/Makefile win32/makedef.pl
+ ! win32/makegcc.mk win32/perllib.c win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32thread.c
+____________________________________________________________________________
+[ 340] By: nick on 1997/11/30 20:21:10
+ Log: Fixup exports in non -DDEBUGGING case
+ Branch: ansiperl
+ ! win32/makedef.pl
+____________________________________________________________________________
+[ 339] By: nick on 1997/11/30 20:10:04
+ Log: Disable hard-coded -DDEBUGGING
+ Branch: ansiperl
+ ! win32/config_h.PL
+____________________________________________________________________________
+[ 338] By: nick on 1997/11/30 20:00:19
+ Log: embed.pl now reads *var*.h to do its stuff.
+ Split generated embed.h into two - new embedvar.h
+ is #included when 'op' etc. will not mess up proto.h etc.
+ Removed #define foo (thr->Tfoo) from thread.h
+ Added some 'missing' symbols to global.sym, removed
+ those in the *var*.h files
+ Has build all MULTIPLICITY/USE_THREADS options on win32
+ with VC++ (and passed tests), but not with exactly this set
+ of files.
+ Branch: ansiperl
+ + embedvar.h
+ ! embed.h embed.pl global.sym interp.sym intrpvar.h perl.h
+ ! perlvars.h regcomp.c thrdvar.h thread.h win32/Makefile
+ ! win32/makedef.pl
+____________________________________________________________________________
+[ 337] By: nick on 1997/11/29 23:55:31
+ Log: Globals and structs via macros - part 1 of N
+ - introduce perlvars.h intrpvar.h and thrdvar.h
+ - change perl.h and thread.h to include them with
+ appropriate macros defined
+ - result is status-quo but with macros
+ - next step is to tweak embed.* to capitalize on
+ new easy-to-find info.
+ Branch: ansiperl
+ + intrpvar.h perlvars.h thrdvar.h
+ ! perl.h thread.h win32/Makefile
+____________________________________________________________________________
+[ 336] By: nick on 1997/11/29 19:13:55
+ Log: VC++ default to threaded
+ Branch: ansiperl
+ ! win32/Makefile
+____________________________________________________________________________
+[ 335] By: nick on 1997/11/29 18:38:26
+ Log: Avoid __declspec(thread) by default, for both scratch
+ return areas and THR stuff. Use struct thread intern instead.
+ Branch: ansiperl
+ ! win32/win32.c win32/win32.h win32/win32sck.c
+ ! win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 334] By: nick on 1997/11/29 17:49:04
+ Log: Non-threaded build fix
+ Branch: ansiperl
+ ! win32/win32thread.c
+____________________________________________________________________________
+[ 333] By: nick on 1997/11/29 17:29:07
+ Log: Sort out malloc_mutex for perl's malloc
+ Remove BINCOMPAT3 from embed.pl
+ Add dependancy to CORE_H for PERL95_OBJ
+ Branch: ansiperl
+ ! dosish.h embed.h embed.pl global.sym perl.h win32/Makefile
+ ! win32/win32.c
+____________________________________________________________________________
+[ 332] By: nick on 1997/11/29 16:21:01
+ Log: Integrate win32 into ansiperl
+ Branch: ansiperl
+ !> README.threads hints/irix_6.sh lib/Test/Harness.pm
+ !> lib/perl5db.pl malloc.c miniperlmain.c perl.h sv.c t/TEST
+ !> t/lib/anydbm.t t/lib/db-btree.t t/lib/db-hash.t
+ !> t/lib/db-recno.t t/lib/gdbm.t t/lib/ndbm.t t/lib/odbm.t
+ !> t/lib/safe2.t t/lib/sdbm.t t/op/pat.t t/op/taint.t
+ !> win32/perllib.c
+____________________________________________________________________________
+[ 331] By: nick on 1997/11/29 01:35:45
+ Log: GCC + Threads on Win32 - best gcc results yet
+ Branch: ansiperl
+ ! XSUB.h perl.h thread.h win32/makedef.pl win32/makegcc.mk
+ ! win32/win32.h win32/win32iop.h win32/win32thread.c
+ ! win32/win32thread.h
+____________________________________________________________________________
+[ 330] By: nick on 1997/11/28 23:05:08
+ Log: Un-botch gcc workround
+ Branch: ansiperl
+ ! XSUB.h
+____________________________________________________________________________
+[ 329] By: nick on 1997/11/28 22:39:39
+ Log: Builds completely with Mingw32, dynamic loaded extensions
+ don't work yet - suspect __declspec() non-implemented issues.
+ Branch: ansiperl
+ ! XSUB.h lib/ExtUtils/Command.pm lib/ExtUtils/MM_Win32.pm
+ ! lib/ExtUtils/Mksymlists.pm win32/config.gc win32/makegcc.mk
+ ! win32/runperl.c win32/win32.c win32/win32iop.h
+____________________________________________________________________________
+[ 328] By: gsar on 1997/11/28 05:48:15
+ Log: integrate winansi.
+ Branch: win32/perl
+ +> win32/config.gc win32/config_H.gc win32/makegcc.mk
+ ! perl.h
+ !> dosish.h hv.c win32/dl_win32.xs win32/include/sys/socket.h
+ !> win32/makedef.pl win32/makefile.mk win32/runperl.c
+ !> win32/win32.c win32/win32.h win32/win32iop.h win32/win32sck.c
+____________________________________________________________________________
+[ 327] By: gsar on 1997/11/28 05:38:48
+ Log: Integrate mainline.
+ Branch: win32/perl
+ !> README.threads hints/irix_6.sh lib/Test/Harness.pm
+ !> lib/perl5db.pl malloc.c miniperlmain.c sv.c t/TEST
+ !> t/lib/anydbm.t t/lib/db-btree.t t/lib/db-hash.t
+ !> t/lib/db-recno.t t/lib/gdbm.t t/lib/ndbm.t t/lib/odbm.t
+ !> t/lib/safe2.t t/lib/sdbm.t t/op/pat.t t/op/taint.t
+ !> win32/perllib.c
+____________________________________________________________________________
+[ 326] By: nick on 1997/11/27 19:13:36
+ Log: GCC builds perl.dll and perl.exe on Win32
+ Branch: ansiperl
+ ! win32/makedef.pl win32/makegcc.mk
+____________________________________________________________________________
+[ 325] By: nick on 1997/11/27 17:46:30
+ Log: Add files and tweak others to get 'native' Mingw32 gcc port as
+ far as building miniperl and perl.dll (but not import lib yet)
+ Seems to lack popen()/pclose() and fcloseall() and fflushall().
+ Also only CRTDLL not MCRTDLL so threading is probably not
+ possible yet.
+ Had to mess with win32iop.h's placement as we need __attribute__
+ to get STDCALL, and #define of printf messes up proto.h
+ Branch: ansiperl
+ + win32/config.gc win32/config_H.gc win32/makegcc.mk
+ ! dosish.h perl.h win32/dl_win32.xs win32/include/sys/socket.h
+ ! win32/makefile.mk win32/runperl.c win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32sck.c
+____________________________________________________________________________
+[ 324] By: mbeattie on 1997/11/27 17:08:06
+ Log: Give dire warnings about the IRIX 6.2 kernel panic.
+ Branch: perl
+ ! README.threads hints/irix_6.sh
+____________________________________________________________________________
+[ 323] By: mbeattie on 1997/11/27 16:57:33
+ Log: Fix prototypes of sv_vsetpvfn and sv_vcatpvfn:
+ Subject: Re: ANNOUNCE: perl 5.004_55 is available
+ Date: 27 Nov 1997 17:18:53 +0100
+ From: koenig@kulturbox.de (Andreas J. Koenig)
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 322] By: mbeattie on 1997/11/27 16:12:15
+ Log: Integrate win32 branch back into mainline.
+ Branch: perl
+ !> (integrate 42 files)
+____________________________________________________________________________
+[ 321] By: mbeattie on 1997/11/27 15:06:36
+ Log: Fix t/lib/safe2.t for SunOS 4.1.3:
+ Subject: Re: ANNOUNCE: perl 5.004_55 is available
+ Date: Thu, 27 Nov 1997 10:46:42 +0000 (GMT)
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Branch: perl
+ ! t/lib/safe2.t
+____________________________________________________________________________
+[ 320] By: mbeattie on 1997/11/27 15:02:59
+ Log: Fix MYMALLOC (wrong #define in malloc.c):
+ Subject: 5.004_55: MYMALLOC completely busted
+ Date: Thu, 27 Nov 1997 01:08:16 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! malloc.c
+____________________________________________________________________________
+[ 319] By: mbeattie on 1997/11/27 15:01:37
+ Log: Fix newSVrv so sv_setref_foo work better:
+ Subject: [PATCH] [5.004_55] newSVrv (again)
+ Date: Thu, 27 Nov 1997 00:25:50 -0500
+ From: Owen Taylor <owt1@cornell.edu>
+ Branch: perl
+ ! sv.c
+____________________________________________________________________________
+[ 318] By: mbeattie on 1997/11/27 14:59:03
+ Log: Output skipped test information in test suite:
+ Subject: 5.004_55: Making test harness platform_aware
+ Date: Wed, 26 Nov 1997 17:16:55 -0500 (EST)
+ Date: Wed, 26 Nov 1997 17:16:55 -0500 (EST)
+ Branch: perl
+ ! lib/Test/Harness.pm t/TEST t/lib/anydbm.t t/lib/db-btree.t
+ ! t/lib/db-hash.t t/lib/db-recno.t t/lib/gdbm.t t/lib/ndbm.t
+ ! t/lib/odbm.t t/lib/sdbm.t t/op/taint.t
+____________________________________________________________________________
+[ 317] By: mbeattie on 1997/11/27 14:55:15
+ Log: Add 'W'atch command to debugger and improve help:
+ Subject: 5.004_55: Debugger patch again
+ Date: Wed, 26 Nov 1997 17:05:57 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! lib/perl5db.pl
+____________________________________________________________________________
+[ 316] By: mbeattie on 1997/11/27 14:52:44
+ Log: Stop double initialisation of malloc_mutex:
+ Subject: 5.004_55: Double initialiazation of malloc_mutex
+ Date: Wed, 26 Nov 1997 16:51:43 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! miniperlmain.c win32/perllib.c
+____________________________________________________________________________
+[ 315] By: mbeattie on 1997/11/27 14:48:58
+ Log: Fix PVLV case in sv_setsv (plus tests in op/pat.t).
+ Branch: perl
+ ! sv.c t/op/pat.t
+____________________________________________________________________________
+[ 314] By: nick on 1997/11/27 01:03:19
+ Log: Merge win32 and ansiperl branches post _55 tweaks from Sarathy.
+ Branch: ansiperl
+ !> (integrate 897 files)
+____________________________________________________________________________
+[ 313] By: gsar on 1997/11/26 03:20:55
+ Log: merge win32-aware installperl in ansiperl branch.
+ Branch: win32/perl
+ !> installperl
+____________________________________________________________________________
+[ 312] By: gsar on 1997/11/26 01:50:37
+ Log: Fix for C<sort 'foo'...> bug:
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Message-Id: <199711011946.OAA18882@aatma.engin.umich.edu>
+ Subject: [PATCH] Re: Sort grammar bug
+ Date: Sat, 01 Nov 1997 14:46:35 -0500
+ ------
+ From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+ Message-Id: <199711021247.MAA01743@crypt.compulink.co.uk>
+ Subject: Re: Sort grammar bug
+ Date: Sun, 02 Nov 1997 12:47:51 +0000
+ Branch: win32/perl
+ ! t/op/sort.t toke.c
+____________________________________________________________________________
+[ 311] By: nick on 1997/11/26 01:42:50
+ Log: Win32-ize installperl
+ Branch: ansiperl
+ ! installperl
+____________________________________________________________________________
+[ 310] By: gsar on 1997/11/26 01:36:39
+ Log: Another trivial patch:
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Message-Id: <199710300245.VAA04244@aatma.engin.umich.edu>
+ Subject: [PATCH] Re: Why doesn't XSRETURN have STMT_START/STMT_END brackets?
+ Date: Wed, 29 Oct 1997 21:45:26 -0500
+ Branch: win32/perl
+ ! XSUB.h
+____________________________________________________________________________
+[ 309] By: nick on 1997/11/26 01:33:32
+ Log: Fixup _55 for Win32:
+ Missed thread :-> perl_thread changes
+ Two #define THR (not the same)
+ K&R style func in hv.c
+ Branch: ansiperl
+ ! hv.c win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 308] By: gsar on 1997/11/26 01:30:21
+ Log: Sync yet another patch (this one manually edited):
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Message-Id: <199710290251.VAA14362@aatma.engin.umich.edu>
+ Subject: [PATCH] Re: local($@) gives core dump
+ Date: Tue, 28 Oct 1997 21:51:25 -0500
+ Branch: win32/perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 307] By: gsar on 1997/11/26 01:22:10
+ Log: Sync another change from local repository.
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Message-Id: <199710290316.WAA15888@aatma.engin.umich.edu>
+ Subject: Re: do_postponed breaks with multiple interpreters
+ Date: Tue, 28 Oct 1997 22:16:13 -0500
+ Branch: win32/perl
+ ! op.c
+____________________________________________________________________________
+[ 306] By: gsar on 1997/11/26 01:17:46
+ Log: Sync a change from local repository.
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Message-Id: <199710290106.UAA11485@aatma.engin.umich.edu>
+ Subject: [PATCH] Re: Core dump from using sockets w/ system or open(pipe) or "`"
+ Date: Tue, 28 Oct 1997 20:06:06 -0500
+ Branch: win32/perl
+ ! mg.c
+____________________________________________________________________________
+[ 305] By: nick on 1997/11/26 00:50:10
+ Log: Integrate mainline as of _55
+ Branch: ansiperl
+ +> emacs/ptags
+ !> (integrate 36 files)
+____________________________________________________________________________
+[ 304] By: gsar on 1997/11/26 00:27:57
+ Log: Various changes to make it build cleanly and pass all tests:
+ - needed to run `perl embed.pl`
+ - use PERL_CORE instead of PERLDLL in places that do mean PERL_CORE
+ - fix prototypes for a few declarations (Borland is finally quiet)
+ - move declaration of Mymalloc etc to perl.h (since win32 and other
+ ports may #define malloc themselves, to let extensions bind to
+ the version that perl used)
+ - move struct reg_data into a public header file, since it is
+ referenced in a public datatype
+ - win32 makefile fixes
+ - fix remaining s/thread/perl_thread/
+ Branch: win32/perl
+ ! EXTERN.h embed.h ext/DynaLoader/dlutils.c
+ ! ext/SDBM_File/sdbm/sdbm.h hv.c perl.h proto.h regcomp.h
+ ! regexp.h win32/Makefile win32/dl_win32.xs win32/makefile.mk
+ ! win32/win32.h win32/win32iop.h win32/win32thread.c
+____________________________________________________________________________
+[ 303] By: gsar on 1997/11/25 20:57:31
+ Log: Fixup the places where the automatic merge got it wrong.
+ Previous change (#302) was just a normal integration--ignore the
+ "reverse" in there.
+ Branch: win32/perl
+ ! op.c perl.h
+____________________________________________________________________________
+[ 302] By: gsar on 1997/11/25 20:32:12
+ Log: reverse integrate mainline
+ Branch: win32/perl
+ +> emacs/ptags
+ !> (integrate 896 files)
+
+----------------
+Version 5.004_55
+----------------
+
+____________________________________________________________________________
+[ 301] By: mbeattie on 1997/11/25 17:59:53
+ Log: Fix minor thinkos in hv.c and pp_ctl.c. This is 5.004_55.
+ Branch: perl
+ ! hv.c pp_ctl.c
+____________________________________________________________________________
+[ 300] By: mbeattie on 1997/11/25 16:29:36
+ Log: Add t/avhv.t to MANIFEST and bump patchlevel.h to 55.
+ Branch: perl
+ ! MANIFEST patchlevel.h
+____________________________________________________________________________
+[ 299] By: mbeattie on 1997/11/25 15:59:16
+ Log: Move malloc_mutex initialisation/destruction:
+ Subject: patch to 5.004_54 for pthreads with Perl's malloc
+ From: ilya@math.ohio-state.edu (Ilya Zakharevich)
+ Branch: perl
+ ! malloc.c os2/os2.c os2/os2ish.h perl.c perl.h plan9/plan9ish.h
+ ! unixish.h vms/vmsish.h
+____________________________________________________________________________
+[ 298] By: mbeattie on 1997/11/25 15:49:22
+ Log: Make hv_ functions cope better with 'm'-magic:
+ Subject: [5.004_54] Another neglected patch
+ Date: Fri, 21 Nov 1997 22:28:17 -0500
+ From: Owen Taylor <owt1@cornell.edu>
+ Branch: perl
+ ! hv.c
+____________________________________________________________________________
+[ 297] By: mbeattie on 1997/11/25 15:47:36
+ Log: Fix typo in Thread.xs.
+ Branch: perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 296] By: mbeattie on 1997/11/25 15:42:07
+ Log: Integrate from ansi branch to mainline.
+ Branch: perl
+ !> (integrate 890 files)
+____________________________________________________________________________
+[ 295] By: mbeattie on 1997/11/25 14:29:31
+ Log: AIX patch for DynaLoader/dl_aix.xs and hints/aix.sh:
+ Subject: Re: _54 on AIX
+ Date: Tue, 25 Nov 1997 00:49:52 -0800 (PST)
+ From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+ Branch: perl
+ ! ext/DynaLoader/dl_aix.xs
+____________________________________________________________________________
+[ 294] By: mbeattie on 1997/11/25 14:29:10
+ Log: AIX patch for hints/aix.sh:
+ Subject: Re: _54 on AIX
+ Date: Tue, 25 Nov 1997 00:49:52 -0800 (PST)
+ From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+ Branch: perl
+ ! hints/aix.sh
+____________________________________________________________________________
+[ 291] By: mbeattie on 1997/11/25 14:17:05
+ Log: Fix scalar dereference of threadsv variables (e.g. $$_).
+ Branch: perl
+ ! op.c op.h
+____________________________________________________________________________
+[ 290] By: mbeattie on 1997/11/25 14:16:29
+ Log: AIX patch (including Configure support for {sched,pthread}_yield,
+ pthread initial detach state, renaming perl_thread to perl_os_thread
+ and struct thread to struct perl_thread):
+ Subject: Re: _54 on AIX
+ Date: Thu, 20 Nov 1997 06:10:51 -0800 (PST)
+ From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+ Branch: perl
+ ! Configure config_h.SH cv.h ext/DB_File/DB_File.xs
+ ! ext/Thread/Makefile.PL ext/Thread/Thread.pm
+ ! ext/Thread/Thread.xs fakethr.h hints/aix.sh perl.c perl.h pp.h
+ ! proto.h sv.h thread.h util.c win32/win32thread.c
+ ! win32/win32thread.h
+____________________________________________________________________________
+[ 289] By: mbeattie on 1997/11/25 12:33:02
+ Log: Rename perl_thread to perl_os_thread.
+ Branch: perl
+ ! fakethr.h thread.h util.c win32/win32thread.h
+____________________________________________________________________________
+[ 288] By: mbeattie on 1997/11/25 12:27:35
+ Log: Remove bincompat3 support:
+ Subject: Re: ANNOUNCE: perl5.004_54 is available
+ Date: Wed, 19 Nov 1997 08:07:10 -0800 (PST)
+ From: Jarkko Hietaniemi <jarkko.hietaniemi@research.nokia.com>
+ Branch: perl
+ ! Configure INSTALL embed.h global.sym malloc.c
+____________________________________________________________________________
+[ 287] By: mbeattie on 1997/11/25 12:23:50
+ Log: Emacs/tags update:
+ Subject: Emacs/tags update for 5.004_54
+ Date: Fri, 21 Nov 1997 15:02:09 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ + emacs/ptags
+ ! MANIFEST Makefile.SH emacs/cperl-mode.el
+____________________________________________________________________________
+[ 286] By: nick on 1997/11/23 23:03:56
+ Log: Add $$_ test
+ Branch: ansiperl
+ ! t/op/ref.t
+____________________________________________________________________________
+[ 285] By: gsar on 1997/11/23 08:26:00
+ Log: Initial reverse integration of winansi branch.
+ Branch: win32/perl
+ !> (integrate 50 files)
+____________________________________________________________________________
+[ 284] By: gsar on 1997/11/23 07:32:24
+ Log: Add to docs about the BEGIN { shift } feature. Make the change
+ yet simpler using CvUNIQUE(compcv) instead of subline (Chip's idea).
+ Branch: win32/perl
+ ! op.c perly.c perly.y pod/perlfunc.pod vms/perly_c.vms
+____________________________________________________________________________
+[ 283] By: nick on 1997/11/22 21:29:30
+ Log: Duplicate perl_threadsv
+ Branch: ansiperl
+ ! global.sym
+____________________________________________________________________________
+[ 282] By: nick on 1997/11/22 21:18:11
+ Log: Munge pseudo-Configure stuff to add -thread to archname as
+ Malcolm seems to think that is way to test for threads.
+ Update @INC stuffing hackery to have traditional @INC
+ search order archlib, privlib, sitearch, site.
+ Branch: ansiperl
+ ! t/lib/english.t win32/config.bc win32/config_H.bc
+ ! win32/config_H.vc win32/config_h.PL win32/config_sh.PL
+ ! win32/makefile.mk win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 281] By: nick on 1997/11/22 19:28:21
+ Log: Builds and passes all but english.t on win32 VC++
+ Branch: ansiperl
+ ! global.sym pp_ctl.c win32/Makefile win32/config.vc
+ ! win32/config_H.vc win32/win32thread.h
+____________________________________________________________________________
+[ 280] By: nick on 1997/11/22 18:10:50
+ Log: ansiperl builds with Borland C++ again
+ Branch: ansiperl
+ ! pp_ctl.c regcomp.c regcomp.h regexec.c toke.c util.c
+ ! win32/config.bc win32/config_H.bc win32/perlglob.c
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 279] By: nick on 1997/11/22 16:42:51
+ Log: Resolve ansiperl against mainline
+ Branch: ansiperl
+ !> embed.h ext/Thread/Thread.xs global.sym op.c op.h perl.c
+ !> perl.h pp.c pp_ctl.c pp_hot.c proto.h scope.c scope.h
+ !> t/lib/english.t thread.h toke.c util.c
+____________________________________________________________________________
+[ 278] By: nick on 1997/11/22 16:30:27
+ Log: Resolve ansiperl against win32
+ Branch: ansiperl
+ !> (integrate 55 files)
+____________________________________________________________________________
+[ 277] By: gsar on 1997/11/22 09:48:02
+ Log: - shift() inside BEGIN|END|INIT now shifts @ARGV instead of @_
+ - added a test for the above
+ - fixed up perly.c.diff and vms/perl_c.vms for above and added the
+ ansification hunks
+ Branch: win32/perl
+ ! op.c perly.c perly.c.diff perly.y t/op/misc.t vms/perly_c.vms
+____________________________________________________________________________
+[ 276] By: gsar on 1997/11/22 07:24:01
+ Log: Generic change in win32 branch: don't just turn on CRIPPLED_CC
+ when USE_THREADS. GCC for instance, can do without macros that use
+ globals. Instead, selectively re#define only those macros
+ that use globals to their functional equivalents. Tests 100% on
+ Solaris/gcc (after `chmod +x t/op/nothread.t t/lib/thread.t` (hint,hint)).
+ Branch: win32/perl
+ ! perl.h sv.h
+____________________________________________________________________________
+[ 275] By: gsar on 1997/11/22 05:27:04
+ Log: Integrate mainline.
+ Branch: win32/perl
+ +> ext/Thread/die.t ext/Thread/die2.t t/op/avhv.t
+ - lib/Class/Fields.pm lib/ISA.pm
+ !> (integrate 41 files)
+____________________________________________________________________________
+[ 274] By: mbeattie on 1997/11/21 18:28:22
+ Log: $_ is now per-thread (rather a lot of changes). Only tested under
+ *-linux-thread at the moment.
+ Branch: perl
+ ! embed.h ext/Thread/Thread.xs global.sym op.c op.h perl.c
+ ! perl.h pp.c pp_ctl.c pp_hot.c proto.h scope.c scope.h
+ ! t/lib/english.t thread.h toke.c util.c
+____________________________________________________________________________
+[ 273] By: mbeattie on 1997/11/21 10:31:29
+ Log: Filter patch to toke.c:
+ Subject: Tiny core patch for source filters
+ Date: Thu, 20 Nov 1997 23:12:09 +0000 (GMT)
+ From: pmarquess@bfsec.bt.co.uk (Paul Marquess)
+ Branch: perl
+ ! toke.c
+____________________________________________________________________________
+[ 272] By: nick on 1997/11/21 00:54:43
+ Log: Basic integrate of lastest perl into ansiperl
+ Branch: ansiperl
+ +> ext/Thread/die.t ext/Thread/die2.t t/op/avhv.t
+ - lib/Class/Fields.pm lib/ISA.pm
+ ! win32/win32.c win32/win32.h
+ !> (integrate 57 files)
+____________________________________________________________________________
+[ 271] By: mbeattie on 1997/11/20 12:12:00
+ Log: Initial stab at IRIX configuration support for threading. Manually
+ applied parts of following patches:
+ Subject: Perl 5.004_54 on IRIX
+ Date: Wed, 19 Nov 1997 18:37:14 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Subject: Re: Perl 5.004_54 on IRIX
+ Date: 19 Nov 1997 17:10:17 -0800
+ From: Scott Henry <scotth@sgi.com>
+ Branch: perl
+ ! README.threads hints/irix_6.sh hints/irix_6_0.sh
+ ! hints/irix_6_1.sh perl.h
+____________________________________________________________________________
+[ 270] By: mbeattie on 1997/11/19 17:45:37
+ Log: The new jumbo regexp stuff did SSPUSHINT on a char* instead of
+ SSPUSHPTR causing Alpha to core dump in pat.t. While fixing it,
+ also fixed two instances of referring to SVs after destruction.
+ Branch: perl
+ ! regcomp.c regexec.c
+____________________________________________________________________________
+[ 269] By: mbeattie on 1997/11/19 15:33:23
+ Log: avhv_keys under Digital UNIX made avhv.t fail because *keysp was
+ changed by mg_get(*keysp) (!). Introducing a new local variable
+ fixed it but I don't know if it's a compiler problem or some
+ other corruption happening elsewhere.
+ Branch: perl
+ ! av.c
+____________________________________________________________________________
+[ 268] By: mbeattie on 1997/11/19 11:39:49
+ Log: Let Configure sort out get{host,net}byaddr* prototypes:
+ Subject: [PATCH] 5.004_54: little something for
+ get{hos,ne}tbyaddr protos (Configure, config_h.SH, pp_sys.c)
+ Date: Tue, 18 Nov 1997 19:08:19 +0200 (EET)
+ From: Jarkko Hietaniemi <jhi@iki.fi>
+ Branch: perl
+ ! Configure config_h.SH pp_sys.c
+____________________________________________________________________________
+[ 267] By: mbeattie on 1997/11/19 11:04:15
+ Log: Jumbo regexp patch applied (with minor fix-up tweaks):
+ Subject: Version 7 of Jumbo RE patch available
+ Date: Sun, 16 Nov 1997 00:29:39 -0500 (EST)
+ From: Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Branch: perl
+ ! MANIFEST dump.c embed.h global.sym mg.c op.c op.h perl.c
+ ! perl.h pod/perlre.pod pp.c pp_ctl.c pp_hot.c proto.h regcomp.c
+ ! regcomp.h regexec.c regexp.h sv.c t/op/misc.t t/op/pat.t
+ ! t/op/re_tests t/op/regexp.t t/op/split.t t/op/subst.t toke.c
+ ! util.c
+____________________________________________________________________________
+[ 266] By: mbeattie on 1997/11/18 17:26:09
+ Log: Separate avhv_foo() key handling into avhv_keys(). Slightly tweaked
+ version of patch:
+ Subject: tie fake hash patch for 5.004_54
+ Date: Sat, 15 Nov 1997 19:18:30 -0500
+ From: Joshua Pritikin <pritikin@mindspring.com>
+ Branch: perl
+ + t/op/avhv.t
+ ! av.c embed.h global.sym proto.h
+____________________________________________________________________________
+[ 265] By: mbeattie on 1997/11/18 16:51:04
+ Log: Bring MANIFEST up to date. Add new thread tests.
+ Branch: perl
+ + ext/Thread/die.t ext/Thread/die2.t
+ ! MANIFEST
+____________________________________________________________________________
+[ 264] By: mbeattie on 1997/11/18 16:41:27
+ Log: magic_setisa enhanced to update %FIELDS automatically when @ISA
+ is assigned to. Added tests to t/op/array.t. magic_setisa now
+ warns about including non-existent packages in @ISA when -w is on.
+ Branch: perl
+ - lib/Class/Fields.pm lib/ISA.pm
+ ! mg.c t/op/array.t
+____________________________________________________________________________
+[ 263] By: mbeattie on 1997/11/18 16:38:57
+ Log: Fix typo in win32 -> mainline integration.
+ Branch: perl
+ ! perl.h
+____________________________________________________________________________
+[ 262] By: mbeattie on 1997/11/18 11:56:09
+ Log: Integrate win32 branch back into mainline.
+ Branch: perl
+ - win32/win32io.c win32/win32io.h
+ ! op.c
+ !> (integrate 30 files)
+____________________________________________________________________________
+[ 261] By: gsar on 1997/11/18 00:14:02
+ Log: Export our own FD_SET() et al to complete sockets-as-handles pretense.
+ Branch: win32/perl
+ ! win32/config.bc win32/config.vc win32/config_H.bc
+ ! win32/config_H.vc win32/include/sys/socket.h win32/win32sck.c
+____________________________________________________________________________
+[ 260] By: nick on 1997/11/16 23:16:16
+ Log: Generic file changes for MYMALLOC
+ Branch: ansiperl
+ ! miniperlmain.c perl.c
+____________________________________________________________________________
+[ 259] By: nick on 1997/11/16 23:14:36
+ Log: MYMALLOC for Win32:
+ 1. Initialize malloc_mutex before it is used (all platforms!)
+ 2. Adjust #ifdef muddle to allow MYMALLOC and win32_ to coexist
+ 3. Tweak win32/config*.* to define MYMALLOC
+ 4. Provide sbrk() in terms of VirtualAlloc().
+
+ Also fixup -MT (perl95) build to handle Perl_current_thread
+ via call to DLL (as though an extension).
+ Branch: ansiperl
+ ! win32/Makefile win32/config.bc win32/config.vc
+ ! win32/config_H.bc win32/config_H.vc win32/makedef.pl
+ ! win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32thread.h
+____________________________________________________________________________
+[ 258] By: nick on 1997/11/15 20:42:28
+ Log: Implement dTHR via __declspec(thread) - part 2
+ Branch: ansiperl
+ ! win32/makedef.pl win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 257] By: nick on 1997/11/15 19:52:53
+ Log: Use __declspec(thread) var rather tha TslAlloc & co.
+ Branch: ansiperl
+ ! win32/makedef.pl win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 256] By: gsar on 1997/11/15 02:58:09
+ Log: Add #include guard in Thread.xs so it will build even under
+ no USE_THREADS (for win32). This was missed because of edit
+ w/o checkout perforce kludge.
+ Branch: win32/perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 255] By: nick on 1997/11/15 00:33:46
+ Log: Integrate mainline (5.004_54?) into ansiperl
+ Branch: ansiperl
+ !> MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
+ !> ext/Thread/Thread/Specific.pm ext/Thread/join.t
+ !> ext/Thread/specific.t global.sym lib/fields.pm mg.c op.c
+ !> perl.c perl.h pp_ctl.c pp_hot.c pp_sys.c proto.h scope.c
+ !> t/io/pipe.t t/lib/io_pipe.t t/op/magic.t thread.h
+____________________________________________________________________________
+[ 254] By: nick on 1997/11/15 00:25:26
+ Log: Interate win32 into ansiperl
+ Branch: ansiperl
+ +> ext/Thread/Thread/Specific.pm ext/Thread/specific.t
+ +> lib/fields.pm
+ !> MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
+ !> ext/Thread/join.t global.sym mg.c op.c perl.c perl.h pp_ctl.c
+ !> pp_hot.c pp_sys.c proto.h scope.c t/io/pipe.t t/lib/io_pipe.t
+ !> t/op/magic.t thread.h win32/Makefile win32/config.bc
+ !> win32/config.vc win32/config_sh.PL win32/makefile.mk
+____________________________________________________________________________
+[ 253] By: gsar on 1997/11/14 22:04:58
+ Log: Integrate mainline changes into win32 branch. Now would be a good time
+ to reverse integrate the win32 branch into mainline.
+ Branch: win32/perl
+ +> ext/Thread/Thread/Specific.pm ext/Thread/specific.t
+ +> lib/fields.pm
+ !> MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
+ !> ext/Thread/join.t global.sym mg.c op.c perl.c perl.h pp_ctl.c
+ !> pp_hot.c pp_sys.c proto.h scope.c t/io/pipe.t t/lib/io_pipe.t
+ !> t/op/magic.t thread.h
+
+----------------
+Version 5.004_54
+----------------
+
+____________________________________________________________________________
+[ 252] By: mbeattie on 1997/11/14 15:07:19
+ Log: Two more delays added to test suite to help *-solaris-thread.
+ Branch: perl
+ ! t/io/pipe.t t/lib/io_pipe.t
+____________________________________________________________________________
+[ 251] By: mbeattie on 1997/11/14 15:05:57
+ Log: Remove stale code from Thread.xs.
+ Branch: perl
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 250] By: mbeattie on 1997/11/14 10:12:40
+ Log: Add delay to signal handling in t/op/magic.t. (Solaris with pthreads
+ doesn't run handlers for self-sent signals until kill has returned.)
+ Branch: perl
+ ! t/op/magic.t
+____________________________________________________________________________
+[ 249] By: gsar on 1997/11/14 05:14:44
+ Log: Fix various details in win32 makefiles and Config.pm setup.
+ - ldflags is set for both compilers now
+ - extensions list is now correct
+ - delete perl95.exe on distclean
+ - cf_time now gets updated (once)
+ - ccdlflags is set for Borland
+ - fix startperl so dprofpp works
+ Branch: win32/perl
+ ! win32/Makefile win32/config.bc win32/config.vc
+ ! win32/config_sh.PL win32/makefile.mk
+____________________________________________________________________________
+[ 248] By: mbeattie on 1997/11/13 18:01:27
+ Log: Rewrite thread return code to distinguish between ordinary return
+ and die() and make join propagate the die. Add tiny method eval
+ which just does "return eval { shift->join; }". Add Thread::Specific
+ class for access to thread specific user data along with specific.t.
+ Rename Class to classname throughout Thread.xs for consistency.
+ Fix pp_specific to pp_threadsv in global.sym. Add support to
+ pp_entersub in pp_hot.c to lock stash for static locked methods.
+ Branch: perl
+ + ext/Thread/Thread/Specific.pm ext/Thread/specific.t
+ + lib/fields.pm
+ ! MANIFEST embed.h ext/Thread/Thread.pm ext/Thread/Thread.xs
+ ! ext/Thread/join.t global.sym mg.c pp_hot.c thread.h
+____________________________________________________________________________
+[ 247] By: mbeattie on 1997/11/13 14:13:30
+ Log: Change CONTEXT to PERL_CONTEXT throughout source (since the #define
+ to avoid the Digital UNIX clash no longer works). Changed the #ifdef
+ in pp_sys.c for whether getnet* function get protoyped (since the
+ default had a broken prototype for getnetbyaddr).
+ Branch: perl
+ ! mg.c op.c perl.c perl.h pp_ctl.c pp_hot.c pp_sys.c proto.h
+ ! scope.c thread.h
+____________________________________________________________________________
+[ 246] By: nick on 1997/11/13 02:44:40
+ Log: Integrate Win32 branch
+ Branch: ansiperl
+ - configure ext/util/extliblist win32/bin/pl2bat.bat
+ - win32/bin/search.bat win32/bin/test.bat win32/bin/webget.bat
+ - win32/config.H win32/config.w32 win32/win32io.c
+ - win32/win32io.h
+ !> (integrate 905 files)
+____________________________________________________________________________
+[ 245] By: nick on 1997/11/13 00:47:54
+ Log: Integrate (-ay) win32 branch at its creation to
+ establish and ancestor as per perkforce technote #9
+ Branch: ansiperl
+ +> configure ext/util/extliblist win32/bin/pl2bat.bat
+ +> win32/bin/search.bat win32/bin/test.bat win32/bin/webget.bat
+ +> win32/config.H win32/config.w32
+ !> (integrate 859 files)
+____________________________________________________________________________
+[ 244] By: gsar on 1997/11/12 22:26:39
+ Log: More cleanups of win32/win32*.[ch] files. win32/win32iop.h now
+ contains the all the declarations and macros for the win32io layer.
+ New std-ish functions are exported now. All win32-specific exported
+ functions begin with "win32_" consistently. win32 version of
+ init_os_extras() is now exported, so embedders can get the in-core
+ xsubs.
+ Branch: win32/perl
+ ! dosish.h win32/makedef.pl win32/win32.c win32/win32.h
+ ! win32/win32iop.h win32/win32sck.c
+____________________________________________________________________________
+[ 243] By: gsar on 1997/11/12 07:41:52
+ Log: Really delete deleted files.
+ Branch: win32/perl
+ - win32/win32io.c win32/win32io.h
+____________________________________________________________________________
+[ 242] By: gsar on 1997/11/12 07:40:54
+ Log: Egregious IOsubsystem code excised. Phew, what a relief! Two
+ files (win32/win32io.[ch]) completely removed, as are all traces
+ of them in makefiles and MANIFEST. RunPerl() retains the void* arg
+ for later. Various myfoo() things regularized to my_foo(). CPP not
+ required anymore to create a perl binary :)
+ Branch: win32/perl
+ ! MANIFEST win32/Makefile win32/makedef.pl win32/makefile.mk
+ ! win32/perllib.c win32/runperl.c win32/win32.c win32/win32.h
+ ! win32/win32io.c win32/win32io.h win32/win32iop.h
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 241] By: gsar on 1997/11/12 05:31:28
+ Log: Fix various win32 code blemishes:
+ - s/stolen/win32/g
+ - s/(CROAK|WARN)/lc($1)/eg
+ - remove deadcode from most places
+ Branch: win32/perl
+ ! win32/makedef.pl win32/win32.c win32/win32io.c
+ ! win32/win32iop.h
+____________________________________________________________________________
+[ 240] By: gsar on 1997/11/12 04:36:29
+ Log: Carry over changes in ansiperl branch. Win32 branch is now
+ the leading edge.
+ Branch: win32/perl
+ ! embed.h global.sym perl.c win32/win32thread.c
+ ! win32/win32thread.h
+____________________________________________________________________________
+[ 239] By: gsar on 1997/11/12 03:39:57
+ Log: Add missing win32_closesocket() and export it (extension writers' complaint).
+ Branch: win32/perl
+ ! win32/include/sys/socket.h win32/makedef.pl win32/win32sck.c
+____________________________________________________________________________
+[ 238] By: gsar on 1997/11/12 03:25:17
+ Log: Clean up win32/win32sck.c (runtime load of Winsock now gone, it can be
+ done cleaner, if really needed (perhaps only for efficiency reasons?)).
+ Redundant EXTERN_C definitions and related warnings fixed.
+ Branch: win32/perl
+ ! miniperlmain.c perl.h win32/perllib.c win32/win32io.c
+ ! win32/win32iop.h win32/win32sck.c
+____________________________________________________________________________
+[ 237] By: nick on 1997/11/12 02:45:15
+ Log: Fixup Win32
+ - #undef start_env before re-#defining it
+ - change pp_specific pp_threadsv in global.sym
+ - re-build embed.h
+ - avoid HAVE_THREAD_INTERN - we don't and empty struct
+ is a pain. If we did have it it would contain cached
+ values of things we can only get at _IN_ the thread
+ so new_struct_thread is wrong place to call it.
+ - add new macro SET_THREAD_SELF - we must (in main thread)
+ define in win32thread.h, support in win32thread.c,
+ test and call in perl.c
+ Branch: ansiperl
+ ! embed.h global.sym perl.c thread.h win32/win32thread.c
+ ! win32/win32thread.h
+____________________________________________________________________________
+[ 236] By: nick on 1997/11/12 01:54:23
+ Log: Integrate mainline after it integrated us.
+ Accepted 'theirs' everywhere - so two branches should
+ now point to same files again.
+ Almost all of these were what was suggested, others were
+ whitespace diffs. A few dubious spots which we will now
+ go fix.
+ Branch: ansiperl
+ !> embed.h ext/DB_File/DB_File.xs ext/GDBM_File/GDBM_File.xs
+ !> ext/Opcode/Opcode.pm ext/Thread/Thread.xs interp.sym mg.c op.c
+ !> opcode.h opcode.pl perl.c perl.h pp.c pp_ctl.c pp_sys.c t/TEST
+ !> t/lib/safe2.t t/lib/thread.t t/op/nothread.t thread.h toke.c
+ !> util.c
+____________________________________________________________________________
+[ 235] By: gsar on 1997/11/12 01:22:26
+ Log: Minor tweaks to add a thread_intern struct that should ultimately
+ contain all the win32-specific statics.
+ Win32 branch now passes all tests with or w/o USE_THREADS.
+ Branch: win32/perl
+ ! embed.h perl.c win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 234] By: gsar on 1997/11/11 23:08:54
+ Log: Initial (untested) integration of mainline changes.
+ Branch: win32/perl
+ - configure
+ !> (integrate 89 files)
+____________________________________________________________________________
+[ 233] By: mbeattie on 1997/11/11 18:07:30
+ Log: Typo in thread.h: ADD_THREAD_INTERN should be HAVE_THREAD_INTERN
+ Branch: perl
+ ! thread.h
+____________________________________________________________________________
+[ 232] By: mbeattie on 1997/11/11 17:49:12
+ Log: t/TEST (reverted to @229 version) should have been included in the
+ previous change (231) but my way of recovering it didn't work
+ properly. The change 231 comments about successful tests applies
+ to this t/TEST (i.e. as of this change).
+ Branch: perl
+ ! t/TEST
+____________________________________________________________________________
+[ 231] By: mbeattie on 1997/11/11 17:46:59
+ Log: Fix up ansiperl integration. Back to passing all expected tests
+ with usethreads. Untested with non-threaded perl.
+ Branch: perl
+ ! embed.h ext/DB_File/DB_File.xs ext/GDBM_File/GDBM_File.xs
+ ! perl.c perl.h pp.c t/lib/thread.t t/op/nothread.t util.c
+____________________________________________________________________________
+[ 230] By: mbeattie on 1997/11/11 16:36:22
+ Log: Initial integration of ansi branch into mainline (untested).
+ Branch: perl
+ +> t/lib/thread.t t/op/nothread.t thread.sym
+ - configure
+ !> (integrate 84 files)
+____________________________________________________________________________
+[ 229] By: mbeattie on 1997/11/11 15:20:43
+ Log: Change name of OP_SPECIFIC to OP_THREADSV. Fixed perl_get_sv when
+ getting per-thread magicals. Fixed thr->errsv initialisation.
+ Branch: perl
+ ! ext/Opcode/Opcode.pm op.c opcode.h opcode.pl perl.c pp.c
+ ! t/lib/safe2.t toke.c
+____________________________________________________________________________
+[ 228] By: mbeattie on 1997/11/11 12:48:26
+ Log: Fix up $@ (ERRSV now refers to GvSV(errgv) for non-threaded perl and
+ thr->errsv for threaded perl). Fix pp_tie and pp_dbmopen to use
+ GvCV(gv) instead of gv so AUTOLOAD stuff works. All tests now pass
+ again for non-threaded perl. Enhanced perl_get_sv to return
+ per-thread magicals where necessary for threaded perl.
+ Branch: perl
+ ! embed.h ext/Thread/Thread.xs interp.sym mg.c op.c perl.c
+ ! perl.h pp_ctl.c pp_sys.c thread.h toke.c util.c
+____________________________________________________________________________
+[ 227] By: mbeattie on 1997/11/11 11:00:02
+ Log: hashlock bug.
+
+ Jobs fixed ...
+
+ hashlock fixed on 1997/11/11 by mbeattie@localhost
+
+ Subject: [perl5.004_53; patch] Another hash-locking fix
+ Date: 23 Oct 1997 14:13:55 -0400
+ From: Owen Taylor <owt1@cornell.edu>
+ Branch: bugs
+ + hashlock
+____________________________________________________________________________
+[ 226] By: gsar on 1997/11/11 02:11:23
+ Log: Slightly more refined lock() keyword recognition (using %INC).
+ Branch: win32/perl
+ ! toke.c
+____________________________________________________________________________
+[ 225] By: gsar on 1997/11/11 00:26:09
+ Log: "weak" lock keyword (hardcoded initial implementation) now works.
+ if not defined(&Thread::join) and defined(&__PACKAGE__::lock), 'lock'
+ is recognized as a sub, a regular keyword otherwise. Could be
+ generalized by storing a flag for every op in OP struct, and turning
+ the flag off when Thread.xs loads.
+ Branch: win32/perl
+ ! toke.c
+____________________________________________________________________________
+[ 224] By: gsar on 1997/11/10 22:59:55
+ Log: Merge a patch in preparation for "weak keywords":
+ From: Gurusamy Sarathy <gsar@engin.umich.edu>
+ Message-Id: <199710080618.CAA23899@aatma.engin.umich.edu>
+ Subject: [PATCH] global overrides for keywords
+ Date: Wed, 08 Oct 1997 02:18:23 -0400
+ Branch: win32/perl
+ ! embed.h interp.sym perl.c perl.h toke.c
+____________________________________________________________________________
+[ 223] By: gsar on 1997/11/10 22:41:31
+ Log: Remove runlevel. It was used to count how many runops() calls
+ we were in the process of executing, and longjmp() to the topmost
+ one (if not already there). We use a null top_env->je_prev
+ to distinguish that now.
+ Branch: win32/perl
+ ! embed.h interp.sym perl.h pp_ctl.c run.c thread.h util.c
+____________________________________________________________________________
+[ 222] By: gsar on 1997/11/10 04:47:48
+ Log: Win32 branch now contains all non-ansification changes in ansiperl branch.
+ USE_THREADS case builds and passes all tests using both compilers.
+ Additional tweaks:
+ - fixup win32/makedef.pl to skip more symbols for non-thread build.
+ - sync win32/Makefile with win32/makefile.mk
+ >>>Non-thread build fails a lot of tests.<<<
+ Branch: win32/perl
+ + thread.sym
+ ! MANIFEST ext/Thread/Thread.xs perl.c perl.h pp_sys.c sv.c
+ ! util.c win32/Makefile win32/config.bc win32/config_H.bc
+ ! win32/makedef.pl win32/makefile.mk
+____________________________________________________________________________
+[ 221] By: gsar on 1997/11/10 00:57:53
+ Log: Initial (untested) merge of all non-ansi changes on ansiperl branch
+ into win32 branch.
+ Branch: win32/perl
+ + t/lib/thread.t t/op/nothread.t
+ ! MANIFEST embed.h ext/Opcode/Opcode.pm global.sym interp.sym
+ ! perl.c proto.h sv.h t/lib/english.t t/op/misc.t thread.h
+ ! util.c win32/Makefile win32/config.bc win32/config.vc
+ ! win32/config_H.bc win32/config_H.vc win32/makedef.pl
+ ! win32/makefile.mk win32/win32.c win32/win32.h win32/win32io.c
+ ! win32/win32io.h win32/win32iop.h win32/win32sck.c
+ ! win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 220] By: gsar on 1997/11/09 22:44:41
+ Log: Integrate latest mainline into win32 branch.
+ Branch: win32/perl
+ +> win32/win32thread.c win32/win32thread.h
+ !> (integrate 39 files)
+____________________________________________________________________________
+[ 219] By: nick on 1997/11/09 21:46:06
+ Log: Conditionalize english.t,
+ Enhance times() for NT,
+ (Failed) attempt to implement alarm(),
+ Fixed config.h dependancy in makefile.mk
+ Branch: ansiperl
+ ! t/lib/english.t win32/config.bc win32/config_H.bc
+ ! win32/makefile.mk win32/win32.c
+____________________________________________________________________________
+[ 218] By: nick on 1997/11/09 15:38:00
+ Log: Dick Hardt's patch for build on Alpha
+ Branch: ansiperl
+ ! win32/Makefile
+____________________________________________________________________________
+[ 217] By: nick on 1997/11/09 03:31:20
+ Log: MakeMaker not in vofig noise fix for dmake
+ Branch: ansiperl
+ ! win32/config.bc win32/makefile.mk
+____________________________________________________________________________
+[ 216] By: nick on 1997/11/09 03:15:06
+ Log: Fix 'anydbm.t' - if the gv is passed 1st call to inherited
+ TIEHASH works, but 2nd call (after db is closed, attempt
+ to reopen) tries to AUTOLOAD TIEHASH rather than using
+ cached value.
+ Branch: ansiperl
+ ! pp_sys.c
+____________________________________________________________________________
+[ 215] By: nick on 1997/11/08 16:41:24
+ Log: Cleanup MakeMaker 'not in config' noise
+ Branch: ansiperl
+ ! win32/Makefile win32/config.vc
+____________________________________________________________________________
+[ 214] By: nick on 1997/11/08 15:07:24
+ Log: Remove 'configure' leaving configure.gnu and Configure
+ Win32 ignores case and keeps trying to update
+ repository copy of 'configure' or 'Configure' with
+ the other.
+ Branch: ansiperl
+ - configure
+ ! MANIFEST
+____________________________________________________________________________
+[ 213] By: nick on 1997/11/08 15:03:39
+ Log: Get threads working again on Win32
+ Root cause of fail was init_thread_intern() in
+ new_struct_thread() (which is called in parent thread)
+ clobbering dTHR of parent thread.
+ It is doubtfull if setting 'self' in new_struct_thread()
+ is 'right' but left in for now.
+ Branch: ansiperl
+ ! ext/Thread/Thread.xs perl.c thread.h util.c win32/Makefile
+ ! win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 212] By: nick on 1997/11/08 00:34:03
+ Log: Add :base_thread to :default in Opcode.pm
+ This allows lib/safe.t to pass when threaded.
+ It is unclear if 'lock' should be safe as it allows
+ denial of service attack, but could not figure out
+ how to add just 'specific' (sic) to :default
+ without triggering 'already tagged' warning noise.
+ Branch: ansiperl
+ ! ext/Opcode/Opcode.pm win32/makefile.mk
+____________________________________________________________________________
+[ 211] By: nick on 1997/11/07 23:59:31
+ Log: Merge changes as of 18:00 CST
+ Branch: ansiperl
+ !> op.c pp.c pp_sys.c thread.h util.c
+____________________________________________________________________________
+[ 210] By: nick on 1997/11/07 23:52:35
+ Log: Reverse integrate Malcolm's chanes into local
+ repository, then import result back into my view
+ of Malcolm's repository.
+ Builds and passes (most) tests with GNU C++/Solaris
+ and Borland C++, Win32.
+ Branch: ansiperl
+ ! doop.c embed.h ext/Thread/Thread.xs global.sym gv.c hv.c
+ ! interp.sym mg.c op.c opcode.h opcode.pl patchlevel.h perl.c
+ ! perl.h pp.c pp_ctl.c pp_sys.c proto.h sv.c sv.h taint.c
+ ! thread.h toke.c util.c win32/makefile.mk
+____________________________________________________________________________
+[ 209] By: mbeattie on 1997/11/07 18:12:36
+ Log: Change pp_tie and pp_dbmopen to use perl_call_sv instead of a
+ DIY pp_entersub (in preparation for AUTOLOAD change). dbmopen
+ not tested. ofslen now maps to thr->Tofslen in thread.h. Added
+ missing #ifdef USE_THREADS around some DEBU_L statements in die().
+ Building without USE_THREADS fails quite a lot of tests. It looks
+ as though the move to per-thread magicals must be missing some
+ #ifdef USE_THREADS.
+ Branch: perl
+ ! op.c pp.c pp_sys.c thread.h util.c
+____________________________________________________________________________
+[ 208] By: nick on 1997/11/07 01:37:28
+ Log: Raw integrate of latest perl
+ Branch: ansiperl
+ ! t/TEST
+ !> README.threads Todo.5.005 embed.h ext/Opcode/Opcode.pm
+ !> ext/Thread/Thread.xs global.sym gv.c interp.sym op.c op.h
+ !> perl.c perl.h pp.c pp_ctl.c pp_hot.c proto.h scope.h sv.h
+ !> thread.h toke.c util.c
+____________________________________________________________________________
+[ 207] By: mbeattie on 1997/11/06 14:58:00
+ Log: Update README.threads and Todo.5.005.
+ Branch: perl
+ ! README.threads Todo.5.005
+____________________________________________________________________________
+[ 206] By: mbeattie on 1997/11/06 14:37:37
+ Log: Remove #ifdef DEPRECATED stuff: newXSUB, pp_entersubr, FREE_TMPS().
+ Branch: perl
+ ! op.c pp_ctl.c proto.h scope.h
+____________________________________________________________________________
+[ 205] By: mbeattie on 1997/11/06 14:31:38
+ Log: Per-thread magicals now stored in their own thr->magicals and keyed
+ more directly. cvcache and oursv become ordinary struct thread
+ fields instead of #defined thr->Tfoo ones. SvREFCNT_inc now checks
+ for 0 again. Main thread initialisation done by new function
+ init_main_thread instead of (now fixed) new_struct_thread.
+
+ Jobs fixed ...
+
+ jmpenv fixed on 1997/11/06 by mbeattie@localhost
+
+ Subject: [perl5.004_53; patch] eval's and threads
+ Date: 23 Oct 1997 23:59:19 -0400
+ From: Owen Taylor <owt1@cornell.edu>
+ Branch: bugs
+ + jmpenv
+ Branch: perl
+ ! embed.h ext/Thread/Thread.xs global.sym gv.c op.c perl.c
+ ! pp_ctl.c pp_hot.c proto.h sv.h thread.h toke.c util.c
+____________________________________________________________________________
+[ 204] By: mbeattie on 1997/11/05 17:18:18
+ Log: Per-thread magicals mostly working (and localisable). Now getting
+ intermittent occasional "Use of uninitialized value" warnings
+ which may be due to some op flag black magic I've broken.
+ Branch: perl
+ ! embed.h ext/Opcode/Opcode.pm ext/Thread/Thread.xs gv.c
+ ! interp.sym op.c op.h perl.c perl.h pp.c thread.h toke.c util.c
+____________________________________________________________________________
+[ 203] By: nick on 1997/11/05 01:04:10
+ Log: Builds C++ Borland, MSVC++ (Win32) and GCC++ (Solaris)
+ Branch: ansiperl
+ ! XSUB.h doio.c doop.c embed.h ext/SDBM_File/sdbm/sdbm.h
+ ! ext/Thread/Thread.xs global.sym gv.c hv.c interp.sym mg.c
+ ! miniperlmain.c op.c op.h opcode.h opcode.pl patchlevel.h
+ ! perl.c perl.h pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h
+ ! sv.c sv.h taint.c thread.h toke.c util.c win32/Makefile
+ ! win32/config.vc win32/config_H.vc win32/makedef.pl
+ ! win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
+ ! win32/win32io.c win32/win32io.h win32/win32iop.h
+ ! win32/win32sck.c win32/win32thread.h
+____________________________________________________________________________
+[ 202] By: nick on 1997/11/05 00:50:27
+ Log: Compile(d) at least once with threads on win32
+ but did not work
+ Branch: ansiperl
+ ! embed.h perl.c thread.h
+____________________________________________________________________________
+[ 201] By: nick on 1997/11/05 00:32:13
+ Log: Trivial integrate
+ Branch: ansiperl
+ !> patchlevel.h
+____________________________________________________________________________
+[ 200] By: mbeattie on 1997/11/04 12:06:09
+ Log: Up patchlevel to 5.004_54 (I missed _53 for the last release).
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 199] By: nick on 1997/11/01 00:18:52
+ Log: Integrate mainline @ 18:15 CST 31 Oct 1997
+ Branch: ansiperl
+ !> doop.c embed.h ext/Thread/Thread.xs global.sym gv.c hv.c
+ !> interp.sym mg.c op.c opcode.h opcode.pl perl.c perl.h pp.c
+ !> pp_ctl.c pp_sys.c proto.h sv.c sv.h taint.c thread.h toke.c
+ !> util.c
+____________________________________________________________________________
+[ 198] By: nick on 1997/11/01 00:08:33
+ Log: win32thread.* not in MANIFEST which has muddled moving
+ back and forth between depots.
+ Branch: ansiperl
+ ! MANIFEST win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 197] By: nick on 1997/11/01 00:02:49
+ Log: Test changes
+ Branch: ansiperl
+ + t/lib/thread.t t/op/nothread.t thread.sym
+ ! MANIFEST
+____________________________________________________________________________
+[ 196] By: nick on 1997/10/31 23:54:01
+ Log: Further ANSI changes now builds and passes (most) tests
+ with gcc -x c++.
+ Branch: ansiperl
+ ! INTERN.h embed.h ext/DynaLoader/dl_dlopen.xs
+ ! ext/Fcntl/Fcntl.xs ext/GDBM_File/GDBM_File.xs ext/IO/IO.xs
+ ! ext/Opcode/Opcode.xs ext/POSIX/POSIX.xs
+ ! ext/SDBM_File/sdbm/hash.c ext/SDBM_File/sdbm/pair.c
+ ! ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
+ ! ext/SDBM_File/sdbm/util.c ext/Socket/Socket.xs
+ ! ext/Thread/Thread.xs ext/attrs/attrs.xs global.sym perl.h
+ ! perly.c sv.c t/lib/english.t t/op/misc.t thread.h util.c
+ ! win32/Makefile win32/makedef.pl win32/makefile.mk x2p/a2p.c
+ ! x2p/a2p.h x2p/a2py.c x2p/hash.c x2p/str.c x2p/util.c
+ ! x2p/walk.c
+____________________________________________________________________________
+[ 195] By: mbeattie on 1997/10/31 18:05:31
+ Log: Half way through moving per-thread magicals into per-thread fields
+ and the associated new OP_SPECIFIC and find_thread_magical stuff.
+ perl will compile but plenty of the magicals are still broken.
+ Branch: perl
+ ! doop.c embed.h ext/Thread/Thread.xs global.sym gv.c hv.c
+ ! interp.sym mg.c op.c opcode.h opcode.pl perl.c perl.h pp.c
+ ! pp_ctl.c pp_sys.c proto.h sv.c sv.h taint.c thread.h toke.c
+ ! util.c
+____________________________________________________________________________
+[ 194] By: nick on 1997/10/31 01:43:49
+ Log: Convert miniperl sources to ANSI C. Several passes of
+ GNU C's 'protoize' plus a few hand edits.
+ Will compile miniperl with gcc -x c++ (i.e. treat .c a C++ files)
+ Does not link seems gcc's C++ does not define a symbol for
+ const char foo[] = "....";
+ i.e. with empty [].
+ Branch: ansiperl
+ ! av.c deb.c doio.c doop.c dump.c gv.c hv.c malloc.c mg.c
+ ! miniperlmain.c op.c perl.c perl.h perlio.c perly.y pp.c
+ ! pp_ctl.c pp_hot.c pp_sys.c regcomp.c regexec.c run.c scope.c
+ ! sv.c taint.c toke.c universal.c util.c
+____________________________________________________________________________
+[ 193] By: nick on 1997/10/30 03:00:01
+ Log: Make the ansi branch
+ Branch: ansiperl
+ +> (branch 907 files)
+____________________________________________________________________________
+[ 192] By: nick on 1997/10/30 02:48:17
+ Log: Oneperl builds with THREADS/THISPTR Borland
+ Manualy inserted Sarathy's new COND_XXXXX from his mail.
+ Manual change if Tself -> self as was easier than resolve :-(
+ Two aTHIS's in op.c
+ Branch: oneperl
+ ! embed.h op.c thread.h thread.sym win32/makefile.mk
+ ! win32/win32thread.h
+____________________________________________________________________________
+[ 191] By: nick on 1997/10/30 01:54:50
+ Log: Raw resolve of latest sources with oneperl
+ Branch: oneperl
+ !> Todo.5.005 ext/Thread/Thread.xs fakethr.h op.c op.h opcode.h
+ !> opcode.pl perl.c thread.h win32/win32thread.c
+ !> win32/win32thread.h
+____________________________________________________________________________
+[ 190] By: mbeattie on 1997/10/29 14:39:54
+ Log: Remove global macro "self". Change thr->Tself to thr->self.
+ Branch: perl
+ ! ext/Thread/Thread.xs fakethr.h perl.c thread.h
+ ! win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 189] By: mbeattie on 1997/10/29 12:49:01
+ Log: Add to Todo: compiler with fake SvCUR in comppad_name entries.
+ Branch: perl
+ ! Todo.5.005
+____________________________________________________________________________
+[ 188] By: mbeattie on 1997/10/29 12:45:32
+ Log: Add pp_lock knowledge to compiler
+ Branch: perlext
+ ! Compiler/ccop.c Compiler/ccop.h
+____________________________________________________________________________
+[ 187] By: mbeattie on 1997/10/29 12:45:02
+ Log: Change peep() to optimise away unneeded rv2av in lval->[] and lval->{}
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 186] By: mbeattie on 1997/10/29 12:43:36
+ Log: Move compiler OP class information into opcode.pl.
+ Branch: perl
+ ! op.h opcode.h opcode.pl
+____________________________________________________________________________
+[ 185] By: nick on 1997/10/26 22:52:05
+ Log: Split failing test in op/misc.t into op/nothread.t
+ so all tests can be passed where they apply.
+ Cleanup other two cases of THREADS/THISPTR.
+ Conditional compile option for CriticalSection's on Win32
+ Branch: oneperl
+ + t/op/nothread.t
+ ! sv.h t/op/misc.t win32/Makefile win32/makedef.pl
+ ! win32/win32thread.h
+____________________________________________________________________________
+[ 184] By: nick on 1997/10/26 19:42:00
+ Log: USE_THISPTR fixes for CRIPPLED_CC (implied by threads)
+ Branch: oneperl
+ ! embed.h global.sym proto.h sv.c sv.h toke.c
+____________________________________________________________________________
+[ 183] By: nick on 1997/10/26 18:31:58
+ Log: Make USE_THREADS imply CRIPPLED_CC.
+ This avoids most of the uses of 'Sv' and hence many needs of
+ dTHR in extension code.
+ With this change Data::Dumper builds as-is
+ and Tk only needs four tweaks:
+ 1. Obscure dump-stack case which really needs dTHR
+ 2. A curcop in error-message code
+ 3. Two cases of SAVETMPS
+ 4. A curcop == &compiling which is probably not required.
+ IMHO the SAVETMPS case is only one which merits further automation.
+ Branch: oneperl
+ ! embed.h global.sym perl.h sv.c win32/Makefile win32/makedef.pl
+____________________________________________________________________________
+[ 182] By: nick on 1997/10/26 16:31:58
+ Log: Change dSP to imply dTHR for extension source compatibility
+ introduce djSP (Declare Just SP) for use in perl sources
+ and thread-aware extensions. Use latter.
+ Branch: oneperl
+ ! XSUB.h doio.c doop.c ext/Thread/Thread.xs gv.c mg.c perl.c
+ ! pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c sv.c
+____________________________________________________________________________
+[ 181] By: nick on 1997/10/26 00:39:57
+ Log: More tests
+ Branch: oneperl
+ ! t/lib/thread.t
+____________________________________________________________________________
+[ 180] By: nick on 1997/10/25 22:18:27
+ Log: Use return of THREAD_CREATE() - add basic thread test
+ Branch: oneperl
+ + t/lib/thread.t
+ ! ext/Thread/Thread.xs
+____________________________________________________________________________
+[ 179] By: nick on 1997/10/25 21:25:23
+ Log: Builds with no thread/this
+ Branch: oneperl
+ ! ext/Thread/Thread.xs t/lib/english.t win32/makedef.pl
+ ! win32/win32thread.c
+____________________________________________________________________________
+[ 178] By: nick on 1997/10/25 18:28:03
+ Log: Cleanup dead #ifdef branch introduced by scruffy merging.
+ Branch: oneperl
+ ! perl.c
+____________________________________________________________________________
+[ 177] By: nick on 1997/10/25 18:11:33
+ Log: Basic integrate of oneperl with threads, passes
+ tests THISPTR+THREADs - win32/win32thread.* needed
+ changes (where did they come from)?
+ Branch: oneperl
+ ! embed.h ext/Thread/Thread.xs perl.h thread.h win32/Makefile
+ ! win32/makedef.pl win32/win32thread.c win32/win32thread.h
+____________________________________________________________________________
+[ 176] By: nick on 1997/10/25 17:05:52
+ Log: Onepel builds THISPTR no threads
+ Branch: oneperl
+ ! ext/Thread/Thread.xs thread.h win32/makedef.pl
+____________________________________________________________________________
+[ 175] By: nick on 1997/10/25 16:40:10
+ Log: Integrate oneperl with new style JOIN etc. macros
+ Branch: oneperl
+ +> win32/win32thread.c win32/win32thread.h
+ !> Todo.5.005 ext/POSIX/POSIX.xs ext/Thread/Thread.xs fakethr.h
+ !> global.sym gv.c hv.c mg.c op.c opcode.h opcode.pl perl.c
+ !> perl.h pp.c pp_hot.c sv.h thread.h vms/descrip.mms
+ !> vms/gen_shrfls.pl vms/vms.c vms/vmsish.h win32/Makefile
+ !> win32/makefile.mk
+____________________________________________________________________________
+[ 174] By: mbeattie on 1997/10/24 17:14:00
+ Log: Remove xcv_condp CV field which is no longer used.
+ Branch: perl
+ ! sv.h
+____________________________________________________________________________
+[ 173] By: mbeattie on 1997/10/24 14:36:09
+ Log: Patches for VMS [Dan Sugalski]
+ Branch: bugs
+ + vms2
+ Branch: perl
+ ! ext/POSIX/POSIX.xs vms/descrip.mms vms/gen_shrfls.pl vms/vms.c
+ ! vms/vmsish.h
+____________________________________________________________________________
+[ 172] By: mbeattie on 1997/10/24 13:50:59
+ Log: Improve internal threading API. Introduce win32/win32thread.[ch]
+ to use new API and patch win32 makefile stuff a little.
+ Branch: perl
+ + win32/win32thread.c win32/win32thread.h
+ ! Todo.5.005 ext/Thread/Thread.xs fakethr.h global.sym gv.c hv.c
+ ! perl.c perl.h thread.h win32/Makefile win32/makefile.mk
+____________________________________________________________________________
+[ 171] By: mbeattie on 1997/10/23 14:00:27
+ Log: Fix pp_hot.c:get_db_sub core dump when perl debugger used.
+
+ Jobs fixed ...
+
+ get_db_sub fixed on 1997/10/23 by mbeattie@squash
+
+ Subject: [perl5.004_53] Debugger crash (patch)
+ Date: Thu, 16 Oct 1997 22:03:09 -0400
+ From: Owen Taylor <owt1@cornell.edu>
+ Branch: bugs
+ + get_db_sub
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 170] By: mbeattie on 1997/10/23 09:22:40
+ Log: Fix refcounts for lock/magic_mutexfree. Make OP_LOCK auto-ref
+ its argument using ck_rfun as OP_DEFINED. Make pp_lock return
+ a ref to its argument for AV, HV, CV.
+ Branch: perl
+ ! mg.c op.c opcode.h opcode.pl pp.c pp_hot.c
+____________________________________________________________________________
+[ 169] By: gsar on 1997/10/21 03:49:25
+ Log: With these fixes, oneperl builds THISPTR && THREADS under both win32 compilers:
+ - Fixup static functions that were missing aTHIS.
+ - s/extern/EXT/ in dTHR macro, or Borland CC croaks.
+ - Removed static functions from global.sym.
+ - Typo in perl.h.
+ - Additions to makefile.mk.
+ Branch: oneperl
+ ! embed.h embed.pl global.sym op.c perl.h pp_ctl.c toke.c
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 168] By: nick on 1997/10/20 02:47:18
+ Log: Passes expected tests with -DUSE_THREADS with/without -DUSE_THISPTR
+ Branch: oneperl
+ ! embed.h ext/Thread/Thread.xs mg.c pp.c pp_hot.c proto.h
+ ! scope.h thread.h
+____________________________________________________________________________
+[ 167] By: nick on 1997/10/20 01:03:00
+ Log: Add missing aTHIS in cast
+ Branch: oneperl
+ ! win32/dl_win32.xs
+____________________________________________________________________________
+[ 166] By: nick on 1997/10/20 00:44:42
+ Log: Builds and passes test with -DUSE_THISPTR
+ Branch: oneperl
+ ! ext/Thread/Thread.xs win32/Makefile win32/makedef.pl
+ ! win32/perllib.c
+____________________________________________________________________________
+[ 165] By: nick on 1997/10/19 21:45:36
+ Log: Oneperl runs miniperl with THISPTR (Win32 threading patch included)
+ Branch: oneperl
+ ! embed.h ext/Thread/Thread.xs global.sym interp.sym perl.c
+ ! perl.h t/TEST thread.h win32/Makefile win32/makedef.pl
+ ! win32/makefile.mk win32/perllib.c
+____________________________________________________________________________
+[ 164] By: nick on 1997/10/19 20:09:13
+ Log: oneperl compiles (but fails) with -DUSE_THISPTR
+ Branch: oneperl
+ ! av.c embed.h mg.c perl.c perl.h pp.c pp_ctl.c pp_hot.c
+ ! pp_sys.c proto.h regexec.c sv.c thread.h thread.sym util.c
+ ! win32/win32.c win32/win32.h
+____________________________________________________________________________
+[ 163] By: nick on 1997/10/19 16:46:09
+ Log: Builds on NT4 without THISPTR or THREADS, passes all tests
+ Branch: oneperl
+ ! embed.h perl.h thread.h vars.h
+____________________________________________________________________________
+[ 162] By: nick on 1997/10/19 14:42:16
+ Log: Dubious merge of oneperl's variable and struct thread
+ Branch: oneperl
+ !> perl.h thread.h
+____________________________________________________________________________
+[ 161] By: nick on 1997/10/18 18:05:13
+ Log: integrate all but perl.h/thread.h
+ Branch: oneperl
+ +> Todo.5.005 perlio.sym
+ !> (integrate 98 files)
+____________________________________________________________________________
+[ 160] By: nick on 1997/10/18 03:49:27
+ Log: Integrate rest of sub-dirs into oneperl
+ Branch: oneperl
+ +> ext/Thread/Makefile.PL ext/Thread/Notes ext/Thread/README
+ +> ext/Thread/Thread.pm ext/Thread/Thread.xs
+ +> ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
+ +> ext/Thread/create.t ext/Thread/io.t ext/Thread/join.t
+ +> ext/Thread/join2.t ext/Thread/list.t ext/Thread/lock.t
+ +> ext/Thread/queue.t ext/Thread/sync.t ext/Thread/sync2.t
+ +> ext/Thread/typemap ext/Thread/unsync.t ext/Thread/unsync2.t
+ +> ext/Thread/unsync3.t ext/Thread/unsync4.t hints/newsos4.sh
+ +> hints/os390.sh
+ - ext/util/extliblist
+ !> (integrate 425 files)
+____________________________________________________________________________
+[ 159] By: nick on 1997/10/18 03:20:11
+ Log: Integrate (accept) t and win32 into oneperl
+ Branch: oneperl
+ +> t/lib/dosglob.t win32/bin/pl2bat.pl win32/bin/runperl.pl
+ +> win32/bin/search.pl win32/bin/webget.pl win32/config.bc
+ +> win32/config.vc win32/config_H.bc win32/config_H.vc
+ +> win32/makefile.mk
+ !> (integrate 188 files)
+____________________________________________________________________________
+[ 158] By: nick on 1997/10/18 03:12:59
+ Log: Integrate lib/... into oneperl
+ Branch: oneperl
+ +> lib/File/DosGlob.pm lib/base.pm lib/chat2.pl
+ !> (integrate 138 files)
+____________________________________________________________________________
+[ 157] By: nick on 1997/10/18 02:55:53
+ Log: Make lib/Bundle/CPAN.pm text in oneperl too.
+ Branch: oneperl
+ ! lib/Bundle/CPAN.pm
+____________________________________________________________________________
+[ 156] By: nick on 1997/10/18 02:52:44
+ Log: Make lib/Bundle/CPAN.pm a text file
+ Branch: perl
+ ! lib/Bundle/CPAN.pm
+____________________________________________________________________________
+[ 155] By: nick on 1997/10/18 02:33:02
+ Log: Some weirdness in the intgrate process
+ Branch: oneperl
+ - win32/bin/pl2bat.bat win32/bin/search.bat win32/bin/test.bat
+ - win32/bin/webget.bat win32/config.H win32/config.w32
+____________________________________________________________________________
+[ 153] By: nick on 1997/10/18 02:29:16
+ Log: Let us try all the pure integrate stuff
+ Branch: oneperl
+ !> (integrate 647 files)
+____________________________________________________________________________
+[ 152] By: nick on 1997/10/18 02:13:35
+ Log: Get more sub directories out of the way.
+ Branch: oneperl
+ !> (integrate 92 files)
+____________________________________________________________________________
+[ 151] By: nick on 1997/10/18 02:05:41
+ Log: Integrate hints
+ Branch: oneperl
+ !> (integrate 68 files)
+____________________________________________________________________________
+[ 150] By: nick on 1997/10/18 01:57:20
+ Log: Try reopening some non-contravertial files
+ Branch: oneperl
+ !> x2p/EXTERN.h x2p/INTERN.h x2p/Makefile.SH x2p/a2p.c x2p/a2p.h
+ !> x2p/a2p.pod x2p/a2p.y x2p/a2py.c x2p/cflags.SH
+ !> x2p/find2perl.PL x2p/hash.c x2p/hash.h x2p/proto.h x2p/s2p.PL
+ !> x2p/str.c x2p/str.h x2p/util.c x2p/util.h x2p/walk.c
+____________________________________________________________________________
+[ 144] By: gsar on 1997/10/16 22:26:07
+ Log: Merge changes to Thread and add makefile fixups to accomodate Thread
+ build. Once again, builds and runs all Thread tests using either
+ compiler.
+ Branch: win32/perl
+ ! embed.h ext/Thread/Thread.xs interp.sym perl.c win32/Makefile
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 143] By: gsar on 1997/10/16 20:45:58
+ Log: A quick merge of latest mainline.
+ Branch: win32/perl
+ +> ext/Thread/Makefile.PL ext/Thread/Notes ext/Thread/README
+ +> ext/Thread/Thread.pm ext/Thread/Thread.xs
+ +> ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
+ +> ext/Thread/create.t ext/Thread/io.t ext/Thread/join.t
+ +> ext/Thread/join2.t ext/Thread/list.t ext/Thread/lock.t
+ +> ext/Thread/queue.t ext/Thread/sync.t ext/Thread/sync2.t
+ +> ext/Thread/typemap ext/Thread/unsync.t ext/Thread/unsync2.t
+ +> ext/Thread/unsync3.t ext/Thread/unsync4.t hints/os390.sh
+ +> lib/base.pm t/lib/dosglob.t
+ - ext/util/extliblist
+ !> (integrate 134 files)
+
+----------------
+Version 5.004_53
+----------------
+
+____________________________________________________________________________
+[ 142] By: mbeattie on 1997/10/16 16:52:55
+ Log: Add newly moved perl/ext/Thread/... files to MANIFEST.
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 141] By: mbeattie on 1997/10/16 16:42:13
+ Log: Move perlext/Thread into perl/ext/Thread.
+ Branch: perl
+ +> ext/Thread/Makefile.PL ext/Thread/Notes ext/Thread/README
+ +> ext/Thread/Thread.pm ext/Thread/Thread.xs
+ +> ext/Thread/Thread/Queue.pm ext/Thread/Thread/Semaphore.pm
+ +> ext/Thread/create.t ext/Thread/io.t ext/Thread/join.t
+ +> ext/Thread/join2.t ext/Thread/list.t ext/Thread/lock.t
+ +> ext/Thread/queue.t ext/Thread/sync.t ext/Thread/sync2.t
+ +> ext/Thread/typemap ext/Thread/unsync.t ext/Thread/unsync2.t
+ +> ext/Thread/unsync3.t ext/Thread/unsync4.t
+ ! Configure
+ Branch: perlext
+ - Thread/Makefile.PL Thread/Notes Thread/README Thread/Thread.pm
+ - Thread/Thread.xs Thread/Thread/Queue.pm
+ - Thread/Thread/Semaphore.pm Thread/create.t Thread/io.t
+ - Thread/join.t Thread/join2.t Thread/list.t Thread/lock.t
+ - Thread/queue.t Thread/sync.t Thread/sync2.t Thread/typemap
+ - Thread/unsync.t Thread/unsync2.t Thread/unsync3.t
+ - Thread/unsync4.t
+____________________________________________________________________________
+[ 140] By: mbeattie on 1997/10/16 16:26:53
+ Log: Correct threads_mutex locking in main thread destruction.
+ Add per-interp thrsv to hold SV struct thread for main thread.
+ Move Thread.xs MUTEX_DESTROY from end of threadstart to remove_thread.
+ Add Thread/list.t test of Thread->list method.
+ Let Thread::Semaphore methods up and down take an extra argument.
+ Branch: perl
+ ! embed.h interp.sym perl.c perl.h thread.h
+ Branch: perlext
+ + Thread/list.t
+ ! Thread/Thread.xs Thread/Thread/Semaphore.pm
+____________________________________________________________________________
+[ 139] By: mbeattie on 1997/10/16 14:01:11
+ Log: Fix up merge with 5.004_04.
+ Branch: perl
+ ! op.c perl.c t/lib/dosglob.t
+____________________________________________________________________________
+[ 138] By: TimBunce on 1997/10/16 12:58:22
+ Log: Fix-up PerForce type for t/lib/dosglob.t from text to xtext
+ Branch: maint-5.004/perl
+ ! t/lib/dosglob.t
+____________________________________________________________________________
+[ 137] By: mbeattie on 1997/10/16 11:09:25
+ Log: Merge maint-5.004 branch (5.004_04) with mainline.
+ Branch: perl
+ +> hints/os390.sh lib/base.pm t/lib/dosglob.t
+ - ext/util/extliblist
+ !> (integrate 132 files)
+____________________________________________________________________________
+[ 135] By: gsar on 1997/10/15 21:46:05
+ Log: Win32 changes over 5.004_52:
+ - rearranged MUTEX_LOCK()s in perl_destroy so that we don't call it
+ on an already locked mutex.
+ - other minor tweaks.
+ Now builds and runs win32-version of Thread_52, passing all tests.
+ Branch: win32/perl
+ ! perl.c proto.h thread.h
+____________________________________________________________________________
+[ 134] By: gsar on 1997/10/15 18:19:31
+ Log: fixup makefile.mk conflict.
+ Branch: win32/perl
+ ! win32/makefile.mk
+____________________________________________________________________________
+[ 133] By: gsar on 1997/10/15 18:02:46
+ Log: Integrated latest changes from mainline into win32.
+ Branch: win32/perl
+ +> fakethr.h
+ !> MANIFEST Porting/makerel Porting/patchls README.threads
+ !> Todo.5.005 perl.c pp_hot.c thread.h util.c win32/config.bc
+ !> win32/config.vc win32/config_H.bc win32/config_H.vc
+ !> win32/makefile.mk
+
+----------------
+Version 5.004_52
+----------------
+
+____________________________________________________________________________
+[ 132] By: mbeattie on 1997/10/15 17:02:38
+ Log: Remove out-of-date test Thread/cond.t.
+ Branch: perlext
+ - Thread/cond.t
+____________________________________________________________________________
+[ 131] By: mbeattie on 1997/10/15 16:57:45
+ Log: Finish thread state machine: fixes global destruction of threads,
+ detaching, joining etc. Alter FAKE_THREADS-specific fields to use
+ new HAVE_THREAD_INTERN stuff. Updates docs. Various fixes to
+ Thread.xs.
+ Branch: perl
+ ! MANIFEST README.threads Todo.5.005 perl.c util.c
+ Branch: perlext
+ ! Thread/Thread.xs Thread/queue.t
+____________________________________________________________________________
+[ 130] By: mbeattie on 1997/10/15 16:55:10
+ Log: Add HAVE_THREAD_INTERN for platform-dependent struct thread additions.
+ Fix ThrSETSTATE not to lock t->mutex itself.
+ Branch: perl
+ ! fakethr.h thread.h
+____________________________________________________________________________
+[ 129] By: mbeattie on 1997/10/15 16:53:35
+ Log: Remove stale code from pp_entersub which breaks sub ownership locks.
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 128] By: TimBunce on 1997/10/15 15:55:26
+ Log: Maintenance 5.004_04 changes
+ Branch: maint-5.004/perl
+ + hints/os390.sh lib/base.pm t/lib/dosglob.t
+ - ext/util/extliblist
+ ! Changes Configure INSTALL MANIFEST Makefile.SH Porting/makerel
+ ! Porting/patchls Porting/pumpkin.pod README.vms av.c configpm
+ ! doop.c eg/sysvipc/ipcsem emacs/cperl-mode.el embed.h
+ ! ext/DynaLoader/DynaLoader.pm ext/IO/lib/IO/Socket.pm
+ ! ext/util/make_ext global.sym gv.c hints/bsdos.sh
+ ! hints/dec_osf.sh hints/dynixptx.sh hints/irix_6.sh
+ ! hints/linux.sh hints/machten.sh hints/os2.sh hints/qnx.sh hv.c
+ ! installperl lib/AutoLoader.pm lib/CPAN.pm
+ ! lib/CPAN/FirstTime.pm lib/Carp.pm lib/Cwd.pm lib/English.pm
+ ! lib/ExtUtils/Install.pm lib/ExtUtils/Liblist.pm
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/xsubpp
+ ! lib/File/DosGlob.pm lib/File/Find.pm lib/FileHandle.pm
+ ! lib/Getopt/Long.pm lib/Getopt/Std.pm lib/Math/Complex.pm
+ ! lib/Sys/Hostname.pm lib/Sys/Syslog.pm lib/Test/Harness.pm
+ ! lib/Time/Local.pm lib/autouse.pm lib/blib.pm
+ ! lib/diagnostics.pm lib/getopt.pl lib/perl5db.pl lib/vars.pm
+ ! makedepend.SH malloc.c mg.c miniperlmain.c myconfig op.c
+ ! opcode.h os2/Changes os2/OS2/REXX/Makefile.PL
+ ! os2/OS2/REXX/REXX.pm os2/os2.c patchlevel.h perl.c perl.h
+ ! perly.c perly.fixer perly.y pod/perl.pod pod/perlapio.pod
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! pod/perlguts.pod pod/perlipc.pod pod/perlop.pod
+ ! pod/perlrun.pod pod/perlsec.pod pod/perlsub.pod
+ ! pod/perltrap.pod pod/perlvar.pod pod/perlxs.pod pp.c pp_ctl.c
+ ! pp_hot.c pp_sys.c proto.h regcomp.c regexec.c scope.c sv.c
+ ! t/TEST t/comp/proto.t t/lib/complex.t t/lib/io_sock.t
+ ! t/lib/io_udp.t t/op/glob.t t/op/method.t t/op/misc.t
+ ! t/op/ref.t t/op/runlevel.t t/op/split.t t/op/sprintf.t
+ ! t/op/subst.t t/op/taint.t t/pragma/locale.t taint.c toke.c
+ ! unixish.h util.c utils/h2ph.PL utils/h2xs.PL utils/perlbug.PL
+ ! utils/perldoc.PL vms/perly_c.vms vms/vms.c vms/vmsish.h
+ ! win32/Makefile win32/config_H.bc win32/config_H.vc
+ ! win32/makefile.mk win32/pod.mak win32/win32.c win32/win32io.c
+ ! win32/win32sck.c x2p/Makefile.SH x2p/util.c
+____________________________________________________________________________
+[ 127] By: mbeattie on 1997/10/15 10:00:18
+ Log: Added fakethr.h.
+ Branch: perl
+ + fakethr.h
+____________________________________________________________________________
+[ 126] By: mbeattie on 1997/10/15 09:50:57
+ Log: pthread_condattr_init in thread.h for OLD_PTHREADS_API.
+ Branch: perl
+ ! thread.h
+____________________________________________________________________________
+[ 125] By: mbeattie on 1997/10/15 09:09:24
+ Log: Started rewriting thread state machine.
+ Branch: perl
+ ! perl.c thread.h
+ Branch: perlext
+ ! Thread/Thread.xs
+____________________________________________________________________________
+[ 124] By: gsar on 1997/10/14 00:23:15
+ Log: Remove spurious extra MUTEX_LOCK in pp_entersub(). Now builds and passes
+ tests in win32 version of latest perlext/Thread.
+ Branch: win32/perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 123] By: gsar on 1997/10/13 23:18:38
+ Log: Initial merge of win32 threads patch.
+ Branch: win32/perl
+ ! embed.h global.sym interp.sym perl.c perl.h pp_hot.c thread.h
+ ! win32/Makefile win32/makedef.pl win32/makefile.mk
+ ! win32/perllib.c win32/pod.mak win32/win32.h
+____________________________________________________________________________
+[ 122] By: gsar on 1997/10/10 20:58:40
+ Log: Integrated changes on mainline into the win32 branch. Had to set
+ P4USER=mbeattie for the resolve step (due to the presence of newly
+ branched files that had not been submitted?)
+ Branch: win32/perl
+ +> Porting/makerel Porting/patchls README.threads Todo.5.005
+ +> ext/attrs/Makefile.PL ext/attrs/attrs.pm ext/attrs/attrs.xs
+ +> hints/newsos4.sh lib/File/DosGlob.pm lib/chat2.pl perlio.sym
+ +> win32/bin/pl2bat.pl win32/bin/runperl.pl win32/bin/search.pl
+ +> win32/bin/webget.pl win32/config.bc win32/config.vc
+ +> win32/config_H.bc win32/config_H.vc win32/makefile.mk
+ - win32/bin/pl2bat.bat win32/bin/search.bat win32/bin/test.bat
+ - win32/bin/webget.bat win32/config.H win32/config.w32
+ ! thread.h
+ !> (integrate 858 files)
+____________________________________________________________________________
+[ 121] By: mbeattie on 1997/10/10 17:23:41
+ Log: Tweak a few Thread tests.
+ Branch: perlext
+ + Thread/join2.t
+ ! Thread/io.t Thread/sync2.t
+____________________________________________________________________________
+[ 120] By: mbeattie on 1997/10/10 17:22:46
+ Log: Rewrite thread destruction system using linked list of threads.
+ Still not completely done. Add methods self, equal, flags, list
+ to Thread.xs. Add Thread_MAGIC_SIGNATURE check to typemap.
+ Branch: perl
+ ! perl.c perl.h thread.h
+ Branch: perlext
+ ! Thread/Thread.xs Thread/typemap
+____________________________________________________________________________
+[ 119] By: mbeattie on 1997/10/10 17:19:55
+ Log: Fix up locking/synchronisation for pp_entersub.
+ Branch: perl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 118] By: mbeattie on 1997/10/10 09:55:32
+ Log: Put back entries in MANIFEST for the four now-returned win32/* files
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 117] By: mbeattie on 1997/10/10 08:12:23
+ Log: Took out mystack_foo for good, fixed up interp.sym and win32/makedef.pl
+ Branch: perl
+ ! Todo.5.005 embed.h interp.sym perl.h win32/makedef.pl
+____________________________________________________________________________
+[ 116] By: mbeattie on 1997/10/08 15:41:08
+ Log: Add missing sig_pipe definition to Thread.xs.
+ Branch: perlext
+ ! Thread/Thread.xs
+____________________________________________________________________________
+[ 115] By: mbeattie on 1997/10/08 15:40:46
+ Log: Fix up 5.004_03 merge: remove missing win32 files from MANIFEST,
+ add missing dTHR; to new function unwind_handler_stack() in mg.c
+ and bump patchlevel.h to 5.004_52.
+ Branch: perl
+ ! MANIFEST mg.c patchlevel.h
+____________________________________________________________________________
+[ 114] By: mbeattie on 1997/10/08 10:19:27
+ Log: Merge maint-5.004 branch (5.004_03) with mainline.
+ MANIFEST is out of sync.
+ Branch: perl
+ +> win32/bin/pl2bat.pl win32/bin/runperl.pl win32/bin/search.pl
+ +> win32/bin/webget.pl
+ - win32/bin/pl2bat.bat win32/bin/search.bat win32/bin/test.bat
+ - win32/bin/webget.bat
+ !> (integrate 168 files)
+____________________________________________________________________________
+[ 113] By: mbeattie on 1997/10/05 17:52:49
+ Log: Move init of global mutexes/cond vars earlier.
+ Branch: perl
+ ! perl.c
+____________________________________________________________________________
+[ 112] By: nick on 1997/10/04 15:25:28
+ Log: Add perl.sym to MANIFEST
+ Branch: oneperl
+ ! MANIFEST
+____________________________________________________________________________
+[ 111] By: nick on 1997/10/04 15:23:37
+ Log: Missing file
+ Branch: oneperl
+ + perl.sym
+____________________________________________________________________________
+[ 110] By: nick on 1997/10/04 13:04:26
+ Log: Now builds the extensions as well
+ Passes all tests
+ Branch: oneperl
+ ! XSUB.h embed.pl ext/DynaLoader/dlutils.c ext/Opcode/Opcode.xs
+ ! mg.c op.c perl.c pp_ctl.c pp_hot.c pp_sys.c proto.h sv.c
+ ! toke.c util.c writemain.SH
+____________________________________________________________________________
+[ 109] By: nick on 1997/10/04 12:02:14
+ Log: Odd checkin issue
+ Branch: oneperl
+ ! dump.c global.sym gv.c hv.c malloc.c mg.c op.c opcode.h perl.c
+ ! perly.c perly.c.diff perly.h perly.y pp.c pp_hot.c pp_sys.c
+ ! proto.h scope.c sv.c toke.c universal.c util.c vms/perly_c.vms
+ ! vms/perly_h.vms writemain.SH
+____________________________________________________________________________
+[ 108] By: nick on 1997/10/04 11:12:52
+ Log: Added lots of (missing) prototypes (ckprotos is util to check)
+ Fixed missing aTHIS flagged by above.
+ -DUSE_THISPTR passes minitest!
+ Branch: oneperl
+ + ckprotos
+ ! dump.c global.sym gv.c hv.c malloc.c mg.c op.c opcode.h perl.c
+ ! perly.c perly.c.diff perly.h perly.y pp.c pp_hot.c pp_sys.c
+ ! proto.h scope.c sv.c toke.c universal.c util.c vms/perly_c.vms
+ ! vms/perly_h.vms
+____________________________________________________________________________
+[ 107] By: nick on 1997/10/03 22:36:52
+ Log: .y muddle fixup - will get this sorted oneday ...
+ Branch: oneperl
+ ! miniperlmain.c perly.c perly.c.diff perly.h vms/perly_c.vms
+ ! vms/perly_h.vms
+____________________________________________________________________________
+[ 106] By: mbeattie on 1997/10/03 17:12:33
+ Log: Remove last traces of "tokenbuf as temp buffer" and removed it
+ from struct thread. Added missing thr->Tfoo defines for statbuf
+ and timesbuf and removed unused Tbuf field.
+ Branch: perl
+ ! doio.c mg.c perl.c pp_sys.c sv.c thread.h
+____________________________________________________________________________
+[ 105] By: nick on 1997/10/03 15:56:50
+ Log: dTHIS -> hasTHIS, dTHR -> dTHR; builds without THISPTR with/without USE_THREADS
+ Branch: oneperl
+ ! XSUB.h av.c deb.c doio.c doop.c dump.c embed.pl global.sym
+ ! gv.c hv.c mg.c op.c perl.c perl.h perlio.c perly.c pp.c pp.h
+ ! pp_ctl.c pp_hot.c pp_sys.c regcomp.c regexec.c run.c scope.c
+ ! sv.c taint.c thread.h toke.c universal.c util.c
+____________________________________________________________________________
+[ 104] By: mbeattie on 1997/10/03 15:23:25
+ Log: Back out sv_bless3 change which made pp_bless zap '~'-magic.
+ Branch: perl
+ ! global.sym pp.c proto.h sv.c
+____________________________________________________________________________
+[ 103] By: mbeattie on 1997/10/03 15:17:39
+ Log: Fixed sv_mutex locking for new_SV, del_SV and nice_chunks.
+ Branch: perl
+ ! av.c hv.c perl.h sv.c
+____________________________________________________________________________
+[ 102] By: mbeattie on 1997/10/03 11:53:51
+ Log: Reliable thread signal handling.
+ Branch: perl
+ ! global.sym mg.c perl.c perl.h
+ Branch: perlext
+ ! Thread/Thread.xs
+____________________________________________________________________________
+[ 101] By: nick on 1997/10/02 20:43:17
+ Log: Cleanup perly.y stuff
+ Branch: oneperl
+ ! embed.h perly.c perly.c.diff vms/perly_c.vms vms/perly_h.vms
+____________________________________________________________________________
+[ 100] By: nick on 1997/10/02 18:54:08
+ Log: Compiles with less invasive aTHIS adding
+ Branch: oneperl
+ + nothis.sym
+ ! MANIFEST XSUB.h av.c cop.h deb.c doio.c doop.c dump.c embed.h
+ ! embed.pl global.sym gv.c gv.h handy.h hv.c hv.h mg.c op.c op.h
+ ! opcode.h perl.c perl.h perlio.c perlsdio.h perly.c
+ ! perly.c.diff perly.y pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c
+ ! proto.h regcomp.c regcomp.h regexec.c run.c scope.c scope.h
+ ! sv.c sv.h t/op/sort.t taint.c thread.h toke.c universal.c
+ ! util.c vars.h
+
+----------------
+Version 5.004_51
+----------------
+
+____________________________________________________________________________
+[ 99] By: mbeattie on 1997/10/02 17:23:48
+ Log: Added Thread/queue.t.
+ Branch: perlext
+ + Thread/queue.t
+____________________________________________________________________________
+[ 98] By: mbeattie on 1997/10/02 17:19:44
+ Log: Bumped patchlevel to 51. Updated Todo.5.005.
+ Branch: perl
+ ! Todo.5.005 patchlevel.h
+____________________________________________________________________________
+[ 97] By: mbeattie on 1997/10/02 17:07:47
+ Log: Update README.threads amd Thread/README
+ Branch: perl
+ ! README.threads
+ Branch: perlext
+ ! Thread/README
+____________________________________________________________________________
+[ 96] By: mbeattie on 1997/10/02 16:58:47
+ Log: Configure -Dusethreads hints for dec_osf and solaris_2 and
+ fix sv_bless3 prototype.
+ Branch: perl
+ ! hints/dec_osf.sh hints/solaris_2.sh sv.c
+____________________________________________________________________________
+[ 95] By: mbeattie on 1997/10/02 16:50:21
+ Log: Fixed broken typemap for Thread.
+ Branch: perlext
+ ! Thread/typemap
+____________________________________________________________________________
+[ 94] By: mbeattie on 1997/10/02 16:34:03
+ Log: Fix pod text in Lint.pm for private-names option.
+ Branch: perlext
+ ! Compiler/B/Lint.pm
+____________________________________________________________________________
+[ 93] By: mbeattie on 1997/10/02 13:44:46
+ Log: Add Todo.5.005 to MANIFEST and submit remade embed.h.
+ Branch: perl
+ ! MANIFEST embed.h
+____________________________________________________________________________
+[ 92] By: mbeattie on 1997/10/02 13:27:10
+ Log: Add Todo.5.005
+ Branch: perl
+ + Todo.5.005
+____________________________________________________________________________
+[ 91] By: nick on 1997/10/01 20:23:38
+ Log: Raw _T# trial
+ Branch: oneperl
+ ! embed.h embed.pl proto.h sv.c
+____________________________________________________________________________
+[ 90] By: nick on 1997/10/01 18:22:03
+ Log: THIS + new sort stuff
+ Branch: oneperl
+ ! miniperlmain.c perl.c pp_ctl.c proto.h util.c
+____________________________________________________________________________
+[ 89] By: nick on 1997/10/01 18:03:05
+ Log: qsort cleanup - now tailored to perl's use and 'this' aware.
+ Branch: oneperl
+ ! pp_ctl.c proto.h util.c
+____________________________________________________________________________
+[ 88] By: mbeattie on 1997/10/01 17:04:12
+ Log: Start of Configure support for -Dusethreads plus associated
+ Linux hints.
+ Branch: perl
+ ! Configure hints/linux.sh
+____________________________________________________________________________
+[ 87] By: mbeattie on 1997/10/01 17:03:34
+ Log: Move runops_foo prototypes from proto.h to early in perl.h.
+ Branch: perl
+ ! perl.h proto.h
+____________________________________________________________________________
+[ 86] By: nick on 1997/09/30 19:15:21
+ Log: Debug hackery to thread.h - temporary
+ Quick-fix qsort() replacement - more to come.
+ Branch: oneperl
+ ! thread.h util.c
+____________________________________________________________________________
+[ 85] By: mbeattie on 1997/09/30 15:50:27
+ Log: Added Lint option regexp-variables.
+ Branch: perlext
+ ! Compiler/B/Lint.pm
+____________________________________________________________________________
+[ 84] By: mbeattie on 1997/09/30 15:11:07
+ Log: Merge maint-5.004 branch (5.004_01) with mainline.
+ Branch: perl
+ +> Porting/makerel Porting/patchls hints/newsos4.sh
+ +> lib/File/DosGlob.pm lib/chat2.pl perlio.sym win32/config.bc
+ +> win32/config.vc win32/config_H.bc win32/config_H.vc
+ +> win32/makefile.mk
+ - win32/config.H win32/config.w32
+ !> (integrate 109 files)
+____________________________________________________________________________
+[ 83] By: TimBunce on 1997/09/30 14:27:09
+ Log: Maintenance 5.004_03 changes (addendum)
+ Branch: maint-5.004/perl
+ - win32/bin/search.bat
+____________________________________________________________________________
+[ 82] By: TimBunce on 1997/09/30 14:11:29
+ Log: Maintenance 5.004_03 changes
+ Branch: maint-5.004/perl
+ + win32/bin/pl2bat.pl win32/bin/runperl.pl win32/bin/search.pl
+ + win32/bin/webget.pl
+ - win32/bin/pl2bat.bat win32/bin/runperl.bat win32/bin/test.bat
+ - win32/bin/webget.bat
+ ! Changes Configure MANIFEST Makefile.SH Porting/makerel
+ ! ext/DynaLoader/DynaLoader.pm hints/hpux.sh hints/linux.sh
+ ! hints/sco.sh hints/sunos_4_1.sh installhtml lib/CPAN.pm
+ ! lib/ExtUtils/MM_Unix.pm lib/FileCache.pm lib/Math/Complex.pm
+ ! lib/Math/Trig.pm lib/blib.pm os2/diff.configure patchlevel.h
+ ! perl.c pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod
+ ! pod/perlop.pod pod/perlre.pod pod/perlrun.pod pod/pod2man.PL
+ ! pp_ctl.c pp_sys.c t/lib/complex.t t/pragma/locale.t toke.c
+ ! utils/perlbug.PL win32/Makefile win32/makefile.mk
+ ! win32/win32.c
+____________________________________________________________________________
+[ 81] By: TimBunce on 1997/09/30 13:17:27
+ Log: Maintenance 5.004_02 changes
+ Branch: maint-5.004/perl
+ + win32/bin/runperl.bat
+ ! Changes Configure INSTALL MANIFEST Makefile.SH Porting/patchls
+ ! README.os2 README.win32 Todo XSUB.h av.c configpm doio.c
+ ! dosish.h embed.h ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
+ ! ext/DB_File/typemap ext/GDBM_File/typemap ext/IO/IO.xs
+ ! ext/IO/lib/IO/File.pm ext/IO/lib/IO/Handle.pm
+ ! ext/IO/lib/IO/Socket.pm ext/NDBM_File/typemap
+ ! ext/ODBM_File/ODBM_File.xs ext/POSIX/POSIX.xs
+ ! ext/SDBM_File/typemap global.sym gv.c hints/cxux.sh
+ ! hints/os2.sh hints/sunos_4_1.sh hints/svr4.sh installhtml
+ ! lib/Bundle/CPAN.pm lib/CPAN.pm lib/CPAN/FirstTime.pm
+ ! lib/CPAN/Nox.pm lib/Carp.pm lib/Class/Struct.pm
+ ! lib/Exporter.pm lib/ExtUtils/Command.pm lib/ExtUtils/Embed.pm
+ ! lib/ExtUtils/Install.pm lib/ExtUtils/Liblist.pm
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
+ ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mksymlists.pm
+ ! lib/ExtUtils/xsubpp lib/File/Compare.pm lib/File/Copy.pm
+ ! lib/File/Find.pm lib/File/Path.pm lib/FileHandle.pm
+ ! lib/I18N/Collate.pm lib/IPC/Open3.pm lib/Net/hostent.pm
+ ! lib/Pod/Html.pm lib/Shell.pm lib/Sys/Hostname.pm
+ ! lib/Sys/Syslog.pm lib/Term/ReadLine.pm lib/Time/Local.pm
+ ! lib/UNIVERSAL.pm lib/dumpvar.pl lib/ftp.pl lib/perl5db.pl
+ ! malloc.c mg.c op.c opcode.pl os2/Changes os2/Makefile.SHs
+ ! os2/diff.configure os2/os2.c os2/os2ish.h patchlevel.h perl.c
+ ! perl.h pod/perlapio.pod pod/perlbook.pod pod/perldebug.pod
+ ! pod/perldelta.pod pod/perldiag.pod pod/perlembed.pod
+ ! pod/perlfunc.pod pod/perlguts.pod pod/perlop.pod
+ ! pod/perlre.pod pod/perlrun.pod pod/perltoc.pod
+ ! pod/perltrap.pod pod/perlvar.pod pod/perlxstut.pod
+ ! pod/pod2man.PL pod/splitpod pp.c pp_ctl.c pp_hot.c pp_sys.c
+ ! proto.h regcomp.c regexec.c scope.c sv.c t/TEST t/base/lex.t
+ ! t/comp/cmdopt.t t/comp/term.t t/lib/db-btree.t t/lib/db-hash.t
+ ! t/lib/db-recno.t t/lib/filehand.t t/lib/gdbm.t t/lib/ndbm.t
+ ! t/lib/odbm.t t/lib/sdbm.t t/op/local.t t/op/magic.t
+ ! t/op/pack.t t/op/re_tests t/op/ref.t t/op/regexp.t t/op/stat.t
+ ! t/op/substr.t t/op/universal.t toke.c universal.c util.c
+ ! utils/Makefile utils/h2ph.PL utils/perlbug.PL utils/perldoc.PL
+ ! vms/config.vms vms/descrip.mms vms/ext/filespec.t
+ ! vms/sockadapt.c vms/sockadapt.h vms/test.com vms/vms.c
+ ! vms/vmsish.h win32/Makefile win32/bin/pl2bat.bat
+ ! win32/config.bc win32/config.vc win32/config_H.bc
+ ! win32/config_H.vc win32/config_h.PL win32/makedef.pl
+ ! win32/makefile.mk win32/perllib.c win32/win32.c win32/win32.h
+ ! win32/win32io.c win32/win32io.h win32/win32iop.h
+ ! win32/win32sck.c
+____________________________________________________________________________
+[ 80] By: nick on 1997/09/29 20:31:43
+ Log: Add some prototypes in attempt to flush out errors
+ Tidy up vars.h usage.
+ Branch: oneperl
+ ! av.c embed.h hv.c opcode.h perl.c perl.h perlio.c pp_sys.c
+ ! proto.h util.c vars.h
+____________________________________________________________________________
+[ 79] By: nick on 1997/09/29 17:12:07
+ Log: Builds and passes tests without THISPTR
+ Branch: oneperl
+ ! MANIFEST global.sym perl.c perl.h vars.h
+____________________________________________________________________________
+[ 78] By: mbeattie on 1997/09/29 16:57:23
+ Log: Re-introduce the changes from change 68 (runops becomes a
+ function pointer and sv_bless3 for '~'-magic) which got lost
+ during the preparation for the maint-merge.
+ Branch: perl
+ ! global.sym perl.h pp.c proto.h run.c sv.c
+____________________________________________________________________________
+[ 77] By: mbeattie on 1997/09/29 16:44:16
+ Log: Start merge with maint-5.004 branch by creating an ancestral
+ branch point via a fake resolution with the maint-merge branch.
+ See Perforce Tech Note 9 for details.
+ Branch: perl
+ !> (integrate 864 files)
+____________________________________________________________________________
+[ 76] By: nick on 1997/09/28 19:04:42
+ Log: Code with this pointer compiles (but core dumps)
+ Branch: oneperl
+ ! EXTERN.h INTERN.h XSUB.h av.c av.h cop.h cv.h deb.c doio.c
+ ! doop.c dosish.h dump.c form.h gv.c gv.h handy.h hv.c hv.h
+ ! keywords.h mg.c mg.h miniperlmain.c nostdio.h op.c op.h
+ ! opcode.h patchlevel.h perl.c perl.h perlio.c perlio.h
+ ! perlsdio.h perlsfio.h perly.c perly.c.diff perly.h perly.y
+ ! pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c
+ ! regcomp.h regexec.c regexp.h run.c scope.c scope.h sv.c sv.h
+ ! taint.c thread.h toke.c universal.c unixish.h util.c util.h
+ ! vars.h
+____________________________________________________________________________
+[ 75] By: nick on 1997/09/28 15:45:35
+ Log: Quasi sensible starting point for aTHIS addition.
+ Branch: oneperl
+ ! perl.c perl.h pp_ctl.c sv.c thread.h toke.c util.c
+____________________________________________________________________________
+[ 74] By: nick on 1997/09/28 11:23:32
+ Log: Ooops - unwind perly.* stuff for now
+ Branch: oneperl
+ ! perly.c perly.h perly.y vms/perly_c.vms vms/perly_h.vms
+____________________________________________________________________________
+[ 73] By: nick on 1997/09/28 11:17:23
+ Log: Builds and passes all tests again
+ Branch: oneperl
+ ! embed.pl ext/DB_File/DB_File.xs gv.c perl.c perl.h perly.y
+ ! pp.h proto.h thread.sym vms/perly_c.vms vms/perly_h.vms
+____________________________________________________________________________
+[ 72] By: nick on 1997/09/28 10:47:01
+ Log: Save "important things" before re-try
+ Branch: oneperl
+ + vars.h
+ ! embed.pl thread.h thread.sym
+____________________________________________________________________________
+[ 71] By: nick on 1997/09/26 17:47:31
+ Log: Basic hacks to build with USE_THISPTR, not yet useful
+ but builds miniperl and passes minitest with all thread
+ variables via a _GLOBAL_ thr variable rather than globals.
+ Now for the local thr variable ...
+ Branch: oneperl
+ + thread.sym
+ ! MANIFEST README.threads XSUB.h av.c cv.h deb.c doio.c doop.c
+ ! dump.c embed.pl ext/DB_File/DB_File.xs gv.c hints/solaris_2.sh
+ ! hv.c mg.c op.c perl.c perl.h pp.c pp_ctl.c pp_hot.c pp_sys.c
+ ! proto.h regcomp.c regexec.c run.c scope.c sv.c thread.h toke.c
+ ! util.c vms/vms.c
+____________________________________________________________________________
+[ 70] By: mbeattie on 1997/09/23 14:29:23
+ Log: Branch oneperl from mainline.
+ Branch: oneperl
+ +> (branch 871 files)
+____________________________________________________________________________
+[ 69] By: mbeattie on 1997/09/22 16:02:37
+ Log: struct thread now stored in an SV and uses '~'-magic for access.
+ Branch: perl
+ ! thread.h
+ Branch: perlext
+ ! Thread/Thread.xs Thread/typemap
+____________________________________________________________________________
+[ 68] By: mbeattie on 1997/09/22 16:01:48
+ Log: runops becomes a funtion pointer and sv_bless3 created
+ to avoid pointer forgery with '~'-magic.
+ Branch: perl
+ ! global.sym perl.c perl.h pp.c proto.h run.c sv.c
+____________________________________________________________________________
+[ 67] By: mbeattie on 1997/09/22 15:45:56
+ Log: More fprintf -> PerlIO_printf changes.
+ Branch: perl
+ ! perl.c pp_hot.c util.c
+____________________________________________________________________________
+[ 66] By: mbeattie on 1997/09/22 15:10:40
+ Log: Minor multi-threading patches for VMS.
+ Branch: perl
+ ! mg.c thread.h vms/vms.c
+____________________________________________________________________________
+[ 65] By: mbeattie on 1997/09/15 14:09:11
+ Log: Add undefined-subs option to Lint.pm.
+ Branch: perlext
+ ! Compiler/B/Lint.pm
+____________________________________________________________________________
+[ 64] By: mbeattie on 1997/09/10 16:39:41
+ Log: Debugging output for lock handling.
+ Branch: perl
+ ! mg.c pp.c pp_hot.c util.c
+____________________________________________________________________________
+[ 63] By: mbeattie on 1997/09/10 14:49:00
+ Log: Move Thread/Semaphore.pm to Thread/Thread/Semaphore.pm
+ Branch: perlext
+ +> Thread/Thread/Semaphore.pm
+ - Thread/Semaphore.pm
+____________________________________________________________________________
+[ 62] By: mbeattie on 1997/09/10 14:47:31
+ Log: Move Thread/Queue.pm to Thread/Thread/Queue.pm
+ Branch: perlext
+ +> Thread/Thread/Queue.pm
+ - Thread/Queue.pm
+____________________________________________________________________________
+[ 61] By: mbeattie on 1997/09/10 13:56:50
+ Log: Solaris fixes: delete pad and padname from thread.h and remove
+ MUTEX_* stuff when malloc.c gets copied to x2p/malloc.c.
+ Branch: perl
+ ! thread.h x2p/Makefile.SH
+
+----------------
+Version 5.004_50 First developer release towards 5.005
+----------------
+
+Maintenance of the 5.004 version of perl continues with the 5.004_xx
+series, where 'xx' is <= 49. Development of the next version, 5.005,
+starts with 5.004_50.
+
+____________________________________________________________________________
+[ 60] By: mbeattie on 1997/09/09 16:57:41
+ Log: Update README.threads to mention -DL.
+ Branch: perl
+ ! README.threads
+____________________________________________________________________________
+[ 59] By: mbeattie on 1997/09/09 16:49:08
+ Log: Add Thread modules Queue.pm and Semaphore.pm
+ Branch: perlext
+ + Thread/Queue.pm Thread/Semaphore.pm
+____________________________________________________________________________
+[ 58] By: mbeattie on 1997/09/09 16:33:45
+ Log: Update README.threads
+ Branch: perl
+ ! README.threads
+____________________________________________________________________________
+[ 57] By: mbeattie on 1997/09/09 16:26:47
+ Log: Add debug info to Thread typemap.
+ Branch: perlext
+ ! Thread/typemap
+____________________________________________________________________________
+[ 56] By: mbeattie on 1997/09/09 15:04:26
+ Log: Rewrite synchronisation of subs/methods and add attrs
+ extension for specifying 'locked' and 'method' attributes.
+ Branch: perl
+ + ext/attrs/Makefile.PL ext/attrs/attrs.pm ext/attrs/attrs.xs
+ ! MANIFEST cv.h embed.h global.sym op.c perl.c pp.c pp_ctl.c
+ ! pp_hot.c proto.h sv.c sv.h toke.c
+ Branch: perlext
+ ! Thread/Thread.pm Thread/Thread.xs Thread/sync.t Thread/sync2.t
+____________________________________________________________________________
+[ 55] By: mbeattie on 1997/09/03 16:34:47
+ Log: Add new keyword "lock" to Opcode.pm
+ Branch: perl
+ ! ext/Opcode/Opcode.pm
+____________________________________________________________________________
+[ 54] By: mbeattie on 1997/09/03 14:44:44
+ Log: Run embed.pl and keywords.pl to complete RESTART -> INIT change
+ Branch: perl
+ ! embed.h keywords.h
+____________________________________________________________________________
+[ 53] By: mbeattie on 1997/09/03 13:52:24
+ Log: Add to MANIFEST: README.threads, lib/ISA.pm, lib/Class/Fields.pm
+ Branch: perl
+ ! MANIFEST
+____________________________________________________________________________
+[ 52] By: mbeattie on 1997/09/03 13:41:20
+ Log: Let Lint private_names catch out-of-package _foo methods.
+ Branch: perlext
+ ! Compiler/B/Lint.pm
+____________________________________________________________________________
+[ 51] By: mbeattie on 1997/09/03 13:20:12
+ Log: Bump patchlevel.h to 5.004_50
+ Branch: perl
+ ! patchlevel.h
+____________________________________________________________________________
+[ 50] By: mbeattie on 1997/09/03 12:31:48
+ Log: Make compiler build/work with devel 5.005
+ Branch: perlext
+ ! Compiler/B.xs Compiler/B/Asmdata.pm Compiler/bytecode.h
+ ! Compiler/bytecode.pl Compiler/byterun.c Compiler/byterun.h
+____________________________________________________________________________
+[ 49] By: mbeattie on 1997/09/03 12:28:05
+ Log: Rename RESTART to INIT and associated changes
+ Branch: perl
+ ! interp.sym keywords.pl op.c perl.c perl.h perly.c perly.y
+ ! toke.c vms/perly_c.vms
+____________________________________________________________________________
+[ 48] By: mbeattie on 1997/09/02 15:54:27
+ Log: Added private-names option.
+ Branch: perlext
+ ! Compiler/B/Lint.pm
+____________________________________________________________________________
+[ 47] By: mbeattie on 1997/09/02 11:54:55
+ Log: For compiler's CC, make PP_EVAL, PP_ENTERTRY work with JMPENV.
+ Branch: perlext
+ ! Compiler/cc_runtime.h
+____________________________________________________________________________
+[ 46] By: mbeattie on 1997/08/28 19:40:08
+ Log: Missing sprintf in try_autoload.
+ Branch: perlext
+ ! Compiler/B/C.pm
+____________________________________________________________________________
+[ 45] By: mbeattie on 1997/08/13 16:15:25
+ Log: Threading fixups for Digital UNIX.
+ Branch: perl
+ ! README.threads malloc.c perl.h toke.c
+____________________________________________________________________________
+[ 44] By: mbeattie on 1997/08/11 15:46:29
+ Log: Assorted changes for multi-threading (now works rather more).
+ Branch: perl
+ + README.threads
+ ! gv.c mg.c op.c perl.c perl.h pp_ctl.c pp_hot.c sv.c thread.h
+ ! toke.c util.c
+ Branch: perlext
+ ! Thread/Makefile.PL Thread/Thread.xs Thread/lock.t
+ ! Thread/unsync.t
+____________________________________________________________________________
+[ 43] By: mbeattie on 1997/08/08 14:11:00
+ Log: Made Lint check subs (and -u packages).
+ Added support for dollar_underscore and implicit $_ in foreach.
+ Branch: perlext
+ ! Compiler/B/Lint.pm
+____________________________________________________________________________
+[ 42] By: TimBunce on 1997/07/25 17:15:57
+ Log: Maintenance 5.004_01 changes
+ Branch: maint-5.004/perl
+ + Porting/makerel Porting/patchls hints/newsos4.sh
+ + lib/File/DosGlob.pm lib/chat2.pl perlio.sym win32/config.bc
+ + win32/config.vc win32/config_H.bc win32/config_H.vc
+ + win32/makefile.mk
+ - win32/config.H win32/config.w32
+ ! Changes Configure EXTERN.h INSTALL MANIFEST Makefile.SH
+ ! Porting/pumpkin.pod README README.win32 doio.c embed.h
+ ! ext/DynaLoader/dl_aix.xs ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
+ ! ext/SDBM_File/Makefile.PL ext/SDBM_File/sdbm/Makefile.PL
+ ! global.sym hints/next_3.sh hints/next_4.sh hints/svr4.sh
+ ! installhtml installman lib/AutoLoader.pm lib/AutoSplit.pm
+ ! lib/CGI/Push.pm lib/CPAN.pm lib/ExtUtils/Install.pm
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm
+ ! lib/ExtUtils/MM_VMS.pm lib/ExtUtils/MM_Win32.pm
+ ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mksymlists.pm
+ ! lib/ExtUtils/xsubpp lib/Pod/Html.pm lib/Pod/Text.pm
+ ! lib/Sys/Syslog.pm lib/Term/ReadLine.pm lib/Test/Harness.pm
+ ! lib/ftp.pl mg.c op.c patchlevel.h perl.c perl.h perl_exp.SH
+ ! perlio.c pod/checkpods.PL pod/perlbook.pod pod/perldata.pod
+ ! pod/perldebug.pod pod/perldelta.pod pod/perldiag.pod
+ ! pod/perlembed.pod pod/perlfaq4.pod pod/perlfaq8.pod
+ ! pod/perlfaq9.pod pod/perlfunc.pod pod/perlguts.pod
+ ! pod/perllol.pod pod/perlop.pod pod/perlrun.pod pod/perlsub.pod
+ ! pod/perltoc.pod pod/perltoot.pod pod/pod2man.PL pod/roffitall
+ ! pod/splitpod pp.c pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c
+ ! regcomp.h regexec.c sv.c t/lib/safe2.t t/op/flip.t
+ ! t/op/groups.t t/op/magic.t t/op/mkdir.t t/op/re_tests
+ ! t/op/regexp.t t/op/split.t t/op/stat.t t/op/subst.t
+ ! t/op/taint.t util.c utils/Makefile utils/h2xs.PL
+ ! utils/perlbug.PL vms/ext/DCLsym/DCLsym.pm
+ ! vms/ext/Stdio/Stdio.pm vms/gen_shrfls.pl vms/perlvms.pod
+ ! win32/Makefile win32/config_sh.PL win32/include/sys/socket.h
+ ! win32/makedef.pl win32/makeperldef.pl win32/perlglob.c
+ ! win32/perllib.c win32/win32.c win32/win32.h win32/win32io.c
+ ! win32/win32io.h win32/win32iop.h win32/win32sck.c
+____________________________________________________________________________
+[ 41] By: mbeattie on 1997/07/24 14:57:53
+ Log: Start support for fake threads.
+ pp_lock now returns its argument.
+ Branch: perl
+ ! MANIFEST Makefile.SH cv.h op.c opcode.h opcode.pl perl.c
+ ! perl.h pp.c pp_ctl.c pp_hot.c proto.h sv.h thread.h toke.c
+ ! util.c
+ Branch: perlext
+ ! Thread/Thread.xs
+____________________________________________________________________________
+[ 40] By: mbeattie on 1997/07/24 14:55:07
+ Log: Add missing reset of eval_owner if doeval() fails to parse.
+ Branch: perl
+ ! pp_ctl.c
+____________________________________________________________________________
+[ 39] By: mbeattie on 1997/07/17 13:35:51
+ Log: Fix multiple problems with lexical @_.
+ Branch: perl
+ ! cop.h op.c perl.c pp.c pp_ctl.c pp_hot.c t/op/do.t thread.h
+ ! toke.c
+____________________________________________________________________________
+[ 38] By: mbeattie on 1997/07/16 17:02:09
+ Log: Change %lx to %x in B::CV::save to prevent some CV
+ fields becoming 0 in the init section. Add missing
+ write_back in B::Stackobj::Padsv::load_double to fix
+ test 22 of op/my.t.
+ Branch: perlext
+ ! Compiler/B/C.pm Compiler/B/Stackobj.pm
+____________________________________________________________________________
+[ 37] By: mbeattie on 1997/07/10 11:28:16
+ Log: Branch win32 developments from main perl branch.
+ Branch: win32/perl
+ +> (branch 867 files)
+____________________________________________________________________________
+[ 36] By: mbeattie on 1997/07/05 11:58:05
+ Log: B::CC::pp_padsv must cope with vivify_ref (5.004)
+ as well as provide_ref (5.003).
+ Branch: perlext
+ ! Compiler/B/C.pm Compiler/B/CC.pm Compiler/NOTES
+____________________________________________________________________________
+[ 35] By: mbeattie on 1997/07/05 11:55:18
+ Log: Introduce pp_lock.
+ Branch: perl
+ ! embed.h global.sym keywords.h keywords.pl opcode.h opcode.pl
+ ! pp.c pp_ctl.c toke.c
+____________________________________________________________________________
+[ 34] By: mbeattie on 1997/07/01 12:24:28
+ Log: Support for op in global register (still buggy)
+ Branch: perl
+ ! embed.h global.sym gv.c op.c perl.c perl.h pp_ctl.c pp_sys.c
+ ! proto.h scope.c scope.h thread.h
+____________________________________________________________________________
+[ 33] By: mbeattie on 1997/06/24 16:34:24
+ Log: Branch lexical warnings from perl branch.
+ Branch: lexwarn/perl
+ +> (branch 867 files)
+____________________________________________________________________________
+[ 32] By: mbeattie on 1997/06/24 14:33:57
+ Log: Branch integration of maint-5.004 from relperl.
+ Branch: mainline/perl
+ +> (branch 600 files)
+ Branch: maint-5.004/perl
+ +> (branch 864 files)
+____________________________________________________________________________
+[ 31] By: mbeattie on 1997/06/20 11:46:50
+ Log: corrected bad_type() prototype.
+ Branch: perl
+ ! op.c
+____________________________________________________________________________
+[ 30] By: mbeattie on 1997/06/12 12:38:05
+ Log: Tweak README.
+ Branch: perlext
+ ! Thread/README
+____________________________________________________________________________
+[ 29] By: mbeattie on 1997/06/12 12:34:59
+ Log: Document -m option of CC backend.
+ Branch: perlext
+ ! Compiler/NOTES
+____________________________________________________________________________
+[ 28] By: mbeattie on 1997/06/12 12:25:05
+ Log: Support sysseek introduced in 5.004.
+ Branch: perlext
+ ! Compiler/ccop.c Compiler/ccop.h
+____________________________________________________________________________
+[ 27] By: mbeattie on 1997/06/05 14:20:51
+ Log: More fixups for thrperl integration.
+ Branch: perl
+ ! ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
+ ! ext/Opcode/Makefile.PL ext/Opcode/Opcode.pm
+ ! ext/Opcode/Opcode.xs gv.c hv.c mg.c op.c perl.c perly.c
+ ! perly.y pp.c pp_ctl.c run.c scope.c sv.c sv.h thread.h toke.c
+ ! util.c
+____________________________________________________________________________
+[ 25] By: mbeattie on 1997/05/28 15:11:24
+ Log: Fixups for thrperl integration.
+ Branch: perl
+ ! embed.h keywords.h op.c opcode.h perl.c util.c
+____________________________________________________________________________
+[ 24] By: mbeattie on 1997/05/26 20:10:42
+ Log: Integrate thrperl 5.003->5.004.
+ Branch: perl
+ +> thread.h
+ !> (integrate 33 files)
+____________________________________________________________________________
+[ 23] By: mbeattie on 1997/05/26 11:45:39
+ Log: Fix ppname when saving subs.
+ Branch: perlext
+ ! Compiler/B/C.pm
+____________________________________________________________________________
+[ 22] By: mbeattie on 1997/05/26 11:45:03
+ Log: -mFoo option now forces -uFoo.
+ Branch: perlext
+ ! Compiler/B/CC.pm
+____________________________________________________________________________
+[ 21] By: mbeattie on 1997/05/26 11:43:37
+ Log: Put back objsym/savesym (used by walkoptree_exec).
+ Branch: perlext
+ ! Compiler/B.pm
+____________________________________________________________________________
+[ 20] By: mbeattie on 1997/05/26 11:38:45
+ Log: Add avhv_store_ent. Add missing avhv_* to global.sym.
+ Branch: perl
+ ! av.c global.sym
+____________________________________________________________________________
+[ 19] By: mbeattie on 1997/05/25 21:19:38
+ Log: Fix up integration 5.003->5.004.
+ Branch: perl
+ + lib/Class/Fields.pm lib/ISA.pm
+ ! av.c ext/DB_File/DB_File.xs perl.c pp.c pp_hot.c proto.h
+ ! toke.c
+____________________________________________________________________________
+[ 18] By: mbeattie on 1997/05/25 10:31:21
+ Log: First stab at 5.003 -> 5.004 integration.
+ Branch: perl
+ +> (branch 291 files)
+ - Changes.Conf ext/DynaLoader/dl_os2.xs
+ - ext/FileHandle/FileHandle.pm ext/FileHandle/FileHandle.xs
+ - ext/FileHandle/Makefile.PL ext/SDBM_File/sdbm/readme.ps
+ - ext/Safe/Makefile.PL ext/Safe/Safe.pm ext/Safe/Safe.xs
+ - hints/aux.sh hints/dnix.sh hints/irix_6_2.sh lib/chat2.inter
+ - lib/chat2.pl lib/splain os2/README os2/README.old
+ - os2/diff.db_file os2/notes pod/perlovl.pod t/lib/safe.t
+ - t/op/overload.t t/re_tests vms/Makefile x2p/a2p.man
+ - x2p/handy.h x2p/s2p.man
+ !> (integrate 392 files)
+____________________________________________________________________________
+[ 17] By: mbeattie on 1997/05/24 18:46:49
+ Log: Wholesale update to 5.004.
+ Branch: relperl
+ + Changes5.000 Changes5.001 Changes5.002 Changes5.003
+ + Porting/Glossary Porting/pumpkin.pod README.amiga
+ + README.cygwin32 README.os2 README.plan9 README.qnx
+ + README.win32 compat3.sym configure.gnu cygwin32/cw32imp.h
+ + cygwin32/gcc2 cygwin32/ld2 cygwin32/perlgcc cygwin32/perlld
+ + eg/cgi/RunMeFirst eg/cgi/clickable_image.cgi eg/cgi/cookie.cgi
+ + eg/cgi/crash.cgi eg/cgi/customize.cgi eg/cgi/diff_upload.cgi
+ + eg/cgi/file_upload.cgi eg/cgi/frameset.cgi eg/cgi/index.html
+ + eg/cgi/internal_links.cgi eg/cgi/javascript.cgi
+ + eg/cgi/monty.cgi eg/cgi/multiple_forms.cgi
+ + eg/cgi/nph-clock.cgi eg/cgi/popup.cgi eg/cgi/save_state.cgi
+ + eg/cgi/tryit.cgi eg/cgi/wilogo.gif.uu
+ + ext/DynaLoader/dl_cygwin32.xs ext/IO/IO.pm ext/IO/IO.xs
+ + ext/IO/Makefile.PL ext/IO/README ext/IO/lib/IO/File.pm
+ + ext/IO/lib/IO/Handle.pm ext/IO/lib/IO/Pipe.pm
+ + ext/IO/lib/IO/Seekable.pm ext/IO/lib/IO/Select.pm
+ + ext/IO/lib/IO/Socket.pm ext/NDBM_File/hints/dec_osf.pl
+ + ext/NDBM_File/hints/dynixptx.pl ext/ODBM_File/hints/hpux.pl
+ + ext/ODBM_File/hints/ultrix.pl ext/Opcode/Makefile.PL
+ + ext/Opcode/Opcode.pm ext/Opcode/Opcode.xs ext/Opcode/Safe.pm
+ + ext/Opcode/ops.pm ext/POSIX/hints/next_3.pl hints/amigaos.sh
+ + hints/aux_3.sh hints/broken-db.msg hints/cygwin32.sh
+ + hints/dcosx.sh hints/irix_6_0.sh hints/irix_6_1.sh
+ + hints/lynxos.sh hints/next_4.sh hints/qnx.sh hints/umips.sh
+ + hints/unicosmk.sh installhtml lib/Bundle/CPAN.pm lib/CGI.pm
+ + lib/CGI/Apache.pm lib/CGI/Carp.pm lib/CGI/Fast.pm
+ + lib/CGI/Push.pm lib/CGI/Switch.pm lib/CPAN.pm
+ + lib/CPAN/FirstTime.pm lib/CPAN/Nox.pm lib/Class/Struct.pm
+ + lib/ExtUtils/Command.pm lib/ExtUtils/Embed.pm
+ + lib/ExtUtils/MM_Win32.pm lib/File/Compare.pm lib/File/stat.pm
+ + lib/FileHandle.pm lib/FindBin.pm lib/Math/Trig.pm
+ + lib/Net/hostent.pm lib/Net/netent.pm lib/Net/protoent.pm
+ + lib/Net/servent.pm lib/Pod/Html.pm lib/Tie/RefHash.pm
+ + lib/Time/gmtime.pm lib/Time/localtime.pm lib/Time/tm.pm
+ + lib/UNIVERSAL.pm lib/User/grent.pm lib/User/pwent.pm
+ + lib/autouse.pm lib/blib.pm lib/constant.pm lib/locale.pm
+ + nostdio.h os2/Changes os2/OS2/ExtAttr/Changes
+ + os2/OS2/ExtAttr/ExtAttr.pm os2/OS2/ExtAttr/ExtAttr.xs
+ + os2/OS2/ExtAttr/MANIFEST os2/OS2/ExtAttr/Makefile.PL
+ + os2/OS2/ExtAttr/myea.h os2/OS2/ExtAttr/t/os2_ea.t
+ + os2/OS2/ExtAttr/typemap os2/OS2/PrfDB/Changes
+ + os2/OS2/PrfDB/MANIFEST os2/OS2/PrfDB/Makefile.PL
+ + os2/OS2/PrfDB/PrfDB.pm os2/OS2/PrfDB/PrfDB.xs
+ + os2/OS2/PrfDB/t/os2_prfdb.t os2/OS2/PrfDB/typemap
+ + os2/OS2/Process/MANIFEST os2/OS2/Process/Makefile.PL
+ + os2/OS2/Process/Process.pm os2/OS2/Process/Process.xs
+ + os2/OS2/REXX/Changes os2/OS2/REXX/MANIFEST
+ + os2/OS2/REXX/Makefile.PL os2/OS2/REXX/REXX.pm
+ + os2/OS2/REXX/REXX.xs os2/OS2/REXX/t/rx_cmprt.t
+ + os2/OS2/REXX/t/rx_dllld.t os2/OS2/REXX/t/rx_objcall.t
+ + os2/OS2/REXX/t/rx_sql.test os2/OS2/REXX/t/rx_tiesql.test
+ + os2/OS2/REXX/t/rx_tievar.t os2/OS2/REXX/t/rx_tieydb.t
+ + os2/OS2/REXX/t/rx_varset.t os2/OS2/REXX/t/rx_vrexx.t
+ + os2/dl_os2.c os2/dlfcn.h perlio.c perlio.h perlsdio.h
+ + perlsfio.h plan9/aperl plan9/arpa/inet.h plan9/buildinfo
+ + plan9/config.plan9 plan9/exclude plan9/fndvers
+ + plan9/genconfig.pl plan9/mkfile plan9/myconfig.plan9
+ + plan9/perlplan9.doc plan9/perlplan9.pod plan9/plan9.c
+ + plan9/plan9ish.h plan9/setup.rc plan9/versnum pod/checkpods.PL
+ + pod/perlapio.pod pod/perldelta.pod pod/perlfaq.pod
+ + pod/perlfaq1.pod pod/perlfaq2.pod pod/perlfaq3.pod
+ + pod/perlfaq4.pod pod/perlfaq5.pod pod/perlfaq6.pod
+ + pod/perlfaq7.pod pod/perlfaq8.pod pod/perlfaq9.pod
+ + pod/perllocale.pod pod/perlmodlib.pod pod/perltoot.pod
+ + pod/rofftoc qnx/ar qnx/cpp t/comp/colon.t t/comp/proto.t
+ + t/comp/redef.t t/comp/use.t t/io/read.t t/lib/abbrev.t
+ + t/lib/autoloader.t t/lib/basename.t t/lib/checktree.t
+ + t/lib/complex.t t/lib/env.t t/lib/filecache.t t/lib/filecopy.t
+ + t/lib/filefind.t t/lib/filepath.t t/lib/findbin.t
+ + t/lib/getopt.t t/lib/hostname.t t/lib/io_dup.t t/lib/io_pipe.t
+ + t/lib/io_sel.t t/lib/io_sock.t t/lib/io_taint.t
+ + t/lib/io_tell.t t/lib/io_udp.t t/lib/io_xs.t t/lib/opcode.t
+ + t/lib/open2.t t/lib/open3.t t/lib/ops.t t/lib/parsewords.t
+ + t/lib/safe1.t t/lib/safe2.t t/lib/searchdict.t
+ + t/lib/selectsaver.t t/lib/symbol.t t/lib/texttabs.t
+ + t/lib/textwrap.t t/lib/timelocal.t t/lib/trig.t t/op/arith.t
+ + t/op/assignwarn.t t/op/bop.t t/op/closure.t t/op/cmp.t
+ + t/op/gv.t t/op/inc.t t/op/method.t t/op/recurse.t
+ + t/op/runlevel.t t/op/sysio.t t/op/taint.t t/op/tie.t
+ + t/op/universal.t t/pragma/constant.t t/pragma/locale.t
+ + t/pragma/overload.t t/pragma/strict-refs t/pragma/strict-subs
+ + t/pragma/strict-vars t/pragma/strict.t t/pragma/subs.t
+ + t/pragma/warn-1global t/pragma/warning.t universal.c
+ + utils/splain.PL vms/ext/DCLsym/0README.txt
+ + vms/ext/DCLsym/DCLsym.pm vms/ext/DCLsym/DCLsym.xs
+ + vms/ext/DCLsym/Makefile.PL vms/ext/DCLsym/test.pl
+ + vms/ext/XSSymSet.pm vms/ext/filespec.t vms/ext/vmsish.pm
+ + vms/ext/vmsish.t win32/Makefile win32/TEST win32/autosplit.pl
+ + win32/bin/network.pl win32/bin/pl2bat.bat win32/bin/search.bat
+ + win32/bin/test.bat win32/bin/webget.bat win32/bin/www.pl
+ + win32/config.H win32/config.w32 win32/config_h.PL
+ + win32/config_sh.PL win32/dl_win32.xs win32/genxsdef.pl
+ + win32/include/arpa/inet.h win32/include/dirent.h
+ + win32/include/netdb.h win32/include/sys/socket.h
+ + win32/makedef.pl win32/makemain.pl win32/makeperldef.pl
+ + win32/perlglob.c win32/perllib.c win32/pod.mak win32/runperl.c
+ + win32/splittree.pl win32/win32.c win32/win32.h win32/win32io.c
+ + win32/win32io.h win32/win32iop.h win32/win32sck.c x2p/a2p.pod
+ + x2p/proto.h
+ - Changes.Conf ext/DynaLoader/dl_os2.xs
+ - ext/FileHandle/FileHandle.pm ext/FileHandle/FileHandle.xs
+ - ext/FileHandle/Makefile.PL ext/SDBM_File/sdbm/readme.ps
+ - ext/Safe/Makefile.PL ext/Safe/Safe.pm ext/Safe/Safe.xs
+ - hints/aux.sh hints/dnix.sh hints/irix_6_2.sh lib/chat2.inter
+ - lib/chat2.pl lib/splain os2/README os2/README.old
+ - os2/diff.db_file os2/notes pod/perlovl.pod t/lib/safe.t
+ - t/op/overload.t t/re_tests vms/Makefile x2p/a2p.man
+ - x2p/handy.h x2p/s2p.man
+ ! Artistic Changes Configure EXTERN.h INSTALL INTERN.h MANIFEST
+ ! Makefile.SH README README.vms Todo XSUB.h av.c av.h cflags.SH
+ ! config_H config_h.SH configpm configure cop.h cv.h deb.c
+ ! doio.c doop.c dosish.h dump.c eg/README eg/nih
+ ! eg/sysvipc/ipcmsg eg/sysvipc/ipcsem eg/sysvipc/ipcshm
+ ! emacs/cperl-mode.el embed.h embed.pl ext/DB_File/DB_File.pm
+ ! ext/DB_File/DB_File.xs ext/DB_File/Makefile.PL
+ ! ext/DB_File/typemap ext/DynaLoader/DynaLoader.pm
+ ! ext/DynaLoader/Makefile.PL ext/DynaLoader/dl_aix.xs
+ ! ext/DynaLoader/dl_dld.xs ext/DynaLoader/dl_dlopen.xs
+ ! ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_next.xs
+ ! ext/DynaLoader/dl_vms.xs ext/DynaLoader/dlutils.c
+ ! ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
+ ! ext/GDBM_File/GDBM_File.pm ext/NDBM_File/NDBM_File.pm
+ ! ext/ODBM_File/ODBM_File.pm ext/ODBM_File/ODBM_File.xs
+ ! ext/ODBM_File/hints/dec_osf.pl ext/POSIX/POSIX.pm
+ ! ext/POSIX/POSIX.pod ext/POSIX/POSIX.xs
+ ! ext/SDBM_File/Makefile.PL ext/SDBM_File/SDBM_File.pm
+ ! ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/pair.c
+ ! ext/SDBM_File/sdbm/pair.h ext/SDBM_File/sdbm/sdbm.3
+ ! ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
+ ! ext/Socket/Socket.pm ext/Socket/Socket.xs ext/util/make_ext
+ ! form.h global.sym gv.c gv.h handy.h hints/3b1.sh
+ ! hints/README.hints hints/aix.sh hints/apollo.sh hints/bsdos.sh
+ ! hints/convexos.sh hints/cxux.sh hints/dec_osf.sh hints/dgux.sh
+ ! hints/dynixptx.sh hints/epix.sh hints/esix4.sh
+ ! hints/freebsd.sh hints/hpux.sh hints/irix_4.sh hints/irix_5.sh
+ ! hints/irix_6.sh hints/isc.sh hints/linux.sh hints/machten.sh
+ ! hints/machten_2.sh hints/mips.sh hints/mpeix.sh
+ ! hints/netbsd.sh hints/next_3.sh hints/next_3_0.sh hints/os2.sh
+ ! hints/powerux.sh hints/sco.sh hints/sco_2_3_3.sh
+ ! hints/sco_2_3_4.sh hints/solaris_2.sh hints/sunos_4_0.sh
+ ! hints/sunos_4_1.sh hints/svr4.sh hints/titanos.sh
+ ! hints/ultrix_4.sh hints/unicos.sh hints/utekv.sh hv.c hv.h
+ ! installman installperl interp.sym keywords.h keywords.pl
+ ! lib/AnyDBM_File.pm lib/AutoLoader.pm lib/AutoSplit.pm
+ ! lib/Benchmark.pm lib/Carp.pm lib/Cwd.pm
+ ! lib/Devel/SelfStubber.pm lib/English.pm lib/Env.pm
+ ! lib/Exporter.pm lib/ExtUtils/Install.pm
+ ! lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_OS2.pm
+ ! lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
+ ! lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Manifest.pm
+ ! lib/ExtUtils/Mkbootstrap.pm lib/ExtUtils/Mksymlists.pm
+ ! lib/ExtUtils/testlib.pm lib/ExtUtils/typemap
+ ! lib/ExtUtils/xsubpp lib/File/Basename.pm lib/File/Copy.pm
+ ! lib/File/Find.pm lib/File/Path.pm lib/FileCache.pm
+ ! lib/Getopt/Long.pm lib/Getopt/Std.pm lib/I18N/Collate.pm
+ ! lib/IPC/Open2.pm lib/IPC/Open3.pm lib/Math/BigInt.pm
+ ! lib/Math/Complex.pm lib/Net/Ping.pm lib/Pod/Functions.pm
+ ! lib/Pod/Text.pm lib/Search/Dict.pm lib/SelectSaver.pm
+ ! lib/SelfLoader.pm lib/Symbol.pm lib/Sys/Hostname.pm
+ ! lib/Sys/Syslog.pm lib/Term/Cap.pm lib/Term/Complete.pm
+ ! lib/Term/ReadLine.pm lib/Test/Harness.pm lib/Text/Abbrev.pm
+ ! lib/Text/ParseWords.pm lib/Text/Soundex.pm lib/Text/Tabs.pm
+ ! lib/Text/Wrap.pm lib/Tie/Hash.pm lib/Tie/Scalar.pm
+ ! lib/Tie/SubstrHash.pm lib/Time/Local.pm lib/abbrev.pl
+ ! lib/bigfloat.pl lib/bigint.pl lib/cacheout.pl lib/complete.pl
+ ! lib/diagnostics.pm lib/dotsh.pl lib/dumpvar.pl lib/find.pl
+ ! lib/finddepth.pl lib/ftp.pl lib/getcwd.pl lib/getopts.pl
+ ! lib/importenv.pl lib/lib.pm lib/look.pl lib/newgetopt.pl
+ ! lib/open2.pl lib/open3.pl lib/overload.pm lib/perl5db.pl
+ ! lib/sigtrap.pm lib/strict.pm lib/subs.pm lib/syslog.pl
+ ! lib/termcap.pl lib/timelocal.pl lib/validate.pl lib/vars.pm
+ ! makeaperl.SH makedepend.SH malloc.c mg.c mg.h minimod.pl
+ ! miniperlmain.c myconfig op.c op.h opcode.h opcode.pl
+ ! os2/Makefile.SHs os2/diff.configure os2/os2.c os2/os2ish.h
+ ! os2/perl2cmd.pl patchlevel.h perl.c perl.h perl_exp.SH perlsh
+ ! perly.c perly.c.diff perly.h perly.y pod/Makefile pod/buildtoc
+ ! pod/perl.pod pod/perlbook.pod pod/perlbot.pod pod/perlcall.pod
+ ! pod/perldata.pod pod/perldebug.pod pod/perldiag.pod
+ ! pod/perldsc.pod pod/perlembed.pod pod/perlform.pod
+ ! pod/perlfunc.pod pod/perlguts.pod pod/perlipc.pod
+ ! pod/perllol.pod pod/perlmod.pod pod/perlobj.pod pod/perlop.pod
+ ! pod/perlpod.pod pod/perlre.pod pod/perlref.pod pod/perlrun.pod
+ ! pod/perlsec.pod pod/perlstyle.pod pod/perlsub.pod
+ ! pod/perlsyn.pod pod/perltie.pod pod/perltoc.pod
+ ! pod/perltrap.pod pod/perlvar.pod pod/perlxs.pod
+ ! pod/perlxstut.pod pod/pod2html.PL pod/pod2latex.PL
+ ! pod/pod2man.PL pod/pod2text.PL pod/roffitall pp.c pp.h
+ ! pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c regcomp.h
+ ! regexec.c regexp.h run.c scope.c scope.h sv.c sv.h t/README
+ ! t/TEST t/base/lex.t t/base/term.t t/cmd/mod.t t/cmd/while.t
+ ! t/comp/cpp.t t/comp/multiline.t t/comp/package.t
+ ! t/comp/script.t t/harness t/io/argv.t t/io/dup.t t/io/fs.t
+ ! t/io/inplace.t t/io/pipe.t t/io/tell.t t/lib/anydbm.t
+ ! t/lib/bigintpm.t t/lib/db-btree.t t/lib/db-hash.t
+ ! t/lib/db-recno.t t/lib/dirhand.t t/lib/filehand.t t/lib/gdbm.t
+ ! t/lib/ndbm.t t/lib/odbm.t t/lib/posix.t t/lib/sdbm.t
+ ! t/lib/socket.t t/op/chop.t t/op/delete.t t/op/each.t
+ ! t/op/exec.t t/op/fork.t t/op/glob.t t/op/goto.t t/op/groups.t
+ ! t/op/magic.t t/op/misc.t t/op/mkdir.t t/op/my.t t/op/oct.t
+ ! t/op/pack.t t/op/pat.t t/op/quotemeta.t t/op/rand.t
+ ! t/op/re_tests t/op/readdir.t t/op/ref.t t/op/regexp.t
+ ! t/op/sleep.t t/op/sort.t t/op/split.t t/op/stat.t t/op/subst.t
+ ! t/op/substr.t t/op/write.t taint.c toke.c unixish.h util.c
+ ! util.h utils/Makefile utils/c2ph.PL utils/h2ph.PL
+ ! utils/h2xs.PL utils/perlbug.PL utils/perldoc.PL utils/pl2pm.PL
+ ! vms/config.vms vms/descrip.mms vms/ext/Filespec.pm
+ ! vms/ext/Stdio/Stdio.pm vms/ext/Stdio/Stdio.xs
+ ! vms/ext/Stdio/test.pl vms/fndvers.com vms/gen_shrfls.pl
+ ! vms/genconfig.pl vms/genopt.com vms/myconfig.com
+ ! vms/perlvms.pod vms/perly_c.vms vms/perly_h.vms
+ ! vms/sockadapt.c vms/sockadapt.h vms/test.com vms/vms.c
+ ! vms/vms_yfix.pl vms/vmsish.h vms/writemain.pl writemain.SH
+ ! x2p/EXTERN.h x2p/INTERN.h x2p/Makefile.SH x2p/a2p.c x2p/a2p.h
+ ! x2p/a2p.y x2p/a2py.c x2p/cflags.SH x2p/find2perl.PL x2p/hash.c
+ ! x2p/hash.h x2p/s2p.PL x2p/str.c x2p/str.h x2p/util.c
+ ! x2p/util.h x2p/walk.c
+____________________________________________________________________________
+[ 16] By: mbeattie on 1997/05/23 22:42:08
+ Log: Initial integration of relperl from 5.003.
+ Branch: relperl
+ +> (branch 600 files)
+____________________________________________________________________________
+[ 14] By: mbeattie on 1997/05/12 20:22:56
+ Log: Finish code generation rewrite. Clean up B::Section class and
+ handle symbol table translation internally. Simple .pm modules
+ now compile OK.
+ Branch: perlext
+ ! Compiler/B.pm Compiler/B/Bblock.pm Compiler/B/C.pm
+ ! Compiler/B/CC.pm
+____________________________________________________________________________
+[ 13] By: mbeattie on 1997/05/05 19:41:18
+ Log: Don't make pp_enter and pp_return trigger basic blocks.
+ Branch: perlext
+ ! Compiler/B/Bblock.pm
+____________________________________________________________________________
+[ 12] By: mbeattie on 1997/05/05 19:40:16
+ Log: Rewrite code generation. Sections (de)multiplexed into a
+ temporary file instead of stored in arrays.
+ Branch: perlext
+ ! Compiler/B.pm Compiler/B/C.pm Compiler/B/CC.pm
+____________________________________________________________________________
+[ 11] By: mbeattie on 1997/05/03 20:20:59
+ Log: Development to pre-alpha4
+ Branch: perlext
+ + Compiler/B/Deparse.pm Compiler/B/Lint.pm Compiler/makeliblinks
+ ! Compiler/B.pm Compiler/B.xs Compiler/B/Bblock.pm
+ ! Compiler/B/Bytecode.pm Compiler/B/C.pm Compiler/B/CC.pm
+ ! Compiler/B/Debug.pm Compiler/B/Terse.pm Compiler/B/Xref.pm
+ ! Compiler/Makefile.PL Compiler/README Compiler/TESTS
+ ! Compiler/assemble Compiler/bytecode.pl Compiler/byteperl.c
+ ! Compiler/byterun.c Compiler/cc_runtime.h Compiler/disassemble
+ ! Compiler/test_harness Compiler/test_harness_cc
+____________________________________________________________________________
+[ 10] By: mbeattie on 1997/05/03 14:47:06
+ Log: Initial check-in of perl compiler.
+ Branch: perlext
+ + Compiler/Artistic Compiler/B.pm Compiler/B.xs
+ + Compiler/B/Asmdata.pm Compiler/B/Assembler.pm
+ + Compiler/B/Bblock.pm Compiler/B/Bytecode.pm Compiler/B/C.pm
+ + Compiler/B/CC.pm Compiler/B/Debug.pm
+ + Compiler/B/Disassembler.pm Compiler/B/Showlex.pm
+ + Compiler/B/Stackobj.pm Compiler/B/Terse.pm Compiler/B/Xref.pm
+ + Compiler/Copying Compiler/Makefile.PL Compiler/NOTES
+ + Compiler/O.pm Compiler/README Compiler/TESTS
+ + Compiler/TESTS.alpha2 Compiler/Todo Compiler/assemble
+ + Compiler/bytecode.h Compiler/bytecode.pl Compiler/byteperl.c
+ + Compiler/byterun.c Compiler/byterun.h Compiler/cc_harness
+ + Compiler/cc_runtime.h Compiler/ccop.c Compiler/ccop.h
+ + Compiler/disassemble Compiler/old/README.feb11
+ + Compiler/old/TESTS.mar11 Compiler/old/TESTS.mar20
+ + Compiler/old/TESTS.may11 Compiler/old/TESTS.pre-jul27
+ + Compiler/op.patch Compiler/ramblings/cc.notes
+ + Compiler/ramblings/curcop.runtime
+ + Compiler/ramblings/dontparse.c Compiler/ramblings/flip-flop
+ + Compiler/ramblings/foo.bench Compiler/ramblings/foo2.bench
+ + Compiler/ramblings/foo3.bench Compiler/ramblings/magic
+ + Compiler/ramblings/pp_i_add Compiler/ramblings/reg.alloc
+ + Compiler/ramblings/runtime.porting
+ + Compiler/ramblings/sort.notes Compiler/ramblings/sub.call
+ + Compiler/ramblings/subst.notes Compiler/run_bytecode_test
+ + Compiler/run_cc_test Compiler/run_test Compiler/test_harness
+ + Compiler/test_harness_bytecode Compiler/test_harness_cc
+ + Compiler/typemap
+____________________________________________________________________________
+[ 9] By: mbeattie on 1997/05/02 19:03:49
+ Log: Don't require CvDEPTH == 0 when bombing out of subs.
+ Branch: thrperl
+ ! pp_hot.c
+____________________________________________________________________________
+[ 8] By: mbeattie on 1997/04/23 19:06:45
+ Log: Added programmer-level condition variables via "condpair" magic.
+ Added support for detached threads and tweaked a few things.
+ Branch: thrperl
+ ! embed.h global.sym keywords.h mg.c opcode.h perl.c perl.h
+ ! pp_ctl.c pp_hot.c proto.h run.c scope.c sv.c sv.h thread.h
+ ! util.c
+____________________________________________________________________________
+[ 7] By: mbeattie on 1997/04/23 19:04:18
+ Log: Rewrote programmer-level condition variables from scratch. Added
+ support for detaching threads. Fixed handling for arguments
+ passed in to threads and return values for joined threads.
+ Branch: perlext
+ + Thread/lock.t
+ ! Thread/README Thread/Thread.pm Thread/Thread.xs Thread/cond.t
+ ! Thread/typemap
+____________________________________________________________________________
+[ 6] By: mbeattie on 1997/04/10 20:17:26
+ Log: Initial check-in of Thread module.
+ Branch: perlext
+ + Thread/Makefile.PL Thread/Notes Thread/README Thread/Thread.pm
+ + Thread/Thread.xs Thread/cond.t Thread/create.t Thread/io.t
+ + Thread/join.t Thread/sync.t Thread/sync2.t Thread/typemap
+ + Thread/unsync.t Thread/unsync2.t Thread/unsync3.t
+ + Thread/unsync4.t
+____________________________________________________________________________
+[ 5] By: mbeattie on 1997/04/10 20:05:52
+ Log: Tweaks to allow compilation without -DUSE_THREADS and fix
+ missing parens (pad allocation) in the tokener.
+ Branch: thrperl
+ ! op.c pp_ctl.c toke.c
+____________________________________________________________________________
+[ 4] By: mbeattie on 1997/03/28 18:40:44
+ Log: Initial 3-way merge from (5.001m, thr1m, 5.003) plus fixups.
+ Branch: thrperl
+ + thread.h
+ ! XSUB.h av.c cv.h deb.c doio.c doop.c dump.c global.sym gv.c
+ ! hv.c malloc.c mg.c op.c op.h opcode.h opcode.pl perl.c perl.h
+ ! pp.h pp_ctl.c pp_hot.c pp_sys.c proto.h regcomp.c regexec.c
+ ! run.c scope.c sv.c sv.h toke.c util.c
+____________________________________________________________________________
+[ 3] By: mbeattie on 1997/03/28 13:36:23
+ Log: Branch 5.003 -> thrperl
+ Branch: thrperl
+ +> (branch 600 files)
+____________________________________________________________________________
+[ 2] By: mbeattie on 1997/03/28 13:32:21
+ Log: Initial devel changes.
+ Pseudo-hashes. Optional strong typing. RESTART {}.
+ Branch: perl
+ ! av.c doop.c embed.h ext/DB_File/DB_File.xs global.sym
+ ! interp.sym keywords.h keywords.pl lib/ExtUtils/xsubpp op.c
+ ! perl.c perl.h pp.c pp_hot.c proto.h t/op/groups.t toke.c
+____________________________________________________________________________
+[ 1] By: mbeattie on 1997/03/28 13:17:33
+ Log: Perl 5.003 check-in
+ Branch: perl
+ + Artistic Changes Changes.Conf Configure Copying EXTERN.h
+ + INSTALL INTERN.h MANIFEST Makefile.SH README README.vms Todo
+ + XSUB.h av.c av.h cflags.SH config_H config_h.SH configpm
+ + configure cop.h cv.h deb.c doio.c doop.c dosish.h dump.c
+ + eg/ADB eg/README eg/changes eg/client eg/down eg/dus eg/findcp
+ + eg/findtar eg/g/gcp eg/g/gcp.man eg/g/ged eg/g/ghosts eg/g/gsh
+ + eg/g/gsh.man eg/muck eg/muck.man eg/myrup eg/nih eg/relink
+ + eg/rename eg/rmfrom eg/scan/scan_df eg/scan/scan_last
+ + eg/scan/scan_messages eg/scan/scan_passwd eg/scan/scan_ps
+ + eg/scan/scan_sudo eg/scan/scan_suid eg/scan/scanner eg/server
+ + eg/shmkill eg/sysvipc/README eg/sysvipc/ipcmsg
+ + eg/sysvipc/ipcsem eg/sysvipc/ipcshm eg/travesty eg/unuc
+ + eg/uudecode eg/van/empty eg/van/unvanish eg/van/vanexp
+ + eg/van/vanish eg/who eg/wrapsuid emacs/cperl-mode.el embed.h
+ + embed.pl ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
+ + ext/DB_File/DB_File_BS ext/DB_File/Makefile.PL
+ + ext/DB_File/typemap ext/DynaLoader/DynaLoader.pm
+ + ext/DynaLoader/Makefile.PL ext/DynaLoader/README
+ + ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_dld.xs
+ + ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_hpux.xs
+ + ext/DynaLoader/dl_next.xs ext/DynaLoader/dl_none.xs
+ + ext/DynaLoader/dl_os2.xs ext/DynaLoader/dl_vms.xs
+ + ext/DynaLoader/dlutils.c ext/Fcntl/Fcntl.pm ext/Fcntl/Fcntl.xs
+ + ext/Fcntl/Makefile.PL ext/FileHandle/FileHandle.pm
+ + ext/FileHandle/FileHandle.xs ext/FileHandle/Makefile.PL
+ + ext/GDBM_File/GDBM_File.pm ext/GDBM_File/GDBM_File.xs
+ + ext/GDBM_File/Makefile.PL ext/GDBM_File/typemap
+ + ext/NDBM_File/Makefile.PL ext/NDBM_File/NDBM_File.pm
+ + ext/NDBM_File/NDBM_File.xs ext/NDBM_File/hints/solaris.pl
+ + ext/NDBM_File/hints/svr4.pl ext/NDBM_File/typemap
+ + ext/ODBM_File/Makefile.PL ext/ODBM_File/ODBM_File.pm
+ + ext/ODBM_File/ODBM_File.xs ext/ODBM_File/hints/dec_osf.pl
+ + ext/ODBM_File/hints/sco.pl ext/ODBM_File/hints/solaris.pl
+ + ext/ODBM_File/hints/svr4.pl ext/ODBM_File/typemap
+ + ext/POSIX/Makefile.PL ext/POSIX/POSIX.pm ext/POSIX/POSIX.pod
+ + ext/POSIX/POSIX.xs ext/POSIX/typemap ext/SDBM_File/Makefile.PL
+ + ext/SDBM_File/SDBM_File.pm ext/SDBM_File/SDBM_File.xs
+ + ext/SDBM_File/sdbm/CHANGES ext/SDBM_File/sdbm/COMPARE
+ + ext/SDBM_File/sdbm/Makefile.PL ext/SDBM_File/sdbm/README
+ + ext/SDBM_File/sdbm/README.too ext/SDBM_File/sdbm/biblio
+ + ext/SDBM_File/sdbm/dba.c ext/SDBM_File/sdbm/dbd.c
+ + ext/SDBM_File/sdbm/dbe.1 ext/SDBM_File/sdbm/dbe.c
+ + ext/SDBM_File/sdbm/dbm.c ext/SDBM_File/sdbm/dbm.h
+ + ext/SDBM_File/sdbm/dbu.c ext/SDBM_File/sdbm/grind
+ + ext/SDBM_File/sdbm/hash.c ext/SDBM_File/sdbm/linux.patches
+ + ext/SDBM_File/sdbm/makefile.sdbm ext/SDBM_File/sdbm/pair.c
+ + ext/SDBM_File/sdbm/pair.h ext/SDBM_File/sdbm/readme.ms
+ + ext/SDBM_File/sdbm/readme.ps ext/SDBM_File/sdbm/sdbm.3
+ + ext/SDBM_File/sdbm/sdbm.c ext/SDBM_File/sdbm/sdbm.h
+ + ext/SDBM_File/sdbm/tune.h ext/SDBM_File/sdbm/util.c
+ + ext/SDBM_File/typemap ext/Safe/Makefile.PL ext/Safe/Safe.pm
+ + ext/Safe/Safe.xs ext/Socket/Makefile.PL ext/Socket/Socket.pm
+ + ext/Socket/Socket.xs ext/util/extliblist ext/util/make_ext
+ + ext/util/mkbootstrap form.h global.sym globals.c gv.c gv.h
+ + h2pl/README h2pl/cbreak.pl h2pl/cbreak2.pl h2pl/eg/sizeof.ph
+ + h2pl/eg/sys/errno.pl h2pl/eg/sys/ioctl.pl h2pl/eg/sysexits.pl
+ + h2pl/getioctlsizes h2pl/mksizes h2pl/mkvars h2pl/tcbreak
+ + h2pl/tcbreak2 handy.h hints/3b1.sh hints/3b1cc
+ + hints/README.hints hints/aix.sh hints/altos486.sh
+ + hints/apollo.sh hints/aux.sh hints/bsdos.sh hints/convexos.sh
+ + hints/cxux.sh hints/dec_osf.sh hints/dgux.sh hints/dnix.sh
+ + hints/dynix.sh hints/dynixptx.sh hints/epix.sh hints/esix4.sh
+ + hints/fps.sh hints/freebsd.sh hints/genix.sh
+ + hints/greenhills.sh hints/hpux.sh hints/i386.sh
+ + hints/irix_4.sh hints/irix_5.sh hints/irix_6.sh
+ + hints/irix_6_2.sh hints/isc.sh hints/isc_2.sh hints/linux.sh
+ + hints/machten.sh hints/machten_2.sh hints/mips.sh hints/mpc.sh
+ + hints/mpeix.sh hints/ncr_tower.sh hints/netbsd.sh
+ + hints/next_3.sh hints/next_3_0.sh hints/opus.sh hints/os2.sh
+ + hints/powerux.sh hints/sco.sh hints/sco_2_3_0.sh
+ + hints/sco_2_3_1.sh hints/sco_2_3_2.sh hints/sco_2_3_3.sh
+ + hints/sco_2_3_4.sh hints/solaris_2.sh hints/stellar.sh
+ + hints/sunos_4_0.sh hints/sunos_4_1.sh hints/svr4.sh
+ + hints/ti1500.sh hints/titanos.sh hints/ultrix_4.sh
+ + hints/unicos.sh hints/unisysdynix.sh hints/utekv.sh
+ + hints/uts.sh hv.c hv.h installman installperl interp.sym
+ + keywords.h keywords.pl lib/AnyDBM_File.pm lib/AutoLoader.pm
+ + lib/AutoSplit.pm lib/Benchmark.pm lib/Carp.pm lib/Cwd.pm
+ + lib/Devel/SelfStubber.pm lib/DirHandle.pm lib/English.pm
+ + lib/Env.pm lib/Exporter.pm lib/ExtUtils/Install.pm
+ + lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_OS2.pm
+ + lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_VMS.pm
+ + lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Manifest.pm
+ + lib/ExtUtils/Mkbootstrap.pm lib/ExtUtils/Mksymlists.pm
+ + lib/ExtUtils/testlib.pm lib/ExtUtils/typemap
+ + lib/ExtUtils/xsubpp lib/File/Basename.pm lib/File/CheckTree.pm
+ + lib/File/Copy.pm lib/File/Find.pm lib/File/Path.pm
+ + lib/FileCache.pm lib/Getopt/Long.pm lib/Getopt/Std.pm
+ + lib/I18N/Collate.pm lib/IPC/Open2.pm lib/IPC/Open3.pm
+ + lib/Math/BigFloat.pm lib/Math/BigInt.pm lib/Math/Complex.pm
+ + lib/Net/Ping.pm lib/Pod/Functions.pm lib/Pod/Text.pm
+ + lib/Search/Dict.pm lib/SelectSaver.pm lib/SelfLoader.pm
+ + lib/Shell.pm lib/Symbol.pm lib/Sys/Hostname.pm
+ + lib/Sys/Syslog.pm lib/Term/Cap.pm lib/Term/Complete.pm
+ + lib/Term/ReadLine.pm lib/Test/Harness.pm lib/Text/Abbrev.pm
+ + lib/Text/ParseWords.pm lib/Text/Soundex.pm lib/Text/Tabs.pm
+ + lib/Text/Wrap.pm lib/Tie/Hash.pm lib/Tie/Scalar.pm
+ + lib/Tie/SubstrHash.pm lib/Time/Local.pm lib/abbrev.pl
+ + lib/assert.pl lib/bigfloat.pl lib/bigint.pl lib/bigrat.pl
+ + lib/cacheout.pl lib/chat2.inter lib/chat2.pl lib/complete.pl
+ + lib/ctime.pl lib/diagnostics.pm lib/dotsh.pl lib/dumpvar.pl
+ + lib/exceptions.pl lib/fastcwd.pl lib/find.pl lib/finddepth.pl
+ + lib/flush.pl lib/ftp.pl lib/getcwd.pl lib/getopt.pl
+ + lib/getopts.pl lib/hostname.pl lib/importenv.pl lib/integer.pm
+ + lib/less.pm lib/lib.pm lib/look.pl lib/newgetopt.pl
+ + lib/open2.pl lib/open3.pl lib/overload.pm lib/perl5db.pl
+ + lib/pwd.pl lib/shellwords.pl lib/sigtrap.pm lib/splain
+ + lib/stat.pl lib/strict.pm lib/subs.pm lib/syslog.pl
+ + lib/tainted.pl lib/termcap.pl lib/timelocal.pl lib/validate.pl
+ + lib/vars.pm makeaperl.SH makedepend.SH makedir.SH malloc.c
+ + mg.c mg.h minimod.pl miniperlmain.c mv-if-diff myconfig op.c
+ + op.h opcode.h opcode.pl os2/Makefile.SHs os2/POSIX.mkfifo
+ + os2/README os2/README.old os2/diff.configure os2/diff.db_file
+ + os2/notes os2/os2.c os2/os2ish.h os2/perl2cmd.pl patchlevel.h
+ + perl.c perl.h perl_exp.SH perlsh perly.c perly.c.diff
+ + perly.fixer perly.h perly.y pod/Makefile pod/buildtoc
+ + pod/perl.pod pod/perlbook.pod pod/perlbot.pod pod/perlcall.pod
+ + pod/perldata.pod pod/perldebug.pod pod/perldiag.pod
+ + pod/perldsc.pod pod/perlembed.pod pod/perlform.pod
+ + pod/perlfunc.pod pod/perlguts.pod pod/perlipc.pod
+ + pod/perllol.pod pod/perlmod.pod pod/perlobj.pod pod/perlop.pod
+ + pod/perlovl.pod pod/perlpod.pod pod/perlre.pod pod/perlref.pod
+ + pod/perlrun.pod pod/perlsec.pod pod/perlstyle.pod
+ + pod/perlsub.pod pod/perlsyn.pod pod/perltie.pod
+ + pod/perltoc.pod pod/perltrap.pod pod/perlvar.pod
+ + pod/perlxs.pod pod/perlxstut.pod pod/pod2html.PL
+ + pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL pod/roffitall
+ + pod/splitman pod/splitpod pp.c pp.h pp_ctl.c pp_hot.c pp_sys.c
+ + proto.h regcomp.c regcomp.h regexec.c regexp.h run.c scope.c
+ + scope.h sv.c sv.h t/README t/TEST t/base/cond.t t/base/if.t
+ + t/base/lex.t t/base/pat.t t/base/term.t t/cmd/elsif.t
+ + t/cmd/for.t t/cmd/mod.t t/cmd/subval.t t/cmd/switch.t
+ + t/cmd/while.t t/comp/cmdopt.t t/comp/cpp.aux t/comp/cpp.t
+ + t/comp/decl.t t/comp/multiline.t t/comp/package.t
+ + t/comp/script.t t/comp/term.t t/harness t/io/argv.t t/io/dup.t
+ + t/io/fs.t t/io/inplace.t t/io/pipe.t t/io/print.t t/io/tell.t
+ + t/lib/anydbm.t t/lib/bigint.t t/lib/bigintpm.t
+ + t/lib/db-btree.t t/lib/db-hash.t t/lib/db-recno.t
+ + t/lib/dirhand.t t/lib/english.t t/lib/filehand.t t/lib/gdbm.t
+ + t/lib/ndbm.t t/lib/odbm.t t/lib/posix.t t/lib/safe.t
+ + t/lib/sdbm.t t/lib/socket.t t/lib/soundex.t t/op/append.t
+ + t/op/array.t t/op/auto.t t/op/chop.t t/op/cond.t t/op/delete.t
+ + t/op/do.t t/op/each.t t/op/eval.t t/op/exec.t t/op/exp.t
+ + t/op/flip.t t/op/fork.t t/op/glob.t t/op/goto.t t/op/groups.t
+ + t/op/index.t t/op/int.t t/op/join.t t/op/list.t t/op/local.t
+ + t/op/magic.t t/op/misc.t t/op/mkdir.t t/op/my.t t/op/oct.t
+ + t/op/ord.t t/op/overload.t t/op/pack.t t/op/pat.t t/op/push.t
+ + t/op/quotemeta.t t/op/rand.t t/op/range.t t/op/re_tests
+ + t/op/read.t t/op/readdir.t t/op/ref.t t/op/regexp.t
+ + t/op/repeat.t t/op/sleep.t t/op/sort.t t/op/split.t
+ + t/op/sprintf.t t/op/stat.t t/op/study.t t/op/subst.t
+ + t/op/substr.t t/op/time.t t/op/undef.t t/op/unshift.t
+ + t/op/vec.t t/op/write.t t/re_tests taint.c toke.c unixish.h
+ + util.c util.h utils/Makefile utils/c2ph.PL utils/h2ph.PL
+ + utils/h2xs.PL utils/perlbug.PL utils/perldoc.PL utils/pl2pm.PL
+ + vms/Makefile vms/config.vms vms/descrip.mms
+ + vms/ext/Filespec.pm vms/ext/Stdio/0README.txt
+ + vms/ext/Stdio/Makefile.PL vms/ext/Stdio/Stdio.pm
+ + vms/ext/Stdio/Stdio.xs vms/ext/Stdio/test.pl vms/fndvers.com
+ + vms/gen_shrfls.pl vms/genconfig.pl vms/genopt.com
+ + vms/make_command.com vms/mms2make.pl vms/myconfig.com
+ + vms/perlvms.pod vms/perly_c.vms vms/perly_h.vms
+ + vms/sockadapt.c vms/sockadapt.h vms/test.com vms/vms.c
+ + vms/vms_yfix.pl vms/vmsish.h vms/writemain.pl writemain.SH
+ + x2p/EXTERN.h x2p/INTERN.h x2p/Makefile.SH x2p/a2p.c x2p/a2p.h
+ + x2p/a2p.man x2p/a2p.y x2p/a2py.c x2p/cflags.SH
+ + x2p/find2perl.PL x2p/handy.h x2p/hash.c x2p/hash.h x2p/s2p.PL
+ + x2p/s2p.man x2p/str.c x2p/str.h x2p/util.c x2p/util.h
+ + x2p/walk.c
diff --git a/contrib/perl5/Configure b/contrib/perl5/Configure
index 5bcdbda..ddec97c 100755
--- a/contrib/perl5/Configure
+++ b/contrib/perl5/Configure
@@ -20,8 +20,8 @@
# $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
#
-# Generated on Tue Jul 7 10:10:21 EDT 1998 [metaconfig 3.0 PL70]
-# (with additional metaconfig patches by jhi@iki.fi)
+# Generated on Wed Mar 22 19:13:31 EET 2000 [metaconfig 3.0 PL70]
+# (with additional metaconfig patches by perlbug@perl.com)
cat >/tmp/c1$$ <<EOF
ARGGGHHHH!!!!!
@@ -108,6 +108,13 @@ if test -d /usr/lpp -a -f /usr/bin/bsh -a -f /usr/bin/uname; then
newsh=/usr/bin/bsh
fi
fi
+if test -f /osf_boot -a -f /usr/sbin/setld; then
+ if test X`/usr/bin/uname -s` = XOSF1; then
+ avoidksh="to avoid Digital UNIX' ksh"
+ newsh=/bin/sh
+ unset BIN_SH # if this is 'xpg4' sh will start up ksh
+ fi
+fi
case "$inksh/$needksh" in
/[a-z]*)
ENV=''
@@ -153,6 +160,9 @@ esac
test -d UU || mkdir UU
cd UU && rm -f ./*
+ccsymbols=''
+cppccsymbols=''
+cppsymbols=''
dynamic_ext=''
extensions=''
known_extensions=''
@@ -166,7 +176,6 @@ d_xenix=''
eunicefix=''
Mcc=''
ar=''
-full_ar=''
awk=''
bash=''
bison=''
@@ -234,6 +243,7 @@ uuname=''
vi=''
zcat=''
zip=''
+full_ar=''
full_sed=''
libswanted=''
hint=''
@@ -268,10 +278,14 @@ d_archlib=''
installarchlib=''
archname=''
myarchname=''
+d_atolf=''
+d_atoll=''
baserev=''
bin=''
binexp=''
installbin=''
+bincompat5005=''
+d_bincompat5005=''
byteorder=''
cc=''
gccversion=''
@@ -284,13 +298,16 @@ optimize=''
cf_email=''
cf_by=''
cf_time=''
+charsize=''
contains=''
cpp_stuff=''
cpplast=''
cppminus=''
cpprun=''
cppstdin=''
+crosscompile=''
d_access=''
+d_accessx=''
d_alarm=''
d_attribut=''
d_bcmp=''
@@ -317,11 +334,16 @@ d_dlopen=''
d_dlsymun=''
d_dosuid=''
d_suidsafe=''
+d_drand48proto=''
d_dup2=''
+d_eaccess=''
+d_endgrent=''
d_endhent=''
d_endnent=''
d_endpent=''
+d_endpwent=''
d_endsent=''
+d_endspent=''
d_fchmod=''
d_fchown=''
d_fcntl=''
@@ -332,18 +354,18 @@ d_fgetpos=''
d_flexfnam=''
d_flock=''
d_fork=''
+d_fpos64_t=''
+d_fs_data_s=''
+d_fseeko=''
d_fsetpos=''
-i_sysmount=''
d_fstatfs=''
-d_statfsflags=''
-i_sysstatvfs=''
-d_fstatvfs=''
-i_mntent=''
-d_getmntent=''
-d_hasmntopt=''
+d_ftello=''
d_ftime=''
d_gettimeod=''
d_Gconvert=''
+d_getcwd=''
+d_getfsstat=''
+d_getgrent=''
d_getgrps=''
d_gethbyaddr=''
d_gethbyname=''
@@ -354,6 +376,8 @@ d_phostname=''
d_uname=''
d_gethostprotos=''
d_getlogin=''
+d_getmnt=''
+d_getmntent=''
d_getnbyaddr=''
d_getnbyname=''
d_getnent=''
@@ -368,16 +392,23 @@ d_getprior=''
d_getpbyname=''
d_getpbynumber=''
d_getprotoprotos=''
+d_getpwent=''
d_getsent=''
d_getservprotos=''
+d_getspent=''
+d_getspnam=''
d_getsbyname=''
d_getsbyport=''
d_gnulibc=''
+d_hasmntopt=''
d_htonl=''
+d_iconv=''
d_inetaton=''
+d_int64_t=''
d_isascii=''
d_killpg=''
d_lchown=''
+d_ldbl_dig=''
d_link=''
d_locconv=''
d_lockf=''
@@ -385,23 +416,35 @@ d_longdbl=''
longdblsize=''
d_longlong=''
longlongsize=''
+d_lseekproto=''
d_lstat=''
+d_madvise=''
d_mblen=''
d_mbstowcs=''
d_mbtowc=''
+d_memchr=''
d_memcmp=''
d_memcpy=''
d_memmove=''
d_memset=''
d_mkdir=''
+d_mkdtemp=''
d_mkfifo=''
+d_mkstemp=''
+d_mkstemps=''
d_mktime=''
+d_mmap=''
+mmaptype=''
+d_mprotect=''
d_msg=''
d_msgctl=''
d_msgget=''
d_msgrcv=''
d_msgsnd=''
+d_msync=''
+d_munmap=''
d_nice=''
+d_off64_t=''
d_open3=''
d_fpathconf=''
d_pathconf=''
@@ -409,11 +452,12 @@ d_pause=''
d_pipe=''
d_poll=''
d_portable=''
+d_old_pthread_create_joinable=''
+old_pthread_create_joinable=''
d_pthread_yield=''
d_sched_yield=''
-d_pthreads_created_joinable=''
-i_pthread=''
-i_machcthreads=''
+sched_yield=''
+d_qgcvt=''
d_readdir=''
d_rewinddir=''
d_seekdir=''
@@ -431,6 +475,7 @@ d_semget=''
d_semop=''
d_setegid=''
d_seteuid=''
+d_setgrent=''
d_setgrps=''
d_sethent=''
d_setlinebuf=''
@@ -442,6 +487,7 @@ d_setpgrp2=''
d_bsdsetpgrp=''
d_setpgrp=''
d_setprior=''
+d_setpwent=''
d_setregid=''
d_setresgid=''
d_setresuid=''
@@ -450,6 +496,7 @@ d_setrgid=''
d_setruid=''
d_setsent=''
d_setsid=''
+d_setspent=''
d_setvbuf=''
d_sfio=''
usesfio=''
@@ -462,12 +509,24 @@ d_shmdt=''
d_shmget=''
d_sigaction=''
d_sigsetjmp=''
+d_msg_ctrunc=''
+d_msg_dontroute=''
+d_msg_oob=''
+d_msg_peek=''
+d_msg_proxy=''
d_oldsock=''
+d_scm_rights=''
d_socket=''
d_sockpair=''
sockethdr=''
socketlib=''
+d_socklen_t=''
+d_sqrtl=''
d_statblks=''
+d_statfs_f_flags=''
+d_statfs_s=''
+d_fstatvfs=''
+d_statvfs=''
d_stdio_cnt_lval=''
d_stdio_ptr_lval=''
d_stdiobase=''
@@ -487,7 +546,11 @@ d_sysernlst=''
d_syserrlst=''
d_strtod=''
d_strtol=''
+d_strtold=''
+d_strtoll=''
d_strtoul=''
+d_strtoull=''
+d_strtouq=''
d_strxfrm=''
d_symlink=''
d_syscall=''
@@ -495,6 +558,7 @@ d_sysconf=''
d_system=''
d_tcgetpgrp=''
d_tcsetpgrp=''
+d_telldirproto=''
d_time=''
timetype=''
clocktype=''
@@ -505,6 +569,7 @@ d_umask=''
d_semctl_semid_ds=''
d_semctl_semun=''
d_union_semun=''
+d_ustat=''
d_vfork=''
usevfork=''
d_voidsig=''
@@ -523,16 +588,22 @@ dlsrc=''
ld=''
lddlflags=''
usedl=''
-ebcdic=''
doublesize=''
+ebcdic=''
+fflushNULL=''
+fflushall=''
+fpossize=''
fpostype=''
+gidformat=''
+gidsign=''
+gidsize=''
gidtype=''
groupstype=''
h_fcntl=''
h_sysfile=''
+i_arpainet=''
db_hashtype=''
db_prefixtype=''
-i_arpainet=''
i_db=''
i_dbm=''
i_rpcsvcdbm=''
@@ -545,20 +616,25 @@ i_fcntl=''
i_float=''
i_gdbm=''
d_grpasswd=''
-d_setgrent=''
-d_getgrent=''
-d_endgrent=''
i_grp=''
+i_iconv=''
+i_ieeefp=''
+i_inttypes=''
i_limits=''
i_locale=''
+i_machcthr=''
i_malloc=''
i_math=''
i_memory=''
+i_mntent=''
i_ndbm=''
i_netdb=''
i_neterrno=''
+i_netinettcp=''
i_niin=''
i_sysin=''
+i_poll=''
+i_pthread=''
d_pwage=''
d_pwchange=''
d_pwclass=''
@@ -567,15 +643,16 @@ d_pwexpire=''
d_pwgecos=''
d_pwpasswd=''
d_pwquota=''
-d_setpwent=''
-d_getpwent=''
-d_endpwent=''
i_pwd=''
i_sfio=''
+i_shadow=''
+i_socks=''
i_stddef=''
i_stdlib=''
i_string=''
strings=''
+i_sunmath=''
+i_sysaccess=''
i_sysdir=''
i_sysfile=''
d_voidtty=''
@@ -583,14 +660,24 @@ i_bsdioctl=''
i_sysfilio=''
i_sysioctl=''
i_syssockio=''
+i_syslog=''
+i_sysmman=''
+i_sysmode=''
+i_sysmount=''
i_sysndir=''
i_sysparam=''
i_sysresrc=''
+i_syssecrt=''
i_sysselct=''
i_sysstat=''
+i_sysstatfs=''
+i_sysstatvfs=''
i_systimes=''
i_systypes=''
+i_sysuio=''
i_sysun=''
+i_sysutsname=''
+i_sysvfs=''
i_syswait=''
i_sgtty=''
i_termio=''
@@ -600,16 +687,24 @@ i_systimek=''
i_time=''
timeincl=''
i_unistd=''
+i_ustat=''
i_utime=''
i_values=''
i_stdarg=''
i_varargs=''
i_varhdr=''
i_vfork=''
+inc_version_list=''
+inc_version_list_init=''
+installprefix=''
+installprefixexp=''
+installstyle=''
+installusrbinperl=''
intsize=''
longsize=''
shortsize=''
libc=''
+ldlibpthname=''
libperl=''
shrpenv=''
useshrplib=''
@@ -620,7 +715,24 @@ plibpth=''
xlibpth=''
ignore_versioned_solibs=''
libs=''
+libsdirs=''
+libsfiles=''
+libsfound=''
+libspath=''
lns=''
+d_PRIEldbl=''
+d_PRIFldbl=''
+d_PRIGldbl=''
+d_PRIeldbl=''
+d_PRIfldbl=''
+d_PRIgldbl=''
+sPRIEldbl=''
+sPRIFldbl=''
+sPRIGldbl=''
+sPRIeldbl=''
+sPRIfldbl=''
+sPRIgldbl=''
+lseeksize=''
lseektype=''
make_set_make=''
d_mymalloc=''
@@ -644,6 +756,7 @@ models=''
small=''
split=''
modetype=''
+multiarch=''
mydomain=''
myhostname=''
phostname=''
@@ -665,12 +778,44 @@ ranlib=''
package=''
spackage=''
pager=''
-apiversion=''
+api_revision=''
+api_subversion=''
+api_version=''
+api_versionstring=''
patchlevel=''
+revision=''
subversion=''
version=''
+perl5=''
perladmin=''
perlpath=''
+d_nv_preserves_uv=''
+i16size=''
+i16type=''
+i32size=''
+i32type=''
+i64size=''
+i64type=''
+i8size=''
+i8type=''
+ivsize=''
+ivtype=''
+nvsize=''
+nvtype=''
+u16size=''
+u16type=''
+u32size=''
+u32type=''
+u64size=''
+u64type=''
+u8size=''
+u8type=''
+uvsize=''
+uvtype=''
+ivdformat=''
+uvoformat=''
+uvuformat=''
+uvxformat=''
pidtype=''
prefix=''
prefixexp=''
@@ -679,13 +824,34 @@ privlib=''
privlibexp=''
prototype=''
ptrsize=''
+d_PRIX64=''
+d_PRId64=''
+d_PRIi64=''
+d_PRIo64=''
+d_PRIu64=''
+d_PRIx64=''
+sPRIX64=''
+sPRId64=''
+sPRIi64=''
+sPRIo64=''
+sPRIu64=''
+sPRIx64=''
+d_quad=''
+quadkind=''
+quadtype=''
+uquadtype=''
+drand01=''
randbits=''
+randfunc=''
+randseedtype=''
+seedfunc=''
installscript=''
scriptdir=''
scriptdirexp=''
selectminbits=''
selecttype=''
sh=''
+sig_count=''
sig_name=''
sig_name_init=''
sig_num=''
@@ -693,11 +859,19 @@ sig_num_init=''
installsitearch=''
sitearch=''
sitearchexp=''
+installsitebin=''
+sitebin=''
+sitebinexp=''
installsitelib=''
sitelib=''
+sitelib_stem=''
sitelibexp=''
+siteprefix=''
+siteprefixexp=''
+sizesize=''
sizetype=''
so=''
+socksizetype=''
sharpbang=''
shsharp=''
spitshell=''
@@ -706,22 +880,54 @@ ssizetype=''
startperl=''
startsh=''
stdchar=''
+d_stdio_stream_array=''
+stdio_stream_array=''
sysman=''
trnl=''
+uidformat=''
+uidsign=''
+uidsize=''
uidtype=''
+archname64=''
+use64bitall=''
+use64bitint=''
+uselargefiles=''
+uselongdouble=''
+usemorebits=''
+usemultiplicity=''
nm_opt=''
nm_so_opt=''
runnm=''
usenm=''
useperlio=''
+usesocks=''
d_oldpthreads=''
+use5005threads=''
+useithreads=''
usethreads=''
incpath=''
-mips=''
mips_type=''
usrinc=''
+d_vendorarch=''
+installvendorarch=''
+vendorarch=''
+vendorarchexp=''
+d_vendorbin=''
+installvendorbin=''
+vendorbin=''
+vendorbinexp=''
+d_vendorlib=''
+installvendorlib=''
+vendorlib=''
+vendorlib_stem=''
+vendorlibexp=''
+usevendorprefix=''
+vendorprefix=''
+vendorprefixexp=''
defvoidused=''
voidflags=''
+pm_apiversion=''
+xs_apiversion=''
CONFIG=''
define='define'
@@ -729,12 +935,6 @@ undef='undef'
smallmach='pdp11 i8086 z8000 i80286 iAPX286'
rmlist=''
-installusrbinperl=''
-
-ccsymbols=''
-cppsymbols=''
-cppccsymbols=''
-
: We must find out about Eunice early
eunicefix=':'
if test -f /etc/unixtovms; then
@@ -744,84 +944,36 @@ if test -f /etc/unixtovms.exe; then
eunicefix=/etc/unixtovms.exe
fi
-: list of known cpp symbols, sorted alphabetically
-al="AMIX BIT_MSF BSD BSD4_3 BSD_NET2 CMU CRAY DGUX DOLPHIN DPX2"
-al="$al GO32 GOULD_PN HP700 I386 I80960 I960 Lynx M68000 M68K MACH"
-al="$al MIPSEB MIPSEL MSDOS MTXINU MULTIMAX MVS"
-al="$al M_COFF M_I186 M_I286 M_I386 M_I8086 M_I86 M_I86SM"
-al="$al M_SYS3 M_SYS5 M_SYSIII M_SYSV M_UNIX M_XENIX"
-al="$al NeXT OCS88 OSF1 PARISC PC532 PORTAR POSIX"
-al="$al PWB R3000 RES RISC6000 RT Sun386i SVR3 SVR4"
-al="$al SYSTYPE_BSD SYSTYPE_SVR4 SYSTYPE_SYSV Tek4132 Tek4300"
-al="$al UMAXV USGr4 USGr4_2 UTEK UTS UTek UnicomPBB UnicomPBD Utek"
-al="$al VMS Xenix286"
-al="$al _AIX _AIX32 _AIX370 _AIX41 _AM29000 _COFF _CRAY _CX_UX _EPI _POWER"
-al="$al _IBMESA _IBMR2 _M88K _M88KBCS_TARGET"
-al="$al _MIPSEB _MIPSEL _M_COFF _M_I86 _M_I86SM _M_SYS3"
-al="$al _M_SYS5 _M_SYSIII _M_SYSV _M_UNIX _M_XENIX _NLS _PGC_ _R3000"
-al="$al _SYSTYPE_BSD _SYSTYPE_BSD43 _SYSTYPE_SVR4"
-al="$al _SYSTYPE_SYSV _SYSV3 _U370 _UNICOS"
-al="$al __386BSD__ __BIG_ENDIAN __BIG_ENDIAN__ __BSD_4_4__"
-al="$al __DGUX__ __DPX2__ __H3050R __H3050RX"
-al="$al __LITTLE_ENDIAN __LITTLE_ENDIAN__ __MACH__"
-al="$al __MIPSEB __MIPSEB__ __MIPSEL __MIPSEL__"
-al="$al __Next__ __OSF1__ __PARAGON__ __PGC__ __PWB __STDC__"
-al="$al __SVR4_2__ __UMAXV__"
-al="$al ____386BSD____ __alpha __alpha__ __amiga"
-al="$al __bsd4_2 __bsd4_2__ __bsdi__ __convex__"
-al="$al __host_mips__"
-al="$al __hp9000s200 __hp9000s300 __hp9000s400 __hp9000s500"
-al="$al __hp9000s500 __hp9000s700 __hp9000s800"
-al="$al __hppa __hpux __hp_osf __i286 __i286__ __i386 __i386__"
-al="$al __i486 __i486__ __i860 __i860__ __ibmesa __ksr1__ __linux__"
-al="$al __m68k __m68k__ __m88100__ __m88k __m88k__"
-al="$al __mc68000 __mc68000__ __mc68020 __mc68020__"
-al="$al __mc68030 __mc68030__ __mc68040 __mc68040__"
-al="$al __mc88100 __mc88100__ __mips __mips__"
-al="$al __motorola__ __osf__ __pa_risc __sparc__ __stdc__"
-al="$al __sun __sun__ __svr3__ __svr4__ __ultrix __ultrix__"
-al="$al __unix __unix__ __uxpm__ __uxps__ __vax __vax__"
-al="$al _host_mips _mips _unix"
-al="$al a29k aegis aix aixpc alliant alpha am29000 amiga ansi ardent"
-al="$al apollo ardent att386 att3b"
-al="$al bsd bsd43 bsd4_2 bsd4_3 bsd4_4 bsdi bull"
-al="$al cadmus clipper concurrent convex cray ctix"
-al="$al dmert encore gcos gcx gimpel gould"
-al="$al hbullx20 hcx host_mips hp200 hp300 hp700 hp800"
-al="$al hp9000 hp9000s300 hp9000s400 hp9000s500"
-al="$al hp9000s700 hp9000s800 hp9k8 hppa hpux"
-al="$al i186 i286 i386 i486 i8086"
-al="$al i80960 i860 iAPX286 ibm ibm032 ibmrt interdata is68k"
-al="$al ksr1 linux luna luna88k m68k m88100 m88k"
-al="$al mc300 mc500 mc68000 mc68010 mc68020 mc68030"
-al="$al mc68040 mc68060 mc68k mc68k32 mc700"
-al="$al mc88000 mc88100 merlin mert mips mvs n16"
-al="$al ncl_el ncl_mr"
-al="$al news1500 news1700 news1800 news1900 news3700"
-al="$al news700 news800 news900 ns16000 ns32000"
-al="$al ns32016 ns32332 ns32k nsc32000 os osf"
-al="$al parisc pc532 pdp11 plexus posix pyr"
-al="$al riscix riscos scs sequent sgi sinix sony sony_news"
-al="$al sonyrisc sparc sparclite spectrum stardent stratos"
-al="$al sun sun3 sun386 svr4 sysV68 sysV88"
-al="$al titan tower tower32 tower32_200 tower32_600 tower32_700"
-al="$al tower32_800 tower32_850 tss u370 u3b u3b2 u3b20 u3b200"
-al="$al u3b20d u3b5 ultrix unix unixpc unos vax venix vms"
-al="$al xenix z8000"
-
i_whoami=''
+: set useposix=false in your hint file to disable the POSIX extension.
+useposix=true
+: set useopcode=false in your hint file to disable the Opcode extension.
+useopcode=true
+: Trailing extension. Override this in a hint file, if needed.
+_exe=''
+: Extra object files, if any, needed on this platform.
+archobjs=''
+: Possible local include directories to search.
+: Set locincpth to "" in a hint file to defeat local include searches.
+locincpth="/usr/local/include /opt/local/include /usr/gnu/include"
+locincpth="$locincpth /opt/gnu/include /usr/GNU/include /opt/GNU/include"
+:
+: no include file wanted by default
+inclwanted=''
+
+groupstype=''
: change the next line if compiling for Xenix/286 on Xenix/386
xlibpth='/usr/lib/386 /lib/386'
-
: Possible local library directories to search.
loclibpth="/usr/local/lib /opt/local/lib /usr/gnu/lib"
loclibpth="$loclibpth /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib"
: general looking path for locating libraries
-glibpth="/shlib /usr/shlib /lib/pa1.1 /usr/lib/large"
-glibpth="$glibpth /lib /usr/lib $xlibpth"
+glibpth="/usr/lib/large /lib /usr/lib $xlibpth"
glibpth="$glibpth /lib/large /usr/lib/small /lib/small"
glibpth="$glibpth /usr/ccs/lib /usr/ucblib /usr/local/lib"
+test -f /usr/shlib/libc.so && glibpth="/usr/shlib $glibpth"
+test -f /shlib/libc.so && glibpth="/shlib $glibpth"
: Private path used by Configure to find libraries. Its value
: is prepended to libpth. This variable takes care of special
@@ -830,34 +982,20 @@ plibpth=''
: default library list
libswanted=''
-: some systems want only to use the non-versioned libso:s
+: some systems want to use only the non-versioned libso:s
ignore_versioned_solibs=''
-: Possible local include directories to search.
-: Set locincpth to "" in a hint file to defeat local include searches.
-locincpth="/usr/local/include /opt/local/include /usr/gnu/include"
-locincpth="$locincpth /opt/gnu/include /usr/GNU/include /opt/GNU/include"
-:
-: no include file wanted by default
-inclwanted=''
-
-: Trailing extension. Override this in a hint file, if needed.
-_exe=''
-: Extra object files, if any, needed on this platform.
-archobjs=''
-groupstype=''
+: set usemultiplicity on the Configure command line to enable multiplicity.
+: set usesocks on the Configure command line to enable socks.
+: set usethreads on the Configure command line to enable threads.
: full support for void wanted by default
defvoidused=15
-: set useposix=false in your hint file to disable the POSIX extension.
-useposix=true
-: set useopcode=false in your hint file to disable the Opcode extension.
-useopcode=true
-: set usethreads on the Configure command line to enable threads.
: List of libraries we want.
: If anyone needs -lnet, put it in a hint file.
-libswanted='sfio socket inet nsl nm ndbm gdbm dbm db malloc dl'
-libswanted="$libswanted dld ld sun m c cposix posix ndir dir crypt"
-libswanted="$libswanted ucb bsd BSD PW x"
+libswanted='sfio socket bind inet nsl nm ndbm gdbm dbm db malloc dl'
+libswanted="$libswanted dld ld sun m c cposix posix"
+libswanted="$libswanted ndir dir crypt sec"
+libswanted="$libswanted ucb bsd BSD PW x iconv"
: We probably want to search /usr/shlib before most other libraries.
: This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist.
glibpth=`echo " $glibpth " | sed -e 's! /usr/shlib ! !'`
@@ -900,7 +1038,8 @@ case "$sh" in
$me: Fatal Error: I can't find a Bourne Shell anywhere.
Usually it's in /bin/sh. How did you even get this far?
-Please contact perlbug@perl.com and we'll try to straighten this all out.
+Please contact me (Perl Maintainers) at perlbug@perl.com and
+we'll try to straighten this all out.
EOM
exit 1
;;
@@ -985,7 +1124,7 @@ done
: produce awk script to parse command line options
cat >options.awk <<'EOF'
BEGIN {
- optstr = "dD:eEf:hKOrsSU:V"; # getopt-style specification
+ optstr = "A:dD:eEf:hKOrsSU:V"; # getopt-style specification
len = length(optstr);
for (i = 1; i <= len; i++) {
@@ -1045,7 +1184,7 @@ silent=''
extractsh=''
override=''
knowitall=''
-rm -f optdef.sh
+rm -f optdef.sh posthint.sh
cat >optdef.sh <<EOS
$startsh
EOS
@@ -1099,8 +1238,58 @@ while test $# -gt 0; do
esac
shift
;;
+ -A)
+ shift
+ xxx=''
+ yyy="$1"
+ zzz=''
+ uuu=undef
+ case "$yyy" in
+ *=*) zzz=`echo $yyy|sed 's!=.*!!'`
+ case "$zzz" in
+ *:*) zzz='' ;;
+ *) xxx=append
+ zzz=" "`echo $yyy|sed 's!^[^=]*=!!'`
+ yyy=`echo $yyy|sed 's!=.*!!'` ;;
+ esac
+ ;;
+ esac
+ case "$xxx" in
+ '') case "$yyy" in
+ *:*) xxx=`echo $yyy|sed 's!:.*!!'`
+ yyy=`echo $yyy|sed 's!^[^:]*:!!'`
+ zzz=`echo $yyy|sed 's!^[^=]*=!!'`
+ yyy=`echo $yyy|sed 's!=.*!!'` ;;
+ *) xxx=`echo $yyy|sed 's!:.*!!'`
+ yyy=`echo $yyy|sed 's!^[^:]*:!!'` ;;
+ esac
+ ;;
+ esac
+ case "$xxx" in
+ append)
+ echo "$yyy=\"\${$yyy}$zzz\"" >> posthint.sh ;;
+ clear)
+ echo "$yyy=''" >> posthint.sh ;;
+ define)
+ case "$zzz" in
+ '') zzz=define ;;
+ esac
+ echo "$yyy='$zzz'" >> posthint.sh ;;
+ eval)
+ echo "eval \"$yyy=$zzz\"" >> posthint.sh ;;
+ prepend)
+ echo "$yyy=\"$zzz\${$yyy}\"" >> posthint.sh ;;
+ undef)
+ case "$zzz" in
+ '') zzz="$uuu" ;;
+ esac
+ echo "$yyy=$zzz" >> posthint.sh ;;
+ *) echo "$me: unknown -A command '$xxx', ignoring -A $1" >&2 ;;
+ esac
+ shift
+ ;;
-V) echo "$me generated by metaconfig 3.0 PL70." >&2
- exit 0;;
+ exit 0;;
--) break;;
-*) echo "$me: unknown option $1" >&2; shift; error=true;;
*) break;;
@@ -1111,7 +1300,7 @@ case "$error" in
true)
cat >&2 <<EOM
Usage: $me [-dehrsEKOSV] [-f config.sh] [-D symbol] [-D symbol=value]
- [-U symbol] [-U symbol=]
+ [-U symbol] [-U symbol=] [-A command:symbol...]
-d : use defaults for all answers.
-e : go on without questioning past the production of config.sh.
-f : specify an alternate default configuration file.
@@ -1128,6 +1317,16 @@ Usage: $me [-dehrsEKOSV] [-f config.sh] [-D symbol] [-D symbol=value]
-U : undefine symbol:
-U symbol symbol gets the value 'undef'
-U symbol= symbol gets completely empty
+ -A : manipulate symbol after the platform specific hints have been applied:
+ -A symbol=value append " "value to symbol
+ -A append:symbol=value append value to symbol
+ -A define:symbol=value define symbol to have value
+ -A clear:symbol define symbol to be ''
+ -A define:symbol define symbol to be 'define'
+ -A eval:symbol=value define symbol to be eval of value
+ -A prepend:symbol=value prepend value to symbol
+ -A undef:symbol define symbol to be 'undef'
+ -A undef:symbol= define symbol to be ''
-V : print version number and exit (with a zero status).
EOM
exit 1
@@ -1153,6 +1352,8 @@ esac
: run the defines and the undefines, if any, but leave the file out there...
touch optdef.sh
. ./optdef.sh
+: create the posthint manipulation script and leave the file out there...
+touch posthint.sh
: set package name
package=perl5
@@ -1187,7 +1388,12 @@ esac
: Find the path to the source tree
case "$src" in
'') case "$0" in
- */*) src=`echo $0 | sed -e 's%/[^/][^/]*$%%'`;;
+ */*) src=`echo $0 | sed -e 's%/[^/][^/]*$%%'`
+ case "$src" in
+ /*) ;;
+ *) src=`cd ../$src && pwd` ;;
+ esac
+ ;;
*) src='.';;
esac;;
esac
@@ -1232,7 +1438,7 @@ esac
: script used to extract .SH files with variable substitutions
cat >extract <<'EOS'
-CONFIG=true
+CONFIGDOTSH=true
echo "Doing variable substitutions on .SH files..."
if test -f $src/MANIFEST; then
set x `awk '{print $1}' <$src/MANIFEST | grep '\.SH$'`
@@ -1368,7 +1574,7 @@ THIS PACKAGE SEEMS TO BE INCOMPLETE.
You have the option of continuing the configuration process, despite the
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 then contact perlbug@perl.com.
+and contact the author (perlbug@perl.com).
EOM
echo $n "Continue? [n] $c" >&4
@@ -1593,7 +1799,7 @@ Much effort has been expended to ensure that this shell script will run on any
Unix system. If despite that it blows up on yours, your best bet is to edit
Configure and run it again. If you can't run Configure for some reason,
you'll have to generate a config.sh file by hand. Whatever problems you
-have, let perlbug@perl.com know how I blew it.
+have, let me (perlbug@perl.com) know how I blew it.
This installation script affects things in two ways:
@@ -1665,7 +1871,6 @@ comm
cp
echo
expr
-find
grep
ls
make
@@ -1687,15 +1892,11 @@ date
egrep
gzip
less
-line
ln
more
nm
nroff
-perl
pg
-sendmail
-tee
test
uname
zip
@@ -1902,7 +2103,8 @@ $eunicefix tr
: Try to determine whether config.sh was made on this system
case "$config_sh" in
'')
-myuname=`( ($uname -a) 2>/dev/null || hostname) 2>&1`
+myuname=`$uname -a 2>/dev/null`
+$test -z "$myuname" && myuname=`hostname 2>/dev/null`
# tr '[A-Z]' '[a-z]' would not work in EBCDIC
# because the A-Z/a-z are not consecutive.
myuname=`echo $myuname | $sed -e 's/^[^=]*=//' -e 's/\///g' | \
@@ -1968,6 +2170,7 @@ EOM
$test -f /dnix && osname=dnix
$test -f /lynx.os && osname=lynxos
$test -f /unicos && osname=unicos && osvers=`$uname -r`
+ $test -f /unicosmk && osname=unicosmk && osvers=`$uname -r`
$test -f /unicosmk.ar && osname=unicosmk && osvers=`$uname -r`
$test -f /bin/mips && /bin/mips && osname=mips
$test -d /NextApps && set X `hostinfo | grep 'NeXT Mach.*:' | \
@@ -1987,12 +2190,14 @@ EOM
osvers="$2.$3"
fi
fi
+
$test -f /sys/posix.dll &&
$test -f /usr/bin/what &&
set X `/usr/bin/what /sys/posix.dll` &&
$test "$3" = UWIN &&
osname=uwin &&
osvers="$5"
+
if $test -f $uname; then
set X $myuname
shift
@@ -2013,7 +2218,7 @@ EOM
osvers=$tmp
elif $test -f /etc/kconfig; then
osname=isc
- if test "$lns" = "ln -s"; then
+ if test "$lns" = "$ln -s"; then
osvers=4
elif $contains _SYSV3 /usr/include/stdio.h > /dev/null 2>&1 ; then
osvers=3
@@ -2021,7 +2226,7 @@ EOM
osvers=2
fi
fi
- unset tmp
+ tmp=''
;;
pc*)
if test -n "$DJGPP"; then
@@ -2042,6 +2247,12 @@ EOM
*) osvers=$tmp;;
esac
;;
+ bsd386) osname=bsd386
+ osvers=`$uname -r`
+ ;;
+ cygwin*) osname=cygwin
+ osvers="$3"
+ ;;
*dc.osx) osname=dcosx
osvers="$3"
;;
@@ -2055,7 +2266,7 @@ EOM
osvers="$3"
;;
dynixptx*) osname=dynixptx
- osvers=`echo "$4" | $sed 's/^v//'`
+ osvers=`echo "$4"|sed 's/^v//'`
;;
freebsd) osname=freebsd
osvers="$3" ;;
@@ -2086,14 +2297,17 @@ EOM
*) osname=newsos ;;
esac
;;
- bsd386) osname=bsd386
- osvers=`$uname -r`
+ next*) osname=next ;;
+ POSIX-BC | posix-bc ) osname=posix-bc
+ osvers="$3"
;;
powerux | power_ux | powermax_os | powermaxos | \
powerunix | power_unix) osname=powerux
osvers="$3"
;;
- next*) osname=next ;;
+ qnx) osname=qnx
+ osvers="$4"
+ ;;
solaris) osname=solaris
case "$3" in
5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;;
@@ -2128,12 +2342,12 @@ EOM
mips) osname=mips_osf1 ;;
esac
;;
- uts) osname=uts
- osvers="$3"
- ;;
- qnx) osname=qnx
+ unixware) osname=svr5
osvers="$4"
;;
+ uts) osname=uts
+ osvers="$3"
+ ;;
$2) case "$osname" in
*isc*) ;;
*freebsd*) ;;
@@ -2207,12 +2421,12 @@ EOM
: specified already.
case "$hintfile" in
''|' ')
- file=`echo "${osname}_${osvers}" | $sed -e 's@\.@_@g' -e 's@_$@@'`
+ file=`echo "${osname}_${osvers}" | $sed -e 's%\.%_%g' -e 's%_$%%'`
: Also try without trailing minor version numbers.
- xfile=`echo $file | $sed -e 's@_[^_]*$@@'`
- xxfile=`echo $xfile | $sed -e 's@_[^_]*$@@'`
- xxxfile=`echo $xxfile | $sed -e 's@_[^_]*$@@'`
- xxxxfile=`echo $xxxfile | $sed -e 's@_[^_]*$@@'`
+ xfile=`echo $file | $sed -e 's%_[^_]*$%%'`
+ xxfile=`echo $xfile | $sed -e 's%_[^_]*$%%'`
+ xxxfile=`echo $xxfile | $sed -e 's%_[^_]*$%%'`
+ xxxxfile=`echo $xxxfile | $sed -e 's%_[^_]*$%%'`
case "$file" in
'') dflt=none ;;
*) case "$osvers" in
@@ -2263,7 +2477,7 @@ EOM
You may give one or more space-separated answers, or "none" if appropriate.
A well-behaved OS will have no hints, so answering "none" or just "Policy"
-is a good thing. DO NOT give a wrong version.
+is a good thing. DO NOT give a wrong version or a wrong OS.
EOM
@@ -2377,8 +2591,11 @@ none) osvers='' ;;
*) osvers="$ans" ;;
esac
+
+. ./posthint.sh
+
: who configured the system
-cf_time=`LC_ALL=C; export LC_ALL; $date 2>&1`
+cf_time=`LC_ALL=C; LANGUAGE=C; export LC_ALL; export LANGUAGE; $date 2>&1`
cf_by=`(logname) 2>/dev/null`
case "$cf_by" in
"")
@@ -2412,29 +2629,76 @@ $undef$define) . ./whoa; eval "$var=\$tu";;
*) eval "$var=$val";;
esac'
+case "$usethreads" in
+$define|true|[yY]*) dflt='y';;
+*) dflt='n';;
+esac
cat <<EOM
-Perl can be built to take advantage of threads, on some systems.
-To do so, Configure must be run with -Dusethreads.
+Perl can be built to take advantage of threads on some systems.
+To do so, Configure can be run with -Dusethreads.
Note that threading is a highly experimental feature, and
some known race conditions still remain. If you choose to try
it, be very sure to not actually deploy it for production
purposes. README.threads has more details, and is required
reading if you enable threads.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
EOM
-case "$usethreads" in
-$define|true|[yY]*) dflt='y';;
-*) dflt='n';;
-esac
rp='Build a threading Perl?'
. ./myread
case "$ans" in
-y|Y) val="$define" ;;
+y|Y) val="$define" ;;
*) val="$undef" ;;
esac
set usethreads
-eval $setvar
+eval $setvar
+
+case "$usethreads" in
+$define)
+ $cat <<EOM
+
+As of 5.5.640, Perl has two different internal threading implementations,
+the 5.005 version (5005threads) and an interpreter-based version
+(ithreads) that has one interpreter per thread. Both are very
+experimental. This arrangement exists to help developers work out
+which one is better.
+
+If you're a casual user, you probably don't want interpreter-threads
+at this time. There doesn't yet exist a way to create threads from
+within Perl in this model, i.e., "use Thread;" will NOT work.
+EOM
+ : Default to ithreads unless overridden on command line or with
+ : old config.sh
+ dflt='y'
+ case "$use5005threads" in
+ $define|true|[yY]*) dflt='n';;
+ esac
+ case "$useithreads" in
+ $undef|false|[nN]*) dflt='n';;
+ esac
+ rp='Use interpreter-based ithreads?'
+ . ./myread
+ case "$ans" in
+ y|Y) val="$define" ;;
+ *) val="$undef" ;;
+ esac
+ set useithreads
+ eval $setvar
+ : Now set use5005threads to the opposite value.
+ case "$useithreads" in
+ $define) val="$undef" ;;
+ *) val="$define" ;;
+ esac
+ set use5005threads
+ eval $setvar
+ ;;
+*)
+ useithreads="$undef"
+ use5005threads="$undef"
+ ;;
+esac
case "$d_oldpthreads" in
'') : Configure tests would be welcome here. For now, assume undef.
@@ -2451,744 +2715,45 @@ case "$usethreads" in
: user has specified that a threading perl is to be built,
: we may need to set or change some other defaults.
if $test -f usethreads.cbu; then
+ echo "Your platform has some specific hints for threaded builds, using them..."
. ./usethreads.cbu
- fi
- case "$osname" in
- aix|dec_osf|dos_djgpp|freebsd|hpux|irix|linux|next|openbsd|os2|solaris|vmesa)
- # Known thread-capable platforms.
- ;;
- *)
- cat >&4 <<EOM
-$osname is not known to support threads.
-Please let perlbug@perl.com know how to do that.
-
-Cannot continue, aborting.
-EOM
- exit 1
- ;;
- esac # $osname
- ;;
-esac # $usethreads
-
-: determine the architecture name
-echo " "
-if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then
- tarch=`arch`"-$osname"
-elif xxx=`./loc uname blurfl $pth`; $test -f "$xxx" ; then
- if uname -m > tmparch 2>&1 ; then
- tarch=`$sed -e 's/ *$//' -e 's/ /_/g' \
- -e 's/$/'"-$osname/" tmparch`
- else
- tarch="$osname"
- fi
- $rm -f tmparch
-else
- tarch="$osname"
-fi
-case "$myarchname" in
-''|"$tarch") ;;
-*)
- echo "(Your architecture name used to be $myarchname.)"
- archname=''
- ;;
-esac
-case "$archname" in
-'') dflt="$tarch";;
-*) dflt="$archname";;
-esac
-rp='What is your architecture name'
-. ./myread
-case "$usethreads" in
-$define) echo "Threads selected." >&4
- case "$ans" in
- *-thread) echo "...and architecture name already ends in -thread." >&4
- archname="$ans"
- ;;
- *) archname="$ans-thread"
- echo "...setting architecture name to $archname." >&4
- ;;
- esac
- ;;
-*) archname="$ans" ;;
-esac
-myarchname="$tarch"
-: is AFS running?
-echo " "
-case "$afs" in
-$define|true) afs=true ;;
-$undef|false) afs=false ;;
-*) if test -d /afs; then
- afs=true
- else
- afs=false
- fi
- ;;
-esac
-if $afs; then
- echo "AFS may be running... I'll be extra cautious then..." >&4
-else
- echo "AFS does not seem to be running..." >&4
-fi
-
-: decide how portable to be. Allow command line overrides.
-case "$d_portable" in
-"$undef") ;;
-*) d_portable="$define" ;;
-esac
-
-: set up shell script to do ~ expansion
-cat >filexp <<EOSS
-$startsh
-: expand filename
-case "\$1" in
- ~/*|~)
- echo \$1 | $sed "s|~|\${HOME-\$LOGDIR}|"
- ;;
- ~*)
- if $test -f /bin/csh; then
- /bin/csh -f -c "glob \$1"
- failed=\$?
- echo ""
- exit \$failed
else
- name=\`$expr x\$1 : '..\([^/]*\)'\`
- dir=\`$sed -n -e "/^\${name}:/{s/^[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\).*"'\$'"/\1/" -e p -e q -e '}' </etc/passwd\`
- if $test ! -d "\$dir"; then
- me=\`basename \$0\`
- echo "\$me: can't locate home directory for: \$name" >&2
- exit 1
- fi
- case "\$1" in
- */*)
- echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\`
- ;;
- *)
- echo \$dir
- ;;
- esac
- fi
- ;;
-*)
- echo \$1
- ;;
-esac
-EOSS
-chmod +x filexp
-$eunicefix filexp
-
-: now set up to get a file name
-cat <<EOS >getfile
-$startsh
-EOS
-cat <<'EOSC' >>getfile
-tilde=''
-fullpath=''
-already=''
-skip=''
-none_ok=''
-exp_file=''
-nopath_ok=''
-orig_rp="$rp"
-orig_dflt="$dflt"
-
-case "$fn" in
-*\(*)
- expr $fn : '.*(\(.*\)).*' | tr ',' $trnl >getfile.ok
- fn=`echo $fn | sed 's/(.*)//'`
- ;;
-esac
-
-case "$fn" in
-*:*)
- loc_file=`expr $fn : '.*:\(.*\)'`
- fn=`expr $fn : '\(.*\):.*'`
- ;;
-esac
-
-case "$fn" in
-*~*) tilde=true;;
-esac
-case "$fn" in
-*/*) fullpath=true;;
-esac
-case "$fn" in
-*+*) skip=true;;
-esac
-case "$fn" in
-*n*) none_ok=true;;
-esac
-case "$fn" in
-*e*) exp_file=true;;
-esac
-case "$fn" in
-*p*) nopath_ok=true;;
-esac
-
-case "$fn" in
-*f*) type='File';;
-*d*) type='Directory';;
-*l*) type='Locate';;
-esac
-
-what="$type"
-case "$what" in
-Locate) what='File';;
-esac
-
-case "$exp_file" in
-'')
- case "$d_portable" in
- "$define") ;;
- *) exp_file=true;;
- esac
- ;;
-esac
-
-cd ..
-while test "$type"; do
- redo=''
- rp="$orig_rp"
- dflt="$orig_dflt"
- case "$tilde" in
- true) rp="$rp (~name ok)";;
- esac
- . UU/myread
- if test -f UU/getfile.ok && \
- $contains "^$ans\$" UU/getfile.ok >/dev/null 2>&1
- then
- value="$ans"
- ansexp="$ans"
- break
- fi
- case "$ans" in
- none)
- value=''
- ansexp=''
- case "$none_ok" in
- true) type='';;
- esac
- ;;
- *)
- case "$tilde" in
- '') value="$ans"
- ansexp="$ans";;
- *)
- value=`UU/filexp $ans`
- case $? in
- 0)
- if test "$ans" != "$value"; then
- echo "(That expands to $value on this system.)"
- fi
- ;;
- *) value="$ans";;
- esac
- ansexp="$value"
- case "$exp_file" in
- '') value="$ans";;
- esac
- ;;
- esac
- case "$fullpath" in
- true)
- case "$ansexp" in
- /*) value="$ansexp" ;;
- *)
- redo=true
- case "$already" in
- true)
- echo "I shall only accept a full path name, as in /bin/ls." >&4
- echo "Use a ! shell escape if you wish to check pathnames." >&4
- ;;
- *)
- echo "Please give a full path name, starting with slash." >&4
- case "$tilde" in
- true)
- echo "Note that using ~name is ok provided it expands well." >&4
- already=true
- ;;
- esac
- esac
- ;;
- esac
- ;;
- esac
- case "$redo" in
- '')
- case "$type" in
- File)
- if test -f "$ansexp"; then
- type=''
- elif test -r "$ansexp" || (test -h "$ansexp") >/dev/null 2>&1
- then
- echo "($value is not a plain file, but that's ok.)"
- type=''
- fi
- ;;
- Directory)
- if test -d "$ansexp"; then
- type=''
- fi
- ;;
- Locate)
- if test -d "$ansexp"; then
- echo "(Looking for $loc_file in directory $value.)"
- value="$value/$loc_file"
- ansexp="$ansexp/$loc_file"
- fi
- if test -f "$ansexp"; then
- type=''
- fi
- case "$nopath_ok" in
- true) case "$value" in
- */*) ;;
- *) echo "Assuming $value will be in people's path."
- type=''
- ;;
- esac
- ;;
- esac
- ;;
- esac
-
- case "$skip" in
- true) type='';
- esac
-
- case "$type" in
- '') ;;
- *)
- if test "$fastread" = yes; then
- dflt=y
- else
- dflt=n
- fi
- rp="$what $value doesn't exist. Use that name anyway?"
- . UU/myread
- dflt=''
- case "$ans" in
- y*) type='';;
- *) echo " ";;
- esac
- ;;
- esac
- ;;
- esac
- ;;
- esac
-done
-cd UU
-ans="$value"
-rp="$orig_rp"
-dflt="$orig_dflt"
-rm -f getfile.ok
-EOSC
-
-: determine root of directory hierarchy where package will be installed.
-case "$prefix" in
-'')
- dflt=`./loc . /usr/local /usr/local /local /opt /usr`
- ;;
-*)
- dflt="$prefix"
- ;;
-esac
-$cat <<EOM
-
-By default, $package will be installed in $dflt/bin, manual
-pages under $dflt/man, etc..., i.e. with $dflt as prefix for
-all installation directories. Typically set to /usr/local, but you
-may choose /usr if you wish to install $package among your system
-binaries. If you wish to have binaries under /bin but manual pages
-under /usr/local/man, that's ok: you will be prompted separately
-for each of the installation directories, the prefix being only used
-to set the defaults.
-
-EOM
-fn=d~
-rp='Installation prefix to use?'
-. ./getfile
-oldprefix=''
-case "$prefix" in
-'') ;;
-*)
- case "$ans" in
- "$prefix") ;;
- *) oldprefix="$prefix";;
- esac
- ;;
-esac
-prefix="$ans"
-prefixexp="$ansexp"
-
-: set the prefixit variable, to compute a suitable default value
-prefixit='case "$3" in
-""|none)
- case "$oldprefix" in
- "") eval "$1=\"\$$2\"";;
- *)
- case "$3" in
- "") eval "$1=";;
- none)
- eval "tp=\"\$$2\"";
- case "$tp" in
- ""|" ") eval "$1=\"\$$2\"";;
- *) eval "$1=";;
- esac;;
- esac;;
- esac;;
-*)
- eval "tp=\"$oldprefix-\$$2-\""; eval "tp=\"$tp\"";
- case "$tp" in
- --|/*--|\~*--) eval "$1=\"$prefix/$3\"";;
- /*-$oldprefix/*|\~*-$oldprefix/*)
- eval "$1=\`echo \$$2 | sed \"s,^$oldprefix,$prefix,\"\`";;
- *) eval "$1=\"\$$2\"";;
- esac;;
-esac'
-
-: set the base revision
-baserev=5.0
-
-: get the patchlevel
-echo " "
-echo "Getting the current patchlevel..." >&4
-if $test -r $rsrc/patchlevel.h;then
- patchlevel=`awk '/define[ ]+PATCHLEVEL/ {print $3}' $rsrc/patchlevel.h`
- subversion=`awk '/define[ ]+SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
-else
- patchlevel=0
- subversion=0
-fi
-$echo $n "(You have $package" $c
-case "$package" in
-"*$baserev") ;;
-*) $echo $n " $baserev" $c ;;
-esac
-$echo $n " patchlevel $patchlevel" $c
-test 0 -eq "$subversion" || $echo $n " subversion $subversion" $c
-echo ".)"
-
-if test 0 -eq "$subversion"; then
- version=`LC_ALL=C; export LC_ALL; \
- echo $baserev $patchlevel | \
- $awk '{ printf "%.3f\n", $1 + $2/1000.0 }'`
-else
- version=`LC_ALL=C; export LC_ALL; \
- echo $baserev $patchlevel $subversion | \
- $awk '{ printf "%.5f\n", $1 + $2/1000.0 + $3/100000.0 }'`
-fi
-: Figure out perl API version. Perhaps this should be in patchlevel.h
-if test "$subversion" -lt 50; then
- apiversion=`LC_ALL=C; export LC_ALL; \
- echo $baserev $patchlevel | \
- $awk '{ printf "%.3f\n", $1 + $2/1000.0 }'`
-else
- apiversion="$version"
-fi
-
-: determine where private library files go
-: Usual default is /usr/local/lib/perl5/$version.
-: Also allow things like /opt/perl/lib/$version, since
-: /opt/perl/lib/perl5... would be redundant.
-case "$prefix" in
-*perl*) set dflt privlib lib/$version ;;
-*) set dflt privlib lib/$package/$version ;;
-esac
-eval $prefixit
-$cat <<EOM
-
-There are some auxiliary files for $package that need to be put into a
-private library directory that is accessible by everyone.
-
-EOM
-fn=d~+
-rp='Pathname where the private library files will reside?'
-. ./getfile
-if $test "X$privlibexp" != "X$ansexp"; then
- installprivlib=''
-fi
-privlib="$ans"
-privlibexp="$ansexp"
-if $afs; then
- $cat <<EOM
-
-Since you are running AFS, I need to distinguish the directory in which
-private files reside from the directory in which they are installed (and from
-which they are presumably copied to the former directory by occult means).
-
-EOM
- case "$installprivlib" in
- '') dflt=`echo $privlibexp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installprivlib";;
- esac
- fn=de~
- rp='Where will private files be installed?'
- . ./getfile
- installprivlib="$ans"
-else
- installprivlib="$privlibexp"
-fi
-
-: set the prefixup variable, to restore leading tilda escape
-prefixup='case "$prefixexp" in
-"$prefix") ;;
-*) eval "$1=\`echo \$$1 | sed \"s,^$prefixexp,$prefix,\"\`";;
-esac'
-
-: determine where public architecture dependent libraries go
-set archlib archlib
-eval $prefixit
-: privlib default is /usr/local/lib/$package/$version
-: archlib default is /usr/local/lib/$package/$version/$archname
-: privlib may have an optional trailing /share.
-tdflt=`echo $privlib | $sed 's,/share$,,'`
-tdflt=$tdflt/$archname
-case "$archlib" in
-'') dflt=$tdflt
- ;;
-*) dflt="$archlib"
- ;;
-esac
-cat <<EOM
-
-$spackage contains architecture-dependent library files. If you are
-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.
-
-EOM
-fn=d+~
-rp='Where do you want to put the public architecture-dependent libraries?'
-. ./getfile
-archlib="$ans"
-archlibexp="$ansexp"
-
-if $afs; then
- $cat <<EOM
-
-Since you are running AFS, I need to distinguish the directory in
-which architecture-dependent library files reside from the directory
-in which they are installed (and from which they are presumably copied
-to the former directory by occult means).
-
+ $cat <<EOM
+(Your platform doesn't have any specific hints for threaded builds.
+ Assuming POSIX threads, then.)
EOM
- case "$installarchlib" in
- '') dflt=`echo $archlibexp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installarchlib";;
- esac
- fn=de~
- rp='Where will architecture-dependent library files be installed?'
- . ./getfile
- installarchlib="$ans"
-else
- installarchlib="$archlibexp"
-fi
-if $test X"$archlib" = X"$privlib"; then
- d_archlib="$undef"
-else
- d_archlib="$define"
-fi
-
-: make some quick guesses about what we are up against
-echo " "
-$echo $n "Hmm... $c"
-echo exit 1 >bsd
-echo exit 1 >usg
-echo exit 1 >v7
-echo exit 1 >osf1
-echo exit 1 >eunice
-echo exit 1 >xenix
-echo exit 1 >venix
-echo exit 1 >os2
-d_bsd="$undef"
-$cat /usr/include/signal.h /usr/include/sys/signal.h >foo 2>/dev/null
-if test -f /osf_boot || $contains 'OSF/1' /usr/include/ctype.h >/dev/null 2>&1
-then
- echo "Looks kind of like an OSF/1 system, but we'll see..."
- echo exit 0 >osf1
-elif test `echo abc | tr a-z A-Z` = Abc ; then
- xxx=`./loc addbib blurfl $pth`
- if $test -f $xxx; then
- echo "Looks kind of like a USG system with BSD features, but we'll see..."
- echo exit 0 >bsd
- echo exit 0 >usg
- else
- if $contains SIGTSTP foo >/dev/null 2>&1 ; then
- echo "Looks kind of like an extended USG system, but we'll see..."
- else
- echo "Looks kind of like a USG system, but we'll see..."
- fi
- echo exit 0 >usg
fi
-elif $contains SIGTSTP foo >/dev/null 2>&1 ; then
- echo "Looks kind of like a BSD system, but we'll see..."
- d_bsd="$define"
- echo exit 0 >bsd
-else
- echo "Looks kind of like a Version 7 system, but we'll see..."
- echo exit 0 >v7
-fi
-case "$eunicefix" in
-*unixtovms*)
- $cat <<'EOI'
-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.
-EOI
- echo exit 0 >eunice
- d_eunice="$define"
-: it so happens the Eunice I know will not run shell scripts in Unix format
- ;;
-*)
- echo " "
- echo "Congratulations. You aren't running Eunice."
- d_eunice="$undef"
;;
esac
-: Detect OS2. The p_ variable is set above in the Head.U unit.
-case "$p_" in
-:) ;;
-*)
- $cat <<'EOI'
-I have the feeling something is not exactly right, however...don't tell me...
-lemme think...does HAL ring a bell?...no, of course, you're only running OS/2!
-EOI
- echo exit 0 >os2
- ;;
-esac
-if test -f /xenix; then
- echo "Actually, this looks more like a XENIX system..."
- echo exit 0 >xenix
- d_xenix="$define"
-else
- echo " "
- echo "It's not Xenix..."
- d_xenix="$undef"
-fi
-chmod +x xenix
-$eunicefix xenix
-if test -f /venix; then
- echo "Actually, this looks more like a VENIX system..."
- echo exit 0 >venix
-else
- echo " "
- if ./xenix; then
- : null
- else
- echo "Nor is it Venix..."
- fi
-fi
-chmod +x bsd usg v7 osf1 eunice xenix venix os2
-$eunicefix bsd usg v7 osf1 eunice xenix venix os2
-$rm -f foo
-: see if setuid scripts can be secure
-$cat <<EOM
-
-Some kernels have a bug that prevents setuid #! scripts from being
-secure. Some sites have disabled setuid #! scripts because of this.
-
-First let's decide if your kernel supports secure setuid #! scripts.
-(If setuid #! scripts would be secure but have been disabled anyway,
-don't say that they are secure if asked.)
+cat <<EOM
+Perl can be built so that multiple Perl interpreters can coexist
+within the same Perl executable.
EOM
-val="$undef"
-if $test -d /dev/fd; then
- echo "#!$ls" >reflect
- chmod +x,u+s reflect
- ./reflect >flect 2>&1
- if $contains "/dev/fd" flect >/dev/null; then
- echo "Congratulations, your kernel has secure setuid scripts!" >&4
- val="$define"
- else
- $cat <<EOM
-If you are not sure if they are secure, I can check but I'll need a
-username and password different from the one you are using right now.
-If you don't have such a username or don't want me to test, simply
-enter 'none'.
-
+case "$useithreads" in
+$define)
+ cat <<EOM
+This multiple interpreter support is required for interpreter-based threads.
EOM
- rp='Other username to test security of setuid scripts with?'
- dflt='none'
- . ./myread
- case "$ans" in
- n|none)
- case "$d_suidsafe" in
- '') echo "I'll assume setuid scripts are *not* secure." >&4
- dflt=n;;
- "$undef")
- echo "Well, the $hint value is *not* secure." >&4
- dflt=n;;
- *) echo "Well, the $hint value *is* secure." >&4
- dflt=y;;
- esac
- ;;
- *)
- $rm -f reflect flect
- echo "#!$ls" >reflect
- chmod +x,u+s reflect
- echo >flect
- chmod a+w flect
- echo '"su" will (probably) prompt you for '"$ans's password."
- su $ans -c './reflect >flect'
- if $contains "/dev/fd" flect >/dev/null; then
- echo "Okay, it looks like setuid scripts are secure." >&4
- dflt=y
- else
- echo "I don't think setuid scripts are secure." >&4
- dflt=n
- fi
- ;;
- esac
- rp='Does your kernel have *secure* setuid scripts?'
- . ./myread
- case "$ans" in
- [yY]*) val="$define";;
- *) val="$undef";;
- esac
- fi
-else
- echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4
- echo "(That's for file descriptors, not floppy disks.)"
- val="$undef"
-fi
-set d_suidsafe
-eval $setvar
-
-$rm -f reflect flect
-
-: now see if they want to do setuid emulation
-echo " "
-val="$undef"
-case "$d_suidsafe" in
-"$define")
- val="$undef"
- echo "No need to emulate SUID scripts since they are secure here." >& 4
+ val="$define"
;;
-*)
- $cat <<EOM
-Some systems have disabled setuid scripts, especially systems where
-setuid scripts cannot be secure. On systems where setuid scripts have
-been disabled, the setuid/setgid bits on scripts are currently
-useless. It is possible for $package to detect those bits and emulate
-setuid/setgid in a secure fashion. This emulation will only work if
-setuid scripts have been disabled in your kernel.
-
-EOM
- case "$d_dosuid" in
- "$define") dflt=y ;;
- *) dflt=n ;;
+*) case "$usemultiplicity" in
+ $define|true|[yY]*) dflt='y';;
+ *) dflt='n';;
esac
- rp="Do you want to do setuid/setgid emulation?"
+ echo " "
+ echo "If this doesn't make any sense to you, just accept the default '$dflt'."
+ rp='Build Perl for multiplicity?'
. ./myread
case "$ans" in
- [yY]*) val="$define";;
- *) val="$undef";;
+ y|Y) val="$define" ;;
+ *) val="$undef" ;;
esac
;;
esac
-set d_dosuid
+set usemultiplicity
eval $setvar
: determine where manual pages are on this system
@@ -3355,6 +2920,98 @@ none)
esac
$rm -f pdp11.* pdp11
+: make some quick guesses about what we are up against
+echo " "
+$echo $n "Hmm... $c"
+echo exit 1 >bsd
+echo exit 1 >usg
+echo exit 1 >v7
+echo exit 1 >osf1
+echo exit 1 >eunice
+echo exit 1 >xenix
+echo exit 1 >venix
+echo exit 1 >os2
+d_bsd="$undef"
+$cat /usr/include/signal.h /usr/include/sys/signal.h >foo 2>/dev/null
+if test -f /osf_boot || $contains 'OSF/1' /usr/include/ctype.h >/dev/null 2>&1
+then
+ echo "Looks kind of like an OSF/1 system, but we'll see..."
+ echo exit 0 >osf1
+elif test `echo abc | tr a-z A-Z` = Abc ; then
+ xxx=`./loc addbib blurfl $pth`
+ if $test -f $xxx; then
+ echo "Looks kind of like a USG system with BSD features, but we'll see..."
+ echo exit 0 >bsd
+ echo exit 0 >usg
+ else
+ if $contains SIGTSTP foo >/dev/null 2>&1 ; then
+ echo "Looks kind of like an extended USG system, but we'll see..."
+ else
+ echo "Looks kind of like a USG system, but we'll see..."
+ fi
+ echo exit 0 >usg
+ fi
+elif $contains SIGTSTP foo >/dev/null 2>&1 ; then
+ echo "Looks kind of like a BSD system, but we'll see..."
+ d_bsd="$define"
+ echo exit 0 >bsd
+else
+ echo "Looks kind of like a Version 7 system, but we'll see..."
+ echo exit 0 >v7
+fi
+case "$eunicefix" in
+*unixtovms*)
+ $cat <<'EOI'
+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.
+EOI
+ echo exit 0 >eunice
+ d_eunice="$define"
+: it so happens the Eunice I know will not run shell scripts in Unix format
+ ;;
+*)
+ echo " "
+ echo "Congratulations. You aren't running Eunice."
+ d_eunice="$undef"
+ ;;
+esac
+: Detect OS2. The p_ variable is set above in the Head.U unit.
+case "$p_" in
+:) ;;
+*)
+ $cat <<'EOI'
+I have the feeling something is not exactly right, however...don't tell me...
+lemme think...does HAL ring a bell?...no, of course, you're only running OS/2!
+EOI
+ echo exit 0 >os2
+ ;;
+esac
+if test -f /xenix; then
+ echo "Actually, this looks more like a XENIX system..."
+ echo exit 0 >xenix
+ d_xenix="$define"
+else
+ echo " "
+ echo "It's not Xenix..."
+ d_xenix="$undef"
+fi
+chmod +x xenix
+$eunicefix xenix
+if test -f /venix; then
+ echo "Actually, this looks more like a VENIX system..."
+ echo exit 0 >venix
+else
+ echo " "
+ if ./xenix; then
+ : null
+ else
+ echo "Nor is it Venix..."
+ fi
+fi
+chmod +x bsd usg v7 osf1 eunice xenix venix os2
+$eunicefix bsd usg v7 osf1 eunice xenix venix os2
+$rm -f foo
+
: see if we need a special compiler
echo " "
if ./usg; then
@@ -3421,11 +3078,12 @@ int main() {
exit(0);
}
EOM
-if $cc -o gccvers gccvers.c >/dev/null 2>&1; then
+if $cc $ldflags -o gccvers gccvers.c; then
gccversion=`./gccvers`
case "$gccversion" in
'') echo "You are not using GNU cc." ;;
- *) echo "You are using GNU cc $gccversion." ;;
+ *) echo "You are using GNU cc $gccversion."
+ ;;
esac
else
echo " "
@@ -3443,6 +3101,285 @@ case "$gccversion" in
1*) cpp=`./loc gcc-cpp $cpp $pth` ;;
esac
+: decide how portable to be. Allow command line overrides.
+case "$d_portable" in
+"$undef") ;;
+*) d_portable="$define" ;;
+esac
+
+: set up shell script to do ~ expansion
+cat >filexp <<EOSS
+$startsh
+: expand filename
+case "\$1" in
+ ~/*|~)
+ echo \$1 | $sed "s|~|\${HOME-\$LOGDIR}|"
+ ;;
+ ~*)
+ if $test -f /bin/csh; then
+ /bin/csh -f -c "glob \$1"
+ failed=\$?
+ echo ""
+ exit \$failed
+ else
+ name=\`$expr x\$1 : '..\([^/]*\)'\`
+ dir=\`$sed -n -e "/^\${name}:/{s/^[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\).*"'\$'"/\1/" -e p -e q -e '}' </etc/passwd\`
+ if $test ! -d "\$dir"; then
+ me=\`basename \$0\`
+ echo "\$me: can't locate home directory for: \$name" >&2
+ exit 1
+ fi
+ case "\$1" in
+ */*)
+ echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\`
+ ;;
+ *)
+ echo \$dir
+ ;;
+ esac
+ fi
+ ;;
+*)
+ echo \$1
+ ;;
+esac
+EOSS
+chmod +x filexp
+$eunicefix filexp
+
+: now set up to get a file name
+cat <<EOS >getfile
+$startsh
+EOS
+cat <<'EOSC' >>getfile
+tilde=''
+fullpath=''
+already=''
+skip=''
+none_ok=''
+exp_file=''
+nopath_ok=''
+orig_rp="$rp"
+orig_dflt="$dflt"
+case "$gfpth" in
+'') gfpth='.' ;;
+esac
+
+case "$fn" in
+*\(*)
+ expr $fn : '.*(\(.*\)).*' | tr ',' $trnl >getfile.ok
+ fn=`echo $fn | sed 's/(.*)//'`
+ ;;
+esac
+
+case "$fn" in
+*:*)
+ loc_file=`expr $fn : '.*:\(.*\)'`
+ fn=`expr $fn : '\(.*\):.*'`
+ ;;
+esac
+
+case "$fn" in
+*~*) tilde=true;;
+esac
+case "$fn" in
+*/*) fullpath=true;;
+esac
+case "$fn" in
+*+*) skip=true;;
+esac
+case "$fn" in
+*n*) none_ok=true;;
+esac
+case "$fn" in
+*e*) exp_file=true;;
+esac
+case "$fn" in
+*p*) nopath_ok=true;;
+esac
+
+case "$fn" in
+*f*) type='File';;
+*d*) type='Directory';;
+*l*) type='Locate';;
+esac
+
+what="$type"
+case "$what" in
+Locate) what='File';;
+esac
+
+case "$exp_file" in
+'')
+ case "$d_portable" in
+ "$define") ;;
+ *) exp_file=true;;
+ esac
+ ;;
+esac
+
+cd ..
+while test "$type"; do
+ redo=''
+ rp="$orig_rp"
+ dflt="$orig_dflt"
+ case "$tilde" in
+ true) rp="$rp (~name ok)";;
+ esac
+ . UU/myread
+ if test -f UU/getfile.ok && \
+ $contains "^$ans\$" UU/getfile.ok >/dev/null 2>&1
+ then
+ value="$ans"
+ ansexp="$ans"
+ break
+ fi
+ case "$ans" in
+ none)
+ value=''
+ ansexp=''
+ case "$none_ok" in
+ true) type='';;
+ esac
+ ;;
+ *)
+ case "$tilde" in
+ '') value="$ans"
+ ansexp="$ans";;
+ *)
+ value=`UU/filexp $ans`
+ case $? in
+ 0)
+ if test "$ans" != "$value"; then
+ echo "(That expands to $value on this system.)"
+ fi
+ ;;
+ *) value="$ans";;
+ esac
+ ansexp="$value"
+ case "$exp_file" in
+ '') value="$ans";;
+ esac
+ ;;
+ esac
+ case "$fullpath" in
+ true)
+ case "$ansexp" in
+ /*) value="$ansexp" ;;
+ *)
+ redo=true
+ case "$already" in
+ true)
+ echo "I shall only accept a full path name, as in /bin/ls." >&4
+ echo "Use a ! shell escape if you wish to check pathnames." >&4
+ ;;
+ *)
+ echo "Please give a full path name, starting with slash." >&4
+ case "$tilde" in
+ true)
+ echo "Note that using ~name is ok provided it expands well." >&4
+ already=true
+ ;;
+ esac
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ case "$redo" in
+ '')
+ case "$type" in
+ File)
+ for fp in $gfpth; do
+ if test "X$fp" = X.; then
+ pf="$ansexp"
+ else
+ pf="$fp/$ansexp"
+ fi
+ if test -f "$pf"; then
+ type=''
+ elif test -r "$pf" || (test -h "$pf") >/dev/null 2>&1
+ then
+ echo "($value is not a plain file, but that's ok.)"
+ type=''
+ fi
+ if test X"$type" = X; then
+ value="$pf"
+ break
+ fi
+ done
+ ;;
+ Directory)
+ for fp in $gfpth; do
+ if test "X$fp" = X.; then
+ dir="$ans"
+ direxp="$ansexp"
+ else
+ dir="$fp/$ansexp"
+ direxp="$fp/$ansexp"
+ fi
+ if test -d "$direxp"; then
+ type=''
+ value="$dir"
+ break
+ fi
+ done
+ ;;
+ Locate)
+ if test -d "$ansexp"; then
+ echo "(Looking for $loc_file in directory $value.)"
+ value="$value/$loc_file"
+ ansexp="$ansexp/$loc_file"
+ fi
+ if test -f "$ansexp"; then
+ type=''
+ fi
+ case "$nopath_ok" in
+ true) case "$value" in
+ */*) ;;
+ *) echo "Assuming $value will be in people's path."
+ type=''
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+
+ case "$skip" in
+ true) type='';
+ esac
+
+ case "$type" in
+ '') ;;
+ *)
+ if test "$fastread" = yes; then
+ dflt=y
+ else
+ dflt=n
+ fi
+ rp="$what $value doesn't exist. Use that name anyway?"
+ . UU/myread
+ dflt=''
+ case "$ans" in
+ y*) type='';;
+ *) echo " ";;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+done
+cd UU
+ans="$value"
+rp="$orig_rp"
+dflt="$orig_dflt"
+rm -f getfile.ok
+test "X$gfpthkeep" != Xy && gfpth=""
+EOSC
+
: What should the include directory be ?
echo " "
$echo $n "Hmm... $c"
@@ -3499,7 +3436,13 @@ ABC.XYZ
EOT
cd ..
if test ! -f cppstdin; then
-echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >cppstdin
+ if test "X$osname" = "Xaix" -a "X$gccversion" = X; then
+ # AIX cc -E doesn't show the absolute headerfile
+ # locations but we'll cheat by using the -M flag.
+ echo 'cat >.$$.c; rm -f .$$.u; '"$cc"' ${1+"$@"} -M -c .$$.c 2>/dev/null; test -s .$$.u && awk '"'"'$2 ~ /\.h$/ { print "# 0 \""$2"\"" }'"'"' .$$.u; rm -f .$$.o .$$.u; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' > cppstdin
+ else
+ echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >cppstdin
+ fi
else
echo "Keeping your $hint cppstdin wrapper."
fi
@@ -3691,7 +3634,7 @@ esac
$cat <<EOM
On some systems, shared libraries may be available. Answer 'none' if
-you want to suppress searching of shared libraries for the remaining
+you want to suppress searching of shared libraries for the remainder
of this configuration.
EOM
@@ -3741,6 +3684,26 @@ case "$firstmakefile" in
'') firstmakefile='makefile';;
esac
+case "$usesocks" in
+$define|true|[yY]*) dflt='y';;
+*) dflt='n';;
+esac
+cat <<EOM
+
+Perl can be built to use the SOCKS proxy protocol library. To do so,
+Configure must be run with -Dusesocks.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Build Perl for SOCKS?'
+. ./myread
+case "$ans" in
+y|Y) val="$define" ;;
+*) val="$undef" ;;
+esac
+set usesocks
+eval $setvar
+
: Looking for optional libraries
echo " "
echo "Checking for optional libraries..." >&4
@@ -3751,47 +3714,74 @@ esac
case "$libswanted" in
'') libswanted='c_s';;
esac
+case "$usesocks" in
+"$define") libswanted="$libswanted socks5 socks5_sh" ;;
+esac
+libsfound=''
+libsfiles=''
+libsdirs=''
+libspath=''
+for thisdir in $libpth $xlibpth; do
+ test -d $thisdir && libspath="$libspath $thisdir"
+done
for thislib in $libswanted; do
-
- if xxx=`./loc lib$thislib.$so.[0-9]'*' X $libpth`;
- $test -f "$xxx" -a "X$ignore_versioned_solibs" = "X"; then
- echo "Found -l$thislib (shared)."
- case " $dflt " in
- *"-l$thislib "*);;
- *) dflt="$dflt -l$thislib";;
+ for thisdir in $libspath; do
+ xxx=''
+ if $test ! -f "$xxx" -a "X$ignore_versioned_solibs" = "X"; then
+ xxx=`ls $thisdir/lib$thislib.$so.[0-9] 2>/dev/null|tail -1`
+ $test -f "$xxx" && eval $libscheck
+ $test -f "$xxx" && libstyle=shared
+ fi
+ if test ! -f "$xxx"; then
+ xxx=$thisdir/lib$thislib.$so
+ $test -f "$xxx" && eval $libscheck
+ $test -f "$xxx" && libstyle=shared
+ fi
+ if test ! -f "$xxx"; then
+ xxx=$thisdir/lib$thislib$_a
+ $test -f "$xxx" && eval $libscheck
+ $test -f "$xxx" && libstyle=static
+ fi
+ if test ! -f "$xxx"; then
+ xxx=$thisdir/$thislib$_a
+ $test -f "$xxx" && eval $libscheck
+ $test -f "$xxx" && libstyle=static
+ fi
+ if test ! -f "$xxx"; then
+ xxx=$thisdir/lib${thislib}_s$_a
+ $test -f "$xxx" && eval $libscheck
+ $test -f "$xxx" && libstyle=static
+ $test -f "$xxx" && thislib=${thislib}_s
+ fi
+ if test ! -f "$xxx"; then
+ xxx=$thisdir/Slib$thislib$_a
+ $test -f "$xxx" && eval $libscheck
+ $test -f "$xxx" && libstyle=static
+ fi
+ if $test -f "$xxx"; then
+ case "$libstyle" in
+ shared) echo "Found -l$thislib (shared)." ;;
+ static) echo "Found -l$thislib." ;;
+ *) echo "Found -l$thislib ($libstyle)." ;;
esac
- elif xxx=`./loc lib$thislib.$so X $libpth` ; $test -f "$xxx"; then
- echo "Found -l$thislib (shared)."
case " $dflt " in
*"-l$thislib "*);;
- *) dflt="$dflt -l$thislib";;
+ *) dflt="$dflt -l$thislib"
+ libsfound="$libsfound $xxx"
+ yyy=`basename $xxx`
+ libsfiles="$libsfiles $yyy"
+ yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"`
+ case " $libsdirs " in
+ *" $yyy "*) ;;
+ *) libsdirs="$libsdirs $yyy" ;;
+ esac
+ ;;
esac
- elif xxx=`./loc lib$thislib$_a X $libpth`; $test -f "$xxx"; then
- echo "Found -l$thislib."
- case " $dflt " in
- *"-l$thislib "*);;
- *) dflt="$dflt -l$thislib";;
- esac
- elif xxx=`./loc $thislib$_a X $libpth`; $test -f "$xxx"; then
- echo "Found -l$thislib."
- case " $dflt " in
- *"-l$thislib "*);;
- *) dflt="$dflt -l$thislib";;
- esac
- elif xxx=`./loc lib${thislib}_s$_a X $libpth`; $test -f "$xxx"; then
- echo "Found -l${thislib}_s."
- case " $dflt " in
- *"-l$thislib "*);;
- *) dflt="$dflt -l${thislib}_s";;
- esac
- elif xxx=`./loc Slib$thislib$_a X $xlibpth`; $test -f "$xxx"; then
- echo "Found -l$thislib."
- case " $dflt " in
- *"-l$thislib "*);;
- *) dflt="$dflt -l$thislib";;
- esac
- else
- echo "No -l$thislib."
+ break
+ fi
+ done
+ if $test ! -f "$xxx"; then
+ echo "No -l$thislib."
fi
done
set X $dflt
@@ -3806,27 +3796,21 @@ case "$dflt" in
esac
$cat <<EOM
-
-Some versions of Unix support shared libraries, which make executables smaller
-but make load time slightly longer.
-On some systems, mostly System V Release 3's, the shared library is included
-by putting the option "-lc_s" as the last thing on the cc command line when
-linking. Other systems use shared libraries by default. There may be other
-libraries needed to compile $package on your machine as well. If your system
-needs the "-lc_s" option, include it here. Include any other special libraries
-here as well. Say "none" for none.
+In order to compile $package on your machine, a number of libraries
+are usually needed. Include any other special libraries here as well.
+Say "none" for none. The default list is almost always right.
EOM
echo " "
-rp="Any additional libraries?"
+rp="What libraries to use?"
. ./myread
case "$ans" in
none) libs=' ';;
*) libs="$ans";;
esac
-: determine optimize, if desired, or use for debug flag also
+: determine optimization, if desired, or use for debug flag also
case "$optimize" in
' '|$undef) dflt='none';;
'') dflt='-O';;
@@ -3834,11 +3818,10 @@ case "$optimize" in
esac
$cat <<EOH
-Some C compilers have problems with their optimizers. By default, $package
-compiles with the -O flag to use the optimizer. Alternately, you might want
-to use the symbolic debugger, which uses the -g flag (on traditional Unix
-systems). Either flag can be specified here. To use neither flag, specify
-the word "none".
+By default, $package compiles with the -O flag to use the optimizer.
+Alternately, you might want to use the symbolic debugger, which uses
+the -g flag (on traditional Unix systems). Either flag can be
+specified here. To use neither flag, specify the word "none".
EOH
rp="What optimizer/debugger flag should be used?"
@@ -3852,7 +3835,7 @@ dflt=''
: We will not override a previous value, but we might want to
: augment a hint file
case "$hint" in
-none|recommended)
+default|recommended)
case "$gccversion" in
1*) dflt='-fpcc-struct-return' ;;
esac
@@ -3867,6 +3850,25 @@ none|recommended)
fi
;;
esac
+ case "$gccversion" in
+ 1*) ;;
+ 2.[0-8]*) ;;
+ ?*) echo " "
+ echo "Checking if your compiler accepts -fno-strict-aliasing" 2>&1
+ echo 'int main(void) { return 0; }' > gcctest.c
+ if $cc -O2 -fno-strict-aliasing -o gcctest gcctest.c; then
+ echo "Yes, it does." 2>&1
+ case "$ccflags" in
+ *strict-aliasing*)
+ echo "Leaving current flags $ccflags alone." 2>&1
+ ;;
+ *) dflt="$dflt -fno-strict-aliasing" ;;
+ esac
+ else
+ echo "Nope, it doesn't, but that's ok." 2>&1
+ fi
+ ;;
+ esac
;;
esac
@@ -3901,8 +3903,14 @@ fi'
set signal.h LANGUAGE_C; eval $inctest
+case "$usesocks" in
+$define)
+ ccflags="$ccflags -DSOCKS"
+ ;;
+esac
+
case "$hint" in
-none|recommended) dflt="$ccflags $dflt" ;;
+default|recommended) dflt="$ccflags $dflt" ;;
*) dflt="$ccflags";;
esac
@@ -4112,6 +4120,942 @@ n) echo "OK, that should do.";;
esac
$rm -f try try.* core
+: define an is-a-typedef? function
+typedef='type=$1; var=$2; def=$3; shift; shift; shift; inclist=$@;
+case "$inclist" in
+"") inclist="sys/types.h";;
+esac;
+eval "varval=\$$var";
+case "$varval" in
+"")
+ $rm -f temp.c;
+ for inc in $inclist; do
+ echo "#include <$inc>" >>temp.c;
+ done;
+ echo "#ifdef $type" >> temp.c;
+ echo "printf(\"We have $type\");" >> temp.c;
+ echo "#endif" >> temp.c;
+ $cppstdin $cppflags $cppminus < temp.c >temp.E 2>/dev/null;
+ if $contains $type temp.E >/dev/null 2>&1; then
+ eval "$var=\$type";
+ else
+ eval "$var=\$def";
+ fi;
+ $rm -f temp.?;;
+*) eval "$var=\$varval";;
+esac'
+
+: define an is-a-typedef? function that prompts if the type is not available.
+typedef_ask='type=$1; var=$2; def=$3; shift; shift; shift; inclist=$@;
+case "$inclist" in
+"") inclist="sys/types.h";;
+esac;
+eval "varval=\$$var";
+case "$varval" in
+"")
+ $rm -f temp.c;
+ for inc in $inclist; do
+ echo "#include <$inc>" >>temp.c;
+ done;
+ echo "#ifdef $type" >> temp.c;
+ echo "printf(\"We have $type\");" >> temp.c;
+ echo "#endif" >> temp.c;
+ $cppstdin $cppflags $cppminus < temp.c >temp.E 2>/dev/null;
+ echo " " ;
+ echo "$rp" | $sed -e "s/What is/Looking for/" -e "s/?/./";
+ if $contains $type temp.E >/dev/null 2>&1; then
+ echo "$type found." >&4;
+ eval "$var=\$type";
+ else
+ echo "$type NOT found." >&4;
+ dflt="$def";
+ . ./myread ;
+ eval "$var=\$ans";
+ fi;
+ $rm -f temp.?;;
+*) eval "$var=\$varval";;
+esac'
+
+: define a shorthand compile call
+compile='
+mc_file=$1;
+shift;
+$cc $optimize $ccflags $ldflags -o ${mc_file} $* ${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;'
+
+: check for lengths of integral types
+echo " "
+case "$intsize" in
+'')
+ echo "Checking to see how big your integers are..." >&4
+ $cat >intsize.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+ printf("intsize=%d;\n", (int)sizeof(int));
+ printf("longsize=%d;\n", (int)sizeof(long));
+ printf("shortsize=%d;\n", (int)sizeof(short));
+ exit(0);
+}
+EOCP
+ set intsize
+ if eval $compile_ok && ./intsize > /dev/null; then
+ eval `./intsize`
+ echo "Your integers are $intsize bytes long."
+ echo "Your long integers are $longsize bytes long."
+ echo "Your short integers are $shortsize bytes long."
+ else
+ $cat >&4 <<EOM
+!
+Help! I can't compile and run the intsize test program: please enlighten me!
+(This is probably a misconfiguration in your system or libraries, and
+you really ought to fix it. Still, I'll try anyway.)
+!
+EOM
+ dflt=4
+ rp="What is the size of an integer (in bytes)?"
+ . ./myread
+ intsize="$ans"
+ dflt=$intsize
+ rp="What is the size of a long integer (in bytes)?"
+ . ./myread
+ longsize="$ans"
+ dflt=2
+ rp="What is the size of a short integer (in bytes)?"
+ . ./myread
+ shortsize="$ans"
+ fi
+ ;;
+esac
+$rm -f intsize intsize.*
+
+: see what type lseek is declared as in the kernel
+rp="What is the type used for lseek's offset on this system?"
+set off_t lseektype long stdio.h sys/types.h
+eval $typedef_ask
+
+echo " "
+echo "Checking to see how big your file offsets are..." >&4
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main()
+{
+ printf("%d\n", (int)sizeof($lseektype));
+ return(0);
+}
+EOCP
+set try
+if eval $compile_ok; then
+ lseeksize=`./try`
+ echo "Your file offsets are $lseeksize bytes long."
+else
+ dflt=$longsize
+ echo " "
+ echo "(I can't seem to compile the test program. Guessing...)"
+ rp="What is the size of your file offsets (in bytes)?"
+ . ./myread
+ lseeksize="$ans"
+fi
+$rm -f try.c try
+
+: see what type file positions are declared as in the library
+rp="What is the type for file position used by fsetpos()?"
+set fpos_t fpostype long stdio.h sys/types.h
+eval $typedef_ask
+
+echo " "
+case "$fpostype" in
+*_t) zzz="$fpostype" ;;
+*) zzz="fpos_t" ;;
+esac
+echo "Checking the size of $zzz..." >&4
+cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ printf("%d\n", (int)sizeof($fpostype));
+ exit(0);
+}
+EOCP
+set try
+if eval $compile_ok; then
+ yyy=`./try`
+ case "$yyy" in
+ '') fpossize=4
+ echo "(I can't execute the test program--guessing $fpossize.)" >&4
+ ;;
+ *) fpossize=$yyy
+ echo "Your $zzz is $fpossize bytes long."
+ ;;
+ esac
+else
+ dflt="$longsize"
+ echo " " >&4
+ echo "(I can't compile the test program. Guessing...)" >&4
+ rp="What is the size of your file positions (in bytes)?"
+ . ./myread
+ fpossize="$ans"
+fi
+
+
+
+# Backward compatibility (uselfs is deprecated).
+case "$uselfs" in
+"$define"|true|[yY]*)
+ cat <<EOM >&4
+
+*** Configure -Duselfs is deprecated, using -Duselargefiles instead.
+EOM
+ uselargefiles="$define"
+ ;;
+esac
+
+case "$lseeksize:$fpossize" in
+8:8) cat <<EOM
+
+You can have files larger than 2 gigabytes.
+EOM
+ val="$define" ;;
+*) case "$uselargefiles" in
+ "$undef"|false|[nN]*) dflt='n' ;;
+ *) dflt='y' ;;
+ esac
+ cat <<EOM
+
+Perl can be built to understand large files (files larger than 2 gigabytes)
+on some systems. To do so, Configure can be run with -Duselargefiles.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+ rp='Try to understand large files, if available?'
+ . ./myread
+ case "$ans" in
+ y|Y) val="$define" ;;
+ *) val="$undef" ;;
+ esac
+ ;;
+esac
+set uselargefiles
+eval $setvar
+case "$uselargefiles" in
+"$define")
+: Look for a hint-file generated 'call-back-unit'. If the
+: user has specified that a large files perl is to be built,
+: we may need to set or change some other defaults.
+ if $test -f uselargefiles.cbu; then
+ echo "Your platform has some specific hints for large file builds, using them..."
+ . ./uselargefiles.cbu
+ echo " "
+ echo "Rechecking to see how big your file offsets are..." >&4
+ $cat >try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main()
+{
+ printf("%d\n", (int)sizeof($lseektype));
+ return(0);
+}
+EOCP
+ set try
+ if eval $compile_ok; then
+ lseeksize=`./try`
+ $echo "Your file offsets are now $lseeksize bytes long."
+ else
+ dflt="$lseeksize"
+ echo " "
+ echo "(I can't seem to compile the test program. Guessing...)"
+ rp="What is the size of your file offsets (in bytes)?"
+ . ./myread
+ lseeksize="$ans"
+ fi
+ case "$fpostype" in
+ *_t) zzz="$fpostype" ;;
+ *) zzz="fpos_t" ;;
+ esac
+ $echo $n "Rechecking the size of $zzz...$c" >&4
+ $cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ printf("%d\n", (int)sizeof($fpostype));
+ exit(0);
+}
+EOCP
+ set try
+ if eval $compile_ok; then
+ yyy=`./try`
+ dflt="$lseeksize"
+ case "$yyy" in
+ '') echo " "
+ echo "(I can't execute the test program--guessing $fpossize.)" >&4
+ ;;
+ *) fpossize=$yyy
+ echo " $fpossize bytes." >&4
+ ;;
+ esac
+ else
+ dflt="$fpossize"
+ echo " "
+ echo "(I can't compile the test program. Guessing...)" >&4
+ rp="What is the size of your file positions (in bytes)?"
+ . ./myread
+ fpossize="$ans"
+ fi
+ $rm -f try.c try
+ fi
+ ;;
+esac
+
+
+case "$usemorebits" in
+"$define"|true|[yY]*)
+ use64bitint="$define"
+ uselongdouble="$define"
+ usemorebits="$define"
+ ;;
+*) usemorebits="$undef"
+ ;;
+esac
+
+
+case "$uselonglong" in
+"$define"|true|[yY]*)
+ cat <<EOM >&4
+
+*** Configure -Duselonglong is deprecated, using -Duse64bitint instead.
+EOM
+ use64bitint="$define"
+ ;;
+esac
+case "$use64bits" in
+"$define"|true|[yY]*)
+ cat <<EOM >&4
+
+*** Configure -Duse64bits is deprecated, using -Duse64bitint instead.
+EOM
+ use64bitint="$define"
+ ;;
+esac
+case "$use64bitints" in
+"$define"|true|[yY]*)
+ cat <<EOM >&4
+
+*** There is no Configure -Duse64bitints, using -Duse64bitint instead.
+EOM
+ use64bitint="$define"
+ ;;
+esac
+case "$use64bitsint" in
+"$define"|true|[yY]*)
+ cat <<EOM >&4
+
+*** There is no Configure -Duse64bitsint, using -Duse64bitint instead.
+EOM
+ use64bitint="$define"
+ ;;
+esac
+case "$uselonglongs" in
+"$define"|true|[yY]*)
+ cat <<EOM >&4
+
+*** There is no Configure -Duselonglongs, using -Duse64bitint instead.
+EOM
+ use64bitint="$define"
+ ;;
+esac
+case "$use64bitsall" in
+"$define"|true|[yY]*)
+ cat <<EOM >&4
+
+*** There is no Configure -Duse64bitsall, using -Duse64bitall instead.
+EOM
+ use64bitall="$define"
+ ;;
+esac
+
+case "$ccflags" in
+*-DUSE_LONG_LONG*|*-DUSE_64_BIT_INT*|*-DUSE_64_BIT_ALL*) use64bitint="$define";;
+esac
+case "$use64bitall" in
+"$define"|true|[yY]*) use64bitint="$define" ;;
+esac
+
+case "$longsize" in
+8) cat <<EOM
+
+You have natively 64-bit long integers.
+EOM
+ val="$define"
+ ;;
+*) case "$use64bitint" in
+ "$define"|true|[yY]*) dflt='y';;
+ *) dflt='n';;
+ esac
+ cat <<EOM
+
+Perl can be built to take advantage of 64-bit integer types
+on some systems. To do so, Configure can be run with -Duse64bitint.
+Choosing this option will most probably introduce binary incompatibilities.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+ rp='Try to use 64-bit integers, if available?'
+ . ./myread
+ case "$ans" in
+ [yY]*) val="$define" ;;
+ *) val="$undef" ;;
+ esac
+ ;;
+esac
+set use64bitint
+eval $setvar
+
+case "$use64bitall" in
+"$define"|true|[yY]*) dflt='y' ;;
+*) case "$longsize" in
+ 8) dflt='y' ;;
+ *) dflt='n' ;;
+ esac
+ ;;
+esac
+cat <<EOM
+
+You may also choose to try maximal 64-bitness. It means using as much
+64-bitness as possible on the platform. This in turn means even more
+binary incompatibilities. On the other hand, your platform may not
+have any more 64-bitness available than what you already have chosen.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Try to use maximal 64-bit support, if available?'
+. ./myread
+case "$ans" in
+[yY]*) val="$define" ;;
+*) val="$undef" ;;
+esac
+set use64bitall
+eval $setvar
+case "$use64bitall" in
+"$define")
+ case "$use64bitint" in
+ "$undef")
+ cat <<EOM
+
+Since you have chosen a maximally 64-bit build, I'm also turning on
+the use of 64-bit integers.
+EOM
+ use64bitint="$define" ;;
+ esac
+ ;;
+esac
+
+case "$use64bitint" in
+"$define"|true|[yY]*)
+: Look for a hint-file generated 'call-back-unit'. If the
+: user has specified that a 64-bit perl is to be built,
+: we may need to set or change some other defaults.
+ if $test -f use64bitint.cbu; then
+ echo "Your platform has some specific hints for 64-bit integers, using them..."
+ . ./use64bitint.cbu
+ fi
+ case "$longsize" in
+ 4) case "$archname64" in
+ '') archname64=64int ;;
+ esac
+ ;;
+ esac
+ ;;
+esac
+
+case "$use64bitall" in
+"$define"|true|[yY]*)
+: Look for a hint-file generated 'call-back-unit'. If the
+: user has specified that a maximally 64-bit perl is to be built,
+: we may need to set or change some other defaults.
+ if $test -f use64bitall.cbu; then
+ echo "Your platform has some specific hints for 64-bit builds, using them..."
+ . ./use64bitall.cbu
+ fi
+ case "$longsize" in
+ 4) case "$archname64" in
+ ''|64int) archname64=64all ;;
+ esac
+ ;;
+ esac
+ ;;
+esac
+
+: determine the architecture name
+echo " "
+if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then
+ tarch=`arch`"-$osname"
+elif xxx=`./loc uname blurfl $pth`; $test -f "$xxx" ; then
+ if uname -m > tmparch 2>&1 ; then
+ tarch=`$sed -e 's/ *$//' -e 's/ /_/g' \
+ -e 's/$/'"-$osname/" tmparch`
+ else
+ tarch="$osname"
+ fi
+ $rm -f tmparch
+else
+ tarch="$osname"
+fi
+case "$myarchname" in
+''|"$tarch") ;;
+*)
+ echo "(Your architecture name used to be $myarchname.)"
+ archname=''
+ ;;
+esac
+myarchname="$tarch"
+case "$archname" in
+'') dflt="$tarch";;
+*) dflt="$archname";;
+esac
+rp='What is your architecture name'
+. ./myread
+archname="$ans"
+case "$usethreads" in
+$define)
+ echo "Threads selected." >&4
+ case "$archname" in
+ *-thread*) echo "...and architecture name already has -thread." >&4
+ ;;
+ *) archname="$archname-thread"
+ echo "...setting architecture name to $archname." >&4
+ ;;
+ esac
+ ;;
+esac
+case "$usemultiplicity" in
+$define)
+ echo "Multiplicity selected." >&4
+ case "$archname" in
+ *-multi*) echo "...and architecture name already has -multi." >&4
+ ;;
+ *) archname="$archname-multi"
+ echo "...setting architecture name to $archname." >&4
+ ;;
+ esac
+ ;;
+esac
+case "$use64bitint" in
+$define)
+ case "$archname64" in
+ '')
+ ;;
+ *)
+ case "$archname" in
+ *-$archname64*) echo "...and architecture name already has $archname64." >&4
+ ;;
+ *) archname="$archname-$archname64"
+ echo "...setting architecture name to $archname." >&4
+ ;;
+ esac
+ ;;
+ esac
+esac
+
+: determine root of directory hierarchy where package will be installed.
+case "$prefix" in
+'')
+ dflt=`./loc . /usr/local /usr/local /local /opt /usr`
+ ;;
+*)
+ dflt="$prefix"
+ ;;
+esac
+$cat <<EOM
+
+By default, $package will be installed in $dflt/bin, manual pages
+under $dflt/man, etc..., i.e. with $dflt as prefix for all
+installation directories. Typically this is something like /usr/local.
+If you wish to have binaries under /usr/bin but other parts of the
+installation under /usr/local, that's ok: you will be prompted
+separately for each of the installation directories, the prefix being
+only used to set the defaults.
+
+EOM
+fn=d~
+rp='Installation prefix to use?'
+. ./getfile
+oldprefix=''
+case "$prefix" in
+'') ;;
+*)
+ case "$ans" in
+ "$prefix") ;;
+ *) oldprefix="$prefix";;
+ esac
+ ;;
+esac
+prefix="$ans"
+prefixexp="$ansexp"
+
+: is AFS running?
+echo " "
+case "$afs" in
+$define|true) afs=true ;;
+$undef|false) afs=false ;;
+*) if test -d /afs; then
+ afs=true
+ else
+ afs=false
+ fi
+ ;;
+esac
+if $afs; then
+ echo "AFS may be running... I'll be extra cautious then..." >&4
+else
+ echo "AFS does not seem to be running..." >&4
+fi
+
+: determine installation prefix for where package is to be installed.
+if $afs; then
+$cat <<EOM
+
+Since you are running AFS, I need to distinguish the directory in which
+files will reside from the directory in which they are installed (and from
+which they are presumably copied to the former directory by occult means).
+
+EOM
+ case "$installprefix" in
+ '') dflt=`echo $prefix | sed 's#^/afs/#/afs/.#'`;;
+ *) dflt="$installprefix";;
+ esac
+else
+$cat <<EOM
+
+In some special cases, particularly when building $package for distribution,
+it is convenient to distinguish between the directory in which files should
+be installed from the directory ($prefix) in which they
+will eventually reside. For most users, these two directories are the same.
+
+EOM
+ case "$installprefix" in
+ '') dflt=$prefix ;;
+ *) dflt=$installprefix;;
+ esac
+fi
+fn=d~
+rp='What installation prefix should I use for installing files?'
+. ./getfile
+installprefix="$ans"
+installprefixexp="$ansexp"
+
+: set the prefixit variable, to compute a suitable default value
+prefixit='case "$3" in
+""|none)
+ case "$oldprefix" in
+ "") eval "$1=\"\$$2\"";;
+ *)
+ case "$3" in
+ "") eval "$1=";;
+ none)
+ eval "tp=\"\$$2\"";
+ case "$tp" in
+ ""|" ") eval "$1=\"\$$2\"";;
+ *) eval "$1=";;
+ esac;;
+ esac;;
+ esac;;
+*)
+ eval "tp=\"$oldprefix-\$$2-\""; eval "tp=\"$tp\"";
+ case "$tp" in
+ --|/*--|\~*--) eval "$1=\"$prefix/$3\"";;
+ /*-$oldprefix/*|\~*-$oldprefix/*)
+ eval "$1=\`echo \$$2 | sed \"s,^$oldprefix,$prefix,\"\`";;
+ *) eval "$1=\"\$$2\"";;
+ esac;;
+esac'
+
+
+: get the patchlevel
+echo " "
+echo "Getting the current patchlevel..." >&4
+if $test -r $rsrc/patchlevel.h;then
+ revision=`awk '/define[ ]+PERL_REVISION/ {print $3}' $rsrc/patchlevel.h`
+ patchlevel=`awk '/define[ ]+PERL_VERSION/ {print $3}' $rsrc/patchlevel.h`
+ subversion=`awk '/define[ ]+PERL_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
+ api_revision=`awk '/define[ ]+PERL_API_REVISION/ {print $3}' $rsrc/patchlevel.h`
+ api_version=`awk '/define[ ]+PERL_API_VERSION/ {print $3}' $rsrc/patchlevel.h`
+ api_subversion=`awk '/define[ ]+PERL_API_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
+else
+ revision=0
+ patchlevel=0
+ subversion=0
+ api_revision=0
+ api_version=0
+ api_subversion=0
+fi
+$echo $n "(You have $package revision $revision" $c
+$echo $n " patchlevel $patchlevel" $c
+test 0 -eq "$subversion" || $echo $n " subversion $subversion" $c
+echo ".)"
+case "$osname" in
+dos|vms)
+ : XXX Should be a Configure test for double-dots in filenames.
+ version=`echo $revision $patchlevel $subversion | \
+ $awk '{ printf "%d_%d_%d\n", $1, $2, $3 }'`
+ api_versionstring=`echo $api_revision $api_version $api_subversion | \
+ $awk '{ printf "%d_%d_%d\n", $1, $2, $3 }'`
+ ;;
+*)
+ version=`echo $revision $patchlevel $subversion | \
+ $awk '{ printf "%d.%d.%d\n", $1, $2, $3 }'`
+ api_versionstring=`echo $api_revision $api_version $api_subversion | \
+ $awk '{ printf "%d.%d.%d\n", $1, $2, $3 }'`
+ ;;
+esac
+: Special case the 5.005_xx maintenance series, which used 5.005
+: without any subversion label as a subdirectory in $sitelib
+if test "${api_revision}${api_version}${api_subversion}" = "550"; then
+ api_versionstring='5.005'
+fi
+
+: determine installation style
+: For now, try to deduce it from prefix unless it is already set.
+: Reproduce behavior of 5.005 and earlier, maybe drop that in 5.7.
+case "$installstyle" in
+'') case "$prefix" in
+ *perl*) dflt='lib';;
+ *) dflt='lib/perl5' ;;
+ esac
+ ;;
+*) dflt="$installstyle" ;;
+esac
+: Probably not worth prompting for this since we prompt for all
+: the directories individually, and the prompt would be too long and
+: confusing anyway.
+installstyle=$dflt
+
+: determine where private library files go
+: Usual default is /usr/local/lib/perl5/$version.
+: Also allow things like /opt/perl/lib/$version, since
+: /opt/perl/lib/perl5... would be redundant.
+: The default "style" setting is made in installstyle.U
+case "$installstyle" in
+*lib/perl5*) set dflt privlib lib/$package/$version ;;
+*) set dflt privlib lib/$version ;;
+esac
+eval $prefixit
+$cat <<EOM
+
+There are some auxiliary files for $package that need to be put into a
+private library directory that is accessible by everyone.
+
+EOM
+fn=d~+
+rp='Pathname where the private library files will reside?'
+. ./getfile
+privlib="$ans"
+privlibexp="$ansexp"
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installprivlib=`echo $privlibexp | sed "s#^$prefix#$installprefix#"`
+else
+ installprivlib="$privlibexp"
+fi
+
+: set the prefixup variable, to restore leading tilda escape
+prefixup='case "$prefixexp" in
+"$prefix") ;;
+*) eval "$1=\`echo \$$1 | sed \"s,^$prefixexp,$prefix,\"\`";;
+esac'
+
+: determine where public architecture dependent libraries go
+set archlib archlib
+eval $prefixit
+: privlib default is /usr/local/lib/$package/$version
+: archlib default is /usr/local/lib/$package/$version/$archname
+: privlib may have an optional trailing /share.
+tdflt=`echo $privlib | $sed 's,/share$,,'`
+tdflt=$tdflt/$archname
+case "$archlib" in
+'') dflt=$tdflt
+ ;;
+*) dflt="$archlib"
+ ;;
+esac
+$cat <<EOM
+
+$spackage contains architecture-dependent library files. If you are
+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.
+
+EOM
+fn=d+~
+rp='Where do you want to put the public architecture-dependent libraries?'
+. ./getfile
+archlib="$ans"
+archlibexp="$ansexp"
+if $test X"$archlib" = X"$privlib"; then
+ d_archlib="$undef"
+else
+ d_archlib="$define"
+fi
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installarchlib=`echo $archlibexp | sed "s#^$prefix#$installprefix#"`
+else
+ installarchlib="$archlibexp"
+fi
+
+
+: Binary compatibility with 5.005 is not possible for builds
+: with advanced features
+case "$usethreads$usemultiplicity" in
+*define*)
+ bincompat5005="$undef"
+ d_bincompat5005="$undef"
+ ;;
+*) $cat <<EOM
+
+This version of Perl can be compiled for binary compatibility with 5.005.
+If you decide to do so, you will be able to continue using most of the
+extensions that were compiled for Perl 5.005.
+
+EOM
+ case "$bincompat5005$d_bincompat5005" in
+ *"$undef"*) dflt=n ;;
+ *) dflt=y ;;
+ esac
+ rp='Binary compatibility with Perl 5.005?'
+ . ./myread
+ case "$ans" in
+ y*) val="$define" ;;
+ *) val="$undef" ;;
+ esac
+ set d_bincompat5005
+ eval $setvar
+ case "$d_bincompat5005" in
+ "$define")
+ bincompat5005="$define"
+ ;;
+ *) bincompat5005="$undef"
+ d_bincompat5005="$undef"
+ ;;
+ esac
+ ;;
+esac
+
+
+: see if setuid scripts can be secure
+$cat <<EOM
+
+Some kernels have a bug that prevents setuid #! scripts from being
+secure. Some sites have disabled setuid #! scripts because of this.
+
+First let's decide if your kernel supports secure setuid #! scripts.
+(If setuid #! scripts would be secure but have been disabled anyway,
+don't say that they are secure if asked.)
+
+EOM
+
+val="$undef"
+if $test -d /dev/fd; then
+ echo "#!$ls" >reflect
+ chmod +x,u+s reflect
+ ./reflect >flect 2>&1
+ if $contains "/dev/fd" flect >/dev/null; then
+ echo "Congratulations, your kernel has secure setuid scripts!" >&4
+ val="$define"
+ else
+ $cat <<EOM
+If you are not sure if they are secure, I can check but I'll need a
+username and password different from the one you are using right now.
+If you don't have such a username or don't want me to test, simply
+enter 'none'.
+
+EOM
+ rp='Other username to test security of setuid scripts with?'
+ dflt='none'
+ . ./myread
+ case "$ans" in
+ n|none)
+ case "$d_suidsafe" in
+ '') echo "I'll assume setuid scripts are *not* secure." >&4
+ dflt=n;;
+ "$undef")
+ echo "Well, the $hint value is *not* secure." >&4
+ dflt=n;;
+ *) echo "Well, the $hint value *is* secure." >&4
+ dflt=y;;
+ esac
+ ;;
+ *)
+ $rm -f reflect flect
+ echo "#!$ls" >reflect
+ chmod +x,u+s reflect
+ echo >flect
+ chmod a+w flect
+ echo '"su" will (probably) prompt you for '"$ans's password."
+ su $ans -c './reflect >flect'
+ if $contains "/dev/fd" flect >/dev/null; then
+ echo "Okay, it looks like setuid scripts are secure." >&4
+ dflt=y
+ else
+ echo "I don't think setuid scripts are secure." >&4
+ dflt=n
+ fi
+ ;;
+ esac
+ rp='Does your kernel have *secure* setuid scripts?'
+ . ./myread
+ case "$ans" in
+ [yY]*) val="$define";;
+ *) val="$undef";;
+ esac
+ fi
+else
+ echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4
+ echo "(That's for file descriptors, not floppy disks.)"
+ val="$undef"
+fi
+set d_suidsafe
+eval $setvar
+
+$rm -f reflect flect
+
+: now see if they want to do setuid emulation
+echo " "
+val="$undef"
+case "$d_suidsafe" in
+"$define")
+ val="$undef"
+ echo "No need to emulate SUID scripts since they are secure here." >& 4
+ ;;
+*)
+ $cat <<EOM
+Some systems have disabled setuid scripts, especially systems where
+setuid scripts cannot be secure. On systems where setuid scripts have
+been disabled, the setuid/setgid bits on scripts are currently
+useless. It is possible for $package to detect those bits and emulate
+setuid/setgid in a secure fashion. This emulation will only work if
+setuid scripts have been disabled in your kernel.
+
+EOM
+ case "$d_dosuid" in
+ "$define") dflt=y ;;
+ *) dflt=n ;;
+ esac
+ rp="Do you want to do setuid/setgid emulation?"
+ . ./myread
+ case "$ans" in
+ [yY]*) val="$define";;
+ *) val="$undef";;
+ esac
+ ;;
+esac
+set d_dosuid
+eval $setvar
+
: determine filename position in cpp output
echo " "
echo "Computing filename position in cpp output for #include directives..." >&4
@@ -4150,10 +5094,13 @@ $cat >findhdr <<EOF
$startsh
wanted=\$1
name=''
-if test -f $usrinc/\$wanted; then
- echo "$usrinc/\$wanted"
- exit 0
-fi
+for usrincdir in $usrinc
+do
+ if test -f \$usrincdir/\$wanted; then
+ echo "\$usrincdir/\$wanted"
+ exit 0
+ fi
+done
awkprg='{ print \$$fieldn }'
echo "#include <\$wanted>" > foo\$\$.c
$cppstdin $cppminus $cppflags < foo\$\$.c 2>/dev/null | \
@@ -4161,14 +5108,22 @@ $grep "^[ ]*#.*\$wanted" | \
while read cline; do
name=\`echo \$cline | $awk "\$awkprg" | $tr -d '"'\`
case "\$name" in
- */\$wanted) echo "\$name"; exit 0;;
- *) name='';;
+ *[/\\\\]\$wanted) echo "\$name"; exit 1;;
+ *[\\\\/]\$wanted) echo "\$name"; exit 1;;
+ *) exit 2;;
esac;
done;
+#
+# status = 0: grep returned 0 lines, case statement not executed
+# status = 1: headerfile found
+# status = 2: while loop executed, no headerfile found
+#
+status=\$?
$rm -f foo\$\$.c;
-case "\$name" in
-'') exit 1;;
-esac
+if test \$status -eq 1; then
+ exit 0;
+fi
+exit 1
EOF
chmod +x findhdr
@@ -4286,6 +5241,126 @@ case "$freetype" in
esac
echo "Your system uses $freetype free(), it would seem." >&4
$rm -f malloc.[co]
+$cat <<EOM
+
+The installation process will also create a directory for
+vendor-supplied add-ons. Vendors who supply perl with their system
+may find it convenient to place all vendor-supplied files in this
+directory rather than in the main distribution directory. This will
+ease upgrades between binary-compatible maintenance versions of perl.
+
+Of course you may also use these directories in whatever way you see
+fit. For example, you might use them to access modules shared over a
+company-wide network.
+
+The default answer should be fine for most people.
+This causes further questions about vendor add-ons to be skipped
+and no vendor-specific directories will be configured for perl.
+
+EOM
+rp='Do you want to configure vendor-specific add-on directories?'
+case "$usevendorprefix" in
+define|true|[yY]*) dflt=y ;;
+*) : User may have set vendorprefix directly on Configure command line.
+ case "$vendorprefix" in
+ ''|' ') dflt=n ;;
+ *) dflt=y ;;
+ esac
+ ;;
+esac
+. ./myread
+case "$ans" in
+[yY]*) fn=d~+
+ rp='Installation prefix to use for vendor-supplied add-ons?'
+ case "$vendorprefix" in
+ '') dflt='' ;;
+ *) dflt=$vendorprefix ;;
+ esac
+ . ./getfile
+ : XXX Prefixit unit does not yet support siteprefix and vendorprefix
+ oldvendorprefix=''
+ case "$vendorprefix" in
+ '') ;;
+ *) case "$ans" in
+ "$prefix") ;;
+ *) oldvendorprefix="$prefix";;
+ esac
+ ;;
+ esac
+ usevendorprefix="$define"
+ vendorprefix="$ans"
+ vendorprefixexp="$ansexp"
+ ;;
+*) usevendorprefix="$undef"
+ vendorprefix=''
+ vendorprefixexp=''
+ ;;
+esac
+
+case "$vendorprefix" in
+'') d_vendorlib="$undef"
+ vendorlib=''
+ vendorlibexp=''
+ ;;
+*) d_vendorlib="$define"
+ : determine where vendor-supplied modules go.
+ : Usual default is /usr/local/lib/perl5/vendor_perl/$version
+ case "$vendorlib" in
+ '')
+ prog=`echo $package | $sed 's/-*[0-9.]*$//'`
+ case "$installstyle" in
+ *lib/perl5*) dflt=$vendorprefix/lib/$package/vendor_$prog/$version ;;
+ *) dflt=$vendorprefix/lib/vendor_$prog/$version ;;
+ esac
+ ;;
+ *) dflt="$vendorlib"
+ ;;
+ esac
+ fn=d~+
+ rp='Pathname for the vendor-supplied library files?'
+ . ./getfile
+ vendorlib="$ans"
+ vendorlibexp="$ansexp"
+ ;;
+esac
+vendorlib_stem=`echo "$vendorlibexp" | sed "s,/$version$,,"`
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installvendorlib=`echo $vendorlibexp | $sed "s#^$prefix#$installprefix#"`
+else
+ installvendorlib="$vendorlibexp"
+fi
+
+case "$vendorprefix" in
+'') d_vendorarch="$undef"
+ vendorarch=''
+ vendorarchexp=''
+ ;;
+*) d_vendorarch="$define"
+ : determine where vendor-supplied architecture-dependent libraries go.
+ : vendorlib default is /usr/local/lib/perl5/vendor_perl/$version
+ : vendorarch default is /usr/local/lib/perl5/vendor_perl/$version/$archname
+ : vendorlib may have an optional trailing /share.
+ case "$vendorarch" in
+ '') dflt=`echo $vendorlib | $sed 's,/share$,,'`
+ dflt="$dflt/$archname"
+ ;;
+ *) dflt="$vendorarch" ;;
+ esac
+ fn=d~+
+ rp='Pathname for vendor-supplied architecture-dependent files?'
+ . ./getfile
+ vendorarch="$ans"
+ vendorarchexp="$ansexp"
+ ;;
+esac
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installvendorarch=`echo $vendorarchexp | sed "s#^$prefix#$installprefix#"`
+else
+ installvendorarch="$vendorarchexp"
+fi
+
: Cruising for prototypes
echo " "
echo "Checking out function prototypes..." >&4
@@ -4339,30 +5414,207 @@ if $test "X$ansexp" != "X$binexp"; then
fi
bin="$ans"
binexp="$ansexp"
-if $afs; then
- $cat <<EOM
+: Change installation prefix, if necessary.
+: XXX Bug? -- ignores Configure -Dinstallprefix setting.
+if $test X"$prefix" != X"$installprefix"; then
+ installbin=`echo $binexp | sed "s#^$prefix#$installprefix#"`
+else
+ installbin="$binexp"
+fi
-Since you are running AFS, I need to distinguish the directory in which
-executables reside from the directory in which they are installed (and from
-which they are presumably copied to the former directory by occult means).
+: Find perl5.005 or later.
+echo "Looking for a previously installed perl5.005 or later... "
+case "$perl5" in
+'') for tdir in `echo "$binexp:$PATH" | $sed "s/$path_sep/ /g"`; do
+ : Check if this perl is recent and can load a simple module
+ if $test -x $tdir/perl && $tdir/perl -Mless -e 'use 5.005;' >/dev/null 2>&1; then
+ perl5=$tdir/perl
+ break;
+ elif $test -x $tdir/perl5 && $tdir/perl5 -Mless -e 'use 5.005;' >/dev/null 2>&1; then
+ perl5=$tdir/perl
+ break;
+ fi
+ done
+ ;;
+*) perl5="$perl5"
+ ;;
+esac
+case "$perl5" in
+'') echo "None found. That's ok.";;
+*) echo "Using $perl5." ;;
+esac
+
+$cat <<EOM
+
+After $package is installed, you may wish to install various
+add-on modules and utilities. Typically, these add-ons will
+be installed under $prefix with the rest
+of this package. However, you may wish to install such add-ons
+elsewhere under a different prefix.
+
+If you do not wish to put everything under a single prefix, that's
+ok. You will be prompted for the individual locations; this siteprefix
+is only used to suggest the defaults.
+
+The default should be fine for most people.
EOM
- case "$installbin" in
- '') dflt=`echo $binexp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installbin";;
+fn=d~+
+rp='Installation prefix to use for add-on modules and utilities?'
+: XXX Here might be another good place for an installstyle setting.
+case "$siteprefix" in
+'') dflt=$prefix ;;
+*) dflt=$siteprefix ;;
+esac
+. ./getfile
+: XXX Prefixit unit does not yet support siteprefix and vendorprefix
+oldsiteprefix=''
+case "$siteprefix" in
+'') ;;
+*) case "$ans" in
+ "$prefix") ;;
+ *) oldsiteprefix="$prefix";;
esac
- fn=de~
- rp='Where will public executables be installed?'
- . ./getfile
- installbin="$ans"
+ ;;
+esac
+siteprefix="$ans"
+siteprefixexp="$ansexp"
+
+: determine where site specific libraries go.
+: Usual default is /usr/local/lib/perl5/site_perl/$version
+: The default "style" setting is made in installstyle.U
+: XXX No longer works with Prefixit stuff.
+prog=`echo $package | $sed 's/-*[0-9.]*$//'`
+case "$sitelib" in
+'') case "$installstyle" in
+ *lib/perl5*) dflt=$siteprefix/lib/$package/site_$prog/$version ;;
+ *) dflt=$siteprefix/lib/site_$prog/$version ;;
+ esac
+ ;;
+*) dflt="$sitelib"
+ ;;
+esac
+$cat <<EOM
+
+The installation process will create a directory for
+site-specific extensions and modules. Most users find it convenient
+to place all site-specific files in this directory rather than in the
+main distribution directory.
+
+EOM
+fn=d~+
+rp='Pathname for the site-specific library files?'
+. ./getfile
+sitelib="$ans"
+sitelibexp="$ansexp"
+sitelib_stem=`echo "$sitelibexp" | sed "s,/$version$,,"`
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installsitelib=`echo $sitelibexp | $sed "s#^$prefix#$installprefix#"`
else
- installbin="$binexp"
+ installsitelib="$sitelibexp"
fi
+: Determine list of previous versions to include in @INC
+$cat > getverlist <<EOPL
+#!$perl5 -w
+use File::Basename;
+\$api_versionstring = "$api_versionstring";
+\$version = "$version";
+\$sitelib = "$sitelib";
+\$archname = "$archname";
+EOPL
+ $cat >> getverlist <<'EOPL'
+# Can't have leading @ because metaconfig interprets it as a command!
+;@inc_version_list=();
+$stem=dirname($sitelib);
+# XXX Redo to do opendir/readdir?
+if (-d $stem) {
+ chdir($stem);
+ ;@candidates = glob("5.*");
+}
+else {
+ ;@candidates = ();
+}
+
+# XXX ToDo: These comparisons must be reworked when two-digit
+# subversions come along, so that 5.7.10 compares as greater than
+# 5.7.3! By that time, hope that 5.6.x is sufficiently
+# widespread that we can use the built-in version vectors rather
+# than reinventing them here. For 5.6.0, however, we must
+# assume this script will likely be run by 5.005_0x. --AD 1/2000.
+foreach $d (@candidates) {
+ if ($d lt $version) {
+ if ($d ge $api_versionstring) {
+ unshift(@inc_version_list, grep { -d } "$d/$archname", $d);
+ }
+ elsif ($d ge "5.005") {
+ unshift(@inc_version_list, grep { -d } $d);
+ }
+ }
+ else {
+ # Skip newer version. I.e. don't look in
+ # 5.7.0 if we're installing 5.6.1.
+ }
+}
+
+if (@inc_version_list) {
+ print join(' ', @inc_version_list);
+}
+else {
+ # Blank space to preserve value for next Configure run.
+ print " ";
+}
+EOPL
+chmod +x getverlist
+case "$inc_version_list" in
+'') if test -x "$perl5"; then
+ dflt=`$perl5 getverlist`
+ else
+ dflt='none'
+ fi
+ ;;
+$undef) dflt='none' ;;
+*) dflt="$inc_version_list" ;;
+esac
+case "$dflt" in
+''|' ') dflt=none ;;
+esac
+$cat <<'EOM'
+
+In order to ease the process of upgrading, this version of perl
+can be configured to use modules built and installed with earlier
+versions of perl that were installed under $prefix. Specify here
+the list of earlier versions that this version of perl should check.
+If Configure detected no earlier versions of perl installed under
+$prefix, then the list will be empty. Answer 'none' to tell perl
+to not search earlier versions.
+
+The default should almost always be sensible, so if you're not sure,
+just accept the default.
+EOM
+
+rp='List of earlier versions to include in @INC?'
+. ./myread
+case "$ans" in
+[Nn]one|''|' ') inc_version_list=' ' ;;
+*) inc_version_list="$ans" ;;
+esac
+case "$inc_version_list" in
+''|' ')
+ inc_version_list_init='0';;
+*) inc_version_list_init=`echo $inc_version_list |
+ $sed -e 's/^/"/' -e 's/ /","/g' -e 's/$/",0/'`
+ ;;
+esac
+$rm -f getverlist
+
+: determine whether to install perl also as /usr/bin/perl
+
echo " "
-if test -d /usr/bin -a "X$installbin" != X/usr/bin; then
+if $test -d /usr/bin -a "X$installbin" != X/usr/bin; then
$cat <<EOM
-Many scripts expect to perl to be installed as /usr/bin/perl.
+Many scripts expect perl to be installed as /usr/bin/perl.
I can install the perl you are about to compile also as /usr/bin/perl
(in addition to $installbin/perl).
EOM
@@ -4382,17 +5634,6 @@ fi
set installusrbinperl
eval $setvar
-: define a shorthand compile call
-compile='
-mc_file=$1;
-shift;
-$cc $optimize $ccflags $ldflags -o ${mc_file} $* ${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;'
-
echo " "
echo "Checking for GNU C Library..." >&4
cat >gnulibc.c <<EOM
@@ -4911,12 +6152,11 @@ y*) usedl="$define"
tdir=`pwd`; cd $rsrc; $ls -C $dldir/dl*.xs; cd $tdir
rp="Source file to use for dynamic loading"
fn="fne"
- # XXX This getfile call will fail the existence check if you try
- # building away from $src (this is not supported yet).
+ gfpth="$src"
. ./getfile
usedl="$define"
: emulate basename
- dlsrc=`echo $ans | $sed -e 's@.*/\([^/]*\)$@\1@'`
+ dlsrc=`echo $ans | $sed -e 's%.*/\([^/]*\)$%\1%'`
$cat << EOM
@@ -5003,11 +6243,15 @@ use no flags, say "none".
EOM
case "$lddlflags" in
'') case "$osname" in
- hpux) dflt='-b' ;;
+ beos) dflt='-nostart' ;;
+ hpux) dflt='-b';
+ case "$gccversion" in
+ '') dflt="$dflt +vnocompatwarnings" ;;
+ esac
+ ;;
linux|irix*) dflt='-shared' ;;
next) dflt='none' ;;
solaris) dflt='-G' ;;
- beos) dflt='-nostart' ;;
sunos) dflt='-assert nodefinitions' ;;
svr4*|esix*) dflt="-G $ldflags" ;;
*) dflt='none' ;;
@@ -5061,7 +6305,7 @@ EOM
' ') dflt='none' ;;
*) dflt="$ccdlflags" ;;
esac
- rp="Any special flags to pass to $cc to use dynamic loading?"
+ rp="Any special flags to pass to $cc to use dynamic linking?"
. ./myread
case "$ans" in
none) ccdlflags=' ' ;;
@@ -5084,7 +6328,7 @@ $undef)
;;
*) case "$useshrplib" in
'') case "$osname" in
- svr4*|dgux|dynixptx|esix|powerux|beos)
+ svr4*|dgux|dynixptx|esix|powerux|beos|cygwin*)
dflt=y
also='Building a shared libperl is required for dynamic loading to work on your system.'
;;
@@ -5124,15 +6368,7 @@ EOM
. ./myread
case "$ans" in
true|$define|[Yy]*)
- useshrplib='true'
- # Why does next4 have to be so different?
- case "${osname}${osvers}" in
- next4*) xxx='DYLD_LIBRARY_PATH' ;;
- os2*) xxx='' ;; # Nothing special needed.
- beos*) xxx='' ;;
- *) xxx='LD_LIBRARY_PATH' ;;
- esac
- ;;
+ useshrplib='true' ;;
*) useshrplib='false' ;;
esac
;;
@@ -5162,6 +6398,9 @@ true)
linux*) # ld won't link with a bare -lperl otherwise.
dflt=libperl.$so
;;
+ cygwin*) # include version
+ dflt=`echo libperl$version | sed -e 's/\./_/g'`$lib_ext
+ ;;
*) # Try to guess based on whether libc has major.minor.
case "$libc" in
*libc.$so.[0-9]*.[0-9]*) dflt=$majmin ;;
@@ -5203,7 +6442,7 @@ case "$shrpdir" in
*) $cat >&4 <<EOM
WARNING: Use of the shrpdir variable for the installation location of
the shared $libperl is not supported. It was never documented and
-will not work in this version. Let perlbug@perl.com
+will not work in this version. Let me (perlbug@perl.com)
know of any problems this may cause.
EOM
@@ -5252,6 +6491,10 @@ if "$useshrplib"; then
beos)
# beos doesn't like the default, either.
;;
+ hpux*)
+ # hpux doesn't like the default, either.
+ tmp_shrpenv="env LDOPTS=\"+s +b${shrpdir}\""
+ ;;
*)
tmp_shrpenv="env LD_RUN_PATH=$shrpdir"
;;
@@ -5275,10 +6518,20 @@ EOM
;;
esac
fi
+# Fix ccdlflags in AIX for building external extensions.
+# (For building Perl itself bare -bE:perl.exp is needed,
+# Makefile.SH takes care of this.)
+case "$osname" in
+aix) ccdlflags="$ccdlflags -bE:$installarchlib/CORE/perl.exp" ;;
+esac
# Respect a hint or command-line value.
case "$shrpenv" in
'') shrpenv="$tmp_shrpenv" ;;
esac
+case "$ldlibpthname" in
+'') ldlibpthname=LD_LIBRARY_PATH ;;
+none) ldlibpthname='' ;;
+esac
: determine where manual pages go
set man1dir man1dir none
@@ -5323,25 +6576,13 @@ fi
man1dir="$ans"
man1direxp="$ansexp"
case "$man1dir" in
-'') man1dir=' '
+'') man1dir=' '
installman1dir='';;
esac
-if $afs; then
- $cat <<EOM
-Since you are running AFS, I need to distinguish the directory in which
-manual pages reside from the directory in which they are installed (and from
-which they are presumably copied to the former directory by occult means).
-
-EOM
- case "$installman1dir" in
- '') dflt=`echo $man1direxp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installman1dir";;
- esac
- fn=de~
- rp='Where will man pages be installed?'
- . ./getfile
- installman1dir="$ans"
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installman1dir=`echo $man1direxp | $sed "s#^$prefix#$installprefix#"`
else
installman1dir="$man1direxp"
fi
@@ -5378,46 +6619,26 @@ esac
: see if we can have long filenames
echo " "
-rmlist="$rmlist /tmp/cf$$"
-$test -d /tmp/cf$$ || mkdir /tmp/cf$$
first=123456789abcdef
-second=/tmp/cf$$/$first
-$rm -f $first $second
+$rm -f $first
if (echo hi >$first) 2>/dev/null; then
if $test -f 123456789abcde; then
echo 'You cannot have filenames longer than 14 characters. Sigh.' >&4
val="$undef"
else
- if (echo hi >$second) 2>/dev/null; then
- if $test -f /tmp/cf$$/123456789abcde; then
- $cat <<'EOM'
-That's peculiar... You can have filenames longer than 14 characters, but only
-on some of the filesystems. Maybe you are using NFS. Anyway, to avoid problems
-I shall consider your system cannot support long filenames at all.
-EOM
- val="$undef"
- else
- echo 'You can have filenames longer than 14 characters.' >&4
- val="$define"
- fi
- else
- $cat <<'EOM'
-How confusing! Some of your filesystems are sane enough to allow filenames
-longer than 14 characters but some others like /tmp can't even think about them.
-So, for now on, I shall assume your kernel does not allow them at all.
-EOM
- val="$undef"
- fi
+ echo 'You can have filenames longer than 14 characters.'>&4
+ val="$define"
fi
else
$cat <<'EOM'
-You can't have filenames longer than 14 chars. You can't even think about them!
+You can't have filenames longer than 14 chars.
+You can't even think about them!
EOM
val="$undef"
fi
set d_flexfnam
eval $setvar
-$rm -rf /tmp/cf$$ 123456789abcde*
+$rm -rf 123456789abcde*
: determine where library module manual pages go
set man3dir man3dir none
@@ -5450,52 +6671,48 @@ esac
echo "If you don't want the manual sources installed, answer 'none'."
prog=`echo $package | $sed 's/-*[0-9.]*$//'`
case "$man3dir" in
-'') case "$prefix" in
- *$prog*) dflt=`echo $man1dir |
- $sed -e 's/man1/man3/g' -e 's/man\.1/man\.3/g'` ;;
- *) dflt="$privlib/man/man3" ;;
- esac
+'') dflt=`echo "$man1dir" | $sed -e 's/man1/man3/g' -e 's/man\.1/man\.3/g'`
+ if $test -d "$privlib/man/man3"; then
+ cat <<EOM >&4
+
+WARNING: Previous versions of perl installed man3 pages into
+$privlib/man/man3. This version will suggest a
+new default of $dflt.
+EOM
+ tdflt=$dflt
+ dflt='n'
+ rp='Do you wish to preserve the old behavior?(y/n)'
+ . ./myread
+ case "$ans" in
+ y*) dflt="$privlib/man/man3" ;;
+ *) dflt=$tdflt ;;
+ esac
+ fi
;;
-' ') dflt=none;;
*) dflt="$man3dir" ;;
esac
+case "$dflt" in
+' ') dflt=none ;;
+esac
echo " "
-
fn=dn+~
rp="Where do the $package library man pages (source) go?"
. ./getfile
-if test "X$man3direxp" != "X$ansexp"; then
- installman3dir=''
-fi
-
man3dir="$ans"
man3direxp="$ansexp"
case "$man3dir" in
-'') man3dir=' '
+'') man3dir=' '
installman3dir='';;
esac
-if $afs; then
- $cat <<EOM
-
-Since you are running AFS, I need to distinguish the directory in which
-manual pages reside from the directory in which they are installed (and from
-which they are presumably copied to the former directory by occult means).
-EOM
- case "$installman3dir" in
- '') dflt=`echo $man3direxp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installman3dir";;
- esac
- fn=de~
- rp='Where will man pages be installed?'
- . ./getfile
- installman3dir="$ans"
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installman3dir=`echo $man3direxp | $sed "s#^$prefix#$installprefix#"`
else
installman3dir="$man3direxp"
fi
: What suffix to use on installed man pages
-
case "$man3dir" in
' ')
man3ext='0'
@@ -5569,13 +6786,13 @@ if $test -d /usr/etc/yp || $test -d /etc/yp; then
esac
fi
case "$hostcat" in
-'') hostcat='cat /etc/hosts';;
+'') test -f /etc/hosts && hostcat='cat /etc/hosts';;
esac
case "$groupcat" in
-'') groupcat='cat /etc/group';;
+'') test -f /etc/group && groupcat='cat /etc/group';;
esac
case "$passcat" in
-'') passcat='cat /etc/passwd';;
+'') test -f /etc/passwd && passcat='cat /etc/passwd';;
esac
: now get the host name
@@ -5677,6 +6894,7 @@ case "$myhostname" in
$sed -e 's/[ ]*#.*//; s/$/ /' > hosts && \
$test -s hosts
} || {
+ test "X$hostcat" != "X" &&
$hostcat | $sed -n -e "s/[ ]*#.*//; s/\$/ /
/[ ]$myhostname[ . ]/p" > hosts
}
@@ -5773,7 +6991,7 @@ $cat <<EOM
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
+is most probably close to reality but may not be valid from outside
your organization...
EOM
@@ -5894,9 +7112,10 @@ case "$scriptdir" in
dflt="$bin"
: guess some guesses
$test -d /usr/share/scripts && dflt=/usr/share/scripts
- $test -d /usr/share/bin && dflt=/usr/share/bin
- $test -d /usr/local/script && dflt=/usr/local/script
- $test -d $prefixexp/script && dflt=$prefixexp/script
+ $test -d /usr/share/bin && dflt=/usr/share/bin
+ $test -d /usr/local/script && dflt=/usr/local/script
+ $test -d /usr/local/scripts && dflt=/usr/local/scripts
+ $test -d $prefixexp/script && dflt=$prefixexp/script
set dflt
eval $prefixup
;;
@@ -5919,118 +7138,126 @@ if $test "X$ansexp" != "X$scriptdirexp"; then
fi
scriptdir="$ans"
scriptdirexp="$ansexp"
-if $afs; then
- $cat <<EOM
-
-Since you are running AFS, I need to distinguish the directory in which
-scripts reside from the directory in which they are installed (and from
-which they are presumably copied to the former directory by occult means).
-
-EOM
- case "$installscript" in
- '') dflt=`echo $scriptdirexp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installscript";;
- esac
- fn=de~
- rp='Where will public scripts be installed?'
- . ./getfile
- installscript="$ans"
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installscript=`echo $scriptdirexp | sed "s#^$prefix#$installprefix#"`
else
installscript="$scriptdirexp"
fi
-: determine where site specific libraries go.
-: Usual default is /usr/local/lib/perl5/site_perl/$apiversion
-prog=`echo $package | $sed 's/-*[0-9.]*$//'`
-case "$prefix" in
-*perl*) set dflt sitelib lib/site_$prog/$apiversion ;;
-*) set dflt sitelib lib/$package/site_$prog/$apiversion ;;
+: determine where site specific architecture-dependent libraries go.
+: sitelib default is /usr/local/lib/perl5/site_perl/$version
+: sitearch default is /usr/local/lib/perl5/site_perl/$version/$archname
+: sitelib may have an optional trailing /share.
+case "$sitearch" in
+'') dflt=`echo $sitelib | $sed 's,/share$,,'`
+ dflt="$dflt/$archname"
+ ;;
+*) dflt="$sitearch"
+ ;;
esac
+set sitearch sitearch none
eval $prefixit
$cat <<EOM
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.
+architecture-dependent site-specific extensions and modules.
EOM
fn=d~+
-rp='Pathname for the site-specific library files?'
+rp='Pathname for the site-specific architecture-dependent library files?'
. ./getfile
-if $test "X$sitelibexp" != "X$ansexp"; then
- installsitelib=''
+sitearch="$ans"
+sitearchexp="$ansexp"
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installsitearch=`echo $sitearchexp | sed "s#^$prefix#$installprefix#"`
+else
+ installsitearch="$sitearchexp"
fi
-sitelib="$ans"
-sitelibexp="$ansexp"
-if $afs; then
- $cat <<EOM
-
-Since you are running AFS, I need to distinguish the directory in
-which site-specific files reside from the directory in which they are
-installed (and from which they are presumably copied to the former
-directory by occult means).
-EOM
- case "$installsitelib" in
- '') dflt=`echo $sitelibexp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installsitelib";;
- esac
- fn=de~
- rp='Where will site-specific files be installed?'
- . ./getfile
- installsitelib="$ans"
+: determine where add-on public executables go
+case "$sitebin" in
+'') dflt=$siteprefix/bin ;;
+*) dflt=$sitebin ;;
+esac
+fn=d~
+rp='Pathname where the add-on public executables should be installed?'
+. ./getfile
+sitebin="$ans"
+sitebinexp="$ansexp"
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installsitebin=`echo $sitebinexp | sed "s#^$prefix#$installprefix#"`
else
- installsitelib="$sitelibexp"
+ installsitebin="$sitebinexp"
fi
-: determine where site specific architecture-dependent libraries go.
-: sitelib default is /usr/local/lib/perl5/site_perl/$apiversion
-: sitearch default is /usr/local/lib/perl5/site_perl/$apiversion/$archname
-: sitelib may have an optional trailing /share.
-tdflt=`echo $sitelib | $sed 's,/share$,,'`
-tdflt="$tdflt/$archname"
-set sitearch sitearch none
-eval $prefixit
-case "$sitearch" in
-'') dflt="$tdflt" ;;
-*) dflt="$sitearch" ;;
+: see if sqrtl exists
+set sqrtl d_sqrtl
+eval $inlibc
+
+case "$ccflags" in
+*-DUSE_LONG_DOUBLE*|*-DUSE_MORE_BITS*) uselongdouble="$define" ;;
esac
-$cat <<EOM
-The installation process will also create a directory for
-architecture-dependent site-specific extensions and modules.
+case "$uselongdouble" in
+$define|true|[yY]*) dflt='y';;
+*) dflt='n';;
+esac
+cat <<EOM
+Perl can be built to take advantage of long doubles which
+(if available) may give more accuracy and range for floating point numbers.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
EOM
-fn=nd~+
-rp='Pathname for the site-specific architecture-dependent library files?'
-. ./getfile
-if $test "X$sitearchexp" != "X$ansexp"; then
- installsitearch=''
-fi
-sitearch="$ans"
-sitearchexp="$ansexp"
-if $afs; then
- $cat <<EOM
+rp='Try to use long doubles if available?'
+. ./myread
+case "$ans" in
+y|Y) val="$define" ;;
+*) val="$undef" ;;
+esac
+set uselongdouble
+eval $setvar
-Since you are running AFS, I need to distinguish the directory in
-which site-specific architecture-dependent library files reside from
-the directory in which they are installed (and from which they are
-presumably copied to the former directory by occult means).
+case "$uselongdouble" in
+true|[yY]*) uselongdouble="$define" ;;
+esac
+case "$uselongdouble" in
+$define)
+: Look for a hint-file generated 'call-back-unit'. If the
+: user has specified that long doubles should be used,
+: we may need to set or change some other defaults.
+ if $test -f uselongdouble.cbu; then
+ echo "Your platform has some specific hints for long doubles, using them..."
+ . ./uselongdouble.cbu
+ else
+ $cat <<EOM
+(Your platform doesn't have any specific hints for long doubles.)
EOM
- case "$installsitearch" in
- '') dflt=`echo $sitearchexp | sed 's#^/afs/#/afs/.#'`;;
- *) dflt="$installsitearch";;
- esac
- fn=de~
- rp='Where will site-specific architecture-dependent files be installed?'
- . ./getfile
- installsitearch="$ans"
-else
- installsitearch="$sitearchexp"
-fi
+ fi
+ ;;
+esac
+
+case "$uselongdouble:$d_sqrtl" in
+$define:$undef)
+ $cat <<EOM >&4
+*** You requested the use of long doubles but you do not seem to have
+*** the mathematic functions for long doubles. I'm disabling the use
+*** of long doubles.
+
+EOM
+ uselongdouble=$undef
+ ;;
+esac
+
+case "$useperlio" in
+$define|true|[yY]*) dflt='y';;
+*) dflt='n';;
+esac
cat <<EOM
Previous version of $package used the standard IO mechanisms as defined
@@ -6041,12 +7268,8 @@ have sfio installed) or regular stdio. Using PerlIO with sfio may cause
problems with some extension modules. Using PerlIO with stdio is safe,
but it is slower than plain stdio and therefore is not the default.
-If this doesn't make any sense to you, just accept the default 'n'.
+If this doesn't make any sense to you, just accept the default '$dflt'.
EOM
-case "$useperlio" in
-$define|true|[yY]*) dflt='y';;
-*) dflt='n';;
-esac
rp='Use the experimental PerlIO abstraction layer?'
. ./myread
case "$ans" in
@@ -6061,11 +7284,237 @@ esac
set useperlio
eval $setvar
+case "$vendorprefix" in
+'') d_vendorbin="$undef"
+ vendorbin=''
+ vendorbinexp=''
+ ;;
+*) d_vendorbin="$define"
+ : determine where vendor-supplied executables go.
+ case "$vendorbin" in
+ '') dflt=$vendorprefix/bin ;;
+ *) dflt="$vendorbin" ;;
+ esac
+ fn=d~+
+ rp='Pathname for the vendor-supplied executables directory?'
+ . ./getfile
+ vendorbin="$ans"
+ vendorbinexp="$ansexp"
+ ;;
+esac
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+ installvendorbin=`echo $vendorbinexp | $sed "s#^$prefix#$installprefix#"`
+else
+ installvendorbin="$vendorbinexp"
+fi
+
+: see if qgcvt exists
+set qgcvt d_qgcvt
+eval $inlibc
+
+: check for length of double
+echo " "
+case "$doublesize" in
+'')
+ echo "Checking to see how big your double precision numbers are..." >&4
+ $cat >try.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+ printf("%d\n", (int)sizeof(double));
+ exit(0);
+}
+EOCP
+ set try
+ if eval $compile_ok; then
+ doublesize=`./try`
+ echo "Your double is $doublesize bytes long."
+ else
+ dflt='8'
+ echo "(I can't seem to compile the test program. Guessing...)"
+ rp="What is the size of a double precision number (in bytes)?"
+ . ./myread
+ doublesize="$ans"
+ fi
+ ;;
+esac
+$rm -f try.c try
+
+: check for long doubles
+echo " "
+echo "Checking to see if you have long double..." >&4
+echo 'int main() { long double x = 7.0; }' > try.c
+set try
+if eval $compile; then
+ val="$define"
+ echo "You have long double."
+else
+ val="$undef"
+ echo "You do not have long double."
+fi
+$rm try.*
+set d_longdbl
+eval $setvar
+
+: check for length of long double
+case "${d_longdbl}${longdblsize}" in
+$define)
+ echo " "
+ echo "Checking to see how big your long doubles are..." >&4
+ $cat >try.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+ printf("%d\n", sizeof(long double));
+}
+EOCP
+ set try
+ set try
+ if eval $compile; then
+ longdblsize=`./try$exe_ext`
+ echo "Your long doubles are $longdblsize bytes long."
+ else
+ dflt='8'
+ echo " "
+ echo "(I can't seem to compile the test program. Guessing...)" >&4
+ rp="What is the size of a long double (in bytes)?"
+ . ./myread
+ longdblsize="$ans"
+ fi
+ if $test "X$doublesize" = "X$longdblsize"; then
+ echo "(That isn't any different from an ordinary double.)"
+ fi
+ ;;
+esac
+$rm -f try.* try
+
+echo " "
+
+if $test X"$d_longdbl" = X"$define"; then
+
+echo "Checking how to print long doubles..." >&4
+
+if $test X"$sPRIfldbl" = X -a X"$doublesize" = X"$longdblsize"; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ double d = 123.456;
+ printf("%.3f\n", d);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 123.456)
+ sPRIfldbl='"f"'; sPRIgldbl='"g"'; sPRIeldbl='"e"';
+ sPRIFldbl='"F"'; sPRIGldbl='"G"'; sPRIEldbl='"E"';
+ echo "We will use %f."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ long double d = 123.456;
+ printf("%.3llf\n", d);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 123.456)
+ sPRIfldbl='"llf"'; sPRIgldbl='"llg"'; sPRIeldbl='"lle"';
+ sPRIFldbl='"llF"'; sPRIGldbl='"llG"'; sPRIEldbl='"llE"';
+ echo "We will use %llf."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ long double d = 123.456;
+ printf("%.3Lf\n", d);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 123.456)
+ sPRIfldbl='"Lf"'; sPRIgldbl='"Lg"'; sPRIeldbl='"Le"';
+ sPRIFldbl='"LF"'; sPRIGldbl='"LG"'; sPRIEldbl='"LE"';
+ echo "We will use %Lf."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ long double d = 123.456;
+ printf("%.3lf\n", d);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 123.456)
+ sPRIfldbl='"lf"'; sPRIgldbl='"lg"'; sPRIeldbl='"le"';
+ sPRIFldbl='"lF"'; sPRIGldbl='"lG"'; sPRIEldbl='"lE"';
+ echo "We will use %lf."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+ echo "Cannot figure out how to print long doubles." >&4
+fi
+
+$rm -f try try.*
+
+fi # d_longdbl
+
+case "$sPRIfldbl" in
+'') d_PRIfldbl="$undef"; d_PRIgldbl="$undef"; d_PRIeldbl="$undef";
+ d_PRIFldbl="$undef"; d_PRIGldbl="$undef"; d_PRIEldbl="$undef";
+ ;;
+*) d_PRIfldbl="$define"; d_PRIgldbl="$define"; d_PRIeldbl="$define";
+ d_PRIFldbl="$define"; d_PRIGldbl="$define"; d_PRIEldbl="$define";
+ ;;
+esac
+
: Check how to convert floats to strings.
if test "X$d_Gconvert" = X; then
- echo " "
- echo "Checking for an efficient way to convert floats to strings."
- $cat >try.c <<'EOP'
+ echo " "
+ echo "Checking for an efficient way to convert floats to strings."
+ echo " " > try.c
+ case "$uselongdouble" in
+ "$define") echo "#define USE_LONG_DOUBLE" >>try.c ;;
+ esac
+ case "$d_longdbl" in
+ "$define") echo "#define HAS_LONG_DOUBLE" >>try.c ;;
+ esac
+ case "$d_PRIgldbl" in
+ "$define") echo "#define HAS_PRIgldbl" >>try.c ;;
+ esac
+ $cat >>try.c <<EOP
#ifdef TRY_gconvert
#define Gconvert(x,n,t,b) gconvert((x),(n),(t),(b))
char *myname = "gconvert";
@@ -6074,13 +7523,35 @@ char *myname = "gconvert";
#define Gconvert(x,n,t,b) gcvt((x),(n),(b))
char *myname = "gcvt";
#endif
+#ifdef TRY_qgcvt
+#define Gconvert(x,n,t,b) qgcvt((x),(n),(b))
+char *myname = "qgcvt";
+#define DOUBLETYPE long double
+#endif
#ifdef TRY_sprintf
+#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && defined(HAS_PRIgldbl)
+#define Gconvert(x,n,t,b) sprintf((b),"%.*"$sPRIgldbl,(n),(x))
+#else
#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+#endif
char *myname = "sprintf";
#endif
+#ifndef DOUBLETYPE
+#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#define DOUBLETYPE long double
+#else
+#define DOUBLETYPE double
+#endif
+#endif
+
#include <stdio.h>
+#define I_STDLIB $i_stdlib
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+
int
checkit(expect, got)
char *expect;
@@ -6100,58 +7571,86 @@ int main()
/* This must be 1st test on (which?) platform */
/* Alan Burlison <AlanBurlsin@unn.unisys.com> */
- Gconvert(0.1, 8, 0, buf);
+ Gconvert((DOUBLETYPE)0.1, 8, 0, buf);
checkit("0.1", buf);
- Gconvert(1.0, 8, 0, buf);
+ Gconvert((DOUBLETYPE)1.0, 8, 0, buf);
checkit("1", buf);
- Gconvert(0.0, 8, 0, buf);
+ Gconvert((DOUBLETYPE)1.1, 8, 0, buf);
+ checkit("1.1", buf);
+
+ Gconvert((DOUBLETYPE)1.01, 8, 0, buf);
+ checkit("1.01", buf);
+
+ Gconvert((DOUBLETYPE)1.001, 8, 0, buf);
+ checkit("1.001", buf);
+
+ Gconvert((DOUBLETYPE)1.0001, 8, 0, buf);
+ checkit("1.0001", buf);
+
+ Gconvert((DOUBLETYPE)1.00001, 8, 0, buf);
+ checkit("1.00001", buf);
+
+ Gconvert((DOUBLETYPE)1.000001, 8, 0, buf);
+ checkit("1.000001", buf);
+
+ Gconvert((DOUBLETYPE)0.0, 8, 0, buf);
checkit("0", buf);
- Gconvert(-1.0, 8, 0, buf);
+ Gconvert((DOUBLETYPE)-1.0, 8, 0, buf);
checkit("-1", buf);
/* Some Linux gcvt's give 1.e+5 here. */
- Gconvert(100000.0, 8, 0, buf);
+ Gconvert((DOUBLETYPE)100000.0, 8, 0, buf);
checkit("100000", buf);
/* Some Linux gcvt's give -1.e+5 here. */
- Gconvert(-100000.0, 8, 0, buf);
+ Gconvert((DOUBLETYPE)-100000.0, 8, 0, buf);
checkit("-100000", buf);
exit(0);
}
EOP
- case "$d_Gconvert" in
- gconvert*) xxx_list='gconvert gcvt sprintf' ;;
- gcvt*) xxx_list='gcvt gconvert sprintf' ;;
- sprintf*) xxx_list='sprintf gconvert gcvt' ;;
- *) xxx_list='gconvert gcvt sprintf' ;;
- esac
+ case "$d_Gconvert" in
+ gconvert*) xxx_list='gconvert gcvt sprintf' ;;
+ gcvt*) xxx_list='gcvt gconvert sprintf' ;;
+ sprintf*) xxx_list='sprintf gconvert gcvt' ;;
+ *) xxx_list='gconvert gcvt sprintf' ;;
+ esac
- for xxx_convert in $xxx_list; do
- echo "Trying $xxx_convert"
- $rm -f try try$_o
- set try -DTRY_$xxx_convert
- if eval $compile; then
- echo "$xxx_convert" found. >&4
- if ./try; then
- echo "I'll use $xxx_convert to convert floats into a string." >&4
- break;
+ case "$d_longdbl$uselongdouble$d_qgcvt" in
+ "$define$define$define") xxx_list="`echo $xxx_list|sed 's/gcvt/qgcvt gcvt/'`" ;;
+ esac
+
+ for xxx_convert in $xxx_list; do
+ echo "Trying $xxx_convert..."
+ $rm -f try try$_o
+ set try -DTRY_$xxx_convert
+ if eval $compile; then
+ echo "$xxx_convert() found." >&4
+ if ./try; then
+ echo "I'll use $xxx_convert to convert floats into a string." >&4
+ break;
+ else
+ echo "...But $xxx_convert didn't work as I expected."
+ fi
else
- echo "...But $xxx_convert didn't work as I expected."
+ echo "$xxx_convert NOT found." >&4
fi
- else
- echo "$xxx_convert NOT found." >&4
- fi
- done
+ done
- case "$xxx_convert" in
- gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;;
- gcvt) d_Gconvert='gcvt((x),(n),(b))' ;;
- *) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;;
- esac
+ case "$xxx_convert" in
+ gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;;
+ gcvt) d_Gconvert='gcvt((x),(n),(b))' ;;
+ qgcvt) d_Gconvert='qgcvt((x),(n),(b))' ;;
+ *) case "$uselongdouble$d_longdbl$d_PRIgldbl" in
+ "$define$define$define")
+ d_Gconvert="sprintf((b),\"%.*$sPRIgldbl\",(n),(x))" ;;
+ *) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;;
+ esac
+ ;;
+ esac
fi
: Initialize h_fcntl
@@ -6202,10 +7701,22 @@ EOCP
esac
$rm -f access*
+: see if accessx exists
+set accessx d_accessx
+eval $inlibc
+
: see if alarm exists
set alarm d_alarm
eval $inlibc
+: see if atolf exists
+set atolf d_atolf
+eval $inlibc
+
+: see if atoll exists
+set atoll d_atoll
+eval $inlibc
+
: Look for GNU-cc style attribute checking
echo " "
echo "Checking whether your compiler can handle __attribute__ ..." >&4
@@ -6368,52 +7879,6 @@ $rm -f set set.c
set bzero d_bzero
eval $inlibc
-: check for lengths of integral types
-echo " "
-case "$intsize" in
-'')
- echo "Checking to see how big your integers are..." >&4
- $cat >intsize.c <<'EOCP'
-#include <stdio.h>
-int main()
-{
- printf("intsize=%d;\n", sizeof(int));
- printf("longsize=%d;\n", sizeof(long));
- printf("shortsize=%d;\n", sizeof(short));
- exit(0);
-}
-EOCP
- set intsize
- if eval $compile_ok && ./intsize > /dev/null; then
- eval `./intsize`
- echo "Your integers are $intsize bytes long."
- echo "Your long integers are $longsize bytes long."
- echo "Your short integers are $shortsize bytes long."
- else
- $cat >&4 <<EOM
-!
-Help! I can't compile and run the intsize test program: please enlighten me!
-(This is probably a misconfiguration in your system or libraries, and
-you really ought to fix it. Still, I'll try anyway.)
-!
-EOM
- dflt=4
- rp="What is the size of an integer (in bytes)?"
- . ./myread
- intsize="$ans"
- dflt=$intsize
- rp="What is the size of a long integer (in bytes)?"
- . ./myread
- longsize="$ans"
- dflt=2
- rp="What is the size of a short integer (in bytes)?"
- . ./myread
- shortsize="$ans"
- fi
- ;;
-esac
-$rm -f intsize intsize.*
-
: see if signal is declared as pointer to function returning int or void
echo " "
xxx=`./findhdr signal.h`
@@ -6718,6 +8183,18 @@ fi
set d_crypt
eval $setvar
+: get csh whereabouts
+case "$csh" in
+'csh') val="$undef" ;;
+*) val="$define" ;;
+esac
+set d_csh
+eval $setvar
+: Respect a hint or command line value for full_csh.
+case "$full_csh" in
+'') full_csh=$csh ;;
+esac
+
: see if cuserid exists
set cuserid d_cuserid
eval $inlibc
@@ -6761,10 +8238,6 @@ eval $setvar
set difftime d_difftime
eval $inlibc
-: see if sys/stat.h is available
-set sys/stat.h i_sysstat
-eval $inhdr
-
: see if this is a dirent system
echo " "
if xinc=`./findhdr dirent.h`; $test "$xinc"; then
@@ -6833,23 +8306,6 @@ set d_dirnamlen
eval $setvar
$rm -f try.c
-hasfield='varname=$1; struct=$2; field=$3; shift; shift; shift;
-while $test $# -ge 2; do
- case "$1" in
- $define) echo "#include <$2>";;
- esac ;
- shift 2;
-done > try.c;
-echo "int main () { struct $struct foo; foo.$field = 0; }" >> try.c;
-if eval $cc $optimize $ccflags -c try.c >/dev/null 2>&1; then
- val="$define";
-else
- val="$undef";
-fi;
-set $varname;
-eval $setvar;
-$rm -f try.c try.o'
-
: see if dlerror exists
xxx_runnm="$runnm"
runnm=false
@@ -6957,6 +8413,7 @@ EOM
esac
else
echo "I can't compile and run the test program." >&4
+ echo "I'm guessing that dlsym doesn't need a leading underscore." >&4
fi
;;
esac
@@ -6966,10 +8423,42 @@ $rm -f fred fred.? dyna.$dlext dyna.? tmp-dyna.?
set d_dlsymun
eval $setvar
+hasproto='varname=$1; func=$2; shift; shift;
+while $test $# -ge 2; do
+ case "$1" in
+ $define) echo "#include <$2>";;
+ esac ;
+ shift 2;
+done > try.c;
+$cppstdin $cppflags $cppminus < try.c > tryout.c 2>/dev/null;
+if $contains "$func.*(" tryout.c >/dev/null 2>&1; then
+ echo "$func() prototype found.";
+ val="$define";
+else
+ echo "$func() prototype NOT found.";
+ val="$undef";
+fi;
+set $varname;
+eval $setvar;
+$rm -f try.c tryout.c'
+
+: see if prototype for drand48 is available
+echo " "
+set d_drand48proto drand48 $i_stdlib stdlib.h $i_unistd unistd.h
+eval $hasproto
+
: see if dup2 exists
set dup2 d_dup2
eval $inlibc
+: see if eaccess exists
+set eaccess d_eaccess
+eval $inlibc
+
+: see if endgrent exists
+set endgrent d_endgrent
+eval $inlibc
+
: see if endhostent exists
set endhostent d_endhent
eval $inlibc
@@ -6982,10 +8471,18 @@ eval $inlibc
set endprotoent d_endpent
eval $inlibc
+: see if endpwent exists
+set endpwent d_endpwent
+eval $inlibc
+
: see if endservent exists
set endservent d_endsent
eval $inlibc
+: see if endspent exists
+set endspent d_endspent
+eval $inlibc
+
: Locate the flags for 'open()'
echo " "
$cat >open3.c <<'EOCP'
@@ -7036,6 +8533,28 @@ set d_open3
eval $setvar
$rm -f open3*
+: see which of string.h or strings.h is needed
+echo " "
+strings=`./findhdr string.h`
+if $test "$strings" && $test -r "$strings"; then
+ echo "Using <string.h> instead of <strings.h>." >&4
+ val="$define"
+else
+ val="$undef"
+ strings=`./findhdr strings.h`
+ if $test "$strings" && $test -r "$strings"; then
+ echo "Using <strings.h> instead of <string.h>." >&4
+ else
+ echo "No string header found -- You'll surely have problems." >&4
+ fi
+fi
+set i_string
+eval $setvar
+case "$i_string" in
+"$undef") strings=`./findhdr strings.h`;;
+*) strings=`./findhdr string.h`;;
+esac
+
: check for non-blocking I/O stuff
case "$h_sysfile" in
true) echo "#include <sys/file.h>" > head.c;;
@@ -7052,6 +8571,7 @@ case "$o_nonblock" in
'')
$cat head.c > try.c
$cat >>try.c <<'EOCP'
+#include <stdio.h>
int main() {
#ifdef O_NONBLOCK
printf("O_NONBLOCK\n");
@@ -7092,10 +8612,21 @@ case "$eagain" in
#include <errno.h>
#include <sys/types.h>
#include <signal.h>
+#include <stdio.h>
#define MY_O_NONBLOCK $o_nonblock
#ifndef errno /* XXX need better Configure test */
extern int errno;
#endif
+#$i_unistd I_UNISTD
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+#$i_string I_STRING
+#ifdef I_STRING
+#include <string.h>
+#else
+#include <strings.h>
+#endif
$signal_t blech(x) int x; { exit(3); }
EOCP
$cat >> try.c <<'EOCP'
@@ -7225,6 +8756,269 @@ eval $inlibc
set fcntl d_fcntl
eval $inlibc
+hasfield='varname=$1; struct=$2; field=$3; shift; shift; shift;
+while $test $# -ge 2; do
+ case "$1" in
+ $define) echo "#include <$2>";;
+ esac ;
+ shift 2;
+done > try.c;
+echo "int main () { struct $struct foo; char* bar; bar = (char*)foo.$field; }" >> try.c;
+set try;
+if eval $compile; then
+ val="$define";
+else
+ val="$undef";
+fi;
+set $varname;
+eval $setvar;
+$rm -f try.c try.o'
+
+socketlib=''
+sockethdr=''
+: see whether socket exists
+echo " "
+$echo $n "Hmm... $c" >&4
+if set socket val -f d_socket; eval $csym; $val; then
+ echo "Looks like you have Berkeley networking support." >&4
+ d_socket="$define"
+ if set setsockopt val -f; eval $csym; $val; then
+ d_oldsock="$undef"
+ else
+ echo "...but it uses the old BSD 4.1c interface, rather than 4.2." >&4
+ d_oldsock="$define"
+ fi
+else
+ if $contains socklib libc.list >/dev/null 2>&1; then
+ echo "Looks like you have Berkeley networking support." >&4
+ d_socket="$define"
+ : we will have to assume that it supports the 4.2 BSD interface
+ d_oldsock="$undef"
+ else
+ echo "You don't have Berkeley networking in libc$_a..." >&4
+ if test "X$d_socket" = "X$define"; then
+ echo "...but you seem to believe that you have sockets." >&4
+ else
+ for net in net socket
+ do
+ if test -f /usr/lib/lib$net$_a; then
+ ( ($nm $nm_opt /usr/lib/lib$net$_a | eval $nm_extract) || \
+ $ar t /usr/lib/lib$net$_a) 2>/dev/null >> libc.list
+ if $contains socket libc.list >/dev/null 2>&1; then
+ d_socket="$define"
+ socketlib="-l$net"
+ case "$net" in
+ net)
+ echo "...but the Wollongong group seems to have hacked it in." >&4
+ sockethdr="-I/usr/netinclude"
+ ;;
+ esac
+ echo "Found Berkeley sockets interface in lib$net." >& 4
+ if $contains setsockopt libc.list >/dev/null 2>&1; then
+ d_oldsock="$undef"
+ else
+ echo "...using the old BSD 4.1c interface, rather than 4.2." >&4
+ d_oldsock="$define"
+ fi
+ break
+ fi
+ fi
+ done
+ if test "X$d_socket" != "X$define"; then
+ echo "or anywhere else I see." >&4
+ d_socket="$undef"
+ d_oldsock="$undef"
+ fi
+ fi
+ fi
+fi
+
+: see if socketpair exists
+set socketpair d_sockpair
+eval $inlibc
+
+
+echo " "
+echo "Checking the availability of certain socket constants..." >& 4
+for ENUM in MSG_CTRUNC MSG_DONTROUTE MSG_OOB MSG_PEEK MSG_PROXY SCM_RIGHTS; do
+ enum=`$echo $ENUM|./tr '[A-Z]' '[a-z]'`
+ $cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+int main() {
+ int i = $ENUM;
+}
+EOF
+ val="$undef"
+ set try; if eval $compile; then
+ val="$define"
+ fi
+ set d_${enum}; eval $setvar
+ $rm -f try.c try
+done
+
+: see if sys/select.h has to be included
+set sys/select.h i_sysselct
+eval $inhdr
+
+: see if we should include time.h, sys/time.h, or both
+echo " "
+if test "X$timeincl" = X; then
+ echo "Testing to see if we should include <time.h>, <sys/time.h> or both." >&4
+ $echo $n "I'm now running the test program...$c"
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#ifdef I_TIME
+#include <time.h>
+#endif
+#ifdef I_SYSTIME
+#ifdef SYSTIMEKERNEL
+#define KERNEL
+#endif
+#include <sys/time.h>
+#endif
+#ifdef I_SYSSELECT
+#include <sys/select.h>
+#endif
+int main()
+{
+ struct tm foo;
+#ifdef S_TIMEVAL
+ struct timeval bar;
+#endif
+#ifdef S_TIMEZONE
+ struct timezone tzp;
+#endif
+ if (foo.tm_sec == foo.tm_sec)
+ exit(0);
+#ifdef S_TIMEVAL
+ if (bar.tv_sec == bar.tv_sec)
+ exit(0);
+#endif
+ exit(1);
+}
+EOCP
+ flags=''
+ for s_timezone in '-DS_TIMEZONE' ''; do
+ sysselect=''
+ for s_timeval in '-DS_TIMEVAL' ''; do
+ for i_systimek in '' '-DSYSTIMEKERNEL'; do
+ for i_time in '' '-DI_TIME'; do
+ for i_systime in '-DI_SYSTIME' ''; do
+ case "$flags" in
+ '') $echo $n ".$c"
+ set try $i_time $i_systime $i_systimek $sysselect $s_timeval $s_timezone
+ if eval $compile; then
+ set X $i_time $i_systime $i_systimek $sysselect $s_timeval
+ shift
+ flags="$*"
+ echo " "
+ $echo $n "Succeeded with $flags$c"
+ fi
+ ;;
+ esac
+ done
+ done
+ done
+ done
+ done
+ timeincl=''
+ echo " "
+ case "$flags" in
+ *SYSTIMEKERNEL*) i_systimek="$define"
+ timeincl=`./findhdr sys/time.h`
+ echo "We'll include <sys/time.h> with KERNEL defined." >&4;;
+ *) i_systimek="$undef";;
+ esac
+ case "$flags" in
+ *I_TIME*) i_time="$define"
+ timeincl=`./findhdr time.h`" $timeincl"
+ echo "We'll include <time.h>." >&4;;
+ *) i_time="$undef";;
+ esac
+ case "$flags" in
+ *I_SYSTIME*) i_systime="$define"
+ timeincl=`./findhdr sys/time.h`" $timeincl"
+ echo "We'll include <sys/time.h>." >&4;;
+ *) i_systime="$undef";;
+ esac
+ $rm -f try.c try
+fi
+
+: check for fd_set items
+$cat <<EOM
+
+Checking to see how well your C compiler handles fd_set and friends ...
+EOM
+$cat >fd_set.c <<EOCP
+#$i_systime I_SYS_TIME
+#$i_sysselct I_SYS_SELECT
+#$d_socket HAS_SOCKET
+#include <sys/types.h>
+#ifdef HAS_SOCKET
+#include <sys/socket.h> /* Might include <sys/bsdtypes.h> */
+#endif
+#ifdef I_SYS_TIME
+#include <sys/time.h>
+#endif
+#ifdef I_SYS_SELECT
+#include <sys/select.h>
+#endif
+int main() {
+ fd_set fds;
+
+#ifdef TRYBITS
+ if(fds.fds_bits);
+#endif
+
+#if defined(FD_SET) && defined(FD_CLR) && defined(FD_ISSET) && defined(FD_ZERO)
+ exit(0);
+#else
+ exit(1);
+#endif
+}
+EOCP
+set fd_set -DTRYBITS
+if eval $compile; then
+ d_fds_bits="$define"
+ d_fd_set="$define"
+ echo "Well, your system knows about the normal fd_set typedef..." >&4
+ if ./fd_set; then
+ echo "and you have the normal fd_set macros (just as I'd expect)." >&4
+ d_fd_macros="$define"
+ else
+ $cat >&4 <<'EOM'
+but not the normal fd_set macros! Gaaack! I'll have to cover for you.
+EOM
+ d_fd_macros="$undef"
+ fi
+else
+ $cat <<'EOM'
+Hmm, your compiler has some difficulty with fd_set. Checking further...
+EOM
+ set fd_set
+ if eval $compile; then
+ d_fds_bits="$undef"
+ d_fd_set="$define"
+ echo "Well, your system has some sort of fd_set available..." >&4
+ if ./fd_set; then
+ echo "and you have the normal fd_set macros." >&4
+ d_fd_macros="$define"
+ else
+ $cat <<'EOM'
+but not the normal fd_set macros! Gross! More work for me...
+EOM
+ d_fd_macros="$undef"
+ fi
+ else
+ echo "Well, you got zip. That's OK, I can roll my own fd_set stuff." >&4
+ d_fd_set="$undef"
+ d_fds_bits="$undef"
+ d_fd_macros="$undef"
+ fi
+fi
+$rm -f fd_set*
+
: see if fgetpos exists
set fgetpos d_fgetpos
eval $inlibc
@@ -7245,17 +9039,46 @@ eval $inlibc
set fpathconf d_fpathconf
eval $inlibc
-: see if fsetpos exists
-set fsetpos d_fsetpos
-eval $inlibc
-: see if gethostbyaddr exists
-set gethostbyaddr d_gethbyaddr
-eval $inlibc
+: check for fpos64_t
+echo " "
+echo "Checking to see if you have fpos64_t..." >&4
+$cat >try.c <<EOCP
+#include <stdio.h>
+int main() { fpos64_t x = 7; }
+EOCP
+set try
+if eval $compile; then
+ val="$define"
+ echo "You have fpos64_t."
+else
+ val="$undef"
+ echo "You do not have fpos64_t."
+ case "$fpossize" in
+ 8) echo "(Your fpos_t is 64 bits, so you could use that.)" ;;
+ esac
+fi
+$rm -f try.* try
+set d_fpos64_t
+eval $setvar
-: see if gethostbyname exists
-set gethostbyname d_gethbyname
-eval $inlibc
+hasstruct='varname=$1; struct=$2; shift; shift;
+while $test $# -ge 2; do
+ case "$1" in
+ $define) echo "#include <$2>";;
+ esac ;
+ shift 2;
+done > try.c;
+echo "int main () { struct $struct foo; }" >> try.c;
+set try;
+if eval $compile; then
+ val="$define";
+else
+ val="$undef";
+fi;
+set $varname;
+eval $setvar;
+$rm -f try.c try.o'
: see if this is a sys/param system
set sys/param.h i_sysparam
@@ -7265,45 +9088,162 @@ eval $inhdr
set sys/mount.h i_sysmount
eval $inhdr
+: see if sys/types.h has to be included
+set sys/types.h i_systypes
+eval $inhdr
+
+
+echo " "
+echo "Checking to see if your system supports struct fs_data..." >&4
+set d_fs_data_s fs_data $i_systypes sys/types.h $i_sysparam sys/param.h $i_sysmount sys/mount.h
+eval $hasstruct
+case "$d_fs_data_s" in
+"$define") echo "Yes, it does." ;;
+*) echo "No, it doesn't." ;;
+esac
+
+: see if fseeko exists
+set fseeko d_fseeko
+eval $inlibc
+case "$longsize" in
+8) echo "(Your long is 64 bits, so you could use fseek.)" ;;
+esac
+
+: see if fsetpos exists
+set fsetpos d_fsetpos
+eval $inlibc
+
+
: see if fstatfs exists
set fstatfs d_fstatfs
eval $inlibc
-: see if statfs knows about mount flags
-echo " "
-set d_statfsflags statfs f_flags $i_sysparam sys/param.h $i_sysmount sys/mount.h
-eval $hasfield
-: see if this is a sysstatvfs.h system
-set sys/statvfs.h i_sysstatvfs
-eval $inhdr
+: see if statvfs exists
+set statvfs d_statvfs
+eval $inlibc
: see if fstatvfs exists
set fstatvfs d_fstatvfs
eval $inlibc
+
+: see if ftello exists
+set ftello d_ftello
+eval $inlibc
+case "$longsize" in
+8) echo "(Your long is 64 bits, so you could use ftell.)" ;;
+esac
+
+: see if getcwd exists
+set getcwd d_getcwd
+eval $inlibc
+
+
+: see if getfsstat exists
+set getfsstat d_getfsstat
+eval $inlibc
+
+: see if getgrent exists
+set getgrent d_getgrent
+eval $inlibc
+
+: see if gethostbyaddr exists
+set gethostbyaddr d_gethbyaddr
+eval $inlibc
+
+: see if gethostbyname exists
+set gethostbyname d_gethbyname
+eval $inlibc
+
: see if gethostent exists
set gethostent d_gethent
eval $inlibc
-hasproto='varname=$1; func=$2; shift; shift;
-while $test $# -ge 2; do
- case "$1" in
- $define) echo "#include <$2>";;
- esac ;
- shift 2;
-done > try.c;
-$cppstdin $cppflags $cppminus < try.c > tryout.c 2>/dev/null;
-if $contains "$func.*(" tryout.c >/dev/null 2>&1; then
- echo "$func() prototype found.";
- val="$define";
-else
- echo "$func() prototype NOT found.";
- val="$undef";
-fi;
-set $varname;
-eval $setvar;
-$rm -f try.c tryout.c'
+: see how we will look up host name
+echo " "
+call=''
+if set gethostname val -f d_gethname; eval $csym; $val; then
+ echo 'gethostname() found.' >&4
+ d_gethname="$define"
+ call=gethostname
+fi
+if set uname val -f d_uname; eval $csym; $val; then
+ if ./xenix; then
+ $cat <<'EOM'
+uname() was found, but you're running xenix, and older versions of xenix
+have a broken uname(). If you don't really know whether your xenix is old
+enough to have a broken system call, use the default answer.
+
+EOM
+ dflt=y
+ case "$d_uname" in
+ "$define") dflt=n;;
+ esac
+ rp='Is your uname() broken?'
+ . ./myread
+ case "$ans" in
+ n*) d_uname="$define"; call=uname;;
+ esac
+ else
+ echo 'uname() found.' >&4
+ d_uname="$define"
+ case "$call" in
+ '') call=uname ;;
+ esac
+ fi
+fi
+case "$d_gethname" in
+'') d_gethname="$undef";;
+esac
+case "$d_uname" in
+'') d_uname="$undef";;
+esac
+case "$d_uname$d_gethname" in
+*define*)
+ dflt=n
+ cat <<EOM
+
+Every now and then someone has a $call() that lies about the hostname
+but can't be fixed for political or economic reasons. If you wish, I can
+pretend $call() isn't there and maybe compute hostname at run-time
+thanks to the '$phostname' command.
+
+EOM
+ rp="Shall I ignore $call() from now on?"
+ . ./myread
+ case "$ans" in
+ y*) d_uname="$undef" d_gethname="$undef"; $echo $n "Okay...$c";;
+ esac;;
+esac
+case "$phostname" in
+'') aphostname='';;
+*) case "$aphostname" in
+ /*) ;;
+ *) set X $phostname
+ shift
+ file=$1
+ shift
+ file=`./loc $file $file $pth`
+ aphostname=`echo $file $*`
+ ;;
+ esac
+ ;;
+esac
+case "$d_uname$d_gethname" in
+*define*) ;;
+*)
+ case "$phostname" in
+ '')
+ echo "There will be no way for $package to get your hostname." >&4;;
+ *)
+ echo "I'll use 'popen("'"'$aphostname'", "r")'"' to get your hostname." >&4
+ ;;
+ esac;;
+esac
+case "$d_phostname" in
+'') d_phostname="$undef";;
+esac
: see if this is a netdb.h system
set netdb.h i_netdb
@@ -7318,6 +9258,14 @@ eval $hasproto
set getlogin d_getlogin
eval $inlibc
+: see if getmnt exists
+set getmnt d_getmnt
+eval $inlibc
+
+: see if getmntent exists
+set getmntent d_getmntent
+eval $inlibc
+
: see if getnetbyaddr exists
set getnetbyaddr d_getnbyaddr
eval $inlibc
@@ -7348,18 +9296,6 @@ eval $inlibc
set getprotoent d_getpent
eval $inlibc
-: see if this is a mntent.h system
-set mntent.h i_mntent
-eval $inhdr
-
-: see if getmntent exists
-set getmntent d_getmntent
-eval $inlibc
-
-: see if hasmntopt exists
-set hasmntopt d_hasmntopt
-eval $inlibc
-
: see if getpgid exists
set getpgid d_getpgid
eval $inlibc
@@ -7381,6 +9317,11 @@ echo " "
set d_getprotoprotos getprotoent $i_netdb netdb.h
eval $hasproto
+: see if getpwent exists
+set getpwent d_getpwent
+eval $inlibc
+
+
: see if getservbyname exists
set getservbyname d_getsbyname
eval $inlibc
@@ -7398,6 +9339,14 @@ echo " "
set d_getservprotos getservent $i_netdb netdb.h
eval $hasproto
+: see if getspent exists
+set getspent d_getspent
+eval $inlibc
+
+: see if getspnam exists
+set getspnam d_getspnam
+eval $inlibc
+
: see if gettimeofday or ftime exists
set gettimeofday d_gettimeod
eval $inlibc
@@ -7417,6 +9366,35 @@ case "$d_gettimeod$d_ftime" in
;;
esac
+: see if this is an grp system
+set grp.h i_grp
+eval $inhdr
+
+case "$i_grp" in
+$define)
+ xxx=`./findhdr grp.h`
+ $cppstdin $cppflags $cppminus < $xxx >$$.h
+
+ if $contains 'gr_passwd' $$.h >/dev/null 2>&1; then
+ val="$define"
+ else
+ val="$undef"
+ fi
+ set d_grpasswd
+ eval $setvar
+
+ $rm -f $$.h
+ ;;
+*)
+ val="$undef";
+ set d_grpasswd; eval $setvar
+ ;;
+esac
+
+: see if hasmntopt exists
+set hasmntopt d_hasmntopt
+eval $inlibc
+
: see if this is a netinet/in.h or sys/in.h system
set netinet/in.h i_niin sys/in.h i_sysin
eval $inhdr
@@ -7463,27 +9441,9 @@ esac
set d_htonl
eval $setvar
-: see which of string.h or strings.h is needed
-echo " "
-strings=`./findhdr string.h`
-if $test "$strings" && $test -r "$strings"; then
- echo "Using <string.h> instead of <strings.h>." >&4
- val="$define"
-else
- val="$undef"
- strings=`./findhdr strings.h`
- if $test "$strings" && $test -r "$strings"; then
- echo "Using <strings.h> instead of <string.h>." >&4
- else
- echo "No string header found -- You'll surely have problems." >&4
- fi
-fi
-set i_string
-eval $setvar
-case "$i_string" in
-"$undef") strings=`./findhdr strings.h`;;
-*) strings=`./findhdr string.h`;;
-esac
+: see if iconv exists
+set iconv d_iconv
+eval $inlibc
: index or strchr
echo " "
@@ -7522,6 +9482,51 @@ set d_index; eval $setvar
set inet_aton d_inetaton
eval $inlibc
+: see if inttypes.h is available
+: we want a real compile instead of Inhdr because some systems
+: have an inttypes.h which includes non-existent headers
+echo " "
+$cat >try.c <<EOCP
+#include <inttypes.h>
+int main() {
+ static int32_t foo32 = 0x12345678;
+}
+EOCP
+set try
+if eval $compile; then
+ echo "<inttypes.h> found." >&4
+ val="$define"
+else
+ echo "<inttypes.h> NOT found." >&4
+ val="$undef"
+fi
+$rm -f try.c try
+set i_inttypes
+eval $setvar
+
+: check for int64_t
+echo " "
+echo "Checking to see if you have int64_t..." >&4
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
+int main() { int64_t x = 7; }
+EOCP
+set try
+if eval $compile; then
+ val="$define"
+ echo "You have int64_t."
+else
+ val="$undef"
+ echo "You do not have int64_t."
+fi
+$rm -f try try.*
+set d_int64_t
+eval $setvar
+
: Look for isascii
echo " "
$cat >isascii.c <<'EOCP'
@@ -7583,6 +9588,33 @@ fi
set d_lchown
eval $setvar
+: See if number of significant digits in a double precision number is known
+echo " "
+$cat >ldbl_dig.c <<EOM
+#$i_limits I_LIMITS
+#$i_float I_FLOAT
+#ifdef I_LIMITS
+#include <limits.h>
+#endif
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#ifdef LDBL_DIG
+printf("Contains LDBL_DIG");
+#endif
+EOM
+$cppstdin $cppflags $cppminus < ldbl_dig.c >ldbl_dig.E 2>/dev/null
+if $contains 'LDBL_DIG' ldbl_dig.E >/dev/null 2>&1; then
+ echo "LDBL_DIG found." >&4
+ val="$define"
+else
+ echo "LDBL_DIG NOT found." >&4
+ val="$undef"
+fi
+$rm -f ldbl_dig.?
+set d_ldbl_dig
+eval $setvar
+
: see if link exists
set link d_link
eval $inlibc
@@ -7595,62 +9627,17 @@ eval $inlibc
set lockf d_lockf
eval $inlibc
-: check for long doubles
-echo " "
-echo $n "Checking to see if your system supports long doubles...$c" >&4
-echo 'long double foo() { long double x; x = 7.0; return x; }' > try.c
-if $cc $optimize $ccflags -c try.c >/dev/null 2>&1; then
- val="$define"
- echo " Yup, it does." >&4
-else
- val="$undef"
- echo " Nope, it doesn't." >&4
-fi
-$rm try.*
-set d_longdbl
-eval $setvar
-
-: check for length of long double
-case "${d_longdbl}${longdblsize}" in
-$define)
- echo " "
- $echo $n "Checking to see how big your long doubles are...$c" >&4
- $cat >try.c <<'EOCP'
-#include <stdio.h>
-int main()
-{
- printf("%d\n", sizeof(long double));
-}
-EOCP
- set try
- if eval $compile; then
- longdblsize=`./try`
- $echo " $longdblsize bytes." >&4
- else
- dflt='8'
- echo " "
- echo "(I can't seem to compile the test program. Guessing...)" >&4
- rp="What is the size of a long double (in bytes)?"
- . ./myread
- longdblsize="$ans"
- fi
- if $test "X$doublesize" = "X$longdblsize"; then
- echo "(That isn't any different from an ordinary double.)"
- fi
- ;;
-esac
-$rm -f try.c try
-
: check for long long
echo " "
-echo $n "Checking to see if your system supports long long...$c" >&4
-echo 'long long foo() { long long x; x = 7; return x; }' > try.c
-if $cc $optimize $ccflags -c try.c >/dev/null 2>&1; then
+echo "Checking to see if you have long long..." >&4
+echo 'int main() { long long x = 7; return 0; }' > try.c
+set try
+if eval $compile; then
val="$define"
- echo " Yup, it does." >&4
+ echo "You have have long long."
else
val="$undef"
- echo " Nope, it doesn't." >&4
+ echo "You do not have long long."
fi
$rm try.*
set d_longlong
@@ -7660,18 +9647,19 @@ eval $setvar
case "${d_longlong}${longlongsize}" in
$define)
echo " "
- $echo $n "Checking to see how big your long longs are...$c" >&4
+ echo "Checking to see how big your long longs are..." >&4
$cat >try.c <<'EOCP'
#include <stdio.h>
int main()
{
- printf("%d\n", sizeof(long long));
+ printf("%d\n", (int)sizeof(long long));
+ return(0);
}
EOCP
set try
if eval $compile_ok; then
- longlongsize=`./try`
- $echo " $longlongsize bytes." >&4
+ longlongsize=`./try$exe_ext`
+ echo "Your long longs are $longlongsize bytes long."
else
dflt='8'
echo " "
@@ -7685,12 +9673,21 @@ EOCP
fi
;;
esac
-$rm -f try.c try
+$rm -f try.* try
+
+: see if prototype for lseek is available
+echo " "
+set d_lseekproto lseek $i_systypes sys/types.h $i_unistd unistd.h
+eval $hasproto
: see if lstat exists
set lstat d_lstat
eval $inlibc
+: see if madvise exists
+set madvise d_madvise
+eval $inlibc
+
: see if mblen exists
set mblen d_mblen
eval $inlibc
@@ -7703,6 +9700,10 @@ eval $inlibc
set mbtowc d_mbtowc
eval $inlibc
+: see if memchr exists
+set memchr d_memchr
+eval $inlibc
+
: see if memcmp exists
set memcmp d_memcmp
eval $inlibc
@@ -7723,14 +9724,57 @@ eval $inlibc
set mkdir d_mkdir
eval $inlibc
+: see if mkdtemp exists
+set mkdtemp d_mkdtemp
+eval $inlibc
+
: see if mkfifo exists
set mkfifo d_mkfifo
eval $inlibc
+: see if mkstemp exists
+set mkstemp d_mkstemp
+eval $inlibc
+
+: see if mkstemps exists
+set mkstemps d_mkstemps
+eval $inlibc
+
: see if mktime exists
set mktime d_mktime
eval $inlibc
+: see if this is a sys/mman.h system
+set sys/mman.h i_sysmman
+eval $inhdr
+
+: see if mmap exists
+set mmap d_mmap
+eval $inlibc
+: see what shmat returns
+: default to something harmless
+mmaptype='void *'
+case "$i_sysmman$d_mmap" in
+"$define$define")
+ $cat >mmap.c <<'END'
+#include <sys/mman.h>
+void *mmap();
+END
+ if $cc $ccflags -c mmap.c >/dev/null 2>&1; then
+ mmaptype='void *'
+ else
+ mmaptype='caddr_t'
+ fi
+ echo "and it returns ($mmaptype)." >&4
+ ;;
+esac
+
+
+
+: see if mprotect exists
+set mprotect d_mprotect
+eval $inlibc
+
: see if msgctl exists
set msgctl d_msgctl
eval $inlibc
@@ -7783,10 +9827,406 @@ fi
set d_msg
eval $setvar
+: see if msync exists
+set msync d_msync
+eval $inlibc
+
+: see if munmap exists
+set munmap d_munmap
+eval $inlibc
+
: see if nice exists
set nice d_nice
eval $inlibc
+
+echo " "
+echo "Checking which 64-bit integer type we could use..." >&4
+
+case "$intsize" in
+8) val=int
+ set quadtype
+ eval $setvar
+ val='"unsigned int"'
+ set uquadtype
+ eval $setvar
+ quadkind=1
+ ;;
+*) case "$longsize" in
+ 8) val=long
+ set quadtype
+ eval $setvar
+ val='"unsigned long"'
+ set uquadtype
+ eval $setvar
+ quadkind=2
+ ;;
+ *) case "$d_longlong:$longlongsize" in
+ define:8)
+ val='"long long"'
+ set quadtype
+ eval $setvar
+ val='"unsigned long long"'
+ set uquadtype
+ eval $setvar
+ quadkind=3
+ ;;
+ *) case "$d_int64_t" in
+ define)
+ val=int64_t
+ set quadtype
+ eval $setvar
+ val=uint64_t
+ set uquadtype
+ eval $setvar
+ quadkind=4
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+esac
+
+case "$quadtype" in
+'') echo "Alas, no 64-bit integer types in sight." >&4
+ d_quad="$undef"
+ ;;
+*) if test X"$use64bitint" = Xdefine -o X"$longsize" = X8; then
+ verb="will"
+ else
+ verb="could"
+ fi
+ echo "We $verb use '$quadtype' for 64-bit integers." >&4
+ d_quad="$define"
+ ;;
+esac
+
+: check for length of character
+echo " "
+case "$charsize" in
+'')
+ echo "Checking to see how big your characters are (hey, you never know)..." >&4
+ $cat >try.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+ printf("%d\n", (int)sizeof(char));
+ exit(0);
+}
+EOCP
+ set try
+ if eval $compile_ok; then
+ dflt=`./try`
+ else
+ dflt='1'
+ echo "(I can't seem to compile the test program. Guessing...)"
+ fi
+ ;;
+*)
+ dflt="$charsize"
+ ;;
+esac
+rp="What is the size of a character (in bytes)?"
+. ./myread
+charsize="$ans"
+$rm -f try.c try
+
+
+echo " "
+$echo "Choosing the C types to be used for Perl's internal types..." >&4
+
+case "$use64bitint:$d_quad:$quadtype" in
+define:define:?*)
+ ivtype="$quadtype"
+ uvtype="$uquadtype"
+ ivsize=8
+ uvsize=8
+ ;;
+*) ivtype="long"
+ uvtype="unsigned long"
+ ivsize=$longsize
+ uvsize=$longsize
+ ;;
+esac
+
+case "$uselongdouble:$d_longdbl" in
+define:define)
+ nvtype="long double"
+ nvsize=$longdblsize
+ ;;
+*) nvtype=double
+ nvsize=$doublesize
+ ;;
+esac
+
+$echo "(IV will be "$ivtype", $ivsize bytes)"
+$echo "(UV will be "$uvtype", $uvsize bytes)"
+$echo "(NV will be "$nvtype", $nvsize bytes)"
+
+$cat >try.c <<EOCP
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
+#include <stdio.h>
+int main() {
+#ifdef INT8
+ int8_t i = INT8_MAX;
+ uint8_t u = UINT8_MAX;
+ printf("int8_t\n");
+#endif
+#ifdef INT16
+ int16_t i = INT16_MAX;
+ uint16_t i = UINT16_MAX;
+ printf("int16_t\n");
+#endif
+#ifdef INT32
+ int32_t i = INT32_MAX;
+ uint32_t u = UINT32_MAX;
+ printf("int32_t\n");
+#endif
+}
+EOCP
+
+case "$i8type" in
+'') case "$charsize" in
+ 1) i8type=char
+ u8type="unsigned char"
+ i8size=$charsize
+ u8size=$charsize
+ ;;
+ esac
+ ;;
+esac
+case "$i8type" in
+'') set try -DINT8
+ if eval $compile; then
+ case "`./try$exe_ext`" in
+ int8_t) i8type=int8_t
+ u8type=uint8_t
+ i8size=1
+ u8size=1
+ ;;
+ esac
+ fi
+ ;;
+esac
+case "$i8type" in
+'') if $test $charsize -ge 1; then
+ i8type=char
+ u8type="unsigned char"
+ i8size=$charsize
+ u8size=$charsize
+ fi
+ ;;
+esac
+
+case "$i16type" in
+'') case "$shortsize" in
+ 2) i16type=short
+ u16type="unsigned short"
+ i16size=$shortsize
+ u16size=$shortsize
+ ;;
+ esac
+ ;;
+esac
+case "$i16type" in
+'') set try -DINT16
+ if eval $compile; then
+ case "`./try$exe_ext`" in
+ int16_t)
+ i16type=int16_t
+ u16type=uint16_t
+ i16size=2
+ u16size=2
+ ;;
+ esac
+ fi
+ ;;
+esac
+case "$i16type" in
+'') if $test $shortsize -ge 2; then
+ i16type=short
+ u16type="unsigned short"
+ i16size=$shortsize
+ u16size=$shortsize
+ fi
+ ;;
+esac
+
+case "$i32type" in
+'') case "$longsize" in
+ 4) i32type=long
+ u32type="unsigned long"
+ i32size=$longsize
+ u32size=$longsize
+ ;;
+ *) case "$intsize" in
+ 4) i32type=int
+ u32type="unsigned int"
+ i32size=$intsize
+ u32size=$intsize
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+esac
+case "$i32type" in
+'') set try -DINT32
+ if eval $compile; then
+ case "`./try$exe_ext`" in
+ int32_t)
+ i32type=int32_t
+ u32type=uint32_t
+ i32size=4
+ u32size=4
+ ;;
+ esac
+ fi
+ ;;
+esac
+case "$i32type" in
+'') if $test $intsize -ge 4; then
+ i32type=int
+ u32type="unsigned int"
+ i32size=$intsize
+ u32size=$intsize
+ fi
+ ;;
+esac
+
+case "$i64type" in
+'') case "$d_quad:$quadtype" in
+ define:?*)
+ i64type="$quadtype"
+ u64type="$uquadtype"
+ i64size=8
+ u64size=8
+ ;;
+ esac
+ ;;
+esac
+
+$echo "Checking whether your NVs can preserve your UVs..." >&4
+$cat <<EOP >try.c
+#include <stdio.h>
+int main() {
+ $uvtype k = ($uvtype)~0, l;
+ $nvtype d;
+ l = k;
+ d = ($nvtype)l;
+ l = ($uvtype)d;
+ if (l == k)
+ printf("preserve\n");
+ exit(0);
+}
+EOP
+set try
+if eval $compile; then
+ case "`./try$exe_ext`" in
+ preserve) d_nv_preserves_uv="$define" ;;
+ esac
+fi
+case "$d_nv_preserves_uv" in
+$define) $echo "Yes, they can." 2>&1 ;;
+*) $echo "No, they can't." 2>&1
+ d_nv_preserves_uv="$undef"
+ ;;
+esac
+
+$rm -f try.* try
+
+
+: check for off64_t
+echo " "
+echo "Checking to see if you have off64_t..." >&4
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <unistd.h>
+int main() { off64_t x = 7; }
+EOCP
+set try
+if eval $compile; then
+ val="$define"
+ echo "You have off64_t."
+else
+ val="$undef"
+ echo "You do not have off64_t."
+ case "$lseeksize" in
+ 8) echo "(Your off_t is 64 bits, so you could use that.)" ;;
+ esac
+fi
+$rm -f try.* try
+set d_off64_t
+eval $setvar
+
+: see if POSIX threads are available
+set pthread.h i_pthread
+eval $inhdr
+
+
+
+
+: how to create joinable pthreads
+if test "X$usethreads" = "X$define" -a "X$i_pthread" = "X$define"; then
+ echo " "
+ echo "Checking what constant to use for creating joinable pthreads..." >&4
+ $cat >try.c <<'EOCP'
+#include <pthread.h>
+int main() {
+ int detachstate = JOINABLE;
+}
+EOCP
+ set try -DJOINABLE=PTHREAD_CREATE_JOINABLE
+ if eval $compile; then
+ echo "You seem to use PTHREAD_CREATE_JOINABLE." >&4
+ val="$undef" # Yes, undef.
+ set d_old_pthread_create_joinable
+ eval $setvar
+ val=""
+ set old_pthread_create_joinable
+ eval $setvar
+ else
+ set try -DJOINABLE=PTHREAD_CREATE_UNDETACHED
+ if eval $compile; then
+ echo "You seem to use PTHREAD_CREATE_UNDETACHED." >&4
+ val="$define"
+ set d_old_pthread_create_joinable
+ eval $setvar
+ val=PTHREAD_CREATE_UNDETACHED
+ set old_pthread_create_joinable
+ eval $setvar
+ else
+ set try -DJOINABLE=__UNDETACHED
+ if eval $compile; then
+ echo "You seem to use __UNDETACHED." >&4
+ val="$define"
+ set d_old_pthread_create_joinable
+ eval $setvar
+ val=__UNDETACHED
+ set old_pthread_create_joinable
+ eval $setvar
+ else
+ echo "Egads, nothing obvious found. Guessing that you use 0." >&4
+ val="$define"
+ set d_old_pthread_create_joinable
+ eval $setvar
+ val=0
+ set old_pthread_create_joinable
+ eval $setvar
+ fi
+ fi
+ fi
+ $rm -f try try.*
+else
+ d_old_pthread_create_joinable="$undef"
+ old_pthread_create_joinable=""
+fi
+
: see if pause exists
set pause d_pause
eval $inlibc
@@ -7803,85 +10243,73 @@ eval $inlibc
: see whether the various POSIXish _yields exist
$cat >try.c <<EOP
#include <pthread.h>
+#include <stdio.h>
int main() {
- YIELD();
- exit(0);
+#ifdef SCHED_YIELD
+ sched_yield();
+#else
+#ifdef PTHREAD_YIELD
+ pthread_yield();
+#else
+#ifdef PTHREAD_YIELD_NULL
+ pthread_yield(NULL);
+#endif
+#endif
+#endif
}
EOP
-: see if pthread_yield exists within given cccmd,
-: if we do not usethreads this may well end up undef.
-set try -DYIELD=pthread_yield
+: see if sched_yield exists
+set try -DSCHED_YIELD
if eval $compile; then
val="$define"
- echo 'pthread_yield() found.' >&4
+ sched_yield='sched_yield()'
else
val="$undef"
- echo 'pthread_yield() NOT found.' >&4
fi
-set d_pthread_yield
+case "$usethreads" in
+$define)
+ case "$val" in
+ $define) echo 'sched_yield() found.' >&4 ;;
+ *) echo 'sched_yield() NOT found.' >&4 ;;
+ esac
+esac
+set d_sched_yield
eval $setvar
-: see if sched_yield exists within given cccmd,
-: if we do not usethreads this may well end up undef.
-set try -DYIELD=sched_yield
+: see if pthread_yield exists
+set try -DPTHREAD_YIELD
if eval $compile; then
val="$define"
- echo 'sched_yield() found.' >&4
+ case "$sched_yield" in
+ '') sched_yield='pthread_yield()' ;;
+ esac
else
- val="$undef"
- echo 'sched_yield() NOT found.' >&4
+ set try -DPTHREAD_YIELD_NULL
+ if eval $compile; then
+ val="$define"
+ case "$sched_yield" in
+ '') sched_yield='pthread_yield(NULL)' ;;
+ esac
+ else
+ val="$undef"
+ fi
fi
-set d_sched_yield
+case "$usethreads" in
+$define)
+ case "$val" in
+ $define) echo 'pthread_yield() found.' >&4 ;;
+ *) echo 'pthread_yield() NOT found.' >&4 ;;
+ esac
+ ;;
+esac
+set d_pthread_yield
eval $setvar
-$rm -f try try.*
-
-: see if this is a pthread.h system
-set pthread.h i_pthread
-eval $inhdr
-: see if this is a mach/cthreads.h system
-set mach/cthreads.h i_machcthreads
-eval $inhdr
+case "$sched_yield" in
+'') sched_yield=undef ;;
+esac
-: test whether pthreads are created in joinable -- aka undetached -- state
-if test "X$usethreads" = "X$define" -a "X$i_pthread" = "X$define"; then
- echo $n "Checking whether pthreads are created joinable. $c" >&4
- $cat >try.c <<EOCP
-#include <pthread.h>
-#include <stdio.h>
-int main() {
- pthread_attr_t attr;
- int detachstate;
- printf("%s\n",
- pthread_attr_init(&attr) == 0 &&
- pthread_attr_getdetachstate(&attr, &detachstate) == 0 &&
- detachstate == PTHREAD_CREATE_DETACHED ?
- "detached" : "joinable");
- exit(0);
-}
-EOCP
- set try
- if eval $compile; then
- yyy=`./try`
- case "$yyy" in
- detached) echo "Nope, they aren't." >&4 ;;
- *) echo "Yup, they are." >&4 ;;
- esac
- else
- echo " "
- echo "(I can't execute the test program--assuming they are.)" >&4
- yyy=joinable
- fi
- $rm -f try try.*
- case "$yyy" in
- detached) val="$undef" ;;
- *) val="$define" ;;
- esac
- set d_pthreads_created_joinable
- eval $setvar
-else
- d_pthreads_created_joinable="$undef"
-fi
+$rm -f try try.*
: see if this is a pwd.h system
set pwd.h i_pwd
@@ -7889,18 +10317,6 @@ eval $inhdr
case "$i_pwd" in
$define)
- : see if setpwent exists
- set setpwent d_setpwent
- eval $inlibc
-
- : see if getpwent exists
- set getpwent d_getpwent
- eval $inlibc
-
- : see if endpwent exists
- set endpwent d_endpwent
- eval $inlibc
-
xxx=`./findhdr pwd.h`
$cppstdin $cppflags $cppminus < $xxx >$$.h
@@ -7970,11 +10386,8 @@ $define)
$rm -f $$.h
;;
-*) # Assume all is lost as far as the d_*pw* go.
+*)
val="$undef";
- set d_setpwent; eval $setvar
- set d_getpwent; eval $setvar
- set d_endpwent; eval $setvar
set d_pwquota; eval $setvar
set d_pwage; eval $setvar
set d_pwchange; eval $setvar
@@ -8306,7 +10719,7 @@ else
echo "You do not have union semun in <sys/sem.h>." >&4
val="$undef"
fi
-$rm -f try try.c
+$rm -f try try.c try.h
set d_union_semun
eval $setvar
@@ -8347,6 +10760,7 @@ END
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
+#include "try.h"
#ifndef errno
extern int errno;
#endif
@@ -8399,7 +10813,7 @@ END
case "$d_semctl_semun" in
$define)
echo "You can use union semun for semctl IPC_STAT." >&4
- also='also '
+ also='also'
;;
*) echo "You cannot use union semun for semctl IPC_STAT." >&4
also=''
@@ -8412,9 +10826,9 @@ END
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/stat.h>
+#include "try.h"
#include <stdio.h>
#include <errno.h>
-#include "try.h"
#ifndef errno
extern int errno;
#endif
@@ -8456,7 +10870,7 @@ END
eval $setvar
case "$d_semctl_semid_ds" in
$define)
- echo "You can ${also}use struct semid_ds* for semctl IPC_STAT." >&4
+ echo "You can $also use struct semid_ds* for semctl IPC_STAT." >&4
;;
*) echo "You cannot use struct semid_ds* for semctl IPC_STAT." >&4
;;
@@ -8484,6 +10898,10 @@ eval $inlibc
set seteuid d_seteuid
eval $inlibc
+: see if setgrent exists
+set setgrent d_setgrent
+eval $inlibc
+
: see if sethostent exists
set sethostent d_sethent
eval $inlibc
@@ -8516,6 +10934,10 @@ eval $inlibc
set setpriority d_setprior
eval $inlibc
+: see if setpwent exists
+set setpwent d_setpwent
+eval $inlibc
+
: see if setregid exists
set setregid d_setregid
eval $inlibc
@@ -8544,6 +10966,10 @@ eval $inlibc
set setsid d_setsid
eval $inlibc
+: see if setspent exists
+set setspent d_setspent
+eval $inlibc
+
: see if setvbuf exists
set setvbuf d_setvbuf
eval $inlibc
@@ -8656,7 +11082,7 @@ case "$osname" in
freebsd)
case "`ipcs 2>&1`" in
"SVID shared memory"*"not configured"*)
- echo "But your $osname does not have the shm*(2) configured." >&4
+ echo "Your $osname does not have the shm*(2) configured." >&4
h_shm=false
val="$undef"
set shmctl d_shmctl
@@ -8693,6 +11119,10 @@ if set sigaction val -f d_sigaction; eval $csym; $val; then
int main()
{
struct sigaction act, oact;
+ act.sa_flags = 0;
+ oact.sa_handler = 0;
+ /* so that act and oact are used */
+ exit(act.sa_flags == 0 && oact.sa_handler == 0);
}
EOP
set try
@@ -8754,73 +11184,60 @@ set d_sigsetjmp
eval $setvar
$rm -f try.c try
-socketlib=''
-sockethdr=''
-: see whether socket exists
-echo " "
-$echo $n "Hmm... $c" >&4
-if set socket val -f d_socket; eval $csym; $val; then
- echo "Looks like you have Berkeley networking support." >&4
- d_socket="$define"
- if set setsockopt val -f; eval $csym; $val; then
- d_oldsock="$undef"
- else
- echo "...but it uses the old 4.1c interface, rather than 4.2" >&4
- d_oldsock="$define"
- fi
-else
- if $contains socklib libc.list >/dev/null 2>&1; then
- echo "Looks like you have Berkeley networking support." >&4
- d_socket="$define"
- : we will have to assume that it supports the 4.2 BSD interface
- d_oldsock="$undef"
- else
- echo "You don't have Berkeley networking in libc$_a..." >&4
- for net in net socket
- do
- if test -f /usr/lib/lib$net$_a; then
- ( ($nm $nm_opt /usr/lib/lib$net$_a | eval $nm_extract) || \
- $ar t /usr/lib/lib$net$_a) 2>/dev/null >> libc.list
- if $contains socket libc.list >/dev/null 2>&1; then
- d_socket="$define"
- case "$net" in
- net)
- echo "...but the Wollongong group seems to have hacked it in." >&4
- socketlib="-lnet"
- sockethdr="-I/usr/netinclude"
- ;;
- esac
- echo "Found Berkeley sockets interface in lib$net." >& 4
- if $contains setsockopt libc.list >/dev/null 2>&1; then
- d_oldsock="$undef"
- else
- echo "...using the old 4.1c interface, rather than 4.2" >&4
- d_oldsock="$define"
- fi
- break
- fi
- fi
- done
- if test "X$d_socket" != "X$define"; then
- echo "or anywhere else I see." >&4
- d_socket="$undef"
- d_oldsock="$undef"
- fi
- fi
-fi
+: see if sys/stat.h is available
+set sys/stat.h i_sysstat
+eval $inhdr
-: see if socketpair exists
-set socketpair d_sockpair
-eval $inlibc
: see if stat knows about block sizes
echo " "
+echo "Checking to see if your struct stat has st_blocks field..." >&4
set d_statblks stat st_blocks $i_sysstat sys/stat.h
eval $hasfield
+
+: see if this is a sys/vfs.h system
+set sys/vfs.h i_sysvfs
+eval $inhdr
+
+
+: see if this is a sys/statfs.h system
+set sys/statfs.h i_sysstatfs
+eval $inhdr
+
+
+echo " "
+echo "Checking to see if your system supports struct statfs..." >&4
+set d_statfs_s statfs $i_systypes sys/types.h $i_sysparam sys/param.h $i_sysmount sys/mount.h $i_sysvfs sys/vfs.h $i_sysstatfs sys/statfs.h
+eval $hasstruct
+case "$d_statfs_s" in
+"$define") echo "Yes, it does." ;;
+*) echo "No, it doesn't." ;;
+esac
+
+
+
+: see if struct statfs knows about f_flags
+case "$d_statfs_s" in
+define)
+ echo " "
+ echo "Checking to see if your struct statfs has f_flags field..." >&4
+ set d_statfs_f_flags statfs f_flags $i_systypes sys/types.h $i_sysparam sys/param.h $i_sysmount sys/mount.h $i_sysvfs sys/vfs.h $i_sysstatfs sys/statfs.h
+ eval $hasfield
+ ;;
+*) val="$undef"
+ set d_statfs_f_flags
+ eval $setvar
+ ;;
+esac
+case "$d_statfs_f_flags" in
+"$define") echo "Yes, it does." ;;
+*) echo "No, it doesn't." ;;
+esac
+
: see if _ptr and _cnt from stdio act std
echo " "
-if $contains '_IO_fpos_t' `./findhdr stdio.h` >/dev/null 2>&1 ; then
+if $contains '_IO_fpos_t' `./findhdr stdio.h` `./findhdr libio.h` >/dev/null 2>&1 ; then
echo "(Looks like you have stdio.h from Linux.)"
case "$stdio_ptr" in
'') stdio_ptr='((fp)->_IO_read_ptr)'
@@ -8945,6 +11362,41 @@ esac
set d_stdiobase
eval $setvar
+$cat >&4 <<EOM
+Checking how to access stdio streams by file descriptor number...
+EOM
+case "$stdio_stream_array" in
+'') $cat >try.c <<EOCP
+#include <stdio.h>
+int main() {
+ if (&STDIO_STREAM_ARRAY[fileno(stdin)] == stdin)
+ printf("yes\n");
+}
+EOCP
+ for s in _iob __iob __sF
+ do
+ set try -DSTDIO_STREAM_ARRAY=$s
+ if eval $compile; then
+ case "`./try$exe_ext`" in
+ yes) stdio_stream_array=$s; break ;;
+ esac
+ fi
+ done
+ $rm -f try.* try$exe_ext
+esac
+case "$stdio_stream_array" in
+'') $cat >&4 <<EOM
+I can't figure out how to access stdio streams by file descriptor number.
+EOM
+ d_stdio_stream_array="$undef"
+ ;;
+*) $cat >&4 <<EOM
+You can access stdio streams by file descriptor number by the $stdio_stream_array array.
+EOM
+ d_stdio_stream_array="$define"
+ ;;
+esac
+
: see if strcoll exists
set strcoll d_strcoll
eval $inlibc
@@ -8977,38 +11429,38 @@ $rm -f try.*
echo " "
if test "X$d_strerror" = X -o "X$d_syserrlst" = X; then
if set strerror val -f d_strerror; eval $csym; $val; then
- echo 'strerror() found.' >&4
- d_strerror="$define"
- d_strerrm='strerror(e)'
- if set sys_errlist val -a d_syserrlst; eval $csym; $val; then
- echo "(You also have sys_errlist[], so we could roll our own strerror.)"
- d_syserrlst="$define"
- else
- echo "(Since you don't have sys_errlist[], sterror() is welcome.)"
- d_syserrlst="$undef"
- fi
+ echo 'strerror() found.' >&4
+ d_strerror="$define"
+ d_strerrm='strerror(e)'
+ if set sys_errlist val -a d_syserrlst; eval $csym; $val; then
+ echo "(You also have sys_errlist[], so we could roll our own strerror.)"
+ d_syserrlst="$define"
+ else
+ echo "(Since you don't have sys_errlist[], sterror() is welcome.)"
+ d_syserrlst="$undef"
+ fi
elif xxx=`./findhdr string.h`; test "$xxx" || xxx=`./findhdr strings.h`; \
- $contains '#[ ]*define.*strerror' "$xxx" >/dev/null 2>&1; then
- echo 'strerror() found in string header.' >&4
- d_strerror="$define"
- d_strerrm='strerror(e)'
- if set sys_errlist val -a d_syserrlst; eval $csym; $val; then
- echo "(Most probably, strerror() uses sys_errlist[] for descriptions.)"
- d_syserrlst="$define"
- else
- echo "(You don't appear to have any sys_errlist[], how can this be?)"
- d_syserrlst="$undef"
- fi
+ $contains '#[ ]*define.*strerror' "$xxx" >/dev/null 2>&1; then
+ echo 'strerror() found in string header.' >&4
+ d_strerror="$define"
+ d_strerrm='strerror(e)'
+ if set sys_errlist val -a d_syserrlst; eval $csym; $val; then
+ echo "(Most probably, strerror() uses sys_errlist[] for descriptions.)"
+ d_syserrlst="$define"
+ else
+ echo "(You don't appear to have any sys_errlist[], how can this be?)"
+ d_syserrlst="$undef"
+ fi
elif set sys_errlist val -a d_syserrlst; eval $csym; $val; then
-echo "strerror() not found, but you have sys_errlist[] so we'll use that." >&4
- d_strerror="$undef"
- d_syserrlst="$define"
- d_strerrm='((e)<0||(e)>=sys_nerr?"unknown":sys_errlist[e])'
+ echo "strerror() not found, but you have sys_errlist[] so we'll use that." >&4
+ d_strerror="$undef"
+ d_syserrlst="$define"
+ d_strerrm='((e)<0||(e)>=sys_nerr?"unknown":sys_errlist[e])'
else
- echo 'strerror() and sys_errlist[] NOT found.' >&4
- d_strerror="$undef"
- d_syserrlst="$undef"
- d_strerrm='"unknown"'
+ echo 'strerror() and sys_errlist[] NOT found.' >&4
+ d_strerror="$undef"
+ d_syserrlst="$undef"
+ d_strerrm='"unknown"'
fi
fi
@@ -9020,10 +11472,117 @@ eval $inlibc
set strtol d_strtol
eval $inlibc
+: see if strtold exists
+set strtold d_strtold
+eval $inlibc
+
+: see if strtoll exists
+set strtoll d_strtoll
+eval $inlibc
+
+case "$d_longlong-$d_strtoll" in
+"$define-$define")
+ $cat <<EOM
+Checking whether your strtoll() works okay...
+EOM
+ $cat >try.c <<'EOCP'
+#include <errno.h>
+#ifdef __hpux
+#define strtoll __strtoll
+#endif
+#include <stdio.h>
+extern long long int strtoll(char *s, char **, int);
+static int bad = 0;
+int check(char *s, long long ell, int een) {
+ long long gll;
+ errno = 0;
+ gll = strtoll(s, 0, 10);
+ if (!((gll == ell) && (errno == een)))
+ bad++;
+}
+int main() {
+ check(" 1", 1LL, 0);
+ check(" 0", 0LL, 0);
+ check("-1", -1LL, 0);
+ check("-9223372036854775808", -9223372036854775808LL, 0);
+ check("-9223372036854775808", -9223372036854775808LL, 0);
+ check(" 9223372036854775807", 9223372036854775807LL, 0);
+ check("-9223372036854775808", -9223372036854775808LL, 0);
+ check(" 9223372036854775808", 9223372036854775807LL, ERANGE);
+ check("-9223372036854775809", -9223372036854775808LL, ERANGE);
+ if (!bad)
+ printf("ok\n");
+}
+EOCP
+ set try
+ if eval $compile; then
+ case "`./try`" in
+ ok) echo "Your strtoll() seems to be working okay." ;;
+ *) cat <<EOM >&4
+Your strtoll() doesn't seem to be working okay.
+EOM
+ d_strtoll="$undef"
+ ;;
+ esac
+ fi
+ ;;
+esac
+
: see if strtoul exists
set strtoul d_strtoul
eval $inlibc
+: see if strtoull exists
+set strtoull d_strtoull
+eval $inlibc
+
+case "$d_longlong-$d_strtoull" in
+"$define-$define")
+ $cat <<EOM
+Checking whether your strtoull() works okay...
+EOM
+ $cat >try.c <<'EOCP'
+#include <errno.h>
+#ifdef __hpux
+#define strtoull __strtoull
+#endif
+#include <stdio.h>
+extern unsigned long long int strtoull(char *s, char **, int);
+static int bad = 0;
+int check(char *s, long long eull, int een) {
+ long long gull;
+ errno = 0;
+ gull = strtoull(s, 0, 10);
+ if (!((gull == eull) && (errno == een)))
+ bad++;
+}
+int main() {
+ check(" 1", 1LL, 0);
+ check(" 0", 0LL, 0);
+ check("18446744073709551615", 18446744073709551615ULL, 0);
+ check("18446744073709551616", 18446744073709551615ULL, ERANGE);
+ if (!bad)
+ printf("ok\n");
+}
+EOCP
+ set try
+ if eval $compile; then
+ case "`./try`" in
+ ok) echo "Your strtoull() seems to be working okay." ;;
+ *) cat <<EOM >&4
+Your strtoull() doesn't seem to be working okay.
+EOM
+ d_strtoull="$undef"
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+: see if strtouq exists
+set strtouq d_strtouq
+eval $inlibc
+
: see if strxfrm exists
set strxfrm d_strxfrm
eval $inlibc
@@ -9052,61 +11611,10 @@ eval $inlibc
set tcsetpgrp d_tcsetpgrp
eval $inlibc
-: define an is-a-typedef? function
-typedef='type=$1; var=$2; def=$3; shift; shift; shift; inclist=$@;
-case "$inclist" in
-"") inclist="sys/types.h";;
-esac;
-eval "varval=\$$var";
-case "$varval" in
-"")
- $rm -f temp.c;
- for inc in $inclist; do
- echo "#include <$inc>" >>temp.c;
- done;
- echo "#ifdef $type" >> temp.c;
- echo "printf(\"We have $type\");" >> temp.c;
- echo "#endif" >> temp.c;
- $cppstdin $cppflags $cppminus < temp.c >temp.E 2>/dev/null;
- if $contains $type temp.E >/dev/null 2>&1; then
- eval "$var=\$type";
- else
- eval "$var=\$def";
- fi;
- $rm -f temp.?;;
-*) eval "$var=\$varval";;
-esac'
-
-: define an is-a-typedef? function that prompts if the type is not available.
-typedef_ask='type=$1; var=$2; def=$3; shift; shift; shift; inclist=$@;
-case "$inclist" in
-"") inclist="sys/types.h";;
-esac;
-eval "varval=\$$var";
-case "$varval" in
-"")
- $rm -f temp.c;
- for inc in $inclist; do
- echo "#include <$inc>" >>temp.c;
- done;
- echo "#ifdef $type" >> temp.c;
- echo "printf(\"We have $type\");" >> temp.c;
- echo "#endif" >> temp.c;
- $cppstdin $cppflags $cppminus < temp.c >temp.E 2>/dev/null;
- echo " " ;
- echo "$rp" | $sed -e "s/What is/Looking for/" -e "s/?/./";
- if $contains $type temp.E >/dev/null 2>&1; then
- echo "$type found." >&4;
- eval "$var=\$type";
- else
- echo "$type NOT found." >&4;
- dflt="$def";
- . ./myread ;
- eval "$var=\$ans";
- fi;
- $rm -f temp.?;;
-*) eval "$var=\$varval";;
-esac'
+: see if prototype for telldir is available
+echo " "
+set d_telldirproto telldir $i_systypes sys/types.h $i_dirent dirent.h
+eval $hasproto
: see if this is a sys/times.h system
set sys/times.h i_systimes
@@ -9150,42 +11658,9 @@ eval $setvar
set umask d_umask
eval $inlibc
-: see how we will look up host name
-echo " "
-if false; then
- : dummy stub to allow use of elif
-elif set uname val -f d_uname; eval $csym; $val; then
- if ./xenix; then
- $cat <<'EOM'
-uname() was found, but you're running xenix, and older versions of xenix
-have a broken uname(). If you don't really know whether your xenix is old
-enough to have a broken system call, use the default answer.
-
-EOM
- dflt=y
- case "$d_uname" in
- "$define") dflt=n;;
- esac
- rp='Is your uname() broken?'
- . ./myread
- case "$ans" in
- n*) d_uname="$define"; call=uname;;
- esac
- else
- echo 'uname() found.' >&4
- d_uname="$define"
- call=uname
- fi
-fi
-case "$d_gethname" in
-'') d_gethname="$undef";;
-esac
-case "$d_uname" in
-'') d_uname="$undef";;
-esac
-case "$d_phostname" in
-'') d_phostname="$undef";;
-esac
+: see if ustat exists
+set ustat d_ustat
+eval $inlibc
: backward compatibility for d_hvfork
if test X$d_hvfork != X; then
@@ -9241,10 +11716,6 @@ eval $inhdr
set sys/ndir.h i_sysndir
eval $inhdr
-: see if sys/types.h has to be included
-set sys/types.h i_systypes
-eval $inhdr
-
: see if closedir exists
set closedir d_closedir
eval $inlibc
@@ -9357,49 +11828,100 @@ Log='$Log'
RCSfile='$RCSfile'
Revision='$Revision'
+case "$crosscompile" in
+''|[nN]*) crosscompile="$undef" ;;
+esac
+
+case "$osname" in
+next|rhapsody|darwin) multiarch="$define" ;;
+esac
+case "$multiarch" in
+''|[nN]*) multiarch="$undef" ;;
+esac
+
: check for alignment requirements
echo " "
-case "$alignbytes" in
-'') echo "Checking alignment constraints..." >&4
- $cat >try.c <<'EOCP'
+case "$crosscompile$multiarch" in
+*$define*)
+ $cat <<EOM
+You seem to be either cross-compiling or doing a multiarchitecture build,
+skipping the memory alignment check.
+
+EOM
+ case "$alignbytes" in
+ '') alignbytes=8 ;;
+ esac
+ ;;
+*)
+ case "$alignbytes" in
+ '') echo "Checking alignment constraints..." >&4
+ if $test "X$uselongdouble" = Xdefine -a "X$d_longdbl" = Xdefine; then
+ $cat >try.c <<'EOCP'
+typedef long double NV;
+EOCP
+ else
+ $cat >try.c <<'EOCP'
+typedef double NV;
+EOCP
+ fi
+ $cat >>try.c <<'EOCP'
+#include <stdio.h>
struct foobar {
char foo;
- double bar;
-} try;
+ NV bar;
+} try_algn;
int main()
{
- printf("%d\n", (char *)&try.bar - (char *)&try.foo);
+ printf("%d\n", (int)((char *)&try_algn.bar - (char *)&try_algn.foo));
+ return(0);
}
EOCP
- set try
- if eval $compile_ok; then
- dflt=`./try`
- else
- dflt='8'
- echo "(I can't seem to compile the test program...)"
- fi
- ;;
-*) dflt="$alignbytes"
+ set try
+ if eval $compile_ok; then
+ dflt=`./try`
+ else
+ dflt='8'
+ echo "(I can't seem to compile the test program...)"
+ fi
+ ;;
+ *) dflt="$alignbytes"
+ ;;
+ esac
+ rp="Doubles must be aligned on a how-many-byte boundary?"
+ . ./myread
+ alignbytes="$ans"
+ $rm -f try.c try
;;
esac
-rp="Doubles must be aligned on a how-many-byte boundary?"
-. ./myread
-alignbytes="$ans"
-$rm -f try.c try
+
+
+: set the base revision
+baserev=5.0
: check for ordering of bytes in a long
-case "$byteorder" in
-'')
- $cat <<'EOM'
-
+echo " "
+case "$crosscompile$multiarch" in
+*$define*)
+ $cat <<EOM
+You seem to be either cross-compiling or doing a multiarchitecture build,
+skipping the byteorder check.
+
+EOM
+ byteorder='0xffff'
+ ;;
+*)
+ case "$byteorder" in
+ '')
+ $cat <<'EOM'
In the following, larger digits indicate more significance. A big-endian
machine like a Pyramid or a Motorola 680?0 chip will come out to 4321. A
little-endian machine like a Vax or an Intel 80?86 chip would be 1234. Other
-machines may have weird orders like 3412. A Cray will report 87654321. If
-the test program works the default is probably right.
+machines may have weird orders like 3412. A Cray will report 87654321,
+an Alpha will report 12345678. If the test program works the default is
+probably right.
I'm now running the test program...
EOM
- $cat >try.c <<'EOCP'
+ $cat >try.c <<'EOCP'
#include <stdio.h>
int main()
{
@@ -9419,37 +11941,40 @@ int main()
exit(0);
}
EOCP
- xxx_prompt=y
- set try
- if eval $compile && ./try > /dev/null; then
- dflt=`./try`
- case "$dflt" in
- [1-4][1-4][1-4][1-4]|12345678|87654321)
- echo "(The test program ran ok.)"
- echo "byteorder=$dflt"
- xxx_prompt=n
+ xxx_prompt=y
+ set try
+ if eval $compile && ./try > /dev/null; then
+ dflt=`./try`
+ case "$dflt" in
+ [1-4][1-4][1-4][1-4]|12345678|87654321)
+ echo "(The test program ran ok.)"
+ echo "byteorder=$dflt"
+ xxx_prompt=n
;;
- ????|????????) echo "(The test program ran ok.)" ;;
- *) echo "(The test program didn't run right for some reason.)" ;;
- esac
- else
- dflt='4321'
- cat <<'EOM'
+ ????|????????) echo "(The test program ran ok.)" ;;
+ *) echo "(The test program didn't run right for some reason.)" ;;
+ esac
+ else
+ dflt='4321'
+ cat <<'EOM'
(I can't seem to compile the test program. Guessing big-endian...)
EOM
- fi
- case "$xxx_prompt" in
- y)
- rp="What is the order of bytes in a long?"
- . ./myread
- byteorder="$ans"
- ;;
- *) byteorder=$dflt
+ fi
+ case "$xxx_prompt" in
+ y)
+ rp="What is the order of bytes in a long?"
+ . ./myread
+ byteorder="$ans"
+ ;;
+ *) byteorder=$dflt
+ ;;
+ esac
;;
esac
+ $rm -f try.c try
;;
esac
-$rm -f try.c try
+
: how do we catenate cpp tokens here?
echo " "
@@ -9539,7 +12064,7 @@ int main()
}
EOCP
set try
- if eval $compile && ./try; then
+ if eval $compile_ok && ./try; then
echo 'Looks OK.' >&4
else
echo "I can't use Berkeley DB with your <db.h>. I'll disable Berkeley DB." >&4
@@ -9742,42 +12267,147 @@ EOM
esac
$rm -f try.* .out
-: check for length of double
+
+: How can we generate normalized random numbers ?
echo " "
-case "$doublesize" in
+echo "Looking for a random number function..." >&4
+case "$randfunc" in
'')
- $echo $n "Checking to see how big your double precision numbers are...$c" >&4
- $cat >try.c <<'EOCP'
+ if set drand48 val -f; eval $csym; $val; then
+ dflt="drand48"
+ echo "Good, found drand48()." >&4
+ elif set random val -f; eval $csym; $val; then
+ dflt="random"
+ echo "OK, found random()." >&4
+ else
+ dflt="rand"
+ echo "Yick, looks like I have to use rand()." >&4
+ fi
+ echo " "
+ ;;
+*)
+ dflt="$randfunc"
+ ;;
+esac
+cont=true
+
+case "$ccflags" in
+*-Dmy_rand=*|*-Dmy_srand=*)
+ echo "Removing obsolete -Dmy_rand, -Dmy_srand, and -Drandbits from ccflags." >&4
+ ccflags="`echo $ccflags | sed -e 's/-Dmy_rand=random/ /'`"
+ ccflags="`echo $ccflags | sed -e 's/-Dmy_srand=srandom/ /'`"
+ ccflags="`echo $ccflags | sed -e 's/-Drandbits=[0-9][0-9]*/ /'`"
+ ;;
+esac
+
+while $test "$cont"; do
+ rp="Use which function to generate random numbers?"
+ . ./myread
+ if $test "$ans" = "$dflt"; then
+ : null
+ else
+ randbits=''
+ fi
+ randfunc="$ans"
+ if set $ans val -f; eval $csym; $val; then
+ cont=''
+ else
+ dflt=y
+ rp="I cannot find function $ans. Use that name anyway?"
+ . ./myread
+ dflt=rand
+ case "$ans" in
+ [yY]*) cont='';;
+ esac
+ fi
+ case "$cont" in
+ '')
+ case "$randfunc" in
+ drand48)
+ drand01="drand48()"
+ seedfunc="srand48"
+ randbits=48
+ randseedtype=long
+ ;;
+ rand|random)
+ case "$randbits" in
+ '')
+echo "Checking to see how many bits your $randfunc() function produces..." >&4
+ $cat >try.c <<EOCP
+#$i_unistd I_UNISTD
+#$i_stdlib I_STDLIB
#include <stdio.h>
+#ifdef I_UNISTD
+# include <unistd.h>
+#endif
+#ifdef I_STDLIB
+# include <stdlib.h>
+#endif
int main()
{
- printf("%d\n", sizeof(double));
+ register int i;
+ register unsigned long tmp;
+ register unsigned long max = 0L;
+
+ for (i = 1000; i; i--) {
+ tmp = (unsigned long) $randfunc();
+ if (tmp > max) max = tmp;
+ }
+ for (i = 0; max; i++)
+ max /= 2;
+ printf("%d\n",i);
}
EOCP
- set try
- if eval $compile_ok; then
- doublesize=`./try`
- $echo " $doublesize bytes." >&4
- else
- dflt='8'
- echo "(I can't seem to compile the test program. Guessing...)"
- rp="What is the size of a double precision number (in bytes)?"
- . ./myread
- doublesize="$ans"
- fi
- ;;
-esac
-$rm -f try.c try
+ set try
+ if eval $compile_ok; then
+ dflt=`try`
+ else
+ dflt='?'
+ echo "(I can't seem to compile the test program...)"
+ fi
+ ;;
+ *)
+ dflt="$randbits"
+ ;;
+ esac
+ rp="How many bits does your $randfunc() function produce?"
+ . ./myread
+ randbits="$ans"
+ $rm -f try.c try
+ drand01="($randfunc() / (double) ((unsigned long)1 << $randbits))"
+ seedfunc="s$randfunc"
+ randseedtype=unsigned
+ ;;
+ *)
+ dflt="31"
+ rp="How many bits does your $randfunc() function produce?"
+ . ./myread
+ randbits="$ans"
+ seedfunc="s$randfunc"
+ drand01="($randfunc() / (double) ((unsigned long)1 << $randbits))"
+ if set $seedfunc val -f; eval $csym; $val; then
+ echo "(Using $seedfunc() to seed random generator)"
+ else
+ echo "(Warning: no $seedfunc() to seed random generator)"
+ seedfunc=rand
+ fi
+ randseedtype=unsigned
+ ;;
+ esac
+ ;;
+ esac
+done
echo " "
echo "Determining whether or not we are on an EBCDIC system..." >&4
-$cat >tebcdic.c <<EOM
+$cat >tebcdic.c <<'EOM'
int main()
{
if ('M'==0xd4) return 0;
return 1;
}
EOM
+
val=$undef
set tebcdic
if eval $compile_ok; then
@@ -9785,7 +12415,7 @@ if eval $compile_ok; then
echo "You have EBCDIC." >&4
val="$define"
else
- echo "Nope, no EBCDIC. Assuming ASCII or some ISO Latin." >&4
+ echo "Nope, no EBCDIC, probably ASCII or some ISO Latin." >&4
fi
else
echo "I'm unable to compile the test program." >&4
@@ -9795,32 +12425,295 @@ $rm -f tebcdic.c tebcdic
set ebcdic
eval $setvar
-: see what type file positions are declared as in the library
-rp="What is the type for file position used by fsetpos()?"
-set fpos_t fpostype long stdio.h sys/types.h
-eval $typedef_ask
-
-: get csh whereabouts
-case "$csh" in
-'csh') val="$undef" ;;
-*) val="$define" ;;
+echo " "
+$cat >&4 <<EOM
+Checking how to flush all pending stdio output...
+EOM
+# I only know how to find the first 32 possibly open files on SunOS.
+# See also hints/sunos_4_1.sh and util.c --AD
+case "$osname" in
+sunos) $echo '#define PERL_FFLUSH_ALL_FOPEN_MAX 32' > try.c ;;
esac
-set d_csh
-eval $setvar
-: Respect a hint or command line value for full_csh.
-case "$full_csh" in
-'') full_csh=$csh ;;
+$cat >>try.c <<EOCP
+#include <stdio.h>
+#$i_unistd I_UNISTD
+#ifdef I_UNISTD
+# include <unistd.h>
+#endif
+#$d_sysconf HAS_SYSCONF
+#$d_stdio_stream_array HAS_STDIO_STREAM_ARRAY
+#ifdef HAS_STDIO_STREAM_ARRAY
+# define STDIO_STREAM_ARRAY $stdio_stream_array
+#endif
+int main() {
+ FILE* p = fopen("try.out", "w");
+#ifdef TRY_FPUTC
+ fputc('x', p);
+#else
+# ifdef TRY_FPRINTF
+ fprintf(p, "x");
+# endif
+#endif
+#ifdef TRY_FFLUSH_NULL
+ fflush(NULL);
+#endif
+#ifdef TRY_FFLUSH_ALL
+ {
+ long open_max = -1;
+# ifdef PERL_FFLUSH_ALL_FOPEN_MAX
+ open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
+# else
+# if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
+ open_max = sysconf(_SC_OPEN_MAX);
+# else
+# ifdef FOPEN_MAX
+ open_max = FOPEN_MAX;
+# else
+# ifdef OPEN_MAX
+ open_max = OPEN_MAX;
+# else
+# ifdef _NFILE
+ open_max = _NFILE;
+# endif
+# endif
+# endif
+# endif
+# endif
+# ifdef HAS_STDIO_STREAM_ARRAY
+ if (open_max > 0) {
+ long i;
+ for (i = 0; i < open_max; i++)
+ if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
+ STDIO_STREAM_ARRAY[i]._file < open_max &&
+ STDIO_STREAM_ARRAY[i]._flag)
+ fflush(&STDIO_STREAM_ARRAY[i]);
+ }
+ }
+# endif
+#endif
+ _exit(42);
+}
+EOCP
+: first we have to find out how _not_ to flush
+if $test "X$fflushNULL" = X -o "X$fflushall" = X; then
+ output=''
+ set try -DTRY_FPUTC
+ if eval $compile; then
+ $rm -f try.out
+ ./try$exe_ext 2>/dev/null
+ if $test ! -s try.out -a "X$?" = X42; then
+ output=-DTRY_FPUTC
+ fi
+ fi
+ case "$output" in
+ '')
+ set try -DTRY_FPRINTF
+ $rm -f try.out
+ if eval $compile; then
+ $rm -f try.out
+ ./try$exe_ext 2>/dev/null
+ if $test ! -s try.out -a "X$?" = X42; then
+ output=-DTRY_FPRINTF
+ fi
+ fi
+ ;;
+ esac
+fi
+: check for fflush NULL behaviour
+case "$fflushNULL" in
+'') set try -DTRY_FFLUSH_NULL $output
+ if eval $compile; then
+ $rm -f try.out
+ ./try$exe_ext 2>/dev/null
+ code="$?"
+ if $test -s try.out -a "X$code" = X42; then
+ fflushNULL="`$cat try.out`"
+ else
+ if $test "X$code" != X42; then
+ $cat >&4 <<EOM
+(If this test failed, don't worry, we'll try another method shortly.)
+EOM
+ fi
+ fi
+ fi
+ $rm -f core try.core core.try.*
+ case "$fflushNULL" in
+ x) $cat >&4 <<EOM
+Your fflush(NULL) works okay for output streams.
+Let's see if it clobbers input pipes...
+EOM
+# As of mid-March 2000 all versions of Solaris appear to have a stdio
+# bug that improperly flushes the input end of pipes. So we avoid the
+# autoflush on fork/system/exec support for now. :-(
+$cat >tryp.c <<EOCP
+#include <stdio.h>
+int
+main(int argc, char **argv)
+{
+ char buf[1024];
+ int i;
+ char *bp = buf;
+ while (1) {
+ while ((i = getc(stdin)) != -1
+ && (*bp++ = i) != '\n'
+ && bp < &buf[1024])
+ /* DO NOTHING */ ;
+ *bp = '\0';
+ fprintf(stdout, "%s", buf);
+ fflush(NULL);
+ if (i == -1)
+ return 0;
+ bp = buf;
+ }
+}
+EOCP
+ fflushNULL="$define"
+ set tryp
+ if eval $compile; then
+ $rm -f tryp.out
+ $cat tryp.c | ./tryp$exe_ext 2>/dev/null > tryp.out
+ if cmp tryp.c tryp.out >/dev/null 2>&1; then
+ $cat >&4 <<EOM
+fflush(NULL) seems to behave okay with input streams.
+EOM
+ fflushNULL="$define"
+ else
+ $cat >&4 <<EOM
+Ouch, fflush(NULL) clobbers input pipes! We will not use it.
+EOM
+ fflushNULL="$undef"
+ fi
+ fi
+ $rm -f core tryp.c tryp.core core.tryp.*
+ ;;
+ '') $cat >&4 <<EOM
+Your fflush(NULL) isn't working (contrary to ANSI C).
+EOM
+ fflushNULL="$undef"
+ ;;
+ *) $cat >&4 <<EOM
+Cannot figure out whether your fflush(NULL) works or not.
+I'm assuming it doesn't (contrary to ANSI C).
+EOM
+ fflushNULL="$undef"
+ ;;
+ esac
+ ;;
+$define|true|[yY]*)
+ fflushNULL="$define"
+ ;;
+*)
+ fflushNULL="$undef"
+ ;;
+esac
+: check explicit looping only if NULL did not work, and if the pipe
+: bug does not show up on an explicit flush too
+case "$fflushNULL" in
+"$undef")
+ $cat >tryp.c <<EOCP
+#include <stdio.h>
+int
+main(int argc, char **argv)
+{
+ char buf[1024];
+ int i;
+ char *bp = buf;
+ while (1) {
+ while ((i = getc(stdin)) != -1
+ && (*bp++ = i) != '\n'
+ && bp < &buf[1024])
+ /* DO NOTHING */ ;
+ *bp = '\0';
+ fprintf(stdout, "%s", buf);
+ fflush(stdin);
+ if (i == -1)
+ return 0;
+ bp = buf;
+ }
+}
+EOCP
+ set tryp
+ if eval $compile; then
+ $rm -f tryp.out
+ $cat tryp.c | ./tryp$exe_ext 2>/dev/null > tryp.out
+ if cmp tryp.c tryp.out >/dev/null 2>&1; then
+ $cat >&4 <<EOM
+Good, at least fflush(stdin) seems to behave okay when stdin is a pipe.
+EOM
+ : now check for fflushall behaviour
+ case "$fflushall" in
+ '') set try -DTRY_FFLUSH_ALL $output
+ if eval $compile; then
+ $cat >&4 <<EOM
+(Now testing the other method--but note that this also may fail.)
+EOM
+ $rm -f try.out
+ ./try$exe_ext 2>/dev/null
+ if $test -s try.out -a "X$?" = X42; then
+ fflushall="`$cat try.out`"
+ fi
+ fi
+ $rm -f core try.core core.try.*
+ case "$fflushall" in
+ x) $cat >&4 <<EOM
+Whew. Flushing explicitly all the stdio streams works.
+EOM
+ fflushall="$define"
+ ;;
+ '') $cat >&4 <<EOM
+Sigh. Flushing explicitly all the stdio streams doesn't work.
+EOM
+ fflushall="$undef"
+ ;;
+ *) $cat >&4 <<EOM
+Cannot figure out whether flushing stdio streams explicitly works or not.
+I'm assuming it doesn't.
+EOM
+ fflushall="$undef"
+ ;;
+ esac
+ ;;
+ "$define"|true|[yY]*)
+ fflushall="$define"
+ ;;
+ *)
+ fflushall="$undef"
+ ;;
+ esac
+ else
+ $cat >&4 <<EOM
+All is futile. Even fflush(stdin) clobbers input pipes!
+EOM
+ fflushall="$undef"
+ fi
+ else
+ fflushall="$undef"
+ fi
+ $rm -f core tryp.c tryp.core core.tryp.*
+ ;;
+*) fflushall="$undef"
+ ;;
esac
-: Store the full pathname to the sed program for use in the C program
-full_sed=$sed
+case "$fflushNULL$fflushall" in
+undefundef)
+ $cat <<EOM
+OK, I give up. I cannot figure out how to flush pending stdio output.
+We won't be flushing handles at all before fork/exec/popen.
+EOM
+ ;;
+esac
+$rm -f try.* try$exe_ext
-: Store the full pathname to the ar program for use in the Makefile.SH
+: Store the full pathname to the ar program for use in the C program
: Respect a hint or command line value for full_ar.
case "$full_ar" in
'') full_ar=$ar ;;
esac
+: Store the full pathname to the sed program for use in the C program
+full_sed=$sed
+
: see what type gids are declared as in the kernel
echo " "
echo "Looking for the type for group ids returned by getgid()."
@@ -9845,6 +12738,308 @@ gid_t) echo "gid_t found." ;;
;;
esac
+echo " "
+case "$gidtype" in
+*_t) zzz="$gidtype" ;;
+*) zzz="gid" ;;
+esac
+echo "Checking the size of $zzz..." >&4
+cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ printf("%d\n", (int)sizeof($gidtype));
+ exit(0);
+}
+EOCP
+set try
+if eval $compile_ok; then
+ yyy=`./try`
+ case "$yyy" in
+ '') gidsize=4
+ echo "(I can't execute the test program--guessing $gidsize.)" >&4
+ ;;
+ *) gidsize=$yyy
+ echo "Your $zzz is $gidsize bytes long."
+ ;;
+ esac
+else
+ gidsize=4
+ echo "(I can't compile the test program--guessing $gidsize.)" >&4
+fi
+
+
+echo " "
+case "$gidtype" in
+*_t) zzz="$gidtype" ;;
+*) zzz="gid" ;;
+esac
+echo "Checking the sign of $zzz..." >&4
+cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ $gidtype foo = -1;
+ if (foo < 0)
+ printf("-1\n");
+ else
+ printf("1\n");
+}
+EOCP
+set try
+if eval $compile; then
+ yyy=`./try`
+ case "$yyy" in
+ '') gidsign=1
+ echo "(I can't execute the test program--guessing unsigned.)" >&4
+ ;;
+ *) gidsign=$yyy
+ case "$gidsign" in
+ 1) echo "Your $zzz is unsigned." ;;
+ -1) echo "Your $zzz is signed." ;;
+ esac
+ ;;
+ esac
+else
+ gidsign=1
+ echo "(I can't compile the test program--guessing unsigned.)" >&4
+fi
+
+
+echo " "
+
+if $test X"$quadtype" != X; then
+
+echo "Checking how to print 64-bit integers..." >&4
+
+if $test X"$sPRId64" = X -a X"$quadtype" = Xint; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ int q = 12345678901;
+ printf("%ld\n", q);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 12345678901)
+ sPRId64='"d"'; sPRIi64='"i"'; sPRIu64='"u"';
+ sPRIo64='"o"'; sPRIx64='"x"'; sPRIX64='"X"';
+ echo "We will use %d."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRId64" = X -a X"$quadtype" = Xlong; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ long q = 12345678901;
+ printf("%ld\n", q);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 12345678901)
+ sPRId64='"ld"'; sPRIi64='"li"'; sPRIu64='"lu"';
+ sPRIo64='"lo"'; sPRIx64='"lx"'; sPRIX64='"lX"';
+ echo "We will use %ld."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRId64" = X -a X"$i_inttypes" = X"$define" -a X"$quadtype" = Xint64_t; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <inttypes.h>
+#include <stdio.h>
+int main() {
+ int64_t q = 12345678901;
+ printf("%" PRId64 "\n", q);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 12345678901)
+ sPRId64=PRId64; sPRIi64=PRIi64; sPRIu64=PRIu64;
+ sPRIo64=PRIo64; sPRIx64=PRIx64; sPRIX64=PRIX64;
+ echo "We will use the C9X style."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRId64" = X -a X"$quadtype" = X"long long"; then
+ $cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ long long q = 12345678901LL; /* AIX cc requires the LL prefix. */
+ printf("%lld\n", q);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 12345678901)
+ sPRId64='"lld"'; sPRIi64='"lli"'; sPRIu64='"llu"';
+ sPRIo64='"llo"'; sPRIx64='"llx"'; sPRIX64='"llX"';
+ echo "We will use the %lld style."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRId64" = X -a X"$quadtype" != X; then
+ $cat >try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ $quadtype q = 12345678901;
+ printf("%Ld\n", q);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 12345678901)
+ sPRId64='"Ld"'; sPRIi64='"Li"'; sPRIu64='"Lu"';
+ sPRIo64='"Lo"'; sPRIx64='"Lx"'; sPRIX64='"LX"';
+ echo "We will use %Ld."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRId64" = X -a X"$quadtype" != X; then
+ $cat >try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ $quadtype q = 12345678901;
+ printf("%qd\n", q);
+}
+EOCP
+ set try
+ if eval $compile; then
+ yyy=`./try$exe_ext`
+ case "$yyy" in
+ 12345678901)
+ sPRId64='"qd"'; sPRIi64='"qi"'; sPRIu64='"qu"';
+ sPRIo64='"qo"'; sPRIx64='"qx"'; sPRIX64='"qX"';
+ echo "We will use %qd."
+ ;;
+ esac
+ fi
+fi
+
+if $test X"$sPRId64" = X; then
+ echo "Cannot figure out how to print 64-bit integers." >&4
+fi
+
+$rm -f try try.*
+
+fi
+
+case "$sPRId64" in
+'') d_PRId64="$undef"; d_PRIi64="$undef"; d_PRIu64="$undef";
+ d_PRIo64="$undef"; d_PRIx64="$undef"; d_PRIX64="$undef";
+ ;;
+*) d_PRId64="$define"; d_PRIi64="$define"; d_PRIu64="$define";
+ d_PRIo64="$define"; d_PRIx64="$define"; d_PRIX64="$define";
+ ;;
+esac
+
+
+echo " "
+$echo "Checking the format strings to be used for Perl's internal types..." >&4
+
+if $test X"$ivsize" = X8; then
+ ivdformat="$sPRId64"
+ uvuformat="$sPRIu64"
+ uvoformat="$sPRIo64"
+ uvxformat="$sPRIx64"
+else
+ if $test X"$ivsize" = X"$longsize"; then
+ ivdformat='"ld"'
+ uvuformat='"lu"'
+ uvoformat='"lo"'
+ uvxformat='"lx"'
+ else
+ if $test X"$ivsize" = X"$intsize"; then
+ ivdformat='"d"'
+ uvuformat='"u"'
+ uvoformat='"o"'
+ uvxformat='"x"'
+ else
+ : far out
+ if $test X"$ivsize" = X"$shortsize"; then
+ ivdformat='"hd"'
+ uvuformat='"hu"'
+ uvoformat='"ho"'
+ uvxformat='"hx"'
+ fi
+ fi
+ fi
+fi
+
+case "$ivdformat" in
+'') echo "$0: Fatal: failed to find format strings, cannot continue." >& 4
+ exit 1
+ ;;
+esac
+
+
+echo " "
+$echo "Checking the format string to be used for gids..." >&4
+
+case "$gidsign" in
+-1) if $test X"$gidsize" = X"$ivsize"; then
+ gidformat="$ivdformat"
+ else
+ if $test X"$gidsize" = X"$longsize"; then
+ gidformat='"ld"'
+ else
+ if $test X"$gidsize" = X"$intsize"; then
+ gidformat='"d"'
+ else
+ if $test X"$gidsize" = X"$shortsize"; then
+ gidformat='"hd"'
+ fi
+ fi
+ fi
+ fi
+ ;;
+*) if $test X"$gidsize" = X"$uvsize"; then
+ gidformat="$uvuformat"
+ else
+ if $test X"$gidsize" = X"$longsize"; then
+ gidformat='"lu"'
+ else
+ if $test X"$gidsize" = X"$intsize"; then
+ gidformat='"u"'
+ else
+ if $test X"$gidsize" = X"$shortsize"; then
+ gidformat='"hu"'
+ fi
+ fi
+ fi
+ fi
+ ;;
+esac
+
: see if getgroups exists
set getgroups d_getgrps
eval $inlibc
@@ -9874,11 +13069,6 @@ EOM
*) groupstype="$gidtype";;
esac
-: see what type lseek is declared as in the kernel
-rp="What is the type used for lseek's offset on this system?"
-set off_t lseektype long stdio.h sys/types.h
-eval $typedef_ask
-
echo " "
echo "Checking if your $make program sets \$(MAKE)..." >&4
case "$make_set_make" in
@@ -10107,11 +13297,20 @@ rp="What is the type of process ids on this system?"
set pid_t pidtype int stdio.h sys/types.h
eval $typedef_ask
+: Find earliest binary compatible site_perl subdirectory perl can use.
+case "$bincompat5005" in
+"$define") xs_apiversion='5.005' ;;
+*) xs_apiversion=$version ;; # The current site_perl version.
+esac
+: Find earliest pure perl site_perl subdirectory perl can use.
+: The versioned directories started at 5.005.
+pm_apiversion='5.005'
+
: check for length of pointer
echo " "
case "$ptrsize" in
'')
- $echo $n "Checking to see how big your pointers are...$c" >&4
+ echo "Checking to see how big your pointers are..." >&4
if test "$voidflags" -gt 7; then
echo '#define VOID_PTR char *' > try.c
else
@@ -10121,14 +13320,14 @@ case "$ptrsize" in
#include <stdio.h>
int main()
{
- printf("%d\n", sizeof(VOID_PTR));
- exit(0);
+ printf("%d\n", (int)sizeof(VOID_PTR));
+ exit(0);
}
EOCP
set try
if eval $compile_ok; then
ptrsize=`./try`
- $echo " $ptrsize bytes." >&4
+ echo "Your pointers are $ptrsize bytes long."
else
dflt='4'
echo "(I can't seem to compile the test program. Guessing...)" >&4
@@ -10140,55 +13339,6 @@ EOCP
esac
$rm -f try.c try
-: check for size of random number generator
-echo " "
-case "$randbits" in
-'')
- echo "Checking to see how many bits your rand function produces..." >&4
- $cat >try.c <<EOCP
-#$i_unistd I_UNISTD
-#$i_stdlib I_STDLIB
-#include <stdio.h>
-#ifdef I_UNISTD
-# include <unistd.h>
-#endif
-#ifdef I_STDLIB
-# include <stdlib.h>
-#endif
-EOCP
- $cat >>try.c <<'EOCP'
-int main()
-{
- register int i;
- register unsigned long tmp;
- register unsigned long max = 0L;
-
- for (i = 1000; i; i--) {
- tmp = (unsigned long)rand();
- if (tmp > max) max = tmp;
- }
- for (i = 0; max; i++)
- max /= 2;
- printf("%d\n",i);
-}
-EOCP
- set try
- if eval $compile_ok; then
- dflt=`./try$_exe`
- else
- dflt='?'
- echo "(I can't seem to compile the test program...)"
- fi
- ;;
-*)
- dflt="$randbits"
- ;;
-esac
-rp='How many bits does your rand() function produce?'
-. ./myread
-randbits="$ans"
-$rm -f try.* try
-
: see if ar generates random libraries by itself
echo " "
echo "Checking how to generate random libraries on your machine..." >&4
@@ -10232,172 +13382,11 @@ else
fi
$rm -f foo* bar*
-: see if sys/select.h has to be included
-set sys/select.h i_sysselct
-eval $inhdr
-
-: see if we should include time.h, sys/time.h, or both
-echo " "
-if test "X$timeincl" = X; then
- echo "Testing to see if we should include <time.h>, <sys/time.h> or both." >&4
- $echo $n "I'm now running the test program...$c"
- $cat >try.c <<'EOCP'
-#include <sys/types.h>
-#ifdef I_TIME
-#include <time.h>
-#endif
-#ifdef I_SYSTIME
-#ifdef SYSTIMEKERNEL
-#define KERNEL
-#endif
-#include <sys/time.h>
-#endif
-#ifdef I_SYSSELECT
-#include <sys/select.h>
-#endif
-int main()
-{
- struct tm foo;
-#ifdef S_TIMEVAL
- struct timeval bar;
-#endif
-#ifdef S_TIMEZONE
- struct timezone tzp;
-#endif
- if (foo.tm_sec == foo.tm_sec)
- exit(0);
-#ifdef S_TIMEVAL
- if (bar.tv_sec == bar.tv_sec)
- exit(0);
-#endif
- exit(1);
-}
-EOCP
- flags=''
- for s_timezone in '-DS_TIMEZONE' ''; do
- sysselect=''
- for s_timeval in '-DS_TIMEVAL' ''; do
- for i_systimek in '' '-DSYSTIMEKERNEL'; do
- for i_time in '' '-DI_TIME'; do
- for i_systime in '-DI_SYSTIME' ''; do
- case "$flags" in
- '') $echo $n ".$c"
- set try $i_time $i_systime $i_systimek $sysselect $s_timeval $s_timezone
- if eval $compile; then
- set X $i_time $i_systime $i_systimek $sysselect $s_timeval
- shift
- flags="$*"
- echo " "
- $echo $n "Succeeded with $flags$c"
- fi
- ;;
- esac
- done
- done
- done
- done
- done
- timeincl=''
- echo " "
- case "$flags" in
- *SYSTIMEKERNEL*) i_systimek="$define"
- timeincl=`./findhdr sys/time.h`
- echo "We'll include <sys/time.h> with KERNEL defined." >&4;;
- *) i_systimek="$undef";;
- esac
- case "$flags" in
- *I_TIME*) i_time="$define"
- timeincl=`./findhdr time.h`" $timeincl"
- echo "We'll include <time.h>." >&4;;
- *) i_time="$undef";;
- esac
- case "$flags" in
- *I_SYSTIME*) i_systime="$define"
- timeincl=`./findhdr sys/time.h`" $timeincl"
- echo "We'll include <sys/time.h>." >&4;;
- *) i_systime="$undef";;
- esac
- $rm -f try.c try
-fi
-
-: check for fd_set items
-$cat <<EOM
-
-Checking to see how well your C compiler handles fd_set and friends ...
-EOM
-$cat >fd_set.c <<EOCP
-#$i_systime I_SYS_TIME
-#$i_sysselct I_SYS_SELECT
-#$d_socket HAS_SOCKET
-#include <sys/types.h>
-#ifdef HAS_SOCKET
-#include <sys/socket.h> /* Might include <sys/bsdtypes.h> */
-#endif
-#ifdef I_SYS_TIME
-#include <sys/time.h>
-#endif
-#ifdef I_SYS_SELECT
-#include <sys/select.h>
-#endif
-int main() {
- fd_set fds;
-
-#ifdef TRYBITS
- if(fds.fds_bits);
-#endif
-
-#if defined(FD_SET) && defined(FD_CLR) && defined(FD_ISSET) && defined(FD_ZERO)
- exit(0);
-#else
- exit(1);
-#endif
-}
-EOCP
-set fd_set -DTRYBITS
-if eval $compile; then
- d_fds_bits="$define"
- d_fd_set="$define"
- echo "Well, your system knows about the normal fd_set typedef..." >&4
- if ./fd_set; then
- echo "and you have the normal fd_set macros (just as I'd expect)." >&4
- d_fd_macros="$define"
- else
- $cat >&4 <<'EOM'
-but not the normal fd_set macros! Gaaack! I'll have to cover for you.
-EOM
- d_fd_macros="$undef"
- fi
-else
- $cat <<'EOM'
-Hmm, your compiler has some difficulty with fd_set. Checking further...
-EOM
- set fd_set
- if eval $compile; then
- d_fds_bits="$undef"
- d_fd_set="$define"
- echo "Well, your system has some sort of fd_set available..." >&4
- if ./fd_set; then
- echo "and you have the normal fd_set macros." >&4
- d_fd_macros="$define"
- else
- $cat <<'EOM'
-but not the normal fd_set macros! Gross! More work for me...
-EOM
- d_fd_macros="$undef"
- fi
- else
- echo "Well, you got zip. That's OK, I can roll my own fd_set stuff." >&4
- d_fd_set="$undef"
- d_fds_bits="$undef"
- d_fd_macros="$undef"
- fi
-fi
-$rm -f fd_set*
-
: check for type of arguments to select.
case "$selecttype" in
'') case "$d_select" in
$define)
+ echo " "
$cat <<EOM
Checking to see what type of arguments are accepted by select().
EOM
@@ -10411,7 +13400,7 @@ EOM
: void pointer has been seen but using that
: breaks the selectminbits test
for xxx in 'fd_set *' 'int *'; do
- for nfd in 'int' 'size_t' 'unsigned' 'unsigned long'; do
+ for nfd in 'int' 'size_t' 'unsigned long' 'unsigned' ; do
for tmo in 'struct timeval *' 'const struct timeval *'; do
case "$val" in
'') try="extern select _(($nfd, $xxx, $xxx, $xxx, $tmo));"
@@ -10472,6 +13461,10 @@ EOM
#ifdef I_SYS_SELECT
#include <sys/select.h>
#endif
+#$d_socket HAS_SOCKET
+#ifdef HAS_SOCKET
+# include <sys/socket.h> /* Might include <sys/bsdtypes.h> */
+#endif
#include <stdio.h>
$selecttype b;
#define S sizeof(*(b))
@@ -10539,11 +13532,19 @@ esac
: Trace out the files included by signal.h, then look for SIGxxx names.
: Remove SIGARRAYSIZE used by HPUX.
+: Remove SIGSTKSIZE used by Linux.
+: Remove SIGSTKSZ used by Posix.
: Remove SIGTYP void lines used by OS2.
-xxx=`echo '#include <signal.h>' |
+: Some cpps, like os390, dont give the file name anywhere
+if [ "X$fieldn" = X ]; then
+ : Just make some guesses. We check them later.
+ xxx='/usr/include/signal.h /usr/include/sys/signal.h'
+else
+ xxx=`echo '#include <signal.h>' |
$cppstdin $cppminus $cppflags 2>/dev/null |
$grep '^[ ]*#.*include' |
$awk "{print \\$$fieldn}" | $sed 's!"!!g' | $sort | $uniq`
+fi
: Check this list of files to be sure we have parsed the cpp output ok.
: This will also avoid potentially non-existent files, such
: as ../foo/bar.h
@@ -10556,17 +13557,19 @@ case "$xxxfiles" in
'') xxxfiles=`./findhdr signal.h` ;;
esac
xxx=`awk '
-$1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $2 !~ /SIGARRAYSIZE/ && $3 !~ /void/ {
+$1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $2 !~ /SIGARRAYSIZE/ && $2 !~ /SIGSTKSIZE/ && $2 !~ /SIGSTKSZ/ && $3 !~ /void/ {
print substr($2, 4, 20)
}
$1 == "#" && $2 ~ /^define$/ && $3 ~ /^SIG[A-Z0-9]*$/ && $3 !~ /SIGARRAYSIZE/ && $4 !~ /void/ {
print substr($3, 4, 20)
}' $xxxfiles`
: Append some common names just in case the awk scan failed.
-xxx="$xxx ABRT ALRM BUS CHLD CLD CONT DIL EMT FPE HUP ILL INT IO IOT KILL"
-xxx="$xxx LOST PHONE PIPE POLL PROF PWR QUIT SEGV STKFLT STOP SYS TERM TRAP"
-xxx="$xxx TSTP TTIN TTOU URG USR1 USR2 USR3 USR4 VTALRM"
-xxx="$xxx WINCH WIND WINDOW XCPU XFSZ"
+xxx="$xxx ABRT ALRM BUS CANCEL CHLD CLD CONT DIL EMT FPE"
+xxx="$xxx FREEZE HUP ILL INT IO IOT KILL LOST LWP PHONE"
+xxx="$xxx PIPE POLL PROF PWR QUIT RTMAX RTMIN SEGV STKFLT STOP"
+xxx="$xxx SYS TERM THAW TRAP TSTP TTIN TTOU URG USR1 USR2"
+xxx="$xxx USR3 USR4 VTALRM WAITING WINCH WIND WINDOW XCPU XFSZ"
+
: generate a few handy files for later
$cat > signal.c <<'EOCP'
#include <sys/types.h>
@@ -10639,7 +13642,7 @@ echo $xxx | $tr ' ' $trnl | $sort | $uniq | $awk '
}
END {
printf "#endif /* JUST_NSIG */\n";
- printf "}\n";
+ printf "exit(0);\n}\n";
}
' >>signal.c
$cat >signal.awk <<'EOP'
@@ -10656,20 +13659,22 @@ $1 ~ /^NSIG$/ { nsig = $2 }
sig_name[$2] = $1
sig_num[$2] = $2
}
-
}
END {
- if (nsig == 0) { nsig = maxsig + 1 }
- for (n = 1; n < nsig; n++) {
- if (sig_name[n]) {
- printf("%s %d\n", sig_name[n], sig_num[n])
- }
- else {
- printf("NUM%d %d\n", n, n)
- }
+ if (nsig == 0) {
+ nsig = maxsig + 1
+ }
+ printf("NSIG %d\n", nsig);
+ for (n = 1; n < nsig; n++) {
+ if (sig_name[n]) {
+ printf("%s %d\n", sig_name[n], sig_num[n])
}
+ else {
+ printf("NUM%d %d\n", n, n)
+ }
+ }
for (n = 0; n < ndups; n++) {
- printf("%s %d\n", dup_name[n], dup_num[n])
+ printf("%s %d\n", dup_name[n], dup_num[n])
}
}
EOP
@@ -10735,7 +13740,8 @@ else
0) set HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM;;
esac
echo $@ | $tr ' ' $trnl | \
- $awk '{ printf $1; printf " %d\n", ++s; }' >signal.lst
+ $awk '{ printf "%s %d\n", $1, ++s; }
+ END { printf "NSIG %d\n", ++s }' >signal.lst
fi
$rm -f signal.c signal$_exe signal$_o signal.nsg signal.ls1
EOS
@@ -10754,19 +13760,20 @@ case "$doinit" in
yes)
echo "Generating a list of signal names and numbers..." >&4
. ./signal_cmd
- sig_name=`$awk '{printf "%s ", $1}' signal.lst`
- sig_name="ZERO $sig_name"
- sig_name_init=`$awk 'BEGIN { printf "\"ZERO\", " }
- { printf "\"%s\", ", $1 }
- END { printf "0\n" }' signal.lst`
- sig_num=`$awk '{printf "%d ", $2}' signal.lst`
- sig_num="0 $sig_num"
- sig_num_init=`$awk 'BEGIN { printf "0, " }
- { printf "%d, ", $2}
- END { printf "0\n"}' signal.lst`
- ;;
-esac
-echo "The following signals are available:"
+ sig_count=`$awk '/^NSIG/ { printf "%d", $2 }' signal.lst`
+ sig_name=`$awk 'BEGIN { printf "ZERO " }
+ !/^NSIG/ { printf "%s ", $1 }' signal.lst`
+ sig_num=`$awk 'BEGIN { printf "0 " }
+ !/^NSIG/ { printf "%d ", $2 }' signal.lst`
+ sig_name_init=`$awk 'BEGIN { printf "\"ZERO\", " }
+ !/^NSIG/ { printf "\"%s\", ", $1 }
+ END { printf "0\n" }' signal.lst`
+ sig_num_init=`$awk 'BEGIN { printf "0, " }
+ !/^NSIG/ { printf "%d, ", $2}
+ END { printf "0\n"}' signal.lst`
+ ;;
+esac
+echo "The following $sig_count signals are available:"
echo " "
echo $sig_name | $awk \
'BEGIN { linelen = 0 }
@@ -10784,6 +13791,100 @@ echo $sig_name | $awk \
}'
$rm -f signal signal.c signal.awk signal.lst signal_cmd
+echo " "
+case "$sizetype" in
+*_t) zzz="$sizetype" ;;
+*) zzz="filesize" ;;
+esac
+echo "Checking the size of $zzz..." >&4
+cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ printf("%d\n", (int)sizeof($sizetype));
+ exit(0);
+}
+EOCP
+set try
+if eval $compile_ok; then
+ yyy=`./try`
+ case "$yyy" in
+ '') sizesize=4
+ echo "(I can't execute the test program--guessing $sizesize.)" >&4
+ ;;
+ *) sizesize=$yyy
+ echo "Your $zzz size is $sizesize bytes."
+ ;;
+ esac
+else
+ sizesize=4
+ echo "(I can't compile the test program--guessing $sizesize.)" >&4
+fi
+
+
+: check for socklen_t
+echo " "
+echo "Checking to see if you have socklen_t..." >&4
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#$d_socket HAS_SOCKET
+#ifdef HAS_SOCKET
+#include <sys/socket.h>
+#endif
+int main() { socklen_t x = 16; }
+EOCP
+set try
+if eval $compile; then
+ val="$define"
+ echo "You have socklen_t."
+else
+ val="$undef"
+ echo "You do not have socklen_t."
+ case "$sizetype" in
+ size_t) echo "(You do have size_t, that might work. Some people are happy with just an int.)" ;;
+ esac
+fi
+$rm -f try try.*
+set d_socklen_t
+eval $setvar
+
+: check for type of the size argument to socket calls
+case "$d_socket" in
+"$define")
+ $cat <<EOM
+
+Checking to see what type is the last argument of accept().
+EOM
+ hdrs="$define sys/types.h $d_socket sys/socket.h"
+ yyy=''
+ case "$d_socklen_t" in
+ "$define") yyy="$yyy socklen_t"
+ esac
+ yyy="$yyy $sizetype int long unsigned"
+ for xxx in $yyy; do
+ case "$socksizetype" in
+ '') try="extern int accept(int, struct sockaddr *, $xxx *);"
+ if ./protochk "$try" $hdrs; then
+ echo "Your system accepts '$xxx *' for the last argument of accept()."
+ socksizetype="$xxx"
+ fi
+ ;;
+ esac
+ done
+: In case none of those worked, prompt the user.
+ case "$socksizetype" in
+ '') rp='What is the type for socket address structure sizes?'
+ dflt='int'
+ . ./myread
+ socksizetype=$ans
+ ;;
+ esac
+ ;;
+*) : no sockets, so pick relatively harmless default
+ socksizetype='int'
+ ;;
+esac
+
: see what type is used for signed size_t
set ssize_t ssizetype int stdio.h sys/types.h
eval $typedef
@@ -10839,15 +13940,15 @@ fi
echo " "
if test "X$d_time" = X -o X"$timetype" = X; then
if set time val -f d_time; eval $csym; $val; then
- echo 'time() found.' >&4
- val="$define"
- rp="What is the type returned by time() on this system?"
- set time_t timetype long stdio.h sys/types.h
- eval $typedef_ask
+ echo 'time() found.' >&4
+ val="$define"
+ rp="What is the type returned by time() on this system?"
+ set time_t timetype long stdio.h sys/types.h
+ eval $typedef_ask
else
- echo 'time() not found, hope that will do.' >&4
- val="$undef"
- timetype='int';
+ echo 'time() not found, hope that will do.' >&4
+ val="$undef"
+ timetype='int';
fi
set d_time
eval $setvar
@@ -10877,6 +13978,112 @@ uid_t) echo "uid_t found." ;;
;;
esac
+echo " "
+case "$uidtype" in
+*_t) zzz="$uidtype" ;;
+*) zzz="uid" ;;
+esac
+echo "Checking the size of $zzz..." >&4
+cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ printf("%d\n", (int)sizeof($uidtype));
+ exit(0);
+}
+EOCP
+set try
+if eval $compile_ok; then
+ yyy=`./try`
+ case "$yyy" in
+ '') uidsize=4
+ echo "(I can't execute the test program--guessing $uidsize.)" >&4
+ ;;
+ *) uidsize=$yyy
+ echo "Your $zzz is $uidsize bytes long."
+ ;;
+ esac
+else
+ uidsize=4
+ echo "(I can't compile the test program--guessing $uidsize.)" >&4
+fi
+
+echo " "
+case "$uidtype" in
+*_t) zzz="$uidtype" ;;
+*) zzz="uid" ;;
+esac
+echo "Checking the sign of $zzz..." >&4
+cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+ $uidtype foo = -1;
+ if (foo < 0)
+ printf("-1\n");
+ else
+ printf("1\n");
+}
+EOCP
+set try
+if eval $compile; then
+ yyy=`./try`
+ case "$yyy" in
+ '') uidsign=1
+ echo "(I can't execute the test program--guessing unsigned.)" >&4
+ ;;
+ *) uidsign=$yyy
+ case "$uidsign" in
+ 1) echo "Your $zzz is unsigned." ;;
+ -1) echo "Your $zzz is signed." ;;
+ esac
+ ;;
+ esac
+else
+ uidsign=1
+ echo "(I can't compile the test program--guessing unsigned.)" >&4
+fi
+
+
+
+echo " "
+$echo "Checking the format string to be used for uids..." >&4
+
+case "$uidsign" in
+-1) if $test X"$uidsize" = X"$ivsize"; then
+ uidformat="$ivdformat"
+ else
+ if $test X"$uidsize" = X"$longsize"; then
+ uidformat='"ld"'
+ else
+ if $test X"$uidsize" = X"$intsize"; then
+ uidformat='"d"'
+ else
+ if $test X"$uidsize" = X"$shortsize"; then
+ uidformat='"hd"'
+ fi
+ fi
+ fi
+ fi
+ ;;
+*) if $test X"$uidsize" = X"$uvsize"; then
+ uidformat="$uvuformat"
+ else
+ if $test X"$uidsize" = X"$longsize"; then
+ uidformat='"lu"'
+ else
+ if $test X"$uidsize" = X"$intsize"; then
+ uidformat='"u"'
+ else
+ if $test X"$uidsize" = X"$shortsize"; then
+ uidformat='"hu"'
+ fi
+ fi
+ fi
+ fi
+ ;;
+esac
+
: see if dbm.h is available
: see if dbmclose exists
set dbmclose d_dbmclose
@@ -10960,54 +14167,36 @@ esac
set i_fcntl
eval $setvar
-: see if this is an grp system
-set grp.h i_grp
+: see if this is a iconv.h system
+set iconv.h i_iconv
eval $inhdr
-case "$i_grp" in
-$define)
- : see if setgrent exists
- set setgrent d_setgrent
- eval $inlibc
-
- : see if getgrent exists
- set getgrent d_getgrent
- eval $inlibc
-
- : see if endgrent exists
- set endgrent d_endgrent
- eval $inlibc
-
- xxx=`./findhdr grp.h`
- $cppstdin $cppflags $cppminus < $xxx >$$.h
-
- if $contains 'gr_passwd' $$.h >/dev/null 2>&1; then
- val="$define"
- else
- val="$undef"
- fi
- set d_grpasswd
- eval $setvar
-
- $rm -f $$.h
- ;;
-*) # Assume all is lost as far as the d_*gr* go.
- val="$undef";
- set d_setgrent; eval $setvar
- set d_getgrent; eval $setvar
- set d_endgrent; eval $setvar
- set d_grpasswd; eval $setvar
- ;;
-esac
+: see if this is a ieeefp.h system
+set ieeefp.h i_ieeefp
+eval $inhdr
: see if locale.h is available
set locale.h i_locale
eval $inhdr
+: see if mach cthreads are available
+if test "X$usethreads" = "X$define"; then
+ set mach/cthreads.h i_machcthr
+ eval $inhdr
+else
+ i_machcthr="$undef"
+fi
+
+
+
: see if this is a math.h system
set math.h i_math
eval $inhdr
+: see if this is a mntent.h system
+set mntent.h i_mntent
+eval $inhdr
+
: see if ndbm.h is available
set ndbm.h t_ndbm
eval $inhdr
@@ -11057,57 +14246,128 @@ esac
set i_neterrno
eval $setvar
-: get C preprocessor symbols handy
+: see if netinet/tcp.h is available
+set netinet/tcp.h i_netinettcp
+eval $inhdr
+
+: see if this is a poll.h system
+set poll.h i_poll
+eval $inhdr
+
echo " "
-$echo $n "Hmm... $c"
-echo $al | $tr ' ' $trnl >Cppsym.know
-$cat <<EOSS >Cppsym
+$echo "Guessing which symbols your C compiler and preprocessor define..." >&4
+$cat <<'EOSH' > Cppsym.know
+a29k ABI64 aegis AES_SOURCE AIX AIX32 AIX370
+AIX41 AIX42 AIX43 AIX_SOURCE aixpc ALL_SOURCE
+alliant alpha am29000 AM29000 amiga AMIGAOS AMIX
+ansi ANSI_C_SOURCE apollo ardent atarist att386 att3b BeOS
+BIG_ENDIAN BIT_MSF bsd BSD bsd43 bsd4_2 bsd4_3 BSD4_3 bsd4_4
+BSD_4_3 BSD_4_4 BSD_NET2 BSD_TIME BSD_TYPES BSDCOMPAT bsdi
+bull c cadmus clipper CMU COFF COMPILER_VERSION
+concurrent convex cpu cray CRAY CRAYMPP ctix CX_UX
+CYGWIN DGUX DGUX_SOURCE DJGPP dmert DOLPHIN DPX2 DSO
+Dynix DynixPTX ELF encore EPI EXTENSIONS FILE_OFFSET_BITS
+FreeBSD GCC_NEW_VARARGS gcos gcx gimpel
+GNU_SOURCE GNUC GNUC_MINOR GO32 gould GOULD_PN
+H3050R H3050RX hbullx20 hcx host_mips
+hp200 hp300 hp700 HP700 hp800 hp9000
+hp9000s200 hp9000s300 hp9000s400 hp9000s500
+hp9000s700 hp9000s800 hp9k8 hp_osf hppa hpux HPUX_SOURCE
+i186 i286 i386 i486 i586 i686 i8086 i80960 i860 I960
+iAPX286 ibm ibm032 ibmesa IBMR2 ibmrt ILP32 ILP64
+INLINE_INTRINSICS INTRINSICS INT64 interdata is68k ksr1
+LANGUAGE_C LARGE_FILE_API LARGEFILE64_SOURCE
+LARGEFILE_SOURCE LFS64_LARGEFILE LFS_LARGEFILE
+Linux LITTLE_ENDIAN LONG64 LONG_DOUBLE LONG_LONG
+LONGDOUBLE LONGLONG LP64 luna luna88k Lynx
+M68000 m68k m88100 m88k M88KBCS_TARGET M_COFF
+M_I186 M_I286 M_I386 M_I8086 M_I86 M_I86SM M_SYS3
+M_SYS5 M_SYSIII M_SYSV M_UNIX M_XENIX MACH machine MachTen
+MATH_HAS_NO_SIDE_EFFECTS
+mc300 mc500 mc68000 mc68010 mc68020 mc68030 mc68040
+mc68060 mc68k mc68k32 mc700 mc88000 mc88100 merlin
+mert MiNT mips MIPS_FPSET MIPS_ISA MIPS_SIM MIPS_SZINT
+MIPS_SZLONG MIPS_SZPTR MIPSEB MIPSEL MODERN_C motorola
+mpeix MSDOS MTXINU MULTIMAX mvs MVS n16 ncl_el ncl_mr
+NetBSD news1500 news1700 news1800 news1900 news3700
+news700 news800 news900 NeXT NLS ns16000 ns32000
+ns32016 ns32332 ns32k nsc32000
+OCS88 OEMVS OpenBSD os OS2 OS390 osf OSF1 OSF_SOURCE
+pa_risc PA_RISC1_1 PA_RISC2_0 PARAGON parisc
+pc532 pdp11 PGC PIC plexus PORTAR posix
+POSIX1B_SOURCE POSIX2_SOURCE POSIX4_SOURCE
+POSIX_C_SOURCE POSIX_SOURCE POWER
+PROTOTYPES PWB pyr QNX R3000 REENTRANT RES Rhapsody RISC6000
+riscix riscos RT scs SCO sequent sgi SGI_SOURCE sinix
+SIZE_INT SIZE_LONG SIZE_PTR SOCKET_SOURCE SOCKETS_SOURCE
+sony sony_news sonyrisc sparc sparclite spectrum
+stardent stdc STDC_EXT stratos sun sun3 sun386
+Sun386i svr3 svr4 SVR4_2 SVR4_SOURCE svr5
+SX system SYSTYPE_BSD SYSTYPE_BSD43 SYSTYPE_BSD44
+SYSTYPE_SVR4 SYSTYPE_SVR5 SYSTYPE_SYSV SYSV SYSV3 SYSV4 SYSV5
+sysV68 sysV88 Tek4132 Tek4300 titan
+tower tower32 tower32_200 tower32_600 tower32_700
+tower32_800 tower32_850 tss
+u370 u3b u3b2 u3b20 u3b200 u3b20d u3b5
+ultrix UMAXV UnicomPBB UnicomPBD UNICOS UNICOSMK
+unix UNIX95 UNIX99 unixpc unos USGr4 USGr4_2
+Utek UTek UTS UWIN uxpm uxps vax venix VMESA vms xenix Xenix286
+XOPEN_SOURCE XOPEN_SOURCE_EXTENDED XPG2 XPG2_EXTENDED
+XPG3 XPG3_EXTENDED XPG4 XPG4_EXTENDED
+z8000
+EOSH
+# Maybe put other stuff here too.
+cat <<EOSH >>Cppsym.know
+$osname
+EOSH
+./tr '[a-z]' '[A-Z]' < Cppsym.know > Cppsym.a
+./tr '[A-Z]' '[a-z]' < Cppsym.know > Cppsym.b
+$cat Cppsym.a Cppsym.b | $tr ' ' $trnl | sort | uniq > Cppsym.know
+$rm -f Cppsym.a Cppsym.b
+cat <<EOSH > Cppsym
$startsh
-case "\$1" in
--l) list=true
- shift
- ;;
-esac
-unknown=''
-case "\$list\$#" in
-1|2)
- for sym do
- if $contains "^\$1$" Cppsym.true >/dev/null 2>&1; then
- exit 0
- elif $contains "^\$1$" Cppsym.know >/dev/null 2>&1; then
- :
- else
- unknown="\$unknown \$sym"
- fi
- done
- set X \$unknown
- shift
- ;;
-esac
-case \$# in
-0) exit 1;;
-esac
-echo \$* | $tr ' ' '$trnl' | $sed -e 's/\(.*\)/\\
-#ifdef \1\\
-exit 0; _ _ _ _\1\\ \1\\
-#endif\\
-/' >Cppsym\$\$
-echo "exit 1; _ _ _" >>Cppsym\$\$
-$cppstdin $cppminus <Cppsym\$\$ | $grep '^exit [01]; _ _' >Cppsym2\$\$
-case "\$list" in
-true) $awk 'NF > 5 {print substr(\$6,2,100)}' <Cppsym2\$\$ ;;
-*)
- sh Cppsym2\$\$
- status=\$?
- ;;
-esac
-$rm -f Cppsym\$\$ Cppsym2\$\$
-exit \$status
-EOSS
+if $test \$# -gt 0; then
+ echo \$* | $tr " " "$trnl" | ./Cppsym.try > Cppsym.got
+ if $test -s Cppsym.got; then
+ $rm -f Cppsym.got
+ exit 0
+ fi
+ $rm -f Cppsym.got
+ exit 1
+else
+ $tr " " "$trnl" | ./Cppsym.try
+ exit 0
+fi
+EOSH
chmod +x Cppsym
$eunicefix Cppsym
-./Cppsym -l $al | $sort | $grep -v '^$' >Cppsym.true
-
+cat <<EOSH > Cppsym.try
+$startsh
+cat <<'EOCP' > try.c
+#include <stdio.h>
+int main() {
+EOCP
+$awk \\
+EOSH
+cat <<'EOSH' >> Cppsym.try
+'length($1) > 0 {
+ printf "#ifdef %s\n#if %s+0\nprintf(\"%s=%%ld\\n\", %s);\n#else\nprintf(\"%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
+ printf "#ifdef _%s\n#if _%s+0\nprintf(\"_%s=%%ld\\n\", _%s);\n#else\nprintf(\"_%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
+ printf "#ifdef __%s\n#if __%s+0\nprintf(\"__%s=%%ld\\n\", __%s);\n#else\nprintf(\"__%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
+ printf "#ifdef __%s__\n#if __%s__+0\nprintf(\"__%s__=%%ld\\n\", __%s__);\n#else\nprintf(\"__%s__\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
+}' >> try.c
+echo '}' >> try.c
+EOSH
+cat <<EOSH >> Cppsym.try
+ccflags="$ccflags"
+case "$osname-$gccversion" in
+irix-) ccflags="\$ccflags -woff 1178" ;;
+esac
+$cc $optimize \$ccflags $ldflags -o try try.c $libs && ./try$exe_ext
+EOSH
+chmod +x Cppsym.try
+$eunicefix Cppsym.try
+./Cppsym < Cppsym.know > Cppsym.true
: now check the C compiler for additional symbols
postprocess_cc_v=''
case "$osname" in
@@ -11127,7 +14387,7 @@ do
done
$rm -f try.c
EOS
-unset postprocess_cc_v
+postprocess_cc_v=''
chmod +x ccsym
$eunicefix ccsym
./ccsym > ccsym1.raw
@@ -11139,15 +14399,16 @@ fi
$awk '/\=/ { print $0; next }
{ print $0"=1" }' ccsym.raw >ccsym.list
-$awk '{ print $0"=1" }' Cppsym.true >ccsym.true
+$awk '/\=/ { print $0; next }
+ { print $0"=1" }' Cppsym.true >ccsym.true
$comm -13 ccsym.true ccsym.list >ccsym.own
$comm -12 ccsym.true ccsym.list >ccsym.com
$comm -23 ccsym.true ccsym.list >ccsym.cpp
also=''
if $test -z ccsym.raw; then
- echo "Your C compiler doesn't seem to define any symbol!" >&4
+ echo "Your C compiler doesn't seem to define any symbols!" >&4
echo " "
- echo "However, your C preprocessor defines the following ones:"
+ echo "However, your C preprocessor defines the following symbols:"
$cat Cppsym.true
ccsymbols=''
cppsymbols=`$cat Cppsym.true`
@@ -11159,27 +14420,27 @@ else
$sed -e 's/\(.*\)=.*/\1/' ccsym.com
also='also '
symbols='ones'
- $test "$silent" || sleep 1
cppccsymbols=`$cat ccsym.com`
cppccsymbols=`echo $cppccsymbols`
+ $test "$silent" || sleep 1
fi
if $test -s ccsym.cpp; then
$test "$also" && echo " "
echo "Your C pre-processor ${also}defines the following symbols:"
$sed -e 's/\(.*\)=.*/\1/' ccsym.cpp
also='further '
- $test "$silent" || sleep 1
cppsymbols=`$cat ccsym.cpp`
cppsymbols=`echo $cppsymbols`
+ $test "$silent" || sleep 1
fi
if $test -s ccsym.own; then
$test "$also" && echo " "
echo "Your C compiler ${also}defines the following cpp symbols:"
$sed -e 's/\(.*\)=1/\1/' ccsym.own
$sed -e 's/\(.*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true
- $test "$silent" || sleep 1
ccsymbols=`$cat ccsym.own`
ccsymbols=`echo $ccsymbols`
+ $test "$silent" || sleep 1
fi
fi
$rm -f ccsym*
@@ -11239,6 +14500,14 @@ set i_termio; eval $setvar
val=$val2; set i_sgtty; eval $setvar
val=$val3; set i_termios; eval $setvar
+: see if this is a shadow.h system
+set shadow.h i_shadow
+eval $inhdr
+
+: see if this is a socks.h system
+set socks.h i_socks
+eval $inhdr
+
: see if stdarg is available
echo " "
if $test `./findhdr stdarg.h`; then
@@ -11341,6 +14610,14 @@ $rm -f varargs*
set stddef.h i_stddef
eval $inhdr
+: see if this is a sunmath.h system
+set sunmath.h i_sunmath
+eval $inhdr
+
+: see if sys/access.h is available
+set sys/access.h i_sysaccess
+eval $inhdr
+
: see if ioctl defs are in sgtty, termio, sys/filio or sys/ioctl
set sys/filio.h i_sysfilio
eval $inhdr
@@ -11362,18 +14639,49 @@ fi
set i_sysioctl
eval $setvar
+
+: see if this is a syslog.h system
+set syslog.h i_syslog
+eval $inhdr
+
+
+: see if this is a sys/mode.h system
+set sys/mode.h i_sysmode
+eval $inhdr
+
: see if sys/resource.h has to be included
set sys/resource.h i_sysresrc
eval $inhdr
+: see if sys/security.h is available
+set sys/security.h i_syssecrt
+eval $inhdr
+
+: see if this is a sys/statvfs.h system
+set sys/statvfs.h i_sysstatvfs
+eval $inhdr
+
+: see if this is a sys/uio.h system
+set sys/uio.h i_sysuio
+eval $inhdr
+
: see if this is a sys/un.h system
set sys/un.h i_sysun
eval $inhdr
+
+: see if this is a sys/utsname.h system
+set sys/utsname.h i_sysutsname
+eval $inhdr
+
: see if this is a syswait system
set sys/wait.h i_syswait
eval $inhdr
+: see if this is a ustat.h system
+set ustat.h i_ustat
+eval $inhdr
+
: see if this is an utime system
set utime.h i_utime
eval $inhdr
@@ -11415,8 +14723,6 @@ eval $setvar
echo " "
echo "Looking for extensions..." >&4
-tdir=`pwd`
-cd $rsrc/ext
: If we are using the old config.sh, known_extensions may contain
: old or inaccurate or duplicate values.
known_extensions=''
@@ -11425,30 +14731,35 @@ nonxs_extensions=''
: We do not just use MANIFEST because the user may have dropped
: some additional extensions into the source tree and expect them
: to be built.
-for xxx in * ; do
- case "$xxx" in
- DynaLoader|dynaload) ;;
- *) if $test -f $xxx/$xxx.xs; then
- known_extensions="$known_extensions $xxx"
- elif $test -f $xxx/Makefile.PL; then
- nonxs_extensions="$nonxs_extensions $xxx"
- else
- if $test -d $xxx; then
- # Look for nested extensions, eg. Devel/Dprof.
- cd $xxx
- for yyy in * ; do
- if $test -f $yyy/$yyy.xs; then
- known_extensions="$known_extensions $xxx/$yyy"
- elif $test -f $yyy/Makefile.PL; then
- nonxs_extensions="$nonxs_extensions $xxx/$yyy"
- fi
- done
- cd ..
- fi
- fi
- ;;
- esac
-done
+
+: Function to recursively find available extensions, ignoring DynaLoader
+: NOTE: recursion limit of 10 to prevent runaway in case of symlink madness
+find_extensions='
+ for xxx in *; do
+ case "$xxx" in
+ DynaLoader|dynaload) ;;
+ *)
+ if $test -f $xxx/$xxx.xs; then
+ known_extensions="$known_extensions $1$xxx";
+ elif $test -f $xxx/Makefile.PL; then
+ nonxs_extensions="$nonxs_extensions $1$xxx";
+ else
+ if $test -d $xxx -a $# -lt 10; then
+ set $1$xxx/ $*;
+ cd $xxx;
+ eval $find_extensions;
+ cd ..;
+ shift;
+ fi;
+ fi
+ ;;
+ esac;
+ done'
+tdir=`pwd`
+cd $rsrc/ext
+set X
+shift
+eval $find_extensions
set X $nonxs_extensions
shift
nonxs_extensions="$*"
@@ -11473,12 +14784,30 @@ for xxx in $known_extensions ; do
;;
NDBM_File|ndbm_fil)
case "$i_ndbm" in
- $define) avail_ext="$avail_ext $xxx" ;;
+ $define)
+ case "$osname-$use64bitint" in
+ hpux-define)
+ case "$libs" in
+ *-lndbm*) avail_ext="$avail_ext $xxx" ;;
+ esac
+ ;;
+ *) avail_ext="$avail_ext $xxx" ;;
+ esac
+ ;;
esac
;;
ODBM_File|odbm_fil)
case "${i_dbm}${i_rpcsvcdbm}" in
- *"${define}"*) avail_ext="$avail_ext $xxx" ;;
+ *"${define}"*)
+ case "$osname-$use64bitint" in
+ hpux-define)
+ case "$libs" in
+ *-ldbm*) avail_ext="$avail_ext $xxx" ;;
+ esac
+ ;;
+ *) avail_ext="$avail_ext $xxx" ;;
+ esac
+ ;;
esac
;;
POSIX|posix)
@@ -11685,9 +15014,8 @@ case "$d_portable" in
echo " "
echo "Stripping down executable paths..." >&4
for file in $loclist $trylist; do
- if test X$file != Xln -a X$file != Xar -o X$osname != Xos2; then
- eval $file="\$file"
- fi
+ eval temp=\$$file
+ eval $file=`basename $temp`
done
;;
esac
@@ -11728,16 +15056,21 @@ afs='$afs'
alignbytes='$alignbytes'
ansi2knr='$ansi2knr'
aphostname='$aphostname'
-apiversion='$apiversion'
+api_revision='$api_revision'
+api_subversion='$api_subversion'
+api_version='$api_version'
+api_versionstring='$api_versionstring'
ar='$ar'
archlib='$archlib'
archlibexp='$archlibexp'
+archname64='$archname64'
archname='$archname'
archobjs='$archobjs'
awk='$awk'
baserev='$baserev'
bash='$bash'
bin='$bin'
+bincompat5005='$bincompat5005'
binexp='$binexp'
bison='$bison'
byacc='$byacc'
@@ -11753,6 +15086,7 @@ ccsymbols='$ccsymbols'
cf_by='$cf_by'
cf_email='$cf_email'
cf_time='$cf_time'
+charsize='$charsize'
chgrp='$chgrp'
chmod='$chmod'
chown='$chown'
@@ -11764,22 +15098,39 @@ cp='$cp'
cpio='$cpio'
cpp='$cpp'
cpp_stuff='$cpp_stuff'
+cppccsymbols='$cppccsymbols'
cppflags='$cppflags'
cpplast='$cpplast'
cppminus='$cppminus'
cpprun='$cpprun'
cppstdin='$cppstdin'
cppsymbols='$cppsymbols'
-cppccsymbols='$cppccsymbols'
+crosscompile='$crosscompile'
cryptlib='$cryptlib'
csh='$csh'
d_Gconvert='$d_Gconvert'
+d_PRIEldbl='$d_PRIEldbl'
+d_PRIFldbl='$d_PRIFldbl'
+d_PRIGldbl='$d_PRIGldbl'
+d_PRIX64='$d_PRIX64'
+d_PRId64='$d_PRId64'
+d_PRIeldbl='$d_PRIeldbl'
+d_PRIfldbl='$d_PRIfldbl'
+d_PRIgldbl='$d_PRIgldbl'
+d_PRIi64='$d_PRIi64'
+d_PRIo64='$d_PRIo64'
+d_PRIu64='$d_PRIu64'
+d_PRIx64='$d_PRIx64'
d_access='$d_access'
+d_accessx='$d_accessx'
d_alarm='$d_alarm'
d_archlib='$d_archlib'
+d_atolf='$d_atolf'
+d_atoll='$d_atoll'
d_attribut='$d_attribut'
d_bcmp='$d_bcmp'
d_bcopy='$d_bcopy'
+d_bincompat5005='$d_bincompat5005'
d_bsd='$d_bsd'
d_bsdgetpgrp='$d_bsdgetpgrp'
d_bsdsetpgrp='$d_bsdsetpgrp'
@@ -11802,13 +15153,16 @@ d_dlerror='$d_dlerror'
d_dlopen='$d_dlopen'
d_dlsymun='$d_dlsymun'
d_dosuid='$d_dosuid'
+d_drand48proto='$d_drand48proto'
d_dup2='$d_dup2'
+d_eaccess='$d_eaccess'
d_endgrent='$d_endgrent'
d_endhent='$d_endhent'
d_endnent='$d_endnent'
d_endpent='$d_endpent'
d_endpwent='$d_endpwent'
d_endsent='$d_endsent'
+d_endspent='$d_endspent'
d_eofnblk='$d_eofnblk'
d_eunice='$d_eunice'
d_fchmod='$d_fchmod'
@@ -11822,13 +15176,16 @@ d_flexfnam='$d_flexfnam'
d_flock='$d_flock'
d_fork='$d_fork'
d_fpathconf='$d_fpathconf'
+d_fpos64_t='$d_fpos64_t'
+d_fs_data_s='$d_fs_data_s'
+d_fseeko='$d_fseeko'
d_fsetpos='$d_fsetpos'
d_fstatfs='$d_fstatfs'
-d_statfsflags='$d_statfsflags'
d_fstatvfs='$d_fstatvfs'
-d_getmntent='$d_getmntent'
-d_hasmntopt='$d_hasmntopt'
+d_ftello='$d_ftello'
d_ftime='$d_ftime'
+d_getcwd='$d_getcwd'
+d_getfsstat='$d_getfsstat'
d_getgrent='$d_getgrent'
d_getgrps='$d_getgrps'
d_gethbyaddr='$d_gethbyaddr'
@@ -11837,6 +15194,8 @@ d_gethent='$d_gethent'
d_gethname='$d_gethname'
d_gethostprotos='$d_gethostprotos'
d_getlogin='$d_getlogin'
+d_getmnt='$d_getmnt'
+d_getmntent='$d_getmntent'
d_getnbyaddr='$d_getnbyaddr'
d_getnbyname='$d_getnbyname'
d_getnent='$d_getnent'
@@ -11855,38 +15214,62 @@ d_getsbyname='$d_getsbyname'
d_getsbyport='$d_getsbyport'
d_getsent='$d_getsent'
d_getservprotos='$d_getservprotos'
+d_getspent='$d_getspent'
+d_getspnam='$d_getspnam'
d_gettimeod='$d_gettimeod'
d_gnulibc='$d_gnulibc'
d_grpasswd='$d_grpasswd'
+d_hasmntopt='$d_hasmntopt'
d_htonl='$d_htonl'
+d_iconv='$d_iconv'
d_index='$d_index'
d_inetaton='$d_inetaton'
+d_int64_t='$d_int64_t'
d_isascii='$d_isascii'
d_killpg='$d_killpg'
d_lchown='$d_lchown'
+d_ldbl_dig='$d_ldbl_dig'
d_link='$d_link'
d_locconv='$d_locconv'
d_lockf='$d_lockf'
d_longdbl='$d_longdbl'
d_longlong='$d_longlong'
+d_lseekproto='$d_lseekproto'
d_lstat='$d_lstat'
+d_madvise='$d_madvise'
d_mblen='$d_mblen'
d_mbstowcs='$d_mbstowcs'
d_mbtowc='$d_mbtowc'
+d_memchr='$d_memchr'
d_memcmp='$d_memcmp'
d_memcpy='$d_memcpy'
d_memmove='$d_memmove'
d_memset='$d_memset'
d_mkdir='$d_mkdir'
+d_mkdtemp='$d_mkdtemp'
d_mkfifo='$d_mkfifo'
+d_mkstemp='$d_mkstemp'
+d_mkstemps='$d_mkstemps'
d_mktime='$d_mktime'
+d_mmap='$d_mmap'
+d_mprotect='$d_mprotect'
d_msg='$d_msg'
+d_msg_ctrunc='$d_msg_ctrunc'
+d_msg_dontroute='$d_msg_dontroute'
+d_msg_oob='$d_msg_oob'
+d_msg_peek='$d_msg_peek'
+d_msg_proxy='$d_msg_proxy'
d_msgctl='$d_msgctl'
d_msgget='$d_msgget'
d_msgrcv='$d_msgrcv'
d_msgsnd='$d_msgsnd'
+d_msync='$d_msync'
+d_munmap='$d_munmap'
d_mymalloc='$d_mymalloc'
d_nice='$d_nice'
+d_nv_preserves_uv='$d_nv_preserves_uv'
+d_off64_t='$d_off64_t'
+d_old_pthread_create_joinable='$d_old_pthread_create_joinable'
d_oldpthreads='$d_oldpthreads'
d_oldsock='$d_oldsock'
d_open3='$d_open3'
@@ -11897,15 +15280,16 @@ d_pipe='$d_pipe'
d_poll='$d_poll'
d_portable='$d_portable'
d_pthread_yield='$d_pthread_yield'
-d_pthreads_created_joinable='$d_pthreads_created_joinable'
d_pwage='$d_pwage'
d_pwchange='$d_pwchange'
d_pwclass='$d_pwclass'
d_pwcomment='$d_pwcomment'
d_pwexpire='$d_pwexpire'
d_pwgecos='$d_pwgecos'
-d_pwquota='$d_pwquota'
d_pwpasswd='$d_pwpasswd'
+d_pwquota='$d_pwquota'
+d_qgcvt='$d_qgcvt'
+d_quad='$d_quad'
d_readdir='$d_readdir'
d_readlink='$d_readlink'
d_rename='$d_rename'
@@ -11915,6 +15299,7 @@ d_safebcpy='$d_safebcpy'
d_safemcpy='$d_safemcpy'
d_sanemcmp='$d_sanemcmp'
d_sched_yield='$d_sched_yield'
+d_scm_rights='$d_scm_rights'
d_seekdir='$d_seekdir'
d_select='$d_select'
d_sem='$d_sem'
@@ -11945,6 +15330,7 @@ d_setrgid='$d_setrgid'
d_setruid='$d_setruid'
d_setsent='$d_setsent'
d_setsid='$d_setsid'
+d_setspent='$d_setspent'
d_setvbuf='$d_setvbuf'
d_sfio='$d_sfio'
d_shm='$d_shm'
@@ -11956,10 +15342,16 @@ d_shmget='$d_shmget'
d_sigaction='$d_sigaction'
d_sigsetjmp='$d_sigsetjmp'
d_socket='$d_socket'
+d_socklen_t='$d_socklen_t'
d_sockpair='$d_sockpair'
+d_sqrtl='$d_sqrtl'
d_statblks='$d_statblks'
+d_statfs_f_flags='$d_statfs_f_flags'
+d_statfs_s='$d_statfs_s'
+d_statvfs='$d_statvfs'
d_stdio_cnt_lval='$d_stdio_cnt_lval'
d_stdio_ptr_lval='$d_stdio_ptr_lval'
+d_stdio_stream_array='$d_stdio_stream_array'
d_stdiobase='$d_stdiobase'
d_stdstdio='$d_stdstdio'
d_strchr='$d_strchr'
@@ -11969,7 +15361,11 @@ d_strerrm='$d_strerrm'
d_strerror='$d_strerror'
d_strtod='$d_strtod'
d_strtol='$d_strtol'
+d_strtold='$d_strtold'
+d_strtoll='$d_strtoll'
d_strtoul='$d_strtoul'
+d_strtoull='$d_strtoull'
+d_strtouq='$d_strtouq'
d_strxfrm='$d_strxfrm'
d_suidsafe='$d_suidsafe'
d_symlink='$d_symlink'
@@ -11981,6 +15377,7 @@ d_system='$d_system'
d_tcgetpgrp='$d_tcgetpgrp'
d_tcsetpgrp='$d_tcsetpgrp'
d_telldir='$d_telldir'
+d_telldirproto='$d_telldirproto'
d_time='$d_time'
d_times='$d_times'
d_truncate='$d_truncate'
@@ -11988,6 +15385,10 @@ d_tzname='$d_tzname'
d_umask='$d_umask'
d_uname='$d_uname'
d_union_semun='$d_union_semun'
+d_ustat='$d_ustat'
+d_vendorarch='$d_vendorarch'
+d_vendorbin='$d_vendorbin'
+d_vendorlib='$d_vendorlib'
d_vfork='$d_vfork'
d_void_closedir='$d_void_closedir'
d_voidsig='$d_voidsig'
@@ -12007,6 +15408,7 @@ direntrytype='$direntrytype'
dlext='$dlext'
dlsrc='$dlsrc'
doublesize='$doublesize'
+drand01='$drand01'
dynamic_ext='$dynamic_ext'
eagain='$eagain'
ebcdic='$ebcdic'
@@ -12017,15 +15419,21 @@ eunicefix='$eunicefix'
exe_ext='$exe_ext'
expr='$expr'
extensions='$extensions'
+fflushNULL='$fflushNULL'
+fflushall='$fflushall'
find='$find'
firstmakefile='$firstmakefile'
flex='$flex'
+fpossize='$fpossize'
fpostype='$fpostype'
freetype='$freetype'
full_ar='$full_ar'
full_csh='$full_csh'
full_sed='$full_sed'
gccversion='$gccversion'
+gidformat='$gidformat'
+gidsign='$gidsign'
+gidsize='$gidsize'
gidtype='$gidtype'
glibpth='$glibpth'
grep='$grep'
@@ -12037,6 +15445,14 @@ h_sysfile='$h_sysfile'
hint='$hint'
hostcat='$hostcat'
huge='$huge'
+i16size='$i16size'
+i16type='$i16type'
+i32size='$i32size'
+i32type='$i32type'
+i64size='$i64size'
+i64type='$i64type'
+i8size='$i8size'
+i8type='$i8type'
i_arpainet='$i_arpainet'
i_bsdioctl='$i_bsdioctl'
i_db='$i_db'
@@ -12048,79 +15464,114 @@ i_fcntl='$i_fcntl'
i_float='$i_float'
i_gdbm='$i_gdbm'
i_grp='$i_grp'
+i_iconv='$i_iconv'
+i_ieeefp='$i_ieeefp'
+i_inttypes='$i_inttypes'
i_limits='$i_limits'
i_locale='$i_locale'
+i_machcthr='$i_machcthr'
i_malloc='$i_malloc'
-i_machcthreads='$i_machcthreads'
i_math='$i_math'
i_memory='$i_memory'
i_mntent='$i_mntent'
i_ndbm='$i_ndbm'
i_netdb='$i_netdb'
i_neterrno='$i_neterrno'
+i_netinettcp='$i_netinettcp'
i_niin='$i_niin'
-i_pwd='$i_pwd'
+i_poll='$i_poll'
i_pthread='$i_pthread'
+i_pwd='$i_pwd'
i_rpcsvcdbm='$i_rpcsvcdbm'
i_sfio='$i_sfio'
i_sgtty='$i_sgtty'
+i_shadow='$i_shadow'
+i_socks='$i_socks'
i_stdarg='$i_stdarg'
i_stddef='$i_stddef'
i_stdlib='$i_stdlib'
i_string='$i_string'
+i_sunmath='$i_sunmath'
+i_sysaccess='$i_sysaccess'
i_sysdir='$i_sysdir'
i_sysfile='$i_sysfile'
i_sysfilio='$i_sysfilio'
i_sysin='$i_sysin'
i_sysioctl='$i_sysioctl'
+i_syslog='$i_syslog'
+i_sysmman='$i_sysmman'
+i_sysmode='$i_sysmode'
i_sysmount='$i_sysmount'
i_sysndir='$i_sysndir'
i_sysparam='$i_sysparam'
i_sysresrc='$i_sysresrc'
+i_syssecrt='$i_syssecrt'
i_sysselct='$i_sysselct'
i_syssockio='$i_syssockio'
i_sysstat='$i_sysstat'
+i_sysstatfs='$i_sysstatfs'
i_sysstatvfs='$i_sysstatvfs'
i_systime='$i_systime'
i_systimek='$i_systimek'
i_systimes='$i_systimes'
i_systypes='$i_systypes'
+i_sysuio='$i_sysuio'
i_sysun='$i_sysun'
+i_sysutsname='$i_sysutsname'
+i_sysvfs='$i_sysvfs'
i_syswait='$i_syswait'
i_termio='$i_termio'
i_termios='$i_termios'
i_time='$i_time'
i_unistd='$i_unistd'
+i_ustat='$i_ustat'
i_utime='$i_utime'
i_values='$i_values'
i_varargs='$i_varargs'
i_varhdr='$i_varhdr'
i_vfork='$i_vfork'
ignore_versioned_solibs='$ignore_versioned_solibs'
+inc_version_list='$inc_version_list'
+inc_version_list_init='$inc_version_list_init'
incpath='$incpath'
inews='$inews'
installarchlib='$installarchlib'
installbin='$installbin'
installman1dir='$installman1dir'
installman3dir='$installman3dir'
+installprefix='$installprefix'
+installprefixexp='$installprefixexp'
installprivlib='$installprivlib'
installscript='$installscript'
installsitearch='$installsitearch'
+installsitebin='$installsitebin'
installsitelib='$installsitelib'
+installstyle='$installstyle'
installusrbinperl='$installusrbinperl'
+installvendorarch='$installvendorarch'
+installvendorbin='$installvendorbin'
+installvendorlib='$installvendorlib'
intsize='$intsize'
+ivdformat='$ivdformat'
+ivsize='$ivsize'
+ivtype='$ivtype'
known_extensions='$known_extensions'
ksh='$ksh'
large='$large'
ld='$ld'
lddlflags='$lddlflags'
ldflags='$ldflags'
+ldlibpthname='$ldlibpthname'
less='$less'
lib_ext='$lib_ext'
libc='$libc'
libperl='$libperl'
libpth='$libpth'
libs='$libs'
+libsdirs='$libsdirs'
+libsfiles='$libsfiles'
+libsfound='$libsfound'
+libspath='$libspath'
libswanted='$libswanted'
line='$line'
lint='$lint'
@@ -12135,6 +15586,7 @@ longsize='$longsize'
lp='$lp'
lpr='$lpr'
ls='$ls'
+lseeksize='$lseeksize'
lseektype='$lseektype'
mail='$mail'
mailx='$mailx'
@@ -12150,12 +15602,13 @@ man3dir='$man3dir'
man3direxp='$man3direxp'
man3ext='$man3ext'
medium='$medium'
-mips='$mips'
mips_type='$mips_type'
mkdir='$mkdir'
+mmaptype='$mmaptype'
models='$models'
modetype='$modetype'
more='$more'
+multiarch='$multiarch'
mv='$mv'
myarchname='$myarchname'
mydomain='$mydomain'
@@ -12171,8 +15624,11 @@ nm_opt='$nm_opt'
nm_so_opt='$nm_so_opt'
nonxs_ext='$nonxs_ext'
nroff='$nroff'
+nvsize='$nvsize'
+nvtype='$nvtype'
o_nonblock='$o_nonblock'
obj_ext='$obj_ext'
+old_pthread_create_joinable='$old_pthread_create_joinable'
optimize='$optimize'
orderlib='$orderlib'
osname='$osname'
@@ -12182,6 +15638,7 @@ pager='$pager'
passcat='$passcat'
patchlevel='$patchlevel'
path_sep='$path_sep'
+perl5='$perl5'
perl='$perl'
perladmin='$perladmin'
perlpath='$perlpath'
@@ -12189,6 +15646,7 @@ pg='$pg'
phostname='$phostname'
pidtype='$pidtype'
plibpth='$plibpth'
+pm_apiversion='$pm_apiversion'
pmake='$pmake'
pr='$pr'
prefix='$prefix'
@@ -12197,15 +15655,34 @@ privlib='$privlib'
privlibexp='$privlibexp'
prototype='$prototype'
ptrsize='$ptrsize'
+quadkind='$quadkind'
+quadtype='$quadtype'
randbits='$randbits'
+randfunc='$randfunc'
+randseedtype='$randseedtype'
ranlib='$ranlib'
rd_nodata='$rd_nodata'
+revision='$revision'
rm='$rm'
rmail='$rmail'
runnm='$runnm'
+sPRIEldbl='$sPRIEldbl'
+sPRIFldbl='$sPRIFldbl'
+sPRIGldbl='$sPRIGldbl'
+sPRIX64='$sPRIX64'
+sPRId64='$sPRId64'
+sPRIeldbl='$sPRIeldbl'
+sPRIfldbl='$sPRIfldbl'
+sPRIgldbl='$sPRIgldbl'
+sPRIi64='$sPRIi64'
+sPRIo64='$sPRIo64'
+sPRIu64='$sPRIu64'
+sPRIx64='$sPRIx64'
+sched_yield='$sched_yield'
scriptdir='$scriptdir'
scriptdirexp='$scriptdirexp'
sed='$sed'
+seedfunc='$seedfunc'
selectminbits='$selectminbits'
selecttype='$selecttype'
sendmail='$sendmail'
@@ -12216,6 +15693,7 @@ shmattype='$shmattype'
shortsize='$shortsize'
shrpenv='$shrpenv'
shsharp='$shsharp'
+sig_count='$sig_count'
sig_name='$sig_name'
sig_name_init='$sig_name_init'
sig_num='$sig_num'
@@ -12223,8 +15701,14 @@ sig_num_init='$sig_num_init'
signal_t='$signal_t'
sitearch='$sitearch'
sitearchexp='$sitearchexp'
+sitebin='$sitebin'
+sitebinexp='$sitebinexp'
sitelib='$sitelib'
+sitelib_stem='$sitelib_stem'
sitelibexp='$sitelibexp'
+siteprefix='$siteprefix'
+siteprefixexp='$siteprefixexp'
+sizesize='$sizesize'
sizetype='$sizetype'
sleep='$sleep'
smail='$smail'
@@ -12232,6 +15716,7 @@ small='$small'
so='$so'
sockethdr='$sockethdr'
socketlib='$socketlib'
+socksizetype='$socksizetype'
sort='$sort'
spackage='$spackage'
spitshell='$spitshell'
@@ -12247,6 +15732,7 @@ stdio_bufsiz='$stdio_bufsiz'
stdio_cnt='$stdio_cnt'
stdio_filbuf='$stdio_filbuf'
stdio_ptr='$stdio_ptr'
+stdio_stream_array='$stdio_stream_array'
strings='$strings'
submit='$submit'
subversion='$subversion'
@@ -12262,10 +15748,30 @@ touch='$touch'
tr='$tr'
trnl='$trnl'
troff='$troff'
+u16size='$u16size'
+u16type='$u16type'
+u32size='$u32size'
+u32type='$u32type'
+u64size='$u64size'
+u64type='$u64type'
+u8size='$u8size'
+u8type='$u8type'
+uidformat='$uidformat'
+uidsign='$uidsign'
+uidsize='$uidsize'
uidtype='$uidtype'
uname='$uname'
uniq='$uniq'
+uquadtype='$uquadtype'
+use5005threads='$use5005threads'
+use64bitall='$use64bitall'
+use64bitint='$use64bitint'
usedl='$usedl'
+useithreads='$useithreads'
+uselargefiles='$uselargefiles'
+uselongdouble='$uselongdouble'
+usemorebits='$usemorebits'
+usemultiplicity='$usemultiplicity'
usemymalloc='$usemymalloc'
usenm='$usenm'
useopcode='$useopcode'
@@ -12273,14 +15779,31 @@ useperlio='$useperlio'
useposix='$useposix'
usesfio='$usesfio'
useshrplib='$useshrplib'
+usesocks='$usesocks'
usethreads='$usethreads'
+usevendorprefix='$usevendorprefix'
usevfork='$usevfork'
usrinc='$usrinc'
uuname='$uuname'
+uvoformat='$uvoformat'
+uvsize='$uvsize'
+uvtype='$uvtype'
+uvuformat='$uvuformat'
+uvxformat='$uvxformat'
+vendorarch='$vendorarch'
+vendorarchexp='$vendorarchexp'
+vendorbin='$vendorbin'
+vendorbinexp='$vendorbinexp'
+vendorlib='$vendorlib'
+vendorlib_stem='$vendorlib_stem'
+vendorlibexp='$vendorlibexp'
+vendorprefix='$vendorprefix'
+vendorprefixexp='$vendorprefixexp'
version='$version'
vi='$vi'
voidflags='$voidflags'
xlibpth='$xlibpth'
+xs_apiversion='$xs_apiversion'
zcat='$zcat'
zip='$zip'
EOT
@@ -12290,8 +15813,8 @@ $test -f UU/cmdline.opt && $cat UU/cmdline.opt >> config.sh
: add special variables
$test -f $src/patchlevel.h && \
-awk '/^#define/ {printf "%s=%s\n",$2,$3}' $src/patchlevel.h >>config.sh
-echo "CONFIG=true" >>config.sh
+awk '/^#define[ ]+PERL_/ {printf "%s=%s\n",$2,$3}' $src/patchlevel.h >>config.sh
+echo "CONFIGDOTSH=true" >>config.sh
: propagate old symbols
if $test -f UU/config.sh; then
@@ -12360,26 +15883,26 @@ if $contains '^depend:' [Mm]akefile >/dev/null 2>&1; then
*)
$cat <<EOM
-Now you need to generate make dependencies by running "make depend".
-You might prefer to run it in background: "make depend > makedepend.out &"
+Now you need to generate make dependencies by running "$make depend".
+You might prefer to run it in background: "$make depend > makedepend.out &"
It can take a while, so you might not want to run it right now.
EOM
;;
esac
- rp="Run make depend now?"
+ rp="Run $make depend now?"
. UU/myread
case "$ans" in
y*)
- make depend && echo "Now you must run a make."
+ $make depend && echo "Now you must run a $make."
;;
*)
- echo "You must run 'make depend' then 'make'."
+ echo "You must run '$make depend' then '$make'."
;;
esac
elif test -f [Mm]akefile; then
echo " "
- echo "Now you must run a make."
+ echo "Now you must run a $make."
else
echo "Done."
fi
diff --git a/contrib/perl5/EXTERN.h b/contrib/perl5/EXTERN.h
index 66aeb9f..897fae6 100644
--- a/contrib/perl5/EXTERN.h
+++ b/contrib/perl5/EXTERN.h
@@ -1,6 +1,6 @@
/* EXTERN.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -27,7 +27,7 @@
# define EXTCONST globalref
# define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
#else
-# if defined(WIN32) && !defined(PERL_STATIC_SYMS) && !defined(__GNUC__) && !defined(PERL_OBJECT)
+# if defined(WIN32) && !defined(PERL_STATIC_SYMS) && !defined(PERL_OBJECT)
# ifdef PERLDLL
# define EXT extern __declspec(dllexport)
# define dEXT
@@ -40,10 +40,17 @@
# define dEXTCONST const
# endif
# else
-# define EXT extern
-# define dEXT
-# define EXTCONST extern const
-# define dEXTCONST const
+# if defined(__CYGWIN__) && defined(USEIMPORTLIB)
+# define EXT extern __declspec(dllimport)
+# define dEXT
+# define EXTCONST extern __declspec(dllimport) const
+# define dEXTCONST const
+# else
+# define EXT extern
+# define dEXT
+# define EXTCONST extern const
+# define dEXTCONST const
+# endif
# endif
#endif
diff --git a/contrib/perl5/INSTALL b/contrib/perl5/INSTALL
index c5e04cb..552c870 100644
--- a/contrib/perl5/INSTALL
+++ b/contrib/perl5/INSTALL
@@ -4,10 +4,15 @@ Install - Build and Installation guide for perl5.
=head1 SYNOPSIS
-The basic steps to build and install perl5 on a Unix system are:
+First, make sure you are installing an up-to-date version of Perl. If
+you didn't get your Perl source from CPAN, check the latest version at
+<URL:http://www.perl.com/CPAN/src/>.
+
+The basic steps to build and install perl5 on a Unix system
+with all the defaults are:
rm -f config.sh Policy.sh
- sh Configure
+ sh Configure -de
make
make test
make install
@@ -19,9 +24,21 @@ The basic steps to build and install perl5 on a Unix system are:
Each of these is explained in further detail below.
+The above commands will install Perl to /usr/local or /opt, depending
+on the platform. If that's not okay with you, use
+
+ rm -f config.sh Policy.sh
+ sh Configure
+ make
+ make test
+ make install
+
For information on non-Unix systems, see the section on
L<"Porting information"> below.
+If you have problems, corrections, or questions, please see
+L<"Reporting Problems"> below.
+
For information on what's new in this release, see the
pod/perldelta.pod file. For more detailed information about specific
changes, see the Changes file.
@@ -37,7 +54,8 @@ by lines beginning with '='. The other mark-up used is
C<code> literal code
L<name> A link (cross reference) to name
-You should probably at least skim through this entire document before
+Although most of the defaults are probably fine for most users,
+you should probably at least skim through this entire document before
proceeding.
If you're building Perl on a non-Unix system, you should also read
@@ -46,34 +64,63 @@ provide additional or different instructions for building Perl.
If there is a hint file for your system (in the hints/ directory) you
should also read that hint file for specific information for your
-system. (Unixware users should use the svr4.sh hint file.)
+system. (Unixware users should use the svr4.sh hint file.) If
+there is a README file for your platform, then you should read
+that too. Additional information is in the Porting/ directory.
+
+=head1 WARNING: This version requires an extra step to build old extensions.
-=head1 WARNING: This version is not binary compatible with Perl 5.004.
+5.005_53 and later releases do not export unadorned
+global symbols anymore. This means you may need to build older
+extensions that have not been updated for the new naming convention
+with:
-Starting with Perl 5.004_50 there were many deep and far-reaching changes
-to the language internals. If you have dynamically loaded extensions
-that you built under perl 5.003 or 5.004, you can continue to use them
-with 5.004, but you will need to rebuild and reinstall those extensions
-to use them 5.005. See the discussions below on
+ perl Makefile.PL POLLUTE=1
+
+Alternatively, you can enable CPP symbol pollution wholesale by
+building perl itself with:
+
+ sh Configure -Accflags=-DPERL_POLLUTE
+
+pod/perldelta.pod contains more details about this.
+
+=head1 WARNING: This version may not be binary compatible with Perl 5.005.
+
+Using the default Configure options for building perl should get you
+a perl that will be binary compatible with the 5.005 release.
+
+However, if you run Configure with any custom options, such as
+-Dusethreads, -Dusemultiplicity, -Dusemymalloc, -Ubincompat5005 etc.,
+the resulting perl will not be binary compatible. Under these
+circumstances, if you have dynamically loaded extensions that were
+built under perl 5.005, you will need to rebuild and reinstall all
+those extensions to use them with 5.6.
+
+Pure perl modules without XS or C code should continue to work fine
+without reinstallation. See the discussions below on
L<"Coexistence with earlier versions of perl5"> and
-L<"Upgrading from 5.004 to 5.005"> for more details.
+L<"Upgrading from 5.005 to 5.6"> for more details.
The standard extensions supplied with Perl will be handled automatically.
-In a related issue, old extensions may possibly be affected by the
+On a related issue, old modules may possibly be affected by the
changes in the Perl language in the current release. Please see
-pod/perldelta.pod for a description of what's changed.
+pod/perldelta.pod (and pod/perl500Xdelta.pod) for a description of
+what's changed. See your installed copy of the perllocal.pod
+file for a (possibly incomplete) list of locally installed modules.
+Also see CPAN::autobundle for one way to make a "bundle" of your
+currently installed modules.
=head1 WARNING: This version requires a compiler that supports ANSI C.
If you find that your C compiler is not ANSI-capable, try obtaining
GCC, available from GNU mirrors worldwide (e.g. ftp://ftp.gnu.org/pub/gnu).
-Another alternative may be to use a tool like C<ansi2knr> to convert the
+Another alternative may be to use a tool like ansi2knr to convert the
sources back to K&R style, but there is no guarantee this route will get
you anywhere, since the prototypes are not the only ANSI features used
-in the Perl sources. C<ansi2knr> is usually found as part of the freely
-available C<Ghostscript> distribution. Another similar tool is
-C<unprotoize>, distributed with GCC. Since C<unprotoize> requires GCC to
+in the Perl sources. ansi2knr is usually found as part of the freely
+available Ghostscript distribution. Another similar tool is
+unprotoize, distributed with GCC. Since unprotoize requires GCC to
run, you may have to run it on a platform where GCC is available, and move
the sources back to the platform without GCC.
@@ -81,12 +128,15 @@ If you succeed in automatically converting the sources to a K&R compatible
form, be sure to email perlbug@perl.com to let us know the steps you
followed. This will enable us to officially support this option.
+Although Perl can be compiled using a C++ compiler, the Configure script
+does not work with some C++ compilers.
+
=head1 Space Requirements
-The complete perl5 source tree takes up about 10 MB of disk space. The
-complete tree after completing make takes roughly 20 MB, though the
-actual total is likely to be quite system-dependent. The installation
-directories need something on the order of 10 MB, though again that
+The complete perl5 source tree takes up about 20 MB of disk space.
+After completing make, it takes up roughly 30 MB, though the actual
+total is likely to be quite system-dependent. The installation
+directories need something on the order of 20 MB, though again that
value is system-dependent.
=head1 Start with a Fresh Distribution
@@ -107,9 +157,9 @@ The results of a Configure run are stored in the config.sh and Policy.sh
files. If you are upgrading from a previous version of perl, or if you
change systems or compilers or make other significant changes, or if
you are experiencing difficulties building perl, you should probably
-not re-use your old config.sh. Simply remove it or rename it, e.g.
+not re-use your old config.sh. Simply remove it
- mv config.sh config.sh.old
+ rm -f config.sh
If you wish to use your old config.sh, be especially attentive to the
version and architecture-specific questions and answers. For example,
@@ -121,76 +171,120 @@ probably check and correct for this, but it doesn't, presently.
Similarly, if you used a shared libperl.so (see below) with version
numbers, you will probably want to adjust them as well.
-Also, be careful to check your architecture name. Some Linux systems
-(such as Debian) use i386, while others may use i486, i586, or i686.
-If you pick up a precompiled binary, it might not use the same name.
+Also, be careful to check your architecture name. For example, some
+Linux distributions use i386, while others may use i486. If you build
+it yourself, Configure uses the output of the arch command, which
+might be i586 or i686 instead. If you pick up a precompiled binary, or
+compile extensions on different systems, they might not all agree on
+the architecture name.
In short, if you wish to use your old config.sh, I recommend running
Configure interactively rather than blindly accepting the defaults.
-If your reason to reuse your old config.sh is to save your
-particular installation choices, then you can probably achieve the
-same effect by using the new Policy.sh file. See the section on
-L<"Site-wide Policy settings"> below.
+If your reason to reuse your old config.sh is to save your particular
+installation choices, then you can probably achieve the same effect by
+using the Policy.sh file. See the section on L<"Site-wide Policy
+settings"> below. If you wish to start with a fresh distribution, you
+also need to remove any old Policy.sh files you may have with
+
+ rm -f Policy.sh
=head1 Run Configure
Configure will figure out various things about your system. Some
things Configure will figure out for itself, other things it will ask
-you about. To accept the default, just press RETURN. The default
-is almost always okay. At any Configure prompt, you can type &-d
-and Configure will use the defaults from then on.
+you about. To accept the default, just press RETURN. The default is
+almost always okay. It is normal for some things to be "NOT found",
+since Configure often searches for many different ways of performing
+the same function.
+
+At any Configure prompt, you can type &-d and Configure will use the
+defaults from then on.
After it runs, Configure will perform variable substitution on all the
*.SH files and offer to run make depend.
+=head2 Altering config.sh variables for C compiler switches etc.
+
+For most users, all of the Configure defaults are fine. Configure
+also has several convenient options which are all described below.
+However, if Configure doesn't have an option to do what you want,
+you can change Configure variables after the platform hints have been
+run, by using Configure's -A switch. For example, here's how to add
+a couple of extra flags to C compiler invocations:
+
+ sh Configure -Accflags="-DPERL_Y2KWARN -DPERL_POLLUTE_MALLOC"
+
+For more help on Configure switches, run:
+
+ sh Configure -h
+
+=head2 Common Configure options
+
Configure supports a number of useful options. Run B<Configure -h> to
get a listing. See the Porting/Glossary file for a complete list of
Configure variables you can set and their definitions.
-To compile with gcc, for example, you should run
+=over 4
+
+=item gcc
+
+To compile with gcc you should run
sh Configure -Dcc=gcc
This is the preferred way to specify gcc (or another alternative
compiler) so that the hints files can set appropriate defaults.
-If you want to use your old config.sh but override some of the items
-with command line options, you need to use B<Configure -O>.
+=item Installation prefix
By default, for most systems, perl will be installed in
-/usr/local/{bin, lib, man}. You can specify a different 'prefix' for
-the default installation directory, when Configure prompts you or by
-using the Configure command line option -Dprefix='/some/directory',
-e.g.
+/usr/local/{bin, lib, man}. (See L<"Installation Directories">
+and L<"Coexistence with earlier versions of perl5"> below for
+further details.)
+
+You can specify a different 'prefix' for the default installation
+directory, when Configure prompts you or by using the Configure command
+line option -Dprefix='/some/directory', e.g.
sh Configure -Dprefix=/opt/perl
-If your prefix contains the string "perl", then the directories
-are simplified. For example, if you use prefix=/opt/perl,
-then Configure will suggest /opt/perl/lib instead of
-/opt/perl/lib/perl5/.
+If your prefix contains the string "perl", then the suggested
+directory structure is simplified. For example, if you use
+prefix=/opt/perl, then Configure will suggest /opt/perl/lib instead of
+/opt/perl/lib/perl5/. Again, see L<"Installation Directories"> below
+for more details.
+
+NOTE: You must not specify an installation directory that is the same
+as or below your perl source directory. If you do, installperl will
+attempt infinite recursion.
-NOTE: You must not specify an installation directory that is below
-your perl source directory. If you do, installperl will attempt
-infinite recursion.
+=item /usr/bin/perl
-It may seem obvious to say, but Perl is useful only when users can
-easily find it. It's often a good idea to have both /usr/bin/perl and
+It may seem obvious, but Perl is useful only when users can easily
+find it. It's often a good idea to have both /usr/bin/perl and
/usr/local/bin/perl be symlinks to the actual binary. Be especially
-careful, however, of overwriting a version of perl supplied by your
-vendor. In any case, system administrators are strongly encouraged to
+careful, however, not to overwrite a version of perl supplied by your
+vendor unless you are sure you know what you are doing.
+
+By default, Configure will arrange for /usr/bin/perl to be linked to
+the current version of perl. You can turn off that behavior by running
+
+ Configure -Uinstallusrbinperl
+
+or by answering 'no' to the appropriate Configure prompt.
+
+In any case, system administrators are strongly encouraged to
put (symlinks to) perl and its accompanying utilities, such as perldoc,
into a directory typically found along a user's PATH, or in another
obvious and convenient place.
-You can use "Configure -Uinstallusrbinperl" which causes installperl
-to skip installing perl also as /usr/bin/perl.
+=item Overriding an old config.sh
-By default, Configure will compile perl to use dynamic loading if
-your system supports it. If you want to force perl to be compiled
-statically, you can either choose this when Configure prompts you or
-you can use the Configure command line option -Uusedl.
+If you want to use your old config.sh but override some of the items
+with command line options, you need to use B<Configure -O>.
+
+=back
If you are willing to accept all the defaults, and you want terse
output, you can run
@@ -215,236 +309,217 @@ options. Try
for a listing.
-Cross compiling is not supported.
+Cross compiling and compiling in a different directory are not supported.
(The file is called configure.gnu to avoid problems on systems
that would not distinguish the files "Configure" and "configure".)
-=head2 Extensions
-
-By default, Configure will offer to build every extension which appears
-to be supported. For example, Configure will offer to build GDBM_File
-only if it is able to find the gdbm library. (See examples below.)
-B, DynaLoader, Fcntl, IO, and attrs are always built by default.
-Configure does not contain code to test for POSIX compliance, so POSIX
-is always built by default as well. If you wish to skip POSIX, you can
-set the Configure variable useposix=false either in a hint file or from
-the Configure command line. Similarly, the Opcode extension is always
-built by default, but you can skip it by setting the Configure variable
-useopcode=false either in a hint file for from the command line.
-
-You can learn more about each of these extensions by consulting the
-documentation in the individual .pm modules, located under the
-ext/ subdirectory.
-
-Even if you do not have dynamic loading, you must still build the
-DynaLoader extension; you should just build the stub dl_none.xs
-version. (Configure will suggest this as the default.)
-
-In summary, here are the Configure command-line variables you can set
-to turn off each extension:
-
- B (Always included by default)
- DB_File i_db
- DynaLoader (Must always be included as a static extension)
- Fcntl (Always included by default)
- GDBM_File i_gdbm
- IO (Always included by default)
- NDBM_File i_ndbm
- ODBM_File i_dbm
- POSIX useposix
- SDBM_File (Always included by default)
- Opcode useopcode
- Socket d_socket
- Threads usethreads
- attrs (Always included by default)
-
-Thus to skip the NDBM_File extension, you can use
-
- sh Configure -Ui_ndbm
-
-Again, this is taken care of automatically if you don't have the ndbm
-library.
-
-Of course, you may always run Configure interactively and select only
-the extensions you want.
-
-Note: The DB_File module will only work with version 1.x of Berkeley
-DB or newer releases of version 2. Configure will automatically detect
-this for you and refuse to try to build DB_File with version 2.
-
-If you re-use your old config.sh but change your system (e.g. by
-adding libgdbm) Configure will still offer your old choices of extensions
-for the default answer, but it will also point out the discrepancy to
-you.
-
-Finally, if you have dynamic loading (most modern Unix systems do)
-remember that these extensions do not increase the size of your perl
-executable, nor do they impact start-up time, so you probably might as
-well build all the ones that will work on your system.
-
-=head2 Including locally-installed libraries
-
-Perl5 comes with interfaces to number of database extensions, including
-dbm, ndbm, gdbm, and Berkeley db. For each extension, if
-Configure can find the appropriate header files and libraries, it will
-automatically include that extension. The gdbm and db libraries
-are not included with perl. See the library documentation for
-how to obtain the libraries.
-
-Note: If your database header (.h) files are not in a
-directory normally searched by your C compiler, then you will need to
-include the appropriate -I/your/directory option when prompted by
-Configure. If your database library (.a) files are not in a directory
-normally searched by your C compiler and linker, then you will need to
-include the appropriate -L/your/directory option when prompted by
-Configure. See the examples below.
-
-=head2 Examples
-
-=over 4
-
-=item gdbm in /usr/local
-
-Suppose you have gdbm and want Configure to find it and build the
-GDBM_File extension. This examples assumes you have gdbm.h
-installed in /usr/local/include/gdbm.h and libgdbm.a installed in
-/usr/local/lib/libgdbm.a. Configure should figure all the
-necessary steps out automatically.
-
-Specifically, when Configure prompts you for flags for
-your C compiler, you should include -I/usr/local/include.
-
-When Configure prompts you for linker flags, you should include
--L/usr/local/lib.
-
-If you are using dynamic loading, then when Configure prompts you for
-linker flags for dynamic loading, you should again include
--L/usr/local/lib.
-
-Again, this should all happen automatically. If you want to accept the
-defaults for all the questions and have Configure print out only terse
-messages, then you can just run
-
- sh Configure -des
-
-and Configure should include the GDBM_File extension automatically.
-
-This should actually work if you have gdbm installed in any of
-(/usr/local, /opt/local, /usr/gnu, /opt/gnu, /usr/GNU, or /opt/GNU).
-
-=item gdbm in /usr/you
-
-Suppose you have gdbm installed in some place other than /usr/local/,
-but you still want Configure to find it. To be specific, assume you
-have /usr/you/include/gdbm.h and /usr/you/lib/libgdbm.a. You
-still have to add -I/usr/you/include to cc flags, but you have to take
-an extra step to help Configure find libgdbm.a. Specifically, when
-Configure prompts you for library directories, you have to add
-/usr/you/lib to the list.
-
-It is possible to specify this from the command line too (all on one
-line):
-
- sh Configure -des \
- -Dlocincpth="/usr/you/include" \
- -Dloclibpth="/usr/you/lib"
-
-locincpth is a space-separated list of include directories to search.
-Configure will automatically add the appropriate -I directives.
-
-loclibpth is a space-separated list of library directories to search.
-Configure will automatically add the appropriate -L directives. If
-you have some libraries under /usr/local/ and others under
-/usr/you, then you have to include both, namely
-
- sh Configure -des \
- -Dlocincpth="/usr/you/include /usr/local/include" \
- -Dloclibpth="/usr/you/lib /usr/local/lib"
-
-=back
-
=head2 Installation Directories
The installation directories can all be changed by answering the
appropriate questions in Configure. For convenience, all the
installation questions are near the beginning of Configure.
+Further, there are a number of additions to the installation
+directories since 5.005, so reusing your old config.sh may not
+be sufficient to put everything where you want it.
I highly recommend running Configure interactively to be sure it puts
everything where you want it. At any point during the Configure
-process, you can answer a question with &-d and Configure
-will use the defaults from then on.
+process, you can answer a question with &-d and Configure will use
+the defaults from then on.
-By default, Configure will use the following directories for library files
-for 5.005 (archname is a string like sun4-sunos, determined by Configure).
+The defaults are intended to be reasonable and sensible for most
+people building from sources. Those who build and distribute binary
+distributions or who export perl to a range of systems will probably
+need to alter them. If you are content to just accept the defaults,
+you can safely skip the next section.
- Configure variable Default value
- $archlib /usr/local/lib/perl5/5.005/archname
- $privlib /usr/local/lib/perl5/5.005
- $sitearch /usr/local/lib/perl5/site_perl/5.005/archname
- $sitelib /usr/local/lib/perl5/site_perl/5.005
+The directories set up by Configure fall into three broad categories.
-Some users prefer to append a "/share" to $privlib and $sitelib
-to emphasize that those directories can be shared among different
-architectures.
-
-By default, Configure will use the following directories for manual pages:
-
- Configure variable Default value
- $man1dir /usr/local/man/man1
- $man3dir /usr/local/lib/perl5/man/man3
+=over 4
-(Actually, Configure recognizes the SVR3-style
+=item Directories for the perl distribution
+
+By default, Configure will use the following directories for 5.6.0.
+$version is the full perl version number, including subversion, e.g.
+5.6.0 or 5.6.1, and $archname is a string like sun4-sunos,
+determined by Configure. The full definitions of all Configure
+variables are in the file Porting/Glossary.
+
+ Configure variable Default value
+ $prefix /usr/local
+ $bin $prefix/bin
+ $scriptdir $prefix/bin
+ $privlib $prefix/lib/perl5/$version
+ $archlib $prefix/lib/perl5/$version/$archname
+ $man1dir $prefix/man/man1
+ $man3dir $prefix/man/man3
+ $html1dir (none)
+ $html3dir (none)
+
+Actually, Configure recognizes the SVR3-style
/usr/local/man/l_man/man1 directories, if present, and uses those
-instead.)
-
-The module man pages are stuck in that strange spot so that
-they don't collide with other man pages stored in /usr/local/man/man3,
-and so that Perl's man pages don't hide system man pages. On some
-systems, B<man less> would end up calling up Perl's less.pm module man
-page, rather than the less program. (This default location will likely
-change to /usr/local/man/man3 in a future release of perl.)
-
-Note: Many users prefer to store the module man pages in
-/usr/local/man/man3. You can do this from the command line with
-
- sh Configure -Dman3dir=/usr/local/man/man3
+instead. Also, if $prefix contains the string "perl", the library
+directories are simplified as described below. For simplicity, only
+the common style is shown here.
+
+=item Directories for site-specific add-on files
+
+After perl is installed, you may later wish to add modules (e.g. from
+CPAN) or scripts. Configure will set up the following directories to
+be used for installing those add-on modules and scripts.
+
+ Configure variable Default value
+ $siteprefix $prefix
+ $sitebin $siteprefix/bin
+ $sitescript $siteprefix/bin
+ $sitelib $siteprefix/lib/perl5/site_perl/$version
+ $sitearch $siteprefix/lib/perl5/site_perl/$version/$archname
+ $siteman1 $siteprefix/man/man1
+ $siteman3 $siteprefix/man/man3
+ $sitehtml1 (none)
+ $sitehtml3 (none)
+
+By default, ExtUtils::MakeMaker will install architecture-independent
+modules into $sitelib and architecture-dependent modules into $sitearch.
+
+NOTE: As of 5.6.0, ExtUtils::MakeMaker will use $sitelib and $sitearch,
+but will not use the other site-specific directories. Volunteers to
+fix this are needed.
+
+=item Directories for vendor-supplied add-on files
+
+Lastly, if you are building a binary distribution of perl for
+distribution, Configure can optionally set up the following directories
+for you to use to distribute add-on modules.
+
+ Configure variable Default value
+ $vendorprefix (none)
+ (The next ones are set only if vendorprefix is set.)
+ $vendorbin $vendorprefix/bin
+ $vendorscript $vendorprefix/bin
+ $vendorlib $vendorprefix/lib/perl5/vendor_perl/$version
+ $vendorarch $vendorprefix/lib/perl5/vendor_perl/$version/$archname
+ $vendorman1 $vendorprefix/man/man1
+ $vendorman3 $vendorprefix/man/man3
+ $vendorhtml1 (none)
+ $vendorhtml3 (none)
+
+These are normally empty, but may be set as needed. For example,
+a vendor might choose the following settings:
+
+ $prefix /usr/bin
+ $siteprefix /usr/local/bin
+ $vendorprefix /usr/bin
+
+This would have the effect of setting the following:
+
+ $bin /usr/bin
+ $scriptdir /usr/bin
+ $privlib /usr/lib/perl5/$version
+ $archlib /usr/lib/perl5/$version/$archname
+ $man1dir /usr/man/man1
+ $man3dir /usr/man/man3
+
+ $sitebin /usr/local/bin
+ $sitescript /usr/local/bin
+ $sitelib /usr/local/lib/perl5/site_perl/$version
+ $sitearch /usr/local/lib/perl5/site_perl/$version/$archname
+ $siteman1 /usr/local/man/man1
+ $siteman3 /usr/local/man/man3
+
+ $vendorbin /usr/bin
+ $vendorscript /usr/bin
+ $vendorlib /usr/lib/perl5/vendor_perl/$version
+ $vendorarch /usr/lib/perl5/vendor_perl/$version/$archname
+ $vendorman1 /usr/man/man1
+ $vendorman3 /usr/man/man3
+
+Note how in this example, the vendor-supplied directories are in the
+/usr hierarchy, while the directories reserved for the end-user are in
+the /usr/local hierarchy.
+
+NOTE: As of 5.6.0, ExtUtils::MakeMaker does not use these directories.
+Volunteers to fix this are needed.
+
+The entire installed library hierarchy is installed in locations with
+version numbers, keeping the installations of different versions distinct.
+However, later installations of Perl can still be configured to search the
+installed libraries corresponding to compatible earlier versions.
+See L<"Coexistence with earlier versions of perl5"> below for more details
+on how Perl can be made to search older version directories.
+
+Of course you may use these directories however you see fit. For
+example, you may wish to use $siteprefix for site-specific files that
+are stored locally on your own disk and use $vendorprefix for
+site-specific files that are stored elsewhere on your organization's
+network. One way to do that would be something like
+
+ sh Configure -Dsiteprefix=/usr/local -Dvendorprefix=/usr/share/perl
+
+=item otherlibdirs
+
+As a final catch-all, Configure also offers an $otherlibdirs
+variable. This variable contains a colon-separated list of additional
+directories to add to @INC. By default, it will be set to
+$prefix/site_perl if Configure detects that you have 5.004-era modules
+installed there. However, you can set it to anything you like.
+
+=item Man Pages
+
+In versions 5.005_57 and earlier, the default was to store module man
+pages in a version-specific directory, such as
+/usr/local/lib/perl5/$version/man/man3. The default for 5.005_58 and
+after is /usr/local/man/man3 so that most users can find the man pages
+without resetting MANPATH.
+
+You can continue to use the old default from the command line with
+
+ sh Configure -Dman3dir=/usr/local/lib/perl5/5.6.0/man/man3
Some users also prefer to use a .3pm suffix. You can do that with
sh Configure -Dman3ext=3pm
-If you specify a prefix that contains the string "perl", then the
-directory structure is simplified. For example, if you Configure with
--Dprefix=/opt/perl, then the defaults for 5.005 are
+Again, these are just the defaults, and can be changed as you run
+Configure.
- Configure variable Default value
- $archlib /opt/perl/lib/5.005/archname
- $privlib /opt/perl/lib/5.005
- $sitearch /opt/perl/lib/site_perl/5.005/archname
- $sitelib /opt/perl/lib/site_perl/5.005
+=item HTML pages
- $man1dir /opt/perl/man/man1
- $man3dir /opt/perl/man/man3
+As of perl5.005_57, the standard perl installation does not do
+anything with HTML documentation, but that may change in the future.
+Further, some add-on modules may wish to install HTML documents. The
+html Configure variables listed above are provided if you wish to
+specify where such documents should be placed. The default is "none",
+but will likely eventually change to something useful based on user
+feedback.
-The perl executable will search the libraries in the order given
-above.
+=back
-The directories under site_perl are empty, but are intended to be used
-for installing local or site-wide extensions. Perl will automatically
-look in these directories.
+Some users prefer to append a "/share" to $privlib and $sitelib
+to emphasize that those directories can be shared among different
+architectures.
-In order to support using things like #!/usr/local/bin/perl5.005 after
-a later version is released, architecture-dependent libraries are
-stored in a version-specific directory, such as
-/usr/local/lib/perl5/archname/5.005/.
+Note that these are just the defaults. You can actually structure the
+directories any way you like. They don't even have to be on the same
+filesystem.
Further details about the installation directories, maintenance and
development subversions, and about supporting multiple versions are
discussed in L<"Coexistence with earlier versions of perl5"> below.
-Again, these are just the defaults, and can be changed as you run
-Configure.
+If you specify a prefix that contains the string "perl", then the
+library directory structure is slightly simplified. Instead of
+suggesting $prefix/lib/perl5/, Configure will suggest $prefix/lib.
+
+Thus, for example, if you Configure with
+-Dprefix=/opt/perl, then the default library directories for 5.6.0 are
+
+ Configure variable Default value
+ $privlib /opt/perl/lib/5.6.0
+ $archlib /opt/perl/lib/5.6.0/$archname
+ $sitelib /opt/perl/lib/site_perl/5.6.0
+ $sitearch /opt/perl/lib/site_perl/5.6.0/$archname
=head2 Changing the installation directory
@@ -453,38 +528,22 @@ associated files) should be installed and the directory in which it
will eventually reside. For most sites, these two are the same; for
sites that use AFS, this distinction is handled automatically.
However, sites that use software such as depot to manage software
-packages may also wish to install perl into a different directory and
-use that management software to move perl to its final destination.
-This section describes how to do this. Someday, Configure may support
-an option -Dinstallprefix=/foo to simplify this.
+packages, or users building binary packages for distribution may also
+wish to install perl into a different directory and use that
+management software to move perl to its final destination. This
+section describes how to do that.
Suppose you want to install perl under the /tmp/perl5 directory. You
-can edit config.sh and change all the install* variables to point to
-/tmp/perl5 instead of /usr/local/wherever. Or, you can automate this
-process by placing the following lines in a file config.over before you
-run Configure (replace /tmp/perl5 by a directory of your choice):
-
- installprefix=/tmp/perl5
- test -d $installprefix || mkdir $installprefix
- test -d $installprefix/bin || mkdir $installprefix/bin
- installarchlib=`echo $installarchlib | sed "s!$prefix!$installprefix!"`
- installbin=`echo $installbin | sed "s!$prefix!$installprefix!"`
- installman1dir=`echo $installman1dir | sed "s!$prefix!$installprefix!"`
- installman3dir=`echo $installman3dir | sed "s!$prefix!$installprefix!"`
- installprivlib=`echo $installprivlib | sed "s!$prefix!$installprefix!"`
- installscript=`echo $installscript | sed "s!$prefix!$installprefix!"`
- installsitelib=`echo $installsitelib | sed "s!$prefix!$installprefix!"`
- installsitearch=`echo $installsitearch | sed "s!$prefix!$installprefix!"`
-
-Then, you can Configure and install in the usual way:
-
- sh Configure -des
- make
- make test
- make install
+could edit config.sh and change all the install* variables to point to
+/tmp/perl5 instead of /usr/local, or you could simply use the
+following command line:
+
+ sh Configure -Dinstallprefix=/tmp/perl5
+
+(replace /tmp/perl5 by a directory of your choice).
Beware, though, that if you go to try to install new add-on
-extensions, they too will get installed in under '/tmp/perl5' if you
+modules, they too will get installed in under '/tmp/perl5' if you
follow this example. The next section shows one way of dealing with
that problem.
@@ -496,9 +555,9 @@ installed on multiple systems. Suppose, for example, that you want to
create an archive that can be installed in /opt/perl.
Here's one way to do that:
- # Set up config.over to install perl into a different directory,
+ # Set up to install perl into a different directory,
# e.g. /tmp/perl5 (see previous part).
- sh Configure -Dprefix=/opt/perl -des
+ sh Configure -Dinstallprefix=/tmp/perl5 -Dprefix=/opt/perl -des
make
make test
make install # This will install everything into /tmp/perl5.
@@ -532,6 +591,15 @@ to ensure that Configure doesn't re-use them.
Further information is in the Policy_sh.SH file itself.
+If the generated Policy.sh file is unsuitable, you may freely edit it
+to contain any valid shell commands. It will be run just after the
+platform-specific hints files.
+
+Note: Since the directory hierarchy for 5.6.0 contains a number of
+new vendor* and site* entries, your Policy.sh file will probably not
+set them to your desired values. I encourage you to run Configure
+interactively to be sure it puts things where you want them.
+
=head2 Configure-time Options
There are several different ways to Configure and build perl for your
@@ -541,9 +609,9 @@ some of the main things you can change.
=head2 Threads
-On some platforms, perl5.005 can be compiled with experimental support
-for threads. To enable this, read the file README.threads, and then
-try:
+On some platforms, perl5.005 and later can be compiled with
+experimental support for threads. To enable this, read the file
+README.threads, and then try:
sh Configure -Dusethreads
@@ -552,6 +620,20 @@ line so that the hint files can make appropriate adjustments.
The default is to compile without thread support.
+As of v5.5.64, perl has two different internal threads implementations.
+The 5.005 version (5005threads) and an interpreter-based implementation
+(ithreads) with one interpreter per thread. By default, Configure selects
+ithreads if -Dusethreads is specified. However, you can select the old
+5005threads behavior instead by either
+
+ sh Configure -Dusethreads -Duse5005threads
+
+or by
+ sh Configure -Dusethreads -Uuseithreads
+
+Eventually (by perl v5.6.0) this internal confusion ought to disappear,
+and these options may disappear as well.
+
=head2 Selecting File IO mechanisms
Previous versions of perl used the standard IO mechanisms as defined in
@@ -593,30 +675,12 @@ If you have already selected -Duseperlio, and if Configure detects
that you have sfio, then sfio will be the default suggested by
Configure.
-Note: On some systems, sfio's iffe configuration script fails
-to detect that you have an atexit function (or equivalent).
-Apparently, this is a problem at least for some versions of Linux
-and SunOS 4.
-
-You can test if you have this problem by trying the following shell
-script. (You may have to add some extra cflags and libraries. A
-portable version of this may eventually make its way into Configure.)
-
- #!/bin/sh
- cat > try.c <<'EOCP'
- #include <stdio.h>
- main() { printf("42\n"); }
- EOCP
- cc -o try try.c -lsfio
- val=`./try`
- if test X$val = X42; then
- echo "Your sfio looks ok"
- else
- echo "Your sfio has the exit problem."
- fi
-
-If you have this problem, the fix is to go back to your sfio sources
-and correct iffe's guess about atexit.
+Note: On some systems, sfio's iffe configuration script fails to
+detect that you have an atexit function (or equivalent). Apparently,
+this is a problem at least for some versions of Linux and SunOS 4.
+Configure should detect this problem and warn you about problems with
+_exit vs. exit. If you have this problem, the fix is to go back to
+your sfio sources and correct iffe's guess about atexit.
There also might be a more recent release of Sfio that fixes your
problem.
@@ -639,6 +703,13 @@ detect sfio, then this will be the default suggested by Configure.
=back
+=head2 Dynamic Loading
+
+By default, Configure will compile perl to use dynamic loading if
+your system supports it. If you want to force perl to be compiled
+statically, you can either choose this when Configure prompts you or
+you can use the Configure command line option -Uusedl.
+
=head2 Building a shared libperl.so Perl library
Currently, for most systems, the main perl executable is built by
@@ -679,9 +750,10 @@ You can elect to build a shared libperl by
To build a shared libperl, the environment variable controlling shared
library search (LD_LIBRARY_PATH in most systems, DYLD_LIBRARY_PATH for
-NeXTSTEP/OPENSTEP, LIBRARY_PATH for BeOS) must be set up to include
+NeXTSTEP/OPENSTEP/Darwin, LIBRARY_PATH for BeOS, SHLIB_PATH for
+HP-UX, LIBPATH for AIX, PATH for Cygwin) must be set up to include
the Perl build directory because that's where the shared libperl will
-be created. Configure arranges Makefile to have the correct shared
+be created. Configure arranges makefile to have the correct shared
library search settings.
However, there are some special cases where manually setting the
@@ -703,7 +775,7 @@ for Bourne-style shells, or
setenv LD_LIBRARY_PATH `pwd`
for Csh-style shells. (This procedure may also be needed if for some
-unexpected reason Configure fails to set up Makefile correctly.)
+unexpected reason Configure fails to set up makefile correctly.)
You can often recognize failures to build/use a shared libperl from error
messages complaining about a missing libperl.so (or libperl.sl in HP-UX),
@@ -728,30 +800,25 @@ to point to the perl build directory.
The only reliable answer is that you should specify a different
directory for the architecture-dependent library for your -DDEBUGGING
version of perl. You can do this by changing all the *archlib*
-variables in config.sh, namely archlib, archlib_exp, and
-installarchlib, to point to your new architecture-dependent library.
+variables in config.sh to point to your new architecture-dependent library.
=head2 Malloc Issues
-Perl relies heavily on malloc(3) to grow data structures as needed, so
-perl's performance can be noticeably affected by the performance of
-the malloc function on your system.
-
-The perl source is shipped with a version of malloc that is very fast but
-somewhat wasteful of space. On the other hand, your system's malloc
-function may be a bit slower but also a bit more frugal. However,
-as of 5.004_68, perl's malloc has been optimized for the typical
-requests from perl, so there's a chance that it may be both faster and
-use less memory.
-
-For many uses, speed is probably the most important consideration, so
-the default behavior (for most systems) is to use the malloc supplied
-with perl. However, if you will be running very large applications
-(e.g. Tk or PDL) or if your system already has an excellent malloc, or
-if you are experiencing difficulties with extensions that use
-third-party libraries that call malloc, then you might wish to use
-your system's malloc. (Or, you might wish to explore the malloc flags
-discussed below.)
+Perl relies heavily on malloc(3) to grow data structures as needed,
+so perl's performance can be noticeably affected by the performance of
+the malloc function on your system. The perl source is shipped with a
+version of malloc that has been optimized for the typical requests from
+perl, so there's a chance that it may be both faster and use less memory
+than your system malloc.
+
+However, if your system already has an excellent malloc, or if you are
+experiencing difficulties with extensions that use third-party libraries
+that call malloc, then you should probably use your system's malloc.
+(Or, you might wish to explore the malloc flags discussed below.)
+
+=over 4
+
+=item Using the system malloc
To build without perl's malloc, you can use the Configure command
@@ -759,25 +826,32 @@ To build without perl's malloc, you can use the Configure command
or you can answer 'n' at the appropriate interactive Configure prompt.
-=head2 Malloc Performance Flags
+=item -DPERL_POLLUTE_MALLOC
-If you are using Perl's malloc, you may add one or more of the following
-items to your ccflags config.sh variable to change its behavior. You can
-find out more about these and other flags by reading the commentary near
-the top of the malloc.c source. The defaults should be fine for
-nearly everyone.
+NOTE: This flag is enabled automatically on some platforms if you
+asked for binary compatibility with version 5.005, or if you just
+run Configure to accept all the defaults on those platforms. You
+can refuse the automatic binary compatibility flags wholesale by
+running:
-=over 4
+ sh Configure -Ubincompat5005
-=item -DNO_FANCY_MALLOC
+or by answering 'n' at the appropriate prompt.
-Undefined by default. Defining it returns malloc to the version used
-in Perl 5.004.
+Perl's malloc family of functions are called Perl_malloc(),
+Perl_realloc(), Perl_calloc() and Perl_mfree(). When this flag is
+not enabled, the names do not clash with the system versions of
+these functions.
-=item -DPLAIN_MALLOC
+If enabled, Perl's malloc family of functions will have the same
+names as the system versions. This may be sometimes required when you
+have libraries that like to free() data that may have been allocated
+by Perl_malloc() and vice versa.
-Undefined by default. Defining it in addition to NO_FANCY_MALLOC returns
-malloc to the version used in Perl version 5.000.
+Note that enabling this option may sometimes lead to duplicate symbols
+from the linker for malloc et al. In such cases, the system probably
+does not allow its malloc functions to be fully replaced with custom
+versions.
=back
@@ -792,14 +866,14 @@ you probably want to do
This will do two independent things: First, it will force compilation
to use cc -g so that you can use your system's debugger on the
executable. (Note: Your system may actually require something like
-cc -g2. Check your man pages for cc(1) and also any hint file for your
-system.) Second, it will add -DDEBUGGING to your ccflags variable in
-config.sh so that you can use B<perl -D> to access perl's internal
-state. (Note: Configure will only add -DDEBUGGING by
-default if you are not reusing your old config.sh. If you want to
-reuse your old config.sh, then you can just edit it and change the
-optimize and ccflags variables by hand and then propagate your changes
-as shown in L<"Propagating your changes to config.sh"> below.)
+cc -g2. Check your man pages for cc(1) and also any hint file for
+your system.) Second, it will add -DDEBUGGING to your ccflags
+variable in config.sh so that you can use B<perl -D> to access perl's
+internal state. (Note: Configure will only add -DDEBUGGING by default
+if you are not reusing your old config.sh. If you want to reuse your
+old config.sh, then you can just edit it and change the optimize and
+ccflags variables by hand and then propagate your changes as shown in
+L<"Propagating your changes to config.sh"> below.)
You can actually specify -g and -DDEBUGGING independently, but usually
it's convenient to have both.
@@ -807,19 +881,159 @@ it's convenient to have both.
If you are using a shared libperl, see the warnings about multiple
versions of perl under L<Building a shared libperl.so Perl library>.
-=head2 Other Compiler Flags
+=head2 Extensions
-For most users, all of the Configure defaults are fine. However,
-you can change a number of factors in the way perl is built
-by adding appropriate -D directives to your ccflags variable in
-config.sh.
+By default, Configure will offer to build every extension which appears
+to be supported. For example, Configure will offer to build GDBM_File
+only if it is able to find the gdbm library. (See examples below.)
+B, DynaLoader, Fcntl, IO, and attrs are always built by default.
+Configure does not contain code to test for POSIX compliance, so POSIX
+is always built by default as well. If you wish to skip POSIX, you can
+set the Configure variable useposix=false either in a hint file or from
+the Configure command line. Similarly, the Opcode extension is always
+built by default, but you can skip it by setting the Configure variable
+useopcode=false either in a hint file for from the command line.
+
+If you unpack any additional extensions in the ext/ directory before
+running Configure, then Configure will offer to build those additional
+extensions as well. Most users probably shouldn't have to do this --
+it is usually easier to build additional extensions later after perl
+has been installed. However, if you wish to have those additional
+extensions statically linked into the perl binary, then this offers a
+convenient way to do that in one step. (It is not necessary, however;
+you can build and install extensions just fine even if you don't have
+dynamic loading. See lib/ExtUtils/MakeMaker.pm for more details.)
+
+You can learn more about each of the supplied extensions by consulting the
+documentation in the individual .pm modules, located under the
+ext/ subdirectory.
+
+Even if you do not have dynamic loading, you must still build the
+DynaLoader extension; you should just build the stub dl_none.xs
+version. (Configure will suggest this as the default.)
+
+In summary, here are the Configure command-line variables you can set
+to turn off each extension:
+
+ B (Always included by default)
+ DB_File i_db
+ DynaLoader (Must always be included as a static extension)
+ Fcntl (Always included by default)
+ GDBM_File i_gdbm
+ IO (Always included by default)
+ NDBM_File i_ndbm
+ ODBM_File i_dbm
+ POSIX useposix
+ SDBM_File (Always included by default)
+ Opcode useopcode
+ Socket d_socket
+ Threads use5005threads
+ attrs (Always included by default)
+
+Thus to skip the NDBM_File extension, you can use
+
+ sh Configure -Ui_ndbm
+
+Again, this is taken care of automatically if you don't have the ndbm
+library.
+
+Of course, you may always run Configure interactively and select only
+the extensions you want.
+
+Note: The DB_File module will only work with version 1.x of Berkeley
+DB or newer releases of version 2. Configure will automatically detect
+this for you and refuse to try to build DB_File with earlier
+releases of version 2.
+
+If you re-use your old config.sh but change your system (e.g. by
+adding libgdbm) Configure will still offer your old choices of extensions
+for the default answer, but it will also point out the discrepancy to
+you.
+
+Finally, if you have dynamic loading (most modern Unix systems do)
+remember that these extensions do not increase the size of your perl
+executable, nor do they impact start-up time, so you probably might as
+well build all the ones that will work on your system.
+
+=head2 Including locally-installed libraries
-You should also run Configure interactively to verify that a hint file
-doesn't inadvertently override your ccflags setting. (Hints files
-shouldn't do that, but some might.)
+Perl5 comes with interfaces to number of database extensions, including
+dbm, ndbm, gdbm, and Berkeley db. For each extension, if
+Configure can find the appropriate header files and libraries, it will
+automatically include that extension. The gdbm and db libraries
+are not included with perl. See the library documentation for
+how to obtain the libraries.
+
+If your database header (.h) files are not in a directory normally
+searched by your C compiler, then you will need to include the
+appropriate -I/your/directory option when prompted by Configure. If
+your database library (.a) files are not in a directory normally
+searched by your C compiler and linker, then you will need to include
+the appropriate -L/your/directory option when prompted by Configure.
+See the examples below.
+
+=head2 Examples
+
+=over 4
+
+=item gdbm in /usr/local
+
+Suppose you have gdbm and want Configure to find it and build the
+GDBM_File extension. This example assumes you have gdbm.h
+installed in /usr/local/include/gdbm.h and libgdbm.a installed in
+/usr/local/lib/libgdbm.a. Configure should figure all the
+necessary steps out automatically.
+
+Specifically, when Configure prompts you for flags for
+your C compiler, you should include -I/usr/local/include.
+
+When Configure prompts you for linker flags, you should include
+-L/usr/local/lib.
+
+If you are using dynamic loading, then when Configure prompts you for
+linker flags for dynamic loading, you should again include
+-L/usr/local/lib.
+
+Again, this should all happen automatically. This should also work if
+you have gdbm installed in any of (/usr/local, /opt/local, /usr/gnu,
+/opt/gnu, /usr/GNU, or /opt/GNU).
+
+=item gdbm in /usr/you
+
+Suppose you have gdbm installed in some place other than /usr/local/,
+but you still want Configure to find it. To be specific, assume you
+have /usr/you/include/gdbm.h and /usr/you/lib/libgdbm.a. You
+still have to add -I/usr/you/include to cc flags, but you have to take
+an extra step to help Configure find libgdbm.a. Specifically, when
+Configure prompts you for library directories, you have to add
+/usr/you/lib to the list.
+
+It is possible to specify this from the command line too (all on one
+line):
+
+ sh Configure -de \
+ -Dlocincpth="/usr/you/include" \
+ -Dloclibpth="/usr/you/lib"
+
+locincpth is a space-separated list of include directories to search.
+Configure will automatically add the appropriate -I directives.
+
+loclibpth is a space-separated list of library directories to search.
+Configure will automatically add the appropriate -L directives. If
+you have some libraries under /usr/local/ and others under
+/usr/you, then you have to include both, namely
+
+ sh Configure -de \
+ -Dlocincpth="/usr/you/include /usr/local/include" \
+ -Dloclibpth="/usr/you/lib /usr/local/lib"
+
+=back
=head2 What if it doesn't work?
+If you run into problems, try some of the following ideas.
+If none of them help, then see L<"Reporting Problems"> below.
+
=over 4
=item Running Configure Interactively
@@ -910,8 +1124,7 @@ You will then have to rebuild by running
You can also supply a shell script config.over to over-ride Configure's
guesses. It will get loaded up at the very end, just before config.sh
is created. You have to be careful with this, however, as Configure
-does no checking that your changes make sense. See the section on
-L<"Changing the installation directory"> for an example.
+does no checking that your changes make sense.
=item config.h
@@ -943,8 +1156,9 @@ $ccflags or $optimize, and then re-run
=item No sh
-If you don't have sh, you'll have to copy the sample file Porting/config_H
-to config.h and edit the config.h to reflect your system's peculiarities.
+If you don't have sh, you'll have to copy the sample file
+Porting/config.sh to config.sh and edit your config.sh to reflect your
+system's peculiarities. See Porting/pumpkin.pod for more information.
You'll probably also have to extensively modify the extension building
mechanism.
@@ -957,7 +1171,7 @@ be fixed to avoid polluting the namespace of the environment.
=item Digital UNIX/Tru64 UNIX and BIN_SH
-In Digital UNIX/Tru64 UNIX Configure might abort with
+In Digital UNIX/Tru64 UNIX, Configure might abort with
Build a threading Perl? [n]
Configure[2437]: Syntax error at line 1 : `config.sh' is not expected.
@@ -989,12 +1203,17 @@ libgdbm under HP-UX 11.
Specific information for the OS/2, Plan9, VMS and Win32 ports is in the
corresponding README files and subdirectories. Additional information,
including a glossary of all those config.sh variables, is in the Porting
-subdirectory.
+subdirectory. Especially Porting/Glossary should come in handy.
Ports for other systems may also be available. You should check out
http://www.perl.com/CPAN/ports for current information on ports to
various other operating systems.
+If you plan to port Perl to a new architecture study carefully the
+section titled "Philosophical Issues in Patching and Porting Perl"
+in the file Porting/pumpkin.pod and the file Porting/patching.pod.
+Study also how other non-UNIX ports have solved problems.
+
=back
=head1 make depend
@@ -1013,12 +1232,12 @@ explicitly above.
This will attempt to make perl in the current directory.
+=head2 What if it doesn't work?
+
If you can't compile successfully, try some of the following ideas.
If none of them help, and careful reading of the error message and
-the relevant manual pages on your system doesn't help, you can
-send a message to either the comp.lang.perl.misc newsgroup or to
-perlbug@perl.com with an accurate description of your problem.
-See L<"Reporting Problems"> below.
+the relevant manual pages on your system doesn't help,
+then see L<"Reporting Problems"> below.
=over 4
@@ -1054,11 +1273,6 @@ The latter is especially useful if you see something like this
at Perl startup.
-=item malloc duplicates
-
-If you get duplicates upon linking for malloc et al, add -DEMBEDMYMALLOC
-to your ccflags variable in config.sh.
-
=item varargs
If you get varargs problems with gcc, be sure that gcc is installed
@@ -1184,6 +1398,14 @@ updated resolver library provided with BIND 8.1 or rename
/usr/local/bin/arpa/inet.h during the Perl build and test process to
avoid the problem.
+=item #error "No DATAMODEL_NATIVE specified"
+
+This is a common error when trying to build perl on Solaris 2.6 with a
+gcc installation from Solaris 2.5 or 2.5.1. The Solaris header files
+changed, so you need to update your gcc installation. You can either
+rerun the fixincludes script from gcc or take the opportunity to
+update your gcc installation.
+
=item Optimizer
If you can't compile successfully, try turning off your compiler's
@@ -1200,10 +1422,13 @@ with B<make depend; make>.
=item CRIPPLED_CC
-If you still can't compile successfully, try adding a -DCRIPPLED_CC
-flag. (Just because you get no errors doesn't mean it compiled right!)
-This simplifies some complicated expressions for compilers that get
-indigestion easily.
+If you still can't compile successfully, try:
+
+ sh Configure -Accflags=-DCRIPPLED_CC
+
+This flag simplifies some complicated expressions for compilers that get
+indigestion easily. (Just because you get no errors doesn't mean it
+compiled right!)
=item Missing functions
@@ -1316,15 +1541,14 @@ Patch Bundle" has been reported to break the io/fs test #18 which
tests whether utime() can change timestamps. The Y2K patch seems to
break utime() so that over NFS the timestamps do not get changed
(on local filesystems utime() still works).
-
+
=back
=head1 make test
-This will run the regression tests on the perl you just made (you
-should run plain 'make' before 'make test' otherwise you won't have a
-complete build). If 'make test' doesn't say "All tests successful"
-then something went wrong. See the file t/README in the t subdirectory.
+This will run the regression tests on the perl you just made. If
+'make test' doesn't say "All tests successful" then something went
+wrong. See the file t/README in the t subdirectory.
Note that you can't run the tests in background if this disables
opening of /dev/tty. You can use 'make test-notty' in that case but
@@ -1380,10 +1604,8 @@ external program.
On some systems, particularly those with smaller amounts of RAM, some
of the tests in t/op/pat.t may fail with an "Out of memory" message.
-Specifically, in perl5.004_64, tests 74 and 78 have been reported to
-fail on some systems. On my SparcStation IPC with 8 MB of RAM, test 78
-will fail if the system is running any other significant tasks at the
-same time.
+For example, on my SparcStation IPC with 12 MB of RAM, in perl5.5.670,
+test 85 will fail if run under either t/TEST or t/harness.
Try stopping other jobs on the system and then running the test by itself:
@@ -1413,6 +1635,15 @@ indicate the alternate name on the "make install" line, such as:
make install PERLNAME=myperl
+You can separately change the base used for versioned names (like
+"perl5.005") by setting PERLNAME_VERBASE, like
+
+ make install PERLNAME=perl5 PERLNAME_VERBASE=perl
+
+This can be useful if you have to install perl as "perl5" (due to an
+ancient version in /usr/bin supplied by your vendor, eg). Without this
+the versioned binary would be called "perl55.005".
+
=head2 Installed files
If you want to see exactly what will happen without installing
@@ -1444,34 +1675,25 @@ make install will install the following:
pod2man, and
pod2text
splain Describe Perl warnings and errors
+ dprofpp Perl code profile post-processor
library files in $privlib and $archlib specified to
Configure, usually under /usr/local/lib/perl5/.
- man pages in the location specified to Configure, usually
- something like /usr/local/man/man1.
- module in the location specified to Configure, usually
- man pages under /usr/local/lib/perl5/man/man3.
+ man pages in $man1dir, usually /usr/local/man/man1.
+ module man
+ pages in $man3dir, usually /usr/local/man/man3.
pod/*.pod in $privlib/pod/.
-Installperl will also create the library directories $siteperl and
-$sitearch listed in config.sh. Usually, these are something like
-
- /usr/local/lib/perl5/site_perl/5.005
- /usr/local/lib/perl5/site_perl/5.005/archname
-
-where archname is something like sun4-sunos. These directories
-will be used for installing extensions.
+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
-under $archlib so that any user may later build new extensions, run the
+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.
=head1 Coexistence with earlier versions of perl5
-WARNING: The upgrade from 5.004_0x to 5.005 is going to be a bit
-tricky. See L<"Upgrading from 5.004 to 5.005"> below.
-
In general, you can usually safely upgrade from one version of Perl (e.g.
5.004_04) to another similar version (e.g. 5.004_05) without re-compiling
all of your add-on extensions. You can also safely leave the old version
@@ -1485,48 +1707,76 @@ Most extensions will probably not need to be recompiled to use
with a newer version of perl. Here is how it is supposed to work.
(These examples assume you accept all the Configure defaults.)
-The directories searched by version 5.005 will be
-
- Configure variable Default value
- $archlib /usr/local/lib/perl5/5.005/archname
- $privlib /usr/local/lib/perl5/5.005
- $sitearch /usr/local/lib/perl5/site_perl/5.005/archname
- $sitelib /usr/local/lib/perl5/site_perl/5.005
-
-while the directories searched by version 5.005_01 will be
-
- $archlib /usr/local/lib/perl5/5.00501/archname
- $privlib /usr/local/lib/perl5/5.00501
- $sitearch /usr/local/lib/perl5/site_perl/5.005/archname
- $sitelib /usr/local/lib/perl5/site_perl/5.005
-
-When you install an add-on extension, it gets installed into $sitelib (or
-$sitearch if it is architecture-specific). This directory deliberately
-does NOT include the sub-version number (01) so that both 5.005 and
-5.005_01 can use the extension. Only when a perl version changes to
-break backwards compatibility will the default suggestions for the
-$sitearch and $sitelib version numbers be increased.
-
-However, if you do run into problems, and you want to continue to use the
-old version of perl along with your extension, move those extension files
-to the appropriate version directory, such as $privlib (or $archlib).
-(The extension's .packlist file lists the files installed with that
-extension. For the Tk extension, for example, the list of files installed
-is in $sitearch/auto/Tk/.packlist.) Then use your newer version of perl
-to rebuild and re-install the extension into $sitelib. This way, Perl
-5.005 will find your files in the 5.005 directory, and newer versions
-of perl will find your newer extension in the $sitelib directory.
-(This is also why perl searches the site-specific libraries last.)
-
-Alternatively, if you are willing to reinstall all your extensions
-every time you upgrade perl, then you can include the subversion
-number in $sitearch and $sitelib when you run Configure.
+Suppose you already have version 5.005_03 installed. The directories
+searched by 5.005_03 are
+
+ /usr/local/lib/perl5/5.00503/$archname
+ /usr/local/lib/perl5/5.00503
+ /usr/local/lib/perl5/site_perl/5.005/$archname
+ /usr/local/lib/perl5/site_perl/5.005
+
+Beginning with 5.6.0 the version number in the site libraries are
+fully versioned. Now, suppose you install version 5.6.0. The directories
+searched by version 5.6.0 will be
+
+ /usr/local/lib/perl5/5.6.0/$archname
+ /usr/local/lib/perl5/5.6.0
+ /usr/local/lib/perl5/site_perl/5.6.0/$archname
+ /usr/local/lib/perl5/site_perl/5.6.0
+
+ /usr/local/lib/perl5/site_perl/5.005/$archname
+ /usr/local/lib/perl5/site_perl/5.005
+ /usr/local/lib/perl5/site_perl/
+
+Notice the last three entries -- Perl understands the default structure
+of the $sitelib directories and will look back in older, compatible
+directories. This way, modules installed under 5.005_03 will continue
+to be usable by 5.005_03 but will also accessible to 5.6.0. Further,
+suppose that you upgrade a module to one which requires features
+present only in 5.6.0. That new module will get installed into
+/usr/local/lib/perl5/site_perl/5.6.0 and will be available to 5.6.0,
+but will not interfere with the 5.005_03 version.
+
+The last entry, /usr/local/lib/perl5/site_perl/, is there so that
+5.6.0 will look for 5.004-era pure perl modules.
+
+Lastly, suppose you now install version 5.6.1, which we'll assume is
+binary compatible with 5.6.0 and 5.005. The directories searched
+by 5.6.1 (if you don't change the Configure defaults) will be:
+
+ /usr/local/lib/perl5/5.6.1/$archname
+ /usr/local/lib/perl5/5.6.1
+ /usr/local/lib/perl5/site_perl/5.6.1/$archname
+ /usr/local/lib/perl5/site_perl/5.6.1
+
+ /usr/local/lib/perl5/site_perl/5.6.0/$archname
+ /usr/local/lib/perl5/site_perl/5.6.0
+
+ /usr/local/lib/perl5/site_perl/5.005/$archname
+ /usr/local/lib/perl5/site_perl/5.005
+ /usr/local/lib/perl5/site_perl/
+
+Assuming the users in your site are still actively using perl 5.6.0 and
+5.005 after you installed 5.6.1, you can continue to install add-on
+extensions using any of perl 5.6.1, 5.6.0, or 5.005. The installations
+of these different versions remain distinct, but remember that the newer
+versions of perl are automatically set up to search the site libraries of
+the older ones. This means that installing a new extension with 5.005
+will make it visible to all three versions. Later, if you install the
+same extension using, say, perl 5.6.1, it will override the 5.005-installed
+version, but only for perl 5.6.1.
+
+This way, you can choose to share compatible extensions, but also upgrade
+to a newer version of an extension that may be incompatible with earlier
+versions, without breaking the earlier versions' installations.
=head2 Maintaining completely separate versions
Many users prefer to keep all versions of perl in completely
-separate directories. One convenient way to do this is by
-using a separate prefix for each version, such as
+separate directories. This guarantees that an update to one version
+won't interfere with another version. (The defaults guarantee this for
+libraries after 5.6.0, but not for executables. TODO?) One convenient
+way to do this is by using a separate prefix for each version, such as
sh Configure -Dprefix=/opt/perl5.004
@@ -1543,14 +1793,17 @@ seriously consider using a separate directory, since development
subversions may not have all the compatibility wrinkles ironed out
yet.
-=head2 Upgrading from 5.004 to 5.005
+=head2 Upgrading from 5.005 to 5.6.0
+
+Most extensions built and installed with versions of perl
+prior to 5.005_50 will not need to be recompiled to be used with
+5.6.0. If you find you do need to rebuild an extension with 5.6.0,
+you may safely do so without disturbing the 5.005 installation.
+(See L<"Coexistence with earlier versions of perl5"> above.)
-Extensions built and installed with versions of perl prior to 5.004_50
-will need to be recompiled to be used with 5.004_50 and later. You will,
-however, be able to continue using 5.004 even after you install 5.005.
-The 5.004 binary will still be able to find the extensions built under
-5.004; the 5.005 binary will look in the new $sitearch and $sitelib
-directories, and will not find them.
+See your installed copy of the perllocal.pod file for a (possibly
+incomplete) list of locally installed modules. Note that you want
+perllocal.pod not perllocale.pod for installed module information.
=head1 Coexistence with perl4
@@ -1563,23 +1816,23 @@ In your /usr/local/bin directory, you should have a binary named
perl4.036. That will not be touched by the perl5 installation
process. Most perl4 scripts should run just fine under perl5.
However, if you have any scripts that require perl4, you can replace
-the #! line at the top of them by #!/usr/local/bin/perl4.036
-(or whatever the appropriate pathname is). See pod/perltrap.pod
-for possible problems running perl4 scripts under perl5.
+the #! line at the top of them by #!/usr/local/bin/perl4.036 (or
+whatever the appropriate pathname is). See pod/perltrap.pod for
+possible problems running perl4 scripts under perl5.
=head1 cd /usr/include; h2ph *.h sys/*.h
-Some perl scripts need to be able to obtain information from
-the system header files. This command will convert the most commonly used
+Some perl scripts need to be able to obtain information from the
+system header files. This command will convert the most commonly used
header files in /usr/include into files that can be easily interpreted
-by perl. These files will be placed in the architecture-dependent library
-($archlib) directory you specified to Configure.
+by perl. These files will be placed in the architecture-dependent
+library ($archlib) directory you specified to Configure.
-Note: Due to differences in the C and perl languages, the
-conversion of the header files is not perfect. You will probably have
-to hand-edit some of the converted files to get them to parse
-correctly. For example, h2ph breaks spectacularly on type casting and
-certain structures.
+Note: Due to differences in the C and perl languages, the conversion
+of the header files is not perfect. You will probably have to
+hand-edit some of the converted files to get them to parse correctly.
+For example, h2ph breaks spectacularly on type casting and certain
+structures.
=head1 installhtml --help
@@ -1587,6 +1840,9 @@ Some sites may wish to make perl documentation available in HTML
format. The installhtml utility can be used to convert pod
documentation into linked HTML files and install them.
+Currently, the supplied ./installhtml script does not make use of the
+html Configure variables. This should be fixed in a future release.
+
The following command-line is an example of one used to convert
perl documentation:
@@ -1631,8 +1887,16 @@ comes with the perl distribution, but you need to have perl compiled
before you can use it. (If you have not installed it yet, you need to
run C<./perl -Ilib utils/perlbug> instead of a plain C<perlbug>.)
-You might also find helpful information in the Porting directory of the
-perl distribution.
+Please try to make your message brief but clear. Trim out unnecessary
+information. Do not include large files (such as config.sh or a complete
+Configure or make log) unless absolutely necessary. Do not include a
+complete transcript of your build session. Just include the failing
+commands, the relevant error messages, and whatever preceding commands
+are necessary to give the appropriate context. Plain text should
+usually be sufficient--fancy attachments or encodings may actually
+reduce the number of people who read your message. Your message
+will get relayed to over 400 subscribers around the world so please
+try to keep it brief but clear.
=head1 DOCUMENTATION
@@ -1669,12 +1933,11 @@ L<"Reporting Problems"> above.
=head1 REDISTRIBUTION
This document is part of the Perl package and may be distributed under
-the same terms as perl itself.
-
+the same terms as perl itself, with the following additional request:
If you are distributing a modified version of perl (perhaps as part of
-a larger package) please do modify these installation instructions and
-the contact information to match your distribution.
+a larger package) please B<do> modify these installation instructions
+and the contact information to match your distribution.
=head1 LAST MODIFIED
-$Id: INSTALL,v 1.42 1998/07/15 18:04:44 doughera Released $
+$Id: INSTALL,v 1.58 1999/07/23 14:43:00 doughera Exp $
diff --git a/contrib/perl5/INTERN.h b/contrib/perl5/INTERN.h
index 118e47c..286cc46 100644
--- a/contrib/perl5/INTERN.h
+++ b/contrib/perl5/INTERN.h
@@ -1,6 +1,6 @@
/* INTERN.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -27,11 +27,17 @@
# define EXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
# define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
#else
-# ifdef __cplusplus
-# define EXT
-# define dEXT
-# define EXTCONST extern const
-# define dEXTCONST const
+#if defined(WIN32) && defined(__MINGW32__)
+# define EXT __declspec(dllexport)
+# define dEXT
+# define EXTCONST __declspec(dllexport) const
+# define dEXTCONST const
+#else
+#ifdef __cplusplus
+# define EXT
+# define dEXT
+# define EXTCONST extern const
+# define dEXTCONST const
#else
# define EXT
# define dEXT
@@ -39,6 +45,7 @@
# define dEXTCONST const
#endif
#endif
+#endif
#undef INIT
#define INIT(x) = x
diff --git a/contrib/perl5/MAINTAIN b/contrib/perl5/MAINTAIN
new file mode 100644
index 0000000..37ef489
--- /dev/null
+++ b/contrib/perl5/MAINTAIN
@@ -0,0 +1,879 @@
+# In addition to actual maintainers this file also lists "interested parties".
+#
+# The maintainer aliases come from AUTHORS. They may be defined in
+# a layered way: 'doc' expands to tchrist which expands to Tom Christiansen.
+#
+# A file that is in MANIFEST need not be here at all.
+# In any case, if nobody else is listed as maintainer,
+# PUMPKING (from AUTHORS) should be it.
+#
+# Filenames can contain * which means qr(.*) on the filenames found
+# using File::Find (it's _not_ filename glob).
+#
+# Maintainership definitions are of course cumulative: if A maintains
+# X/* and B maintains X/Y/Z, if X/Y/Z is changed, both A and B should
+# be notified.
+#
+# The filename(glob) and the maintainer(s) are separated by one or more tabs.
+
+Artistic
+Changes
+Changes5.000
+Changes5.001
+Changes5.002
+Changes5.003
+Changes5.004
+Changes5.005
+Configure cfg
+Copying
+EXTERN.h
+INSTALL
+INTERN.h
+MANIFEST
+Makefile.SH
+objXSUB.h
+Policy_sh.SH
+Porting/* cfg
+Porting/Contract
+Porting/Glossary
+Porting/config.sh
+Porting/config_H
+Porting/findvars
+Porting/fixCORE
+Porting/fixvars
+Porting/genlog
+Porting/makerel
+Porting/p4d2p
+Porting/p4desc
+Porting/patching.pod dgris
+Porting/patchls
+Porting/pumpkin.pod
+README
+README.amiga amiga
+README.beos beos
+README.cygwin cygwin
+README.dos dos
+README.hpux hpux
+README.lexwarn lexwarn
+README.machten machten
+README.mpeix mpeix
+README.os2 os2
+README.os390 mvs
+README.plan9 plan9
+README.posix-bc posix-bc
+README.qnx qnx
+README.threads
+README.vmesa vmesa
+README.vms vms
+README.vos vos
+README.win32 win32
+Todo
+Todo-5.005
+XSlock.h
+XSUB.h
+av.c
+av.h
+beos/* beos
+bytecode.h
+bytecode.pl
+byterun.c
+byterun.h
+cc_runtime.h
+cflags.SH
+config_h.SH cfg
+configpm
+configure.com vms
+configure.gnu
+cop.h
+cv.h
+cygwin/* cygwin
+deb.c
+djgpp/* dos
+doio.c
+doop.c
+dosish.h
+dump.c
+ebcdic.c
+eg/ADB
+eg/README
+eg/cgi/* cgi
+eg/changes
+eg/client
+eg/down
+eg/dus
+eg/findcp
+eg/findtar
+eg/g/gcp
+eg/g/gcp.man
+eg/g/ged
+eg/g/ghosts
+eg/g/gsh
+eg/g/gsh.man
+eg/muck
+eg/muck.man
+eg/myrup
+eg/nih
+eg/relink
+eg/rename
+eg/rmfrom
+eg/scan/scan_df
+eg/scan/scan_last
+eg/scan/scan_messages
+eg/scan/scan_passwd
+eg/scan/scan_ps
+eg/scan/scan_sudo
+eg/scan/scan_suid
+eg/scan/scanner
+eg/server
+eg/shmkill
+eg/sysvipc/README
+eg/sysvipc/ipcmsg
+eg/sysvipc/ipcsem
+eg/sysvipc/ipcshm
+eg/travesty
+eg/unuc
+eg/uudecode
+eg/van/empty
+eg/van/unvanish
+eg/van/vanexp
+eg/van/vanish
+eg/who
+eg/wrapsuid
+emacs/* ilya
+embed.h
+embed.pl
+embedvar.h
+ext/*/hints* cfg
+ext/B/* nik
+ext/B/B/Deparse.pm smccam
+ext/DB_File* pmarquess
+ext/DB_File/hints/dynixptx.pl dynix/ptx
+ext/Data/Dumper/* gsar
+ext/Devel/DProf/*
+ext/Devel/Peek/* ilya
+ext/DynaLoader/DynaLoader_pm.PL
+ext/DynaLoader/Makefile.PL
+ext/DynaLoader/README
+ext/DynaLoader/dl_aix.xs aix
+ext/DynaLoader/dl_dld.xs rsanders
+ext/DynaLoader/dl_dlopen.xs timb
+ext/DynaLoader/dl_hpux.xs hpux
+ext/DynaLoader/dl_mpeix.xs mpeix
+ext/DynaLoader/dl_next.xs next
+ext/DynaLoader/dl_none.xs
+ext/DynaLoader/dl_vms.xs vms
+ext/DynaLoader/dl_vmesa.xs vmesa
+ext/DynaLoader/dlutils.c
+ext/DynaLoader/hints/linux.pl linux
+ext/Errno/* gbarr
+ext/Fcntl/* jhi
+ext/GDBM_File/GDBM_File.pm
+ext/GDBM_File/GDBM_File.xs
+ext/GDBM_File/Makefile.PL
+ext/GDBM_File/typemap
+ext/IO/*
+ext/IPC/SysV/* gbarr
+ext/NDBM_File/Makefile.PL
+ext/NDBM_File/NDBM_File.pm
+ext/NDBM_File/NDBM_File.xs
+ext/NDBM_File/hints/dec_osf.pl dec_osf
+ext/NDBM_File/hints/dynixptx.pl dynix/ptx
+ext/NDBM_File/hints/solaris.pl solaris
+ext/NDBM_File/hints/svr4.pl svr4
+ext/NDBM_File/typemap
+ext/ODBM_File/Makefile.PL
+ext/ODBM_File/ODBM_File.pm
+ext/ODBM_File/ODBM_File.xs
+ext/ODBM_File/hints/dec_osf.pl dec_osf
+ext/ODBM_File/hints/hpux.pl hpux
+ext/ODBM_File/hints/sco.pl sco
+ext/ODBM_File/hints/solaris.pl solaris
+ext/ODBM_File/hints/svr4.pl svr4
+ext/ODBM_File/hints/ultrix.pl
+ext/ODBM_File/typemap
+ext/Opcode/Makefile.PL
+ext/Opcode/Opcode.pm
+ext/Opcode/Opcode.xs
+ext/Opcode/Safe.pm
+ext/Opcode/ops.pm
+ext/POSIX/Makefile.PL
+ext/POSIX/POSIX.pm
+ext/POSIX/POSIX.pod
+ext/POSIX/POSIX.xs
+ext/POSIX/hints/bsdos.pl bsdos
+ext/POSIX/hints/dynixptx.pl dynix/ptx
+ext/POSIX/hints/freebsd.pl freebsd
+ext/POSIX/hints/linux.pl linux
+ext/POSIX/hints/netbsd.pl netbsd
+ext/POSIX/hints/next_3.pl next
+ext/POSIX/hints/openbsd.pl openbsd
+ext/POSIX/hints/sunos_4.pl sunos4
+ext/POSIX/typemap
+ext/SDBM_File/Makefile.PL
+ext/SDBM_File/SDBM_File.pm
+ext/SDBM_File/SDBM_File.xs
+ext/SDBM_File/sdbm/CHANGES
+ext/SDBM_File/sdbm/COMPARE
+ext/SDBM_File/sdbm/Makefile.PL
+ext/SDBM_File/sdbm/README
+ext/SDBM_File/sdbm/README.too
+ext/SDBM_File/sdbm/biblio
+ext/SDBM_File/sdbm/dba.c
+ext/SDBM_File/sdbm/dbd.c
+ext/SDBM_File/sdbm/dbe.1
+ext/SDBM_File/sdbm/dbe.c
+ext/SDBM_File/sdbm/dbm.c
+ext/SDBM_File/sdbm/dbm.h
+ext/SDBM_File/sdbm/dbu.c
+ext/SDBM_File/sdbm/grind
+ext/SDBM_File/sdbm/hash.c
+ext/SDBM_File/sdbm/linux.patches
+ext/SDBM_File/sdbm/makefile.sdbm
+ext/SDBM_File/sdbm/pair.c
+ext/SDBM_File/sdbm/pair.h
+ext/SDBM_File/sdbm/readme.ms
+ext/SDBM_File/sdbm/sdbm.3
+ext/SDBM_File/sdbm/sdbm.c
+ext/SDBM_File/sdbm/sdbm.h
+ext/SDBM_File/sdbm/tune.h
+ext/SDBM_File/sdbm/util.c
+ext/SDBM_File/typemap
+ext/Socket/Makefile.PL
+ext/Socket/Socket.pm
+ext/Socket/Socket.xs
+ext/Thread/Makefile.PL
+ext/Thread/Notes
+ext/Thread/README
+ext/Thread/Thread.pm
+ext/Thread/Thread.xs
+ext/Thread/Thread/Queue.pm
+ext/Thread/Thread/Semaphore.pm
+ext/Thread/Thread/Signal.pm
+ext/Thread/Thread/Specific.pm
+ext/Thread/create.t
+ext/Thread/die.t
+ext/Thread/die2.t
+ext/Thread/io.t
+ext/Thread/join.t
+ext/Thread/join2.t
+ext/Thread/list.t
+ext/Thread/lock.t
+ext/Thread/queue.t
+ext/Thread/specific.t
+ext/Thread/sync.t
+ext/Thread/sync2.t
+ext/Thread/typemap
+ext/Thread/unsync.t
+ext/Thread/unsync2.t
+ext/Thread/unsync3.t
+ext/Thread/unsync4.t
+ext/attrs/Makefile.PL
+ext/attrs/attrs.pm
+ext/attrs/attrs.xs
+ext/re/Makefile.PL
+ext/re/hints/mpeix.pl mpeix
+ext/re/re.pm regex
+ext/re/re.xs regex
+ext/util/make_ext
+ext/util/mkbootstrap
+fakethr.h
+form.h
+global.sym
+globals.c
+globvar.sym
+gv.c
+gv.h
+h2pl/README
+h2pl/cbreak.pl
+h2pl/cbreak2.pl
+h2pl/eg/sizeof.ph
+h2pl/eg/sys/errno.pl
+h2pl/eg/sys/ioctl.pl
+h2pl/eg/sysexits.pl
+h2pl/getioctlsizes
+h2pl/mksizes
+h2pl/mkvars
+h2pl/tcbreak
+h2pl/tcbreak2
+handy.h
+hints/* cfg
+hints/3b1.sh
+hints/3b1cc
+hints/README.hints
+hints/aix.sh aix
+hints/altos486.sh
+hints/amigaos.sh amiga
+hints/apollo.sh
+hints/aux_3.sh
+hints/beos.sh beos
+hints/broken-db.msg
+hints/bsdos.sh bsdos
+hints/convexos.sh
+hints/cxux.sh cxux
+hints/cygwin.sh cygwinx
+hints/dcosx.sh
+hints/dec_osf.sh dec_osf
+hints/dgux.sh dgux
+hints/dos_djgpp.sh dos
+hints/dynix.sh dynix/ptx
+hints/dynixptx.sh dynix/ptx
+hints/epix.sh
+hints/esix4.sh
+hints/fps.sh
+hints/freebsd.sh freebsd
+hints/genix.sh
+hints/greenhills.sh
+hints/hpux.sh hpux
+hints/i386.sh
+hints/irix* irix
+hints/isc.sh
+hints/isc_2.sh
+hints/linux.sh linux
+hints/lynxos.sh lynxos
+hints/machten.sh machten
+hints/machten_2.sh
+hints/mips.sh
+hints/mpc.sh
+hints/mpeix.sh mpeix
+hints/ncr_tower.sh
+hints/netbsd.sh netbsd
+hints/newsos4.sh
+hints/next* step
+hints/openbsd.sh openbsd
+hints/opus.sh
+hints/os2.sh os2
+hints/os390.sh mvs
+hints/posix-bc.sh posix-bc
+hints/powerux.sh powerux
+hints/qnx.sh qnx
+hints/sco.sh
+hints/sco_2_3_0.sh
+hints/sco_2_3_1.sh
+hints/sco_2_3_2.sh
+hints/sco_2_3_3.sh
+hints/sco_2_3_4.sh
+hints/solaris_2.sh solaris
+hints/stellar.sh
+hints/sunos_4* sunos4
+hints/svr4.sh svr4
+hints/ti1500.sh
+hints/titanos.sh
+hints/ultrix_4.sh ultrix
+hints/umips.sh
+hints/unicos* unicos
+hints/unisysdynix.sh
+hints/utekv.sh
+hints/uts.sh
+hints/uwin.sh uwin
+hints/vmesa.sh vmesa
+hv.c
+hv.h
+installhtml
+installman
+installperl
+intrpvar.h
+iperlsys.h
+jpl/* jpl
+keywords.h
+keywords.pl
+lib/AnyDBM_File.pm
+lib/AutoLoader.pm
+lib/AutoSplit.pm
+lib/Benchmark.pm jhi,timb
+lib/CGI* cgi
+lib/CPAN* cpan
+lib/Carp.pm
+lib/Class/Struct.pm tchrist
+lib/Cwd.pm
+lib/Devel/SelfStubber.pm
+lib/DirHandle.pm
+lib/English.pm
+lib/Env.pm
+lib/Exporter.pm
+lib/ExtUtils/* mm
+lib/ExtUtils/Command.pm nik
+lib/ExtUtils/Embed.pm doug
+lib/ExtUtils/Installed.pm alan.burlison
+lib/ExtUtils/Mksymlists.pm cbail
+lib/ExtUtils/MM_OS2.pm os2
+lib/ExtUtils/MM_VMS.pm vms
+lib/ExtUtils/MM_Win32.pm win32
+lib/ExtUtils/Packlist.pm alan.burlison
+lib/Fatal.pm
+lib/File/Basename.pm
+lib/File/CheckTree.pm
+lib/File/Compare.pm nik
+lib/File/Copy.pm cbail
+lib/File/DosGlob.pm gsar
+lib/File/Find.pm
+lib/File/Path.pm timb,cbail
+lib/File/Spec* kjahds
+lib/File/Spec/Mac.pm schinder
+lib/File/Spec/OS2.pm ilya
+lib/File/Spec/VMS.pm vms
+lib/File/Spec/Win32.pm win32
+lib/File/stat.pm tchrist
+lib/FileCache.pm
+lib/FileHandle.pm
+lib/FindBin.pm
+lib/Getopt/Long.pm jvromans
+lib/I18N/Collate.pm jhi
+lib/IPC/Open2.pm
+lib/IPC/Open3.pm
+lib/Math/BigFloat.pm mbiggar
+lib/Math/BigInt.pm mbiggar
+lib/Math/Complex.pm complex
+lib/Math/Trig.pm complex
+lib/Net/Ping.pm
+lib/Net/hostent.pm tchrist
+lib/Net/netent.pm tchrist
+lib/Net/protoent.pm tchrist
+lib/Net/servent.pm tchrist
+lib/Pod/Checker.pm bradapp
+lib/Pod/Functions.pm
+lib/Pod/Html.pm tchrist
+lib/Pod/InputObjects.pm bradapp
+lib/Pod/Parser.pm bradapp
+lib/Pod/PlainText.pm bradapp
+lib/Pod/Select.pm bradapp
+lib/Pod/Text.pm tchrist
+lib/Pod/Usage.pm bradapp
+lib/Search/Dict.pm
+lib/SelectSaver.pm
+lib/SelfLoader.pm
+lib/Shell.pm
+lib/Symbol.pm
+lib/Sys/Hostname.pm sundstrom
+lib/Sys/Syslog.pm tchrist
+lib/Term/Cap.pm
+lib/Term/Complete.pm wayne.thompson
+lib/Term/ReadLine.pm
+lib/Test.pm
+lib/Test/Harness.pm k
+lib/Text/Abbrev.pm
+lib/Text/ParseWords.pm pomeranz
+lib/Text/Soundex.pm stok
+lib/Text/Tabs.pm muir
+lib/Text/Wrap.pm muir
+lib/Tie/Array.pm nik
+lib/Tie/Handle.pm
+lib/Tie/Hash.pm
+lib/Tie/RefHash.pm gsar
+lib/Tie/Scalar.pm
+lib/Tie/SubstrHash.pm
+lib/Time/Local.pm pomeranz
+lib/Time/gmtime.pm tchrist
+lib/Time/localtime.pm tchrist
+lib/Time/tm.pm tchrist
+lib/UNIVERSAL.pm
+lib/User/grent.pm tchrist
+lib/User/pwent.pm tchrist
+lib/abbrev.pl
+lib/assert.pl
+lib/autouse.pm
+lib/base.pm
+lib/bigfloat.pl
+lib/bigint.pl
+lib/bigrat.pl
+lib/blib.pm
+lib/cacheout.pl
+lib/charnames.pm ilya
+lib/chat2.pl
+lib/complete.pl
+lib/constant.pm
+lib/ctime.pl
+lib/diagnostics.pm doc
+lib/dotsh.pl
+lib/dumpvar.pl
+lib/exceptions.pl
+lib/fastcwd.pl
+lib/fields.pm
+lib/filetest.pm
+lib/find.pl
+lib/finddepth.pl
+lib/flush.pl
+lib/ftp.pl
+lib/getcwd.pl
+lib/getopt.pl
+lib/getopts.pl
+lib/hostname.pl
+lib/importenv.pl
+lib/integer.pm
+lib/less.pm
+lib/lib.pm
+lib/locale.pm locale
+lib/look.pl
+lib/newgetopt.pl
+lib/open2.pl
+lib/open3.pl
+lib/overload.pm ilya
+lib/perl5db.pl ilya
+lib/pwd.pl
+lib/shellwords.pl
+lib/sigtrap.pm
+lib/stat.pl
+lib/strict.pm
+lib/subs.pm
+lib/syslog.pl
+lib/tainted.pl
+lib/termcap.pl
+lib/timelocal.pl
+lib/unicode/*Ethiopic* dmulholl
+lib/unicode* lwall
+lib/utf8* lwall
+lib/validate.pl
+lib/vars.pm
+lib/warning.pm lexwarn
+makeaperl.SH
+makedepend.SH
+makedir.SH
+malloc.c ilya
+mg.c
+mg.h
+minimod.pl
+miniperlmain.c
+mpeix/* mpeix
+mv-if-diff
+myconfig
+nostdio.h
+op.c
+op.h
+opcode.h
+opcode.pl
+os2/* ilya
+patchlevel.h
+perl.c
+perl.h
+perl_exp.SH
+perlio.c
+perlio.h
+perlio.sym
+perlsdio.h
+perlsfio.h
+perlsh
+perlvars.h
+perly.c
+perly_c.diff
+perly.fixer
+perly.h
+perly.y
+plan9/* plan9
+pod/pod2usage.PL bradapp
+pod/podchecker.PL bradapp
+pod/podselect.PL bradapp
+pod/* doc
+pod/buildtoc
+pod/checkpods.PL
+pod/perl.pod
+pod/perlapio.pod
+pod/perlbook.pod
+pod/perlbot.pod
+pod/perlcall.pod pmarquess
+pod/perldata.pod
+pod/perldebug.pod
+pod/perldelta.pod
+pod/perl5005delta.pod
+pod/perl5004delta.pod
+pod/perldiag.pod
+pod/perldsc.pod tchrist
+pod/perlembed.pod doug,jon
+pod/perlfaq* gnat
+pod/perlform.pod
+pod/perlfunc.pod
+pod/perlguts.pod
+pod/perlhist.pod jhi
+pod/perlipc.pod tchrist
+pod/perllocale.pod locale
+pod/perllol.pod tchrist
+pod/perlmod.pod
+pod/perlmodinstall.pod jon
+pod/perlmodlib.pod
+pod/perlobj.pod
+pod/perlop.pod
+pod/perlpod.pod lwall
+pod/perlport.pod pudge
+pod/perlre.pod regex
+pod/perlref.pod
+pod/perlreftut.pod mjd
+pod/perlrun.pod
+pod/perlsec.pod
+pod/perlstyle.pod
+pod/perlsub.pod
+pod/perlsyn.pod
+pod/perltie.pod tchrist
+pod/perltoc.pod
+pod/perltoot.pod tchrist
+pod/perltrap.pod
+pod/perlvar.pod
+pod/perlxs.pod roehrich
+pod/perlxstut.pod okamoto
+pod/pod2html.PL
+pod/pod2latex.PL
+pod/pod2man.PL
+pod/pod2text.PL
+pod/roffitall
+pod/rofftoc
+pod/splitman
+pod/splitpod
+pp.c
+pp.h
+pp.sym
+pp_ctl.c
+pp_hot.c
+pp_proto.h
+pp_sys.c
+proto.h
+qnx/* qnx
+regcomp.c regex
+regcomp.h regex
+regcomp.pl regex
+regcomp.sym regex
+regexec.c regex
+regexp.h regex
+regnodes.h regex
+run.c
+scope.c
+scope.h
+sv.c
+sv.h
+t/README
+t/TEST
+t/UTEST
+t/base/cond.t
+t/base/if.t
+t/base/lex.t
+t/base/pat.t
+t/base/rs.t
+t/base/term.t
+t/cmd/elsif.t
+t/cmd/for.t
+t/cmd/mod.t
+t/cmd/subval.t
+t/cmd/switch.t
+t/cmd/while.t
+t/comp/cmdopt.t
+t/comp/colon.t
+t/comp/cpp.aux
+t/comp/cpp.t
+t/comp/decl.t
+t/comp/multiline.t
+t/comp/package.t
+t/comp/proto.t
+t/comp/redef.t
+t/comp/require.t
+t/comp/script.t
+t/comp/term.t
+t/comp/use.t
+t/harness
+t/io/argv.t
+t/io/dup.t
+t/io/fs.t
+t/io/inplace.t
+t/io/iprefix.t
+t/io/pipe.t
+t/io/print.t
+t/io/read.t
+t/io/tell.t
+t/lib/abbrev.t
+t/lib/anydbm.t
+t/lib/autoloader.t
+t/lib/basename.t
+t/lib/bigint.t
+t/lib/bigintpm.t
+t/lib/cgi-form.t
+t/lib/cgi-function.t
+t/lib/cgi-html.t
+t/lib/cgi-request.t
+t/lib/charnames.t ilya
+t/lib/checktree.t
+t/lib/complex.t complex
+t/lib/db-btree.t pmarquess
+t/lib/db-hash.t pmarquess
+t/lib/db-recno.t pmarquess
+t/lib/dirhand.t
+t/lib/dosglob.t
+t/lib/dumper-ovl.t gsar
+t/lib/dumper.t gsar
+t/lib/english.t
+t/lib/env.t
+t/lib/errno.t gbarr
+t/lib/fields.t
+t/lib/filecache.t
+t/lib/filecopy.t
+t/lib/filefind.t
+t/lib/filehand.t
+t/lib/filepath.t
+t/lib/filespec.t kjahds
+t/lib/findbin.t
+t/lib/gdbm.t
+t/lib/getopt.t jvromans
+t/lib/h2ph* kstar
+t/lib/hostname.t
+t/lib/io_* gbarr
+t/lib/ipc_sysv.t gbarr
+t/lib/ndbm.t
+t/lib/odbm.t
+t/lib/opcode.t
+t/lib/open2.t
+t/lib/open3.t
+t/lib/ops.t
+t/lib/parsewords.t
+t/lib/ph.t kstar
+t/lib/posix.t
+t/lib/safe1.t
+t/lib/safe2.t
+t/lib/sdbm.t
+t/lib/searchdict.t
+t/lib/selectsaver.t
+t/lib/socket.t
+t/lib/soundex.t
+t/lib/symbol.t
+t/lib/texttabs.t muir
+t/lib/textfill.t muir
+t/lib/textwrap.t
+t/lib/thr5005.t
+t/lib/tie-push.t
+t/lib/tie-stdarray.t
+t/lib/tie-stdpush.t
+t/lib/timelocal.t
+t/lib/trig.t
+t/op/append.t
+t/op/arith.t
+t/op/array.t
+t/op/assignwarn.t
+t/op/auto.t
+t/op/avhv.t
+t/op/bop.t
+t/op/chop.t
+t/op/closure.t
+t/op/cmp.t
+t/op/cond.t
+t/op/context.t
+t/op/defins.t
+t/op/delete.t
+t/op/die.t
+t/op/die_exit.t
+t/op/do.t
+t/op/each.t
+t/op/eval.t
+t/op/exec.t
+t/op/exp.t
+t/op/filetest.t
+t/op/flip.t
+t/op/fork.t
+t/op/glob.t
+t/op/goto.t
+t/op/goto_xs.t
+t/op/grent.t
+t/op/groups.t
+t/op/gv.t
+t/op/hashwarn.t
+t/op/inc.t
+t/op/index.t
+t/op/int.t
+t/op/join.t
+t/op/lex_assign.t
+t/op/list.t
+t/op/local.t
+t/op/magic.t
+t/op/method.t
+t/op/misc.t
+t/op/mkdir.t
+t/op/my.t
+t/op/nothr5005.t
+t/op/oct.t
+t/op/ord.t
+t/op/pack.t
+t/op/pat.t
+t/op/pos.t
+t/op/push.t
+t/op/pwent.t
+t/op/quotemeta.t
+t/op/rand.t
+t/op/range.t
+t/op/re_tests regex
+t/op/read.t
+t/op/readdir.t
+t/op/recurse.t
+t/op/ref.t
+t/op/regexp.t regex
+t/op/regexp_noamp.t regex
+t/op/repeat.t
+t/op/runlevel.t
+t/op/sleep.t
+t/op/sort.t
+t/op/splice.t
+t/op/split.t
+t/op/sprintf.t
+t/op/stat.t
+t/op/study.t
+t/op/subst.t
+t/op/substr.t
+t/op/sysio.t
+t/op/taint.t
+t/op/tie.t
+t/op/tiearray.t
+t/op/tiehandle.t
+t/op/time.t
+t/op/tr.t
+t/op/undef.t
+t/op/universal.t
+t/op/unshift.t
+t/op/vec.t
+t/op/wantarray.t
+t/op/write.t
+t/pod/* bradapp
+t/pragma/constant.t
+t/pragma/locale.t locale
+t/pragma/overload.t ilya
+t/pragma/strict-refs
+t/pragma/strict-subs
+t/pragma/strict-vars
+t/pragma/strict.t
+t/pragma/subs.t
+t/pragma/warn/* lexwarn
+t/pragma/warn/regcomp regex
+t/pragma/warn/regexec regex
+t/pragma/warning.t lexwarn
+taint.c
+thrdvar.h
+thread.h
+toke.c
+universal.c
+unixish.h
+utf* lwall
+utils/Makefile
+utils/c2ph.PL tchrist
+utils/h2ph.PL kstar
+utils/h2xs.PL
+utils/perlbug.PL
+utils/perlcc.PL
+utils/perldoc.PL
+utils/pl2pm.PL
+utils/splain.PL doc
+vmesa/* vmesa
+vms/* vms
+vos/* vos
+warning.h lexwarn
+warning.pl lexwarn
+win32/*
+writemain.SH
+x2p/EXTERN.h
+x2p/INTERN.h
+x2p/Makefile.SH
+x2p/a2p.c
+x2p/a2p.h
+x2p/a2p.pod
+x2p/a2p.y
+x2p/a2py.c
+x2p/cflags.SH
+x2p/find2perl.PL
+x2p/hash.c
+x2p/hash.h
+x2p/proto.h
+x2p/s2p.PL
+x2p/str.c
+x2p/str.h
+x2p/util.c
+x2p/util.h
+x2p/walk.c
diff --git a/contrib/perl5/MANIFEST b/contrib/perl5/MANIFEST
index f42a832..0a4ed09 100644
--- a/contrib/perl5/MANIFEST
+++ b/contrib/perl5/MANIFEST
@@ -1,3 +1,4 @@
+AUTHORS Contact info for contributors
Artistic The "Artistic License"
Changes Differences from previous version
Changes5.000 Differences between 4.x and 5.000
@@ -5,14 +6,15 @@ Changes5.001 Differences between 5.000 and 5.001
Changes5.002 Differences between 5.001 and 5.002
Changes5.003 Differences between 5.002 and 5.003
Changes5.004 Differences between 5.003 and 5.004
+Changes5.005 Differences between 5.004 and 5.005
Configure Portability tool
Copying The GNU General Public License
EXTERN.h Included before foreign .h files
INSTALL Detailed installation instructions
INTERN.h Included before domestic .h files
+MAINTAIN Who maintains which files
MANIFEST This list of files
Makefile.SH A script that generates Makefile
-objXSUB.h Scoping macros for Perl Object in extensions
Policy_sh.SH Hold site-wide preferences between Configure runs.
Porting/Contract Social contract for contributed modules in Perl core
Porting/Glossary Glossary of config.sh variables
@@ -24,39 +26,41 @@ Porting/fixvars Find undeclared variables with C compiler and fix em
Porting/genlog Generate formatted changelogs by querying p4d
Porting/makerel Release making utility
Porting/p4d2p Generate standard patches from p4 diffs
+Porting/p4desc Smarter 'p4 describe', outputs diffs for new files
Porting/patching.pod How to report changes made to Perl
Porting/patchls Flexible patch file listing utility
Porting/pumpkin.pod Guidelines and hints for Perl maintainers
README The Instructions
+README.Y2K Notes about Year 2000 concerns
README.amiga Notes about AmigaOS port
README.apollo Notes about Apollo DomainOS port
README.beos Notes about BeOS port
-README.cygwin32 Notes about Cygwin32 port
+README.cygwin Notes about Cygwin port
README.dos Notes about dos/djgpp port
+README.epoc Notes about EPOC port
README.hpux Notes about HP-UX port
README.hurd Notes about GNU/Hurd port
+README.machten Notes about Power MachTen port
README.mint Notes about Atari MiNT port
README.mpeix Notes about MPE/iX port
README.os2 Notes about OS/2 port
README.os390 Notes about OS/390 (nee MVS) port
README.plan9 Notes about Plan9 port
+README.posix-bc Notes about BS2000 POSIX port
README.qnx Notes about QNX port
README.threads Notes about multithreading
-README.vms Notes about VMS port
+README.vmesa Notes about VM/ESA port
+README.vms Notes about installing the VMS port
README.vos Notes about Stratus VOS port
README.win32 Notes about Win32 port
Todo The Wishlist
-Todo-5.005 What needs doing before 5.005 release
-XSlock.h Include file for extensions built with PERL_OBJECT defined
+Todo-5.6 What needs doing before/during the 5.6.x release cycle
XSUB.h Include file for extension subroutines
apollo/netinet/in.h Apollo DomainOS port: C header file frontend
av.c Array value code
av.h Array value header
beos/nm.c BeOS port
-bytecode.h Bytecode header for compiler
-bytecode.pl Produces byterun.h, byterun.c and ext/B/Asmdata.pm
-byterun.c Runtime support for compiler-generated bytecode
-byterun.h Header for byterun.c
+bytecode.pl Produces ext/ByteLoader/byterun.h, ext/ByteLoader/byterun.c and ext/B/Asmdata.pm
cc_runtime.h Macros need by runtime of compiler-generated code
cflags.SH A script that emits C compilation flags per file
config_h.SH Produces config.h
@@ -65,14 +69,13 @@ configure.com Configure-equivalent for VMS
configure.gnu Crude emulation of GNU configure
cop.h Control operator header
cv.h Code value header
-cygwin32/cw32imp.h Cygwin32 port
-cygwin32/gcc2 Cygwin32 port
-cygwin32/ld2 Cygwin32 port
-cygwin32/perlgcc Cygwin32 port
-cygwin32/perlld Cygwin32 port
+cygwin/cygwin.c Additional code for Cygwin port
+cygwin/Makefile.SHs Shared library generation for Cygwin port
+cygwin/ld2.in ld wrapper template for Cygwin port
+cygwin/perlld.in dll generator template for Cygwin port
deb.c Debugging routines
-djgpp/config.over DOS/DJGPP port
-djgpp/configure.bat DOS/DJGPP port
+djgpp/config.over DOS/DJGPP port
+djgpp/configure.bat DOS/DJGPP port
djgpp/djgpp.c DOS/DJGPP port
djgpp/djgppsed.sh DOS/DJGPP port
djgpp/fixpmain DOS/DJGPP port
@@ -90,7 +93,7 @@ eg/cgi/cookie.cgi CGI example
eg/cgi/crash.cgi CGI example
eg/cgi/customize.cgi CGI example
eg/cgi/diff_upload.cgi CGI example
-eg/cgi/dna.small.gif.uu Small image for CGI examples
+eg/cgi/dna_small_gif.uu Small image for CGI examples
eg/cgi/file_upload.cgi CGI example
eg/cgi/frameset.cgi CGI example
eg/cgi/index.html Index page for CGI examples
@@ -103,7 +106,7 @@ eg/cgi/nph-multipart.cgi CGI example
eg/cgi/popup.cgi CGI example
eg/cgi/save_state.cgi CGI example
eg/cgi/tryit.cgi CGI example
-eg/cgi/wilogo.gif.uu Small image for CGI examples
+eg/cgi/wilogo_gif.uu Small image for CGI examples
eg/changes A program to list recently changed files
eg/client A sample client
eg/down A program to do things to subdirectories
@@ -147,10 +150,18 @@ eg/van/vanish A program to put files in a trashcan
eg/who A sample who program
eg/wrapsuid A setuid script wrapper generator
emacs/cperl-mode.el An alternate perl-mode
+emacs/e2ctags.pl etags to ctags converter
emacs/ptags Creates smart TAGS file
embed.h Maps symbols to safer names
-embed.pl Produces embed.h
+embed.pl Produces {embed,embedvar,objXSUB,proto}.h, global.sym
embedvar.h C namespace management
+epoc/config.sh EPOC port config.sh template
+epoc/createpkg.pl EPOC port generate PKG file
+epoc/epoc.c EPOC port
+epoc/epoc_stubs.c EPOC port
+epoc/epocish.c EPOC port
+epoc/epocish.h EPOC port
+epoc/link.pl EPOC port link a exe
ext/B/B.pm Compiler backend support functions and methods
ext/B/B.xs Compiler backend external subroutines
ext/B/B/Asmdata.pm Compiler backend data for assembler
@@ -165,6 +176,7 @@ ext/B/B/Disassembler.pm Compiler Disassembler backend
ext/B/B/Lint.pm Compiler Lint backend
ext/B/B/Showlex.pm Compiler Showlex backend
ext/B/B/Stackobj.pm Compiler stack objects support functions
+ext/B/B/Stash.pm Compiler module to identify stashes
ext/B/B/Terse.pm Compiler Terse backend
ext/B/B/Xref.pm Compiler Xref backend
ext/B/B/assemble Assemble compiler bytecode
@@ -177,7 +189,7 @@ ext/B/O.pm Compiler front-end module (-MO=...)
ext/B/README Compiler backend README
ext/B/TESTS Compiler backend test data
ext/B/Todo Compiler backend Todo list
-ext/B/byteperl.c Bytecode runner
+ext/B/defsubs_h.PL Generator for constant subroutines
ext/B/ramblings/cc.notes Compiler ramblings: notes on CC backend
ext/B/ramblings/curcop.runtime Compiler ramblings: notes on curcop use
ext/B/ramblings/flip-flop Compiler ramblings: notes on flip-flop
@@ -185,54 +197,91 @@ ext/B/ramblings/magic Compiler ramblings: notes on magic
ext/B/ramblings/reg.alloc Compiler ramblings: register allocation
ext/B/ramblings/runtime.porting Compiler ramblings: porting PP enging
ext/B/typemap Compiler backend interface types
+ext/ByteLoader/ByteLoader.pm Bytecode loader Perl module
+ext/ByteLoader/ByteLoader.xs Bytecode loader external subroutines
+ext/ByteLoader/Makefile.PL Bytecode loader makefile writer
+ext/ByteLoader/bytecode.h Bytecode header for bytecode loader
+ext/ByteLoader/byterun.c Runtime support for bytecode loader
+ext/ByteLoader/byterun.h Header for byterun.c
+ext/ByteLoader/hints/sunos.pl Hints for named architecture
ext/DB_File/Changes Berkeley DB extension change log
ext/DB_File/DB_File.pm Berkeley DB extension Perl module
ext/DB_File/DB_File.xs Berkeley DB extension external subroutines
ext/DB_File/DB_File_BS Berkeley DB extension mkbootstrap fodder
ext/DB_File/Makefile.PL Berkeley DB extension makefile writer
ext/DB_File/dbinfo Berkeley DB database version checker
-ext/DB_File/hints/dynixptx.pl Hints for DB_File for named architecture
+ext/DB_File/hints/dynixptx.pl Hint for DB_File for named architecture
+ext/DB_File/hints/sco.pl Hint for DB_File for named architecture
ext/DB_File/typemap Berkeley DB extension interface types
+ext/DB_File/version.c Berkeley DB extension interface version check
ext/Data/Dumper/Changes Data pretty printer, changelog
ext/Data/Dumper/Dumper.pm Data pretty printer, module
ext/Data/Dumper/Dumper.xs Data pretty printer, externals
ext/Data/Dumper/Makefile.PL Data pretty printer, makefile writer
ext/Data/Dumper/Todo Data pretty printer, futures
+ext/Devel/DProf/Changes Perl code profiler changelog
+ext/Devel/DProf/DProf.pm Perl code profiler
+ext/Devel/DProf/DProf.xs Perl code profiler
+ext/Devel/DProf/Makefile.PL Perl code profiler makefile writer
+ext/Devel/DProf/Todo Perl code profiler todo list
+ext/Devel/Peek/Changes Data debugging tool, changelog
+ext/Devel/Peek/Makefile.PL Data debugging tool, makefile writer
+ext/Devel/Peek/Peek.pm Data debugging tool, module and pod
+ext/Devel/Peek/Peek.xs Data debugging tool, externals
ext/DynaLoader/DynaLoader_pm.PL Dynamic Loader perl module
ext/DynaLoader/Makefile.PL Dynamic Loader makefile writer
ext/DynaLoader/README Dynamic Loader notes and intro
+ext/DynaLoader/XSLoader_pm.PL Simple XS Loader perl module
ext/DynaLoader/dl_aix.xs AIX implementation
ext/DynaLoader/dl_beos.xs BeOS implementation
-ext/DynaLoader/dl_cygwin32.xs Cygwin32 implementation
ext/DynaLoader/dl_dld.xs GNU dld style implementation
ext/DynaLoader/dl_dlopen.xs BSD/SunOS4&5 dlopen() style implementation
+ext/DynaLoader/dl_dyld.xs NeXT/Apple dyld implementation
ext/DynaLoader/dl_hpux.xs HP-UX implementation
ext/DynaLoader/dl_mpeix.xs MPE/iX implementation
-ext/DynaLoader/dl_next.xs Next implementation
+ext/DynaLoader/dl_next.xs NeXT implementation
ext/DynaLoader/dl_none.xs Stub implementation
+ext/DynaLoader/dl_vmesa.xs VM/ESA implementation
ext/DynaLoader/dl_vms.xs VMS implementation
ext/DynaLoader/dlutils.c Dynamic loader utilities for dl_*.xs files
+ext/DynaLoader/hints/aix.pl Hint for DynaLoader for named architecture
+ext/DynaLoader/hints/linux.pl Hint for DynaLoader for named architecture
+ext/DynaLoader/hints/openbsd.pl Hint for DynaLoader for named architecture
ext/Errno/ChangeLog Errno perl module change log
ext/Errno/Errno_pm.PL Errno perl module create script
ext/Errno/Makefile.PL Errno extension makefile writer
ext/Fcntl/Fcntl.pm Fcntl extension Perl module
ext/Fcntl/Fcntl.xs Fcntl extension external subroutines
ext/Fcntl/Makefile.PL Fcntl extension makefile writer
+ext/File/Glob/Changes File::Glob extension changelog
+ext/File/Glob/Glob.pm File::Glob extension module
+ext/File/Glob/Glob.xs File::Glob extension external subroutines
+ext/File/Glob/Makefile.PL File::Glob extension makefile writer
+ext/File/Glob/TODO File::Glob extension todo list
+ext/File/Glob/bsd_glob.c File::Glob extension run time code
+ext/File/Glob/bsd_glob.h File::Glob extension header file
ext/GDBM_File/GDBM_File.pm GDBM extension Perl module
ext/GDBM_File/GDBM_File.xs GDBM extension external subroutines
ext/GDBM_File/Makefile.PL GDBM extension makefile writer
ext/GDBM_File/hints/sco.pl Hint for GDBM_File for named architecture
ext/GDBM_File/typemap GDBM extension interface types
+ext/IO/ChangeLog IO perl module change log
ext/IO/IO.pm Top-level interface to IO::* classes
ext/IO/IO.xs IO extension external subroutines
ext/IO/Makefile.PL IO extension makefile writer
ext/IO/README IO extension maintenance notice
-ext/IO/lib/IO/File.pm IO::File extension Perl module
-ext/IO/lib/IO/Handle.pm IO::Handle extension Perl module
-ext/IO/lib/IO/Pipe.pm IO::Pipe extension Perl module
-ext/IO/lib/IO/Seekable.pm IO::Seekable extension Perl module
-ext/IO/lib/IO/Select.pm IO::Select extension Perl module
-ext/IO/lib/IO/Socket.pm IO::Socket extension Perl module
+ext/IO/lib/IO/Dir.pm IO directory reading package
+ext/IO/lib/IO/File.pm IO file handle package
+ext/IO/lib/IO/Handle.pm IO base handle package
+ext/IO/lib/IO/Pipe.pm IO pipe package
+ext/IO/lib/IO/Poll.pm IO system poll() interface
+ext/IO/lib/IO/Seekable.pm IO methods for seekable handles
+ext/IO/lib/IO/Select.pm IO system select() interface
+ext/IO/lib/IO/Socket.pm IO socket handle package
+ext/IO/lib/IO/Socket/INET.pm IO INET specific socket methods
+ext/IO/lib/IO/Socket/UNIX.pm IO UNIX specific socket methods
+ext/IO/poll.c IO poll() emulation using select()
+ext/IO/poll.h IO poll() emulation using select()
ext/IPC/SysV/ChangeLog IPC::SysV extension Perl module
ext/IPC/SysV/MANIFEST IPC::SysV extension Perl module
ext/IPC/SysV/Makefile.PL IPC::SysV extension Perl module
@@ -241,19 +290,24 @@ ext/IPC/SysV/README IPC::SysV extension Perl module
ext/IPC/SysV/Semaphore.pm IPC::SysV extension Perl module
ext/IPC/SysV/SysV.pm IPC::SysV extension Perl module
ext/IPC/SysV/SysV.xs IPC::SysV extension Perl module
+ext/IPC/SysV/hints/cygwin.pl Hint for IPC::SysV for named architecture
+ext/IPC/SysV/hints/next_3.pl Hint for IPC::SysV for named architecture
ext/IPC/SysV/t/msg.t IPC::SysV extension Perl module
ext/IPC/SysV/t/sem.t IPC::SysV extension Perl module
ext/NDBM_File/Makefile.PL NDBM extension makefile writer
ext/NDBM_File/NDBM_File.pm NDBM extension Perl module
ext/NDBM_File/NDBM_File.xs NDBM extension external subroutines
+ext/NDBM_File/hints/cygwin.pl Hint for NDBM_File for named architecture
ext/NDBM_File/hints/dec_osf.pl Hint for NDBM_File for named architecture
ext/NDBM_File/hints/dynixptx.pl Hint for NDBM_File for named architecture
ext/NDBM_File/hints/solaris.pl Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/sco.pl Hint for NDBM_File for named architecture
ext/NDBM_File/hints/svr4.pl Hint for NDBM_File for named architecture
ext/NDBM_File/typemap NDBM extension interface types
ext/ODBM_File/Makefile.PL ODBM extension makefile writer
ext/ODBM_File/ODBM_File.pm ODBM extension Perl module
ext/ODBM_File/ODBM_File.xs ODBM extension external subroutines
+ext/ODBM_File/hints/cygwin.pl Hint for ODBM_File for named architecture
ext/ODBM_File/hints/dec_osf.pl Hint for ODBM_File for named architecture
ext/ODBM_File/hints/hpux.pl Hint for ODBM_File for named architecture
ext/ODBM_File/hints/sco.pl Hint for ODBM_File for named architecture
@@ -272,11 +326,11 @@ ext/POSIX/POSIX.pod POSIX extension documentation
ext/POSIX/POSIX.xs POSIX extension external subroutines
ext/POSIX/hints/bsdos.pl Hint for POSIX for named architecture
ext/POSIX/hints/dynixptx.pl Hint for POSIX for named architecture
-ext/POSIX/hints/freebsd.pl Hint for POSIX for named architecture
-ext/POSIX/hints/linux.pl Hint for POSIX for named architecture
-ext/POSIX/hints/mint.pl Hint for POSIX for named architecture
-ext/POSIX/hints/netbsd.pl Hint for POSIX for named architecture
-ext/POSIX/hints/next_3.pl Hint for POSIX for named architecture
+ext/POSIX/hints/freebsd.pl Hint for POSIX for named architecture
+ext/POSIX/hints/linux.pl Hint for POSIX for named architecture
+ext/POSIX/hints/mint.pl Hint for POSIX for named architecture
+ext/POSIX/hints/netbsd.pl Hint for POSIX for named architecture
+ext/POSIX/hints/next_3.pl Hint for POSIX for named architecture
ext/POSIX/hints/openbsd.pl Hint for POSIX for named architecture
ext/POSIX/hints/sunos_4.pl Hint for POSIX for named architecture
ext/POSIX/typemap POSIX extension interface types
@@ -312,6 +366,12 @@ ext/SDBM_File/typemap SDBM extension interface types
ext/Socket/Makefile.PL Socket extension makefile writer
ext/Socket/Socket.pm Socket extension Perl module
ext/Socket/Socket.xs Socket extension external subroutines
+ext/Sys/Hostname/Makefile.PL Sys::Hostname extension makefile writer
+ext/Sys/Hostname/Hostname.pm Sys::Hostname extension Perl module
+ext/Sys/Hostname/Hostname.xs Sys::Hostname extension external subroutines
+ext/Sys/Syslog/Makefile.PL Sys::Syslog extension makefile writer
+ext/Sys/Syslog/Syslog.pm Sys::Syslog extension Perl module
+ext/Sys/Syslog/Syslog.xs Sys::Syslog extension external subroutines
ext/Thread/Makefile.PL Thread extension makefile writer
ext/Thread/Notes Thread notes
ext/Thread/README Thread README
@@ -351,6 +411,7 @@ fakethr.h Fake threads header
form.h Public declarations for the above
global.sym Symbols that need hiding when embedded
globals.c File to declare global symbols (for shared library)
+globvar.sym Global variables that need hiding when embedded
gv.c Glob value code
gv.h Glob value header
h2pl/README How to turn .ph files into .pl files
@@ -379,7 +440,8 @@ hints/broken-db.msg Warning message for systems with broken DB library
hints/bsdos.sh Hints for named architecture
hints/convexos.sh Hints for named architecture
hints/cxux.sh Hints for named architecture
-hints/cygwin32.sh Hints for named architecture
+hints/cygwin.sh Hints for named architecture
+hints/darwin.sh Hints for named architecture
hints/dcosx.sh Hints for named architecture
hints/dec_osf.sh Hints for named architecture
hints/dgux.sh Hints for named architecture
@@ -420,8 +482,10 @@ hints/openbsd.sh Hints for named architecture
hints/opus.sh Hints for named architecture
hints/os2.sh Hints for named architecture
hints/os390.sh Hints for named architecture
+hints/posix-bc.sh Hints for named architecture
hints/powerux.sh Hints for named architecture
hints/qnx.sh Hints for named architecture
+hints/rhapsody.sh Hints for named architecture
hints/sco.sh Hints for named architecture
hints/sco_2_3_0.sh Hints for named architecture
hints/sco_2_3_1.sh Hints for named architecture
@@ -433,6 +497,7 @@ hints/stellar.sh Hints for named architecture
hints/sunos_4_0.sh Hints for named architecture
hints/sunos_4_1.sh Hints for named architecture
hints/svr4.sh Hints for named architecture
+hints/svr5.sh Hints for named architecture
hints/ti1500.sh Hints for named architecture
hints/titanos.sh Hints for named architecture
hints/ultrix_4.sh Hints for named architecture
@@ -443,6 +508,7 @@ hints/unisysdynix.sh Hints for named architecture
hints/utekv.sh Hints for named architecture
hints/uts.sh Hints for named architecture
hints/uwin.sh Hints for named architecture
+hints/vmesa.sh Hints for named architecture
hv.c Hash value code
hv.h Hash value header
installhtml Perl script to install html files for pods
@@ -450,6 +516,43 @@ installman Perl script to install man pages for pods
installperl Perl script to do "make install" dirty work
intrpvar.h Variables held in each interpreter instance
iperlsys.h Perl's interface to the system
+jpl/JNI/Changes Java Native Interface changes
+jpl/JNI/Closer.java Java Native Interface example
+jpl/JNI/JNI.pm Java Native Interface module
+jpl/JNI/JNI.xs Java Native Interface module
+jpl/JNI/JNIConfig Java Native Interface config
+jpl/JNI/JNIConfig.Win32 Java Native Interface config
+jpl/JNI/JNIConfig.kaffe Java Native Interface config
+jpl/JNI/JNIConfig.noembed Java Native Interface config
+jpl/JNI/JNIConfig.standard Java Native Interface config
+jpl/JNI/Makefile.PL Java Native Interface makefile generator
+jpl/JNI/test.pl Java Native Interface tests
+jpl/JNI/typemap Java/Perl interface typemap
+jpl/JNI/typemap.gcc Java/Perl interface typemap
+jpl/JNI/typemap.win32 Java/Perl interface typemap
+jpl/JPL/AutoLoader.pm Java/Perl compiler module
+jpl/JPL/Class.pm Java/Perl compiler module
+jpl/JPL/Compile.pm Java/Perl compiler module
+jpl/JPL/Makefile.PL Java/Perl makefile generator
+jpl/JPL_Rolo/JPL_Rolo.jpl Rolodex sample application
+jpl/JPL_Rolo/Makefile.PL Makefile generator
+jpl/JPL_Rolo/README Instructions
+jpl/JPL_Rolo/cardfile Rolodex sample application
+jpl/PerlInterpreter/Makefile.PL Makefile generator
+jpl/PerlInterpreter/PerlInterpreter.c Perl interpreter abstraction
+jpl/PerlInterpreter/PerlInterpreter.h Perl interpreter abstraction
+jpl/PerlInterpreter/PerlInterpreter.java Perl interpreter abstraction
+jpl/README JPL instructions
+jpl/SETVARS.PL JPL setup
+jpl/Sample/Makefile.PL JPL sample makefile generator
+jpl/Sample/Sample.jpl JPL sample
+jpl/Test/Makefile.PL JPL tests makefile generator
+jpl/Test/Test.jpl JPL tests
+jpl/bin/jpl JPL compiler
+jpl/get_jdk/README Instructions for using get_jdk.pl
+jpl/get_jdk/get_jdk.pl JDK download tool
+jpl/get_jdk/jdk_hosts JDK availability list
+jpl/install-jpl JPL install utility
keywords.h The keyword numbers
keywords.pl Program to write keywords.h
lib/AnyDBM_File.pm Perl module to emulate dbmopen
@@ -461,25 +564,30 @@ lib/CGI/Apache.pm Support for Apache's Perl module
lib/CGI/Carp.pm Log server errors with helpful context
lib/CGI/Cookie.pm Interface to Netscape Cookies
lib/CGI/Fast.pm Support for FastCGI (persistent server process)
+lib/CGI/Pretty.pm Output nicely formatted HTML
lib/CGI/Push.pm Support for server push
lib/CGI/Switch.pm Simple interface for multiple server types
lib/CPAN.pm Interface to Comprehensive Perl Archive Network
lib/CPAN/FirstTime.pm Utility for creating CPAN config files
lib/CPAN/Nox.pm Runs CPAN while avoiding compiled extensions
lib/Carp.pm Error message base class
+lib/Carp/Heavy.pm Error message workhorse
lib/Class/Struct.pm Declare struct-like datatypes as Perl classes
lib/Cwd.pm Various cwd routines (getcwd, fastcwd, chdir)
-lib/Devel/SelfStubber.pm Generate stubs for SelfLoader.pm
+lib/DB.pm Debugger API (draft)
+lib/Devel/SelfStubber.pm Generate stubs for SelfLoader.pm
lib/DirHandle.pm like FileHandle only for directories
lib/Dumpvalue.pm Screen dump of perl values
lib/English.pm Readable aliases for short variables
lib/Env.pm Map environment into ordinary variables
lib/Exporter.pm Exporter base class
+lib/Exporter/Heavy.pm Complicated routines for Exporter
lib/ExtUtils/Command.pm Utilities for Make on non-UNIX platforms
lib/ExtUtils/Embed.pm Utilities for embedding Perl in C programs
lib/ExtUtils/Install.pm Handles 'make install' on extensions
lib/ExtUtils/Installed.pm Information on installed extensions
lib/ExtUtils/Liblist.pm Locates libraries
+lib/ExtUtils/MM_Cygwin.pm MakeMaker methods for Cygwin
lib/ExtUtils/MM_OS2.pm MakeMaker methods for OS/2
lib/ExtUtils/MM_Unix.pm MakeMaker base class for Unix
lib/ExtUtils/MM_VMS.pm MakeMaker methods for VMS
@@ -502,6 +610,7 @@ lib/File/DosGlob.pm Win32 DOS-globbing module
lib/File/Find.pm Routines to do a find
lib/File/Path.pm Do things like `mkdir -p' and `rm -r'
lib/File/Spec.pm portable operations on file names
+lib/File/Spec/Functions.pm Function interface to File::Spec object methods
lib/File/Spec/Mac.pm portable operations on Mac file names
lib/File/Spec/OS2.pm portable operations on OS2 file names
lib/File/Spec/Unix.pm portable operations on Unix file names
@@ -525,16 +634,26 @@ lib/Net/hostent.pm By-name interface to Perl's builtin gethost*
lib/Net/netent.pm By-name interface to Perl's builtin getnet*
lib/Net/protoent.pm By-name interface to Perl's builtin getproto*
lib/Net/servent.pm By-name interface to Perl's builtin getserv*
+lib/Pod/Checker.pm Pod-Parser - check POD documents for syntax errors
+lib/Pod/Find.pm used by pod/splitpod
lib/Pod/Functions.pm used by pod/splitpod
lib/Pod/Html.pm Convert POD data to HTML
-lib/Pod/Text.pm Convert POD data to formatted ASCII text
+lib/Pod/InputObjects.pm Pod-Parser - define objects for input streams
+lib/Pod/Man.pm Convert POD data to *roff
+lib/Pod/ParseUtils.pm Pod-Parser - pod utility functions
+lib/Pod/Parser.pm Pod-Parser - define base class for parsing POD
+lib/Pod/Plainer.pm Pod migration utility module
+lib/Pod/Select.pm Pod-Parser - select portions of POD docs
+lib/Pod/Text.pm Pod-Parser - convert POD data to formatted ASCII text
+lib/Pod/Text/Color.pm Convert POD data to color ASCII text
+lib/Pod/Text/Termcap.pm Convert POD data to ASCII text with format escapes
+lib/Pod/Usage.pm Pod-Parser - print usage messages
lib/Search/Dict.pm Perform binary search on dictionaries
lib/SelectSaver.pm Enforce proper select scoping
lib/SelfLoader.pm Load functions only on demand
lib/Shell.pm Make AUTOLOADed system() calls
lib/Symbol.pm Symbol table manipulation routines
-lib/Sys/Hostname.pm Hostname methods
-lib/Sys/Syslog.pm Perl module supporting syslogging
+lib/Term/ANSIColor.pm Perl module supporting termcap usage
lib/Term/Cap.pm Perl module supporting termcap usage
lib/Term/Complete.pm A command completion subroutine
lib/Term/ReadLine.pm Stub readline library
@@ -560,14 +679,18 @@ lib/User/grent.pm By-name interface to Perl's builtin getgr*
lib/User/pwent.pm By-name interface to Perl's builtin getpw*
lib/abbrev.pl An abbreviation table builder
lib/assert.pl assertion and panic with stack trace
+lib/attributes.pm For "sub foo : attrlist"
lib/autouse.pm Load and call a function only when it's used
lib/base.pm Establish IS-A relationship at compile time
lib/bigfloat.pl An arbitrary precision floating point package
lib/bigint.pl An arbitrary precision integer arithmetic package
lib/bigrat.pl An arbitrary precision rational arithmetic package
lib/blib.pm For "use blib"
+lib/bytes.pm Pragma to enable byte operations
+lib/bytes_heavy.pl Support routines for byte pragma
lib/cacheout.pl Manages output filehandles when you need too many
-lib/chat2.pl Obsolete ipc library (use Comm.pm etc instead)
+lib/charnames.pm Character names
+lib/chat2.pl Obsolete ipc library (use Comm.pm etc instead)
lib/complete.pl A command completion subroutine
lib/constant.pm For "use constant"
lib/ctime.pl A ctime workalike
@@ -577,6 +700,7 @@ lib/dumpvar.pl A variable dumper
lib/exceptions.pl catch and throw routines
lib/fastcwd.pl a faster but more dangerous getcwd
lib/fields.pm Set up object field names for pseudo-hash-using classes
+lib/filetest.pm For "use filetest"
lib/find.pl A find emulator--used by find2perl
lib/finddepth.pl A depth-first find emulator--used by find2perl
lib/flush.pl Routines to do single flush
@@ -592,6 +716,7 @@ lib/lib.pm For "use lib"
lib/locale.pm For "use locale"
lib/look.pl A "look" equivalent
lib/newgetopt.pl A perl library supporting long option parsing
+lib/open.pm Pragma to specify default I/O disciplines
lib/open2.pl Open a two-ended pipe (uses IPC::Open2)
lib/open3.pl Open a three-ended pipe (uses IPC::Open3)
lib/overload.pm Module for overloading perl operators
@@ -606,9 +731,218 @@ lib/syslog.pl Perl library supporting syslogging
lib/tainted.pl Old code for tainting
lib/termcap.pl Perl library supporting termcap usage
lib/timelocal.pl Perl library supporting inverse of localtime, gmtime
+lib/unicode/ArabLink.pl Unicode character database
+lib/unicode/ArabLnkGrp.pl Unicode character database
+lib/unicode/ArabShap.txt Unicode character database
+lib/unicode/Bidirectional.pl Unicode character database
+lib/unicode/Block.pl Unicode character database
+lib/unicode/Blocks.txt Unicode character database
+lib/unicode/Category.pl Unicode character database
+lib/unicode/CombiningClass.pl Unicode character database
+lib/unicode/CompExcl.txt Unicode character database
+lib/unicode/Decomposition.pl Unicode character database
+lib/unicode/EAWidth.txt Unicode character database
+lib/unicode/In/AlphabeticPresentationForms.pl Unicode character database
+lib/unicode/In/Arabic.pl Unicode character database
+lib/unicode/In/ArabicPresentationForms-A.pl Unicode character database
+lib/unicode/In/ArabicPresentationForms-B.pl Unicode character database
+lib/unicode/In/Armenian.pl Unicode character database
+lib/unicode/In/Arrows.pl Unicode character database
+lib/unicode/In/BasicLatin.pl Unicode character database
+lib/unicode/In/Bengali.pl Unicode character database
+lib/unicode/In/BlockElements.pl Unicode character database
+lib/unicode/In/Bopomofo.pl Unicode character database
+lib/unicode/In/BopomofoExtended.pl Unicode character database
+lib/unicode/In/BoxDrawing.pl Unicode character database
+lib/unicode/In/BraillePatterns.pl Unicode character database
+lib/unicode/In/CJKCompatibility.pl Unicode character database
+lib/unicode/In/CJKCompatibilityForms.pl Unicode character database
+lib/unicode/In/CJKCompatibilityIdeographs.pl Unicode character database
+lib/unicode/In/CJKRadicalsSupplement.pl Unicode character database
+lib/unicode/In/CJKSymbolsandPunctuation.pl Unicode character database
+lib/unicode/In/CJKUnifiedIdeographs.pl Unicode character database
+lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl Unicode character database
+lib/unicode/In/Cherokee.pl Unicode character database
+lib/unicode/In/CombiningDiacriticalMarks.pl Unicode character database
+lib/unicode/In/CombiningHalfMarks.pl Unicode character database
+lib/unicode/In/CombiningMarksforSymbols.pl Unicode character database
+lib/unicode/In/ControlPictures.pl Unicode character database
+lib/unicode/In/CurrencySymbols.pl Unicode character database
+lib/unicode/In/Cyrillic.pl Unicode character database
+lib/unicode/In/Devanagari.pl Unicode character database
+lib/unicode/In/Dingbats.pl Unicode character database
+lib/unicode/In/EnclosedAlphanumerics.pl Unicode character database
+lib/unicode/In/EnclosedCJKLettersandMonths.pl Unicode character database
+lib/unicode/In/Ethiopic.pl Unicode character database
+lib/unicode/In/GeneralPunctuation.pl Unicode character database
+lib/unicode/In/GeometricShapes.pl Unicode character database
+lib/unicode/In/Georgian.pl Unicode character database
+lib/unicode/In/Greek.pl Unicode character database
+lib/unicode/In/GreekExtended.pl Unicode character database
+lib/unicode/In/Gujarati.pl Unicode character database
+lib/unicode/In/Gurmukhi.pl Unicode character database
+lib/unicode/In/HalfwidthandFullwidthForms.pl Unicode character database
+lib/unicode/In/HangulCompatibilityJamo.pl Unicode character database
+lib/unicode/In/HangulJamo.pl Unicode character database
+lib/unicode/In/HangulSyllables.pl Unicode character database
+lib/unicode/In/Hebrew.pl Unicode character database
+lib/unicode/In/HighPrivateUseSurrogates.pl Unicode character database
+lib/unicode/In/HighSurrogates.pl Unicode character database
+lib/unicode/In/Hiragana.pl Unicode character database
+lib/unicode/In/IPAExtensions.pl Unicode character database
+lib/unicode/In/IdeographicDescriptionCharacters.pl Unicode character database
+lib/unicode/In/Kanbun.pl Unicode character database
+lib/unicode/In/KangxiRadicals.pl Unicode character database
+lib/unicode/In/Kannada.pl Unicode character database
+lib/unicode/In/Katakana.pl Unicode character database
+lib/unicode/In/Khmer.pl Unicode character database
+lib/unicode/In/Lao.pl Unicode character database
+lib/unicode/In/Latin-1Supplement.pl Unicode character database
+lib/unicode/In/LatinExtended-A.pl Unicode character database
+lib/unicode/In/LatinExtended-B.pl Unicode character database
+lib/unicode/In/LatinExtendedAdditional.pl Unicode character database
+lib/unicode/In/LetterlikeSymbols.pl Unicode character database
+lib/unicode/In/LowSurrogates.pl Unicode character database
+lib/unicode/In/Malayalam.pl Unicode character database
+lib/unicode/In/MathematicalOperators.pl Unicode character database
+lib/unicode/In/MiscellaneousSymbols.pl Unicode character database
+lib/unicode/In/MiscellaneousTechnical.pl Unicode character database
+lib/unicode/In/Mongolian.pl Unicode character database
+lib/unicode/In/Myanmar.pl Unicode character database
+lib/unicode/In/NumberForms.pl Unicode character database
+lib/unicode/In/Ogham.pl Unicode character database
+lib/unicode/In/OpticalCharacterRecognition.pl Unicode character database
+lib/unicode/In/Oriya.pl Unicode character database
+lib/unicode/In/PrivateUse.pl Unicode character database
+lib/unicode/In/Runic.pl Unicode character database
+lib/unicode/In/Sinhala.pl Unicode character database
+lib/unicode/In/SmallFormVariants.pl Unicode character database
+lib/unicode/In/SpacingModifierLetters.pl Unicode character database
+lib/unicode/In/Specials.pl Unicode character database
+lib/unicode/In/SuperscriptsandSubscripts.pl Unicode character database
+lib/unicode/In/Syriac.pl Unicode character database
+lib/unicode/In/Tamil.pl Unicode character database
+lib/unicode/In/Telugu.pl Unicode character database
+lib/unicode/In/Thaana.pl Unicode character database
+lib/unicode/In/Thai.pl Unicode character database
+lib/unicode/In/Tibetan.pl Unicode character database
+lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl Unicode character database
+lib/unicode/In/YiRadicals.pl Unicode character database
+lib/unicode/In/YiSyllables.pl Unicode character database
+lib/unicode/Index.txt Unicode character database
+lib/unicode/Is/ASCII.pl Unicode character database
+lib/unicode/Is/Alnum.pl Unicode character database
+lib/unicode/Is/Alpha.pl Unicode character database
+lib/unicode/Is/BidiAN.pl Unicode character database
+lib/unicode/Is/BidiB.pl Unicode character database
+lib/unicode/Is/BidiCS.pl Unicode character database
+lib/unicode/Is/BidiEN.pl Unicode character database
+lib/unicode/Is/BidiES.pl Unicode character database
+lib/unicode/Is/BidiET.pl Unicode character database
+lib/unicode/Is/BidiL.pl Unicode character database
+lib/unicode/Is/BidiON.pl Unicode character database
+lib/unicode/Is/BidiR.pl Unicode character database
+lib/unicode/Is/BidiS.pl Unicode character database
+lib/unicode/Is/BidiWS.pl Unicode character database
+lib/unicode/Is/C.pl Unicode character database
+lib/unicode/Is/Cc.pl Unicode character database
+lib/unicode/Is/Cn.pl Unicode character database
+lib/unicode/Is/Cntrl.pl Unicode character database
+lib/unicode/Is/Co.pl Unicode character database
+lib/unicode/Is/DCcircle.pl Unicode character database
+lib/unicode/Is/DCcompat.pl Unicode character database
+lib/unicode/Is/DCfinal.pl Unicode character database
+lib/unicode/Is/DCfont.pl Unicode character database
+lib/unicode/Is/DCinital.pl Unicode character database
+lib/unicode/Is/DCinitial.pl Unicode character database
+lib/unicode/Is/DCisolated.pl Unicode character database
+lib/unicode/Is/DCnarrow.pl Unicode character database
+lib/unicode/Is/DCnoBreak.pl Unicode character database
+lib/unicode/Is/DCsmall.pl Unicode character database
+lib/unicode/Is/DCsquare.pl Unicode character database
+lib/unicode/Is/DCsub.pl Unicode character database
+lib/unicode/Is/DCsuper.pl Unicode character database
+lib/unicode/Is/DCvertical.pl Unicode character database
+lib/unicode/Is/DCwide.pl Unicode character database
+lib/unicode/Is/DecoCanon.pl Unicode character database
+lib/unicode/Is/DecoCompat.pl Unicode character database
+lib/unicode/Is/Digit.pl Unicode character database
+lib/unicode/Is/Graph.pl Unicode character database
+lib/unicode/Is/L.pl Unicode character database
+lib/unicode/Is/Ll.pl Unicode character database
+lib/unicode/Is/Lm.pl Unicode character database
+lib/unicode/Is/Lo.pl Unicode character database
+lib/unicode/Is/Lower.pl Unicode character database
+lib/unicode/Is/Lt.pl Unicode character database
+lib/unicode/Is/Lu.pl Unicode character database
+lib/unicode/Is/M.pl Unicode character database
+lib/unicode/Is/Mc.pl Unicode character database
+lib/unicode/Is/Mirrored.pl Unicode character database
+lib/unicode/Is/Mn.pl Unicode character database
+lib/unicode/Is/N.pl Unicode character database
+lib/unicode/Is/Nd.pl Unicode character database
+lib/unicode/Is/No.pl Unicode character database
+lib/unicode/Is/P.pl Unicode character database
+lib/unicode/Is/Pd.pl Unicode character database
+lib/unicode/Is/Pe.pl Unicode character database
+lib/unicode/Is/Po.pl Unicode character database
+lib/unicode/Is/Print.pl Unicode character database
+lib/unicode/Is/Ps.pl Unicode character database
+lib/unicode/Is/Punct.pl Unicode character database
+lib/unicode/Is/S.pl Unicode character database
+lib/unicode/Is/Sc.pl Unicode character database
+lib/unicode/Is/Sm.pl Unicode character database
+lib/unicode/Is/So.pl Unicode character database
+lib/unicode/Is/Space.pl Unicode character database
+lib/unicode/Is/SylA.pl Unicode character database
+lib/unicode/Is/SylC.pl Unicode character database
+lib/unicode/Is/SylE.pl Unicode character database
+lib/unicode/Is/SylI.pl Unicode character database
+lib/unicode/Is/SylO.pl Unicode character database
+lib/unicode/Is/SylU.pl Unicode character database
+lib/unicode/Is/SylV.pl Unicode character database
+lib/unicode/Is/SylWA.pl Unicode character database
+lib/unicode/Is/SylWC.pl Unicode character database
+lib/unicode/Is/SylWE.pl Unicode character database
+lib/unicode/Is/SylWI.pl Unicode character database
+lib/unicode/Is/SylWV.pl Unicode character database
+lib/unicode/Is/Syllable.pl Unicode character database
+lib/unicode/Is/Upper.pl Unicode character database
+lib/unicode/Is/Word.pl Unicode character database
+lib/unicode/Is/XDigit.pl Unicode character database
+lib/unicode/Is/Z.pl Unicode character database
+lib/unicode/Is/Zl.pl Unicode character database
+lib/unicode/Is/Zp.pl Unicode character database
+lib/unicode/Is/Zs.pl Unicode character database
+lib/unicode/Jamo.txt Unicode character database
+lib/unicode/JamoShort.pl Unicode character database
+lib/unicode/LineBrk.txt Unicode character database
+lib/unicode/Makefile Unicode character database
+lib/unicode/Name.pl Unicode character database
+lib/unicode/Names.txt Unicode character database
+lib/unicode/NamesList.html Unicode character database
+lib/unicode/Number.pl Unicode character database
+lib/unicode/Props.txt Unicode character database
+lib/unicode/README.Ethiopic Unicode character database
+lib/unicode/ReadMe.txt Unicode character database info
+lib/unicode/SpecCase.txt Unicode character database
+lib/unicode/To/Digit.pl Unicode character database
+lib/unicode/To/Lower.pl Unicode character database
+lib/unicode/To/Title.pl Unicode character database
+lib/unicode/To/Upper.pl Unicode character database
+lib/unicode/UCD300.html Unicode character database
+lib/unicode/Unicode.300 Unicode character database
+lib/unicode/Unicode3.html Unicode character database
+lib/unicode/mktables.PL Unicode character database generator
+lib/unicode/syllables.txt Unicode character database
+lib/utf8.pm Pragma to control Unicode support
+lib/utf8_heavy.pl Support routines for utf8 pragma
lib/validate.pl Perl library supporting wholesale file mode validation
lib/vars.pm Declare pseudo-imported global variables
+lib/warnings.pm For "use warnings"
+lib/warnings/register.pm For "use warnings::register"
makeaperl.SH perl script that produces a new perl binary
+makedef.pl Create symbol export lists for linking
makedepend.SH Precursor to makedepend
makedir.SH Precursor to makedir
malloc.c A version of malloc you might not want
@@ -616,10 +950,10 @@ mg.c Magic code
mg.h Magic header
minimod.pl Writes lib/ExtUtils/Miniperl.pm
miniperlmain.c Basic perl w/o dynamic loading or extensions
-mint/errno.h MiNT port
mint/Makefile MiNT port
-mint/pwd.c MiNT port
mint/README MiNT port
+mint/errno.h MiNT port
+mint/pwd.c MiNT port
mint/stdio.h MiNT port
mint/sys/time.h MiNT port
mint/time.h MiNT port
@@ -627,13 +961,14 @@ mpeix/mpeixish.h MPE/iX port
mpeix/nm MPE/iX port
mpeix/relink MPE/iX port
mv-if-diff Script to mv a file if it changed
-myconfig Prints summary of the current configuration
+myconfig.SH Prints summary of the current configuration
nostdio.h Cause compile error on stdio calls
-objpp.h Scoping macros for Perl Object
+objXSUB.h Scoping macros for Perl Object in extensions
op.c Opcode syntax tree code
op.h Opcode syntax tree header
opcode.h Automatically generated opcode header
opcode.pl Opcode header generatore
+opnames.h Automatically generated opcode header
os2/Changes Changelog for OS/2 port
os2/Makefile.SHs Shared library generation for OS/2
os2/OS2/ExtAttr/Changes EA access module
@@ -657,11 +992,17 @@ os2/OS2/Process/Process.pm system() constants in a module
os2/OS2/Process/Process.xs system() constants in a module
os2/OS2/REXX/Changes DLL access module
os2/OS2/REXX/MANIFEST DLL access module
+os2/OS2/REXX/DLL/Changes DLL access module
+os2/OS2/REXX/DLL/DLL.pm DLL access module
+os2/OS2/REXX/DLL/DLL.xs DLL access module
+os2/OS2/REXX/DLL/MANIFEST DLL access module
+os2/OS2/REXX/DLL/Makefile.PL DLL access module
os2/OS2/REXX/Makefile.PL DLL access module
os2/OS2/REXX/REXX.pm DLL access module
os2/OS2/REXX/REXX.xs DLL access module
os2/OS2/REXX/t/rx_cmprt.t DLL access module
os2/OS2/REXX/t/rx_dllld.t DLL access module
+os2/OS2/REXX/t/rx_emxrv.t DLL access module
os2/OS2/REXX/t/rx_objcall.t DLL access module
os2/OS2/REXX/t/rx_sql.test DLL access module
os2/OS2/REXX/t/rx_tiesql.test DLL access module
@@ -669,7 +1010,6 @@ os2/OS2/REXX/t/rx_tievar.t DLL access module
os2/OS2/REXX/t/rx_tieydb.t DLL access module
os2/OS2/REXX/t/rx_varset.t DLL access module
os2/OS2/REXX/t/rx_vrexx.t DLL access module
-os2/POSIX.mkfifo POSIX.xs patch
os2/diff.configure Patches to Configure
os2/dl_os2.c Addon for dl_open
os2/dlfcn.h Addon for dl_open
@@ -681,7 +1021,8 @@ os2/perl2cmd.pl Corrects installed binaries under OS/2
patchlevel.h The current patch level of perl
perl.c main()
perl.h Global declarations
-perl_exp.SH Creates list of exported symbols for AIX
+perlapi.c Perl API functions
+perlapi.h Perl API function declarations
perlio.c C code for PerlIO abstraction
perlio.h compatibility stub
perlio.sym Symbols for PerlIO abstraction
@@ -690,10 +1031,10 @@ perlsfio.h Prototype sfio mapping for PerlIO
perlsh A poor man's perl shell
perlvars.h Global variables
perly.c A byacc'ed perly.y
-perly_c.diff Fixup perly.c to allow recursion
perly.fixer A program to remove yacc stack limitations
perly.h The header file for perly.c
perly.y Yacc grammar for perl
+perly_c.diff Fixup perly.c to allow recursion
plan9/aperl Shell to make Perl error messages Acme-friendly
plan9/arpa/inet.h Plan9 port: replacement C header file
plan9/buildinfo Plan9 port: configuration information
@@ -710,17 +1051,24 @@ plan9/plan9ish.h Plan9 port: Plan9-specific C header file
plan9/setup.rc Plan9 port: script for easy build+install
plan9/versnum Plan9 port: script to print version number
pod/Makefile Make pods into something else
+pod/Win32.pod Documentation for Win32 extras
pod/buildtoc generate perltoc.pod
pod/checkpods.PL Tool to check for common errors in pods
pod/perl.pod Top level perl man page
+pod/perl5004delta.pod Changes from 5.003 to 5.004
+pod/perl5005delta.pod Changes from 5.004 to 5.005
+pod/perlapi.pod Perl API documentation (autogenerated)
pod/perlapio.pod IO API info
pod/perlbook.pod Book info
+pod/perlboot.pod Beginner's Object-oriented Tutorial
pod/perlbot.pod Object-oriented Bag o' Tricks
pod/perlcall.pod Callback info
+pod/perlcompile.pod Info on using the Compiler suite
pod/perldata.pod Data structure info
+pod/perldbmfilter.pod Info about DBM Filters
+pod/perldebguts.pod Debugger guts info
pod/perldebug.pod Debugger info
pod/perldelta.pod Changes since last version
-pod/perl5004delta.pod Changes from 5.003 to 5.004
pod/perldiag.pod Diagnostic info
pod/perldsc.pod Data Structures Cookbook
pod/perlembed.pod Embedding info
@@ -734,16 +1082,22 @@ pod/perlfaq6.pod Frequently Asked Questions, Part 6
pod/perlfaq7.pod Frequently Asked Questions, Part 7
pod/perlfaq8.pod Frequently Asked Questions, Part 8
pod/perlfaq9.pod Frequently Asked Questions, Part 9
+pod/perlfilter.pod Source filters info
+pod/perlfork.pod Info about fork()
pod/perlform.pod Format info
pod/perlfunc.pod Function info
pod/perlguts.pod Internals info
+pod/perlhack.pod Perl hackers guide
pod/perlhist.pod Perl history info
+pod/perlintern.pod Perl internal function docs (autogenrated)
pod/perlipc.pod IPC info
+pod/perllexwarn.pod Lexical Warnings info
pod/perllocale.pod Locale support info
pod/perllol.pod How to use lists of lists
pod/perlmod.pod Module mechanism info
pod/perlmodinstall.pod Installing CPAN Modules
pod/perlmodlib.pod Module policy info
+pod/perlnumber.pod Semantics of numbers and numeric operations
pod/perlobj.pod Object info
pod/perlop.pod Operator info
pod/perlopentut.pod open() tutorial
@@ -751,7 +1105,7 @@ pod/perlpod.pod Pod info
pod/perlport.pod Portability guide
pod/perlre.pod Regular expression info
pod/perlref.pod References info
-pod/perlreftut.pod References tutorial
+pod/perlreftut.pod Mark's references tutorial
pod/perlrun.pod Execution info
pod/perlsec.pod Security info
pod/perlstyle.pod Style info
@@ -760,8 +1114,11 @@ pod/perlsyn.pod Syntax info
pod/perlthrtut.pod Threads tutorial
pod/perltie.pod Tieing an object class into a simple variable
pod/perltoc.pod Table of Contents info
+pod/perltodo.pod Todo list explained
pod/perltoot.pod Tom's object-oriented tutorial
+pod/perltootc.pod Tom's object-oriented tutorial (more on class data)
pod/perltrap.pod Trap info
+pod/perlunicode.pod Unicode support info
pod/perlvar.pod Variable info
pod/perlxs.pod XS api info
pod/perlxstut.pod XS tutorial
@@ -769,12 +1126,16 @@ pod/pod2html.PL Precursor for translator to turn pod into HTML
pod/pod2latex.PL Precursor for translator to turn pod into LaTeX
pod/pod2man.PL Precursor for translator to turn pod into manpage
pod/pod2text.PL Precursor for translator to turn pod into text
+pod/pod2usage.PL Pod-Parser - print usage messages from POD docs
+pod/podchecker.PL Pod-Parser - Pod::Checker::podchecker() CLI
+pod/podselect.PL Pod-Parser - Pod::Select::podselect() CLI
pod/roffitall troff the whole man page set
pod/rofftoc Generate a table of contents in troff format
pod/splitman Splits perlfunc into multiple man pages
pod/splitpod Splits perlfunc into multiple pod pages
pp.c Push/Pop code
pp.h Push/Pop code defs
+pp.sym Push/Pop code symbols
pp_ctl.c Push/Pop code for control flow
pp_hot.c Push/Pop code for heavily used opcodes
pp_proto.h C++ definitions for Push/Pop code
@@ -796,6 +1157,7 @@ sv.c Scalar value code
sv.h Scalar value header
t/README Instructions for regression tests
t/TEST The regression tester
+t/UTEST Run regression tests with -Mutf8
t/base/cond.t See if conditionals work
t/base/if.t See if if works
t/base/lex.t See if lexical items work
@@ -808,6 +1170,7 @@ t/cmd/mod.t See if statement modifiers work
t/cmd/subval.t See if subroutine values work
t/cmd/switch.t See if switch optimizations work
t/cmd/while.t See if while loops work
+t/comp/bproto.t See if builtins conform to their prototypes
t/comp/cmdopt.t See if command optimization works
t/comp/colon.t See if colons are parsed correctly
t/comp/cpp.aux main file for cpp.t
@@ -827,20 +1190,28 @@ t/io/dup.t See if >& works right
t/io/fs.t See if directory manipulations work
t/io/inplace.t See if inplace editing works
t/io/iprefix.t See if inplace editing works with prefixes
+t/io/nargv.t See if nested ARGV stuff works
+t/io/open.t See if open works
+t/io/openpid.t See if open works for subprocesses
t/io/pipe.t See if secure pipes work
t/io/print.t See if print commands work
t/io/read.t See if read works
t/io/tell.t See if file seeking works
t/lib/abbrev.t See if Text::Abbrev works
+t/lib/ansicolor.t See if Term::ANSIColor works
t/lib/anydbm.t See if AnyDBM_File works
+t/lib/attrs.t See if attrs works with C<sub : attrs>
t/lib/autoloader.t See if AutoLoader works
t/lib/basename.t See if File::Basename works
+t/lib/bigfloat.t See if bigfloat.pl works
+t/lib/bigfltpm.t See if BigFloat.pm works
t/lib/bigint.t See if bigint.pl works
t/lib/bigintpm.t See if BigInt.pm works
t/lib/cgi-form.t See if CGI.pm works
t/lib/cgi-function.t See if CGI.pm works
t/lib/cgi-html.t See if CGI.pm works
t/lib/cgi-request.t See if CGI.pm works
+t/lib/charnames.t See if character names work
t/lib/checktree.t See if File::CheckTree works
t/lib/complex.t See if Math::Complex works
t/lib/db-btree.t See if DB_File works
@@ -848,33 +1219,62 @@ t/lib/db-hash.t See if DB_File works
t/lib/db-recno.t See if DB_File works
t/lib/dirhand.t See if DirHandle works
t/lib/dosglob.t See if File::DosGlob works
+t/lib/dprof.t Perl code profiler testsuite driver
+t/lib/dprof/V.pm Perl code profiler tests
+t/lib/dprof/test1_t Perl code profiler tests
+t/lib/dprof/test1_v Perl code profiler tests
+t/lib/dprof/test2_t Perl code profiler tests
+t/lib/dprof/test2_v Perl code profiler tests
+t/lib/dprof/test3_t Perl code profiler tests
+t/lib/dprof/test3_v Perl code profiler tests
+t/lib/dprof/test4_t Perl code profiler tests
+t/lib/dprof/test4_v Perl code profiler tests
+t/lib/dprof/test5_t Perl code profiler tests
+t/lib/dprof/test5_v Perl code profiler tests
+t/lib/dprof/test6_t Perl code profiler tests
+t/lib/dprof/test6_v Perl code profiler tests
t/lib/dumper-ovl.t See if Data::Dumper works for overloaded data
t/lib/dumper.t See if Data::Dumper works
t/lib/english.t See if English works
t/lib/env.t See if Env works
+t/lib/env-array.t See if Env works for arrays
t/lib/errno.t See if Errno works
t/lib/fatal.t See if Fatal works
t/lib/fields.t See if base/fields works
t/lib/filecache.t See if FileCache works
t/lib/filecopy.t See if File::Copy works
t/lib/filefind.t See if File::Find works
+t/lib/filefunc.t See if File::Spec::Functions works
t/lib/filehand.t See if FileHandle works
t/lib/filepath.t See if File::Path works
t/lib/filespec.t See if File::Spec works
t/lib/findbin.t See if FindBin works
t/lib/gdbm.t See if GDBM_File works
-t/lib/getopt.t See if Getopt::Std and Getopt::Long works
+t/lib/getopt.t See if Getopt::Std and Getopt::Long work
+t/lib/glob-basic.t See if File::Glob works
+t/lib/glob-case.t See if File::Glob works
+t/lib/glob-global.t See if File::Glob works
+t/lib/glob-taint.t See if File::Glob works
+t/lib/gol-basic.t See if Getopt::Long works
+t/lib/gol-compat.t See if Getopt::Long works
+t/lib/gol-linkage.t See if Getopt::Long works
t/lib/h2ph.h Test header file for h2ph
t/lib/h2ph.pht Generated output from h2ph.h by h2ph, for comparison
t/lib/h2ph.t See if h2ph works like it should
t/lib/hostname.t See if Sys::Hostname works
+t/lib/io_const.t See if constants from IO work
+t/lib/io_dir.t See if directory-related methods from IO work
t/lib/io_dup.t See if dup()-related methods from IO work
+t/lib/io_linenum.t See if I/O line numbers are tracked correctly
+t/lib/io_multihomed.t See if INET sockets work with multi-homed hosts
t/lib/io_pipe.t See if pipe()-related methods from IO work
+t/lib/io_poll.t See if poll()-related methods from IO work
t/lib/io_sel.t See if select()-related methods from IO work
t/lib/io_sock.t See if INET socket-related methods from IO work
t/lib/io_taint.t See if the untaint method from IO works
t/lib/io_tell.t See if seek()/tell()-related methods from IO work
t/lib/io_udp.t See if UDP socket-related methods from IO work
+t/lib/io_unix.t See if UNIX socket-related methods from IO work
t/lib/io_xs.t See if XSUB methods from IO work
t/lib/ipc_sysv.t See if IPC::SysV works
t/lib/ndbm.t See if NDBM_File works
@@ -894,22 +1294,28 @@ t/lib/selectsaver.t See if SelectSaver works
t/lib/socket.t See if Socket works
t/lib/soundex.t See if Soundex works
t/lib/symbol.t See if Symbol works
-t/lib/texttabs.t See if Text::Tabs works
+t/lib/syslfs.t See if large files work for sysio
t/lib/textfill.t See if Text::Wrap::fill works
+t/lib/texttabs.t See if Text::Tabs works
t/lib/textwrap.t See if Text::Wrap::wrap works
-t/lib/thread.t Basic test of threading (skipped if no threads)
+t/lib/thr5005.t Test 5.005-style threading (skipped if no use5005threads)
t/lib/tie-push.t Test for Tie::Array
t/lib/tie-stdarray.t Test for Tie::StdArray
+t/lib/tie-stdhandle.t Test for Tie::StdHandle
t/lib/tie-stdpush.t Test for Tie::StdArray
t/lib/timelocal.t See if Time::Local works
t/lib/trig.t See if Math::Trig works
+t/op/64bitint.t See if 64 bit integers work
t/op/append.t See if . works
+t/op/args.t See if operations on @_ work
t/op/arith.t See if arithmetic works
t/op/array.t See if array operations work
t/op/assignwarn.t See if OP= operators warn correctly for undef targets
+t/op/attrs.t See if attributes on declarations work
t/op/auto.t See if autoincrement et all work
t/op/avhv.t See if pseudo-hashes work
t/op/bop.t See if bitops work
+t/op/chars.t See if character escapes work
t/op/chop.t See if chop works
t/op/closure.t See if closures work
t/op/cmp.t See if the various string and numeric compare work
@@ -923,12 +1329,16 @@ t/op/do.t See if subroutines work
t/op/each.t See if hash iterators work
t/op/eval.t See if eval operator works
t/op/exec.t See if exec and system work
+t/op/exists_sub.t See if exists(&sub) works
t/op/exp.t See if math functions work
+t/op/fh.t See if filehandles work
+t/op/filetest.t See if file tests work
t/op/flip.t See if range operator works
t/op/fork.t See if fork works
t/op/glob.t See if <*> works
t/op/goto.t See if goto works
t/op/goto_xs.t See if "goto &sub" works on XSUBs
+t/op/grent.t See if getgr*() functions work
t/op/grep.t See if grep() and map() work
t/op/groups.t See if $( works
t/op/gv.t See if typeglobs work
@@ -937,20 +1347,25 @@ t/op/inc.t See if inc/dec of integers near 32 bit limit work
t/op/index.t See if index works
t/op/int.t See if int works
t/op/join.t See if join works
+t/op/lex_assign.t See if ops involving lexicals or pad temps work
+t/op/lfs.t See if large files work for perlio
t/op/list.t See if array lists work
t/op/local.t See if local works
+t/op/lop.t See if logical operators work
t/op/magic.t See if magic variables work
t/op/method.t See if method calls work
t/op/misc.t See if miscellaneous bugs have been fixed
t/op/mkdir.t See if mkdir works
t/op/my.t See if lexical scoping works
-t/op/nothread.t local @_ test which does not work threaded
+t/op/nothr5005.t local @_ test which does not work under use5005threads
+t/op/numconvert.t See if accessing fields does not change numeric values
t/op/oct.t See if oct and hex work
t/op/ord.t See if ord works
t/op/pack.t See if pack and unpack work
t/op/pat.t See if esoteric patterns work
t/op/pos.t See if pos works
t/op/push.t See if push and pop work
+t/op/pwent.t See if getpw*() functions work
t/op/quotemeta.t See if quotemeta works
t/op/rand.t See if rand works
t/op/range.t See if .. works
@@ -965,12 +1380,14 @@ t/op/repeat.t See if x operator works
t/op/runlevel.t See if die() works from perl_call_*()
t/op/sleep.t See if sleep works
t/op/sort.t See if sort works
-t/op/splice.t See if splice works
+t/op/splice.t See if splice works
t/op/split.t See if split works
t/op/sprintf.t See if sprintf works
t/op/stat.t See if stat works
t/op/study.t See if study works
t/op/subst.t See if substitution works
+t/op/subst_amp.t See if $&-related substitution works
+t/op/subst_wamp.t See if substitution works with $& present
t/op/substr.t See if substr works
t/op/sysio.t See if sysread and syswrite work
t/op/taint.t See if tainting works
@@ -983,36 +1400,111 @@ t/op/undef.t See if undef works
t/op/universal.t See if UNIVERSAL class works
t/op/unshift.t See if unshift works
t/op/vec.t See if vectors work
+t/op/ver.t See if v-strings and the %v format flag work
t/op/wantarray.t See if wantarray works
t/op/write.t See if write works
+t/pod/emptycmd.t Test empty pod directives
+t/pod/emptycmd.xr Expected results for emptycmd.t
+t/pod/for.t Test =for directive
+t/pod/for.xr Expected results for for.t
+t/pod/headings.t Test =head directives
+t/pod/headings.xr Expected results for headings.t
+t/pod/include.t Test =include directive
+t/pod/include.xr Expected results for include.t
+t/pod/included.t Test =include directive
+t/pod/included.xr Expected results for included.t
+t/pod/lref.t Test L<...> sequences
+t/pod/lref.xr Expected results for lref.t
+t/pod/multiline_items.t Test multiline =items
+t/pod/multiline_items.xr Test multiline =items
+t/pod/nested_items.t Test nested =items
+t/pod/nested_items.xr Expected results for nested_items.t
+t/pod/nested_seqs.t Test nested interior sequences
+t/pod/nested_seqs.xr Expected results for nested_seqs.t
+t/pod/oneline_cmds.t Test single paragraph ==cmds
+t/pod/oneline_cmds.xr Expected results for oneline_cmds.t
+t/pod/pod2usage.t Test Pod::Usage
+t/pod/pod2usage.xr Expected results for pod2usage.t
+t/pod/poderrs.t Test POD errors
+t/pod/poderrs.xr Expected results for emptycmd.t
+t/pod/podselect.t Test Pod::Select
+t/pod/podselect.xr Expected results for podselect.t
+t/pod/special_seqs.t Test "special" interior sequences
+t/pod/special_seqs.xr Expected results for emptycmd.t
+t/pod/testcmp.pl Module to compare output against expected results
+t/pod/testp2pt.pl Module to test Pod::PlainText for a given file
+t/pod/testpchk.pl Module to test Pod::Checker for a given file
t/pragma/constant.t See if compile-time constants work
-t/pragma/locale.t See if locale support (i18n and l10n) works
+t/pragma/diagnostics.t See if diagnostics.pm works
+t/pragma/locale.t See if locale support works
+t/pragma/locale/latin1 Part of locale.t in Latin 1
+t/pragma/locale/utf8 Part of locale.t in UTF8
t/pragma/overload.t See if operator overloading works
t/pragma/strict-refs Tests of "use strict 'refs'" for strict.t
t/pragma/strict-subs Tests of "use strict 'subs'" for strict.t
t/pragma/strict-vars Tests of "use strict 'vars'" for strict.t
t/pragma/strict.t See if strictures work
t/pragma/subs.t See if subroutine pseudo-importation works
-t/pragma/warn-1global Tests of global warnings for warning.t
-t/pragma/warning.t See if warning controls work
+t/pragma/sub_lval.t See if lvalue subroutines work
+t/pragma/utf8.t See if utf8 operations work
+t/pragma/warn/1global Tests of global warnings for warnings.t
+t/pragma/warn/2use Tests for "use warnings" for warnings.t
+t/pragma/warn/3both Tests for interaction of $^W and "use warnings"
+t/pragma/warn/4lint Tests for -W switch
+t/pragma/warn/5nolint Tests for -X switch
+t/pragma/warn/6default Tests default warnings
+t/pragma/warn/7fatal Tests fatal warnings
+t/pragma/warn/8signal Tests warnings + __WARN__ and __DIE__
+t/pragma/warn/9enabled Tests warnings
+t/pragma/warn/av Tests for av.c for warnings.t
+t/pragma/warn/doio Tests for doio.c for warnings.t
+t/pragma/warn/doop Tests for doop.c for warnings.t
+t/pragma/warn/gv Tests for gv.c for warnings.t
+t/pragma/warn/hv Tests for hv.c for warnings.t
+t/pragma/warn/malloc Tests for malloc.c for warnings.t
+t/pragma/warn/mg Tests for mg.c for warnings.t
+t/pragma/warn/op Tests for op.c for warnings.t
+t/pragma/warn/perl Tests for perl.c for warnings.t
+t/pragma/warn/perlio Tests for perlio.c for warnings.t
+t/pragma/warn/perly Tests for perly.y for warnings.t
+t/pragma/warn/pp Tests for pp.c for warnings.t
+t/pragma/warn/pp_ctl Tests for pp_ctl.c for warnings.t
+t/pragma/warn/pp_hot Tests for pp_hot.c for warnings.t
+t/pragma/warn/pp_sys Tests for pp_sys.c for warnings.t
+t/pragma/warn/regcomp Tests for regcomp.c for warnings.t
+t/pragma/warn/regexec Tests for regexec.c for warnings.t
+t/pragma/warn/run Tests for run.c for warnings.t
+t/pragma/warn/sv Tests for sv.c for warnings.t
+t/pragma/warn/taint Tests for taint.c for warnings.t
+t/pragma/warn/toke Tests for toke.c for warnings.t
+t/pragma/warn/universal Tests for universal.c for warnings.t
+t/pragma/warn/utf8 Tests for utf8.c for warnings.t
+t/pragma/warn/util Tests for util.c for warnings.t
+t/pragma/warnings.t See if warning controls work
taint.c Tainting code
thrdvar.h Per-thread variables
thread.h Threading header
-thread.sym Symbols for threads
toke.c The tokener
universal.c The default UNIVERSAL package methods
unixish.h Defines that are assumed on Unix
+utf8.c Unicode routines
+utf8.h Unicode header
util.c Utility routines
util.h Dummy header
utils/Makefile Extract the utility scripts
utils/c2ph.PL program to translate dbx stabs to perl
+utils/dprofpp.PL Perl code profile post-processor
utils/h2ph.PL A thing to turn C .h files into perl .ph files
utils/h2xs.PL Program to make .xs files from C header files
+utils/perlbc.PL Front-end for byte compiler
utils/perlbug.PL A simple tool to submit a bug report
utils/perlcc.PL Front-end for compiler
utils/perldoc.PL A simple tool to find & display perl's documentation
utils/pl2pm.PL A pl to pm translator
utils/splain.PL Stand-alone version of diagnostics.pm
+vmesa/Makefile VM/ESA Makefile
+vmesa/vmesa.c VM/ESA-specific C code for Perl core
+vmesa/vmesaish.h VM/ESA-specific C header for Perl core
vms/descrip_mms.template Template MM[SK] description file for build
vms/ext/DCLsym/0README.txt ReadMe file for VMS::DCLsym
vms/ext/DCLsym/DCLsym.pm Perl access to CLI symbols
@@ -1041,33 +1533,31 @@ vms/perly_c.vms perly.c with fixed declarations for global syms
vms/perly_h.vms perly.h with fixed declarations for global syms
vms/sockadapt.c glue for SockshShr socket support
vms/sockadapt.h glue for SockshShr socket support
-vms/subconfigure.com performs compiler checks and writes config.sh, config.h, and descrip.mms
+vms/subconfigure.com performs compiler checks and writes config.sh, config.h, and descrip.mms
vms/test.com DCL driver for regression tests
vms/vms.c VMS-specific C code for Perl core
vms/vms_yfix.pl convert Unix perly.[ch] to VMS perly_[ch].vms
vms/vmsish.h VMS-specific C header for Perl core
vms/writemain.pl Generate perlmain.c from miniperlmain.c+extensions
-vos/build.cm VOS command macro to build Perl
vos/Changes Changes made to port Perl to the VOS operating system
-vos/compile_perl.cm VOS commnad macro to build multiple version of Perl
+vos/build.cm VOS command macro to build Perl
+vos/compile_perl.cm VOS command macro to build multiple version of Perl
+vos/config.def input for config.pl
vos/config.h config.h for VOS
+vos/config.pl script to convert a config_h.SH to a config.h
vos/config_h.SH_orig config_h.SH at the time config.h was created
vos/perl.bind VOS bind control file
vos/test_vos_dummies.c Test program for "vos_dummies.c"
-vos/vos_accept.c Wrapper to fixup nonstandard VOS _accept function
vos/vos_dummies.c Wrappers to soak up undefined functions
-vos/vosish.h VOS-specific header file
-win32/GenCAPI.pl Win32 port for C API with PERL_OBJECT
+vos/vosish.h VOS-specific header file
+warnings.h The warning numbers
+warnings.pl Program to write warnings.h and lib/warnings.pm
win32/Makefile Win32 makefile for NMAKE (Visual C++ build)
-win32/TEST Win32 port
-win32/autosplit.pl Win32 port
-win32/bin/network.pl Win32 port
+win32/bin/exetype.pl Set executable type to CONSOLE or WINDOWS
win32/bin/perlglob.pl Win32 globbing
win32/bin/pl2bat.pl wrap perl scripts into batch files
win32/bin/runperl.pl run perl script via batch file namesake
win32/bin/search.pl Win32 port
-win32/bin/webget.pl Win32 port
-win32/bin/www.pl Win32 port
win32/config.bc Win32 base line config.sh (Borland C++ build)
win32/config.gc Win32 base line config.sh (mingw32/gcc build)
win32/config.vc Win32 base line config.sh (Visual C++ build)
@@ -1078,21 +1568,20 @@ win32/config_h.PL Perl code to convert Win32 config.sh to config.h
win32/config_sh.PL Perl code to update Win32 config.sh from Makefile
win32/des_fcrypt.patch Win32 port
win32/dl_win32.xs Win32 port
-win32/genxsdef.pl Win32 port
+win32/genmk95.pl Perl code to generate command.com-usable makefile.95
win32/include/arpa/inet.h Win32 port
win32/include/dirent.h Win32 port
win32/include/netdb.h Win32 port
win32/include/sys/socket.h Win32 port
-win32/makedef.pl Win32 port
-win32/makefile.mk Win32 makefile for DMAKE (BC++, VC++ builds)
-win32/makemain.pl Win32 port
-win32/makeperldef.pl Win32 port
+win32/makefile.mk Win32 makefile for DMAKE (BC++, VC++ builds)
win32/perlglob.c Win32 port
-win32/perlhost.h Perl host implementation
+win32/perlhost.h Perl "host" implementation
win32/perllib.c Win32 port
win32/pod.mak Win32 port
win32/runperl.c Win32 port
win32/splittree.pl Win32 port
+win32/vdir.h Perl "host" virtual directory manager
+win32/vmem.h Perl "host" memory manager
win32/win32.c Win32 port
win32/win32.h Win32 port
win32/win32iop.h Win32 port
@@ -1119,3 +1608,4 @@ x2p/str.h Public declarations for the above
x2p/util.c Utility routines
x2p/util.h Public declarations for the above
x2p/walk.c Parse tree walker
+xsutils.c Additional bundled package methods not in UNIVERSAL::
diff --git a/contrib/perl5/Makefile.SH b/contrib/perl5/Makefile.SH
index 61f01b5..285269de 100755
--- a/contrib/perl5/Makefile.SH
+++ b/contrib/perl5/Makefile.SH
@@ -1,5 +1,5 @@
#! /bin/sh
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
@@ -29,48 +29,69 @@ ldlibpth=''
case "$useshrplib" in
true)
# Prefix all runs of 'miniperl' and 'perl' with
- # $ldlibpth so that ./perl finds *this* libperl.so.
- ldlibpth="LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH"
+ # $ldlibpth so that ./perl finds *this* shared libperl.
+ case "$LD_LIBRARY_PATH" in
+ '')
+ ldlibpth="LD_LIBRARY_PATH=`pwd`";;
+ *)
+ ldlibpth="LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}";;
+ esac
pldlflags="$cccdlflags"
- # NeXT-4 specific stuff. Can't we do this in the hint file?
case "${osname}${osvers}" in
next4*)
ld=libtool
lddlflags="-dynamic -undefined warning -framework System \
-compatibility_version 1 -current_version $patchlevel \
-prebind -seg1addr 0x27000000 -install_name \$(shrpdir)/\$@"
- # NeXT uses a different name.
- ldlibpth="DYLD_LIBRARY_PATH=`pwd`:$DYLD_LIBRARY_PATH"
;;
- beos*) ldlibpth="LIBRARY_PATH=`pwd`:$LIBRARY_PATH"
+ rhapsody*|darwin*)
+ shrpldflags="${ldflags} -dynamiclib \
+ -compatibility_version 1 \
+ -current_version \
+ ${api_version}.${api_subversion} \
+ -image_base 0x4be00000 \
+ -install_name \$(shrpdir)/\$@"
;;
- os2*) # OS/2 doesn't need anything special for LD_LIBRARY_PATH.
- ldlibpth=''
+ cygwin*)
+ linklibperl="-lperl"
;;
sunos*)
linklibperl="-lperl"
;;
- netbsd*|freebsd[234]*)
+ netbsd*|freebsd[234]*|openbsd*)
linklibperl="-L. -lperl"
;;
aix*)
shrpldflags="-H512 -T512 -bhalt:4 -bM:SRE -bE:perl.exp"
case "$osvers" in
- 3*)
- shrpldflags="$shrpldflags -e _nostart $ldflags $libs $cryptlib"
+ 3*) shrpldflags="$shrpldflags -e _nostart"
;;
- *)
- shrpldflags="$shrpldflags -b noentry $ldflags $libs $cryptlib"
+ *) shrpldflags="$shrpldflags -b noentry"
;;
esac
- aixinstdir=`pwd | sed 's/\/UU$//'`
- linklibperl="-L $archlibexp/CORE -L $aixinstdir -lperl"
+ shrpldflags="$shrpldflags $ldflags $libs $cryptlib"
+ linklibperl="-L $archlibexp/CORE -L `pwd | sed 's/\/UU$//'` -lperl"
;;
- hpux10*)
- linklibperl="-L `pwd | sed 's/\/UU$//'` -Wl,+b$archlibexp/CORE -lperl"
+ hpux*)
+ linklibperl="-L `pwd | sed 's/\/UU$//'` -Wl,+s -Wl,+b$archlibexp/CORE -lperl"
;;
esac
+ case "$ldlibpthname" in
+ '') ;;
+ *)
+ case "$osname" in
+ os2)
+ ldlibpth=''
+ ;;
+ *)
+ eval "ldlibpth=\"$ldlibpthname=`pwd`:\$$ldlibpthname\""
+ ;;
+ esac
+ # Strip off any trailing :'s
+ ldlibpth=`echo $ldlibpth | sed 's/:*$//'`
+ ;;
+ esac
;;
*) pldlflags=''
;;
@@ -146,7 +167,7 @@ LLIBPERL= $linklibperl
SHRPENV = $shrpenv
# The following is used to include the current directory in
-# LD_LIBRARY_PATH if you are building a shared libperl.so.
+# the dynamic loader path you are building a shared libperl.
LDLIBPTH = $ldlibpth
dynamic_ext = $dynamic_list
@@ -185,6 +206,10 @@ SHELL = $sh
# how to tr(anslate) newlines
TRNL = '$trnl'
+# not used by Makefile but by installperl;
+# mentioned here so that metaconfig picks it up
+INSTALL_USR_BIN_PERL = $installusrbinperl
+
!GROK!THIS!
## In the following dollars and backticks do not need the extra backslash.
@@ -197,36 +222,39 @@ private = preplibrary lib/ExtUtils/Miniperl.pm lib/Config.pm
# Files to be built with variable substitution before miniperl
# is available.
sh = Makefile.SH cflags.SH config_h.SH makeaperl.SH makedepend.SH \
- makedir.SH perl_exp.SH writemain.SH
+ makedir.SH myconfig.SH writemain.SH
shextract = Makefile cflags config.h makeaperl makedepend \
- makedir perl.exp writemain
+ makedir myconfig writemain
# Files to be built with variable substitution after miniperl is
# available. Dependencies handled manually below (for now).
-pl = pod/pod2html.PL pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL
+pl = pod/pod2html.PL pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL \
+ pod/pod2usage.PL pod/podchecker.PL pod/podselect.PL
-plextract = pod/pod2html pod/pod2latex pod/pod2man pod/pod2text
+plextract = pod/pod2html pod/pod2latex pod/pod2man pod/pod2text \
+ pod/pod2usage pod/podchecker pod/podselect
addedbyconf = UU $(shextract) $(plextract) pstruct
h1 = EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h dosish.h
h2 = embed.h form.h gv.h handy.h hv.h keywords.h mg.h op.h
-h3 = opcode.h patchlevel.h perl.h perly.h pp.h proto.h regcomp.h
+h3 = opcode.h patchlevel.h perl.h perlapi.h perly.h pp.h proto.h regcomp.h
h4 = regexp.h scope.h sv.h unixish.h util.h iperlsys.h thread.h
-h5 = bytecode.h byterun.h
+h5 = utf8.h warnings.h
h = $(h1) $(h2) $(h3) $(h4) $(h5)
-c1 = $(mallocsrc) av.c scope.c op.c doop.c doio.c dump.c hv.c mg.c byterun.c
-c2 = perl.c perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c
-c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c globals.c perlio.c
+c1 = $(mallocsrc) av.c scope.c op.c doop.c doio.c dump.c hv.c mg.c
+c2 = perl.c perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c
+c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c xsutils.c
+c4 = globals.c perlio.c perlapi.c
-c = $(c1) $(c2) $(c3) miniperlmain.c perlmain.c
+c = $(c1) $(c2) $(c3) $(c4) miniperlmain.c perlmain.c
-obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) byterun$(OBJ_EXT)
+obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT)
obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
-obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT)
+obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) xsutils$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT)
obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
@@ -245,7 +273,7 @@ lintflags = -hbvxac
.c$(OBJ_EXT):
$(CCCMD) $(PLDLFLAGS) $*.c
-all: $(FIRSTMAKEFILE) miniperl $(private) $(plextract) $(public) $(dynamic_ext) $(nonxs_ext)
+all: $(FIRSTMAKEFILE) miniperl extra.pods $(private) $(public) $(dynamic_ext) $(nonxs_ext)
@echo " ";
@echo " Everything is up to date. 'make test' to run test suite."
@@ -258,7 +286,7 @@ compile: all
translators: miniperl lib/Config.pm FORCE
@echo " "; echo " Making x2p stuff"; cd x2p; $(LDLIBPTH) $(MAKE) all
-utilities: miniperl lib/Config.pm FORCE
+utilities: miniperl lib/Config.pm $(plextract) FORCE
@echo " "; echo " Making utilities"; cd utils; $(LDLIBPTH) $(MAKE) all
@@ -270,12 +298,18 @@ utilities: miniperl lib/Config.pm FORCE
FORCE:
@sh -c true
+opmini$(OBJ_EXT): op.c
+ $(RMS) opmini.c
+ $(LNS) op.c opmini.c
+ $(CCCMD) $(PLDLFLAGS) -DPERL_EXTERNAL_GLOB opmini.c
+ $(RMS) opmini.c
+
miniperlmain$(OBJ_EXT): miniperlmain.c
$(CCCMD) $(PLDLFLAGS) $*.c
perlmain.c: miniperlmain.c config.sh $(FIRSTMAKEFILE)
- sh writemain $(DYNALOADER) $(static_ext) > tmp
- sh mv-if-diff tmp perlmain.c
+ sh writemain $(DYNALOADER) $(static_ext) > writemain.tmp
+ sh mv-if-diff writemain.tmp perlmain.c
perlmain$(OBJ_EXT): perlmain.c
$(CCCMD) $(PLDLFLAGS) $*.c
@@ -290,15 +324,81 @@ ext.libs: $(static_ext)
# How to build libperl. This is still rather convoluted.
# Load up custom Makefile.SH fragment for shared loading and executables:
-if test -r $osname/Makefile.SHs ; then
- . $osname/Makefile.SHs
+case "$osname" in
+*)
+ Makefile_s="$osname/Makefile.SHs"
+ ;;
+esac
+
+case "$osname" in
+aix)
+ $spitshell >>Makefile <<!GROK!THIS!
+LIBS = $libs
+# In AIX we need to change this for building Perl itself from
+# its earlier definition (which is for building external
+# extensions *after* Perl has been built and installed)
+CCDLFLAGS = `echo $ccdlflags|sed -e 's@-bE:.*/perl\.exp@-bE:perl.exp@'`
+
+!GROK!THIS!
+ case "$useshrplib" in
+ define|true|[yY]*)
+ $spitshell >>Makefile <<'!NO!SUBS!'
+
+LIBPERL_NONSHR = libperl_nonshr$(LIB_EXT)
+MINIPERL_NONSHR = miniperl_nonshr$(EXE_EXT)
+
+$(LIBPERL_NONSHR): perl$(OBJ_EXT) $(obj)
+ $(RMS) $(LIBPERL_NONSHR)
+ $(AR) rcu $(LIBPERL_NONSHR) perl$(OBJ_EXT) $(obj)
+
+$(MINIPERL_NONSHR): $(LIBPERL_NONSHR) miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT)
+ $(CC) $(LDFLAGS) -o $(MINIPERL_NONSHR) miniperlmain$(OBJ_EXT) \
+ opmini$(OBJ_EXT) $(LIBPERL_NONSHR) $(LIBS)
+
+MINIPERLEXP = $(MINIPERL_NONSHR)
+
+LIBPERLEXPORT = perl.exp
+
+!NO!SUBS!
+
+ ;;
+ *)
+ $spitshell >>Makefile <<'!NO!SUBS!'
+MINIPERLEXP = miniperl$(EXE_EXT)
+
+PERLEXPORT = perl.exp
+
+!NO!SUBS!
+ ;;
+ esac
+ $spitshell >>Makefile <<'!NO!SUBS!'
+perl.exp: $(MINIPERLEXP) makedef.pl config.sh $(SYM) $(SYMH)
+ ./$(MINIPERLEXP) makedef.pl PLATFORM=aix | sort -u | sort -f > perl.exp.tmp
+ sh mv-if-diff perl.exp.tmp perl.exp
+
+!NO!SUBS!
+ ;;
+os2)
+ $spitshell >>Makefile <<'!NO!SUBS!'
+MINIPERLEXP = miniperl
+
+perl5.def: $(MINIPERLEXP) makedef.pl config.sh $(SYM) $(SYMH) miniperl.map
+ ./$(MINIPERLEXP) makedef.pl PLATFORM=os2 -DPERL_DLL=$(PERL_DLL) > perl.exp.tmp
+ sh mv-if-diff perl.exp.tmp perl5.def
+
+!NO!SUBS!
+ ;;
+esac
+
+if test -r $Makefile_s ; then
+ . $Makefile_s
$spitshell >>Makefile <<!GROK!THIS!
-Makefile: $osname/Makefile.SHs
+Makefile: $Makefile_s
!GROK!THIS!
else
$spitshell >>Makefile <<'!NO!SUBS!'
-$(LIBPERL): $& perl$(OBJ_EXT) $(obj)
+$(LIBPERL): $& perl$(OBJ_EXT) $(obj) $(LIBPERLEXPORT)
!NO!SUBS!
case "$useshrplib" in
true)
@@ -335,20 +435,48 @@ $(LIBPERL): $& perl$(OBJ_EXT) $(obj)
# build problems but that's not obvious to the novice.
# The Module used here must not depend on Config or any extensions.
-miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL)
- $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) $(LLIBPERL) $(libs)
- $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e 0 || $(MAKE) minitest
+!NO!SUBS!
+
+ case "${osname}${osvers}" in
+ next4*)
+ $spitshell >>Makefile <<'!NO!SUBS!'
+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
+!NO!SUBS!
+ ;;
+ aix*)
+ $spitshell >>Makefile <<'!NO!SUBS!'
+miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
+ $(CC) -o miniperl $(CLDFLAGS) \
+ `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
+!NO!SUBS!
+ ;;
+ *)
+ $spitshell >>Makefile <<'!NO!SUBS!'
+miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
+ $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) -o miniperl \
+ miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
+ $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
+!NO!SUBS!
+ ;;
+ esac
+
+ $spitshell >>Makefile <<'!NO!SUBS!'
-perl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
+perl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
$(SHRPENV) $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
-pureperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
+pureperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
$(SHRPENV) $(LDLIBPTH) purify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
-purecovperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
+purecovperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
$(SHRPENV) $(LDLIBPTH) purecov $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o purecovperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
-quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
+quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
$(SHRPENV) $(LDLIBPTH) quantify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
# This version, if specified in Configure, does ONLY those scripts which need
@@ -356,7 +484,7 @@ quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
# checks as well as the special code to validate that the script in question
# has been invoked correctly.
-suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
+suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
$(SHRPENV) $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
!NO!SUBS!
@@ -374,7 +502,7 @@ sperl$(OBJ_EXT): perl.c perly.h patchlevel.h $(h)
# We have to call our ./makedir because Ultrix 4.3 make can't handle the line
# test -d lib/auto || mkdir lib/auto
#
-preplibrary: miniperl lib/Config.pm $(plextract)
+preplibrary: miniperl lib/Config.pm
@sh ./makedir lib/auto
@echo " AutoSplitting perl library"
$(LDLIBPTH) ./miniperl -Ilib -e 'use AutoSplit; \
@@ -383,21 +511,34 @@ preplibrary: miniperl lib/Config.pm $(plextract)
# 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.)
-lib/Config.pm: config.sh miniperl configpm
- $(LDLIBPTH) ./miniperl configpm tmp
- sh mv-if-diff tmp $@
+lib/Config.pm: config.sh miniperl configpm lib/re.pm
+ $(LDLIBPTH) ./miniperl configpm configpm.tmp
+ sh mv-if-diff configpm.tmp $@
lib/ExtUtils/Miniperl.pm: miniperlmain.c miniperl minimod.pl lib/Config.pm
- $(LDLIBPTH) ./miniperl minimod.pl > tmp
- sh mv-if-diff tmp $@
+ $(LDLIBPTH) ./miniperl minimod.pl > minimod.tmp
+ sh mv-if-diff minimod.tmp $@
lib/re.pm: ext/re/re.pm
rm -f $@
cat ext/re/re.pm > $@
-$(plextract): miniperl lib/Config.pm lib/re.pm
+$(plextract): miniperl lib/Config.pm
$(LDLIBPTH) ./miniperl -Ilib $@.PL
-
+
+extra.pods: miniperl
+ -@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 \
+ nx=`echo $$x | sed -e "s/README\.//"`; \
+ $(LNS) ../$$x "pod/perl"$$nx".pod" ; \
+ echo "pod/perl"$$nx".pod" >> extra.pods ; \
+ done
+ -@test -f vms/perlvms.pod && $(LNS) ../vms/perlvms.pod pod/perlvms.pod && echo "pod/perlvms.pod" >> extra.pods
+
+install-strip:
+ $(MAKE) STRIPFLAGS=-s install
+
install: all install.perl install.man
install.perl: all installperl
@@ -408,7 +549,7 @@ install.perl: all installperl
cd ../pod; $(MAKE) compile; \
else :; \
fi
- $(LDLIBPTH) ./perl installperl
+ $(LDLIBPTH) ./perl installperl $(STRIPFLAGS)
install.man: all installman
$(LDLIBPTH) ./perl installman
@@ -416,6 +557,7 @@ install.man: all installman
# XXX Experimental. Hardwired values, but useful for testing.
# Eventually Configure could ask for some of these values.
install.html: all installhtml
+ -@test -f README.vms && $(LNS) ../README.vms vms/README_vms.pod
$(LDLIBPTH) ./perl installhtml \
--podroot=. --podpath=. --recurse \
--htmldir=$(privlib)/html \
@@ -434,13 +576,12 @@ install.html: all installhtml
# normally shouldn't remake perly.[ch].
run_byacc: FORCE
- @ echo 'Expect' 113 shift/reduce and 1 reduce/reduce conflict
$(BYACC) -d perly.y
- chmod 664 perly.c
+ -chmod 664 perly.c
sh $(shellflags) ./perly.fixer y.tab.c perly.c
sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
-e 's/y\.tab/perly/g' perly.c >perly.tmp && mv perly.tmp perly.c
- echo 'extern YYSTYPE yylval;' >>y.tab.h
+ sed -e '/^extern YYSTYPE yy/D' y.tab.h >yh.tmp && mv yh.tmp y.tab.h
cmp -s y.tab.h perly.h && rm -f y.tab.h || mv y.tab.h perly.h
chmod 664 vms/perly_c.vms vms/perly_h.vms
perl vms/vms_yfix.pl perly.c perly.h vms/perly_c.vms vms/perly_h.vms
@@ -456,28 +597,43 @@ perly.h: perly.y
# No compat3.sym here since and including the 5.004_50.
# No interp.sym since 5.005_03.
-SYM = global.sym perlio.sym thread.sym
+SYM = global.sym globvar.sym perlio.sym pp.sym
-SYMH = perlvars.h thrdvar.h
+SYMH = perlvars.h intrpvar.h thrdvar.h
+
+CHMOD_W = chmod +w
# The following files are generated automatically
-# keywords.h: keywords.pl
-# opcode.h: opcode.pl
-# embed.h: embed.pl global.sym
-# byterun.h: bytecode.pl
-# byterun.c: bytecode.pl
-# lib/B/Asmdata.pm: bytecode.pl
-# regnodes.h: regcomp.pl
+# keywords.pl: keywords.h
+# opcode.pl: opcode.h opnames.h pp_proto.h pp.sym
+# [* embed.pl needs pp.sym generated by opcode.pl! *]
+# embed.pl: proto.h embed.h embedvar.h global.sym objXSUB.h
+# perlapi.h perlapi.c pod/perlintern.pod
+# pod/perlapi.pod
+# bytecode.pl: ext/ByteLoader/byterun.h ext/ByteLoader/byterun.c
+# ext/B/B/Asmdata.pm
+# regcomp.pl: regnodes.h
+# warnings.pl: warnings.h lib/warnings.pm
# The correct versions should be already supplied with the perl kit,
# in case you don't have perl available.
-# To force them to run, type
+# To force them to be regenerated, type
# make regen_headers
+
+AUTOGEN_FILES = keywords.h opcode.h opnames.h pp_proto.h pp.sym proto.h \
+ embed.h embedvar.h global.sym \
+ pod/perlintern.pod pod/perlapi.pod \
+ objXSUB.h perlapi.h perlapi.c ext/ByteLoader/byterun.h \
+ ext/ByteLoader/byterun.c ext/B/B/Asmdata.pm regnodes.h \
+ warnings.h lib/warnings.pm
+
regen_headers: FORCE
- perl keywords.pl
- perl opcode.pl
- perl embed.pl
- perl bytecode.pl
- perl regcomp.pl
+ -$(CHMOD_W) $(AUTOGEN_FILES)
+ -perl keywords.pl
+ -perl opcode.pl
+ -perl embed.pl
+ -perl bytecode.pl
+ -perl regcomp.pl
+ -perl warnings.pl
# Extensions:
# Names added to $(dynamic_ext) or $(static_ext) or $(nonxs_ext) will
@@ -514,38 +670,42 @@ distclean: clobber
# Do not 'make _mopup' directly.
_mopup:
rm -f *$(OBJ_EXT) *$(LIB_EXT) all perlmain.c
- rm -f perl.exp ext.libs
+ -@test -f extra.pods && rm -f `cat extra.pods`
+ -@test -f vms/README_vms.pod && rm -f vms/README_vms.pod
+ -rm -f perl.exp ext.libs extra.pods
-rm -f perl.export perl.dll perl.libexp perl.map perl.def
+ -rm -f perl.loadmap miniperl.loadmap perl.prelmap miniperl.prelmap
rm -f perl suidperl miniperl $(LIBPERL)
# Do not 'make _tidy' directly.
_tidy:
- -cd pod; $(MAKE) clean
- -cd utils; $(MAKE) clean
- -cd x2p; $(MAKE) clean
+ -cd pod; $(LDLIBPTH) $(MAKE) clean
+ -cd utils; $(LDLIBPTH) $(MAKE) clean
+ -cd x2p; $(LDLIBPTH) $(MAKE) clean
-@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) $(nonxs_ext) ; do \
- sh ext/util/make_ext clean $$x MAKE=$(MAKE) ; \
+ $(LDLIBPTH) sh ext/util/make_ext clean $$x MAKE=$(MAKE) ; \
done
rm -f testcompile compilelog
# Do not 'make _cleaner' directly.
_cleaner:
-cd os2; rm -f Makefile
- -cd pod; $(MAKE) realclean
- -cd utils; $(MAKE) realclean
- -cd x2p; $(MAKE) realclean
+ -cd pod; $(LDLIBPTH) $(MAKE) realclean
+ -cd utils; $(LDLIBPTH) $(MAKE) realclean
+ -cd x2p; $(LDLIBPTH) $(MAKE) realclean
-@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) $(nonxs_ext) ; do \
- sh ext/util/make_ext realclean $$x MAKE=$(MAKE) ; \
+ $(LDLIBPTH) sh ext/util/make_ext realclean $$x MAKE=$(MAKE) ; \
done
- rm -f *.orig */*.orig *~ */*~ core t/core t/c t/perl
+ rm -f *.orig */*.orig *~ */*~ core core.*perl.*.? *perl.core t/core t/core.perl.*.? t/*perl.core t/misctmp* t/tmp* t/c t/perl .?*.c so_locations $(LIBPERL_NONSHR) $(MINIPERL_NONSHR)
rm -rf $(addedbyconf)
rm -f $(FIRSTMAKEFILE) $(FIRSTMAKEFILE).old
rm -f $(private)
rm -rf lib/auto
- rm -f lib/.exists
+ rm -f lib/.exists lib/*/.exists
rm -f h2ph.man pstruct
rm -rf .config
rm -f testcompile compilelog
+ -rmdir lib/B lib/Data lib/IO/Socket lib/IO
# The following lint has practically everything turned on. Unfortunately,
# you have to wade through a lot of mumbo jumbo that can't be suppressed.
@@ -567,10 +727,6 @@ $(FIRSTMAKEFILE): README $(MAKEDEPEND)
config.h: config_h.SH config.sh
$(SHELL) config_h.SH
-# This is an AIXism.
-perl.exp: perl_exp.SH config.sh $(SYM) $(SYMH)
- $(SHELL) perl_exp.SH
-
# When done, touch perlmain.c so that it doesn't get remade each time.
depend: makedepend
sh ./makedepend MAKE=$(MAKE)
@@ -581,11 +737,26 @@ depend: makedepend
makedepend: makedepend.SH config.sh
sh ./makedepend.SH
-test-prep: miniperl perl preplibrary utilities $(dynamic_ext) $(nonxs_ext)
+# Cannot delegate rebuilding of t/perl to make to allow interlaced
+# test and minitest
+test-prep: miniperl perl preplibrary utilities $(dynamic_ext) $(nonxs_ext) $(TEST_PERL_DLL)
cd t && (rm -f perl$(EXE_EXT); $(LNS) ../perl$(EXE_EXT) perl$(EXE_EXT))
+# Second branch is for testing without a tty or controling terminal.
+# See t/op/stat.t
test check: test-prep
- cd t && $(LDLIBPTH) ./perl TEST </dev/tty
+ if (true </dev/tty) >/dev/null 2>&1; then \
+ cd t && $(LDLIBPTH) ./perl TEST </dev/tty; \
+ else \
+ cd t && PERL_SKIP_TTY_TEST=1 $(LDLIBPTH) ./perl TEST; \
+ fi
+
+utest ucheck: test-prep
+ if (true </dev/tty) >/dev/null 2>&1; then \
+ cd t && $(LDLIBPTH) ./perl UTEST </dev/tty; \
+ else \
+ cd t && PERL_SKIP_TTY_TEST=1 $(LDLIBPTH) ./perl UTEST; \
+ fi
# For testing without a tty or controling terminal. See t/op/stat.t
test-notty: test-prep
@@ -612,6 +783,9 @@ okfile: utilities
nok: utilities
$(LDLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)'
+nokfile: utilities
+ $(LDLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)' -F perl.nok
+
clist: $(c)
echo $(c) | tr ' ' $(TRNL) >.clist
@@ -635,9 +809,19 @@ elc: emacs/cperl-mode.elc
emacs/cperl-mode.elc: emacs/cperl-mode.el
-cd emacs; emacs -batch -q -no-site-file -f batch-byte-compile cperl-mode.el
-etags: emacs/cperl-mode.elc
+etags: TAGS
+
+TAGS: emacs/cperl-mode.elc
sh emacs/ptags
+ctags: tags
+
+# Let's hope make will not go into an infinite loop on case-unsensitive systems
+# This may also fail if . is in the head of the path, since perl will
+# require -Ilib
+tags: TAGS
+ perl emacs/e2ctags.pl TAGS > tags
+
# AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
# If this runs make out of memory, delete /usr/include lines.
!NO!SUBS!
@@ -658,8 +842,9 @@ $define)
xxx=''
echo "This is an EBCDIC system, checking if any parser files need regenerating." >&4
case "$osname" in
-os390)
+os390|posix-bc)
rm -f y.tab.c y.tab.h
+ # yacc must be a reentrant ("pure") Bison in BS2000 Posix!
yacc -d perly.y >/dev/null 2>&1
if cmp -s y.tab.c perly.c; then
rm -f y.tab.c
@@ -667,8 +852,21 @@ os390)
echo "perly.y -> perly.c" >&2
mv -f y.tab.c perly.c
chmod u+w perly.c
- sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
- -e 's/y\.tab/perly/g' perly.c >perly.tmp && mv perly.tmp perly.c
+ sed -e '/^#include "perl\.h"/a\
+\
+#define yydebug PL_yydebug\
+#define yynerrs PL_yynerrs\
+#define yyerrflag PL_yyerrflag\
+#define yychar PL_yychar\
+#define yyval PL_yyval\
+#define yylval PL_yylval' \
+ -e '/YYSTYPE *yyval;/D' \
+ -e '/YYSTYPE *yylval;/D' \
+ -e '/int yychar,/,/yynerrs;/D' \
+ -e 's/int yydebug = 0;/yydebug = 0;/' \
+ -e 's/[^_]realloc(/PerlMem_realloc(/g' \
+ -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
+ -e 's/y\.tab/perly/g' perly.c >perly.tmp && mv perly.tmp perly.c
xxx="$xxx perly.c"
fi
if cmp -s y.tab.h perly.h; then
@@ -681,7 +879,15 @@ os390)
if cd x2p
then
rm -f y.tab.c y.tab.h
- yacc a2p.y >/dev/null 2>&1
+ case "$osname" in
+ posix-bc)
+ # we are using two different yaccs in BS2000 Posix!
+ byacc a2p.y >/dev/null 2>&1
+ ;;
+ *) # e.g. os390
+ yacc a2p.y >/dev/null 2>&1
+ ;;
+ esac
if cmp -s y.tab.c a2p.c
then
rm -f y.tab.c
@@ -708,6 +914,9 @@ os390)
cd ..
fi
;;
+vmesa)
+ # Do nothing in VM/ESA.
+ ;;
*)
echo "'$osname' is an EBCDIC system I don't know that well." >&4
;;
@@ -717,3 +926,4 @@ esac
esac
;;
esac
+
diff --git a/contrib/perl5/Policy_sh.SH b/contrib/perl5/Policy_sh.SH
index 52a2c57..0d9c1df 100755
--- a/contrib/perl5/Policy_sh.SH
+++ b/contrib/perl5/Policy_sh.SH
@@ -1,4 +1,4 @@
-case $CONFIG in
+case $CONFIGDOTSH in
'') . ./config.sh ;;
esac
echo "Extracting Policy.sh (with variable substitutions)"
@@ -29,12 +29,25 @@ case "\$perladmin" in
'') perladmin='$perladmin' ;;
esac
-# Installation prefix. Allow a Configure -D override. You
+# Installation prefixes. Allow a Configure -D override. You
# may wish to reinstall perl under a different prefix, perhaps
# in order to test a different configuration.
+# For an explanation of the installation directories, see the
+# INSTALL file section on "Installation Directories".
case "\$prefix" in
'') prefix='$prefix' ;;
esac
+case "\$siteprefix" in
+'') siteprefix='$siteprefix' ;;
+esac
+case "\$vendorprefix" in
+'') vendorprefix='$vendorprefix' ;;
+esac
+
+# Where installperl puts things.
+case "\$installprefix" in
+'') installprefix='$installprefix' ;;
+esac
# Installation directives. Note that each one comes in three flavors.
# For example, we have privlib, privlibexp, and installprivlib.
@@ -44,7 +57,22 @@ esac
# out automatically by Configure, so you don't have to include it here.
# installprivlib is for systems (such as those running AFS) that
# need to distinguish between the place where things
-# get installed and where they finally will reside.
+# get installed and where they finally will reside. As of 5.005_6x,
+# this too is handled automatically by Configure based on
+# $installprefix, so it isn't included here either.
+#
+# Note also that there are three broad hierarchies of installation
+# directories, as discussed in the INSTALL file under
+# "Installation Directories":
+#
+# =item Directories for the perl distribution
+#
+# =item Directories for site-specific add-on files
+#
+# =item Directories for vendor-supplied add-on files
+#
+# See Porting/Glossary for the definitions of these names, and see the
+# INSTALL file for further explanation and some examples.
#
# In each case, if your previous value was the default, leave it commented
# out. That way, if you override prefix, all of these will be
@@ -56,13 +84,17 @@ esac
!GROK!THIS!
-for var in bin scriptdir privlib archlib \
- man1dir man3dir sitelib sitearch \
- installbin installscript installprivlib installarchlib \
- installman1dir installman3dir installsitelib installsitearch \
- man1ext man3ext; do
+for var in \
+ bin scriptdir privlib archlib man1dir man3dir html1dir html3dir \
+ sitebin sitescript sitelib sitearch \
+ siteman1 siteman3 sitehtml1 sitehtml3 \
+ vendorbin vendorscript vendorlib vendorarch \
+ vendorman1 vendorman3 vendorhtml1 vendorhtml3
+do
case "$var" in
+
+ # Directories for the core perl components
bin) dflt=$prefix/bin ;;
# The scriptdir test is more complex, but this is probably usually ok.
scriptdir)
@@ -78,47 +110,73 @@ for var in bin scriptdir privlib archlib \
*) dflt=$prefix/lib/$package/$version ;;
esac
;;
- archlib)
- case "$prefix" in
- *perl*) dflt=$prefix/lib/$version/$archname ;;
- *) dflt=$prefix/lib/$package/$version/$archname ;;
- esac
+ archlib) dflt="$privlib/$archname" ;;
+
+ man1dir) dflt="$prefix/man/man1" ;;
+ man3dir) dflt="$prefix/man/man3" ;;
+ # Can we assume all sed's have greedy matching?
+ man1ext) dflt=`echo $man1dir | sed -e 's!.*man!!' -e 's!^\.!!'` ;;
+ man3ext) dflt=`echo $man3dir | sed -e 's!.*man!!' -e 's!^\.!!'` ;;
+
+ # We don't know what to do with these yet.
+ html1dir) dflt='' ;;
+ htm31dir) dflt='' ;;
+
+ # Directories for site-specific add-on files
+ sitebin) dflt=$siteprefix/bin ;;
+ sitescript)
+ if $test -d $siteprefix/script; then
+ dflt=$siteprefix/script
+ else
+ dflt=$sitebin
+ fi
;;
sitelib)
- case "$prefix" in
- *perl*) dflt=$prefix/lib/site_perl/$apiversion ;;
- *) dflt=$prefix/lib/$package/site_perl/$apiversion ;;
- esac
- ;;
- sitearch)
- case "$prefix" in
- *perl*) dflt=$prefix/lib/site_perl/$apiversion/$archname ;;
- *) dflt=$prefix/lib/$package/site_perl/$apiversion/$archname ;;
- esac
- ;;
- man1dir) dflt="$prefix/man/man1" ;;
- man3dir)
- case "$prefix" in
- *perl*) dflt=`echo $man1dir |
- sed -e 's/man1/man3/g' -e 's/man\.1/man\.3/g'` ;;
- *) dflt=$privlib/man/man3 ;;
+ case "$siteprefix" in
+ *perl*) dflt=$prefix/lib/site_perl/$version ;;
+ *) dflt=$prefix/lib/$package/site_perl/$version ;;
esac
;;
+ sitearch) dflt="$sitelib/$archname" ;;
- # Can we assume all sed's have greedy matching?
- man1ext) dflt=`echo $man1dir | sed -e 's!.*man!!' -e 's!^\.!!'` ;;
- man3ext) dflt=`echo $man3dir | sed -e 's!.*man!!' -e 's!^\.!!'` ;;
+ siteman1) dflt="$siteprefix/man/man1" ;;
+ siteman3) dflt="$siteprefix/man/man3" ;;
+ # We don't know what to do with these yet.
+ sitehtml1) dflt='' ;;
+ sitehtm31dir) dflt='' ;;
+
+ # Directories for vendor-supplied add-on files
+ # These are all usually empty.
+ vendor*)
+ if test X"$vendorprefix" = X""; then
+ dflt=''
+ else
+ case "$var" in
+ vendorbin) dflt=$vendorprefix/bin ;;
+ vendorscript)
+ if $test -d $vendorprefix/script; then
+ dflt=$vendorprefix/script
+ else
+ dflt=$vendorbin
+ fi
+ ;;
+ vendorlib)
+ case "$vendorprefix" in
+ *perl*) dflt=$prefix/lib/vendor_perl/$version ;;
+ *) dflt=$prefix/lib/$package/vendor_perl/$version ;;
+ esac
+ ;;
+ vendorarch) dflt="$vendorlib/$archname" ;;
- # It might be possible to fool these next tests. Please let
- # me know if they don't work right for you.
- installbin) dflt=`echo $binexp | sed 's#^/afs/#/afs/.#'`;;
- installscript) dflt=`echo $scriptdirexp | sed 's#^/afs/#/afs/.#'`;;
- installprivlib) dflt=`echo $privlibexp | sed 's#^/afs/#/afs/.#'`;;
- installarchlib) dflt=`echo $archlibexp | sed 's#^/afs/#/afs/.#'`;;
- installsitelib) dflt=`echo $sitelibexp | sed 's#^/afs/#/afs/.#'`;;
- installsitearch) dflt=`echo $sitearchexp | sed 's#^/afs/#/afs/.#'`;;
- installman1dir) dflt=`echo $man1direxp | sed 's#^/afs/#/afs/.#'`;;
- installman3dir) dflt=`echo $man3direxp | sed 's#^/afs/#/afs/.#'`;;
+ vendorman1) dflt="$vendorprefix/man/man1" ;;
+ vendorman3) dflt="$vendorprefix/man/man3" ;;
+ # We don't know what to do with these yet.
+ vendorhtml1) dflt='' ;;
+ vendorhtm3) dflt='' ;;
+
+ esac # End of vendorprefix != ''
+ fi
+ ;;
esac
eval val="\$$var"
@@ -148,6 +206,5 @@ $spitshell <<!GROK!THIS! >>Policy.sh
# The original design for this Policy.sh file came from Wayne Davison,
# maintainer of trn.
# This version for Perl5.004_61 originally written by
-# Andy Dougherty <doughera@lafcol.lafayette.edu>.
+# Andy Dougherty <doughera@lafayette.edu>.
# This file may be distributed under the same terms as Perl itself.
-
diff --git a/contrib/perl5/Porting/Glossary b/contrib/perl5/Porting/Glossary
index 52b560e..cc66d70 100644
--- a/contrib/perl5/Porting/Glossary
+++ b/contrib/perl5/Porting/Glossary
@@ -4,11 +4,6 @@ programs (e.g. I_UNISTD) are already described in config_h.SH. [`configpm'
generates pod documentation for Config.pm from this file--please try to keep
the formatting regular.]
-Mcc (Loc.U):
- This variable is used internally by Configure to determine the
- full pathname (if any) of the Mcc program. After Configure runs,
- the value is reset to a plain "Mcc" and is not useful.
-
_a (Unix.U):
This variable defines the extension used for ordinary libraries.
For unix, it is '.a'. The '.' is included. Other possible
@@ -31,25 +26,61 @@ afs (afs.U):
alignbytes (alignbytes.U):
This variable holds the number of bytes required to align a
- double. Usual values are 2, 4 and 8.
+ double-- or a long double when applicable. Usual values are
+ 2, 4 and 8. The default is eight, for safety.
ansi2knr (ansi2knr.U):
This variable is set if the user needs to run ansi2knr.
Currently, this is not supported, so we just abort.
aphostname (d_gethname.U):
- Thie variable contains the command which can be used to compute the
+ This variable contains the command which can be used to compute the
host name. The command is fully qualified by its absolute path, to make
it safe when used by a process with super-user privileges.
-apiversion (patchlevel.U):
- This is a number which identifies the lowest version of perl
- to have an API (for XS extensions) compatible with the present
- version. For example, for 5.005_01, the apiversion should be
- 5.005, since 5.005_01 should be binary compatible with 5.005.
- This should probably be incremented manually somehow, perhaps
- from patchlevel.h. For now, we'll guess maintenance subversions
- will retain binary compatibility.
+api_revision (patchlevel.U):
+ The three variables, api_revision, api_version, and
+ api_subversion, specify the version of the oldest perl binary
+ compatible with the present perl. In a full version string
+ such as '5.6.1', api_revision is the '5'.
+ Prior to 5.5.640, the format was a floating point number,
+ like 5.00563.
+ perl.c:incpush() and lib/lib.pm will automatically search in
+ $sitelib/.. for older directories back to the limit specified
+ by these api_ variables. This is only useful if you have a
+ perl library directory tree structured like the default one.
+ See INSTALL for how this works. The versioned site_perl
+ directory was introduced in 5.005, so that is the lowest
+ possible value. The version list appropriate for the current
+ system is determined in inc_version_list.U.
+ XXX To do: Since compatibility can depend on compile time
+ options (such as bincompat, longlong, etc.) it should
+ (perhaps) be set by Configure, but currently it isn't.
+ Currently, we read a hard-wired value from patchlevel.h.
+ Perhaps what we ought to do is take the hard-wired value from
+ patchlevel.h but then modify it if the current Configure
+ options warrant. patchlevel.h then would use an #ifdef guard.
+
+api_subversion (patchlevel.U):
+ The three variables, api_revision, api_version, and
+ api_subversion, specify the version of the oldest perl binary
+ compatible with the present perl. In a full version string
+ such as '5.6.1', api_subversion is the '1'. See api_revision for
+ full details.
+
+api_version (patchlevel.U):
+ The three variables, api_revision, api_version, and
+ api_subversion, specify the version of the oldest perl binary
+ compatible with the present perl. In a full version string
+ such as '5.6.1', api_version is the '6'. See api_revision for
+ full details. As a special case, 5.5.0 is rendered in the
+ old-style as 5.005. (In the 5.005_0x maintenance series,
+ this was the only versioned directory in $sitelib.)
+
+api_versionstring (patchlevel.U):
+ This variable combines api_revision, api_version, and
+ api_subversion in a format such as 5.6.1 (or 5_6_1) suitable
+ for use as a directory name. This is filesystem dependent.
ar (Loc.U):
This variable is used internally by Configure to determine the
@@ -67,6 +98,9 @@ archlibexp (archlib.U):
This variable is the same as the archlib variable, but is
filename expanded at configuration time, for convenient use.
+archname64 (use64bits.U):
+ This variable is used for the 64-bitness part of $archname.
+
archname (archname.U):
This variable is a short name to characterize the current
architecture. It is used mainly to construct the default archlib.
@@ -96,6 +130,10 @@ bin (bin.U):
is most often a local directory such as /usr/local/bin. Programs using
this variable must be prepared to deal with ~name substitution.
+bincompat5005 (bincompat5005.U):
+ This variable contains y if this version of Perl should be
+ binary-compatible with Perl 5.005.
+
binexp (bin.U):
This is the same as the bin variable, but is filename expanded at
configuration time, for use in your makefiles.
@@ -118,15 +156,15 @@ byteorder (byteorder.U):
c (n.U):
This variable contains the \c string if that is what causes the echo
command to suppress newline. Otherwise it is null. Correct usage is
- $echo $n "prompt for a question: $c".
+ $echo $n "prompt for a question: $c".
castflags (d_castneg.U):
This variable contains a flag that precise difficulties the
compiler has casting odd floating values to unsigned long:
- 0 = ok
- 1 = couldn't cast < 0
- 2 = couldn't cast >= 0x80000000
- 4 = couldn't cast in argument expression list
+ 0 = ok
+ 1 = couldn't cast < 0
+ 2 = couldn't cast >= 0x80000000
+ 4 = couldn't cast in argument expression list
cat (Loc.U):
This variable is used internally by Configure to determine the
@@ -172,6 +210,10 @@ cf_time (cf_who.U):
Holds the output of the "date" command when the configuration file was
produced. This is used to tag both config.sh and config_h.SH.
+charsize (charsize.U):
+ This variable contains the value of the CHARSIZE symbol, which
+ indicates to the C program how many bytes there are in a character.
+
chgrp (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
@@ -198,6 +240,10 @@ compress (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
+CONFIGDOTSH (Oldsyms.U):
+ This is set to 'true' in config.sh so that a shell script
+ sourcing config.sh can tell if it has been sourced already.
+
contains (contains.U):
This variable holds the command to do a grep with a proper return
status. On most sane systems it is simply "grep". On insane systems
@@ -222,19 +268,25 @@ cpp_stuff (cpp_stuff.U):
This variable contains an identification of the catenation mechanism
used by the C preprocessor.
+cppccsymbols (Cppsym.U):
+ The variable contains the symbols defined by the C compiler
+ when it calls cpp. The symbols defined by the cc alone or cpp
+ alone are not in this list, see ccsymbols and cppsymbols.
+ The list is a space-separated list of symbol=value tokens.
+
cppflags (ccflags.U):
This variable holds the flags that will be passed to the C pre-
processor. It is up to the Makefile to use it.
cpplast (cppstdin.U):
- This variable has the same functionality as cppminus, only it applies to
- cpprun and not cppstdin.
+ This variable has the same functionality as cppminus, only it applies
+ to cpprun and not cppstdin.
cppminus (cppstdin.U):
This variable contains the second part of the string which will invoke
the C preprocessor on the standard input and produce to standard
- output. This variable will have the value "-" if cppstdin needs a minus
- to specify standard input, otherwise the value is "".
+ output. This variable will have the value "-" if cppstdin needs
+ a minus to specify standard input, otherwise the value is "".
cpprun (cppstdin.U):
This variable contains the command which will invoke a C preprocessor
@@ -256,11 +308,10 @@ cppsymbols (Cppsym.U):
not in this list, see ccsymbols and cppccsymbols.
The list is a space-separated list of symbol=value tokens.
-cppccsymbols (Cppsym.U):
- The variable contains the symbols defined by the C compiler when
- when it calls cpp. The symbols defined by the cc alone or cpp
- alone are not in this list, see ccsymbols and cppsymbols.
- The list is a space-separated list of symbol=value tokens.
+crosscompile (crosscompile.U):
+ This variable conditionally defines the CROSSCOMPILE symbol
+ which signifies that the build process is be a cross-compilation.
+ This is normally set by hints files or from Configure command line.
cryptlib (d_crypt.U):
This variable holds -lcrypt or the path to a libcrypt.a archive if
@@ -272,15 +323,14 @@ csh (Loc.U):
full pathname (if any) of the csh program. After Configure runs,
the value is reset to a plain "csh" and is not useful.
-d_Gconvert (d_gconvert.U):
- This variable holds what Gconvert is defined as to convert
- floating point numbers into strings. It could be 'gconvert'
- or a more complex macro emulating gconvert with gcvt() or sprintf.
-
d_access (d_access.U):
This variable conditionally defines HAS_ACCESS if the access() system
call is available to check for access permissions using real IDs.
+d_accessx (d_accessx.U):
+ This variable conditionally defines the HAS_ACCESSX symbol, which
+ indicates to the C program that the accessx() routine is available.
+
d_alarm (d_alarm.U):
This variable conditionally defines the HAS_ALARM symbol, which
indicates to the C program that the alarm() routine is available.
@@ -290,6 +340,14 @@ d_archlib (archlib.U):
of architecture-dependent library files for $package. If
$archlib is the same as $privlib, then this is set to undef.
+d_atolf (atolf.U):
+ This variable conditionally defines the HAS_ATOLF symbol, which
+ indicates to the C program that the atolf() routine is available.
+
+d_atoll (atoll.U):
+ This variable conditionally defines the HAS_ATOLL symbol, which
+ indicates to the C program that the atoll() routine is available.
+
d_attribut (d_attribut.U):
This variable conditionally defines HASATTRIBUTE, which
indicates the C compiler can check for function attributes,
@@ -303,6 +361,13 @@ d_bcopy (d_bcopy.U):
This variable conditionally defines the HAS_BCOPY symbol if
the bcopy() routine is available to copy strings.
+d_bincompat5005 (bincompat5005.U):
+ This variable conditionally defines BINCOMPAT5005 so that embed.h
+ can take special action if this version of Perl should be
+ binary-compatible with Perl 5.005. This is impossible for builds
+ that use features like threads and multiplicity it is always $undef
+ for those versions.
+
d_bsd (Guess.U):
This symbol conditionally defines the symbol BSD when running on a
BSD system.
@@ -401,10 +466,20 @@ d_dosuid (d_dosuid.U):
tells the C program that it should insert setuid emulation code
on hosts which have setuid #! scripts disabled.
+d_drand48proto (d_drand48proto.U):
+ This variable conditionally defines the HAS_DRAND48_PROTO symbol,
+ which indicates to the C program that the system provides
+ a prototype for the drand48() function. Otherwise, it is
+ up to the program to supply one.
+
d_dup2 (d_dup2.U):
This variable conditionally defines HAS_DUP2 if dup2() is
available to duplicate file descriptors.
+d_eaccess (d_eaccess.U):
+ This variable conditionally defines the HAS_EACCESS symbol, which
+ indicates to the C program that the eaccess() routine is available.
+
d_endgrent (d_endgrent.U):
This variable conditionally defines the HAS_ENDGRENT symbol, which
indicates to the C program that the endgrent() routine is available
@@ -431,6 +506,10 @@ d_endsent (d_endsent.U):
This variable conditionally defines HAS_ENDSERVENT if endservent() is
available to close whatever was being used for service queries.
+d_endspent (d_endspent.U):
+ This variable conditionally defines HAS_ENDSPENT if endspent() is
+ available to finalize the scan of SysV shadow password entries.
+
d_eofnblk (nblock_io.U):
This variable conditionally defines EOF_NONBLOCK if EOF can be seen
when reading from a non-blocking I/O source.
@@ -491,11 +570,22 @@ d_fpathconf (d_pathconf.U):
to determine file-system related limits and options associated
with a given open file descriptor.
+d_fpos64_t (d_fpos64_t.U):
+ This symbol will be defined if the C compiler supports fpos64_t.
+
+d_fs_data_s (d_fs_data_s.U):
+ This variable conditionally defines the HAS_STRUCT_FS_DATA symbol,
+ which indicates that the struct fs_data is supported.
+
+d_fseeko (d_fseeko.U):
+ This variable conditionally defines the HAS_FSEEKO symbol, which
+ indicates to the C program that the fseeko() routine is available.
+
d_fsetpos (d_fsetpos.U):
This variable conditionally defines HAS_FSETPOS if fsetpos() is
available to set the file position indicator.
-d_fstatfs (d_statfs.U):
+d_fstatfs (d_fstatfs.U):
This variable conditionally defines the HAS_FSTATFS symbol, which
indicates to the C program that the fstatfs() routine is available.
@@ -503,11 +593,33 @@ d_fstatvfs (d_statvfs.U):
This variable conditionally defines the HAS_FSTATVFS symbol, which
indicates to the C program that the fstatvfs() routine is available.
+d_ftello (d_ftello.U):
+ This variable conditionally defines the HAS_FTELLO symbol, which
+ indicates to the C program that the ftello() routine is available.
+
d_ftime (d_ftime.U):
This variable conditionally defines the HAS_FTIME symbol, which indicates
that the ftime() routine exists. The ftime() routine is basically
a sub-second accuracy clock.
+d_Gconvert (d_gconvert.U):
+ This variable holds what Gconvert is defined as to convert
+ floating point numbers into strings. It could be 'gconvert'
+ or a more complex macro emulating gconvert with gcvt() or sprintf.
+ Possible values are:
+ d_Gconvert='gconvert((x),(n),(t),(b))'
+ d_Gconvert='gcvt((x),(n),(b))'
+ d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+
+d_getcwd (d_getcwd.U):
+ This variable conditionally defines the HAS_GETCWD symbol, which
+ indicates to the C program that the getcwd() routine is available
+ to get the current working directory.
+
+d_getfsstat (d_getfsstat.U):
+ This variable conditionally defines the HAS_GETFSSTAT symbol, which
+ indicates to the C program that the getfsstat() routine is available.
+
d_getgrent (d_getgrent.U):
This variable conditionally defines the HAS_GETGRENT symbol, which
indicates to the C program that the getgrent() routine is available
@@ -548,10 +660,15 @@ d_getlogin (d_getlogin.U):
indicates to the C program that the getlogin() routine is available
to get the login name.
+d_getmnt (d_getmnt.U):
+ This variable conditionally defines the HAS_GETMNT symbol, which
+ indicates to the C program that the getmnt() routine is available
+ to retrieve one or more mount info blocks by filename.
+
d_getmntent (d_getmntent.U):
This variable conditionally defines the HAS_GETMNTENT symbol, which
indicates to the C program that the getmntent() routine is available
- to iterate through mounted files.
+ to iterate through mounted files to get their mount info.
d_getnbyaddr (d_getnbyad.U):
This variable conditionally defines the HAS_GETNETBYADDR symbol, which
@@ -645,6 +762,14 @@ d_getservprotos (d_getservprotos.U):
prototypes for the various getserv*() functions.
See also netdbtype.U for probing for various netdb types.
+d_getspent (d_getspent.U):
+ This variable conditionally defines HAS_GETSPENT if getspent() is
+ available to retrieve SysV shadow password entries sequentially.
+
+d_getspnam (d_getspnam.U):
+ This variable conditionally defines HAS_GETSPNAM if getspnam() is
+ available to retrieve SysV shadow password entries by name.
+
d_gettimeod (d_ftime.U):
This variable conditionally defines the HAS_GETTIMEOFDAY symbol, which
indicates that the gettimeofday() system call exists (to obtain a
@@ -666,6 +791,10 @@ d_htonl (d_htonl.U):
This variable conditionally defines HAS_HTONL if htonl() and its
friends are available to do network order byte swapping.
+d_iconv (d_iconv.U):
+ This variable conditionally defines the HAS_ICONV symbol, which
+ indicates to the C program that the iconv() routine is available.
+
d_index (d_strchr.U):
This variable conditionally defines HAS_INDEX if index() and
rindex() are available for string searching.
@@ -675,6 +804,9 @@ d_inetaton (d_inetaton.U):
indicates to the C program that the inet_aton() function is available
to parse IP address "dotted-quad" strings.
+d_int64_t (d_int64_t.U):
+ This symbol will be defined if the C compiler supports int64_t.
+
d_isascii (d_isascii.U):
This variable conditionally defines the HAS_ISASCII constant,
which indicates to the C program that isascii() is available.
@@ -689,6 +821,11 @@ d_lchown (d_lchown.U):
indicates to the C program that the lchown() routine is available
to operate on a symbolic link (instead of following the link).
+d_ldbl_dig (d_ldbl_dig.U):
+ This variable conditionally defines d_ldbl_dig if this system's
+ header files provide LDBL_DIG, which is the number of significant
+ digits in a long double precision number.
+
d_link (d_link.U):
This variable conditionally defines HAS_LINK if link() is
available to create hard links.
@@ -709,10 +846,20 @@ d_longlong (d_longlong.U):
This variable conditionally defines HAS_LONG_LONG if
the long long type is supported.
+d_lseekproto (d_lseekproto.U):
+ This variable conditionally defines the HAS_LSEEK_PROTO symbol,
+ which indicates to the C program that the system provides
+ a prototype for the lseek() function. Otherwise, it is
+ up to the program to supply one.
+
d_lstat (d_lstat.U):
This variable conditionally defines HAS_LSTAT if lstat() is
available to do file stats on symbolic links.
+d_madvise (d_madvise.U):
+ This variable conditionally defines HAS_MADVISE if madvise() is
+ available to map a file into memory.
+
d_mblen (d_mblen.U):
This variable conditionally defines the HAS_MBLEN symbol, which
indicates to the C program that the mblen() routine is available
@@ -728,6 +875,11 @@ d_mbtowc (d_mbtowc.U):
indicates to the C program that the mbtowc() routine is available
to convert multibyte to a wide character.
+d_memchr (d_memchr.U):
+ This variable conditionally defines the HAS_MEMCHR symbol, which
+ indicates to the C program that the memchr() routine is available
+ to locate characters within a C string.
+
d_memcmp (d_memcmp.U):
This variable conditionally defines the HAS_MEMCMP symbol, which
indicates to the C program that the memcmp() routine is available
@@ -753,18 +905,67 @@ d_mkdir (d_mkdir.U):
indicates to the C program that the mkdir() routine is available
to create directories..
+d_mkdtemp (d_mkdtemp.U):
+ This variable conditionally defines the HAS_MKDTEMP symbol, which
+ indicates to the C program that the mkdtemp() routine is available
+ to exclusively create a uniquely named temporary directory.
+
d_mkfifo (d_mkfifo.U):
This variable conditionally defines the HAS_MKFIFO symbol, which
indicates to the C program that the mkfifo() routine is available.
+d_mkstemp (d_mkstemp.U):
+ This variable conditionally defines the HAS_MKSTEMP symbol, which
+ indicates to the C program that the mkstemp() routine is available
+ to exclusively create and open a uniquely named temporary file.
+
+d_mkstemps (d_mkstemps.U):
+ This variable conditionally defines the HAS_MKSTEMPS symbol, which
+ indicates to the C program that the mkstemps() routine is available
+ to exclusively create and open a uniquely named (with a suffix)
+ temporary file.
+
d_mktime (d_mktime.U):
This variable conditionally defines the HAS_MKTIME symbol, which
indicates to the C program that the mktime() routine is available.
+d_mmap (d_mmap.U):
+ This variable conditionally defines HAS_MMAP if mmap() is
+ available to map a file into memory.
+
+d_mprotect (d_mprotect.U):
+ This variable conditionally defines HAS_MPROTECT if mprotect() is
+ available to modify the access protection of a memory mapped file.
+
d_msg (d_msg.U):
This variable conditionally defines the HAS_MSG symbol, which
indicates that the entire msg*(2) library is present.
+d_msg_ctrunc (d_socket.U):
+ This variable conditionally defines the HAS_MSG_CTRUNC symbol,
+ which indicates that the MSG_CTRUNC is available. #ifdef is
+ not enough because it may be an enum, glibc has been known to do this.
+
+d_msg_dontroute (d_socket.U):
+ This variable conditionally defines the HAS_MSG_DONTROUTE symbol,
+ which indicates that the MSG_DONTROUTE is available. #ifdef is
+ not enough because it may be an enum, glibc has been known to do this.
+
+d_msg_oob (d_socket.U):
+ This variable conditionally defines the HAS_MSG_OOB symbol,
+ which indicates that the MSG_OOB is available. #ifdef is
+ not enough because it may be an enum, glibc has been known to do this.
+
+d_msg_peek (d_socket.U):
+ This variable conditionally defines the HAS_MSG_PEEK symbol,
+ which indicates that the MSG_PEEK is available. #ifdef is
+ not enough because it may be an enum, glibc has been known to do this.
+
+d_msg_proxy (d_socket.U):
+ This variable conditionally defines the HAS_MSG_PROXY symbol,
+ which indicates that the MSG_PROXY is available. #ifdef is
+ not enough because it may be an enum, glibc has been known to do this.
+
d_msgctl (d_msgctl.U):
This variable conditionally defines the HAS_MSGCTL symbol, which
indicates to the C program that the msgctl() routine is available.
@@ -781,6 +982,14 @@ d_msgsnd (d_msgsnd.U):
This variable conditionally defines the HAS_MSGSND symbol, which
indicates to the C program that the msgsnd() routine is available.
+d_msync (d_msync.U):
+ This variable conditionally defines HAS_MSYNC if msync() is
+ available to synchronize a mapped file.
+
+d_munmap (d_munmap.U):
+ This variable conditionally defines HAS_MUNMAP if munmap() is
+ available to unmap a region mapped by mmap().
+
d_mymalloc (mallocsrc.U):
This variable conditionally defines MYMALLOC in case other parts
of the source want to take special action if MYMALLOC is used.
@@ -790,10 +999,21 @@ d_nice (d_nice.U):
This variable conditionally defines the HAS_NICE symbol, which
indicates to the C program that the nice() routine is available.
+d_nv_preserves_uv (perlxv.U):
+ This variable indicates whether a variable of type nvtype
+ can preserve all the bits a variable of type uvtype.
+
+d_off64_t (d_off64_t.U):
+ This symbol will be defined if the C compiler supports off64_t.
+
+d_old_pthread_create_joinable (d_pthrattrj.U):
+ This variable conditionally defines pthread_create_joinable.
+ undef if pthread.h defines PTHREAD_CREATE_JOINABLE.
+
d_oldpthreads (usethreads.U):
This variable conditionally defines the OLD_PTHREADS_API symbol,
and indicates that Perl should be built to use the old
- draft POSIX threads API. This is only potneially meaningful if
+ draft POSIX threads API. This is only potentially meaningful if
usethreads is set.
d_oldsock (d_socket.U):
@@ -817,7 +1037,7 @@ d_pause (d_pause.U):
to suspend a process until a signal is received.
d_phostname (d_gethname.U):
- This variable conditionally defines the PHOSTNAME symbol, which
+ This variable conditionally defines the HAS_PHOSTNAME symbol, which
contains the shell command which, when fed to popen(), may be
used to derive the host name.
@@ -836,16 +1056,60 @@ d_portable (d_portable.U):
indicates to the C program that it should not assume that it is
running on the machine it was compiled on.
+d_PRId64 (quadfio.U):
+ This variable conditionally defines the PERL_PRId64 symbol, which
+ indiciates that stdio has a symbol to print 64-bit decimal numbers.
+
+d_PRIeldbl (longdblfio.U):
+ This variable conditionally defines the PERL_PRIfldlbl symbol, which
+ indiciates that stdio has a symbol to print long doubles.
+
+d_PRIEldbl (longdblfio.U):
+ This variable conditionally defines the PERL_PRIfldlbl symbol, which
+ indiciates that stdio has a symbol to print long doubles.
+
+d_PRIfldbl (longdblfio.U):
+ This variable conditionally defines the PERL_PRIfldlbl symbol, which
+ indiciates that stdio has a symbol to print long doubles.
+
+d_PRIFldbl (longdblfio.U):
+ This variable conditionally defines the PERL_PRIfldlbl symbol, which
+ indiciates that stdio has a symbol to print long doubles.
+
+d_PRIgldbl (longdblfio.U):
+ This variable conditionally defines the PERL_PRIfldlbl symbol, which
+ indiciates that stdio has a symbol to print long doubles.
+
+d_PRIGldbl (longdblfio.U):
+ This variable conditionally defines the PERL_PRIfldlbl symbol, which
+ indiciates that stdio has a symbol to print long doubles.
+
+d_PRIi64 (quadfio.U):
+ This variable conditionally defines the PERL_PRIi64 symbol, which
+ indiciates that stdio has a symbol to print 64-bit decimal numbers.
+
+d_PRIo64 (quadfio.U):
+ This variable conditionally defines the PERL_PRIo64 symbol, which
+ indiciates that stdio has a symbol to print 64-bit octal numbers.
+
+d_PRIu64 (quadfio.U):
+ This variable conditionally defines the PERL_PRIu64 symbol, which
+ indiciates that stdio has a symbol to print 64-bit unsigned decimal
+ numbers.
+
+d_PRIx64 (quadfio.U):
+ This variable conditionally defines the PERL_PRIx64 symbol, which
+ indiciates that stdio has a symbol to print 64-bit hexadecimal numbers.
+
+d_PRIX64 (quadfio.U):
+ This variable conditionally defines the PERL_PRIX64 symbol, which
+ indiciates that stdio has a symbol to print 64-bit hExADECimAl numbers.
+
d_pthread_yield (d_pthread_y.U):
This variable conditionally defines the HAS_PTHREAD_YIELD
symbol if the pthread_yield routine is available to yield
the execution of the current thread.
-d_pthreads_created_joinable (d_pthreadj.U):
- This variable conditionally defines the PTHREADS_CREATED_JOINABLE
- symbol if pthreads are created in the joinable (aka undetached)
- state.
-
d_pwage (i_pwd.U):
This variable conditionally defines PWAGE, which indicates
that struct passwd contains pw_age.
@@ -878,6 +1142,14 @@ d_pwquota (i_pwd.U):
This variable conditionally defines PWQUOTA, which indicates
that struct passwd contains pw_quota.
+d_qgcvt (d_qgcvt.U):
+ This variable conditionally defines the HAS_QGCVT symbol, which
+ indicates to the C program that the qgcvt() routine is available.
+
+d_quad (quadtype.U):
+ This variable, if defined, tells that there's a 64-bit integer type,
+ quadtype.
+
d_readdir (d_readdir.U):
This variable conditionally defines HAS_READDIR if readdir() is
available to read directory entries.
@@ -918,6 +1190,11 @@ d_sched_yield (d_pthread_y.U):
symbol if the sched_yield routine is available to yield
the execution of the current thread.
+d_scm_rights (d_socket.U):
+ This variable conditionally defines the HAS_SCM_RIGHTS symbol,
+ which indicates that the SCM_RIGHTS is available. #ifdef is
+ not enough because it may be an enum, glibc has been known to do this.
+
d_seekdir (d_readdir.U):
This variable conditionally defines HAS_SEEKDIR if seekdir() is
available.
@@ -935,11 +1212,11 @@ d_semctl (d_semctl.U):
This variable conditionally defines the HAS_SEMCTL symbol, which
indicates to the C program that the semctl() routine is available.
-d_semctl_semid_ds (d_union_senum.U):
+d_semctl_semid_ds (d_union_semun.U):
This variable conditionally defines USE_SEMCTL_SEMID_DS, which
indicates that struct semid_ds * is to be used for semctl IPC_STAT.
-d_semctl_semun (d_union_senum.U):
+d_semctl_semun (d_union_semun.U):
This variable conditionally defines USE_SEMCTL_SEMUN, which
indicates that union semun is to be used for semctl IPC_STAT.
@@ -1053,6 +1330,10 @@ d_setsid (d_setsid.U):
This variable conditionally defines HAS_SETSID if setsid() is
available to set the process group ID.
+d_setspent (d_setspent.U):
+ This variable conditionally defines HAS_SETSPENT if setspent() is
+ available to initialize the scan of SysV shadow password entries.
+
d_setvbuf (d_setvbuf.U):
This variable conditionally defines the HAS_SETVBUF symbol, which
indicates to the C program that the setvbuf() routine is available
@@ -1100,20 +1381,32 @@ d_socket (d_socket.U):
This variable conditionally defines HAS_SOCKET, which indicates
that the BSD socket interface is supported.
+d_socklen_t (d_socklen_t.U):
+ This symbol will be defined if the C compiler supports socklen_t.
+
d_sockpair (d_socket.U):
This variable conditionally defines the HAS_SOCKETPAIR symbol, which
indicates that the BSD socketpair() is supported.
+d_sqrtl (d_sqrtl.U):
+ This variable conditionally defines the HAS_SQRTL symbol, which
+ indicates to the C program that the sqrtl() routine is available.
+
d_statblks (d_statblks.U):
- This variable conditionally defines USE_STAT_BLOCKS if this system
- has a stat structure declaring st_blksize and st_blocks.
+ This variable conditionally defines USE_STAT_BLOCKS
+ if this system has a stat structure declaring
+ st_blksize and st_blocks.
-d_statfsflags (d_statfs.U):
- This variable conditionally defines the HAS_STRUCT_STATFS_FLAGS
+d_statfs_f_flags (d_statfs_f_flags.U):
+ This variable conditionally defines the HAS_STRUCT_STATFS_F_FLAGS
symbol, which indicates to struct statfs from has f_flags member.
This kind of struct statfs is coming from sys/mount.h (BSD),
not from sys/statfs.h (SYSV).
+d_statfs_s (d_statfs_s.U):
+ This variable conditionally defines the HAS_STRUCT_STATFS symbol,
+ which indicates that the struct statfs is supported.
+
d_statvfs (d_statvfs.U):
This variable conditionally defines the HAS_STATVFS symbol, which
indicates to the C program that the statvfs() routine is available.
@@ -1126,6 +1419,10 @@ d_stdio_ptr_lval (d_stdstdio.U):
This variable conditionally defines STDIO_PTR_LVALUE if the
FILE_ptr macro can be used as an lvalue.
+d_stdio_stream_array (stdio_streams.U):
+ This variable tells whether there is an array holding
+ the stdio streams.
+
d_stdiobase (d_stdstdio.U):
This variable conditionally defines USE_STDIO_BASE if this system
has a FILE structure declaring a usable _base field (or equivalent)
@@ -1169,11 +1466,27 @@ d_strtol (d_strtol.U):
indicates to the C program that the strtol() routine is available
to provide better numeric string conversion than atoi() and friends.
+d_strtold (d_strtold.U):
+ This variable conditionally defines the HAS_STRTOLD symbol, which
+ indicates to the C program that the strtold() routine is available.
+
+d_strtoll (d_strtoll.U):
+ This variable conditionally defines the HAS_STRTOLL symbol, which
+ indicates to the C program that the strtoll() routine is available.
+
d_strtoul (d_strtoul.U):
This variable conditionally defines the HAS_STRTOUL symbol, which
indicates to the C program that the strtoul() routine is available
to provide conversion of strings to unsigned long.
+d_strtoull (d_strtoull.U):
+ This variable conditionally defines the HAS_STRTOULL symbol, which
+ indicates to the C program that the strtoull() routine is available.
+
+d_strtouq (d_strtouq.U):
+ This variable conditionally defines the HAS_STRTOUQ symbol, which
+ indicates to the C program that the strtouq() routine is available.
+
d_strxfrm (d_strxfrm.U):
This variable conditionally defines HAS_STRXFRM if strxfrm() is
available to transform strings.
@@ -1222,6 +1535,12 @@ d_telldir (d_readdir.U):
This variable conditionally defines HAS_TELLDIR if telldir() is
available.
+d_telldirproto (d_telldirproto.U):
+ This variable conditionally defines the HAS_TELLDIR_PROTO symbol,
+ which indicates to the C program that the system provides
+ a prototype for the telldir() function. Otherwise, it is
+ up to the program to supply one.
+
d_time (d_time.U):
This variable conditionally defines the HAS_TIME symbol, which indicates
that the time() routine exists. The time() routine is normaly
@@ -1250,10 +1569,23 @@ d_uname (d_gethname.U):
indicates to the C program that the uname() routine may be
used to derive the host name.
-d_union_semun (d_union_senum.U):
+d_union_semun (d_union_semun.U):
This variable conditionally defines HAS_UNION_SEMUN if the
union semun is defined by including <sys/sem.h>.
+d_ustat (d_ustat.U):
+ This variable conditionally defines HAS_USTAT if ustat() is
+ available to query file system statistics by dev_t.
+
+d_vendorarch (vendorarch.U):
+ This variable conditionally defined PERL_VENDORARCH.
+
+d_vendorbin (vendorbin.U):
+ This variable conditionally defines PERL_VENDORBIN.
+
+d_vendorlib (vendorlib.U):
+ This variable conditionally defines PERL_VENDORLIB.
+
d_vfork (d_vfork.U):
This variable conditionally defines the HAS_VFORK symbol, which
indicates the vfork() routine is available.
@@ -1320,6 +1652,9 @@ db_prefixtype (i_db.U):
in the <db.h> header file. In older versions of DB, it was
int, while in newer ones it is size_t.
+defvoidused (voidflags.U):
+ This variable contains the default value of the VOIDUSED symbol (15).
+
direntrytype (i_dirent.U):
This symbol is set to 'struct direct' or 'struct dirent' depending on
whether dirent is available or not. You should use this pseudo type to
@@ -1337,6 +1672,13 @@ doublesize (doublesize.U):
This variable contains the value of the DOUBLESIZE symbol, which
indicates to the C program how many bytes there are in a double.
+drand01 (randfunc.U):
+ Indicates the macro to be used to generate normalized
+ random numbers. Uses randfunc, often divided by
+ (double) (((unsigned long) 1 << randbits)) in order to
+ normalize the result.
+ In C programs, the macro 'Drand01' is mapped to drand01.
+
dynamic_ext (Extensions.U):
This variable holds a list of XS extension files we want to
link dynamically into the package. It is used by Makefile.
@@ -1385,10 +1727,20 @@ extensions (Extensions.U):
and is typically used to test whether a particular extesion
is available.
+fflushall (fflushall.U):
+ This symbol, if defined, tells that to flush
+ all pending stdio output one must loop through all
+ the stdio file handles stored in an array and fflush them.
+ Note that if fflushNULL is defined, fflushall will not
+ even be probed for and will be left undefined.
+
+fflushNULL (fflushall.U):
+ This symbol, if defined, tells that fflush(NULL) does flush
+ all pending stdio output.
+
find (Loc.U):
- This variable is used internally by Configure to determine the
- full pathname (if any) of the find program. After Configure runs,
- the value is reset to a plain "find" and is not useful.
+ This variable is defined but not used by Configure.
+ The value is a plain '' and is not useful.
firstmakefile (Unix.U):
This variable defines the first file searched by make. On unix,
@@ -1400,8 +1752,11 @@ flex (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
+fpossize (fpossize.U):
+ This variable contains the size of a fpostype in bytes.
+
fpostype (fpostype.U):
- This variable defines Fpos_t to be something like fpost_t, long,
+ This variable defines Fpos_t to be something like fpos_t, long,
uint, or whatever type is used to declare file positions in libc.
freetype (mallocsrc.U):
@@ -1432,11 +1787,26 @@ gccversion (cc.U):
indicate whether the compiler is version 1 or 2. This is used in
setting some of the default cflags. It is set to '' if not gcc.
+gidformat (gidf.U):
+ This variable contains the format string used for printing a Gid_t.
+
+gidsign (gidsign.U):
+ This variable contains the signedness of a gidtype.
+ 1 for unsigned, -1 for signed.
+
+gidsize (gidsize.U):
+ This variable contains the size of a gidtype in bytes.
+
gidtype (gidtype.U):
This variable defines Gid_t to be something like gid_t, int,
ushort, or whatever type is used to declare the return type
of getgid(). Typically, it is the type of group ids in the kernel.
+glibpth (libpth.U):
+ This variable holds the general path (space-separated) used to
+ find libraries. It may contain directories that do not exist on
+ this platform, libpth is the cleaned-up version.
+
grep (Loc.U):
This variable is used internally by Configure to determine the
full pathname (if any) of the grep program. After Configure runs,
@@ -1446,6 +1816,8 @@ groupcat (nis.U):
This variable contains a command that produces the text of the
/etc/group file. This is normally "cat /etc/group", but can be
"ypcat group" when NIS is used.
+ On some systems, such as os390, there may be no equivalent
+ command, in which case this variable is unset.
groupstype (groupstype.U):
This variable defines Groups_t to be something like gid_t, int,
@@ -1474,6 +1846,8 @@ hostcat (nis.U):
This variable contains a command that produces the text of the
/etc/hosts file. This is normally "cat /etc/hosts", but can be
"ypcat hosts" when NIS is used.
+ On some systems, such as os390, there may be no equivalent
+ command, in which case this variable is unset.
huge (models.U):
This variable contains a flag which will tell the C compiler and loader
@@ -1481,6 +1855,30 @@ huge (models.U):
huge model is not supported, contains the flag to produce large
model programs. It is up to the Makefile to use this.
+i16size (perlxv.U):
+ This variable is the size of an I16 in bytes.
+
+i16type (perlxv.U):
+ This variable contains the C type used for Perl's I16.
+
+i32size (perlxv.U):
+ This variable is the size of an I32 in bytes.
+
+i32type (perlxv.U):
+ This variable contains the C type used for Perl's I32.
+
+i64size (perlxv.U):
+ This variable is the size of an I64 in bytes.
+
+i64type (perlxv.U):
+ This variable contains the C type used for Perl's I64.
+
+i8size (perlxv.U):
+ This variable is the size of an I8 in bytes.
+
+i8type (perlxv.U):
+ This variable contains the C type used for Perl's I8.
+
i_arpainet (i_arpainet.U):
This variable conditionally defines the I_ARPA_INET symbol,
and indicates whether a C program should include <arpa/inet.h>.
@@ -1531,6 +1929,18 @@ i_grp (i_grp.U):
This variable conditionally defines the I_GRP symbol, and indicates
whether a C program should include <grp.h>.
+i_iconv (i_iconv.U):
+ This variable conditionally defines the I_ICONV symbol, and indicates
+ whether a C program should include <iconv.h>.
+
+i_ieeefp (i_ieeefp.U):
+ This variable conditionally defines the I_IEEEFP symbol, and indicates
+ whether a C program should include <ieeefp.h>.
+
+i_inttypes (i_inttypes.U):
+ This variable conditionally defines the I_INTTYPES symbol,
+ and indicates whether a C program should include <inttypes.h>.
+
i_limits (i_limits.U):
This variable conditionally defines the I_LIMITS symbol, and indicates
whether a C program may include <limits.h> to get symbols like WORD_BIT
@@ -1574,11 +1984,23 @@ i_neterrno (i_neterrno.U):
indicates to the C program that <net/errno.h> exists and should
be included.
+i_netinettcp (i_netinettcp.U):
+ This variable conditionally defines the I_NETINET_TCP symbol,
+ and indicates whether a C program should include <netinet/tcp.h>.
+
i_niin (i_niin.U):
This variable conditionally defines I_NETINET_IN, which indicates
to the C program that it should include <netinet/in.h>. Otherwise,
you may try <sys/in.h>.
+i_poll (i_poll.U):
+ This variable conditionally defines the I_POLL symbol, and indicates
+ whether a C program should include <poll.h>.
+
+i_pthread (i_pthread.U):
+ This variable conditionally defines the I_PTHREAD symbol,
+ and indicates whether a C program should include <pthread.h>.
+
i_pwd (i_pwd.U):
This variable conditionally defines I_PWD, which indicates
to the C program that it should include <pwd.h>.
@@ -1597,6 +2019,14 @@ i_sgtty (i_termio.U):
indicates to the C program that it should include <sgtty.h> rather
than <termio.h>.
+i_shadow (i_shadow.U):
+ This variable conditionally defines the I_SHADOW symbol, and indicates
+ whether a C program should include <shadow.h>.
+
+i_socks (i_socks.U):
+ This variable conditionally defines the I_SOCKS symbol, and indicates
+ whether a C program should include <socks.h>.
+
i_stdarg (i_varhdr.U):
This variable conditionally defines the I_STDARG symbol, which
indicates to the C program that <stdarg.h> exists and should
@@ -1616,6 +2046,14 @@ i_string (i_string.U):
This variable conditionally defines the I_STRING symbol, which
indicates that <string.h> should be included rather than <strings.h>.
+i_sunmath (i_sunmath.U):
+ This variable conditionally defines the I_SUNMATH symbol, and indicates
+ whether a C program should include <sunmath.h>.
+
+i_sysaccess (i_sysaccess.U):
+ This variable conditionally defines the I_SYS_ACCESS symbol,
+ and indicates whether a C program should include <sys/access.h>.
+
i_sysdir (i_sysdir.U):
This variable conditionally defines the I_SYS_DIR symbol, and indicates
whether a C program should include <sys/dir.h>.
@@ -1639,6 +2077,18 @@ i_sysioctl (i_sysioctl.U):
indicates to the C program that <sys/ioctl.h> exists and should
be included.
+i_syslog (i_syslog.U):
+ This variable conditionally defines the I_SYSLOG symbol,
+ and indicates whether a C program should include <syslog.h>.
+
+i_sysmman (i_sysmman.U):
+ This variable conditionally defines the I_SYS_MMAN symbol, and
+ indicates whether a C program should include <sys/mman.h>.
+
+i_sysmode (i_sysmode.U):
+ This variable conditionally defines the I_SYSMODE symbol,
+ and indicates whether a C program should include <sys/mode.h>.
+
i_sysmount (i_sysmount.U):
This variable conditionally defines the I_SYSMOUNT symbol,
and indicates whether a C program should include <sys/mount.h>.
@@ -1655,6 +2105,10 @@ i_sysresrc (i_sysresrc.U):
This variable conditionally defines the I_SYS_RESOURCE symbol,
and indicates whether a C program should include <sys/resource.h>.
+i_syssecrt (i_syssecrt.U):
+ This variable conditionally defines the I_SYS_SECURITY symbol,
+ and indicates whether a C program should include <sys/security.h>.
+
i_sysselct (i_sysselct.U):
This variable conditionally defines I_SYS_SELECT, which indicates
to the C program that it should include <sys/select.h> in order to
@@ -1694,11 +2148,23 @@ i_systypes (i_systypes.U):
This variable conditionally defines the I_SYS_TYPES symbol,
and indicates whether a C program should include <sys/types.h>.
+i_sysuio (i_sysuio.U):
+ This variable conditionally defines the I_SYSUIO symbol, and indicates
+ whether a C program should include <sys/uio.h>.
+
i_sysun (i_sysun.U):
This variable conditionally defines I_SYS_UN, which indicates
to the C program that it should include <sys/un.h> to get UNIX
domain socket definitions.
+i_sysutsname (i_sysutsname.U):
+ This variable conditionally defines the I_SYSUTSNAME symbol,
+ and indicates whether a C program should include <sys/utsname.h>.
+
+i_sysvfs (i_sysvfs.U):
+ This variable conditionally defines the I_SYSVFS symbol,
+ and indicates whether a C program should include <sys/vfs.h>.
+
i_syswait (i_syswait.U):
This variable conditionally defines I_SYS_WAIT, which indicates
to the C program that it should include <sys/wait.h>.
@@ -1721,6 +2187,10 @@ i_unistd (i_unistd.U):
This variable conditionally defines the I_UNISTD symbol, and indicates
whether a C program should include <unistd.h>.
+i_ustat (i_ustat.U):
+ This variable conditionally defines the I_USTAT symbol, and indicates
+ whether a C program should include <ustat.h>.
+
i_utime (i_utime.U):
This variable conditionally defines the I_UTIME symbol, and indicates
whether a C program should include <utime.h>.
@@ -1747,6 +2217,21 @@ ignore_versioned_solibs (libs.U):
libraries (libfoo.so.x.y) are to be ignored (because they
cannot be linked against).
+inc_version_list (inc_version_list.U):
+ This variable specifies the list of subdirectories in over
+ which perl.c:incpush() and lib/lib.pm will automatically
+ search when adding directories to @INC. The elements in
+ the list are separated by spaces. This is only useful
+ if you have a perl library directory tree structured like the
+ default one. See INSTALL for how this works. The versioned
+ site_perl directory was introduced in 5.005, so that is the
+ lowest possible value.
+
+inc_version_list_init (inc_version_list.U):
+ This variable holds the same list as inc_version_list, but
+ each item is enclosed in double quotes and separated by commas,
+ suitable for use in the PERL_INC_VERSION_LIST initialization.
+
incpath (usrinc.U):
This variable must preceed the normal include path to get hte
right one, as in "$incpath/usr/include" or "$incpath/usr/lib".
@@ -1778,6 +2263,18 @@ installman3dir (man3dir.U):
man3direxp only points to the read-only access location. For extra
portability, you should only use this variable within your makefiles.
+installprefix (installprefix.U):
+ This variable holds the name of the directory below which
+ "make install" will install the package. For most users, this
+ is the same as prefix. However, it is useful for
+ installing the software into a different (usually temporary)
+ location after which it can be bundled up and moved somehow
+ to the final location specified by prefix.
+
+installprefixexp (installprefix.U):
+ This variable holds the full absolute path of installprefix
+ with all ~-expansion done.
+
installprivlib (privlib.U):
This variable is really the same as privlibexp but may differ on
those systems using AFS. For extra portability, only this variable
@@ -1793,20 +2290,68 @@ installsitearch (sitearch.U):
those systems using AFS. For extra portability, only this variable
should be used in makefiles.
+installsitebin (sitebin.U):
+ This variable is usually the same as sitebinexp, unless you are on
+ a system running AFS, in which case they may differ slightly. You
+ should always use this variable within your makefiles for portability.
+
installsitelib (sitelib.U):
This variable is really the same as sitelibexp but may differ on
those systems using AFS. For extra portability, only this variable
should be used in makefiles.
+installstyle (installstyle.U):
+ This variable describes the "style" of the perl installation.
+ This is intended to be useful for tools that need to
+ manipulate entire perl distributions. Perl itself doesn't use
+ this to find its libraries -- the library directories are
+ stored directly in Config.pm. Currently, there are only two
+ styles: "lib" and "lib/perl5". The default library locations
+ (e.g. privlib, sitelib) are either $prefix/lib or
+ $prefix/lib/perl5. The former is useful if $prefix is a
+ directory dedicated to perl (e.g. /opt/perl), while the latter
+ is useful if $prefix is shared by many packages, e.g. if
+ $prefix=/usr/local.
+ This may later be extended to include other information, so
+ be careful with pattern-matching on the results.
+ For compatibility with perl5.005 and earlier, the default
+ setting is based on whether or not $prefix contains the string
+ "perl".
+
installusrbinperl (instubperl.U):
This variable tells whether Perl should be installed also as
/usr/bin/perl in addition to
$installbin/perl
+installvendorarch (vendorarch.U):
+ This variable is really the same as vendorarchexp but may differ on
+ those systems using AFS. For extra portability, only this variable
+ should be used in makefiles.
+
+installvendorbin (vendorbin.U):
+ This variable is really the same as vendorbinexp but may differ on
+ those systems using AFS. For extra portability, only this variable
+ should be used in makefiles.
+
+installvendorlib (vendorlib.U):
+ This variable is really the same as vendorlibexp but may differ on
+ those systems using AFS. For extra portability, only this variable
+ should be used in makefiles.
+
intsize (intsize.U):
This variable contains the value of the INTSIZE symbol, which
indicates to the C program how many bytes there are in an int.
+ivdformat (perlxvf.U):
+ This variable contains the format string used for printing
+ a Perl IV as a signed decimal integer.
+
+ivsize (perlxv.U):
+ This variable is the size of an IV in bytes.
+
+ivtype (perlxv.U):
+ This variable contains the C type used for Perl's IV.
+
known_extensions (Extensions.U):
This variable holds a list of all XS extensions included in
the package.
@@ -1836,6 +2381,11 @@ ldflags (ccflags.U):
This variable contains any additional C loader flags desired by
the user. It is up to the Makefile to use this.
+ldlibpthname (libperl.U):
+ This variable holds the name of the shared library
+ search path, often LD_LIBRARY_PATH. To get an empty
+ string, the hints file must set this to 'none'.
+
less (Loc.U):
This variable is used internally by Configure to determine the
full pathname (if any) of the less program. After Configure runs,
@@ -1856,22 +2406,36 @@ libperl (libperl.U):
library.
libpth (libpth.U):
- This variable holds the general path used to find libraries. It is
- intended to be used by other units.
+ This variable holds the general path (space-separated) used to find
+ libraries. It is intended to be used by other units.
libs (libs.U):
This variable holds the additional libraries we want to use.
It is up to the Makefile to deal with it.
+libsdirs (libs.U):
+ This variable holds the directory names aka dirnames of the libraries
+ we found and accepted, duplicates are removed.
+
+libsfiles (libs.U):
+ This variable holds the filenames aka basenames of the libraries
+ we found and accepted.
+
+libsfound (libs.U):
+ This variable holds the full pathnames of the libraries
+ we found and accepted.
+
+libspath (libs.U):
+ This variable holds the directory names probed for libraries.
+
libswanted (Myinit.U):
This variable holds a list of all the libraries we want to
search. The order is chosen to pick up the c library
ahead of ucb or bsd libraries for SVR4.
line (Loc.U):
- This variable is used internally by Configure to determine the
- full pathname (if any) of the line program. After Configure runs,
- the value is reset to a plain "line" and is not useful.
+ This variable is defined but not used by Configure.
+ The value is a plain '' and is not useful.
lint (Loc.U):
This variable is defined but not used by Configure.
@@ -1899,9 +2463,9 @@ locincpth (ccflags.U):
It's not much, but it parallels the loclibpth stuff in libpth.U.
loclibpth (libpth.U):
- This variable holds the paths used to find local libraries. It is
- prepended to libpth, and is intended to be easily set from the
- command line.
+ This variable holds the paths (space-separated) used to find local
+ libraries. It is prepended to libpth, and is intended to be easily
+ set from the command line.
longdblsize (d_longdbl.U):
This variable contains the value of the LONG_DOUBLESIZE symbol, which
@@ -1930,6 +2494,11 @@ ls (Loc.U):
full pathname (if any) of the ls program. After Configure runs,
the value is reset to a plain "ls" and is not useful.
+lseeksize (lseektype.U):
+ This variable defines lseektype to be something like off_t, long,
+ or whatever type is used to declare lseek offset's type in the
+ kernel (which also appears to be lseek's return type).
+
lseektype (lseektype.U):
This variable defines lseektype to be something like off_t, long,
or whatever type is used to declare lseek offset's type in the
@@ -2004,6 +2573,11 @@ man3ext (man3dir.U):
have: one of 'n', 'l', or '3'. The Makefile must supply the '.'.
See man3dir.
+Mcc (Loc.U):
+ This variable is used internally by Configure to determine the
+ full pathname (if any) of the Mcc program. After Configure runs,
+ the value is reset to a plain "Mcc" and is not useful.
+
medium (models.U):
This variable contains a flag which will tell the C compiler and loader
to produce a program running with a medium memory model. If the
@@ -2019,6 +2593,11 @@ mkdir (Loc.U):
full pathname (if any) of the mkdir program. After Configure runs,
the value is reset to a plain "mkdir" and is not useful.
+mmaptype (d_mmap.U):
+ This symbol contains the type of pointer returned by mmap()
+ (and simultaneously the type of the first argument).
+ It can be 'void *' or 'caddr_t'.
+
models (models.U):
This variable contains the list of memory models supported by this
system. Possible component values are none, split, unsplit, small,
@@ -2034,6 +2613,11 @@ more (Loc.U):
full pathname (if any) of the more program. After Configure runs,
the value is reset to a plain "more" and is not useful.
+multiarch (multiarch.U):
+ This variable conditionally defines the MULTIARCH symbol
+ which signifies the presence of multiplatform files.
+ This is normally set by hints files.
+
mv (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
@@ -2063,7 +2647,7 @@ myuname (Oldconfig.U):
n (n.U):
This variable contains the '-n' flag if that is what causes the echo
command to suppress newline. Otherwise it is null. Correct usage is
- $echo $n "prompt for a question: $c".
+ $echo $n "prompt for a question: $c".
netdb_hlen_type (netdbtype.U):
This variable holds the type used for the 2nd argument to
@@ -2111,6 +2695,12 @@ nroff (Loc.U):
full pathname (if any) of the nroff program. After Configure runs,
the value is reset to a plain "nroff" and is not useful.
+nvsize (perlxv.U):
+ This variable is the size of an NV in bytes.
+
+nvtype (perlxv.U):
+ This variable contains the C type used for Perl's NV.
+
o_nonblock (nblock_io.U):
This variable bears the symbol value to be used during open() or fcntl()
to turn on non-blocking I/O for a file descriptor. If you wish to switch
@@ -2120,6 +2710,12 @@ o_nonblock (nblock_io.U):
obj_ext (Unix.U):
This is an old synonym for _o.
+old_pthread_create_joinable (d_pthrattrj.U):
+ This variable defines the constant to use for creating joinable
+ (aka undetached) pthreads. Unused if pthread.h defines
+ PTHREAD_CREATE_JOINABLE. If used, possible values are
+ PTHREAD_CREATE_UNDETACHED and __UNDETACHED.
+
optimize (ccflags.U):
This variable contains any optimizer/debugger flag that should be used.
It is up to the Makefile to use it.
@@ -2157,19 +2753,41 @@ passcat (nis.U):
This variable contains a command that produces the text of the
/etc/passwd file. This is normally "cat /etc/passwd", but can be
"ypcat passwd" when NIS is used.
+ On some systems, such as os390, there may be no equivalent
+ command, in which case this variable is unset.
patchlevel (patchlevel.U):
The patchlevel level of this package.
The value of patchlevel comes from the patchlevel.h file.
+ In a version number such as 5.6.1, this is the "6".
+ In patchlevel.h, this is referred to as "PERL_VERSION".
path_sep (Unix.U):
This is an old synonym for p_ in Head.U, the character
used to separate elements in the command shell search PATH.
+perl5 (perl5.U):
+ This variable contains the full path (if any) to a previously
+ installed perl5.005 or later suitable for running the script
+ to determine inc_version_list.
+
perl (Loc.U):
- This variable is used internally by Configure to determine the
- full pathname (if any) of the perl program. After Configure runs,
- the value is reset to a plain "perl" and is not useful.
+ This variable is defined but not used by Configure.
+ The value is a plain '' and is not useful.
+
+PERL_REVISION (Oldsyms.U):
+ In a Perl version number such as 5.6.2, this is the 5.
+ This value is manually set in patchlevel.h
+
+PERL_SUBVERSION (Oldsyms.U):
+ In a Perl version number such as 5.6.2, this is the 2.
+ Values greater than 50 represent potentially unstable
+ development subversions.
+ This value is manually set in patchlevel.h
+
+PERL_VERSION (Oldsyms.U):
+ In a Perl version number such as 5.6.2, this is the 6.
+ This value is manually set in patchlevel.h
perladmin (perladmin.U):
Electronic mail address of the perl5 administrator.
@@ -2199,6 +2817,21 @@ plibpth (libpth.U):
Its value is prepend to libpth. This variable takes care of special
machines, like the mips. Usually, it should be empty.
+pm_apiversion (xs_apiversion.U):
+ This variable contains the version of the oldest perl
+ compatible with the present perl. (That is, pure perl modules
+ written for $pm_apiversion will still work for the current
+ version). perl.c:incpush() and lib/lib.pm will automatically
+ search in $sitelib for older directories across major versions
+ back to pm_apiversion. This is only useful if you have a perl
+ library directory tree structured like the default one. The
+ versioned site_perl library was introduced in 5.005, so that's
+ the default setting for this variable. It's hard to imagine
+ it changing before Perl6. It is included here for symmetry
+ with xs_apiveprsion -- the searching algorithms will
+ (presumably) be similar.
+ See the INSTALL file for how this works.
+
pmake (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
@@ -2236,10 +2869,26 @@ ptrsize (ptrsize.U):
This variable contains the value of the PTRSIZE symbol, which
indicates to the C program how many bytes there are in a pointer.
-randbits (randbits.U):
- This variable contains the eventual value of the RANDBITS symbol,
- which indicates to the C program how many bits of random number
- the rand() function produces.
+quadkind (quadtype.U):
+ This variable, if defined, encodes the type of a quad:
+ 1 = int, 2 = long, 3 = long long, 4 = int64_t.
+
+quadtype (quadtype.U):
+ This variable defines Quad_t to be something like long, int,
+ long long, int64_t, or whatever type is used for 64-bit integers.
+
+randbits (randfunc.U):
+ Indicates how many bits are produced by the function used to
+ generate normalized random numbers.
+
+randfunc (randfunc.U):
+ Indicates the name of the random number function to use.
+ Values include drand48, random, and rand. In C programs,
+ the 'Drand01' macro is defined to generate uniformly distributed
+ random numbers over the range [0., 1.[ (see drand01 and nrand).
+
+randseedtype (randfunc.U):
+ Indicates the type of the argument of the seedfunc.
ranlib (orderlib.U):
This variable is set to the pathname of the ranlib program, if it is
@@ -2252,6 +2901,11 @@ rd_nodata (nblock_io.U):
used, which is a shame because you cannot make the difference between
no data and an EOF.. Sigh!
+revision (patchlevel.U):
+ The value of revision comes from the patchlevel.h file.
+ In a version number such as 5.6.1, this is the "5".
+ In patchlevel.h, this is referred to as "PERL_REVISION".
+
rm (Loc.U):
This variable is used internally by Configure to determine the
full pathname (if any) of the rm program. After Configure runs,
@@ -2266,6 +2920,10 @@ runnm (usenm.U):
nm extraction should be performed or not, according to the value
of usenm and the flags on the Configure command line.
+sched_yield (d_pthread_y.U):
+ This variable defines the way to yield the execution
+ of the current thread.
+
scriptdir (scriptdir.U):
This variable holds the name of the directory in which the user wants
to put publicly scripts for the package in question. It is either
@@ -2282,6 +2940,10 @@ sed (Loc.U):
full pathname (if any) of the sed program. After Configure runs,
the value is reset to a plain "sed" and is not useful.
+seedfunc (randfunc.U):
+ Indicates the random number generating seed function.
+ Values include srand48, srandom, and srand.
+
selectminbits (selectminbits.U):
This variable holds the minimum number of bits operated by select.
That is, if you do select(n, ...), how many bits at least will be
@@ -2296,9 +2958,8 @@ selecttype (selecttype.U):
have select(), naturally.
sendmail (Loc.U):
- This variable is used internally by Configure to determine the
- full pathname (if any) of the sendmail program. After Configure runs,
- the value is reset to a plain "sendmail" and is not useful.
+ This variable is defined but not used by Configure.
+ The value is a plain '' and is not useful.
sh (sh.U):
This variable contains the full pathname of the shell used
@@ -2332,11 +2993,11 @@ shrpenv (libperl.U):
One way to do this on some systems is to set the environment variable
LD_RUN_PATH to the directory that will be the final location of the
shared libperl.so. The makefile can use this with something like
- $shrpenv $(CC) -o perl perlmain.o $libperl $libs
+ $shrpenv $(CC) -o perl perlmain.o $libperl $libs
Typical values are
- shrpenv="env LD_RUN_PATH=$archlibexp/CORE"
+ shrpenv="env LD_RUN_PATH=$archlibexp/CORE"
or
- shrpenv=''
+ shrpenv=''
See the main perl Makefile.SH for actual working usage.
Alternatively, we might be able to use a command line option such
as -R $archlibexp/CORE (Solaris, NetBSD) or -Wl,-rpath
@@ -2346,6 +3007,10 @@ shsharp (spitshell.U):
This variable tells further Configure units whether your sh can
handle # comments.
+sig_count (sig_name.U):
+ This variable holds a number larger than the largest valid
+ signal number. This is usually the same as the NSIG macro.
+
sig_name (sig_name.U):
This variable holds the signal names, space separated. The leading
SIG in signal name is removed. A ZERO is prepended to the
@@ -2359,7 +3024,7 @@ sig_name_init (sig_name.U):
is removed. See sig_num.
sig_num (sig_name.U):
- This variable holds the signal numbers, comma separated. A 0 is
+ This variable holds the signal numbers, space separated. A ZERO is
prepended to the list (corresponding to the fake SIGZERO), and
the list is terminated with a 0. Those numbers correspond to
the value of the signal listed in the same place within the
@@ -2379,21 +3044,63 @@ sitearch (sitearch.U):
which is the name of the private library for this package. It may
have a ~ on the front. It is up to the makefile to eventually create
this directory while performing installation (with ~ substitution).
+ The standard distribution will put nothing in this directory.
+ After perl has been installed, users may install their own local
+ architecture-dependent modules in this directory with
+ MakeMaker Makefile.PL
+ or equivalent. See INSTALL for details.
sitearchexp (sitearch.U):
This variable is the ~name expanded version of sitearch, so that you
may use it directly in Makefiles or shell scripts.
+sitebin (sitebin.U):
+ This variable holds the name of the directory in which the user wants
+ to put add-on publicly executable files for the package in question. It
+ is most often a local directory such as /usr/local/bin. Programs using
+ this variable must be prepared to deal with ~name substitution.
+ The standard distribution will put nothing in this directory.
+ After perl has been installed, users may install their own local
+ executables in this directory with
+ MakeMaker Makefile.PL
+ or equivalent. See INSTALL for details.
+
+sitebinexp (sitebin.U):
+ This is the same as the sitebin variable, but is filename expanded at
+ configuration time, for use in your makefiles.
+
sitelib (sitelib.U):
This variable contains the eventual value of the SITELIB symbol,
which is the name of the private library for this package. It may
have a ~ on the front. It is up to the makefile to eventually create
this directory while performing installation (with ~ substitution).
+ The standard distribution will put nothing in this directory.
+ After perl has been installed, users may install their own local
+ architecture-independent modules in this directory with
+ MakeMaker Makefile.PL
+ or equivalent. See INSTALL for details.
+
+sitelib_stem (sitelib.U):
+ This variable is $sitelibexp with any trailing version-specific component
+ removed. The elements in inc_version_list (inc_version_list.U) can
+ be tacked onto this variable to generate a list of directories to search.
sitelibexp (sitelib.U):
This variable is the ~name expanded version of sitelib, so that you
may use it directly in Makefiles or shell scripts.
+siteprefix (siteprefix.U):
+ This variable holds the full absolute path of the directory below
+ which the user will install add-on packages.
+ See INSTALL for usage and examples.
+
+siteprefixexp (siteprefix.U):
+ This variable holds the full absolute path of the directory below
+ which the user will install add-on packages. Derived from siteprefix.
+
+sizesize (sizesize.U):
+ This variable contains the size of a sizetype in bytes.
+
sizetype (sizetype.U):
This variable defines sizetype to be something like size_t,
unsigned long, or whatever type is used to declare length
@@ -2422,6 +3129,11 @@ sockethdr (d_socket.U):
socketlib (d_socket.U):
This variable has the names of any libraries needed for socket support.
+socksizetype (socksizetype.U):
+ This variable holds the type used for the size argument
+ for various socket calls like accept. Usual values include
+ socklen_t, size_t, and int.
+
sort (Loc.U):
This variable is used internally by Configure to determine the
full pathname (if any) of the sort program. After Configure runs,
@@ -2442,6 +3154,54 @@ split (models.U):
machines that support separation of instruction and data space. It is
up to the Makefile to use this.
+sPRId64 (quadfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format 64-bit decimal numbers (format 'd') for output.
+
+sPRIeldbl (longdblfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format long doubles (format 'e') for output.
+
+sPRIEldbl (longdblfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format long doubles (format 'E') for output.
+
+sPRIfldbl (longdblfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format long doubles (format 'f') for output.
+
+sPRIFldbl (longdblfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format long doubles (format 'F') for output.
+
+sPRIgldbl (longdblfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format long doubles (format 'g') for output.
+
+sPRIGldbl (longdblfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format long doubles (format 'G') for output.
+
+sPRIi64 (quadfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format 64-bit decimal numbers (format 'i') for output.
+
+sPRIo64 (quadfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format 64-bit octal numbers (format 'o') for output.
+
+sPRIu64 (quadfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format 64-bit unsigned decimal numbers (format 'u') for output.
+
+sPRIx64 (quadfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format 64-bit hexadecimal numbers (format 'x') for output.
+
+sPRIX64 (quadfio.U):
+ This variable, if defined, contains the string used by stdio to
+ format 64-bit hExADECimAl numbers (format 'X') for output.
+
src (src.U):
This variable holds the path to the package source. It is up to
the Makefile to use this variable and set VPATH accordingly to
@@ -2458,8 +3218,8 @@ startperl (startperl.U):
script to make sure (hopefully) that it runs with perl and not some
shell. Of course, that leading line must be followed by the classical
perl idiom:
- eval 'exec perl -S $0 ${1+"$@"}'
- if $running_under_some_shell;
+ eval 'exec perl -S $0 ${1+"$@"}'
+ if $running_under_some_shell;
to guarantee perl startup should the shell execute the script. Note
that this magic incatation is not understood by csh.
@@ -2502,6 +3262,10 @@ stdio_ptr (d_stdstdio.U):
_ptr field (or equivalent) of stdio.h's FILE structure. This will
be used to define the macro FILE_ptr(fp).
+stdio_stream_array (stdio_streams.U):
+ This variable tells the name of the array holding the stdio streams.
+ Usual values include _iob, __iob, and __sF.
+
strings (i_string.U):
This variable holds the full path of the string header that will be
used. Typically /usr/include/string.h or /usr/include/strings.h.
@@ -2513,6 +3277,8 @@ submit (Loc.U):
subversion (patchlevel.U):
The subversion level of this package.
The value of subversion comes from the patchlevel.h file.
+ In a version number such as 5.6.1, this is the "1".
+ In patchlevel.h, this is referred to as "PERL_SUBVERSION".
This is unique to perl.
sysman (sysman.U):
@@ -2534,9 +3300,8 @@ tbl (Loc.U):
The value is a plain '' and is not useful.
tee (Loc.U):
- This variable is used internally by Configure to determine the
- full pathname (if any) of the tee program. After Configure runs,
- the value is reset to a plain "tee" and is not useful.
+ This variable is defined but not used by Configure.
+ The value is a plain '' and is not useful.
test (Loc.U):
This variable is used internally by Configure to determine the
@@ -2571,6 +3336,40 @@ troff (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
+u16size (perlxv.U):
+ This variable is the size of an U16 in bytes.
+
+u16type (perlxv.U):
+ This variable contains the C type used for Perl's U16.
+
+u32size (perlxv.U):
+ This variable is the size of an U32 in bytes.
+
+u32type (perlxv.U):
+ This variable contains the C type used for Perl's U32.
+
+u64size (perlxv.U):
+ This variable is the size of an U64 in bytes.
+
+u64type (perlxv.U):
+ This variable contains the C type used for Perl's U64.
+
+u8size (perlxv.U):
+ This variable is the size of an U8 in bytes.
+
+u8type (perlxv.U):
+ This variable contains the C type used for Perl's U8.
+
+uidformat (uidf.U):
+ This variable contains the format string used for printing a Uid_t.
+
+uidsign (uidsign.U):
+ This variable contains the signedness of a uidtype.
+ 1 for unsigned, -1 for signed.
+
+uidsize (uidsize.U):
+ This variable contains the size of a uidtype in bytes.
+
uidtype (uidtype.U):
This variable defines Uid_t to be something like uid_t, int,
ushort, or whatever type is used to declare user ids in the kernel.
@@ -2585,10 +3384,61 @@ uniq (Loc.U):
full pathname (if any) of the uniq program. After Configure runs,
the value is reset to a plain "uniq" and is not useful.
+uquadtype (quadtype.U):
+ This variable defines Uquad_t to be something like unsigned long,
+ unsigned int, unsigned long long, uint64_t, or whatever type is
+ used for 64-bit integers.
+
+use5005threads (usethreads.U):
+ This variable conditionally defines the USE_5005THREADS symbol,
+ and indicates that Perl should be built to use the 5.005-based
+ threading implementation.
+
+use64bitall (use64bits.U):
+ This variable conditionally defines the USE_64_BIT_ALL symbol,
+ and indicates that 64-bit integer types should be used
+ when available. The maximal possible
+ 64-bitness is employed: LP64 or ILP64, meaning that you will
+ be able to use more than 2 gigabytes of memory. This mode is
+ even more binary incompatible than USE_64_BIT_INT. You may not
+ be able to run the resulting executable in a 32-bit CPU at all or
+ you may need at least to reboot your OS to 64-bit mode.
+
+use64bitint (use64bits.U):
+ This variable conditionally defines the USE_64_BIT_INT symbol,
+ and indicates that 64-bit integer types should be used
+ when available. The minimal possible 64-bitness
+ is employed, just enough to get 64-bit integers into Perl.
+ This may mean using for example "long longs", while your memory
+ may still be limited to 2 gigabytes.
+
usedl (dlsrc.U):
- This variable indicates if the the system supports dynamic
+ This variable indicates if the system supports dynamic
loading of some sort. See also dlsrc and dlobj.
+useithreads (usethreads.U):
+ This variable conditionally defines the USE_ITHREADS symbol,
+ and indicates that Perl should be built to use the interpreter-based
+ threading implementation.
+
+uselargefiles (uselfs.U):
+ This variable conditionally defines the USE_LARGE_FILES symbol,
+ and indicates that large file interfaces should be used when
+ available.
+
+uselongdouble (uselongdbl.U):
+ This variable conditionally defines the USE_LONG_DOUBLE symbol,
+ and indicates that long doubles should be used when available.
+
+usemorebits (usemorebits.U):
+ This variable conditionally defines the USE_MORE_BITS symbol,
+ and indicates that explicit 64-bit interfaces and long doubles
+ should be used when available.
+
+usemultiplicity (usemultiplicity.U):
+ This variable conditionally defines the MULTIPLICITY symbol,
+ and indicates that Perl should be built to use multiplicity.
+
usemymalloc (mallocsrc.U):
This variable contains y if the malloc that comes with this package
is desired over the system's version of malloc. People often include
@@ -2630,10 +3480,18 @@ useshrplib (libperl.U):
This variable is set to 'yes' if the user wishes
to build a shared libperl, and 'no' otherwise.
+usesocks (usesocks.U):
+ This variable conditionally defines the USE_SOCKS symbol,
+ and indicates that Perl should be built to use SOCKS.
+
usethreads (usethreads.U):
This variable conditionally defines the USE_THREADS symbol,
and indicates that Perl should be built to use threads.
+usevendorprefix (vendorprefix.U):
+ This variable tells whether the vendorprefix
+ and consequently other vendor* paths are in use.
+
usevfork (d_vfork.U):
This variable is set to true when the user accepts to use vfork.
It is set to false when no vfork is available or when the user
@@ -2647,12 +3505,83 @@ uuname (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
+uvoformat (perlxvf.U):
+ This variable contains the format string used for printing
+ a Perl UV as an unsigned octal integer.
+
+uvsize (perlxv.U):
+ This variable is the size of a UV in bytes.
+
+uvtype (perlxv.U):
+ This variable contains the C type used for Perl's UV.
+
+uvuformat (perlxvf.U):
+ This variable contains the format string used for printing
+ a Perl UV as an unsigned decimal integer.
+
+uvxformat (perlxvf.U):
+ This variable contains the format string used for printing
+ a Perl UV as an unsigned hexadecimal integer.
+
+vendorarch (vendorarch.U):
+ This variable contains the value of the PERL_VENDORARCH symbol.
+ It may have a ~ on the front.
+ The standard distribution will put nothing in this directory.
+ Vendors who distribute perl may wish to place their own
+ architecture-dependent modules and extensions in this directory with
+ MakeMaker Makefile.PL INSTALLDIRS=vendor
+ or equivalent. See INSTALL for details.
+
+vendorarchexp (vendorarch.U):
+ This variable is the ~name expanded version of vendorarch, so that you
+ may use it directly in Makefiles or shell scripts.
+
+vendorbin (vendorbin.U):
+ This variable contains the eventual value of the VENDORBIN symbol.
+ It may have a ~ on the front.
+ The standard distribution will put nothing in this directory.
+ Vendors who distribute perl may wish to place additional
+ binaries in this directory with
+ MakeMaker Makefile.PL INSTALLDIRS=vendor
+ or equivalent. See INSTALL for details.
+
+vendorbinexp (vendorbin.U):
+ This variable is the ~name expanded version of vendorbin, so that you
+ may use it directly in Makefiles or shell scripts.
+
+vendorlib (vendorlib.U):
+ This variable contains the eventual value of the VENDORLIB symbol,
+ which is the name of the private library for this package.
+ The standard distribution will put nothing in this directory.
+ Vendors who distribute perl may wish to place their own
+ modules in this directory with
+ MakeMaker Makefile.PL INSTALLDIRS=vendor
+ or equivalent. See INSTALL for details.
+
+vendorlib_stem (vendorlib.U):
+ This variable is $vendorlibexp with any trailing version-specific component
+ removed. The elements in inc_version_list (inc_version_list.U) can
+ be tacked onto this variable to generate a list of directories to search.
+
+vendorlibexp (vendorlib.U):
+ This variable is the ~name expanded version of vendorlib, so that you
+ may use it directly in Makefiles or shell scripts.
+
+vendorprefix (vendorprefix.U):
+ This variable holds the full absolute path of the directory below
+ which the vendor will install add-on packages.
+ See INSTALL for usage and examples.
+
+vendorprefixexp (vendorprefix.U):
+ This variable holds the full absolute path of the directory below
+ which the vendor will install add-on packages. Derived from vendorprefix.
+
version (patchlevel.U):
- The full version number of this package. This combines
- baserev, patchlevel, and subversion to get the full
- version number, including any possible subversions. Care
- is taken to use the C locale in order to get something
- like 5.004 instead of 5,004. This is unique to perl.
+ The full version number of this package, such as 5.6.1 (or 5_6_1).
+ This combines revision, patchlevel, and subversion to get the
+ full version number, including any possible subversions.
+ This is suitable for use as a directory name, and hence is
+ filesystem dependent.
vi (Loc.U):
This variable is defined but not used by Configure.
@@ -2663,6 +3592,28 @@ voidflags (voidflags.U):
which indicates how much support of the void type is given by this
compiler. See VOIDFLAGS for more info.
+xlibpth (libpth.U):
+ This variable holds extra path (space-separated) used to find
+ libraries on this platform, for example CPU-specific libraries
+ (on multi-CPU platforms) may be listed here.
+
+xs_apiversion (xs_apiversion.U):
+ This variable contains the version of the oldest perl binary
+ compatible with the present perl. perl.c:incpush() and
+ lib/lib.pm will automatically search in $sitearch for older
+ directories across major versions back to xs_apiversion.
+ This is only useful if you have a perl library directory tree
+ structured like the default one.
+ See INSTALL for how this works.
+ The versioned site_perl directory was introduced in 5.005,
+ so that is the lowest possible value.
+ Since this can depend on compile time options (such as
+ bincompat) it is set by Configure. Other non-default sources
+ of potential incompatibility, such as multiplicity, threads,
+ debugging, 64bits, sfio, etc., are not checked for currently,
+ though in principle we could go snooping around in old
+ Config.pm files.
+
zcat (Loc.U):
This variable is defined but not used by Configure.
The value is a plain '' and is not useful.
diff --git a/contrib/perl5/Porting/config.sh b/contrib/perl5/Porting/config.sh
index 20e1c4c..3f29888 100644
--- a/contrib/perl5/Porting/config.sh
+++ b/contrib/perl5/Porting/config.sh
@@ -8,9 +8,9 @@
# Package name : perl5
# Source directory : .
-# Configuration time: Tue Jul 21 10:03:27 EDT 1998
-# Configured by : doughera
-# Target system : linux fractal 2.0.34 #1 tue jun 23 10:09:17 edt 1998 i686 unknown
+# Configuration time: Tue Mar 21 23:22:20 EET 2000
+# Configured by : jhi
+# Target system : osf1 alpha.hut.fi v4.0 878 alpha
Author=''
Date='$Date'
@@ -27,33 +27,40 @@ _a='.a'
_exe=''
_o='.o'
afs='false'
-alignbytes='4'
+alignbytes='8'
ansi2knr=''
aphostname=''
-apiversion='5.005'
+api_revision='5'
+api_subversion='0'
+api_version='5'
+api_versionstring='5.005'
ar='ar'
-archlib='/opt/perl/lib/5.005/i686-linux-thread'
-archlibexp='/opt/perl/lib/5.005/i686-linux-thread'
-archname='i686-linux-thread'
+archlib='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
+archlibexp='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
+archname64=''
+archname='alpha-dec_osf-thread-multi'
archobjs=''
awk='awk'
baserev='5.0'
bash=''
bin='/opt/perl/bin'
+bincompat5005='undef'
binexp='/opt/perl/bin'
bison=''
byacc='byacc'
-byteorder='1234'
-c=''
+byteorder='12345678'
+c='\c'
castflags='0'
cat='cat'
cc='cc'
-cccdlflags='-fpic'
-ccdlflags='-rdynamic'
-ccflags='-D_REENTRANT -Dbool=char -DHAS_BOOL -I/usr/local/include'
-cf_by='doughera'
+cccdlflags=' '
+ccdlflags=' -Wl,-rpath,/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi/CORE'
+ccflags='-pthread -std -DLANGUAGE_C'
+ccsymbols='__alpha=1 __LANGUAGE_C__=1 __osf__=1 __unix__=1 _LONGLONG=1 _SYSTYPE_BSD=1 SYSTYPE_BSD=1 unix=1'
+cf_by='jhi'
cf_email='yourname@yourhost.yourplace.com'
-cf_time='Tue Jul 21 10:03:27 EDT 1998'
+cf_time='Tue Mar 21 23:22:20 EET 2000'
+charsize='1'
chgrp=''
chmod=''
chown=''
@@ -65,23 +72,42 @@ cp='cp'
cpio=''
cpp='cpp'
cpp_stuff='42'
-cppflags='-D_REENTRANT -Dbool=char -DHAS_BOOL -I/usr/local/include'
-cpplast='-'
-cppminus='-'
-cpprun='cc -E'
-cppstdin='cc -E'
+cppccsymbols='LANGUAGE_C=1'
+cppflags='-pthread -std -DLANGUAGE_C'
+cpplast=''
+cppminus=''
+cpprun='/usr/bin/cpp'
+cppstdin='cppstdin'
+cppsymbols='_AES_SOURCE=1 __alpha=1 __ALPHA=1 _ANSI_C_SOURCE=1 __LANGUAGE_C__=1 _LONGLONG=1 __osf__=1 _OSF_SOURCE=1 _POSIX_C_SOURCE=199506 _POSIX_SOURCE=1 _REENTRANT=1 __STDC__=1 _SYSTYPE_BSD=1 __unix__=1 _XOPEN_SOURCE=1'
+crosscompile='undef'
cryptlib=''
csh='csh'
d_Gconvert='gcvt((x),(n),(b))'
+d_PRIEldbl='define'
+d_PRIFldbl='define'
+d_PRIGldbl='define'
+d_PRIX64='define'
+d_PRId64='define'
+d_PRIeldbl='define'
+d_PRIfldbl='define'
+d_PRIgldbl='define'
+d_PRIi64='define'
+d_PRIo64='define'
+d_PRIu64='define'
+d_PRIx64='define'
d_access='define'
+d_accessx='undef'
d_alarm='define'
d_archlib='define'
-d_attribut='define'
+d_atolf='undef'
+d_atoll='undef'
+d_attribut='undef'
d_bcmp='define'
d_bcopy='define'
+d_bincompat5005='undef'
d_bsd='undef'
d_bsdgetpgrp='undef'
-d_bsdsetpgrp='undef'
+d_bsdsetpgrp='define'
d_bzero='define'
d_casti32='undef'
d_castneg='define'
@@ -96,18 +122,21 @@ d_csh='define'
d_cuserid='define'
d_dbl_dig='define'
d_difftime='define'
-d_dirnamlen='undef'
+d_dirnamlen='define'
d_dlerror='define'
d_dlopen='define'
d_dlsymun='undef'
d_dosuid='undef'
+d_drand48proto='define'
d_dup2='define'
+d_eaccess='undef'
d_endgrent='define'
d_endhent='define'
d_endnent='define'
d_endpent='define'
d_endpwent='define'
d_endsent='define'
+d_endspent='undef'
d_eofnblk='define'
d_eunice='undef'
d_fchmod='define'
@@ -121,16 +150,26 @@ d_flexfnam='define'
d_flock='define'
d_fork='define'
d_fpathconf='define'
+d_fpos64_t='undef'
+d_fs_data_s='undef'
+d_fseeko='undef'
d_fsetpos='define'
+d_fstatfs='define'
+d_fstatvfs='define'
+d_ftello='undef'
d_ftime='undef'
+d_getcwd='define'
+d_getfsstat='define'
d_getgrent='define'
d_getgrps='define'
d_gethbyaddr='define'
d_gethbyname='define'
d_gethent='define'
-d_gethname='undef'
+d_gethname='define'
d_gethostprotos='define'
d_getlogin='define'
+d_getmnt='undef'
+d_getmntent='undef'
d_getnbyaddr='define'
d_getnbyname='define'
d_getnent='define'
@@ -149,38 +188,62 @@ d_getsbyname='define'
d_getsbyport='define'
d_getsent='define'
d_getservprotos='define'
+d_getspent='undef'
+d_getspnam='undef'
d_gettimeod='define'
-d_gnulibc='define'
+d_gnulibc='undef'
d_grpasswd='define'
+d_hasmntopt='undef'
d_htonl='define'
+d_iconv='define'
d_index='undef'
d_inetaton='define'
+d_int64_t='undef'
d_isascii='define'
d_killpg='define'
-d_lchown='undef'
+d_lchown='define'
+d_ldbl_dig='define'
d_link='define'
d_locconv='define'
d_lockf='define'
d_longdbl='define'
d_longlong='define'
+d_lseekproto='define'
d_lstat='define'
+d_madvise='define'
d_mblen='define'
d_mbstowcs='define'
d_mbtowc='define'
+d_memchr='define'
d_memcmp='define'
d_memcpy='define'
d_memmove='define'
d_memset='define'
d_mkdir='define'
+d_mkdtemp='undef'
d_mkfifo='define'
+d_mkstemp='define'
+d_mkstemps='undef'
d_mktime='define'
+d_mmap='define'
+d_mprotect='define'
d_msg='define'
+d_msg_ctrunc='define'
+d_msg_dontroute='define'
+d_msg_oob='define'
+d_msg_peek='define'
+d_msg_proxy='undef'
d_msgctl='define'
d_msgget='define'
d_msgrcv='define'
d_msgsnd='define'
+d_msync='define'
+d_munmap='define'
d_mymalloc='undef'
d_nice='define'
+d_nv_preserves_uv='undef'
+d_off64_t='undef'
+d_old_pthread_create_joinable='undef'
d_oldpthreads='undef'
d_oldsock='undef'
d_open3='define'
@@ -191,15 +254,16 @@ d_pipe='define'
d_poll='define'
d_portable='define'
d_pthread_yield='undef'
-d_pthreads_created_joinable='define'
d_pwage='undef'
d_pwchange='undef'
d_pwclass='undef'
-d_pwcomment='undef'
+d_pwcomment='define'
d_pwexpire='undef'
d_pwgecos='define'
-d_pwquota='undef'
d_pwpasswd='define'
+d_pwquota='define'
+d_qgcvt='undef'
+d_quad='define'
d_readdir='define'
d_readlink='define'
d_rename='define'
@@ -209,6 +273,7 @@ d_safebcpy='define'
d_safemcpy='undef'
d_sanemcmp='define'
d_sched_yield='define'
+d_scm_rights='define'
d_seekdir='define'
d_select='define'
d_sem='define'
@@ -235,10 +300,11 @@ d_setregid='define'
d_setresgid='undef'
d_setresuid='undef'
d_setreuid='define'
-d_setrgid='undef'
-d_setruid='undef'
+d_setrgid='define'
+d_setruid='define'
d_setsent='define'
d_setsid='define'
+d_setspent='undef'
d_setvbuf='define'
d_sfio='undef'
d_shm='define'
@@ -250,10 +316,16 @@ d_shmget='define'
d_sigaction='define'
d_sigsetjmp='define'
d_socket='define'
+d_socklen_t='undef'
d_sockpair='define'
-d_statblks='undef'
-d_stdio_cnt_lval='undef'
+d_sqrtl='define'
+d_statblks='define'
+d_statfs_f_flags='define'
+d_statfs_s='define'
+d_statvfs='define'
+d_stdio_cnt_lval='define'
d_stdio_ptr_lval='define'
+d_stdio_stream_array='define'
d_stdiobase='define'
d_stdstdio='define'
d_strchr='define'
@@ -263,7 +335,11 @@ d_strerrm='strerror(e)'
d_strerror='define'
d_strtod='define'
d_strtol='define'
+d_strtold='undef'
+d_strtoll='undef'
d_strtoul='define'
+d_strtoull='undef'
+d_strtouq='undef'
d_strxfrm='define'
d_suidsafe='undef'
d_symlink='define'
@@ -275,13 +351,18 @@ d_system='define'
d_tcgetpgrp='define'
d_tcsetpgrp='define'
d_telldir='define'
+d_telldirproto='define'
d_time='define'
d_times='define'
d_truncate='define'
d_tzname='define'
d_umask='define'
d_uname='define'
-d_union_semun='define'
+d_union_semun='undef'
+d_ustat='define'
+d_vendorarch='undef'
+d_vendorbin='undef'
+d_vendorlib='undef'
d_vfork='undef'
d_void_closedir='undef'
d_voidsig='define'
@@ -301,7 +382,8 @@ direntrytype='struct dirent'
dlext='so'
dlsrc='dl_dlopen.xs'
doublesize='8'
-dynamic_ext='B DB_File Data/Dumper Fcntl GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Thread attrs re'
+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 Sys/Hostname Sys/Syslog Thread attrs re'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
@@ -310,17 +392,24 @@ emacs=''
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='B DB_File Data/Dumper Fcntl GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Thread attrs re Errno'
-find='find'
+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 Sys/Hostname Sys/Syslog Thread attrs re Errno'
+fflushNULL='define'
+fflushall='undef'
+find=''
firstmakefile='makefile'
flex=''
+fpossize='8'
fpostype='fpos_t'
freetype='void'
-full_csh='/bin/csh'
-full_sed='/bin/sed'
-gccversion='2.7.2.3'
+full_ar='/usr/bin/ar'
+full_csh='/usr/bin/csh'
+full_sed='/usr/bin/sed'
+gccversion=''
+gidformat='"u"'
+gidsign='1'
+gidsize='4'
gidtype='gid_t'
-glibpth='/usr/shlib /shlib /lib/pa1.1 /usr/lib/large /lib /usr/lib /usr/lib/386 /lib/386 /lib/large /usr/lib/small /lib/small /usr/ccs/lib /usr/ucblib /usr/local/lib '
+glibpth='/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib'
grep='grep'
groupcat='cat /etc/group'
groupstype='gid_t'
@@ -330,6 +419,14 @@ h_sysfile='true'
hint='recommended'
hostcat='cat /etc/hosts'
huge=''
+i16size='2'
+i16type='short'
+i32size='4'
+i32type='int'
+i64size='8'
+i64type='long'
+i8size='1'
+i8type='char'
i_arpainet='define'
i_bsdioctl=''
i_db='define'
@@ -339,88 +436,131 @@ i_dld='undef'
i_dlfcn='define'
i_fcntl='undef'
i_float='define'
-i_gdbm='define'
+i_gdbm='undef'
i_grp='define'
+i_iconv='define'
+i_ieeefp='undef'
+i_inttypes='undef'
i_limits='define'
i_locale='define'
+i_machcthr='undef'
i_malloc='define'
i_math='define'
i_memory='undef'
+i_mntent='undef'
i_ndbm='define'
i_netdb='define'
i_neterrno='undef'
+i_netinettcp='define'
i_niin='define'
+i_poll='define'
+i_pthread='define'
i_pwd='define'
i_rpcsvcdbm='undef'
i_sfio='undef'
i_sgtty='undef'
+i_shadow='undef'
+i_socks='undef'
i_stdarg='define'
i_stddef='define'
i_stdlib='define'
i_string='define'
+i_sunmath='undef'
+i_sysaccess='define'
i_sysdir='define'
i_sysfile='define'
i_sysfilio='undef'
i_sysin='undef'
i_sysioctl='define'
+i_syslog='define'
+i_sysmman='define'
+i_sysmode='define'
+i_sysmount='define'
i_sysndir='undef'
i_sysparam='define'
i_sysresrc='define'
+i_syssecrt='define'
i_sysselct='define'
i_syssockio=''
i_sysstat='define'
+i_sysstatfs='undef'
+i_sysstatvfs='define'
i_systime='define'
i_systimek='undef'
i_systimes='define'
i_systypes='define'
+i_sysuio='define'
i_sysun='define'
+i_sysutsname='define'
+i_sysvfs='undef'
i_syswait='define'
i_termio='undef'
i_termios='define'
i_time='undef'
i_unistd='define'
+i_ustat='define'
i_utime='define'
i_values='define'
i_varargs='undef'
i_varhdr='stdarg.h'
i_vfork='undef'
+ignore_versioned_solibs=''
+inc_version_list=' '
+inc_version_list_init='0'
incpath=''
inews=''
-installarchlib='/opt/perl/lib/5.005/i686-linux-thread'
+installarchlib='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
installbin='/opt/perl/bin'
installman1dir='/opt/perl/man/man1'
installman3dir='/opt/perl/man/man3'
-installprivlib='/opt/perl/lib/5.005'
-installscript='/opt/perl/script'
-installsitearch='/opt/perl/lib/site_perl/5.005/i686-linux-thread'
-installsitelib='/opt/perl/lib/site_perl/5.005'
+installprefix='/opt/perl'
+installprefixexp='/opt/perl'
+installprivlib='/opt/perl/lib/5.6.0'
+installscript='/opt/perl/bin'
+installsitearch='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
+installsitebin='/opt/perl/bin'
+installsitelib='/opt/perl/lib/site_perl/5.6.0'
+installstyle='lib'
+installusrbinperl='define'
+installvendorarch=''
+installvendorbin=''
+installvendorlib=''
intsize='4'
-known_extensions='B DB_File Data/Dumper Fcntl GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Thread attrs re'
+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 Sys/Hostname Sys/Syslog Thread attrs re'
ksh=''
large=''
-ld='cc'
-lddlflags='-shared -L/usr/local/lib'
-ldflags=' -L/usr/local/lib'
+ld='ld'
+lddlflags='-shared -expect_unresolved "*" -msym -std -s'
+ldflags=''
+ldlibpthname='LD_LIBRARY_PATH'
less='less'
lib_ext='.a'
-libc=''
-libperl='libperl.a'
-libpth='/usr/local/lib /lib /usr/lib'
-libs='-lnsl -lndbm -lgdbm -ldbm -ldb -ldl -lm -lpthread -lc -lposix -lcrypt'
-libswanted='sfio socket inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m pthread c cposix posix ndir dir crypt ucb BSD PW x'
-line='line'
+libc='/usr/shlib/libc.so'
+libperl='libperl.so'
+libpth='/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /var/shlib'
+libs='-lgdbm -ldbm -ldb -lm -liconv -lpthread -lexc'
+libsdirs=' /usr/shlib /usr/ccs/lib'
+libsfiles=' libgdbm.so libdbm.a libdb.so libm.so libiconv.so libpthread.so libexc.so'
+libsfound=' /usr/shlib/libgdbm.so /usr/ccs/lib/libdbm.a /usr/shlib/libdb.so /usr/shlib/libm.so /usr/shlib/libiconv.so /usr/shlib/libpthread.so /usr/shlib/libexc.so'
+libspath=' /usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /var/shlib'
+libswanted='sfio socket bind inet nsl nm gdbm dbm db malloc dld ld sun m cposix posix ndir dir crypt sec ucb BSD x iconv pthread exc'
+line=''
lint=''
lkflags=''
ln='ln'
-lns='/bin/ln -s'
+lns='/usr/bin/ln -s'
locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include'
loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib'
-longdblsize='12'
+longdblsize='8'
longlongsize='8'
-longsize='4'
+longsize='8'
lp=''
lpr=''
ls='ls'
+lseeksize='8'
lseektype='off_t'
mail=''
mailx=''
@@ -436,64 +576,90 @@ man3dir='/opt/perl/man/man3'
man3direxp='/opt/perl/man/man3'
man3ext='3'
medium=''
-mips=''
mips_type=''
mkdir='mkdir'
+mmaptype='void *'
models='none'
modetype='mode_t'
more='more'
+multiarch='undef'
mv=''
-myarchname='i686-linux'
+myarchname='alpha-dec_osf'
mydomain='.yourplace.com'
myhostname='yourhost'
-myuname='linux fractal 2.0.34 #1 tue jun 23 10:09:17 edt 1998 i686 unknown '
-n='-n'
+myuname='osf1 alpha.hut.fi v4.0 878 alpha '
+n=''
netdb_hlen_type='int'
netdb_host_type='const char *'
netdb_name_type='const char *'
-netdb_net_type='unsigned long'
+netdb_net_type='int'
nm='nm'
-nm_opt=''
-nm_so_opt='--dynamic'
+nm_opt='-p'
+nm_so_opt=''
nonxs_ext='Errno'
nroff='nroff'
+nvsize='8'
+nvtype='double'
o_nonblock='O_NONBLOCK'
obj_ext='.o'
+old_pthread_create_joinable=''
optimize='-O'
orderlib='false'
-osname='linux'
-osvers='2.0.34'
+osname='dec_osf'
+osvers='4.0'
package='perl5'
-pager='/usr/bin/less'
+pager='/c/bin/less'
passcat='cat /etc/passwd'
-patchlevel='5'
+patchlevel='6'
path_sep=':'
-perl='perl'
+perl5='/u/vieraat/vieraat/jhi/Perl/bin/perl'
+perl=''
perladmin='yourname@yourhost.yourplace.com'
perlpath='/opt/perl/bin/perl'
pg='pg'
phostname=''
pidtype='pid_t'
plibpth=''
+pm_apiversion='5.005'
pmake=''
pr=''
prefix='/opt/perl'
prefixexp='/opt/perl'
-privlib='/opt/perl/lib/5.005'
-privlibexp='/opt/perl/lib/5.005'
+privlib='/opt/perl/lib/5.6.0'
+privlibexp='/opt/perl/lib/5.6.0'
prototype='define'
-ptrsize='4'
-randbits='31'
+ptrsize='8'
+quadkind='2'
+quadtype='long'
+randbits='48'
+randfunc='drand48'
+randseedtype='long'
ranlib=':'
rd_nodata='-1'
+revision='5'
rm='rm'
rmail=''
-runnm='false'
-scriptdir='/opt/perl/script'
-scriptdirexp='/opt/perl/script'
+runnm='true'
+sPRIEldbl='"E"'
+sPRIFldbl='"F"'
+sPRIGldbl='"G"'
+sPRIX64='"lX"'
+sPRId64='"ld"'
+sPRIeldbl='"e"'
+sPRIfldbl='"f"'
+sPRIgldbl='"g"'
+sPRIi64='"li"'
+sPRIo64='"lo"'
+sPRIu64='"lu"'
+sPRIx64='"lx"'
+sched_yield='sched_yield()'
+scriptdir='/opt/perl/bin'
+scriptdirexp='/opt/perl/bin'
sed='sed'
+seedfunc='srand48'
+selectminbits='32'
selecttype='fd_set *'
-sendmail='sendmail'
+sendmail=''
sh='/bin/sh'
shar=''
sharpbang='#!'
@@ -501,14 +667,22 @@ shmattype='void *'
shortsize='2'
shrpenv=''
shsharp='true'
-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 UNUSED IOT CLD POLL '
-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", "UNUSED", "IOT", "CLD", "POLL", 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, 6, 17, 29, 0'
+sig_count='49'
+sig_name='ZERO HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM IOINT STOP TSTP CONT CHLD TTIN TTOU AIO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2 RESV RTMIN NUM34 NUM35 NUM36 NUM37 NUM38 NUM39 NUM40 NUM41 NUM42 NUM43 NUM44 NUM45 NUM46 NUM47 MAX IOT LOST URG CLD IO POLL PTY PWR RTMAX '
+sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "IOINT", "STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "AIO", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "INFO", "USR1", "USR2", "RESV", "RTMIN", "NUM34", "NUM35", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41", "NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "MAX", "IOT", "LOST", "URG", "CLD", "IO", "POLL", "PTY", "PWR", "RTMAX", 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 6 6 16 20 23 23 23 29 48 '
+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, 6, 6, 16, 20, 23, 23, 23, 29, 48, 0'
signal_t='void'
-sitearch='/opt/perl/lib/site_perl/5.005/i686-linux-thread'
-sitearchexp='/opt/perl/lib/site_perl/5.005/i686-linux-thread'
-sitelib='/opt/perl/lib/site_perl/5.005'
-sitelibexp='/opt/perl/lib/site_perl/5.005'
+sitearch='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
+sitearchexp='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
+sitebin='/opt/perl/bin'
+sitebinexp='/opt/perl/bin'
+sitelib='/opt/perl/lib/site_perl/5.6.0'
+sitelib_stem='/opt/perl/lib/site_perl'
+sitelibexp='/opt/perl/lib/site_perl/5.6.0'
+siteprefix='/opt/perl'
+siteprefixexp='/opt/perl'
+sizesize='8'
sizetype='size_t'
sleep=''
smail=''
@@ -516,6 +690,7 @@ small=''
so='so'
sockethdr=''
socketlib=''
+socksizetype='int'
sort='sort'
spackage='Perl5'
spitshell='cat'
@@ -525,12 +700,13 @@ ssizetype='ssize_t'
startperl='#!/opt/perl/bin/perl'
startsh='#!/bin/sh'
static_ext=' '
-stdchar='char'
-stdio_base='((fp)->_IO_read_base)'
-stdio_bufsiz='((fp)->_IO_read_end - (fp)->_IO_read_base)'
-stdio_cnt='((fp)->_IO_read_end - (fp)->_IO_read_ptr)'
+stdchar='unsigned char'
+stdio_base='((fp)->_base)'
+stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)'
+stdio_cnt='((fp)->_cnt)'
stdio_filbuf=''
-stdio_ptr='((fp)->_IO_read_ptr)'
+stdio_ptr='((fp)->_ptr)'
+stdio_stream_array='_iob'
strings='/usr/include/string.h'
submit=''
subversion='0'
@@ -538,7 +714,7 @@ sysman='/usr/man/man1'
tail=''
tar=''
tbl=''
-tee='tee'
+tee=''
test='test'
timeincl='/usr/include/sys/time.h '
timetype='time_t'
@@ -546,40 +722,85 @@ touch='touch'
tr='tr'
trnl='\n'
troff=''
+u16size='2'
+u16type='unsigned short'
+u32size='4'
+u32type='unsigned int'
+u64size='8'
+u64type='unsigned long'
+u8size='1'
+u8type='unsigned char'
+uidformat='"u"'
+uidsign='1'
+uidsize='4'
uidtype='uid_t'
uname='uname'
uniq='uniq'
+uquadtype='unsigned long'
+use5005threads='undef'
+use64bitall='define'
+use64bitint='define'
usedl='define'
+useithreads='define'
+uselargefiles='define'
+uselongdouble='undef'
+usemorebits='undef'
+usemultiplicity='define'
usemymalloc='n'
-usenm='false'
+usenm='true'
useopcode='true'
useperlio='undef'
useposix='true'
usesfio='false'
-useshrplib='false'
+useshrplib='true'
+usesocks='undef'
usethreads='define'
+usevendorprefix='undef'
usevfork='false'
usrinc='/usr/include'
uuname=''
-version='5.005'
+uvoformat='"lo"'
+uvsize='8'
+uvtype='unsigned long'
+uvuformat='"lu"'
+uvxformat='"lx"'
+vendorarch=''
+vendorarchexp=''
+vendorbin=''
+vendorbinexp=''
+vendorlib=''
+vendorlib_stem=''
+vendorlibexp=''
+vendorprefix=''
+vendorprefixexp=''
+version='5.6.0'
vi=''
voidflags='15'
xlibpth='/usr/lib/386 /lib/386'
+xs_apiversion='5.6.0'
zcat=''
zip='zip'
# Configure command line arguments.
config_arg0='Configure'
-config_args='-Dprefix=/opt/perl -Doptimize=-O -Dusethreads -Dcf_by=yourname -Dcf_email=yourname@yourhost.yourplace.com -Dperladmin=yourname@yourhost.yourplace.com -Dmydomain=.yourplace.com -Dmyhostname=yourhost -dE'
-config_argc=9
+config_args='-Dprefix=/opt/perl -Doptimize=-O -Dusethreads -Duse64bitint -Duselargefiles -Dcf_by=yourname -Dcf_email=yourname@yourhost.yourplace.com -Dperladmin=yourname@yourhost.yourplace.com -Dmydomain=.yourplace.com -Dmyhostname=yourhost -dE'
+config_argc=11
config_arg1='-Dprefix=/opt/perl'
config_arg2='-Doptimize=-O'
config_arg3='-Dusethreads'
-config_arg4='-Dcf_by=yourname'
-config_arg5='-Dcf_email=yourname@yourhost.yourplace.com'
-config_arg6='-Dperladmin=yourname@yourhost.yourplace.com'
-config_arg7='-Dmydomain=.yourplace.com'
-config_arg8='-Dmyhostname=yourhost'
-config_arg9='-dE'
-PATCHLEVEL=5
-SUBVERSION=0
-CONFIG=true
+config_arg4='-Duse64bitint'
+config_arg5='-Duselargefiles'
+config_arg6='-Dcf_by=yourname'
+config_arg7='-Dcf_email=yourname@yourhost.yourplace.com'
+config_arg8='-Dperladmin=yourname@yourhost.yourplace.com'
+config_arg9='-Dmydomain=.yourplace.com'
+config_arg10='-Dmyhostname=yourhost'
+config_arg11='-dE'
+PERL_REVISION=5
+PERL_VERSION=6
+PERL_SUBVERSION=0
+PERL_API_REVISION=5
+PERL_API_VERSION=5
+PERL_API_SUBVERSION=0
+CONFIGDOTSH=true
+# Variables propagated from previous config.sh file.
+pp_sys_cflags='ccflags="$ccflags -DNO_EFF_ONLY_OK"'
diff --git a/contrib/perl5/Porting/config_H b/contrib/perl5/Porting/config_H
index 8cbf3c4..c80ebaf 100644
--- a/contrib/perl5/Porting/config_H
+++ b/contrib/perl5/Porting/config_H
@@ -17,9 +17,9 @@
/*
* Package name : perl5
* Source directory : .
- * Configuration time: Tue Jul 21 10:03:27 EDT 1998
- * Configured by : doughera
- * Target system : linux fractal 2.0.34 #1 tue jun 23 10:09:17 edt 1998 i686 unknown
+ * Configuration time: Tue Mar 21 23:22:20 EET 2000
+ * Configured by : jhi
+ * Target system : osf1 alpha.hut.fi v4.0 878 alpha
*/
#ifndef _config_h_
@@ -28,33 +28,7 @@
/* LOC_SED:
* This symbol holds the complete pathname to the sed program.
*/
-#define LOC_SED "/bin/sed" /**/
-
-/* BIN:
- * This symbol holds the path of the bin directory where the package will
- * be installed. Program must be prepared to deal with ~name substitution.
- */
-/* BIN_EXP:
- * This symbol is the filename expanded version of the BIN symbol, for
- * programs that do not want to deal with that at run-time.
- */
-#define BIN "/opt/perl/bin" /**/
-#define BIN_EXP "/opt/perl/bin" /**/
-
-/* CPPSTDIN:
- * This symbol contains the first part of the string which will invoke
- * the C preprocessor on the standard input and produce to standard
- * output. Typical value of "cc -E" or "/lib/cpp", but it can also
- * call a wrapper. See CPPRUN.
- */
-/* CPPMINUS:
- * This symbol contains the second part of the string which will invoke
- * the C preprocessor on the standard input and produce to standard
- * output. This symbol will have the value "-" if CPPSTDIN needs a minus
- * to specify standard input, otherwise the value is "".
- */
-#define CPPSTDIN "cc -E"
-#define CPPMINUS "-"
+#define LOC_SED "/usr/bin/sed" /**/
/* HAS_ALARM:
* This symbol, if defined, indicates that the alarm routine is
@@ -66,7 +40,7 @@
* This symbol indicates the C compiler can check for function attributes,
* such as printf formats. This is normally only supported by GNU cc.
*/
-#define HASATTRIBUTE /**/
+/*#define HASATTRIBUTE / **/
#ifndef HASATTRIBUTE
#define __attribute__(_arg_)
#endif
@@ -201,12 +175,6 @@
*/
#define HAS_FGETPOS /**/
-/* FLEXFILENAMES:
- * This symbol, if defined, indicates that the system supports filenames
- * longer than 14 characters.
- */
-#define FLEXFILENAMES /**/
-
/* HAS_FLOCK:
* This symbol, if defined, indicates that the flock routine is
* available to do file locking.
@@ -243,13 +211,6 @@
*/
#define HAS_GETGROUPS /**/
-/* HAS_UNAME:
- * This symbol, if defined, indicates that the C program may use the
- * uname() routine to derive the host name. See also HAS_GETHOSTNAME
- * and PHOSTNAME.
- */
-#define HAS_UNAME /**/
-
/* HAS_GETLOGIN:
* This symbol, if defined, indicates that the getlogin routine is
* available to get the login name.
@@ -292,31 +253,6 @@
*/
#define HAS_GETPRIORITY /**/
-/* HAS_HTONL:
- * This symbol, if defined, indicates that the htonl() routine (and
- * friends htons() ntohl() ntohs()) are available to do network
- * order byte swapping.
- */
-/* HAS_HTONS:
- * This symbol, if defined, indicates that the htons() routine (and
- * friends htonl() ntohl() ntohs()) are available to do network
- * order byte swapping.
- */
-/* HAS_NTOHL:
- * This symbol, if defined, indicates that the ntohl() routine (and
- * friends htonl() htons() ntohs()) are available to do network
- * order byte swapping.
- */
-/* HAS_NTOHS:
- * This symbol, if defined, indicates that the ntohs() routine (and
- * friends htonl() htons() ntohl()) are available to do network
- * order byte swapping.
- */
-#define HAS_HTONL /**/
-#define HAS_HTONS /**/
-#define HAS_NTOHL /**/
-#define HAS_NTOHS /**/
-
/* HAS_INET_ATON:
* This symbol, if defined, indicates to the C program that the
* inet_aton() function is available to parse IP address "dotted-quad"
@@ -420,11 +356,17 @@
*/
#define HAS_MKTIME /**/
-/* HAS_MSG:
- * This symbol, if defined, indicates that the entire msg*(2) library is
- * supported (IPC mechanism based on message queues).
+/* HAS_MSYNC:
+ * This symbol, if defined, indicates that the msync system call is
+ * available to synchronize a mapped file.
*/
-#define HAS_MSG /**/
+#define HAS_MSYNC /**/
+
+/* HAS_MUNMAP:
+ * This symbol, if defined, indicates that the munmap system call is
+ * available to unmap a region, usually mapped by mmap().
+ */
+#define HAS_MUNMAP /**/
/* HAS_NICE:
* This symbol, if defined, indicates that the nice routine is
@@ -516,12 +458,6 @@
*/
#define HAS_SELECT /**/
-/* HAS_SEM:
- * This symbol, if defined, indicates that the entire sem*(2) library is
- * supported.
- */
-#define HAS_SEM /**/
-
/* HAS_SETEGID:
* This symbol, if defined, indicates that the setegid routine is available
* to change the effective gid of the current program.
@@ -563,7 +499,7 @@
* for a POSIX interface.
*/
#define HAS_SETPGRP /**/
-/*#define USE_BSD_SETPGRP / **/
+#define USE_BSD_SETPGRP /**/
/* HAS_SETPGRP2:
* This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
@@ -607,13 +543,13 @@
* This symbol, if defined, indicates that the setrgid routine is available
* to change the real gid of the current program.
*/
-/*#define HAS_SETRGID / **/
+#define HAS_SETRGID /**/
/* HAS_SETRUID:
* This symbol, if defined, indicates that the setruid routine is available
* to change the real uid of the current program.
*/
-/*#define HAS_SETRUID / **/
+#define HAS_SETRUID /**/
/* HAS_SETSID:
* This symbol, if defined, indicates that the setsid routine is
@@ -621,12 +557,6 @@
*/
#define HAS_SETSID /**/
-/* HAS_SHM:
- * This symbol, if defined, indicates that the entire shm*(2) library is
- * supported.
- */
-#define HAS_SHM /**/
-
/* Shmat_t:
* This symbol holds the return type of the shmat() system call.
* Usually set to 'void *' or 'char *'.
@@ -641,12 +571,6 @@
#define Shmat_t void * /**/
#define HAS_SHMAT_PROTOTYPE /**/
-/* USE_STAT_BLOCKS:
- * This symbol is defined if this system has a stat structure declaring
- * st_blksize and st_blocks.
- */
-/*#define USE_STAT_BLOCKS / **/
-
/* HAS_STRCHR:
* This symbol is defined to indicate that the strchr()/strrchr()
* functions are available for string searching. If not, try the
@@ -672,25 +596,6 @@
*/
#define USE_STRUCT_COPY /**/
-/* HAS_STRERROR:
- * This symbol, if defined, indicates that the strerror routine is
- * available to translate error numbers to strings. See the writeup
- * of Strerror() in this file before you try to define your own.
- */
-/* HAS_SYS_ERRLIST:
- * This symbol, if defined, indicates that the sys_errlist array is
- * available to translate error numbers to strings. The extern int
- * sys_nerr gives the size of that table.
- */
-/* Strerror:
- * This preprocessor symbol is defined as a macro if strerror() is
- * not available to translate error numbers to strings but sys_errlist[]
- * array is there.
- */
-#define HAS_STRERROR /**/
-#define HAS_SYS_ERRLIST /**/
-#define Strerror(e) strerror(e)
-
/* HAS_STRTOD:
* This symbol, if defined, indicates that the strtod routine is
* available to provide better numeric string conversion than atof().
@@ -769,11 +674,6 @@
*/
#define HAS_UMASK /**/
-/* HAS_VFORK:
- * This symbol, if defined, indicates that vfork() exists.
- */
-/*#define HAS_VFORK / **/
-
/* HASVOLATILE:
* This symbol, if defined, indicates that this C compiler knows about
* the volatile declaration.
@@ -806,17 +706,11 @@
*/
#define HAS_WCTOMB /**/
-/* EBCDIC:
- * This symbol, if defined, indicates that this system uses
- * EBCDIC encoding.
- */
-/*#define EBCDIC / **/
-
/* I_ARPA_INET:
- * This symbol, if defined, indicates that <arpa/inet.h> exists and should
- * be included.
+ * This symbol, if defined, indicates to the C program that it should
+ * include <arpa/inet.h> to get inet_addr and friends declarations.
*/
-#define I_ARPA_INET /**/
+#define I_ARPA_INET /**/
/* I_DBM:
* This symbol, if defined, indicates that <dbm.h> exists and should
@@ -846,7 +740,7 @@
* portably declare your directory entries.
*/
#define I_DIRENT /**/
-/*#define DIRNAMLEN / **/
+#define DIRNAMLEN /**/
#define Direntry_t struct dirent
/* I_DLFCN:
@@ -867,32 +761,6 @@
*/
#define I_FLOAT /**/
-/* I_GRP:
- * This symbol, if defined, indicates to the C program that it should
- * include <grp.h>.
- */
-/* GRPASSWD:
- * This symbol, if defined, indicates to the C program that struct group
- * contains gr_passwd.
- */
-/* HAS_SETGRENT:
- * This symbol, if defined, indicates that the getgrent routine is
- * available for initializing sequential access of the group database.
- */
-/* HAS_GETGRENT:
- * This symbol, if defined, indicates that the getgrent routine is
- * available for sequential access of the group database.
- */
-/* HAS_ENDGRENT:
- * This symbol, if defined, indicates that the getgrent routine is
- * available for finalizing sequential access of the group database.
- */
-#define I_GRP /**/
-#define GRPASSWD /**/
-#define HAS_SETGRENT /**/
-#define HAS_GETGRENT /**/
-#define HAS_ENDGRENT /**/
-
/* I_LIMITS:
* This symbol, if defined, indicates to the C program that it should
* include <limits.h> to get definition of symbols like WORD_BIT or
@@ -1120,22 +988,158 @@
* This symbol is defined to be the type of char used in stdio.h.
* It has the values "unsigned char" or "char".
*/
-#define STDCHAR char /**/
+#define STDCHAR unsigned char /**/
+
+/* CROSSCOMPILE:
+ * This symbol, if defined, signifies that we our
+ * build process is a cross-compilation.
+ */
+/*#define CROSSCOMPILE / **/
+
+/* INTSIZE:
+ * This symbol contains the value of sizeof(int) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* LONGSIZE:
+ * This symbol contains the value of sizeof(long) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* SHORTSIZE:
+ * This symbol contains the value of sizeof(short) so that the C
+ * preprocessor can make decisions based on it.
+ */
+#define INTSIZE 4 /**/
+#define LONGSIZE 8 /**/
+#define SHORTSIZE 2 /**/
+
+/* MULTIARCH:
+ * This symbol, if defined, signifies that the build
+ * process will produce some binary files that are going to be
+ * used in a cross-platform environment. This is the case for
+ * example with the NeXT "fat" binaries that contain executables
+ * for several CPUs.
+ */
+/*#define MULTIARCH / **/
+
+/* HAS_QUAD:
+ * This symbol, if defined, tells that there's a 64-bit integer type,
+ * Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one
+ * of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T.
+ */
+#define HAS_QUAD /**/
+#ifdef HAS_QUAD
+# define Quad_t long /**/
+# define Uquad_t unsigned long /**/
+# define QUADKIND 2 /**/
+# define QUAD_IS_INT 1
+# define QUAD_IS_LONG 2
+# define QUAD_IS_LONG_LONG 3
+# define QUAD_IS_INT64_T 4
+#endif
+
+/* HAS_ACCESSX:
+ * This symbol, if defined, indicates that the accessx routine is
+ * available to do extended access checks.
+ */
+/*#define HAS_ACCESSX / **/
+
+/* HAS_EACCESS:
+ * This symbol, if defined, indicates that the eaccess routine is
+ * available to do extended access checks.
+ */
+/*#define HAS_EACCESS / **/
+
+/* I_SYS_ACCESS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/access.h>.
+ */
+#define I_SYS_ACCESS /**/
+
+/* I_SYS_SECURITY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/security.h>.
+ */
+#define I_SYS_SECURITY /**/
+
+/* OSNAME:
+ * This symbol contains the name of the operating system, as determined
+ * by Configure. You shouldn't rely on it too much; the specific
+ * feature tests from Configure are generally more reliable.
+ */
+#define OSNAME "dec_osf" /**/
/* MEM_ALIGNBYTES:
- * This symbol contains the number of bytes required to align a
- * double. Usual values are 2, 4 and 8.
- * On NeXT starting with 3.2, you can build "Fat" Multiple Architecture
- * Binaries (MAB) for targets with varying alignment. This only matters
- * for perl, where the config.h can be generated and installed on one
- * system, and used by a different architecture to build an extension.
- * The default is eight, for safety.
+ * This symbol contains the number of bytes required to align a
+ * double, or a long double when applicable. Usual values are 2,
+ * 4 and 8. The default is eight, for safety.
*/
-#define MEM_ALIGNBYTES 4 /**/
+#if defined(CROSSCOMPILE) || defined(MULTIARCH)
+# define MEM_ALIGNBYTES 8
+#else
+#define MEM_ALIGNBYTES 8
+#endif
+
+/* ARCHLIB:
+ * This variable, if defined, holds the name of the directory in
+ * which the user wants to put architecture-dependent public
+ * library files for perl5. It is most often a local directory
+ * such as /usr/local/lib. Programs using this variable must be
+ * prepared to deal with filename expansion. If ARCHLIB is the
+ * same as PRIVLIB, it is not defined, since presumably the
+ * program already searches PRIVLIB.
+ */
+/* ARCHLIB_EXP:
+ * This symbol contains the ~name expanded version of ARCHLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define ARCHLIB "/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi" /**/
+#define ARCHLIB_EXP "/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi" /**/
+
+/* ARCHNAME:
+ * This symbol holds a string representing the architecture name.
+ * It may be used to construct an architecture-dependant pathname
+ * where library files may be held under a private library, for
+ * instance.
+ */
+#define ARCHNAME "alpha-dec_osf-thread-multi" /**/
+
+/* HAS_ATOLF:
+ * This symbol, if defined, indicates that the atolf routine is
+ * available to convert strings into long doubles.
+ */
+/*#define HAS_ATOLF / **/
+
+/* HAS_ATOLL:
+ * This symbol, if defined, indicates that the atoll routine is
+ * available to convert strings into long longs.
+ */
+/*#define HAS_ATOLL / **/
+
+/* BIN:
+ * This symbol holds the path of the bin directory where the package will
+ * be installed. Program must be prepared to deal with ~name substitution.
+ */
+/* BIN_EXP:
+ * This symbol is the filename expanded version of the BIN symbol, for
+ * programs that do not want to deal with that at run-time.
+ */
+#define BIN "/opt/perl/bin" /**/
+#define BIN_EXP "/opt/perl/bin" /**/
+
+/* PERL_BINCOMPAT_5005:
+ * This symbol, if defined, indicates that this version of Perl should be
+ * binary-compatible with Perl 5.005. This is impossible for builds
+ * that use features like threads and multiplicity it is always
+ * for those versions.
+ */
+/*#define PERL_BINCOMPAT_5005 / **/
/* BYTEORDER:
* This symbol holds the hexadecimal constant defined in byteorder,
* i.e. 0x1234 or 0x4321, etc...
+ * If the compiler supports cross-compiling or multiple-architecture
+ * binaries (eg. on NeXT systems), use compiler-defined macros to
+ * determine the byte order.
* On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture
* Binaries (MAB) on either big endian or little endian machines.
* The endian-ness is available at compile-time. This only matters
@@ -1146,16 +1150,94 @@
* so the default case (for NeXT) is big endian to catch them.
* This might matter for NeXT 3.0.
*/
-#ifndef NeXT
-#define BYTEORDER 0x1234 /* large digits for MSB */
-#else /* NeXT */
-#ifdef __LITTLE_ENDIAN__
-#define BYTEORDER 0x1234
-#else /* __BIG_ENDIAN__ */
-#define BYTEORDER 0x4321
-#endif /* ENDIAN CHECK */
+#if defined(CROSSCOMPILE) || defined(MULTIARCH)
+# ifdef __LITTLE_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x1234
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x12345678
+# endif
+# endif
+# else
+# ifdef __BIG_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x4321
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x87654321
+# endif
+# endif
+# endif
+# endif
+# if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__))
+# define BYTEORDER 0x4321
+# endif
+#else
+#define BYTEORDER 0x12345678 /* large digits for MSB */
#endif /* NeXT */
+/* CAT2:
+ * This macro catenates 2 tokens together.
+ */
+/* STRINGIFY:
+ * This macro surrounds its token with double quotes.
+ */
+#if 42 == 1
+# define CAT2(a,b) a/**/b
+# define STRINGIFY(a) "a"
+ /* If you can get stringification with catify, tell me how! */
+#endif
+#if 42 == 42
+# define PeRl_CaTiFy(a, b) a ## b
+# define PeRl_StGiFy(a) #a
+/* the additional level of indirection enables these macros to be
+ * used as arguments to other macros. See K&R 2nd ed., page 231. */
+# define CAT2(a,b) PeRl_CaTiFy(a,b)
+# define StGiFy(a) PeRl_StGiFy(a)
+# define STRINGIFY(a) PeRl_StGiFy(a)
+#endif
+#if 42 != 1 && 42 != 42
+#include "Bletch: How does this C preprocessor catenate tokens?"
+#endif
+
+/* CPPSTDIN:
+ * This symbol contains the first part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. Typical value of "cc -E" or "/lib/cpp", but it can also
+ * call a wrapper. See CPPRUN.
+ */
+/* CPPMINUS:
+ * This symbol contains the second part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. This symbol will have the value "-" if CPPSTDIN needs a minus
+ * to specify standard input, otherwise the value is "".
+ */
+/* CPPRUN:
+ * This symbol contains the string which will invoke a C preprocessor on
+ * the standard input and produce to standard output. It needs to end
+ * with CPPLAST, after all other preprocessor flags have been specified.
+ * The main difference with CPPSTDIN is that this program will never be a
+ * pointer to a shell wrapper, i.e. it will be empty if no preprocessor is
+ * available directly to the user. Note that it may well be different from
+ * the preprocessor used to compile the C program.
+ */
+/* CPPLAST:
+ * This symbol is intended to be used along with CPPRUN in the same manner
+ * symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "".
+ */
+#define CPPSTDIN "cppstdin"
+#define CPPMINUS ""
+#define CPPRUN "/usr/bin/cpp"
+#define CPPLAST ""
+
+/* HAS_ACCESS:
+ * This manifest constant lets the C program know that the access()
+ * system call is available to check for accessibility using real UID/GID.
+ * (always present on UNIX.)
+ */
+#define HAS_ACCESS /**/
+
/* CASTI32:
* This symbol is defined if the C compiler can cast negative
* or large floating point numbers to 32-bit ints.
@@ -1183,320 +1265,144 @@
*/
/*#define VOID_CLOSEDIR / **/
-/* Gconvert:
- * This preprocessor macro is defined to convert a floating point
- * number to a string without a trailing decimal point. This
- * emulates the behavior of sprintf("%g"), but is sometimes much more
- * efficient. If gconvert() is not available, but gcvt() drops the
- * trailing decimal point, then gcvt() is used. If all else fails,
- * a macro using sprintf("%g") is used. Arguments for the Gconvert
- * macro are: value, number of digits, whether trailing zeros should
- * be retained, and the output buffer.
- * Possible values are:
- * d_Gconvert='gconvert((x),(n),(t),(b))'
- * d_Gconvert='gcvt((x),(n),(b))'
- * d_Gconvert='sprintf((b),"%.*g",(n),(x))'
- * The last two assume trailing zeros should not be kept.
- */
-#define Gconvert(x,n,t,b) gcvt((x),(n),(b))
-
-/* HAS_GNULIBC:
- * This symbol, if defined, indicates to the C program that
- * the GNU C library is being used.
- */
-#define HAS_GNULIBC /**/
-/* HAS_ISASCII:
- * This manifest constant lets the C program know that isascii
- * is available.
+/* HAS_CSH:
+ * This symbol, if defined, indicates that the C-shell exists.
*/
-#define HAS_ISASCII /**/
-
-/* HAS_LCHOWN:
- * This symbol, if defined, indicates that the lchown routine is
- * available to operate on a symbolic link (instead of following the
- * link).
- */
-/*#define HAS_LCHOWN / **/
-
-/* HAS_OPEN3:
- * This manifest constant lets the C program know that the three
- * argument form of open(2) is available.
- */
-#define HAS_OPEN3 /**/
-
-/* HAS_SAFE_BCOPY:
- * This symbol, if defined, indicates that the bcopy routine is available
- * to copy potentially overlapping memory blocks. Otherwise you should
- * probably use memmove() or memcpy(). If neither is defined, roll your
- * own version.
- */
-#define HAS_SAFE_BCOPY /**/
-
-/* HAS_SAFE_MEMCPY:
- * This symbol, if defined, indicates that the memcpy routine is available
- * to copy potentially overlapping memory blocks. Otherwise you should
- * probably use memmove() or memcpy(). If neither is defined, roll your
- * own version.
- */
-/*#define HAS_SAFE_MEMCPY / **/
-
-/* HAS_SANE_MEMCMP:
- * This symbol, if defined, indicates that the memcmp routine is available
- * and can be used to compare relative magnitudes of chars with their high
- * bits set. If it is not defined, roll your own version.
+/* CSH:
+ * This symbol, if defined, contains the full pathname of csh.
*/
-#define HAS_SANE_MEMCMP /**/
+#define HAS_CSH /**/
+#ifdef HAS_CSH
+#define CSH "/usr/bin/csh" /**/
+#endif
-/* HAS_SIGACTION:
- * This symbol, if defined, indicates that Vr4's sigaction() routine
- * is available.
+/* DLSYM_NEEDS_UNDERSCORE:
+ * This symbol, if defined, indicates that we need to prepend an
+ * underscore to the symbol name before calling dlsym(). This only
+ * makes sense if you *have* dlsym, which we will presume is the
+ * case if you're using dl_dlopen.xs.
*/
-#define HAS_SIGACTION /**/
+/*#define DLSYM_NEEDS_UNDERSCORE / **/
-/* Sigjmp_buf:
- * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
- */
-/* Sigsetjmp:
- * This macro is used in the same way as sigsetjmp(), but will invoke
- * traditional setjmp() if sigsetjmp isn't available.
- * See HAS_SIGSETJMP.
+/* HAS_DRAND48_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the drand48() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern double drand48 _((void));
*/
-/* Siglongjmp:
- * This macro is used in the same way as siglongjmp(), but will invoke
- * traditional longjmp() if siglongjmp isn't available.
- * See HAS_SIGSETJMP.
- */
-#define HAS_SIGSETJMP /**/
-#ifdef HAS_SIGSETJMP
-#define Sigjmp_buf sigjmp_buf
-#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
-#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
-#else
-#define Sigjmp_buf jmp_buf
-#define Sigsetjmp(buf,save_mask) setjmp((buf))
-#define Siglongjmp(buf,retval) longjmp((buf),(retval))
-#endif
+#define HAS_DRAND48_PROTO /**/
-/* USE_STDIO_PTR:
- * This symbol is defined if the _ptr and _cnt fields (or similar)
- * of the stdio FILE structure can be used to access the stdio buffer
- * for a file handle. If this is defined, then the FILE_ptr(fp)
- * and FILE_cnt(fp) macros will also be defined and should be used
- * to access these fields.
- */
-/* FILE_ptr:
- * This macro is used to access the _ptr field (or equivalent) of the
- * FILE structure pointed to by its argument. This macro will always be
- * defined if USE_STDIO_PTR is defined.
- */
-/* STDIO_PTR_LVALUE:
- * This symbol is defined if the FILE_ptr macro can be used as an
- * lvalue.
- */
-/* FILE_cnt:
- * This macro is used to access the _cnt field (or equivalent) of the
- * FILE structure pointed to by its argument. This macro will always be
- * defined if USE_STDIO_PTR is defined.
- */
-/* STDIO_CNT_LVALUE:
- * This symbol is defined if the FILE_cnt macro can be used as an
- * lvalue.
+/* HAS_ENDGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the group database.
*/
-#define USE_STDIO_PTR /**/
-#ifdef USE_STDIO_PTR
-#define FILE_ptr(fp) ((fp)->_IO_read_ptr)
-#define STDIO_PTR_LVALUE /**/
-#define FILE_cnt(fp) ((fp)->_IO_read_end - (fp)->_IO_read_ptr)
-/*#define STDIO_CNT_LVALUE / **/
-#endif
+#define HAS_ENDGRENT /**/
-/* USE_STDIO_BASE:
- * This symbol is defined if the _base field (or similar) of the
- * stdio FILE structure can be used to access the stdio buffer for
- * a file handle. If this is defined, then the FILE_base(fp) macro
- * will also be defined and should be used to access this field.
- * Also, the FILE_bufsiz(fp) macro will be defined and should be used
- * to determine the number of bytes in the buffer. USE_STDIO_BASE
- * will never be defined unless USE_STDIO_PTR is.
- */
-/* FILE_base:
- * This macro is used to access the _base field (or equivalent) of the
- * FILE structure pointed to by its argument. This macro will always be
- * defined if USE_STDIO_BASE is defined.
- */
-/* FILE_bufsiz:
- * This macro is used to determine the number of bytes in the I/O
- * buffer pointed to by _base field (or equivalent) of the FILE
- * structure pointed to its argument. This macro will always be defined
- * if USE_STDIO_BASE is defined.
+/* HAS_ENDHOSTENT:
+ * This symbol, if defined, indicates that the endhostent() routine is
+ * available to close whatever was being used for host queries.
*/
-#define USE_STDIO_BASE /**/
-#ifdef USE_STDIO_BASE
-#define FILE_base(fp) ((fp)->_IO_read_base)
-#define FILE_bufsiz(fp) ((fp)->_IO_read_end - (fp)->_IO_read_base)
-#endif
+#define HAS_ENDHOSTENT /**/
-/* HAS_VPRINTF:
- * This symbol, if defined, indicates that the vprintf routine is available
- * to printf with a pointer to an argument list. If unavailable, you
- * may need to write your own, probably in terms of _doprnt().
- */
-/* USE_CHAR_VSPRINTF:
- * This symbol is defined if this system has vsprintf() returning type
- * (char*). The trend seems to be to declare it as "int vsprintf()". It
- * is up to the package author to declare vsprintf correctly based on the
- * symbol.
+/* HAS_ENDNETENT:
+ * This symbol, if defined, indicates that the endnetent() routine is
+ * available to close whatever was being used for network queries.
*/
-#define HAS_VPRINTF /**/
-/*#define USE_CHAR_VSPRINTF / **/
+#define HAS_ENDNETENT /**/
-/* DOUBLESIZE:
- * This symbol contains the size of a double, so that the C preprocessor
- * can make decisions based on it.
+/* HAS_ENDPROTOENT:
+ * This symbol, if defined, indicates that the endprotoent() routine is
+ * available to close whatever was being used for protocol queries.
*/
-#define DOUBLESIZE 8 /**/
+#define HAS_ENDPROTOENT /**/
-/* I_TIME:
- * This symbol, if defined, indicates to the C program that it should
- * include <time.h>.
- */
-/* I_SYS_TIME:
- * This symbol, if defined, indicates to the C program that it should
- * include <sys/time.h>.
- */
-/* I_SYS_TIME_KERNEL:
- * This symbol, if defined, indicates to the C program that it should
- * include <sys/time.h> with KERNEL defined.
+/* HAS_ENDPWENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the passwd database.
*/
-/*#define I_TIME / **/
-#define I_SYS_TIME /**/
-/*#define I_SYS_TIME_KERNEL / **/
+#define HAS_ENDPWENT /**/
-/* INTSIZE:
- * This symbol contains the value of sizeof(int) so that the C
- * preprocessor can make decisions based on it.
- */
-/* LONGSIZE:
- * This symbol contains the value of sizeof(long) so that the C
- * preprocessor can make decisions based on it.
- */
-/* SHORTSIZE:
- * This symbol contains the value of sizeof(short) so that the C
- * preprocessor can make decisions based on it.
+/* HAS_ENDSERVENT:
+ * This symbol, if defined, indicates that the endservent() routine is
+ * available to close whatever was being used for service queries.
*/
-#define INTSIZE 4 /**/
-#define LONGSIZE 4 /**/
-#define SHORTSIZE 2 /**/
+#define HAS_ENDSERVENT /**/
-/* VAL_O_NONBLOCK:
- * This symbol is to be used during open() or fcntl(F_SETFL) to turn on
- * non-blocking I/O for the file descriptor. Note that there is no way
- * back, i.e. you cannot turn it blocking again this way. If you wish to
- * alternatively switch between blocking and non-blocking, use the
- * ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
- */
-/* VAL_EAGAIN:
- * This symbol holds the errno error code set by read() when no data was
- * present on the non-blocking file descriptor.
- */
-/* RD_NODATA:
- * This symbol holds the return code from read() when no data is present
- * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
- * not defined, then you can't distinguish between no data and EOF by
- * issuing a read(). You'll have to find another way to tell for sure!
- */
-/* EOF_NONBLOCK:
- * This symbol, if defined, indicates to the C program that a read() on
- * a non-blocking file descriptor will return 0 on EOF, and not the value
- * held in RD_NODATA (-1 usually, in that case!).
+/* HAS_ENDSPENT:
+ * This symbol, if defined, indicates that the endspent system call is
+ * available to finalize the scan of SysV shadow password entries.
*/
-#define VAL_O_NONBLOCK O_NONBLOCK
-#define VAL_EAGAIN EAGAIN
-#define RD_NODATA -1
-#define EOF_NONBLOCK
+/*#define HAS_ENDSPENT / **/
-/* PTRSIZE:
- * This symbol contains the size of a pointer, so that the C preprocessor
- * can make decisions based on it. It will be sizeof(void *) if
- * the compiler supports (void *); otherwise it will be
- * sizeof(char *).
+/* HAS_FD_SET:
+ * This symbol, when defined, indicates presence of the fd_set typedef
+ * in <sys/types.h>
*/
-#define PTRSIZE 4 /**/
+#define HAS_FD_SET /**/
-/* RANDBITS:
- * This symbol contains the number of bits of random number the rand()
- * function produces. Usual values are 15, 16, and 31.
+/* HAS_FPOS64_T:
+ * This symbol will be defined if the C compiler supports fpos64_t.
*/
-#define RANDBITS 31 /**/
+/*#define HAS_FPOS64_T / **/
-/* SSize_t:
- * This symbol holds the type used by functions that return
- * a count of bytes or an error condition. It must be a signed type.
- * It is usually ssize_t, but may be long or int, etc.
- * It may be necessary to include <sys/types.h> or <unistd.h>
- * to get any typedef'ed information.
- * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+/* HAS_STRUCT_FS_DATA:
+ * This symbol, if defined, indicates that the struct fs_data
+ * to do statfs() is supported.
*/
-#define SSize_t ssize_t /* signed count of bytes */
+/*#define HAS_STRUCT_FS_DATA / **/
-/* OSNAME:
- * This symbol contains the name of the operating system, as determined
- * by Configure. You shouldn't rely on it too much; the specific
- * feature tests from Configure are generally more reliable.
+/* HAS_FSEEKO:
+ * This symbol, if defined, indicates that the fseeko routine is
+ * available to fseek beyond 32 bits (useful for ILP32 hosts).
*/
-#define OSNAME "linux" /**/
+/*#define HAS_FSEEKO / **/
-/* CAT2:
- * This macro catenates 2 tokens together.
+/* HAS_FSTATFS:
+ * This symbol, if defined, indicates that the fstatfs routine is
+ * available to stat filesystems by file descriptors.
*/
-/* STRINGIFY:
- * This macro surrounds its token with double quotes.
- */
-#if 42 == 1
-#define CAT2(a,b)a/**/b
-#define STRINGIFY(a)"a"
- /* If you can get stringification with catify, tell me how! */
-#endif
-#if 42 == 42
-#define CAT2(a,b)a ## b
-#define StGiFy(a)# a
-#define STRINGIFY(a)StGiFy(a)
-#endif
-#if 42 != 1 && 42 != 42
-#include "Bletch: How does this C preprocessor catenate tokens?"
-#endif
+#define HAS_FSTATFS /**/
-/* CSH:
- * This symbol, if defined, contains the full pathname of csh.
+/* HAS_FTELLO:
+ * This symbol, if defined, indicates that the ftello routine is
+ * available to ftell beyond 32 bits (useful for ILP32 hosts).
*/
-#define HAS_CSH /**/
-#ifdef HAS_CSH
-#define CSH "/bin/csh" /**/
-#endif
+/*#define HAS_FTELLO / **/
-/* HAS_ENDHOSTENT:
- * This symbol, if defined, indicates that the endhostent() routine is
- * available to close whatever was being used for host queries.
+/* Gconvert:
+ * This preprocessor macro is defined to convert a floating point
+ * number to a string without a trailing decimal point. This
+ * emulates the behavior of sprintf("%g"), but is sometimes much more
+ * efficient. If gconvert() is not available, but gcvt() drops the
+ * trailing decimal point, then gcvt() is used. If all else fails,
+ * a macro using sprintf("%g") is used. Arguments for the Gconvert
+ * macro are: value, number of digits, whether trailing zeros should
+ * be retained, and the output buffer.
+ * Possible values are:
+ * d_Gconvert='gconvert((x),(n),(t),(b))'
+ * d_Gconvert='gcvt((x),(n),(b))'
+ * d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+ * The last two assume trailing zeros should not be kept.
*/
-#define HAS_ENDHOSTENT /**/
+#define Gconvert(x,n,t,b) gcvt((x),(n),(b))
-/* HAS_ENDNETENT:
- * This symbol, if defined, indicates that the endnetent() routine is
- * available to close whatever was being used for network queries.
+/* HAS_GETCWD:
+ * This symbol, if defined, indicates that the getcwd routine is
+ * available to get the current working directory.
*/
-#define HAS_ENDNETENT /**/
+#define HAS_GETCWD /**/
-/* HAS_ENDPROTOENT:
- * This symbol, if defined, indicates that the endprotoent() routine is
- * available to close whatever was being used for protocol queries.
+/* HAS_GETFSSTAT:
+ * This symbol, if defined, indicates that the getfsstat routine is
+ * available to stat filesystems in bulk.
*/
-#define HAS_ENDPROTOENT /**/
+#define HAS_GETFSSTAT /**/
-/* HAS_ENDSERVENT:
- * This symbol, if defined, indicates that the endservent() routine is
- * available to close whatever was being used for service queries.
+/* HAS_GETGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for sequential access of the group database.
*/
-#define HAS_ENDSERVENT /**/
+#define HAS_GETGRENT /**/
/* HAS_GETHOSTBYADDR:
* This symbol, if defined, indicates that the gethostbyaddr() routine is
@@ -1516,6 +1422,55 @@
*/
#define HAS_GETHOSTENT /**/
+/* HAS_GETHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * gethostname() routine to derive the host name. See also HAS_UNAME
+ * and PHOSTNAME.
+ */
+/* HAS_UNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * uname() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and PHOSTNAME.
+ */
+/* PHOSTNAME:
+ * This symbol, if defined, indicates the command to feed to the
+ * popen() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and HAS_UNAME. Note that the command uses a fully qualified path,
+ * so that it is safe even if used by a process with super-user
+ * privileges.
+ */
+/* HAS_PHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * contents of PHOSTNAME as a command to feed to the popen() routine
+ * to derive the host name.
+ */
+#define HAS_GETHOSTNAME /**/
+#define HAS_UNAME /**/
+/*#define HAS_PHOSTNAME / **/
+#ifdef HAS_PHOSTNAME
+#define PHOSTNAME "" /* How to get the host name */
+#endif
+
+/* HAS_GETHOST_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for gethostent(), gethostbyname(), and
+ * gethostbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define HAS_GETHOST_PROTOS /**/
+
+/* HAS_GETMNT:
+ * This symbol, if defined, indicates that the getmnt routine is
+ * available to get filesystem mount info by filename.
+ */
+/*#define HAS_GETMNT / **/
+
+/* HAS_GETMNTENT:
+ * This symbol, if defined, indicates that the getmntent routine is
+ * available to iterate through mounted file systems to get their info.
+ */
+/*#define HAS_GETMNTENT / **/
+
/* HAS_GETNETBYADDR:
* This symbol, if defined, indicates that the getnetbyaddr() routine is
* available to look up networks by their IP addresses.
@@ -1534,6 +1489,14 @@
*/
#define HAS_GETNETENT /**/
+/* HAS_GETNET_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getnetent(), getnetbyname(), and
+ * getnetbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define HAS_GETNET_PROTOS /**/
+
/* HAS_GETPROTOENT:
* This symbol, if defined, indicates that the getprotoent() routine is
* available to look up protocols in some data base or another.
@@ -1551,12 +1514,47 @@
#define HAS_GETPROTOBYNAME /**/
#define HAS_GETPROTOBYNUMBER /**/
+/* HAS_GETPROTO_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getprotoent(), getprotobyname(), and
+ * getprotobyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define HAS_GETPROTO_PROTOS /**/
+
+/* HAS_GETPWENT:
+ * This symbol, if defined, indicates that the getpwent routine is
+ * available for sequential access of the passwd database.
+ * If this is not available, the older getpw() function may be available.
+ */
+#define HAS_GETPWENT /**/
+
/* HAS_GETSERVENT:
* This symbol, if defined, indicates that the getservent() routine is
* available to look up network services in some data base or another.
*/
#define HAS_GETSERVENT /**/
+/* HAS_GETSERV_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getservent(), getservbyname(), and
+ * getservbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define HAS_GETSERV_PROTOS /**/
+
+/* HAS_GETSPENT:
+ * This symbol, if defined, indicates that the getspent system call is
+ * available to retrieve SysV shadow password entries sequentially.
+ */
+/*#define HAS_GETSPENT / **/
+
+/* HAS_GETSPNAM:
+ * This symbol, if defined, indicates that the getspnam system call is
+ * available to retrieve SysV shadow password entries by name.
+ */
+/*#define HAS_GETSPNAM / **/
+
/* HAS_GETSERVBYNAME:
* This symbol, if defined, indicates that the getservbyname()
* routine is available to look up services by their name.
@@ -1568,6 +1566,72 @@
#define HAS_GETSERVBYNAME /**/
#define HAS_GETSERVBYPORT /**/
+/* HAS_GNULIBC:
+ * This symbol, if defined, indicates to the C program that
+ * the GNU C library is being used.
+ */
+/*#define HAS_GNULIBC / **/
+#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
+# define _GNU_SOURCE
+#endif
+/* HAS_HASMNTOPT:
+ * This symbol, if defined, indicates that the hasmntopt routine is
+ * available to query the mount options of file systems.
+ */
+/*#define HAS_HASMNTOPT / **/
+
+/* HAS_HTONL:
+ * This symbol, if defined, indicates that the htonl() routine (and
+ * friends htons() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_HTONS:
+ * This symbol, if defined, indicates that the htons() routine (and
+ * friends htonl() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHL:
+ * This symbol, if defined, indicates that the ntohl() routine (and
+ * friends htonl() htons() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHS:
+ * This symbol, if defined, indicates that the ntohs() routine (and
+ * friends htonl() htons() ntohl()) are available to do network
+ * order byte swapping.
+ */
+#define HAS_HTONL /**/
+#define HAS_HTONS /**/
+#define HAS_NTOHL /**/
+#define HAS_NTOHS /**/
+
+/* HAS_ICONV:
+ * This symbol, if defined, indicates that the iconv routine is
+ * available to do character set conversions.
+ */
+#define HAS_ICONV /**/
+
+/* HAS_INT64_T:
+ * This symbol will defined if the C compiler supports int64_t.
+ * Usually the <inttypes.h> needs to be included, but sometimes
+ * <sys/types.h> is enough.
+ */
+/*#define HAS_INT64_T / **/
+
+/* HAS_ISASCII:
+ * This manifest constant lets the C program know that isascii
+ * is available.
+ */
+#define HAS_ISASCII /**/
+
+/* HAS_LDBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol LDBL_DIG, which is the number
+ * of significant digits in a long double precision number. Unlike
+ * for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
+ */
+#define HAS_LDBL_DIG /* */
+
/* HAS_LONG_DOUBLE:
* This symbol will be defined if the C compiler supports long
* doubles.
@@ -1579,12 +1643,11 @@
*/
#define HAS_LONG_DOUBLE /**/
#ifdef HAS_LONG_DOUBLE
-#define LONG_DOUBLESIZE 12 /**/
+#define LONG_DOUBLESIZE 8 /**/
#endif
/* HAS_LONG_LONG:
- * This symbol will be defined if the C compiler supports
- * long long.
+ * This symbol will be defined if the C compiler supports long long.
*/
/* LONGLONGSIZE:
* This symbol contains the size of a long long, so that the
@@ -1596,6 +1659,145 @@
#define LONGLONGSIZE 8 /**/
#endif
+/* HAS_LSEEK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the lseek() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern off_t lseek(int, off_t, int);
+ */
+#define HAS_LSEEK_PROTO /**/
+
+/* HAS_MADVISE:
+ * This symbol, if defined, indicates that the madvise system call is
+ * available to map a file into memory.
+ */
+#define HAS_MADVISE /**/
+
+/* HAS_MEMCHR:
+ * This symbol, if defined, indicates that the memchr routine is available
+ * to locate characters within a C string.
+ */
+#define HAS_MEMCHR /**/
+
+/* HAS_MKDTEMP:
+ * This symbol, if defined, indicates that the mkdtemp routine is
+ * available to exclusively create a uniquely named temporary directory.
+ */
+/*#define HAS_MKDTEMP / **/
+
+/* HAS_MKSTEMP:
+ * This symbol, if defined, indicates that the mkstemp routine is
+ * available to exclusively create and open a uniquely named
+ * temporary file.
+ */
+#define HAS_MKSTEMP /**/
+
+/* HAS_MKSTEMPS:
+ * This symbol, if defined, indicates that the mkstemps routine is
+ * available to excluslvely create and open a uniquely named
+ * (with a suffix) temporary file.
+ */
+/*#define HAS_MKSTEMPS / **/
+
+/* HAS_MMAP:
+ * This symbol, if defined, indicates that the mmap system call is
+ * available to map a file into memory.
+ */
+/* Mmap_t:
+ * This symbol holds the return type of the mmap() system call
+ * (and simultaneously the type of the first argument).
+ * Usually set to 'void *' or 'cadd_t'.
+ */
+#define HAS_MMAP /**/
+#define Mmap_t void * /**/
+
+/* HAS_MPROTECT:
+ * This symbol, if defined, indicates that the mprotect system call is
+ * available to modify the access protection of a memory mapped file.
+ */
+#define HAS_MPROTECT /**/
+
+/* HAS_MSG:
+ * This symbol, if defined, indicates that the entire msg*(2) library is
+ * supported (IPC mechanism based on message queues).
+ */
+#define HAS_MSG /**/
+
+/* HAS_OFF64_T:
+ * This symbol will be defined if the C compiler supports off64_t.
+ */
+/*#define HAS_OFF64_T / **/
+
+/* HAS_OPEN3:
+ * This manifest constant lets the C program know that the three
+ * argument form of open(2) is available.
+ */
+#define HAS_OPEN3 /**/
+
+/* OLD_PTHREAD_CREATE_JOINABLE:
+ * This symbol, if defined, indicates how to create pthread
+ * in joinable (aka undetached) state. NOTE: not defined
+ * if pthread.h already has defined PTHREAD_CREATE_JOINABLE
+ * (the new version of the constant).
+ * If defined, known values are PTHREAD_CREATE_UNDETACHED
+ * and __UNDETACHED.
+ */
+/*#define OLD_PTHREAD_CREATE_JOINABLE / **/
+
+/* HAS_PTHREAD_YIELD:
+ * This symbol, if defined, indicates that the pthread_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+/* SCHED_YIELD:
+ * This symbol defines the way to yield the execution of
+ * the current thread. Known ways are sched_yield,
+ * pthread_yield, and pthread_yield with NULL.
+ */
+/* HAS_SCHED_YIELD:
+ * This symbol, if defined, indicates that the sched_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+/*#define HAS_PTHREAD_YIELD / **/
+#define SCHED_YIELD sched_yield() /**/
+#define HAS_SCHED_YIELD /**/
+
+/* HAS_SAFE_BCOPY:
+ * This symbol, if defined, indicates that the bcopy routine is available
+ * to copy potentially overlapping memory blocks. Otherwise you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+#define HAS_SAFE_BCOPY /**/
+
+/* HAS_SAFE_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy potentially overlapping memory blocks. Otherwise you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+/*#define HAS_SAFE_MEMCPY / **/
+
+/* HAS_SANE_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * and can be used to compare relative magnitudes of chars with their high
+ * bits set. If it is not defined, roll your own version.
+ */
+#define HAS_SANE_MEMCMP /**/
+
+/* HAS_SEM:
+ * This symbol, if defined, indicates that the entire sem*(2) library is
+ * supported.
+ */
+#define HAS_SEM /**/
+
+/* HAS_SETGRENT:
+ * This symbol, if defined, indicates that the setgrent routine is
+ * available for initializing sequential access of the group database.
+ */
+#define HAS_SETGRENT /**/
+
/* HAS_SETGROUPS:
* This symbol, if defined, indicates that the setgroups() routine is
* available to set the list of process groups. If unavailable, multiple
@@ -1621,12 +1823,24 @@
*/
#define HAS_SETPROTOENT /**/
+/* HAS_SETPWENT:
+ * This symbol, if defined, indicates that the setpwent routine is
+ * available for initializing sequential access of the passwd database.
+ */
+#define HAS_SETPWENT /**/
+
/* HAS_SETSERVENT:
* This symbol, if defined, indicates that the setservent() routine is
* available.
*/
#define HAS_SETSERVENT /**/
+/* HAS_SETSPENT:
+ * This symbol, if defined, indicates that the setspent system call is
+ * available to initialize the scan of SysV shadow password entries.
+ */
+/*#define HAS_SETSPENT / **/
+
/* HAS_SETVBUF:
* This symbol, if defined, indicates that the setvbuf routine is
* available to change buffering on an open stdio stream.
@@ -1634,6 +1848,55 @@
*/
#define HAS_SETVBUF /**/
+/* USE_SFIO:
+ * This symbol, if defined, indicates that sfio should
+ * be used.
+ */
+/*#define USE_SFIO / **/
+
+/* HAS_SHM:
+ * This symbol, if defined, indicates that the entire shm*(2) library is
+ * supported.
+ */
+#define HAS_SHM /**/
+
+/* HAS_SIGACTION:
+ * This symbol, if defined, indicates that Vr4's sigaction() routine
+ * is available.
+ */
+#define HAS_SIGACTION /**/
+
+/* HAS_SIGSETJMP:
+ * This variable indicates to the C program that the sigsetjmp()
+ * routine is available to save the calling process's registers
+ * and stack environment for later use by siglongjmp(), and
+ * to optionally save the process's signal mask. See
+ * Sigjmp_buf, Sigsetjmp, and Siglongjmp.
+ */
+/* Sigjmp_buf:
+ * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ */
+/* Sigsetjmp:
+ * This macro is used in the same way as sigsetjmp(), but will invoke
+ * traditional setjmp() if sigsetjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+/* Siglongjmp:
+ * This macro is used in the same way as siglongjmp(), but will invoke
+ * traditional longjmp() if siglongjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+#define HAS_SIGSETJMP /**/
+#ifdef HAS_SIGSETJMP
+#define Sigjmp_buf sigjmp_buf
+#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
+#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
+#else
+#define Sigjmp_buf jmp_buf
+#define Sigsetjmp(buf,save_mask) setjmp((buf))
+#define Siglongjmp(buf,retval) longjmp((buf),(retval))
+#endif
+
/* HAS_SOCKET:
* This symbol, if defined, indicates that the BSD socket interface is
* supported.
@@ -1642,8 +1905,205 @@
* This symbol, if defined, indicates that the BSD socketpair() call is
* supported.
*/
-#define HAS_SOCKET /**/
-#define HAS_SOCKETPAIR /**/
+/* HAS_MSG_CTRUNC:
+ * This symbol, if defined, indicates that the MSG_CTRUNC is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_DONTROUTE:
+ * This symbol, if defined, indicates that the MSG_DONTROUTE is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_OOB:
+ * This symbol, if defined, indicates that the MSG_OOB is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PEEK:
+ * This symbol, if defined, indicates that the MSG_PEEK is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PROXY:
+ * This symbol, if defined, indicates that the MSG_PROXY is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_SCM_RIGHTS:
+ * This symbol, if defined, indicates that the SCM_RIGHTS is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+#define HAS_SOCKET /**/
+#define HAS_SOCKETPAIR /**/
+#define HAS_MSG_CTRUNC /**/
+#define HAS_MSG_DONTROUTE /**/
+#define HAS_MSG_OOB /**/
+#define HAS_MSG_PEEK /**/
+/*#define HAS_MSG_PROXY / **/
+#define HAS_SCM_RIGHTS /**/
+
+/* HAS_SQRTL:
+ * This symbol, if defined, indicates that the sqrtl routine is
+ * available to do long double square roots.
+ */
+#define HAS_SQRTL /**/
+
+/* USE_STAT_BLOCKS:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_blksize and st_blocks.
+ */
+#ifndef USE_STAT_BLOCKS
+#define USE_STAT_BLOCKS /**/
+#endif
+
+/* HAS_STRUCT_STATFS_F_FLAGS:
+ * This symbol, if defined, indicates that the struct statfs
+ * does have the f_flags member containing the mount flags of
+ * the filesystem containing the file.
+ * This kind of struct statfs is coming from <sys/mount.h> (BSD 4.3),
+ * not from <sys/statfs.h> (SYSV). Older BSDs (like Ultrix) do not
+ * have statfs() and struct statfs, they have ustat() and getmnt()
+ * with struct ustat and struct fs_data.
+ */
+#define HAS_STRUCT_STATFS_F_FLAGS /**/
+
+/* HAS_STRUCT_STATFS:
+ * This symbol, if defined, indicates that the struct statfs
+ * to do statfs() is supported.
+ */
+#define HAS_STRUCT_STATFS /**/
+
+/* HAS_FSTATVFS:
+ * This symbol, if defined, indicates that the fstatvfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+#define HAS_FSTATVFS /**/
+
+/* USE_STDIO_PTR:
+ * This symbol is defined if the _ptr and _cnt fields (or similar)
+ * of the stdio FILE structure can be used to access the stdio buffer
+ * for a file handle. If this is defined, then the FILE_ptr(fp)
+ * and FILE_cnt(fp) macros will also be defined and should be used
+ * to access these fields.
+ */
+/* FILE_ptr:
+ * This macro is used to access the _ptr field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_PTR_LVALUE:
+ * This symbol is defined if the FILE_ptr macro can be used as an
+ * lvalue.
+ */
+/* FILE_cnt:
+ * This macro is used to access the _cnt field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_CNT_LVALUE:
+ * This symbol is defined if the FILE_cnt macro can be used as an
+ * lvalue.
+ */
+#define USE_STDIO_PTR /**/
+#ifdef USE_STDIO_PTR
+#define FILE_ptr(fp) ((fp)->_ptr)
+#define STDIO_PTR_LVALUE /**/
+#define FILE_cnt(fp) ((fp)->_cnt)
+#define STDIO_CNT_LVALUE /**/
+#endif
+
+/* USE_STDIO_BASE:
+ * This symbol is defined if the _base field (or similar) of the
+ * stdio FILE structure can be used to access the stdio buffer for
+ * a file handle. If this is defined, then the FILE_base(fp) macro
+ * will also be defined and should be used to access this field.
+ * Also, the FILE_bufsiz(fp) macro will be defined and should be used
+ * to determine the number of bytes in the buffer. USE_STDIO_BASE
+ * will never be defined unless USE_STDIO_PTR is.
+ */
+/* FILE_base:
+ * This macro is used to access the _base field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_BASE is defined.
+ */
+/* FILE_bufsiz:
+ * This macro is used to determine the number of bytes in the I/O
+ * buffer pointed to by _base field (or equivalent) of the FILE
+ * structure pointed to its argument. This macro will always be defined
+ * if USE_STDIO_BASE is defined.
+ */
+#define USE_STDIO_BASE /**/
+#ifdef USE_STDIO_BASE
+#define FILE_base(fp) ((fp)->_base)
+#define FILE_bufsiz(fp) ((fp)->_cnt + (fp)->_ptr - (fp)->_base)
+#endif
+
+/* HAS_STRERROR:
+ * This symbol, if defined, indicates that the strerror routine is
+ * available to translate error numbers to strings. See the writeup
+ * of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ * This symbol, if defined, indicates that the sys_errlist array is
+ * available to translate error numbers to strings. The extern int
+ * sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ * This preprocessor symbol is defined as a macro if strerror() is
+ * not available to translate error numbers to strings but sys_errlist[]
+ * array is there.
+ */
+#define HAS_STRERROR /**/
+#define HAS_SYS_ERRLIST /**/
+#define Strerror(e) strerror(e)
+
+/* HAS_STRTOLD:
+ * This symbol, if defined, indicates that the strtold routine is
+ * available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOLD / **/
+
+/* HAS_STRTOLL:
+ * This symbol, if defined, indicates that the strtoll routine is
+ * available to convert strings to long longs.
+ */
+/*#define HAS_STRTOLL / **/
+
+/* HAS_STRTOULL:
+ * This symbol, if defined, indicates that the strtoull routine is
+ * available to convert strings to unsigned long longs.
+ */
+/*#define HAS_STRTOULL / **/
+
+/* HAS_STRTOUQ:
+ * This symbol, if defined, indicates that the strtouq routine is
+ * available to convert strings to unsigned long longs (quads).
+ */
+/*#define HAS_STRTOUQ / **/
+
+/* HAS_TELLDIR_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the telldir() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern long telldir _((DIR*));
+ */
+#define HAS_TELLDIR_PROTO /**/
+
+/* Time_t:
+ * This symbol holds the type returned by time(). It can be long,
+ * or time_t on BSD sites (in which case <sys/types.h> should be
+ * included).
+ */
+#define Time_t time_t /* Time type */
+
+/* HAS_TIMES:
+ * This symbol, if defined, indicates that the times() routine exists.
+ * Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+#define HAS_TIMES /**/
/* HAS_UNION_SEMUN:
* This symbol, if defined, indicates that the union semun is
@@ -1663,10 +2123,21 @@
* This symbol, if defined, indicates that struct semid_ds * is
* used for semctl IPC_STAT.
*/
-#define HAS_UNION_SEMUN /**/
+/*#define HAS_UNION_SEMUN / **/
#define USE_SEMCTL_SEMUN /**/
#define USE_SEMCTL_SEMID_DS /**/
+/* HAS_USTAT:
+ * This symbol, if defined, indicates that the ustat system call is
+ * available to query file system statistics by dev_t.
+ */
+#define HAS_USTAT /**/
+
+/* HAS_VFORK:
+ * This symbol, if defined, indicates that vfork() exists.
+ */
+/*#define HAS_VFORK / **/
+
/* Signal_t:
* This symbol's value is either "void" or "int", corresponding to the
* appropriate return type of a signal handler. Thus, you can declare
@@ -1675,25 +2146,175 @@
*/
#define Signal_t void /* Signal handler's return type */
+/* HAS_VPRINTF:
+ * This symbol, if defined, indicates that the vprintf routine is available
+ * to printf with a pointer to an argument list. If unavailable, you
+ * may need to write your own, probably in terms of _doprnt().
+ */
+/* USE_CHAR_VSPRINTF:
+ * This symbol is defined if this system has vsprintf() returning type
+ * (char*). The trend seems to be to declare it as "int vsprintf()". It
+ * is up to the package author to declare vsprintf correctly based on the
+ * symbol.
+ */
+#define HAS_VPRINTF /**/
+/*#define USE_CHAR_VSPRINTF / **/
+
+/* USE_DYNAMIC_LOADING:
+ * This symbol, if defined, indicates that dynamic loading of
+ * some sort is available.
+ */
+#define USE_DYNAMIC_LOADING /**/
+
+/* DOUBLESIZE:
+ * This symbol contains the size of a double, so that the C preprocessor
+ * can make decisions based on it.
+ */
+#define DOUBLESIZE 8 /**/
+
+/* EBCDIC:
+ * This symbol, if defined, indicates that this system uses
+ * EBCDIC encoding.
+ */
+/*#define EBCDIC / **/
+
+/* FFLUSH_NULL:
+ * This symbol, if defined, tells that fflush(NULL) does flush
+ * all pending stdio output.
+ */
+/* FFLUSH_ALL:
+ * This symbol, if defined, tells that to flush
+ * all pending stdio output one must loop through all
+ * the stdio file handles stored in an array and fflush them.
+ * Note that if fflushNULL is defined, fflushall will not
+ * even be probed for and will be left undefined.
+ */
+#define FFLUSH_NULL /**/
+/*#define FFLUSH_ALL / **/
+
+/* Fpos_t:
+ * This symbol holds the type used to declare file positions in libc.
+ * It can be fpos_t, long, uint, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Fpos_t fpos_t /* File position type */
+
+/* Gid_t_f:
+ * This symbol defines the format string used for printing a Gid_t.
+ */
+#define Gid_t_f "u" /**/
+
+/* Gid_t_sign:
+ * This symbol holds the signedess of a Gid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Gid_t_sign 1 /* GID sign */
+
+/* Gid_t_size:
+ * This symbol holds the size of a Gid_t in bytes.
+ */
+#define Gid_t_size 4 /* GID size */
+
+/* Gid_t:
+ * This symbol holds the return type of getgid() and the type of
+ * argument to setrgid() and related functions. Typically,
+ * it is the type of group ids in the kernel. It can be int, ushort,
+ * gid_t, etc... It may be necessary to include <sys/types.h> to get
+ * any typedef'ed information.
+ */
+#define Gid_t gid_t /* Type for getgid(), etc... */
+
/* Groups_t:
* This symbol holds the type used for the second argument to
- * getgroups() and setgropus(). Usually, this is the same as
+ * getgroups() and setgroups(). Usually, this is the same as
* gidtype (gid_t) , but sometimes it isn't.
- * It can be int, ushort, uid_t, etc...
+ * It can be int, ushort, gid_t, etc...
* It may be necessary to include <sys/types.h> to get any
* typedef'ed information. This is only required if you have
- * getgroups() or setgropus()..
+ * getgroups() or setgroups()..
*/
#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
#define Groups_t gid_t /* Type for 2nd arg to [sg]etgroups() */
#endif
+/* DB_Prefix_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is u_int32_t.
+ */
+/* DB_Hash_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is size_t.
+ */
+#define DB_Hash_t u_int32_t /**/
+#define DB_Prefix_t size_t /**/
+
+/* I_GRP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <grp.h>.
+ */
+/* GRPASSWD:
+ * This symbol, if defined, indicates to the C program that struct group
+ * in <grp.h> contains gr_passwd.
+ */
+#define I_GRP /**/
+#define GRPASSWD /**/
+
+/* I_ICONV:
+ * This symbol, if defined, indicates that <iconv.h> exists and
+ * should be included.
+ */
+#define I_ICONV /**/
+
+/* I_IEEEFP:
+ * This symbol, if defined, indicates that <ieeefp.h> exists and
+ * should be included.
+ */
+/*#define I_IEEEFP / **/
+
+/* I_INTTYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <inttypes.h>.
+ */
+/*#define I_INTTYPES / **/
+
+/* I_MACH_CTHREADS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <mach/cthreads.h>.
+ */
+/*#define I_MACH_CTHREADS / **/
+
+/* I_MNTENT:
+ * This symbol, if defined, indicates that <mntent.h> exists and
+ * should be included.
+ */
+/*#define I_MNTENT / **/
+
/* I_NETDB:
* This symbol, if defined, indicates that <netdb.h> exists and
* should be included.
*/
#define I_NETDB /**/
+/* I_NETINET_TCP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/tcp.h>.
+ */
+#define I_NETINET_TCP /**/
+
+/* I_POLL:
+ * This symbol, if defined, indicates that <poll.h> exists and
+ * should be included.
+ */
+#define I_POLL /**/
+
+/* I_PTHREAD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <pthread.h>.
+ */
+#define I_PTHREAD /**/
+
/* I_PWD:
* This symbol, if defined, indicates to the C program that it should
* include <pwd.h>.
@@ -1730,30 +2351,143 @@
* This symbol, if defined, indicates to the C program that struct passwd
* contains pw_passwd.
*/
-/* HAS_SETPWENT:
- * This symbol, if defined, indicates that the getpwrent routine is
- * available for initializing sequential access of the passwd database.
- */
-/* HAS_GETPWENT:
- * This symbol, if defined, indicates that the getpwent routine is
- * available for sequential access of the password database.
- */
-/* HAS_ENDPWENT:
- * This symbol, if defined, indicates that the getpwent routine is
- * available for finalizing sequential access of the passwd database.
- */
#define I_PWD /**/
-/*#define PWQUOTA / **/
+#define PWQUOTA /**/
/*#define PWAGE / **/
/*#define PWCHANGE / **/
/*#define PWCLASS / **/
/*#define PWEXPIRE / **/
-/*#define PWCOMMENT / **/
+#define PWCOMMENT /**/
#define PWGECOS /**/
#define PWPASSWD /**/
-#define HAS_SETPWENT /**/
-#define HAS_GETPWENT /**/
-#define HAS_ENDPWENT /**/
+
+/* I_SHADOW:
+ * This symbol, if defined, indicates that <shadow.h> exists and
+ * should be included.
+ */
+/*#define I_SHADOW / **/
+
+/* I_SOCKS:
+ * This symbol, if defined, indicates that <socks.h> exists and
+ * should be included.
+ */
+/*#define I_SOCKS / **/
+
+/* I_SUNMATH:
+ * This symbol, if defined, indicates that <sunmath.h> exists and
+ * should be included.
+ */
+/*#define I_SUNMATH / **/
+
+/* I_SYSLOG:
+ * This symbol, if defined, indicates that <syslog.h> exists and
+ * should be included.
+ */
+#define I_SYSLOG /**/
+
+/* I_SYSMODE:
+ * This symbol, if defined, indicates that <sys/mode.h> exists and
+ * should be included.
+ */
+#define I_SYSMODE /**/
+
+/* I_SYS_MOUNT:
+ * This symbol, if defined, indicates that <sys/mount.h> exists and
+ * should be included.
+ */
+#define I_SYS_MOUNT /**/
+
+/* I_SYS_STATFS:
+ * This symbol, if defined, indicates that <sys/statfs.h> exists.
+ */
+/*#define I_SYS_STATFS / **/
+
+/* I_SYS_STATVFS:
+ * This symbol, if defined, indicates that <sys/statvfs.h> exists and
+ * should be included.
+ */
+#define I_SYS_STATVFS /**/
+
+/* I_SYSUIO:
+ * This symbol, if defined, indicates that <sys/uio.h> exists and
+ * should be included.
+ */
+#define I_SYSUIO /**/
+
+/* I_SYSUTSNAME:
+ * This symbol, if defined, indicates that <sys/utsname.h> exists and
+ * should be included.
+ */
+#define I_SYSUTSNAME /**/
+
+/* I_SYS_VFS:
+ * This symbol, if defined, indicates that <sys/vfs.h> exists and
+ * should be included.
+ */
+/*#define I_SYS_VFS / **/
+
+/* I_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <time.h>.
+ */
+/* I_SYS_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h>.
+ */
+/* I_SYS_TIME_KERNEL:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h> with KERNEL defined.
+ */
+/*#define I_TIME / **/
+#define I_SYS_TIME /**/
+/*#define I_SYS_TIME_KERNEL / **/
+
+/* I_USTAT:
+ * This symbol, if defined, indicates that <ustat.h> exists and
+ * should be included.
+ */
+#define I_USTAT /**/
+
+/* PERL_INC_VERSION_LIST:
+ * This variable specifies the list of subdirectories in over
+ * which perl.c:incpush() and lib/lib.pm will automatically
+ * search when adding directories to @INC, in a format suitable
+ * for a C initialization string. See the inc_version_list entry
+ * in Porting/Glossary for more details.
+ */
+#define PERL_INC_VERSION_LIST 0 /**/
+
+/* INSTALL_USR_BIN_PERL:
+ * This symbol, if defined, indicates that Perl is to be installed
+ * also as /usr/bin/perl.
+ */
+#define INSTALL_USR_BIN_PERL /**/
+
+/* PERL_PRIfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for output.
+ */
+/* PERL_PRIgldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'g') for output.
+ */
+#define PERL_PRIfldbl "f" /**/
+#define PERL_PRIgldbl "g" /**/
+
+/* Off_t:
+ * This symbol holds the type used to declare offsets in the kernel.
+ * It can be int, long, off_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+/* LSEEKSIZE:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+/* Off_t_size:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+#define Off_t off_t /* <offset> type */
+#define LSEEKSIZE 8 /* <offset> size */
+#define Off_t_size 8 /* <offset> size */
/* Free_t:
* This variable contains the return type of free(). It is usually
@@ -1770,6 +2504,247 @@
*/
/*#define MYMALLOC / **/
+/* Mode_t:
+ * This symbol holds the type used to declare file modes
+ * for systems calls. It is usually mode_t, but may be
+ * int or unsigned short. It may be necessary to include <sys/types.h>
+ * to get any typedef'ed information.
+ */
+#define Mode_t mode_t /* file mode parameter for system calls */
+
+/* VAL_O_NONBLOCK:
+ * This symbol is to be used during open() or fcntl(F_SETFL) to turn on
+ * non-blocking I/O for the file descriptor. Note that there is no way
+ * back, i.e. you cannot turn it blocking again this way. If you wish to
+ * alternatively switch between blocking and non-blocking, use the
+ * ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
+ */
+/* VAL_EAGAIN:
+ * This symbol holds the errno error code set by read() when no data was
+ * present on the non-blocking file descriptor.
+ */
+/* RD_NODATA:
+ * This symbol holds the return code from read() when no data is present
+ * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
+ * not defined, then you can't distinguish between no data and EOF by
+ * issuing a read(). You'll have to find another way to tell for sure!
+ */
+/* EOF_NONBLOCK:
+ * This symbol, if defined, indicates to the C program that a read() on
+ * a non-blocking file descriptor will return 0 on EOF, and not the value
+ * held in RD_NODATA (-1 usually, in that case!).
+ */
+#define VAL_O_NONBLOCK O_NONBLOCK
+#define VAL_EAGAIN EAGAIN
+#define RD_NODATA -1
+#define EOF_NONBLOCK
+
+/* Netdb_host_t:
+ * This symbol holds the type used for the 1st argument
+ * to gethostbyaddr().
+ */
+/* Netdb_hlen_t:
+ * This symbol holds the type used for the 2nd argument
+ * to gethostbyaddr().
+ */
+/* Netdb_name_t:
+ * This symbol holds the type used for the argument to
+ * gethostbyname().
+ */
+/* Netdb_net_t:
+ * This symbol holds the type used for the 1st argument to
+ * getnetbyaddr().
+ */
+#define Netdb_host_t const char * /**/
+#define Netdb_hlen_t int /**/
+#define Netdb_name_t const char * /**/
+#define Netdb_net_t int /**/
+
+/* IVTYPE:
+ * This symbol defines the C type used for Perl's IV.
+ */
+/* UVTYPE:
+ * This symbol defines the C type used for Perl's UV.
+ */
+/* I8TYPE:
+ * This symbol defines the C type used for Perl's I8.
+ */
+/* U8TYPE:
+ * This symbol defines the C type used for Perl's U8.
+ */
+/* I16TYPE:
+ * This symbol defines the C type used for Perl's I16.
+ */
+/* U16TYPE:
+ * This symbol defines the C type used for Perl's U16.
+ */
+/* I32TYPE:
+ * This symbol defines the C type used for Perl's I32.
+ */
+/* U32TYPE:
+ * This symbol defines the C type used for Perl's U32.
+ */
+/* I64TYPE:
+ * This symbol defines the C type used for Perl's I64.
+ */
+/* U64TYPE:
+ * This symbol defines the C type used for Perl's U64.
+ */
+/* NVTYPE:
+ * This symbol defines the C type used for Perl's NV.
+ */
+/* IVSIZE:
+ * This symbol contains the sizeof(IV).
+ */
+/* UVSIZE:
+ * This symbol contains the sizeof(UV).
+ */
+/* I8SIZE:
+ * This symbol contains the sizeof(I8).
+ */
+/* U8SIZE:
+ * This symbol contains the sizeof(U8).
+ */
+/* I16SIZE:
+ * This symbol contains the sizeof(I16).
+ */
+/* U16SIZE:
+ * This symbol contains the sizeof(U16).
+ */
+/* I32SIZE:
+ * This symbol contains the sizeof(I32).
+ */
+/* U32SIZE:
+ * This symbol contains the sizeof(U32).
+ */
+/* I64SIZE:
+ * This symbol contains the sizeof(I64).
+ */
+/* U64SIZE:
+ * This symbol contains the sizeof(U64).
+ */
+/* NV_PRESERVES_UV:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * can preserve all the bit of a variable of type UVSIZE.
+ */
+#define IVTYPE long /**/
+#define UVTYPE unsigned long /**/
+#define I8TYPE char /**/
+#define U8TYPE unsigned char /**/
+#define I16TYPE short /**/
+#define U16TYPE unsigned short /**/
+#define I32TYPE int /**/
+#define U32TYPE unsigned int /**/
+#ifdef HAS_QUAD
+#define I64TYPE long /**/
+#define U64TYPE unsigned long /**/
+#endif
+#define NVTYPE double /**/
+#define IVSIZE 8 /**/
+#define UVSIZE 8 /**/
+#define I8SIZE 1 /**/
+#define U8SIZE 1 /**/
+#define I16SIZE 2 /**/
+#define U16SIZE 2 /**/
+#define I32SIZE 4 /**/
+#define U32SIZE 4 /**/
+#ifdef HAS_QUAD
+#define I64SIZE 8 /**/
+#define U64SIZE 8 /**/
+#endif
+#undef NV_PRESERVES_UV
+
+/* IVdf:
+ * This symbol defines the format string used for printing a Perl IV
+ * as a signed decimal integer.
+ */
+/* UVuf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned decimal integer.
+ */
+/* UVof:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned octal integer.
+ */
+/* UVxf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned hexadecimal integer.
+ */
+#define IVdf "ld" /**/
+#define UVuf "lu" /**/
+#define UVof "lo" /**/
+#define UVxf "lx" /**/
+
+/* Pid_t:
+ * This symbol holds the type used to declare process ids in the kernel.
+ * It can be int, uint, pid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Pid_t pid_t /* PID type */
+
+/* PRIVLIB:
+ * This symbol contains the name of the private library for this package.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world. The program
+ * should be prepared to do ~ expansion.
+ */
+/* PRIVLIB_EXP:
+ * This symbol contains the ~name expanded version of PRIVLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define PRIVLIB "/opt/perl/lib/5.6.0" /**/
+#define PRIVLIB_EXP "/opt/perl/lib/5.6.0" /**/
+
+/* PTRSIZE:
+ * This symbol contains the size of a pointer, so that the C preprocessor
+ * can make decisions based on it. It will be sizeof(void *) if
+ * the compiler supports (void *); otherwise it will be
+ * sizeof(char *).
+ */
+#define PTRSIZE 8 /**/
+
+/* Drand01:
+ * This macro is to be used to generate uniformly distributed
+ * random numbers over the range [0., 1.[. You may have to supply
+ * an 'extern double drand48();' in your program since SunOS 4.1.3
+ * doesn't provide you with anything relevant in it's headers.
+ * See HAS_DRAND48_PROTO.
+ */
+/* Rand_seed_t:
+ * This symbol defines the type of the argument of the
+ * random seed function.
+ */
+/* seedDrand01:
+ * This symbol defines the macro to be used in seeding the
+ * random number generator (see Drand01).
+ */
+/* RANDBITS:
+ * This symbol indicates how many bits are produced by the
+ * function used to generate normalized random numbers.
+ * Values include 15, 16, 31, and 48.
+ */
+#define Drand01() drand48() /**/
+#define Rand_seed_t long /**/
+#define seedDrand01(x) srand48((Rand_seed_t)x) /**/
+#define RANDBITS 48 /**/
+
+/* SELECT_MIN_BITS:
+ * This symbol holds the minimum number of bits operated by select.
+ * That is, if you do select(n, ...), how many bits at least will be
+ * cleared in the masks if some activity is detected. Usually this
+ * is either n or 32*ceil(n/32), especially many little-endians do
+ * the latter. This is only useful if you have select(), naturally.
+ */
+#define SELECT_MIN_BITS 32 /**/
+
+/* Select_fd_set_t:
+ * This symbol holds the type used for the 2nd, 3rd, and 4th
+ * arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET
+ * is defined, and 'int *' otherwise. This is only useful if you
+ * have select(), of course.
+ */
+#define Select_fd_set_t fd_set * /**/
+
/* SIG_NAME:
* This symbol contains a list of signal names in order of
* signal number. This is intended
@@ -1798,95 +2773,8 @@
* The last element is 0, corresponding to the 0 at the end of
* the sig_name list.
*/
-#define 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", "UNUSED", "IOT", "CLD", "POLL", 0 /**/
-#define 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, 6, 17, 29, 0 /**/
-
-/* VOIDFLAGS:
- * This symbol indicates how much support of the void type is given by this
- * compiler. What various bits mean:
- *
- * 1 = supports declaration of void
- * 2 = supports arrays of pointers to functions returning void
- * 4 = supports comparisons between pointers to void functions and
- * addresses of void functions
- * 8 = suports declaration of generic void pointers
- *
- * The package designer should define VOIDUSED to indicate the requirements
- * of the package. This can be done either by #defining VOIDUSED before
- * including config.h, or by defining defvoidused in Myinit.U. If the
- * latter approach is taken, only those flags will be tested. If the
- * level of void support necessary is not present, defines void to int.
- */
-#ifndef VOIDUSED
-#define VOIDUSED 15
-#endif
-#define VOIDFLAGS 15
-#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
-#define void int /* is void to be avoided? */
-#define M_VOID /* Xenix strikes again */
-#endif
-
-/* ARCHLIB:
- * This variable, if defined, holds the name of the directory in
- * which the user wants to put architecture-dependent public
- * library files for perl5. It is most often a local directory
- * such as /usr/local/lib. Programs using this variable must be
- * prepared to deal with filename expansion. If ARCHLIB is the
- * same as PRIVLIB, it is not defined, since presumably the
- * program already searches PRIVLIB.
- */
-/* ARCHLIB_EXP:
- * This symbol contains the ~name expanded version of ARCHLIB, to be used
- * in programs that are not prepared to deal with ~ expansion at run-time.
- */
-#define ARCHLIB "/opt/perl/lib/5.005/i686-linux-thread" /**/
-#define ARCHLIB_EXP "/opt/perl/lib/5.005/i686-linux-thread" /**/
-
-/* DLSYM_NEEDS_UNDERSCORE:
- * This symbol, if defined, indicates that we need to prepend an
- * underscore to the symbol name before calling dlsym(). This only
- * makes sense if you *have* dlsym, which we will presume is the
- * case if you're using dl_dlopen.xs.
- */
-/*#define DLSYM_NEEDS_UNDERSCORE / **/
-
-/* USE_SFIO:
- * This symbol, if defined, indicates that sfio should
- * be used.
- */
-/*#define USE_SFIO / **/
-
-/* USE_DYNAMIC_LOADING:
- * This symbol, if defined, indicates that dynamic loading of
- * some sort is available.
- */
-#define USE_DYNAMIC_LOADING /**/
-
-/* DB_Prefix_t:
- * This symbol contains the type of the prefix structure element
- * in the <db.h> header file. In older versions of DB, it was
- * int, while in newer ones it is u_int32_t.
- */
-/* DB_Hash_t:
- * This symbol contains the type of the prefix structure element
- * in the <db.h> header file. In older versions of DB, it was
- * int, while in newer ones it is size_t.
- */
-#define DB_Hash_t u_int32_t /**/
-#define DB_Prefix_t size_t /**/
-
-/* PRIVLIB:
- * This symbol contains the name of the private library for this package.
- * The library is private in the sense that it needn't be in anyone's
- * execution path, but it should be accessible by the world. The program
- * should be prepared to do ~ expansion.
- */
-/* PRIVLIB_EXP:
- * This symbol contains the ~name expanded version of PRIVLIB, to be used
- * in programs that are not prepared to deal with ~ expansion at run-time.
- */
-#define PRIVLIB "/opt/perl/lib/5.005" /**/
-#define PRIVLIB_EXP "/opt/perl/lib/5.005" /**/
+#define SIG_NAME "ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "IOINT", "STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "AIO", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "INFO", "USR1", "USR2", "RESV", "RTMIN", "NUM34", "NUM35", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41", "NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "MAX", "IOT", "LOST", "URG", "CLD", "IO", "POLL", "PTY", "PWR", "RTMAX", 0 /**/
+#define 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, 6, 6, 16, 20, 23, 23, 23, 29, 48, 0 /**/
/* SITEARCH:
* This symbol contains the name of the private library for this package.
@@ -1894,15 +2782,17 @@
* execution path, but it should be accessible by the world. The program
* should be prepared to do ~ expansion.
* The standard distribution will put nothing in this directory.
- * Individual sites may place their own extensions and modules in
- * this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-dependent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
*/
/* SITEARCH_EXP:
* This symbol contains the ~name expanded version of SITEARCH, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define SITEARCH "/opt/perl/lib/site_perl/5.005/i686-linux-thread" /**/
-#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.005/i686-linux-thread" /**/
+#define SITEARCH "/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi" /**/
+#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi" /**/
/* SITELIB:
* This symbol contains the name of the private library for this package.
@@ -1910,15 +2800,52 @@
* execution path, but it should be accessible by the world. The program
* should be prepared to do ~ expansion.
* The standard distribution will put nothing in this directory.
- * Individual sites may place their own extensions and modules in
- * this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-independent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
*/
/* SITELIB_EXP:
* This symbol contains the ~name expanded version of SITELIB, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define SITELIB "/opt/perl/lib/site_perl/5.005" /**/
-#define SITELIB_EXP "/opt/perl/lib/site_perl/5.005" /**/
+/* SITELIB_STEM:
+ * This define is SITELIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
+ */
+#define SITELIB "/opt/perl/lib/site_perl/5.6.0" /**/
+#define SITELIB_EXP "/opt/perl/lib/site_perl/5.6.0" /**/
+#define SITELIB_STEM "/opt/perl/lib/site_perl" /**/
+
+/* Size_t_size:
+ * This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size 8 /* */
+
+/* Size_t:
+ * This symbol holds the type used to declare length parameters
+ * for string functions. It is usually size_t, but may be
+ * unsigned long, int, etc. It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Size_t size_t /* length paramater for string functions */
+
+/* Sock_size_t:
+ * This symbol holds the type used for the size argument of
+ * various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t int /**/
+
+/* SSize_t:
+ * This symbol holds the type used by functions that return
+ * a count of bytes or an error condition. It must be a signed type.
+ * It is usually ssize_t, but may be long or int, etc.
+ * It may be necessary to include <sys/types.h> or <unistd.h>
+ * to get any typedef'ed information.
+ * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t ssize_t /* signed count of bytes */
/* STARTPERL:
* This variable contains the string to put in front of a perl
@@ -1927,177 +2854,235 @@
*/
#define STARTPERL "#!/opt/perl/bin/perl" /**/
-/* USE_PERLIO:
- * This symbol, if defined, indicates that the PerlIO abstraction should
- * be used throughout. If not defined, stdio should be
- * used in a fully backward compatible manner.
+/* HAS_STDIO_STREAM_ARRAY:
+ * This symbol, if defined, tells that there is an array
+ * holding the stdio streams.
*/
-/*#define USE_PERLIO / **/
-
-/* HAS_GETHOST_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for gethostent(), gethostbyname(), and
- * gethostbyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* STDIO_STREAM_ARRAY:
+ * This symbol tells the name of the array holding the stdio streams.
+ * Usual values include _iob, __iob, and __sF.
*/
-#define HAS_GETHOST_PROTOS /**/
+#define HAS_STDIO_STREAM_ARRAY /**/
+#define STDIO_STREAM_ARRAY _iob
-/* HAS_GETNET_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for getnetent(), getnetbyname(), and
- * getnetbyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* Uid_t_f:
+ * This symbol defines the format string used for printing a Uid_t.
*/
-#define HAS_GETNET_PROTOS /**/
+#define Uid_t_f "u" /**/
-/* HAS_GETPROTO_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for getprotoent(), getprotobyname(), and
- * getprotobyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* Uid_t_sign:
+ * This symbol holds the signedess of a Uid_t.
+ * 1 for unsigned, -1 for signed.
*/
-#define HAS_GETPROTO_PROTOS /**/
+#define Uid_t_sign 1 /* UID sign */
-/* HAS_GETSERV_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for getservent(), getservbyname(), and
- * getservbyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* Uid_t_size:
+ * This symbol holds the size of a Uid_t in bytes.
*/
-#define HAS_GETSERV_PROTOS /**/
+#define Uid_t_size 4 /* UID size */
-/* Netdb_host_t:
- * This symbol holds the type used for the 1st argument
- * to gethostbyaddr().
- */
-/* Netdb_hlen_t:
- * This symbol holds the type used for the 2nd argument
- * to gethostbyaddr().
- */
-/* Netdb_name_t:
- * This symbol holds the type used for the argument to
- * gethostbyname().
- */
-/* Netdb_net_t:
- * This symbol holds the type used for the 1st argument to
- * getnetbyaddr().
+/* Uid_t:
+ * This symbol holds the type used to declare user ids in the kernel.
+ * It can be int, ushort, uid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
*/
-#define Netdb_host_t const char * /**/
-#define Netdb_hlen_t int /**/
-#define Netdb_name_t const char * /**/
-#define Netdb_net_t unsigned long /**/
+#define Uid_t uid_t /* UID type */
-/* Select_fd_set_t:
- * This symbol holds the type used for the 2nd, 3rd, and 4th
- * arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET
- * is defined, and 'int *' otherwise. This is only useful if you
- * have select(), of course.
+/* USE_64_BIT_INT:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be employed (be they 32 or 64 bits). The minimal possible
+ * 64-bitness is used, just enough to get 64-bit integers into Perl.
+ * This may mean using for example "long longs", while your memory
+ * may still be limited to 2 gigabytes.
+ */
+/* USE_64_BIT_ALL:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be used (be they 32 or 64 bits). The maximal possible
+ * 64-bitness is employed: LP64 or ILP64, meaning that you will
+ * be able to use more than 2 gigabytes of memory. This mode is
+ * even more binary incompatible than USE_64_BIT_INT. You may not
+ * be able to run the resulting executable in a 32-bit CPU at all or
+ * you may need at least to reboot your OS to 64-bit mode.
+ */
+#ifndef USE_64_BIT_INT
+#define USE_64_BIT_INT /**/
+#endif
+
+#ifndef USE_64_BIT_ALL
+#define USE_64_BIT_ALL /**/
+#endif
+
+/* USE_LARGE_FILES:
+ * This symbol, if defined, indicates that large file support
+ * should be used when available.
*/
-#define Select_fd_set_t fd_set * /**/
+#ifndef USE_LARGE_FILES
+#define USE_LARGE_FILES /**/
+#endif
-/* ARCHNAME:
- * This symbol holds a string representing the architecture name.
- * It may be used to construct an architecture-dependant pathname
- * where library files may be held under a private library, for
- * instance.
+/* USE_LONG_DOUBLE:
+ * This symbol, if defined, indicates that long doubles should
+ * be used when available.
*/
-#define ARCHNAME "i686-linux-thread" /**/
+#ifndef USE_LONG_DOUBLE
+/*#define USE_LONG_DOUBLE / **/
+#endif
-/* HAS_PTHREAD_YIELD:
- * This symbol, if defined, indicates that the pthread_yield
- * routine is available to yield the execution of the current
- * thread.
+/* USE_MORE_BITS:
+ * This symbol, if defined, indicates that 64-bit interfaces and
+ * long doubles should be used when available.
*/
-/* HAS_SCHED_YIELD:
- * This symbol, if defined, indicates that the sched_yield
- * routine is available to yield the execution of the current
- * thread.
+#ifndef USE_MORE_BITS
+/*#define USE_MORE_BITS / **/
+#endif
+
+/* MULTIPLICITY:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use multiplicity.
*/
-/*#define HAS_PTHREAD_YIELD / **/
-#define HAS_SCHED_YIELD /**/
+#ifndef MULTIPLICITY
+#define MULTIPLICITY /**/
+#endif
-/* PTHREADS_CREATED_JOINABLE:
- * This symbol, if defined, indicates that pthreads are created
- * in the joinable (aka undetached) state.
+/* USE_PERLIO:
+ * This symbol, if defined, indicates that the PerlIO abstraction should
+ * be used throughout. If not defined, stdio should be
+ * used in a fully backward compatible manner.
*/
-#define PTHREADS_CREATED_JOINABLE /**/
+#ifndef USE_PERLIO
+/*#define USE_PERLIO / **/
+#endif
-/* USE_THREADS:
+/* USE_SOCKS:
* This symbol, if defined, indicates that Perl should
- * be built to use threads.
+ * be built to use socks.
+ */
+#ifndef USE_SOCKS
+/*#define USE_SOCKS / **/
+#endif
+
+/* USE_ITHREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the interpreter-based threading implementation.
+ */
+/* USE_5005THREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the 5.005-based threading implementation.
*/
/* OLD_PTHREADS_API:
* This symbol, if defined, indicates that Perl should
* be built to use the old draft POSIX threads API.
*/
-#define USE_THREADS /**/
+/*#define USE_5005THREADS / **/
+#define USE_ITHREADS /**/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define USE_THREADS /* until src is revised*/
+#endif
/*#define OLD_PTHREADS_API / **/
-/* Time_t:
- * This symbol holds the type returned by time(). It can be long,
- * or time_t on BSD sites (in which case <sys/types.h> should be
- * included).
- */
-#define Time_t time_t /* Time type */
-
-/* HAS_TIMES:
- * This symbol, if defined, indicates that the times() routine exists.
- * Note that this became obsolete on some systems (SUNOS), which now
- * use getrusage(). It may be necessary to include <sys/times.h>.
+/* PERL_VENDORARCH:
+ * If defined, this symbol contains the name of a private library.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world.
+ * It may have a ~ on the front.
+ * The standard distribution will put nothing in this directory.
+ * Vendors who distribute perl may wish to place their own
+ * architecture-dependent modules and extensions in this directory with
+ * MakeMaker Makefile.PL INSTALLDIRS=vendor
+ * or equivalent. See INSTALL for details.
*/
-#define HAS_TIMES /**/
-
-/* Fpos_t:
- * This symbol holds the type used to declare file positions in libc.
- * It can be fpos_t, long, uint, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* PERL_VENDORARCH_EXP:
+ * This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define Fpos_t fpos_t /* File position type */
+/*#define PERL_VENDORARCH "" / **/
+/*#define PERL_VENDORARCH_EXP "" / **/
-/* Gid_t:
- * This symbol holds the return type of getgid() and the type of
- * argument to setrgid() and related functions. Typically,
- * it is the type of group ids in the kernel. It can be int, ushort,
- * uid_t, etc... It may be necessary to include <sys/types.h> to get
- * any typedef'ed information.
+/* PERL_VENDORLIB_EXP:
+ * This symbol contains the ~name expanded version of VENDORLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define Gid_t gid_t /* Type for getgid(), etc... */
-
-/* Off_t:
- * This symbol holds the type used to declare offsets in the kernel.
- * It can be int, long, off_t, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* PERL_VENDORLIB_STEM:
+ * This define is PERL_VENDORLIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
*/
-#define Off_t off_t /* <offset> type */
+/*#define PERL_VENDORLIB_EXP "" / **/
+/*#define PERL_VENDORLIB_STEM "" / **/
-/* Mode_t:
- * This symbol holds the type used to declare file modes
- * for systems calls. It is usually mode_t, but may be
- * int or unsigned short. It may be necessary to include <sys/types.h>
- * to get any typedef'ed information.
+/* VOIDFLAGS:
+ * This symbol indicates how much support of the void type is given by this
+ * compiler. What various bits mean:
+ *
+ * 1 = supports declaration of void
+ * 2 = supports arrays of pointers to functions returning void
+ * 4 = supports comparisons between pointers to void functions and
+ * addresses of void functions
+ * 8 = suports declaration of generic void pointers
+ *
+ * The package designer should define VOIDUSED to indicate the requirements
+ * of the package. This can be done either by #defining VOIDUSED before
+ * including config.h, or by defining defvoidused in Myinit.U. If the
+ * latter approach is taken, only those flags will be tested. If the
+ * level of void support necessary is not present, defines void to int.
*/
-#define Mode_t mode_t /* file mode parameter for system calls */
+#ifndef VOIDUSED
+#define VOIDUSED 15
+#endif
+#define VOIDFLAGS 15
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int /* is void to be avoided? */
+#define M_VOID /* Xenix strikes again */
+#endif
-/* Pid_t:
- * This symbol holds the type used to declare process ids in the kernel.
- * It can be int, uint, pid_t, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
- */
-#define Pid_t pid_t /* PID type */
+/* PERL_XS_APIVERSION:
+ * This variable contains the version of the oldest perl binary
+ * compatible with the present perl. perl.c:incpush() and
+ * lib/lib.pm will automatically search in /opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi for older
+ * directories across major versions back to xs_apiversion.
+ * This is only useful if you have a perl library directory tree
+ * structured like the default one.
+ * See INSTALL for how this works.
+ * The versioned site_perl directory was introduced in 5.005,
+ * so that is the lowest possible value.
+ * Since this can depend on compile time options (such as
+ * bincompat) it is set by Configure. Other non-default sources
+ * of potential incompatibility, such as multiplicity, threads,
+ * debugging, 64bits, sfio, etc., are not checked for currently,
+ * though in principle we could go snooping around in old
+ * Config.pm files.
+ */
+/* PERL_PM_APIVERSION:
+ * This variable contains the version of the oldest perl
+ * compatible with the present perl. (That is, pure perl modules
+ * written for pm_apiversion will still work for the current
+ * version). perl.c:incpush() and lib/lib.pm will automatically
+ * search in /opt/perl/lib/site_perl/5.6.0 for older directories across major versions
+ * back to pm_apiversion. This is only useful if you have a perl
+ * library directory tree structured like the default one. The
+ * versioned site_perl library was introduced in 5.005, so that's
+ * the default setting for this variable. It's hard to imagine
+ * it changing before Perl6. It is included here for symmetry
+ * with xs_apiveprsion -- the searching algorithms will
+ * (presumably) be similar.
+ * See the INSTALL file for how this works.
+ */
+#define PERL_XS_APIVERSION "5.6.0"
+#define PERL_PM_APIVERSION "5.005"
-/* Size_t:
- * This symbol holds the type used to declare length parameters
- * for string functions. It is usually size_t, but may be
- * unsigned long, int, etc. It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* HAS_LCHOWN:
+ * This symbol, if defined, indicates that the lchown routine is
+ * available to operate on a symbolic link (instead of following the
+ * link).
*/
-#define Size_t size_t /* length paramater for string functions */
+#define HAS_LCHOWN /**/
-/* Uid_t:
- * This symbol holds the type used to declare user ids in the kernel.
- * It can be int, ushort, uid_t, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* FLEXFILENAMES:
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
*/
-#define Uid_t uid_t /* UID type */
+#define FLEXFILENAMES /**/
#endif
diff --git a/contrib/perl5/Porting/findvars b/contrib/perl5/Porting/findvars
index 2e81244..3cdb854 100755
--- a/contrib/perl5/Porting/findvars
+++ b/contrib/perl5/Porting/findvars
@@ -11,15 +11,17 @@ chop $pat if $pat =~ /\|$/;
# grep
while (<>) {
- if (/^(.*?)\b($pat)\b(.*)$/o) {
- my $head = "$1#$2#";
- $_ = $3;
- while (/^(.*?)\b($pat)\b(.*)$/o) {
- $head .= "$1#$2#";
- $_ = $3;
- }
- print "$ARGV\:$.\:$head$_\n";
- }
+ print "$ARGV\:$.\:$_" if s/\b($pat)\b/#$1#/og;
+# this variant might useful if the transformation is more complicated
+# if (/^(.*?)\b($pat)\b(.*)$/o) {
+# my $head = "$1#$2#";
+# $_ = $3;
+# while (/^(.*?)\b($pat)\b(.*)$/o) {
+# $head .= "$1#$2#";
+# $_ = $3;
+# }
+# print "$ARGV\:$.\:$head$_\n";
+# }
}
continue {
close ARGV if eof;
@@ -238,7 +240,6 @@ osname
pad_reset_pending
padix
padix_floor
-parsehook
patchlevel
patleave
pending_ident
diff --git a/contrib/perl5/Porting/genlog b/contrib/perl5/Porting/genlog
index 5c3e905..efb7ef8 100755
--- a/contrib/perl5/Porting/genlog
+++ b/contrib/perl5/Porting/genlog
@@ -12,7 +12,7 @@
#
# Outputs the changelist to stdout.
#
-# Gurusamy Sarathy <gsar@umich.edu>
+# Gurusamy Sarathy <gsar@activestate.com>
#
use Text::Wrap;
@@ -107,8 +107,9 @@ EOT
my $files = $files{$branch}{$kind};
# don't show large branches and integrations
$files = ["($kind " . scalar(@$files) . ' files)']
- if (@$files > 25
- && ( $kind eq 'integrate' || $kind eq 'branch'));
+ if (@$files > 25 && ($kind eq 'integrate'
+ || $kind eq 'branch'))
+ || @$files > 100;
print wrap(sprintf("%12s ", $editkind{$kind}),
sprintf("%12s ", $editkind{$kind}),
"@$files\n");
diff --git a/contrib/perl5/Porting/makerel b/contrib/perl5/Porting/makerel
index f2e1f97..4b8c277 100755
--- a/contrib/perl5/Porting/makerel
+++ b/contrib/perl5/Porting/makerel
@@ -20,19 +20,14 @@ die "Must be in root of the perl source tree.\n"
open PATCHLEVEL,"<patchlevel.h" or die;
my @patchlevel_h = <PATCHLEVEL>;
close PATCHLEVEL;
-my $patchlevel_h = join "", grep { /^#define/ } @patchlevel_h;
+my $patchlevel_h = join "", grep { /^#\s*define/ } @patchlevel_h;
print $patchlevel_h;
-$patchlevel = $1 if $patchlevel_h =~ /PATCHLEVEL\s+(\d+)/;
-$subversion = $1 if $patchlevel_h =~ /SUBVERSION\s+(\d+)/;
+$revision = $1 if $patchlevel_h =~ /PERL_REVISION\s+(\d+)/;
+$patchlevel = $1 if $patchlevel_h =~ /PERL_VERSION\s+(\d+)/;
+$subversion = $1 if $patchlevel_h =~ /PERL_SUBVERSION\s+(\d+)/;
die "Unable to parse patchlevel.h" unless $subversion >= 0;
-$vers = sprintf("5.%03d", $patchlevel);
-$vms_vers = sprintf("5_%03d", $patchlevel);
-if ($subversion) {
- $vers.= sprintf( "_%02d", $subversion);
- $vms_vers.= sprintf( "%02d", $subversion);
-} else {
- $vms_vers.= " ";
-}
+$vers = sprintf("%d.%d.%d", $revision, $patchlevel, $subversion);
+$vms_vers = sprintf("%d_%d_%d", $revision, $patchlevel, $subversion);
# fetch list of local patches
my (@local_patches, @lpatch_tags, $lpatch_tags);
@@ -41,7 +36,7 @@ my (@local_patches, @lpatch_tags, $lpatch_tags);
@lpatch_tags = map { /^\s*,"(\w+)/ } @local_patches;
$lpatch_tags = join "-", @lpatch_tags;
-$perl = "perl$vers";
+$perl = "perl-$vers";
$reldir = "$perl";
$reldir .= "-$lpatch_tags" if $lpatch_tags;
@@ -93,7 +88,6 @@ my @exe = qw(
installperl
installman
keywords.pl
- myconfig
opcode.pl
perly.fixer
t/TEST
@@ -107,6 +101,27 @@ my @exe = qw(
);
system("chmod +x @exe");
+my @writables = qw(
+ embed.h
+ embedvar.h
+ ext/B/B/Asmdata.pm
+ ext/ByteLoader/byterun.c
+ ext/ByteLoader/byterun.h
+ global.sym
+ keywords.h
+ lib/warnings.pm
+ objXSUB.h
+ opcode.h
+ pp.sym
+ pp_proto.h
+ regnodes.h
+ warnings.h
+ win32/config_H.bc
+ win32/config_H.gc
+ win32/config_H.vc
+);
+system("chmod +w @writables");
+
print "Adding CRs to DOSish files...\n";
my @crlf = qw(
djgpp/configure.bat
diff --git a/contrib/perl5/Porting/p4d2p b/contrib/perl5/Porting/p4d2p
index 67780a9..f645ef8 100755
--- a/contrib/perl5/Porting/p4d2p
+++ b/contrib/perl5/Porting/p4d2p
@@ -4,7 +4,7 @@
# reads a perforce style diff on stdin and outputs appropriate headers
# so the diff can be applied with the patch program
#
-# Gurusamy Sarathy <gsar@umich.edu>
+# Gurusamy Sarathy <gsar@activestate.com>
#
BEGIN {
diff --git a/contrib/perl5/Porting/p4desc b/contrib/perl5/Porting/p4desc
new file mode 100755
index 0000000..0bf79da
--- /dev/null
+++ b/contrib/perl5/Porting/p4desc
@@ -0,0 +1,118 @@
+#!/usr/bin/perl -wpi.bak
+
+#
+# Munge "p4 describe ..." output to include new files.
+#
+# Gurusamy Sarathy <gsar@activestate.com>
+#
+
+use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles);
+
+BEGIN {
+ $0 =~ s|^.*/||;
+ $p4port = $ENV{P4PORT} || 'localhost:1666';
+ for (@ARGV) {
+ if ($p4port =~ /^\s+$/) {
+ $p4port = $_;
+ }
+ elsif (/^-p(.*)$/) {
+ $p4port = $1 || ' ';
+ }
+ elsif (/^-v$/) {
+ $v++;
+ }
+ elsif (/^-h/) {
+ $h++;
+ }
+ else {
+ push @files, $_;
+ }
+ }
+ unless (@files) { @files = '-'; undef $^I; }
+ @ARGV = @files;
+ if ($h) {
+ print STDERR <<USAGE;
+Usage: $0 [-p \$P4PORT] [-v] [-h] [files]
+
+ -p host:port p4 port (e.g. myhost:1666)
+ -h print this help
+ -v output progress messages
+
+A smart 'cat'. When fed the spew from "p4 describe ..." on STDIN,
+spits it right out on STDOUT, followed by patches for any new files
+detected in the spew. Can also be used to edit insitu a bunch of
+files containing said spew.
+
+WARNING: Currently only emits unified diffs.
+
+Examples:
+ p4 describe -du 123 | $0 > change-123.desc
+ p4 describe -du 123 | $0 | p4d2p > change-123.patch
+
+USAGE
+ exit(0);
+ }
+ $thisfile = "";
+}
+
+
+if ($ARGV ne $thisfile) {
+ warn "processing patchfile [$ARGV]\n" unless $ARGV eq '-';
+ $thisfile = $ARGV;
+}
+
+my $cur = m|^Affected files| ... m|^Differences|;
+
+# while we are within range
+if ($cur) {
+ if (m{^\.\.\. (//depot/.+?#\d+) (add|branch)$}) {
+ my $newfile = $1;
+ push @addfiles, $newfile;
+ warn "$newfile add, revision != 1!\n" unless $newfile =~ /#1$/;
+ }
+ warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
+}
+
+if (/^Change (\d+) by/) {
+ $_ = "\n\n" . $_ if $change; # start of a new change list
+ $change = $1;
+ my $new = newfiles();
+ if ($new) {
+ $_ = $new . $_;
+ }
+}
+
+if (eof) {
+ $_ .= newfiles();
+}
+
+sub newfiles {
+ my $addfile;
+ my $ret = "";
+ for $addfile (@addfiles) {
+ my $type = `p4 -p $p4port files '$addfile'`;
+ if ($?) {
+ warn "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
+ next;
+ }
+ $type =~ m|^//.*\((.+)\)$| or next;
+ $type = $1;
+ unless ($type =~ /text/) {
+ $ret .= "\n==== $addfile ($type) ====\n\n";
+ next;
+ }
+ my @new = `p4 -p $p4port print '$addfile'`;
+ if ($?) {
+ die "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
+ }
+ my $desc = shift @new; # discard initial description
+ $ret .= "\n==== $addfile ($type) ====\n\n";
+ my $lines = "," . @new;
+ $lines = "" if @new < 2;
+ $ret .= "\@\@ -0,0 +1$lines \@\@\n";
+ $ret .= join("+","",@new);
+ $ret .= "\n\\ No newline at end of file\n" if $ret !~ /\n$/;
+ }
+ @addfiles = ();
+ return $ret;
+}
diff --git a/contrib/perl5/Porting/patching.pod b/contrib/perl5/Porting/patching.pod
index caada0c..5659f23 100644
--- a/contrib/perl5/Porting/patching.pod
+++ b/contrib/perl5/Porting/patching.pod
@@ -30,7 +30,7 @@ attempt to make everybody's life easier.
The most common problems appear to be patches being mangled by certain
mailers (I won't name names, but most of these seem to be originating on
-boxes running a certain popular commercial operating system). Other problems
+boxes running a certain popular commercial operating system). Other problems
include patches not rooted in the appropriate place in the directory structure,
and patches not produced using standard utilities (such as diff).
@@ -52,7 +52,7 @@ First, back up the original files. This can't be stressed enough,
back everything up _first_.
Also, please create patches against a clean distribution of the perl source.
-This insures that everyone else can apply your patch without clobbering their
+This ensures that everyone else can apply your patch without clobbering their
source tree.
=item diff
@@ -63,15 +63,18 @@ respectively, unified diffs (where the changed line appears immediately next
to the original) and context diffs (where several lines surrounding the changes
are included). See the manpage for diff for more details.
-Also, the preferred method for patching is -
+The preferred method for creating a unified diff suitable for feeding
+to the patch program is:
-C<diff [C<-c> | C<-u>] E<lt>old-fileE<gt> E<lt>new-fileE<gt>>
+ diff -u old-file new-file > patch-file
-Note the order of files.
+Note the order of files. See below for how to create a patch from
+two directory trees.
-Also, if your patch is to the core (rather than to a module) it
-is better to create it as a context diff as some machines have
-broken patch utilities that choke on unified diffs.
+If your patch is for wider consumption, it may be better to create it as
+a context diff as some machines have broken patch utilities that choke on
+unified diffs. A context diff is made using C<diff -c> rather than
+C<diff -u>.
GNU diff has many desirable features not provided by most vendor-supplied
diffs. Some examples using GNU diff:
@@ -94,23 +97,34 @@ diffs. Some examples using GNU diff:
=item Directories
-Patches should be generated from the source root directory, not from the
-directory that the patched file resides in. This insures that the maintainer
-patches the proper file and avoids name collisions (especially common when trying
-to apply patches to files that appear in both $src_root/ext/* and $src_root/lib/*).
-It is better to diff the file in $src_root/ext than the file in $src_root/lib.
+IMPORTANT: Patches should be generated from the source root directory, not
+from the directory that the patched file resides in. This ensures that the
+maintainer patches the proper file.
+
+Many files in the distribution are derivative--avoid patching them.
+Patch the originals instead. Most utilities (like perldoc) are in
+this category, i.e. patch utils/perldoc.PL rather than utils/perldoc.
+Similarly, don't create patches for files under $src_root/ext from
+their copies found in $install_root/lib. If you are unsure about the
+proper location of a file that may have gotten copied while building
+the source distribution, consult the C<MANIFEST>.
=item Filenames
The most usual convention when submitting patches for a single file is to make
your changes to a copy of the file with the same name as the original. Rename
-the original file in such a way that it is obvious what is being patched ($file~ or
-$file.old seem to be popular).
+the original file in such a way that it is obvious what is being patched
+($file.dist or $file.old seem to be popular).
+
+If you are submitting patches that affect multiple files then you should
+backup the entire directory tree (to $source_root.old/ for example). This
+will allow C<diff -ruN old-dir new-dir> to create all the patches at once.
-If you are submitting patches that affect multiple files then you should backup
-the entire directory tree (to $source_root.old/ for example). This will allow
-C<diff C<-c> E<lt>old-dirE<gt> E<lt>new-dirE<gt>> to create all the patches
-at once.
+=item Try it yourself
+
+Just to make sure your patch "works", be sure to apply it to the Perl
+distribution, rebuild everything, and make sure the testsuite runs
+without incident.
=back
@@ -125,7 +139,7 @@ the patch corrects. If it is a code patch (rather than a documentation
patch) you should also include a small test case that illustrates the
bug.
-=item Direction for application
+=item Directions for application
You should include instructions on how to properly apply your patch.
These should include the files affected, any shell scripts or commands
@@ -150,15 +164,35 @@ side of adding too many comments than too few.
=item Style
-Please follow the indentation style and nesting style in use in the
-block of code that you are patching.
+In general, please follow the particular style of the code you are patching.
+
+In particular, follow these general guidelines for patching Perl sources:
+
+ 8-wide tabs (no exceptions!)
+ 4-wide indents for code, 2-wide indents for nested CPP #defines
+ try hard not to exceed 79-columns
+ ANSI C prototypes
+ uncuddled elses and "K&R" style for indenting control constructs
+ no C++ style (//) comments, most C compilers will choke on them
+ mark places that need to be revisited with XXX (and revisit often!)
+ opening brace lines up with "if" when conditional spans multiple
+ lines; should be at end-of-line otherwise
+ in function definitions, name starts in column 0 (return value is on
+ previous line)
+ single space after keywords that are followed by parens, no space
+ between function name and following paren
+ avoid assignments in conditionals, but if they're unavoidable, use
+ extra paren, e.g. "if (a && (b = c)) ..."
+ "return foo;" rather than "return(foo);"
+ "if (!foo) ..." rather than "if (foo == FALSE) ..." etc.
+
=item Testsuite
When submitting a patch you should make every effort to also include
an addition to perl's regression tests to properly exercise your
patch. Your testsuite additions should generally follow these
-guidelines (courtesy of Gurusamy Sarathy (gsar@engin.umich.edu))-
+guidelines (courtesy of Gurusamy Sarathy <gsar@activestate.com>):
Know what you're testing. Read the docs, and the source.
Tend to fail, not succeed.
@@ -173,16 +207,16 @@ guidelines (courtesy of Gurusamy Sarathy (gsar@engin.umich.edu))-
do use them, make sure that you cover _all_ perl platforms.
Unlink any temporary files you create.
Promote unforeseen warnings to errors with $SIG{__WARN__}.
- Be sure to use the libraries and modules shipped with version
+ Be sure to use the libraries and modules shipped with the version
being tested, not those that were already installed.
Add comments to the code explaining what you are testing for.
Make updating the '1..42' string unnecessary. Or make sure that
you update it.
- Test _all_ behaviors of a given operator, library, or function-
- All optional arguments
- Return values in various contexts (boolean, scalar, list, lvalue)
- Use both global and lexical variables
- Don't forget the exceptional, pathological cases.
+ Test _all_ behaviors of a given operator, library, or function:
+ - All optional arguments
+ - Return values in various contexts (boolean, scalar, list, lvalue)
+ - Use both global and lexical variables
+ - Don't forget the exceptional, pathological cases.
=back
@@ -196,7 +230,7 @@ patch, didn't you).
=head2 An example patch creation
-This should work for most patches-
+This should work for most patches:
cp MANIFEST MANIFEST.old
emacs MANIFEST
@@ -222,7 +256,7 @@ word wraps your patch or that MIME encodes it. Both of these leave
the patch essentially worthless to the maintainer.
If you have no choice in mailers and no way to get your hands on a
-better one there is, of course, a perl solution. Just do this-
+better one there is, of course, a perl solution. Just do this:
perl -ne 'print pack("u*",$_)' patch > patch.uue
@@ -234,27 +268,37 @@ and post patch.uue with a note saying to unpack it using
The subject line on your patch should read
-[PATCH]5.xxx_xx (Area) Description
+ [PATCH 5.xxx_xx AREA] Description
-where the x's are replaced by the appropriate version number,
-area is a short keyword identifying what area of perl you are
-patching, and description is a very brief summary of the
+where the x's are replaced by the appropriate version number.
+The description should be a very brief but accurate summary of the
problem (don't forget this is an email header).
-Examples-
+Examples:
-[PATCH]5.004_04 (DOC) fix minor typos
+ [PATCH 5.004_04 DOC] fix minor typos
-[PATCH]5.004_99 (CORE) New warning for foo() when frobbing
+ [PATCH 5.004_99 CORE] New warning for foo() when frobbing
-[PATCH]5.005_42 (CONFIG) Added support for fribnatz 1.5
+ [PATCH 5.005_42 CONFIG] Added support for fribnatz 1.5
+
+The name of the file being patched makes for a poor subject line if
+no other descriptive text accompanies it.
=item Where to send your patch
-If your patch is for the perl core it should be sent perlbug@perl.org.
+If your patch is for a specific bug in the Perl core, it should be sent
+using the perlbug utility. Don't forget to describe the problem and the
+fix adequately.
+
If it is a patch to a module that you downloaded from CPAN you should
submit your patch to that module's author.
+If your patch addresses one of the items described in perltodo.pod,
+please discuss your approach B<before> you make the patch at
+<perl5-porters@perl.org>. Be sure to browse the archives of past
+discussions (see perltodo.pod for archive locations).
+
=back
=head2 Applying a patch
@@ -270,19 +314,21 @@ to your perl distribution.
=item patch C<-p>
-It is generally easier to apply patches with the C<-p> argument to
-patch. This helps reconcile differing paths between the machine the
-patch was created on and the machine on which it is being applied.
+It is generally easier to apply patches with the C<-p N> argument to
+patch (where N is the number of path components to skip in the files
+found in the headers). This helps reconcile differing paths between
+the machine the patch was created on and the machine on which it is
+being applied.
=item Cut and paste
-_Never_ cut and paste a patch into your editor. This usually clobbers
+B<Never> cut and paste a patch into your editor. This usually clobbers
the tabs and confuses patch.
=item Hand editing patches
-Avoid hand editing patches as this frequently screws up the whitespace
-in the patch and confuses the patch program.
+Avoid hand editing patches as this almost always screws up the line
+numbers and offsets in the patch, making it useless.
=back
diff --git a/contrib/perl5/Porting/patchls b/contrib/perl5/Porting/patchls
index 38c4dd1..4329f4c 100755
--- a/contrib/perl5/Porting/patchls
+++ b/contrib/perl5/Porting/patchls
@@ -17,7 +17,7 @@ use Text::Tabs qw(expand unexpand);
use strict;
use vars qw($VERSION);
-$VERSION = 2.08;
+$VERSION = 2.11;
sub usage {
die qq{
@@ -35,6 +35,7 @@ die qq{
(F has \$ appended unless it contains a /).
-e Expect patched files to Exist (relative to current directory)
Will print warnings for files which don't. Also affects -4 option.
+ - Read patch from STDIN
other options for special uses:
-I just gather and display summary Information about the patches.
-4 write to stdout the PerForce commands to prepare for patching.
@@ -93,7 +94,7 @@ my %cat_title = (
'UTIL' => 'UTILITIES',
'OTHER' => 'OTHER CHANGES',
'EXT' => 'EXTENSIONS',
- 'UNKNOWN' => 'UNKNOWN - NO FILES PATCH',
+ 'UNKNOWN' => 'UNKNOWN - NO FILES PATCHED',
);
@@ -131,7 +132,11 @@ sub get_meta_info {
# Style 2:
# --- perl5.004001/mg.c Sun Jun 08 12:26:24 1997
# +++ perl5.004-bc/mg.c Sun Jun 08 11:56:08 1997
-# @@ -656,9 +656,27 @@
+# @@ .. @@
+# or for deletions
+# --- perl5.004001/mg.c Sun Jun 08 12:26:24 1997
+# +++ /dev/null Sun Jun 08 11:56:08 1997
+# @@ ... @@
# or (rcs, note the different date format)
# --- 1.18 1997/05/23 19:22:04
# +++ ./pod/perlembed.pod 1997/06/03 21:41:38
@@ -145,13 +150,19 @@ my $in;
my $ls;
my $prevline = '';
my $prevtype = '';
-my (@removed, @added);
+my (%removed, %added);
my $prologue = 1; # assume prologue till patch or /^exit\b/ seen
foreach my $argv (@ARGV) {
$in = $argv;
- unless (open F, "<$in") {
+ if (-d $in) {
+ warn "Ignored directory $in\n";
+ next;
+ }
+ if ($in eq "-") {
+ *F = \*STDIN;
+ } elsif (not open F, "<$in") {
warn "Unable to open $in: $!\n";
next;
}
@@ -163,8 +174,8 @@ foreach my $argv (@ARGV) {
# not an interesting patch line
# but possibly meta-information or prologue
if ($prologue) {
- push @added, $1 if /^touch\s+(\S+)/;
- push @removed, $1 if /^rm\s+(?:-f)?\s*(\S+)/;
+ $added{$1} = 1 if /^touch\s+(\S+)/;
+ $removed{$1} = 1 if /^rm\s+(?:-f)?\s*(\S+)/;
$prologue = 0 if /^exit\b/;
}
get_meta_info($ls, $_) if $::opt_m;
@@ -182,7 +193,7 @@ foreach my $argv (@ARGV) {
# to the file which describes the problem being fixed.
if (/^Index:\s+(.*)/) {
my $f;
- foreach $f (split(/ /, $1)) { add_file($ls, $f) }
+ foreach $f (split(/ /, $1)) { add_patched_file($ls, $f) }
next;
}
@@ -190,7 +201,13 @@ foreach my $argv (@ARGV) {
or ($type eq '+++' and $prevtype eq '---') # Style 2
) {
if (/^[-+*]{3} (\S+)\s*(.*?\d\d:\d\d:\d\d)?/) { # double check
- add_file($ls, $1);
+ if ($1 eq "/dev/null") {
+ $prevline =~ /^[-+*]{3} (\S+)\s*/;
+ add_deleted_file($ls, $1);
+ }
+ else {
+ add_patched_file($ls, $1);
+ }
}
else {
warn "$in $.: parse error (prev $prevtype, type $type)\n$prevline$_";
@@ -226,7 +243,7 @@ foreach my $argv (@ARGV) {
}
# if we don't have a title for -m then use the file name
- $ls->{Title}{$in}=1 if $::opt_m
+ $ls->{Title}{"Untitled: $in"}=1 if $::opt_m
and !$ls->{Title} and $ls->{out};
$ls->{category} = $::opt_c
@@ -263,16 +280,18 @@ if ($::opt_f) { # filter out patches based on -f <regexp>
if ($::opt_4) {
my $tail = ($::opt_5) ? "|| exit 1" : "";
- print map { "p4 delete $_$tail\n" } @removed if @removed;
- print map { "p4 add $_$tail\n" } @added if @added;
+ print map { "p4 delete $_$tail\n" } sort keys %removed if %removed;
+ print map { "p4 add $_$tail\n" } sort keys %added if %added;
my @patches = sort grep { $_->{is_in} } @ls;
my @no_outs = grep { keys %{$_->{out}} == 0 } @patches;
warn "Warning: Some files contain no patches:",
join("\n\t", '', map { $_->{in} } @no_outs), "\n" if @no_outs;
+
my %patched = map { ($_, 1) } map { keys %{$_->{out}} } @patches;
- delete @patched{@added};
+ delete @patched{keys %added};
my @patched = sort keys %patched;
foreach(@patched) {
+ next if $removed{$_};
my $edit = ($::opt_e && !-f $_) ? "add " : "edit";
print "p4 $edit $_$tail\n";
}
@@ -312,8 +331,8 @@ if ($::opt_I) {
print "\n";
}
}
- print "Added files: @added\n" if @added;
- print "Removed files: @removed\n" if @removed;
+ print "Added files: ".join(" ",sort keys %added )."\n" if %added;
+ print "Removed files: ".join(" ",sort keys %removed)."\n" if %removed;
exit 0+@missing;
}
@@ -353,12 +372,15 @@ exit 0;
# ---
-sub add_file {
+sub add_patched_file {
my $ls = shift;
- print "add_file '$_[0]'\n" if $::opt_d;
- my $out = trim_name(shift);
+ my $raw_name = shift;
+ my $action = shift || 1; # 1==patched, 2==deleted
- $ls->{out}->{$out} = 1;
+ my $out = trim_name($raw_name);
+ print "add_patched_file '$out' ($raw_name, $action)\n" if $::opt_d;
+
+ $ls->{out}->{$out} = $action;
warn "$out patched but not present\n" if $::opt_e && !-f $out;
@@ -371,13 +393,24 @@ sub add_file {
$i->{out}->{$in} = 1;
}
+sub add_deleted_file {
+ my $ls = shift;
+ my $raw_name = shift;
+ my $out = trim_name($raw_name);
+ print "add_deleted_file '$out' ($raw_name)\n" if $::opt_d;
+ $removed{$out} = 1;
+ #add_patched_file(@_[0,1], 2);
+}
+
sub trim_name { # reduce/tidy file paths from diff lines
my $name = shift;
- $name = "$name ($in)" if $name eq "/dev/null";
$name =~ s:\\:/:g; # adjust windows paths
$name =~ s://:/:g; # simplify (and make win \\share into absolute path)
- if (defined $::opt_p) {
+ if ($name eq "/dev/null") {
+ # do nothing (XXX but we need a way to record deletions)
+ }
+ elsif (defined $::opt_p) {
# strip on -p levels of directory prefix
my $dc = $::opt_p;
$name =~ s:^[^/]+/(.+)$:$1: while $dc-- > 0;
@@ -385,7 +418,7 @@ sub trim_name { # reduce/tidy file paths from diff lines
else { # try to strip off leading path to perl directory
# if absolute path, strip down to any *perl* directory first
$name =~ s:^/.*?perl.*?/::i;
- $name =~ s:.*perl[-_]?5?[._]?[-_a-z0-9.+]*/::i;
+ $name =~ s:.*(perl|maint)[-_]?5?[._]?[-_a-z0-9.+]*/::i;
$name =~ s:^\./::;
}
return $name;
@@ -436,7 +469,9 @@ sub list_files_by_patch {
# a twisty maze of little options
my $cat = ($ls->{category} and !$::opt_m) ? "\t$ls->{category}" : "";
print "$name$cat: " unless ($::opt_h and !$::opt_v) or !"$name$cat";
- print join('',"\n",@meta) if @meta;
+ my $sep = "\n";
+ $sep = "" if @show_meta==1 && $::opt_c && $::opt_h;
+ print join('', $sep, @meta) if @meta;
return if $::opt_m && !$show_meta{Files};
my @v = sort PATORDER keys %{ $ls->{out} };
@@ -467,7 +502,7 @@ sub categorize_files {
$c{UTIL} += 10,next if m:^(utils|x2p|h2pl)/:;
$c{PORT1}+= 15,next if m:^win32:;
$c{PORT2} += 15,next
- if m:^(cygwin32|os2|plan9|qnx|vms)/:
+ if m:^(cygwin|os2|plan9|qnx|vms)/:
or m:^(hints|Porting|ext/DynaLoader)/:
or m:^README\.:;
$c{EXT} += 10,next
diff --git a/contrib/perl5/Porting/pumpkin.pod b/contrib/perl5/Porting/pumpkin.pod
index 335e49f..99776b5 100644
--- a/contrib/perl5/Porting/pumpkin.pod
+++ b/contrib/perl5/Porting/pumpkin.pod
@@ -8,8 +8,8 @@ There is no simple synopsis, yet.
=head1 DESCRIPTION
-This document attempts to begin to describe some of the
-considerations involved in patching and maintaining perl.
+This document attempts to begin to describe some of the considerations
+involved in patching, porting, and maintaining perl.
This document is still under construction, and still subject to
significant changes. Still, I hope parts of it will be useful,
@@ -47,93 +47,68 @@ Archives of the list are held at:
=head1 How are Perl Releases Numbered?
-Perl version numbers are floating point numbers, such as 5.004.
-(Observations about the imprecision of floating point numbers for
-representing reality probably have more relevance than you might
-imagine :-) The major version number is 5 and the '004' is the
-patchlevel. (Questions such as whether or not '004' is really a minor
-version number can safely be ignored.:)
+Beginning with v5.6.0, even versions will stand for maintenance releases
+and odd versions for development releases, i.e., v5.6.x for maintenance
+releases, and v5.7.x for development releases. Before v5.6.0, subversions
+_01 through _49 were reserved for bug-fix maintenance releases, and
+subversions _50 through _99 for unstable development versions.
-The version number is available as the magic variable $],
-and can be used in comparisons, e.g.
+For example, in v5.6.1, the revision number is 5, the version is 6,
+and 1 is the subversion.
- print "You've got an old perl\n" if $] < 5.002;
+For compatibility with the older numbering scheme the composite floating
+point version number continues to be available as the magic variable $],
+and amounts to C<$revision + $version/1000 + $subversion/1000000>. This
+can still be used in comparisons.
-You can also require particular version (or later) with
+ print "You've got an old perl\n" if $] < 5.005_03;
- use 5.002;
+In addition, the version is also available as a string in $^V.
-At some point in the future, we may need to decide what to call the
-next big revision. In the .package file used by metaconfig to
-generate Configure, there are two variables that might be relevant:
-$baserev=5.0 and $package=perl5. At various times, I have suggested
-we might change them to $baserev=5.1 and $package=perl5.1 if want
-to signify a fairly major update. Or, we might want to jump to perl6.
-Let's worry about that problem when we get there.
-
-=head2 Subversions
+ print "You've got a new perl\n" if $^V and $^V ge v5.6.0;
-In addition, there may be "developer" sub-versions available. These
-are not official releases. They may contain unstable experimental
-features, and are subject to rapid change. Such developer
-sub-versions are numbered with sub-version numbers. For example,
-version 5.003_04 is the 4'th developer version built on top of
-5.003. It might include the _01, _02, and _03 changes, but it
-also might not. Sub-versions are allowed to be subversive. (But see
-the next section for recent changes.)
+You can also require particular version (or later) with:
-These sub-versions can also be used as floating point numbers, so
-you can do things such as
+ use 5.006;
- print "You've got an unstable perl\n" if $] == 5.00303;
+or using the new syntax available only from v5.6 onward:
-You can also require particular version (or later) with
+ use v5.6.0;
- use 5.003_03; # the "_" is optional
+At some point in the future, we may need to decide what to call the
+next big revision. In the .package file used by metaconfig to
+generate Configure, there are two variables that might be relevant:
+$baserev=5 and $package=perl5.
-Sub-versions produced by the members of perl5-porters are usually
-available on CPAN in the F<src/5.0/unsupported> directory.
+Perl releases produced by the members of perl5-porters are usually
+available on CPAN in the F<src/5.0/maint> and F<src/5.0/devel>
+directories.
=head2 Maintenance and Development Subversions
-As an experiment, starting with version 5.004, subversions _01 through
-_49 will be reserved for bug-fix maintenance releases, and subversions
-_50 through _99 will be available for unstable development versions.
-
-The separate bug-fix track is being established to allow us an easy
-way to distribute important bug fixes without waiting for the
-developers to untangle all the other problems in the current
-developer's release.
+The first rule of maintenance work is "First, do no harm."
Trial releases of bug-fix maintenance releases are announced on
perl5-porters. Trial releases use the new subversion number (to avoid
testers installing it over the previous release) and include a 'local
-patch' entry in patchlevel.h.
+patch' entry in patchlevel.h. The distribution file contains the
+string C<MAINT_TRIAL> to make clear that the file is not meant for
+public consumption.
-Watch for announcements of maintenance subversions in
-comp.lang.perl.announce.
-
-The first rule of maintenance work is "First, do no harm."
+In general, the names of official distribution files for the public
+always match the regular expression:
-=head2 Why such a complicated scheme?
+ ^perl\d+\.(\d+)\.\d+(-MAINT_TRIAL_\d+)\.tar\.gz$
-Two reasons, really. At least.
+C<$1> in the pattern is always an even number for maintenance
+versions, and odd for developer releases.
-First, we need some way to identify and release collections of patches
-that are known to have new features that need testing and exploration. The
-subversion scheme does that nicely while fitting into the
-C<use 5.004;> mold.
-
-Second, since most of the folks who help maintain perl do so on a
-free-time voluntary basis, perl development does not proceed at a
-precise pace, though it always seems to be moving ahead quickly.
-We needed some way to pass around the "patch pumpkin" to allow
-different people chances to work on different aspects of the
-distribution without getting in each other's way. It wouldn't be
-constructive to have multiple people working on incompatible
-implementations of the same idea. Instead what was needed was
-some kind of "baton" or "token" to pass around so everyone knew
-whose turn was next.
+In the past it has been observed that pumkings tend to invent new
+naming conventions on the fly. If you are a pumpking, before you
+invent a new name for any of the three types of perl distributions,
+please inform the guys from the CPAN who are doing indexing and
+provide the trees of symlinks and the like. They will have to know
+I<in advance> what you decide.
=head2 Why is it called the patch pumpkin?
@@ -155,7 +130,7 @@ No one was allowed to make backups unless they had the "backup pumpkin".
The name has stuck.
-=head1 Philosophical Issues in Patching Perl
+=head1 Philosophical Issues in Patching and Porting Perl
There are no absolute rules, but there are some general guidelines I
have tried to follow as I apply patches to the perl sources.
@@ -174,6 +149,16 @@ generalized the process of building libperl so that NeXT and SVR4 users
could still get their work done, but others could build a shared
libperl if they wanted to as well.
+Contain your changes carefully. Assume nothing about other operating
+systems, not even closely related ones. Your changes must not affect
+other platforms.
+
+Spy shamelessly on how similar patching or porting issues have been
+settled elsewhere.
+
+If feasible, try to keep filenames 8.3-compliant to humor those poor
+souls that get joy from running Perl under such dire limitations.
+
=head2 Seek consensus on major changes
If you are making big changes, don't do it in secret. Discuss the
@@ -196,6 +181,88 @@ that the machine-specific #ifdef's may not be valid across major
releases of the operating system. Further, the feature-specific tests
may help out folks on another platform who have the same problem.
+=head2 Machine-specific files
+
+=over 4
+
+=item source code
+
+If you have many machine-specific #defines or #includes, consider
+creating an "osish.h" (os2ish.h, vmsish.h, and so on) and including
+that in perl.h. If you have several machine-specific files (function
+emulations, function stubs, build utility wrappers) you may create a
+separate subdirectory (djgpp, win32) and put the files in there.
+Remember to update C<MANIFEST> when you add files.
+
+If your system supports dynamic loading but none of the existing
+methods at F<ext/DynaLoader/dl_*.xs> work for you, you must write
+a new one. Study the existing ones to see what kind of interface
+you must supply.
+
+=item build hints
+
+There are two kinds of hints: hints for building Perl and hints for
+extensions. The former live in the C<hints> subdirectory, the latter
+in C<ext/*/hints> subdirectories.
+
+The top level hints are Bourne-shell scripts that set, modify and
+unset appropriate Configure variables, based on the Configure command
+line options and possibly existing config.sh and Policy.sh files from
+previous Configure runs.
+
+The extension hints are written Perl (by the time they are used
+miniperl has been built) and control the building of their respective
+extensions. They can be used to for example manipulate compilation
+and linking flags.
+
+=item build and installation Makefiles, scripts, and so forth
+
+Sometimes you will also need to tweak the Perl build and installation
+procedure itself, like for example F<Makefile.SH> and F<installperl>.
+Tread very carefully, even more than usual. Contain your changes
+with utmost care.
+
+=item test suite
+
+Many of the tests in C<t> subdirectory assume machine-specific things
+like existence of certain functions, something about filesystem
+semantics, certain external utilities and their error messages. Use
+the C<$^O> and the C<Config> module (which contains the results of the
+Configure run, in effect the C<config.sh> converted to Perl) to either
+skip (preferably not) or customize (preferable) the tests for your
+platform.
+
+=item modules
+
+Certain standard modules may need updating if your operating system
+sports for example a native filesystem naming. You may want to update
+some or all of the modules File::Basename, File::Spec, File::Path, and
+File::Copy to become aware of your native filesystem syntax and
+peculiarities.
+
+=item documentation
+
+If your operating system comes from outside UNIX you almost certainly
+will have differences in the available operating system functionality
+(missing system calls, different semantics, whatever). Please
+document these at F<pod/perlport.pod>. If your operating system is
+the first B<not> to have a system call also update the list of
+"portability-bewares" at the beginning of F<pod/perlfunc.pod>.
+
+A file called F<README.youros> at the top level that explains things
+like how to install perl at this platform, where to get any possibly
+required additional software, and for example what test suite errors
+to expect, is nice too.
+
+You may also want to write a separate F<.pod> file for your operating
+system to tell about existing mailing lists, os-specific modules,
+documentation, whatever. Please name these along the lines of
+F<perl>I<youros>.pod. [unfinished: where to put this file (the pod/
+subdirectory, of course: but more importantly, which/what index files
+should be updated?)]
+
+=back
+
=head2 Allow for lots of testing
We should never release a main version without testing it as a
@@ -211,7 +278,7 @@ that some of those things will be just plain broken and need to be fixed,
but, in general, we ought to try to avoid breaking widely-installed
things.
-=head2 Automate generation of derivative files
+=head2 Automated generation of derivative files
The F<embed.h>, F<keywords.h>, F<opcode.h>, and F<perltoc.pod> files
are all automatically generated by perl scripts. In general, don't
@@ -219,11 +286,14 @@ patch these directly; patch the data files instead.
F<Configure> and F<config_h.SH> are also automatically generated by
B<metaconfig>. In general, you should patch the metaconfig units
-instead of patching these files directly. However, very minor changes to
-F<Configure> may be made in between major sync-ups with the metaconfig
-units, which tends to be complicated operations. But be careful, this
-can quickly spiral out of control. Running metaconfig is not really
-hard.
+instead of patching these files directly. However, very minor changes
+to F<Configure> may be made in between major sync-ups with the
+metaconfig units, which tends to be complicated operations. But be
+careful, this can quickly spiral out of control. Running metaconfig
+is not really hard.
+
+Also F<Makefile> is automatically produced from F<Makefile.SH>.
+In general, look out for all F<*.SH> files.
Finally, the sample files in the F<Porting/> subdirectory are
generated automatically by the script F<U/mksample> included
@@ -411,6 +481,9 @@ output statements mean the patch won't apply cleanly. Long ago I
started to fix F<perly.fixer> to detect this, but I never completed the
task.
+If C<perly.c> changes, make sure you run C<perl vms/vms_yfix.pl> to
+update the corresponding VMS files. See L<VMS-specific updates>.
+
Some additional notes from Larry on this:
Don't forget to regenerate perly_c.diff.
@@ -520,8 +593,8 @@ things that need to be fixed in Configure.
=head2 VMS-specific updates
-If you have changed F<perly.y>, then you may want to update
-F<vms/perly_{h,c}.vms> by running C<perl vms/vms_yfix.pl>.
+If you have changed F<perly.y> or F<perly.c>, then you most probably want
+to update F<vms/perly_{h,c}.vms> by running C<perl vms/vms_yfix.pl>.
The Perl version number appears in several places under F<vms>.
It is courteous to update these versions. For example, if you are
@@ -628,6 +701,42 @@ supports dynamic loading, you can also test static loading with
You can also hand-tweak your config.h to try out different #ifdef
branches.
+=head1 Running 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.
+
+Use the following commands to test perl with Purify:
+
+ sh Configure -des -Doptimize=-g -Uusemymalloc -Dusemultiplicity \
+ -Accflags=-DPURIFY
+ setenv PURIFYOPTIONS "-chain-length=25"
+ make all pureperl
+ cd t
+ ln -s ../pureperl perl
+ setenv PERL_DESTRUCT_LEVEL 5
+ ./perl TEST
+
+Disabling Perl's malloc allows Purify to monitor allocations and leaks
+more closely; using Perl's malloc will make Purify report most leaks
+in the "potential" leaks category. 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. The -DPURIFY
+enables any Purify-specific debugging code in the sources.
+
+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 the following options instead:
+
+ setenv PURIFYOPTIONS "-chain-length=25 -windows=no -log-file=perl.log \
+ -append-logfile=yes"
+
+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.)
+
=head1 Common Gotcha's
=over 4
@@ -1008,33 +1117,6 @@ may find metaconfig's units clumsy to work with.
=back
-=head2 @INC search order
-
-By default, the list of perl library directories in @INC is the
-following:
-
- $archlib
- $privlib
- $sitearch
- $sitelib
-
-Specifically, on my Solaris/x86 system, I run
-B<sh Configure -Dprefix=/opt/perl> and I have the following
-directories:
-
- /opt/perl/lib/i86pc-solaris/5.00307
- /opt/perl/lib
- /opt/perl/lib/site_perl/i86pc-solaris
- /opt/perl/lib/site_perl
-
-That is, perl's directories come first, followed by the site-specific
-directories.
-
-The site libraries come second to support the usage of extensions
-across perl versions. Read the relevant section in F<INSTALL> for
-more information. If we ever make $sitearch version-specific, this
-topic could be revisited.
-
=head2 Why isn't there a directory to override Perl's library?
Mainly because no one's gotten around to making one. Note that
@@ -1158,18 +1240,6 @@ what I came up with off the top of my head.
=over 4
-=item installprefix
-
-I think we ought to support
-
- Configure -Dinstallprefix=/blah/blah
-
-Currently, we support B<-Dprefix=/blah/blah>, but the changing the install
-location has to be handled by something like the F<config.over> trick
-described in F<INSTALL>. AFS users also are treated specially.
-We should probably duplicate the metaconfig prefix stuff for an
-install prefix.
-
=item Configure -Dsrc=/blah/blah
We should be able to emulate B<configure --srcdir>. Tom Tromey
@@ -1178,16 +1248,6 @@ the dist-users mailing list along these lines. They have been folded
back into the main distribution, but various parts of the perl
Configure/build/install process still assume src='.'.
-=item Directory for vendor-supplied modules?
-
-If a vendor supplies perl, but wants to leave $siteperl and $sitearch
-for the local user to use, where should the vendor put vendor-supplied
-modules (such as Tk.so?) If the vendor puts them in $archlib, then
-they need to be updated each time the perl version is updated.
-Perhaps we need a set of libries $vendorperl and $vendorarch that
-track $apiversion (like the $sitexxx directories do) rather than
-just $version (like the main perl directory).
-
=item Hint file fixes
Various hint files work around Configure problems. We ought to fix
@@ -1198,47 +1258,6 @@ Configure so that most of them aren't needed.
Some of the hint file information (particularly dynamic loading stuff)
ought to be fed back into the main metaconfig distribution.
-=item Catch GNU Libc "Stub" functions
-
-Some functions (such as lchown()) are present in libc, but are
-unimplmented. That is, they always fail and set errno=ENOSYS.
-
-Thomas Bushnell provided the following sample code and the explanation
-that follows:
-
- /* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char FOO(); below. */
- #include <assert.h>
- /* Override any gcc2 internal prototype to avoid an error. */
- /* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
- char FOO();
-
- int main() {
-
- /* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
- #if defined (__stub_FOO) || defined (__stub___FOO)
- choke me
- #else
- FOO();
- #endif
-
- ; return 0; }
-
-The choice of <assert.h> is essentially arbitrary. The GNU libc
-macros are found in <gnu/stubs.h>. You can include that file instead
-of <assert.h> (which itself includes <gnu/stubs.h>) if you test for
-its existence first. <assert.h> is assumed to exist on every system,
-which is why it's used here. Any GNU libc header file will include
-the stubs macros. If either __stub_NAME or __stub___NAME is defined,
-then the function doesn't actually exist. Tests using <assert.h> work
-on every system around.
-
-The declaration of FOO is there to override builtin prototypes for
-ANSI C functions.
-
=back
=head2 Probably good ideas waiting for round tuits
@@ -1320,4 +1339,4 @@ All opinions expressed herein are those of the authorZ<>(s).
=head1 LAST MODIFIED
-$Id: pumpkin.pod,v 1.22 1998/07/22 16:33:55 doughera Released $
+$Id: pumpkin.pod,v 1.23 2000/01/13 19:45:13 doughera Released $
diff --git a/contrib/perl5/README b/contrib/perl5/README
index e3ccad4..0925b98 100644
--- a/contrib/perl5/README
+++ b/contrib/perl5/README
@@ -1,7 +1,7 @@
Perl Kit, Version 5.0
- Copyright 1989-1999, Larry Wall
+ Copyright 1989-2000, Larry Wall
All rights reserved.
This program is free software; you can redistribute it and/or modify
@@ -50,9 +50,9 @@
--------------------------------------------------------------------------
Perl is a language that combines some of the features of C, sed, awk
-and shell. See the manual page for more hype. There are also two Nutshell
-Handbooks published by O'Reilly & Assoc. See pod/perlbook.pod
-for more information.
+and shell. See the manual page for more hype. There are also many Perl
+books available, covering a wide variety of topics, from various publishers.
+See pod/perlbook.pod for more information.
Please read all the directions below before you proceed any further, and
then follow them carefully.
@@ -62,16 +62,10 @@ in MANIFEST.
Installation
-1) Detailed instructions are in the file INSTALL which you should read.
-In brief, the following should work on most systems:
- rm -f config.sh
- sh Configure
- make
- make test
- make install
-For most systems, it should be safe to accept all the Configure defaults.
-(It is recommended that you accept the defaults the first time you build
-or if you have any problems building.)
+1) Detailed instructions are in the file "INSTALL", which you should
+read if you are either installing on a system resembling Unix
+or porting perl to another platform. For non-Unix platforms, see the
+corresponding README.
2) Read the manual entries before running perl.
@@ -81,18 +75,16 @@ If you have a problem, there's someone else out there who either has had
or will have the same problem. It's usually helpful if you send the
output of the "myconfig" script in the main perl directory.
-If you've succeeded in compiling perl, the perlbug script in the utils/
+If you've succeeded in compiling perl, the perlbug script in the "utils"
subdirectory can be used to help mail in a bug report.
If possible, send in patches such that the patch program will apply them.
Context diffs are the best, then normal diffs. Don't send ed scripts--
I've probably changed my copy since the version you have.
-Watch for perl patches in comp.lang.perl.announce. Patches will generally
-be in a form usable by the patch program. If you are just now bringing
-up perl and aren't sure how many patches there are, write to me and I'll
-send any you don't have. Your current patch level is shown in
-patchlevel.h.
+The latest versions of perl are always available on the various CPAN
+(Comprehensive Perl Archive Network) sites around the world.
+See <URL:http://www.perl.com/CPAN/src/>.
Just a personal note: I want you to know that I create nice things like this
diff --git a/contrib/perl5/README.Y2K b/contrib/perl5/README.Y2K
new file mode 100644
index 0000000..378db15
--- /dev/null
+++ b/contrib/perl5/README.Y2K
@@ -0,0 +1,47 @@
+The following information about Perl and the year 2000 is a modified
+version of the information that can be found in the Frequently Asked
+Question (FAQ) documents.
+
+Does Perl have a year 2000 problem? Is Perl Y2K compliant?
+
+Short answer: No, Perl does not have a year 2000 problem. Yes,
+ Perl is Y2K compliant (whatever that means). The
+ programmers you've hired to use it, however, probably are
+ not. If you want perl to complain when your programmers
+ create programs with certain types of possible year 2000
+ problems, a build option allows you to turn on warnings.
+
+Long answer: The question belies a true understanding of the
+ issue. Perl is just as Y2K compliant as your pencil
+ --no more, and no less. Can you use your pencil to write
+ a non-Y2K-compliant memo? Of course you can. Is that
+ the pencil's fault? Of course it isn't.
+
+ The date and time functions supplied with perl (gmtime and
+ localtime) supply adequate information to determine the
+ year well beyond 2000 (2038 is when trouble strikes for
+ 32-bit machines). The year returned by these functions
+ when used in an array context is the year minus 1900. For
+ years between 1910 and 1999 this happens to be a 2-digit
+ decimal number. To avoid the year 2000 problem simply do
+ not treat the year as a 2-digit number. It isn't.
+
+ When gmtime() and localtime() are used in scalar context
+ they return a timestamp string that contains a fully-
+ expanded year. For example, $timestamp =
+ gmtime(1005613200) sets $timestamp to "Tue Nov 13 01:00:00
+ 2001". There's no year 2000 problem here.
+
+ That doesn't mean that Perl can't be used to create non-
+ Y2K compliant programs. It can. But so can your pencil.
+ It's the fault of the user, not the language. At the risk
+ of inflaming the NRA: ``Perl doesn't break Y2K, people
+ do.'' See http://language.perl.com/news/y2k.html for a
+ longer exposition.
+
+ If you want perl to warn you when it sees a program which
+ catenates a number with the string "19" -- a common
+ indication of a year 2000 problem -- build perl using the
+ Configure option "-Accflags=-DPERL_Y2KWARN".
+ (See the file INSTALL for more information about building
+ perl.)
diff --git a/contrib/perl5/README.posix-bc b/contrib/perl5/README.posix-bc
new file mode 100644
index 0000000..34bcad7
--- /dev/null
+++ b/contrib/perl5/README.posix-bc
@@ -0,0 +1,131 @@
+This is a first ported perl for the POSIX subsystem in BS2000 VERSION
+'V121', OSD V3.1, POSIX Shell V03.1A55. It may work on other
+versions, but that's the one we've tested it on.
+
+You may need the following GNU programs in order to install perl:
+
+gzip:
+
+We used version 1.2.4, which could be installed out of the box with
+one failure during 'make check'.
+
+bison:
+
+The yacc coming with BS2000 POSIX didn't work for us. So we had to
+use bison. We had to make a few changes to perl in order to use the
+pure (reentrant) parser of bison. We used version 1.25, but we had to
+add a few changes due to EBCDIC.
+
+
+UNPACKING:
+==========
+
+To extract an ASCII tar archive on BS2000 POSIX you need an ASCII
+filesystem (we used the mountpoint /usr/local/ascii for this). Now
+you extract the archive in the ASCII filesystem without I/O-conversion:
+
+cd /usr/local/ascii
+export IO_CONVERSION=NO
+gunzip < /usr/local/src/perl.tar.gz | pax -r
+
+You may ignore the error message for the first element of the archive
+(this doesn't look like a tar archive / skipping to next file...),
+it's only the directory which will be made anyway.
+
+After extracting the archive you copy the whole directory tree to your
+EBCDIC filesystem. This time you use I/O-conversion:
+
+cd /usr/local/src
+IO_CONVERSION=YES
+cp -r /usr/local/ascii/perl5.005_02 ./
+
+
+COMPILING:
+==========
+
+There is a "hints" file for posix-bc that specifies the correct values
+for most things. The major problem is (of course) the EBCDIC character
+set.
+
+Configure did everything except the perl parser.
+
+Because of our problems with the native yacc we used GNU bison to
+generate a pure (=reentrant) parser for perly.y. So our yacc is
+really the following script:
+
+-----8<-----/usr/local/bin/yacc-----8<-----
+#! /usr/bin/sh
+
+# Bison as a reentrant yacc:
+
+# save parameters:
+params=""
+while [[ $# -gt 1 ]]; do
+ params="$params $1"
+ shift
+done
+
+# add flag %pure_parser:
+
+tmpfile=/tmp/bison.$$.y
+echo %pure_parser > $tmpfile
+cat $1 >> $tmpfile
+
+# call bison:
+
+echo "/usr/local/bin/bison --yacc $params $1\t\t\t(Pure Parser)"
+/usr/local/bin/bison --yacc $params $tmpfile
+
+# cleanup:
+
+rm -f $tmpfile
+-----8<----------8<-----
+
+We still use the normal yacc for a2p.y though!!! We made a softlink
+called byacc to distinguish between the two versions:
+
+ln -s /usr/bin/yacc /usr/local/bin/byacc
+
+We build perl using both GNU make and the native make.
+
+
+TESTING:
+========
+
+We still got a few errors during 'make test'. Most of them are the
+result of using bison. Bison prints 'parser error' instead of 'syntax
+error', so we may ignore them. One error in the test op/regexp (and
+op/regexp_noamp) seems a bit critical, the result was an 'Out of
+memory' (core dump with op/regexp_noamp). The following list shows
+our errors, your results may differ:
+
+op/misc.............FAILED tests 45-46
+op/pack.............FAILED tests 58-60
+op/regexp...........FAILED tests 405-492 (core dump)
+op/regexp_noamp.....FAILED tests 405-492 (core dump)
+pragma/overload.....FAILED tests 152-153, 170-171
+pragma/subs.........FAILED tests 1-2
+pragma/warning......FAILED tests 121, 127, 130, 142
+lib/cgi-html........dubious, FAILED tests 1-17 (ALL)
+lib/complex.........FAILED tests 264, 484
+lib/dumper..........FAILED tests MANY
+Failed 7/190 test scripts, 96.32% okay. 234/6549 subtests failed, 96.43% okay.
+
+
+INSTALLING:
+===========
+
+We have no nroff on BS2000 POSIX (yet), so we ignored any errors while
+installing the documentation.
+
+
+USING PERL:
+===========
+
+BS2000 POSIX doesn't support the shebang notation
+('#!/usr/local/bin/perl'), so you have to use the following lines
+instead:
+
+: # use perl
+ eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
+ if $running_under_some_shell;
diff --git a/contrib/perl5/README.threads b/contrib/perl5/README.threads
index 136b156..15d36de 100644
--- a/contrib/perl5/README.threads
+++ b/contrib/perl5/README.threads
@@ -1,53 +1,89 @@
-NOTE
-
-Threading is a highly experimental feature. There are still a
-few race conditions that show up under high contention on SMP
+NOTE: This documentation describes the style of threading that was
+available in 5.005. Perl v5.6 also has the early beginnings of
+interpreter-based threads support (which is what will be enabled by
+default when you simply ask for -Dusethreads). However, be advised
+that interpreter threads cannot as yet be created from the Perl level
+yet. If you're looking to create threads from within Perl, chances
+are you _don't_ want interpreter threads, but want the older support
+for threads described below, enabled with:
+
+ sh Configure -Dusethreads -Duse5005threads
+
+The rest of this document only applies to the use5005threads style of
+threads.
+---------------------------------------------------------------------------
+
+Support for threading is still in the highly experimental stages. There
+are known race conditions that show up under high contention on SMP
machines. Internal implementation is still subject to changes.
It is not recommended for production use at this time.
+---------------------------------------------------------------------------
+
Building
-If you want to build with multi-threading support and you are
-running one of the following:
+If your system is in the following list you should be able to just:
- * Linux 2.x (with the LinuxThreads library installed: that's
- the linuxthreads and linuxthreads-devel RPMs for RedHat)
+ ./Configure -Dusethreads -Duse5005threads -des
+ make
- * Digital UNIX 4.x
+and ignore the rest of this "Building" section. If not, continue
+from the "Problems" section.
- * Digital UNIX 3.x (Formerly DEC OSF/1), see additional note below
+ * Linux 2.* (with the LinuxThreads library installed:
+ that's the linuxthreads and linuxthreads-devel RPMs
+ for RedHat)
- * Solaris 2.x for recentish x (2.5 is OK)
+ * Tru64 UNIX (formerly Digital UNIX formerly DEC OSF/1)
+ (see additional note below)
- * IRIX 6.2 or newer. 6.2 will require a few os patches.
- IMPORTANT: Without patch 2401, a kernel bug in IRIX 6.2 will
- cause your machine to panic and crash when running threaded perl.
- IRIX 6.3 and up should be OK. See lower down for patch details.
+ * Solaris 2.* for recentish x (2.5 is OK)
-then you should be able to use
+ * IRIX 6.2 or newer. 6.2 will require a few OS patches.
+ IMPORTANT: Without patch 2401 (or its replacement),
+ a kernel bug in IRIX 6.2 will cause your machine to
+ panic and crash when running threaded perl.
+ IRIX 6.3 and up should be OK. See lower down for patch details.
- ./Configure -Dusethreads -des
- make
+ * AIX 4.1.5 or newer.
+
+ * FreeBSD 2.2.8 or newer.
+
+ * OpenBSD
+
+ * NeXTstep, OpenStep
-and ignore the rest of this "Building" section. If it doesn't
-work or you are using another platform which you believe supports
-POSIX.1c threads then read on. Additional information may be in
-a platform-specific "hints" file in the hints/ subdirectory.
+ * OS/2
-On other platforms that use Configure to build perl, omit the -d
-from your ./Configure arguments. For example, use:
+ * DOS DJGPP
- ./Configure -Dusethreads
+ * VM/ESA
+
+---------------------------------------------------------------------------
+
+Problems
+
+If the simple way doesn't work or you are using another platform which
+you believe supports POSIX.1c threads then read on. Additional
+information may be in a platform-specific "hints" file in the hints/
+subdirectory.
+
+On platforms that use Configure to build perl, omit the -d from your
+./Configure arguments. For example, use:
+
+ ./Configure -Dusethreads -Duse5005threads
When Configure prompts you for ccflags, insert any other arguments in
-there that your compiler needs to use POSIX threads. When Configure
-prompts you for linking flags, include any flags required for
-threading (usually nothing special is required here). Finally, when
-COnfigure prompts you for libraries, include any necessary libraries
-(e.g. -lpthread). Pay attention to the order of libraries. It is
-probably necessary to specify your threading library *before* your
-standard C library, e.g. it might be necessary to have -lpthread -lc,
-instead of -lc -lpthread.
+there that your compiler needs to use POSIX threads (-D_REENTRANT,
+-pthreads, -threads, -pthread, -thread, are good guesses). When
+Configure prompts you for linking flags, include any flags required
+for threading (usually nothing special is required here). Finally,
+when Configure prompts you for libraries, include any necessary
+libraries (e.g. -lpthread). Pay attention to the order of libraries.
+It is probably necessary to specify your threading library *before*
+your standard C library, e.g. it might be necessary to have -lpthread
+-lc, instead of -lc -lpthread. You may also need to use -lc_r instead
+of -lc.
Once you have specified all your compiler flags, you can have Configure
accept all the defaults for the remainder of the session by typing &-d
@@ -71,7 +107,7 @@ For Digital Unix 4.x:
For Digital Unix 3.x (Formerly DEC OSF/1):
Add -DOLD_PTHREADS_API to ccflags
- If compiling with the GNU cc compiler, remove -thread from ccflags
+ If compiling with the GNU cc compiler, remove -threads from ccflags
(The following should be done automatically if you call Configure
with the -Dusethreads option).
@@ -93,6 +129,7 @@ For IRIX:
For IRIX 6.3 and 6.4 the pthreads should work out of the box.
Thanks to Hannu Napari <Hannu.Napari@hut.fi> for the IRIX
pthreads patches information.
+
For AIX:
(This should all be done automatically by the hint file).
Change cc to xlc_r or cc_r.
@@ -107,6 +144,12 @@ For Win32:
Now you can do a
make
+When you succeed in compiling and testing ("make test" after your
+build) a threaded Perl in a platform previosuly unknown to support
+threaded perl, please let perlbug@perl.com know about your victory.
+Explain what you did in painful detail.
+
+---------------------------------------------------------------------------
O/S specific bugs
@@ -138,8 +181,8 @@ has this fixed but the following patch can be applied to 0.5 for now:
Building the Thread extension
The Thread extension is now part of the main perl distribution tree.
-If you did Configure -Dusethreads then it will have been added to
-the list of extensions automatically.
+If you did Configure -Dusethreads -Duse5005threads then it will have been
+added to the list of extensions automatically.
You can try some of the tests with
cd ext/Thread
@@ -155,6 +198,7 @@ Try running the main perl test suite too. There are known
failures for some of the DBM/DB extensions (if their underlying
libraries were not compiled to be thread-aware).
+---------------------------------------------------------------------------
Bugs
@@ -164,8 +208,7 @@ tested at all in recent times.)
* There may still be races where bugs show up under contention.
-* Need to document "lock", Thread.pm, Queue.pm, ...
-
+---------------------------------------------------------------------------
Debugging
@@ -178,6 +221,7 @@ have to delete the lines in perl.c which say
DEBUG_S(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
#endif
+---------------------------------------------------------------------------
Background
@@ -287,3 +331,6 @@ Andy Dougherty <doughera@lafayette.edu>
Other minor updates 10 Feb 1999 by
Gurusamy Sarathy
+
+More platforms added 26 Jul 1999 by
+Jarkko Hietaniemi
diff --git a/contrib/perl5/Todo b/contrib/perl5/Todo
index 5867c40..ba01d33 100644
--- a/contrib/perl5/Todo
+++ b/contrib/perl5/Todo
@@ -1,3 +1,11 @@
+Always check out the latest perl5-porters discussions on these subjects
+before embarking on an implementation tour.
+
+Bugs
+ remove recursion in regular expression engine
+ fix memory leaks during compile failures
+ make signal handling safe
+
Tie Modules
VecArray Implement array using vec()
SubstrArray Implement array using substr()
@@ -5,54 +13,80 @@ Tie Modules
ShiftSplice Defines shift et al in terms of splice method
Would be nice to have
- pack "(stuff)*"
- Contiguous bitfields in pack/unpack
+ pack "(stuff)*", "(stuff)?", "(stuff)+", "(stuff)4", ...
+ contiguous bitfields in pack/unpack
lexperl
- Bundled perl preprocessor
- Use posix calls internally where possible
+ bundled perl preprocessor/macro facility
+ this would solve many of the syntactic nice-to-haves
+ use posix calls internally where possible
gettimeofday (possibly best left for a module?)
format BOTTOM
-i rename file only when successfully changed
- All ARGV input should act like <>
+ all ARGV input should act like <>
report HANDLE [formats].
support in perlmain to rerun debugger
regression tests using __DIE__ hook
- reference to compiled regexp
lexically scoped functions: my sub foo { ... }
- lvalue functions
+ the basic concept is easy and sound,
+ the difficulties begin with self-referential
+ and mutually referential lexical subs: how to
+ declare the subs?
+ lexically scoped typeglobs? (lexical I/O handles work now)
+ wantlvalue? more generalized want()/caller()?
+ named prototypes: sub foo ($foo, @bar) { ... } ?
regression/sanity tests for suidperl
- Full 64 bit support (i.e. "long long")
- Generalise Errno way of extracting cpp symbols and use that in
- Errno and Fcntl (ExtUtils::CppSymbol?)
+ iterators/lazy evaluation/continuations/first/
+ first_defined/short-circuiting grep/??
+ This is a very thorny and hotly debated subject,
+ tread carefully and do your homework first
+ generalise Errno way of extracting cpp symbols and use that in
+ Errno, Fcntl, POSIX (ExtUtils::CppSymbol?)
+ the _r-problem: for all the {set,get,end}*() system database
+ calls (and a couple more: readdir, *rand*, crypt, *time,
+ tmpnam) there are in many systems the _r versions
+ to be used in re-entrant (=multithreaded) code
+ Icky things: the _r API is not standardized and
+ the _r-forms require per-thread data to store their state
+ memory profiler: turn malloc.c:Perl_get_mstats() into
+ an extension (Devel::MProf?) that would return the malloc
+ stats in a nice Perl datastructure (also a simple interface
+ to return just the grand total would be good)
+ cross-compilation support
+ host vs target: compile in the host, get the executable to
+ the target, get the possible input files to the target,
+ execute in the target (and do not assume a UNIXish shell
+ in the target! e.g. no command redirection can be assumed),
+ get possible output files back to to host. this needs to work
+ both during Configure and during the build. You cannot assume
+ shared filesystems between the host and the target (you may need
+ e.g. ftp), executing the target executable may involve e.g. rsh
+ a way to make << and >> to shift bitvectors instead of numbers
Possible pragmas
debugger
- optimize (use less memory, CPU)
+ optimize (use less qw[memory cpu])
Optimizations
constant function cache
switch structures
- eval qw() at compile time
foreach(reverse...)
- Set KEEP on constant split
- Cache eval tree (unless lexical outer scope used (mark in &compiling?))
+ cache eval tree (unless lexical outer scope used (mark in &compiling?))
rcatmaybe
- Shrink opcode tables via multiple implementations selected in peep
- Cache hash value? (Not a win, according to Guido)
- Optimize away @_ where possible
+ shrink opcode tables via multiple implementations selected in peep
+ cache hash value? (Not a win, according to Guido)
+ optimize away @_ where possible
+ tail recursion removal
"one pass" global destruction
- Optimize sort by { $a <=> $b }
- Rewrite regexp parser for better integrated optimization
+ rewrite regexp parser for better integrated optimization
LRU cache of regexp: foreach $pat (@pats) { foo() if /$pat/ }
Vague possibilities
- ref function in list context
+ ref function in list context?
make tr/// return histogram in list context?
- Loop control on do{} et al
- Explicit switch statements
+ loop control on do{} et al
+ explicit switch statements
built-in globbing
compile to real threaded code
structured types
autocroak?
- Modifiable $1 et al
-
+ modifiable $1 et al
diff --git a/contrib/perl5/Todo-5.6 b/contrib/perl5/Todo-5.6
new file mode 100644
index 0000000..9abeb55
--- /dev/null
+++ b/contrib/perl5/Todo-5.6
@@ -0,0 +1,156 @@
+Unicode support
+ finish byte <-> utf8 and localencoding <-> utf8 conversions
+ make substr($bytestr,0,0,$charstr) do the right conversion
+ add Unicode::Map equivivalent to core
+ add support for I/O disciplines
+ - a way to specify disciplines when opening things:
+ open(F, "<:crlf :utf16", $file)
+ - a way to specify disciplines for an already opened handle:
+ binmode(STDIN, ":slurp :raw")
+ - a way to set default disciplines for all handle constructors:
+ use open IN => ":any", OUT => ":utf8", SYS => ":utf16"
+ eliminate need for "use utf8;"
+ autoload byte.pm when byte:: is seen by the parser
+ check uv_to_utf8() calls for buffer overflow
+ (see also "Locales", "Regexen", and "Miscellaneous")
+
+Multi-threading
+ support "use Thread;" under useithreads
+ add mechanism to:
+ - create new interpreter in a different thread
+ - exchange data between interpreters/threads
+ - share namespaces between interpreters/threads
+ work out consistent semantics for exit/die in threads
+ support for externally created threads?
+ Thread::Pool?
+
+Compiler
+ auto-produce executable
+ typed lexicals should affect B::CC::load_pad
+ workarounds to help Win32
+ END blocks need saving in compiled output
+ _AUTOLOAD prodding
+ fix comppadlist (names in comppad_name can have fake SvCUR
+ from where newASSIGNOP steals the field)
+
+Namespace cleanup
+ CPP-space: restrict what we export from headers when !PERL_CORE
+ header-space: move into CORE/perl/?
+ API-space: complete the list of things that constitute public api
+
+Configure
+ fix the vicious cyclic multidependency of cc <-> libpth <-> loclibpth
+ libswanted <-> usethreads <-> use64bitint <-> use64bitall <->
+ uselargefiles <-> ...
+ make configuring+building away from source directory work (VPATH et al)
+ this is related to: cross-compilation configuring (see Todo)
+ _r support (see Todo for mode detailed description)
+ POSIX 1003.1 1996 Edition support--realtime stuff:
+ POSIX semaphores, message queues, shared memory, realtime clocks,
+ timers, signals (the metaconfig units mostly already exist for these)
+ UNIX98 support: reader-writer locks, realtime/asynchronous IO
+ IPv6 support: see RFC2292, RFC2553
+
+Long doubles
+ figure out where the PV->NV->PV conversion gets it wrong at least
+ in AIX and Tru64 (V5.0 and onwards) when using long doubles: see the
+ regexp tricks we had to insert to t/comp/use.t and t/lib/bigfltpm.t,
+ (?:9|8999\d+) and the like.
+
+64-bit support
+ Configure probe for quad_t, uquad_t, and (argh) u_quad_t, they might
+ be in some systems the only thing working as quadtype and uquadtype.
+
+Locales
+ deprecate traditional/legacy locales?
+ How do locales work across packages?
+ figure out how to support Unicode locales
+ suggestion: integrate the IBM Classes for Unicode (ICU)
+ http://oss.software.ibm.com/developerworks/opensource/icu/project/
+ and check out also the Locale Converter:
+ http://alphaworks.ibm.com/tech/localeconverter
+ ICU is "portable, open-source Unicode library with:
+ charset-independent locales (with multiple locales simultaneously
+ supported in same thread; character conversions; formatting/parsing
+ for numbers, currencies, date/time and messages; message catalogs
+ (resources) ; transliteration, collation, normalization, and text
+ boundaries (grapheme, word, line-break))".
+ There is also 'iconv', either from XPG4 or GNU (glibc).
+ iconv is about character set conversions.
+ Either ICU or iconv would be valuable to get integrated
+ into Perl, Configure already probes for libiconv and <iconv.h>.
+
+Regexen
+ make RE engine thread-safe
+ a way to do full character set arithmetics: now one can do
+ addition, negate a whole class, and negate certain subclasses
+ (e.g. \D, [:^digit:]), but a more generic way to add/subtract/
+ intersect characters/classes, like described in the Unicode technical
+ report on Regular Expression Guidelines,
+ http://www.unicode.org/unicode/reports/tr18/
+ (amusingly, the TR notes that difference and intersection
+ can be done using "Perl-style look-ahead")
+ difference syntax? maybe [[:alpha:][^abc]] meaning
+ "all alphabetic expect a, b, and c"? or [[:alpha:]-[abc]]?
+ (maybe bad, as we explicitly disallow such 'ranges')
+ intersection syntax? maybe [[..]&[...]]?
+ POSIX [=bar=] and [.zap.] would nice too but there's no API for them
+ =bar= could be done with Unicode, though, see the Unicode TR #15 about
+ normalization forms:
+ http://www.unicode.org/unicode/reports/tr15/
+ this is also a part of the Unicode 3.0:
+ http://www.unicode.org/unicode/uni2book/u2.html
+ executive summary: there are several different levels of 'equivalence'
+ approximate matching
+
+Security
+ use fchown, fchmod (and futimes?) internally when possible
+ use fchdir(how portable?)
+ create secure reliable portable temporary file modules
+ audit the standard utilities for security problems and fix them
+
+Reliable Signals
+ custom opcodes
+ alternate runops() for signal despatch
+ figure out how to die() in delayed sighandler
+ make Thread::Signal work under useithreads
+
+Win32 stuff
+ sort out the spawnvp() mess for system('a','b','c') compatibility
+ work out DLL versioning
+
+Miscellaneous
+ add new modules (Archive::Tar, Compress::Zlib, CPAN::FTP?)
+ sub-second sleep()? alarm()? time()? (integrate Time::HiRes?
+ Configure doesn't yet probe for usleep/nanosleep/ualarm but
+ the units exist)
+ floating point handling: nans, infinities, fp exception masks, etc.
+ at least the following interfaces exist: fp_classify(), fp_class(),
+ class(), isnan(), isinf(), isfinite(), finite(), isnormal(),
+ ordered(), fp_setmask(), fp_getmask(), fp_setround(), fp_getround(),
+ ieeefp.h, fp_class.h. There are metaconfig units for most of these.
+ Search for ifdef __osf__ in pp.c to find a temporary fix that
+ needs to be done right.
+ fix the basic arithmetics (+ - * / %) to preserve IVness/UVness if
+ both arguments are IVs/UVs
+ replace pod2html with new PodtoHtml? (requires other modules from CPAN)
+ automate testing with large parts of CPAN
+ Unicode collation? http://www.unicode.org/unicode/reports/tr10/
+ turn Cwd into an XS module? (Configure already probes for getcwd())
+ mmap for speeding up input? (Configure already probes for the mmap family)
+ sendmsg, recvmsg? (Configure doesn't probe for these but the units exist)
+ setitimer, getitimer? (the metaconfig units exist)
+
+Ongoing
+ keep filenames 8.3 friendly, where feasible
+ upgrade to newer versions of all independently maintained modules
+ comprehensive perldelta.pod
+
+Documentation
+ describe new age patterns
+ update perl{guts,call,embed,xs} with additions, changes to API
+ convert more examples to use autovivified filehandles
+ document Win32 choices
+ spot-check all new modules for completeness
+ better docs for pack()/unpack()
+ reorg tutorials vs. reference sections
diff --git a/contrib/perl5/XSUB.h b/contrib/perl5/XSUB.h
index a6577d8..cfcad5d 100644
--- a/contrib/perl5/XSUB.h
+++ b/contrib/perl5/XSUB.h
@@ -1,13 +1,56 @@
+#ifndef _INC_PERL_XSUB_H
+#define _INC_PERL_XSUB_H 1
+
+/* first, some documentation for xsubpp-generated items */
+
+/*
+=for apidoc Amn|char*|CLASS
+Variable which is setup by C<xsubpp> to indicate the
+class name for a C++ XS constructor. This is always a C<char*>. See C<THIS>.
+
+=for apidoc Amn|(whatever)|RETVAL
+Variable which is setup by C<xsubpp> to hold the return value for an
+XSUB. This is always the proper type for the XSUB. See
+L<perlxs/"The RETVAL Variable">.
+
+=for apidoc Amn|(whatever)|THIS
+Variable which is setup by C<xsubpp> to designate the object in a C++
+XSUB. This is always the proper type for the C++ object. See C<CLASS> and
+L<perlxs/"Using XS With C++">.
+
+=for apidoc Amn|I32|items
+Variable which is setup by C<xsubpp> to indicate the number of
+items on the stack. See L<perlxs/"Variable-length Parameter Lists">.
+
+=for apidoc Amn|I32|ix
+Variable which is setup by C<xsubpp> to indicate which of an
+XSUB's aliases was used to invoke it. See L<perlxs/"The ALIAS: Keyword">.
+
+=for apidoc Am|SV*|ST|int ix
+Used to access elements on the XSUB's stack.
+
+=for apidoc AmU||XS
+Macro to declare an XSUB and its C parameter list. This is handled by
+C<xsubpp>.
+
+=for apidoc Ams||dXSARGS
+Sets up stack and mark pointers for an XSUB, calling dSP and dMARK. This
+is usually handled automatically by C<xsubpp>. Declares the C<items>
+variable to indicate the number of items on the stack.
+
+=for apidoc Ams||dXSI32
+Sets up the C<ix> variable for an XSUB which has aliases. This is usually
+handled automatically by C<xsubpp>.
+
+=cut
+*/
+
#define ST(off) PL_stack_base[ax + (off)]
-#ifdef CAN_PROTOTYPE
-#ifdef PERL_OBJECT
-#define XS(name) void name(CV* cv, CPerlObj* pPerl)
+#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
+# define XS(name) __declspec(dllexport) void name(pTHXo_ CV* cv)
#else
-#define XS(name) void name(CV* cv)
-#endif
-#else
-#define XS(name) void name(cv) CV* cv;
+# define XS(name) void name(pTHXo_ CV* cv)
#endif
#define dXSARGS \
@@ -15,6 +58,12 @@
I32 ax = mark - PL_stack_base + 1; \
I32 items = sp - mark
+#define dXSTARG SV * targ = ((PL_op->op_private & OPpENTERSUB_HASTARG) \
+ ? PAD_SV(PL_op->op_targ) : sv_newmortal())
+
+/* Should be used before final PUSHi etc. if not in PPCODE section. */
+#define XSprePUSH (sp = PL_stack_base + ax - 1)
+
#define XSANY CvXSUBANY(cv)
#define dXSI32 I32 ix = XSANY.any_i32
@@ -25,28 +74,97 @@
# define XSINTERFACE_CVT(ret,name) ret (*name)()
#endif
#define dXSFUNCTION(ret) XSINTERFACE_CVT(ret,XSFUNCTION)
-#define XSINTERFACE_FUNC(ret,cv,f) ((XSINTERFACE_CVT(ret,))(f))
+#define XSINTERFACE_FUNC(ret,cv,f) ((XSINTERFACE_CVT(ret,cv))(f))
#define XSINTERFACE_FUNC_SET(cv,f) \
- CvXSUBANY(cv).any_dptr = (void (*) _((void*)))(f)
-
-#define XSRETURN(off) \
- STMT_START { \
- PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
- return; \
- } STMT_END
+ CvXSUBANY(cv).any_dptr = (void (*) (pTHXo_ void*))(f)
/* Simple macros to put new mortal values onto the stack. */
/* Typically used to return values from XS functions. */
+
+/*
+=for apidoc Am|void|XST_mIV|int pos|IV iv
+Place an integer into the specified position C<pos> on the stack. The
+value is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mNV|int pos|NV nv
+Place a double into the specified position C<pos> on the stack. The value
+is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mPV|int pos|char* str
+Place a copy of a string into the specified position C<pos> on the stack.
+The value is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mNO|int pos
+Place C<&PL_sv_no> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XST_mYES|int pos
+Place C<&PL_sv_yes> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XST_mUNDEF|int pos
+Place C<&PL_sv_undef> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XSRETURN|int nitems
+Return from XSUB, indicating number of items on the stack. This is usually
+handled by C<xsubpp>.
+
+=for apidoc Am|void|XSRETURN_IV|IV iv
+Return an integer from an XSUB immediately. Uses C<XST_mIV>.
+
+=for apidoc Am|void|XSRETURN_NV|NV nv
+Return an double from an XSUB immediately. Uses C<XST_mNV>.
+
+=for apidoc Am|void|XSRETURN_PV|char* str
+Return a copy of a string from an XSUB immediately. Uses C<XST_mPV>.
+
+=for apidoc Ams||XSRETURN_NO
+Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
+
+=for apidoc Ams||XSRETURN_YES
+Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
+
+=for apidoc Ams||XSRETURN_UNDEF
+Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
+
+=for apidoc Ams||XSRETURN_EMPTY
+Return an empty list from an XSUB immediately.
+
+=for apidoc AmU||newXSproto
+Used by C<xsubpp> to hook up XSUBs as Perl subs. Adds Perl prototypes to
+the subs.
+
+=for apidoc AmU||XS_VERSION
+The version identifier for an XS module. This is usually
+handled automatically by C<ExtUtils::MakeMaker>. See C<XS_VERSION_BOOTCHECK>.
+
+=for apidoc Ams||XS_VERSION_BOOTCHECK
+Macro to verify that a PM module's $VERSION variable matches the XS
+module's C<XS_VERSION> variable. This is usually handled automatically by
+C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
+
+=cut
+*/
+
#define XST_mIV(i,v) (ST(i) = sv_2mortal(newSViv(v)) )
#define XST_mNV(i,v) (ST(i) = sv_2mortal(newSVnv(v)) )
#define XST_mPV(i,v) (ST(i) = sv_2mortal(newSVpv(v,0)))
+#define XST_mPVN(i,v,n) (ST(i) = sv_2mortal(newSVpvn(v,n)))
#define XST_mNO(i) (ST(i) = &PL_sv_no )
#define XST_mYES(i) (ST(i) = &PL_sv_yes )
#define XST_mUNDEF(i) (ST(i) = &PL_sv_undef)
-
+
+#define XSRETURN(off) \
+ STMT_START { \
+ PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+ return; \
+ } STMT_END
+
#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v); XSRETURN(1); } STMT_END
#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v); XSRETURN(1); } STMT_END
#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v); XSRETURN(1); } STMT_END
+#define XSRETURN_PVN(v,n) STMT_START { XST_mPVN(0,v,n); XSRETURN(1); } STMT_END
#define XSRETURN_NO STMT_START { XST_mNO(0); XSRETURN(1); } STMT_END
#define XSRETURN_YES STMT_START { XST_mYES(0); XSRETURN(1); } STMT_END
#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END
@@ -55,7 +173,7 @@
#define newXSproto(a,b,c,d) sv_setpv((SV*)newXS(a,b,c), d)
#ifdef XS_VERSION
-# define XS_VERSION_BOOTCHECK \
+# define XS_VERSION_BOOTCHECK \
STMT_START { \
SV *tmpsv; STRLEN n_a; \
char *vn = Nullch, *module = SvPV(ST(0),n_a); \
@@ -63,95 +181,220 @@
tmpsv = ST(1); \
else { \
/* XXX GV_ADDWARN */ \
- tmpsv = perl_get_sv(form("%s::%s", module, \
- vn = "XS_VERSION"), FALSE); \
+ tmpsv = get_sv(Perl_form(aTHX_ "%s::%s", module, \
+ vn = "XS_VERSION"), FALSE); \
if (!tmpsv || !SvOK(tmpsv)) \
- tmpsv = perl_get_sv(form("%s::%s", module, \
- vn = "VERSION"), FALSE); \
+ tmpsv = get_sv(Perl_form(aTHX_ "%s::%s", module, \
+ vn = "VERSION"), FALSE); \
} \
if (tmpsv && (!SvOK(tmpsv) || strNE(XS_VERSION, SvPV(tmpsv, n_a)))) \
- croak("%s object version %s does not match %s%s%s%s %_", \
+ Perl_croak(aTHX_ "%s object version %s does not match %s%s%s%s %"SVf,\
module, XS_VERSION, \
vn ? "$" : "", vn ? module : "", vn ? "::" : "", \
vn ? vn : "bootstrap parameter", tmpsv); \
} STMT_END
#else
-# define XS_VERSION_BOOTCHECK
+# define XS_VERSION_BOOTCHECK
#endif
-#ifdef PERL_CAPI
-# define VTBL_sv get_vtbl(want_vtbl_sv)
-# define VTBL_env get_vtbl(want_vtbl_env)
-# define VTBL_envelem get_vtbl(want_vtbl_envelem)
-# define VTBL_sig get_vtbl(want_vtbl_sig)
-# define VTBL_sigelem get_vtbl(want_vtbl_sigelem)
-# define VTBL_pack get_vtbl(want_vtbl_pack)
-# define VTBL_packelem get_vtbl(want_vtbl_packelem)
-# define VTBL_dbline get_vtbl(want_vtbl_dbline)
-# define VTBL_isa get_vtbl(want_vtbl_isa)
-# define VTBL_isaelem get_vtbl(want_vtbl_isaelem)
-# define VTBL_arylen get_vtbl(want_vtbl_arylen)
-# define VTBL_glob get_vtbl(want_vtbl_glob)
-# define VTBL_mglob get_vtbl(want_vtbl_mglob)
-# define VTBL_nkeys get_vtbl(want_vtbl_nkeys)
-# define VTBL_taint get_vtbl(want_vtbl_taint)
-# define VTBL_substr get_vtbl(want_vtbl_substr)
-# define VTBL_vec get_vtbl(want_vtbl_vec)
-# define VTBL_pos get_vtbl(want_vtbl_pos)
-# define VTBL_bm get_vtbl(want_vtbl_bm)
-# define VTBL_fm get_vtbl(want_vtbl_fm)
-# define VTBL_uvar get_vtbl(want_vtbl_uvar)
-# define VTBL_defelem get_vtbl(want_vtbl_defelem)
-# define VTBL_regexp get_vtbl(want_vtbl_regexp)
-# ifdef USE_LOCALE_COLLATE
-# define VTBL_collxfrm get_vtbl(want_vtbl_collxfrm)
-# endif
-# ifdef OVERLOAD
-# define VTBL_amagic get_vtbl(want_vtbl_amagic)
-# define VTBL_amagicelem get_vtbl(want_vtbl_amagicelem)
-# endif
-#else
-# define VTBL_sv &vtbl_sv
-# define VTBL_env &vtbl_env
-# define VTBL_envelem &vtbl_envelem
-# define VTBL_sig &vtbl_sig
-# define VTBL_sigelem &vtbl_sigelem
-# define VTBL_pack &vtbl_pack
-# define VTBL_packelem &vtbl_packelem
-# define VTBL_dbline &vtbl_dbline
-# define VTBL_isa &vtbl_isa
-# define VTBL_isaelem &vtbl_isaelem
-# define VTBL_arylen &vtbl_arylen
-# define VTBL_glob &vtbl_glob
-# define VTBL_mglob &vtbl_mglob
-# define VTBL_nkeys &vtbl_nkeys
-# define VTBL_taint &vtbl_taint
-# define VTBL_substr &vtbl_substr
-# define VTBL_vec &vtbl_vec
-# define VTBL_pos &vtbl_pos
-# define VTBL_bm &vtbl_bm
-# define VTBL_fm &vtbl_fm
-# define VTBL_uvar &vtbl_uvar
-# define VTBL_defelem &vtbl_defelem
-# define VTBL_regexp &vtbl_regexp
+#if 1 /* for compatibility */
+# define VTBL_sv &PL_vtbl_sv
+# define VTBL_env &PL_vtbl_env
+# define VTBL_envelem &PL_vtbl_envelem
+# define VTBL_sig &PL_vtbl_sig
+# define VTBL_sigelem &PL_vtbl_sigelem
+# define VTBL_pack &PL_vtbl_pack
+# define VTBL_packelem &PL_vtbl_packelem
+# define VTBL_dbline &PL_vtbl_dbline
+# define VTBL_isa &PL_vtbl_isa
+# define VTBL_isaelem &PL_vtbl_isaelem
+# define VTBL_arylen &PL_vtbl_arylen
+# define VTBL_glob &PL_vtbl_glob
+# define VTBL_mglob &PL_vtbl_mglob
+# define VTBL_nkeys &PL_vtbl_nkeys
+# define VTBL_taint &PL_vtbl_taint
+# define VTBL_substr &PL_vtbl_substr
+# define VTBL_vec &PL_vtbl_vec
+# define VTBL_pos &PL_vtbl_pos
+# define VTBL_bm &PL_vtbl_bm
+# define VTBL_fm &PL_vtbl_fm
+# define VTBL_uvar &PL_vtbl_uvar
+# define VTBL_defelem &PL_vtbl_defelem
+# define VTBL_regexp &PL_vtbl_regexp
+# define VTBL_regdata &PL_vtbl_regdata
+# define VTBL_regdatum &PL_vtbl_regdatum
# ifdef USE_LOCALE_COLLATE
-# define VTBL_collxfrm &vtbl_collxfrm
-# endif
-# ifdef OVERLOAD
-# define VTBL_amagic &vtbl_amagic
-# define VTBL_amagicelem &vtbl_amagicelem
+# define VTBL_collxfrm &PL_vtbl_collxfrm
# endif
+# define VTBL_amagic &PL_vtbl_amagic
+# define VTBL_amagicelem &PL_vtbl_amagicelem
#endif
-#ifdef PERL_OBJECT
+#include "perlapi.h"
#include "objXSUB.h"
-#ifndef NO_XSLOCKS
-#ifdef WIN32
-#include "XSlock.h"
-#endif /* WIN32 */
-#endif /* NO_XSLOCKS */
-#else
-#ifdef PERL_CAPI
-#include "perlCAPI.h"
+
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_GET_CONTEXT) && !defined(PERL_CORE)
+# undef aTHX
+# undef aTHX_
+# define aTHX PERL_GET_THX
+# define aTHX_ aTHX,
#endif
-#endif /* PERL_OBJECT */
+
+#if (defined(PERL_CAPI) || defined(PERL_IMPLICIT_SYS)) && !defined(PERL_CORE)
+# ifndef NO_XSLOCKS
+# undef closedir
+# undef opendir
+# undef stdin
+# undef stdout
+# undef stderr
+# undef feof
+# undef ferror
+# undef fgetpos
+# undef ioctl
+# undef getlogin
+# undef setjmp
+# undef getc
+# undef ungetc
+# undef fileno
+
+# define mkdir PerlDir_mkdir
+# define chdir PerlDir_chdir
+# define rmdir PerlDir_rmdir
+# define closedir PerlDir_close
+# define opendir PerlDir_open
+# define readdir PerlDir_read
+# define rewinddir PerlDir_rewind
+# define seekdir PerlDir_seek
+# define telldir PerlDir_tell
+# define putenv PerlEnv_putenv
+# define getenv PerlEnv_getenv
+# define uname PerlEnv_uname
+# define stdin PerlIO_stdin()
+# define stdout PerlIO_stdout()
+# define stderr PerlIO_stderr()
+# define fopen PerlIO_open
+# define fclose PerlIO_close
+# define feof PerlIO_eof
+# define ferror PerlIO_error
+# define fclearerr PerlIO_clearerr
+# define getc PerlIO_getc
+# define fputc(c, f) PerlIO_putc(f,c)
+# define fputs(s, f) PerlIO_puts(f,s)
+# define fflush PerlIO_flush
+# define ungetc(c, f) PerlIO_ungetc((f),(c))
+# define fileno PerlIO_fileno
+# define fdopen PerlIO_fdopen
+# define freopen PerlIO_reopen
+# define fread(b,s,c,f) PerlIO_read((f),(b),(s*c))
+# define fwrite(b,s,c,f) PerlIO_write((f),(b),(s*c))
+# define setbuf PerlIO_setbuf
+# define setvbuf PerlIO_setvbuf
+# define setlinebuf PerlIO_setlinebuf
+# define stdoutf PerlIO_stdoutf
+# define vfprintf PerlIO_vprintf
+# define ftell PerlIO_tell
+# define fseek PerlIO_seek
+# define fgetpos PerlIO_getpos
+# define fsetpos PerlIO_setpos
+# define frewind PerlIO_rewind
+# define tmpfile PerlIO_tmpfile
+# define access PerlLIO_access
+# define chmod PerlLIO_chmod
+# define chsize PerlLIO_chsize
+# define close PerlLIO_close
+# define dup PerlLIO_dup
+# define dup2 PerlLIO_dup2
+# define flock PerlLIO_flock
+# define fstat PerlLIO_fstat
+# define ioctl PerlLIO_ioctl
+# define isatty PerlLIO_isatty
+# define link PerlLIO_link
+# define lseek PerlLIO_lseek
+# define lstat PerlLIO_lstat
+# define mktemp PerlLIO_mktemp
+# define open PerlLIO_open
+# define read PerlLIO_read
+# define rename PerlLIO_rename
+# define setmode PerlLIO_setmode
+# define stat(buf,sb) PerlLIO_stat(buf,sb)
+# define tmpnam PerlLIO_tmpnam
+# define umask PerlLIO_umask
+# define unlink PerlLIO_unlink
+# define utime PerlLIO_utime
+# define write PerlLIO_write
+# define malloc PerlMem_malloc
+# define realloc PerlMem_realloc
+# define free PerlMem_free
+# define abort PerlProc_abort
+# define exit PerlProc_exit
+# define _exit PerlProc__exit
+# define execl PerlProc_execl
+# define execv PerlProc_execv
+# define execvp PerlProc_execvp
+# define getuid PerlProc_getuid
+# define geteuid PerlProc_geteuid
+# define getgid PerlProc_getgid
+# define getegid PerlProc_getegid
+# define getlogin PerlProc_getlogin
+# define kill PerlProc_kill
+# define killpg PerlProc_killpg
+# define pause PerlProc_pause
+# define popen PerlProc_popen
+# define pclose PerlProc_pclose
+# define pipe PerlProc_pipe
+# define setuid PerlProc_setuid
+# define setgid PerlProc_setgid
+# define sleep PerlProc_sleep
+# define times PerlProc_times
+# define wait PerlProc_wait
+# define setjmp PerlProc_setjmp
+# define longjmp PerlProc_longjmp
+# define signal PerlProc_signal
+# define getpid PerlProc_getpid
+# define htonl PerlSock_htonl
+# define htons PerlSock_htons
+# define ntohl PerlSock_ntohl
+# define ntohs PerlSock_ntohs
+# define accept PerlSock_accept
+# define bind PerlSock_bind
+# define connect PerlSock_connect
+# define endhostent PerlSock_endhostent
+# define endnetent PerlSock_endnetent
+# define endprotoent PerlSock_endprotoent
+# define endservent PerlSock_endservent
+# define gethostbyaddr PerlSock_gethostbyaddr
+# define gethostbyname PerlSock_gethostbyname
+# define gethostent PerlSock_gethostent
+# define gethostname PerlSock_gethostname
+# define getnetbyaddr PerlSock_getnetbyaddr
+# define getnetbyname PerlSock_getnetbyname
+# define getnetent PerlSock_getnetent
+# define getpeername PerlSock_getpeername
+# define getprotobyname PerlSock_getprotobyname
+# define getprotobynumber PerlSock_getprotobynumber
+# define getprotoent PerlSock_getprotoent
+# define getservbyname PerlSock_getservbyname
+# define getservbyport PerlSock_getservbyport
+# define getservent PerlSock_getservent
+# define getsockname PerlSock_getsockname
+# define getsockopt PerlSock_getsockopt
+# define inet_addr PerlSock_inet_addr
+# define inet_ntoa PerlSock_inet_ntoa
+# define listen PerlSock_listen
+# define recv PerlSock_recv
+# define recvfrom PerlSock_recvfrom
+# define select PerlSock_select
+# define send PerlSock_send
+# define sendto PerlSock_sendto
+# define sethostent PerlSock_sethostent
+# define setnetent PerlSock_setnetent
+# define setprotoent PerlSock_setprotoent
+# define setservent PerlSock_setservent
+# define setsockopt PerlSock_setsockopt
+# define shutdown PerlSock_shutdown
+# define socket PerlSock_socket
+# define socketpair PerlSock_socketpair
+# endif /* NO_XSLOCKS */
+#endif /* PERL_CAPI */
+
+#endif /* _INC_PERL_XSUB_H */ /* include guard */
diff --git a/contrib/perl5/av.c b/contrib/perl5/av.c
index 7652757..819887e 100644
--- a/contrib/perl5/av.c
+++ b/contrib/perl5/av.c
@@ -1,6 +1,6 @@
/* av.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -13,10 +13,11 @@
*/
#include "EXTERN.h"
+#define PERL_IN_AV_C
#include "perl.h"
void
-av_reify(AV *av)
+Perl_av_reify(pTHX_ AV *av)
{
I32 key;
SV* sv;
@@ -24,8 +25,8 @@ av_reify(AV *av)
if (AvREAL(av))
return;
#ifdef DEBUGGING
- if (SvTIED_mg((SV*)av, 'P'))
- warn("av_reify called on tied array");
+ if (SvTIED_mg((SV*)av, 'P') && ckWARN_d(WARN_DEBUGGING))
+ Perl_warner(aTHX_ WARN_DEBUGGING, "av_reify called on tied array");
#endif
key = AvMAX(av) + 1;
while (key > AvFILLp(av) + 1)
@@ -45,12 +46,21 @@ av_reify(AV *av)
AvREAL_on(av);
}
+/*
+=for apidoc av_extend
+
+Pre-extend an array. The C<key> is the index to which the array should be
+extended.
+
+=cut
+*/
+
void
-av_extend(AV *av, I32 key)
+Perl_av_extend(pTHX_ AV *av, I32 key)
{
dTHR; /* only necessary if we have to extend stack */
MAGIC *mg;
- if (mg = SvTIED_mg((SV*)av, 'P')) {
+ if ((mg = SvTIED_mg((SV*)av, 'P'))) {
dSP;
ENTER;
SAVETMPS;
@@ -60,7 +70,7 @@ av_extend(AV *av, I32 key)
PUSHs(SvTIED_obj((SV*)av, mg));
PUSHs(sv_2mortal(newSViv(key+1)));
PUTBACK;
- perl_call_method("EXTEND", G_SCALAR|G_DISCARD);
+ call_method("EXTEND", G_SCALAR|G_DISCARD);
POPSTACK;
FREETMPS;
LEAVE;
@@ -90,10 +100,11 @@ av_extend(AV *av, I32 key)
else {
if (AvALLOC(av)) {
#ifndef STRANGE_MALLOC
- U32 bytes;
+ MEM_SIZE bytes;
+ IV itmp;
#endif
-#if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
+#if defined(MYMALLOC) && !defined(LEAKTEST)
newmax = malloced_size((void*)AvALLOC(av))/sizeof(SV*) - 1;
if (key <= newmax)
@@ -106,13 +117,14 @@ av_extend(AV *av, I32 key)
#else
bytes = (newmax + 1) * sizeof(SV*);
#define MALLOC_OVERHEAD 16
- tmp = MALLOC_OVERHEAD;
- while (tmp - MALLOC_OVERHEAD < bytes)
- tmp += tmp;
- tmp -= MALLOC_OVERHEAD;
- tmp /= sizeof(SV*);
- assert(tmp > newmax);
- newmax = tmp - 1;
+ itmp = MALLOC_OVERHEAD;
+ while (itmp - MALLOC_OVERHEAD < bytes)
+ itmp += itmp;
+ itmp -= MALLOC_OVERHEAD;
+ itmp /= sizeof(SV*);
+ assert(itmp > newmax);
+ newmax = itmp - 1;
+ assert(newmax >= AvMAX(av));
New(2,ary, newmax+1, SV*);
Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
if (AvMAX(av) > 64)
@@ -148,8 +160,21 @@ av_extend(AV *av, I32 key)
}
}
+/*
+=for apidoc av_fetch
+
+Returns the SV at the specified index in the array. The C<key> is the
+index. If C<lval> is set then the fetch will be part of a store. Check
+that the return value is non-null before dereferencing it to a C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays.
+
+=cut
+*/
+
SV**
-av_fetch(register AV *av, I32 key, I32 lval)
+Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
{
SV *sv;
@@ -163,7 +188,7 @@ av_fetch(register AV *av, I32 key, I32 lval)
}
if (SvRMAGICAL(av)) {
- if (mg_find((SV*)av,'P')) {
+ if (mg_find((SV*)av,'P') || mg_find((SV*)av,'D')) {
dTHR;
sv = sv_newmortal();
mg_copy((SV*)av, sv, 0, key);
@@ -195,12 +220,27 @@ av_fetch(register AV *av, I32 key, I32 lval)
return &AvARRAY(av)[key];
}
+/*
+=for apidoc av_store
+
+Stores an SV in an array. The array index is specified as C<key>. The
+return value will be NULL if the operation failed or if the value did not
+need to be actually stored within the array (as in the case of tied
+arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
+that the caller is responsible for suitably incrementing the reference
+count of C<val> before the call, and decrementing it if the function
+returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays.
+
+=cut
+*/
+
SV**
-av_store(register AV *av, I32 key, SV *val)
+Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
{
SV** ary;
- U32 fill;
-
if (!av)
return 0;
@@ -214,7 +254,7 @@ av_store(register AV *av, I32 key, SV *val)
}
if (SvREADONLY(av) && key >= AvFILL(av))
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
if (SvRMAGICAL(av)) {
if (mg_find((SV*)av,'P')) {
@@ -254,8 +294,16 @@ av_store(register AV *av, I32 key, SV *val)
return &ary[key];
}
+/*
+=for apidoc newAV
+
+Creates a new AV. The reference count is set to 1.
+
+=cut
+*/
+
AV *
-newAV(void)
+Perl_newAV(pTHX)
{
register AV *av;
@@ -268,8 +316,18 @@ newAV(void)
return av;
}
+/*
+=for apidoc av_make
+
+Creates a new AV and populates it with a list of SVs. The SVs are copied
+into the array, so they may be freed after the call to av_make. The new AV
+will have a reference count of 1.
+
+=cut
+*/
+
AV *
-av_make(register I32 size, register SV **strp)
+Perl_av_make(pTHX_ register I32 size, register SV **strp)
{
register AV *av;
register I32 i;
@@ -295,7 +353,7 @@ av_make(register I32 size, register SV **strp)
}
AV *
-av_fake(register I32 size, register SV **strp)
+Perl_av_fake(pTHX_ register I32 size, register SV **strp)
{
register AV *av;
register SV** ary;
@@ -317,15 +375,24 @@ av_fake(register I32 size, register SV **strp)
return av;
}
+/*
+=for apidoc av_clear
+
+Clears an array, making it empty. Does not free the memory used by the
+array itself.
+
+=cut
+*/
+
void
-av_clear(register AV *av)
+Perl_av_clear(pTHX_ register AV *av)
{
register I32 key;
SV** ary;
#ifdef DEBUGGING
- if (SvREFCNT(av) <= 0) {
- warn("Attempt to clear deleted array");
+ if (SvREFCNT(av) == 0 && ckWARN_d(WARN_DEBUGGING)) {
+ Perl_warner(aTHX_ WARN_DEBUGGING, "Attempt to clear deleted array");
}
#endif
if (!av)
@@ -333,7 +400,7 @@ av_clear(register AV *av)
/*SUPPRESS 560*/
if (SvREADONLY(av))
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
/* Give any tie a chance to cleanup first */
if (SvRMAGICAL(av))
@@ -350,7 +417,7 @@ av_clear(register AV *av)
ary[key] = &PL_sv_undef;
}
}
- if (key = AvARRAY(av) - AvALLOC(av)) {
+ if ((key = AvARRAY(av) - AvALLOC(av))) {
AvMAX(av) += key;
SvPVX(av) = (char*)AvALLOC(av);
}
@@ -358,8 +425,16 @@ av_clear(register AV *av)
}
+/*
+=for apidoc av_undef
+
+Undefines the array. Frees the memory used by the array itself.
+
+=cut
+*/
+
void
-av_undef(register AV *av)
+Perl_av_undef(pTHX_ register AV *av)
{
register I32 key;
@@ -386,16 +461,25 @@ av_undef(register AV *av)
}
}
+/*
+=for apidoc av_push
+
+Pushes an SV onto the end of the array. The array will grow automatically
+to accommodate the addition.
+
+=cut
+*/
+
void
-av_push(register AV *av, SV *val)
+Perl_av_push(pTHX_ register AV *av, SV *val)
{
MAGIC *mg;
if (!av)
return;
if (SvREADONLY(av))
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
- if (mg = SvTIED_mg((SV*)av, 'P')) {
+ if ((mg = SvTIED_mg((SV*)av, 'P'))) {
dSP;
PUSHSTACKi(PERLSI_MAGIC);
PUSHMARK(SP);
@@ -404,7 +488,7 @@ av_push(register AV *av, SV *val)
PUSHs(val);
PUTBACK;
ENTER;
- perl_call_method("PUSH", G_SCALAR|G_DISCARD);
+ call_method("PUSH", G_SCALAR|G_DISCARD);
LEAVE;
POPSTACK;
return;
@@ -412,8 +496,17 @@ av_push(register AV *av, SV *val)
av_store(av,AvFILLp(av)+1,val);
}
+/*
+=for apidoc av_pop
+
+Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
+is empty.
+
+=cut
+*/
+
SV *
-av_pop(register AV *av)
+Perl_av_pop(pTHX_ register AV *av)
{
SV *retval;
MAGIC* mg;
@@ -421,15 +514,15 @@ av_pop(register AV *av)
if (!av || AvFILL(av) < 0)
return &PL_sv_undef;
if (SvREADONLY(av))
- croak(no_modify);
- if (mg = SvTIED_mg((SV*)av, 'P')) {
+ Perl_croak(aTHX_ PL_no_modify);
+ if ((mg = SvTIED_mg((SV*)av, 'P'))) {
dSP;
PUSHSTACKi(PERLSI_MAGIC);
PUSHMARK(SP);
XPUSHs(SvTIED_obj((SV*)av, mg));
PUTBACK;
ENTER;
- if (perl_call_method("POP", G_SCALAR)) {
+ if (call_method("POP", G_SCALAR)) {
retval = newSVsv(*PL_stack_sp--);
} else {
retval = &PL_sv_undef;
@@ -445,8 +538,18 @@ av_pop(register AV *av)
return retval;
}
+/*
+=for apidoc av_unshift
+
+Unshift the given number of C<undef> values onto the beginning of the
+array. The array will grow automatically to accommodate the addition. You
+must then use C<av_store> to assign values to these new elements.
+
+=cut
+*/
+
void
-av_unshift(register AV *av, register I32 num)
+Perl_av_unshift(pTHX_ register AV *av, register I32 num)
{
register I32 i;
register SV **ary;
@@ -455,9 +558,9 @@ av_unshift(register AV *av, register I32 num)
if (!av || num <= 0)
return;
if (SvREADONLY(av))
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
- if (mg = SvTIED_mg((SV*)av, 'P')) {
+ if ((mg = SvTIED_mg((SV*)av, 'P'))) {
dSP;
PUSHSTACKi(PERLSI_MAGIC);
PUSHMARK(SP);
@@ -468,7 +571,7 @@ av_unshift(register AV *av, register I32 num)
}
PUTBACK;
ENTER;
- perl_call_method("UNSHIFT", G_SCALAR|G_DISCARD);
+ call_method("UNSHIFT", G_SCALAR|G_DISCARD);
LEAVE;
POPSTACK;
return;
@@ -498,8 +601,16 @@ av_unshift(register AV *av, register I32 num)
}
}
+/*
+=for apidoc av_shift
+
+Shifts an SV off the beginning of the array.
+
+=cut
+*/
+
SV *
-av_shift(register AV *av)
+Perl_av_shift(pTHX_ register AV *av)
{
SV *retval;
MAGIC* mg;
@@ -507,15 +618,15 @@ av_shift(register AV *av)
if (!av || AvFILL(av) < 0)
return &PL_sv_undef;
if (SvREADONLY(av))
- croak(no_modify);
- if (mg = SvTIED_mg((SV*)av, 'P')) {
+ Perl_croak(aTHX_ PL_no_modify);
+ if ((mg = SvTIED_mg((SV*)av, 'P'))) {
dSP;
PUSHSTACKi(PERLSI_MAGIC);
PUSHMARK(SP);
XPUSHs(SvTIED_obj((SV*)av, mg));
PUTBACK;
ENTER;
- if (perl_call_method("SHIFT", G_SCALAR)) {
+ if (call_method("SHIFT", G_SCALAR)) {
retval = newSVsv(*PL_stack_sp--);
} else {
retval = &PL_sv_undef;
@@ -535,21 +646,30 @@ av_shift(register AV *av)
return retval;
}
+/*
+=for apidoc av_len
+
+Returns the highest index in the array. Returns -1 if the array is
+empty.
+
+=cut
+*/
+
I32
-av_len(register AV *av)
+Perl_av_len(pTHX_ register AV *av)
{
return AvFILL(av);
}
void
-av_fill(register AV *av, I32 fill)
+Perl_av_fill(pTHX_ register AV *av, I32 fill)
{
MAGIC *mg;
if (!av)
- croak("panic: null array");
+ Perl_croak(aTHX_ "panic: null array");
if (fill < 0)
fill = -1;
- if (mg = SvTIED_mg((SV*)av, 'P')) {
+ if ((mg = SvTIED_mg((SV*)av, 'P'))) {
dSP;
ENTER;
SAVETMPS;
@@ -559,7 +679,7 @@ av_fill(register AV *av, I32 fill)
PUSHs(SvTIED_obj((SV*)av, mg));
PUSHs(sv_2mortal(newSViv(fill+1)));
PUTBACK;
- perl_call_method("STORESIZE", G_SCALAR|G_DISCARD);
+ call_method("STORESIZE", G_SCALAR|G_DISCARD);
POPSTACK;
FREETMPS;
LEAVE;
@@ -588,6 +708,86 @@ av_fill(register AV *av, I32 fill)
(void)av_store(av,fill,&PL_sv_undef);
}
+SV *
+Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
+{
+ SV *sv;
+
+ if (!av)
+ return Nullsv;
+ if (SvREADONLY(av))
+ Perl_croak(aTHX_ PL_no_modify);
+ if (key < 0) {
+ key += AvFILL(av) + 1;
+ if (key < 0)
+ return Nullsv;
+ }
+ if (SvRMAGICAL(av)) {
+ SV **svp;
+ if ((mg_find((SV*)av,'P') || mg_find((SV*)av,'D'))
+ && (svp = av_fetch(av, key, TRUE)))
+ {
+ sv = *svp;
+ mg_clear(sv);
+ if (mg_find(sv, 'p')) {
+ sv_unmagic(sv, 'p'); /* No longer an element */
+ return sv;
+ }
+ return Nullsv; /* element cannot be deleted */
+ }
+ }
+ if (key > AvFILLp(av))
+ return Nullsv;
+ else {
+ sv = AvARRAY(av)[key];
+ if (key == AvFILLp(av)) {
+ do {
+ AvFILLp(av)--;
+ } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
+ }
+ else
+ AvARRAY(av)[key] = &PL_sv_undef;
+ if (SvSMAGICAL(av))
+ mg_set((SV*)av);
+ }
+ if (flags & G_DISCARD) {
+ SvREFCNT_dec(sv);
+ sv = Nullsv;
+ }
+ return sv;
+}
+
+/*
+ * This relies on the fact that uninitialized array elements
+ * are set to &PL_sv_undef.
+ */
+
+bool
+Perl_av_exists(pTHX_ AV *av, I32 key)
+{
+ if (!av)
+ return FALSE;
+ if (key < 0) {
+ key += AvFILL(av) + 1;
+ if (key < 0)
+ return FALSE;
+ }
+ if (SvRMAGICAL(av)) {
+ if (mg_find((SV*)av,'P') || mg_find((SV*)av,'D')) {
+ SV *sv = sv_newmortal();
+ mg_copy((SV*)av, sv, 0, key);
+ magic_existspack(sv, mg_find(sv, 'p'));
+ return SvTRUE(sv);
+ }
+ }
+ if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
+ && AvARRAY(av)[key])
+ {
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
/* AVHV: Support for treating arrays as if they were hashes. The
* first element of the array should be a hash reference that maps
@@ -595,16 +795,30 @@ av_fill(register AV *av, I32 fill)
*/
STATIC I32
-avhv_index_sv(SV* sv)
+S_avhv_index_sv(pTHX_ SV* sv)
{
I32 index = SvIV(sv);
if (index < 1)
- croak("Bad index while coercing array into hash");
+ Perl_croak(aTHX_ "Bad index while coercing array into hash");
return index;
}
+STATIC I32
+S_avhv_index(pTHX_ AV *av, SV *keysv, U32 hash)
+{
+ HV *keys;
+ HE *he;
+ STRLEN n_a;
+
+ keys = avhv_keys(av);
+ he = hv_fetch_ent(keys, keysv, FALSE, hash);
+ if (!he)
+ Perl_croak(aTHX_ "No such pseudo-hash field \"%s\"", SvPV(keysv,n_a));
+ return avhv_index_sv(HeVAL(he));
+}
+
HV*
-avhv_keys(AV *av)
+Perl_avhv_keys(pTHX_ AV *av)
{
SV **keysp = av_fetch(av, 0, FALSE);
if (keysp) {
@@ -617,39 +831,60 @@ avhv_keys(AV *av)
return (HV*)sv;
}
}
- croak("Can't coerce array into hash");
+ Perl_croak(aTHX_ "Can't coerce array into hash");
return Nullhv;
}
SV**
-avhv_fetch_ent(AV *av, SV *keysv, I32 lval, U32 hash)
+Perl_avhv_store_ent(pTHX_ AV *av, SV *keysv, SV *val, U32 hash)
+{
+ return av_store(av, avhv_index(av, keysv, hash), val);
+}
+
+SV**
+Perl_avhv_fetch_ent(pTHX_ AV *av, SV *keysv, I32 lval, U32 hash)
+{
+ return av_fetch(av, avhv_index(av, keysv, hash), lval);
+}
+
+SV *
+Perl_avhv_delete_ent(pTHX_ AV *av, SV *keysv, I32 flags, U32 hash)
{
- SV **indsvp;
HV *keys = avhv_keys(av);
HE *he;
-
+
he = hv_fetch_ent(keys, keysv, FALSE, hash);
- if (!he)
- croak("No such array field");
- return av_fetch(av, avhv_index_sv(HeVAL(he)), lval);
+ if (!he || !SvOK(HeVAL(he)))
+ return Nullsv;
+
+ return av_delete(av, avhv_index_sv(HeVAL(he)), flags);
}
+/* Check for the existence of an element named by a given key.
+ *
+ */
bool
-avhv_exists_ent(AV *av, SV *keysv, U32 hash)
+Perl_avhv_exists_ent(pTHX_ AV *av, SV *keysv, U32 hash)
{
HV *keys = avhv_keys(av);
- return hv_exists_ent(keys, keysv, hash);
+ HE *he;
+
+ he = hv_fetch_ent(keys, keysv, FALSE, hash);
+ if (!he || !SvOK(HeVAL(he)))
+ return FALSE;
+
+ return av_exists(av, avhv_index_sv(HeVAL(he)));
}
HE *
-avhv_iternext(AV *av)
+Perl_avhv_iternext(pTHX_ AV *av)
{
HV *keys = avhv_keys(av);
return hv_iternext(keys);
}
SV *
-avhv_iterval(AV *av, register HE *entry)
+Perl_avhv_iterval(pTHX_ AV *av, register HE *entry)
{
SV *sv = hv_iterval(avhv_keys(av), entry);
return *av_fetch(av, avhv_index_sv(sv), TRUE);
diff --git a/contrib/perl5/av.h b/contrib/perl5/av.h
index bef763d..6b66bfd 100644
--- a/contrib/perl5/av.h
+++ b/contrib/perl5/av.h
@@ -1,6 +1,6 @@
/* av.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -10,9 +10,9 @@
struct xpvav {
char* xav_array; /* pointer to first array element */
SSize_t xav_fill; /* Index of last element present */
- SSize_t xav_max; /* Number of elements for which array has space */
+ SSize_t xav_max; /* max index for which array has space */
IV xof_off; /* ptr is incremented by offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* magic for scalar array */
HV* xmg_stash; /* class package */
@@ -21,10 +21,40 @@ struct xpvav {
U8 xav_flags;
};
+
+/* AVf_REAL is set for all AVs whose xav_array contents are refcounted.
+ * Some things like "@_" and the scratchpad list do not set this, to
+ * indicate that they are cheating (for efficiency) by not refcounting
+ * the AV's contents.
+ *
+ * AVf_REIFY is only meaningful on such "fake" AVs (i.e. where AVf_REAL
+ * is not set). It indicates that the fake AV is capable of becoming
+ * real if the array needs to be modified in some way. Functions that
+ * modify fake AVs check both flags to call av_reify() as appropriate.
+ *
+ * Note that the Perl stack has neither flag set. (Thus, items that go
+ * on the stack are never refcounted.)
+ *
+ * These internal details are subject to change any time. AV
+ * manipulations external to perl should not care about any of this.
+ * GSAR 1999-09-10
+ */
#define AVf_REAL 1 /* free old entries */
#define AVf_REIFY 2 /* can become real */
+
+/* XXX this is not used anywhere */
#define AVf_REUSED 4 /* got undeffed--don't turn old memory into SVs now */
+/*
+=for apidoc AmU||Nullav
+Null AV pointer.
+
+=for apidoc Am|int|AvFILL|AV* av
+Same as C<av_len()>. Deprecated, use C<av_len()> instead.
+
+=cut
+*/
+
#define Nullav Null(AV*)
#define AvARRAY(av) ((SV**)((XPVAV*) SvANY(av))->xav_array)
diff --git a/contrib/perl5/bytecode.pl b/contrib/perl5/bytecode.pl
index cc096ac..d1e1c70 100644
--- a/contrib/perl5/bytecode.pl
+++ b/contrib/perl5/bytecode.pl
@@ -1,3 +1,6 @@
+BEGIN {
+ push @INC, './lib';
+}
use strict;
my %alias_to = (
U32 => [qw(PADOFFSET STRLEN)],
@@ -6,7 +9,7 @@ my %alias_to = (
U8 => [qw(char)],
);
-my @optype= qw(OP UNOP BINOP LOGOP CONDOP LISTOP PMOP SVOP GVOP PVOP LOOP COP);
+my @optype= qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP);
# Nullsv *must* come first in the following so that the condition
# ($$sv == 0) can continue to be used to test (sv == Nullsv).
@@ -19,7 +22,7 @@ while (($from, $tos) = each %alias_to) {
my $c_header = <<'EOT';
/*
- * Copyright (c) 1996-1998 Malcolm Beattie
+ * Copyright (c) 1996-1999 Malcolm Beattie
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -33,7 +36,7 @@ EOT
my $perl_header;
($perl_header = $c_header) =~ s{[/ ]?\*/?}{#}g;
-unlink "byterun.c", "byterun.h", "ext/B/B/Asmdata.pm";
+unlink "ext/ByteLoader/byterun.c", "ext/ByteLoader/byterun.h", "ext/B/B/Asmdata.pm";
#
# Start with boilerplate for Asmdata.pm
@@ -44,7 +47,7 @@ package B::Asmdata;
use Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(%insn_data @insn_name @optype @specialsv_name);
-use vars qw(%insn_data @insn_name @optype @specialsv_name);
+our(%insn_data, @insn_name, @optype, @specialsv_name);
EOT
print ASMDATA_PM <<"EOT";
@@ -59,34 +62,72 @@ EOT
#
# Boilerplate for byterun.c
#
-open(BYTERUN_C, ">byterun.c") or die "byterun.c: $!";
+open(BYTERUN_C, ">ext/ByteLoader/byterun.c") or die "ext/ByteLoader/byterun.c: $!";
print BYTERUN_C $c_header, <<'EOT';
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
+#define NO_XSLOCKS
+#include "XSUB.h"
+
+#ifdef PERL_OBJECT
+#undef CALL_FPTR
+#define CALL_FPTR(fptr) (pPerl->*fptr)
+#undef PL_ppaddr
+#define PL_ppaddr (*get_ppaddr())
+#endif
+
+#include "byterun.h"
+#include "bytecode.h"
+
+
+static int optype_size[] = {
+EOT
+my $i = 0;
+for ($i = 0; $i < @optype - 1; $i++) {
+ printf BYTERUN_C " sizeof(%s),\n", $optype[$i], $i;
+}
+printf BYTERUN_C " sizeof(%s)\n", $optype[$i], $i;
+print BYTERUN_C <<'EOT';
+};
+
+static SV *specialsv_list[4];
+
+static int bytecode_iv_overflows = 0;
+static SV *bytecode_sv;
+static XPV bytecode_pv;
+static void **bytecode_obj_list;
+static I32 bytecode_obj_list_fill = -1;
void *
-bset_obj_store(void *obj, I32 ix)
+bset_obj_store(pTHXo_ void *obj, I32 ix)
{
- if (ix > PL_bytecode_obj_list_fill) {
- if (PL_bytecode_obj_list_fill == -1)
- New(666, PL_bytecode_obj_list, ix + 1, void*);
+ if (ix > bytecode_obj_list_fill) {
+ if (bytecode_obj_list_fill == -1)
+ New(666, bytecode_obj_list, ix + 1, void*);
else
- Renew(PL_bytecode_obj_list, ix + 1, void*);
- PL_bytecode_obj_list_fill = ix;
+ Renew(bytecode_obj_list, ix + 1, void*);
+ bytecode_obj_list_fill = ix;
}
- PL_bytecode_obj_list[ix] = obj;
+ bytecode_obj_list[ix] = obj;
return obj;
}
-#ifdef INDIRECT_BGET_MACROS
-void byterun(struct bytestream bs)
-#else
-void byterun(PerlIO *fp)
-#endif /* INDIRECT_BGET_MACROS */
+void
+byterun(pTHXo_ struct bytestream bs)
{
dTHR;
int insn;
+
+EOT
+
+for (my $i = 0; $i < @specialsv; $i++) {
+ print BYTERUN_C " specialsv_list[$i] = $specialsv[$i];\n";
+}
+
+print BYTERUN_C <<'EOT';
+
while ((insn = BGET_FGETC()) != EOF) {
switch (insn) {
EOT
@@ -121,7 +162,7 @@ while (<DATA>) {
if ($flags =~ /x/) {
print BYTERUN_C "\t\tBSET_$insn($lvalue$optarg);\n";
} elsif ($flags =~ /s/) {
- # Store instructions store to PL_bytecode_obj_list[arg]. "lvalue" field is rvalue.
+ # Store instructions store to bytecode_obj_list[arg]. "lvalue" field is rvalue.
print BYTERUN_C "\t\tBSET_OBJ_STORE($lvalue$optarg);\n";
}
elsif ($optarg && $lvalue ne "none") {
@@ -145,7 +186,7 @@ EOT
#
print BYTERUN_C <<'EOT';
default:
- croak("Illegal bytecode instruction %d\n", insn);
+ Perl_croak(aTHX_ "Illegal bytecode instruction %d\n", insn);
/* NOTREACHED */
}
}
@@ -155,23 +196,18 @@ EOT
#
# Write the instruction and optype enum constants into byterun.h
#
-open(BYTERUN_H, ">byterun.h") or die "byterun.h: $!";
+open(BYTERUN_H, ">ext/ByteLoader/byterun.h") or die "ext/ByteLoader/byterun.h: $!";
print BYTERUN_H $c_header, <<'EOT';
-#ifdef INDIRECT_BGET_MACROS
struct bytestream {
void *data;
- int (*fgetc)(void *);
- int (*fread)(char *, size_t, size_t, void*);
- void (*freadpv)(U32, void*);
+ int (*pfgetc)(void *);
+ int (*pfread)(char *, size_t, size_t, void *);
+ void (*pfreadpv)(U32, void *, XPV *);
};
-#endif /* INDIRECT_BGET_MACROS */
-
-void *bset_obj_store _((void *, I32));
enum {
EOT
-my $i = 0;
my $add_enum_value = 0;
my $max_insn;
for ($i = 0; $i < @insn_name; $i++) {
@@ -196,22 +232,10 @@ for ($i = 0; $i < @optype - 1; $i++) {
printf BYTERUN_H " OPt_%s,\t\t/* %d */\n", $optype[$i], $i;
}
printf BYTERUN_H " OPt_%s\t\t/* %d */\n};\n\n", $optype[$i], $i;
-print BYTERUN_H <<'EOT';
-EXT int optype_size[]
-#ifdef DOINIT
-= {
-EOT
-for ($i = 0; $i < @optype - 1; $i++) {
- printf BYTERUN_H " sizeof(%s),\n", $optype[$i], $i;
-}
-printf BYTERUN_H " sizeof(%s)\n}\n", $optype[$i], $i;
-print BYTERUN_H <<'EOT';
-#endif /* DOINIT */
-;
-
-EOT
print BYTERUN_H <<'EOT';
+extern void byterun(pTHXo_ struct bytestream bs);
+
#define INIT_SPECIALSV_LIST STMT_START { \
EOT
for ($i = 0; $i < @specialsv; $i++) {
@@ -270,85 +294,85 @@ nop none none
#opcode lvalue argtype flags
#
ret none none x
-ldsv PL_bytecode_sv svindex
+ldsv bytecode_sv svindex
ldop PL_op opindex
-stsv PL_bytecode_sv U32 s
+stsv bytecode_sv U32 s
stop PL_op U32 s
-ldspecsv PL_bytecode_sv U8 x
-newsv PL_bytecode_sv U8 x
+ldspecsv bytecode_sv U8 x
+newsv bytecode_sv U8 x
newop PL_op U8 x
newopn PL_op U8 x
newpv none PV
-pv_cur PL_bytecode_pv.xpv_cur STRLEN
-pv_free PL_bytecode_pv none x
-sv_upgrade PL_bytecode_sv char x
-sv_refcnt SvREFCNT(PL_bytecode_sv) U32
-sv_refcnt_add SvREFCNT(PL_bytecode_sv) I32 x
-sv_flags SvFLAGS(PL_bytecode_sv) U32
-xrv SvRV(PL_bytecode_sv) svindex
-xpv PL_bytecode_sv none x
-xiv32 SvIVX(PL_bytecode_sv) I32
-xiv64 SvIVX(PL_bytecode_sv) IV64
-xnv SvNVX(PL_bytecode_sv) double
-xlv_targoff LvTARGOFF(PL_bytecode_sv) STRLEN
-xlv_targlen LvTARGLEN(PL_bytecode_sv) STRLEN
-xlv_targ LvTARG(PL_bytecode_sv) svindex
-xlv_type LvTYPE(PL_bytecode_sv) char
-xbm_useful BmUSEFUL(PL_bytecode_sv) I32
-xbm_previous BmPREVIOUS(PL_bytecode_sv) U16
-xbm_rare BmRARE(PL_bytecode_sv) U8
-xfm_lines FmLINES(PL_bytecode_sv) I32
-xio_lines IoLINES(PL_bytecode_sv) long
-xio_page IoPAGE(PL_bytecode_sv) long
-xio_page_len IoPAGE_LEN(PL_bytecode_sv) long
-xio_lines_left IoLINES_LEFT(PL_bytecode_sv) long
-xio_top_name IoTOP_NAME(PL_bytecode_sv) pvcontents
-xio_top_gv *(SV**)&IoTOP_GV(PL_bytecode_sv) svindex
-xio_fmt_name IoFMT_NAME(PL_bytecode_sv) pvcontents
-xio_fmt_gv *(SV**)&IoFMT_GV(PL_bytecode_sv) svindex
-xio_bottom_name IoBOTTOM_NAME(PL_bytecode_sv) pvcontents
-xio_bottom_gv *(SV**)&IoBOTTOM_GV(PL_bytecode_sv) svindex
-xio_subprocess IoSUBPROCESS(PL_bytecode_sv) short
-xio_type IoTYPE(PL_bytecode_sv) char
-xio_flags IoFLAGS(PL_bytecode_sv) char
-xcv_stash *(SV**)&CvSTASH(PL_bytecode_sv) svindex
-xcv_start CvSTART(PL_bytecode_sv) opindex
-xcv_root CvROOT(PL_bytecode_sv) opindex
-xcv_gv *(SV**)&CvGV(PL_bytecode_sv) svindex
-xcv_filegv *(SV**)&CvFILEGV(PL_bytecode_sv) svindex
-xcv_depth CvDEPTH(PL_bytecode_sv) long
-xcv_padlist *(SV**)&CvPADLIST(PL_bytecode_sv) svindex
-xcv_outside *(SV**)&CvOUTSIDE(PL_bytecode_sv) svindex
-xcv_flags CvFLAGS(PL_bytecode_sv) U8
-av_extend PL_bytecode_sv SSize_t x
-av_push PL_bytecode_sv svindex x
-xav_fill AvFILLp(PL_bytecode_sv) SSize_t
-xav_max AvMAX(PL_bytecode_sv) SSize_t
-xav_flags AvFLAGS(PL_bytecode_sv) U8
-xhv_riter HvRITER(PL_bytecode_sv) I32
-xhv_name HvNAME(PL_bytecode_sv) pvcontents
-hv_store PL_bytecode_sv svindex x
-sv_magic PL_bytecode_sv char x
-mg_obj SvMAGIC(PL_bytecode_sv)->mg_obj svindex
-mg_private SvMAGIC(PL_bytecode_sv)->mg_private U16
-mg_flags SvMAGIC(PL_bytecode_sv)->mg_flags U8
-mg_pv SvMAGIC(PL_bytecode_sv) pvcontents x
-xmg_stash *(SV**)&SvSTASH(PL_bytecode_sv) svindex
-gv_fetchpv PL_bytecode_sv strconst x
-gv_stashpv PL_bytecode_sv strconst x
-gp_sv GvSV(PL_bytecode_sv) svindex
-gp_refcnt GvREFCNT(PL_bytecode_sv) U32
-gp_refcnt_add GvREFCNT(PL_bytecode_sv) I32 x
-gp_av *(SV**)&GvAV(PL_bytecode_sv) svindex
-gp_hv *(SV**)&GvHV(PL_bytecode_sv) svindex
-gp_cv *(SV**)&GvCV(PL_bytecode_sv) svindex
-gp_filegv *(SV**)&GvFILEGV(PL_bytecode_sv) svindex
-gp_io *(SV**)&GvIOp(PL_bytecode_sv) svindex
-gp_form *(SV**)&GvFORM(PL_bytecode_sv) svindex
-gp_cvgen GvCVGEN(PL_bytecode_sv) U32
-gp_line GvLINE(PL_bytecode_sv) line_t
-gp_share PL_bytecode_sv svindex x
-xgv_flags GvFLAGS(PL_bytecode_sv) U8
+pv_cur bytecode_pv.xpv_cur STRLEN
+pv_free bytecode_pv none x
+sv_upgrade bytecode_sv char x
+sv_refcnt SvREFCNT(bytecode_sv) U32
+sv_refcnt_add SvREFCNT(bytecode_sv) I32 x
+sv_flags SvFLAGS(bytecode_sv) U32
+xrv SvRV(bytecode_sv) svindex
+xpv bytecode_sv none x
+xiv32 SvIVX(bytecode_sv) I32
+xiv64 SvIVX(bytecode_sv) IV64
+xnv SvNVX(bytecode_sv) NV
+xlv_targoff LvTARGOFF(bytecode_sv) STRLEN
+xlv_targlen LvTARGLEN(bytecode_sv) STRLEN
+xlv_targ LvTARG(bytecode_sv) svindex
+xlv_type LvTYPE(bytecode_sv) char
+xbm_useful BmUSEFUL(bytecode_sv) I32
+xbm_previous BmPREVIOUS(bytecode_sv) U16
+xbm_rare BmRARE(bytecode_sv) U8
+xfm_lines FmLINES(bytecode_sv) I32
+xio_lines IoLINES(bytecode_sv) long
+xio_page IoPAGE(bytecode_sv) long
+xio_page_len IoPAGE_LEN(bytecode_sv) long
+xio_lines_left IoLINES_LEFT(bytecode_sv) long
+xio_top_name IoTOP_NAME(bytecode_sv) pvcontents
+xio_top_gv *(SV**)&IoTOP_GV(bytecode_sv) svindex
+xio_fmt_name IoFMT_NAME(bytecode_sv) pvcontents
+xio_fmt_gv *(SV**)&IoFMT_GV(bytecode_sv) svindex
+xio_bottom_name IoBOTTOM_NAME(bytecode_sv) pvcontents
+xio_bottom_gv *(SV**)&IoBOTTOM_GV(bytecode_sv) svindex
+xio_subprocess IoSUBPROCESS(bytecode_sv) short
+xio_type IoTYPE(bytecode_sv) char
+xio_flags IoFLAGS(bytecode_sv) char
+xcv_stash *(SV**)&CvSTASH(bytecode_sv) svindex
+xcv_start CvSTART(bytecode_sv) opindex
+xcv_root CvROOT(bytecode_sv) opindex
+xcv_gv *(SV**)&CvGV(bytecode_sv) svindex
+xcv_file CvFILE(bytecode_sv) pvcontents
+xcv_depth CvDEPTH(bytecode_sv) long
+xcv_padlist *(SV**)&CvPADLIST(bytecode_sv) svindex
+xcv_outside *(SV**)&CvOUTSIDE(bytecode_sv) svindex
+xcv_flags CvFLAGS(bytecode_sv) U16
+av_extend bytecode_sv SSize_t x
+av_push bytecode_sv svindex x
+xav_fill AvFILLp(bytecode_sv) SSize_t
+xav_max AvMAX(bytecode_sv) SSize_t
+xav_flags AvFLAGS(bytecode_sv) U8
+xhv_riter HvRITER(bytecode_sv) I32
+xhv_name HvNAME(bytecode_sv) pvcontents
+hv_store bytecode_sv svindex x
+sv_magic bytecode_sv char x
+mg_obj SvMAGIC(bytecode_sv)->mg_obj svindex
+mg_private SvMAGIC(bytecode_sv)->mg_private U16
+mg_flags SvMAGIC(bytecode_sv)->mg_flags U8
+mg_pv SvMAGIC(bytecode_sv) pvcontents x
+xmg_stash *(SV**)&SvSTASH(bytecode_sv) svindex
+gv_fetchpv bytecode_sv strconst x
+gv_stashpv bytecode_sv strconst x
+gp_sv GvSV(bytecode_sv) svindex
+gp_refcnt GvREFCNT(bytecode_sv) U32
+gp_refcnt_add GvREFCNT(bytecode_sv) I32 x
+gp_av *(SV**)&GvAV(bytecode_sv) svindex
+gp_hv *(SV**)&GvHV(bytecode_sv) svindex
+gp_cv *(SV**)&GvCV(bytecode_sv) svindex
+gp_file GvFILE(bytecode_sv) pvcontents
+gp_io *(SV**)&GvIOp(bytecode_sv) svindex
+gp_form *(SV**)&GvFORM(bytecode_sv) svindex
+gp_cvgen GvCVGEN(bytecode_sv) U32
+gp_line GvLINE(bytecode_sv) line_t
+gp_share bytecode_sv svindex x
+xgv_flags GvFLAGS(bytecode_sv) U8
op_next PL_op->op_next opindex
op_sibling PL_op->op_sibling opindex
op_ppaddr PL_op->op_ppaddr strconst x
@@ -360,8 +384,6 @@ op_private PL_op->op_private U8
op_first cUNOP->op_first opindex
op_last cBINOP->op_last opindex
op_other cLOGOP->op_other opindex
-op_true cCONDOP->op_true opindex
-op_false cCONDOP->op_false opindex
op_children cLISTOP->op_children U32
op_pmreplroot cPMOP->op_pmreplroot opindex
op_pmreplrootgv *(SV**)&cPMOP->op_pmreplroot svindex
@@ -371,18 +393,19 @@ pregcomp PL_op pvcontents x
op_pmflags cPMOP->op_pmflags U16
op_pmpermflags cPMOP->op_pmpermflags U16
op_sv cSVOP->op_sv svindex
-op_gv *(SV**)&cGVOP->op_gv svindex
+op_padix cPADOP->op_padix PADOFFSET
op_pv cPVOP->op_pv pvcontents
op_pv_tr cPVOP->op_pv op_tr_array
op_redoop cLOOP->op_redoop opindex
op_nextop cLOOP->op_nextop opindex
op_lastop cLOOP->op_lastop opindex
cop_label cCOP->cop_label pvcontents
-cop_stash *(SV**)&cCOP->cop_stash svindex
-cop_filegv *(SV**)&cCOP->cop_filegv svindex
+cop_stashpv cCOP pvcontents x
+cop_file cCOP pvcontents x
cop_seq cCOP->cop_seq U32
cop_arybase cCOP->cop_arybase I32
-cop_line cCOP->cop_line line_t
+cop_line cCOP line_t x
+cop_warnings cCOP->cop_warnings svindex
main_start PL_main_start opindex
main_root PL_main_root opindex
curpad PL_curpad svindex x
diff --git a/contrib/perl5/cc_runtime.h b/contrib/perl5/cc_runtime.h
index 9a01ff8..dbc7475 100644
--- a/contrib/perl5/cc_runtime.h
+++ b/contrib/perl5/cc_runtime.h
@@ -1,4 +1,5 @@
-#define DOOP(ppname) PUTBACK; PL_op = ppname(ARGS); SPAGAIN
+#define DOOP(ppname) PUTBACK; PL_op = ppname(aTHX); SPAGAIN
+#define CCPP(s) OP * s(pTHX)
#define PP_LIST(g) do { \
dMARK; \
@@ -43,7 +44,7 @@
JMPENV_PUSH(ret); \
switch (ret) { \
case 0: \
- PL_op = ppaddr(ARGS); \
+ PL_op = ppaddr(aTHX); \
PL_retstack[PL_retstack_ix - 1] = Nullop; \
if (PL_op != nxt) CALLRUNOPS(); \
JMPENV_POP; \
@@ -52,20 +53,23 @@
case 2: JMPENV_POP; JMPENV_JUMP(2); \
case 3: \
JMPENV_POP; \
- if (PL_restartop != nxt) \
+ if (PL_restartop && PL_restartop != nxt) \
JMPENV_JUMP(3); \
} \
PL_op = nxt; \
SPAGAIN; \
} while (0)
-#define PP_ENTERTRY(jmpbuf,label) do { \
- dJMPENV; \
- int ret; \
- JMPENV_PUSH(ret); \
- switch (ret) { \
- case 1: JMPENV_POP; JMPENV_JUMP(1); \
- case 2: JMPENV_POP; JMPENV_JUMP(2); \
- case 3: JMPENV_POP; SPAGAIN; goto label;\
- } \
- } while (0)
+
+#define PP_ENTERTRY(jmpbuf,label) \
+ STMT_START { \
+ int ret; \
+ JMPENV_PUSH_ENV(jmpbuf,ret); \
+ switch (ret) { \
+ case 1: JMPENV_POP_ENV(jmpbuf); JMPENV_JUMP(1);\
+ case 2: JMPENV_POP_ENV(jmpbuf); JMPENV_JUMP(2);\
+ case 3: JMPENV_POP_ENV(jmpbuf); SPAGAIN; goto label;\
+ } \
+ } STMT_END
+#define PP_LEAVETRY \
+ STMT_START{ PL_top_env=PL_top_env->je_prev; }STMT_END
diff --git a/contrib/perl5/cflags.SH b/contrib/perl5/cflags.SH
index 8a1ba82..ec6dc35 100755
--- a/contrib/perl5/cflags.SH
+++ b/contrib/perl5/cflags.SH
@@ -28,7 +28,7 @@ $startsh
: In the following dollars and backticks do not need the extra backslash.
$spitshell >>cflags <<'!NO!SUBS!'
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
@@ -65,7 +65,7 @@ case $# in
0) set *.c; echo "The current C flags are:" ;;
esac
-set `echo "$* " | sed -e 's/\.[oc] / /g' -e 's/\.obj / /g'`
+set `echo "$* " | sed -e 's/\.[oc] / /g' -e 's/\.obj / /g' -e "s/\\$obj_ext / /g"`
for file do
@@ -76,7 +76,10 @@ for file do
: allow variables like toke_cflags to be evaluated
- eval 'eval ${'"${file}_cflags"'-""}'
+ if echo $file | grep -v / >/dev/null
+ then
+ eval 'eval ${'"${file}_cflags"'-""}'
+ fi
: or customize here
@@ -102,6 +105,7 @@ for file do
miniperlmain) ;;
op) ;;
perl) ;;
+ perlapi) ;;
perlmain) ;;
perly) ;;
pp) ;;
diff --git a/contrib/perl5/config_h.SH b/contrib/perl5/config_h.SH
index 0b42d29..0f6f19a 100755
--- a/contrib/perl5/config_h.SH
+++ b/contrib/perl5/config_h.SH
@@ -44,32 +44,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#define LOC_SED "$full_sed" /**/
-/* BIN:
- * This symbol holds the path of the bin directory where the package will
- * be installed. Program must be prepared to deal with ~name substitution.
- */
-/* BIN_EXP:
- * This symbol is the filename expanded version of the BIN symbol, for
- * programs that do not want to deal with that at run-time.
- */
-#define BIN "$bin" /**/
-#define BIN_EXP "$binexp" /**/
-
-/* CPPSTDIN:
- * This symbol contains the first part of the string which will invoke
- * the C preprocessor on the standard input and produce to standard
- * output. Typical value of "cc -E" or "/lib/cpp", but it can also
- * call a wrapper. See CPPRUN.
- */
-/* CPPMINUS:
- * This symbol contains the second part of the string which will invoke
- * the C preprocessor on the standard input and produce to standard
- * output. This symbol will have the value "-" if CPPSTDIN needs a minus
- * to specify standard input, otherwise the value is "".
- */
-#define CPPSTDIN "$cppstdin"
-#define CPPMINUS "$cppminus"
-
/* HAS_ALARM:
* This symbol, if defined, indicates that the alarm routine is
* available.
@@ -215,12 +189,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_fgetpos HAS_FGETPOS /**/
-/* FLEXFILENAMES:
- * This symbol, if defined, indicates that the system supports filenames
- * longer than 14 characters.
- */
-#$d_flexfnam FLEXFILENAMES /**/
-
/* HAS_FLOCK:
* This symbol, if defined, indicates that the flock routine is
* available to do file locking.
@@ -239,54 +207,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_fsetpos HAS_FSETPOS /**/
-/* I_SYS_MOUNT:
- * This symbol, if defined, indicates to the C program that it should
- * include <sys/mount.h>.
- */
-#$i_sysmount I_SYS_MOUNT /**/
-
-/* HAS_FSTATFS:
- * This symbol, if defined, indicates that the fstatfs routine is
- * available to stat the filesystem of a file descriptor.
- */
-#$d_fstatfs HAS_FSTATFS /**/
-
-/* HAS_STRUCT_STATFS_FLAGS:
- * This symbol, if defined, indicates that the struct statfs has
- * the f_flags member for mount flags.
- */
-#$d_statfsflags HAS_STRUCT_STATFS_FLAGS /**/
-
-/* I_SYS_STATVFS:
- * This symbol, if defined, indicates to the C program that it should
- * include <sys/statvfs.h>.
- */
-#$i_sysstatvfs I_SYS_STATVFS /**/
-
-/* HAS_FSTATVFS:
- * This symbol, if defined, indicates that the fstatvfs routine is
- * available to stat the filesystem of a file descriptor.
- */
-#$d_fstatvfs HAS_FSTATVFS /**/
-
-/* I_MNTENT:
- * This symbol, if defined, indicates to the C program that it should
- * include <mntent.h>.
- */
-#$i_mntent I_MNTENT /**/
-
-/* HAS_GETMNTENT:
- * This symbol, if defined, indicates that the getmntent routine is
- * available to lookup mount entries in some data base or other.
- */
-#$d_getmntent HAS_GETMNTENT /**/
-
-/* HAS_HASMNTOPT:
- * This symbol, if defined, indicates that the hasmntopt routine is
- * available to query mount entries returned by getmntent.
- */
-#$d_hasmntopt HAS_HASMNTOPT /**/
-
/* HAS_GETTIMEOFDAY:
* This symbol, if defined, indicates that the gettimeofday() system
* call is available for a sub-second accuracy clock. Usually, the file
@@ -305,13 +225,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_getgrps HAS_GETGROUPS /**/
-/* HAS_UNAME:
- * This symbol, if defined, indicates that the C program may use the
- * uname() routine to derive the host name. See also HAS_GETHOSTNAME
- * and PHOSTNAME.
- */
-#$d_uname HAS_UNAME /**/
-
/* HAS_GETLOGIN:
* This symbol, if defined, indicates that the getlogin routine is
* available to get the login name.
@@ -354,31 +267,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_getprior HAS_GETPRIORITY /**/
-/* HAS_HTONL:
- * This symbol, if defined, indicates that the htonl() routine (and
- * friends htons() ntohl() ntohs()) are available to do network
- * order byte swapping.
- */
-/* HAS_HTONS:
- * This symbol, if defined, indicates that the htons() routine (and
- * friends htonl() ntohl() ntohs()) are available to do network
- * order byte swapping.
- */
-/* HAS_NTOHL:
- * This symbol, if defined, indicates that the ntohl() routine (and
- * friends htonl() htons() ntohs()) are available to do network
- * order byte swapping.
- */
-/* HAS_NTOHS:
- * This symbol, if defined, indicates that the ntohs() routine (and
- * friends htonl() htons() ntohl()) are available to do network
- * order byte swapping.
- */
-#$d_htonl HAS_HTONL /**/
-#$d_htonl HAS_HTONS /**/
-#$d_htonl HAS_NTOHL /**/
-#$d_htonl HAS_NTOHS /**/
-
/* HAS_INET_ATON:
* This symbol, if defined, indicates to the C program that the
* inet_aton() function is available to parse IP address "dotted-quad"
@@ -482,11 +370,17 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_mktime HAS_MKTIME /**/
-/* HAS_MSG:
- * This symbol, if defined, indicates that the entire msg*(2) library is
- * supported (IPC mechanism based on message queues).
+/* HAS_MSYNC:
+ * This symbol, if defined, indicates that the msync system call is
+ * available to synchronize a mapped file.
*/
-#$d_msg HAS_MSG /**/
+#$d_msync HAS_MSYNC /**/
+
+/* HAS_MUNMAP:
+ * This symbol, if defined, indicates that the munmap system call is
+ * available to unmap a region, usually mapped by mmap().
+ */
+#$d_munmap HAS_MUNMAP /**/
/* HAS_NICE:
* This symbol, if defined, indicates that the nice routine is
@@ -578,12 +472,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_select HAS_SELECT /**/
-/* HAS_SEM:
- * This symbol, if defined, indicates that the entire sem*(2) library is
- * supported.
- */
-#$d_sem HAS_SEM /**/
-
/* HAS_SETEGID:
* This symbol, if defined, indicates that the setegid routine is available
* to change the effective gid of the current program.
@@ -683,12 +571,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_setsid HAS_SETSID /**/
-/* HAS_SHM:
- * This symbol, if defined, indicates that the entire shm*(2) library is
- * supported.
- */
-#$d_shm HAS_SHM /**/
-
/* Shmat_t:
* This symbol holds the return type of the shmat() system call.
* Usually set to 'void *' or 'char *'.
@@ -703,12 +585,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#define Shmat_t $shmattype /**/
#$d_shmatprototype HAS_SHMAT_PROTOTYPE /**/
-/* USE_STAT_BLOCKS:
- * This symbol is defined if this system has a stat structure declaring
- * st_blksize and st_blocks.
- */
-#$d_statblks USE_STAT_BLOCKS /**/
-
/* HAS_STRCHR:
* This symbol is defined to indicate that the strchr()/strrchr()
* functions are available for string searching. If not, try the
@@ -734,25 +610,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_strctcpy USE_STRUCT_COPY /**/
-/* HAS_STRERROR:
- * This symbol, if defined, indicates that the strerror routine is
- * available to translate error numbers to strings. See the writeup
- * of Strerror() in this file before you try to define your own.
- */
-/* HAS_SYS_ERRLIST:
- * This symbol, if defined, indicates that the sys_errlist array is
- * available to translate error numbers to strings. The extern int
- * sys_nerr gives the size of that table.
- */
-/* Strerror:
- * This preprocessor symbol is defined as a macro if strerror() is
- * not available to translate error numbers to strings but sys_errlist[]
- * array is there.
- */
-#$d_strerror HAS_STRERROR /**/
-#$d_syserrlst HAS_SYS_ERRLIST /**/
-#define Strerror(e) $d_strerrm
-
/* HAS_STRTOD:
* This symbol, if defined, indicates that the strtod routine is
* available to provide better numeric string conversion than atof().
@@ -831,11 +688,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_umask HAS_UMASK /**/
-/* HAS_VFORK:
- * This symbol, if defined, indicates that vfork() exists.
- */
-#$d_vfork HAS_VFORK /**/
-
/* HASVOLATILE:
* This symbol, if defined, indicates that this C compiler knows about
* the volatile declaration.
@@ -868,17 +720,11 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_wctomb HAS_WCTOMB /**/
-/* EBCDIC:
- * This symbol, if defined, indicates that this system uses
- * EBCDIC encoding.
- */
-#$ebcdic EBCDIC /**/
-
/* I_ARPA_INET:
- * This symbol, if defined, indicates that <arpa/inet.h> exists and should
- * be included.
+ * This symbol, if defined, indicates to the C program that it should
+ * include <arpa/inet.h> to get inet_addr and friends declarations.
*/
-#$i_arpainet I_ARPA_INET /**/
+#$i_arpainet I_ARPA_INET /**/
/* I_DBM:
* This symbol, if defined, indicates that <dbm.h> exists and should
@@ -929,32 +775,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$i_float I_FLOAT /**/
-/* I_GRP:
- * This symbol, if defined, indicates to the C program that it should
- * include <grp.h>.
- */
-/* GRPASSWD:
- * This symbol, if defined, indicates to the C program that struct group
- * contains gr_passwd.
- */
-/* HAS_SETGRENT:
- * This symbol, if defined, indicates that the getgrent routine is
- * available for initializing sequential access of the group database.
- */
-/* HAS_GETGRENT:
- * This symbol, if defined, indicates that the getgrent routine is
- * available for sequential access of the group database.
- */
-/* HAS_ENDGRENT:
- * This symbol, if defined, indicates that the getgrent routine is
- * available for finalizing sequential access of the group database.
- */
-#$i_grp I_GRP /**/
-#$d_grpasswd GRPASSWD /**/
-#$d_setgrent HAS_SETGRENT /**/
-#$d_getgrent HAS_GETGRENT /**/
-#$d_endgrent HAS_ENDGRENT /**/
-
/* I_LIMITS:
* This symbol, if defined, indicates to the C program that it should
* include <limits.h> to get definition of symbols like WORD_BIT or
@@ -1184,20 +1004,156 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#define STDCHAR $stdchar /**/
+/* CROSSCOMPILE:
+ * This symbol, if defined, signifies that we our
+ * build process is a cross-compilation.
+ */
+#$crosscompile CROSSCOMPILE /**/
+
+/* INTSIZE:
+ * This symbol contains the value of sizeof(int) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* LONGSIZE:
+ * This symbol contains the value of sizeof(long) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* SHORTSIZE:
+ * This symbol contains the value of sizeof(short) so that the C
+ * preprocessor can make decisions based on it.
+ */
+#define INTSIZE $intsize /**/
+#define LONGSIZE $longsize /**/
+#define SHORTSIZE $shortsize /**/
+
+/* MULTIARCH:
+ * This symbol, if defined, signifies that the build
+ * process will produce some binary files that are going to be
+ * used in a cross-platform environment. This is the case for
+ * example with the NeXT "fat" binaries that contain executables
+ * for several CPUs.
+ */
+#$multiarch MULTIARCH /**/
+
+/* HAS_QUAD:
+ * This symbol, if defined, tells that there's a 64-bit integer type,
+ * Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one
+ * of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T.
+ */
+#$d_quad HAS_QUAD /**/
+#ifdef HAS_QUAD
+# define Quad_t $quadtype /**/
+# define Uquad_t $uquadtype /**/
+# define QUADKIND $quadkind /**/
+# define QUAD_IS_INT 1
+# define QUAD_IS_LONG 2
+# define QUAD_IS_LONG_LONG 3
+# define QUAD_IS_INT64_T 4
+#endif
+
+/* HAS_ACCESSX:
+ * This symbol, if defined, indicates that the accessx routine is
+ * available to do extended access checks.
+ */
+#$d_accessx HAS_ACCESSX /**/
+
+/* HAS_EACCESS:
+ * This symbol, if defined, indicates that the eaccess routine is
+ * available to do extended access checks.
+ */
+#$d_eaccess HAS_EACCESS /**/
+
+/* I_SYS_ACCESS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/access.h>.
+ */
+#$i_sysaccess I_SYS_ACCESS /**/
+
+/* I_SYS_SECURITY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/security.h>.
+ */
+#$i_syssecrt I_SYS_SECURITY /**/
+
+/* OSNAME:
+ * This symbol contains the name of the operating system, as determined
+ * by Configure. You shouldn't rely on it too much; the specific
+ * feature tests from Configure are generally more reliable.
+ */
+#define OSNAME "$osname" /**/
+
/* MEM_ALIGNBYTES:
- * This symbol contains the number of bytes required to align a
- * double. Usual values are 2, 4 and 8.
- * On NeXT starting with 3.2, you can build "Fat" Multiple Architecture
- * Binaries (MAB) for targets with varying alignment. This only matters
- * for perl, where the config.h can be generated and installed on one
- * system, and used by a different architecture to build an extension.
- * The default is eight, for safety.
+ * This symbol contains the number of bytes required to align a
+ * double, or a long double when applicable. Usual values are 2,
+ * 4 and 8. The default is eight, for safety.
+ */
+#if defined(CROSSCOMPILE) || defined(MULTIARCH)
+# define MEM_ALIGNBYTES 8
+#else
+#define MEM_ALIGNBYTES $alignbytes
+#endif
+
+/* ARCHLIB:
+ * This variable, if defined, holds the name of the directory in
+ * which the user wants to put architecture-dependent public
+ * library files for $package. It is most often a local directory
+ * such as /usr/local/lib. Programs using this variable must be
+ * prepared to deal with filename expansion. If ARCHLIB is the
+ * same as PRIVLIB, it is not defined, since presumably the
+ * program already searches PRIVLIB.
+ */
+/* ARCHLIB_EXP:
+ * This symbol contains the ~name expanded version of ARCHLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define MEM_ALIGNBYTES $alignbytes /**/
+#$d_archlib ARCHLIB "$archlib" /**/
+#$d_archlib ARCHLIB_EXP "$archlibexp" /**/
+
+/* ARCHNAME:
+ * This symbol holds a string representing the architecture name.
+ * It may be used to construct an architecture-dependant pathname
+ * where library files may be held under a private library, for
+ * instance.
+ */
+#define ARCHNAME "$archname" /**/
+
+/* HAS_ATOLF:
+ * This symbol, if defined, indicates that the atolf routine is
+ * available to convert strings into long doubles.
+ */
+#$d_atolf HAS_ATOLF /**/
+
+/* HAS_ATOLL:
+ * This symbol, if defined, indicates that the atoll routine is
+ * available to convert strings into long longs.
+ */
+#$d_atoll HAS_ATOLL /**/
+
+/* BIN:
+ * This symbol holds the path of the bin directory where the package will
+ * be installed. Program must be prepared to deal with ~name substitution.
+ */
+/* BIN_EXP:
+ * This symbol is the filename expanded version of the BIN symbol, for
+ * programs that do not want to deal with that at run-time.
+ */
+#define BIN "$bin" /**/
+#define BIN_EXP "$binexp" /**/
+
+/* PERL_BINCOMPAT_5005:
+ * This symbol, if defined, indicates that this version of Perl should be
+ * binary-compatible with Perl 5.005. This is impossible for builds
+ * that use features like threads and multiplicity it is always $undef
+ * for those versions.
+ */
+#$d_bincompat5005 PERL_BINCOMPAT_5005 /**/
/* BYTEORDER:
* This symbol holds the hexadecimal constant defined in byteorder,
* i.e. 0x1234 or 0x4321, etc...
+ * If the compiler supports cross-compiling or multiple-architecture
+ * binaries (eg. on NeXT systems), use compiler-defined macros to
+ * determine the byte order.
* On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture
* Binaries (MAB) on either big endian or little endian machines.
* The endian-ness is available at compile-time. This only matters
@@ -1208,16 +1164,94 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
* so the default case (for NeXT) is big endian to catch them.
* This might matter for NeXT 3.0.
*/
-#ifndef NeXT
+#if defined(CROSSCOMPILE) || defined(MULTIARCH)
+# ifdef __LITTLE_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x1234
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x12345678
+# endif
+# endif
+# else
+# ifdef __BIG_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x4321
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x87654321
+# endif
+# endif
+# endif
+# endif
+# if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__))
+# define BYTEORDER 0x4321
+# endif
+#else
#define BYTEORDER 0x$byteorder /* large digits for MSB */
-#else /* NeXT */
-#ifdef __LITTLE_ENDIAN__
-#define BYTEORDER 0x1234
-#else /* __BIG_ENDIAN__ */
-#define BYTEORDER 0x4321
-#endif /* ENDIAN CHECK */
#endif /* NeXT */
+/* CAT2:
+ * This macro catenates 2 tokens together.
+ */
+/* STRINGIFY:
+ * This macro surrounds its token with double quotes.
+ */
+#if $cpp_stuff == 1
+# define CAT2(a,b) a/**/b
+# define STRINGIFY(a) "a"
+ /* If you can get stringification with catify, tell me how! */
+#endif
+#if $cpp_stuff == 42
+# define PeRl_CaTiFy(a, b) a ## b
+# define PeRl_StGiFy(a) #a
+/* the additional level of indirection enables these macros to be
+ * used as arguments to other macros. See K&R 2nd ed., page 231. */
+# define CAT2(a,b) PeRl_CaTiFy(a,b)
+# define StGiFy(a) PeRl_StGiFy(a)
+# define STRINGIFY(a) PeRl_StGiFy(a)
+#endif
+#if $cpp_stuff != 1 && $cpp_stuff != 42
+#include "Bletch: How does this C preprocessor catenate tokens?"
+#endif
+
+/* CPPSTDIN:
+ * This symbol contains the first part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. Typical value of "cc -E" or "/lib/cpp", but it can also
+ * call a wrapper. See CPPRUN.
+ */
+/* CPPMINUS:
+ * This symbol contains the second part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. This symbol will have the value "-" if CPPSTDIN needs a minus
+ * to specify standard input, otherwise the value is "".
+ */
+/* CPPRUN:
+ * This symbol contains the string which will invoke a C preprocessor on
+ * the standard input and produce to standard output. It needs to end
+ * with CPPLAST, after all other preprocessor flags have been specified.
+ * The main difference with CPPSTDIN is that this program will never be a
+ * pointer to a shell wrapper, i.e. it will be empty if no preprocessor is
+ * available directly to the user. Note that it may well be different from
+ * the preprocessor used to compile the C program.
+ */
+/* CPPLAST:
+ * This symbol is intended to be used along with CPPRUN in the same manner
+ * symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "".
+ */
+#define CPPSTDIN "$cppstdin"
+#define CPPMINUS "$cppminus"
+#define CPPRUN "$cpprun"
+#define CPPLAST "$cpplast"
+
+/* HAS_ACCESS:
+ * This manifest constant lets the C program know that the access()
+ * system call is available to check for accessibility using real UID/GID.
+ * (always present on UNIX.)
+ */
+#$d_access HAS_ACCESS /**/
+
/* CASTI32:
* This symbol is defined if the C compiler can cast negative
* or large floating point numbers to 32-bit ints.
@@ -1245,320 +1279,144 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_void_closedir VOID_CLOSEDIR /**/
-/* Gconvert:
- * This preprocessor macro is defined to convert a floating point
- * number to a string without a trailing decimal point. This
- * emulates the behavior of sprintf("%g"), but is sometimes much more
- * efficient. If gconvert() is not available, but gcvt() drops the
- * trailing decimal point, then gcvt() is used. If all else fails,
- * a macro using sprintf("%g") is used. Arguments for the Gconvert
- * macro are: value, number of digits, whether trailing zeros should
- * be retained, and the output buffer.
- * Possible values are:
- * d_Gconvert='gconvert((x),(n),(t),(b))'
- * d_Gconvert='gcvt((x),(n),(b))'
- * d_Gconvert='sprintf((b),"%.*g",(n),(x))'
- * The last two assume trailing zeros should not be kept.
- */
-#define Gconvert(x,n,t,b) $d_Gconvert
-
-/* HAS_GNULIBC:
- * This symbol, if defined, indicates to the C program that
- * the GNU C library is being used.
- */
-#$d_gnulibc HAS_GNULIBC /**/
-/* HAS_ISASCII:
- * This manifest constant lets the C program know that isascii
- * is available.
+/* HAS_CSH:
+ * This symbol, if defined, indicates that the C-shell exists.
*/
-#$d_isascii HAS_ISASCII /**/
-
-/* HAS_LCHOWN:
- * This symbol, if defined, indicates that the lchown routine is
- * available to operate on a symbolic link (instead of following the
- * link).
- */
-#$d_lchown HAS_LCHOWN /**/
-
-/* HAS_OPEN3:
- * This manifest constant lets the C program know that the three
- * argument form of open(2) is available.
- */
-#$d_open3 HAS_OPEN3 /**/
-
-/* HAS_SAFE_BCOPY:
- * This symbol, if defined, indicates that the bcopy routine is available
- * to copy potentially overlapping memory blocks. Otherwise you should
- * probably use memmove() or memcpy(). If neither is defined, roll your
- * own version.
- */
-#$d_safebcpy HAS_SAFE_BCOPY /**/
-
-/* HAS_SAFE_MEMCPY:
- * This symbol, if defined, indicates that the memcpy routine is available
- * to copy potentially overlapping memory blocks. Otherwise you should
- * probably use memmove() or memcpy(). If neither is defined, roll your
- * own version.
- */
-#$d_safemcpy HAS_SAFE_MEMCPY /**/
-
-/* HAS_SANE_MEMCMP:
- * This symbol, if defined, indicates that the memcmp routine is available
- * and can be used to compare relative magnitudes of chars with their high
- * bits set. If it is not defined, roll your own version.
+/* CSH:
+ * This symbol, if defined, contains the full pathname of csh.
*/
-#$d_sanemcmp HAS_SANE_MEMCMP /**/
+#$d_csh HAS_CSH /**/
+#ifdef HAS_CSH
+#define CSH "$full_csh" /**/
+#endif
-/* HAS_SIGACTION:
- * This symbol, if defined, indicates that Vr4's sigaction() routine
- * is available.
+/* DLSYM_NEEDS_UNDERSCORE:
+ * This symbol, if defined, indicates that we need to prepend an
+ * underscore to the symbol name before calling dlsym(). This only
+ * makes sense if you *have* dlsym, which we will presume is the
+ * case if you're using dl_dlopen.xs.
*/
-#$d_sigaction HAS_SIGACTION /**/
+#$d_dlsymun DLSYM_NEEDS_UNDERSCORE /**/
-/* Sigjmp_buf:
- * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
- */
-/* Sigsetjmp:
- * This macro is used in the same way as sigsetjmp(), but will invoke
- * traditional setjmp() if sigsetjmp isn't available.
- * See HAS_SIGSETJMP.
+/* HAS_DRAND48_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the drand48() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern double drand48 _((void));
*/
-/* Siglongjmp:
- * This macro is used in the same way as siglongjmp(), but will invoke
- * traditional longjmp() if siglongjmp isn't available.
- * See HAS_SIGSETJMP.
- */
-#$d_sigsetjmp HAS_SIGSETJMP /**/
-#ifdef HAS_SIGSETJMP
-#define Sigjmp_buf sigjmp_buf
-#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
-#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
-#else
-#define Sigjmp_buf jmp_buf
-#define Sigsetjmp(buf,save_mask) setjmp((buf))
-#define Siglongjmp(buf,retval) longjmp((buf),(retval))
-#endif
+#$d_drand48proto HAS_DRAND48_PROTO /**/
-/* USE_STDIO_PTR:
- * This symbol is defined if the _ptr and _cnt fields (or similar)
- * of the stdio FILE structure can be used to access the stdio buffer
- * for a file handle. If this is defined, then the FILE_ptr(fp)
- * and FILE_cnt(fp) macros will also be defined and should be used
- * to access these fields.
- */
-/* FILE_ptr:
- * This macro is used to access the _ptr field (or equivalent) of the
- * FILE structure pointed to by its argument. This macro will always be
- * defined if USE_STDIO_PTR is defined.
- */
-/* STDIO_PTR_LVALUE:
- * This symbol is defined if the FILE_ptr macro can be used as an
- * lvalue.
- */
-/* FILE_cnt:
- * This macro is used to access the _cnt field (or equivalent) of the
- * FILE structure pointed to by its argument. This macro will always be
- * defined if USE_STDIO_PTR is defined.
- */
-/* STDIO_CNT_LVALUE:
- * This symbol is defined if the FILE_cnt macro can be used as an
- * lvalue.
+/* HAS_ENDGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the group database.
*/
-#$d_stdstdio USE_STDIO_PTR /**/
-#ifdef USE_STDIO_PTR
-#define FILE_ptr(fp) $stdio_ptr
-#$d_stdio_ptr_lval STDIO_PTR_LVALUE /**/
-#define FILE_cnt(fp) $stdio_cnt
-#$d_stdio_cnt_lval STDIO_CNT_LVALUE /**/
-#endif
+#$d_endgrent HAS_ENDGRENT /**/
-/* USE_STDIO_BASE:
- * This symbol is defined if the _base field (or similar) of the
- * stdio FILE structure can be used to access the stdio buffer for
- * a file handle. If this is defined, then the FILE_base(fp) macro
- * will also be defined and should be used to access this field.
- * Also, the FILE_bufsiz(fp) macro will be defined and should be used
- * to determine the number of bytes in the buffer. USE_STDIO_BASE
- * will never be defined unless USE_STDIO_PTR is.
- */
-/* FILE_base:
- * This macro is used to access the _base field (or equivalent) of the
- * FILE structure pointed to by its argument. This macro will always be
- * defined if USE_STDIO_BASE is defined.
- */
-/* FILE_bufsiz:
- * This macro is used to determine the number of bytes in the I/O
- * buffer pointed to by _base field (or equivalent) of the FILE
- * structure pointed to its argument. This macro will always be defined
- * if USE_STDIO_BASE is defined.
+/* HAS_ENDHOSTENT:
+ * This symbol, if defined, indicates that the endhostent() routine is
+ * available to close whatever was being used for host queries.
*/
-#$d_stdiobase USE_STDIO_BASE /**/
-#ifdef USE_STDIO_BASE
-#define FILE_base(fp) $stdio_base
-#define FILE_bufsiz(fp) $stdio_bufsiz
-#endif
+#$d_endhent HAS_ENDHOSTENT /**/
-/* HAS_VPRINTF:
- * This symbol, if defined, indicates that the vprintf routine is available
- * to printf with a pointer to an argument list. If unavailable, you
- * may need to write your own, probably in terms of _doprnt().
- */
-/* USE_CHAR_VSPRINTF:
- * This symbol is defined if this system has vsprintf() returning type
- * (char*). The trend seems to be to declare it as "int vsprintf()". It
- * is up to the package author to declare vsprintf correctly based on the
- * symbol.
+/* HAS_ENDNETENT:
+ * This symbol, if defined, indicates that the endnetent() routine is
+ * available to close whatever was being used for network queries.
*/
-#$d_vprintf HAS_VPRINTF /**/
-#$d_charvspr USE_CHAR_VSPRINTF /**/
+#$d_endnent HAS_ENDNETENT /**/
-/* DOUBLESIZE:
- * This symbol contains the size of a double, so that the C preprocessor
- * can make decisions based on it.
+/* HAS_ENDPROTOENT:
+ * This symbol, if defined, indicates that the endprotoent() routine is
+ * available to close whatever was being used for protocol queries.
*/
-#define DOUBLESIZE $doublesize /**/
+#$d_endpent HAS_ENDPROTOENT /**/
-/* I_TIME:
- * This symbol, if defined, indicates to the C program that it should
- * include <time.h>.
- */
-/* I_SYS_TIME:
- * This symbol, if defined, indicates to the C program that it should
- * include <sys/time.h>.
- */
-/* I_SYS_TIME_KERNEL:
- * This symbol, if defined, indicates to the C program that it should
- * include <sys/time.h> with KERNEL defined.
+/* HAS_ENDPWENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the passwd database.
*/
-#$i_time I_TIME /**/
-#$i_systime I_SYS_TIME /**/
-#$i_systimek I_SYS_TIME_KERNEL /**/
+#$d_endpwent HAS_ENDPWENT /**/
-/* INTSIZE:
- * This symbol contains the value of sizeof(int) so that the C
- * preprocessor can make decisions based on it.
- */
-/* LONGSIZE:
- * This symbol contains the value of sizeof(long) so that the C
- * preprocessor can make decisions based on it.
- */
-/* SHORTSIZE:
- * This symbol contains the value of sizeof(short) so that the C
- * preprocessor can make decisions based on it.
+/* HAS_ENDSERVENT:
+ * This symbol, if defined, indicates that the endservent() routine is
+ * available to close whatever was being used for service queries.
*/
-#define INTSIZE $intsize /**/
-#define LONGSIZE $longsize /**/
-#define SHORTSIZE $shortsize /**/
+#$d_endsent HAS_ENDSERVENT /**/
-/* VAL_O_NONBLOCK:
- * This symbol is to be used during open() or fcntl(F_SETFL) to turn on
- * non-blocking I/O for the file descriptor. Note that there is no way
- * back, i.e. you cannot turn it blocking again this way. If you wish to
- * alternatively switch between blocking and non-blocking, use the
- * ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
- */
-/* VAL_EAGAIN:
- * This symbol holds the errno error code set by read() when no data was
- * present on the non-blocking file descriptor.
+/* HAS_ENDSPENT:
+ * This symbol, if defined, indicates that the endspent system call is
+ * available to finalize the scan of SysV shadow password entries.
*/
-/* RD_NODATA:
- * This symbol holds the return code from read() when no data is present
- * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
- * not defined, then you can't distinguish between no data and EOF by
- * issuing a read(). You'll have to find another way to tell for sure!
- */
-/* EOF_NONBLOCK:
- * This symbol, if defined, indicates to the C program that a read() on
- * a non-blocking file descriptor will return 0 on EOF, and not the value
- * held in RD_NODATA (-1 usually, in that case!).
- */
-#define VAL_O_NONBLOCK $o_nonblock
-#define VAL_EAGAIN $eagain
-#define RD_NODATA $rd_nodata
-#$d_eofnblk EOF_NONBLOCK
+#$d_endspent HAS_ENDSPENT /**/
-/* PTRSIZE:
- * This symbol contains the size of a pointer, so that the C preprocessor
- * can make decisions based on it. It will be sizeof(void *) if
- * the compiler supports (void *); otherwise it will be
- * sizeof(char *).
+/* HAS_FD_SET:
+ * This symbol, when defined, indicates presence of the fd_set typedef
+ * in <sys/types.h>
*/
-#define PTRSIZE $ptrsize /**/
+#$d_fd_set HAS_FD_SET /**/
-/* RANDBITS:
- * This symbol contains the number of bits of random number the rand()
- * function produces. Usual values are 15, 16, and 31.
+/* HAS_FPOS64_T:
+ * This symbol will be defined if the C compiler supports fpos64_t.
*/
-#define RANDBITS $randbits /**/
+#$d_fpos64_t HAS_FPOS64_T /**/
-/* SSize_t:
- * This symbol holds the type used by functions that return
- * a count of bytes or an error condition. It must be a signed type.
- * It is usually ssize_t, but may be long or int, etc.
- * It may be necessary to include <sys/types.h> or <unistd.h>
- * to get any typedef'ed information.
- * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+/* HAS_STRUCT_FS_DATA:
+ * This symbol, if defined, indicates that the struct fs_data
+ * to do statfs() is supported.
*/
-#define SSize_t $ssizetype /* signed count of bytes */
+#$d_fs_data_s HAS_STRUCT_FS_DATA /**/
-/* OSNAME:
- * This symbol contains the name of the operating system, as determined
- * by Configure. You shouldn't rely on it too much; the specific
- * feature tests from Configure are generally more reliable.
+/* HAS_FSEEKO:
+ * This symbol, if defined, indicates that the fseeko routine is
+ * available to fseek beyond 32 bits (useful for ILP32 hosts).
*/
-#define OSNAME "$osname" /**/
+#$d_fseeko HAS_FSEEKO /**/
-/* CAT2:
- * This macro catenates 2 tokens together.
- */
-/* STRINGIFY:
- * This macro surrounds its token with double quotes.
+/* HAS_FSTATFS:
+ * This symbol, if defined, indicates that the fstatfs routine is
+ * available to stat filesystems by file descriptors.
*/
-#if $cpp_stuff == 1
-#define CAT2(a,b)a/**/b
-#define STRINGIFY(a)"a"
- /* If you can get stringification with catify, tell me how! */
-#endif
-#if $cpp_stuff == 42
-#define CAT2(a,b)a ## b
-#define StGiFy(a)# a
-#define STRINGIFY(a)StGiFy(a)
-#endif
-#if $cpp_stuff != 1 && $cpp_stuff != 42
-#include "Bletch: How does this C preprocessor catenate tokens?"
-#endif
+#$d_fstatfs HAS_FSTATFS /**/
-/* CSH:
- * This symbol, if defined, contains the full pathname of csh.
+/* HAS_FTELLO:
+ * This symbol, if defined, indicates that the ftello routine is
+ * available to ftell beyond 32 bits (useful for ILP32 hosts).
*/
-#$d_csh HAS_CSH /**/
-#ifdef HAS_CSH
-#define CSH "$full_csh" /**/
-#endif
+#$d_ftello HAS_FTELLO /**/
-/* HAS_ENDHOSTENT:
- * This symbol, if defined, indicates that the endhostent() routine is
- * available to close whatever was being used for host queries.
+/* Gconvert:
+ * This preprocessor macro is defined to convert a floating point
+ * number to a string without a trailing decimal point. This
+ * emulates the behavior of sprintf("%g"), but is sometimes much more
+ * efficient. If gconvert() is not available, but gcvt() drops the
+ * trailing decimal point, then gcvt() is used. If all else fails,
+ * a macro using sprintf("%g") is used. Arguments for the Gconvert
+ * macro are: value, number of digits, whether trailing zeros should
+ * be retained, and the output buffer.
+ * Possible values are:
+ * d_Gconvert='gconvert((x),(n),(t),(b))'
+ * d_Gconvert='gcvt((x),(n),(b))'
+ * d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+ * The last two assume trailing zeros should not be kept.
*/
-#$d_endhent HAS_ENDHOSTENT /**/
+#define Gconvert(x,n,t,b) $d_Gconvert
-/* HAS_ENDNETENT:
- * This symbol, if defined, indicates that the endnetent() routine is
- * available to close whatever was being used for network queries.
+/* HAS_GETCWD:
+ * This symbol, if defined, indicates that the getcwd routine is
+ * available to get the current working directory.
*/
-#$d_endnent HAS_ENDNETENT /**/
+#$d_getcwd HAS_GETCWD /**/
-/* HAS_ENDPROTOENT:
- * This symbol, if defined, indicates that the endprotoent() routine is
- * available to close whatever was being used for protocol queries.
+/* HAS_GETFSSTAT:
+ * This symbol, if defined, indicates that the getfsstat routine is
+ * available to stat filesystems in bulk.
*/
-#$d_endpent HAS_ENDPROTOENT /**/
+#$d_getfsstat HAS_GETFSSTAT /**/
-/* HAS_ENDSERVENT:
- * This symbol, if defined, indicates that the endservent() routine is
- * available to close whatever was being used for service queries.
+/* HAS_GETGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for sequential access of the group database.
*/
-#$d_endsent HAS_ENDSERVENT /**/
+#$d_getgrent HAS_GETGRENT /**/
/* HAS_GETHOSTBYADDR:
* This symbol, if defined, indicates that the gethostbyaddr() routine is
@@ -1578,6 +1436,55 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_gethent HAS_GETHOSTENT /**/
+/* HAS_GETHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * gethostname() routine to derive the host name. See also HAS_UNAME
+ * and PHOSTNAME.
+ */
+/* HAS_UNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * uname() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and PHOSTNAME.
+ */
+/* PHOSTNAME:
+ * This symbol, if defined, indicates the command to feed to the
+ * popen() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and HAS_UNAME. Note that the command uses a fully qualified path,
+ * so that it is safe even if used by a process with super-user
+ * privileges.
+ */
+/* HAS_PHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * contents of PHOSTNAME as a command to feed to the popen() routine
+ * to derive the host name.
+ */
+#$d_gethname HAS_GETHOSTNAME /**/
+#$d_uname HAS_UNAME /**/
+#$d_phostname HAS_PHOSTNAME /**/
+#ifdef HAS_PHOSTNAME
+#define PHOSTNAME "$aphostname" /* How to get the host name */
+#endif
+
+/* HAS_GETHOST_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for gethostent(), gethostbyname(), and
+ * gethostbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#$d_gethostprotos HAS_GETHOST_PROTOS /**/
+
+/* HAS_GETMNT:
+ * This symbol, if defined, indicates that the getmnt routine is
+ * available to get filesystem mount info by filename.
+ */
+#$d_getmnt HAS_GETMNT /**/
+
+/* HAS_GETMNTENT:
+ * This symbol, if defined, indicates that the getmntent routine is
+ * available to iterate through mounted file systems to get their info.
+ */
+#$d_getmntent HAS_GETMNTENT /**/
+
/* HAS_GETNETBYADDR:
* This symbol, if defined, indicates that the getnetbyaddr() routine is
* available to look up networks by their IP addresses.
@@ -1596,6 +1503,14 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_getnent HAS_GETNETENT /**/
+/* HAS_GETNET_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getnetent(), getnetbyname(), and
+ * getnetbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#$d_getnetprotos HAS_GETNET_PROTOS /**/
+
/* HAS_GETPROTOENT:
* This symbol, if defined, indicates that the getprotoent() routine is
* available to look up protocols in some data base or another.
@@ -1613,12 +1528,47 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#$d_getpbyname HAS_GETPROTOBYNAME /**/
#$d_getpbynumber HAS_GETPROTOBYNUMBER /**/
+/* HAS_GETPROTO_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getprotoent(), getprotobyname(), and
+ * getprotobyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#$d_getprotoprotos HAS_GETPROTO_PROTOS /**/
+
+/* HAS_GETPWENT:
+ * This symbol, if defined, indicates that the getpwent routine is
+ * available for sequential access of the passwd database.
+ * If this is not available, the older getpw() function may be available.
+ */
+#$d_getpwent HAS_GETPWENT /**/
+
/* HAS_GETSERVENT:
* This symbol, if defined, indicates that the getservent() routine is
* available to look up network services in some data base or another.
*/
#$d_getsent HAS_GETSERVENT /**/
+/* HAS_GETSERV_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getservent(), getservbyname(), and
+ * getservbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#$d_getservprotos HAS_GETSERV_PROTOS /**/
+
+/* HAS_GETSPENT:
+ * This symbol, if defined, indicates that the getspent system call is
+ * available to retrieve SysV shadow password entries sequentially.
+ */
+#$d_getspent HAS_GETSPENT /**/
+
+/* HAS_GETSPNAM:
+ * This symbol, if defined, indicates that the getspnam system call is
+ * available to retrieve SysV shadow password entries by name.
+ */
+#$d_getspnam HAS_GETSPNAM /**/
+
/* HAS_GETSERVBYNAME:
* This symbol, if defined, indicates that the getservbyname()
* routine is available to look up services by their name.
@@ -1630,6 +1580,72 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#$d_getsbyname HAS_GETSERVBYNAME /**/
#$d_getsbyport HAS_GETSERVBYPORT /**/
+/* HAS_GNULIBC:
+ * This symbol, if defined, indicates to the C program that
+ * the GNU C library is being used.
+ */
+#$d_gnulibc HAS_GNULIBC /**/
+#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
+# define _GNU_SOURCE
+#endif
+/* HAS_HASMNTOPT:
+ * This symbol, if defined, indicates that the hasmntopt routine is
+ * available to query the mount options of file systems.
+ */
+#$d_hasmntopt HAS_HASMNTOPT /**/
+
+/* HAS_HTONL:
+ * This symbol, if defined, indicates that the htonl() routine (and
+ * friends htons() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_HTONS:
+ * This symbol, if defined, indicates that the htons() routine (and
+ * friends htonl() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHL:
+ * This symbol, if defined, indicates that the ntohl() routine (and
+ * friends htonl() htons() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHS:
+ * This symbol, if defined, indicates that the ntohs() routine (and
+ * friends htonl() htons() ntohl()) are available to do network
+ * order byte swapping.
+ */
+#$d_htonl HAS_HTONL /**/
+#$d_htonl HAS_HTONS /**/
+#$d_htonl HAS_NTOHL /**/
+#$d_htonl HAS_NTOHS /**/
+
+/* HAS_ICONV:
+ * This symbol, if defined, indicates that the iconv routine is
+ * available to do character set conversions.
+ */
+#$d_iconv HAS_ICONV /**/
+
+/* HAS_INT64_T:
+ * This symbol will defined if the C compiler supports int64_t.
+ * Usually the <inttypes.h> needs to be included, but sometimes
+ * <sys/types.h> is enough.
+ */
+#$d_int64_t HAS_INT64_T /**/
+
+/* HAS_ISASCII:
+ * This manifest constant lets the C program know that isascii
+ * is available.
+ */
+#$d_isascii HAS_ISASCII /**/
+
+/* HAS_LDBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol LDBL_DIG, which is the number
+ * of significant digits in a long double precision number. Unlike
+ * for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
+ */
+#$d_ldbl_dig HAS_LDBL_DIG /* */
+
/* HAS_LONG_DOUBLE:
* This symbol will be defined if the C compiler supports long
* doubles.
@@ -1645,8 +1661,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#endif
/* HAS_LONG_LONG:
- * This symbol will be defined if the C compiler supports
- * long long.
+ * This symbol will be defined if the C compiler supports long long.
*/
/* LONGLONGSIZE:
* This symbol contains the size of a long long, so that the
@@ -1658,6 +1673,145 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#define LONGLONGSIZE $longlongsize /**/
#endif
+/* HAS_LSEEK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the lseek() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern off_t lseek(int, off_t, int);
+ */
+#$d_lseekproto HAS_LSEEK_PROTO /**/
+
+/* HAS_MADVISE:
+ * This symbol, if defined, indicates that the madvise system call is
+ * available to map a file into memory.
+ */
+#$d_madvise HAS_MADVISE /**/
+
+/* HAS_MEMCHR:
+ * This symbol, if defined, indicates that the memchr routine is available
+ * to locate characters within a C string.
+ */
+#$d_memchr HAS_MEMCHR /**/
+
+/* HAS_MKDTEMP:
+ * This symbol, if defined, indicates that the mkdtemp routine is
+ * available to exclusively create a uniquely named temporary directory.
+ */
+#$d_mkdtemp HAS_MKDTEMP /**/
+
+/* HAS_MKSTEMP:
+ * This symbol, if defined, indicates that the mkstemp routine is
+ * available to exclusively create and open a uniquely named
+ * temporary file.
+ */
+#$d_mkstemp HAS_MKSTEMP /**/
+
+/* HAS_MKSTEMPS:
+ * This symbol, if defined, indicates that the mkstemps routine is
+ * available to excluslvely create and open a uniquely named
+ * (with a suffix) temporary file.
+ */
+#$d_mkstemps HAS_MKSTEMPS /**/
+
+/* HAS_MMAP:
+ * This symbol, if defined, indicates that the mmap system call is
+ * available to map a file into memory.
+ */
+/* Mmap_t:
+ * This symbol holds the return type of the mmap() system call
+ * (and simultaneously the type of the first argument).
+ * Usually set to 'void *' or 'cadd_t'.
+ */
+#$d_mmap HAS_MMAP /**/
+#define Mmap_t $mmaptype /**/
+
+/* HAS_MPROTECT:
+ * This symbol, if defined, indicates that the mprotect system call is
+ * available to modify the access protection of a memory mapped file.
+ */
+#$d_mprotect HAS_MPROTECT /**/
+
+/* HAS_MSG:
+ * This symbol, if defined, indicates that the entire msg*(2) library is
+ * supported (IPC mechanism based on message queues).
+ */
+#$d_msg HAS_MSG /**/
+
+/* HAS_OFF64_T:
+ * This symbol will be defined if the C compiler supports off64_t.
+ */
+#$d_off64_t HAS_OFF64_T /**/
+
+/* HAS_OPEN3:
+ * This manifest constant lets the C program know that the three
+ * argument form of open(2) is available.
+ */
+#$d_open3 HAS_OPEN3 /**/
+
+/* OLD_PTHREAD_CREATE_JOINABLE:
+ * This symbol, if defined, indicates how to create pthread
+ * in joinable (aka undetached) state. NOTE: not defined
+ * if pthread.h already has defined PTHREAD_CREATE_JOINABLE
+ * (the new version of the constant).
+ * If defined, known values are PTHREAD_CREATE_UNDETACHED
+ * and __UNDETACHED.
+ */
+#$d_old_pthread_create_joinable OLD_PTHREAD_CREATE_JOINABLE $old_pthread_create_joinable /**/
+
+/* HAS_PTHREAD_YIELD:
+ * This symbol, if defined, indicates that the pthread_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+/* SCHED_YIELD:
+ * This symbol defines the way to yield the execution of
+ * the current thread. Known ways are sched_yield,
+ * pthread_yield, and pthread_yield with NULL.
+ */
+/* HAS_SCHED_YIELD:
+ * This symbol, if defined, indicates that the sched_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+#$d_pthread_yield HAS_PTHREAD_YIELD /**/
+#define SCHED_YIELD $sched_yield /**/
+#$d_sched_yield HAS_SCHED_YIELD /**/
+
+/* HAS_SAFE_BCOPY:
+ * This symbol, if defined, indicates that the bcopy routine is available
+ * to copy potentially overlapping memory blocks. Otherwise you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+#$d_safebcpy HAS_SAFE_BCOPY /**/
+
+/* HAS_SAFE_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy potentially overlapping memory blocks. Otherwise you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+#$d_safemcpy HAS_SAFE_MEMCPY /**/
+
+/* HAS_SANE_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * and can be used to compare relative magnitudes of chars with their high
+ * bits set. If it is not defined, roll your own version.
+ */
+#$d_sanemcmp HAS_SANE_MEMCMP /**/
+
+/* HAS_SEM:
+ * This symbol, if defined, indicates that the entire sem*(2) library is
+ * supported.
+ */
+#$d_sem HAS_SEM /**/
+
+/* HAS_SETGRENT:
+ * This symbol, if defined, indicates that the setgrent routine is
+ * available for initializing sequential access of the group database.
+ */
+#$d_setgrent HAS_SETGRENT /**/
+
/* HAS_SETGROUPS:
* This symbol, if defined, indicates that the setgroups() routine is
* available to set the list of process groups. If unavailable, multiple
@@ -1683,12 +1837,24 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_setpent HAS_SETPROTOENT /**/
+/* HAS_SETPWENT:
+ * This symbol, if defined, indicates that the setpwent routine is
+ * available for initializing sequential access of the passwd database.
+ */
+#$d_setpwent HAS_SETPWENT /**/
+
/* HAS_SETSERVENT:
* This symbol, if defined, indicates that the setservent() routine is
* available.
*/
#$d_setsent HAS_SETSERVENT /**/
+/* HAS_SETSPENT:
+ * This symbol, if defined, indicates that the setspent system call is
+ * available to initialize the scan of SysV shadow password entries.
+ */
+#$d_setspent HAS_SETSPENT /**/
+
/* HAS_SETVBUF:
* This symbol, if defined, indicates that the setvbuf routine is
* available to change buffering on an open stdio stream.
@@ -1696,6 +1862,55 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_setvbuf HAS_SETVBUF /**/
+/* USE_SFIO:
+ * This symbol, if defined, indicates that sfio should
+ * be used.
+ */
+#$d_sfio USE_SFIO /**/
+
+/* HAS_SHM:
+ * This symbol, if defined, indicates that the entire shm*(2) library is
+ * supported.
+ */
+#$d_shm HAS_SHM /**/
+
+/* HAS_SIGACTION:
+ * This symbol, if defined, indicates that Vr4's sigaction() routine
+ * is available.
+ */
+#$d_sigaction HAS_SIGACTION /**/
+
+/* HAS_SIGSETJMP:
+ * This variable indicates to the C program that the sigsetjmp()
+ * routine is available to save the calling process's registers
+ * and stack environment for later use by siglongjmp(), and
+ * to optionally save the process's signal mask. See
+ * Sigjmp_buf, Sigsetjmp, and Siglongjmp.
+ */
+/* Sigjmp_buf:
+ * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ */
+/* Sigsetjmp:
+ * This macro is used in the same way as sigsetjmp(), but will invoke
+ * traditional setjmp() if sigsetjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+/* Siglongjmp:
+ * This macro is used in the same way as siglongjmp(), but will invoke
+ * traditional longjmp() if siglongjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+#$d_sigsetjmp HAS_SIGSETJMP /**/
+#ifdef HAS_SIGSETJMP
+#define Sigjmp_buf sigjmp_buf
+#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
+#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
+#else
+#define Sigjmp_buf jmp_buf
+#define Sigsetjmp(buf,save_mask) setjmp((buf))
+#define Siglongjmp(buf,retval) longjmp((buf),(retval))
+#endif
+
/* HAS_SOCKET:
* This symbol, if defined, indicates that the BSD socket interface is
* supported.
@@ -1704,8 +1919,205 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
* This symbol, if defined, indicates that the BSD socketpair() call is
* supported.
*/
-#$d_socket HAS_SOCKET /**/
-#$d_sockpair HAS_SOCKETPAIR /**/
+/* HAS_MSG_CTRUNC:
+ * This symbol, if defined, indicates that the MSG_CTRUNC is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_DONTROUTE:
+ * This symbol, if defined, indicates that the MSG_DONTROUTE is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_OOB:
+ * This symbol, if defined, indicates that the MSG_OOB is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PEEK:
+ * This symbol, if defined, indicates that the MSG_PEEK is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PROXY:
+ * This symbol, if defined, indicates that the MSG_PROXY is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_SCM_RIGHTS:
+ * This symbol, if defined, indicates that the SCM_RIGHTS is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+#$d_socket HAS_SOCKET /**/
+#$d_sockpair HAS_SOCKETPAIR /**/
+#$d_msg_ctrunc HAS_MSG_CTRUNC /**/
+#$d_msg_dontroute HAS_MSG_DONTROUTE /**/
+#$d_msg_oob HAS_MSG_OOB /**/
+#$d_msg_peek HAS_MSG_PEEK /**/
+#$d_msg_proxy HAS_MSG_PROXY /**/
+#$d_scm_rights HAS_SCM_RIGHTS /**/
+
+/* HAS_SQRTL:
+ * This symbol, if defined, indicates that the sqrtl routine is
+ * available to do long double square roots.
+ */
+#$d_sqrtl HAS_SQRTL /**/
+
+/* USE_STAT_BLOCKS:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_blksize and st_blocks.
+ */
+#ifndef USE_STAT_BLOCKS
+#$d_statblks USE_STAT_BLOCKS /**/
+#endif
+
+/* HAS_STRUCT_STATFS_F_FLAGS:
+ * This symbol, if defined, indicates that the struct statfs
+ * does have the f_flags member containing the mount flags of
+ * the filesystem containing the file.
+ * This kind of struct statfs is coming from <sys/mount.h> (BSD 4.3),
+ * not from <sys/statfs.h> (SYSV). Older BSDs (like Ultrix) do not
+ * have statfs() and struct statfs, they have ustat() and getmnt()
+ * with struct ustat and struct fs_data.
+ */
+#$d_statfs_f_flags HAS_STRUCT_STATFS_F_FLAGS /**/
+
+/* HAS_STRUCT_STATFS:
+ * This symbol, if defined, indicates that the struct statfs
+ * to do statfs() is supported.
+ */
+#$d_statfs_s HAS_STRUCT_STATFS /**/
+
+/* HAS_FSTATVFS:
+ * This symbol, if defined, indicates that the fstatvfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+#$d_fstatvfs HAS_FSTATVFS /**/
+
+/* USE_STDIO_PTR:
+ * This symbol is defined if the _ptr and _cnt fields (or similar)
+ * of the stdio FILE structure can be used to access the stdio buffer
+ * for a file handle. If this is defined, then the FILE_ptr(fp)
+ * and FILE_cnt(fp) macros will also be defined and should be used
+ * to access these fields.
+ */
+/* FILE_ptr:
+ * This macro is used to access the _ptr field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_PTR_LVALUE:
+ * This symbol is defined if the FILE_ptr macro can be used as an
+ * lvalue.
+ */
+/* FILE_cnt:
+ * This macro is used to access the _cnt field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_CNT_LVALUE:
+ * This symbol is defined if the FILE_cnt macro can be used as an
+ * lvalue.
+ */
+#$d_stdstdio USE_STDIO_PTR /**/
+#ifdef USE_STDIO_PTR
+#define FILE_ptr(fp) $stdio_ptr
+#$d_stdio_ptr_lval STDIO_PTR_LVALUE /**/
+#define FILE_cnt(fp) $stdio_cnt
+#$d_stdio_cnt_lval STDIO_CNT_LVALUE /**/
+#endif
+
+/* USE_STDIO_BASE:
+ * This symbol is defined if the _base field (or similar) of the
+ * stdio FILE structure can be used to access the stdio buffer for
+ * a file handle. If this is defined, then the FILE_base(fp) macro
+ * will also be defined and should be used to access this field.
+ * Also, the FILE_bufsiz(fp) macro will be defined and should be used
+ * to determine the number of bytes in the buffer. USE_STDIO_BASE
+ * will never be defined unless USE_STDIO_PTR is.
+ */
+/* FILE_base:
+ * This macro is used to access the _base field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_BASE is defined.
+ */
+/* FILE_bufsiz:
+ * This macro is used to determine the number of bytes in the I/O
+ * buffer pointed to by _base field (or equivalent) of the FILE
+ * structure pointed to its argument. This macro will always be defined
+ * if USE_STDIO_BASE is defined.
+ */
+#$d_stdiobase USE_STDIO_BASE /**/
+#ifdef USE_STDIO_BASE
+#define FILE_base(fp) $stdio_base
+#define FILE_bufsiz(fp) $stdio_bufsiz
+#endif
+
+/* HAS_STRERROR:
+ * This symbol, if defined, indicates that the strerror routine is
+ * available to translate error numbers to strings. See the writeup
+ * of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ * This symbol, if defined, indicates that the sys_errlist array is
+ * available to translate error numbers to strings. The extern int
+ * sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ * This preprocessor symbol is defined as a macro if strerror() is
+ * not available to translate error numbers to strings but sys_errlist[]
+ * array is there.
+ */
+#$d_strerror HAS_STRERROR /**/
+#$d_syserrlst HAS_SYS_ERRLIST /**/
+#define Strerror(e) $d_strerrm
+
+/* HAS_STRTOLD:
+ * This symbol, if defined, indicates that the strtold routine is
+ * available to convert strings to long doubles.
+ */
+#$d_strtold HAS_STRTOLD /**/
+
+/* HAS_STRTOLL:
+ * This symbol, if defined, indicates that the strtoll routine is
+ * available to convert strings to long longs.
+ */
+#$d_strtoll HAS_STRTOLL /**/
+
+/* HAS_STRTOULL:
+ * This symbol, if defined, indicates that the strtoull routine is
+ * available to convert strings to unsigned long longs.
+ */
+#$d_strtoull HAS_STRTOULL /**/
+
+/* HAS_STRTOUQ:
+ * This symbol, if defined, indicates that the strtouq routine is
+ * available to convert strings to unsigned long longs (quads).
+ */
+#$d_strtouq HAS_STRTOUQ /**/
+
+/* HAS_TELLDIR_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the telldir() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern long telldir _((DIR*));
+ */
+#$d_telldirproto HAS_TELLDIR_PROTO /**/
+
+/* Time_t:
+ * This symbol holds the type returned by time(). It can be long,
+ * or time_t on BSD sites (in which case <sys/types.h> should be
+ * included).
+ */
+#define Time_t $timetype /* Time type */
+
+/* HAS_TIMES:
+ * This symbol, if defined, indicates that the times() routine exists.
+ * Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+#$d_times HAS_TIMES /**/
/* HAS_UNION_SEMUN:
* This symbol, if defined, indicates that the union semun is
@@ -1729,6 +2141,17 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#$d_semctl_semun USE_SEMCTL_SEMUN /**/
#$d_semctl_semid_ds USE_SEMCTL_SEMID_DS /**/
+/* HAS_USTAT:
+ * This symbol, if defined, indicates that the ustat system call is
+ * available to query file system statistics by dev_t.
+ */
+#$d_ustat HAS_USTAT /**/
+
+/* HAS_VFORK:
+ * This symbol, if defined, indicates that vfork() exists.
+ */
+#$d_vfork HAS_VFORK /**/
+
/* Signal_t:
* This symbol's value is either "void" or "int", corresponding to the
* appropriate return type of a signal handler. Thus, you can declare
@@ -1737,25 +2160,175 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#define Signal_t $signal_t /* Signal handler's return type */
+/* HAS_VPRINTF:
+ * This symbol, if defined, indicates that the vprintf routine is available
+ * to printf with a pointer to an argument list. If unavailable, you
+ * may need to write your own, probably in terms of _doprnt().
+ */
+/* USE_CHAR_VSPRINTF:
+ * This symbol is defined if this system has vsprintf() returning type
+ * (char*). The trend seems to be to declare it as "int vsprintf()". It
+ * is up to the package author to declare vsprintf correctly based on the
+ * symbol.
+ */
+#$d_vprintf HAS_VPRINTF /**/
+#$d_charvspr USE_CHAR_VSPRINTF /**/
+
+/* USE_DYNAMIC_LOADING:
+ * This symbol, if defined, indicates that dynamic loading of
+ * some sort is available.
+ */
+#$usedl USE_DYNAMIC_LOADING /**/
+
+/* DOUBLESIZE:
+ * This symbol contains the size of a double, so that the C preprocessor
+ * can make decisions based on it.
+ */
+#define DOUBLESIZE $doublesize /**/
+
+/* EBCDIC:
+ * This symbol, if defined, indicates that this system uses
+ * EBCDIC encoding.
+ */
+#$ebcdic EBCDIC /**/
+
+/* FFLUSH_NULL:
+ * This symbol, if defined, tells that fflush(NULL) does flush
+ * all pending stdio output.
+ */
+/* FFLUSH_ALL:
+ * This symbol, if defined, tells that to flush
+ * all pending stdio output one must loop through all
+ * the stdio file handles stored in an array and fflush them.
+ * Note that if fflushNULL is defined, fflushall will not
+ * even be probed for and will be left undefined.
+ */
+#$fflushNULL FFLUSH_NULL /**/
+#$fflushall FFLUSH_ALL /**/
+
+/* Fpos_t:
+ * This symbol holds the type used to declare file positions in libc.
+ * It can be fpos_t, long, uint, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Fpos_t $fpostype /* File position type */
+
+/* Gid_t_f:
+ * This symbol defines the format string used for printing a Gid_t.
+ */
+#define Gid_t_f $gidformat /**/
+
+/* Gid_t_sign:
+ * This symbol holds the signedess of a Gid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Gid_t_sign $gidsign /* GID sign */
+
+/* Gid_t_size:
+ * This symbol holds the size of a Gid_t in bytes.
+ */
+#define Gid_t_size $gidsize /* GID size */
+
+/* Gid_t:
+ * This symbol holds the return type of getgid() and the type of
+ * argument to setrgid() and related functions. Typically,
+ * it is the type of group ids in the kernel. It can be int, ushort,
+ * gid_t, etc... It may be necessary to include <sys/types.h> to get
+ * any typedef'ed information.
+ */
+#define Gid_t $gidtype /* Type for getgid(), etc... */
+
/* Groups_t:
* This symbol holds the type used for the second argument to
- * getgroups() and setgropus(). Usually, this is the same as
+ * getgroups() and setgroups(). Usually, this is the same as
* gidtype (gid_t) , but sometimes it isn't.
- * It can be int, ushort, uid_t, etc...
+ * It can be int, ushort, gid_t, etc...
* It may be necessary to include <sys/types.h> to get any
* typedef'ed information. This is only required if you have
- * getgroups() or setgropus()..
+ * getgroups() or setgroups()..
*/
#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
#define Groups_t $groupstype /* Type for 2nd arg to [sg]etgroups() */
#endif
+/* DB_Prefix_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is u_int32_t.
+ */
+/* DB_Hash_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is size_t.
+ */
+#define DB_Hash_t $db_hashtype /**/
+#define DB_Prefix_t $db_prefixtype /**/
+
+/* I_GRP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <grp.h>.
+ */
+/* GRPASSWD:
+ * This symbol, if defined, indicates to the C program that struct group
+ * in <grp.h> contains gr_passwd.
+ */
+#$i_grp I_GRP /**/
+#$d_grpasswd GRPASSWD /**/
+
+/* I_ICONV:
+ * This symbol, if defined, indicates that <iconv.h> exists and
+ * should be included.
+ */
+#$i_iconv I_ICONV /**/
+
+/* I_IEEEFP:
+ * This symbol, if defined, indicates that <ieeefp.h> exists and
+ * should be included.
+ */
+#$i_ieeefp I_IEEEFP /**/
+
+/* I_INTTYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <inttypes.h>.
+ */
+#$i_inttypes I_INTTYPES /**/
+
+/* I_MACH_CTHREADS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <mach/cthreads.h>.
+ */
+#$i_machcthr I_MACH_CTHREADS /**/
+
+/* I_MNTENT:
+ * This symbol, if defined, indicates that <mntent.h> exists and
+ * should be included.
+ */
+#$i_mntent I_MNTENT /**/
+
/* I_NETDB:
* This symbol, if defined, indicates that <netdb.h> exists and
* should be included.
*/
#$i_netdb I_NETDB /**/
+/* I_NETINET_TCP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/tcp.h>.
+ */
+#$i_netinettcp I_NETINET_TCP /**/
+
+/* I_POLL:
+ * This symbol, if defined, indicates that <poll.h> exists and
+ * should be included.
+ */
+#$i_poll I_POLL /**/
+
+/* I_PTHREAD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <pthread.h>.
+ */
+#$i_pthread I_PTHREAD /**/
+
/* I_PWD:
* This symbol, if defined, indicates to the C program that it should
* include <pwd.h>.
@@ -1792,18 +2365,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
* This symbol, if defined, indicates to the C program that struct passwd
* contains pw_passwd.
*/
-/* HAS_SETPWENT:
- * This symbol, if defined, indicates that the getpwrent routine is
- * available for initializing sequential access of the passwd database.
- */
-/* HAS_GETPWENT:
- * This symbol, if defined, indicates that the getpwent routine is
- * available for sequential access of the password database.
- */
-/* HAS_ENDPWENT:
- * This symbol, if defined, indicates that the getpwent routine is
- * available for finalizing sequential access of the passwd database.
- */
#$i_pwd I_PWD /**/
#$d_pwquota PWQUOTA /**/
#$d_pwage PWAGE /**/
@@ -1813,9 +2374,134 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#$d_pwcomment PWCOMMENT /**/
#$d_pwgecos PWGECOS /**/
#$d_pwpasswd PWPASSWD /**/
-#$d_setpwent HAS_SETPWENT /**/
-#$d_getpwent HAS_GETPWENT /**/
-#$d_endpwent HAS_ENDPWENT /**/
+
+/* I_SHADOW:
+ * This symbol, if defined, indicates that <shadow.h> exists and
+ * should be included.
+ */
+#$i_shadow I_SHADOW /**/
+
+/* I_SOCKS:
+ * This symbol, if defined, indicates that <socks.h> exists and
+ * should be included.
+ */
+#$i_socks I_SOCKS /**/
+
+/* I_SUNMATH:
+ * This symbol, if defined, indicates that <sunmath.h> exists and
+ * should be included.
+ */
+#$i_sunmath I_SUNMATH /**/
+
+/* I_SYSLOG:
+ * This symbol, if defined, indicates that <syslog.h> exists and
+ * should be included.
+ */
+#$i_syslog I_SYSLOG /**/
+
+/* I_SYSMODE:
+ * This symbol, if defined, indicates that <sys/mode.h> exists and
+ * should be included.
+ */
+#$i_sysmode I_SYSMODE /**/
+
+/* I_SYS_MOUNT:
+ * This symbol, if defined, indicates that <sys/mount.h> exists and
+ * should be included.
+ */
+#$i_sysmount I_SYS_MOUNT /**/
+
+/* I_SYS_STATFS:
+ * This symbol, if defined, indicates that <sys/statfs.h> exists.
+ */
+#$i_sysstatfs I_SYS_STATFS /**/
+
+/* I_SYS_STATVFS:
+ * This symbol, if defined, indicates that <sys/statvfs.h> exists and
+ * should be included.
+ */
+#$i_sysstatvfs I_SYS_STATVFS /**/
+
+/* I_SYSUIO:
+ * This symbol, if defined, indicates that <sys/uio.h> exists and
+ * should be included.
+ */
+#$i_sysuio I_SYSUIO /**/
+
+/* I_SYSUTSNAME:
+ * This symbol, if defined, indicates that <sys/utsname.h> exists and
+ * should be included.
+ */
+#$i_sysutsname I_SYSUTSNAME /**/
+
+/* I_SYS_VFS:
+ * This symbol, if defined, indicates that <sys/vfs.h> exists and
+ * should be included.
+ */
+#$i_sysvfs I_SYS_VFS /**/
+
+/* I_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <time.h>.
+ */
+/* I_SYS_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h>.
+ */
+/* I_SYS_TIME_KERNEL:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h> with KERNEL defined.
+ */
+#$i_time I_TIME /**/
+#$i_systime I_SYS_TIME /**/
+#$i_systimek I_SYS_TIME_KERNEL /**/
+
+/* I_USTAT:
+ * This symbol, if defined, indicates that <ustat.h> exists and
+ * should be included.
+ */
+#$i_ustat I_USTAT /**/
+
+/* PERL_INC_VERSION_LIST:
+ * This variable specifies the list of subdirectories in over
+ * which perl.c:incpush() and lib/lib.pm will automatically
+ * search when adding directories to @INC, in a format suitable
+ * for a C initialization string. See the inc_version_list entry
+ * in Porting/Glossary for more details.
+ */
+#define PERL_INC_VERSION_LIST $inc_version_list_init /**/
+
+/* INSTALL_USR_BIN_PERL:
+ * This symbol, if defined, indicates that Perl is to be installed
+ * also as /usr/bin/perl.
+ */
+#$installusrbinperl INSTALL_USR_BIN_PERL /**/
+
+/* PERL_PRIfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for output.
+ */
+/* PERL_PRIgldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'g') for output.
+ */
+#$d_PRIfldbl PERL_PRIfldbl $sPRIfldbl /**/
+#$d_PRIgldbl PERL_PRIgldbl $sPRIgldbl /**/
+
+/* Off_t:
+ * This symbol holds the type used to declare offsets in the kernel.
+ * It can be int, long, off_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+/* LSEEKSIZE:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+/* Off_t_size:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+#define Off_t $lseektype /* <offset> type */
+#define LSEEKSIZE $lseeksize /* <offset> size */
+#define Off_t_size $lseeksize /* <offset> size */
/* Free_t:
* This variable contains the return type of free(). It is usually
@@ -1832,110 +2518,183 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#$d_mymalloc MYMALLOC /**/
-/* SIG_NAME:
- * This symbol contains a list of signal names in order of
- * signal number. This is intended
- * to be used as a static array initialization, like this:
- * char *sig_name[] = { SIG_NAME };
- * The signals in the list are separated with commas, and each signal
- * is surrounded by double quotes. There is no leading SIG in the signal
- * name, i.e. SIGQUIT is known as "QUIT".
- * Gaps in the signal numbers (up to NSIG) are filled in with NUMnn,
- * etc., where nn is the actual signal number (e.g. NUM37).
- * The signal number for sig_name[i] is stored in sig_num[i].
- * The last element is 0 to terminate the list with a NULL. This
- * corresponds to the 0 at the end of the sig_num list.
- */
-/* SIG_NUM:
- * This symbol contains a list of signal numbers, in the same order as the
- * SIG_NAME list. It is suitable for static array initialization, as in:
- * int sig_num[] = { SIG_NUM };
- * The signals in the list are separated with commas, and the indices
- * within that list and the SIG_NAME list match, so it's easy to compute
- * the signal name from a number or vice versa at the price of a small
- * dynamic linear lookup.
- * Duplicates are allowed, but are moved to the end of the list.
- * The signal number corresponding to sig_name[i] is sig_number[i].
- * if (i < NSIG) then sig_number[i] == i.
- * The last element is 0, corresponding to the 0 at the end of
- * the sig_name list.
+/* Mode_t:
+ * This symbol holds the type used to declare file modes
+ * for systems calls. It is usually mode_t, but may be
+ * int or unsigned short. It may be necessary to include <sys/types.h>
+ * to get any typedef'ed information.
*/
-#define SIG_NAME $sig_name_init /**/
-#define SIG_NUM $sig_num_init /**/
+#define Mode_t $modetype /* file mode parameter for system calls */
-/* VOIDFLAGS:
- * This symbol indicates how much support of the void type is given by this
- * compiler. What various bits mean:
- *
- * 1 = supports declaration of void
- * 2 = supports arrays of pointers to functions returning void
- * 4 = supports comparisons between pointers to void functions and
- * addresses of void functions
- * 8 = suports declaration of generic void pointers
- *
- * The package designer should define VOIDUSED to indicate the requirements
- * of the package. This can be done either by #defining VOIDUSED before
- * including config.h, or by defining defvoidused in Myinit.U. If the
- * latter approach is taken, only those flags will be tested. If the
- * level of void support necessary is not present, defines void to int.
+/* VAL_O_NONBLOCK:
+ * This symbol is to be used during open() or fcntl(F_SETFL) to turn on
+ * non-blocking I/O for the file descriptor. Note that there is no way
+ * back, i.e. you cannot turn it blocking again this way. If you wish to
+ * alternatively switch between blocking and non-blocking, use the
+ * ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
*/
-#ifndef VOIDUSED
-#define VOIDUSED $defvoidused
-#endif
-#define VOIDFLAGS $voidflags
-#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
-#define void int /* is void to be avoided? */
-#define M_VOID /* Xenix strikes again */
-#endif
-
-/* ARCHLIB:
- * This variable, if defined, holds the name of the directory in
- * which the user wants to put architecture-dependent public
- * library files for $package. It is most often a local directory
- * such as /usr/local/lib. Programs using this variable must be
- * prepared to deal with filename expansion. If ARCHLIB is the
- * same as PRIVLIB, it is not defined, since presumably the
- * program already searches PRIVLIB.
+/* VAL_EAGAIN:
+ * This symbol holds the errno error code set by read() when no data was
+ * present on the non-blocking file descriptor.
*/
-/* ARCHLIB_EXP:
- * This symbol contains the ~name expanded version of ARCHLIB, to be used
- * in programs that are not prepared to deal with ~ expansion at run-time.
+/* RD_NODATA:
+ * This symbol holds the return code from read() when no data is present
+ * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
+ * not defined, then you can't distinguish between no data and EOF by
+ * issuing a read(). You'll have to find another way to tell for sure!
*/
-#$d_archlib ARCHLIB "$archlib" /**/
-#$d_archlib ARCHLIB_EXP "$archlibexp" /**/
-
-/* DLSYM_NEEDS_UNDERSCORE:
- * This symbol, if defined, indicates that we need to prepend an
- * underscore to the symbol name before calling dlsym(). This only
- * makes sense if you *have* dlsym, which we will presume is the
- * case if you're using dl_dlopen.xs.
+/* EOF_NONBLOCK:
+ * This symbol, if defined, indicates to the C program that a read() on
+ * a non-blocking file descriptor will return 0 on EOF, and not the value
+ * held in RD_NODATA (-1 usually, in that case!).
*/
-#$d_dlsymun DLSYM_NEEDS_UNDERSCORE /**/
+#define VAL_O_NONBLOCK $o_nonblock
+#define VAL_EAGAIN $eagain
+#define RD_NODATA $rd_nodata
+#$d_eofnblk EOF_NONBLOCK
-/* USE_SFIO:
- * This symbol, if defined, indicates that sfio should
- * be used.
+/* Netdb_host_t:
+ * This symbol holds the type used for the 1st argument
+ * to gethostbyaddr().
*/
-#$d_sfio USE_SFIO /**/
+/* Netdb_hlen_t:
+ * This symbol holds the type used for the 2nd argument
+ * to gethostbyaddr().
+ */
+/* Netdb_name_t:
+ * This symbol holds the type used for the argument to
+ * gethostbyname().
+ */
+/* Netdb_net_t:
+ * This symbol holds the type used for the 1st argument to
+ * getnetbyaddr().
+ */
+#define Netdb_host_t $netdb_host_type /**/
+#define Netdb_hlen_t $netdb_hlen_type /**/
+#define Netdb_name_t $netdb_name_type /**/
+#define Netdb_net_t $netdb_net_type /**/
-/* USE_DYNAMIC_LOADING:
- * This symbol, if defined, indicates that dynamic loading of
- * some sort is available.
+/* IVTYPE:
+ * This symbol defines the C type used for Perl's IV.
*/
-#$usedl USE_DYNAMIC_LOADING /**/
+/* UVTYPE:
+ * This symbol defines the C type used for Perl's UV.
+ */
+/* I8TYPE:
+ * This symbol defines the C type used for Perl's I8.
+ */
+/* U8TYPE:
+ * This symbol defines the C type used for Perl's U8.
+ */
+/* I16TYPE:
+ * This symbol defines the C type used for Perl's I16.
+ */
+/* U16TYPE:
+ * This symbol defines the C type used for Perl's U16.
+ */
+/* I32TYPE:
+ * This symbol defines the C type used for Perl's I32.
+ */
+/* U32TYPE:
+ * This symbol defines the C type used for Perl's U32.
+ */
+/* I64TYPE:
+ * This symbol defines the C type used for Perl's I64.
+ */
+/* U64TYPE:
+ * This symbol defines the C type used for Perl's U64.
+ */
+/* NVTYPE:
+ * This symbol defines the C type used for Perl's NV.
+ */
+/* IVSIZE:
+ * This symbol contains the sizeof(IV).
+ */
+/* UVSIZE:
+ * This symbol contains the sizeof(UV).
+ */
+/* I8SIZE:
+ * This symbol contains the sizeof(I8).
+ */
+/* U8SIZE:
+ * This symbol contains the sizeof(U8).
+ */
+/* I16SIZE:
+ * This symbol contains the sizeof(I16).
+ */
+/* U16SIZE:
+ * This symbol contains the sizeof(U16).
+ */
+/* I32SIZE:
+ * This symbol contains the sizeof(I32).
+ */
+/* U32SIZE:
+ * This symbol contains the sizeof(U32).
+ */
+/* I64SIZE:
+ * This symbol contains the sizeof(I64).
+ */
+/* U64SIZE:
+ * This symbol contains the sizeof(U64).
+ */
+/* NV_PRESERVES_UV:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * can preserve all the bit of a variable of type UVSIZE.
+ */
+#define IVTYPE $ivtype /**/
+#define UVTYPE $uvtype /**/
+#define I8TYPE $i8type /**/
+#define U8TYPE $u8type /**/
+#define I16TYPE $i16type /**/
+#define U16TYPE $u16type /**/
+#define I32TYPE $i32type /**/
+#define U32TYPE $u32type /**/
+#ifdef HAS_QUAD
+#define I64TYPE $i64type /**/
+#define U64TYPE $u64type /**/
+#endif
+#define NVTYPE $nvtype /**/
+#define IVSIZE $ivsize /**/
+#define UVSIZE $uvsize /**/
+#define I8SIZE $i8size /**/
+#define U8SIZE $u8size /**/
+#define I16SIZE $i16size /**/
+#define U16SIZE $u16size /**/
+#define I32SIZE $i32size /**/
+#define U32SIZE $u32size /**/
+#ifdef HAS_QUAD
+#define I64SIZE $i64size /**/
+#define U64SIZE $u64size /**/
+#endif
+#$d_nv_preserves_uv NV_PRESERVES_UV
-/* DB_Prefix_t:
- * This symbol contains the type of the prefix structure element
- * in the <db.h> header file. In older versions of DB, it was
- * int, while in newer ones it is u_int32_t.
+/* IVdf:
+ * This symbol defines the format string used for printing a Perl IV
+ * as a signed decimal integer.
*/
-/* DB_Hash_t:
- * This symbol contains the type of the prefix structure element
- * in the <db.h> header file. In older versions of DB, it was
- * int, while in newer ones it is size_t.
+/* UVuf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned decimal integer.
*/
-#define DB_Hash_t $db_hashtype /**/
-#define DB_Prefix_t $db_prefixtype /**/
+/* UVof:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned octal integer.
+ */
+/* UVxf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned hexadecimal integer.
+ */
+#define IVdf $ivdformat /**/
+#define UVuf $uvuformat /**/
+#define UVof $uvoformat /**/
+#define UVxf $uvxformat /**/
+
+/* Pid_t:
+ * This symbol holds the type used to declare process ids in the kernel.
+ * It can be int, uint, pid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Pid_t $pidtype /* PID type */
/* PRIVLIB:
* This symbol contains the name of the private library for this package.
@@ -1950,6 +2709,39 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
#define PRIVLIB "$privlib" /**/
#define PRIVLIB_EXP "$privlibexp" /**/
+/* PTRSIZE:
+ * This symbol contains the size of a pointer, so that the C preprocessor
+ * can make decisions based on it. It will be sizeof(void *) if
+ * the compiler supports (void *); otherwise it will be
+ * sizeof(char *).
+ */
+#define PTRSIZE $ptrsize /**/
+
+/* Drand01:
+ * This macro is to be used to generate uniformly distributed
+ * random numbers over the range [0., 1.[. You may have to supply
+ * an 'extern double drand48();' in your program since SunOS 4.1.3
+ * doesn't provide you with anything relevant in it's headers.
+ * See HAS_DRAND48_PROTO.
+ */
+/* Rand_seed_t:
+ * This symbol defines the type of the argument of the
+ * random seed function.
+ */
+/* seedDrand01:
+ * This symbol defines the macro to be used in seeding the
+ * random number generator (see Drand01).
+ */
+/* RANDBITS:
+ * This symbol indicates how many bits are produced by the
+ * function used to generate normalized random numbers.
+ * Values include 15, 16, 31, and 48.
+ */
+#define Drand01() $drand01 /**/
+#define Rand_seed_t $randseedtype /**/
+#define seedDrand01(x) $seedfunc((Rand_seed_t)x) /**/
+#define RANDBITS $randbits /**/
+
/* SELECT_MIN_BITS:
* This symbol holds the minimum number of bits operated by select.
* That is, if you do select(n, ...), how many bits at least will be
@@ -1959,14 +2751,55 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#define SELECT_MIN_BITS $selectminbits /**/
+/* Select_fd_set_t:
+ * This symbol holds the type used for the 2nd, 3rd, and 4th
+ * arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET
+ * is defined, and 'int *' otherwise. This is only useful if you
+ * have select(), of course.
+ */
+#define Select_fd_set_t $selecttype /**/
+
+/* SIG_NAME:
+ * This symbol contains a list of signal names in order of
+ * signal number. This is intended
+ * to be used as a static array initialization, like this:
+ * char *sig_name[] = { SIG_NAME };
+ * The signals in the list are separated with commas, and each signal
+ * is surrounded by double quotes. There is no leading SIG in the signal
+ * name, i.e. SIGQUIT is known as "QUIT".
+ * Gaps in the signal numbers (up to NSIG) are filled in with NUMnn,
+ * etc., where nn is the actual signal number (e.g. NUM37).
+ * The signal number for sig_name[i] is stored in sig_num[i].
+ * The last element is 0 to terminate the list with a NULL. This
+ * corresponds to the 0 at the end of the sig_num list.
+ */
+/* SIG_NUM:
+ * This symbol contains a list of signal numbers, in the same order as the
+ * SIG_NAME list. It is suitable for static array initialization, as in:
+ * int sig_num[] = { SIG_NUM };
+ * The signals in the list are separated with commas, and the indices
+ * within that list and the SIG_NAME list match, so it's easy to compute
+ * the signal name from a number or vice versa at the price of a small
+ * dynamic linear lookup.
+ * Duplicates are allowed, but are moved to the end of the list.
+ * The signal number corresponding to sig_name[i] is sig_number[i].
+ * if (i < NSIG) then sig_number[i] == i.
+ * The last element is 0, corresponding to the 0 at the end of
+ * the sig_name list.
+ */
+#define SIG_NAME $sig_name_init /**/
+#define SIG_NUM $sig_num_init /**/
+
/* SITEARCH:
* This symbol contains the name of the private library for this package.
* The library is private in the sense that it needn't be in anyone's
* execution path, but it should be accessible by the world. The program
* should be prepared to do ~ expansion.
* The standard distribution will put nothing in this directory.
- * Individual sites may place their own extensions and modules in
- * this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-dependent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
*/
/* SITEARCH_EXP:
* This symbol contains the ~name expanded version of SITEARCH, to be used
@@ -1981,15 +2814,52 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
* execution path, but it should be accessible by the world. The program
* should be prepared to do ~ expansion.
* The standard distribution will put nothing in this directory.
- * Individual sites may place their own extensions and modules in
- * this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-independent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
*/
/* SITELIB_EXP:
* This symbol contains the ~name expanded version of SITELIB, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
+/* SITELIB_STEM:
+ * This define is SITELIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
+ */
#define SITELIB "$sitelib" /**/
#define SITELIB_EXP "$sitelibexp" /**/
+#define SITELIB_STEM "$sitelib_stem" /**/
+
+/* Size_t_size:
+ * This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size $sizesize /* */
+
+/* Size_t:
+ * This symbol holds the type used to declare length parameters
+ * for string functions. It is usually size_t, but may be
+ * unsigned long, int, etc. It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Size_t $sizetype /* length paramater for string functions */
+
+/* Sock_size_t:
+ * This symbol holds the type used for the size argument of
+ * various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t $socksizetype /**/
+
+/* SSize_t:
+ * This symbol holds the type used by functions that return
+ * a count of bytes or an error condition. It must be a signed type.
+ * It is usually ssize_t, but may be long or int, etc.
+ * It may be necessary to include <sys/types.h> or <unistd.h>
+ * to get any typedef'ed information.
+ * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t $ssizetype /* signed count of bytes */
/* STARTPERL:
* This variable contains the string to put in front of a perl
@@ -1998,190 +2868,236 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
*/
#define STARTPERL "$startperl" /**/
-/* USE_PERLIO:
- * This symbol, if defined, indicates that the PerlIO abstraction should
- * be used throughout. If not defined, stdio should be
- * used in a fully backward compatible manner.
+/* HAS_STDIO_STREAM_ARRAY:
+ * This symbol, if defined, tells that there is an array
+ * holding the stdio streams.
*/
-#$useperlio USE_PERLIO /**/
-
-/* HAS_GETHOST_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for gethostent(), gethostbyname(), and
- * gethostbyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* STDIO_STREAM_ARRAY:
+ * This symbol tells the name of the array holding the stdio streams.
+ * Usual values include _iob, __iob, and __sF.
*/
-#$d_gethostprotos HAS_GETHOST_PROTOS /**/
+#$d_stdio_stream_array HAS_STDIO_STREAM_ARRAY /**/
+#define STDIO_STREAM_ARRAY $stdio_stream_array
-/* HAS_GETNET_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for getnetent(), getnetbyname(), and
- * getnetbyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* Uid_t_f:
+ * This symbol defines the format string used for printing a Uid_t.
*/
-#$d_getnetprotos HAS_GETNET_PROTOS /**/
+#define Uid_t_f $uidformat /**/
-/* HAS_GETPROTO_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for getprotoent(), getprotobyname(), and
- * getprotobyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* Uid_t_sign:
+ * This symbol holds the signedess of a Uid_t.
+ * 1 for unsigned, -1 for signed.
*/
-#$d_getprotoprotos HAS_GETPROTO_PROTOS /**/
+#define Uid_t_sign $uidsign /* UID sign */
-/* HAS_GETSERV_PROTOS:
- * This symbol, if defined, indicates that <netdb.h> includes
- * prototypes for getservent(), getservbyname(), and
- * getservbyaddr(). Otherwise, it is up to the program to guess
- * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+/* Uid_t_size:
+ * This symbol holds the size of a Uid_t in bytes.
*/
-#$d_getservprotos HAS_GETSERV_PROTOS /**/
+#define Uid_t_size $uidsize /* UID size */
-/* Netdb_host_t:
- * This symbol holds the type used for the 1st argument
- * to gethostbyaddr().
- */
-/* Netdb_hlen_t:
- * This symbol holds the type used for the 2nd argument
- * to gethostbyaddr().
- */
-/* Netdb_name_t:
- * This symbol holds the type used for the argument to
- * gethostbyname().
- */
-/* Netdb_net_t:
- * This symbol holds the type used for the 1st argument to
- * getnetbyaddr().
+/* Uid_t:
+ * This symbol holds the type used to declare user ids in the kernel.
+ * It can be int, ushort, uid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
*/
-#define Netdb_host_t $netdb_host_type /**/
-#define Netdb_hlen_t $netdb_hlen_type /**/
-#define Netdb_name_t $netdb_name_type /**/
-#define Netdb_net_t $netdb_net_type /**/
+#define Uid_t $uidtype /* UID type */
-/* Select_fd_set_t:
- * This symbol holds the type used for the 2nd, 3rd, and 4th
- * arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET
- * is defined, and 'int *' otherwise. This is only useful if you
- * have select(), of course.
- */
-#define Select_fd_set_t $selecttype /**/
+/* USE_64_BIT_INT:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be employed (be they 32 or 64 bits). The minimal possible
+ * 64-bitness is used, just enough to get 64-bit integers into Perl.
+ * This may mean using for example "long longs", while your memory
+ * may still be limited to 2 gigabytes.
+ */
+/* USE_64_BIT_ALL:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be used (be they 32 or 64 bits). The maximal possible
+ * 64-bitness is employed: LP64 or ILP64, meaning that you will
+ * be able to use more than 2 gigabytes of memory. This mode is
+ * even more binary incompatible than USE_64_BIT_INT. You may not
+ * be able to run the resulting executable in a 32-bit CPU at all or
+ * you may need at least to reboot your OS to 64-bit mode.
+ */
+#ifndef USE_64_BIT_INT
+#$use64bitint USE_64_BIT_INT /**/
+#endif
-/* ARCHNAME:
- * This symbol holds a string representing the architecture name.
- * It may be used to construct an architecture-dependant pathname
- * where library files may be held under a private library, for
- * instance.
- */
-#define ARCHNAME "$archname" /**/
+#ifndef USE_64_BIT_ALL
+#$use64bitall USE_64_BIT_ALL /**/
+#endif
-/* I_MACH_CTHREADS:
- * This symbol, if defined, indicates to the C program that it should
- * include <mach/cthreads.h>.
+/* USE_LARGE_FILES:
+ * This symbol, if defined, indicates that large file support
+ * should be used when available.
*/
-#$i_machcthreads I_MACH_CTHREADS /**/
+#ifndef USE_LARGE_FILES
+#$uselargefiles USE_LARGE_FILES /**/
+#endif
-/* I_PTHREAD:
- * This symbol, if defined, indicates to the C program that it should
- * include <pthread.h>.
+/* USE_LONG_DOUBLE:
+ * This symbol, if defined, indicates that long doubles should
+ * be used when available.
*/
-#$i_pthread I_PTHREAD /**/
+#ifndef USE_LONG_DOUBLE
+#$uselongdouble USE_LONG_DOUBLE /**/
+#endif
-/* HAS_PTHREAD_YIELD:
- * This symbol, if defined, indicates that the pthread_yield
- * routine is available to yield the execution of the current
- * thread.
+/* USE_MORE_BITS:
+ * This symbol, if defined, indicates that 64-bit interfaces and
+ * long doubles should be used when available.
*/
-/* HAS_SCHED_YIELD:
- * This symbol, if defined, indicates that the sched_yield
- * routine is available to yield the execution of the current
- * thread.
+#ifndef USE_MORE_BITS
+#$usemorebits USE_MORE_BITS /**/
+#endif
+
+/* MULTIPLICITY:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use multiplicity.
*/
-#$d_pthread_yield HAS_PTHREAD_YIELD /**/
-#$d_sched_yield HAS_SCHED_YIELD /**/
+#ifndef MULTIPLICITY
+#$usemultiplicity MULTIPLICITY /**/
+#endif
-/* PTHREADS_CREATED_JOINABLE:
- * This symbol, if defined, indicates that pthreads are created
- * in the joinable (aka undetached) state.
+/* USE_PERLIO:
+ * This symbol, if defined, indicates that the PerlIO abstraction should
+ * be used throughout. If not defined, stdio should be
+ * used in a fully backward compatible manner.
*/
-#$d_pthreads_created_joinable PTHREADS_CREATED_JOINABLE /**/
+#ifndef USE_PERLIO
+#$useperlio USE_PERLIO /**/
+#endif
-/* USE_THREADS:
+/* USE_SOCKS:
* This symbol, if defined, indicates that Perl should
- * be built to use threads.
+ * be built to use socks.
+ */
+#ifndef USE_SOCKS
+#$usesocks USE_SOCKS /**/
+#endif
+
+/* USE_ITHREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the interpreter-based threading implementation.
+ */
+/* USE_5005THREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the 5.005-based threading implementation.
*/
/* OLD_PTHREADS_API:
* This symbol, if defined, indicates that Perl should
* be built to use the old draft POSIX threads API.
*/
-#$usethreads USE_THREADS /**/
+#$use5005threads USE_5005THREADS /**/
+#$useithreads USE_ITHREADS /**/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define USE_THREADS /* until src is revised*/
+#endif
#$d_oldpthreads OLD_PTHREADS_API /**/
-/* Time_t:
- * This symbol holds the type returned by time(). It can be long,
- * or time_t on BSD sites (in which case <sys/types.h> should be
- * included).
- */
-#define Time_t $timetype /* Time type */
-
-/* HAS_TIMES:
- * This symbol, if defined, indicates that the times() routine exists.
- * Note that this became obsolete on some systems (SUNOS), which now
- * use getrusage(). It may be necessary to include <sys/times.h>.
+/* PERL_VENDORARCH:
+ * If defined, this symbol contains the name of a private library.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world.
+ * It may have a ~ on the front.
+ * The standard distribution will put nothing in this directory.
+ * Vendors who distribute perl may wish to place their own
+ * architecture-dependent modules and extensions in this directory with
+ * MakeMaker Makefile.PL INSTALLDIRS=vendor
+ * or equivalent. See INSTALL for details.
*/
-#$d_times HAS_TIMES /**/
-
-/* Fpos_t:
- * This symbol holds the type used to declare file positions in libc.
- * It can be fpos_t, long, uint, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* PERL_VENDORARCH_EXP:
+ * This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define Fpos_t $fpostype /* File position type */
+#$d_vendorarch PERL_VENDORARCH "$vendorarch" /**/
+#$d_vendorarch PERL_VENDORARCH_EXP "$vendorarchexp" /**/
-/* Gid_t:
- * This symbol holds the return type of getgid() and the type of
- * argument to setrgid() and related functions. Typically,
- * it is the type of group ids in the kernel. It can be int, ushort,
- * uid_t, etc... It may be necessary to include <sys/types.h> to get
- * any typedef'ed information.
+/* PERL_VENDORLIB_EXP:
+ * This symbol contains the ~name expanded version of VENDORLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
*/
-#define Gid_t $gidtype /* Type for getgid(), etc... */
-
-/* Off_t:
- * This symbol holds the type used to declare offsets in the kernel.
- * It can be int, long, off_t, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* PERL_VENDORLIB_STEM:
+ * This define is PERL_VENDORLIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
*/
-#define Off_t $lseektype /* <offset> type */
+#$d_vendorlib PERL_VENDORLIB_EXP "$vendorlibexp" /**/
+#$d_vendorlib PERL_VENDORLIB_STEM "$vendorlib_stem" /**/
-/* Mode_t:
- * This symbol holds the type used to declare file modes
- * for systems calls. It is usually mode_t, but may be
- * int or unsigned short. It may be necessary to include <sys/types.h>
- * to get any typedef'ed information.
+/* VOIDFLAGS:
+ * This symbol indicates how much support of the void type is given by this
+ * compiler. What various bits mean:
+ *
+ * 1 = supports declaration of void
+ * 2 = supports arrays of pointers to functions returning void
+ * 4 = supports comparisons between pointers to void functions and
+ * addresses of void functions
+ * 8 = suports declaration of generic void pointers
+ *
+ * The package designer should define VOIDUSED to indicate the requirements
+ * of the package. This can be done either by #defining VOIDUSED before
+ * including config.h, or by defining defvoidused in Myinit.U. If the
+ * latter approach is taken, only those flags will be tested. If the
+ * level of void support necessary is not present, defines void to int.
*/
-#define Mode_t $modetype /* file mode parameter for system calls */
+#ifndef VOIDUSED
+#define VOIDUSED $defvoidused
+#endif
+#define VOIDFLAGS $voidflags
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int /* is void to be avoided? */
+#define M_VOID /* Xenix strikes again */
+#endif
-/* Pid_t:
- * This symbol holds the type used to declare process ids in the kernel.
- * It can be int, uint, pid_t, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
- */
-#define Pid_t $pidtype /* PID type */
+/* PERL_XS_APIVERSION:
+ * This variable contains the version of the oldest perl binary
+ * compatible with the present perl. perl.c:incpush() and
+ * lib/lib.pm will automatically search in $sitearch for older
+ * directories across major versions back to xs_apiversion.
+ * This is only useful if you have a perl library directory tree
+ * structured like the default one.
+ * See INSTALL for how this works.
+ * The versioned site_perl directory was introduced in 5.005,
+ * so that is the lowest possible value.
+ * Since this can depend on compile time options (such as
+ * bincompat) it is set by Configure. Other non-default sources
+ * of potential incompatibility, such as multiplicity, threads,
+ * debugging, 64bits, sfio, etc., are not checked for currently,
+ * though in principle we could go snooping around in old
+ * Config.pm files.
+ */
+/* PERL_PM_APIVERSION:
+ * This variable contains the version of the oldest perl
+ * compatible with the present perl. (That is, pure perl modules
+ * written for pm_apiversion will still work for the current
+ * version). perl.c:incpush() and lib/lib.pm will automatically
+ * search in $sitelib for older directories across major versions
+ * back to pm_apiversion. This is only useful if you have a perl
+ * library directory tree structured like the default one. The
+ * versioned site_perl library was introduced in 5.005, so that's
+ * the default setting for this variable. It's hard to imagine
+ * it changing before Perl6. It is included here for symmetry
+ * with xs_apiveprsion -- the searching algorithms will
+ * (presumably) be similar.
+ * See the INSTALL file for how this works.
+ */
+#define PERL_XS_APIVERSION "$xs_apiversion"
+#define PERL_PM_APIVERSION "$pm_apiversion"
-/* Size_t:
- * This symbol holds the type used to declare length parameters
- * for string functions. It is usually size_t, but may be
- * unsigned long, int, etc. It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* HAS_LCHOWN:
+ * This symbol, if defined, indicates that the lchown routine is
+ * available to operate on a symbolic link (instead of following the
+ * link).
*/
-#define Size_t $sizetype /* length paramater for string functions */
+#$d_lchown HAS_LCHOWN /**/
-/* Uid_t:
- * This symbol holds the type used to declare user ids in the kernel.
- * It can be int, ushort, uid_t, etc... It may be necessary to include
- * <sys/types.h> to get any typedef'ed information.
+/* FLEXFILENAMES:
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
*/
-#define Uid_t $uidtype /* UID type */
+#$d_flexfnam FLEXFILENAMES /**/
#endif
!GROK!THIS!
diff --git a/contrib/perl5/configpm b/contrib/perl5/configpm
index ba07f14..c64af8a 100755
--- a/contrib/perl5/configpm
+++ b/contrib/perl5/configpm
@@ -17,17 +17,33 @@ my $glossary = $ARGV[1] || 'Porting/Glossary';
open CONFIG, ">$config_pm" or die "Can't open $config_pm: $!\n";
-$myver = $];
+$myver = sprintf "v%vd", $^V;
-print CONFIG <<"ENDOFBEG";
+print CONFIG <<'ENDOFBEG_NOQ', <<"ENDOFBEG";
package Config;
use Exporter ();
-\@ISA = (Exporter);
-\@EXPORT = qw(%Config);
-\@EXPORT_OK = qw(myconfig config_sh config_vars);
+@EXPORT = qw(%Config);
+@EXPORT_OK = qw(myconfig config_sh config_vars);
+
+# Define our own import method to avoid pulling in the full Exporter:
+sub import {
+ my $pkg = shift;
+ @_ = @EXPORT unless @_;
+ my @func = grep {$_ ne '%Config'} @_;
+ local $Exporter::ExportLevel = 1;
+ Exporter::import('Config', @func) if @func;
+ return if @func == @_;
+ my $callpkg = caller(0);
+ *{"$callpkg\::Config"} = \%Config;
+}
+
+ENDOFBEG_NOQ
+die "Perl lib version ($myver) doesn't match executable version (\$])"
+ unless \$^V;
-\$] == $myver
- or die "Perl lib version ($myver) doesn't match executable version (\$])";
+\$^V eq $myver
+ or die "Perl lib version ($myver) doesn't match executable version (" .
+ (sprintf "v%vd",\$^V) . ")";
# This file was created by configpm when Perl was built. Any changes
# made to this file will be lost the next time perl is built.
@@ -44,8 +60,21 @@ $in_v = 0;
while (<>) {
next if m:^#!/bin/sh:;
- # Catch CONFIG=true and PATCHLEVEL=n line from Configure.
+ # Catch CONFIGDOTSH=true and PERL_VERSION=n line from Configure.
s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/;
+ my ($k,$v) = ($1,$2);
+ # grandfather PATCHLEVEL and SUBVERSION and CONFIG
+ if ($k) {
+ if ($k eq 'PERL_VERSION') {
+ push @v_others, "PATCHLEVEL='$v'\n";
+ }
+ elsif ($k eq 'PERL_SUBVERSION') {
+ push @v_others, "SUBVERSION='$v'\n";
+ }
+ elsif ($k eq 'CONFIGDOTSH') {
+ push @v_others, "CONFIG='$v'\n";
+ }
+ }
# We can delimit things in config.sh with either ' or ".
unless ($in_v or m/^(\w+)=(['"])(.*\n)/){
push(@non_v, "#$_"); # not a name='value' line
@@ -68,11 +97,11 @@ print CONFIG "\n",
join("", @v_fast, sort @v_others),
"!END!\n\n";
-# copy config summary format from the myconfig script
+# copy config summary format from the myconfig.SH script
print CONFIG "my \$summary = <<'!END!';\n";
-open(MYCONFIG,"<myconfig") || die "open myconfig failed: $!";
+open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
do { print CONFIG $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
close(MYCONFIG);
@@ -401,11 +430,11 @@ require $config_pm;
import Config;
die "$0: $config_pm not valid"
- unless $Config{'CONFIG'} eq 'true';
+ unless $Config{'CONFIGDOTSH'} eq 'true';
die "$0: error processing $config_pm"
if defined($Config{'an impossible name'})
- or $Config{'CONFIG'} ne 'true' # test cache
+ or $Config{'CONFIGDOTSH'} ne 'true' # test cache
;
die "$0: error processing $config_pm"
diff --git a/contrib/perl5/configure.com b/contrib/perl5/configure.com
index d51793a..003a047 100644
--- a/contrib/perl5/configure.com
+++ b/contrib/perl5/configure.com
@@ -4,34 +4,33 @@ $!
$! For example, if you unpacked perl into: [USER.PERL5_00n...] then you will
$! want to cd into the tree and execute Configure:
$!
-$! $ SET DEFAULT [USER.PERL5_00n]
+$! $ SET DEFAULT [USER.PERL5_xxx]
$! $ @Configure
$!
$! or
$!
-$! $ SET DEFAULT [USER.PERL5_00n]
+$! $ SET DEFAULT [USER.PERL5_xxx]
$! $ @Configure "-des"
$!
$! That's it. If you get into a bind trying to build perl on VMS then
$! definitely read through the README.VMS file.
-$! Beyond that send email to VMSPerl@cor.newman.upenn.edu
+$! Beyond that send email to vmsperl@perl.org
$!
$! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$!
$! send suggestions to:
-$! Dan Sugalski <sugalskd@ous.edu>
+$! Dan Sugalski <dan@sidhe.org>
$! Thank you!!!!
$!
$! Adapted and converted from Larry Wall & Andy Dougherty's
$! "Configure generated by metaconfig 3.0 PL60." by Peter Prymmer
-$! (a Bourne sh[ell] script for configuring the installation of perl on VMS)
-$! in the perl5.002|3 epoch (spring/summer 1996)
+$! (a Bourne sh[ell] script for configuring the installation of perl
+$! on non-VMS systems) in the perl5.002|3 epoch (spring/summer 1996)
$! with much valuable help from Charles Bailey &
$! the whole VMSPerl crew.
$! Extended and messed about with by Dan Sugalski
$!
-$! SET NOVERIFY
-$ sav_ver = F$VERIFY(sav_ver)
+$ sav_ver = F$VERIFY(0)
$!
$! VMS-isms we will need:
$ echo = "write sys$output "
@@ -39,16 +38,24 @@ $ cat = "type"
$ gcc_symbol = "gcc"
$ ans = ""
$ macros = ""
-$ use_debugging_perl = "Y"
+$ extra_flags = ""
+$ user_c_flags = ""
+$ use_ieee_math = "n"
+$ be_case_sensitive = "n"
+$ use_vmsdebug_perl = "n"
+$ use64bitall = "n"
+$ use64bitint = "n"
$ C_Compiler_Replace = "CC="
$ Thread_Live_Dangerously = "MT="
$ use_two_pot_malloc = "N"
$ use_pack_malloc = "N"
$ use_debugmalloc = "N"
-$ preload_env = "N"
+$ d_secintgenv = "N"
+$ cc_flags = ""
+$ use_multiplicity = "N"
$ vms_default_directory_name = F$ENVIRONMENT("DEFAULT")
-$! max_allowed_dir_depth = 3 ! e.g. [A.B.PERL5_00n] not [A.B.C.PERL5_00n]
-$ max_allowed_dir_depth = 2 ! e.g. [FOO.PERL5_00n] not [FOO.BAR.PERL5_00n]
+$ max_allowed_dir_depth = 3 ! e.g. [A.B.PERL5_xxx] not [A.B.C.PERL5_xxx]
+$! max_allowed_dir_depth = 2 ! e.g. [A.PERL5_xxx] not [A.B.PERL5_xxx]
$!
$ vms_filcnt = F$GETJPI ("","FILCNT")
$!
@@ -110,6 +117,7 @@ $!
$!: set up default values
$ fastread=""
$ reuseval="false"
+$ maniskip = "false"
$ config_sh=""
$ alldone=""
$ error=""
@@ -118,18 +126,24 @@ $ extractsh=""
$ override=""
$ knowitall=""
$ Using_Dec_C = ""
-$ Using_Vax_C = ""
$ Using_Gnu_C = ""
$ Dec_C_Version = ""
$ use_threads = "F"
+$ use_5005_threads = "N"
+$ use_ithreads = "N"
$!
$!: option parsing
+$ config_args = ""
$ IF (P1 .NES. "")
$ THEN !one or more switches was thrown
$ i = 1
$ bang = 0
$Param_loop:
-$ IF (P'i'.NES."") THEN bang = bang + 1
+$ IF (P'i'.NES."")
+$ THEN
+$ bang = bang + 1
+$ config_args = config_args + F$FAO(" !AS",P'i')
+$ ENDIF
$ i = i + 1
$ IF (i.LT.9) THEN GOTO Param_loop !DCL allows P1..P8
$!
@@ -162,8 +176,8 @@ $ P'i' = P'i' - "f"
$ config_sh = P'i'
$ IF (F$SEARCH(config_sh).NES."")
$ THEN
-$ test = F$FILE_ATTRIBUTES(config_sh,"PRO")
-$ IF (F$LOCATE("R",test).NE.F$LENGTH(test))
+$ test_config_sh = F$FILE_ATTRIBUTES(config_sh,"PRO")
+$ IF (F$LOCATE("R",test_config_sh).NE.F$LENGTH(test_config_sh))
$ THEN
$ CONTINUE !at this point check UIC && if test allows...
$ !to be continued ?
@@ -184,6 +198,13 @@ $ gotopt = "t"
$ P'i' = P'i' - "h"
$ gotshortopt = "t"
$ ENDIF
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "m")
+$ THEN
+$ maniskip = "true"
+$ gotopt = "t"
+$ P'i' = P'i' - "m"
+$ gotshortopt = "t"
+$ ENDIF
$ IF (F$EXTRACT(0,1,P'i') .EQS. "r")
$ THEN
$ reuseval = "true"
@@ -283,17 +304,19 @@ $ i = i + 1
$ IF (i .LT. (bang + 1)) THEN GOTO Opt_loop
$!
$ ENDIF ! (P1 .NES. "")
+$ config_args = F$EDIT(config_args,"TRIM")
$!
$ IF (error)
$ THEN
$ me = F$PARSE(me,,,"DIRECTORY")+ F$PARSE(me,,,"NAME")
-$ echo "Usage: @''me' [-dehrEKOSV] [-fconfig.sh] [-Dsymbol] [-Dsymbol=value]"
-$ echo " [-Usymbol] [-Usymbol=]"
+$ echo "Usage: @''me' [-dehmrEKOSV] [-fconfig.sh] [-Dsymbol] [-Dsymbol=value]"
+$ echo " [-Usymbol] [-Usymbol=]"
$ TYPE SYS$INPUT
"-d" : use defaults for all answers.
"-e" : go on without questioning past the production of config.sh. *
"-f" : specify an alternate default configuration file.
"-h" : print this help message and exit (with an error status).
+ "-m" : skip the MANIFEST check to see that all files are present
"-r" : reuse C symbols value if possible (skips costly nm extraction).*
"-s" : silent mode, only echoes questions and essential information.
-"D" : define symbol to have some value: *
@@ -319,11 +342,19 @@ $!
$ GOTO Check_silence
$!
$Shut_up:
-$ STDOUT = F$TRNLNM("SYS$OUTPUT")
+$ IF F$Mode() .eqs. "BATCH"
+$ THEN
+$ STDOUT = F$GetQuI("DISPLAY_JOB","LOG_SPECIFICATION",,"THIS_JOB")
+$ WRITE SYS$OUTPUT "Warning: Executing in batch mode. To avoid file locking conflicts,"
+$ WRITE SYS$OUTPUT "output intended for SYS$OUTPUT will be sent to a new version"
+$ WRITE SYS$OUTPUT STDOUT
+$ ELSE
+$ STDOUT = F$TRNLNM("SYS$OUTPUT")
+$ ENDIF
$ DEFINE SYS$OUTPUT "_NLA0:"
$ echo4 = "write STDOUT "
$ cat4 = "TYPE/OUTPUT=''STDOUT'"
-$ open/write STDOUT 'STDOUT'
+$ open/write/share=read STDOUT 'STDOUT'
$ RETURN
$!
$Check_silence:
@@ -341,6 +372,7 @@ $! maybe someday
$!
$!: set package name
$ package = "perl5"
+$ packageup = F$EDIT((package - "5"),"UPCASE")
$!
$!: Eunice requires " " instead of "", can you believe it
$ echo ""
@@ -382,7 +414,7 @@ $ ELSE
$! MANIFEST. has been found and we have set def'ed there -
$! time to bail out before it's too late.
$ tmp = f$extract(1,3,f$edit(f$getsyi("VERSION"),"TRIM,COLLAPSE"))
-$ IF tmp .GES. "7.2" THEN GOTO Beyond_depth_check
+$ IF (tmp .GES. "7.2") .AND. (F$GETSYI("HW_MODEL") .GE. 1024) THEN GOTO Beyond_depth_check
$ IF (F$ELEMENT(max_allowed_dir_depth,".",F$ENVIRONMENT("Default")).nes.".")
$ THEN
$ TYPE SYS$INPUT:
@@ -417,8 +449,11 @@ $!
$ OPEN/WRITE MISSING MISSING.
$!change to "FALSE" if you wish to skip the manifest search
$!(which after all is rather slow in DCL :-)
-$ IF ("TRUE")
+$ IF (maniskip)
$ THEN
+$ echo "Skipping MANIFEST check as requested"
+$ ELSE
+$!
$ OPEN/READ CONFIG 'manifestfound'
$Read_loop_manifest:
$ READ/END_OF_FILE = Done_manifest CONFIG line
@@ -466,6 +501,19 @@ $ IF (((f$length(file_2_find)+1) .eq. f$length(basename)) .and. -
$ file_2_find = dirname + basename
$!
$ found = F$SEARCH(file_2_find)
+$ IF (found .EQS. "" .AND. dots .GT. 2)
+$ THEN
+$! 17-DEC-1999 Improved to turn "[.foo.bar]baz.c_buz" into
+$! "[.foo.bar]baz_c.buz" to cover unzipped archives and put
+$! "[.foo.bar]baz.c_buz,baz_c.buz" into missing list if neither is found.
+$ basename[f$locate(".",basename),1] := _
+$ dot_ele = F$ELEMENT(dots - 1,"_",basename)
+$ basename = -
+ f$extract(0,f$length(basename)-(f$length(dot_ele)+1),basename) -
+ + "." + dot_ele
+$ found = F$SEARCH(dirname + basename)
+$ file_2_find = file_2_find + "," + basename
+$ ENDIF
$ IF (found .EQS. "")
$ THEN
$ WRITE MISSING file_2_find
@@ -495,7 +543,7 @@ THIS PACKAGE SEEMS TO BE INCOMPLETE.
You have the option of continuing the configuration process, despite the
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 (sugalskd@ous.edu).
+and contact the author (dan@sidhe.org)
$ READ SYS$COMMAND/PROMPT="Continue? [n] " ans
$ IF ans
@@ -561,7 +609,7 @@ $ user = F$EDIT(F$GETJPI("","USERNAME"),"TRIM,COLLAPSE")
$ IF .NOT.(F$SEARCH("[-.CONFIG]INSTRUCT.").EQS."")
$ THEN
$ messages = F$ENVIRONMENT("MESSAGE")
-$ SET MESSAGE/NOFAC/NOSEV/NOIDENT/NOTEXT !sorry :-(
+$ SET MESSAGE/NOFAC/NOSEV/NOIDENT/NOTEXT
$ contains /NOOUTPUT [-.CONFIG]INSTRUCT. 'user'
$ IF .NOT.($status.EQ.%X08D78053)
$ THEN
@@ -571,7 +619,7 @@ $ rp = "Would you like to see the instructions? [''dflt'] "
$ GOSUB myread
$ if .NOT.ans THEN needman=""
$ ENDIF
-$ SET MESSAGE 'messages' !hope you made it here :-)
+$ SET MESSAGE 'messages'
$ ENDIF
$ if (fastread.AND.silent.AND.(alldone.eqs."cont")) THEN needman=""
$!
@@ -589,9 +637,9 @@ brackets; typing carriage return will give you the default.
$ READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
$ TYPE SYS$INPUT:
-In a hurry? You may run '@Configure -d'. This will bypass nearly all
+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
+there was already a config.sh file). Type '@Configure "-h"' for a list of
options.
$ READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
@@ -600,7 +648,7 @@ $ TYPE SYS$INPUT:
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
best bet is to edit Configure.com and @ it again. Whatever problems
-you have with Configure.com, let me (sugalskd@ous.edu) know how I blew
+you have with Configure.com, let me (dan@sidhe.org) know how I blew
it.
$!This installation script affects things in two ways:
@@ -687,7 +735,7 @@ $ TYPE SYS$INPUT:
%Config-E-VMS, ERROR:
Err, you do not appear to be running VMS!
- This package is intended to Configure the building of Perl for VMS.
+ This procedure is intended to Configure the building of Perl for VMS.
$ READ SYS$COMMAND/PROMPT="Continue anyway? [n] " ans
$ IF ans
@@ -723,7 +771,7 @@ $!: who configured the system
$! see 'user' above.
$ cf_by = F$EDIT(user,"LOWERCASE")
$! cf_time = F$CVTIME() !superceded by procedure below
-$ osvers = F$GETSYI("VERSION")
+$ osvers = F$EDIT(F$GETSYI("VERSION"),"TRIM")
$!
$! Peter Prymmer has seen:
$! "SYS$TIMEZONE_DIFFERENTIAL" = "-46800" (sic)
@@ -811,7 +859,7 @@ $!
$TZSet:
$ echo ""
$ echo "Please tell me in hh:mm form what time offset from GMT/UTC in England"
-$ echo "you are. As an example Eastern (US) Standard Time is -5:00 offset, but"
+$ echo "you are. As an example Eastern (US) Standard Time is -5:00 offset, but"
$ echo "Eastern Daylight Time (summer) is -4:00 offset."
$ dflt = "0:00"
$ rp = "Enter the Time Zone offset: [''dflt'] "
@@ -855,8 +903,14 @@ $!
$ IF (F$GETSYI("HW_MODEL") .LT. 1024)
$ THEN
$ archname = "VMS_VAX"
+$ otherarch = "an Alpha"
+$ alignbytes="8"
+$ arch_type = "ARCH-TYPE=__VAX__"
$ ELSE
$ archname = "VMS_AXP"
+$ otherarch = "a VAX"
+$ alignbytes="8"
+$ arch_type = "ARCH-TYPE=__AXP__"
$ ENDIF
$ rp = "What is your architecture name? [''archname'] "
$ GOSUB myread
@@ -868,24 +922,22 @@ $ THEN
$ echo4 "I'll go with ''archname' anyway..."
$ ENDIF
$ ENDIF
-$ IF (archname.EQS."VMS_AXP")
+$ dflt = "n"
+$ rp = "Will you be sharing your PERL_ROOT with ''otherarch'? [''dflt'] "
+$ GOSUB myread
+$ if ans.NES.""
+$ THEN
+$ ans = F$EXTRACT(0,1,F$EDIT(ans,"COLLAPSE, UPCASE"))
+$ ENDIF
+$ IF (ans.NES."Y")
$ THEN
-$ dflt = "n"
-$ rp = "Are you sharing your PERL_ROOT with a VAX? [''dflt'] "
-$ GOSUB myread
-$ if ans.NES.""
-$ THEN
-$ ans = F$EDIT(ans,"COLLAPSE, UPCASE")
-$ ENDIF
-$ IF (ans.NES."Y")
+$ sharedperl = "N"
+$ ELSE
+$ sharedperl = "Y"
+$ IF (archname.EQS."VMS_AXP")
$ THEN
-$ sharedperl = "N"
-$ ELSE
-$ sharedperl = "Y"
$ macros = macros + """AXE=1"","
$ ENDIF
-$ ELSE
-$ sharedperl = "N"
$ ENDIF
$!
$!: is AFS running? !sfn
@@ -894,44 +946,44 @@ $!: set up shell script to do ~ expansion !sfn
$!: expand filename !sfn
$!: now set up to get a file name !sfn
$!
+$ prefix = F$ENVIRONMENT("DEFAULT") - ".UU]" + "]"
+$ prefix = F$PARSE(prefix,,,,"NO_CONCEAL") - "][" - ".;"
+$ prefixbase = prefix - "]"
+$ prefix = prefixbase + ".]"
+$!: determine root of directory hierarchy where package will be installed.
+$ dflt = prefix
+$ IF .NOT.silent
+$ THEN
+$ echo ""
+$ echo "By default, ''package' will be installed in ''dflt', pod"
+$ echo "pages under ''prefixbase'LIB.POD], etc..., i.e. with ''dflt' as prefix for"
+$ echo "all installation directories."
+$ echo "On ''osname' the ''prefix' is used to DEFINE the ''packageup'_ROOT prior to installation"
+$ echo "as well as during subsequent use of ''package' via ''packageup'_SETUP.COM."
+$ ENDIF
+$ rp = "Installation prefix to use (for ''packageup'_ROOT)? [ ''dflt' ] "
+$ GOSUB myread
+$ IF ans.NES.""
+$ THEN
+$ prefix = ans
+$ IF F$LOCATE(".]",ans) .EQ. F$LENGTH(ans) THEN prefix = prefix - "]" + ".]"
+$ ELSE
+$ prefix = dflt
+$ ENDIF
+$!
+$! Check here for pre-existing PERL_ROOT.
+$! -> ask if removal desired.
+$! Check here for writability of requested PERL_ROOT if it is not the default (cwd).
+$! -> recommend letting PERL_ROOT be PERL_SRC if requested PERL_ROOT is not writable.
+$!
$ vms_skip_install = "true"
$ dflt = "y"
$! echo ""
-$ rp = "%Config-I-VMS, Do you wish to skip the """"where install"""" questions? [''dflt'] "
+$ rp = "%Config-I-VMS, Skip the remaining """"where install"""" questions? [''dflt'] "
$ GOSUB myread
$ IF (.NOT.ans).AND.(ans.NES."") THEN vms_skip_install = "false"
-$ prefix = F$ENVIRONMENT("DEFAULT") - ".UU]" + "]"
-$ prefix = f$parse(prefix,,,,"NO_CONCEAL") - "][" - ".;"
-$ prefix = prefix - "]" + ".]"
$ IF (.NOT.vms_skip_install)
$ THEN
-$!: determine root of directory hierarchy where package will be installed.
-$ dflt = "default"
-$ IF .NOT.silent
-$ THEN
-$ echo ""
-$ echo "By default, ''package' will be installed in ''dflt'/bin, manual"
-$ echo "pages under ''dflt'/man, etc..., i.e. with ''dflt' as prefix for"
-$ echo "all installation directories. Typically set to /usr/local, but you"
-$ echo "may choose /usr if you wish to install ''package' among your system
-$ ENDIF
-$ IF .NOT.silent
-$ THEN TYPE SYS$INPUT:
-binaries. If you wish to have binaries under /bin but manual pages
-under /usr/local/man, that's ok: you will be prompted separately
-for each of the installation directories, the prefix being only used
-to set the defaults.
-$ ENDIF
-$ dflt = prefix
-$ rp = "Installation prefix to use? [ ''dflt' ] "
-$ GOSUB myread
-$ IF ans.NES.""
-$ THEN
-$ prefix = ans
-$ IF F$LOCATE(".]",ans) .EQ. F$LENGTH(ans) THEN prefix = prefix - "]" + ".]"
-$ ELSE
-$ prefix = dflt
-$ ENDIF
$!
$!: set the prefixit variable, to compute a suitable default value
$!
@@ -953,10 +1005,44 @@ $ THEN privlib = ans
$ ELSE privlib = dflt
$ ENDIF
$!
-$ ENDIF !%Config-I-VMS, skip "where install" questions
+$ ENDIF !%Config-I-VMS, skip remaining "where install" questions
+$!
+$ perl_symbol = "true"
+$ perl_verb = ""
+$ dflt = "y"
+$ IF .NOT.silent
+$ THEN
+$ echo ""
+$ echo "%Config-I-VMS, You may choose to write ''packageup'_SETUP.COM to assign a foreign"
+$ echo "-Config-I-VMS, symbol to invoke ''package', which is the usual method."
+$ echO "-Config-I-VMS, If you do not do so then you would need a DCL command verb at the"
+$ echo "-Config-I-VMS, process or the system wide level."
+$ ENDIF
+$ rp = "Invoke perl as a global symbol foreign command [''dflt'] "
+$ GOSUB myread
+$ IF (.NOT.ans).AND.(ans.NES."") THEN perl_symbol = "false"
+$!
+$ IF (.NOT.perl_symbol)
+$ THEN
+$ dflt = "y"
+$ IF .NOT.silent
+$ THEN
+$ echo ""
+$ echo "%Config-I-VMS, Since you won't be using a symbol you must choose to put the ''packageup'"
+$ echo "-Config-I-VMS, verb in a per-process table or in the system wide DCLTABLES (which"
+$ echo "-Config-I-VMS, would require write privilege)."
+$ ENDIF
+$ rp = "Invoke perl as a per process command verb [ ''dflt' ] "
+$ GOSUB myread
+$ IF (.NOT.ans).AND.(ans.NES."")
+$ THEN perl_verb = "DCLTABLES"
+$ ELSE perl_verb = "PROCESS"
+$ ENDIF
+$ ENDIF ! (.NOT.perl_symbol)
$!
$!: set the base revision
$ baserev="5.0"
+$ revision = baserev - ".0"
$!: get the patchlevel
$ echo ""
$ echo4 "Getting the current patchlevel..." !>&4
@@ -965,21 +1051,42 @@ $ IF (patchlevel_h.NES."")
$ THEN
$ got_patch = "false"
$ got_sub = "false"
+$ got_api_revision = "false"
+$ got_api_version = "false"
+$ got_api_subversion = "false"
$ OPEN/READONLY CONFIG 'patchlevel_h'
$Patchlevel_h_loop:
$ READ/END_Of_File=Close_patch CONFIG line
-$ IF ((F$LOCATE("#define PATCHLEVEL",line).NE.F$LENGTH(line)).AND.(.NOT.got_patch))
+$ IF ((F$LOCATE("#define PERL_VERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_patch))
$ THEN
$ line = F$EDIT(line,"COMPRESS, TRIM")
-$ patchlevel = F$EXTRACT(18,F$LENGTH(line)-18,line)
+$ patchlevel = F$ELEMENT(2," ",line)
$ got_patch = "true"
$ ENDIF
-$ IF ((F$LOCATE("#define SUBVERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_sub))
+$ IF ((F$LOCATE("#define PERL_SUBVERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_sub))
$ THEN
$ line = F$EDIT(line,"COMPRESS, TRIM")
-$ subversion = F$EXTRACT(18,F$LENGTH(line)-18,line)
+$ subversion = F$ELEMENT(2," ",line)
$ got_sub = "true"
$ ENDIF
+$ IF ((F$LOCATE("#define PERL_API_REVISION",line).NE.F$LENGTH(line)).AND.(.NOT.got_api_revision))
+$ THEN
+$ line = F$EDIT(line,"COMPRESS, TRIM")
+$ api_revision = F$ELEMENT(2," ",line)
+$ got_api_revision = "true"
+$ ENDIF
+$ IF ((F$LOCATE("#define PERL_API_VERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_api_version))
+$ THEN
+$ line = F$EDIT(line,"COMPRESS, TRIM")
+$ api_version = F$ELEMENT(2," ",line)
+$ got_api_version = "true"
+$ ENDIF
+$ IF ((F$LOCATE("#define PERL_API_SUBVERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_api_subversion))
+$ THEN
+$ line = F$EDIT(line,"COMPRESS, TRIM")
+$ api_subversion = F$ELEMENT(2," ",line)
+$ got_api_subversion = "true"
+$ ENDIF
$ IF (.NOT.got_patch).OR.(.NOT.got_sub) THEN GOTO Patchlevel_h_loop
$Close_patch:
$ CLOSE CONFIG
@@ -987,24 +1094,14 @@ $ ELSE
$ patchlevel="0"
$ subversion="0"
$ ENDIF
-$ echo "(You have ''package' ''baserev' PL''patchlevel' sub''subversion'.)"
-$! This whole thing needs replacing w/ F$FAO() calls:
-$ patchlevel = F$INTEGER(patchlevel)
-$ IF patchlevel.LT.10
-$ THEN patchlevel = "00" + F$STRING(patchlevel)
-$ ELSE patchlevel = "0" + F$STRING(patchlevel)
-$ ENDIF
-$ subversion = F$INTEGER(subversion)
-$ IF subversion.GT.0
+$ IF (F$STRING(subversion) .NES. "0")
$ THEN
-$ IF subversion.LT.10
-$ THEN subversion = "0" + F$STRING(subversion)
-$ ELSE subversion = F$STRING(subversion)
-$ ENDIF
-$ ELSE subversion = ""
+$ echo "(You have ''package' revision ''revision' patchlevel ''patchlevel' subversion ''subversion'.)"
+$ ELSE
+$ echo "(You have ''package' revision ''revision' patchlevel ''patchlevel'.)"
$ ENDIF
$!
-$ version = F$EXTRACT(0,1,baserev) + "_" + patchlevel + subversion
+$ version = revision + "_" + patchlevel + "_" + subversion
$!
$ IF (.NOT.vms_skip_install)
$ THEN
@@ -1105,7 +1202,7 @@ $!
$ ENDIF !%Config-I-VMS, skip "where install" questions
$!
$!: see if we need a special compiler
-$! cc_list = "cc/vaxc|cc/decc|gcc" !%Config-I-VMS, compiler symbols/commands
+$! cc_list = "cc/decc|gcc" !%Config-I-VMS, compiler symbols/commands
$!
$ nocc = "f"
$ vms_cc_dflt = ""
@@ -1124,12 +1221,12 @@ $ WRITE CONFIG " exit(0);"
$ WRITE CONFIG "}"
$ CLOSE CONFIG
$!
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
+$! DEFINE SYS$ERROR _NLA0:
+$! DEFINE SYS$OUTPUT _NLA0:
$ cc/NoObj/list=ccvms.lis ccvms.c
$ tmp = $status
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
+$! DEASSIGN SYS$OUTPUT
+$! DEASSIGN SYS$ERROR
$ IF (silent) THEN GOSUB Shut_up
$! echo "%Config-I-VMS, After cc compile $status = >''tmp'<" !diagnostic
$!
@@ -1147,8 +1244,6 @@ $ IF .NOT.silent THEN echo ""
$ echo "%Config-I-VMS, Default ""cc"" is ''line' ''archsufx' ''F$GETSYI("VERSION")'"
$ IF F$LOCATE("VAX",line).NE.F$LENGTH(line)
$ THEN
-$ vms_cc_dflt = "/vaxc"
-$ vms_cc_available = vms_cc_available + "cc/vaxc "
$ IF .NOT.silent
$ THEN
$ echo "%Config-I-VMS, Will try cc/decc..."
@@ -1171,28 +1266,10 @@ $ echo "%Config-I-VMS, You also have: ''line' ''archsufx' ''F$GETSYI("VERSIO
$ vms_cc_available = vms_cc_available + "cc/decc "
$ ENDIF
$ ELSE
-$ IF F$LOCATE("DEC",line).NE.F$LENGTH(line)
+$ IF (F$LOCATE("DEC",line).NE.F$LENGTH(line)).or.(F$LOCATE("Compaq",line).NE.F$LENGTH(line))
$ THEN
$ vms_cc_dflt = "/decc"
$ vms_cc_available = vms_cc_available + "cc/decc "
-$ echo "%Config-I-VMS, Will try cc/vaxc..."
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ SET NOON
-$ cc/vaxc/NoObj/list=ccvms.lis ccvms.c
-$ tmp = $status
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ SET ON
-$ IF (silent) THEN GOSUB Shut_up
-$ IF tmp.NE.%X10B90001
-$ THEN
-$ echo "%Config-I-VMS, Apparently you don't have that one."
-$ ELSE
-$ GOSUB List_parse
-$ echo "%Config-I-VMS, You also have: ''line' ''archsufx' ''F$GETSYI("VERSION")'"
-$ vms_cc_available = vms_cc_available + "cc/vaxc "
-$ ENDIF
$ ENDIF
$ ENDIF
$!
@@ -1241,29 +1318,19 @@ $ IF ans.NES.""
$ THEN
$ ans = F$EDIT(ans,"TRIM, COMPRESS, LOWERCASE")
$ Mcc = ans
-$ IF F$LOCATE("dec",ans).NE.F$LENGTH(ans)
+$ IF (F$LOCATE("dec",ans).NE.F$LENGTH(ans)).or.(F$LOCATE("compaq",ans).NE.F$LENGTH(ans))
$ THEN
$ Mcc = "cc/decc"
$ Using_Dec_C = "Yes"
$ C_COMPILER_Replace = "CC=cc=''Mcc'"
$ ENDIF
-$ IF F$LOCATE("vax",ans).NE.F$LENGTH(ans)
-$ THEN
-$ Mcc = "cc/vaxc"
-$ Using_Vax_C = "Yes"
-$ C_COMPILER_Replace = "CC=cc=''Mcc'"
-$ ENDIF
$ IF Mcc.NES.dflt
$ THEN
-$ IF F$LOCATE("dec",dflt).NE.F$LENGTH(dflt)
+$ 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 = "Yes"
-$ IF F$LOCATE("vax",dflt).NE.F$LENGTH(dflt)
-$ THEN
-$ C_COMPILER_Replace = "CC=cc=''Mcc'"
-$ ENDIF
$ ENDIF
$ ELSE
$ IF Mcc .EQS. "cc/decc"
@@ -1279,11 +1346,6 @@ $ THEN
$ Using_Dec_C = "Yes"
$ C_COMPILER_Replace = "CC=cc=''Mcc'"
$ ENDIF
-$ IF Mcc .EQS. "cc/vaxc"
-$ THEN
-$ Using_Vax_C = "Yes"
-$ C_COMPILER_Replace = "CC=cc=''Mcc'"
-$ ENDIF
$ IF Mcc .EQS. "gcc"
$ THEN
$ Using_Gnu_C = "Yes"
@@ -1339,36 +1401,8 @@ $ CLOSE CONFIG
$! DELETE/NOLOG/NOCONFIRM deccvers.*;
$ echo "You are using Dec C ''line'"
$ Dec_C_Version = line
-$ ENDIF
-$Vaxc_Invoke_check:
-$ IF "''Using_Vax_C'".EQS."Yes"
-$ THEN
-$ echo ""
-$ echo4 "Checking to see how to invoke Vax C..."
-$ OPEN/WRITE CONFIG vaxcchk.c
-$ WRITE CONFIG "#include <stdio.h>"
-$ WRITE CONFIG "int main() {"
-$ WRITE CONFIG " printf(""%i\n"", ""1"");"
-$ WRITE CONFIG " exit(0);"
-$ WRITE CONFIG "}"
-$ CLOSE CONFIG
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ SET NOON
-$ cc/vaxc/NoObj vaxcchk.c
-$ tmp = $status
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ SET ON
-$ IF (silent) THEN GOSUB Shut_up
-$ IF tmp.NE.%X10B90001
-$ THEN
-$ Mcc = "cc"
-$ ELSE
-$ Mcc = "cc/vaxc"
-$ ENDIF
-$Vax_c_cleanup:
-$ DELETE/NOLOG/NOCONFIRM vaxcchk.*;
+$ Dec_C_Version = Dec_C_Version + 0
+$ if Dec_C_Version.ge.60200000 THEN CC_FLAGS = CC_FLAGS + "/NOANSI_ALIAS"
$ ENDIF
$Gcc_check:
$ if "''using_gnu_c'" .eqs. "Yes"
@@ -1561,7 +1595,7 @@ $ IF mydomain.NES."" !no periods in DECnet names like "MYDECNODE::"
$ THEN
$ rp = "What is your domain name? [''mydomain'] "
$ GOSUB myread
-$ IF ans THEN mydomain = ans
+$ IF ans .nes. "" THEN mydomain = ans
$!: translate upper to lower if necessary
$ mydomain = F$EDIT(mydomain,"COLLAPSE")
$ mylowdomain = F$EDIT(mydomain," LOWERCASE")
@@ -1582,10 +1616,10 @@ 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...
$ ENDIF
-$ dflt = "''cf_by@''myhostname'"+"''mydomain'"
+$ dflt = "''cf_by'@''myhostname'"+"''mydomain'"
$ rp = "What is your e-mail address? [''dflt'] "
$ GOSUB myread
-$ IF ans
+$ IF ans .nes. ""
$ THEN cf_email = ans
$ ELSE cf_email = dflt
$ ENDIF
@@ -1602,7 +1636,7 @@ $ ENDIF
$ dflt = "''cf_email'"
$ rp = "Perl administrator e-mail address [''dflt'] "
$ GOSUB myread
-$ IF ans
+$ IF ans .nes. ""
$ THEN perladmin = ans
$ ELSE perladmin = dflt
$ ENDIF
@@ -1669,13 +1703,115 @@ $ IF ans.eqs."socketshr" then has_socketshr = "T"
$ endif
$!
$!
+$! Ask if they want to build with VMS_DEBUG perl
+$ echo ""
+$ echo "Perl can be built to run under the VMS debugger."
+$ echo "You should only select this option if you are debugging"
+$ echo "perl itself. This can be a useful feature if you are "
+$ echo "embedding perl in a program."
+$ dflt = "n"
+$ rp = "Build a VMS-DEBUG version of Perl? [''dflt'] "
+$ GOSUB myread
+$ IF ans.eqs."" then ans = dflt
+$ IF F$EXTRACT(0, 1, F$EDIT(ans,"COLLAPSE,UPCASE")) .eqs. "Y"
+$ THEN
+$ use_vmsdebug_perl = "Y"
+$ macros = macros + """__DEBUG__=1"","
+$ ELSE
+$ use_vmsdebug_perl = "N"
+$ 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.
+$ dflt = "y"
+$ rp = "Build a DEBUGGING version of Perl? [''dflt'] "
+$ GOSUB myread
+$ IF ans.eqs."" then ans = dflt
+$ IF F$EXTRACT(0, 1, F$EDIT(ans,"COLLAPSE,UPCASE")) .eqs. "Y"
+$ THEN
+$ use_debugging_perl = "Y"
+$ ELSE
+$ use_debugging_perl = "N"
+$ ENDIF
+$!
+$! Ask if they want to build with MULTIPLICITY
+$ echo ""
+$ echo "The perl interpreter engine can be built in a way that makes it
+$ echo "possible for a program that embeds perl into it (and yes, you can
+$ echo "do that--it's pretty keen) to have multiple perl interpreters active
+$ echo "at once. There is some performance overhead, however, so you
+$ echo "probably don't want to choose this unless you're going to be doing
+$ echo "funky perl embedding."
+$ dflt = "n"
+$ rp = "Build with MULTIPLICITY? [''dflt'] "
+$ GOSUB myread
+$ if ans.eqs."" then ans = dflt
+$ IF F$EXTRACT(0, 1, F$EDIT(ans,"COLLAPSE,UPCASE")) .eqs. "Y"
+$ THEN
+$ use_multiplicity="Y"
+$ ELSE
+$ use_multiplicity="N"
+$ ENDIF
+$!
+$! Ask if they want to build with 64-bit support
+$ IF (Archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ges."7.1")
+$ THEN
+$ dflt = use64bitint
+$ echo ""
+$ 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 "fileops at the moment, as Dec C doesn't do that yet)."
+$ 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'.
+$ 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"
+$ 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 ""
+$ echo "If this doesn't 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"
+$ ENDIF
+$ ENDIF
+$ ENDIF ! AXP && >= 7.1
+$!
$! Ask about threads, if appropriate
$ if (Using_Dec_C.eqs."Yes")
$ 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 ""
$ dflt = "n"
$ rp = "Build with threads? [''dflt'] "
$ GOSUB myread
@@ -1683,6 +1819,32 @@ $ 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 "
+$ dflt = "n"
+$ 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")
+$ THEN
+$ use_ithreads="Y"
+$ use_5005_threads="N"
+$ ELSE
+$ use_ithreads="N"
+$ use_5005_threads="Y"
+$ ENDIF
$ ! 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
@@ -1695,7 +1857,6 @@ $ 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 ""
$ dflt = "n"
$ rp = "Enable multiple kernel threads and upcalls? [''dflt'] "
$ gosub myread
@@ -1707,27 +1868,87 @@ $ ENDIF
$ ENDIF
$ ENDIF
$ ENDIF
+$ 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 = "Case-sensitive symbols [''dflt'] "
+$ gosub myread
+$ if ans.eqs."" then ans="''dflt'"
+$ be_case_sensitive = "''ans'"
$!
-$! Pre-load %ENV?
+$! IEEE math?
$ echo ""
-$ echo "Because of the way perl fetches the list of logical names
-$ echo "for the %ENV hash (we spawn a subprocess that does a
-$ echo "SHOW LOGICALS *, which is expensive), we defer fetching it
-$ echo "until the first time a program iterates over the %ENV hash.
-$ echo "This means things like 'exists($ENV{'SYS$MANAGER'})' will
-$ echo "return false unless you've already accessed $ENV{SYS$MANAGER}
-$ echo "or done something like a keys %ENV."
+$ 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 "If you choose, perl can populate the %ENV hash at startup.
-$ echo "This will exact both a memory penalty (to store the keys) and
-$ echo "a time penalty (to spawn the subprocess) every time you invoke
-$ echo "perl. Depending on your system, this might not be a big deal.
+$ 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.
+$ dflt = user_c_flags
+$ rp = "Extra C flags [''dflt'] "
+$ gosub myread
+$ if ans.eqs."" then ans="''dflt'"
+$ user_c_flags = "''ans'"
+$!
+$! Ask whether they want to use secure logical translation when tainting
$ echo ""
-$ dflt = "n"
-$ rp = "Populate %ENV at startup time? [''dflt'] "
+$ echo "As Perl starts up, it checks several logical names, such as"
+$ echo "PERL5LIB and PERL_ENV_TABLES, which allow you to modify aspects"
+$ echo "of its behavior. For additional security, you may limit this"
+$ echo "process to executive- and kernel-mode translation when tainting"
+$ echo "is enabled. In this case, logical names normally skipped when"
+$ echo "tainting is enabled (e.g. PERL5OPTS) are translated as well."
+$ echo "If you do not choose to do this, the usual order of access modes"
+$ echo "is used for logical name translation."
+$ echo ""
+$ echo "This restriction does not apply to the %ENV hash or to implicit"
+$ echo "logical name translation during parsing of file specifications;"
+$ echo "these always use the normal sequence of access modes for logical"
+$ echo "name translation."
+$ dflt = "y"
+$ rp = "Use secure logical name translation? [''dflt'] "
+$ GOSUB myread
+$ if ans.eqs."" then ans="''dflt'"
+$ d_secintgenv = f$extract(0, 1, f$edit(ans,"TRIM,COMPRESS,UPCASE"))
+$!
+$! Ask whether they want to default filetypes
+$ echo ""
+$ echo "When you pass the name of a program to Perl on the command line,"
+$ echo "it generally doesn't supply any defaults unless the -S command"
+$ echo "line switch is specified. In keeping with the VMS tradition of"
+$ echo "default file types, however, you can configure Perl to try default"
+$ 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. "
+$ dflt = "N"
+$ rp = "Always use default file types? [''dflt'] "
$ GOSUB myread
$ if ans.eqs."" then ans="''dflt'"
-$ preload_env = f$extract(0, 1, f$edit(ans,"TRIM,COMPRESS,UPCASE"))
+$ d_alwdeftype = f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE"))
$!
$! Ask if they want to use perl's memory allocator
$ echo ""
@@ -1735,12 +1956,11 @@ $ 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 ""
$ dflt = "n"
$ rp = "Build with perl's memory allocator? [''dflt'] "
$ GOSUB myread
$ if ans.eqs."" then ans="''dflt'"
-$ mymalloc = f$extract(0, 1, f$edit(ans,"TRIM,COMPRESS,UPCASE"))
+$ mymalloc = f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE"))
$ if mymalloc.eqs."Y"
$ THEN
$ if use_debugging_perl.eqs."Y"
@@ -1749,12 +1969,11 @@ $ 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 ""
$ dflt = "n"
$ rp = "Do you want the debugging memory allocator? [''dflt'] "
$ gosub myread
$ if ans.eqs."" then ans="''dflt'"
-$ use_debugmalloc = f$extract(0, 1, f$edit(ans, "TRIM,COMPRESS,UPCASE"))
+$ use_debugmalloc = f$extract(0, 1, f$edit(ans, "COLLAPSE,UPCASE"))
$ ENDIF
$ ! Check which memory allocator we want
$ echo ""
@@ -1765,7 +1984,6 @@ $ 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."
-$ echo ""
$ dflt = "DEFAULT"
$ rp = "Memory allocator (DEFAULT, TWO_POT, PACK_MALLOC) [''dflt'] "
$ GOSUB myread
@@ -1779,22 +1997,56 @@ $ 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 "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 "Which modules do you want to build into perl?"
-$ dflt = "Fcntl Errno IO Opcode Dumper attrs re Stdio DCLsym B SDBM_File"
+$! 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 Thread Sys::Hostname"
$ if Using_Dec_C.eqs."Yes"
$ THEN
$ dflt = dflt + " POSIX"
-$ if Use_Threads.eqs."T"
-$ THEN
-$ dflt = dflt + " Thread"
-$ ENDIF
$ ENDIF
$ rp = "[''dflt'] "
$ GOSUB myread
$ if ans.eqs."" then ans = "''dflt'"
+$ a = ""
+$ j = 0
+$ xloop1:
+$ x = f$elem(j," ",ans)
+$ j = j + 1
+$ if x .eqs. " " then goto exloop1
+$ xloop2:
+$ k = f$locate("::",x)
+$ if k .ge. f$len(x) then goto exloop2
+$ x = f$extract(0,k,x) + "/" + f$extract(k+2,f$len(x)-2,x)
+$ goto xloop2
+$ exloop2:
+$ a = a + " " + x
+$ goto xloop1
+$ exloop1:
+$ ans = f$edit(a,"trim")
+$!
+$ a = ""
+$ j = 0
+$ xloop3:
+$ x = f$elem(j," ",dflt)
+$ j = j + 1
+$ if x .eqs. " " then goto exloop3
+$ xloop4:
+$ k = f$locate("::",x)
+$ if k .ge. f$len(x) then goto exloop4
+$ x = f$extract(0,k,x) + "/" + f$extract(k+2,f$len(x)-2,x)
+$ goto xloop4
+$ exloop4:
+$ a = a + " " + x
+$ goto xloop3
+$ exloop3:
+$ dflt = f$edit(a,"trim")
+$!
$ extensions = "''ans'"
+$ perl_known_extensions = "''dflt'"
$!
$! %Config-I-VMS, determine build/make utility here (make gmake mmk mms)
$ echo ""
@@ -1821,9 +2073,9 @@ $Build_probe:
$ build = F$ELEMENT(n,"/",builders)
$ probe = F$ELEMENT(n,"!",probers)
$ echo "Testing whether you have ''build' on your system..."
-$ SET NOON !sorry :-(
-$ ON CONTROL_Y THEN GOTO Reenable_messages_build !sorry :-(
-$ SET MESSAGE/NOFAC/NOSEV/NOIDENT/NOTEXT !sorry :-(
+$ SET NOON
+$ ON CONTROL_Y THEN GOTO Reenable_messages_build
+$ SET MESSAGE/NOFAC/NOSEV/NOIDENT/NOTEXT
$ 'build' 'probe'
$ IF ($SEVERITY .EQ. 1)
$ THEN
@@ -1838,9 +2090,9 @@ $ IF (.NOT. default_set) THEN dflt = build
$ ELSE
$ echo "Nope."
$ ENDIF
-$Reenable_messages_build: !hope you made it here :-)
-$ SET MESSAGE 'messages' !hope you made it here :-)
-$ SET ON !hope you made it here :-)
+$Reenable_messages_build:
+$ SET MESSAGE 'messages'
+$ SET ON
$ n = n + 1
$ IF (n .LT. max_build) THEN GOTO Build_probe
$!
@@ -1912,13 +2164,13 @@ $! echo4 "Updating makefile..."
$!
$ IF (make .EQS. "MMS").OR.(make .EQS. "MMK")
$ THEN
-$ makefile = "" !wrt MANIFEST dir
-$ UUmakefile = "DESCRIP.MMS" !wrt CWD dir
-$ DEFmakefile = "DESCRIP.MMS" !wrt DEF dir (?)
+$ makefile = "" !wrt MANIFEST dir
+$ UUmakefile = "[-]DESCRIP.MMS" !wrt CWD dir
+$ DEFmakefile = "DESCRIP.MMS" !wrt DEF dir (?)
$ ELSE
-$ makefile = " -f [.VMS]Makefile." !wrt MANIFEST dir
-$ UUmakefile = "[-.VMS]Makefile." !wrt CWD dir
-$ DEFmakefile = "[-.VMS]Makefile." !wrt DEF dir (?)
+$ makefile = " -f Makefile." !wrt MANIFEST dir
+$ UUmakefile = "[-]Makefile." !wrt CWD dir
+$ DEFmakefile = "Makefile." !wrt DEF dir (?)
$ ENDIF
$!
$ IF macros.NES.""
@@ -1927,21 +2179,108 @@ $ 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
+$ extra_flags = "''extra_flags'" + "/float=ieee/ieee=denorm_results"
+$ endif
+$ if be_case_sensitive
+$ then
+$ extra_flags = "''extra_flags'" + "/Names=As_Is"
+$ endif
+$ extra_flags = "''extra_flags'" + "''user_c_flags'"
$!
$! Invoke the subconfig piece
$!
$ echo ""
-$ echo4 "Checking the C Run time library"
+$ echo4 "Checking the C run-time library"
$ dflt = F$ENVIRONMENT("DEFAULT")
$ SET DEFAULT [-.vms]
$ @subconfigure
$ SET DEFAULT 'dflt
$!
+$! Warn of dangerous symbols or logical names
+$!
+$Bad_environment: SUBROUTINE
+$ Bad_env = ""
+$ IF p2 .eqs. "SYMBOL"
+$ THEN
+$ IF f$type('p1) .nes. "" THEN Bad_env := SYMBOL
+$ ELSE
+$ IF f$trnlnm(p1) .nes. "" THEN Bad_env := LOGICAL
+$ ENDIF
+$ IF Bad_env .eqs. "SYMBOL" .or. Bad_env .eqs. "LOGICAL"
+$ THEN
+$ IF f$search("config.msg") .nes. ""
+$ THEN
+$ OPEN/APPEND CONFIG config.msg
+$ ELSE
+$ OPEN/WRITE CONFIG config.msg
+$ ENDIF
+$ IF Bad_env .eqs. "SYMBOL"
+$ THEN
+$ WRITE CONFIG ""
+$ WRITE CONFIG "Symbol name ''p1' found in environment as " + &p1
+$ 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 " restore the symbol with:"
+$ WRITE CONFIG " $ ''p1' == """ + &p1 + """"
+$ ENDIF
+$ ENDIF
+$ IF Bad_env .eqs. "LOGICAL"
+$ THEN
+$ WRITE CONFIG ""
+$ WRITE CONFIG "Logical name ''p1' found in environment as " + f$trnlnm(p1)
+$ WRITE CONFIG " deassign before building ''package'"
+$ ENDIF
+$ CLOSE CONFIG
+$ Bad_env = ""
+$ ENDIF
+$ EXIT
+$ ENDSUBROUTINE ! Bad_environment
+$ echo ""
+$ echo4 "%Config-I-VMS, Checking for dangerous pre-existing global symbols and logical names."
+$ CALL Bad_environment "TMP"
+$ CALL Bad_environment "LIB"
+$ CALL Bad_environment "T"
+$ CALL Bad_environment "FOO"
+$ CALL Bad_environment "EXT"
+$ CALL Bad_environment "TEST" "SYMBOL"
+$ IF f$search("config.msg") .eqs. "" THEN echo "OK."
+$!
$! %Config-I-VMS, write perl_setup.com here
$!
+$ IF (.NOT.perl_symbol)
+$ THEN
+$ file_2_find = "[-]''packageup'.cld"
+$ echo ""
+$ echo4 "%Config-I-VMS, The perl.cld file is now being written..."
+$ OPEN/WRITE CONFIG 'file_2_find'
+$ ext = ".exe"
+$ IF ((sharedperl) .AND. (f$getsyi("ARCH_NAME") .NES. "VAX")) THEN ext := .AXE
+$ IF (use_vmsdebug_perl)
+$ THEN
+$ WRITE CONFIG "define verb dbgperl"
+$ WRITE CONFIG F$FAO("!_!AS","image ''packageup'_root:[000000]dbgperl''ext'")
+$ WRITE CONFIG F$FAO("!_!AS","cliflags (foreign)")
+$ WRITE CONFIG ""
+$ WRITE CONFIG "define verb perl"
+$ WRITE CONFIG F$FAO("!_!AS","image ''packageup'_root:[000000]ndbgPerl''ext'")
+$ WRITE CONFIG F$FAO("!_!AS","cliflags (foreign)")
+$ ELSE
+$ WRITE CONFIG "define verb perl"
+$ WRITE CONFIG F$FAO("!_!AS","image ''packageup'_root:[000000]perl''ext'")
+$ WRITE CONFIG F$FAO("!_!AS","cliflags (foreign)")
+$ ENDIF
+$ CLOSE CONFIG
+$ ENDIF ! (.NOT.perl_symbol)
$ echo ""
$ echo4 "%Config-I-VMS, The perl_setup.com file is now being written..."
-$ file_2_find = "[-.vms]perl_setup.com"
+$ file_2_find = "[-]perl_setup.com"
$ OPEN/WRITE CONFIG 'file_2_find'
$ WRITE CONFIG "$!"
$ WRITE CONFIG "$! Perl_Setup.com ''cf_time'"
@@ -1952,11 +2291,42 @@ $ ELSE
$ WRITE CONFIG "$! This perl configured & administered by ''perladmin'"
$ ENDIF
$ WRITE CONFIG "$!"
+$ prefix = prefix - "000000."
$ IF F$LOCATE(".]",prefix) .EQ. F$LENGTH(prefix) THEN -
prefix = prefix - "]" + ".]"
$ WRITE CONFIG "$ define/translation=concealed Perl_Root ''prefix'"
-$ WRITE CONFIG "$ perl :== $Perl_Root:[000000]Perl"
-$ WRITE CONFIG "$ define PerlShr Perl_Root:[000000]PerlShr.Exe"
+$ WRITE CONFIG "$ ext = "".exe"""
+$ IF sharedperl .EQS. "Y"
+$ THEN
+$ write config "$ if f$getsyi(""ARCH_NAME"") .nes. ""VAX"" then ext = "".AXE"""
+$ ENDIF
+$ IF (perl_symbol)
+$ THEN
+$ IF (use_vmsdebug_perl)
+$ THEN
+$ WRITE CONFIG "$ dbgperl :== $Perl_Root:[000000]dbgPerl'ext'"
+$ WRITE CONFIG "$ perl :== $Perl_Root:[000000]ndbgPerl'ext'"
+$ WRITE CONFIG "$ define dbgPerlShr Perl_Root:[000000]dbgPerlShr'ext'"
+$ ELSE
+$ WRITE CONFIG "$ perl :== $Perl_Root:[000000]Perl'ext'"
+$ WRITE CONFIG "$ define PerlShr Perl_Root:[000000]PerlShr'ext'"
+$ ENDIF
+$ ELSE ! .NOT.perl_symbol
+$ IF (use_vmsdebug_perl)
+$ THEN
+$ WRITE CONFIG "$ define dbgPerlShr Perl_Root:[000000]dbgPerlShr'ext'"
+$ ELSE
+$ WRITE CONFIG "$ define PerlShr Perl_Root:[000000]PerlShr'ext'"
+$ ENDIF
+$ IF perl_verb .EQS. "PROCESS"
+$ THEN
+$ WRITE CONFIG "$ set command ''packagup'_ROOT:[000000]''packageup'.CLD"
+$ ENDIF
+$ ENDIF ! perl_symbol
+$ WRITE CONFIG "$ define/nolog pod2text Perl_Root:[lib.pod]pod2text.com"
+$ WRITE CONFIG "$ define/nolog pod2html Perl_Root:[lib.pod]pod2html.com"
+$ WRITE CONFIG "$ define/nolog pod2man Perl_Root:[lib.pod]pod2man.com"
+$!
$ IF (tzneedset)
$ THEN
$ WRITE CONFIG "$ define SYS$TIMEZONE_DIFFERENTIAL ''tzd'"
@@ -1966,7 +2336,40 @@ $ ENDIF
$ WRITE CONFIG "$!"
$ WRITE CONFIG "$! Symbols for commonly used scripts:"
$ WRITE CONFIG "$!"
-$ WRITE CONFIG "$ Perldoc == ""'"+"'Perl' Perl_Root:[lib.pod]Perldoc.com -t"""
+$ IF (perl_symbol)
+$ THEN
+$ WRITE CONFIG "$ Perldoc == ""'"+"'Perl' Perl_Root:[lib.pod]Perldoc.com -t"""
+$ WRITE CONFIG "$ pod2text == ""'"+"'Perl' pod2text"""
+$ WRITE CONFIG "$ pod2html == ""'"+"'Perl' pod2html"""
+$ WRITE CONFIG "$ pod2latex == ""'"+"'Perl' Perl_Root:[lib.pod]pod2latex.com"""
+$ WRITE CONFIG "$!pod2man == ""'"+"'Perl' pod2man"""
+$ WRITE CONFIG "$!Perlbug == ""'"+"'Perl' Perl_Root:[lib]Perlbug.com"""
+$ WRITE CONFIG "$ c2ph == ""'"+"'Perl' Perl_Root:[utils]c2ph.com"""
+$ IF F$LOCATE("Devel::DProf",extensions) .LT. F$LENGTH(extensions)
+$ THEN
+$ WRITE CONFIG "$ dprofpp == ""'"+"'Perl' Perl_Root:[utils]dprofpp.com"""
+$ ENDIF
+$ WRITE CONFIG "$ h2ph == ""'"+"'Perl' Perl_Root:[utils]h2ph.com"""
+$ WRITE CONFIG "$ h2xs == ""'"+"'Perl' Perl_Root:[utils]h2xs.com"""
+$ WRITE CONFIG "$!perlcc == ""'"+"'Perl' Perl_Root:[utils]perlcc.com"""
+$ WRITE CONFIG "$ splain == ""'"+"'Perl' Perl_Root:[utils]splain.com"""
+$ ELSE
+$ WRITE CONFIG "$ Perldoc == ""Perl Perl_Root:[lib.pod]Perldoc.com -t"""
+$ WRITE CONFIG "$ pod2text == ""Perl pod2text"""
+$ WRITE CONFIG "$ pod2html == ""Perl pod2html"""
+$ WRITE CONFIG "$ pod2latex == ""Perl Perl_Root:[lib.pod]pod2latex.com"""
+$ WRITE CONFIG "$!pod2man == ""Perl pod2man"""
+$ WRITE CONFIG "$!Perlbug == ""Perl Perl_Root:[lib]Perlbug.com"""
+$ WRITE CONFIG "$ c2ph == ""Perl Perl_Root:[utils]c2ph.com"""
+$ IF F$LOCATE("Devel::DProf",extensions) .LT. F$LENGTH(extensions)
+$ THEN
+$ WRITE CONFIG "$ dprofpp == ""Perl Perl_Root:[utils]dprofpp.com"""
+$ ENDIF
+$ WRITE CONFIG "$ h2ph == ""Perl Perl_Root:[utils]h2ph.com"""
+$ WRITE CONFIG "$ h2xs == ""Perl Perl_Root:[utils]h2xs.com"""
+$ WRITE CONFIG "$!perlcc == ""Perl Perl_Root:[utils]perlcc.com"""
+$ WRITE CONFIG "$ splain == ""Perl Perl_Root:[utils]splain.com"""
+$ ENDIF
$ CLOSE CONFIG
$!
$ echo ""
@@ -1976,6 +2379,20 @@ $ echo "-Config-I-VMS, Add that file (or an @ call to it) to your [SY]LOGIN.COM
$ echo "-Config-I-VMS, when you are satisfied with a successful compilation,"
$ echo "-Config-I-VMS, testing, and installation of your perl."
$ echo ""
+$ IF ((.NOT.perl_symbol) .AND. (perl_verb .EQS. "DCLTABLES"))
+$ THEN
+$ file_2_find = "[-]''packageup'_install.com"
+$ 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"
+$ CLOSE CONFIG
+$ echo4 ""
+$ echo4 "%Config-I-VMS, In order to install the ''packageup' verb into DCLTABLES run:"
+$ echo4 "-Config-I-VMS, @ ''F$SEARCH(file_2_find)'"
+$ echo4 "-Config-I-VMS, after a successful build, test, and install. Do so with CMKRNL privilege."
+$ echo4 ""
+$ ENDIF
$!
$!figure out where we "are" by parsing 'vms_default_directory_name'
$!
@@ -2009,6 +2426,15 @@ $ ENDIF
$ echo4 " ''make'''makefile'", macros
$ echo4 ""
$!
+$ IF ( F$SEARCH("config.msg").NES."" )
+$ THEN
+$ echo "Hmm. I also noted the following information while running:"
+$ echo ""
+$ type config.msg
+$ SET PROTECTION=(SYSTEM:RWED,OWNER:RWED) config.msg
+$ DELETE/NOLOG/NOCONFIRM config.msg;
+$ ENDIF
+$!
$Clean_up:
$ IF (silent)
$ THEN
diff --git a/contrib/perl5/configure.gnu b/contrib/perl5/configure.gnu
index fa46532..2ef8331 100755
--- a/contrib/perl5/configure.gnu
+++ b/contrib/perl5/configure.gnu
@@ -111,6 +111,14 @@ case "$ccflags" in
'') ;;
*) opts="$opts -Dccflags='$ccflags'";;
esac
+case "$LDFLAGS" in
+'') ;;
+*) ldflags="$ldflags $LDFLAGS";;
+esac
+case "$ldflags" in
+'') ;;
+*) opts="$opts -Dldflags='$ldflags'";;
+esac
# Don't use -s if they want verbose mode
case "$verbose" in
diff --git a/contrib/perl5/cop.h b/contrib/perl5/cop.h
index 7d6730f..e588675 100644
--- a/contrib/perl5/cop.h
+++ b/contrib/perl5/cop.h
@@ -1,6 +1,6 @@
/* cop.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -10,15 +10,59 @@
struct cop {
BASEOP
char * cop_label; /* label for this construct */
+#ifdef USE_ITHREADS
+ char * cop_stashpv; /* package line was compiled in */
+ char * cop_file; /* file name the following line # is from */
+#else
HV * cop_stash; /* package line was compiled in */
GV * cop_filegv; /* file the following line # is from */
+#endif
U32 cop_seq; /* parse sequence number */
I32 cop_arybase; /* array base this line was compiled with */
line_t cop_line; /* line # of this command */
+ SV * cop_warnings; /* lexical warnings bitmask */
};
#define Nullcop Null(COP*)
+#ifdef USE_ITHREADS
+# define CopFILE(c) ((c)->cop_file)
+# define CopFILEGV(c) (CopFILE(c) \
+ ? gv_fetchfile(CopFILE(c)) : Nullgv)
+# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) /* XXX */
+# define CopFILESV(c) (CopFILE(c) \
+ ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+# define CopFILEAV(c) (CopFILE(c) \
+ ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+# define CopSTASHPV(c) ((c)->cop_stashpv)
+# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = savepv(pv)) /* XXX */
+# define CopSTASH(c) (CopSTASHPV(c) \
+ ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+# define CopSTASH_set(c,hv) CopSTASHPV_set(c, HvNAME(hv))
+# define CopSTASH_eq(c,hv) (hv \
+ && (CopSTASHPV(c) == HvNAME(hv) \
+ || (CopSTASHPV(c) && HvNAME(hv) \
+ && strEQ(CopSTASHPV(c), HvNAME(hv)))))
+#else
+# define CopFILEGV(c) ((c)->cop_filegv)
+# define CopFILEGV_set(c,gv) ((c)->cop_filegv = gv)
+# define CopFILE_set(c,pv) ((c)->cop_filegv = gv_fetchfile(pv))
+# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+# define CopSTASH(c) ((c)->cop_stash)
+# define CopSTASH_set(c,hv) ((c)->cop_stash = hv)
+# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+# define CopSTASHPV_set(c,pv) CopSTASH_set(c, gv_stashpv(pv,GV_ADD))
+# define CopSTASH_eq(c,hv) (CopSTASH(c) == hv)
+#endif /* USE_ITHREADS */
+
+#define CopSTASH_ne(c,hv) (!CopSTASH_eq(c,hv))
+#define CopLINE(c) ((c)->cop_line)
+#define CopLINE_inc(c) (++CopLINE(c))
+#define CopLINE_dec(c) (--CopLINE(c))
+#define CopLINE_set(c,l) (CopLINE(c) = (l))
+
/*
* Here we have some enormously heavy (or at least ponderous) wizardry.
*/
@@ -34,12 +78,15 @@ struct block_sub {
AV * argarray;
U16 olddepth;
U8 hasargs;
+ U8 lval; /* XXX merge lval and hasargs? */
};
#define PUSHSUB(cx) \
cx->blk_sub.cv = cv; \
cx->blk_sub.olddepth = CvDEPTH(cv); \
- cx->blk_sub.hasargs = hasargs;
+ cx->blk_sub.hasargs = hasargs; \
+ cx->blk_sub.lval = PL_op->op_private & \
+ (OPpLVAL_INTRO|OPpENTERSUB_INARGS);
#define PUSHFORMAT(cx) \
cx->blk_sub.cv = cv; \
@@ -48,35 +95,51 @@ struct block_sub {
cx->blk_sub.dfoutgv = PL_defoutgv; \
(void)SvREFCNT_inc(cx->blk_sub.dfoutgv)
-#define POPSUB(cx) \
- { struct block_sub cxsub; \
- POPSUB1(cx); \
- POPSUB2(); }
-
-#define POPSUB1(cx) \
- cxsub = cx->blk_sub; /* because DESTROY may clobber *cx */
-
#ifdef USE_THREADS
-#define POPSAVEARRAY() NOOP
+# define POP_SAVEARRAY() NOOP
#else
-#define POPSAVEARRAY() \
+# define POP_SAVEARRAY() \
STMT_START { \
SvREFCNT_dec(GvAV(PL_defgv)); \
- GvAV(PL_defgv) = cxsub.savearray; \
+ GvAV(PL_defgv) = cx->blk_sub.savearray; \
} STMT_END
#endif /* USE_THREADS */
-#define POPSUB2() \
- if (cxsub.hasargs) { \
- POPSAVEARRAY(); \
- /* destroy arg array */ \
- av_clear(cxsub.argarray); \
- AvREAL_off(cxsub.argarray); \
+#ifdef USE_ITHREADS
+ /* junk in @_ spells trouble when cloning CVs, so don't leave any */
+# define CLEAR_ARGARRAY() av_clear(cx->blk_sub.argarray)
+#else
+# define CLEAR_ARGARRAY() NOOP
+#endif /* USE_ITHREADS */
+
+
+#define POPSUB(cx,sv) \
+ STMT_START { \
+ if (cx->blk_sub.hasargs) { \
+ POP_SAVEARRAY(); \
+ /* abandon @_ if it got reified */ \
+ if (AvREAL(cx->blk_sub.argarray)) { \
+ SSize_t fill = AvFILLp(cx->blk_sub.argarray); \
+ SvREFCNT_dec(cx->blk_sub.argarray); \
+ cx->blk_sub.argarray = newAV(); \
+ av_extend(cx->blk_sub.argarray, fill); \
+ AvFLAGS(cx->blk_sub.argarray) = AVf_REIFY; \
+ PL_curpad[0] = (SV*)cx->blk_sub.argarray; \
+ } \
+ else { \
+ CLEAR_ARGARRAY(); \
+ } \
} \
- if (cxsub.cv) { \
- if (!(CvDEPTH(cxsub.cv) = cxsub.olddepth)) \
- SvREFCNT_dec(cxsub.cv); \
- }
+ sv = (SV*)cx->blk_sub.cv; \
+ if (sv && (CvDEPTH((CV*)sv) = cx->blk_sub.olddepth)) \
+ sv = Nullsv; \
+ } STMT_END
+
+#define LEAVESUB(sv) \
+ STMT_START { \
+ if (sv) \
+ SvREFCNT_dec(sv); \
+ } STMT_END
#define POPFORMAT(cx) \
setdefout(cx->blk_sub.dfoutgv); \
@@ -86,22 +149,28 @@ struct block_sub {
struct block_eval {
I32 old_in_eval;
I32 old_op_type;
- char * old_name;
+ SV * old_namesv;
OP * old_eval_root;
SV * cur_text;
};
#define PUSHEVAL(cx,n,fgv) \
+ STMT_START { \
cx->blk_eval.old_in_eval = PL_in_eval; \
- cx->blk_eval.old_op_type = PL_op->op_type; \
- cx->blk_eval.old_name = n; \
- cx->blk_eval.old_eval_root = PL_eval_root; \
- cx->blk_eval.cur_text = PL_linestr;
+ cx->blk_eval.old_op_type = PL_op->op_type; \
+ cx->blk_eval.old_namesv = (n ? newSVpv(n,0) : Nullsv); \
+ cx->blk_eval.old_eval_root = PL_eval_root; \
+ cx->blk_eval.cur_text = PL_linestr; \
+ } STMT_END
#define POPEVAL(cx) \
+ STMT_START { \
PL_in_eval = cx->blk_eval.old_in_eval; \
optype = cx->blk_eval.old_op_type; \
- PL_eval_root = cx->blk_eval.old_eval_root;
+ PL_eval_root = cx->blk_eval.old_eval_root; \
+ if (cx->blk_eval.old_namesv) \
+ sv_2mortal(cx->blk_eval.old_namesv); \
+ } STMT_END
/* loop context */
struct block_loop {
@@ -110,7 +179,12 @@ struct block_loop {
OP * redo_op;
OP * next_op;
OP * last_op;
+#ifdef USE_ITHREADS
+ void * iterdata;
+ SV ** oldcurpad;
+#else
SV ** itervar;
+#endif
SV * itersave;
SV * iterlval;
AV * iterary;
@@ -118,35 +192,44 @@ struct block_loop {
IV itermax;
};
-#define PUSHLOOP(cx, ivar, s) \
- cx->blk_loop.label = PL_curcop->cop_label; \
- cx->blk_loop.resetsp = s - PL_stack_base; \
+#ifdef USE_ITHREADS
+# define CxITERVAR(c) \
+ ((c)->blk_loop.iterdata \
+ ? (CxPADLOOP(cx) \
+ ? &((c)->blk_loop.oldcurpad)[(PADOFFSET)(c)->blk_loop.iterdata] \
+ : &GvSV((GV*)(c)->blk_loop.iterdata)) \
+ : (SV**)NULL)
+# define CX_ITERDATA_SET(cx,idata) \
+ cx->blk_loop.oldcurpad = PL_curpad; \
+ if ((cx->blk_loop.iterdata = (idata))) \
+ cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));
+#else
+# define CxITERVAR(c) ((c)->blk_loop.itervar)
+# define CX_ITERDATA_SET(cx,ivar) \
+ if ((cx->blk_loop.itervar = (SV**)(ivar))) \
+ cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));
+#endif
+
+#define PUSHLOOP(cx, dat, s) \
+ cx->blk_loop.label = PL_curcop->cop_label; \
+ cx->blk_loop.resetsp = s - PL_stack_base; \
cx->blk_loop.redo_op = cLOOP->op_redoop; \
cx->blk_loop.next_op = cLOOP->op_nextop; \
cx->blk_loop.last_op = cLOOP->op_lastop; \
- if (cx->blk_loop.itervar = (ivar)) \
- cx->blk_loop.itersave = SvREFCNT_inc(*cx->blk_loop.itervar);\
cx->blk_loop.iterlval = Nullsv; \
cx->blk_loop.iterary = Nullav; \
- cx->blk_loop.iterix = -1;
+ cx->blk_loop.iterix = -1; \
+ CX_ITERDATA_SET(cx,dat);
#define POPLOOP(cx) \
- { struct block_loop cxloop; \
- POPLOOP1(cx); \
- POPLOOP2(); }
-
-#define POPLOOP1(cx) \
- cxloop = cx->blk_loop; /* because DESTROY may clobber *cx */ \
- newsp = PL_stack_base + cxloop.resetsp;
-
-#define POPLOOP2() \
- SvREFCNT_dec(cxloop.iterlval); \
- if (cxloop.itervar) { \
- sv_2mortal(*cxloop.itervar); \
- *cxloop.itervar = cxloop.itersave; \
+ SvREFCNT_dec(cx->blk_loop.iterlval); \
+ if (CxITERVAR(cx)) { \
+ SV **s_v_p = CxITERVAR(cx); \
+ sv_2mortal(*s_v_p); \
+ *s_v_p = cx->blk_loop.itersave; \
} \
- if (cxloop.iterary && cxloop.iterary != PL_curstack) \
- SvREFCNT_dec(cxloop.iterary);
+ if (cx->blk_loop.iterary && cx->blk_loop.iterary != PL_curstack)\
+ SvREFCNT_dec(cx->blk_loop.iterary);
/* context common to subroutines, evals and loops */
struct block {
@@ -185,8 +268,8 @@ struct block {
cx->blk_oldretsp = PL_retstack_ix, \
cx->blk_oldpm = PL_curpm, \
cx->blk_gimme = gimme; \
- DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Entering block %ld, type %s\n", \
- (long)cxstack_ix, block_type[CxTYPE(cx)]); )
+ DEBUG_l( PerlIO_printf(Perl_debug_log, "Entering block %ld, type %s\n", \
+ (long)cxstack_ix, PL_block_type[CxTYPE(cx)]); )
/* Exit a block (RETURN and LAST). */
#define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--], \
@@ -197,8 +280,8 @@ struct block {
PL_retstack_ix = cx->blk_oldretsp, \
pm = cx->blk_oldpm, \
gimme = cx->blk_gimme; \
- DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Leaving block %ld, type %s\n", \
- (long)cxstack_ix+1,block_type[CxTYPE(cx)]); )
+ DEBUG_l( PerlIO_printf(Perl_debug_log, "Leaving block %ld, type %s\n", \
+ (long)cxstack_ix+1,PL_block_type[CxTYPE(cx)]); )
/* Continue a block elsewhere (NEXT and REDO). */
#define TOPBLOCK(cx) cx = &cxstack[cxstack_ix], \
@@ -212,7 +295,7 @@ struct block {
struct subst {
I32 sbu_iters;
I32 sbu_maxiters;
- I32 sbu_safebase;
+ I32 sbu_rflags;
I32 sbu_oldsave;
bool sbu_once;
bool sbu_rxtainted;
@@ -227,7 +310,7 @@ struct subst {
};
#define sb_iters cx_u.cx_subst.sbu_iters
#define sb_maxiters cx_u.cx_subst.sbu_maxiters
-#define sb_safebase cx_u.cx_subst.sbu_safebase
+#define sb_rflags cx_u.cx_subst.sbu_rflags
#define sb_oldsave cx_u.cx_subst.sbu_oldsave
#define sb_once cx_u.cx_subst.sbu_once
#define sb_rxtainted cx_u.cx_subst.sbu_rxtainted
@@ -243,7 +326,7 @@ struct subst {
#define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix], \
cx->sb_iters = iters, \
cx->sb_maxiters = maxiters, \
- cx->sb_safebase = safebase, \
+ cx->sb_rflags = r_flags, \
cx->sb_oldsave = oldsave, \
cx->sb_once = once, \
cx->sb_rxtainted = rxtainted, \
@@ -276,27 +359,77 @@ struct context {
#define CXt_LOOP 3
#define CXt_SUBST 4
#define CXt_BLOCK 5
+#define CXt_FORMAT 6
/* private flags for CXt_EVAL */
#define CXp_REAL 0x00000100 /* truly eval'', not a lookalike */
+#define CXp_TRYBLOCK 0x00000200 /* eval{}, not eval'' or similar */
+
+#ifdef USE_ITHREADS
+/* private flags for CXt_LOOP */
+# define CXp_PADVAR 0x00000100 /* itervar lives on pad, iterdata
+ has pad offset; if not set,
+ iterdata holds GV* */
+# define CxPADLOOP(c) (((c)->cx_type & (CXt_LOOP|CXp_PADVAR)) \
+ == (CXt_LOOP|CXp_PADVAR))
+#endif
#define CxTYPE(c) ((c)->cx_type & CXTYPEMASK)
-#define CxREALEVAL(c) (((c)->cx_type & (CXt_EVAL|CXp_REAL)) == (CXt_EVAL|CXp_REAL))
+#define CxREALEVAL(c) (((c)->cx_type & (CXt_EVAL|CXp_REAL)) \
+ == (CXt_EVAL|CXp_REAL))
+#define CxTRYBLOCK(c) (((c)->cx_type & (CXt_EVAL|CXp_TRYBLOCK)) \
+ == (CXt_EVAL|CXp_TRYBLOCK))
#define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc()))
/* "gimme" values */
+
+/*
+=for apidoc AmU||G_SCALAR
+Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
+L<perlcall>.
+
+=for apidoc AmU||G_ARRAY
+Used to indicate array context. See C<GIMME_V>, C<GIMME> and
+L<perlcall>.
+
+=for apidoc AmU||G_VOID
+Used to indicate void context. See C<GIMME_V> and L<perlcall>.
+
+=for apidoc AmU||G_DISCARD
+Indicates that arguments returned from a callback should be discarded. See
+L<perlcall>.
+
+=for apidoc AmU||G_EVAL
+
+Used to force a Perl C<eval> wrapper around a callback. See
+L<perlcall>.
+
+=for apidoc AmU||G_NOARGS
+
+Indicates that no arguments are being sent to a callback. See
+L<perlcall>.
+
+=cut
+*/
+
#define G_SCALAR 0
#define G_ARRAY 1
#define G_VOID 128 /* skip this bit when adding flags below */
-/* extra flags for perl_call_* routines */
+/* extra flags for Perl_call_* routines */
#define G_DISCARD 2 /* Call FREETMPS. */
#define G_EVAL 4 /* Assume eval {} around subroutine call. */
#define G_NOARGS 8 /* Don't construct a @_ array. */
#define G_KEEPERR 16 /* Append errors to $@, don't overwrite it */
#define G_NODEBUG 32 /* Disable debugging at toplevel. */
+/* flag bits for PL_in_eval */
+#define EVAL_NULL 0 /* not in an eval */
+#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 */
+
/* Support for switching (stack and block) contexts.
* This ensures magic doesn't invalidate local stack and cx pointers.
*/
@@ -321,7 +454,7 @@ struct stackinfo {
I32 si_type; /* type of runlevel */
struct stackinfo * si_prev;
struct stackinfo * si_next;
- I32 * si_markbase; /* where markstack begins for us.
+ I32 si_markoff; /* offset where markstack begins for us.
* currently used only with DEBUGGING,
* but not #ifdef-ed for bincompat */
};
@@ -333,9 +466,10 @@ typedef struct stackinfo PERL_SI;
#define cxstack_max (PL_curstackinfo->si_cxmax)
#ifdef DEBUGGING
-# define SET_MARKBASE PL_curstackinfo->si_markbase = PL_markstack_ptr
+# define SET_MARK_OFFSET \
+ PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack
#else
-# define SET_MARKBASE NOOP
+# define SET_MARK_OFFSET NOOP
#endif
#define PUSHSTACKi(type) \
@@ -351,16 +485,19 @@ typedef struct stackinfo PERL_SI;
AvFILLp(next->si_stack) = 0; \
SWITCHSTACK(PL_curstack,next->si_stack); \
PL_curstackinfo = next; \
- SET_MARKBASE; \
+ SET_MARK_OFFSET; \
} STMT_END
#define PUSHSTACK PUSHSTACKi(PERLSI_UNKNOWN)
+/* POPSTACK works with PL_stack_sp, so it may need to be bracketed by
+ * PUTBACK/SPAGAIN to flush/refresh any local SP that may be active */
#define POPSTACK \
STMT_START { \
+ djSP; \
PERL_SI *prev = PL_curstackinfo->si_prev; \
if (!prev) { \
- PerlIO_printf(PerlIO_stderr(), "panic: POPSTACK\n"); \
+ PerlIO_printf(Perl_error_log, "panic: POPSTACK\n"); \
my_exit(1); \
} \
SWITCHSTACK(PL_curstack,prev->si_stack); \
diff --git a/contrib/perl5/cv.h b/contrib/perl5/cv.h
index 9605135..adb424e 100644
--- a/contrib/perl5/cv.h
+++ b/contrib/perl5/cv.h
@@ -1,31 +1,32 @@
/* cv.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*
*/
-/* This structure much match the beginning of XPVFM */
+/* This structure much match XPVCV in B/C.pm and the beginning of XPVFM
+ * in sv.h */
struct xpvcv {
char * xpv_pv; /* pointer to malloced string */
STRLEN xpv_cur; /* length of xp_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xof_off; /* integer value */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* magic for scalar array */
HV* xmg_stash; /* class package */
HV * xcv_stash;
OP * xcv_start;
OP * xcv_root;
- void (*xcv_xsub) _((CV* _CPERLproto));
+ void (*xcv_xsub) (pTHXo_ CV*);
ANY xcv_xsubany;
GV * xcv_gv;
- GV * xcv_filegv;
- long xcv_depth; /* >= 2 indicates recursive call */
+ char * xcv_file;
+ long xcv_depth; /* >= 2 indicates recursive call */
AV * xcv_padlist;
CV * xcv_outside;
#ifdef USE_THREADS
@@ -35,6 +36,16 @@ struct xpvcv {
cv_flags_t xcv_flags;
};
+/*
+=for apidoc AmU||Nullcv
+Null CV pointer.
+
+=for apidoc Am|HV*|CvSTASH|CV* cv
+Returns the stash of the CV.
+
+=cut
+*/
+
#define Nullcv Null(CV*)
#define CvSTASH(sv) ((XPVCV*)SvANY(sv))->xcv_stash
@@ -43,7 +54,8 @@ struct xpvcv {
#define CvXSUB(sv) ((XPVCV*)SvANY(sv))->xcv_xsub
#define CvXSUBANY(sv) ((XPVCV*)SvANY(sv))->xcv_xsubany
#define CvGV(sv) ((XPVCV*)SvANY(sv))->xcv_gv
-#define CvFILEGV(sv) ((XPVCV*)SvANY(sv))->xcv_filegv
+#define CvFILE(sv) ((XPVCV*)SvANY(sv))->xcv_file
+#define CvFILEGV(sv) (gv_fetchfile(CvFILE(sv))
#define CvDEPTH(sv) ((XPVCV*)SvANY(sv))->xcv_depth
#define CvPADLIST(sv) ((XPVCV*)SvANY(sv))->xcv_padlist
#define CvOUTSIDE(sv) ((XPVCV*)SvANY(sv))->xcv_outside
@@ -62,6 +74,7 @@ struct xpvcv {
(esp. useful for special XSUBs) */
#define CVf_METHOD 0x0040 /* CV is explicitly marked as a method */
#define CVf_LOCKED 0x0080 /* CV locks itself or first arg on entry */
+#define CVf_LVALUE 0x0100 /* CV return value can be used as lvalue */
#define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE)
#define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE)
@@ -75,9 +88,11 @@ struct xpvcv {
#define CvANON_on(cv) (CvFLAGS(cv) |= CVf_ANON)
#define CvANON_off(cv) (CvFLAGS(cv) &= ~CVf_ANON)
+#ifdef PERL_XSUB_OLDSTYLE
#define CvOLDSTYLE(cv) (CvFLAGS(cv) & CVf_OLDSTYLE)
#define CvOLDSTYLE_on(cv) (CvFLAGS(cv) |= CVf_OLDSTYLE)
#define CvOLDSTYLE_off(cv) (CvFLAGS(cv) &= ~CVf_OLDSTYLE)
+#endif
#define CvUNIQUE(cv) (CvFLAGS(cv) & CVf_UNIQUE)
#define CvUNIQUE_on(cv) (CvFLAGS(cv) |= CVf_UNIQUE)
@@ -95,6 +110,10 @@ struct xpvcv {
#define CvLOCKED_on(cv) (CvFLAGS(cv) |= CVf_LOCKED)
#define CvLOCKED_off(cv) (CvFLAGS(cv) &= ~CVf_LOCKED)
+#define CvLVALUE(cv) (CvFLAGS(cv) & CVf_LVALUE)
+#define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE)
+#define CvLVALUE_off(cv) (CvFLAGS(cv) &= ~CVf_LVALUE)
+
#define CvEVAL(cv) (CvUNIQUE(cv) && !SvFAKE(cv))
#define CvEVAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_off(cv))
#define CvEVAL_off(cv) CvUNIQUE_off(cv)
diff --git a/contrib/perl5/deb.c b/contrib/perl5/deb.c
index ad26cd6..441487f 100644
--- a/contrib/perl5/deb.c
+++ b/contrib/perl5/deb.c
@@ -1,6 +1,6 @@
/* deb.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -13,70 +13,81 @@
*/
#include "EXTERN.h"
+#define PERL_IN_DEB_C
#include "perl.h"
+#if defined(PERL_IMPLICIT_CONTEXT)
void
-deb(const char *pat, ...)
+Perl_deb_nocontext(const char *pat, ...)
{
#ifdef DEBUGGING
- dTHR;
+ dTHX;
va_list args;
- register I32 i;
- GV* gv = PL_curcop->cop_filegv;
-
-#ifdef USE_THREADS
- PerlIO_printf(Perl_debug_log, "0x%lx (%s:%ld)\t",
- (unsigned long) thr,
- SvTYPE(gv) == SVt_PVGV ? SvPVX(GvSV(gv)) : "<free>",
- (long)PL_curcop->cop_line);
-#else
- PerlIO_printf(Perl_debug_log, "(%s:%ld)\t",
- SvTYPE(gv) == SVt_PVGV ? SvPVX(GvSV(gv)) : "<free>",
- (long)PL_curcop->cop_line);
-#endif /* USE_THREADS */
- for (i=0; i<PL_dlevel; i++)
- PerlIO_printf(Perl_debug_log, "%c%c ",PL_debname[i],PL_debdelim[i]);
+ va_start(args, pat);
+ vdeb(pat, &args);
+ va_end(args);
+#endif /* DEBUGGING */
+}
+#endif
+void
+Perl_deb(pTHX_ const char *pat, ...)
+{
+#ifdef DEBUGGING
+ va_list args;
va_start(args, pat);
- (void) PerlIO_vprintf(Perl_debug_log,pat,args);
- va_end( args );
+ vdeb(pat, &args);
+ va_end(args);
#endif /* DEBUGGING */
}
void
-deb_growlevel(void)
+Perl_vdeb(pTHX_ const char *pat, va_list *args)
{
#ifdef DEBUGGING
- PL_dlmax += 128;
- Renew(PL_debname, PL_dlmax, char);
- Renew(PL_debdelim, PL_dlmax, char);
+ dTHR;
+ char* file = CopFILE(PL_curcop);
+
+#ifdef USE_THREADS
+ PerlIO_printf(Perl_debug_log, "0x%"UVxf" (%s:%ld)\t",
+ PTR2UV(thr),
+ (file ? file : "<free>"),
+ (long)CopLINE(PL_curcop));
+#else
+ PerlIO_printf(Perl_debug_log, "(%s:%ld)\t", (file ? file : "<free>"),
+ (long)CopLINE(PL_curcop));
+#endif /* USE_THREADS */
+ (void) PerlIO_vprintf(Perl_debug_log, pat, *args);
#endif /* DEBUGGING */
}
I32
-debstackptrs(void)
+Perl_debstackptrs(pTHX)
{
#ifdef DEBUGGING
dTHR;
- PerlIO_printf(Perl_debug_log, "%8lx %8lx %8ld %8ld %8ld\n",
- (unsigned long)PL_curstack, (unsigned long)PL_stack_base,
- (long)*PL_markstack_ptr, (long)(PL_stack_sp-PL_stack_base),
- (long)(PL_stack_max-PL_stack_base));
- PerlIO_printf(Perl_debug_log, "%8lx %8lx %8ld %8ld %8ld\n",
- (unsigned long)PL_mainstack, (unsigned long)AvARRAY(PL_curstack),
- (long)PL_mainstack, (long)AvFILLp(PL_curstack), (long)AvMAX(PL_curstack));
+ PerlIO_printf(Perl_debug_log,
+ "%8"UVxf" %8"UVxf" %8"IVdf" %8"IVdf" %8"IVdf"\n",
+ PTR2UV(PL_curstack), PTR2UV(PL_stack_base),
+ (IV)*PL_markstack_ptr, (IV)(PL_stack_sp-PL_stack_base),
+ (IV)(PL_stack_max-PL_stack_base));
+ PerlIO_printf(Perl_debug_log,
+ "%8"UVxf" %8"UVxf" %8"UVuf" %8"UVuf" %8"UVuf"\n",
+ PTR2UV(PL_mainstack), PTR2UV(AvARRAY(PL_curstack)),
+ PTR2UV(PL_mainstack), PTR2UV(AvFILLp(PL_curstack)),
+ PTR2UV(AvMAX(PL_curstack)));
#endif /* DEBUGGING */
return 0;
}
I32
-debstack(void)
+Perl_debstack(pTHX)
{
#ifdef DEBUGGING
dTHR;
I32 top = PL_stack_sp - PL_stack_base;
register I32 i = top - 30;
- I32 *markscan = PL_curstackinfo->si_markbase;
+ I32 *markscan = PL_markstack + PL_curstackinfo->si_markoff;
if (i < 0)
i = 0;
@@ -86,8 +97,9 @@ debstack(void)
break;
#ifdef USE_THREADS
- PerlIO_printf(Perl_debug_log, i ? "0x%lx => ... " : "0x%lx => ",
- (unsigned long) thr);
+ PerlIO_printf(Perl_debug_log,
+ i ? "0x%"UVxf" => ... " : "0x%lx => ",
+ PTR2UV(thr));
#else
PerlIO_printf(Perl_debug_log, i ? " => ... " : " => ");
#endif /* USE_THREADS */
diff --git a/contrib/perl5/doio.c b/contrib/perl5/doio.c
index 74544c9..0121633 100644
--- a/contrib/perl5/doio.c
+++ b/contrib/perl5/doio.c
@@ -1,6 +1,6 @@
/* doio.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -15,6 +15,7 @@
*/
#include "EXTERN.h"
+#define PERL_IN_DOIO_C
#include "perl.h"
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
@@ -27,7 +28,7 @@
#ifdef HAS_SHM
#include <sys/shm.h>
# ifndef HAS_SHMAT_PROTOTYPE
- extern Shmat_t shmat _((int, char *, int));
+ extern Shmat_t shmat (int, char *, int);
# endif
#endif
#endif
@@ -40,12 +41,6 @@
# endif
#endif
-#ifdef I_FCNTL
-#include <fcntl.h>
-#endif
-#ifdef I_SYS_FILE
-#include <sys/file.h>
-#endif
#ifdef O_EXCL
# define OPEN_EXCL O_EXCL
#else
@@ -63,7 +58,12 @@
#if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
# include <sys/socket.h>
-# include <netdb.h>
+# if defined(USE_SOCKS) && defined(I_SOCKS)
+# include <socks.h>
+# endif
+# ifdef I_NETBSD
+# include <netdb.h>
+# endif
# ifndef ENOTSOCK
# ifdef I_NET_ERRNO
# include <net/errno.h>
@@ -71,17 +71,18 @@
# endif
#endif
-/* Put this after #includes because <unistd.h> defines _XOPEN_*. */
-#ifndef Sock_size_t
-# if _XOPEN_VERSION >= 5 || defined(_XOPEN_SOURCE_EXTENDED) || defined(__GLIBC__)
-# define Sock_size_t Size_t
-# else
-# define Sock_size_t int
-# endif
-#endif
+bool
+Perl_do_open(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
+ int rawmode, int rawperm, PerlIO *supplied_fp)
+{
+ return do_open9(gv, name, len, as_raw, rawmode, rawperm,
+ supplied_fp, Nullsv, 0);
+}
bool
-do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp)
+Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
+ int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs,
+ I32 num_svs)
{
register IO *io = GvIOn(gv);
PerlIO *saveifp = Nullfp;
@@ -92,9 +93,19 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
int fd;
int result;
bool was_fdopen = FALSE;
+ bool in_raw = 0, in_crlf = 0, out_raw = 0, out_crlf = 0;
PL_forkprocess = 1; /* assume true if no fork */
+ if (PL_op && PL_op->op_type == OP_OPEN) {
+ /* set up disciplines */
+ U8 flags = PL_op->op_private;
+ in_raw = (flags & OPpOPEN_IN_RAW);
+ in_crlf = (flags & OPpOPEN_IN_CRLF);
+ out_raw = (flags & OPpOPEN_OUT_RAW);
+ out_crlf = (flags & OPpOPEN_OUT_CRLF);
+ }
+
if (IoIFP(io)) {
fd = PerlIO_fileno(IoIFP(io));
if (IoTYPE(io) == '-')
@@ -110,7 +121,7 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
else if (IoIFP(io) != IoOFP(io)) {
if (IoOFP(io)) {
result = PerlIO_close(IoOFP(io));
- PerlIO_close(IoIFP(io)); /* clear stdio, fd already closed */
+ PerlIO_close(IoIFP(io)); /* clear stdio, fd already closed */
}
else
result = PerlIO_close(IoIFP(io));
@@ -118,15 +129,21 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
else
result = PerlIO_close(IoIFP(io));
if (result == EOF && fd > PL_maxsysfd)
- PerlIO_printf(PerlIO_stderr(), "Warning: unable to close filehandle %s properly.\n",
- GvENAME(gv));
+ PerlIO_printf(Perl_error_log,
+ "Warning: unable to close filehandle %s properly.\n",
+ GvENAME(gv));
IoOFP(io) = IoIFP(io) = Nullfp;
}
if (as_raw) {
+#if defined(USE_64_BIT_RAWIO) && defined(O_LARGEFILE)
+ rawmode |= O_LARGEFILE;
+#endif
+
#ifndef O_ACCMODE
#define O_ACCMODE 3 /* Assume traditional implementation */
#endif
+
switch (result = rawmode & O_ACCMODE) {
case O_RDONLY:
IoTYPE(io) = '<';
@@ -146,65 +163,125 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
if (fd == -1)
fp = NULL;
else {
- char *fpmode;
+ char fpmode[4];
+ STRLEN ix = 0;
if (result == O_RDONLY)
- fpmode = "r";
+ fpmode[ix++] = 'r';
#ifdef O_APPEND
- else if (rawmode & O_APPEND)
- fpmode = (result == O_WRONLY) ? "a" : "a+";
+ else if (rawmode & O_APPEND) {
+ fpmode[ix++] = 'a';
+ if (result != O_WRONLY)
+ fpmode[ix++] = '+';
+ }
#endif
- else
- fpmode = (result == O_WRONLY) ? "w" : "r+";
+ else {
+ if (result == O_WRONLY)
+ fpmode[ix++] = 'w';
+ else {
+ fpmode[ix++] = 'r';
+ fpmode[ix++] = '+';
+ }
+ }
+ if (rawmode & O_BINARY)
+ fpmode[ix++] = 'b';
+ fpmode[ix] = '\0';
fp = PerlIO_fdopen(fd, fpmode);
if (!fp)
PerlLIO_close(fd);
}
}
else {
- char *myname;
- char mode[3]; /* stdio file mode ("r\0" or "r+\0") */
+ char *type;
+ char *oname = name;
+ STRLEN tlen;
+ STRLEN olen = len;
+ char mode[4]; /* stdio file mode ("r\0", "rb\0", "r+b\0" etc.) */
int dodup;
- myname = savepvn(name, len);
- SAVEFREEPV(myname);
- name = myname;
- while (len && isSPACE(name[len-1]))
- name[--len] = '\0';
-
- mode[0] = mode[1] = mode[2] = '\0';
- IoTYPE(io) = *name;
- if (*name == '+' && len > 1 && name[len-1] != '|') { /* scary */
- mode[1] = *name++;
- --len;
+ type = savepvn(name, len);
+ tlen = len;
+ SAVEFREEPV(type);
+ if (num_svs) {
+ STRLEN l;
+ name = SvPV(svs, l) ;
+ len = (I32)l;
+ name = savepvn(name, len);
+ SAVEFREEPV(name);
+ }
+ else {
+ while (tlen && isSPACE(type[tlen-1]))
+ type[--tlen] = '\0';
+ name = type;
+ len = tlen;
+ }
+ mode[0] = mode[1] = mode[2] = mode[3] = '\0';
+ IoTYPE(io) = *type;
+ if (*type == '+' && tlen > 1 && type[tlen-1] != '|') { /* scary */
+ mode[1] = *type++;
+ --tlen;
writing = 1;
}
- if (*name == '|') {
+ if (*type == '|') {
+ if (num_svs && (tlen != 2 || type[1] != '-')) {
+ unknown_desr:
+ Perl_croak(aTHX_ "Unknown open() mode '%.*s'", (int)olen, oname);
+ }
/*SUPPRESS 530*/
- for (name++; isSPACE(*name); name++) ;
- if (strNE(name,"-"))
+ for (type++, tlen--; isSPACE(*type); type++, tlen--) ;
+ if (!num_svs) {
+ name = type;
+ len = tlen;
+ }
+ if (*name == '\0') { /* command is missing 19990114 */
+ dTHR;
+ if (ckWARN(WARN_PIPE))
+ Perl_warner(aTHX_ WARN_PIPE, "Missing command in piped open");
+ errno = EPIPE;
+ goto say_false;
+ }
+ if (strNE(name,"-") || num_svs)
TAINT_ENV();
TAINT_PROPER("piped open");
- if (name[strlen(name)-1] == '|') {
- name[strlen(name)-1] = '\0' ;
- if (PL_dowarn)
- warn("Can't do bidirectional pipe");
+ if (name[len-1] == '|') {
+ dTHR;
+ name[--len] = '\0' ;
+ if (ckWARN(WARN_PIPE))
+ Perl_warner(aTHX_ WARN_PIPE, "Can't open bidirectional pipe");
+ }
+ {
+ char *mode;
+ if (out_raw)
+ mode = "wb";
+ else if (out_crlf)
+ mode = "wt";
+ else
+ mode = "w";
+ fp = PerlProc_popen(name,mode);
}
- fp = PerlProc_popen(name,"w");
writing = 1;
}
- else if (*name == '>') {
+ else if (*type == '>') {
TAINT_PROPER("open");
- name++;
- if (*name == '>') {
+ type++;
+ if (*type == '>') {
mode[0] = IoTYPE(io) = 'a';
- name++;
+ type++;
+ tlen--;
}
else
mode[0] = 'w';
writing = 1;
- if (*name == '&') {
+ if (out_raw)
+ strcat(mode, "b");
+ else if (out_crlf)
+ strcat(mode, "t");
+
+ if (num_svs && tlen != 1)
+ goto unknown_desr;
+ if (*type == '&') {
+ name = type;
duplicity:
dodup = 1;
name++;
@@ -230,7 +307,19 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
goto say_false;
}
if (IoIFP(thatio)) {
- fd = PerlIO_fileno(IoIFP(thatio));
+ PerlIO *fp = IoIFP(thatio);
+ /* Flush stdio buffer before dup. --mjd
+ * Unfortunately SEEK_CURing 0 seems to
+ * be optimized away on most platforms;
+ * only Solaris and Linux seem to flush
+ * on that. --jhi */
+ PerlIO_seek(fp, 0, SEEK_CUR);
+ /* On the other hand, do all platforms
+ * take gracefully to flushing a read-only
+ * filehandle? Perhaps we should do
+ * fsetpos(src)+fgetpos(dst)? --nik */
+ PerlIO_flush(fp);
+ fd = PerlIO_fileno(fp);
if (IoTYPE(thatio) == 's')
IoTYPE(io) = 's';
}
@@ -244,47 +333,82 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
if (!(fp = PerlIO_fdopen(fd,mode))) {
if (dodup)
PerlLIO_close(fd);
- }
+ }
}
}
else {
/*SUPPRESS 530*/
- for (; isSPACE(*name); name++) ;
- if (strEQ(name,"-")) {
+ for (; isSPACE(*type); type++) ;
+ if (strEQ(type,"-")) {
fp = PerlIO_stdout();
IoTYPE(io) = '-';
}
else {
- fp = PerlIO_open(name,mode);
+ fp = PerlIO_open((num_svs ? name : type), mode);
}
}
}
- else if (*name == '<') {
+ else if (*type == '<') {
+ if (num_svs && tlen != 1)
+ goto unknown_desr;
/*SUPPRESS 530*/
- for (name++; isSPACE(*name); name++) ;
+ for (type++; isSPACE(*type); type++) ;
mode[0] = 'r';
- if (*name == '&')
+ if (in_raw)
+ strcat(mode, "b");
+ else if (in_crlf)
+ strcat(mode, "t");
+
+ if (*type == '&') {
+ name = type;
goto duplicity;
- if (strEQ(name,"-")) {
+ }
+ if (strEQ(type,"-")) {
fp = PerlIO_stdin();
IoTYPE(io) = '-';
}
else
- fp = PerlIO_open(name,mode);
+ fp = PerlIO_open((num_svs ? name : type), mode);
}
- else if (len > 1 && name[len-1] == '|') {
- name[--len] = '\0';
- while (len && isSPACE(name[len-1]))
- name[--len] = '\0';
- /*SUPPRESS 530*/
- for (; isSPACE(*name); name++) ;
- if (strNE(name,"-"))
+ else if (tlen > 1 && type[tlen-1] == '|') {
+ if (num_svs) {
+ if (tlen != 2 || type[0] != '-')
+ goto unknown_desr;
+ }
+ else {
+ type[--tlen] = '\0';
+ while (tlen && isSPACE(type[tlen-1]))
+ type[--tlen] = '\0';
+ /*SUPPRESS 530*/
+ for (; isSPACE(*type); type++) ;
+ name = type;
+ }
+ if (*name == '\0') { /* command is missing 19990114 */
+ dTHR;
+ if (ckWARN(WARN_PIPE))
+ Perl_warner(aTHX_ WARN_PIPE, "Missing command in piped open");
+ errno = EPIPE;
+ goto say_false;
+ }
+ if (strNE(name,"-") || num_svs)
TAINT_ENV();
TAINT_PROPER("piped open");
- fp = PerlProc_popen(name,"r");
+ {
+ char *mode;
+ if (in_raw)
+ mode = "rb";
+ else if (in_crlf)
+ mode = "rt";
+ else
+ mode = "r";
+ fp = PerlProc_popen(name,mode);
+ }
IoTYPE(io) = '|';
}
else {
+ if (num_svs)
+ goto unknown_desr;
+ name = type;
IoTYPE(io) = '<';
/*SUPPRESS 530*/
for (; isSPACE(*name); name++) ;
@@ -292,13 +416,22 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
fp = PerlIO_stdin();
IoTYPE(io) = '-';
}
- else
- fp = PerlIO_open(name,"r");
+ else {
+ char *mode;
+ if (in_raw)
+ mode = "rb";
+ else if (in_crlf)
+ mode = "rt";
+ else
+ mode = "r";
+ fp = PerlIO_open(name,mode);
+ }
}
}
if (!fp) {
- if (PL_dowarn && IoTYPE(io) == '<' && strchr(name, '\n'))
- warn(warn_nl, "open");
+ dTHR;
+ if (ckWARN(WARN_NEWLINE) && IoTYPE(io) == '<' && strchr(name, '\n'))
+ Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "open");
goto say_false;
}
if (IoTYPE(io) &&
@@ -339,7 +472,7 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
}
}
if (fd != PerlIO_fileno(fp)) {
- int pid;
+ Pid_t pid;
SV *sv;
PerlLIO_dup2(PerlIO_fileno(fp), fd);
@@ -366,11 +499,21 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
}
#endif
IoIFP(io) = fp;
+ IoFLAGS(io) &= ~IOf_NOLINE;
if (writing) {
dTHR;
if (IoTYPE(io) == 's'
- || (IoTYPE(io) == '>' && S_ISCHR(PL_statbuf.st_mode)) ) {
- if (!(IoOFP(io) = PerlIO_fdopen(PerlIO_fileno(fp),"w"))) {
+ || (IoTYPE(io) == '>' && S_ISCHR(PL_statbuf.st_mode)) )
+ {
+ char *mode;
+ if (out_raw)
+ mode = "wb";
+ else if (out_crlf)
+ mode = "wt";
+ else
+ mode = "w";
+
+ if (!(IoOFP(io) = PerlIO_fdopen(PerlIO_fileno(fp),mode))) {
PerlIO_close(fp);
IoIFP(io) = Nullfp;
goto say_false;
@@ -389,18 +532,27 @@ say_false:
}
PerlIO *
-nextargv(register GV *gv)
+Perl_nextargv(pTHX_ register GV *gv)
{
register SV *sv;
#ifndef FLEXFILENAMES
int filedev;
int fileino;
#endif
- int fileuid;
- int filegid;
+ Uid_t fileuid;
+ Gid_t filegid;
+ IO *io = GvIOp(gv);
if (!PL_argvoutgv)
PL_argvoutgv = gv_fetchpv("ARGVOUT",TRUE,SVt_PVIO);
+ if (io && (IoFLAGS(io) & IOf_ARGV) && (IoFLAGS(io) & IOf_START)) {
+ IoFLAGS(io) &= ~IOf_START;
+ if (PL_inplace) {
+ if (!PL_argvout_stack)
+ PL_argvout_stack = newAV();
+ av_push(PL_argvout_stack, SvREFCNT_inc(PL_defoutgv));
+ }
+ }
if (PL_filemode & (S_ISUID|S_ISGID)) {
PerlIO_flush(IoIFP(GvIOn(PL_argvoutgv))); /* chmod must follow last write */
#ifdef HAS_FCHMOD
@@ -433,8 +585,10 @@ nextargv(register GV *gv)
fileuid = PL_statbuf.st_uid;
filegid = PL_statbuf.st_gid;
if (!S_ISREG(PL_filemode)) {
- warn("Can't do inplace edit: %s is not a regular file",
- PL_oldname );
+ if (ckWARN_d(WARN_INPLACE))
+ Perl_warner(aTHX_ WARN_INPLACE,
+ "Can't do inplace edit: %s is not a regular file",
+ PL_oldname );
do_close(gv,FALSE);
continue;
}
@@ -461,18 +615,23 @@ nextargv(register GV *gv)
#ifdef DJGPP
|| (_djstat_fail_bits & _STFAIL_TRUENAME)!=0
#endif
- ) {
- warn("Can't do inplace edit: %s would not be uniq",
- SvPVX(sv) );
+ )
+ {
+ if (ckWARN_d(WARN_INPLACE))
+ Perl_warner(aTHX_ WARN_INPLACE,
+ "Can't do inplace edit: %s would not be unique",
+ SvPVX(sv));
do_close(gv,FALSE);
continue;
}
#endif
#ifdef HAS_RENAME
-#ifndef DOSISH
+#if !defined(DOSISH) && !defined(__CYGWIN__)
if (PerlLIO_rename(PL_oldname,SvPVX(sv)) < 0) {
- warn("Can't rename %s to %s: %s, skipping file",
- PL_oldname, SvPVX(sv), Strerror(errno) );
+ if (ckWARN_d(WARN_INPLACE))
+ Perl_warner(aTHX_ WARN_INPLACE,
+ "Can't rename %s to %s: %s, skipping file",
+ PL_oldname, SvPVX(sv), Strerror(errno) );
do_close(gv,FALSE);
continue;
}
@@ -485,8 +644,10 @@ nextargv(register GV *gv)
#else
(void)UNLINK(SvPVX(sv));
if (link(PL_oldname,SvPVX(sv)) < 0) {
- warn("Can't rename %s to %s: %s, skipping file",
- PL_oldname, SvPVX(sv), Strerror(errno) );
+ if (ckWARN_d(WARN_INPLACE))
+ Perl_warner(aTHX_ WARN_INPLACE,
+ "Can't rename %s to %s: %s, skipping file",
+ PL_oldname, SvPVX(sv), Strerror(errno) );
do_close(gv,FALSE);
continue;
}
@@ -497,14 +658,16 @@ nextargv(register GV *gv)
#if !defined(DOSISH) && !defined(AMIGAOS)
# ifndef VMS /* Don't delete; use automatic file versioning */
if (UNLINK(PL_oldname) < 0) {
- warn("Can't remove %s: %s, skipping file",
- PL_oldname, Strerror(errno) );
+ if (ckWARN_d(WARN_INPLACE))
+ Perl_warner(aTHX_ WARN_INPLACE,
+ "Can't remove %s: %s, skipping file",
+ PL_oldname, Strerror(errno) );
do_close(gv,FALSE);
continue;
}
# endif
#else
- croak("Can't do inplace edit without backup");
+ Perl_croak(aTHX_ "Can't do inplace edit without backup");
#endif
}
@@ -513,13 +676,15 @@ nextargv(register GV *gv)
SETERRNO(0,0); /* in case sprintf set errno */
#ifdef VMS
if (!do_open(PL_argvoutgv,SvPVX(sv),SvCUR(sv),PL_inplace!=0,
- O_WRONLY|O_CREAT|O_TRUNC,0,Nullfp)) {
+ O_WRONLY|O_CREAT|O_TRUNC,0,Nullfp))
#else
if (!do_open(PL_argvoutgv,SvPVX(sv),SvCUR(sv),PL_inplace!=0,
- O_WRONLY|O_CREAT|OPEN_EXCL,0666,Nullfp)) {
+ O_WRONLY|O_CREAT|OPEN_EXCL,0666,Nullfp))
#endif
- warn("Can't do inplace edit on %s: %s",
- PL_oldname, Strerror(errno) );
+ {
+ if (ckWARN_d(WARN_INPLACE))
+ Perl_warner(aTHX_ WARN_INPLACE, "Can't do inplace edit on %s: %s",
+ PL_oldname, Strerror(errno) );
do_close(gv,FALSE);
continue;
}
@@ -546,12 +711,35 @@ nextargv(register GV *gv)
}
return IoIFP(GvIOp(gv));
}
- else
- PerlIO_printf(PerlIO_stderr(), "Can't open %s: %s\n",
- SvPV(sv, oldlen), Strerror(errno));
+ else {
+ dTHR;
+ if (ckWARN_d(WARN_INPLACE)) {
+ int eno = errno;
+ if (PerlLIO_stat(PL_oldname, &PL_statbuf) >= 0
+ && !S_ISREG(PL_statbuf.st_mode))
+ {
+ Perl_warner(aTHX_ WARN_INPLACE,
+ "Can't do inplace edit: %s is not a regular file",
+ PL_oldname);
+ }
+ else
+ Perl_warner(aTHX_ WARN_INPLACE, "Can't open %s: %s",
+ PL_oldname, Strerror(eno));
+ }
+ }
}
+ if (io && (IoFLAGS(io) & IOf_ARGV))
+ IoFLAGS(io) |= IOf_START;
if (PL_inplace) {
(void)do_close(PL_argvoutgv,FALSE);
+ if (io && (IoFLAGS(io) & IOf_ARGV)
+ && PL_argvout_stack && AvFILLp(PL_argvout_stack) >= 0)
+ {
+ GV *oldout = (GV*)av_pop(PL_argvout_stack);
+ setdefout(oldout);
+ SvREFCNT_dec(oldout);
+ return Nullfp;
+ }
setdefout(gv_fetchpv("STDOUT",TRUE,SVt_PVIO));
}
return Nullfp;
@@ -559,7 +747,7 @@ nextargv(register GV *gv)
#ifdef HAS_PIPE
void
-do_pipe(SV *sv, GV *rgv, GV *wgv)
+Perl_do_pipe(pTHX_ SV *sv, GV *rgv, GV *wgv)
{
register IO *rstio;
register IO *wstio;
@@ -604,7 +792,7 @@ badexit:
/* explicit renamed to avoid C++ conflict -- kja */
bool
-do_close(GV *gv, bool not_implicit)
+Perl_do_close(pTHX_ GV *gv, bool not_implicit)
{
bool retval;
IO *io;
@@ -619,13 +807,15 @@ do_close(GV *gv, bool not_implicit)
io = GvIO(gv);
if (!io) { /* never opened */
if (not_implicit) {
- if (PL_dowarn)
- warn("Close on unopened file <%s>",GvENAME(gv));
+ dTHR;
+ if (ckWARN(WARN_UNOPENED))
+ Perl_warner(aTHX_ WARN_UNOPENED,
+ "Close on unopened file <%s>",GvENAME(gv));
SETERRNO(EBADF,SS$_IVCHAN);
}
return FALSE;
}
- retval = io_close(io);
+ retval = io_close(io, not_implicit);
if (not_implicit) {
IoLINES(io) = 0;
IoPAGE(io) = 0;
@@ -636,7 +826,7 @@ do_close(GV *gv, bool not_implicit)
}
bool
-io_close(IO *io)
+Perl_io_close(pTHX_ IO *io, bool not_implicit)
{
bool retval = FALSE;
int status;
@@ -644,8 +834,13 @@ io_close(IO *io)
if (IoIFP(io)) {
if (IoTYPE(io) == '|') {
status = PerlProc_pclose(IoIFP(io));
- STATUS_NATIVE_SET(status);
- retval = (STATUS_POSIX == 0);
+ if (not_implicit) {
+ STATUS_NATIVE_SET(status);
+ retval = (STATUS_POSIX == 0);
+ }
+ else {
+ retval = (status != -1);
+ }
}
else if (IoTYPE(io) == '-')
retval = TRUE;
@@ -659,7 +854,7 @@ io_close(IO *io)
}
IoOFP(io) = IoIFP(io) = Nullfp;
}
- else {
+ else if (not_implicit) {
SETERRNO(EBADF,SS$_IVCHAN);
}
@@ -667,7 +862,7 @@ io_close(IO *io)
}
bool
-do_eof(GV *gv)
+Perl_do_eof(pTHX_ GV *gv)
{
dTHR;
register IO *io;
@@ -677,6 +872,15 @@ do_eof(GV *gv)
if (!io)
return TRUE;
+ else if (ckWARN(WARN_IO)
+ && (IoTYPE(io) == '>' || IoIFP(io) == PerlIO_stdout()
+ || IoIFP(io) == PerlIO_stderr()))
+ {
+ SV* sv = sv_newmortal();
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_IO, "Filehandle %s opened only for output",
+ SvPV_nolen(sv));
+ }
while (IoIFP(io)) {
@@ -704,8 +908,8 @@ do_eof(GV *gv)
return TRUE;
}
-long
-do_tell(GV *gv)
+Off_t
+Perl_do_tell(pTHX_ GV *gv)
{
register IO *io;
register PerlIO *fp;
@@ -717,14 +921,17 @@ do_tell(GV *gv)
#endif
return PerlIO_tell(fp);
}
- if (PL_dowarn)
- warn("tell() on unopened file");
+ {
+ dTHR;
+ if (ckWARN(WARN_UNOPENED))
+ Perl_warner(aTHX_ WARN_UNOPENED, "tell() on unopened file");
+ }
SETERRNO(EBADF,RMS$_IFI);
- return -1L;
+ return (Off_t)-1;
}
bool
-do_seek(GV *gv, long int pos, int whence)
+Perl_do_seek(pTHX_ GV *gv, Off_t pos, int whence)
{
register IO *io;
register PerlIO *fp;
@@ -736,40 +943,99 @@ do_seek(GV *gv, long int pos, int whence)
#endif
return PerlIO_seek(fp, pos, whence) >= 0;
}
- if (PL_dowarn)
- warn("seek() on unopened file");
+ {
+ dTHR;
+ if (ckWARN(WARN_UNOPENED))
+ Perl_warner(aTHX_ WARN_UNOPENED, "seek() on unopened file");
+ }
SETERRNO(EBADF,RMS$_IFI);
return FALSE;
}
-long
-do_sysseek(GV *gv, long int pos, int whence)
+Off_t
+Perl_do_sysseek(pTHX_ GV *gv, Off_t pos, int whence)
{
register IO *io;
register PerlIO *fp;
if (gv && (io = GvIO(gv)) && (fp = IoIFP(io)))
return PerlLIO_lseek(PerlIO_fileno(fp), pos, whence);
- if (PL_dowarn)
- warn("sysseek() on unopened file");
+ {
+ dTHR;
+ if (ckWARN(WARN_UNOPENED))
+ Perl_warner(aTHX_ WARN_UNOPENED, "sysseek() on unopened file");
+ }
SETERRNO(EBADF,RMS$_IFI);
- return -1L;
+ return (Off_t)-1;
}
int
-do_binmode(PerlIO *fp, int iotype, int flag)
+Perl_mode_from_discipline(pTHX_ SV *discp)
+{
+ int mode = O_BINARY;
+ if (discp) {
+ STRLEN len;
+ char *s = SvPV(discp,len);
+ while (*s) {
+ if (*s == ':') {
+ switch (s[1]) {
+ case 'r':
+ if (len > 3 && strnEQ(s+1, "raw", 3)
+ && (!s[4] || s[4] == ':' || isSPACE(s[4])))
+ {
+ mode = O_BINARY;
+ s += 4;
+ len -= 4;
+ break;
+ }
+ /* FALL THROUGH */
+ case 'c':
+ if (len > 4 && strnEQ(s+1, "crlf", 4)
+ && (!s[5] || s[5] == ':' || isSPACE(s[5])))
+ {
+ mode = O_TEXT;
+ s += 5;
+ len -= 5;
+ break;
+ }
+ /* FALL THROUGH */
+ default:
+ goto fail_discipline;
+ }
+ }
+ else if (isSPACE(*s)) {
+ ++s;
+ --len;
+ }
+ else {
+ char *end;
+fail_discipline:
+ end = strchr(s+1, ':');
+ if (!end)
+ end = s+len;
+ Perl_croak(aTHX_ "Unknown discipline '%.*s'", end-s, s);
+ }
+ }
+ }
+ return mode;
+}
+
+int
+Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode)
{
- if (flag != TRUE)
- croak("panic: unsetting binmode"); /* Not implemented yet */
#ifdef DOSISH
-#if defined(atarist) || defined(__MINT__)
- if (!PerlIO_flush(fp) && (fp->_flag |= _IOBIN))
+# if defined(atarist) || defined(__MINT__)
+ if (!PerlIO_flush(fp)) {
+ if (mode & O_BINARY)
+ ((FILE*)fp)->_flag |= _IOBIN;
+ else
+ ((FILE*)fp)->_flag &= ~ _IOBIN;
return 1;
- else
- return 0;
-#else
- if (PerlLIO_setmode(PerlIO_fileno(fp), OP_BINARY) != -1) {
-#if defined(WIN32) && defined(__BORLANDC__)
+ }
+ return 0;
+# else
+ if (PerlLIO_setmode(PerlIO_fileno(fp), mode) != -1) {
+# if defined(WIN32) && defined(__BORLANDC__)
/* The translation mode of the stream is maintained independent
* of the translation mode of the fd in the Borland RTL (heavy
* digging through their runtime sources reveal). User has to
@@ -777,22 +1043,25 @@ do_binmode(PerlIO *fp, int iotype, int flag)
* document this anywhere). GSAR 97-5-24
*/
PerlIO_seek(fp,0L,0);
- ((FILE*)fp)->flags |= _F_BIN;
-#endif
+ if (mode & O_BINARY)
+ ((FILE*)fp)->flags |= _F_BIN;
+ else
+ ((FILE*)fp)->flags &= ~ _F_BIN;
+# endif
return 1;
}
else
return 0;
-#endif
+# endif
#else
-#if defined(USEMYBINMODE)
- if (my_binmode(fp,iotype) != NULL)
+# if defined(USEMYBINMODE)
+ if (my_binmode(fp, iotype, mode) != FALSE)
return 1;
else
return 0;
-#else
+# else
return 1;
-#endif
+# endif
#endif
}
@@ -848,7 +1117,7 @@ Off_t length; /* length to set file to */
#endif /* F_FREESP */
bool
-do_print(register SV *sv, PerlIO *fp)
+Perl_do_print(pTHX_ register SV *sv, PerlIO *fp)
{
register char *tmps;
STRLEN len;
@@ -860,7 +1129,7 @@ do_print(register SV *sv, PerlIO *fp)
if (SvGMAGICAL(sv))
mg_get(sv);
if (SvIOK(sv) && SvIVX(sv) != 0) {
- PerlIO_printf(fp, PL_ofmt, (double)SvIVX(sv));
+ PerlIO_printf(fp, PL_ofmt, (NV)SvIVX(sv));
return !PerlIO_error(fp);
}
if ( (SvNOK(sv) && SvNVX(sv) != 0.0)
@@ -871,14 +1140,20 @@ do_print(register SV *sv, PerlIO *fp)
}
switch (SvTYPE(sv)) {
case SVt_NULL:
- if (PL_dowarn)
- warn(warn_uninit);
+ {
+ dTHR;
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
+ }
return TRUE;
case SVt_IV:
if (SvIOK(sv)) {
if (SvGMAGICAL(sv))
mg_get(sv);
- PerlIO_printf(fp, "%ld", (long)SvIVX(sv));
+ if (SvIsUV(sv))
+ PerlIO_printf(fp, "%"UVuf, (UV)SvUVX(sv));
+ else
+ PerlIO_printf(fp, "%"IVdf, (IV)SvIVX(sv));
return !PerlIO_error(fp);
}
/* FALL THROUGH */
@@ -886,13 +1161,19 @@ do_print(register SV *sv, PerlIO *fp)
tmps = SvPV(sv, len);
break;
}
+ /* To detect whether the process is about to overstep its
+ * filesize limit we would need getrlimit(). We could then
+ * also transparently raise the limit with setrlimit() --
+ * but only until the system hard limit/the filesystem limit,
+ * at which we would get EPERM. Note that when using buffered
+ * io the write failure can be delayed until the flush/close. --jhi */
if (len && (PerlIO_write(fp,tmps,len) == 0 || PerlIO_error(fp)))
return FALSE;
return !PerlIO_error(fp);
}
I32
-my_stat(ARGSproto)
+Perl_my_stat(pTHX)
{
djSP;
IO *io;
@@ -900,7 +1181,7 @@ my_stat(ARGSproto)
if (PL_op->op_flags & OPf_REF) {
EXTEND(SP,1);
- tmpgv = cGVOP->op_gv;
+ tmpgv = cGVOP_gv;
do_fstat:
io = GvIO(tmpgv);
if (io && IoIFP(io)) {
@@ -912,8 +1193,8 @@ my_stat(ARGSproto)
else {
if (tmpgv == PL_defgv)
return PL_laststatval;
- if (PL_dowarn)
- warn("Stat on unopened file <%s>",
+ if (ckWARN(WARN_UNOPENED))
+ Perl_warner(aTHX_ WARN_UNOPENED, "Stat on unopened file <%s>",
GvENAME(tmpgv));
PL_statgv = Nullgv;
sv_setpv(PL_statname,"");
@@ -939,26 +1220,26 @@ my_stat(ARGSproto)
sv_setpv(PL_statname, s);
PL_laststype = OP_STAT;
PL_laststatval = PerlLIO_stat(s, &PL_statcache);
- if (PL_laststatval < 0 && PL_dowarn && strchr(s, '\n'))
- warn(warn_nl, "stat");
+ if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(s, '\n'))
+ Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "stat");
return PL_laststatval;
}
}
I32
-my_lstat(ARGSproto)
+Perl_my_lstat(pTHX)
{
djSP;
SV *sv;
STRLEN n_a;
if (PL_op->op_flags & OPf_REF) {
EXTEND(SP,1);
- if (cGVOP->op_gv == PL_defgv) {
+ if (cGVOP_gv == PL_defgv) {
if (PL_laststype != OP_LSTAT)
- croak("The stat preceding -l _ wasn't an lstat");
+ Perl_croak(aTHX_ "The stat preceding -l _ wasn't an lstat");
return PL_laststatval;
}
- croak("You can't use -l on a filehandle");
+ Perl_croak(aTHX_ "You can't use -l on a filehandle");
}
PL_laststype = OP_LSTAT;
@@ -966,19 +1247,25 @@ my_lstat(ARGSproto)
sv = POPs;
PUTBACK;
sv_setpv(PL_statname,SvPV(sv, n_a));
-#ifdef HAS_LSTAT
PL_laststatval = PerlLIO_lstat(SvPV(sv, n_a),&PL_statcache);
-#else
- PL_laststatval = PerlLIO_stat(SvPV(sv, n_a),&PL_statcache);
-#endif
- if (PL_laststatval < 0 && PL_dowarn && strchr(SvPV(sv, n_a), '\n'))
- warn(warn_nl, "lstat");
+ if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(SvPV(sv, n_a), '\n'))
+ Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "lstat");
return PL_laststatval;
}
bool
-do_aexec(SV *really, register SV **mark, register SV **sp)
+Perl_do_aexec(pTHX_ SV *really, register SV **mark, register SV **sp)
{
+ return do_aexec5(really, mark, sp, 0, 0);
+}
+
+bool
+Perl_do_aexec5(pTHX_ SV *really, register SV **mark, register SV **sp,
+ int fd, int do_report)
+{
+#ifdef MACOS_TRADITIONAL
+ Perl_croak(aTHX_ "exec? I'm not *that* kind of operating system");
+#else
register char **a;
char *tmps;
STRLEN n_a;
@@ -1000,15 +1287,23 @@ do_aexec(SV *really, register SV **mark, register SV **sp)
PerlProc_execvp(tmps,PL_Argv);
else
PerlProc_execvp(PL_Argv[0],PL_Argv);
- if (PL_dowarn)
- warn("Can't exec \"%s\": %s", PL_Argv[0], Strerror(errno));
+ if (ckWARN(WARN_EXEC))
+ Perl_warner(aTHX_ WARN_EXEC, "Can't exec \"%s\": %s",
+ PL_Argv[0], Strerror(errno));
+ if (do_report) {
+ int e = errno;
+
+ PerlLIO_write(fd, (void*)&e, sizeof(int));
+ PerlLIO_close(fd);
+ }
}
do_execfree();
+#endif
return FALSE;
}
void
-do_execfree(void)
+Perl_do_execfree(pTHX)
{
if (PL_Argv) {
Safefree(PL_Argv);
@@ -1020,10 +1315,16 @@ do_execfree(void)
}
}
-#if !defined(OS2) && !defined(WIN32) && !defined(DJGPP)
+#if !defined(OS2) && !defined(WIN32) && !defined(DJGPP) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
+
+bool
+Perl_do_exec(pTHX_ char *cmd)
+{
+ return do_exec3(cmd,0,0);
+}
bool
-do_exec(char *cmd)
+Perl_do_exec3(pTHX_ char *cmd, int fd, int do_report)
{
register char **a;
register char *s;
@@ -1069,7 +1370,7 @@ do_exec(char *cmd)
if (strnEQ(cmd,"exec",4) && isSPACE(cmd[4]))
goto doshell;
- for (s = cmd; *s && isALPHA(*s); s++) ; /* catch VAR=val gizmo */
+ for (s = cmd; *s && isALNUM(*s); s++) ; /* catch VAR=val gizmo */
if (*s == '=')
goto doshell;
@@ -1079,6 +1380,20 @@ do_exec(char *cmd)
*s = '\0';
break;
}
+ /* handle the 2>&1 construct at the end */
+ if (*s == '>' && s[1] == '&' && s[2] == '1'
+ && s > cmd + 1 && s[-1] == '2' && isSPACE(s[-2])
+ && (!s[3] || isSPACE(s[3])))
+ {
+ char *t = s + 3;
+
+ while (*t && isSPACE(*t))
+ ++t;
+ if (!*t && (dup2(1,2) != -1)) {
+ s[-2] = '\0';
+ break;
+ }
+ }
doshell:
PerlProc_execl(PL_sh_path, "sh", "-c", cmd, (char*)0);
return FALSE;
@@ -1103,8 +1418,18 @@ do_exec(char *cmd)
do_execfree();
goto doshell;
}
- if (PL_dowarn)
- warn("Can't exec \"%s\": %s", PL_Argv[0], Strerror(errno));
+ {
+ dTHR;
+ int e = errno;
+
+ if (ckWARN(WARN_EXEC))
+ Perl_warner(aTHX_ WARN_EXEC, "Can't exec \"%s\": %s",
+ PL_Argv[0], Strerror(errno));
+ if (do_report) {
+ PerlLIO_write(fd, (void*)&e, sizeof(int));
+ PerlLIO_close(fd);
+ }
+ }
}
do_execfree();
return FALSE;
@@ -1113,7 +1438,7 @@ do_exec(char *cmd)
#endif /* OS2 || WIN32 */
I32
-apply(I32 type, register SV **mark, register SV **sp)
+Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp)
{
dTHR;
register I32 val;
@@ -1190,7 +1515,7 @@ nothing in the core.
if (*s == 'S' && s[1] == 'I' && s[2] == 'G')
s += 3;
if (!(val = whichsig(s)))
- croak("Unrecognized signal name \"%s\"",s);
+ Perl_croak(aTHX_ "Unrecognized signal name \"%s\"",s);
}
else
val = SvIVx(*mark);
@@ -1262,11 +1587,7 @@ nothing in the core.
tot--;
}
else { /* don't let root wipe out directories without -U */
-#ifdef HAS_LSTAT
if (PerlLIO_lstat(s,&PL_statbuf) < 0 || S_ISDIR(PL_statbuf.st_mode))
-#else
- if (PerlLIO_stat(s,&PL_statbuf) < 0 || S_ISDIR(PL_statbuf.st_mode))
-#endif
tot--;
else {
if (UNLINK(s))
@@ -1318,8 +1639,10 @@ nothing in the core.
/* Do the permissions allow some operation? Assumes statcache already set. */
#ifndef VMS /* VMS' cando is in vms.c */
-I32
-cando(I32 bit, I32 effective, register struct stat *statbufp)
+bool
+Perl_cando(pTHX_ Mode_t mode, Uid_t effective, register Stat_t *statbufp)
+/* Note: we use `effective' both for uids and gids.
+ * Here we are betting on Uid_t being equal or wider than Gid_t. */
{
#ifdef DOSISH
/* [Comments and code from Len Reed]
@@ -1343,11 +1666,11 @@ cando(I32 bit, I32 effective, register struct stat *statbufp)
/* Atari stat() does pretty much the same thing. we set x_bit_set_in_stat
* too so it will actually look into the files for magic numbers
*/
- return (bit & statbufp->st_mode) ? TRUE : FALSE;
+ return (mode & statbufp->st_mode) ? TRUE : FALSE;
#else /* ! DOSISH */
if ((effective ? PL_euid : PL_uid) == 0) { /* root is special */
- if (bit == S_IXUSR) {
+ if (mode == S_IXUSR) {
if (statbufp->st_mode & 0111 || S_ISDIR(statbufp->st_mode))
return TRUE;
}
@@ -1356,23 +1679,27 @@ cando(I32 bit, I32 effective, register struct stat *statbufp)
return FALSE;
}
if (statbufp->st_uid == (effective ? PL_euid : PL_uid) ) {
- if (statbufp->st_mode & bit)
+ if (statbufp->st_mode & mode)
return TRUE; /* ok as "user" */
}
- else if (ingroup((I32)statbufp->st_gid,effective)) {
- if (statbufp->st_mode & bit >> 3)
+ else if (ingroup(statbufp->st_gid,effective)) {
+ if (statbufp->st_mode & mode >> 3)
return TRUE; /* ok as "group" */
}
- else if (statbufp->st_mode & bit >> 6)
+ else if (statbufp->st_mode & mode >> 6)
return TRUE; /* ok as "other" */
return FALSE;
#endif /* ! DOSISH */
}
#endif /* ! VMS */
-I32
-ingroup(I32 testgid, I32 effective)
+bool
+Perl_ingroup(pTHX_ Gid_t testgid, Uid_t effective)
{
+#ifdef MACOS_TRADITIONAL
+ /* This is simply not correct for AppleShare, but fix it yerself. */
+ return TRUE;
+#else
if (testgid == (effective ? PL_egid : PL_gid))
return TRUE;
#ifdef HAS_GETGROUPS
@@ -1390,12 +1717,13 @@ ingroup(I32 testgid, I32 effective)
}
#endif
return FALSE;
+#endif
}
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
I32
-do_ipcget(I32 optype, SV **mark, SV **sp)
+Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp)
{
dTHR;
key_t key;
@@ -1421,14 +1749,14 @@ do_ipcget(I32 optype, SV **mark, SV **sp)
#endif
#if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM)
default:
- croak("%s not implemented", op_desc[optype]);
+ Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
#endif
}
return -1; /* should never happen */
}
I32
-do_ipcctl(I32 optype, SV **mark, SV **sp)
+Perl_do_ipcctl(pTHX_ I32 optype, SV **mark, SV **sp)
{
dTHR;
SV *astr;
@@ -1459,14 +1787,18 @@ do_ipcctl(I32 optype, SV **mark, SV **sp)
#endif
#ifdef HAS_SEM
case OP_SEMCTL:
+#ifdef Semctl
if (cmd == IPC_STAT || cmd == IPC_SET)
infosize = sizeof(struct semid_ds);
else if (cmd == GETALL || cmd == SETALL)
{
struct semid_ds semds;
union semun semun;
-
+#ifdef EXTRA_F_IN_SEMUN_BUF
+ semun.buff = &semds;
+#else
semun.buf = &semds;
+#endif
getinfo = (cmd == GETALL);
if (Semctl(id, 0, IPC_STAT, semun) == -1)
return -1;
@@ -1474,11 +1806,14 @@ do_ipcctl(I32 optype, SV **mark, SV **sp)
/* "short" is technically wrong but much more portable
than guessing about u_?short(_t)? */
}
+#else
+ Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
+#endif
break;
#endif
#if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM)
default:
- croak("%s not implemented", op_desc[optype]);
+ Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
#endif
}
@@ -1494,14 +1829,16 @@ do_ipcctl(I32 optype, SV **mark, SV **sp)
{
a = SvPV(astr, len);
if (len != infosize)
- croak("Bad arg length for %s, is %lu, should be %ld",
- op_desc[optype], (unsigned long)len, (long)infosize);
+ Perl_croak(aTHX_ "Bad arg length for %s, is %lu, should be %ld",
+ PL_op_desc[optype],
+ (unsigned long)len,
+ (long)infosize);
}
}
else
{
IV i = SvIV(astr);
- a = (char *)i; /* ouch */
+ a = INT2PTR(char *,i); /* ouch */
}
SETERRNO(0,0);
switch (optype)
@@ -1513,10 +1850,18 @@ do_ipcctl(I32 optype, SV **mark, SV **sp)
#endif
#ifdef HAS_SEM
case OP_SEMCTL: {
+#ifdef Semctl
union semun unsemds;
+#ifdef EXTRA_F_IN_SEMUN_BUF
+ unsemds.buff = (struct semid_ds *)a;
+#else
unsemds.buf = (struct semid_ds *)a;
+#endif
ret = Semctl(id, n, cmd, unsemds);
+#else
+ Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
+#endif
}
break;
#endif
@@ -1535,7 +1880,7 @@ do_ipcctl(I32 optype, SV **mark, SV **sp)
}
I32
-do_msgsnd(SV **mark, SV **sp)
+Perl_do_msgsnd(pTHX_ SV **mark, SV **sp)
{
#ifdef HAS_MSG
dTHR;
@@ -1549,16 +1894,16 @@ do_msgsnd(SV **mark, SV **sp)
flags = SvIVx(*++mark);
mbuf = SvPV(mstr, len);
if ((msize = len - sizeof(long)) < 0)
- croak("Arg too short for msgsnd");
+ Perl_croak(aTHX_ "Arg too short for msgsnd");
SETERRNO(0,0);
return msgsnd(id, (struct msgbuf *)mbuf, msize, flags);
#else
- croak("msgsnd not implemented");
+ Perl_croak(aTHX_ "msgsnd not implemented");
#endif
}
I32
-do_msgrcv(SV **mark, SV **sp)
+Perl_do_msgrcv(pTHX_ SV **mark, SV **sp)
{
#ifdef HAS_MSG
dTHR;
@@ -1573,12 +1918,6 @@ do_msgrcv(SV **mark, SV **sp)
msize = SvIVx(*++mark);
mtype = (long)SvIVx(*++mark);
flags = SvIVx(*++mark);
- if (SvTHINKFIRST(mstr)) {
- if (SvREADONLY(mstr))
- croak("Can't msgrcv to readonly var");
- if (SvROK(mstr))
- sv_unref(mstr);
- }
SvPV_force(mstr, len);
mbuf = SvGROW(mstr, sizeof(long)+msize+1);
@@ -1587,15 +1926,19 @@ do_msgrcv(SV **mark, SV **sp)
if (ret >= 0) {
SvCUR_set(mstr, sizeof(long)+ret);
*SvEND(mstr) = '\0';
+#ifndef INCOMPLETE_TAINTS
+ /* who knows who has been playing with this message? */
+ SvTAINTED_on(mstr);
+#endif
}
return ret;
#else
- croak("msgrcv not implemented");
+ Perl_croak(aTHX_ "msgrcv not implemented");
#endif
}
I32
-do_semop(SV **mark, SV **sp)
+Perl_do_semop(pTHX_ SV **mark, SV **sp)
{
#ifdef HAS_SEM
dTHR;
@@ -1615,12 +1958,12 @@ do_semop(SV **mark, SV **sp)
SETERRNO(0,0);
return semop(id, (struct sembuf *)opbuf, opsize/sizeof(struct sembuf));
#else
- croak("semop not implemented");
+ Perl_croak(aTHX_ "semop not implemented");
#endif
}
I32
-do_shmio(I32 optype, SV **mark, SV **sp)
+Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp)
{
#ifdef HAS_SHM
dTHR;
@@ -1645,6 +1988,9 @@ do_shmio(I32 optype, SV **mark, SV **sp)
if (shm == (char *)-1) /* I hate System V IPC, I really do */
return -1;
if (optype == OP_SHMREAD) {
+ /* suppress warning when reading into undef var (tchrist 3/Mar/00) */
+ if (! SvOK(mstr))
+ sv_setpvn(mstr, "", 0);
SvPV_force(mstr, len);
mbuf = SvGROW(mstr, msize+1);
@@ -1652,6 +1998,10 @@ do_shmio(I32 optype, SV **mark, SV **sp)
SvCUR_set(mstr, msize);
*SvEND(mstr) = '\0';
SvSETMAGIC(mstr);
+#ifndef INCOMPLETE_TAINTS
+ /* who knows who has been playing with this shared memory? */
+ SvTAINTED_on(mstr);
+#endif
}
else {
I32 n;
@@ -1665,7 +2015,7 @@ do_shmio(I32 optype, SV **mark, SV **sp)
}
return shmdt(shm);
#else
- croak("shm I/O not implemented");
+ Perl_croak(aTHX_ "shm I/O not implemented");
#endif
}
diff --git a/contrib/perl5/doop.c b/contrib/perl5/doop.c
index 85d7b9e..06b1b38 100644
--- a/contrib/perl5/doop.c
+++ b/contrib/perl5/doop.c
@@ -1,6 +1,6 @@
/* doop.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -12,86 +12,625 @@
*/
#include "EXTERN.h"
+#define PERL_IN_DOOP_C
#include "perl.h"
#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
#include <signal.h>
#endif
-I32
-do_trans(SV *sv, OP *arg)
+STATIC I32
+S_do_trans_CC_simple(pTHX_ SV *sv)
{
dTHR;
- register short *tbl;
- register U8 *s;
- register U8 *send;
- register U8 *d;
- register I32 ch;
- register I32 matches = 0;
- register I32 squash = PL_op->op_private & OPpTRANS_SQUASH;
- register U8 *p;
+ U8 *s;
+ U8 *send;
+ I32 matches = 0;
STRLEN len;
+ short *tbl;
+ I32 ch;
- if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_COUNTONLY))
- croak(no_modify);
tbl = (short*)cPVOP->op_pv;
+ if (!tbl)
+ Perl_croak(aTHX_ "panic: do_trans");
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ while (s < send) {
+ if ((ch = tbl[*s]) >= 0) {
+ matches++;
+ *s = ch;
+ }
+ s++;
+ }
+ SvSETMAGIC(sv);
+
+ return matches;
+}
+
+STATIC I32
+S_do_trans_CC_count(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ I32 matches = 0;
+ STRLEN len;
+ short *tbl;
+
+ tbl = (short*)cPVOP->op_pv;
+ if (!tbl)
+ Perl_croak(aTHX_ "panic: do_trans");
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ while (s < send) {
+ if (tbl[*s] >= 0)
+ matches++;
+ s++;
+ }
+
+ return matches;
+}
+
+STATIC I32
+S_do_trans_CC_complex(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ U8 *d;
+ I32 matches = 0;
+ STRLEN len;
+ short *tbl;
+ I32 ch;
+
+ tbl = (short*)cPVOP->op_pv;
+ if (!tbl)
+ Perl_croak(aTHX_ "panic: do_trans");
+
s = (U8*)SvPV(sv, len);
- if (!len)
- return 0;
- if (!SvPOKp(sv))
- s = (U8*)SvPV_force(sv, len);
- (void)SvPOK_only(sv);
send = s + len;
- if (!tbl || !s)
- croak("panic: do_trans");
- DEBUG_t( deb("2.TBL\n"));
- if (!PL_op->op_private) {
+
+ d = s;
+ if (PL_op->op_private & OPpTRANS_SQUASH) {
+ U8* p = send;
+
while (s < send) {
if ((ch = tbl[*s]) >= 0) {
+ *d = ch;
matches++;
- *s = ch;
+ if (p == d - 1 && *p == *d)
+ matches--;
+ else
+ p = d++;
}
+ else if (ch == -1) /* -1 is unmapped character */
+ *d++ = *s; /* -2 is delete character */
s++;
}
- SvSETMAGIC(sv);
}
- else if (PL_op->op_private & OPpTRANS_COUNTONLY) {
+ else {
while (s < send) {
- if (tbl[*s] >= 0)
+ if ((ch = tbl[*s]) >= 0) {
+ *d = ch;
matches++;
+ d++;
+ }
+ else if (ch == -1) /* -1 is unmapped character */
+ *d++ = *s; /* -2 is delete character */
s++;
}
}
+ matches += send - d; /* account for disappeared chars */
+ *d = '\0';
+ SvCUR_set(sv, d - (U8*)SvPVX(sv));
+ SvSETMAGIC(sv);
+
+ return matches;
+}
+
+STATIC I32
+S_do_trans_UU_simple(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ U8 *d;
+ I32 matches = 0;
+ STRLEN len;
+
+ SV* rv = (SV*)cSVOP->op_sv;
+ HV* hv = (HV*)SvRV(rv);
+ SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
+ UV none = svp ? SvUV(*svp) : 0x7fffffff;
+ UV extra = none + 1;
+ UV final;
+ UV uv;
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ svp = hv_fetch(hv, "FINAL", 5, FALSE);
+ if (svp)
+ final = SvUV(*svp);
+
+ d = s;
+ while (s < send) {
+ if ((uv = swash_fetch(rv, s)) < none) {
+ s += UTF8SKIP(s);
+ matches++;
+ d = uv_to_utf8(d, uv);
+ }
+ else if (uv == none) {
+ int i;
+ for (i = UTF8SKIP(s); i; i--)
+ *d++ = *s++;
+ }
+ else if (uv == extra) {
+ s += UTF8SKIP(s);
+ matches++;
+ d = uv_to_utf8(d, final);
+ }
+ else
+ s += UTF8SKIP(s);
+ }
+ *d = '\0';
+ SvCUR_set(sv, d - (U8*)SvPVX(sv));
+ SvSETMAGIC(sv);
+
+ return matches;
+}
+
+STATIC I32
+S_do_trans_UU_count(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ I32 matches = 0;
+ STRLEN len;
+
+ SV* rv = (SV*)cSVOP->op_sv;
+ HV* hv = (HV*)SvRV(rv);
+ SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
+ UV none = svp ? SvUV(*svp) : 0x7fffffff;
+ UV uv;
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ while (s < send) {
+ if ((uv = swash_fetch(rv, s)) < none)
+ matches++;
+ s += UTF8SKIP(s);
+ }
+
+ return matches;
+}
+
+STATIC I32
+S_do_trans_UC_simple(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ U8 *d;
+ I32 matches = 0;
+ STRLEN len;
+
+ SV* rv = (SV*)cSVOP->op_sv;
+ HV* hv = (HV*)SvRV(rv);
+ SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
+ UV none = svp ? SvUV(*svp) : 0x7fffffff;
+ UV extra = none + 1;
+ UV final;
+ UV uv;
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ svp = hv_fetch(hv, "FINAL", 5, FALSE);
+ if (svp)
+ final = SvUV(*svp);
+
+ d = s;
+ while (s < send) {
+ if ((uv = swash_fetch(rv, s)) < none) {
+ s += UTF8SKIP(s);
+ matches++;
+ *d++ = (U8)uv;
+ }
+ else if (uv == none) {
+ I32 ulen;
+ uv = utf8_to_uv(s, &ulen);
+ s += ulen;
+ *d++ = (U8)uv;
+ }
+ else if (uv == extra) {
+ s += UTF8SKIP(s);
+ matches++;
+ *d++ = (U8)final;
+ }
+ else
+ s += UTF8SKIP(s);
+ }
+ *d = '\0';
+ SvCUR_set(sv, d - (U8*)SvPVX(sv));
+ SvSETMAGIC(sv);
+
+ return matches;
+}
+
+STATIC I32
+S_do_trans_CU_simple(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ U8 *d;
+ U8 *dst;
+ I32 matches = 0;
+ STRLEN len;
+
+ SV* rv = (SV*)cSVOP->op_sv;
+ HV* hv = (HV*)SvRV(rv);
+ SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
+ UV none = svp ? SvUV(*svp) : 0x7fffffff;
+ UV extra = none + 1;
+ UV final;
+ UV uv;
+ U8 tmpbuf[UTF8_MAXLEN];
+ I32 bits = 16;
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ svp = hv_fetch(hv, "BITS", 4, FALSE);
+ if (svp)
+ bits = (I32)SvIV(*svp);
+
+ svp = hv_fetch(hv, "FINAL", 5, FALSE);
+ if (svp)
+ final = SvUV(*svp);
+
+ Newz(801, d, len * (bits >> 3) + 1, U8);
+ dst = d;
+
+ while (s < send) {
+ uv = *s++;
+ if (uv < 0x80)
+ tmpbuf[0] = uv;
+ else {
+ tmpbuf[0] = (( uv >> 6) | 0xc0);
+ tmpbuf[1] = (( uv & 0x3f) | 0x80);
+ }
+
+ if ((uv = swash_fetch(rv, tmpbuf)) < none) {
+ matches++;
+ d = uv_to_utf8(d, uv);
+ }
+ else if (uv == none)
+ d = uv_to_utf8(d, s[-1]);
+ else if (uv == extra) {
+ matches++;
+ d = uv_to_utf8(d, final);
+ }
+ }
+ *d = '\0';
+ sv_usepvn_mg(sv, (char*)dst, d - dst);
+
+ return matches;
+}
+
+/* utf-8 to latin-1 */
+
+STATIC I32
+S_do_trans_UC_trivial(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ U8 *d;
+ STRLEN len;
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ d = s;
+ while (s < send) {
+ if (*s < 0x80)
+ *d++ = *s++;
+ else {
+ I32 ulen;
+ UV uv = utf8_to_uv(s, &ulen);
+ s += ulen;
+ *d++ = (U8)uv;
+ }
+ }
+ *d = '\0';
+ SvCUR_set(sv, d - (U8*)SvPVX(sv));
+ SvSETMAGIC(sv);
+
+ return SvCUR(sv);
+}
+
+/* latin-1 to utf-8 */
+
+STATIC I32
+S_do_trans_CU_trivial(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ U8 *d;
+ U8 *dst;
+ I32 matches;
+ STRLEN len;
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ Newz(801, d, len * 2 + 1, U8);
+ dst = d;
+
+ matches = send - s;
+
+ while (s < send) {
+ if (*s < 0x80)
+ *d++ = *s++;
+ else {
+ UV uv = *s++;
+ *d++ = (( uv >> 6) | 0xc0);
+ *d++ = (( uv & 0x3f) | 0x80);
+ }
+ }
+ *d = '\0';
+ sv_usepvn_mg(sv, (char*)dst, d - dst);
+
+ return matches;
+}
+
+STATIC I32
+S_do_trans_UU_complex(pTHX_ SV *sv)
+{
+ dTHR;
+ U8 *s;
+ U8 *send;
+ U8 *d;
+ I32 matches = 0;
+ I32 squash = PL_op->op_private & OPpTRANS_SQUASH;
+ I32 from_utf = PL_op->op_private & OPpTRANS_FROM_UTF;
+ I32 to_utf = PL_op->op_private & OPpTRANS_TO_UTF;
+ I32 del = PL_op->op_private & OPpTRANS_DELETE;
+ SV* rv = (SV*)cSVOP->op_sv;
+ HV* hv = (HV*)SvRV(rv);
+ SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
+ UV none = svp ? SvUV(*svp) : 0x7fffffff;
+ UV extra = none + 1;
+ UV final;
+ UV uv;
+ STRLEN len;
+ U8 *dst;
+
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+
+ svp = hv_fetch(hv, "FINAL", 5, FALSE);
+ if (svp)
+ final = SvUV(*svp);
+
+ if (PL_op->op_private & OPpTRANS_GROWS) {
+ I32 bits = 16;
+
+ svp = hv_fetch(hv, "BITS", 4, FALSE);
+ if (svp)
+ bits = (I32)SvIV(*svp);
+
+ Newz(801, d, len * (bits >> 3) + 1, U8);
+ dst = d;
+ }
else {
d = s;
- p = send;
+ dst = 0;
+ }
+
+ if (squash) {
+ UV puv = 0xfeedface;
while (s < send) {
- if ((ch = tbl[*s]) >= 0) {
- *d = ch;
+ if (from_utf) {
+ uv = swash_fetch(rv, s);
+ }
+ else {
+ U8 tmpbuf[2];
+ uv = *s++;
+ if (uv < 0x80)
+ tmpbuf[0] = uv;
+ else {
+ tmpbuf[0] = (( uv >> 6) | 0xc0);
+ tmpbuf[1] = (( uv & 0x3f) | 0x80);
+ }
+ uv = swash_fetch(rv, tmpbuf);
+ }
+ if (uv < none) {
+ matches++;
+ if (uv != puv) {
+ if (uv >= 0x80 && to_utf)
+ d = uv_to_utf8(d, uv);
+ else
+ *d++ = (U8)uv;
+ puv = uv;
+ }
+ if (from_utf)
+ s += UTF8SKIP(s);
+ continue;
+ }
+ else if (uv == none) { /* "none" is unmapped character */
+ if (from_utf) {
+ if (*s < 0x80)
+ *d++ = *s++;
+ else if (to_utf) {
+ int i;
+ for (i = UTF8SKIP(s); i; --i)
+ *d++ = *s++;
+ }
+ else {
+ I32 ulen;
+ *d++ = (U8)utf8_to_uv(s, &ulen);
+ s += ulen;
+ }
+ }
+ else { /* must be to_utf only */
+ d = uv_to_utf8(d, s[-1]);
+ }
+ puv = 0xfeedface;
+ continue;
+ }
+ else if (uv == extra && !del) {
matches++;
- if (squash) {
- if (p == d - 1 && *p == *d)
- matches--;
+ if (uv != puv) {
+ if (final >= 0x80 && to_utf)
+ d = uv_to_utf8(d, final);
else
- p = d++;
+ *d++ = (U8)final;
+ puv = final;
+ }
+ if (from_utf)
+ s += UTF8SKIP(s);
+ continue;
+ }
+ matches++; /* "none+1" is delete character */
+ if (from_utf)
+ s += UTF8SKIP(s);
+ }
+ }
+ else {
+ while (s < send) {
+ if (from_utf) {
+ uv = swash_fetch(rv, s);
+ }
+ else {
+ U8 tmpbuf[2];
+ uv = *s++;
+ if (uv < 0x80)
+ tmpbuf[0] = uv;
+ else {
+ tmpbuf[0] = (( uv >> 6) | 0xc0);
+ tmpbuf[1] = (( uv & 0x3f) | 0x80);
}
+ uv = swash_fetch(rv, tmpbuf);
+ }
+ if (uv < none) {
+ matches++;
+ if (uv >= 0x80 && to_utf)
+ d = uv_to_utf8(d, uv);
else
- d++;
+ *d++ = (U8)uv;
+ if (from_utf)
+ s += UTF8SKIP(s);
+ continue;
}
- else if (ch == -1) /* -1 is unmapped character */
- *d++ = *s; /* -2 is delete character */
- s++;
+ else if (uv == none) { /* "none" is unmapped character */
+ if (from_utf) {
+ if (*s < 0x80)
+ *d++ = *s++;
+ else if (to_utf) {
+ int i;
+ for (i = UTF8SKIP(s); i; --i)
+ *d++ = *s++;
+ }
+ else {
+ I32 ulen;
+ *d++ = (U8)utf8_to_uv(s, &ulen);
+ s += ulen;
+ }
+ }
+ else { /* must be to_utf only */
+ d = uv_to_utf8(d, s[-1]);
+ }
+ continue;
+ }
+ else if (uv == extra && !del) {
+ matches++;
+ if (final >= 0x80 && to_utf)
+ d = uv_to_utf8(d, final);
+ else
+ *d++ = (U8)final;
+ if (from_utf)
+ s += UTF8SKIP(s);
+ continue;
+ }
+ matches++; /* "none+1" is delete character */
+ if (from_utf)
+ s += UTF8SKIP(s);
}
- matches += send - d; /* account for disappeared chars */
+ }
+ if (dst)
+ sv_usepvn(sv, (char*)dst, d - dst);
+ else {
*d = '\0';
SvCUR_set(sv, d - (U8*)SvPVX(sv));
- SvSETMAGIC(sv);
}
+ SvSETMAGIC(sv);
+
return matches;
}
+I32
+Perl_do_trans(pTHX_ SV *sv)
+{
+ dTHR;
+ STRLEN len;
+
+ if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
+ Perl_croak(aTHX_ PL_no_modify);
+
+ (void)SvPV(sv, len);
+ if (!len)
+ return 0;
+ if (!SvPOKp(sv))
+ (void)SvPV_force(sv, len);
+ (void)SvPOK_only(sv);
+
+ DEBUG_t( Perl_deb(aTHX_ "2.TBL\n"));
+
+ switch (PL_op->op_private & 63) {
+ case 0:
+ return do_trans_CC_simple(sv);
+
+ case OPpTRANS_FROM_UTF:
+ return do_trans_UC_simple(sv);
+
+ case OPpTRANS_TO_UTF:
+ return do_trans_CU_simple(sv);
+
+ case OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF:
+ return do_trans_UU_simple(sv);
+
+ case OPpTRANS_IDENTICAL:
+ return do_trans_CC_count(sv);
+
+ case OPpTRANS_FROM_UTF|OPpTRANS_IDENTICAL:
+ return do_trans_UC_trivial(sv);
+
+ case OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL:
+ return do_trans_CU_trivial(sv);
+
+ case OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL:
+ return do_trans_UU_count(sv);
+
+ default:
+ if (PL_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF))
+ return do_trans_UU_complex(sv); /* could be UC or CU too */
+ else
+ return do_trans_CC_complex(sv);
+ }
+}
+
void
-do_join(register SV *sv, SV *del, register SV **mark, register SV **sp)
+Perl_do_join(pTHX_ register SV *sv, SV *del, register SV **mark, register SV **sp)
{
SV **oldmark = mark;
register I32 items = sp - mark;
@@ -102,8 +641,7 @@ do_join(register SV *sv, SV *del, register SV **mark, register SV **sp)
mark++;
len = (items > 0 ? (delimlen * (items - 1) ) : 0);
- if (SvTYPE(sv) < SVt_PV)
- sv_upgrade(sv, SVt_PV);
+ (void)SvUPGRADE(sv, SVt_PV);
if (SvLEN(sv) < len + items) { /* current length is way too short */
while (items-- > 0) {
if (*mark && !SvGMAGICAL(*mark) && SvOK(*mark)) {
@@ -115,7 +653,7 @@ do_join(register SV *sv, SV *del, register SV **mark, register SV **sp)
SvGROW(sv, len + 1); /* so try to pre-extend */
mark = oldmark;
- items = sp - mark;;
+ items = sp - mark;
++mark;
}
@@ -147,7 +685,7 @@ do_join(register SV *sv, SV *del, register SV **mark, register SV **sp)
}
void
-do_sprintf(SV *sv, I32 len, SV **sarg)
+Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg)
{
STRLEN patlen;
char *pat = SvPV(*sarg, patlen);
@@ -159,14 +697,146 @@ do_sprintf(SV *sv, I32 len, SV **sarg)
SvTAINTED_on(sv);
}
+UV
+Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
+{
+ STRLEN srclen, len;
+ unsigned char *s = (unsigned char *) SvPV(sv, srclen);
+ UV retnum = 0;
+
+ if (offset < 0)
+ return retnum;
+ 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 > srclen) {
+ if (size <= 8)
+ retnum = 0;
+ else {
+ offset >>= 3; /* turn into byte offset */
+ if (size == 16) {
+ if (offset >= srclen)
+ retnum = 0;
+ else
+ retnum = (UV) s[offset] << 8;
+ }
+ else if (size == 32) {
+ if (offset >= srclen)
+ retnum = 0;
+ else if (offset + 1 >= srclen)
+ retnum =
+ ((UV) s[offset ] << 24);
+ else if (offset + 2 >= srclen)
+ retnum =
+ ((UV) s[offset ] << 24) +
+ ((UV) s[offset + 1] << 16);
+ else
+ retnum =
+ ((UV) s[offset ] << 24) +
+ ((UV) s[offset + 1] << 16) +
+ ( s[offset + 2] << 8);
+ }
+#ifdef UV_IS_QUAD
+ else if (size == 64) {
+ dTHR;
+ if (ckWARN(WARN_PORTABLE))
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "Bit vector size > 32 non-portable");
+ if (offset >= srclen)
+ retnum = 0;
+ else if (offset + 1 >= srclen)
+ retnum =
+ (UV) s[offset ] << 56;
+ else if (offset + 2 >= srclen)
+ retnum =
+ ((UV) s[offset ] << 56) +
+ ((UV) s[offset + 1] << 48);
+ else if (offset + 3 >= srclen)
+ retnum =
+ ((UV) s[offset ] << 56) +
+ ((UV) s[offset + 1] << 48) +
+ ((UV) s[offset + 2] << 40);
+ else if (offset + 4 >= srclen)
+ retnum =
+ ((UV) s[offset ] << 56) +
+ ((UV) s[offset + 1] << 48) +
+ ((UV) s[offset + 2] << 40) +
+ ((UV) s[offset + 3] << 32);
+ else if (offset + 5 >= srclen)
+ retnum =
+ ((UV) s[offset ] << 56) +
+ ((UV) s[offset + 1] << 48) +
+ ((UV) s[offset + 2] << 40) +
+ ((UV) s[offset + 3] << 32) +
+ ( s[offset + 4] << 24);
+ else if (offset + 6 >= srclen)
+ retnum =
+ ((UV) s[offset ] << 56) +
+ ((UV) s[offset + 1] << 48) +
+ ((UV) s[offset + 2] << 40) +
+ ((UV) s[offset + 3] << 32) +
+ ((UV) s[offset + 4] << 24) +
+ ((UV) s[offset + 5] << 16);
+ else
+ retnum =
+ ((UV) s[offset ] << 56) +
+ ((UV) s[offset + 1] << 48) +
+ ((UV) s[offset + 2] << 40) +
+ ((UV) s[offset + 3] << 32) +
+ ((UV) s[offset + 4] << 24) +
+ ((UV) s[offset + 5] << 16) +
+ ( s[offset + 6] << 8);
+ }
+#endif
+ }
+ }
+ else if (size < 8)
+ retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
+ else {
+ offset >>= 3; /* turn into byte offset */
+ if (size == 8)
+ retnum = s[offset];
+ else if (size == 16)
+ retnum =
+ ((UV) s[offset] << 8) +
+ s[offset + 1];
+ else if (size == 32)
+ retnum =
+ ((UV) s[offset ] << 24) +
+ ((UV) s[offset + 1] << 16) +
+ ( s[offset + 2] << 8) +
+ s[offset + 3];
+#ifdef UV_IS_QUAD
+ else if (size == 64) {
+ dTHR;
+ if (ckWARN(WARN_PORTABLE))
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "Bit vector size > 32 non-portable");
+ retnum =
+ ((UV) s[offset ] << 56) +
+ ((UV) s[offset + 1] << 48) +
+ ((UV) s[offset + 2] << 40) +
+ ((UV) s[offset + 3] << 32) +
+ ((UV) s[offset + 4] << 24) +
+ ((UV) s[offset + 5] << 16) +
+ ( s[offset + 6] << 8) +
+ s[offset + 7];
+ }
+#endif
+ }
+
+ return retnum;
+}
+
void
-do_vecset(SV *sv)
+Perl_do_vecset(pTHX_ SV *sv)
{
SV *targ = LvTARG(sv);
register I32 offset;
register I32 size;
register unsigned char *s;
- register unsigned long lval;
+ register UV lval;
I32 mask;
STRLEN targlen;
STRLEN len;
@@ -174,11 +844,14 @@ do_vecset(SV *sv)
if (!targ)
return;
s = (unsigned char*)SvPV_force(targ, targlen);
- lval = U_L(SvNV(sv));
+ lval = SvUV(sv);
offset = LvTARGOFF(sv);
size = LvTARGLEN(sv);
+ if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
+ Perl_croak(aTHX_ "Illegal number of bits in vec");
- len = (offset + size + 7) / 8;
+ offset *= size; /* turn into bit offset */
+ len = (offset + size + 7) / 8; /* required number of bytes */
if (len > targlen) {
s = (unsigned char*)SvGROW(targ, len + 1);
(void)memzero(s + targlen, len - targlen + 1);
@@ -189,32 +862,50 @@ do_vecset(SV *sv)
mask = (1 << size) - 1;
size = offset & 7;
lval &= mask;
- offset >>= 3;
+ offset >>= 3; /* turn into byte offset */
s[offset] &= ~(mask << size);
s[offset] |= lval << size;
}
else {
- offset >>= 3;
+ offset >>= 3; /* turn into byte offset */
if (size == 8)
- s[offset] = lval & 255;
+ s[offset ] = lval & 0xff;
else if (size == 16) {
- s[offset] = (lval >> 8) & 255;
- s[offset+1] = lval & 255;
+ s[offset ] = (lval >> 8) & 0xff;
+ s[offset+1] = lval & 0xff;
}
else if (size == 32) {
- s[offset] = (lval >> 24) & 255;
- s[offset+1] = (lval >> 16) & 255;
- s[offset+2] = (lval >> 8) & 255;
- s[offset+3] = lval & 255;
+ s[offset ] = (lval >> 24) & 0xff;
+ s[offset+1] = (lval >> 16) & 0xff;
+ s[offset+2] = (lval >> 8) & 0xff;
+ s[offset+3] = lval & 0xff;
}
+#ifdef UV_IS_QUAD
+ else if (size == 64) {
+ dTHR;
+ if (ckWARN(WARN_PORTABLE))
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "Bit vector size > 32 non-portable");
+ s[offset ] = (lval >> 56) & 0xff;
+ s[offset+1] = (lval >> 48) & 0xff;
+ s[offset+2] = (lval >> 40) & 0xff;
+ s[offset+3] = (lval >> 32) & 0xff;
+ s[offset+4] = (lval >> 24) & 0xff;
+ s[offset+5] = (lval >> 16) & 0xff;
+ s[offset+6] = (lval >> 8) & 0xff;
+ s[offset+7] = lval & 0xff;
+ }
+#endif
}
+ SvSETMAGIC(targ);
}
void
-do_chop(register SV *astr, register SV *sv)
+Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
{
STRLEN len;
char *s;
+ dTHR;
if (SvTYPE(sv) == SVt_PVAV) {
register I32 i;
@@ -228,32 +919,53 @@ do_chop(register SV *astr, register SV *sv)
}
return;
}
- if (SvTYPE(sv) == SVt_PVHV) {
+ else if (SvTYPE(sv) == SVt_PVHV) {
HV* hv = (HV*)sv;
HE* entry;
(void)hv_iterinit(hv);
/*SUPPRESS 560*/
- while (entry = hv_iternext(hv))
+ while ((entry = hv_iternext(hv)))
do_chop(astr,hv_iterval(hv,entry));
return;
}
+ else if (SvREADONLY(sv))
+ Perl_croak(aTHX_ PL_no_modify);
s = SvPV(sv, len);
if (len && !SvPOK(sv))
s = SvPV_force(sv, len);
- if (s && len) {
+ if (DO_UTF8(sv)) {
+ if (s && len) {
+ char *send = s + len;
+ char *start = s;
+ s = send - 1;
+ while ((*s & 0xc0) == 0x80)
+ --s;
+ if (UTF8SKIP(s) != send - s && ckWARN_d(WARN_UTF8))
+ Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
+ sv_setpvn(astr, s, send - s);
+ *s = '\0';
+ SvCUR_set(sv, s - start);
+ SvNIOK_off(sv);
+ SvUTF8_on(astr);
+ }
+ else
+ sv_setpvn(astr, "", 0);
+ }
+ else if (s && len) {
s += --len;
sv_setpvn(astr, s, 1);
*s = '\0';
SvCUR_set(sv, len);
+ SvUTF8_off(sv);
SvNIOK_off(sv);
}
else
sv_setpvn(astr, "", 0);
SvSETMAGIC(sv);
-}
+}
I32
-do_chomp(register SV *sv)
+Perl_do_chomp(pTHX_ register SV *sv)
{
dTHR;
register I32 count;
@@ -262,6 +974,8 @@ do_chomp(register SV *sv)
if (RsSNARF(PL_rs))
return 0;
+ if (RsRECORD(PL_rs))
+ return 0;
count = 0;
if (SvTYPE(sv) == SVt_PVAV) {
register I32 i;
@@ -275,15 +989,17 @@ do_chomp(register SV *sv)
}
return count;
}
- if (SvTYPE(sv) == SVt_PVHV) {
+ else if (SvTYPE(sv) == SVt_PVHV) {
HV* hv = (HV*)sv;
HE* entry;
(void)hv_iterinit(hv);
/*SUPPRESS 560*/
- while (entry = hv_iternext(hv))
+ while ((entry = hv_iternext(hv)))
count += do_chomp(hv_iterval(hv,entry));
return count;
}
+ else if (SvREADONLY(sv))
+ Perl_croak(aTHX_ PL_no_modify);
s = SvPV(sv, len);
if (len && !SvPOKp(sv))
s = SvPV_force(sv, len);
@@ -327,7 +1043,7 @@ do_chomp(register SV *sv)
}
void
-do_vop(I32 optype, SV *sv, SV *left, SV *right)
+Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
{
dTHR; /* just for taint */
#ifdef LIBERAL
@@ -344,6 +1060,13 @@ do_vop(I32 optype, SV *sv, SV *left, SV *right)
I32 lensave;
char *lsave;
char *rsave;
+ bool left_utf = DO_UTF8(left);
+ bool right_utf = DO_UTF8(right);
+
+ if (left_utf && !right_utf)
+ sv_utf8_upgrade(right);
+ if (!left_utf && right_utf)
+ sv_utf8_upgrade(left);
if (sv != left || (optype != OP_BIT_AND && !SvOK(sv) && !SvGMAGICAL(sv)))
sv_setpvn(sv, "", 0); /* avoid undef warning on |= and ^= */
@@ -368,6 +1091,69 @@ do_vop(I32 optype, SV *sv, SV *left, SV *right)
}
SvCUR_set(sv, len);
(void)SvPOK_only(sv);
+ if (left_utf || right_utf) {
+ UV duc, luc, ruc;
+ STRLEN lulen = leftlen;
+ STRLEN rulen = rightlen;
+ STRLEN dulen = 0;
+ I32 ulen;
+
+ if (optype != OP_BIT_AND)
+ dc = SvGROW(sv, leftlen+rightlen+1);
+
+ switch (optype) {
+ case OP_BIT_AND:
+ while (lulen && rulen) {
+ luc = utf8_to_uv((U8*)lc, &ulen);
+ lc += ulen;
+ lulen -= ulen;
+ ruc = utf8_to_uv((U8*)rc, &ulen);
+ rc += ulen;
+ rulen -= ulen;
+ duc = luc & ruc;
+ dc = (char*)uv_to_utf8((U8*)dc, duc);
+ }
+ dulen = dc - SvPVX(sv);
+ SvCUR_set(sv, dulen);
+ break;
+ case OP_BIT_XOR:
+ while (lulen && rulen) {
+ luc = utf8_to_uv((U8*)lc, &ulen);
+ lc += ulen;
+ lulen -= ulen;
+ ruc = utf8_to_uv((U8*)rc, &ulen);
+ rc += ulen;
+ rulen -= ulen;
+ duc = luc ^ ruc;
+ dc = (char*)uv_to_utf8((U8*)dc, duc);
+ }
+ goto mop_up_utf;
+ case OP_BIT_OR:
+ while (lulen && rulen) {
+ luc = utf8_to_uv((U8*)lc, &ulen);
+ lc += ulen;
+ lulen -= ulen;
+ ruc = utf8_to_uv((U8*)rc, &ulen);
+ rc += ulen;
+ rulen -= ulen;
+ duc = luc | ruc;
+ dc = (char*)uv_to_utf8((U8*)dc, duc);
+ }
+ mop_up_utf:
+ dulen = dc - SvPVX(sv);
+ SvCUR_set(sv, dulen);
+ if (rulen)
+ sv_catpvn(sv, rc, rulen);
+ else if (lulen)
+ sv_catpvn(sv, lc, lulen);
+ else
+ *SvEND(sv) = '\0';
+ break;
+ }
+ SvUTF8_on(sv);
+ goto finish;
+ }
+ else
#ifdef LIBERAL
if (len >= sizeof(long)*4 &&
!((long)dc % sizeof(long)) &&
@@ -438,11 +1224,12 @@ do_vop(I32 optype, SV *sv, SV *left, SV *right)
break;
}
}
+finish:
SvTAINT(sv);
}
OP *
-do_kv(ARGSproto)
+Perl_do_kv(pTHX)
{
djSP;
HV *hv = (HV*)POPs;
@@ -506,16 +1293,15 @@ do_kv(ARGSproto)
EXTEND(SP, HvKEYS(keys) * (dokeys + dovalues));
PUTBACK; /* hv_iternext and hv_iterval might clobber stack_sp */
- while (entry = hv_iternext(keys)) {
+ while ((entry = hv_iternext(keys))) {
SPAGAIN;
if (dokeys)
XPUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
if (dovalues) {
- tmpstr = sv_newmortal();
PUTBACK;
- sv_setsv(tmpstr,realhv ?
- hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry));
- DEBUG_H(sv_setpvf(tmpstr, "%lu%%%d=%lu",
+ tmpstr = realhv ?
+ hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry);
+ DEBUG_H(Perl_sv_setpvf(aTHX_ tmpstr, "%lu%%%d=%lu",
(unsigned long)HeHASH(entry),
HvMAX(keys)+1,
(unsigned long)(HeHASH(entry) & HvMAX(keys))));
diff --git a/contrib/perl5/dosish.h b/contrib/perl5/dosish.h
index 1d52d0c..08b48fa 100644
--- a/contrib/perl5/dosish.h
+++ b/contrib/perl5/dosish.h
@@ -8,6 +8,7 @@
# define BIT_BUCKET "nul"
# define OP_BINARY O_BINARY
# define PERL_SYS_INIT(c,v) Perl_DJGPP_init(c,v)
+# define init_os_extras Perl_init_os_extras
# include <signal.h>
# define HAS_UTIME
# define HAS_KILL
@@ -16,21 +17,9 @@
# define NO_LOCALECONV_MON_THOUSANDS_SEP
# endif
# ifdef USE_THREADS
-# define NEED_PTHREAD_INIT
# define OLD_PTHREADS_API
-# define YIELD pthread_yield(NULL)
-# define DETACH(t) \
- STMT_START { \
- if (pthread_detach(&(t)->self)) { \
- MUTEX_UNLOCK(&(t)->mutex); \
- croak("panic: DETACH"); \
- } \
- } STMT_END
-# define pthread_mutexattr_default NULL
-# define pthread_condattr_default NULL
-# define pthread_addr_t any_t
-# define PTHREAD_CREATE_JOINABLE (&err)
# endif
+# define PERL_FS_VER_FMT "%d_%d_%d"
#else /* DJGPP */
# ifdef WIN32
# define PERL_SYS_INIT(c,v) Perl_win32_init(c,v)
@@ -41,9 +30,8 @@
# endif
#endif /* DJGPP */
-#define PERL_SYS_TERM() MALLOC_TERM
+#define PERL_SYS_TERM() OP_REFCNT_TERM; MALLOC_TERM
#define dXSUB_SYS
-#define TMPPATH "plXXXXXX"
/*
* 5.003_07 and earlier keyed on #ifdef MSDOS for determining if we were
@@ -64,7 +52,7 @@
/* USEMYBINMODE
* This symbol, if defined, indicates that the program should
- * use the routine my_binmode(FILE *fp, char iotype) to insure
+ * use the routine my_binmode(FILE *fp, char iotype, int mode) to insure
* that a file is in "binary" mode -- that is, that no translation
* of bytes occurs on read or write operations.
*/
@@ -123,13 +111,4 @@
# define HAS_KILL
# define HAS_WAIT
# define HAS_CHOWN
-/*
- * This provides a layer of functions and macros to ensure extensions will
- * get to use the same RTL functions as the core.
- */
-# ifndef HASATTRIBUTE
-# ifndef PERL_OBJECT
-# include <win32iop.h>
-# endif
-# endif
#endif /* WIN32 */
diff --git a/contrib/perl5/dump.c b/contrib/perl5/dump.c
index 782c62d..86c56ce 100644
--- a/contrib/perl5/dump.c
+++ b/contrib/perl5/dump.c
@@ -1,6 +1,6 @@
/* dump.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -13,28 +13,40 @@
*/
#include "EXTERN.h"
+#define PERL_IN_DUMP_C
#include "perl.h"
+#include "regcomp.h"
-#ifndef PERL_OBJECT
-static void dump(char *pat, ...);
-#endif /* PERL_OBJECT */
+void
+Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ dump_vindent(level, file, pat, &args);
+ va_end(args);
+}
void
-dump_all(void)
+Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
+{
+ dTHR;
+ PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
+ PerlIO_vprintf(file, pat, *args);
+}
+
+void
+Perl_dump_all(pTHX)
{
-#ifdef DEBUGGING
dTHR;
PerlIO_setlinebuf(Perl_debug_log);
if (PL_main_root)
- dump_op(PL_main_root);
+ op_dump(PL_main_root);
dump_packsubs(PL_defstash);
-#endif /* DEBUGGING */
}
void
-dump_packsubs(HV *stash)
+Perl_dump_packsubs(pTHX_ HV *stash)
{
-#ifdef DEBUGGING
dTHR;
I32 i;
HE *entry;
@@ -56,81 +68,336 @@ dump_packsubs(HV *stash)
dump_packsubs(hv); /* nested package */
}
}
-#endif /* DEBUGGING */
}
void
-dump_sub(GV *gv)
+Perl_dump_sub(pTHX_ GV *gv)
{
-#ifdef DEBUGGING
SV *sv = sv_newmortal();
gv_fullname3(sv, gv, Nullch);
- dump("\nSUB %s = ", SvPVX(sv));
+ Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX(sv));
if (CvXSUB(GvCV(gv)))
- dump("(xsub 0x%x %d)\n",
+ Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%lx %d)\n",
(long)CvXSUB(GvCV(gv)),
- CvXSUBANY(GvCV(gv)).any_i32);
+ (int)CvXSUBANY(GvCV(gv)).any_i32);
else if (CvROOT(GvCV(gv)))
- dump_op(CvROOT(GvCV(gv)));
+ op_dump(CvROOT(GvCV(gv)));
else
- dump("<undef>\n");
-#endif /* DEBUGGING */
+ Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
}
void
-dump_form(GV *gv)
+Perl_dump_form(pTHX_ GV *gv)
{
-#ifdef DEBUGGING
SV *sv = sv_newmortal();
gv_fullname3(sv, gv, Nullch);
- dump("\nFORMAT %s = ", SvPVX(sv));
+ Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX(sv));
if (CvROOT(GvFORM(gv)))
- dump_op(CvROOT(GvFORM(gv)));
+ op_dump(CvROOT(GvFORM(gv)));
+ else
+ Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
+}
+
+void
+Perl_dump_eval(pTHX)
+{
+ op_dump(PL_eval_root);
+}
+
+char *
+Perl_pv_display(pTHX_ SV *sv, char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+{
+ int truncated = 0;
+ int nul_terminated = len > cur && pv[cur] == '\0';
+
+ sv_setpvn(sv, "\"", 1);
+ for (; cur--; pv++) {
+ if (pvlim && SvCUR(sv) >= pvlim) {
+ truncated++;
+ break;
+ }
+ if (isPRINT(*pv)) {
+ switch (*pv) {
+ case '\t': sv_catpvn(sv, "\\t", 2); break;
+ case '\n': sv_catpvn(sv, "\\n", 2); break;
+ case '\r': sv_catpvn(sv, "\\r", 2); break;
+ case '\f': sv_catpvn(sv, "\\f", 2); break;
+ case '"': sv_catpvn(sv, "\\\"", 2); break;
+ case '\\': sv_catpvn(sv, "\\\\", 2); break;
+ default: sv_catpvn(sv, pv, 1); break;
+ }
+ }
+ else {
+ if (cur && isDIGIT(*(pv+1)))
+ Perl_sv_catpvf(aTHX_ sv, "\\%03o", (U8)*pv);
+ else
+ Perl_sv_catpvf(aTHX_ sv, "\\%o", (U8)*pv);
+ }
+ }
+ sv_catpvn(sv, "\"", 1);
+ if (truncated)
+ sv_catpvn(sv, "...", 3);
+ if (nul_terminated)
+ sv_catpvn(sv, "\\0", 2);
+
+ return SvPVX(sv);
+}
+
+char *
+Perl_sv_peek(pTHX_ SV *sv)
+{
+ SV *t = sv_newmortal();
+ STRLEN n_a;
+ int unref = 0;
+
+ sv_setpvn(t, "", 0);
+ retry:
+ if (!sv) {
+ sv_catpv(t, "VOID");
+ goto finish;
+ }
+ else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
+ sv_catpv(t, "WILD");
+ goto finish;
+ }
+ else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes) {
+ if (sv == &PL_sv_undef) {
+ sv_catpv(t, "SV_UNDEF");
+ if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
+ SVs_GMG|SVs_SMG|SVs_RMG)) &&
+ SvREADONLY(sv))
+ goto finish;
+ }
+ else if (sv == &PL_sv_no) {
+ sv_catpv(t, "SV_NO");
+ if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
+ SVs_GMG|SVs_SMG|SVs_RMG)) &&
+ !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
+ SVp_POK|SVp_NOK)) &&
+ SvCUR(sv) == 0 &&
+ SvNVX(sv) == 0.0)
+ goto finish;
+ }
+ else {
+ sv_catpv(t, "SV_YES");
+ if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
+ SVs_GMG|SVs_SMG|SVs_RMG)) &&
+ !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
+ SVp_POK|SVp_NOK)) &&
+ SvCUR(sv) == 1 &&
+ SvPVX(sv) && *SvPVX(sv) == '1' &&
+ SvNVX(sv) == 1.0)
+ goto finish;
+ }
+ sv_catpv(t, ":");
+ }
+ else if (SvREFCNT(sv) == 0) {
+ sv_catpv(t, "(");
+ unref++;
+ }
+ if (SvROK(sv)) {
+ sv_catpv(t, "\\");
+ if (SvCUR(t) + unref > 10) {
+ SvCUR(t) = unref + 3;
+ *SvEND(t) = '\0';
+ sv_catpv(t, "...");
+ goto finish;
+ }
+ sv = (SV*)SvRV(sv);
+ goto retry;
+ }
+ switch (SvTYPE(sv)) {
+ default:
+ sv_catpv(t, "FREED");
+ goto finish;
+
+ case SVt_NULL:
+ sv_catpv(t, "UNDEF");
+ goto finish;
+ case SVt_IV:
+ sv_catpv(t, "IV");
+ break;
+ case SVt_NV:
+ sv_catpv(t, "NV");
+ break;
+ case SVt_RV:
+ sv_catpv(t, "RV");
+ break;
+ case SVt_PV:
+ sv_catpv(t, "PV");
+ break;
+ case SVt_PVIV:
+ sv_catpv(t, "PVIV");
+ break;
+ case SVt_PVNV:
+ sv_catpv(t, "PVNV");
+ break;
+ case SVt_PVMG:
+ sv_catpv(t, "PVMG");
+ break;
+ case SVt_PVLV:
+ sv_catpv(t, "PVLV");
+ break;
+ case SVt_PVAV:
+ sv_catpv(t, "AV");
+ break;
+ case SVt_PVHV:
+ sv_catpv(t, "HV");
+ break;
+ case SVt_PVCV:
+ if (CvGV(sv))
+ Perl_sv_catpvf(aTHX_ t, "CV(%s)", GvNAME(CvGV(sv)));
+ else
+ sv_catpv(t, "CV()");
+ goto finish;
+ case SVt_PVGV:
+ sv_catpv(t, "GV");
+ break;
+ case SVt_PVBM:
+ sv_catpv(t, "BM");
+ break;
+ case SVt_PVFM:
+ sv_catpv(t, "FM");
+ break;
+ case SVt_PVIO:
+ sv_catpv(t, "IO");
+ break;
+ }
+
+ if (SvPOKp(sv)) {
+ if (!SvPVX(sv))
+ sv_catpv(t, "(null)");
+ else {
+ SV *tmp = newSVpvn("", 0);
+ sv_catpv(t, "(");
+ if (SvOOK(sv))
+ Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX(sv)-SvIVX(sv), SvIVX(sv), 0, 127));
+ Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX(sv), SvCUR(sv), SvLEN(sv), 127));
+ SvREFCNT_dec(tmp);
+ }
+ }
+ else if (SvNOKp(sv)) {
+ RESTORE_NUMERIC_STANDARD();
+ Perl_sv_catpvf(aTHX_ t, "(%g)",SvNVX(sv));
+ RESTORE_NUMERIC_LOCAL();
+ }
+ else if (SvIOKp(sv)) {
+ if (SvIsUV(sv))
+ Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
+ else
+ Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
+ }
+ else
+ sv_catpv(t, "()");
+
+ finish:
+ if (unref) {
+ while (unref--)
+ sv_catpv(t, ")");
+ }
+ return SvPV(t, n_a);
+}
+
+void
+Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, PMOP *pm)
+{
+ char ch;
+
+ if (!pm) {
+ Perl_dump_indent(aTHX_ level, file, "{}\n");
+ return;
+ }
+ Perl_dump_indent(aTHX_ level, file, "{\n");
+ level++;
+ if (pm->op_pmflags & PMf_ONCE)
+ ch = '?';
else
- dump("<undef>\n");
-#endif /* DEBUGGING */
+ ch = '/';
+ if (pm->op_pmregexp)
+ Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
+ ch, pm->op_pmregexp->precomp, ch,
+ (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
+ else
+ Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
+ if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
+ Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
+ op_dump(pm->op_pmreplroot);
+ }
+ if (pm->op_pmflags || (pm->op_pmregexp && pm->op_pmregexp->check_substr)) {
+ SV *tmpsv = newSVpvn("", 0);
+ if (pm->op_pmdynflags & PMdf_USED)
+ sv_catpv(tmpsv, ",USED");
+ if (pm->op_pmdynflags & PMdf_TAINTED)
+ sv_catpv(tmpsv, ",TAINTED");
+ if (pm->op_pmflags & PMf_ONCE)
+ sv_catpv(tmpsv, ",ONCE");
+ if (pm->op_pmregexp && pm->op_pmregexp->check_substr
+ && !(pm->op_pmregexp->reganch & ROPT_NOSCAN))
+ sv_catpv(tmpsv, ",SCANFIRST");
+ if (pm->op_pmregexp && pm->op_pmregexp->check_substr
+ && pm->op_pmregexp->reganch & ROPT_CHECK_ALL)
+ sv_catpv(tmpsv, ",ALL");
+ if (pm->op_pmflags & PMf_SKIPWHITE)
+ sv_catpv(tmpsv, ",SKIPWHITE");
+ if (pm->op_pmflags & PMf_CONST)
+ sv_catpv(tmpsv, ",CONST");
+ if (pm->op_pmflags & PMf_KEEP)
+ sv_catpv(tmpsv, ",KEEP");
+ if (pm->op_pmflags & PMf_GLOBAL)
+ sv_catpv(tmpsv, ",GLOBAL");
+ if (pm->op_pmflags & PMf_CONTINUE)
+ sv_catpv(tmpsv, ",CONTINUE");
+ if (pm->op_pmflags & PMf_RETAINT)
+ sv_catpv(tmpsv, ",RETAINT");
+ if (pm->op_pmflags & PMf_EVAL)
+ sv_catpv(tmpsv, ",EVAL");
+ Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
+ SvREFCNT_dec(tmpsv);
+ }
+
+ Perl_dump_indent(aTHX_ level-1, file, "}\n");
}
void
-dump_eval(void)
+Perl_pmop_dump(pTHX_ PMOP *pm)
{
-#ifdef DEBUGGING
- dump_op(PL_eval_root);
-#endif /* DEBUGGING */
+ do_pmop_dump(0, Perl_debug_log, pm);
}
void
-dump_op(OP *o)
+Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, OP *o)
{
-#ifdef DEBUGGING
- dump("{\n");
+ dTHR;
+ Perl_dump_indent(aTHX_ level, file, "{\n");
+ level++;
if (o->op_seq)
- PerlIO_printf(Perl_debug_log, "%-4d", o->op_seq);
+ PerlIO_printf(file, "%-4d", o->op_seq);
else
- PerlIO_printf(Perl_debug_log, " ");
- dump("TYPE = %s ===> ", op_name[o->op_type]);
+ PerlIO_printf(file, " ");
+ PerlIO_printf(file,
+ "%*sTYPE = %s ===> ",
+ (int)(PL_dumpindent*level-4), "", PL_op_name[o->op_type]);
if (o->op_next) {
if (o->op_seq)
- PerlIO_printf(Perl_debug_log, "%d\n", o->op_next->op_seq);
+ PerlIO_printf(file, "%d\n", o->op_next->op_seq);
else
- PerlIO_printf(Perl_debug_log, "(%d)\n", o->op_next->op_seq);
+ PerlIO_printf(file, "(%d)\n", o->op_next->op_seq);
}
else
- PerlIO_printf(Perl_debug_log, "DONE\n");
- PL_dumplvl++;
+ PerlIO_printf(file, "DONE\n");
if (o->op_targ) {
if (o->op_type == OP_NULL)
- dump(" (was %s)\n", op_name[o->op_targ]);
+ Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
else
- dump("TARG = %d\n", o->op_targ);
+ Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
}
#ifdef DUMPADDR
- dump("ADDR = 0x%lx => 0x%lx\n",o, o->op_next);
+ Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
#endif
if (o->op_flags) {
- SV *tmpsv = newSVpv("", 0);
+ SV *tmpsv = newSVpvn("", 0);
switch (o->op_flags & OPf_WANT) {
case OPf_WANT_VOID:
sv_catpv(tmpsv, ",VOID");
@@ -157,14 +424,20 @@ dump_op(OP *o)
sv_catpv(tmpsv, ",MOD");
if (o->op_flags & OPf_SPECIAL)
sv_catpv(tmpsv, ",SPECIAL");
- dump("FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
+ Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
SvREFCNT_dec(tmpsv);
}
if (o->op_private) {
- SV *tmpsv = newSVpv("", 0);
+ SV *tmpsv = newSVpvn("", 0);
+ if (PL_opargs[o->op_type] & OA_TARGLEX) {
+ if (o->op_private & OPpTARGET_MY)
+ sv_catpv(tmpsv, ",TARGET_MY");
+ }
if (o->op_type == OP_AASSIGN) {
if (o->op_private & OPpASSIGN_COMMON)
sv_catpv(tmpsv, ",COMMON");
+ if (o->op_private & OPpASSIGN_HASH)
+ sv_catpv(tmpsv, ",HASH");
}
else if (o->op_type == OP_SASSIGN) {
if (o->op_private & OPpASSIGN_BACKWARDS)
@@ -195,8 +468,11 @@ dump_op(OP *o)
sv_catpv(tmpsv, ",AMPER");
if (o->op_private & OPpENTERSUB_DB)
sv_catpv(tmpsv, ",DB");
+ if (o->op_private & OPpENTERSUB_HASTARG)
+ sv_catpv(tmpsv, ",HASTARG");
}
- switch (o->op_private & OPpDEREF) {
+ else
+ switch (o->op_private & OPpDEREF) {
case OPpDEREF_SV:
sv_catpv(tmpsv, ",SV");
break;
@@ -214,11 +490,15 @@ dump_op(OP *o)
else {
if (o->op_private & HINT_STRICT_REFS)
sv_catpv(tmpsv, ",STRICT_REFS");
+ if (o->op_private & OPpOUR_INTRO)
+ sv_catpv(tmpsv, ",OUR_INTRO");
}
}
else if (o->op_type == OP_CONST) {
if (o->op_private & OPpCONST_BARE)
sv_catpv(tmpsv, ",BARE");
+ if (o->op_private & OPpCONST_STRICT)
+ sv_catpv(tmpsv, ",STRICT");
}
else if (o->op_type == OP_FLIP) {
if (o->op_private & OPpFLIP_LINENUM)
@@ -227,83 +507,96 @@ dump_op(OP *o)
else if (o->op_type == OP_FLOP) {
if (o->op_private & OPpFLIP_LINENUM)
sv_catpv(tmpsv, ",LINENUM");
+ } else if (o->op_type == OP_RV2CV) {
+ if (o->op_private & OPpLVAL_INTRO)
+ sv_catpv(tmpsv, ",INTRO");
}
if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
sv_catpv(tmpsv, ",INTRO");
if (SvCUR(tmpsv))
- dump("PRIVATE = (%s)\n", SvPVX(tmpsv) + 1);
+ Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX(tmpsv) + 1);
SvREFCNT_dec(tmpsv);
}
switch (o->op_type) {
+ case OP_AELEMFAST:
case OP_GVSV:
case OP_GV:
- if (cGVOPo->op_gv) {
- STRLEN n_a;
+#ifdef USE_ITHREADS
+ Perl_dump_indent(aTHX_ level, file, "PADIX = %d\n", cPADOPo->op_padix);
+#else
+ if (cSVOPo->op_sv) {
SV *tmpsv = NEWSV(0,0);
+ STRLEN n_a;
ENTER;
SAVEFREESV(tmpsv);
- gv_fullname3(tmpsv, cGVOPo->op_gv, Nullch);
- dump("GV = %s\n", SvPV(tmpsv, n_a));
+ gv_fullname3(tmpsv, (GV*)cSVOPo->op_sv, Nullch);
+ Perl_dump_indent(aTHX_ level, file, "GV = %s\n", SvPV(tmpsv, n_a));
LEAVE;
}
else
- dump("GV = NULL\n");
+ Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
+#endif
break;
case OP_CONST:
- dump("SV = %s\n", SvPEEK(cSVOPo->op_sv));
+ case OP_METHOD_NAMED:
+ Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo->op_sv));
break;
+ case OP_SETSTATE:
case OP_NEXTSTATE:
case OP_DBSTATE:
- if (cCOPo->cop_line)
- dump("LINE = %d\n",cCOPo->cop_line);
+ if (CopLINE(cCOPo))
+ Perl_dump_indent(aTHX_ level, file, "LINE = %d\n",CopLINE(cCOPo));
+ if (CopSTASHPV(cCOPo))
+ Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
+ CopSTASHPV(cCOPo));
if (cCOPo->cop_label)
- dump("LABEL = \"%s\"\n",cCOPo->cop_label);
+ Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
+ cCOPo->cop_label);
break;
case OP_ENTERLOOP:
- dump("REDO ===> ");
+ Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
if (cLOOPo->op_redoop)
- PerlIO_printf(Perl_debug_log, "%d\n", cLOOPo->op_redoop->op_seq);
+ PerlIO_printf(file, "%d\n", cLOOPo->op_redoop->op_seq);
else
- PerlIO_printf(Perl_debug_log, "DONE\n");
- dump("NEXT ===> ");
+ PerlIO_printf(file, "DONE\n");
+ Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
if (cLOOPo->op_nextop)
- PerlIO_printf(Perl_debug_log, "%d\n", cLOOPo->op_nextop->op_seq);
+ PerlIO_printf(file, "%d\n", cLOOPo->op_nextop->op_seq);
else
- PerlIO_printf(Perl_debug_log, "DONE\n");
- dump("LAST ===> ");
+ PerlIO_printf(file, "DONE\n");
+ Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
if (cLOOPo->op_lastop)
- PerlIO_printf(Perl_debug_log, "%d\n", cLOOPo->op_lastop->op_seq);
+ PerlIO_printf(file, "%d\n", cLOOPo->op_lastop->op_seq);
else
- PerlIO_printf(Perl_debug_log, "DONE\n");
+ PerlIO_printf(file, "DONE\n");
break;
case OP_COND_EXPR:
- dump("TRUE ===> ");
- if (cCONDOPo->op_true)
- PerlIO_printf(Perl_debug_log, "%d\n", cCONDOPo->op_true->op_seq);
- else
- PerlIO_printf(Perl_debug_log, "DONE\n");
- dump("FALSE ===> ");
- if (cCONDOPo->op_false)
- PerlIO_printf(Perl_debug_log, "%d\n", cCONDOPo->op_false->op_seq);
- else
- PerlIO_printf(Perl_debug_log, "DONE\n");
- break;
+ case OP_RANGE:
case OP_MAPWHILE:
case OP_GREPWHILE:
case OP_OR:
case OP_AND:
- dump("OTHER ===> ");
+ Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
if (cLOGOPo->op_other)
- PerlIO_printf(Perl_debug_log, "%d\n", cLOGOPo->op_other->op_seq);
+ PerlIO_printf(file, "%d\n", cLOGOPo->op_other->op_seq);
else
- PerlIO_printf(Perl_debug_log, "DONE\n");
+ PerlIO_printf(file, "DONE\n");
break;
case OP_PUSHRE:
case OP_MATCH:
case OP_QR:
case OP_SUBST:
- dump_pm(cPMOPo);
+ do_pmop_dump(level, file, cPMOPo);
+ break;
+ case OP_LEAVE:
+ case OP_LEAVEEVAL:
+ case OP_LEAVESUB:
+ case OP_LEAVESUBLV:
+ case OP_LEAVEWRITE:
+ case OP_SCOPE:
+ if (o->op_private & OPpREFCOUNTED)
+ Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
break;
default:
break;
@@ -311,17 +604,20 @@ dump_op(OP *o)
if (o->op_flags & OPf_KIDS) {
OP *kid;
for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
- dump_op(kid);
+ do_op_dump(level, file, kid);
}
- PL_dumplvl--;
- dump("}\n");
-#endif /* DEBUGGING */
+ Perl_dump_indent(aTHX_ level-1, file, "}\n");
}
void
-dump_gv(GV *gv)
+Perl_op_dump(pTHX_ OP *o)
+{
+ do_op_dump(0, Perl_debug_log, o);
+}
+
+void
+Perl_gv_dump(pTHX_ GV *gv)
{
-#ifdef DEBUGGING
SV *sv;
if (!gv) {
@@ -329,95 +625,563 @@ dump_gv(GV *gv)
return;
}
sv = sv_newmortal();
- PL_dumplvl++;
PerlIO_printf(Perl_debug_log, "{\n");
gv_fullname3(sv, gv, Nullch);
- dump("GV_NAME = %s", SvPVX(sv));
+ Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX(sv));
if (gv != GvEGV(gv)) {
gv_efullname3(sv, GvEGV(gv), Nullch);
- dump("-> %s", SvPVX(sv));
+ Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX(sv));
}
- dump("\n");
- PL_dumplvl--;
- dump("}\n");
-#endif /* DEBUGGING */
+ PerlIO_putc(Perl_debug_log, '\n');
+ Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
}
void
-dump_pm(PMOP *pm)
+Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
{
-#ifdef DEBUGGING
- char ch;
+ for (; mg; mg = mg->mg_moremagic) {
+ Perl_dump_indent(aTHX_ level, file,
+ " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
+ if (mg->mg_virtual) {
+ MGVTBL *v = mg->mg_virtual;
+ char *s = 0;
+ if (v == &PL_vtbl_sv) s = "sv";
+ else if (v == &PL_vtbl_env) s = "env";
+ else if (v == &PL_vtbl_envelem) s = "envelem";
+ else if (v == &PL_vtbl_sig) s = "sig";
+ else if (v == &PL_vtbl_sigelem) s = "sigelem";
+ else if (v == &PL_vtbl_pack) s = "pack";
+ else if (v == &PL_vtbl_packelem) s = "packelem";
+ else if (v == &PL_vtbl_dbline) s = "dbline";
+ else if (v == &PL_vtbl_isa) s = "isa";
+ else if (v == &PL_vtbl_arylen) s = "arylen";
+ else if (v == &PL_vtbl_glob) s = "glob";
+ else if (v == &PL_vtbl_mglob) s = "mglob";
+ else if (v == &PL_vtbl_nkeys) s = "nkeys";
+ else if (v == &PL_vtbl_taint) s = "taint";
+ else if (v == &PL_vtbl_substr) s = "substr";
+ else if (v == &PL_vtbl_vec) s = "vec";
+ else if (v == &PL_vtbl_pos) s = "pos";
+ else if (v == &PL_vtbl_bm) s = "bm";
+ else if (v == &PL_vtbl_fm) s = "fm";
+ else if (v == &PL_vtbl_uvar) s = "uvar";
+ else if (v == &PL_vtbl_defelem) s = "defelem";
+#ifdef USE_LOCALE_COLLATE
+ else if (v == &PL_vtbl_collxfrm) s = "collxfrm";
+#endif
+ else if (v == &PL_vtbl_amagic) s = "amagic";
+ else if (v == &PL_vtbl_amagicelem) s = "amagicelem";
+ else if (v == &PL_vtbl_backref) s = "backref";
+ if (s)
+ Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", s);
+ else
+ Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
+ }
+ else
+ Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
- if (!pm) {
- dump("{}\n");
- return;
+ if (mg->mg_private)
+ Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
+
+ if (isPRINT(mg->mg_type))
+ Perl_dump_indent(aTHX_ level, file, " MG_TYPE = '%c'\n", mg->mg_type);
+ else
+ Perl_dump_indent(aTHX_ level, file, " MG_TYPE = '\\%o'\n", mg->mg_type);
+
+ if (mg->mg_flags) {
+ Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
+ if (mg->mg_flags & MGf_TAINTEDDIR)
+ Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
+ if (mg->mg_flags & MGf_REFCOUNTED)
+ Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
+ if (mg->mg_flags & MGf_GSKIP)
+ Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
+ if (mg->mg_flags & MGf_MINMATCH)
+ Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
+ }
+ if (mg->mg_obj) {
+ Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
+ if (mg->mg_flags & MGf_REFCOUNTED)
+ do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
+ }
+ if (mg->mg_len)
+ Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
+ if (mg->mg_ptr) {
+ Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
+ if (mg->mg_len >= 0) {
+ SV *sv = newSVpvn("", 0);
+ PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
+ SvREFCNT_dec(sv);
+ }
+ else if (mg->mg_len == HEf_SVKEY) {
+ PerlIO_puts(file, " => HEf_SVKEY\n");
+ do_sv_dump(level+2, file, (SV*)((mg)->mg_ptr), nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
+ continue;
+ }
+ else
+ PerlIO_puts(file, " ???? - please notify IZ");
+ PerlIO_putc(file, '\n');
+ }
}
- dump("{\n");
- PL_dumplvl++;
- if (pm->op_pmflags & PMf_ONCE)
- ch = '?';
+}
+
+void
+Perl_magic_dump(pTHX_ MAGIC *mg)
+{
+ do_magic_dump(0, Perl_debug_log, mg, 0, 0, 0, 0);
+}
+
+void
+Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, char *name, HV *sv)
+{
+ Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
+ if (sv && HvNAME(sv))
+ PerlIO_printf(file, "\t\"%s\"\n", HvNAME(sv));
else
- ch = '/';
- if (pm->op_pmregexp)
- dump("PMf_PRE %c%s%c%s\n",
- ch, pm->op_pmregexp->precomp, ch,
- (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
+ PerlIO_putc(file, '\n');
+}
+
+void
+Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, char *name, GV *sv)
+{
+ Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
+ if (sv && GvNAME(sv))
+ PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
else
- dump("PMf_PRE (RUNTIME)\n");
- if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
- dump("PMf_REPL = ");
- dump_op(pm->op_pmreplroot);
+ PerlIO_putc(file, '\n');
+}
+
+void
+Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, char *name, GV *sv)
+{
+ Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
+ if (sv && GvNAME(sv)) {
+ PerlIO_printf(file, "\t\"");
+ if (GvSTASH(sv) && HvNAME(GvSTASH(sv)))
+ PerlIO_printf(file, "%s\" :: \"", HvNAME(GvSTASH(sv)));
+ PerlIO_printf(file, "%s\"\n", GvNAME(sv));
}
- if (pm->op_pmflags || (pm->op_pmregexp && pm->op_pmregexp->check_substr)) {
- SV *tmpsv = newSVpv("", 0);
- if (pm->op_pmdynflags & PMdf_USED)
- sv_catpv(tmpsv, ",USED");
- if (pm->op_pmdynflags & PMdf_TAINTED)
- sv_catpv(tmpsv, ",TAINTED");
- if (pm->op_pmflags & PMf_ONCE)
- sv_catpv(tmpsv, ",ONCE");
- if (pm->op_pmregexp && pm->op_pmregexp->check_substr
- && !(pm->op_pmregexp->reganch & ROPT_NOSCAN))
- sv_catpv(tmpsv, ",SCANFIRST");
- if (pm->op_pmregexp && pm->op_pmregexp->check_substr
- && pm->op_pmregexp->reganch & ROPT_CHECK_ALL)
- sv_catpv(tmpsv, ",ALL");
- if (pm->op_pmflags & PMf_SKIPWHITE)
- sv_catpv(tmpsv, ",SKIPWHITE");
- if (pm->op_pmflags & PMf_CONST)
- sv_catpv(tmpsv, ",CONST");
- if (pm->op_pmflags & PMf_KEEP)
- sv_catpv(tmpsv, ",KEEP");
- if (pm->op_pmflags & PMf_GLOBAL)
- sv_catpv(tmpsv, ",GLOBAL");
- if (pm->op_pmflags & PMf_CONTINUE)
- sv_catpv(tmpsv, ",CONTINUE");
- if (pm->op_pmflags & PMf_RETAINT)
- sv_catpv(tmpsv, ",RETAINT");
- if (pm->op_pmflags & PMf_EVAL)
- sv_catpv(tmpsv, ",EVAL");
- dump("PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
- SvREFCNT_dec(tmpsv);
+ else
+ PerlIO_putc(file, '\n');
+}
+
+void
+Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
+{
+ dTHR;
+ SV *d = sv_newmortal();
+ char *s;
+ U32 flags;
+ U32 type;
+ STRLEN n_a;
+
+ if (!sv) {
+ Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
+ return;
}
+
+ flags = SvFLAGS(sv);
+ type = SvTYPE(sv);
- PL_dumplvl--;
- dump("}\n");
-#endif /* DEBUGGING */
-}
+ Perl_sv_setpvf(aTHX_ d,
+ "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
+ PTR2UV(SvANY(sv)), PTR2UV(sv),
+ (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
+ (int)(PL_dumpindent*level), "");
+ if (flags & SVs_PADBUSY) sv_catpv(d, "PADBUSY,");
+ if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
+ if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
+ if (flags & SVs_TEMP) sv_catpv(d, "TEMP,");
+ if (flags & SVs_OBJECT) sv_catpv(d, "OBJECT,");
+ if (flags & SVs_GMG) sv_catpv(d, "GMG,");
+ if (flags & SVs_SMG) sv_catpv(d, "SMG,");
+ if (flags & SVs_RMG) sv_catpv(d, "RMG,");
-STATIC void
-dump(char *pat,...)
-{
-#ifdef DEBUGGING
- I32 i;
- va_list args;
+ if (flags & SVf_IOK) sv_catpv(d, "IOK,");
+ if (flags & SVf_NOK) sv_catpv(d, "NOK,");
+ if (flags & SVf_POK) sv_catpv(d, "POK,");
+ if (flags & SVf_ROK) {
+ sv_catpv(d, "ROK,");
+ if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
+ }
+ if (flags & SVf_OOK) sv_catpv(d, "OOK,");
+ if (flags & SVf_FAKE) sv_catpv(d, "FAKE,");
+ if (flags & SVf_READONLY) sv_catpv(d, "READONLY,");
- va_start(args, pat);
- for (i = PL_dumplvl*4; i; i--)
- (void)PerlIO_putc(Perl_debug_log,' ');
- PerlIO_vprintf(Perl_debug_log,pat,args);
- va_end(args);
-#endif /* DEBUGGING */
+ if (flags & SVf_AMAGIC) sv_catpv(d, "OVERLOAD,");
+ if (flags & SVp_IOK) sv_catpv(d, "pIOK,");
+ if (flags & SVp_NOK) sv_catpv(d, "pNOK,");
+ if (flags & SVp_POK) sv_catpv(d, "pPOK,");
+ if (flags & SVp_SCREAM) sv_catpv(d, "SCREAM,");
+
+ switch (type) {
+ case SVt_PVCV:
+ case SVt_PVFM:
+ if (CvANON(sv)) sv_catpv(d, "ANON,");
+ if (CvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
+ if (CvCLONE(sv)) sv_catpv(d, "CLONE,");
+ if (CvCLONED(sv)) sv_catpv(d, "CLONED,");
+ if (CvNODEBUG(sv)) sv_catpv(d, "NODEBUG,");
+ if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
+ break;
+ case SVt_PVHV:
+ if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,");
+ if (HvLAZYDEL(sv)) sv_catpv(d, "LAZYDEL,");
+ break;
+ case SVt_PVGV:
+ if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
+ if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
+ if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
+ if (GvIMPORTED(sv)) {
+ sv_catpv(d, "IMPORT");
+ if (GvIMPORTED(sv) == GVf_IMPORTED)
+ sv_catpv(d, "ALL,");
+ else {
+ sv_catpv(d, "(");
+ if (GvIMPORTED_SV(sv)) sv_catpv(d, " SV");
+ if (GvIMPORTED_AV(sv)) sv_catpv(d, " AV");
+ if (GvIMPORTED_HV(sv)) sv_catpv(d, " HV");
+ if (GvIMPORTED_CV(sv)) sv_catpv(d, " CV");
+ sv_catpv(d, " ),");
+ }
+ }
+ /* FALL THROGH */
+ default:
+ if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
+ if (SvIsUV(sv)) sv_catpv(d, "IsUV,");
+ if (SvUTF8(sv)) sv_catpv(d, "UTF8");
+ break;
+ case SVt_PVBM:
+ if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
+ if (SvVALID(sv)) sv_catpv(d, "VALID,");
+ break;
+ }
+
+ if (*(SvEND(d) - 1) == ',')
+ SvPVX(d)[--SvCUR(d)] = '\0';
+ sv_catpv(d, ")");
+ s = SvPVX(d);
+
+ Perl_dump_indent(aTHX_ level, file, "SV = ");
+ switch (type) {
+ case SVt_NULL:
+ PerlIO_printf(file, "NULL%s\n", s);
+ return;
+ case SVt_IV:
+ PerlIO_printf(file, "IV%s\n", s);
+ break;
+ case SVt_NV:
+ PerlIO_printf(file, "NV%s\n", s);
+ break;
+ case SVt_RV:
+ PerlIO_printf(file, "RV%s\n", s);
+ break;
+ case SVt_PV:
+ PerlIO_printf(file, "PV%s\n", s);
+ break;
+ case SVt_PVIV:
+ PerlIO_printf(file, "PVIV%s\n", s);
+ break;
+ case SVt_PVNV:
+ PerlIO_printf(file, "PVNV%s\n", s);
+ break;
+ case SVt_PVBM:
+ PerlIO_printf(file, "PVBM%s\n", s);
+ break;
+ case SVt_PVMG:
+ PerlIO_printf(file, "PVMG%s\n", s);
+ break;
+ case SVt_PVLV:
+ PerlIO_printf(file, "PVLV%s\n", s);
+ break;
+ case SVt_PVAV:
+ PerlIO_printf(file, "PVAV%s\n", s);
+ break;
+ case SVt_PVHV:
+ PerlIO_printf(file, "PVHV%s\n", s);
+ break;
+ case SVt_PVCV:
+ PerlIO_printf(file, "PVCV%s\n", s);
+ break;
+ case SVt_PVGV:
+ PerlIO_printf(file, "PVGV%s\n", s);
+ break;
+ case SVt_PVFM:
+ PerlIO_printf(file, "PVFM%s\n", s);
+ break;
+ case SVt_PVIO:
+ PerlIO_printf(file, "PVIO%s\n", s);
+ break;
+ default:
+ PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
+ return;
+ }
+ if (type >= SVt_PVIV || type == SVt_IV) {
+ if (SvIsUV(sv))
+ Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
+ else
+ Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
+ if (SvOOK(sv))
+ PerlIO_printf(file, " (OFFSET)");
+ PerlIO_putc(file, '\n');
+ }
+ if (type >= SVt_PVNV || type == SVt_NV) {
+ RESTORE_NUMERIC_STANDARD();
+ /* %Vg doesn't work? --jhi */
+#ifdef USE_LONG_DOUBLE
+ Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
+#else
+ Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
+#endif
+ RESTORE_NUMERIC_LOCAL();
+ }
+ if (SvROK(sv)) {
+ Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
+ if (nest < maxnest)
+ do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
+ return;
+ }
+ if (type < SVt_PV)
+ return;
+ if (type <= SVt_PVLV) {
+ if (SvPVX(sv)) {
+ Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX(sv)));
+ if (SvOOK(sv))
+ PerlIO_printf(file, "( %s . ) ", pv_display(d, SvPVX(sv)-SvIVX(sv), SvIVX(sv), 0, pvlim));
+ PerlIO_printf(file, "%s\n", pv_display(d, SvPVX(sv), SvCUR(sv), SvLEN(sv), pvlim));
+ Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
+ Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
+ }
+ else
+ Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
+ }
+ if (type >= SVt_PVMG) {
+ if (SvMAGIC(sv))
+ do_magic_dump(level, file, SvMAGIC(sv), nest, maxnest, dumpops, pvlim);
+ if (SvSTASH(sv))
+ do_hv_dump(level, file, " STASH", SvSTASH(sv));
+ }
+ switch (type) {
+ case SVt_PVLV:
+ Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
+ Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
+ Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
+ Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
+ /* XXX level+1 ??? */
+ do_sv_dump(level, file, LvTARG(sv), nest+1, maxnest, dumpops, pvlim);
+ break;
+ case SVt_PVAV:
+ Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
+ if (AvARRAY(sv) != AvALLOC(sv)) {
+ PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
+ Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
+ }
+ else
+ PerlIO_putc(file, '\n');
+ Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
+ Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
+ Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", PTR2UV(AvARYLEN(sv)));
+ flags = AvFLAGS(sv);
+ sv_setpv(d, "");
+ if (flags & AVf_REAL) sv_catpv(d, ",REAL");
+ if (flags & AVf_REIFY) sv_catpv(d, ",REIFY");
+ if (flags & AVf_REUSED) sv_catpv(d, ",REUSED");
+ Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n", SvCUR(d) ? SvPVX(d) + 1 : "");
+ if (nest < maxnest && av_len((AV*)sv) >= 0) {
+ int count;
+ for (count = 0; count <= av_len((AV*)sv) && count < maxnest; count++) {
+ SV** elt = av_fetch((AV*)sv,count,0);
+
+ Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
+ if (elt)
+ do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
+ }
+ }
+ break;
+ case SVt_PVHV:
+ Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
+ if (HvARRAY(sv) && HvKEYS(sv)) {
+ /* Show distribution of HEs in the ARRAY */
+ int freq[200];
+#define FREQ_MAX (sizeof freq / sizeof freq[0] - 1)
+ int i;
+ int max = 0;
+ U32 pow2 = 2, keys = HvKEYS(sv);
+ NV theoret, sum = 0;
+
+ PerlIO_printf(file, " (");
+ Zero(freq, FREQ_MAX + 1, int);
+ for (i = 0; i <= HvMAX(sv); i++) {
+ HE* h; int count = 0;
+ for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
+ count++;
+ if (count > FREQ_MAX)
+ count = FREQ_MAX;
+ freq[count]++;
+ if (max < count)
+ max = count;
+ }
+ for (i = 0; i <= max; i++) {
+ if (freq[i]) {
+ PerlIO_printf(file, "%d%s:%d", i,
+ (i == FREQ_MAX) ? "+" : "",
+ freq[i]);
+ if (i != max)
+ PerlIO_printf(file, ", ");
+ }
+ }
+ PerlIO_putc(file, ')');
+ /* Now calculate quality wrt theoretical value */
+ for (i = max; i > 0; i--) { /* Precision: count down. */
+ sum += freq[i] * i * i;
+ }
+ while ((keys = keys >> 1))
+ pow2 = pow2 << 1;
+ /* Approximate by Poisson distribution */
+ theoret = HvKEYS(sv);
+ theoret += theoret * theoret/pow2;
+ PerlIO_putc(file, '\n');
+ Perl_dump_indent(aTHX_ level, file, " hash quality = %.1f%%", theoret/sum*100);
+ }
+ PerlIO_putc(file, '\n');
+ Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
+ Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
+ Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
+ Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER(sv));
+ Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER(sv)));
+ if (HvPMROOT(sv))
+ Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(HvPMROOT(sv)));
+ if (HvNAME(sv))
+ Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", HvNAME(sv));
+ if (nest < maxnest && !HvEITER(sv)) { /* Try to preserve iterator */
+ HE *he;
+ HV *hv = (HV*)sv;
+ int count = maxnest - nest;
+
+ hv_iterinit(hv);
+ while ((he = hv_iternext(hv)) && count--) {
+ SV *elt;
+ char *key;
+ I32 len;
+ U32 hash = HeHASH(he);
+
+ key = hv_iterkey(he, &len);
+ elt = hv_iterval(hv, he);
+ Perl_dump_indent(aTHX_ level+1, file, "Elt %s HASH = 0x%"UVxf"\n", pv_display(d, key, len, 0, pvlim), (UV)hash);
+ do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
+ }
+ hv_iterinit(hv); /* Return to status quo */
+ }
+ break;
+ case SVt_PVCV:
+ if (SvPOK(sv))
+ Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n", SvPV(sv,n_a));
+ /* FALL THROUGH */
+ case SVt_PVFM:
+ do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
+ if (CvSTART(sv))
+ Perl_dump_indent(aTHX_ level, file, " START = 0x%"UVxf" ===> %"IVdf"\n", PTR2UV(CvSTART(sv)), (IV)CvSTART(sv)->op_seq);
+ Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n", PTR2UV(CvROOT(sv)));
+ if (CvROOT(sv) && dumpops)
+ do_op_dump(level+1, file, CvROOT(sv));
+ Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
+ Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n", (IV)CvXSUBANY(sv).any_i32);
+ do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
+ Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
+ Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
+#ifdef USE_THREADS
+ Perl_dump_indent(aTHX_ level, file, " MUTEXP = 0x%"UVxf"\n", PTR2UV(CvMUTEXP(sv)));
+ Perl_dump_indent(aTHX_ level, file, " OWNER = 0x%"UVxf"\n", PTR2UV(CvOWNER(sv)));
+#endif /* USE_THREADS */
+ Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
+ if (type == SVt_PVFM)
+ Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)FmLINES(sv));
+ Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
+ if (nest < maxnest && CvPADLIST(sv)) {
+ AV* padlist = CvPADLIST(sv);
+ AV* pad_name = (AV*)*av_fetch(padlist, 0, FALSE);
+ AV* pad = (AV*)*av_fetch(padlist, 1, FALSE);
+ SV** pname = AvARRAY(pad_name);
+ SV** ppad = AvARRAY(pad);
+ I32 ix;
+
+ for (ix = 1; ix <= AvFILL(pad_name); ix++) {
+ if (SvPOK(pname[ix]))
+ Perl_dump_indent(aTHX_ level,
+ /* %5d below is enough whitespace. */
+ file,
+ "%5d. 0x%"UVxf" (%s\"%s\" %"IVdf"-%"IVdf")\n",
+ (int)ix, PTR2UV(ppad[ix]),
+ SvFAKE(pname[ix]) ? "FAKE " : "",
+ SvPVX(pname[ix]),
+ (IV)SvNVX(pname[ix]),
+ (IV)SvIVX(pname[ix]));
+ }
+ }
+ {
+ CV *outside = CvOUTSIDE(sv);
+ Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
+ PTR2UV(outside),
+ (!outside ? "null"
+ : CvANON(outside) ? "ANON"
+ : (outside == PL_main_cv) ? "MAIN"
+ : CvUNIQUE(outside) ? "UNIQUE"
+ : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
+ }
+ if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
+ do_sv_dump(level+1, file, (SV*)CvOUTSIDE(sv), nest+1, maxnest, dumpops, pvlim);
+ break;
+ case SVt_PVGV:
+ Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
+ Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
+ do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
+ Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
+ if (!GvGP(sv))
+ break;
+ Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
+ Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
+ Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
+ Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
+ Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
+ Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
+ Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
+ Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
+ Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%"UVxf"\n", (UV)GvGPFLAGS(sv));
+ Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
+ Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
+ Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
+ do_gv_dump (level, file, " EGV", GvEGV(sv));
+ break;
+ case SVt_PVIO:
+ Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
+ Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
+ Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
+ Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
+ Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
+ Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
+ Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
+ if (IoTOP_NAME(sv))
+ Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
+ do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
+ if (IoFMT_NAME(sv))
+ Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
+ do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
+ if (IoBOTTOM_NAME(sv))
+ Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
+ do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
+ Perl_dump_indent(aTHX_ level, file, " SUBPROCESS = %"IVdf"\n", (IV)IoSUBPROCESS(sv));
+ if (isPRINT(IoTYPE(sv)))
+ Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
+ else
+ Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
+ Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
+ break;
+ }
+}
+
+void
+Perl_sv_dump(pTHX_ SV *sv)
+{
+ do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
}
diff --git a/contrib/perl5/ebcdic.c b/contrib/perl5/ebcdic.c
index 890bd086..d86d50b 100644
--- a/contrib/perl5/ebcdic.c
+++ b/contrib/perl5/ebcdic.c
@@ -1,4 +1,5 @@
#include "EXTERN.h"
+#define PERL_IN_EBCDIC_C
#include "perl.h"
/* in ASCII order, not that it matters */
@@ -14,7 +15,7 @@ ebcdic_control(int ch)
ch = toupper(ch);
if ((ctlp = strchr(controllablechars, ch)) == 0) {
- die("unrecognised control character '%c'\n", ch);
+ Perl_die(aTHX_ "unrecognised control character '%c'\n", ch);
}
if (ctlp == controllablechars)
@@ -24,9 +25,17 @@ ebcdic_control(int ch)
} else { /* Want uncontrol */
if (ch == '\177' || ch == -1)
return('?');
+ else if (ch == '\157')
+ return('\177');
+ else if (ch == '\174')
+ return('\000');
+ else if (ch == '^') /* '\137' in 1047, '\260' in 819 */
+ return('\036');
+ else if (ch == '\155')
+ return('\037');
else if (0 < ch && ch < (sizeof(controllablechars) - 1))
return(controllablechars[ch+1]);
else
- die("invalid control request: '\\%03o'\n", ch & 0xFF);
+ Perl_die(aTHX_ "invalid control request: '\\%03o'\n", ch & 0xFF);
}
}
diff --git a/contrib/perl5/eg/cgi/dna_small_gif.uu b/contrib/perl5/eg/cgi/dna_small_gif.uu
new file mode 100644
index 0000000..1745c73
--- /dev/null
+++ b/contrib/perl5/eg/cgi/dna_small_gif.uu
@@ -0,0 +1,63 @@
+begin 444 dna_small.gif
+M1TE&.#=A)0`J`.<``+9%&Y<R0M<F'ID\,!<07%<G1:P<0Q`A2Q`P;"L9/L$:
+M,"480N5"&RL7:4LD0T,G144[7BHL2B4?3\0I+"</)BQ.9KD0/S878\96$Z\@
+M(:\1*RL:3L0W&QL?2#4?9>@_&A$_5<I"&C`A3*,3-A`//9X<)\@Q(L`@.#\E
+M7K,R*R\T6)H++1L72T8=4207:T`G=JX..MD^&!$_;^)2$#T=7S`79AL7.A$3
+M1-=%#^,Q&QT_:C8=1!L86]\R#4M":4H76R,515HZ4"477G@T,J\;(X(@/$\7
+M."4A2N9;$"DZ6RL34-8I$34A73P86I84/\87%1`0/V,B2"0<0N!(%QPH91<6
+M2=!5$3(=73(E23`/,!L4.=$Z'-MH%>`Y#3$=2"=#59M((H88,GP\/]X^&+$R
+M$"(79"DF33(93"$86=%;&"T4/=Y"&\\A$Q4Z4!`62*T4-Q4B9+X1*BH96SP?
+M1<0D/3(F<-TM$!`=5:H.(!<64C$W?#8J3*`S(S<@3=8V%K$](QT.6Q`43AL4
+M1:$D,;<0,\X9&,8])\@=$A(U244S5U,D6Q<V;]\I&&<K/8!*.R044>=/#YH>
+M08$I1B,09S$35R(:4C0?<19$7<D^#Q`>5!()-;4702M`=;56)A`25,0K%"X<
+M83`N>K`H'HDS*1`40,M&%!<@7M,_$A<N2L)%%18E4^<M$A@=5=0Q$Q`E311*
+M2L8E&2D<7Q\A7P\80B48,%E/8[1-'J4/-"H<3"PA1$,T?Q<15R44,R,A4AL/
+M,^M4%2,07!L+,[\[&!P4520I:C(9.=54$[,2/M-)&RP?7M=(%1$J8<-,%2H@
+M4B,=51436^]2"!X<1A<44RD</>E+#%0>0S0/:4PJ9I,F-6DG420Y<"@09R,0
+M-V$R/R4M<:\H0!(H410Z:AT27&4Q9"L@;=1%(MA-$M5+#RL4+M8Z&AT<7[<:
+M(-QA&2,36R$++B(84!0:5ALO:K$A.]X?&!$84V@;/SX<6Q`;2$(B2QD21W4J
+M1=TW&@```````````````"P`````)0`J```(_@!]:(N'18\W%15T$1N'C)V?
+M0_HH,<$G9YBX!C6<3;+T@AZ-)K@\O*"!KP^$>"KVA`L3*8P3)^5ZA)@B:AH+
+M9];F7.$Q+!`!0=*<E3'5K(:EHS2N%"AP*Y(\&##H6(!A:!XU99B*H?%4IDF?
+M!8'<"-F%9I*TH8A83:*TXYD!J83D$0ICI-NE(:O8I6&FJ$64$M5$M%!3PU,F
+M2UJD"9I41E824WT2G?BV-!$(!`=,+<IF!P>.%",&P7J"9XB82L5,48F5K,:"
+M'94FU='6;!*R3T->E"%&95DR"`/6P,I0PDF)0SG8($$RJN0R`FI(H7$A2]VD
+M*^^L_6(T3U*V%XH"_AB:HDS8H$AO5@R:P,8.I%^.:*AC(>Z!'":6RC`1L@W-
+M%1Q/,%(.'5+1`<D^74R@P2#?T*'/$"%@\(L5Y?RAB!SO3#*,-6CL44\4]C1#
+MR0Q3C&&"!AH08@(#:Y2C@`&1---,.#)\T84=R##`0",H++8#)34,@X80R:"`
+M0A<]?'#.!";`TDH.8QBB0354A!,*)WI0\<D\YJRQ3PE[V",(.D#48$T9GO22
+MA0.BC,)'*]3TP,`^\_#QA0P@>`/"*]=<HX\3"C!BAQV%5",$+Z0,0X,UL3SB
+M#B[NN$'/,A&,$L,Y[-BASR(@<**("E^,0(<&;[QA0@^,3%",#2S8H,01_LX0
+M`(0:W%`@13#TN+'#&LK@0$T0VER##50*Q/%-%%&H$`0#K7"`!B^X/`),()F0
+M0PNT[K#BRBS1-!("`^=,$8`D="B`QRW?1**+-I?(X$@(L(R2AQ8+Y,*#-*YX
+MH(00'1Q!CSI,U'!%)^_%4(X&FUB@01$.@*!#$I?4D48I&1BA!2*HD%))(.+T
+MYTEOT3B#PB/U4(,$%QD0(<\QX^CRBC=)@%`!&+:<<TH&M*C1"RJX'-'.'`YX
+M<H0@<)#"0CX+I%`*-%:4L@XFS`#[11M?U-))"&RP84LWZL!A1A^YH.*)!)3<
+MHXX6L]P3"!I`H/!`*>90`PD.F'3SR@-AG)`&_A=3'"**#[J(P<<I@YCA2@32
+M!,*+Q9H`(XT2'O2RS"CGS.U9!K>0^C0&S/#1""(ZI)'&*6,,$842N%Q!@3NK
+M"R'%%4KP0D(Q?"`S!3)<I#!!".68$T(IMHP#>BVE(/$+)#-80<PTLBRP^@$>
+M<+,`-[QH$LP+0_P!1C>=S("!,N>8XP<8H6131!B;3`#&#)"DTH(L5#P0S#W+
+MQ)*`$K1HHD4^;E!2QP%:B``&4H$,/Y2C$Y*(1%0(00A)@```77B"*$0@#3>P
+MP&PU4`,^H!","P!!$')0P^H6((I5L"$'.;``';[Q!@-\PP"<B$<]EG"(#*C"
+M%-(@0":\L0U?D&`#_L50@33.(`4M4``=&4@'+-9!!P9JP`#9T$4H=*$+!#1B
+M'3A(`SYH`81'B.,(XJ@"":0(CDRPH@/<"$88V+"%$N#A&)MPX0N2H`L]C&,<
+MEW"$%6:0BCV@XPIH>$0?)M$`<92!%OG8Q3#@(`U2C*)%9-!`&`K`!!EP0@80
+M2,0M;I$.:"C#"D.@P#UJ``]GT"*,K%B&*0+!@TFH8VV*0$(:_/`)?7@#'.'0
+M@R[H8``\:&`,=NC"*"B@!2TTHP5]N((TEH&`<)B"!PU`0RQ(P8MNS``9K6@%
+M'W31AG%$(BZ2&((PA-&#'I"A&`F8!DD\\`H6-,.,X'B'%,+R#FX4`PS&_L!$
+M.4R0#7W<0@%O2,07$($#9@C3"%C8P!5H88\]J$,"-E!;(.X@C5T<`!65V,40
+M,'&(0C!"`1JP@"3TH`T9=&,5JRC$-]+1`U%TP@@[^,$>Z$&*0%1A%XFK`BFD
+MX0L6Y"(#A_A$#[JPC@%\@1@02`(SJ#&&.`A@'\&$!AALX(4Y="`/TA"",UA!
+M@%W<8!*\$`$@C%""+G1A"9AP!"<>9@ME*)$0F\C!$I8`B3\TP@%'@$(QH$`"
+M)8@#'(B0ACB`P`,@%&,'9"##)S`1!&)\`0)^&,,^+$`("QC"#D\X!":HX0!<
+ML(`&-O!%,&H@BS#F0AI'`!LO^"`,/OS!%KJ0_H0HEA`E27Q#%T%X0"%"@`1E
+M2,`!:F!%+Q#A!G)40A!HP`4OFK`#-13#`?I(QCW38(Q/9&``%0#!);01BE>$
+M@!TZNL81$G`!-]2!&&5@A1N&T0Q<,$$$%*!``BR1A5$PPPH<74$%]*`#$.RA
+M`(VP@#`X$(`7``(%T=@`.5Q`C@:0`P[)D$4'$H`."MB#"908Q=X@,01B9$(7
+MG'A%`#8!"QSL@PUAL,0==M"")CQCP4)0QQUDP806H&,!T]A!`EH@AC2P`P,^
+MT`,*NN%-&&T!&L@X!!Y^<(4.D(,%E>A`,T20C#IXL`6-:,`5F+"#!W"@'%OH
+MA`IJ$5(#;`(;AV/'FA103(EV+(,>GHB&&ZJ`!D'<X0[-N$(N@)$+4$C@`<(`
+M$(&/<8Q;7$,1UT"``+>P!57`X1F9D`4<W$`"4MP@$ZYX\B-"004Y2$`.HT@%
+M)@IAB#><0!]FB(<I.(&`(7P"%GPPQ3)F`0YB0"$0@8"")L!Q!RH`8A&AL,8L
+BR!$$,@@#&5OX!1V.\85XA.,.,A##!T2!AP@LXP#;"`@`.P``
+end
diff --git a/contrib/perl5/eg/cgi/file_upload.cgi b/contrib/perl5/eg/cgi/file_upload.cgi
index f6bbbe0..3037de7 100644
--- a/contrib/perl5/eg/cgi/file_upload.cgi
+++ b/contrib/perl5/eg/cgi/file_upload.cgi
@@ -1,5 +1,6 @@
#!/usr/local/bin/perl -w
+use strict 'refs';
use lib '..';
use CGI qw(:standard);
use CGI::Carp qw/fatalsToBrowser/;
@@ -11,14 +12,14 @@ print strong("Version "),$CGI::VERSION,p;
print h1("File Upload Example"),
'This example demonstrates how to prompt the remote user to
select a remote file for uploading. ',
- strong("This feature only works with Netscape 2.0 browsers."),
+ strong("This feature only works with Netscape 2.0 or greater, or IE 4.0 or greater."),
p,
'Select the ',cite('browser'),' button to choose a text file
to upload. When you press the submit button, this script
will count the number of lines, words, and characters in
the file.';
-@types = ('count lines','count words','count characters');
+my @types = ('count lines','count words','count characters');
# Start a multipart form.
print start_multipart_form(),
@@ -31,9 +32,10 @@ print start_multipart_form(),
endform;
# Process the form if there is a file name entered
-if ($file = param('filename')) {
- $tmpfile=tmpFileName($file);
- $mimetype = uploadInfo($file)->{'Content-Type'} || '';
+if (my $file = param('filename')) {
+ my %stats;
+ my $tmpfile=tmpFileName($file);
+ my $mimetype = uploadInfo($file)->{'Content-Type'} || '';
print hr(),
h2($file),
h3($tmpfile),
diff --git a/contrib/perl5/eg/cgi/index.html b/contrib/perl5/eg/cgi/index.html
index 75e2d30..133ecc4 100644
--- a/contrib/perl5/eg/cgi/index.html
+++ b/contrib/perl5/eg/cgi/index.html
@@ -54,7 +54,8 @@
<li><a href="crash.txt">Look at its source code</a>
</ul>
-<EM>The Following Scripts only Work with Netscape 2.0 & Internet Explorer only!</EM>
+<EM>The Following Scripts Work with Netscape Navigator 2.0 and higher,
+or Internet Explorer 3.0 and higher</EM>
<H2> Prompt for a file to upload and process it</H2>
<UL>
@@ -107,12 +108,12 @@
<HR>
<MENU>
<LI> <A HREF="../cgi_docs.html">CGI.pm documentation</A>
- <LI> <A HREF="../../CGI.pm.tar.gz">Download the CGI.pm distribution</A>
+ <LI> <A HREF="../CGI.pm.tar.gz">Download the CGI.pm distribution</A>
</MENU>
<HR>
<ADDRESS>Lincoln D. Stein, lstein@genome.wi.mit.edu<br>
<a href="/">Whitehead Institute/MIT Center for Genome Research</a></ADDRESS>
<!-- hhmts start -->
-Last modified: Tue May 19 22:16:43 EDT 1998
+Last modified: Wed Jun 23 15:31:47 EDT 1999
<!-- hhmts end -->
</BODY> </HTML>
diff --git a/contrib/perl5/eg/cgi/wilogo_gif.uu b/contrib/perl5/eg/cgi/wilogo_gif.uu
new file mode 100644
index 0000000..c5d1042
--- /dev/null
+++ b/contrib/perl5/eg/cgi/wilogo_gif.uu
@@ -0,0 +1,13 @@
+begin 444 wilogo.gif
+M1TE&.#=A7@!$`(```'X2F?___RP`````7@!$```"_D2.J<#MKF)ZU,A3,[OO
+M(IUY']A%9"6AW$F)+#2]Y:BNLF6_\;WMH<?#I72^VP+D"@*)F&"O25KRDM&B
+M[%C-7;4_J)*6'4ZE&O`W8"1OQ5UGPWRBIKDPM!MW9J]-[;LUKL;$5W.'YQ3(
+M(O<&-^>F*(A55\BX%UEI^;<VB0BH1RFX2=<IELE4^*0'N?-I>OJ8N%(*Z^4G
+M.OJJ>8HZ.(>;JRMD><E[!KQHB^3;:APL6Z8\RKPK/)O:*-WLW&7]*\UYR]J)
+M?<P=1MR-_6VN76,WGAV^32W^3CZ_SCY3;W__C-R^CU^\%M#T!9PVL(ZZ&>X"
+M%A1XSM]!A?T8/C0T$1XMJG\B&G+,"-&C/(VS0(842;`)M'S>_OE8F#"=2S#*
+M8LHLAS'D1Y,42UGY9O,F-T:X@@JEE@D1RW>/D@8R.DZ-+*E0CQ:9JJ5JU!SQ
+MR&BU2D.;E*4'ER0TNY%G2A/Y.G[=VG%81+5K_UG$21<A6;=YP9'5B++O7:@7
+M\]J5]]?DX7:)%<]5%=B/55>-GQW55;$8L\RW6J8-9>QM7<^A/SMZK!ESY$,+
+(KPA.EJ```#L`
+end
diff --git a/contrib/perl5/embed.h b/contrib/perl5/embed.h
index e7deb32..d372b206 100644
--- a/contrib/perl5/embed.h
+++ b/contrib/perl5/embed.h
@@ -1,38 +1,86 @@
/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- This file is built by embed.pl from global.sym, intrpvar.h,
- and thrdvar.h. Any changes made here will be lost!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
*/
/* (Doing namespace management portably in C is really gross.) */
-/* EMBED has no run-time penalty, but helps keep the Perl namespace
- from colliding with that used by other libraries pulled in
- by extensions or by embedding perl. Allow a cc -DNO_EMBED
- override, however, to keep binary compatability with previous
- versions of perl.
-*/
-#ifndef NO_EMBED
-# define EMBED 1
+/* NO_EMBED is no longer supported. i.e. EMBED is always active. */
+
+/* provide binary compatible (but inconsistent) names */
+#if defined(PERL_BINCOMPAT_5005)
+# define Perl_call_atexit perl_atexit
+# define Perl_eval_sv perl_eval_sv
+# define Perl_eval_pv perl_eval_pv
+# define Perl_call_argv perl_call_argv
+# define Perl_call_method perl_call_method
+# define Perl_call_pv perl_call_pv
+# define Perl_call_sv perl_call_sv
+# define Perl_get_av perl_get_av
+# define Perl_get_cv perl_get_cv
+# define Perl_get_hv perl_get_hv
+# define Perl_get_sv perl_get_sv
+# define Perl_init_i18nl10n perl_init_i18nl10n
+# define Perl_init_i18nl14n perl_init_i18nl14n
+# define Perl_new_collate perl_new_collate
+# define Perl_new_ctype perl_new_ctype
+# define Perl_new_numeric perl_new_numeric
+# define Perl_require_pv perl_require_pv
+# define Perl_safesyscalloc Perl_safecalloc
+# define Perl_safesysfree Perl_safefree
+# define Perl_safesysmalloc Perl_safemalloc
+# define Perl_safesysrealloc Perl_saferealloc
+# define Perl_set_numeric_local perl_set_numeric_local
+# define Perl_set_numeric_standard perl_set_numeric_standard
+/* malloc() pollution was the default in earlier versions, so enable
+ * it for bincompat; but not for systems that used to do prevent that,
+ * or when they ask for {HIDE,EMBED}MYMALLOC */
+# if !defined(EMBEDMYMALLOC) && !defined(HIDEMYMALLOC)
+# if !defined(NeXT) && !defined(__NeXT) && !defined(__MACHTEN__) && \
+ !defined(__QNX__)
+# define PERL_POLLUTE_MALLOC
+# endif
+# endif
#endif
-/* Hide global symbols? */
+/* Hide global symbols */
-#ifdef EMBED
+#if !defined(PERL_OBJECT)
+#if !defined(PERL_IMPLICIT_CONTEXT)
-#define AMG_names Perl_AMG_names
-#define Error Perl_Error
-#define Gv_AMupdate Perl_Gv_AMupdate
-#define abs_amg Perl_abs_amg
-#define add_amg Perl_add_amg
-#define add_ass_amg Perl_add_ass_amg
-#define additem Perl_additem
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#if defined(USE_ITHREADS)
+# if defined(PERL_IMPLICIT_SYS)
+# endif
+#endif
+#if defined(MYMALLOC)
+#define malloced_size Perl_malloced_size
+#endif
+#define get_context Perl_get_context
+#define set_context Perl_set_context
+#if defined(PERL_OBJECT)
+#ifndef __BORLANDC__
+#endif
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
#define amagic_call Perl_amagic_call
+#define Gv_AMupdate Perl_Gv_AMupdate
#define append_elem Perl_append_elem
#define append_list Perl_append_list
#define apply Perl_apply
-#define assertref Perl_assertref
-#define atan2_amg Perl_atan2_amg
+#define avhv_delete_ent Perl_avhv_delete_ent
+#define avhv_exists_ent Perl_avhv_exists_ent
+#define avhv_fetch_ent Perl_avhv_fetch_ent
+#define avhv_store_ent Perl_avhv_store_ent
+#define avhv_iternext Perl_avhv_iternext
+#define avhv_iterval Perl_avhv_iterval
+#define avhv_keys Perl_avhv_keys
#define av_clear Perl_av_clear
+#define av_delete Perl_av_delete
+#define av_exists Perl_av_exists
#define av_extend Perl_av_extend
#define av_fake Perl_av_fake
#define av_fetch Perl_av_fetch
@@ -46,169 +94,134 @@
#define av_store Perl_av_store
#define av_undef Perl_av_undef
#define av_unshift Perl_av_unshift
-#define avhv_exists_ent Perl_avhv_exists_ent
-#define avhv_fetch_ent Perl_avhv_fetch_ent
-#define avhv_iternext Perl_avhv_iternext
-#define avhv_iterval Perl_avhv_iterval
-#define avhv_keys Perl_avhv_keys
-#define band_amg Perl_band_amg
#define bind_match Perl_bind_match
#define block_end Perl_block_end
#define block_gimme Perl_block_gimme
#define block_start Perl_block_start
-#define block_type Perl_block_type
-#define bool__amg Perl_bool__amg
#define boot_core_UNIVERSAL Perl_boot_core_UNIVERSAL
-#define bor_amg Perl_bor_amg
-#define bset_obj_store Perl_bset_obj_store
-#define bxor_amg Perl_bxor_amg
-#define byterun Perl_byterun
#define call_list Perl_call_list
#define cando Perl_cando
#define cast_ulong Perl_cast_ulong
-#define check Perl_check
-#define check_uni Perl_check_uni
-#define checkcomma Perl_checkcomma
-#define ck_aelem Perl_ck_aelem
-#define ck_anoncode Perl_ck_anoncode
-#define ck_bitop Perl_ck_bitop
-#define ck_concat Perl_ck_concat
-#define ck_delete Perl_ck_delete
-#define ck_eof Perl_ck_eof
-#define ck_eval Perl_ck_eval
-#define ck_exec Perl_ck_exec
-#define ck_exists Perl_ck_exists
-#define ck_ftst Perl_ck_ftst
-#define ck_fun Perl_ck_fun
-#define ck_fun_locale Perl_ck_fun_locale
-#define ck_glob Perl_ck_glob
-#define ck_grep Perl_ck_grep
-#define ck_gvconst Perl_ck_gvconst
-#define ck_index Perl_ck_index
-#define ck_lengthconst Perl_ck_lengthconst
-#define ck_lfun Perl_ck_lfun
-#define ck_listiob Perl_ck_listiob
-#define ck_match Perl_ck_match
-#define ck_null Perl_ck_null
-#define ck_repeat Perl_ck_repeat
-#define ck_require Perl_ck_require
-#define ck_retarget Perl_ck_retarget
-#define ck_rfun Perl_ck_rfun
-#define ck_rvconst Perl_ck_rvconst
-#define ck_scmp Perl_ck_scmp
-#define ck_select Perl_ck_select
-#define ck_shift Perl_ck_shift
-#define ck_sort Perl_ck_sort
-#define ck_spair Perl_ck_spair
-#define ck_split Perl_ck_split
-#define ck_subr Perl_ck_subr
-#define ck_svconst Perl_ck_svconst
-#define ck_trunc Perl_ck_trunc
-#define compl_amg Perl_compl_amg
-#define concat_amg Perl_concat_amg
-#define concat_ass_amg Perl_concat_ass_amg
+#define cast_i32 Perl_cast_i32
+#define cast_iv Perl_cast_iv
+#define cast_uv Perl_cast_uv
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#define my_chsize Perl_my_chsize
+#endif
+#if defined(USE_THREADS)
#define condpair_magic Perl_condpair_magic
+#endif
#define convert Perl_convert
-#define cos_amg Perl_cos_amg
#define croak Perl_croak
+#define vcroak Perl_vcroak
+#if defined(PERL_IMPLICIT_CONTEXT)
+#define croak_nocontext Perl_croak_nocontext
+#define die_nocontext Perl_die_nocontext
+#define deb_nocontext Perl_deb_nocontext
+#define form_nocontext Perl_form_nocontext
+#define load_module_nocontext Perl_load_module_nocontext
+#define mess_nocontext Perl_mess_nocontext
+#define warn_nocontext Perl_warn_nocontext
+#define warner_nocontext Perl_warner_nocontext
+#define newSVpvf_nocontext Perl_newSVpvf_nocontext
+#define sv_catpvf_nocontext Perl_sv_catpvf_nocontext
+#define sv_setpvf_nocontext Perl_sv_setpvf_nocontext
+#define sv_catpvf_mg_nocontext Perl_sv_catpvf_mg_nocontext
+#define sv_setpvf_mg_nocontext Perl_sv_setpvf_mg_nocontext
+#define fprintf_nocontext Perl_fprintf_nocontext
+#endif
#define cv_ckproto Perl_cv_ckproto
#define cv_clone Perl_cv_clone
#define cv_const_sv Perl_cv_const_sv
+#define op_const_sv Perl_op_const_sv
#define cv_undef Perl_cv_undef
#define cx_dump Perl_cx_dump
+#define filter_add Perl_filter_add
+#define filter_del Perl_filter_del
+#define filter_read Perl_filter_read
+#define get_op_descs Perl_get_op_descs
+#define get_op_names Perl_get_op_names
+#define get_no_modify Perl_get_no_modify
+#define get_opargs Perl_get_opargs
+#define get_ppaddr Perl_get_ppaddr
#define cxinc Perl_cxinc
-#define dc Perl_dc
#define deb Perl_deb
-#define deb_growlevel Perl_deb_growlevel
-#define debop Perl_debop
+#define vdeb Perl_vdeb
#define debprofdump Perl_debprofdump
+#define debop Perl_debop
#define debstack Perl_debstack
#define debstackptrs Perl_debstackptrs
-#define dec_amg Perl_dec_amg
#define delimcpy Perl_delimcpy
#define deprecate Perl_deprecate
-#define di Perl_di
#define die Perl_die
+#define vdie Perl_vdie
#define die_where Perl_die_where
-#define div_amg Perl_div_amg
-#define div_ass_amg Perl_div_ass_amg
+#define dounwind Perl_dounwind
#define do_aexec Perl_do_aexec
+#define do_aexec5 Perl_do_aexec5
#define do_binmode Perl_do_binmode
-#define do_chomp Perl_do_chomp
#define do_chop Perl_do_chop
#define do_close Perl_do_close
#define do_eof Perl_do_eof
#define do_exec Perl_do_exec
+#if !defined(WIN32)
+#define do_exec3 Perl_do_exec3
+#endif
#define do_execfree Perl_do_execfree
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
#define do_ipcctl Perl_do_ipcctl
#define do_ipcget Perl_do_ipcget
-#define do_join Perl_do_join
-#define do_kv Perl_do_kv
#define do_msgrcv Perl_do_msgrcv
#define do_msgsnd Perl_do_msgsnd
+#define do_semop Perl_do_semop
+#define do_shmio Perl_do_shmio
+#endif
+#define do_join Perl_do_join
+#define do_kv Perl_do_kv
#define do_open Perl_do_open
+#define do_open9 Perl_do_open9
#define do_pipe Perl_do_pipe
#define do_print Perl_do_print
#define do_readline Perl_do_readline
+#define do_chomp Perl_do_chomp
#define do_seek Perl_do_seek
-#define do_semop Perl_do_semop
-#define do_shmio Perl_do_shmio
#define do_sprintf Perl_do_sprintf
#define do_sysseek Perl_do_sysseek
#define do_tell Perl_do_tell
#define do_trans Perl_do_trans
+#define do_vecget Perl_do_vecget
#define do_vecset Perl_do_vecset
#define do_vop Perl_do_vop
#define dofile Perl_dofile
-#define dofindlabel Perl_dofindlabel
-#define dopoptoeval Perl_dopoptoeval
-#define dounwind Perl_dounwind
#define dowantarray Perl_dowantarray
-#define ds Perl_ds
#define dump_all Perl_dump_all
#define dump_eval Perl_dump_eval
+#if defined(DUMP_FDS)
#define dump_fds Perl_dump_fds
+#endif
#define dump_form Perl_dump_form
-#define dump_gv Perl_dump_gv
-#define dump_mstats Perl_dump_mstats
-#define dump_op Perl_dump_op
+#define gv_dump Perl_gv_dump
+#define op_dump Perl_op_dump
+#define pmop_dump Perl_pmop_dump
#define dump_packsubs Perl_dump_packsubs
-#define dump_pm Perl_dump_pm
#define dump_sub Perl_dump_sub
-#define eq_amg Perl_eq_amg
-#define exp_amg Perl_exp_amg
-#define expectterm Perl_expectterm
-#define fallback_amg Perl_fallback_amg
#define fbm_compile Perl_fbm_compile
#define fbm_instr Perl_fbm_instr
-#define fetch_gv Perl_fetch_gv
-#define fetch_io Perl_fetch_io
-#define filter_add Perl_filter_add
-#define filter_del Perl_filter_del
-#define filter_read Perl_filter_read
#define find_script Perl_find_script
+#if defined(USE_THREADS)
#define find_threadsv Perl_find_threadsv
-#define fold Perl_fold
-#define fold_constants Perl_fold_constants
-#define fold_locale Perl_fold_locale
-#define force_ident Perl_force_ident
+#endif
#define force_list Perl_force_list
-#define force_next Perl_force_next
-#define force_word Perl_force_word
+#define fold_constants Perl_fold_constants
#define form Perl_form
+#define vform Perl_vform
#define free_tmps Perl_free_tmps
-#define freq Perl_freq
-#define ge_amg Perl_ge_amg
#define gen_constant_list Perl_gen_constant_list
-#define get_no_modify Perl_get_no_modify
-#define get_op_descs Perl_get_op_descs
-#define get_op_names Perl_get_op_names
-#define get_opargs Perl_get_opargs
-#define get_specialsv_list Perl_get_specialsv_list
-#define get_vtbl Perl_get_vtbl
+#if !defined(HAS_GETENV_LEN)
+#define getenv_len Perl_getenv_len
+#endif
#define gp_free Perl_gp_free
#define gp_ref Perl_gp_ref
-#define gt_amg Perl_gt_amg
#define gv_AVadd Perl_gv_AVadd
#define gv_HVadd Perl_gv_HVadd
#define gv_IOadd Perl_gv_IOadd
@@ -244,39 +257,82 @@
#define hv_iterval Perl_hv_iterval
#define hv_ksplit Perl_hv_ksplit
#define hv_magic Perl_hv_magic
-#define hv_stashpv Perl_hv_stashpv
#define hv_store Perl_hv_store
#define hv_store_ent Perl_hv_store_ent
#define hv_undef Perl_hv_undef
#define ibcmp Perl_ibcmp
#define ibcmp_locale Perl_ibcmp_locale
-#define inc_amg Perl_inc_amg
#define ingroup Perl_ingroup
+#define init_debugger Perl_init_debugger
#define init_stacks Perl_init_stacks
-#define init_thread_intern Perl_init_thread_intern
-#define instr Perl_instr
#define intro_my Perl_intro_my
-#define intuit_more Perl_intuit_more
-#define invert Perl_invert
+#define instr Perl_instr
#define io_close Perl_io_close
+#define invert Perl_invert
+#define is_uni_alnum Perl_is_uni_alnum
+#define is_uni_alnumc Perl_is_uni_alnumc
+#define is_uni_idfirst Perl_is_uni_idfirst
+#define is_uni_alpha Perl_is_uni_alpha
+#define is_uni_ascii Perl_is_uni_ascii
+#define is_uni_space Perl_is_uni_space
+#define is_uni_cntrl Perl_is_uni_cntrl
+#define is_uni_graph Perl_is_uni_graph
+#define is_uni_digit Perl_is_uni_digit
+#define is_uni_upper Perl_is_uni_upper
+#define is_uni_lower Perl_is_uni_lower
+#define is_uni_print Perl_is_uni_print
+#define is_uni_punct Perl_is_uni_punct
+#define is_uni_xdigit Perl_is_uni_xdigit
+#define to_uni_upper Perl_to_uni_upper
+#define to_uni_title Perl_to_uni_title
+#define to_uni_lower Perl_to_uni_lower
+#define is_uni_alnum_lc Perl_is_uni_alnum_lc
+#define is_uni_alnumc_lc Perl_is_uni_alnumc_lc
+#define is_uni_idfirst_lc Perl_is_uni_idfirst_lc
+#define is_uni_alpha_lc Perl_is_uni_alpha_lc
+#define is_uni_ascii_lc Perl_is_uni_ascii_lc
+#define is_uni_space_lc Perl_is_uni_space_lc
+#define is_uni_cntrl_lc Perl_is_uni_cntrl_lc
+#define is_uni_graph_lc Perl_is_uni_graph_lc
+#define is_uni_digit_lc Perl_is_uni_digit_lc
+#define is_uni_upper_lc Perl_is_uni_upper_lc
+#define is_uni_lower_lc Perl_is_uni_lower_lc
+#define is_uni_print_lc Perl_is_uni_print_lc
+#define is_uni_punct_lc Perl_is_uni_punct_lc
+#define is_uni_xdigit_lc Perl_is_uni_xdigit_lc
+#define to_uni_upper_lc Perl_to_uni_upper_lc
+#define to_uni_title_lc Perl_to_uni_title_lc
+#define to_uni_lower_lc Perl_to_uni_lower_lc
+#define is_utf8_char Perl_is_utf8_char
+#define is_utf8_alnum Perl_is_utf8_alnum
+#define is_utf8_alnumc Perl_is_utf8_alnumc
+#define is_utf8_idfirst Perl_is_utf8_idfirst
+#define is_utf8_alpha Perl_is_utf8_alpha
+#define is_utf8_ascii Perl_is_utf8_ascii
+#define is_utf8_space Perl_is_utf8_space
+#define is_utf8_cntrl Perl_is_utf8_cntrl
+#define is_utf8_digit Perl_is_utf8_digit
+#define is_utf8_graph Perl_is_utf8_graph
+#define is_utf8_upper Perl_is_utf8_upper
+#define is_utf8_lower Perl_is_utf8_lower
+#define is_utf8_print Perl_is_utf8_print
+#define is_utf8_punct Perl_is_utf8_punct
+#define is_utf8_xdigit Perl_is_utf8_xdigit
+#define is_utf8_mark Perl_is_utf8_mark
#define jmaybe Perl_jmaybe
#define keyword Perl_keyword
-#define know_next Perl_know_next
-#define le_amg Perl_le_amg
#define leave_scope Perl_leave_scope
#define lex_end Perl_lex_end
#define lex_start Perl_lex_start
#define linklist Perl_linklist
#define list Perl_list
#define listkids Perl_listkids
+#define load_module Perl_load_module
+#define vload_module Perl_vload_module
#define localize Perl_localize
-#define log_amg Perl_log_amg
#define looks_like_number Perl_looks_like_number
-#define lshift_amg Perl_lshift_amg
-#define lshift_ass_amg Perl_lshift_ass_amg
-#define lt_amg Perl_lt_amg
-#define magic_clear_all_env Perl_magic_clear_all_env
#define magic_clearenv Perl_magic_clearenv
+#define magic_clear_all_env Perl_magic_clear_all_env
#define magic_clearpack Perl_magic_clearpack
#define magic_clearsig Perl_magic_clearsig
#define magic_existspack Perl_magic_existspack
@@ -294,20 +350,25 @@
#define magic_getuvar Perl_magic_getuvar
#define magic_getvec Perl_magic_getvec
#define magic_len Perl_magic_len
+#if defined(USE_THREADS)
#define magic_mutexfree Perl_magic_mutexfree
+#endif
#define magic_nextpack Perl_magic_nextpack
+#define magic_regdata_cnt Perl_magic_regdata_cnt
+#define magic_regdatum_get Perl_magic_regdatum_get
#define magic_set Perl_magic_set
-#define magic_set_all_env Perl_magic_set_all_env
#define magic_setamagic Perl_magic_setamagic
#define magic_setarylen Perl_magic_setarylen
#define magic_setbm Perl_magic_setbm
-#define magic_setcollxfrm Perl_magic_setcollxfrm
#define magic_setdbline Perl_magic_setdbline
+#if defined(USE_LOCALE_COLLATE)
+#define magic_setcollxfrm Perl_magic_setcollxfrm
+#endif
#define magic_setdefelem Perl_magic_setdefelem
#define magic_setenv Perl_magic_setenv
#define magic_setfm Perl_magic_setfm
-#define magic_setglob Perl_magic_setglob
#define magic_setisa Perl_magic_setisa
+#define magic_setglob Perl_magic_setglob
#define magic_setmglob Perl_magic_setmglob
#define magic_setnkeys Perl_magic_setnkeys
#define magic_setpack Perl_magic_setpack
@@ -317,13 +378,17 @@
#define magic_settaint Perl_magic_settaint
#define magic_setuvar Perl_magic_setuvar
#define magic_setvec Perl_magic_setvec
+#define magic_set_all_env Perl_magic_set_all_env
#define magic_sizepack Perl_magic_sizepack
#define magic_wipepack Perl_magic_wipepack
#define magicname Perl_magicname
-#define malloced_size Perl_malloced_size
#define markstack_grow Perl_markstack_grow
+#if defined(USE_LOCALE_COLLATE)
#define mem_collxfrm Perl_mem_collxfrm
+#endif
#define mess Perl_mess
+#define vmess Perl_vmess
+#define qerror Perl_qerror
#define mg_clear Perl_mg_clear
#define mg_copy Perl_mg_copy
#define mg_find Perl_mg_find
@@ -334,130 +399,770 @@
#define mg_set Perl_mg_set
#define mg_size Perl_mg_size
#define mod Perl_mod
-#define mod_amg Perl_mod_amg
-#define mod_ass_amg Perl_mod_ass_amg
-#define modkids Perl_modkids
+#define mode_from_discipline Perl_mode_from_discipline
#define moreswitches Perl_moreswitches
-#define mstats Perl_mstats
-#define mult_amg Perl_mult_amg
-#define mult_ass_amg Perl_mult_ass_amg
#define my Perl_my
+#define my_atof Perl_my_atof
+#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
#define my_bcopy Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
#define my_bzero Perl_my_bzero
-#define my_chsize Perl_my_chsize
+#endif
#define my_exit Perl_my_exit
#define my_failure_exit Perl_my_failure_exit
-#define my_htonl Perl_my_htonl
+#define my_fflush_all Perl_my_fflush_all
#define my_lstat Perl_my_lstat
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
#define my_memcmp Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
#define my_memset Perl_my_memset
-#define my_ntohl Perl_my_ntohl
+#endif
+#if !defined(PERL_OBJECT)
#define my_pclose Perl_my_pclose
#define my_popen Perl_my_popen
+#endif
#define my_setenv Perl_my_setenv
#define my_stat Perl_my_stat
+#if defined(MYSWAP)
#define my_swap Perl_my_swap
+#define my_htonl Perl_my_htonl
+#define my_ntohl Perl_my_ntohl
+#endif
#define my_unexec Perl_my_unexec
-#define ncmp_amg Perl_ncmp_amg
-#define ne_amg Perl_ne_amg
-#define neg_amg Perl_neg_amg
-#define newANONHASH Perl_newANONHASH
#define newANONLIST Perl_newANONLIST
+#define newANONHASH Perl_newANONHASH
#define newANONSUB Perl_newANONSUB
#define newASSIGNOP Perl_newASSIGNOP
-#define newAV Perl_newAV
-#define newAVREF Perl_newAVREF
-#define newBINOP Perl_newBINOP
#define newCONDOP Perl_newCONDOP
#define newCONSTSUB Perl_newCONSTSUB
-#define newCVREF Perl_newCVREF
#define newFORM Perl_newFORM
#define newFOROP Perl_newFOROP
-#define newGVOP Perl_newGVOP
-#define newGVREF Perl_newGVREF
-#define newGVgen Perl_newGVgen
-#define newHV Perl_newHV
-#define newHVREF Perl_newHVREF
-#define newHVhv Perl_newHVhv
-#define newIO Perl_newIO
-#define newLISTOP Perl_newLISTOP
#define newLOGOP Perl_newLOGOP
#define newLOOPEX Perl_newLOOPEX
#define newLOOPOP Perl_newLOOPOP
#define newNULLLIST Perl_newNULLLIST
#define newOP Perl_newOP
-#define newPMOP Perl_newPMOP
#define newPROG Perl_newPROG
-#define newPVOP Perl_newPVOP
#define newRANGE Perl_newRANGE
-#define newRV Perl_newRV
-#define newRV_noinc Perl_newRV_noinc
#define newSLICEOP Perl_newSLICEOP
#define newSTATEOP Perl_newSTATEOP
#define newSUB Perl_newSUB
+#define newXS Perl_newXS
+#define newAV Perl_newAV
+#define newAVREF Perl_newAVREF
+#define newBINOP Perl_newBINOP
+#define newCVREF Perl_newCVREF
+#define newGVOP Perl_newGVOP
+#define newGVgen Perl_newGVgen
+#define newGVREF Perl_newGVREF
+#define newHVREF Perl_newHVREF
+#define newHV Perl_newHV
+#define newHVhv Perl_newHVhv
+#define newIO Perl_newIO
+#define newLISTOP Perl_newLISTOP
+#define newPADOP Perl_newPADOP
+#define newPMOP Perl_newPMOP
+#define newPVOP Perl_newPVOP
+#define newRV Perl_newRV
+#define newRV_noinc Perl_newRV_noinc
#define newSV Perl_newSV
-#define newSVOP Perl_newSVOP
#define newSVREF Perl_newSVREF
+#define newSVOP Perl_newSVOP
#define newSViv Perl_newSViv
+#define newSVuv Perl_newSVuv
#define newSVnv Perl_newSVnv
#define newSVpv Perl_newSVpv
-#define newSVpvf Perl_newSVpvf
#define newSVpvn Perl_newSVpvn
+#define newSVpvf Perl_newSVpvf
+#define vnewSVpvf Perl_vnewSVpvf
#define newSVrv Perl_newSVrv
#define newSVsv Perl_newSVsv
#define newUNOP Perl_newUNOP
#define newWHILEOP Perl_newWHILEOP
-#define newXS Perl_newXS
-#define newXSUB Perl_newXSUB
#define new_stackinfo Perl_new_stackinfo
-#define new_struct_thread Perl_new_struct_thread
#define nextargv Perl_nextargv
#define ninstr Perl_ninstr
-#define no_aelem Perl_no_aelem
-#define no_dir_func Perl_no_dir_func
-#define no_fh_allowed Perl_no_fh_allowed
-#define no_func Perl_no_func
-#define no_helem Perl_no_helem
-#define no_mem Perl_no_mem
-#define no_modify Perl_no_modify
-#define no_myglob Perl_no_myglob
-#define no_op Perl_no_op
-#define no_security Perl_no_security
-#define no_sock_func Perl_no_sock_func
-#define no_symref Perl_no_symref
-#define no_usym Perl_no_usym
-#define no_wrongref Perl_no_wrongref
-#define nointrp Perl_nointrp
-#define nomem Perl_nomem
-#define nomethod_amg Perl_nomethod_amg
-#define not_amg Perl_not_amg
-#define numer_amg Perl_numer_amg
-#define oopsAV Perl_oopsAV
#define oopsCV Perl_oopsCV
-#define oopsHV Perl_oopsHV
-#define op_const_sv Perl_op_const_sv
-#define op_desc Perl_op_desc
#define op_free Perl_op_free
-#define op_name Perl_op_name
-#define opargs Perl_opargs
#define package Perl_package
#define pad_alloc Perl_pad_alloc
#define pad_allocmy Perl_pad_allocmy
#define pad_findmy Perl_pad_findmy
-#define pad_free Perl_pad_free
+#define oopsAV Perl_oopsAV
+#define oopsHV Perl_oopsHV
#define pad_leavemy Perl_pad_leavemy
-#define pad_reset Perl_pad_reset
#define pad_sv Perl_pad_sv
+#define pad_free Perl_pad_free
+#define pad_reset Perl_pad_reset
#define pad_swipe Perl_pad_swipe
#define peep Perl_peep
+#if defined(PERL_OBJECT)
+#endif
+#if defined(USE_THREADS)
+#define new_struct_thread Perl_new_struct_thread
+#endif
+#define call_atexit Perl_call_atexit
+#define call_argv Perl_call_argv
+#define call_method Perl_call_method
+#define call_pv Perl_call_pv
+#define call_sv Perl_call_sv
+#define eval_pv Perl_eval_pv
+#define eval_sv Perl_eval_sv
+#define get_sv Perl_get_sv
+#define get_av Perl_get_av
+#define get_hv Perl_get_hv
+#define get_cv Perl_get_cv
+#define init_i18nl10n Perl_init_i18nl10n
+#define init_i18nl14n Perl_init_i18nl14n
+#define new_collate Perl_new_collate
+#define new_ctype Perl_new_ctype
+#define new_numeric Perl_new_numeric
+#define set_numeric_local Perl_set_numeric_local
+#define set_numeric_radix Perl_set_numeric_radix
+#define set_numeric_standard Perl_set_numeric_standard
+#define require_pv Perl_require_pv
#define pidgone Perl_pidgone
#define pmflag Perl_pmflag
#define pmruntime Perl_pmruntime
#define pmtrans Perl_pmtrans
#define pop_return Perl_pop_return
#define pop_scope Perl_pop_scope
-#define pow_amg Perl_pow_amg
-#define pow_ass_amg Perl_pow_ass_amg
+#define prepend_elem Perl_prepend_elem
+#define push_return Perl_push_return
+#define push_scope Perl_push_scope
+#define ref Perl_ref
+#define refkids Perl_refkids
+#define regdump Perl_regdump
+#define pregexec Perl_pregexec
+#define pregfree Perl_pregfree
+#define pregcomp Perl_pregcomp
+#define re_intuit_start Perl_re_intuit_start
+#define re_intuit_string Perl_re_intuit_string
+#define regexec_flags Perl_regexec_flags
+#define regnext Perl_regnext
+#define regprop Perl_regprop
+#define repeatcpy Perl_repeatcpy
+#define rninstr Perl_rninstr
+#define rsignal Perl_rsignal
+#define rsignal_restore Perl_rsignal_restore
+#define rsignal_save Perl_rsignal_save
+#define rsignal_state Perl_rsignal_state
+#define rxres_free Perl_rxres_free
+#define rxres_restore Perl_rxres_restore
+#define rxres_save Perl_rxres_save
+#if !defined(HAS_RENAME)
+#define same_dirent Perl_same_dirent
+#endif
+#define savepv Perl_savepv
+#define savepvn Perl_savepvn
+#define savestack_grow Perl_savestack_grow
+#define save_aelem Perl_save_aelem
+#define save_alloc Perl_save_alloc
+#define save_aptr Perl_save_aptr
+#define save_ary Perl_save_ary
+#define save_clearsv Perl_save_clearsv
+#define save_delete Perl_save_delete
+#define save_destructor Perl_save_destructor
+#define save_destructor_x Perl_save_destructor_x
+#define save_freesv Perl_save_freesv
+#define save_freeop Perl_save_freeop
+#define save_freepv Perl_save_freepv
+#define save_generic_svref Perl_save_generic_svref
+#define save_gp Perl_save_gp
+#define save_hash Perl_save_hash
+#define save_helem Perl_save_helem
+#define save_hints Perl_save_hints
+#define save_hptr Perl_save_hptr
+#define save_I16 Perl_save_I16
+#define save_I32 Perl_save_I32
+#define save_I8 Perl_save_I8
+#define save_int Perl_save_int
+#define save_item Perl_save_item
+#define save_iv Perl_save_iv
+#define save_list Perl_save_list
+#define save_long Perl_save_long
+#define save_nogv Perl_save_nogv
+#define save_op Perl_save_op
+#define save_scalar Perl_save_scalar
+#define save_pptr Perl_save_pptr
+#define save_vptr Perl_save_vptr
+#define save_re_context Perl_save_re_context
+#define save_sptr Perl_save_sptr
+#define save_svref Perl_save_svref
+#define save_threadsv Perl_save_threadsv
+#define sawparens Perl_sawparens
+#define scalar Perl_scalar
+#define scalarkids Perl_scalarkids
+#define scalarseq Perl_scalarseq
+#define scalarvoid Perl_scalarvoid
+#define scan_bin Perl_scan_bin
+#define scan_hex Perl_scan_hex
+#define scan_num Perl_scan_num
+#define scan_oct Perl_scan_oct
+#define scope Perl_scope
+#define screaminstr Perl_screaminstr
+#if !defined(VMS)
+#define setenv_getix Perl_setenv_getix
+#endif
+#define setdefout Perl_setdefout
+#define sharepvn Perl_sharepvn
+#define share_hek Perl_share_hek
+#define sighandler Perl_sighandler
+#define stack_grow Perl_stack_grow
+#define start_subparse Perl_start_subparse
+#define sub_crush_depth Perl_sub_crush_depth
+#define sv_2bool Perl_sv_2bool
+#define sv_2cv Perl_sv_2cv
+#define sv_2io Perl_sv_2io
+#define sv_2iv Perl_sv_2iv
+#define sv_2mortal Perl_sv_2mortal
+#define sv_2nv Perl_sv_2nv
+#define sv_2pv Perl_sv_2pv
+#define sv_2pvutf8 Perl_sv_2pvutf8
+#define sv_2pvbyte Perl_sv_2pvbyte
+#define sv_2uv Perl_sv_2uv
+#define sv_iv Perl_sv_iv
+#define sv_uv Perl_sv_uv
+#define sv_nv Perl_sv_nv
+#define sv_pvn Perl_sv_pvn
+#define sv_pvutf8n Perl_sv_pvutf8n
+#define sv_pvbyten Perl_sv_pvbyten
+#define sv_true Perl_sv_true
+#define sv_add_arena Perl_sv_add_arena
+#define sv_backoff Perl_sv_backoff
+#define sv_bless Perl_sv_bless
+#define sv_catpvf Perl_sv_catpvf
+#define sv_vcatpvf Perl_sv_vcatpvf
+#define sv_catpv Perl_sv_catpv
+#define sv_catpvn Perl_sv_catpvn
+#define sv_catsv Perl_sv_catsv
+#define sv_chop Perl_sv_chop
+#define sv_clean_all Perl_sv_clean_all
+#define sv_clean_objs Perl_sv_clean_objs
+#define sv_clear Perl_sv_clear
+#define sv_cmp Perl_sv_cmp
+#define sv_cmp_locale Perl_sv_cmp_locale
+#if defined(USE_LOCALE_COLLATE)
+#define sv_collxfrm Perl_sv_collxfrm
+#endif
+#define sv_compile_2op Perl_sv_compile_2op
+#define sv_dec Perl_sv_dec
+#define sv_dump Perl_sv_dump
+#define sv_derived_from Perl_sv_derived_from
+#define sv_eq Perl_sv_eq
+#define sv_free Perl_sv_free
+#define sv_free_arenas Perl_sv_free_arenas
+#define sv_gets Perl_sv_gets
+#define sv_grow Perl_sv_grow
+#define sv_inc Perl_sv_inc
+#define sv_insert Perl_sv_insert
+#define sv_isa Perl_sv_isa
+#define sv_isobject Perl_sv_isobject
+#define sv_len Perl_sv_len
+#define sv_len_utf8 Perl_sv_len_utf8
+#define sv_magic Perl_sv_magic
+#define sv_mortalcopy Perl_sv_mortalcopy
+#define sv_newmortal Perl_sv_newmortal
+#define sv_newref Perl_sv_newref
+#define sv_peek Perl_sv_peek
+#define sv_pos_u2b Perl_sv_pos_u2b
+#define sv_pos_b2u Perl_sv_pos_b2u
+#define sv_pvn_force Perl_sv_pvn_force
+#define sv_pvutf8n_force Perl_sv_pvutf8n_force
+#define sv_pvbyten_force Perl_sv_pvbyten_force
+#define sv_reftype Perl_sv_reftype
+#define sv_replace Perl_sv_replace
+#define sv_report_used Perl_sv_report_used
+#define sv_reset Perl_sv_reset
+#define sv_setpvf Perl_sv_setpvf
+#define sv_vsetpvf Perl_sv_vsetpvf
+#define sv_setiv Perl_sv_setiv
+#define sv_setpviv Perl_sv_setpviv
+#define sv_setuv Perl_sv_setuv
+#define sv_setnv Perl_sv_setnv
+#define sv_setref_iv Perl_sv_setref_iv
+#define sv_setref_nv Perl_sv_setref_nv
+#define sv_setref_pv Perl_sv_setref_pv
+#define sv_setref_pvn Perl_sv_setref_pvn
+#define sv_setpv Perl_sv_setpv
+#define sv_setpvn Perl_sv_setpvn
+#define sv_setsv Perl_sv_setsv
+#define sv_taint Perl_sv_taint
+#define sv_tainted Perl_sv_tainted
+#define sv_unmagic Perl_sv_unmagic
+#define sv_unref Perl_sv_unref
+#define sv_untaint Perl_sv_untaint
+#define sv_upgrade Perl_sv_upgrade
+#define sv_usepvn Perl_sv_usepvn
+#define sv_vcatpvfn Perl_sv_vcatpvfn
+#define sv_vsetpvfn Perl_sv_vsetpvfn
+#define str_to_version Perl_str_to_version
+#define swash_init Perl_swash_init
+#define swash_fetch Perl_swash_fetch
+#define taint_env Perl_taint_env
+#define taint_proper Perl_taint_proper
+#define to_utf8_lower Perl_to_utf8_lower
+#define to_utf8_upper Perl_to_utf8_upper
+#define to_utf8_title Perl_to_utf8_title
+#if defined(UNLINK_ALL_VERSIONS)
+#define unlnk Perl_unlnk
+#endif
+#if defined(USE_THREADS)
+#define unlock_condpair Perl_unlock_condpair
+#endif
+#define unsharepvn Perl_unsharepvn
+#define unshare_hek Perl_unshare_hek
+#define utilize Perl_utilize
+#define utf16_to_utf8 Perl_utf16_to_utf8
+#define utf16_to_utf8_reversed Perl_utf16_to_utf8_reversed
+#define utf8_distance Perl_utf8_distance
+#define utf8_hop Perl_utf8_hop
+#define utf8_to_uv Perl_utf8_to_uv
+#define uv_to_utf8 Perl_uv_to_utf8
+#define vivify_defelem Perl_vivify_defelem
+#define vivify_ref Perl_vivify_ref
+#define wait4pid Perl_wait4pid
+#define report_closed_fh Perl_report_closed_fh
+#define report_uninit Perl_report_uninit
+#define warn Perl_warn
+#define vwarn Perl_vwarn
+#define warner Perl_warner
+#define vwarner Perl_vwarner
+#define watch Perl_watch
+#define whichsig Perl_whichsig
+#define yyerror Perl_yyerror
+#if defined(USE_PURE_BISON)
+#define yylex Perl_yylex
+#else
+#define yylex Perl_yylex
+#endif
+#define yyparse Perl_yyparse
+#define yywarn Perl_yywarn
+#if defined(MYMALLOC)
+#define dump_mstats Perl_dump_mstats
+#define get_mstats Perl_get_mstats
+#endif
+#define safesysmalloc Perl_safesysmalloc
+#define safesyscalloc Perl_safesyscalloc
+#define safesysrealloc Perl_safesysrealloc
+#define safesysfree Perl_safesysfree
+#if defined(LEAKTEST)
+#define safexmalloc Perl_safexmalloc
+#define safexcalloc Perl_safexcalloc
+#define safexrealloc Perl_safexrealloc
+#define safexfree Perl_safexfree
+#endif
+#if defined(PERL_GLOBAL_STRUCT)
+#define GetVars Perl_GetVars
+#endif
+#define runops_standard Perl_runops_standard
+#define runops_debug Perl_runops_debug
+#define sv_catpvf_mg Perl_sv_catpvf_mg
+#define sv_vcatpvf_mg Perl_sv_vcatpvf_mg
+#define sv_catpv_mg Perl_sv_catpv_mg
+#define sv_catpvn_mg Perl_sv_catpvn_mg
+#define sv_catsv_mg Perl_sv_catsv_mg
+#define sv_setpvf_mg Perl_sv_setpvf_mg
+#define sv_vsetpvf_mg Perl_sv_vsetpvf_mg
+#define sv_setiv_mg Perl_sv_setiv_mg
+#define sv_setpviv_mg Perl_sv_setpviv_mg
+#define sv_setuv_mg Perl_sv_setuv_mg
+#define sv_setnv_mg Perl_sv_setnv_mg
+#define sv_setpv_mg Perl_sv_setpv_mg
+#define sv_setpvn_mg Perl_sv_setpvn_mg
+#define sv_setsv_mg Perl_sv_setsv_mg
+#define sv_usepvn_mg Perl_sv_usepvn_mg
+#define get_vtbl Perl_get_vtbl
+#define pv_display Perl_pv_display
+#define dump_indent Perl_dump_indent
+#define dump_vindent Perl_dump_vindent
+#define do_gv_dump Perl_do_gv_dump
+#define do_gvgv_dump Perl_do_gvgv_dump
+#define do_hv_dump Perl_do_hv_dump
+#define do_magic_dump Perl_do_magic_dump
+#define do_op_dump Perl_do_op_dump
+#define do_pmop_dump Perl_do_pmop_dump
+#define do_sv_dump Perl_do_sv_dump
+#define magic_dump Perl_magic_dump
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define default_protect Perl_default_protect
+#define vdefault_protect Perl_vdefault_protect
+#endif
+#define reginitcolors Perl_reginitcolors
+#define sv_2pv_nolen Perl_sv_2pv_nolen
+#define sv_2pvutf8_nolen Perl_sv_2pvutf8_nolen
+#define sv_2pvbyte_nolen Perl_sv_2pvbyte_nolen
+#define sv_pv Perl_sv_pv
+#define sv_pvutf8 Perl_sv_pvutf8
+#define sv_pvbyte Perl_sv_pvbyte
+#define sv_utf8_upgrade Perl_sv_utf8_upgrade
+#define sv_utf8_downgrade Perl_sv_utf8_downgrade
+#define sv_utf8_encode Perl_sv_utf8_encode
+#define sv_utf8_decode Perl_sv_utf8_decode
+#define sv_force_normal Perl_sv_force_normal
+#define tmps_grow Perl_tmps_grow
+#define sv_rvweaken Perl_sv_rvweaken
+#define magic_killbackrefs Perl_magic_killbackrefs
+#define newANONATTRSUB Perl_newANONATTRSUB
+#define newATTRSUB Perl_newATTRSUB
+#define newMYSUB Perl_newMYSUB
+#define my_attrs Perl_my_attrs
+#define boot_core_xsutils Perl_boot_core_xsutils
+#if defined(USE_ITHREADS)
+#define cx_dup Perl_cx_dup
+#define si_dup Perl_si_dup
+#define ss_dup Perl_ss_dup
+#define any_dup Perl_any_dup
+#define he_dup Perl_he_dup
+#define re_dup Perl_re_dup
+#define fp_dup Perl_fp_dup
+#define dirp_dup Perl_dirp_dup
+#define gp_dup Perl_gp_dup
+#define mg_dup Perl_mg_dup
+#define sv_dup Perl_sv_dup
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_dup Perl_sys_intern_dup
+#endif
+#define ptr_table_new Perl_ptr_table_new
+#define ptr_table_fetch Perl_ptr_table_fetch
+#define ptr_table_store Perl_ptr_table_store
+#define ptr_table_split Perl_ptr_table_split
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#define avhv_index_sv S_avhv_index_sv
+#define avhv_index S_avhv_index
+#endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#define do_trans_CC_simple S_do_trans_CC_simple
+#define do_trans_CC_count S_do_trans_CC_count
+#define do_trans_CC_complex S_do_trans_CC_complex
+#define do_trans_UU_simple S_do_trans_UU_simple
+#define do_trans_UU_count S_do_trans_UU_count
+#define do_trans_UU_complex S_do_trans_UU_complex
+#define do_trans_UC_simple S_do_trans_UC_simple
+#define do_trans_CU_simple S_do_trans_CU_simple
+#define do_trans_UC_trivial S_do_trans_UC_trivial
+#define do_trans_CU_trivial S_do_trans_CU_trivial
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#define gv_init_sv S_gv_init_sv
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#define hsplit S_hsplit
+#define hfreeentries S_hfreeentries
+#define more_he S_more_he
+#define new_he S_new_he
+#define del_he S_del_he
+#define save_hek S_save_hek
+#define hv_magic_check S_hv_magic_check
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#define save_magic S_save_magic
+#define magic_methpack S_magic_methpack
+#define magic_methcall S_magic_methcall
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#define list_assignment S_list_assignment
+#define bad_type S_bad_type
+#define cop_free S_cop_free
+#define modkids S_modkids
+#define no_bareword_allowed S_no_bareword_allowed
+#define no_fh_allowed S_no_fh_allowed
+#define scalarboolean S_scalarboolean
+#define too_few_arguments S_too_few_arguments
+#define too_many_arguments S_too_many_arguments
+#define op_clear S_op_clear
+#define null S_null
+#define pad_addlex S_pad_addlex
+#define pad_findlex S_pad_findlex
+#define newDEFSVOP S_newDEFSVOP
+#define new_logop S_new_logop
+#define simplify_sort S_simplify_sort
+#define is_handle_constructor S_is_handle_constructor
+#define gv_ename S_gv_ename
+#define cv_dump S_cv_dump
+#define cv_clone2 S_cv_clone2
+#define scalar_mod_type S_scalar_mod_type
+#define my_kid S_my_kid
+#define dup_attrlist S_dup_attrlist
+#define apply_attrs S_apply_attrs
+# if defined(PL_OP_SLAB_ALLOC)
+#define Slab_Alloc S_Slab_Alloc
+# endif
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+#define find_beginning S_find_beginning
+#define forbid_setid S_forbid_setid
+#define incpush S_incpush
+#define init_interp S_init_interp
+#define init_ids S_init_ids
+#define init_lexer S_init_lexer
+#define init_main_stash S_init_main_stash
+#define init_perllib S_init_perllib
+#define init_postdump_symbols S_init_postdump_symbols
+#define init_predump_symbols S_init_predump_symbols
+#define my_exit_jump S_my_exit_jump
+#define nuke_stacks S_nuke_stacks
+#define open_script S_open_script
+#define usage S_usage
+#define validate_suid S_validate_suid
+# if defined(IAMSUID)
+#define fd_on_nosuid_fs S_fd_on_nosuid_fs
+# endif
+#define parse_body S_parse_body
+#define run_body S_run_body
+#define call_body S_call_body
+#define call_list_body S_call_list_body
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define vparse_body S_vparse_body
+#define vrun_body S_vrun_body
+#define vcall_body S_vcall_body
+#define vcall_list_body S_vcall_list_body
+#endif
+# if defined(USE_THREADS)
+#define init_main_thread S_init_main_thread
+# endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#define doencodes S_doencodes
+#define refto S_refto
+#define seed S_seed
+#define mul128 S_mul128
+#define is_an_int S_is_an_int
+#define div128 S_div128
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#define docatch S_docatch
+#define docatch_body S_docatch_body
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define vdocatch_body S_vdocatch_body
+#endif
+#define dofindlabel S_dofindlabel
+#define doparseform S_doparseform
+#define dopoptoeval S_dopoptoeval
+#define dopoptolabel S_dopoptolabel
+#define dopoptoloop S_dopoptoloop
+#define dopoptosub S_dopoptosub
+#define dopoptosub_at S_dopoptosub_at
+#define free_closures S_free_closures
+#define save_lines S_save_lines
+#define doeval S_doeval
+#define doopen_pmc S_doopen_pmc
+#define qsortsv S_qsortsv
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#define do_maybe_phash S_do_maybe_phash
+#define do_oddball S_do_oddball
+#define get_db_sub S_get_db_sub
+#define method_common S_method_common
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+#define doform S_doform
+#define emulate_eaccess S_emulate_eaccess
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#define dooneliner S_dooneliner
+# endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#define reg S_reg
+#define reganode S_reganode
+#define regatom S_regatom
+#define regbranch S_regbranch
+#define reguni S_reguni
+#define regclass S_regclass
+#define regclassutf8 S_regclassutf8
+#define regcurly S_regcurly
+#define reg_node S_reg_node
+#define regpiece S_regpiece
+#define reginsert S_reginsert
+#define regoptail S_regoptail
+#define regtail S_regtail
+#define regwhite S_regwhite
+#define nextchar S_nextchar
+#define dumpuntil S_dumpuntil
+#define put_byte S_put_byte
+#define scan_commit S_scan_commit
+#define cl_anything S_cl_anything
+#define cl_is_anything S_cl_is_anything
+#define cl_init S_cl_init
+#define cl_init_zero S_cl_init_zero
+#define cl_and S_cl_and
+#define cl_or S_cl_or
+#define study_chunk S_study_chunk
+#define add_data S_add_data
+#define re_croak2 S_re_croak2
+#define regpposixcc S_regpposixcc
+#define checkposixcc S_checkposixcc
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#define regmatch S_regmatch
+#define regrepeat S_regrepeat
+#define regrepeat_hard S_regrepeat_hard
+#define regtry S_regtry
+#define reginclass S_reginclass
+#define reginclassutf8 S_reginclassutf8
+#define regcppush S_regcppush
+#define regcppop S_regcppop
+#define regcp_set_to S_regcp_set_to
+#define cache_re S_cache_re
+#define reghop S_reghop
+#define reghopmaybe S_reghopmaybe
+#define find_byclass S_find_byclass
+#endif
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
+#define debprof S_debprof
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#define save_scalar_at S_save_scalar_at
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#define asIV S_asIV
+#define asUV S_asUV
+#define more_sv S_more_sv
+#define more_xiv S_more_xiv
+#define more_xnv S_more_xnv
+#define more_xpv S_more_xpv
+#define more_xpviv S_more_xpviv
+#define more_xpvnv S_more_xpvnv
+#define more_xpvcv S_more_xpvcv
+#define more_xpvav S_more_xpvav
+#define more_xpvhv S_more_xpvhv
+#define more_xpvmg S_more_xpvmg
+#define more_xpvlv S_more_xpvlv
+#define more_xpvbm S_more_xpvbm
+#define more_xrv S_more_xrv
+#define new_xiv S_new_xiv
+#define new_xnv S_new_xnv
+#define new_xpv S_new_xpv
+#define new_xpviv S_new_xpviv
+#define new_xpvnv S_new_xpvnv
+#define new_xpvcv S_new_xpvcv
+#define new_xpvav S_new_xpvav
+#define new_xpvhv S_new_xpvhv
+#define new_xpvmg S_new_xpvmg
+#define new_xpvlv S_new_xpvlv
+#define new_xpvbm S_new_xpvbm
+#define new_xrv S_new_xrv
+#define del_xiv S_del_xiv
+#define del_xnv S_del_xnv
+#define del_xpv S_del_xpv
+#define del_xpviv S_del_xpviv
+#define del_xpvnv S_del_xpvnv
+#define del_xpvcv S_del_xpvcv
+#define del_xpvav S_del_xpvav
+#define del_xpvhv S_del_xpvhv
+#define del_xpvmg S_del_xpvmg
+#define del_xpvlv S_del_xpvlv
+#define del_xpvbm S_del_xpvbm
+#define del_xrv S_del_xrv
+#define sv_unglob S_sv_unglob
+#define not_a_number S_not_a_number
+#define visit S_visit
+#define sv_add_backref S_sv_add_backref
+#define sv_del_backref S_sv_del_backref
+# if defined(DEBUGGING)
+#define del_sv S_del_sv
+# endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#define check_uni S_check_uni
+#define force_next S_force_next
+#define force_version S_force_version
+#define force_word S_force_word
+#define tokeq S_tokeq
+#define scan_const S_scan_const
+#define scan_formline S_scan_formline
+#define scan_heredoc S_scan_heredoc
+#define scan_ident S_scan_ident
+#define scan_inputsymbol S_scan_inputsymbol
+#define scan_pat S_scan_pat
+#define scan_str S_scan_str
+#define scan_subst S_scan_subst
+#define scan_trans S_scan_trans
+#define scan_word S_scan_word
+#define skipspace S_skipspace
+#define checkcomma S_checkcomma
+#define force_ident S_force_ident
+#define incline S_incline
+#define intuit_method S_intuit_method
+#define intuit_more S_intuit_more
+#define lop S_lop
+#define missingterm S_missingterm
+#define no_op S_no_op
+#define set_csh S_set_csh
+#define sublex_done S_sublex_done
+#define sublex_push S_sublex_push
+#define sublex_start S_sublex_start
+#define filter_gets S_filter_gets
+#define new_constant S_new_constant
+#define ao S_ao
+#define depcom S_depcom
+#define incl_perldb S_incl_perldb
+#if 0
+#define utf16_textfilter S_utf16_textfilter
+#define utf16rev_textfilter S_utf16rev_textfilter
+#endif
+# if defined(CRIPPLED_CC)
+#define uni S_uni
+# endif
+# if defined(PERL_CR_FILTER)
+#define cr_textfilter S_cr_textfilter
+# endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#define isa_lookup S_isa_lookup
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#define mess_alloc S_mess_alloc
+# if defined(LEAKTEST)
+#define xstat S_xstat
+# endif
+#endif
+#if defined(PERL_OBJECT)
+#endif
+#define ck_anoncode Perl_ck_anoncode
+#define ck_bitop Perl_ck_bitop
+#define ck_concat Perl_ck_concat
+#define ck_defined Perl_ck_defined
+#define ck_delete Perl_ck_delete
+#define ck_eof Perl_ck_eof
+#define ck_eval Perl_ck_eval
+#define ck_exec Perl_ck_exec
+#define ck_exists Perl_ck_exists
+#define ck_exit Perl_ck_exit
+#define ck_ftst Perl_ck_ftst
+#define ck_fun Perl_ck_fun
+#define ck_fun_locale Perl_ck_fun_locale
+#define ck_glob Perl_ck_glob
+#define ck_grep Perl_ck_grep
+#define ck_index Perl_ck_index
+#define ck_join Perl_ck_join
+#define ck_lengthconst Perl_ck_lengthconst
+#define ck_lfun Perl_ck_lfun
+#define ck_listiob Perl_ck_listiob
+#define ck_match Perl_ck_match
+#define ck_method Perl_ck_method
+#define ck_null Perl_ck_null
+#define ck_open Perl_ck_open
+#define ck_repeat Perl_ck_repeat
+#define ck_require Perl_ck_require
+#define ck_rfun Perl_ck_rfun
+#define ck_rvconst Perl_ck_rvconst
+#define ck_sassign Perl_ck_sassign
+#define ck_scmp Perl_ck_scmp
+#define ck_select Perl_ck_select
+#define ck_shift Perl_ck_shift
+#define ck_sort Perl_ck_sort
+#define ck_spair Perl_ck_spair
+#define ck_split Perl_ck_split
+#define ck_subr Perl_ck_subr
+#define ck_svconst Perl_ck_svconst
+#define ck_trunc Perl_ck_trunc
#define pp_aassign Perl_pp_aassign
#define pp_abs Perl_pp_abs
#define pp_accept Perl_pp_accept
@@ -497,7 +1202,6 @@
#define pp_const Perl_pp_const
#define pp_cos Perl_pp_cos
#define pp_crypt Perl_pp_crypt
-#define pp_cswitch Perl_pp_cswitch
#define pp_dbmclose Perl_pp_dbmclose
#define pp_dbmopen Perl_pp_dbmopen
#define pp_dbstate Perl_pp_dbstate
@@ -516,7 +1220,6 @@
#define pp_enteriter Perl_pp_enteriter
#define pp_enterloop Perl_pp_enterloop
#define pp_entersub Perl_pp_entersub
-#define pp_entersubr Perl_pp_entersubr
#define pp_entertry Perl_pp_entertry
#define pp_enterwrite Perl_pp_enterwrite
#define pp_eof Perl_pp_eof
@@ -524,7 +1227,6 @@
#define pp_epwent Perl_pp_epwent
#define pp_eq Perl_pp_eq
#define pp_eservent Perl_pp_eservent
-#define pp_evalonce Perl_pp_evalonce
#define pp_exec Perl_pp_exec
#define pp_exists Perl_pp_exists
#define pp_exit Perl_pp_exit
@@ -617,7 +1319,6 @@
#define pp_i_subtract Perl_pp_i_subtract
#define pp_index Perl_pp_index
#define pp_int Perl_pp_int
-#define pp_interp Perl_pp_interp
#define pp_ioctl Perl_pp_ioctl
#define pp_iter Perl_pp_iter
#define pp_join Perl_pp_join
@@ -631,6 +1332,7 @@
#define pp_leaveeval Perl_pp_leaveeval
#define pp_leaveloop Perl_pp_leaveloop
#define pp_leavesub Perl_pp_leavesub
+#define pp_leavesublv Perl_pp_leavesublv
#define pp_leavetry Perl_pp_leavetry
#define pp_leavewrite Perl_pp_leavewrite
#define pp_left_shift Perl_pp_left_shift
@@ -645,11 +1347,11 @@
#define pp_lslice Perl_pp_lslice
#define pp_lstat Perl_pp_lstat
#define pp_lt Perl_pp_lt
-#define pp_map Perl_pp_map
#define pp_mapstart Perl_pp_mapstart
#define pp_mapwhile Perl_pp_mapwhile
#define pp_match Perl_pp_match
#define pp_method Perl_pp_method
+#define pp_method_named Perl_pp_method_named
#define pp_mkdir Perl_pp_mkdir
#define pp_modulo Perl_pp_modulo
#define pp_msgctl Perl_pp_msgctl
@@ -663,7 +1365,6 @@
#define pp_next Perl_pp_next
#define pp_nextstate Perl_pp_nextstate
#define pp_not Perl_pp_not
-#define pp_nswitch Perl_pp_nswitch
#define pp_null Perl_pp_null
#define pp_oct Perl_pp_oct
#define pp_open Perl_pp_open
@@ -737,6 +1438,7 @@
#define pp_seq Perl_pp_seq
#define pp_setpgrp Perl_pp_setpgrp
#define pp_setpriority Perl_pp_setpriority
+#define pp_setstate Perl_pp_setstate
#define pp_sge Perl_pp_sge
#define pp_sgrent Perl_pp_sgrent
#define pp_sgt Perl_pp_sgt
@@ -808,284 +1510,4307 @@
#define pp_wantarray Perl_pp_wantarray
#define pp_warn Perl_pp_warn
#define pp_xor Perl_pp_xor
-#define ppaddr Perl_ppaddr
-#define pregcomp Perl_pregcomp
-#define pregexec Perl_pregexec
-#define pregfree Perl_pregfree
+
+#else /* PERL_IMPLICIT_CONTEXT */
+
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#if defined(USE_ITHREADS)
+# if defined(PERL_IMPLICIT_SYS)
+# endif
+#endif
+#if defined(MYMALLOC)
+#define malloced_size Perl_malloced_size
+#endif
+#define get_context Perl_get_context
+#define set_context Perl_set_context
+#if defined(PERL_OBJECT)
+#ifndef __BORLANDC__
+#endif
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#define amagic_call(a,b,c,d) Perl_amagic_call(aTHX_ a,b,c,d)
+#define Gv_AMupdate(a) Perl_Gv_AMupdate(aTHX_ a)
+#define append_elem(a,b,c) Perl_append_elem(aTHX_ a,b,c)
+#define append_list(a,b,c) Perl_append_list(aTHX_ a,b,c)
+#define apply(a,b,c) Perl_apply(aTHX_ a,b,c)
+#define avhv_delete_ent(a,b,c,d) Perl_avhv_delete_ent(aTHX_ a,b,c,d)
+#define avhv_exists_ent(a,b,c) Perl_avhv_exists_ent(aTHX_ a,b,c)
+#define avhv_fetch_ent(a,b,c,d) Perl_avhv_fetch_ent(aTHX_ a,b,c,d)
+#define avhv_store_ent(a,b,c,d) Perl_avhv_store_ent(aTHX_ a,b,c,d)
+#define avhv_iternext(a) Perl_avhv_iternext(aTHX_ a)
+#define avhv_iterval(a,b) Perl_avhv_iterval(aTHX_ a,b)
+#define avhv_keys(a) Perl_avhv_keys(aTHX_ a)
+#define av_clear(a) Perl_av_clear(aTHX_ a)
+#define av_delete(a,b,c) Perl_av_delete(aTHX_ a,b,c)
+#define av_exists(a,b) Perl_av_exists(aTHX_ a,b)
+#define av_extend(a,b) Perl_av_extend(aTHX_ a,b)
+#define av_fake(a,b) Perl_av_fake(aTHX_ a,b)
+#define av_fetch(a,b,c) Perl_av_fetch(aTHX_ a,b,c)
+#define av_fill(a,b) Perl_av_fill(aTHX_ a,b)
+#define av_len(a) Perl_av_len(aTHX_ a)
+#define av_make(a,b) Perl_av_make(aTHX_ a,b)
+#define av_pop(a) Perl_av_pop(aTHX_ a)
+#define av_push(a,b) Perl_av_push(aTHX_ a,b)
+#define av_reify(a) Perl_av_reify(aTHX_ a)
+#define av_shift(a) Perl_av_shift(aTHX_ a)
+#define av_store(a,b,c) Perl_av_store(aTHX_ a,b,c)
+#define av_undef(a) Perl_av_undef(aTHX_ a)
+#define av_unshift(a,b) Perl_av_unshift(aTHX_ a,b)
+#define bind_match(a,b,c) Perl_bind_match(aTHX_ a,b,c)
+#define block_end(a,b) Perl_block_end(aTHX_ a,b)
+#define block_gimme() Perl_block_gimme(aTHX)
+#define block_start(a) Perl_block_start(aTHX_ a)
+#define boot_core_UNIVERSAL() Perl_boot_core_UNIVERSAL(aTHX)
+#define call_list(a,b) Perl_call_list(aTHX_ a,b)
+#define cando(a,b,c) Perl_cando(aTHX_ a,b,c)
+#define cast_ulong(a) Perl_cast_ulong(aTHX_ a)
+#define cast_i32(a) Perl_cast_i32(aTHX_ a)
+#define cast_iv(a) Perl_cast_iv(aTHX_ a)
+#define cast_uv(a) Perl_cast_uv(aTHX_ a)
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#define my_chsize(a,b) Perl_my_chsize(aTHX_ a,b)
+#endif
+#if defined(USE_THREADS)
+#define condpair_magic(a) Perl_condpair_magic(aTHX_ a)
+#endif
+#define convert(a,b,c) Perl_convert(aTHX_ a,b,c)
+#define vcroak(a,b) Perl_vcroak(aTHX_ a,b)
+#if defined(PERL_IMPLICIT_CONTEXT)
+#endif
+#define cv_ckproto(a,b,c) Perl_cv_ckproto(aTHX_ a,b,c)
+#define cv_clone(a) Perl_cv_clone(aTHX_ a)
+#define cv_const_sv(a) Perl_cv_const_sv(aTHX_ a)
+#define op_const_sv(a,b) Perl_op_const_sv(aTHX_ a,b)
+#define cv_undef(a) Perl_cv_undef(aTHX_ a)
+#define cx_dump(a) Perl_cx_dump(aTHX_ a)
+#define filter_add(a,b) Perl_filter_add(aTHX_ a,b)
+#define filter_del(a) Perl_filter_del(aTHX_ a)
+#define filter_read(a,b,c) Perl_filter_read(aTHX_ a,b,c)
+#define get_op_descs() Perl_get_op_descs(aTHX)
+#define get_op_names() Perl_get_op_names(aTHX)
+#define get_no_modify() Perl_get_no_modify(aTHX)
+#define get_opargs() Perl_get_opargs(aTHX)
+#define get_ppaddr() Perl_get_ppaddr(aTHX)
+#define cxinc() Perl_cxinc(aTHX)
+#define vdeb(a,b) Perl_vdeb(aTHX_ a,b)
+#define debprofdump() Perl_debprofdump(aTHX)
+#define debop(a) Perl_debop(aTHX_ a)
+#define debstack() Perl_debstack(aTHX)
+#define debstackptrs() Perl_debstackptrs(aTHX)
+#define delimcpy(a,b,c,d,e,f) Perl_delimcpy(aTHX_ a,b,c,d,e,f)
+#define deprecate(a) Perl_deprecate(aTHX_ a)
+#define vdie(a,b) Perl_vdie(aTHX_ a,b)
+#define die_where(a,b) Perl_die_where(aTHX_ a,b)
+#define dounwind(a) Perl_dounwind(aTHX_ a)
+#define do_aexec(a,b,c) Perl_do_aexec(aTHX_ a,b,c)
+#define do_aexec5(a,b,c,d,e) Perl_do_aexec5(aTHX_ a,b,c,d,e)
+#define do_binmode(a,b,c) Perl_do_binmode(aTHX_ a,b,c)
+#define do_chop(a,b) Perl_do_chop(aTHX_ a,b)
+#define do_close(a,b) Perl_do_close(aTHX_ a,b)
+#define do_eof(a) Perl_do_eof(aTHX_ a)
+#define do_exec(a) Perl_do_exec(aTHX_ a)
+#if !defined(WIN32)
+#define do_exec3(a,b,c) Perl_do_exec3(aTHX_ a,b,c)
+#endif
+#define do_execfree() Perl_do_execfree(aTHX)
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#define do_ipcctl(a,b,c) Perl_do_ipcctl(aTHX_ a,b,c)
+#define do_ipcget(a,b,c) Perl_do_ipcget(aTHX_ a,b,c)
+#define do_msgrcv(a,b) Perl_do_msgrcv(aTHX_ a,b)
+#define do_msgsnd(a,b) Perl_do_msgsnd(aTHX_ a,b)
+#define do_semop(a,b) Perl_do_semop(aTHX_ a,b)
+#define do_shmio(a,b,c) Perl_do_shmio(aTHX_ a,b,c)
+#endif
+#define do_join(a,b,c,d) Perl_do_join(aTHX_ a,b,c,d)
+#define do_kv() Perl_do_kv(aTHX)
+#define do_open(a,b,c,d,e,f,g) Perl_do_open(aTHX_ a,b,c,d,e,f,g)
+#define do_open9(a,b,c,d,e,f,g,h,i) Perl_do_open9(aTHX_ a,b,c,d,e,f,g,h,i)
+#define do_pipe(a,b,c) Perl_do_pipe(aTHX_ a,b,c)
+#define do_print(a,b) Perl_do_print(aTHX_ a,b)
+#define do_readline() Perl_do_readline(aTHX)
+#define do_chomp(a) Perl_do_chomp(aTHX_ a)
+#define do_seek(a,b,c) Perl_do_seek(aTHX_ a,b,c)
+#define do_sprintf(a,b,c) Perl_do_sprintf(aTHX_ a,b,c)
+#define do_sysseek(a,b,c) Perl_do_sysseek(aTHX_ a,b,c)
+#define do_tell(a) Perl_do_tell(aTHX_ a)
+#define do_trans(a) Perl_do_trans(aTHX_ a)
+#define do_vecget(a,b,c) Perl_do_vecget(aTHX_ a,b,c)
+#define do_vecset(a) Perl_do_vecset(aTHX_ a)
+#define do_vop(a,b,c,d) Perl_do_vop(aTHX_ a,b,c,d)
+#define dofile(a) Perl_dofile(aTHX_ a)
+#define dowantarray() Perl_dowantarray(aTHX)
+#define dump_all() Perl_dump_all(aTHX)
+#define dump_eval() Perl_dump_eval(aTHX)
+#if defined(DUMP_FDS)
+#define dump_fds(a) Perl_dump_fds(aTHX_ a)
+#endif
+#define dump_form(a) Perl_dump_form(aTHX_ a)
+#define gv_dump(a) Perl_gv_dump(aTHX_ a)
+#define op_dump(a) Perl_op_dump(aTHX_ a)
+#define pmop_dump(a) Perl_pmop_dump(aTHX_ a)
+#define dump_packsubs(a) Perl_dump_packsubs(aTHX_ a)
+#define dump_sub(a) Perl_dump_sub(aTHX_ a)
+#define fbm_compile(a,b) Perl_fbm_compile(aTHX_ a,b)
+#define fbm_instr(a,b,c,d) Perl_fbm_instr(aTHX_ a,b,c,d)
+#define find_script(a,b,c,d) Perl_find_script(aTHX_ a,b,c,d)
+#if defined(USE_THREADS)
+#define find_threadsv(a) Perl_find_threadsv(aTHX_ a)
+#endif
+#define force_list(a) Perl_force_list(aTHX_ a)
+#define fold_constants(a) Perl_fold_constants(aTHX_ a)
+#define vform(a,b) Perl_vform(aTHX_ a,b)
+#define free_tmps() Perl_free_tmps(aTHX)
+#define gen_constant_list(a) Perl_gen_constant_list(aTHX_ a)
+#if !defined(HAS_GETENV_LEN)
+#define getenv_len(a,b) Perl_getenv_len(aTHX_ a,b)
+#endif
+#define gp_free(a) Perl_gp_free(aTHX_ a)
+#define gp_ref(a) Perl_gp_ref(aTHX_ a)
+#define gv_AVadd(a) Perl_gv_AVadd(aTHX_ a)
+#define gv_HVadd(a) Perl_gv_HVadd(aTHX_ a)
+#define gv_IOadd(a) Perl_gv_IOadd(aTHX_ a)
+#define gv_autoload4(a,b,c,d) Perl_gv_autoload4(aTHX_ a,b,c,d)
+#define gv_check(a) Perl_gv_check(aTHX_ a)
+#define gv_efullname(a,b) Perl_gv_efullname(aTHX_ a,b)
+#define gv_efullname3(a,b,c) Perl_gv_efullname3(aTHX_ a,b,c)
+#define gv_fetchfile(a) Perl_gv_fetchfile(aTHX_ a)
+#define gv_fetchmeth(a,b,c,d) Perl_gv_fetchmeth(aTHX_ a,b,c,d)
+#define gv_fetchmethod(a,b) Perl_gv_fetchmethod(aTHX_ a,b)
+#define gv_fetchmethod_autoload(a,b,c) Perl_gv_fetchmethod_autoload(aTHX_ a,b,c)
+#define gv_fetchpv(a,b,c) Perl_gv_fetchpv(aTHX_ a,b,c)
+#define gv_fullname(a,b) Perl_gv_fullname(aTHX_ a,b)
+#define gv_fullname3(a,b,c) Perl_gv_fullname3(aTHX_ a,b,c)
+#define gv_init(a,b,c,d,e) Perl_gv_init(aTHX_ a,b,c,d,e)
+#define gv_stashpv(a,b) Perl_gv_stashpv(aTHX_ a,b)
+#define gv_stashpvn(a,b,c) Perl_gv_stashpvn(aTHX_ a,b,c)
+#define gv_stashsv(a,b) Perl_gv_stashsv(aTHX_ a,b)
+#define hv_clear(a) Perl_hv_clear(aTHX_ a)
+#define hv_delayfree_ent(a,b) Perl_hv_delayfree_ent(aTHX_ a,b)
+#define hv_delete(a,b,c,d) Perl_hv_delete(aTHX_ a,b,c,d)
+#define hv_delete_ent(a,b,c,d) Perl_hv_delete_ent(aTHX_ a,b,c,d)
+#define hv_exists(a,b,c) Perl_hv_exists(aTHX_ a,b,c)
+#define hv_exists_ent(a,b,c) Perl_hv_exists_ent(aTHX_ a,b,c)
+#define hv_fetch(a,b,c,d) Perl_hv_fetch(aTHX_ a,b,c,d)
+#define hv_fetch_ent(a,b,c,d) Perl_hv_fetch_ent(aTHX_ a,b,c,d)
+#define hv_free_ent(a,b) Perl_hv_free_ent(aTHX_ a,b)
+#define hv_iterinit(a) Perl_hv_iterinit(aTHX_ a)
+#define hv_iterkey(a,b) Perl_hv_iterkey(aTHX_ a,b)
+#define hv_iterkeysv(a) Perl_hv_iterkeysv(aTHX_ a)
+#define hv_iternext(a) Perl_hv_iternext(aTHX_ a)
+#define hv_iternextsv(a,b,c) Perl_hv_iternextsv(aTHX_ a,b,c)
+#define hv_iterval(a,b) Perl_hv_iterval(aTHX_ a,b)
+#define hv_ksplit(a,b) Perl_hv_ksplit(aTHX_ a,b)
+#define hv_magic(a,b,c) Perl_hv_magic(aTHX_ a,b,c)
+#define hv_store(a,b,c,d,e) Perl_hv_store(aTHX_ a,b,c,d,e)
+#define hv_store_ent(a,b,c,d) Perl_hv_store_ent(aTHX_ a,b,c,d)
+#define hv_undef(a) Perl_hv_undef(aTHX_ a)
+#define ibcmp(a,b,c) Perl_ibcmp(aTHX_ a,b,c)
+#define ibcmp_locale(a,b,c) Perl_ibcmp_locale(aTHX_ a,b,c)
+#define ingroup(a,b) Perl_ingroup(aTHX_ a,b)
+#define init_debugger() Perl_init_debugger(aTHX)
+#define init_stacks() Perl_init_stacks(aTHX)
+#define intro_my() Perl_intro_my(aTHX)
+#define instr(a,b) Perl_instr(aTHX_ a,b)
+#define io_close(a,b) Perl_io_close(aTHX_ a,b)
+#define invert(a) Perl_invert(aTHX_ a)
+#define is_uni_alnum(a) Perl_is_uni_alnum(aTHX_ a)
+#define is_uni_alnumc(a) Perl_is_uni_alnumc(aTHX_ a)
+#define is_uni_idfirst(a) Perl_is_uni_idfirst(aTHX_ a)
+#define is_uni_alpha(a) Perl_is_uni_alpha(aTHX_ a)
+#define is_uni_ascii(a) Perl_is_uni_ascii(aTHX_ a)
+#define is_uni_space(a) Perl_is_uni_space(aTHX_ a)
+#define is_uni_cntrl(a) Perl_is_uni_cntrl(aTHX_ a)
+#define is_uni_graph(a) Perl_is_uni_graph(aTHX_ a)
+#define is_uni_digit(a) Perl_is_uni_digit(aTHX_ a)
+#define is_uni_upper(a) Perl_is_uni_upper(aTHX_ a)
+#define is_uni_lower(a) Perl_is_uni_lower(aTHX_ a)
+#define is_uni_print(a) Perl_is_uni_print(aTHX_ a)
+#define is_uni_punct(a) Perl_is_uni_punct(aTHX_ a)
+#define is_uni_xdigit(a) Perl_is_uni_xdigit(aTHX_ a)
+#define to_uni_upper(a) Perl_to_uni_upper(aTHX_ a)
+#define to_uni_title(a) Perl_to_uni_title(aTHX_ a)
+#define to_uni_lower(a) Perl_to_uni_lower(aTHX_ a)
+#define is_uni_alnum_lc(a) Perl_is_uni_alnum_lc(aTHX_ a)
+#define is_uni_alnumc_lc(a) Perl_is_uni_alnumc_lc(aTHX_ a)
+#define is_uni_idfirst_lc(a) Perl_is_uni_idfirst_lc(aTHX_ a)
+#define is_uni_alpha_lc(a) Perl_is_uni_alpha_lc(aTHX_ a)
+#define is_uni_ascii_lc(a) Perl_is_uni_ascii_lc(aTHX_ a)
+#define is_uni_space_lc(a) Perl_is_uni_space_lc(aTHX_ a)
+#define is_uni_cntrl_lc(a) Perl_is_uni_cntrl_lc(aTHX_ a)
+#define is_uni_graph_lc(a) Perl_is_uni_graph_lc(aTHX_ a)
+#define is_uni_digit_lc(a) Perl_is_uni_digit_lc(aTHX_ a)
+#define is_uni_upper_lc(a) Perl_is_uni_upper_lc(aTHX_ a)
+#define is_uni_lower_lc(a) Perl_is_uni_lower_lc(aTHX_ a)
+#define is_uni_print_lc(a) Perl_is_uni_print_lc(aTHX_ a)
+#define is_uni_punct_lc(a) Perl_is_uni_punct_lc(aTHX_ a)
+#define is_uni_xdigit_lc(a) Perl_is_uni_xdigit_lc(aTHX_ a)
+#define to_uni_upper_lc(a) Perl_to_uni_upper_lc(aTHX_ a)
+#define to_uni_title_lc(a) Perl_to_uni_title_lc(aTHX_ a)
+#define to_uni_lower_lc(a) Perl_to_uni_lower_lc(aTHX_ a)
+#define is_utf8_char(a) Perl_is_utf8_char(aTHX_ a)
+#define is_utf8_alnum(a) Perl_is_utf8_alnum(aTHX_ a)
+#define is_utf8_alnumc(a) Perl_is_utf8_alnumc(aTHX_ a)
+#define is_utf8_idfirst(a) Perl_is_utf8_idfirst(aTHX_ a)
+#define is_utf8_alpha(a) Perl_is_utf8_alpha(aTHX_ a)
+#define is_utf8_ascii(a) Perl_is_utf8_ascii(aTHX_ a)
+#define is_utf8_space(a) Perl_is_utf8_space(aTHX_ a)
+#define is_utf8_cntrl(a) Perl_is_utf8_cntrl(aTHX_ a)
+#define is_utf8_digit(a) Perl_is_utf8_digit(aTHX_ a)
+#define is_utf8_graph(a) Perl_is_utf8_graph(aTHX_ a)
+#define is_utf8_upper(a) Perl_is_utf8_upper(aTHX_ a)
+#define is_utf8_lower(a) Perl_is_utf8_lower(aTHX_ a)
+#define is_utf8_print(a) Perl_is_utf8_print(aTHX_ a)
+#define is_utf8_punct(a) Perl_is_utf8_punct(aTHX_ a)
+#define is_utf8_xdigit(a) Perl_is_utf8_xdigit(aTHX_ a)
+#define is_utf8_mark(a) Perl_is_utf8_mark(aTHX_ a)
+#define jmaybe(a) Perl_jmaybe(aTHX_ a)
+#define keyword(a,b) Perl_keyword(aTHX_ a,b)
+#define leave_scope(a) Perl_leave_scope(aTHX_ a)
+#define lex_end() Perl_lex_end(aTHX)
+#define lex_start(a) Perl_lex_start(aTHX_ a)
+#define linklist(a) Perl_linklist(aTHX_ a)
+#define list(a) Perl_list(aTHX_ a)
+#define listkids(a) Perl_listkids(aTHX_ a)
+#define vload_module(a,b,c,d) Perl_vload_module(aTHX_ a,b,c,d)
+#define localize(a,b) Perl_localize(aTHX_ a,b)
+#define looks_like_number(a) Perl_looks_like_number(aTHX_ a)
+#define magic_clearenv(a,b) Perl_magic_clearenv(aTHX_ a,b)
+#define magic_clear_all_env(a,b) Perl_magic_clear_all_env(aTHX_ a,b)
+#define magic_clearpack(a,b) Perl_magic_clearpack(aTHX_ a,b)
+#define magic_clearsig(a,b) Perl_magic_clearsig(aTHX_ a,b)
+#define magic_existspack(a,b) Perl_magic_existspack(aTHX_ a,b)
+#define magic_freeregexp(a,b) Perl_magic_freeregexp(aTHX_ a,b)
+#define magic_get(a,b) Perl_magic_get(aTHX_ a,b)
+#define magic_getarylen(a,b) Perl_magic_getarylen(aTHX_ a,b)
+#define magic_getdefelem(a,b) Perl_magic_getdefelem(aTHX_ a,b)
+#define magic_getglob(a,b) Perl_magic_getglob(aTHX_ a,b)
+#define magic_getnkeys(a,b) Perl_magic_getnkeys(aTHX_ a,b)
+#define magic_getpack(a,b) Perl_magic_getpack(aTHX_ a,b)
+#define magic_getpos(a,b) Perl_magic_getpos(aTHX_ a,b)
+#define magic_getsig(a,b) Perl_magic_getsig(aTHX_ a,b)
+#define magic_getsubstr(a,b) Perl_magic_getsubstr(aTHX_ a,b)
+#define magic_gettaint(a,b) Perl_magic_gettaint(aTHX_ a,b)
+#define magic_getuvar(a,b) Perl_magic_getuvar(aTHX_ a,b)
+#define magic_getvec(a,b) Perl_magic_getvec(aTHX_ a,b)
+#define magic_len(a,b) Perl_magic_len(aTHX_ a,b)
+#if defined(USE_THREADS)
+#define magic_mutexfree(a,b) Perl_magic_mutexfree(aTHX_ a,b)
+#endif
+#define magic_nextpack(a,b,c) Perl_magic_nextpack(aTHX_ a,b,c)
+#define magic_regdata_cnt(a,b) Perl_magic_regdata_cnt(aTHX_ a,b)
+#define magic_regdatum_get(a,b) Perl_magic_regdatum_get(aTHX_ a,b)
+#define magic_set(a,b) Perl_magic_set(aTHX_ a,b)
+#define magic_setamagic(a,b) Perl_magic_setamagic(aTHX_ a,b)
+#define magic_setarylen(a,b) Perl_magic_setarylen(aTHX_ a,b)
+#define magic_setbm(a,b) Perl_magic_setbm(aTHX_ a,b)
+#define magic_setdbline(a,b) Perl_magic_setdbline(aTHX_ a,b)
+#if defined(USE_LOCALE_COLLATE)
+#define magic_setcollxfrm(a,b) Perl_magic_setcollxfrm(aTHX_ a,b)
+#endif
+#define magic_setdefelem(a,b) Perl_magic_setdefelem(aTHX_ a,b)
+#define magic_setenv(a,b) Perl_magic_setenv(aTHX_ a,b)
+#define magic_setfm(a,b) Perl_magic_setfm(aTHX_ a,b)
+#define magic_setisa(a,b) Perl_magic_setisa(aTHX_ a,b)
+#define magic_setglob(a,b) Perl_magic_setglob(aTHX_ a,b)
+#define magic_setmglob(a,b) Perl_magic_setmglob(aTHX_ a,b)
+#define magic_setnkeys(a,b) Perl_magic_setnkeys(aTHX_ a,b)
+#define magic_setpack(a,b) Perl_magic_setpack(aTHX_ a,b)
+#define magic_setpos(a,b) Perl_magic_setpos(aTHX_ a,b)
+#define magic_setsig(a,b) Perl_magic_setsig(aTHX_ a,b)
+#define magic_setsubstr(a,b) Perl_magic_setsubstr(aTHX_ a,b)
+#define magic_settaint(a,b) Perl_magic_settaint(aTHX_ a,b)
+#define magic_setuvar(a,b) Perl_magic_setuvar(aTHX_ a,b)
+#define magic_setvec(a,b) Perl_magic_setvec(aTHX_ a,b)
+#define magic_set_all_env(a,b) Perl_magic_set_all_env(aTHX_ a,b)
+#define magic_sizepack(a,b) Perl_magic_sizepack(aTHX_ a,b)
+#define magic_wipepack(a,b) Perl_magic_wipepack(aTHX_ a,b)
+#define magicname(a,b,c) Perl_magicname(aTHX_ a,b,c)
+#define markstack_grow() Perl_markstack_grow(aTHX)
+#if defined(USE_LOCALE_COLLATE)
+#define mem_collxfrm(a,b,c) Perl_mem_collxfrm(aTHX_ a,b,c)
+#endif
+#define vmess(a,b) Perl_vmess(aTHX_ a,b)
+#define qerror(a) Perl_qerror(aTHX_ a)
+#define mg_clear(a) Perl_mg_clear(aTHX_ a)
+#define mg_copy(a,b,c,d) Perl_mg_copy(aTHX_ a,b,c,d)
+#define mg_find(a,b) Perl_mg_find(aTHX_ a,b)
+#define mg_free(a) Perl_mg_free(aTHX_ a)
+#define mg_get(a) Perl_mg_get(aTHX_ a)
+#define mg_length(a) Perl_mg_length(aTHX_ a)
+#define mg_magical(a) Perl_mg_magical(aTHX_ a)
+#define mg_set(a) Perl_mg_set(aTHX_ a)
+#define mg_size(a) Perl_mg_size(aTHX_ a)
+#define mod(a,b) Perl_mod(aTHX_ a,b)
+#define mode_from_discipline(a) Perl_mode_from_discipline(aTHX_ a)
+#define moreswitches(a) Perl_moreswitches(aTHX_ a)
+#define my(a) Perl_my(aTHX_ a)
+#define my_atof(a) Perl_my_atof(aTHX_ a)
+#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
+#define my_bcopy Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+#define my_bzero Perl_my_bzero
+#endif
+#define my_exit(a) Perl_my_exit(aTHX_ a)
+#define my_failure_exit() Perl_my_failure_exit(aTHX)
+#define my_fflush_all() Perl_my_fflush_all(aTHX)
+#define my_lstat() Perl_my_lstat(aTHX)
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+#define my_memcmp Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
+#define my_memset Perl_my_memset
+#endif
+#if !defined(PERL_OBJECT)
+#define my_pclose(a) Perl_my_pclose(aTHX_ a)
+#define my_popen(a,b) Perl_my_popen(aTHX_ a,b)
+#endif
+#define my_setenv(a,b) Perl_my_setenv(aTHX_ a,b)
+#define my_stat() Perl_my_stat(aTHX)
+#if defined(MYSWAP)
+#define my_swap(a) Perl_my_swap(aTHX_ a)
+#define my_htonl(a) Perl_my_htonl(aTHX_ a)
+#define my_ntohl(a) Perl_my_ntohl(aTHX_ a)
+#endif
+#define my_unexec() Perl_my_unexec(aTHX)
+#define newANONLIST(a) Perl_newANONLIST(aTHX_ a)
+#define newANONHASH(a) Perl_newANONHASH(aTHX_ a)
+#define newANONSUB(a,b,c) Perl_newANONSUB(aTHX_ a,b,c)
+#define newASSIGNOP(a,b,c,d) Perl_newASSIGNOP(aTHX_ a,b,c,d)
+#define newCONDOP(a,b,c,d) Perl_newCONDOP(aTHX_ a,b,c,d)
+#define newCONSTSUB(a,b,c) Perl_newCONSTSUB(aTHX_ a,b,c)
+#define newFORM(a,b,c) Perl_newFORM(aTHX_ a,b,c)
+#define newFOROP(a,b,c,d,e,f,g) Perl_newFOROP(aTHX_ a,b,c,d,e,f,g)
+#define newLOGOP(a,b,c,d) Perl_newLOGOP(aTHX_ a,b,c,d)
+#define newLOOPEX(a,b) Perl_newLOOPEX(aTHX_ a,b)
+#define newLOOPOP(a,b,c,d) Perl_newLOOPOP(aTHX_ a,b,c,d)
+#define newNULLLIST() Perl_newNULLLIST(aTHX)
+#define newOP(a,b) Perl_newOP(aTHX_ a,b)
+#define newPROG(a) Perl_newPROG(aTHX_ a)
+#define newRANGE(a,b,c) Perl_newRANGE(aTHX_ a,b,c)
+#define newSLICEOP(a,b,c) Perl_newSLICEOP(aTHX_ a,b,c)
+#define newSTATEOP(a,b,c) Perl_newSTATEOP(aTHX_ a,b,c)
+#define newSUB(a,b,c,d) Perl_newSUB(aTHX_ a,b,c,d)
+#define newXS(a,b,c) Perl_newXS(aTHX_ a,b,c)
+#define newAV() Perl_newAV(aTHX)
+#define newAVREF(a) Perl_newAVREF(aTHX_ a)
+#define newBINOP(a,b,c,d) Perl_newBINOP(aTHX_ a,b,c,d)
+#define newCVREF(a,b) Perl_newCVREF(aTHX_ a,b)
+#define newGVOP(a,b,c) Perl_newGVOP(aTHX_ a,b,c)
+#define newGVgen(a) Perl_newGVgen(aTHX_ a)
+#define newGVREF(a,b) Perl_newGVREF(aTHX_ a,b)
+#define newHVREF(a) Perl_newHVREF(aTHX_ a)
+#define newHV() Perl_newHV(aTHX)
+#define newHVhv(a) Perl_newHVhv(aTHX_ a)
+#define newIO() Perl_newIO(aTHX)
+#define newLISTOP(a,b,c,d) Perl_newLISTOP(aTHX_ a,b,c,d)
+#define newPADOP(a,b,c) Perl_newPADOP(aTHX_ a,b,c)
+#define newPMOP(a,b) Perl_newPMOP(aTHX_ a,b)
+#define newPVOP(a,b,c) Perl_newPVOP(aTHX_ a,b,c)
+#define newRV(a) Perl_newRV(aTHX_ a)
+#define newRV_noinc(a) Perl_newRV_noinc(aTHX_ a)
+#define newSV(a) Perl_newSV(aTHX_ a)
+#define newSVREF(a) Perl_newSVREF(aTHX_ a)
+#define newSVOP(a,b,c) Perl_newSVOP(aTHX_ a,b,c)
+#define newSViv(a) Perl_newSViv(aTHX_ a)
+#define newSVuv(a) Perl_newSVuv(aTHX_ a)
+#define newSVnv(a) Perl_newSVnv(aTHX_ a)
+#define newSVpv(a,b) Perl_newSVpv(aTHX_ a,b)
+#define newSVpvn(a,b) Perl_newSVpvn(aTHX_ a,b)
+#define vnewSVpvf(a,b) Perl_vnewSVpvf(aTHX_ a,b)
+#define newSVrv(a,b) Perl_newSVrv(aTHX_ a,b)
+#define newSVsv(a) Perl_newSVsv(aTHX_ a)
+#define newUNOP(a,b,c) Perl_newUNOP(aTHX_ a,b,c)
+#define newWHILEOP(a,b,c,d,e,f,g) Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g)
+#define new_stackinfo(a,b) Perl_new_stackinfo(aTHX_ a,b)
+#define nextargv(a) Perl_nextargv(aTHX_ a)
+#define ninstr(a,b,c,d) Perl_ninstr(aTHX_ a,b,c,d)
+#define oopsCV(a) Perl_oopsCV(aTHX_ a)
+#define op_free(a) Perl_op_free(aTHX_ a)
+#define package(a) Perl_package(aTHX_ a)
+#define pad_alloc(a,b) Perl_pad_alloc(aTHX_ a,b)
+#define pad_allocmy(a) Perl_pad_allocmy(aTHX_ a)
+#define pad_findmy(a) Perl_pad_findmy(aTHX_ a)
+#define oopsAV(a) Perl_oopsAV(aTHX_ a)
+#define oopsHV(a) Perl_oopsHV(aTHX_ a)
+#define pad_leavemy(a) Perl_pad_leavemy(aTHX_ a)
+#define pad_sv(a) Perl_pad_sv(aTHX_ a)
+#define pad_free(a) Perl_pad_free(aTHX_ a)
+#define pad_reset() Perl_pad_reset(aTHX)
+#define pad_swipe(a) Perl_pad_swipe(aTHX_ a)
+#define peep(a) Perl_peep(aTHX_ a)
+#if defined(PERL_OBJECT)
+#endif
+#if defined(USE_THREADS)
+#define new_struct_thread(a) Perl_new_struct_thread(aTHX_ a)
+#endif
+#define call_atexit(a,b) Perl_call_atexit(aTHX_ a,b)
+#define call_argv(a,b,c) Perl_call_argv(aTHX_ a,b,c)
+#define call_method(a,b) Perl_call_method(aTHX_ a,b)
+#define call_pv(a,b) Perl_call_pv(aTHX_ a,b)
+#define call_sv(a,b) Perl_call_sv(aTHX_ a,b)
+#define eval_pv(a,b) Perl_eval_pv(aTHX_ a,b)
+#define eval_sv(a,b) Perl_eval_sv(aTHX_ a,b)
+#define get_sv(a,b) Perl_get_sv(aTHX_ a,b)
+#define get_av(a,b) Perl_get_av(aTHX_ a,b)
+#define get_hv(a,b) Perl_get_hv(aTHX_ a,b)
+#define get_cv(a,b) Perl_get_cv(aTHX_ a,b)
+#define init_i18nl10n(a) Perl_init_i18nl10n(aTHX_ a)
+#define init_i18nl14n(a) Perl_init_i18nl14n(aTHX_ a)
+#define new_collate(a) Perl_new_collate(aTHX_ a)
+#define new_ctype(a) Perl_new_ctype(aTHX_ a)
+#define new_numeric(a) Perl_new_numeric(aTHX_ a)
+#define set_numeric_local() Perl_set_numeric_local(aTHX)
+#define set_numeric_radix() Perl_set_numeric_radix(aTHX)
+#define set_numeric_standard() Perl_set_numeric_standard(aTHX)
+#define require_pv(a) Perl_require_pv(aTHX_ a)
+#define pidgone(a,b) Perl_pidgone(aTHX_ a,b)
+#define pmflag(a,b) Perl_pmflag(aTHX_ a,b)
+#define pmruntime(a,b,c) Perl_pmruntime(aTHX_ a,b,c)
+#define pmtrans(a,b,c) Perl_pmtrans(aTHX_ a,b,c)
+#define pop_return() Perl_pop_return(aTHX)
+#define pop_scope() Perl_pop_scope(aTHX)
+#define prepend_elem(a,b,c) Perl_prepend_elem(aTHX_ a,b,c)
+#define push_return(a) Perl_push_return(aTHX_ a)
+#define push_scope() Perl_push_scope(aTHX)
+#define ref(a,b) Perl_ref(aTHX_ a,b)
+#define refkids(a,b) Perl_refkids(aTHX_ a,b)
+#define regdump(a) Perl_regdump(aTHX_ a)
+#define pregexec(a,b,c,d,e,f,g) Perl_pregexec(aTHX_ a,b,c,d,e,f,g)
+#define pregfree(a) Perl_pregfree(aTHX_ a)
+#define pregcomp(a,b,c) Perl_pregcomp(aTHX_ a,b,c)
+#define re_intuit_start(a,b,c,d,e,f) Perl_re_intuit_start(aTHX_ a,b,c,d,e,f)
+#define re_intuit_string(a) Perl_re_intuit_string(aTHX_ a)
+#define regexec_flags(a,b,c,d,e,f,g,h) Perl_regexec_flags(aTHX_ a,b,c,d,e,f,g,h)
+#define regnext(a) Perl_regnext(aTHX_ a)
+#define regprop(a,b) Perl_regprop(aTHX_ a,b)
+#define repeatcpy(a,b,c,d) Perl_repeatcpy(aTHX_ a,b,c,d)
+#define rninstr(a,b,c,d) Perl_rninstr(aTHX_ a,b,c,d)
+#define rsignal(a,b) Perl_rsignal(aTHX_ a,b)
+#define rsignal_restore(a,b) Perl_rsignal_restore(aTHX_ a,b)
+#define rsignal_save(a,b,c) Perl_rsignal_save(aTHX_ a,b,c)
+#define rsignal_state(a) Perl_rsignal_state(aTHX_ a)
+#define rxres_free(a) Perl_rxres_free(aTHX_ a)
+#define rxres_restore(a,b) Perl_rxres_restore(aTHX_ a,b)
+#define rxres_save(a,b) Perl_rxres_save(aTHX_ a,b)
+#if !defined(HAS_RENAME)
+#define same_dirent(a,b) Perl_same_dirent(aTHX_ a,b)
+#endif
+#define savepv(a) Perl_savepv(aTHX_ a)
+#define savepvn(a,b) Perl_savepvn(aTHX_ a,b)
+#define savestack_grow() Perl_savestack_grow(aTHX)
+#define save_aelem(a,b,c) Perl_save_aelem(aTHX_ a,b,c)
+#define save_alloc(a,b) Perl_save_alloc(aTHX_ a,b)
+#define save_aptr(a) Perl_save_aptr(aTHX_ a)
+#define save_ary(a) Perl_save_ary(aTHX_ a)
+#define save_clearsv(a) Perl_save_clearsv(aTHX_ a)
+#define save_delete(a,b,c) Perl_save_delete(aTHX_ a,b,c)
+#define save_destructor(a,b) Perl_save_destructor(aTHX_ a,b)
+#define save_destructor_x(a,b) Perl_save_destructor_x(aTHX_ a,b)
+#define save_freesv(a) Perl_save_freesv(aTHX_ a)
+#define save_freeop(a) Perl_save_freeop(aTHX_ a)
+#define save_freepv(a) Perl_save_freepv(aTHX_ a)
+#define save_generic_svref(a) Perl_save_generic_svref(aTHX_ a)
+#define save_gp(a,b) Perl_save_gp(aTHX_ a,b)
+#define save_hash(a) Perl_save_hash(aTHX_ a)
+#define save_helem(a,b,c) Perl_save_helem(aTHX_ a,b,c)
+#define save_hints() Perl_save_hints(aTHX)
+#define save_hptr(a) Perl_save_hptr(aTHX_ a)
+#define save_I16(a) Perl_save_I16(aTHX_ a)
+#define save_I32(a) Perl_save_I32(aTHX_ a)
+#define save_I8(a) Perl_save_I8(aTHX_ a)
+#define save_int(a) Perl_save_int(aTHX_ a)
+#define save_item(a) Perl_save_item(aTHX_ a)
+#define save_iv(a) Perl_save_iv(aTHX_ a)
+#define save_list(a,b) Perl_save_list(aTHX_ a,b)
+#define save_long(a) Perl_save_long(aTHX_ a)
+#define save_nogv(a) Perl_save_nogv(aTHX_ a)
+#define save_op() Perl_save_op(aTHX)
+#define save_scalar(a) Perl_save_scalar(aTHX_ a)
+#define save_pptr(a) Perl_save_pptr(aTHX_ a)
+#define save_vptr(a) Perl_save_vptr(aTHX_ a)
+#define save_re_context() Perl_save_re_context(aTHX)
+#define save_sptr(a) Perl_save_sptr(aTHX_ a)
+#define save_svref(a) Perl_save_svref(aTHX_ a)
+#define save_threadsv(a) Perl_save_threadsv(aTHX_ a)
+#define sawparens(a) Perl_sawparens(aTHX_ a)
+#define scalar(a) Perl_scalar(aTHX_ a)
+#define scalarkids(a) Perl_scalarkids(aTHX_ a)
+#define scalarseq(a) Perl_scalarseq(aTHX_ a)
+#define scalarvoid(a) Perl_scalarvoid(aTHX_ a)
+#define scan_bin(a,b,c) Perl_scan_bin(aTHX_ a,b,c)
+#define scan_hex(a,b,c) Perl_scan_hex(aTHX_ a,b,c)
+#define scan_num(a) Perl_scan_num(aTHX_ a)
+#define scan_oct(a,b,c) Perl_scan_oct(aTHX_ a,b,c)
+#define scope(a) Perl_scope(aTHX_ a)
+#define screaminstr(a,b,c,d,e,f) Perl_screaminstr(aTHX_ a,b,c,d,e,f)
+#if !defined(VMS)
+#define setenv_getix(a) Perl_setenv_getix(aTHX_ a)
+#endif
+#define setdefout(a) Perl_setdefout(aTHX_ a)
+#define sharepvn(a,b,c) Perl_sharepvn(aTHX_ a,b,c)
+#define share_hek(a,b,c) Perl_share_hek(aTHX_ a,b,c)
+#define sighandler Perl_sighandler
+#define stack_grow(a,b,c) Perl_stack_grow(aTHX_ a,b,c)
+#define start_subparse(a,b) Perl_start_subparse(aTHX_ a,b)
+#define sub_crush_depth(a) Perl_sub_crush_depth(aTHX_ a)
+#define sv_2bool(a) Perl_sv_2bool(aTHX_ a)
+#define sv_2cv(a,b,c,d) Perl_sv_2cv(aTHX_ a,b,c,d)
+#define sv_2io(a) Perl_sv_2io(aTHX_ a)
+#define sv_2iv(a) Perl_sv_2iv(aTHX_ a)
+#define sv_2mortal(a) Perl_sv_2mortal(aTHX_ a)
+#define sv_2nv(a) Perl_sv_2nv(aTHX_ a)
+#define sv_2pv(a,b) Perl_sv_2pv(aTHX_ a,b)
+#define sv_2pvutf8(a,b) Perl_sv_2pvutf8(aTHX_ a,b)
+#define sv_2pvbyte(a,b) Perl_sv_2pvbyte(aTHX_ a,b)
+#define sv_2uv(a) Perl_sv_2uv(aTHX_ a)
+#define sv_iv(a) Perl_sv_iv(aTHX_ a)
+#define sv_uv(a) Perl_sv_uv(aTHX_ a)
+#define sv_nv(a) Perl_sv_nv(aTHX_ a)
+#define sv_pvn(a,b) Perl_sv_pvn(aTHX_ a,b)
+#define sv_pvutf8n(a,b) Perl_sv_pvutf8n(aTHX_ a,b)
+#define sv_pvbyten(a,b) Perl_sv_pvbyten(aTHX_ a,b)
+#define sv_true(a) Perl_sv_true(aTHX_ a)
+#define sv_add_arena(a,b,c) Perl_sv_add_arena(aTHX_ a,b,c)
+#define sv_backoff(a) Perl_sv_backoff(aTHX_ a)
+#define sv_bless(a,b) Perl_sv_bless(aTHX_ a,b)
+#define sv_vcatpvf(a,b,c) Perl_sv_vcatpvf(aTHX_ a,b,c)
+#define sv_catpv(a,b) Perl_sv_catpv(aTHX_ a,b)
+#define sv_catpvn(a,b,c) Perl_sv_catpvn(aTHX_ a,b,c)
+#define sv_catsv(a,b) Perl_sv_catsv(aTHX_ a,b)
+#define sv_chop(a,b) Perl_sv_chop(aTHX_ a,b)
+#define sv_clean_all() Perl_sv_clean_all(aTHX)
+#define sv_clean_objs() Perl_sv_clean_objs(aTHX)
+#define sv_clear(a) Perl_sv_clear(aTHX_ a)
+#define sv_cmp(a,b) Perl_sv_cmp(aTHX_ a,b)
+#define sv_cmp_locale(a,b) Perl_sv_cmp_locale(aTHX_ a,b)
+#if defined(USE_LOCALE_COLLATE)
+#define sv_collxfrm(a,b) Perl_sv_collxfrm(aTHX_ a,b)
+#endif
+#define sv_compile_2op(a,b,c,d) Perl_sv_compile_2op(aTHX_ a,b,c,d)
+#define sv_dec(a) Perl_sv_dec(aTHX_ a)
+#define sv_dump(a) Perl_sv_dump(aTHX_ a)
+#define sv_derived_from(a,b) Perl_sv_derived_from(aTHX_ a,b)
+#define sv_eq(a,b) Perl_sv_eq(aTHX_ a,b)
+#define sv_free(a) Perl_sv_free(aTHX_ a)
+#define sv_free_arenas() Perl_sv_free_arenas(aTHX)
+#define sv_gets(a,b,c) Perl_sv_gets(aTHX_ a,b,c)
+#define sv_grow(a,b) Perl_sv_grow(aTHX_ a,b)
+#define sv_inc(a) Perl_sv_inc(aTHX_ a)
+#define sv_insert(a,b,c,d,e) Perl_sv_insert(aTHX_ a,b,c,d,e)
+#define sv_isa(a,b) Perl_sv_isa(aTHX_ a,b)
+#define sv_isobject(a) Perl_sv_isobject(aTHX_ a)
+#define sv_len(a) Perl_sv_len(aTHX_ a)
+#define sv_len_utf8(a) Perl_sv_len_utf8(aTHX_ a)
+#define sv_magic(a,b,c,d,e) Perl_sv_magic(aTHX_ a,b,c,d,e)
+#define sv_mortalcopy(a) Perl_sv_mortalcopy(aTHX_ a)
+#define sv_newmortal() Perl_sv_newmortal(aTHX)
+#define sv_newref(a) Perl_sv_newref(aTHX_ a)
+#define sv_peek(a) Perl_sv_peek(aTHX_ a)
+#define sv_pos_u2b(a,b,c) Perl_sv_pos_u2b(aTHX_ a,b,c)
+#define sv_pos_b2u(a,b) Perl_sv_pos_b2u(aTHX_ a,b)
+#define sv_pvn_force(a,b) Perl_sv_pvn_force(aTHX_ a,b)
+#define sv_pvutf8n_force(a,b) Perl_sv_pvutf8n_force(aTHX_ a,b)
+#define sv_pvbyten_force(a,b) Perl_sv_pvbyten_force(aTHX_ a,b)
+#define sv_reftype(a,b) Perl_sv_reftype(aTHX_ a,b)
+#define sv_replace(a,b) Perl_sv_replace(aTHX_ a,b)
+#define sv_report_used() Perl_sv_report_used(aTHX)
+#define sv_reset(a,b) Perl_sv_reset(aTHX_ a,b)
+#define sv_vsetpvf(a,b,c) Perl_sv_vsetpvf(aTHX_ a,b,c)
+#define sv_setiv(a,b) Perl_sv_setiv(aTHX_ a,b)
+#define sv_setpviv(a,b) Perl_sv_setpviv(aTHX_ a,b)
+#define sv_setuv(a,b) Perl_sv_setuv(aTHX_ a,b)
+#define sv_setnv(a,b) Perl_sv_setnv(aTHX_ a,b)
+#define sv_setref_iv(a,b,c) Perl_sv_setref_iv(aTHX_ a,b,c)
+#define sv_setref_nv(a,b,c) Perl_sv_setref_nv(aTHX_ a,b,c)
+#define sv_setref_pv(a,b,c) Perl_sv_setref_pv(aTHX_ a,b,c)
+#define sv_setref_pvn(a,b,c,d) Perl_sv_setref_pvn(aTHX_ a,b,c,d)
+#define sv_setpv(a,b) Perl_sv_setpv(aTHX_ a,b)
+#define sv_setpvn(a,b,c) Perl_sv_setpvn(aTHX_ a,b,c)
+#define sv_setsv(a,b) Perl_sv_setsv(aTHX_ a,b)
+#define sv_taint(a) Perl_sv_taint(aTHX_ a)
+#define sv_tainted(a) Perl_sv_tainted(aTHX_ a)
+#define sv_unmagic(a,b) Perl_sv_unmagic(aTHX_ a,b)
+#define sv_unref(a) Perl_sv_unref(aTHX_ a)
+#define sv_untaint(a) Perl_sv_untaint(aTHX_ a)
+#define sv_upgrade(a,b) Perl_sv_upgrade(aTHX_ a,b)
+#define sv_usepvn(a,b,c) Perl_sv_usepvn(aTHX_ a,b,c)
+#define sv_vcatpvfn(a,b,c,d,e,f,g) Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g)
+#define sv_vsetpvfn(a,b,c,d,e,f,g) Perl_sv_vsetpvfn(aTHX_ a,b,c,d,e,f,g)
+#define str_to_version(a) Perl_str_to_version(aTHX_ a)
+#define swash_init(a,b,c,d,e) Perl_swash_init(aTHX_ a,b,c,d,e)
+#define swash_fetch(a,b) Perl_swash_fetch(aTHX_ a,b)
+#define taint_env() Perl_taint_env(aTHX)
+#define taint_proper(a,b) Perl_taint_proper(aTHX_ a,b)
+#define to_utf8_lower(a) Perl_to_utf8_lower(aTHX_ a)
+#define to_utf8_upper(a) Perl_to_utf8_upper(aTHX_ a)
+#define to_utf8_title(a) Perl_to_utf8_title(aTHX_ a)
+#if defined(UNLINK_ALL_VERSIONS)
+#define unlnk(a) Perl_unlnk(aTHX_ a)
+#endif
+#if defined(USE_THREADS)
+#define unlock_condpair(a) Perl_unlock_condpair(aTHX_ a)
+#endif
+#define unsharepvn(a,b,c) Perl_unsharepvn(aTHX_ a,b,c)
+#define unshare_hek(a) Perl_unshare_hek(aTHX_ a)
+#define utilize(a,b,c,d,e) Perl_utilize(aTHX_ a,b,c,d,e)
+#define utf16_to_utf8(a,b,c) Perl_utf16_to_utf8(aTHX_ a,b,c)
+#define utf16_to_utf8_reversed(a,b,c) Perl_utf16_to_utf8_reversed(aTHX_ a,b,c)
+#define utf8_distance(a,b) Perl_utf8_distance(aTHX_ a,b)
+#define utf8_hop(a,b) Perl_utf8_hop(aTHX_ a,b)
+#define utf8_to_uv(a,b) Perl_utf8_to_uv(aTHX_ a,b)
+#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 wait4pid(a,b,c) Perl_wait4pid(aTHX_ a,b,c)
+#define report_closed_fh(a,b,c,d) Perl_report_closed_fh(aTHX_ a,b,c,d)
+#define report_uninit() Perl_report_uninit(aTHX)
+#define vwarn(a,b) Perl_vwarn(aTHX_ a,b)
+#define vwarner(a,b,c) Perl_vwarner(aTHX_ a,b,c)
+#define watch(a) Perl_watch(aTHX_ a)
+#define whichsig(a) Perl_whichsig(aTHX_ a)
+#define yyerror(a) Perl_yyerror(aTHX_ a)
+#if defined(USE_PURE_BISON)
+#define yylex(a,b) Perl_yylex(aTHX_ a,b)
+#else
+#define yylex() Perl_yylex(aTHX)
+#endif
+#define yyparse() Perl_yyparse(aTHX)
+#define yywarn(a) Perl_yywarn(aTHX_ a)
+#if defined(MYMALLOC)
+#define dump_mstats(a) Perl_dump_mstats(aTHX_ a)
+#define get_mstats(a,b,c) Perl_get_mstats(aTHX_ a,b,c)
+#endif
+#define safesysmalloc Perl_safesysmalloc
+#define safesyscalloc Perl_safesyscalloc
+#define safesysrealloc Perl_safesysrealloc
+#define safesysfree Perl_safesysfree
+#if defined(LEAKTEST)
+#define safexmalloc Perl_safexmalloc
+#define safexcalloc Perl_safexcalloc
+#define safexrealloc Perl_safexrealloc
+#define safexfree Perl_safexfree
+#endif
+#if defined(PERL_GLOBAL_STRUCT)
+#define GetVars() Perl_GetVars(aTHX)
+#endif
+#define runops_standard() Perl_runops_standard(aTHX)
+#define runops_debug() Perl_runops_debug(aTHX)
+#define sv_vcatpvf_mg(a,b,c) Perl_sv_vcatpvf_mg(aTHX_ a,b,c)
+#define sv_catpv_mg(a,b) Perl_sv_catpv_mg(aTHX_ a,b)
+#define sv_catpvn_mg(a,b,c) Perl_sv_catpvn_mg(aTHX_ a,b,c)
+#define sv_catsv_mg(a,b) Perl_sv_catsv_mg(aTHX_ a,b)
+#define sv_vsetpvf_mg(a,b,c) Perl_sv_vsetpvf_mg(aTHX_ a,b,c)
+#define sv_setiv_mg(a,b) Perl_sv_setiv_mg(aTHX_ a,b)
+#define sv_setpviv_mg(a,b) Perl_sv_setpviv_mg(aTHX_ a,b)
+#define sv_setuv_mg(a,b) Perl_sv_setuv_mg(aTHX_ a,b)
+#define sv_setnv_mg(a,b) Perl_sv_setnv_mg(aTHX_ a,b)
+#define sv_setpv_mg(a,b) Perl_sv_setpv_mg(aTHX_ a,b)
+#define sv_setpvn_mg(a,b,c) Perl_sv_setpvn_mg(aTHX_ a,b,c)
+#define sv_setsv_mg(a,b) Perl_sv_setsv_mg(aTHX_ a,b)
+#define sv_usepvn_mg(a,b,c) Perl_sv_usepvn_mg(aTHX_ a,b,c)
+#define get_vtbl(a) Perl_get_vtbl(aTHX_ a)
+#define pv_display(a,b,c,d,e) Perl_pv_display(aTHX_ a,b,c,d,e)
+#define dump_vindent(a,b,c,d) Perl_dump_vindent(aTHX_ a,b,c,d)
+#define do_gv_dump(a,b,c,d) Perl_do_gv_dump(aTHX_ a,b,c,d)
+#define do_gvgv_dump(a,b,c,d) Perl_do_gvgv_dump(aTHX_ a,b,c,d)
+#define do_hv_dump(a,b,c,d) Perl_do_hv_dump(aTHX_ a,b,c,d)
+#define do_magic_dump(a,b,c,d,e,f,g) Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g)
+#define do_op_dump(a,b,c) Perl_do_op_dump(aTHX_ a,b,c)
+#define do_pmop_dump(a,b,c) Perl_do_pmop_dump(aTHX_ a,b,c)
+#define do_sv_dump(a,b,c,d,e,f,g) Perl_do_sv_dump(aTHX_ a,b,c,d,e,f,g)
+#define magic_dump(a) Perl_magic_dump(aTHX_ a)
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define vdefault_protect(a,b,c,d) Perl_vdefault_protect(aTHX_ a,b,c,d)
+#endif
+#define reginitcolors() Perl_reginitcolors(aTHX)
+#define sv_2pv_nolen(a) Perl_sv_2pv_nolen(aTHX_ a)
+#define sv_2pvutf8_nolen(a) Perl_sv_2pvutf8_nolen(aTHX_ a)
+#define sv_2pvbyte_nolen(a) Perl_sv_2pvbyte_nolen(aTHX_ a)
+#define sv_pv(a) Perl_sv_pv(aTHX_ a)
+#define sv_pvutf8(a) Perl_sv_pvutf8(aTHX_ a)
+#define sv_pvbyte(a) Perl_sv_pvbyte(aTHX_ a)
+#define sv_utf8_upgrade(a) Perl_sv_utf8_upgrade(aTHX_ a)
+#define sv_utf8_downgrade(a,b) Perl_sv_utf8_downgrade(aTHX_ a,b)
+#define sv_utf8_encode(a) Perl_sv_utf8_encode(aTHX_ a)
+#define sv_utf8_decode(a) Perl_sv_utf8_decode(aTHX_ a)
+#define sv_force_normal(a) Perl_sv_force_normal(aTHX_ a)
+#define tmps_grow(a) Perl_tmps_grow(aTHX_ a)
+#define sv_rvweaken(a) Perl_sv_rvweaken(aTHX_ a)
+#define magic_killbackrefs(a,b) Perl_magic_killbackrefs(aTHX_ a,b)
+#define newANONATTRSUB(a,b,c,d) Perl_newANONATTRSUB(aTHX_ a,b,c,d)
+#define newATTRSUB(a,b,c,d,e) Perl_newATTRSUB(aTHX_ a,b,c,d,e)
+#define newMYSUB(a,b,c,d,e) Perl_newMYSUB(aTHX_ a,b,c,d,e)
+#define my_attrs(a,b) Perl_my_attrs(aTHX_ a,b)
+#define boot_core_xsutils() Perl_boot_core_xsutils(aTHX)
+#if defined(USE_ITHREADS)
+#define cx_dup(a,b,c) Perl_cx_dup(aTHX_ a,b,c)
+#define si_dup(a) Perl_si_dup(aTHX_ a)
+#define ss_dup(a) Perl_ss_dup(aTHX_ a)
+#define any_dup(a,b) Perl_any_dup(aTHX_ a,b)
+#define he_dup(a,b) Perl_he_dup(aTHX_ a,b)
+#define re_dup(a) Perl_re_dup(aTHX_ a)
+#define fp_dup(a,b) Perl_fp_dup(aTHX_ a,b)
+#define dirp_dup(a) Perl_dirp_dup(aTHX_ a)
+#define gp_dup(a) Perl_gp_dup(aTHX_ a)
+#define mg_dup(a) Perl_mg_dup(aTHX_ a)
+#define sv_dup(a) Perl_sv_dup(aTHX_ a)
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_dup(a,b) Perl_sys_intern_dup(aTHX_ a,b)
+#endif
+#define ptr_table_new() Perl_ptr_table_new(aTHX)
+#define ptr_table_fetch(a,b) Perl_ptr_table_fetch(aTHX_ a,b)
+#define ptr_table_store(a,b,c) Perl_ptr_table_store(aTHX_ a,b,c)
+#define ptr_table_split(a) Perl_ptr_table_split(aTHX_ a)
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#define avhv_index_sv(a) S_avhv_index_sv(aTHX_ a)
+#define avhv_index(a,b,c) S_avhv_index(aTHX_ a,b,c)
+#endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#define do_trans_CC_simple(a) S_do_trans_CC_simple(aTHX_ a)
+#define do_trans_CC_count(a) S_do_trans_CC_count(aTHX_ a)
+#define do_trans_CC_complex(a) S_do_trans_CC_complex(aTHX_ a)
+#define do_trans_UU_simple(a) S_do_trans_UU_simple(aTHX_ a)
+#define do_trans_UU_count(a) S_do_trans_UU_count(aTHX_ a)
+#define do_trans_UU_complex(a) S_do_trans_UU_complex(aTHX_ a)
+#define do_trans_UC_simple(a) S_do_trans_UC_simple(aTHX_ a)
+#define do_trans_CU_simple(a) S_do_trans_CU_simple(aTHX_ a)
+#define do_trans_UC_trivial(a) S_do_trans_UC_trivial(aTHX_ a)
+#define do_trans_CU_trivial(a) S_do_trans_CU_trivial(aTHX_ a)
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#define gv_init_sv(a,b) S_gv_init_sv(aTHX_ a,b)
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#define hsplit(a) S_hsplit(aTHX_ a)
+#define hfreeentries(a) S_hfreeentries(aTHX_ a)
+#define more_he() S_more_he(aTHX)
+#define new_he() S_new_he(aTHX)
+#define del_he(a) S_del_he(aTHX_ a)
+#define save_hek(a,b,c) S_save_hek(aTHX_ a,b,c)
+#define hv_magic_check(a,b,c) S_hv_magic_check(aTHX_ a,b,c)
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#define save_magic(a,b) S_save_magic(aTHX_ a,b)
+#define magic_methpack(a,b,c) S_magic_methpack(aTHX_ a,b,c)
+#define magic_methcall(a,b,c,d,e,f) S_magic_methcall(aTHX_ a,b,c,d,e,f)
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#define list_assignment(a) S_list_assignment(aTHX_ a)
+#define bad_type(a,b,c,d) S_bad_type(aTHX_ a,b,c,d)
+#define cop_free(a) S_cop_free(aTHX_ a)
+#define modkids(a,b) S_modkids(aTHX_ a,b)
+#define no_bareword_allowed(a) S_no_bareword_allowed(aTHX_ a)
+#define no_fh_allowed(a) S_no_fh_allowed(aTHX_ a)
+#define scalarboolean(a) S_scalarboolean(aTHX_ a)
+#define too_few_arguments(a,b) S_too_few_arguments(aTHX_ a,b)
+#define too_many_arguments(a,b) S_too_many_arguments(aTHX_ a,b)
+#define op_clear(a) S_op_clear(aTHX_ a)
+#define null(a) S_null(aTHX_ a)
+#define pad_addlex(a) S_pad_addlex(aTHX_ a)
+#define pad_findlex(a,b,c,d,e,f,g) S_pad_findlex(aTHX_ a,b,c,d,e,f,g)
+#define newDEFSVOP() S_newDEFSVOP(aTHX)
+#define new_logop(a,b,c,d) S_new_logop(aTHX_ a,b,c,d)
+#define simplify_sort(a) S_simplify_sort(aTHX_ a)
+#define is_handle_constructor(a,b) S_is_handle_constructor(aTHX_ a,b)
+#define gv_ename(a) S_gv_ename(aTHX_ a)
+#define cv_dump(a) S_cv_dump(aTHX_ a)
+#define cv_clone2(a,b) S_cv_clone2(aTHX_ a,b)
+#define scalar_mod_type(a,b) S_scalar_mod_type(aTHX_ a,b)
+#define my_kid(a,b) S_my_kid(aTHX_ a,b)
+#define dup_attrlist(a) S_dup_attrlist(aTHX_ a)
+#define apply_attrs(a,b,c) S_apply_attrs(aTHX_ a,b,c)
+# if defined(PL_OP_SLAB_ALLOC)
+#define Slab_Alloc(a,b) S_Slab_Alloc(aTHX_ a,b)
+# endif
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+#define find_beginning() S_find_beginning(aTHX)
+#define forbid_setid(a) S_forbid_setid(aTHX_ a)
+#define incpush(a,b,c) S_incpush(aTHX_ a,b,c)
+#define init_interp() S_init_interp(aTHX)
+#define init_ids() S_init_ids(aTHX)
+#define init_lexer() S_init_lexer(aTHX)
+#define init_main_stash() S_init_main_stash(aTHX)
+#define init_perllib() S_init_perllib(aTHX)
+#define init_postdump_symbols(a,b,c) S_init_postdump_symbols(aTHX_ a,b,c)
+#define init_predump_symbols() S_init_predump_symbols(aTHX)
+#define my_exit_jump() S_my_exit_jump(aTHX)
+#define nuke_stacks() S_nuke_stacks(aTHX)
+#define open_script(a,b,c,d) S_open_script(aTHX_ a,b,c,d)
+#define usage(a) S_usage(aTHX_ a)
+#define validate_suid(a,b,c) S_validate_suid(aTHX_ a,b,c)
+# if defined(IAMSUID)
+#define fd_on_nosuid_fs(a) S_fd_on_nosuid_fs(aTHX_ a)
+# endif
+#define parse_body(a,b) S_parse_body(aTHX_ a,b)
+#define run_body(a) S_run_body(aTHX_ a)
+#define call_body(a,b) S_call_body(aTHX_ a,b)
+#define call_list_body(a) S_call_list_body(aTHX_ a)
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define vparse_body(a) S_vparse_body(aTHX_ a)
+#define vrun_body(a) S_vrun_body(aTHX_ a)
+#define vcall_body(a) S_vcall_body(aTHX_ a)
+#define vcall_list_body(a) S_vcall_list_body(aTHX_ a)
+#endif
+# if defined(USE_THREADS)
+#define init_main_thread() S_init_main_thread(aTHX)
+# endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#define doencodes(a,b,c) S_doencodes(aTHX_ a,b,c)
+#define refto(a) S_refto(aTHX_ a)
+#define seed() S_seed(aTHX)
+#define mul128(a,b) S_mul128(aTHX_ a,b)
+#define is_an_int(a,b) S_is_an_int(aTHX_ a,b)
+#define div128(a,b) S_div128(aTHX_ a,b)
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#define docatch(a) S_docatch(aTHX_ a)
+#define docatch_body() S_docatch_body(aTHX)
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define vdocatch_body(a) S_vdocatch_body(aTHX_ a)
+#endif
+#define dofindlabel(a,b,c,d) S_dofindlabel(aTHX_ a,b,c,d)
+#define doparseform(a) S_doparseform(aTHX_ a)
+#define dopoptoeval(a) S_dopoptoeval(aTHX_ a)
+#define dopoptolabel(a) S_dopoptolabel(aTHX_ a)
+#define dopoptoloop(a) S_dopoptoloop(aTHX_ a)
+#define dopoptosub(a) S_dopoptosub(aTHX_ a)
+#define dopoptosub_at(a,b) S_dopoptosub_at(aTHX_ a,b)
+#define free_closures() S_free_closures(aTHX)
+#define save_lines(a,b) S_save_lines(aTHX_ a,b)
+#define doeval(a,b) S_doeval(aTHX_ a,b)
+#define doopen_pmc(a,b) S_doopen_pmc(aTHX_ a,b)
+#define qsortsv(a,b,c) S_qsortsv(aTHX_ a,b,c)
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#define do_maybe_phash(a,b,c,d,e) S_do_maybe_phash(aTHX_ a,b,c,d,e)
+#define do_oddball(a,b,c) S_do_oddball(aTHX_ a,b,c)
+#define get_db_sub(a,b) S_get_db_sub(aTHX_ a,b)
+#define method_common(a,b) S_method_common(aTHX_ a,b)
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+#define doform(a,b,c) S_doform(aTHX_ a,b,c)
+#define emulate_eaccess(a,b) S_emulate_eaccess(aTHX_ a,b)
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#define dooneliner(a,b) S_dooneliner(aTHX_ a,b)
+# endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#define reg(a,b) S_reg(aTHX_ a,b)
+#define reganode(a,b) S_reganode(aTHX_ a,b)
+#define regatom(a) S_regatom(aTHX_ a)
+#define regbranch(a,b) S_regbranch(aTHX_ a,b)
+#define reguni(a,b,c) S_reguni(aTHX_ a,b,c)
+#define regclass() S_regclass(aTHX)
+#define regclassutf8() S_regclassutf8(aTHX)
+#define regcurly(a) S_regcurly(aTHX_ a)
+#define reg_node(a) S_reg_node(aTHX_ a)
+#define regpiece(a) S_regpiece(aTHX_ a)
+#define reginsert(a,b) S_reginsert(aTHX_ a,b)
+#define regoptail(a,b) S_regoptail(aTHX_ a,b)
+#define regtail(a,b) S_regtail(aTHX_ a,b)
+#define regwhite(a,b) S_regwhite(aTHX_ a,b)
+#define nextchar() S_nextchar(aTHX)
+#define dumpuntil(a,b,c,d,e) S_dumpuntil(aTHX_ a,b,c,d,e)
+#define put_byte(a,b) S_put_byte(aTHX_ a,b)
+#define scan_commit(a) S_scan_commit(aTHX_ a)
+#define cl_anything(a) S_cl_anything(aTHX_ a)
+#define cl_is_anything(a) S_cl_is_anything(aTHX_ a)
+#define cl_init(a) S_cl_init(aTHX_ a)
+#define cl_init_zero(a) S_cl_init_zero(aTHX_ a)
+#define cl_and(a,b) S_cl_and(aTHX_ a,b)
+#define cl_or(a,b) S_cl_or(aTHX_ a,b)
+#define study_chunk(a,b,c,d,e) S_study_chunk(aTHX_ a,b,c,d,e)
+#define add_data(a,b) S_add_data(aTHX_ a,b)
+#define regpposixcc(a) S_regpposixcc(aTHX_ a)
+#define checkposixcc() S_checkposixcc(aTHX)
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#define regmatch(a) S_regmatch(aTHX_ a)
+#define regrepeat(a,b) S_regrepeat(aTHX_ a,b)
+#define regrepeat_hard(a,b,c) S_regrepeat_hard(aTHX_ a,b,c)
+#define regtry(a,b) S_regtry(aTHX_ a,b)
+#define reginclass(a,b) S_reginclass(aTHX_ a,b)
+#define reginclassutf8(a,b) S_reginclassutf8(aTHX_ a,b)
+#define regcppush(a) S_regcppush(aTHX_ a)
+#define regcppop() S_regcppop(aTHX)
+#define regcp_set_to(a) S_regcp_set_to(aTHX_ a)
+#define cache_re(a) S_cache_re(aTHX_ a)
+#define reghop(a,b) S_reghop(aTHX_ a,b)
+#define reghopmaybe(a,b) S_reghopmaybe(aTHX_ a,b)
+#define find_byclass(a,b,c,d,e,f) S_find_byclass(aTHX_ a,b,c,d,e,f)
+#endif
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
+#define debprof(a) S_debprof(aTHX_ a)
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#define save_scalar_at(a) S_save_scalar_at(aTHX_ a)
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#define asIV(a) S_asIV(aTHX_ a)
+#define asUV(a) S_asUV(aTHX_ a)
+#define more_sv() S_more_sv(aTHX)
+#define more_xiv() S_more_xiv(aTHX)
+#define more_xnv() S_more_xnv(aTHX)
+#define more_xpv() S_more_xpv(aTHX)
+#define more_xpviv() S_more_xpviv(aTHX)
+#define more_xpvnv() S_more_xpvnv(aTHX)
+#define more_xpvcv() S_more_xpvcv(aTHX)
+#define more_xpvav() S_more_xpvav(aTHX)
+#define more_xpvhv() S_more_xpvhv(aTHX)
+#define more_xpvmg() S_more_xpvmg(aTHX)
+#define more_xpvlv() S_more_xpvlv(aTHX)
+#define more_xpvbm() S_more_xpvbm(aTHX)
+#define more_xrv() S_more_xrv(aTHX)
+#define new_xiv() S_new_xiv(aTHX)
+#define new_xnv() S_new_xnv(aTHX)
+#define new_xpv() S_new_xpv(aTHX)
+#define new_xpviv() S_new_xpviv(aTHX)
+#define new_xpvnv() S_new_xpvnv(aTHX)
+#define new_xpvcv() S_new_xpvcv(aTHX)
+#define new_xpvav() S_new_xpvav(aTHX)
+#define new_xpvhv() S_new_xpvhv(aTHX)
+#define new_xpvmg() S_new_xpvmg(aTHX)
+#define new_xpvlv() S_new_xpvlv(aTHX)
+#define new_xpvbm() S_new_xpvbm(aTHX)
+#define new_xrv() S_new_xrv(aTHX)
+#define del_xiv(a) S_del_xiv(aTHX_ a)
+#define del_xnv(a) S_del_xnv(aTHX_ a)
+#define del_xpv(a) S_del_xpv(aTHX_ a)
+#define del_xpviv(a) S_del_xpviv(aTHX_ a)
+#define del_xpvnv(a) S_del_xpvnv(aTHX_ a)
+#define del_xpvcv(a) S_del_xpvcv(aTHX_ a)
+#define del_xpvav(a) S_del_xpvav(aTHX_ a)
+#define del_xpvhv(a) S_del_xpvhv(aTHX_ a)
+#define del_xpvmg(a) S_del_xpvmg(aTHX_ a)
+#define del_xpvlv(a) S_del_xpvlv(aTHX_ a)
+#define del_xpvbm(a) S_del_xpvbm(aTHX_ a)
+#define del_xrv(a) S_del_xrv(aTHX_ a)
+#define sv_unglob(a) S_sv_unglob(aTHX_ a)
+#define not_a_number(a) S_not_a_number(aTHX_ a)
+#define visit(a) S_visit(aTHX_ a)
+#define sv_add_backref(a,b) S_sv_add_backref(aTHX_ a,b)
+#define sv_del_backref(a) S_sv_del_backref(aTHX_ a)
+# if defined(DEBUGGING)
+#define del_sv(a) S_del_sv(aTHX_ a)
+# endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#define check_uni() S_check_uni(aTHX)
+#define force_next(a) S_force_next(aTHX_ a)
+#define force_version(a) S_force_version(aTHX_ a)
+#define force_word(a,b,c,d,e) S_force_word(aTHX_ a,b,c,d,e)
+#define tokeq(a) S_tokeq(aTHX_ a)
+#define scan_const(a) S_scan_const(aTHX_ a)
+#define scan_formline(a) S_scan_formline(aTHX_ a)
+#define scan_heredoc(a) S_scan_heredoc(aTHX_ a)
+#define scan_ident(a,b,c,d,e) S_scan_ident(aTHX_ a,b,c,d,e)
+#define scan_inputsymbol(a) S_scan_inputsymbol(aTHX_ a)
+#define scan_pat(a,b) S_scan_pat(aTHX_ a,b)
+#define scan_str(a,b,c) S_scan_str(aTHX_ a,b,c)
+#define scan_subst(a) S_scan_subst(aTHX_ a)
+#define scan_trans(a) S_scan_trans(aTHX_ a)
+#define scan_word(a,b,c,d,e) S_scan_word(aTHX_ a,b,c,d,e)
+#define skipspace(a) S_skipspace(aTHX_ a)
+#define checkcomma(a,b,c) S_checkcomma(aTHX_ a,b,c)
+#define force_ident(a,b) S_force_ident(aTHX_ a,b)
+#define incline(a) S_incline(aTHX_ a)
+#define intuit_method(a,b) S_intuit_method(aTHX_ a,b)
+#define intuit_more(a) S_intuit_more(aTHX_ a)
+#define lop(a,b,c) S_lop(aTHX_ a,b,c)
+#define missingterm(a) S_missingterm(aTHX_ a)
+#define no_op(a,b) S_no_op(aTHX_ a,b)
+#define set_csh() S_set_csh(aTHX)
+#define sublex_done() S_sublex_done(aTHX)
+#define sublex_push() S_sublex_push(aTHX)
+#define sublex_start() S_sublex_start(aTHX)
+#define filter_gets(a,b,c) S_filter_gets(aTHX_ a,b,c)
+#define new_constant(a,b,c,d,e,f) S_new_constant(aTHX_ a,b,c,d,e,f)
+#define ao(a) S_ao(aTHX_ a)
+#define depcom() S_depcom(aTHX)
+#define incl_perldb() S_incl_perldb(aTHX)
+#if 0
+#define utf16_textfilter(a,b,c) S_utf16_textfilter(aTHX_ a,b,c)
+#define utf16rev_textfilter(a,b,c) S_utf16rev_textfilter(aTHX_ a,b,c)
+#endif
+# if defined(CRIPPLED_CC)
+#define uni(a,b) S_uni(aTHX_ a,b)
+# endif
+# if defined(PERL_CR_FILTER)
+#define cr_textfilter(a,b,c) S_cr_textfilter(aTHX_ a,b,c)
+# endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#define isa_lookup(a,b,c,d) S_isa_lookup(aTHX_ a,b,c,d)
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#define mess_alloc() S_mess_alloc(aTHX)
+# if defined(LEAKTEST)
+#define xstat(a) S_xstat(aTHX_ a)
+# endif
+#endif
+#if defined(PERL_OBJECT)
+#endif
+#define ck_anoncode(a) Perl_ck_anoncode(aTHX_ a)
+#define ck_bitop(a) Perl_ck_bitop(aTHX_ a)
+#define ck_concat(a) Perl_ck_concat(aTHX_ a)
+#define ck_defined(a) Perl_ck_defined(aTHX_ a)
+#define ck_delete(a) Perl_ck_delete(aTHX_ a)
+#define ck_eof(a) Perl_ck_eof(aTHX_ a)
+#define ck_eval(a) Perl_ck_eval(aTHX_ a)
+#define ck_exec(a) Perl_ck_exec(aTHX_ a)
+#define ck_exists(a) Perl_ck_exists(aTHX_ a)
+#define ck_exit(a) Perl_ck_exit(aTHX_ a)
+#define ck_ftst(a) Perl_ck_ftst(aTHX_ a)
+#define ck_fun(a) Perl_ck_fun(aTHX_ a)
+#define ck_fun_locale(a) Perl_ck_fun_locale(aTHX_ a)
+#define ck_glob(a) Perl_ck_glob(aTHX_ a)
+#define ck_grep(a) Perl_ck_grep(aTHX_ a)
+#define ck_index(a) Perl_ck_index(aTHX_ a)
+#define ck_join(a) Perl_ck_join(aTHX_ a)
+#define ck_lengthconst(a) Perl_ck_lengthconst(aTHX_ a)
+#define ck_lfun(a) Perl_ck_lfun(aTHX_ a)
+#define ck_listiob(a) Perl_ck_listiob(aTHX_ a)
+#define ck_match(a) Perl_ck_match(aTHX_ a)
+#define ck_method(a) Perl_ck_method(aTHX_ a)
+#define ck_null(a) Perl_ck_null(aTHX_ a)
+#define ck_open(a) Perl_ck_open(aTHX_ a)
+#define ck_repeat(a) Perl_ck_repeat(aTHX_ a)
+#define ck_require(a) Perl_ck_require(aTHX_ a)
+#define ck_rfun(a) Perl_ck_rfun(aTHX_ a)
+#define ck_rvconst(a) Perl_ck_rvconst(aTHX_ a)
+#define ck_sassign(a) Perl_ck_sassign(aTHX_ a)
+#define ck_scmp(a) Perl_ck_scmp(aTHX_ a)
+#define ck_select(a) Perl_ck_select(aTHX_ a)
+#define ck_shift(a) Perl_ck_shift(aTHX_ a)
+#define ck_sort(a) Perl_ck_sort(aTHX_ a)
+#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_svconst(a) Perl_ck_svconst(aTHX_ a)
+#define ck_trunc(a) Perl_ck_trunc(aTHX_ a)
+#define pp_aassign() Perl_pp_aassign(aTHX)
+#define pp_abs() Perl_pp_abs(aTHX)
+#define pp_accept() Perl_pp_accept(aTHX)
+#define pp_add() Perl_pp_add(aTHX)
+#define pp_aelem() Perl_pp_aelem(aTHX)
+#define pp_aelemfast() Perl_pp_aelemfast(aTHX)
+#define pp_alarm() Perl_pp_alarm(aTHX)
+#define pp_and() Perl_pp_and(aTHX)
+#define pp_andassign() Perl_pp_andassign(aTHX)
+#define pp_anoncode() Perl_pp_anoncode(aTHX)
+#define pp_anonhash() Perl_pp_anonhash(aTHX)
+#define pp_anonlist() Perl_pp_anonlist(aTHX)
+#define pp_aslice() Perl_pp_aslice(aTHX)
+#define pp_atan2() Perl_pp_atan2(aTHX)
+#define pp_av2arylen() Perl_pp_av2arylen(aTHX)
+#define pp_backtick() Perl_pp_backtick(aTHX)
+#define pp_bind() Perl_pp_bind(aTHX)
+#define pp_binmode() Perl_pp_binmode(aTHX)
+#define pp_bit_and() Perl_pp_bit_and(aTHX)
+#define pp_bit_or() Perl_pp_bit_or(aTHX)
+#define pp_bit_xor() Perl_pp_bit_xor(aTHX)
+#define pp_bless() Perl_pp_bless(aTHX)
+#define pp_caller() Perl_pp_caller(aTHX)
+#define pp_chdir() Perl_pp_chdir(aTHX)
+#define pp_chmod() Perl_pp_chmod(aTHX)
+#define pp_chomp() Perl_pp_chomp(aTHX)
+#define pp_chop() Perl_pp_chop(aTHX)
+#define pp_chown() Perl_pp_chown(aTHX)
+#define pp_chr() Perl_pp_chr(aTHX)
+#define pp_chroot() Perl_pp_chroot(aTHX)
+#define pp_close() Perl_pp_close(aTHX)
+#define pp_closedir() Perl_pp_closedir(aTHX)
+#define pp_complement() Perl_pp_complement(aTHX)
+#define pp_concat() Perl_pp_concat(aTHX)
+#define pp_cond_expr() Perl_pp_cond_expr(aTHX)
+#define pp_connect() Perl_pp_connect(aTHX)
+#define pp_const() Perl_pp_const(aTHX)
+#define pp_cos() Perl_pp_cos(aTHX)
+#define pp_crypt() Perl_pp_crypt(aTHX)
+#define pp_dbmclose() Perl_pp_dbmclose(aTHX)
+#define pp_dbmopen() Perl_pp_dbmopen(aTHX)
+#define pp_dbstate() Perl_pp_dbstate(aTHX)
+#define pp_defined() Perl_pp_defined(aTHX)
+#define pp_delete() Perl_pp_delete(aTHX)
+#define pp_die() Perl_pp_die(aTHX)
+#define pp_divide() Perl_pp_divide(aTHX)
+#define pp_dofile() Perl_pp_dofile(aTHX)
+#define pp_dump() Perl_pp_dump(aTHX)
+#define pp_each() Perl_pp_each(aTHX)
+#define pp_egrent() Perl_pp_egrent(aTHX)
+#define pp_ehostent() Perl_pp_ehostent(aTHX)
+#define pp_enetent() Perl_pp_enetent(aTHX)
+#define pp_enter() Perl_pp_enter(aTHX)
+#define pp_entereval() Perl_pp_entereval(aTHX)
+#define pp_enteriter() Perl_pp_enteriter(aTHX)
+#define pp_enterloop() Perl_pp_enterloop(aTHX)
+#define pp_entersub() Perl_pp_entersub(aTHX)
+#define pp_entertry() Perl_pp_entertry(aTHX)
+#define pp_enterwrite() Perl_pp_enterwrite(aTHX)
+#define pp_eof() Perl_pp_eof(aTHX)
+#define pp_eprotoent() Perl_pp_eprotoent(aTHX)
+#define pp_epwent() Perl_pp_epwent(aTHX)
+#define pp_eq() Perl_pp_eq(aTHX)
+#define pp_eservent() Perl_pp_eservent(aTHX)
+#define pp_exec() Perl_pp_exec(aTHX)
+#define pp_exists() Perl_pp_exists(aTHX)
+#define pp_exit() Perl_pp_exit(aTHX)
+#define pp_exp() Perl_pp_exp(aTHX)
+#define pp_fcntl() Perl_pp_fcntl(aTHX)
+#define pp_fileno() Perl_pp_fileno(aTHX)
+#define pp_flip() Perl_pp_flip(aTHX)
+#define pp_flock() Perl_pp_flock(aTHX)
+#define pp_flop() Perl_pp_flop(aTHX)
+#define pp_fork() Perl_pp_fork(aTHX)
+#define pp_formline() Perl_pp_formline(aTHX)
+#define pp_ftatime() Perl_pp_ftatime(aTHX)
+#define pp_ftbinary() Perl_pp_ftbinary(aTHX)
+#define pp_ftblk() Perl_pp_ftblk(aTHX)
+#define pp_ftchr() Perl_pp_ftchr(aTHX)
+#define pp_ftctime() Perl_pp_ftctime(aTHX)
+#define pp_ftdir() Perl_pp_ftdir(aTHX)
+#define pp_fteexec() Perl_pp_fteexec(aTHX)
+#define pp_fteowned() Perl_pp_fteowned(aTHX)
+#define pp_fteread() Perl_pp_fteread(aTHX)
+#define pp_ftewrite() Perl_pp_ftewrite(aTHX)
+#define pp_ftfile() Perl_pp_ftfile(aTHX)
+#define pp_ftis() Perl_pp_ftis(aTHX)
+#define pp_ftlink() Perl_pp_ftlink(aTHX)
+#define pp_ftmtime() Perl_pp_ftmtime(aTHX)
+#define pp_ftpipe() Perl_pp_ftpipe(aTHX)
+#define pp_ftrexec() Perl_pp_ftrexec(aTHX)
+#define pp_ftrowned() Perl_pp_ftrowned(aTHX)
+#define pp_ftrread() Perl_pp_ftrread(aTHX)
+#define pp_ftrwrite() Perl_pp_ftrwrite(aTHX)
+#define pp_ftsgid() Perl_pp_ftsgid(aTHX)
+#define pp_ftsize() Perl_pp_ftsize(aTHX)
+#define pp_ftsock() Perl_pp_ftsock(aTHX)
+#define pp_ftsuid() Perl_pp_ftsuid(aTHX)
+#define pp_ftsvtx() Perl_pp_ftsvtx(aTHX)
+#define pp_fttext() Perl_pp_fttext(aTHX)
+#define pp_fttty() Perl_pp_fttty(aTHX)
+#define pp_ftzero() Perl_pp_ftzero(aTHX)
+#define pp_ge() Perl_pp_ge(aTHX)
+#define pp_gelem() Perl_pp_gelem(aTHX)
+#define pp_getc() Perl_pp_getc(aTHX)
+#define pp_getlogin() Perl_pp_getlogin(aTHX)
+#define pp_getpeername() Perl_pp_getpeername(aTHX)
+#define pp_getpgrp() Perl_pp_getpgrp(aTHX)
+#define pp_getppid() Perl_pp_getppid(aTHX)
+#define pp_getpriority() Perl_pp_getpriority(aTHX)
+#define pp_getsockname() Perl_pp_getsockname(aTHX)
+#define pp_ggrent() Perl_pp_ggrent(aTHX)
+#define pp_ggrgid() Perl_pp_ggrgid(aTHX)
+#define pp_ggrnam() Perl_pp_ggrnam(aTHX)
+#define pp_ghbyaddr() Perl_pp_ghbyaddr(aTHX)
+#define pp_ghbyname() Perl_pp_ghbyname(aTHX)
+#define pp_ghostent() Perl_pp_ghostent(aTHX)
+#define pp_glob() Perl_pp_glob(aTHX)
+#define pp_gmtime() Perl_pp_gmtime(aTHX)
+#define pp_gnbyaddr() Perl_pp_gnbyaddr(aTHX)
+#define pp_gnbyname() Perl_pp_gnbyname(aTHX)
+#define pp_gnetent() Perl_pp_gnetent(aTHX)
+#define pp_goto() Perl_pp_goto(aTHX)
+#define pp_gpbyname() Perl_pp_gpbyname(aTHX)
+#define pp_gpbynumber() Perl_pp_gpbynumber(aTHX)
+#define pp_gprotoent() Perl_pp_gprotoent(aTHX)
+#define pp_gpwent() Perl_pp_gpwent(aTHX)
+#define pp_gpwnam() Perl_pp_gpwnam(aTHX)
+#define pp_gpwuid() Perl_pp_gpwuid(aTHX)
+#define pp_grepstart() Perl_pp_grepstart(aTHX)
+#define pp_grepwhile() Perl_pp_grepwhile(aTHX)
+#define pp_gsbyname() Perl_pp_gsbyname(aTHX)
+#define pp_gsbyport() Perl_pp_gsbyport(aTHX)
+#define pp_gservent() Perl_pp_gservent(aTHX)
+#define pp_gsockopt() Perl_pp_gsockopt(aTHX)
+#define pp_gt() Perl_pp_gt(aTHX)
+#define pp_gv() Perl_pp_gv(aTHX)
+#define pp_gvsv() Perl_pp_gvsv(aTHX)
+#define pp_helem() Perl_pp_helem(aTHX)
+#define pp_hex() Perl_pp_hex(aTHX)
+#define pp_hslice() Perl_pp_hslice(aTHX)
+#define pp_i_add() Perl_pp_i_add(aTHX)
+#define pp_i_divide() Perl_pp_i_divide(aTHX)
+#define pp_i_eq() Perl_pp_i_eq(aTHX)
+#define pp_i_ge() Perl_pp_i_ge(aTHX)
+#define pp_i_gt() Perl_pp_i_gt(aTHX)
+#define pp_i_le() Perl_pp_i_le(aTHX)
+#define pp_i_lt() Perl_pp_i_lt(aTHX)
+#define pp_i_modulo() Perl_pp_i_modulo(aTHX)
+#define pp_i_multiply() Perl_pp_i_multiply(aTHX)
+#define pp_i_ncmp() Perl_pp_i_ncmp(aTHX)
+#define pp_i_ne() Perl_pp_i_ne(aTHX)
+#define pp_i_negate() Perl_pp_i_negate(aTHX)
+#define pp_i_subtract() Perl_pp_i_subtract(aTHX)
+#define pp_index() Perl_pp_index(aTHX)
+#define pp_int() Perl_pp_int(aTHX)
+#define pp_ioctl() Perl_pp_ioctl(aTHX)
+#define pp_iter() Perl_pp_iter(aTHX)
+#define pp_join() Perl_pp_join(aTHX)
+#define pp_keys() Perl_pp_keys(aTHX)
+#define pp_kill() Perl_pp_kill(aTHX)
+#define pp_last() Perl_pp_last(aTHX)
+#define pp_lc() Perl_pp_lc(aTHX)
+#define pp_lcfirst() Perl_pp_lcfirst(aTHX)
+#define pp_le() Perl_pp_le(aTHX)
+#define pp_leave() Perl_pp_leave(aTHX)
+#define pp_leaveeval() Perl_pp_leaveeval(aTHX)
+#define pp_leaveloop() Perl_pp_leaveloop(aTHX)
+#define pp_leavesub() Perl_pp_leavesub(aTHX)
+#define pp_leavesublv() Perl_pp_leavesublv(aTHX)
+#define pp_leavetry() Perl_pp_leavetry(aTHX)
+#define pp_leavewrite() Perl_pp_leavewrite(aTHX)
+#define pp_left_shift() Perl_pp_left_shift(aTHX)
+#define pp_length() Perl_pp_length(aTHX)
+#define pp_lineseq() Perl_pp_lineseq(aTHX)
+#define pp_link() Perl_pp_link(aTHX)
+#define pp_list() Perl_pp_list(aTHX)
+#define pp_listen() Perl_pp_listen(aTHX)
+#define pp_localtime() Perl_pp_localtime(aTHX)
+#define pp_lock() Perl_pp_lock(aTHX)
+#define pp_log() Perl_pp_log(aTHX)
+#define pp_lslice() Perl_pp_lslice(aTHX)
+#define pp_lstat() Perl_pp_lstat(aTHX)
+#define pp_lt() Perl_pp_lt(aTHX)
+#define pp_mapstart() Perl_pp_mapstart(aTHX)
+#define pp_mapwhile() Perl_pp_mapwhile(aTHX)
+#define pp_match() Perl_pp_match(aTHX)
+#define pp_method() Perl_pp_method(aTHX)
+#define pp_method_named() Perl_pp_method_named(aTHX)
+#define pp_mkdir() Perl_pp_mkdir(aTHX)
+#define pp_modulo() Perl_pp_modulo(aTHX)
+#define pp_msgctl() Perl_pp_msgctl(aTHX)
+#define pp_msgget() Perl_pp_msgget(aTHX)
+#define pp_msgrcv() Perl_pp_msgrcv(aTHX)
+#define pp_msgsnd() Perl_pp_msgsnd(aTHX)
+#define pp_multiply() Perl_pp_multiply(aTHX)
+#define pp_ncmp() Perl_pp_ncmp(aTHX)
+#define pp_ne() Perl_pp_ne(aTHX)
+#define pp_negate() Perl_pp_negate(aTHX)
+#define pp_next() Perl_pp_next(aTHX)
+#define pp_nextstate() Perl_pp_nextstate(aTHX)
+#define pp_not() Perl_pp_not(aTHX)
+#define pp_null() Perl_pp_null(aTHX)
+#define pp_oct() Perl_pp_oct(aTHX)
+#define pp_open() Perl_pp_open(aTHX)
+#define pp_open_dir() Perl_pp_open_dir(aTHX)
+#define pp_or() Perl_pp_or(aTHX)
+#define pp_orassign() Perl_pp_orassign(aTHX)
+#define pp_ord() Perl_pp_ord(aTHX)
+#define pp_pack() Perl_pp_pack(aTHX)
+#define pp_padany() Perl_pp_padany(aTHX)
+#define pp_padav() Perl_pp_padav(aTHX)
+#define pp_padhv() Perl_pp_padhv(aTHX)
+#define pp_padsv() Perl_pp_padsv(aTHX)
+#define pp_pipe_op() Perl_pp_pipe_op(aTHX)
+#define pp_pop() Perl_pp_pop(aTHX)
+#define pp_pos() Perl_pp_pos(aTHX)
+#define pp_postdec() Perl_pp_postdec(aTHX)
+#define pp_postinc() Perl_pp_postinc(aTHX)
+#define pp_pow() Perl_pp_pow(aTHX)
+#define pp_predec() Perl_pp_predec(aTHX)
+#define pp_preinc() Perl_pp_preinc(aTHX)
+#define pp_print() Perl_pp_print(aTHX)
+#define pp_prototype() Perl_pp_prototype(aTHX)
+#define pp_prtf() Perl_pp_prtf(aTHX)
+#define pp_push() Perl_pp_push(aTHX)
+#define pp_pushmark() Perl_pp_pushmark(aTHX)
+#define pp_pushre() Perl_pp_pushre(aTHX)
+#define pp_qr() Perl_pp_qr(aTHX)
+#define pp_quotemeta() Perl_pp_quotemeta(aTHX)
+#define pp_rand() Perl_pp_rand(aTHX)
+#define pp_range() Perl_pp_range(aTHX)
+#define pp_rcatline() Perl_pp_rcatline(aTHX)
+#define pp_read() Perl_pp_read(aTHX)
+#define pp_readdir() Perl_pp_readdir(aTHX)
+#define pp_readline() Perl_pp_readline(aTHX)
+#define pp_readlink() Perl_pp_readlink(aTHX)
+#define pp_recv() Perl_pp_recv(aTHX)
+#define pp_redo() Perl_pp_redo(aTHX)
+#define pp_ref() Perl_pp_ref(aTHX)
+#define pp_refgen() Perl_pp_refgen(aTHX)
+#define pp_regcmaybe() Perl_pp_regcmaybe(aTHX)
+#define pp_regcomp() Perl_pp_regcomp(aTHX)
+#define pp_regcreset() Perl_pp_regcreset(aTHX)
+#define pp_rename() Perl_pp_rename(aTHX)
+#define pp_repeat() Perl_pp_repeat(aTHX)
+#define pp_require() Perl_pp_require(aTHX)
+#define pp_reset() Perl_pp_reset(aTHX)
+#define pp_return() Perl_pp_return(aTHX)
+#define pp_reverse() Perl_pp_reverse(aTHX)
+#define pp_rewinddir() Perl_pp_rewinddir(aTHX)
+#define pp_right_shift() Perl_pp_right_shift(aTHX)
+#define pp_rindex() Perl_pp_rindex(aTHX)
+#define pp_rmdir() Perl_pp_rmdir(aTHX)
+#define pp_rv2av() Perl_pp_rv2av(aTHX)
+#define pp_rv2cv() Perl_pp_rv2cv(aTHX)
+#define pp_rv2gv() Perl_pp_rv2gv(aTHX)
+#define pp_rv2hv() Perl_pp_rv2hv(aTHX)
+#define pp_rv2sv() Perl_pp_rv2sv(aTHX)
+#define pp_sassign() Perl_pp_sassign(aTHX)
+#define pp_scalar() Perl_pp_scalar(aTHX)
+#define pp_schomp() Perl_pp_schomp(aTHX)
+#define pp_schop() Perl_pp_schop(aTHX)
+#define pp_scmp() Perl_pp_scmp(aTHX)
+#define pp_scope() Perl_pp_scope(aTHX)
+#define pp_seek() Perl_pp_seek(aTHX)
+#define pp_seekdir() Perl_pp_seekdir(aTHX)
+#define pp_select() Perl_pp_select(aTHX)
+#define pp_semctl() Perl_pp_semctl(aTHX)
+#define pp_semget() Perl_pp_semget(aTHX)
+#define pp_semop() Perl_pp_semop(aTHX)
+#define pp_send() Perl_pp_send(aTHX)
+#define pp_seq() Perl_pp_seq(aTHX)
+#define pp_setpgrp() Perl_pp_setpgrp(aTHX)
+#define pp_setpriority() Perl_pp_setpriority(aTHX)
+#define pp_setstate() Perl_pp_setstate(aTHX)
+#define pp_sge() Perl_pp_sge(aTHX)
+#define pp_sgrent() Perl_pp_sgrent(aTHX)
+#define pp_sgt() Perl_pp_sgt(aTHX)
+#define pp_shift() Perl_pp_shift(aTHX)
+#define pp_shmctl() Perl_pp_shmctl(aTHX)
+#define pp_shmget() Perl_pp_shmget(aTHX)
+#define pp_shmread() Perl_pp_shmread(aTHX)
+#define pp_shmwrite() Perl_pp_shmwrite(aTHX)
+#define pp_shostent() Perl_pp_shostent(aTHX)
+#define pp_shutdown() Perl_pp_shutdown(aTHX)
+#define pp_sin() Perl_pp_sin(aTHX)
+#define pp_sle() Perl_pp_sle(aTHX)
+#define pp_sleep() Perl_pp_sleep(aTHX)
+#define pp_slt() Perl_pp_slt(aTHX)
+#define pp_sne() Perl_pp_sne(aTHX)
+#define pp_snetent() Perl_pp_snetent(aTHX)
+#define pp_socket() Perl_pp_socket(aTHX)
+#define pp_sockpair() Perl_pp_sockpair(aTHX)
+#define pp_sort() Perl_pp_sort(aTHX)
+#define pp_splice() Perl_pp_splice(aTHX)
+#define pp_split() Perl_pp_split(aTHX)
+#define pp_sprintf() Perl_pp_sprintf(aTHX)
+#define pp_sprotoent() Perl_pp_sprotoent(aTHX)
+#define pp_spwent() Perl_pp_spwent(aTHX)
+#define pp_sqrt() Perl_pp_sqrt(aTHX)
+#define pp_srand() Perl_pp_srand(aTHX)
+#define pp_srefgen() Perl_pp_srefgen(aTHX)
+#define pp_sselect() Perl_pp_sselect(aTHX)
+#define pp_sservent() Perl_pp_sservent(aTHX)
+#define pp_ssockopt() Perl_pp_ssockopt(aTHX)
+#define pp_stat() Perl_pp_stat(aTHX)
+#define pp_stringify() Perl_pp_stringify(aTHX)
+#define pp_stub() Perl_pp_stub(aTHX)
+#define pp_study() Perl_pp_study(aTHX)
+#define pp_subst() Perl_pp_subst(aTHX)
+#define pp_substcont() Perl_pp_substcont(aTHX)
+#define pp_substr() Perl_pp_substr(aTHX)
+#define pp_subtract() Perl_pp_subtract(aTHX)
+#define pp_symlink() Perl_pp_symlink(aTHX)
+#define pp_syscall() Perl_pp_syscall(aTHX)
+#define pp_sysopen() Perl_pp_sysopen(aTHX)
+#define pp_sysread() Perl_pp_sysread(aTHX)
+#define pp_sysseek() Perl_pp_sysseek(aTHX)
+#define pp_system() Perl_pp_system(aTHX)
+#define pp_syswrite() Perl_pp_syswrite(aTHX)
+#define pp_tell() Perl_pp_tell(aTHX)
+#define pp_telldir() Perl_pp_telldir(aTHX)
+#define pp_threadsv() Perl_pp_threadsv(aTHX)
+#define pp_tie() Perl_pp_tie(aTHX)
+#define pp_tied() Perl_pp_tied(aTHX)
+#define pp_time() Perl_pp_time(aTHX)
+#define pp_tms() Perl_pp_tms(aTHX)
+#define pp_trans() Perl_pp_trans(aTHX)
+#define pp_truncate() Perl_pp_truncate(aTHX)
+#define pp_uc() Perl_pp_uc(aTHX)
+#define pp_ucfirst() Perl_pp_ucfirst(aTHX)
+#define pp_umask() Perl_pp_umask(aTHX)
+#define pp_undef() Perl_pp_undef(aTHX)
+#define pp_unlink() Perl_pp_unlink(aTHX)
+#define pp_unpack() Perl_pp_unpack(aTHX)
+#define pp_unshift() Perl_pp_unshift(aTHX)
+#define pp_unstack() Perl_pp_unstack(aTHX)
+#define pp_untie() Perl_pp_untie(aTHX)
+#define pp_utime() Perl_pp_utime(aTHX)
+#define pp_values() Perl_pp_values(aTHX)
+#define pp_vec() Perl_pp_vec(aTHX)
+#define pp_wait() Perl_pp_wait(aTHX)
+#define pp_waitpid() Perl_pp_waitpid(aTHX)
+#define pp_wantarray() Perl_pp_wantarray(aTHX)
+#define pp_warn() Perl_pp_warn(aTHX)
+#define pp_xor() Perl_pp_xor(aTHX)
+
+#endif /* PERL_IMPLICIT_CONTEXT */
+#else /* PERL_OBJECT */
+
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#if defined(USE_ITHREADS)
+# if defined(PERL_IMPLICIT_SYS)
+# endif
+#endif
+#if defined(MYMALLOC)
+#define malloc Perl_malloc
+#define calloc Perl_calloc
+#define realloc Perl_realloc
+#define mfree Perl_mfree
+#define malloced_size Perl_malloced_size
+#endif
+#define get_context Perl_get_context
+#define set_context Perl_set_context
+#if defined(PERL_OBJECT)
+#ifndef __BORLANDC__
+#endif
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#define Perl_amagic_call CPerlObj::Perl_amagic_call
+#define amagic_call Perl_amagic_call
+#define Perl_Gv_AMupdate CPerlObj::Perl_Gv_AMupdate
+#define Gv_AMupdate Perl_Gv_AMupdate
+#define Perl_append_elem CPerlObj::Perl_append_elem
+#define append_elem Perl_append_elem
+#define Perl_append_list CPerlObj::Perl_append_list
+#define append_list Perl_append_list
+#define Perl_apply CPerlObj::Perl_apply
+#define apply Perl_apply
+#define Perl_avhv_delete_ent CPerlObj::Perl_avhv_delete_ent
+#define avhv_delete_ent Perl_avhv_delete_ent
+#define Perl_avhv_exists_ent CPerlObj::Perl_avhv_exists_ent
+#define avhv_exists_ent Perl_avhv_exists_ent
+#define Perl_avhv_fetch_ent CPerlObj::Perl_avhv_fetch_ent
+#define avhv_fetch_ent Perl_avhv_fetch_ent
+#define Perl_avhv_store_ent CPerlObj::Perl_avhv_store_ent
+#define avhv_store_ent Perl_avhv_store_ent
+#define Perl_avhv_iternext CPerlObj::Perl_avhv_iternext
+#define avhv_iternext Perl_avhv_iternext
+#define Perl_avhv_iterval CPerlObj::Perl_avhv_iterval
+#define avhv_iterval Perl_avhv_iterval
+#define Perl_avhv_keys CPerlObj::Perl_avhv_keys
+#define avhv_keys Perl_avhv_keys
+#define Perl_av_clear CPerlObj::Perl_av_clear
+#define av_clear Perl_av_clear
+#define Perl_av_delete CPerlObj::Perl_av_delete
+#define av_delete Perl_av_delete
+#define Perl_av_exists CPerlObj::Perl_av_exists
+#define av_exists Perl_av_exists
+#define Perl_av_extend CPerlObj::Perl_av_extend
+#define av_extend Perl_av_extend
+#define Perl_av_fake CPerlObj::Perl_av_fake
+#define av_fake Perl_av_fake
+#define Perl_av_fetch CPerlObj::Perl_av_fetch
+#define av_fetch Perl_av_fetch
+#define Perl_av_fill CPerlObj::Perl_av_fill
+#define av_fill Perl_av_fill
+#define Perl_av_len CPerlObj::Perl_av_len
+#define av_len Perl_av_len
+#define Perl_av_make CPerlObj::Perl_av_make
+#define av_make Perl_av_make
+#define Perl_av_pop CPerlObj::Perl_av_pop
+#define av_pop Perl_av_pop
+#define Perl_av_push CPerlObj::Perl_av_push
+#define av_push Perl_av_push
+#define Perl_av_reify CPerlObj::Perl_av_reify
+#define av_reify Perl_av_reify
+#define Perl_av_shift CPerlObj::Perl_av_shift
+#define av_shift Perl_av_shift
+#define Perl_av_store CPerlObj::Perl_av_store
+#define av_store Perl_av_store
+#define Perl_av_undef CPerlObj::Perl_av_undef
+#define av_undef Perl_av_undef
+#define Perl_av_unshift CPerlObj::Perl_av_unshift
+#define av_unshift Perl_av_unshift
+#define Perl_bind_match CPerlObj::Perl_bind_match
+#define bind_match Perl_bind_match
+#define Perl_block_end CPerlObj::Perl_block_end
+#define block_end Perl_block_end
+#define Perl_block_gimme CPerlObj::Perl_block_gimme
+#define block_gimme Perl_block_gimme
+#define Perl_block_start CPerlObj::Perl_block_start
+#define block_start Perl_block_start
+#define Perl_boot_core_UNIVERSAL CPerlObj::Perl_boot_core_UNIVERSAL
+#define boot_core_UNIVERSAL Perl_boot_core_UNIVERSAL
+#define Perl_call_list CPerlObj::Perl_call_list
+#define call_list Perl_call_list
+#define Perl_cando CPerlObj::Perl_cando
+#define cando Perl_cando
+#define Perl_cast_ulong CPerlObj::Perl_cast_ulong
+#define cast_ulong Perl_cast_ulong
+#define Perl_cast_i32 CPerlObj::Perl_cast_i32
+#define cast_i32 Perl_cast_i32
+#define Perl_cast_iv CPerlObj::Perl_cast_iv
+#define cast_iv Perl_cast_iv
+#define Perl_cast_uv CPerlObj::Perl_cast_uv
+#define cast_uv Perl_cast_uv
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#define Perl_my_chsize CPerlObj::Perl_my_chsize
+#define my_chsize Perl_my_chsize
+#endif
+#if defined(USE_THREADS)
+#define Perl_condpair_magic CPerlObj::Perl_condpair_magic
+#define condpair_magic Perl_condpair_magic
+#endif
+#define Perl_convert CPerlObj::Perl_convert
+#define convert Perl_convert
+#define Perl_croak CPerlObj::Perl_croak
+#define croak Perl_croak
+#define Perl_vcroak CPerlObj::Perl_vcroak
+#define vcroak Perl_vcroak
+#if defined(PERL_IMPLICIT_CONTEXT)
+#define Perl_croak_nocontext CPerlObj::Perl_croak_nocontext
+#define croak_nocontext Perl_croak_nocontext
+#define Perl_die_nocontext CPerlObj::Perl_die_nocontext
+#define die_nocontext Perl_die_nocontext
+#define Perl_deb_nocontext CPerlObj::Perl_deb_nocontext
+#define deb_nocontext Perl_deb_nocontext
+#define Perl_form_nocontext CPerlObj::Perl_form_nocontext
+#define form_nocontext Perl_form_nocontext
+#define Perl_load_module_nocontext CPerlObj::Perl_load_module_nocontext
+#define load_module_nocontext Perl_load_module_nocontext
+#define Perl_mess_nocontext CPerlObj::Perl_mess_nocontext
+#define mess_nocontext Perl_mess_nocontext
+#define Perl_warn_nocontext CPerlObj::Perl_warn_nocontext
+#define warn_nocontext Perl_warn_nocontext
+#define Perl_warner_nocontext CPerlObj::Perl_warner_nocontext
+#define warner_nocontext Perl_warner_nocontext
+#define Perl_newSVpvf_nocontext CPerlObj::Perl_newSVpvf_nocontext
+#define newSVpvf_nocontext Perl_newSVpvf_nocontext
+#define Perl_sv_catpvf_nocontext CPerlObj::Perl_sv_catpvf_nocontext
+#define sv_catpvf_nocontext Perl_sv_catpvf_nocontext
+#define Perl_sv_setpvf_nocontext CPerlObj::Perl_sv_setpvf_nocontext
+#define sv_setpvf_nocontext Perl_sv_setpvf_nocontext
+#define Perl_sv_catpvf_mg_nocontext CPerlObj::Perl_sv_catpvf_mg_nocontext
+#define sv_catpvf_mg_nocontext Perl_sv_catpvf_mg_nocontext
+#define Perl_sv_setpvf_mg_nocontext CPerlObj::Perl_sv_setpvf_mg_nocontext
+#define sv_setpvf_mg_nocontext Perl_sv_setpvf_mg_nocontext
+#define Perl_fprintf_nocontext CPerlObj::Perl_fprintf_nocontext
+#define fprintf_nocontext Perl_fprintf_nocontext
+#endif
+#define Perl_cv_ckproto CPerlObj::Perl_cv_ckproto
+#define cv_ckproto Perl_cv_ckproto
+#define Perl_cv_clone CPerlObj::Perl_cv_clone
+#define cv_clone Perl_cv_clone
+#define Perl_cv_const_sv CPerlObj::Perl_cv_const_sv
+#define cv_const_sv Perl_cv_const_sv
+#define Perl_op_const_sv CPerlObj::Perl_op_const_sv
+#define op_const_sv Perl_op_const_sv
+#define Perl_cv_undef CPerlObj::Perl_cv_undef
+#define cv_undef Perl_cv_undef
+#define Perl_cx_dump CPerlObj::Perl_cx_dump
+#define cx_dump Perl_cx_dump
+#define Perl_filter_add CPerlObj::Perl_filter_add
+#define filter_add Perl_filter_add
+#define Perl_filter_del CPerlObj::Perl_filter_del
+#define filter_del Perl_filter_del
+#define Perl_filter_read CPerlObj::Perl_filter_read
+#define filter_read Perl_filter_read
+#define Perl_get_op_descs CPerlObj::Perl_get_op_descs
+#define get_op_descs Perl_get_op_descs
+#define Perl_get_op_names CPerlObj::Perl_get_op_names
+#define get_op_names Perl_get_op_names
+#define Perl_get_no_modify CPerlObj::Perl_get_no_modify
+#define get_no_modify Perl_get_no_modify
+#define Perl_get_opargs CPerlObj::Perl_get_opargs
+#define get_opargs Perl_get_opargs
+#define Perl_get_ppaddr CPerlObj::Perl_get_ppaddr
+#define get_ppaddr Perl_get_ppaddr
+#define Perl_cxinc CPerlObj::Perl_cxinc
+#define cxinc Perl_cxinc
+#define Perl_deb CPerlObj::Perl_deb
+#define deb Perl_deb
+#define Perl_vdeb CPerlObj::Perl_vdeb
+#define vdeb Perl_vdeb
+#define Perl_debprofdump CPerlObj::Perl_debprofdump
+#define debprofdump Perl_debprofdump
+#define Perl_debop CPerlObj::Perl_debop
+#define debop Perl_debop
+#define Perl_debstack CPerlObj::Perl_debstack
+#define debstack Perl_debstack
+#define Perl_debstackptrs CPerlObj::Perl_debstackptrs
+#define debstackptrs Perl_debstackptrs
+#define Perl_delimcpy CPerlObj::Perl_delimcpy
+#define delimcpy Perl_delimcpy
+#define Perl_deprecate CPerlObj::Perl_deprecate
+#define deprecate Perl_deprecate
+#define Perl_die CPerlObj::Perl_die
+#define die Perl_die
+#define Perl_vdie CPerlObj::Perl_vdie
+#define vdie Perl_vdie
+#define Perl_die_where CPerlObj::Perl_die_where
+#define die_where Perl_die_where
+#define Perl_dounwind CPerlObj::Perl_dounwind
+#define dounwind Perl_dounwind
+#define Perl_do_aexec CPerlObj::Perl_do_aexec
+#define do_aexec Perl_do_aexec
+#define Perl_do_aexec5 CPerlObj::Perl_do_aexec5
+#define do_aexec5 Perl_do_aexec5
+#define Perl_do_binmode CPerlObj::Perl_do_binmode
+#define do_binmode Perl_do_binmode
+#define Perl_do_chop CPerlObj::Perl_do_chop
+#define do_chop Perl_do_chop
+#define Perl_do_close CPerlObj::Perl_do_close
+#define do_close Perl_do_close
+#define Perl_do_eof CPerlObj::Perl_do_eof
+#define do_eof Perl_do_eof
+#define Perl_do_exec CPerlObj::Perl_do_exec
+#define do_exec Perl_do_exec
+#if !defined(WIN32)
+#define Perl_do_exec3 CPerlObj::Perl_do_exec3
+#define do_exec3 Perl_do_exec3
+#endif
+#define Perl_do_execfree CPerlObj::Perl_do_execfree
+#define do_execfree Perl_do_execfree
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#define Perl_do_ipcctl CPerlObj::Perl_do_ipcctl
+#define do_ipcctl Perl_do_ipcctl
+#define Perl_do_ipcget CPerlObj::Perl_do_ipcget
+#define do_ipcget Perl_do_ipcget
+#define Perl_do_msgrcv CPerlObj::Perl_do_msgrcv
+#define do_msgrcv Perl_do_msgrcv
+#define Perl_do_msgsnd CPerlObj::Perl_do_msgsnd
+#define do_msgsnd Perl_do_msgsnd
+#define Perl_do_semop CPerlObj::Perl_do_semop
+#define do_semop Perl_do_semop
+#define Perl_do_shmio CPerlObj::Perl_do_shmio
+#define do_shmio Perl_do_shmio
+#endif
+#define Perl_do_join CPerlObj::Perl_do_join
+#define do_join Perl_do_join
+#define Perl_do_kv CPerlObj::Perl_do_kv
+#define do_kv Perl_do_kv
+#define Perl_do_open CPerlObj::Perl_do_open
+#define do_open Perl_do_open
+#define Perl_do_open9 CPerlObj::Perl_do_open9
+#define do_open9 Perl_do_open9
+#define Perl_do_pipe CPerlObj::Perl_do_pipe
+#define do_pipe Perl_do_pipe
+#define Perl_do_print CPerlObj::Perl_do_print
+#define do_print Perl_do_print
+#define Perl_do_readline CPerlObj::Perl_do_readline
+#define do_readline Perl_do_readline
+#define Perl_do_chomp CPerlObj::Perl_do_chomp
+#define do_chomp Perl_do_chomp
+#define Perl_do_seek CPerlObj::Perl_do_seek
+#define do_seek Perl_do_seek
+#define Perl_do_sprintf CPerlObj::Perl_do_sprintf
+#define do_sprintf Perl_do_sprintf
+#define Perl_do_sysseek CPerlObj::Perl_do_sysseek
+#define do_sysseek Perl_do_sysseek
+#define Perl_do_tell CPerlObj::Perl_do_tell
+#define do_tell Perl_do_tell
+#define Perl_do_trans CPerlObj::Perl_do_trans
+#define do_trans Perl_do_trans
+#define Perl_do_vecget CPerlObj::Perl_do_vecget
+#define do_vecget Perl_do_vecget
+#define Perl_do_vecset CPerlObj::Perl_do_vecset
+#define do_vecset Perl_do_vecset
+#define Perl_do_vop CPerlObj::Perl_do_vop
+#define do_vop Perl_do_vop
+#define Perl_dofile CPerlObj::Perl_dofile
+#define dofile Perl_dofile
+#define Perl_dowantarray CPerlObj::Perl_dowantarray
+#define dowantarray Perl_dowantarray
+#define Perl_dump_all CPerlObj::Perl_dump_all
+#define dump_all Perl_dump_all
+#define Perl_dump_eval CPerlObj::Perl_dump_eval
+#define dump_eval Perl_dump_eval
+#if defined(DUMP_FDS)
+#define Perl_dump_fds CPerlObj::Perl_dump_fds
+#define dump_fds Perl_dump_fds
+#endif
+#define Perl_dump_form CPerlObj::Perl_dump_form
+#define dump_form Perl_dump_form
+#define Perl_gv_dump CPerlObj::Perl_gv_dump
+#define gv_dump Perl_gv_dump
+#define Perl_op_dump CPerlObj::Perl_op_dump
+#define op_dump Perl_op_dump
+#define Perl_pmop_dump CPerlObj::Perl_pmop_dump
+#define pmop_dump Perl_pmop_dump
+#define Perl_dump_packsubs CPerlObj::Perl_dump_packsubs
+#define dump_packsubs Perl_dump_packsubs
+#define Perl_dump_sub CPerlObj::Perl_dump_sub
+#define dump_sub Perl_dump_sub
+#define Perl_fbm_compile CPerlObj::Perl_fbm_compile
+#define fbm_compile Perl_fbm_compile
+#define Perl_fbm_instr CPerlObj::Perl_fbm_instr
+#define fbm_instr Perl_fbm_instr
+#define Perl_find_script CPerlObj::Perl_find_script
+#define find_script Perl_find_script
+#if defined(USE_THREADS)
+#define Perl_find_threadsv CPerlObj::Perl_find_threadsv
+#define find_threadsv Perl_find_threadsv
+#endif
+#define Perl_force_list CPerlObj::Perl_force_list
+#define force_list Perl_force_list
+#define Perl_fold_constants CPerlObj::Perl_fold_constants
+#define fold_constants Perl_fold_constants
+#define Perl_form CPerlObj::Perl_form
+#define form Perl_form
+#define Perl_vform CPerlObj::Perl_vform
+#define vform Perl_vform
+#define Perl_free_tmps CPerlObj::Perl_free_tmps
+#define free_tmps Perl_free_tmps
+#define Perl_gen_constant_list CPerlObj::Perl_gen_constant_list
+#define gen_constant_list Perl_gen_constant_list
+#if !defined(HAS_GETENV_LEN)
+#define Perl_getenv_len CPerlObj::Perl_getenv_len
+#define getenv_len Perl_getenv_len
+#endif
+#define Perl_gp_free CPerlObj::Perl_gp_free
+#define gp_free Perl_gp_free
+#define Perl_gp_ref CPerlObj::Perl_gp_ref
+#define gp_ref Perl_gp_ref
+#define Perl_gv_AVadd CPerlObj::Perl_gv_AVadd
+#define gv_AVadd Perl_gv_AVadd
+#define Perl_gv_HVadd CPerlObj::Perl_gv_HVadd
+#define gv_HVadd Perl_gv_HVadd
+#define Perl_gv_IOadd CPerlObj::Perl_gv_IOadd
+#define gv_IOadd Perl_gv_IOadd
+#define Perl_gv_autoload4 CPerlObj::Perl_gv_autoload4
+#define gv_autoload4 Perl_gv_autoload4
+#define Perl_gv_check CPerlObj::Perl_gv_check
+#define gv_check Perl_gv_check
+#define Perl_gv_efullname CPerlObj::Perl_gv_efullname
+#define gv_efullname Perl_gv_efullname
+#define Perl_gv_efullname3 CPerlObj::Perl_gv_efullname3
+#define gv_efullname3 Perl_gv_efullname3
+#define Perl_gv_fetchfile CPerlObj::Perl_gv_fetchfile
+#define gv_fetchfile Perl_gv_fetchfile
+#define Perl_gv_fetchmeth CPerlObj::Perl_gv_fetchmeth
+#define gv_fetchmeth Perl_gv_fetchmeth
+#define Perl_gv_fetchmethod CPerlObj::Perl_gv_fetchmethod
+#define gv_fetchmethod Perl_gv_fetchmethod
+#define Perl_gv_fetchmethod_autoload CPerlObj::Perl_gv_fetchmethod_autoload
+#define gv_fetchmethod_autoload Perl_gv_fetchmethod_autoload
+#define Perl_gv_fetchpv CPerlObj::Perl_gv_fetchpv
+#define gv_fetchpv Perl_gv_fetchpv
+#define Perl_gv_fullname CPerlObj::Perl_gv_fullname
+#define gv_fullname Perl_gv_fullname
+#define Perl_gv_fullname3 CPerlObj::Perl_gv_fullname3
+#define gv_fullname3 Perl_gv_fullname3
+#define Perl_gv_init CPerlObj::Perl_gv_init
+#define gv_init Perl_gv_init
+#define Perl_gv_stashpv CPerlObj::Perl_gv_stashpv
+#define gv_stashpv Perl_gv_stashpv
+#define Perl_gv_stashpvn CPerlObj::Perl_gv_stashpvn
+#define gv_stashpvn Perl_gv_stashpvn
+#define Perl_gv_stashsv CPerlObj::Perl_gv_stashsv
+#define gv_stashsv Perl_gv_stashsv
+#define Perl_hv_clear CPerlObj::Perl_hv_clear
+#define hv_clear Perl_hv_clear
+#define Perl_hv_delayfree_ent CPerlObj::Perl_hv_delayfree_ent
+#define hv_delayfree_ent Perl_hv_delayfree_ent
+#define Perl_hv_delete CPerlObj::Perl_hv_delete
+#define hv_delete Perl_hv_delete
+#define Perl_hv_delete_ent CPerlObj::Perl_hv_delete_ent
+#define hv_delete_ent Perl_hv_delete_ent
+#define Perl_hv_exists CPerlObj::Perl_hv_exists
+#define hv_exists Perl_hv_exists
+#define Perl_hv_exists_ent CPerlObj::Perl_hv_exists_ent
+#define hv_exists_ent Perl_hv_exists_ent
+#define Perl_hv_fetch CPerlObj::Perl_hv_fetch
+#define hv_fetch Perl_hv_fetch
+#define Perl_hv_fetch_ent CPerlObj::Perl_hv_fetch_ent
+#define hv_fetch_ent Perl_hv_fetch_ent
+#define Perl_hv_free_ent CPerlObj::Perl_hv_free_ent
+#define hv_free_ent Perl_hv_free_ent
+#define Perl_hv_iterinit CPerlObj::Perl_hv_iterinit
+#define hv_iterinit Perl_hv_iterinit
+#define Perl_hv_iterkey CPerlObj::Perl_hv_iterkey
+#define hv_iterkey Perl_hv_iterkey
+#define Perl_hv_iterkeysv CPerlObj::Perl_hv_iterkeysv
+#define hv_iterkeysv Perl_hv_iterkeysv
+#define Perl_hv_iternext CPerlObj::Perl_hv_iternext
+#define hv_iternext Perl_hv_iternext
+#define Perl_hv_iternextsv CPerlObj::Perl_hv_iternextsv
+#define hv_iternextsv Perl_hv_iternextsv
+#define Perl_hv_iterval CPerlObj::Perl_hv_iterval
+#define hv_iterval Perl_hv_iterval
+#define Perl_hv_ksplit CPerlObj::Perl_hv_ksplit
+#define hv_ksplit Perl_hv_ksplit
+#define Perl_hv_magic CPerlObj::Perl_hv_magic
+#define hv_magic Perl_hv_magic
+#define Perl_hv_store CPerlObj::Perl_hv_store
+#define hv_store Perl_hv_store
+#define Perl_hv_store_ent CPerlObj::Perl_hv_store_ent
+#define hv_store_ent Perl_hv_store_ent
+#define Perl_hv_undef CPerlObj::Perl_hv_undef
+#define hv_undef Perl_hv_undef
+#define Perl_ibcmp CPerlObj::Perl_ibcmp
+#define ibcmp Perl_ibcmp
+#define Perl_ibcmp_locale CPerlObj::Perl_ibcmp_locale
+#define ibcmp_locale Perl_ibcmp_locale
+#define Perl_ingroup CPerlObj::Perl_ingroup
+#define ingroup Perl_ingroup
+#define Perl_init_debugger CPerlObj::Perl_init_debugger
+#define init_debugger Perl_init_debugger
+#define Perl_init_stacks CPerlObj::Perl_init_stacks
+#define init_stacks Perl_init_stacks
+#define Perl_intro_my CPerlObj::Perl_intro_my
+#define intro_my Perl_intro_my
+#define Perl_instr CPerlObj::Perl_instr
+#define instr Perl_instr
+#define Perl_io_close CPerlObj::Perl_io_close
+#define io_close Perl_io_close
+#define Perl_invert CPerlObj::Perl_invert
+#define invert Perl_invert
+#define Perl_is_uni_alnum CPerlObj::Perl_is_uni_alnum
+#define is_uni_alnum Perl_is_uni_alnum
+#define Perl_is_uni_alnumc CPerlObj::Perl_is_uni_alnumc
+#define is_uni_alnumc Perl_is_uni_alnumc
+#define Perl_is_uni_idfirst CPerlObj::Perl_is_uni_idfirst
+#define is_uni_idfirst Perl_is_uni_idfirst
+#define Perl_is_uni_alpha CPerlObj::Perl_is_uni_alpha
+#define is_uni_alpha Perl_is_uni_alpha
+#define Perl_is_uni_ascii CPerlObj::Perl_is_uni_ascii
+#define is_uni_ascii Perl_is_uni_ascii
+#define Perl_is_uni_space CPerlObj::Perl_is_uni_space
+#define is_uni_space Perl_is_uni_space
+#define Perl_is_uni_cntrl CPerlObj::Perl_is_uni_cntrl
+#define is_uni_cntrl Perl_is_uni_cntrl
+#define Perl_is_uni_graph CPerlObj::Perl_is_uni_graph
+#define is_uni_graph Perl_is_uni_graph
+#define Perl_is_uni_digit CPerlObj::Perl_is_uni_digit
+#define is_uni_digit Perl_is_uni_digit
+#define Perl_is_uni_upper CPerlObj::Perl_is_uni_upper
+#define is_uni_upper Perl_is_uni_upper
+#define Perl_is_uni_lower CPerlObj::Perl_is_uni_lower
+#define is_uni_lower Perl_is_uni_lower
+#define Perl_is_uni_print CPerlObj::Perl_is_uni_print
+#define is_uni_print Perl_is_uni_print
+#define Perl_is_uni_punct CPerlObj::Perl_is_uni_punct
+#define is_uni_punct Perl_is_uni_punct
+#define Perl_is_uni_xdigit CPerlObj::Perl_is_uni_xdigit
+#define is_uni_xdigit Perl_is_uni_xdigit
+#define Perl_to_uni_upper CPerlObj::Perl_to_uni_upper
+#define to_uni_upper Perl_to_uni_upper
+#define Perl_to_uni_title CPerlObj::Perl_to_uni_title
+#define to_uni_title Perl_to_uni_title
+#define Perl_to_uni_lower CPerlObj::Perl_to_uni_lower
+#define to_uni_lower Perl_to_uni_lower
+#define Perl_is_uni_alnum_lc CPerlObj::Perl_is_uni_alnum_lc
+#define is_uni_alnum_lc Perl_is_uni_alnum_lc
+#define Perl_is_uni_alnumc_lc CPerlObj::Perl_is_uni_alnumc_lc
+#define is_uni_alnumc_lc Perl_is_uni_alnumc_lc
+#define Perl_is_uni_idfirst_lc CPerlObj::Perl_is_uni_idfirst_lc
+#define is_uni_idfirst_lc Perl_is_uni_idfirst_lc
+#define Perl_is_uni_alpha_lc CPerlObj::Perl_is_uni_alpha_lc
+#define is_uni_alpha_lc Perl_is_uni_alpha_lc
+#define Perl_is_uni_ascii_lc CPerlObj::Perl_is_uni_ascii_lc
+#define is_uni_ascii_lc Perl_is_uni_ascii_lc
+#define Perl_is_uni_space_lc CPerlObj::Perl_is_uni_space_lc
+#define is_uni_space_lc Perl_is_uni_space_lc
+#define Perl_is_uni_cntrl_lc CPerlObj::Perl_is_uni_cntrl_lc
+#define is_uni_cntrl_lc Perl_is_uni_cntrl_lc
+#define Perl_is_uni_graph_lc CPerlObj::Perl_is_uni_graph_lc
+#define is_uni_graph_lc Perl_is_uni_graph_lc
+#define Perl_is_uni_digit_lc CPerlObj::Perl_is_uni_digit_lc
+#define is_uni_digit_lc Perl_is_uni_digit_lc
+#define Perl_is_uni_upper_lc CPerlObj::Perl_is_uni_upper_lc
+#define is_uni_upper_lc Perl_is_uni_upper_lc
+#define Perl_is_uni_lower_lc CPerlObj::Perl_is_uni_lower_lc
+#define is_uni_lower_lc Perl_is_uni_lower_lc
+#define Perl_is_uni_print_lc CPerlObj::Perl_is_uni_print_lc
+#define is_uni_print_lc Perl_is_uni_print_lc
+#define Perl_is_uni_punct_lc CPerlObj::Perl_is_uni_punct_lc
+#define is_uni_punct_lc Perl_is_uni_punct_lc
+#define Perl_is_uni_xdigit_lc CPerlObj::Perl_is_uni_xdigit_lc
+#define is_uni_xdigit_lc Perl_is_uni_xdigit_lc
+#define Perl_to_uni_upper_lc CPerlObj::Perl_to_uni_upper_lc
+#define to_uni_upper_lc Perl_to_uni_upper_lc
+#define Perl_to_uni_title_lc CPerlObj::Perl_to_uni_title_lc
+#define to_uni_title_lc Perl_to_uni_title_lc
+#define Perl_to_uni_lower_lc CPerlObj::Perl_to_uni_lower_lc
+#define to_uni_lower_lc Perl_to_uni_lower_lc
+#define Perl_is_utf8_char CPerlObj::Perl_is_utf8_char
+#define is_utf8_char Perl_is_utf8_char
+#define Perl_is_utf8_alnum CPerlObj::Perl_is_utf8_alnum
+#define is_utf8_alnum Perl_is_utf8_alnum
+#define Perl_is_utf8_alnumc CPerlObj::Perl_is_utf8_alnumc
+#define is_utf8_alnumc Perl_is_utf8_alnumc
+#define Perl_is_utf8_idfirst CPerlObj::Perl_is_utf8_idfirst
+#define is_utf8_idfirst Perl_is_utf8_idfirst
+#define Perl_is_utf8_alpha CPerlObj::Perl_is_utf8_alpha
+#define is_utf8_alpha Perl_is_utf8_alpha
+#define Perl_is_utf8_ascii CPerlObj::Perl_is_utf8_ascii
+#define is_utf8_ascii Perl_is_utf8_ascii
+#define Perl_is_utf8_space CPerlObj::Perl_is_utf8_space
+#define is_utf8_space Perl_is_utf8_space
+#define Perl_is_utf8_cntrl CPerlObj::Perl_is_utf8_cntrl
+#define is_utf8_cntrl Perl_is_utf8_cntrl
+#define Perl_is_utf8_digit CPerlObj::Perl_is_utf8_digit
+#define is_utf8_digit Perl_is_utf8_digit
+#define Perl_is_utf8_graph CPerlObj::Perl_is_utf8_graph
+#define is_utf8_graph Perl_is_utf8_graph
+#define Perl_is_utf8_upper CPerlObj::Perl_is_utf8_upper
+#define is_utf8_upper Perl_is_utf8_upper
+#define Perl_is_utf8_lower CPerlObj::Perl_is_utf8_lower
+#define is_utf8_lower Perl_is_utf8_lower
+#define Perl_is_utf8_print CPerlObj::Perl_is_utf8_print
+#define is_utf8_print Perl_is_utf8_print
+#define Perl_is_utf8_punct CPerlObj::Perl_is_utf8_punct
+#define is_utf8_punct Perl_is_utf8_punct
+#define Perl_is_utf8_xdigit CPerlObj::Perl_is_utf8_xdigit
+#define is_utf8_xdigit Perl_is_utf8_xdigit
+#define Perl_is_utf8_mark CPerlObj::Perl_is_utf8_mark
+#define is_utf8_mark Perl_is_utf8_mark
+#define Perl_jmaybe CPerlObj::Perl_jmaybe
+#define jmaybe Perl_jmaybe
+#define Perl_keyword CPerlObj::Perl_keyword
+#define keyword Perl_keyword
+#define Perl_leave_scope CPerlObj::Perl_leave_scope
+#define leave_scope Perl_leave_scope
+#define Perl_lex_end CPerlObj::Perl_lex_end
+#define lex_end Perl_lex_end
+#define Perl_lex_start CPerlObj::Perl_lex_start
+#define lex_start Perl_lex_start
+#define Perl_linklist CPerlObj::Perl_linklist
+#define linklist Perl_linklist
+#define Perl_list CPerlObj::Perl_list
+#define list Perl_list
+#define Perl_listkids CPerlObj::Perl_listkids
+#define listkids Perl_listkids
+#define Perl_load_module CPerlObj::Perl_load_module
+#define load_module Perl_load_module
+#define Perl_vload_module CPerlObj::Perl_vload_module
+#define vload_module Perl_vload_module
+#define Perl_localize CPerlObj::Perl_localize
+#define localize Perl_localize
+#define Perl_looks_like_number CPerlObj::Perl_looks_like_number
+#define looks_like_number Perl_looks_like_number
+#define Perl_magic_clearenv CPerlObj::Perl_magic_clearenv
+#define magic_clearenv Perl_magic_clearenv
+#define Perl_magic_clear_all_env CPerlObj::Perl_magic_clear_all_env
+#define magic_clear_all_env Perl_magic_clear_all_env
+#define Perl_magic_clearpack CPerlObj::Perl_magic_clearpack
+#define magic_clearpack Perl_magic_clearpack
+#define Perl_magic_clearsig CPerlObj::Perl_magic_clearsig
+#define magic_clearsig Perl_magic_clearsig
+#define Perl_magic_existspack CPerlObj::Perl_magic_existspack
+#define magic_existspack Perl_magic_existspack
+#define Perl_magic_freeregexp CPerlObj::Perl_magic_freeregexp
+#define magic_freeregexp Perl_magic_freeregexp
+#define Perl_magic_get CPerlObj::Perl_magic_get
+#define magic_get Perl_magic_get
+#define Perl_magic_getarylen CPerlObj::Perl_magic_getarylen
+#define magic_getarylen Perl_magic_getarylen
+#define Perl_magic_getdefelem CPerlObj::Perl_magic_getdefelem
+#define magic_getdefelem Perl_magic_getdefelem
+#define Perl_magic_getglob CPerlObj::Perl_magic_getglob
+#define magic_getglob Perl_magic_getglob
+#define Perl_magic_getnkeys CPerlObj::Perl_magic_getnkeys
+#define magic_getnkeys Perl_magic_getnkeys
+#define Perl_magic_getpack CPerlObj::Perl_magic_getpack
+#define magic_getpack Perl_magic_getpack
+#define Perl_magic_getpos CPerlObj::Perl_magic_getpos
+#define magic_getpos Perl_magic_getpos
+#define Perl_magic_getsig CPerlObj::Perl_magic_getsig
+#define magic_getsig Perl_magic_getsig
+#define Perl_magic_getsubstr CPerlObj::Perl_magic_getsubstr
+#define magic_getsubstr Perl_magic_getsubstr
+#define Perl_magic_gettaint CPerlObj::Perl_magic_gettaint
+#define magic_gettaint Perl_magic_gettaint
+#define Perl_magic_getuvar CPerlObj::Perl_magic_getuvar
+#define magic_getuvar Perl_magic_getuvar
+#define Perl_magic_getvec CPerlObj::Perl_magic_getvec
+#define magic_getvec Perl_magic_getvec
+#define Perl_magic_len CPerlObj::Perl_magic_len
+#define magic_len Perl_magic_len
+#if defined(USE_THREADS)
+#define Perl_magic_mutexfree CPerlObj::Perl_magic_mutexfree
+#define magic_mutexfree Perl_magic_mutexfree
+#endif
+#define Perl_magic_nextpack CPerlObj::Perl_magic_nextpack
+#define magic_nextpack Perl_magic_nextpack
+#define Perl_magic_regdata_cnt CPerlObj::Perl_magic_regdata_cnt
+#define magic_regdata_cnt Perl_magic_regdata_cnt
+#define Perl_magic_regdatum_get CPerlObj::Perl_magic_regdatum_get
+#define magic_regdatum_get Perl_magic_regdatum_get
+#define Perl_magic_set CPerlObj::Perl_magic_set
+#define magic_set Perl_magic_set
+#define Perl_magic_setamagic CPerlObj::Perl_magic_setamagic
+#define magic_setamagic Perl_magic_setamagic
+#define Perl_magic_setarylen CPerlObj::Perl_magic_setarylen
+#define magic_setarylen Perl_magic_setarylen
+#define Perl_magic_setbm CPerlObj::Perl_magic_setbm
+#define magic_setbm Perl_magic_setbm
+#define Perl_magic_setdbline CPerlObj::Perl_magic_setdbline
+#define magic_setdbline Perl_magic_setdbline
+#if defined(USE_LOCALE_COLLATE)
+#define Perl_magic_setcollxfrm CPerlObj::Perl_magic_setcollxfrm
+#define magic_setcollxfrm Perl_magic_setcollxfrm
+#endif
+#define Perl_magic_setdefelem CPerlObj::Perl_magic_setdefelem
+#define magic_setdefelem Perl_magic_setdefelem
+#define Perl_magic_setenv CPerlObj::Perl_magic_setenv
+#define magic_setenv Perl_magic_setenv
+#define Perl_magic_setfm CPerlObj::Perl_magic_setfm
+#define magic_setfm Perl_magic_setfm
+#define Perl_magic_setisa CPerlObj::Perl_magic_setisa
+#define magic_setisa Perl_magic_setisa
+#define Perl_magic_setglob CPerlObj::Perl_magic_setglob
+#define magic_setglob Perl_magic_setglob
+#define Perl_magic_setmglob CPerlObj::Perl_magic_setmglob
+#define magic_setmglob Perl_magic_setmglob
+#define Perl_magic_setnkeys CPerlObj::Perl_magic_setnkeys
+#define magic_setnkeys Perl_magic_setnkeys
+#define Perl_magic_setpack CPerlObj::Perl_magic_setpack
+#define magic_setpack Perl_magic_setpack
+#define Perl_magic_setpos CPerlObj::Perl_magic_setpos
+#define magic_setpos Perl_magic_setpos
+#define Perl_magic_setsig CPerlObj::Perl_magic_setsig
+#define magic_setsig Perl_magic_setsig
+#define Perl_magic_setsubstr CPerlObj::Perl_magic_setsubstr
+#define magic_setsubstr Perl_magic_setsubstr
+#define Perl_magic_settaint CPerlObj::Perl_magic_settaint
+#define magic_settaint Perl_magic_settaint
+#define Perl_magic_setuvar CPerlObj::Perl_magic_setuvar
+#define magic_setuvar Perl_magic_setuvar
+#define Perl_magic_setvec CPerlObj::Perl_magic_setvec
+#define magic_setvec Perl_magic_setvec
+#define Perl_magic_set_all_env CPerlObj::Perl_magic_set_all_env
+#define magic_set_all_env Perl_magic_set_all_env
+#define Perl_magic_sizepack CPerlObj::Perl_magic_sizepack
+#define magic_sizepack Perl_magic_sizepack
+#define Perl_magic_wipepack CPerlObj::Perl_magic_wipepack
+#define magic_wipepack Perl_magic_wipepack
+#define Perl_magicname CPerlObj::Perl_magicname
+#define magicname Perl_magicname
+#define Perl_markstack_grow CPerlObj::Perl_markstack_grow
+#define markstack_grow Perl_markstack_grow
+#if defined(USE_LOCALE_COLLATE)
+#define Perl_mem_collxfrm CPerlObj::Perl_mem_collxfrm
+#define mem_collxfrm Perl_mem_collxfrm
+#endif
+#define Perl_mess CPerlObj::Perl_mess
+#define mess Perl_mess
+#define Perl_vmess CPerlObj::Perl_vmess
+#define vmess Perl_vmess
+#define Perl_qerror CPerlObj::Perl_qerror
+#define qerror Perl_qerror
+#define Perl_mg_clear CPerlObj::Perl_mg_clear
+#define mg_clear Perl_mg_clear
+#define Perl_mg_copy CPerlObj::Perl_mg_copy
+#define mg_copy Perl_mg_copy
+#define Perl_mg_find CPerlObj::Perl_mg_find
+#define mg_find Perl_mg_find
+#define Perl_mg_free CPerlObj::Perl_mg_free
+#define mg_free Perl_mg_free
+#define Perl_mg_get CPerlObj::Perl_mg_get
+#define mg_get Perl_mg_get
+#define Perl_mg_length CPerlObj::Perl_mg_length
+#define mg_length Perl_mg_length
+#define Perl_mg_magical CPerlObj::Perl_mg_magical
+#define mg_magical Perl_mg_magical
+#define Perl_mg_set CPerlObj::Perl_mg_set
+#define mg_set Perl_mg_set
+#define Perl_mg_size CPerlObj::Perl_mg_size
+#define mg_size Perl_mg_size
+#define Perl_mod CPerlObj::Perl_mod
+#define mod Perl_mod
+#define Perl_mode_from_discipline CPerlObj::Perl_mode_from_discipline
+#define mode_from_discipline Perl_mode_from_discipline
+#define Perl_moreswitches CPerlObj::Perl_moreswitches
+#define moreswitches Perl_moreswitches
+#define Perl_my CPerlObj::Perl_my
+#define my Perl_my
+#define Perl_my_atof CPerlObj::Perl_my_atof
+#define my_atof Perl_my_atof
+#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
+#define Perl_my_bcopy CPerlObj::Perl_my_bcopy
+#define my_bcopy Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+#define Perl_my_bzero CPerlObj::Perl_my_bzero
+#define my_bzero Perl_my_bzero
+#endif
+#define Perl_my_exit CPerlObj::Perl_my_exit
+#define my_exit Perl_my_exit
+#define Perl_my_failure_exit CPerlObj::Perl_my_failure_exit
+#define my_failure_exit Perl_my_failure_exit
+#define Perl_my_fflush_all CPerlObj::Perl_my_fflush_all
+#define my_fflush_all Perl_my_fflush_all
+#define Perl_my_lstat CPerlObj::Perl_my_lstat
+#define my_lstat Perl_my_lstat
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+#define Perl_my_memcmp CPerlObj::Perl_my_memcmp
+#define my_memcmp Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
+#define Perl_my_memset CPerlObj::Perl_my_memset
+#define my_memset Perl_my_memset
+#endif
+#if !defined(PERL_OBJECT)
+#define Perl_my_pclose CPerlObj::Perl_my_pclose
+#define my_pclose Perl_my_pclose
+#define Perl_my_popen CPerlObj::Perl_my_popen
+#define my_popen Perl_my_popen
+#endif
+#define Perl_my_setenv CPerlObj::Perl_my_setenv
+#define my_setenv Perl_my_setenv
+#define Perl_my_stat CPerlObj::Perl_my_stat
+#define my_stat Perl_my_stat
+#if defined(MYSWAP)
+#define Perl_my_swap CPerlObj::Perl_my_swap
+#define my_swap Perl_my_swap
+#define Perl_my_htonl CPerlObj::Perl_my_htonl
+#define my_htonl Perl_my_htonl
+#define Perl_my_ntohl CPerlObj::Perl_my_ntohl
+#define my_ntohl Perl_my_ntohl
+#endif
+#define Perl_my_unexec CPerlObj::Perl_my_unexec
+#define my_unexec Perl_my_unexec
+#define Perl_newANONLIST CPerlObj::Perl_newANONLIST
+#define newANONLIST Perl_newANONLIST
+#define Perl_newANONHASH CPerlObj::Perl_newANONHASH
+#define newANONHASH Perl_newANONHASH
+#define Perl_newANONSUB CPerlObj::Perl_newANONSUB
+#define newANONSUB Perl_newANONSUB
+#define Perl_newASSIGNOP CPerlObj::Perl_newASSIGNOP
+#define newASSIGNOP Perl_newASSIGNOP
+#define Perl_newCONDOP CPerlObj::Perl_newCONDOP
+#define newCONDOP Perl_newCONDOP
+#define Perl_newCONSTSUB CPerlObj::Perl_newCONSTSUB
+#define newCONSTSUB Perl_newCONSTSUB
+#define Perl_newFORM CPerlObj::Perl_newFORM
+#define newFORM Perl_newFORM
+#define Perl_newFOROP CPerlObj::Perl_newFOROP
+#define newFOROP Perl_newFOROP
+#define Perl_newLOGOP CPerlObj::Perl_newLOGOP
+#define newLOGOP Perl_newLOGOP
+#define Perl_newLOOPEX CPerlObj::Perl_newLOOPEX
+#define newLOOPEX Perl_newLOOPEX
+#define Perl_newLOOPOP CPerlObj::Perl_newLOOPOP
+#define newLOOPOP Perl_newLOOPOP
+#define Perl_newNULLLIST CPerlObj::Perl_newNULLLIST
+#define newNULLLIST Perl_newNULLLIST
+#define Perl_newOP CPerlObj::Perl_newOP
+#define newOP Perl_newOP
+#define Perl_newPROG CPerlObj::Perl_newPROG
+#define newPROG Perl_newPROG
+#define Perl_newRANGE CPerlObj::Perl_newRANGE
+#define newRANGE Perl_newRANGE
+#define Perl_newSLICEOP CPerlObj::Perl_newSLICEOP
+#define newSLICEOP Perl_newSLICEOP
+#define Perl_newSTATEOP CPerlObj::Perl_newSTATEOP
+#define newSTATEOP Perl_newSTATEOP
+#define Perl_newSUB CPerlObj::Perl_newSUB
+#define newSUB Perl_newSUB
+#define Perl_newXS CPerlObj::Perl_newXS
+#define newXS Perl_newXS
+#define Perl_newAV CPerlObj::Perl_newAV
+#define newAV Perl_newAV
+#define Perl_newAVREF CPerlObj::Perl_newAVREF
+#define newAVREF Perl_newAVREF
+#define Perl_newBINOP CPerlObj::Perl_newBINOP
+#define newBINOP Perl_newBINOP
+#define Perl_newCVREF CPerlObj::Perl_newCVREF
+#define newCVREF Perl_newCVREF
+#define Perl_newGVOP CPerlObj::Perl_newGVOP
+#define newGVOP Perl_newGVOP
+#define Perl_newGVgen CPerlObj::Perl_newGVgen
+#define newGVgen Perl_newGVgen
+#define Perl_newGVREF CPerlObj::Perl_newGVREF
+#define newGVREF Perl_newGVREF
+#define Perl_newHVREF CPerlObj::Perl_newHVREF
+#define newHVREF Perl_newHVREF
+#define Perl_newHV CPerlObj::Perl_newHV
+#define newHV Perl_newHV
+#define Perl_newHVhv CPerlObj::Perl_newHVhv
+#define newHVhv Perl_newHVhv
+#define Perl_newIO CPerlObj::Perl_newIO
+#define newIO Perl_newIO
+#define Perl_newLISTOP CPerlObj::Perl_newLISTOP
+#define newLISTOP Perl_newLISTOP
+#define Perl_newPADOP CPerlObj::Perl_newPADOP
+#define newPADOP Perl_newPADOP
+#define Perl_newPMOP CPerlObj::Perl_newPMOP
+#define newPMOP Perl_newPMOP
+#define Perl_newPVOP CPerlObj::Perl_newPVOP
+#define newPVOP Perl_newPVOP
+#define Perl_newRV CPerlObj::Perl_newRV
+#define newRV Perl_newRV
+#define Perl_newRV_noinc CPerlObj::Perl_newRV_noinc
+#define newRV_noinc Perl_newRV_noinc
+#define Perl_newSV CPerlObj::Perl_newSV
+#define newSV Perl_newSV
+#define Perl_newSVREF CPerlObj::Perl_newSVREF
+#define newSVREF Perl_newSVREF
+#define Perl_newSVOP CPerlObj::Perl_newSVOP
+#define newSVOP Perl_newSVOP
+#define Perl_newSViv CPerlObj::Perl_newSViv
+#define newSViv Perl_newSViv
+#define Perl_newSVuv CPerlObj::Perl_newSVuv
+#define newSVuv Perl_newSVuv
+#define Perl_newSVnv CPerlObj::Perl_newSVnv
+#define newSVnv Perl_newSVnv
+#define Perl_newSVpv CPerlObj::Perl_newSVpv
+#define newSVpv Perl_newSVpv
+#define Perl_newSVpvn CPerlObj::Perl_newSVpvn
+#define newSVpvn Perl_newSVpvn
+#define Perl_newSVpvf CPerlObj::Perl_newSVpvf
+#define newSVpvf Perl_newSVpvf
+#define Perl_vnewSVpvf CPerlObj::Perl_vnewSVpvf
+#define vnewSVpvf Perl_vnewSVpvf
+#define Perl_newSVrv CPerlObj::Perl_newSVrv
+#define newSVrv Perl_newSVrv
+#define Perl_newSVsv CPerlObj::Perl_newSVsv
+#define newSVsv Perl_newSVsv
+#define Perl_newUNOP CPerlObj::Perl_newUNOP
+#define newUNOP Perl_newUNOP
+#define Perl_newWHILEOP CPerlObj::Perl_newWHILEOP
+#define newWHILEOP Perl_newWHILEOP
+#define Perl_new_stackinfo CPerlObj::Perl_new_stackinfo
+#define new_stackinfo Perl_new_stackinfo
+#define Perl_nextargv CPerlObj::Perl_nextargv
+#define nextargv Perl_nextargv
+#define Perl_ninstr CPerlObj::Perl_ninstr
+#define ninstr Perl_ninstr
+#define Perl_oopsCV CPerlObj::Perl_oopsCV
+#define oopsCV Perl_oopsCV
+#define Perl_op_free CPerlObj::Perl_op_free
+#define op_free Perl_op_free
+#define Perl_package CPerlObj::Perl_package
+#define package Perl_package
+#define Perl_pad_alloc CPerlObj::Perl_pad_alloc
+#define pad_alloc Perl_pad_alloc
+#define Perl_pad_allocmy CPerlObj::Perl_pad_allocmy
+#define pad_allocmy Perl_pad_allocmy
+#define Perl_pad_findmy CPerlObj::Perl_pad_findmy
+#define pad_findmy Perl_pad_findmy
+#define Perl_oopsAV CPerlObj::Perl_oopsAV
+#define oopsAV Perl_oopsAV
+#define Perl_oopsHV CPerlObj::Perl_oopsHV
+#define oopsHV Perl_oopsHV
+#define Perl_pad_leavemy CPerlObj::Perl_pad_leavemy
+#define pad_leavemy Perl_pad_leavemy
+#define Perl_pad_sv CPerlObj::Perl_pad_sv
+#define pad_sv Perl_pad_sv
+#define Perl_pad_free CPerlObj::Perl_pad_free
+#define pad_free Perl_pad_free
+#define Perl_pad_reset CPerlObj::Perl_pad_reset
+#define pad_reset Perl_pad_reset
+#define Perl_pad_swipe CPerlObj::Perl_pad_swipe
+#define pad_swipe Perl_pad_swipe
+#define Perl_peep CPerlObj::Perl_peep
+#define peep Perl_peep
+#if defined(PERL_OBJECT)
+#define Perl_construct CPerlObj::Perl_construct
+#define Perl_destruct CPerlObj::Perl_destruct
+#define Perl_free CPerlObj::Perl_free
+#define Perl_run CPerlObj::Perl_run
+#define Perl_parse CPerlObj::Perl_parse
+#endif
+#if defined(USE_THREADS)
+#define Perl_new_struct_thread CPerlObj::Perl_new_struct_thread
+#define new_struct_thread Perl_new_struct_thread
+#endif
+#define Perl_call_atexit CPerlObj::Perl_call_atexit
+#define call_atexit Perl_call_atexit
+#define Perl_call_argv CPerlObj::Perl_call_argv
+#define call_argv Perl_call_argv
+#define Perl_call_method CPerlObj::Perl_call_method
+#define call_method Perl_call_method
+#define Perl_call_pv CPerlObj::Perl_call_pv
+#define call_pv Perl_call_pv
+#define Perl_call_sv CPerlObj::Perl_call_sv
+#define call_sv Perl_call_sv
+#define Perl_eval_pv CPerlObj::Perl_eval_pv
+#define eval_pv Perl_eval_pv
+#define Perl_eval_sv CPerlObj::Perl_eval_sv
+#define eval_sv Perl_eval_sv
+#define Perl_get_sv CPerlObj::Perl_get_sv
+#define get_sv Perl_get_sv
+#define Perl_get_av CPerlObj::Perl_get_av
+#define get_av Perl_get_av
+#define Perl_get_hv CPerlObj::Perl_get_hv
+#define get_hv Perl_get_hv
+#define Perl_get_cv CPerlObj::Perl_get_cv
+#define get_cv Perl_get_cv
+#define Perl_init_i18nl10n CPerlObj::Perl_init_i18nl10n
+#define init_i18nl10n Perl_init_i18nl10n
+#define Perl_init_i18nl14n CPerlObj::Perl_init_i18nl14n
+#define init_i18nl14n Perl_init_i18nl14n
+#define Perl_new_collate CPerlObj::Perl_new_collate
+#define new_collate Perl_new_collate
+#define Perl_new_ctype CPerlObj::Perl_new_ctype
+#define new_ctype Perl_new_ctype
+#define Perl_new_numeric CPerlObj::Perl_new_numeric
+#define new_numeric Perl_new_numeric
+#define Perl_set_numeric_local CPerlObj::Perl_set_numeric_local
+#define set_numeric_local Perl_set_numeric_local
+#define Perl_set_numeric_radix CPerlObj::Perl_set_numeric_radix
+#define set_numeric_radix Perl_set_numeric_radix
+#define Perl_set_numeric_standard CPerlObj::Perl_set_numeric_standard
+#define set_numeric_standard Perl_set_numeric_standard
+#define Perl_require_pv CPerlObj::Perl_require_pv
+#define require_pv Perl_require_pv
+#define Perl_pidgone CPerlObj::Perl_pidgone
+#define pidgone Perl_pidgone
+#define Perl_pmflag CPerlObj::Perl_pmflag
+#define pmflag Perl_pmflag
+#define Perl_pmruntime CPerlObj::Perl_pmruntime
+#define pmruntime Perl_pmruntime
+#define Perl_pmtrans CPerlObj::Perl_pmtrans
+#define pmtrans Perl_pmtrans
+#define Perl_pop_return CPerlObj::Perl_pop_return
+#define pop_return Perl_pop_return
+#define Perl_pop_scope CPerlObj::Perl_pop_scope
+#define pop_scope Perl_pop_scope
+#define Perl_prepend_elem CPerlObj::Perl_prepend_elem
#define prepend_elem Perl_prepend_elem
-#define psig_name Perl_psig_name
-#define psig_ptr Perl_psig_ptr
+#define Perl_push_return CPerlObj::Perl_push_return
#define push_return Perl_push_return
+#define Perl_push_scope CPerlObj::Perl_push_scope
#define push_scope Perl_push_scope
-#define q Perl_q
-#define reall_srchlen Perl_reall_srchlen
+#define Perl_ref CPerlObj::Perl_ref
#define ref Perl_ref
+#define Perl_refkids CPerlObj::Perl_refkids
#define refkids Perl_refkids
+#define Perl_regdump CPerlObj::Perl_regdump
#define regdump Perl_regdump
+#define Perl_pregexec CPerlObj::Perl_pregexec
+#define pregexec Perl_pregexec
+#define Perl_pregfree CPerlObj::Perl_pregfree
+#define pregfree Perl_pregfree
+#define Perl_pregcomp CPerlObj::Perl_pregcomp
+#define pregcomp Perl_pregcomp
+#define Perl_re_intuit_start CPerlObj::Perl_re_intuit_start
+#define re_intuit_start Perl_re_intuit_start
+#define Perl_re_intuit_string CPerlObj::Perl_re_intuit_string
+#define re_intuit_string Perl_re_intuit_string
+#define Perl_regexec_flags CPerlObj::Perl_regexec_flags
#define regexec_flags Perl_regexec_flags
-#define regkind Perl_regkind
+#define Perl_regnext CPerlObj::Perl_regnext
#define regnext Perl_regnext
+#define Perl_regprop CPerlObj::Perl_regprop
#define regprop Perl_regprop
-#define repeat_amg Perl_repeat_amg
-#define repeat_ass_amg Perl_repeat_ass_amg
+#define Perl_repeatcpy CPerlObj::Perl_repeatcpy
#define repeatcpy Perl_repeatcpy
+#define Perl_rninstr CPerlObj::Perl_rninstr
#define rninstr Perl_rninstr
-#define rshift_amg Perl_rshift_amg
-#define rshift_ass_amg Perl_rshift_ass_amg
+#define Perl_rsignal CPerlObj::Perl_rsignal
#define rsignal Perl_rsignal
+#define Perl_rsignal_restore CPerlObj::Perl_rsignal_restore
#define rsignal_restore Perl_rsignal_restore
+#define Perl_rsignal_save CPerlObj::Perl_rsignal_save
#define rsignal_save Perl_rsignal_save
+#define Perl_rsignal_state CPerlObj::Perl_rsignal_state
#define rsignal_state Perl_rsignal_state
-#define runops_debug Perl_runops_debug
-#define runops_standard Perl_runops_standard
+#define Perl_rxres_free CPerlObj::Perl_rxres_free
#define rxres_free Perl_rxres_free
+#define Perl_rxres_restore CPerlObj::Perl_rxres_restore
#define rxres_restore Perl_rxres_restore
+#define Perl_rxres_save CPerlObj::Perl_rxres_save
#define rxres_save Perl_rxres_save
-#define safecalloc Perl_safecalloc
-#define safefree Perl_safefree
-#define safemalloc Perl_safemalloc
-#define saferealloc Perl_saferealloc
-#define safexcalloc Perl_safexcalloc
-#define safexfree Perl_safexfree
-#define safexmalloc Perl_safexmalloc
-#define safexrealloc Perl_safexrealloc
+#if !defined(HAS_RENAME)
+#define Perl_same_dirent CPerlObj::Perl_same_dirent
#define same_dirent Perl_same_dirent
-#define save_I16 Perl_save_I16
-#define save_I32 Perl_save_I32
+#endif
+#define Perl_savepv CPerlObj::Perl_savepv
+#define savepv Perl_savepv
+#define Perl_savepvn CPerlObj::Perl_savepvn
+#define savepvn Perl_savepvn
+#define Perl_savestack_grow CPerlObj::Perl_savestack_grow
+#define savestack_grow Perl_savestack_grow
+#define Perl_save_aelem CPerlObj::Perl_save_aelem
#define save_aelem Perl_save_aelem
+#define Perl_save_alloc CPerlObj::Perl_save_alloc
+#define save_alloc Perl_save_alloc
+#define Perl_save_aptr CPerlObj::Perl_save_aptr
#define save_aptr Perl_save_aptr
+#define Perl_save_ary CPerlObj::Perl_save_ary
#define save_ary Perl_save_ary
+#define Perl_save_clearsv CPerlObj::Perl_save_clearsv
#define save_clearsv Perl_save_clearsv
+#define Perl_save_delete CPerlObj::Perl_save_delete
#define save_delete Perl_save_delete
+#define Perl_save_destructor CPerlObj::Perl_save_destructor
#define save_destructor Perl_save_destructor
+#define Perl_save_destructor_x CPerlObj::Perl_save_destructor_x
+#define save_destructor_x Perl_save_destructor_x
+#define Perl_save_freesv CPerlObj::Perl_save_freesv
+#define save_freesv Perl_save_freesv
+#define Perl_save_freeop CPerlObj::Perl_save_freeop
#define save_freeop Perl_save_freeop
+#define Perl_save_freepv CPerlObj::Perl_save_freepv
#define save_freepv Perl_save_freepv
-#define save_freesv Perl_save_freesv
+#define Perl_save_generic_svref CPerlObj::Perl_save_generic_svref
#define save_generic_svref Perl_save_generic_svref
+#define Perl_save_gp CPerlObj::Perl_save_gp
#define save_gp Perl_save_gp
+#define Perl_save_hash CPerlObj::Perl_save_hash
#define save_hash Perl_save_hash
+#define Perl_save_helem CPerlObj::Perl_save_helem
#define save_helem Perl_save_helem
+#define Perl_save_hints CPerlObj::Perl_save_hints
#define save_hints Perl_save_hints
+#define Perl_save_hptr CPerlObj::Perl_save_hptr
#define save_hptr Perl_save_hptr
+#define Perl_save_I16 CPerlObj::Perl_save_I16
+#define save_I16 Perl_save_I16
+#define Perl_save_I32 CPerlObj::Perl_save_I32
+#define save_I32 Perl_save_I32
+#define Perl_save_I8 CPerlObj::Perl_save_I8
+#define save_I8 Perl_save_I8
+#define Perl_save_int CPerlObj::Perl_save_int
#define save_int Perl_save_int
+#define Perl_save_item CPerlObj::Perl_save_item
#define save_item Perl_save_item
+#define Perl_save_iv CPerlObj::Perl_save_iv
#define save_iv Perl_save_iv
+#define Perl_save_list CPerlObj::Perl_save_list
#define save_list Perl_save_list
+#define Perl_save_long CPerlObj::Perl_save_long
#define save_long Perl_save_long
+#define Perl_save_nogv CPerlObj::Perl_save_nogv
#define save_nogv Perl_save_nogv
+#define Perl_save_op CPerlObj::Perl_save_op
#define save_op Perl_save_op
-#define save_pptr Perl_save_pptr
+#define Perl_save_scalar CPerlObj::Perl_save_scalar
#define save_scalar Perl_save_scalar
+#define Perl_save_pptr CPerlObj::Perl_save_pptr
+#define save_pptr Perl_save_pptr
+#define Perl_save_vptr CPerlObj::Perl_save_vptr
+#define save_vptr Perl_save_vptr
+#define Perl_save_re_context CPerlObj::Perl_save_re_context
+#define save_re_context Perl_save_re_context
+#define Perl_save_sptr CPerlObj::Perl_save_sptr
#define save_sptr Perl_save_sptr
+#define Perl_save_svref CPerlObj::Perl_save_svref
#define save_svref Perl_save_svref
+#define Perl_save_threadsv CPerlObj::Perl_save_threadsv
#define save_threadsv Perl_save_threadsv
-#define savepv Perl_savepv
-#define savepvn Perl_savepvn
-#define savestack_grow Perl_savestack_grow
-#define saw_return Perl_saw_return
+#define Perl_sawparens CPerlObj::Perl_sawparens
#define sawparens Perl_sawparens
+#define Perl_scalar CPerlObj::Perl_scalar
#define scalar Perl_scalar
+#define Perl_scalarkids CPerlObj::Perl_scalarkids
#define scalarkids Perl_scalarkids
+#define Perl_scalarseq CPerlObj::Perl_scalarseq
#define scalarseq Perl_scalarseq
+#define Perl_scalarvoid CPerlObj::Perl_scalarvoid
#define scalarvoid Perl_scalarvoid
-#define scan_const Perl_scan_const
-#define scan_formline Perl_scan_formline
-#define scan_heredoc Perl_scan_heredoc
+#define Perl_scan_bin CPerlObj::Perl_scan_bin
+#define scan_bin Perl_scan_bin
+#define Perl_scan_hex CPerlObj::Perl_scan_hex
#define scan_hex Perl_scan_hex
-#define scan_ident Perl_scan_ident
-#define scan_inputsymbol Perl_scan_inputsymbol
+#define Perl_scan_num CPerlObj::Perl_scan_num
#define scan_num Perl_scan_num
+#define Perl_scan_oct CPerlObj::Perl_scan_oct
#define scan_oct Perl_scan_oct
-#define scan_pat Perl_scan_pat
-#define scan_prefix Perl_scan_prefix
-#define scan_str Perl_scan_str
-#define scan_subst Perl_scan_subst
-#define scan_trans Perl_scan_trans
-#define scan_word Perl_scan_word
-#define scmp_amg Perl_scmp_amg
+#define Perl_scope CPerlObj::Perl_scope
#define scope Perl_scope
+#define Perl_screaminstr CPerlObj::Perl_screaminstr
#define screaminstr Perl_screaminstr
-#define seq_amg Perl_seq_amg
-#define setdefout Perl_setdefout
+#if !defined(VMS)
+#define Perl_setenv_getix CPerlObj::Perl_setenv_getix
#define setenv_getix Perl_setenv_getix
-#define sge_amg Perl_sge_amg
-#define sgt_amg Perl_sgt_amg
-#define share_hek Perl_share_hek
+#endif
+#define Perl_setdefout CPerlObj::Perl_setdefout
+#define setdefout Perl_setdefout
+#define Perl_sharepvn CPerlObj::Perl_sharepvn
#define sharepvn Perl_sharepvn
-#define sig_name Perl_sig_name
-#define sig_num Perl_sig_num
+#define Perl_share_hek CPerlObj::Perl_share_hek
+#define share_hek Perl_share_hek
+#define Perl_sighandler CPerlObj::Perl_sighandler
#define sighandler Perl_sighandler
-#define simple Perl_simple
-#define sin_amg Perl_sin_amg
-#define skipspace Perl_skipspace
-#define sle_amg Perl_sle_amg
-#define slt_amg Perl_slt_amg
-#define sne_amg Perl_sne_amg
-#define sqrt_amg Perl_sqrt_amg
+#define Perl_stack_grow CPerlObj::Perl_stack_grow
#define stack_grow Perl_stack_grow
+#define Perl_start_subparse CPerlObj::Perl_start_subparse
#define start_subparse Perl_start_subparse
-#define string_amg Perl_string_amg
+#define Perl_sub_crush_depth CPerlObj::Perl_sub_crush_depth
#define sub_crush_depth Perl_sub_crush_depth
-#define subtr_amg Perl_subtr_amg
-#define subtr_ass_amg Perl_subtr_ass_amg
+#define Perl_sv_2bool CPerlObj::Perl_sv_2bool
#define sv_2bool Perl_sv_2bool
+#define Perl_sv_2cv CPerlObj::Perl_sv_2cv
#define sv_2cv Perl_sv_2cv
+#define Perl_sv_2io CPerlObj::Perl_sv_2io
#define sv_2io Perl_sv_2io
+#define Perl_sv_2iv CPerlObj::Perl_sv_2iv
#define sv_2iv Perl_sv_2iv
+#define Perl_sv_2mortal CPerlObj::Perl_sv_2mortal
#define sv_2mortal Perl_sv_2mortal
+#define Perl_sv_2nv CPerlObj::Perl_sv_2nv
#define sv_2nv Perl_sv_2nv
+#define Perl_sv_2pv CPerlObj::Perl_sv_2pv
#define sv_2pv Perl_sv_2pv
+#define Perl_sv_2pvutf8 CPerlObj::Perl_sv_2pvutf8
+#define sv_2pvutf8 Perl_sv_2pvutf8
+#define Perl_sv_2pvbyte CPerlObj::Perl_sv_2pvbyte
+#define sv_2pvbyte Perl_sv_2pvbyte
+#define Perl_sv_2uv CPerlObj::Perl_sv_2uv
#define sv_2uv Perl_sv_2uv
+#define Perl_sv_iv CPerlObj::Perl_sv_iv
+#define sv_iv Perl_sv_iv
+#define Perl_sv_uv CPerlObj::Perl_sv_uv
+#define sv_uv Perl_sv_uv
+#define Perl_sv_nv CPerlObj::Perl_sv_nv
+#define sv_nv Perl_sv_nv
+#define Perl_sv_pvn CPerlObj::Perl_sv_pvn
+#define sv_pvn Perl_sv_pvn
+#define Perl_sv_pvutf8n CPerlObj::Perl_sv_pvutf8n
+#define sv_pvutf8n Perl_sv_pvutf8n
+#define Perl_sv_pvbyten CPerlObj::Perl_sv_pvbyten
+#define sv_pvbyten Perl_sv_pvbyten
+#define Perl_sv_true CPerlObj::Perl_sv_true
+#define sv_true Perl_sv_true
+#define Perl_sv_add_arena CPerlObj::Perl_sv_add_arena
#define sv_add_arena Perl_sv_add_arena
+#define Perl_sv_backoff CPerlObj::Perl_sv_backoff
#define sv_backoff Perl_sv_backoff
+#define Perl_sv_bless CPerlObj::Perl_sv_bless
#define sv_bless Perl_sv_bless
-#define sv_catpv Perl_sv_catpv
-#define sv_catpv_mg Perl_sv_catpv_mg
+#define Perl_sv_catpvf CPerlObj::Perl_sv_catpvf
#define sv_catpvf Perl_sv_catpvf
-#define sv_catpvf_mg Perl_sv_catpvf_mg
+#define Perl_sv_vcatpvf CPerlObj::Perl_sv_vcatpvf
+#define sv_vcatpvf Perl_sv_vcatpvf
+#define Perl_sv_catpv CPerlObj::Perl_sv_catpv
+#define sv_catpv Perl_sv_catpv
+#define Perl_sv_catpvn CPerlObj::Perl_sv_catpvn
#define sv_catpvn Perl_sv_catpvn
-#define sv_catpvn_mg Perl_sv_catpvn_mg
+#define Perl_sv_catsv CPerlObj::Perl_sv_catsv
#define sv_catsv Perl_sv_catsv
-#define sv_catsv_mg Perl_sv_catsv_mg
+#define Perl_sv_chop CPerlObj::Perl_sv_chop
#define sv_chop Perl_sv_chop
+#define Perl_sv_clean_all CPerlObj::Perl_sv_clean_all
#define sv_clean_all Perl_sv_clean_all
+#define Perl_sv_clean_objs CPerlObj::Perl_sv_clean_objs
#define sv_clean_objs Perl_sv_clean_objs
+#define Perl_sv_clear CPerlObj::Perl_sv_clear
#define sv_clear Perl_sv_clear
+#define Perl_sv_cmp CPerlObj::Perl_sv_cmp
#define sv_cmp Perl_sv_cmp
+#define Perl_sv_cmp_locale CPerlObj::Perl_sv_cmp_locale
#define sv_cmp_locale Perl_sv_cmp_locale
+#if defined(USE_LOCALE_COLLATE)
+#define Perl_sv_collxfrm CPerlObj::Perl_sv_collxfrm
#define sv_collxfrm Perl_sv_collxfrm
+#endif
+#define Perl_sv_compile_2op CPerlObj::Perl_sv_compile_2op
#define sv_compile_2op Perl_sv_compile_2op
+#define Perl_sv_dec CPerlObj::Perl_sv_dec
#define sv_dec Perl_sv_dec
-#define sv_derived_from Perl_sv_derived_from
+#define Perl_sv_dump CPerlObj::Perl_sv_dump
#define sv_dump Perl_sv_dump
+#define Perl_sv_derived_from CPerlObj::Perl_sv_derived_from
+#define sv_derived_from Perl_sv_derived_from
+#define Perl_sv_eq CPerlObj::Perl_sv_eq
#define sv_eq Perl_sv_eq
+#define Perl_sv_free CPerlObj::Perl_sv_free
#define sv_free Perl_sv_free
+#define Perl_sv_free_arenas CPerlObj::Perl_sv_free_arenas
#define sv_free_arenas Perl_sv_free_arenas
+#define Perl_sv_gets CPerlObj::Perl_sv_gets
#define sv_gets Perl_sv_gets
+#define Perl_sv_grow CPerlObj::Perl_sv_grow
#define sv_grow Perl_sv_grow
+#define Perl_sv_inc CPerlObj::Perl_sv_inc
#define sv_inc Perl_sv_inc
+#define Perl_sv_insert CPerlObj::Perl_sv_insert
#define sv_insert Perl_sv_insert
+#define Perl_sv_isa CPerlObj::Perl_sv_isa
#define sv_isa Perl_sv_isa
+#define Perl_sv_isobject CPerlObj::Perl_sv_isobject
#define sv_isobject Perl_sv_isobject
-#define sv_iv Perl_sv_iv
+#define Perl_sv_len CPerlObj::Perl_sv_len
#define sv_len Perl_sv_len
+#define Perl_sv_len_utf8 CPerlObj::Perl_sv_len_utf8
+#define sv_len_utf8 Perl_sv_len_utf8
+#define Perl_sv_magic CPerlObj::Perl_sv_magic
#define sv_magic Perl_sv_magic
+#define Perl_sv_mortalcopy CPerlObj::Perl_sv_mortalcopy
#define sv_mortalcopy Perl_sv_mortalcopy
+#define Perl_sv_newmortal CPerlObj::Perl_sv_newmortal
#define sv_newmortal Perl_sv_newmortal
+#define Perl_sv_newref CPerlObj::Perl_sv_newref
#define sv_newref Perl_sv_newref
-#define sv_nv Perl_sv_nv
+#define Perl_sv_peek CPerlObj::Perl_sv_peek
#define sv_peek Perl_sv_peek
-#define sv_pvn Perl_sv_pvn
+#define Perl_sv_pos_u2b CPerlObj::Perl_sv_pos_u2b
+#define sv_pos_u2b Perl_sv_pos_u2b
+#define Perl_sv_pos_b2u CPerlObj::Perl_sv_pos_b2u
+#define sv_pos_b2u Perl_sv_pos_b2u
+#define Perl_sv_pvn_force CPerlObj::Perl_sv_pvn_force
#define sv_pvn_force Perl_sv_pvn_force
-#define sv_ref Perl_sv_ref
+#define Perl_sv_pvutf8n_force CPerlObj::Perl_sv_pvutf8n_force
+#define sv_pvutf8n_force Perl_sv_pvutf8n_force
+#define Perl_sv_pvbyten_force CPerlObj::Perl_sv_pvbyten_force
+#define sv_pvbyten_force Perl_sv_pvbyten_force
+#define Perl_sv_reftype CPerlObj::Perl_sv_reftype
#define sv_reftype Perl_sv_reftype
+#define Perl_sv_replace CPerlObj::Perl_sv_replace
#define sv_replace Perl_sv_replace
+#define Perl_sv_report_used CPerlObj::Perl_sv_report_used
#define sv_report_used Perl_sv_report_used
+#define Perl_sv_reset CPerlObj::Perl_sv_reset
#define sv_reset Perl_sv_reset
-#define sv_setiv Perl_sv_setiv
-#define sv_setiv_mg Perl_sv_setiv_mg
-#define sv_setnv Perl_sv_setnv
-#define sv_setnv_mg Perl_sv_setnv_mg
-#define sv_setptrobj Perl_sv_setptrobj
-#define sv_setpv Perl_sv_setpv
-#define sv_setpv_mg Perl_sv_setpv_mg
+#define Perl_sv_setpvf CPerlObj::Perl_sv_setpvf
#define sv_setpvf Perl_sv_setpvf
-#define sv_setpvf_mg Perl_sv_setpvf_mg
+#define Perl_sv_vsetpvf CPerlObj::Perl_sv_vsetpvf
+#define sv_vsetpvf Perl_sv_vsetpvf
+#define Perl_sv_setiv CPerlObj::Perl_sv_setiv
+#define sv_setiv Perl_sv_setiv
+#define Perl_sv_setpviv CPerlObj::Perl_sv_setpviv
#define sv_setpviv Perl_sv_setpviv
-#define sv_setpviv_mg Perl_sv_setpviv_mg
-#define sv_setpvn Perl_sv_setpvn
-#define sv_setpvn_mg Perl_sv_setpvn_mg
+#define Perl_sv_setuv CPerlObj::Perl_sv_setuv
+#define sv_setuv Perl_sv_setuv
+#define Perl_sv_setnv CPerlObj::Perl_sv_setnv
+#define sv_setnv Perl_sv_setnv
+#define Perl_sv_setref_iv CPerlObj::Perl_sv_setref_iv
#define sv_setref_iv Perl_sv_setref_iv
+#define Perl_sv_setref_nv CPerlObj::Perl_sv_setref_nv
#define sv_setref_nv Perl_sv_setref_nv
+#define Perl_sv_setref_pv CPerlObj::Perl_sv_setref_pv
#define sv_setref_pv Perl_sv_setref_pv
+#define Perl_sv_setref_pvn CPerlObj::Perl_sv_setref_pvn
#define sv_setref_pvn Perl_sv_setref_pvn
+#define Perl_sv_setpv CPerlObj::Perl_sv_setpv
+#define sv_setpv Perl_sv_setpv
+#define Perl_sv_setpvn CPerlObj::Perl_sv_setpvn
+#define sv_setpvn Perl_sv_setpvn
+#define Perl_sv_setsv CPerlObj::Perl_sv_setsv
#define sv_setsv Perl_sv_setsv
-#define sv_setsv_mg Perl_sv_setsv_mg
-#define sv_setuv Perl_sv_setuv
-#define sv_setuv_mg Perl_sv_setuv_mg
+#define Perl_sv_taint CPerlObj::Perl_sv_taint
#define sv_taint Perl_sv_taint
+#define Perl_sv_tainted CPerlObj::Perl_sv_tainted
#define sv_tainted Perl_sv_tainted
-#define sv_true Perl_sv_true
+#define Perl_sv_unmagic CPerlObj::Perl_sv_unmagic
#define sv_unmagic Perl_sv_unmagic
+#define Perl_sv_unref CPerlObj::Perl_sv_unref
#define sv_unref Perl_sv_unref
+#define Perl_sv_untaint CPerlObj::Perl_sv_untaint
#define sv_untaint Perl_sv_untaint
+#define Perl_sv_upgrade CPerlObj::Perl_sv_upgrade
#define sv_upgrade Perl_sv_upgrade
+#define Perl_sv_usepvn CPerlObj::Perl_sv_usepvn
#define sv_usepvn Perl_sv_usepvn
-#define sv_usepvn_mg Perl_sv_usepvn_mg
-#define sv_uv Perl_sv_uv
+#define Perl_sv_vcatpvfn CPerlObj::Perl_sv_vcatpvfn
#define sv_vcatpvfn Perl_sv_vcatpvfn
+#define Perl_sv_vsetpvfn CPerlObj::Perl_sv_vsetpvfn
#define sv_vsetpvfn Perl_sv_vsetpvfn
+#define Perl_str_to_version CPerlObj::Perl_str_to_version
+#define str_to_version Perl_str_to_version
+#define Perl_swash_init CPerlObj::Perl_swash_init
+#define swash_init Perl_swash_init
+#define Perl_swash_fetch CPerlObj::Perl_swash_fetch
+#define swash_fetch Perl_swash_fetch
+#define Perl_taint_env CPerlObj::Perl_taint_env
#define taint_env Perl_taint_env
+#define Perl_taint_proper CPerlObj::Perl_taint_proper
#define taint_proper Perl_taint_proper
-#define too_few_arguments Perl_too_few_arguments
-#define too_many_arguments Perl_too_many_arguments
+#define Perl_to_utf8_lower CPerlObj::Perl_to_utf8_lower
+#define to_utf8_lower Perl_to_utf8_lower
+#define Perl_to_utf8_upper CPerlObj::Perl_to_utf8_upper
+#define to_utf8_upper Perl_to_utf8_upper
+#define Perl_to_utf8_title CPerlObj::Perl_to_utf8_title
+#define to_utf8_title Perl_to_utf8_title
+#if defined(UNLINK_ALL_VERSIONS)
+#define Perl_unlnk CPerlObj::Perl_unlnk
#define unlnk Perl_unlnk
+#endif
+#if defined(USE_THREADS)
+#define Perl_unlock_condpair CPerlObj::Perl_unlock_condpair
#define unlock_condpair Perl_unlock_condpair
-#define unshare_hek Perl_unshare_hek
+#endif
+#define Perl_unsharepvn CPerlObj::Perl_unsharepvn
#define unsharepvn Perl_unsharepvn
+#define Perl_unshare_hek CPerlObj::Perl_unshare_hek
+#define unshare_hek Perl_unshare_hek
+#define Perl_utilize CPerlObj::Perl_utilize
#define utilize Perl_utilize
-#define varies Perl_varies
+#define Perl_utf16_to_utf8 CPerlObj::Perl_utf16_to_utf8
+#define utf16_to_utf8 Perl_utf16_to_utf8
+#define Perl_utf16_to_utf8_reversed CPerlObj::Perl_utf16_to_utf8_reversed
+#define utf16_to_utf8_reversed Perl_utf16_to_utf8_reversed
+#define Perl_utf8_distance CPerlObj::Perl_utf8_distance
+#define utf8_distance Perl_utf8_distance
+#define Perl_utf8_hop CPerlObj::Perl_utf8_hop
+#define utf8_hop Perl_utf8_hop
+#define Perl_utf8_to_uv CPerlObj::Perl_utf8_to_uv
+#define utf8_to_uv Perl_utf8_to_uv
+#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 vivify_defelem Perl_vivify_defelem
+#define Perl_vivify_ref CPerlObj::Perl_vivify_ref
#define vivify_ref Perl_vivify_ref
-#define vtbl_amagic Perl_vtbl_amagic
-#define vtbl_amagicelem Perl_vtbl_amagicelem
-#define vtbl_arylen Perl_vtbl_arylen
-#define vtbl_bm Perl_vtbl_bm
-#define vtbl_collxfrm Perl_vtbl_collxfrm
-#define vtbl_dbline Perl_vtbl_dbline
-#define vtbl_defelem Perl_vtbl_defelem
-#define vtbl_env Perl_vtbl_env
-#define vtbl_envelem Perl_vtbl_envelem
-#define vtbl_fm Perl_vtbl_fm
-#define vtbl_glob Perl_vtbl_glob
-#define vtbl_isa Perl_vtbl_isa
-#define vtbl_isaelem Perl_vtbl_isaelem
-#define vtbl_mglob Perl_vtbl_mglob
-#define vtbl_mutex Perl_vtbl_mutex
-#define vtbl_nkeys Perl_vtbl_nkeys
-#define vtbl_pack Perl_vtbl_pack
-#define vtbl_packelem Perl_vtbl_packelem
-#define vtbl_pos Perl_vtbl_pos
-#define vtbl_regexp Perl_vtbl_regexp
-#define vtbl_sig Perl_vtbl_sig
-#define vtbl_sigelem Perl_vtbl_sigelem
-#define vtbl_substr Perl_vtbl_substr
-#define vtbl_sv Perl_vtbl_sv
-#define vtbl_taint Perl_vtbl_taint
-#define vtbl_uvar Perl_vtbl_uvar
-#define vtbl_vec Perl_vtbl_vec
+#define Perl_wait4pid CPerlObj::Perl_wait4pid
#define wait4pid Perl_wait4pid
+#define Perl_report_closed_fh CPerlObj::Perl_report_closed_fh
+#define report_closed_fh Perl_report_closed_fh
+#define Perl_report_uninit CPerlObj::Perl_report_uninit
+#define report_uninit Perl_report_uninit
+#define Perl_warn CPerlObj::Perl_warn
#define warn Perl_warn
-#define warn_nl Perl_warn_nl
-#define warn_nosemi Perl_warn_nosemi
-#define warn_reserved Perl_warn_reserved
-#define warn_uninit Perl_warn_uninit
+#define Perl_vwarn CPerlObj::Perl_vwarn
+#define vwarn Perl_vwarn
+#define Perl_warner CPerlObj::Perl_warner
+#define warner Perl_warner
+#define Perl_vwarner CPerlObj::Perl_vwarner
+#define vwarner Perl_vwarner
+#define Perl_watch CPerlObj::Perl_watch
#define watch Perl_watch
-#define watchaddr Perl_watchaddr
-#define watchok Perl_watchok
+#define Perl_whichsig CPerlObj::Perl_whichsig
#define whichsig Perl_whichsig
-#define yychar Perl_yychar
-#define yycheck Perl_yycheck
-#define yydebug Perl_yydebug
-#define yydefred Perl_yydefred
-#define yydestruct Perl_yydestruct
-#define yydgoto Perl_yydgoto
-#define yyerrflag Perl_yyerrflag
+#define Perl_yyerror CPerlObj::Perl_yyerror
#define yyerror Perl_yyerror
-#define yygindex Perl_yygindex
-#define yylen Perl_yylen
+#if defined(USE_PURE_BISON)
+#define Perl_yylex CPerlObj::Perl_yylex
#define yylex Perl_yylex
-#define yylhs Perl_yylhs
-#define yylval Perl_yylval
-#define yyname Perl_yyname
-#define yynerrs Perl_yynerrs
+#else
+#define Perl_yylex CPerlObj::Perl_yylex
+#define yylex Perl_yylex
+#endif
+#define Perl_yyparse CPerlObj::Perl_yyparse
#define yyparse Perl_yyparse
-#define yyrindex Perl_yyrindex
-#define yyrule Perl_yyrule
-#define yysindex Perl_yysindex
-#define yytable Perl_yytable
-#define yyval Perl_yyval
+#define Perl_yywarn CPerlObj::Perl_yywarn
#define yywarn Perl_yywarn
+#if defined(MYMALLOC)
+#define Perl_dump_mstats CPerlObj::Perl_dump_mstats
+#define dump_mstats Perl_dump_mstats
+#define Perl_get_mstats CPerlObj::Perl_get_mstats
+#define get_mstats Perl_get_mstats
+#endif
+#define Perl_safesysmalloc CPerlObj::Perl_safesysmalloc
+#define safesysmalloc Perl_safesysmalloc
+#define Perl_safesyscalloc CPerlObj::Perl_safesyscalloc
+#define safesyscalloc Perl_safesyscalloc
+#define Perl_safesysrealloc CPerlObj::Perl_safesysrealloc
+#define safesysrealloc Perl_safesysrealloc
+#define Perl_safesysfree CPerlObj::Perl_safesysfree
+#define safesysfree Perl_safesysfree
+#if defined(LEAKTEST)
+#define Perl_safexmalloc CPerlObj::Perl_safexmalloc
+#define safexmalloc Perl_safexmalloc
+#define Perl_safexcalloc CPerlObj::Perl_safexcalloc
+#define safexcalloc Perl_safexcalloc
+#define Perl_safexrealloc CPerlObj::Perl_safexrealloc
+#define safexrealloc Perl_safexrealloc
+#define Perl_safexfree CPerlObj::Perl_safexfree
+#define safexfree Perl_safexfree
+#endif
+#if defined(PERL_GLOBAL_STRUCT)
+#define Perl_GetVars CPerlObj::Perl_GetVars
+#define GetVars Perl_GetVars
+#endif
+#define Perl_runops_standard CPerlObj::Perl_runops_standard
+#define runops_standard Perl_runops_standard
+#define Perl_runops_debug CPerlObj::Perl_runops_debug
+#define runops_debug Perl_runops_debug
+#define Perl_sv_catpvf_mg CPerlObj::Perl_sv_catpvf_mg
+#define sv_catpvf_mg Perl_sv_catpvf_mg
+#define Perl_sv_vcatpvf_mg CPerlObj::Perl_sv_vcatpvf_mg
+#define sv_vcatpvf_mg Perl_sv_vcatpvf_mg
+#define Perl_sv_catpv_mg CPerlObj::Perl_sv_catpv_mg
+#define sv_catpv_mg Perl_sv_catpv_mg
+#define Perl_sv_catpvn_mg CPerlObj::Perl_sv_catpvn_mg
+#define sv_catpvn_mg Perl_sv_catpvn_mg
+#define Perl_sv_catsv_mg CPerlObj::Perl_sv_catsv_mg
+#define sv_catsv_mg Perl_sv_catsv_mg
+#define Perl_sv_setpvf_mg CPerlObj::Perl_sv_setpvf_mg
+#define sv_setpvf_mg Perl_sv_setpvf_mg
+#define Perl_sv_vsetpvf_mg CPerlObj::Perl_sv_vsetpvf_mg
+#define sv_vsetpvf_mg Perl_sv_vsetpvf_mg
+#define Perl_sv_setiv_mg CPerlObj::Perl_sv_setiv_mg
+#define sv_setiv_mg Perl_sv_setiv_mg
+#define Perl_sv_setpviv_mg CPerlObj::Perl_sv_setpviv_mg
+#define sv_setpviv_mg Perl_sv_setpviv_mg
+#define Perl_sv_setuv_mg CPerlObj::Perl_sv_setuv_mg
+#define sv_setuv_mg Perl_sv_setuv_mg
+#define Perl_sv_setnv_mg CPerlObj::Perl_sv_setnv_mg
+#define sv_setnv_mg Perl_sv_setnv_mg
+#define Perl_sv_setpv_mg CPerlObj::Perl_sv_setpv_mg
+#define sv_setpv_mg Perl_sv_setpv_mg
+#define Perl_sv_setpvn_mg CPerlObj::Perl_sv_setpvn_mg
+#define sv_setpvn_mg Perl_sv_setpvn_mg
+#define Perl_sv_setsv_mg CPerlObj::Perl_sv_setsv_mg
+#define sv_setsv_mg Perl_sv_setsv_mg
+#define Perl_sv_usepvn_mg CPerlObj::Perl_sv_usepvn_mg
+#define sv_usepvn_mg Perl_sv_usepvn_mg
+#define Perl_get_vtbl CPerlObj::Perl_get_vtbl
+#define get_vtbl Perl_get_vtbl
+#define Perl_pv_display CPerlObj::Perl_pv_display
+#define pv_display Perl_pv_display
+#define Perl_dump_indent CPerlObj::Perl_dump_indent
+#define dump_indent Perl_dump_indent
+#define Perl_dump_vindent CPerlObj::Perl_dump_vindent
+#define dump_vindent Perl_dump_vindent
+#define Perl_do_gv_dump CPerlObj::Perl_do_gv_dump
+#define do_gv_dump Perl_do_gv_dump
+#define Perl_do_gvgv_dump CPerlObj::Perl_do_gvgv_dump
+#define do_gvgv_dump Perl_do_gvgv_dump
+#define Perl_do_hv_dump CPerlObj::Perl_do_hv_dump
+#define do_hv_dump Perl_do_hv_dump
+#define Perl_do_magic_dump CPerlObj::Perl_do_magic_dump
+#define do_magic_dump Perl_do_magic_dump
+#define Perl_do_op_dump CPerlObj::Perl_do_op_dump
+#define do_op_dump Perl_do_op_dump
+#define Perl_do_pmop_dump CPerlObj::Perl_do_pmop_dump
+#define do_pmop_dump Perl_do_pmop_dump
+#define Perl_do_sv_dump CPerlObj::Perl_do_sv_dump
+#define do_sv_dump Perl_do_sv_dump
+#define Perl_magic_dump CPerlObj::Perl_magic_dump
+#define magic_dump Perl_magic_dump
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define Perl_default_protect CPerlObj::Perl_default_protect
+#define default_protect Perl_default_protect
+#define Perl_vdefault_protect CPerlObj::Perl_vdefault_protect
+#define vdefault_protect Perl_vdefault_protect
+#endif
+#define Perl_reginitcolors CPerlObj::Perl_reginitcolors
+#define reginitcolors Perl_reginitcolors
+#define Perl_sv_2pv_nolen CPerlObj::Perl_sv_2pv_nolen
+#define sv_2pv_nolen Perl_sv_2pv_nolen
+#define Perl_sv_2pvutf8_nolen CPerlObj::Perl_sv_2pvutf8_nolen
+#define sv_2pvutf8_nolen Perl_sv_2pvutf8_nolen
+#define Perl_sv_2pvbyte_nolen CPerlObj::Perl_sv_2pvbyte_nolen
+#define sv_2pvbyte_nolen Perl_sv_2pvbyte_nolen
+#define Perl_sv_pv CPerlObj::Perl_sv_pv
+#define sv_pv Perl_sv_pv
+#define Perl_sv_pvutf8 CPerlObj::Perl_sv_pvutf8
+#define sv_pvutf8 Perl_sv_pvutf8
+#define Perl_sv_pvbyte CPerlObj::Perl_sv_pvbyte
+#define sv_pvbyte Perl_sv_pvbyte
+#define Perl_sv_utf8_upgrade CPerlObj::Perl_sv_utf8_upgrade
+#define sv_utf8_upgrade Perl_sv_utf8_upgrade
+#define Perl_sv_utf8_downgrade CPerlObj::Perl_sv_utf8_downgrade
+#define sv_utf8_downgrade Perl_sv_utf8_downgrade
+#define Perl_sv_utf8_encode CPerlObj::Perl_sv_utf8_encode
+#define sv_utf8_encode Perl_sv_utf8_encode
+#define Perl_sv_utf8_decode CPerlObj::Perl_sv_utf8_decode
+#define sv_utf8_decode Perl_sv_utf8_decode
+#define Perl_sv_force_normal CPerlObj::Perl_sv_force_normal
+#define sv_force_normal Perl_sv_force_normal
+#define Perl_tmps_grow CPerlObj::Perl_tmps_grow
+#define tmps_grow Perl_tmps_grow
+#define Perl_sv_rvweaken CPerlObj::Perl_sv_rvweaken
+#define sv_rvweaken Perl_sv_rvweaken
+#define Perl_magic_killbackrefs CPerlObj::Perl_magic_killbackrefs
+#define magic_killbackrefs Perl_magic_killbackrefs
+#define Perl_newANONATTRSUB CPerlObj::Perl_newANONATTRSUB
+#define newANONATTRSUB Perl_newANONATTRSUB
+#define Perl_newATTRSUB CPerlObj::Perl_newATTRSUB
+#define newATTRSUB Perl_newATTRSUB
+#define Perl_newMYSUB CPerlObj::Perl_newMYSUB
+#define newMYSUB Perl_newMYSUB
+#define Perl_my_attrs CPerlObj::Perl_my_attrs
+#define my_attrs Perl_my_attrs
+#define Perl_boot_core_xsutils CPerlObj::Perl_boot_core_xsutils
+#define boot_core_xsutils Perl_boot_core_xsutils
+#if defined(USE_ITHREADS)
+#define Perl_cx_dup CPerlObj::Perl_cx_dup
+#define cx_dup Perl_cx_dup
+#define Perl_si_dup CPerlObj::Perl_si_dup
+#define si_dup Perl_si_dup
+#define Perl_ss_dup CPerlObj::Perl_ss_dup
+#define ss_dup Perl_ss_dup
+#define Perl_any_dup CPerlObj::Perl_any_dup
+#define any_dup Perl_any_dup
+#define Perl_he_dup CPerlObj::Perl_he_dup
+#define he_dup Perl_he_dup
+#define Perl_re_dup CPerlObj::Perl_re_dup
+#define re_dup Perl_re_dup
+#define Perl_fp_dup CPerlObj::Perl_fp_dup
+#define fp_dup Perl_fp_dup
+#define Perl_dirp_dup CPerlObj::Perl_dirp_dup
+#define dirp_dup Perl_dirp_dup
+#define Perl_gp_dup CPerlObj::Perl_gp_dup
+#define gp_dup Perl_gp_dup
+#define Perl_mg_dup CPerlObj::Perl_mg_dup
+#define mg_dup Perl_mg_dup
+#define Perl_sv_dup CPerlObj::Perl_sv_dup
+#define sv_dup Perl_sv_dup
+#if defined(HAVE_INTERP_INTERN)
+#define Perl_sys_intern_dup CPerlObj::Perl_sys_intern_dup
+#define sys_intern_dup Perl_sys_intern_dup
+#endif
+#define Perl_ptr_table_new CPerlObj::Perl_ptr_table_new
+#define ptr_table_new Perl_ptr_table_new
+#define Perl_ptr_table_fetch CPerlObj::Perl_ptr_table_fetch
+#define ptr_table_fetch Perl_ptr_table_fetch
+#define Perl_ptr_table_store CPerlObj::Perl_ptr_table_store
+#define ptr_table_store Perl_ptr_table_store
+#define Perl_ptr_table_split CPerlObj::Perl_ptr_table_split
+#define ptr_table_split Perl_ptr_table_split
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#define S_avhv_index_sv CPerlObj::S_avhv_index_sv
+#define avhv_index_sv S_avhv_index_sv
+#define S_avhv_index CPerlObj::S_avhv_index
+#define avhv_index S_avhv_index
+#endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#define S_do_trans_CC_simple CPerlObj::S_do_trans_CC_simple
+#define do_trans_CC_simple S_do_trans_CC_simple
+#define S_do_trans_CC_count CPerlObj::S_do_trans_CC_count
+#define do_trans_CC_count S_do_trans_CC_count
+#define S_do_trans_CC_complex CPerlObj::S_do_trans_CC_complex
+#define do_trans_CC_complex S_do_trans_CC_complex
+#define S_do_trans_UU_simple CPerlObj::S_do_trans_UU_simple
+#define do_trans_UU_simple S_do_trans_UU_simple
+#define S_do_trans_UU_count CPerlObj::S_do_trans_UU_count
+#define do_trans_UU_count S_do_trans_UU_count
+#define S_do_trans_UU_complex CPerlObj::S_do_trans_UU_complex
+#define do_trans_UU_complex S_do_trans_UU_complex
+#define S_do_trans_UC_simple CPerlObj::S_do_trans_UC_simple
+#define do_trans_UC_simple S_do_trans_UC_simple
+#define S_do_trans_CU_simple CPerlObj::S_do_trans_CU_simple
+#define do_trans_CU_simple S_do_trans_CU_simple
+#define S_do_trans_UC_trivial CPerlObj::S_do_trans_UC_trivial
+#define do_trans_UC_trivial S_do_trans_UC_trivial
+#define S_do_trans_CU_trivial CPerlObj::S_do_trans_CU_trivial
+#define do_trans_CU_trivial S_do_trans_CU_trivial
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#define S_gv_init_sv CPerlObj::S_gv_init_sv
+#define gv_init_sv S_gv_init_sv
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#define S_hsplit CPerlObj::S_hsplit
+#define hsplit S_hsplit
+#define S_hfreeentries CPerlObj::S_hfreeentries
+#define hfreeentries S_hfreeentries
+#define S_more_he CPerlObj::S_more_he
+#define more_he S_more_he
+#define S_new_he CPerlObj::S_new_he
+#define new_he S_new_he
+#define S_del_he CPerlObj::S_del_he
+#define del_he S_del_he
+#define S_save_hek CPerlObj::S_save_hek
+#define save_hek S_save_hek
+#define S_hv_magic_check CPerlObj::S_hv_magic_check
+#define hv_magic_check S_hv_magic_check
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#define S_save_magic CPerlObj::S_save_magic
+#define save_magic S_save_magic
+#define S_magic_methpack CPerlObj::S_magic_methpack
+#define magic_methpack S_magic_methpack
+#define S_magic_methcall CPerlObj::S_magic_methcall
+#define magic_methcall S_magic_methcall
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#define S_list_assignment CPerlObj::S_list_assignment
+#define list_assignment S_list_assignment
+#define S_bad_type CPerlObj::S_bad_type
+#define bad_type S_bad_type
+#define S_cop_free CPerlObj::S_cop_free
+#define cop_free S_cop_free
+#define S_modkids CPerlObj::S_modkids
+#define modkids S_modkids
+#define S_no_bareword_allowed CPerlObj::S_no_bareword_allowed
+#define no_bareword_allowed S_no_bareword_allowed
+#define S_no_fh_allowed CPerlObj::S_no_fh_allowed
+#define no_fh_allowed S_no_fh_allowed
+#define S_scalarboolean CPerlObj::S_scalarboolean
+#define scalarboolean S_scalarboolean
+#define S_too_few_arguments CPerlObj::S_too_few_arguments
+#define too_few_arguments S_too_few_arguments
+#define S_too_many_arguments CPerlObj::S_too_many_arguments
+#define too_many_arguments S_too_many_arguments
+#define S_op_clear CPerlObj::S_op_clear
+#define op_clear S_op_clear
+#define S_null CPerlObj::S_null
+#define null S_null
+#define S_pad_addlex CPerlObj::S_pad_addlex
+#define pad_addlex S_pad_addlex
+#define S_pad_findlex CPerlObj::S_pad_findlex
+#define pad_findlex S_pad_findlex
+#define S_newDEFSVOP CPerlObj::S_newDEFSVOP
+#define newDEFSVOP S_newDEFSVOP
+#define S_new_logop CPerlObj::S_new_logop
+#define new_logop S_new_logop
+#define S_simplify_sort CPerlObj::S_simplify_sort
+#define simplify_sort S_simplify_sort
+#define S_is_handle_constructor CPerlObj::S_is_handle_constructor
+#define is_handle_constructor S_is_handle_constructor
+#define S_gv_ename CPerlObj::S_gv_ename
+#define gv_ename S_gv_ename
+#define S_cv_dump CPerlObj::S_cv_dump
+#define cv_dump S_cv_dump
+#define S_cv_clone2 CPerlObj::S_cv_clone2
+#define cv_clone2 S_cv_clone2
+#define S_scalar_mod_type CPerlObj::S_scalar_mod_type
+#define scalar_mod_type S_scalar_mod_type
+#define S_my_kid CPerlObj::S_my_kid
+#define my_kid S_my_kid
+#define S_dup_attrlist CPerlObj::S_dup_attrlist
+#define dup_attrlist S_dup_attrlist
+#define S_apply_attrs CPerlObj::S_apply_attrs
+#define apply_attrs S_apply_attrs
+# if defined(PL_OP_SLAB_ALLOC)
+#define S_Slab_Alloc CPerlObj::S_Slab_Alloc
+#define Slab_Alloc S_Slab_Alloc
+# endif
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+#define S_find_beginning CPerlObj::S_find_beginning
+#define find_beginning S_find_beginning
+#define S_forbid_setid CPerlObj::S_forbid_setid
+#define forbid_setid S_forbid_setid
+#define S_incpush CPerlObj::S_incpush
+#define incpush S_incpush
+#define S_init_interp CPerlObj::S_init_interp
+#define init_interp S_init_interp
+#define S_init_ids CPerlObj::S_init_ids
+#define init_ids S_init_ids
+#define S_init_lexer CPerlObj::S_init_lexer
+#define init_lexer S_init_lexer
+#define S_init_main_stash CPerlObj::S_init_main_stash
+#define init_main_stash S_init_main_stash
+#define S_init_perllib CPerlObj::S_init_perllib
+#define init_perllib S_init_perllib
+#define S_init_postdump_symbols CPerlObj::S_init_postdump_symbols
+#define init_postdump_symbols S_init_postdump_symbols
+#define S_init_predump_symbols CPerlObj::S_init_predump_symbols
+#define init_predump_symbols S_init_predump_symbols
+#define S_my_exit_jump CPerlObj::S_my_exit_jump
+#define my_exit_jump S_my_exit_jump
+#define S_nuke_stacks CPerlObj::S_nuke_stacks
+#define nuke_stacks S_nuke_stacks
+#define S_open_script CPerlObj::S_open_script
+#define open_script S_open_script
+#define S_usage CPerlObj::S_usage
+#define usage S_usage
+#define S_validate_suid CPerlObj::S_validate_suid
+#define validate_suid S_validate_suid
+# if defined(IAMSUID)
+#define S_fd_on_nosuid_fs CPerlObj::S_fd_on_nosuid_fs
+#define fd_on_nosuid_fs S_fd_on_nosuid_fs
+# endif
+#define S_parse_body CPerlObj::S_parse_body
+#define parse_body S_parse_body
+#define S_run_body CPerlObj::S_run_body
+#define run_body S_run_body
+#define S_call_body CPerlObj::S_call_body
+#define call_body S_call_body
+#define S_call_list_body CPerlObj::S_call_list_body
+#define call_list_body S_call_list_body
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define S_vparse_body CPerlObj::S_vparse_body
+#define vparse_body S_vparse_body
+#define S_vrun_body CPerlObj::S_vrun_body
+#define vrun_body S_vrun_body
+#define S_vcall_body CPerlObj::S_vcall_body
+#define vcall_body S_vcall_body
+#define S_vcall_list_body CPerlObj::S_vcall_list_body
+#define vcall_list_body S_vcall_list_body
+#endif
+# if defined(USE_THREADS)
+#define S_init_main_thread CPerlObj::S_init_main_thread
+#define init_main_thread S_init_main_thread
+# endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#define S_doencodes CPerlObj::S_doencodes
+#define doencodes S_doencodes
+#define S_refto CPerlObj::S_refto
+#define refto S_refto
+#define S_seed CPerlObj::S_seed
+#define seed S_seed
+#define S_mul128 CPerlObj::S_mul128
+#define mul128 S_mul128
+#define S_is_an_int CPerlObj::S_is_an_int
+#define is_an_int S_is_an_int
+#define S_div128 CPerlObj::S_div128
+#define div128 S_div128
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#define S_docatch CPerlObj::S_docatch
+#define docatch S_docatch
+#define S_docatch_body CPerlObj::S_docatch_body
+#define docatch_body S_docatch_body
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#define S_vdocatch_body CPerlObj::S_vdocatch_body
+#define vdocatch_body S_vdocatch_body
+#endif
+#define S_dofindlabel CPerlObj::S_dofindlabel
+#define dofindlabel S_dofindlabel
+#define S_doparseform CPerlObj::S_doparseform
+#define doparseform S_doparseform
+#define S_dopoptoeval CPerlObj::S_dopoptoeval
+#define dopoptoeval S_dopoptoeval
+#define S_dopoptolabel CPerlObj::S_dopoptolabel
+#define dopoptolabel S_dopoptolabel
+#define S_dopoptoloop CPerlObj::S_dopoptoloop
+#define dopoptoloop S_dopoptoloop
+#define S_dopoptosub CPerlObj::S_dopoptosub
+#define dopoptosub S_dopoptosub
+#define S_dopoptosub_at CPerlObj::S_dopoptosub_at
+#define dopoptosub_at S_dopoptosub_at
+#define S_free_closures CPerlObj::S_free_closures
+#define free_closures S_free_closures
+#define S_save_lines CPerlObj::S_save_lines
+#define save_lines S_save_lines
+#define S_doeval CPerlObj::S_doeval
+#define doeval S_doeval
+#define S_doopen_pmc CPerlObj::S_doopen_pmc
+#define doopen_pmc S_doopen_pmc
+#define S_qsortsv CPerlObj::S_qsortsv
+#define qsortsv S_qsortsv
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#define S_do_maybe_phash CPerlObj::S_do_maybe_phash
+#define do_maybe_phash S_do_maybe_phash
+#define S_do_oddball CPerlObj::S_do_oddball
+#define do_oddball S_do_oddball
+#define S_get_db_sub CPerlObj::S_get_db_sub
+#define get_db_sub S_get_db_sub
+#define S_method_common CPerlObj::S_method_common
+#define method_common S_method_common
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+#define S_doform CPerlObj::S_doform
+#define doform S_doform
+#define S_emulate_eaccess CPerlObj::S_emulate_eaccess
+#define emulate_eaccess S_emulate_eaccess
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#define S_dooneliner CPerlObj::S_dooneliner
+#define dooneliner S_dooneliner
+# endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#define S_reg CPerlObj::S_reg
+#define reg S_reg
+#define S_reganode CPerlObj::S_reganode
+#define reganode S_reganode
+#define S_regatom CPerlObj::S_regatom
+#define regatom S_regatom
+#define S_regbranch CPerlObj::S_regbranch
+#define regbranch S_regbranch
+#define S_reguni CPerlObj::S_reguni
+#define reguni S_reguni
+#define S_regclass CPerlObj::S_regclass
+#define regclass S_regclass
+#define S_regclassutf8 CPerlObj::S_regclassutf8
+#define regclassutf8 S_regclassutf8
+#define S_regcurly CPerlObj::S_regcurly
+#define regcurly S_regcurly
+#define S_reg_node CPerlObj::S_reg_node
+#define reg_node S_reg_node
+#define S_regpiece CPerlObj::S_regpiece
+#define regpiece S_regpiece
+#define S_reginsert CPerlObj::S_reginsert
+#define reginsert S_reginsert
+#define S_regoptail CPerlObj::S_regoptail
+#define regoptail S_regoptail
+#define S_regtail CPerlObj::S_regtail
+#define regtail S_regtail
+#define S_regwhite CPerlObj::S_regwhite
+#define regwhite S_regwhite
+#define S_nextchar CPerlObj::S_nextchar
+#define nextchar S_nextchar
+#define S_dumpuntil CPerlObj::S_dumpuntil
+#define dumpuntil S_dumpuntil
+#define S_put_byte CPerlObj::S_put_byte
+#define put_byte S_put_byte
+#define S_scan_commit CPerlObj::S_scan_commit
+#define scan_commit S_scan_commit
+#define S_cl_anything CPerlObj::S_cl_anything
+#define cl_anything S_cl_anything
+#define S_cl_is_anything CPerlObj::S_cl_is_anything
+#define cl_is_anything S_cl_is_anything
+#define S_cl_init CPerlObj::S_cl_init
+#define cl_init S_cl_init
+#define S_cl_init_zero CPerlObj::S_cl_init_zero
+#define cl_init_zero S_cl_init_zero
+#define S_cl_and CPerlObj::S_cl_and
+#define cl_and S_cl_and
+#define S_cl_or CPerlObj::S_cl_or
+#define cl_or S_cl_or
+#define S_study_chunk CPerlObj::S_study_chunk
+#define study_chunk S_study_chunk
+#define S_add_data CPerlObj::S_add_data
+#define add_data S_add_data
+#define S_re_croak2 CPerlObj::S_re_croak2
+#define re_croak2 S_re_croak2
+#define S_regpposixcc CPerlObj::S_regpposixcc
+#define regpposixcc S_regpposixcc
+#define S_checkposixcc CPerlObj::S_checkposixcc
+#define checkposixcc S_checkposixcc
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#define S_regmatch CPerlObj::S_regmatch
+#define regmatch S_regmatch
+#define S_regrepeat CPerlObj::S_regrepeat
+#define regrepeat S_regrepeat
+#define S_regrepeat_hard CPerlObj::S_regrepeat_hard
+#define regrepeat_hard S_regrepeat_hard
+#define S_regtry CPerlObj::S_regtry
+#define regtry S_regtry
+#define S_reginclass CPerlObj::S_reginclass
+#define reginclass S_reginclass
+#define S_reginclassutf8 CPerlObj::S_reginclassutf8
+#define reginclassutf8 S_reginclassutf8
+#define S_regcppush CPerlObj::S_regcppush
+#define regcppush S_regcppush
+#define S_regcppop CPerlObj::S_regcppop
+#define regcppop S_regcppop
+#define S_regcp_set_to CPerlObj::S_regcp_set_to
+#define regcp_set_to S_regcp_set_to
+#define S_cache_re CPerlObj::S_cache_re
+#define cache_re S_cache_re
+#define S_reghop CPerlObj::S_reghop
+#define reghop S_reghop
+#define S_reghopmaybe CPerlObj::S_reghopmaybe
+#define reghopmaybe S_reghopmaybe
+#define S_find_byclass CPerlObj::S_find_byclass
+#define find_byclass S_find_byclass
+#endif
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
+#define S_debprof CPerlObj::S_debprof
+#define debprof S_debprof
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#define S_save_scalar_at CPerlObj::S_save_scalar_at
+#define save_scalar_at S_save_scalar_at
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#define S_asIV CPerlObj::S_asIV
+#define asIV S_asIV
+#define S_asUV CPerlObj::S_asUV
+#define asUV S_asUV
+#define S_more_sv CPerlObj::S_more_sv
+#define more_sv S_more_sv
+#define S_more_xiv CPerlObj::S_more_xiv
+#define more_xiv S_more_xiv
+#define S_more_xnv CPerlObj::S_more_xnv
+#define more_xnv S_more_xnv
+#define S_more_xpv CPerlObj::S_more_xpv
+#define more_xpv S_more_xpv
+#define S_more_xpviv CPerlObj::S_more_xpviv
+#define more_xpviv S_more_xpviv
+#define S_more_xpvnv CPerlObj::S_more_xpvnv
+#define more_xpvnv S_more_xpvnv
+#define S_more_xpvcv CPerlObj::S_more_xpvcv
+#define more_xpvcv S_more_xpvcv
+#define S_more_xpvav CPerlObj::S_more_xpvav
+#define more_xpvav S_more_xpvav
+#define S_more_xpvhv CPerlObj::S_more_xpvhv
+#define more_xpvhv S_more_xpvhv
+#define S_more_xpvmg CPerlObj::S_more_xpvmg
+#define more_xpvmg S_more_xpvmg
+#define S_more_xpvlv CPerlObj::S_more_xpvlv
+#define more_xpvlv S_more_xpvlv
+#define S_more_xpvbm CPerlObj::S_more_xpvbm
+#define more_xpvbm S_more_xpvbm
+#define S_more_xrv CPerlObj::S_more_xrv
+#define more_xrv S_more_xrv
+#define S_new_xiv CPerlObj::S_new_xiv
+#define new_xiv S_new_xiv
+#define S_new_xnv CPerlObj::S_new_xnv
+#define new_xnv S_new_xnv
+#define S_new_xpv CPerlObj::S_new_xpv
+#define new_xpv S_new_xpv
+#define S_new_xpviv CPerlObj::S_new_xpviv
+#define new_xpviv S_new_xpviv
+#define S_new_xpvnv CPerlObj::S_new_xpvnv
+#define new_xpvnv S_new_xpvnv
+#define S_new_xpvcv CPerlObj::S_new_xpvcv
+#define new_xpvcv S_new_xpvcv
+#define S_new_xpvav CPerlObj::S_new_xpvav
+#define new_xpvav S_new_xpvav
+#define S_new_xpvhv CPerlObj::S_new_xpvhv
+#define new_xpvhv S_new_xpvhv
+#define S_new_xpvmg CPerlObj::S_new_xpvmg
+#define new_xpvmg S_new_xpvmg
+#define S_new_xpvlv CPerlObj::S_new_xpvlv
+#define new_xpvlv S_new_xpvlv
+#define S_new_xpvbm CPerlObj::S_new_xpvbm
+#define new_xpvbm S_new_xpvbm
+#define S_new_xrv CPerlObj::S_new_xrv
+#define new_xrv S_new_xrv
+#define S_del_xiv CPerlObj::S_del_xiv
+#define del_xiv S_del_xiv
+#define S_del_xnv CPerlObj::S_del_xnv
+#define del_xnv S_del_xnv
+#define S_del_xpv CPerlObj::S_del_xpv
+#define del_xpv S_del_xpv
+#define S_del_xpviv CPerlObj::S_del_xpviv
+#define del_xpviv S_del_xpviv
+#define S_del_xpvnv CPerlObj::S_del_xpvnv
+#define del_xpvnv S_del_xpvnv
+#define S_del_xpvcv CPerlObj::S_del_xpvcv
+#define del_xpvcv S_del_xpvcv
+#define S_del_xpvav CPerlObj::S_del_xpvav
+#define del_xpvav S_del_xpvav
+#define S_del_xpvhv CPerlObj::S_del_xpvhv
+#define del_xpvhv S_del_xpvhv
+#define S_del_xpvmg CPerlObj::S_del_xpvmg
+#define del_xpvmg S_del_xpvmg
+#define S_del_xpvlv CPerlObj::S_del_xpvlv
+#define del_xpvlv S_del_xpvlv
+#define S_del_xpvbm CPerlObj::S_del_xpvbm
+#define del_xpvbm S_del_xpvbm
+#define S_del_xrv CPerlObj::S_del_xrv
+#define del_xrv S_del_xrv
+#define S_sv_unglob CPerlObj::S_sv_unglob
+#define sv_unglob S_sv_unglob
+#define S_not_a_number CPerlObj::S_not_a_number
+#define not_a_number S_not_a_number
+#define S_visit CPerlObj::S_visit
+#define visit S_visit
+#define S_sv_add_backref CPerlObj::S_sv_add_backref
+#define sv_add_backref S_sv_add_backref
+#define S_sv_del_backref CPerlObj::S_sv_del_backref
+#define sv_del_backref S_sv_del_backref
+# if defined(DEBUGGING)
+#define S_del_sv CPerlObj::S_del_sv
+#define del_sv S_del_sv
+# endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#define S_check_uni CPerlObj::S_check_uni
+#define check_uni S_check_uni
+#define S_force_next CPerlObj::S_force_next
+#define force_next S_force_next
+#define S_force_version CPerlObj::S_force_version
+#define force_version S_force_version
+#define S_force_word CPerlObj::S_force_word
+#define force_word S_force_word
+#define S_tokeq CPerlObj::S_tokeq
+#define tokeq S_tokeq
+#define S_scan_const CPerlObj::S_scan_const
+#define scan_const S_scan_const
+#define S_scan_formline CPerlObj::S_scan_formline
+#define scan_formline S_scan_formline
+#define S_scan_heredoc CPerlObj::S_scan_heredoc
+#define scan_heredoc S_scan_heredoc
+#define S_scan_ident CPerlObj::S_scan_ident
+#define scan_ident S_scan_ident
+#define S_scan_inputsymbol CPerlObj::S_scan_inputsymbol
+#define scan_inputsymbol S_scan_inputsymbol
+#define S_scan_pat CPerlObj::S_scan_pat
+#define scan_pat S_scan_pat
+#define S_scan_str CPerlObj::S_scan_str
+#define scan_str S_scan_str
+#define S_scan_subst CPerlObj::S_scan_subst
+#define scan_subst S_scan_subst
+#define S_scan_trans CPerlObj::S_scan_trans
+#define scan_trans S_scan_trans
+#define S_scan_word CPerlObj::S_scan_word
+#define scan_word S_scan_word
+#define S_skipspace CPerlObj::S_skipspace
+#define skipspace S_skipspace
+#define S_checkcomma CPerlObj::S_checkcomma
+#define checkcomma S_checkcomma
+#define S_force_ident CPerlObj::S_force_ident
+#define force_ident S_force_ident
+#define S_incline CPerlObj::S_incline
+#define incline S_incline
+#define S_intuit_method CPerlObj::S_intuit_method
+#define intuit_method S_intuit_method
+#define S_intuit_more CPerlObj::S_intuit_more
+#define intuit_more S_intuit_more
+#define S_lop CPerlObj::S_lop
+#define lop S_lop
+#define S_missingterm CPerlObj::S_missingterm
+#define missingterm S_missingterm
+#define S_no_op CPerlObj::S_no_op
+#define no_op S_no_op
+#define S_set_csh CPerlObj::S_set_csh
+#define set_csh S_set_csh
+#define S_sublex_done CPerlObj::S_sublex_done
+#define sublex_done S_sublex_done
+#define S_sublex_push CPerlObj::S_sublex_push
+#define sublex_push S_sublex_push
+#define S_sublex_start CPerlObj::S_sublex_start
+#define sublex_start S_sublex_start
+#define S_filter_gets CPerlObj::S_filter_gets
+#define filter_gets S_filter_gets
+#define S_new_constant CPerlObj::S_new_constant
+#define new_constant S_new_constant
+#define S_ao CPerlObj::S_ao
+#define ao S_ao
+#define S_depcom CPerlObj::S_depcom
+#define depcom S_depcom
+#define S_incl_perldb CPerlObj::S_incl_perldb
+#define incl_perldb S_incl_perldb
+#if 0
+#define S_utf16_textfilter CPerlObj::S_utf16_textfilter
+#define utf16_textfilter S_utf16_textfilter
+#define S_utf16rev_textfilter CPerlObj::S_utf16rev_textfilter
+#define utf16rev_textfilter S_utf16rev_textfilter
+#endif
+# if defined(CRIPPLED_CC)
+#define S_uni CPerlObj::S_uni
+#define uni S_uni
+# endif
+# if defined(PERL_CR_FILTER)
+#define S_cr_textfilter CPerlObj::S_cr_textfilter
+#define cr_textfilter S_cr_textfilter
+# endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#define S_isa_lookup CPerlObj::S_isa_lookup
+#define isa_lookup S_isa_lookup
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#define S_mess_alloc CPerlObj::S_mess_alloc
+#define mess_alloc S_mess_alloc
+# if defined(LEAKTEST)
+#define S_xstat CPerlObj::S_xstat
+#define xstat S_xstat
+# endif
+#endif
+#if defined(PERL_OBJECT)
+#endif
+#define Perl_ck_anoncode CPerlObj::Perl_ck_anoncode
+#define ck_anoncode Perl_ck_anoncode
+#define Perl_ck_bitop CPerlObj::Perl_ck_bitop
+#define ck_bitop Perl_ck_bitop
+#define Perl_ck_concat CPerlObj::Perl_ck_concat
+#define ck_concat Perl_ck_concat
+#define Perl_ck_defined CPerlObj::Perl_ck_defined
+#define ck_defined Perl_ck_defined
+#define Perl_ck_delete CPerlObj::Perl_ck_delete
+#define ck_delete Perl_ck_delete
+#define Perl_ck_eof CPerlObj::Perl_ck_eof
+#define ck_eof Perl_ck_eof
+#define Perl_ck_eval CPerlObj::Perl_ck_eval
+#define ck_eval Perl_ck_eval
+#define Perl_ck_exec CPerlObj::Perl_ck_exec
+#define ck_exec Perl_ck_exec
+#define Perl_ck_exists CPerlObj::Perl_ck_exists
+#define ck_exists Perl_ck_exists
+#define Perl_ck_exit CPerlObj::Perl_ck_exit
+#define ck_exit Perl_ck_exit
+#define Perl_ck_ftst CPerlObj::Perl_ck_ftst
+#define ck_ftst Perl_ck_ftst
+#define Perl_ck_fun CPerlObj::Perl_ck_fun
+#define ck_fun Perl_ck_fun
+#define Perl_ck_fun_locale CPerlObj::Perl_ck_fun_locale
+#define ck_fun_locale Perl_ck_fun_locale
+#define Perl_ck_glob CPerlObj::Perl_ck_glob
+#define ck_glob Perl_ck_glob
+#define Perl_ck_grep CPerlObj::Perl_ck_grep
+#define ck_grep Perl_ck_grep
+#define Perl_ck_index CPerlObj::Perl_ck_index
+#define ck_index Perl_ck_index
+#define Perl_ck_join CPerlObj::Perl_ck_join
+#define ck_join Perl_ck_join
+#define Perl_ck_lengthconst CPerlObj::Perl_ck_lengthconst
+#define ck_lengthconst Perl_ck_lengthconst
+#define Perl_ck_lfun CPerlObj::Perl_ck_lfun
+#define ck_lfun Perl_ck_lfun
+#define Perl_ck_listiob CPerlObj::Perl_ck_listiob
+#define ck_listiob Perl_ck_listiob
+#define Perl_ck_match CPerlObj::Perl_ck_match
+#define ck_match Perl_ck_match
+#define Perl_ck_method CPerlObj::Perl_ck_method
+#define ck_method Perl_ck_method
+#define Perl_ck_null CPerlObj::Perl_ck_null
+#define ck_null Perl_ck_null
+#define Perl_ck_open CPerlObj::Perl_ck_open
+#define ck_open Perl_ck_open
+#define Perl_ck_repeat CPerlObj::Perl_ck_repeat
+#define ck_repeat Perl_ck_repeat
+#define Perl_ck_require CPerlObj::Perl_ck_require
+#define ck_require Perl_ck_require
+#define Perl_ck_rfun CPerlObj::Perl_ck_rfun
+#define ck_rfun Perl_ck_rfun
+#define Perl_ck_rvconst CPerlObj::Perl_ck_rvconst
+#define ck_rvconst Perl_ck_rvconst
+#define Perl_ck_sassign CPerlObj::Perl_ck_sassign
+#define ck_sassign Perl_ck_sassign
+#define Perl_ck_scmp CPerlObj::Perl_ck_scmp
+#define ck_scmp Perl_ck_scmp
+#define Perl_ck_select CPerlObj::Perl_ck_select
+#define ck_select Perl_ck_select
+#define Perl_ck_shift CPerlObj::Perl_ck_shift
+#define ck_shift Perl_ck_shift
+#define Perl_ck_sort CPerlObj::Perl_ck_sort
+#define ck_sort Perl_ck_sort
+#define Perl_ck_spair CPerlObj::Perl_ck_spair
+#define ck_spair Perl_ck_spair
+#define Perl_ck_split CPerlObj::Perl_ck_split
+#define ck_split Perl_ck_split
+#define Perl_ck_subr CPerlObj::Perl_ck_subr
+#define ck_subr Perl_ck_subr
+#define Perl_ck_svconst CPerlObj::Perl_ck_svconst
+#define ck_svconst Perl_ck_svconst
+#define Perl_ck_trunc CPerlObj::Perl_ck_trunc
+#define ck_trunc Perl_ck_trunc
+#define Perl_pp_aassign CPerlObj::Perl_pp_aassign
+#define pp_aassign Perl_pp_aassign
+#define Perl_pp_abs CPerlObj::Perl_pp_abs
+#define pp_abs Perl_pp_abs
+#define Perl_pp_accept CPerlObj::Perl_pp_accept
+#define pp_accept Perl_pp_accept
+#define Perl_pp_add CPerlObj::Perl_pp_add
+#define pp_add Perl_pp_add
+#define Perl_pp_aelem CPerlObj::Perl_pp_aelem
+#define pp_aelem Perl_pp_aelem
+#define Perl_pp_aelemfast CPerlObj::Perl_pp_aelemfast
+#define pp_aelemfast Perl_pp_aelemfast
+#define Perl_pp_alarm CPerlObj::Perl_pp_alarm
+#define pp_alarm Perl_pp_alarm
+#define Perl_pp_and CPerlObj::Perl_pp_and
+#define pp_and Perl_pp_and
+#define Perl_pp_andassign CPerlObj::Perl_pp_andassign
+#define pp_andassign Perl_pp_andassign
+#define Perl_pp_anoncode CPerlObj::Perl_pp_anoncode
+#define pp_anoncode Perl_pp_anoncode
+#define Perl_pp_anonhash CPerlObj::Perl_pp_anonhash
+#define pp_anonhash Perl_pp_anonhash
+#define Perl_pp_anonlist CPerlObj::Perl_pp_anonlist
+#define pp_anonlist Perl_pp_anonlist
+#define Perl_pp_aslice CPerlObj::Perl_pp_aslice
+#define pp_aslice Perl_pp_aslice
+#define Perl_pp_atan2 CPerlObj::Perl_pp_atan2
+#define pp_atan2 Perl_pp_atan2
+#define Perl_pp_av2arylen CPerlObj::Perl_pp_av2arylen
+#define pp_av2arylen Perl_pp_av2arylen
+#define Perl_pp_backtick CPerlObj::Perl_pp_backtick
+#define pp_backtick Perl_pp_backtick
+#define Perl_pp_bind CPerlObj::Perl_pp_bind
+#define pp_bind Perl_pp_bind
+#define Perl_pp_binmode CPerlObj::Perl_pp_binmode
+#define pp_binmode Perl_pp_binmode
+#define Perl_pp_bit_and CPerlObj::Perl_pp_bit_and
+#define pp_bit_and Perl_pp_bit_and
+#define Perl_pp_bit_or CPerlObj::Perl_pp_bit_or
+#define pp_bit_or Perl_pp_bit_or
+#define Perl_pp_bit_xor CPerlObj::Perl_pp_bit_xor
+#define pp_bit_xor Perl_pp_bit_xor
+#define Perl_pp_bless CPerlObj::Perl_pp_bless
+#define pp_bless Perl_pp_bless
+#define Perl_pp_caller CPerlObj::Perl_pp_caller
+#define pp_caller Perl_pp_caller
+#define Perl_pp_chdir CPerlObj::Perl_pp_chdir
+#define pp_chdir Perl_pp_chdir
+#define Perl_pp_chmod CPerlObj::Perl_pp_chmod
+#define pp_chmod Perl_pp_chmod
+#define Perl_pp_chomp CPerlObj::Perl_pp_chomp
+#define pp_chomp Perl_pp_chomp
+#define Perl_pp_chop CPerlObj::Perl_pp_chop
+#define pp_chop Perl_pp_chop
+#define Perl_pp_chown CPerlObj::Perl_pp_chown
+#define pp_chown Perl_pp_chown
+#define Perl_pp_chr CPerlObj::Perl_pp_chr
+#define pp_chr Perl_pp_chr
+#define Perl_pp_chroot CPerlObj::Perl_pp_chroot
+#define pp_chroot Perl_pp_chroot
+#define Perl_pp_close CPerlObj::Perl_pp_close
+#define pp_close Perl_pp_close
+#define Perl_pp_closedir CPerlObj::Perl_pp_closedir
+#define pp_closedir Perl_pp_closedir
+#define Perl_pp_complement CPerlObj::Perl_pp_complement
+#define pp_complement Perl_pp_complement
+#define Perl_pp_concat CPerlObj::Perl_pp_concat
+#define pp_concat Perl_pp_concat
+#define Perl_pp_cond_expr CPerlObj::Perl_pp_cond_expr
+#define pp_cond_expr Perl_pp_cond_expr
+#define Perl_pp_connect CPerlObj::Perl_pp_connect
+#define pp_connect Perl_pp_connect
+#define Perl_pp_const CPerlObj::Perl_pp_const
+#define pp_const Perl_pp_const
+#define Perl_pp_cos CPerlObj::Perl_pp_cos
+#define pp_cos Perl_pp_cos
+#define Perl_pp_crypt CPerlObj::Perl_pp_crypt
+#define pp_crypt Perl_pp_crypt
+#define Perl_pp_dbmclose CPerlObj::Perl_pp_dbmclose
+#define pp_dbmclose Perl_pp_dbmclose
+#define Perl_pp_dbmopen CPerlObj::Perl_pp_dbmopen
+#define pp_dbmopen Perl_pp_dbmopen
+#define Perl_pp_dbstate CPerlObj::Perl_pp_dbstate
+#define pp_dbstate Perl_pp_dbstate
+#define Perl_pp_defined CPerlObj::Perl_pp_defined
+#define pp_defined Perl_pp_defined
+#define Perl_pp_delete CPerlObj::Perl_pp_delete
+#define pp_delete Perl_pp_delete
+#define Perl_pp_die CPerlObj::Perl_pp_die
+#define pp_die Perl_pp_die
+#define Perl_pp_divide CPerlObj::Perl_pp_divide
+#define pp_divide Perl_pp_divide
+#define Perl_pp_dofile CPerlObj::Perl_pp_dofile
+#define pp_dofile Perl_pp_dofile
+#define Perl_pp_dump CPerlObj::Perl_pp_dump
+#define pp_dump Perl_pp_dump
+#define Perl_pp_each CPerlObj::Perl_pp_each
+#define pp_each Perl_pp_each
+#define Perl_pp_egrent CPerlObj::Perl_pp_egrent
+#define pp_egrent Perl_pp_egrent
+#define Perl_pp_ehostent CPerlObj::Perl_pp_ehostent
+#define pp_ehostent Perl_pp_ehostent
+#define Perl_pp_enetent CPerlObj::Perl_pp_enetent
+#define pp_enetent Perl_pp_enetent
+#define Perl_pp_enter CPerlObj::Perl_pp_enter
+#define pp_enter Perl_pp_enter
+#define Perl_pp_entereval CPerlObj::Perl_pp_entereval
+#define pp_entereval Perl_pp_entereval
+#define Perl_pp_enteriter CPerlObj::Perl_pp_enteriter
+#define pp_enteriter Perl_pp_enteriter
+#define Perl_pp_enterloop CPerlObj::Perl_pp_enterloop
+#define pp_enterloop Perl_pp_enterloop
+#define Perl_pp_entersub CPerlObj::Perl_pp_entersub
+#define pp_entersub Perl_pp_entersub
+#define Perl_pp_entertry CPerlObj::Perl_pp_entertry
+#define pp_entertry Perl_pp_entertry
+#define Perl_pp_enterwrite CPerlObj::Perl_pp_enterwrite
+#define pp_enterwrite Perl_pp_enterwrite
+#define Perl_pp_eof CPerlObj::Perl_pp_eof
+#define pp_eof Perl_pp_eof
+#define Perl_pp_eprotoent CPerlObj::Perl_pp_eprotoent
+#define pp_eprotoent Perl_pp_eprotoent
+#define Perl_pp_epwent CPerlObj::Perl_pp_epwent
+#define pp_epwent Perl_pp_epwent
+#define Perl_pp_eq CPerlObj::Perl_pp_eq
+#define pp_eq Perl_pp_eq
+#define Perl_pp_eservent CPerlObj::Perl_pp_eservent
+#define pp_eservent Perl_pp_eservent
+#define Perl_pp_exec CPerlObj::Perl_pp_exec
+#define pp_exec Perl_pp_exec
+#define Perl_pp_exists CPerlObj::Perl_pp_exists
+#define pp_exists Perl_pp_exists
+#define Perl_pp_exit CPerlObj::Perl_pp_exit
+#define pp_exit Perl_pp_exit
+#define Perl_pp_exp CPerlObj::Perl_pp_exp
+#define pp_exp Perl_pp_exp
+#define Perl_pp_fcntl CPerlObj::Perl_pp_fcntl
+#define pp_fcntl Perl_pp_fcntl
+#define Perl_pp_fileno CPerlObj::Perl_pp_fileno
+#define pp_fileno Perl_pp_fileno
+#define Perl_pp_flip CPerlObj::Perl_pp_flip
+#define pp_flip Perl_pp_flip
+#define Perl_pp_flock CPerlObj::Perl_pp_flock
+#define pp_flock Perl_pp_flock
+#define Perl_pp_flop CPerlObj::Perl_pp_flop
+#define pp_flop Perl_pp_flop
+#define Perl_pp_fork CPerlObj::Perl_pp_fork
+#define pp_fork Perl_pp_fork
+#define Perl_pp_formline CPerlObj::Perl_pp_formline
+#define pp_formline Perl_pp_formline
+#define Perl_pp_ftatime CPerlObj::Perl_pp_ftatime
+#define pp_ftatime Perl_pp_ftatime
+#define Perl_pp_ftbinary CPerlObj::Perl_pp_ftbinary
+#define pp_ftbinary Perl_pp_ftbinary
+#define Perl_pp_ftblk CPerlObj::Perl_pp_ftblk
+#define pp_ftblk Perl_pp_ftblk
+#define Perl_pp_ftchr CPerlObj::Perl_pp_ftchr
+#define pp_ftchr Perl_pp_ftchr
+#define Perl_pp_ftctime CPerlObj::Perl_pp_ftctime
+#define pp_ftctime Perl_pp_ftctime
+#define Perl_pp_ftdir CPerlObj::Perl_pp_ftdir
+#define pp_ftdir Perl_pp_ftdir
+#define Perl_pp_fteexec CPerlObj::Perl_pp_fteexec
+#define pp_fteexec Perl_pp_fteexec
+#define Perl_pp_fteowned CPerlObj::Perl_pp_fteowned
+#define pp_fteowned Perl_pp_fteowned
+#define Perl_pp_fteread CPerlObj::Perl_pp_fteread
+#define pp_fteread Perl_pp_fteread
+#define Perl_pp_ftewrite CPerlObj::Perl_pp_ftewrite
+#define pp_ftewrite Perl_pp_ftewrite
+#define Perl_pp_ftfile CPerlObj::Perl_pp_ftfile
+#define pp_ftfile Perl_pp_ftfile
+#define Perl_pp_ftis CPerlObj::Perl_pp_ftis
+#define pp_ftis Perl_pp_ftis
+#define Perl_pp_ftlink CPerlObj::Perl_pp_ftlink
+#define pp_ftlink Perl_pp_ftlink
+#define Perl_pp_ftmtime CPerlObj::Perl_pp_ftmtime
+#define pp_ftmtime Perl_pp_ftmtime
+#define Perl_pp_ftpipe CPerlObj::Perl_pp_ftpipe
+#define pp_ftpipe Perl_pp_ftpipe
+#define Perl_pp_ftrexec CPerlObj::Perl_pp_ftrexec
+#define pp_ftrexec Perl_pp_ftrexec
+#define Perl_pp_ftrowned CPerlObj::Perl_pp_ftrowned
+#define pp_ftrowned Perl_pp_ftrowned
+#define Perl_pp_ftrread CPerlObj::Perl_pp_ftrread
+#define pp_ftrread Perl_pp_ftrread
+#define Perl_pp_ftrwrite CPerlObj::Perl_pp_ftrwrite
+#define pp_ftrwrite Perl_pp_ftrwrite
+#define Perl_pp_ftsgid CPerlObj::Perl_pp_ftsgid
+#define pp_ftsgid Perl_pp_ftsgid
+#define Perl_pp_ftsize CPerlObj::Perl_pp_ftsize
+#define pp_ftsize Perl_pp_ftsize
+#define Perl_pp_ftsock CPerlObj::Perl_pp_ftsock
+#define pp_ftsock Perl_pp_ftsock
+#define Perl_pp_ftsuid CPerlObj::Perl_pp_ftsuid
+#define pp_ftsuid Perl_pp_ftsuid
+#define Perl_pp_ftsvtx CPerlObj::Perl_pp_ftsvtx
+#define pp_ftsvtx Perl_pp_ftsvtx
+#define Perl_pp_fttext CPerlObj::Perl_pp_fttext
+#define pp_fttext Perl_pp_fttext
+#define Perl_pp_fttty CPerlObj::Perl_pp_fttty
+#define pp_fttty Perl_pp_fttty
+#define Perl_pp_ftzero CPerlObj::Perl_pp_ftzero
+#define pp_ftzero Perl_pp_ftzero
+#define Perl_pp_ge CPerlObj::Perl_pp_ge
+#define pp_ge Perl_pp_ge
+#define Perl_pp_gelem CPerlObj::Perl_pp_gelem
+#define pp_gelem Perl_pp_gelem
+#define Perl_pp_getc CPerlObj::Perl_pp_getc
+#define pp_getc Perl_pp_getc
+#define Perl_pp_getlogin CPerlObj::Perl_pp_getlogin
+#define pp_getlogin Perl_pp_getlogin
+#define Perl_pp_getpeername CPerlObj::Perl_pp_getpeername
+#define pp_getpeername Perl_pp_getpeername
+#define Perl_pp_getpgrp CPerlObj::Perl_pp_getpgrp
+#define pp_getpgrp Perl_pp_getpgrp
+#define Perl_pp_getppid CPerlObj::Perl_pp_getppid
+#define pp_getppid Perl_pp_getppid
+#define Perl_pp_getpriority CPerlObj::Perl_pp_getpriority
+#define pp_getpriority Perl_pp_getpriority
+#define Perl_pp_getsockname CPerlObj::Perl_pp_getsockname
+#define pp_getsockname Perl_pp_getsockname
+#define Perl_pp_ggrent CPerlObj::Perl_pp_ggrent
+#define pp_ggrent Perl_pp_ggrent
+#define Perl_pp_ggrgid CPerlObj::Perl_pp_ggrgid
+#define pp_ggrgid Perl_pp_ggrgid
+#define Perl_pp_ggrnam CPerlObj::Perl_pp_ggrnam
+#define pp_ggrnam Perl_pp_ggrnam
+#define Perl_pp_ghbyaddr CPerlObj::Perl_pp_ghbyaddr
+#define pp_ghbyaddr Perl_pp_ghbyaddr
+#define Perl_pp_ghbyname CPerlObj::Perl_pp_ghbyname
+#define pp_ghbyname Perl_pp_ghbyname
+#define Perl_pp_ghostent CPerlObj::Perl_pp_ghostent
+#define pp_ghostent Perl_pp_ghostent
+#define Perl_pp_glob CPerlObj::Perl_pp_glob
+#define pp_glob Perl_pp_glob
+#define Perl_pp_gmtime CPerlObj::Perl_pp_gmtime
+#define pp_gmtime Perl_pp_gmtime
+#define Perl_pp_gnbyaddr CPerlObj::Perl_pp_gnbyaddr
+#define pp_gnbyaddr Perl_pp_gnbyaddr
+#define Perl_pp_gnbyname CPerlObj::Perl_pp_gnbyname
+#define pp_gnbyname Perl_pp_gnbyname
+#define Perl_pp_gnetent CPerlObj::Perl_pp_gnetent
+#define pp_gnetent Perl_pp_gnetent
+#define Perl_pp_goto CPerlObj::Perl_pp_goto
+#define pp_goto Perl_pp_goto
+#define Perl_pp_gpbyname CPerlObj::Perl_pp_gpbyname
+#define pp_gpbyname Perl_pp_gpbyname
+#define Perl_pp_gpbynumber CPerlObj::Perl_pp_gpbynumber
+#define pp_gpbynumber Perl_pp_gpbynumber
+#define Perl_pp_gprotoent CPerlObj::Perl_pp_gprotoent
+#define pp_gprotoent Perl_pp_gprotoent
+#define Perl_pp_gpwent CPerlObj::Perl_pp_gpwent
+#define pp_gpwent Perl_pp_gpwent
+#define Perl_pp_gpwnam CPerlObj::Perl_pp_gpwnam
+#define pp_gpwnam Perl_pp_gpwnam
+#define Perl_pp_gpwuid CPerlObj::Perl_pp_gpwuid
+#define pp_gpwuid Perl_pp_gpwuid
+#define Perl_pp_grepstart CPerlObj::Perl_pp_grepstart
+#define pp_grepstart Perl_pp_grepstart
+#define Perl_pp_grepwhile CPerlObj::Perl_pp_grepwhile
+#define pp_grepwhile Perl_pp_grepwhile
+#define Perl_pp_gsbyname CPerlObj::Perl_pp_gsbyname
+#define pp_gsbyname Perl_pp_gsbyname
+#define Perl_pp_gsbyport CPerlObj::Perl_pp_gsbyport
+#define pp_gsbyport Perl_pp_gsbyport
+#define Perl_pp_gservent CPerlObj::Perl_pp_gservent
+#define pp_gservent Perl_pp_gservent
+#define Perl_pp_gsockopt CPerlObj::Perl_pp_gsockopt
+#define pp_gsockopt Perl_pp_gsockopt
+#define Perl_pp_gt CPerlObj::Perl_pp_gt
+#define pp_gt Perl_pp_gt
+#define Perl_pp_gv CPerlObj::Perl_pp_gv
+#define pp_gv Perl_pp_gv
+#define Perl_pp_gvsv CPerlObj::Perl_pp_gvsv
+#define pp_gvsv Perl_pp_gvsv
+#define Perl_pp_helem CPerlObj::Perl_pp_helem
+#define pp_helem Perl_pp_helem
+#define Perl_pp_hex CPerlObj::Perl_pp_hex
+#define pp_hex Perl_pp_hex
+#define Perl_pp_hslice CPerlObj::Perl_pp_hslice
+#define pp_hslice Perl_pp_hslice
+#define Perl_pp_i_add CPerlObj::Perl_pp_i_add
+#define pp_i_add Perl_pp_i_add
+#define Perl_pp_i_divide CPerlObj::Perl_pp_i_divide
+#define pp_i_divide Perl_pp_i_divide
+#define Perl_pp_i_eq CPerlObj::Perl_pp_i_eq
+#define pp_i_eq Perl_pp_i_eq
+#define Perl_pp_i_ge CPerlObj::Perl_pp_i_ge
+#define pp_i_ge Perl_pp_i_ge
+#define Perl_pp_i_gt CPerlObj::Perl_pp_i_gt
+#define pp_i_gt Perl_pp_i_gt
+#define Perl_pp_i_le CPerlObj::Perl_pp_i_le
+#define pp_i_le Perl_pp_i_le
+#define Perl_pp_i_lt CPerlObj::Perl_pp_i_lt
+#define pp_i_lt Perl_pp_i_lt
+#define Perl_pp_i_modulo CPerlObj::Perl_pp_i_modulo
+#define pp_i_modulo Perl_pp_i_modulo
+#define Perl_pp_i_multiply CPerlObj::Perl_pp_i_multiply
+#define pp_i_multiply Perl_pp_i_multiply
+#define Perl_pp_i_ncmp CPerlObj::Perl_pp_i_ncmp
+#define pp_i_ncmp Perl_pp_i_ncmp
+#define Perl_pp_i_ne CPerlObj::Perl_pp_i_ne
+#define pp_i_ne Perl_pp_i_ne
+#define Perl_pp_i_negate CPerlObj::Perl_pp_i_negate
+#define pp_i_negate Perl_pp_i_negate
+#define Perl_pp_i_subtract CPerlObj::Perl_pp_i_subtract
+#define pp_i_subtract Perl_pp_i_subtract
+#define Perl_pp_index CPerlObj::Perl_pp_index
+#define pp_index Perl_pp_index
+#define Perl_pp_int CPerlObj::Perl_pp_int
+#define pp_int Perl_pp_int
+#define Perl_pp_ioctl CPerlObj::Perl_pp_ioctl
+#define pp_ioctl Perl_pp_ioctl
+#define Perl_pp_iter CPerlObj::Perl_pp_iter
+#define pp_iter Perl_pp_iter
+#define Perl_pp_join CPerlObj::Perl_pp_join
+#define pp_join Perl_pp_join
+#define Perl_pp_keys CPerlObj::Perl_pp_keys
+#define pp_keys Perl_pp_keys
+#define Perl_pp_kill CPerlObj::Perl_pp_kill
+#define pp_kill Perl_pp_kill
+#define Perl_pp_last CPerlObj::Perl_pp_last
+#define pp_last Perl_pp_last
+#define Perl_pp_lc CPerlObj::Perl_pp_lc
+#define pp_lc Perl_pp_lc
+#define Perl_pp_lcfirst CPerlObj::Perl_pp_lcfirst
+#define pp_lcfirst Perl_pp_lcfirst
+#define Perl_pp_le CPerlObj::Perl_pp_le
+#define pp_le Perl_pp_le
+#define Perl_pp_leave CPerlObj::Perl_pp_leave
+#define pp_leave Perl_pp_leave
+#define Perl_pp_leaveeval CPerlObj::Perl_pp_leaveeval
+#define pp_leaveeval Perl_pp_leaveeval
+#define Perl_pp_leaveloop CPerlObj::Perl_pp_leaveloop
+#define pp_leaveloop Perl_pp_leaveloop
+#define Perl_pp_leavesub CPerlObj::Perl_pp_leavesub
+#define pp_leavesub Perl_pp_leavesub
+#define Perl_pp_leavesublv CPerlObj::Perl_pp_leavesublv
+#define pp_leavesublv Perl_pp_leavesublv
+#define Perl_pp_leavetry CPerlObj::Perl_pp_leavetry
+#define pp_leavetry Perl_pp_leavetry
+#define Perl_pp_leavewrite CPerlObj::Perl_pp_leavewrite
+#define pp_leavewrite Perl_pp_leavewrite
+#define Perl_pp_left_shift CPerlObj::Perl_pp_left_shift
+#define pp_left_shift Perl_pp_left_shift
+#define Perl_pp_length CPerlObj::Perl_pp_length
+#define pp_length Perl_pp_length
+#define Perl_pp_lineseq CPerlObj::Perl_pp_lineseq
+#define pp_lineseq Perl_pp_lineseq
+#define Perl_pp_link CPerlObj::Perl_pp_link
+#define pp_link Perl_pp_link
+#define Perl_pp_list CPerlObj::Perl_pp_list
+#define pp_list Perl_pp_list
+#define Perl_pp_listen CPerlObj::Perl_pp_listen
+#define pp_listen Perl_pp_listen
+#define Perl_pp_localtime CPerlObj::Perl_pp_localtime
+#define pp_localtime Perl_pp_localtime
+#define Perl_pp_lock CPerlObj::Perl_pp_lock
+#define pp_lock Perl_pp_lock
+#define Perl_pp_log CPerlObj::Perl_pp_log
+#define pp_log Perl_pp_log
+#define Perl_pp_lslice CPerlObj::Perl_pp_lslice
+#define pp_lslice Perl_pp_lslice
+#define Perl_pp_lstat CPerlObj::Perl_pp_lstat
+#define pp_lstat Perl_pp_lstat
+#define Perl_pp_lt CPerlObj::Perl_pp_lt
+#define pp_lt Perl_pp_lt
+#define Perl_pp_mapstart CPerlObj::Perl_pp_mapstart
+#define pp_mapstart Perl_pp_mapstart
+#define Perl_pp_mapwhile CPerlObj::Perl_pp_mapwhile
+#define pp_mapwhile Perl_pp_mapwhile
+#define Perl_pp_match CPerlObj::Perl_pp_match
+#define pp_match Perl_pp_match
+#define Perl_pp_method CPerlObj::Perl_pp_method
+#define pp_method Perl_pp_method
+#define Perl_pp_method_named CPerlObj::Perl_pp_method_named
+#define pp_method_named Perl_pp_method_named
+#define Perl_pp_mkdir CPerlObj::Perl_pp_mkdir
+#define pp_mkdir Perl_pp_mkdir
+#define Perl_pp_modulo CPerlObj::Perl_pp_modulo
+#define pp_modulo Perl_pp_modulo
+#define Perl_pp_msgctl CPerlObj::Perl_pp_msgctl
+#define pp_msgctl Perl_pp_msgctl
+#define Perl_pp_msgget CPerlObj::Perl_pp_msgget
+#define pp_msgget Perl_pp_msgget
+#define Perl_pp_msgrcv CPerlObj::Perl_pp_msgrcv
+#define pp_msgrcv Perl_pp_msgrcv
+#define Perl_pp_msgsnd CPerlObj::Perl_pp_msgsnd
+#define pp_msgsnd Perl_pp_msgsnd
+#define Perl_pp_multiply CPerlObj::Perl_pp_multiply
+#define pp_multiply Perl_pp_multiply
+#define Perl_pp_ncmp CPerlObj::Perl_pp_ncmp
+#define pp_ncmp Perl_pp_ncmp
+#define Perl_pp_ne CPerlObj::Perl_pp_ne
+#define pp_ne Perl_pp_ne
+#define Perl_pp_negate CPerlObj::Perl_pp_negate
+#define pp_negate Perl_pp_negate
+#define Perl_pp_next CPerlObj::Perl_pp_next
+#define pp_next Perl_pp_next
+#define Perl_pp_nextstate CPerlObj::Perl_pp_nextstate
+#define pp_nextstate Perl_pp_nextstate
+#define Perl_pp_not CPerlObj::Perl_pp_not
+#define pp_not Perl_pp_not
+#define Perl_pp_null CPerlObj::Perl_pp_null
+#define pp_null Perl_pp_null
+#define Perl_pp_oct CPerlObj::Perl_pp_oct
+#define pp_oct Perl_pp_oct
+#define Perl_pp_open CPerlObj::Perl_pp_open
+#define pp_open Perl_pp_open
+#define Perl_pp_open_dir CPerlObj::Perl_pp_open_dir
+#define pp_open_dir Perl_pp_open_dir
+#define Perl_pp_or CPerlObj::Perl_pp_or
+#define pp_or Perl_pp_or
+#define Perl_pp_orassign CPerlObj::Perl_pp_orassign
+#define pp_orassign Perl_pp_orassign
+#define Perl_pp_ord CPerlObj::Perl_pp_ord
+#define pp_ord Perl_pp_ord
+#define Perl_pp_pack CPerlObj::Perl_pp_pack
+#define pp_pack Perl_pp_pack
+#define Perl_pp_padany CPerlObj::Perl_pp_padany
+#define pp_padany Perl_pp_padany
+#define Perl_pp_padav CPerlObj::Perl_pp_padav
+#define pp_padav Perl_pp_padav
+#define Perl_pp_padhv CPerlObj::Perl_pp_padhv
+#define pp_padhv Perl_pp_padhv
+#define Perl_pp_padsv CPerlObj::Perl_pp_padsv
+#define pp_padsv Perl_pp_padsv
+#define Perl_pp_pipe_op CPerlObj::Perl_pp_pipe_op
+#define pp_pipe_op Perl_pp_pipe_op
+#define Perl_pp_pop CPerlObj::Perl_pp_pop
+#define pp_pop Perl_pp_pop
+#define Perl_pp_pos CPerlObj::Perl_pp_pos
+#define pp_pos Perl_pp_pos
+#define Perl_pp_postdec CPerlObj::Perl_pp_postdec
+#define pp_postdec Perl_pp_postdec
+#define Perl_pp_postinc CPerlObj::Perl_pp_postinc
+#define pp_postinc Perl_pp_postinc
+#define Perl_pp_pow CPerlObj::Perl_pp_pow
+#define pp_pow Perl_pp_pow
+#define Perl_pp_predec CPerlObj::Perl_pp_predec
+#define pp_predec Perl_pp_predec
+#define Perl_pp_preinc CPerlObj::Perl_pp_preinc
+#define pp_preinc Perl_pp_preinc
+#define Perl_pp_print CPerlObj::Perl_pp_print
+#define pp_print Perl_pp_print
+#define Perl_pp_prototype CPerlObj::Perl_pp_prototype
+#define pp_prototype Perl_pp_prototype
+#define Perl_pp_prtf CPerlObj::Perl_pp_prtf
+#define pp_prtf Perl_pp_prtf
+#define Perl_pp_push CPerlObj::Perl_pp_push
+#define pp_push Perl_pp_push
+#define Perl_pp_pushmark CPerlObj::Perl_pp_pushmark
+#define pp_pushmark Perl_pp_pushmark
+#define Perl_pp_pushre CPerlObj::Perl_pp_pushre
+#define pp_pushre Perl_pp_pushre
+#define Perl_pp_qr CPerlObj::Perl_pp_qr
+#define pp_qr Perl_pp_qr
+#define Perl_pp_quotemeta CPerlObj::Perl_pp_quotemeta
+#define pp_quotemeta Perl_pp_quotemeta
+#define Perl_pp_rand CPerlObj::Perl_pp_rand
+#define pp_rand Perl_pp_rand
+#define Perl_pp_range CPerlObj::Perl_pp_range
+#define pp_range Perl_pp_range
+#define Perl_pp_rcatline CPerlObj::Perl_pp_rcatline
+#define pp_rcatline Perl_pp_rcatline
+#define Perl_pp_read CPerlObj::Perl_pp_read
+#define pp_read Perl_pp_read
+#define Perl_pp_readdir CPerlObj::Perl_pp_readdir
+#define pp_readdir Perl_pp_readdir
+#define Perl_pp_readline CPerlObj::Perl_pp_readline
+#define pp_readline Perl_pp_readline
+#define Perl_pp_readlink CPerlObj::Perl_pp_readlink
+#define pp_readlink Perl_pp_readlink
+#define Perl_pp_recv CPerlObj::Perl_pp_recv
+#define pp_recv Perl_pp_recv
+#define Perl_pp_redo CPerlObj::Perl_pp_redo
+#define pp_redo Perl_pp_redo
+#define Perl_pp_ref CPerlObj::Perl_pp_ref
+#define pp_ref Perl_pp_ref
+#define Perl_pp_refgen CPerlObj::Perl_pp_refgen
+#define pp_refgen Perl_pp_refgen
+#define Perl_pp_regcmaybe CPerlObj::Perl_pp_regcmaybe
+#define pp_regcmaybe Perl_pp_regcmaybe
+#define Perl_pp_regcomp CPerlObj::Perl_pp_regcomp
+#define pp_regcomp Perl_pp_regcomp
+#define Perl_pp_regcreset CPerlObj::Perl_pp_regcreset
+#define pp_regcreset Perl_pp_regcreset
+#define Perl_pp_rename CPerlObj::Perl_pp_rename
+#define pp_rename Perl_pp_rename
+#define Perl_pp_repeat CPerlObj::Perl_pp_repeat
+#define pp_repeat Perl_pp_repeat
+#define Perl_pp_require CPerlObj::Perl_pp_require
+#define pp_require Perl_pp_require
+#define Perl_pp_reset CPerlObj::Perl_pp_reset
+#define pp_reset Perl_pp_reset
+#define Perl_pp_return CPerlObj::Perl_pp_return
+#define pp_return Perl_pp_return
+#define Perl_pp_reverse CPerlObj::Perl_pp_reverse
+#define pp_reverse Perl_pp_reverse
+#define Perl_pp_rewinddir CPerlObj::Perl_pp_rewinddir
+#define pp_rewinddir Perl_pp_rewinddir
+#define Perl_pp_right_shift CPerlObj::Perl_pp_right_shift
+#define pp_right_shift Perl_pp_right_shift
+#define Perl_pp_rindex CPerlObj::Perl_pp_rindex
+#define pp_rindex Perl_pp_rindex
+#define Perl_pp_rmdir CPerlObj::Perl_pp_rmdir
+#define pp_rmdir Perl_pp_rmdir
+#define Perl_pp_rv2av CPerlObj::Perl_pp_rv2av
+#define pp_rv2av Perl_pp_rv2av
+#define Perl_pp_rv2cv CPerlObj::Perl_pp_rv2cv
+#define pp_rv2cv Perl_pp_rv2cv
+#define Perl_pp_rv2gv CPerlObj::Perl_pp_rv2gv
+#define pp_rv2gv Perl_pp_rv2gv
+#define Perl_pp_rv2hv CPerlObj::Perl_pp_rv2hv
+#define pp_rv2hv Perl_pp_rv2hv
+#define Perl_pp_rv2sv CPerlObj::Perl_pp_rv2sv
+#define pp_rv2sv Perl_pp_rv2sv
+#define Perl_pp_sassign CPerlObj::Perl_pp_sassign
+#define pp_sassign Perl_pp_sassign
+#define Perl_pp_scalar CPerlObj::Perl_pp_scalar
+#define pp_scalar Perl_pp_scalar
+#define Perl_pp_schomp CPerlObj::Perl_pp_schomp
+#define pp_schomp Perl_pp_schomp
+#define Perl_pp_schop CPerlObj::Perl_pp_schop
+#define pp_schop Perl_pp_schop
+#define Perl_pp_scmp CPerlObj::Perl_pp_scmp
+#define pp_scmp Perl_pp_scmp
+#define Perl_pp_scope CPerlObj::Perl_pp_scope
+#define pp_scope Perl_pp_scope
+#define Perl_pp_seek CPerlObj::Perl_pp_seek
+#define pp_seek Perl_pp_seek
+#define Perl_pp_seekdir CPerlObj::Perl_pp_seekdir
+#define pp_seekdir Perl_pp_seekdir
+#define Perl_pp_select CPerlObj::Perl_pp_select
+#define pp_select Perl_pp_select
+#define Perl_pp_semctl CPerlObj::Perl_pp_semctl
+#define pp_semctl Perl_pp_semctl
+#define Perl_pp_semget CPerlObj::Perl_pp_semget
+#define pp_semget Perl_pp_semget
+#define Perl_pp_semop CPerlObj::Perl_pp_semop
+#define pp_semop Perl_pp_semop
+#define Perl_pp_send CPerlObj::Perl_pp_send
+#define pp_send Perl_pp_send
+#define Perl_pp_seq CPerlObj::Perl_pp_seq
+#define pp_seq Perl_pp_seq
+#define Perl_pp_setpgrp CPerlObj::Perl_pp_setpgrp
+#define pp_setpgrp Perl_pp_setpgrp
+#define Perl_pp_setpriority CPerlObj::Perl_pp_setpriority
+#define pp_setpriority Perl_pp_setpriority
+#define Perl_pp_setstate CPerlObj::Perl_pp_setstate
+#define pp_setstate Perl_pp_setstate
+#define Perl_pp_sge CPerlObj::Perl_pp_sge
+#define pp_sge Perl_pp_sge
+#define Perl_pp_sgrent CPerlObj::Perl_pp_sgrent
+#define pp_sgrent Perl_pp_sgrent
+#define Perl_pp_sgt CPerlObj::Perl_pp_sgt
+#define pp_sgt Perl_pp_sgt
+#define Perl_pp_shift CPerlObj::Perl_pp_shift
+#define pp_shift Perl_pp_shift
+#define Perl_pp_shmctl CPerlObj::Perl_pp_shmctl
+#define pp_shmctl Perl_pp_shmctl
+#define Perl_pp_shmget CPerlObj::Perl_pp_shmget
+#define pp_shmget Perl_pp_shmget
+#define Perl_pp_shmread CPerlObj::Perl_pp_shmread
+#define pp_shmread Perl_pp_shmread
+#define Perl_pp_shmwrite CPerlObj::Perl_pp_shmwrite
+#define pp_shmwrite Perl_pp_shmwrite
+#define Perl_pp_shostent CPerlObj::Perl_pp_shostent
+#define pp_shostent Perl_pp_shostent
+#define Perl_pp_shutdown CPerlObj::Perl_pp_shutdown
+#define pp_shutdown Perl_pp_shutdown
+#define Perl_pp_sin CPerlObj::Perl_pp_sin
+#define pp_sin Perl_pp_sin
+#define Perl_pp_sle CPerlObj::Perl_pp_sle
+#define pp_sle Perl_pp_sle
+#define Perl_pp_sleep CPerlObj::Perl_pp_sleep
+#define pp_sleep Perl_pp_sleep
+#define Perl_pp_slt CPerlObj::Perl_pp_slt
+#define pp_slt Perl_pp_slt
+#define Perl_pp_sne CPerlObj::Perl_pp_sne
+#define pp_sne Perl_pp_sne
+#define Perl_pp_snetent CPerlObj::Perl_pp_snetent
+#define pp_snetent Perl_pp_snetent
+#define Perl_pp_socket CPerlObj::Perl_pp_socket
+#define pp_socket Perl_pp_socket
+#define Perl_pp_sockpair CPerlObj::Perl_pp_sockpair
+#define pp_sockpair Perl_pp_sockpair
+#define Perl_pp_sort CPerlObj::Perl_pp_sort
+#define pp_sort Perl_pp_sort
+#define Perl_pp_splice CPerlObj::Perl_pp_splice
+#define pp_splice Perl_pp_splice
+#define Perl_pp_split CPerlObj::Perl_pp_split
+#define pp_split Perl_pp_split
+#define Perl_pp_sprintf CPerlObj::Perl_pp_sprintf
+#define pp_sprintf Perl_pp_sprintf
+#define Perl_pp_sprotoent CPerlObj::Perl_pp_sprotoent
+#define pp_sprotoent Perl_pp_sprotoent
+#define Perl_pp_spwent CPerlObj::Perl_pp_spwent
+#define pp_spwent Perl_pp_spwent
+#define Perl_pp_sqrt CPerlObj::Perl_pp_sqrt
+#define pp_sqrt Perl_pp_sqrt
+#define Perl_pp_srand CPerlObj::Perl_pp_srand
+#define pp_srand Perl_pp_srand
+#define Perl_pp_srefgen CPerlObj::Perl_pp_srefgen
+#define pp_srefgen Perl_pp_srefgen
+#define Perl_pp_sselect CPerlObj::Perl_pp_sselect
+#define pp_sselect Perl_pp_sselect
+#define Perl_pp_sservent CPerlObj::Perl_pp_sservent
+#define pp_sservent Perl_pp_sservent
+#define Perl_pp_ssockopt CPerlObj::Perl_pp_ssockopt
+#define pp_ssockopt Perl_pp_ssockopt
+#define Perl_pp_stat CPerlObj::Perl_pp_stat
+#define pp_stat Perl_pp_stat
+#define Perl_pp_stringify CPerlObj::Perl_pp_stringify
+#define pp_stringify Perl_pp_stringify
+#define Perl_pp_stub CPerlObj::Perl_pp_stub
+#define pp_stub Perl_pp_stub
+#define Perl_pp_study CPerlObj::Perl_pp_study
+#define pp_study Perl_pp_study
+#define Perl_pp_subst CPerlObj::Perl_pp_subst
+#define pp_subst Perl_pp_subst
+#define Perl_pp_substcont CPerlObj::Perl_pp_substcont
+#define pp_substcont Perl_pp_substcont
+#define Perl_pp_substr CPerlObj::Perl_pp_substr
+#define pp_substr Perl_pp_substr
+#define Perl_pp_subtract CPerlObj::Perl_pp_subtract
+#define pp_subtract Perl_pp_subtract
+#define Perl_pp_symlink CPerlObj::Perl_pp_symlink
+#define pp_symlink Perl_pp_symlink
+#define Perl_pp_syscall CPerlObj::Perl_pp_syscall
+#define pp_syscall Perl_pp_syscall
+#define Perl_pp_sysopen CPerlObj::Perl_pp_sysopen
+#define pp_sysopen Perl_pp_sysopen
+#define Perl_pp_sysread CPerlObj::Perl_pp_sysread
+#define pp_sysread Perl_pp_sysread
+#define Perl_pp_sysseek CPerlObj::Perl_pp_sysseek
+#define pp_sysseek Perl_pp_sysseek
+#define Perl_pp_system CPerlObj::Perl_pp_system
+#define pp_system Perl_pp_system
+#define Perl_pp_syswrite CPerlObj::Perl_pp_syswrite
+#define pp_syswrite Perl_pp_syswrite
+#define Perl_pp_tell CPerlObj::Perl_pp_tell
+#define pp_tell Perl_pp_tell
+#define Perl_pp_telldir CPerlObj::Perl_pp_telldir
+#define pp_telldir Perl_pp_telldir
+#define Perl_pp_threadsv CPerlObj::Perl_pp_threadsv
+#define pp_threadsv Perl_pp_threadsv
+#define Perl_pp_tie CPerlObj::Perl_pp_tie
+#define pp_tie Perl_pp_tie
+#define Perl_pp_tied CPerlObj::Perl_pp_tied
+#define pp_tied Perl_pp_tied
+#define Perl_pp_time CPerlObj::Perl_pp_time
+#define pp_time Perl_pp_time
+#define Perl_pp_tms CPerlObj::Perl_pp_tms
+#define pp_tms Perl_pp_tms
+#define Perl_pp_trans CPerlObj::Perl_pp_trans
+#define pp_trans Perl_pp_trans
+#define Perl_pp_truncate CPerlObj::Perl_pp_truncate
+#define pp_truncate Perl_pp_truncate
+#define Perl_pp_uc CPerlObj::Perl_pp_uc
+#define pp_uc Perl_pp_uc
+#define Perl_pp_ucfirst CPerlObj::Perl_pp_ucfirst
+#define pp_ucfirst Perl_pp_ucfirst
+#define Perl_pp_umask CPerlObj::Perl_pp_umask
+#define pp_umask Perl_pp_umask
+#define Perl_pp_undef CPerlObj::Perl_pp_undef
+#define pp_undef Perl_pp_undef
+#define Perl_pp_unlink CPerlObj::Perl_pp_unlink
+#define pp_unlink Perl_pp_unlink
+#define Perl_pp_unpack CPerlObj::Perl_pp_unpack
+#define pp_unpack Perl_pp_unpack
+#define Perl_pp_unshift CPerlObj::Perl_pp_unshift
+#define pp_unshift Perl_pp_unshift
+#define Perl_pp_unstack CPerlObj::Perl_pp_unstack
+#define pp_unstack Perl_pp_unstack
+#define Perl_pp_untie CPerlObj::Perl_pp_untie
+#define pp_untie Perl_pp_untie
+#define Perl_pp_utime CPerlObj::Perl_pp_utime
+#define pp_utime Perl_pp_utime
+#define Perl_pp_values CPerlObj::Perl_pp_values
+#define pp_values Perl_pp_values
+#define Perl_pp_vec CPerlObj::Perl_pp_vec
+#define pp_vec Perl_pp_vec
+#define Perl_pp_wait CPerlObj::Perl_pp_wait
+#define pp_wait Perl_pp_wait
+#define Perl_pp_waitpid CPerlObj::Perl_pp_waitpid
+#define pp_waitpid Perl_pp_waitpid
+#define Perl_pp_wantarray CPerlObj::Perl_pp_wantarray
+#define pp_wantarray Perl_pp_wantarray
+#define Perl_pp_warn CPerlObj::Perl_pp_warn
+#define pp_warn Perl_pp_warn
+#define Perl_pp_xor CPerlObj::Perl_pp_xor
+#define pp_xor Perl_pp_xor
-#endif /* EMBED */
+#endif /* PERL_OBJECT */
+
+/* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
+ disable them.
+ */
+
+#if !defined(PERL_CORE)
+# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
+# define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,PTR2IV(ptr))
+#endif
+
+#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) && !defined(PERL_BINCOMPAT_5005)
+
+/* Compatibility for various misnamed functions. All functions
+ in the API that begin with "perl_" (not "Perl_") take an explicit
+ interpreter context pointer.
+ The following are not like that, but since they had a "perl_"
+ prefix in previous versions, we provide compatibility macros.
+ */
+# define perl_atexit(a,b) call_atexit(a,b)
+# define perl_call_argv(a,b,c) call_argv(a,b,c)
+# define perl_call_pv(a,b) call_pv(a,b)
+# define perl_call_method(a,b) call_method(a,b)
+# define perl_call_sv(a,b) call_sv(a,b)
+# define perl_eval_sv(a,b) eval_sv(a,b)
+# define perl_eval_pv(a,b) eval_pv(a,b)
+# define perl_require_pv(a) require_pv(a)
+# define perl_get_sv(a,b) get_sv(a,b)
+# define perl_get_av(a,b) get_av(a,b)
+# define perl_get_hv(a,b) get_hv(a,b)
+# define perl_get_cv(a,b) get_cv(a,b)
+# define perl_init_i18nl10n(a) init_i18nl10n(a)
+# define perl_init_i18nl14n(a) init_i18nl14n(a)
+# define perl_new_ctype(a) new_ctype(a)
+# define perl_new_collate(a) new_collate(a)
+# define perl_new_numeric(a) new_numeric(a)
+
+/* varargs functions can't be handled with CPP macros. :-(
+ This provides a set of compatibility functions that don't take
+ an extra argument but grab the context pointer using the macro
+ dTHX.
+ */
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_OBJECT)
+# define croak Perl_croak_nocontext
+# define deb Perl_deb_nocontext
+# define die Perl_die_nocontext
+# define form Perl_form_nocontext
+# define load_module Perl_load_module_nocontext
+# define mess Perl_mess_nocontext
+# define newSVpvf Perl_newSVpvf_nocontext
+# define sv_catpvf Perl_sv_catpvf_nocontext
+# define sv_setpvf Perl_sv_setpvf_nocontext
+# define warn Perl_warn_nocontext
+# define warner Perl_warner_nocontext
+# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
+# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
+#endif
+
+#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
+
+#if !defined(PERL_IMPLICIT_CONTEXT)
+/* undefined symbols, point them back at the usual ones */
+# define Perl_croak_nocontext Perl_croak
+# define Perl_die_nocontext Perl_die
+# define Perl_deb_nocontext Perl_deb
+# define Perl_form_nocontext Perl_form
+# define Perl_load_module_nocontext Perl_load_module
+# define Perl_mess_nocontext Perl_mess
+# define Perl_newSVpvf_nocontext Perl_newSVpvf
+# define Perl_sv_catpvf_nocontext Perl_sv_catpvf
+# define Perl_sv_setpvf_nocontext Perl_sv_setpvf
+# define Perl_warn_nocontext Perl_warn
+# define Perl_warner_nocontext Perl_warner
+# define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
+# define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
+#endif
diff --git a/contrib/perl5/embed.pl b/contrib/perl5/embed.pl
index 497b97d..593ab19 100755
--- a/contrib/perl5/embed.pl
+++ b/contrib/perl5/embed.pl
@@ -1,6 +1,184 @@
#!/usr/bin/perl -w
-require 5.003;
+require 5.003; # keep this compatible, an old perl is all we may have before
+ # we build the new one
+
+#
+# See database of global and static function prototypes at the __END__.
+# This is used to generate prototype headers under various configurations,
+# export symbols lists for different platforms, and macros to provide an
+# implicit interpreter context argument.
+#
+
+my $END = tell DATA;
+
+# walk table providing an array of components in each line to
+# subroutine, printing the result
+sub walk_table (&@) {
+ my $function = shift;
+ my $filename = shift || '-';
+ my $leader = shift;
+ my $trailer = shift;
+ my $F;
+ local *F;
+ if (ref $filename) { # filehandle
+ $F = $filename;
+ }
+ else {
+ open F, ">$filename" or die "Can't open $filename: $!";
+ $F = \*F;
+ }
+ print $F $leader if $leader;
+ seek DATA, $END, 0; # so we may restart
+ while (<DATA>) {
+ chomp;
+ next if /^:/;
+ while (s|\\$||) {
+ $_ .= <DATA>;
+ chomp;
+ }
+ my @args;
+ if (/^\s*(#|$)/) {
+ @args = $_;
+ }
+ else {
+ @args = split /\s*\|\s*/, $_;
+ }
+ print $F $function->(@args);
+ }
+ print $F $trailer if $trailer;
+ close $F unless ref $filename;
+}
+
+sub munge_c_files () {
+ my $functions = {};
+ unless (@ARGV) {
+ warn "\@ARGV empty, nothing to do\n";
+ return;
+ }
+ walk_table {
+ if (@_ > 1) {
+ $functions->{$_[2]} = \@_ if $_[@_-1] =~ /\.\.\./;
+ }
+ } '/dev/null';
+ local $^I = '.bak';
+ while (<>) {
+# if (/^#\s*include\s+"perl.h"/) {
+# my $file = uc $ARGV;
+# $file =~ s/\./_/g;
+# print "#define PERL_IN_$file\n";
+# }
+# s{^(\w+)\s*\(}
+# {
+# my $f = $1;
+# my $repl = "$f(";
+# if (exists $functions->{$f}) {
+# my $flags = $functions->{$f}[0];
+# $repl = "Perl_$repl" if $flags =~ /p/;
+# unless ($flags =~ /n/) {
+# $repl .= "pTHX";
+# $repl .= "_ " if @{$functions->{$f}} > 3;
+# }
+# warn("$ARGV:$.:$repl\n");
+# }
+# $repl;
+# }e;
+ s{(\b(\w+)[ \t]*\([ \t]*(?!aTHX))}
+ {
+ my $repl = $1;
+ my $f = $2;
+ if (exists $functions->{$f}) {
+ $repl .= "aTHX_ ";
+ warn("$ARGV:$.:$`#$repl#$'");
+ }
+ $repl;
+ }eg;
+ print;
+ close ARGV if eof; # restart $.
+ }
+ exit;
+}
+
+#munge_c_files();
+
+# generate proto.h
+my $wrote_protected = 0;
+
+sub write_protos {
+ my $ret = "";
+ if (@_ == 1) {
+ my $arg = shift;
+ $ret .= "$arg\n";
+ }
+ else {
+ my ($flags,$retval,$func,@args) = @_;
+ if ($flags =~ /s/) {
+ $retval = "STATIC $retval";
+ $func = "S_$func";
+ }
+ else {
+ $retval = "PERL_CALLCONV $retval";
+ if ($flags =~ /p/) {
+ $func = "Perl_$func";
+ }
+ }
+ $ret .= "$retval\t$func(";
+ unless ($flags =~ /n/) {
+ $ret .= "pTHX";
+ $ret .= "_ " if @args;
+ }
+ if (@args) {
+ $ret .= join ", ", @args;
+ }
+ else {
+ $ret .= "void" if $flags =~ /n/;
+ }
+ $ret .= ")";
+ $ret .= " __attribute__((noreturn))" if $flags =~ /r/;
+ if( $flags =~ /f/ ) {
+ my $prefix = $flags =~ /n/ ? '' : 'pTHX_';
+ my $args = scalar @args;
+ $ret .= "\n#ifdef CHECK_FORMAT\n";
+ $ret .= sprintf " __attribute__((format(printf,%s%d,%s%d)))",
+ $prefix, $args - 1, $prefix, $args;
+ $ret .= "\n#endif\n";
+ }
+ $ret .= ";\n";
+ }
+ $ret;
+}
+
+# generates global.sym (API export list), and populates %global with global symbols
+sub write_global_sym {
+ my $ret = "";
+ if (@_ > 1) {
+ my ($flags,$retval,$func,@args) = @_;
+ if ($flags =~ /A/ && $flags !~ /x/) { # public API, so export
+ $func = "Perl_$func" if $flags =~ /p/;
+ $ret = "$func\n";
+ }
+ }
+ $ret;
+}
+
+
+walk_table(\&write_protos, 'proto.h', <<'EOT');
+/*
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is autogenerated from data in embed.pl. Edit that file
+ * and run 'make regen_headers' to effect changes.
+ */
+
+EOT
+
+walk_table(\&write_global_sym, 'global.sym', <<'EOT');
+#
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is autogenerated from data in embed.pl. Edit that file
+# and run 'make regen_headers' to effect changes.
+#
+
+EOT
# XXX others that may need adding
# warnhook
@@ -9,6 +187,7 @@ require 5.003;
my @extvars = qw(sv_undef sv_yes sv_no na dowarn
curcop compiling
tainting tainted stack_base stack_sp sv_arenaroot
+ no_modify
curstash DBsub DBsingle debstash
rsfp
stdingv
@@ -23,31 +202,37 @@ my @extvars = qw(sv_undef sv_yes sv_no na dowarn
sub readsyms (\%$) {
my ($syms, $file) = @_;
- %$syms = ();
local (*FILE, $_);
open(FILE, "< $file")
or die "embed.pl: Can't open $file: $!\n";
while (<FILE>) {
s/[ \t]*#.*//; # Delete comments.
if (/^\s*(\S+)\s*$/) {
- $$syms{$1} = 1;
+ my $sym = $1;
+ warn "duplicate symbol $sym while processing $file\n"
+ if exists $$syms{$sym};
+ $$syms{$sym} = 1;
}
}
close(FILE);
}
-readsyms %global, 'global.sym';
+# Perl_pp_* and Perl_ck_* are in pp.sym
+readsyms my %ppsym, 'pp.sym';
-sub readvars(\%$$) {
- my ($syms, $file,$pre) = @_;
- %$syms = ();
+sub readvars(\%$$@) {
+ my ($syms, $file,$pre,$keep_pre) = @_;
local (*FILE, $_);
open(FILE, "< $file")
or die "embed.pl: Can't open $file: $!\n";
while (<FILE>) {
s/[ \t]*#.*//; # Delete comments.
- if (/PERLVARI?C?\($pre(\w+)/) {
- $$syms{$1} = 1;
+ if (/PERLVARA?I?C?\($pre(\w+)/) {
+ my $sym = $1;
+ $sym = $pre . $sym if $keep_pre;
+ warn "duplicate symbol $sym while processing $file\n"
+ if exists $$syms{$sym};
+ $$syms{$sym} = $pre || 1;
}
}
close(FILE);
@@ -60,93 +245,293 @@ readvars %intrp, 'intrpvar.h','I';
readvars %thread, 'thrdvar.h','T';
readvars %globvar, 'perlvars.h','G';
-foreach my $sym (sort keys %intrp)
- {
- if (exists $global{$sym})
- {
- delete $global{$sym};
- warn "$sym in global.sym as well as intrpvar.h\n";
- }
- }
-
-foreach my $sym (sort keys %globvar)
- {
- if (exists $global{$sym})
- {
- delete $global{$sym};
- warn "$sym in global.sym as well as perlvars.h\n";
- }
- }
-
-foreach my $sym (sort keys %thread)
- {
+foreach my $sym (sort keys %thread) {
warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
- if (exists $global{$sym})
- {
- delete $global{$sym};
- warn "$sym in global.sym as well as thrdvar.h\n";
- }
- }
+}
+
+sub undefine ($) {
+ my ($sym) = @_;
+ "#undef $sym\n";
+}
sub hide ($$) {
my ($from, $to) = @_;
my $t = int(length($from) / 8);
"#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
}
-sub embed ($) {
- my ($sym) = @_;
- hide($sym, "Perl_$sym");
-}
-sub embedvar ($) {
- my ($sym) = @_;
-# hide($sym, "Perl_$sym");
- return '';
+
+sub bincompat_var ($$) {
+ my ($pfx, $sym) = @_;
+ my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHXo');
+ undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
}
sub multon ($$$) {
my ($sym,$pre,$ptr) = @_;
hide("PL_$sym", "($ptr$pre$sym)");
}
+
sub multoff ($$) {
my ($sym,$pre) = @_;
return hide("PL_$pre$sym", "PL_$sym");
}
unlink 'embed.h';
-open(EM, '> embed.h')
- or die "Can't create embed.h: $!\n";
+open(EM, '> embed.h') or die "Can't create embed.h: $!\n";
print EM <<'END';
/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- This file is built by embed.pl from global.sym, intrpvar.h,
- and thrdvar.h. Any changes made here will be lost!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
*/
/* (Doing namespace management portably in C is really gross.) */
-/* EMBED has no run-time penalty, but helps keep the Perl namespace
- from colliding with that used by other libraries pulled in
- by extensions or by embedding perl. Allow a cc -DNO_EMBED
- override, however, to keep binary compatability with previous
- versions of perl.
-*/
-#ifndef NO_EMBED
-# define EMBED 1
+/* NO_EMBED is no longer supported. i.e. EMBED is always active. */
+
+/* provide binary compatible (but inconsistent) names */
+#if defined(PERL_BINCOMPAT_5005)
+# define Perl_call_atexit perl_atexit
+# define Perl_eval_sv perl_eval_sv
+# define Perl_eval_pv perl_eval_pv
+# define Perl_call_argv perl_call_argv
+# define Perl_call_method perl_call_method
+# define Perl_call_pv perl_call_pv
+# define Perl_call_sv perl_call_sv
+# define Perl_get_av perl_get_av
+# define Perl_get_cv perl_get_cv
+# define Perl_get_hv perl_get_hv
+# define Perl_get_sv perl_get_sv
+# define Perl_init_i18nl10n perl_init_i18nl10n
+# define Perl_init_i18nl14n perl_init_i18nl14n
+# define Perl_new_collate perl_new_collate
+# define Perl_new_ctype perl_new_ctype
+# define Perl_new_numeric perl_new_numeric
+# define Perl_require_pv perl_require_pv
+# define Perl_safesyscalloc Perl_safecalloc
+# define Perl_safesysfree Perl_safefree
+# define Perl_safesysmalloc Perl_safemalloc
+# define Perl_safesysrealloc Perl_saferealloc
+# define Perl_set_numeric_local perl_set_numeric_local
+# define Perl_set_numeric_standard perl_set_numeric_standard
+/* malloc() pollution was the default in earlier versions, so enable
+ * it for bincompat; but not for systems that used to do prevent that,
+ * or when they ask for {HIDE,EMBED}MYMALLOC */
+# if !defined(EMBEDMYMALLOC) && !defined(HIDEMYMALLOC)
+# if !defined(NeXT) && !defined(__NeXT) && !defined(__MACHTEN__) && \
+ !defined(__QNX__)
+# define PERL_POLLUTE_MALLOC
+# endif
+# endif
#endif
-/* Hide global symbols? */
+/* Hide global symbols */
-#ifdef EMBED
+#if !defined(PERL_OBJECT)
+#if !defined(PERL_IMPLICIT_CONTEXT)
END
-for $sym (sort keys %global) {
- print EM embed($sym);
+walk_table {
+ my $ret = "";
+ if (@_ == 1) {
+ my $arg = shift;
+ $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
+ }
+ else {
+ my ($flags,$retval,$func,@args) = @_;
+ unless ($flags =~ /o/) {
+ if ($flags =~ /s/) {
+ $ret .= hide($func,"S_$func");
+ }
+ elsif ($flags =~ /p/) {
+ $ret .= hide($func,"Perl_$func");
+ }
+ }
+ }
+ $ret;
+} \*EM;
+
+for $sym (sort keys %ppsym) {
+ $sym =~ s/^Perl_//;
+ print EM hide($sym, "Perl_$sym");
}
print EM <<'END';
-#endif /* EMBED */
+#else /* PERL_IMPLICIT_CONTEXT */
+
+END
+
+my @az = ('a'..'z');
+
+walk_table {
+ my $ret = "";
+ if (@_ == 1) {
+ my $arg = shift;
+ $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
+ }
+ else {
+ my ($flags,$retval,$func,@args) = @_;
+ unless ($flags =~ /o/) {
+ my $args = scalar @args;
+ if ($args and $args[$args-1] =~ /\.\.\./) {
+ # we're out of luck for varargs functions under CPP
+ }
+ elsif ($flags =~ /n/) {
+ if ($flags =~ /s/) {
+ $ret .= hide($func,"S_$func");
+ }
+ elsif ($flags =~ /p/) {
+ $ret .= hide($func,"Perl_$func");
+ }
+ }
+ else {
+ my $alist = join(",", @az[0..$args-1]);
+ $ret = "#define $func($alist)";
+ my $t = int(length($ret) / 8);
+ $ret .= "\t" x ($t < 4 ? 4 - $t : 1);
+ if ($flags =~ /s/) {
+ $ret .= "S_$func(aTHX";
+ }
+ elsif ($flags =~ /p/) {
+ $ret .= "Perl_$func(aTHX";
+ }
+ $ret .= "_ " if $alist;
+ $ret .= $alist . ")\n";
+ }
+ }
+ }
+ $ret;
+} \*EM;
+
+for $sym (sort keys %ppsym) {
+ $sym =~ s/^Perl_//;
+ if ($sym =~ /^ck_/) {
+ print EM hide("$sym(a)", "Perl_$sym(aTHX_ a)");
+ }
+ elsif ($sym =~ /^pp_/) {
+ print EM hide("$sym()", "Perl_$sym(aTHX)");
+ }
+ else {
+ warn "Illegal symbol '$sym' in pp.sym";
+ }
+}
+
+print EM <<'END';
+
+#endif /* PERL_IMPLICIT_CONTEXT */
+#else /* PERL_OBJECT */
+
+END
+
+walk_table {
+ my $ret = "";
+ if (@_ == 1) {
+ my $arg = shift;
+ $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
+ }
+ else {
+ my ($flags,$retval,$func,@args) = @_;
+ if ($flags =~ /s/) {
+ $ret .= hide("S_$func","CPerlObj::S_$func") if $flags !~ /j/;
+ $ret .= hide($func,"S_$func");
+ }
+ elsif ($flags =~ /p/) {
+ $ret .= hide("Perl_$func","CPerlObj::Perl_$func") if $flags !~ /j/;
+ $ret .= hide($func,"Perl_$func");
+ }
+ else {
+ $ret .= hide($func,"CPerlObj::$func") if $flags !~ /j/;
+ }
+ }
+ $ret;
+} \*EM;
+
+for $sym (sort keys %ppsym) {
+ $sym =~ s/^Perl_//;
+ print EM hide("Perl_$sym", "CPerlObj::Perl_$sym");
+ print EM hide($sym, "Perl_$sym");
+}
+
+print EM <<'END';
+
+#endif /* PERL_OBJECT */
+
+/* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
+ disable them.
+ */
+
+#if !defined(PERL_CORE)
+# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
+# define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,PTR2IV(ptr))
+#endif
+
+#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) && !defined(PERL_BINCOMPAT_5005)
+
+/* Compatibility for various misnamed functions. All functions
+ in the API that begin with "perl_" (not "Perl_") take an explicit
+ interpreter context pointer.
+ The following are not like that, but since they had a "perl_"
+ prefix in previous versions, we provide compatibility macros.
+ */
+# define perl_atexit(a,b) call_atexit(a,b)
+# define perl_call_argv(a,b,c) call_argv(a,b,c)
+# define perl_call_pv(a,b) call_pv(a,b)
+# define perl_call_method(a,b) call_method(a,b)
+# define perl_call_sv(a,b) call_sv(a,b)
+# define perl_eval_sv(a,b) eval_sv(a,b)
+# define perl_eval_pv(a,b) eval_pv(a,b)
+# define perl_require_pv(a) require_pv(a)
+# define perl_get_sv(a,b) get_sv(a,b)
+# define perl_get_av(a,b) get_av(a,b)
+# define perl_get_hv(a,b) get_hv(a,b)
+# define perl_get_cv(a,b) get_cv(a,b)
+# define perl_init_i18nl10n(a) init_i18nl10n(a)
+# define perl_init_i18nl14n(a) init_i18nl14n(a)
+# define perl_new_ctype(a) new_ctype(a)
+# define perl_new_collate(a) new_collate(a)
+# define perl_new_numeric(a) new_numeric(a)
+
+/* varargs functions can't be handled with CPP macros. :-(
+ This provides a set of compatibility functions that don't take
+ an extra argument but grab the context pointer using the macro
+ dTHX.
+ */
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_OBJECT)
+# define croak Perl_croak_nocontext
+# define deb Perl_deb_nocontext
+# define die Perl_die_nocontext
+# define form Perl_form_nocontext
+# define load_module Perl_load_module_nocontext
+# define mess Perl_mess_nocontext
+# define newSVpvf Perl_newSVpvf_nocontext
+# define sv_catpvf Perl_sv_catpvf_nocontext
+# define sv_setpvf Perl_sv_setpvf_nocontext
+# define warn Perl_warn_nocontext
+# define warner Perl_warner_nocontext
+# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
+# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
+#endif
+
+#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
+
+#if !defined(PERL_IMPLICIT_CONTEXT)
+/* undefined symbols, point them back at the usual ones */
+# define Perl_croak_nocontext Perl_croak
+# define Perl_die_nocontext Perl_die
+# define Perl_deb_nocontext Perl_deb
+# define Perl_form_nocontext Perl_form
+# define Perl_load_module_nocontext Perl_load_module
+# define Perl_mess_nocontext Perl_mess
+# define Perl_newSVpvf_nocontext Perl_newSVpvf
+# define Perl_sv_catpvf_nocontext Perl_sv_catpvf
+# define Perl_sv_setpvf_nocontext Perl_sv_setpvf
+# define Perl_warn_nocontext Perl_warn
+# define Perl_warner_nocontext Perl_warner
+# define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
+# define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
+#endif
END
@@ -158,110 +543,130 @@ open(EM, '> embedvar.h')
print EM <<'END';
/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- This file is built by embed.pl from global.sym, intrpvar.h,
- and thrdvar.h. Any changes made here will be lost!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
*/
/* (Doing namespace management portably in C is really gross.) */
-/* EMBED has no run-time penalty, but helps keep the Perl namespace
- from colliding with that used by other libraries pulled in
- by extensions or by embedding perl. Allow a cc -DNO_EMBED
- override, however, to keep binary compatability with previous
- versions of perl.
-*/
+/*
+ The following combinations of MULTIPLICITY, USE_THREADS, PERL_OBJECT
+ and PERL_IMPLICIT_CONTEXT are supported:
+ 1) none
+ 2) MULTIPLICITY # supported for compatibility
+ 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
+ 4) USE_THREADS && PERL_IMPLICIT_CONTEXT
+ 5) MULTIPLICITY && USE_THREADS && PERL_IMPLICIT_CONTEXT
+ 6) PERL_OBJECT && PERL_IMPLICIT_CONTEXT
+ All other combinations of these flags are errors.
-/* Put interpreter-specific symbols into a struct? */
+ #3, #4, #5, and #6 are supported directly, while #2 is a special
+ case of #3 (supported by redefining vTHX appropriately).
+*/
-#ifdef MULTIPLICITY
+#if defined(MULTIPLICITY)
+/* cases 2, 3 and 5 above */
-#ifndef USE_THREADS
-/* If we do not have threads then per-thread vars are per-interpreter */
+# if defined(PERL_IMPLICIT_CONTEXT)
+# define vTHX aTHX
+# else
+# define vTHX PERL_GET_INTERP
+# endif
END
for $sym (sort keys %thread) {
- print EM multon($sym,'T','PL_curinterp->');
+ print EM multon($sym,'T','vTHX->');
}
print EM <<'END';
-#endif /* !USE_THREADS */
+# if defined(PERL_OBJECT)
+# include "error: PERL_OBJECT + MULTIPLICITY don't go together"
+# endif
-/* These are always per-interpreter if there is more than one */
+# if defined(USE_THREADS)
+/* case 5 above */
END
for $sym (sort keys %intrp) {
- print EM multon($sym,'I','PL_curinterp->');
+ print EM multon($sym,'I','PERL_GET_INTERP->');
}
print EM <<'END';
-#else /* !MULTIPLICITY */
+# else /* !USE_THREADS */
+/* cases 2 and 3 above */
END
for $sym (sort keys %intrp) {
- print EM multoff($sym,'I');
+ print EM multon($sym,'I','vTHX->');
}
print EM <<'END';
-#ifndef USE_THREADS
+# endif /* USE_THREADS */
+
+#else /* !MULTIPLICITY */
+
+# if defined(PERL_OBJECT)
+/* case 6 above */
END
for $sym (sort keys %thread) {
- print EM multoff($sym,'T');
+ print EM multon($sym,'T','aTHXo->interp.');
}
-print EM <<'END';
-#endif /* USE_THREADS */
+for $sym (sort keys %intrp) {
+ print EM multon($sym,'I','aTHXo->interp.');
+}
+
+print EM <<'END';
-/* Hide what would have been interpreter-specific symbols? */
+# else /* !PERL_OBJECT */
-#ifdef EMBED
+/* cases 1 and 4 above */
END
for $sym (sort keys %intrp) {
- print EM embedvar($sym);
+ print EM multoff($sym,'I');
}
print EM <<'END';
-#ifndef USE_THREADS
+# if defined(USE_THREADS)
+/* case 4 above */
END
for $sym (sort keys %thread) {
- print EM embedvar($sym);
+ print EM multon($sym,'T','aTHX->');
}
print EM <<'END';
-#endif /* USE_THREADS */
-#endif /* EMBED */
-#endif /* MULTIPLICITY */
-
-/* Now same trickey for per-thread variables */
-
-#ifdef USE_THREADS
+# else /* !USE_THREADS */
+/* case 1 above */
END
for $sym (sort keys %thread) {
- print EM multon($sym,'T','thr->');
+ print EM multoff($sym,'T');
}
print EM <<'END';
-#endif /* USE_THREADS */
+# endif /* USE_THREADS */
+# endif /* PERL_OBJECT */
+#endif /* MULTIPLICITY */
-#ifdef PERL_GLOBAL_STRUCT
+#if defined(PERL_GLOBAL_STRUCT)
END
@@ -281,35 +686,1809 @@ for $sym (sort keys %globvar) {
print EM <<'END';
-#ifdef EMBED
+#endif /* PERL_GLOBAL_STRUCT */
+
+#ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
END
-for $sym (sort keys %globvar) {
- print EM embedvar($sym);
+for $sym (sort @extvars) {
+ print EM hide($sym,"PL_$sym");
}
print EM <<'END';
-#endif /* EMBED */
-#endif /* PERL_GLOBAL_STRUCT */
-
+#endif /* PERL_POLLUTE */
END
-print EM <<'END';
+close(EM);
+
+unlink 'objXSUB.h';
+open(OBX, '> objXSUB.h')
+ or die "Can't create objXSUB.h: $!\n";
+
+print OBX <<'EOT';
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
+*/
+
+#ifndef __objXSUB_h__
+#define __objXSUB_h__
+
+/* method calls via pPerl (static functions without a "this" pointer need these) */
+
+#if defined(PERL_CORE) && defined(PERL_OBJECT)
+
+/* XXX soon to be eliminated, only a few things in PERLCORE need these now */
+
+EOT
+
+walk_table {
+ my $ret = "";
+ if (@_ == 1) {
+ my $arg = shift;
+ $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
+ }
+ else {
+ my ($flags,$retval,$func,@args) = @_;
+ if ($flags =~ /A/ && $flags !~ /j/) { # API function needing macros
+ if ($flags =~ /p/) {
+ $ret .= undefine("Perl_$func") . hide("Perl_$func","pPerl->Perl_$func");
+ $ret .= undefine($func) . hide($func,"Perl_$func");
+ }
+ else {
+ $ret .= undefine($func) . hide($func,"pPerl->$func");
+ }
+ }
+ }
+ $ret;
+} \*OBX;
+
+# NOTE: not part of API
+#for $sym (sort keys %ppsym) {
+# $sym =~ s/^Perl_//;
+# print OBX undefine("Perl_$sym") . hide("Perl_$sym", "pPerl->Perl_$sym");
+# print OBX undefine($sym) . hide($sym, "Perl_$sym");
+#}
+
+print OBX <<'EOT';
+
+#endif /* PERL_CORE && PERL_OBJECT */
+#endif /* __objXSUB_h__ */
+EOT
+
+close(OBX);
+
+unlink 'perlapi.h';
+unlink 'perlapi.c';
+open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
+open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
+
+print CAPIH <<'EOT';
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
+*/
+
+/* declare accessor functions for Perl variables */
+#ifndef __perlapi_h__
+#define __perlapi_h__
+
+#if defined(PERL_OBJECT) || defined (MULTIPLICITY)
+
+#if defined(PERL_OBJECT)
+# undef aTHXo
+# define aTHXo pPerl
+# undef aTHXo_
+# define aTHXo_ aTHXo,
+#endif /* PERL_OBJECT */
+
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHXo);
+#define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
+ EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHXo);
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+END_EXTERN_C
+
+#if defined(PERL_CORE)
+
+/* accessor functions for Perl variables (provide binary compatibility) */
+
+/* these need to be mentioned here, or most linkers won't put them in
+ the perl executable */
+
+#ifndef PERL_NO_FORCE_LINK
+
+START_EXTERN_C
+
+#ifndef DOINIT
+EXT void *PL_force_link_funcs[];
+#else
+EXT void *PL_force_link_funcs[] = {
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t) (void*)Perl_##v##_ptr,
+#define PERLVARA(v,n,t) PERLVAR(v,t)
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v,t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+};
+#endif /* DOINIT */
+
+START_EXTERN_C
+
+#endif /* PERL_NO_FORCE_LINK */
+
+#else /* !PERL_CORE */
+
+EOT
+
+foreach my $sym (sort keys %intrp) {
+ print CAPIH bincompat_var('I',$sym);
+}
+
+foreach my $sym (sort keys %thread) {
+ print CAPIH bincompat_var('T',$sym);
+}
+
+foreach my $sym (sort keys %globvar) {
+ print CAPIH bincompat_var('G',$sym);
+}
-#ifndef MIN_PERL_DEFINE
+print CAPIH <<'EOT';
+
+#endif /* !PERL_CORE */
+#endif /* PERL_OBJECT || MULTIPLICITY */
+
+#endif /* __perlapi_h__ */
+
+EOT
+close CAPIH;
+
+print CAPI <<'EOT';
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "perlapi.h"
+
+#if defined(PERL_OBJECT) || defined (MULTIPLICITY)
+
+/* accessor functions for Perl variables (provides binary compatibility) */
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+#if defined(PERL_OBJECT)
+#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHXo) \
+ { return &(aTHXo->interp.v); }
+#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHXo) \
+ { return &(aTHXo->interp.v); }
+#else /* MULTIPLICITY */
+#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
+ { return &(aTHX->v); }
+#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
+ { return &(aTHX->v); }
+#endif
+
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHXo) \
+ { return &(PL_##v); }
+#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHXo) \
+ { return &(PL_##v); }
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+#if defined(PERL_OBJECT)
+
+/* C-API layer for PERL_OBJECT */
+
+EOT
+
+# functions that take va_list* for implementing vararg functions
+# NOTE: makedef.pl must be updated if you add symbols to %vfuncs
+my %vfuncs = qw(
+ Perl_croak Perl_vcroak
+ Perl_warn Perl_vwarn
+ Perl_warner Perl_vwarner
+ Perl_die Perl_vdie
+ Perl_form Perl_vform
+ Perl_load_module Perl_vload_module
+ Perl_mess Perl_vmess
+ Perl_deb Perl_vdeb
+ Perl_newSVpvf Perl_vnewSVpvf
+ Perl_sv_setpvf Perl_sv_vsetpvf
+ Perl_sv_setpvf_mg Perl_sv_vsetpvf_mg
+ Perl_sv_catpvf Perl_sv_vcatpvf
+ Perl_sv_catpvf_mg Perl_sv_vcatpvf_mg
+ Perl_dump_indent Perl_dump_vindent
+ Perl_default_protect Perl_vdefault_protect
+);
+
+sub emit_func {
+ my ($addcontext, $rettype,$func,@args) = @_;
+ my @aargs = @args;
+ my $a;
+ for $a (@aargs) { $a =~ s/^.*\b(\w+)$/$1/ }
+ my $ctxarg = '';
+ if (not $addcontext) {
+ $ctxarg = 'pTHXo';
+ $ctxarg .= '_ ' if @args;
+ }
+ my $decl = '';
+ if ($addcontext) {
+ $decl .= " dTHXo;\n";
+ }
+ local $" = ', ';
+ my $return = ($rettype =~ /^\s*(void|Free_t|Signal_t)\s*$/
+ ? '' : 'return ');
+ my $emitval = '';
+ if (@args and $args[$#args] =~ /\.\.\./) {
+ pop @aargs;
+ my $retarg = '';
+ my $ctxfunc = $func;
+ $ctxfunc =~ s/_nocontext$//;
+ return $emitval unless exists $vfuncs{$ctxfunc};
+ if (length $return) {
+ $decl .= " $rettype retval;\n";
+ $retarg .= "retval = ";
+ $return = "\n ${return}retval;\n";
+ }
+ $emitval .= <<EOT
+$rettype
+$func($ctxarg@args)
+{
+$decl va_list args;
+ va_start(args, $aargs[$#aargs]);
+ $retarg((CPerlObj*)pPerl)->$vfuncs{$ctxfunc}(@aargs, &args);
+ va_end(args);$return
+}
+EOT
+ }
+ else {
+ $emitval .= <<EOT
+$rettype
+$func($ctxarg@args)
+{
+$decl $return((CPerlObj*)pPerl)->$func(@aargs);
+}
+EOT
+ }
+ $emitval;
+}
+
+# XXXX temporary hack
+my $sym;
+for $sym (qw(
+ perl_construct
+ perl_destruct
+ perl_free
+ perl_run
+ perl_parse
+ ))
+{
+ $skipapi_funcs{$sym}++;
+}
+
+walk_table {
+ my $ret = "";
+ if (@_ == 1) {
+ my $arg = shift;
+ $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
+ }
+ else {
+ my ($flags,$retval,$func,@args) = @_;
+ return $ret if exists $skipapi_funcs{$func};
+ if ($flags =~ /A/ && $flags !~ /j/) { # in public API, needed for XSUBS
+ $ret .= "\n";
+ my $addctx = 1 if $flags =~ /n/;
+ if ($flags =~ /p/) {
+ $ret .= undefine("Perl_$func");
+ $ret .= emit_func($addctx,$retval,"Perl_$func",@args);
+ }
+ else {
+ $ret .= undefine($func);
+ $ret .= emit_func($addctx,$retval,$func,@args);
+ }
+ }
+ }
+ $ret;
+} \*CAPI;
+
+# NOTE: not part of the API
+#for $sym (sort keys %ppsym) {
+# $sym =~ s/^Perl_//;
+# print CAPI "\n";
+# print CAPI undefine("Perl_$sym");
+# if ($sym =~ /^ck_/) {
+# print CAPI emit_func(0, 'OP *',"Perl_$sym",'OP *o');
+# }
+# else { # pp_foo
+# print CAPI emit_func(0, 'OP *',"Perl_$sym");
+# }
+#}
+
+print CAPI <<'EOT';
+
+#undef Perl_fprintf_nocontext
+int
+Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
+{
+ dTHXo;
+ va_list(arglist);
+ va_start(arglist, format);
+ return (*PL_StdIO->pVprintf)(PL_StdIO, stream, format, arglist);
+}
+
+END_EXTERN_C
+
+#endif /* PERL_OBJECT */
+#endif /* PERL_OBJECT || MULTIPLICITY */
+EOT
+
+close(CAPI);
+
+# autogenerate documentation from comments in source files
+
+my %apidocs;
+my %gutsdocs;
+my %docfuncs;
+
+sub autodoc ($) { # parse a file and extract documentation info
+ my($fh) = @_;
+ my($in, $doc);
+
+FUNC:
+ while (defined($in = <$fh>)) {
+ if ($in =~ /^=for\s+apidoc\s+(.*)\n/) {
+ my $proto = $1;
+ $proto = "||$proto" unless $proto =~ /\|/;
+ my($flags, $ret, $name, @args) = split /\|/, $proto;
+ my $docs = "";
+DOC:
+ while (defined($doc = <$fh>)) {
+ last DOC if $doc =~ /^=\w+/;
+ $docs .= $doc;
+ }
+ $docs = "\n$docs" if $docs and $docs !~ /^\n/;
+ if ($flags =~ /m/) {
+ if ($flags =~ /A/) {
+ $apidocs{$name} = [$flags, $docs, $ret, @args];
+ }
+ else {
+ $gutsdocs{$name} = [$flags, $docs, $ret, @args];
+ }
+ }
+ else {
+ $docfuncs{$name} = [$flags, $docs, $ret, @args];
+ }
+ if ($doc =~ /^=for/) {
+ $in = $doc;
+ redo FUNC;
+ }
+ }
+ }
+}
+
+sub docout ($$$) { # output the docs for one function
+ my($fh, $name, $docref) = @_;
+ my($flags, $docs, $ret, @args) = @$docref;
+
+ $docs .= "NOTE: the perl_ form of this function is deprecated.\n\n"
+ if $flags =~ /p/;
+
+ print $fh "=item $name\n$docs";
+
+ if ($flags =~ /U/) { # no usage
+ # nothing
+ } elsif ($flags =~ /s/) { # semicolon ("dTHR;")
+ print $fh "\t\t$name;\n\n";
+ } elsif ($flags =~ /n/) { # no args
+ print $fh "\t$ret\t$name\n\n";
+ } else { # full usage
+ print $fh "\t$ret\t$name";
+ print $fh "(" . join(", ", @args) . ")";
+ print $fh "\n\n";
+ }
+}
+
+my $file;
+for $file (glob('*.c'), glob('*.h')) {
+ open F, "< $file" or die "Cannot open $file for docs: $!\n";
+ autodoc(\*F);
+ close F or die "Error closing $file: $!\n";
+}
+
+unlink "pod/perlapi.pod";
+open (DOC, ">pod/perlapi.pod") or
+ die "Can't create pod/perlapi.pod: $!\n";
+
+walk_table { # load documented functions into approriate hash
+ if (@_ > 1) {
+ my($flags, $retval, $func, @args) = @_;
+ return "" unless $flags =~ /d/;
+ $func =~ s/\t//g; $flags =~ s/p//; # clean up fields from embed.pl
+ $retval =~ s/\t//;
+ if ($flags =~ /A/) {
+ my $docref = delete $docfuncs{$func};
+ warn "no docs for $func\n" unless $docref and @$docref;
+ $apidocs{$func} = [$docref->[0] . 'A', $docref->[1], $retval, @args];
+ } else {
+ my $docref = delete $docfuncs{$func};
+ $gutsdocs{$func} = [$docref->[0], $docref->[1], $retval, @args];
+ }
+ }
+ return "";
+} \*DOC;
+
+for (sort keys %docfuncs) {
+ warn "Unable to place $_!\n";
+}
+
+print DOC <<'_EOB_';
+=head1 NAME
+
+perlapi - autogenerated documentation for the perl public API
+
+=head1 DESCRIPTION
+
+This file contains the documentation of the perl public API generated by
+embed.pl, specifically a listing of functions, macros, flags, and variables
+that may be used by extension writers. The interfaces of any functions that
+are not listed here are subject to change without notice. For this reason,
+blindly using functions listed in proto.h is to be avoided when writing
+extensions.
+
+Note that all Perl API global variables must be referenced with the C<PL_>
+prefix. Some macros are provided for compatibility with the older,
+unadorned names, but this support may be disabled in a future release.
+
+The listing is alphabetical, case insensitive.
+
+=over 8
+
+_EOB_
+
+my $key;
+for $key (sort { uc($a) cmp uc($b); } keys %apidocs) { # case insensitive sort
+ docout(\*DOC, $key, $apidocs{$key});
+}
+
+print DOC <<'_EOE_';
+=back
+
+=head1 AUTHORS
+
+Until May 1997, this document was maintained by Jeff Okamoto
+<okamoto@corp.hp.com>. It is now maintained as part of Perl itself.
+
+With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
+Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
+Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
+Stephen McCamant, and Gurusamy Sarathy.
+
+API Listing originally by Dean Roehrich <roehrich@cray.com>.
+
+Updated to be autogenerated from comments in the source by Benjamin Stuhl.
+
+=head1 SEE ALSO
+
+perlguts(1), perlxs(1), perlxstut(1), perlintern(1)
+
+_EOE_
+
+
+close(DOC);
+
+open(GUTS, ">pod/perlintern.pod") or
+ die "Unable to create pod/perlintern.pod: $!\n";
+print GUTS <<'END';
+=head1 NAME
+
+perlintern - autogenerated documentation of purely B<internal>
+ Perl functions
+
+=head1 DESCRIPTION
+
+This file is the autogenerated documentation of functions in the
+Perl intrepreter that are documented using Perl's internal documentation
+format but are not marked as part of the Perl API. In other words,
+B<they are not for use in extensions>!
+
+=over 8
END
-for $sym (sort @extvars) {
- print EM hide($sym,"PL_$sym");
+for $key (sort { uc($a) cmp uc($b); } keys %gutsdocs) {
+ docout(\*GUTS, $key, $gutsdocs{$key});
}
-print EM <<'END';
+print GUTS <<'END';
+=back
+
+=head1 AUTHORS
+
+The autodocumentation system was orignally added to the Perl core by
+Benjamin Stuhl. Documentation is by whoever was kind enough to
+document their functions.
+
+=head1 SEE ALSO
+
+perlguts(1), perlapi(1)
-#endif /* MIN_PERL_DEFINE */
END
+close GUTS;
+
+
+__END__
+
+: Lines are of the form:
+: flags|return_type|function_name|arg1|arg2|...|argN
+:
+: A line may be continued on another by ending it with a backslash.
+: Leading and trailing whitespace will be ignored in each component.
+:
+: flags are single letters with following meanings:
+: A member of public API
+: d function has documentation with its source
+: s static function, should have an S_ prefix in source
+: file
+: n has no implicit interpreter/thread context argument
+: p function has a Perl_ prefix
+: f function takes printf style format string, varargs
+: r function never returns
+: o has no compatibility macro (#define foo Perl_foo)
+: j not a member of CPerlObj
+: x not exported
+:
+: Individual flags may be separated by whitespace.
+:
+: New global functions should be added at the end for binary compatibility
+: in some configurations.
+
+START_EXTERN_C
+
+#if defined(PERL_IMPLICIT_SYS)
+Ajno |PerlInterpreter* |perl_alloc_using \
+ |struct IPerlMem* m|struct IPerlMem* ms \
+ |struct IPerlMem* mp|struct IPerlEnv* e \
+ |struct IPerlStdIO* io|struct IPerlLIO* lio \
+ |struct IPerlDir* d|struct IPerlSock* s \
+ |struct IPerlProc* p
+#endif
+Ajnod |PerlInterpreter* |perl_alloc
+Ajnod |void |perl_construct |PerlInterpreter* interp
+Ajnod |void |perl_destruct |PerlInterpreter* interp
+Ajnod |void |perl_free |PerlInterpreter* interp
+Ajnod |int |perl_run |PerlInterpreter* interp
+Ajnod |int |perl_parse |PerlInterpreter* interp|XSINIT_t xsinit \
+ |int argc|char** argv|char** env
+#if defined(USE_ITHREADS)
+: XXX: perl_clone needs docs
+Ajno |PerlInterpreter*|perl_clone|PerlInterpreter* interp, UV flags
+# if defined(PERL_IMPLICIT_SYS)
+Ajno |PerlInterpreter*|perl_clone_using|PerlInterpreter *interp|UV flags \
+ |struct IPerlMem* m|struct IPerlMem* ms \
+ |struct IPerlMem* mp|struct IPerlEnv* e \
+ |struct IPerlStdIO* io|struct IPerlLIO* lio \
+ |struct IPerlDir* d|struct IPerlSock* s \
+ |struct IPerlProc* p
+# endif
+#endif
-close(EM);
+#if defined(MYMALLOC)
+Ajnop |Malloc_t|malloc |MEM_SIZE nbytes
+Ajnop |Malloc_t|calloc |MEM_SIZE elements|MEM_SIZE size
+Ajnop |Malloc_t|realloc |Malloc_t where|MEM_SIZE nbytes
+Ajnop |Free_t |mfree |Malloc_t where
+jnp |MEM_SIZE|malloced_size |void *p
+#endif
+
+Ajnp |void* |get_context
+Ajnp |void |set_context |void *thx
+
+END_EXTERN_C
+
+/* functions with flag 'n' should come before here */
+#if defined(PERL_OBJECT)
+class CPerlObj {
+public:
+ struct interpreter interp;
+ CPerlObj(IPerlMem*, IPerlMem*, IPerlMem*, IPerlEnv*, IPerlStdIO*,
+ IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
+ void* operator new(size_t nSize, IPerlMem *pvtbl);
+#ifndef __BORLANDC__
+ static void operator delete(void* pPerl, IPerlMem *pvtbl);
+#endif
+ int do_aspawn (void *vreally, void **vmark, void **vsp);
+#endif
+#if defined(PERL_OBJECT)
+public:
+#else
+START_EXTERN_C
+#endif
+# include "pp_proto.h"
+Ap |SV* |amagic_call |SV* left|SV* right|int method|int dir
+Ap |bool |Gv_AMupdate |HV* stash
+p |OP* |append_elem |I32 optype|OP* head|OP* tail
+p |OP* |append_list |I32 optype|LISTOP* first|LISTOP* last
+p |I32 |apply |I32 type|SV** mark|SV** sp
+Ap |SV* |avhv_delete_ent|AV *ar|SV* keysv|I32 flags|U32 hash
+Ap |bool |avhv_exists_ent|AV *ar|SV* keysv|U32 hash
+Ap |SV** |avhv_fetch_ent |AV *ar|SV* keysv|I32 lval|U32 hash
+Ap |SV** |avhv_store_ent |AV *ar|SV* keysv|SV* val|U32 hash
+Ap |HE* |avhv_iternext |AV *ar
+Ap |SV* |avhv_iterval |AV *ar|HE* entry
+Ap |HV* |avhv_keys |AV *ar
+Apd |void |av_clear |AV* ar
+Ap |SV* |av_delete |AV* ar|I32 key|I32 flags
+Ap |bool |av_exists |AV* ar|I32 key
+Apd |void |av_extend |AV* ar|I32 key
+Ap |AV* |av_fake |I32 size|SV** svp
+Apd |SV** |av_fetch |AV* ar|I32 key|I32 lval
+Ap |void |av_fill |AV* ar|I32 fill
+Apd |I32 |av_len |AV* ar
+Apd |AV* |av_make |I32 size|SV** svp
+Apd |SV* |av_pop |AV* ar
+Apd |void |av_push |AV* ar|SV* val
+Ap |void |av_reify |AV* ar
+Apd |SV* |av_shift |AV* ar
+Apd |SV** |av_store |AV* ar|I32 key|SV* val
+Apd |void |av_undef |AV* ar
+Apd |void |av_unshift |AV* ar|I32 num
+p |OP* |bind_match |I32 type|OP* left|OP* pat
+p |OP* |block_end |I32 floor|OP* seq
+Ap |I32 |block_gimme
+p |int |block_start |int full
+p |void |boot_core_UNIVERSAL
+Ap |void |call_list |I32 oldscope|AV* av_list
+p |bool |cando |Mode_t mode|Uid_t effective|Stat_t* statbufp
+Ap |U32 |cast_ulong |NV f
+Ap |I32 |cast_i32 |NV f
+Ap |IV |cast_iv |NV f
+Ap |UV |cast_uv |NV f
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+Ap |I32 |my_chsize |int fd|Off_t length
+#endif
+#if defined(USE_THREADS)
+Ap |MAGIC* |condpair_magic |SV *sv
+#endif
+p |OP* |convert |I32 optype|I32 flags|OP* o
+Afprd |void |croak |const char* pat|...
+Apr |void |vcroak |const char* pat|va_list* args
+#if defined(PERL_IMPLICIT_CONTEXT)
+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|...
+Afnp |SV* |mess_nocontext |const char* pat|...
+Afnp |void |warn_nocontext |const char* pat|...
+Afnp |void |warner_nocontext|U32 err|const char* pat|...
+Afnp |SV* |newSVpvf_nocontext|const char* pat|...
+Afnp |void |sv_catpvf_nocontext|SV* sv|const char* pat|...
+Afnp |void |sv_setpvf_nocontext|SV* sv|const char* pat|...
+Afnp |void |sv_catpvf_mg_nocontext|SV* sv|const char* pat|...
+Afnp |void |sv_setpvf_mg_nocontext|SV* sv|const char* pat|...
+Afnp |int |fprintf_nocontext|PerlIO* stream|const char* fmt|...
+#endif
+p |void |cv_ckproto |CV* cv|GV* gv|char* p
+p |CV* |cv_clone |CV* proto
+Ap |SV* |cv_const_sv |CV* cv
+p |SV* |op_const_sv |OP* o|CV* cv
+Ap |void |cv_undef |CV* cv
+Ap |void |cx_dump |PERL_CONTEXT* cs
+Ap |SV* |filter_add |filter_t funcp|SV* datasv
+Ap |void |filter_del |filter_t funcp
+Ap |I32 |filter_read |int idx|SV* buffer|int maxlen
+Ap |char** |get_op_descs
+Ap |char** |get_op_names
+p |char* |get_no_modify
+p |U32* |get_opargs
+Ap |PPADDR_t*|get_ppaddr
+p |I32 |cxinc
+Afp |void |deb |const char* pat|...
+Ap |void |vdeb |const char* pat|va_list* args
+Ap |void |debprofdump
+Ap |I32 |debop |OP* o
+Ap |I32 |debstack
+Ap |I32 |debstackptrs
+Ap |char* |delimcpy |char* to|char* toend|char* from \
+ |char* fromend|int delim|I32* retlen
+p |void |deprecate |char* s
+Afp |OP* |die |const char* pat|...
+p |OP* |vdie |const char* pat|va_list* args
+p |OP* |die_where |char* message|STRLEN msglen
+Ap |void |dounwind |I32 cxix
+p |bool |do_aexec |SV* really|SV** mark|SV** sp
+p |bool |do_aexec5 |SV* really|SV** mark|SV** sp|int fd|int flag
+Ap |int |do_binmode |PerlIO *fp|int iotype|int flag
+p |void |do_chop |SV* asv|SV* sv
+Ap |bool |do_close |GV* gv|bool not_implicit
+p |bool |do_eof |GV* gv
+p |bool |do_exec |char* cmd
+#if !defined(WIN32)
+p |bool |do_exec3 |char* cmd|int fd|int flag
+#endif
+p |void |do_execfree
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+p |I32 |do_ipcctl |I32 optype|SV** mark|SV** sp
+p |I32 |do_ipcget |I32 optype|SV** mark|SV** sp
+p |I32 |do_msgrcv |SV** mark|SV** sp
+p |I32 |do_msgsnd |SV** mark|SV** sp
+p |I32 |do_semop |SV** mark|SV** sp
+p |I32 |do_shmio |I32 optype|SV** mark|SV** sp
+#endif
+p |void |do_join |SV* sv|SV* del|SV** mark|SV** sp
+p |OP* |do_kv
+Ap |bool |do_open |GV* gv|char* name|I32 len|int as_raw \
+ |int rawmode|int rawperm|PerlIO* supplied_fp
+Ap |bool |do_open9 |GV *gv|char *name|I32 len|int as_raw \
+ |int rawmode|int rawperm|PerlIO *supplied_fp \
+ |SV *svs|I32 num
+p |void |do_pipe |SV* sv|GV* rgv|GV* wgv
+p |bool |do_print |SV* sv|PerlIO* fp
+p |OP* |do_readline
+p |I32 |do_chomp |SV* sv
+p |bool |do_seek |GV* gv|Off_t pos|int whence
+p |void |do_sprintf |SV* sv|I32 len|SV** sarg
+p |Off_t |do_sysseek |GV* gv|Off_t pos|int whence
+p |Off_t |do_tell |GV* gv
+p |I32 |do_trans |SV* sv
+p |UV |do_vecget |SV* sv|I32 offset|I32 size
+p |void |do_vecset |SV* sv
+p |void |do_vop |I32 optype|SV* sv|SV* left|SV* right
+p |OP* |dofile |OP* term
+Ap |I32 |dowantarray
+Ap |void |dump_all
+Ap |void |dump_eval
+#if defined(DUMP_FDS)
+Ap |void |dump_fds |char* s
+#endif
+Ap |void |dump_form |GV* gv
+Ap |void |gv_dump |GV* gv
+Ap |void |op_dump |OP* arg
+Ap |void |pmop_dump |PMOP* pm
+Ap |void |dump_packsubs |HV* stash
+Ap |void |dump_sub |GV* gv
+Apd |void |fbm_compile |SV* sv|U32 flags
+Apd |char* |fbm_instr |unsigned char* big|unsigned char* bigend \
+ |SV* littlesv|U32 flags
+p |char* |find_script |char *scriptname|bool dosearch \
+ |char **search_ext|I32 flags
+#if defined(USE_THREADS)
+p |PADOFFSET|find_threadsv|const char *name
+#endif
+p |OP* |force_list |OP* arg
+p |OP* |fold_constants |OP* arg
+Afp |char* |form |const char* pat|...
+Ap |char* |vform |const char* pat|va_list* args
+Ap |void |free_tmps
+p |OP* |gen_constant_list|OP* o
+#if !defined(HAS_GETENV_LEN)
+p |char* |getenv_len |char* key|unsigned long *len
+#endif
+Ap |void |gp_free |GV* gv
+Ap |GP* |gp_ref |GP* gp
+Ap |GV* |gv_AVadd |GV* gv
+Ap |GV* |gv_HVadd |GV* gv
+Ap |GV* |gv_IOadd |GV* gv
+Ap |GV* |gv_autoload4 |HV* stash|const char* name|STRLEN len \
+ |I32 method
+Ap |void |gv_check |HV* stash
+Ap |void |gv_efullname |SV* sv|GV* gv
+Ap |void |gv_efullname3 |SV* sv|GV* gv|const char* prefix
+Ap |GV* |gv_fetchfile |const char* name
+Apd |GV* |gv_fetchmeth |HV* stash|const char* name|STRLEN len \
+ |I32 level
+Apd |GV* |gv_fetchmethod |HV* stash|const char* name
+Apd |GV* |gv_fetchmethod_autoload|HV* stash|const char* name \
+ |I32 autoload
+Ap |GV* |gv_fetchpv |const char* name|I32 add|I32 sv_type
+Ap |void |gv_fullname |SV* sv|GV* gv
+Ap |void |gv_fullname3 |SV* sv|GV* gv|const char* prefix
+Ap |void |gv_init |GV* gv|HV* stash|const char* name \
+ |STRLEN len|int multi
+Apd |HV* |gv_stashpv |const char* name|I32 create
+Ap |HV* |gv_stashpvn |const char* name|U32 namelen|I32 create
+Apd |HV* |gv_stashsv |SV* sv|I32 create
+Apd |void |hv_clear |HV* tb
+Ap |void |hv_delayfree_ent|HV* hv|HE* entry
+Apd |SV* |hv_delete |HV* tb|const char* key|U32 klen|I32 flags
+Apd |SV* |hv_delete_ent |HV* tb|SV* key|I32 flags|U32 hash
+Apd |bool |hv_exists |HV* tb|const char* key|U32 klen
+Apd |bool |hv_exists_ent |HV* tb|SV* key|U32 hash
+Apd |SV** |hv_fetch |HV* tb|const char* key|U32 klen|I32 lval
+Apd |HE* |hv_fetch_ent |HV* tb|SV* key|I32 lval|U32 hash
+Ap |void |hv_free_ent |HV* hv|HE* entry
+Apd |I32 |hv_iterinit |HV* tb
+Apd |char* |hv_iterkey |HE* entry|I32* retlen
+Apd |SV* |hv_iterkeysv |HE* entry
+Apd |HE* |hv_iternext |HV* tb
+Apd |SV* |hv_iternextsv |HV* hv|char** key|I32* retlen
+Apd |SV* |hv_iterval |HV* tb|HE* entry
+Ap |void |hv_ksplit |HV* hv|IV newmax
+Apd |void |hv_magic |HV* hv|GV* gv|int how
+Apd |SV** |hv_store |HV* tb|const char* key|U32 klen|SV* val \
+ |U32 hash
+Apd |HE* |hv_store_ent |HV* tb|SV* key|SV* val|U32 hash
+Apd |void |hv_undef |HV* tb
+Ap |I32 |ibcmp |const char* a|const char* b|I32 len
+Ap |I32 |ibcmp_locale |const char* a|const char* b|I32 len
+p |bool |ingroup |Gid_t testgid|Uid_t effective
+p |void |init_debugger
+Ap |void |init_stacks
+p |U32 |intro_my
+Ap |char* |instr |const char* big|const char* little
+p |bool |io_close |IO* io|bool not_implicit
+p |OP* |invert |OP* cmd
+Ap |bool |is_uni_alnum |U32 c
+Ap |bool |is_uni_alnumc |U32 c
+Ap |bool |is_uni_idfirst |U32 c
+Ap |bool |is_uni_alpha |U32 c
+Ap |bool |is_uni_ascii |U32 c
+Ap |bool |is_uni_space |U32 c
+Ap |bool |is_uni_cntrl |U32 c
+Ap |bool |is_uni_graph |U32 c
+Ap |bool |is_uni_digit |U32 c
+Ap |bool |is_uni_upper |U32 c
+Ap |bool |is_uni_lower |U32 c
+Ap |bool |is_uni_print |U32 c
+Ap |bool |is_uni_punct |U32 c
+Ap |bool |is_uni_xdigit |U32 c
+Ap |U32 |to_uni_upper |U32 c
+Ap |U32 |to_uni_title |U32 c
+Ap |U32 |to_uni_lower |U32 c
+Ap |bool |is_uni_alnum_lc|U32 c
+Ap |bool |is_uni_alnumc_lc|U32 c
+Ap |bool |is_uni_idfirst_lc|U32 c
+Ap |bool |is_uni_alpha_lc|U32 c
+Ap |bool |is_uni_ascii_lc|U32 c
+Ap |bool |is_uni_space_lc|U32 c
+Ap |bool |is_uni_cntrl_lc|U32 c
+Ap |bool |is_uni_graph_lc|U32 c
+Ap |bool |is_uni_digit_lc|U32 c
+Ap |bool |is_uni_upper_lc|U32 c
+Ap |bool |is_uni_lower_lc|U32 c
+Ap |bool |is_uni_print_lc|U32 c
+Ap |bool |is_uni_punct_lc|U32 c
+Ap |bool |is_uni_xdigit_lc|U32 c
+Ap |U32 |to_uni_upper_lc|U32 c
+Ap |U32 |to_uni_title_lc|U32 c
+Ap |U32 |to_uni_lower_lc|U32 c
+Ap |int |is_utf8_char |U8 *p
+Ap |bool |is_utf8_alnum |U8 *p
+Ap |bool |is_utf8_alnumc |U8 *p
+Ap |bool |is_utf8_idfirst|U8 *p
+Ap |bool |is_utf8_alpha |U8 *p
+Ap |bool |is_utf8_ascii |U8 *p
+Ap |bool |is_utf8_space |U8 *p
+Ap |bool |is_utf8_cntrl |U8 *p
+Ap |bool |is_utf8_digit |U8 *p
+Ap |bool |is_utf8_graph |U8 *p
+Ap |bool |is_utf8_upper |U8 *p
+Ap |bool |is_utf8_lower |U8 *p
+Ap |bool |is_utf8_print |U8 *p
+Ap |bool |is_utf8_punct |U8 *p
+Ap |bool |is_utf8_xdigit |U8 *p
+Ap |bool |is_utf8_mark |U8 *p
+p |OP* |jmaybe |OP* arg
+p |I32 |keyword |char* d|I32 len
+Ap |void |leave_scope |I32 base
+p |void |lex_end
+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|...
+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
+p |int |magic_clearenv |SV* sv|MAGIC* mg
+p |int |magic_clear_all_env|SV* sv|MAGIC* mg
+p |int |magic_clearpack|SV* sv|MAGIC* mg
+p |int |magic_clearsig |SV* sv|MAGIC* mg
+p |int |magic_existspack|SV* sv|MAGIC* mg
+p |int |magic_freeregexp|SV* sv|MAGIC* mg
+p |int |magic_get |SV* sv|MAGIC* mg
+p |int |magic_getarylen|SV* sv|MAGIC* mg
+p |int |magic_getdefelem|SV* sv|MAGIC* mg
+p |int |magic_getglob |SV* sv|MAGIC* mg
+p |int |magic_getnkeys |SV* sv|MAGIC* mg
+p |int |magic_getpack |SV* sv|MAGIC* mg
+p |int |magic_getpos |SV* sv|MAGIC* mg
+p |int |magic_getsig |SV* sv|MAGIC* mg
+p |int |magic_getsubstr|SV* sv|MAGIC* mg
+p |int |magic_gettaint |SV* sv|MAGIC* mg
+p |int |magic_getuvar |SV* sv|MAGIC* mg
+p |int |magic_getvec |SV* sv|MAGIC* mg
+p |U32 |magic_len |SV* sv|MAGIC* mg
+#if defined(USE_THREADS)
+p |int |magic_mutexfree|SV* sv|MAGIC* mg
+#endif
+p |int |magic_nextpack |SV* sv|MAGIC* mg|SV* key
+p |U32 |magic_regdata_cnt|SV* sv|MAGIC* mg
+p |int |magic_regdatum_get|SV* sv|MAGIC* mg
+p |int |magic_set |SV* sv|MAGIC* mg
+p |int |magic_setamagic|SV* sv|MAGIC* mg
+p |int |magic_setarylen|SV* sv|MAGIC* mg
+p |int |magic_setbm |SV* sv|MAGIC* mg
+p |int |magic_setdbline|SV* sv|MAGIC* mg
+#if defined(USE_LOCALE_COLLATE)
+p |int |magic_setcollxfrm|SV* sv|MAGIC* mg
+#endif
+p |int |magic_setdefelem|SV* sv|MAGIC* mg
+p |int |magic_setenv |SV* sv|MAGIC* mg
+p |int |magic_setfm |SV* sv|MAGIC* mg
+p |int |magic_setisa |SV* sv|MAGIC* mg
+p |int |magic_setglob |SV* sv|MAGIC* mg
+p |int |magic_setmglob |SV* sv|MAGIC* mg
+p |int |magic_setnkeys |SV* sv|MAGIC* mg
+p |int |magic_setpack |SV* sv|MAGIC* mg
+p |int |magic_setpos |SV* sv|MAGIC* mg
+p |int |magic_setsig |SV* sv|MAGIC* mg
+p |int |magic_setsubstr|SV* sv|MAGIC* mg
+p |int |magic_settaint |SV* sv|MAGIC* mg
+p |int |magic_setuvar |SV* sv|MAGIC* mg
+p |int |magic_setvec |SV* sv|MAGIC* mg
+p |int |magic_set_all_env|SV* sv|MAGIC* mg
+p |U32 |magic_sizepack |SV* sv|MAGIC* mg
+p |int |magic_wipepack |SV* sv|MAGIC* mg
+p |void |magicname |char* sym|char* name|I32 namlen
+Ap |void |markstack_grow
+#if defined(USE_LOCALE_COLLATE)
+p |char* |mem_collxfrm |const char* s|STRLEN len|STRLEN* xlen
+#endif
+Afp |SV* |mess |const char* pat|...
+Ap |SV* |vmess |const char* pat|va_list* args
+p |void |qerror |SV* err
+Apd |int |mg_clear |SV* sv
+Apd |int |mg_copy |SV* sv|SV* nsv|const char* key|I32 klen
+Apd |MAGIC* |mg_find |SV* sv|int type
+Apd |int |mg_free |SV* sv
+Apd |int |mg_get |SV* sv
+Apd |U32 |mg_length |SV* sv
+Apd |void |mg_magical |SV* sv
+Apd |int |mg_set |SV* sv
+Ap |I32 |mg_size |SV* sv
+p |OP* |mod |OP* o|I32 type
+p |int |mode_from_discipline|SV* discp
+Ap |char* |moreswitches |char* s
+p |OP* |my |OP* o
+Ap |NV |my_atof |const char *s
+#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
+Anp |char* |my_bcopy |const char* from|char* to|I32 len
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+Anp |char* |my_bzero |char* loc|I32 len
+#endif
+Apr |void |my_exit |U32 status
+Apr |void |my_failure_exit
+Ap |I32 |my_fflush_all
+Ap |I32 |my_lstat
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+Anp |I32 |my_memcmp |const char* s1|const char* s2|I32 len
+#endif
+#if !defined(HAS_MEMSET)
+Anp |void* |my_memset |char* loc|I32 ch|I32 len
+#endif
+#if !defined(PERL_OBJECT)
+Ap |I32 |my_pclose |PerlIO* ptr
+Ap |PerlIO*|my_popen |char* cmd|char* mode
+#endif
+Ap |void |my_setenv |char* nam|char* val
+Ap |I32 |my_stat
+#if defined(MYSWAP)
+Ap |short |my_swap |short s
+Ap |long |my_htonl |long l
+Ap |long |my_ntohl |long l
+#endif
+p |void |my_unexec
+Ap |OP* |newANONLIST |OP* o
+Ap |OP* |newANONHASH |OP* o
+Ap |OP* |newANONSUB |I32 floor|OP* proto|OP* block
+Ap |OP* |newASSIGNOP |I32 flags|OP* left|I32 optype|OP* right
+Ap |OP* |newCONDOP |I32 flags|OP* expr|OP* trueop|OP* falseop
+Apd |void |newCONSTSUB |HV* stash|char* name|SV* sv
+Ap |void |newFORM |I32 floor|OP* o|OP* block
+Ap |OP* |newFOROP |I32 flags|char* label|line_t forline \
+ |OP* sclr|OP* expr|OP*block|OP*cont
+Ap |OP* |newLOGOP |I32 optype|I32 flags|OP* left|OP* right
+Ap |OP* |newLOOPEX |I32 type|OP* label
+Ap |OP* |newLOOPOP |I32 flags|I32 debuggable|OP* expr|OP* block
+Ap |OP* |newNULLLIST
+Ap |OP* |newOP |I32 optype|I32 flags
+Ap |void |newPROG |OP* o
+Ap |OP* |newRANGE |I32 flags|OP* left|OP* right
+Ap |OP* |newSLICEOP |I32 flags|OP* subscript|OP* listop
+Ap |OP* |newSTATEOP |I32 flags|char* label|OP* o
+Ap |CV* |newSUB |I32 floor|OP* o|OP* proto|OP* block
+Apd |CV* |newXS |char* name|XSUBADDR_t f|char* filename
+Apd |AV* |newAV
+Ap |OP* |newAVREF |OP* o
+Ap |OP* |newBINOP |I32 type|I32 flags|OP* first|OP* last
+Ap |OP* |newCVREF |I32 flags|OP* o
+Ap |OP* |newGVOP |I32 type|I32 flags|GV* gv
+Ap |GV* |newGVgen |char* pack
+Ap |OP* |newGVREF |I32 type|OP* o
+Ap |OP* |newHVREF |OP* o
+Apd |HV* |newHV
+Ap |HV* |newHVhv |HV* hv
+Ap |IO* |newIO
+Ap |OP* |newLISTOP |I32 type|I32 flags|OP* first|OP* last
+Ap |OP* |newPADOP |I32 type|I32 flags|SV* sv
+Ap |OP* |newPMOP |I32 type|I32 flags
+Ap |OP* |newPVOP |I32 type|I32 flags|char* pv
+Ap |SV* |newRV |SV* pref
+Apd |SV* |newRV_noinc |SV *sv
+Ap |SV* |newSV |STRLEN len
+Ap |OP* |newSVREF |OP* o
+Ap |OP* |newSVOP |I32 type|I32 flags|SV* sv
+Apd |SV* |newSViv |IV i
+Apd |SV* |newSVuv |UV u
+Apd |SV* |newSVnv |NV n
+Apd |SV* |newSVpv |const char* s|STRLEN len
+Apd |SV* |newSVpvn |const char* s|STRLEN len
+Afpd |SV* |newSVpvf |const char* pat|...
+Ap |SV* |vnewSVpvf |const char* pat|va_list* args
+Apd |SV* |newSVrv |SV* rv|const char* classname
+Apd |SV* |newSVsv |SV* old
+Ap |OP* |newUNOP |I32 type|I32 flags|OP* first
+Ap |OP* |newWHILEOP |I32 flags|I32 debuggable|LOOP* loop \
+ |I32 whileline|OP* expr|OP* block|OP* cont
+
+Ap |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
+p |PerlIO*|nextargv |GV* gv
+Ap |char* |ninstr |const char* big|const char* bigend \
+ |const char* little|const char* lend
+p |OP* |oopsCV |OP* o
+Ap |void |op_free |OP* arg
+p |void |package |OP* o
+p |PADOFFSET|pad_alloc |I32 optype|U32 tmptype
+p |PADOFFSET|pad_allocmy |char* name
+p |PADOFFSET|pad_findmy |char* name
+p |OP* |oopsAV |OP* o
+p |OP* |oopsHV |OP* o
+p |void |pad_leavemy |I32 fill
+Ap |SV* |pad_sv |PADOFFSET po
+p |void |pad_free |PADOFFSET po
+p |void |pad_reset
+p |void |pad_swipe |PADOFFSET po
+p |void |peep |OP* o
+#if defined(PERL_OBJECT)
+Aox |void |Perl_construct
+Aox |void |Perl_destruct
+Aox |void |Perl_free
+Aox |int |Perl_run
+Aox |int |Perl_parse |XSINIT_t xsinit \
+ |int argc|char** argv|char** env
+#endif
+#if defined(USE_THREADS)
+Ap |struct perl_thread* |new_struct_thread|struct perl_thread *t
+#endif
+Ap |void |call_atexit |ATEXIT_t fn|void *ptr
+Apd |I32 |call_argv |const char* sub_name|I32 flags|char** argv
+Apd |I32 |call_method |const char* methname|I32 flags
+Apd |I32 |call_pv |const char* sub_name|I32 flags
+Apd |I32 |call_sv |SV* sv|I32 flags
+Apd |SV* |eval_pv |const char* p|I32 croak_on_error
+Apd |I32 |eval_sv |SV* sv|I32 flags
+Apd |SV* |get_sv |const char* name|I32 create
+Apd |AV* |get_av |const char* name|I32 create
+Apd |HV* |get_hv |const char* name|I32 create
+Apd |CV* |get_cv |const char* name|I32 create
+Ap |int |init_i18nl10n |int printwarn
+Ap |int |init_i18nl14n |int printwarn
+Ap |void |new_collate |const char* newcoll
+Ap |void |new_ctype |const char* newctype
+Ap |void |new_numeric |const char* newcoll
+Ap |void |set_numeric_local
+Ap |void |set_numeric_radix
+Ap |void |set_numeric_standard
+Apd |void |require_pv |const char* pv
+p |void |pidgone |Pid_t pid|int status
+Ap |void |pmflag |U16* pmfl|int ch
+p |OP* |pmruntime |OP* pm|OP* expr|OP* repl
+p |OP* |pmtrans |OP* o|OP* expr|OP* repl
+p |OP* |pop_return
+Ap |void |pop_scope
+p |OP* |prepend_elem |I32 optype|OP* head|OP* tail
+p |void |push_return |OP* o
+Ap |void |push_scope
+p |OP* |ref |OP* o|I32 type
+p |OP* |refkids |OP* o|I32 type
+Ap |void |regdump |regexp* r
+Ap |I32 |pregexec |regexp* prog|char* stringarg \
+ |char* strend|char* strbeg|I32 minend \
+ |SV* screamer|U32 nosave
+Ap |void |pregfree |struct regexp* r
+Ap |regexp*|pregcomp |char* exp|char* xend|PMOP* pm
+Ap |char* |re_intuit_start|regexp* prog|SV* sv|char* strpos \
+ |char* strend|U32 flags \
+ |struct re_scream_pos_data_s *data
+Ap |SV* |re_intuit_string|regexp* prog
+Ap |I32 |regexec_flags |regexp* prog|char* stringarg \
+ |char* strend|char* strbeg|I32 minend \
+ |SV* screamer|void* data|U32 flags
+Ap |regnode*|regnext |regnode* p
+p |void |regprop |SV* sv|regnode* o
+Ap |void |repeatcpy |char* to|const char* from|I32 len|I32 count
+Ap |char* |rninstr |const char* big|const char* bigend \
+ |const char* little|const char* lend
+p |Sighandler_t|rsignal |int i|Sighandler_t t
+p |int |rsignal_restore|int i|Sigsave_t* t
+p |int |rsignal_save |int i|Sighandler_t t1|Sigsave_t* t2
+p |Sighandler_t|rsignal_state|int i
+p |void |rxres_free |void** rsp
+p |void |rxres_restore |void** rsp|REGEXP* prx
+p |void |rxres_save |void** rsp|REGEXP* prx
+#if !defined(HAS_RENAME)
+p |I32 |same_dirent |char* a|char* b
+#endif
+Apd |char* |savepv |const char* sv
+Apd |char* |savepvn |const char* sv|I32 len
+Ap |void |savestack_grow
+Ap |void |save_aelem |AV* av|I32 idx|SV **sptr
+Ap |I32 |save_alloc |I32 size|I32 pad
+Ap |void |save_aptr |AV** aptr
+Ap |AV* |save_ary |GV* gv
+Ap |void |save_clearsv |SV** svp
+Ap |void |save_delete |HV* hv|char* key|I32 klen
+Ap |void |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f|void* p
+Ap |void |save_destructor_x|DESTRUCTORFUNC_t f|void* p
+Ap |void |save_freesv |SV* sv
+p |void |save_freeop |OP* o
+Ap |void |save_freepv |char* pv
+Ap |void |save_generic_svref|SV** sptr
+Ap |void |save_gp |GV* gv|I32 empty
+Ap |HV* |save_hash |GV* gv
+Ap |void |save_helem |HV* hv|SV *key|SV **sptr
+Ap |void |save_hints
+Ap |void |save_hptr |HV** hptr
+Ap |void |save_I16 |I16* intp
+Ap |void |save_I32 |I32* intp
+Ap |void |save_I8 |I8* bytep
+Ap |void |save_int |int* intp
+Ap |void |save_item |SV* item
+Ap |void |save_iv |IV* iv
+Ap |void |save_list |SV** sarg|I32 maxsarg
+Ap |void |save_long |long* longp
+Ap |void |save_nogv |GV* gv
+p |void |save_op
+Ap |SV* |save_scalar |GV* gv
+Ap |void |save_pptr |char** pptr
+Ap |void |save_vptr |void* pptr
+Ap |void |save_re_context
+Ap |void |save_sptr |SV** sptr
+Ap |SV* |save_svref |SV** sptr
+Ap |SV** |save_threadsv |PADOFFSET i
+p |OP* |sawparens |OP* o
+p |OP* |scalar |OP* o
+p |OP* |scalarkids |OP* o
+p |OP* |scalarseq |OP* o
+p |OP* |scalarvoid |OP* o
+Ap |NV |scan_bin |char* start|I32 len|I32* retlen
+Ap |NV |scan_hex |char* start|I32 len|I32* retlen
+Ap |char* |scan_num |char* s
+Ap |NV |scan_oct |char* start|I32 len|I32* retlen
+p |OP* |scope |OP* o
+Ap |char* |screaminstr |SV* bigsv|SV* littlesv|I32 start_shift \
+ |I32 end_shift|I32 *state|I32 last
+#if !defined(VMS)
+p |I32 |setenv_getix |char* nam
+#endif
+p |void |setdefout |GV* gv
+Ap |char* |sharepvn |const char* sv|I32 len|U32 hash
+p |HEK* |share_hek |const char* sv|I32 len|U32 hash
+np |Signal_t |sighandler |int sig
+Ap |SV** |stack_grow |SV** sp|SV**p|int n
+Ap |I32 |start_subparse |I32 is_format|U32 flags
+p |void |sub_crush_depth|CV* cv
+Ap |bool |sv_2bool |SV* sv
+Ap |CV* |sv_2cv |SV* sv|HV** st|GV** gvp|I32 lref
+Ap |IO* |sv_2io |SV* sv
+Ap |IV |sv_2iv |SV* sv
+Apd |SV* |sv_2mortal |SV* sv
+Ap |NV |sv_2nv |SV* sv
+Ap |char* |sv_2pv |SV* sv|STRLEN* lp
+Ap |char* |sv_2pvutf8 |SV* sv|STRLEN* lp
+Ap |char* |sv_2pvbyte |SV* sv|STRLEN* lp
+Ap |UV |sv_2uv |SV* sv
+Ap |IV |sv_iv |SV* sv
+Ap |UV |sv_uv |SV* sv
+Ap |NV |sv_nv |SV* sv
+Ap |char* |sv_pvn |SV *sv|STRLEN *len
+Ap |char* |sv_pvutf8n |SV *sv|STRLEN *len
+Ap |char* |sv_pvbyten |SV *sv|STRLEN *len
+Ap |I32 |sv_true |SV *sv
+p |void |sv_add_arena |char* ptr|U32 size|U32 flags
+Ap |int |sv_backoff |SV* sv
+Apd |SV* |sv_bless |SV* sv|HV* stash
+Afpd |void |sv_catpvf |SV* sv|const char* pat|...
+Ap |void |sv_vcatpvf |SV* sv|const char* pat|va_list* args
+Apd |void |sv_catpv |SV* sv|const char* ptr
+Apd |void |sv_catpvn |SV* sv|const char* ptr|STRLEN len
+Apd |void |sv_catsv |SV* dsv|SV* ssv
+Apd |void |sv_chop |SV* sv|char* ptr
+p |void |sv_clean_all
+p |void |sv_clean_objs
+Ap |void |sv_clear |SV* sv
+Apd |I32 |sv_cmp |SV* sv1|SV* sv2
+Ap |I32 |sv_cmp_locale |SV* sv1|SV* sv2
+#if defined(USE_LOCALE_COLLATE)
+Ap |char* |sv_collxfrm |SV* sv|STRLEN* nxp
+#endif
+Ap |OP* |sv_compile_2op |SV* sv|OP** startp|char* code|AV** avp
+Apd |void |sv_dec |SV* sv
+Ap |void |sv_dump |SV* sv
+Apd |bool |sv_derived_from|SV* sv|const char* name
+Apd |I32 |sv_eq |SV* sv1|SV* sv2
+Ap |void |sv_free |SV* sv
+p |void |sv_free_arenas
+Ap |char* |sv_gets |SV* sv|PerlIO* fp|I32 append
+Apd |char* |sv_grow |SV* sv|STRLEN newlen
+Apd |void |sv_inc |SV* sv
+Apd |void |sv_insert |SV* bigsv|STRLEN offset|STRLEN len \
+ |char* little|STRLEN littlelen
+Apd |int |sv_isa |SV* sv|const char* name
+Apd |int |sv_isobject |SV* sv
+Apd |STRLEN |sv_len |SV* sv
+Ap |STRLEN |sv_len_utf8 |SV* sv
+Apd |void |sv_magic |SV* sv|SV* obj|int how|const char* name \
+ |I32 namlen
+Apd |SV* |sv_mortalcopy |SV* oldsv
+Apd |SV* |sv_newmortal
+Ap |SV* |sv_newref |SV* sv
+Ap |char* |sv_peek |SV* sv
+Ap |void |sv_pos_u2b |SV* sv|I32* offsetp|I32* lenp
+Ap |void |sv_pos_b2u |SV* sv|I32* offsetp
+Ap |char* |sv_pvn_force |SV* sv|STRLEN* lp
+Ap |char* |sv_pvutf8n_force|SV* sv|STRLEN* lp
+Ap |char* |sv_pvbyten_force|SV* sv|STRLEN* lp
+Ap |char* |sv_reftype |SV* sv|int ob
+Ap |void |sv_replace |SV* sv|SV* nsv
+Ap |void |sv_report_used
+Ap |void |sv_reset |char* s|HV* stash
+Afpd |void |sv_setpvf |SV* sv|const char* pat|...
+Ap |void |sv_vsetpvf |SV* sv|const char* pat|va_list* args
+Apd |void |sv_setiv |SV* sv|IV num
+Apd |void |sv_setpviv |SV* sv|IV num
+Apd |void |sv_setuv |SV* sv|UV num
+Apd |void |sv_setnv |SV* sv|NV num
+Apd |SV* |sv_setref_iv |SV* rv|const char* classname|IV iv
+Apd |SV* |sv_setref_nv |SV* rv|const char* classname|NV nv
+Apd |SV* |sv_setref_pv |SV* rv|const char* classname|void* pv
+Apd |SV* |sv_setref_pvn |SV* rv|const char* classname|char* pv \
+ |STRLEN n
+Apd |void |sv_setpv |SV* sv|const char* ptr
+Apd |void |sv_setpvn |SV* sv|const char* ptr|STRLEN len
+Apd |void |sv_setsv |SV* dsv|SV* ssv
+Ap |void |sv_taint |SV* sv
+Ap |bool |sv_tainted |SV* sv
+Ap |int |sv_unmagic |SV* sv|int type
+Apd |void |sv_unref |SV* sv
+Ap |void |sv_untaint |SV* sv
+Apd |bool |sv_upgrade |SV* sv|U32 mt
+Apd |void |sv_usepvn |SV* sv|char* ptr|STRLEN len
+Apd |void |sv_vcatpvfn |SV* sv|const char* pat|STRLEN patlen \
+ |va_list* args|SV** svargs|I32 svmax \
+ |bool *maybe_tainted
+Apd |void |sv_vsetpvfn |SV* sv|const char* pat|STRLEN patlen \
+ |va_list* args|SV** svargs|I32 svmax \
+ |bool *maybe_tainted
+Ap |NV |str_to_version |SV *sv
+Ap |SV* |swash_init |char* pkg|char* name|SV* listsv \
+ |I32 minbits|I32 none
+Ap |UV |swash_fetch |SV *sv|U8 *ptr
+Ap |void |taint_env
+Ap |void |taint_proper |const char* f|const char* s
+Ap |UV |to_utf8_lower |U8 *p
+Ap |UV |to_utf8_upper |U8 *p
+Ap |UV |to_utf8_title |U8 *p
+#if defined(UNLINK_ALL_VERSIONS)
+Ap |I32 |unlnk |char* f
+#endif
+#if defined(USE_THREADS)
+Ap |void |unlock_condpair|void* svv
+#endif
+Ap |void |unsharepvn |const char* sv|I32 len|U32 hash
+p |void |unshare_hek |HEK* hek
+p |void |utilize |int aver|I32 floor|OP* version|OP* id|OP* arg
+Ap |U8* |utf16_to_utf8 |U16* p|U8 *d|I32 bytelen
+Ap |U8* |utf16_to_utf8_reversed|U16* p|U8 *d|I32 bytelen
+Ap |I32 |utf8_distance |U8 *a|U8 *b
+Ap |U8* |utf8_hop |U8 *s|I32 off
+Ap |UV |utf8_to_uv |U8 *s|I32* retlen
+Ap |U8* |uv_to_utf8 |U8 *d|UV uv
+p |void |vivify_defelem |SV* sv
+p |void |vivify_ref |SV* sv|U32 to_what
+p |I32 |wait4pid |Pid_t pid|int* statusp|int flags
+p |void |report_closed_fh|GV *gv|IO *io|const char *func|const char *obj
+p |void |report_uninit
+Afpd |void |warn |const char* pat|...
+Ap |void |vwarn |const char* pat|va_list* args
+Afp |void |warner |U32 err|const char* pat|...
+Ap |void |vwarner |U32 err|const char* pat|va_list* args
+p |void |watch |char** addr
+p |I32 |whichsig |char* sig
+p |int |yyerror |char* s
+#if defined(USE_PURE_BISON)
+p |int |yylex |YYSTYPE *lvalp|int *lcharp
+#else
+p |int |yylex
+#endif
+p |int |yyparse
+p |int |yywarn |char* s
+#if defined(MYMALLOC)
+Ap |void |dump_mstats |char* s
+Ap |int |get_mstats |perl_mstats_t *buf|int buflen|int level
+#endif
+Anp |Malloc_t|safesysmalloc |MEM_SIZE nbytes
+Anp |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
+Anp |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
+Anp |Free_t |safesysfree |Malloc_t where
+#if defined(LEAKTEST)
+Anp |Malloc_t|safexmalloc |I32 x|MEM_SIZE size
+Anp |Malloc_t|safexcalloc |I32 x|MEM_SIZE elements|MEM_SIZE size
+Anp |Malloc_t|safexrealloc |Malloc_t where|MEM_SIZE size
+Anp |void |safexfree |Malloc_t where
+#endif
+#if defined(PERL_GLOBAL_STRUCT)
+Ap |struct perl_vars *|GetVars
+#endif
+Ap |int |runops_standard
+Ap |int |runops_debug
+Afpd |void |sv_catpvf_mg |SV *sv|const char* pat|...
+Ap |void |sv_vcatpvf_mg |SV* sv|const char* pat|va_list* args
+Apd |void |sv_catpv_mg |SV *sv|const char *ptr
+Apd |void |sv_catpvn_mg |SV *sv|const char *ptr|STRLEN len
+Apd |void |sv_catsv_mg |SV *dstr|SV *sstr
+Afpd |void |sv_setpvf_mg |SV *sv|const char* pat|...
+Ap |void |sv_vsetpvf_mg |SV* sv|const char* pat|va_list* args
+Apd |void |sv_setiv_mg |SV *sv|IV i
+Apd |void |sv_setpviv_mg |SV *sv|IV iv
+Apd |void |sv_setuv_mg |SV *sv|UV u
+Apd |void |sv_setnv_mg |SV *sv|NV num
+Apd |void |sv_setpv_mg |SV *sv|const char *ptr
+Apd |void |sv_setpvn_mg |SV *sv|const char *ptr|STRLEN len
+Apd |void |sv_setsv_mg |SV *dstr|SV *sstr
+Apd |void |sv_usepvn_mg |SV *sv|char *ptr|STRLEN len
+Ap |MGVTBL*|get_vtbl |int vtbl_id
+p |char* |pv_display |SV *sv|char *pv|STRLEN cur|STRLEN len \
+ |STRLEN pvlim
+Afp |void |dump_indent |I32 level|PerlIO *file|const char* pat|...
+Ap |void |dump_vindent |I32 level|PerlIO *file|const char* pat \
+ |va_list *args
+Ap |void |do_gv_dump |I32 level|PerlIO *file|char *name|GV *sv
+Ap |void |do_gvgv_dump |I32 level|PerlIO *file|char *name|GV *sv
+Ap |void |do_hv_dump |I32 level|PerlIO *file|char *name|HV *sv
+Ap |void |do_magic_dump |I32 level|PerlIO *file|MAGIC *mg|I32 nest \
+ |I32 maxnest|bool dumpops|STRLEN pvlim
+Ap |void |do_op_dump |I32 level|PerlIO *file|OP *o
+Ap |void |do_pmop_dump |I32 level|PerlIO *file|PMOP *pm
+Ap |void |do_sv_dump |I32 level|PerlIO *file|SV *sv|I32 nest \
+ |I32 maxnest|bool dumpops|STRLEN pvlim
+Ap |void |magic_dump |MAGIC *mg
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+Ap |void* |default_protect|volatile JMPENV *je|int *excpt \
+ |protect_body_t body|...
+Ap |void* |vdefault_protect|volatile JMPENV *je|int *excpt \
+ |protect_body_t body|va_list *args
+#endif
+Ap |void |reginitcolors
+Ap |char* |sv_2pv_nolen |SV* sv
+Ap |char* |sv_2pvutf8_nolen|SV* sv
+Ap |char* |sv_2pvbyte_nolen|SV* sv
+Ap |char* |sv_pv |SV *sv
+Ap |char* |sv_pvutf8 |SV *sv
+Ap |char* |sv_pvbyte |SV *sv
+Ap |void |sv_utf8_upgrade|SV *sv
+Ap |bool |sv_utf8_downgrade|SV *sv|bool fail_ok
+Ap |void |sv_utf8_encode |SV *sv
+Ap |bool |sv_utf8_decode |SV *sv
+Ap |void |sv_force_normal|SV *sv
+Ap |void |tmps_grow |I32 n
+Ap |SV* |sv_rvweaken |SV *sv
+p |int |magic_killbackrefs|SV *sv|MAGIC *mg
+Ap |OP* |newANONATTRSUB |I32 floor|OP *proto|OP *attrs|OP *block
+Ap |CV* |newATTRSUB |I32 floor|OP *o|OP *proto|OP *attrs|OP *block
+Ap |void |newMYSUB |I32 floor|OP *o|OP *proto|OP *attrs|OP *block
+p |OP * |my_attrs |OP *o|OP *attrs
+p |void |boot_core_xsutils
+#if defined(USE_ITHREADS)
+Ap |PERL_CONTEXT*|cx_dup |PERL_CONTEXT* cx|I32 ix|I32 max
+Ap |PERL_SI*|si_dup |PERL_SI* si
+Ap |ANY* |ss_dup |PerlInterpreter* proto_perl
+Ap |void* |any_dup |void* v|PerlInterpreter* proto_perl
+Ap |HE* |he_dup |HE* e|bool shared
+Ap |REGEXP*|re_dup |REGEXP* r
+Ap |PerlIO*|fp_dup |PerlIO* fp|char type
+Ap |DIR* |dirp_dup |DIR* dp
+Ap |GP* |gp_dup |GP* gp
+Ap |MAGIC* |mg_dup |MAGIC* mg
+Ap |SV* |sv_dup |SV* sstr
+#if defined(HAVE_INTERP_INTERN)
+Ap |void |sys_intern_dup |struct interp_intern* src \
+ |struct interp_intern* dst
+#endif
+Ap |PTR_TBL_t*|ptr_table_new
+Ap |void* |ptr_table_fetch|PTR_TBL_t *tbl|void *sv
+Ap |void |ptr_table_store|PTR_TBL_t *tbl|void *oldsv|void *newsv
+Ap |void |ptr_table_split|PTR_TBL_t *tbl
+#endif
+
+#if defined(PERL_OBJECT)
+protected:
+#else
+END_EXTERN_C
+#endif
+
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+s |I32 |avhv_index_sv |SV* sv
+s |I32 |avhv_index |AV* av|SV* sv|U32 hash
+#endif
+
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+s |I32 |do_trans_CC_simple |SV *sv
+s |I32 |do_trans_CC_count |SV *sv
+s |I32 |do_trans_CC_complex |SV *sv
+s |I32 |do_trans_UU_simple |SV *sv
+s |I32 |do_trans_UU_count |SV *sv
+s |I32 |do_trans_UU_complex |SV *sv
+s |I32 |do_trans_UC_simple |SV *sv
+s |I32 |do_trans_CU_simple |SV *sv
+s |I32 |do_trans_UC_trivial |SV *sv
+s |I32 |do_trans_CU_trivial |SV *sv
+#endif
+
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+s |void |gv_init_sv |GV *gv|I32 sv_type
+#endif
+
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+s |void |hsplit |HV *hv
+s |void |hfreeentries |HV *hv
+s |void |more_he
+s |HE* |new_he
+s |void |del_he |HE *p
+s |HEK* |save_hek |const char *str|I32 len|U32 hash
+s |void |hv_magic_check |HV *hv|bool *needs_copy|bool *needs_store
+#endif
+
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+s |void |save_magic |I32 mgs_ix|SV *sv
+s |int |magic_methpack |SV *sv|MAGIC *mg|char *meth
+s |int |magic_methcall |SV *sv|MAGIC *mg|char *meth|I32 f \
+ |int n|SV *val
+#endif
+
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+s |I32 |list_assignment|OP *o
+s |void |bad_type |I32 n|char *t|char *name|OP *kid
+s |void |cop_free |COP *cop
+s |OP* |modkids |OP *o|I32 type
+s |void |no_bareword_allowed|OP *o
+s |OP* |no_fh_allowed |OP *o
+s |OP* |scalarboolean |OP *o
+s |OP* |too_few_arguments|OP *o|char* name
+s |OP* |too_many_arguments|OP *o|char* name
+s |void |op_clear |OP* o
+s |void |null |OP* o
+s |PADOFFSET|pad_addlex |SV* name
+s |PADOFFSET|pad_findlex |char* name|PADOFFSET newoff|U32 seq \
+ |CV* startcv|I32 cx_ix|I32 saweval|U32 flags
+s |OP* |newDEFSVOP
+s |OP* |new_logop |I32 type|I32 flags|OP **firstp|OP **otherp
+s |void |simplify_sort |OP *o
+s |bool |is_handle_constructor |OP *o|I32 argnum
+s |char* |gv_ename |GV *gv
+s |void |cv_dump |CV *cv
+s |CV* |cv_clone2 |CV *proto|CV *outside
+s |bool |scalar_mod_type|OP *o|I32 type
+s |OP * |my_kid |OP *o|OP *attrs
+s |OP * |dup_attrlist |OP *o
+s |void |apply_attrs |HV *stash|SV *target|OP *attrs
+# if defined(PL_OP_SLAB_ALLOC)
+s |void* |Slab_Alloc |int m|size_t sz
+# endif
+#endif
+
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+s |void |find_beginning
+s |void |forbid_setid |char *
+s |void |incpush |char *|int|int
+s |void |init_interp
+s |void |init_ids
+s |void |init_lexer
+s |void |init_main_stash
+s |void |init_perllib
+s |void |init_postdump_symbols|int|char **|char **
+s |void |init_predump_symbols
+rs |void |my_exit_jump
+s |void |nuke_stacks
+s |void |open_script |char *|bool|SV *|int *fd
+s |void |usage |char *
+s |void |validate_suid |char *|char*|int
+# if defined(IAMSUID)
+s |int |fd_on_nosuid_fs|int fd
+# endif
+s |void* |parse_body |char **env|XSINIT_t xsinit
+s |void* |run_body |I32 oldscope
+s |void |call_body |OP *myop|int is_eval
+s |void* |call_list_body |CV *cv
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+s |void* |vparse_body |va_list args
+s |void* |vrun_body |va_list args
+s |void* |vcall_body |va_list args
+s |void* |vcall_list_body|va_list args
+#endif
+# if defined(USE_THREADS)
+s |struct perl_thread * |init_main_thread
+# endif
+#endif
+
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+s |void |doencodes |SV* sv|char* s|I32 len
+s |SV* |refto |SV* sv
+s |U32 |seed
+s |SV* |mul128 |SV *sv|U8 m
+s |SV* |is_an_int |char *s|STRLEN l
+s |int |div128 |SV *pnum|bool *done
+#endif
+
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+s |OP* |docatch |OP *o
+s |void* |docatch_body
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+s |void* |vdocatch_body |va_list args
+#endif
+s |OP* |dofindlabel |OP *o|char *label|OP **opstack|OP **oplimit
+s |void |doparseform |SV *sv
+s |I32 |dopoptoeval |I32 startingblock
+s |I32 |dopoptolabel |char *label
+s |I32 |dopoptoloop |I32 startingblock
+s |I32 |dopoptosub |I32 startingblock
+s |I32 |dopoptosub_at |PERL_CONTEXT* cxstk|I32 startingblock
+s |void |free_closures
+s |void |save_lines |AV *array|SV *sv
+s |OP* |doeval |int gimme|OP** startop
+s |PerlIO *|doopen_pmc |const char *name|const char *mode
+s |void |qsortsv |SV ** array|size_t num_elts|SVCOMPARE_t f
+#endif
+
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+s |int |do_maybe_phash |AV *ary|SV **lelem|SV **firstlelem \
+ |SV **relem|SV **lastrelem
+s |void |do_oddball |HV *hash|SV **relem|SV **firstrelem
+s |CV* |get_db_sub |SV **svp|CV *cv
+s |SV* |method_common |SV* meth|U32* hashp
+#endif
+
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+s |OP* |doform |CV *cv|GV *gv|OP *retop
+s |int |emulate_eaccess|const char* path|Mode_t mode
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+s |int |dooneliner |char *cmd|char *filename
+# endif
+#endif
+
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+s |regnode*|reg |I32|I32 *
+s |regnode*|reganode |U8|U32
+s |regnode*|regatom |I32 *
+s |regnode*|regbranch |I32 *|I32
+s |void |reguni |UV|char *|I32*
+s |regnode*|regclass
+s |regnode*|regclassutf8
+s |I32 |regcurly |char *
+s |regnode*|reg_node |U8
+s |regnode*|regpiece |I32 *
+s |void |reginsert |U8|regnode *
+s |void |regoptail |regnode *|regnode *
+s |void |regtail |regnode *|regnode *
+s |char*|regwhite |char *|char *
+s |char*|nextchar
+s |regnode*|dumpuntil |regnode *start|regnode *node \
+ |regnode *last|SV* sv|I32 l
+s |void |put_byte |SV* sv|int c
+s |void |scan_commit |struct scan_data_t *data
+s |void |cl_anything |struct regnode_charclass_class *cl
+s |int |cl_is_anything |struct regnode_charclass_class *cl
+s |void |cl_init |struct regnode_charclass_class *cl
+s |void |cl_init_zero |struct regnode_charclass_class *cl
+s |void |cl_and |struct regnode_charclass_class *cl \
+ |struct regnode_charclass_class *and_with
+s |void |cl_or |struct regnode_charclass_class *cl \
+ |struct regnode_charclass_class *or_with
+s |I32 |study_chunk |regnode **scanp|I32 *deltap \
+ |regnode *last|struct scan_data_t *data \
+ |U32 flags
+s |I32 |add_data |I32 n|char *s
+rs |void|re_croak2 |const char* pat1|const char* pat2|...
+s |I32 |regpposixcc |I32 value
+s |void |checkposixcc
+#endif
+
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+s |I32 |regmatch |regnode *prog
+s |I32 |regrepeat |regnode *p|I32 max
+s |I32 |regrepeat_hard |regnode *p|I32 max|I32 *lp
+s |I32 |regtry |regexp *prog|char *startpos
+s |bool |reginclass |regnode *p|I32 c
+s |bool |reginclassutf8 |regnode *f|U8* p
+s |CHECKPOINT|regcppush |I32 parenfloor
+s |char*|regcppop
+s |char*|regcp_set_to |I32 ss
+s |void |cache_re |regexp *prog
+s |U8* |reghop |U8 *pos|I32 off
+s |U8* |reghopmaybe |U8 *pos|I32 off
+s |char* |find_byclass |regexp * prog|regnode *c|char *s|char *strend|char *startpos|I32 norun
+#endif
+
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
+s |void |debprof |OP *o
+#endif
+
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+s |SV* |save_scalar_at |SV **sptr
+#endif
+
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+s |IV |asIV |SV* sv
+s |UV |asUV |SV* sv
+s |SV* |more_sv
+s |void |more_xiv
+s |void |more_xnv
+s |void |more_xpv
+s |void |more_xpviv
+s |void |more_xpvnv
+s |void |more_xpvcv
+s |void |more_xpvav
+s |void |more_xpvhv
+s |void |more_xpvmg
+s |void |more_xpvlv
+s |void |more_xpvbm
+s |void |more_xrv
+s |XPVIV* |new_xiv
+s |XPVNV* |new_xnv
+s |XPV* |new_xpv
+s |XPVIV* |new_xpviv
+s |XPVNV* |new_xpvnv
+s |XPVCV* |new_xpvcv
+s |XPVAV* |new_xpvav
+s |XPVHV* |new_xpvhv
+s |XPVMG* |new_xpvmg
+s |XPVLV* |new_xpvlv
+s |XPVBM* |new_xpvbm
+s |XRV* |new_xrv
+s |void |del_xiv |XPVIV* p
+s |void |del_xnv |XPVNV* p
+s |void |del_xpv |XPV* p
+s |void |del_xpviv |XPVIV* p
+s |void |del_xpvnv |XPVNV* p
+s |void |del_xpvcv |XPVCV* p
+s |void |del_xpvav |XPVAV* p
+s |void |del_xpvhv |XPVHV* p
+s |void |del_xpvmg |XPVMG* p
+s |void |del_xpvlv |XPVLV* p
+s |void |del_xpvbm |XPVBM* p
+s |void |del_xrv |XRV* p
+s |void |sv_unglob |SV* sv
+s |void |not_a_number |SV *sv
+s |void |visit |SVFUNC_t f
+s |void |sv_add_backref |SV *tsv|SV *sv
+s |void |sv_del_backref |SV *sv
+# if defined(DEBUGGING)
+s |void |del_sv |SV *p
+# endif
+#endif
+
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+s |void |check_uni
+s |void |force_next |I32 type
+s |char* |force_version |char *start
+s |char* |force_word |char *start|int token|int check_keyword \
+ |int allow_pack|int allow_tick
+s |SV* |tokeq |SV *sv
+s |char* |scan_const |char *start
+s |char* |scan_formline |char *s
+s |char* |scan_heredoc |char *s
+s |char* |scan_ident |char *s|char *send|char *dest \
+ |STRLEN destlen|I32 ck_uni
+s |char* |scan_inputsymbol|char *start
+s |char* |scan_pat |char *start|I32 type
+s |char* |scan_str |char *start|int keep_quoted|int keep_delims
+s |char* |scan_subst |char *start
+s |char* |scan_trans |char *start
+s |char* |scan_word |char *s|char *dest|STRLEN destlen \
+ |int allow_package|STRLEN *slp
+s |char* |skipspace |char *s
+s |void |checkcomma |char *s|char *name|char *what
+s |void |force_ident |char *s|int kind
+s |void |incline |char *s
+s |int |intuit_method |char *s|GV *gv
+s |int |intuit_more |char *s
+s |I32 |lop |I32 f|int x|char *s
+s |void |missingterm |char *s
+s |void |no_op |char *what|char *s
+s |void |set_csh
+s |I32 |sublex_done
+s |I32 |sublex_push
+s |I32 |sublex_start
+s |char * |filter_gets |SV *sv|PerlIO *fp|STRLEN append
+s |SV* |new_constant |char *s|STRLEN len|const char *key|SV *sv \
+ |SV *pv|const char *type
+s |int |ao |int toketype
+s |void |depcom
+s |char* |incl_perldb
+#if 0
+s |I32 |utf16_textfilter|int idx|SV *sv|int maxlen
+s |I32 |utf16rev_textfilter|int idx|SV *sv|int maxlen
+#endif
+# if defined(CRIPPLED_CC)
+s |int |uni |I32 f|char *s
+# endif
+# if defined(PERL_CR_FILTER)
+s |I32 |cr_textfilter |int idx|SV *sv|int maxlen
+# endif
+#endif
+
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+s |SV*|isa_lookup |HV *stash|const char *name|int len|int level
+#endif
+
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+s |SV* |mess_alloc
+# if defined(LEAKTEST)
+s |void |xstat |int
+# endif
+#endif
+
+#if defined(PERL_OBJECT)
+};
+#endif
diff --git a/contrib/perl5/embedvar.h b/contrib/perl5/embedvar.h
index 25b31e0..e790976 100644
--- a/contrib/perl5/embedvar.h
+++ b/contrib/perl5/embedvar.h
@@ -1,271 +1,1106 @@
/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- This file is built by embed.pl from global.sym, intrpvar.h,
- and thrdvar.h. Any changes made here will be lost!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
*/
/* (Doing namespace management portably in C is really gross.) */
-/* EMBED has no run-time penalty, but helps keep the Perl namespace
- from colliding with that used by other libraries pulled in
- by extensions or by embedding perl. Allow a cc -DNO_EMBED
- override, however, to keep binary compatability with previous
- versions of perl.
+/*
+ The following combinations of MULTIPLICITY, USE_THREADS, PERL_OBJECT
+ and PERL_IMPLICIT_CONTEXT are supported:
+ 1) none
+ 2) MULTIPLICITY # supported for compatibility
+ 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
+ 4) USE_THREADS && PERL_IMPLICIT_CONTEXT
+ 5) MULTIPLICITY && USE_THREADS && PERL_IMPLICIT_CONTEXT
+ 6) PERL_OBJECT && PERL_IMPLICIT_CONTEXT
+
+ All other combinations of these flags are errors.
+
+ #3, #4, #5, and #6 are supported directly, while #2 is a special
+ case of #3 (supported by redefining vTHX appropriately).
*/
+#if defined(MULTIPLICITY)
+/* cases 2, 3 and 5 above */
+
+# if defined(PERL_IMPLICIT_CONTEXT)
+# define vTHX aTHX
+# else
+# define vTHX PERL_GET_INTERP
+# endif
+
+#define PL_Sv (vTHX->TSv)
+#define PL_Xpv (vTHX->TXpv)
+#define PL_av_fetch_sv (vTHX->Tav_fetch_sv)
+#define PL_bodytarget (vTHX->Tbodytarget)
+#define PL_bostr (vTHX->Tbostr)
+#define PL_chopset (vTHX->Tchopset)
+#define PL_colors (vTHX->Tcolors)
+#define PL_colorset (vTHX->Tcolorset)
+#define PL_curcop (vTHX->Tcurcop)
+#define PL_curpad (vTHX->Tcurpad)
+#define PL_curpm (vTHX->Tcurpm)
+#define PL_curstack (vTHX->Tcurstack)
+#define PL_curstackinfo (vTHX->Tcurstackinfo)
+#define PL_curstash (vTHX->Tcurstash)
+#define PL_defoutgv (vTHX->Tdefoutgv)
+#define PL_defstash (vTHX->Tdefstash)
+#define PL_delaymagic (vTHX->Tdelaymagic)
+#define PL_dirty (vTHX->Tdirty)
+#define PL_dumpindent (vTHX->Tdumpindent)
+#define PL_efloatbuf (vTHX->Tefloatbuf)
+#define PL_efloatsize (vTHX->Tefloatsize)
+#define PL_errors (vTHX->Terrors)
+#define PL_extralen (vTHX->Textralen)
+#define PL_firstgv (vTHX->Tfirstgv)
+#define PL_formtarget (vTHX->Tformtarget)
+#define PL_hv_fetch_ent_mh (vTHX->Thv_fetch_ent_mh)
+#define PL_hv_fetch_sv (vTHX->Thv_fetch_sv)
+#define PL_in_eval (vTHX->Tin_eval)
+#define PL_last_in_gv (vTHX->Tlast_in_gv)
+#define PL_lastgotoprobe (vTHX->Tlastgotoprobe)
+#define PL_lastscream (vTHX->Tlastscream)
+#define PL_localizing (vTHX->Tlocalizing)
+#define PL_mainstack (vTHX->Tmainstack)
+#define PL_markstack (vTHX->Tmarkstack)
+#define PL_markstack_max (vTHX->Tmarkstack_max)
+#define PL_markstack_ptr (vTHX->Tmarkstack_ptr)
+#define PL_maxscream (vTHX->Tmaxscream)
+#define PL_modcount (vTHX->Tmodcount)
+#define PL_na (vTHX->Tna)
+#define PL_nrs (vTHX->Tnrs)
+#define PL_ofs (vTHX->Tofs)
+#define PL_ofslen (vTHX->Tofslen)
+#define PL_op (vTHX->Top)
+#define PL_opsave (vTHX->Topsave)
+#define PL_protect (vTHX->Tprotect)
+#define PL_reg_call_cc (vTHX->Treg_call_cc)
+#define PL_reg_curpm (vTHX->Treg_curpm)
+#define PL_reg_eval_set (vTHX->Treg_eval_set)
+#define PL_reg_flags (vTHX->Treg_flags)
+#define PL_reg_ganch (vTHX->Treg_ganch)
+#define PL_reg_leftiter (vTHX->Treg_leftiter)
+#define PL_reg_magic (vTHX->Treg_magic)
+#define PL_reg_maxiter (vTHX->Treg_maxiter)
+#define PL_reg_oldcurpm (vTHX->Treg_oldcurpm)
+#define PL_reg_oldpos (vTHX->Treg_oldpos)
+#define PL_reg_oldsaved (vTHX->Treg_oldsaved)
+#define PL_reg_oldsavedlen (vTHX->Treg_oldsavedlen)
+#define PL_reg_poscache (vTHX->Treg_poscache)
+#define PL_reg_poscache_size (vTHX->Treg_poscache_size)
+#define PL_reg_re (vTHX->Treg_re)
+#define PL_reg_start_tmp (vTHX->Treg_start_tmp)
+#define PL_reg_start_tmpl (vTHX->Treg_start_tmpl)
+#define PL_reg_starttry (vTHX->Treg_starttry)
+#define PL_reg_sv (vTHX->Treg_sv)
+#define PL_reg_whilem_seen (vTHX->Treg_whilem_seen)
+#define PL_regbol (vTHX->Tregbol)
+#define PL_regcc (vTHX->Tregcc)
+#define PL_regcode (vTHX->Tregcode)
+#define PL_regcomp_parse (vTHX->Tregcomp_parse)
+#define PL_regcomp_rx (vTHX->Tregcomp_rx)
+#define PL_regcompp (vTHX->Tregcompp)
+#define PL_regdata (vTHX->Tregdata)
+#define PL_regdummy (vTHX->Tregdummy)
+#define PL_regendp (vTHX->Tregendp)
+#define PL_regeol (vTHX->Tregeol)
+#define PL_regexecp (vTHX->Tregexecp)
+#define PL_regflags (vTHX->Tregflags)
+#define PL_regfree (vTHX->Tregfree)
+#define PL_regindent (vTHX->Tregindent)
+#define PL_reginput (vTHX->Treginput)
+#define PL_regint_start (vTHX->Tregint_start)
+#define PL_regint_string (vTHX->Tregint_string)
+#define PL_reginterp_cnt (vTHX->Treginterp_cnt)
+#define PL_reglastparen (vTHX->Treglastparen)
+#define PL_regnarrate (vTHX->Tregnarrate)
+#define PL_regnaughty (vTHX->Tregnaughty)
+#define PL_regnpar (vTHX->Tregnpar)
+#define PL_regprecomp (vTHX->Tregprecomp)
+#define PL_regprev (vTHX->Tregprev)
+#define PL_regprogram (vTHX->Tregprogram)
+#define PL_regsawback (vTHX->Tregsawback)
+#define PL_regseen (vTHX->Tregseen)
+#define PL_regsize (vTHX->Tregsize)
+#define PL_regstartp (vTHX->Tregstartp)
+#define PL_regtill (vTHX->Tregtill)
+#define PL_regxend (vTHX->Tregxend)
+#define PL_restartop (vTHX->Trestartop)
+#define PL_retstack (vTHX->Tretstack)
+#define PL_retstack_ix (vTHX->Tretstack_ix)
+#define PL_retstack_max (vTHX->Tretstack_max)
+#define PL_rs (vTHX->Trs)
+#define PL_savestack (vTHX->Tsavestack)
+#define PL_savestack_ix (vTHX->Tsavestack_ix)
+#define PL_savestack_max (vTHX->Tsavestack_max)
+#define PL_scopestack (vTHX->Tscopestack)
+#define PL_scopestack_ix (vTHX->Tscopestack_ix)
+#define PL_scopestack_max (vTHX->Tscopestack_max)
+#define PL_screamfirst (vTHX->Tscreamfirst)
+#define PL_screamnext (vTHX->Tscreamnext)
+#define PL_secondgv (vTHX->Tsecondgv)
+#define PL_seen_evals (vTHX->Tseen_evals)
+#define PL_seen_zerolen (vTHX->Tseen_zerolen)
+#define PL_sortcop (vTHX->Tsortcop)
+#define PL_sortcxix (vTHX->Tsortcxix)
+#define PL_sortstash (vTHX->Tsortstash)
+#define PL_stack_base (vTHX->Tstack_base)
+#define PL_stack_max (vTHX->Tstack_max)
+#define PL_stack_sp (vTHX->Tstack_sp)
+#define PL_start_env (vTHX->Tstart_env)
+#define PL_statbuf (vTHX->Tstatbuf)
+#define PL_statcache (vTHX->Tstatcache)
+#define PL_statgv (vTHX->Tstatgv)
+#define PL_statname (vTHX->Tstatname)
+#define PL_tainted (vTHX->Ttainted)
+#define PL_timesbuf (vTHX->Ttimesbuf)
+#define PL_tmps_floor (vTHX->Ttmps_floor)
+#define PL_tmps_ix (vTHX->Ttmps_ix)
+#define PL_tmps_max (vTHX->Ttmps_max)
+#define PL_tmps_stack (vTHX->Ttmps_stack)
+#define PL_top_env (vTHX->Ttop_env)
+#define PL_toptarget (vTHX->Ttoptarget)
+#define PL_watchaddr (vTHX->Twatchaddr)
+#define PL_watchok (vTHX->Twatchok)
+
+# if defined(PERL_OBJECT)
+# include "error: PERL_OBJECT + MULTIPLICITY don't go together"
+# endif
-/* Put interpreter-specific symbols into a struct? */
-
-#ifdef MULTIPLICITY
-
-#ifndef USE_THREADS
-/* If we do not have threads then per-thread vars are per-interpreter */
-
-#define PL_Sv (PL_curinterp->TSv)
-#define PL_Xpv (PL_curinterp->TXpv)
-#define PL_av_fetch_sv (PL_curinterp->Tav_fetch_sv)
-#define PL_bodytarget (PL_curinterp->Tbodytarget)
-#define PL_bostr (PL_curinterp->Tbostr)
-#define PL_chopset (PL_curinterp->Tchopset)
-#define PL_colors (PL_curinterp->Tcolors)
-#define PL_colorset (PL_curinterp->Tcolorset)
-#define PL_curcop (PL_curinterp->Tcurcop)
-#define PL_curpad (PL_curinterp->Tcurpad)
-#define PL_curpm (PL_curinterp->Tcurpm)
-#define PL_curstack (PL_curinterp->Tcurstack)
-#define PL_curstackinfo (PL_curinterp->Tcurstackinfo)
-#define PL_curstash (PL_curinterp->Tcurstash)
-#define PL_defoutgv (PL_curinterp->Tdefoutgv)
-#define PL_defstash (PL_curinterp->Tdefstash)
-#define PL_delaymagic (PL_curinterp->Tdelaymagic)
-#define PL_dirty (PL_curinterp->Tdirty)
-#define PL_extralen (PL_curinterp->Textralen)
-#define PL_firstgv (PL_curinterp->Tfirstgv)
-#define PL_formtarget (PL_curinterp->Tformtarget)
-#define PL_hv_fetch_ent_mh (PL_curinterp->Thv_fetch_ent_mh)
-#define PL_hv_fetch_sv (PL_curinterp->Thv_fetch_sv)
-#define PL_in_eval (PL_curinterp->Tin_eval)
-#define PL_last_in_gv (PL_curinterp->Tlast_in_gv)
-#define PL_lastgotoprobe (PL_curinterp->Tlastgotoprobe)
-#define PL_lastscream (PL_curinterp->Tlastscream)
-#define PL_localizing (PL_curinterp->Tlocalizing)
-#define PL_mainstack (PL_curinterp->Tmainstack)
-#define PL_markstack (PL_curinterp->Tmarkstack)
-#define PL_markstack_max (PL_curinterp->Tmarkstack_max)
-#define PL_markstack_ptr (PL_curinterp->Tmarkstack_ptr)
-#define PL_maxscream (PL_curinterp->Tmaxscream)
-#define PL_modcount (PL_curinterp->Tmodcount)
-#define PL_nrs (PL_curinterp->Tnrs)
-#define PL_ofs (PL_curinterp->Tofs)
-#define PL_ofslen (PL_curinterp->Tofslen)
-#define PL_op (PL_curinterp->Top)
-#define PL_opsave (PL_curinterp->Topsave)
-#define PL_reg_eval_set (PL_curinterp->Treg_eval_set)
-#define PL_reg_flags (PL_curinterp->Treg_flags)
-#define PL_reg_start_tmp (PL_curinterp->Treg_start_tmp)
-#define PL_reg_start_tmpl (PL_curinterp->Treg_start_tmpl)
-#define PL_regbol (PL_curinterp->Tregbol)
-#define PL_regcc (PL_curinterp->Tregcc)
-#define PL_regcode (PL_curinterp->Tregcode)
-#define PL_regcomp_parse (PL_curinterp->Tregcomp_parse)
-#define PL_regcomp_rx (PL_curinterp->Tregcomp_rx)
-#define PL_regcompp (PL_curinterp->Tregcompp)
-#define PL_regdata (PL_curinterp->Tregdata)
-#define PL_regdummy (PL_curinterp->Tregdummy)
-#define PL_regendp (PL_curinterp->Tregendp)
-#define PL_regeol (PL_curinterp->Tregeol)
-#define PL_regexecp (PL_curinterp->Tregexecp)
-#define PL_regflags (PL_curinterp->Tregflags)
-#define PL_regindent (PL_curinterp->Tregindent)
-#define PL_reginput (PL_curinterp->Treginput)
-#define PL_reginterp_cnt (PL_curinterp->Treginterp_cnt)
-#define PL_reglastparen (PL_curinterp->Treglastparen)
-#define PL_regnarrate (PL_curinterp->Tregnarrate)
-#define PL_regnaughty (PL_curinterp->Tregnaughty)
-#define PL_regnpar (PL_curinterp->Tregnpar)
-#define PL_regprecomp (PL_curinterp->Tregprecomp)
-#define PL_regprev (PL_curinterp->Tregprev)
-#define PL_regprogram (PL_curinterp->Tregprogram)
-#define PL_regsawback (PL_curinterp->Tregsawback)
-#define PL_regseen (PL_curinterp->Tregseen)
-#define PL_regsize (PL_curinterp->Tregsize)
-#define PL_regstartp (PL_curinterp->Tregstartp)
-#define PL_regtill (PL_curinterp->Tregtill)
-#define PL_regxend (PL_curinterp->Tregxend)
-#define PL_restartop (PL_curinterp->Trestartop)
-#define PL_retstack (PL_curinterp->Tretstack)
-#define PL_retstack_ix (PL_curinterp->Tretstack_ix)
-#define PL_retstack_max (PL_curinterp->Tretstack_max)
-#define PL_rs (PL_curinterp->Trs)
-#define PL_savestack (PL_curinterp->Tsavestack)
-#define PL_savestack_ix (PL_curinterp->Tsavestack_ix)
-#define PL_savestack_max (PL_curinterp->Tsavestack_max)
-#define PL_scopestack (PL_curinterp->Tscopestack)
-#define PL_scopestack_ix (PL_curinterp->Tscopestack_ix)
-#define PL_scopestack_max (PL_curinterp->Tscopestack_max)
-#define PL_screamfirst (PL_curinterp->Tscreamfirst)
-#define PL_screamnext (PL_curinterp->Tscreamnext)
-#define PL_secondgv (PL_curinterp->Tsecondgv)
-#define PL_seen_evals (PL_curinterp->Tseen_evals)
-#define PL_seen_zerolen (PL_curinterp->Tseen_zerolen)
-#define PL_sortcop (PL_curinterp->Tsortcop)
-#define PL_sortcxix (PL_curinterp->Tsortcxix)
-#define PL_sortstash (PL_curinterp->Tsortstash)
-#define PL_stack_base (PL_curinterp->Tstack_base)
-#define PL_stack_max (PL_curinterp->Tstack_max)
-#define PL_stack_sp (PL_curinterp->Tstack_sp)
-#define PL_start_env (PL_curinterp->Tstart_env)
-#define PL_statbuf (PL_curinterp->Tstatbuf)
-#define PL_statcache (PL_curinterp->Tstatcache)
-#define PL_statgv (PL_curinterp->Tstatgv)
-#define PL_statname (PL_curinterp->Tstatname)
-#define PL_tainted (PL_curinterp->Ttainted)
-#define PL_timesbuf (PL_curinterp->Ttimesbuf)
-#define PL_tmps_floor (PL_curinterp->Ttmps_floor)
-#define PL_tmps_ix (PL_curinterp->Ttmps_ix)
-#define PL_tmps_max (PL_curinterp->Ttmps_max)
-#define PL_tmps_stack (PL_curinterp->Ttmps_stack)
-#define PL_top_env (PL_curinterp->Ttop_env)
-#define PL_toptarget (PL_curinterp->Ttoptarget)
-
-#endif /* !USE_THREADS */
-
-/* These are always per-interpreter if there is more than one */
-
-#define PL_Argv (PL_curinterp->IArgv)
-#define PL_Cmd (PL_curinterp->ICmd)
-#define PL_DBcv (PL_curinterp->IDBcv)
-#define PL_DBgv (PL_curinterp->IDBgv)
-#define PL_DBline (PL_curinterp->IDBline)
-#define PL_DBsignal (PL_curinterp->IDBsignal)
-#define PL_DBsingle (PL_curinterp->IDBsingle)
-#define PL_DBsub (PL_curinterp->IDBsub)
-#define PL_DBtrace (PL_curinterp->IDBtrace)
-#define PL_ampergv (PL_curinterp->Iampergv)
-#define PL_archpat_auto (PL_curinterp->Iarchpat_auto)
-#define PL_argvgv (PL_curinterp->Iargvgv)
-#define PL_argvoutgv (PL_curinterp->Iargvoutgv)
-#define PL_basetime (PL_curinterp->Ibasetime)
-#define PL_beginav (PL_curinterp->Ibeginav)
-#define PL_bytecode_iv_overflows (PL_curinterp->Ibytecode_iv_overflows)
-#define PL_bytecode_obj_list (PL_curinterp->Ibytecode_obj_list)
-#define PL_bytecode_obj_list_fill (PL_curinterp->Ibytecode_obj_list_fill)
-#define PL_bytecode_pv (PL_curinterp->Ibytecode_pv)
-#define PL_bytecode_sv (PL_curinterp->Ibytecode_sv)
-#define PL_cddir (PL_curinterp->Icddir)
-#define PL_compcv (PL_curinterp->Icompcv)
-#define PL_compiling (PL_curinterp->Icompiling)
-#define PL_comppad (PL_curinterp->Icomppad)
-#define PL_comppad_name (PL_curinterp->Icomppad_name)
-#define PL_comppad_name_fill (PL_curinterp->Icomppad_name_fill)
-#define PL_comppad_name_floor (PL_curinterp->Icomppad_name_floor)
-#define PL_copline (PL_curinterp->Icopline)
-#define PL_curcopdb (PL_curinterp->Icurcopdb)
-#define PL_curstname (PL_curinterp->Icurstname)
-#define PL_dbargs (PL_curinterp->Idbargs)
-#define PL_debdelim (PL_curinterp->Idebdelim)
-#define PL_debname (PL_curinterp->Idebname)
-#define PL_debstash (PL_curinterp->Idebstash)
-#define PL_defgv (PL_curinterp->Idefgv)
-#define PL_diehook (PL_curinterp->Idiehook)
-#define PL_dlevel (PL_curinterp->Idlevel)
-#define PL_dlmax (PL_curinterp->Idlmax)
-#define PL_doextract (PL_curinterp->Idoextract)
-#define PL_doswitches (PL_curinterp->Idoswitches)
-#define PL_dowarn (PL_curinterp->Idowarn)
-#define PL_dumplvl (PL_curinterp->Idumplvl)
-#define PL_e_script (PL_curinterp->Ie_script)
-#define PL_endav (PL_curinterp->Iendav)
-#define PL_envgv (PL_curinterp->Ienvgv)
-#define PL_errgv (PL_curinterp->Ierrgv)
-#define PL_eval_root (PL_curinterp->Ieval_root)
-#define PL_eval_start (PL_curinterp->Ieval_start)
-#define PL_exitlist (PL_curinterp->Iexitlist)
-#define PL_exitlistlen (PL_curinterp->Iexitlistlen)
-#define PL_fdpid (PL_curinterp->Ifdpid)
-#define PL_filemode (PL_curinterp->Ifilemode)
-#define PL_forkprocess (PL_curinterp->Iforkprocess)
-#define PL_formfeed (PL_curinterp->Iformfeed)
-#define PL_generation (PL_curinterp->Igeneration)
-#define PL_gensym (PL_curinterp->Igensym)
-#define PL_globalstash (PL_curinterp->Iglobalstash)
-#define PL_hintgv (PL_curinterp->Ihintgv)
-#define PL_in_clean_all (PL_curinterp->Iin_clean_all)
-#define PL_in_clean_objs (PL_curinterp->Iin_clean_objs)
-#define PL_incgv (PL_curinterp->Iincgv)
-#define PL_initav (PL_curinterp->Iinitav)
-#define PL_inplace (PL_curinterp->Iinplace)
-#define PL_last_proto (PL_curinterp->Ilast_proto)
-#define PL_lastfd (PL_curinterp->Ilastfd)
-#define PL_lastsize (PL_curinterp->Ilastsize)
-#define PL_lastspbase (PL_curinterp->Ilastspbase)
-#define PL_laststatval (PL_curinterp->Ilaststatval)
-#define PL_laststype (PL_curinterp->Ilaststype)
-#define PL_leftgv (PL_curinterp->Ileftgv)
-#define PL_lineary (PL_curinterp->Ilineary)
-#define PL_linestart (PL_curinterp->Ilinestart)
-#define PL_localpatches (PL_curinterp->Ilocalpatches)
-#define PL_main_cv (PL_curinterp->Imain_cv)
-#define PL_main_root (PL_curinterp->Imain_root)
-#define PL_main_start (PL_curinterp->Imain_start)
-#define PL_maxsysfd (PL_curinterp->Imaxsysfd)
-#define PL_mess_sv (PL_curinterp->Imess_sv)
-#define PL_minus_F (PL_curinterp->Iminus_F)
-#define PL_minus_a (PL_curinterp->Iminus_a)
-#define PL_minus_c (PL_curinterp->Iminus_c)
-#define PL_minus_l (PL_curinterp->Iminus_l)
-#define PL_minus_n (PL_curinterp->Iminus_n)
-#define PL_minus_p (PL_curinterp->Iminus_p)
-#define PL_modglobal (PL_curinterp->Imodglobal)
-#define PL_multiline (PL_curinterp->Imultiline)
-#define PL_mystrk (PL_curinterp->Imystrk)
-#define PL_ofmt (PL_curinterp->Iofmt)
-#define PL_oldlastpm (PL_curinterp->Ioldlastpm)
-#define PL_oldname (PL_curinterp->Ioldname)
-#define PL_op_mask (PL_curinterp->Iop_mask)
-#define PL_origargc (PL_curinterp->Iorigargc)
-#define PL_origargv (PL_curinterp->Iorigargv)
-#define PL_origfilename (PL_curinterp->Iorigfilename)
-#define PL_ors (PL_curinterp->Iors)
-#define PL_orslen (PL_curinterp->Iorslen)
-#define PL_parsehook (PL_curinterp->Iparsehook)
-#define PL_patchlevel (PL_curinterp->Ipatchlevel)
-#define PL_pending_ident (PL_curinterp->Ipending_ident)
-#define PL_perl_destruct_level (PL_curinterp->Iperl_destruct_level)
-#define PL_perldb (PL_curinterp->Iperldb)
-#define PL_preambleav (PL_curinterp->Ipreambleav)
-#define PL_preambled (PL_curinterp->Ipreambled)
-#define PL_preprocess (PL_curinterp->Ipreprocess)
-#define PL_profiledata (PL_curinterp->Iprofiledata)
-#define PL_replgv (PL_curinterp->Ireplgv)
-#define PL_rightgv (PL_curinterp->Irightgv)
-#define PL_rsfp (PL_curinterp->Irsfp)
-#define PL_rsfp_filters (PL_curinterp->Irsfp_filters)
-#define PL_sawampersand (PL_curinterp->Isawampersand)
-#define PL_sawstudy (PL_curinterp->Isawstudy)
-#define PL_sawvec (PL_curinterp->Isawvec)
-#define PL_siggv (PL_curinterp->Isiggv)
-#define PL_splitstr (PL_curinterp->Isplitstr)
-#define PL_statusvalue (PL_curinterp->Istatusvalue)
-#define PL_statusvalue_vms (PL_curinterp->Istatusvalue_vms)
-#define PL_stdingv (PL_curinterp->Istdingv)
-#define PL_strchop (PL_curinterp->Istrchop)
-#define PL_strtab (PL_curinterp->Istrtab)
-#define PL_strtab_mutex (PL_curinterp->Istrtab_mutex)
-#define PL_sub_generation (PL_curinterp->Isub_generation)
-#define PL_sublex_info (PL_curinterp->Isublex_info)
-#define PL_sv_arenaroot (PL_curinterp->Isv_arenaroot)
-#define PL_sv_count (PL_curinterp->Isv_count)
-#define PL_sv_objcount (PL_curinterp->Isv_objcount)
-#define PL_sv_root (PL_curinterp->Isv_root)
-#define PL_sys_intern (PL_curinterp->Isys_intern)
-#define PL_tainting (PL_curinterp->Itainting)
-#define PL_threadnum (PL_curinterp->Ithreadnum)
-#define PL_thrsv (PL_curinterp->Ithrsv)
-#define PL_unsafe (PL_curinterp->Iunsafe)
-#define PL_warnhook (PL_curinterp->Iwarnhook)
+# if defined(USE_THREADS)
+/* case 5 above */
+
+#define PL_Argv (PERL_GET_INTERP->IArgv)
+#define PL_Cmd (PERL_GET_INTERP->ICmd)
+#define PL_DBcv (PERL_GET_INTERP->IDBcv)
+#define PL_DBgv (PERL_GET_INTERP->IDBgv)
+#define PL_DBline (PERL_GET_INTERP->IDBline)
+#define PL_DBsignal (PERL_GET_INTERP->IDBsignal)
+#define PL_DBsingle (PERL_GET_INTERP->IDBsingle)
+#define PL_DBsub (PERL_GET_INTERP->IDBsub)
+#define PL_DBtrace (PERL_GET_INTERP->IDBtrace)
+#define PL_Dir (PERL_GET_INTERP->IDir)
+#define PL_Env (PERL_GET_INTERP->IEnv)
+#define PL_LIO (PERL_GET_INTERP->ILIO)
+#define PL_Mem (PERL_GET_INTERP->IMem)
+#define PL_MemParse (PERL_GET_INTERP->IMemParse)
+#define PL_MemShared (PERL_GET_INTERP->IMemShared)
+#define PL_Proc (PERL_GET_INTERP->IProc)
+#define PL_Sock (PERL_GET_INTERP->ISock)
+#define PL_StdIO (PERL_GET_INTERP->IStdIO)
+#define PL_amagic_generation (PERL_GET_INTERP->Iamagic_generation)
+#define PL_an (PERL_GET_INTERP->Ian)
+#define PL_argvgv (PERL_GET_INTERP->Iargvgv)
+#define PL_argvout_stack (PERL_GET_INTERP->Iargvout_stack)
+#define PL_argvoutgv (PERL_GET_INTERP->Iargvoutgv)
+#define PL_basetime (PERL_GET_INTERP->Ibasetime)
+#define PL_beginav (PERL_GET_INTERP->Ibeginav)
+#define PL_bitcount (PERL_GET_INTERP->Ibitcount)
+#define PL_bufend (PERL_GET_INTERP->Ibufend)
+#define PL_bufptr (PERL_GET_INTERP->Ibufptr)
+#define PL_checkav (PERL_GET_INTERP->Icheckav)
+#define PL_collation_ix (PERL_GET_INTERP->Icollation_ix)
+#define PL_collation_name (PERL_GET_INTERP->Icollation_name)
+#define PL_collation_standard (PERL_GET_INTERP->Icollation_standard)
+#define PL_collxfrm_base (PERL_GET_INTERP->Icollxfrm_base)
+#define PL_collxfrm_mult (PERL_GET_INTERP->Icollxfrm_mult)
+#define PL_compcv (PERL_GET_INTERP->Icompcv)
+#define PL_compiling (PERL_GET_INTERP->Icompiling)
+#define PL_comppad (PERL_GET_INTERP->Icomppad)
+#define PL_comppad_name (PERL_GET_INTERP->Icomppad_name)
+#define PL_comppad_name_fill (PERL_GET_INTERP->Icomppad_name_fill)
+#define PL_comppad_name_floor (PERL_GET_INTERP->Icomppad_name_floor)
+#define PL_cop_seqmax (PERL_GET_INTERP->Icop_seqmax)
+#define PL_copline (PERL_GET_INTERP->Icopline)
+#define PL_cred_mutex (PERL_GET_INTERP->Icred_mutex)
+#define PL_cryptseen (PERL_GET_INTERP->Icryptseen)
+#define PL_cshlen (PERL_GET_INTERP->Icshlen)
+#define PL_cshname (PERL_GET_INTERP->Icshname)
+#define PL_curcopdb (PERL_GET_INTERP->Icurcopdb)
+#define PL_curstname (PERL_GET_INTERP->Icurstname)
+#define PL_curthr (PERL_GET_INTERP->Icurthr)
+#define PL_dbargs (PERL_GET_INTERP->Idbargs)
+#define PL_debstash (PERL_GET_INTERP->Idebstash)
+#define PL_debug (PERL_GET_INTERP->Idebug)
+#define PL_defgv (PERL_GET_INTERP->Idefgv)
+#define PL_diehook (PERL_GET_INTERP->Idiehook)
+#define PL_doextract (PERL_GET_INTERP->Idoextract)
+#define PL_doswitches (PERL_GET_INTERP->Idoswitches)
+#define PL_dowarn (PERL_GET_INTERP->Idowarn)
+#define PL_e_script (PERL_GET_INTERP->Ie_script)
+#define PL_egid (PERL_GET_INTERP->Iegid)
+#define PL_endav (PERL_GET_INTERP->Iendav)
+#define PL_envgv (PERL_GET_INTERP->Ienvgv)
+#define PL_errgv (PERL_GET_INTERP->Ierrgv)
+#define PL_error_count (PERL_GET_INTERP->Ierror_count)
+#define PL_euid (PERL_GET_INTERP->Ieuid)
+#define PL_eval_cond (PERL_GET_INTERP->Ieval_cond)
+#define PL_eval_mutex (PERL_GET_INTERP->Ieval_mutex)
+#define PL_eval_owner (PERL_GET_INTERP->Ieval_owner)
+#define PL_eval_root (PERL_GET_INTERP->Ieval_root)
+#define PL_eval_start (PERL_GET_INTERP->Ieval_start)
+#define PL_evalseq (PERL_GET_INTERP->Ievalseq)
+#define PL_exit_flags (PERL_GET_INTERP->Iexit_flags)
+#define PL_exitlist (PERL_GET_INTERP->Iexitlist)
+#define PL_exitlistlen (PERL_GET_INTERP->Iexitlistlen)
+#define PL_expect (PERL_GET_INTERP->Iexpect)
+#define PL_fdpid (PERL_GET_INTERP->Ifdpid)
+#define PL_filemode (PERL_GET_INTERP->Ifilemode)
+#define PL_forkprocess (PERL_GET_INTERP->Iforkprocess)
+#define PL_formfeed (PERL_GET_INTERP->Iformfeed)
+#define PL_generation (PERL_GET_INTERP->Igeneration)
+#define PL_gensym (PERL_GET_INTERP->Igensym)
+#define PL_gid (PERL_GET_INTERP->Igid)
+#define PL_glob_index (PERL_GET_INTERP->Iglob_index)
+#define PL_globalstash (PERL_GET_INTERP->Iglobalstash)
+#define PL_he_root (PERL_GET_INTERP->Ihe_root)
+#define PL_hintgv (PERL_GET_INTERP->Ihintgv)
+#define PL_hints (PERL_GET_INTERP->Ihints)
+#define PL_in_clean_all (PERL_GET_INTERP->Iin_clean_all)
+#define PL_in_clean_objs (PERL_GET_INTERP->Iin_clean_objs)
+#define PL_in_my (PERL_GET_INTERP->Iin_my)
+#define PL_in_my_stash (PERL_GET_INTERP->Iin_my_stash)
+#define PL_incgv (PERL_GET_INTERP->Iincgv)
+#define PL_initav (PERL_GET_INTERP->Iinitav)
+#define PL_inplace (PERL_GET_INTERP->Iinplace)
+#define PL_last_lop (PERL_GET_INTERP->Ilast_lop)
+#define PL_last_lop_op (PERL_GET_INTERP->Ilast_lop_op)
+#define PL_last_swash_hv (PERL_GET_INTERP->Ilast_swash_hv)
+#define PL_last_swash_key (PERL_GET_INTERP->Ilast_swash_key)
+#define PL_last_swash_klen (PERL_GET_INTERP->Ilast_swash_klen)
+#define PL_last_swash_slen (PERL_GET_INTERP->Ilast_swash_slen)
+#define PL_last_swash_tmps (PERL_GET_INTERP->Ilast_swash_tmps)
+#define PL_last_uni (PERL_GET_INTERP->Ilast_uni)
+#define PL_lastfd (PERL_GET_INTERP->Ilastfd)
+#define PL_laststatval (PERL_GET_INTERP->Ilaststatval)
+#define PL_laststype (PERL_GET_INTERP->Ilaststype)
+#define PL_lex_brackets (PERL_GET_INTERP->Ilex_brackets)
+#define PL_lex_brackstack (PERL_GET_INTERP->Ilex_brackstack)
+#define PL_lex_casemods (PERL_GET_INTERP->Ilex_casemods)
+#define PL_lex_casestack (PERL_GET_INTERP->Ilex_casestack)
+#define PL_lex_defer (PERL_GET_INTERP->Ilex_defer)
+#define PL_lex_dojoin (PERL_GET_INTERP->Ilex_dojoin)
+#define PL_lex_expect (PERL_GET_INTERP->Ilex_expect)
+#define PL_lex_formbrack (PERL_GET_INTERP->Ilex_formbrack)
+#define PL_lex_inpat (PERL_GET_INTERP->Ilex_inpat)
+#define PL_lex_inwhat (PERL_GET_INTERP->Ilex_inwhat)
+#define PL_lex_op (PERL_GET_INTERP->Ilex_op)
+#define PL_lex_repl (PERL_GET_INTERP->Ilex_repl)
+#define PL_lex_starts (PERL_GET_INTERP->Ilex_starts)
+#define PL_lex_state (PERL_GET_INTERP->Ilex_state)
+#define PL_lex_stuff (PERL_GET_INTERP->Ilex_stuff)
+#define PL_lineary (PERL_GET_INTERP->Ilineary)
+#define PL_linestart (PERL_GET_INTERP->Ilinestart)
+#define PL_linestr (PERL_GET_INTERP->Ilinestr)
+#define PL_localpatches (PERL_GET_INTERP->Ilocalpatches)
+#define PL_main_cv (PERL_GET_INTERP->Imain_cv)
+#define PL_main_root (PERL_GET_INTERP->Imain_root)
+#define PL_main_start (PERL_GET_INTERP->Imain_start)
+#define PL_max_intro_pending (PERL_GET_INTERP->Imax_intro_pending)
+#define PL_maxo (PERL_GET_INTERP->Imaxo)
+#define PL_maxsysfd (PERL_GET_INTERP->Imaxsysfd)
+#define PL_mess_sv (PERL_GET_INTERP->Imess_sv)
+#define PL_min_intro_pending (PERL_GET_INTERP->Imin_intro_pending)
+#define PL_minus_F (PERL_GET_INTERP->Iminus_F)
+#define PL_minus_a (PERL_GET_INTERP->Iminus_a)
+#define PL_minus_c (PERL_GET_INTERP->Iminus_c)
+#define PL_minus_l (PERL_GET_INTERP->Iminus_l)
+#define PL_minus_n (PERL_GET_INTERP->Iminus_n)
+#define PL_minus_p (PERL_GET_INTERP->Iminus_p)
+#define PL_modglobal (PERL_GET_INTERP->Imodglobal)
+#define PL_multi_close (PERL_GET_INTERP->Imulti_close)
+#define PL_multi_end (PERL_GET_INTERP->Imulti_end)
+#define PL_multi_open (PERL_GET_INTERP->Imulti_open)
+#define PL_multi_start (PERL_GET_INTERP->Imulti_start)
+#define PL_multiline (PERL_GET_INTERP->Imultiline)
+#define PL_nexttoke (PERL_GET_INTERP->Inexttoke)
+#define PL_nexttype (PERL_GET_INTERP->Inexttype)
+#define PL_nextval (PERL_GET_INTERP->Inextval)
+#define PL_nice_chunk (PERL_GET_INTERP->Inice_chunk)
+#define PL_nice_chunk_size (PERL_GET_INTERP->Inice_chunk_size)
+#define PL_nomemok (PERL_GET_INTERP->Inomemok)
+#define PL_nthreads (PERL_GET_INTERP->Inthreads)
+#define PL_nthreads_cond (PERL_GET_INTERP->Inthreads_cond)
+#define PL_numeric_local (PERL_GET_INTERP->Inumeric_local)
+#define PL_numeric_name (PERL_GET_INTERP->Inumeric_name)
+#define PL_numeric_radix (PERL_GET_INTERP->Inumeric_radix)
+#define PL_numeric_standard (PERL_GET_INTERP->Inumeric_standard)
+#define PL_ofmt (PERL_GET_INTERP->Iofmt)
+#define PL_oldbufptr (PERL_GET_INTERP->Ioldbufptr)
+#define PL_oldname (PERL_GET_INTERP->Ioldname)
+#define PL_oldoldbufptr (PERL_GET_INTERP->Ioldoldbufptr)
+#define PL_op_mask (PERL_GET_INTERP->Iop_mask)
+#define PL_op_seqmax (PERL_GET_INTERP->Iop_seqmax)
+#define PL_origalen (PERL_GET_INTERP->Iorigalen)
+#define PL_origargc (PERL_GET_INTERP->Iorigargc)
+#define PL_origargv (PERL_GET_INTERP->Iorigargv)
+#define PL_origenviron (PERL_GET_INTERP->Iorigenviron)
+#define PL_origfilename (PERL_GET_INTERP->Iorigfilename)
+#define PL_ors (PERL_GET_INTERP->Iors)
+#define PL_orslen (PERL_GET_INTERP->Iorslen)
+#define PL_osname (PERL_GET_INTERP->Iosname)
+#define PL_pad_reset_pending (PERL_GET_INTERP->Ipad_reset_pending)
+#define PL_padix (PERL_GET_INTERP->Ipadix)
+#define PL_padix_floor (PERL_GET_INTERP->Ipadix_floor)
+#define PL_patchlevel (PERL_GET_INTERP->Ipatchlevel)
+#define PL_pending_ident (PERL_GET_INTERP->Ipending_ident)
+#define PL_perl_destruct_level (PERL_GET_INTERP->Iperl_destruct_level)
+#define PL_perldb (PERL_GET_INTERP->Iperldb)
+#define PL_pidstatus (PERL_GET_INTERP->Ipidstatus)
+#define PL_preambleav (PERL_GET_INTERP->Ipreambleav)
+#define PL_preambled (PERL_GET_INTERP->Ipreambled)
+#define PL_preprocess (PERL_GET_INTERP->Ipreprocess)
+#define PL_profiledata (PERL_GET_INTERP->Iprofiledata)
+#define PL_psig_name (PERL_GET_INTERP->Ipsig_name)
+#define PL_psig_ptr (PERL_GET_INTERP->Ipsig_ptr)
+#define PL_ptr_table (PERL_GET_INTERP->Iptr_table)
+#define PL_replgv (PERL_GET_INTERP->Ireplgv)
+#define PL_rsfp (PERL_GET_INTERP->Irsfp)
+#define PL_rsfp_filters (PERL_GET_INTERP->Irsfp_filters)
+#define PL_runops (PERL_GET_INTERP->Irunops)
+#define PL_sawampersand (PERL_GET_INTERP->Isawampersand)
+#define PL_sh_path (PERL_GET_INTERP->Ish_path)
+#define PL_sighandlerp (PERL_GET_INTERP->Isighandlerp)
+#define PL_splitstr (PERL_GET_INTERP->Isplitstr)
+#define PL_srand_called (PERL_GET_INTERP->Isrand_called)
+#define PL_statusvalue (PERL_GET_INTERP->Istatusvalue)
+#define PL_statusvalue_vms (PERL_GET_INTERP->Istatusvalue_vms)
+#define PL_stderrgv (PERL_GET_INTERP->Istderrgv)
+#define PL_stdingv (PERL_GET_INTERP->Istdingv)
+#define PL_strtab (PERL_GET_INTERP->Istrtab)
+#define PL_strtab_mutex (PERL_GET_INTERP->Istrtab_mutex)
+#define PL_sub_generation (PERL_GET_INTERP->Isub_generation)
+#define PL_sublex_info (PERL_GET_INTERP->Isublex_info)
+#define PL_subline (PERL_GET_INTERP->Isubline)
+#define PL_subname (PERL_GET_INTERP->Isubname)
+#define PL_sv_arenaroot (PERL_GET_INTERP->Isv_arenaroot)
+#define PL_sv_count (PERL_GET_INTERP->Isv_count)
+#define PL_sv_mutex (PERL_GET_INTERP->Isv_mutex)
+#define PL_sv_no (PERL_GET_INTERP->Isv_no)
+#define PL_sv_objcount (PERL_GET_INTERP->Isv_objcount)
+#define PL_sv_root (PERL_GET_INTERP->Isv_root)
+#define PL_sv_undef (PERL_GET_INTERP->Isv_undef)
+#define PL_sv_yes (PERL_GET_INTERP->Isv_yes)
+#define PL_svref_mutex (PERL_GET_INTERP->Isvref_mutex)
+#define PL_sys_intern (PERL_GET_INTERP->Isys_intern)
+#define PL_tainting (PERL_GET_INTERP->Itainting)
+#define PL_threadnum (PERL_GET_INTERP->Ithreadnum)
+#define PL_threads_mutex (PERL_GET_INTERP->Ithreads_mutex)
+#define PL_threadsv_names (PERL_GET_INTERP->Ithreadsv_names)
+#define PL_thrsv (PERL_GET_INTERP->Ithrsv)
+#define PL_tokenbuf (PERL_GET_INTERP->Itokenbuf)
+#define PL_uid (PERL_GET_INTERP->Iuid)
+#define PL_unsafe (PERL_GET_INTERP->Iunsafe)
+#define PL_utf8_alnum (PERL_GET_INTERP->Iutf8_alnum)
+#define PL_utf8_alnumc (PERL_GET_INTERP->Iutf8_alnumc)
+#define PL_utf8_alpha (PERL_GET_INTERP->Iutf8_alpha)
+#define PL_utf8_ascii (PERL_GET_INTERP->Iutf8_ascii)
+#define PL_utf8_cntrl (PERL_GET_INTERP->Iutf8_cntrl)
+#define PL_utf8_digit (PERL_GET_INTERP->Iutf8_digit)
+#define PL_utf8_graph (PERL_GET_INTERP->Iutf8_graph)
+#define PL_utf8_lower (PERL_GET_INTERP->Iutf8_lower)
+#define PL_utf8_mark (PERL_GET_INTERP->Iutf8_mark)
+#define PL_utf8_print (PERL_GET_INTERP->Iutf8_print)
+#define PL_utf8_punct (PERL_GET_INTERP->Iutf8_punct)
+#define PL_utf8_space (PERL_GET_INTERP->Iutf8_space)
+#define PL_utf8_tolower (PERL_GET_INTERP->Iutf8_tolower)
+#define PL_utf8_totitle (PERL_GET_INTERP->Iutf8_totitle)
+#define PL_utf8_toupper (PERL_GET_INTERP->Iutf8_toupper)
+#define PL_utf8_upper (PERL_GET_INTERP->Iutf8_upper)
+#define PL_utf8_xdigit (PERL_GET_INTERP->Iutf8_xdigit)
+#define PL_uudmap (PERL_GET_INTERP->Iuudmap)
+#define PL_warnhook (PERL_GET_INTERP->Iwarnhook)
+#define PL_widesyscalls (PERL_GET_INTERP->Iwidesyscalls)
+#define PL_xiv_arenaroot (PERL_GET_INTERP->Ixiv_arenaroot)
+#define PL_xiv_root (PERL_GET_INTERP->Ixiv_root)
+#define PL_xnv_root (PERL_GET_INTERP->Ixnv_root)
+#define PL_xpv_root (PERL_GET_INTERP->Ixpv_root)
+#define PL_xpvav_root (PERL_GET_INTERP->Ixpvav_root)
+#define PL_xpvbm_root (PERL_GET_INTERP->Ixpvbm_root)
+#define PL_xpvcv_root (PERL_GET_INTERP->Ixpvcv_root)
+#define PL_xpvhv_root (PERL_GET_INTERP->Ixpvhv_root)
+#define PL_xpviv_root (PERL_GET_INTERP->Ixpviv_root)
+#define PL_xpvlv_root (PERL_GET_INTERP->Ixpvlv_root)
+#define PL_xpvmg_root (PERL_GET_INTERP->Ixpvmg_root)
+#define PL_xpvnv_root (PERL_GET_INTERP->Ixpvnv_root)
+#define PL_xrv_root (PERL_GET_INTERP->Ixrv_root)
+#define PL_yychar (PERL_GET_INTERP->Iyychar)
+#define PL_yydebug (PERL_GET_INTERP->Iyydebug)
+#define PL_yyerrflag (PERL_GET_INTERP->Iyyerrflag)
+#define PL_yylval (PERL_GET_INTERP->Iyylval)
+#define PL_yynerrs (PERL_GET_INTERP->Iyynerrs)
+#define PL_yyval (PERL_GET_INTERP->Iyyval)
+
+# else /* !USE_THREADS */
+/* cases 2 and 3 above */
+
+#define PL_Argv (vTHX->IArgv)
+#define PL_Cmd (vTHX->ICmd)
+#define PL_DBcv (vTHX->IDBcv)
+#define PL_DBgv (vTHX->IDBgv)
+#define PL_DBline (vTHX->IDBline)
+#define PL_DBsignal (vTHX->IDBsignal)
+#define PL_DBsingle (vTHX->IDBsingle)
+#define PL_DBsub (vTHX->IDBsub)
+#define PL_DBtrace (vTHX->IDBtrace)
+#define PL_Dir (vTHX->IDir)
+#define PL_Env (vTHX->IEnv)
+#define PL_LIO (vTHX->ILIO)
+#define PL_Mem (vTHX->IMem)
+#define PL_MemParse (vTHX->IMemParse)
+#define PL_MemShared (vTHX->IMemShared)
+#define PL_Proc (vTHX->IProc)
+#define PL_Sock (vTHX->ISock)
+#define PL_StdIO (vTHX->IStdIO)
+#define PL_amagic_generation (vTHX->Iamagic_generation)
+#define PL_an (vTHX->Ian)
+#define PL_argvgv (vTHX->Iargvgv)
+#define PL_argvout_stack (vTHX->Iargvout_stack)
+#define PL_argvoutgv (vTHX->Iargvoutgv)
+#define PL_basetime (vTHX->Ibasetime)
+#define PL_beginav (vTHX->Ibeginav)
+#define PL_bitcount (vTHX->Ibitcount)
+#define PL_bufend (vTHX->Ibufend)
+#define PL_bufptr (vTHX->Ibufptr)
+#define PL_checkav (vTHX->Icheckav)
+#define PL_collation_ix (vTHX->Icollation_ix)
+#define PL_collation_name (vTHX->Icollation_name)
+#define PL_collation_standard (vTHX->Icollation_standard)
+#define PL_collxfrm_base (vTHX->Icollxfrm_base)
+#define PL_collxfrm_mult (vTHX->Icollxfrm_mult)
+#define PL_compcv (vTHX->Icompcv)
+#define PL_compiling (vTHX->Icompiling)
+#define PL_comppad (vTHX->Icomppad)
+#define PL_comppad_name (vTHX->Icomppad_name)
+#define PL_comppad_name_fill (vTHX->Icomppad_name_fill)
+#define PL_comppad_name_floor (vTHX->Icomppad_name_floor)
+#define PL_cop_seqmax (vTHX->Icop_seqmax)
+#define PL_copline (vTHX->Icopline)
+#define PL_cred_mutex (vTHX->Icred_mutex)
+#define PL_cryptseen (vTHX->Icryptseen)
+#define PL_cshlen (vTHX->Icshlen)
+#define PL_cshname (vTHX->Icshname)
+#define PL_curcopdb (vTHX->Icurcopdb)
+#define PL_curstname (vTHX->Icurstname)
+#define PL_curthr (vTHX->Icurthr)
+#define PL_dbargs (vTHX->Idbargs)
+#define PL_debstash (vTHX->Idebstash)
+#define PL_debug (vTHX->Idebug)
+#define PL_defgv (vTHX->Idefgv)
+#define PL_diehook (vTHX->Idiehook)
+#define PL_doextract (vTHX->Idoextract)
+#define PL_doswitches (vTHX->Idoswitches)
+#define PL_dowarn (vTHX->Idowarn)
+#define PL_e_script (vTHX->Ie_script)
+#define PL_egid (vTHX->Iegid)
+#define PL_endav (vTHX->Iendav)
+#define PL_envgv (vTHX->Ienvgv)
+#define PL_errgv (vTHX->Ierrgv)
+#define PL_error_count (vTHX->Ierror_count)
+#define PL_euid (vTHX->Ieuid)
+#define PL_eval_cond (vTHX->Ieval_cond)
+#define PL_eval_mutex (vTHX->Ieval_mutex)
+#define PL_eval_owner (vTHX->Ieval_owner)
+#define PL_eval_root (vTHX->Ieval_root)
+#define PL_eval_start (vTHX->Ieval_start)
+#define PL_evalseq (vTHX->Ievalseq)
+#define PL_exit_flags (vTHX->Iexit_flags)
+#define PL_exitlist (vTHX->Iexitlist)
+#define PL_exitlistlen (vTHX->Iexitlistlen)
+#define PL_expect (vTHX->Iexpect)
+#define PL_fdpid (vTHX->Ifdpid)
+#define PL_filemode (vTHX->Ifilemode)
+#define PL_forkprocess (vTHX->Iforkprocess)
+#define PL_formfeed (vTHX->Iformfeed)
+#define PL_generation (vTHX->Igeneration)
+#define PL_gensym (vTHX->Igensym)
+#define PL_gid (vTHX->Igid)
+#define PL_glob_index (vTHX->Iglob_index)
+#define PL_globalstash (vTHX->Iglobalstash)
+#define PL_he_root (vTHX->Ihe_root)
+#define PL_hintgv (vTHX->Ihintgv)
+#define PL_hints (vTHX->Ihints)
+#define PL_in_clean_all (vTHX->Iin_clean_all)
+#define PL_in_clean_objs (vTHX->Iin_clean_objs)
+#define PL_in_my (vTHX->Iin_my)
+#define PL_in_my_stash (vTHX->Iin_my_stash)
+#define PL_incgv (vTHX->Iincgv)
+#define PL_initav (vTHX->Iinitav)
+#define PL_inplace (vTHX->Iinplace)
+#define PL_last_lop (vTHX->Ilast_lop)
+#define PL_last_lop_op (vTHX->Ilast_lop_op)
+#define PL_last_swash_hv (vTHX->Ilast_swash_hv)
+#define PL_last_swash_key (vTHX->Ilast_swash_key)
+#define PL_last_swash_klen (vTHX->Ilast_swash_klen)
+#define PL_last_swash_slen (vTHX->Ilast_swash_slen)
+#define PL_last_swash_tmps (vTHX->Ilast_swash_tmps)
+#define PL_last_uni (vTHX->Ilast_uni)
+#define PL_lastfd (vTHX->Ilastfd)
+#define PL_laststatval (vTHX->Ilaststatval)
+#define PL_laststype (vTHX->Ilaststype)
+#define PL_lex_brackets (vTHX->Ilex_brackets)
+#define PL_lex_brackstack (vTHX->Ilex_brackstack)
+#define PL_lex_casemods (vTHX->Ilex_casemods)
+#define PL_lex_casestack (vTHX->Ilex_casestack)
+#define PL_lex_defer (vTHX->Ilex_defer)
+#define PL_lex_dojoin (vTHX->Ilex_dojoin)
+#define PL_lex_expect (vTHX->Ilex_expect)
+#define PL_lex_formbrack (vTHX->Ilex_formbrack)
+#define PL_lex_inpat (vTHX->Ilex_inpat)
+#define PL_lex_inwhat (vTHX->Ilex_inwhat)
+#define PL_lex_op (vTHX->Ilex_op)
+#define PL_lex_repl (vTHX->Ilex_repl)
+#define PL_lex_starts (vTHX->Ilex_starts)
+#define PL_lex_state (vTHX->Ilex_state)
+#define PL_lex_stuff (vTHX->Ilex_stuff)
+#define PL_lineary (vTHX->Ilineary)
+#define PL_linestart (vTHX->Ilinestart)
+#define PL_linestr (vTHX->Ilinestr)
+#define PL_localpatches (vTHX->Ilocalpatches)
+#define PL_main_cv (vTHX->Imain_cv)
+#define PL_main_root (vTHX->Imain_root)
+#define PL_main_start (vTHX->Imain_start)
+#define PL_max_intro_pending (vTHX->Imax_intro_pending)
+#define PL_maxo (vTHX->Imaxo)
+#define PL_maxsysfd (vTHX->Imaxsysfd)
+#define PL_mess_sv (vTHX->Imess_sv)
+#define PL_min_intro_pending (vTHX->Imin_intro_pending)
+#define PL_minus_F (vTHX->Iminus_F)
+#define PL_minus_a (vTHX->Iminus_a)
+#define PL_minus_c (vTHX->Iminus_c)
+#define PL_minus_l (vTHX->Iminus_l)
+#define PL_minus_n (vTHX->Iminus_n)
+#define PL_minus_p (vTHX->Iminus_p)
+#define PL_modglobal (vTHX->Imodglobal)
+#define PL_multi_close (vTHX->Imulti_close)
+#define PL_multi_end (vTHX->Imulti_end)
+#define PL_multi_open (vTHX->Imulti_open)
+#define PL_multi_start (vTHX->Imulti_start)
+#define PL_multiline (vTHX->Imultiline)
+#define PL_nexttoke (vTHX->Inexttoke)
+#define PL_nexttype (vTHX->Inexttype)
+#define PL_nextval (vTHX->Inextval)
+#define PL_nice_chunk (vTHX->Inice_chunk)
+#define PL_nice_chunk_size (vTHX->Inice_chunk_size)
+#define PL_nomemok (vTHX->Inomemok)
+#define PL_nthreads (vTHX->Inthreads)
+#define PL_nthreads_cond (vTHX->Inthreads_cond)
+#define PL_numeric_local (vTHX->Inumeric_local)
+#define PL_numeric_name (vTHX->Inumeric_name)
+#define PL_numeric_radix (vTHX->Inumeric_radix)
+#define PL_numeric_standard (vTHX->Inumeric_standard)
+#define PL_ofmt (vTHX->Iofmt)
+#define PL_oldbufptr (vTHX->Ioldbufptr)
+#define PL_oldname (vTHX->Ioldname)
+#define PL_oldoldbufptr (vTHX->Ioldoldbufptr)
+#define PL_op_mask (vTHX->Iop_mask)
+#define PL_op_seqmax (vTHX->Iop_seqmax)
+#define PL_origalen (vTHX->Iorigalen)
+#define PL_origargc (vTHX->Iorigargc)
+#define PL_origargv (vTHX->Iorigargv)
+#define PL_origenviron (vTHX->Iorigenviron)
+#define PL_origfilename (vTHX->Iorigfilename)
+#define PL_ors (vTHX->Iors)
+#define PL_orslen (vTHX->Iorslen)
+#define PL_osname (vTHX->Iosname)
+#define PL_pad_reset_pending (vTHX->Ipad_reset_pending)
+#define PL_padix (vTHX->Ipadix)
+#define PL_padix_floor (vTHX->Ipadix_floor)
+#define PL_patchlevel (vTHX->Ipatchlevel)
+#define PL_pending_ident (vTHX->Ipending_ident)
+#define PL_perl_destruct_level (vTHX->Iperl_destruct_level)
+#define PL_perldb (vTHX->Iperldb)
+#define PL_pidstatus (vTHX->Ipidstatus)
+#define PL_preambleav (vTHX->Ipreambleav)
+#define PL_preambled (vTHX->Ipreambled)
+#define PL_preprocess (vTHX->Ipreprocess)
+#define PL_profiledata (vTHX->Iprofiledata)
+#define PL_psig_name (vTHX->Ipsig_name)
+#define PL_psig_ptr (vTHX->Ipsig_ptr)
+#define PL_ptr_table (vTHX->Iptr_table)
+#define PL_replgv (vTHX->Ireplgv)
+#define PL_rsfp (vTHX->Irsfp)
+#define PL_rsfp_filters (vTHX->Irsfp_filters)
+#define PL_runops (vTHX->Irunops)
+#define PL_sawampersand (vTHX->Isawampersand)
+#define PL_sh_path (vTHX->Ish_path)
+#define PL_sighandlerp (vTHX->Isighandlerp)
+#define PL_splitstr (vTHX->Isplitstr)
+#define PL_srand_called (vTHX->Isrand_called)
+#define PL_statusvalue (vTHX->Istatusvalue)
+#define PL_statusvalue_vms (vTHX->Istatusvalue_vms)
+#define PL_stderrgv (vTHX->Istderrgv)
+#define PL_stdingv (vTHX->Istdingv)
+#define PL_strtab (vTHX->Istrtab)
+#define PL_strtab_mutex (vTHX->Istrtab_mutex)
+#define PL_sub_generation (vTHX->Isub_generation)
+#define PL_sublex_info (vTHX->Isublex_info)
+#define PL_subline (vTHX->Isubline)
+#define PL_subname (vTHX->Isubname)
+#define PL_sv_arenaroot (vTHX->Isv_arenaroot)
+#define PL_sv_count (vTHX->Isv_count)
+#define PL_sv_mutex (vTHX->Isv_mutex)
+#define PL_sv_no (vTHX->Isv_no)
+#define PL_sv_objcount (vTHX->Isv_objcount)
+#define PL_sv_root (vTHX->Isv_root)
+#define PL_sv_undef (vTHX->Isv_undef)
+#define PL_sv_yes (vTHX->Isv_yes)
+#define PL_svref_mutex (vTHX->Isvref_mutex)
+#define PL_sys_intern (vTHX->Isys_intern)
+#define PL_tainting (vTHX->Itainting)
+#define PL_threadnum (vTHX->Ithreadnum)
+#define PL_threads_mutex (vTHX->Ithreads_mutex)
+#define PL_threadsv_names (vTHX->Ithreadsv_names)
+#define PL_thrsv (vTHX->Ithrsv)
+#define PL_tokenbuf (vTHX->Itokenbuf)
+#define PL_uid (vTHX->Iuid)
+#define PL_unsafe (vTHX->Iunsafe)
+#define PL_utf8_alnum (vTHX->Iutf8_alnum)
+#define PL_utf8_alnumc (vTHX->Iutf8_alnumc)
+#define PL_utf8_alpha (vTHX->Iutf8_alpha)
+#define PL_utf8_ascii (vTHX->Iutf8_ascii)
+#define PL_utf8_cntrl (vTHX->Iutf8_cntrl)
+#define PL_utf8_digit (vTHX->Iutf8_digit)
+#define PL_utf8_graph (vTHX->Iutf8_graph)
+#define PL_utf8_lower (vTHX->Iutf8_lower)
+#define PL_utf8_mark (vTHX->Iutf8_mark)
+#define PL_utf8_print (vTHX->Iutf8_print)
+#define PL_utf8_punct (vTHX->Iutf8_punct)
+#define PL_utf8_space (vTHX->Iutf8_space)
+#define PL_utf8_tolower (vTHX->Iutf8_tolower)
+#define PL_utf8_totitle (vTHX->Iutf8_totitle)
+#define PL_utf8_toupper (vTHX->Iutf8_toupper)
+#define PL_utf8_upper (vTHX->Iutf8_upper)
+#define PL_utf8_xdigit (vTHX->Iutf8_xdigit)
+#define PL_uudmap (vTHX->Iuudmap)
+#define PL_warnhook (vTHX->Iwarnhook)
+#define PL_widesyscalls (vTHX->Iwidesyscalls)
+#define PL_xiv_arenaroot (vTHX->Ixiv_arenaroot)
+#define PL_xiv_root (vTHX->Ixiv_root)
+#define PL_xnv_root (vTHX->Ixnv_root)
+#define PL_xpv_root (vTHX->Ixpv_root)
+#define PL_xpvav_root (vTHX->Ixpvav_root)
+#define PL_xpvbm_root (vTHX->Ixpvbm_root)
+#define PL_xpvcv_root (vTHX->Ixpvcv_root)
+#define PL_xpvhv_root (vTHX->Ixpvhv_root)
+#define PL_xpviv_root (vTHX->Ixpviv_root)
+#define PL_xpvlv_root (vTHX->Ixpvlv_root)
+#define PL_xpvmg_root (vTHX->Ixpvmg_root)
+#define PL_xpvnv_root (vTHX->Ixpvnv_root)
+#define PL_xrv_root (vTHX->Ixrv_root)
+#define PL_yychar (vTHX->Iyychar)
+#define PL_yydebug (vTHX->Iyydebug)
+#define PL_yyerrflag (vTHX->Iyyerrflag)
+#define PL_yylval (vTHX->Iyylval)
+#define PL_yynerrs (vTHX->Iyynerrs)
+#define PL_yyval (vTHX->Iyyval)
+
+# endif /* USE_THREADS */
#else /* !MULTIPLICITY */
+# if defined(PERL_OBJECT)
+/* case 6 above */
+
+#define PL_Sv (aTHXo->interp.TSv)
+#define PL_Xpv (aTHXo->interp.TXpv)
+#define PL_av_fetch_sv (aTHXo->interp.Tav_fetch_sv)
+#define PL_bodytarget (aTHXo->interp.Tbodytarget)
+#define PL_bostr (aTHXo->interp.Tbostr)
+#define PL_chopset (aTHXo->interp.Tchopset)
+#define PL_colors (aTHXo->interp.Tcolors)
+#define PL_colorset (aTHXo->interp.Tcolorset)
+#define PL_curcop (aTHXo->interp.Tcurcop)
+#define PL_curpad (aTHXo->interp.Tcurpad)
+#define PL_curpm (aTHXo->interp.Tcurpm)
+#define PL_curstack (aTHXo->interp.Tcurstack)
+#define PL_curstackinfo (aTHXo->interp.Tcurstackinfo)
+#define PL_curstash (aTHXo->interp.Tcurstash)
+#define PL_defoutgv (aTHXo->interp.Tdefoutgv)
+#define PL_defstash (aTHXo->interp.Tdefstash)
+#define PL_delaymagic (aTHXo->interp.Tdelaymagic)
+#define PL_dirty (aTHXo->interp.Tdirty)
+#define PL_dumpindent (aTHXo->interp.Tdumpindent)
+#define PL_efloatbuf (aTHXo->interp.Tefloatbuf)
+#define PL_efloatsize (aTHXo->interp.Tefloatsize)
+#define PL_errors (aTHXo->interp.Terrors)
+#define PL_extralen (aTHXo->interp.Textralen)
+#define PL_firstgv (aTHXo->interp.Tfirstgv)
+#define PL_formtarget (aTHXo->interp.Tformtarget)
+#define PL_hv_fetch_ent_mh (aTHXo->interp.Thv_fetch_ent_mh)
+#define PL_hv_fetch_sv (aTHXo->interp.Thv_fetch_sv)
+#define PL_in_eval (aTHXo->interp.Tin_eval)
+#define PL_last_in_gv (aTHXo->interp.Tlast_in_gv)
+#define PL_lastgotoprobe (aTHXo->interp.Tlastgotoprobe)
+#define PL_lastscream (aTHXo->interp.Tlastscream)
+#define PL_localizing (aTHXo->interp.Tlocalizing)
+#define PL_mainstack (aTHXo->interp.Tmainstack)
+#define PL_markstack (aTHXo->interp.Tmarkstack)
+#define PL_markstack_max (aTHXo->interp.Tmarkstack_max)
+#define PL_markstack_ptr (aTHXo->interp.Tmarkstack_ptr)
+#define PL_maxscream (aTHXo->interp.Tmaxscream)
+#define PL_modcount (aTHXo->interp.Tmodcount)
+#define PL_na (aTHXo->interp.Tna)
+#define PL_nrs (aTHXo->interp.Tnrs)
+#define PL_ofs (aTHXo->interp.Tofs)
+#define PL_ofslen (aTHXo->interp.Tofslen)
+#define PL_op (aTHXo->interp.Top)
+#define PL_opsave (aTHXo->interp.Topsave)
+#define PL_protect (aTHXo->interp.Tprotect)
+#define PL_reg_call_cc (aTHXo->interp.Treg_call_cc)
+#define PL_reg_curpm (aTHXo->interp.Treg_curpm)
+#define PL_reg_eval_set (aTHXo->interp.Treg_eval_set)
+#define PL_reg_flags (aTHXo->interp.Treg_flags)
+#define PL_reg_ganch (aTHXo->interp.Treg_ganch)
+#define PL_reg_leftiter (aTHXo->interp.Treg_leftiter)
+#define PL_reg_magic (aTHXo->interp.Treg_magic)
+#define PL_reg_maxiter (aTHXo->interp.Treg_maxiter)
+#define PL_reg_oldcurpm (aTHXo->interp.Treg_oldcurpm)
+#define PL_reg_oldpos (aTHXo->interp.Treg_oldpos)
+#define PL_reg_oldsaved (aTHXo->interp.Treg_oldsaved)
+#define PL_reg_oldsavedlen (aTHXo->interp.Treg_oldsavedlen)
+#define PL_reg_poscache (aTHXo->interp.Treg_poscache)
+#define PL_reg_poscache_size (aTHXo->interp.Treg_poscache_size)
+#define PL_reg_re (aTHXo->interp.Treg_re)
+#define PL_reg_start_tmp (aTHXo->interp.Treg_start_tmp)
+#define PL_reg_start_tmpl (aTHXo->interp.Treg_start_tmpl)
+#define PL_reg_starttry (aTHXo->interp.Treg_starttry)
+#define PL_reg_sv (aTHXo->interp.Treg_sv)
+#define PL_reg_whilem_seen (aTHXo->interp.Treg_whilem_seen)
+#define PL_regbol (aTHXo->interp.Tregbol)
+#define PL_regcc (aTHXo->interp.Tregcc)
+#define PL_regcode (aTHXo->interp.Tregcode)
+#define PL_regcomp_parse (aTHXo->interp.Tregcomp_parse)
+#define PL_regcomp_rx (aTHXo->interp.Tregcomp_rx)
+#define PL_regcompp (aTHXo->interp.Tregcompp)
+#define PL_regdata (aTHXo->interp.Tregdata)
+#define PL_regdummy (aTHXo->interp.Tregdummy)
+#define PL_regendp (aTHXo->interp.Tregendp)
+#define PL_regeol (aTHXo->interp.Tregeol)
+#define PL_regexecp (aTHXo->interp.Tregexecp)
+#define PL_regflags (aTHXo->interp.Tregflags)
+#define PL_regfree (aTHXo->interp.Tregfree)
+#define PL_regindent (aTHXo->interp.Tregindent)
+#define PL_reginput (aTHXo->interp.Treginput)
+#define PL_regint_start (aTHXo->interp.Tregint_start)
+#define PL_regint_string (aTHXo->interp.Tregint_string)
+#define PL_reginterp_cnt (aTHXo->interp.Treginterp_cnt)
+#define PL_reglastparen (aTHXo->interp.Treglastparen)
+#define PL_regnarrate (aTHXo->interp.Tregnarrate)
+#define PL_regnaughty (aTHXo->interp.Tregnaughty)
+#define PL_regnpar (aTHXo->interp.Tregnpar)
+#define PL_regprecomp (aTHXo->interp.Tregprecomp)
+#define PL_regprev (aTHXo->interp.Tregprev)
+#define PL_regprogram (aTHXo->interp.Tregprogram)
+#define PL_regsawback (aTHXo->interp.Tregsawback)
+#define PL_regseen (aTHXo->interp.Tregseen)
+#define PL_regsize (aTHXo->interp.Tregsize)
+#define PL_regstartp (aTHXo->interp.Tregstartp)
+#define PL_regtill (aTHXo->interp.Tregtill)
+#define PL_regxend (aTHXo->interp.Tregxend)
+#define PL_restartop (aTHXo->interp.Trestartop)
+#define PL_retstack (aTHXo->interp.Tretstack)
+#define PL_retstack_ix (aTHXo->interp.Tretstack_ix)
+#define PL_retstack_max (aTHXo->interp.Tretstack_max)
+#define PL_rs (aTHXo->interp.Trs)
+#define PL_savestack (aTHXo->interp.Tsavestack)
+#define PL_savestack_ix (aTHXo->interp.Tsavestack_ix)
+#define PL_savestack_max (aTHXo->interp.Tsavestack_max)
+#define PL_scopestack (aTHXo->interp.Tscopestack)
+#define PL_scopestack_ix (aTHXo->interp.Tscopestack_ix)
+#define PL_scopestack_max (aTHXo->interp.Tscopestack_max)
+#define PL_screamfirst (aTHXo->interp.Tscreamfirst)
+#define PL_screamnext (aTHXo->interp.Tscreamnext)
+#define PL_secondgv (aTHXo->interp.Tsecondgv)
+#define PL_seen_evals (aTHXo->interp.Tseen_evals)
+#define PL_seen_zerolen (aTHXo->interp.Tseen_zerolen)
+#define PL_sortcop (aTHXo->interp.Tsortcop)
+#define PL_sortcxix (aTHXo->interp.Tsortcxix)
+#define PL_sortstash (aTHXo->interp.Tsortstash)
+#define PL_stack_base (aTHXo->interp.Tstack_base)
+#define PL_stack_max (aTHXo->interp.Tstack_max)
+#define PL_stack_sp (aTHXo->interp.Tstack_sp)
+#define PL_start_env (aTHXo->interp.Tstart_env)
+#define PL_statbuf (aTHXo->interp.Tstatbuf)
+#define PL_statcache (aTHXo->interp.Tstatcache)
+#define PL_statgv (aTHXo->interp.Tstatgv)
+#define PL_statname (aTHXo->interp.Tstatname)
+#define PL_tainted (aTHXo->interp.Ttainted)
+#define PL_timesbuf (aTHXo->interp.Ttimesbuf)
+#define PL_tmps_floor (aTHXo->interp.Ttmps_floor)
+#define PL_tmps_ix (aTHXo->interp.Ttmps_ix)
+#define PL_tmps_max (aTHXo->interp.Ttmps_max)
+#define PL_tmps_stack (aTHXo->interp.Ttmps_stack)
+#define PL_top_env (aTHXo->interp.Ttop_env)
+#define PL_toptarget (aTHXo->interp.Ttoptarget)
+#define PL_watchaddr (aTHXo->interp.Twatchaddr)
+#define PL_watchok (aTHXo->interp.Twatchok)
+#define PL_Argv (aTHXo->interp.IArgv)
+#define PL_Cmd (aTHXo->interp.ICmd)
+#define PL_DBcv (aTHXo->interp.IDBcv)
+#define PL_DBgv (aTHXo->interp.IDBgv)
+#define PL_DBline (aTHXo->interp.IDBline)
+#define PL_DBsignal (aTHXo->interp.IDBsignal)
+#define PL_DBsingle (aTHXo->interp.IDBsingle)
+#define PL_DBsub (aTHXo->interp.IDBsub)
+#define PL_DBtrace (aTHXo->interp.IDBtrace)
+#define PL_Dir (aTHXo->interp.IDir)
+#define PL_Env (aTHXo->interp.IEnv)
+#define PL_LIO (aTHXo->interp.ILIO)
+#define PL_Mem (aTHXo->interp.IMem)
+#define PL_MemParse (aTHXo->interp.IMemParse)
+#define PL_MemShared (aTHXo->interp.IMemShared)
+#define PL_Proc (aTHXo->interp.IProc)
+#define PL_Sock (aTHXo->interp.ISock)
+#define PL_StdIO (aTHXo->interp.IStdIO)
+#define PL_amagic_generation (aTHXo->interp.Iamagic_generation)
+#define PL_an (aTHXo->interp.Ian)
+#define PL_argvgv (aTHXo->interp.Iargvgv)
+#define PL_argvout_stack (aTHXo->interp.Iargvout_stack)
+#define PL_argvoutgv (aTHXo->interp.Iargvoutgv)
+#define PL_basetime (aTHXo->interp.Ibasetime)
+#define PL_beginav (aTHXo->interp.Ibeginav)
+#define PL_bitcount (aTHXo->interp.Ibitcount)
+#define PL_bufend (aTHXo->interp.Ibufend)
+#define PL_bufptr (aTHXo->interp.Ibufptr)
+#define PL_checkav (aTHXo->interp.Icheckav)
+#define PL_collation_ix (aTHXo->interp.Icollation_ix)
+#define PL_collation_name (aTHXo->interp.Icollation_name)
+#define PL_collation_standard (aTHXo->interp.Icollation_standard)
+#define PL_collxfrm_base (aTHXo->interp.Icollxfrm_base)
+#define PL_collxfrm_mult (aTHXo->interp.Icollxfrm_mult)
+#define PL_compcv (aTHXo->interp.Icompcv)
+#define PL_compiling (aTHXo->interp.Icompiling)
+#define PL_comppad (aTHXo->interp.Icomppad)
+#define PL_comppad_name (aTHXo->interp.Icomppad_name)
+#define PL_comppad_name_fill (aTHXo->interp.Icomppad_name_fill)
+#define PL_comppad_name_floor (aTHXo->interp.Icomppad_name_floor)
+#define PL_cop_seqmax (aTHXo->interp.Icop_seqmax)
+#define PL_copline (aTHXo->interp.Icopline)
+#define PL_cred_mutex (aTHXo->interp.Icred_mutex)
+#define PL_cryptseen (aTHXo->interp.Icryptseen)
+#define PL_cshlen (aTHXo->interp.Icshlen)
+#define PL_cshname (aTHXo->interp.Icshname)
+#define PL_curcopdb (aTHXo->interp.Icurcopdb)
+#define PL_curstname (aTHXo->interp.Icurstname)
+#define PL_curthr (aTHXo->interp.Icurthr)
+#define PL_dbargs (aTHXo->interp.Idbargs)
+#define PL_debstash (aTHXo->interp.Idebstash)
+#define PL_debug (aTHXo->interp.Idebug)
+#define PL_defgv (aTHXo->interp.Idefgv)
+#define PL_diehook (aTHXo->interp.Idiehook)
+#define PL_doextract (aTHXo->interp.Idoextract)
+#define PL_doswitches (aTHXo->interp.Idoswitches)
+#define PL_dowarn (aTHXo->interp.Idowarn)
+#define PL_e_script (aTHXo->interp.Ie_script)
+#define PL_egid (aTHXo->interp.Iegid)
+#define PL_endav (aTHXo->interp.Iendav)
+#define PL_envgv (aTHXo->interp.Ienvgv)
+#define PL_errgv (aTHXo->interp.Ierrgv)
+#define PL_error_count (aTHXo->interp.Ierror_count)
+#define PL_euid (aTHXo->interp.Ieuid)
+#define PL_eval_cond (aTHXo->interp.Ieval_cond)
+#define PL_eval_mutex (aTHXo->interp.Ieval_mutex)
+#define PL_eval_owner (aTHXo->interp.Ieval_owner)
+#define PL_eval_root (aTHXo->interp.Ieval_root)
+#define PL_eval_start (aTHXo->interp.Ieval_start)
+#define PL_evalseq (aTHXo->interp.Ievalseq)
+#define PL_exit_flags (aTHXo->interp.Iexit_flags)
+#define PL_exitlist (aTHXo->interp.Iexitlist)
+#define PL_exitlistlen (aTHXo->interp.Iexitlistlen)
+#define PL_expect (aTHXo->interp.Iexpect)
+#define PL_fdpid (aTHXo->interp.Ifdpid)
+#define PL_filemode (aTHXo->interp.Ifilemode)
+#define PL_forkprocess (aTHXo->interp.Iforkprocess)
+#define PL_formfeed (aTHXo->interp.Iformfeed)
+#define PL_generation (aTHXo->interp.Igeneration)
+#define PL_gensym (aTHXo->interp.Igensym)
+#define PL_gid (aTHXo->interp.Igid)
+#define PL_glob_index (aTHXo->interp.Iglob_index)
+#define PL_globalstash (aTHXo->interp.Iglobalstash)
+#define PL_he_root (aTHXo->interp.Ihe_root)
+#define PL_hintgv (aTHXo->interp.Ihintgv)
+#define PL_hints (aTHXo->interp.Ihints)
+#define PL_in_clean_all (aTHXo->interp.Iin_clean_all)
+#define PL_in_clean_objs (aTHXo->interp.Iin_clean_objs)
+#define PL_in_my (aTHXo->interp.Iin_my)
+#define PL_in_my_stash (aTHXo->interp.Iin_my_stash)
+#define PL_incgv (aTHXo->interp.Iincgv)
+#define PL_initav (aTHXo->interp.Iinitav)
+#define PL_inplace (aTHXo->interp.Iinplace)
+#define PL_last_lop (aTHXo->interp.Ilast_lop)
+#define PL_last_lop_op (aTHXo->interp.Ilast_lop_op)
+#define PL_last_swash_hv (aTHXo->interp.Ilast_swash_hv)
+#define PL_last_swash_key (aTHXo->interp.Ilast_swash_key)
+#define PL_last_swash_klen (aTHXo->interp.Ilast_swash_klen)
+#define PL_last_swash_slen (aTHXo->interp.Ilast_swash_slen)
+#define PL_last_swash_tmps (aTHXo->interp.Ilast_swash_tmps)
+#define PL_last_uni (aTHXo->interp.Ilast_uni)
+#define PL_lastfd (aTHXo->interp.Ilastfd)
+#define PL_laststatval (aTHXo->interp.Ilaststatval)
+#define PL_laststype (aTHXo->interp.Ilaststype)
+#define PL_lex_brackets (aTHXo->interp.Ilex_brackets)
+#define PL_lex_brackstack (aTHXo->interp.Ilex_brackstack)
+#define PL_lex_casemods (aTHXo->interp.Ilex_casemods)
+#define PL_lex_casestack (aTHXo->interp.Ilex_casestack)
+#define PL_lex_defer (aTHXo->interp.Ilex_defer)
+#define PL_lex_dojoin (aTHXo->interp.Ilex_dojoin)
+#define PL_lex_expect (aTHXo->interp.Ilex_expect)
+#define PL_lex_formbrack (aTHXo->interp.Ilex_formbrack)
+#define PL_lex_inpat (aTHXo->interp.Ilex_inpat)
+#define PL_lex_inwhat (aTHXo->interp.Ilex_inwhat)
+#define PL_lex_op (aTHXo->interp.Ilex_op)
+#define PL_lex_repl (aTHXo->interp.Ilex_repl)
+#define PL_lex_starts (aTHXo->interp.Ilex_starts)
+#define PL_lex_state (aTHXo->interp.Ilex_state)
+#define PL_lex_stuff (aTHXo->interp.Ilex_stuff)
+#define PL_lineary (aTHXo->interp.Ilineary)
+#define PL_linestart (aTHXo->interp.Ilinestart)
+#define PL_linestr (aTHXo->interp.Ilinestr)
+#define PL_localpatches (aTHXo->interp.Ilocalpatches)
+#define PL_main_cv (aTHXo->interp.Imain_cv)
+#define PL_main_root (aTHXo->interp.Imain_root)
+#define PL_main_start (aTHXo->interp.Imain_start)
+#define PL_max_intro_pending (aTHXo->interp.Imax_intro_pending)
+#define PL_maxo (aTHXo->interp.Imaxo)
+#define PL_maxsysfd (aTHXo->interp.Imaxsysfd)
+#define PL_mess_sv (aTHXo->interp.Imess_sv)
+#define PL_min_intro_pending (aTHXo->interp.Imin_intro_pending)
+#define PL_minus_F (aTHXo->interp.Iminus_F)
+#define PL_minus_a (aTHXo->interp.Iminus_a)
+#define PL_minus_c (aTHXo->interp.Iminus_c)
+#define PL_minus_l (aTHXo->interp.Iminus_l)
+#define PL_minus_n (aTHXo->interp.Iminus_n)
+#define PL_minus_p (aTHXo->interp.Iminus_p)
+#define PL_modglobal (aTHXo->interp.Imodglobal)
+#define PL_multi_close (aTHXo->interp.Imulti_close)
+#define PL_multi_end (aTHXo->interp.Imulti_end)
+#define PL_multi_open (aTHXo->interp.Imulti_open)
+#define PL_multi_start (aTHXo->interp.Imulti_start)
+#define PL_multiline (aTHXo->interp.Imultiline)
+#define PL_nexttoke (aTHXo->interp.Inexttoke)
+#define PL_nexttype (aTHXo->interp.Inexttype)
+#define PL_nextval (aTHXo->interp.Inextval)
+#define PL_nice_chunk (aTHXo->interp.Inice_chunk)
+#define PL_nice_chunk_size (aTHXo->interp.Inice_chunk_size)
+#define PL_nomemok (aTHXo->interp.Inomemok)
+#define PL_nthreads (aTHXo->interp.Inthreads)
+#define PL_nthreads_cond (aTHXo->interp.Inthreads_cond)
+#define PL_numeric_local (aTHXo->interp.Inumeric_local)
+#define PL_numeric_name (aTHXo->interp.Inumeric_name)
+#define PL_numeric_radix (aTHXo->interp.Inumeric_radix)
+#define PL_numeric_standard (aTHXo->interp.Inumeric_standard)
+#define PL_ofmt (aTHXo->interp.Iofmt)
+#define PL_oldbufptr (aTHXo->interp.Ioldbufptr)
+#define PL_oldname (aTHXo->interp.Ioldname)
+#define PL_oldoldbufptr (aTHXo->interp.Ioldoldbufptr)
+#define PL_op_mask (aTHXo->interp.Iop_mask)
+#define PL_op_seqmax (aTHXo->interp.Iop_seqmax)
+#define PL_origalen (aTHXo->interp.Iorigalen)
+#define PL_origargc (aTHXo->interp.Iorigargc)
+#define PL_origargv (aTHXo->interp.Iorigargv)
+#define PL_origenviron (aTHXo->interp.Iorigenviron)
+#define PL_origfilename (aTHXo->interp.Iorigfilename)
+#define PL_ors (aTHXo->interp.Iors)
+#define PL_orslen (aTHXo->interp.Iorslen)
+#define PL_osname (aTHXo->interp.Iosname)
+#define PL_pad_reset_pending (aTHXo->interp.Ipad_reset_pending)
+#define PL_padix (aTHXo->interp.Ipadix)
+#define PL_padix_floor (aTHXo->interp.Ipadix_floor)
+#define PL_patchlevel (aTHXo->interp.Ipatchlevel)
+#define PL_pending_ident (aTHXo->interp.Ipending_ident)
+#define PL_perl_destruct_level (aTHXo->interp.Iperl_destruct_level)
+#define PL_perldb (aTHXo->interp.Iperldb)
+#define PL_pidstatus (aTHXo->interp.Ipidstatus)
+#define PL_preambleav (aTHXo->interp.Ipreambleav)
+#define PL_preambled (aTHXo->interp.Ipreambled)
+#define PL_preprocess (aTHXo->interp.Ipreprocess)
+#define PL_profiledata (aTHXo->interp.Iprofiledata)
+#define PL_psig_name (aTHXo->interp.Ipsig_name)
+#define PL_psig_ptr (aTHXo->interp.Ipsig_ptr)
+#define PL_ptr_table (aTHXo->interp.Iptr_table)
+#define PL_replgv (aTHXo->interp.Ireplgv)
+#define PL_rsfp (aTHXo->interp.Irsfp)
+#define PL_rsfp_filters (aTHXo->interp.Irsfp_filters)
+#define PL_runops (aTHXo->interp.Irunops)
+#define PL_sawampersand (aTHXo->interp.Isawampersand)
+#define PL_sh_path (aTHXo->interp.Ish_path)
+#define PL_sighandlerp (aTHXo->interp.Isighandlerp)
+#define PL_splitstr (aTHXo->interp.Isplitstr)
+#define PL_srand_called (aTHXo->interp.Isrand_called)
+#define PL_statusvalue (aTHXo->interp.Istatusvalue)
+#define PL_statusvalue_vms (aTHXo->interp.Istatusvalue_vms)
+#define PL_stderrgv (aTHXo->interp.Istderrgv)
+#define PL_stdingv (aTHXo->interp.Istdingv)
+#define PL_strtab (aTHXo->interp.Istrtab)
+#define PL_strtab_mutex (aTHXo->interp.Istrtab_mutex)
+#define PL_sub_generation (aTHXo->interp.Isub_generation)
+#define PL_sublex_info (aTHXo->interp.Isublex_info)
+#define PL_subline (aTHXo->interp.Isubline)
+#define PL_subname (aTHXo->interp.Isubname)
+#define PL_sv_arenaroot (aTHXo->interp.Isv_arenaroot)
+#define PL_sv_count (aTHXo->interp.Isv_count)
+#define PL_sv_mutex (aTHXo->interp.Isv_mutex)
+#define PL_sv_no (aTHXo->interp.Isv_no)
+#define PL_sv_objcount (aTHXo->interp.Isv_objcount)
+#define PL_sv_root (aTHXo->interp.Isv_root)
+#define PL_sv_undef (aTHXo->interp.Isv_undef)
+#define PL_sv_yes (aTHXo->interp.Isv_yes)
+#define PL_svref_mutex (aTHXo->interp.Isvref_mutex)
+#define PL_sys_intern (aTHXo->interp.Isys_intern)
+#define PL_tainting (aTHXo->interp.Itainting)
+#define PL_threadnum (aTHXo->interp.Ithreadnum)
+#define PL_threads_mutex (aTHXo->interp.Ithreads_mutex)
+#define PL_threadsv_names (aTHXo->interp.Ithreadsv_names)
+#define PL_thrsv (aTHXo->interp.Ithrsv)
+#define PL_tokenbuf (aTHXo->interp.Itokenbuf)
+#define PL_uid (aTHXo->interp.Iuid)
+#define PL_unsafe (aTHXo->interp.Iunsafe)
+#define PL_utf8_alnum (aTHXo->interp.Iutf8_alnum)
+#define PL_utf8_alnumc (aTHXo->interp.Iutf8_alnumc)
+#define PL_utf8_alpha (aTHXo->interp.Iutf8_alpha)
+#define PL_utf8_ascii (aTHXo->interp.Iutf8_ascii)
+#define PL_utf8_cntrl (aTHXo->interp.Iutf8_cntrl)
+#define PL_utf8_digit (aTHXo->interp.Iutf8_digit)
+#define PL_utf8_graph (aTHXo->interp.Iutf8_graph)
+#define PL_utf8_lower (aTHXo->interp.Iutf8_lower)
+#define PL_utf8_mark (aTHXo->interp.Iutf8_mark)
+#define PL_utf8_print (aTHXo->interp.Iutf8_print)
+#define PL_utf8_punct (aTHXo->interp.Iutf8_punct)
+#define PL_utf8_space (aTHXo->interp.Iutf8_space)
+#define PL_utf8_tolower (aTHXo->interp.Iutf8_tolower)
+#define PL_utf8_totitle (aTHXo->interp.Iutf8_totitle)
+#define PL_utf8_toupper (aTHXo->interp.Iutf8_toupper)
+#define PL_utf8_upper (aTHXo->interp.Iutf8_upper)
+#define PL_utf8_xdigit (aTHXo->interp.Iutf8_xdigit)
+#define PL_uudmap (aTHXo->interp.Iuudmap)
+#define PL_warnhook (aTHXo->interp.Iwarnhook)
+#define PL_widesyscalls (aTHXo->interp.Iwidesyscalls)
+#define PL_xiv_arenaroot (aTHXo->interp.Ixiv_arenaroot)
+#define PL_xiv_root (aTHXo->interp.Ixiv_root)
+#define PL_xnv_root (aTHXo->interp.Ixnv_root)
+#define PL_xpv_root (aTHXo->interp.Ixpv_root)
+#define PL_xpvav_root (aTHXo->interp.Ixpvav_root)
+#define PL_xpvbm_root (aTHXo->interp.Ixpvbm_root)
+#define PL_xpvcv_root (aTHXo->interp.Ixpvcv_root)
+#define PL_xpvhv_root (aTHXo->interp.Ixpvhv_root)
+#define PL_xpviv_root (aTHXo->interp.Ixpviv_root)
+#define PL_xpvlv_root (aTHXo->interp.Ixpvlv_root)
+#define PL_xpvmg_root (aTHXo->interp.Ixpvmg_root)
+#define PL_xpvnv_root (aTHXo->interp.Ixpvnv_root)
+#define PL_xrv_root (aTHXo->interp.Ixrv_root)
+#define PL_yychar (aTHXo->interp.Iyychar)
+#define PL_yydebug (aTHXo->interp.Iyydebug)
+#define PL_yyerrflag (aTHXo->interp.Iyyerrflag)
+#define PL_yylval (aTHXo->interp.Iyylval)
+#define PL_yynerrs (aTHXo->interp.Iyynerrs)
+#define PL_yyval (aTHXo->interp.Iyyval)
+
+# else /* !PERL_OBJECT */
+
+/* cases 1 and 4 above */
+
#define PL_IArgv PL_Argv
#define PL_ICmd PL_Cmd
#define PL_IDBcv PL_DBcv
@@ -275,75 +1110,128 @@
#define PL_IDBsingle PL_DBsingle
#define PL_IDBsub PL_DBsub
#define PL_IDBtrace PL_DBtrace
-#define PL_Iampergv PL_ampergv
-#define PL_Iarchpat_auto PL_archpat_auto
+#define PL_IDir PL_Dir
+#define PL_IEnv PL_Env
+#define PL_ILIO PL_LIO
+#define PL_IMem PL_Mem
+#define PL_IMemParse PL_MemParse
+#define PL_IMemShared PL_MemShared
+#define PL_IProc PL_Proc
+#define PL_ISock PL_Sock
+#define PL_IStdIO PL_StdIO
+#define PL_Iamagic_generation PL_amagic_generation
+#define PL_Ian PL_an
#define PL_Iargvgv PL_argvgv
+#define PL_Iargvout_stack PL_argvout_stack
#define PL_Iargvoutgv PL_argvoutgv
#define PL_Ibasetime PL_basetime
#define PL_Ibeginav PL_beginav
-#define PL_Ibytecode_iv_overflows PL_bytecode_iv_overflows
-#define PL_Ibytecode_obj_list PL_bytecode_obj_list
-#define PL_Ibytecode_obj_list_fill PL_bytecode_obj_list_fill
-#define PL_Ibytecode_pv PL_bytecode_pv
-#define PL_Ibytecode_sv PL_bytecode_sv
-#define PL_Icddir PL_cddir
+#define PL_Ibitcount PL_bitcount
+#define PL_Ibufend PL_bufend
+#define PL_Ibufptr PL_bufptr
+#define PL_Icheckav PL_checkav
+#define PL_Icollation_ix PL_collation_ix
+#define PL_Icollation_name PL_collation_name
+#define PL_Icollation_standard PL_collation_standard
+#define PL_Icollxfrm_base PL_collxfrm_base
+#define PL_Icollxfrm_mult PL_collxfrm_mult
#define PL_Icompcv PL_compcv
#define PL_Icompiling PL_compiling
#define PL_Icomppad PL_comppad
#define PL_Icomppad_name PL_comppad_name
#define PL_Icomppad_name_fill PL_comppad_name_fill
#define PL_Icomppad_name_floor PL_comppad_name_floor
+#define PL_Icop_seqmax PL_cop_seqmax
#define PL_Icopline PL_copline
+#define PL_Icred_mutex PL_cred_mutex
+#define PL_Icryptseen PL_cryptseen
+#define PL_Icshlen PL_cshlen
+#define PL_Icshname PL_cshname
#define PL_Icurcopdb PL_curcopdb
#define PL_Icurstname PL_curstname
+#define PL_Icurthr PL_curthr
#define PL_Idbargs PL_dbargs
-#define PL_Idebdelim PL_debdelim
-#define PL_Idebname PL_debname
#define PL_Idebstash PL_debstash
+#define PL_Idebug PL_debug
#define PL_Idefgv PL_defgv
#define PL_Idiehook PL_diehook
-#define PL_Idlevel PL_dlevel
-#define PL_Idlmax PL_dlmax
#define PL_Idoextract PL_doextract
#define PL_Idoswitches PL_doswitches
#define PL_Idowarn PL_dowarn
-#define PL_Idumplvl PL_dumplvl
#define PL_Ie_script PL_e_script
+#define PL_Iegid PL_egid
#define PL_Iendav PL_endav
#define PL_Ienvgv PL_envgv
#define PL_Ierrgv PL_errgv
+#define PL_Ierror_count PL_error_count
+#define PL_Ieuid PL_euid
+#define PL_Ieval_cond PL_eval_cond
+#define PL_Ieval_mutex PL_eval_mutex
+#define PL_Ieval_owner PL_eval_owner
#define PL_Ieval_root PL_eval_root
#define PL_Ieval_start PL_eval_start
+#define PL_Ievalseq PL_evalseq
+#define PL_Iexit_flags PL_exit_flags
#define PL_Iexitlist PL_exitlist
#define PL_Iexitlistlen PL_exitlistlen
+#define PL_Iexpect PL_expect
#define PL_Ifdpid PL_fdpid
#define PL_Ifilemode PL_filemode
#define PL_Iforkprocess PL_forkprocess
#define PL_Iformfeed PL_formfeed
#define PL_Igeneration PL_generation
#define PL_Igensym PL_gensym
+#define PL_Igid PL_gid
+#define PL_Iglob_index PL_glob_index
#define PL_Iglobalstash PL_globalstash
+#define PL_Ihe_root PL_he_root
#define PL_Ihintgv PL_hintgv
+#define PL_Ihints PL_hints
#define PL_Iin_clean_all PL_in_clean_all
#define PL_Iin_clean_objs PL_in_clean_objs
+#define PL_Iin_my PL_in_my
+#define PL_Iin_my_stash PL_in_my_stash
#define PL_Iincgv PL_incgv
#define PL_Iinitav PL_initav
#define PL_Iinplace PL_inplace
-#define PL_Ilast_proto PL_last_proto
+#define PL_Ilast_lop PL_last_lop
+#define PL_Ilast_lop_op PL_last_lop_op
+#define PL_Ilast_swash_hv PL_last_swash_hv
+#define PL_Ilast_swash_key PL_last_swash_key
+#define PL_Ilast_swash_klen PL_last_swash_klen
+#define PL_Ilast_swash_slen PL_last_swash_slen
+#define PL_Ilast_swash_tmps PL_last_swash_tmps
+#define PL_Ilast_uni PL_last_uni
#define PL_Ilastfd PL_lastfd
-#define PL_Ilastsize PL_lastsize
-#define PL_Ilastspbase PL_lastspbase
#define PL_Ilaststatval PL_laststatval
#define PL_Ilaststype PL_laststype
-#define PL_Ileftgv PL_leftgv
+#define PL_Ilex_brackets PL_lex_brackets
+#define PL_Ilex_brackstack PL_lex_brackstack
+#define PL_Ilex_casemods PL_lex_casemods
+#define PL_Ilex_casestack PL_lex_casestack
+#define PL_Ilex_defer PL_lex_defer
+#define PL_Ilex_dojoin PL_lex_dojoin
+#define PL_Ilex_expect PL_lex_expect
+#define PL_Ilex_formbrack PL_lex_formbrack
+#define PL_Ilex_inpat PL_lex_inpat
+#define PL_Ilex_inwhat PL_lex_inwhat
+#define PL_Ilex_op PL_lex_op
+#define PL_Ilex_repl PL_lex_repl
+#define PL_Ilex_starts PL_lex_starts
+#define PL_Ilex_state PL_lex_state
+#define PL_Ilex_stuff PL_lex_stuff
#define PL_Ilineary PL_lineary
#define PL_Ilinestart PL_linestart
+#define PL_Ilinestr PL_linestr
#define PL_Ilocalpatches PL_localpatches
#define PL_Imain_cv PL_main_cv
#define PL_Imain_root PL_main_root
#define PL_Imain_start PL_main_start
+#define PL_Imax_intro_pending PL_max_intro_pending
+#define PL_Imaxo PL_maxo
#define PL_Imaxsysfd PL_maxsysfd
#define PL_Imess_sv PL_mess_sv
+#define PL_Imin_intro_pending PL_min_intro_pending
#define PL_Iminus_F PL_minus_F
#define PL_Iminus_a PL_minus_a
#define PL_Iminus_c PL_minus_c
@@ -351,55 +1239,268 @@
#define PL_Iminus_n PL_minus_n
#define PL_Iminus_p PL_minus_p
#define PL_Imodglobal PL_modglobal
+#define PL_Imulti_close PL_multi_close
+#define PL_Imulti_end PL_multi_end
+#define PL_Imulti_open PL_multi_open
+#define PL_Imulti_start PL_multi_start
#define PL_Imultiline PL_multiline
-#define PL_Imystrk PL_mystrk
+#define PL_Inexttoke PL_nexttoke
+#define PL_Inexttype PL_nexttype
+#define PL_Inextval PL_nextval
+#define PL_Inice_chunk PL_nice_chunk
+#define PL_Inice_chunk_size PL_nice_chunk_size
+#define PL_Inomemok PL_nomemok
+#define PL_Inthreads PL_nthreads
+#define PL_Inthreads_cond PL_nthreads_cond
+#define PL_Inumeric_local PL_numeric_local
+#define PL_Inumeric_name PL_numeric_name
+#define PL_Inumeric_radix PL_numeric_radix
+#define PL_Inumeric_standard PL_numeric_standard
#define PL_Iofmt PL_ofmt
-#define PL_Ioldlastpm PL_oldlastpm
+#define PL_Ioldbufptr PL_oldbufptr
#define PL_Ioldname PL_oldname
+#define PL_Ioldoldbufptr PL_oldoldbufptr
#define PL_Iop_mask PL_op_mask
+#define PL_Iop_seqmax PL_op_seqmax
+#define PL_Iorigalen PL_origalen
#define PL_Iorigargc PL_origargc
#define PL_Iorigargv PL_origargv
+#define PL_Iorigenviron PL_origenviron
#define PL_Iorigfilename PL_origfilename
#define PL_Iors PL_ors
#define PL_Iorslen PL_orslen
-#define PL_Iparsehook PL_parsehook
+#define PL_Iosname PL_osname
+#define PL_Ipad_reset_pending PL_pad_reset_pending
+#define PL_Ipadix PL_padix
+#define PL_Ipadix_floor PL_padix_floor
#define PL_Ipatchlevel PL_patchlevel
#define PL_Ipending_ident PL_pending_ident
#define PL_Iperl_destruct_level PL_perl_destruct_level
#define PL_Iperldb PL_perldb
+#define PL_Ipidstatus PL_pidstatus
#define PL_Ipreambleav PL_preambleav
#define PL_Ipreambled PL_preambled
#define PL_Ipreprocess PL_preprocess
#define PL_Iprofiledata PL_profiledata
+#define PL_Ipsig_name PL_psig_name
+#define PL_Ipsig_ptr PL_psig_ptr
+#define PL_Iptr_table PL_ptr_table
#define PL_Ireplgv PL_replgv
-#define PL_Irightgv PL_rightgv
#define PL_Irsfp PL_rsfp
#define PL_Irsfp_filters PL_rsfp_filters
+#define PL_Irunops PL_runops
#define PL_Isawampersand PL_sawampersand
-#define PL_Isawstudy PL_sawstudy
-#define PL_Isawvec PL_sawvec
-#define PL_Isiggv PL_siggv
+#define PL_Ish_path PL_sh_path
+#define PL_Isighandlerp PL_sighandlerp
#define PL_Isplitstr PL_splitstr
+#define PL_Isrand_called PL_srand_called
#define PL_Istatusvalue PL_statusvalue
#define PL_Istatusvalue_vms PL_statusvalue_vms
+#define PL_Istderrgv PL_stderrgv
#define PL_Istdingv PL_stdingv
-#define PL_Istrchop PL_strchop
#define PL_Istrtab PL_strtab
#define PL_Istrtab_mutex PL_strtab_mutex
#define PL_Isub_generation PL_sub_generation
#define PL_Isublex_info PL_sublex_info
+#define PL_Isubline PL_subline
+#define PL_Isubname PL_subname
#define PL_Isv_arenaroot PL_sv_arenaroot
#define PL_Isv_count PL_sv_count
+#define PL_Isv_mutex PL_sv_mutex
+#define PL_Isv_no PL_sv_no
#define PL_Isv_objcount PL_sv_objcount
#define PL_Isv_root PL_sv_root
+#define PL_Isv_undef PL_sv_undef
+#define PL_Isv_yes PL_sv_yes
+#define PL_Isvref_mutex PL_svref_mutex
#define PL_Isys_intern PL_sys_intern
#define PL_Itainting PL_tainting
#define PL_Ithreadnum PL_threadnum
+#define PL_Ithreads_mutex PL_threads_mutex
+#define PL_Ithreadsv_names PL_threadsv_names
#define PL_Ithrsv PL_thrsv
+#define PL_Itokenbuf PL_tokenbuf
+#define PL_Iuid PL_uid
#define PL_Iunsafe PL_unsafe
+#define PL_Iutf8_alnum PL_utf8_alnum
+#define PL_Iutf8_alnumc PL_utf8_alnumc
+#define PL_Iutf8_alpha PL_utf8_alpha
+#define PL_Iutf8_ascii PL_utf8_ascii
+#define PL_Iutf8_cntrl PL_utf8_cntrl
+#define PL_Iutf8_digit PL_utf8_digit
+#define PL_Iutf8_graph PL_utf8_graph
+#define PL_Iutf8_lower PL_utf8_lower
+#define PL_Iutf8_mark PL_utf8_mark
+#define PL_Iutf8_print PL_utf8_print
+#define PL_Iutf8_punct PL_utf8_punct
+#define PL_Iutf8_space PL_utf8_space
+#define PL_Iutf8_tolower PL_utf8_tolower
+#define PL_Iutf8_totitle PL_utf8_totitle
+#define PL_Iutf8_toupper PL_utf8_toupper
+#define PL_Iutf8_upper PL_utf8_upper
+#define PL_Iutf8_xdigit PL_utf8_xdigit
+#define PL_Iuudmap PL_uudmap
#define PL_Iwarnhook PL_warnhook
+#define PL_Iwidesyscalls PL_widesyscalls
+#define PL_Ixiv_arenaroot PL_xiv_arenaroot
+#define PL_Ixiv_root PL_xiv_root
+#define PL_Ixnv_root PL_xnv_root
+#define PL_Ixpv_root PL_xpv_root
+#define PL_Ixpvav_root PL_xpvav_root
+#define PL_Ixpvbm_root PL_xpvbm_root
+#define PL_Ixpvcv_root PL_xpvcv_root
+#define PL_Ixpvhv_root PL_xpvhv_root
+#define PL_Ixpviv_root PL_xpviv_root
+#define PL_Ixpvlv_root PL_xpvlv_root
+#define PL_Ixpvmg_root PL_xpvmg_root
+#define PL_Ixpvnv_root PL_xpvnv_root
+#define PL_Ixrv_root PL_xrv_root
+#define PL_Iyychar PL_yychar
+#define PL_Iyydebug PL_yydebug
+#define PL_Iyyerrflag PL_yyerrflag
+#define PL_Iyylval PL_yylval
+#define PL_Iyynerrs PL_yynerrs
+#define PL_Iyyval PL_yyval
+
+# if defined(USE_THREADS)
+/* case 4 above */
+
+#define PL_Sv (aTHX->TSv)
+#define PL_Xpv (aTHX->TXpv)
+#define PL_av_fetch_sv (aTHX->Tav_fetch_sv)
+#define PL_bodytarget (aTHX->Tbodytarget)
+#define PL_bostr (aTHX->Tbostr)
+#define PL_chopset (aTHX->Tchopset)
+#define PL_colors (aTHX->Tcolors)
+#define PL_colorset (aTHX->Tcolorset)
+#define PL_curcop (aTHX->Tcurcop)
+#define PL_curpad (aTHX->Tcurpad)
+#define PL_curpm (aTHX->Tcurpm)
+#define PL_curstack (aTHX->Tcurstack)
+#define PL_curstackinfo (aTHX->Tcurstackinfo)
+#define PL_curstash (aTHX->Tcurstash)
+#define PL_defoutgv (aTHX->Tdefoutgv)
+#define PL_defstash (aTHX->Tdefstash)
+#define PL_delaymagic (aTHX->Tdelaymagic)
+#define PL_dirty (aTHX->Tdirty)
+#define PL_dumpindent (aTHX->Tdumpindent)
+#define PL_efloatbuf (aTHX->Tefloatbuf)
+#define PL_efloatsize (aTHX->Tefloatsize)
+#define PL_errors (aTHX->Terrors)
+#define PL_extralen (aTHX->Textralen)
+#define PL_firstgv (aTHX->Tfirstgv)
+#define PL_formtarget (aTHX->Tformtarget)
+#define PL_hv_fetch_ent_mh (aTHX->Thv_fetch_ent_mh)
+#define PL_hv_fetch_sv (aTHX->Thv_fetch_sv)
+#define PL_in_eval (aTHX->Tin_eval)
+#define PL_last_in_gv (aTHX->Tlast_in_gv)
+#define PL_lastgotoprobe (aTHX->Tlastgotoprobe)
+#define PL_lastscream (aTHX->Tlastscream)
+#define PL_localizing (aTHX->Tlocalizing)
+#define PL_mainstack (aTHX->Tmainstack)
+#define PL_markstack (aTHX->Tmarkstack)
+#define PL_markstack_max (aTHX->Tmarkstack_max)
+#define PL_markstack_ptr (aTHX->Tmarkstack_ptr)
+#define PL_maxscream (aTHX->Tmaxscream)
+#define PL_modcount (aTHX->Tmodcount)
+#define PL_na (aTHX->Tna)
+#define PL_nrs (aTHX->Tnrs)
+#define PL_ofs (aTHX->Tofs)
+#define PL_ofslen (aTHX->Tofslen)
+#define PL_op (aTHX->Top)
+#define PL_opsave (aTHX->Topsave)
+#define PL_protect (aTHX->Tprotect)
+#define PL_reg_call_cc (aTHX->Treg_call_cc)
+#define PL_reg_curpm (aTHX->Treg_curpm)
+#define PL_reg_eval_set (aTHX->Treg_eval_set)
+#define PL_reg_flags (aTHX->Treg_flags)
+#define PL_reg_ganch (aTHX->Treg_ganch)
+#define PL_reg_leftiter (aTHX->Treg_leftiter)
+#define PL_reg_magic (aTHX->Treg_magic)
+#define PL_reg_maxiter (aTHX->Treg_maxiter)
+#define PL_reg_oldcurpm (aTHX->Treg_oldcurpm)
+#define PL_reg_oldpos (aTHX->Treg_oldpos)
+#define PL_reg_oldsaved (aTHX->Treg_oldsaved)
+#define PL_reg_oldsavedlen (aTHX->Treg_oldsavedlen)
+#define PL_reg_poscache (aTHX->Treg_poscache)
+#define PL_reg_poscache_size (aTHX->Treg_poscache_size)
+#define PL_reg_re (aTHX->Treg_re)
+#define PL_reg_start_tmp (aTHX->Treg_start_tmp)
+#define PL_reg_start_tmpl (aTHX->Treg_start_tmpl)
+#define PL_reg_starttry (aTHX->Treg_starttry)
+#define PL_reg_sv (aTHX->Treg_sv)
+#define PL_reg_whilem_seen (aTHX->Treg_whilem_seen)
+#define PL_regbol (aTHX->Tregbol)
+#define PL_regcc (aTHX->Tregcc)
+#define PL_regcode (aTHX->Tregcode)
+#define PL_regcomp_parse (aTHX->Tregcomp_parse)
+#define PL_regcomp_rx (aTHX->Tregcomp_rx)
+#define PL_regcompp (aTHX->Tregcompp)
+#define PL_regdata (aTHX->Tregdata)
+#define PL_regdummy (aTHX->Tregdummy)
+#define PL_regendp (aTHX->Tregendp)
+#define PL_regeol (aTHX->Tregeol)
+#define PL_regexecp (aTHX->Tregexecp)
+#define PL_regflags (aTHX->Tregflags)
+#define PL_regfree (aTHX->Tregfree)
+#define PL_regindent (aTHX->Tregindent)
+#define PL_reginput (aTHX->Treginput)
+#define PL_regint_start (aTHX->Tregint_start)
+#define PL_regint_string (aTHX->Tregint_string)
+#define PL_reginterp_cnt (aTHX->Treginterp_cnt)
+#define PL_reglastparen (aTHX->Treglastparen)
+#define PL_regnarrate (aTHX->Tregnarrate)
+#define PL_regnaughty (aTHX->Tregnaughty)
+#define PL_regnpar (aTHX->Tregnpar)
+#define PL_regprecomp (aTHX->Tregprecomp)
+#define PL_regprev (aTHX->Tregprev)
+#define PL_regprogram (aTHX->Tregprogram)
+#define PL_regsawback (aTHX->Tregsawback)
+#define PL_regseen (aTHX->Tregseen)
+#define PL_regsize (aTHX->Tregsize)
+#define PL_regstartp (aTHX->Tregstartp)
+#define PL_regtill (aTHX->Tregtill)
+#define PL_regxend (aTHX->Tregxend)
+#define PL_restartop (aTHX->Trestartop)
+#define PL_retstack (aTHX->Tretstack)
+#define PL_retstack_ix (aTHX->Tretstack_ix)
+#define PL_retstack_max (aTHX->Tretstack_max)
+#define PL_rs (aTHX->Trs)
+#define PL_savestack (aTHX->Tsavestack)
+#define PL_savestack_ix (aTHX->Tsavestack_ix)
+#define PL_savestack_max (aTHX->Tsavestack_max)
+#define PL_scopestack (aTHX->Tscopestack)
+#define PL_scopestack_ix (aTHX->Tscopestack_ix)
+#define PL_scopestack_max (aTHX->Tscopestack_max)
+#define PL_screamfirst (aTHX->Tscreamfirst)
+#define PL_screamnext (aTHX->Tscreamnext)
+#define PL_secondgv (aTHX->Tsecondgv)
+#define PL_seen_evals (aTHX->Tseen_evals)
+#define PL_seen_zerolen (aTHX->Tseen_zerolen)
+#define PL_sortcop (aTHX->Tsortcop)
+#define PL_sortcxix (aTHX->Tsortcxix)
+#define PL_sortstash (aTHX->Tsortstash)
+#define PL_stack_base (aTHX->Tstack_base)
+#define PL_stack_max (aTHX->Tstack_max)
+#define PL_stack_sp (aTHX->Tstack_sp)
+#define PL_start_env (aTHX->Tstart_env)
+#define PL_statbuf (aTHX->Tstatbuf)
+#define PL_statcache (aTHX->Tstatcache)
+#define PL_statgv (aTHX->Tstatgv)
+#define PL_statname (aTHX->Tstatname)
+#define PL_tainted (aTHX->Ttainted)
+#define PL_timesbuf (aTHX->Ttimesbuf)
+#define PL_tmps_floor (aTHX->Ttmps_floor)
+#define PL_tmps_ix (aTHX->Ttmps_ix)
+#define PL_tmps_max (aTHX->Ttmps_max)
+#define PL_tmps_stack (aTHX->Ttmps_stack)
+#define PL_top_env (aTHX->Ttop_env)
+#define PL_toptarget (aTHX->Ttoptarget)
+#define PL_watchaddr (aTHX->Twatchaddr)
+#define PL_watchok (aTHX->Twatchok)
-#ifndef USE_THREADS
+# else /* !USE_THREADS */
+/* case 1 above */
#define PL_TSv PL_Sv
#define PL_TXpv PL_Xpv
@@ -419,6 +1520,10 @@
#define PL_Tdefstash PL_defstash
#define PL_Tdelaymagic PL_delaymagic
#define PL_Tdirty PL_dirty
+#define PL_Tdumpindent PL_dumpindent
+#define PL_Tefloatbuf PL_efloatbuf
+#define PL_Tefloatsize PL_efloatsize
+#define PL_Terrors PL_errors
#define PL_Textralen PL_extralen
#define PL_Tfirstgv PL_firstgv
#define PL_Tformtarget PL_formtarget
@@ -435,15 +1540,33 @@
#define PL_Tmarkstack_ptr PL_markstack_ptr
#define PL_Tmaxscream PL_maxscream
#define PL_Tmodcount PL_modcount
+#define PL_Tna PL_na
#define PL_Tnrs PL_nrs
#define PL_Tofs PL_ofs
#define PL_Tofslen PL_ofslen
#define PL_Top PL_op
#define PL_Topsave PL_opsave
+#define PL_Tprotect PL_protect
+#define PL_Treg_call_cc PL_reg_call_cc
+#define PL_Treg_curpm PL_reg_curpm
#define PL_Treg_eval_set PL_reg_eval_set
#define PL_Treg_flags PL_reg_flags
+#define PL_Treg_ganch PL_reg_ganch
+#define PL_Treg_leftiter PL_reg_leftiter
+#define PL_Treg_magic PL_reg_magic
+#define PL_Treg_maxiter PL_reg_maxiter
+#define PL_Treg_oldcurpm PL_reg_oldcurpm
+#define PL_Treg_oldpos PL_reg_oldpos
+#define PL_Treg_oldsaved PL_reg_oldsaved
+#define PL_Treg_oldsavedlen PL_reg_oldsavedlen
+#define PL_Treg_poscache PL_reg_poscache
+#define PL_Treg_poscache_size PL_reg_poscache_size
+#define PL_Treg_re PL_reg_re
#define PL_Treg_start_tmp PL_reg_start_tmp
#define PL_Treg_start_tmpl PL_reg_start_tmpl
+#define PL_Treg_starttry PL_reg_starttry
+#define PL_Treg_sv PL_reg_sv
+#define PL_Treg_whilem_seen PL_reg_whilem_seen
#define PL_Tregbol PL_regbol
#define PL_Tregcc PL_regcc
#define PL_Tregcode PL_regcode
@@ -456,8 +1579,11 @@
#define PL_Tregeol PL_regeol
#define PL_Tregexecp PL_regexecp
#define PL_Tregflags PL_regflags
+#define PL_Tregfree PL_regfree
#define PL_Tregindent PL_regindent
#define PL_Treginput PL_reginput
+#define PL_Tregint_start PL_regint_start
+#define PL_Tregint_string PL_regint_string
#define PL_Treginterp_cnt PL_reginterp_cnt
#define PL_Treglastparen PL_reglastparen
#define PL_Tregnarrate PL_regnarrate
@@ -507,364 +1633,40 @@
#define PL_Ttmps_stack PL_tmps_stack
#define PL_Ttop_env PL_top_env
#define PL_Ttoptarget PL_toptarget
+#define PL_Twatchaddr PL_watchaddr
+#define PL_Twatchok PL_watchok
-#endif /* USE_THREADS */
-
-/* Hide what would have been interpreter-specific symbols? */
-
-#ifdef EMBED
-
-
-#ifndef USE_THREADS
-
-
-#endif /* USE_THREADS */
-#endif /* EMBED */
-#endif /* MULTIPLICITY */
-
-/* Now same trickey for per-thread variables */
-
-#ifdef USE_THREADS
-
-#define PL_Sv (thr->TSv)
-#define PL_Xpv (thr->TXpv)
-#define PL_av_fetch_sv (thr->Tav_fetch_sv)
-#define PL_bodytarget (thr->Tbodytarget)
-#define PL_bostr (thr->Tbostr)
-#define PL_chopset (thr->Tchopset)
-#define PL_colors (thr->Tcolors)
-#define PL_colorset (thr->Tcolorset)
-#define PL_curcop (thr->Tcurcop)
-#define PL_curpad (thr->Tcurpad)
-#define PL_curpm (thr->Tcurpm)
-#define PL_curstack (thr->Tcurstack)
-#define PL_curstackinfo (thr->Tcurstackinfo)
-#define PL_curstash (thr->Tcurstash)
-#define PL_defoutgv (thr->Tdefoutgv)
-#define PL_defstash (thr->Tdefstash)
-#define PL_delaymagic (thr->Tdelaymagic)
-#define PL_dirty (thr->Tdirty)
-#define PL_extralen (thr->Textralen)
-#define PL_firstgv (thr->Tfirstgv)
-#define PL_formtarget (thr->Tformtarget)
-#define PL_hv_fetch_ent_mh (thr->Thv_fetch_ent_mh)
-#define PL_hv_fetch_sv (thr->Thv_fetch_sv)
-#define PL_in_eval (thr->Tin_eval)
-#define PL_last_in_gv (thr->Tlast_in_gv)
-#define PL_lastgotoprobe (thr->Tlastgotoprobe)
-#define PL_lastscream (thr->Tlastscream)
-#define PL_localizing (thr->Tlocalizing)
-#define PL_mainstack (thr->Tmainstack)
-#define PL_markstack (thr->Tmarkstack)
-#define PL_markstack_max (thr->Tmarkstack_max)
-#define PL_markstack_ptr (thr->Tmarkstack_ptr)
-#define PL_maxscream (thr->Tmaxscream)
-#define PL_modcount (thr->Tmodcount)
-#define PL_nrs (thr->Tnrs)
-#define PL_ofs (thr->Tofs)
-#define PL_ofslen (thr->Tofslen)
-#define PL_op (thr->Top)
-#define PL_opsave (thr->Topsave)
-#define PL_reg_eval_set (thr->Treg_eval_set)
-#define PL_reg_flags (thr->Treg_flags)
-#define PL_reg_start_tmp (thr->Treg_start_tmp)
-#define PL_reg_start_tmpl (thr->Treg_start_tmpl)
-#define PL_regbol (thr->Tregbol)
-#define PL_regcc (thr->Tregcc)
-#define PL_regcode (thr->Tregcode)
-#define PL_regcomp_parse (thr->Tregcomp_parse)
-#define PL_regcomp_rx (thr->Tregcomp_rx)
-#define PL_regcompp (thr->Tregcompp)
-#define PL_regdata (thr->Tregdata)
-#define PL_regdummy (thr->Tregdummy)
-#define PL_regendp (thr->Tregendp)
-#define PL_regeol (thr->Tregeol)
-#define PL_regexecp (thr->Tregexecp)
-#define PL_regflags (thr->Tregflags)
-#define PL_regindent (thr->Tregindent)
-#define PL_reginput (thr->Treginput)
-#define PL_reginterp_cnt (thr->Treginterp_cnt)
-#define PL_reglastparen (thr->Treglastparen)
-#define PL_regnarrate (thr->Tregnarrate)
-#define PL_regnaughty (thr->Tregnaughty)
-#define PL_regnpar (thr->Tregnpar)
-#define PL_regprecomp (thr->Tregprecomp)
-#define PL_regprev (thr->Tregprev)
-#define PL_regprogram (thr->Tregprogram)
-#define PL_regsawback (thr->Tregsawback)
-#define PL_regseen (thr->Tregseen)
-#define PL_regsize (thr->Tregsize)
-#define PL_regstartp (thr->Tregstartp)
-#define PL_regtill (thr->Tregtill)
-#define PL_regxend (thr->Tregxend)
-#define PL_restartop (thr->Trestartop)
-#define PL_retstack (thr->Tretstack)
-#define PL_retstack_ix (thr->Tretstack_ix)
-#define PL_retstack_max (thr->Tretstack_max)
-#define PL_rs (thr->Trs)
-#define PL_savestack (thr->Tsavestack)
-#define PL_savestack_ix (thr->Tsavestack_ix)
-#define PL_savestack_max (thr->Tsavestack_max)
-#define PL_scopestack (thr->Tscopestack)
-#define PL_scopestack_ix (thr->Tscopestack_ix)
-#define PL_scopestack_max (thr->Tscopestack_max)
-#define PL_screamfirst (thr->Tscreamfirst)
-#define PL_screamnext (thr->Tscreamnext)
-#define PL_secondgv (thr->Tsecondgv)
-#define PL_seen_evals (thr->Tseen_evals)
-#define PL_seen_zerolen (thr->Tseen_zerolen)
-#define PL_sortcop (thr->Tsortcop)
-#define PL_sortcxix (thr->Tsortcxix)
-#define PL_sortstash (thr->Tsortstash)
-#define PL_stack_base (thr->Tstack_base)
-#define PL_stack_max (thr->Tstack_max)
-#define PL_stack_sp (thr->Tstack_sp)
-#define PL_start_env (thr->Tstart_env)
-#define PL_statbuf (thr->Tstatbuf)
-#define PL_statcache (thr->Tstatcache)
-#define PL_statgv (thr->Tstatgv)
-#define PL_statname (thr->Tstatname)
-#define PL_tainted (thr->Ttainted)
-#define PL_timesbuf (thr->Ttimesbuf)
-#define PL_tmps_floor (thr->Ttmps_floor)
-#define PL_tmps_ix (thr->Ttmps_ix)
-#define PL_tmps_max (thr->Ttmps_max)
-#define PL_tmps_stack (thr->Ttmps_stack)
-#define PL_top_env (thr->Ttop_env)
-#define PL_toptarget (thr->Ttoptarget)
-
-#endif /* USE_THREADS */
-
-#ifdef PERL_GLOBAL_STRUCT
+# endif /* USE_THREADS */
+# endif /* PERL_OBJECT */
+#endif /* MULTIPLICITY */
+
+#if defined(PERL_GLOBAL_STRUCT)
#define PL_No (PL_Vars.GNo)
#define PL_Yes (PL_Vars.GYes)
-#define PL_amagic_generation (PL_Vars.Gamagic_generation)
-#define PL_an (PL_Vars.Gan)
-#define PL_bufend (PL_Vars.Gbufend)
-#define PL_bufptr (PL_Vars.Gbufptr)
-#define PL_collation_ix (PL_Vars.Gcollation_ix)
-#define PL_collation_name (PL_Vars.Gcollation_name)
-#define PL_collation_standard (PL_Vars.Gcollation_standard)
-#define PL_collxfrm_base (PL_Vars.Gcollxfrm_base)
-#define PL_collxfrm_mult (PL_Vars.Gcollxfrm_mult)
-#define PL_cop_seqmax (PL_Vars.Gcop_seqmax)
-#define PL_cred_mutex (PL_Vars.Gcred_mutex)
-#define PL_cryptseen (PL_Vars.Gcryptseen)
-#define PL_cshlen (PL_Vars.Gcshlen)
-#define PL_cshname (PL_Vars.Gcshname)
#define PL_curinterp (PL_Vars.Gcurinterp)
-#define PL_curthr (PL_Vars.Gcurthr)
-#define PL_debug (PL_Vars.Gdebug)
#define PL_do_undump (PL_Vars.Gdo_undump)
-#define PL_egid (PL_Vars.Gegid)
-#define PL_error_count (PL_Vars.Gerror_count)
-#define PL_euid (PL_Vars.Geuid)
-#define PL_eval_cond (PL_Vars.Geval_cond)
-#define PL_eval_mutex (PL_Vars.Geval_mutex)
-#define PL_eval_owner (PL_Vars.Geval_owner)
-#define PL_evalseq (PL_Vars.Gevalseq)
-#define PL_expect (PL_Vars.Gexpect)
-#define PL_gid (PL_Vars.Ggid)
-#define PL_he_root (PL_Vars.Ghe_root)
#define PL_hexdigit (PL_Vars.Ghexdigit)
-#define PL_hints (PL_Vars.Ghints)
-#define PL_in_my (PL_Vars.Gin_my)
-#define PL_in_my_stash (PL_Vars.Gin_my_stash)
-#define PL_last_lop (PL_Vars.Glast_lop)
-#define PL_last_lop_op (PL_Vars.Glast_lop_op)
-#define PL_last_uni (PL_Vars.Glast_uni)
-#define PL_lex_brackets (PL_Vars.Glex_brackets)
-#define PL_lex_brackstack (PL_Vars.Glex_brackstack)
-#define PL_lex_casemods (PL_Vars.Glex_casemods)
-#define PL_lex_casestack (PL_Vars.Glex_casestack)
-#define PL_lex_defer (PL_Vars.Glex_defer)
-#define PL_lex_dojoin (PL_Vars.Glex_dojoin)
-#define PL_lex_expect (PL_Vars.Glex_expect)
-#define PL_lex_fakebrack (PL_Vars.Glex_fakebrack)
-#define PL_lex_formbrack (PL_Vars.Glex_formbrack)
-#define PL_lex_inpat (PL_Vars.Glex_inpat)
-#define PL_lex_inwhat (PL_Vars.Glex_inwhat)
-#define PL_lex_op (PL_Vars.Glex_op)
-#define PL_lex_repl (PL_Vars.Glex_repl)
-#define PL_lex_starts (PL_Vars.Glex_starts)
-#define PL_lex_state (PL_Vars.Glex_state)
-#define PL_lex_stuff (PL_Vars.Glex_stuff)
-#define PL_linestr (PL_Vars.Glinestr)
#define PL_malloc_mutex (PL_Vars.Gmalloc_mutex)
-#define PL_max_intro_pending (PL_Vars.Gmax_intro_pending)
-#define PL_maxo (PL_Vars.Gmaxo)
-#define PL_min_intro_pending (PL_Vars.Gmin_intro_pending)
-#define PL_multi_close (PL_Vars.Gmulti_close)
-#define PL_multi_end (PL_Vars.Gmulti_end)
-#define PL_multi_open (PL_Vars.Gmulti_open)
-#define PL_multi_start (PL_Vars.Gmulti_start)
-#define PL_na (PL_Vars.Gna)
-#define PL_nexttoke (PL_Vars.Gnexttoke)
-#define PL_nexttype (PL_Vars.Gnexttype)
-#define PL_nextval (PL_Vars.Gnextval)
-#define PL_nice_chunk (PL_Vars.Gnice_chunk)
-#define PL_nice_chunk_size (PL_Vars.Gnice_chunk_size)
-#define PL_ninterps (PL_Vars.Gninterps)
-#define PL_nomemok (PL_Vars.Gnomemok)
-#define PL_nthreads (PL_Vars.Gnthreads)
-#define PL_nthreads_cond (PL_Vars.Gnthreads_cond)
-#define PL_numeric_local (PL_Vars.Gnumeric_local)
-#define PL_numeric_name (PL_Vars.Gnumeric_name)
-#define PL_numeric_standard (PL_Vars.Gnumeric_standard)
-#define PL_oldbufptr (PL_Vars.Goldbufptr)
-#define PL_oldoldbufptr (PL_Vars.Goldoldbufptr)
-#define PL_op_seqmax (PL_Vars.Gop_seqmax)
-#define PL_origalen (PL_Vars.Gorigalen)
-#define PL_origenviron (PL_Vars.Gorigenviron)
-#define PL_osname (PL_Vars.Gosname)
-#define PL_pad_reset_pending (PL_Vars.Gpad_reset_pending)
-#define PL_padix (PL_Vars.Gpadix)
-#define PL_padix_floor (PL_Vars.Gpadix_floor)
+#define PL_op_mutex (PL_Vars.Gop_mutex)
#define PL_patleave (PL_Vars.Gpatleave)
-#define PL_pidstatus (PL_Vars.Gpidstatus)
-#define PL_runops (PL_Vars.Grunops)
-#define PL_sh_path (PL_Vars.Gsh_path)
-#define PL_sighandlerp (PL_Vars.Gsighandlerp)
-#define PL_specialsv_list (PL_Vars.Gspecialsv_list)
-#define PL_subline (PL_Vars.Gsubline)
-#define PL_subname (PL_Vars.Gsubname)
-#define PL_sv_mutex (PL_Vars.Gsv_mutex)
-#define PL_sv_no (PL_Vars.Gsv_no)
-#define PL_sv_undef (PL_Vars.Gsv_undef)
-#define PL_sv_yes (PL_Vars.Gsv_yes)
-#define PL_svref_mutex (PL_Vars.Gsvref_mutex)
-#define PL_thisexpr (PL_Vars.Gthisexpr)
#define PL_thr_key (PL_Vars.Gthr_key)
-#define PL_threads_mutex (PL_Vars.Gthreads_mutex)
-#define PL_threadsv_names (PL_Vars.Gthreadsv_names)
-#define PL_tokenbuf (PL_Vars.Gtokenbuf)
-#define PL_uid (PL_Vars.Guid)
-#define PL_xiv_arenaroot (PL_Vars.Gxiv_arenaroot)
-#define PL_xiv_root (PL_Vars.Gxiv_root)
-#define PL_xnv_root (PL_Vars.Gxnv_root)
-#define PL_xpv_root (PL_Vars.Gxpv_root)
-#define PL_xrv_root (PL_Vars.Gxrv_root)
#else /* !PERL_GLOBAL_STRUCT */
#define PL_GNo PL_No
#define PL_GYes PL_Yes
-#define PL_Gamagic_generation PL_amagic_generation
-#define PL_Gan PL_an
-#define PL_Gbufend PL_bufend
-#define PL_Gbufptr PL_bufptr
-#define PL_Gcollation_ix PL_collation_ix
-#define PL_Gcollation_name PL_collation_name
-#define PL_Gcollation_standard PL_collation_standard
-#define PL_Gcollxfrm_base PL_collxfrm_base
-#define PL_Gcollxfrm_mult PL_collxfrm_mult
-#define PL_Gcop_seqmax PL_cop_seqmax
-#define PL_Gcred_mutex PL_cred_mutex
-#define PL_Gcryptseen PL_cryptseen
-#define PL_Gcshlen PL_cshlen
-#define PL_Gcshname PL_cshname
#define PL_Gcurinterp PL_curinterp
-#define PL_Gcurthr PL_curthr
-#define PL_Gdebug PL_debug
#define PL_Gdo_undump PL_do_undump
-#define PL_Gegid PL_egid
-#define PL_Gerror_count PL_error_count
-#define PL_Geuid PL_euid
-#define PL_Geval_cond PL_eval_cond
-#define PL_Geval_mutex PL_eval_mutex
-#define PL_Geval_owner PL_eval_owner
-#define PL_Gevalseq PL_evalseq
-#define PL_Gexpect PL_expect
-#define PL_Ggid PL_gid
-#define PL_Ghe_root PL_he_root
#define PL_Ghexdigit PL_hexdigit
-#define PL_Ghints PL_hints
-#define PL_Gin_my PL_in_my
-#define PL_Gin_my_stash PL_in_my_stash
-#define PL_Glast_lop PL_last_lop
-#define PL_Glast_lop_op PL_last_lop_op
-#define PL_Glast_uni PL_last_uni
-#define PL_Glex_brackets PL_lex_brackets
-#define PL_Glex_brackstack PL_lex_brackstack
-#define PL_Glex_casemods PL_lex_casemods
-#define PL_Glex_casestack PL_lex_casestack
-#define PL_Glex_defer PL_lex_defer
-#define PL_Glex_dojoin PL_lex_dojoin
-#define PL_Glex_expect PL_lex_expect
-#define PL_Glex_fakebrack PL_lex_fakebrack
-#define PL_Glex_formbrack PL_lex_formbrack
-#define PL_Glex_inpat PL_lex_inpat
-#define PL_Glex_inwhat PL_lex_inwhat
-#define PL_Glex_op PL_lex_op
-#define PL_Glex_repl PL_lex_repl
-#define PL_Glex_starts PL_lex_starts
-#define PL_Glex_state PL_lex_state
-#define PL_Glex_stuff PL_lex_stuff
-#define PL_Glinestr PL_linestr
#define PL_Gmalloc_mutex PL_malloc_mutex
-#define PL_Gmax_intro_pending PL_max_intro_pending
-#define PL_Gmaxo PL_maxo
-#define PL_Gmin_intro_pending PL_min_intro_pending
-#define PL_Gmulti_close PL_multi_close
-#define PL_Gmulti_end PL_multi_end
-#define PL_Gmulti_open PL_multi_open
-#define PL_Gmulti_start PL_multi_start
-#define PL_Gna PL_na
-#define PL_Gnexttoke PL_nexttoke
-#define PL_Gnexttype PL_nexttype
-#define PL_Gnextval PL_nextval
-#define PL_Gnice_chunk PL_nice_chunk
-#define PL_Gnice_chunk_size PL_nice_chunk_size
-#define PL_Gninterps PL_ninterps
-#define PL_Gnomemok PL_nomemok
-#define PL_Gnthreads PL_nthreads
-#define PL_Gnthreads_cond PL_nthreads_cond
-#define PL_Gnumeric_local PL_numeric_local
-#define PL_Gnumeric_name PL_numeric_name
-#define PL_Gnumeric_standard PL_numeric_standard
-#define PL_Goldbufptr PL_oldbufptr
-#define PL_Goldoldbufptr PL_oldoldbufptr
-#define PL_Gop_seqmax PL_op_seqmax
-#define PL_Gorigalen PL_origalen
-#define PL_Gorigenviron PL_origenviron
-#define PL_Gosname PL_osname
-#define PL_Gpad_reset_pending PL_pad_reset_pending
-#define PL_Gpadix PL_padix
-#define PL_Gpadix_floor PL_padix_floor
+#define PL_Gop_mutex PL_op_mutex
#define PL_Gpatleave PL_patleave
-#define PL_Gpidstatus PL_pidstatus
-#define PL_Grunops PL_runops
-#define PL_Gsh_path PL_sh_path
-#define PL_Gsighandlerp PL_sighandlerp
-#define PL_Gspecialsv_list PL_specialsv_list
-#define PL_Gsubline PL_subline
-#define PL_Gsubname PL_subname
-#define PL_Gsv_mutex PL_sv_mutex
-#define PL_Gsv_no PL_sv_no
-#define PL_Gsv_undef PL_sv_undef
-#define PL_Gsv_yes PL_sv_yes
-#define PL_Gsvref_mutex PL_svref_mutex
-#define PL_Gthisexpr PL_thisexpr
#define PL_Gthr_key PL_thr_key
-#define PL_Gthreads_mutex PL_threads_mutex
-#define PL_Gthreadsv_names PL_threadsv_names
-#define PL_Gtokenbuf PL_tokenbuf
-#define PL_Guid PL_uid
-#define PL_Gxiv_arenaroot PL_xiv_arenaroot
-#define PL_Gxiv_root PL_xiv_root
-#define PL_Gxnv_root PL_xnv_root
-#define PL_Gxpv_root PL_xpv_root
-#define PL_Gxrv_root PL_xrv_root
-
-#ifdef EMBED
-
-#endif /* EMBED */
#endif /* PERL_GLOBAL_STRUCT */
-
-#ifndef MIN_PERL_DEFINE
+#ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
#define DBsingle PL_DBsingle
#define DBsub PL_DBsub
@@ -878,6 +1680,7 @@
#define dowarn PL_dowarn
#define errgv PL_errgv
#define na PL_na
+#define no_modify PL_no_modify
#define perl_destruct_level PL_perl_destruct_level
#define perldb PL_perldb
#define rsfp PL_rsfp
@@ -892,4 +1695,4 @@
#define tainted PL_tainted
#define tainting PL_tainting
-#endif /* MIN_PERL_DEFINE */
+#endif /* PERL_POLLUTE */
diff --git a/contrib/perl5/ext/B/B.pm b/contrib/perl5/ext/B/B.pm
index 75dcfb3..4512d91 100644
--- a/contrib/perl5/ext/B/B.pm
+++ b/contrib/perl5/ext/B/B.pm
@@ -6,15 +6,15 @@
# License or the Artistic License, as specified in the README file.
#
package B;
-require DynaLoader;
+use XSLoader ();
require Exporter;
-@ISA = qw(Exporter DynaLoader);
-@EXPORT_OK = qw(byteload_fh byteload_string minus_c ppname
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(minus_c ppname
class peekop cast_I32 cstring cchar hash threadsv_names
- main_root main_start main_cv svref_2object
+ main_root main_start main_cv svref_2object opnumber amagic_generation
walkoptree walkoptree_slow walkoptree_exec walksymtable
parents comppadlist sv_undef compile_stats timing_info init_av);
-
+sub OPf_KIDS ();
use strict;
@B::SV::ISA = 'B::OBJECT';
@B::NULL::ISA = 'B::SV';
@@ -38,10 +38,9 @@ use strict;
@B::UNOP::ISA = 'B::OP';
@B::BINOP::ISA = 'B::UNOP';
@B::LOGOP::ISA = 'B::UNOP';
-@B::CONDOP::ISA = 'B::UNOP';
@B::LISTOP::ISA = 'B::BINOP';
@B::SVOP::ISA = 'B::OP';
-@B::GVOP::ISA = 'B::OP';
+@B::PADOP::ISA = 'B::OP';
@B::PVOP::ISA = 'B::OP';
@B::CVOP::ISA = 'B::OP';
@B::LOOP::ISA = 'B::LISTOP';
@@ -65,10 +64,6 @@ sub debug {
walkoptree_debug($value);
}
-# sub OPf_KIDS;
-# add to .xs for perl5.002
-sub OPf_KIDS () { 4 }
-
sub class {
my $obj = shift;
my $name = ref $obj;
@@ -81,7 +76,7 @@ sub parents { \@parents }
# For debugging
sub peekop {
my $op = shift;
- return sprintf("%s (0x%x) %s", class($op), $$op, $op->ppaddr);
+ return sprintf("%s (0x%x) %s", class($op), $$op, $op->name);
}
sub walkoptree_slow {
@@ -112,6 +107,11 @@ sub timing_info {
}
my %symtable;
+
+sub clearsym {
+ %symtable = ();
+}
+
sub savesym {
my ($obj, $value) = @_;
# warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug
@@ -135,37 +135,26 @@ sub walkoptree_exec {
}
savesym($op, sprintf("%s (0x%lx)", class($op), $$op));
$op->$method($level);
- $ppname = $op->ppaddr;
- if ($ppname =~ /^pp_(or|and|mapwhile|grepwhile|entertry)$/) {
+ $ppname = $op->name;
+ if ($ppname =~
+ /^(or|and|mapwhile|grepwhile|entertry|range|cond_expr)$/)
+ {
print $prefix, uc($1), " => {\n";
walkoptree_exec($op->other, $method, $level + 1);
print $prefix, "}\n";
- } elsif ($ppname eq "pp_match" || $ppname eq "pp_subst") {
+ } elsif ($ppname eq "match" || $ppname eq "subst") {
my $pmreplstart = $op->pmreplstart;
if ($$pmreplstart) {
print $prefix, "PMREPLSTART => {\n";
walkoptree_exec($pmreplstart, $method, $level + 1);
print $prefix, "}\n";
}
- } elsif ($ppname eq "pp_substcont") {
+ } elsif ($ppname eq "substcont") {
print $prefix, "SUBSTCONT => {\n";
walkoptree_exec($op->other->pmreplstart, $method, $level + 1);
print $prefix, "}\n";
$op = $op->other;
- } elsif ($ppname eq "pp_cond_expr") {
- # pp_cond_expr never returns op_next
- print $prefix, "TRUE => {\n";
- walkoptree_exec($op->true, $method, $level + 1);
- print $prefix, "}\n";
- $op = $op->false;
- redo;
- } elsif ($ppname eq "pp_range") {
- print $prefix, "TRUE => {\n";
- walkoptree_exec($op->true, $method, $level + 1);
- print $prefix, "}\n", $prefix, "FALSE => {\n";
- walkoptree_exec($op->false, $method, $level + 1);
- print $prefix, "}\n";
- } elsif ($ppname eq "pp_enterloop") {
+ } elsif ($ppname eq "enterloop") {
print $prefix, "REDO => {\n";
walkoptree_exec($op->redoop, $method, $level + 1);
print $prefix, "}\n", $prefix, "NEXT => {\n";
@@ -173,7 +162,7 @@ sub walkoptree_exec {
print $prefix, "}\n", $prefix, "LAST => {\n";
walkoptree_exec($op->lastop, $method, $level + 1);
print $prefix, "}\n";
- } elsif ($ppname eq "pp_subst") {
+ } elsif ($ppname eq "subst") {
my $replstart = $op->pmreplstart;
if ($$replstart) {
print $prefix, "SUBST => {\n";
@@ -187,9 +176,12 @@ sub walkoptree_exec {
sub walksymtable {
my ($symref, $method, $recurse, $prefix) = @_;
my $sym;
+ my $ref;
no strict 'vars';
local(*glob);
- while (($sym, *glob) = each %$symref) {
+ $prefix = '' unless defined $prefix;
+ while (($sym, $ref) = each %$symref) {
+ *glob = "*main::".$prefix.$sym;
if ($sym =~ /::$/) {
$sym = $prefix . $sym;
if ($sym ne "main::" && &$recurse($sym)) {
@@ -267,7 +259,7 @@ sub walksymtable {
}
}
-bootstrap B;
+XSLoader::load 'B';
1;
@@ -428,6 +420,10 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>).
=over 4
+=item is_empty
+
+This method returns TRUE if the GP field of the GV is NULL.
+
=item NAME
=item STASH
@@ -450,6 +446,8 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>).
=item LINE
+=item FILE
+
=item FILEGV
=item GvREFCNT
@@ -518,7 +516,7 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>).
=item GV
-=item FILEGV
+=item FILE
=item DEPTH
@@ -556,8 +554,8 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>).
=head2 OP-RELATED CLASSES
-B::OP, B::UNOP, B::BINOP, B::LOGOP, B::CONDOP, B::LISTOP, B::PMOP,
-B::SVOP, B::GVOP, B::PVOP, B::CVOP, B::LOOP, B::COP.
+B::OP, B::UNOP, B::BINOP, B::LOGOP, B::LISTOP, B::PMOP,
+B::SVOP, B::PADOP, B::PVOP, B::CVOP, B::LOOP, B::COP.
These classes correspond in
the obvious way to the underlying C structures of similar names. The
inheritance hierarchy mimics the underlying C "inheritance". Access
@@ -572,9 +570,14 @@ leading "class indication" prefix removed (op_).
=item sibling
+=item name
+
+This returns the op name as a string (e.g. "add", "rv2av").
+
=item ppaddr
-This returns the function name as a string (e.g. pp_add, pp_rv2av).
+This returns the function name as a string (e.g. "PL_ppaddr[OP_ADD]",
+"PL_ppaddr[OP_RV2AV]").
=item desc
@@ -617,16 +620,6 @@ This returns the op description from the global C PL_op_desc array
=back
-=head2 B::CONDOP METHODS
-
-=over 4
-
-=item true
-
-=item false
-
-=back
-
=head2 B::LISTOP METHOD
=over 4
@@ -661,13 +654,15 @@ This returns the op description from the global C PL_op_desc array
=item sv
+=item gv
+
=back
-=head2 B::GVOP METHOD
+=head2 B::PADOP METHOD
=over 4
-=item gv
+=item padix
=back
@@ -699,7 +694,7 @@ This returns the op description from the global C PL_op_desc array
=item stash
-=item filegv
+=item file
=item cop_seq
@@ -751,6 +746,10 @@ Returns the SV object corresponding to the C variable C<sv_yes>.
Returns the SV object corresponding to the C variable C<sv_no>.
+=item amagic_generation
+
+Returns the SV object corresponding to the C variable C<amagic_generation>.
+
=item walkoptree(OP, METHOD)
Does a tree-walk of the syntax tree based at OP and calls METHOD on
@@ -817,11 +816,6 @@ preceding the first "::". This is used to turn "B::UNOP" into
In a perl compiled for threads, this returns a list of the special
per-thread threadsv variables.
-=item byteload_fh(FILEHANDLE)
-
-Load the contents of FILEHANDLE as bytecode. See documentation for
-the B<Bytecode> module in F<B::Backend> for how to generate bytecode.
-
=back
=head1 AUTHOR
diff --git a/contrib/perl5/ext/B/B.xs b/contrib/perl5/ext/B/B.xs
index 6610ae8..9e29855 100644
--- a/contrib/perl5/ext/B/B.xs
+++ b/contrib/perl5/ext/B/B.xs
@@ -7,18 +7,18 @@
*
*/
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
-#include "INTERN.h"
#ifdef PERL_OBJECT
-#undef op_name
-#undef opargs
-#undef op_desc
-#define op_name (pPerl->Perl_get_op_names())
-#define opargs (pPerl->Perl_get_opargs())
-#define op_desc (pPerl->Perl_get_op_descs())
+#undef PL_op_name
+#undef PL_opargs
+#undef PL_op_desc
+#define PL_op_name (get_op_names())
+#define PL_opargs (get_opargs())
+#define PL_op_desc (get_op_descs())
#endif
#ifdef PerlIO
@@ -53,15 +53,14 @@ typedef enum {
OPc_UNOP, /* 2 */
OPc_BINOP, /* 3 */
OPc_LOGOP, /* 4 */
- OPc_CONDOP, /* 5 */
- OPc_LISTOP, /* 6 */
- OPc_PMOP, /* 7 */
- OPc_SVOP, /* 8 */
- OPc_GVOP, /* 9 */
- OPc_PVOP, /* 10 */
- OPc_CVOP, /* 11 */
- OPc_LOOP, /* 12 */
- OPc_COP /* 13 */
+ OPc_LISTOP, /* 5 */
+ OPc_PMOP, /* 6 */
+ OPc_SVOP, /* 7 */
+ OPc_PADOP, /* 8 */
+ OPc_PVOP, /* 9 */
+ OPc_CVOP, /* 10 */
+ OPc_LOOP, /* 11 */
+ OPc_COP /* 12 */
} opclass;
static char *opclassnames[] = {
@@ -70,11 +69,10 @@ static char *opclassnames[] = {
"B::UNOP",
"B::BINOP",
"B::LOGOP",
- "B::CONDOP",
"B::LISTOP",
"B::PMOP",
"B::SVOP",
- "B::GVOP",
+ "B::PADOP",
"B::PVOP",
"B::CVOP",
"B::LOOP",
@@ -83,8 +81,10 @@ static char *opclassnames[] = {
static int walkoptree_debug = 0; /* Flag for walkoptree debug hook */
+static SV *specialsv_list[4];
+
static opclass
-cc_opclass(OP *o)
+cc_opclass(pTHX_ OP *o)
{
if (!o)
return OPc_NULL;
@@ -95,7 +95,12 @@ cc_opclass(OP *o)
if (o->op_type == OP_SASSIGN)
return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
- switch (opargs[o->op_type] & OA_CLASS_MASK) {
+#ifdef USE_ITHREADS
+ if (o->op_type == OP_GV || o->op_type == OP_GVSV || o->op_type == OP_AELEMFAST)
+ return OPc_PADOP;
+#endif
+
+ switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
case OA_BASEOP:
return OPc_BASEOP;
@@ -108,9 +113,6 @@ cc_opclass(OP *o)
case OA_LOGOP:
return OPc_LOGOP;
- case OA_CONDOP:
- return OPc_CONDOP;
-
case OA_LISTOP:
return OPc_LISTOP;
@@ -120,11 +122,19 @@ cc_opclass(OP *o)
case OA_SVOP:
return OPc_SVOP;
- case OA_GVOP:
- return OPc_GVOP;
+ case OA_PADOP:
+ return OPc_PADOP;
- case OA_PVOP:
- return OPc_PVOP;
+ case OA_PVOP_OR_SVOP:
+ /*
+ * Character translations (tr///) are usually a PVOP, keeping a
+ * pointer to a table of shorts used to look up translations.
+ * Under utf8, however, a simple table isn't practical; instead,
+ * the OP is an SVOP, and the SV is a reference to a swash
+ * (i.e., an RV pointing to an HV).
+ */
+ return (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
+ ? OPc_SVOP : OPc_PVOP;
case OA_LOOP:
return OPc_LOOP;
@@ -150,11 +160,14 @@ cc_opclass(OP *o)
* return OPc_UNOP so that walkoptree can find our children. If
* OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
* (no argument to the operator) it's an OP; with OPf_REF set it's
- * a GVOP (and op_gv is the GV for the filehandle argument).
+ * an SVOP (and op_sv is the GV for the filehandle argument).
*/
return ((o->op_flags & OPf_KIDS) ? OPc_UNOP :
- (o->op_flags & OPf_REF) ? OPc_GVOP : OPc_BASEOP);
-
+#ifdef USE_ITHREADS
+ (o->op_flags & OPf_REF) ? OPc_PADOP : OPc_BASEOP);
+#else
+ (o->op_flags & OPf_REF) ? OPc_SVOP : OPc_BASEOP);
+#endif
case OA_LOOPEXOP:
/*
* next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
@@ -173,47 +186,47 @@ cc_opclass(OP *o)
return OPc_PVOP;
}
warn("can't determine class of operator %s, assuming BASEOP\n",
- op_name[o->op_type]);
+ PL_op_name[o->op_type]);
return OPc_BASEOP;
}
static char *
-cc_opclassname(OP *o)
+cc_opclassname(pTHX_ OP *o)
{
- return opclassnames[cc_opclass(o)];
+ return opclassnames[cc_opclass(aTHX_ o)];
}
static SV *
-make_sv_object(SV *arg, SV *sv)
+make_sv_object(pTHX_ SV *arg, SV *sv)
{
char *type = 0;
IV iv;
- for (iv = 0; iv < sizeof(PL_specialsv_list)/sizeof(SV*); iv++) {
- if (sv == PL_specialsv_list[iv]) {
+ for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
+ if (sv == specialsv_list[iv]) {
type = "B::SPECIAL";
break;
}
}
if (!type) {
type = svclassnames[SvTYPE(sv)];
- iv = (IV)sv;
+ iv = PTR2IV(sv);
}
sv_setiv(newSVrv(arg, type), iv);
return arg;
}
static SV *
-make_mg_object(SV *arg, MAGIC *mg)
+make_mg_object(pTHX_ SV *arg, MAGIC *mg)
{
- sv_setiv(newSVrv(arg, "B::MAGIC"), (IV)mg);
+ sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
return arg;
}
static SV *
-cstring(SV *sv)
+cstring(pTHX_ SV *sv)
{
- SV *sstr = newSVpv("", 0);
+ SV *sstr = newSVpvn("", 0);
STRLEN len;
char *s;
@@ -264,9 +277,9 @@ cstring(SV *sv)
}
static SV *
-cchar(SV *sv)
+cchar(pTHX_ SV *sv)
{
- SV *sstr = newSVpv("'", 0);
+ SV *sstr = newSVpvn("'", 1);
STRLEN n_a;
char *s = SvPV(sv, n_a);
@@ -303,76 +316,8 @@ cchar(SV *sv)
return sstr;
}
-#ifdef INDIRECT_BGET_MACROS
-void freadpv(U32 len, void *data)
-{
- New(666, pv.xpv_pv, len, char);
- fread(pv.xpv_pv, 1, len, (FILE*)data);
- pv.xpv_len = len;
- pv.xpv_cur = len - 1;
-}
-
-void byteload_fh(InputStream fp)
-{
- struct bytestream bs;
- bs.data = fp;
- bs.fgetc = (int(*) _((void*)))fgetc;
- bs.fread = (int(*) _((char*,size_t,size_t,void*)))fread;
- bs.freadpv = freadpv;
- byterun(bs);
-}
-
-static int fgetc_fromstring(void *data)
-{
- char **strp = (char **)data;
- return *(*strp)++;
-}
-
-static int fread_fromstring(char *argp, size_t elemsize, size_t nelem,
- void *data)
-{
- char **strp = (char **)data;
- size_t len = elemsize * nelem;
-
- memcpy(argp, *strp, len);
- *strp += len;
- return (int)len;
-}
-
-static void freadpv_fromstring(U32 len, void *data)
-{
- char **strp = (char **)data;
-
- New(666, pv.xpv_pv, len, char);
- memcpy(pv.xpv_pv, *strp, len);
- pv.xpv_len = len;
- pv.xpv_cur = len - 1;
- *strp += len;
-}
-
-void byteload_string(char *str)
-{
- struct bytestream bs;
- bs.data = &str;
- bs.fgetc = fgetc_fromstring;
- bs.fread = fread_fromstring;
- bs.freadpv = freadpv_fromstring;
- byterun(bs);
-}
-#else
-void byteload_fh(InputStream fp)
-{
- byterun(fp);
-}
-
-void byteload_string(char *str)
-{
- croak("Must compile with -DINDIRECT_BGET_MACROS for byteload_string");
-}
-#endif /* INDIRECT_BGET_MACROS */
-
void
-walkoptree(SV *opsv, char *method)
+walkoptree(pTHX_ SV *opsv, char *method)
{
dSP;
OP *o;
@@ -380,7 +325,7 @@ walkoptree(SV *opsv, char *method)
if (!SvROK(opsv))
croak("opsv is not a reference");
opsv = sv_mortalcopy(opsv);
- o = (OP*)SvIV((SV*)SvRV(opsv));
+ o = INT2PTR(OP*,SvIV((SV*)SvRV(opsv)));
if (walkoptree_debug) {
PUSHMARK(sp);
XPUSHs(opsv);
@@ -395,8 +340,8 @@ walkoptree(SV *opsv, char *method)
OP *kid;
for (kid = ((UNOP*)o)->op_first; kid; kid = kid->op_sibling) {
/* Use the same opsv. Rely on methods not to mess it up. */
- sv_setiv(newSVrv(opsv, cc_opclassname(kid)), (IV)kid);
- walkoptree(opsv, method);
+ sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid));
+ walkoptree(aTHX_ opsv, method);
}
}
}
@@ -405,11 +350,10 @@ typedef OP *B__OP;
typedef UNOP *B__UNOP;
typedef BINOP *B__BINOP;
typedef LOGOP *B__LOGOP;
-typedef CONDOP *B__CONDOP;
typedef LISTOP *B__LISTOP;
typedef PMOP *B__PMOP;
typedef SVOP *B__SVOP;
-typedef GVOP *B__GVOP;
+typedef PADOP *B__PADOP;
typedef PVOP *B__PVOP;
typedef LOOP *B__LOOP;
typedef COP *B__COP;
@@ -435,12 +379,21 @@ MODULE = B PACKAGE = B PREFIX = B_
PROTOTYPES: DISABLE
BOOT:
- INIT_SPECIALSV_LIST;
+{
+ HV *stash = gv_stashpvn("B", 1, TRUE);
+ AV *export_ok = perl_get_av("B::EXPORT_OK",TRUE);
+ specialsv_list[0] = Nullsv;
+ specialsv_list[1] = &PL_sv_undef;
+ specialsv_list[2] = &PL_sv_yes;
+ specialsv_list[3] = &PL_sv_no;
+#include "defsubs.h"
+}
#define B_main_cv() PL_main_cv
#define B_init_av() PL_initav
#define B_main_root() PL_main_root
#define B_main_start() PL_main_start
+#define B_amagic_generation() PL_amagic_generation
#define B_comppadlist() (PL_main_cv ? CvPADLIST(PL_main_cv) : CvPADLIST(PL_compcv))
#define B_sv_undef() &PL_sv_undef
#define B_sv_yes() &PL_sv_yes
@@ -458,6 +411,9 @@ B_main_root()
B::OP
B_main_start()
+long
+B_amagic_generation()
+
B::AV
B_comppadlist()
@@ -477,6 +433,8 @@ void
walkoptree(opsv, method)
SV * opsv
char * method
+ CODE:
+ walkoptree(aTHX_ opsv, method);
int
walkoptree_debug(...)
@@ -487,20 +445,7 @@ walkoptree_debug(...)
OUTPUT:
RETVAL
-int
-byteload_fh(fp)
- InputStream fp
- CODE:
- byteload_fh(fp);
- RETVAL = 1;
- OUTPUT:
- RETVAL
-
-void
-byteload_string(str)
- char * str
-
-#define address(sv) (IV)sv
+#define address(sv) PTR2IV(sv)
IV
address(sv)
@@ -514,7 +459,28 @@ svref_2object(sv)
croak("argument is not a reference");
RETVAL = (SV*)SvRV(sv);
OUTPUT:
- RETVAL
+ RETVAL
+
+void
+opnumber(name)
+char * name
+CODE:
+{
+ int i;
+ IV result = -1;
+ ST(0) = sv_newmortal();
+ if (strncmp(name,"pp_",3) == 0)
+ name += 3;
+ for (i = 0; i < PL_maxo; i++)
+ {
+ if (strcmp(name, PL_op_name[i]) == 0)
+ {
+ result = i;
+ break;
+ }
+ }
+ sv_setiv(ST(0),result);
+}
void
ppname(opnum)
@@ -523,7 +489,7 @@ ppname(opnum)
ST(0) = sv_newmortal();
if (opnum >= 0 && opnum < PL_maxo) {
sv_setpvn(ST(0), "pp_", 3);
- sv_catpv(ST(0), op_name[opnum]);
+ sv_catpv(ST(0), PL_op_name[opnum]);
}
void
@@ -533,11 +499,10 @@ hash(sv)
char *s;
STRLEN len;
U32 hash = 0;
- char hexhash[11]; /* must fit "0xffffffff" plus trailing \0 */
+ char hexhash[19]; /* must fit "0xffffffffffffffff" plus trailing \0 */
s = SvPV(sv, len);
- while (len--)
- hash = hash * 33 + *s++;
- sprintf(hexhash, "0x%x", hash);
+ PERL_HASH(hash, s, len);
+ sprintf(hexhash, "0x%"UVxf, (UV)hash);
ST(0) = sv_2mortal(newSVpv(hexhash, 0));
#define cast_I32(foo) (I32)foo
@@ -553,10 +518,18 @@ minus_c()
SV *
cstring(sv)
SV * sv
+ CODE:
+ RETVAL = cstring(aTHX_ sv);
+ OUTPUT:
+ RETVAL
SV *
cchar(sv)
SV * sv
+ CODE:
+ RETVAL = cchar(aTHX_ sv);
+ OUTPUT:
+ RETVAL
void
threadsv_names()
@@ -567,13 +540,13 @@ threadsv_names()
EXTEND(sp, len);
for (i = 0; i < len; i++)
- PUSHs(sv_2mortal(newSVpv(&PL_threadsv_names[i], 1)));
+ PUSHs(sv_2mortal(newSVpvn(&PL_threadsv_names[i], 1)));
#endif
#define OP_next(o) o->op_next
#define OP_sibling(o) o->op_sibling
-#define OP_desc(o) op_desc[o->op_type]
+#define OP_desc(o) PL_op_desc[o->op_type]
#define OP_targ(o) o->op_targ
#define OP_type(o) o->op_type
#define OP_seq(o) o->op_seq
@@ -591,18 +564,32 @@ OP_sibling(o)
B::OP o
char *
-OP_ppaddr(o)
+OP_name(o)
B::OP o
CODE:
ST(0) = sv_newmortal();
- sv_setpvn(ST(0), "pp_", 3);
- sv_catpv(ST(0), op_name[o->op_type]);
+ sv_setpv(ST(0), PL_op_name[o->op_type]);
+
+
+char *
+OP_ppaddr(o)
+ B::OP o
+ PREINIT:
+ int i;
+ SV *sv = sv_newmortal();
+ CODE:
+ sv_setpvn(sv, "PL_ppaddr[OP_", 13);
+ sv_catpv(sv, PL_op_name[o->op_type]);
+ for (i=13; i<SvCUR(sv); ++i)
+ SvPVX(sv)[i] = toUPPER(SvPVX(sv)[i]);
+ sv_catpv(sv, "]");
+ ST(0) = sv;
char *
OP_desc(o)
B::OP o
-U16
+PADOFFSET
OP_targ(o)
B::OP o
@@ -646,19 +633,6 @@ B::OP
LOGOP_other(o)
B::LOGOP o
-#define CONDOP_true(o) o->op_true
-#define CONDOP_false(o) o->op_false
-
-MODULE = B PACKAGE = B::CONDOP PREFIX = CONDOP_
-
-B::OP
-CONDOP_true(o)
- B::CONDOP o
-
-B::OP
-CONDOP_false(o)
- B::CONDOP o
-
#define LISTOP_children(o) o->op_children
MODULE = B PACKAGE = B::LISTOP PREFIX = LISTOP_
@@ -687,10 +661,10 @@ PMOP_pmreplroot(o)
if (o->op_type == OP_PUSHRE) {
sv_setiv(newSVrv(ST(0), root ?
svclassnames[SvTYPE((SV*)root)] : "B::SV"),
- (IV)root);
+ PTR2IV(root));
}
else {
- sv_setiv(newSVrv(ST(0), cc_opclassname(root)), (IV)root);
+ sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root));
}
B::OP
@@ -719,23 +693,38 @@ PMOP_precomp(o)
if (rx)
sv_setpvn(ST(0), rx->precomp, rx->prelen);
-#define SVOP_sv(o) o->op_sv
+#define SVOP_sv(o) cSVOPo->op_sv
+#define SVOP_gv(o) ((GV*)cSVOPo->op_sv)
MODULE = B PACKAGE = B::SVOP PREFIX = SVOP_
-
B::SV
SVOP_sv(o)
B::SVOP o
-#define GVOP_gv(o) o->op_gv
+B::GV
+SVOP_gv(o)
+ B::SVOP o
+
+#define PADOP_padix(o) o->op_padix
+#define PADOP_sv(o) (o->op_padix ? PL_curpad[o->op_padix] : Nullsv)
+#define PADOP_gv(o) ((o->op_padix \
+ && SvTYPE(PL_curpad[o->op_padix]) == SVt_PVGV) \
+ ? (GV*)PL_curpad[o->op_padix] : Nullgv)
+
+MODULE = B PACKAGE = B::PADOP PREFIX = PADOP_
-MODULE = B PACKAGE = B::GVOP PREFIX = GVOP_
+PADOFFSET
+PADOP_padix(o)
+ B::PADOP o
+B::SV
+PADOP_sv(o)
+ B::PADOP o
B::GV
-GVOP_gv(o)
- B::GVOP o
+PADOP_gv(o)
+ B::PADOP o
MODULE = B PACKAGE = B::PVOP PREFIX = PVOP_
@@ -770,11 +759,13 @@ LOOP_lastop(o)
B::LOOP o
#define COP_label(o) o->cop_label
-#define COP_stash(o) o->cop_stash
-#define COP_filegv(o) o->cop_filegv
+#define COP_stashpv(o) CopSTASHPV(o)
+#define COP_stash(o) CopSTASH(o)
+#define COP_file(o) CopFILE(o)
#define COP_cop_seq(o) o->cop_seq
#define COP_arybase(o) o->cop_arybase
-#define COP_line(o) o->cop_line
+#define COP_line(o) CopLINE(o)
+#define COP_warnings(o) o->cop_warnings
MODULE = B PACKAGE = B::COP PREFIX = COP_
@@ -782,12 +773,16 @@ char *
COP_label(o)
B::COP o
+char *
+COP_stashpv(o)
+ B::COP o
+
B::HV
COP_stash(o)
B::COP o
-B::GV
-COP_filegv(o)
+char *
+COP_file(o)
B::COP o
U32
@@ -802,6 +797,10 @@ U16
COP_line(o)
B::COP o
+B::SV
+COP_warnings(o)
+ B::COP o
+
MODULE = B PACKAGE = B::SV PREFIX = Sv
U32
@@ -822,6 +821,11 @@ IV
SvIVX(sv)
B::IV sv
+UV
+SvUVX(sv)
+ B::IV sv
+
+
MODULE = B PACKAGE = B::IV
#define needs64bits(sv) ((I32)SvIVX(sv) != SvIVX(sv))
@@ -844,12 +848,16 @@ packiv(sv)
* reach this code anyway (unless sizeof(IV) > 8 but then
* everything else breaks too so I'm not fussed at the moment).
*/
- wp[0] = htonl(((U32)iv) >> (sizeof(IV)*4));
+#ifdef UV_IS_QUAD
+ wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
+#else
+ wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
+#endif
wp[1] = htonl(iv & 0xffffffff);
- ST(0) = sv_2mortal(newSVpv((char *)wp, 8));
+ ST(0) = sv_2mortal(newSVpvn((char *)wp, 8));
} else {
U32 w = htonl((U32)SvIVX(sv));
- ST(0) = sv_2mortal(newSVpv((char *)&w, 4));
+ ST(0) = sv_2mortal(newSVpvn((char *)&w, 4));
}
MODULE = B PACKAGE = B::NV PREFIX = Sv
@@ -877,6 +885,14 @@ SvPV(sv)
ST(0) = sv_newmortal();
sv_setpvn(ST(0), SvPVX(sv), SvCUR(sv));
+STRLEN
+SvLEN(sv)
+ B::PV sv
+
+STRLEN
+SvCUR(sv)
+ B::PV sv
+
MODULE = B PACKAGE = B::PVMG PREFIX = Sv
void
@@ -885,7 +901,7 @@ SvMAGIC(sv)
MAGIC * mg = NO_INIT
PPCODE:
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
- XPUSHs(make_mg_object(sv_newmortal(), mg));
+ XPUSHs(make_mg_object(aTHX_ sv_newmortal(), mg));
MODULE = B PACKAGE = B::PVMG
@@ -898,6 +914,7 @@ SvSTASH(sv)
#define MgTYPE(mg) mg->mg_type
#define MgFLAGS(mg) mg->mg_flags
#define MgOBJ(mg) mg->mg_obj
+#define MgLENGTH(mg) mg->mg_len
MODULE = B PACKAGE = B::MAGIC PREFIX = Mg
@@ -921,13 +938,23 @@ B::SV
MgOBJ(mg)
B::MAGIC mg
+I32
+MgLENGTH(mg)
+ B::MAGIC mg
+
void
MgPTR(mg)
B::MAGIC mg
CODE:
ST(0) = sv_newmortal();
- if (mg->mg_ptr)
- sv_setpvn(ST(0), mg->mg_ptr, mg->mg_len);
+ if (mg->mg_ptr){
+ if (mg->mg_len >= 0){
+ sv_setpvn(ST(0), mg->mg_ptr, mg->mg_len);
+ } else {
+ if (mg->mg_len == HEf_SVKEY)
+ sv_setsv(ST(0),newRV((SV*)mg->mg_ptr));
+ }
+ }
MODULE = B PACKAGE = B::PVLV PREFIX = Lv
@@ -969,7 +996,7 @@ BmTABLE(sv)
CODE:
str = SvPV(sv, len);
/* Boyer-Moore table is just after string and its safety-margin \0 */
- ST(0) = sv_2mortal(newSVpv(str + len + 1, 256));
+ ST(0) = sv_2mortal(newSVpvn(str + len + 1, 256));
MODULE = B PACKAGE = B::GV PREFIX = Gv
@@ -977,7 +1004,15 @@ void
GvNAME(gv)
B::GV gv
CODE:
- ST(0) = sv_2mortal(newSVpv(GvNAME(gv), GvNAMELEN(gv)));
+ ST(0) = sv_2mortal(newSVpvn(GvNAME(gv), GvNAMELEN(gv)));
+
+bool
+is_empty(gv)
+ B::GV gv
+ CODE:
+ RETVAL = GvGP(gv) == Null(GP*);
+ OUTPUT:
+ RETVAL
B::HV
GvSTASH(gv)
@@ -1019,6 +1054,10 @@ U16
GvLINE(gv)
B::GV gv
+char *
+GvFILE(gv)
+ B::GV gv
+
B::GV
GvFILEGV(gv)
B::GV gv
@@ -1113,7 +1152,7 @@ AvARRAY(av)
SV **svp = AvARRAY(av);
I32 i;
for (i = 0; i <= AvFILL(av); i++)
- XPUSHs(make_sv_object(sv_newmortal(), svp[i]));
+ XPUSHs(make_sv_object(aTHX_ sv_newmortal(), svp[i]));
}
MODULE = B PACKAGE = B::AV
@@ -1140,8 +1179,8 @@ B::GV
CvGV(cv)
B::CV cv
-B::GV
-CvFILEGV(cv)
+char *
+CvFILE(cv)
B::CV cv
long
@@ -1160,7 +1199,7 @@ void
CvXSUB(cv)
B::CV cv
CODE:
- ST(0) = sv_2mortal(newSViv((IV)CvXSUB(cv)));
+ ST(0) = sv_2mortal(newSViv(PTR2IV(CvXSUB(cv))));
void
@@ -1213,7 +1252,7 @@ HvARRAY(hv)
(void)hv_iterinit(hv);
EXTEND(sp, HvKEYS(hv) * 2);
while (sv = hv_iternextsv(hv, &key, &len)) {
- PUSHs(newSVpv(key, len));
- PUSHs(make_sv_object(sv_newmortal(), sv));
+ PUSHs(newSVpvn(key, len));
+ PUSHs(make_sv_object(aTHX_ sv_newmortal(), sv));
}
}
diff --git a/contrib/perl5/ext/B/B/Asmdata.pm b/contrib/perl5/ext/B/B/Asmdata.pm
index f3e57a1..bc0eda9 100644
--- a/contrib/perl5/ext/B/B/Asmdata.pm
+++ b/contrib/perl5/ext/B/B/Asmdata.pm
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1996-1998 Malcolm Beattie
+# Copyright (c) 1996-1999 Malcolm Beattie
#
# You may distribute under the terms of either the GNU General Public
# License or the Artistic License, as specified in the README file.
@@ -12,9 +12,9 @@ package B::Asmdata;
use Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(%insn_data @insn_name @optype @specialsv_name);
-use vars qw(%insn_data @insn_name @optype @specialsv_name);
+our(%insn_data, @insn_name, @optype, @specialsv_name);
-@optype = qw(OP UNOP BINOP LOGOP CONDOP LISTOP PMOP SVOP GVOP PVOP LOOP COP);
+@optype = qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP);
@specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no);
# XXX insn_data is initialised this way because with a large
@@ -42,7 +42,7 @@ $insn_data{xrv} = [17, \&PUT_svindex, "GET_svindex"];
$insn_data{xpv} = [18, \&PUT_none, "GET_none"];
$insn_data{xiv32} = [19, \&PUT_I32, "GET_I32"];
$insn_data{xiv64} = [20, \&PUT_IV64, "GET_IV64"];
-$insn_data{xnv} = [21, \&PUT_double, "GET_double"];
+$insn_data{xnv} = [21, \&PUT_NV, "GET_NV"];
$insn_data{xlv_targoff} = [22, \&PUT_U32, "GET_U32"];
$insn_data{xlv_targlen} = [23, \&PUT_U32, "GET_U32"];
$insn_data{xlv_targ} = [24, \&PUT_svindex, "GET_svindex"];
@@ -68,11 +68,11 @@ $insn_data{xcv_stash} = [44, \&PUT_svindex, "GET_svindex"];
$insn_data{xcv_start} = [45, \&PUT_opindex, "GET_opindex"];
$insn_data{xcv_root} = [46, \&PUT_opindex, "GET_opindex"];
$insn_data{xcv_gv} = [47, \&PUT_svindex, "GET_svindex"];
-$insn_data{xcv_filegv} = [48, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_file} = [48, \&PUT_pvcontents, "GET_pvcontents"];
$insn_data{xcv_depth} = [49, \&PUT_I32, "GET_I32"];
$insn_data{xcv_padlist} = [50, \&PUT_svindex, "GET_svindex"];
$insn_data{xcv_outside} = [51, \&PUT_svindex, "GET_svindex"];
-$insn_data{xcv_flags} = [52, \&PUT_U8, "GET_U8"];
+$insn_data{xcv_flags} = [52, \&PUT_U16, "GET_U16"];
$insn_data{av_extend} = [53, \&PUT_I32, "GET_I32"];
$insn_data{av_push} = [54, \&PUT_svindex, "GET_svindex"];
$insn_data{xav_fill} = [55, \&PUT_I32, "GET_I32"];
@@ -95,7 +95,7 @@ $insn_data{gp_refcnt_add} = [71, \&PUT_I32, "GET_I32"];
$insn_data{gp_av} = [72, \&PUT_svindex, "GET_svindex"];
$insn_data{gp_hv} = [73, \&PUT_svindex, "GET_svindex"];
$insn_data{gp_cv} = [74, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_filegv} = [75, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_file} = [75, \&PUT_pvcontents, "GET_pvcontents"];
$insn_data{gp_io} = [76, \&PUT_svindex, "GET_svindex"];
$insn_data{gp_form} = [77, \&PUT_svindex, "GET_svindex"];
$insn_data{gp_cvgen} = [78, \&PUT_U32, "GET_U32"];
@@ -113,32 +113,31 @@ $insn_data{op_private} = [89, \&PUT_U8, "GET_U8"];
$insn_data{op_first} = [90, \&PUT_opindex, "GET_opindex"];
$insn_data{op_last} = [91, \&PUT_opindex, "GET_opindex"];
$insn_data{op_other} = [92, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_true} = [93, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_false} = [94, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_children} = [95, \&PUT_U32, "GET_U32"];
-$insn_data{op_pmreplroot} = [96, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_pmreplrootgv} = [97, \&PUT_svindex, "GET_svindex"];
-$insn_data{op_pmreplstart} = [98, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_pmnext} = [99, \&PUT_opindex, "GET_opindex"];
-$insn_data{pregcomp} = [100, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{op_pmflags} = [101, \&PUT_U16, "GET_U16"];
-$insn_data{op_pmpermflags} = [102, \&PUT_U16, "GET_U16"];
-$insn_data{op_sv} = [103, \&PUT_svindex, "GET_svindex"];
-$insn_data{op_gv} = [104, \&PUT_svindex, "GET_svindex"];
-$insn_data{op_pv} = [105, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{op_pv_tr} = [106, \&PUT_op_tr_array, "GET_op_tr_array"];
-$insn_data{op_redoop} = [107, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_nextop} = [108, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_lastop} = [109, \&PUT_opindex, "GET_opindex"];
-$insn_data{cop_label} = [110, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{cop_stash} = [111, \&PUT_svindex, "GET_svindex"];
-$insn_data{cop_filegv} = [112, \&PUT_svindex, "GET_svindex"];
-$insn_data{cop_seq} = [113, \&PUT_U32, "GET_U32"];
-$insn_data{cop_arybase} = [114, \&PUT_I32, "GET_I32"];
-$insn_data{cop_line} = [115, \&PUT_U16, "GET_U16"];
-$insn_data{main_start} = [116, \&PUT_opindex, "GET_opindex"];
-$insn_data{main_root} = [117, \&PUT_opindex, "GET_opindex"];
-$insn_data{curpad} = [118, \&PUT_svindex, "GET_svindex"];
+$insn_data{op_children} = [93, \&PUT_U32, "GET_U32"];
+$insn_data{op_pmreplroot} = [94, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmreplrootgv} = [95, \&PUT_svindex, "GET_svindex"];
+$insn_data{op_pmreplstart} = [96, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmnext} = [97, \&PUT_opindex, "GET_opindex"];
+$insn_data{pregcomp} = [98, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{op_pmflags} = [99, \&PUT_U16, "GET_U16"];
+$insn_data{op_pmpermflags} = [100, \&PUT_U16, "GET_U16"];
+$insn_data{op_sv} = [101, \&PUT_svindex, "GET_svindex"];
+$insn_data{op_padix} = [102, \&PUT_U32, "GET_U32"];
+$insn_data{op_pv} = [103, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{op_pv_tr} = [104, \&PUT_op_tr_array, "GET_op_tr_array"];
+$insn_data{op_redoop} = [105, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_nextop} = [106, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_lastop} = [107, \&PUT_opindex, "GET_opindex"];
+$insn_data{cop_label} = [108, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{cop_stashpv} = [109, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{cop_file} = [110, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{cop_seq} = [111, \&PUT_U32, "GET_U32"];
+$insn_data{cop_arybase} = [112, \&PUT_I32, "GET_I32"];
+$insn_data{cop_line} = [113, \&PUT_U16, "GET_U16"];
+$insn_data{cop_warnings} = [114, \&PUT_svindex, "GET_svindex"];
+$insn_data{main_start} = [115, \&PUT_opindex, "GET_opindex"];
+$insn_data{main_root} = [116, \&PUT_opindex, "GET_opindex"];
+$insn_data{curpad} = [117, \&PUT_svindex, "GET_svindex"];
my ($insn_name, $insn_data);
while (($insn_name, $insn_data) = each %insn_data) {
diff --git a/contrib/perl5/ext/B/B/Assembler.pm b/contrib/perl5/ext/B/B/Assembler.pm
index 06e00ad..6c51a9a 100644
--- a/contrib/perl5/ext/B/B/Assembler.pm
+++ b/contrib/perl5/ext/B/B/Assembler.pm
@@ -52,6 +52,7 @@ sub B::Asmdata::PUT_U8 {
sub B::Asmdata::PUT_U16 { pack("n", $_[0]) }
sub B::Asmdata::PUT_U32 { pack("N", $_[0]) }
sub B::Asmdata::PUT_I32 { pack("N", $_[0]) }
+sub B::Asmdata::PUT_NV { sprintf("%lf\0", $_[0]) }
sub B::Asmdata::PUT_objindex { pack("N", $_[0]) } # could allow names here
sub B::Asmdata::PUT_svindex { &B::Asmdata::PUT_objindex }
sub B::Asmdata::PUT_opindex { &B::Asmdata::PUT_objindex }
diff --git a/contrib/perl5/ext/B/B/Bblock.pm b/contrib/perl5/ext/B/B/Bblock.pm
index a54431b..fe7fc52 100644
--- a/contrib/perl5/ext/B/B/Bblock.pm
+++ b/contrib/perl5/ext/B/B/Bblock.pm
@@ -4,7 +4,9 @@ use Exporter ();
@EXPORT_OK = qw(find_leaders);
use B qw(peekop walkoptree walkoptree_exec
- main_root main_start svref_2object);
+ main_root main_start svref_2object
+ OPf_SPECIAL OPf_STACKED );
+
use B::Terse;
use strict;
@@ -18,11 +20,18 @@ sub mark_leader {
}
}
+sub remove_sortblock{
+ foreach (keys %$bblock){
+ my $leader=$$bblock{$_};
+ delete $$bblock{$_} if( $leader == 0);
+ }
+}
sub find_leaders {
my ($root, $start) = @_;
$bblock = {};
- mark_leader($start);
- walkoptree($root, "mark_if_leader");
+ mark_leader($start) if ( ref $start ne "B::NULL" );
+ walkoptree($root, "mark_if_leader") if ((ref $root) ne "B::NULL") ;
+ remove_sortblock();
return $bblock;
}
@@ -81,25 +90,32 @@ sub B::LOOP::mark_if_leader {
sub B::LOGOP::mark_if_leader {
my $op = shift;
- my $ppaddr = $op->ppaddr;
+ my $opname = $op->name;
mark_leader($op->next);
- if ($ppaddr eq "pp_entertry") {
+ if ($opname eq "entertry") {
mark_leader($op->other->next);
} else {
mark_leader($op->other);
}
}
-sub B::CONDOP::mark_if_leader {
+sub B::LISTOP::mark_if_leader {
my $op = shift;
+ my $first=$op->first;
+ $first=$first->next while ($first->name eq "null");
+ mark_leader($op->first) unless (exists( $bblock->{$$first}));
mark_leader($op->next);
- mark_leader($op->true);
- mark_leader($op->false);
+ if ($op->name eq "sort" and $op->flags & OPf_SPECIAL
+ and $op->flags & OPf_STACKED){
+ my $root=$op->first->sibling->first;
+ my $leader=$root->first;
+ $bblock->{$$leader} = 0;
+ }
}
sub B::PMOP::mark_if_leader {
my $op = shift;
- if ($op->ppaddr ne "pp_pushre") {
+ if ($op->name ne "pushre") {
my $replroot = $op->pmreplroot;
if ($$replroot) {
mark_leader($replroot);
@@ -113,6 +129,7 @@ sub B::PMOP::mark_if_leader {
sub compile {
my @options = @_;
+ B::clearsym();
if (@options) {
return sub {
my $objname;
@@ -134,7 +151,6 @@ sub compile {
# The ops pointed at by nextop, redoop and lastop->op_next of a LOOP
# The ops pointed at by op_next and op_other of a LOGOP, except
# for pp_entertry which has op_next and op_other->op_next
-# The ops pointed at by op_true and op_false of a CONDOP
# The op pointed at by op_pmreplstart of a PMOP
# The op pointed at by op_other->op_pmreplstart of pp_substcont?
# [The op after a pp_return] Omit
@@ -153,7 +169,9 @@ B::Bblock - Walk basic blocks
=head1 DESCRIPTION
-See F<ext/B/README>.
+This module is used by the B::CC back end. It walks "basic blocks".
+A basic block is a series of operations which is known to execute from
+start to finish, with no possiblity of branching or halting.
=head1 AUTHOR
diff --git a/contrib/perl5/ext/B/B/Bytecode.pm b/contrib/perl5/ext/B/B/Bytecode.pm
index 0c5a58d..27003b6 100644
--- a/contrib/perl5/ext/B/B/Bytecode.pm
+++ b/contrib/perl5/ext/B/B/Bytecode.pm
@@ -11,7 +11,9 @@ use Carp;
use IO::File;
use B qw(minus_c main_cv main_root main_start comppadlist
- class peekop walkoptree svref_2object cstring walksymtable);
+ class peekop walkoptree svref_2object cstring walksymtable
+ SVf_POK SVp_POK SVf_IOK SVp_IOK
+ );
use B::Asmdata qw(@optype @specialsv_name);
use B::Assembler qw(assemble_fh);
@@ -23,11 +25,11 @@ for ($i = 0; $i < @optype; $i++) {
# Following is SVf_POK|SVp_POK
# XXX Shouldn't be hardwired
-sub POK () { 0x04040000 }
+sub POK () { SVf_POK|SVp_POK }
-# Following is SVf_IOK|SVp_OK
+# Following is SVf_IOK|SVp_IOK
# XXX Shouldn't be hardwired
-sub IOK () { 0x01010000 }
+sub IOK () { SVf_IOK|SVp_IOK }
my ($verbose, $module_only, $no_assemble, $debug_bc, $debug_cv);
my $assembler_pid;
@@ -191,7 +193,7 @@ sub B::OP::bytecode {
ldop($ix);
print "op_next $nextix\n";
print "op_sibling $sibix\n" unless $strip_syntree;
- printf "op_type %s\t# %d\n", $op->ppaddr, $type;
+ printf "op_type %s\t# %d\n", "pp_" . $op->name, $type;
printf("op_seq %d\n", $op->seq) unless $omit_seq;
if ($type || !$compress_nullops) {
printf "op_targ %d\nop_flags 0x%x\nop_private 0x%x\n",
@@ -224,13 +226,11 @@ sub B::SVOP::bytecode {
$sv->bytecode;
}
-sub B::GVOP::bytecode {
+sub B::PADOP::bytecode {
my $op = shift;
- my $gv = $op->gv;
- my $gvix = $gv->objix;
+ my $padix = $op->padix;
$op->B::OP::bytecode;
- print "op_gv $gvix\n";
- $gv->bytecode;
+ print "op_padix $padix\n";
}
sub B::PVOP::bytecode {
@@ -241,7 +241,7 @@ sub B::PVOP::bytecode {
# This would be easy except that OP_TRANS uses a PVOP to store an
# endian-dependent array of 256 shorts instead of a plain string.
#
- if ($op->ppaddr eq "pp_trans") {
+ if ($op->name eq "trans") {
my @shorts = unpack("s256", $pv); # assembler handles endianness
print "op_pv_tr ", join(",", @shorts), "\n";
} else {
@@ -258,14 +258,6 @@ sub B::BINOP::bytecode {
}
}
-sub B::CONDOP::bytecode {
- my $op = shift;
- my $trueix = $op->true->objix;
- my $falseix = $op->false->objix;
- $op->B::UNOP::bytecode;
- print "op_true $trueix\nop_false $falseix\n";
-}
-
sub B::LISTOP::bytecode {
my $op = shift;
my $children = $op->children;
@@ -286,26 +278,27 @@ sub B::LOOP::bytecode {
sub B::COP::bytecode {
my $op = shift;
- my $stash = $op->stash;
- my $stashix = $stash->objix;
- my $filegv = $op->filegv;
- my $filegvix = $filegv->objix;
+ my $stashpv = $op->stashpv;
+ my $file = $op->file;
my $line = $op->line;
+ my $warnings = $op->warnings;
+ my $warningsix = $warnings->objix;
if ($debug_bc) {
- printf "# line %s:%d\n", $filegv->SV->PV, $line;
+ printf "# line %s:%d\n", $file, $line;
}
$op->B::OP::bytecode;
- printf <<"EOT", pvstring($op->label), $op->cop_seq, $op->arybase;
+ printf <<"EOT", pvstring($op->label), pvstring($stashpv), $op->cop_seq, pvstring($file), $op->arybase;
newpv %s
cop_label
-cop_stash $stashix
+newpv %s
+cop_stashpv
cop_seq %d
-cop_filegv $filegvix
+newpv %s
+cop_file
cop_arybase %d
cop_line $line
+cop_warnings $warningsix
EOT
- $filegv->bytecode;
- $stash->bytecode;
}
sub B::PMOP::bytecode {
@@ -313,7 +306,7 @@ sub B::PMOP::bytecode {
my $replroot = $op->pmreplroot;
my $replrootix = $replroot->objix;
my $replstartix = $op->pmreplstart->objix;
- my $ppaddr = $op->ppaddr;
+ my $opname = $op->name;
# pmnext is corrupt in some PMOPs (see misc.t for example)
#my $pmnextix = $op->pmnext->objix;
@@ -321,14 +314,14 @@ sub B::PMOP::bytecode {
# OP_PUSHRE (a mutated version of OP_MATCH for the regexp
# argument to a split) stores a GV in op_pmreplroot instead
# of a substitution syntax tree. We don't want to walk that...
- if ($ppaddr eq "pp_pushre") {
+ if ($opname eq "pushre") {
$replroot->bytecode;
} else {
walkoptree($replroot, "bytecode");
}
}
$op->B::LISTOP::bytecode;
- if ($ppaddr eq "pp_pushre") {
+ if ($opname eq "pushre") {
printf "op_pmreplrootgv $replrootix\n";
} else {
print "op_pmreplroot $replrootix\nop_pmreplstart $replstartix\n";
@@ -395,7 +388,8 @@ sub B::PVIV::bytecode {
}
sub B::PVNV::bytecode {
- my ($sv, $flag) = @_;
+ my $sv = shift;
+ my $flag = shift || 0;
# The $flag argument is passed through PVMG::bytecode by BM::bytecode
# and AV::bytecode and indicates special handling. $flag = 1 is used by
# BM::bytecode and means that we should ensure we save the whole B-M
@@ -469,18 +463,23 @@ sub B::GV::bytecode {
return if saved($gv);
my $ix = $gv->objix;
mark_saved($gv);
- my $gvname = $gv->NAME;
- my $name = cstring($gv->STASH->NAME . "::" . $gvname);
- my $egv = $gv->EGV;
- my $egvix = $egv->objix;
ldsv($ix);
- printf <<"EOT", $gv->FLAGS, $gv->GvFLAGS, $gv->LINE;
+ printf <<"EOT", $gv->FLAGS, $gv->GvFLAGS;
sv_flags 0x%x
xgv_flags 0x%x
-gp_line %d
EOT
my $refcnt = $gv->REFCNT;
printf("sv_refcnt_add %d\n", $refcnt - 1) if $refcnt > 1;
+ return if $gv->is_empty;
+ printf <<"EOT", $gv->LINE, pvstring($gv->FILE);
+gp_line %d
+newpv %s
+gp_file
+EOT
+ my $gvname = $gv->NAME;
+ my $name = cstring($gv->STASH->NAME . "::" . $gvname);
+ my $egv = $gv->EGV;
+ my $egvix = $egv->objix;
my $gvrefcnt = $gv->GvREFCNT;
printf("gp_refcnt_add %d\n", $gvrefcnt - 1) if $gvrefcnt > 1;
if ($gvrefcnt > 1 && $ix != $egvix) {
@@ -488,7 +487,7 @@ EOT
} else {
if ($gvname !~ /^([^A-Za-z]|STDIN|STDOUT|STDERR|ARGV|SIG|ENV)$/) {
my $i;
- my @subfield_names = qw(SV AV HV CV FILEGV FORM IO);
+ my @subfield_names = qw(SV AV HV CV FORM IO);
my @subfields = map($gv->$_(), @subfield_names);
my @ixes = map($_->objix, @subfields);
# Reset sv register for $gv
@@ -571,7 +570,7 @@ sub B::CV::bytecode {
my $ix = $cv->objix;
$cv->B::PVMG::bytecode;
my $i;
- my @subfield_names = qw(ROOT START STASH GV FILEGV PADLIST OUTSIDE);
+ my @subfield_names = qw(ROOT START STASH GV PADLIST OUTSIDE);
my @subfields = map($cv->$_(), @subfield_names);
my @ixes = map($_->objix, @subfields);
# Save OP tree from CvROOT (first element of @subfields)
@@ -584,7 +583,8 @@ sub B::CV::bytecode {
for ($i = 0; $i < @ixes; $i++) {
printf "xcv_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
}
- printf "xcv_depth %d\nxcv_flags 0x%x\n", $cv->DEPTH, $cv->FLAGS;
+ printf "xcv_depth %d\nxcv_flags 0x%x\n", $cv->DEPTH, $cv->CvFLAGS;
+ printf "newpv %s\nxcv_file\n", pvstring($cv->FILE);
# Now save all the subfields (except for CvROOT which was handled
# above) and CvSTART (now the initial element of @subfields).
shift @subfields; # bye-bye CvSTART
@@ -653,7 +653,7 @@ sub bytecompile_main {
walkoptree(main_root, "bytecode");
warn "done main program, now walking symbol table\n" if $debug_bc;
my ($pack, %exclude);
- foreach $pack (qw(B O AutoLoader DynaLoader Config DB VMS strict vars
+ foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS strict vars
FileHandle Exporter Carp UNIVERSAL IO Fcntl Symbol
SelectSaver blib Cwd))
{
@@ -707,6 +707,10 @@ sub compile {
$arg ||= shift @options;
open(OUT, ">$arg") or return "$arg: $!\n";
binmode OUT;
+ } elsif ($opt eq "a") {
+ $arg ||= shift @options;
+ open(OUT, ">>$arg") or return "$arg: $!\n";
+ binmode OUT;
} elsif ($opt eq "D") {
$arg ||= shift @options;
foreach $arg (split(//, $arg)) {
@@ -816,6 +820,10 @@ extra arguments, it saves the main program.
Output to filename instead of STDOUT.
+=item B<-afilename>
+
+Append output to filename.
+
=item B<-->
Force end of options.
@@ -889,13 +897,16 @@ C<main_root> and C<curpad> are omitted.
=head1 EXAMPLES
- perl -MO=Bytecode,-O6,-o,foo.plc foo.pl
+ perl -MO=Bytecode,-O6,-o,foo.plc foo.pl
+
+ perl -MO=Bytecode,-S foo.pl > foo.S
+ assemble foo.S > foo.plc
- perl -MO=Bytecode,-S foo.pl > foo.S
- assemble foo.S > foo.plc
- byteperl 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,-m,-oFoo.pmc Foo.pm
+ perl -MO=Bytecode,-m,-oFoo.pmc Foo.pm
=head1 BUGS
diff --git a/contrib/perl5/ext/B/B/C.pm b/contrib/perl5/ext/B/B/C.pm
index e695cc2..d0c8159 100644
--- a/contrib/perl5/ext/B/B/C.pm
+++ b/contrib/perl5/ext/B/B/C.pm
@@ -5,34 +5,75 @@
# You may distribute under the terms of either the GNU General Public
# License or the Artistic License, as specified in the README file.
#
+package B::C::Section;
+use B ();
+use base B::Section;
+
+sub new
+{
+ my $class = shift;
+ my $o = $class->SUPER::new(@_);
+ push(@$o,[]);
+ return $o;
+}
+
+sub add
+{
+ my $section = shift;
+ push(@{$section->[-1]},@_);
+}
+
+sub index
+{
+ my $section = shift;
+ return scalar(@{$section->[-1]})-1;
+}
+
+sub output
+{
+ my ($section, $fh, $format) = @_;
+ my $sym = $section->symtable || {};
+ my $default = $section->default;
+ foreach (@{$section->[-1]})
+ {
+ s{(s\\_[0-9a-f]+)}{ exists($sym->{$1}) ? $sym->{$1} : $default; }ge;
+ printf $fh $format, $_;
+ }
+}
+
package B::C;
use Exporter ();
@ISA = qw(Exporter);
-@EXPORT_OK = qw(output_all output_boilerplate output_main
- init_sections set_callback save_unused_subs objsym);
+@EXPORT_OK = qw(output_all output_boilerplate output_main mark_unused
+ init_sections set_callback save_unused_subs objsym save_context);
use B qw(minus_c sv_undef walkoptree walksymtable main_root main_start peekop
class cstring cchar svref_2object compile_stats comppadlist hash
- threadsv_names main_cv init_av);
+ threadsv_names main_cv init_av opnumber amagic_generation
+ AVf_REAL HEf_SVKEY);
use B::Asmdata qw(@specialsv_name);
use FileHandle;
use Carp;
use strict;
+use Config;
my $hv_index = 0;
my $gv_index = 0;
my $re_index = 0;
my $pv_index = 0;
my $anonsub_index = 0;
+my $initsub_index = 0;
my %symtable;
+my %xsub;
my $warn_undefined_syms;
my $verbose;
-my @unused_sub_packages;
+my %unused_sub_packages;
my $nullop_count;
-my $pv_copy_on_grow;
+my $pv_copy_on_grow = 0;
my ($debug_cops, $debug_av, $debug_cv, $debug_mg);
+my $max_string_len;
my @threadsv_names;
BEGIN {
@@ -40,11 +81,11 @@ BEGIN {
}
# Code sections
-my ($init, $decl, $symsect, $binopsect, $condopsect, $copsect, $cvopsect,
- $gvopsect, $listopsect, $logopsect, $loopsect, $opsect, $pmopsect,
+my ($init, $decl, $symsect, $binopsect, $condopsect, $copsect,
+ $padopsect, $listopsect, $logopsect, $loopsect, $opsect, $pmopsect,
$pvopsect, $svopsect, $unopsect, $svsect, $xpvsect, $xpvavsect,
$xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect, $xpvmgsect, $xpvlvsect,
- $xrvsect, $xpvbmsect, $xpviosect, $bootstrap);
+ $xrvsect, $xpvbmsect, $xpviosect );
sub walk_and_save_optree;
my $saveoptree_callback = \&walk_and_save_optree;
@@ -66,11 +107,9 @@ sub walk_and_save_optree {
# to "know" that op_seq is a U16 and use 65535. Ugh.
my $op_seq = 65535;
-sub AVf_REAL () { 1 }
-
-# XXX This shouldn't really be hardcoded here but it saves
-# looking up the name of every BASEOP in B::OP
-sub OP_THREADSV () { 345 }
+# Look this up here so we can do just a number compare
+# rather than looking up the name of every BASEOP in B::OP
+my $OP_THREADSV = opnumber('threadsv');
sub savesym {
my ($obj, $value) = @_;
@@ -98,10 +137,11 @@ sub getsym {
}
sub savepv {
- my $pv = shift;
+ my $pv = shift;
+ $pv = '' unless defined $pv; # Is this sane ?
my $pvsym = 0;
my $pvmax = 0;
- if ($pv_copy_on_grow) {
+ if ($pv_copy_on_grow) {
my $cstring = cstring($pv);
if ($cstring ne "0") { # sic
$pvsym = sprintf("pv%d", $pv_index++);
@@ -115,17 +155,21 @@ sub savepv {
sub B::OP::save {
my ($op, $level) = @_;
+ my $sym = objsym($op);
+ return $sym if defined $sym;
my $type = $op->type;
$nullop_count++ unless $type;
- if ($type == OP_THREADSV) {
+ if ($type == $OP_THREADSV) {
# saves looking up ppaddr but it's a bit naughty to hard code this
$init->add(sprintf("(void)find_threadsv(%s);",
cstring($threadsv_names[$op->targ])));
}
- $opsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x",
- ${$op->next}, ${$op->sibling}, $op->ppaddr, $op->targ,
+ $opsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x",
+ ${$op->next}, ${$op->sibling}, $op->targ,
$type, $op_seq, $op->flags, $op->private));
- savesym($op, sprintf("&op_list[%d]", $opsect->index));
+ my $ix = $opsect->index;
+ $init->add(sprintf("op_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ savesym($op, "&op_list[$ix]");
}
sub B::FAKEOP::new {
@@ -135,10 +179,12 @@ sub B::FAKEOP::new {
sub B::FAKEOP::save {
my ($op, $level) = @_;
- $opsect->add(sprintf("%s, %s, %s, %u, %u, %u, 0x%x, 0x%x",
- $op->next, $op->sibling, $op->ppaddr, $op->targ,
+ $opsect->add(sprintf("%s, %s, NULL, %u, %u, %u, 0x%x, 0x%x",
+ $op->next, $op->sibling, $op->targ,
$op->type, $op_seq, $op->flags, $op->private));
- return sprintf("&op_list[%d]", $opsect->index);
+ my $ix = $opsect->index;
+ $init->add(sprintf("op_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ return "&op_list[$ix]";
}
sub B::FAKEOP::next { $_[0]->{"next"} || 0 }
@@ -151,114 +197,139 @@ sub B::FAKEOP::private { $_[0]->{private} || 0 }
sub B::UNOP::save {
my ($op, $level) = @_;
- $unopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, s\\_%x",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ my $sym = objsym($op);
+ return $sym if defined $sym;
+ $unopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private, ${$op->first}));
- savesym($op, sprintf("(OP*)&unop_list[%d]", $unopsect->index));
+ my $ix = $unopsect->index;
+ $init->add(sprintf("unop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ savesym($op, "(OP*)&unop_list[$ix]");
}
sub B::BINOP::save {
my ($op, $level) = @_;
- $binopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ my $sym = objsym($op);
+ return $sym if defined $sym;
+ $binopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private, ${$op->first}, ${$op->last}));
- savesym($op, sprintf("(OP*)&binop_list[%d]", $binopsect->index));
+ my $ix = $binopsect->index;
+ $init->add(sprintf("binop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ savesym($op, "(OP*)&binop_list[$ix]");
}
sub B::LISTOP::save {
my ($op, $level) = @_;
- $listopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ my $sym = objsym($op);
+ return $sym if defined $sym;
+ $listopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private, ${$op->first}, ${$op->last},
$op->children));
- savesym($op, sprintf("(OP*)&listop_list[%d]", $listopsect->index));
+ my $ix = $listopsect->index;
+ $init->add(sprintf("listop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ savesym($op, "(OP*)&listop_list[$ix]");
}
sub B::LOGOP::save {
my ($op, $level) = @_;
- $logopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ my $sym = objsym($op);
+ return $sym if defined $sym;
+ $logopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private, ${$op->first}, ${$op->other}));
- savesym($op, sprintf("(OP*)&logop_list[%d]", $logopsect->index));
-}
-
-sub B::CONDOP::save {
- my ($op, $level) = @_;
- $condopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, s\\_%x",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
- $op->targ, $op->type, $op_seq, $op->flags,
- $op->private, ${$op->first}, ${$op->true},
- ${$op->false}));
- savesym($op, sprintf("(OP*)&condop_list[%d]", $condopsect->index));
+ my $ix = $logopsect->index;
+ $init->add(sprintf("logop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ savesym($op, "(OP*)&logop_list[$ix]");
}
sub B::LOOP::save {
my ($op, $level) = @_;
+ my $sym = objsym($op);
+ return $sym if defined $sym;
#warn sprintf("LOOP: redoop %s, nextop %s, lastop %s\n",
# peekop($op->redoop), peekop($op->nextop),
# peekop($op->lastop)); # debug
- $loopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u, s\\_%x, s\\_%x, s\\_%x",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ $loopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u, s\\_%x, s\\_%x, s\\_%x",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private, ${$op->first}, ${$op->last},
$op->children, ${$op->redoop}, ${$op->nextop},
${$op->lastop}));
- savesym($op, sprintf("(OP*)&loop_list[%d]", $loopsect->index));
+ my $ix = $loopsect->index;
+ $init->add(sprintf("loop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ savesym($op, "(OP*)&loop_list[$ix]");
}
sub B::PVOP::save {
my ($op, $level) = @_;
- $pvopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, %s",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ my $sym = objsym($op);
+ return $sym if defined $sym;
+ $pvopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, %s",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private, cstring($op->pv)));
- savesym($op, sprintf("(OP*)&pvop_list[%d]", $pvopsect->index));
+ my $ix = $pvopsect->index;
+ $init->add(sprintf("pvop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ savesym($op, "(OP*)&pvop_list[$ix]");
}
sub B::SVOP::save {
my ($op, $level) = @_;
+ my $sym = objsym($op);
+ return $sym if defined $sym;
my $svsym = $op->sv->save;
- $svopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, %s",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ $svopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, Nullsv",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
- $op->private, "(SV*)$svsym"));
- savesym($op, sprintf("(OP*)&svop_list[%d]", $svopsect->index));
+ $op->private));
+ my $ix = $svopsect->index;
+ $init->add(sprintf("svop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ $init->add("svop_list[$ix].op_sv = (SV*)$svsym;");
+ savesym($op, "(OP*)&svop_list[$ix]");
}
-sub B::GVOP::save {
+sub B::PADOP::save {
my ($op, $level) = @_;
- my $gvsym = $op->gv->save;
- $gvopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, Nullgv",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ my $sym = objsym($op);
+ return $sym if defined $sym;
+ $padopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, 0",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private));
- $init->add(sprintf("gvop_list[%d].op_gv = %s;", $gvopsect->index, $gvsym));
- savesym($op, sprintf("(OP*)&gvop_list[%d]", $gvopsect->index));
+ $init->add(sprintf("padop_list[%d].op_ppaddr = %s;", $padopsect->index, $op->ppaddr));
+ my $ix = $padopsect->index;
+ $init->add(sprintf("padop_list[$ix].op_padix = %ld;", $op->padix));
+ savesym($op, "(OP*)&padop_list[$ix]");
}
sub B::COP::save {
my ($op, $level) = @_;
- my $gvsym = $op->filegv->save;
- my $stashsym = $op->stash->save;
- warn sprintf("COP: line %d file %s\n", $op->line, $op->filegv->SV->PV)
+ my $sym = objsym($op);
+ return $sym if defined $sym;
+ warn sprintf("COP: line %d file %s\n", $op->line, $op->file)
if $debug_cops;
- $copsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, %s, Nullhv, Nullgv, %u, %d, %u",
- ${$op->next}, ${$op->sibling}, $op->ppaddr,
+ $copsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, %s, NULL, NULL, %u, %d, %u",
+ ${$op->next}, ${$op->sibling},
$op->targ, $op->type, $op_seq, $op->flags,
$op->private, cstring($op->label), $op->cop_seq,
$op->arybase, $op->line));
- my $copix = $copsect->index;
- $init->add(sprintf("cop_list[%d].cop_filegv = %s;", $copix, $gvsym),
- sprintf("cop_list[%d].cop_stash = %s;", $copix, $stashsym));
- savesym($op, "(OP*)&cop_list[$copix]");
+ my $ix = $copsect->index;
+ $init->add(sprintf("cop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
+ $init->add(sprintf("CopFILE_set(&cop_list[$ix], %s);", cstring($op->file)),
+ sprintf("CopSTASHPV_set(&cop_list[$ix], %s);", cstring($op->stashpv)));
+ savesym($op, "(OP*)&cop_list[$ix]");
}
sub B::PMOP::save {
my ($op, $level) = @_;
+ my $sym = objsym($op);
+ return $sym if defined $sym;
my $replroot = $op->pmreplroot;
my $replstart = $op->pmreplstart;
my $replrootfield = sprintf("s\\_%x", $$replroot);
@@ -269,7 +340,7 @@ sub B::PMOP::save {
# OP_PUSHRE (a mutated version of OP_MATCH for the regexp
# argument to a split) stores a GV in op_pmreplroot instead
# of a substitution syntax tree. We don't want to walk that...
- if ($ppaddr eq "pp_pushre") {
+ if ($op->name eq "pushre") {
$gvsym = $replroot->save;
# warn "PMOP::save saving a pp_pushre with GV $gvsym\n"; # debug
$replrootfield = 0;
@@ -280,13 +351,14 @@ sub B::PMOP::save {
# pmnext handling is broken in perl itself, I think. Bad op_pmnext
# fields aren't noticed in perl's runtime (unless you try reset) but we
# segfault when trying to dereference it to find op->op_pmnext->op_type
- $pmopsect->add(sprintf("s\\_%x, s\\_%x, %s, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u, %s, %s, 0, 0, 0x%x, 0x%x",
- ${$op->next}, ${$op->sibling}, $ppaddr, $op->targ,
+ $pmopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u, %s, %s, 0, 0, 0x%x, 0x%x",
+ ${$op->next}, ${$op->sibling}, $op->targ,
$op->type, $op_seq, $op->flags, $op->private,
${$op->first}, ${$op->last}, $op->children,
$replrootfield, $replstartfield,
$op->pmflags, $op->pmpermflags,));
my $pm = sprintf("pmop_list[%d]", $pmopsect->index);
+ $init->add(sprintf("$pm.op_ppaddr = %s;", $ppaddr));
my $re = $op->precomp;
if (defined($re)) {
my $resym = sprintf("re%d", $re_index++);
@@ -297,7 +369,7 @@ sub B::PMOP::save {
if ($gvsym) {
$init->add("$pm.op_pmreplroot = (OP*)$gvsym;");
}
- savesym($op, sprintf("(OP*)&pmop_list[%d]", $pmopsect->index));
+ savesym($op, "(OP*)&$pm");
}
sub B::SPECIAL::save {
@@ -319,10 +391,11 @@ sub B::NULL::save {
return $sym if defined $sym;
# warn "Saving SVt_NULL SV\n"; # debug
# debug
- #if ($$sv == 0) {
- # warn "NULL::save for sv = 0 called from @{[(caller(1))[3]]}\n";
- #}
- $svsect->add(sprintf("0, %u, 0x%x", $sv->REFCNT + 1, $sv->FLAGS));
+ if ($$sv == 0) {
+ warn "NULL::save for sv = 0 called from @{[(caller(1))[3]]}\n";
+ return savesym($sv, "Nullsv /* XXX */");
+ }
+ $svsect->add(sprintf("0, %u, 0x%x", $sv->REFCNT , $sv->FLAGS));
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
}
@@ -332,7 +405,7 @@ sub B::IV::save {
return $sym if defined $sym;
$xpvivsect->add(sprintf("0, 0, 0, %d", $sv->IVX));
$svsect->add(sprintf("&xpviv_list[%d], %lu, 0x%x",
- $xpvivsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvivsect->index, $sv->REFCNT , $sv->FLAGS));
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
}
@@ -340,12 +413,35 @@ sub B::NV::save {
my ($sv) = @_;
my $sym = objsym($sv);
return $sym if defined $sym;
- $xpvnvsect->add(sprintf("0, 0, 0, %d, %s", $sv->IVX, $sv->NVX));
+ my $val= $sv->NVX;
+ $val .= '.00' if $val =~ /^-?\d+$/;
+ $xpvnvsect->add(sprintf("0, 0, 0, %d, %s", $sv->IVX, $val));
$svsect->add(sprintf("&xpvnv_list[%d], %lu, 0x%x",
- $xpvnvsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvnvsect->index, $sv->REFCNT , $sv->FLAGS));
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
}
+sub savepvn {
+ my ($dest,$pv) = @_;
+ my @res;
+ if (defined $max_string_len && length($pv) > $max_string_len) {
+ push @res, sprintf("New(0,%s,%u,char);", $dest, length($pv)+1);
+ my $offset = 0;
+ while (length $pv) {
+ my $str = substr $pv, 0, $max_string_len, '';
+ push @res, sprintf("Copy(%s,$dest+$offset,%u,char);",
+ cstring($str), length($str));
+ $offset += length $str;
+ }
+ push @res, sprintf("%s[%u] = '\\0';", $dest, $offset);
+ }
+ else {
+ push @res, sprintf("%s = savepvn(%s, %u);", $dest,
+ cstring($pv), length($pv));
+ }
+ return @res;
+}
+
sub B::PVLV::save {
my ($sv) = @_;
my $sym = objsym($sv);
@@ -358,10 +454,10 @@ sub B::PVLV::save {
$pvsym, $len, $pvmax, $sv->IVX, $sv->NVX,
$sv->TARGOFF, $sv->TARGLEN, cchar($sv->TYPE)));
$svsect->add(sprintf("&xpvlv_list[%d], %lu, 0x%x",
- $xpvlvsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvlvsect->index, $sv->REFCNT , $sv->FLAGS));
if (!$pv_copy_on_grow) {
- $init->add(sprintf("xpvlv_list[%d].xpv_pv = savepvn(%s, %u);",
- $xpvlvsect->index, cstring($pv), $len));
+ $init->add(savepvn(sprintf("xpvlv_list[%d].xpv_pv",
+ $xpvlvsect->index), $pv));
}
$sv->save_magic;
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
@@ -376,10 +472,10 @@ sub B::PVIV::save {
my ($pvsym, $pvmax) = savepv($pv);
$xpvivsect->add(sprintf("%s, %u, %u, %d", $pvsym, $len, $pvmax, $sv->IVX));
$svsect->add(sprintf("&xpviv_list[%d], %u, 0x%x",
- $xpvivsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvivsect->index, $sv->REFCNT , $sv->FLAGS));
if (!$pv_copy_on_grow) {
- $init->add(sprintf("xpviv_list[%d].xpv_pv = savepvn(%s, %u);",
- $xpvivsect->index, cstring($pv), $len));
+ $init->add(savepvn(sprintf("xpviv_list[%d].xpv_pv",
+ $xpvivsect->index), $pv));
}
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
}
@@ -388,16 +484,19 @@ sub B::PVNV::save {
my ($sv) = @_;
my $sym = objsym($sv);
return $sym if defined $sym;
- my $pv = $sv->PV;
+ my $pv = $sv->PV;
+ $pv = '' unless defined $pv;
my $len = length($pv);
my ($pvsym, $pvmax) = savepv($pv);
+ my $val= $sv->NVX;
+ $val .= '.00' if $val =~ /^-?\d+$/;
$xpvnvsect->add(sprintf("%s, %u, %u, %d, %s",
- $pvsym, $len, $pvmax, $sv->IVX, $sv->NVX));
+ $pvsym, $len, $pvmax, $sv->IVX, $val));
$svsect->add(sprintf("&xpvnv_list[%d], %lu, 0x%x",
- $xpvnvsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvnvsect->index, $sv->REFCNT , $sv->FLAGS));
if (!$pv_copy_on_grow) {
- $init->add(sprintf("xpvnv_list[%d].xpv_pv = savepvn(%s,%u);",
- $xpvnvsect->index, cstring($pv), $len));
+ $init->add(savepvn(sprintf("xpvnv_list[%d].xpv_pv",
+ $xpvnvsect->index), $pv));
}
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
}
@@ -412,10 +511,10 @@ sub B::BM::save {
$len, $len + 258, $sv->IVX, $sv->NVX,
$sv->USEFUL, $sv->PREVIOUS, $sv->RARE));
$svsect->add(sprintf("&xpvbm_list[%d], %lu, 0x%x",
- $xpvbmsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvbmsect->index, $sv->REFCNT , $sv->FLAGS));
$sv->save_magic;
- $init->add(sprintf("xpvbm_list[%d].xpv_pv = savepvn(%s, %u);",
- $xpvbmsect->index, cstring($pv), $len),
+ $init->add(savepvn(sprintf("xpvbm_list[%d].xpv_pv",
+ $xpvbmsect->index), $pv),
sprintf("xpvbm_list[%d].xpv_cur = %u;",
$xpvbmsect->index, $len - 257));
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
@@ -430,10 +529,10 @@ sub B::PV::save {
my ($pvsym, $pvmax) = savepv($pv);
$xpvsect->add(sprintf("%s, %u, %u", $pvsym, $len, $pvmax));
$svsect->add(sprintf("&xpv_list[%d], %lu, 0x%x",
- $xpvsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvsect->index, $sv->REFCNT , $sv->FLAGS));
if (!$pv_copy_on_grow) {
- $init->add(sprintf("xpv_list[%d].xpv_pv = savepvn(%s, %u);",
- $xpvsect->index, cstring($pv), $len));
+ $init->add(savepvn(sprintf("xpv_list[%d].xpv_pv",
+ $xpvsect->index), $pv));
}
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
}
@@ -448,10 +547,10 @@ sub B::PVMG::save {
$xpvmgsect->add(sprintf("%s, %u, %u, %d, %s, 0, 0",
$pvsym, $len, $pvmax, $sv->IVX, $sv->NVX));
$svsect->add(sprintf("&xpvmg_list[%d], %lu, 0x%x",
- $xpvmgsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xpvmgsect->index, $sv->REFCNT , $sv->FLAGS));
if (!$pv_copy_on_grow) {
- $init->add(sprintf("xpvmg_list[%d].xpv_pv = savepvn(%s, %u);",
- $xpvmgsect->index, cstring($pv), $len));
+ $init->add(savepvn(sprintf("xpvmg_list[%d].xpv_pv",
+ $xpvmgsect->index), $pv));
}
$sym = savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
$sv->save_magic;
@@ -462,6 +561,7 @@ sub B::PVMG::save_magic {
my ($sv) = @_;
#warn sprintf("saving magic for %s (0x%x)\n", class($sv), $$sv); # debug
my $stash = $sv->SvSTASH;
+ $stash->save;
if ($$stash) {
warn sprintf("xmg_stash = %s (0x%x)\n", $stash->NAME, $$stash)
if $debug_mg;
@@ -469,19 +569,27 @@ sub B::PVMG::save_magic {
$init->add(sprintf("SvSTASH(s\\_%x) = s\\_%x;", $$sv, $$stash));
}
my @mgchain = $sv->MAGIC;
- my ($mg, $type, $obj, $ptr);
+ my ($mg, $type, $obj, $ptr,$len,$ptrsv);
foreach $mg (@mgchain) {
$type = $mg->TYPE;
$obj = $mg->OBJ;
$ptr = $mg->PTR;
- my $len = defined($ptr) ? length($ptr) : 0;
+ $len=$mg->LENGTH;
if ($debug_mg) {
warn sprintf("magic %s (0x%x), obj %s (0x%x), type %s, ptr %s\n",
class($sv), $$sv, class($obj), $$obj,
cchar($type), cstring($ptr));
}
- $init->add(sprintf("sv_magic((SV*)s\\_%x, (SV*)s\\_%x, %s, %s, %d);",
+ $obj->save;
+ if ($len == HEf_SVKEY){
+ #The pointer is an SV*
+ $ptrsv=svref_2object($ptr)->save;
+ $init->add(sprintf("sv_magic((SV*)s\\_%x, (SV*)s\\_%x, %s,(char *) %s, %d);",
+ $$sv, $$obj, cchar($type),$ptrsv,$len));
+ }else{
+ $init->add(sprintf("sv_magic((SV*)s\\_%x, (SV*)s\\_%x, %s, %s, %d);",
$$sv, $$obj, cchar($type),cstring($ptr),$len));
+ }
}
}
@@ -489,9 +597,11 @@ sub B::RV::save {
my ($sv) = @_;
my $sym = objsym($sv);
return $sym if defined $sym;
- $xrvsect->add($sv->RV->save);
+ my $rv = $sv->RV->save;
+ $rv =~ s/^\([AGHS]V\s*\*\)\s*(\&sv_list.*)$/$1/;
+ $xrvsect->add($rv);
$svsect->add(sprintf("&xrv_list[%d], %lu, 0x%x",
- $xrvsect->index, $sv->REFCNT + 1, $sv->FLAGS));
+ $xrvsect->index, $sv->REFCNT , $sv->FLAGS));
return savesym($sv, sprintf("&sv_list[%d]", $svsect->index));
}
@@ -516,7 +626,7 @@ sub try_autoload {
}
}
}
-
+sub Dummy_initxs{};
sub B::CV::save {
my ($cv) = @_;
my $sym = objsym($cv);
@@ -525,18 +635,43 @@ sub B::CV::save {
return $sym;
}
# Reserve a place in svsect and xpvcvsect and record indices
+ my $gv = $cv->GV;
+ my ($cvname, $cvstashname);
+ if ($$gv){
+ $cvname = $gv->NAME;
+ $cvstashname = $gv->STASH->NAME;
+ }
+ my $root = $cv->ROOT;
+ my $cvxsub = $cv->XSUB;
+ #INIT is removed from the symbol table, so this call must come
+ # from PL_initav->save. Re-bootstrapping will push INIT back in
+ # so nullop should be sent.
+ if ($cvxsub && ($cvname ne "INIT")) {
+ my $egv = $gv->EGV;
+ my $stashname = $egv->STASH->NAME;
+ if ($cvname eq "bootstrap")
+ {
+ my $file = $gv->FILE;
+ $decl->add("/* bootstrap $file */");
+ warn "Bootstrap $stashname $file\n";
+ $xsub{$stashname}='Dynamic';
+ # $xsub{$stashname}='Static' unless $xsub{$stashname};
+ return qq/NULL/;
+ }
+ warn sprintf("stub for XSUB $cvstashname\:\:$cvname CV 0x%x\n", $$cv) if $debug_cv;
+ return qq/(perl_get_cv("$stashname\:\:$cvname",TRUE))/;
+ }
+ if ($cvxsub && $cvname eq "INIT") {
+ no strict 'refs';
+ return svref_2object(\&Dummy_initxs)->save;
+ }
my $sv_ix = $svsect->index + 1;
$svsect->add("svix$sv_ix");
my $xpvcv_ix = $xpvcvsect->index + 1;
$xpvcvsect->add("xpvcvix$xpvcv_ix");
# Save symbol now so that GvCV() doesn't recurse back to us via CvGV()
$sym = savesym($cv, "&sv_list[$sv_ix]");
- warn sprintf("saving CV 0x%x as $sym\n", $$cv) if $debug_cv;
- my $gv = $cv->GV;
- my $cvstashname = $gv->STASH->NAME;
- my $cvname = $gv->NAME;
- my $root = $cv->ROOT;
- my $cvxsub = $cv->XSUB;
+ warn sprintf("saving $cvstashname\:\:$cvname CV 0x%x as $sym\n", $$cv) if $debug_cv;
if (!$$root && !$cvxsub) {
if (try_autoload($cvstashname, $cvname)) {
# Recalculate root and xsub
@@ -564,6 +699,10 @@ sub B::CV::save {
$ppname .= ($stashname eq "main") ?
$gvname : "$stashname\::$gvname";
$ppname =~ s/::/__/g;
+ if ($gvname eq "INIT"){
+ $ppname .= "_$initsub_index";
+ $initsub_index++;
+ }
}
}
if (!$ppname) {
@@ -581,28 +720,19 @@ sub B::CV::save {
$$padlist, $$cv) if $debug_cv;
}
}
- elsif ($cvxsub) {
- $xsubany = sprintf("ANYINIT((void*)0x%x)", $cv->XSUBANY);
- # Try to find out canonical name of XSUB function from EGV.
- # XXX Doesn't work for XSUBs with PREFIX set (or anyone who
- # calls newXS() manually with weird arguments).
- my $egv = $gv->EGV;
- my $stashname = $egv->STASH->NAME;
- $stashname =~ s/::/__/g;
- $xsub = sprintf("XS_%s_%s", $stashname, $egv->NAME);
- $decl->add("void $xsub _((CV*));");
- }
else {
warn sprintf("No definition for sub %s::%s (unable to autoload)\n",
$cvstashname, $cvname); # debug
- }
- $symsect->add(sprintf("xpvcvix%d\t%s, %u, 0, %d, %s, 0, Nullhv, Nullhv, %s, s\\_%x, $xsub, $xsubany, Nullgv, Nullgv, %d, s\\_%x, (CV*)s\\_%x, 0x%x",
+ }
+ $pv = '' unless defined $pv; # Avoid use of undef warnings
+ $symsect->add(sprintf("xpvcvix%d\t%s, %u, 0, %d, %s, 0, Nullhv, Nullhv, %s, s\\_%x, $xsub, $xsubany, Nullgv, \"\", %d, s\\_%x, (CV*)s\\_%x, 0x%x",
$xpvcv_ix, cstring($pv), length($pv), $cv->IVX,
$cv->NVX, $startfield, ${$cv->ROOT}, $cv->DEPTH,
$$padlist, ${$cv->OUTSIDE}, $cv->CvFLAGS));
if (${$cv->OUTSIDE} == ${main_cv()}){
$init->add(sprintf("CvOUTSIDE(s\\_%x)=PL_main_cv;",$$cv));
+ $init->add(sprintf("SvREFCNT_inc(PL_main_cv);"));
}
if ($$gv) {
@@ -611,13 +741,7 @@ sub B::CV::save {
warn sprintf("done saving GV 0x%x for CV 0x%x\n",
$$gv, $$cv) if $debug_cv;
}
- my $filegv = $cv->FILEGV;
- if ($$filegv) {
- $filegv->save;
- $init->add(sprintf("CvFILEGV(s\\_%x) = s\\_%x;", $$cv, $$filegv));
- warn sprintf("done saving FILEGV 0x%x for CV 0x%x\n",
- $$filegv, $$cv) if $debug_cv;
- }
+ $init->add(sprintf("CvFILE($sym) = %s;", cstring($cv->FILE)));
my $stash = $cv->STASH;
if ($$stash) {
$stash->save;
@@ -626,7 +750,7 @@ sub B::CV::save {
$$stash, $$cv) if $debug_cv;
}
$symsect->add(sprintf("svix%d\t(XPVCV*)&xpvcv_list[%u], %lu, 0x%x",
- $sv_ix, $xpvcv_ix, $cv->REFCNT + 1, $cv->FLAGS));
+ $sv_ix, $xpvcv_ix, $cv->REFCNT +1 , $cv->FLAGS));
return $sym;
}
@@ -641,24 +765,31 @@ sub B::GV::save {
$sym = savesym($gv, "gv_list[$ix]");
#warn sprintf("Saving GV 0x%x as $sym\n", $$gv); # debug
}
+ my $is_empty = $gv->is_empty;
my $gvname = $gv->NAME;
my $name = cstring($gv->STASH->NAME . "::" . $gvname);
#warn "GV name is $name\n"; # debug
- my $egv = $gv->EGV;
my $egvsym;
- if ($$gv != $$egv) {
- #warn(sprintf("EGV name is %s, saving it now\n",
- # $egv->STASH->NAME . "::" . $egv->NAME)); # debug
- $egvsym = $egv->save;
+ unless ($is_empty) {
+ my $egv = $gv->EGV;
+ if ($$gv != $$egv) {
+ #warn(sprintf("EGV name is %s, saving it now\n",
+ # $egv->STASH->NAME . "::" . $egv->NAME)); # debug
+ $egvsym = $egv->save;
+ }
}
$init->add(qq[$sym = gv_fetchpv($name, TRUE, SVt_PV);],
sprintf("SvFLAGS($sym) = 0x%x;", $gv->FLAGS),
- sprintf("GvFLAGS($sym) = 0x%x;", $gv->GvFLAGS),
- sprintf("GvLINE($sym) = %u;", $gv->LINE));
+ sprintf("GvFLAGS($sym) = 0x%x;", $gv->GvFLAGS));
+ $init->add(sprintf("GvLINE($sym) = %u;", $gv->LINE)) unless $is_empty;
+
# Shouldn't need to do save_magic since gv_fetchpv handles that
#$gv->save_magic;
my $refcnt = $gv->REFCNT + 1;
$init->add(sprintf("SvREFCNT($sym) += %u;", $refcnt - 1)) if $refcnt > 1;
+
+ return $sym if $is_empty;
+
my $gvrefcnt = $gv->GvREFCNT;
if ($gvrefcnt > 1) {
$init->add(sprintf("GvREFCNT($sym) += %u;", $gvrefcnt - 1));
@@ -672,45 +803,51 @@ sub B::GV::save {
# warn "GV::save saving subfields\n"; # debug
my $gvsv = $gv->SV;
if ($$gvsv) {
+ $gvsv->save;
$init->add(sprintf("GvSV($sym) = s\\_%x;", $$gvsv));
# warn "GV::save \$$name\n"; # debug
- $gvsv->save;
}
my $gvav = $gv->AV;
if ($$gvav) {
+ $gvav->save;
$init->add(sprintf("GvAV($sym) = s\\_%x;", $$gvav));
# warn "GV::save \@$name\n"; # debug
- $gvav->save;
}
my $gvhv = $gv->HV;
if ($$gvhv) {
+ $gvhv->save;
$init->add(sprintf("GvHV($sym) = s\\_%x;", $$gvhv));
# warn "GV::save \%$name\n"; # debug
- $gvhv->save;
}
my $gvcv = $gv->CV;
- if ($$gvcv) {
- $init->add(sprintf("GvCV($sym) = (CV*)s\\_%x;", $$gvcv));
-# warn "GV::save &$name\n"; # debug
- $gvcv->save;
- }
- my $gvfilegv = $gv->FILEGV;
- if ($$gvfilegv) {
- $init->add(sprintf("GvFILEGV($sym) = (GV*)s\\_%x;",$$gvfilegv));
-# warn "GV::save GvFILEGV(*$name)\n"; # debug
- $gvfilegv->save;
- }
+ if ($$gvcv) {
+ my $origname=cstring($gvcv->GV->EGV->STASH->NAME .
+ "::" . $gvcv->GV->EGV->NAME);
+ if (0 && $gvcv->XSUB && $name ne $origname) { #XSUB alias
+ # must save as a 'stub' so newXS() has a CV to populate
+ $init->add("{ CV *cv;");
+ $init->add("\tcv=perl_get_cv($origname,TRUE);");
+ $init->add("\tGvCV($sym)=cv;");
+ $init->add("\tSvREFCNT_inc((SV *)cv);");
+ $init->add("}");
+ } else {
+ $init->add(sprintf("GvCV($sym) = (CV*)(%s);", $gvcv->save));
+# warn "GV::save &$name\n"; # debug
+ }
+ }
+ $init->add(sprintf("GvFILE($sym) = %s;", cstring($gv->FILE)));
+# warn "GV::save GvFILE(*$name)\n"; # debug
my $gvform = $gv->FORM;
if ($$gvform) {
+ $gvform->save;
$init->add(sprintf("GvFORM($sym) = (CV*)s\\_%x;", $$gvform));
# warn "GV::save GvFORM(*$name)\n"; # debug
- $gvform->save;
}
my $gvio = $gv->IO;
if ($$gvio) {
+ $gvio->save;
$init->add(sprintf("GvIOp($sym) = s\\_%x;", $$gvio));
# warn "GV::save GvIO(*$name)\n"; # debug
- $gvio->save;
}
}
return $sym;
@@ -723,7 +860,7 @@ sub B::AV::save {
$xpvavsect->add(sprintf("0, -1, -1, 0, 0.0, 0, Nullhv, 0, 0, 0x%x",
$avflags));
$svsect->add(sprintf("&xpvav_list[%d], %lu, 0x%x",
- $xpvavsect->index, $av->REFCNT + 1, $av->FLAGS));
+ $xpvavsect->index, $av->REFCNT , $av->FLAGS));
my $sv_list_index = $svsect->index;
my $fill = $av->FILL;
$av->save_magic;
@@ -789,7 +926,7 @@ sub B::HV::save {
$xpvhvsect->add(sprintf("0, 0, %d, 0, 0.0, 0, Nullhv, %d, 0, 0, 0",
$hv->MAX, $hv->RITER));
$svsect->add(sprintf("&xpvhv_list[%d], %lu, 0x%x",
- $xpvhvsect->index, $hv->REFCNT + 1, $hv->FLAGS));
+ $xpvhvsect->index, $hv->REFCNT , $hv->FLAGS));
my $sv_list_index = $svsect->index;
my @contents = $hv->ARRAY;
if (@contents) {
@@ -802,9 +939,12 @@ sub B::HV::save {
my ($key, $value) = splice(@contents, 0, 2);
$init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);",
cstring($key),length($key),$value, hash($key)));
+# $init->add(sprintf("\thv_store(hv, %s, %u, %s, %s);",
+# cstring($key),length($key),$value, 0));
}
$init->add("}");
}
+ $hv->save_magic();
return savesym($hv, "(HV*)&sv_list[$sv_list_index]");
}
@@ -813,6 +953,7 @@ sub B::IO::save {
my $sym = objsym($io);
return $sym if defined $sym;
my $pv = $io->PV;
+ $pv = '' unless defined $pv;
my $len = length($pv);
$xpviosect->add(sprintf("0, %u, %u, %d, %s, 0, 0, 0, 0, 0, %d, %d, %d, %d, %s, Nullgv, %s, Nullgv, %s, Nullgv, %d, %s, 0x%x",
$len, $len+1, $io->IVX, $io->NVX, $io->LINES,
@@ -821,7 +962,7 @@ sub B::IO::save {
cstring($io->BOTTOM_NAME), $io->SUBPROCESS,
cchar($io->IoTYPE), $io->IoFLAGS));
$svsect->add(sprintf("&xpvio_list[%d], %lu, 0x%x",
- $xpviosect->index, $io->REFCNT + 1, $io->FLAGS));
+ $xpviosect->index, $io->REFCNT , $io->FLAGS));
$sym = savesym($io, sprintf("(IO*)&sv_list[%d]", $svsect->index));
my ($field, $fsym);
foreach $field (qw(TOP_GV FMT_GV BOTTOM_GV)) {
@@ -848,11 +989,10 @@ sub output_all {
my $init_name = shift;
my $section;
my @sections = ($opsect, $unopsect, $binopsect, $logopsect, $condopsect,
- $listopsect, $pmopsect, $svopsect, $gvopsect, $pvopsect,
- $cvopsect, $loopsect, $copsect, $svsect, $xpvsect,
+ $listopsect, $pmopsect, $svopsect, $padopsect, $pvopsect,
+ $loopsect, $copsect, $svsect, $xpvsect,
$xpvavsect, $xpvhvsect, $xpvcvsect, $xpvivsect, $xpvnvsect,
$xpvmgsect, $xpvlvsect, $xrvsect, $xpvbmsect, $xpviosect);
- $bootstrap->output(\*STDOUT, "/* bootstrap %s */\n");
$symsect->output(\*STDOUT, "#define %s\n");
print "\n";
output_declarations();
@@ -881,6 +1021,8 @@ sub output_all {
static int $init_name()
{
dTHR;
+ dTARG;
+ djSP;
EOT
$init->output(\*STDOUT, "\t%s\n");
print "\treturn 0;\n}\n";
@@ -915,18 +1057,18 @@ typedef struct {
HV * xcv_stash;
OP * xcv_start;
OP * xcv_root;
- void (*xcv_xsub) _((CV*));
+ void (*xcv_xsub) (CV*);
void * xcv_xsubany;
GV * xcv_gv;
- GV * xcv_filegv;
- long xcv_depth; /* >= 2 indicates recursive call */
+ char * xcv_file;
+ long xcv_depth; /* >= 2 indicates recursive call */
AV * xcv_padlist;
CV * xcv_outside;
#ifdef USE_THREADS
perl_mutex *xcv_mutexp;
struct perl_thread *xcv_owner; /* current owner thread */
#endif /* USE_THREADS */
- U8 xcv_flags;
+ cv_flags_t xcv_flags;
} XPVCV_or_similar;
#define ANYINIT(i) i
#else
@@ -948,15 +1090,16 @@ sub output_boilerplate {
print <<'EOT';
#include "EXTERN.h"
#include "perl.h"
-#ifndef PATCHLEVEL
-#include "patchlevel.h"
-#endif
+#include "XSUB.h"
/* Workaround for mapstart: the only op which needs a different ppaddr */
-#undef pp_mapstart
-#define pp_mapstart pp_grepstart
+#undef Perl_pp_mapstart
+#define Perl_pp_mapstart Perl_pp_grepstart
+#define XS_DynaLoader_boot_DynaLoader boot_DynaLoader
+EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
-static void xs_init _((void));
+static void xs_init (pTHX);
+static void dl_init (pTHX);
static PerlInterpreter *my_perl;
EOT
}
@@ -964,28 +1107,20 @@ EOT
sub output_main {
print <<'EOT';
int
-#ifndef CAN_PROTOTYPE
-main(argc, argv, env)
-int argc;
-char **argv;
-char **env;
-#else /* def(CAN_PROTOTYPE) */
main(int argc, char **argv, char **env)
-#endif /* def(CAN_PROTOTYPE) */
{
int exitstatus;
int i;
char **fakeargv;
- PERL_SYS_INIT(&argc,&argv);
+ PERL_SYS_INIT3(&argc,&argv,&env);
- perl_init_i18nl10n(1);
-
if (!PL_do_undump) {
my_perl = perl_alloc();
if (!my_perl)
exit(1);
perl_construct( my_perl );
+ PL_perl_destruct_level = 0;
}
#ifdef CSH
@@ -1021,22 +1156,84 @@ main(int argc, char **argv, char **env)
exitstatus = perl_init();
if (exitstatus)
exit( exitstatus );
+ dl_init(aTHX);
exitstatus = perl_run( my_perl );
perl_destruct( my_perl );
perl_free( my_perl );
+ PERL_SYS_TERM();
+
exit( exitstatus );
}
+/* yanked from perl.c */
static void
-xs_init()
+xs_init(pTHX)
{
-}
+ char *file = __FILE__;
+ dTARG;
+ djSP;
+EOT
+ print "\n#ifdef USE_DYNAMIC_LOADING";
+ print qq/\n\tnewXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);/;
+ print "\n#endif\n" ;
+ # delete $xsub{'DynaLoader'};
+ delete $xsub{'UNIVERSAL'};
+ print("/* bootstrapping code*/\n\tSAVETMPS;\n");
+ print("\ttarg=sv_newmortal();\n");
+ print "#ifdef DYNALOADER_BOOTSTRAP\n";
+ print "\tPUSHMARK(sp);\n";
+ print qq/\tXPUSHp("DynaLoader",strlen("DynaLoader"));\n/;
+ print qq/\tPUTBACK;\n/;
+ print "\tboot_DynaLoader(aTHX_ NULL);\n";
+ print qq/\tSPAGAIN;\n/;
+ print "#endif\n";
+ foreach my $stashname (keys %xsub){
+ if ($xsub{$stashname} ne 'Dynamic') {
+ my $stashxsub=$stashname;
+ $stashxsub =~ s/::/__/g;
+ print "\tPUSHMARK(sp);\n";
+ print qq/\tXPUSHp("$stashname",strlen("$stashname"));\n/;
+ print qq/\tPUTBACK;\n/;
+ print "\tboot_$stashxsub(aTHX_ NULL);\n";
+ print qq/\tSPAGAIN;\n/;
+ }
+ }
+ print("\tFREETMPS;\n/* end bootstrapping code */\n");
+ print "}\n";
+
+print <<'EOT';
+static void
+dl_init(pTHX)
+{
+ char *file = __FILE__;
+ dTARG;
+ djSP;
EOT
+ print("/* Dynamicboot strapping code*/\n\tSAVETMPS;\n");
+ print("\ttarg=sv_newmortal();\n");
+ foreach my $stashname (@DynaLoader::dl_modules) {
+ warn "Loaded $stashname\n";
+ if (exists($xsub{$stashname}) && $xsub{$stashname} eq 'Dynamic') {
+ my $stashxsub=$stashname;
+ $stashxsub =~ s/::/__/g;
+ print "\tPUSHMARK(sp);\n";
+ print qq/\tXPUSHp("$stashname",/,length($stashname),qq/);\n/;
+ print qq/\tPUTBACK;\n/;
+ print "#ifdef DYNALOADER_BOOTSTRAP\n";
+ warn "bootstrapping $stashname added to xs_init\n";
+ print qq/\tperl_call_method("bootstrap",G_DISCARD);\n/;
+ print "\n#else\n";
+ print "\tboot_$stashxsub(aTHX_ NULL);\n";
+ print "#endif\n";
+ print qq/\tSPAGAIN;\n/;
+ }
+ }
+ print("\tFREETMPS;\n/* end Dynamic bootstrapping code */\n");
+ print "}\n";
}
-
sub dump_symtable {
# For debugging
my ($sym, $val);
@@ -1056,107 +1253,174 @@ sub save_object {
sub Dummy_BootStrap { }
-sub B::GV::savecv {
- my $gv = shift;
- my $cv = $gv->CV;
- my $name = $gv->NAME;
- if ($$cv) {
- if ($name eq "bootstrap" && $cv->XSUB) {
- my $file = $cv->FILEGV->SV->PV;
- $bootstrap->add($file);
- my $name = $gv->STASH->NAME.'::'.$name;
- no strict 'refs';
- *{$name} = \&Dummy_BootStrap;
- $cv = $gv->CV;
- }
- if ($debug_cv) {
- warn sprintf("saving extra CV &%s::%s (0x%x) from GV 0x%x\n",
- $gv->STASH->NAME, $name, $$cv, $$gv);
- }
- my $package=$gv->STASH->NAME;
- # This seems to undo all the ->isa and prefix stuff we do below
- # so disable again for now
- if (0 && ! grep(/^$package$/,@unused_sub_packages)){
- warn sprintf("omitting cv in superclass %s", $gv->STASH->NAME)
- if $debug_cv;
- return ;
+sub B::GV::savecv
+{
+ my $gv = shift;
+ my $package=$gv->STASH->NAME;
+ my $name = $gv->NAME;
+ my $cv = $gv->CV;
+ my $sv = $gv->SV;
+ my $av = $gv->AV;
+ my $hv = $gv->HV;
+
+ # We may be looking at this package just because it is a branch in the
+ # symbol table which is on the path to a package which we need to save
+ # e.g. this is 'Getopt' and we need to save 'Getopt::Long'
+ #
+ return unless ($unused_sub_packages{$package});
+ return unless ($$cv || $$av || $$sv || $$hv);
+ $gv->save;
+}
+
+sub mark_package
+{
+ my $package = shift;
+ unless ($unused_sub_packages{$package})
+ {
+ no strict 'refs';
+ $unused_sub_packages{$package} = 1;
+ if (defined @{$package.'::ISA'})
+ {
+ foreach my $isa (@{$package.'::ISA'})
+ {
+ if ($isa eq 'DynaLoader')
+ {
+ unless (defined(&{$package.'::bootstrap'}))
+ {
+ warn "Forcing bootstrap of $package\n";
+ eval { $package->bootstrap };
+ }
+ }
+# else
+ {
+ unless ($unused_sub_packages{$isa})
+ {
+ warn "$isa saved (it is in $package\'s \@ISA)\n";
+ mark_package($isa);
+ }
+ }
}
- $gv->save;
}
- elsif ($name eq 'ISA')
- {
- $gv->save;
- }
-
+ }
+ return 1;
+}
+
+sub should_save
+{
+ no strict qw(vars refs);
+ my $package = shift;
+ $package =~ s/::$//;
+ return $unused_sub_packages{$package} = 0 if ($package =~ /::::/); # skip ::::ISA::CACHE etc.
+ # warn "Considering $package\n";#debug
+ foreach my $u (grep($unused_sub_packages{$_},keys %unused_sub_packages))
+ {
+ # If this package is a prefix to something we are saving, traverse it
+ # but do not mark it for saving if it is not already
+ # e.g. to get to Getopt::Long we need to traverse Getopt but need
+ # not save Getopt
+ return 1 if ($u =~ /^$package\:\:/);
+ }
+ if (exists $unused_sub_packages{$package})
+ {
+ # warn "Cached $package is ".$unused_sub_packages{$package}."\n";
+ delete_unsaved_hashINC($package) unless $unused_sub_packages{$package} ;
+ return $unused_sub_packages{$package};
+ }
+ # Omit the packages which we use (and which cause grief
+ # because of fancy "goto &$AUTOLOAD" stuff).
+ # XXX Surely there must be a nicer way to do this.
+ if ($package eq "FileHandle" || $package eq "Config" ||
+ $package eq "SelectSaver" || $package =~/^(B|IO)::/)
+ {
+ delete_unsaved_hashINC($package);
+ return $unused_sub_packages{$package} = 0;
+ }
+ # Now see if current package looks like an OO class this is probably too strong.
+ foreach my $m (qw(new DESTROY TIESCALAR TIEARRAY TIEHASH TIEHANDLE))
+ {
+ if ($package->can($m))
+ {
+ warn "$package has method $m: saving package\n";#debug
+ return mark_package($package);
+ }
+ }
+ delete_unsaved_hashINC($package);
+ return $unused_sub_packages{$package} = 0;
+}
+sub delete_unsaved_hashINC{
+ my $packname=shift;
+ $packname =~ s/\:\:/\//g;
+ $packname .= '.pm';
+# warn "deleting $packname" if $INC{$packname} ;# debug
+ delete $INC{$packname};
+}
+sub walkpackages
+{
+ my ($symref, $recurse, $prefix) = @_;
+ my $sym;
+ my $ref;
+ no strict 'vars';
+ local(*glob);
+ $prefix = '' unless defined $prefix;
+ while (($sym, $ref) = each %$symref)
+ {
+ *glob = $ref;
+ if ($sym =~ /::$/)
+ {
+ $sym = $prefix . $sym;
+ if ($sym ne "main::" && &$recurse($sym))
+ {
+ walkpackages(\%glob, $recurse, $sym);
+ }
+ }
+ }
}
+sub save_unused_subs
+{
+ no strict qw(refs);
+ &descend_marked_unused;
+ warn "Prescan\n";
+ walkpackages(\%{"main::"}, sub { should_save($_[0]); return 1 });
+ warn "Saving methods\n";
+ walksymtable(\%{"main::"}, "savecv", \&should_save);
+}
-sub save_unused_subs {
- my %search_pack;
- map { $search_pack{$_} = 1 } @_;
- @unused_sub_packages=@_;
- no strict qw(vars refs);
- walksymtable(\%{"main::"}, "savecv", sub {
- my $package = shift;
- $package =~ s/::$//;
- return 0 if ($package =~ /::::/); # skip ::::ISA::CACHE etc.
- #warn "Considering $package\n";#debug
- return 1 if exists $search_pack{$package};
- #sub try for a partial match
- if (grep(/^$package\:\:/,@unused_sub_packages)){
- return 1;
- }
- #warn " (nothing explicit)\n";#debug
- # Omit the packages which we use (and which cause grief
- # because of fancy "goto &$AUTOLOAD" stuff).
- # XXX Surely there must be a nicer way to do this.
- if ($package eq "FileHandle"
- || $package eq "Config"
- || $package eq "SelectSaver") {
- return 0;
- }
- foreach my $u (keys %search_pack) {
- if ($package =~ /^${u}::/) {
- warn "$package starts with $u\n";
- return 1
- }
- if ($package->isa($u)) {
- warn "$package isa $u\n";
- return 1
- }
- return 1 if $package->isa($u);
- }
- foreach my $m (qw(new DESTROY TIESCALAR TIEARRAY TIEHASH)) {
- if (defined(&{$package."::$m"})) {
- warn "$package has method $m: -u$package assumed\n";#debug
- push @unused_sub_package, $package;
- return 1;
- }
- }
- return 0;
- });
+sub save_context
+{
+ my $curpad_nam = (comppadlist->ARRAY)[0]->save;
+ my $curpad_sym = (comppadlist->ARRAY)[1]->save;
+ my $inc_hv = svref_2object(\%INC)->save;
+ my $inc_av = svref_2object(\@INC)->save;
+ my $amagic_generate= amagic_generation;
+ $init->add( "PL_curpad = AvARRAY($curpad_sym);",
+ "GvHV(PL_incgv) = $inc_hv;",
+ "GvAV(PL_incgv) = $inc_av;",
+ "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));",
+ "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));",
+ "PL_amagic_generation= $amagic_generate;" );
}
+sub descend_marked_unused {
+ foreach my $pack (keys %unused_sub_packages)
+ {
+ mark_package($pack);
+ }
+}
+
sub save_main {
+ warn "Starting compile\n";
warn "Walking tree\n";
- my $curpad_nam = (comppadlist->ARRAY)[0]->save;
- my $curpad_sym = (comppadlist->ARRAY)[1]->save;
- my $init_av = init_av->save;
- my $inc_hv = svref_2object(\%INC)->save;
- my $inc_av = svref_2object(\@INC)->save;
+ seek(STDOUT,0,0); #exclude print statements in BEGIN{} into output
walkoptree(main_root, "save");
warn "done main optree, walking symtable for extras\n" if $debug_cv;
- save_unused_subs(@unused_sub_packages);
-
+ save_unused_subs();
+ my $init_av = init_av->save;
$init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}),
sprintf("PL_main_start = s\\_%x;", ${main_start()}),
- "PL_curpad = AvARRAY($curpad_sym);",
- "PL_initav = $init_av;",
- "GvHV(PL_incgv) = $inc_hv;",
- "GvAV(PL_incgv) = $inc_av;",
- "av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));",
- "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));");
+ "PL_initav = (AV *) $init_av;");
+ save_context();
warn "Writing output\n";
output_boilerplate();
print "\n";
@@ -1168,7 +1432,7 @@ sub save_main {
sub init_sections {
my @sections = (init => \$init, decl => \$decl, sym => \$symsect,
binop => \$binopsect, condop => \$condopsect,
- cop => \$copsect, cvop => \$cvopsect, gvop => \$gvopsect,
+ cop => \$copsect, padop => \$padopsect,
listop => \$listopsect, logop => \$logopsect,
loop => \$loopsect, op => \$opsect, pmop => \$pmopsect,
pvop => \$pvopsect, svop => \$svopsect, unop => \$unopsect,
@@ -1177,11 +1441,17 @@ sub init_sections {
xpviv => \$xpvivsect, xpvnv => \$xpvnvsect,
xpvmg => \$xpvmgsect, xpvlv => \$xpvlvsect,
xrv => \$xrvsect, xpvbm => \$xpvbmsect,
- xpvio => \$xpviosect, bootstrap => \$bootstrap);
+ xpvio => \$xpviosect);
my ($name, $sectref);
while (($name, $sectref) = splice(@sections, 0, 2)) {
- $$sectref = new B::Section $name, \%symtable, 0;
+ $$sectref = new B::C::Section $name, \%symtable, 0;
}
+}
+
+sub mark_unused
+{
+ my ($arg,$val) = @_;
+ $unused_sub_packages{$arg} = $val;
}
sub compile {
@@ -1226,7 +1496,7 @@ sub compile {
$verbose = 1;
} elsif ($opt eq "u") {
$arg ||= shift @options;
- push(@unused_sub_packages, $arg);
+ mark_unused($arg,undef);
} elsif ($opt eq "f") {
$arg ||= shift @options;
if ($arg eq "cog") {
@@ -1241,6 +1511,8 @@ sub compile {
# Optimisations for -O1
$pv_copy_on_grow = 1;
}
+ } elsif ($opt eq "l") {
+ $max_string_len = $arg;
}
}
init_sections();
@@ -1356,6 +1628,15 @@ No copy-on-grow.
Optimisation level (n = 0, 1, 2, ...). B<-O> means B<-O1>. Currently,
B<-O1> and higher set B<-fcog>.
+=item B<-llimit>
+
+Some C compilers impose an arbitrary limit on the length of string
+constants (e.g. 2048 characters for Microsoft Visual C++). The
+B<-llimit> options tells the C backend not to generate string literals
+exceeding that limit.
+
+=back
+
=head1 EXAMPLES
perl -MO=C,-ofoo.c foo.pl
@@ -1365,7 +1646,7 @@ Note that C<cc_harness> lives in the C<B> subdirectory of your perl
library directory. The utility called C<perlcc> may also be used to
help make use of this compiler.
- perl -MO=C,-v,-DcA bar.pl > /dev/null
+ perl -MO=C,-v,-DcA,-l2048 bar.pl > /dev/null
=head1 BUGS
diff --git a/contrib/perl5/ext/B/B/CC.pm b/contrib/perl5/ext/B/B/CC.pm
index d200d70..c5ca2a3 100644
--- a/contrib/perl5/ext/B/B/CC.pm
+++ b/contrib/perl5/ext/B/B/CC.pm
@@ -6,36 +6,22 @@
# License or the Artistic License, as specified in the README file.
#
package B::CC;
+use Config;
use strict;
use B qw(main_start main_root class comppadlist peekop svref_2object
- timing_info);
-use B::C qw(save_unused_subs objsym init_sections
+ timing_info init_av sv_undef amagic_generation
+ OPf_WANT_LIST OPf_WANT OPf_MOD OPf_STACKED OPf_SPECIAL
+ OPpASSIGN_BACKWARDS OPpLVAL_INTRO OPpDEREF_AV OPpDEREF_HV
+ OPpDEREF OPpFLIP_LINENUM G_ARRAY G_SCALAR
+ CXt_NULL CXt_SUB CXt_EVAL CXt_LOOP CXt_SUBST CXt_BLOCK
+ );
+use B::C qw(save_unused_subs objsym init_sections mark_unused
output_all output_boilerplate output_main);
use B::Bblock qw(find_leaders);
use B::Stackobj qw(:types :flags);
# These should probably be elsewhere
# Flags for $op->flags
-sub OPf_LIST () { 1 }
-sub OPf_KNOW () { 2 }
-sub OPf_MOD () { 32 }
-sub OPf_STACKED () { 64 }
-sub OPf_SPECIAL () { 128 }
-# op-specific flags for $op->private
-sub OPpASSIGN_BACKWARDS () { 64 }
-sub OPpLVAL_INTRO () { 128 }
-sub OPpDEREF_AV () { 32 }
-sub OPpDEREF_HV () { 64 }
-sub OPpDEREF () { OPpDEREF_AV|OPpDEREF_HV }
-sub OPpFLIP_LINENUM () { 64 }
-sub G_ARRAY () { 1 }
-# cop.h
-sub CXt_NULL () { 0 }
-sub CXt_SUB () { 1 }
-sub CXt_EVAL () { 2 }
-sub CXt_LOOP () { 3 }
-sub CXt_SUBST () { 4 }
-sub CXt_BLOCK () { 5 }
my $module; # module name (when compiled with -m)
my %done; # hash keyed by $$op of leaders of basic blocks
@@ -66,6 +52,9 @@ my %skip_stack; # Hash of PP names which don't need write_back_stack
my %skip_lexicals; # Hash of PP names which don't need write_back_lexicals
my %skip_invalidate; # Hash of PP names which don't need invalidate_lexicals
my %ignore_op; # Hash of ops which do nothing except returning op_next
+my %need_curcop; # Hash of ops which need PL_curcop
+
+my %lexstate; #state of padsvs at the start of a bblock
BEGIN {
foreach (qw(pp_scalar pp_regcmaybe pp_lineseq pp_scope pp_null)) {
@@ -73,11 +62,6 @@ BEGIN {
}
}
-my @unused_sub_packages; # list of packages (given by -u options) to search
- # explicitly and save every sub we find there, even
- # if apparently unused (could be only referenced from
- # an eval "" or from a $SIG{FOO} = "bar").
-
my ($module_name);
my ($debug_op, $debug_stack, $debug_cxstack, $debug_pad, $debug_runtime,
$debug_shadow, $debug_queue, $debug_lineno, $debug_timings);
@@ -111,12 +95,17 @@ sub init_hash { map { $_ => 1 } @_ }
#
%skip_lexicals = init_hash qw(pp_enter pp_enterloop);
%skip_invalidate = init_hash qw(pp_enter pp_enterloop);
+%need_curcop = init_hash qw(pp_rv2gv pp_bless pp_repeat pp_sort pp_caller
+ pp_reset pp_rv2cv pp_entereval pp_require pp_dofile
+ pp_entertry pp_enterloop pp_enteriter pp_entersub
+ pp_enter pp_method);
sub debug {
if ($debug_runtime) {
warn(@_);
} else {
- runtime(map { chomp; "/* $_ */"} @_);
+ my @tmp=@_;
+ runtime(map { chomp; "/* $_ */"} @tmp);
}
}
@@ -139,7 +128,7 @@ sub output_runtime {
print qq(#include "cc_runtime.h"\n);
foreach $ppdata (@pp_list) {
my ($name, $runtime, $declare) = @$ppdata;
- print "\nstatic\nPP($name)\n{\n";
+ print "\nstatic\nCCPP($name)\n{\n";
my ($type, $varlist, $line);
while (($type, $varlist) = each %$declare) {
print "\t$type ", join(", ", @$varlist), ";\n";
@@ -167,7 +156,7 @@ sub init_pp {
declare("SV", "**svp");
map { declare("SV", "*$_") } qw(sv src dst left right);
declare("MAGIC", "*mg");
- $decl->add("static OP * $ppname _((ARGSproto));");
+ $decl->add("static OP * $ppname (pTHX);");
debug "init_pp: $ppname\n" if $debug_queue;
}
@@ -200,7 +189,7 @@ sub top_int { @stack ? $stack[-1]->as_int : "TOPi" }
sub top_double { @stack ? $stack[-1]->as_double : "TOPn" }
sub top_numeric { @stack ? $stack[-1]->as_numeric : "TOPn" }
sub top_sv { @stack ? $stack[-1]->as_sv : "TOPs" }
-sub top_bool { @stack ? $stack[-1]->as_numeric : "SvTRUE(TOPs)" }
+sub top_bool { @stack ? $stack[-1]->as_bool : "SvTRUE(TOPs)" }
sub pop_int { @stack ? (pop @stack)->as_int : "POPi" }
sub pop_double { @stack ? (pop @stack)->as_double : "POPn" }
@@ -208,7 +197,7 @@ sub pop_numeric { @stack ? (pop @stack)->as_numeric : "POPn" }
sub pop_sv { @stack ? (pop @stack)->as_sv : "POPs" }
sub pop_bool {
if (@stack) {
- return ((pop @stack)->as_numeric);
+ return ((pop @stack)->as_bool);
} else {
# Careful: POPs has an auto-decrement and SvTRUE evaluates
# its argument more than once.
@@ -228,6 +217,32 @@ sub write_back_lexicals {
}
}
+sub save_or_restore_lexical_state {
+ my $bblock=shift;
+ unless( exists $lexstate{$bblock}){
+ foreach my $lex (@pad) {
+ next unless ref($lex);
+ ${$lexstate{$bblock}}{$lex->{iv}} = $lex->{flags} ;
+ }
+ }
+ else {
+ foreach my $lex (@pad) {
+ next unless ref($lex);
+ my $old_flags=${$lexstate{$bblock}}{$lex->{iv}} ;
+ next if ( $old_flags eq $lex->{flags});
+ if (($old_flags & VALID_SV) && !($lex->{flags} & VALID_SV)){
+ $lex->write_back;
+ }
+ if (($old_flags & VALID_DOUBLE) && !($lex->{flags} & VALID_DOUBLE)){
+ $lex->load_double;
+ }
+ if (($old_flags & VALID_INT) && !($lex->{flags} & VALID_INT)){
+ $lex->load_int;
+ }
+ }
+ }
+}
+
sub write_back_stack {
my $obj;
return unless @stack;
@@ -350,8 +365,9 @@ sub dopoptoloop {
sub dopoptolabel {
my $label = shift;
my $cxix = $#cxstack;
- while ($cxix >= 0 && $cxstack[$cxix]->{type} != CXt_LOOP
- && $cxstack[$cxix]->{label} ne $label) {
+ while ($cxix >= 0 &&
+ ($cxstack[$cxix]->{type} != CXt_LOOP ||
+ $cxstack[$cxix]->{label} ne $label)) {
$cxix--;
}
debug "dopoptolabel: returning $cxix" if $debug_cxstack;
@@ -360,7 +376,7 @@ sub dopoptolabel {
sub error {
my $format = shift;
- my $file = $curcop->[0]->filegv->SV->PV;
+ my $file = $curcop->[0]->file;
my $line = $curcop->[0]->line;
$errors++;
if (@_) {
@@ -416,12 +432,22 @@ sub load_pad {
}
$pad[$ix] = new B::Stackobj::Padsv ($type, $flags, $ix,
"i_$name", "d_$name");
- declare("IV", $type == T_INT ? "i_$name = 0" : "i_$name");
- declare("double", $type == T_DOUBLE ? "d_$name = 0" : "d_$name");
+
debug sprintf("PL_curpad[$ix] = %s\n", $pad[$ix]->peek) if $debug_pad;
}
}
+sub declare_pad {
+ my $ix;
+ for ($ix = 1; $ix <= $#pad; $ix++) {
+ my $type = $pad[$ix]->{type};
+ declare("IV", $type == T_INT ?
+ sprintf("%s=0",$pad[$ix]->{iv}):$pad[$ix]->{iv}) if $pad[$ix]->save_int;
+ declare("double", $type == T_DOUBLE ?
+ sprintf("%s = 0",$pad[$ix]->{nv}):$pad[$ix]->{nv} )if $pad[$ix]->save_double;
+
+ }
+}
#
# Debugging stuff
#
@@ -461,7 +487,7 @@ sub doop {
sub gimme {
my $op = shift;
my $flags = $op->flags;
- return (($flags & OPf_KNOW) ? ($flags & OPf_LIST) : "dowantarray()");
+ return (($flags & OPf_WANT) ? (($flags & OPf_WANT)== OPf_WANT_LIST? G_ARRAY:G_SCALAR) : "dowantarray()");
}
#
@@ -476,10 +502,12 @@ sub pp_null {
sub pp_stub {
my $op = shift;
my $gimme = gimme($op);
- if ($gimme != 1) {
+ if ($gimme != G_ARRAY) {
+ my $obj= new B::Stackobj::Const(sv_undef);
+ push(@stack, $obj);
# XXX Change to push a constant sv_undef Stackobj onto @stack
- write_back_stack();
- runtime("if ($gimme != G_ARRAY) XPUSHs(&PL_sv_undef);");
+ #write_back_stack();
+ #runtime("if ($gimme != G_ARRAY) XPUSHs(&PL_sv_undef);");
}
return $op->next;
}
@@ -499,8 +527,10 @@ sub pp_and {
if (@stack >= 1) {
my $bool = pop_bool();
write_back_stack();
- runtime(sprintf("if (!$bool) goto %s;", label($next)));
+ save_or_restore_lexical_state($$next);
+ runtime(sprintf("if (!$bool) {XPUSHs(&PL_sv_no); goto %s;}", label($next)));
} else {
+ save_or_restore_lexical_state($$next);
runtime(sprintf("if (!%s) goto %s;", top_bool(), label($next)),
"*sp--;");
}
@@ -513,11 +543,13 @@ sub pp_or {
reload_lexicals();
unshift(@bblock_todo, $next);
if (@stack >= 1) {
- my $obj = pop @stack;
+ my $bool = pop_bool @stack;
write_back_stack();
- runtime(sprintf("if (%s) { XPUSHs(%s); goto %s; }",
- $obj->as_numeric, $obj->as_sv, label($next)));
+ save_or_restore_lexical_state($$next);
+ runtime(sprintf("if (%s) { XPUSHs(&PL_sv_yes); goto %s; }",
+ $bool, label($next)));
} else {
+ save_or_restore_lexical_state($$next);
runtime(sprintf("if (%s) goto %s;", top_bool(), label($next)),
"*sp--;");
}
@@ -526,13 +558,14 @@ sub pp_or {
sub pp_cond_expr {
my $op = shift;
- my $false = $op->false;
+ my $false = $op->next;
unshift(@bblock_todo, $false);
reload_lexicals();
my $bool = pop_bool();
write_back_stack();
+ save_or_restore_lexical_state($$false);
runtime(sprintf("if (!$bool) goto %s;", label($false)));
- return $op->true;
+ return $op->other;
}
sub pp_padsv {
@@ -555,9 +588,16 @@ sub pp_padsv {
sub pp_const {
my $op = shift;
my $sv = $op->sv;
- my $obj = $constobj{$$sv};
- if (!defined($obj)) {
- $obj = $constobj{$$sv} = new B::Stackobj::Const ($sv);
+ my $obj;
+ # constant could be in the pad (under useithreads)
+ if ($$sv) {
+ $obj = $constobj{$$sv};
+ if (!defined($obj)) {
+ $obj = $constobj{$$sv} = new B::Stackobj::Const ($sv);
+ }
+ }
+ else {
+ $obj = $pad[$op->targ];
}
push(@stack, $obj);
return $op->next;
@@ -567,7 +607,7 @@ sub pp_nextstate {
my $op = shift;
$curcop->load($op);
@stack = ();
- debug(sprintf("%s:%d\n", $op->filegv->SV->PV, $op->line)) if $debug_lineno;
+ debug(sprintf("%s:%d\n", $op->file, $op->line)) if $debug_lineno;
runtime("TAINT_NOT;") unless $omit_taint;
runtime("sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;");
if ($freetmps_each_bblock || $freetmps_each_loop) {
@@ -584,18 +624,58 @@ sub pp_dbstate {
return default_pp($op);
}
-sub pp_rv2gv { $curcop->write_back; default_pp(@_) }
-sub pp_bless { $curcop->write_back; default_pp(@_) }
-sub pp_repeat { $curcop->write_back; default_pp(@_) }
+#default_pp will handle this:
+#sub pp_bless { $curcop->write_back; default_pp(@_) }
+#sub pp_repeat { $curcop->write_back; default_pp(@_) }
# The following subs need $curcop->write_back if we decide to support arybase:
# pp_pos, pp_substr, pp_index, pp_rindex, pp_aslice, pp_lslice, pp_splice
-sub pp_sort { $curcop->write_back; default_pp(@_) }
-sub pp_caller { $curcop->write_back; default_pp(@_) }
-sub pp_reset { $curcop->write_back; default_pp(@_) }
+#sub pp_caller { $curcop->write_back; default_pp(@_) }
+#sub pp_reset { $curcop->write_back; default_pp(@_) }
+
+sub pp_rv2gv{
+ my $op =shift;
+ $curcop->write_back;
+ write_back_lexicals() unless $skip_lexicals{$ppname};
+ write_back_stack() unless $skip_stack{$ppname};
+ my $sym=doop($op);
+ if ($op->private & OPpDEREF) {
+ $init->add(sprintf("((UNOP *)$sym)->op_first = $sym;"));
+ $init->add(sprintf("((UNOP *)$sym)->op_type = %d;",
+ $op->first->type));
+ }
+ return $op->next;
+}
+sub pp_sort {
+ my $op = shift;
+ my $ppname = $op->ppaddr;
+ if ( $op->flags & OPf_SPECIAL && $op->flags & OPf_STACKED){
+ #this indicates the sort BLOCK Array case
+ #ugly surgery required.
+ my $root=$op->first->sibling->first;
+ my $start=$root->first;
+ $op->first->save;
+ $op->first->sibling->save;
+ $root->save;
+ my $sym=$start->save;
+ my $fakeop=cc_queue("pp_sort".$$op,$root,$start);
+ $init->add(sprintf("(%s)->op_next=%s;",$sym,$fakeop));
+ }
+ $curcop->write_back;
+ write_back_lexicals();
+ write_back_stack();
+ doop($op);
+ return $op->next;
+}
sub pp_gv {
my $op = shift;
- my $gvsym = $op->gv->save;
+ my $gvsym;
+ if ($Config{useithreads}) {
+ $gvsym = $pad[$op->padix]->as_sv;
+ }
+ else {
+ $gvsym = $op->gv->save;
+ }
write_back_stack();
runtime("XPUSHs((SV*)$gvsym);");
return $op->next;
@@ -603,7 +683,13 @@ sub pp_gv {
sub pp_gvsv {
my $op = shift;
- my $gvsym = $op->gv->save;
+ my $gvsym;
+ if ($Config{useithreads}) {
+ $gvsym = $pad[$op->padix]->as_sv;
+ }
+ else {
+ $gvsym = $op->gv->save;
+ }
write_back_stack();
if ($op->private & OPpLVAL_INTRO) {
runtime("XPUSHs(save_scalar($gvsym));");
@@ -615,7 +701,13 @@ sub pp_gvsv {
sub pp_aelemfast {
my $op = shift;
- my $gvsym = $op->gv->save;
+ my $gvsym;
+ if ($Config{useithreads}) {
+ $gvsym = $pad[$op->padix]->as_sv;
+ }
+ else {
+ $gvsym = $op->gv->save;
+ }
my $ix = $op->private;
my $flag = $op->flags & OPf_MOD;
write_back_stack();
@@ -666,11 +758,15 @@ sub numeric_binop {
}
} else {
if ($force_int) {
+ my $rightruntime = new B::Pseudoreg ("IV", "riv");
+ runtime(sprintf("$$rightruntime = %s;",$right));
runtime(sprintf("sv_setiv(TOPs, %s);",
- &$operator("TOPi", $right)));
+ &$operator("TOPi", $$rightruntime)));
} else {
+ my $rightruntime = new B::Pseudoreg ("double", "rnv");
+ runtime(sprintf("$$rightruntime = %s;",$right));
runtime(sprintf("sv_setnv(TOPs, %s);",
- &$operator("TOPn", $right)));
+ &$operator("TOPn",$$rightruntime)));
}
}
} else {
@@ -694,6 +790,60 @@ sub numeric_binop {
return $op->next;
}
+sub pp_ncmp {
+ my ($op) = @_;
+ if ($op->flags & OPf_STACKED) {
+ my $right = pop_numeric();
+ if (@stack >= 1) {
+ my $left = top_numeric();
+ runtime sprintf("if (%s > %s){",$left,$right);
+ $stack[-1]->set_int(1);
+ $stack[-1]->write_back();
+ runtime sprintf("}else if (%s < %s ) {",$left,$right);
+ $stack[-1]->set_int(-1);
+ $stack[-1]->write_back();
+ runtime sprintf("}else if (%s == %s) {",$left,$right);
+ $stack[-1]->set_int(0);
+ $stack[-1]->write_back();
+ runtime sprintf("}else {");
+ $stack[-1]->set_sv("&PL_sv_undef");
+ runtime "}";
+ } else {
+ my $rightruntime = new B::Pseudoreg ("double", "rnv");
+ runtime(sprintf("$$rightruntime = %s;",$right));
+ runtime sprintf(qq/if ("TOPn" > %s){/,$rightruntime);
+ runtime sprintf("sv_setiv(TOPs,1);");
+ runtime sprintf(qq/}else if ( "TOPn" < %s ) {/,$$rightruntime);
+ runtime sprintf("sv_setiv(TOPs,-1);");
+ runtime sprintf(qq/} else if ("TOPn" == %s) {/,$$rightruntime);
+ runtime sprintf("sv_setiv(TOPs,0);");
+ runtime sprintf(qq/}else {/);
+ runtime sprintf("sv_setiv(TOPs,&PL_sv_undef;");
+ runtime "}";
+ }
+ } else {
+ my $targ = $pad[$op->targ];
+ my $right = new B::Pseudoreg ("double", "rnv");
+ my $left = new B::Pseudoreg ("double", "lnv");
+ runtime(sprintf("$$right = %s; $$left = %s;",
+ pop_numeric(), pop_numeric));
+ runtime sprintf("if (%s > %s){",$$left,$$right);
+ $targ->set_int(1);
+ $targ->write_back();
+ runtime sprintf("}else if (%s < %s ) {",$$left,$$right);
+ $targ->set_int(-1);
+ $targ->write_back();
+ runtime sprintf("}else if (%s == %s) {",$$left,$$right);
+ $targ->set_int(0);
+ $targ->write_back();
+ runtime sprintf("}else {");
+ $targ->set_sv("&PL_sv_undef");
+ runtime "}";
+ push(@stack, $targ);
+ }
+ return $op->next;
+}
+
sub sv_binop {
my ($op, $operator, $flags) = @_;
if ($op->flags & OPf_STACKED) {
@@ -789,7 +939,6 @@ BEGIN {
my $modulo_op = infix_op("%");
my $lshift_op = infix_op("<<");
my $rshift_op = infix_op(">>");
- my $ncmp_op = sub { "($_[0] > $_[1] ? 1 : ($_[0] < $_[1]) ? -1 : 0)" };
my $scmp_op = prefix_op("sv_cmp");
my $seq_op = prefix_op("sv_eq");
my $sne_op = prefix_op("!sv_eq");
@@ -808,12 +957,11 @@ BEGIN {
# XXX The standard perl PP code has extra handling for
# some special case arguments of these operators.
#
- sub pp_add { numeric_binop($_[0], $plus_op, INTS_CLOSED) }
- sub pp_subtract { numeric_binop($_[0], $minus_op, INTS_CLOSED) }
- sub pp_multiply { numeric_binop($_[0], $multiply_op, INTS_CLOSED) }
+ sub pp_add { numeric_binop($_[0], $plus_op) }
+ sub pp_subtract { numeric_binop($_[0], $minus_op) }
+ sub pp_multiply { numeric_binop($_[0], $multiply_op) }
sub pp_divide { numeric_binop($_[0], $divide_op) }
sub pp_modulo { int_binop($_[0], $modulo_op) } # differs from perl's
- sub pp_ncmp { numeric_binop($_[0], $ncmp_op, INT_RESULT) }
sub pp_left_shift { int_binop($_[0], $lshift_op) }
sub pp_right_shift { int_binop($_[0], $rshift_op) }
@@ -857,7 +1005,7 @@ sub pp_sassign {
($src, $dst) = ($dst, $src) if $backwards;
my $type = $src->{type};
if ($type == T_INT) {
- $dst->set_int($src->as_int);
+ $dst->set_int($src->as_int,$src->{flags} & VALID_UNSIGNED);
} elsif ($type == T_DOUBLE) {
$dst->set_numeric($src->as_numeric);
} else {
@@ -870,7 +1018,11 @@ sub pp_sassign {
my $type = $src->{type};
runtime("if (PL_tainting && PL_tainted) TAINT_NOT;");
if ($type == T_INT) {
- runtime sprintf("sv_setiv(TOPs, %s);", $src->as_int);
+ if ($src->{flags} & VALID_UNSIGNED){
+ runtime sprintf("sv_setuv(TOPs, %s);", $src->as_int);
+ }else{
+ runtime sprintf("sv_setiv(TOPs, %s);", $src->as_int);
+ }
} elsif ($type == T_DOUBLE) {
runtime sprintf("sv_setnv(TOPs, %s);", $src->as_double);
} else {
@@ -887,7 +1039,7 @@ sub pp_sassign {
} elsif ($type == T_DOUBLE) {
$dst->set_double("SvNV(sv)");
} else {
- runtime("SvSetSV($dst->{sv}, sv);");
+ runtime("SvSetMagicSV($dst->{sv}, sv);");
$dst->invalidate;
}
}
@@ -922,6 +1074,7 @@ sub pp_preinc {
return $op->next;
}
+
sub pp_pushmark {
my $op = shift;
write_back_stack();
@@ -933,7 +1086,7 @@ sub pp_list {
my $op = shift;
write_back_stack();
my $gimme = gimme($op);
- if ($gimme == 1) { # sic
+ if ($gimme == G_ARRAY) { # sic
runtime("POPMARK;"); # need this even though not a "full" pp_list
} else {
runtime("PP_LIST($gimme);");
@@ -943,16 +1096,31 @@ sub pp_list {
sub pp_entersub {
my $op = shift;
+ $curcop->write_back;
write_back_lexicals(REGISTER|TEMPORARY);
write_back_stack();
my $sym = doop($op);
runtime("while (PL_op != ($sym)->op_next && PL_op != (OP*)0 ){");
- runtime("PL_op = (*PL_op->op_ppaddr)(ARGS);");
+ runtime("PL_op = (*PL_op->op_ppaddr)(aTHX);");
runtime("SPAGAIN;}");
$know_op = 0;
invalidate_lexicals(REGISTER|TEMPORARY);
return $op->next;
}
+sub pp_formline {
+ my $op = shift;
+ my $ppname = $op->ppaddr;
+ write_back_lexicals() unless $skip_lexicals{$ppname};
+ write_back_stack() unless $skip_stack{$ppname};
+ my $sym=doop($op);
+ # See comment in pp_grepwhile to see why!
+ $init->add("((LISTOP*)$sym)->op_first = $sym;");
+ runtime("if (PL_op == ((LISTOP*)($sym))->op_first){");
+ save_or_restore_lexical_state(${$op->first});
+ runtime( sprintf("goto %s;",label($op->first)));
+ runtime("}");
+ return $op->next;
+}
sub pp_goto{
@@ -969,7 +1137,16 @@ sub pp_enterwrite {
my $op = shift;
pp_entersub($op);
}
-
+sub pp_leavesub{
+ my $op = shift;
+ write_back_lexicals() unless $skip_lexicals{$ppname};
+ write_back_stack() unless $skip_stack{$ppname};
+ runtime("if (PL_curstackinfo->si_type == PERLSI_SORT){");
+ runtime("\tPUTBACK;return 0;");
+ runtime("}");
+ doop($op);
+ return $op->next;
+}
sub pp_leavewrite {
my $op = shift;
write_back_lexicals(REGISTER|TEMPORARY);
@@ -977,7 +1154,7 @@ sub pp_leavewrite {
my $sym = doop($op);
# XXX Is this the right way to distinguish between it returning
# CvSTART(cv) (via doform) and pop_return()?
- runtime("if (PL_op) PL_op = (*PL_op->op_ppaddr)(ARGS);");
+ #runtime("if (PL_op) PL_op = (*PL_op->op_ppaddr)(aTHX);");
runtime("SPAGAIN;");
$know_op = 0;
invalidate_lexicals(REGISTER|TEMPORARY);
@@ -991,6 +1168,7 @@ sub doeval {
write_back_stack();
my $sym = loadop($op);
my $ppaddr = $op->ppaddr;
+ #runtime(qq/printf("$ppaddr type eval\n");/);
runtime("PP_EVAL($ppaddr, ($sym)->op_next);");
$know_op = 1;
invalidate_lexicals(REGISTER|TEMPORARY);
@@ -998,9 +1176,24 @@ sub doeval {
}
sub pp_entereval { doeval(@_) }
-sub pp_require { doeval(@_) }
sub pp_dofile { doeval(@_) }
+#pp_require is protected by pp_entertry, so no protection for it.
+sub pp_require {
+ my $op = shift;
+ $curcop->write_back;
+ write_back_lexicals(REGISTER|TEMPORARY);
+ write_back_stack();
+ my $sym = doop($op);
+ runtime("while (PL_op != ($sym)->op_next && PL_op != (OP*)0 ){");
+ runtime("PL_op = (*PL_op->op_ppaddr)(ARGS);");
+ runtime("SPAGAIN;}");
+ $know_op = 1;
+ invalidate_lexicals(REGISTER|TEMPORARY);
+ return $op->next;
+}
+
+
sub pp_entertry {
my $op = shift;
$curcop->write_back;
@@ -1008,12 +1201,19 @@ sub pp_entertry {
write_back_stack();
my $sym = doop($op);
my $jmpbuf = sprintf("jmpbuf%d", $jmpbuf_ix++);
- declare("Sigjmp_buf", $jmpbuf);
+ declare("JMPENV", $jmpbuf);
runtime(sprintf("PP_ENTERTRY(%s,%s);", $jmpbuf, label($op->other->next)));
invalidate_lexicals(REGISTER|TEMPORARY);
return $op->next;
}
+sub pp_leavetry{
+ my $op=shift;
+ default_pp($op);
+ runtime("PP_LEAVETRY;");
+ return $op->next;
+}
+
sub pp_grepstart {
my $op = shift;
if ($need_freetmps && $freetmps_each_loop) {
@@ -1021,7 +1221,14 @@ sub pp_grepstart {
$need_freetmps = 0;
}
write_back_stack();
- doop($op);
+ my $sym= doop($op);
+ my $next=$op->next;
+ $next->save;
+ my $nexttonext=$next->next;
+ $nexttonext->save;
+ save_or_restore_lexical_state($$nexttonext);
+ runtime(sprintf("if (PL_op == (($sym)->op_next)->op_next) goto %s;",
+ label($nexttonext)));
return $op->next->other;
}
@@ -1032,7 +1239,16 @@ sub pp_mapstart {
$need_freetmps = 0;
}
write_back_stack();
- doop($op);
+ # pp_mapstart can return either op_next->op_next or op_next->op_other and
+ # we need to be able to distinguish the two at runtime.
+ my $sym= doop($op);
+ my $next=$op->next;
+ $next->save;
+ my $nexttonext=$next->next;
+ $nexttonext->save;
+ save_or_restore_lexical_state($$nexttonext);
+ runtime(sprintf("if (PL_op == (($sym)->op_next)->op_next) goto %s;",
+ label($nexttonext)));
return $op->next->other;
}
@@ -1049,6 +1265,7 @@ sub pp_grepwhile {
# around that, we hack op_next to be our own op (purely because we
# know it's a non-NULL pointer and can't be the same as op_other).
$init->add("((LOGOP*)$sym)->op_next = $sym;");
+ save_or_restore_lexical_state($$next);
runtime(sprintf("if (PL_op == ($sym)->op_next) goto %s;", label($next)));
$know_op = 0;
return $op->other;
@@ -1063,7 +1280,7 @@ sub pp_return {
write_back_lexicals(REGISTER|TEMPORARY);
write_back_stack();
doop($op);
- runtime("PUTBACK;", "return (PL_op)?PL_op->op_next:0;");
+ runtime("PUTBACK;", "return PL_op;");
$know_op = 0;
return $op->next;
}
@@ -1077,30 +1294,31 @@ sub nyi {
sub pp_range {
my $op = shift;
my $flags = $op->flags;
- if (!($flags & OPf_KNOW)) {
+ if (!($flags & OPf_WANT)) {
error("context of range unknown at compile-time");
}
write_back_lexicals();
write_back_stack();
- if (!($flags & OPf_LIST)) {
+ unless (($flags & OPf_WANT)== OPf_WANT_LIST) {
# We need to save our UNOP structure since pp_flop uses
# it to find and adjust out targ. We don't need it ourselves.
$op->save;
+ save_or_restore_lexical_state(${$op->other});
runtime sprintf("if (SvTRUE(PL_curpad[%d])) goto %s;",
- $op->targ, label($op->false));
- unshift(@bblock_todo, $op->false);
+ $op->targ, label($op->other));
+ unshift(@bblock_todo, $op->other);
}
- return $op->true;
+ return $op->next;
}
sub pp_flip {
my $op = shift;
my $flags = $op->flags;
- if (!($flags & OPf_KNOW)) {
+ if (!($flags & OPf_WANT)) {
error("context of flip unknown at compile-time");
}
- if ($flags & OPf_LIST) {
- return $op->first->false;
+ if (($flags & OPf_WANT)==OPf_WANT_LIST) {
+ return $op->first->other;
}
write_back_lexicals();
write_back_stack();
@@ -1116,9 +1334,10 @@ sub pp_flip {
if ($op->flags & OPf_SPECIAL) {
runtime("sv_setiv(PL_curpad[$ix], 1);");
} else {
+ save_or_restore_lexical_state(${$op->first->other});
runtime("\tsv_setiv(PL_curpad[$ix], 0);",
"\tsp--;",
- sprintf("\tgoto %s;", label($op->first->false)));
+ sprintf("\tgoto %s;", label($op->first->other)));
}
runtime("}",
qq{sv_setpv(PL_curpad[$ix], "");},
@@ -1187,6 +1406,7 @@ sub pp_next {
default_pp($op);
my $nextop = $cxstack[$cxix]->{nextop};
push(@bblock_todo, $nextop);
+ save_or_restore_lexical_state($$nextop);
runtime(sprintf("goto %s;", label($nextop)));
return $op->next;
}
@@ -1210,6 +1430,7 @@ sub pp_redo {
default_pp($op);
my $redoop = $cxstack[$cxix]->{redoop};
push(@bblock_todo, $redoop);
+ save_or_restore_lexical_state($$redoop);
runtime(sprintf("goto %s;", label($redoop)));
return $op->next;
}
@@ -1238,6 +1459,7 @@ sub pp_last {
default_pp($op);
my $lastop = $cxstack[$cxix]->{lastop}->next;
push(@bblock_todo, $lastop);
+ save_or_restore_lexical_state($$lastop);
runtime(sprintf("goto %s;", label($lastop)));
return $op->next;
}
@@ -1249,6 +1471,7 @@ sub pp_subst {
my $sym = doop($op);
my $replroot = $op->pmreplroot;
if ($$replroot) {
+ save_or_restore_lexical_state($$replroot);
runtime sprintf("if (PL_op == ((PMOP*)(%s))->op_pmreplroot) goto %s;",
$sym, label($replroot));
$op->pmreplstart->save;
@@ -1264,11 +1487,12 @@ sub pp_substcont {
write_back_stack();
doop($op);
my $pmop = $op->other;
- warn sprintf("substcont: op = %s, pmop = %s\n",
- peekop($op), peekop($pmop));#debug
-# my $pmopsym = objsym($pmop);
+ # warn sprintf("substcont: op = %s, pmop = %s\n",
+ # peekop($op), peekop($pmop));#debug
+# my $pmopsym = objsym($pmop);
my $pmopsym = $pmop->save; # XXX can this recurse?
- warn "pmopsym = $pmopsym\n";#debug
+# warn "pmopsym = $pmopsym\n";#debug
+ save_or_restore_lexical_state(${$pmop->pmreplstart});
runtime sprintf("if (PL_op == ((PMOP*)(%s))->op_pmreplstart) goto %s;",
$pmopsym, label($pmop->pmreplstart));
invalidate_lexicals();
@@ -1277,7 +1501,10 @@ sub pp_substcont {
sub default_pp {
my $op = shift;
- my $ppname = $op->ppaddr;
+ my $ppname = "pp_" . $op->name;
+ if ($curcop and $need_curcop{$ppname}){
+ $curcop->write_back;
+ }
write_back_lexicals() unless $skip_lexicals{$ppname};
write_back_stack() unless $skip_stack{$ppname};
doop($op);
@@ -1291,7 +1518,7 @@ sub default_pp {
sub compile_op {
my $op = shift;
- my $ppname = $op->ppaddr;
+ my $ppname = "pp_" . $op->name;
if (exists $ignore_op{$ppname}) {
return $op->next;
}
@@ -1313,6 +1540,7 @@ sub compile_op {
sub compile_bblock {
my $op = shift;
#warn "compile_bblock: ", peekop($op), "\n"; # debug
+ save_or_restore_lexical_state($$op);
write_label($op);
$know_op = 0;
do {
@@ -1326,15 +1554,26 @@ sub compile_bblock {
sub cc {
my ($name, $root, $start, @padlist) = @_;
my $op;
+ if($done{$$start}){
+ #warn "repeat=>".ref($start)."$name,\n";#debug
+ $decl->add(sprintf("#define $name %s",$done{$$start}));
+ return;
+ }
init_pp($name);
load_pad(@padlist);
+ %lexstate=();
B::Pseudoreg->new_scope;
@cxstack = ();
if ($debug_timings) {
warn sprintf("Basic block analysis at %s\n", timing_info);
}
$leaders = find_leaders($root, $start);
- @bblock_todo = ($start, values %$leaders);
+ my @leaders= keys %$leaders;
+ if ($#leaders > -1) {
+ @bblock_todo = ($start, values %$leaders) ;
+ } else{
+ runtime("return PL_op?PL_op->op_next:0;");
+ }
if ($debug_timings) {
warn sprintf("Compilation at %s\n", timing_info);
}
@@ -1344,7 +1583,7 @@ sub cc {
next if !defined($op) || !$$op || $done{$$op};
#warn "...compiling it\n"; # debug
do {
- $done{$$op} = 1;
+ $done{$$op} = $name;
$op = compile_bblock($op);
if ($need_freetmps && $freetmps_each_bblock) {
runtime("FREETMPS;");
@@ -1356,14 +1595,16 @@ sub cc {
$need_freetmps = 0;
}
if (!$$op) {
- runtime("PUTBACK;","return (PL_op)?PL_op->op_next:0;");
+ runtime("PUTBACK;","return PL_op;");
} elsif ($done{$$op}) {
+ save_or_restore_lexical_state($$op);
runtime(sprintf("goto %s;", label($op)));
}
}
if ($debug_timings) {
warn sprintf("Saving runtime at %s\n", timing_info);
}
+ declare_pad(@padlist) ;
save_runtime();
}
@@ -1387,20 +1628,32 @@ sub cc_obj {
sub cc_main {
my @comppadlist = comppadlist->ARRAY;
- my $curpad_nam = $comppadlist[0]->save;
- my $curpad_sym = $comppadlist[1]->save;
+ my $curpad_nam = $comppadlist[0]->save;
+ my $curpad_sym = $comppadlist[1]->save;
+ my $init_av = init_av->save;
my $start = cc_recurse("pp_main", main_root, main_start, @comppadlist);
- save_unused_subs(@unused_sub_packages);
+ # Do save_unused_subs before saving inc_hv
+ save_unused_subs();
cc_recurse();
+ my $inc_hv = svref_2object(\%INC)->save;
+ my $inc_av = svref_2object(\@INC)->save;
+ my $amagic_generate= amagic_generation;
return if $errors;
if (!defined($module)) {
$init->add(sprintf("PL_main_root = s\\_%x;", ${main_root()}),
"PL_main_start = $start;",
"PL_curpad = AvARRAY($curpad_sym);",
+ "PL_initav = (AV *) $init_av;",
+ "GvHV(PL_incgv) = $inc_hv;",
+ "GvAV(PL_incgv) = $inc_av;",
"av_store(CvPADLIST(PL_main_cv),0,SvREFCNT_inc($curpad_nam));",
- "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));");
+ "av_store(CvPADLIST(PL_main_cv),1,SvREFCNT_inc($curpad_sym));",
+ "PL_amagic_generation= $amagic_generate;",
+ );
+
}
+ seek(STDOUT,0,0); #prevent print statements from BEGIN{} into the output
output_boilerplate();
print "\n";
output_all("perl_init");
@@ -1419,11 +1672,11 @@ XS(boot_$cmodule)
perl_init();
ENTER;
SAVETMPS;
- SAVESPTR(PL_curpad);
- SAVESPTR(PL_op);
+ SAVEVPTR(PL_curpad);
+ SAVEVPTR(PL_op);
PL_curpad = AvARRAY($curpad_sym);
PL_op = $start;
- pp_main(ARGS);
+ pp_main(aTHX);
FREETMPS;
LEAVE;
ST(0) = &PL_sv_yes;
@@ -1459,7 +1712,7 @@ sub compile {
$module_name = $arg;
} elsif ($opt eq "u") {
$arg ||= shift @options;
- push(@unused_sub_packages, $arg);
+ mark_unused($arg,undef);
} elsif ($opt eq "f") {
$arg ||= shift @options;
my $value = $arg !~ s/^no-//;
@@ -1485,7 +1738,7 @@ sub compile {
} elsif ($opt eq "m") {
$arg ||= shift @options;
$module = $arg;
- push(@unused_sub_packages, $arg);
+ mark_unused($arg,undef);
} elsif ($opt eq "p") {
$arg ||= shift @options;
$patchlevel = $arg;
diff --git a/contrib/perl5/ext/B/B/Debug.pm b/contrib/perl5/ext/B/B/Debug.pm
index 7754a5a..ae7a973 100644
--- a/contrib/perl5/ext/B/B/Debug.pm
+++ b/contrib/perl5/ext/B/B/Debug.pm
@@ -39,13 +39,6 @@ sub B::LOGOP::debug {
printf "\top_other\t0x%x\n", ${$op->other};
}
-sub B::CONDOP::debug {
- my ($op) = @_;
- $op->B::UNOP::debug();
- printf "\top_true\t0x%x\n", ${$op->true};
- printf "\top_false\t0x%x\n", ${$op->false};
-}
-
sub B::LISTOP::debug {
my ($op) = @_;
$op->B::BINOP::debug();
@@ -67,16 +60,15 @@ sub B::PMOP::debug {
sub B::COP::debug {
my ($op) = @_;
$op->B::OP::debug();
- my ($filegv) = $op->filegv;
- printf <<'EOT', $op->label, ${$op->stash}, $$filegv, $op->seq, $op->arybase, $op->line;
+ printf <<'EOT', $op->label, $op->stashpv, $op->file, $op->seq, $op->arybase, $op->line, ${$op->warnings};
cop_label %s
- cop_stash 0x%x
- cop_filegv 0x%x
+ cop_stashpv %s
+ cop_file %s
cop_seq %d
cop_arybase %d
cop_line %d
+ cop_warnings 0x%x
EOT
- $filegv->debug;
}
sub B::SVOP::debug {
@@ -92,11 +84,10 @@ sub B::PVOP::debug {
printf "\top_pv\t\t0x%x\n", $op->pv;
}
-sub B::GVOP::debug {
+sub B::PADOP::debug {
my ($op) = @_;
$op->B::OP::debug();
- printf "\top_gv\t\t0x%x\n", ${$op->gv};
- $op->gv->debug;
+ printf "\top_padix\t\t%ld\n", $op->padix;
}
sub B::CVOP::debug {
@@ -184,14 +175,14 @@ sub B::CV::debug {
my ($start) = $sv->START;
my ($root) = $sv->ROOT;
my ($padlist) = $sv->PADLIST;
+ my ($file) = $sv->FILE;
my ($gv) = $sv->GV;
- my ($filegv) = $sv->FILEGV;
- printf <<'EOT', $$stash, $$start, $$root, $$gv, $$filegv, $sv->DEPTH, $padlist, ${$sv->OUTSIDE};
+ printf <<'EOT', $$stash, $$start, $$root, $$gv, $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE};
STASH 0x%x
START 0x%x
ROOT 0x%x
GV 0x%x
- FILEGV 0x%x
+ FILE %s
DEPTH %d
PADLIST 0x%x
OUTSIDE 0x%x
@@ -199,7 +190,6 @@ EOT
$start->debug if $start;
$root->debug if $root;
$gv->debug if $gv;
- $filegv->debug if $filegv;
$padlist->debug if $padlist;
}
@@ -226,7 +216,7 @@ sub B::GV::debug {
my ($av) = $gv->AV;
my ($cv) = $gv->CV;
$gv->B::SV::debug;
- printf <<'EOT', $gv->NAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILEGV, $gv->GvFLAGS;
+ printf <<'EOT', $gv->NAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILE, $gv->GvFLAGS;
NAME %s
STASH %s (0x%x)
SV 0x%x
@@ -238,7 +228,7 @@ sub B::GV::debug {
CV 0x%x
CVGEN %d
LINE %d
- FILEGV 0x%x
+ FILE %s
GvFLAGS 0x%x
EOT
$sv->debug if $sv;
@@ -253,6 +243,7 @@ sub B::SPECIAL::debug {
sub compile {
my $order = shift;
+ B::clearsym();
if ($order eq "exec") {
return sub { walkoptree_exec(main_start, "debug") }
} else {
diff --git a/contrib/perl5/ext/B/B/Deparse.pm b/contrib/perl5/ext/B/B/Deparse.pm
index 5e0bd1d..cd53c11 100644
--- a/contrib/perl5/ext/B/B/Deparse.pm
+++ b/contrib/perl5/ext/B/B/Deparse.pm
@@ -1,5 +1,5 @@
# B::Deparse.pm
-# Copyright (c) 1998 Stephen McCamant. All rights reserved.
+# Copyright (c) 1998, 1999 Stephen McCamant. All rights reserved.
# This module is free software; you can redistribute and/or modify
# it under the same terms as Perl itself.
@@ -7,9 +7,17 @@
# but essentially none of his code remains.
package B::Deparse;
-use Carp 'cluck';
-use B qw(class main_root main_start main_cv svref_2object);
-$VERSION = 0.56;
+use Carp 'cluck', 'croak';
+use Config;
+use B qw(class main_root main_start main_cv svref_2object opnumber
+ OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
+ OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL
+ OPpLVAL_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
+ OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
+ SVf_IOK SVf_NOK SVf_ROK SVf_POK
+ PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
+ PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED);
+$VERSION = 0.59;
use strict;
# Changes between 0.50 and 0.51:
@@ -26,17 +34,17 @@ use strict;
# Changes between 0.51 and 0.52:
# - added pp_threadsv (special variables under USE_THREADS)
# - added documentation
-# Changes between 0.52 and 0.53
+# Changes between 0.52 and 0.53:
# - many changes adding precedence contexts and associativity
# - added `-p' and `-s' output style options
# - various other minor fixes
-# Changes between 0.53 and 0.54
+# Changes between 0.53 and 0.54:
# - added support for new `for (1..100)' optimization,
# thanks to Gisle Aas
-# Changes between 0.54 and 0.55
+# Changes between 0.54 and 0.55:
# - added support for new qr// construct
# - added support for new pp_regcreset OP
-# Changes between 0.55 and 0.56
+# Changes between 0.55 and 0.56:
# - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t
# - fixed $# on non-lexicals broken in last big rewrite
# - added temporary fix for change in opcode of OP_STRINGIFY
@@ -50,17 +58,51 @@ use strict;
# - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV'
# - added semicolons at the ends of blocks
# - added -l `#line' declaration option -- fixes cmd/subval.t 27,28
+# Changes between 0.56 and 0.561:
+# - fixed multiply-declared my var in pp_truncate (thanks to Sarathy)
+# - used new B.pm symbolic constants (done by Nick Ing-Simmons)
+# Changes between 0.561 and 0.57:
+# - stylistic changes to symbolic constant stuff
+# - handled scope in s///e replacement code
+# - added unquote option for expanding "" into concats, etc.
+# - split method and proto parts of pp_entersub into separate functions
+# - various minor cleanups
+# Changes after 0.57:
+# - added parens in \&foo (patch by Albert Dvornik)
+# Changes between 0.57 and 0.58:
+# - fixed `0' statements that weren't being printed
+# - added methods for use from other programs
+# (based on patches from James Duncan and Hugo van der Sanden)
+# - added -si and -sT to control indenting (also based on a patch from Hugo)
+# - added -sv to print something else instead of '???'
+# - preliminary version of utf8 tr/// handling
+# Changes after 0.58:
+# - uses of $op->ppaddr changed to new $op->name (done by Sarathy)
+# - added support for Hugo's new OP_SETSTATE (like nextstate)
+# Changes between 0.58 and 0.59
+# - added support for Chip's OP_METHOD_NAMED
+# - added support for Ilya's OPpTARGET_MY optimization
+# - elided arrows before `()' subscripts when possible
# Todo:
+# - finish tr/// changes
+# - add option for even more parens (generalize \&foo change)
# - {} around variables in strings ("${var}letters")
# base/lex.t 25-27
# comp/term.t 11
-# - generate symbolic constants directly from core source
# - left/right context
+# - recognize `use utf8', `use integer', etc
+# - treat top-level block specially for incremental output
+# - interpret in high bit chars in string as utf8 \x{...} (when?)
+# - copy comments (look at real text with $^P?)
# - avoid semis in one-statement blocks
# - associativity of &&=, ||=, ?:
# - ',' => '=>' (auto-unquote?)
# - break long lines ("\r" as discretionary break?)
+# - configurable syntax highlighting: ANSI color, HTML, TeX, etc.
+# - more style options: brace style, hex vs. octal, quotes, ...
+# - print big ints as hex/octal instead of decimal (heuristic?)
+# - handle `my $x if 0'?
# - include values of variables (e.g. set in BEGIN)
# - coordinate with Data::Dumper (both directions? see previous)
# - version using op_next instead of op_first/sibling?
@@ -103,7 +145,11 @@ use strict;
#
# parens: -p
# linenums: -l
+# unquote: -q
# cuddle: ` ' or `\n', depending on -sC
+# indent_size: -si
+# use_tabs: -sT
+# ex_const: -sv
# A little explanation of how precedence contexts and associativity
# work:
@@ -182,13 +228,10 @@ sub next_todo {
return "format $name =\n"
. $self->deparse_format($ent->[1]->FORM). "\n";
} else {
- return "sub $name " .
- $self->deparse_sub($ent->[1]->CV);
+ return "sub $name " . $self->deparse_sub($ent->[1]->CV);
}
}
-sub OPf_KIDS () { 4 }
-
sub walk_tree {
my($op, $sub) = @_;
$sub->($op);
@@ -208,19 +251,20 @@ sub walk_sub {
return if !$op or null $op;
walk_tree($op, sub {
my $op = shift;
- if ($op->ppaddr eq "pp_gv") {
- if ($op->next->ppaddr eq "pp_entersub") {
- next if $self->{'subs_done'}{$ {$op->gv}}++;
- next if class($op->gv->CV) eq "SPECIAL";
- $self->todo($op->gv, $op->gv->CV, 0);
- $self->walk_sub($op->gv->CV);
- } elsif ($op->next->ppaddr eq "pp_enterwrite"
- or ($op->next->ppaddr eq "pp_rv2gv"
- and $op->next->next->ppaddr eq "pp_enterwrite")) {
- next if $self->{'forms_done'}{$ {$op->gv}}++;
- next if class($op->gv->FORM) eq "SPECIAL";
- $self->todo($op->gv, $op->gv->FORM, 1);
- $self->walk_sub($op->gv->FORM);
+ if ($op->name eq "gv") {
+ my $gv = $self->maybe_padgv($op);
+ if ($op->next->name eq "entersub") {
+ next if $self->{'subs_done'}{$$gv}++;
+ next if class($gv->CV) eq "SPECIAL";
+ $self->todo($gv, $gv->CV, 0);
+ $self->walk_sub($gv->CV);
+ } elsif ($op->next->name eq "enterwrite"
+ or ($op->next->name eq "rv2gv"
+ and $op->next->next->name eq "enterwrite")) {
+ next if $self->{'forms_done'}{$$gv}++;
+ next if class($gv->FORM) eq "SPECIAL";
+ $self->todo($gv, $gv->FORM, 1);
+ $self->walk_sub($gv->FORM);
}
}
});
@@ -279,37 +323,57 @@ sub style_opts {
while (length($opt = substr($opts, 0, 1))) {
if ($opt eq "C") {
$self->{'cuddle'} = " ";
+ $opts = substr($opts, 1);
+ } elsif ($opt eq "i") {
+ $opts =~ s/^i(\d+)//;
+ $self->{'indent_size'} = $1;
+ } elsif ($opt eq "T") {
+ $self->{'use_tabs'} = 1;
+ $opts = substr($opts, 1);
+ } elsif ($opt eq "v") {
+ $opts =~ s/^v([^.]*)(.|$)//;
+ $self->{'ex_const'} = $1;
}
- $opts = substr($opts, 1);
}
}
+sub new {
+ my $class = shift;
+ my $self = bless {}, $class;
+ $self->{'subs_todo'} = [];
+ $self->{'curstash'} = "main";
+ $self->{'cuddle'} = "\n";
+ $self->{'indent_size'} = 4;
+ $self->{'use_tabs'} = 0;
+ $self->{'ex_const'} = "'???'";
+ while (my $arg = shift @_) {
+ if (substr($arg, 0, 2) eq "-u") {
+ $self->stash_subs(substr($arg, 2));
+ } elsif ($arg eq "-p") {
+ $self->{'parens'} = 1;
+ } elsif ($arg eq "-l") {
+ $self->{'linenums'} = 1;
+ } elsif ($arg eq "-q") {
+ $self->{'unquote'} = 1;
+ } elsif (substr($arg, 0, 2) eq "-s") {
+ $self->style_opts(substr $arg, 2);
+ }
+ }
+ return $self;
+}
+
sub compile {
my(@args) = @_;
return sub {
- my $self = bless {};
- my $arg;
- $self->{'subs_todo'} = [];
+ my $self = B::Deparse->new(@args);
$self->stash_subs("main");
$self->{'curcv'} = main_cv;
- $self->{'curstash'} = "main";
- $self->{'cuddle'} = "\n";
- while ($arg = shift @args) {
- if (substr($arg, 0, 2) eq "-u") {
- $self->stash_subs(substr($arg, 2));
- } elsif ($arg eq "-p") {
- $self->{'parens'} = 1;
- } elsif ($arg eq "-l") {
- $self->{'linenums'} = 1;
- } elsif (substr($arg, 0, 2) eq "-s") {
- $self->style_opts(substr $arg, 2);
- }
- }
$self->walk_sub(main_cv, main_start);
print $self->print_protos;
@{$self->{'subs_todo'}} =
- sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
- print indent($self->deparse(main_root, 0)), "\n" unless null main_root;
+ sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}};
+ print $self->indent($self->deparse(main_root, 0)), "\n"
+ unless null main_root;
my @text;
while (scalar(@{$self->{'subs_todo'}})) {
push @text, $self->next_todo;
@@ -318,25 +382,38 @@ sub compile {
}
}
+sub coderef2text {
+ my $self = shift;
+ my $sub = shift;
+ croak "Usage: ->coderef2text(CODEREF)" unless ref($sub) eq "CODE";
+ return $self->indent($self->deparse_sub(svref_2object($sub)));
+}
+
sub deparse {
my $self = shift;
my($op, $cx) = @_;
# cluck if class($op) eq "NULL";
- my $meth = $op->ppaddr;
+# return $self->$ {\("pp_" . $op->name)}($op, $cx);
+ my $meth = "pp_" . $op->name;
return $self->$meth($op, $cx);
}
sub indent {
+ my $self = shift;
my $txt = shift;
my @lines = split(/\n/, $txt);
my $leader = "";
+ my $level = 0;
my $line;
for $line (@lines) {
- if (substr($line, 0, 1) eq "\t") {
- $leader = $leader . " ";
- $line = substr($line, 1);
- } elsif (substr($line, 0, 1) eq "\b") {
- $leader = substr($leader, 0, length($leader) - 4);
+ my $cmd = substr($line, 0, 1);
+ if ($cmd eq "\t" or $cmd eq "\b") {
+ $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'};
+ if ($self->{'use_tabs'}) {
+ $leader = "\t" x ($level / 8) . " " x ($level % 8);
+ } else {
+ $leader = " " x $level;
+ }
$line = substr($line, 1);
}
if (substr($line, 0, 1) eq "\f") {
@@ -349,8 +426,6 @@ sub indent {
return join("\n", @lines);
}
-sub SVf_POK () {0x40000}
-
sub deparse_sub {
my $self = shift;
my $cv = shift;
@@ -382,7 +457,7 @@ sub deparse_format {
$op = $op->sibling; # skip nextstate
my @exprs;
$kid = $op->first->sibling; # skip pushmark
- push @text, $kid->sv->PV;
+ push @text, $self->const_sv($kid)->PV;
$kid = $kid->sibling;
for (; not null $kid; $kid = $kid->sibling) {
push @exprs, $self->deparse($kid, 0);
@@ -393,47 +468,38 @@ sub deparse_format {
return join("", @text) . ".";
}
-# the aassign in-common check messes up SvCUR (always setting it
-# to a value >= 100), but it's probably safe to assume there
-# won't be any NULs in the names of my() variables. (with
-# stash variables, I wouldn't be so sure)
-sub padname_fix {
- my $str = shift;
- $str = substr($str, 0, index($str, "\0")) if index($str, "\0") != -1;
- return $str;
-}
-
sub is_scope {
my $op = shift;
- return $op->ppaddr eq "pp_leave" || $op->ppaddr eq "pp_scope"
- || $op->ppaddr eq "pp_lineseq"
- || ($op->ppaddr eq "pp_null" && class($op) eq "UNOP"
- && (is_scope($op->first) || $op->first->ppaddr eq "pp_enter"));
+ return $op->name eq "leave" || $op->name eq "scope"
+ || $op->name eq "lineseq"
+ || ($op->name eq "null" && class($op) eq "UNOP"
+ && (is_scope($op->first) || $op->first->name eq "enter"));
}
sub is_state {
- my $name = $_[0]->ppaddr;
- return $name eq "pp_nextstate" || $name eq "pp_dbstate";
+ my $name = $_[0]->name;
+ return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate";
}
sub is_miniwhile { # check for one-line loop (`foo() while $y--')
my $op = shift;
return (!null($op) and null($op->sibling)
- and $op->ppaddr eq "pp_null" and class($op) eq "UNOP"
- and (($op->first->ppaddr =~ /^pp_(and|or)$/
- and $op->first->first->sibling->ppaddr eq "pp_lineseq")
- or ($op->first->ppaddr eq "pp_lineseq"
+ and $op->name eq "null" and class($op) eq "UNOP"
+ and (($op->first->name =~ /^(and|or)$/
+ and $op->first->first->sibling->name eq "lineseq")
+ or ($op->first->name eq "lineseq"
and not null $op->first->first->sibling
- and $op->first->first->sibling->ppaddr eq "pp_unstack")
+ and $op->first->first->sibling->name eq "unstack")
));
}
sub is_scalar {
my $op = shift;
- return ($op->ppaddr eq "pp_rv2sv" or
- $op->ppaddr eq "pp_padsv" or
- $op->ppaddr eq "pp_gv" or # only in array/hash constructs
- !null($op->first) && $op->first->ppaddr eq "pp_gvsv");
+ return ($op->name eq "rv2sv" or
+ $op->name eq "padsv" or
+ $op->name eq "gv" or # only in array/hash constructs
+ $op->flags & OPf_KIDS && !null($op->first)
+ && $op->first->name eq "gvsv");
}
sub maybe_parens {
@@ -483,18 +549,28 @@ sub maybe_parens_func {
}
}
-sub OPp_LVAL_INTRO () { 128 }
-
sub maybe_local {
my $self = shift;
my($op, $cx, $text) = @_;
- if ($op->private & OPp_LVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
+ if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
return $self->maybe_parens_func("local", $text, $cx, 16);
} else {
return $text;
}
}
+sub maybe_targmy {
+ my $self = shift;
+ my($op, $cx, $func, @args) = @_;
+ if ($op->private & OPpTARGET_MY) {
+ my $var = $self->padname($op->targ);
+ my $val = $func->($self, $op, 7, @args);
+ return $self->maybe_parens("$var = $val", $cx, 7);
+ } else {
+ return $func->($self, $op, $cx, @args);
+ }
+}
+
sub padname_sv {
my $self = shift;
my $targ = shift;
@@ -504,7 +580,7 @@ sub padname_sv {
sub maybe_my {
my $self = shift;
my($op, $cx, $text) = @_;
- if ($op->private & OPp_LVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
+ if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
return $self->maybe_parens_func("my", $text, $cx, 16);
} else {
return $text;
@@ -606,10 +682,10 @@ sub pp_leave {
$kid = $op->first->sibling; # skip enter
if (is_miniwhile($kid)) {
my $top = $kid->first;
- my $name = $top->ppaddr;
- if ($name eq "pp_and") {
+ my $name = $top->name;
+ if ($name eq "and") {
$name = "while";
- } elsif ($name eq "pp_or") {
+ } elsif ($name eq "or") {
$name = "until";
} else { # no conditional -> while 1 or until 0
return $self->deparse($top->first, 1) . " while 1";
@@ -628,7 +704,7 @@ sub pp_leave {
last if null $kid;
}
$expr .= $self->deparse($kid, 0);
- push @exprs, $expr if $expr;
+ push @exprs, $expr if length $expr;
}
if ($cx > 0) { # inside an expression
return "do { " . join(";\n", @exprs) . " }";
@@ -650,7 +726,7 @@ sub pp_scope {
last if null $kid;
}
$expr .= $self->deparse($kid, 0);
- push @exprs, $expr if $expr;
+ push @exprs, $expr if length $expr;
}
if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
return "do { " . join(";\n", @exprs) . " }";
@@ -696,19 +772,20 @@ sub pp_nextstate {
and $seq > $self->{'subs_todo'}[0][0]) {
push @text, $self->next_todo;
}
- my $stash = $op->stash->NAME;
+ my $stash = $op->stashpv;
if ($stash ne $self->{'curstash'}) {
push @text, "package $stash;\n";
$self->{'curstash'} = $stash;
}
if ($self->{'linenums'}) {
push @text, "\f#line " . $op->line .
- ' "' . substr($op->filegv->NAME, 2), qq'"\n';
+ ' "' . $op->file, qq'"\n';
}
return join("", @text);
}
sub pp_dbstate { pp_nextstate(@_) }
+sub pp_setstate { pp_nextstate(@_) }
sub pp_unstack { return "" } # see also leaveloop
@@ -721,9 +798,9 @@ sub baseop {
sub pp_stub { baseop(@_, "()") }
sub pp_wantarray { baseop(@_, "wantarray") }
sub pp_fork { baseop(@_, "fork") }
-sub pp_wait { baseop(@_, "wait") }
-sub pp_getppid { baseop(@_, "getppid") }
-sub pp_time { baseop(@_, "time") }
+sub pp_wait { maybe_targmy(@_, \&baseop, "wait") }
+sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") }
+sub pp_time { maybe_targmy(@_, \&baseop, "time") }
sub pp_tms { baseop(@_, "times") }
sub pp_ghostent { baseop(@_, "gethostent") }
sub pp_gnetent { baseop(@_, "getnetent") }
@@ -757,18 +834,19 @@ sub pfixop {
sub pp_preinc { pfixop(@_, "++", 23) }
sub pp_predec { pfixop(@_, "--", 23) }
-sub pp_postinc { pfixop(@_, "++", 23, POSTFIX) }
-sub pp_postdec { pfixop(@_, "--", 23, POSTFIX) }
+sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
+sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
sub pp_i_preinc { pfixop(@_, "++", 23) }
sub pp_i_predec { pfixop(@_, "--", 23) }
-sub pp_i_postinc { pfixop(@_, "++", 23, POSTFIX) }
-sub pp_i_postdec { pfixop(@_, "--", 23, POSTFIX) }
-sub pp_complement { pfixop(@_, "~", 21) }
+sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
+sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
+sub pp_complement { maybe_targmy(@_. \&pfixop, "~", 21) }
-sub pp_negate {
+sub pp_negate { maybe_targmy(@_, \&real_negate) }
+sub real_negate {
my $self = shift;
my($op, $cx) = @_;
- if ($op->first->ppaddr =~ /^pp_(i_)?negate$/) {
+ if ($op->first->name =~ /^(i_)?negate$/) {
# avoid --$x
$self->pfixop($op, $cx, "-", 21.5);
} else {
@@ -787,11 +865,9 @@ sub pp_not {
}
}
-sub OPf_SPECIAL () { 128 }
-
sub unop {
my $self = shift;
- my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
+ my($op, $cx, $name) = @_;
my $kid;
if ($op->flags & OPf_KIDS) {
$kid = $op->first;
@@ -801,36 +877,31 @@ sub unop {
}
}
-sub pp_chop { unop(@_, "chop") }
-sub pp_chomp { unop(@_, "chomp") }
-sub pp_schop { unop(@_, "chop") }
-sub pp_schomp { unop(@_, "chomp") }
+sub pp_chop { maybe_targmy(@_, \&unop, "chop") }
+sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") }
+sub pp_schop { maybe_targmy(@_, \&unop, "chop") }
+sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") }
sub pp_defined { unop(@_, "defined") }
sub pp_undef { unop(@_, "undef") }
sub pp_study { unop(@_, "study") }
sub pp_ref { unop(@_, "ref") }
sub pp_pos { maybe_local(@_, unop(@_, "pos")) }
-sub pp_sin { unop(@_, "sin") }
-sub pp_cos { unop(@_, "cos") }
-sub pp_rand { unop(@_, "rand") }
+sub pp_sin { maybe_targmy(@_, \&unop, "sin") }
+sub pp_cos { maybe_targmy(@_, \&unop, "cos") }
+sub pp_rand { maybe_targmy(@_, \&unop, "rand") }
sub pp_srand { unop(@_, "srand") }
-sub pp_exp { unop(@_, "exp") }
-sub pp_log { unop(@_, "log") }
-sub pp_sqrt { unop(@_, "sqrt") }
-sub pp_int { unop(@_, "int") }
-sub pp_hex { unop(@_, "hex") }
-sub pp_oct { unop(@_, "oct") }
-sub pp_abs { unop(@_, "abs") }
-
-sub pp_length { unop(@_, "length") }
-sub pp_ord { unop(@_, "ord") }
-sub pp_chr { unop(@_, "chr") }
-sub pp_ucfirst { unop(@_, "ucfirst") }
-sub pp_lcfirst { unop(@_, "lcfirst") }
-sub pp_uc { unop(@_, "uc") }
-sub pp_lc { unop(@_, "lc") }
-sub pp_quotemeta { unop(@_, "quotemeta") }
+sub pp_exp { maybe_targmy(@_, \&unop, "exp") }
+sub pp_log { maybe_targmy(@_, \&unop, "log") }
+sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") }
+sub pp_int { maybe_targmy(@_, \&unop, "int") }
+sub pp_hex { maybe_targmy(@_, \&unop, "hex") }
+sub pp_oct { maybe_targmy(@_, \&unop, "oct") }
+sub pp_abs { maybe_targmy(@_, \&unop, "abs") }
+
+sub pp_length { maybe_targmy(@_, \&unop, "length") }
+sub pp_ord { maybe_targmy(@_, \&unop, "ord") }
+sub pp_chr { maybe_targmy(@_, \&unop, "chr") }
sub pp_each { unop(@_, "each") }
sub pp_values { unop(@_, "values") }
@@ -856,19 +927,19 @@ sub pp_tell { unop(@_, "tell") }
sub pp_getsockname { unop(@_, "getsockname") }
sub pp_getpeername { unop(@_, "getpeername") }
-sub pp_chdir { unop(@_, "chdir") }
-sub pp_chroot { unop(@_, "chroot") }
+sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") }
+sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") }
sub pp_readlink { unop(@_, "readlink") }
-sub pp_rmdir { unop(@_, "rmdir") }
+sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") }
sub pp_readdir { unop(@_, "readdir") }
sub pp_telldir { unop(@_, "telldir") }
sub pp_rewinddir { unop(@_, "rewinddir") }
sub pp_closedir { unop(@_, "closedir") }
-sub pp_getpgrp { unop(@_, "getpgrp") }
+sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") }
sub pp_localtime { unop(@_, "localtime") }
sub pp_gmtime { unop(@_, "gmtime") }
sub pp_alarm { unop(@_, "alarm") }
-sub pp_sleep { unop(@_, "sleep") }
+sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") }
sub pp_dofile { unop(@_, "do") }
sub pp_entereval { unop(@_, "eval") }
@@ -894,8 +965,6 @@ sub pp_exists {
$cx, 16);
}
-sub OPpSLICE () { 64 }
-
sub pp_delete {
my $self = shift;
my($op, $cx) = @_;
@@ -911,15 +980,13 @@ sub pp_delete {
}
}
-sub OPp_CONST_BARE () { 64 }
-
sub pp_require {
my $self = shift;
my($op, $cx) = @_;
- if (class($op) eq "UNOP" and $op->first->ppaddr eq "pp_const"
- and $op->first->private & OPp_CONST_BARE)
+ if (class($op) eq "UNOP" and $op->first->name eq "const"
+ and $op->first->private & OPpCONST_BARE)
{
- my $name = $op->first->sv->PV;
+ my $name = $self->const_sv($op->first)->PV;
$name =~ s[/][::]g;
$name =~ s/\.pm//g;
return "require($name)";
@@ -943,20 +1010,19 @@ sub pp_scalar {
sub padval {
my $self = shift;
my $targ = shift;
+ #cluck "curcv was undef" unless $self->{curcv};
return (($self->{'curcv'}->PADLIST->ARRAY)[1]->ARRAY)[$targ];
}
-sub OPf_REF () { 16 }
-
sub pp_refgen {
my $self = shift;
my($op, $cx) = @_;
my $kid = $op->first;
- if ($kid->ppaddr eq "pp_null") {
+ if ($kid->name eq "null") {
$kid = $kid->first;
- if ($kid->ppaddr eq "pp_anonlist" || $kid->ppaddr eq "pp_anonhash") {
- my($pre, $post) = @{{"pp_anonlist" => ["[","]"],
- "pp_anonhash" => ["{","}"]}->{$kid->ppaddr}};
+ if ($kid->name eq "anonlist" || $kid->name eq "anonhash") {
+ my($pre, $post) = @{{"anonlist" => ["[","]"],
+ "anonhash" => ["{","}"]}->{$kid->name}};
my($expr, @exprs);
$kid = $kid->first->sibling; # skip pushmark
for (; !null($kid); $kid = $kid->sibling) {
@@ -965,16 +1031,25 @@ sub pp_refgen {
}
return $pre . join(", ", @exprs) . $post;
} elsif (!null($kid->sibling) and
- $kid->sibling->ppaddr eq "pp_anoncode") {
+ $kid->sibling->name eq "anoncode") {
return "sub " .
$self->deparse_sub($self->padval($kid->sibling->targ));
- } elsif ($kid->ppaddr eq "pp_pushmark"
- and $kid->sibling->ppaddr =~ /^pp_(pad|rv2)[ah]v$/
- and not $kid->sibling->flags & OPf_REF) {
- # The @a in \(@a) isn't in ref context, but only when the
- # parens are there.
- return "\\(" . $self->deparse($kid->sibling, 1) . ")";
- }
+ } elsif ($kid->name eq "pushmark") {
+ my $sib_name = $kid->sibling->name;
+ if ($sib_name =~ /^(pad|rv2)[ah]v$/
+ and not $kid->sibling->flags & OPf_REF)
+ {
+ # The @a in \(@a) isn't in ref context, but only when the
+ # parens are there.
+ return "\\(" . $self->deparse($kid->sibling, 1) . ")";
+ } elsif ($sib_name eq 'entersub') {
+ my $text = $self->deparse($kid->sibling, 1);
+ # Always show parens for \(&func()), but only with -p otherwise
+ $text = "($text)" if $self->{'parens'}
+ or $kid->sibling->private & OPpENTERSUB_AMPER;
+ return "\\$text";
+ }
+ }
}
$self->pfixop($op, $cx, "\\", 20);
}
@@ -985,13 +1060,31 @@ sub pp_readline {
my $self = shift;
my($op, $cx) = @_;
my $kid = $op->first;
- $kid = $kid->first if $kid->ppaddr eq "pp_rv2gv"; # <$fh>
- if ($kid->ppaddr eq "pp_rv2gv") {
- $kid = $kid->first;
- }
+ $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh>
return "<" . $self->deparse($kid, 1) . ">";
}
+# Unary operators that can occur as pseudo-listops inside double quotes
+sub dq_unop {
+ my $self = shift;
+ my($op, $cx, $name, $prec, $flags) = (@_, 0, 0);
+ my $kid;
+ if ($op->flags & OPf_KIDS) {
+ $kid = $op->first;
+ # If there's more than one kid, the first is an ex-pushmark.
+ $kid = $kid->sibling if not null $kid->sibling;
+ return $self->maybe_parens_unop($name, $kid, $cx);
+ } else {
+ return $name . ($op->flags & OPf_SPECIAL ? "()" : "");
+ }
+}
+
+sub pp_ucfirst { dq_unop(@_, "ucfirst") }
+sub pp_lcfirst { dq_unop(@_, "lcfirst") }
+sub pp_uc { dq_unop(@_, "uc") }
+sub pp_lc { dq_unop(@_, "lc") }
+sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") }
+
sub loopex {
my $self = shift;
my ($op, $cx, $name) = @_;
@@ -1019,7 +1112,7 @@ sub ftst {
# Genuine `-X' filetests are exempt from the LLAFR, but not
# l?stat(); for the sake of clarity, give'em all parens
return $self->maybe_parens_unop($name, $op->first, $cx);
- } elsif (class($op) eq "GVOP") {
+ } elsif (class($op) eq "SVOP") {
return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16);
} else { # I don't think baseop filetests ever survive ck_ftst, but...
return $name;
@@ -1059,19 +1152,17 @@ sub pp_ftbinary { ftst(@_, "-B") }
sub SWAP_CHILDREN () { 1 }
sub ASSIGN () { 2 } # has OP= variant
-sub OPf_STACKED () { 64 }
-
my(%left, %right);
sub assoc_class {
my $op = shift;
- my $name = $op->ppaddr;
- if ($name eq "pp_concat" and $op->first->ppaddr eq "pp_concat") {
+ my $name = $op->name;
+ if ($name eq "concat" and $op->first->name eq "concat") {
# avoid spurious `=' -- see comment in pp_concat
- return "pp_concat";
+ return "concat";
}
- if ($name eq "pp_null" and class($op) eq "UNOP"
- and $op->first->ppaddr =~ /^pp_(and|x?or)$/
+ if ($name eq "null" and class($op) eq "UNOP"
+ and $op->first->name =~ /^(and|x?or)$/
and null $op->first->sibling)
{
# Like all conditional constructs, OP_ANDs and OP_ORs are topped
@@ -1088,25 +1179,25 @@ sub assoc_class {
# $a + $b + $c is equivalent to ($a + $b) + $c
BEGIN {
- %left = ('pp_multiply' => 19, 'pp_i_multiply' => 19,
- 'pp_divide' => 19, 'pp_i_divide' => 19,
- 'pp_modulo' => 19, 'pp_i_modulo' => 19,
- 'pp_repeat' => 19,
- 'pp_add' => 18, 'pp_i_add' => 18,
- 'pp_subtract' => 18, 'pp_i_subtract' => 18,
- 'pp_concat' => 18,
- 'pp_left_shift' => 17, 'pp_right_shift' => 17,
- 'pp_bit_and' => 13,
- 'pp_bit_or' => 12, 'pp_bit_xor' => 12,
- 'pp_and' => 3,
- 'pp_or' => 2, 'pp_xor' => 2,
+ %left = ('multiply' => 19, 'i_multiply' => 19,
+ 'divide' => 19, 'i_divide' => 19,
+ 'modulo' => 19, 'i_modulo' => 19,
+ 'repeat' => 19,
+ 'add' => 18, 'i_add' => 18,
+ 'subtract' => 18, 'i_subtract' => 18,
+ 'concat' => 18,
+ 'left_shift' => 17, 'right_shift' => 17,
+ 'bit_and' => 13,
+ 'bit_or' => 12, 'bit_xor' => 12,
+ 'and' => 3,
+ 'or' => 2, 'xor' => 2,
);
}
sub deparse_binop_left {
my $self = shift;
my($op, $left, $prec) = @_;
- if ($left{assoc_class($op)}
+ if ($left{assoc_class($op)} && $left{assoc_class($left)}
and $left{assoc_class($op)} == $left{assoc_class($left)})
{
return $self->deparse($left, $prec - .00001);
@@ -1119,27 +1210,27 @@ sub deparse_binop_left {
# $a = $b = $c is equivalent to $a = ($b = $c)
BEGIN {
- %right = ('pp_pow' => 22,
- 'pp_sassign=' => 7, 'pp_aassign=' => 7,
- 'pp_multiply=' => 7, 'pp_i_multiply=' => 7,
- 'pp_divide=' => 7, 'pp_i_divide=' => 7,
- 'pp_modulo=' => 7, 'pp_i_modulo=' => 7,
- 'pp_repeat=' => 7,
- 'pp_add=' => 7, 'pp_i_add=' => 7,
- 'pp_subtract=' => 7, 'pp_i_subtract=' => 7,
- 'pp_concat=' => 7,
- 'pp_left_shift=' => 7, 'pp_right_shift=' => 7,
- 'pp_bit_and=' => 7,
- 'pp_bit_or=' => 7, 'pp_bit_xor=' => 7,
- 'pp_andassign' => 7,
- 'pp_orassign' => 7,
+ %right = ('pow' => 22,
+ 'sassign=' => 7, 'aassign=' => 7,
+ 'multiply=' => 7, 'i_multiply=' => 7,
+ 'divide=' => 7, 'i_divide=' => 7,
+ 'modulo=' => 7, 'i_modulo=' => 7,
+ 'repeat=' => 7,
+ 'add=' => 7, 'i_add=' => 7,
+ 'subtract=' => 7, 'i_subtract=' => 7,
+ 'concat=' => 7,
+ 'left_shift=' => 7, 'right_shift=' => 7,
+ 'bit_and=' => 7,
+ 'bit_or=' => 7, 'bit_xor=' => 7,
+ 'andassign' => 7,
+ 'orassign' => 7,
);
}
sub deparse_binop_right {
my $self = shift;
my($op, $right, $prec) = @_;
- if ($right{assoc_class($op)}
+ if ($right{assoc_class($op)} && $right{assoc_class($right)}
and $right{assoc_class($op)} == $right{assoc_class($right)})
{
return $self->deparse($right, $prec - .00001);
@@ -1166,23 +1257,23 @@ sub binop {
return $self->maybe_parens("$left $opname$eq $right", $cx, $prec);
}
-sub pp_add { binop(@_, "+", 18, ASSIGN) }
-sub pp_multiply { binop(@_, "*", 19, ASSIGN) }
-sub pp_subtract { binop(@_, "-",18, ASSIGN) }
-sub pp_divide { binop(@_, "/", 19, ASSIGN) }
-sub pp_modulo { binop(@_, "%", 19, ASSIGN) }
-sub pp_i_add { binop(@_, "+", 18, ASSIGN) }
-sub pp_i_multiply { binop(@_, "*", 19, ASSIGN) }
-sub pp_i_subtract { binop(@_, "-", 18, ASSIGN) }
-sub pp_i_divide { binop(@_, "/", 19, ASSIGN) }
-sub pp_i_modulo { binop(@_, "%", 19, ASSIGN) }
-sub pp_pow { binop(@_, "**", 22, ASSIGN) }
-
-sub pp_left_shift { binop(@_, "<<", 17, ASSIGN) }
-sub pp_right_shift { binop(@_, ">>", 17, ASSIGN) }
-sub pp_bit_and { binop(@_, "&", 13, ASSIGN) }
-sub pp_bit_or { binop(@_, "|", 12, ASSIGN) }
-sub pp_bit_xor { binop(@_, "^", 12, ASSIGN) }
+sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
+sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
+sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) }
+sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
+sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
+sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) }
+sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) }
+sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) }
+sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) }
+sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) }
+sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) }
+
+sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) }
+sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) }
+sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) }
+sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) }
+sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) }
sub pp_eq { binop(@_, "==", 14) }
sub pp_ne { binop(@_, "!=", 14) }
@@ -1213,14 +1304,15 @@ sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN) }
# `.' is special because concats-of-concats are optimized to save copying
# by making all but the first concat stacked. The effect is as if the
# programmer had written `($a . $b) .= $c', except legal.
-sub pp_concat {
+sub pp_concat { maybe_targmy(@_, \&real_concat) }
+sub real_concat {
my $self = shift;
my($op, $cx) = @_;
my $left = $op->first;
my $right = $op->last;
my $eq = "";
my $prec = 18;
- if ($op->flags & OPf_STACKED and $op->first->ppaddr ne "pp_concat") {
+ if ($op->flags & OPf_STACKED and $op->first->name ne "concat") {
$eq = "=";
$prec = 7;
}
@@ -1301,7 +1393,10 @@ sub logop {
}
sub pp_and { logop(@_, "and", 3, "&&", 11, "if") }
-sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
+sub pp_or { logop(@_, "or", 2, "||", 10, "unless") }
+
+# xor is syntactically a logop, but it's really a binop (contrary to
+# old versions of opcode.pl). Syntax is what matters here.
sub pp_xor { logop(@_, "xor", 2, "", 0, "") }
sub logassignop {
@@ -1339,20 +1434,20 @@ sub listop {
}
sub pp_bless { listop(@_, "bless") }
-sub pp_atan2 { listop(@_, "atan2") }
+sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") }
sub pp_substr { maybe_local(@_, listop(@_, "substr")) }
sub pp_vec { maybe_local(@_, listop(@_, "vec")) }
-sub pp_index { listop(@_, "index") }
-sub pp_rindex { listop(@_, "rindex") }
-sub pp_sprintf { listop(@_, "sprintf") }
+sub pp_index { maybe_targmy(@_, \&listop, "index") }
+sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") }
+sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") }
sub pp_formline { listop(@_, "formline") } # see also deparse_format
-sub pp_crypt { listop(@_, "crypt") }
+sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") }
sub pp_unpack { listop(@_, "unpack") }
sub pp_pack { listop(@_, "pack") }
-sub pp_join { listop(@_, "join") }
+sub pp_join { maybe_targmy(@_, \&listop, "join") }
sub pp_splice { listop(@_, "splice") }
-sub pp_push { listop(@_, "push") }
-sub pp_unshift { listop(@_, "unshift") }
+sub pp_push { maybe_targmy(@_, \&listop, "push") }
+sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") }
sub pp_reverse { listop(@_, "reverse") }
sub pp_warn { listop(@_, "warn") }
sub pp_die { listop(@_, "die") }
@@ -1375,7 +1470,7 @@ sub pp_recv { listop(@_, "recv") }
sub pp_seek { listop(@_, "seek") }
sub pp_fcntl { listop(@_, "fcntl") }
sub pp_ioctl { listop(@_, "ioctl") }
-sub pp_flock { listop(@_, "flock") }
+sub pp_flock { maybe_targmy(@_, \&listop, "flock") }
sub pp_socket { listop(@_, "socket") }
sub pp_sockpair { listop(@_, "sockpair") }
sub pp_bind { listop(@_, "bind") }
@@ -1385,23 +1480,23 @@ sub pp_accept { listop(@_, "accept") }
sub pp_shutdown { listop(@_, "shutdown") }
sub pp_gsockopt { listop(@_, "getsockopt") }
sub pp_ssockopt { listop(@_, "setsockopt") }
-sub pp_chown { listop(@_, "chown") }
-sub pp_unlink { listop(@_, "unlink") }
-sub pp_chmod { listop(@_, "chmod") }
-sub pp_utime { listop(@_, "utime") }
-sub pp_rename { listop(@_, "rename") }
-sub pp_link { listop(@_, "link") }
-sub pp_symlink { listop(@_, "symlink") }
-sub pp_mkdir { listop(@_, "mkdir") }
+sub pp_chown { maybe_targmy(@_, \&listop, "chown") }
+sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") }
+sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") }
+sub pp_utime { maybe_targmy(@_, \&listop, "utime") }
+sub pp_rename { maybe_targmy(@_, \&listop, "rename") }
+sub pp_link { maybe_targmy(@_, \&listop, "link") }
+sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") }
+sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") }
sub pp_open_dir { listop(@_, "opendir") }
sub pp_seekdir { listop(@_, "seekdir") }
-sub pp_waitpid { listop(@_, "waitpid") }
-sub pp_system { listop(@_, "system") }
-sub pp_exec { listop(@_, "exec") }
-sub pp_kill { listop(@_, "kill") }
-sub pp_setpgrp { listop(@_, "setpgrp") }
-sub pp_getpriority { listop(@_, "getpriority") }
-sub pp_setpriority { listop(@_, "setpriority") }
+sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") }
+sub pp_system { maybe_targmy(@_, \&listop, "system") }
+sub pp_exec { maybe_targmy(@_, \&listop, "exec") }
+sub pp_kill { maybe_targmy(@_, \&listop, "kill") }
+sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") }
+sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") }
+sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") }
sub pp_shmget { listop(@_, "shmget") }
sub pp_shmctl { listop(@_, "shmctl") }
sub pp_shmread { listop(@_, "shmread") }
@@ -1442,10 +1537,10 @@ sub pp_truncate {
my(@exprs);
my $parens = ($cx >= 5) || $self->{'parens'};
my $kid = $op->first->sibling;
- my($fh, $len);
+ my $fh;
if ($op->flags & OPf_SPECIAL) {
# $kid is an OP_CONST
- $fh = $kid->sv->PV;
+ $fh = $self->const_sv($kid)->PV;
} else {
$fh = $self->deparse($kid, 6);
$fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "(";
@@ -1456,7 +1551,6 @@ sub pp_truncate {
} else {
return "truncate $fh, $len";
}
-
}
sub indirop {
@@ -1480,8 +1574,7 @@ sub indirop {
$expr = $self->deparse($kid, 6);
push @exprs, $expr;
}
- return $self->maybe_parens_func($name,
- $indir . join(", ", @exprs),
+ return $self->maybe_parens_func($name, $indir . join(", ", @exprs),
$cx, 5);
}
@@ -1497,7 +1590,7 @@ sub mapop {
$kid = $kid->first->sibling; # skip a pushmark
my $code = $kid->first; # skip a null
if (is_scope $code) {
- $code = "{" . $self->deparse($code, 1) . "} ";
+ $code = "{" . $self->deparse($code, 0) . "} ";
} else {
$code = $self->deparse($code, 24) . ", ";
}
@@ -1523,15 +1616,15 @@ sub pp_list {
# This assumes that no other private flags equal 128, and that
# OPs that store things other than flags in their op_private,
# like OP_AELEMFAST, won't be immediate children of a list.
- unless ($lop->private & OPp_LVAL_INTRO or $lop->ppaddr eq "pp_undef")
+ unless ($lop->private & OPpLVAL_INTRO or $lop->name eq "undef")
{
$local = ""; # or not
last;
}
- if ($lop->ppaddr =~ /^pp_pad[ash]v$/) { # my()
+ if ($lop->name =~ /^pad[ash]v$/) { # my()
($local = "", last) if $local eq "local";
$local = "my";
- } elsif ($lop->ppaddr ne "pp_undef") { # local()
+ } elsif ($lop->name ne "undef") { # local()
($local = "", last) if $local eq "my";
$local = "local";
}
@@ -1540,7 +1633,7 @@ sub pp_list {
return $self->deparse($kid, $cx) if null $kid->sibling and not $local;
for (; !null($kid); $kid = $kid->sibling) {
if ($local) {
- if (class($kid) eq "UNOP" and $kid->first->ppaddr eq "pp_gvsv") {
+ if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") {
$lop = $kid->first;
} else {
$lop = $kid;
@@ -1575,10 +1668,10 @@ sub pp_cond_expr {
}
$cond = $self->deparse($cond, 1);
$true = $self->deparse($true, 0);
- if ($false->ppaddr eq "pp_lineseq") { # braces w/o scope => elsif
+ if ($false->name eq "lineseq") { # braces w/o scope => elsif
my $head = "if ($cond) {\n\t$true\n\b}";
my @elsifs;
- while (!null($false) and $false->ppaddr eq "pp_lineseq") {
+ while (!null($false) and $false->name eq "lineseq") {
my $newop = $false->first->sibling->first;
my $newcond = $newop->first;
my $newtrue = $newcond->sibling;
@@ -1607,13 +1700,13 @@ sub pp_leaveloop {
local($self->{'curstash'}) = $self->{'curstash'};
my $head = "";
my $bare = 0;
- if ($kid->ppaddr eq "pp_lineseq") { # bare or infinite loop
+ if ($kid->name eq "lineseq") { # bare or infinite loop
if (is_state $kid->last) { # infinite
$head = "for (;;) "; # shorter than while (1)
} else {
$bare = 1;
}
- } elsif ($enter->ppaddr eq "pp_enteriter") { # foreach
+ } elsif ($enter->name eq "enteriter") { # foreach
my $ary = $enter->first->sibling; # first was pushmark
my $var = $ary->sibling;
if ($enter->flags & OPf_STACKED
@@ -1638,20 +1731,20 @@ sub pp_leaveloop {
$var = "my " . $var;
}
}
- } elsif ($var->ppaddr eq "pp_rv2gv") {
+ } elsif ($var->name eq "rv2gv") {
$var = $self->pp_rv2sv($var, 1);
- } elsif ($var->ppaddr eq "pp_gv") {
+ } elsif ($var->name eq "gv") {
$var = "\$" . $self->deparse($var, 1);
}
$head = "foreach $var ($ary) ";
$kid = $kid->first->first->sibling; # skip OP_AND and OP_ITER
- } elsif ($kid->ppaddr eq "pp_null") { # while/until
+ } elsif ($kid->name eq "null") { # while/until
$kid = $kid->first;
- my $name = {"pp_and" => "while", "pp_or" => "until"}
- ->{$kid->ppaddr};
+ my $name = {"and" => "while", "or" => "until"}
+ ->{$kid->name};
$head = "$name (" . $self->deparse($kid->first, 1) . ") ";
$kid = $kid->first->sibling;
- } elsif ($kid->ppaddr eq "pp_stub") { # bare and empty
+ } elsif ($kid->name eq "stub") { # bare and empty
return "{;}"; # {} could be a hashref
}
# The third-to-last kid is the continue block if the pointer used
@@ -1663,15 +1756,14 @@ sub pp_leaveloop {
# (because it's a nulled out nextstate in a scope), in which
# case the head's next is advanced past the null but the nextop's
# isn't, so we need to try nextop->next.
- my($cont, $precont);
+ my $precont;
+ my $cont = $kid->first;
if ($bare) {
- $cont = $kid->first;
while (!null($cont->sibling)) {
$precont = $cont;
$cont = $cont->sibling;
}
} else {
- $cont = $kid->first;
while (!null($cont->sibling->sibling->sibling)) {
$precont = $cont;
$cont = $cont->sibling;
@@ -1708,30 +1800,29 @@ sub pp_leavetry {
return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}";
}
-sub OP_CONST () { 5 }
-
-# XXX need a better way to do this
-sub OP_STRINGIFY () { $] > 5.004_72 ? 67 : 65 }
+BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" }
+BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" }
sub pp_null {
my $self = shift;
my($op, $cx) = @_;
if (class($op) eq "OP") {
- return "'???'" if $op->targ == OP_CONST; # old value is lost
- } elsif ($op->first->ppaddr eq "pp_pushmark") {
+ # old value is lost
+ return $self->{'ex_const'} if $op->targ == OP_CONST;
+ } elsif ($op->first->name eq "pushmark") {
return $self->pp_list($op, $cx);
- } elsif ($op->first->ppaddr eq "pp_enter") {
+ } elsif ($op->first->name eq "enter") {
return $self->pp_leave($op, $cx);
} elsif ($op->targ == OP_STRINGIFY) {
return $self->dquote($op);
} elsif (!null($op->first->sibling) and
- $op->first->sibling->ppaddr eq "pp_readline" and
+ $op->first->sibling->name eq "readline" and
$op->first->sibling->flags & OPf_STACKED) {
return $self->maybe_parens($self->deparse($op->first, 7) . " = "
. $self->deparse($op->first->sibling, 7),
$cx, 7);
} elsif (!null($op->first->sibling) and
- $op->first->sibling->ppaddr eq "pp_trans" and
+ $op->first->sibling->name eq "trans" and
$op->first->sibling->flags & OPf_STACKED) {
return $self->maybe_parens($self->deparse($op->first, 20) . " =~ "
. $self->deparse($op->first->sibling, 20),
@@ -1741,6 +1832,16 @@ sub pp_null {
}
}
+# the aassign in-common check messes up SvCUR (always setting it
+# to a value >= 100), but it's probably safe to assume there
+# won't be any NULs in the names of my() variables. (with
+# stash variables, I wouldn't be so sure)
+sub padname_fix {
+ my $str = shift;
+ $str = substr($str, 0, index($str, "\0")) if index($str, "\0") != -1;
+ return $str;
+}
+
sub padname {
my $self = shift;
my $targ = shift;
@@ -1778,22 +1879,37 @@ sub pp_threadsv {
return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]);
}
+sub maybe_padgv {
+ my $self = shift;
+ my $op = shift;
+ my $gv;
+ if ($Config{useithreads}) {
+ $gv = $self->padval($op->padix);
+ }
+ else {
+ $gv = $op->gv;
+ }
+ return $gv;
+}
+
sub pp_gvsv {
my $self = shift;
my($op, $cx) = @_;
- return $self->maybe_local($op, $cx, "\$" . $self->gv_name($op->gv));
+ my $gv = $self->maybe_padgv($op);
+ return $self->maybe_local($op, $cx, "\$" . $self->gv_name($gv));
}
sub pp_gv {
my $self = shift;
my($op, $cx) = @_;
- return $self->gv_name($op->gv);
+ my $gv = $self->maybe_padgv($op);
+ return $self->gv_name($gv);
}
sub pp_aelemfast {
my $self = shift;
my($op, $cx) = @_;
- my $gv = $op->gv;
+ my $gv = $self->maybe_padgv($op);
return "\$" . $self->gv_name($gv) . "[" . $op->private . "]";
}
@@ -1813,7 +1929,7 @@ sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) }
sub pp_av2arylen {
my $self = shift;
my($op, $cx) = @_;
- if ($op->first->ppaddr eq "pp_padav") {
+ if ($op->first->name eq "padav") {
return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first));
} else {
return $self->maybe_local($op, $cx,
@@ -1828,23 +1944,41 @@ sub pp_rv2av {
my $self = shift;
my($op, $cx) = @_;
my $kid = $op->first;
- if ($kid->ppaddr eq "pp_const") { # constant list
- my $av = $kid->sv;
+ if ($kid->name eq "const") { # constant list
+ my $av = $self->const_sv($kid);
return "(" . join(", ", map(const($_), $av->ARRAY)) . ")";
} else {
return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@"));
}
}
+sub is_subscriptable {
+ my $op = shift;
+ if ($op->name =~ /^[ahg]elem/) {
+ return 1;
+ } elsif ($op->name eq "entersub") {
+ my $kid = $op->first;
+ return 0 unless null $kid->sibling;
+ $kid = $kid->first;
+ $kid = $kid->sibling until null $kid->sibling;
+ return 0 if is_scope($kid);
+ $kid = $kid->first;
+ return 0 if $kid->name eq "gv";
+ return 0 if is_scalar($kid);
+ return is_subscriptable($kid);
+ } else {
+ return 0;
+ }
+}
sub elem {
my $self = shift;
my ($op, $cx, $left, $right, $padname) = @_;
my($array, $idx) = ($op->first, $op->first->sibling);
- unless ($array->ppaddr eq $padname) { # Maybe this has been fixed
+ unless ($array->name eq $padname) { # Maybe this has been fixed
$array = $array->first; # skip rv2av (or ex-rv2av in _53+)
}
- if ($array->ppaddr eq $padname) {
+ if ($array->name eq $padname) {
$array = $self->padany($array);
} elsif (is_scope($array)) { # ${expr}[0]
$array = "{" . $self->deparse($array, 0) . "}";
@@ -1852,8 +1986,7 @@ sub elem {
$array = $self->deparse($array, 24);
} else {
# $x[20][3]{hi} or expr->[20]
- my $arrow;
- $arrow = "->" if $array->ppaddr !~ /^pp_[ah]elem$/;
+ my $arrow = is_subscriptable($array) ? "" : "->";
return $self->deparse($array, 24) . $arrow .
$left . $self->deparse($idx, 1) . $right;
}
@@ -1861,15 +1994,15 @@ sub elem {
return "\$" . $array . $left . $idx . $right;
}
-sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "pp_padav")) }
-sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "pp_padhv")) }
+sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) }
+sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) }
sub pp_gelem {
my $self = shift;
my($op, $cx) = @_;
my($glob, $part) = ($op->first, $op->last);
$glob = $glob->first; # skip rv2gv
- $glob = $glob->first if $glob->ppaddr eq "pp_rv2gv"; # this one's a bug
+ $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug
my $scope = is_scope($glob);
$glob = $self->deparse($glob, 0);
$part = $self->deparse($part, 1);
@@ -1889,16 +2022,16 @@ sub slice {
}
$array = $last;
$array = $array->first
- if $array->ppaddr eq $regname or $array->ppaddr eq "pp_null";
+ if $array->name eq $regname or $array->name eq "null";
if (is_scope($array)) {
$array = "{" . $self->deparse($array, 0) . "}";
- } elsif ($array->ppaddr eq $padname) {
+ } elsif ($array->name eq $padname) {
$array = $self->padany($array);
} else {
$array = $self->deparse($array, 24);
}
$kid = $op->first->sibling; # skip pushmark
- if ($kid->ppaddr eq "pp_list") {
+ if ($kid->name eq "list") {
$kid = $kid->first->sibling; # skip list, pushmark
for (; !null $kid; $kid = $kid->sibling) {
push @elems, $self->deparse($kid, 6);
@@ -1910,10 +2043,8 @@ sub slice {
return "\@" . $array . $left . $list . $right;
}
-sub pp_aslice { maybe_local(@_, slice(@_, "[", "]",
- "pp_rv2av", "pp_padav")) }
-sub pp_hslice { maybe_local(@_, slice(@_, "{", "}",
- "pp_rv2hv", "pp_padhv")) }
+sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) }
+sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) }
sub pp_lslice {
my $self = shift;
@@ -1926,48 +2057,153 @@ sub pp_lslice {
return "($list)" . "[$idx]";
}
-sub OPpENTERSUB_AMPER () { 8 }
-
-sub OPf_WANT () { 3 }
-sub OPf_WANT_VOID () { 1 }
-sub OPf_WANT_SCALAR () { 2 }
-sub OPf_WANT_LIST () { 2 }
-
sub want_scalar {
my $op = shift;
return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR;
}
-sub pp_entersub {
+sub want_list {
+ my $op = shift;
+ return ($op->flags & OPf_WANT) == OPf_WANT_LIST;
+}
+
+sub method {
my $self = shift;
my($op, $cx) = @_;
- my $prefix = "";
- my $amper = "";
- my $proto = undef;
- my $simple = 0;
- my($kid, $args, @exprs);
- if (not null $op->first->sibling) { # method
- $kid = $op->first->sibling; # skip pushmark
- my $obj = $self->deparse($kid, 24);
+ my $kid = $op->first->sibling; # skip pushmark
+ my($meth, $obj, @exprs);
+ if ($kid->name eq "list" and want_list $kid) {
+ # When an indirect object isn't a bareword but the args are in
+ # parens, the parens aren't part of the method syntax (the LLAFR
+ # doesn't apply), but they make a list with OPf_PARENS set that
+ # doesn't get flattened by the append_elem that adds the method,
+ # making a (object, arg1, arg2, ...) list where the object
+ # usually is. This can be distinguished from
+ # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an
+ # object) because in the later the list is in scalar context
+ # as the left side of -> always is, while in the former
+ # the list is in list context as method arguments always are.
+ # (Good thing there aren't method prototypes!)
+ $meth = $kid->sibling;
+ $kid = $kid->first->sibling; # skip pushmark
+ $obj = $kid;
+ $kid = $kid->sibling;
+ for (; not null $kid; $kid = $kid->sibling) {
+ push @exprs, $self->deparse($kid, 6);
+ }
+ } else {
+ $obj = $kid;
$kid = $kid->sibling;
for (; not null $kid->sibling; $kid = $kid->sibling) {
push @exprs, $self->deparse($kid, 6);
}
- my $meth = $kid->first;
- if ($meth->ppaddr eq "pp_const") {
- $meth = $meth->sv->PV; # needs to be bare
+ $meth = $kid;
+ }
+ $obj = $self->deparse($obj, 24);
+ if ($meth->name eq "method_named") {
+ $meth = $self->const_sv($meth)->PV;
+ } else {
+ $meth = $meth->first;
+ if ($meth->name eq "const") {
+ # As of 5.005_58, this case is probably obsoleted by the
+ # method_named case above
+ $meth = $self->const_sv($meth)->PV; # needs to be bare
} else {
$meth = $self->deparse($meth, 1);
}
- $args = join(", ", @exprs);
- $kid = $obj . "->" . $meth;
- if ($args) {
- return $kid . "(" . $args . ")"; # parens mandatory
+ }
+ my $args = join(", ", @exprs);
+ $kid = $obj . "->" . $meth;
+ if ($args) {
+ return $kid . "(" . $args . ")"; # parens mandatory
+ } else {
+ return $kid;
+ }
+}
+
+# returns "&" if the prototype doesn't match the args,
+# or ("", $args_after_prototype_demunging) if it does.
+sub check_proto {
+ my $self = shift;
+ my($proto, @args) = @_;
+ my($arg, $real);
+ my $doneok = 0;
+ my @reals;
+ # An unbackslashed @ or % gobbles up the rest of the args
+ $proto =~ s/([^\\]|^)([@%])(.*)$/$1$2/;
+ while ($proto) {
+ $proto =~ s/^ *([\\]?[\$\@&%*]|;)//;
+ my $chr = $1;
+ if ($chr eq "") {
+ return "&" if @args;
+ } elsif ($chr eq ";") {
+ $doneok = 1;
+ } elsif ($chr eq "@" or $chr eq "%") {
+ push @reals, map($self->deparse($_, 6), @args);
+ @args = ();
} else {
- return $kid; # toke.c fakes parens
- }
+ $arg = shift @args;
+ last unless $arg;
+ if ($chr eq "\$") {
+ if (want_scalar $arg) {
+ push @reals, $self->deparse($arg, 6);
+ } else {
+ return "&";
+ }
+ } elsif ($chr eq "&") {
+ if ($arg->name =~ /^(s?refgen|undef)$/) {
+ push @reals, $self->deparse($arg, 6);
+ } else {
+ return "&";
+ }
+ } elsif ($chr eq "*") {
+ if ($arg->name =~ /^s?refgen$/
+ and $arg->first->first->name eq "rv2gv")
+ {
+ $real = $arg->first->first; # skip refgen, null
+ if ($real->first->name eq "gv") {
+ push @reals, $self->deparse($real, 6);
+ } else {
+ push @reals, $self->deparse($real->first, 6);
+ }
+ } else {
+ return "&";
+ }
+ } elsif (substr($chr, 0, 1) eq "\\") {
+ $chr = substr($chr, 1);
+ if ($arg->name =~ /^s?refgen$/ and
+ !null($real = $arg->first) and
+ ($chr eq "\$" && is_scalar($real->first)
+ or ($chr eq "\@"
+ && $real->first->sibling->name
+ =~ /^(rv2|pad)av$/)
+ or ($chr eq "%"
+ && $real->first->sibling->name
+ =~ /^(rv2|pad)hv$/)
+ #or ($chr eq "&" # This doesn't work
+ # && $real->first->name eq "rv2cv")
+ or ($chr eq "*"
+ && $real->first->name eq "rv2gv")))
+ {
+ push @reals, $self->deparse($real, 6);
+ } else {
+ return "&";
+ }
+ }
+ }
}
- # else, not a method
+ return "&" if $proto and !$doneok; # too few args and no `;'
+ return "&" if @args; # too many args
+ return ("", join ", ", @reals);
+}
+
+sub pp_entersub {
+ my $self = shift;
+ my($op, $cx) = @_;
+ return $self->method($op, $cx) unless null $op->first->sibling;
+ my $prefix = "";
+ my $amper = "";
+ my($kid, @exprs);
if ($op->flags & OPf_SPECIAL) {
$prefix = "do ";
} elsif ($op->private & OPpENTERSUB_AMPER) {
@@ -1978,97 +2214,30 @@ sub pp_entersub {
for (; not null $kid->sibling; $kid = $kid->sibling) {
push @exprs, $kid;
}
+ my $simple = 0;
+ my $proto = undef;
if (is_scope($kid)) {
$amper = "&";
$kid = "{" . $self->deparse($kid, 0) . "}";
- } elsif ($kid->first->ppaddr eq "pp_gv") {
- my $gv = $kid->first->gv;
+ } elsif ($kid->first->name eq "gv") {
+ my $gv = $self->maybe_padgv($kid->first);
if (class($gv->CV) ne "SPECIAL") {
$proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
}
- $simple = 1;
+ $simple = 1; # only calls of named functions can be prototyped
$kid = $self->deparse($kid, 24);
} elsif (is_scalar $kid->first) {
$amper = "&";
$kid = $self->deparse($kid, 24);
} else {
$prefix = "";
- $kid = $self->deparse($kid, 24) . "->";
+ my $arrow = is_subscriptable($kid->first) ? "" : "->";
+ $kid = $self->deparse($kid, 24) . $arrow;
}
+ my $args;
if (defined $proto and not $amper) {
- my($arg, $real);
- my $doneok = 0;
- my @args = @exprs;
- my @reals;
- my $p = $proto;
- $p =~ s/([^\\]|^)([@%])(.*)$/$1$2/;
- while ($p) {
- $p =~ s/^ *([\\]?[\$\@&%*]|;)//;
- my $chr = $1;
- if ($chr eq "") {
- undef $proto if @args;
- } elsif ($chr eq ";") {
- $doneok = 1;
- } elsif ($chr eq "@" or $chr eq "%") {
- push @reals, map($self->deparse($_, 6), @args);
- @args = ();
- } else {
- $arg = shift @args;
- last unless $arg;
- if ($chr eq "\$") {
- if (want_scalar $arg) {
- push @reals, $self->deparse($arg, 6);
- } else {
- undef $proto;
- }
- } elsif ($chr eq "&") {
- if ($arg->ppaddr =~ /pp_(s?refgen|undef)/) {
- push @reals, $self->deparse($arg, 6);
- } else {
- undef $proto;
- }
- } elsif ($chr eq "*") {
- if ($arg->ppaddr =~ /^pp_s?refgen$/
- and $arg->first->first->ppaddr eq "pp_rv2gv")
- {
- $real = $arg->first->first; # skip refgen, null
- if ($real->first->ppaddr eq "pp_gv") {
- push @reals, $self->deparse($real, 6);
- } else {
- push @reals, $self->deparse($real->first, 6);
- }
- } else {
- undef $proto;
- }
- } elsif (substr($chr, 0, 1) eq "\\") {
- $chr = substr($chr, 1);
- if ($arg->ppaddr =~ /^pp_s?refgen$/ and
- !null($real = $arg->first) and
- ($chr eq "\$" && is_scalar($real->first)
- or ($chr eq "\@"
- && $real->first->sibling->ppaddr
- =~ /^pp_(rv2|pad)av$/)
- or ($chr eq "%"
- && $real->first->sibling->ppaddr
- =~ /^pp_(rv2|pad)hv$/)
- #or ($chr eq "&" # This doesn't work
- # && $real->first->ppaddr eq "pp_rv2cv")
- or ($chr eq "*"
- && $real->first->ppaddr eq "pp_rv2gv")))
- {
- push @reals, $self->deparse($real, 6);
- } else {
- undef $proto;
- }
- }
- }
- }
- undef $proto if $p and !$doneok;
- undef $proto if @args;
- $args = join(", ", @reals);
- $amper = "";
- unless (defined $proto) {
- $amper = "&";
+ ($amper, $args) = $self->check_proto($proto, @exprs);
+ if ($amper eq "&") {
$args = join(", ", map($self->deparse($_, 6), @exprs));
}
} else {
@@ -2146,6 +2315,7 @@ sub balanced_delim {
} elsif ($c eq $close) {
$cnt--;
if ($cnt < 0) {
+ # qq()() isn't ")("
$fail = 1;
last;
}
@@ -2175,14 +2345,10 @@ sub single_delim {
}
}
-sub SVf_IOK () {0x10000}
-sub SVf_NOK () {0x20000}
-sub SVf_ROK () {0x80000}
-
sub const {
my $sv = shift;
if (class($sv) eq "SPECIAL") {
- return ('undef', '1', '0')[$$sv-1];
+ return ('undef', '1', '0')[$$sv-1]; # sv_undef, sv_yes, sv_no
} elsif ($sv->FLAGS & SVf_IOK) {
return $sv->IV;
} elsif ($sv->FLAGS & SVf_NOK) {
@@ -2191,43 +2357,52 @@ sub const {
return "\\(" . const($sv->RV) . ")"; # constant folded
} else {
my $str = $sv->PV;
- if ($str =~ /[^ -~]/) { # ASCII
+ if ($str =~ /[^ -~]/) { # ASCII for non-printing
return single_delim("qq", '"', uninterp escape_str unback $str);
} else {
- $str =~ s/\\/\\\\/g;
- return single_delim("q", "'", $str);
+ return single_delim("q", "'", unback $str);
}
}
}
+sub const_sv {
+ my $self = shift;
+ my $op = shift;
+ my $sv = $op->sv;
+ # the constant could be in the pad (under useithreads)
+ $sv = $self->padval($op->targ) unless $$sv;
+ return $sv;
+}
+
sub pp_const {
my $self = shift;
my($op, $cx) = @_;
-# if ($op->private & OPp_CONST_BARE) { # trouble with `=>' autoquoting
-# return $op->sv->PV;
+# if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting
+# return $self->const_sv($op)->PV;
# }
- return const($op->sv);
+ my $sv = $self->const_sv($op);
+ return const($sv);
}
sub dq {
my $self = shift;
my $op = shift;
- my $type = $op->ppaddr;
- if ($type eq "pp_const") {
- return uninterp(escape_str(unback($op->sv->PV)));
- } elsif ($type eq "pp_concat") {
+ my $type = $op->name;
+ if ($type eq "const") {
+ return uninterp(escape_str(unback($self->const_sv($op)->PV)));
+ } elsif ($type eq "concat") {
return $self->dq($op->first) . $self->dq($op->last);
- } elsif ($type eq "pp_uc") {
+ } elsif ($type eq "uc") {
return '\U' . $self->dq($op->first->sibling) . '\E';
- } elsif ($type eq "pp_lc") {
+ } elsif ($type eq "lc") {
return '\L' . $self->dq($op->first->sibling) . '\E';
- } elsif ($type eq "pp_ucfirst") {
+ } elsif ($type eq "ucfirst") {
return '\u' . $self->dq($op->first->sibling);
- } elsif ($type eq "pp_lcfirst") {
+ } elsif ($type eq "lcfirst") {
return '\l' . $self->dq($op->first->sibling);
- } elsif ($type eq "pp_quotemeta") {
+ } elsif ($type eq "quotemeta") {
return '\Q' . $self->dq($op->first->sibling) . '\E';
- } elsif ($type eq "pp_join") {
+ } elsif ($type eq "join") {
return $self->deparse($op->last, 26); # was join($", @ary)
} else {
return $self->deparse($op, 26);
@@ -2243,13 +2418,15 @@ sub pp_backtick {
sub dquote {
my $self = shift;
- my $op = shift;
- # skip ex-stringify, pushmark
- return single_delim("qq", '"', $self->dq($op->first->sibling));
+ my($op, $cx) = shift;
+ my $kid = $op->first->sibling; # skip ex-stringify, pushmark
+ return $self->deparse($kid, $cx) if $self->{'unquote'};
+ $self->maybe_targmy($kid, $cx,
+ sub {single_delim("qq", '"', $self->dq($_[1]))});
}
-# OP_STRINGIFY is a listop, but it only ever has one arg (?)
-sub pp_stringify { dquote(@_) }
+# OP_STRINGIFY is a listop, but it only ever has one arg
+sub pp_stringify { maybe_targmy(@_, \&dquote) }
# tr/// and s/// (and tr[][], tr[]//, tr###, etc)
# note that tr(from)/to/ is OK, but not tr/from/(to)
@@ -2316,7 +2493,8 @@ sub collapse {
if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and
$chars[$c + 2] == $tr + 2)
{
- for (; $c <= $#chars and $chars[$c + 1] == $chars[$c] + 1; $c++) {}
+ for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++)
+ {}
$str .= "-";
$str .= pchr($chars[$c]);
}
@@ -2324,14 +2502,12 @@ sub collapse {
return $str;
}
-sub OPpTRANS_SQUASH () { 16 }
-sub OPpTRANS_DELETE () { 32 }
-sub OPpTRANS_COMPLEMENT () { 64 }
+# XXX This has trouble with hyphens in the replacement (tr/bac/-AC/),
+# and backslashes.
-sub pp_trans {
- my $self = shift;
- my($op, $cx) = @_;
- my(@table) = unpack("s256", $op->pv);
+sub tr_decode_byte {
+ my($table, $flags) = @_;
+ my(@table) = unpack("s256", $table);
my($c, $tr, @from, @to, @delfrom, $delhyphen);
if ($table[ord "-"] != -1 and
$table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1)
@@ -2353,10 +2529,8 @@ sub pp_trans {
push @delfrom, $c;
}
}
- my $flags;
@from = (@from, @delfrom);
- if ($op->private & OPpTRANS_COMPLEMENT) {
- $flags .= "c";
+ if ($flags & OPpTRANS_COMPLEMENT) {
my @newfrom = ();
my %from;
@from{@from} = (1) x @from;
@@ -2365,16 +2539,136 @@ sub pp_trans {
}
@from = @newfrom;
}
- if ($op->private & OPpTRANS_DELETE) {
- $flags .= "d";
- } else {
+ unless ($flags & OPpTRANS_DELETE) {
pop @to while $#to and $to[$#to] == $to[$#to -1];
}
- $flags .= "s" if $op->private & OPpTRANS_SQUASH;
my($from, $to);
$from = collapse(@from);
$to = collapse(@to);
$from .= "-" if $delhyphen;
+ return ($from, $to);
+}
+
+sub tr_chr {
+ my $x = shift;
+ if ($x == ord "-") {
+ return "\\-";
+ } else {
+ return chr $x;
+ }
+}
+
+# XXX This doesn't yet handle all cases correctly either
+
+sub tr_decode_utf8 {
+ my($swash_hv, $flags) = @_;
+ my %swash = $swash_hv->ARRAY;
+ my $final = undef;
+ $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'};
+ my $none = $swash{"NONE"}->IV;
+ my $extra = $none + 1;
+ my(@from, @delfrom, @to);
+ my $line;
+ foreach $line (split /\n/, $swash{'LIST'}->PV) {
+ my($min, $max, $result) = split(/\t/, $line);
+ $min = hex $min;
+ if (length $max) {
+ $max = hex $max;
+ } else {
+ $max = $min;
+ }
+ $result = hex $result;
+ if ($result == $extra) {
+ push @delfrom, [$min, $max];
+ } else {
+ push @from, [$min, $max];
+ push @to, [$result, $result + $max - $min];
+ }
+ }
+ for my $i (0 .. $#from) {
+ if ($from[$i][0] == ord '-') {
+ unshift @from, splice(@from, $i, 1);
+ unshift @to, splice(@to, $i, 1);
+ last;
+ } elsif ($from[$i][1] == ord '-') {
+ $from[$i][1]--;
+ $to[$i][1]--;
+ unshift @from, ord '-';
+ unshift @to, ord '-';
+ last;
+ }
+ }
+ for my $i (0 .. $#delfrom) {
+ if ($delfrom[$i][0] == ord '-') {
+ push @delfrom, splice(@delfrom, $i, 1);
+ last;
+ } elsif ($delfrom[$i][1] == ord '-') {
+ $delfrom[$i][1]--;
+ push @delfrom, ord '-';
+ last;
+ }
+ }
+ if (defined $final and $to[$#to][1] != $final) {
+ push @to, [$final, $final];
+ }
+ push @from, @delfrom;
+ if ($flags & OPpTRANS_COMPLEMENT) {
+ my @newfrom;
+ my $next = 0;
+ for my $i (0 .. $#from) {
+ push @newfrom, [$next, $from[$i][0] - 1];
+ $next = $from[$i][1] + 1;
+ }
+ @from = ();
+ for my $range (@newfrom) {
+ if ($range->[0] <= $range->[1]) {
+ push @from, $range;
+ }
+ }
+ }
+ my($from, $to, $diff);
+ for my $chunk (@from) {
+ $diff = $chunk->[1] - $chunk->[0];
+ if ($diff > 1) {
+ $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
+ } elsif ($diff == 1) {
+ $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
+ } else {
+ $from .= tr_chr($chunk->[0]);
+ }
+ }
+ for my $chunk (@to) {
+ $diff = $chunk->[1] - $chunk->[0];
+ if ($diff > 1) {
+ $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]);
+ } elsif ($diff == 1) {
+ $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]);
+ } else {
+ $to .= tr_chr($chunk->[0]);
+ }
+ }
+ #$final = sprintf("%04x", $final) if defined $final;
+ #$none = sprintf("%04x", $none) if defined $none;
+ #$extra = sprintf("%04x", $extra) if defined $extra;
+ #print STDERR "final: $final\n none: $none\nextra: $extra\n";
+ #print STDERR $swash{'LIST'}->PV;
+ return (escape_str($from), escape_str($to));
+}
+
+sub pp_trans {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my($from, $to);
+ if (class($op) eq "PVOP") {
+ ($from, $to) = tr_decode_byte($op->pv, $op->private);
+ } else { # class($op) eq "SVOP"
+ ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private);
+ }
+ my $flags = "";
+ $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT;
+ $flags .= "d" if $op->private & OPpTRANS_DELETE;
+ $to = "" if $from eq $to and $flags eq "";
+ $flags .= "s" if $op->private & OPpTRANS_SQUASH;
return "tr" . double_delim($from, $to) . $flags;
}
@@ -2382,22 +2676,22 @@ sub pp_trans {
sub re_dq {
my $self = shift;
my $op = shift;
- my $type = $op->ppaddr;
- if ($type eq "pp_const") {
- return uninterp($op->sv->PV);
- } elsif ($type eq "pp_concat") {
+ my $type = $op->name;
+ if ($type eq "const") {
+ return uninterp($self->const_sv($op)->PV);
+ } elsif ($type eq "concat") {
return $self->re_dq($op->first) . $self->re_dq($op->last);
- } elsif ($type eq "pp_uc") {
+ } elsif ($type eq "uc") {
return '\U' . $self->re_dq($op->first->sibling) . '\E';
- } elsif ($type eq "pp_lc") {
+ } elsif ($type eq "lc") {
return '\L' . $self->re_dq($op->first->sibling) . '\E';
- } elsif ($type eq "pp_ucfirst") {
+ } elsif ($type eq "ucfirst") {
return '\u' . $self->re_dq($op->first->sibling);
- } elsif ($type eq "pp_lcfirst") {
+ } elsif ($type eq "lcfirst") {
return '\l' . $self->re_dq($op->first->sibling);
- } elsif ($type eq "pp_quotemeta") {
+ } elsif ($type eq "quotemeta") {
return '\Q' . $self->re_dq($op->first->sibling) . '\E';
- } elsif ($type eq "pp_join") {
+ } elsif ($type eq "join") {
return $self->deparse($op->last, 26); # was join($", @ary)
} else {
return $self->deparse($op, 26);
@@ -2408,26 +2702,11 @@ sub pp_regcomp {
my $self = shift;
my($op, $cx) = @_;
my $kid = $op->first;
- $kid = $kid->first if $kid->ppaddr eq "pp_regcmaybe";
- $kid = $kid->first if $kid->ppaddr eq "pp_regcreset";
+ $kid = $kid->first if $kid->name eq "regcmaybe";
+ $kid = $kid->first if $kid->name eq "regcreset";
return $self->re_dq($kid);
}
-sub OPp_RUNTIME () { 64 }
-
-sub PMf_ONCE () { 0x2 }
-sub PMf_SKIPWHITE () { 0x10 }
-sub PMf_CONST () { 0x40 }
-sub PMf_KEEP () { 0x80 }
-sub PMf_GLOBAL () { 0x100 }
-sub PMf_CONTINUE () { 0x200 }
-sub PMf_EVAL () { 0x400 }
-sub PMf_LOCALE () { 0x800 }
-sub PMf_MULTILINE () { 0x1000 }
-sub PMf_SINGLELINE () { 0x2000 }
-sub PMf_FOLD () { 0x4000 }
-sub PMf_EXTENDED () { 0x8000 }
-
# osmic acid -- see osmium tetroxide
my %matchwords;
@@ -2522,11 +2801,15 @@ sub pp_subst {
$kid = $kid->sibling;
} else {
$repl = $op->pmreplroot->first; # skip substcont
- while ($repl->ppaddr eq "pp_entereval") {
+ while ($repl->name eq "entereval") {
$repl = $repl->first;
$flags .= "e";
}
- $repl = $self->dq($repl);
+ if ($op->pmflags & PMf_EVAL) {
+ $repl = $self->deparse($repl, 0);
+ } else {
+ $repl = $self->dq($repl);
+ }
}
if (null $kid) {
$re = re_uninterp(escape_str($op->precomp));
@@ -2559,7 +2842,8 @@ B::Deparse - Perl compiler backend to produce perl code
=head1 SYNOPSIS
-B<perl> B<-MO=Deparse>[B<,-u>I<PACKAGE>][B<,-p>][B<,-l>][B<,-s>I<LETTERS>] I<prog.pl>
+B<perl> B<-MO=Deparse>[B<,-u>I<PACKAGE>][B<,-p>][B<,-q>][B<,-l>][B<,-s>I<LETTERS>]
+ I<prog.pl>
=head1 DESCRIPTION
@@ -2584,6 +2868,11 @@ the '-MO=Deparse', separated by a comma but not any white space.
=over 4
+=item B<-l>
+
+Add '#line' declarations to the output based on the line and file
+locations of the original code.
+
=item B<-p>
Print extra parentheses. Without this option, B::Deparse includes
@@ -2607,29 +2896,44 @@ C<B::Deparse,-p> will print
which probably isn't what you intended (the C<'???'> is a sign that
perl optimized away a constant value).
+=item B<-q>
+
+Expand double-quoted strings into the corresponding combinations of
+concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For
+instance, print
+
+ print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
+
+as
+
+ print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
+ . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
+
+Note that the expanded form represents the way perl handles such
+constructions internally -- this option actually turns off the reverse
+translation that B::Deparse usually does. On the other hand, note that
+C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value
+of $y into a string before doing the assignment.
+
=item B<-u>I<PACKAGE>
Normally, B::Deparse deparses the main code of a program, all the subs
called by the main program (and all the subs called by them,
recursively), and any other subs in the main:: package. To include
subs in other packages that aren't called directly, such as AUTOLOAD,
-DESTROY, other subs called automatically by perl, and methods, which
-aren't resolved to subs until runtime, use the B<-u> option. The
+DESTROY, other subs called automatically by perl, and methods (which
+aren't resolved to subs until runtime), use the B<-u> option. The
argument to B<-u> is the name of a package, and should follow directly
after the 'u'. Multiple B<-u> options may be given, separated by
commas. Note that unlike some other backends, B::Deparse doesn't
(yet) try to guess automatically when B<-u> is needed -- you must
invoke it yourself.
-=item B<-l>
-
-Add '#line' declarations to the output based on the line and file
-locations of the original code.
-
=item B<-s>I<LETTERS>
-Tweak the style of B::Deparse's output. At the moment, only one style
-option is implemented:
+Tweak the style of B::Deparse's output. The letters should follow
+directly after the 's', with no space or punctuation. The following
+options are available:
=over 4
@@ -2654,17 +2958,85 @@ instead of
The default is not to cuddle.
+=item B<i>I<NUMBER>
+
+Indent lines by multiples of I<NUMBER> columns. The default is 4 columns.
+
+=item B<T>
+
+Use tabs for each 8 columns of indent. The default is to use only spaces.
+For instance, if the style options are B<-si4T>, a line that's indented
+3 times will be preceded by one tab and four spaces; if the options were
+B<-si8T>, the same line would be preceded by three tabs.
+
+=item B<v>I<STRING>B<.>
+
+Print I<STRING> for the value of a constant that can't be determined
+because it was optimized away (mnemonic: this happens when a constant
+is used in B<v>oid context). The end of the string is marked by a period.
+The string should be a valid perl expression, generally a constant.
+Note that unless it's a number, it probably needs to be quoted, and on
+a command line quotes need to be protected from the shell. Some
+conventional values include 0, 1, 42, '', 'foo', and
+'Useless use of constant omitted' (which may need to be
+B<-sv"'Useless use of constant omitted'.">
+or something similar depending on your shell). The default is '???'.
+If you're using B::Deparse on a module or other file that's require'd,
+you shouldn't use a value that evaluates to false, since the customary
+true constant at the end of a module will be in void context when the
+file is compiled as a main program.
+
=back
=back
+=head1 USING B::Deparse AS A MODULE
+
+=head2 Synopsis
+
+ use B::Deparse;
+ $deparse = B::Deparse->new("-p", "-sC");
+ $body = $deparse->coderef2text(\&func);
+ eval "sub func $body"; # the inverse operation
+
+=head2 Description
+
+B::Deparse can also be used on a sub-by-sub basis from other perl
+programs.
+
+=head2 new
+
+ $deparse = B::Deparse->new(OPTIONS)
+
+Create an object to store the state of a deparsing operation and any
+options. The options are the same as those that can be given on the
+command line (see L</OPTIONS>); options that are separated by commas
+after B<-MO=Deparse> should be given as separate strings. Some
+options, like B<-u>, don't make sense for a single subroutine, so
+don't pass them.
+
+=head2 coderef2text
+
+ $body = $deparse->coderef2text(\&func)
+ $body = $deparse->coderef2text(sub ($$) { ... })
+
+Return source code for the body of a subroutine (a block, optionally
+preceded by a prototype in parens), given a reference to the
+sub. Because a subroutine can have no names, or more than one name,
+this method doesn't return a complete subroutine definition -- if you
+want to eval the result, you should prepend "sub subname ", or "sub "
+for an anonymous function constructor. Unless the sub was defined in
+the main:: package, the code will include a package declaration.
+
=head1 BUGS
See the 'to do' list at the beginning of the module file.
=head1 AUTHOR
-Stephen McCamant <alias@mcs.com>, based on an earlier version by
-Malcolm Beattie <mbeattie@sable.ox.ac.uk>.
+Stephen McCamant <smccam@uclink4.berkeley.edu>, based on an earlier
+version by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with
+contributions from Gisle Aas, James Duncan, Albert Dvornik, Hugo van
+der Sanden, Gurusamy Sarathy, and Nick Ing-Simmons.
=cut
diff --git a/contrib/perl5/ext/B/B/Disassembler.pm b/contrib/perl5/ext/B/B/Disassembler.pm
index 4a008a3..d054a2d 100644
--- a/contrib/perl5/ext/B/B/Disassembler.pm
+++ b/contrib/perl5/ext/B/B/Disassembler.pm
@@ -52,6 +52,20 @@ sub GET_objindex {
return unpack("N", $str);
}
+sub GET_opindex {
+ my $fh = shift;
+ my $str = $fh->readn(4);
+ croak "reached EOF while reading opindex" unless length($str) == 4;
+ return unpack("N", $str);
+}
+
+sub GET_svindex {
+ my $fh = shift;
+ my $str = $fh->readn(4);
+ croak "reached EOF while reading svindex" unless length($str) == 4;
+ return unpack("N", $str);
+}
+
sub GET_strconst {
my $fh = shift;
my ($str, $c);
diff --git a/contrib/perl5/ext/B/B/Lint.pm b/contrib/perl5/ext/B/B/Lint.pm
index d34bd77..ed0d07d 100644
--- a/contrib/perl5/ext/B/B/Lint.pm
+++ b/contrib/perl5/ext/B/B/Lint.pm
@@ -116,13 +116,9 @@ Malcolm Beattie, mbeattie@sable.ox.ac.uk.
=cut
use strict;
-use B qw(walkoptree_slow main_root walksymtable svref_2object parents);
-
-# Constants (should probably be elsewhere)
-sub G_ARRAY () { 1 }
-sub OPf_LIST () { 1 }
-sub OPf_KNOW () { 2 }
-sub OPf_STACKED () { 64 }
+use B qw(walkoptree_slow main_root walksymtable svref_2object parents
+ OPf_WANT_LIST OPf_WANT OPf_STACKED G_ARRAY
+ );
my $file = "unknown"; # shadows current filename
my $line = 0; # shadows current line number
@@ -133,8 +129,8 @@ my %check;
my %implies_ok_context;
BEGIN {
map($implies_ok_context{$_}++,
- qw(pp_scalar pp_av2arylen pp_aelem pp_aslice pp_helem pp_hslice
- pp_keys pp_values pp_hslice pp_defined pp_undef pp_delete));
+ qw(scalar av2arylen aelem aslice helem hslice
+ keys values hslice defined undef delete));
}
# Lint checks turned on by default
@@ -165,8 +161,8 @@ sub warning {
sub gimme {
my $op = shift;
my $flags = $op->flags;
- if ($flags & OPf_KNOW) {
- return(($flags & OPf_LIST) ? 1 : 0);
+ if ($flags & OPf_WANT) {
+ return(($flags & OPf_WANT_LIST) ? 1 : 0);
}
return undef;
}
@@ -175,8 +171,8 @@ sub B::OP::lint {}
sub B::COP::lint {
my $op = shift;
- if ($op->ppaddr eq "pp_nextstate") {
- $file = $op->filegv->SV->PV;
+ if ($op->name eq "nextstate") {
+ $file = $op->file;
$line = $op->line;
$curstash = $op->stash->NAME;
}
@@ -184,24 +180,24 @@ sub B::COP::lint {
sub B::UNOP::lint {
my $op = shift;
- my $ppaddr = $op->ppaddr;
- if ($check{context} && ($ppaddr eq "pp_rv2av" || $ppaddr eq "pp_rv2hv")) {
+ my $opname = $op->name;
+ if ($check{context} && ($opname eq "rv2av" || $opname eq "rv2hv")) {
my $parent = parents->[0];
- my $pname = $parent->ppaddr;
+ my $pname = $parent->name;
return if gimme($op) || $implies_ok_context{$pname};
# Two special cases to deal with: "foreach (@foo)" and "delete $a{$b}"
# null out the parent so we have to check for a parent of pp_null and
# a grandparent of pp_enteriter or pp_delete
- if ($pname eq "pp_null") {
- my $gpname = parents->[1]->ppaddr;
- return if $gpname eq "pp_enteriter" || $gpname eq "pp_delete";
+ if ($pname eq "null") {
+ my $gpname = parents->[1]->name;
+ return if $gpname eq "enteriter" || $gpname eq "delete";
}
warning("Implicit scalar context for %s in %s",
- $ppaddr eq "pp_rv2av" ? "array" : "hash", $parent->desc);
+ $opname eq "rv2av" ? "array" : "hash", $parent->desc);
}
- if ($check{private_names} && $ppaddr eq "pp_method") {
+ if ($check{private_names} && $opname eq "method") {
my $methop = $op->first;
- if ($methop->ppaddr eq "pp_const") {
+ if ($methop->name eq "const") {
my $method = $methop->sv->PV;
if ($method =~ /^_/ && !defined(&{"$curstash\::$method"})) {
warning("Illegal reference to private method name $method");
@@ -213,14 +209,12 @@ sub B::UNOP::lint {
sub B::PMOP::lint {
my $op = shift;
if ($check{implicit_read}) {
- my $ppaddr = $op->ppaddr;
- if ($ppaddr eq "pp_match" && !($op->flags & OPf_STACKED)) {
+ if ($op->name eq "match" && !($op->flags & OPf_STACKED)) {
warning('Implicit match on $_');
}
}
if ($check{implicit_write}) {
- my $ppaddr = $op->ppaddr;
- if ($ppaddr eq "pp_subst" && !($op->flags & OPf_STACKED)) {
+ if ($op->name eq "subst" && !($op->flags & OPf_STACKED)) {
warning('Implicit substitution on $_');
}
}
@@ -229,34 +223,35 @@ sub B::PMOP::lint {
sub B::LOOP::lint {
my $op = shift;
if ($check{implicit_read} || $check{implicit_write}) {
- my $ppaddr = $op->ppaddr;
- if ($ppaddr eq "pp_enteriter") {
+ if ($op->name eq "enteriter") {
my $last = $op->last;
- if ($last->ppaddr eq "pp_gv" && $last->gv->NAME eq "_") {
+ if ($last->name eq "gv" && $last->gv->NAME eq "_") {
warning('Implicit use of $_ in foreach');
}
}
}
}
-sub B::GVOP::lint {
+sub B::SVOP::lint {
my $op = shift;
- if ($check{dollar_underscore} && $op->ppaddr eq "pp_gvsv"
+ if ($check{dollar_underscore} && $op->name eq "gvsv"
&& $op->gv->NAME eq "_")
{
warning('Use of $_');
}
if ($check{private_names}) {
- my $ppaddr = $op->ppaddr;
- my $gv = $op->gv;
- if (($ppaddr eq "pp_gv" || $ppaddr eq "pp_gvsv")
- && $gv->NAME =~ /^_./ && $gv->STASH->NAME ne $curstash)
- {
- warning('Illegal reference to private name %s', $gv->NAME);
+ my $opname = $op->name;
+ if ($opname eq "gv" || $opname eq "gvsv") {
+ my $gv = $op->gv;
+ if ($gv->NAME =~ /^_./ && $gv->STASH->NAME ne $curstash) {
+ warning('Illegal reference to private name %s', $gv->NAME);
+ }
}
}
if ($check{undefined_subs}) {
- if ($op->ppaddr eq "pp_gv" && $op->next->ppaddr eq "pp_entersub") {
+ if ($op->name eq "gv"
+ && $op->next->name eq "entersub")
+ {
my $gv = $op->gv;
my $subname = $gv->STASH->NAME . "::" . $gv->NAME;
no strict 'refs';
@@ -266,7 +261,7 @@ sub B::GVOP::lint {
}
}
}
- if ($check{regexp_variables} && $op->ppaddr eq "pp_gvsv") {
+ if ($check{regexp_variables} && $op->name eq "gvsv") {
my $name = $op->gv->NAME;
if ($name =~ /^[&'`]$/) {
warning('Use of regexp variable $%s', $name);
diff --git a/contrib/perl5/ext/B/B/Stackobj.pm b/contrib/perl5/ext/B/B/Stackobj.pm
index eea966c..0db3e33 100644
--- a/contrib/perl5/ext/B/B/Stackobj.pm
+++ b/contrib/perl5/ext/B/B/Stackobj.pm
@@ -5,34 +5,35 @@
# You may distribute under the terms of either the GNU General Public
# License or the Artistic License, as specified in the README file.
#
-package B::Stackobj;
+package B::Stackobj;
use Exporter ();
@ISA = qw(Exporter);
-@EXPORT_OK = qw(set_callback T_UNKNOWN T_DOUBLE T_INT
+@EXPORT_OK = qw(set_callback T_UNKNOWN T_DOUBLE T_INT VALID_UNSIGNED
VALID_INT VALID_DOUBLE VALID_SV REGISTER TEMPORARY);
%EXPORT_TAGS = (types => [qw(T_UNKNOWN T_DOUBLE T_INT)],
flags => [qw(VALID_INT VALID_DOUBLE VALID_SV
- REGISTER TEMPORARY)]);
+ VALID_UNSIGNED REGISTER TEMPORARY)]);
use Carp qw(confess);
use strict;
-use B qw(class);
-
-# Perl internal constants that I should probably define elsewhere.
-sub SVf_IOK () { 0x10000 }
-sub SVf_NOK () { 0x20000 }
+use B qw(class SVf_IOK SVf_NOK SVf_IVisUV);
# Types
sub T_UNKNOWN () { 0 }
sub T_DOUBLE () { 1 }
sub T_INT () { 2 }
+sub T_SPECIAL () { 3 }
# Flags
sub VALID_INT () { 0x01 }
-sub VALID_DOUBLE () { 0x02 }
-sub VALID_SV () { 0x04 }
-sub REGISTER () { 0x08 } # no implicit write-back when calling subs
-sub TEMPORARY () { 0x10 } # no implicit write-back needed at all
+sub VALID_UNSIGNED () { 0x02 }
+sub VALID_DOUBLE () { 0x04 }
+sub VALID_SV () { 0x08 }
+sub REGISTER () { 0x10 } # no implicit write-back when calling subs
+sub TEMPORARY () { 0x20 } # no implicit write-back needed at all
+sub SAVE_INT () { 0x40 } #if int part needs to be saved at all
+sub SAVE_DOUBLE () { 0x80 } #if double part needs to be saved at all
+
#
# Callback for runtime code generation
@@ -47,7 +48,7 @@ sub runtime { &$runtime_callback(@_) }
sub write_back { confess "stack object does not implement write_back" }
-sub invalidate { shift->{flags} &= ~(VALID_INT | VALID_DOUBLE) }
+sub invalidate { shift->{flags} &= ~(VALID_INT |VALID_UNSIGNED | VALID_DOUBLE) }
sub as_sv {
my $obj = shift;
@@ -62,7 +63,7 @@ sub as_int {
my $obj = shift;
if (!($obj->{flags} & VALID_INT)) {
$obj->load_int;
- $obj->{flags} |= VALID_INT;
+ $obj->{flags} |= VALID_INT|SAVE_INT;
}
return $obj->{iv};
}
@@ -71,7 +72,7 @@ sub as_double {
my $obj = shift;
if (!($obj->{flags} & VALID_DOUBLE)) {
$obj->load_double;
- $obj->{flags} |= VALID_DOUBLE;
+ $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE;
}
return $obj->{nv};
}
@@ -81,6 +82,17 @@ sub as_numeric {
return $obj->{type} == T_INT ? $obj->as_int : $obj->as_double;
}
+sub as_bool {
+ my $obj=shift;
+ if ($obj->{flags} & VALID_INT ){
+ return $obj->{iv};
+ }
+ if ($obj->{flags} & VALID_DOUBLE ){
+ return $obj->{nv};
+ }
+ return sprintf("(SvTRUE(%s))", $obj->as_sv) ;
+}
+
#
# Debugging methods
#
@@ -126,17 +138,18 @@ sub minipeek {
# set_numeric and set_sv are only invoked on legal lvalues.
#
sub set_int {
- my ($obj, $expr) = @_;
+ my ($obj, $expr,$unsigned) = @_;
runtime("$obj->{iv} = $expr;");
$obj->{flags} &= ~(VALID_SV | VALID_DOUBLE);
- $obj->{flags} |= VALID_INT;
+ $obj->{flags} |= VALID_INT|SAVE_INT;
+ $obj->{flags} |= VALID_UNSIGNED if $unsigned;
}
sub set_double {
my ($obj, $expr) = @_;
runtime("$obj->{nv} = $expr;");
$obj->{flags} &= ~(VALID_SV | VALID_INT);
- $obj->{flags} |= VALID_DOUBLE;
+ $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE;
}
sub set_numeric {
@@ -162,6 +175,8 @@ sub set_sv {
@B::Stackobj::Padsv::ISA = 'B::Stackobj';
sub B::Stackobj::Padsv::new {
my ($class, $type, $extra_flags, $ix, $iname, $dname) = @_;
+ $extra_flags |= SAVE_INT if $extra_flags & VALID_INT;
+ $extra_flags |= SAVE_DOUBLE if $extra_flags & VALID_DOUBLE;
bless {
type => $type,
flags => VALID_SV | $extra_flags,
@@ -178,14 +193,23 @@ sub B::Stackobj::Padsv::load_int {
} else {
runtime("$obj->{iv} = SvIV($obj->{sv});");
}
- $obj->{flags} |= VALID_INT;
+ $obj->{flags} |= VALID_INT|SAVE_INT;
}
sub B::Stackobj::Padsv::load_double {
my $obj = shift;
$obj->write_back;
runtime("$obj->{nv} = SvNV($obj->{sv});");
- $obj->{flags} |= VALID_DOUBLE;
+ $obj->{flags} |= VALID_DOUBLE|SAVE_DOUBLE;
+}
+sub B::Stackobj::Padsv::save_int {
+ my $obj = shift;
+ return $obj->{flags} & SAVE_INT;
+}
+
+sub B::Stackobj::Padsv::save_double {
+ my $obj = shift;
+ return $obj->{flags} & SAVE_DOUBLE;
}
sub B::Stackobj::Padsv::write_back {
@@ -193,7 +217,11 @@ sub B::Stackobj::Padsv::write_back {
my $flags = $obj->{flags};
return if $flags & VALID_SV;
if ($flags & VALID_INT) {
- runtime("sv_setiv($obj->{sv}, $obj->{iv});");
+ if ($flags & VALID_UNSIGNED ){
+ runtime("sv_setuv($obj->{sv}, $obj->{iv});");
+ }else{
+ runtime("sv_setiv($obj->{sv}, $obj->{iv});");
+ }
} elsif ($flags & VALID_DOUBLE) {
runtime("sv_setnv($obj->{sv}, $obj->{nv});");
} else {
@@ -213,17 +241,26 @@ sub B::Stackobj::Const::new {
flags => 0,
sv => $sv # holds the SV object until write_back happens
}, $class;
- my $svflags = $sv->FLAGS;
- if ($svflags & SVf_IOK) {
- $obj->{flags} = VALID_INT|VALID_DOUBLE;
- $obj->{type} = T_INT;
- $obj->{nv} = $obj->{iv} = $sv->IV;
- } elsif ($svflags & SVf_NOK) {
- $obj->{flags} = VALID_INT|VALID_DOUBLE;
- $obj->{type} = T_DOUBLE;
- $obj->{iv} = $obj->{nv} = $sv->NV;
- } else {
- $obj->{type} = T_UNKNOWN;
+ if ( ref($sv) eq "B::SPECIAL" ){
+ $obj->{type}= T_SPECIAL;
+ }else{
+ my $svflags = $sv->FLAGS;
+ if ($svflags & SVf_IOK) {
+ $obj->{flags} = VALID_INT|VALID_DOUBLE;
+ $obj->{type} = T_INT;
+ if ($svflags & SVf_IVisUV){
+ $obj->{flags} |= VALID_UNSIGNED;
+ $obj->{nv} = $obj->{iv} = $sv->UVX;
+ }else{
+ $obj->{nv} = $obj->{iv} = $sv->IV;
+ }
+ } elsif ($svflags & SVf_NOK) {
+ $obj->{flags} = VALID_INT|VALID_DOUBLE;
+ $obj->{type} = T_DOUBLE;
+ $obj->{iv} = $obj->{nv} = $sv->NV;
+ } else {
+ $obj->{type} = T_UNKNOWN;
+ }
}
return $obj;
}
@@ -238,13 +275,21 @@ sub B::Stackobj::Const::write_back {
sub B::Stackobj::Const::load_int {
my $obj = shift;
- $obj->{iv} = int($obj->{sv}->PV);
+ if (ref($obj->{sv}) eq "B::RV"){
+ $obj->{iv} = int($obj->{sv}->RV->PV);
+ }else{
+ $obj->{iv} = int($obj->{sv}->PV);
+ }
$obj->{flags} |= VALID_INT;
}
sub B::Stackobj::Const::load_double {
my $obj = shift;
- $obj->{nv} = $obj->{sv}->PV + 0.0;
+ if (ref($obj->{sv}) eq "B::RV"){
+ $obj->{nv} = $obj->{sv}->RV->PV + 0.0;
+ }else{
+ $obj->{nv} = $obj->{sv}->PV + 0.0;
+ }
$obj->{flags} |= VALID_DOUBLE;
}
diff --git a/contrib/perl5/ext/B/B/Stash.pm b/contrib/perl5/ext/B/B/Stash.pm
new file mode 100644
index 0000000..0a3543e
--- /dev/null
+++ b/contrib/perl5/ext/B/B/Stash.pm
@@ -0,0 +1,42 @@
+# Stash.pm -- show what stashes are loaded
+# vishalb@hotmail.com
+package B::Stash;
+
+BEGIN { %Seen = %INC }
+
+CHECK {
+ my @arr=scan($main::{"main::"});
+ @arr=map{s/\:\:$//;$_;} @arr;
+ print "-umain,-u", join (",-u",@arr) ,"\n";
+}
+sub scan{
+ my $start=shift;
+ my $prefix=shift;
+ $prefix = '' unless defined $prefix;
+ my @return;
+ foreach my $key ( keys %{$start}){
+# print $prefix,$key,"\n";
+ if ($key =~ /::$/){
+ unless ($start eq ${$start}{$key} or $key eq "B::" ){
+ push @return, $key unless omit($prefix.$key);
+ foreach my $subscan ( scan(${$start}{$key},$prefix.$key)){
+ push @return, "$key".$subscan;
+ }
+ }
+ }
+ }
+ return @return;
+}
+sub omit{
+ my $module = shift;
+ my %omit=("DynaLoader::" => 1 , "XSLoader::" => 1, "CORE::" => 1 ,
+ "CORE::GLOBAL::" => 1, "UNIVERSAL::" => 1 );
+ return 1 if $omit{$module};
+ if ($module eq "IO::" or $module eq "IO::Handle::"){
+ $module =~ s/::/\//g;
+ return 1 unless $INC{$module};
+ }
+
+ return 0;
+}
+1;
diff --git a/contrib/perl5/ext/B/B/Terse.pm b/contrib/perl5/ext/B/B/Terse.pm
index 93757f3..66b5cfc 100644
--- a/contrib/perl5/ext/B/B/Terse.pm
+++ b/contrib/perl5/ext/B/B/Terse.pm
@@ -17,6 +17,7 @@ sub terse {
sub compile {
my $order = shift;
my @options = @_;
+ B::clearsym();
if (@options) {
return sub {
my $objname;
@@ -53,10 +54,9 @@ sub B::SVOP::terse {
$op->sv->terse(0);
}
-sub B::GVOP::terse {
+sub B::PADOP::terse {
my ($op, $level) = @_;
- print indent($level), peekop($op), " ";
- $op->gv->terse(0);
+ print indent($level), peekop($op), " ", $op->padix, "\n";
}
sub B::PMOP::terse {
@@ -78,7 +78,7 @@ sub B::COP::terse {
if ($label) {
$label = " label ".cstring($label);
}
- print indent($level), peekop($op), $label, "\n";
+ print indent($level), peekop($op), $label || "", "\n";
}
sub B::PV::terse {
diff --git a/contrib/perl5/ext/B/B/Xref.pm b/contrib/perl5/ext/B/B/Xref.pm
index 0102856..b4078b8 100644
--- a/contrib/perl5/ext/B/B/Xref.pm
+++ b/contrib/perl5/ext/B/B/Xref.pm
@@ -85,11 +85,10 @@ Malcolm Beattie, mbeattie@sable.ox.ac.uk.
=cut
use strict;
-use B qw(peekop class comppadlist main_start svref_2object walksymtable);
-
-# Constants (should probably be elsewhere)
-sub OPpLVAL_INTRO () { 128 }
-sub SVf_POK () { 0x40000 }
+use Config;
+use B qw(peekop class comppadlist main_start svref_2object walksymtable
+ OPpLVAL_INTRO SVf_POK
+ );
sub UNKNOWN { ["?", "?", "?"] }
@@ -135,17 +134,28 @@ sub process {
sub load_pad {
my $padlist = shift;
- my ($namelistav, @namelist, $ix);
+ my ($namelistav, $vallistav, @namelist, $ix);
@pad = ();
return if class($padlist) eq "SPECIAL";
- ($namelistav) = $padlist->ARRAY;
+ ($namelistav,$vallistav) = $padlist->ARRAY;
@namelist = $namelistav->ARRAY;
for ($ix = 1; $ix < @namelist; $ix++) {
my $namesv = $namelist[$ix];
next if class($namesv) eq "SPECIAL";
- my ($type, $name) = $namesv->PV =~ /^(.)(.*)$/;
+ my ($type, $name) = $namesv->PV =~ /^(.)([^\0]*)(\0.*)?$/;
$pad[$ix] = ["(lexical)", $type, $name];
}
+ if ($Config{useithreads}) {
+ my (@vallist);
+ @vallist = $vallistav->ARRAY;
+ for ($ix = 1; $ix < @vallist; $ix++) {
+ my $valsv = $vallist[$ix];
+ next unless class($valsv) eq "GV";
+ # these pad GVs don't have corresponding names, so same @pad
+ # array can be used without collisions
+ $pad[$ix] = [$valsv->STASH->NAME, "*", $valsv->NAME];
+ }
+ }
}
sub xref {
@@ -155,28 +165,24 @@ sub xref {
last if $done{$$op}++;
warn sprintf("top = [%s, %s, %s]\n", @$top) if $debug_top;
warn peekop($op), "\n" if $debug_op;
- my $ppname = $op->ppaddr;
- if ($ppname =~ /^pp_(or|and|mapwhile|grepwhile)$/) {
+ my $opname = $op->name;
+ if ($opname =~ /^(or|and|mapwhile|grepwhile|range|cond_expr)$/) {
xref($op->other);
- } elsif ($ppname eq "pp_match" || $ppname eq "pp_subst") {
+ } elsif ($opname eq "match" || $opname eq "subst") {
xref($op->pmreplstart);
- } elsif ($ppname eq "pp_substcont") {
+ } elsif ($opname eq "substcont") {
xref($op->other->pmreplstart);
$op = $op->other;
redo;
- } elsif ($ppname eq "pp_cond_expr") {
- # pp_cond_expr never returns op_next
- xref($op->true);
- $op = $op->false;
- redo;
- } elsif ($ppname eq "pp_enterloop") {
+ } elsif ($opname eq "enterloop") {
xref($op->redoop);
xref($op->nextop);
xref($op->lastop);
- } elsif ($ppname eq "pp_subst") {
+ } elsif ($opname eq "subst") {
xref($op->pmreplstart);
} else {
no strict 'refs';
+ my $ppname = "pp_$opname";
&$ppname($op) if defined(&$ppname);
}
}
@@ -207,7 +213,7 @@ sub xref_main {
sub pp_nextstate {
my $op = shift;
- $file = $op->filegv->SV->PV;
+ $file = $op->file;
$line = $op->line;
$top = UNKNOWN;
}
@@ -235,23 +241,45 @@ sub pp_rv2gv { deref($top, "*"); }
sub pp_gvsv {
my $op = shift;
- my $gv = $op->gv;
- $top = [$gv->STASH->NAME, '$', $gv->NAME];
+ my $gv;
+ if ($Config{useithreads}) {
+ $top = $pad[$op->padix];
+ $top = UNKNOWN unless $top;
+ $top->[1] = '$';
+ }
+ else {
+ $gv = $op->gv;
+ $top = [$gv->STASH->NAME, '$', $gv->NAME];
+ }
process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
}
sub pp_gv {
my $op = shift;
- my $gv = $op->gv;
- $top = [$gv->STASH->NAME, "*", $gv->NAME];
+ my $gv;
+ if ($Config{useithreads}) {
+ $top = $pad[$op->padix];
+ $top = UNKNOWN unless $top;
+ $top->[1] = '*';
+ }
+ else {
+ $gv = $op->gv;
+ $top = [$gv->STASH->NAME, "*", $gv->NAME];
+ }
process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
}
sub pp_const {
my $op = shift;
my $sv = $op->sv;
- $top = ["?", "",
- (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK) ? $sv->PV : "?"];
+ # constant could be in the pad (under useithreads)
+ if ($$sv) {
+ $top = ["?", "",
+ (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK) ? $sv->PV : "?"];
+ }
+ else {
+ $top = $pad[$op->targ];
+ }
}
sub pp_method {
@@ -278,7 +306,7 @@ sub B::GV::xref {
my $cv = $gv->CV;
if ($$cv) {
#return if $done{$$cv}++;
- $file = $gv->FILEGV->SV->PV;
+ $file = $gv->FILE;
$line = $gv->LINE;
process([$gv->STASH->NAME, "&", $gv->NAME], "subdef");
push(@todo, $cv);
@@ -286,7 +314,7 @@ sub B::GV::xref {
my $form = $gv->FORM;
if ($$form) {
return if $done{$$form}++;
- $file = $gv->FILEGV->SV->PV;
+ $file = $gv->FILE;
$line = $gv->LINE;
process([$gv->STASH->NAME, "", $gv->NAME], "formdef");
}
@@ -296,7 +324,7 @@ sub xref_definitions {
my ($pack, %exclude);
return if $nodefs;
$subname = "(definitions)";
- foreach $pack (qw(B O AutoLoader DynaLoader Config DB VMS
+ foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS
strict vars FileHandle Exporter Carp)) {
$exclude{$pack."::"} = 1;
}
diff --git a/contrib/perl5/ext/B/Makefile.PL b/contrib/perl5/ext/B/Makefile.PL
index 80e5e1b..cb9696b 100644
--- a/contrib/perl5/ext/B/Makefile.PL
+++ b/contrib/perl5/ext/B/Makefile.PL
@@ -16,31 +16,21 @@ if ($^O eq 'MSWin32') {
WriteMakefile(
NAME => "B",
VERSION => "a5",
- MAN3PODS => {},
+ PL_FILES => { 'defsubs_h.PL' => 'defsubs.h' },
+ MAN3PODS => {},
clean => {
- FILES => "perl$e byteperl$e *$o B.c *~"
+ FILES => "perl$e *$o B.c defsubs.h *~"
}
-);
+);
-sub MY::post_constants {
- "\nLIBS = $Config{libs}\n"
-}
+package MY;
-# Leave out doing byteperl for now. Probably should be built in the
-# core directory or somewhere else rather than here
-#sub MY::top_targets {
-# my $self = shift;
-# my $targets = $self->MM::top_targets();
-# $targets =~ s/^(all ::.*)$/$1 byteperl$e/m;
-# return <<"EOT" . $targets;
+sub post_constants {
+ "\nLIBS = $Config::Config{libs}\n"
+}
-#
-# byteperl is *not* a standard perl+XSUB executable. It's a special
-# program for running standalone bytecode executables. It isn't an XSUB
-# at the moment because a standlone Perl program needs to set up curpad
-# which is overwritten on exit from an XSUB.
-#
-#byteperl$e : byteperl$o B$o \$(PERL_SRC)/byterun$o
-# \$(CC) ${exeout_flag}byteperl$e byteperl$o B$o byterun$o \$(LDFLAGS) \$(PERL_ARCHLIB)/CORE/$Config{libperl} \$(LIBS)
-#EOT
-#}
+sub postamble {
+'
+B$(OBJ_EXT) : defsubs.h
+'
+}
diff --git a/contrib/perl5/ext/B/NOTES b/contrib/perl5/ext/B/NOTES
index ee10ba0..89d03ba 100644
--- a/contrib/perl5/ext/B/NOTES
+++ b/contrib/perl5/ext/B/NOTES
@@ -161,8 +161,8 @@ O module
it should return a sub ref (usually a closure) to perform the
actual compilation. When O regains control, it ensures that the
"-c" option is forced (so that the program being compiled doesn't
- end up running) and registers an END block to call back the sub ref
+ end up running) and registers a CHECK block to call back the sub ref
returned from the backend's compile(). Perl then continues by
parsing prog.pl (just as it would with "perl -c prog.pl") and after
- doing so, assuming there are no parse-time errors, the END block
+ doing so, assuming there are no parse-time errors, the CHECK block
of O gets called and the actual backend compilation happens. Phew.
diff --git a/contrib/perl5/ext/B/O.pm b/contrib/perl5/ext/B/O.pm
index ad391a3..352f8d4 100644
--- a/contrib/perl5/ext/B/O.pm
+++ b/contrib/perl5/ext/B/O.pm
@@ -11,7 +11,7 @@ sub import {
my $compilesub = &{"B::${backend}::compile"}(@options);
if (ref($compilesub) eq "CODE") {
minus_c;
- eval 'END { &$compilesub() }';
+ eval 'CHECK { &$compilesub() }';
} else {
die $compilesub;
}
@@ -59,7 +59,7 @@ C<B::Backend> module and calls the C<compile> function in that
package, passing it OPTIONS. That function is expected to return
a sub reference which we'll call CALLBACK. Next, the "compile-only"
flag is switched on (equivalent to the command-line option C<-c>)
-and an END block is registered which calls CALLBACK. Thus the main
+and a CHECK block is registered which calls CALLBACK. Thus the main
Perl program mentioned on the command-line is read in, parsed and
compiled into internal syntax tree form. Since the C<-c> flag is
set, the program does not start running (excepting BEGIN blocks of
diff --git a/contrib/perl5/ext/B/defsubs_h.PL b/contrib/perl5/ext/B/defsubs_h.PL
new file mode 100644
index 0000000..80ef936
--- /dev/null
+++ b/contrib/perl5/ext/B/defsubs_h.PL
@@ -0,0 +1,35 @@
+# Do not remove the following line; MakeMaker relies on it to identify
+# this file as a template for defsubs.h
+# Extracting defsubs.h (with variable substitutions)
+#!perl
+my ($out) = __FILE__ =~ /(^.*)\.PL/i;
+$out =~ s/_h$/.h/;
+open(OUT,">$out") || die "Cannot open $file:$!";
+print "Extracting $out...\n";
+foreach my $const (qw(AVf_REAL
+ HEf_SVKEY
+ SVf_IOK SVf_IVisUV SVf_NOK SVf_POK
+ SVf_ROK SVp_IOK SVp_POK ))
+ {
+ doconst($const);
+ }
+foreach my $file (qw(op.h cop.h))
+ {
+ open(OPH,"../../$file") || die "Cannot open ../../$file:$!";
+ while (<OPH>)
+ {
+ doconst($1) if (/#define\s+(\w+)\s+([\(\)\|\dx]+)\s*(?:$|\/\*)/);
+ }
+ close(OPH);
+ }
+close(OUT);
+
+sub doconst
+{
+ my $sym = shift;
+ my $l = length($sym);
+ print OUT <<"END";
+ newCONSTSUB(stash,"$sym",newSViv($sym));
+ av_push(export_ok,newSVpvn("$sym",$l));
+END
+}
diff --git a/contrib/perl5/ext/B/ramblings/flip-flop b/contrib/perl5/ext/B/ramblings/flip-flop
index 183d541..e0cb8ff 100644
--- a/contrib/perl5/ext/B/ramblings/flip-flop
+++ b/contrib/perl5/ext/B/ramblings/flip-flop
@@ -1,21 +1,24 @@
PP(pp_range)
{
if (GIMME == G_ARRAY)
- return cCONDOP->op_true;
- return SvTRUEx(PAD_SV(op->op_targ)) ? cCONDOP->op_false : cCONDOP->op_true;
+ return NORMAL;
+ if (SvTRUEx(PAD_SV(PL_op->op_targ)))
+ return cLOGOP->op_other;
+ else
+ return NORMAL;
}
-pp_range is a CONDOP.
-In array context, it just returns op_true.
+pp_range is a LOGOP.
+In array context, it just returns op_next.
In scalar context it checks the truth of targ and returns
-op_false if true, op_true if false.
+op_other if true, op_next if false.
flip is an UNOP.
-It "looks after" its child which is always a pp_range CONDOP.
-In array context, it just returns the child's op_false.
+It "looks after" its child which is always a pp_range LOGOP.
+In array context, it just returns the child's op_other.
In scalar context, there are three possible outcomes:
(1) set child's targ to 1, our targ to 1 and return op_next.
- (2) set child's targ to 1, our targ to 0, sp-- and return child's op_false.
+ (2) set child's targ to 1, our targ to 0, sp-- and return child's op_other.
(3) Blank targ and TOPs and return op_next.
Case 1 happens for a "..." with a matching lineno... or true TOPs.
Case 2 happens for a ".." with a matching lineno... or true TOPs.
@@ -37,14 +40,14 @@ Case 3 happens for a non-matching lineno or false TOPs.
/* range */
if (SvTRUE(curpad[op->op_targ]))
- goto label(op_false);
-/* op_true */
+ goto label(op_other);
+/* op_next */
...
/* flip */
-/* For "..." returns op_next. For ".." returns op_next or op_first->op_false */
+/* For "..." returns op_next. For ".." returns op_next or op_first->op_other */
/* end of basic block */
goto out;
-label(range op_false):
+label(range op_other):
...
/* flop */
out:
diff --git a/contrib/perl5/ext/B/ramblings/runtime.porting b/contrib/perl5/ext/B/ramblings/runtime.porting
index 4699b25..d58b011 100644
--- a/contrib/perl5/ext/B/ramblings/runtime.porting
+++ b/contrib/perl5/ext/B/ramblings/runtime.porting
@@ -33,8 +33,10 @@ glob 5 2 do_readline
readline 8 2 do_readline
rcatline 8 2
regcmaybe 8 1
+regcreset 8 1
regcomp 8 9 pregcomp
match 8 10
+qr 8 1
subst 8 10
substcont 8 7
trans 7 4 do_trans
@@ -170,6 +172,7 @@ orassign 7 3 modifies flow of control
method 8 5
entersub 10 7
leavesub 10 5
+leavesublv
caller 2 8
warn 9 3
die 9 3
@@ -212,6 +215,7 @@ leavewrite 4 5
prtf 4 4 do_sprintf
print 8 6
sysopen 8 2
+sysseek 8 2
sysread 8 4
syswrite 8 4 pp_send
send 8 4
@@ -347,4 +351,7 @@ sgrent
egrent
getlogin
syscall
- \ No newline at end of file
+lock 6 1
+threadsv 6 2 unused if not USE_THREADS
+setstate 1 1 currently unused anywhere
+method_named 10 2
diff --git a/contrib/perl5/ext/B/typemap b/contrib/perl5/ext/B/typemap
index 7206a6a..bafba1c 100644
--- a/contrib/perl5/ext/B/typemap
+++ b/contrib/perl5/ext/B/typemap
@@ -4,11 +4,10 @@ B::OP T_OP_OBJ
B::UNOP T_OP_OBJ
B::BINOP T_OP_OBJ
B::LOGOP T_OP_OBJ
-B::CONDOP T_OP_OBJ
B::LISTOP T_OP_OBJ
B::PMOP T_OP_OBJ
B::SVOP T_OP_OBJ
-B::GVOP T_OP_OBJ
+B::PADOP T_OP_OBJ
B::PVOP T_OP_OBJ
B::CVOP T_OP_OBJ
B::LOOP T_OP_OBJ
@@ -31,12 +30,13 @@ B::IO T_SV_OBJ
B::MAGIC T_MG_OBJ
SSize_t T_IV
STRLEN T_IV
+PADOFFSET T_UV
INPUT
T_OP_OBJ
if (SvROK($arg)) {
IV tmp = SvIV((SV*)SvRV($arg));
- $var = ($type) tmp;
+ $var = INT2PTR($type,tmp);
}
else
croak(\"$var is not a reference\")
@@ -44,7 +44,7 @@ T_OP_OBJ
T_SV_OBJ
if (SvROK($arg)) {
IV tmp = SvIV((SV*)SvRV($arg));
- $var = ($type) tmp;
+ $var = INT2PTR($type,tmp);
}
else
croak(\"$var is not a reference\")
@@ -52,18 +52,18 @@ T_SV_OBJ
T_MG_OBJ
if (SvROK($arg)) {
IV tmp = SvIV((SV*)SvRV($arg));
- $var = ($type) tmp;
+ $var = INT2PTR($type,tmp);
}
else
croak(\"$var is not a reference\")
OUTPUT
T_OP_OBJ
- sv_setiv(newSVrv($arg, cc_opclassname((OP*)$var)), (IV)$var);
+ sv_setiv(newSVrv($arg, cc_opclassname(aTHX_ (OP*)$var)), PTR2IV($var));
T_SV_OBJ
- make_sv_object(($arg), (SV*)($var));
+ make_sv_object(aTHX_ ($arg), (SV*)($var));
T_MG_OBJ
- sv_setiv(newSVrv($arg, "B::MAGIC"), (IV)$var);
+ sv_setiv(newSVrv($arg, "B::MAGIC"), PTR2IV($var));
diff --git a/contrib/perl5/ext/ByteLoader/ByteLoader.pm b/contrib/perl5/ext/ByteLoader/ByteLoader.pm
new file mode 100644
index 0000000..286d746
--- /dev/null
+++ b/contrib/perl5/ext/ByteLoader/ByteLoader.pm
@@ -0,0 +1,40 @@
+package ByteLoader;
+
+use XSLoader ();
+
+$VERSION = 0.03;
+
+XSLoader::load 'ByteLoader', $VERSION;
+
+# Preloaded methods go here.
+
+1;
+__END__
+
+=head1 NAME
+
+ByteLoader - load byte compiled perl code
+
+=head1 SYNOPSIS
+
+ use ByteLoader 0.03;
+ <byte code>
+
+ use ByteLoader 0.03;
+ <byte code>
+
+=head1 DESCRIPTION
+
+This module is used to load byte compiled perl code. It uses the source
+filter mechanism to read the byte code and insert it into the compiled
+code at the appropriate point.
+
+=head1 AUTHOR
+
+Tom Hughes <tom@compton.nu> based on the ideas of Tim Bunce and others.
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
diff --git a/contrib/perl5/ext/ByteLoader/ByteLoader.xs b/contrib/perl5/ext/ByteLoader/ByteLoader.xs
new file mode 100644
index 0000000..7c3746b
--- /dev/null
+++ b/contrib/perl5/ext/ByteLoader/ByteLoader.xs
@@ -0,0 +1,79 @@
+#define PERL_NO_GET_CONTEXT
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include "byterun.h"
+
+static int
+xgetc(PerlIO *io)
+{
+ dTHX;
+ return PerlIO_getc(io);
+}
+
+static int
+xfread(char *buf, size_t size, size_t n, PerlIO *io)
+{
+ dTHX;
+ int i = PerlIO_read(io, buf, n * size);
+ if (i > 0)
+ i /= size;
+ return i;
+}
+
+static void
+freadpv(U32 len, void *data, XPV *pv)
+{
+ dTHX;
+ New(666, pv->xpv_pv, len, char);
+ PerlIO_read((PerlIO*)data, (void*)pv->xpv_pv, len);
+ pv->xpv_len = len;
+ pv->xpv_cur = len - 1;
+}
+
+static I32
+byteloader_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
+{
+ dTHR;
+ OP *saveroot = PL_main_root;
+ OP *savestart = PL_main_start;
+ struct bytestream bs;
+
+ bs.data = PL_rsfp;
+ bs.pfgetc = (int(*) (void*))xgetc;
+ bs.pfread = (int(*) (char*,size_t,size_t,void*))xfread;
+ bs.pfreadpv = freadpv;
+
+ byterun(aTHXo_ bs);
+
+ if (PL_in_eval) {
+ OP *o;
+
+ PL_eval_start = PL_main_start;
+
+ o = newSVOP(OP_CONST, 0, newSViv(1));
+ PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o);
+ PL_main_root->op_next = o;
+ PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root);
+ o->op_next = PL_eval_root;
+
+ PL_main_root = saveroot;
+ PL_main_start = savestart;
+ }
+
+ return 0;
+}
+
+MODULE = ByteLoader PACKAGE = ByteLoader
+
+PROTOTYPES: ENABLE
+
+void
+import(...)
+ PPCODE:
+ filter_add(byteloader_filter, NULL);
+
+void
+unimport(...)
+ PPCODE:
+ filter_del(byteloader_filter);
diff --git a/contrib/perl5/ext/ByteLoader/Makefile.PL b/contrib/perl5/ext/ByteLoader/Makefile.PL
new file mode 100644
index 0000000..c3cfcc7
--- /dev/null
+++ b/contrib/perl5/ext/ByteLoader/Makefile.PL
@@ -0,0 +1,9 @@
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+ NAME => 'ByteLoader',
+ VERSION_FROM => 'ByteLoader.pm',
+ XSPROTOARG => '-noprototypes',
+ MAN3PODS => {}, # Pods will be built by installman.
+ OBJECT => 'byterun$(OBJ_EXT) ByteLoader$(OBJ_EXT)',
+);
diff --git a/contrib/perl5/ext/ByteLoader/bytecode.h b/contrib/perl5/ext/ByteLoader/bytecode.h
new file mode 100644
index 0000000..1621fed
--- /dev/null
+++ b/contrib/perl5/ext/ByteLoader/bytecode.h
@@ -0,0 +1,161 @@
+typedef char *pvcontents;
+typedef char *strconst;
+typedef U32 PV;
+typedef char *op_tr_array;
+typedef int comment_t;
+typedef SV *svindex;
+typedef OP *opindex;
+typedef IV IV64;
+
+#define BGET_FREAD(argp, len, nelem) \
+ bs.pfread((char*)(argp),(len),(nelem),bs.data)
+#define BGET_FGETC() bs.pfgetc(bs.data)
+
+#define BGET_U32(arg) \
+ BGET_FREAD(&arg, sizeof(U32), 1); arg = PerlSock_ntohl((U32)arg)
+#define BGET_I32(arg) \
+ BGET_FREAD(&arg, sizeof(I32), 1); arg = (I32)PerlSock_ntohl((U32)arg)
+#define BGET_U16(arg) \
+ BGET_FREAD(&arg, sizeof(U16), 1); arg = PerlSock_ntohs((U16)arg)
+#define BGET_U8(arg) arg = BGET_FGETC()
+
+#define BGET_PV(arg) STMT_START { \
+ BGET_U32(arg); \
+ if (arg) \
+ bs.pfreadpv(arg, bs.data, &bytecode_pv); \
+ else { \
+ bytecode_pv.xpv_pv = 0; \
+ bytecode_pv.xpv_len = 0; \
+ bytecode_pv.xpv_cur = 0; \
+ } \
+ } STMT_END
+
+#ifdef BYTELOADER_LOG_COMMENTS
+# define BGET_comment_t(arg) \
+ STMT_START { \
+ char buf[1024]; \
+ int i = 0; \
+ do { \
+ arg = BGET_FGETC(); \
+ buf[i++] = (char)arg; \
+ } while (arg != '\n' && arg != EOF); \
+ buf[i] = '\0'; \
+ PerlIO_printf(PerlIO_stderr(), "%s", buf); \
+ } STMT_END
+#else
+# define BGET_comment_t(arg) \
+ do { arg = BGET_FGETC(); } while (arg != '\n' && arg != EOF)
+#endif
+
+/*
+ * In the following, sizeof(IV)*4 is just a way of encoding 32 on 64-bit-IV
+ * machines such that 32-bit machine compilers don't whine about the shift
+ * count being too high even though the code is never reached there.
+ */
+#define BGET_IV64(arg) STMT_START { \
+ U32 hi, lo; \
+ BGET_U32(hi); \
+ BGET_U32(lo); \
+ if (sizeof(IV) == 8) \
+ arg = ((IV)hi << (sizeof(IV)*4) | (IV)lo); \
+ else if (((I32)hi == -1 && (I32)lo < 0) \
+ || ((I32)hi == 0 && (I32)lo >= 0)) { \
+ arg = (I32)lo; \
+ } \
+ else { \
+ bytecode_iv_overflows++; \
+ arg = 0; \
+ } \
+ } STMT_END
+
+#define BGET_op_tr_array(arg) do { \
+ unsigned short *ary; \
+ int i; \
+ New(666, ary, 256, unsigned short); \
+ BGET_FREAD(ary, 256, 2); \
+ for (i = 0; i < 256; i++) \
+ ary[i] = PerlSock_ntohs(ary[i]); \
+ arg = (char *) ary; \
+ } while (0)
+
+#define BGET_pvcontents(arg) arg = bytecode_pv.xpv_pv
+#define BGET_strconst(arg) STMT_START { \
+ for (arg = PL_tokenbuf; (*arg = BGET_FGETC()); arg++) /* nothing */; \
+ arg = PL_tokenbuf; \
+ } STMT_END
+
+#define BGET_NV(arg) STMT_START { \
+ char *str; \
+ BGET_strconst(str); \
+ arg = Atof(str); \
+ } STMT_END
+
+#define BGET_objindex(arg, type) STMT_START { \
+ U32 ix; \
+ BGET_U32(ix); \
+ arg = (type)bytecode_obj_list[ix]; \
+ } STMT_END
+#define BGET_svindex(arg) BGET_objindex(arg, svindex)
+#define BGET_opindex(arg) BGET_objindex(arg, opindex)
+
+#define BSET_ldspecsv(sv, arg) sv = specialsv_list[arg]
+
+#define BSET_sv_refcnt_add(svrefcnt, arg) svrefcnt += arg
+#define BSET_gp_refcnt_add(gprefcnt, arg) gprefcnt += arg
+#define BSET_gp_share(sv, arg) STMT_START { \
+ gp_free((GV*)sv); \
+ GvGP(sv) = GvGP(arg); \
+ } STMT_END
+
+#define BSET_gv_fetchpv(sv, arg) sv = (SV*)gv_fetchpv(arg, TRUE, SVt_PV)
+#define BSET_gv_stashpv(sv, arg) sv = (SV*)gv_stashpv(arg, TRUE)
+#define BSET_sv_magic(sv, arg) sv_magic(sv, Nullsv, arg, 0, 0)
+#define BSET_mg_pv(mg, arg) mg->mg_ptr = arg; mg->mg_len = bytecode_pv.xpv_cur
+#define BSET_sv_upgrade(sv, arg) (void)SvUPGRADE(sv, arg)
+#define BSET_xpv(sv) do { \
+ SvPV_set(sv, bytecode_pv.xpv_pv); \
+ SvCUR_set(sv, bytecode_pv.xpv_cur); \
+ SvLEN_set(sv, bytecode_pv.xpv_len); \
+ } while (0)
+#define BSET_av_extend(sv, arg) av_extend((AV*)sv, arg)
+
+#define BSET_av_push(sv, arg) av_push((AV*)sv, arg)
+#define BSET_hv_store(sv, arg) \
+ hv_store((HV*)sv, bytecode_pv.xpv_pv, bytecode_pv.xpv_cur, arg, 0)
+#define BSET_pv_free(pv) Safefree(pv.xpv_pv)
+#define BSET_pregcomp(o, arg) \
+ ((PMOP*)o)->op_pmregexp = arg ? \
+ CALLREGCOMP(aTHX_ arg, arg + bytecode_pv.xpv_cur, ((PMOP*)o)) : 0
+#define BSET_newsv(sv, arg) sv = NEWSV(666,0); SvUPGRADE(sv, arg)
+#define BSET_newop(o, arg) ((o = (OP*)safemalloc(optype_size[arg])), \
+ memzero((char*)o,optype_size[arg]))
+#define BSET_newopn(o, arg) STMT_START { \
+ OP *oldop = o; \
+ BSET_newop(o, arg); \
+ oldop->op_next = o; \
+ } STMT_END
+
+#define BSET_ret(foo) return
+
+/*
+ * Kludge special-case workaround for OP_MAPSTART
+ * which needs the ppaddr for OP_GREPSTART. Blech.
+ */
+#define BSET_op_type(o, arg) STMT_START { \
+ o->op_type = arg; \
+ if (arg == OP_MAPSTART) \
+ arg = OP_GREPSTART; \
+ o->op_ppaddr = PL_ppaddr[arg]; \
+ } STMT_END
+#define BSET_op_ppaddr(o, arg) Perl_croak(aTHX_ "op_ppaddr not yet implemented")
+#define BSET_curpad(pad, arg) STMT_START { \
+ PL_comppad = (AV *)arg; \
+ pad = AvARRAY(arg); \
+ } STMT_END
+#define BSET_cop_file(cop, arg) CopFILE_set(cop,arg)
+#define BSET_cop_line(cop, arg) CopLINE_set(cop,arg)
+#define BSET_cop_stashpv(cop, arg) CopSTASHPV_set(cop,arg)
+
+#define BSET_OBJ_STORE(obj, ix) \
+ (I32)ix > bytecode_obj_list_fill ? \
+ bset_obj_store(aTHXo_ obj, (I32)ix) : (bytecode_obj_list[ix] = obj)
diff --git a/contrib/perl5/ext/ByteLoader/byterun.c b/contrib/perl5/ext/ByteLoader/byterun.c
new file mode 100644
index 0000000..a1044ab
--- /dev/null
+++ b/contrib/perl5/ext/ByteLoader/byterun.c
@@ -0,0 +1,899 @@
+/*
+ * Copyright (c) 1996-1999 Malcolm Beattie
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+/*
+ * This file is autogenerated from bytecode.pl. Changes made here will be lost.
+ */
+
+#define PERL_NO_GET_CONTEXT
+#include "EXTERN.h"
+#include "perl.h"
+#define NO_XSLOCKS
+#include "XSUB.h"
+
+#ifdef PERL_OBJECT
+#undef CALL_FPTR
+#define CALL_FPTR(fptr) (pPerl->*fptr)
+#undef PL_ppaddr
+#define PL_ppaddr (*get_ppaddr())
+#endif
+
+#include "byterun.h"
+#include "bytecode.h"
+
+
+static int optype_size[] = {
+ sizeof(OP),
+ sizeof(UNOP),
+ sizeof(BINOP),
+ sizeof(LOGOP),
+ sizeof(LISTOP),
+ sizeof(PMOP),
+ sizeof(SVOP),
+ sizeof(PADOP),
+ sizeof(PVOP),
+ sizeof(LOOP),
+ sizeof(COP)
+};
+
+static SV *specialsv_list[4];
+
+static int bytecode_iv_overflows = 0;
+static SV *bytecode_sv;
+static XPV bytecode_pv;
+static void **bytecode_obj_list;
+static I32 bytecode_obj_list_fill = -1;
+
+void *
+bset_obj_store(pTHXo_ void *obj, I32 ix)
+{
+ if (ix > bytecode_obj_list_fill) {
+ if (bytecode_obj_list_fill == -1)
+ New(666, bytecode_obj_list, ix + 1, void*);
+ else
+ Renew(bytecode_obj_list, ix + 1, void*);
+ bytecode_obj_list_fill = ix;
+ }
+ bytecode_obj_list[ix] = obj;
+ return obj;
+}
+
+void
+byterun(pTHXo_ struct bytestream bs)
+{
+ dTHR;
+ int insn;
+
+ specialsv_list[0] = Nullsv;
+ specialsv_list[1] = &PL_sv_undef;
+ specialsv_list[2] = &PL_sv_yes;
+ specialsv_list[3] = &PL_sv_no;
+
+ while ((insn = BGET_FGETC()) != EOF) {
+ switch (insn) {
+ case INSN_COMMENT: /* 35 */
+ {
+ comment_t arg;
+ BGET_comment_t(arg);
+ arg = arg;
+ break;
+ }
+ case INSN_NOP: /* 10 */
+ {
+ break;
+ }
+ case INSN_RET: /* 0 */
+ {
+ BSET_ret(none);
+ break;
+ }
+ case INSN_LDSV: /* 1 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ bytecode_sv = arg;
+ break;
+ }
+ case INSN_LDOP: /* 2 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ PL_op = arg;
+ break;
+ }
+ case INSN_STSV: /* 3 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ BSET_OBJ_STORE(bytecode_sv, arg);
+ break;
+ }
+ case INSN_STOP: /* 4 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ BSET_OBJ_STORE(PL_op, arg);
+ break;
+ }
+ case INSN_LDSPECSV: /* 5 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ BSET_ldspecsv(bytecode_sv, arg);
+ break;
+ }
+ case INSN_NEWSV: /* 6 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ BSET_newsv(bytecode_sv, arg);
+ break;
+ }
+ case INSN_NEWOP: /* 7 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ BSET_newop(PL_op, arg);
+ break;
+ }
+ case INSN_NEWOPN: /* 8 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ BSET_newopn(PL_op, arg);
+ break;
+ }
+ case INSN_NEWPV: /* 9 */
+ {
+ PV arg;
+ BGET_PV(arg);
+ break;
+ }
+ case INSN_PV_CUR: /* 11 */
+ {
+ STRLEN arg;
+ BGET_U32(arg);
+ bytecode_pv.xpv_cur = arg;
+ break;
+ }
+ case INSN_PV_FREE: /* 12 */
+ {
+ BSET_pv_free(bytecode_pv);
+ break;
+ }
+ case INSN_SV_UPGRADE: /* 13 */
+ {
+ char arg;
+ BGET_U8(arg);
+ BSET_sv_upgrade(bytecode_sv, arg);
+ break;
+ }
+ case INSN_SV_REFCNT: /* 14 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ SvREFCNT(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_SV_REFCNT_ADD: /* 15 */
+ {
+ I32 arg;
+ BGET_I32(arg);
+ BSET_sv_refcnt_add(SvREFCNT(bytecode_sv), arg);
+ break;
+ }
+ case INSN_SV_FLAGS: /* 16 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ SvFLAGS(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XRV: /* 17 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ SvRV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XPV: /* 18 */
+ {
+ BSET_xpv(bytecode_sv);
+ break;
+ }
+ case INSN_XIV32: /* 19 */
+ {
+ I32 arg;
+ BGET_I32(arg);
+ SvIVX(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIV64: /* 20 */
+ {
+ IV64 arg;
+ BGET_IV64(arg);
+ SvIVX(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XNV: /* 21 */
+ {
+ NV arg;
+ BGET_NV(arg);
+ SvNVX(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XLV_TARGOFF: /* 22 */
+ {
+ STRLEN arg;
+ BGET_U32(arg);
+ LvTARGOFF(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XLV_TARGLEN: /* 23 */
+ {
+ STRLEN arg;
+ BGET_U32(arg);
+ LvTARGLEN(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XLV_TARG: /* 24 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ LvTARG(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XLV_TYPE: /* 25 */
+ {
+ char arg;
+ BGET_U8(arg);
+ LvTYPE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XBM_USEFUL: /* 26 */
+ {
+ I32 arg;
+ BGET_I32(arg);
+ BmUSEFUL(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XBM_PREVIOUS: /* 27 */
+ {
+ U16 arg;
+ BGET_U16(arg);
+ BmPREVIOUS(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XBM_RARE: /* 28 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ BmRARE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XFM_LINES: /* 29 */
+ {
+ I32 arg;
+ BGET_I32(arg);
+ FmLINES(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_LINES: /* 30 */
+ {
+ long arg;
+ BGET_I32(arg);
+ IoLINES(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_PAGE: /* 31 */
+ {
+ long arg;
+ BGET_I32(arg);
+ IoPAGE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_PAGE_LEN: /* 32 */
+ {
+ long arg;
+ BGET_I32(arg);
+ IoPAGE_LEN(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_LINES_LEFT: /* 33 */
+ {
+ long arg;
+ BGET_I32(arg);
+ IoLINES_LEFT(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_TOP_NAME: /* 34 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ IoTOP_NAME(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_TOP_GV: /* 36 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&IoTOP_GV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_FMT_NAME: /* 37 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ IoFMT_NAME(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_FMT_GV: /* 38 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&IoFMT_GV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_BOTTOM_NAME: /* 39 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ IoBOTTOM_NAME(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_BOTTOM_GV: /* 40 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&IoBOTTOM_GV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_SUBPROCESS: /* 41 */
+ {
+ short arg;
+ BGET_U16(arg);
+ IoSUBPROCESS(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_TYPE: /* 42 */
+ {
+ char arg;
+ BGET_U8(arg);
+ IoTYPE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XIO_FLAGS: /* 43 */
+ {
+ char arg;
+ BGET_U8(arg);
+ IoFLAGS(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_STASH: /* 44 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&CvSTASH(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_START: /* 45 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ CvSTART(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_ROOT: /* 46 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ CvROOT(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_GV: /* 47 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&CvGV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_FILE: /* 48 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ CvFILE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_DEPTH: /* 49 */
+ {
+ long arg;
+ BGET_I32(arg);
+ CvDEPTH(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_PADLIST: /* 50 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&CvPADLIST(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_OUTSIDE: /* 51 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&CvOUTSIDE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XCV_FLAGS: /* 52 */
+ {
+ U16 arg;
+ BGET_U16(arg);
+ CvFLAGS(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_AV_EXTEND: /* 53 */
+ {
+ SSize_t arg;
+ BGET_I32(arg);
+ BSET_av_extend(bytecode_sv, arg);
+ break;
+ }
+ case INSN_AV_PUSH: /* 54 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ BSET_av_push(bytecode_sv, arg);
+ break;
+ }
+ case INSN_XAV_FILL: /* 55 */
+ {
+ SSize_t arg;
+ BGET_I32(arg);
+ AvFILLp(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XAV_MAX: /* 56 */
+ {
+ SSize_t arg;
+ BGET_I32(arg);
+ AvMAX(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XAV_FLAGS: /* 57 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ AvFLAGS(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XHV_RITER: /* 58 */
+ {
+ I32 arg;
+ BGET_I32(arg);
+ HvRITER(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_XHV_NAME: /* 59 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ HvNAME(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_HV_STORE: /* 60 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ BSET_hv_store(bytecode_sv, arg);
+ break;
+ }
+ case INSN_SV_MAGIC: /* 61 */
+ {
+ char arg;
+ BGET_U8(arg);
+ BSET_sv_magic(bytecode_sv, arg);
+ break;
+ }
+ case INSN_MG_OBJ: /* 62 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ SvMAGIC(bytecode_sv)->mg_obj = arg;
+ break;
+ }
+ case INSN_MG_PRIVATE: /* 63 */
+ {
+ U16 arg;
+ BGET_U16(arg);
+ SvMAGIC(bytecode_sv)->mg_private = arg;
+ break;
+ }
+ case INSN_MG_FLAGS: /* 64 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ SvMAGIC(bytecode_sv)->mg_flags = arg;
+ break;
+ }
+ case INSN_MG_PV: /* 65 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ BSET_mg_pv(SvMAGIC(bytecode_sv), arg);
+ break;
+ }
+ case INSN_XMG_STASH: /* 66 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&SvSTASH(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GV_FETCHPV: /* 67 */
+ {
+ strconst arg;
+ BGET_strconst(arg);
+ BSET_gv_fetchpv(bytecode_sv, arg);
+ break;
+ }
+ case INSN_GV_STASHPV: /* 68 */
+ {
+ strconst arg;
+ BGET_strconst(arg);
+ BSET_gv_stashpv(bytecode_sv, arg);
+ break;
+ }
+ case INSN_GP_SV: /* 69 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ GvSV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_REFCNT: /* 70 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ GvREFCNT(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_REFCNT_ADD: /* 71 */
+ {
+ I32 arg;
+ BGET_I32(arg);
+ BSET_gp_refcnt_add(GvREFCNT(bytecode_sv), arg);
+ break;
+ }
+ case INSN_GP_AV: /* 72 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&GvAV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_HV: /* 73 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&GvHV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_CV: /* 74 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&GvCV(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_FILE: /* 75 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ GvFILE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_IO: /* 76 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&GvIOp(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_FORM: /* 77 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&GvFORM(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_CVGEN: /* 78 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ GvCVGEN(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_LINE: /* 79 */
+ {
+ line_t arg;
+ BGET_U16(arg);
+ GvLINE(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_GP_SHARE: /* 80 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ BSET_gp_share(bytecode_sv, arg);
+ break;
+ }
+ case INSN_XGV_FLAGS: /* 81 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ GvFLAGS(bytecode_sv) = arg;
+ break;
+ }
+ case INSN_OP_NEXT: /* 82 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ PL_op->op_next = arg;
+ break;
+ }
+ case INSN_OP_SIBLING: /* 83 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ PL_op->op_sibling = arg;
+ break;
+ }
+ case INSN_OP_PPADDR: /* 84 */
+ {
+ strconst arg;
+ BGET_strconst(arg);
+ BSET_op_ppaddr(PL_op->op_ppaddr, arg);
+ break;
+ }
+ case INSN_OP_TARG: /* 85 */
+ {
+ PADOFFSET arg;
+ BGET_U32(arg);
+ PL_op->op_targ = arg;
+ break;
+ }
+ case INSN_OP_TYPE: /* 86 */
+ {
+ OPCODE arg;
+ BGET_U16(arg);
+ BSET_op_type(PL_op, arg);
+ break;
+ }
+ case INSN_OP_SEQ: /* 87 */
+ {
+ U16 arg;
+ BGET_U16(arg);
+ PL_op->op_seq = arg;
+ break;
+ }
+ case INSN_OP_FLAGS: /* 88 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ PL_op->op_flags = arg;
+ break;
+ }
+ case INSN_OP_PRIVATE: /* 89 */
+ {
+ U8 arg;
+ BGET_U8(arg);
+ PL_op->op_private = arg;
+ break;
+ }
+ case INSN_OP_FIRST: /* 90 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cUNOP->op_first = arg;
+ break;
+ }
+ case INSN_OP_LAST: /* 91 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cBINOP->op_last = arg;
+ break;
+ }
+ case INSN_OP_OTHER: /* 92 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cLOGOP->op_other = arg;
+ break;
+ }
+ case INSN_OP_CHILDREN: /* 93 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ cLISTOP->op_children = arg;
+ break;
+ }
+ case INSN_OP_PMREPLROOT: /* 94 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cPMOP->op_pmreplroot = arg;
+ break;
+ }
+ case INSN_OP_PMREPLROOTGV: /* 95 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ *(SV**)&cPMOP->op_pmreplroot = arg;
+ break;
+ }
+ case INSN_OP_PMREPLSTART: /* 96 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cPMOP->op_pmreplstart = arg;
+ break;
+ }
+ case INSN_OP_PMNEXT: /* 97 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ *(OP**)&cPMOP->op_pmnext = arg;
+ break;
+ }
+ case INSN_PREGCOMP: /* 98 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ BSET_pregcomp(PL_op, arg);
+ break;
+ }
+ case INSN_OP_PMFLAGS: /* 99 */
+ {
+ U16 arg;
+ BGET_U16(arg);
+ cPMOP->op_pmflags = arg;
+ break;
+ }
+ case INSN_OP_PMPERMFLAGS: /* 100 */
+ {
+ U16 arg;
+ BGET_U16(arg);
+ cPMOP->op_pmpermflags = arg;
+ break;
+ }
+ case INSN_OP_SV: /* 101 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ cSVOP->op_sv = arg;
+ break;
+ }
+ case INSN_OP_PADIX: /* 102 */
+ {
+ PADOFFSET arg;
+ BGET_U32(arg);
+ cPADOP->op_padix = arg;
+ break;
+ }
+ case INSN_OP_PV: /* 103 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ cPVOP->op_pv = arg;
+ break;
+ }
+ case INSN_OP_PV_TR: /* 104 */
+ {
+ op_tr_array arg;
+ BGET_op_tr_array(arg);
+ cPVOP->op_pv = arg;
+ break;
+ }
+ case INSN_OP_REDOOP: /* 105 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cLOOP->op_redoop = arg;
+ break;
+ }
+ case INSN_OP_NEXTOP: /* 106 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cLOOP->op_nextop = arg;
+ break;
+ }
+ case INSN_OP_LASTOP: /* 107 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ cLOOP->op_lastop = arg;
+ break;
+ }
+ case INSN_COP_LABEL: /* 108 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ cCOP->cop_label = arg;
+ break;
+ }
+ case INSN_COP_STASHPV: /* 109 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ BSET_cop_stashpv(cCOP, arg);
+ break;
+ }
+ case INSN_COP_FILE: /* 110 */
+ {
+ pvcontents arg;
+ BGET_pvcontents(arg);
+ BSET_cop_file(cCOP, arg);
+ break;
+ }
+ case INSN_COP_SEQ: /* 111 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ cCOP->cop_seq = arg;
+ break;
+ }
+ case INSN_COP_ARYBASE: /* 112 */
+ {
+ I32 arg;
+ BGET_I32(arg);
+ cCOP->cop_arybase = arg;
+ break;
+ }
+ case INSN_COP_LINE: /* 113 */
+ {
+ line_t arg;
+ BGET_U16(arg);
+ BSET_cop_line(cCOP, arg);
+ break;
+ }
+ case INSN_COP_WARNINGS: /* 114 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ cCOP->cop_warnings = arg;
+ break;
+ }
+ case INSN_MAIN_START: /* 115 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ PL_main_start = arg;
+ break;
+ }
+ case INSN_MAIN_ROOT: /* 116 */
+ {
+ opindex arg;
+ BGET_opindex(arg);
+ PL_main_root = arg;
+ break;
+ }
+ case INSN_CURPAD: /* 117 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ BSET_curpad(PL_curpad, arg);
+ break;
+ }
+ default:
+ Perl_croak(aTHX_ "Illegal bytecode instruction %d\n", insn);
+ /* NOTREACHED */
+ }
+ }
+}
diff --git a/contrib/perl5/ext/ByteLoader/byterun.h b/contrib/perl5/ext/ByteLoader/byterun.h
new file mode 100644
index 0000000..f0de6b4
--- /dev/null
+++ b/contrib/perl5/ext/ByteLoader/byterun.h
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1996-1999 Malcolm Beattie
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+/*
+ * This file is autogenerated from bytecode.pl. Changes made here will be lost.
+ */
+struct bytestream {
+ void *data;
+ int (*pfgetc)(void *);
+ int (*pfread)(char *, size_t, size_t, void *);
+ void (*pfreadpv)(U32, void *, XPV *);
+};
+
+enum {
+ INSN_RET, /* 0 */
+ INSN_LDSV, /* 1 */
+ INSN_LDOP, /* 2 */
+ INSN_STSV, /* 3 */
+ INSN_STOP, /* 4 */
+ INSN_LDSPECSV, /* 5 */
+ INSN_NEWSV, /* 6 */
+ INSN_NEWOP, /* 7 */
+ INSN_NEWOPN, /* 8 */
+ INSN_NEWPV, /* 9 */
+ INSN_NOP, /* 10 */
+ INSN_PV_CUR, /* 11 */
+ INSN_PV_FREE, /* 12 */
+ INSN_SV_UPGRADE, /* 13 */
+ INSN_SV_REFCNT, /* 14 */
+ INSN_SV_REFCNT_ADD, /* 15 */
+ INSN_SV_FLAGS, /* 16 */
+ INSN_XRV, /* 17 */
+ INSN_XPV, /* 18 */
+ INSN_XIV32, /* 19 */
+ INSN_XIV64, /* 20 */
+ INSN_XNV, /* 21 */
+ INSN_XLV_TARGOFF, /* 22 */
+ INSN_XLV_TARGLEN, /* 23 */
+ INSN_XLV_TARG, /* 24 */
+ INSN_XLV_TYPE, /* 25 */
+ INSN_XBM_USEFUL, /* 26 */
+ INSN_XBM_PREVIOUS, /* 27 */
+ INSN_XBM_RARE, /* 28 */
+ INSN_XFM_LINES, /* 29 */
+ INSN_XIO_LINES, /* 30 */
+ INSN_XIO_PAGE, /* 31 */
+ INSN_XIO_PAGE_LEN, /* 32 */
+ INSN_XIO_LINES_LEFT, /* 33 */
+ INSN_XIO_TOP_NAME, /* 34 */
+ INSN_COMMENT, /* 35 */
+ INSN_XIO_TOP_GV, /* 36 */
+ INSN_XIO_FMT_NAME, /* 37 */
+ INSN_XIO_FMT_GV, /* 38 */
+ INSN_XIO_BOTTOM_NAME, /* 39 */
+ INSN_XIO_BOTTOM_GV, /* 40 */
+ INSN_XIO_SUBPROCESS, /* 41 */
+ INSN_XIO_TYPE, /* 42 */
+ INSN_XIO_FLAGS, /* 43 */
+ INSN_XCV_STASH, /* 44 */
+ INSN_XCV_START, /* 45 */
+ INSN_XCV_ROOT, /* 46 */
+ INSN_XCV_GV, /* 47 */
+ INSN_XCV_FILE, /* 48 */
+ INSN_XCV_DEPTH, /* 49 */
+ INSN_XCV_PADLIST, /* 50 */
+ INSN_XCV_OUTSIDE, /* 51 */
+ INSN_XCV_FLAGS, /* 52 */
+ INSN_AV_EXTEND, /* 53 */
+ INSN_AV_PUSH, /* 54 */
+ INSN_XAV_FILL, /* 55 */
+ INSN_XAV_MAX, /* 56 */
+ INSN_XAV_FLAGS, /* 57 */
+ INSN_XHV_RITER, /* 58 */
+ INSN_XHV_NAME, /* 59 */
+ INSN_HV_STORE, /* 60 */
+ INSN_SV_MAGIC, /* 61 */
+ INSN_MG_OBJ, /* 62 */
+ INSN_MG_PRIVATE, /* 63 */
+ INSN_MG_FLAGS, /* 64 */
+ INSN_MG_PV, /* 65 */
+ INSN_XMG_STASH, /* 66 */
+ INSN_GV_FETCHPV, /* 67 */
+ INSN_GV_STASHPV, /* 68 */
+ INSN_GP_SV, /* 69 */
+ INSN_GP_REFCNT, /* 70 */
+ INSN_GP_REFCNT_ADD, /* 71 */
+ INSN_GP_AV, /* 72 */
+ INSN_GP_HV, /* 73 */
+ INSN_GP_CV, /* 74 */
+ INSN_GP_FILE, /* 75 */
+ INSN_GP_IO, /* 76 */
+ INSN_GP_FORM, /* 77 */
+ INSN_GP_CVGEN, /* 78 */
+ INSN_GP_LINE, /* 79 */
+ INSN_GP_SHARE, /* 80 */
+ INSN_XGV_FLAGS, /* 81 */
+ INSN_OP_NEXT, /* 82 */
+ INSN_OP_SIBLING, /* 83 */
+ INSN_OP_PPADDR, /* 84 */
+ INSN_OP_TARG, /* 85 */
+ INSN_OP_TYPE, /* 86 */
+ INSN_OP_SEQ, /* 87 */
+ INSN_OP_FLAGS, /* 88 */
+ INSN_OP_PRIVATE, /* 89 */
+ INSN_OP_FIRST, /* 90 */
+ INSN_OP_LAST, /* 91 */
+ INSN_OP_OTHER, /* 92 */
+ INSN_OP_CHILDREN, /* 93 */
+ INSN_OP_PMREPLROOT, /* 94 */
+ INSN_OP_PMREPLROOTGV, /* 95 */
+ INSN_OP_PMREPLSTART, /* 96 */
+ INSN_OP_PMNEXT, /* 97 */
+ INSN_PREGCOMP, /* 98 */
+ INSN_OP_PMFLAGS, /* 99 */
+ INSN_OP_PMPERMFLAGS, /* 100 */
+ INSN_OP_SV, /* 101 */
+ INSN_OP_PADIX, /* 102 */
+ INSN_OP_PV, /* 103 */
+ INSN_OP_PV_TR, /* 104 */
+ INSN_OP_REDOOP, /* 105 */
+ INSN_OP_NEXTOP, /* 106 */
+ INSN_OP_LASTOP, /* 107 */
+ INSN_COP_LABEL, /* 108 */
+ INSN_COP_STASHPV, /* 109 */
+ INSN_COP_FILE, /* 110 */
+ INSN_COP_SEQ, /* 111 */
+ INSN_COP_ARYBASE, /* 112 */
+ INSN_COP_LINE, /* 113 */
+ INSN_COP_WARNINGS, /* 114 */
+ INSN_MAIN_START, /* 115 */
+ INSN_MAIN_ROOT, /* 116 */
+ INSN_CURPAD, /* 117 */
+ MAX_INSN = 117
+};
+
+enum {
+ OPt_OP, /* 0 */
+ OPt_UNOP, /* 1 */
+ OPt_BINOP, /* 2 */
+ OPt_LOGOP, /* 3 */
+ OPt_LISTOP, /* 4 */
+ OPt_PMOP, /* 5 */
+ OPt_SVOP, /* 6 */
+ OPt_PADOP, /* 7 */
+ OPt_PVOP, /* 8 */
+ OPt_LOOP, /* 9 */
+ OPt_COP /* 10 */
+};
+
+extern void byterun(pTHXo_ struct bytestream bs);
+
+#define INIT_SPECIALSV_LIST STMT_START { \
+ PL_specialsv_list[0] = Nullsv; \
+ PL_specialsv_list[1] = &PL_sv_undef; \
+ PL_specialsv_list[2] = &PL_sv_yes; \
+ PL_specialsv_list[3] = &PL_sv_no; \
+ } STMT_END
diff --git a/contrib/perl5/ext/ByteLoader/hints/sunos.pl b/contrib/perl5/ext/ByteLoader/hints/sunos.pl
new file mode 100644
index 0000000..3faf498
--- /dev/null
+++ b/contrib/perl5/ext/ByteLoader/hints/sunos.pl
@@ -0,0 +1,2 @@
+$self->{CCFLAGS} = $Config{ccflags} . ' -DNEED_FGETC_PROTOTYPE -DNEED_FREAD_PROTOTYPE';
+
diff --git a/contrib/perl5/ext/DB_File/Changes b/contrib/perl5/ext/DB_File/Changes
index 2fab919..95eb487 100644
--- a/contrib/perl5/ext/DB_File/Changes
+++ b/contrib/perl5/ext/DB_File/Changes
@@ -230,5 +230,64 @@
* Updated the message that db-recno.t prints when tests 51, 53 or 55 fail.
1.65 6th March 1999
+
* Fixed a bug in the recno PUSH logic.
* The BOOT version check now needs 2.3.4 when using Berkeley DB version 2
+
+1.66 15th March 1999
+
+ * Added DBM Filter code
+
+1.67 6th June 1999
+
+ * Added DBM Filter documentation to DB_File.pm
+
+ * Fixed DBM Filter code to work with 5.004
+
+ * A few instances of newSVpvn were used in 1.66. This isn't available in
+ Perl 5.004_04 or earlier. Replaced with newSVpv.
+
+1.68 22nd July 1999
+
+ * Merged changes from 5.005_58
+
+ * Fixed a bug in R_IBEFORE & R_IAFTER procesing in Berkeley DB
+ 2 databases.
+
+ * Added some of the examples in the POD into the test harness.
+
+1.69 3rd August 1999
+
+ * fixed a bug in push -- DB_APPEND wasn't working properly.
+
+ * Fixed the R_SETCURSOR bug introduced in 1.68
+
+ * Added a new Perl variable $DB_File::db_ver
+
+1.70 4th August 1999
+
+ * Initialise $DB_File::db_ver and $DB_File::db_version with
+ GV_ADD|GV_ADDMULT -- bug spotted by Nick Ing-Simmons.
+
+ * Added a BOOT check to test for equivalent versions of db.h &
+ libdb.a/so.
+
+1.71 7th September 1999
+
+ * Fixed a bug that prevented 1.70 from compiling under win32
+
+ * Updated to support Berkeley DB 3.x
+
+ * Updated dbinfo for Berkeley DB 3.x file formats.
+
+1.72 16th January 2000
+
+ * Added hints/sco.pl
+
+ * The module will now use XSLoader when it is available. When it
+ isn't it will use DynaLoader.
+
+ * The locking section in DB_File.pm has been discredited. Many thanks
+ to David Harris for spotting the underlying problem, contributing
+ the updates to the documentation and writing DB_File::Lock (available
+ on CPAN).
diff --git a/contrib/perl5/ext/DB_File/DB_File.pm b/contrib/perl5/ext/DB_File/DB_File.pm
index e5759ff..00b24b9 100644
--- a/contrib/perl5/ext/DB_File/DB_File.pm
+++ b/contrib/perl5/ext/DB_File/DB_File.pm
@@ -1,10 +1,10 @@
# DB_File.pm -- Perl 5 interface to Berkeley DB
#
# written by Paul Marquess (Paul.Marquess@btinternet.com)
-# last modified 6th March 1999
-# version 1.65
+# last modified 16th January 2000
+# version 1.72
#
-# Copyright (c) 1995-9 Paul Marquess. All rights reserved.
+# Copyright (c) 1995-2000 Paul Marquess. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
@@ -141,11 +141,13 @@ sub TIEHASH
package DB_File ;
use strict;
-use vars qw($VERSION @ISA @EXPORT $AUTOLOAD $DB_BTREE $DB_HASH $DB_RECNO $db_version) ;
+use vars qw($VERSION @ISA @EXPORT $AUTOLOAD $DB_BTREE $DB_HASH $DB_RECNO
+ $db_version $use_XSLoader
+ ) ;
use Carp;
-$VERSION = "1.65" ;
+$VERSION = "1.72" ;
#typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;
$DB_BTREE = new DB_File::BTREEINFO ;
@@ -155,8 +157,18 @@ $DB_RECNO = new DB_File::RECNOINFO ;
require Tie::Hash;
require Exporter;
use AutoLoader;
-require DynaLoader;
-@ISA = qw(Tie::Hash Exporter DynaLoader);
+BEGIN {
+ $use_XSLoader = 1 ;
+ eval { require XSLoader } ;
+
+ if ($@) {
+ $use_XSLoader = 0 ;
+ require DynaLoader;
+ @ISA = qw(DynaLoader);
+ }
+}
+
+push @ISA, qw(Tie::Hash Exporter);
@EXPORT = qw(
$DB_BTREE $DB_HASH $DB_RECNO
@@ -196,7 +208,7 @@ sub AUTOLOAD {
($constname = $AUTOLOAD) =~ s/.*:://;
my $val = constant($constname, @_ ? $_[0] : 0);
if ($! != 0) {
- if ($! =~ /Invalid/) {
+ if ($! =~ /Invalid/ || $!{EINVAL}) {
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
@@ -219,19 +231,10 @@ eval {
push(@EXPORT, @O);
};
-## import borrowed from IO::File
-## exports Fcntl constants if available.
-#sub import {
-# my $pkg = shift;
-# my $callpkg = caller;
-# Exporter::export $pkg, $callpkg, @_;
-# eval {
-# require Fcntl;
-# Exporter::export 'Fcntl', $callpkg, '/^O_/';
-# };
-#}
-
-bootstrap DB_File $VERSION;
+if ($use_XSLoader)
+ { XSLoader::load("DB_File", $VERSION)}
+else
+ { bootstrap DB_File $VERSION }
# Preloaded methods go here. Autoload methods go after __END__, and are
# processed by the autosplit program.
@@ -408,6 +411,12 @@ DB_File - Perl5 access to Berkeley DB version 1.x
$a = $X->shift;
$X->unshift(list);
+ # DBM Filters
+ $old_filter = $db->filter_store_key ( sub { ... } ) ;
+ $old_filter = $db->filter_store_value( sub { ... } ) ;
+ $old_filter = $db->filter_fetch_key ( sub { ... } ) ;
+ $old_filter = $db->filter_fetch_value( sub { ... } ) ;
+
untie %hash ;
untie @array ;
@@ -415,10 +424,10 @@ DB_File - Perl5 access to Berkeley DB version 1.x
B<DB_File> is a module which allows Perl programs to make use of the
facilities provided by Berkeley DB version 1.x (if you have a newer
-version of DB, see L<Using DB_File with Berkeley DB version 2>). It is
-assumed that you have a copy of the Berkeley DB manual pages at hand
-when reading this documentation. The interface defined here mirrors the
-Berkeley DB interface closely.
+version of DB, see L<Using DB_File with Berkeley DB version 2 or 3>).
+It is assumed that you have a copy of the Berkeley DB manual pages at
+hand when reading this documentation. The interface defined here
+mirrors the Berkeley DB interface closely.
Berkeley DB is a C library which provides a consistent interface to a
number of database formats. B<DB_File> provides an interface to all
@@ -459,32 +468,28 @@ number.
=back
-=head2 Using DB_File with Berkeley DB version 2
+=head2 Using DB_File with Berkeley DB version 2 or 3
Although B<DB_File> is intended to be used with Berkeley DB version 1,
-it can also be used with version 2. In this case the interface is
+it can also be used with version 2.or 3 In this case the interface is
limited to the functionality provided by Berkeley DB 1.x. Anywhere the
-version 2 interface differs, B<DB_File> arranges for it to work like
-version 1. This feature allows B<DB_File> scripts that were built with
-version 1 to be migrated to version 2 without any changes.
+version 2 or 3 interface differs, B<DB_File> arranges for it to work
+like version 1. This feature allows B<DB_File> scripts that were built
+with version 1 to be migrated to version 2 or 3 without any changes.
If you want to make use of the new features available in Berkeley DB
-2.x, use the Perl module B<BerkeleyDB> instead.
-
-At the time of writing this document the B<BerkeleyDB> module is still
-alpha quality (the version number is < 1.0), and so unsuitable for use
-in any serious development work. Once its version number is >= 1.0, it
-is considered stable enough for real work.
+2.x or greater, use the Perl module B<BerkeleyDB> instead.
-B<Note:> The database file format has changed in Berkeley DB version 2.
-If you cannot recreate your databases, you must dump any existing
-databases with the C<db_dump185> utility that comes with Berkeley DB.
-Once you have rebuilt DB_File to use Berkeley DB version 2, your
+B<Note:> The database file format has changed in both Berkeley DB
+version 2 and 3. If you cannot recreate your databases, you must dump
+any existing databases with the C<db_dump185> utility that comes with
+Berkeley DB.
+Once you have rebuilt DB_File to use Berkeley DB version 2 or 3, your
databases can be recreated using C<db_load>. Refer to the Berkeley DB
documentation for further details.
-Please read L<"COPYRIGHT"> before using version 2.x of Berkeley DB with
-DB_File.
+Please read L<"COPYRIGHT"> before using version 2.x or 3.x of Berkeley
+DB with DB_File.
=head2 Interface to Berkeley DB
@@ -664,6 +669,7 @@ contents of the database.
use DB_File ;
use vars qw( %h $k $v ) ;
+ unlink "fruit" ;
tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0640, $DB_HASH
or die "Cannot open file 'fruit': $!\n";
@@ -723,6 +729,7 @@ insensitive compare function will be used.
# specify the Perl sub that will do the comparison
$DB_BTREE->{'compare'} = \&Compare ;
+ unlink "tree" ;
tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0640, $DB_BTREE
or die "Cannot open file 'tree': $!\n" ;
@@ -799,7 +806,7 @@ code:
# iterate through the associative array
# and print each key/value pair.
- foreach (keys %h)
+ foreach (sort keys %h)
{ print "$_ -> $h{$_}\n" }
untie %h ;
@@ -901,6 +908,19 @@ particular value occurred in the BTREE.
So assuming the database created above, we can use C<get_dup> like
this:
+ use strict ;
+ use DB_File ;
+
+ use vars qw($filename $x %h ) ;
+
+ $filename = "tree" ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
my $cnt = $x->get_dup("Wall") ;
print "Wall occurred $cnt times\n" ;
@@ -908,7 +928,7 @@ this:
print "Larry is there\n" if $hash{'Larry'} ;
print "There are $hash{'Brick'} Brick Walls\n" ;
- my @list = $x->get_dup("Wall") ;
+ my @list = sort $x->get_dup("Wall") ;
print "Wall => [@list]\n" ;
@list = $x->get_dup("Smith") ;
@@ -931,7 +951,7 @@ and it will print:
$status = $X->find_dup($key, $value) ;
-This method checks for the existance of a specific key/value pair. If the
+This method checks for the existence of a specific key/value pair. If the
pair exists, the cursor is left pointing to the pair and the method
returns 0. Otherwise the method returns a non-zero value.
@@ -961,7 +981,7 @@ Assuming the database from the previous example:
prints this
- Larry Wall is there
+ Larry Wall is there
Harry Wall is not there
@@ -973,7 +993,7 @@ This method deletes a specific key/value pair. It returns
0 if they exist and have been deleted successfully.
Otherwise the method returns a non-zero value.
-Again assuming the existance of the C<tree> database
+Again assuming the existence of the C<tree> database
use strict ;
use DB_File ;
@@ -1053,7 +1073,7 @@ and print the first matching key/value pair given a partial key.
$st == 0 ;
$st = $x->seq($key, $value, R_NEXT) )
- { print "$key -> $value\n" }
+ { print "$key -> $value\n" }
print "\nPARTIAL MATCH\n" ;
@@ -1126,8 +1146,11 @@ L<Extra RECNO Methods> for a workaround).
use strict ;
use DB_File ;
+ my $filename = "text" ;
+ unlink $filename ;
+
my @h ;
- tie @h, "DB_File", "text", O_RDWR|O_CREAT, 0640, $DB_RECNO
+ tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_RECNO
or die "Cannot open file 'text': $!\n" ;
# Add a few key/value pairs to the file
@@ -1160,7 +1183,7 @@ Here is the output from the script:
The array contains 5 entries
popped black
- unshifted white
+ shifted white
Element 1 Exists with value blue
The last element is green
The 2nd last element is yellow
@@ -1466,8 +1489,8 @@ R_CURSOR is the only valid flag at present.
Returns the file descriptor for the underlying database.
-See L<Locking Databases> for an example of how to make use of the
-C<fd> method to lock your database.
+See L<Locking: The Trouble with fd> for an explanation for why you should
+not use C<fd> to lock your database.
=item B<$status = $X-E<gt>seq($key, $value, $flags) ;>
@@ -1488,67 +1511,262 @@ R_RECNOSYNC is the only valid flag at present.
=back
-=head1 HINTS AND TIPS
+=head1 DBM FILTERS
+A DBM Filter is a piece of code that is be used when you I<always>
+want to make the same transformation to all keys and/or values in a
+DBM database.
-=head2 Locking Databases
+There are four methods associated with DBM Filters. All work identically,
+and each is used to install (or uninstall) a single DBM Filter. Each
+expects a single parameter, namely a reference to a sub. The only
+difference between them is the place that the filter is installed.
-Concurrent access of a read-write database by several parties requires
-them all to use some kind of locking. Here's an example of Tom's that
-uses the I<fd> method to get the file descriptor, and then a careful
-open() to give something Perl will flock() for you. Run this repeatedly
-in the background to watch the locks granted in proper order.
+To summarise:
- use DB_File;
+=over 5
- use strict;
+=item B<filter_store_key>
- sub LOCK_SH { 1 }
- sub LOCK_EX { 2 }
- sub LOCK_NB { 4 }
- sub LOCK_UN { 8 }
+If a filter has been installed with this method, it will be invoked
+every time you write a key to a DBM database.
- my($oldval, $fd, $db, %db, $value, $key);
+=item B<filter_store_value>
- $key = shift || 'default';
- $value = shift || 'magic';
+If a filter has been installed with this method, it will be invoked
+every time you write a value to a DBM database.
- $value .= " $$";
- $db = tie(%db, 'DB_File', '/tmp/foo.db', O_CREAT|O_RDWR, 0644)
- || die "dbcreat /tmp/foo.db $!";
- $fd = $db->fd;
- print "$$: db fd is $fd\n";
- open(DB_FH, "+<&=$fd") || die "dup $!";
+=item B<filter_fetch_key>
+If a filter has been installed with this method, it will be invoked
+every time you read a key from a DBM database.
- unless (flock (DB_FH, LOCK_SH | LOCK_NB)) {
- print "$$: CONTENTION; can't read during write update!
- Waiting for read lock ($!) ....";
- unless (flock (DB_FH, LOCK_SH)) { die "flock: $!" }
- }
- print "$$: Read lock granted\n";
+=item B<filter_fetch_value>
- $oldval = $db{$key};
- print "$$: Old value was $oldval\n";
- flock(DB_FH, LOCK_UN);
+If a filter has been installed with this method, it will be invoked
+every time you read a value from a DBM database.
- unless (flock (DB_FH, LOCK_EX | LOCK_NB)) {
- print "$$: CONTENTION; must have exclusive lock!
- Waiting for write lock ($!) ....";
- unless (flock (DB_FH, LOCK_EX)) { die "flock: $!" }
- }
+=back
- print "$$: Write lock granted\n";
- $db{$key} = $value;
- $db->sync; # to flush
- sleep 10;
+You can use any combination of the methods, from none, to all four.
+All filter methods return the existing filter, if present, or C<undef>
+in not.
+
+To delete a filter pass C<undef> to it.
+
+=head2 The Filter
+
+When each filter is called by Perl, a local copy of C<$_> will contain
+the key or value to be filtered. Filtering is achieved by modifying
+the contents of C<$_>. The return code from the filter is ignored.
+
+=head2 An Example -- the NULL termination problem.
+
+Consider the following scenario. You have a DBM database
+that you need to share with a third-party C application. The C application
+assumes that I<all> keys and values are NULL terminated. Unfortunately
+when Perl writes to DBM databases it doesn't use NULL termination, so
+your Perl application will have to manage NULL termination itself. When
+you write to the database you will have to use something like this:
+
+ $hash{"$key\0"} = "$value\0" ;
+
+Similarly the NULL needs to be taken into account when you are considering
+the length of existing keys/values.
+
+It would be much better if you could ignore the NULL terminations issue
+in the main application code and have a mechanism that automatically
+added the terminating NULL to all keys and values whenever you write to
+the database and have them removed when you read from the database. As I'm
+sure you have already guessed, this is a problem that DBM Filters can
+fix very easily.
+
+ use strict ;
+ use DB_File ;
+
+ my %hash ;
+ my $filename = "/tmp/filt" ;
+ unlink $filename ;
+
+ my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH
+ or die "Cannot open $filename: $!\n" ;
+
+ # Install DBM Filters
+ $db->filter_fetch_key ( sub { s/\0$// } ) ;
+ $db->filter_store_key ( sub { $_ .= "\0" } ) ;
+ $db->filter_fetch_value( sub { s/\0$// } ) ;
+ $db->filter_store_value( sub { $_ .= "\0" } ) ;
+
+ $hash{"abc"} = "def" ;
+ my $a = $hash{"ABC"} ;
+ # ...
+ undef $db ;
+ untie %hash ;
+
+Hopefully the contents of each of the filters should be
+self-explanatory. Both "fetch" filters remove the terminating NULL,
+and both "store" filters add a terminating NULL.
+
+
+=head2 Another Example -- Key is a C int.
+
+Here is another real-life example. By default, whenever Perl writes to
+a DBM database it always writes the key and value as strings. So when
+you use this:
+
+ $hash{12345} = "soemthing" ;
+
+the key 12345 will get stored in the DBM database as the 5 byte string
+"12345". If you actually want the key to be stored in the DBM database
+as a C int, you will have to use C<pack> when writing, and C<unpack>
+when reading.
+
+Here is a DBM Filter that does it:
+
+ use strict ;
+ use DB_File ;
+ my %hash ;
+ my $filename = "/tmp/filt" ;
+ unlink $filename ;
+
+
+ my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH
+ or die "Cannot open $filename: $!\n" ;
+
+ $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ;
+ $db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ;
+ $hash{123} = "def" ;
+ # ...
+ undef $db ;
+ untie %hash ;
+
+This time only two filters have been used -- we only need to manipulate
+the contents of the key, so it wasn't necessary to install any value
+filters.
+
+=head1 HINTS AND TIPS
+
+
+=head2 Locking: The Trouble with fd
+
+Until version 1.72 of this module, the recommended technique for locking
+B<DB_File> databases was to flock the filehandle returned from the "fd"
+function. Unfortunately this technique has been shown to be fundamentally
+flawed (Kudos to David Harris for tracking this down). Use it at your own
+peril!
+
+The locking technique went like this.
+
+ $db = tie(%db, 'DB_File', '/tmp/foo.db', O_CREAT|O_RDWR, 0644)
+ || die "dbcreat /tmp/foo.db $!";
+ $fd = $db->fd;
+ open(DB_FH, "+<&=$fd") || die "dup $!";
+ flock (DB_FH, LOCK_EX) || die "flock: $!";
+ ...
+ $db{"Tom"} = "Jerry" ;
+ ...
flock(DB_FH, LOCK_UN);
undef $db;
untie %db;
close(DB_FH);
- print "$$: Updated db to $key=$value\n";
+
+In simple terms, this is what happens:
+
+=over 5
+
+=item 1.
+
+Use "tie" to open the database.
+
+=item 2.
+
+Lock the database with fd & flock.
+
+=item 3.
+
+Read & Write to the database.
+
+=item 4.
+
+Unlock and close the database.
+
+=back
+
+Here is the crux of the problem. A side-effect of opening the B<DB_File>
+database in step 2 is that an initial block from the database will get
+read from disk and cached in memory.
+
+To see why this is a problem, consider what can happen when two processes,
+say "A" and "B", both want to update the same B<DB_File> database
+using the locking steps outlined above. Assume process "A" has already
+opened the database and has a write lock, but it hasn't actually updated
+the database yet (it has finished step 2, but not started step 3 yet). Now
+process "B" tries to open the same database - step 1 will succeed,
+but it will block on step 2 until process "A" releases the lock. The
+important thing to notice here is that at this point in time both
+processes will have cached identical initial blocks from the database.
+
+Now process "A" updates the database and happens to change some of the
+data held in the initial buffer. Process "A" terminates, flushing
+all cached data to disk and releasing the database lock. At this point
+the database on disk will correctly reflect the changes made by process
+"A".
+
+With the lock released, process "B" can now continue. It also updates the
+database and unfortunately it too modifies the data that was in its
+initial buffer. Once that data gets flushed to disk it will overwrite
+some/all of the changes process "A" made to the database.
+
+The result of this scenario is at best a database that doesn't contain
+what you expect. At worst the database will corrupt.
+
+The above won't happen every time competing process update the same
+B<DB_File> database, but it does illustrate why the technique should
+not be used.
+
+=head2 Safe ways to lock a database
+
+Starting with version 2.x, Berkeley DB has internal support for locking.
+The companion module to this one, B<BerkeleyDB>, provides an interface
+to this locking functionality. If you are serious about locking
+Berkeley DB databases, I strongly recommend using B<BerkeleyDB>.
+
+If using B<BerkeleyDB> isn't an option, there are a number of modules
+available on CPAN that can be used to implement locking. Each one
+implements locking differently and has different goals in mind. It is
+therefore worth knowing the difference, so that you can pick the right
+one for your application. Here are the three locking wrappers:
+
+=over 5
+
+=item B<Tie::DB_Lock>
+
+A B<DB_File> wrapper which creates copies of the database file for
+read access, so that you have a kind of a multiversioning concurrent read
+system. However, updates are still serial. Use for databases where reads
+may be lengthy and consistency problems may occur.
+
+=item B<Tie::DB_LockFile>
+
+A B<DB_File> wrapper that has the ability to lock and unlock the database
+while it is being used. Avoids the tie-before-flock problem by simply
+re-tie-ing the database when you get or drop a lock. Because of the
+flexibility in dropping and re-acquiring the lock in the middle of a
+session, this can be massaged into a system that will work with long
+updates and/or reads if the application follows the hints in the POD
+documentation.
+
+=item B<DB_File::Lock>
+
+An extremely lightweight B<DB_File> wrapper that simply flocks a lockfile
+before tie-ing the database and drops the lock after the untie. Allows
+one to use the same lockfile for multiple databases to avoid deadlock
+problems, if desired. Use for databases where updates are reads are
+quick and simple flock locking semantics are enough.
+
+=back
=head2 Sharing Databases With C Applications
@@ -1557,7 +1775,7 @@ shared by both a Perl and a C application.
The vast majority of problems that are reported in this area boil down
to the fact that C strings are NULL terminated, whilst Perl strings are
-not.
+not. See L<DBM FILTERS> for a generic way to work around this problem.
Here is a real example. Netscape 2.0 keeps a record of the locations you
visit along with the time you last visited them in a DB_HASH database.
@@ -1654,7 +1872,7 @@ C<%x>, and C<$X> above hold a reference to the object. The call to
untie() will destroy the first, but C<$X> still holds a valid
reference, so the destructor will not get called and the database file
F<tst.fil> will remain open. The fact that Berkeley DB then reports the
-attempt to open a database that is alreday open via the catch-all
+attempt to open a database that is already open via the catch-all
"Invalid argument" doesn't help.
If you run the script with the C<-w> flag the error message becomes:
@@ -1746,6 +1964,19 @@ double quotes, like this:
Although it might seem like a real pain, it is really worth the effort
of having a C<use strict> in all your scripts.
+=head1 REFERENCES
+
+Articles that are either about B<DB_File> or make use of it.
+
+=over 5
+
+=item 1.
+
+I<Full-Text Searching in Perl>, Tim Kientzle (tkientzle@ddj.com),
+Dr. Dobb's Journal, Issue 295, January 1999, pp 34-41
+
+=back
+
=head1 HISTORY
Moved to the Changes file.
@@ -1768,13 +1999,12 @@ date, so the most recent version can always be found on CPAN (see
L<perlmod/CPAN> for details), in the directory
F<modules/by-module/DB_File>.
-This version of B<DB_File> will work with either version 1.x or 2.x of
-Berkeley DB, but is limited to the functionality provided by version 1.
+This version of B<DB_File> will work with either version 1.x, 2.x or
+3.x of Berkeley DB, but is limited to the functionality provided by
+version 1.
-The official web site for Berkeley DB is
-F<http://www.sleepycat.com/db>. The ftp equivalent is
-F<ftp.sleepycat.com:/pub>. Both versions 1 and 2 of Berkeley DB are
-available there.
+The official web site for Berkeley DB is F<http://www.sleepycat.com>.
+All versions of Berkeley DB are available there.
Alternatively, Berkeley DB version 1 is available at your nearest CPAN
archive in F<src/misc/db.1.85.tar.gz>.
@@ -1785,7 +2015,7 @@ compile properly on IRIX 5.3.
=head1 COPYRIGHT
-Copyright (c) 1995-9 Paul Marquess. All rights reserved. This program
+Copyright (c) 1995-1999 Paul Marquess. All rights reserved. This program
is free software; you can redistribute it and/or modify it under the
same terms as Perl itself.
@@ -1794,7 +2024,7 @@ makes use of, namely Berkeley DB, is not. Berkeley DB has its own
copyright and its own license. Please take the time to read it.
Here are are few words taken from the Berkeley DB FAQ (at
-http://www.sleepycat.com) regarding the license:
+F<http://www.sleepycat.com>) regarding the license:
Do I have to license DB to use it in Perl scripts?
@@ -1811,7 +2041,8 @@ Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details.
=head1 SEE ALSO
-L<perl(1)>, L<dbopen(3)>, L<hash(3)>, L<recno(3)>, L<btree(3)>
+L<perl(1)>, L<dbopen(3)>, L<hash(3)>, L<recno(3)>, L<btree(3)>,
+L<dbmfilter>
=head1 AUTHOR
diff --git a/contrib/perl5/ext/DB_File/DB_File.xs b/contrib/perl5/ext/DB_File/DB_File.xs
index 94113eb..2b76bab 100644
--- a/contrib/perl5/ext/DB_File/DB_File.xs
+++ b/contrib/perl5/ext/DB_File/DB_File.xs
@@ -3,12 +3,12 @@
DB_File.xs -- Perl 5 interface to Berkeley DB
written by Paul Marquess <Paul.Marquess@btinternet.com>
- last modified 6th March 1999
- version 1.65
+ last modified 16th January 2000
+ version 1.72
All comments/suggestions/problems are welcome
- Copyright (c) 1995-9 Paul Marquess. All rights reserved.
+ Copyright (c) 1995-2000 Paul Marquess. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
@@ -65,8 +65,23 @@
to fix a flag mapping problem with O_RDONLY on the Hurd
1.65 - Fixed a bug in the PUSH logic.
Added BOOT check that using 2.3.4 or greater
-
-
+ 1.66 - Added DBM filter code
+ 1.67 - Backed off the use of newSVpvn.
+ Fixed DBM Filter code for Perl 5.004.
+ Fixed a small memory leak in the filter code.
+ 1.68 - fixed backward compatability bug with R_IAFTER & R_IBEFORE
+ merged in the 5.005_58 changes
+ 1.69 - fixed a bug in push -- DB_APPEND wasn't working properly.
+ Fixed the R_SETCURSOR bug introduced in 1.68
+ Added a new Perl variable $DB_File::db_ver
+ 1.70 - Initialise $DB_File::db_ver and $DB_File::db_version with
+ GV_ADD|GV_ADDMULT -- bug spotted by Nick Ing-Simmons.
+ Added a BOOT check to test for equivalent versions of db.h &
+ libdb.a/so.
+ 1.71 - Support for Berkeley DB version 3.
+ Support for Berkeley DB 2/3's backward compatability mode.
+ Rewrote push
+ 1.72 - No change to DB_File.xs
*/
@@ -75,10 +90,10 @@
#include "XSUB.h"
#ifndef PERL_VERSION
-#include "patchlevel.h"
-#define PERL_REVISION 5
-#define PERL_VERSION PATCHLEVEL
-#define PERL_SUBVERSION SUBVERSION
+# include "patchlevel.h"
+# define PERL_REVISION 5
+# define PERL_VERSION PATCHLEVEL
+# define PERL_SUBVERSION SUBVERSION
#endif
#if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75 ))
@@ -88,6 +103,11 @@
#endif
+/* DEFSV appears first in 5.004_56 */
+#ifndef DEFSV
+# define DEFSV GvSV(defgv)
+#endif
+
/* Being the Berkeley DB we prefer the <sys/cdefs.h> (which will be
* shortly #included by the <db.h>) __attribute__ to the possibly
* already defined __attribute__, for example by GNUC or by Perl. */
@@ -98,33 +118,65 @@
be defined here. This clashes with a field name in db.h, so get rid of it.
*/
#ifdef op
-#undef op
+# undef op
+#endif
+
+#ifdef COMPAT185
+# include <db_185.h>
+#else
+# include <db.h>
+#endif
+
+#ifndef pTHX
+# define pTHX
+# define pTHX_
+# define aTHX
+# define aTHX_
+#endif
+
+#ifndef newSVpvn
+# define newSVpvn(a,b) newSVpv(a,b)
#endif
-#include <db.h>
#include <fcntl.h>
/* #define TRACE */
+#define DBM_FILTERING
+
+#ifdef TRACE
+# define Trace(x) printf x
+#else
+# define Trace(x)
+#endif
+#define DBT_clear(x) Zero(&x, 1, DBT) ;
#ifdef DB_VERSION_MAJOR
+#if DB_VERSION_MAJOR == 2
+# define BERKELEY_DB_1_OR_2
+#endif
+
/* map version 2 features & constants onto their version 1 equivalent */
#ifdef DB_Prefix_t
-#undef DB_Prefix_t
+# undef DB_Prefix_t
#endif
#define DB_Prefix_t size_t
#ifdef DB_Hash_t
-#undef DB_Hash_t
+# undef DB_Hash_t
#endif
#define DB_Hash_t u_int32_t
/* DBTYPE stays the same */
/* HASHINFO, RECNOINFO and BTREEINFO map to DB_INFO */
-typedef DB_INFO INFO ;
+#if DB_VERSION_MAJOR == 2
+ typedef DB_INFO INFO ;
+#else /* DB_VERSION_MAJOR > 2 */
+# define DB_FIXEDLEN (0x8000)
+#endif /* DB_VERSION_MAJOR == 2 */
/* version 2 has db_recno_t in place of recno_t */
typedef db_recno_t recno_t;
@@ -138,11 +190,18 @@ typedef db_recno_t recno_t;
#define R_NEXT DB_NEXT
#define R_NOOVERWRITE DB_NOOVERWRITE
#define R_PREV DB_PREV
-#define R_SETCURSOR 0
+
+#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5
+# define R_SETCURSOR 0x800000
+#else
+# define R_SETCURSOR (-100)
+#endif
+
#define R_RECNOSYNC 0
#define R_FIXEDLEN DB_FIXEDLEN
#define R_DUP DB_DUP
+
#define db_HA_hash h_hash
#define db_HA_ffactor h_ffactor
#define db_HA_nelem h_nelem
@@ -177,13 +236,15 @@ typedef db_recno_t recno_t;
#define DB_flags(x, v) x |= v
#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5
-#define flagSet(flags, bitmask) ((flags) & (bitmask))
+# define flagSet(flags, bitmask) ((flags) & (bitmask))
#else
-#define flagSet(flags, bitmask) (((flags) & DB_OPFLAGS_MASK) == (bitmask))
+# define flagSet(flags, bitmask) (((flags) & DB_OPFLAGS_MASK) == (bitmask))
#endif
#else /* db version 1.x */
+#define BERKELEY_DB_1_OR_2
+
typedef union INFO {
HASHINFO hash ;
RECNOINFO recno ;
@@ -192,17 +253,17 @@ typedef union INFO {
#ifdef mDB_Prefix_t
-#ifdef DB_Prefix_t
-#undef DB_Prefix_t
-#endif
-#define DB_Prefix_t mDB_Prefix_t
+# ifdef DB_Prefix_t
+# undef DB_Prefix_t
+# endif
+# define DB_Prefix_t mDB_Prefix_t
#endif
#ifdef mDB_Hash_t
-#ifdef DB_Hash_t
-#undef DB_Hash_t
-#endif
-#define DB_Hash_t mDB_Hash_t
+# ifdef DB_Hash_t
+# undef DB_Hash_t
+# endif
+# define DB_Hash_t mDB_Hash_t
#endif
#define db_HA_hash hash.hash
@@ -248,20 +309,21 @@ typedef union INFO {
#define db_get(db, key, value, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, flags)
#ifdef DB_VERSION_MAJOR
-#define db_DESTROY(db) ((db->dbp)->close)(db->dbp, 0)
+#define db_DESTROY(db) ( db->cursor->c_close(db->cursor),\
+ (db->dbp->close)(db->dbp, 0) )
#define db_close(db) ((db->dbp)->close)(db->dbp, 0)
#define db_del(db, key, flags) (flagSet(flags, R_CURSOR) \
? ((db->cursor)->c_del)(db->cursor, 0) \
: ((db->dbp)->del)(db->dbp, NULL, &key, flags) )
-#else
+#else /* ! DB_VERSION_MAJOR */
#define db_DESTROY(db) ((db->dbp)->close)(db->dbp)
#define db_close(db) ((db->dbp)->close)(db->dbp)
#define db_del(db, key, flags) ((db->dbp)->del)(db->dbp, &key, flags)
#define db_put(db, key, value, flags) ((db->dbp)->put)(db->dbp, &key, &value, flags)
-#endif
+#endif /* ! DB_VERSION_MAJOR */
#define db_seq(db, key, value, flags) do_SEQ(db, key, value, flags)
@@ -273,32 +335,70 @@ typedef struct {
SV * prefix ;
SV * hash ;
int in_memory ;
+#ifdef BERKELEY_DB_1_OR_2
INFO info ;
+#endif
#ifdef DB_VERSION_MAJOR
DBC * cursor ;
#endif
+#ifdef DBM_FILTERING
+ SV * filter_fetch_key ;
+ SV * filter_store_key ;
+ SV * filter_fetch_value ;
+ SV * filter_store_value ;
+ int filtering ;
+#endif /* DBM_FILTERING */
+
} DB_File_type;
typedef DB_File_type * DB_File ;
typedef DBT DBTKEY ;
+#ifdef DBM_FILTERING
+
+#define ckFilter(arg,type,name) \
+ if (db->type) { \
+ SV * save_defsv ; \
+ /* printf("filtering %s\n", name) ;*/ \
+ if (db->filtering) \
+ croak("recursion detected in %s", name) ; \
+ db->filtering = TRUE ; \
+ save_defsv = newSVsv(DEFSV) ; \
+ sv_setsv(DEFSV, arg) ; \
+ PUSHMARK(sp) ; \
+ (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
+ sv_setsv(arg, DEFSV) ; \
+ sv_setsv(DEFSV, save_defsv) ; \
+ SvREFCNT_dec(save_defsv) ; \
+ db->filtering = FALSE ; \
+ /*printf("end of filtering %s\n", name) ;*/ \
+ }
+
+#else
+
+#define ckFilter(arg,type, name)
+
+#endif /* DBM_FILTERING */
+
#define my_sv_setpvn(sv, d, s) sv_setpvn(sv, (s ? d : (void*)""), s)
-#define OutputValue(arg, name) \
- { if (RETVAL == 0) { \
- my_sv_setpvn(arg, name.data, name.size) ; \
- } \
+#define OutputValue(arg, name) \
+ { if (RETVAL == 0) { \
+ my_sv_setpvn(arg, name.data, name.size) ; \
+ ckFilter(arg, filter_fetch_value,"filter_fetch_value") ; \
+ } \
}
-#define OutputKey(arg, name) \
- { if (RETVAL == 0) \
- { \
- if (db->type != DB_RECNO) { \
- my_sv_setpvn(arg, name.data, name.size); \
- } \
- else \
- sv_setiv(arg, (I32)*(I32*)name.data - 1); \
- } \
+#define OutputKey(arg, name) \
+ { if (RETVAL == 0) \
+ { \
+ if (db->type != DB_RECNO) { \
+ my_sv_setpvn(arg, name.data, name.size); \
+ } \
+ else \
+ sv_setiv(arg, (I32)*(I32*)name.data - 1); \
+ ckFilter(arg, filter_fetch_key,"filter_fetch_key") ; \
+ } \
}
@@ -311,26 +411,57 @@ static DBTKEY empty ;
#ifdef DB_VERSION_MAJOR
static int
+#ifdef CAN_PROTOTYPE
+db_put(DB_File db, DBTKEY key, DBT value, u_int flags)
+#else
db_put(db, key, value, flags)
DB_File db ;
DBTKEY key ;
DBT value ;
u_int flags ;
-
+#endif
{
int status ;
- if (flagSet(flags, R_CURSOR)) {
- status = ((db->cursor)->c_del)(db->cursor, 0);
- if (status != 0)
- return status ;
-
-#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5
- flags &= ~R_CURSOR ;
+ if (flagSet(flags, R_IAFTER) || flagSet(flags, R_IBEFORE)) {
+ DBC * temp_cursor ;
+ DBT l_key, l_value;
+
+#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6
+ if (((db->dbp)->cursor)(db->dbp, NULL, &temp_cursor) != 0)
#else
- flags &= ~DB_OPFLAGS_MASK ;
+ if (((db->dbp)->cursor)(db->dbp, NULL, &temp_cursor, 0) != 0)
#endif
+ return (-1) ;
+
+ memset(&l_key, 0, sizeof(l_key));
+ l_key.data = key.data;
+ l_key.size = key.size;
+ memset(&l_value, 0, sizeof(l_value));
+ l_value.data = value.data;
+ l_value.size = value.size;
+
+ if ( temp_cursor->c_get(temp_cursor, &l_key, &l_value, DB_SET) != 0) {
+ (void)temp_cursor->c_close(temp_cursor);
+ return (-1);
+ }
+ status = temp_cursor->c_put(temp_cursor, &key, &value, flags);
+ (void)temp_cursor->c_close(temp_cursor);
+
+ return (status) ;
+ }
+
+
+ if (flagSet(flags, R_CURSOR)) {
+ return ((db->cursor)->c_put)(db->cursor, &key, &value, DB_CURRENT);
+ }
+
+ if (flagSet(flags, R_SETCURSOR)) {
+ if ((db->dbp)->put(db->dbp, NULL, &key, &value, 0) != 0)
+ return -1 ;
+ return ((db->cursor)->c_get)(db->cursor, &key, &value, DB_SET_RANGE);
+
}
return ((db->dbp)->put)(db->dbp, NULL, &key, &value, flags) ;
@@ -339,42 +470,19 @@ u_int flags ;
#endif /* DB_VERSION_MAJOR */
-static void
-GetVersionInfo()
-{
- SV * ver_sv = perl_get_sv("DB_File::db_version", TRUE) ;
-#ifdef DB_VERSION_MAJOR
- int Major, Minor, Patch ;
-
- (void)db_version(&Major, &Minor, &Patch) ;
-
- /* check that libdb is recent enough -- we need 2.3.4 or greater */
- if (Major == 2 && (Minor < 3 || (Minor == 3 && Patch < 4)))
- croak("DB_File needs Berkeley DB 2.3.4 or greater, you have %d.%d.%d\n",
- Major, Minor, Patch) ;
-
-#if PERL_VERSION > 3
- sv_setpvf(ver_sv, "%d.%d", Major, Minor) ;
-#else
- {
- char buffer[40] ;
- sprintf(buffer, "%d.%d", Major, Minor) ;
- sv_setpv(ver_sv, buffer) ;
- }
-#endif
-
-#else
- sv_setiv(ver_sv, 1) ;
-#endif
-
-}
-
static int
+#ifdef CAN_PROTOTYPE
+btree_compare(const DBT *key1, const DBT *key2)
+#else
btree_compare(key1, key2)
const DBT * key1 ;
const DBT * key2 ;
+#endif
{
+#ifdef dTHX
+ dTHX;
+#endif
dSP ;
void * data1, * data2 ;
int retval ;
@@ -383,6 +491,7 @@ const DBT * key2 ;
data1 = key1->data ;
data2 = key2->data ;
+#ifndef newSVpvn
/* As newSVpv will assume that the data pointer is a null terminated C
string if the size parameter is 0, make sure that data points to an
empty string if the length is 0
@@ -391,14 +500,15 @@ const DBT * key2 ;
data1 = "" ;
if (key2->size == 0)
data2 = "" ;
+#endif
ENTER ;
SAVETMPS;
PUSHMARK(SP) ;
EXTEND(SP,2) ;
- PUSHs(sv_2mortal(newSVpv(data1,key1->size)));
- PUSHs(sv_2mortal(newSVpv(data2,key2->size)));
+ PUSHs(sv_2mortal(newSVpvn(data1,key1->size)));
+ PUSHs(sv_2mortal(newSVpvn(data2,key2->size)));
PUTBACK ;
count = perl_call_sv(CurrentDB->compare, G_SCALAR);
@@ -418,10 +528,17 @@ const DBT * key2 ;
}
static DB_Prefix_t
+#ifdef CAN_PROTOTYPE
+btree_prefix(const DBT *key1, const DBT *key2)
+#else
btree_prefix(key1, key2)
const DBT * key1 ;
const DBT * key2 ;
+#endif
{
+#ifdef dTHX
+ dTHX;
+#endif
dSP ;
void * data1, * data2 ;
int retval ;
@@ -430,6 +547,7 @@ const DBT * key2 ;
data1 = key1->data ;
data2 = key2->data ;
+#ifndef newSVpvn
/* As newSVpv will assume that the data pointer is a null terminated C
string if the size parameter is 0, make sure that data points to an
empty string if the length is 0
@@ -438,14 +556,15 @@ const DBT * key2 ;
data1 = "" ;
if (key2->size == 0)
data2 = "" ;
+#endif
ENTER ;
SAVETMPS;
PUSHMARK(SP) ;
EXTEND(SP,2) ;
- PUSHs(sv_2mortal(newSVpv(data1,key1->size)));
- PUSHs(sv_2mortal(newSVpv(data2,key2->size)));
+ PUSHs(sv_2mortal(newSVpvn(data1,key1->size)));
+ PUSHs(sv_2mortal(newSVpvn(data2,key2->size)));
PUTBACK ;
count = perl_call_sv(CurrentDB->prefix, G_SCALAR);
@@ -465,16 +584,25 @@ const DBT * key2 ;
}
static DB_Hash_t
+#ifdef CAN_PROTOTYPE
+hash_cb(const void *data, size_t size)
+#else
hash_cb(data, size)
const void * data ;
size_t size ;
+#endif
{
+#ifdef dTHX
+ dTHX;
+#endif
dSP ;
int retval ;
int count ;
+#ifndef newSVpvn
if (size == 0)
data = "" ;
+#endif
/* DGH - Next two lines added to fix corrupted stack problem */
ENTER ;
@@ -482,7 +610,7 @@ size_t size ;
PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSVpv((char*)data,size)));
+ XPUSHs(sv_2mortal(newSVpvn((char*)data,size)));
PUTBACK ;
count = perl_call_sv(CurrentDB->hash, G_SCALAR);
@@ -502,11 +630,15 @@ size_t size ;
}
-#ifdef TRACE
+#if defined(TRACE) && defined(BERKELEY_DB_1_OR_2)
static void
+#ifdef CAN_PROTOTYPE
+PrintHash(INFO *hash)
+#else
PrintHash(hash)
INFO * hash ;
+#endif
{
printf ("HASH Info\n") ;
printf (" hash = %s\n",
@@ -520,8 +652,12 @@ INFO * hash ;
}
static void
+#ifdef CAN_PROTOTYPE
+PrintRecno(INFO *recno)
+#else
PrintRecno(recno)
INFO * recno ;
+#endif
{
printf ("RECNO Info\n") ;
printf (" flags = %d\n", recno->db_RE_flags) ;
@@ -534,8 +670,12 @@ INFO * recno ;
}
static void
+#ifdef CAN_PROTOTYPE
+PrintBtree(INFO *btree)
+#else
PrintBtree(btree)
INFO * btree ;
+#endif
{
printf ("BTREE Info\n") ;
printf (" compare = %s\n",
@@ -562,15 +702,19 @@ INFO * btree ;
static I32
+#ifdef CAN_PROTOTYPE
+GetArrayLength(pTHX_ DB_File db)
+#else
GetArrayLength(db)
DB_File db ;
+#endif
{
DBT key ;
DBT value ;
int RETVAL ;
- DBT_flags(key) ;
- DBT_flags(value) ;
+ DBT_clear(key) ;
+ DBT_clear(value) ;
RETVAL = do_SEQ(db, key, value, R_LAST) ;
if (RETVAL == 0)
RETVAL = *(I32 *)key.data ;
@@ -581,13 +725,17 @@ DB_File db ;
}
static recno_t
+#ifdef CAN_PROTOTYPE
+GetRecnoKey(pTHX_ DB_File db, I32 value)
+#else
GetRecnoKey(db, value)
DB_File db ;
I32 value ;
+#endif
{
if (value < 0) {
/* Get the length of the array */
- I32 length = GetArrayLength(db) ;
+ I32 length = GetArrayLength(aTHX_ db) ;
/* check for attempt to write before start of array */
if (length + value + 1 <= 0)
@@ -601,14 +749,22 @@ I32 value ;
return value ;
}
+
static DB_File
+#ifdef CAN_PROTOTYPE
+ParseOpenInfo(pTHX_ int isHASH, char *name, int flags, int mode, SV *sv)
+#else
ParseOpenInfo(isHASH, name, flags, mode, sv)
int isHASH ;
char * name ;
int flags ;
int mode ;
SV * sv ;
+#endif
{
+
+#ifdef BERKELEY_DB_1_OR_2 /* Berkeley DB Version 1 or 2 */
+
SV ** svp;
HV * action ;
DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ;
@@ -620,6 +776,11 @@ SV * sv ;
Zero(RETVAL, 1, DB_File_type) ;
/* Default to HASH */
+#ifdef DBM_FILTERING
+ RETVAL->filtering = 0 ;
+ RETVAL->filter_fetch_key = RETVAL->filter_store_key =
+ RETVAL->filter_fetch_value = RETVAL->filter_store_value =
+#endif /* DBM_FILTERING */
RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ;
RETVAL->type = DB_HASH ;
@@ -864,25 +1025,275 @@ SV * sv ;
}
#else
+
+#if defined(DB_LIBRARY_COMPATIBILITY_API) && DB_VERSION_MAJOR > 2
+ RETVAL->dbp = __db185_open(name, flags, mode, RETVAL->type, openinfo) ;
+#else
RETVAL->dbp = dbopen(name, flags, mode, RETVAL->type, openinfo) ;
+#endif /* DB_LIBRARY_COMPATIBILITY_API */
+
#endif
return (RETVAL) ;
-}
+#else /* Berkeley DB Version > 2 */
+
+ SV ** svp;
+ HV * action ;
+ DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ;
+ DB * dbp ;
+ STRLEN n_a;
+ int status ;
+
+/* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ; */
+ Zero(RETVAL, 1, DB_File_type) ;
+
+ /* Default to HASH */
+#ifdef DBM_FILTERING
+ RETVAL->filtering = 0 ;
+ RETVAL->filter_fetch_key = RETVAL->filter_store_key =
+ RETVAL->filter_fetch_value = RETVAL->filter_store_value =
+#endif /* DBM_FILTERING */
+ RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ;
+ RETVAL->type = DB_HASH ;
+
+ /* DGH - Next line added to avoid SEGV on existing hash DB */
+ CurrentDB = RETVAL;
+
+ /* fd for 1.86 hash in memory files doesn't return -1 like 1.85 */
+ RETVAL->in_memory = (name == NULL) ;
+
+ status = db_create(&RETVAL->dbp, NULL,0) ;
+ /* printf("db_create returned %d %s\n", status, db_strerror(status)) ; */
+ if (status) {
+ RETVAL->dbp = NULL ;
+ return (RETVAL) ;
+ }
+ dbp = RETVAL->dbp ;
+
+ if (sv)
+ {
+ if (! SvROK(sv) )
+ croak ("type parameter is not a reference") ;
+
+ svp = hv_fetch( (HV*)SvRV(sv), "GOT", 3, FALSE) ;
+ if (svp && SvOK(*svp))
+ action = (HV*) SvRV(*svp) ;
+ else
+ croak("internal error") ;
+
+ if (sv_isa(sv, "DB_File::HASHINFO"))
+ {
+
+ if (!isHASH)
+ croak("DB_File can only tie an associative array to a DB_HASH database") ;
+
+ RETVAL->type = DB_HASH ;
+
+ svp = hv_fetch(action, "hash", 4, FALSE);
+
+ if (svp && SvOK(*svp))
+ {
+ (void)dbp->set_h_hash(dbp, hash_cb) ;
+ RETVAL->hash = newSVsv(*svp) ;
+ }
+
+ svp = hv_fetch(action, "ffactor", 7, FALSE);
+ if (svp)
+ (void)dbp->set_h_ffactor(dbp, SvIV(*svp)) ;
+
+ svp = hv_fetch(action, "nelem", 5, FALSE);
+ if (svp)
+ (void)dbp->set_h_nelem(dbp, SvIV(*svp)) ;
+
+ svp = hv_fetch(action, "bsize", 5, FALSE);
+ if (svp)
+ (void)dbp->set_pagesize(dbp, SvIV(*svp));
+
+ svp = hv_fetch(action, "cachesize", 9, FALSE);
+ if (svp)
+ (void)dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ;
+
+ svp = hv_fetch(action, "lorder", 6, FALSE);
+ if (svp)
+ (void)dbp->set_lorder(dbp, SvIV(*svp)) ;
+
+ PrintHash(info) ;
+ }
+ else if (sv_isa(sv, "DB_File::BTREEINFO"))
+ {
+ if (!isHASH)
+ croak("DB_File can only tie an associative array to a DB_BTREE database");
+
+ RETVAL->type = DB_BTREE ;
+
+ svp = hv_fetch(action, "compare", 7, FALSE);
+ if (svp && SvOK(*svp))
+ {
+ (void)dbp->set_bt_compare(dbp, btree_compare) ;
+ RETVAL->compare = newSVsv(*svp) ;
+ }
+
+ svp = hv_fetch(action, "prefix", 6, FALSE);
+ if (svp && SvOK(*svp))
+ {
+ (void)dbp->set_bt_prefix(dbp, btree_prefix) ;
+ RETVAL->prefix = newSVsv(*svp) ;
+ }
+
+ svp = hv_fetch(action, "flags", 5, FALSE);
+ if (svp)
+ (void)dbp->set_flags(dbp, SvIV(*svp)) ;
+
+ svp = hv_fetch(action, "cachesize", 9, FALSE);
+ if (svp)
+ (void)dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ;
+
+ svp = hv_fetch(action, "psize", 5, FALSE);
+ if (svp)
+ (void)dbp->set_pagesize(dbp, SvIV(*svp)) ;
+
+ svp = hv_fetch(action, "lorder", 6, FALSE);
+ if (svp)
+ (void)dbp->set_lorder(dbp, SvIV(*svp)) ;
+
+ PrintBtree(info) ;
+
+ }
+ else if (sv_isa(sv, "DB_File::RECNOINFO"))
+ {
+ int fixed = FALSE ;
+
+ if (isHASH)
+ croak("DB_File can only tie an array to a DB_RECNO database");
+
+ RETVAL->type = DB_RECNO ;
+
+ svp = hv_fetch(action, "flags", 5, FALSE);
+ if (svp) {
+ int flags = SvIV(*svp) ;
+ /* remove FIXDLEN, if present */
+ if (flags & DB_FIXEDLEN) {
+ fixed = TRUE ;
+ flags &= ~DB_FIXEDLEN ;
+ }
+ }
+
+ svp = hv_fetch(action, "cachesize", 9, FALSE);
+ if (svp) {
+ status = dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ;
+ }
+
+ svp = hv_fetch(action, "psize", 5, FALSE);
+ if (svp) {
+ status = dbp->set_pagesize(dbp, SvIV(*svp)) ;
+ }
+
+ svp = hv_fetch(action, "lorder", 6, FALSE);
+ if (svp) {
+ status = dbp->set_lorder(dbp, SvIV(*svp)) ;
+ }
+
+ svp = hv_fetch(action, "bval", 4, FALSE);
+ if (svp && SvOK(*svp))
+ {
+ int value ;
+ if (SvPOK(*svp))
+ value = (int)*SvPV(*svp, n_a) ;
+ else
+ value = SvIV(*svp) ;
+
+ if (fixed) {
+ status = dbp->set_re_pad(dbp, value) ;
+ }
+ else {
+ status = dbp->set_re_delim(dbp, value) ;
+ }
+
+ }
+
+ if (fixed) {
+ svp = hv_fetch(action, "reclen", 6, FALSE);
+ if (svp) {
+ u_int32_t len = (u_int32_t)SvIV(*svp) ;
+ status = dbp->set_re_len(dbp, len) ;
+ }
+ }
+
+ if (name != NULL) {
+ status = dbp->set_re_source(dbp, name) ;
+ name = NULL ;
+ }
+
+ svp = hv_fetch(action, "bfname", 6, FALSE);
+ if (svp && SvOK(*svp)) {
+ char * ptr = SvPV(*svp,n_a) ;
+ name = (char*) n_a ? ptr : NULL ;
+ }
+ else
+ name = NULL ;
+
+
+ status = dbp->set_flags(dbp, DB_RENUMBER) ;
+
+ if (flags){
+ (void)dbp->set_flags(dbp, flags) ;
+ }
+ PrintRecno(info) ;
+ }
+ else
+ croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO");
+ }
+
+ {
+ int Flags = 0 ;
+ int status ;
+
+ /* Map 1.x flags to 3.x flags */
+ if ((flags & O_CREAT) == O_CREAT)
+ Flags |= DB_CREATE ;
+
+#if O_RDONLY == 0
+ if (flags == O_RDONLY)
+#else
+ if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR)
+#endif
+ Flags |= DB_RDONLY ;
+
+#ifdef O_TRUNC
+ if ((flags & O_TRUNC) == O_TRUNC)
+ Flags |= DB_TRUNCATE ;
+#endif
+
+ status = RETVAL->dbp->open(RETVAL->dbp, name, NULL, RETVAL->type,
+ Flags, mode) ;
+ /* printf("open returned %d %s\n", status, db_strerror(status)) ; */
+
+ if (status == 0)
+ status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor,
+ 0) ;
+ /* printf("cursor returned %d %s\n", status, db_strerror(status)) ; */
+
+ if (status)
+ RETVAL->dbp = NULL ;
+
+ }
+
+ return (RETVAL) ;
+
+#endif /* Berkeley DB Version > 2 */
+
+} /* ParseOpenInfo */
-static int
-not_here(s)
-char *s;
-{
- croak("DB_File::%s not implemented on this architecture", s);
- return -1;
-}
static double
+#ifdef CAN_PROTOTYPE
+constant(char *name, int arg)
+#else
constant(name, arg)
char *name;
int arg;
+#endif
{
errno = 0;
switch (*name) {
@@ -1115,11 +1526,11 @@ MODULE = DB_File PACKAGE = DB_File PREFIX = db_
BOOT:
{
- GetVersionInfo() ;
+ __getBerkeleyDBInfo() ;
+ DBT_clear(empty) ;
empty.data = &zero ;
empty.size = sizeof(recno_t) ;
- DBT_flags(empty) ;
}
double
@@ -1146,7 +1557,7 @@ db_DoTie_(isHASH, dbtype, name=undef, flags=O_CREAT|O_RDWR, mode=0666, type=DB_H
if (items == 6)
sv = ST(5) ;
- RETVAL = ParseOpenInfo(isHASH, name, flags, mode, sv) ;
+ RETVAL = ParseOpenInfo(aTHX_ isHASH, name, flags, mode, sv) ;
if (RETVAL->dbp == NULL)
RETVAL = NULL ;
}
@@ -1165,7 +1576,17 @@ db_DESTROY(db)
SvREFCNT_dec(db->compare) ;
if (db->prefix)
SvREFCNT_dec(db->prefix) ;
- Safefree(db) ;
+#ifdef DBM_FILTERING
+ if (db->filter_fetch_key)
+ SvREFCNT_dec(db->filter_fetch_key) ;
+ if (db->filter_store_key)
+ SvREFCNT_dec(db->filter_store_key) ;
+ if (db->filter_fetch_value)
+ SvREFCNT_dec(db->filter_fetch_value) ;
+ if (db->filter_store_value)
+ SvREFCNT_dec(db->filter_store_value) ;
+#endif /* DBM_FILTERING */
+ safefree(db) ;
#ifdef DB_VERSION_MAJOR
if (RETVAL > 0)
RETVAL = -1 ;
@@ -1189,7 +1610,7 @@ db_EXISTS(db, key)
{
DBT value ;
- DBT_flags(value) ;
+ DBT_clear(value) ;
CurrentDB = db ;
RETVAL = (((db->dbp)->get)(db->dbp, TXN &key, &value, 0) == 0) ;
}
@@ -1205,7 +1626,7 @@ db_FETCH(db, key, flags=0)
{
DBT value ;
- DBT_flags(value) ;
+ DBT_clear(value) ;
CurrentDB = db ;
/* RETVAL = ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) ; */
RETVAL = db_get(db, key, value, flags) ;
@@ -1231,8 +1652,8 @@ db_FIRSTKEY(db)
DBTKEY key ;
DBT value ;
- DBT_flags(key) ;
- DBT_flags(value) ;
+ DBT_clear(key) ;
+ DBT_clear(value) ;
CurrentDB = db ;
RETVAL = do_SEQ(db, key, value, R_FIRST) ;
ST(0) = sv_newmortal();
@@ -1247,7 +1668,7 @@ db_NEXTKEY(db, key)
{
DBT value ;
- DBT_flags(value) ;
+ DBT_clear(value) ;
CurrentDB = db ;
RETVAL = do_SEQ(db, key, value, R_NEXT) ;
ST(0) = sv_newmortal();
@@ -1271,8 +1692,8 @@ unshift(db, ...)
DB * Db = db->dbp ;
STRLEN n_a;
- DBT_flags(key) ;
- DBT_flags(value) ;
+ DBT_clear(key) ;
+ DBT_clear(value) ;
CurrentDB = db ;
#ifdef DB_VERSION_MAJOR
/* get the first value */
@@ -1309,8 +1730,8 @@ pop(db)
DBTKEY key ;
DBT value ;
- DBT_flags(key) ;
- DBT_flags(value) ;
+ DBT_clear(key) ;
+ DBT_clear(value) ;
CurrentDB = db ;
/* First get the final value */
@@ -1336,8 +1757,8 @@ shift(db)
DBT value ;
DBTKEY key ;
- DBT_flags(key) ;
- DBT_flags(value) ;
+ DBT_clear(key) ;
+ DBT_clear(value) ;
CurrentDB = db ;
/* get the first value */
RETVAL = do_SEQ(db, key, value, R_FIRST) ;
@@ -1365,50 +1786,44 @@ push(db, ...)
DB * Db = db->dbp ;
int i ;
STRLEN n_a;
+ int keyval ;
DBT_flags(key) ;
DBT_flags(value) ;
CurrentDB = db ;
-#ifdef DB_VERSION_MAJOR
- RETVAL = 0 ;
- key = empty ;
- for (i = 1 ; i < items ; ++i)
- {
- value.data = SvPV(ST(i), n_a) ;
- value.size = n_a ;
- RETVAL = (Db->put)(Db, NULL, &key, &value, DB_APPEND) ;
- if (RETVAL != 0)
- break;
- }
-#else
/* Set the Cursor to the Last element */
RETVAL = do_SEQ(db, key, value, R_LAST) ;
+#ifndef DB_VERSION_MAJOR
if (RETVAL >= 0)
+#endif
{
- if (RETVAL == 1)
- key = empty ;
- for (i = items - 1 ; i > 0 ; --i)
+ if (RETVAL == 0)
+ keyval = *(int*)key.data ;
+ else
+ keyval = 0 ;
+ for (i = 1 ; i < items ; ++i)
{
value.data = SvPV(ST(i), n_a) ;
value.size = n_a ;
- RETVAL = (Db->put)(Db, &key, &value, R_IAFTER) ;
+ ++ keyval ;
+ key.data = &keyval ;
+ key.size = sizeof(int) ;
+ RETVAL = (Db->put)(Db, TXN &key, &value, 0) ;
if (RETVAL != 0)
break;
}
}
-#endif
}
OUTPUT:
RETVAL
-
I32
length(db)
DB_File db
ALIAS: FETCHSIZE = 1
CODE:
CurrentDB = db ;
- RETVAL = GetArrayLength(db) ;
+ RETVAL = GetArrayLength(aTHX_ db) ;
OUTPUT:
RETVAL
@@ -1443,7 +1858,7 @@ db_get(db, key, value, flags=0)
u_int flags
CODE:
CurrentDB = db ;
- DBT_flags(value) ;
+ DBT_clear(value) ;
RETVAL = db_get(db, key, value, flags) ;
#ifdef DB_VERSION_MAJOR
if (RETVAL > 0)
@@ -1518,7 +1933,7 @@ db_seq(db, key, value, flags)
u_int flags
CODE:
CurrentDB = db ;
- DBT_flags(value) ;
+ DBT_clear(value) ;
RETVAL = db_seq(db, key, value, flags);
#ifdef DB_VERSION_MAJOR
if (RETVAL > 0)
@@ -1531,3 +1946,56 @@ db_seq(db, key, value, flags)
key
value
+#ifdef DBM_FILTERING
+
+#define setFilter(type) \
+ { \
+ if (db->type) \
+ RETVAL = sv_mortalcopy(db->type) ; \
+ ST(0) = RETVAL ; \
+ if (db->type && (code == &PL_sv_undef)) { \
+ SvREFCNT_dec(db->type) ; \
+ db->type = NULL ; \
+ } \
+ else if (code) { \
+ if (db->type) \
+ sv_setsv(db->type, code) ; \
+ else \
+ db->type = newSVsv(code) ; \
+ } \
+ }
+
+
+SV *
+filter_fetch_key(db, code)
+ DB_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_key) ;
+
+SV *
+filter_store_key(db, code)
+ DB_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_key) ;
+
+SV *
+filter_fetch_value(db, code)
+ DB_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_value) ;
+
+SV *
+filter_store_value(db, code)
+ DB_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_value) ;
+
+#endif /* DBM_FILTERING */
diff --git a/contrib/perl5/ext/DB_File/Makefile.PL b/contrib/perl5/ext/DB_File/Makefile.PL
index 1a13e0b..cac6578 100644
--- a/contrib/perl5/ext/DB_File/Makefile.PL
+++ b/contrib/perl5/ext/DB_File/Makefile.PL
@@ -14,7 +14,15 @@ WriteMakefile(
MAN3PODS => {}, # Pods will be built by installman.
#INC => '-I/usr/local/include',
VERSION_FROM => 'DB_File.pm',
+ OBJECT => 'version$(OBJ_EXT) DB_File$(OBJ_EXT)',
XSPROTOARG => '-noprototypes',
- DEFINE => "$OS2",
+ DEFINE => $OS2 || "",
);
+sub MY::postamble {
+ '
+version$(OBJ_EXT): version.c
+
+' ;
+}
+
diff --git a/contrib/perl5/ext/DB_File/dbinfo b/contrib/perl5/ext/DB_File/dbinfo
index 24a7944..701ac61 100644
--- a/contrib/perl5/ext/DB_File/dbinfo
+++ b/contrib/perl5/ext/DB_File/dbinfo
@@ -4,8 +4,8 @@
# a database file
#
# Author: Paul Marquess <Paul.Marquess@btinternet.com>
-# Version: 1.01
-# Date 16th April 1998
+# Version: 1.02
+# Date 20th August 1999
#
# Copyright (c) 1998 Paul Marquess. All rights reserved.
# This program is free software; you can redistribute it and/or
@@ -19,7 +19,7 @@ use strict ;
my %Data =
(
0x053162 => {
- Type => "Btree",
+ Type => "Btree",
Versions =>
{
1 => "Unknown (older than 1.71)",
@@ -27,18 +27,27 @@ my %Data =
3 => "1.71 -> 1.85, 1.86",
4 => "Unknown",
5 => "2.0.0 -> 2.3.0",
- 6 => "2.3.1 or greater",
+ 6 => "2.3.1 -> 2.7.7",
+ 7 => "3.0.0 or greater",
}
},
0x061561 => {
- Type => "Hash",
+ Type => "Hash",
Versions =>
{
1 => "Unknown (older than 1.71)",
2 => "1.71 -> 1.85",
3 => "1.86",
4 => "2.0.0 -> 2.1.0",
- 5 => "2.2.6 or greater",
+ 5 => "2.2.6 -> 2.7.7",
+ 6 => "3.0.0 or greater",
+ }
+ },
+ 0x042253 => {
+ Type => "Queue",
+ Versions =>
+ {
+ 1 => "3.0.0 or greater",
}
},
) ;
diff --git a/contrib/perl5/ext/DB_File/hints/sco.pl b/contrib/perl5/ext/DB_File/hints/sco.pl
new file mode 100644
index 0000000..ff60440
--- /dev/null
+++ b/contrib/perl5/ext/DB_File/hints/sco.pl
@@ -0,0 +1,2 @@
+# osr5 needs to explicitly link against libc to pull in some static symbols
+$self->{LIBS} = ['-ldb -lc'] if $Config{'osvers'} =~ '3\.2v5\.0\..' ;
diff --git a/contrib/perl5/ext/DB_File/typemap b/contrib/perl5/ext/DB_File/typemap
index 994ba27..41a24f4 100644
--- a/contrib/perl5/ext/DB_File/typemap
+++ b/contrib/perl5/ext/DB_File/typemap
@@ -1,8 +1,8 @@
# typemap for Perl 5 interface to Berkeley
#
# written by Paul Marquess <Paul.Marquess@btinternet.com>
-# last modified 21st February 1999
-# version 1.65
+# last modified 7th September 1999
+# version 1.71
#
#################################### DB SECTION
#
@@ -15,21 +15,23 @@ DBTKEY T_dbtkeydatum
INPUT
T_dbtkeydatum
+ ckFilter($arg, filter_store_key, \"filter_store_key\");
+ DBT_clear($var) ;
if (db->type != DB_RECNO) {
$var.data = SvPV($arg, PL_na);
$var.size = (int)PL_na;
- DBT_flags($var);
}
else {
- Value = GetRecnoKey(db, SvIV($arg)) ;
+ Value = GetRecnoKey(aTHX_ db, SvIV($arg)) ;
$var.data = & Value;
$var.size = (int)sizeof(recno_t);
- DBT_flags($var);
}
T_dbtdatum
+ ckFilter($arg, filter_store_value, \"filter_store_value\");
+ DBT_clear($var) ;
$var.data = SvPV($arg, PL_na);
$var.size = (int)PL_na;
- DBT_flags($var);
+
OUTPUT
diff --git a/contrib/perl5/ext/DB_File/version.c b/contrib/perl5/ext/DB_File/version.c
new file mode 100644
index 0000000..f8c6cac
--- /dev/null
+++ b/contrib/perl5/ext/DB_File/version.c
@@ -0,0 +1,71 @@
+/*
+
+ version.c -- Perl 5 interface to Berkeley DB
+
+ written by Paul Marquess <Paul.Marquess@btinternet.com>
+ last modified 16th January 2000
+ version 1.72
+
+ All comments/suggestions/problems are welcome
+
+ Copyright (c) 1995-2000 Paul Marquess. All rights reserved.
+ This program is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+ Changes:
+ 1.71 - Support for Berkeley DB version 3.
+ Support for Berkeley DB 2/3's backward compatability mode.
+ 1.72 - No change.
+
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include <db.h>
+
+void
+__getBerkeleyDBInfo()
+{
+ SV * version_sv = perl_get_sv("DB_File::db_version", GV_ADD|GV_ADDMULTI) ;
+ SV * ver_sv = perl_get_sv("DB_File::db_ver", GV_ADD|GV_ADDMULTI) ;
+ SV * compat_sv = perl_get_sv("DB_File::db_185_compat", GV_ADD|GV_ADDMULTI) ;
+
+#ifdef DB_VERSION_MAJOR
+ int Major, Minor, Patch ;
+
+ (void)db_version(&Major, &Minor, &Patch) ;
+
+ /* Check that the versions of db.h and libdb.a are the same */
+ if (Major != DB_VERSION_MAJOR || Minor != DB_VERSION_MINOR
+ || Patch != DB_VERSION_PATCH)
+ croak("\nDB_File needs compatible versions of libdb & db.h\n\tyou have db.h version %d.%d.%d and libdb version %d.%d.%d\n",
+ DB_VERSION_MAJOR, DB_VERSION_MINOR, DB_VERSION_PATCH,
+ Major, Minor, Patch) ;
+
+ /* check that libdb is recent enough -- we need 2.3.4 or greater */
+ if (Major == 2 && (Minor < 3 || (Minor == 3 && Patch < 4)))
+ croak("DB_File needs Berkeley DB 2.3.4 or greater, you have %d.%d.%d\n",
+ Major, Minor, Patch) ;
+
+ {
+ char buffer[40] ;
+ sprintf(buffer, "%d.%d", Major, Minor) ;
+ sv_setpv(version_sv, buffer) ;
+ sprintf(buffer, "%d.%03d%03d", Major, Minor, Patch) ;
+ sv_setpv(ver_sv, buffer) ;
+ }
+
+#else /* ! DB_VERSION_MAJOR */
+ sv_setiv(version_sv, 1) ;
+ sv_setiv(ver_sv, 1) ;
+#endif /* ! DB_VERSION_MAJOR */
+
+#ifdef COMPAT185
+ sv_setiv(compat_sv, 1) ;
+#else /* ! COMPAT185 */
+ sv_setiv(compat_sv, 0) ;
+#endif /* ! COMPAT185 */
+
+}
diff --git a/contrib/perl5/ext/Data/Dumper/Changes b/contrib/perl5/ext/Data/Dumper/Changes
index 9a96eda..161aba9 100644
--- a/contrib/perl5/ext/Data/Dumper/Changes
+++ b/contrib/perl5/ext/Data/Dumper/Changes
@@ -6,6 +6,21 @@ HISTORY - public release history for Data::Dumper
=over 8
+=item 2.11 (unreleased)
+
+C<0> is now dumped as such, not as C<'0'>.
+
+qr// objects are now dumped correctly (provided a post-5.005_58)
+overload.pm exists).
+
+Implemented $Data::Dumper::Maxdepth, which was on the Todo list.
+Thanks to John Nolan <jpnolan@Op.Net>.
+
+=item 2.101 (30 Apr 1999)
+
+Minor release to sync with version in 5.005_03. Fixes dump of
+dummy coderefs.
+
=item 2.10 (31 Oct 1998)
Bugfixes for dumping related undef values, globs, and better double
diff --git a/contrib/perl5/ext/Data/Dumper/Dumper.pm b/contrib/perl5/ext/Data/Dumper/Dumper.pm
index b1fd2b7..93b87f9 100644
--- a/contrib/perl5/ext/Data/Dumper/Dumper.pm
+++ b/contrib/perl5/ext/Data/Dumper/Dumper.pm
@@ -9,22 +9,22 @@
package Data::Dumper;
-$VERSION = $VERSION = '2.101';
+$VERSION = '2.101';
#$| = 1;
-require 5.004;
+require 5.005_64;
require Exporter;
-require DynaLoader;
+use XSLoader ();
require overload;
use Carp;
-@ISA = qw(Exporter DynaLoader);
+@ISA = qw(Exporter);
@EXPORT = qw(Dumper);
@EXPORT_OK = qw(DumperX);
-bootstrap Data::Dumper;
+XSLoader::load 'Data::Dumper';
# module vars and their defaults
$Indent = 2 unless defined $Indent;
@@ -39,7 +39,7 @@ $Deepcopy = 0 unless defined $Deepcopy;
$Quotekeys = 1 unless defined $Quotekeys;
$Bless = "bless" unless defined $Bless;
#$Expdepth = 0 unless defined $Expdepth;
-#$Maxdepth = 0 unless defined $Maxdepth;
+$Maxdepth = 0 unless defined $Maxdepth;
#
# expects an arrayref of values to be dumped.
@@ -74,7 +74,7 @@ sub new {
quotekeys => $Quotekeys, # quote hash keys
'bless' => $Bless, # keyword to use for "bless"
# expdepth => $Expdepth, # cutoff depth for explicit dumping
-# maxdepth => $Maxdepth, # depth beyond which we give up
+ maxdepth => $Maxdepth, # depth beyond which we give up
};
if ($Indent > 0) {
@@ -146,11 +146,17 @@ sub Names {
sub DESTROY {}
+sub Dump {
+ return &Dumpxs
+ unless $Data::Dumper::Useqq || (ref($_[0]) && $_[0]->{useqq});
+ return &Dumpperl;
+}
+
#
# dump the refs in the current dumper object.
# expects same args as new() if called via package name.
#
-sub Dump {
+sub Dumpperl {
my($s) = shift;
my(@out, $val, $name);
my($i) = 0;
@@ -214,14 +220,13 @@ sub _dump {
if ($type) {
# prep it, if it looks like an object
- if ($type =~ /[a-z_:]/) {
- my $freezer = $s->{freezer};
- $val->$freezer() if $freezer && UNIVERSAL::can($val, $freezer);
+ if (my $freezer = $s->{freezer}) {
+ $val->$freezer() if UNIVERSAL::can($val, $freezer);
}
($realpack, $realtype, $id) =
(overload::StrVal($val) =~ /^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$/);
-
+
# if it has a name, we need to either look it up, or keep a tab
# on it so we know when we hit it later
if (defined($name) and length($name)) {
@@ -231,7 +236,7 @@ sub _dump {
if ($s->{purity} and $s->{level} > 0) {
$out = ($realtype eq 'HASH') ? '{}' :
($realtype eq 'ARRAY') ? '[]' :
- "''" ;
+ 'do{my $o}' ;
push @post, $name . " = " . $s->{seen}{$id}[0];
}
else {
@@ -259,14 +264,33 @@ sub _dump {
}
}
- $s->{level}++;
- $ipad = $s->{xpad} x $s->{level};
+ if ($realpack and $realpack eq 'Regexp') {
+ $out = "$val";
+ $out =~ s,/,\\/,g;
+ return "qr/$out/";
+ }
+
+ # If purity is not set and maxdepth is set, then check depth:
+ # if we have reached maximum depth, return the string
+ # representation of the thing we are currently examining
+ # at this depth (i.e., 'Foo=ARRAY(0xdeadbeef)').
+ if (!$s->{purity}
+ and $s->{maxdepth} > 0
+ and $s->{level} >= $s->{maxdepth})
+ {
+ return qq['$val'];
+ }
- if ($realpack) { # we have a blessed ref
+ # we have a blessed ref
+ if ($realpack) {
$out = $s->{'bless'} . '( ';
$blesspad = $s->{apad};
$s->{apad} .= ' ' if ($s->{indent} >= 2);
}
+
+ $s->{level}++;
+ $ipad = $s->{xpad} x $s->{level};
+
if ($realtype eq 'SCALAR') {
if ($realpack) {
@@ -389,7 +413,7 @@ sub _dump {
elsif (!defined($val)) {
$out .= "undef";
}
- elsif ($val =~ /^-?[1-9]\d{0,8}$/) { # safe decimal number
+ elsif ($val =~ /^(?:0|-?[1-9]\d{0,8})$/) { # safe decimal number
$out .= $val;
}
else { # string
@@ -422,9 +446,7 @@ sub Dumper {
return Data::Dumper->Dump([@_]);
}
-#
-# same, only calls the XS version
-#
+# compat stub
sub DumperX {
return Data::Dumper->Dumpxs([@_], []);
}
@@ -511,6 +533,12 @@ sub Bless {
defined($v) ? (($s->{'bless'} = $v), return $s) : $s->{'bless'};
}
+sub Maxdepth {
+ my($s, $v) = @_;
+ defined($v) ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'};
+}
+
+
# used by qquote below
my %esc = (
"\a" => "\\a",
@@ -526,25 +554,35 @@ my %esc = (
sub qquote {
local($_) = shift;
s/([\\\"\@\$])/\\$1/g;
- return qq("$_") unless /[^\040-\176]/; # fast exit
+ return qq("$_") unless
+ /[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~]/; # fast exit
my $high = shift || "";
s/([\a\b\t\n\f\r\e])/$esc{$1}/g;
- # no need for 3 digits in escape for these
- s/([\0-\037])(?!\d)/'\\'.sprintf('%o',ord($1))/eg;
-
- s/([\0-\037\177])/'\\'.sprintf('%03o',ord($1))/eg;
- if ($high eq "iso8859") {
- s/([\200-\240])/'\\'.sprintf('%o',ord($1))/eg;
- } elsif ($high eq "utf8") {
-# use utf8;
-# $str =~ s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge;
- } elsif ($high eq "8bit") {
- # leave it as it is
- } else {
- s/([\0-\037\177-\377])/'\\'.sprintf('%03o',ord($1))/eg;
+ if (ord('^')==94) { # ascii
+ # no need for 3 digits in escape for these
+ s/([\0-\037])(?!\d)/'\\'.sprintf('%o',ord($1))/eg;
+ s/([\0-\037\177])/'\\'.sprintf('%03o',ord($1))/eg;
+ # all but last branch below not supported --BEHAVIOR SUBJECT TO CHANGE--
+ if ($high eq "iso8859") {
+ s/([\200-\240])/'\\'.sprintf('%o',ord($1))/eg;
+ } elsif ($high eq "utf8") {
+# use utf8;
+# $str =~ s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge;
+ } elsif ($high eq "8bit") {
+ # leave it as it is
+ } else {
+ s/([\200-\377])/'\\'.sprintf('%03o',ord($1))/eg;
+ }
}
+ else { # ebcdic
+ s{([^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~])(?!\d)}
+ {my $v = ord($1); '\\'.sprintf(($v <= 037 ? '%o' : '%03o'), $v)}eg;
+ s{([^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~])}
+ {'\\'.sprintf('%03o',ord($1))}eg;
+ }
+
return qq("$_");
}
@@ -653,12 +691,6 @@ of strings corresponding to the supplied values.
The second form, for convenience, simply calls the C<new> method on its
arguments before dumping the object immediately.
-=item I<$OBJ>->Dumpxs I<or> I<PACKAGE>->Dumpxs(I<ARRAYREF [>, I<ARRAYREF]>)
-
-This method is available if you were able to compile and install the XSUB
-extension to C<Data::Dumper>. It is exactly identical to the C<Dump> method
-above, only about 4 to 5 times faster, since it is written entirely in C.
-
=item I<$OBJ>->Seen(I<[HASHREF]>)
Queries or adds to the internal table of already encountered references.
@@ -702,12 +734,6 @@ configuration options below. The values will be named C<$VAR>I<n> in the
output, where I<n> is a numeric suffix. Will return a list of strings
in an array context.
-=item DumperX(I<LIST>)
-
-Identical to the C<Dumper()> function above, but this calls the XSUB
-implementation. Only available if you were able to compile and install
-the XSUB extensions in C<Data::Dumper>.
-
=back
=head2 Configuration Variables or Methods
@@ -763,8 +789,8 @@ When set, enables the use of double quotes for representing string values.
Whitespace other than space will be represented as C<[\n\t\r]>, "unsafe"
characters will be backslashed, and unprintable characters will be output as
quoted octal integers. Since setting this variable imposes a performance
-penalty, the default is 0. The C<Dumpxs()> method does not honor this
-flag yet.
+penalty, the default is 0. C<Dump()> will run slower if this flag is set,
+since the fast XSUB implementation doesn't support it yet.
=item $Data::Dumper::Terse I<or> I<$OBJ>->Terse(I<[NEWVAL]>)
@@ -814,6 +840,14 @@ builtin operator used to create objects. A function with the specified
name should exist, and should accept the same arguments as the builtin.
Default is C<bless>.
+=item $Data::Dumper::Maxdepth I<or> $I<OBJ>->Maxdepth(I<[NEWVAL]>)
+
+Can be set to a positive integer that specifies the depth beyond which
+which we don't venture into a structure. Has no effect when
+C<Data::Dumper::Purity> is set. (Useful in debugger when we often don't
+want to see more than enough). Default is 0, which means there is
+no maximum depth.
+
=back
=head2 Exports
@@ -847,7 +881,7 @@ distribution for more examples.)
$boo = [ 1, [], "abcd", \*foo,
{1 => 'a', 023 => 'b', 0x45 => 'c'},
\\"p\q\'r", $foo, $fuz];
-
+
########
# simple usage
########
@@ -868,12 +902,12 @@ distribution for more examples.)
$Data::Dumper::Useqq = 1; # print strings in double quotes
print Dumper($boo);
-
-
+
+
########
# recursive structures
########
-
+
@c = ('c');
$c = \@c;
$b = {};
@@ -882,37 +916,52 @@ distribution for more examples.)
$b->{b} = $a->[1];
$b->{c} = $a->[2];
print Data::Dumper->Dump([$a,$b,$c], [qw(a b c)]);
-
-
+
+
$Data::Dumper::Purity = 1; # fill in the holes for eval
print Data::Dumper->Dump([$a, $b], [qw(*a b)]); # print as @a
print Data::Dumper->Dump([$b, $a], [qw(*b a)]); # print as %b
-
-
+
+
$Data::Dumper::Deepcopy = 1; # avoid cross-refs
print Data::Dumper->Dump([$b, $a], [qw(*b a)]);
-
-
+
+
$Data::Dumper::Purity = 0; # avoid cross-refs
print Data::Dumper->Dump([$b, $a], [qw(*b a)]);
-
-
+
+ ########
+ # deep structures
+ ########
+
+ $a = "pearl";
+ $b = [ $a ];
+ $c = { 'b' => $b };
+ $d = [ $c ];
+ $e = { 'd' => $d };
+ $f = { 'e' => $e };
+ print Data::Dumper->Dump([$f], [qw(f)]);
+
+ $Data::Dumper::Maxdepth = 3; # no deeper than 3 refs down
+ print Data::Dumper->Dump([$f], [qw(f)]);
+
+
########
# object-oriented usage
########
-
+
$d = Data::Dumper->new([$a,$b], [qw(a b)]);
$d->Seen({'*c' => $c}); # stash a ref without printing it
$d->Indent(3);
print $d->Dump;
$d->Reset->Purity(0); # empty the seen cache
print join "----\n", $d->Dump;
-
-
+
+
########
# persistence
########
-
+
package Foo;
sub new { bless { state => 'awake' }, shift }
sub Freeze {
@@ -921,7 +970,7 @@ distribution for more examples.)
$s->{state} = 'asleep';
return bless $s, 'Foo::ZZZ';
}
-
+
package Foo::ZZZ;
sub Thaw {
my $s = shift;
@@ -929,7 +978,7 @@ distribution for more examples.)
$s->{state} = 'awake';
return bless $s, 'Foo';
}
-
+
package Foo;
use Data::Dumper;
$a = Foo->new;
@@ -940,12 +989,12 @@ distribution for more examples.)
print $c;
$d = eval $c;
print Data::Dumper->Dump([$d], ['d']);
-
-
+
+
########
# symbol substitution (useful for recreating CODE refs)
########
-
+
sub foo { print "foo speaking\n" }
*other = \&foo;
$bar = [ \&other ];
@@ -974,15 +1023,15 @@ to have, you can use the C<Seen> method to pre-seed the internal reference
table and make the dumped output point to them, instead. See L<EXAMPLES>
above.
-The C<Useqq> flag is not honored by C<Dumpxs()> (it always outputs
-strings in single quotes).
+The C<Useqq> flag makes Dump() run slower, since the XSUB implementation
+does not support it.
SCALAR objects have the weirdest looking C<bless> workaround.
=head1 AUTHOR
-Gurusamy Sarathy gsar@umich.edu
+Gurusamy Sarathy gsar@activestate.com
Copyright (c) 1996-98 Gurusamy Sarathy. All rights reserved.
This program is free software; you can redistribute it and/or
@@ -991,7 +1040,7 @@ modify it under the same terms as Perl itself.
=head1 VERSION
-Version 2.10 (31 Oct 1998)
+Version 2.11 (unreleased)
=head1 SEE ALSO
diff --git a/contrib/perl5/ext/Data/Dumper/Dumper.xs b/contrib/perl5/ext/Data/Dumper/Dumper.xs
index a3da110..990ea74 100644
--- a/contrib/perl5/ext/Data/Dumper/Dumper.xs
+++ b/contrib/perl5/ext/Data/Dumper/Dumper.xs
@@ -1,10 +1,14 @@
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
+#ifndef PERL_VERSION
#include "patchlevel.h"
+#define PERL_VERSION PATCHLEVEL
+#endif
-#if PATCHLEVEL < 5
+#if PERL_VERSION < 5
# ifndef PL_sv_undef
# define PL_sv_undef sv_undef
# endif
@@ -16,14 +20,15 @@
# endif
#endif
-static I32 num_q _((char *s, STRLEN slen));
-static I32 esc_q _((char *dest, char *src, STRLEN slen));
-static SV *sv_x _((SV *sv, char *str, STRLEN len, I32 n));
-static I32 DD_dump _((SV *val, char *name, STRLEN namelen, SV *retval,
- HV *seenhv, AV *postav, I32 *levelp, I32 indent,
- SV *pad, SV *xpad, SV *apad, SV *sep,
- SV *freezer, SV *toaster,
- I32 purity, I32 deepcopy, I32 quotekeys, SV *bless));
+static I32 num_q (char *s, STRLEN slen);
+static I32 esc_q (char *dest, char *src, STRLEN slen);
+static SV *sv_x (pTHX_ SV *sv, char *str, STRLEN len, I32 n);
+static I32 DD_dump (pTHX_ SV *val, char *name, STRLEN namelen, SV *retval,
+ HV *seenhv, AV *postav, I32 *levelp, I32 indent,
+ SV *pad, SV *xpad, SV *apad, SV *sep,
+ SV *freezer, SV *toaster,
+ I32 purity, I32 deepcopy, I32 quotekeys, SV *bless,
+ I32 maxdepth);
/* does a string need to be protected? */
static I32
@@ -40,11 +45,12 @@ TOP:
}
if (isIDFIRST(*s)) {
while (*++s)
- if (!isALNUM(*s))
+ if (!isALNUM(*s)) {
if (*s == ':')
goto TOP;
else
return 1;
+ }
}
else
return 1;
@@ -92,7 +98,7 @@ esc_q(register char *d, register char *s, register STRLEN slen)
/* append a repeated string to an SV */
static SV *
-sv_x(SV *sv, register char *str, STRLEN len, I32 n)
+sv_x(pTHX_ SV *sv, register char *str, STRLEN len, I32 n)
{
if (sv == Nullsv)
sv = newSVpvn("", 0);
@@ -123,10 +129,10 @@ sv_x(SV *sv, register char *str, STRLEN len, I32 n)
* efficiency raisins.) Ugggh!
*/
static I32
-DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
+DD_dump(pTHX_ SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
AV *postav, I32 *levelp, I32 indent, SV *pad, SV *xpad,
SV *apad, SV *sep, SV *freezer, SV *toaster, I32 purity,
- I32 deepcopy, I32 quotekeys, SV *bless)
+ I32 deepcopy, I32 quotekeys, SV *bless, I32 maxdepth)
{
char tmpbuf[128];
U32 i;
@@ -196,7 +202,7 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
else if (realtype == SVt_PVAV)
sv_catpvn(retval, "[]", 2);
else
- sv_catpvn(retval, "''", 2);
+ sv_catpvn(retval, "do{my $o}", 9);
postentry = newSVpvn(name, namelen);
sv_catpvn(postentry, " = ", 3);
sv_catsv(postentry, othername);
@@ -248,11 +254,39 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
SvREFCNT_dec(seenentry);
}
}
-
- (*levelp)++;
- ipad = sv_x(Nullsv, SvPVX(xpad), SvCUR(xpad), *levelp);
- if (realpack) { /* we have a blessed ref */
+ if (realpack && *realpack == 'R' && strEQ(realpack, "Regexp")) {
+ STRLEN rlen;
+ char *rval = SvPV(val, rlen);
+ char *slash = strchr(rval, '/');
+ sv_catpvn(retval, "qr/", 3);
+ while (slash) {
+ sv_catpvn(retval, rval, slash-rval);
+ sv_catpvn(retval, "\\/", 2);
+ rlen -= slash-rval+1;
+ rval = slash+1;
+ slash = strchr(rval, '/');
+ }
+ sv_catpvn(retval, rval, rlen);
+ sv_catpvn(retval, "/", 1);
+ return 1;
+ }
+
+ /* If purity is not set and maxdepth is set, then check depth:
+ * if we have reached maximum depth, return the string
+ * representation of the thing we are currently examining
+ * at this depth (i.e., 'Foo=ARRAY(0xdeadbeef)').
+ */
+ if (!purity && maxdepth > 0 && *levelp >= maxdepth) {
+ STRLEN vallen;
+ char *valstr = SvPV(val,vallen);
+ sv_catpvn(retval, "'", 1);
+ sv_catpvn(retval, valstr, vallen);
+ sv_catpvn(retval, "'", 1);
+ return 1;
+ }
+
+ if (realpack) { /* we have a blessed ref */
STRLEN blesslen;
char *blessstr = SvPV(bless, blesslen);
sv_catpvn(retval, blessstr, blesslen);
@@ -260,26 +294,31 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
if (indent >= 2) {
blesspad = apad;
apad = newSVsv(apad);
- sv_x(apad, " ", 1, blesslen+2);
+ sv_x(aTHX_ apad, " ", 1, blesslen+2);
}
}
+ (*levelp)++;
+ ipad = sv_x(aTHX_ Nullsv, SvPVX(xpad), SvCUR(xpad), *levelp);
+
if (realtype <= SVt_PVBM) { /* scalar ref */
SV *namesv = newSVpvn("${", 2);
sv_catpvn(namesv, name, namelen);
sv_catpvn(namesv, "}", 1);
if (realpack) { /* blessed */
sv_catpvn(retval, "do{\\(my $o = ", 13);
- DD_dump(ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv,
+ DD_dump(aTHX_ ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv,
postav, levelp, indent, pad, xpad, apad, sep,
- freezer, toaster, purity, deepcopy, quotekeys, bless);
+ freezer, toaster, purity, deepcopy, quotekeys, bless,
+ maxdepth);
sv_catpvn(retval, ")}", 2);
} /* plain */
else {
sv_catpvn(retval, "\\", 1);
- DD_dump(ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv,
+ DD_dump(aTHX_ ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv,
postav, levelp, indent, pad, xpad, apad, sep,
- freezer, toaster, purity, deepcopy, quotekeys, bless);
+ freezer, toaster, purity, deepcopy, quotekeys, bless,
+ maxdepth);
}
SvREFCNT_dec(namesv);
}
@@ -288,9 +327,10 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
sv_catpvn(namesv, name, namelen);
sv_catpvn(namesv, "}", 1);
sv_catpvn(retval, "\\", 1);
- DD_dump(ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv,
+ DD_dump(aTHX_ ival, SvPVX(namesv), SvCUR(namesv), retval, seenhv,
postav, levelp, indent, pad, xpad, apad, sep,
- freezer, toaster, purity, deepcopy, quotekeys, bless);
+ freezer, toaster, purity, deepcopy, quotekeys, bless,
+ maxdepth);
SvREFCNT_dec(namesv);
}
else if (realtype == SVt_PVAV) {
@@ -345,7 +385,7 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
ilen = inamelen;
sv_setiv(ixsv, ix);
- (void) sprintf(iname+ilen, "%ld", ix);
+ (void) sprintf(iname+ilen, "%"IVdf, (IV)ix);
ilen = strlen(iname);
iname[ilen++] = ']'; iname[ilen] = '\0';
if (indent >= 3) {
@@ -356,14 +396,15 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
}
sv_catsv(retval, totpad);
sv_catsv(retval, ipad);
- DD_dump(elem, iname, ilen, retval, seenhv, postav,
+ DD_dump(aTHX_ elem, iname, ilen, retval, seenhv, postav,
levelp, indent, pad, xpad, apad, sep,
- freezer, toaster, purity, deepcopy, quotekeys, bless);
+ freezer, toaster, purity, deepcopy, quotekeys, bless,
+ maxdepth);
if (ix < ixmax)
sv_catpvn(retval, ",", 1);
}
if (ixmax >= 0) {
- SV *opad = sv_x(Nullsv, SvPVX(xpad), SvCUR(xpad), (*levelp)-1);
+ SV *opad = sv_x(aTHX_ Nullsv, SvPVX(xpad), SvCUR(xpad), (*levelp)-1);
sv_catsv(retval, totpad);
sv_catsv(retval, opad);
SvREFCNT_dec(opad);
@@ -462,16 +503,17 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
else
newapad = apad;
- DD_dump(hval, SvPVX(sname), SvCUR(sname), retval, seenhv,
+ DD_dump(aTHX_ hval, SvPVX(sname), SvCUR(sname), retval, seenhv,
postav, levelp, indent, pad, xpad, newapad, sep,
- freezer, toaster, purity, deepcopy, quotekeys, bless);
+ freezer, toaster, purity, deepcopy, quotekeys, bless,
+ maxdepth);
SvREFCNT_dec(sname);
Safefree(nkey);
if (indent >= 2)
SvREFCNT_dec(newapad);
}
if (i) {
- SV *opad = sv_x(Nullsv, SvPVX(xpad), SvCUR(xpad), *levelp-1);
+ SV *opad = sv_x(aTHX_ Nullsv, SvPVX(xpad), SvCUR(xpad), *levelp-1);
sv_catsv(retval, totpad);
sv_catsv(retval, opad);
SvREFCNT_dec(opad);
@@ -543,7 +585,7 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
if (SvIOK(val)) {
STRLEN len;
i = SvIV(val);
- (void) sprintf(tmpbuf, "%d", i);
+ (void) sprintf(tmpbuf, "%"IVdf, (IV)i);
len = strlen(tmpbuf);
sv_catpvn(retval, tmpbuf, len);
}
@@ -599,12 +641,12 @@ DD_dump(SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
SvCUR(newapad) = 0;
if (indent >= 2)
- (void)sv_x(newapad, " ", 1, SvCUR(postentry));
+ (void)sv_x(aTHX_ newapad, " ", 1, SvCUR(postentry));
- DD_dump(e, SvPVX(nname), SvCUR(nname), postentry,
+ DD_dump(aTHX_ e, SvPVX(nname), SvCUR(nname), postentry,
seenhv, postav, &nlevel, indent, pad, xpad,
newapad, sep, freezer, toaster, purity,
- deepcopy, quotekeys, bless);
+ deepcopy, quotekeys, bless, maxdepth);
SvREFCNT_dec(e);
}
}
@@ -664,28 +706,22 @@ Data_Dumper_Dumpxs(href, ...)
SV **svp;
SV *val, *name, *pad, *xpad, *apad, *sep, *tmp, *varname;
SV *freezer, *toaster, *bless;
- I32 purity, deepcopy, quotekeys;
+ I32 purity, deepcopy, quotekeys, maxdepth = 0;
char tmpbuf[1024];
I32 gimme = GIMME;
if (!SvROK(href)) { /* call new to get an object first */
- SV *valarray;
- SV *namearray;
-
- if (items == 3) {
- valarray = ST(1);
- namearray = ST(2);
- }
- else
- croak("Usage: Data::Dumper::Dumpxs(PACKAGE, VAL_ARY_REF, NAME_ARY_REF)");
+ if (items < 2)
+ croak("Usage: Data::Dumper::Dumpxs(PACKAGE, VAL_ARY_REF, [NAME_ARY_REF])");
ENTER;
SAVETMPS;
PUSHMARK(sp);
XPUSHs(href);
- XPUSHs(sv_2mortal(newSVsv(valarray)));
- XPUSHs(sv_2mortal(newSVsv(namearray)));
+ XPUSHs(sv_2mortal(newSVsv(ST(1))));
+ if (items >= 3)
+ XPUSHs(sv_2mortal(newSVsv(ST(2))));
PUTBACK;
i = perl_call_method("new", G_SCALAR);
SPAGAIN;
@@ -747,6 +783,8 @@ Data_Dumper_Dumpxs(href, ...)
quotekeys = SvTRUE(*svp);
if ((svp = hv_fetch(hv, "bless", 5, FALSE)))
bless = *svp;
+ if ((svp = hv_fetch(hv, "maxdepth", 8, FALSE)))
+ maxdepth = SvIV(*svp);
postav = newAV();
if (todumpav)
@@ -795,13 +833,13 @@ Data_Dumper_Dumpxs(href, ...)
STRLEN nchars = 0;
sv_setpvn(name, "$", 1);
sv_catsv(name, varname);
- (void) sprintf(tmpbuf, "%ld", i+1);
+ (void) sprintf(tmpbuf, "%"IVdf, (IV)(i+1));
nchars = strlen(tmpbuf);
sv_catpvn(name, tmpbuf, nchars);
}
if (indent >= 2) {
- SV *tmpsv = sv_x(Nullsv, " ", 1, SvCUR(name)+3);
+ SV *tmpsv = sv_x(aTHX_ Nullsv, " ", 1, SvCUR(name)+3);
newapad = newSVsv(apad);
sv_catsv(newapad, tmpsv);
SvREFCNT_dec(tmpsv);
@@ -809,10 +847,10 @@ Data_Dumper_Dumpxs(href, ...)
else
newapad = apad;
- DD_dump(val, SvPVX(name), SvCUR(name), valstr, seenhv,
+ DD_dump(aTHX_ val, SvPVX(name), SvCUR(name), valstr, seenhv,
postav, &level, indent, pad, xpad, newapad, sep,
freezer, toaster, purity, deepcopy, quotekeys,
- bless);
+ bless, maxdepth);
if (indent >= 2)
SvREFCNT_dec(newapad);
diff --git a/contrib/perl5/ext/Data/Dumper/Todo b/contrib/perl5/ext/Data/Dumper/Todo
index 7dcd40b..bd76e65 100644
--- a/contrib/perl5/ext/Data/Dumper/Todo
+++ b/contrib/perl5/ext/Data/Dumper/Todo
@@ -8,12 +8,6 @@ The following functionality will be supported in the next few releases.
=over 4
-=item $Data::Dumper::Maxdepth I<or> $I<OBJ>->Maxdepth(I<NEWVAL>)
-
-Depth beyond which we don't venture into a structure. Has no effect when
-C<Data::Dumper::Purity> is set. (useful in debugger when we often don't
-want to see more than enough).
-
=item $Data::Dumper::Expdepth I<or> $I<OBJ>->Expdepth(I<NEWVAL>)
Dump contents explicitly up to a certain depth and then use names for
diff --git a/contrib/perl5/ext/Devel/DProf/Changes b/contrib/perl5/ext/Devel/DProf/Changes
new file mode 100644
index 0000000..216498b
--- /dev/null
+++ b/contrib/perl5/ext/Devel/DProf/Changes
@@ -0,0 +1,176 @@
+1999 Jan 8
+
+ Ilya Zakharevich:
+ Newer perls: Add PERL_POLLUTE and dTHR.
+
+1998 Nov 10
+This version of DProf should work with older Perls too, but to get
+full benefits some patches to 5.004_55 are needed. Patches take effect
+after new version of Perl is installed, and DProf recompiled.
+
+Without these patches the overhead of DProf is too big, thus the statistic
+may be very skewed.
+
+Oct 98:
+ Ilya Zakharevich:
+ DProf.xs
+ - correct defstash to PL_defstash
+ - nonlocal exits work
+ dprofpp
+ - nonlocal exits work
+ DProf.pm
+ - documentation updated
+ t/test6.*
+ - added
+
+Nov-Dec 97:
+ Jason E. Holt and Ilya Zakharevich:
+ DProf.xs
+ - will not wait until completion to write the output, size of buffer
+ regulated by PERL_DPROF_BUFFER, default 2**14 words;
+
+ Ilya Zakharevich:
+ dprofpp
+ - smarter in fixing garbled profiles;
+ - subtracts DProf output overhead, and suggested profiler overhead;
+ - new options -A, -R, -g subroutine, -S;
+ - handles 'goto' too;
+ DProf.xs
+ - 7x denser output (time separated from name, ids for subs);
+ - outputs report-write overhead;
+ - optional higher-resolution (currently OS/2 only, cannot grok VMS code);
+ - outputs suggested profiler overhead;
+ - handles 'goto' too;
+ - handles PERL_DPROF_TICKS (on OS/2, VMS may be easily modified too)
+
+Jun 14, 97 andreas koenig adds the compatibility notes to the README
+and lets the Makefile.PL die on $] < 5.004.
+
+Jun 06, 97 andreas koenig applies a patch by gurusamy sarathy because
+Dean is not available for comments at that time. The patch is available
+from CPAN in the authors/id/GSAR directory for inspection.
+
+Sep 30, 96 dmr
+ DProf.xs
+ - added Ilya's patches to fix "&bar as &bar(@_)" bug. This also fixes
+ the coredumps people have seen when using this with 5.003+.
+ DProf.pm
+ - updated manpage
+ t/bug.t
+ - moved to test5
+ Makefile.PL
+ - remove special case for bug.t
+
+Jun 26, 96 dmr
+ dprofpp.PL
+ - smarter r.e. to find VERSION in Makefile (for MM5.27).
+ DProf.pm
+ - updated manpage
+ DProf.xs
+ - keep pid of profiled process, if process forks then only the
+ parent is profiled. Added test4 for this.
+
+Mar 2, 96 dmr
+ README
+ - updated
+ dprofpp
+ - updated manpage, point to DProf for raw profile description.
+ DProf.pm
+ - update manpage, update raw profile description with XS_VERSION.
+ - update manpage for AUTOLOAD changes.
+ DProf.xs
+ - smart handling of &AUTOLOAD--looks in $AUTOLOAD for the sub name.
+ this fixes one problem with corrupt profiles.
+
+Feb 5, 96 dmr
+ dprofpp
+ - updated manpage
+ - added -E/-I for exclusive/inclusive times
+ - added DPROFPP_OPTS -- lazily
+ - added -p/-Q for profile-then-analyze
+ - added version check
+ dprofpp.PL
+ - pull dprofpp's version id from the makefile
+ DProf.pm
+ - added version to bootstrap
+ - updated doc
+ - updated doc, DProf and -w are now friendly to each other
+ DProf.xs
+ - using savepv
+ - added Tim's patch to check for DBsub, avoids -MDevel::DProf coredump
+ - turn off warnings during newXS("DB::sub")
+ tests
+ - added Tim's patch to ignore Loader::import in results
+ - added Tim's patch to aid readability of test?.v output
+
+
+-- from those days when I kept a unique changelog for each module --
+
+# Devel::DProf - a Perl code profiler
+# 31oct95
+#
+# changes/bugs fixed since 5apr95 version -dmr:
+# -added VMS patches from CharlesB.
+# -now open ./tmon.out in BOOT.
+# changes/bugs fixed since 2apr95 version -dmr:
+# -now mallocing an extra byte for the \0 :)
+# changes/bugs fixed since 01mar95 version -dmr:
+# -stringified code ref is used for name of anonymous sub.
+# -include stash name with stringified code ref.
+# -use perl.c's DBsingle and DBsub.
+# -now using croak() and warn().
+# -print "timer is on" before turning timer on.
+# -use safefree() instead of free().
+# -rely on PM to provide full path name to tmon.out.
+# -print errno if unable to write tmon.out.
+# changes/bugs fixed since 03feb95 version -dmr:
+# -comments
+# changes/bugs fixed since 31dec94 version -dmr:
+# -added patches from AndyD.
+#
+
+# Devel::DProf - a Perl code profiler
+# 31oct95
+#
+# changes/bugs fixed since 05apr95 version -dmr:
+# - VMS-related prob; now let tmon.out name be handled in XS.
+# changes/bugs fixed since 01mar95 version -dmr:
+# - record $pwd and build pathname for tmon.out
+# changes/bugs fixed since 03feb95 version -dmr:
+# - fixed some doc bugs
+# - added require 5.000
+# - added -w note to bugs section of pod
+# changes/bugs fixed since 31dec94 version -dmr:
+# - podified
+#
+
+
+# dprofpp - display perl profile data
+# 31oct95
+#
+# changes/bugs fixed since 7oct95 version -dmr:
+# - PL'd
+# changes/bugs fixed since 5apr95 version -dmr:
+# - touch up handling of exit timestamps.
+# - suggests -F when exit timestamps are missing.
+# - added compressed execution tree patches from AchimB, put under -t.
+# now -z is the default action; user+system time.
+# - doc changes.
+# changes/bugs fixed since 10feb95 version -dmr:
+# - summary info is printed by default, opt_c is gone.
+# - fixed some doc bugs
+# - changed name to dprofpp
+# changes/bugs fixed since 03feb95 version -dmr:
+# - fixed division by zero.
+# - replace many local()s with my().
+# - now prints user+system times by default
+# now -u prints user time, -U prints unsorted.
+# - fixed documentation
+# - fixed output, to clarify that times are given in seconds.
+# - can now fake exit timestamps if the profile is garbled.
+# changes/bugs fixed since 17jun94 version -dmr:
+# - podified.
+# - correct old documentation flaws.
+# - added AndyD's patches.
+#
+
diff --git a/contrib/perl5/ext/Devel/DProf/DProf.pm b/contrib/perl5/ext/Devel/DProf/DProf.pm
new file mode 100644
index 0000000..38082fc
--- /dev/null
+++ b/contrib/perl5/ext/Devel/DProf/DProf.pm
@@ -0,0 +1,196 @@
+require 5.005_64;
+
+=head1 NAME
+
+Devel::DProf - a Perl code profiler
+
+=head1 SYNOPSIS
+
+ perl5 -d:DProf test.pl
+
+=head1 DESCRIPTION
+
+The Devel::DProf package is a Perl code profiler. This will collect
+information on the execution time of a Perl script and of the subs in that
+script. This information can be used to determine which subroutines are
+using the most time and which subroutines are being called most often. This
+information can also be used to create an execution graph of the script,
+showing subroutine relationships.
+
+To profile a Perl script run the perl interpreter with the B<-d> debugging
+switch. The profiler uses the debugging hooks. So to profile script
+F<test.pl> the following command should be used:
+
+ perl5 -d:DProf test.pl
+
+When the script terminates (or when the output buffer is filled) the
+profiler will dump the profile information to a file called
+F<tmon.out>. A tool like I<dprofpp> can be used to interpret the
+information which is in that profile. The following command will
+print the top 15 subroutines which used the most time:
+
+ dprofpp
+
+To print an execution graph of the subroutines in the script use the
+following command:
+
+ dprofpp -T
+
+Consult L<dprofpp> for other options.
+
+=head1 PROFILE FORMAT
+
+The old profile is a text file which looks like this:
+
+ #fOrTyTwO
+ $hz=100;
+ $XS_VERSION='DProf 19970606';
+ # All values are given in HZ
+ $rrun_utime=2; $rrun_stime=0; $rrun_rtime=7
+ PART2
+ + 26 28 566822884 DynaLoader::import
+ - 26 28 566822884 DynaLoader::import
+ + 27 28 566822885 main::bar
+ - 27 28 566822886 main::bar
+ + 27 28 566822886 main::baz
+ + 27 28 566822887 main::bar
+ - 27 28 566822888 main::bar
+ [....]
+
+The first line is the magic number. The second line is the hertz value, or
+clock ticks, of the machine where the profile was collected. The third line
+is the name and version identifier of the tool which created the profile.
+The fourth line is a comment. The fifth line contains three variables
+holding the user time, system time, and realtime of the process while it was
+being profiled. The sixth line indicates the beginning of the sub
+entry/exit profile section.
+
+The columns in B<PART2> are:
+
+ sub entry(+)/exit(-) mark
+ app's user time at sub entry/exit mark, in ticks
+ app's system time at sub entry/exit mark, in ticks
+ app's realtime at sub entry/exit mark, in ticks
+ fully-qualified sub name, when possible
+
+With newer perls another format is used, which may look like this:
+
+ #fOrTyTwO
+ $hz=10000;
+ $XS_VERSION='DProf 19971213';
+ # All values are given in HZ
+ $over_utime=5917; $over_stime=0; $over_rtime=5917;
+ $over_tests=10000;
+ $rrun_utime=1284; $rrun_stime=0; $rrun_rtime=1284;
+ $total_marks=6;
+
+ PART2
+ @ 406 0 406
+ & 2 main bar
+ + 2
+ @ 456 0 456
+ - 2
+ @ 1 0 1
+ & 3 main baz
+ + 3
+ @ 141 0 141
+ + 2
+ @ 141 0 141
+ - 2
+ @ 1 0 1
+ & 4 main foo
+ + 4
+ @ 142 0 142
+ + & Devel::DProf::write
+ @ 5 0 5
+ - & Devel::DProf::write
+
+(with high value of $ENV{PERL_DPROF_TICKS}).
+
+New C<$over_*> values show the measured overhead of making $over_tests
+calls to the profiler These values are used by the profiler to
+subtract the overhead from the runtimes.
+
+The lines starting with C<@> mark time passed from the previous C<@>
+line. The lines starting with C<&> introduce new subroutine I<id> and
+show the package and the subroutine name of this id. Lines starting
+with C<+>, C<-> and C<*> mark entering and exit of subroutines by
+I<id>s, and C<goto &subr>.
+
+The I<old-style> C<+>- and C<->-lines are used to mark the overhead
+related to writing to profiler-output file.
+
+=head1 AUTOLOAD
+
+When Devel::DProf finds a call to an C<&AUTOLOAD> subroutine it looks at the
+C<$AUTOLOAD> variable to find the real name of the sub being called. See
+L<perlsub/"Autoloading">.
+
+=head1 ENVIRONMENT
+
+C<PERL_DPROF_BUFFER> sets size of output buffer in words. Defaults to 2**14.
+
+C<PERL_DPROF_TICKS> sets number of ticks per second on some systems where
+a replacement for times() is used. Defaults to the value of C<HZ> macro.
+
+C<PERL_DPROF_OUT_FILE_NAME> sets the name of the output file. If not set,
+defaults to tmon.out.
+
+=head1 BUGS
+
+Builtin functions cannot be measured by Devel::DProf.
+
+With a newer Perl DProf relies on the fact that the numeric slot of
+$DB::sub contains an address of a subroutine. Excessive manipulation
+of this variable may overwrite this slot, as in
+
+ $DB::sub = 'current_sub';
+ ...
+ $addr = $DB::sub + 0;
+
+will set this numeric slot to numeric value of the string
+C<current_sub>, i.e., to C<0>. This will cause a segfault on the exit
+from this subroutine. Note that the first assignment above does not
+change the numeric slot (it will I<mark> it as invalid, but will not
+write over it).
+
+Mail bug reports and feature requests to the perl5-porters mailing list at
+F<E<lt>perl5-porters@perl.orgE<gt>>.
+
+=head1 SEE ALSO
+
+L<perl>, L<dprofpp>, times(2)
+
+=cut
+
+# This sub is needed for calibration.
+package Devel::DProf;
+
+sub NONESUCH_noxs {
+ return $Devel::DProf::VERSION;
+}
+
+package DB;
+
+#
+# As of perl5.003_20, &DB::sub stub is not needed (some versions
+# even had problems if stub was redefined with XS version).
+#
+
+# disable DB single-stepping
+BEGIN { $single = 0; }
+
+# This sub is needed during startup.
+sub DB {
+# print "nonXS DBDB\n";
+}
+
+use XSLoader ();
+
+# Underscore to allow older Perls to access older version from CPAN
+$Devel::DProf::VERSION = '20000000.00_00'; # this version not authorized by
+ # Dean Roehrich. See "Changes" file.
+
+XSLoader::load 'Devel::DProf', $Devel::DProf::VERSION;
+
+1;
diff --git a/contrib/perl5/ext/Devel/DProf/DProf.xs b/contrib/perl5/ext/Devel/DProf/DProf.xs
new file mode 100644
index 0000000..31e984f
--- /dev/null
+++ b/contrib/perl5/ext/Devel/DProf/DProf.xs
@@ -0,0 +1,689 @@
+#define PERL_NO_GET_CONTEXT
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+/* For older Perls */
+#ifndef dTHR
+# define dTHR int dummy_thr
+#endif /* dTHR */
+
+/*#define DBG_SUB 1 */
+/*#define DBG_TIMER 1 */
+
+#ifdef DBG_SUB
+# define DBG_SUB_NOTIFY(A,B) warn(A, B)
+#else
+# define DBG_SUB_NOTIFY(A,B) /* nothing */
+#endif
+
+#ifdef DBG_TIMER
+# define DBG_TIMER_NOTIFY(A) warn(A)
+#else
+# define DBG_TIMER_NOTIFY(A) /* nothing */
+#endif
+
+/* HZ == clock ticks per second */
+#ifdef VMS
+# define HZ ((I32)CLK_TCK)
+# define DPROF_HZ HZ
+# include <starlet.h> /* prototype for sys$gettim() */
+# define Times(ptr) (dprof_times(aTHX_ ptr))
+#else
+# ifndef HZ
+# ifdef CLK_TCK
+# define HZ ((I32)CLK_TCK)
+# else
+# define HZ 60
+# endif
+# endif
+# ifdef OS2 /* times() has significant overhead */
+# define Times(ptr) (dprof_times(aTHX_ ptr))
+# define INCL_DOSPROFILE
+# define INCL_DOSERRORS
+# include <os2.h>
+# define toLongLong(arg) (*(long long*)&(arg))
+# define DPROF_HZ g_dprof_ticks
+# else
+# define Times(ptr) (times(ptr))
+# define DPROF_HZ HZ
+# endif
+#endif
+
+XS(XS_Devel__DProf_END); /* used by prof_mark() */
+
+/* Everything is built on times(2). See its manpage for a description
+ * of the timings.
+ */
+
+union prof_any {
+ clock_t tms_utime; /* cpu time spent in user space */
+ clock_t tms_stime; /* cpu time spent in system */
+ clock_t realtime; /* elapsed real time, in ticks */
+ char *name;
+ U32 id;
+ opcode ptype;
+};
+
+typedef union prof_any PROFANY;
+
+typedef struct {
+ U32 dprof_ticks;
+ char* out_file_name; /* output file (defaults to tmon.out) */
+ PerlIO* fp; /* pointer to tmon.out file */
+ long TIMES_LOCATION; /* Where in the file to store the time totals */
+ int SAVE_STACK; /* How much data to buffer until end of run */
+ int prof_pid; /* pid of profiled process */
+ struct tms prof_start;
+ struct tms prof_end;
+ clock_t rprof_start; /* elapsed real time ticks */
+ clock_t rprof_end;
+ clock_t wprof_u;
+ clock_t wprof_s;
+ clock_t wprof_r;
+ clock_t otms_utime;
+ clock_t otms_stime;
+ clock_t orealtime;
+ PROFANY* profstack;
+ int profstack_max;
+ int profstack_ix;
+ HV* cv_hash;
+ U32 total;
+ U32 lastid;
+ U32 default_perldb;
+ U32 depth;
+#ifdef OS2
+ ULONG frequ;
+ long long start_cnt;
+#endif
+#ifdef PERL_IMPLICIT_CONTEXT
+# define register
+ pTHX;
+# undef register
+#endif
+} prof_state_t;
+
+prof_state_t g_prof_state;
+
+#define g_dprof_ticks g_prof_state.dprof_ticks
+#define g_out_file_name g_prof_state.out_file_name
+#define g_fp g_prof_state.fp
+#define g_TIMES_LOCATION g_prof_state.TIMES_LOCATION
+#define g_SAVE_STACK g_prof_state.SAVE_STACK
+#define g_prof_pid g_prof_state.prof_pid
+#define g_prof_start g_prof_state.prof_start
+#define g_prof_end g_prof_state.prof_end
+#define g_rprof_start g_prof_state.rprof_start
+#define g_rprof_end g_prof_state.rprof_end
+#define g_wprof_u g_prof_state.wprof_u
+#define g_wprof_s g_prof_state.wprof_s
+#define g_wprof_r g_prof_state.wprof_r
+#define g_otms_utime g_prof_state.otms_utime
+#define g_otms_stime g_prof_state.otms_stime
+#define g_orealtime g_prof_state.orealtime
+#define g_profstack g_prof_state.profstack
+#define g_profstack_max g_prof_state.profstack_max
+#define g_profstack_ix g_prof_state.profstack_ix
+#define g_cv_hash g_prof_state.cv_hash
+#define g_total g_prof_state.total
+#define g_lastid g_prof_state.lastid
+#define g_default_perldb g_prof_state.default_perldb
+#define g_depth g_prof_state.depth
+#ifdef PERL_IMPLICIT_CONTEXT
+# define g_THX g_prof_state.aTHX
+#endif
+#ifdef OS2
+# define g_frequ g_prof_state.frequ
+# define g_start_cnt g_prof_state.start_cnt
+#endif
+
+clock_t
+dprof_times(pTHX_ struct tms *t)
+{
+#ifdef OS2
+ ULONG rc;
+ QWORD cnt;
+ STRLEN n_a;
+
+ if (!g_frequ) {
+ if (CheckOSError(DosTmrQueryFreq(&g_frequ)))
+ croak("DosTmrQueryFreq: %s", SvPV(perl_get_sv("!",TRUE),n_a));
+ else
+ g_frequ = g_frequ/DPROF_HZ; /* count per tick */
+ if (CheckOSError(DosTmrQueryTime(&cnt)))
+ croak("DosTmrQueryTime: %s",
+ SvPV(perl_get_sv("!",TRUE), n_a));
+ g_start_cnt = toLongLong(cnt);
+ }
+
+ if (CheckOSError(DosTmrQueryTime(&cnt)))
+ croak("DosTmrQueryTime: %s", SvPV(perl_get_sv("!",TRUE), n_a));
+ t->tms_stime = 0;
+ return (t->tms_utime = (toLongLong(cnt) - g_start_cnt)/g_frequ);
+#else /* !OS2 */
+# ifdef VMS
+ clock_t retval;
+ /* Get wall time and convert to 10 ms intervals to
+ * produce the return value dprof expects */
+# if defined(__DECC) && defined (__ALPHA)
+# include <ints.h>
+ uint64 vmstime;
+ _ckvmssts(sys$gettim(&vmstime));
+ vmstime /= 100000;
+ retval = vmstime & 0x7fffffff;
+# else
+ /* (Older hw or ccs don't have an atomic 64-bit type, so we
+ * juggle 32-bit ints (and a float) to produce a time_t result
+ * with minimal loss of information.) */
+ long int vmstime[2],remainder,divisor = 100000;
+ _ckvmssts(sys$gettim((unsigned long int *)vmstime));
+ vmstime[1] &= 0x7fff; /* prevent overflow in EDIV */
+ _ckvmssts(lib$ediv(&divisor,vmstime,(long int *)&retval,&remainder));
+# endif
+ /* Fill in the struct tms using the CRTL routine . . .*/
+ times((tbuffer_t *)t);
+ return (clock_t) retval;
+# else /* !VMS && !OS2 */
+ return times(t);
+# endif
+#endif
+}
+
+static void
+prof_dumpa(pTHX_ opcode ptype, U32 id)
+{
+ if (ptype == OP_LEAVESUB) {
+ PerlIO_printf(g_fp,"- %"UVxf"\n", (UV)id);
+ }
+ else if(ptype == OP_ENTERSUB) {
+ PerlIO_printf(g_fp,"+ %"UVxf"\n", (UV)id);
+ }
+ else if(ptype == OP_GOTO) {
+ PerlIO_printf(g_fp,"* %"UVxf"\n", (UV)id);
+ }
+ else if(ptype == OP_DIE) {
+ PerlIO_printf(g_fp,"/ %"UVxf"\n", (UV)id);
+ }
+ else {
+ PerlIO_printf(g_fp,"Profiler unknown prof code %d\n", ptype);
+ }
+}
+
+static void
+prof_dumps(pTHX_ U32 id, char *pname, char *gname)
+{
+ PerlIO_printf(g_fp,"& %"UVxf" %s %s\n", (UV)id, pname, gname);
+}
+
+static void
+prof_dumpt(pTHX_ long tms_utime, long tms_stime, long realtime)
+{
+ PerlIO_printf(g_fp,"@ %ld %ld %ld\n", tms_utime, tms_stime, realtime);
+}
+
+static void
+prof_dump_until(pTHX_ long ix)
+{
+ long base = 0;
+ struct tms t1, t2;
+ clock_t realtime1, realtime2;
+
+ realtime1 = Times(&t1);
+
+ while (base < ix) {
+ opcode ptype = g_profstack[base++].ptype;
+ if (ptype == OP_TIME) {
+ long tms_utime = g_profstack[base++].tms_utime;
+ long tms_stime = g_profstack[base++].tms_stime;
+ long realtime = g_profstack[base++].realtime;
+
+ prof_dumpt(aTHX_ tms_utime, tms_stime, realtime);
+ }
+ else if (ptype == OP_GV) {
+ U32 id = g_profstack[base++].id;
+ char *pname = g_profstack[base++].name;
+ char *gname = g_profstack[base++].name;
+
+ prof_dumps(aTHX_ id, pname, gname);
+ }
+ else {
+ U32 id = g_profstack[base++].id;
+ prof_dumpa(aTHX_ ptype, id);
+ }
+ }
+ PerlIO_flush(g_fp);
+ realtime2 = Times(&t2);
+ if (realtime2 != realtime1 || t1.tms_utime != t2.tms_utime
+ || t1.tms_stime != t2.tms_stime) {
+ g_wprof_r += realtime2 - realtime1;
+ g_wprof_u += t2.tms_utime - t1.tms_utime;
+ g_wprof_s += t2.tms_stime - t1.tms_stime;
+
+ PerlIO_printf(g_fp,"+ & Devel::DProf::write\n");
+ PerlIO_printf(g_fp,"@ %"IVdf" %"IVdf" %"IVdf"\n",
+ /* The (IV) casts are one possibility:
+ * the Painfully Correct Way would be to
+ * have Clock_t_f. */
+ (IV)(t2.tms_utime - t1.tms_utime),
+ (IV)(t2.tms_stime - t1.tms_stime),
+ (IV)(realtime2 - realtime1));
+ PerlIO_printf(g_fp,"- & Devel::DProf::write\n");
+ g_otms_utime = t2.tms_utime;
+ g_otms_stime = t2.tms_stime;
+ g_orealtime = realtime2;
+ PerlIO_flush(g_fp);
+ }
+}
+
+static void
+prof_mark(pTHX_ opcode ptype)
+{
+ struct tms t;
+ clock_t realtime, rdelta, udelta, sdelta;
+ char *name, *pv;
+ char *hvname;
+ STRLEN len;
+ SV *sv;
+ U32 id;
+ SV *Sub = GvSV(PL_DBsub); /* name of current sub */
+
+ if (g_SAVE_STACK) {
+ if (g_profstack_ix + 5 > g_profstack_max) {
+ g_profstack_max = g_profstack_max * 3 / 2;
+ Renew(g_profstack, g_profstack_max, PROFANY);
+ }
+ }
+
+ realtime = Times(&t);
+ rdelta = realtime - g_orealtime;
+ udelta = t.tms_utime - g_otms_utime;
+ sdelta = t.tms_stime - g_otms_stime;
+ if (rdelta || udelta || sdelta) {
+ if (g_SAVE_STACK) {
+ g_profstack[g_profstack_ix++].ptype = OP_TIME;
+ g_profstack[g_profstack_ix++].tms_utime = udelta;
+ g_profstack[g_profstack_ix++].tms_stime = sdelta;
+ g_profstack[g_profstack_ix++].realtime = rdelta;
+ }
+ else { /* Write it to disk now so's not to eat up core */
+ if (g_prof_pid == (int)getpid()) {
+ prof_dumpt(aTHX_ udelta, sdelta, rdelta);
+ PerlIO_flush(g_fp);
+ }
+ }
+ g_orealtime = realtime;
+ g_otms_stime = t.tms_stime;
+ g_otms_utime = t.tms_utime;
+ }
+
+ {
+ SV **svp;
+ char *gname, *pname;
+ CV *cv;
+
+ cv = INT2PTR(CV*,SvIVX(Sub));
+ svp = hv_fetch(g_cv_hash, (char*)&cv, sizeof(CV*), TRUE);
+ if (!SvOK(*svp)) {
+ GV *gv = CvGV(cv);
+
+ sv_setiv(*svp, id = ++g_lastid);
+ pname = ((GvSTASH(gv) && HvNAME(GvSTASH(gv)))
+ ? HvNAME(GvSTASH(gv))
+ : "(null)");
+ gname = GvNAME(gv);
+ if (CvXSUB(cv) == XS_Devel__DProf_END)
+ return;
+ if (g_SAVE_STACK) { /* Store it for later recording -JH */
+ g_profstack[g_profstack_ix++].ptype = OP_GV;
+ g_profstack[g_profstack_ix++].id = id;
+ g_profstack[g_profstack_ix++].name = pname;
+ g_profstack[g_profstack_ix++].name = gname;
+ }
+ else { /* Write it to disk now so's not to eat up core */
+ /* Only record the parent's info */
+ if (g_prof_pid == (int)getpid()) {
+ prof_dumps(aTHX_ id, pname, gname);
+ PerlIO_flush(g_fp);
+ }
+ else
+ PL_perldb = 0; /* Do not debug the kid. */
+ }
+ }
+ else {
+ id = SvIV(*svp);
+ }
+ }
+
+ g_total++;
+ if (g_SAVE_STACK) { /* Store it for later recording -JH */
+ g_profstack[g_profstack_ix++].ptype = ptype;
+ g_profstack[g_profstack_ix++].id = id;
+
+ /* Only record the parent's info */
+ if (g_SAVE_STACK < g_profstack_ix) {
+ if (g_prof_pid == (int)getpid())
+ prof_dump_until(aTHX_ g_profstack_ix);
+ else
+ PL_perldb = 0; /* Do not debug the kid. */
+ g_profstack_ix = 0;
+ }
+ }
+ else { /* Write it to disk now so's not to eat up core */
+
+ /* Only record the parent's info */
+ if (g_prof_pid == (int)getpid()) {
+ prof_dumpa(aTHX_ ptype, id);
+ PerlIO_flush(g_fp);
+ }
+ else
+ PL_perldb = 0; /* Do not debug the kid. */
+ }
+}
+
+#ifdef PL_NEEDED
+# define defstash PL_defstash
+#endif
+
+/* Counts overhead of prof_mark and extra XS call. */
+static void
+test_time(pTHX_ clock_t *r, clock_t *u, clock_t *s)
+{
+ dTHR;
+ CV *cv = perl_get_cv("Devel::DProf::NONESUCH_noxs", FALSE);
+ int i, j, k = 0;
+ HV *oldstash = PL_curstash;
+ struct tms t1, t2;
+ clock_t realtime1, realtime2;
+ U32 ototal = g_total;
+ U32 ostack = g_SAVE_STACK;
+ U32 operldb = PL_perldb;
+
+ g_SAVE_STACK = 1000000;
+ realtime1 = Times(&t1);
+
+ while (k < 2) {
+ i = 0;
+ /* Disable debugging of perl_call_sv on second pass: */
+ PL_curstash = (k == 0 ? PL_defstash : PL_debstash);
+ PL_perldb = g_default_perldb;
+ while (++i <= 100) {
+ j = 0;
+ g_profstack_ix = 0; /* Do not let the stack grow */
+ while (++j <= 100) {
+/* prof_mark(aTHX_ OP_ENTERSUB); */
+
+ PUSHMARK(PL_stack_sp);
+ perl_call_sv((SV*)cv, G_SCALAR);
+ PL_stack_sp--;
+/* prof_mark(aTHX_ OP_LEAVESUB); */
+ }
+ }
+ PL_curstash = oldstash;
+ if (k == 0) { /* Put time with debugging */
+ realtime2 = Times(&t2);
+ *r = realtime2 - realtime1;
+ *u = t2.tms_utime - t1.tms_utime;
+ *s = t2.tms_stime - t1.tms_stime;
+ }
+ else { /* Subtract time without debug */
+ realtime1 = Times(&t1);
+ *r -= realtime1 - realtime2;
+ *u -= t1.tms_utime - t2.tms_utime;
+ *s -= t1.tms_stime - t2.tms_stime;
+ }
+ k++;
+ }
+ g_total = ototal;
+ g_SAVE_STACK = ostack;
+ PL_perldb = operldb;
+}
+
+static void
+prof_recordheader(pTHX)
+{
+ clock_t r, u, s;
+
+ /* g_fp is opened in the BOOT section */
+ PerlIO_printf(g_fp, "#fOrTyTwO\n");
+ PerlIO_printf(g_fp, "$hz=%"IVdf";\n", (IV)DPROF_HZ);
+ PerlIO_printf(g_fp, "$XS_VERSION='DProf %s';\n", XS_VERSION);
+ PerlIO_printf(g_fp, "# All values are given in HZ\n");
+ test_time(aTHX_ &r, &u, &s);
+ PerlIO_printf(g_fp,
+ "$over_utime=%"IVdf"; $over_stime=%"IVdf"; $over_rtime=%"IVdf";\n",
+ /* The (IV) casts are one possibility:
+ * the Painfully Correct Way would be to
+ * have Clock_t_f. */
+ (IV)u, (IV)s, (IV)r);
+ PerlIO_printf(g_fp, "$over_tests=10000;\n");
+
+ g_TIMES_LOCATION = PerlIO_tell(g_fp);
+
+ /* Pad with whitespace. */
+ /* This should be enough even for very large numbers. */
+ PerlIO_printf(g_fp, "%*s\n", 240 , "");
+
+ PerlIO_printf(g_fp, "\n");
+ PerlIO_printf(g_fp, "PART2\n");
+
+ PerlIO_flush(g_fp);
+}
+
+static void
+prof_record(pTHX)
+{
+ /* g_fp is opened in the BOOT section */
+
+ /* Now that we know the runtimes, fill them in at the recorded
+ location -JH */
+
+ clock_t r, u, s;
+
+ if (g_SAVE_STACK) {
+ prof_dump_until(aTHX_ g_profstack_ix);
+ }
+ PerlIO_seek(g_fp, g_TIMES_LOCATION, SEEK_SET);
+ /* Write into reserved 240 bytes: */
+ PerlIO_printf(g_fp,
+ "$rrun_utime=%"IVdf"; $rrun_stime=%"IVdf"; $rrun_rtime=%"IVdf";",
+ /* The (IV) casts are one possibility:
+ * the Painfully Correct Way would be to
+ * have Clock_t_f. */
+ (IV)(g_prof_end.tms_utime-g_prof_start.tms_utime-g_wprof_u),
+ (IV)(g_prof_end.tms_stime-g_prof_start.tms_stime-g_wprof_s),
+ (IV)(g_rprof_end-g_rprof_start-g_wprof_r));
+ PerlIO_printf(g_fp, "\n$total_marks=%"IVdf, (IV)g_total);
+
+ PerlIO_close(g_fp);
+}
+
+#define NONESUCH()
+
+static void
+check_depth(pTHX_ void *foo)
+{
+ U32 need_depth = (U32)foo;
+ if (need_depth != g_depth) {
+ if (need_depth > g_depth) {
+ warn("garbled call depth when profiling");
+ }
+ else {
+ I32 marks = g_depth - need_depth;
+
+/* warn("Check_depth: got %d, expected %d\n", g_depth, need_depth); */
+ while (marks--) {
+ prof_mark(aTHX_ OP_DIE);
+ }
+ g_depth = need_depth;
+ }
+ }
+}
+
+#define for_real
+#ifdef for_real
+
+XS(XS_DB_sub)
+{
+ dXSARGS;
+ dORIGMARK;
+ SV *Sub = GvSV(PL_DBsub); /* name of current sub */
+
+#ifdef PERL_IMPLICIT_CONTEXT
+ /* profile only the interpreter that loaded us */
+ if (g_THX != aTHX) {
+ PUSHMARK(ORIGMARK);
+ perl_call_sv(INT2PTR(SV*,SvIV(Sub)), GIMME | G_NODEBUG);
+ }
+ else
+#endif
+ {
+ HV *oldstash = PL_curstash;
+
+ DBG_SUB_NOTIFY("XS DBsub(%s)\n", SvPV_nolen(Sub));
+
+ SAVEDESTRUCTOR_X(check_depth, (void*)g_depth);
+ g_depth++;
+
+ prof_mark(aTHX_ OP_ENTERSUB);
+ PUSHMARK(ORIGMARK);
+ perl_call_sv(INT2PTR(SV*,SvIV(Sub)), GIMME | G_NODEBUG);
+ prof_mark(aTHX_ OP_LEAVESUB);
+ g_depth--;
+ }
+ return;
+}
+
+XS(XS_DB_goto)
+{
+#ifdef PERL_IMPLICIT_CONTEXT
+ if (g_THX == aTHX)
+#endif
+ {
+ prof_mark(aTHX_ OP_GOTO);
+ return;
+ }
+}
+
+#endif /* for_real */
+
+#ifdef testing
+
+ MODULE = Devel::DProf PACKAGE = DB
+
+ void
+ sub(...)
+ PPCODE:
+ {
+ dORIGMARK;
+ HV *oldstash = PL_curstash;
+ SV *Sub = GvSV(PL_DBsub); /* name of current sub */
+ /* SP -= items; added by xsubpp */
+ DBG_SUB_NOTIFY("XS DBsub(%s)\n", SvPV_nolen(Sub));
+
+ sv_setiv(PL_DBsingle, 0); /* disable DB single-stepping */
+
+ prof_mark(aTHX_ OP_ENTERSUB);
+ PUSHMARK(ORIGMARK);
+
+ PL_curstash = PL_debstash; /* To disable debugging of perl_call_sv */
+ perl_call_sv(Sub, GIMME);
+ PL_curstash = oldstash;
+
+ prof_mark(aTHX_ OP_LEAVESUB);
+ SPAGAIN;
+ /* PUTBACK; added by xsubpp */
+ }
+
+#endif /* testing */
+
+MODULE = Devel::DProf PACKAGE = Devel::DProf
+
+void
+END()
+PPCODE:
+ {
+ if (PL_DBsub) {
+ /* maybe the process forked--we want only
+ * the parent's profile.
+ */
+ if (
+#ifdef PERL_IMPLICIT_CONTEXT
+ g_THX == aTHX &&
+#endif
+ g_prof_pid == (int)getpid())
+ {
+ g_rprof_end = Times(&g_prof_end);
+ DBG_TIMER_NOTIFY("Profiler timer is off.\n");
+ prof_record(aTHX);
+ }
+ }
+ }
+
+void
+NONESUCH()
+
+BOOT:
+ {
+ g_TIMES_LOCATION = 42;
+ g_SAVE_STACK = 1<<14;
+ g_profstack_max = 128;
+#ifdef PERL_IMPLICIT_CONTEXT
+ g_THX = aTHX;
+#endif
+
+ /* Before we go anywhere make sure we were invoked
+ * properly, else we'll dump core.
+ */
+ if (!PL_DBsub)
+ croak("DProf: run perl with -d to use DProf.\n");
+
+ /* When we hook up the XS DB::sub we'll be redefining
+ * the DB::sub from the PM file. Turn off warnings
+ * while we do this.
+ */
+ {
+ I32 warn_tmp = PL_dowarn;
+ PL_dowarn = 0;
+ newXS("DB::sub", XS_DB_sub, file);
+ newXS("DB::goto", XS_DB_goto, file);
+ PL_dowarn = warn_tmp;
+ }
+
+ sv_setiv(PL_DBsingle, 0); /* disable DB single-stepping */
+
+ {
+ char *buffer = getenv("PERL_DPROF_BUFFER");
+
+ if (buffer) {
+ g_SAVE_STACK = atoi(buffer);
+ }
+
+ buffer = getenv("PERL_DPROF_TICKS");
+
+ if (buffer) {
+ g_dprof_ticks = atoi(buffer); /* Used under OS/2 only */
+ }
+ else {
+ g_dprof_ticks = HZ;
+ }
+
+ buffer = getenv("PERL_DPROF_OUT_FILE_NAME");
+ g_out_file_name = savepv(buffer ? buffer : "tmon.out");
+ }
+
+ if ((g_fp = PerlIO_open(g_out_file_name, "w")) == NULL)
+ croak("DProf: unable to write '%s', errno = %d\n",
+ g_out_file_name, errno);
+
+ g_default_perldb = PERLDBf_NONAME | PERLDBf_SUB | PERLDBf_GOTO;
+ g_cv_hash = newHV();
+ g_prof_pid = (int)getpid();
+
+ New(0, g_profstack, g_profstack_max, PROFANY);
+ prof_recordheader(aTHX);
+ DBG_TIMER_NOTIFY("Profiler timer is on.\n");
+ g_orealtime = g_rprof_start = Times(&g_prof_start);
+ g_otms_utime = g_prof_start.tms_utime;
+ g_otms_stime = g_prof_start.tms_stime;
+ PL_perldb = g_default_perldb;
+ }
diff --git a/contrib/perl5/ext/Devel/DProf/Makefile.PL b/contrib/perl5/ext/Devel/DProf/Makefile.PL
new file mode 100644
index 0000000..667cc52
--- /dev/null
+++ b/contrib/perl5/ext/Devel/DProf/Makefile.PL
@@ -0,0 +1,17 @@
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+ NAME => 'Devel::DProf',
+ DISTNAME => 'DProf',
+ VERSION_FROM => 'DProf.pm',
+ clean => { 'FILES' => 'tmon.out t/tmon.out t/err'},
+ XSPROTOARG => '-noprototypes',
+ DEFINE => '-DPERLDBf_NONAME=0x40 -DPERLDBf_GOTO=0x80 '
+ .'-DG_NODEBUG=32 -DPL_NEEDED',
+ dist => {
+ COMPRESS => 'gzip -9f',
+ SUFFIX => 'gz',
+ DIST_DEFAULT => 'all tardist',
+ },
+ MAN3PODS => {},
+);
diff --git a/contrib/perl5/ext/Devel/DProf/Todo b/contrib/perl5/ext/Devel/DProf/Todo
new file mode 100644
index 0000000..0e00347
--- /dev/null
+++ b/contrib/perl5/ext/Devel/DProf/Todo
@@ -0,0 +1,13 @@
+- work on test suite.
+- localize the depth to guard against non-local exits.
+Current overhead (with PERLDBf_NONAME) wrt non-debugging run (estimates):
+ 8% extra call frame on DB::sub
+ 7% output of subroutine data
+ 70% output of timing data (on OS/2, 35% with custom dprof_times())
+(Additional 17% are spent to write the output, but they are counted
+ and subtracted.)
+
+With compensation for DProf overhead all but some odd 12% are subtracted ?!
+
+- Calculate overhead/count for XS calls and Perl calls separately.
+- goto &XSUB in pp_ctl.c;
diff --git a/contrib/perl5/ext/Devel/Peek/Changes b/contrib/perl5/ext/Devel/Peek/Changes
new file mode 100644
index 0000000..e143f87
--- /dev/null
+++ b/contrib/perl5/ext/Devel/Peek/Changes
@@ -0,0 +1,64 @@
+0.3: Some functions return SV * now.
+0.4: Hashes dumped recursively.
+ Additional fields for CV added.
+0.5: Prototypes for functions supported.
+ Strings are consostently in quotes now.
+ Name changed to Devel::Peek (former ExtUtils::Peek).
+0.7:
+ New function mstat added.
+ Docs added (thanks to Dean Roehrich).
+
+0.8:
+ Exports Dump and mstat.
+ Docs list more details.
+ Arrays print addresses of SV.
+ CV: STASH renamed to COMP_STASH. The package of GV is printed now.
+ Updated for newer overloading implementation (but will not report
+ packages with overloading).
+0.81:
+ Implements and exports DeadCode().
+ Buglet in the definition of mstat for malloc-less perl corrected.
+0.82:
+ New style PADless CV allowed.
+0.83:
+ DumpArray added.
+ Compatible with PerlIO.
+ When calculating junk inside subs, divide by refcount.
+0.84:
+ Indented output.
+0.85:
+ By Gisle Aas: format SvPVX, print magic (but not unrefcounted mg_obj);
+ A lot of new fields stolen from sv_dump();
+0.86:
+ By Gisle Aas:
+ - Updated the documentation.
+ - Move string printer to it's own function: fprintpv()
+ - Use it to print PVs, HV keys, MG_PTR
+ - Don't print IV for hashes as KEY is the same field
+ - Tag GvSTASH as "GvSTASH" in order to not confuse it with
+ the other STASH field, e.g. Dump(bless \*foo, "bar")
+0.87:
+ Extra indentation of SvRV.
+ AMAGIC removed.
+ Head of OOK data printed too.
+0.88:
+ PADLIST and OUTSIDE of CVs itemized.
+ Prints the value of the hash of HV keys.
+ Changes by Gisle: do not print both if AvARRAY == AvALLOC;
+ print hash fill statistics.
+0.89:
+ Changes by Gisle: optree dump.
+0.90:
+ DumpWithOP, DumpProg exported.
+ Better indent for AV, HV elts.
+ Address of SV printed.
+ Corrected Zero code which was causing segfaults.
+0.91:
+ Compiles, runs test under 5.005beta2.
+ Update DEBUGGING_MSTATS-less MSTATS.
+0.92:
+ Should compile without MYMALLOC too.
+0.94:
+ Had problems with HEf_SVKEY magic.
+0.95:
+ Added "hash quality" output to estimate Perl's hash functions.
diff --git a/contrib/perl5/ext/Devel/Peek/Makefile.PL b/contrib/perl5/ext/Devel/Peek/Makefile.PL
new file mode 100644
index 0000000..3c6dbf5
--- /dev/null
+++ b/contrib/perl5/ext/Devel/Peek/Makefile.PL
@@ -0,0 +1,11 @@
+use ExtUtils::MakeMaker;
+WriteMakefile(
+ NAME => "Devel::Peek",
+ VERSION_FROM => 'Peek.pm',
+ 'dist' => {
+ COMPRESS => 'gzip -9f',
+ SUFFIX => 'gz',
+ DIST_DEFAULT => 'all tardist',
+ },
+ MAN3PODS => {},
+);
diff --git a/contrib/perl5/ext/Devel/Peek/Peek.pm b/contrib/perl5/ext/Devel/Peek/Peek.pm
new file mode 100644
index 0000000..080251b
--- /dev/null
+++ b/contrib/perl5/ext/Devel/Peek/Peek.pm
@@ -0,0 +1,432 @@
+# Devel::Peek - A data debugging tool for the XS programmer
+# The documentation is after the __END__
+
+package Devel::Peek;
+
+# Underscore to allow older Perls to access older version from CPAN
+$VERSION = '1.00_01';
+
+require Exporter;
+use XSLoader ();
+
+@ISA = qw(Exporter);
+@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg);
+@EXPORT_OK = qw(SvREFCNT SvREFCNT_inc SvREFCNT_dec CvGV);
+%EXPORT_TAGS = ('ALL' => [@EXPORT, @EXPORT_OK]);
+
+XSLoader::load 'Devel::Peek';
+
+sub DumpWithOP ($;$) {
+ local($Devel::Peek::dump_ops)=1;
+ my $depth = @_ > 1 ? $_[1] : 4 ;
+ Dump($_[0],$depth);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Devel::Peek - A data debugging tool for the XS programmer
+
+=head1 SYNOPSIS
+
+ use Devel::Peek;
+ Dump( $a );
+ Dump( $a, 5 );
+ DumpArray( 5, $a, $b, ... );
+ mstat "Point 5";
+
+=head1 DESCRIPTION
+
+Devel::Peek contains functions which allows raw Perl datatypes to be
+manipulated from a Perl script. This is used by those who do XS programming
+to check that the data they are sending from C to Perl looks as they think
+it should look. The trick, then, is to know what the raw datatype is
+supposed to look like when it gets to Perl. This document offers some tips
+and hints to describe good and bad raw data.
+
+It is very possible that this document will fall far short of being useful
+to the casual reader. The reader is expected to understand the material in
+the first few sections of L<perlguts>.
+
+Devel::Peek supplies a C<Dump()> function which can dump a raw Perl
+datatype, and C<mstat("marker")> function to report on memory usage
+(if perl is compiled with corresponding option). The function
+DeadCode() provides statistics on the data "frozen" into inactive
+C<CV>. Devel::Peek also supplies C<SvREFCNT()>, C<SvREFCNT_inc()>, and
+C<SvREFCNT_dec()> which can query, increment, and decrement reference
+counts on SVs. This document will take a passive, and safe, approach
+to data debugging and for that it will describe only the C<Dump()>
+function. For format of output of mstats() see
+L<perldebug/Using C<$ENV{PERL_DEBUG_MSTATS}>>.
+
+Function C<DumpArray()> allows dumping of multiple values (useful when you
+need to analize returns of functions).
+
+The global variable $Devel::Peek::pv_limit can be set to limit the
+number of character printed in various string values. Setting it to 0
+means no limit.
+
+=head1 EXAMPLES
+
+The following examples don't attempt to show everything as that would be a
+monumental task, and, frankly, we don't want this manpage to be an internals
+document for Perl. The examples do demonstrate some basics of the raw Perl
+datatypes, and should suffice to get most determined people on their way.
+There are no guidewires or safety nets, nor blazed trails, so be prepared to
+travel alone from this point and on and, if at all possible, don't fall into
+the quicksand (it's bad for business).
+
+Oh, one final bit of advice: take L<perlguts> with you. When you return we
+expect to see it well-thumbed.
+
+=head2 A simple scalar string
+
+Let's begin by looking a simple scalar which is holding a string.
+
+ use Devel::Peek;
+ $a = "hello";
+ Dump $a;
+
+The output:
+
+ SV = PVIV(0xbc288)
+ REFCNT = 1
+ FLAGS = (POK,pPOK)
+ IV = 0
+ PV = 0xb2048 "hello"\0
+ CUR = 5
+ LEN = 6
+
+This says C<$a> is an SV, a scalar. The scalar is a PVIV, a string.
+Its reference count is 1. It has the C<POK> flag set, meaning its
+current PV field is valid. Because POK is set we look at the PV item
+to see what is in the scalar. The \0 at the end indicate that this
+PV is properly NUL-terminated.
+If the FLAGS had been IOK we would look
+at the IV item. CUR indicates the number of characters in the PV.
+LEN indicates the number of bytes requested for the PV (one more than
+CUR, in this case, because LEN includes an extra byte for the
+end-of-string marker).
+
+=head2 A simple scalar number
+
+If the scalar contains a number the raw SV will be leaner.
+
+ use Devel::Peek;
+ $a = 42;
+ Dump $a;
+
+The output:
+
+ SV = IV(0xbc818)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+This says C<$a> is an SV, a scalar. The scalar is an IV, a number. Its
+reference count is 1. It has the C<IOK> flag set, meaning it is currently
+being evaluated as a number. Because IOK is set we look at the IV item to
+see what is in the scalar.
+
+=head2 A simple scalar with an extra reference
+
+If the scalar from the previous example had an extra reference:
+
+ use Devel::Peek;
+ $a = 42;
+ $b = \$a;
+ Dump $a;
+
+The output:
+
+ SV = IV(0xbe860)
+ REFCNT = 2
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+Notice that this example differs from the previous example only in its
+reference count. Compare this to the next example, where we dump C<$b>
+instead of C<$a>.
+
+=head2 A reference to a simple scalar
+
+This shows what a reference looks like when it references a simple scalar.
+
+ use Devel::Peek;
+ $a = 42;
+ $b = \$a;
+ Dump $b;
+
+The output:
+
+ SV = RV(0xf041c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xbab08
+ SV = IV(0xbe860)
+ REFCNT = 2
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+Starting from the top, this says C<$b> is an SV. The scalar is an RV, a
+reference. It has the C<ROK> flag set, meaning it is a reference. Because
+ROK is set we have an RV item rather than an IV or PV. Notice that Dump
+follows the reference and shows us what C<$b> was referencing. We see the
+same C<$a> that we found in the previous example.
+
+Note that the value of C<RV> coincides with the numbers we see when we
+stringify $b. The addresses inside RV() and IV() are addresses of
+C<X***> structure which holds the current state of an C<SV>. This
+address may change during lifetime of an SV.
+
+=head2 A reference to an array
+
+This shows what a reference to an array looks like.
+
+ use Devel::Peek;
+ $a = [42];
+ Dump $a;
+
+The output:
+
+ SV = RV(0xf041c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb2850
+ SV = PVAV(0xbd448)
+ REFCNT = 1
+ FLAGS = ()
+ IV = 0
+ NV = 0
+ ARRAY = 0xb2048
+ ALLOC = 0xb2048
+ FILL = 0
+ MAX = 0
+ ARYLEN = 0x0
+ FLAGS = (REAL)
+ Elt No. 0 0xb5658
+ SV = IV(0xbe860)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+This says C<$a> is an SV and that it is an RV. That RV points to
+another SV which is a PVAV, an array. The array has one element,
+element zero, which is another SV. The field C<FILL> above indicates
+the last element in the array, similar to C<$#$a>.
+
+If C<$a> pointed to an array of two elements then we would see the
+following.
+
+ use Devel::Peek 'Dump';
+ $a = [42,24];
+ Dump $a;
+
+The output:
+
+ SV = RV(0xf041c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb2850
+ SV = PVAV(0xbd448)
+ REFCNT = 1
+ FLAGS = ()
+ IV = 0
+ NV = 0
+ ARRAY = 0xb2048
+ ALLOC = 0xb2048
+ FILL = 0
+ MAX = 0
+ ARYLEN = 0x0
+ FLAGS = (REAL)
+ Elt No. 0 0xb5658
+ SV = IV(0xbe860)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+ Elt No. 1 0xb5680
+ SV = IV(0xbe818)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 24
+
+Note that C<Dump> will not report I<all> the elements in the array,
+only several first (depending on how deep it already went into the
+report tree).
+
+=head2 A reference to a hash
+
+The following shows the raw form of a reference to a hash.
+
+ use Devel::Peek;
+ $a = {hello=>42};
+ Dump $a;
+
+The output:
+
+ SV = RV(0xf041c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb2850
+ SV = PVHV(0xbd448)
+ REFCNT = 1
+ FLAGS = ()
+ NV = 0
+ ARRAY = 0xbd748
+ KEYS = 1
+ FILL = 1
+ MAX = 7
+ RITER = -1
+ EITER = 0x0
+ Elt "hello" => 0xbaaf0
+ SV = IV(0xbe860)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 42
+
+This shows C<$a> is a reference pointing to an SV. That SV is a PVHV, a
+hash. Fields RITER and EITER are used by C<L<each>>.
+
+=head2 Dumping a large array or hash
+
+The C<Dump()> function, by default, dumps up to 4 elements from a
+toplevel array or hash. This number can be increased by supplying a
+second argument to the function.
+
+ use Devel::Peek;
+ $a = [10,11,12,13,14];
+ Dump $a;
+
+Notice that C<Dump()> prints only elements 10 through 13 in the above code.
+The following code will print all of the elements.
+
+ use Devel::Peek 'Dump';
+ $a = [10,11,12,13,14];
+ Dump $a, 5;
+
+=head2 A reference to an SV which holds a C pointer
+
+This is what you really need to know as an XS programmer, of course. When
+an XSUB returns a pointer to a C structure that pointer is stored in an SV
+and a reference to that SV is placed on the XSUB stack. So the output from
+an XSUB which uses something like the T_PTROBJ map might look something like
+this:
+
+ SV = RV(0xf381c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb8ad8
+ SV = PVMG(0xbb3c8)
+ REFCNT = 1
+ FLAGS = (OBJECT,IOK,pIOK)
+ IV = 729160
+ NV = 0
+ PV = 0
+ STASH = 0xc1d10 "CookBookB::Opaque"
+
+This shows that we have an SV which is an RV. That RV points at another
+SV. In this case that second SV is a PVMG, a blessed scalar. Because it is
+blessed it has the C<OBJECT> flag set. Note that an SV which holds a C
+pointer also has the C<IOK> flag set. The C<STASH> is set to the package
+name which this SV was blessed into.
+
+The output from an XSUB which uses something like the T_PTRREF map, which
+doesn't bless the object, might look something like this:
+
+ SV = RV(0xf381c)
+ REFCNT = 1
+ FLAGS = (ROK)
+ RV = 0xb8ad8
+ SV = PVMG(0xbb3c8)
+ REFCNT = 1
+ FLAGS = (IOK,pIOK)
+ IV = 729160
+ NV = 0
+ PV = 0
+
+=head2 A reference to a subroutine
+
+Looks like this:
+
+ SV = RV(0x798ec)
+ REFCNT = 1
+ FLAGS = (TEMP,ROK)
+ RV = 0x1d453c
+ SV = PVCV(0x1c768c)
+ REFCNT = 2
+ FLAGS = ()
+ IV = 0
+ NV = 0
+ COMP_STASH = 0x31068 "main"
+ START = 0xb20e0
+ ROOT = 0xbece0
+ XSUB = 0x0
+ XSUBANY = 0
+ GVGV::GV = 0x1d44e8 "MY" :: "top_targets"
+ FILE = "(eval 5)"
+ DEPTH = 0
+ PADLIST = 0x1c9338
+
+This shows that
+
+=over
+
+=item *
+
+the subroutine is not an XSUB (since C<START> and C<ROOT> are
+non-zero, and C<XSUB> is zero);
+
+=item *
+
+that it was compiled in the package C<main>;
+
+=item *
+
+under the name C<MY::top_targets>;
+
+=item *
+
+inside a 5th eval in the program;
+
+=item *
+
+it is not currently executed (see C<DEPTH>);
+
+=item *
+
+it has no prototype (C<PROTOTYPE> field is missing).
+
+=back
+
+=head1 EXPORTS
+
+C<Dump>, C<mstat>, C<DeadCode>, C<DumpArray>, C<DumpWithOP> and
+C<DumpProg> by default. Additionally available C<SvREFCNT>,
+C<SvREFCNT_inc> and C<SvREFCNT_dec>.
+
+=head1 BUGS
+
+Readers have been known to skip important parts of L<perlguts>, causing much
+frustration for all.
+
+=head1 AUTHOR
+
+Ilya Zakharevich ilya@math.ohio-state.edu
+
+Copyright (c) 1995-98 Ilya Zakharevich. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+Author of this software makes no claim whatsoever about suitability,
+reliability, edability, editability or usability of this product, and
+should not be kept liable for any damage resulting from the use of
+it. If you can use it, you are in luck, if not, I should not be kept
+responsible. Keep a handy copy of your backup tape at hand.
+
+=head1 SEE ALSO
+
+L<perlguts>, and L<perlguts>, again.
+
+=cut
diff --git a/contrib/perl5/ext/Devel/Peek/Peek.xs b/contrib/perl5/ext/Devel/Peek/Peek.xs
new file mode 100644
index 0000000..9837e9c
--- /dev/null
+++ b/contrib/perl5/ext/Devel/Peek/Peek.xs
@@ -0,0 +1,218 @@
+#define PERL_NO_GET_CONTEXT
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+SV *
+DeadCode(pTHX)
+{
+#ifdef PURIFY
+ return Nullsv;
+#else
+ SV* sva;
+ SV* sv, *dbg;
+ SV* ret = newRV_noinc((SV*)newAV());
+ register SV* svend;
+ int tm = 0, tref = 0, ts = 0, ta = 0, tas = 0;
+
+ for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
+ svend = &sva[SvREFCNT(sva)];
+ for (sv = sva + 1; sv < svend; ++sv) {
+ if (SvTYPE(sv) == SVt_PVCV) {
+ CV *cv = (CV*)sv;
+ AV* padlist = CvPADLIST(cv), *argav;
+ SV** svp;
+ SV** pad;
+ int i = 0, j, levelm, totm = 0, levelref, totref = 0;
+ int levels, tots = 0, levela, tota = 0, levelas, totas = 0;
+ int dumpit = 0;
+
+ if (CvXSUB(sv)) {
+ continue; /* XSUB */
+ }
+ if (!CvGV(sv)) {
+ continue; /* file-level scope. */
+ }
+ if (!CvROOT(cv)) {
+ /* PerlIO_printf(Perl_debug_log, " no root?!\n"); */
+ continue; /* autoloading stub. */
+ }
+ do_gvgv_dump(0, Perl_debug_log, "GVGV::GV", CvGV(sv));
+ if (CvDEPTH(cv)) {
+ PerlIO_printf(Perl_debug_log, " busy\n");
+ continue;
+ }
+ svp = AvARRAY(padlist);
+ while (++i <= AvFILL(padlist)) { /* Depth. */
+ SV **args;
+
+ pad = AvARRAY((AV*)svp[i]);
+ argav = (AV*)pad[0];
+ if (!argav || (SV*)argav == &PL_sv_undef) {
+ PerlIO_printf(Perl_debug_log, " closure-template\n");
+ continue;
+ }
+ args = AvARRAY(argav);
+ levelm = levels = levelref = levelas = 0;
+ levela = sizeof(SV*) * (AvMAX(argav) + 1);
+ if (AvREAL(argav)) {
+ for (j = 0; j < AvFILL(argav); j++) {
+ if (SvROK(args[j])) {
+ PerlIO_printf(Perl_debug_log, " ref in args!\n");
+ levelref++;
+ }
+ /* else if (SvPOK(args[j]) && SvPVX(args[j])) { */
+ else if (SvTYPE(args[j]) >= SVt_PV && SvLEN(args[j])) {
+ levelas += SvLEN(args[j])/SvREFCNT(args[j]);
+ }
+ }
+ }
+ for (j = 1; j < AvFILL((AV*)svp[1]); j++) { /* Vars. */
+ if (SvROK(pad[j])) {
+ levelref++;
+ do_sv_dump(0, Perl_debug_log, pad[j], 0, 4, 0, 0);
+ dumpit = 1;
+ }
+ /* else if (SvPOK(pad[j]) && SvPVX(pad[j])) { */
+ else if (SvTYPE(pad[j]) >= SVt_PVAV) {
+ if (!SvPADMY(pad[j])) {
+ levelref++;
+ do_sv_dump(0, Perl_debug_log, pad[j], 0, 4, 0, 0);
+ dumpit = 1;
+ }
+ }
+ else if (SvTYPE(pad[j]) >= SVt_PV && SvLEN(pad[j])) {
+ int db_len = SvLEN(pad[j]);
+ SV *db_sv = pad[j];
+ levels++;
+ levelm += SvLEN(pad[j])/SvREFCNT(pad[j]);
+ /* Dump(pad[j],4); */
+ }
+ }
+ PerlIO_printf(Perl_debug_log, " level %i: refs: %i, strings: %i in %i,\targsarray: %i, argsstrings: %i\n",
+ i, levelref, levelm, levels, levela, levelas);
+ totm += levelm;
+ tota += levela;
+ totas += levelas;
+ tots += levels;
+ totref += levelref;
+ if (dumpit)
+ do_sv_dump(0, Perl_debug_log, (SV*)cv, 0, 2, 0, 0);
+ }
+ if (AvFILL(padlist) > 1) {
+ PerlIO_printf(Perl_debug_log, " total: refs: %i, strings: %i in %i,\targsarrays: %i, argsstrings: %i\n",
+ totref, totm, tots, tota, totas);
+ }
+ tref += totref;
+ tm += totm;
+ ts += tots;
+ ta += tota;
+ tas += totas;
+ }
+ }
+ }
+ PerlIO_printf(Perl_debug_log, "total: refs: %i, strings: %i in %i\targsarray: %i, argsstrings: %i\n", tref, tm, ts, ta, tas);
+
+ return ret;
+#endif /* !PURIFY */
+}
+
+#if defined(PERL_DEBUGGING_MSTATS) || defined(DEBUGGING_MSTATS) \
+ || (defined(MYMALLOC) && !defined(PLAIN_MALLOC))
+# define mstat(str) dump_mstats(str)
+#else
+# define mstat(str) \
+ PerlIO_printf(Perl_debug_log, "%s: perl not compiled with DEBUGGING_MSTATS\n",str);
+#endif
+
+#define _CvGV(cv) \
+ (SvROK(cv) && (SvTYPE(SvRV(cv))==SVt_PVCV) \
+ ? SvREFCNT_inc(CvGV((CV*)SvRV(cv))) : &PL_sv_undef)
+
+MODULE = Devel::Peek PACKAGE = Devel::Peek
+
+void
+mstat(str="Devel::Peek::mstat: ")
+char *str
+
+void
+Dump(sv,lim=4)
+SV * sv
+I32 lim
+PPCODE:
+{
+ SV *pv_lim_sv = perl_get_sv("Devel::Peek::pv_limit", FALSE);
+ STRLEN pv_lim = pv_lim_sv ? SvIV(pv_lim_sv) : 0;
+ SV *dumpop = perl_get_sv("Devel::Peek::dump_ops", FALSE);
+ I32 save_dumpindent = PL_dumpindent;
+ PL_dumpindent = 2;
+ do_sv_dump(0, Perl_debug_log, sv, 0, lim, dumpop && SvTRUE(dumpop), pv_lim);
+ PL_dumpindent = save_dumpindent;
+}
+
+void
+DumpArray(lim,...)
+I32 lim
+PPCODE:
+{
+ long i;
+ SV *pv_lim_sv = perl_get_sv("Devel::Peek::pv_limit", FALSE);
+ STRLEN pv_lim = pv_lim_sv ? SvIV(pv_lim_sv) : 0;
+ SV *dumpop = perl_get_sv("Devel::Peek::dump_ops", FALSE);
+ I32 save_dumpindent = PL_dumpindent;
+ PL_dumpindent = 2;
+
+ for (i=1; i<items; i++) {
+ PerlIO_printf(Perl_debug_log, "Elt No. %ld 0x%"UVxf"\n", i - 1, PTR2UV(ST(i)));
+ do_sv_dump(0, Perl_debug_log, ST(i), 0, lim, dumpop && SvTRUE(dumpop), pv_lim);
+ }
+ PL_dumpindent = save_dumpindent;
+}
+
+void
+DumpProg()
+PPCODE:
+{
+ warn("dumpindent is %d", PL_dumpindent);
+ if (PL_main_root)
+ op_dump(PL_main_root);
+}
+
+I32
+SvREFCNT(sv)
+SV * sv
+
+# PPCODE needed since otherwise sv_2mortal is inserted that will kill the value.
+
+SV *
+SvREFCNT_inc(sv)
+SV * sv
+PPCODE:
+{
+ RETVAL = SvREFCNT_inc(sv);
+ PUSHs(RETVAL);
+}
+
+# PPCODE needed since by default it is void
+
+SV *
+SvREFCNT_dec(sv)
+SV * sv
+PPCODE:
+{
+ SvREFCNT_dec(sv);
+ PUSHs(sv);
+}
+
+SV *
+DeadCode()
+CODE:
+ RETVAL = DeadCode(aTHX);
+OUTPUT:
+ RETVAL
+
+MODULE = Devel::Peek PACKAGE = Devel::Peek PREFIX = _
+
+SV *
+_CvGV(cv)
+ SV *cv
diff --git a/contrib/perl5/ext/DynaLoader/DynaLoader_pm.PL b/contrib/perl5/ext/DynaLoader/DynaLoader_pm.PL
index cf7d708..e0eb604 100644
--- a/contrib/perl5/ext/DynaLoader/DynaLoader_pm.PL
+++ b/contrib/perl5/ext/DynaLoader/DynaLoader_pm.PL
@@ -3,7 +3,7 @@ use Config;
sub to_string {
my ($value) = @_;
- $value =~ s/\\/\\\\'/g;
+ $value =~ s/\\/\\\\/g;
$value =~ s/'/\\'/g;
return "'$value'";
}
@@ -28,7 +28,7 @@ package DynaLoader;
#
# Tim.Bunce@ig.co.uk, August 1994
-$VERSION = $VERSION = "1.03"; # avoid typo warning
+$VERSION = "1.04"; # avoid typo warning
require AutoLoader;
*AUTOLOAD = \&AutoLoader::AUTOLOAD;
@@ -72,12 +72,13 @@ print OUT <<'EOT';
# See dl_expandspec() for more details. Should be harmless but
# inefficient to define on systems that don't need it.
$do_expand = $Is_VMS = $^O eq 'VMS';
+$Is_MacOS = $^O eq 'MacOS';
@dl_require_symbols = (); # names of symbols we need
@dl_resolve_using = (); # names of files to link with
@dl_library_path = (); # path to look for files
-@dl_librefs = (); # things we have loaded
-@dl_modules = (); # Modules we have loaded
+#@dl_librefs = (); # things we have loaded
+#@dl_modules = (); # Modules we have loaded
# This is a fix to support DLD's unfortunate desire to relink -lc
@dl_resolve_using = dl_findfile('-lc') if $dlsrc eq "dl_dld.xs";
@@ -93,12 +94,24 @@ print OUT "push(\@dl_library_path, split(' ', ",
print OUT <<'EOT';
-# Add to @dl_library_path any extra directories we can gather from
-# environment variables. So far LD_LIBRARY_PATH is the only known
-# variable used for this purpose. Others may be added later.
+# Add to @dl_library_path any extra directories we can gather
+# from environment variables.
+if ($Is_MacOS) {
+ push(@dl_library_path, split(/,/, $ENV{LD_LIBRARY_PATH}))
+ if exists $ENV{LD_LIBRARY_PATH};
+} else {
+ push(@dl_library_path, split(/:/, $ENV{$Config::Config{ldlibpthname}}))
+ if exists $Config::Config{ldlibpthname} &&
+ $Config::Config{ldlibpthname} ne '' &&
+ exists $ENV{$Config::Config{ldlibpthname}} ;;
+ push(@dl_library_path, split(/:/, $ENV{$Config::Config{ldlibpthname}}))
+ if exists $Config::Config{ldlibpthname} &&
+ $Config::Config{ldlibpthname} ne '' &&
+ exists $ENV{$Config::Config{ldlibpthname}} ;;
+# E.g. HP-UX supports both its native SHLIB_PATH *and* LD_LIBRARY_PATH.
push(@dl_library_path, split(/:/, $ENV{LD_LIBRARY_PATH}))
- if $ENV{LD_LIBRARY_PATH};
-
+ if exists $ENV{LD_LIBRARY_PATH};
+}
# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
@@ -116,6 +129,14 @@ if ($dl_debug) {
sub croak { require Carp; Carp::croak(@_) }
+sub bootstrap_inherit {
+ my $module = $_[0];
+ local *isa = *{"$module\::ISA"};
+ local @isa = (@isa, 'DynaLoader');
+ # Cannot goto due to delocalization. Will report errors on a wrong line?
+ bootstrap(@_);
+}
+
# The bootstrap function cannot be autoloaded (without complications)
# so we define it here:
@@ -145,18 +166,27 @@ sub bootstrap {
# It may also edit @modparts if required.
$modfname = &mod2fname(\@modparts) if defined &mod2fname;
- my $modpname = join('/',@modparts);
+ my $modpname = join(($Is_MacOS ? ':' : '/'),@modparts);
print STDERR "DynaLoader::bootstrap for $module ",
- "(auto/$modpname/$modfname.$dl_dlext)\n" if $dl_debug;
+ ($Is_MacOS
+ ? "(auto/$modpname/$modfname.$dl_dlext)\n" :
+ "(:auto:$modpname:$modfname.$dl_dlext)\n")
+ if $dl_debug;
foreach (@INC) {
chop($_ = VMS::Filespec::unixpath($_)) if $Is_VMS;
- my $dir = "$_/auto/$modpname";
+ my $dir;
+ if ($Is_MacOS) {
+ chop $_ if /:$/;
+ $dir = "$_:auto:$modpname";
+ } else {
+ $dir = "$_/auto/$modpname";
+ }
next unless -d $dir; # skip over uninteresting directories
# check for common cases to avoid autoload of dl_findfile
- my $try = "$dir/$modfname.$dl_dlext";
+ my $try = $Is_MacOS ? "$dir:$modfname.$dl_dlext" : "$dir/$modfname.$dl_dlext";
last if $file = ($do_expand) ? dl_expandspec($try) : (-f $try && $try);
# no luck here, save dir for possible later dl_findfile search
@@ -168,6 +198,7 @@ sub bootstrap {
croak("Can't locate loadable object for module $module in \@INC (\@INC contains: @INC)")
unless $file; # wording similar to error from 'require'
+ $file = uc($file) if $Is_VMS && $Config{d_vms_case_sensitive_symbols};
my $bootname = "boot_$module";
$bootname =~ s/\W/_/g;
@dl_require_symbols = ($bootname);
@@ -176,7 +207,7 @@ sub bootstrap {
# The .bs file can be used to configure @dl_resolve_using etc to
# match the needs of the individual module on this architecture.
my $bs = $file;
- $bs =~ s/(\.\w+)?$/\.bs/; # look for .bs 'beside' the library
+ $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
if (-s $bs) { # only read file if it's not empty
print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug;
eval { do $bs; };
@@ -191,7 +222,7 @@ sub bootstrap {
# it executed.
my $libref = dl_load_file($file, $module->dl_load_flags) or
- croak("Can't load '$file' for module $module: ".dl_error()."\n");
+ croak("Can't load '$file' for module $module: ".dl_error());
push(@dl_librefs,$libref); # record loaded object
@@ -251,6 +282,12 @@ print OUT <<'EOT';
last arg unless wantarray;
next;
}
+ elsif ($Is_MacOS) {
+ if (m/:/ && -f $_) {
+ push(@found,$_);
+ last arg unless wantarray;
+ }
+ }
elsif (m:/: && -f $_ && !$do_expand) {
push(@found,$_);
last arg unless wantarray;
@@ -261,6 +298,30 @@ print OUT <<'EOT';
# Using a -L prefix is the preferred option (faster and more robust)
if (m:^-L:) { s/^-L//; push(@dirs, $_); next; }
+ if ($Is_MacOS) {
+ # Otherwise we try to try to spot directories by a heuristic
+ # (this is a more complicated issue than it first appears)
+ if (m/:/ && -d $_) { push(@dirs, $_); next; }
+ # Only files should get this far...
+ my(@names, $name); # what filenames to look for
+ s/^-l//;
+ push(@names, $_);
+ foreach $dir (@dirs, @dl_library_path) {
+ next unless -d $dir;
+ $dir =~ s/^([^:]+)$/:$1/;
+ $dir =~ s/:$//;
+ foreach $name (@names) {
+ my($file) = "$dir:$name";
+ print STDERR " checking in $dir for $name\n" if $dl_debug;
+ if (-f $file) {
+ push(@found, $file);
+ next arg; # no need to look any further
+ }
+ }
+ }
+ next;
+ }
+
# Otherwise we try to try to spot directories by a heuristic
# (this is a more complicated issue than it first appears)
if (m:/: && -d $_) { push(@dirs, $_); next; }
@@ -350,7 +411,7 @@ sub dl_find_symbol_anywhere
DynaLoader - Dynamically load C libraries into Perl code
-dl_error(), dl_findfile(), dl_expandspec(), dl_load_file(), dl_find_symbol(), dl_find_symbol_anywhere(), dl_undef_symbols(), dl_install_xsub(), dl_load_flags(), bootstrap() - routines used by DynaLoader modules
+dl_error(), dl_findfile(), dl_expandspec(), dl_load_file(), dl_unload_file(), dl_find_symbol(), dl_find_symbol_anywhere(), dl_undef_symbols(), dl_install_xsub(), dl_load_flags(), bootstrap() - routines used by DynaLoader modules
=head1 SYNOPSIS
@@ -402,6 +463,7 @@ DynaLoader Interface Summary
$symref = dl_find_symbol_anywhere($symbol) Perl
$libref = dl_load_file($filename, $flags) C
+ $status = dl_unload_file($libref) C
$symref = dl_find_symbol($libref, $symbol) C
@symbols = dl_undef_symbols() C
dl_install_xsub($name, $symref [, $filename]) C
@@ -579,6 +641,42 @@ current values of @dl_require_symbols and @dl_resolve_using if required.
Linux, and is a common choice when providing a "wrapper" on other
mechanisms as is done in the OS/2 port.)
+=item dl_unload_file()
+
+Syntax:
+
+ $status = dl_unload_file($libref)
+
+Dynamically unload $libref, which must be an opaque 'library reference' as
+returned from dl_load_file. Returns one on success and zero on failure.
+
+This function is optional and may not necessarily be provided on all platforms.
+If it is defined, it is called automatically when the interpreter exits for
+every shared object or library loaded by DynaLoader::bootstrap. All such
+library references are stored in @dl_librefs by DynaLoader::Bootstrap as it
+loads the libraries. The files are unloaded in last-in, first-out order.
+
+This unloading is usually necessary when embedding a shared-object perl (e.g.
+one configured with -Duseshrplib) within a larger application, and the perl
+interpreter is created and destroyed several times within the lifetime of the
+application. In this case it is possible that the system dynamic linker will
+unload and then subsequently reload the shared libperl without relocating any
+references to it from any files DynaLoaded by the previous incarnation of the
+interpreter. As a result, any shared objects opened by DynaLoader may point to
+a now invalid 'ghost' of the libperl shared object, causing apparently random
+memory corruption and crashes. This behaviour is most commonly seen when using
+Apache and mod_perl built with the APXS mechanism.
+
+ SunOS: dlclose($libref)
+ HP-UX: ???
+ Linux: ???
+ NeXT: ???
+ VMS: ???
+
+(The dlclose() function is also used by Solaris and some versions of
+Linux, and is a common choice when providing a "wrapper" on other
+mechanisms as is done in the OS/2 port.)
+
=item dl_loadflags()
Syntax:
diff --git a/contrib/perl5/ext/DynaLoader/Makefile.PL b/contrib/perl5/ext/DynaLoader/Makefile.PL
index 2141fde..83cbd77 100644
--- a/contrib/perl5/ext/DynaLoader/Makefile.PL
+++ b/contrib/perl5/ext/DynaLoader/Makefile.PL
@@ -8,14 +8,19 @@ WriteMakefile(
SKIP => [qw(dynamic dynamic_lib dynamic_bs)],
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'DynaLoader_pm.PL',
- PL_FILES => {'DynaLoader_pm.PL'=>'DynaLoader.pm'},
- PM => {'DynaLoader.pm' => '$(INST_LIBDIR)/DynaLoader.pm'},
- clean => {FILES => 'DynaLoader.c DynaLoader.xs DynaLoader.pm'},
+ PL_FILES => {'DynaLoader_pm.PL'=>'DynaLoader.pm',
+ 'XSLoader_pm.PL'=>'XSLoader.pm'},
+ PM => {'DynaLoader.pm' => '$(INST_LIBDIR)/DynaLoader.pm',
+ 'XSLoader.pm' => '$(INST_LIBDIR)/XSLoader.pm'},
+ depend => {'DynaLoader.o' => 'dlutils.c'},
+ clean => {FILES => 'DynaLoader.c DynaLoader.xs DynaLoader.pm ' .
+ 'XSLoader.pm'},
);
sub MY::postamble {
'
DynaLoader.xs: $(DLSRC)
+ $(RM_F) $@
$(CP) $? $@
# Perform very simple tests just to check for major gaffs.
diff --git a/contrib/perl5/ext/DynaLoader/XSLoader_pm.PL b/contrib/perl5/ext/DynaLoader/XSLoader_pm.PL
new file mode 100644
index 0000000..8cdfd63
--- /dev/null
+++ b/contrib/perl5/ext/DynaLoader/XSLoader_pm.PL
@@ -0,0 +1,158 @@
+use Config;
+
+sub to_string {
+ my ($value) = @_;
+ $value =~ s/\\/\\\\/g;
+ $value =~ s/'/\\'/g;
+ return "'$value'";
+}
+
+unlink "XSLoader.pm" if -f "XSLoader.pm";
+open OUT, ">XSLoader.pm" or die $!;
+print OUT <<'EOT';
+# Generated from XSLoader.pm.PL (resolved %Config::Config value)
+
+package XSLoader;
+
+# And Gandalf said: 'Many folk like to know beforehand what is to
+# be set on the table; but those who have laboured to prepare the
+# feast like to keep their secret; for wonder makes the words of
+# praise louder.'
+
+# (Quote from Tolkien sugested by Anno Siegel.)
+#
+# See pod text at end of file for documentation.
+# See also ext/DynaLoader/README in source tree for other information.
+#
+# Tim.Bunce@ig.co.uk, August 1994
+
+$VERSION = "0.01"; # avoid typo warning
+
+# enable debug/trace messages from DynaLoader perl code
+# $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
+
+EOT
+
+print OUT ' my $dl_dlext = ', to_string($Config::Config{'dlext'}), ";\n" ;
+
+print OUT <<'EOT';
+
+# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
+package DynaLoader;
+boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
+ !defined(&dl_load_file);
+package XSLoader;
+
+1; # End of main code
+
+# The bootstrap function cannot be autoloaded (without complications)
+# so we define it here:
+
+sub load {
+ package DynaLoader;
+
+ my($module) = $_[0];
+
+ # work with static linking too
+ my $b = "$module\::bootstrap";
+ goto &$b if defined &$b;
+
+ goto retry unless $module and defined &dl_load_file;
+
+ my @modparts = split(/::/,$module);
+ my $modfname = $modparts[-1];
+
+EOT
+
+print OUT <<'EOT' if defined &DynaLoader::mod2fname;
+ # Some systems have restrictions on files names for DLL's etc.
+ # mod2fname returns appropriate file base name (typically truncated)
+ # It may also edit @modparts if required.
+ $modfname = &mod2fname(\@modparts) if defined &mod2fname;
+
+EOT
+
+print OUT <<'EOT';
+ my $modpname = join('/',@modparts);
+ my $modlibname = (caller())[1];
+ my $c = @modparts;
+ $modlibname =~ s,[\\/][^\\/]+$,, while $c--; # Q&D basename
+ my $file = "$modlibname/auto/$modpname/$modfname.$dl_dlext";
+
+# print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug;
+
+ my $bs = $file;
+ $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
+
+ goto retry if not -f $file or -s $bs;
+
+ my $bootname = "boot_$module";
+ $bootname =~ s/\W/_/g;
+ @dl_require_symbols = ($bootname);
+
+ # Many dynamic extension loading problems will appear to come from
+ # this section of code: XYZ failed at line 123 of DynaLoader.pm.
+ # Often these errors are actually occurring in the initialisation
+ # C code of the extension XS file. Perl reports the error as being
+ # in this perl code simply because this was the last perl code
+ # it executed.
+
+ my $libref = dl_load_file($file, 0) or do {
+ require Carp;
+ Carp::croak("Can't load '$file' for module $module: " . dl_error());
+ };
+ push(@dl_librefs,$libref); # record loaded object
+
+ my @unresolved = dl_undef_symbols();
+ if (@unresolved) {
+ require Carp;
+ Carp::carp("Undefined symbols present after loading $file: @unresolved\n");
+ }
+
+ my $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do {
+ require Carp;
+ Carp::croak("Can't find '$bootname' symbol in $file\n");
+ };
+
+ my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
+
+ push(@dl_modules, $module); # record loaded module
+
+ # See comment block above
+ return &$xs(@_);
+
+ retry:
+ require DynaLoader;
+ goto &DynaLoader::bootstrap_inherit;
+}
+
+__END__
+
+=head1 NAME
+
+XSLoader - Dynamically load C libraries into Perl code
+
+=head1 SYNOPSIS
+
+ package YourPackage;
+ use XSLoader;
+
+ XSLoader::load 'YourPackage', @args;
+
+=head1 DESCRIPTION
+
+This module defines a standard I<simplified> interface to the dynamic
+linking mechanisms available on many platforms. Its primary purpose is
+to implement cheap automatic dynamic loading of Perl modules.
+
+For more complicated interface see L<DynaLoader>.
+
+=head1 AUTHOR
+
+Ilya Zakharevich: extraction from DynaLoader.
+
+=cut
+EOT
+
+close OUT or die $!;
+
diff --git a/contrib/perl5/ext/DynaLoader/dl_aix.xs b/contrib/perl5/ext/DynaLoader/dl_aix.xs
index ea50408..35242ed 100644
--- a/contrib/perl5/ext/DynaLoader/dl_aix.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_aix.xs
@@ -20,6 +20,15 @@
#include "perl.h"
#include "XSUB.h"
+/* When building as a 64-bit binary on AIX, define this to get the
+ * correct structure definitions. Also determines the field-name
+ * macros and gates some logic in readEntries(). -- Steven N. Hirsch
+ * <hirschs@btv.ibm.com> */
+#ifdef USE_64_BIT_ALL
+# define __XCOFF64__
+# define __XCOFF32__
+#endif
+
#include <stdio.h>
#include <errno.h>
#include <string.h>
@@ -29,6 +38,39 @@
#include <a.out.h>
#include <ldfcn.h>
+#ifdef USE_64_BIT_ALL
+# define AIX_SCNHDR SCNHDR_64
+# define AIX_LDHDR LDHDR_64
+# define AIX_LDSYM LDSYM_64
+# define AIX_LDHDRSZ LDHDRSZ_64
+#else
+# define AIX_SCNHDR SCNHDR
+# define AIX_LDHDR LDHDR
+# define AIX_LDSYM LDSYM
+# define AIX_LDHDRSZ LDHDRSZ
+#endif
+
+/* When using Perl extensions written in C++ the longer versions
+ * of load() and unload() from libC and libC_r need to be used,
+ * otherwise statics in the extensions won't get initialized right.
+ * -- Stephanie Beals <bealzy@us.ibm.com> */
+
+/* Older AIX C compilers cannot deal with C++ double-slash comments in
+ the ibmcxx and/or xlC includes. Since we only need a single file,
+ be more fine-grained about what's included <hirschs@btv.ibm.com> */
+#ifdef USE_libC /* The define comes, when it comes, from hints/aix.pl. */
+# define LOAD loadAndInit
+# define UNLOAD terminateAndUnload
+# if defined(USE_xlC_load_h)
+# include "/usr/lpp/xlC/include/load.h"
+# elif defined(USE_ibmcxx_load_h)
+# include "/usr/ibmcxx/include/load.h"
+# endif
+#else
+# define LOAD load
+# define UNLOAD unload
+#endif
+
/*
* AIX 4.3 does remove some useful definitions from ldfcn.h. Define
* these here to compensate for that lossage.
@@ -77,19 +119,18 @@ typedef struct Module {
* We keep a list of all loaded modules to be able to call the fini
* handlers at atexit() time.
*/
-static ModulePtr modList;
+static ModulePtr modList; /* XXX threaded */
/*
* The last error from one of the dl* routines is kept in static
* variables here. Each error is returned only once to the caller.
*/
-static char errbuf[BUFSIZ];
-static int errvalid;
+static char errbuf[BUFSIZ]; /* XXX threaded */
+static int errvalid; /* XXX threaded */
static void caterr(char *);
static int readExports(ModulePtr);
static void terminate(void);
-static void *findMain(void);
static char *strerror_failed = "(strerror failed)";
static char *strerror_r_failed = "(strerror_r failed)";
@@ -104,7 +145,7 @@ char *strerrorcat(char *str, int err) {
if (buf == 0)
return 0;
- if (strerror_r(err, buf, sizeof(buf)) == 0)
+ if (strerror_r(err, buf, BUFSIZ) == 0)
msg = buf;
else
msg = strerror_r_failed;
@@ -132,7 +173,7 @@ char *strerrorcpy(char *str, int err) {
if (buf == 0)
return 0;
- if (strerror_r(err, buf, sizeof(buf)) == 0)
+ if (strerror_r(err, buf, BUFSIZ) == 0)
msg = buf;
else
msg = strerror_r_failed;
@@ -154,17 +195,16 @@ char *strerrorcpy(char *str, int err) {
/* ARGSUSED */
void *dlopen(char *path, int mode)
{
+ dTHX;
register ModulePtr mp;
- static void *mainModule;
+ static int inited; /* XXX threaded */
/*
* Upon the first call register a terminate handler that will
- * close all libraries. Also get a reference to the main module
- * for use with loadbind.
+ * close all libraries.
*/
- if (!mainModule) {
- if ((mainModule = findMain()) == NULL)
- return NULL;
+ if (!inited) {
+ inited++;
atexit(terminate);
}
/*
@@ -190,11 +230,19 @@ void *dlopen(char *path, int mode)
safefree(mp);
return NULL;
}
+
/*
* load should be declared load(const char *...). Thus we
* cast the path to a normal char *. Ugly.
*/
- if ((mp->entry = (void *)load((char *)path, L_NOAUTODEFER, NULL)) == NULL) {
+ if ((mp->entry = (void *)LOAD((char *)path,
+#ifdef L_LIBPATH_EXEC
+ L_LIBPATH_EXEC |
+#endif
+ L_NOAUTODEFER,
+ NULL)) == NULL) {
+ int saverrno = errno;
+
safefree(mp->name);
safefree(mp);
errvalid++;
@@ -206,27 +254,34 @@ void *dlopen(char *path, int mode)
* can be further described by querying the loader about
* the last error.
*/
- if (errno == ENOEXEC) {
- char *tmp[BUFSIZ/sizeof(char *)];
- if (loadquery(L_GETMESSAGES, tmp, sizeof(tmp)) == -1)
- strerrorcpy(errbuf, errno);
+ if (saverrno == ENOEXEC) {
+ char *moreinfo[BUFSIZ/sizeof(char *)];
+ if (loadquery(L_GETMESSAGES, moreinfo, sizeof(moreinfo)) == -1)
+ strerrorcpy(errbuf, saverrno);
else {
char **p;
- for (p = tmp; *p; p++)
+ for (p = moreinfo; *p; p++)
caterr(*p);
}
} else
- strerrorcat(errbuf, errno);
+ strerrorcat(errbuf, saverrno);
return NULL;
}
mp->refCnt = 1;
mp->next = modList;
modList = mp;
- if (loadbind(0, mainModule, mp->entry) == -1) {
+ /*
+ * Assume anonymous exports come from the module this dlopen
+ * is linked into, that holds true as long as dlopen and all
+ * of the perl core are in the same shared object.
+ */
+ if (loadbind(0, (void *)dlopen, mp->entry) == -1) {
+ int saverrno = errno;
+
dlclose(mp);
errvalid++;
strcpy(errbuf, "loadbind: ");
- strerrorcat(errbuf, errno);
+ strerrorcat(errbuf, saverrno);
return NULL;
}
if (readExports(mp) == -1) {
@@ -311,7 +366,7 @@ int dlclose(void *handle)
if (--mp->refCnt > 0)
return 0;
- result = unload(mp->entry);
+ result = UNLOAD(mp->entry);
if (result == -1) {
errvalid++;
strerrorcpy(errbuf, errno);
@@ -364,11 +419,12 @@ void *calloc(size_t ne, size_t sz)
*/
static int readExports(ModulePtr mp)
{
+ dTHX;
LDFILE *ldp = NULL;
- SCNHDR sh;
- LDHDR *lhp;
+ AIX_SCNHDR sh;
+ AIX_LDHDR *lhp;
char *ldbuf;
- LDSYM *ls;
+ AIX_LDSYM *ls;
int i;
ExportPtr ep;
@@ -412,7 +468,7 @@ static int readExports(ModulePtr mp)
}
/*
* Traverse the list of loaded modules. The entry point
- * returned by load() does actually point to the data
+ * returned by LOAD() does actually point to the data
* segment origin.
*/
lp = (struct ld_info *)buf;
@@ -434,7 +490,11 @@ static int readExports(ModulePtr mp)
return -1;
}
}
+#ifdef USE_64_BIT_ALL
+ if (TYPE(ldp) != U803XTOCMAGIC) {
+#else
if (TYPE(ldp) != U802TOCMAGIC) {
+#endif
errvalid++;
strcpy(errbuf, "readExports: bad magic");
while(ldclose(ldp) == FAILURE)
@@ -482,8 +542,8 @@ static int readExports(ModulePtr mp)
;
return -1;
}
- lhp = (LDHDR *)ldbuf;
- ls = (LDSYM *)(ldbuf+LDHDRSZ);
+ lhp = (AIX_LDHDR *)ldbuf;
+ ls = (AIX_LDSYM *)(ldbuf+AIX_LDHDRSZ);
/*
* Count the number of exports to include in our export table.
*/
@@ -507,15 +567,19 @@ static int readExports(ModulePtr mp)
* the entry point we got from load.
*/
ep = mp->exports;
- ls = (LDSYM *)(ldbuf+LDHDRSZ);
+ ls = (AIX_LDSYM *)(ldbuf+AIX_LDHDRSZ);
for (i = lhp->l_nsyms; i; i--, ls++) {
char *symname;
if (!LDR_EXPORT(*ls))
continue;
+#ifndef USE_64_BIT_ALL
if (ls->l_zeroes == 0)
+#endif
symname = ls->l_offset+lhp->l_stoff+ldbuf;
+#ifndef USE_64_BIT_ALL
else
symname = ls->l_name;
+#endif
ep->name = savepv(symname);
ep->addr = (void *)((unsigned long)mp->entry + ls->l_value);
ep++;
@@ -526,56 +590,10 @@ static int readExports(ModulePtr mp)
return 0;
}
-/*
- * Find the main modules entry point. This is used as export pointer
- * for loadbind() to be able to resolve references to the main part.
- */
-static void * findMain(void)
-{
- struct ld_info *lp;
- char *buf;
- int size = 4*1024;
- int i;
- void *ret;
-
- if ((buf = safemalloc(size)) == NULL) {
- errvalid++;
- strcpy(errbuf, "findMain: ");
- strerrorcat(errbuf, errno);
- return NULL;
- }
- while ((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM) {
- safefree(buf);
- size += 4*1024;
- if ((buf = safemalloc(size)) == NULL) {
- errvalid++;
- strcpy(errbuf, "findMain: ");
- strerrorcat(errbuf, errno);
- return NULL;
- }
- }
- if (i == -1) {
- errvalid++;
- strcpy(errbuf, "findMain: ");
- strerrorcat(errbuf, errno);
- safefree(buf);
- return NULL;
- }
- /*
- * The first entry is the main module. The entry point
- * returned by load() does actually point to the data
- * segment origin.
- */
- lp = (struct ld_info *)buf;
- ret = lp->ldinfo_dataorg;
- safefree(buf);
- return ret;
-}
-
/* dl_dlopen.xs
*
* Platform: SunOS/Solaris, possibly others which use dlopen.
- * Author: Paul Marquess (pmarquess@bfsec.bt.co.uk)
+ * Author: Paul Marquess (Paul.Marquess@btinternet.com)
* Created: 10th July 1994
*
* Modified:
@@ -597,15 +615,15 @@ static void * findMain(void)
static void
-dl_private_init()
+dl_private_init(pTHX)
{
- (void)dl_generic_private_init();
+ (void)dl_generic_private_init(aTHX);
}
MODULE = DynaLoader PACKAGE = DynaLoader
BOOT:
- (void)dl_private_init();
+ (void)dl_private_init(aTHX);
void *
@@ -613,16 +631,16 @@ dl_load_file(filename, flags=0)
char * filename
int flags
CODE:
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
if (flags & 0x01)
- warn("Can't make loaded symbols global on this platform while loading %s",filename);
+ Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
RETVAL = dlopen(filename, 1) ;
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", RETVAL));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
+ SaveError(aTHX_ "%s",dlerror()) ;
else
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
void *
@@ -630,15 +648,15 @@ dl_find_symbol(libhandle, symbolname)
void * libhandle
char * symbolname
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_find_symbol(handle=%x, symbol=%s)\n",
libhandle, symbolname));
RETVAL = dlsym(libhandle, symbolname);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref = %x\n", RETVAL));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref = %x\n", RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
+ SaveError(aTHX_ "%s",dlerror()) ;
else
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL));
void
@@ -655,9 +673,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%x)\n",
perl_name, symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
diff --git a/contrib/perl5/ext/DynaLoader/dl_beos.xs b/contrib/perl5/ext/DynaLoader/dl_beos.xs
index 42a27cb..705c8bc 100644
--- a/contrib/perl5/ext/DynaLoader/dl_beos.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_beos.xs
@@ -18,15 +18,15 @@
#include "dlutils.c" /* SaveError() etc */
static void
-dl_private_init()
+dl_private_init(pTHX)
{
- (void)dl_generic_private_init();
+ (void)dl_generic_private_init(aTHX);
}
MODULE = DynaLoader PACKAGE = DynaLoader
BOOT:
- (void)dl_private_init();
+ (void)dl_private_init(aTHX);
void *
@@ -45,16 +45,16 @@ dl_load_file(filename, flags=0)
strcpy(path, filename);
}
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", path, flags));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", path, flags));
bogo = load_add_on(path);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%lx\n", (unsigned long) RETVAL));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%lx\n", (unsigned long) RETVAL));
ST(0) = sv_newmortal() ;
if (bogo < 0) {
- SaveError("%s", strerror(bogo));
- PerlIO_printf(PerlIO_stderr(), "load_add_on(%s) : %d (%s)\n", path, bogo, strerror(bogo));
+ SaveError(aTHX_ "%s", strerror(bogo));
+ PerlIO_printf(Perl_debug_log, "load_add_on(%s) : %d (%s)\n", path, bogo, strerror(bogo));
} else {
RETVAL = (void *) bogo;
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
}
free(path);
}
@@ -67,23 +67,23 @@ dl_find_symbol(libhandle, symbolname)
status_t retcode;
void *adr = 0;
#ifdef DLSYM_NEEDS_UNDERSCORE
- symbolname = form("_%s", symbolname);
+ symbolname = Perl_form_nocontext("_%s", symbolname);
#endif
RETVAL = NULL;
- DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
"dl_find_symbol(handle=%lx, symbol=%s)\n",
(unsigned long) libhandle, symbolname));
retcode = get_image_symbol((image_id) libhandle, symbolname,
B_SYMBOL_TYPE_TEXT, (void **) &adr);
RETVAL = adr;
- DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
" symbolref = %lx\n", (unsigned long) RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL) {
- SaveError("%s", strerror(retcode)) ;
- PerlIO_printf(PerlIO_stderr(), "retcode = %p (%s)\n", retcode, strerror(retcode));
+ SaveError(aTHX_ "%s", strerror(retcode)) ;
+ PerlIO_printf(Perl_debug_log, "retcode = %p (%s)\n", retcode, strerror(retcode));
} else
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL));
void
@@ -100,9 +100,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%lx)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%lx)\n",
perl_name, (unsigned long) symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)_((CV *)))symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
diff --git a/contrib/perl5/ext/DynaLoader/dl_dld.xs b/contrib/perl5/ext/DynaLoader/dl_dld.xs
index 2443ab0..d8fad2a 100644
--- a/contrib/perl5/ext/DynaLoader/dl_dld.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_dld.xs
@@ -48,12 +48,12 @@ static AV *dl_resolve_using = Nullav;
static AV *dl_require_symbols = Nullav;
static void
-dl_private_init()
+dl_private_init(pTHX)
{
int dlderr;
- dl_generic_private_init();
- dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4);
- dl_require_symbols = perl_get_av("DynaLoader::dl_require_symbols", 0x4);
+ dl_generic_private_init(aTHX);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+ dl_require_symbols = get_av("DynaLoader::dl_require_symbols", GV_ADDMULTI);
#ifdef __linux__
dlderr = dld_init("/proc/self/exe");
if (dlderr) {
@@ -61,8 +61,8 @@ dl_private_init()
dlderr = dld_init(dld_find_executable(PL_origargv[0]));
if (dlderr) {
char *msg = dld_strerror(dlderr);
- SaveError("dld_init(%s) failed: %s", PL_origargv[0], msg);
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "%s", LastError));
+ SaveError(aTHX_ "dld_init(%s) failed: %s", PL_origargv[0], msg);
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "%s", LastError));
}
#ifdef __linux__
}
@@ -85,40 +85,40 @@ dl_load_file(filename, flags=0)
GV *gv;
CODE:
RETVAL = filename;
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
if (flags & 0x01)
- croak("Can't make loaded symbols global on this platform while loading %s",filename);
+ Perl_croak(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
max = AvFILL(dl_require_symbols);
for (x = 0; x <= max; x++) {
char *sym = SvPVX(*av_fetch(dl_require_symbols, x, 0));
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dld_create_ref(%s)\n", sym));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dld_create_ref(%s)\n", sym));
if (dlderr = dld_create_reference(sym)) {
- SaveError("dld_create_reference(%s): %s", sym,
+ SaveError(aTHX_ "dld_create_reference(%s): %s", sym,
dld_strerror(dlderr));
goto haverror;
}
}
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dld_link(%s)\n", filename));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dld_link(%s)\n", filename));
if (dlderr = dld_link(filename)) {
- SaveError("dld_link(%s): %s", filename, dld_strerror(dlderr));
+ SaveError(aTHX_ "dld_link(%s): %s", filename, dld_strerror(dlderr));
goto haverror;
}
max = AvFILL(dl_resolve_using);
for (x = 0; x <= max; x++) {
char *sym = SvPVX(*av_fetch(dl_resolve_using, x, 0));
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dld_link(%s)\n", sym));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dld_link(%s)\n", sym));
if (dlderr = dld_link(sym)) {
- SaveError("dld_link(%s): %s", sym, dld_strerror(dlderr));
+ SaveError(aTHX_ "dld_link(%s): %s", sym, dld_strerror(dlderr));
goto haverror;
}
}
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "libref=%s\n", RETVAL));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "libref=%s\n", RETVAL));
haverror:
ST(0) = sv_newmortal() ;
if (dlderr == 0)
- sv_setiv(ST(0), (IV)RETVAL);
+ sv_setiv(ST(0), PTR2IV(RETVAL));
void *
@@ -126,16 +126,16 @@ dl_find_symbol(libhandle, symbolname)
void * libhandle
char * symbolname
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_find_symbol(handle=%x, symbol=%s)\n",
libhandle, symbolname));
RETVAL = (void *)dld_get_func(symbolname);
/* if RETVAL==NULL we should try looking for a non-function symbol */
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref = %x\n", RETVAL));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref = %x\n", RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL)
- SaveError("dl_find_symbol: Unable to find '%s' symbol", symbolname) ;
+ SaveError(aTHX_ "dl_find_symbol: Unable to find '%s' symbol", symbolname) ;
else
- sv_setiv(ST(0), (IV)RETVAL);
+ sv_setiv(ST(0), PTR2IV(RETVAL));
void
@@ -160,9 +160,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%x)\n",
perl_name, symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
diff --git a/contrib/perl5/ext/DynaLoader/dl_dlopen.xs b/contrib/perl5/ext/DynaLoader/dl_dlopen.xs
index 2459205..8e4936d 100644
--- a/contrib/perl5/ext/DynaLoader/dl_dlopen.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_dlopen.xs
@@ -1,15 +1,17 @@
/* dl_dlopen.xs
*
* Platform: SunOS/Solaris, possibly others which use dlopen.
- * Author: Paul Marquess (pmarquess@bfsec.bt.co.uk)
+ * Author: Paul Marquess (Paul.Marquess@btinternet.com)
* Created: 10th July 1994
*
* Modified:
- * 15th July 1994 - Added code to explicitly save any error messages.
- * 3rd August 1994 - Upgraded to v3 spec.
- * 9th August 1994 - Changed to use IV
- * 10th August 1994 - Tim Bunce: Added RTLD_LAZY, switchable debugging,
- * basic FreeBSD support, removed ClearError
+ * 15th July 1994 - Added code to explicitly save any error messages.
+ * 3rd August 1994 - Upgraded to v3 spec.
+ * 9th August 1994 - Changed to use IV
+ * 10th August 1994 - Tim Bunce: Added RTLD_LAZY, switchable debugging,
+ * basic FreeBSD support, removed ClearError
+ * 29th Feburary 2000 - Alan Burlison: Added functionality to close dlopen'd
+ * files when the interpreter exits
*
*/
@@ -37,6 +39,17 @@
RTLD_LAZY (==2) on Solaris 2.
+ dlclose
+ -------
+ int
+ dlclose(handle)
+ void * handle;
+
+ This function takes the handle returned by a previous invocation of
+ dlopen and closes the associated dynamic object file. It returns zero
+ on success, and non-zero on failure.
+
+
dlsym
------
void *
@@ -57,7 +70,7 @@
Returns a null-terminated string which describes the last error
that occurred with either dlopen or dlsym. After each call to
dlerror the error message will be reset to a null pointer. The
- SaveError function is used to save the error as soo as it happens.
+ SaveError function is used to save the error as soon as it happens.
Return Types
@@ -131,24 +144,35 @@
static void
-dl_private_init()
+dl_private_init(pTHX)
{
- (void)dl_generic_private_init();
+ (void)dl_generic_private_init(aTHX);
}
MODULE = DynaLoader PACKAGE = DynaLoader
BOOT:
- (void)dl_private_init();
+ (void)dl_private_init(aTHX);
void *
dl_load_file(filename, flags=0)
char * filename
int flags
- PREINIT:
+ PREINIT:
int mode = RTLD_LAZY;
- CODE:
+ CODE:
+{
+#if defined(DLOPEN_WONT_DO_RELATIVE_PATHS)
+ char pathbuf[PATH_MAX + 2];
+ if (*filename != '/' && strchr(filename, '/')) {
+ if (getcwd(pathbuf, PATH_MAX - strlen(filename))) {
+ strcat(pathbuf, "/");
+ strcat(pathbuf, filename);
+ filename = pathbuf;
+ }
+ }
+#endif
#ifdef RTLD_NOW
if (dl_nonlazy)
mode = RTLD_NOW;
@@ -157,16 +181,30 @@ dl_load_file(filename, flags=0)
#ifdef RTLD_GLOBAL
mode |= RTLD_GLOBAL;
#else
- warn("Can't make loaded symbols global on this platform while loading %s",filename);
+ Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
#endif
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
RETVAL = dlopen(filename, mode) ;
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%lx\n", (unsigned long) RETVAL));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%lx\n", (unsigned long) RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
+ SaveError(aTHX_ "%s",dlerror()) ;
else
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL));
+}
+
+
+int
+dl_unload_file(libref)
+ void * libref
+ CODE:
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_unload_file(%lx):\n", libref));
+ RETVAL = (dlclose(libref) == 0 ? 1 : 0);
+ if (!RETVAL)
+ SaveError(aTHX_ "%s", dlerror()) ;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " retval = %d\n", RETVAL));
+ OUTPUT:
+ RETVAL
void *
@@ -175,19 +213,19 @@ dl_find_symbol(libhandle, symbolname)
char * symbolname
CODE:
#ifdef DLSYM_NEEDS_UNDERSCORE
- symbolname = form("_%s", symbolname);
+ symbolname = Perl_form_nocontext("_%s", symbolname);
#endif
- DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
"dl_find_symbol(handle=%lx, symbol=%s)\n",
(unsigned long) libhandle, symbolname));
RETVAL = dlsym(libhandle, symbolname);
- DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
" symbolref = %lx\n", (unsigned long) RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
+ SaveError(aTHX_ "%s",dlerror()) ;
else
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL));
void
@@ -204,9 +242,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%lx)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%lx)\n",
perl_name, (unsigned long) symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)_((CV *)))symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
diff --git a/contrib/perl5/ext/DynaLoader/dl_dyld.xs b/contrib/perl5/ext/DynaLoader/dl_dyld.xs
new file mode 100644
index 0000000..688e474
--- /dev/null
+++ b/contrib/perl5/ext/DynaLoader/dl_dyld.xs
@@ -0,0 +1,226 @@
+/* dl_dyld.xs
+ *
+ * Platform: Darwin (Mac OS)
+ * Author: Wilfredo Sanchez <wsanchez@apple.com>
+ * Based on: dl_next.xs by Paul Marquess
+ * Based on: dl_dlopen.xs by Anno Siegel
+ * Created: Aug 15th, 1994
+ *
+ */
+
+/*
+ And Gandalf said: 'Many folk like to know beforehand what is to
+ be set on the table; but those who have laboured to prepare the
+ feast like to keep their secret; for wonder makes the words of
+ praise louder.'
+*/
+
+/* Porting notes:
+
+dl_dyld.xs is based on dl_next.xs by Anno Siegel.
+
+dl_next.xs is in turn a port from dl_dlopen.xs by Paul Marquess. It
+should not be used as a base for further ports though it may be used
+as an example for how dl_dlopen.xs can be ported to other platforms.
+
+The method used here is just to supply the sun style dlopen etc.
+functions in terms of NeXT's/Apple's dyld. The xs code proper is
+unchanged from Paul's original.
+
+The port could use some streamlining. For one, error handling could
+be simplified.
+
+This should be useable as a replacement for dl_next.xs, but it has not
+been tested on NeXT platforms.
+
+ Wilfredo Sanchez
+
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define DL_LOADONCEONLY
+
+#include "dlutils.c" /* SaveError() etc */
+
+#undef environ
+#undef bool
+#import <mach-o/dyld.h>
+
+static char * dl_last_error = (char *) 0;
+static AV *dl_resolve_using = Nullav;
+
+static char *dlerror()
+{
+ return dl_last_error;
+}
+
+int dlclose(handle) /* stub only */
+void *handle;
+{
+ return 0;
+}
+
+enum dyldErrorSource
+{
+ OFImage,
+};
+
+static void TranslateError
+ (const char *path, enum dyldErrorSource type, int number)
+{
+ dTHX;
+ char *error;
+ unsigned int index;
+ static char *OFIErrorStrings[] =
+ {
+ "%s(%d): Object Image Load Failure\n",
+ "%s(%d): Object Image Load Success\n",
+ "%s(%d): Not an recognisable object file\n",
+ "%s(%d): No valid architecture\n",
+ "%s(%d): Object image has an invalid format\n",
+ "%s(%d): Invalid access (permissions?)\n",
+ "%s(%d): Unknown error code from NSCreateObjectFileImageFromFile\n",
+ };
+#define NUM_OFI_ERRORS (sizeof(OFIErrorStrings) / sizeof(OFIErrorStrings[0]))
+
+ switch (type)
+ {
+ case OFImage:
+ index = number;
+ if (index > NUM_OFI_ERRORS - 1)
+ index = NUM_OFI_ERRORS - 1;
+ error = Perl_form_nocontext(OFIErrorStrings[index], path, number);
+ break;
+
+ default:
+ error = Perl_form_nocontext("%s(%d): Totally unknown error type %d\n",
+ path, number, type);
+ break;
+ }
+ safefree(dl_last_error);
+ dl_last_error = savepv(error);
+}
+
+static char *dlopen(char *path, int mode /* mode is ignored */)
+{
+ int dyld_result;
+ NSObjectFileImage ofile;
+ NSModule handle = NULL;
+
+ dyld_result = NSCreateObjectFileImageFromFile(path, &ofile);
+ if (dyld_result != NSObjectFileImageSuccess)
+ TranslateError(path, OFImage, dyld_result);
+ else
+ {
+ // NSLinkModule will cause the run to abort on any link error's
+ // not very friendly but the error recovery functionality is limited.
+ handle = NSLinkModule(ofile, path, TRUE);
+ }
+
+ return handle;
+}
+
+void *
+dlsym(handle, symbol)
+void *handle;
+char *symbol;
+{
+ void *addr;
+
+ if (NSIsSymbolNameDefined(symbol))
+ addr = NSAddressOfSymbol(NSLookupAndBindSymbol(symbol));
+ else
+ addr = NULL;
+
+ return addr;
+}
+
+
+
+/* ----- code from dl_dlopen.xs below here ----- */
+
+
+static void
+dl_private_init(pTHX)
+{
+ (void)dl_generic_private_init(aTHX);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+}
+
+MODULE = DynaLoader PACKAGE = DynaLoader
+
+BOOT:
+ (void)dl_private_init(aTHX);
+
+
+
+void *
+dl_load_file(filename, flags=0)
+ char * filename
+ int flags
+ PREINIT:
+ int mode = 1;
+ CODE:
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
+ if (flags & 0x01)
+ Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
+ RETVAL = dlopen(filename, mode) ;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (RETVAL == NULL)
+ SaveError(aTHX_ "%s",dlerror()) ;
+ else
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
+
+
+void *
+dl_find_symbol(libhandle, symbolname)
+ void * libhandle
+ char * symbolname
+ CODE:
+ symbolname = Perl_form_nocontext("_%s", symbolname);
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
+ "dl_find_symbol(handle=%lx, symbol=%s)\n",
+ (unsigned long) libhandle, symbolname));
+ RETVAL = dlsym(libhandle, symbolname);
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
+ " symbolref = %lx\n", (unsigned long) RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (RETVAL == NULL)
+ SaveError(aTHX_ "%s",dlerror()) ;
+ else
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
+
+
+void
+dl_undef_symbols()
+ PPCODE:
+
+
+
+# These functions should not need changing on any platform:
+
+void
+dl_install_xsub(perl_name, symref, filename="$Package")
+ char * perl_name
+ void * symref
+ char * filename
+ CODE:
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%x)\n",
+ perl_name, symref));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
+
+
+char *
+dl_error()
+ CODE:
+ RETVAL = LastError ;
+ OUTPUT:
+ RETVAL
+
+# end.
diff --git a/contrib/perl5/ext/DynaLoader/dl_hpux.xs b/contrib/perl5/ext/DynaLoader/dl_hpux.xs
index a82e0ea..582c047 100644
--- a/contrib/perl5/ext/DynaLoader/dl_hpux.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_hpux.xs
@@ -33,16 +33,16 @@ static AV *dl_resolve_using = Nullav;
static void
-dl_private_init()
+dl_private_init(pTHX)
{
- (void)dl_generic_private_init();
- dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4);
+ (void)dl_generic_private_init(aTHX);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
}
MODULE = DynaLoader PACKAGE = DynaLoader
BOOT:
- (void)dl_private_init();
+ (void)dl_private_init(aTHX);
void *
@@ -53,9 +53,9 @@ dl_load_file(filename, flags=0)
shl_t obj = NULL;
int i, max, bind_type;
CODE:
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
if (flags & 0x01)
- warn("Can't make loaded symbols global on this platform while loading %s",filename);
+ Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
if (dl_nonlazy) {
bind_type = BIND_IMMEDIATE|BIND_VERBOSE;
} else {
@@ -76,23 +76,23 @@ dl_load_file(filename, flags=0)
max = AvFILL(dl_resolve_using);
for (i = 0; i <= max; i++) {
char *sym = SvPVX(*av_fetch(dl_resolve_using, i, 0));
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s) (dependent)\n", sym));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s) (dependent)\n", sym));
obj = shl_load(sym, bind_type, 0L);
if (obj == NULL) {
goto end;
}
}
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s): ", filename));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s): ", filename));
obj = shl_load(filename, bind_type, 0L);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", obj));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", obj));
end:
ST(0) = sv_newmortal() ;
if (obj == NULL)
- SaveError("%s",Strerror(errno));
+ SaveError(aTHX_ "%s",Strerror(errno));
else
- sv_setiv( ST(0), (IV)obj);
+ sv_setiv( ST(0), PTR2IV(obj) );
void *
@@ -104,9 +104,9 @@ dl_find_symbol(libhandle, symbolname)
void *symaddr = NULL;
int status;
#ifdef __hp9000s300
- symbolname = form("_%s", symbolname);
+ symbolname = Perl_form_nocontext("_%s", symbolname);
#endif
- DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
"dl_find_symbol(handle=%lx, symbol=%s)\n",
(unsigned long) libhandle, symbolname));
@@ -114,17 +114,17 @@ dl_find_symbol(libhandle, symbolname)
errno = 0;
status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(PROCEDURE) = %x\n", symaddr));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref(PROCEDURE) = %x\n", symaddr));
if (status == -1 && errno == 0) { /* try TYPE_DATA instead */
status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(DATA) = %x\n", symaddr));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref(DATA) = %x\n", symaddr));
}
if (status == -1) {
- SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ;
+ SaveError(aTHX_ "%s",(errno) ? Strerror(errno) : "Symbol not found") ;
} else {
- sv_setiv( ST(0), (IV)symaddr);
+ sv_setiv( ST(0), PTR2IV(symaddr) );
}
@@ -142,9 +142,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%x)\n",
perl_name, symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
diff --git a/contrib/perl5/ext/DynaLoader/dl_mpeix.xs b/contrib/perl5/ext/DynaLoader/dl_mpeix.xs
index 4cc07ec..7d27901 100644
--- a/contrib/perl5/ext/DynaLoader/dl_mpeix.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_mpeix.xs
@@ -33,16 +33,16 @@ typedef struct {
static AV *dl_resolve_using = Nullav;
static void
-dl_private_init()
+dl_private_init(pTHX)
{
- (void)dl_generic_private_init();
- dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4);
+ (void)dl_generic_private_init(aTHX);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
}
MODULE = DynaLoader PACKAGE = DynaLoader
BOOT:
- (void)dl_private_init();
+ (void)dl_private_init(aTHX);
void *
dl_load_file(filename, flags=0)
@@ -53,10 +53,10 @@ dl_load_file(filename, flags=0)
p_mpe_dld obj = NULL;
int i;
CODE:
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,
flags));
if (flags & 0x01)
- warn("Can't make loaded symbols global on this platform while loading %s
+ Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s
",filename);
obj = (p_mpe_dld) safemalloc(sizeof(t_mpe_dld));
memzero(obj, sizeof(t_mpe_dld));
@@ -68,13 +68,13 @@ flags));
else
sprintf(obj->filename," %s ",filename);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," libref=%x\n", obj));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log," libref=%x\n", obj));
ST(0) = sv_newmortal() ;
if (obj == NULL)
- SaveError("%s",Strerror(errno));
+ SaveError(aTHX_"%s",Strerror(errno));
else
- sv_setiv( ST(0), (IV)obj);
+ sv_setiv( ST(0), PTR2IV(obj) );
void *
dl_find_symbol(libhandle, symbolname)
@@ -86,7 +86,7 @@ dl_find_symbol(libhandle, symbolname)
char symname[PATH_MAX + 3];
void * symaddr = NULL;
int status;
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(),"dl_find_symbol(handle=%x, symbol=%s)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_find_symbol(handle=%x, symbol=%s)\n",
libhandle, symbolname));
ST(0) = sv_newmortal() ;
errno = 0;
@@ -95,12 +95,12 @@ dl_find_symbol(libhandle, symbolname)
HPGETPROCPLABEL(8, symname, &symaddr, &status, obj->filename, 1,
0, &datalen, 1, 0, 0);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," symbolref(PROCEDURE) = %x, status=%x\n", symaddr, status));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log," symbolref(PROCEDURE) = %x, status=%x\n", symaddr, status));
if (status != 0) {
- SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ;
+ SaveError(aTHX_"%s",(errno) ? Strerror(errno) : "Symbol not found") ;
} else {
- sv_setiv( ST(0), (IV)symaddr);
+ sv_setiv( ST(0), PTR2IV(symaddr) );
}
void
@@ -115,9 +115,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(),"dl_install_xsub(name=%s, symref=%x)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_install_xsub(name=%s, symref=%x)\n",
perl_name, symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
dl_error()
diff --git a/contrib/perl5/ext/DynaLoader/dl_next.xs b/contrib/perl5/ext/DynaLoader/dl_next.xs
index dfa8a3e..b8c19f2 100644
--- a/contrib/perl5/ext/DynaLoader/dl_next.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_next.xs
@@ -72,6 +72,7 @@ enum dyldErrorSource
static void TranslateError
(const char *path, enum dyldErrorSource type, int number)
{
+ dTHX;
char *error;
unsigned int index;
static char *OFIErrorStrings[] =
@@ -92,11 +93,11 @@ static void TranslateError
index = number;
if (index > NUM_OFI_ERRORS - 1)
index = NUM_OFI_ERRORS - 1;
- error = form(OFIErrorStrings[index], path, number);
+ error = Perl_form_nocontext(OFIErrorStrings[index], path, number);
break;
default:
- error = form("%s(%d): Totally unknown error type %d\n",
+ error = Perl_form_nocontext("%s(%d): Totally unknown error type %d\n",
path, number, type);
break;
}
@@ -209,7 +210,7 @@ char *symbol;
NXStream *nxerr = OpenError();
unsigned long symref = 0;
- if (!rld_lookup(nxerr, form("_%s", symbol), &symref))
+ if (!rld_lookup(nxerr, Perl_form_nocontext("_%s", symbol), &symref))
TransferError(nxerr);
CloseError(nxerr);
return (void*) symref;
@@ -222,16 +223,16 @@ char *symbol;
static void
-dl_private_init()
+dl_private_init(pTHX)
{
- (void)dl_generic_private_init();
- dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4);
+ (void)dl_generic_private_init(aTHX);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
}
MODULE = DynaLoader PACKAGE = DynaLoader
BOOT:
- (void)dl_private_init();
+ (void)dl_private_init(aTHX);
@@ -242,16 +243,16 @@ dl_load_file(filename, flags=0)
PREINIT:
int mode = 1;
CODE:
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
if (flags & 0x01)
- warn("Can't make loaded symbols global on this platform while loading %s",filename);
+ Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
RETVAL = dlopen(filename, mode) ;
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", RETVAL));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
+ SaveError(aTHX_ "%s",dlerror()) ;
else
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
void *
@@ -260,19 +261,19 @@ dl_find_symbol(libhandle, symbolname)
char * symbolname
CODE:
#if NS_TARGET_MAJOR >= 4
- symbolname = form("_%s", symbolname);
+ symbolname = Perl_form_nocontext("_%s", symbolname);
#endif
- DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
"dl_find_symbol(handle=%lx, symbol=%s)\n",
(unsigned long) libhandle, symbolname));
RETVAL = dlsym(libhandle, symbolname);
- DLDEBUG(2, PerlIO_printf(PerlIO_stderr(),
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
" symbolref = %lx\n", (unsigned long) RETVAL));
ST(0) = sv_newmortal() ;
if (RETVAL == NULL)
- SaveError("%s",dlerror()) ;
+ SaveError(aTHX_ "%s",dlerror()) ;
else
- sv_setiv( ST(0), (IV)RETVAL);
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
void
@@ -289,9 +290,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%x)\n",
perl_name, symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
diff --git a/contrib/perl5/ext/DynaLoader/dl_vmesa.xs b/contrib/perl5/ext/DynaLoader/dl_vmesa.xs
new file mode 100644
index 0000000..8595e44
--- /dev/null
+++ b/contrib/perl5/ext/DynaLoader/dl_vmesa.xs
@@ -0,0 +1,175 @@
+/* dl_vmesa.xs
+ *
+ * Platform: VM/ESA, possibly others which use dllload etc.
+ * Author: Neale Ferguson (neale@mailbox.tabnsw.com.au)
+ * Created: 23rd Septemer, 1998
+ *
+ *
+ */
+
+/* Porting notes:
+
+
+ Definition of VM/ESA dynamic Linking functions
+ ==============================================
+ In order to make this implementation easier to understand here is a
+ quick definition of the VM/ESA Dynamic Linking functions which are
+ used here.
+
+ dlopen
+ ------
+ void *
+ dlopen(const char *path)
+
+ This function takes the name of a dynamic object file and returns
+ a descriptor which can be used by dlsym later. It returns NULL on
+ error.
+
+
+ dllsym
+ ------
+ void *
+ dlsym(void *handle, char *symbol)
+
+ Takes the handle returned from dlopen and the name of a symbol to
+ get the address of. If the symbol was found a pointer is
+ returned. It returns NULL on error.
+
+ dlerror
+ -------
+ char * dlerror()
+
+ Returns a null-terminated string which describes the last error
+ that occurred with the other dll functions. After each call to
+ dlerror the error message will be reset to a null pointer. The
+ SaveError function is used to save the error as soo as it happens.
+
+
+ Return Types
+ ============
+ In this implementation the two functions, dl_load_file &
+ dl_find_symbol, return void *. This is because the underlying SunOS
+ dynamic linker calls also return void *. This is not necessarily
+ the case for all architectures. For example, some implementation
+ will want to return a char * for dl_load_file.
+
+ If void * is not appropriate for your architecture, you will have to
+ change the void * to whatever you require. If you are not certain of
+ how Perl handles C data types, I suggest you start by consulting
+ Dean Roerich's Perl 5 API document. Also, have a look in the typemap
+ file (in the ext directory) for a fairly comprehensive list of types
+ that are already supported. If you are completely stuck, I suggest you
+ post a message to perl5-porters, comp.lang.perl.misc or if you are really
+ desperate to me.
+
+ Remember when you are making any changes that the return value from
+ dl_load_file is used as a parameter in the dl_find_symbol
+ function. Also the return value from find_symbol is used as a parameter
+ to install_xsub.
+
+
+ Dealing with Error Messages
+ ============================
+ In order to make the handling of dynamic linking errors as generic as
+ possible you should store any error messages associated with your
+ implementation with the StoreError function.
+
+ In the case of VM/ESA the function dlerror returns the error message
+ associated with the last dynamic link error. As the VM/ESA dynamic
+ linker functions return NULL on error every call to a VM/ESA dynamic
+ dynamic link routine is coded like this
+
+ RETVAL = dlopen(filename) ;
+ if (RETVAL == NULL)
+ SaveError(aTHX_ "%s",dlerror()) ;
+
+ Note that SaveError() takes a printf format string. Use a "%s" as
+ the first parameter if the error may contain and % characters.
+
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include <dll.h>
+
+
+#include "dlutils.c" /* SaveError() etc */
+
+
+static void
+dl_private_init(pTHX)
+{
+ (void)dl_generic_private_init(aTHX);
+}
+
+MODULE = DynaLoader PACKAGE = DynaLoader
+
+BOOT:
+ (void)dl_private_init(aTHX);
+
+
+void *
+dl_load_file(filename, flags=0)
+ char * filename
+ int flags
+ CODE:
+ if (flags & 0x01)
+ Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename);
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
+ RETVAL = dlopen(filename) ;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%lx\n", (unsigned long) RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (RETVAL == NULL)
+ SaveError(aTHX_ "%s",dlerror()) ;
+ else
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
+
+
+void *
+dl_find_symbol(libhandle, symbolname)
+ void * libhandle
+ char * symbolname
+ CODE:
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
+ "dl_find_symbol(handle=%lx, symbol=%s)\n",
+ (unsigned long) libhandle, symbolname));
+ RETVAL = dlsym(libhandle, symbolname);
+ DLDEBUG(2, PerlIO_printf(Perl_debug_log,
+ " symbolref = %lx\n", (unsigned long) RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (RETVAL == NULL)
+ SaveError(aTHX_ "%s",dlerror()) ;
+ else
+ sv_setiv( ST(0), PTR2IV(RETVAL) );
+
+
+void
+dl_undef_symbols()
+ PPCODE:
+
+
+
+# These functions should not need changing on any platform:
+
+void
+dl_install_xsub(perl_name, symref, filename="$Package")
+ char * perl_name
+ void * symref
+ char * filename
+ CODE:
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%lx)\n",
+ perl_name, (unsigned long) symref));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
+
+
+char *
+dl_error()
+ CODE:
+ RETVAL = LastError ;
+ OUTPUT:
+ RETVAL
+
+# end.
diff --git a/contrib/perl5/ext/DynaLoader/dl_vms.xs b/contrib/perl5/ext/DynaLoader/dl_vms.xs
index 08fd2f3..d7a1f86 100644
--- a/contrib/perl5/ext/DynaLoader/dl_vms.xs
+++ b/contrib/perl5/ext/DynaLoader/dl_vms.xs
@@ -65,6 +65,12 @@ static AV *dl_require_symbols = Nullav;
#include <ssdef.h>
#include <starlet.h>
+#if defined(VMS_WE_ARE_CASE_SENSITIVE)
+#define DL_CASE_SENSITIVE 1<<4
+#else
+#define DL_CASE_SENSITIVE 0
+#endif
+
typedef unsigned long int vmssts;
struct libref {
@@ -112,6 +118,7 @@ dl_set_error(sts,stv)
vmssts stv;
{
vmssts vec[3];
+ dTHX;
vec[0] = stv ? 2 : 1;
vec[1] = sts; vec[2] = stv;
@@ -121,12 +128,13 @@ dl_set_error(sts,stv)
static unsigned int
findsym_handler(void *sig, void *mech)
{
+ dTHX;
unsigned long int myvec[8],args, *usig = (unsigned long int *) sig;
/* Be paranoid and assume signal vector passed in might be readonly */
myvec[0] = args = usig[0] > 10 ? 9 : usig[0] - 1;
while (--args) myvec[args] = usig[args];
_ckvmssts(sys$putmsg(myvec,copy_errmsg,0,0));
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "findsym_handler: received\n\t%s\n",LastError));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "findsym_handler: received\n\t%s\n",LastError));
return SS$_CONTINUE;
}
@@ -140,16 +148,16 @@ my_find_image_symbol(struct dsc$descriptor_s *imgname,
{
unsigned long int retsts;
VAXC$ESTABLISH(findsym_handler);
- retsts = lib$find_image_symbol(imgname,symname,entry,defspec);
+ retsts = lib$find_image_symbol(imgname,symname,entry,defspec,DL_CASE_SENSITIVE);
return retsts;
}
static void
-dl_private_init()
+dl_private_init(pTHX)
{
- dl_generic_private_init();
- dl_require_symbols = perl_get_av("DynaLoader::dl_require_symbols", 0x4);
+ dl_generic_private_init(aTHX);
+ dl_require_symbols = get_av("DynaLoader::dl_require_symbols", 0x4);
/* Set up the static control blocks for dl_expand_filespec() */
dlfab = cc$rms_fab;
dlnam = cc$rms_nam;
@@ -162,7 +170,7 @@ dl_private_init()
MODULE = DynaLoader PACKAGE = DynaLoader
BOOT:
- (void)dl_private_init();
+ (void)dl_private_init(aTHX);
void
dl_expandspec(filespec)
@@ -177,11 +185,11 @@ dl_expandspec(filespec)
dlfab.fab$b_fns = strlen(vmsspec);
dlfab.fab$l_dna = 0;
dlfab.fab$b_dns = 0;
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_expand_filespec(%s):\n",vmsspec));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_expand_filespec(%s):\n",vmsspec));
/* On the first pass, just parse the specification string */
dlnam.nam$b_nop = NAM$M_SYNCHK;
sts = sys$parse(&dlfab);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tSYNCHK sys$parse = %d\n",sts));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tSYNCHK sys$parse = %d\n",sts));
if (!(sts & 1)) {
dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
ST(0) = &PL_sv_undef;
@@ -194,7 +202,7 @@ dl_expandspec(filespec)
dlnam.nam$b_type + dlnam.nam$b_ver);
deflen += dlnam.nam$b_type + dlnam.nam$b_ver;
memcpy(vmsspec,dlnam.nam$l_name,dlnam.nam$b_name);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tsplit filespec: name = %.*s, default = %.*s\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tsplit filespec: name = %.*s, default = %.*s\n",
dlnam.nam$b_name,vmsspec,deflen,defspec));
/* . . . and go back to expand it */
dlnam.nam$b_nop = 0;
@@ -202,7 +210,7 @@ dl_expandspec(filespec)
dlfab.fab$b_dns = deflen;
dlfab.fab$b_fns = dlnam.nam$b_name;
sts = sys$parse(&dlfab);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tname/default sys$parse = %d\n",sts));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tname/default sys$parse = %d\n",sts));
if (!(sts & 1)) {
dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
ST(0) = &PL_sv_undef;
@@ -210,14 +218,14 @@ dl_expandspec(filespec)
else {
/* Now find the actual file */
sts = sys$search(&dlfab);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tsys$search = %d\n",sts));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tsys$search = %d\n",sts));
if (!(sts & 1)) {
dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
ST(0) = &PL_sv_undef;
}
else {
- ST(0) = sv_2mortal(newSVpv(dlnam.nam$l_rsa,dlnam.nam$b_rsl));
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "\tresult = \\%.*s\\\n",
+ ST(0) = sv_2mortal(newSVpvn(dlnam.nam$l_rsa,dlnam.nam$b_rsl));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "\tresult = \\%.*s\\\n",
dlnam.nam$b_rsl,dlnam.nam$l_rsa));
}
}
@@ -228,6 +236,7 @@ dl_load_file(filespec, flags)
char * filespec
int flags
PREINIT:
+ dTHX;
char vmsspec[NAM$C_MAXRSS];
SV *reqSV, **reqSVhndl;
STRLEN deflen;
@@ -244,16 +253,16 @@ dl_load_file(filespec, flags)
void (*entry)();
CODE:
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filespec,flags));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filespec,flags));
specdsc.dsc$a_pointer = tovmsspec(filespec,vmsspec);
specdsc.dsc$w_length = strlen(specdsc.dsc$a_pointer);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tVMS-ified filespec is %s\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tVMS-ified filespec is %s\n",
specdsc.dsc$a_pointer));
New(1399,dlptr,1,struct libref);
dlptr->name.dsc$b_dtype = dlptr->defspec.dsc$b_dtype = DSC$K_DTYPE_T;
dlptr->name.dsc$b_class = dlptr->defspec.dsc$b_class = DSC$K_CLASS_S;
sts = sys$filescan(&specdsc,namlst,0);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tsys$filescan: returns %d, name is %.*s\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tsys$filescan: returns %d, name is %.*s\n",
sts,namlst[0].len,namlst[0].string));
if (!(sts & 1)) {
failed = 1;
@@ -269,21 +278,21 @@ dl_load_file(filespec, flags)
memcpy(dlptr->defspec.dsc$a_pointer + deflen,
namlst[0].string + namlst[0].len,
dlptr->defspec.dsc$w_length - deflen);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tlibref = name: %s, defspec: %.*s\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tlibref = name: %s, defspec: %.*s\n",
dlptr->name.dsc$a_pointer,
dlptr->defspec.dsc$w_length,
dlptr->defspec.dsc$a_pointer));
if (!(reqSVhndl = av_fetch(dl_require_symbols,0,FALSE)) || !(reqSV = *reqSVhndl)) {
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\t@dl_require_symbols empty, returning untested libref\n"));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\t@dl_require_symbols empty, returning untested libref\n"));
}
else {
symdsc.dsc$w_length = SvCUR(reqSV);
symdsc.dsc$a_pointer = SvPVX(reqSV);
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\t$dl_require_symbols[0] = %.*s\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\t$dl_require_symbols[0] = %.*s\n",
symdsc.dsc$w_length, symdsc.dsc$a_pointer));
sts = my_find_image_symbol(&(dlptr->name),&symdsc,
&entry,&(dlptr->defspec));
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tlib$find_image_symbol returns %d\n",sts));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tlib$find_image_symbol returns %d\n",sts));
if (!(sts&1)) {
failed = 1;
dl_set_error(sts,0);
@@ -298,7 +307,7 @@ dl_load_file(filespec, flags)
ST(0) = &PL_sv_undef;
}
else {
- ST(0) = sv_2mortal(newSViv((IV) dlptr));
+ ST(0) = sv_2mortal(newSViv(PTR2IV(dlptr)));
}
@@ -313,19 +322,19 @@ dl_find_symbol(librefptr,symname)
void (*entry)();
vmssts sts;
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_find_dymbol(%.*s,%.*s):\n",
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_find_dymbol(%.*s,%.*s):\n",
thislib.name.dsc$w_length, thislib.name.dsc$a_pointer,
symdsc.dsc$w_length,symdsc.dsc$a_pointer));
sts = my_find_image_symbol(&(thislib.name),&symdsc,
&entry,&(thislib.defspec));
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tlib$find_image_symbol returns %d\n",sts));
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tentry point is %d\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tlib$find_image_symbol returns %d\n",sts));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tentry point is %d\n",
(unsigned long int) entry));
if (!(sts & 1)) {
/* error message already saved by findsym_handler */
ST(0) = &PL_sv_undef;
}
- else ST(0) = sv_2mortal(newSViv((IV) entry));
+ else ST(0) = sv_2mortal(newSViv(PTR2IV(entry)));
void
@@ -341,9 +350,11 @@ dl_install_xsub(perl_name, symref, filename="$Package")
void * symref
char * filename
CODE:
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%x)\n",
perl_name, symref));
- ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
+ ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name,
+ (void(*)(pTHX_ CV *))symref,
+ filename)));
char *
diff --git a/contrib/perl5/ext/DynaLoader/dlutils.c b/contrib/perl5/ext/DynaLoader/dlutils.c
index bfa1f78..9d88f5f 100644
--- a/contrib/perl5/ext/DynaLoader/dlutils.c
+++ b/contrib/perl5/ext/DynaLoader/dlutils.c
@@ -3,6 +3,9 @@
* Currently this file is simply #included into dl_*.xs/.c files.
* It should really be split into a dlutils.h and dlutils.c
*
+ * Modified:
+ * 29th Feburary 2000 - Alan Burlison: Added functionality to close dlopen'd
+ * files when the interpreter exits
*/
@@ -18,46 +21,77 @@ static HV *dl_loaded_files = Nullhv; /* only needed on a few systems */
#ifdef DEBUGGING
-static int dl_debug = 0; /* value copied from $DynaLoader::dl_error */
+static int dl_debug = 0; /* value copied from $DynaLoader::dl_debug */
#define DLDEBUG(level,code) if (dl_debug>=level) { code; }
#else
#define DLDEBUG(level,code)
#endif
+/* Close all dlopen'd files */
static void
-dl_generic_private_init(CPERLarg) /* called by dl_*.xs dl_private_init() */
+dl_unload_all_files(pTHXo_ void *unused)
+{
+ CV *sub;
+ AV *dl_librefs;
+ SV *dl_libref;
+
+ if ((sub = get_cv("DynaLoader::dl_unload_file", FALSE)) != NULL) {
+ dl_librefs = get_av("DynaLoader::dl_librefs", FALSE);
+ while ((dl_libref = av_pop(dl_librefs)) != &PL_sv_undef) {
+ dSP;
+ ENTER;
+ SAVETMPS;
+ PUSHMARK(SP);
+ XPUSHs(sv_2mortal(dl_libref));
+ PUTBACK;
+ call_sv((SV*)sub, G_DISCARD | G_NODEBUG);
+ FREETMPS;
+ LEAVE;
+ }
+ }
+}
+
+
+static void
+dl_generic_private_init(pTHXo) /* called by dl_*.xs dl_private_init() */
{
char *perl_dl_nonlazy;
#ifdef DEBUGGING
- dl_debug = SvIV( perl_get_sv("DynaLoader::dl_debug", 0x04) );
+ SV *sv = get_sv("DynaLoader::dl_debug", 0);
+ dl_debug = sv ? SvIV(sv) : 0;
#endif
if ( (perl_dl_nonlazy = getenv("PERL_DL_NONLAZY")) != NULL )
dl_nonlazy = atoi(perl_dl_nonlazy);
if (dl_nonlazy)
- DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "DynaLoader bind mode is 'non-lazy'\n"));
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "DynaLoader bind mode is 'non-lazy'\n"));
#ifdef DL_LOADONCEONLY
if (!dl_loaded_files)
dl_loaded_files = newHV(); /* provide cache for dl_*.xs if needed */
#endif
+#ifdef DL_UNLOAD_ALL_AT_EXIT
+ call_atexit(&dl_unload_all_files, (void*)0);
+#endif
}
/* SaveError() takes printf style args and saves the result in LastError */
static void
-SaveError(CPERLarg_ char* pat, ...)
+SaveError(pTHXo_ char* pat, ...)
{
va_list args;
+ SV *msv;
char *message;
- int len;
+ STRLEN len;
/* This code is based on croak/warn, see mess() in util.c */
va_start(args, pat);
- message = mess(pat, &args);
+ msv = vmess(pat, &args);
va_end(args);
- len = strlen(message) + 1 ; /* include terminating null char */
+ message = SvPV(msv,len);
+ len++; /* include terminating null char */
/* Allocate some memory for the error message */
if (LastError)
@@ -67,6 +101,6 @@ SaveError(CPERLarg_ char* pat, ...)
/* Copy message into LastError (including terminating null char) */
strncpy(LastError, message, len) ;
- DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "DynaLoader: stored error msg '%s'\n",LastError));
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, "DynaLoader: stored error msg '%s'\n",LastError));
}
diff --git a/contrib/perl5/ext/DynaLoader/hints/aix.pl b/contrib/perl5/ext/DynaLoader/hints/aix.pl
new file mode 100644
index 0000000..7dde941
--- /dev/null
+++ b/contrib/perl5/ext/DynaLoader/hints/aix.pl
@@ -0,0 +1,10 @@
+# See dl_aix.xs for details.
+use Config;
+if ($Config{libs} =~ /-lC/ && -f '/lib/libC.a') {
+ $self->{CCFLAGS} = $Config{ccflags} . ' -DUSE_libC';
+ if (-f '/usr/ibmcxx/include/load.h') {
+ $self->{CCFLAGS} .= ' -DUSE_ibmcxx_load_h';
+ } elsif (-f '/usr/lpp/xlC/include/load.h') {
+ $self->{CCFLAGS} .= ' -DUSE_xlC_load_h';
+ }
+}
diff --git a/contrib/perl5/ext/DynaLoader/hints/linux.pl b/contrib/perl5/ext/DynaLoader/hints/linux.pl
new file mode 100644
index 0000000..06f4f4c
--- /dev/null
+++ b/contrib/perl5/ext/DynaLoader/hints/linux.pl
@@ -0,0 +1,4 @@
+# XXX Configure test needed.
+# Some Linux releases like to hide their <nlist.h>
+$self->{CCFLAGS} = $Config{ccflags} . ' -I/usr/include/libelf'
+ if -f "/usr/include/libelf/nlist.h";
diff --git a/contrib/perl5/ext/DynaLoader/hints/openbsd.pl b/contrib/perl5/ext/DynaLoader/hints/openbsd.pl
new file mode 100644
index 0000000..aeaa92c
--- /dev/null
+++ b/contrib/perl5/ext/DynaLoader/hints/openbsd.pl
@@ -0,0 +1,3 @@
+# XXX Configure test needed?
+# Some OpenBSDs seem to have a dlopen() that won't accept relative paths
+$self->{CCFLAGS} = $Config{ccflags} . ' -DDLOPEN_WONT_DO_RELATIVE_PATHS';
diff --git a/contrib/perl5/ext/Errno/Errno_pm.PL b/contrib/perl5/ext/Errno/Errno_pm.PL
index c1f26fc..df68dc3 100644
--- a/contrib/perl5/ext/Errno/Errno_pm.PL
+++ b/contrib/perl5/ext/Errno/Errno_pm.PL
@@ -180,8 +180,9 @@ use Exporter ();
use Config;
use strict;
-\$Config{'myarchname'} eq "$Config{'myarchname'}" or
- die "Errno architecture ($Config{'myarchname'}) does not match executable architecture (\$Config{'myarchname'})";
+"\$Config{'archname'}-\$Config{'osvers'}" eq
+"$Config{'archname'}-$Config{'osvers'}" or
+ die "Errno architecture ($Config{'archname'}-$Config{'osvers'}) does not match executable architecture (\$Config{'archname'}-\$Config{'osvers'})";
\$VERSION = "$VERSION";
\@ISA = qw(Exporter);
@@ -230,13 +231,14 @@ sub TIEHASH { bless [] }
sub FETCH {
my ($self, $errname) = @_;
my $proto = prototype("Errno::$errname");
+ my $errno = "";
if (defined($proto) && $proto eq "") {
no strict 'refs';
- return $! == &$errname;
+ $errno = &$errname;
+ $errno = 0 unless $! == $errno;
}
- require Carp;
- Carp::confess("No errno $errname");
-}
+ return $errno;
+}
sub STORE {
require Carp;
@@ -251,13 +253,12 @@ sub NEXTKEY {
while(($k,$v) = each %Errno::) {
my $proto = prototype("Errno::$k");
last if (defined($proto) && $proto eq "");
-
}
$k
}
sub FIRSTKEY {
- my $s = scalar keys %Errno::;
+ my $s = scalar keys %Errno::; # initialize iterator
goto &NEXTKEY;
}
@@ -286,11 +287,11 @@ C<Errno> defines and conditionally exports all the error constants
defined in your system C<errno.h> include file. It has a single export
tag, C<:POSIX>, which will export all POSIX defined error numbers.
-C<Errno> also makes C<%!> magic such that each element of C<%!> has a non-zero
-value only if C<$!> is set to that value, eg
+C<Errno> also makes C<%!> magic such that each element of C<%!> has a
+non-zero value only if C<$!> is set to that value. For example:
use Errno;
-
+
unless (open(FH, "/fangorn/spouse")) {
if ($!{ENOENT}) {
warn "Get a wife!\n";
@@ -299,6 +300,20 @@ value only if C<$!> is set to that value, eg
}
}
+If a specified constant C<EFOO> does not exist on the system, C<$!{EFOO}>
+returns C<"">. You may use C<exists $!{EFOO}> to check whether the
+constant is available on the system.
+
+=head1 CAVEATS
+
+Importing a particular constant may not be very portable, because the
+import will fail on platforms that do not have that constant. A more
+portable way to set C<$!> to a valid value is to use:
+
+ if (exists &Errno::EFOO) {
+ $! = &Errno::EFOO;
+ }
+
=head1 AUTHOR
Graham Barr <gbarr@pobox.com>
diff --git a/contrib/perl5/ext/Fcntl/Fcntl.pm b/contrib/perl5/ext/Fcntl/Fcntl.pm
index f1edb8e..92103a1 100644
--- a/contrib/perl5/ext/Fcntl/Fcntl.pm
+++ b/contrib/perl5/ext/Fcntl/Fcntl.pm
@@ -37,55 +37,99 @@ applications the newer versions of these constants are suggested
(O_APPEND, O_ASYNC, O_CREAT, O_DEFER, O_EXCL, O_NDELAY, O_NONBLOCK,
O_SYNC, O_TRUNC).
-Please refer to your native fcntl() and open() documentation to see
-what constants are implemented in your system.
+For ease of use also the SEEK_* constants (for seek() and sysseek(),
+e.g. SEEK_END) and the S_I* constants (for chmod() and stat()) are
+available for import. They can be imported either separately or using
+the tags C<:seek> and C<:mode>.
+
+Please refer to your native fcntl(2), open(2), fseek(3), lseek(2)
+(equal to Perl's seek() and sysseek(), respectively), and chmod(2)
+documentation to see what constants are implemented in your system.
+
+See L<perlopentut> to learn about the uses of the O_* constants
+with sysopen().
+
+See L<perlfunc/seek> and L<perlfunc/sysseek> about the SEEK_* constants.
+
+See L<perlfunc/stat> about the S_I* constants.
=cut
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD);
require Exporter;
-require DynaLoader;
-@ISA = qw(Exporter DynaLoader);
+use XSLoader ();
+@ISA = qw(Exporter);
$VERSION = "1.03";
# Items to export into callers namespace by default
# (move infrequently used names to @EXPORT_OK below)
@EXPORT =
qw(
FD_CLOEXEC
+ F_ALLOCSP
+ F_ALLOCSP64
+ F_COMPAT
+ F_DUP2FD
F_DUPFD
F_EXLCK
+ F_FREESP
+ F_FREESP64
+ F_FSYNC
+ F_FSYNC64
F_GETFD
F_GETFL
F_GETLK
+ F_GETLK64
F_GETOWN
+ F_NODNY
F_POSIX
+ F_RDACC
+ F_RDDNY
F_RDLCK
+ F_RWACC
+ F_RWDNY
F_SETFD
F_SETFL
F_SETLK
+ F_SETLK64
F_SETLKW
+ F_SETLKW64
F_SETOWN
+ F_SHARE
F_SHLCK
F_UNLCK
+ F_UNSHARE
+ F_WRACC
+ F_WRDNY
F_WRLCK
O_ACCMODE
+ O_ALIAS
O_APPEND
O_ASYNC
O_BINARY
O_CREAT
O_DEFER
+ O_DIRECT
+ O_DIRECTORY
O_DSYNC
O_EXCL
O_EXLOCK
+ O_LARGEFILE
O_NDELAY
O_NOCTTY
+ O_NOFOLLOW
+ O_NOINHERIT
O_NONBLOCK
+ O_RANDOM
+ O_RAW
O_RDONLY
O_RDWR
+ O_RSRC
O_RSYNC
+ O_SEQUENTIAL
O_SHLOCK
O_SYNC
+ O_TEMPORARY
O_TEXT
O_TRUNC
O_WRONLY
@@ -97,28 +141,69 @@ $VERSION = "1.03";
FASYNC
FCREAT
FDEFER
+ FDSYNC
FEXCL
+ FLARGEFILE
FNDELAY
FNONBLOCK
+ FRSYNC
FSYNC
FTRUNC
LOCK_EX
LOCK_NB
LOCK_SH
LOCK_UN
+ S_ISUID S_ISGID S_ISVTX S_ISTXT
+ _S_IFMT S_IFREG S_IFDIR S_IFLNK
+ S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
+ S_IRUSR S_IWUSR S_IXUSR S_IRWXU
+ S_IRGRP S_IWGRP S_IXGRP S_IRWXG
+ S_IROTH S_IWOTH S_IXOTH S_IRWXO
+ S_IREAD S_IWRITE S_IEXEC
+ &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO
+ &S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE
+ SEEK_SET
+ SEEK_CUR
+ SEEK_END
);
# Named groups of exports
%EXPORT_TAGS = (
'flock' => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
- 'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FEXCL
- FNDELAY FNONBLOCK FSYNC FTRUNC)],
+ 'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
+ FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
+ 'seek' => [qw(SEEK_SET SEEK_CUR SEEK_END)],
+ 'mode' => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT
+ _S_IFMT S_IFREG S_IFDIR S_IFLNK
+ S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
+ S_IRUSR S_IWUSR S_IXUSR S_IRWXU
+ S_IRGRP S_IWGRP S_IXGRP S_IRWXG
+ S_IROTH S_IWOTH S_IXOTH S_IRWXO
+ S_IREAD S_IWRITE S_IEXEC
+ S_ISREG S_ISDIR S_ISLNK S_ISSOCK
+ S_ISBLK S_ISCHR S_ISFIFO
+ S_ISWHT S_ISENFMT
+ S_IFMT S_IMODE
+ )],
);
+sub S_IFMT { @_ ? ( $_[0] & _S_IFMT() ) : _S_IFMT() }
+sub S_IMODE { $_[0] & 07777 }
+
+sub S_ISREG { ( $_[0] & _S_IFMT() ) == S_IFREG() }
+sub S_ISDIR { ( $_[0] & _S_IFMT() ) == S_IFDIR() }
+sub S_ISLNK { ( $_[0] & _S_IFMT() ) == S_IFLNK() }
+sub S_ISSOCK { ( $_[0] & _S_IFMT() ) == S_IFSOCK() }
+sub S_ISBLK { ( $_[0] & _S_IFMT() ) == S_IFBLK() }
+sub S_ISCHR { ( $_[0] & _S_IFMT() ) == S_IFCHR() }
+sub S_ISFIFO { ( $_[0] & _S_IFMT() ) == S_IFIFO() }
+sub S_ISWHT { ( $_[0] & _S_IFMT() ) == S_IFWHT() }
+sub S_ISENFMT { ( $_[0] & _S_IFMT() ) == S_IFENFMT() }
+
sub AUTOLOAD {
(my $constname = $AUTOLOAD) =~ s/.*:://;
my $val = constant($constname, 0);
if ($! != 0) {
- if ($! =~ /Invalid/) {
+ if ($! =~ /Invalid/ || $!{EINVAL}) {
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
@@ -132,6 +217,6 @@ sub AUTOLOAD {
goto &$AUTOLOAD;
}
-bootstrap Fcntl $VERSION;
+XSLoader::load 'Fcntl', $VERSION;
1;
diff --git a/contrib/perl5/ext/Fcntl/Fcntl.xs b/contrib/perl5/ext/Fcntl/Fcntl.xs
index 5149444..b597e03 100644
--- a/contrib/perl5/ext/Fcntl/Fcntl.xs
+++ b/contrib/perl5/ext/Fcntl/Fcntl.xs
@@ -1,3 +1,4 @@
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
@@ -14,6 +15,10 @@
#endif
#endif
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+
/* This comment is a kludge to get metaconfig to see the symbols
VAL_O_NONBLOCK
VAL_EAGAIN
@@ -40,8 +45,40 @@ constant(char *name, int arg)
{
errno = 0;
switch (*name) {
+ case '_':
+ if (strEQ(name, "_S_IFMT")) /* Yes, on name _S_IFMT return S_IFMT. */
+#ifdef S_IFMT
+ return S_IFMT;
+#else
+ goto not_there;
+#endif
+ break;
case 'F':
if (strnEQ(name, "F_", 2)) {
+ if (strEQ(name, "F_ALLOCSP"))
+#ifdef F_ALLOCSP
+ return F_ALLOCSP;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_ALLOCSP64"))
+#ifdef F_ALLOCSP64
+ return F_ALLOCSP64;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_COMPAT"))
+#ifdef F_COMPAT
+ return F_COMPAT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_DUP2FD"))
+#ifdef F_DUP2FD
+ return F_DUP2FD;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_DUPFD"))
#ifdef F_DUPFD
return F_DUPFD;
@@ -54,6 +91,30 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "F_FREESP"))
+#ifdef F_FREESP
+ return F_FREESP;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_FREESP64"))
+#ifdef F_FREESP64
+ return F_FREESP64;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_FSYNC"))
+#ifdef F_FSYNC
+ return F_FSYNC;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_FSYNC64"))
+#ifdef F_FSYNC64
+ return F_FSYNC64;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_GETFD"))
#ifdef F_GETFD
return F_GETFD;
@@ -72,24 +133,60 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "F_GETLK64"))
+#ifdef F_GETLK64
+ return F_GETLK64;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_GETOWN"))
#ifdef F_GETOWN
return F_GETOWN;
#else
goto not_there;
#endif
+ if (strEQ(name, "F_NODNY"))
+#ifdef F_NODNY
+ return F_NODNY;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_POSIX"))
#ifdef F_POSIX
return F_POSIX;
#else
goto not_there;
#endif
+ if (strEQ(name, "F_RDACC"))
+#ifdef F_RDACC
+ return F_RDACC;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_RDDNY"))
+#ifdef F_RDDNY
+ return F_RDDNY;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_RDLCK"))
#ifdef F_RDLCK
return F_RDLCK;
#else
goto not_there;
#endif
+ if (strEQ(name, "F_RWACC"))
+#ifdef F_RWACC
+ return F_RWACC;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_RWDNY"))
+#ifdef F_RWDNY
+ return F_RWDNY;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_SETFD"))
#ifdef F_SETFD
return F_SETFD;
@@ -108,18 +205,36 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "F_SETLK64"))
+#ifdef F_SETLK64
+ return F_SETLK64;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_SETLKW"))
#ifdef F_SETLKW
return F_SETLKW;
#else
goto not_there;
#endif
+ if (strEQ(name, "F_SETLKW64"))
+#ifdef F_SETLKW64
+ return F_SETLKW64;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_SETOWN"))
#ifdef F_SETOWN
return F_SETOWN;
#else
goto not_there;
#endif
+ if (strEQ(name, "F_SHARE"))
+#ifdef F_SHARE
+ return F_SHARE;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_SHLCK"))
#ifdef F_SHLCK
return F_SHLCK;
@@ -132,6 +247,24 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "F_UNSHARE"))
+#ifdef F_UNSHARE
+ return F_UNSHARE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_WRACC"))
+#ifdef F_WRACC
+ return F_WRACC;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "F_WRDNY"))
+#ifdef F_WRDNY
+ return F_WRDNY;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "F_WRLCK"))
#ifdef F_WRLCK
return F_WRLCK;
@@ -171,12 +304,24 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "FDSYNC"))
+#ifdef FDSYNC
+ return FDSYNC;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "FEXCL"))
#ifdef FEXCL
return FEXCL;
#else
goto not_there;
#endif
+ if (strEQ(name, "FLARGEFILE"))
+#ifdef FLARGEFILE
+ return FLARGEFILE;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "FNDELAY"))
#ifdef FNDELAY
return FNDELAY;
@@ -189,6 +334,12 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "FRSYNC"))
+#ifdef FRSYNC
+ return FRSYNC;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "FSYNC"))
#ifdef FSYNC
return FSYNC;
@@ -271,6 +422,18 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "O_DIRECT"))
+#ifdef O_DIRECT
+ return O_DIRECT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "O_DIRECTORY"))
+#ifdef O_DIRECTORY
+ return O_DIRECTORY;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "O_DSYNC"))
#ifdef O_DSYNC
return O_DSYNC;
@@ -289,6 +452,12 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "O_LARGEFILE"))
+#ifdef O_LARGEFILE
+ return O_LARGEFILE;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "O_NDELAY"))
#ifdef O_NDELAY
return O_NDELAY;
@@ -301,12 +470,36 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "O_NOFOLLOW"))
+#ifdef O_NOFOLLOW
+ return O_NOFOLLOW;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "O_NOINHERIT"))
+#ifdef O_NOINHERIT
+ return O_NOINHERIT;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "O_NONBLOCK"))
#ifdef O_NONBLOCK
return O_NONBLOCK;
#else
goto not_there;
#endif
+ if (strEQ(name, "O_RANDOM"))
+#ifdef O_RANDOM
+ return O_RANDOM;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "O_RAW"))
+#ifdef O_RAW
+ return O_RAW;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "O_RDONLY"))
#ifdef O_RDONLY
return O_RDONLY;
@@ -325,6 +518,12 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "O_SEQUENTIAL"))
+#ifdef O_SEQUENTIAL
+ return O_SEQUENTIAL;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "O_SHLOCK"))
#ifdef O_SHLOCK
return O_SHLOCK;
@@ -337,6 +536,12 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "O_TEMPORARY"))
+#ifdef O_TEMPORARY
+ return O_TEMPORARY;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "O_TEXT"))
#ifdef O_TEXT
return O_TEXT;
@@ -355,9 +560,214 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "O_ALIAS"))
+#ifdef O_ALIAS
+ return O_ALIAS;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "O_RSRC"))
+#ifdef O_RSRC
+ return O_RSRC;
+#else
+ goto not_there;
+#endif
} else
goto not_there;
break;
+ case 'S':
+ switch (name[1]) {
+ case '_':
+ if (strEQ(name, "S_ISUID"))
+#ifdef S_ISUID
+ return S_ISUID;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_ISGID"))
+#ifdef S_ISGID
+ return S_ISGID;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_ISVTX"))
+#ifdef S_ISVTX
+ return S_ISVTX;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_ISTXT"))
+#ifdef S_ISTXT
+ return S_ISTXT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFREG"))
+#ifdef S_IFREG
+ return S_IFREG;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFDIR"))
+#ifdef S_IFDIR
+ return S_IFDIR;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFLNK"))
+#ifdef S_IFLNK
+ return S_IFLNK;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFSOCK"))
+#ifdef S_IFSOCK
+ return S_IFSOCK;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFBLK"))
+#ifdef S_IFBLK
+ return S_IFBLK;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFCHR"))
+#ifdef S_IFCHR
+ return S_IFCHR;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFIFO"))
+#ifdef S_IFIFO
+ return S_IFIFO;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IFWHT"))
+#ifdef S_IFWHT
+ return S_IFWHT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_ENFMT"))
+#ifdef S_ENFMT
+ return S_ENFMT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IRUSR"))
+#ifdef S_IRUSR
+ return S_IRUSR;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IWUSR"))
+#ifdef S_IWUSR
+ return S_IWUSR;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IXUSR"))
+#ifdef S_IXUSR
+ return S_IXUSR;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IRWXU"))
+#ifdef S_IRWXU
+ return S_IRWXU;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IRGRP"))
+#ifdef S_IRGRP
+ return S_IRGRP;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IWGRP"))
+#ifdef S_IWGRP
+ return S_IWGRP;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IXGRP"))
+#ifdef S_IXGRP
+ return S_IXGRP;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IRWXG"))
+#ifdef S_IRWXG
+ return S_IRWXG;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IROTH"))
+#ifdef S_IROTH
+ return S_IROTH;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IWOTH"))
+#ifdef S_IWOTH
+ return S_IWOTH;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IXOTH"))
+#ifdef S_IXOTH
+ return S_IXOTH;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IRWXO"))
+#ifdef S_IRWXO
+ return S_IRWXO;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IREAD"))
+#ifdef S_IREAD
+ return S_IREAD;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IWRITE"))
+#ifdef S_IWRITE
+ return S_IWRITE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "S_IEXEC"))
+#ifdef S_IEXEC
+ return S_IEXEC;
+#else
+ goto not_there;
+#endif
+ break;
+ case 'E':
+ if (strEQ(name, "SEEK_CUR"))
+#ifdef SEEK_CUR
+ return SEEK_CUR;
+#else
+ return 1;
+#endif
+ if (strEQ(name, "SEEK_END"))
+#ifdef SEEK_END
+ return SEEK_END;
+#else
+ return 2;
+#endif
+ if (strEQ(name, "SEEK_SET"))
+#ifdef SEEK_SET
+ return SEEK_SET;
+#else
+ return 0;
+#endif
+ break;
+ }
}
errno = EINVAL;
return 0;
diff --git a/contrib/perl5/ext/File/Glob/Changes b/contrib/perl5/ext/File/Glob/Changes
new file mode 100644
index 0000000..e246c6d
--- /dev/null
+++ b/contrib/perl5/ext/File/Glob/Changes
@@ -0,0 +1,47 @@
+Revision history for Perl extension File::Glob
+
+0.00 Tue Dec 17 10:51:33 1996
+ - original version; created by h2xs 1.16
+
+0.90 Tue Dec 17 13:58:32 MST 1996
+ - implemented first pass access to glob(3),
+ but it's clumsy and it looks like it leaks
+ memory.
+
+0.91 Thu Sep 4 08:43:55 CDT 1997
+ - included CORE/config.h portability macros
+ - s/glob/bsd_glob/ to avoid calling and including the
+ system's glob stuff
+ - added GLOB_DEBUG for (surprise!) glob debugging
+ - tainted all filenames returned from &Glob::BSD::glob
+
+0.92 Tue Sep 30 08:31:57 CDT 1997
+ - only use lstat if HAS_LSTAT is defined
+ - renamed the glob flags to GLOB_*
+ - added GLOB_CSH convenience macro for csh(1) globbing
+ These changes thanks to Hans Mulder <hansm@icgned.nl>
+ - fixed an incompatibility with csh(1) globbing where a
+ pattern like {A*,b,c} wouldn't expand properly
+ - various compatibility changes
+ - fixed and added tests
+
+0.93 Wed Jul 1 10:39:47 CDT 1998
+ - renamed module to File::BSDGlob
+ - enabled 'globally' import directive to override the core
+ glob
+ - added Sarathy's tests for File::DosGlob
+0.99 Tue Oct 12 06:42:02 PDT 1999
+ - renamed module to File::Glob for incorporation into the
+ Perl source distribution
+ - ansified prototypes
+ - s/struct stat/Stat_t/
+ - split on spaces to make <*.c *.h> work (for compatibility)
+0.991 Tue Oct 26 09:48:00 BST 1999
+ - Add case-insensitive matching (GLOB_NOCASE)
+ - Make glob_csh case insensitive by default on Win32, VMS,
+ OS/2, DOS, RISC OS, and Mac OS
+ - Add support for :case and :nocase tags
+ - Hack to make patterns like C:* work on DOSISH systems
+ - Add support for either \ or / as separators on DOSISH systems
+ - Limit effect of \ as a quoting operator on DOSISH systems to
+ when it precedes one of []{}-~\ (to minimise backslashitis).
diff --git a/contrib/perl5/ext/File/Glob/Glob.pm b/contrib/perl5/ext/File/Glob/Glob.pm
new file mode 100644
index 0000000..4b7e54b
--- /dev/null
+++ b/contrib/perl5/ext/File/Glob/Glob.pm
@@ -0,0 +1,378 @@
+package File::Glob;
+
+use strict;
+use Carp;
+our($VERSION, @ISA, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS,
+ $AUTOLOAD, $DEFAULT_FLAGS);
+
+require Exporter;
+use XSLoader ();
+require AutoLoader;
+
+@ISA = qw(Exporter AutoLoader);
+
+@EXPORT_OK = qw(
+ csh_glob
+ glob
+ GLOB_ABEND
+ GLOB_ALTDIRFUNC
+ GLOB_BRACE
+ GLOB_CSH
+ GLOB_ERR
+ GLOB_ERROR
+ GLOB_MARK
+ GLOB_NOCASE
+ GLOB_NOCHECK
+ GLOB_NOMAGIC
+ GLOB_NOSORT
+ GLOB_NOSPACE
+ GLOB_QUOTE
+ GLOB_TILDE
+);
+
+%EXPORT_TAGS = (
+ 'glob' => [ qw(
+ GLOB_ABEND
+ GLOB_ALTDIRFUNC
+ GLOB_BRACE
+ GLOB_CSH
+ GLOB_ERR
+ GLOB_ERROR
+ GLOB_MARK
+ GLOB_NOCASE
+ GLOB_NOCHECK
+ GLOB_NOMAGIC
+ GLOB_NOSORT
+ GLOB_NOSPACE
+ GLOB_QUOTE
+ GLOB_TILDE
+ glob
+ ) ],
+);
+
+$VERSION = '0.991';
+
+sub import {
+ my $i = 1;
+ while ($i < @_) {
+ if ($_[$i] =~ /^:(case|nocase|globally)$/) {
+ splice(@_, $i, 1);
+ $DEFAULT_FLAGS &= ~GLOB_NOCASE() if $1 eq 'case';
+ $DEFAULT_FLAGS |= GLOB_NOCASE() if $1 eq 'nocase';
+ if ($1 eq 'globally') {
+ no warnings;
+ *CORE::GLOBAL::glob = \&File::Glob::csh_glob;
+ }
+ next;
+ }
+ ++$i;
+ }
+ goto &Exporter::import;
+}
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my $constname;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my $val = constant($constname, @_ ? $_[0] : 0);
+ if ($! != 0) {
+ if ($! =~ /Invalid/) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ croak "Your vendor has not defined File::Glob macro $constname";
+ }
+ }
+ eval "sub $AUTOLOAD { $val }";
+ goto &$AUTOLOAD;
+}
+
+XSLoader::load 'File::Glob', $VERSION;
+
+# Preloaded methods go here.
+
+sub GLOB_ERROR {
+ return constant('GLOB_ERROR', 0);
+}
+
+sub GLOB_CSH () { GLOB_BRACE() | GLOB_NOMAGIC() | GLOB_QUOTE() | GLOB_TILDE() }
+
+$DEFAULT_FLAGS = GLOB_CSH();
+if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos|MacOS)$/) {
+ $DEFAULT_FLAGS |= GLOB_NOCASE();
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+sub glob {
+ my ($pat,$flags) = @_;
+ $flags = $DEFAULT_FLAGS if @_ < 2;
+ return doglob($pat,$flags);
+}
+
+## borrowed heavily from gsar's File::DosGlob
+my %iter;
+my %entries;
+
+sub csh_glob {
+ my $pat = shift;
+ my $cxix = shift;
+ my @pat;
+
+ # glob without args defaults to $_
+ $pat = $_ unless defined $pat;
+
+ # extract patterns
+ if ($pat =~ /\s/) {
+ # XXX this is needed for compatibility with the csh
+ # implementation in Perl. Need to support a flag
+ # to disable this behavior.
+ require Text::ParseWords;
+ @pat = Text::ParseWords::parse_line('\s+',0,$pat);
+ }
+
+ # assume global context if not provided one
+ $cxix = '_G_' unless defined $cxix;
+ $iter{$cxix} = 0 unless exists $iter{$cxix};
+
+ # if we're just beginning, do it all first
+ if ($iter{$cxix} == 0) {
+ if (@pat) {
+ $entries{$cxix} = [ map { doglob($_, $DEFAULT_FLAGS) } @pat ];
+ }
+ else {
+ $entries{$cxix} = [ doglob($pat, $DEFAULT_FLAGS) ];
+ }
+ }
+
+ # chuck it all out, quick or slow
+ if (wantarray) {
+ delete $iter{$cxix};
+ return @{delete $entries{$cxix}};
+ }
+ else {
+ if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
+ return shift @{$entries{$cxix}};
+ }
+ else {
+ # return undef for EOL
+ delete $iter{$cxix};
+ delete $entries{$cxix};
+ return undef;
+ }
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::Glob - Perl extension for BSD glob routine
+
+=head1 SYNOPSIS
+
+ use File::Glob ':glob';
+ @list = glob('*.[ch]');
+ $homedir = glob('~gnat', GLOB_TILDE | GLOB_ERR);
+ if (GLOB_ERROR) {
+ # an error occurred reading $homedir
+ }
+
+ ## override the core glob (core glob() does this automatically
+ ## by default anyway, since v5.6.0)
+ use File::Glob ':globally';
+ my @sources = <*.{c,h,y}>
+
+ ## override the core glob, forcing case sensitivity
+ use File::Glob qw(:globally :case);
+ my @sources = <*.{c,h,y}>
+
+ ## override the core glob forcing case insensitivity
+ use File::Glob qw(:globally :nocase);
+ my @sources = <*.{c,h,y}>
+
+=head1 DESCRIPTION
+
+File::Glob implements the FreeBSD glob(3) routine, which is a superset
+of the POSIX glob() (described in IEEE Std 1003.2 "POSIX.2"). The
+glob() routine takes a mandatory C<pattern> argument, and an optional
+C<flags> argument, and returns a list of filenames matching the
+pattern, with interpretation of the pattern modified by the C<flags>
+variable. The POSIX defined flags are:
+
+=over 4
+
+=item C<GLOB_ERR>
+
+Force glob() to return an error when it encounters a directory it
+cannot open or read. Ordinarily glob() continues to find matches.
+
+=item C<GLOB_MARK>
+
+Each pathname that is a directory that matches the pattern has a slash
+appended.
+
+=item C<GLOB_NOCASE>
+
+By default, file names are assumed to be case sensitive; this flag
+makes glob() treat case differences as not significant.
+
+=item C<GLOB_NOCHECK>
+
+If the pattern does not match any pathname, then glob() returns a list
+consisting of only the pattern. If C<GLOB_QUOTE> is set, its effect
+is present in the pattern returned.
+
+=item C<GLOB_NOSORT>
+
+By default, the pathnames are sorted in ascending ASCII order; this
+flag prevents that sorting (speeding up glob()).
+
+=back
+
+The FreeBSD extensions to the POSIX standard are the following flags:
+
+=over 4
+
+=item C<GLOB_BRACE>
+
+Pre-process the string to expand C<{pat,pat,...}> strings like csh(1).
+The pattern '{}' is left unexpanded for historical reasons (and csh(1)
+does the same thing to ease typing of find(1) patterns).
+
+=item C<GLOB_NOMAGIC>
+
+Same as C<GLOB_NOCHECK> but it only returns the pattern if it does not
+contain any of the special characters "*", "?" or "[". C<NOMAGIC> is
+provided to simplify implementing the historic csh(1) globbing
+behaviour and should probably not be used anywhere else.
+
+=item C<GLOB_QUOTE>
+
+Use the backslash ('\') character for quoting: every occurrence of a
+backslash followed by a character in the pattern is replaced by that
+character, avoiding any special interpretation of the character.
+(But see below for exceptions on DOSISH systems).
+
+=item C<GLOB_TILDE>
+
+Expand patterns that start with '~' to user name home directories.
+
+=item C<GLOB_CSH>
+
+For convenience, C<GLOB_CSH> is a synonym for
+C<GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE>.
+
+=back
+
+The POSIX provided C<GLOB_APPEND>, C<GLOB_DOOFFS>, and the FreeBSD
+extensions C<GLOB_ALTDIRFUNC>, and C<GLOB_MAGCHAR> flags have not been
+implemented in the Perl version because they involve more complex
+interaction with the underlying C structures.
+
+=head1 DIAGNOSTICS
+
+glob() returns a list of matching paths, possibly zero length. If an
+error occurred, &File::Glob::GLOB_ERROR will be non-zero and C<$!> will be
+set. &File::Glob::GLOB_ERROR is guaranteed to be zero if no error occurred,
+or one of the following values otherwise:
+
+=over 4
+
+=item C<GLOB_NOSPACE>
+
+An attempt to allocate memory failed.
+
+=item C<GLOB_ABEND>
+
+The glob was stopped because an error was encountered.
+
+=back
+
+In the case where glob() has found some matching paths, but is
+interrupted by an error, glob() will return a list of filenames B<and>
+set &File::Glob::ERROR.
+
+Note that glob() deviates from POSIX and FreeBSD glob(3) behaviour by
+not considering C<ENOENT> and C<ENOTDIR> as errors - glob() will
+continue processing despite those errors, unless the C<GLOB_ERR> flag is
+set.
+
+Be aware that all filenames returned from File::Glob are tainted.
+
+=head1 NOTES
+
+=over 4
+
+=item *
+
+If you want to use multiple patterns, e.g. C<glob "a* b*">, you should
+probably throw them in a set as in C<glob "{a*,b*}>. This is because
+the argument to glob isn't subjected to parsing by the C shell. Remember
+that you can use a backslash to escape things.
+
+=item *
+
+On DOSISH systems, backslash is a valid directory separator character.
+In this case, use of backslash as a quoting character (via GLOB_QUOTE)
+interferes with the use of backslash as a directory separator. The
+best (simplest, most portable) solution is to use forward slashes for
+directory separators, and backslashes for quoting. However, this does
+not match "normal practice" on these systems. As a concession to user
+expectation, therefore, backslashes (under GLOB_QUOTE) only quote the
+glob metacharacters '[', ']', '{', '}', '-', '~', and backslash itself.
+All other backslashes are passed through unchanged.
+
+=item *
+
+Win32 users should use the real slash. If you really want to use
+backslashes, consider using Sarathy's File::DosGlob, which comes with
+the standard Perl distribution.
+
+=back
+
+=head1 AUTHOR
+
+The Perl interface was written by Nathan Torkington E<lt>gnat@frii.comE<gt>,
+and is released under the artistic license. Further modifications were
+made by Greg Bacon E<lt>gbacon@cs.uah.eduE<gt> and Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>. The C glob code has the
+following copyright:
+
+ Copyright (c) 1989, 1993 The Regents of the University of California.
+ All rights reserved.
+
+ This code is derived from software contributed to Berkeley by
+ Guido van Rossum.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+=cut
diff --git a/contrib/perl5/ext/File/Glob/Glob.xs b/contrib/perl5/ext/File/Glob/Glob.xs
new file mode 100644
index 0000000..e01ae7e
--- /dev/null
+++ b/contrib/perl5/ext/File/Glob/Glob.xs
@@ -0,0 +1,209 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include "bsd_glob.h"
+
+static int GLOB_ERROR = 0;
+
+static int
+not_here(char *s)
+{
+ croak("%s not implemented on this architecture", s);
+ return -1;
+}
+
+
+static double
+constant(char *name, int arg)
+{
+ errno = 0;
+ if (strlen(name) <= 5)
+ goto not_there;
+ switch (*(name+5)) {
+ case 'A':
+ if (strEQ(name, "GLOB_ABEND"))
+#ifdef GLOB_ABEND
+ return GLOB_ABEND;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "GLOB_ALTDIRFUNC"))
+#ifdef GLOB_ALTDIRFUNC
+ return GLOB_ALTDIRFUNC;
+#else
+ goto not_there;
+#endif
+ break;
+ case 'B':
+ if (strEQ(name, "GLOB_BRACE"))
+#ifdef GLOB_BRACE
+ return GLOB_BRACE;
+#else
+ goto not_there;
+#endif
+ break;
+ case 'C':
+ break;
+ case 'D':
+ break;
+ case 'E':
+ if (strEQ(name, "GLOB_ERR"))
+#ifdef GLOB_ERR
+ return GLOB_ERR;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "GLOB_ERROR"))
+ return GLOB_ERROR;
+ break;
+ case 'F':
+ break;
+ case 'G':
+ break;
+ case 'H':
+ break;
+ case 'I':
+ break;
+ case 'J':
+ break;
+ case 'K':
+ break;
+ case 'L':
+ break;
+ case 'M':
+ if (strEQ(name, "GLOB_MARK"))
+#ifdef GLOB_MARK
+ return GLOB_MARK;
+#else
+ goto not_there;
+#endif
+ break;
+ case 'N':
+ if (strEQ(name, "GLOB_NOCASE"))
+#ifdef GLOB_NOCASE
+ return GLOB_NOCASE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "GLOB_NOCHECK"))
+#ifdef GLOB_NOCHECK
+ return GLOB_NOCHECK;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "GLOB_NOMAGIC"))
+#ifdef GLOB_NOMAGIC
+ return GLOB_NOMAGIC;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "GLOB_NOSORT"))
+#ifdef GLOB_NOSORT
+ return GLOB_NOSORT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "GLOB_NOSPACE"))
+#ifdef GLOB_NOSPACE
+ return GLOB_NOSPACE;
+#else
+ goto not_there;
+#endif
+ break;
+ case 'O':
+ break;
+ case 'P':
+ break;
+ case 'Q':
+ if (strEQ(name, "GLOB_QUOTE"))
+#ifdef GLOB_QUOTE
+ return GLOB_QUOTE;
+#else
+ goto not_there;
+#endif
+ break;
+ case 'R':
+ break;
+ case 'S':
+ break;
+ case 'T':
+ if (strEQ(name, "GLOB_TILDE"))
+#ifdef GLOB_TILDE
+ return GLOB_TILDE;
+#else
+ goto not_there;
+#endif
+ break;
+ case 'U':
+ break;
+ case 'V':
+ break;
+ case 'W':
+ break;
+ case 'X':
+ break;
+ case 'Y':
+ break;
+ case 'Z':
+ break;
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+#ifdef WIN32
+#define errfunc NULL
+#else
+int
+errfunc(const char *foo, int bar) {
+ return !(bar == ENOENT || bar == ENOTDIR);
+}
+#endif
+
+MODULE = File::Glob PACKAGE = File::Glob
+
+void
+doglob(pattern,...)
+ char *pattern
+PROTOTYPE: $;$
+PREINIT:
+ glob_t pglob;
+ int i;
+ int retval;
+ int flags = 0;
+ SV *tmp;
+PPCODE:
+ {
+ /* allow for optional flags argument */
+ if (items > 1) {
+ flags = (int) SvIV(ST(1));
+ }
+
+ /* call glob */
+ retval = bsd_glob(pattern, flags, errfunc, &pglob);
+ GLOB_ERROR = retval;
+
+ /* return any matches found */
+ EXTEND(sp, pglob.gl_pathc);
+ for (i = 0; i < pglob.gl_pathc; i++) {
+ /* printf("# bsd_glob: %s\n", pglob.gl_pathv[i]); */
+ tmp = sv_2mortal(newSVpvn(pglob.gl_pathv[i],
+ strlen(pglob.gl_pathv[i])));
+ TAINT;
+ SvTAINT(tmp);
+ PUSHs(tmp);
+ }
+
+ bsd_globfree(&pglob);
+ }
+
+double
+constant(name,arg)
+ char *name
+ int arg
+PROTOTYPE: $$
diff --git a/contrib/perl5/ext/File/Glob/Makefile.PL b/contrib/perl5/ext/File/Glob/Makefile.PL
new file mode 100644
index 0000000..98781c9
--- /dev/null
+++ b/contrib/perl5/ext/File/Glob/Makefile.PL
@@ -0,0 +1,21 @@
+use ExtUtils::MakeMaker;
+WriteMakefile(
+ NAME => 'File::Glob',
+ VERSION_FROM => 'Glob.pm',
+ MAN3PODS => {}, # Pods will be built by installman.
+ OBJECT => 'bsd_glob$(OBJ_EXT) Glob$(OBJ_EXT)',
+
+## uncomment for glob debugging (will cause make test to fail)
+# DEFINE => '-DGLOB_DEBUG',
+# OPTIMIZE => '-g',
+);
+use Config;
+sub MY::cflags {
+ package MY;
+ my $inherited = shift->SUPER::cflags(@_);
+ if ($Config::Config{archname} =~ /^aix/ and
+ $Config::Config{use64bitall} eq 'define') {
+ $inherited =~ s/\s-O\d?//m;
+ }
+ $inherited;
+}
diff --git a/contrib/perl5/ext/File/Glob/TODO b/contrib/perl5/ext/File/Glob/TODO
new file mode 100644
index 0000000..ef2547f
--- /dev/null
+++ b/contrib/perl5/ext/File/Glob/TODO
@@ -0,0 +1,21 @@
+Some issues left to take care of:
+
+ o sane ~ handling on non-Unix platforms
+
+ Currently on non-Unix, when the glob code encounters a tilde glob
+ (.e.g ~user/foo or ~/.cshrc), it simply returns that pattern
+ without doing any expansion (meaning perl will weed it out since a
+ file of that name isn't likely to exist).
+
+ Please, if you have strong feelings about how tilde expansion
+ should be done on your favorite non-Unix platform(s), submit a
+ patch.
+
+ o path separator handling
+
+ Guido's code contains the assumption that the path separator is one
+ character (byte, probably) in length. Win32 doesn't object to the
+ true slash as a separator. I imagine MacPerl could change the SEP
+ cpp #define to ":". I have no idea what it is for VMS. Again, if
+ you have ideas and especially patches, please feel free to share
+ them.
diff --git a/contrib/perl5/ext/File/Glob/bsd_glob.c b/contrib/perl5/ext/File/Glob/bsd_glob.c
new file mode 100644
index 0000000..62bfe4f
--- /dev/null
+++ b/contrib/perl5/ext/File/Glob/bsd_glob.c
@@ -0,0 +1,945 @@
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * glob(3) -- a superset of the one defined in POSIX 1003.2.
+ *
+ * The [!...] convention to negate a range is supported (SysV, Posix, ksh).
+ *
+ * Optional extra services, controlled by flags not defined by POSIX:
+ *
+ * GLOB_QUOTE:
+ * Escaping convention: \ inhibits any special meaning the following
+ * character might have (except \ at end of string is retained).
+ * GLOB_MAGCHAR:
+ * Set in gl_flags if pattern contained a globbing character.
+ * GLOB_NOMAGIC:
+ * Same as GLOB_NOCHECK, but it will only append pattern if it did
+ * not contain any magic characters. [Used in csh style globbing]
+ * GLOB_ALTDIRFUNC:
+ * Use alternately specified directory access functions.
+ * GLOB_TILDE:
+ * expand ~user/foo to the /home/dir/of/user/foo
+ * GLOB_BRACE:
+ * expand {1,2}{a,b} to 1a 1b 2a 2b
+ * gl_matchc:
+ * Number of matches in the current invocation of glob.
+ */
+
+#include <EXTERN.h>
+#include <perl.h>
+#include <XSUB.h>
+
+#include "bsd_glob.h"
+#ifdef I_PWD
+# include <pwd.h>
+#else
+#ifdef HAS_PASSWD
+ struct passwd *getpwnam(char *);
+ struct passwd *getpwuid(Uid_t);
+#endif
+#endif
+
+#ifndef MAXPATHLEN
+# ifdef PATH_MAX
+# define MAXPATHLEN PATH_MAX
+# else
+# define MAXPATHLEN 1024
+# endif
+#endif
+
+#define BG_DOLLAR '$'
+#define BG_DOT '.'
+#define BG_EOS '\0'
+#define BG_LBRACKET '['
+#define BG_NOT '!'
+#define BG_QUESTION '?'
+#define BG_QUOTE '\\'
+#define BG_RANGE '-'
+#define BG_RBRACKET ']'
+#define BG_SEP '/'
+#ifdef DOSISH
+#define BG_SEP2 '\\'
+#endif
+#define BG_STAR '*'
+#define BG_TILDE '~'
+#define BG_UNDERSCORE '_'
+#define BG_LBRACE '{'
+#define BG_RBRACE '}'
+#define BG_SLASH '/'
+#define BG_COMMA ','
+
+#ifndef GLOB_DEBUG
+
+#define M_QUOTE 0x8000
+#define M_PROTECT 0x4000
+#define M_MASK 0xffff
+#define M_ASCII 0x00ff
+
+typedef U16 Char;
+
+#else
+
+#define M_QUOTE 0x80
+#define M_PROTECT 0x40
+#define M_MASK 0xff
+#define M_ASCII 0x7f
+
+typedef U8 Char;
+
+#endif /* !GLOB_DEBUG */
+
+
+#define CHAR(c) ((Char)((c)&M_ASCII))
+#define META(c) ((Char)((c)|M_QUOTE))
+#define M_ALL META('*')
+#define M_END META(']')
+#define M_NOT META('!')
+#define M_ONE META('?')
+#define M_RNG META('-')
+#define M_SET META('[')
+#define ismeta(c) (((c)&M_QUOTE) != 0)
+
+
+static int compare(const void *, const void *);
+static int ci_compare(const void *, const void *);
+static void g_Ctoc(const Char *, char *);
+static int g_lstat(Char *, Stat_t *, glob_t *);
+static DIR *g_opendir(Char *, glob_t *);
+static Char *g_strchr(Char *, int);
+#ifdef notdef
+static Char *g_strcat(Char *, const Char *);
+#endif
+static int g_stat(Char *, Stat_t *, glob_t *);
+static int glob0(const Char *, glob_t *);
+static int glob1(Char *, glob_t *);
+static int glob2(Char *, Char *, Char *, glob_t *);
+static int glob3(Char *, Char *, Char *, Char *, glob_t *);
+static int globextend(const Char *, glob_t *);
+static const Char * globtilde(const Char *, Char *, glob_t *);
+static int globexp1(const Char *, glob_t *);
+static int globexp2(const Char *, const Char *, glob_t *, int *);
+static int match(Char *, Char *, Char *, int);
+#ifdef GLOB_DEBUG
+static void qprintf(const char *, Char *);
+#endif /* GLOB_DEBUG */
+
+#ifdef PERL_IMPLICIT_CONTEXT
+static Direntry_t * my_readdir(DIR*);
+
+static Direntry_t *
+my_readdir(DIR *d)
+{
+ return PerlDir_read(d);
+}
+#else
+#define my_readdir readdir
+#endif
+
+int
+bsd_glob(const char *pattern, int flags,
+ int (*errfunc)(const char *, int), glob_t *pglob)
+{
+ const U8 *patnext;
+ int c;
+ Char *bufnext, *bufend, patbuf[MAXPATHLEN+1];
+
+ patnext = (U8 *) pattern;
+ if (!(flags & GLOB_APPEND)) {
+ pglob->gl_pathc = 0;
+ pglob->gl_pathv = NULL;
+ if (!(flags & GLOB_DOOFFS))
+ pglob->gl_offs = 0;
+ }
+ pglob->gl_flags = flags & ~GLOB_MAGCHAR;
+ pglob->gl_errfunc = errfunc;
+ pglob->gl_matchc = 0;
+
+ bufnext = patbuf;
+ bufend = bufnext + MAXPATHLEN;
+#ifdef DOSISH
+ /* Nasty hack to treat patterns like "C:*" correctly. In this
+ * case, the * should match any file in the current directory
+ * on the C: drive. However, the glob code does not treat the
+ * colon specially, so it looks for files beginning "C:" in
+ * the current directory. To fix this, change the pattern to
+ * add an explicit "./" at the start (just after the drive
+ * letter and colon - ie change to "C:./*").
+ */
+ if (isalpha(pattern[0]) && pattern[1] == ':' &&
+ pattern[2] != BG_SEP && pattern[2] != BG_SEP2 &&
+ bufend - bufnext > 4) {
+ *bufnext++ = pattern[0];
+ *bufnext++ = ':';
+ *bufnext++ = '.';
+ *bufnext++ = BG_SEP;
+ patnext += 2;
+ }
+#endif
+ if (flags & GLOB_QUOTE) {
+ /* Protect the quoted characters. */
+ while (bufnext < bufend && (c = *patnext++) != BG_EOS)
+ if (c == BG_QUOTE) {
+#ifdef DOSISH
+ /* To avoid backslashitis on Win32,
+ * we only treat \ as a quoting character
+ * if it precedes one of the
+ * metacharacters []-{}~\
+ */
+ if ((c = *patnext++) != '[' && c != ']' &&
+ c != '-' && c != '{' && c != '}' &&
+ c != '~' && c != '\\') {
+#else
+ if ((c = *patnext++) == BG_EOS) {
+#endif
+ c = BG_QUOTE;
+ --patnext;
+ }
+ *bufnext++ = c | M_PROTECT;
+ }
+ else
+ *bufnext++ = c;
+ }
+ else
+ while (bufnext < bufend && (c = *patnext++) != BG_EOS)
+ *bufnext++ = c;
+ *bufnext = BG_EOS;
+
+ if (flags & GLOB_BRACE)
+ return globexp1(patbuf, pglob);
+ else
+ return glob0(patbuf, pglob);
+}
+
+/*
+ * Expand recursively a glob {} pattern. When there is no more expansion
+ * invoke the standard globbing routine to glob the rest of the magic
+ * characters
+ */
+static int globexp1(const Char *pattern, glob_t *pglob)
+{
+ const Char* ptr = pattern;
+ int rv;
+
+ /* Protect a single {}, for find(1), like csh */
+ if (pattern[0] == BG_LBRACE && pattern[1] == BG_RBRACE && pattern[2] == BG_EOS)
+ return glob0(pattern, pglob);
+
+ while ((ptr = (const Char *) g_strchr((Char *) ptr, BG_LBRACE)) != NULL)
+ if (!globexp2(ptr, pattern, pglob, &rv))
+ return rv;
+
+ return glob0(pattern, pglob);
+}
+
+
+/*
+ * Recursive brace globbing helper. Tries to expand a single brace.
+ * If it succeeds then it invokes globexp1 with the new pattern.
+ * If it fails then it tries to glob the rest of the pattern and returns.
+ */
+static int globexp2(const Char *ptr, const Char *pattern,
+ glob_t *pglob, int *rv)
+{
+ int i;
+ Char *lm, *ls;
+ const Char *pe, *pm, *pl;
+ Char patbuf[MAXPATHLEN + 1];
+
+ /* copy part up to the brace */
+ for (lm = patbuf, pm = pattern; pm != ptr; *lm++ = *pm++)
+ continue;
+ ls = lm;
+
+ /* Find the balanced brace */
+ for (i = 0, pe = ++ptr; *pe; pe++)
+ if (*pe == BG_LBRACKET) {
+ /* Ignore everything between [] */
+ for (pm = pe++; *pe != BG_RBRACKET && *pe != BG_EOS; pe++)
+ continue;
+ if (*pe == BG_EOS) {
+ /*
+ * We could not find a matching BG_RBRACKET.
+ * Ignore and just look for BG_RBRACE
+ */
+ pe = pm;
+ }
+ }
+ else if (*pe == BG_LBRACE)
+ i++;
+ else if (*pe == BG_RBRACE) {
+ if (i == 0)
+ break;
+ i--;
+ }
+
+ /* Non matching braces; just glob the pattern */
+ if (i != 0 || *pe == BG_EOS) {
+ *rv = glob0(patbuf, pglob);
+ return 0;
+ }
+
+ for (i = 0, pl = pm = ptr; pm <= pe; pm++)
+ switch (*pm) {
+ case BG_LBRACKET:
+ /* Ignore everything between [] */
+ for (pl = pm++; *pm != BG_RBRACKET && *pm != BG_EOS; pm++)
+ continue;
+ if (*pm == BG_EOS) {
+ /*
+ * We could not find a matching BG_RBRACKET.
+ * Ignore and just look for BG_RBRACE
+ */
+ pm = pl;
+ }
+ break;
+
+ case BG_LBRACE:
+ i++;
+ break;
+
+ case BG_RBRACE:
+ if (i) {
+ i--;
+ break;
+ }
+ /* FALLTHROUGH */
+ case BG_COMMA:
+ if (i && *pm == BG_COMMA)
+ break;
+ else {
+ /* Append the current string */
+ for (lm = ls; (pl < pm); *lm++ = *pl++)
+ continue;
+ /*
+ * Append the rest of the pattern after the
+ * closing brace
+ */
+ for (pl = pe + 1; (*lm++ = *pl++) != BG_EOS;)
+ continue;
+
+ /* Expand the current pattern */
+#ifdef GLOB_DEBUG
+ qprintf("globexp2:", patbuf);
+#endif /* GLOB_DEBUG */
+ *rv = globexp1(patbuf, pglob);
+
+ /* move after the comma, to the next string */
+ pl = pm + 1;
+ }
+ break;
+
+ default:
+ break;
+ }
+ *rv = 0;
+ return 0;
+}
+
+
+
+/*
+ * expand tilde from the passwd file.
+ */
+static const Char *
+globtilde(const Char *pattern, Char *patbuf, glob_t *pglob)
+{
+ struct passwd *pwd;
+ char *h;
+ const Char *p;
+ Char *b;
+
+ if (*pattern != BG_TILDE || !(pglob->gl_flags & GLOB_TILDE))
+ return pattern;
+
+ /* Copy up to the end of the string or / */
+ for (p = pattern + 1, h = (char *) patbuf; *p && *p != BG_SLASH;
+ *h++ = *p++)
+ continue;
+
+ *h = BG_EOS;
+
+ if (((char *) patbuf)[0] == BG_EOS) {
+ /*
+ * handle a plain ~ or ~/ by expanding $HOME
+ * first and then trying the password file
+ */
+ if ((h = getenv("HOME")) == NULL) {
+#ifdef HAS_PASSWD
+ if ((pwd = getpwuid(getuid())) == NULL)
+ return pattern;
+ else
+ h = pwd->pw_dir;
+#else
+ return pattern;
+#endif
+ }
+ }
+ else {
+ /*
+ * Expand a ~user
+ */
+#ifdef HAS_PASSWD
+ if ((pwd = getpwnam((char*) patbuf)) == NULL)
+ return pattern;
+ else
+ h = pwd->pw_dir;
+#else
+ return pattern;
+#endif
+ }
+
+ /* Copy the home directory */
+ for (b = patbuf; *h; *b++ = *h++)
+ continue;
+
+ /* Append the rest of the pattern */
+ while ((*b++ = *p++) != BG_EOS)
+ continue;
+
+ return patbuf;
+}
+
+
+/*
+ * The main glob() routine: compiles the pattern (optionally processing
+ * quotes), calls glob1() to do the real pattern matching, and finally
+ * sorts the list (unless unsorted operation is requested). Returns 0
+ * if things went well, nonzero if errors occurred. It is not an error
+ * to find no matches.
+ */
+static int
+glob0(const Char *pattern, glob_t *pglob)
+{
+ const Char *qpat, *qpatnext;
+ int c, err, oldflags, oldpathc;
+ Char *bufnext, patbuf[MAXPATHLEN+1];
+
+ qpat = globtilde(pattern, patbuf, pglob);
+ qpatnext = qpat;
+ oldflags = pglob->gl_flags;
+ oldpathc = pglob->gl_pathc;
+ bufnext = patbuf;
+
+ /* We don't need to check for buffer overflow any more. */
+ while ((c = *qpatnext++) != BG_EOS) {
+ switch (c) {
+ case BG_LBRACKET:
+ c = *qpatnext;
+ if (c == BG_NOT)
+ ++qpatnext;
+ if (*qpatnext == BG_EOS ||
+ g_strchr((Char *) qpatnext+1, BG_RBRACKET) == NULL) {
+ *bufnext++ = BG_LBRACKET;
+ if (c == BG_NOT)
+ --qpatnext;
+ break;
+ }
+ *bufnext++ = M_SET;
+ if (c == BG_NOT)
+ *bufnext++ = M_NOT;
+ c = *qpatnext++;
+ do {
+ *bufnext++ = CHAR(c);
+ if (*qpatnext == BG_RANGE &&
+ (c = qpatnext[1]) != BG_RBRACKET) {
+ *bufnext++ = M_RNG;
+ *bufnext++ = CHAR(c);
+ qpatnext += 2;
+ }
+ } while ((c = *qpatnext++) != BG_RBRACKET);
+ pglob->gl_flags |= GLOB_MAGCHAR;
+ *bufnext++ = M_END;
+ break;
+ case BG_QUESTION:
+ pglob->gl_flags |= GLOB_MAGCHAR;
+ *bufnext++ = M_ONE;
+ break;
+ case BG_STAR:
+ pglob->gl_flags |= GLOB_MAGCHAR;
+ /* collapse adjacent stars to one,
+ * to avoid exponential behavior
+ */
+ if (bufnext == patbuf || bufnext[-1] != M_ALL)
+ *bufnext++ = M_ALL;
+ break;
+ default:
+ *bufnext++ = CHAR(c);
+ break;
+ }
+ }
+ *bufnext = BG_EOS;
+#ifdef GLOB_DEBUG
+ qprintf("glob0:", patbuf);
+#endif /* GLOB_DEBUG */
+
+ if ((err = glob1(patbuf, pglob)) != 0) {
+ pglob->gl_flags = oldflags;
+ return(err);
+ }
+
+ /*
+ * If there was no match we are going to append the pattern
+ * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified
+ * and the pattern did not contain any magic characters
+ * GLOB_NOMAGIC is there just for compatibility with csh.
+ */
+ if (pglob->gl_pathc == oldpathc &&
+ ((pglob->gl_flags & GLOB_NOCHECK) ||
+ ((pglob->gl_flags & GLOB_NOMAGIC) &&
+ !(pglob->gl_flags & GLOB_MAGCHAR))))
+ {
+#ifdef GLOB_DEBUG
+ printf("calling globextend from glob0\n");
+#endif /* GLOB_DEBUG */
+ pglob->gl_flags = oldflags;
+ return(globextend(qpat, pglob));
+ }
+ else if (!(pglob->gl_flags & GLOB_NOSORT))
+ qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc,
+ pglob->gl_pathc - oldpathc, sizeof(char *),
+ (pglob->gl_flags & GLOB_NOCASE) ? ci_compare : compare);
+ pglob->gl_flags = oldflags;
+ return(0);
+}
+
+static int
+ci_compare(const void *p, const void *q)
+{
+ const char *pp = *(const char **)p;
+ const char *qq = *(const char **)q;
+ while (*pp && *qq) {
+ if (tolower(*pp) != tolower(*qq))
+ break;
+ ++pp;
+ ++qq;
+ }
+ return (tolower(*pp) - tolower(*qq));
+}
+
+static int
+compare(const void *p, const void *q)
+{
+ return(strcmp(*(char **)p, *(char **)q));
+}
+
+static int
+glob1(Char *pattern, glob_t *pglob)
+{
+ Char pathbuf[MAXPATHLEN+1];
+
+ /* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */
+ if (*pattern == BG_EOS)
+ return(0);
+ return(glob2(pathbuf, pathbuf, pattern, pglob));
+}
+
+/*
+ * The functions glob2 and glob3 are mutually recursive; there is one level
+ * of recursion for each segment in the pattern that contains one or more
+ * meta characters.
+ */
+static int
+glob2(Char *pathbuf, Char *pathend, Char *pattern, glob_t *pglob)
+{
+ Stat_t sb;
+ Char *p, *q;
+ int anymeta;
+
+ /*
+ * Loop over pattern segments until end of pattern or until
+ * segment with meta character found.
+ */
+ for (anymeta = 0;;) {
+ if (*pattern == BG_EOS) { /* End of pattern? */
+ *pathend = BG_EOS;
+
+ if (g_lstat(pathbuf, &sb, pglob))
+ return(0);
+
+ if (((pglob->gl_flags & GLOB_MARK) &&
+ pathend[-1] != BG_SEP
+#ifdef DOSISH
+ && pathend[-1] != BG_SEP2
+#endif
+ ) && (S_ISDIR(sb.st_mode)
+ || (S_ISLNK(sb.st_mode) &&
+ (g_stat(pathbuf, &sb, pglob) == 0) &&
+ S_ISDIR(sb.st_mode)))) {
+ *pathend++ = BG_SEP;
+ *pathend = BG_EOS;
+ }
+ ++pglob->gl_matchc;
+#ifdef GLOB_DEBUG
+ printf("calling globextend from glob2\n");
+#endif /* GLOB_DEBUG */
+ return(globextend(pathbuf, pglob));
+ }
+
+ /* Find end of next segment, copy tentatively to pathend. */
+ q = pathend;
+ p = pattern;
+ while (*p != BG_EOS && *p != BG_SEP
+#ifdef DOSISH
+ && *p != BG_SEP2
+#endif
+ ) {
+ if (ismeta(*p))
+ anymeta = 1;
+ *q++ = *p++;
+ }
+
+ if (!anymeta) { /* No expansion, do next segment. */
+ pathend = q;
+ pattern = p;
+ while (*pattern == BG_SEP
+#ifdef DOSISH
+ || *pattern == BG_SEP2
+#endif
+ )
+ *pathend++ = *pattern++;
+ } else /* Need expansion, recurse. */
+ return(glob3(pathbuf, pathend, pattern, p, pglob));
+ }
+ /* NOTREACHED */
+}
+
+static int
+glob3(Char *pathbuf, Char *pathend, Char *pattern,
+ Char *restpattern, glob_t *pglob)
+{
+ register Direntry_t *dp;
+ DIR *dirp;
+ int err;
+ int nocase;
+ char buf[MAXPATHLEN];
+
+ /*
+ * The readdirfunc declaration can't be prototyped, because it is
+ * assigned, below, to two functions which are prototyped in glob.h
+ * and dirent.h as taking pointers to differently typed opaque
+ * structures.
+ */
+ Direntry_t *(*readdirfunc)();
+
+ *pathend = BG_EOS;
+ errno = 0;
+
+#ifdef VMS
+ {
+ Char *q = pathend;
+ if (q - pathbuf > 5) {
+ q -= 5;
+ if (q[0] == '.' && tolower(q[1]) == 'd' && tolower(q[2]) == 'i'
+ && tolower(q[3]) == 'r' && q[4] == '/')
+ {
+ q[0] = '/';
+ q[1] = BG_EOS;
+ pathend = q+1;
+ }
+ }
+ }
+#endif
+ if ((dirp = g_opendir(pathbuf, pglob)) == NULL) {
+ /* TODO: don't call for ENOENT or ENOTDIR? */
+ if (pglob->gl_errfunc) {
+ g_Ctoc(pathbuf, buf);
+ if (pglob->gl_errfunc(buf, errno) ||
+ (pglob->gl_flags & GLOB_ERR))
+ return (GLOB_ABEND);
+ }
+ return(0);
+ }
+
+ err = 0;
+ nocase = ((pglob->gl_flags & GLOB_NOCASE) != 0);
+
+ /* Search directory for matching names. */
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ readdirfunc = pglob->gl_readdir;
+ else
+ readdirfunc = my_readdir;
+ while ((dp = (*readdirfunc)(dirp))) {
+ register U8 *sc;
+ register Char *dc;
+
+ /* Initial BG_DOT must be matched literally. */
+ if (dp->d_name[0] == BG_DOT && *pattern != BG_DOT)
+ continue;
+ for (sc = (U8 *) dp->d_name, dc = pathend;
+ (*dc++ = *sc++) != BG_EOS;)
+ continue;
+ if (!match(pathend, pattern, restpattern, nocase)) {
+ *pathend = BG_EOS;
+ continue;
+ }
+ err = glob2(pathbuf, --dc, restpattern, pglob);
+ if (err)
+ break;
+ }
+
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ (*pglob->gl_closedir)(dirp);
+ else
+ PerlDir_close(dirp);
+ return(err);
+}
+
+
+/*
+ * Extend the gl_pathv member of a glob_t structure to accomodate a new item,
+ * add the new item, and update gl_pathc.
+ *
+ * This assumes the BSD realloc, which only copies the block when its size
+ * crosses a power-of-two boundary; for v7 realloc, this would cause quadratic
+ * behavior.
+ *
+ * Return 0 if new item added, error code if memory couldn't be allocated.
+ *
+ * Invariant of the glob_t structure:
+ * Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and
+ * gl_pathv points to (gl_offs + gl_pathc + 1) items.
+ */
+static int
+globextend(const Char *path, glob_t *pglob)
+{
+ register char **pathv;
+ register int i;
+ char *copy;
+ const Char *p;
+
+#ifdef GLOB_DEBUG
+ printf("Adding ");
+ for (p = path; *p; p++)
+ (void)printf("%c", CHAR(*p));
+ printf("\n");
+#endif /* GLOB_DEBUG */
+
+ if (pglob->gl_pathv)
+ pathv = Renew(pglob->gl_pathv,
+ (2 + pglob->gl_pathc + pglob->gl_offs),char*);
+ else
+ New(0,pathv,(2 + pglob->gl_pathc + pglob->gl_offs),char*);
+ if (pathv == NULL)
+ return(GLOB_NOSPACE);
+
+ if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) {
+ /* first time around -- clear initial gl_offs items */
+ pathv += pglob->gl_offs;
+ for (i = pglob->gl_offs; --i >= 0; )
+ *--pathv = NULL;
+ }
+ pglob->gl_pathv = pathv;
+
+ for (p = path; *p++;)
+ continue;
+ New(0, copy, p-path, char);
+ if (copy != NULL) {
+ g_Ctoc(path, copy);
+ pathv[pglob->gl_offs + pglob->gl_pathc++] = copy;
+ }
+ pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
+ return(copy == NULL ? GLOB_NOSPACE : 0);
+}
+
+
+/*
+ * pattern matching function for filenames. Each occurrence of the *
+ * pattern causes a recursion level.
+ */
+static int
+match(register Char *name, register Char *pat, register Char *patend, int nocase)
+{
+ int ok, negate_range;
+ Char c, k;
+
+ while (pat < patend) {
+ c = *pat++;
+ switch (c & M_MASK) {
+ case M_ALL:
+ if (pat == patend)
+ return(1);
+ do
+ if (match(name, pat, patend, nocase))
+ return(1);
+ while (*name++ != BG_EOS);
+ return(0);
+ case M_ONE:
+ if (*name++ == BG_EOS)
+ return(0);
+ break;
+ case M_SET:
+ ok = 0;
+ if ((k = *name++) == BG_EOS)
+ return(0);
+ if ((negate_range = ((*pat & M_MASK) == M_NOT)) != BG_EOS)
+ ++pat;
+ while (((c = *pat++) & M_MASK) != M_END)
+ if ((*pat & M_MASK) == M_RNG) {
+ if (nocase) {
+ if (tolower(c) <= tolower(k) && tolower(k) <= tolower(pat[1]))
+ ok = 1;
+ } else {
+ if (c <= k && k <= pat[1])
+ ok = 1;
+ }
+ pat += 2;
+ } else if (nocase ? (tolower(c) == tolower(k)) : (c == k))
+ ok = 1;
+ if (ok == negate_range)
+ return(0);
+ break;
+ default:
+ k = *name++;
+ if (nocase ? (tolower(k) != tolower(c)) : (k != c))
+ return(0);
+ break;
+ }
+ }
+ return(*name == BG_EOS);
+}
+
+/* Free allocated data belonging to a glob_t structure. */
+void
+bsd_globfree(glob_t *pglob)
+{
+ register int i;
+ register char **pp;
+
+ if (pglob->gl_pathv != NULL) {
+ pp = pglob->gl_pathv + pglob->gl_offs;
+ for (i = pglob->gl_pathc; i--; ++pp)
+ if (*pp)
+ Safefree(*pp);
+ Safefree(pglob->gl_pathv);
+ }
+}
+
+static DIR *
+g_opendir(register Char *str, glob_t *pglob)
+{
+ char buf[MAXPATHLEN];
+
+ if (!*str)
+ strcpy(buf, ".");
+ else
+ g_Ctoc(str, buf);
+
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ return((*pglob->gl_opendir)(buf));
+ else
+ return(PerlDir_open(buf));
+}
+
+static int
+g_lstat(register Char *fn, Stat_t *sb, glob_t *pglob)
+{
+ char buf[MAXPATHLEN];
+
+ g_Ctoc(fn, buf);
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ return((*pglob->gl_lstat)(buf, sb));
+#ifdef HAS_LSTAT
+ return(PerlLIO_lstat(buf, sb));
+#else
+ return(PerlLIO_stat(buf, sb));
+#endif /* HAS_LSTAT */
+}
+
+static int
+g_stat(register Char *fn, Stat_t *sb, glob_t *pglob)
+{
+ char buf[MAXPATHLEN];
+
+ g_Ctoc(fn, buf);
+ if (pglob->gl_flags & GLOB_ALTDIRFUNC)
+ return((*pglob->gl_stat)(buf, sb));
+ return(PerlLIO_stat(buf, sb));
+}
+
+static Char *
+g_strchr(Char *str, int ch)
+{
+ do {
+ if (*str == ch)
+ return (str);
+ } while (*str++);
+ return (NULL);
+}
+
+#ifdef notdef
+static Char *
+g_strcat(Char *dst, const Char *src)
+{
+ Char *sdst = dst;
+
+ while (*dst++)
+ continue;
+ --dst;
+ while((*dst++ = *src++) != BG_EOS)
+ continue;
+
+ return (sdst);
+}
+#endif
+
+static void
+g_Ctoc(register const Char *str, char *buf)
+{
+ register char *dc;
+
+ for (dc = buf; (*dc++ = *str++) != BG_EOS;)
+ continue;
+}
+
+#ifdef GLOB_DEBUG
+static void
+qprintf(const char *str, register Char *s)
+{
+ register Char *p;
+
+ (void)printf("%s:\n", str);
+ for (p = s; *p; p++)
+ (void)printf("%c", CHAR(*p));
+ (void)printf("\n");
+ for (p = s; *p; p++)
+ (void)printf("%c", *p & M_PROTECT ? '"' : ' ');
+ (void)printf("\n");
+ for (p = s; *p; p++)
+ (void)printf("%c", ismeta(*p) ? '_' : ' ');
+ (void)printf("\n");
+}
+#endif /* GLOB_DEBUG */
diff --git a/contrib/perl5/ext/File/Glob/bsd_glob.h b/contrib/perl5/ext/File/Glob/bsd_glob.h
new file mode 100644
index 0000000..10d1de5
--- /dev/null
+++ b/contrib/perl5/ext/File/Glob/bsd_glob.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)glob.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _BSD_GLOB_H_
+#define _BSD_GLOB_H_
+
+/* #include <sys/cdefs.h> */
+
+typedef struct {
+ int gl_pathc; /* Count of total paths so far. */
+ int gl_matchc; /* Count of paths matching pattern. */
+ int gl_offs; /* Reserved at beginning of gl_pathv. */
+ int gl_flags; /* Copy of flags parameter to glob. */
+ char **gl_pathv; /* List of paths matching pattern. */
+ /* Copy of errfunc parameter to glob. */
+ int (*gl_errfunc)(const char *, int);
+
+ /*
+ * Alternate filesystem access methods for glob; replacement
+ * versions of closedir(3), readdir(3), opendir(3), stat(2)
+ * and lstat(2).
+ */
+ void (*gl_closedir)(void *);
+ Direntry_t *(*gl_readdir)(void *);
+ void *(*gl_opendir)(const char *);
+ int (*gl_lstat)(const char *, Stat_t *);
+ int (*gl_stat)(const char *, Stat_t *);
+} glob_t;
+
+#define GLOB_APPEND 0x0001 /* Append to output from previous call. */
+#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */
+#define GLOB_ERR 0x0004 /* Return on error. */
+#define GLOB_MARK 0x0008 /* Append / to matching directories. */
+#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */
+#define GLOB_NOSORT 0x0020 /* Don't sort. */
+
+#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */
+#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */
+#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */
+#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */
+#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */
+#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */
+#define GLOB_NOCASE 0x1000 /* Treat filenames without regard for case. */
+
+#define GLOB_NOSPACE (-1) /* Malloc call failed. */
+#define GLOB_ABEND (-2) /* Unignored error. */
+
+int bsd_glob(const char *, int, int (*)(const char *, int), glob_t *);
+void bsd_globfree(glob_t *);
+
+#endif /* !_BSD_GLOB_H_ */
diff --git a/contrib/perl5/ext/GDBM_File/GDBM_File.pm b/contrib/perl5/ext/GDBM_File/GDBM_File.pm
index 09df437..ab866ee 100644
--- a/contrib/perl5/ext/GDBM_File/GDBM_File.pm
+++ b/contrib/perl5/ext/GDBM_File/GDBM_File.pm
@@ -33,21 +33,21 @@ The available functions and the gdbm/perl interface need to be documented.
=head1 SEE ALSO
-L<perl(1)>, L<DB_File(3)>.
+L<perl(1)>, L<DB_File(3)>, L<perldbmfilter>.
=cut
package GDBM_File;
use strict;
-use vars qw($VERSION @ISA @EXPORT $AUTOLOAD);
+our($VERSION, @ISA, @EXPORT, $AUTOLOAD);
require Carp;
require Tie::Hash;
require Exporter;
use AutoLoader;
-require DynaLoader;
-@ISA = qw(Tie::Hash Exporter DynaLoader);
+use XSLoader ();
+@ISA = qw(Tie::Hash Exporter);
@EXPORT = qw(
GDBM_CACHESIZE
GDBM_FAST
@@ -59,14 +59,14 @@ require DynaLoader;
GDBM_WRITER
);
-$VERSION = "1.00";
+$VERSION = "1.03";
sub AUTOLOAD {
my($constname);
($constname = $AUTOLOAD) =~ s/.*:://;
my $val = constant($constname, @_ ? $_[0] : 0);
if ($! != 0) {
- if ($! =~ /Invalid/) {
+ if ($! =~ /Invalid/ || $!{EINVAL}) {
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
@@ -78,7 +78,7 @@ sub AUTOLOAD {
goto &$AUTOLOAD;
}
-bootstrap GDBM_File $VERSION;
+XSLoader::load 'GDBM_File', $VERSION;
# Preloaded methods go here. Autoload methods go after __END__, and are
# processed by the autosplit program.
diff --git a/contrib/perl5/ext/GDBM_File/GDBM_File.xs b/contrib/perl5/ext/GDBM_File/GDBM_File.xs
index ac1ca8c..870f056 100644
--- a/contrib/perl5/ext/GDBM_File/GDBM_File.xs
+++ b/contrib/perl5/ext/GDBM_File/GDBM_File.xs
@@ -5,20 +5,40 @@
#include <gdbm.h>
#include <fcntl.h>
-typedef GDBM_FILE GDBM_File;
+typedef struct {
+ GDBM_FILE dbp ;
+ SV * filter_fetch_key ;
+ SV * filter_store_key ;
+ SV * filter_fetch_value ;
+ SV * filter_store_value ;
+ int filtering ;
+ } GDBM_File_type;
+
+typedef GDBM_File_type * GDBM_File ;
+typedef datum datum_key ;
+typedef datum datum_value ;
+
+#define ckFilter(arg,type,name) \
+ if (db->type) { \
+ SV * save_defsv ; \
+ /* printf("filtering %s\n", name) ;*/ \
+ if (db->filtering) \
+ croak("recursion detected in %s", name) ; \
+ db->filtering = TRUE ; \
+ save_defsv = newSVsv(DEFSV) ; \
+ sv_setsv(DEFSV, arg) ; \
+ PUSHMARK(sp) ; \
+ (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
+ sv_setsv(arg, DEFSV) ; \
+ sv_setsv(DEFSV, save_defsv) ; \
+ SvREFCNT_dec(save_defsv) ; \
+ db->filtering = FALSE ; \
+ /*printf("end of filtering %s\n", name) ;*/ \
+ }
-#define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
-#define gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func) \
- gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func)
-#define gdbm_FETCH(db,key) gdbm_fetch(db,key)
-#define gdbm_STORE(db,key,value,flags) gdbm_store(db,key,value,flags)
-#define gdbm_DELETE(db,key) gdbm_delete(db,key)
-#define gdbm_FIRSTKEY(db) gdbm_firstkey(db)
-#define gdbm_NEXTKEY(db,key) gdbm_nextkey(db,key)
-#define gdbm_EXISTS(db,key) gdbm_exists(db,key)
-typedef datum gdatum;
+#define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
typedef void (*FATALFUNC)();
@@ -29,6 +49,21 @@ not_here(char *s)
return -1;
}
+/* GDBM allocates the datum with system malloc() and expects the user
+ * to free() it. So we either have to free() it immediately, or have
+ * perl free() it when it deallocates the SV, depending on whether
+ * perl uses malloc()/free() or not. */
+static void
+output_datum(pTHX_ SV *arg, char *str, int size)
+{
+#if !defined(MYMALLOC) || (defined(MYMALLOC) && defined(PERL_POLLUTE_MALLOC))
+ sv_usepvn(arg, str, size);
+#else
+ sv_setpvn(arg, str, size);
+ safesysfree(str);
+#endif
+}
+
/* Versions of gdbm prior to 1.7x might not have the gdbm_sync,
gdbm_exists, and gdbm_setopt functions. Apparently Slackware
(Linux) 2.1 contains gdbm-1.5 (which dates back to 1991).
@@ -174,7 +209,23 @@ gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
int read_write
int mode
FATALFUNC fatal_func
+ CODE:
+ {
+ GDBM_FILE dbp ;
+ RETVAL = NULL ;
+ if (dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func)) {
+ RETVAL = (GDBM_File)safemalloc(sizeof(GDBM_File_type)) ;
+ Zero(RETVAL, 1, GDBM_File_type) ;
+ RETVAL->dbp = dbp ;
+ }
+
+ }
+ OUTPUT:
+ RETVAL
+
+
+#define gdbm_close(db) gdbm_close(db->dbp)
void
gdbm_close(db)
GDBM_File db
@@ -185,17 +236,20 @@ gdbm_DESTROY(db)
GDBM_File db
CODE:
gdbm_close(db);
+ safefree(db);
-gdatum
+#define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key)
+datum_value
gdbm_FETCH(db, key)
GDBM_File db
- datum key
+ datum_key key
+#define gdbm_STORE(db,key,value,flags) gdbm_store(db->dbp,key,value,flags)
int
gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
GDBM_File db
- datum key
- datum value
+ datum_key key
+ datum_value value
int flags
CLEANUP:
if (RETVAL) {
@@ -203,37 +257,43 @@ gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
croak("No write permission to gdbm file");
croak("gdbm store returned %d, errno %d, key \"%.*s\"",
RETVAL,errno,key.dsize,key.dptr);
- /* gdbm_clearerr(db); */
}
+#define gdbm_DELETE(db,key) gdbm_delete(db->dbp,key)
int
gdbm_DELETE(db, key)
GDBM_File db
- datum key
+ datum_key key
-gdatum
+#define gdbm_FIRSTKEY(db) gdbm_firstkey(db->dbp)
+datum_key
gdbm_FIRSTKEY(db)
GDBM_File db
-gdatum
+#define gdbm_NEXTKEY(db,key) gdbm_nextkey(db->dbp,key)
+datum_key
gdbm_NEXTKEY(db, key)
GDBM_File db
- datum key
+ datum_key key
+#define gdbm_reorganize(db) gdbm_reorganize(db->dbp)
int
gdbm_reorganize(db)
GDBM_File db
+#define gdbm_sync(db) gdbm_sync(db->dbp)
void
gdbm_sync(db)
GDBM_File db
+#define gdbm_EXISTS(db,key) gdbm_exists(db->dbp,key)
int
gdbm_EXISTS(db, key)
GDBM_File db
- datum key
+ datum_key key
+#define gdbm_setopt(db,optflag, optval, optlen) gdbm_setopt(db->dbp,optflag, optval, optlen)
int
gdbm_setopt (db, optflag, optval, optlen)
GDBM_File db
@@ -241,3 +301,55 @@ gdbm_setopt (db, optflag, optval, optlen)
int &optval
int optlen
+
+#define setFilter(type) \
+ { \
+ if (db->type) \
+ RETVAL = sv_mortalcopy(db->type) ; \
+ ST(0) = RETVAL ; \
+ if (db->type && (code == &PL_sv_undef)) { \
+ SvREFCNT_dec(db->type) ; \
+ db->type = NULL ; \
+ } \
+ else if (code) { \
+ if (db->type) \
+ sv_setsv(db->type, code) ; \
+ else \
+ db->type = newSVsv(code) ; \
+ } \
+ }
+
+
+
+SV *
+filter_fetch_key(db, code)
+ GDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_key) ;
+
+SV *
+filter_store_key(db, code)
+ GDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_key) ;
+
+SV *
+filter_fetch_value(db, code)
+ GDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_value) ;
+
+SV *
+filter_store_value(db, code)
+ GDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_value) ;
+
diff --git a/contrib/perl5/ext/GDBM_File/typemap b/contrib/perl5/ext/GDBM_File/typemap
index 317a8f3..4f79ae3 100644
--- a/contrib/perl5/ext/GDBM_File/typemap
+++ b/contrib/perl5/ext/GDBM_File/typemap
@@ -2,8 +2,8 @@
#################################### DBM SECTION
#
-datum T_DATUM
-gdatum T_GDATUM
+datum_key T_DATUM_K
+datum_value T_DATUM_V
NDBM_File T_PTROBJ
GDBM_File T_PTROBJ
SDBM_File T_PTROBJ
@@ -13,15 +13,20 @@ DBZ_File T_PTROBJ
FATALFUNC T_OPAQUEPTR
INPUT
-T_DATUM
+T_DATUM_K
+ ckFilter($arg, filter_store_key, \"filter_store_key\");
+ $var.dptr = SvPV($arg, PL_na);
+ $var.dsize = (int)PL_na;
+T_DATUM_V
+ ckFilter($arg, filter_store_value, \"filter_store_value\");
$var.dptr = SvPV($arg, PL_na);
$var.dsize = (int)PL_na;
-T_GDATUM
- UNIMPLEMENTED
OUTPUT
-T_DATUM
- sv_setpvn($arg, $var.dptr, $var.dsize);
-T_GDATUM
- sv_usepvn($arg, $var.dptr, $var.dsize);
+T_DATUM_K
+ output_datum(aTHX_ $arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_key,\"filter_fetch_key\");
+T_DATUM_V
+ output_datum(aTHX_ $arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_value,\"filter_fetch_value\");
T_PTROBJ
sv_setref_pv($arg, dbtype, (void*)$var);
diff --git a/contrib/perl5/ext/IO/ChangeLog b/contrib/perl5/ext/IO/ChangeLog
new file mode 100644
index 0000000..c45e785
--- /dev/null
+++ b/contrib/perl5/ext/IO/ChangeLog
@@ -0,0 +1,318 @@
+For more recent changes, see the Perl Changes* file(s).
+
+Change 173 on 1998/07/14 by <gbarr@pobox.com> (Graham Barr)
+
+ IO::Socket
+ - Added method connected
+
+ IO.xs
+ - Added check that file * is not null
+
+ t/io_udp.t
+ - Added check for connected
+ - Made change to catch recv not returning the address, and added a fix to
+ ensure test does not hang
+
+ t/io_sock.t
+ - Added check for connected.
+
+Change 137 on 1998/05/21 by <gbarr@pobox.com> (Graham Barr)
+
+ IO::Socket::INET
+ - Added checks to all peer* and host* methods for undef
+
+Change 134 on 1998/05/09 by <gbarr@pobox.com> (Graham Barr)
+
+ t/io_sock.t
+ - fix race condition on Solaris & SunOS
+
+ IO::Handle
+ - Applied patch from Gisle Aas <gisle@aas.no> for
+ documentation update
+ - Applied patch from Kuma <tgy@chocobo.org>
+ changed input_line_number to be on a per-handle basis.
+
+ IO::File
+ - Applied patch from Gisle Aas <gisle@aas.no> for
+ documentation update
+
+ IO::Seekable
+ - Applied patch from Gisle Aas <gisle@aas.no> for
+ documentation update
+ added sysseek
+
+ IO, IO::Socket::INET
+ - documentation update
+
+ IO.xs
+ - Applied patch from Gisle Aas <gisle@aas.no> for
+ blocking
+
+Change 133 on 1998/05/09 by <gbarr@pobox.com> (Graham Barr)
+
+ t/io_sock.t
+ - Added checks for blocking()
+
+Sun Apr 12 1998 <gbarr@pobox.com> (Graham Barr)
+
+ IO.xs
+ - enclosed newCONSTSUB in #ifdef as _64 now defines it.
+
+Thu Mar 19 1998 <gbarr@pobox.com> (Graham Barr)
+
+ All
+ - Changed copyright/distribution policy back to be the same as perl
+
+Sun Feb 15 1998 <gbarr@pobox.com> (Graham Barr)
+
+ IO::Socket
+ - Fix to ->accept, accept() returns false on error not undef.
+
+*** Release 1.19
+
+Thu Feb 5 1998 <gbarr@pobox.com> (Graham Barr)
+
+ All
+ - change copyright notice
+
+ IO::Socket::INET
+ - changed configure to accept PeerHost and LocalHost as well as the
+ PeerAddr and LocalAddr arguments.
+
+Mon Feb 2 1998 <gbarr@pobox.com> (Graham Barr)
+
+ IO::Handle
+ - Added printflush so that flush.pl can be depreciated
+
+ IO::Socket
+ - Remove C<use Config> statement as it was not needed
+
+Tue Jan 27 1998 <gbarr@pobox.com> (Graham Barr)
+
+ IO::Socket::INET
+ - removed carp if $^W
+
+*** Patch 1.1804
+
+Sat Jan 17 1998 <gbarr@pobox.com> (Graham Barr)
+
+ t/io_sock.t
+ - Replaced C<Listen => 0> with C<LocalAddr => 'localhost'>
+
+ IO/Socket/INET.pm
+ - Modified the MultiHomed code. Now each address for a given host has
+ a timeout of C<Timeout>.
+ - added _get_addr method for doing hostname lookups. Now Net::DNS can be
+ use by sub-classing IO::Socket::INET, Thanks Gisle Aas
+
+ t/io_multihomed.t
+ - new test added. Thanks Gisle Aas.
+
+*** Patch 1.1803
+
+Mon Nov 17 1997 <gbarr@pobox.com> (Graham Barr)
+
+ poll.c
+ - Added #ifdef I_* tests
+
+ IO::Socket
+ - Changed initialization of @domain2pkg to fix problem of Domain option
+ not working
+ - Added patch for multi-homed hosts, Thanks to Gisle Aas <gisle@aas.no>
+
+ IO::Socket::INET
+ - Change default proto to getprotobyname instead of 'tcp' constant string
+ - Added patch for multi-homed hosts, Thanks to Gisle Aas <gisle@aas.no>
+
+ t/io_sock.t
+ - Change to test fix for Domain problem fixed in IO::Socket and be
+ more comprehensive, Thanks to Gisle Aas <gisle@aas.no>
+
+ t/io_unix.t
+ - New test, Thanks to Gisle Aas <gisle@aas.no>
+
+*** Patch 1.1802
+
+Wed Nov 12 1997 <gbarr@pobox.com> (Graham Barr)
+
+ t/io_poll.t
+ - test 4 made an assumption that was not portable, fixed.
+
+*** Patch 1.1801
+
+Wed Oct 22 1997 <gbarr@pobox.com> (Graham Barr)
+
+ IO.xs
+ - change #ifdef's to allow compilation with 5.002
+
+ IO::Socket
+ - Fix to ensure that socket is not returned as non-blocking
+ unless the user asks for it
+
+ t/io_udp.t
+ - Fix to stop endless loop
+
+*** Release 1.18
+
+Mon Oct 13 1997 <gbarr@pobox.com> (Graham Barr)
+
+ IO.xs, IO::Handle
+ - 1.17 broke compatability with 5.003, small tweaks to restore
+ compatability
+
+ t/io_const.t
+ - Added new test to ensure backwards compatability with constants
+ is not broken
+
+Wed Oct 8 1997 <gbarr@pobox.com> (Graham Barr)
+
+ IO.xs
+ - Added #define's to cope with argument changes to start_subparse
+ from 5.003_22, _23 and _24
+
+ IO::Select
+ - Renamed has_error to be has_exception which is more correct,
+ has_error is a wrapper around has_exception with a warning if
+ $^W is set.
+
+ Makefile.PL
+ - Remove 'linkext' option to WriteMakefile so that static linking
+ should work properly, cannot remember why I added it.
+
+Sun Oct 5 1997 <gbarr@pobox.com> (Graham Barr)
+
+ IO::Pipe
+ - GLOB assignment does not copy the fileno while under -T
+ added checks for undefined fileno, and added fdopen
+ - reader and write can now be called as static methods
+
+ Makefile.PL
+ - Attempt to locate <poll.h> and define I_POLL if found
+
+*** Release 1.17
+
+Fri Sep 26 1997 <gbarr@pobox.com> (Graham Barr)
+
+ IO.xs
+ - Fix bug in _poll for ANSI C compilers
+
+ IO::Socket
+ - Split IO::Socket::INET and IO::Socket::UNIX into separate files
+
+ IO::File
+ - Patch to open() for when file is in current directory.
+
+*** Release 1.16
+
+Mon 15 Sep 1997 <gbarr@pobox.com> Graham Barr
+
+ o New modules
+ - IO::Dir
+ - IO::Poll
+
+ o IO::Socket
+ - Changed new to call autoflush on the new socket
+ - IO::Socket::INET->new now accepts a single argument
+ - IO::Socket::INET default to protocol 'tcp'
+
+ o IO::File
+ - Added doc for new_tmpfile
+
+ o IO::Handle
+ - Removed use of AutoLoader for constants, constants are
+ now defined as constant XS subs
+ - Added fsync, but will not be avaliable for use
+ unless HAS_FSYNC is defined, perls configure does not define
+ this yet.
+ - Moved bootstrap of IO.xs to IO.pm. IO::Handle no longer
+ contains an AUTOLOAD sub in it's ISA hier
+
+ o IO::Seekable
+ - Remove clearerr, as it is defined in IO.xs
+
+ o IO.xs
+ - Patched IO.xs with patch from Chip for setvbuf warning
+ - Added XS sub "constant" for backwards compatability
+
+ o Misc
+ - Fixed IO::Socket::configure, it was not passing $arg to domain
+ specific package
+ - Changed all $fh variables in IO::Handle to $io and all $fh
+ variables in IO::Socket to $sock as Chip suggested
+ - Fixed usage messages to be consistant
+
+*** Release 1.15
+
+Sun 19 Jan 1997 <bodg@tiuk.ti.com> Graham Barr
+
+ o Updated PODs for IO::Handle and IO::File
+ o Modified IO.xs so that DESTROY gets called on IO::File
+ objects that were created with IO::File->new_tmpfile
+ o Modified the domain2pkg code in IO::Socket so that it
+ does not use blessd refs
+ o Created a new package IO::Pipe::End so that pipe specific
+ stuff can be moved out of IO::Handle.
+ o Added Ilya's OS/2 changes to Pipe.pm and io_pipe.t
+
+ o These changes happened somtime before the release of 1.15
+ - added shutdown to IO::Socket
+ - modified connect to not use alarm
+ - modified accept and connect to use IO::Select
+
+*** Release 1.14
+
+Tue 24 Dec 1996 <bodg@tiuk.ti.com> Graham Barr
+
+ o Updated to patches in perl core dist.
+ o Added C<use strict> to all modules
+ o Modified t/io_sock.t, hopefully the race condition has gone
+ o Added close statements to reader/writer in IO::Pipe
+ o IO::Handle::syswrite was calling sysread, fixed :-)
+
+*** Release 1.12
+
+Thu 19 Sep 1996 <bodg@tiuk.ti.com> Graham Barr
+
+ o Modified IO.xs so that it will compile with pre perlio version
+ of perl (ie pre perl5.003_02)
+ o Modified IO::Socket::send so not to pass 4 arguments to send
+ if the socket is connected
+
+*** Release 1.10
+
+Mon 11 Sep 1996 <bodg@tiuk.ti.com> Graham Barr
+
+ o Fixed a bug in IO::Socket which caused DESTROY to be called
+ on a partly initialised connection
+ o Changed IO.xs to use Perlio
+ o Modified usage message to report correct package
+ o Added IO::File::new changes from Chip, to allow PERM to be passed
+ o Added sysread and syswrite methods to IO::Handle
+ o Updated documentation
+ o Fixed a bug in IO::Select that caused a hang if the last handle
+ was removed.
+ o Added count method to IO::Select
+ o Renamed and modified tests so that they can be copied into the
+ perl distribution
+ o Added fcntl and ioctl methods to IO::Handle
+
+Thu 25 Jul 1996 <bodg@tiuk.ti.com> Graham Barr
+
+ o It is now not necessary to call the domain sub-classes of
+ IO::Socket. when connect is called it notes the domain.
+ Domain specific methods, which are normally non-critical, are
+ called via this note-ing.
+ o Added methods to IO::Socket to retrieve the domain, type and
+ protocol of a given socket
+
+Tue 23 Jul 1996 <bodg@tiuk.ti.com> Graham Barr
+
+ o IO::Socket::connect changed how we do timeouts, as it did not work
+
+ o IO::Handle::new_from_fd removed method call to _ref_fd, which was
+ a leftover from FileHandle
+
+Fri 28 Jun 1996 <bodg@tiuk.ti.com> Graham Barr
+
+ o Modified IO::Socket::UNIX::configure to default to using a socket
+ type of SOCK_STREAM if no type is specified.
diff --git a/contrib/perl5/ext/IO/IO.pm b/contrib/perl5/ext/IO/IO.pm
index 4d4c81c..0087530 100644
--- a/contrib/perl5/ext/IO/IO.pm
+++ b/contrib/perl5/ext/IO/IO.pm
@@ -2,6 +2,24 @@
package IO;
+use XSLoader ();
+use Carp;
+
+$VERSION = "1.20";
+XSLoader::load 'IO', $VERSION;
+
+sub import {
+ shift;
+ my @l = @_ ? @_ : qw(Handle Seekable File Pipe Socket Dir);
+
+ eval join("", map { "require IO::" . (/(\w+)/)[0] . ";\n" } @l)
+ or croak $@;
+}
+
+1;
+
+__END__
+
=head1 NAME
IO - load various IO modules
@@ -20,17 +38,10 @@ Currently this includes:
IO::File
IO::Pipe
IO::Socket
+ IO::Dir
For more information on any of these modules, please see its respective
documentation.
=cut
-use IO::Handle;
-use IO::Seekable;
-use IO::File;
-use IO::Pipe;
-use IO::Socket;
-
-1;
-
diff --git a/contrib/perl5/ext/IO/IO.xs b/contrib/perl5/ext/IO/IO.xs
index 300581e..1b79cfd 100644
--- a/contrib/perl5/ext/IO/IO.xs
+++ b/contrib/perl5/ext/IO/IO.xs
@@ -1,20 +1,20 @@
+/*
+ * Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the same terms as Perl itself.
+ */
+
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#define PERLIO_NOT_STDIO 1
#include "perl.h"
#include "XSUB.h"
-
+#include "poll.h"
#ifdef I_UNISTD
# include <unistd.h>
#endif
-#ifdef I_FCNTL
-#if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
-#define _NO_OLDNAMES
-#endif
+#if defined(I_FCNTL) || defined(HAS_FCNTL)
# include <fcntl.h>
-#if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
-#undef _NO_OLDNAMES
-#endif
-
#endif
#ifdef PerlIO
@@ -28,6 +28,12 @@ typedef FILE * InputStream;
typedef FILE * OutputStream;
#endif
+#define MY_start_subparse(fmt,flags) start_subparse(fmt,flags)
+
+#ifndef gv_stashpvn
+#define gv_stashpvn(str,len,flags) gv_stashpv(str,flags)
+#endif
+
static int
not_here(char *s)
{
@@ -35,56 +41,99 @@ not_here(char *s)
return -1;
}
-static bool
-constant(char *name, IV *pval)
-{
- switch (*name) {
- case '_':
- if (strEQ(name, "_IOFBF"))
-#ifdef _IOFBF
- { *pval = _IOFBF; return TRUE; }
-#else
- return FALSE;
-#endif
- if (strEQ(name, "_IOLBF"))
-#ifdef _IOLBF
- { *pval = _IOLBF; return TRUE; }
-#else
- return FALSE;
-#endif
- if (strEQ(name, "_IONBF"))
-#ifdef _IONBF
- { *pval = _IONBF; return TRUE; }
-#else
- return FALSE;
+
+#ifndef PerlIO
+#define PerlIO_fileno(f) fileno(f)
#endif
- break;
- case 'S':
- if (strEQ(name, "SEEK_SET"))
-#ifdef SEEK_SET
- { *pval = SEEK_SET; return TRUE; }
+
+static int
+io_blocking(InputStream f, int block)
+{
+ int RETVAL;
+ if(!f) {
+ errno = EBADF;
+ return -1;
+ }
+#if defined(HAS_FCNTL)
+ RETVAL = fcntl(PerlIO_fileno(f), F_GETFL, 0);
+ if (RETVAL >= 0) {
+ int mode = RETVAL;
+#ifdef O_NONBLOCK
+ /* POSIX style */
+#if defined(O_NDELAY) && O_NDELAY != O_NONBLOCK
+ /* Ooops has O_NDELAY too - make sure we don't
+ * get SysV behaviour by mistake. */
+
+ /* E.g. In UNICOS and UNICOS/mk a F_GETFL returns an O_NDELAY
+ * after a successful F_SETFL of an O_NONBLOCK. */
+ RETVAL = RETVAL & (O_NONBLOCK | O_NDELAY) ? 0 : 1;
+
+ if (block >= 0) {
+ if ((mode & O_NDELAY) || ((block == 0) && !(mode & O_NONBLOCK))) {
+ int ret;
+ mode = (mode & ~O_NDELAY) | O_NONBLOCK;
+ ret = fcntl(PerlIO_fileno(f),F_SETFL,mode);
+ if(ret < 0)
+ RETVAL = ret;
+ }
+ else
+ if ((mode & O_NDELAY) || ((block > 0) && (mode & O_NONBLOCK))) {
+ int ret;
+ mode &= ~(O_NONBLOCK | O_NDELAY);
+ ret = fcntl(PerlIO_fileno(f),F_SETFL,mode);
+ if(ret < 0)
+ RETVAL = ret;
+ }
+ }
#else
- return FALSE;
-#endif
- if (strEQ(name, "SEEK_CUR"))
-#ifdef SEEK_CUR
- { *pval = SEEK_CUR; return TRUE; }
+ /* Standard POSIX */
+ RETVAL = RETVAL & O_NONBLOCK ? 0 : 1;
+
+ if ((block == 0) && !(mode & O_NONBLOCK)) {
+ int ret;
+ mode |= O_NONBLOCK;
+ ret = fcntl(PerlIO_fileno(f),F_SETFL,mode);
+ if(ret < 0)
+ RETVAL = ret;
+ }
+ else if ((block > 0) && (mode & O_NONBLOCK)) {
+ int ret;
+ mode &= ~O_NONBLOCK;
+ ret = fcntl(PerlIO_fileno(f),F_SETFL,mode);
+ if(ret < 0)
+ RETVAL = ret;
+ }
+#endif
#else
- return FALSE;
+ /* Not POSIX - better have O_NDELAY or we can't cope.
+ * for BSD-ish machines this is an acceptable alternative
+ * for SysV we can't tell "would block" from EOF but that is
+ * the way SysV is...
+ */
+ RETVAL = RETVAL & O_NDELAY ? 0 : 1;
+
+ if ((block == 0) && !(mode & O_NDELAY)) {
+ int ret;
+ mode |= O_NDELAY;
+ ret = fcntl(PerlIO_fileno(f),F_SETFL,mode);
+ if(ret < 0)
+ RETVAL = ret;
+ }
+ else if ((block > 0) && (mode & O_NDELAY)) {
+ int ret;
+ mode &= ~O_NDELAY;
+ ret = fcntl(PerlIO_fileno(f),F_SETFL,mode);
+ if(ret < 0)
+ RETVAL = ret;
+ }
#endif
- if (strEQ(name, "SEEK_END"))
-#ifdef SEEK_END
- { *pval = SEEK_END; return TRUE; }
+ }
+ return RETVAL;
#else
- return FALSE;
+ return -1;
#endif
- break;
- }
-
- return FALSE;
}
-
MODULE = IO PACKAGE = IO::Seekable PREFIX = f
SV *
@@ -110,9 +159,9 @@ fsetpos(handle, pos)
InputStream handle
SV * pos
CODE:
- char *p;
- STRLEN n_a;
- if (handle && (p = SvPVx(pos, n_a)) && n_a == sizeof(Fpos_t))
+ char *p;
+ STRLEN len;
+ if (handle && (p = SvPV(pos,len)) && len == sizeof(Fpos_t))
#ifdef PerlIO
RETVAL = PerlIO_setpos(handle, (Fpos_t*)p);
#else
@@ -144,24 +193,63 @@ new_tmpfile(packname = "IO::File")
if (do_open(gv, "+>&", 3, FALSE, 0, 0, fp)) {
ST(0) = sv_2mortal(newRV((SV*)gv));
sv_bless(ST(0), gv_stashpv(packname, TRUE));
- SvREFCNT_dec(gv); /* undo increment in newRV() */
+ SvREFCNT_dec(gv); /* undo increment in newRV() */
}
else {
ST(0) = &PL_sv_undef;
SvREFCNT_dec(gv);
}
+MODULE = IO PACKAGE = IO::Poll
+
+void
+_poll(timeout,...)
+ int timeout;
+PPCODE:
+{
+#ifdef HAS_POLL
+ int nfd = (items - 1) / 2;
+ SV *tmpsv = NEWSV(999,nfd * sizeof(struct pollfd));
+ struct pollfd *fds = (struct pollfd *)SvPVX(tmpsv);
+ int i,j,ret;
+ for(i=1, j=0 ; j < nfd ; j++) {
+ fds[j].fd = SvIV(ST(i));
+ i++;
+ fds[j].events = SvIV(ST(i));
+ i++;
+ fds[j].revents = 0;
+ }
+ if((ret = poll(fds,nfd,timeout)) >= 0) {
+ for(i=1, j=0 ; j < nfd ; j++) {
+ sv_setiv(ST(i), fds[j].fd); i++;
+ sv_setiv(ST(i), fds[j].revents); i++;
+ }
+ }
+ SvREFCNT_dec(tmpsv);
+ XSRETURN_IV(ret);
+#else
+ not_here("IO::Poll::poll");
+#endif
+}
+
+MODULE = IO PACKAGE = IO::Handle PREFIX = io_
+
+void
+io_blocking(handle,blk=-1)
+ InputStream handle
+ int blk
+PROTOTYPE: $;$
+CODE:
+{
+ int ret = io_blocking(handle, items == 1 ? -1 : blk ? 1 : 0);
+ if(ret >= 0)
+ XSRETURN_IV(ret);
+ else
+ XSRETURN_UNDEF;
+}
+
MODULE = IO PACKAGE = IO::Handle PREFIX = f
-SV *
-constant(name)
- char * name
- CODE:
- IV i;
- if (constant(name, &i))
- ST(0) = sv_2mortal(newSViv(i));
- else
- ST(0) = &PL_sv_undef;
int
ungetc(handle, c)
@@ -274,8 +362,7 @@ setvbuf(handle, buf, type, size)
int type
int size
CODE:
-/* Should check HAS_SETVBUF once Configure tests for that */
-#if defined(PERLIO_IS_STDIO) && defined(_IOFBF)
+#if defined(PERLIO_IS_STDIO) && defined(_IOFBF) && defined(HAS_SETVBUF)
if (!handle) /* Try input stream. */
handle = IoIFP(sv_2io(ST(0)));
if (handle)
@@ -291,3 +378,84 @@ setvbuf(handle, buf, type, size)
RETVAL
+SysRet
+fsync(handle)
+ OutputStream handle
+ CODE:
+#ifdef HAS_FSYNC
+ if(handle)
+ RETVAL = fsync(PerlIO_fileno(handle));
+ else {
+ RETVAL = -1;
+ errno = EINVAL;
+ }
+#else
+ RETVAL = (SysRet) not_here("IO::Handle::sync");
+#endif
+ OUTPUT:
+ RETVAL
+
+
+BOOT:
+{
+ HV *stash;
+ /*
+ * constant subs for IO::Poll
+ */
+ stash = gv_stashpvn("IO::Poll", 8, TRUE);
+#ifdef POLLIN
+ newCONSTSUB(stash,"POLLIN",newSViv(POLLIN));
+#endif
+#ifdef POLLPRI
+ newCONSTSUB(stash,"POLLPRI", newSViv(POLLPRI));
+#endif
+#ifdef POLLOUT
+ newCONSTSUB(stash,"POLLOUT", newSViv(POLLOUT));
+#endif
+#ifdef POLLRDNORM
+ newCONSTSUB(stash,"POLLRDNORM", newSViv(POLLRDNORM));
+#endif
+#ifdef POLLWRNORM
+ newCONSTSUB(stash,"POLLWRNORM", newSViv(POLLWRNORM));
+#endif
+#ifdef POLLRDBAND
+ newCONSTSUB(stash,"POLLRDBAND", newSViv(POLLRDBAND));
+#endif
+#ifdef POLLWRBAND
+ newCONSTSUB(stash,"POLLWRBAND", newSViv(POLLWRBAND));
+#endif
+#ifdef POLLNORM
+ newCONSTSUB(stash,"POLLNORM", newSViv(POLLNORM));
+#endif
+#ifdef POLLERR
+ newCONSTSUB(stash,"POLLERR", newSViv(POLLERR));
+#endif
+#ifdef POLLHUP
+ newCONSTSUB(stash,"POLLHUP", newSViv(POLLHUP));
+#endif
+#ifdef POLLNVAL
+ newCONSTSUB(stash,"POLLNVAL", newSViv(POLLNVAL));
+#endif
+ /*
+ * constant subs for IO::Handle
+ */
+ stash = gv_stashpvn("IO::Handle", 10, TRUE);
+#ifdef _IOFBF
+ newCONSTSUB(stash,"_IOFBF", newSViv(_IOFBF));
+#endif
+#ifdef _IOLBF
+ newCONSTSUB(stash,"_IOLBF", newSViv(_IOLBF));
+#endif
+#ifdef _IONBF
+ newCONSTSUB(stash,"_IONBF", newSViv(_IONBF));
+#endif
+#ifdef SEEK_SET
+ newCONSTSUB(stash,"SEEK_SET", newSViv(SEEK_SET));
+#endif
+#ifdef SEEK_CUR
+ newCONSTSUB(stash,"SEEK_CUR", newSViv(SEEK_CUR));
+#endif
+#ifdef SEEK_END
+ newCONSTSUB(stash,"SEEK_END", newSViv(SEEK_END));
+#endif
+}
diff --git a/contrib/perl5/ext/IO/Makefile.PL b/contrib/perl5/ext/IO/Makefile.PL
index 6a2d50d..095d7c2 100644
--- a/contrib/perl5/ext/IO/Makefile.PL
+++ b/contrib/perl5/ext/IO/Makefile.PL
@@ -1,8 +1,9 @@
use ExtUtils::MakeMaker;
+use Config qw(%Config);
+
WriteMakefile(
- NAME => 'IO',
- MAN3PODS => {}, # Pods will be built by installman.
- XSPROTOARG => '-noprototypes', # XXX remove later?
- VERSION_FROM => 'lib/IO/Handle.pm',
- XS_VERSION => 1.15
+ VERSION_FROM => "IO.pm",
+ NAME => "IO",
+ OBJECT => '$(O_FILES)',
+ MAN3PODS => {}, # Pods will be built by installman.
);
diff --git a/contrib/perl5/ext/IO/README b/contrib/perl5/ext/IO/README
index e855afa..191d550 100644
--- a/contrib/perl5/ext/IO/README
+++ b/contrib/perl5/ext/IO/README
@@ -1,4 +1,5 @@
-This directory contains files from the IO distribution maintained by
-Graham Barr <bodg@tiuk.ti.com>. If you find that you have to modify
-any files in this directory then please forward him a patch for only
-the files in this directory.
+This directory contains files from the IO distribution created by
+Graham Barr. It is currently maintained by the Perl Porters as part
+of the Perl source distribution. If you find that you have to modify
+any files in this directory then please forward them a patch at
+<perl5-porters@perl.org>.
diff --git a/contrib/perl5/ext/IO/lib/IO/Dir.pm b/contrib/perl5/ext/IO/lib/IO/Dir.pm
new file mode 100644
index 0000000..1fa07ed
--- /dev/null
+++ b/contrib/perl5/ext/IO/lib/IO/Dir.pm
@@ -0,0 +1,239 @@
+# IO::Dir.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Dir;
+
+use 5.003_26;
+
+use strict;
+use Carp;
+use Symbol;
+use Exporter;
+use IO::File;
+our(@ISA, $VERSION, @EXPORT_OK);
+use Tie::Hash;
+use File::stat;
+
+@ISA = qw(Tie::Hash Exporter);
+$VERSION = "1.03";
+@EXPORT_OK = qw(DIR_UNLINK);
+
+sub DIR_UNLINK () { 1 }
+
+sub new {
+ @_ >= 1 && @_ <= 2 or croak 'usage: new IO::Dir [DIRNAME]';
+ my $class = shift;
+ my $dh = gensym;
+ if (@_) {
+ IO::Dir::open($dh, $_[0])
+ or return undef;
+ }
+ bless $dh, $class;
+}
+
+sub DESTROY {
+ my ($dh) = @_;
+ closedir($dh);
+}
+
+sub open {
+ @_ == 2 or croak 'usage: $dh->open(DIRNAME)';
+ my ($dh, $dirname) = @_;
+ return undef
+ unless opendir($dh, $dirname);
+ ${*$dh}{io_dir_path} = $dirname;
+ 1;
+}
+
+sub close {
+ @_ == 1 or croak 'usage: $dh->close()';
+ my ($dh) = @_;
+ closedir($dh);
+}
+
+sub read {
+ @_ == 1 or croak 'usage: $dh->read()';
+ my ($dh) = @_;
+ readdir($dh);
+}
+
+sub seek {
+ @_ == 2 or croak 'usage: $dh->seek(POS)';
+ my ($dh,$pos) = @_;
+ seekdir($dh,$pos);
+}
+
+sub tell {
+ @_ == 1 or croak 'usage: $dh->tell()';
+ my ($dh) = @_;
+ telldir($dh);
+}
+
+sub rewind {
+ @_ == 1 or croak 'usage: $dh->rewind()';
+ my ($dh) = @_;
+ rewinddir($dh);
+}
+
+sub TIEHASH {
+ my($class,$dir,$options) = @_;
+
+ my $dh = $class->new($dir)
+ or return undef;
+
+ $options ||= 0;
+
+ ${*$dh}{io_dir_unlink} = $options & DIR_UNLINK;
+ $dh;
+}
+
+sub FIRSTKEY {
+ my($dh) = @_;
+ $dh->rewind;
+ scalar $dh->read;
+}
+
+sub NEXTKEY {
+ my($dh) = @_;
+ scalar $dh->read;
+}
+
+sub EXISTS {
+ my($dh,$key) = @_;
+ -e ${*$dh}{io_dir_path} . "/" . $key;
+}
+
+sub FETCH {
+ my($dh,$key) = @_;
+ &lstat(${*$dh}{io_dir_path} . "/" . $key);
+}
+
+sub STORE {
+ my($dh,$key,$data) = @_;
+ my($atime,$mtime) = ref($data) ? @$data : ($data,$data);
+ my $file = ${*$dh}{io_dir_path} . "/" . $key;
+ unless(-e $file) {
+ my $io = IO::File->new($file,O_CREAT | O_RDWR);
+ $io->close if $io;
+ }
+ utime($atime,$mtime, $file);
+}
+
+sub DELETE {
+ my($dh,$key) = @_;
+ # Only unlink if unlink-ing is enabled
+ my $file = ${*$dh}{io_dir_path} . "/" . $key;
+
+ return 0
+ unless ${*$dh}{io_dir_unlink};
+
+ -d $file
+ ? rmdir($file)
+ : unlink($file);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Dir - supply object methods for directory handles
+
+=head1 SYNOPSIS
+
+ use IO::Dir;
+ $d = new IO::Dir ".";
+ if (defined $d) {
+ while (defined($_ = $d->read)) { something($_); }
+ $d->rewind;
+ while (defined($_ = $d->read)) { something_else($_); }
+ undef $d;
+ }
+
+ tie %dir, IO::Dir, ".";
+ foreach (keys %dir) {
+ print $_, " " , $dir{$_}->size,"\n";
+ }
+
+=head1 DESCRIPTION
+
+The C<IO::Dir> package provides two interfaces to perl's directory reading
+routines.
+
+The first interface is an object approach. C<IO::Dir> provides an object
+constructor and methods, which are just wrappers around perl's built in
+directory reading routines.
+
+=over 4
+
+=item new ( [ DIRNAME ] )
+
+C<new> is the constuctor for C<IO::Dir> objects. It accepts one optional
+argument which, if given, C<new> will pass to C<open>
+
+=back
+
+The following methods are wrappers for the directory related functions built
+into perl (the trailing `dir' has been removed from the names). See L<perlfunc>
+for details of these functions.
+
+=over 4
+
+=item open ( DIRNAME )
+
+=item read ()
+
+=item seek ( POS )
+
+=item tell ()
+
+=item rewind ()
+
+=item close ()
+
+=back
+
+C<IO::Dir> also provides a interface to reading directories via a tied
+HASH. The tied HASH extends the interface beyond just the directory
+reading routines by the use of C<lstat>, from the C<File::stat> package,
+C<unlink>, C<rmdir> and C<utime>.
+
+=over 4
+
+=item tie %hash, IO::Dir, DIRNAME [, OPTIONS ]
+
+=back
+
+The keys of the HASH will be the names of the entries in the directory.
+Reading a value from the hash will be the result of calling
+C<File::stat::lstat>. Deleting an element from the hash will call C<unlink>
+providing that C<DIR_UNLINK> is passed in the C<OPTIONS>.
+
+Assigning to an entry in the HASH will cause the time stamps of the file
+to be modified. If the file does not exist then it will be created. Assigning
+a single integer to a HASH element will cause both the access and
+modification times to be changed to that value. Alternatively a reference to
+an array of two values can be passed. The first array element will be used to
+set the access time and the second element will be used to set the modification
+time.
+
+=head1 SEE ALSO
+
+L<File::stat>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/contrib/perl5/ext/IO/lib/IO/File.pm b/contrib/perl5/ext/IO/lib/IO/File.pm
index de7fabc..569c280 100644
--- a/contrib/perl5/ext/IO/lib/IO/File.pm
+++ b/contrib/perl5/ext/IO/lib/IO/File.pm
@@ -49,7 +49,7 @@ these classes with methods that are specific to file handles.
=over 4
-=item new ([ ARGS ] )
+=item new ( FILENAME [,MODE [,PERMS]] )
Creates a C<IO::File>. If it receives any parameters, they are passed to
the method C<open>; if the open fails, the object is destroyed. Otherwise,
@@ -72,20 +72,21 @@ Otherwise, it is returned to the caller.
=item open( FILENAME [,MODE [,PERMS]] )
C<open> accepts one, two or three parameters. With one parameter,
-it is just a front end for the built-in C<open> function. With two
+it is just a front end for the built-in C<open> function. With two or three
parameters, the first parameter is a filename that may include
whitespace or other special characters, and the second parameter is
the open mode, optionally followed by a file permission value.
If C<IO::File::open> receives a Perl mode string ("E<gt>", "+E<lt>", etc.)
-or a POSIX fopen() mode string ("w", "r+", etc.), it uses the basic
-Perl C<open> operator.
+or a ANSI C fopen() mode string ("w", "r+", etc.), it uses the basic
+Perl C<open> operator (but protects any special characters).
If C<IO::File::open> is given a numeric mode, it passes that mode
and the optional permissions value to the Perl C<sysopen> operator.
-For convenience, C<IO::File::import> tries to import the O_XXX
-constants from the Fcntl module. If dynamic loading is not available,
-this may fail, but the rest of IO::File will still work.
+The permissions default to 0666.
+
+For convenience, C<IO::File> exports the O_XXX constants from the
+Fcntl module, if this module is available.
=back
@@ -98,24 +99,24 @@ L<IO::Seekable>
=head1 HISTORY
-Derived from FileHandle.pm by Graham Barr E<lt>F<bodg@tiuk.ti.com>E<gt>.
+Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
=cut
-require 5.000;
+require 5.005_64;
use strict;
-use vars qw($VERSION @EXPORT @EXPORT_OK $AUTOLOAD @ISA);
+our($VERSION, @EXPORT, @EXPORT_OK, @ISA);
use Carp;
use Symbol;
use SelectSaver;
use IO::Seekable;
+use File::Spec;
require Exporter;
-require DynaLoader;
-@ISA = qw(IO::Handle IO::Seekable Exporter DynaLoader);
+@ISA = qw(IO::Handle IO::Seekable Exporter);
-$VERSION = "1.06021";
+$VERSION = "1.08";
@EXPORT = @IO::Seekable::EXPORT;
@@ -127,7 +128,6 @@ eval {
push(@EXPORT, @O);
};
-
################################################
## Constructor
##
@@ -158,7 +158,9 @@ sub open {
defined $perms or $perms = 0666;
return sysopen($fh, $file, $mode, $perms);
}
- $file = './' . $file if $file =~ m{\A[^\\/\w]};
+ if (! File::Spec->file_name_is_absolute($file)) {
+ $file = File::Spec->catfile(File::Spec->curdir(),$file);
+ }
$file = IO::Handle::_open_mode_string($mode) . " $file\0";
}
open($fh, $file);
diff --git a/contrib/perl5/ext/IO/lib/IO/Handle.pm b/contrib/perl5/ext/IO/lib/IO/Handle.pm
index 7927641..930df55 100644
--- a/contrib/perl5/ext/IO/lib/IO/Handle.pm
+++ b/contrib/perl5/ext/IO/lib/IO/Handle.pm
@@ -9,21 +9,21 @@ IO::Handle - supply object methods for I/O handles
use IO::Handle;
- $fh = new IO::Handle;
- if ($fh->fdopen(fileno(STDIN),"r")) {
- print $fh->getline;
- $fh->close;
+ $io = new IO::Handle;
+ if ($io->fdopen(fileno(STDIN),"r")) {
+ print $io->getline;
+ $io->close;
}
- $fh = new IO::Handle;
- if ($fh->fdopen(fileno(STDOUT),"w")) {
- $fh->print("Some text\n");
+ $io = new IO::Handle;
+ if ($io->fdopen(fileno(STDOUT),"w")) {
+ $io->print("Some text\n");
}
use IO::Handle '_IOLBF';
- $fh->setvbuf($buffer_var, _IOLBF, 1024);
+ $io->setvbuf($buffer_var, _IOLBF, 1024);
- undef $fh; # automatically closes the file if it's open
+ undef $io; # automatically closes the file if it's open
autoflush STDOUT 1;
@@ -36,9 +36,7 @@ in the IO hierarchy.
If you are reading this documentation, looking for a replacement for
the C<FileHandle> package, then I suggest you read the documentation
-for C<IO::File>
-
-A C<IO::Handle> object is a reference to a symbol (see the C<Symbol> package)
+for C<IO::File> too.
=head1 CONSTRUCTOR
@@ -63,87 +61,123 @@ See L<perlfunc> for complete descriptions of each of the following
supported C<IO::Handle> methods, which are just front ends for the
corresponding built-in functions:
- close
- fileno
- getc
- eof
- read
- truncate
- stat
- print
- printf
- sysread
- syswrite
+ $io->close
+ $io->eof
+ $io->fileno
+ $io->format_write( [FORMAT_NAME] )
+ $io->getc
+ $io->read ( BUF, LEN, [OFFSET] )
+ $io->print ( ARGS )
+ $io->printf ( FMT, [ARGS] )
+ $io->stat
+ $io->sysread ( BUF, LEN, [OFFSET] )
+ $io->syswrite ( BUF, LEN, [OFFSET] )
+ $io->truncate ( LEN )
See L<perlvar> for complete descriptions of each of the following
-supported C<IO::Handle> methods:
+supported C<IO::Handle> methods. All of them return the previous
+value of the attribute and takes an optional single argument that when
+given will set the value. If no argument is given the previous value
+is unchanged (except for $io->autoflush will actually turn ON
+autoflush by default).
- autoflush
- output_field_separator
- output_record_separator
- input_record_separator
- input_line_number
- format_page_number
- format_lines_per_page
- format_lines_left
- format_name
- format_top_name
- format_line_break_characters
- format_formfeed
- format_write
+ $io->autoflush ( [BOOL] ) $|
+ $io->format_page_number( [NUM] ) $%
+ $io->format_lines_per_page( [NUM] ) $=
+ $io->format_lines_left( [NUM] ) $-
+ $io->format_name( [STR] ) $~
+ $io->format_top_name( [STR] ) $^
+ $io->input_line_number( [NUM]) $.
+
+The following methods are not supported on a per-filehandle basis.
+
+ IO::Handle->format_line_break_characters( [STR] ) $:
+ IO::Handle->format_formfeed( [STR]) $^L
+ IO::Handle->output_field_separator( [STR] ) $,
+ IO::Handle->output_record_separator( [STR] ) $\
+
+ IO::Handle->input_record_separator( [STR] ) $/
Furthermore, for doing normal I/O you might need these:
=over
-=item $fh->fdopen ( FD, MODE )
+=item $io->fdopen ( FD, MODE )
C<fdopen> is like an ordinary C<open> except that its first parameter
is not a filename but rather a file handle name, a IO::Handle object,
or a file descriptor number.
-=item $fh->opened
+=item $io->opened
Returns true if the object is currently a valid file descriptor.
-=item $fh->getline
+=item $io->getline
-This works like <$fh> described in L<perlop/"I/O Operators">
+This works like <$io> described in L<perlop/"I/O Operators">
except that it's more readable and can be safely called in an
array context but still returns just one line.
-=item $fh->getlines
+=item $io->getlines
-This works like <$fh> when called in an array context to
+This works like <$io> when called in an array context to
read all the remaining lines in a file, except that it's more readable.
It will also croak() if accidentally called in a scalar context.
-=item $fh->ungetc ( ORD )
+=item $io->ungetc ( ORD )
Pushes a character with the given ordinal value back onto the given
-handle's input stream.
+handle's input stream. Only one character of pushback per handle is
+guaranteed.
-=item $fh->write ( BUF, LEN [, OFFSET }\] )
+=item $io->write ( BUF, LEN [, OFFSET ] )
This C<write> is like C<write> found in C, that is it is the
opposite of read. The wrapper for the perl C<write> function is
called C<format_write>.
-=item $fh->flush
-
-Flush the given handle's buffer.
-
-=item $fh->error
+=item $io->error
Returns a true value if the given handle has experienced any errors
since it was opened or since the last call to C<clearerr>.
-=item $fh->clearerr
+=item $io->clearerr
Clear the given handle's error indicator.
+=item $io->sync
+
+C<sync> synchronizes a file's in-memory state with that on the
+physical medium. C<sync> does not operate at the perlio api level, but
+operates on the file descriptor, this means that any data held at the
+perlio api level will not be synchronized. To synchronize data that is
+buffered at the perlio api level you must use the flush method. C<sync>
+is not implemented on all platforms. See L<fsync(3c)>.
+
+=item $io->flush
+
+C<flush> causes perl to flush any buffered data at the perlio api level.
+Any unread data in the buffer will be discarded, and any unwritten data
+will be written to the underlying file descriptor.
+
+=item $io->printflush ( ARGS )
+
+Turns on autoflush, print ARGS and then restores the autoflush status of the
+C<IO::Handle> object.
+
+=item $io->blocking ( [ BOOL ] )
+
+If called with an argument C<blocking> will turn on non-blocking IO if
+C<BOOL> is false, and turn it off if C<BOOL> is true.
+
+C<blocking> will return the value of the previous setting, or the
+current setting if C<BOOL> is not given.
+
+If an error occurs C<blocking> will return undef and C<$!> will be set.
+
=back
+
If the C functions setbuf() and/or setvbuf() are available, then
C<IO::Handle::setbuf> and C<IO::Handle::setvbuf> set the buffering
policy for an IO::Handle. The calling sequences for the Perl functions
@@ -152,7 +186,7 @@ C<_IOLBF>, and C<_IONBF> for setvbuf()--except that the buffer parameter
specifies a scalar variable to use as a buffer. WARNING: A variable
used as a buffer by C<setbuf> or C<setvbuf> must not be modified in any
way until the IO::Handle is closed or C<setbuf> or C<setvbuf> is called
-again, or memory corruption may result! Note that you need to import
+again, or memory corruption may result! Note that you need to import
the constants C<_IOFBF>, C<_IOLBF>, and C<_IONBF> explicitly.
Lastly, there is a special method for working under B<-T> and setuid/gid
@@ -160,7 +194,7 @@ scripts:
=over
-=item $fh->untaint
+=item $io->untaint
Marks the object as taint-clean, and as such data read from it will also
be considered taint-clean. Note that this is a very trusting action to
@@ -171,7 +205,8 @@ vulnerability should be kept in mind.
=head1 NOTE
-A C<IO::Handle> object is a GLOB reference. Some modules that
+A C<IO::Handle> object is a reference to a symbol/GLOB reference (see
+the C<Symbol> package). Some modules that
inherit from C<IO::Handle> may want to keep object related variables
in the hash table part of the GLOB. In an attempt to prevent modules
trampling on each other I propose the that any such module should prefix
@@ -193,22 +228,22 @@ class from C<IO::Handle> and inherit those methods.
=head1 HISTORY
-Derived from FileHandle.pm by Graham Barr E<lt>F<bodg@tiuk.ti.com>E<gt>
+Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
=cut
-require 5.000;
+require 5.005_64;
use strict;
-use vars qw($VERSION $XS_VERSION @EXPORT_OK $AUTOLOAD @ISA);
+our($VERSION, @EXPORT_OK, @ISA);
use Carp;
use Symbol;
use SelectSaver;
+use IO (); # Load the XS module
require Exporter;
@ISA = qw(Exporter);
-$VERSION = "1.1505";
-$XS_VERSION = "1.15";
+$VERSION = "1.21";
@EXPORT_OK = qw(
autoflush
@@ -230,6 +265,9 @@ $XS_VERSION = "1.15";
getline
getlines
+ printflush
+ flush
+
SEEK_SET
SEEK_CUR
SEEK_END
@@ -238,30 +276,6 @@ $XS_VERSION = "1.15";
_IONBF
);
-
-################################################
-## Interaction with the XS.
-##
-
-require DynaLoader;
-@IO::ISA = qw(DynaLoader);
-bootstrap IO $XS_VERSION;
-
-sub AUTOLOAD {
- if ($AUTOLOAD =~ /::(_?[a-z])/) {
- $AutoLoader::AUTOLOAD = $AUTOLOAD;
- goto &AutoLoader::AUTOLOAD
- }
- my $constname = $AUTOLOAD;
- $constname =~ s/.*:://;
- my $val = constant($constname);
- defined $val or croak "$constname is not a valid IO::Handle macro";
- no strict 'refs';
- *$AUTOLOAD = sub { $val };
- goto &$AUTOLOAD;
-}
-
-
################################################
## Constructors, destructors.
##
@@ -269,18 +283,18 @@ sub AUTOLOAD {
sub new {
my $class = ref($_[0]) || $_[0] || "IO::Handle";
@_ == 1 or croak "usage: new $class";
- my $fh = gensym;
- bless $fh, $class;
+ my $io = gensym;
+ bless $io, $class;
}
sub new_from_fd {
my $class = ref($_[0]) || $_[0] || "IO::Handle";
@_ == 3 or croak "usage: new_from_fd $class FD, MODE";
- my $fh = gensym;
+ my $io = gensym;
shift;
- IO::Handle::fdopen($fh, @_)
+ IO::Handle::fdopen($io, @_)
or return undef;
- bless $fh, $class;
+ bless $io, $class;
}
#
@@ -307,8 +321,8 @@ sub _open_mode_string {
}
sub fdopen {
- @_ == 3 or croak 'usage: $fh->fdopen(FD, MODE)';
- my ($fh, $fd, $mode) = @_;
+ @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)';
+ my ($io, $fd, $mode) = @_;
local(*GLOB);
if (ref($fd) && "".$fd =~ /GLOB\(/o) {
@@ -321,15 +335,15 @@ sub fdopen {
$fd = "=$fd";
}
- open($fh, _open_mode_string($mode) . '&' . $fd)
- ? $fh : undef;
+ open($io, _open_mode_string($mode) . '&' . $fd)
+ ? $io : undef;
}
sub close {
- @_ == 1 or croak 'usage: $fh->close()';
- my($fh) = @_;
+ @_ == 1 or croak 'usage: $io->close()';
+ my($io) = @_;
- close($fh);
+ close($io);
}
################################################
@@ -340,39 +354,39 @@ sub close {
# select
sub opened {
- @_ == 1 or croak 'usage: $fh->opened()';
+ @_ == 1 or croak 'usage: $io->opened()';
defined fileno($_[0]);
}
sub fileno {
- @_ == 1 or croak 'usage: $fh->fileno()';
+ @_ == 1 or croak 'usage: $io->fileno()';
fileno($_[0]);
}
sub getc {
- @_ == 1 or croak 'usage: $fh->getc()';
+ @_ == 1 or croak 'usage: $io->getc()';
getc($_[0]);
}
sub eof {
- @_ == 1 or croak 'usage: $fh->eof()';
+ @_ == 1 or croak 'usage: $io->eof()';
eof($_[0]);
}
sub print {
- @_ or croak 'usage: $fh->print([ARGS])';
+ @_ or croak 'usage: $io->print(ARGS)';
my $this = shift;
print $this @_;
}
sub printf {
- @_ >= 2 or croak 'usage: $fh->printf(FMT,[ARGS])';
+ @_ >= 2 or croak 'usage: $io->printf(FMT,[ARGS])';
my $this = shift;
printf $this @_;
}
sub getline {
- @_ == 1 or croak 'usage: $fh->getline';
+ @_ == 1 or croak 'usage: $io->getline()';
my $this = shift;
return scalar <$this>;
}
@@ -380,41 +394,43 @@ sub getline {
*gets = \&getline; # deprecated
sub getlines {
- @_ == 1 or croak 'usage: $fh->getline()';
+ @_ == 1 or croak 'usage: $io->getlines()';
wantarray or
- croak 'Can\'t call $fh->getlines in a scalar context, use $fh->getline';
+ croak 'Can\'t call $io->getlines in a scalar context, use $io->getline';
my $this = shift;
return <$this>;
}
sub truncate {
- @_ == 2 or croak 'usage: $fh->truncate(LEN)';
+ @_ == 2 or croak 'usage: $io->truncate(LEN)';
truncate($_[0], $_[1]);
}
sub read {
- @_ == 3 || @_ == 4 or croak '$fh->read(BUF, LEN [, OFFSET])';
+ @_ == 3 || @_ == 4 or croak 'usage: $io->read(BUF, LEN [, OFFSET])';
read($_[0], $_[1], $_[2], $_[3] || 0);
}
sub sysread {
- @_ == 3 || @_ == 4 or croak '$fh->sysread(BUF, LEN [, OFFSET])';
+ @_ == 3 || @_ == 4 or croak 'usage: $io->sysread(BUF, LEN [, OFFSET])';
sysread($_[0], $_[1], $_[2], $_[3] || 0);
}
sub write {
- @_ == 3 || @_ == 4 or croak '$fh->write(BUF, LEN [, OFFSET])';
+ @_ >= 2 && @_ <= 4 or croak 'usage: $io->write(BUF [, LEN [, OFFSET]])';
local($\) = "";
+ $_[2] = length($_[1]) unless defined $_[2];
print { $_[0] } substr($_[1], $_[3] || 0, $_[2]);
}
sub syswrite {
- @_ == 3 || @_ == 4 or croak '$fh->syswrite(BUF, LEN [, OFFSET])';
+ @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])';
+ $_[2] = length($_[1]) unless defined $_[2];
syswrite($_[0], $_[1], $_[2], $_[3] || 0);
}
sub stat {
- @_ == 1 or croak 'usage: $fh->stat()';
+ @_ == 1 or croak 'usage: $io->stat()';
stat($_[0]);
}
@@ -423,32 +439,39 @@ sub stat {
##
sub autoflush {
- my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
+ my $old = new SelectSaver qualify($_[0], caller);
my $prev = $|;
$| = @_ > 1 ? $_[1] : 1;
$prev;
}
sub output_field_separator {
+ carp "output_field_separator is not supported on a per-handle basis"
+ if ref($_[0]);
my $prev = $,;
$, = $_[1] if @_ > 1;
$prev;
}
sub output_record_separator {
+ carp "output_record_separator is not supported on a per-handle basis"
+ if ref($_[0]);
my $prev = $\;
$\ = $_[1] if @_ > 1;
$prev;
}
sub input_record_separator {
+ carp "input_record_separator is not supported on a per-handle basis"
+ if ref($_[0]);
my $prev = $/;
$/ = $_[1] if @_ > 1;
$prev;
}
sub input_line_number {
- # localizing $. doesn't work as advertised. grrrrrr.
+ local $.;
+ my $tell = tell qualify($_[0], caller) if ref($_[0]);
my $prev = $.;
$. = $_[1] if @_ > 1;
$prev;
@@ -490,50 +513,82 @@ sub format_top_name {
}
sub format_line_break_characters {
+ carp "format_line_break_characters is not supported on a per-handle basis"
+ if ref($_[0]);
my $prev = $:;
$: = $_[1] if @_ > 1;
$prev;
}
sub format_formfeed {
+ carp "format_formfeed is not supported on a per-handle basis"
+ if ref($_[0]);
my $prev = $^L;
$^L = $_[1] if @_ > 1;
$prev;
}
sub formline {
- my $fh = shift;
+ my $io = shift;
my $picture = shift;
local($^A) = $^A;
local($\) = "";
formline($picture, @_);
- print $fh $^A;
+ print $io $^A;
}
sub format_write {
- @_ < 3 || croak 'usage: $fh->write( [FORMAT_NAME] )';
+ @_ < 3 || croak 'usage: $io->write( [FORMAT_NAME] )';
if (@_ == 2) {
- my ($fh, $fmt) = @_;
- my $oldfmt = $fh->format_name($fmt);
- CORE::write($fh);
- $fh->format_name($oldfmt);
+ my ($io, $fmt) = @_;
+ my $oldfmt = $io->format_name($fmt);
+ CORE::write($io);
+ $io->format_name($oldfmt);
} else {
CORE::write($_[0]);
}
}
+# XXX undocumented
sub fcntl {
- @_ == 3 || croak 'usage: $fh->fcntl( OP, VALUE );';
- my ($fh, $op, $val) = @_;
- my $r = fcntl($fh, $op, $val);
- defined $r && $r eq "0 but true" ? 0 : $r;
+ @_ == 3 || croak 'usage: $io->fcntl( OP, VALUE );';
+ my ($io, $op) = @_;
+ return fcntl($io, $op, $_[2]);
}
+# XXX undocumented
sub ioctl {
- @_ == 3 || croak 'usage: $fh->ioctl( OP, VALUE );';
- my ($fh, $op, $val) = @_;
- my $r = ioctl($fh, $op, $val);
- defined $r && $r eq "0 but true" ? 0 : $r;
+ @_ == 3 || croak 'usage: $io->ioctl( OP, VALUE );';
+ my ($io, $op) = @_;
+ return ioctl($io, $op, $_[2]);
+}
+
+# this sub is for compatability with older releases of IO that used
+# a sub called constant to detemine if a constant existed -- GMB
+#
+# The SEEK_* and _IO?BF constants were the only constants at that time
+# any new code should just chech defined(&CONSTANT_NAME)
+
+sub constant {
+ no strict 'refs';
+ my $name = shift;
+ (($name =~ /^(SEEK_(SET|CUR|END)|_IO[FLN]BF)$/) && defined &{$name})
+ ? &{$name}() : undef;
+}
+
+
+# so that flush.pl can be depriciated
+
+sub printflush {
+ my $io = shift;
+ my $old = new SelectSaver qualify($io, caller) if ref($io);
+ local $| = 1;
+ if(ref($io)) {
+ print $io @_;
+ }
+ else {
+ print @_;
+ }
}
1;
diff --git a/contrib/perl5/ext/IO/lib/IO/Pipe.pm b/contrib/perl5/ext/IO/lib/IO/Pipe.pm
index 23c51b0..27b5ad0 100644
--- a/contrib/perl5/ext/IO/lib/IO/Pipe.pm
+++ b/contrib/perl5/ext/IO/lib/IO/Pipe.pm
@@ -1,20 +1,20 @@
# IO::Pipe.pm
#
-# Copyright (c) 1996 Graham Barr <Graham.Barr@tiuk.ti.com>. All rights
-# reserved. This program is free software; you can redistribute it and/or
+# Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
package IO::Pipe;
-require 5.000;
+require 5.005_64;
use IO::Handle;
use strict;
-use vars qw($VERSION);
+our($VERSION);
use Carp;
use Symbol;
-$VERSION = "1.0902";
+$VERSION = "1.121";
sub new {
my $type = shift;
@@ -65,7 +65,7 @@ sub _doit {
}
bless $io, "IO::Handle";
$io->fdopen($fh, $mode);
- $fh->close;
+ $fh->close;
if ($do_spawn) {
$pid = eval { system 1, @_ }; # 1 == P_NOWAIT
@@ -88,8 +88,12 @@ sub _doit {
}
sub reader {
- @_ >= 1 or croak 'usage: $pipe->reader()';
+ @_ >= 1 or croak 'usage: $pipe->reader( [SUB_COMMAND_ARGS] )';
my $me = shift;
+
+ return undef
+ unless(ref($me) || ref($me = $me->new));
+
my $fh = ${*$me}[0];
my $pid = $me->_doit(0, $fh, @_)
if(@_);
@@ -97,6 +101,8 @@ sub reader {
close ${*$me}[1];
bless $me, ref($fh);
*$me = *$fh; # Alias self to handle
+ $me->fdopen($fh->fileno,"r")
+ unless defined($me->fileno);
bless $fh; # Really wan't un-bless here
${*$me}{'io_pipe_pid'} = $pid
if defined $pid;
@@ -105,8 +111,12 @@ sub reader {
}
sub writer {
- @_ >= 1 or croak 'usage: $pipe->writer()';
+ @_ >= 1 or croak 'usage: $pipe->writer( [SUB_COMMAND_ARGS] )';
my $me = shift;
+
+ return undef
+ unless(ref($me) || ref($me = $me->new));
+
my $fh = ${*$me}[1];
my $pid = $me->_doit(1, $fh, @_)
if(@_);
@@ -114,6 +124,8 @@ sub writer {
close ${*$me}[0];
bless $me, ref($fh);
*$me = *$fh; # Alias self to handle
+ $me->fdopen($fh->fileno,"w")
+ unless defined($me->fileno);
bless $fh; # Really wan't un-bless here
${*$me}{'io_pipe_pid'} = $pid
if defined $pid;
@@ -123,7 +135,7 @@ sub writer {
package IO::Pipe::End;
-use vars qw(@ISA);
+our(@ISA);
@ISA = qw(IO::Handle);
@@ -143,7 +155,7 @@ __END__
=head1 NAME
-IO::pipe - supply object methods for pipes
+IO::Pipe - supply object methods for pipes
=head1 SYNOPSIS
@@ -228,12 +240,13 @@ L<IO::Handle>
=head1 AUTHOR
-Graham Barr <bodg@tiuk.ti.com>
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
=head1 COPYRIGHT
-Copyright (c) 1996 Graham Barr. All rights reserved. This program is free
-software; you can redistribute it and/or modify it under the same terms
-as Perl itself.
+Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
=cut
diff --git a/contrib/perl5/ext/IO/lib/IO/Poll.pm b/contrib/perl5/ext/IO/lib/IO/Poll.pm
new file mode 100644
index 0000000..687664b
--- /dev/null
+++ b/contrib/perl5/ext/IO/lib/IO/Poll.pm
@@ -0,0 +1,205 @@
+# IO::Poll.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Poll;
+
+use strict;
+use IO::Handle;
+use Exporter ();
+our(@ISA, @EXPORT_OK, @EXPORT, $VERSION);
+
+@ISA = qw(Exporter);
+$VERSION = "0.01";
+
+@EXPORT = qw(poll);
+
+@EXPORT_OK = qw(
+ POLLIN
+ POLLPRI
+ POLLOUT
+ POLLRDNORM
+ POLLWRNORM
+ POLLRDBAND
+ POLLWRBAND
+ POLLNORM
+ POLLERR
+ POLLHUP
+ POLLNVAL
+);
+
+sub new {
+ my $class = shift;
+
+ my $self = bless [{},{}], $class;
+
+ $self;
+}
+
+sub mask {
+ my $self = shift;
+ my $io = shift;
+ my $fd = fileno($io);
+ if(@_) {
+ my $mask = shift;
+ $self->[0]{$fd} ||= {};
+ if($mask) {
+ $self->[0]{$fd}{$io} = $mask;
+ }
+ else {
+ delete $self->[0]{$fd}{$io};
+ }
+ }
+ elsif(exists $self->[0]{$fd}{$io}) {
+ return $self->[0]{$fd}{$io};
+ }
+ return;
+}
+
+
+sub poll {
+ my($self,$timeout) = @_;
+
+ $self->[1] = {};
+
+ my($fd,$ref);
+ my @poll = ();
+
+ while(($fd,$ref) = each %{$self->[0]}) {
+ my $events = 0;
+ map { $events |= $_ } values %{$ref};
+ push(@poll,$fd, $events);
+ }
+
+ my $ret = @poll ? _poll(defined($timeout) ? $timeout * 1000 : -1,@poll) : 0;
+
+ return $ret
+ unless $ret > 0;
+
+ while(@poll) {
+ my($fd,$got) = splice(@poll,0,2);
+ $self->[1]{$fd} = $got
+ if $got;
+ }
+
+ return $ret;
+}
+
+sub events {
+ my $self = shift;
+ my $io = shift;
+ my $fd = fileno($io);
+
+ exists $self->[1]{$fd} && exists $self->[0]{$fd}{$io}
+ ? $self->[1]{$fd} & $self->[0]{$fd}{$io}
+ : 0;
+}
+
+sub remove {
+ my $self = shift;
+ my $io = shift;
+ $self->mask($io,0);
+}
+
+sub handles {
+ my $self = shift;
+
+ return map { keys %$_ } values %{$self->[0]}
+ unless(@_);
+
+ my $events = shift || 0;
+ my($fd,$ev,$io,$mask);
+ my @handles = ();
+
+ while(($fd,$ev) = each %{$self->[1]}) {
+ if($ev & $events) {
+ while(($io,$mask) = each %{$self->[0][$fd]}) {
+ push(@handles, $io)
+ if $events & $mask;
+ }
+ }
+ }
+ return @handles;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Poll - Object interface to system poll call
+
+=head1 SYNOPSIS
+
+ use IO::Poll qw(POLLRDNORM POLLWRNORM POLLIN POLLHUP);
+
+ $poll = new IO::Poll;
+
+ $poll->mask($input_handle => POLLRDNORM | POLLIN | POLLHUP);
+ $poll->mask($output_handle => POLLWRNORM);
+
+ $poll->poll($timeout);
+
+ $ev = $poll->events($input);
+
+=head1 DESCRIPTION
+
+C<IO::Poll> is a simple interface to the system level poll routine.
+
+=head1 METHODS
+
+=over 4
+
+=item mask ( IO [, EVENT_MASK ] )
+
+If EVENT_MASK is given, then, if EVENT_MASK is non-zero, IO is added to the
+list of file descriptors and the next call to poll will check for
+any event specified in EVENT_MASK. If EVENT_MASK is zero then IO will be
+removed from the list of file descriptors.
+
+If EVENT_MASK is not given then the return value will be the current
+event mask value for IO.
+
+=item poll ( [ TIMEOUT ] )
+
+Call the system level poll routine. If TIMEOUT is not specified then the
+call will block. Returns the number of handles which had events
+happen, or -1 on error.
+
+=item events ( IO )
+
+Returns the event mask which represents the events that happend on IO
+during the last call to C<poll>.
+
+=item remove ( IO )
+
+Remove IO from the list of file descriptors for the next poll.
+
+=item handles( [ EVENT_MASK ] )
+
+Returns a list of handles. If EVENT_MASK is not given then a list of all
+handles known will be returned. If EVENT_MASK is given then a list
+of handles will be returned which had one of the events specified by
+EVENT_MASK happen during the last call ti C<poll>
+
+=back
+
+=head1 SEE ALSO
+
+L<poll(2)>, L<IO::Handle>, L<IO::Select>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/contrib/perl5/ext/IO/lib/IO/Seekable.pm b/contrib/perl5/ext/IO/lib/IO/Seekable.pm
index 86154c5..e09d48b 100644
--- a/contrib/perl5/ext/IO/lib/IO/Seekable.pm
+++ b/contrib/perl5/ext/IO/lib/IO/Seekable.pm
@@ -19,16 +19,17 @@ be inherited by other C<IO::Handle> based objects. It provides methods
which allow seeking of the file descriptors.
If the C functions fgetpos() and fsetpos() are available, then
-C<IO::File::getpos> returns an opaque value that represents the
-current position of the IO::File, and C<IO::File::setpos> uses
+C<$io-E<lt>getpos> returns an opaque value that represents the
+current position of the IO::File, and C<$io-E<gt>setpos(POS)> uses
that value to return to a previously visited position.
See L<perlfunc> for complete descriptions of each of the following
supported C<IO::Seekable> methods, which are just front ends for the
corresponding built-in functions:
- seek
- tell
+ $io->seek( POS, WHENCE )
+ $io->sysseek( POS, WHENCE )
+ $io->tell
=head1 SEE ALSO
@@ -39,29 +40,37 @@ L<IO::File>
=head1 HISTORY
-Derived from FileHandle.pm by Graham Barr E<lt>bodg@tiuk.ti.comE<gt>
+Derived from FileHandle.pm by Graham Barr E<lt>gbarr@pobox.comE<gt>
=cut
-require 5.000;
+require 5.005_64;
use Carp;
use strict;
-use vars qw($VERSION @EXPORT @ISA);
-use IO::Handle qw(SEEK_SET SEEK_CUR SEEK_END);
+our($VERSION, @EXPORT, @ISA);
+use IO::Handle ();
+# XXX we can't get these from IO::Handle or we'll get prototype
+# mismatch warnings on C<use POSIX; use IO::File;> :-(
+use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END);
require Exporter;
@EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END);
@ISA = qw(Exporter);
-$VERSION = "1.06";
+$VERSION = "1.08";
sub seek {
- @_ == 3 or croak 'usage: $fh->seek(POS, WHENCE)';
+ @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)';
seek($_[0], $_[1], $_[2]);
}
+sub sysseek {
+ @_ == 3 or croak 'usage: $io->sysseek(POS, WHENCE)';
+ sysseek($_[0], $_[1], $_[2]);
+}
+
sub tell {
- @_ == 1 or croak 'usage: $fh->tell()';
+ @_ == 1 or croak 'usage: $io->tell()';
tell($_[0]);
}
diff --git a/contrib/perl5/ext/IO/lib/IO/Select.pm b/contrib/perl5/ext/IO/lib/IO/Select.pm
index dea684a..df92b04 100644
--- a/contrib/perl5/ext/IO/lib/IO/Select.pm
+++ b/contrib/perl5/ext/IO/lib/IO/Select.pm
@@ -1,163 +1,17 @@
# IO::Select.pm
#
-# Copyright (c) 1995 Graham Barr. All rights reserved. This program is free
-# software; you can redistribute it and/or modify it under the same terms
-# as Perl itself.
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
package IO::Select;
-=head1 NAME
-
-IO::Select - OO interface to the select system call
-
-=head1 SYNOPSIS
-
- use IO::Select;
-
- $s = IO::Select->new();
-
- $s->add(\*STDIN);
- $s->add($some_handle);
-
- @ready = $s->can_read($timeout);
-
- @ready = IO::Select->new(@handles)->read(0);
-
-=head1 DESCRIPTION
-
-The C<IO::Select> package implements an object approach to the system C<select>
-function call. It allows the user to see what IO handles, see L<IO::Handle>,
-are ready for reading, writing or have an error condition pending.
-
-=head1 CONSTRUCTOR
-
-=over 4
-
-=item new ( [ HANDLES ] )
-
-The constructor creates a new object and optionally initialises it with a set
-of handles.
-
-=back
-
-=head1 METHODS
-
-=over 4
-
-=item add ( HANDLES )
-
-Add the list of handles to the C<IO::Select> object. It is these values that
-will be returned when an event occurs. C<IO::Select> keeps these values in a
-cache which is indexed by the C<fileno> of the handle, so if more than one
-handle with the same C<fileno> is specified then only the last one is cached.
-
-Each handle can be an C<IO::Handle> object, an integer or an array
-reference where the first element is a C<IO::Handle> or an integer.
-
-=item remove ( HANDLES )
-
-Remove all the given handles from the object. This method also works
-by the C<fileno> of the handles. So the exact handles that were added
-need not be passed, just handles that have an equivalent C<fileno>
-
-=item exists ( HANDLE )
-
-Returns a true value (actually the handle itself) if it is present.
-Returns undef otherwise.
-
-=item handles
-
-Return an array of all registered handles.
-
-=item can_read ( [ TIMEOUT ] )
-
-Return an array of handles that are ready for reading. C<TIMEOUT> is
-the maximum amount of time to wait before returning an empty list. If
-C<TIMEOUT> is not given and any handles are registered then the call
-will block.
-
-=item can_write ( [ TIMEOUT ] )
-
-Same as C<can_read> except check for handles that can be written to.
-
-=item has_error ( [ TIMEOUT ] )
-
-Same as C<can_read> except check for handles that have an error
-condition, for example EOF.
-
-=item count ()
-
-Returns the number of handles that the object will check for when
-one of the C<can_> methods is called or the object is passed to
-the C<select> static method.
-
-=item bits()
-
-Return the bit string suitable as argument to the core select() call.
-
-=item bits()
-
-Return the bit string suitable as argument to the core select() call.
-
-=item select ( READ, WRITE, ERROR [, TIMEOUT ] )
-
-C<select> is a static method, that is you call it with the package
-name like C<new>. C<READ>, C<WRITE> and C<ERROR> are either C<undef>
-or C<IO::Select> objects. C<TIMEOUT> is optional and has the same
-effect as for the core select call.
-
-The result will be an array of 3 elements, each a reference to an array
-which will hold the handles that are ready for reading, writing and have
-error conditions respectively. Upon error an empty array is returned.
-
-=back
-
-=head1 EXAMPLE
-
-Here is a short example which shows how C<IO::Select> could be used
-to write a server which communicates with several sockets while also
-listening for more connections on a listen socket
-
- use IO::Select;
- use IO::Socket;
-
- $lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
- $sel = new IO::Select( $lsn );
-
- while(@ready = $sel->can_read) {
- foreach $fh (@ready) {
- if($fh == $lsn) {
- # Create a new socket
- $new = $lsn->accept;
- $sel->add($new);
- }
- else {
- # Process socket
-
- # Maybe we have finished with the socket
- $sel->remove($fh);
- $fh->close;
- }
- }
- }
-
-=head1 AUTHOR
-
-Graham Barr E<lt>F<Graham.Barr@tiuk.ti.com>E<gt>
-
-=head1 COPYRIGHT
-
-Copyright (c) 1995 Graham Barr. All rights reserved. This program is free
-software; you can redistribute it and/or modify it under the same terms
-as Perl itself.
-
-=cut
-
use strict;
+use warnings::register;
use vars qw($VERSION @ISA);
require Exporter;
-$VERSION = "1.10";
+$VERSION = "1.14";
@ISA = qw(Exporter); # This is only so we can do version checking
@@ -193,7 +47,9 @@ sub remove
sub exists
{
my $vec = shift;
- $vec->[$vec->_fileno(shift) + FIRST_FD];
+ my $fno = $vec->_fileno(shift);
+ return undef unless defined $fno;
+ $vec->[$fno + FIRST_FD];
}
@@ -261,7 +117,7 @@ sub can_write
: ();
}
-sub has_error
+sub has_exception
{
my $vec = shift;
my $timeout = shift;
@@ -272,6 +128,13 @@ sub has_error
: ();
}
+sub has_error
+{
+ warnings::warn("Call to depreciated method 'has_error', use 'has_exception'")
+ if warnings::enabled();
+ goto &has_exception;
+}
+
sub count
{
my $vec = shift;
@@ -369,3 +232,149 @@ sub handles
}
1;
+__END__
+
+=head1 NAME
+
+IO::Select - OO interface to the select system call
+
+=head1 SYNOPSIS
+
+ use IO::Select;
+
+ $s = IO::Select->new();
+
+ $s->add(\*STDIN);
+ $s->add($some_handle);
+
+ @ready = $s->can_read($timeout);
+
+ @ready = IO::Select->new(@handles)->read(0);
+
+=head1 DESCRIPTION
+
+The C<IO::Select> package implements an object approach to the system C<select>
+function call. It allows the user to see what IO handles, see L<IO::Handle>,
+are ready for reading, writing or have an error condition pending.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HANDLES ] )
+
+The constructor creates a new object and optionally initialises it with a set
+of handles.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item add ( HANDLES )
+
+Add the list of handles to the C<IO::Select> object. It is these values that
+will be returned when an event occurs. C<IO::Select> keeps these values in a
+cache which is indexed by the C<fileno> of the handle, so if more than one
+handle with the same C<fileno> is specified then only the last one is cached.
+
+Each handle can be an C<IO::Handle> object, an integer or an array
+reference where the first element is a C<IO::Handle> or an integer.
+
+=item remove ( HANDLES )
+
+Remove all the given handles from the object. This method also works
+by the C<fileno> of the handles. So the exact handles that were added
+need not be passed, just handles that have an equivalent C<fileno>
+
+=item exists ( HANDLE )
+
+Returns a true value (actually the handle itself) if it is present.
+Returns undef otherwise.
+
+=item handles
+
+Return an array of all registered handles.
+
+=item can_read ( [ TIMEOUT ] )
+
+Return an array of handles that are ready for reading. C<TIMEOUT> is
+the maximum amount of time to wait before returning an empty list. If
+C<TIMEOUT> is not given and any handles are registered then the call
+will block.
+
+=item can_write ( [ TIMEOUT ] )
+
+Same as C<can_read> except check for handles that can be written to.
+
+=item has_exception ( [ TIMEOUT ] )
+
+Same as C<can_read> except check for handles that have an exception
+condition, for example pending out-of-band data.
+
+=item count ()
+
+Returns the number of handles that the object will check for when
+one of the C<can_> methods is called or the object is passed to
+the C<select> static method.
+
+=item bits()
+
+Return the bit string suitable as argument to the core select() call.
+
+=item select ( READ, WRITE, ERROR [, TIMEOUT ] )
+
+C<select> is a static method, that is you call it with the package
+name like C<new>. C<READ>, C<WRITE> and C<ERROR> are either C<undef>
+or C<IO::Select> objects. C<TIMEOUT> is optional and has the same
+effect as for the core select call.
+
+The result will be an array of 3 elements, each a reference to an array
+which will hold the handles that are ready for reading, writing and have
+error conditions respectively. Upon error an empty array is returned.
+
+=back
+
+=head1 EXAMPLE
+
+Here is a short example which shows how C<IO::Select> could be used
+to write a server which communicates with several sockets while also
+listening for more connections on a listen socket
+
+ use IO::Select;
+ use IO::Socket;
+
+ $lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
+ $sel = new IO::Select( $lsn );
+
+ while(@ready = $sel->can_read) {
+ foreach $fh (@ready) {
+ if($fh == $lsn) {
+ # Create a new socket
+ $new = $lsn->accept;
+ $sel->add($new);
+ }
+ else {
+ # Process socket
+
+ # Maybe we have finished with the socket
+ $sel->remove($fh);
+ $fh->close;
+ }
+ }
+ }
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
diff --git a/contrib/perl5/ext/IO/lib/IO/Socket.pm b/contrib/perl5/ext/IO/lib/IO/Socket.pm
index 2b4bc49..6884f02 100644
--- a/contrib/perl5/ext/IO/lib/IO/Socket.pm
+++ b/contrib/perl5/ext/IO/lib/IO/Socket.pm
@@ -1,129 +1,29 @@
# IO::Socket.pm
#
-# Copyright (c) 1996 Graham Barr <Graham.Barr@tiuk.ti.com>. All rights
-# reserved. This program is free software; you can redistribute it and/or
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
package IO::Socket;
-=head1 NAME
-
-IO::Socket - Object interface to socket communications
-
-=head1 SYNOPSIS
-
- use IO::Socket;
-
-=head1 DESCRIPTION
-
-C<IO::Socket> provides an object interface to creating and using sockets. It
-is built upon the L<IO::Handle> interface and inherits all the methods defined
-by L<IO::Handle>.
-
-C<IO::Socket> only defines methods for those operations which are common to all
-types of socket. Operations which are specified to a socket in a particular
-domain have methods defined in sub classes of C<IO::Socket>
-
-C<IO::Socket> will export all functions (and constants) defined by L<Socket>.
-
-=head1 CONSTRUCTOR
-
-=over 4
-
-=item new ( [ARGS] )
-
-Creates an C<IO::Socket>, which is a reference to a
-newly created symbol (see the C<Symbol> package). C<new>
-optionally takes arguments, these arguments are in key-value pairs.
-C<new> only looks for one key C<Domain> which tells new which domain
-the socket will be in. All other arguments will be passed to the
-configuration method of the package for that domain, See below.
-
-C<IO::Socket>s will be in autoflush mode after creation. Note that
-versions of IO::Socket prior to 1.1603 (as shipped with Perl 5.004_04)
-did not do this. So if you need backward compatibility, you should
-set autoflush explicitly.
-
-=back
-
-=head1 METHODS
-
-See L<perlfunc> for complete descriptions of each of the following
-supported C<IO::Socket> methods, which are just front ends for the
-corresponding built-in functions:
-
- socket
- socketpair
- bind
- listen
- accept
- send
- recv
- peername (getpeername)
- sockname (getsockname)
-
-Some methods take slightly different arguments to those defined in L<perlfunc>
-in attempt to make the interface more flexible. These are
-
-=over 4
-
-=item accept([PKG])
-
-perform the system call C<accept> on the socket and return a new object. The
-new object will be created in the same class as the listen socket, unless
-C<PKG> is specified. This object can be used to communicate with the client
-that was trying to connect. In a scalar context the new socket is returned,
-or undef upon failure. In an array context a two-element array is returned
-containing the new socket and the peer address, the list will
-be empty upon failure.
-
-Additional methods that are provided are
-
-=item timeout([VAL])
-
-Set or get the timeout value associated with this socket. If called without
-any arguments then the current setting is returned. If called with an argument
-the current setting is changed and the previous value returned.
-
-=item sockopt(OPT [, VAL])
-
-Unified method to both set and get options in the SOL_SOCKET level. If called
-with one argument then getsockopt is called, otherwise setsockopt is called.
-
-=item sockdomain
-
-Returns the numerical number for the socket domain type. For example, for
-a AF_INET socket the value of &AF_INET will be returned.
-
-=item socktype
+require 5.005_64;
-Returns the numerical number for the socket type. For example, for
-a SOCK_STREAM socket the value of &SOCK_STREAM will be returned.
-
-=item protocol
-
-Returns the numerical number for the protocol being used on the socket, if
-known. If the protocol is unknown, as with an AF_UNIX socket, zero
-is returned.
-
-=back
-
-=cut
-
-
-require 5.000;
-
-use Config;
use IO::Handle;
use Socket 1.3;
use Carp;
use strict;
-use vars qw(@ISA $VERSION);
+our(@ISA, $VERSION);
use Exporter;
+use Errno;
+
+# legacy
+
+require IO::Socket::INET;
+require IO::Socket::UNIX if ($^O ne 'epoc');
@ISA = qw(IO::Handle);
-$VERSION = "1.1603";
+$VERSION = "1.26";
sub import {
my $pkg = shift;
@@ -133,16 +33,17 @@ sub import {
sub new {
my($class,%arg) = @_;
- my $fh = $class->SUPER::new();
- $fh->autoflush;
+ my $sock = $class->SUPER::new();
- ${*$fh}{'io_socket_timeout'} = delete $arg{Timeout};
+ $sock->autoflush(1);
- return scalar(%arg) ? $fh->configure(\%arg)
- : $fh;
+ ${*$sock}{'io_socket_timeout'} = delete $arg{Timeout};
+
+ return scalar(%arg) ? $sock->configure(\%arg)
+ : $sock;
}
-my @domain2pkg = ();
+my @domain2pkg;
sub register_domain {
my($p,$d) = @_;
@@ -150,7 +51,7 @@ sub register_domain {
}
sub configure {
- my($fh,$arg) = @_;
+ my($sock,$arg) = @_;
my $domain = delete $arg->{Domain};
croak 'IO::Socket: Cannot configure a generic socket'
@@ -160,150 +61,167 @@ sub configure {
unless defined $domain2pkg[$domain];
croak "IO::Socket: Cannot configure socket in domain '$domain'"
- unless ref($fh) eq "IO::Socket";
+ unless ref($sock) eq "IO::Socket";
- bless($fh, $domain2pkg[$domain]);
- $fh->configure($arg);
+ bless($sock, $domain2pkg[$domain]);
+ $sock->configure($arg);
}
sub socket {
- @_ == 4 or croak 'usage: $fh->socket(DOMAIN, TYPE, PROTOCOL)';
- my($fh,$domain,$type,$protocol) = @_;
+ @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)';
+ my($sock,$domain,$type,$protocol) = @_;
- socket($fh,$domain,$type,$protocol) or
+ socket($sock,$domain,$type,$protocol) or
return undef;
- ${*$fh}{'io_socket_domain'} = $domain;
- ${*$fh}{'io_socket_type'} = $type;
- ${*$fh}{'io_socket_proto'} = $protocol;
+ ${*$sock}{'io_socket_domain'} = $domain;
+ ${*$sock}{'io_socket_type'} = $type;
+ ${*$sock}{'io_socket_proto'} = $protocol;
- $fh;
+ $sock;
}
sub socketpair {
- @_ == 4 || croak 'usage: IO::Socket->pair(DOMAIN, TYPE, PROTOCOL)';
+ @_ == 4 || croak 'usage: IO::Socket->socketpair(DOMAIN, TYPE, PROTOCOL)';
my($class,$domain,$type,$protocol) = @_;
- my $fh1 = $class->new();
- my $fh2 = $class->new();
+ my $sock1 = $class->new();
+ my $sock2 = $class->new();
- socketpair($fh1,$fh2,$domain,$type,$protocol) or
+ socketpair($sock1,$sock2,$domain,$type,$protocol) or
return ();
- ${*$fh1}{'io_socket_type'} = ${*$fh2}{'io_socket_type'} = $type;
- ${*$fh1}{'io_socket_proto'} = ${*$fh2}{'io_socket_proto'} = $protocol;
+ ${*$sock1}{'io_socket_type'} = ${*$sock2}{'io_socket_type'} = $type;
+ ${*$sock1}{'io_socket_proto'} = ${*$sock2}{'io_socket_proto'} = $protocol;
- ($fh1,$fh2);
+ ($sock1,$sock2);
}
sub connect {
- @_ == 2 || @_ == 3 or croak 'usage: $fh->connect(NAME) or $fh->connect(PORT, ADDR)';
- my $fh = shift;
- my $addr = @_ == 1 ? shift : sockaddr_in(@_);
- my $timeout = ${*$fh}{'io_socket_timeout'};
- local($SIG{ALRM}) = $timeout ? sub { undef $fh; }
- : $SIG{ALRM} || 'DEFAULT';
-
- eval {
- croak 'connect: Bad address'
- if(@_ == 2 && !defined $_[1]);
-
- if($timeout) {
- defined $Config{d_alarm} && defined alarm($timeout) or
- $timeout = 0;
- }
-
- my $ok = connect($fh, $addr);
-
- alarm(0)
- if($timeout);
+ @_ == 2 or croak 'usage: $sock->connect(NAME)';
+ my $sock = shift;
+ my $addr = shift;
+ my $timeout = ${*$sock}{'io_socket_timeout'};
+ my $err;
+ my $blocking;
+ $blocking = $sock->blocking(0) if $timeout;
+
+ if (!connect($sock, $addr)) {
+ if ($timeout && $!{EINPROGRESS}) {
+ require IO::Select;
+
+ my $sel = new IO::Select $sock;
+
+ if (!$sel->can_write($timeout)) {
+ $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
+ $@ = "connect: timeout";
+ }
+ elsif(!connect($sock,$addr) && not $!{EISCONN}) {
+ # Some systems refuse to re-connect() to
+ # an already open socket and set errno to EISCONN.
+ $err = $!;
+ $@ = "connect: $!";
+ }
+ }
+ else {
+ $err = $!;
+ $@ = "connect: $!";
+ }
+ }
- croak "connect: timeout"
- unless defined $fh;
+ $sock->blocking(1) if $blocking;
- undef $fh unless $ok;
- };
+ $! = $err if $err;
- $fh;
+ $err ? undef : $sock;
}
sub bind {
- @_ == 2 || @_ == 3 or croak 'usage: $fh->bind(NAME) or $fh->bind(PORT, ADDR)';
- my $fh = shift;
- my $addr = @_ == 1 ? shift : sockaddr_in(@_);
+ @_ == 2 or croak 'usage: $sock->bind(NAME)';
+ my $sock = shift;
+ my $addr = shift;
- return bind($fh, $addr) ? $fh
- : undef;
+ return bind($sock, $addr) ? $sock
+ : undef;
}
sub listen {
- @_ >= 1 && @_ <= 2 or croak 'usage: $fh->listen([QUEUE])';
- my($fh,$queue) = @_;
+ @_ >= 1 && @_ <= 2 or croak 'usage: $sock->listen([QUEUE])';
+ my($sock,$queue) = @_;
$queue = 5
unless $queue && $queue > 0;
- return listen($fh, $queue) ? $fh
- : undef;
+ return listen($sock, $queue) ? $sock
+ : undef;
}
sub accept {
- @_ == 1 || @_ == 2 or croak 'usage $fh->accept([PKG])';
- my $fh = shift;
- my $pkg = shift || $fh;
- my $timeout = ${*$fh}{'io_socket_timeout'};
+ @_ == 1 || @_ == 2 or croak 'usage $sock->accept([PKG])';
+ my $sock = shift;
+ my $pkg = shift || $sock;
+ my $timeout = ${*$sock}{'io_socket_timeout'};
my $new = $pkg->new(Timeout => $timeout);
my $peer = undef;
- eval {
- if($timeout) {
- my $fdset = "";
- vec($fdset, $fh->fileno,1) = 1;
- croak "accept: timeout"
- unless select($fdset,undef,undef,$timeout);
- }
- $peer = accept($new,$fh);
- };
-
- return wantarray ? defined $peer ? ($new, $peer)
- : ()
- : defined $peer ? $new
- : undef;
+ if($timeout) {
+ require IO::Select;
+
+ my $sel = new IO::Select $sock;
+
+ unless ($sel->can_read($timeout)) {
+ $@ = 'accept: timeout';
+ $! = (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
+ return;
+ }
+ }
+
+ $peer = accept($new,$sock)
+ or return;
+
+ return wantarray ? ($new, $peer)
+ : $new;
}
sub sockname {
- @_ == 1 or croak 'usage: $fh->sockname()';
+ @_ == 1 or croak 'usage: $sock->sockname()';
getsockname($_[0]);
}
sub peername {
- @_ == 1 or croak 'usage: $fh->peername()';
- my($fh) = @_;
- getpeername($fh)
- || ${*$fh}{'io_socket_peername'}
+ @_ == 1 or croak 'usage: $sock->peername()';
+ my($sock) = @_;
+ getpeername($sock)
+ || ${*$sock}{'io_socket_peername'}
|| undef;
}
+sub connected {
+ @_ == 1 or croak 'usage: $sock->connected()';
+ my($sock) = @_;
+ getpeername($sock);
+}
+
sub send {
- @_ >= 2 && @_ <= 4 or croak 'usage: $fh->send(BUF, [FLAGS, [TO]])';
- my $fh = $_[0];
+ @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])';
+ my $sock = $_[0];
my $flags = $_[2] || 0;
- my $peer = $_[3] || $fh->peername;
+ my $peer = $_[3] || $sock->peername;
croak 'send: Cannot determine peer address'
unless($peer);
- my $r = defined(getpeername($fh))
- ? send($fh, $_[1], $flags)
- : send($fh, $_[1], $flags, $peer);
+ my $r = defined(getpeername($sock))
+ ? send($sock, $_[1], $flags)
+ : send($sock, $_[1], $flags, $peer);
# remember who we send to, if it was sucessful
- ${*$fh}{'io_socket_peername'} = $peer
+ ${*$sock}{'io_socket_peername'} = $peer
if(@_ == 4 && defined $r);
$r;
}
sub recv {
- @_ == 3 || @_ == 4 or croak 'usage: $fh->recv(BUF, LEN [, FLAGS])';
+ @_ == 3 || @_ == 4 or croak 'usage: $sock->recv(BUF, LEN [, FLAGS])';
my $sock = $_[0];
my $len = $_[2];
my $flags = $_[3] || 0;
@@ -312,16 +230,21 @@ sub recv {
${*$sock}{'io_socket_peername'} = recv($sock, $_[1]='', $len, $flags);
}
+sub shutdown {
+ @_ == 2 or croak 'usage: $sock->shutdown(HOW)';
+ my($sock, $how) = @_;
+ shutdown($sock, $how);
+}
sub setsockopt {
- @_ == 4 or croak '$fh->setsockopt(LEVEL, OPTNAME)';
+ @_ == 4 or croak '$sock->setsockopt(LEVEL, OPTNAME)';
setsockopt($_[0],$_[1],$_[2],$_[3]);
}
my $intsize = length(pack("i",0));
sub getsockopt {
- @_ == 3 or croak '$fh->getsockopt(LEVEL, OPTNAME)';
+ @_ == 3 or croak '$sock->getsockopt(LEVEL, OPTNAME)';
my $r = getsockopt($_[0],$_[1],$_[2]);
# Just a guess
$r = unpack("i", $r)
@@ -330,399 +253,176 @@ sub getsockopt {
}
sub sockopt {
- my $fh = shift;
- @_ == 1 ? $fh->getsockopt(SOL_SOCKET,@_)
- : $fh->setsockopt(SOL_SOCKET,@_);
+ my $sock = shift;
+ @_ == 1 ? $sock->getsockopt(SOL_SOCKET,@_)
+ : $sock->setsockopt(SOL_SOCKET,@_);
}
sub timeout {
- @_ == 1 || @_ == 2 or croak 'usage: $fh->timeout([VALUE])';
- my($fh,$val) = @_;
- my $r = ${*$fh}{'io_socket_timeout'} || undef;
+ @_ == 1 || @_ == 2 or croak 'usage: $sock->timeout([VALUE])';
+ my($sock,$val) = @_;
+ my $r = ${*$sock}{'io_socket_timeout'} || undef;
- ${*$fh}{'io_socket_timeout'} = 0 + $val
+ ${*$sock}{'io_socket_timeout'} = 0 + $val
if(@_ == 2);
$r;
}
sub sockdomain {
- @_ == 1 or croak 'usage: $fh->sockdomain()';
- my $fh = shift;
- ${*$fh}{'io_socket_domain'};
+ @_ == 1 or croak 'usage: $sock->sockdomain()';
+ my $sock = shift;
+ ${*$sock}{'io_socket_domain'};
}
sub socktype {
- @_ == 1 or croak 'usage: $fh->socktype()';
- my $fh = shift;
- ${*$fh}{'io_socket_type'}
+ @_ == 1 or croak 'usage: $sock->socktype()';
+ my $sock = shift;
+ ${*$sock}{'io_socket_type'}
}
sub protocol {
- @_ == 1 or croak 'usage: $fh->protocol()';
- my($fh) = @_;
- ${*$fh}{'io_socket_protocol'};
+ @_ == 1 or croak 'usage: $sock->protocol()';
+ my($sock) = @_;
+ ${*$sock}{'io_socket_proto'};
}
-=head1 SUB-CLASSES
-
-=cut
-
-##
-## AF_INET
-##
-
-package IO::Socket::INET;
-
-use strict;
-use vars qw(@ISA);
-use Socket;
-use Carp;
-use Exporter;
-
-@ISA = qw(IO::Socket);
-
-IO::Socket::INET->register_domain( AF_INET );
-
-my %socket_type = ( tcp => SOCK_STREAM,
- udp => SOCK_DGRAM,
- icmp => SOCK_RAW,
- );
-
-=head2 IO::Socket::INET
-
-C<IO::Socket::INET> provides a constructor to create an AF_INET domain socket
-and some related methods. The constructor can take the following options
-
- PeerAddr Remote host address <hostname>[:<port>]
- PeerPort Remote port or service <service>[(<no>)] | <no>
- LocalAddr Local host bind address hostname[:port]
- LocalPort Local host bind port <service>[(<no>)] | <no>
- Proto Protocol name (or number) "tcp" | "udp" | ...
- Type Socket type SOCK_STREAM | SOCK_DGRAM | ...
- Listen Queue size for listen
- Reuse Set SO_REUSEADDR before binding
- Timeout Timeout value for various operations
-
+1;
-If C<Listen> is defined then a listen socket is created, else if the
-socket type, which is derived from the protocol, is SOCK_STREAM then
-connect() is called.
+__END__
-The C<PeerAddr> can be a hostname or the IP-address on the
-"xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic
-service name. The service name might be followed by a number in
-parenthesis which is used if the service is not known by the system.
-The C<PeerPort> specification can also be embedded in the C<PeerAddr>
-by preceding it with a ":".
-
-If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
-then the constructor will try to derive C<Proto> from the service
-name. As a last resort C<Proto> "tcp" is assumed. The C<Type>
-parameter will be deduced from C<Proto> if not specified.
+=head1 NAME
-If the constructor is only passed a single argument, it is assumed to
-be a C<PeerAddr> specification.
+IO::Socket - Object interface to socket communications
-Examples:
+=head1 SYNOPSIS
- $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
- PeerPort => 'http(80)',
- Proto => 'tcp');
+ use IO::Socket;
- $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
+=head1 DESCRIPTION
- $sock = IO::Socket::INET->new(Listen => 5,
- LocalAddr => 'localhost',
- LocalPort => 9000,
- Proto => 'tcp');
+C<IO::Socket> provides an object interface to creating and using sockets. It
+is built upon the L<IO::Handle> interface and inherits all the methods defined
+by L<IO::Handle>.
- $sock = IO::Socket::INET->new('127.0.0.1:25');
+C<IO::Socket> only defines methods for those operations which are common to all
+types of socket. Operations which are specified to a socket in a particular
+domain have methods defined in sub classes of C<IO::Socket>
+C<IO::Socket> will export all functions (and constants) defined by L<Socket>.
-=head2 METHODS
+=head1 CONSTRUCTOR
=over 4
-=item sockaddr ()
-
-Return the address part of the sockaddr structure for the socket
-
-=item sockport ()
-
-Return the port number that the socket is using on the local host
-
-=item sockhost ()
-
-Return the address part of the sockaddr structure for the socket in a
-text form xx.xx.xx.xx
-
-=item peeraddr ()
-
-Return the address part of the sockaddr structure for the socket on
-the peer host
+=item new ( [ARGS] )
-=item peerport ()
+Creates an C<IO::Socket>, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+C<new> only looks for one key C<Domain> which tells new which domain
+the socket will be in. All other arguments will be passed to the
+configuration method of the package for that domain, See below.
-Return the port number for the socket on the peer host.
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
-=item peerhost ()
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
-Return the address part of the sockaddr structure for the socket on the
-peer host in a text form xx.xx.xx.xx
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
=back
-=cut
-
-sub new
-{
- my $class = shift;
- unshift(@_, "PeerAddr") if @_ == 1;
- return $class->SUPER::new(@_);
-}
-
-sub _sock_info {
- my($addr,$port,$proto) = @_;
- my @proto = ();
- my @serv = ();
-
- $port = $1
- if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
-
- if(defined $proto) {
- @proto = $proto =~ m,\D, ? getprotobyname($proto)
- : getprotobynumber($proto);
-
- $proto = $proto[2] || undef;
- }
-
- if(defined $port) {
- $port =~ s,\((\d+)\)$,,;
-
- my $defport = $1 || undef;
- my $pnum = ($port =~ m,^(\d+)$,)[0];
-
- @serv= getservbyname($port, $proto[0] || "")
- if($port =~ m,\D,);
-
- $port = $pnum || $serv[2] || $defport || undef;
-
- $proto = (getprotobyname($serv[3]))[2] || undef
- if @serv && !$proto;
- }
-
- return ($addr || undef,
- $port || undef,
- $proto || undef
- );
-}
-
-sub _error {
- my $fh = shift;
- $@ = join("",ref($fh),": ",@_);
- carp $@ if $^W;
- close($fh)
- if(defined fileno($fh));
- return undef;
-}
-
-sub configure {
- my($fh,$arg) = @_;
- my($lport,$rport,$laddr,$raddr,$proto,$type);
-
-
- ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
- $arg->{LocalPort},
- $arg->{Proto});
-
- $laddr = defined $laddr ? inet_aton($laddr)
- : INADDR_ANY;
-
- return _error($fh,"Bad hostname '",$arg->{LocalAddr},"'")
- unless(defined $laddr);
-
- unless(exists $arg->{Listen}) {
- ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
- $arg->{PeerPort},
- $proto);
- }
-
- if(defined $raddr) {
- $raddr = inet_aton($raddr);
- return _error($fh,"Bad hostname '",$arg->{PeerAddr},"'")
- unless(defined $raddr);
- }
-
- $proto ||= (getprotobyname "tcp")[2];
- return _error($fh,'Cannot determine protocol')
- unless($proto);
-
- my $pname = (getprotobynumber($proto))[0];
- $type = $arg->{Type} || $socket_type{$pname};
-
- $fh->socket(AF_INET, $type, $proto) or
- return _error($fh,"$!");
-
- if ($arg->{Reuse}) {
- $fh->sockopt(SO_REUSEADDR,1) or
- return _error($fh);
- }
-
- $fh->bind($lport || 0, $laddr) or
- return _error($fh,"$!");
-
- if(exists $arg->{Listen}) {
- $fh->listen($arg->{Listen} || 5) or
- return _error($fh,"$!");
- }
- else {
- return _error($fh,'Cannot determine remote port')
- unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
-
- if($type == SOCK_STREAM || defined $raddr) {
- return _error($fh,'Bad peer address')
- unless(defined $raddr);
-
- $fh->connect($rport,$raddr) or
- return _error($fh,"$!");
- }
- }
-
- $fh;
-}
-
-sub sockaddr {
- @_ == 1 or croak 'usage: $fh->sockaddr()';
- my($fh) = @_;
- (sockaddr_in($fh->sockname))[1];
-}
-
-sub sockport {
- @_ == 1 or croak 'usage: $fh->sockport()';
- my($fh) = @_;
- (sockaddr_in($fh->sockname))[0];
-}
-
-sub sockhost {
- @_ == 1 or croak 'usage: $fh->sockhost()';
- my($fh) = @_;
- inet_ntoa($fh->sockaddr);
-}
-
-sub peeraddr {
- @_ == 1 or croak 'usage: $fh->peeraddr()';
- my($fh) = @_;
- (sockaddr_in($fh->peername))[1];
-}
-
-sub peerport {
- @_ == 1 or croak 'usage: $fh->peerport()';
- my($fh) = @_;
- (sockaddr_in($fh->peername))[0];
-}
+=head1 METHODS
-sub peerhost {
- @_ == 1 or croak 'usage: $fh->peerhost()';
- my($fh) = @_;
- inet_ntoa($fh->peeraddr);
-}
+See L<perlfunc> for complete descriptions of each of the following
+supported C<IO::Socket> methods, which are just front ends for the
+corresponding built-in functions:
-##
-## AF_UNIX
-##
+ socket
+ socketpair
+ bind
+ listen
+ accept
+ send
+ recv
+ peername (getpeername)
+ sockname (getsockname)
+ shutdown
-package IO::Socket::UNIX;
+Some methods take slightly different arguments to those defined in L<perlfunc>
+in attempt to make the interface more flexible. These are
-use strict;
-use vars qw(@ISA $VERSION);
-use Socket;
-use Carp;
-use Exporter;
+=over 4
-@ISA = qw(IO::Socket);
+=item accept([PKG])
-IO::Socket::UNIX->register_domain( AF_UNIX );
+perform the system call C<accept> on the socket and return a new object. The
+new object will be created in the same class as the listen socket, unless
+C<PKG> is specified. This object can be used to communicate with the client
+that was trying to connect. In a scalar context the new socket is returned,
+or undef upon failure. In an array context a two-element array is returned
+containing the new socket and the peer address; the list will
+be empty upon failure.
-=head2 IO::Socket::UNIX
+=item socketpair(DOMAIN, TYPE, PROTOCOL)
-C<IO::Socket::UNIX> provides a constructor to create an AF_UNIX domain socket
-and some related methods. The constructor can take the following options
+Call C<socketpair> and return a list of two sockets created, or an
+empty list on failure.
- Type Type of socket (eg SOCK_STREAM or SOCK_DGRAM)
- Local Path to local fifo
- Peer Path to peer fifo
- Listen Create a listen socket
+=back
-=head2 METHODS
+Additional methods that are provided are:
=over 4
-=item hostpath()
+=item timeout([VAL])
-Returns the pathname to the fifo at the local end
+Set or get the timeout value associated with this socket. If called without
+any arguments then the current setting is returned. If called with an argument
+the current setting is changed and the previous value returned.
-=item peerpath()
+=item sockopt(OPT [, VAL])
-Returns the pathname to the fifo at the peer end
+Unified method to both set and get options in the SOL_SOCKET level. If called
+with one argument then getsockopt is called, otherwise setsockopt is called.
-=back
+=item sockdomain
-=cut
+Returns the numerical number for the socket domain type. For example, for
+a AF_INET socket the value of &AF_INET will be returned.
-sub configure {
- my($fh,$arg) = @_;
- my($bport,$cport);
+=item socktype
- my $type = $arg->{Type} || SOCK_STREAM;
+Returns the numerical number for the socket type. For example, for
+a SOCK_STREAM socket the value of &SOCK_STREAM will be returned.
- $fh->socket(AF_UNIX, $type, 0) or
- return undef;
+=item protocol
- if(exists $arg->{Local}) {
- my $addr = sockaddr_un($arg->{Local});
- $fh->bind($addr) or
- return undef;
- }
- if(exists $arg->{Listen}) {
- $fh->listen($arg->{Listen} || 5) or
- return undef;
- }
- elsif(exists $arg->{Peer}) {
- my $addr = sockaddr_un($arg->{Peer});
- $fh->connect($addr) or
- return undef;
- }
+Returns the numerical number for the protocol being used on the socket, if
+known. If the protocol is unknown, as with an AF_UNIX socket, zero
+is returned.
- $fh;
-}
+=item connected
-sub hostpath {
- @_ == 1 or croak 'usage: $fh->hostpath()';
- my $n = $_[0]->sockname || return undef;
- (sockaddr_un($n))[0];
-}
+If the socket is in a connected state the the peer address is returned.
+If the socket is not in a connected state then undef will be returned.
-sub peerpath {
- @_ == 1 or croak 'usage: $fh->peerpath()';
- my $n = $_[0]->peername || return undef;
- (sockaddr_un($n))[0];
-}
+=back
=head1 SEE ALSO
-L<Socket>, L<IO::Handle>
+L<Socket>, L<IO::Handle>, L<IO::Socket::INET>, L<IO::Socket::UNIX>
=head1 AUTHOR
-Graham Barr E<lt>F<Graham.Barr@tiuk.ti.com>E<gt>
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
=head1 COPYRIGHT
-Copyright (c) 1996 Graham Barr. All rights reserved. This program is free
-software; you can redistribute it and/or modify it under the same terms
-as Perl itself.
+Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
=cut
-
-1; # Keep require happy
diff --git a/contrib/perl5/ext/IO/lib/IO/Socket/INET.pm b/contrib/perl5/ext/IO/lib/IO/Socket/INET.pm
new file mode 100644
index 0000000..27a3d4d
--- /dev/null
+++ b/contrib/perl5/ext/IO/lib/IO/Socket/INET.pm
@@ -0,0 +1,406 @@
+# IO::Socket::INET.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Socket::INET;
+
+use strict;
+our(@ISA, $VERSION);
+use IO::Socket;
+use Socket;
+use Carp;
+use Exporter;
+use Errno;
+
+@ISA = qw(IO::Socket);
+$VERSION = "1.25";
+
+my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1;
+
+IO::Socket::INET->register_domain( AF_INET );
+
+my %socket_type = ( tcp => SOCK_STREAM,
+ udp => SOCK_DGRAM,
+ icmp => SOCK_RAW
+ );
+
+sub new {
+ my $class = shift;
+ unshift(@_, "PeerAddr") if @_ == 1;
+ return $class->SUPER::new(@_);
+}
+
+sub _sock_info {
+ my($addr,$port,$proto) = @_;
+ my @proto = ();
+ my @serv = ();
+
+ $port = $1
+ if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,);
+
+ if(defined $proto) {
+ if (@proto = ( $proto =~ m,\D,
+ ? getprotobyname($proto)
+ : getprotobynumber($proto))
+ ) {
+ $proto = $proto[2] || undef;
+ }
+ else {
+ $@ = "Bad protocol '$proto'";
+ return;
+ }
+ }
+
+ if(defined $port) {
+ $port =~ s,\((\d+)\)$,,;
+
+ my $defport = $1 || undef;
+ my $pnum = ($port =~ m,^(\d+)$,)[0];
+
+ if ($port =~ m,\D,) {
+ unless (@serv = getservbyname($port, $proto[0] || "")) {
+ $@ = "Bad service '$port'";
+ return;
+ }
+ }
+
+ $port = $pnum || $serv[2] || $defport || undef;
+
+ $proto = (getprotobyname($serv[3]))[2] || undef
+ if @serv && !$proto;
+ }
+
+ return ($addr || undef,
+ $port || undef,
+ $proto || undef
+ );
+}
+
+sub _error {
+ my $sock = shift;
+ my $err = shift;
+ {
+ local($!);
+ $@ = join("",ref($sock),": ",@_);
+ close($sock)
+ if(defined fileno($sock));
+ }
+ $! = $err;
+ return undef;
+}
+
+sub _get_addr {
+ my($sock,$addr_str, $multi) = @_;
+ my @addr;
+ if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
+ (undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
+ } else {
+ my $h = inet_aton($addr_str);
+ push(@addr, $h) if defined $h;
+ }
+ @addr;
+}
+
+sub configure {
+ my($sock,$arg) = @_;
+ my($lport,$rport,$laddr,$raddr,$proto,$type);
+
+
+ $arg->{LocalAddr} = $arg->{LocalHost}
+ if exists $arg->{LocalHost} && !exists $arg->{LocalAddr};
+
+ ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr},
+ $arg->{LocalPort},
+ $arg->{Proto})
+ or return _error($sock, $!, $@);
+
+ $laddr = defined $laddr ? inet_aton($laddr)
+ : INADDR_ANY;
+
+ return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'")
+ unless(defined $laddr);
+
+ $arg->{PeerAddr} = $arg->{PeerHost}
+ if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
+
+ unless(exists $arg->{Listen}) {
+ ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr},
+ $arg->{PeerPort},
+ $proto)
+ or return _error($sock, $!, $@);
+ }
+
+ $proto ||= (getprotobyname('tcp'))[2];
+
+ my $pname = (getprotobynumber($proto))[0];
+ $type = $arg->{Type} || $socket_type{$pname};
+
+ my @raddr = ();
+
+ if(defined $raddr) {
+ @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed});
+ return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
+ unless @raddr;
+ }
+
+ while(1) {
+
+ $sock->socket(AF_INET, $type, $proto) or
+ return _error($sock, $!, "$!");
+
+ if ($arg->{Reuse}) {
+ $sock->sockopt(SO_REUSEADDR,1) or
+ return _error($sock, $!, "$!");
+ }
+
+ if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) {
+ $sock->bind($lport || 0, $laddr) or
+ return _error($sock, $!, "$!");
+ }
+
+ if(exists $arg->{Listen}) {
+ $sock->listen($arg->{Listen} || 5) or
+ return _error($sock, $!, "$!");
+ last;
+ }
+
+ # don't try to connect unless we're given a PeerAddr
+ last unless exists($arg->{PeerAddr});
+
+ $raddr = shift @raddr;
+
+ return _error($sock, $EINVAL, 'Cannot determine remote port')
+ unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW);
+
+ last
+ unless($type == SOCK_STREAM || defined $raddr);
+
+ return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'")
+ unless defined $raddr;
+
+# my $timeout = ${*$sock}{'io_socket_timeout'};
+# my $before = time() if $timeout;
+
+ if ($sock->connect(pack_sockaddr_in($rport, $raddr))) {
+# ${*$sock}{'io_socket_timeout'} = $timeout;
+ return $sock;
+ }
+
+ return _error($sock, $!, "Timeout")
+ unless @raddr;
+
+# if ($timeout) {
+# my $new_timeout = $timeout - (time() - $before);
+# return _error($sock,
+# (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL),
+# "Timeout") if $new_timeout <= 0;
+# ${*$sock}{'io_socket_timeout'} = $new_timeout;
+# }
+
+ }
+
+ $sock;
+}
+
+sub connect {
+ @_ == 2 || @_ == 3 or
+ croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)';
+ my $sock = shift;
+ return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_));
+}
+
+sub bind {
+ @_ == 2 || @_ == 3 or
+ croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)';
+ my $sock = shift;
+ return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_))
+}
+
+sub sockaddr {
+ @_ == 1 or croak 'usage: $sock->sockaddr()';
+ my($sock) = @_;
+ my $name = $sock->sockname;
+ $name ? (sockaddr_in($name))[1] : undef;
+}
+
+sub sockport {
+ @_ == 1 or croak 'usage: $sock->sockport()';
+ my($sock) = @_;
+ my $name = $sock->sockname;
+ $name ? (sockaddr_in($name))[0] : undef;
+}
+
+sub sockhost {
+ @_ == 1 or croak 'usage: $sock->sockhost()';
+ my($sock) = @_;
+ my $addr = $sock->sockaddr;
+ $addr ? inet_ntoa($addr) : undef;
+}
+
+sub peeraddr {
+ @_ == 1 or croak 'usage: $sock->peeraddr()';
+ my($sock) = @_;
+ my $name = $sock->peername;
+ $name ? (sockaddr_in($name))[1] : undef;
+}
+
+sub peerport {
+ @_ == 1 or croak 'usage: $sock->peerport()';
+ my($sock) = @_;
+ my $name = $sock->peername;
+ $name ? (sockaddr_in($name))[0] : undef;
+}
+
+sub peerhost {
+ @_ == 1 or croak 'usage: $sock->peerhost()';
+ my($sock) = @_;
+ my $addr = $sock->peeraddr;
+ $addr ? inet_ntoa($addr) : undef;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Socket::INET - Object interface for AF_INET domain sockets
+
+=head1 SYNOPSIS
+
+ use IO::Socket::INET;
+
+=head1 DESCRIPTION
+
+C<IO::Socket::INET> provides an object interface to creating and using sockets
+in the AF_INET domain. It is built upon the L<IO::Socket> interface and
+inherits all the methods defined by L<IO::Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket::INET> object, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+
+In addition to the key-value pairs accepted by L<IO::Socket>,
+C<IO::Socket::INET> provides.
+
+
+ PeerAddr Remote host address <hostname>[:<port>]
+ PeerHost Synonym for PeerAddr
+ PeerPort Remote port or service <service>[(<no>)] | <no>
+ LocalAddr Local host bind address hostname[:port]
+ LocalHost Synonym for LocalAddr
+ LocalPort Local host bind port <service>[(<no>)] | <no>
+ Proto Protocol name (or number) "tcp" | "udp" | ...
+ Type Socket type SOCK_STREAM | SOCK_DGRAM | ...
+ Listen Queue size for listen
+ Reuse Set SO_REUSEADDR before binding
+ Timeout Timeout value for various operations
+ MultiHomed Try all adresses for multi-homed hosts
+
+
+If C<Listen> is defined then a listen socket is created, else if the
+socket type, which is derived from the protocol, is SOCK_STREAM then
+connect() is called.
+
+Although it is not illegal, the use of C<MultiHomed> on a socket
+which is in non-blocking mode is of little use. This is because the
+first connect will never fail with a timeout as the connaect call
+will not block.
+
+The C<PeerAddr> can be a hostname or the IP-address on the
+"xx.xx.xx.xx" form. The C<PeerPort> can be a number or a symbolic
+service name. The service name might be followed by a number in
+parenthesis which is used if the service is not known by the system.
+The C<PeerPort> specification can also be embedded in the C<PeerAddr>
+by preceding it with a ":".
+
+If C<Proto> is not given and you specify a symbolic C<PeerPort> port,
+then the constructor will try to derive C<Proto> from the service
+name. As a last resort C<Proto> "tcp" is assumed. The C<Type>
+parameter will be deduced from C<Proto> if not specified.
+
+If the constructor is only passed a single argument, it is assumed to
+be a C<PeerAddr> specification.
+
+Examples:
+
+ $sock = IO::Socket::INET->new(PeerAddr => 'www.perl.org',
+ PeerPort => 'http(80)',
+ Proto => 'tcp');
+
+ $sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
+
+ $sock = IO::Socket::INET->new(Listen => 5,
+ LocalAddr => 'localhost',
+ LocalPort => 9000,
+ Proto => 'tcp');
+
+ $sock = IO::Socket::INET->new('127.0.0.1:25');
+
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head2 METHODS
+
+=over 4
+
+=item sockaddr ()
+
+Return the address part of the sockaddr structure for the socket
+
+=item sockport ()
+
+Return the port number that the socket is using on the local host
+
+=item sockhost ()
+
+Return the address part of the sockaddr structure for the socket in a
+text form xx.xx.xx.xx
+
+=item peeraddr ()
+
+Return the address part of the sockaddr structure for the socket on
+the peer host
+
+=item peerport ()
+
+Return the port number for the socket on the peer host.
+
+=item peerhost ()
+
+Return the address part of the sockaddr structure for the socket on the
+peer host in a text form xx.xx.xx.xx
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Socket>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/contrib/perl5/ext/IO/lib/IO/Socket/UNIX.pm b/contrib/perl5/ext/IO/lib/IO/Socket/UNIX.pm
new file mode 100644
index 0000000..d083f48
--- /dev/null
+++ b/contrib/perl5/ext/IO/lib/IO/Socket/UNIX.pm
@@ -0,0 +1,143 @@
+# IO::Socket::UNIX.pm
+#
+# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package IO::Socket::UNIX;
+
+use strict;
+our(@ISA, $VERSION);
+use IO::Socket;
+use Socket;
+use Carp;
+
+@ISA = qw(IO::Socket);
+$VERSION = "1.20";
+
+IO::Socket::UNIX->register_domain( AF_UNIX );
+
+sub new {
+ my $class = shift;
+ unshift(@_, "Peer") if @_ == 1;
+ return $class->SUPER::new(@_);
+}
+
+sub configure {
+ my($sock,$arg) = @_;
+ my($bport,$cport);
+
+ my $type = $arg->{Type} || SOCK_STREAM;
+
+ $sock->socket(AF_UNIX, $type, 0) or
+ return undef;
+
+ if(exists $arg->{Local}) {
+ my $addr = sockaddr_un($arg->{Local});
+ $sock->bind($addr) or
+ return undef;
+ }
+ if(exists $arg->{Listen}) {
+ $sock->listen($arg->{Listen} || 5) or
+ return undef;
+ }
+ elsif(exists $arg->{Peer}) {
+ my $addr = sockaddr_un($arg->{Peer});
+ $sock->connect($addr) or
+ return undef;
+ }
+
+ $sock;
+}
+
+sub hostpath {
+ @_ == 1 or croak 'usage: $sock->hostpath()';
+ my $n = $_[0]->sockname || return undef;
+ (sockaddr_un($n))[0];
+}
+
+sub peerpath {
+ @_ == 1 or croak 'usage: $sock->peerpath()';
+ my $n = $_[0]->peername || return undef;
+ (sockaddr_un($n))[0];
+}
+
+1; # Keep require happy
+
+__END__
+
+=head1 NAME
+
+IO::Socket::UNIX - Object interface for AF_UNIX domain sockets
+
+=head1 SYNOPSIS
+
+ use IO::Socket::UNIX;
+
+=head1 DESCRIPTION
+
+C<IO::Socket::UNIX> provides an object interface to creating and using sockets
+in the AF_UNIX domain. It is built upon the L<IO::Socket> interface and
+inherits all the methods defined by L<IO::Socket>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ARGS] )
+
+Creates an C<IO::Socket::UNIX> object, which is a reference to a
+newly created symbol (see the C<Symbol> package). C<new>
+optionally takes arguments, these arguments are in key-value pairs.
+
+In addition to the key-value pairs accepted by L<IO::Socket>,
+C<IO::Socket::UNIX> provides.
+
+ Type Type of socket (eg SOCK_STREAM or SOCK_DGRAM)
+ Local Path to local fifo
+ Peer Path to peer fifo
+ Listen Create a listen socket
+
+If the constructor is only passed a single argument, it is assumed to
+be a C<Peer> specification.
+
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+As of VERSION 1.18 all IO::Socket objects have autoflush turned on
+by default. This was not the case with earlier releases.
+
+ NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item hostpath()
+
+Returns the pathname to the fifo at the local end
+
+=item peerpath()
+
+Returns the pathanme to the fifo at the peer end
+
+=back
+
+=head1 SEE ALSO
+
+L<Socket>, L<IO::Socket>
+
+=head1 AUTHOR
+
+Graham Barr. Currently maintained by the Perl Porters. Please report all
+bugs to <perl5-porters@perl.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
diff --git a/contrib/perl5/ext/IO/poll.c b/contrib/perl5/ext/IO/poll.c
new file mode 100644
index 0000000..024c52f
--- /dev/null
+++ b/contrib/perl5/ext/IO/poll.c
@@ -0,0 +1,135 @@
+/*
+ * poll.c
+ *
+ * Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the same terms as Perl itself.
+ *
+ * For systems that do not have the poll() system call (for example Linux
+ * kernels < v2.1.23) try to emulate it as closely as possible using select()
+ *
+ */
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "poll.h"
+#ifdef I_SYS_TIME
+# include <sys/time.h>
+#endif
+#ifdef I_TIME
+# include <time.h>
+#endif
+#include <sys/types.h>
+#if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
+# include <sys/socket.h>
+#endif
+#include <sys/stat.h>
+#include <errno.h>
+
+#ifdef HAS_SELECT
+#ifdef I_SYS_SELECT
+#include <sys/select.h>
+#endif
+#endif
+
+#ifdef EMULATE_POLL_WITH_SELECT
+
+# define POLL_CAN_READ (POLLIN | POLLRDNORM )
+# define POLL_CAN_WRITE (POLLOUT | POLLWRNORM | POLLWRBAND )
+# define POLL_HAS_EXCP (POLLRDBAND | POLLPRI )
+
+# define POLL_EVENTS_MASK (POLL_CAN_READ | POLL_CAN_WRITE | POLL_HAS_EXCP)
+
+int
+poll(struct pollfd *fds, unsigned long nfds, int timeout)
+{
+ int i,err;
+ fd_set rfd,wfd,efd,ifd;
+ struct timeval timebuf;
+ struct timeval *tbuf = (struct timeval *)0;
+ int n = 0;
+ int count;
+
+ FD_ZERO(&ifd);
+
+again:
+
+ FD_ZERO(&rfd);
+ FD_ZERO(&wfd);
+ FD_ZERO(&efd);
+
+ for(i = 0 ; i < nfds ; i++) {
+ int events = fds[i].events;
+ int fd = fds[i].fd;
+
+ fds[i].revents = 0;
+
+ if(fd < 0 || FD_ISSET(fd, &ifd))
+ continue;
+
+ if(fd > n)
+ n = fd;
+
+ if(events & POLL_CAN_READ)
+ FD_SET(fd, &rfd);
+
+ if(events & POLL_CAN_WRITE)
+ FD_SET(fd, &wfd);
+
+ if(events & POLL_HAS_EXCP)
+ FD_SET(fd, &efd);
+ }
+
+ if(timeout >= 0) {
+ timebuf.tv_sec = timeout / 1000;
+ timebuf.tv_usec = (timeout % 1000) * 1000;
+ tbuf = &timebuf;
+ }
+
+ err = select(n+1,&rfd,&wfd,&efd,tbuf);
+
+ if(err < 0) {
+#ifdef HAS_FSTAT
+ if(errno == EBADF) {
+ for(i = 0 ; i < nfds ; i++) {
+ struct stat buf;
+ if((fstat(fds[i].fd,&buf) < 0) && (errno == EBADF)) {
+ FD_SET(fds[i].fd, &ifd);
+ goto again;
+ }
+ }
+ }
+#endif /* HAS_FSTAT */
+ return err;
+ }
+
+ count = 0;
+
+ for(i = 0 ; i < nfds ; i++) {
+ int revents = (fds[i].events & POLL_EVENTS_MASK);
+ int fd = fds[i].fd;
+
+ if(fd < 0)
+ continue;
+
+ if(FD_ISSET(fd, &ifd))
+ revents = POLLNVAL;
+ else {
+ if(!FD_ISSET(fd, &rfd))
+ revents &= ~POLL_CAN_READ;
+
+ if(!FD_ISSET(fd, &wfd))
+ revents &= ~POLL_CAN_WRITE;
+
+ if(!FD_ISSET(fd, &efd))
+ revents &= ~POLL_HAS_EXCP;
+ }
+
+ if((fds[i].revents = revents) != 0)
+ count++;
+ }
+
+ return count;
+}
+
+#endif /* EMULATE_POLL_WITH_SELECT */
diff --git a/contrib/perl5/ext/IO/poll.h b/contrib/perl5/ext/IO/poll.h
new file mode 100644
index 0000000..4055b49
--- /dev/null
+++ b/contrib/perl5/ext/IO/poll.h
@@ -0,0 +1,55 @@
+/*
+ * poll.h
+ *
+ * Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the same terms as Perl itself.
+ *
+ */
+
+#ifndef POLL_H
+# define POLL_H
+
+#if (defined(HAS_POLL) && defined(I_POLL)) || defined(POLLWRBAND)
+# include <poll.h>
+#else
+#ifdef HAS_SELECT
+
+
+/* We shall emulate poll using select */
+
+#define EMULATE_POLL_WITH_SELECT
+
+typedef struct pollfd {
+ int fd;
+ short events;
+ short revents;
+} pollfd_t;
+
+#define POLLIN 0x0001
+#define POLLPRI 0x0002
+#define POLLOUT 0x0004
+#define POLLRDNORM 0x0040
+#define POLLWRNORM POLLOUT
+#define POLLRDBAND 0x0080
+#define POLLWRBAND 0x0100
+#define POLLNORM POLLRDNORM
+
+/* Return ONLY events (NON testable) */
+
+#define POLLERR 0x0008
+#define POLLHUP 0x0010
+#define POLLNVAL 0x0020
+
+int poll (struct pollfd *, unsigned long, int);
+
+#ifndef HAS_POLL
+# define HAS_POLL
+#endif
+
+#endif /* HAS_SELECT */
+
+#endif /* I_POLL */
+
+#endif /* POLL_H */
+
diff --git a/contrib/perl5/ext/IPC/SysV/Msg.pm b/contrib/perl5/ext/IPC/SysV/Msg.pm
index a739ca2..120a5b2 100644
--- a/contrib/perl5/ext/IPC/SysV/Msg.pm
+++ b/contrib/perl5/ext/IPC/SysV/Msg.pm
@@ -90,14 +90,14 @@ sub rcv {
msgrcv($$self,$buf,$_[1],$_[2] || 0, $_[3] || 0) or
return;
my $type;
- ($type,$_[0]) = unpack("L a*",$buf);
+ ($type,$_[0]) = unpack("l! a*",$buf);
$type;
}
sub snd {
@_ <= 4 && @_ >= 3 or croak '$msg->snd( TYPE, BUF, FLAGS )';
my $self = shift;
- msgsnd($$self,pack("L a*",$_[0],$_[1]), $_[2] || 0);
+ msgsnd($$self,pack("l! a*",$_[0],$_[1]), $_[2] || 0);
}
@@ -111,17 +111,17 @@ IPC::Msg - SysV Msg IPC object class
=head1 SYNOPSIS
- use IPC::SysV qw(IPC_PRIVATE S_IRWXU S_IRWXG S_IRWXO);
+ use IPC::SysV qw(IPC_PRIVATE S_IRWXU);
use IPC::Msg;
-
- $msg = new IPC::Msg(IPC_PRIVATE, S_IRWXU | S_IRWXG | S_IRWXO);
-
- $msg->snd(pack("L a*",$msgtype,$msg));
-
+
+ $msg = new IPC::Msg(IPC_PRIVATE, S_IRWXU);
+
+ $msg->snd(pack("l! a*",$msgtype,$msg));
+
$msg->rcv($buf,256);
-
+
$ds = $msg->stat;
-
+
$msg->remove;
=head1 DESCRIPTION
@@ -157,8 +157,8 @@ Returns the system message queue identifier.
=item rcv ( BUF, LEN [, TYPE [, FLAGS ]] )
-Read a message from the queue. Returns the type of the message read. See
-L<msgrcv>
+Read a message from the queue. Returns the type of the message read.
+See L<msgrcv>. The BUF becomes tainted.
=item remove
diff --git a/contrib/perl5/ext/IPC/SysV/Semaphore.pm b/contrib/perl5/ext/IPC/SysV/Semaphore.pm
index 464eb0b..faf7411 100644
--- a/contrib/perl5/ext/IPC/SysV/Semaphore.pm
+++ b/contrib/perl5/ext/IPC/SysV/Semaphore.pm
@@ -155,19 +155,19 @@ IPC::Semaphore - SysV Semaphore IPC object class
use IPC::SysV qw(IPC_PRIVATE S_IRWXU IPC_CREAT);
use IPC::Semaphore;
-
+
$sem = new IPC::Semaphore(IPC_PRIVATE, 10, S_IRWXU | IPC_CREAT);
-
+
$sem->setall( (0) x 10);
-
+
@sem = $sem->getall;
-
+
$ncnt = $sem->getncnt;
-
+
$zcnt = $sem->getzcnt;
-
+
$ds = $sem->stat;
-
+
$sem->remove;
=head1 DESCRIPTION
diff --git a/contrib/perl5/ext/IPC/SysV/SysV.pm b/contrib/perl5/ext/IPC/SysV/SysV.pm
index eb24593..bebb8fd 100644
--- a/contrib/perl5/ext/IPC/SysV/SysV.pm
+++ b/contrib/perl5/ext/IPC/SysV/SysV.pm
@@ -74,11 +74,15 @@ C<IPC::SysV> defines and conditionally exports all the constants
defined in your system include files which are needed by the SysV
IPC calls.
+=over
+
=item ftok( PATH, ID )
Return a key based on PATH and ID, which can be used as a key for
C<msgget>, C<semget> and C<shmget>. See L<ftok>
+=back
+
=head1 SEE ALSO
L<IPC::Msg>, L<IPC::Semaphore>, L<ftok>
diff --git a/contrib/perl5/ext/IPC/SysV/SysV.xs b/contrib/perl5/ext/IPC/SysV/SysV.xs
index ecd5270..38062e0 100644
--- a/contrib/perl5/ext/IPC/SysV/SysV.xs
+++ b/contrib/perl5/ext/IPC/SysV/SysV.xs
@@ -19,7 +19,7 @@
# endif
# include <sys/shm.h>
# ifndef HAS_SHMAT_PROTOTYPE
- extern Shmat_t shmat _((int, char *, int));
+ extern Shmat_t shmat (int, char *, int);
# endif
# if defined(__sparc__) && (defined(__NetBSD__) || defined(__OpenBSD__))
# undef SHMLBA /* not static: determined at boot time */
@@ -30,7 +30,7 @@
/* Required to get 'struct pte' for SHMLBA on ULTRIX. */
#if defined(__ultrix) || defined(__ultrix__) || defined(ultrix)
-# include <machine/pte.h>
+#include <machine/pte.h>
#endif
/* Required in BSDI to get PAGE_SIZE definition for SHMLBA.
@@ -69,7 +69,7 @@ PPCODE:
sv = *av_fetch(list,1,TRUE); ds.msg_perm.gid = SvIV(sv);
sv = *av_fetch(list,4,TRUE); ds.msg_perm.mode = SvIV(sv);
sv = *av_fetch(list,6,TRUE); ds.msg_qbytes = SvIV(sv);
- ST(0) = sv_2mortal(newSVpv((char *)&ds,sizeof(ds)));
+ ST(0) = sv_2mortal(newSVpvn((char *)&ds,sizeof(ds)));
XSRETURN(1);
#else
croak("System V msgxxx is not implemented on this machine");
@@ -185,7 +185,7 @@ PPCODE:
ds.sem_otime = SvIV(*sv_ptr);
if((sv_ptr = av_fetch(list,7,TRUE)) && (sv = *sv_ptr))
ds.sem_nsems = SvIV(*sv_ptr);
- ST(0) = sv_2mortal(newSVpv((char *)&ds,sizeof(ds)));
+ ST(0) = sv_2mortal(newSVpvn((char *)&ds,sizeof(ds)));
XSRETURN(1);
#else
croak("System V semxxx is not implemented on this machine");
@@ -203,7 +203,7 @@ ftok(path, id)
key_t k = ftok(path, id);
ST(0) = k == (key_t) -1 ? &PL_sv_undef : sv_2mortal(newSViv(k));
#else
- DIE(no_func, "ftok");
+ DIE(PL_no_func, "ftok");
#endif
int
diff --git a/contrib/perl5/ext/IPC/SysV/hints/cygwin.pl b/contrib/perl5/ext/IPC/SysV/hints/cygwin.pl
new file mode 100644
index 0000000..e1a1dea
--- /dev/null
+++ b/contrib/perl5/ext/IPC/SysV/hints/cygwin.pl
@@ -0,0 +1,2 @@
+# SysV IPC is an optional Cygwin package
+$self->{LIBS} = ['-lcygipc']
diff --git a/contrib/perl5/ext/IPC/SysV/hints/next_3.pl b/contrib/perl5/ext/IPC/SysV/hints/next_3.pl
new file mode 100644
index 0000000..2290ac7
--- /dev/null
+++ b/contrib/perl5/ext/IPC/SysV/hints/next_3.pl
@@ -0,0 +1 @@
+$self->{CCFLAGS} = $Config{ccflags} . ' -D_POSIX_SOURCE' ;
diff --git a/contrib/perl5/ext/NDBM_File/NDBM_File.pm b/contrib/perl5/ext/NDBM_File/NDBM_File.pm
index ed4fe2b..f98669f 100644
--- a/contrib/perl5/ext/NDBM_File/NDBM_File.pm
+++ b/contrib/perl5/ext/NDBM_File/NDBM_File.pm
@@ -5,16 +5,14 @@ BEGIN {
use strict;
}
}
-use vars qw($VERSION @ISA);
require Tie::Hash;
-require DynaLoader;
+use XSLoader ();
-@ISA = qw(Tie::Hash DynaLoader);
+our @ISA = qw(Tie::Hash);
+our $VERSION = "1.03";
-$VERSION = "1.01";
-
-bootstrap NDBM_File $VERSION;
+XSLoader::load 'NDBM_File', $VERSION;
1;
@@ -35,6 +33,6 @@ NDBM_File - Tied access to ndbm files
=head1 DESCRIPTION
-See L<perlfunc/tie>
+See L<perlfunc/tie>, L<perldbmfilter>
=cut
diff --git a/contrib/perl5/ext/NDBM_File/NDBM_File.xs b/contrib/perl5/ext/NDBM_File/NDBM_File.xs
index d129a9c..49a1db5 100644
--- a/contrib/perl5/ext/NDBM_File/NDBM_File.xs
+++ b/contrib/perl5/ext/NDBM_File/NDBM_File.xs
@@ -3,39 +3,80 @@
#include "XSUB.h"
#include <ndbm.h>
-typedef DBM* NDBM_File;
-#define dbm_TIEHASH(dbtype,filename,flags,mode) dbm_open(filename,flags,mode)
-#define dbm_FETCH(db,key) dbm_fetch(db,key)
-#define dbm_STORE(db,key,value,flags) dbm_store(db,key,value,flags)
-#define dbm_DELETE(db,key) dbm_delete(db,key)
-#define dbm_FIRSTKEY(db) dbm_firstkey(db)
-#define dbm_NEXTKEY(db,key) dbm_nextkey(db)
+typedef struct {
+ DBM * dbp ;
+ SV * filter_fetch_key ;
+ SV * filter_store_key ;
+ SV * filter_fetch_value ;
+ SV * filter_store_value ;
+ int filtering ;
+ } NDBM_File_type;
-MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = dbm_
+typedef NDBM_File_type * NDBM_File ;
+typedef datum datum_key ;
+typedef datum datum_value ;
+
+#define ckFilter(arg,type,name) \
+ if (db->type) { \
+ SV * save_defsv ; \
+ /* printf("filtering %s\n", name) ;*/ \
+ if (db->filtering) \
+ croak("recursion detected in %s", name) ; \
+ db->filtering = TRUE ; \
+ save_defsv = newSVsv(DEFSV) ; \
+ sv_setsv(DEFSV, arg) ; \
+ PUSHMARK(sp) ; \
+ (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
+ sv_setsv(arg, DEFSV) ; \
+ sv_setsv(DEFSV, save_defsv) ; \
+ SvREFCNT_dec(save_defsv) ; \
+ db->filtering = FALSE ; \
+ /*printf("end of filtering %s\n", name) ;*/ \
+ }
+
+
+MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_
NDBM_File
-dbm_TIEHASH(dbtype, filename, flags, mode)
+ndbm_TIEHASH(dbtype, filename, flags, mode)
char * dbtype
char * filename
int flags
int mode
+ CODE:
+ {
+ DBM * dbp ;
+
+ RETVAL = NULL ;
+ if (dbp = dbm_open(filename, flags, mode)) {
+ RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
+ Zero(RETVAL, 1, NDBM_File_type) ;
+ RETVAL->dbp = dbp ;
+ }
+
+ }
+ OUTPUT:
+ RETVAL
void
-dbm_DESTROY(db)
+ndbm_DESTROY(db)
NDBM_File db
CODE:
- dbm_close(db);
+ dbm_close(db->dbp);
+ safefree(db);
-datum
-dbm_FETCH(db, key)
+#define ndbm_FETCH(db,key) dbm_fetch(db->dbp,key)
+datum_value
+ndbm_FETCH(db, key)
NDBM_File db
- datum key
+ datum_key key
+#define ndbm_STORE(db,key,value,flags) dbm_store(db->dbp,key,value,flags)
int
-dbm_STORE(db, key, value, flags = DBM_REPLACE)
+ndbm_STORE(db, key, value, flags = DBM_REPLACE)
NDBM_File db
- datum key
- datum value
+ datum_key key
+ datum_value value
int flags
CLEANUP:
if (RETVAL) {
@@ -43,28 +84,85 @@ dbm_STORE(db, key, value, flags = DBM_REPLACE)
croak("No write permission to ndbm file");
croak("ndbm store returned %d, errno %d, key \"%s\"",
RETVAL,errno,key.dptr);
- dbm_clearerr(db);
+ dbm_clearerr(db->dbp);
}
+#define ndbm_DELETE(db,key) dbm_delete(db->dbp,key)
int
-dbm_DELETE(db, key)
+ndbm_DELETE(db, key)
NDBM_File db
- datum key
+ datum_key key
-datum
-dbm_FIRSTKEY(db)
+#define ndbm_FIRSTKEY(db) dbm_firstkey(db->dbp)
+datum_key
+ndbm_FIRSTKEY(db)
NDBM_File db
-datum
-dbm_NEXTKEY(db, key)
+#define ndbm_NEXTKEY(db,key) dbm_nextkey(db->dbp)
+datum_key
+ndbm_NEXTKEY(db, key)
NDBM_File db
- datum key
+ datum_key key
+#define ndbm_error(db) dbm_error(db->dbp)
int
-dbm_error(db)
+ndbm_error(db)
NDBM_File db
+#define ndbm_clearerr(db) dbm_clearerr(db->dbp)
void
-dbm_clearerr(db)
+ndbm_clearerr(db)
+ NDBM_File db
+
+
+#define setFilter(type) \
+ { \
+ if (db->type) \
+ RETVAL = sv_mortalcopy(db->type) ; \
+ ST(0) = RETVAL ; \
+ if (db->type && (code == &PL_sv_undef)) { \
+ SvREFCNT_dec(db->type) ; \
+ db->type = NULL ; \
+ } \
+ else if (code) { \
+ if (db->type) \
+ sv_setsv(db->type, code) ; \
+ else \
+ db->type = newSVsv(code) ; \
+ } \
+ }
+
+
+
+SV *
+filter_fetch_key(db, code)
+ NDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_key) ;
+
+SV *
+filter_store_key(db, code)
+ NDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_key) ;
+
+SV *
+filter_fetch_value(db, code)
+ NDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_value) ;
+
+SV *
+filter_store_value(db, code)
NDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_value) ;
diff --git a/contrib/perl5/ext/NDBM_File/hints/cygwin.pl b/contrib/perl5/ext/NDBM_File/hints/cygwin.pl
new file mode 100644
index 0000000..0a4b762
--- /dev/null
+++ b/contrib/perl5/ext/NDBM_File/hints/cygwin.pl
@@ -0,0 +1,2 @@
+# uses GDBM ndbm compatibility feature
+$self->{LIBS} = ['-lgdbm'];
diff --git a/contrib/perl5/ext/NDBM_File/hints/sco.pl b/contrib/perl5/ext/NDBM_File/hints/sco.pl
new file mode 100644
index 0000000..f551578
--- /dev/null
+++ b/contrib/perl5/ext/NDBM_File/hints/sco.pl
@@ -0,0 +1,4 @@
+# SCO ODT 3.2v4.2 has a -ldbm library that is missing dbmclose.
+# This system should have a complete library installed as -ldbm.nfs which
+# should be used instead (Probably need the networking product add-on)
+$self->{LIBS} = ['-lndbm',-e "/usr/lib/libdbm.nfs.a"?'-ldbm.nfs':'-ldbm'];
diff --git a/contrib/perl5/ext/NDBM_File/typemap b/contrib/perl5/ext/NDBM_File/typemap
index 317a8f3..eeb5d59 100644
--- a/contrib/perl5/ext/NDBM_File/typemap
+++ b/contrib/perl5/ext/NDBM_File/typemap
@@ -2,7 +2,8 @@
#################################### DBM SECTION
#
-datum T_DATUM
+datum_key T_DATUM_K
+datum_value T_DATUM_V
gdatum T_GDATUM
NDBM_File T_PTROBJ
GDBM_File T_PTROBJ
@@ -13,14 +14,23 @@ DBZ_File T_PTROBJ
FATALFUNC T_OPAQUEPTR
INPUT
-T_DATUM
+T_DATUM_K
+ ckFilter($arg, filter_store_key, \"filter_store_key\");
+ $var.dptr = SvPV($arg, PL_na);
+ $var.dsize = (int)PL_na;
+T_DATUM_V
+ ckFilter($arg, filter_store_value, \"filter_store_value\");
$var.dptr = SvPV($arg, PL_na);
$var.dsize = (int)PL_na;
T_GDATUM
UNIMPLEMENTED
OUTPUT
-T_DATUM
+T_DATUM_K
+ sv_setpvn($arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_key,\"filter_fetch_key\");
+T_DATUM_V
sv_setpvn($arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_value,\"filter_fetch_value\");
T_GDATUM
sv_usepvn($arg, $var.dptr, $var.dsize);
T_PTROBJ
diff --git a/contrib/perl5/ext/ODBM_File/ODBM_File.pm b/contrib/perl5/ext/ODBM_File/ODBM_File.pm
index 923640f..57fe4c3 100644
--- a/contrib/perl5/ext/ODBM_File/ODBM_File.pm
+++ b/contrib/perl5/ext/ODBM_File/ODBM_File.pm
@@ -1,16 +1,14 @@
package ODBM_File;
use strict;
-use vars qw($VERSION @ISA);
require Tie::Hash;
-require DynaLoader;
+use XSLoader ();
-@ISA = qw(Tie::Hash DynaLoader);
+our @ISA = qw(Tie::Hash);
+our $VERSION = "1.02";
-$VERSION = "1.00";
-
-bootstrap ODBM_File $VERSION;
+XSLoader::load 'ODBM_File', $VERSION;
1;
@@ -30,6 +28,6 @@ ODBM_File - Tied access to odbm files
=head1 DESCRIPTION
-See L<perlfunc/tie>
+See L<perlfunc/tie>, L<perldbmfilter>
=cut
diff --git a/contrib/perl5/ext/ODBM_File/ODBM_File.xs b/contrib/perl5/ext/ODBM_File/ODBM_File.xs
index 892c038..150f2ef 100644
--- a/contrib/perl5/ext/ODBM_File/ODBM_File.xs
+++ b/contrib/perl5/ext/ODBM_File/ODBM_File.xs
@@ -2,9 +2,6 @@
#include "perl.h"
#include "XSUB.h"
-#ifdef NULL
-#undef NULL /* XXX Why? */
-#endif
#ifdef I_DBM
# include <dbm.h>
#else
@@ -30,7 +27,37 @@
#include <fcntl.h>
-typedef void* ODBM_File;
+typedef struct {
+ void * dbp ;
+ SV * filter_fetch_key ;
+ SV * filter_store_key ;
+ SV * filter_fetch_value ;
+ SV * filter_store_value ;
+ int filtering ;
+ } ODBM_File_type;
+
+typedef ODBM_File_type * ODBM_File ;
+typedef datum datum_key ;
+typedef datum datum_value ;
+
+#define ckFilter(arg,type,name) \
+ if (db->type) { \
+ SV * save_defsv ; \
+ /* printf("filtering %s\n", name) ;*/ \
+ if (db->filtering) \
+ croak("recursion detected in %s", name) ; \
+ db->filtering = TRUE ; \
+ save_defsv = newSVsv(DEFSV) ; \
+ sv_setsv(DEFSV, arg) ; \
+ PUSHMARK(sp) ; \
+ (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
+ sv_setsv(arg, DEFSV) ; \
+ sv_setsv(DEFSV, save_defsv) ; \
+ SvREFCNT_dec(save_defsv) ; \
+ db->filtering = FALSE ; \
+ /*printf("end of filtering %s\n", name) ;*/ \
+ }
+
#define odbm_FETCH(db,key) fetch(key)
#define odbm_STORE(db,key,value,flags) store(key,value)
@@ -46,10 +73,6 @@ static int dbmrefcnt;
MODULE = ODBM_File PACKAGE = ODBM_File PREFIX = odbm_
-#ifndef NULL
-# define NULL 0
-#endif
-
ODBM_File
odbm_TIEHASH(dbtype, filename, flags, mode)
char * dbtype
@@ -59,6 +82,7 @@ odbm_TIEHASH(dbtype, filename, flags, mode)
CODE:
{
char *tmpbuf;
+ void * dbp ;
if (dbmrefcnt++)
croak("Old dbm can only open one database");
New(0, tmpbuf, strlen(filename) + 5, char);
@@ -75,7 +99,10 @@ odbm_TIEHASH(dbtype, filename, flags, mode)
else
croak("ODBM_FILE: Can't open %s", filename);
}
- RETVAL = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
+ dbp = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
+ RETVAL = (ODBM_File)safemalloc(sizeof(ODBM_File_type)) ;
+ Zero(RETVAL, 1, ODBM_File_type) ;
+ RETVAL->dbp = dbp ;
ST(0) = sv_mortalcopy(&PL_sv_undef);
sv_setptrobj(ST(0), RETVAL, dbtype);
}
@@ -86,17 +113,18 @@ DESTROY(db)
CODE:
dbmrefcnt--;
dbmclose();
+ safefree(db);
-datum
+datum_value
odbm_FETCH(db, key)
ODBM_File db
- datum key
+ datum_key key
int
odbm_STORE(db, key, value, flags = DBM_REPLACE)
ODBM_File db
- datum key
- datum value
+ datum_key key
+ datum_value value
int flags
CLEANUP:
if (RETVAL) {
@@ -109,14 +137,66 @@ odbm_STORE(db, key, value, flags = DBM_REPLACE)
int
odbm_DELETE(db, key)
ODBM_File db
- datum key
+ datum_key key
-datum
+datum_key
odbm_FIRSTKEY(db)
ODBM_File db
-datum
+datum_key
odbm_NEXTKEY(db, key)
ODBM_File db
- datum key
+ datum_key key
+
+
+#define setFilter(type) \
+ { \
+ if (db->type) \
+ RETVAL = sv_mortalcopy(db->type) ; \
+ ST(0) = RETVAL ; \
+ if (db->type && (code == &PL_sv_undef)) { \
+ SvREFCNT_dec(db->type) ; \
+ db->type = Nullsv ; \
+ } \
+ else if (code) { \
+ if (db->type) \
+ sv_setsv(db->type, code) ; \
+ else \
+ db->type = newSVsv(code) ; \
+ } \
+ }
+
+
+
+SV *
+filter_fetch_key(db, code)
+ ODBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_key) ;
+
+SV *
+filter_store_key(db, code)
+ ODBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_key) ;
+
+SV *
+filter_fetch_value(db, code)
+ ODBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_value) ;
+
+SV *
+filter_store_value(db, code)
+ ODBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_value) ;
diff --git a/contrib/perl5/ext/ODBM_File/hints/cygwin.pl b/contrib/perl5/ext/ODBM_File/hints/cygwin.pl
new file mode 100644
index 0000000..a0d33c8
--- /dev/null
+++ b/contrib/perl5/ext/ODBM_File/hints/cygwin.pl
@@ -0,0 +1,2 @@
+# uses GDBM dbm compatibility feature
+$self->{LIBS} = ['-lgdbm'];
diff --git a/contrib/perl5/ext/ODBM_File/hints/sco.pl b/contrib/perl5/ext/ODBM_File/hints/sco.pl
index 4664f2b..f551578 100644
--- a/contrib/perl5/ext/ODBM_File/hints/sco.pl
+++ b/contrib/perl5/ext/ODBM_File/hints/sco.pl
@@ -1,4 +1,4 @@
-# Some versions of SCO contain a broken -ldbm library that is missing
-# dbmclose. Some of those might have a fixed library installed as
-# -ldbm.nfs.
-$self->{LIBS} = ['-ldbm.nfs', '-ldbm'];
+# SCO ODT 3.2v4.2 has a -ldbm library that is missing dbmclose.
+# This system should have a complete library installed as -ldbm.nfs which
+# should be used instead (Probably need the networking product add-on)
+$self->{LIBS} = ['-lndbm',-e "/usr/lib/libdbm.nfs.a"?'-ldbm.nfs':'-ldbm'];
diff --git a/contrib/perl5/ext/ODBM_File/typemap b/contrib/perl5/ext/ODBM_File/typemap
index 5e12e73..7c23815 100644
--- a/contrib/perl5/ext/ODBM_File/typemap
+++ b/contrib/perl5/ext/ODBM_File/typemap
@@ -2,7 +2,8 @@
#################################### DBM SECTION
#
-datum T_DATUM
+datum_key T_DATUM_K
+datum_value T_DATUM_V
gdatum T_GDATUM
NDBM_File T_PTROBJ
GDBM_File T_PTROBJ
@@ -13,13 +14,22 @@ DBZ_File T_PTROBJ
FATALFUNC T_OPAQUEPTR
INPUT
-T_DATUM
+T_DATUM_K
+ ckFilter($arg, filter_store_key, \"filter_store_key\");
+ $var.dptr = SvPV($arg, PL_na);
+ $var.dsize = (int)PL_na;
+T_DATUM_V
+ ckFilter($arg, filter_store_value, \"filter_store_value\");
$var.dptr = SvPV($arg, PL_na);
$var.dsize = (int)PL_na;
T_GDATUM
UNIMPLEMENTED
OUTPUT
-T_DATUM
+T_DATUM_K
+ sv_setpvn($arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_key,\"filter_fetch_key\");
+T_DATUM_V
sv_setpvn($arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_value,\"filter_fetch_value\");
T_GDATUM
sv_usepvn($arg, $var.dptr, $var.dsize);
diff --git a/contrib/perl5/ext/Opcode/Opcode.pm b/contrib/perl5/ext/Opcode/Opcode.pm
index 0ee6be6..9338d39 100644
--- a/contrib/perl5/ext/Opcode/Opcode.pm
+++ b/contrib/perl5/ext/Opcode/Opcode.pm
@@ -1,8 +1,8 @@
package Opcode;
-require 5.002;
+require 5.005_64;
-use vars qw($VERSION $XS_VERSION @ISA @EXPORT_OK);
+our($VERSION, $XS_VERSION, @ISA, @EXPORT_OK);
$VERSION = "1.04";
$XS_VERSION = "1.03";
@@ -10,8 +10,8 @@ $XS_VERSION = "1.03";
use strict;
use Carp;
use Exporter ();
-use DynaLoader ();
-@ISA = qw(Exporter DynaLoader);
+use XSLoader ();
+@ISA = qw(Exporter);
BEGIN {
@EXPORT_OK = qw(
@@ -28,7 +28,7 @@ sub opset_to_hex ($);
sub opdump (;$);
use subs @EXPORT_OK;
-bootstrap Opcode $XS_VERSION;
+XSLoader::load 'Opcode', $XS_VERSION;
_init_optags();
@@ -130,7 +130,7 @@ Your mileage will vary. If in any doubt B<do not use it>.
=head1 Operator Names and Operator Lists
The canonical list of operator names is the contents of the array
-op_name defined and initialised in file F<opcode.h> of the Perl
+PL_op_name defined and initialised in file F<opcode.h> of the Perl
source distribution (and installed into the perl library).
Each operator has both a terse name (its opname) and a more verbose or
@@ -332,11 +332,11 @@ invert_opset function.
cond_expr flip flop andassign orassign and or xor
- warn die lineseq nextstate unstack scope enter leave
+ warn die lineseq nextstate scope enter leave setstate
rv2cv anoncode prototype
- entersub leavesub return method -- XXX loops via recursion?
+ entersub leavesub leavesublv return method method_named -- XXX loops via recursion?
leaveeval -- needed for Safe to operate, is safe without entereval
@@ -365,7 +365,7 @@ used to implement a resource attack (e.g., consume all available CPU time).
grepstart grepwhile
mapstart mapwhile
enteriter iter
- enterloop leaveloop
+ enterloop leaveloop unstack
last next redo
goto
diff --git a/contrib/perl5/ext/Opcode/Opcode.xs b/contrib/perl5/ext/Opcode/Opcode.xs
index e93b900..581cbc9 100644
--- a/contrib/perl5/ext/Opcode/Opcode.xs
+++ b/contrib/perl5/ext/Opcode/Opcode.xs
@@ -1,3 +1,4 @@
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
@@ -11,11 +12,11 @@ static SV *opset_all; /* mask with all bits set */
static IV opset_len; /* length of opmasks in bytes */
static int opcode_debug = 0;
-static SV *new_opset _((SV *old_opset));
-static int verify_opset _((SV *opset, int fatal));
-static void set_opset_bits _((char *bitmap, SV *bitspec, int on, char *opname));
-static void put_op_bitspec _((char *optag, STRLEN len, SV *opset));
-static SV *get_op_bitspec _((char *opname, STRLEN len, int fatal));
+static SV *new_opset (pTHX_ SV *old_opset);
+static int verify_opset (pTHX_ SV *opset, int fatal);
+static void set_opset_bits (pTHX_ char *bitmap, SV *bitspec, int on, char *opname);
+static void put_op_bitspec (pTHX_ char *optag, STRLEN len, SV *opset);
+static SV *get_op_bitspec (pTHX_ char *opname, STRLEN len, int fatal);
/* Initialise our private op_named_bits HV.
@@ -27,7 +28,7 @@ static SV *get_op_bitspec _((char *opname, STRLEN len, int fatal));
*/
static void
-op_names_init(void)
+op_names_init(pTHX)
{
int i;
STRLEN len;
@@ -43,16 +44,16 @@ op_names_init(void)
hv_store(op_named_bits, op_names[i], strlen(op_names[i]), sv, 0);
}
- put_op_bitspec(":none",0, sv_2mortal(new_opset(Nullsv)));
+ put_op_bitspec(aTHX_ ":none",0, sv_2mortal(new_opset(aTHX_ Nullsv)));
- opset_all = new_opset(Nullsv);
+ opset_all = new_opset(aTHX_ Nullsv);
bitmap = SvPV(opset_all, len);
i = len-1; /* deal with last byte specially, see below */
while(i-- > 0)
bitmap[i] = 0xFF;
/* Take care to set the right number of bits in the last byte */
bitmap[len-1] = (PL_maxo & 0x07) ? ~(0xFF << (PL_maxo & 0x07)) : 0xFF;
- put_op_bitspec(":all",0, opset_all); /* don't mortalise */
+ put_op_bitspec(aTHX_ ":all",0, opset_all); /* don't mortalise */
}
@@ -62,10 +63,10 @@ op_names_init(void)
*/
static void
-put_op_bitspec(char *optag, STRLEN len, SV *mask)
+put_op_bitspec(pTHX_ char *optag, STRLEN len, SV *mask)
{
SV **svp;
- verify_opset(mask,1);
+ verify_opset(aTHX_ mask,1);
if (!len)
len = strlen(optag);
svp = hv_fetch(op_named_bits, optag, len, 1);
@@ -83,7 +84,7 @@ put_op_bitspec(char *optag, STRLEN len, SV *mask)
*/
static SV *
-get_op_bitspec(char *opname, STRLEN len, int fatal)
+get_op_bitspec(pTHX_ char *opname, STRLEN len, int fatal)
{
SV **svp;
if (!len)
@@ -106,11 +107,11 @@ get_op_bitspec(char *opname, STRLEN len, int fatal)
static SV *
-new_opset(SV *old_opset)
+new_opset(pTHX_ SV *old_opset)
{
SV *opset;
if (old_opset) {
- verify_opset(old_opset,1);
+ verify_opset(aTHX_ old_opset,1);
opset = newSVsv(old_opset);
}
else {
@@ -125,7 +126,7 @@ new_opset(SV *old_opset)
static int
-verify_opset(SV *opset, int fatal)
+verify_opset(pTHX_ SV *opset, int fatal)
{
char *err = Nullch;
if (!SvOK(opset)) err = "undefined";
@@ -139,7 +140,7 @@ verify_opset(SV *opset, int fatal)
static void
-set_opset_bits(char *bitmap, SV *bitspec, int on, char *opname)
+set_opset_bits(pTHX_ char *bitmap, SV *bitspec, int on, char *opname)
{
if (SvIOK(bitspec)) {
int myopcode = SvIV(bitspec);
@@ -173,14 +174,14 @@ set_opset_bits(char *bitmap, SV *bitspec, int on, char *opname)
static void
-opmask_add(SV *opset) /* THE ONLY FUNCTION TO EDIT PL_op_mask ITSELF */
+opmask_add(pTHX_ SV *opset) /* THE ONLY FUNCTION TO EDIT PL_op_mask ITSELF */
{
int i,j;
char *bitmask;
STRLEN len;
int myopcode = 0;
- verify_opset(opset,1); /* croaks on bad opset */
+ verify_opset(aTHX_ opset,1); /* croaks on bad opset */
if (!PL_op_mask) /* caller must ensure PL_op_mask exists */
croak("Can't add to uninitialised PL_op_mask");
@@ -200,23 +201,23 @@ opmask_add(SV *opset) /* THE ONLY FUNCTION TO EDIT PL_op_mask ITSELF */
}
static void
-opmask_addlocal(SV *opset, char *op_mask_buf) /* Localise PL_op_mask then opmask_add() */
+opmask_addlocal(pTHX_ SV *opset, char *op_mask_buf) /* Localise PL_op_mask then opmask_add() */
{
char *orig_op_mask = PL_op_mask;
- SAVEPPTR(PL_op_mask);
+ SAVEVPTR(PL_op_mask);
#if !defined(PERL_OBJECT)
/* XXX casting to an ordinary function ptr from a member function ptr
* is disallowed by Borland
*/
if (opcode_debug >= 2)
- SAVEDESTRUCTOR((void(CPERLscope(*))_((void*)))warn,"PL_op_mask restored");
+ SAVEDESTRUCTOR((void(*)(void*))Perl_warn,"PL_op_mask restored");
#endif
PL_op_mask = &op_mask_buf[0];
if (orig_op_mask)
Copy(orig_op_mask, PL_op_mask, PL_maxo, char);
else
Zero(PL_op_mask, PL_maxo, char);
- opmask_add(opset);
+ opmask_add(aTHX_ opset);
}
@@ -230,7 +231,7 @@ BOOT:
opset_len = (PL_maxo + 7) / 8;
if (opcode_debug >= 1)
warn("opset_len %ld\n", (long)opset_len);
- op_names_init();
+ op_names_init(aTHX);
void
@@ -244,7 +245,7 @@ PPCODE:
ENTER;
- opmask_addlocal(mask, op_mask_buf);
+ opmask_addlocal(aTHX_ mask, op_mask_buf);
save_aptr(&PL_endav);
PL_endav = (AV*)sv_2mortal((SV*)newAV()); /* ignore END blocks for now */
@@ -252,6 +253,8 @@ PPCODE:
save_hptr(&PL_defstash); /* save current default stack */
/* the assignment to global defstash changes our sense of 'main' */
PL_defstash = gv_stashpv(Package, GV_ADDWARN); /* should exist already */
+ save_hptr(&PL_curstash);
+ PL_curstash = PL_defstash;
/* defstash must itself contain a main:: so we'll add that now */
/* take care with the ref counts (was cause of long standing bug) */
@@ -270,7 +273,10 @@ int
verify_opset(opset, fatal = 0)
SV *opset
int fatal
-
+CODE:
+ RETVAL = verify_opset(aTHX_ opset,fatal);
+OUTPUT:
+ RETVAL
void
invert_opset(opset)
@@ -279,7 +285,7 @@ CODE:
{
char *bitmap;
STRLEN len = opset_len;
- opset = sv_2mortal(new_opset(opset)); /* verify and clone opset */
+ opset = sv_2mortal(new_opset(aTHX_ opset)); /* verify and clone opset */
bitmap = SvPVX(opset);
while(len-- > 0)
bitmap[len] = ~bitmap[len];
@@ -300,7 +306,7 @@ PPCODE:
int i, j, myopcode;
char *bitmap = SvPV(opset, len);
char **names = (desc) ? get_op_descs() : get_op_names();
- verify_opset(opset,1);
+ verify_opset(aTHX_ opset,1);
for (myopcode=0, i=0; i < opset_len; i++) {
U16 bits = bitmap[i];
for (j=0; j < 8 && myopcode < PL_maxo; j++, myopcode++) {
@@ -318,21 +324,21 @@ CODE:
SV *bitspec, *opset;
char *bitmap;
STRLEN len, on;
- opset = sv_2mortal(new_opset(Nullsv));
+ opset = sv_2mortal(new_opset(aTHX_ Nullsv));
bitmap = SvPVX(opset);
for (i = 0; i < items; i++) {
char *opname;
on = 1;
- if (verify_opset(ST(i),0)) {
+ if (verify_opset(aTHX_ ST(i),0)) {
opname = "(opset)";
bitspec = ST(i);
}
else {
opname = SvPV(ST(i), len);
if (*opname == '!') { on=0; ++opname;--len; }
- bitspec = get_op_bitspec(opname, len, 1);
+ bitspec = get_op_bitspec(aTHX_ opname, len, 1);
}
- set_opset_bits(bitmap, bitspec, on, opname);
+ set_opset_bits(aTHX_ bitmap, bitspec, on, opname);
}
ST(0) = opset;
@@ -357,13 +363,13 @@ CODE:
croak("Not a Safe object");
mask = *hv_fetch((HV*)SvRV(safe), "Mask",4, 1);
if (ONLY_THESE) /* *_only = new mask, else edit current */
- sv_setsv(mask, sv_2mortal(new_opset(PERMITING ? opset_all : Nullsv)));
+ sv_setsv(mask, sv_2mortal(new_opset(aTHX_ PERMITING ? opset_all : Nullsv)));
else
- verify_opset(mask,1); /* croaks */
+ verify_opset(aTHX_ mask,1); /* croaks */
bitmap = SvPVX(mask);
for (i = 1; i < items; i++) {
on = PERMITING ? 0 : 1; /* deny = mask bit on */
- if (verify_opset(ST(i),0)) { /* it's a valid mask */
+ if (verify_opset(aTHX_ ST(i),0)) { /* it's a valid mask */
opname = "(opset)";
bitspec = ST(i);
}
@@ -371,9 +377,9 @@ CODE:
opname = SvPV(ST(i), len);
/* invert if op has ! prefix (only one allowed) */
if (*opname == '!') { on = !on; ++opname; --len; }
- bitspec = get_op_bitspec(opname, len, 1); /* croaks */
+ bitspec = get_op_bitspec(aTHX_ opname, len, 1); /* croaks */
}
- set_opset_bits(bitmap, bitspec, on, opname);
+ set_opset_bits(aTHX_ bitmap, bitspec, on, opname);
}
ST(0) = &PL_sv_yes;
@@ -388,10 +394,10 @@ PPCODE:
char **op_desc = get_op_descs();
/* copy args to a scratch area since we may push output values onto */
/* the stack faster than we read values off it if masks are used. */
- args = (SV**)SvPVX(sv_2mortal(newSVpv((char*)&ST(0), items*sizeof(SV*))));
+ args = (SV**)SvPVX(sv_2mortal(newSVpvn((char*)&ST(0), items*sizeof(SV*))));
for (i = 0; i < items; i++) {
char *opname = SvPV(args[i], len);
- SV *bitspec = get_op_bitspec(opname, len, 1);
+ SV *bitspec = get_op_bitspec(aTHX_ opname, len, 1);
if (SvIOK(bitspec)) {
myopcode = SvIV(bitspec);
if (myopcode < 0 || myopcode >= PL_maxo)
@@ -423,19 +429,19 @@ define_optag(optagsv, mask)
CODE:
STRLEN len;
char *optag = SvPV(optagsv, len);
- put_op_bitspec(optag, len, mask); /* croaks */
+ put_op_bitspec(aTHX_ optag, len, mask); /* croaks */
ST(0) = &PL_sv_yes;
void
empty_opset()
CODE:
- ST(0) = sv_2mortal(new_opset(Nullsv));
+ ST(0) = sv_2mortal(new_opset(aTHX_ Nullsv));
void
full_opset()
CODE:
- ST(0) = sv_2mortal(new_opset(opset_all));
+ ST(0) = sv_2mortal(new_opset(aTHX_ opset_all));
void
opmask_add(opset)
@@ -443,6 +449,8 @@ opmask_add(opset)
PREINIT:
if (!PL_op_mask)
Newz(0, PL_op_mask, PL_maxo, char);
+CODE:
+ opmask_add(aTHX_ opset);
void
opcodes()
@@ -457,7 +465,7 @@ PPCODE:
void
opmask()
CODE:
- ST(0) = sv_2mortal(new_opset(Nullsv));
+ ST(0) = sv_2mortal(new_opset(aTHX_ Nullsv));
if (PL_op_mask) {
char *bitmap = SvPVX(ST(0));
int myopcode;
diff --git a/contrib/perl5/ext/Opcode/Safe.pm b/contrib/perl5/ext/Opcode/Safe.pm
index 2d09c2e..7e1d6a3 100644
--- a/contrib/perl5/ext/Opcode/Safe.pm
+++ b/contrib/perl5/ext/Opcode/Safe.pm
@@ -2,9 +2,8 @@ package Safe;
use 5.003_11;
use strict;
-use vars qw($VERSION);
-$VERSION = "2.06";
+our $VERSION = "2.06";
use Carp;
@@ -235,7 +234,7 @@ sub rdo {
1;
-__DATA__
+__END__
=head1 NAME
diff --git a/contrib/perl5/ext/POSIX/Makefile.PL b/contrib/perl5/ext/POSIX/Makefile.PL
index d379fdb..55c5c1f 100644
--- a/contrib/perl5/ext/POSIX/Makefile.PL
+++ b/contrib/perl5/ext/POSIX/Makefile.PL
@@ -1,7 +1,17 @@
use ExtUtils::MakeMaker;
+use Config;
+my @libs;
+if ($^O ne 'MSWin32') {
+ if ($Config{archname} =~ /RM\d\d\d-svr4/) {
+ @libs = ('LIBS' => ["-lm -lc -lposix -lcposix"]);
+ }
+ else {
+ @libs = ('LIBS' => ["-lm -lposix -lcposix"]);
+ }
+}
WriteMakefile(
NAME => 'POSIX',
- ($^O eq 'MSWin32' ? () : (LIBS => ["-lm -lposix -lcposix"])),
+ @libs,
MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'POSIX.pm',
diff --git a/contrib/perl5/ext/POSIX/POSIX.pm b/contrib/perl5/ext/POSIX/POSIX.pm
index 84298cb..9416f70 100644
--- a/contrib/perl5/ext/POSIX/POSIX.pm
+++ b/contrib/perl5/ext/POSIX/POSIX.pm
@@ -1,203 +1,34 @@
package POSIX;
-use vars qw($VERSION @ISA %EXPORT_TAGS @EXPORT_OK $AUTOLOAD);
+our(@ISA, %EXPORT_TAGS, @EXPORT_OK, $AUTOLOAD) = ();
-use Carp;
use AutoLoader;
-require Config;
-use Symbol;
-require Exporter;
-require DynaLoader;
-@ISA = qw(Exporter DynaLoader);
-
-$VERSION = "1.02" ;
-
-%EXPORT_TAGS = (
-
- assert_h => [qw(assert NDEBUG)],
-
- ctype_h => [qw(isalnum isalpha iscntrl isdigit isgraph islower
- isprint ispunct isspace isupper isxdigit tolower toupper)],
-
- dirent_h => [qw()],
-
- errno_h => [qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
- EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
- ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
- EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
- EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
- EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
- ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
- ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
- ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
- EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
- ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
- ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
- EUSERS EWOULDBLOCK EXDEV errno)],
-
- fcntl_h => [qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK
- F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK
- O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK
- O_RDONLY O_RDWR O_TRUNC O_WRONLY
- creat
- SEEK_CUR SEEK_END SEEK_SET
- S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
- S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID
- S_IWGRP S_IWOTH S_IWUSR)],
-
- float_h => [qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG
- DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP
- DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP
- FLT_DIG FLT_EPSILON FLT_MANT_DIG
- FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP
- FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP
- FLT_RADIX FLT_ROUNDS
- LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG
- LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP
- LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)],
-
- grp_h => [qw()],
-
- limits_h => [qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX
- INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON
- MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX
- PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN
- SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX
- ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX
- _POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT
- _POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX
- _POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX
- _POSIX_STREAM_MAX _POSIX_TZNAME_MAX)],
+use XSLoader ();
- locale_h => [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC
- LC_TIME NULL localeconv setlocale)],
-
- math_h => [qw(HUGE_VAL acos asin atan ceil cosh fabs floor fmod
- frexp ldexp log10 modf pow sinh tan tanh)],
-
- pwd_h => [qw()],
-
- setjmp_h => [qw(longjmp setjmp siglongjmp sigsetjmp)],
-
- signal_h => [qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK
- SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM
- SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL
- SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN
- SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR
- SIG_IGN SIG_SETMASK SIG_UNBLOCK raise sigaction signal
- sigpending sigprocmask sigsuspend)],
-
- stdarg_h => [qw()],
-
- stddef_h => [qw(NULL offsetof)],
-
- stdio_h => [qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid
- L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET
- STREAM_MAX TMP_MAX stderr stdin stdout
- clearerr fclose fdopen feof ferror fflush fgetc fgetpos
- fgets fopen fprintf fputc fputs fread freopen
- fscanf fseek fsetpos ftell fwrite getchar gets
- perror putc putchar puts remove rewind
- scanf setbuf setvbuf sscanf tmpfile tmpnam
- ungetc vfprintf vprintf vsprintf)],
-
- stdlib_h => [qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX
- abort atexit atof atoi atol bsearch calloc div
- free getenv labs ldiv malloc mblen mbstowcs mbtowc
- qsort realloc strtod strtol strtoul wcstombs wctomb)],
-
- string_h => [qw(NULL memchr memcmp memcpy memmove memset strcat
- strchr strcmp strcoll strcpy strcspn strerror strlen
- strncat strncmp strncpy strpbrk strrchr strspn strstr
- strtok strxfrm)],
-
- sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
- S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG
- S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR
- fstat mkfifo)],
-
- sys_times_h => [qw()],
-
- sys_types_h => [qw()],
-
- sys_utsname_h => [qw(uname)],
-
- sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED
- WNOHANG WSTOPSIG WTERMSIG WUNTRACED)],
-
- termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400
- B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL
- CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK
- ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR
- INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST
- PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION
- TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW
- TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART
- VSTOP VSUSP VTIME
- cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain
- tcflow tcflush tcgetattr tcsendbreak tcsetattr )],
-
- time_h => [qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime
- difftime mktime strftime tzset tzname)],
-
- unistd_h => [qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET
- STRERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK
- _PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON
- _PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX
- _PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED
- _POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS
- _POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX
- _SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL
- _SC_NGROUPS_MAX _SC_OPEN_MAX _SC_SAVED_IDS
- _SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION
- _exit access ctermid cuserid
- dup2 dup execl execle execlp execv execve execvp
- fpathconf getcwd getegid geteuid getgid getgroups
- getpid getuid isatty lseek pathconf pause setgid setpgid
- setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)],
-
- utime_h => [qw()],
-
-);
-
-Exporter::export_tags();
-
-@EXPORT_OK = qw(
- closedir opendir readdir rewinddir
- fcntl open
- getgrgid getgrnam
- atan2 cos exp log sin sqrt
- getpwnam getpwuid
- kill
- fileno getc printf rename sprintf
- abs exit rand srand system
- chmod mkdir stat umask
- times
- wait waitpid
- gmtime localtime time
- alarm chdir chown close fork getlogin getppid getpgrp link
- pipe read rmdir sleep unlink write
- utime
- nice
-);
+our $VERSION = "1.03" ;
# Grandfather old foo_h form to new :foo_h form
+my $loaded;
+
sub import {
+ load_imports() unless $loaded++;
my $this = shift;
my @list = map { m/^\w+_h$/ ? ":$_" : $_ } @_;
local $Exporter::ExportLevel = 1;
Exporter::import($this,@list);
}
+sub croak { require Carp; goto &Carp::croak }
-bootstrap POSIX $VERSION;
+XSLoader::load 'POSIX', $VERSION;
my $EINVAL = constant("EINVAL", 0);
my $EAGAIN = constant("EAGAIN", 0);
sub AUTOLOAD {
if ($AUTOLOAD =~ /::(_?[a-z])/) {
+ # require AutoLoader;
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD
}
@@ -273,7 +104,7 @@ sub closedir {
sub opendir {
usage "opendir(directory)" if @_ != 1;
- my $dirhandle = gensym;
+ my $dirhandle;
CORE::opendir($dirhandle, $_[0])
? $dirhandle
: undef;
@@ -932,3 +763,178 @@ sub utime {
CORE::utime($_[1], $_[2], $_[0]);
}
+sub load_imports {
+%EXPORT_TAGS = (
+
+ assert_h => [qw(assert NDEBUG)],
+
+ ctype_h => [qw(isalnum isalpha iscntrl isdigit isgraph islower
+ isprint ispunct isspace isupper isxdigit tolower toupper)],
+
+ dirent_h => [qw()],
+
+ errno_h => [qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
+ EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
+ ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
+ EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
+ EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
+ EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
+ ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
+ ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
+ ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
+ EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
+ ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
+ ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
+ EUSERS EWOULDBLOCK EXDEV errno)],
+
+ fcntl_h => [qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK
+ F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK
+ O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK
+ O_RDONLY O_RDWR O_TRUNC O_WRONLY
+ creat
+ SEEK_CUR SEEK_END SEEK_SET
+ S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
+ S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID
+ S_IWGRP S_IWOTH S_IWUSR)],
+
+ float_h => [qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG
+ DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP
+ DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP
+ FLT_DIG FLT_EPSILON FLT_MANT_DIG
+ FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP
+ FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP
+ FLT_RADIX FLT_ROUNDS
+ LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG
+ LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP
+ LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)],
+
+ grp_h => [qw()],
+
+ limits_h => [qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX
+ INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON
+ MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX
+ PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN
+ SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX
+ ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX
+ _POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT
+ _POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX
+ _POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX
+ _POSIX_STREAM_MAX _POSIX_TZNAME_MAX)],
+
+ locale_h => [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC
+ LC_TIME NULL localeconv setlocale)],
+
+ math_h => [qw(HUGE_VAL acos asin atan ceil cosh fabs floor fmod
+ frexp ldexp log10 modf pow sinh tan tanh)],
+
+ pwd_h => [qw()],
+
+ setjmp_h => [qw(longjmp setjmp siglongjmp sigsetjmp)],
+
+ signal_h => [qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK
+ SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM
+ SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL
+ SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN
+ SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR
+ SIG_IGN SIG_SETMASK SIG_UNBLOCK raise sigaction signal
+ sigpending sigprocmask sigsuspend)],
+
+ stdarg_h => [qw()],
+
+ stddef_h => [qw(NULL offsetof)],
+
+ stdio_h => [qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid
+ L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET
+ STREAM_MAX TMP_MAX stderr stdin stdout
+ clearerr fclose fdopen feof ferror fflush fgetc fgetpos
+ fgets fopen fprintf fputc fputs fread freopen
+ fscanf fseek fsetpos ftell fwrite getchar gets
+ perror putc putchar puts remove rewind
+ scanf setbuf setvbuf sscanf tmpfile tmpnam
+ ungetc vfprintf vprintf vsprintf)],
+
+ stdlib_h => [qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX
+ abort atexit atof atoi atol bsearch calloc div
+ free getenv labs ldiv malloc mblen mbstowcs mbtowc
+ qsort realloc strtod strtol strtoul wcstombs wctomb)],
+
+ string_h => [qw(NULL memchr memcmp memcpy memmove memset strcat
+ strchr strcmp strcoll strcpy strcspn strerror strlen
+ strncat strncmp strncpy strpbrk strrchr strspn strstr
+ strtok strxfrm)],
+
+ sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
+ S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG
+ S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR
+ fstat mkfifo)],
+
+ sys_times_h => [qw()],
+
+ sys_types_h => [qw()],
+
+ sys_utsname_h => [qw(uname)],
+
+ sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED
+ WNOHANG WSTOPSIG WTERMSIG WUNTRACED)],
+
+ termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400
+ B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL
+ CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK
+ ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR
+ INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST
+ PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION
+ TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW
+ TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART
+ VSTOP VSUSP VTIME
+ cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain
+ tcflow tcflush tcgetattr tcsendbreak tcsetattr )],
+
+ time_h => [qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime
+ difftime mktime strftime tzset tzname)],
+
+ unistd_h => [qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET
+ STRERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK
+ _PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON
+ _PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX
+ _PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED
+ _POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS
+ _POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX
+ _SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL
+ _SC_NGROUPS_MAX _SC_OPEN_MAX _SC_SAVED_IDS
+ _SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION
+ _exit access ctermid cuserid
+ dup2 dup execl execle execlp execv execve execvp
+ fpathconf getcwd getegid geteuid getgid getgroups
+ getpid getuid isatty lseek pathconf pause setgid setpgid
+ setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)],
+
+ utime_h => [qw()],
+
+);
+
+# Exporter::export_tags();
+for (values %EXPORT_TAGS) {
+ push @EXPORT, @$_;
+}
+
+@EXPORT_OK = qw(
+ closedir opendir readdir rewinddir
+ fcntl open
+ getgrgid getgrnam
+ atan2 cos exp log sin sqrt
+ getpwnam getpwuid
+ kill
+ fileno getc printf rename sprintf
+ abs exit rand srand system
+ chmod mkdir stat umask
+ times
+ wait waitpid
+ gmtime localtime time
+ alarm chdir chown close fork getlogin getppid getpgrp link
+ pipe read rmdir sleep unlink write
+ utime
+ nice
+);
+
+require Exporter;
+}
diff --git a/contrib/perl5/ext/POSIX/POSIX.pod b/contrib/perl5/ext/POSIX/POSIX.pod
index 6a4a61a..08300e4 100644
--- a/contrib/perl5/ext/POSIX/POSIX.pod
+++ b/contrib/perl5/ext/POSIX/POSIX.pod
@@ -847,31 +847,35 @@ setjmp() is C-specific: use eval {} instead.
=item setlocale
-Modifies and queries program's locale.
+Modifies and queries program's locale. The following examples assume
+
+ use POSIX qw(setlocale LC_ALL LC_CTYPE);
+
+has been issued.
The following will set the traditional UNIX system locale behavior
(the second argument C<"C">).
- $loc = POSIX::setlocale( &POSIX::LC_ALL, "C" );
+ $loc = setlocale( LC_ALL, "C" );
-The following will query (the missing second argument) the current
-LC_CTYPE category.
+The following will query the current LC_CTYPE category. (No second
+argument means 'query'.)
- $loc = POSIX::setlocale( &POSIX::LC_CTYPE);
+ $loc = setlocale( LC_CTYPE );
The following will set the LC_CTYPE behaviour according to the locale
environment variables (the second argument C<"">).
Please see your systems L<setlocale(3)> documentation for the locale
environment variables' meaning or consult L<perllocale>.
- $loc = POSIX::setlocale( &POSIX::LC_CTYPE, "");
+ $loc = setlocale( LC_CTYPE, "" );
The following will set the LC_COLLATE behaviour to Argentinian
Spanish. B<NOTE>: The naming and availability of locales depends on
your operating system. Please consult L<perllocale> for how to find
out which locales are available in your system.
- $loc = POSIX::setlocale( &POSIX::LC_ALL, "es_AR.ISO8859-1" );
+ $loc = setlocale( LC_ALL, "es_AR.ISO8859-1" );
=item setpgid
@@ -1015,8 +1019,13 @@ The month (C<mon>), weekday (C<wday>), and yearday (C<yday>) begin at zero.
I.e. January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1. The
year (C<year>) is given in years since 1900. I.e., the year 1995 is 95; the
year 2001 is 101. Consult your system's C<strftime()> manpage for details
-about these and the other arguments. The given arguments are made consistent
-by calling C<mktime()> before calling your system's C<strftime()> function.
+about these and the other arguments.
+If you want your code to be portable, your format (C<fmt>) argument
+should use only the conversion specifiers defined by the ANSI C
+standard. These are C<aAbBcdHIjmMpSUwWxXyYZ%>.
+The given arguments are made consistent
+as though by calling C<mktime()> before calling your system's
+C<strftime()> function, except that the C<isdst> value is not affected.
The string for Tuesday, December 12, 1995.
diff --git a/contrib/perl5/ext/POSIX/POSIX.xs b/contrib/perl5/ext/POSIX/POSIX.xs
index 15e026e..3a523d1 100644
--- a/contrib/perl5/ext/POSIX/POSIX.xs
+++ b/contrib/perl5/ext/POSIX/POSIX.xs
@@ -1,11 +1,14 @@
#ifdef WIN32
#define _POSIX_
#endif
+
+#define PERL_NO_GET_CONTEXT
+
#include "EXTERN.h"
#define PERLIO_NOT_STDIO 1
#include "perl.h"
#include "XSUB.h"
-#ifdef PERL_OBJECT /* XXX _very_ temporary hacks */
+#if defined(PERL_OBJECT) || defined(PERL_CAPI) || defined(PERL_IMPLICIT_SYS)
# undef signal
# undef open
# undef setmode
@@ -78,6 +81,7 @@
/* The non-POSIX CRTL times() has void return type, so we just get the
current time directly */
clock_t vms_times(struct tms *PL_bufptr) {
+ dTHX;
clock_t retval;
/* Get wall time and convert to 10 ms intervals to
* produce the return value that the POSIX standard expects */
@@ -102,6 +106,9 @@
}
# define times(t) vms_times(t)
#else
+#if defined (__CYGWIN__)
+# define tzname _tzname
+#endif
#if defined (WIN32)
# undef mkfifo
# define mkfifo(a,b) not_here("mkfifo")
@@ -135,8 +142,12 @@
#else
# ifndef HAS_MKFIFO
-# ifndef mkfifo
-# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
+# ifdef OS2
+# define mkfifo(a,b) not_here("mkfifo")
+# else /* !( defined OS2 ) */
+# ifndef mkfifo
+# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
+# endif
# endif
# endif /* !HAS_MKFIFO */
@@ -177,10 +188,10 @@ typedef struct termios* POSIX__Termios;
#endif
/* Possibly needed prototypes */
-char *cuserid _((char *));
-double strtod _((const char *, char **));
-long strtol _((const char *, char **, int));
-unsigned long strtoul _((const char *, char **, int));
+char *cuserid (char *);
+double strtod (const char *, char **);
+long strtol (const char *, char **, int);
+unsigned long strtoul (const char *, char **, int);
#ifndef HAS_CUSERID
#define cuserid(a) (char *) not_here("cuserid")
@@ -278,7 +289,7 @@ unsigned long strtoul _((const char *, char **, int));
#endif
#ifdef HAS_TZNAME
-# ifndef WIN32
+# if !defined(WIN32) && !defined(__CYGWIN__)
extern char *tzname[];
# endif
#else
@@ -303,14 +314,13 @@ char *tzname[] = { "" , "" };
*/
#ifdef HAS_GNULIBC
# ifndef STRUCT_TM_HASZONE
-# define STRUCT_TM_HAS_ZONE
+# define STRUCT_TM_HASZONE
# endif
#endif
#ifdef STRUCT_TM_HASZONE
static void
-init_tm(ptm) /* see mktime, strftime and asctime */
- struct tm *ptm;
+init_tm(struct tm *ptm) /* see mktime, strftime and asctime */
{
Time_t now;
(void)time(&now);
@@ -321,6 +331,202 @@ init_tm(ptm) /* see mktime, strftime and asctime */
# define init_tm(ptm)
#endif
+/*
+ * mini_mktime - normalise struct tm values without the localtime()
+ * semantics (and overhead) of mktime().
+ */
+static void
+mini_mktime(struct tm *ptm)
+{
+ int yearday;
+ int secs;
+ int month, mday, year, jday;
+ int odd_cent, odd_year;
+
+#define DAYS_PER_YEAR 365
+#define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
+#define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
+#define DAYS_PER_QCENT (4*DAYS_PER_CENT+1)
+#define SECS_PER_HOUR (60*60)
+#define SECS_PER_DAY (24*SECS_PER_HOUR)
+/* parentheses deliberately absent on these two, otherwise they don't work */
+#define MONTH_TO_DAYS 153/5
+#define DAYS_TO_MONTH 5/153
+/* offset to bias by March (month 4) 1st between month/mday & year finding */
+#define YEAR_ADJUST (4*MONTH_TO_DAYS+1)
+/* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
+#define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
+
+/*
+ * Year/day algorithm notes:
+ *
+ * With a suitable offset for numeric value of the month, one can find
+ * an offset into the year by considering months to have 30.6 (153/5) days,
+ * using integer arithmetic (i.e., with truncation). To avoid too much
+ * messing about with leap days, we consider January and February to be
+ * the 13th and 14th month of the previous year. After that transformation,
+ * we need the month index we use to be high by 1 from 'normal human' usage,
+ * so the month index values we use run from 4 through 15.
+ *
+ * Given that, and the rules for the Gregorian calendar (leap years are those
+ * divisible by 4 unless also divisible by 100, when they must be divisible
+ * by 400 instead), we can simply calculate the number of days since some
+ * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
+ * the days we derive from our month index, and adding in the day of the
+ * month. The value used here is not adjusted for the actual origin which
+ * it normally would use (1 January A.D. 1), since we're not exposing it.
+ * We're only building the value so we can turn around and get the
+ * normalised values for the year, month, day-of-month, and day-of-year.
+ *
+ * For going backward, we need to bias the value we're using so that we find
+ * the right year value. (Basically, we don't want the contribution of
+ * March 1st to the number to apply while deriving the year). Having done
+ * that, we 'count up' the contribution to the year number by accounting for
+ * full quadracenturies (400-year periods) with their extra leap days, plus
+ * the contribution from full centuries (to avoid counting in the lost leap
+ * days), plus the contribution from full quad-years (to count in the normal
+ * leap days), plus the leftover contribution from any non-leap years.
+ * At this point, if we were working with an actual leap day, we'll have 0
+ * days left over. This is also true for March 1st, however. So, we have
+ * to special-case that result, and (earlier) keep track of the 'odd'
+ * century and year contributions. If we got 4 extra centuries in a qcent,
+ * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
+ * Otherwise, we add back in the earlier bias we removed (the 123 from
+ * figuring in March 1st), find the month index (integer division by 30.6),
+ * and the remainder is the day-of-month. We then have to convert back to
+ * 'real' months (including fixing January and February from being 14/15 in
+ * the previous year to being in the proper year). After that, to get
+ * tm_yday, we work with the normalised year and get a new yearday value for
+ * January 1st, which we subtract from the yearday value we had earlier,
+ * representing the date we've re-built. This is done from January 1
+ * because tm_yday is 0-origin.
+ *
+ * Since POSIX time routines are only guaranteed to work for times since the
+ * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
+ * applies Gregorian calendar rules even to dates before the 16th century
+ * doesn't bother me. Besides, you'd need cultural context for a given
+ * date to know whether it was Julian or Gregorian calendar, and that's
+ * outside the scope for this routine. Since we convert back based on the
+ * same rules we used to build the yearday, you'll only get strange results
+ * for input which needed normalising, or for the 'odd' century years which
+ * were leap years in the Julian calander but not in the Gregorian one.
+ * I can live with that.
+ *
+ * This algorithm also fails to handle years before A.D. 1 gracefully, but
+ * that's still outside the scope for POSIX time manipulation, so I don't
+ * care.
+ */
+
+ year = 1900 + ptm->tm_year;
+ month = ptm->tm_mon;
+ mday = ptm->tm_mday;
+ /* allow given yday with no month & mday to dominate the result */
+ if (ptm->tm_yday >= 0 && mday <= 0 && month <= 0) {
+ month = 0;
+ mday = 0;
+ jday = 1 + ptm->tm_yday;
+ }
+ else {
+ jday = 0;
+ }
+ if (month >= 2)
+ month+=2;
+ else
+ month+=14, year--;
+ yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
+ yearday += month*MONTH_TO_DAYS + mday + jday;
+ /*
+ * Note that we don't know when leap-seconds were or will be,
+ * so we have to trust the user if we get something which looks
+ * like a sensible leap-second. Wild values for seconds will
+ * be rationalised, however.
+ */
+ if ((unsigned) ptm->tm_sec <= 60) {
+ secs = 0;
+ }
+ else {
+ secs = ptm->tm_sec;
+ ptm->tm_sec = 0;
+ }
+ secs += 60 * ptm->tm_min;
+ secs += SECS_PER_HOUR * ptm->tm_hour;
+ if (secs < 0) {
+ if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
+ /* got negative remainder, but need positive time */
+ /* back off an extra day to compensate */
+ yearday += (secs/SECS_PER_DAY)-1;
+ secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
+ }
+ else {
+ yearday += (secs/SECS_PER_DAY);
+ secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
+ }
+ }
+ else if (secs >= SECS_PER_DAY) {
+ yearday += (secs/SECS_PER_DAY);
+ secs %= SECS_PER_DAY;
+ }
+ ptm->tm_hour = secs/SECS_PER_HOUR;
+ secs %= SECS_PER_HOUR;
+ ptm->tm_min = secs/60;
+ secs %= 60;
+ ptm->tm_sec += secs;
+ /* done with time of day effects */
+ /*
+ * The algorithm for yearday has (so far) left it high by 428.
+ * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
+ * bias it by 123 while trying to figure out what year it
+ * really represents. Even with this tweak, the reverse
+ * translation fails for years before A.D. 0001.
+ * It would still fail for Feb 29, but we catch that one below.
+ */
+ jday = yearday; /* save for later fixup vis-a-vis Jan 1 */
+ yearday -= YEAR_ADJUST;
+ year = (yearday / DAYS_PER_QCENT) * 400;
+ yearday %= DAYS_PER_QCENT;
+ odd_cent = yearday / DAYS_PER_CENT;
+ year += odd_cent * 100;
+ yearday %= DAYS_PER_CENT;
+ year += (yearday / DAYS_PER_QYEAR) * 4;
+ yearday %= DAYS_PER_QYEAR;
+ odd_year = yearday / DAYS_PER_YEAR;
+ year += odd_year;
+ yearday %= DAYS_PER_YEAR;
+ if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
+ month = 1;
+ yearday = 29;
+ }
+ else {
+ yearday += YEAR_ADJUST; /* recover March 1st crock */
+ month = yearday*DAYS_TO_MONTH;
+ yearday -= month*MONTH_TO_DAYS;
+ /* recover other leap-year adjustment */
+ if (month > 13) {
+ month-=14;
+ year++;
+ }
+ else {
+ month-=2;
+ }
+ }
+ ptm->tm_year = year - 1900;
+ if (yearday) {
+ ptm->tm_mday = yearday;
+ ptm->tm_mon = month;
+ }
+ else {
+ ptm->tm_mday = 31;
+ ptm->tm_mon = month - 1;
+ }
+ /* re-build yearday based on Jan 1 to get tm_yday */
+ year--;
+ yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
+ yearday += 14*MONTH_TO_DAYS + 1;
+ ptm->tm_yday = jday - yearday;
+ /* fix tm_wday if not overridden by caller */
+ if ((unsigned)ptm->tm_wday > 6)
+ ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
+}
#ifdef HAS_LONG_DOUBLE
# if LONG_DOUBLESIZE > DOUBLESIZE
@@ -348,7 +554,7 @@ not_here(char *s)
}
static
-#ifdef HAS_LONG_DOUBLE
+#if defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE)
long double
#else
double
@@ -1519,9 +1725,10 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
- if (strEQ(name, "L_tmpname"))
-#ifdef L_tmpname
- return L_tmpname;
+ /* L_tmpnam[e] was a typo--retained for compatibility */
+ if (strEQ(name, "L_tmpname") || strEQ(name, "L_tmpnam"))
+#ifdef L_tmpnam
+ return L_tmpnam;
#else
goto not_there;
#endif
@@ -3045,7 +3252,7 @@ setlocale(category, locale = 0)
else
#endif
newctype = RETVAL;
- perl_new_ctype(newctype);
+ new_ctype(newctype);
}
#endif /* USE_LOCALE_CTYPE */
#ifdef USE_LOCALE_COLLATE
@@ -3062,7 +3269,7 @@ setlocale(category, locale = 0)
else
#endif
newcoll = RETVAL;
- perl_new_collate(newcoll);
+ new_collate(newcoll);
}
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
@@ -3079,7 +3286,7 @@ setlocale(category, locale = 0)
else
#endif
newnum = RETVAL;
- perl_new_numeric(newnum);
+ new_numeric(newnum);
}
#endif /* USE_LOCALE_NUMERIC */
}
@@ -3167,17 +3374,15 @@ sigaction(sig, action, oldaction = 0)
# This code is really grody because we're trying to make the signal
# interface look beautiful, which is hard.
- if (!PL_siggv)
- gv_fetchpv("SIG", TRUE, SVt_PVHV);
-
{
+ GV *siggv = gv_fetchpv("SIG", TRUE, SVt_PVHV);
struct sigaction act;
struct sigaction oact;
POSIX__SigSet sigset;
SV** svp;
- SV** sigsvp = hv_fetch(GvHVn(PL_siggv),
- sig_name[sig],
- strlen(sig_name[sig]),
+ SV** sigsvp = hv_fetch(GvHVn(siggv),
+ PL_sig_name[sig],
+ strlen(PL_sig_name[sig]),
TRUE);
STRLEN n_a;
@@ -3196,7 +3401,7 @@ sigaction(sig, action, oldaction = 0)
croak("Can't supply an action without a HANDLER");
sv_setpv(*sigsvp, SvPV(*svp, n_a));
mg_set(*sigsvp); /* handles DEFAULT and IGNORE */
- act.sa_handler = sighandler;
+ act.sa_handler = PL_sighandlerp;
/* Set up any desired mask. */
svp = hv_fetch(action, "MASK", 4, FALSE);
@@ -3262,7 +3467,7 @@ INIT:
}
else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
IV tmp = SvIV((SV*)SvRV(ST(2)));
- oldsigset = (POSIX__SigSet) tmp;
+ oldsigset = INT2PTR(POSIX__SigSet,tmp);
}
else {
New(0, oldsigset, 1, sigset_t);
@@ -3367,9 +3572,18 @@ write(fd, buffer, nbytes)
char * buffer
size_t nbytes
-char *
-tmpnam(s = 0)
- char * s = 0;
+SV *
+tmpnam()
+ PREINIT:
+ STRLEN i;
+ int len;
+ CODE:
+ RETVAL = newSVpvn("", 0);
+ SvGROW(RETVAL, L_tmpnam);
+ len = strlen(tmpnam(SvPV(RETVAL, i)));
+ SvCUR_set(RETVAL, len);
+ OUTPUT:
+ RETVAL
void
abort()
@@ -3434,10 +3648,12 @@ strtol(str, base = 0)
char *unparsed;
PPCODE:
num = strtol(str, &unparsed, base);
- if (num >= IV_MIN && num <= IV_MAX)
- PUSHs(sv_2mortal(newSViv((IV)num)));
- else
+#if IVSIZE <= LONGSIZE
+ if (num < IV_MIN || num > IV_MAX)
PUSHs(sv_2mortal(newSVnv((double)num)));
+ else
+#endif
+ PUSHs(sv_2mortal(newSViv((IV)num)));
if (GIMME == G_ARRAY) {
EXTEND(SP, 1);
if (unparsed)
@@ -3629,7 +3845,7 @@ strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
mytm.tm_wday = wday;
mytm.tm_yday = yday;
mytm.tm_isdst = isdst;
- (void) mktime(&mytm);
+ mini_mktime(&mytm);
len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm);
/*
** The following is needed to handle to the situation where
@@ -3645,28 +3861,35 @@ strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
** If there is a better way to make it portable, go ahead by
** all means.
*/
- if ( ( len > 0 && len < sizeof(tmpbuf) )
- || ( len == 0 && strlen(fmt) == 0 ) ) {
+ if ((len > 0 && len < sizeof(tmpbuf)) || (len == 0 && *fmt == '\0'))
ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
- } else {
+ else {
/* Possibly buf overflowed - try again with a bigger buf */
- int bufsize = strlen(fmt) + sizeof(tmpbuf);
+ int fmtlen = strlen(fmt);
+ int bufsize = fmtlen + sizeof(tmpbuf);
char* buf;
int buflen;
New(0, buf, bufsize, char);
- while( buf ) {
+ while (buf) {
buflen = strftime(buf, bufsize, fmt, &mytm);
- if ( buflen > 0 && buflen < bufsize ) break;
+ if (buflen > 0 && buflen < bufsize)
+ break;
+ /* heuristic to prevent out-of-memory errors */
+ if (bufsize > 100*fmtlen) {
+ Safefree(buf);
+ buf = NULL;
+ break;
+ }
bufsize *= 2;
Renew(buf, bufsize, char);
}
- if ( buf ) {
- ST(0) = sv_2mortal(newSVpv(buf, buflen));
+ if (buf) {
+ ST(0) = sv_2mortal(newSVpvn(buf, buflen));
Safefree(buf);
- } else {
- ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
}
+ else
+ ST(0) = sv_2mortal(newSVpvn(tmpbuf, len));
}
}
@@ -3677,8 +3900,8 @@ void
tzname()
PPCODE:
EXTEND(SP,2);
- PUSHs(sv_2mortal(newSVpv(tzname[0],strlen(tzname[0]))));
- PUSHs(sv_2mortal(newSVpv(tzname[1],strlen(tzname[1]))));
+ PUSHs(sv_2mortal(newSVpvn(tzname[0],strlen(tzname[0]))));
+ PUSHs(sv_2mortal(newSVpvn(tzname[1],strlen(tzname[1]))));
SysRet
access(filename, mode)
diff --git a/contrib/perl5/ext/SDBM_File/Makefile.PL b/contrib/perl5/ext/SDBM_File/Makefile.PL
index 7494785..a1debb9 100644
--- a/contrib/perl5/ext/SDBM_File/Makefile.PL
+++ b/contrib/perl5/ext/SDBM_File/Makefile.PL
@@ -16,16 +16,30 @@ WriteMakefile(
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'SDBM_File.pm',
DEFINE => $define,
+ PERL_MALLOC_OK => 1,
);
sub MY::postamble {
- if ($^O ne 'VMS') {
+ if ($^O =~ /MSWin32/ && Win32::IsWin95()) {
+ # XXX: dmake-specific, like rest of Win95 port
+ return
+ '
+$(MYEXTLIB): sdbm/Makefile
+@[
+ cd sdbm
+ $(MAKE) all
+ cd ..
+]
+';
+ }
+ elsif ($^O ne 'VMS') {
'
$(MYEXTLIB): sdbm/Makefile
cd sdbm && $(MAKE) all
';
- } else {
- '
+ }
+ else {
+ '
$(MYEXTLIB) : [.sdbm]descrip.mms
set def [.sdbm]
$(MMS) all
diff --git a/contrib/perl5/ext/SDBM_File/SDBM_File.pm b/contrib/perl5/ext/SDBM_File/SDBM_File.pm
index a2d4df8..c5e26c8 100644
--- a/contrib/perl5/ext/SDBM_File/SDBM_File.pm
+++ b/contrib/perl5/ext/SDBM_File/SDBM_File.pm
@@ -1,16 +1,14 @@
package SDBM_File;
use strict;
-use vars qw($VERSION @ISA);
require Tie::Hash;
-require DynaLoader;
+use XSLoader ();
-@ISA = qw(Tie::Hash DynaLoader);
+our @ISA = qw(Tie::Hash);
+our $VERSION = "1.02" ;
-$VERSION = "1.00" ;
-
-bootstrap SDBM_File $VERSION;
+XSLoader::load 'SDBM_File', $VERSION;
1;
@@ -30,6 +28,6 @@ SDBM_File - Tied access to sdbm files
=head1 DESCRIPTION
-See L<perlfunc/tie>
+See L<perlfunc/tie>, L<perldbmfilter>
=cut
diff --git a/contrib/perl5/ext/SDBM_File/SDBM_File.xs b/contrib/perl5/ext/SDBM_File/SDBM_File.xs
index 38eaebf..a4b9045 100644
--- a/contrib/perl5/ext/SDBM_File/SDBM_File.xs
+++ b/contrib/perl5/ext/SDBM_File/SDBM_File.xs
@@ -1,15 +1,47 @@
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "sdbm/sdbm.h"
-typedef DBM* SDBM_File;
+typedef struct {
+ DBM * dbp ;
+ SV * filter_fetch_key ;
+ SV * filter_store_key ;
+ SV * filter_fetch_value ;
+ SV * filter_store_value ;
+ int filtering ;
+ } SDBM_File_type;
+
+typedef SDBM_File_type * SDBM_File ;
+typedef datum datum_key ;
+typedef datum datum_value ;
+
+#define ckFilter(arg,type,name) \
+ if (db->type) { \
+ SV * save_defsv ; \
+ /* printf("filtering %s\n", name) ;*/ \
+ if (db->filtering) \
+ croak("recursion detected in %s", name) ; \
+ db->filtering = TRUE ; \
+ save_defsv = newSVsv(DEFSV) ; \
+ sv_setsv(DEFSV, arg) ; \
+ PUSHMARK(sp) ; \
+ (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
+ sv_setsv(arg, DEFSV) ; \
+ sv_setsv(DEFSV, save_defsv) ; \
+ SvREFCNT_dec(save_defsv) ; \
+ db->filtering = FALSE ; \
+ /*printf("end of filtering %s\n", name) ;*/ \
+ }
+
#define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
-#define sdbm_FETCH(db,key) sdbm_fetch(db,key)
-#define sdbm_STORE(db,key,value,flags) sdbm_store(db,key,value,flags)
-#define sdbm_DELETE(db,key) sdbm_delete(db,key)
-#define sdbm_FIRSTKEY(db) sdbm_firstkey(db)
-#define sdbm_NEXTKEY(db,key) sdbm_nextkey(db)
+#define sdbm_FETCH(db,key) sdbm_fetch(db->dbp,key)
+#define sdbm_STORE(db,key,value,flags) sdbm_store(db->dbp,key,value,flags)
+#define sdbm_DELETE(db,key) sdbm_delete(db->dbp,key)
+#define sdbm_EXISTS(db,key) sdbm_exists(db->dbp,key)
+#define sdbm_FIRSTKEY(db) sdbm_firstkey(db->dbp)
+#define sdbm_NEXTKEY(db,key) sdbm_nextkey(db->dbp)
MODULE = SDBM_File PACKAGE = SDBM_File PREFIX = sdbm_
@@ -20,23 +52,46 @@ sdbm_TIEHASH(dbtype, filename, flags, mode)
char * filename
int flags
int mode
+ CODE:
+ {
+ DBM * dbp ;
+
+ RETVAL = NULL ;
+ if (dbp = sdbm_open(filename,flags,mode) ) {
+ RETVAL = (SDBM_File)safemalloc(sizeof(SDBM_File_type)) ;
+ Zero(RETVAL, 1, SDBM_File_type) ;
+ RETVAL->dbp = dbp ;
+ }
+
+ }
+ OUTPUT:
+ RETVAL
void
sdbm_DESTROY(db)
SDBM_File db
CODE:
- sdbm_close(db);
+ sdbm_close(db->dbp);
+ if (db->filter_fetch_key)
+ SvREFCNT_dec(db->filter_fetch_key) ;
+ if (db->filter_store_key)
+ SvREFCNT_dec(db->filter_store_key) ;
+ if (db->filter_fetch_value)
+ SvREFCNT_dec(db->filter_fetch_value) ;
+ if (db->filter_store_value)
+ SvREFCNT_dec(db->filter_store_value) ;
+ safefree(db) ;
-datum
+datum_value
sdbm_FETCH(db, key)
SDBM_File db
- datum key
+ datum_key key
int
sdbm_STORE(db, key, value, flags = DBM_REPLACE)
SDBM_File db
- datum key
- datum value
+ datum_key key
+ datum_value value
int flags
CLEANUP:
if (RETVAL) {
@@ -44,28 +99,93 @@ sdbm_STORE(db, key, value, flags = DBM_REPLACE)
croak("No write permission to sdbm file");
croak("sdbm store returned %d, errno %d, key \"%s\"",
RETVAL,errno,key.dptr);
- sdbm_clearerr(db);
+ sdbm_clearerr(db->dbp);
}
int
sdbm_DELETE(db, key)
SDBM_File db
- datum key
+ datum_key key
-datum
+int
+sdbm_EXISTS(db,key)
+ SDBM_File db
+ datum_key key
+
+datum_key
sdbm_FIRSTKEY(db)
SDBM_File db
-datum
+datum_key
sdbm_NEXTKEY(db, key)
SDBM_File db
- datum key
+ datum_key key
int
sdbm_error(db)
SDBM_File db
+ CODE:
+ RETVAL = sdbm_error(db->dbp) ;
+ OUTPUT:
+ RETVAL
int
sdbm_clearerr(db)
SDBM_File db
+ CODE:
+ RETVAL = sdbm_clearerr(db->dbp) ;
+ OUTPUT:
+ RETVAL
+
+
+#define setFilter(type) \
+ { \
+ if (db->type) \
+ RETVAL = sv_mortalcopy(db->type) ; \
+ ST(0) = RETVAL ; \
+ if (db->type && (code == &PL_sv_undef)) { \
+ SvREFCNT_dec(db->type) ; \
+ db->type = NULL ; \
+ } \
+ else if (code) { \
+ if (db->type) \
+ sv_setsv(db->type, code) ; \
+ else \
+ db->type = newSVsv(code) ; \
+ } \
+ }
+
+
+
+SV *
+filter_fetch_key(db, code)
+ SDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_key) ;
+
+SV *
+filter_store_key(db, code)
+ SDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_key) ;
+
+SV *
+filter_fetch_value(db, code)
+ SDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_fetch_value) ;
+
+SV *
+filter_store_value(db, code)
+ SDBM_File db
+ SV * code
+ SV * RETVAL = &PL_sv_undef ;
+ CODE:
+ setFilter(filter_store_value) ;
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/Makefile.PL b/contrib/perl5/ext/SDBM_File/sdbm/Makefile.PL
index e6fdcf9..4453dea 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/Makefile.PL
+++ b/contrib/perl5/ext/SDBM_File/sdbm/Makefile.PL
@@ -42,12 +42,14 @@ INST_STATIC = libsdbm$(LIB_EXT)
}
sub MY::top_targets {
+ my $noecho = shift->{NOECHO};
+
my $r = '
all :: static
- $(NOECHO) $(NOOP)
+ ' . $noecho . '$(NOOP)
config ::
- $(NOECHO) $(NOOP)
+ ' . $noecho . '$(NOOP)
lint:
lint -abchx $(LIBSRCS)
@@ -58,7 +60,7 @@ lint:
# variables into the environment so $(MYEXTLIB) is set in here to this
# value which can not be built.
sdbm/libsdbm.a:
- $(NOECHO) $(NOOP)
+ ' . $noecho . '$(NOOP)
' unless $^O eq 'VMS';
return $r;
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/README.too b/contrib/perl5/ext/SDBM_File/sdbm/README.too
index c2d0959..1fec315 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/README.too
+++ b/contrib/perl5/ext/SDBM_File/sdbm/README.too
@@ -7,3 +7,8 @@ Fri Apr 15 10:15:30 EDT 1994.
Additional portability/configuration changes for libsdbm by Andy Dougherty
doughera@lafcol.lafayette.edu.
+
+
+Mon Mar 22 03:24:47 PST 1999.
+
+sdbm_exists added to the library by Russ Allbery <rra@stanford.edu>.
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/dba.c b/contrib/perl5/ext/SDBM_File/sdbm/dba.c
index 05e70c8..7406776 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/dba.c
+++ b/contrib/perl5/ext/SDBM_File/sdbm/dba.c
@@ -11,8 +11,7 @@ char *progname;
extern void oops();
int
-main(argc, argv)
-char **argv;
+main(int argc, char **argv)
{
int n;
char *p;
@@ -23,6 +22,9 @@ char **argv;
if (p = argv[1]) {
name = (char *) malloc((n = strlen(p)) + 5);
+ if (!name)
+ oops("cannot get memory");
+
strcpy(name, p);
strcpy(name + n, ".pag");
@@ -37,8 +39,8 @@ char **argv;
return 0;
}
-sdump(pagf)
-int pagf;
+void
+sdump(int pagf)
{
register b;
register n = 0;
@@ -67,8 +69,8 @@ int pagf;
oops("read failed: block %d", n);
}
-pagestat(pag)
-char *pag;
+int
+pagestat(char *pag)
{
register n;
register free;
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/dbd.c b/contrib/perl5/ext/SDBM_File/sdbm/dbd.c
index 04ab842..0a58d9a 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/dbd.c
+++ b/contrib/perl5/ext/SDBM_File/sdbm/dbd.c
@@ -14,8 +14,7 @@ extern void oops();
#define empty(page) (((short *) page)[0] == 0)
int
-main(argc, argv)
-char **argv;
+main(int argc, char **argv)
{
int n;
char *p;
@@ -26,6 +25,9 @@ char **argv;
if (p = argv[1]) {
name = (char *) malloc((n = strlen(p)) + 5);
+ if (!name)
+ oops("cannot get memory");
+
strcpy(name, p);
strcpy(name + n, ".pag");
@@ -39,8 +41,8 @@ char **argv;
return 0;
}
-sdump(pagf)
-int pagf;
+void
+sdump(int pagf)
{
register r;
register n = 0;
@@ -65,8 +67,8 @@ int pagf;
#ifdef OLD
-dispage(pag)
-char *pag;
+int
+dispage(char *pag)
{
register i, n;
register off;
@@ -87,8 +89,8 @@ char *pag;
}
}
#else
-dispage(pag)
-char *pag;
+void
+dispage(char *pag)
{
register i, n;
register off;
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/dbe.c b/contrib/perl5/ext/SDBM_File/sdbm/dbe.c
index 2a306f2..166e64e 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/dbe.c
+++ b/contrib/perl5/ext/SDBM_File/sdbm/dbe.c
@@ -52,10 +52,7 @@ char *optarg; /* Global argument pointer. */
#endif
char
-getopt(argc, argv, optstring)
-int argc;
-char **argv;
-char *optstring;
+getopt(int argc, char **argv, char *optstring)
{
register int c;
register char *place;
@@ -131,14 +128,13 @@ char *optstring;
void
-print_datum(db)
-datum db;
+print_datum(datum db)
{
int i;
putchar('"');
for (i = 0; i < db.dsize; i++) {
- if (isprint(db.dptr[i]))
+ if (isprint((unsigned char)db.dptr[i]))
putchar(db.dptr[i]);
else {
putchar('\\');
@@ -152,8 +148,7 @@ datum db;
datum
-read_datum(s)
-char *s;
+read_datum(char *s)
{
datum db;
char *p;
@@ -161,6 +156,9 @@ char *s;
db.dsize = 0;
db.dptr = (char *) malloc(strlen(s) * sizeof(char));
+ if (!db.dptr)
+ oops("cannot get memory");
+
for (p = db.dptr; *s != '\0'; p++, db.dsize++, s++) {
if (*s == '\\') {
if (*++s == 'n')
@@ -171,7 +169,10 @@ char *s;
*p = '\f';
else if (*s == 't')
*p = '\t';
- else if (isdigit(*s) && isdigit(*(s + 1)) && isdigit(*(s + 2))) {
+ else if (isdigit((unsigned char)*s)
+ && isdigit((unsigned char)*(s + 1))
+ && isdigit((unsigned char)*(s + 2)))
+ {
i = (*s++ - '0') << 6;
i |= (*s++ - '0') << 3;
i |= *s - '0';
@@ -191,22 +192,21 @@ char *s;
char *
-key2s(db)
-datum db;
+key2s(datum db)
{
char *buf;
char *p1, *p2;
buf = (char *) malloc((db.dsize + 1) * sizeof(char));
+ if (!buf)
+ oops("cannot get memory");
for (p1 = buf, p2 = db.dptr; *p2 != '\0'; *p1++ = *p2++);
*p1 = '\0';
return buf;
}
-
-main(argc, argv)
-int argc;
-char **argv;
+int
+main(int argc, char **argv)
{
typedef enum {
YOW, FETCH, STORE, DELETE, SCAN, REGEXP
@@ -285,7 +285,7 @@ char **argv;
}
}
- if (giveusage | what == YOW | argn < 1) {
+ if (giveusage || what == YOW || argn < 1) {
fprintf(stderr, "Usage: %s databse [-m r|w|rw] [-crtx] -a|-d|-f|-F|-s [key [content]]\n", argv[0]);
exit(-1);
}
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/dbm.c b/contrib/perl5/ext/SDBM_File/sdbm/dbm.c
index 1388230..dc47d70 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/dbm.c
+++ b/contrib/perl5/ext/SDBM_File/sdbm/dbm.c
@@ -27,8 +27,8 @@ static DBM *cur_db = NODB;
static char no_db[] = "dbm: no open database\n";
-dbminit(file)
- char *file;
+int
+dbminit(char *file)
{
if (cur_db != NODB)
dbm_close(cur_db);
@@ -43,8 +43,7 @@ dbminit(file)
}
long
-forder(key)
-datum key;
+forder(datum key)
{
if (cur_db == NODB) {
printf(no_db);
@@ -54,8 +53,7 @@ datum key;
}
datum
-fetch(key)
-datum key;
+fetch(datum key)
{
datum item;
@@ -67,8 +65,8 @@ datum key;
return (dbm_fetch(cur_db, key));
}
-delete(key)
-datum key;
+int
+delete(datum key)
{
if (cur_db == NODB) {
printf(no_db);
@@ -79,8 +77,8 @@ datum key;
return (dbm_delete(cur_db, key));
}
-store(key, dat)
-datum key, dat;
+int
+store(datum key, datum dat)
{
if (cur_db == NODB) {
printf(no_db);
@@ -93,7 +91,7 @@ datum key, dat;
}
datum
-firstkey()
+firstkey(void)
{
datum item;
@@ -106,8 +104,7 @@ firstkey()
}
datum
-nextkey(key)
-datum key;
+nextkey(datum key)
{
datum item;
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/dbu.c b/contrib/perl5/ext/SDBM_File/sdbm/dbu.c
index a3c0004..e68b78d 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/dbu.c
+++ b/contrib/perl5/ext/SDBM_File/sdbm/dbu.c
@@ -65,9 +65,7 @@ static cmd *parse();
static void badk(), doit(), prdatum();
int
-main(argc, argv)
-int argc;
-char *argv[];
+main(int argc, char **argv)
{
int c;
register cmd *act;
@@ -98,9 +96,7 @@ char *argv[];
}
static void
-doit(act, file)
-register cmd *act;
-char *file;
+doit(register cmd *act, char *file)
{
datum key;
datum val;
@@ -197,8 +193,7 @@ char *file;
}
static void
-badk(word)
-char *word;
+badk(char *word)
{
register int i;
@@ -214,8 +209,7 @@ char *word;
}
static cmd *
-parse(str)
-register char *str;
+parse(register char *str)
{
register int i = CTABSIZ;
register cmd *p;
@@ -227,9 +221,7 @@ register char *str;
}
static void
-prdatum(stream, d)
-FILE *stream;
-datum d;
+prdatum(FILE *stream, datum d)
{
register int c;
register char *p = d.dptr;
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/pair.c b/contrib/perl5/ext/SDBM_File/sdbm/pair.c
index a9a805a..4f0fde2 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/pair.c
+++ b/contrib/perl5/ext/SDBM_File/sdbm/pair.c
@@ -8,7 +8,11 @@
*/
#include "config.h"
-#include "EXTERN.h"
+#ifdef __CYGWIN__
+# define EXTCONST extern const
+#else
+# include "EXTERN.h"
+#endif
#include "sdbm.h"
#include "tune.h"
#include "pair.h"
@@ -102,6 +106,17 @@ getpair(char *pag, datum key)
return val;
}
+int
+exipair(char *pag, datum key)
+{
+ register short *ino = (short *) pag;
+
+ if (ino[0] == 0)
+ return 0;
+
+ return (seepair(pag, ino[0], key.dptr, key.dsize) != 0);
+}
+
#ifdef SEEDUPS
int
duppair(char *pag, datum key)
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/pair.h b/contrib/perl5/ext/SDBM_File/sdbm/pair.h
index 8a675b9..b6944ed 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/pair.h
+++ b/contrib/perl5/ext/SDBM_File/sdbm/pair.h
@@ -2,6 +2,7 @@
#define chkpage sdbm__chkpage
#define delpair sdbm__delpair
#define duppair sdbm__duppair
+#define exipair sdbm__exipair
#define fitpair sdbm__fitpair
#define getnkey sdbm__getnkey
#define getpair sdbm__getpair
@@ -11,6 +12,7 @@
extern int fitpair proto((char *, int));
extern void putpair proto((char *, datum, datum));
extern datum getpair proto((char *, datum));
+extern int exipair proto((char *, datum));
extern int delpair proto((char *, datum));
extern int chkpage proto((char *));
extern datum getnkey proto((char *, int));
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/sdbm.3 b/contrib/perl5/ext/SDBM_File/sdbm/sdbm.3
index 7e5c176..fe6fe76 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/sdbm.3
+++ b/contrib/perl5/ext/SDBM_File/sdbm/sdbm.3
@@ -1,7 +1,7 @@
.\" $Id: sdbm.3,v 1.2 90/12/13 13:00:57 oz Exp $
.TH SDBM 3 "1 March 1990"
.SH NAME
-sdbm, sdbm_open, sdbm_prep, sdbm_close, sdbm_fetch, sdbm_store, sdbm_delete, sdbm_firstkey, sdbm_nextkey, sdbm_hash, sdbm_rdonly, sdbm_error, sdbm_clearerr, sdbm_dirfno, sdbm_pagfno \- data base subroutines
+sdbm, sdbm_open, sdbm_prep, sdbm_close, sdbm_fetch, sdbm_store, sdbm_delete, sdbm_exists, sdbm_firstkey, sdbm_nextkey, sdbm_hash, sdbm_rdonly, sdbm_error, sdbm_clearerr, sdbm_dirfno, sdbm_pagfno \- data base subroutines
.SH SYNOPSIS
.nf
.ft B
@@ -26,6 +26,8 @@ int sdbm_store(\s-1DBM\s0 *db, datum key, datum val, int flags)
.sp
int sdbm_delete(\s-1DBM\s0 *db, datum key)
.sp
+int sdbm_exists(\s-1DBM\s0 *db, datum key)
+.sp
datum sdbm_firstkey(\s-1DBM\s0 *db)
.sp
datum sdbm_nextkey(\s-1DBM\s0 *db)
@@ -47,6 +49,7 @@ int sdbm_pagfno(\s-1DBM\s0 *db)
.IX sdbm_fetch "" "\fLsdbm_fetch\fR \(em fetch \fLsdbm\fR database data"
.IX sdbm_store "" "\fLsdbm_store\fR \(em add data to \fLsdbm\fR database"
.IX sdbm_delete "" "\fLsdbm_delete\fR \(em remove data from \fLsdbm\fR database"
+.IX sdbm_exists "" "\fLsdbm_exists\fR \(em test \fLsdbm\fR key existence"
.IX sdbm_firstkey "" "\fLsdbm_firstkey\fR \(em access \fLsdbm\fR database"
.IX sdbm_nextkey "" "\fLsdbm_nextkey\fR \(em access \fLsdbm\fR database"
.IX sdbm_hash "" "\fLsdbm_hash\fR \(em string hash for \fLsdbm\fR database"
@@ -149,6 +152,8 @@ Given a handle, one can retrieve data associated with a key by using the
routine, and associate data with a key by using the
.BR sdbm_store (\|)
routine.
+.BR sdbm_exists (\|)
+will say whether a given key exists in the database.
.LP
The values of the
.I flags
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/sdbm.c b/contrib/perl5/ext/SDBM_File/sdbm/sdbm.c
index c147e45..64c75cb 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/sdbm.c
+++ b/contrib/perl5/ext/SDBM_File/sdbm/sdbm.c
@@ -9,6 +9,9 @@
#include "INTERN.h"
#include "config.h"
+#ifdef WIN32
+#include "io.h"
+#endif
#include "sdbm.h"
#include "tune.h"
#include "pair.h"
@@ -36,7 +39,7 @@ extern int errno;
extern Malloc_t malloc proto((MEM_SIZE));
extern Free_t free proto((Malloc_t));
-extern Off_t lseek(int, Off_t, int);
+
#endif
/*
@@ -125,7 +128,7 @@ sdbm_prep(char *dirname, char *pagname, int flags, int mode)
* open the files in sequence, and stat the dirfile.
* If we fail anywhere, undo everything, return NULL.
*/
-#if defined(OS2) || defined(MSDOS) || defined(WIN32)
+#if defined(OS2) || defined(MSDOS) || defined(WIN32) || defined(__CYGWIN__)
flags |= O_BINARY;
# endif
if ((db->pagf = open(pagname, flags, mode)) > -1) {
@@ -182,6 +185,18 @@ sdbm_fetch(register DBM *db, datum key)
}
int
+sdbm_exists(register DBM *db, datum key)
+{
+ if (db == NULL || bad(key))
+ return errno = EINVAL, -1;
+
+ if (getpage(db, exhash(key)))
+ return exipair(db->pagbuf, key);
+
+ return ioerr(db), -1;
+}
+
+int
sdbm_delete(register DBM *db, datum key)
{
if (db == NULL || bad(key))
@@ -416,9 +431,12 @@ getdbit(register DBM *db, register long int dbit)
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
+ int got;
if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0
- || read(db->dirf, db->dirbuf, DBLKSIZ) < 0)
+ || (got=read(db->dirf, db->dirbuf, DBLKSIZ)) < 0)
return 0;
+ if (got==0)
+ memset(db->dirbuf,0,DBLKSIZ);
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
@@ -437,10 +455,12 @@ setdbit(register DBM *db, register long int dbit)
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
- (void) memset(db->dirbuf, 0, DBLKSIZ);
+ int got;
if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0
- || read(db->dirf, db->dirbuf, DBLKSIZ) < 0)
+ || (got=read(db->dirf, db->dirbuf, DBLKSIZ)) < 0)
return 0;
+ if (got==0)
+ memset(db->dirbuf,0,DBLKSIZ);
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
@@ -448,8 +468,13 @@ setdbit(register DBM *db, register long int dbit)
db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ);
+#if 0
if (dbit >= db->maxbno)
db->maxbno += DBLKSIZ * BYTESIZ;
+#else
+ if (OFF_DIR((dirb+1))*BYTESIZ > db->maxbno)
+ db->maxbno=OFF_DIR((dirb+1))*BYTESIZ;
+#endif
if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0
|| write(db->dirf, db->dirbuf, DBLKSIZ) < 0)
diff --git a/contrib/perl5/ext/SDBM_File/sdbm/sdbm.h b/contrib/perl5/ext/SDBM_File/sdbm/sdbm.h
index 84d5f75..86ba82d 100644
--- a/contrib/perl5/ext/SDBM_File/sdbm/sdbm.h
+++ b/contrib/perl5/ext/SDBM_File/sdbm/sdbm.h
@@ -79,6 +79,7 @@ extern int sdbm_delete proto((DBM *, datum));
extern int sdbm_store proto((DBM *, datum, datum, int));
extern datum sdbm_firstkey proto((DBM *));
extern datum sdbm_nextkey proto((DBM *));
+extern int sdbm_exists proto((DBM *, datum));
/*
* other
@@ -98,8 +99,12 @@ extern long sdbm_hash proto((char *, int));
#define dbm_clearerr sdbm_clearerr
#endif
-/* Most of the following is stolen from perl.h. */
+/* Most of the following is stolen from perl.h. We don't include
+ perl.h here because we just want the portability parts of perl.h,
+ not everything else.
+*/
#ifndef H_PERL /* Include guard */
+#include "embed.h" /* Follow all the global renamings. */
/*
* The following contortions are brought to you on behalf of all the
@@ -168,27 +173,17 @@ extern long sdbm_hash proto((char *, int));
/* This comes after <stdlib.h> so we don't try to change the standard
* library prototypes; we'll use our own instead. */
-#if defined(MYMALLOC) && (defined(HIDEMYMALLOC) || defined(EMBEDMYMALLOC))
-
-# ifdef HIDEMYMALLOC
-# define malloc Mymalloc
-# define calloc Mycalloc
-# define realloc Myremalloc
-# define free Myfree
-# endif
-# ifdef EMBEDMYMALLOC
-# define malloc Perl_malloc
-# define calloc Perl_calloc
-# define realloc Perl_realloc
-# define free Perl_free
-# endif
-
- Malloc_t malloc proto((MEM_SIZE nbytes));
- Malloc_t calloc proto((MEM_SIZE elements, MEM_SIZE size));
- Malloc_t realloc proto((Malloc_t where, MEM_SIZE nbytes));
- Free_t free proto((Malloc_t where));
-
-#endif /* MYMALLOC && (HIDEMYMALLOC || EMBEDMYMALLOC) */
+#if defined(MYMALLOC) && !defined(PERL_POLLUTE_MALLOC)
+# define malloc Perl_malloc
+# define calloc Perl_calloc
+# define realloc Perl_realloc
+# define free Perl_mfree
+
+Malloc_t Perl_malloc proto((MEM_SIZE nbytes));
+Malloc_t Perl_calloc proto((MEM_SIZE elements, MEM_SIZE size));
+Malloc_t Perl_realloc proto((Malloc_t where, MEM_SIZE nbytes));
+Free_t Perl_mfree proto((Malloc_t where));
+#endif /* MYMALLOC */
#ifdef I_STRING
#include <string.h>
diff --git a/contrib/perl5/ext/SDBM_File/typemap b/contrib/perl5/ext/SDBM_File/typemap
index 317a8f3..eeb5d59 100644
--- a/contrib/perl5/ext/SDBM_File/typemap
+++ b/contrib/perl5/ext/SDBM_File/typemap
@@ -2,7 +2,8 @@
#################################### DBM SECTION
#
-datum T_DATUM
+datum_key T_DATUM_K
+datum_value T_DATUM_V
gdatum T_GDATUM
NDBM_File T_PTROBJ
GDBM_File T_PTROBJ
@@ -13,14 +14,23 @@ DBZ_File T_PTROBJ
FATALFUNC T_OPAQUEPTR
INPUT
-T_DATUM
+T_DATUM_K
+ ckFilter($arg, filter_store_key, \"filter_store_key\");
+ $var.dptr = SvPV($arg, PL_na);
+ $var.dsize = (int)PL_na;
+T_DATUM_V
+ ckFilter($arg, filter_store_value, \"filter_store_value\");
$var.dptr = SvPV($arg, PL_na);
$var.dsize = (int)PL_na;
T_GDATUM
UNIMPLEMENTED
OUTPUT
-T_DATUM
+T_DATUM_K
+ sv_setpvn($arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_key,\"filter_fetch_key\");
+T_DATUM_V
sv_setpvn($arg, $var.dptr, $var.dsize);
+ ckFilter($arg, filter_fetch_value,\"filter_fetch_value\");
T_GDATUM
sv_usepvn($arg, $var.dptr, $var.dsize);
T_PTROBJ
diff --git a/contrib/perl5/ext/Socket/Makefile.PL b/contrib/perl5/ext/Socket/Makefile.PL
index 3819143..339c45a 100644
--- a/contrib/perl5/ext/Socket/Makefile.PL
+++ b/contrib/perl5/ext/Socket/Makefile.PL
@@ -1,7 +1,9 @@
use ExtUtils::MakeMaker;
+use Config;
WriteMakefile(
- NAME => 'Socket',
+ NAME => 'Socket',
VERSION_FROM => 'Socket.pm',
- MAN3PODS => {}, # Pods will be built by installman.
- XSPROTOARG => '-noprototypes', # XXX remove later?
+ ($Config{libs} =~ /(-lsocks\S*)/ ? (LIBS => [ "$1" ] ) : ()),
+ MAN3PODS => {}, # Pods will be built by installman.
+ XSPROTOARG => '-noprototypes', # XXX remove later?
);
diff --git a/contrib/perl5/ext/Socket/Socket.pm b/contrib/perl5/ext/Socket/Socket.pm
index 1ed19f7..02f098d 100644
--- a/contrib/perl5/ext/Socket/Socket.pm
+++ b/contrib/perl5/ext/Socket/Socket.pm
@@ -1,7 +1,7 @@
package Socket;
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-$VERSION = "1.7";
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+$VERSION = "1.72";
=head1 NAME
@@ -160,10 +160,11 @@ have AF_UNIX in the right place.
=cut
use Carp;
+use warnings::register;
require Exporter;
-require DynaLoader;
-@ISA = qw(Exporter DynaLoader);
+use XSLoader ();
+@ISA = qw(Exporter);
@EXPORT = qw(
inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in
pack_sockaddr_un unpack_sockaddr_un
@@ -193,6 +194,8 @@ require DynaLoader;
AF_UNIX
AF_UNSPEC
AF_X25
+ IOV_MAX
+ MSG_BCAST
MSG_CTLFLAGS
MSG_CTLIGNORE
MSG_CTRUNC
@@ -203,6 +206,7 @@ require DynaLoader;
MSG_ERRQUEUE
MSG_FIN
MSG_MAXIOVLEN
+ MSG_MCAST
MSG_NOSIGNAL
MSG_OOB
MSG_PEEK
@@ -241,6 +245,9 @@ require DynaLoader;
SCM_CREDS
SCM_RIGHTS
SCM_TIMESTAMP
+ SHUT_RD
+ SHUT_RDWR
+ SHUT_WR
SOCK_DGRAM
SOCK_RAW
SOCK_RDM
@@ -266,9 +273,17 @@ require DynaLoader;
SO_SNDTIMEO
SO_TYPE
SO_USELOOPBACK
+ UIO_MAXIOV
);
-@EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF);
+@EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF
+
+ IPPROTO_TCP
+ TCP_KEEPALIVE
+ TCP_MAXRT
+ TCP_MAXSEG
+ TCP_NODELAY
+ TCP_STDURG);
%EXPORT_TAGS = (
crlf => [qw(CR LF CRLF $CR $LF $CRLF)],
@@ -288,7 +303,8 @@ BEGIN {
sub sockaddr_in {
if (@_ == 6 && !wantarray) { # perl5.001m compat; use this && die
my($af, $port, @quad) = @_;
- carp "6-ARG sockaddr_in call is deprecated" if $^W;
+ warnings::warn "6-ARG sockaddr_in call is deprecated"
+ if warnings::enabled();
pack_sockaddr_in($port, inet_aton(join('.', @quad)));
} elsif (wantarray) {
croak "usage: (port,iaddr) = sockaddr_in(sin_sv)" unless @_ == 1;
@@ -309,6 +325,115 @@ sub sockaddr_un {
}
}
+sub INADDR_ANY ();
+sub INADDR_BROADCAST ();
+sub INADDR_LOOPBACK ();
+sub INADDR_LOOPBACK ();
+
+sub AF_802 ();
+sub AF_APPLETALK ();
+sub AF_CCITT ();
+sub AF_CHAOS ();
+sub AF_DATAKIT ();
+sub AF_DECnet ();
+sub AF_DLI ();
+sub AF_ECMA ();
+sub AF_GOSIP ();
+sub AF_HYLINK ();
+sub AF_IMPLINK ();
+sub AF_INET ();
+sub AF_LAT ();
+sub AF_MAX ();
+sub AF_NBS ();
+sub AF_NIT ();
+sub AF_NS ();
+sub AF_OSI ();
+sub AF_OSINET ();
+sub AF_PUP ();
+sub AF_SNA ();
+sub AF_UNIX ();
+sub AF_UNSPEC ();
+sub AF_X25 ();
+sub IOV_MAX ();
+sub MSG_BCAST ();
+sub MSG_CTLFLAGS ();
+sub MSG_CTLIGNORE ();
+sub MSG_CTRUNC ();
+sub MSG_DONTROUTE ();
+sub MSG_DONTWAIT ();
+sub MSG_EOF ();
+sub MSG_EOR ();
+sub MSG_ERRQUEUE ();
+sub MSG_FIN ();
+sub MSG_MAXIOVLEN ();
+sub MSG_MCAST ();
+sub MSG_NOSIGNAL ();
+sub MSG_OOB ();
+sub MSG_PEEK ();
+sub MSG_PROXY ();
+sub MSG_RST ();
+sub MSG_SYN ();
+sub MSG_TRUNC ();
+sub MSG_URG ();
+sub MSG_WAITALL ();
+sub PF_802 ();
+sub PF_APPLETALK ();
+sub PF_CCITT ();
+sub PF_CHAOS ();
+sub PF_DATAKIT ();
+sub PF_DECnet ();
+sub PF_DLI ();
+sub PF_ECMA ();
+sub PF_GOSIP ();
+sub PF_HYLINK ();
+sub PF_IMPLINK ();
+sub PF_INET ();
+sub PF_LAT ();
+sub PF_MAX ();
+sub PF_NBS ();
+sub PF_NIT ();
+sub PF_NS ();
+sub PF_OSI ();
+sub PF_OSINET ();
+sub PF_PUP ();
+sub PF_SNA ();
+sub PF_UNIX ();
+sub PF_UNSPEC ();
+sub PF_X25 ();
+sub SCM_CONNECT ();
+sub SCM_CREDENTIALS ();
+sub SCM_CREDS ();
+sub SCM_RIGHTS ();
+sub SCM_TIMESTAMP ();
+sub SHUT_RD ();
+sub SHUT_RDWR ();
+sub SHUT_WR ();
+sub SOCK_DGRAM ();
+sub SOCK_RAW ();
+sub SOCK_RDM ();
+sub SOCK_SEQPACKET ();
+sub SOCK_STREAM ();
+sub SOL_SOCKET ();
+sub SOMAXCONN ();
+sub SO_ACCEPTCONN ();
+sub SO_BROADCAST ();
+sub SO_DEBUG ();
+sub SO_DONTLINGER ();
+sub SO_DONTROUTE ();
+sub SO_ERROR ();
+sub SO_KEEPALIVE ();
+sub SO_LINGER ();
+sub SO_OOBINLINE ();
+sub SO_RCVBUF ();
+sub SO_RCVLOWAT ();
+sub SO_RCVTIMEO ();
+sub SO_REUSEADDR ();
+sub SO_SNDBUF ();
+sub SO_SNDLOWAT ();
+sub SO_SNDTIMEO ();
+sub SO_TYPE ();
+sub SO_USELOOPBACK ();
+sub UIO_MAXIOV ();
sub AUTOLOAD {
my($constname);
@@ -318,10 +443,10 @@ sub AUTOLOAD {
my ($pack,$file,$line) = caller;
croak "Your vendor has not defined Socket macro $constname, used";
}
- eval "sub $AUTOLOAD { $val }";
+ eval "sub $AUTOLOAD () { $val }";
goto &$AUTOLOAD;
}
-bootstrap Socket $VERSION;
+XSLoader::load 'Socket', $VERSION;
1;
diff --git a/contrib/perl5/ext/Socket/Socket.xs b/contrib/perl5/ext/Socket/Socket.xs
index 0bd6e59..0584e78 100644
--- a/contrib/perl5/ext/Socket/Socket.xs
+++ b/contrib/perl5/ext/Socket/Socket.xs
@@ -1,3 +1,4 @@
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
@@ -6,42 +7,58 @@
# ifdef I_SYS_TYPES
# include <sys/types.h>
# endif
-#include <sys/socket.h>
-#ifdef MPE
-# define PF_INET AF_INET
-# define PF_UNIX AF_UNIX
-# define SOCK_RAW 3
-#endif
-#ifdef I_SYS_UN
-#include <sys/un.h>
-#endif
+# include <sys/socket.h>
+# if defined(USE_SOCKS) && defined(I_SOCKS)
+# include <socks.h>
+# endif
+# ifdef MPE
+# define PF_INET AF_INET
+# define PF_UNIX AF_UNIX
+# define SOCK_RAW 3
+# endif
+# ifdef I_SYS_UN
+# include <sys/un.h>
+# endif
+/* XXX Configure test for <netinet/in_systm.h needed XXX */
+# if defined(NeXT) || defined(__NeXT__)
+# include <netinet/in_systm.h>
+# endif
# ifdef I_NETINET_IN
# include <netinet/in.h>
# endif
-#include <netdb.h>
-#ifdef I_ARPA_INET
-# include <arpa/inet.h>
-#endif
+# ifdef I_NETDB
+# include <netdb.h>
+# endif
+# ifdef I_ARPA_INET
+# include <arpa/inet.h>
+# endif
+# ifdef I_NETINET_TCP
+# include <netinet/tcp.h>
+# endif
#else
-#include "sockadapt.h"
+# include "sockadapt.h"
+#endif
+
+#ifdef I_SYSUIO
+# include <sys/uio.h>
#endif
#ifndef AF_NBS
-#undef PF_NBS
+# undef PF_NBS
#endif
#ifndef AF_X25
-#undef PF_X25
+# undef PF_X25
#endif
#ifndef INADDR_NONE
-#define INADDR_NONE 0xffffffff
+# define INADDR_NONE 0xffffffff
#endif /* INADDR_NONE */
#ifndef INADDR_BROADCAST
-#define INADDR_BROADCAST 0xffffffff
+# define INADDR_BROADCAST 0xffffffff
#endif /* INADDR_BROADCAST */
#ifndef INADDR_LOOPBACK
-#define INADDR_LOOPBACK 0x7F000001
+# define INADDR_LOOPBACK 0x7F000001
#endif /* INADDR_LOOPBACK */
#ifndef HAS_INET_ATON
@@ -56,6 +73,7 @@
static int
my_inet_aton(register const char *cp, struct in_addr *addr)
{
+ dTHX;
register U32 val;
register int base;
register char c;
@@ -322,6 +340,18 @@ constant(char *name, int arg)
case 'H':
break;
case 'I':
+ if (strEQ(name, "IOV_MAX"))
+#ifdef IOV_MAX
+ return IOV_MAX;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "IPPROTO_TCP"))
+#ifdef IPPROTO_TCP
+ return IPPROTO_TCP;
+#else
+ goto not_there;
+#endif
break;
case 'J':
break;
@@ -330,6 +360,12 @@ constant(char *name, int arg)
case 'L':
break;
case 'M':
+ if (strEQ(name, "MSG_BCAST"))
+#ifdef MSG_BCAST
+ return MSG_BCAST;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "MSG_CTLFLAGS"))
#ifdef MSG_CTLFLAGS
return MSG_CTLFLAGS;
@@ -390,6 +426,12 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "MSG_MCAST"))
+#ifdef MSG_MCAST
+ return MSG_MCAST;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "MSG_NOSIGNAL"))
#ifdef MSG_NOSIGNAL
return MSG_NOSIGNAL;
@@ -624,6 +666,24 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "SHUT_RD"))
+#ifdef SHUT_RD
+ return SHUT_RD;
+#else
+ return 0;
+#endif
+ if (strEQ(name, "SHUT_RDWR"))
+#ifdef SHUT_RDWR
+ return SHUT_RDWR;
+#else
+ return 2;
+#endif
+ if (strEQ(name, "SHUT_WR"))
+#ifdef SHUT_WR
+ return SHUT_WR;
+#else
+ return 1;
+#endif
if (strEQ(name, "SOCK_DGRAM"))
#ifdef SOCK_DGRAM
return SOCK_DGRAM;
@@ -782,8 +842,44 @@ constant(char *name, int arg)
#endif
break;
case 'T':
+ if (strEQ(name, "TCP_KEEPALIVE"))
+#ifdef TCP_KEEPALIVE
+ return TCP_KEEPALIVE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "TCP_MAXRT"))
+#ifdef TCP_MAXRT
+ return TCP_MAXRT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "TCP_MAXSEG"))
+#ifdef TCP_MAXSEG
+ return TCP_MAXSEG;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "TCP_NODELAY"))
+#ifdef TCP_NODELAY
+ return TCP_NODELAY;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "TCP_STDURG"))
+#ifdef TCP_STDURG
+ return TCP_STDURG;
+#else
+ goto not_there;
+#endif
break;
case 'U':
+ if (strEQ(name, "UIO_MAXIOV"))
+#ifdef UIO_MAXIOV
+ return UIO_MAXIOV;
+#else
+ goto not_there;
+#endif
break;
case 'V':
break;
@@ -851,7 +947,7 @@ inet_ntoa(ip_address_sv)
Copy( ip_address, &addr, sizeof addr, char );
addr_str = inet_ntoa(addr);
- ST(0) = sv_2mortal(newSVpv(addr_str, strlen(addr_str)));
+ ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
}
void
@@ -862,13 +958,38 @@ pack_sockaddr_un(pathname)
#ifdef I_SYS_UN
struct sockaddr_un sun_ad; /* fear using sun */
STRLEN len;
+
Zero( &sun_ad, sizeof sun_ad, char );
sun_ad.sun_family = AF_UNIX;
len = strlen(pathname);
if (len > sizeof(sun_ad.sun_path))
len = sizeof(sun_ad.sun_path);
+# ifdef OS2 /* Name should start with \socket\ and contain backslashes! */
+ {
+ int off;
+ char *s, *e;
+
+ if (pathname[0] != '/' && pathname[0] != '\\')
+ croak("Relative UNIX domain socket name '%s' unsupported", pathname);
+ else if (len < 8
+ || pathname[7] != '/' && pathname[7] != '\\'
+ || !strnicmp(pathname + 1, "socket", 6))
+ off = 7;
+ else
+ off = 0; /* Preserve names starting with \socket\ */
+ Copy( "\\socket", sun_ad.sun_path, off, char);
+ Copy( pathname, sun_ad.sun_path + off, len, char );
+
+ s = sun_ad.sun_path + off - 1;
+ e = s + len + 1;
+ while (++s < e)
+ if (*s = '/')
+ *s = '\\';
+ }
+# else /* !( defined OS2 ) */
Copy( pathname, sun_ad.sun_path, len, char );
- ST(0) = sv_2mortal(newSVpv((char *)&sun_ad, sizeof sun_ad));
+# endif
+ ST(0) = sv_2mortal(newSVpvn((char *)&sun_ad, sizeof sun_ad));
#else
ST(0) = (SV *) not_here("pack_sockaddr_un");
#endif
@@ -903,7 +1024,7 @@ unpack_sockaddr_un(sun_sv)
e = addr.sun_path;
while (*e && e < addr.sun_path + sizeof addr.sun_path)
++e;
- ST(0) = sv_2mortal(newSVpv(addr.sun_path, e - addr.sun_path));
+ ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path));
#else
ST(0) = (SV *) not_here("unpack_sockaddr_un");
#endif
@@ -922,7 +1043,7 @@ pack_sockaddr_in(port,ip_address)
sin.sin_port = htons(port);
Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );
- ST(0) = sv_2mortal(newSVpv((char *)&sin, sizeof sin));
+ ST(0) = sv_2mortal(newSVpvn((char *)&sin, sizeof sin));
}
void
@@ -952,7 +1073,7 @@ unpack_sockaddr_in(sin_sv)
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv((IV) port)));
- PUSHs(sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address)));
+ PUSHs(sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address)));
}
void
@@ -961,7 +1082,7 @@ INADDR_ANY()
{
struct in_addr ip_address;
ip_address.s_addr = htonl(INADDR_ANY);
- ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address ));
+ ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));
}
void
@@ -970,7 +1091,7 @@ INADDR_LOOPBACK()
{
struct in_addr ip_address;
ip_address.s_addr = htonl(INADDR_LOOPBACK);
- ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
+ ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
}
void
@@ -979,7 +1100,7 @@ INADDR_NONE()
{
struct in_addr ip_address;
ip_address.s_addr = htonl(INADDR_NONE);
- ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
+ ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
}
void
@@ -988,5 +1109,5 @@ INADDR_BROADCAST()
{
struct in_addr ip_address;
ip_address.s_addr = htonl(INADDR_BROADCAST);
- ST(0) = sv_2mortal(newSVpv((char *)&ip_address,sizeof ip_address));
+ ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));
}
diff --git a/contrib/perl5/ext/Sys/Hostname/Hostname.pm b/contrib/perl5/ext/Sys/Hostname/Hostname.pm
new file mode 100644
index 0000000..1efc897
--- /dev/null
+++ b/contrib/perl5/ext/Sys/Hostname/Hostname.pm
@@ -0,0 +1,153 @@
+package Sys::Hostname;
+
+use strict;
+
+use Carp;
+
+require Exporter;
+use XSLoader ();
+require AutoLoader;
+
+our @ISA = qw/ Exporter AutoLoader /;
+our @EXPORT = qw/ hostname /;
+
+our $VERSION = '1.1';
+
+our $host;
+
+XSLoader::load 'Sys::Hostname', $VERSION;
+
+sub hostname {
+
+ # method 1 - we already know it
+ return $host if defined $host;
+
+ # method 1' - try to ask the system
+ $host = ghname();
+ return $host if defined $host;
+
+ if ($^O eq 'VMS') {
+
+ # method 2 - no sockets ==> return DECnet node name
+ eval { local $SIG{__DIE__}; $host = (gethostbyname('me'))[0] };
+ if ($@) { return $host = $ENV{'SYS$NODE'}; }
+
+ # method 3 - has someone else done the job already? It's common for the
+ # TCP/IP stack to advertise the hostname via a logical name. (Are
+ # there any other logicals which TCP/IP stacks use for the host name?)
+ $host = $ENV{'ARPANET_HOST_NAME'} || $ENV{'INTERNET_HOST_NAME'} ||
+ $ENV{'MULTINET_HOST_NAME'} || $ENV{'UCX$INET_HOST'} ||
+ $ENV{'TCPWARE_DOMAINNAME'} || $ENV{'NEWS_ADDRESS'};
+ return $host if $host;
+
+ # method 4 - does hostname happen to work?
+ my($rslt) = `hostname`;
+ if ($rslt !~ /IVVERB/) { ($host) = $rslt =~ /^(\S+)/; }
+ return $host if $host;
+
+ # rats!
+ $host = '';
+ Carp::croak "Cannot get host name of local machine";
+
+ }
+ elsif ($^O eq 'MSWin32') {
+ ($host) = gethostbyname('localhost');
+ chomp($host = `hostname 2> NUL`) unless defined $host;
+ return $host;
+ }
+ elsif ($^O eq 'epoc') {
+ $host = 'localhost';
+ return $host;
+ }
+ else { # Unix
+ # is anyone going to make it here?
+
+ # method 2 - syscall is preferred since it avoids tainting problems
+ # XXX: is it such a good idea to return hostname untainted?
+ eval {
+ local $SIG{__DIE__};
+ require "syscall.ph";
+ $host = "\0" x 65; ## preload scalar
+ syscall(&SYS_gethostname, $host, 65) == 0;
+ }
+
+ # method 2a - syscall using systeminfo instead of gethostname
+ # -- needed on systems like Solaris
+ || eval {
+ local $SIG{__DIE__};
+ require "sys/syscall.ph";
+ require "sys/systeminfo.ph";
+ $host = "\0" x 65; ## preload scalar
+ syscall(&SYS_systeminfo, &SI_HOSTNAME, $host, 65) != -1;
+ }
+
+ # method 3 - trusty old hostname command
+ || eval {
+ local $SIG{__DIE__};
+ local $SIG{CHLD};
+ $host = `(hostname) 2>/dev/null`; # bsdish
+ }
+
+ # method 4 - use POSIX::uname(), which strictly can't be expected to be
+ # correct
+ || eval {
+ local $SIG{__DIE__};
+ require POSIX;
+ $host = (POSIX::uname())[1];
+ }
+
+ # method 5 - sysV uname command (may truncate)
+ || eval {
+ local $SIG{__DIE__};
+ $host = `uname -n 2>/dev/null`; ## sysVish
+ }
+
+ # method 6 - Apollo pre-SR10
+ || eval {
+ local $SIG{__DIE__};
+ my($a,$b,$c,$d);
+ ($host,$a,$b,$c,$d)=split(/[:\. ]/,`/com/host`,6);
+ }
+
+ # bummer
+ || Carp::croak "Cannot get host name of local machine";
+
+ # remove garbage
+ $host =~ tr/\0\r\n//d;
+ $host;
+ }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Sys::Hostname - Try every conceivable way to get hostname
+
+=head1 SYNOPSIS
+
+ use Sys::Hostname;
+ $host = hostname;
+
+=head1 DESCRIPTION
+
+Attempts several methods of getting the system hostname and
+then caches the result. It tries the first available of the C
+library's gethostname(), C<`$Config{aphostname}`>, uname(2),
+C<syscall(SYS_gethostname)>, C<`hostname`>, C<`uname -n`>,
+and the file F</com/host>. If all that fails it C<croak>s.
+
+All NULs, returns, and newlines are removed from the result.
+
+=head1 AUTHOR
+
+David Sundstrom E<lt>F<sunds@asictest.sc.ti.com>E<gt>
+
+Texas Instruments
+
+XS code added by Greg Bacon E<lt>F<gbacon@cs.uah.edu>E<gt>
+
+=cut
+
diff --git a/contrib/perl5/ext/Sys/Hostname/Hostname.xs b/contrib/perl5/ext/Sys/Hostname/Hostname.xs
new file mode 100644
index 0000000..f104383
--- /dev/null
+++ b/contrib/perl5/ext/Sys/Hostname/Hostname.xs
@@ -0,0 +1,76 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#if defined(I_UNISTD) && defined(HAS_GETHOSTNAME)
+# include <unistd.h>
+#endif
+
+/* a reasonable default */
+#ifndef MAXHOSTNAMELEN
+# define MAXHOSTNAMELEN 256
+#endif
+
+/* swiped from POSIX.xs */
+#if defined(__VMS) && !defined(__POSIX_SOURCE)
+# if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
+# include <utsname.h>
+# endif
+#endif
+
+#ifdef I_SYSUTSNAME
+# include <sys/utsname.h>
+#endif
+
+MODULE = Sys::Hostname PACKAGE = Sys::Hostname
+
+void
+ghname()
+ PREINIT:
+ IV retval = -1;
+ SV *sv;
+ PPCODE:
+ EXTEND(SP, 1);
+#ifdef HAS_GETHOSTNAME
+ {
+ char tmps[MAXHOSTNAMELEN];
+ retval = PerlSock_gethostname(tmps, sizeof(tmps));
+ sv = newSVpvn(tmps, strlen(tmps));
+ }
+#else
+# ifdef HAS_PHOSTNAME
+ {
+ PerlIO *io;
+ char tmps[MAXHOSTNAMELEN];
+ char *p = tmps;
+ char c;
+ io = PerlProc_popen(PHOSTNAME, "r");
+ if (!io)
+ goto check_out;
+ while (PerlIO_read(io, &c, sizeof(c)) == 1) {
+ if (isSPACE(c) || p - tmps >= sizeof(tmps))
+ break;
+ *p++ = c;
+ }
+ PerlProc_pclose(io);
+ *p = '\0';
+ retval = 0;
+ sv = newSVpvn(tmps, strlen(tmps));
+ }
+# else
+# ifdef HAS_UNAME
+ {
+ struct utsname u;
+ if (PerlEnv_uname(&u) == -1)
+ goto check_out;
+ sv = newSVpvn(u.nodename, strlen(u.nodename));
+ retval = 0;
+ }
+# endif
+# endif
+#endif
+ check_out:
+ if (retval == -1)
+ XSRETURN_UNDEF;
+ else
+ PUSHs(sv_2mortal(sv));
diff --git a/contrib/perl5/ext/Sys/Hostname/Makefile.PL b/contrib/perl5/ext/Sys/Hostname/Makefile.PL
new file mode 100644
index 0000000..a0892f6
--- /dev/null
+++ b/contrib/perl5/ext/Sys/Hostname/Makefile.PL
@@ -0,0 +1,8 @@
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+ NAME => 'Sys::Hostname',
+ VERSION_FROM => 'Hostname.pm',
+ MAN3PODS => {}, # Pods will be built by installman.
+ XSPROTOARG => '-noprototypes',
+);
diff --git a/contrib/perl5/ext/Sys/Syslog/Makefile.PL b/contrib/perl5/ext/Sys/Syslog/Makefile.PL
new file mode 100644
index 0000000..e5edf3e
--- /dev/null
+++ b/contrib/perl5/ext/Sys/Syslog/Makefile.PL
@@ -0,0 +1,8 @@
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+ NAME => 'Sys::Syslog',
+ VERSION_FROM => 'Syslog.pm',
+ MAN3PODS => {}, # Pods will be built by installman.
+ XSPROTOARG => '-noprototypes',
+);
diff --git a/contrib/perl5/ext/Sys/Syslog/Syslog.pm b/contrib/perl5/ext/Sys/Syslog/Syslog.pm
new file mode 100644
index 0000000..2a91354
--- /dev/null
+++ b/contrib/perl5/ext/Sys/Syslog/Syslog.pm
@@ -0,0 +1,294 @@
+package Sys::Syslog;
+require 5.000;
+require Exporter;
+require DynaLoader;
+use Carp;
+
+@ISA = qw(Exporter DynaLoader);
+@EXPORT = qw(openlog closelog setlogmask syslog);
+@EXPORT_OK = qw(setlogsock);
+$VERSION = '0.01';
+
+use Socket;
+use Sys::Hostname;
+
+# adapted from syslog.pl
+#
+# Tom Christiansen <tchrist@convex.com>
+# modified to use sockets by Larry Wall <lwall@jpl-devvax.jpl.nasa.gov>
+# NOTE: openlog now takes three arguments, just like openlog(3)
+# Modified to add UNIX domain sockets by Sean Robinson <robinson_s@sc.maricopa.edu>
+# with support from Tim Bunce <Tim.Bunce@ig.co.uk> and the perl5-porters mailing list
+# Modified to use an XS backend instead of syslog.ph by Tom Hughes <tom@compton.nu>
+
+# Todo: enable connect to try all three types before failing (auto setlogsock)?
+
+=head1 NAME
+
+Sys::Syslog, openlog, closelog, setlogmask, syslog - Perl interface to the UNIX syslog(3) calls
+
+=head1 SYNOPSIS
+
+ use Sys::Syslog; # all except setlogsock, or:
+ use Sys::Syslog qw(:DEFAULT setlogsock); # default set, plus setlogsock
+
+ setlogsock $sock_type;
+ openlog $ident, $logopt, $facility;
+ syslog $priority, $format, @args;
+ $oldmask = setlogmask $mask_priority;
+ closelog;
+
+=head1 DESCRIPTION
+
+Sys::Syslog is an interface to the UNIX C<syslog(3)> program.
+Call C<syslog()> with a string priority and a list of C<printf()> args
+just like C<syslog(3)>.
+
+Syslog provides the functions:
+
+=over
+
+=item openlog $ident, $logopt, $facility
+
+I<$ident> is prepended to every message.
+I<$logopt> contains zero or more of the words I<pid>, I<ndelay>, I<cons>, I<nowait>.
+I<$facility> specifies the part of the system
+
+=item syslog $priority, $format, @args
+
+If I<$priority> permits, logs I<($format, @args)>
+printed as by C<printf(3V)>, with the addition that I<%m>
+is replaced with C<"$!"> (the latest error message).
+
+=item setlogmask $mask_priority
+
+Sets log mask I<$mask_priority> and returns the old mask.
+
+=item setlogsock $sock_type (added in 5.004_02)
+
+Sets the socket type to be used for the next call to
+C<openlog()> or C<syslog()> and returns TRUE on success,
+undef on failure.
+
+A value of 'unix' will connect to the UNIX domain socket returned by
+C<_PATH_LOG> in F<syslog.ph>. A value of 'inet' will connect to an
+INET socket returned by getservbyname(). Any other value croaks.
+
+The default is for the INET socket to be used.
+
+=item closelog
+
+Closes the log file.
+
+=back
+
+Note that C<openlog> now takes three arguments, just like C<openlog(3)>.
+
+=head1 EXAMPLES
+
+ openlog($program, 'cons,pid', 'user');
+ syslog('info', 'this is another test');
+ syslog('mail|warning', 'this is a better test: %d', time);
+ closelog();
+
+ syslog('debug', 'this is the last test');
+
+ setlogsock('unix');
+ openlog("$program $$", 'ndelay', 'user');
+ syslog('notice', 'fooprogram: this is really done');
+
+ setlogsock('inet');
+ $! = 55;
+ syslog('info', 'problem was %m'); # %m == $! in syslog(3)
+
+=head1 SEE ALSO
+
+L<syslog(3)>
+
+=head1 AUTHOR
+
+Tom Christiansen E<lt>F<tchrist@perl.com>E<gt> and Larry Wall E<lt>F<larry@wall.org>E<gt>.
+UNIX domain sockets added by Sean Robinson E<lt>F<robinson_s@sc.maricopa.edu>E<gt>
+with support from Tim Bunce <Tim.Bunce@ig.co.uk> and the perl5-porters mailing list.
+Dependency on F<syslog.ph> replaced with XS code bu Tom Hughes E<lt>F<tom@compton.nu>E<gt>.
+
+=cut
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function.
+
+ my $constname;
+ our $AUTOLOAD;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ croak "& not defined" if $constname eq 'constant';
+ my $val = constant($constname);
+ if ($! != 0) {
+ croak "Your vendor has not defined Sys::Syslog macro $constname";
+ }
+ *$AUTOLOAD = sub { $val };
+ goto &$AUTOLOAD;
+}
+
+bootstrap Sys::Syslog $VERSION;
+
+$maskpri = &LOG_UPTO(&LOG_DEBUG);
+
+sub openlog {
+ ($ident, $logopt, $facility) = @_; # package vars
+ $lo_pid = $logopt =~ /\bpid\b/;
+ $lo_ndelay = $logopt =~ /\bndelay\b/;
+ $lo_cons = $logopt =~ /\bcons\b/;
+ $lo_nowait = $logopt =~ /\bnowait\b/;
+ return 1 unless $lo_ndelay;
+ &connect;
+}
+
+sub closelog {
+ $facility = $ident = '';
+ &disconnect;
+}
+
+sub setlogmask {
+ local($oldmask) = $maskpri;
+ $maskpri = shift;
+ $oldmask;
+}
+
+sub setlogsock {
+ local($setsock) = shift;
+ &disconnect if $connected;
+ if (lc($setsock) eq 'unix') {
+ if (defined &_PATH_LOG) {
+ $sock_type = 1;
+ } else {
+ return undef;
+ }
+ } elsif (lc($setsock) eq 'inet') {
+ if (getservbyname('syslog','udp')) {
+ undef($sock_type);
+ } else {
+ return undef;
+ }
+ } else {
+ croak "Invalid argument passed to setlogsock; must be 'unix' or 'inet'";
+ }
+ return 1;
+}
+
+sub syslog {
+ local($priority) = shift;
+ local($mask) = shift;
+ local($message, $whoami);
+ local(@words, $num, $numpri, $numfac, $sum);
+ local($facility) = $facility; # may need to change temporarily.
+
+ croak "syslog: expected both priority and mask" unless $mask && $priority;
+
+ @words = split(/\W+/, $priority, 2);# Allow "level" or "level|facility".
+ undef $numpri;
+ undef $numfac;
+ foreach (@words) {
+ $num = &xlate($_); # Translate word to number.
+ if (/^kern$/ || $num < 0) {
+ croak "syslog: invalid level/facility: $_";
+ }
+ elsif ($num <= &LOG_PRIMASK) {
+ croak "syslog: too many levels given: $_" if defined($numpri);
+ $numpri = $num;
+ return 0 unless &LOG_MASK($numpri) & $maskpri;
+ }
+ else {
+ croak "syslog: too many facilities given: $_" if defined($numfac);
+ $facility = $_;
+ $numfac = $num;
+ }
+ }
+
+ croak "syslog: level must be given" unless defined($numpri);
+
+ if (!defined($numfac)) { # Facility not specified in this call.
+ $facility = 'user' unless $facility;
+ $numfac = &xlate($facility);
+ }
+
+ &connect unless $connected;
+
+ $whoami = $ident;
+
+ if (!$whoami && $mask =~ /^(\S.*?):\s?(.*)/) {
+ $whoami = $1;
+ $mask = $2;
+ }
+
+ unless ($whoami) {
+ ($whoami = getlogin) ||
+ ($whoami = getpwuid($<)) ||
+ ($whoami = 'syslog');
+ }
+
+ $whoami .= "[$$]" if $lo_pid;
+
+ $mask =~ s/%m/$!/g;
+ $mask .= "\n" unless $mask =~ /\n$/;
+ $message = sprintf ($mask, @_);
+
+ $sum = $numpri + $numfac;
+ unless (send(SYSLOG,"<$sum>$whoami: $message\0",0)) {
+ if ($lo_cons) {
+ if ($pid = fork) {
+ unless ($lo_nowait) {
+ $died = waitpid($pid, 0);
+ }
+ }
+ else {
+ if (open(CONS,">/dev/console")) {
+ print CONS "<$facility.$priority>$whoami: $message\r";
+ exit if defined $pid; # if fork failed, we're parent
+ close CONS;
+ }
+ }
+ }
+ }
+}
+
+sub xlate {
+ local($name) = @_;
+ $name = uc $name;
+ $name = "LOG_$name" unless $name =~ /^LOG_/;
+ $name = "Sys::Syslog::$name";
+ eval { &$name } || -1;
+}
+
+sub connect {
+ unless ($host) {
+ require Sys::Hostname;
+ my($host_uniq) = Sys::Hostname::hostname();
+ ($host) = $host_uniq =~ /([A-Za-z0-9_.-]+)/; # allow FQDN (inc _)
+ }
+ unless ( $sock_type ) {
+ my $udp = getprotobyname('udp');
+ my $syslog = getservbyname('syslog','udp');
+ my $this = sockaddr_in($syslog, INADDR_ANY);
+ my $that = sockaddr_in($syslog, inet_aton($host) || croak "Can't lookup $host");
+ socket(SYSLOG,AF_INET,SOCK_DGRAM,$udp) || croak "socket: $!";
+ connect(SYSLOG,$that) || croak "connect: $!";
+ } else {
+ my $syslog = &_PATH_LOG || croak "_PATH_LOG not found in syslog.ph";
+ my $that = sockaddr_un($syslog) || croak "Can't locate $syslog";
+ socket(SYSLOG,AF_UNIX,SOCK_STREAM,0) || croak "socket: $!";
+ if (!connect(SYSLOG,$that)) {
+ socket(SYSLOG,AF_UNIX,SOCK_DGRAM,0) || croak "socket: $!";
+ connect(SYSLOG,$that) || croak "connect: $! (SOCK_DGRAM after trying SOCK_STREAM)";
+ }
+ }
+ local($old) = select(SYSLOG); $| = 1; select($old);
+ $connected = 1;
+}
+
+sub disconnect {
+ close SYSLOG;
+ $connected = 0;
+}
+
+1;
diff --git a/contrib/perl5/ext/Sys/Syslog/Syslog.xs b/contrib/perl5/ext/Sys/Syslog/Syslog.xs
new file mode 100644
index 0000000..f0573b8
--- /dev/null
+++ b/contrib/perl5/ext/Sys/Syslog/Syslog.xs
@@ -0,0 +1,642 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifdef I_SYSLOG
+#include <syslog.h>
+#endif
+
+static double
+constant_LOG_NO(char *name, int len)
+{
+ switch (name[6 + 0]) {
+ case 'T':
+ if (strEQ(name + 6, "TICE")) { /* LOG_NO removed */
+#ifdef LOG_NOTICE
+ return LOG_NOTICE;
+#else
+ goto not_there;
+#endif
+ }
+ case 'W':
+ if (strEQ(name + 6, "WAIT")) { /* LOG_NO removed */
+#ifdef LOG_NOWAIT
+ return LOG_NOWAIT;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_N(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'D':
+ if (strEQ(name + 5, "DELAY")) { /* LOG_N removed */
+#ifdef LOG_NDELAY
+ return LOG_NDELAY;
+#else
+ goto not_there;
+#endif
+ }
+ case 'E':
+ if (strEQ(name + 5, "EWS")) { /* LOG_N removed */
+#ifdef LOG_NEWS
+ return LOG_NEWS;
+#else
+ goto not_there;
+#endif
+ }
+ case 'F':
+ if (strEQ(name + 5, "FACILITIES")) { /* LOG_N removed */
+#ifdef LOG_NFACILITIES
+ return LOG_NFACILITIES;
+#else
+ goto not_there;
+#endif
+ }
+ case 'O':
+ return constant_LOG_NO(name, len);
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_P(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'I':
+ if (strEQ(name + 5, "ID")) { /* LOG_P removed */
+#ifdef LOG_PID
+ return LOG_PID;
+#else
+ goto not_there;
+#endif
+ }
+ case 'R':
+ if (strEQ(name + 5, "RIMASK")) { /* LOG_P removed */
+#ifdef LOG_PRIMASK
+ return LOG_PRIMASK;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_AU(char *name, int len)
+{
+ if (6 + 2 >= len ) {
+ errno = EINVAL;
+ return 0;
+ }
+ switch (name[6 + 2]) {
+ case '\0':
+ if (strEQ(name + 6, "TH")) { /* LOG_AU removed */
+#ifdef LOG_AUTH
+ return LOG_AUTH;
+#else
+ goto not_there;
+#endif
+ }
+ case 'P':
+ if (strEQ(name + 6, "THPRIV")) { /* LOG_AU removed */
+#ifdef LOG_AUTHPRIV
+ return LOG_AUTHPRIV;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_A(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'L':
+ if (strEQ(name + 5, "LERT")) { /* LOG_A removed */
+#ifdef LOG_ALERT
+ return LOG_ALERT;
+#else
+ goto not_there;
+#endif
+ }
+ case 'U':
+ return constant_LOG_AU(name, len);
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_CR(char *name, int len)
+{
+ switch (name[6 + 0]) {
+ case 'I':
+ if (strEQ(name + 6, "IT")) { /* LOG_CR removed */
+#ifdef LOG_CRIT
+ return LOG_CRIT;
+#else
+ goto not_there;
+#endif
+ }
+ case 'O':
+ if (strEQ(name + 6, "ON")) { /* LOG_CR removed */
+#ifdef LOG_CRON
+ return LOG_CRON;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_C(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'O':
+ if (strEQ(name + 5, "ONS")) { /* LOG_C removed */
+#ifdef LOG_CONS
+ return LOG_CONS;
+#else
+ goto not_there;
+#endif
+ }
+ case 'R':
+ return constant_LOG_CR(name, len);
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_D(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'A':
+ if (strEQ(name + 5, "AEMON")) { /* LOG_D removed */
+#ifdef LOG_DAEMON
+ return LOG_DAEMON;
+#else
+ goto not_there;
+#endif
+ }
+ case 'E':
+ if (strEQ(name + 5, "EBUG")) { /* LOG_D removed */
+#ifdef LOG_DEBUG
+ return LOG_DEBUG;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_U(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'S':
+ if (strEQ(name + 5, "SER")) { /* LOG_U removed */
+#ifdef LOG_USER
+ return LOG_USER;
+#else
+ goto not_there;
+#endif
+ }
+ case 'U':
+ if (strEQ(name + 5, "UCP")) { /* LOG_U removed */
+#ifdef LOG_UUCP
+ return LOG_UUCP;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_E(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'M':
+ if (strEQ(name + 5, "MERG")) { /* LOG_E removed */
+#ifdef LOG_EMERG
+ return LOG_EMERG;
+#else
+ goto not_there;
+#endif
+ }
+ case 'R':
+ if (strEQ(name + 5, "RR")) { /* LOG_E removed */
+#ifdef LOG_ERR
+ return LOG_ERR;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_F(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'A':
+ if (strEQ(name + 5, "ACMASK")) { /* LOG_F removed */
+#ifdef LOG_FACMASK
+ return LOG_FACMASK;
+#else
+ goto not_there;
+#endif
+ }
+ case 'T':
+ if (strEQ(name + 5, "TP")) { /* LOG_F removed */
+#ifdef LOG_FTP
+ return LOG_FTP;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_LO(char *name, int len)
+{
+ if (6 + 3 >= len ) {
+ errno = EINVAL;
+ return 0;
+ }
+ switch (name[6 + 3]) {
+ case '0':
+ if (strEQ(name + 6, "CAL0")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL0
+ return LOG_LOCAL0;
+#else
+ goto not_there;
+#endif
+ }
+ case '1':
+ if (strEQ(name + 6, "CAL1")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL1
+ return LOG_LOCAL1;
+#else
+ goto not_there;
+#endif
+ }
+ case '2':
+ if (strEQ(name + 6, "CAL2")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL2
+ return LOG_LOCAL2;
+#else
+ goto not_there;
+#endif
+ }
+ case '3':
+ if (strEQ(name + 6, "CAL3")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL3
+ return LOG_LOCAL3;
+#else
+ goto not_there;
+#endif
+ }
+ case '4':
+ if (strEQ(name + 6, "CAL4")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL4
+ return LOG_LOCAL4;
+#else
+ goto not_there;
+#endif
+ }
+ case '5':
+ if (strEQ(name + 6, "CAL5")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL5
+ return LOG_LOCAL5;
+#else
+ goto not_there;
+#endif
+ }
+ case '6':
+ if (strEQ(name + 6, "CAL6")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL6
+ return LOG_LOCAL6;
+#else
+ goto not_there;
+#endif
+ }
+ case '7':
+ if (strEQ(name + 6, "CAL7")) { /* LOG_LO removed */
+#ifdef LOG_LOCAL7
+ return LOG_LOCAL7;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant_LOG_L(char *name, int len)
+{
+ switch (name[5 + 0]) {
+ case 'F':
+ if (strEQ(name + 5, "FMT")) { /* LOG_L removed */
+#ifdef LOG_LFMT
+ return LOG_LFMT;
+#else
+ goto not_there;
+#endif
+ }
+ case 'O':
+ return constant_LOG_LO(name, len);
+ case 'P':
+ if (strEQ(name + 5, "PR")) { /* LOG_L removed */
+#ifdef LOG_LPR
+ return LOG_LPR;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+static double
+constant(char *name, int len)
+{
+ errno = 0;
+ if (0 + 4 >= len ) {
+ errno = EINVAL;
+ return 0;
+ }
+ switch (name[0 + 4]) {
+ case 'A':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_A(name, len);
+ case 'C':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_C(name, len);
+ case 'D':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_D(name, len);
+ case 'E':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_E(name, len);
+ case 'F':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_F(name, len);
+ case 'I':
+ if (strEQ(name + 0, "LOG_INFO")) { /* removed */
+#ifdef LOG_INFO
+ return LOG_INFO;
+#else
+ goto not_there;
+#endif
+ }
+ case 'K':
+ if (strEQ(name + 0, "LOG_KERN")) { /* removed */
+#ifdef LOG_KERN
+ return LOG_KERN;
+#else
+ goto not_there;
+#endif
+ }
+ case 'L':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_L(name, len);
+ case 'M':
+ if (strEQ(name + 0, "LOG_MAIL")) { /* removed */
+#ifdef LOG_MAIL
+ return LOG_MAIL;
+#else
+ goto not_there;
+#endif
+ }
+ case 'N':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_N(name, len);
+ case 'O':
+ if (strEQ(name + 0, "LOG_ODELAY")) { /* removed */
+#ifdef LOG_ODELAY
+ return LOG_ODELAY;
+#else
+ goto not_there;
+#endif
+ }
+ case 'P':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_P(name, len);
+ case 'S':
+ if (strEQ(name + 0, "LOG_SYSLOG")) { /* removed */
+#ifdef LOG_SYSLOG
+ return LOG_SYSLOG;
+#else
+ goto not_there;
+#endif
+ }
+ case 'U':
+ if (!strnEQ(name + 0,"LOG_", 4))
+ break;
+ return constant_LOG_U(name, len);
+ case 'W':
+ if (strEQ(name + 0, "LOG_WARNING")) { /* removed */
+#ifdef LOG_WARNING
+ return LOG_WARNING;
+#else
+ goto not_there;
+#endif
+ }
+ }
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+
+MODULE = Sys::Syslog PACKAGE = Sys::Syslog
+
+char *
+_PATH_LOG()
+ CODE:
+#ifdef _PATH_LOG
+ RETVAL = _PATH_LOG;
+#else
+ croak("Your vendor has not defined the Sys::Syslog macro _PATH_LOG");
+ RETVAL = NULL;
+#endif
+ OUTPUT:
+ RETVAL
+
+int
+LOG_FAC(p)
+ INPUT:
+ int p
+ CODE:
+#ifdef LOG_FAC
+ RETVAL = LOG_FAC(p);
+#else
+ croak("Your vendor has not defined the Sys::Syslog macro LOG_FAC");
+ RETVAL = -1;
+#endif
+ OUTPUT:
+ RETVAL
+
+int
+LOG_PRI(p)
+ INPUT:
+ int p
+ CODE:
+#ifdef LOG_PRI
+ RETVAL = LOG_PRI(p);
+#else
+ croak("Your vendor has not defined the Sys::Syslog macro LOG_PRI");
+ RETVAL = -1;
+#endif
+ OUTPUT:
+ RETVAL
+
+int
+LOG_MAKEPRI(fac,pri)
+ INPUT:
+ int fac
+ int pri
+ CODE:
+#ifdef LOG_MAKEPRI
+ RETVAL = LOG_MAKEPRI(fac,pri);
+#else
+ croak("Your vendor has not defined the Sys::Syslog macro LOG_MAKEPRI");
+ RETVAL = -1;
+#endif
+ OUTPUT:
+ RETVAL
+
+int
+LOG_MASK(pri)
+ INPUT:
+ int pri
+ CODE:
+#ifdef LOG_MASK
+ RETVAL = LOG_MASK(pri);
+#else
+ croak("Your vendor has not defined the Sys::Syslog macro LOG_MASK");
+ RETVAL = -1;
+#endif
+ OUTPUT:
+ RETVAL
+
+int
+LOG_UPTO(pri)
+ INPUT:
+ int pri
+ CODE:
+#ifdef LOG_UPTO
+ RETVAL = LOG_UPTO(pri);
+#else
+ croak("Your vendor has not defined the Sys::Syslog macro LOG_UPTO");
+ RETVAL = -1;
+#endif
+ OUTPUT:
+ RETVAL
+
+
+double
+constant(sv)
+ PREINIT:
+ STRLEN len;
+ INPUT:
+ SV * sv
+ char * s = SvPV(sv, len);
+ CODE:
+ RETVAL = constant(s,len);
+ OUTPUT:
+ RETVAL
+
diff --git a/contrib/perl5/ext/Thread/Thread.pm b/contrib/perl5/ext/Thread/Thread.pm
index c8bca0d..00cba8a 100644
--- a/contrib/perl5/ext/Thread/Thread.pm
+++ b/contrib/perl5/ext/Thread/Thread.pm
@@ -1,16 +1,16 @@
package Thread;
require Exporter;
-require DynaLoader;
-use vars qw($VERSION @ISA @EXPORT);
+use XSLoader ();
+our($VERSION, @ISA, @EXPORT);
$VERSION = "1.0";
-@ISA = qw(Exporter DynaLoader);
+@ISA = qw(Exporter);
@EXPORT_OK = qw(yield cond_signal cond_broadcast cond_wait async);
=head1 NAME
-Thread - multithreading
+Thread - manipulate threads in Perl (EXPERIMENTAL, subject to change)
=head1 SYNOPSIS
@@ -18,20 +18,32 @@ Thread - multithreading
my $t = new Thread \&start_sub, @start_args;
- $t->join;
+ $result = $t->join;
+ $result = $t->eval;
+ $t->detach;
- my $tid = Thread->self->tid;
+ if($t->equal($another_thread)) {
+ # ...
+ }
+ my $tid = Thread->self->tid;
my $tlist = Thread->list;
lock($scalar);
+ yield();
use Thread 'async';
- use Thread 'eval';
-
=head1 DESCRIPTION
+ WARNING: Threading is an experimental feature. Both the interface
+ and implementation are subject to change drastically. In fact, this
+ documentation describes the flavor of threads that was in version
+ 5.005. Perl 5.6.0 and later have the beginnings of support for
+ interpreter threads, which (when finished) is expected to be
+ significantly different from what is described here. The information
+ contained here may therefore soon be obsolete. Use at your own risk!
+
The C<Thread> module provides multithreading support for perl.
=head1 FUNCTIONS
@@ -70,8 +82,8 @@ of that container are not locked. For example, if a thread does a C<lock
You may also C<lock> a sub, using C<lock &sub>. Any calls to that sub from
another thread will block until the lock is released. This behaviour is not
-equvalent to C<use attrs qw(locked)> in the sub. C<use attrs qw(locked)>
-serializes access to a subroutine, but allows different threads
+equivalent to declaring the sub with the C<locked> attribute. The C<locked>
+attribute serializes access to a subroutine, but allows different threads
non-simultaneous access. C<lock &sub>, on the other hand, will not allow
I<any> other thread access for the duration of the lock.
@@ -122,6 +134,11 @@ The C<cond_broadcast> function works similarly to C<cond_wait>.
C<cond_broadcast>, though, will unblock B<all> the threads that are blocked
in a C<cond_wait> on the locked variable, rather than only one.
+=item yield
+
+The C<yield> function allows another thread to take control of the
+CPU. The exact results are implementation-dependent.
+
=back
=head1 METHODS
@@ -145,6 +162,18 @@ The C<eval> method wraps an C<eval> around a C<join>, and so waits for a
thread to exit, passing along any values the thread might have returned.
Errors, of course, get placed into C<$@>.
+=item detach
+
+C<detach> tells a thread that it is never going to be joined i.e.
+that all traces of its existence can be removed once it stops running.
+Errors in detached threads will not be visible anywhere - if you want
+to catch them, you should use $SIG{__DIE__} or something like that.
+
+=item equal
+
+C<equal> tests whether two thread objects represent the same thread and
+returns true if they do.
+
=item tid
The C<tid> method returns the tid of a thread. The tid is a monotonically
@@ -152,6 +181,8 @@ increasing integer assigned when a thread is created. The main thread of a
program will have a tid of zero, while subsequent threads will have tids
assigned starting with one.
+=back
+
=head1 LIMITATIONS
The sequence number used to assign tids is a simple integer, and no
@@ -161,7 +192,7 @@ duplicate tids. This limitation may be lifted in a future version of Perl.
=head1 SEE ALSO
-L<attrs>, L<Thread::Queue>, L<Thread::Semaphore>, L<Thread::Specific>.
+L<attributes>, L<Thread::Queue>, L<Thread::Semaphore>, L<Thread::Specific>.
=cut
@@ -180,6 +211,6 @@ sub eval {
return eval { shift->join; };
}
-bootstrap Thread;
+XSLoader::load 'Thread';
1;
diff --git a/contrib/perl5/ext/Thread/Thread.xs b/contrib/perl5/ext/Thread/Thread.xs
index 2337e8c..4b5e6db 100644
--- a/contrib/perl5/ext/Thread/Thread.xs
+++ b/contrib/perl5/ext/Thread/Thread.xs
@@ -1,3 +1,4 @@
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
@@ -20,16 +21,17 @@ static int sig_pipe[2];
#endif
static void
-remove_thread(struct perl_thread *t)
+remove_thread(pTHX_ struct perl_thread *t)
{
#ifdef USE_THREADS
- DEBUG_S(WITH_THR(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(WITH_THR(PerlIO_printf(Perl_debug_log,
"%p: remove_thread %p\n", thr, t)));
MUTEX_LOCK(&PL_threads_mutex);
MUTEX_DESTROY(&t->mutex);
PL_nthreads--;
t->prev->next = t->next;
t->next->prev = t->prev;
+ SvREFCNT_dec(t->oursv);
COND_BROADCAST(&PL_nthreads_cond);
MUTEX_UNLOCK(&PL_threads_mutex);
#endif
@@ -48,7 +50,7 @@ threadstart(void *arg)
AV *av;
int i;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "new thread %p starting at %s\n",
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "new thread %p starting at %s\n",
thr, SvPEEK(TOPs)));
thr = (Thread) arg;
savemark = TOPMARK;
@@ -68,7 +70,7 @@ threadstart(void *arg)
myop.op_flags |= OPf_WANT_LIST;
PL_op = pp_entersub(ARGS);
DEBUG_S(if (!PL_op)
- PerlIO_printf(PerlIO_stderr(), "thread starts at Nullop\n"));
+ PerlIO_printf(Perl_debug_log, "thread starts at Nullop\n"));
/*
* When this thread is next scheduled, we start in the right
* place. When the thread runs off the end of the sub, perl.c
@@ -85,13 +87,18 @@ threadstart(void *arg)
I32 oldscope = PL_scopestack_ix;
I32 retval;
SV *sv;
- AV *av = newAV();
+ AV *av;
int i, ret;
dJMPENV;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "new thread %p waiting to start\n",
+
+#if defined(MULTIPLICITY)
+ PERL_SET_INTERP(thr->interp);
+#endif
+
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "new thread %p waiting to start\n",
thr));
- /* Don't call *anything* requiring dTHR until after SET_THR() */
+ /* Don't call *anything* requiring dTHR until after PERL_SET_THX() */
/*
* Wait until our creator releases us. If we didn't do this, then
* it would be potentially possible for out thread to carry on and
@@ -107,12 +114,13 @@ threadstart(void *arg)
* from our pthread_t structure to our struct perl_thread, since
* we're the only thread who can get at it anyway.
*/
- SET_THR(thr);
+ PERL_SET_THX(thr);
/* Only now can we use SvPEEK (which calls sv_newmortal which does dTHR) */
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "new thread %p starting at %s\n",
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "new thread %p starting at %s\n",
thr, SvPEEK(TOPs)));
+ av = newAV();
sv = POPs;
PUTBACK;
ENTER;
@@ -122,18 +130,18 @@ threadstart(void *arg)
retval = SP - (PL_stack_base + oldmark);
SP = PL_stack_base + oldmark + 1;
if (SvCUR(thr->errsv)) {
- STRLEN n_a;
MUTEX_LOCK(&thr->mutex);
thr->flags |= THRf_DID_DIE;
MUTEX_UNLOCK(&thr->mutex);
av_store(av, 0, &PL_sv_no);
av_store(av, 1, newSVsv(thr->errsv));
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p died: %s\n",
- thr, SvPV(thr->errsv, n_a)));
- } else {
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "%p died: %s\n",
+ thr, SvPV(thr->errsv, PL_na)));
+ }
+ else {
DEBUG_S(STMT_START {
for (i = 1; i <= retval; i++) {
- PerlIO_printf(PerlIO_stderr(), "%p return[%d] = %s\n",
+ PerlIO_printf(Perl_debug_log, "%p return[%d] = %s\n",
thr, i, SvPEEK(SP[i - 1]));
}
} STMT_END);
@@ -153,7 +161,6 @@ threadstart(void *arg)
SvREFCNT_dec(thr->threadsv);
SvREFCNT_dec(thr->specific);
SvREFCNT_dec(thr->errsv);
- SvREFCNT_dec(thr->errhv);
/*Safefree(cxstack);*/
while (PL_curstackinfo->si_next)
@@ -175,37 +182,39 @@ threadstart(void *arg)
SvREFCNT_dec(PL_rs);
SvREFCNT_dec(PL_nrs);
SvREFCNT_dec(PL_statname);
+ SvREFCNT_dec(PL_errors);
Safefree(PL_screamfirst);
Safefree(PL_screamnext);
Safefree(PL_reg_start_tmp);
SvREFCNT_dec(PL_lastscream);
SvREFCNT_dec(PL_defoutgv);
+ Safefree(PL_reg_poscache);
MUTEX_LOCK(&thr->mutex);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: threadstart finishing: state is %u\n",
thr, ThrSTATE(thr)));
switch (ThrSTATE(thr)) {
case THRf_R_JOINABLE:
ThrSETSTATE(thr, THRf_ZOMBIE);
MUTEX_UNLOCK(&thr->mutex);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: R_JOINABLE thread finished\n", thr));
break;
case THRf_R_JOINED:
ThrSETSTATE(thr, THRf_DEAD);
MUTEX_UNLOCK(&thr->mutex);
- remove_thread(thr);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ remove_thread(aTHX_ thr);
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: R_JOINED thread finished\n", thr));
break;
case THRf_R_DETACHED:
ThrSETSTATE(thr, THRf_DEAD);
MUTEX_UNLOCK(&thr->mutex);
SvREFCNT_dec(av);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: DETACHED thread finished\n", thr));
- remove_thread(thr); /* This might trigger main thread to finish */
+ remove_thread(aTHX_ thr); /* This might trigger main thread to finish */
break;
default:
MUTEX_UNLOCK(&thr->mutex);
@@ -222,7 +231,7 @@ threadstart(void *arg)
}
static SV *
-newthread (SV *startsv, AV *initargs, char *classname)
+newthread (pTHX_ SV *startsv, AV *initargs, char *classname)
{
#ifdef USE_THREADS
dSP;
@@ -234,17 +243,18 @@ newthread (SV *startsv, AV *initargs, char *classname)
static pthread_attr_t attr;
static int attr_inited = 0;
sigset_t fullmask, oldmask;
+ static int attr_joinable = PTHREAD_CREATE_JOINABLE;
#endif
-
+
savethread = thr;
thr = new_struct_thread(thr);
/* temporarily pretend to be the child thread in case the
* XPUSHs() below want to grow the child's stack. This is
* safe, since the other thread is not yet created, and we
* are the only ones who know about it */
- SET_THR(thr);
+ PERL_SET_THX(thr);
SPAGAIN;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: newthread (%p), tid is %u, preparing stack\n",
savethread, thr, thr->tid));
/* The following pushes the arg list and startsv onto the *new* stack */
@@ -256,7 +266,7 @@ newthread (SV *startsv, AV *initargs, char *classname)
PUTBACK;
/* On your marks... */
- SET_THR(savethread);
+ PERL_SET_THX(savethread);
MUTEX_LOCK(&thr->mutex);
#ifdef THREAD_CREATE
@@ -269,39 +279,27 @@ newthread (SV *startsv, AV *initargs, char *classname)
err = 0;
if (!attr_inited) {
attr_inited = 1;
-#ifdef OLD_PTHREADS_API
- err = pthread_attr_create(&attr);
-#else
err = pthread_attr_init(&attr);
-#endif
-#ifdef OLD_PTHREADS_API
-#ifdef VMS
-/* This is available with the old pthreads API, but only with */
-/* DecThreads (VMS and Digital Unix) */
- if (err == 0)
- err = pthread_attr_setdetach_np(&attr, ATTR_JOINABLE);
-#endif
-#else
+# ifdef PTHREAD_ATTR_SETDETACHSTATE
if (err == 0)
- err = pthread_attr_setdetachstate(&attr, ATTR_JOINABLE);
-#endif
+ err = PTHREAD_ATTR_SETDETACHSTATE(&attr, attr_joinable);
+
+# else
+ croak("panic: can't pthread_attr_setdetachstate");
+# endif
}
if (err == 0)
-#ifdef OLD_PTHREADS_API
- err = pthread_create(&thr->self, attr, threadstart, (void*) thr);
-#else
- err = pthread_create(&thr->self, &attr, threadstart, (void*) thr);
-#endif
+ err = PTHREAD_CREATE(&thr->self, attr, threadstart, (void*) thr);
#endif
+
if (err) {
MUTEX_UNLOCK(&thr->mutex);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: create of %p failed %d\n",
savethread, thr, err));
/* Thread creation failed--clean up */
SvREFCNT_dec(thr->cvcache);
- remove_thread(thr);
- MUTEX_DESTROY(&thr->mutex);
+ remove_thread(aTHX_ thr);
for (i = 0; i <= AvFILL(initargs); i++)
SvREFCNT_dec(*av_fetch(initargs, i, FALSE));
SvREFCNT_dec(startsv);
@@ -330,18 +328,19 @@ newthread (SV *startsv, AV *initargs, char *classname)
#endif
}
-static Signal_t handle_thread_signal _((int sig));
+static Signal_t handle_thread_signal (int sig);
static Signal_t
handle_thread_signal(int sig)
{
+ dTHXo;
unsigned char c = (unsigned char) sig;
/*
* We're not really allowed to call fprintf in a signal handler
* so don't be surprised if this isn't robust while debugging
* with -DL.
*/
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"handle_thread_signal: got signal %d\n", sig););
write(sig_pipe[1], &c, 1);
}
@@ -355,7 +354,7 @@ new(classname, startsv, ...)
SV * startsv
AV * av = av_make(items - 2, &ST(2));
PPCODE:
- XPUSHs(sv_2mortal(newthread(startsv, av, classname)));
+ XPUSHs(sv_2mortal(newthread(aTHX_ startsv, av, classname)));
void
join(t)
@@ -364,7 +363,9 @@ join(t)
int i = NO_INIT
PPCODE:
#ifdef USE_THREADS
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: joining %p (state %u)\n",
+ if (t == thr)
+ croak("Attempt to join self");
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: joining %p (state %u)\n",
thr, t, ThrSTATE(t)););
MUTEX_LOCK(&t->mutex);
switch (ThrSTATE(t)) {
@@ -376,7 +377,7 @@ join(t)
case THRf_ZOMBIE:
ThrSETSTATE(t, THRf_DEAD);
MUTEX_UNLOCK(&t->mutex);
- remove_thread(t);
+ remove_thread(aTHX_ t);
break;
default:
MUTEX_UNLOCK(&t->mutex);
@@ -385,14 +386,17 @@ join(t)
}
JOIN(t, &av);
+ sv_2mortal((SV*)av);
+
if (SvTRUE(*av_fetch(av, 0, FALSE))) {
/* Could easily speed up the following if necessary */
for (i = 1; i <= AvFILL(av); i++)
- XPUSHs(sv_2mortal(*av_fetch(av, i, FALSE)));
- } else {
+ XPUSHs(*av_fetch(av, i, FALSE));
+ }
+ else {
STRLEN n_a;
char *mess = SvPV(*av_fetch(av, 1, FALSE), n_a);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: join propagating die message: %s\n",
thr, mess));
croak(mess);
@@ -404,7 +408,7 @@ detach(t)
Thread t
CODE:
#ifdef USE_THREADS
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: detaching %p (state %u)\n",
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: detaching %p (state %u)\n",
thr, t, ThrSTATE(t)););
MUTEX_LOCK(&t->mutex);
switch (ThrSTATE(t)) {
@@ -419,7 +423,7 @@ detach(t)
ThrSETSTATE(t, THRf_DEAD);
DETACH(t);
MUTEX_UNLOCK(&t->mutex);
- remove_thread(t);
+ remove_thread(aTHX_ t);
break;
default:
MUTEX_UNLOCK(&t->mutex);
@@ -496,7 +500,7 @@ CODE:
sv = SvRV(sv);
mg = condpair_magic(sv);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: cond_wait %p\n", thr, sv));
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: cond_wait %p\n", thr, sv));
MUTEX_LOCK(MgMUTEXP(mg));
if (MgOWNER(mg) != thr) {
MUTEX_UNLOCK(MgMUTEXP(mg));
@@ -521,7 +525,7 @@ CODE:
sv = SvRV(sv);
mg = condpair_magic(sv);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: cond_signal %p\n",thr,sv));
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: cond_signal %p\n",thr,sv));
MUTEX_LOCK(MgMUTEXP(mg));
if (MgOWNER(mg) != thr) {
MUTEX_UNLOCK(MgMUTEXP(mg));
@@ -541,7 +545,7 @@ CODE:
sv = SvRV(sv);
mg = condpair_magic(sv);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: cond_broadcast %p\n",
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: cond_broadcast %p\n",
thr, sv));
MUTEX_LOCK(MgMUTEXP(mg));
if (MgOWNER(mg) != thr) {
@@ -643,8 +647,8 @@ await_signal()
croak("panic: await_signal");
ST(0) = sv_newmortal();
if (ret)
- sv_setsv(ST(0), c ? psig_ptr[c] : &PL_sv_no);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ sv_setsv(ST(0), c ? PL_psig_ptr[c] : &PL_sv_no);
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"await_signal returning %s\n", SvPEEK(ST(0))););
MODULE = Thread PACKAGE = Thread::Specific
diff --git a/contrib/perl5/ext/Thread/Thread/Queue.pm b/contrib/perl5/ext/Thread/Thread/Queue.pm
index 6d5f82b..831573c 100644
--- a/contrib/perl5/ext/Thread/Thread/Queue.pm
+++ b/contrib/perl5/ext/Thread/Thread/Queue.pm
@@ -67,15 +67,13 @@ sub new {
return bless [@_], $class;
}
-sub dequeue {
- use attrs qw(locked method);
+sub dequeue : locked : method {
my $q = shift;
cond_wait $q until @$q;
return shift @$q;
}
-sub dequeue_nb {
- use attrs qw(locked method);
+sub dequeue_nb : locked : method {
my $q = shift;
if (@$q) {
return shift @$q;
@@ -84,14 +82,12 @@ sub dequeue_nb {
}
}
-sub enqueue {
- use attrs qw(locked method);
+sub enqueue : locked : method {
my $q = shift;
push(@$q, @_) and cond_broadcast $q;
}
-sub pending {
- use attrs qw(locked method);
+sub pending : locked : method {
my $q = shift;
return scalar(@$q);
}
diff --git a/contrib/perl5/ext/Thread/Thread/Semaphore.pm b/contrib/perl5/ext/Thread/Thread/Semaphore.pm
index 915808c..3cd6338 100644
--- a/contrib/perl5/ext/Thread/Thread/Semaphore.pm
+++ b/contrib/perl5/ext/Thread/Thread/Semaphore.pm
@@ -69,16 +69,14 @@ sub new {
bless \$val, $class;
}
-sub down {
- use attrs qw(locked method);
+sub down : locked : method {
my $s = shift;
my $inc = @_ ? shift : 1;
cond_wait $s until $$s >= $inc;
$$s -= $inc;
}
-sub up {
- use attrs qw(locked method);
+sub up : locked : method {
my $s = shift;
my $inc = @_ ? shift : 1;
($$s += $inc) > 0 and cond_broadcast $s;
diff --git a/contrib/perl5/ext/Thread/Thread/Specific.pm b/contrib/perl5/ext/Thread/Thread/Specific.pm
index 9c8a66a..a6271a4 100644
--- a/contrib/perl5/ext/Thread/Thread/Specific.pm
+++ b/contrib/perl5/ext/Thread/Thread/Specific.pm
@@ -15,14 +15,13 @@ C<key_create> returns a unique thread-specific key.
=cut
-sub import {
- use attrs qw(locked method);
+sub import : locked : method {
require fields;
- fields->import(@_);
+ fields::->import(@_);
}
-sub key_create {
- use attrs qw(locked method);
+sub key_create : locked : method {
+ our %FIELDS; # suppress "used only once"
return ++$FIELDS{__MAX__};
}
diff --git a/contrib/perl5/ext/Thread/sync.t b/contrib/perl5/ext/Thread/sync.t
index 9c2e589..6445b55 100644
--- a/contrib/perl5/ext/Thread/sync.t
+++ b/contrib/perl5/ext/Thread/sync.t
@@ -2,8 +2,7 @@ use Thread;
$level = 0;
-sub single_file {
- use attrs 'locked';
+sub single_file : locked {
my $arg = shift;
$level++;
print "Level $level for $arg\n";
diff --git a/contrib/perl5/ext/Thread/sync2.t b/contrib/perl5/ext/Thread/sync2.t
index 0901da4..ffc74b4 100644
--- a/contrib/perl5/ext/Thread/sync2.t
+++ b/contrib/perl5/ext/Thread/sync2.t
@@ -2,8 +2,7 @@ use Thread;
$global = undef;
-sub single_file {
- use attrs 'locked';
+sub single_file : locked {
my $who = shift;
my $i;
diff --git a/contrib/perl5/ext/Thread/typemap b/contrib/perl5/ext/Thread/typemap
index 21eb6c3..7ce7d5c 100644
--- a/contrib/perl5/ext/Thread/typemap
+++ b/contrib/perl5/ext/Thread/typemap
@@ -13,7 +13,7 @@ T_XSCPTR
|| mg->mg_private != ${ntype}_MAGIC_SIGNATURE)
croak(\"XSUB ${func_name}: $var is a forged ${ntype} object\");
$var = ($type) SvPVX(mg->mg_obj);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
\"XSUB ${func_name}: %p\\n\", $var);)
} STMT_END
T_IVREF
diff --git a/contrib/perl5/ext/attrs/attrs.pm b/contrib/perl5/ext/attrs/attrs.pm
index fe2bf35..2070632 100644
--- a/contrib/perl5/ext/attrs/attrs.pm
+++ b/contrib/perl5/ext/attrs/attrs.pm
@@ -1,14 +1,11 @@
package attrs;
-require DynaLoader;
-use vars '@ISA';
-@ISA = 'DynaLoader';
+use XSLoader ();
-use vars qw($VERSION);
$VERSION = "1.0";
=head1 NAME
-attrs - set/get attributes of a subroutine
+attrs - set/get attributes of a subroutine (deprecated)
=head1 SYNOPSIS
@@ -21,11 +18,17 @@ attrs - set/get attributes of a subroutine
=head1 DESCRIPTION
-This module lets you set and get attributes for subroutines.
+NOTE: Use of this pragma is deprecated. Use the syntax
+
+ sub foo : locked method { }
+
+to declare attributes instead. See also L<attributes>.
+
+This pragma lets you set and get attributes for subroutines.
Setting attributes takes place at compile time; trying to set
invalid attribute names causes a compile-time error. Calling
-C<attr::get> on a subroutine reference or name returns its list
-of attribute names. Notice that C<attr::get> is not exported.
+C<attrs::get> on a subroutine reference or name returns its list
+of attribute names. Notice that C<attrs::get> is not exported.
Valid attributes are as follows.
=over
@@ -50,6 +53,6 @@ subroutine is entered.
=cut
-bootstrap attrs $VERSION;
+XSLoader::load 'attrs', $VERSION;
1;
diff --git a/contrib/perl5/ext/attrs/attrs.xs b/contrib/perl5/ext/attrs/attrs.xs
index 7f7970d..4c00cd7 100644
--- a/contrib/perl5/ext/attrs/attrs.xs
+++ b/contrib/perl5/ext/attrs/attrs.xs
@@ -1,3 +1,4 @@
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
@@ -26,6 +27,10 @@ char * Class
PPCODE:
if (!PL_compcv || !(cv = CvOUTSIDE(PL_compcv)))
croak("can't set attributes outside a subroutine scope");
+ if (ckWARN(WARN_DEPRECATED))
+ Perl_warner(aTHX_ WARN_DEPRECATED,
+ "pragma \"attrs\" is deprecated, "
+ "use \"sub NAME : ATTRS\" instead");
for (i = 1; i < items; i++) {
STRLEN n_a;
char *attr = SvPV(ST(i), n_a);
@@ -55,7 +60,7 @@ SV * sub
if (!sub)
croak("invalid subroutine reference or name");
if (CvFLAGS(sub) & CVf_METHOD)
- XPUSHs(sv_2mortal(newSVpv("method", 0)));
+ XPUSHs(sv_2mortal(newSVpvn("method", 6)));
if (CvFLAGS(sub) & CVf_LOCKED)
- XPUSHs(sv_2mortal(newSVpv("locked", 0)));
+ XPUSHs(sv_2mortal(newSVpvn("locked", 6)));
diff --git a/contrib/perl5/ext/re/Makefile.PL b/contrib/perl5/ext/re/Makefile.PL
index 040b085..bd0f1f7 100644
--- a/contrib/perl5/ext/re/Makefile.PL
+++ b/contrib/perl5/ext/re/Makefile.PL
@@ -5,7 +5,7 @@ WriteMakefile(
MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes',
OBJECT => 're_exec$(OBJ_EXT) re_comp$(OBJ_EXT) re$(OBJ_EXT)',
- DEFINE => '-DPERL_EXT_RE_BUILD',
+ DEFINE => '-DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG',
clean => { FILES => '*$(OBJ_EXT) *.c ../../lib/re.pm' },
);
diff --git a/contrib/perl5/ext/re/re.pm b/contrib/perl5/ext/re/re.pm
index 83e7dba..3f142d9 100644
--- a/contrib/perl5/ext/re/re.pm
+++ b/contrib/perl5/ext/re/re.pm
@@ -41,11 +41,11 @@ on tainted data aren't meant to extract safe substrings, but to perform
other transformations.
When C<use re 'eval'> is in effect, a regex is allowed to contain
-C<(?{ ... })> zero-width assertions even if the regex contains
-variable interpolation. This is normally disallowed, since it is a
+C<(?{ ... })> zero-width assertions even if regular expression contains
+variable interpolation. That is normally disallowed, since it is a
potential security risk. Note that this pragma is ignored when the regular
expression is obtained from tainted data, i.e. evaluation is always
-disallowed with tainted regular expressions. See L<perlre/(?{ code })>.
+disallowed with tainted regular expresssions. See L<perlre/(?{ code })>.
For the purpose of this pragma, interpolation of precompiled regular
expressions (i.e., the result of C<qr//>) is I<not> considered variable
@@ -74,6 +74,8 @@ See L<perlmodlib/Pragmatic Modules>.
=cut
+# N.B. File::Basename contains a literal for 'taint' as a fallback. If
+# taint is changed here, File::Basename must be updated as well.
my %bitmask = (
taint => 0x00100000,
eval => 0x00200000,
@@ -84,16 +86,13 @@ sub setcolor {
require Term::Cap;
my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning.
- my $props = $ENV{PERL_RE_TC} || 'md,me,so,se'; # can use us/ue later
+ my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue';
my @props = split /,/, $props;
+ my $colors = join "\t", map {$terminal->Tputs($_,1)} @props;
-
- $ENV{TERMCAP_COLORS} = join "\t", map {$terminal->Tputs($_,1)} @props;
+ $colors =~ s/\0//g;
+ $ENV{PERL_RE_COLORS} = $colors;
};
-
- not defined $ENV{TERMCAP_COLORS} or ($ENV{TERMCAP_COLORS} =~ tr/\t/\t/) >= 4
- or not defined $ENV{PERL_RE_TC}
- or die "Not enough fields in \$ENV{PERL_RE_TC}=`$ENV{PERL_RE_TC}'";
}
sub bits {
@@ -106,9 +105,8 @@ sub bits {
foreach my $s (@_){
if ($s eq 'debug' or $s eq 'debugcolor') {
setcolor() if $s eq 'debugcolor';
- require DynaLoader;
- @ISA = ('DynaLoader');
- bootstrap re;
+ require XSLoader;
+ XSLoader::load('re');
install() if $on;
uninstall() unless $on;
next;
diff --git a/contrib/perl5/ext/re/re.xs b/contrib/perl5/ext/re/re.xs
index 7230d62..04a5fdc 100644
--- a/contrib/perl5/ext/re/re.xs
+++ b/contrib/perl5/ext/re/re.xs
@@ -3,36 +3,49 @@
# define DEBUGGING
#endif
+#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
-extern regexp* my_regcomp _((char* exp, char* xend, PMOP* pm));
-extern I32 my_regexec _((regexp* prog, char* stringarg, char* strend,
- char* strbeg, I32 minend, SV* screamer,
- void* data, U32 flags));
+extern regexp* my_regcomp (pTHX_ char* exp, char* xend, PMOP* pm);
+extern I32 my_regexec (pTHX_ regexp* prog, char* stringarg, char* strend,
+ char* strbeg, I32 minend, SV* screamer,
+ void* data, U32 flags);
+extern void my_regfree (pTHX_ struct regexp* r);
+extern char* my_re_intuit_start (pTHX_ regexp *prog, SV *sv, char *strpos,
+ char *strend, U32 flags,
+ struct re_scream_pos_data_s *data);
+extern SV* my_re_intuit_string (pTHX_ regexp *prog);
static int oldfl;
#define R_DB 512
static void
-deinstall(void)
+deinstall(pTHX)
{
dTHR;
- PL_regexecp = &regexec_flags;
- PL_regcompp = &pregcomp;
+ PL_regexecp = Perl_regexec_flags;
+ PL_regcompp = Perl_pregcomp;
+ PL_regint_start = Perl_re_intuit_start;
+ PL_regint_string = Perl_re_intuit_string;
+ PL_regfree = Perl_pregfree;
+
if (!oldfl)
PL_debug &= ~R_DB;
}
static void
-install(void)
+install(pTHX)
{
dTHR;
PL_colorset = 0; /* Allow reinspection of ENV. */
PL_regexecp = &my_regexec;
PL_regcompp = &my_regcomp;
+ PL_regint_start = &my_re_intuit_start;
+ PL_regint_string = &my_re_intuit_string;
+ PL_regfree = &my_regfree;
oldfl = PL_debug & R_DB;
PL_debug |= R_DB;
}
@@ -41,6 +54,10 @@ MODULE = re PACKAGE = re
void
install()
+ CODE:
+ install(aTHX);
void
deinstall()
+ CODE:
+ deinstall(aTHX);
diff --git a/contrib/perl5/form.h b/contrib/perl5/form.h
index 0d3053d..ca2a0c8 100644
--- a/contrib/perl5/form.h
+++ b/contrib/perl5/form.h
@@ -1,6 +1,6 @@
/* form.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
diff --git a/contrib/perl5/global.sym b/contrib/perl5/global.sym
index 99edf17..95e7775 100644
--- a/contrib/perl5/global.sym
+++ b/contrib/perl5/global.sym
@@ -1,1074 +1,539 @@
-# Global symbols that need to be hidden in embedded applications.
+#
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is autogenerated from data in embed.pl. Edit that file
+# and run 'make regen_headers' to effect changes.
+#
-# Variables - should not be here but in perlvars.h
-
-AMG_names
-Error
-abs_amg
-add_amg
-add_ass_amg
-additem
-atan2_amg
-band_amg
-block_type
-bool__amg
-bor_amg
-bxor_amg
-check
-compl_amg
-concat_amg
-concat_ass_amg
-cos_amg
-dc
-dec_amg
-di
-div_amg
-div_ass_amg
-do_binmode
-ds
-eq_amg
-exp_amg
-expectterm
-fallback_amg
-fold
-fold_locale
-freq
-ge_amg
-gt_amg
-inc_amg
-init_thread_intern
-io_close
-know_next
-le_amg
-log_amg
-lshift_amg
-lshift_ass_amg
-lt_amg
-mod_amg
-mod_ass_amg
-mult_amg
-mult_ass_amg
-ncmp_amg
-ne_amg
-neg_amg
-new_struct_thread
-new_stackinfo
-no_aelem
-no_dir_func
-no_func
-no_helem
-no_mem
-no_modify
-no_myglob
-no_security
-no_sock_func
-no_symref
-no_usym
-no_wrongref
-nointrp
-nomem
-nomethod_amg
-not_amg
-numer_amg
-op_const_sv
-op_desc
-op_name
-opargs
-pow_amg
-pow_ass_amg
-ppaddr
-psig_name
-psig_ptr
-reall_srchlen
-regkind
-repeat_amg
-repeat_ass_amg
-rshift_amg
-rshift_ass_amg
-runops_debug
-runops_standard
-saw_return
-scmp_amg
-seq_amg
-sge_amg
-sgt_amg
-sig_name
-sig_num
-simple
-sin_amg
-sle_amg
-slt_amg
-sne_amg
-sqrt_amg
-string_amg
-subtr_amg
-subtr_ass_amg
-varies
-vivify_defelem
-vivify_ref
-vtbl_amagic
-vtbl_amagicelem
-vtbl_arylen
-vtbl_bm
-vtbl_collxfrm
-vtbl_dbline
-vtbl_defelem
-vtbl_env
-vtbl_envelem
-vtbl_fm
-vtbl_glob
-vtbl_isa
-vtbl_isaelem
-vtbl_mglob
-vtbl_mutex
-vtbl_nkeys
-vtbl_pack
-vtbl_packelem
-vtbl_pos
-vtbl_regexp
-vtbl_sig
-vtbl_sigelem
-vtbl_substr
-vtbl_sv
-vtbl_taint
-vtbl_uvar
-vtbl_vec
-warn_nl
-warn_nosemi
-warn_reserved
-warn_uninit
-watchaddr
-watchok
-yychar
-yycheck
-yydebug
-yydefred
-yydgoto
-yyerrflag
-yygindex
-yylen
-yylhs
-yylval
-yyname
-yynerrs
-yyrindex
-yyrule
-yysindex
-yytable
-yyval
-
-# Functions
-
-Gv_AMupdate
-amagic_call
-append_elem
-append_list
-apply
-assertref
-av_clear
-av_extend
-av_fake
-av_fetch
-av_fill
-av_len
-av_make
-av_pop
-av_push
-av_reify
-av_shift
-av_store
-av_undef
-av_unshift
-avhv_exists_ent
-avhv_fetch_ent
-avhv_iternext
-avhv_iterval
-avhv_keys
-bind_match
-block_end
-block_gimme
-block_start
-boot_core_UNIVERSAL
-bset_obj_store
-byterun
-call_list
-cando
-cast_ulong
-check_uni
-checkcomma
-ck_aelem
-ck_anoncode
-ck_bitop
-ck_concat
-ck_delete
-ck_eof
-ck_eval
-ck_exec
-ck_exists
-ck_ftst
-ck_fun
-ck_fun_locale
-ck_glob
-ck_grep
-ck_gvconst
-ck_index
-ck_lengthconst
-ck_lfun
-ck_listiob
-ck_match
-ck_null
-ck_repeat
-ck_require
-ck_retarget
-ck_rfun
-ck_rvconst
-ck_scmp
-ck_select
-ck_shift
-ck_sort
-ck_spair
-ck_split
-ck_subr
-ck_svconst
-ck_trunc
-condpair_magic
-convert
-croak
-cv_ckproto
-cv_clone
-cv_const_sv
-cv_undef
-cx_dump
-cxinc
-deb
-deb_growlevel
-debop
-debprofdump
-debstack
-debstackptrs
-delimcpy
-deprecate
-die
-die_where
-do_aexec
-do_chomp
-do_chop
-do_close
-do_eof
-do_exec
-do_execfree
-do_ipcctl
-do_ipcget
-do_join
-do_kv
-do_msgrcv
-do_msgsnd
-do_open
-do_pipe
-do_print
-do_readline
-do_seek
-do_semop
-do_shmio
-do_sprintf
-do_sysseek
-do_tell
-do_trans
-do_vecset
-do_vop
-dofile
-dofindlabel
-dopoptoeval
-dounwind
-dowantarray
-dump_all
-dump_eval
-dump_fds
-dump_form
-dump_gv
-dump_mstats
-dump_op
-dump_packsubs
-dump_pm
-dump_sub
-fbm_compile
-fbm_instr
-fetch_gv
-fetch_io
-filter_add
-filter_del
-filter_read
-find_script
-find_threadsv
-fold_constants
-force_ident
-force_list
-force_next
-force_word
-form
-free_tmps
-gen_constant_list
-get_op_descs
-get_op_names
-get_no_modify
-get_opargs
-get_specialsv_list
-get_vtbl
-gp_free
-gp_ref
-gv_AVadd
-gv_HVadd
-gv_IOadd
-gv_autoload4
-gv_check
-gv_efullname
-gv_efullname3
-gv_fetchfile
-gv_fetchmeth
-gv_fetchmethod
-gv_fetchmethod_autoload
-gv_fetchpv
-gv_fullname
-gv_fullname3
-gv_init
-gv_stashpv
-gv_stashpvn
-gv_stashsv
-hv_clear
-hv_delayfree_ent
-hv_delete
-hv_delete_ent
-hv_exists
-hv_exists_ent
-hv_fetch
-hv_fetch_ent
-hv_free_ent
-hv_iterinit
-hv_iterkey
-hv_iterkeysv
-hv_iternext
-hv_iternextsv
-hv_iterval
-hv_ksplit
-hv_magic
-hv_stashpv
-hv_store
-hv_store_ent
-hv_undef
-ibcmp
-ibcmp_locale
-ingroup
-init_stacks
-instr
-intro_my
-intuit_more
-invert
-jmaybe
-keyword
-leave_scope
-lex_end
-lex_start
-linklist
-list
-listkids
-localize
-looks_like_number
-magic_clear_all_env
-magic_clearenv
-magic_clearpack
-magic_clearsig
-magic_existspack
-magic_freeregexp
-magic_get
-magic_getarylen
-magic_getdefelem
-magic_getglob
-magic_getnkeys
-magic_getpack
-magic_getpos
-magic_getsig
-magic_getsubstr
-magic_gettaint
-magic_getuvar
-magic_getvec
-magic_len
-magic_mutexfree
-magic_nextpack
-magic_set
-magic_set_all_env
-magic_setamagic
-magic_setarylen
-magic_setbm
-magic_setcollxfrm
-magic_setdbline
-magic_setdefelem
-magic_setenv
-magic_setfm
-magic_setglob
-magic_setisa
-magic_setmglob
-magic_setnkeys
-magic_setpack
-magic_setpos
-magic_setsig
-magic_setsubstr
-magic_settaint
-magic_setuvar
-magic_setvec
-magic_sizepack
-magic_wipepack
-magicname
-malloced_size
-markstack_grow
-mem_collxfrm
-mess
-mg_clear
-mg_copy
-mg_find
-mg_free
-mg_get
-mg_length
-mg_magical
-mg_set
-mg_size
-mod
-modkids
-moreswitches
-mstats
-my
-my_bcopy
-my_bzero
-my_chsize
-my_exit
-my_failure_exit
-my_htonl
-my_lstat
-my_memcmp
-my_memset
-my_ntohl
-my_pclose
-my_popen
-my_setenv
-my_stat
-my_swap
-my_unexec
-newANONHASH
-newANONLIST
-newANONSUB
-newASSIGNOP
-newAV
-newAVREF
-newBINOP
-newCONDOP
-newCONSTSUB
-newCVREF
-newFORM
-newFOROP
-newGVOP
-newGVREF
-newGVgen
-newHV
-newHVREF
-newHVhv
-newIO
-newLISTOP
-newLOGOP
-newLOOPEX
-newLOOPOP
-newNULLLIST
-newOP
-newPMOP
-newPROG
-newPVOP
-newRANGE
-newRV
-newRV_noinc
-newSLICEOP
-newSTATEOP
-newSUB
-newSV
-newSVOP
-newSVREF
-newSViv
-newSVnv
-newSVpv
-newSVpvf
-newSVpvn
-newSVrv
-newSVsv
-newUNOP
-newWHILEOP
-newXS
-newXSUB
-nextargv
-ninstr
-no_fh_allowed
-no_op
-oopsAV
-oopsCV
-oopsHV
-op_free
-package
-pad_alloc
-pad_allocmy
-pad_findmy
-pad_free
-pad_leavemy
-pad_reset
-pad_sv
-pad_swipe
-peep
-pidgone
-pmflag
-pmruntime
-pmtrans
-pop_return
-pop_scope
-pp_aassign
-pp_abs
-pp_accept
-pp_add
-pp_aelem
-pp_aelemfast
-pp_alarm
-pp_and
-pp_andassign
-pp_anoncode
-pp_anonhash
-pp_anonlist
-pp_aslice
-pp_atan2
-pp_av2arylen
-pp_backtick
-pp_bind
-pp_binmode
-pp_bit_and
-pp_bit_or
-pp_bit_xor
-pp_bless
-pp_caller
-pp_chdir
-pp_chmod
-pp_chomp
-pp_chop
-pp_chown
-pp_chr
-pp_chroot
-pp_close
-pp_closedir
-pp_complement
-pp_concat
-pp_cond_expr
-pp_connect
-pp_const
-pp_cos
-pp_crypt
-pp_cswitch
-pp_dbmclose
-pp_dbmopen
-pp_dbstate
-pp_defined
-pp_delete
-pp_die
-pp_divide
-pp_dofile
-pp_dump
-pp_each
-pp_egrent
-pp_ehostent
-pp_enetent
-pp_enter
-pp_entereval
-pp_enteriter
-pp_enterloop
-pp_entersub
-pp_entersubr
-pp_entertry
-pp_enterwrite
-pp_eof
-pp_eprotoent
-pp_epwent
-pp_eq
-pp_eservent
-pp_evalonce
-pp_exec
-pp_exists
-pp_exit
-pp_exp
-pp_fcntl
-pp_fileno
-pp_flip
-pp_flock
-pp_flop
-pp_fork
-pp_formline
-pp_ftatime
-pp_ftbinary
-pp_ftblk
-pp_ftchr
-pp_ftctime
-pp_ftdir
-pp_fteexec
-pp_fteowned
-pp_fteread
-pp_ftewrite
-pp_ftfile
-pp_ftis
-pp_ftlink
-pp_ftmtime
-pp_ftpipe
-pp_ftrexec
-pp_ftrowned
-pp_ftrread
-pp_ftrwrite
-pp_ftsgid
-pp_ftsize
-pp_ftsock
-pp_ftsuid
-pp_ftsvtx
-pp_fttext
-pp_fttty
-pp_ftzero
-pp_ge
-pp_gelem
-pp_getc
-pp_getlogin
-pp_getpeername
-pp_getpgrp
-pp_getppid
-pp_getpriority
-pp_getsockname
-pp_ggrent
-pp_ggrgid
-pp_ggrnam
-pp_ghbyaddr
-pp_ghbyname
-pp_ghostent
-pp_glob
-pp_gmtime
-pp_gnbyaddr
-pp_gnbyname
-pp_gnetent
-pp_goto
-pp_gpbyname
-pp_gpbynumber
-pp_gprotoent
-pp_gpwent
-pp_gpwnam
-pp_gpwuid
-pp_grepstart
-pp_grepwhile
-pp_gsbyname
-pp_gsbyport
-pp_gservent
-pp_gsockopt
-pp_gt
-pp_gv
-pp_gvsv
-pp_helem
-pp_hex
-pp_hslice
-pp_i_add
-pp_i_divide
-pp_i_eq
-pp_i_ge
-pp_i_gt
-pp_i_le
-pp_i_lt
-pp_i_modulo
-pp_i_multiply
-pp_i_ncmp
-pp_i_ne
-pp_i_negate
-pp_i_subtract
-pp_index
-pp_int
-pp_interp
-pp_ioctl
-pp_iter
-pp_join
-pp_keys
-pp_kill
-pp_last
-pp_lc
-pp_lcfirst
-pp_le
-pp_leave
-pp_leaveeval
-pp_leaveloop
-pp_leavesub
-pp_leavetry
-pp_leavewrite
-pp_left_shift
-pp_length
-pp_lineseq
-pp_link
-pp_list
-pp_listen
-pp_localtime
-pp_lock
-pp_log
-pp_lslice
-pp_lstat
-pp_lt
-pp_map
-pp_mapstart
-pp_mapwhile
-pp_match
-pp_method
-pp_mkdir
-pp_modulo
-pp_msgctl
-pp_msgget
-pp_msgrcv
-pp_msgsnd
-pp_multiply
-pp_ncmp
-pp_ne
-pp_negate
-pp_next
-pp_nextstate
-pp_not
-pp_nswitch
-pp_null
-pp_oct
-pp_open
-pp_open_dir
-pp_or
-pp_orassign
-pp_ord
-pp_pack
-pp_padany
-pp_padav
-pp_padhv
-pp_padsv
-pp_pipe_op
-pp_pop
-pp_pos
-pp_postdec
-pp_postinc
-pp_pow
-pp_predec
-pp_preinc
-pp_print
-pp_prototype
-pp_prtf
-pp_push
-pp_pushmark
-pp_pushre
-pp_qr
-pp_quotemeta
-pp_rand
-pp_range
-pp_rcatline
-pp_read
-pp_readdir
-pp_readline
-pp_readlink
-pp_recv
-pp_redo
-pp_ref
-pp_refgen
-pp_regcmaybe
-pp_regcreset
-pp_regcomp
-pp_rename
-pp_repeat
-pp_require
-pp_reset
-pp_return
-pp_reverse
-pp_rewinddir
-pp_right_shift
-pp_rindex
-pp_rmdir
-pp_rv2av
-pp_rv2cv
-pp_rv2gv
-pp_rv2hv
-pp_rv2sv
-pp_sassign
-pp_scalar
-pp_schomp
-pp_schop
-pp_scmp
-pp_scope
-pp_seek
-pp_seekdir
-pp_select
-pp_semctl
-pp_semget
-pp_semop
-pp_send
-pp_seq
-pp_setpgrp
-pp_setpriority
-pp_sge
-pp_sgrent
-pp_sgt
-pp_shift
-pp_shmctl
-pp_shmget
-pp_shmread
-pp_shmwrite
-pp_shostent
-pp_shutdown
-pp_sin
-pp_sle
-pp_sleep
-pp_slt
-pp_sne
-pp_snetent
-pp_socket
-pp_sockpair
-pp_sort
-pp_splice
-pp_split
-pp_sprintf
-pp_sprotoent
-pp_spwent
-pp_sqrt
-pp_srand
-pp_srefgen
-pp_sselect
-pp_sservent
-pp_ssockopt
-pp_stat
-pp_stringify
-pp_stub
-pp_study
-pp_subst
-pp_substcont
-pp_substr
-pp_subtract
-pp_symlink
-pp_syscall
-pp_sysopen
-pp_sysread
-pp_sysseek
-pp_system
-pp_syswrite
-pp_tell
-pp_telldir
-pp_threadsv
-pp_tie
-pp_tied
-pp_time
-pp_tms
-pp_trans
-pp_truncate
-pp_uc
-pp_ucfirst
-pp_umask
-pp_undef
-pp_unlink
-pp_unpack
-pp_unshift
-pp_unstack
-pp_untie
-pp_utime
-pp_values
-pp_vec
-pp_wait
-pp_waitpid
-pp_wantarray
-pp_warn
-pp_xor
-pregcomp
-pregexec
-pregfree
-prepend_elem
-push_return
-push_scope
-q
-ref
-refkids
-regdump
-regexec_flags
-regnext
-regprop
-repeatcpy
-rninstr
-rsignal
-rsignal_restore
-rsignal_save
-rsignal_state
-rxres_free
-rxres_restore
-rxres_save
-safecalloc
-safefree
-safemalloc
-saferealloc
-safexcalloc
-safexfree
-safexmalloc
-safexrealloc
-same_dirent
-save_I16
-save_I32
-save_aelem
-save_aptr
-save_ary
-save_clearsv
-save_delete
-save_destructor
-save_freeop
-save_freepv
-save_freesv
-save_generic_svref
-save_gp
-save_hash
-save_helem
-save_hints
-save_hptr
-save_int
-save_item
-save_iv
-save_list
-save_long
-save_nogv
-save_op
-save_pptr
-save_scalar
-save_sptr
-save_svref
-save_threadsv
-savepv
-savepvn
-savestack_grow
-sawparens
-scalar
-scalarkids
-scalarseq
-scalarvoid
-scan_const
-scan_formline
-scan_heredoc
-scan_hex
-scan_ident
-scan_inputsymbol
-scan_num
-scan_oct
-scan_pat
-scan_prefix
-scan_str
-scan_subst
-scan_trans
-scan_word
-scope
-screaminstr
-setdefout
-setenv_getix
-share_hek
-sharepvn
-sighandler
-skipspace
-stack_grow
-start_subparse
-sub_crush_depth
-sv_2bool
-sv_2cv
-sv_2io
-sv_2iv
-sv_2mortal
-sv_2nv
-sv_2pv
-sv_2uv
-sv_add_arena
-sv_backoff
-sv_bless
-sv_catpv
-sv_catpv_mg
-sv_catpvf
-sv_catpvf_mg
-sv_catpvn
-sv_catpvn_mg
-sv_catsv
-sv_catsv_mg
-sv_chop
-sv_clean_all
-sv_clean_objs
-sv_clear
-sv_cmp
-sv_cmp_locale
-sv_collxfrm
-sv_compile_2op
-sv_dec
-sv_derived_from
-sv_dump
-sv_eq
-sv_free
-sv_free_arenas
-sv_gets
-sv_grow
-sv_inc
-sv_insert
-sv_isa
-sv_isobject
-sv_iv
-sv_len
-sv_magic
-sv_mortalcopy
-sv_newmortal
-sv_newref
-sv_nv
-sv_peek
-sv_pvn
-sv_pvn_force
-sv_ref
-sv_reftype
-sv_replace
-sv_report_used
-sv_reset
-sv_setiv
-sv_setiv_mg
-sv_setnv
-sv_setnv_mg
-sv_setptrobj
-sv_setpv
-sv_setpv_mg
-sv_setpvf
-sv_setpvf_mg
-sv_setpviv
-sv_setpviv_mg
-sv_setpvn
-sv_setpvn_mg
-sv_setref_iv
-sv_setref_nv
-sv_setref_pv
-sv_setref_pvn
-sv_setsv
-sv_setsv_mg
-sv_setuv
-sv_setuv_mg
-sv_taint
-sv_tainted
-sv_true
-sv_unmagic
-sv_unref
-sv_untaint
-sv_upgrade
-sv_usepvn
-sv_usepvn_mg
-sv_uv
-sv_vcatpvfn
-sv_vsetpvfn
-taint_env
-taint_proper
-too_few_arguments
-too_many_arguments
-unlnk
-unlock_condpair
-unshare_hek
-unsharepvn
-utilize
-wait4pid
-warn
-watch
-whichsig
-yydestruct
-yyerror
-yylex
-yyparse
-yywarn
+perl_alloc_using
+perl_alloc
+perl_construct
+perl_destruct
+perl_free
+perl_run
+perl_parse
+perl_clone
+perl_clone_using
+Perl_malloc
+Perl_calloc
+Perl_realloc
+Perl_mfree
+Perl_get_context
+Perl_set_context
+Perl_amagic_call
+Perl_Gv_AMupdate
+Perl_avhv_delete_ent
+Perl_avhv_exists_ent
+Perl_avhv_fetch_ent
+Perl_avhv_store_ent
+Perl_avhv_iternext
+Perl_avhv_iterval
+Perl_avhv_keys
+Perl_av_clear
+Perl_av_delete
+Perl_av_exists
+Perl_av_extend
+Perl_av_fake
+Perl_av_fetch
+Perl_av_fill
+Perl_av_len
+Perl_av_make
+Perl_av_pop
+Perl_av_push
+Perl_av_reify
+Perl_av_shift
+Perl_av_store
+Perl_av_undef
+Perl_av_unshift
+Perl_block_gimme
+Perl_call_list
+Perl_cast_ulong
+Perl_cast_i32
+Perl_cast_iv
+Perl_cast_uv
+Perl_my_chsize
+Perl_condpair_magic
+Perl_croak
+Perl_vcroak
+Perl_croak_nocontext
+Perl_die_nocontext
+Perl_deb_nocontext
+Perl_form_nocontext
+Perl_load_module_nocontext
+Perl_mess_nocontext
+Perl_warn_nocontext
+Perl_warner_nocontext
+Perl_newSVpvf_nocontext
+Perl_sv_catpvf_nocontext
+Perl_sv_setpvf_nocontext
+Perl_sv_catpvf_mg_nocontext
+Perl_sv_setpvf_mg_nocontext
+Perl_fprintf_nocontext
+Perl_cv_const_sv
+Perl_cv_undef
+Perl_cx_dump
+Perl_filter_add
+Perl_filter_del
+Perl_filter_read
+Perl_get_op_descs
+Perl_get_op_names
+Perl_get_ppaddr
+Perl_deb
+Perl_vdeb
+Perl_debprofdump
+Perl_debop
+Perl_debstack
+Perl_debstackptrs
+Perl_delimcpy
+Perl_die
+Perl_dounwind
+Perl_do_binmode
+Perl_do_close
+Perl_do_open
+Perl_do_open9
+Perl_dowantarray
+Perl_dump_all
+Perl_dump_eval
+Perl_dump_fds
+Perl_dump_form
+Perl_gv_dump
+Perl_op_dump
+Perl_pmop_dump
+Perl_dump_packsubs
+Perl_dump_sub
+Perl_fbm_compile
+Perl_fbm_instr
+Perl_form
+Perl_vform
+Perl_free_tmps
+Perl_gp_free
+Perl_gp_ref
+Perl_gv_AVadd
+Perl_gv_HVadd
+Perl_gv_IOadd
+Perl_gv_autoload4
+Perl_gv_check
+Perl_gv_efullname
+Perl_gv_efullname3
+Perl_gv_fetchfile
+Perl_gv_fetchmeth
+Perl_gv_fetchmethod
+Perl_gv_fetchmethod_autoload
+Perl_gv_fetchpv
+Perl_gv_fullname
+Perl_gv_fullname3
+Perl_gv_init
+Perl_gv_stashpv
+Perl_gv_stashpvn
+Perl_gv_stashsv
+Perl_hv_clear
+Perl_hv_delayfree_ent
+Perl_hv_delete
+Perl_hv_delete_ent
+Perl_hv_exists
+Perl_hv_exists_ent
+Perl_hv_fetch
+Perl_hv_fetch_ent
+Perl_hv_free_ent
+Perl_hv_iterinit
+Perl_hv_iterkey
+Perl_hv_iterkeysv
+Perl_hv_iternext
+Perl_hv_iternextsv
+Perl_hv_iterval
+Perl_hv_ksplit
+Perl_hv_magic
+Perl_hv_store
+Perl_hv_store_ent
+Perl_hv_undef
+Perl_ibcmp
+Perl_ibcmp_locale
+Perl_init_stacks
+Perl_instr
+Perl_is_uni_alnum
+Perl_is_uni_alnumc
+Perl_is_uni_idfirst
+Perl_is_uni_alpha
+Perl_is_uni_ascii
+Perl_is_uni_space
+Perl_is_uni_cntrl
+Perl_is_uni_graph
+Perl_is_uni_digit
+Perl_is_uni_upper
+Perl_is_uni_lower
+Perl_is_uni_print
+Perl_is_uni_punct
+Perl_is_uni_xdigit
+Perl_to_uni_upper
+Perl_to_uni_title
+Perl_to_uni_lower
+Perl_is_uni_alnum_lc
+Perl_is_uni_alnumc_lc
+Perl_is_uni_idfirst_lc
+Perl_is_uni_alpha_lc
+Perl_is_uni_ascii_lc
+Perl_is_uni_space_lc
+Perl_is_uni_cntrl_lc
+Perl_is_uni_graph_lc
+Perl_is_uni_digit_lc
+Perl_is_uni_upper_lc
+Perl_is_uni_lower_lc
+Perl_is_uni_print_lc
+Perl_is_uni_punct_lc
+Perl_is_uni_xdigit_lc
+Perl_to_uni_upper_lc
+Perl_to_uni_title_lc
+Perl_to_uni_lower_lc
+Perl_is_utf8_char
+Perl_is_utf8_alnum
+Perl_is_utf8_alnumc
+Perl_is_utf8_idfirst
+Perl_is_utf8_alpha
+Perl_is_utf8_ascii
+Perl_is_utf8_space
+Perl_is_utf8_cntrl
+Perl_is_utf8_digit
+Perl_is_utf8_graph
+Perl_is_utf8_upper
+Perl_is_utf8_lower
+Perl_is_utf8_print
+Perl_is_utf8_punct
+Perl_is_utf8_xdigit
+Perl_is_utf8_mark
+Perl_leave_scope
+Perl_load_module
+Perl_vload_module
+Perl_looks_like_number
+Perl_markstack_grow
+Perl_mess
+Perl_vmess
+Perl_mg_clear
+Perl_mg_copy
+Perl_mg_find
+Perl_mg_free
+Perl_mg_get
+Perl_mg_length
+Perl_mg_magical
+Perl_mg_set
+Perl_mg_size
+Perl_moreswitches
+Perl_my_atof
+Perl_my_bcopy
+Perl_my_bzero
+Perl_my_exit
+Perl_my_failure_exit
+Perl_my_fflush_all
+Perl_my_lstat
+Perl_my_memcmp
+Perl_my_memset
+Perl_my_pclose
+Perl_my_popen
+Perl_my_setenv
+Perl_my_stat
+Perl_my_swap
+Perl_my_htonl
+Perl_my_ntohl
+Perl_newANONLIST
+Perl_newANONHASH
+Perl_newANONSUB
+Perl_newASSIGNOP
+Perl_newCONDOP
+Perl_newCONSTSUB
+Perl_newFORM
+Perl_newFOROP
+Perl_newLOGOP
+Perl_newLOOPEX
+Perl_newLOOPOP
+Perl_newNULLLIST
+Perl_newOP
+Perl_newPROG
+Perl_newRANGE
+Perl_newSLICEOP
+Perl_newSTATEOP
+Perl_newSUB
+Perl_newXS
+Perl_newAV
+Perl_newAVREF
+Perl_newBINOP
+Perl_newCVREF
+Perl_newGVOP
+Perl_newGVgen
+Perl_newGVREF
+Perl_newHVREF
+Perl_newHV
+Perl_newHVhv
+Perl_newIO
+Perl_newLISTOP
+Perl_newPADOP
+Perl_newPMOP
+Perl_newPVOP
+Perl_newRV
+Perl_newRV_noinc
+Perl_newSV
+Perl_newSVREF
+Perl_newSVOP
+Perl_newSViv
+Perl_newSVuv
+Perl_newSVnv
+Perl_newSVpv
+Perl_newSVpvn
+Perl_newSVpvf
+Perl_vnewSVpvf
+Perl_newSVrv
+Perl_newSVsv
+Perl_newUNOP
+Perl_newWHILEOP
+Perl_new_stackinfo
+Perl_ninstr
+Perl_op_free
+Perl_pad_sv
+Perl_new_struct_thread
+Perl_call_atexit
+Perl_call_argv
+Perl_call_method
+Perl_call_pv
+Perl_call_sv
+Perl_eval_pv
+Perl_eval_sv
+Perl_get_sv
+Perl_get_av
+Perl_get_hv
+Perl_get_cv
+Perl_init_i18nl10n
+Perl_init_i18nl14n
+Perl_new_collate
+Perl_new_ctype
+Perl_new_numeric
+Perl_set_numeric_local
+Perl_set_numeric_radix
+Perl_set_numeric_standard
+Perl_require_pv
+Perl_pmflag
+Perl_pop_scope
+Perl_push_scope
+Perl_regdump
+Perl_pregexec
+Perl_pregfree
+Perl_pregcomp
+Perl_re_intuit_start
+Perl_re_intuit_string
+Perl_regexec_flags
+Perl_regnext
+Perl_repeatcpy
+Perl_rninstr
+Perl_savepv
+Perl_savepvn
+Perl_savestack_grow
+Perl_save_aelem
+Perl_save_alloc
+Perl_save_aptr
+Perl_save_ary
+Perl_save_clearsv
+Perl_save_delete
+Perl_save_destructor
+Perl_save_destructor_x
+Perl_save_freesv
+Perl_save_freepv
+Perl_save_generic_svref
+Perl_save_gp
+Perl_save_hash
+Perl_save_helem
+Perl_save_hints
+Perl_save_hptr
+Perl_save_I16
+Perl_save_I32
+Perl_save_I8
+Perl_save_int
+Perl_save_item
+Perl_save_iv
+Perl_save_list
+Perl_save_long
+Perl_save_nogv
+Perl_save_scalar
+Perl_save_pptr
+Perl_save_vptr
+Perl_save_re_context
+Perl_save_sptr
+Perl_save_svref
+Perl_save_threadsv
+Perl_scan_bin
+Perl_scan_hex
+Perl_scan_num
+Perl_scan_oct
+Perl_screaminstr
+Perl_sharepvn
+Perl_stack_grow
+Perl_start_subparse
+Perl_sv_2bool
+Perl_sv_2cv
+Perl_sv_2io
+Perl_sv_2iv
+Perl_sv_2mortal
+Perl_sv_2nv
+Perl_sv_2pv
+Perl_sv_2pvutf8
+Perl_sv_2pvbyte
+Perl_sv_2uv
+Perl_sv_iv
+Perl_sv_uv
+Perl_sv_nv
+Perl_sv_pvn
+Perl_sv_pvutf8n
+Perl_sv_pvbyten
+Perl_sv_true
+Perl_sv_backoff
+Perl_sv_bless
+Perl_sv_catpvf
+Perl_sv_vcatpvf
+Perl_sv_catpv
+Perl_sv_catpvn
+Perl_sv_catsv
+Perl_sv_chop
+Perl_sv_clear
+Perl_sv_cmp
+Perl_sv_cmp_locale
+Perl_sv_collxfrm
+Perl_sv_compile_2op
+Perl_sv_dec
+Perl_sv_dump
+Perl_sv_derived_from
+Perl_sv_eq
+Perl_sv_free
+Perl_sv_gets
+Perl_sv_grow
+Perl_sv_inc
+Perl_sv_insert
+Perl_sv_isa
+Perl_sv_isobject
+Perl_sv_len
+Perl_sv_len_utf8
+Perl_sv_magic
+Perl_sv_mortalcopy
+Perl_sv_newmortal
+Perl_sv_newref
+Perl_sv_peek
+Perl_sv_pos_u2b
+Perl_sv_pos_b2u
+Perl_sv_pvn_force
+Perl_sv_pvutf8n_force
+Perl_sv_pvbyten_force
+Perl_sv_reftype
+Perl_sv_replace
+Perl_sv_report_used
+Perl_sv_reset
+Perl_sv_setpvf
+Perl_sv_vsetpvf
+Perl_sv_setiv
+Perl_sv_setpviv
+Perl_sv_setuv
+Perl_sv_setnv
+Perl_sv_setref_iv
+Perl_sv_setref_nv
+Perl_sv_setref_pv
+Perl_sv_setref_pvn
+Perl_sv_setpv
+Perl_sv_setpvn
+Perl_sv_setsv
+Perl_sv_taint
+Perl_sv_tainted
+Perl_sv_unmagic
+Perl_sv_unref
+Perl_sv_untaint
+Perl_sv_upgrade
+Perl_sv_usepvn
+Perl_sv_vcatpvfn
+Perl_sv_vsetpvfn
+Perl_str_to_version
+Perl_swash_init
+Perl_swash_fetch
+Perl_taint_env
+Perl_taint_proper
+Perl_to_utf8_lower
+Perl_to_utf8_upper
+Perl_to_utf8_title
+Perl_unlnk
+Perl_unlock_condpair
+Perl_unsharepvn
+Perl_utf16_to_utf8
+Perl_utf16_to_utf8_reversed
+Perl_utf8_distance
+Perl_utf8_hop
+Perl_utf8_to_uv
+Perl_uv_to_utf8
+Perl_warn
+Perl_vwarn
+Perl_warner
+Perl_vwarner
+Perl_dump_mstats
+Perl_get_mstats
+Perl_safesysmalloc
+Perl_safesyscalloc
+Perl_safesysrealloc
+Perl_safesysfree
+Perl_safexmalloc
+Perl_safexcalloc
+Perl_safexrealloc
+Perl_safexfree
+Perl_GetVars
+Perl_runops_standard
+Perl_runops_debug
+Perl_sv_catpvf_mg
+Perl_sv_vcatpvf_mg
+Perl_sv_catpv_mg
+Perl_sv_catpvn_mg
+Perl_sv_catsv_mg
+Perl_sv_setpvf_mg
+Perl_sv_vsetpvf_mg
+Perl_sv_setiv_mg
+Perl_sv_setpviv_mg
+Perl_sv_setuv_mg
+Perl_sv_setnv_mg
+Perl_sv_setpv_mg
+Perl_sv_setpvn_mg
+Perl_sv_setsv_mg
+Perl_sv_usepvn_mg
+Perl_get_vtbl
+Perl_dump_indent
+Perl_dump_vindent
+Perl_do_gv_dump
+Perl_do_gvgv_dump
+Perl_do_hv_dump
+Perl_do_magic_dump
+Perl_do_op_dump
+Perl_do_pmop_dump
+Perl_do_sv_dump
+Perl_magic_dump
+Perl_default_protect
+Perl_vdefault_protect
+Perl_reginitcolors
+Perl_sv_2pv_nolen
+Perl_sv_2pvutf8_nolen
+Perl_sv_2pvbyte_nolen
+Perl_sv_pv
+Perl_sv_pvutf8
+Perl_sv_pvbyte
+Perl_sv_utf8_upgrade
+Perl_sv_utf8_downgrade
+Perl_sv_utf8_encode
+Perl_sv_utf8_decode
+Perl_sv_force_normal
+Perl_tmps_grow
+Perl_sv_rvweaken
+Perl_newANONATTRSUB
+Perl_newATTRSUB
+Perl_newMYSUB
+Perl_cx_dup
+Perl_si_dup
+Perl_ss_dup
+Perl_any_dup
+Perl_he_dup
+Perl_re_dup
+Perl_fp_dup
+Perl_dirp_dup
+Perl_gp_dup
+Perl_mg_dup
+Perl_sv_dup
+Perl_sys_intern_dup
+Perl_ptr_table_new
+Perl_ptr_table_fetch
+Perl_ptr_table_store
+Perl_ptr_table_split
diff --git a/contrib/perl5/globals.c b/contrib/perl5/globals.c
index 1d8ef92..0782eba 100644
--- a/contrib/perl5/globals.c
+++ b/contrib/perl5/globals.c
@@ -1,1471 +1,82 @@
#include "INTERN.h"
+#define PERL_IN_GLOBALS_C
#include "perl.h"
#ifdef PERL_OBJECT
-#undef pp_null
-#define pp_null CPerlObj::Perl_pp_null
-#undef pp_stub
-#define pp_stub CPerlObj::Perl_pp_stub
-#undef pp_scalar
-#define pp_scalar CPerlObj::Perl_pp_scalar
-#undef pp_pushmark
-#define pp_pushmark CPerlObj::Perl_pp_pushmark
-#undef pp_wantarray
-#define pp_wantarray CPerlObj::Perl_pp_wantarray
-#undef pp_const
-#define pp_const CPerlObj::Perl_pp_const
-#undef pp_gvsv
-#define pp_gvsv CPerlObj::Perl_pp_gvsv
-#undef pp_gv
-#define pp_gv CPerlObj::Perl_pp_gv
-#undef pp_gelem
-#define pp_gelem CPerlObj::Perl_pp_gelem
-#undef pp_padsv
-#define pp_padsv CPerlObj::Perl_pp_padsv
-#undef pp_padav
-#define pp_padav CPerlObj::Perl_pp_padav
-#undef pp_padhv
-#define pp_padhv CPerlObj::Perl_pp_padhv
-#undef pp_padany
-#define pp_padany CPerlObj::Perl_pp_padany
-#undef pp_pushre
-#define pp_pushre CPerlObj::Perl_pp_pushre
-#undef pp_rv2gv
-#define pp_rv2gv CPerlObj::Perl_pp_rv2gv
-#undef pp_rv2sv
-#define pp_rv2sv CPerlObj::Perl_pp_rv2sv
-#undef pp_av2arylen
-#define pp_av2arylen CPerlObj::Perl_pp_av2arylen
-#undef pp_rv2cv
-#define pp_rv2cv CPerlObj::Perl_pp_rv2cv
-#undef pp_anoncode
-#define pp_anoncode CPerlObj::Perl_pp_anoncode
-#undef pp_prototype
-#define pp_prototype CPerlObj::Perl_pp_prototype
-#undef pp_refgen
-#define pp_refgen CPerlObj::Perl_pp_refgen
-#undef pp_srefgen
-#define pp_srefgen CPerlObj::Perl_pp_srefgen
-#undef pp_ref
-#define pp_ref CPerlObj::Perl_pp_ref
-#undef pp_bless
-#define pp_bless CPerlObj::Perl_pp_bless
-#undef pp_backtick
-#define pp_backtick CPerlObj::Perl_pp_backtick
-#undef pp_glob
-#define pp_glob CPerlObj::Perl_pp_glob
-#undef pp_readline
-#define pp_readline CPerlObj::Perl_pp_readline
-#undef pp_rcatline
-#define pp_rcatline CPerlObj::Perl_pp_rcatline
-#undef pp_regcmaybe
-#define pp_regcmaybe CPerlObj::Perl_pp_regcmaybe
-#undef pp_regcreset
-#define pp_regcreset CPerlObj::Perl_pp_regcreset
-#undef pp_regcomp
-#define pp_regcomp CPerlObj::Perl_pp_regcomp
-#undef pp_match
-#define pp_match CPerlObj::Perl_pp_match
-#undef pp_qr
-#define pp_qr CPerlObj::Perl_pp_qr
-#undef pp_subst
-#define pp_subst CPerlObj::Perl_pp_subst
-#undef pp_substcont
-#define pp_substcont CPerlObj::Perl_pp_substcont
-#undef pp_trans
-#define pp_trans CPerlObj::Perl_pp_trans
-#undef pp_sassign
-#define pp_sassign CPerlObj::Perl_pp_sassign
-#undef pp_aassign
-#define pp_aassign CPerlObj::Perl_pp_aassign
-#undef pp_chop
-#define pp_chop CPerlObj::Perl_pp_chop
-#undef pp_schop
-#define pp_schop CPerlObj::Perl_pp_schop
-#undef pp_chomp
-#define pp_chomp CPerlObj::Perl_pp_chomp
-#undef pp_schomp
-#define pp_schomp CPerlObj::Perl_pp_schomp
-#undef pp_defined
-#define pp_defined CPerlObj::Perl_pp_defined
-#undef pp_undef
-#define pp_undef CPerlObj::Perl_pp_undef
-#undef pp_study
-#define pp_study CPerlObj::Perl_pp_study
-#undef pp_pos
-#define pp_pos CPerlObj::Perl_pp_pos
-#undef pp_preinc
-#define pp_preinc CPerlObj::Perl_pp_preinc
-#undef pp_i_preinc
-#define pp_i_preinc CPerlObj::Perl_pp_preinc
-#undef pp_predec
-#define pp_predec CPerlObj::Perl_pp_predec
-#undef pp_i_predec
-#define pp_i_predec CPerlObj::Perl_pp_predec
-#undef pp_postinc
-#define pp_postinc CPerlObj::Perl_pp_postinc
-#undef pp_i_postinc
-#define pp_i_postinc CPerlObj::Perl_pp_postinc
-#undef pp_postdec
-#define pp_postdec CPerlObj::Perl_pp_postdec
-#undef pp_i_postdec
-#define pp_i_postdec CPerlObj::Perl_pp_postdec
-#undef pp_pow
-#define pp_pow CPerlObj::Perl_pp_pow
-#undef pp_multiply
-#define pp_multiply CPerlObj::Perl_pp_multiply
-#undef pp_i_multiply
-#define pp_i_multiply CPerlObj::Perl_pp_i_multiply
-#undef pp_divide
-#define pp_divide CPerlObj::Perl_pp_divide
-#undef pp_i_divide
-#define pp_i_divide CPerlObj::Perl_pp_i_divide
-#undef pp_modulo
-#define pp_modulo CPerlObj::Perl_pp_modulo
-#undef pp_i_modulo
-#define pp_i_modulo CPerlObj::Perl_pp_i_modulo
-#undef pp_repeat
-#define pp_repeat CPerlObj::Perl_pp_repeat
-#undef pp_add
-#define pp_add CPerlObj::Perl_pp_add
-#undef pp_i_add
-#define pp_i_add CPerlObj::Perl_pp_i_add
-#undef pp_subtract
-#define pp_subtract CPerlObj::Perl_pp_subtract
-#undef pp_i_subtract
-#define pp_i_subtract CPerlObj::Perl_pp_i_subtract
-#undef pp_concat
-#define pp_concat CPerlObj::Perl_pp_concat
-#undef pp_stringify
-#define pp_stringify CPerlObj::Perl_pp_stringify
-#undef pp_left_shift
-#define pp_left_shift CPerlObj::Perl_pp_left_shift
-#undef pp_right_shift
-#define pp_right_shift CPerlObj::Perl_pp_right_shift
-#undef pp_lt
-#define pp_lt CPerlObj::Perl_pp_lt
-#undef pp_i_lt
-#define pp_i_lt CPerlObj::Perl_pp_i_lt
-#undef pp_gt
-#define pp_gt CPerlObj::Perl_pp_gt
-#undef pp_i_gt
-#define pp_i_gt CPerlObj::Perl_pp_i_gt
-#undef pp_le
-#define pp_le CPerlObj::Perl_pp_le
-#undef pp_i_le
-#define pp_i_le CPerlObj::Perl_pp_i_le
-#undef pp_ge
-#define pp_ge CPerlObj::Perl_pp_ge
-#undef pp_i_ge
-#define pp_i_ge CPerlObj::Perl_pp_i_ge
-#undef pp_eq
-#define pp_eq CPerlObj::Perl_pp_eq
-#undef pp_i_eq
-#define pp_i_eq CPerlObj::Perl_pp_i_eq
-#undef pp_ne
-#define pp_ne CPerlObj::Perl_pp_ne
-#undef pp_i_ne
-#define pp_i_ne CPerlObj::Perl_pp_i_ne
-#undef pp_ncmp
-#define pp_ncmp CPerlObj::Perl_pp_ncmp
-#undef pp_i_ncmp
-#define pp_i_ncmp CPerlObj::Perl_pp_i_ncmp
-#undef pp_slt
-#define pp_slt CPerlObj::Perl_pp_slt
-#undef pp_sgt
-#define pp_sgt CPerlObj::Perl_pp_sgt
-#undef pp_sle
-#define pp_sle CPerlObj::Perl_pp_sle
-#undef pp_sge
-#define pp_sge CPerlObj::Perl_pp_sge
-#undef pp_seq
-#define pp_seq CPerlObj::Perl_pp_seq
-#undef pp_sne
-#define pp_sne CPerlObj::Perl_pp_sne
-#undef pp_scmp
-#define pp_scmp CPerlObj::Perl_pp_scmp
-#undef pp_bit_and
-#define pp_bit_and CPerlObj::Perl_pp_bit_and
-#undef pp_bit_xor
-#define pp_bit_xor CPerlObj::Perl_pp_bit_xor
-#undef pp_bit_or
-#define pp_bit_or CPerlObj::Perl_pp_bit_or
-#undef pp_negate
-#define pp_negate CPerlObj::Perl_pp_negate
-#undef pp_i_negate
-#define pp_i_negate CPerlObj::Perl_pp_i_negate
-#undef pp_not
-#define pp_not CPerlObj::Perl_pp_not
-#undef pp_complement
-#define pp_complement CPerlObj::Perl_pp_complement
-#undef pp_atan2
-#define pp_atan2 CPerlObj::Perl_pp_atan2
-#undef pp_sin
-#define pp_sin CPerlObj::Perl_pp_sin
-#undef pp_cos
-#define pp_cos CPerlObj::Perl_pp_cos
-#undef pp_rand
-#define pp_rand CPerlObj::Perl_pp_rand
-#undef pp_srand
-#define pp_srand CPerlObj::Perl_pp_srand
-#undef pp_exp
-#define pp_exp CPerlObj::Perl_pp_exp
-#undef pp_log
-#define pp_log CPerlObj::Perl_pp_log
-#undef pp_sqrt
-#define pp_sqrt CPerlObj::Perl_pp_sqrt
-#undef pp_int
-#define pp_int CPerlObj::Perl_pp_int
-#undef pp_hex
-#define pp_hex CPerlObj::Perl_pp_hex
-#undef pp_oct
-#define pp_oct CPerlObj::Perl_pp_oct
-#undef pp_abs
-#define pp_abs CPerlObj::Perl_pp_abs
-#undef pp_length
-#define pp_length CPerlObj::Perl_pp_length
-#undef pp_substr
-#define pp_substr CPerlObj::Perl_pp_substr
-#undef pp_vec
-#define pp_vec CPerlObj::Perl_pp_vec
-#undef pp_index
-#define pp_index CPerlObj::Perl_pp_index
-#undef pp_rindex
-#define pp_rindex CPerlObj::Perl_pp_rindex
-#undef pp_sprintf
-#define pp_sprintf CPerlObj::Perl_pp_sprintf
-#undef pp_formline
-#define pp_formline CPerlObj::Perl_pp_formline
-#undef pp_ord
-#define pp_ord CPerlObj::Perl_pp_ord
-#undef pp_chr
-#define pp_chr CPerlObj::Perl_pp_chr
-#undef pp_crypt
-#define pp_crypt CPerlObj::Perl_pp_crypt
-#undef pp_ucfirst
-#define pp_ucfirst CPerlObj::Perl_pp_ucfirst
-#undef pp_lcfirst
-#define pp_lcfirst CPerlObj::Perl_pp_lcfirst
-#undef pp_uc
-#define pp_uc CPerlObj::Perl_pp_uc
-#undef pp_lc
-#define pp_lc CPerlObj::Perl_pp_lc
-#undef pp_quotemeta
-#define pp_quotemeta CPerlObj::Perl_pp_quotemeta
-#undef pp_rv2av
-#define pp_rv2av CPerlObj::Perl_pp_rv2av
-#undef pp_aelemfast
-#define pp_aelemfast CPerlObj::Perl_pp_aelemfast
-#undef pp_aelem
-#define pp_aelem CPerlObj::Perl_pp_aelem
-#undef pp_aslice
-#define pp_aslice CPerlObj::Perl_pp_aslice
-#undef pp_each
-#define pp_each CPerlObj::Perl_pp_each
-#undef pp_values
-#define pp_values CPerlObj::Perl_pp_values
-#undef pp_keys
-#define pp_keys CPerlObj::Perl_pp_keys
-#undef pp_delete
-#define pp_delete CPerlObj::Perl_pp_delete
-#undef pp_exists
-#define pp_exists CPerlObj::Perl_pp_exists
-#undef pp_rv2hv
-#define pp_rv2hv CPerlObj::Perl_pp_rv2hv
-#undef pp_helem
-#define pp_helem CPerlObj::Perl_pp_helem
-#undef pp_hslice
-#define pp_hslice CPerlObj::Perl_pp_hslice
-#undef pp_unpack
-#define pp_unpack CPerlObj::Perl_pp_unpack
-#undef pp_pack
-#define pp_pack CPerlObj::Perl_pp_pack
-#undef pp_split
-#define pp_split CPerlObj::Perl_pp_split
-#undef pp_join
-#define pp_join CPerlObj::Perl_pp_join
-#undef pp_list
-#define pp_list CPerlObj::Perl_pp_list
-#undef pp_lslice
-#define pp_lslice CPerlObj::Perl_pp_lslice
-#undef pp_anonlist
-#define pp_anonlist CPerlObj::Perl_pp_anonlist
-#undef pp_anonhash
-#define pp_anonhash CPerlObj::Perl_pp_anonhash
-#undef pp_splice
-#define pp_splice CPerlObj::Perl_pp_splice
-#undef pp_push
-#define pp_push CPerlObj::Perl_pp_push
-#undef pp_pop
-#define pp_pop CPerlObj::Perl_pp_pop
-#undef pp_shift
-#define pp_shift CPerlObj::Perl_pp_shift
-#undef pp_unshift
-#define pp_unshift CPerlObj::Perl_pp_unshift
-#undef pp_sort
-#define pp_sort CPerlObj::Perl_pp_sort
-#undef pp_reverse
-#define pp_reverse CPerlObj::Perl_pp_reverse
-#undef pp_grepstart
-#define pp_grepstart CPerlObj::Perl_pp_grepstart
-#undef pp_grepwhile
-#define pp_grepwhile CPerlObj::Perl_pp_grepwhile
-#undef pp_mapstart
-#define pp_mapstart CPerlObj::Perl_pp_mapstart
-#undef pp_mapwhile
-#define pp_mapwhile CPerlObj::Perl_pp_mapwhile
-#undef pp_range
-#define pp_range CPerlObj::Perl_pp_range
-#undef pp_flip
-#define pp_flip CPerlObj::Perl_pp_flip
-#undef pp_flop
-#define pp_flop CPerlObj::Perl_pp_flop
-#undef pp_and
-#define pp_and CPerlObj::Perl_pp_and
-#undef pp_or
-#define pp_or CPerlObj::Perl_pp_or
-#undef pp_xor
-#define pp_xor CPerlObj::Perl_pp_xor
-#undef pp_cond_expr
-#define pp_cond_expr CPerlObj::Perl_pp_cond_expr
-#undef pp_andassign
-#define pp_andassign CPerlObj::Perl_pp_andassign
-#undef pp_orassign
-#define pp_orassign CPerlObj::Perl_pp_orassign
-#undef pp_method
-#define pp_method CPerlObj::Perl_pp_method
-#undef pp_entersub
-#define pp_entersub CPerlObj::Perl_pp_entersub
-#undef pp_leavesub
-#define pp_leavesub CPerlObj::Perl_pp_leavesub
-#undef pp_caller
-#define pp_caller CPerlObj::Perl_pp_caller
-#undef pp_warn
-#define pp_warn CPerlObj::Perl_pp_warn
-#undef pp_die
-#define pp_die CPerlObj::Perl_pp_die
-#undef pp_reset
-#define pp_reset CPerlObj::Perl_pp_reset
-#undef pp_lineseq
-#define pp_lineseq CPerlObj::Perl_pp_lineseq
-#undef pp_nextstate
-#define pp_nextstate CPerlObj::Perl_pp_nextstate
-#undef pp_dbstate
-#define pp_dbstate CPerlObj::Perl_pp_dbstate
-#undef pp_unstack
-#define pp_unstack CPerlObj::Perl_pp_unstack
-#undef pp_enter
-#define pp_enter CPerlObj::Perl_pp_enter
-#undef pp_leave
-#define pp_leave CPerlObj::Perl_pp_leave
-#undef pp_scope
-#define pp_scope CPerlObj::Perl_pp_scope
-#undef pp_enteriter
-#define pp_enteriter CPerlObj::Perl_pp_enteriter
-#undef pp_iter
-#define pp_iter CPerlObj::Perl_pp_iter
-#undef pp_enterloop
-#define pp_enterloop CPerlObj::Perl_pp_enterloop
-#undef pp_leaveloop
-#define pp_leaveloop CPerlObj::Perl_pp_leaveloop
-#undef pp_return
-#define pp_return CPerlObj::Perl_pp_return
-#undef pp_last
-#define pp_last CPerlObj::Perl_pp_last
-#undef pp_next
-#define pp_next CPerlObj::Perl_pp_next
-#undef pp_redo
-#define pp_redo CPerlObj::Perl_pp_redo
-#undef pp_dump
-#define pp_dump CPerlObj::Perl_pp_dump
-#undef pp_goto
-#define pp_goto CPerlObj::Perl_pp_goto
-#undef pp_exit
-#define pp_exit CPerlObj::Perl_pp_exit
-#undef pp_open
-#define pp_open CPerlObj::Perl_pp_open
-#undef pp_close
-#define pp_close CPerlObj::Perl_pp_close
-#undef pp_pipe_op
-#define pp_pipe_op CPerlObj::Perl_pp_pipe_op
-#undef pp_fileno
-#define pp_fileno CPerlObj::Perl_pp_fileno
-#undef pp_umask
-#define pp_umask CPerlObj::Perl_pp_umask
-#undef pp_binmode
-#define pp_binmode CPerlObj::Perl_pp_binmode
-#undef pp_tie
-#define pp_tie CPerlObj::Perl_pp_tie
-#undef pp_untie
-#define pp_untie CPerlObj::Perl_pp_untie
-#undef pp_tied
-#define pp_tied CPerlObj::Perl_pp_tied
-#undef pp_dbmopen
-#define pp_dbmopen CPerlObj::Perl_pp_dbmopen
-#undef pp_dbmclose
-#define pp_dbmclose CPerlObj::Perl_pp_dbmclose
-#undef pp_sselect
-#define pp_sselect CPerlObj::Perl_pp_sselect
-#undef pp_select
-#define pp_select CPerlObj::Perl_pp_select
-#undef pp_getc
-#define pp_getc CPerlObj::Perl_pp_getc
-#undef pp_read
-#define pp_read CPerlObj::Perl_pp_read
-#undef pp_enterwrite
-#define pp_enterwrite CPerlObj::Perl_pp_enterwrite
-#undef pp_leavewrite
-#define pp_leavewrite CPerlObj::Perl_pp_leavewrite
-#undef pp_prtf
-#define pp_prtf CPerlObj::Perl_pp_prtf
-#undef pp_print
-#define pp_print CPerlObj::Perl_pp_print
-#undef pp_sysopen
-#define pp_sysopen CPerlObj::Perl_pp_sysopen
-#undef pp_sysseek
-#define pp_sysseek CPerlObj::Perl_pp_sysseek
-#undef pp_sysread
-#define pp_sysread CPerlObj::Perl_pp_sysread
-#undef pp_syswrite
-#define pp_syswrite CPerlObj::Perl_pp_syswrite
-#undef pp_send
-#define pp_send CPerlObj::Perl_pp_send
-#undef pp_recv
-#define pp_recv CPerlObj::Perl_pp_recv
-#undef pp_eof
-#define pp_eof CPerlObj::Perl_pp_eof
-#undef pp_tell
-#define pp_tell CPerlObj::Perl_pp_tell
-#undef pp_seek
-#define pp_seek CPerlObj::Perl_pp_seek
-#undef pp_truncate
-#define pp_truncate CPerlObj::Perl_pp_truncate
-#undef pp_fcntl
-#define pp_fcntl CPerlObj::Perl_pp_fcntl
-#undef pp_ioctl
-#define pp_ioctl CPerlObj::Perl_pp_ioctl
-#undef pp_flock
-#define pp_flock CPerlObj::Perl_pp_flock
-#undef pp_socket
-#define pp_socket CPerlObj::Perl_pp_socket
-#undef pp_sockpair
-#define pp_sockpair CPerlObj::Perl_pp_sockpair
-#undef pp_bind
-#define pp_bind CPerlObj::Perl_pp_bind
-#undef pp_connect
-#define pp_connect CPerlObj::Perl_pp_connect
-#undef pp_listen
-#define pp_listen CPerlObj::Perl_pp_listen
-#undef pp_accept
-#define pp_accept CPerlObj::Perl_pp_accept
-#undef pp_shutdown
-#define pp_shutdown CPerlObj::Perl_pp_shutdown
-#undef pp_gsockopt
-#define pp_gsockopt CPerlObj::Perl_pp_gsockopt
-#undef pp_ssockopt
-#define pp_ssockopt CPerlObj::Perl_pp_ssockopt
-#undef pp_getsockname
-#define pp_getsockname CPerlObj::Perl_pp_getsockname
-#undef pp_getpeername
-#define pp_getpeername CPerlObj::Perl_pp_getpeername
-#undef pp_lstat
-#define pp_lstat CPerlObj::Perl_pp_lstat
-#undef pp_stat
-#define pp_stat CPerlObj::Perl_pp_stat
-#undef pp_ftrread
-#define pp_ftrread CPerlObj::Perl_pp_ftrread
-#undef pp_ftrwrite
-#define pp_ftrwrite CPerlObj::Perl_pp_ftrwrite
-#undef pp_ftrexec
-#define pp_ftrexec CPerlObj::Perl_pp_ftrexec
-#undef pp_fteread
-#define pp_fteread CPerlObj::Perl_pp_fteread
-#undef pp_ftewrite
-#define pp_ftewrite CPerlObj::Perl_pp_ftewrite
-#undef pp_fteexec
-#define pp_fteexec CPerlObj::Perl_pp_fteexec
-#undef pp_ftis
-#define pp_ftis CPerlObj::Perl_pp_ftis
-#undef pp_fteowned
-#define pp_fteowned CPerlObj::Perl_pp_fteowned
-#undef pp_ftrowned
-#define pp_ftrowned CPerlObj::Perl_pp_ftrowned
-#undef pp_ftzero
-#define pp_ftzero CPerlObj::Perl_pp_ftzero
-#undef pp_ftsize
-#define pp_ftsize CPerlObj::Perl_pp_ftsize
-#undef pp_ftmtime
-#define pp_ftmtime CPerlObj::Perl_pp_ftmtime
-#undef pp_ftatime
-#define pp_ftatime CPerlObj::Perl_pp_ftatime
-#undef pp_ftctime
-#define pp_ftctime CPerlObj::Perl_pp_ftctime
-#undef pp_ftsock
-#define pp_ftsock CPerlObj::Perl_pp_ftsock
-#undef pp_ftchr
-#define pp_ftchr CPerlObj::Perl_pp_ftchr
-#undef pp_ftblk
-#define pp_ftblk CPerlObj::Perl_pp_ftblk
-#undef pp_ftfile
-#define pp_ftfile CPerlObj::Perl_pp_ftfile
-#undef pp_ftdir
-#define pp_ftdir CPerlObj::Perl_pp_ftdir
-#undef pp_ftpipe
-#define pp_ftpipe CPerlObj::Perl_pp_ftpipe
-#undef pp_ftlink
-#define pp_ftlink CPerlObj::Perl_pp_ftlink
-#undef pp_ftsuid
-#define pp_ftsuid CPerlObj::Perl_pp_ftsuid
-#undef pp_ftsgid
-#define pp_ftsgid CPerlObj::Perl_pp_ftsgid
-#undef pp_ftsvtx
-#define pp_ftsvtx CPerlObj::Perl_pp_ftsvtx
-#undef pp_fttty
-#define pp_fttty CPerlObj::Perl_pp_fttty
-#undef pp_fttext
-#define pp_fttext CPerlObj::Perl_pp_fttext
-#undef pp_ftbinary
-#define pp_ftbinary CPerlObj::Perl_pp_ftbinary
-#undef pp_chdir
-#define pp_chdir CPerlObj::Perl_pp_chdir
-#undef pp_chown
-#define pp_chown CPerlObj::Perl_pp_chown
-#undef pp_chroot
-#define pp_chroot CPerlObj::Perl_pp_chroot
-#undef pp_unlink
-#define pp_unlink CPerlObj::Perl_pp_unlink
-#undef pp_chmod
-#define pp_chmod CPerlObj::Perl_pp_chmod
-#undef pp_utime
-#define pp_utime CPerlObj::Perl_pp_utime
-#undef pp_rename
-#define pp_rename CPerlObj::Perl_pp_rename
-#undef pp_link
-#define pp_link CPerlObj::Perl_pp_link
-#undef pp_symlink
-#define pp_symlink CPerlObj::Perl_pp_symlink
-#undef pp_readlink
-#define pp_readlink CPerlObj::Perl_pp_readlink
-#undef pp_mkdir
-#define pp_mkdir CPerlObj::Perl_pp_mkdir
-#undef pp_rmdir
-#define pp_rmdir CPerlObj::Perl_pp_rmdir
-#undef pp_open_dir
-#define pp_open_dir CPerlObj::Perl_pp_open_dir
-#undef pp_readdir
-#define pp_readdir CPerlObj::Perl_pp_readdir
-#undef pp_telldir
-#define pp_telldir CPerlObj::Perl_pp_telldir
-#undef pp_seekdir
-#define pp_seekdir CPerlObj::Perl_pp_seekdir
-#undef pp_rewinddir
-#define pp_rewinddir CPerlObj::Perl_pp_rewinddir
-#undef pp_closedir
-#define pp_closedir CPerlObj::Perl_pp_closedir
-#undef pp_fork
-#define pp_fork CPerlObj::Perl_pp_fork
-#undef pp_wait
-#define pp_wait CPerlObj::Perl_pp_wait
-#undef pp_waitpid
-#define pp_waitpid CPerlObj::Perl_pp_waitpid
-#undef pp_system
-#define pp_system CPerlObj::Perl_pp_system
-#undef pp_exec
-#define pp_exec CPerlObj::Perl_pp_exec
-#undef pp_kill
-#define pp_kill CPerlObj::Perl_pp_kill
-#undef pp_getppid
-#define pp_getppid CPerlObj::Perl_pp_getppid
-#undef pp_getpgrp
-#define pp_getpgrp CPerlObj::Perl_pp_getpgrp
-#undef pp_setpgrp
-#define pp_setpgrp CPerlObj::Perl_pp_setpgrp
-#undef pp_getpriority
-#define pp_getpriority CPerlObj::Perl_pp_getpriority
-#undef pp_setpriority
-#define pp_setpriority CPerlObj::Perl_pp_setpriority
-#undef pp_time
-#define pp_time CPerlObj::Perl_pp_time
-#undef pp_tms
-#define pp_tms CPerlObj::Perl_pp_tms
-#undef pp_localtime
-#define pp_localtime CPerlObj::Perl_pp_localtime
-#undef pp_gmtime
-#define pp_gmtime CPerlObj::Perl_pp_gmtime
-#undef pp_alarm
-#define pp_alarm CPerlObj::Perl_pp_alarm
-#undef pp_sleep
-#define pp_sleep CPerlObj::Perl_pp_sleep
-#undef pp_shmget
-#define pp_shmget CPerlObj::Perl_pp_shmget
-#undef pp_shmctl
-#define pp_shmctl CPerlObj::Perl_pp_shmctl
-#undef pp_shmread
-#define pp_shmread CPerlObj::Perl_pp_shmread
-#undef pp_shmwrite
-#define pp_shmwrite CPerlObj::Perl_pp_shmwrite
-#undef pp_msgget
-#define pp_msgget CPerlObj::Perl_pp_msgget
-#undef pp_msgctl
-#define pp_msgctl CPerlObj::Perl_pp_msgctl
-#undef pp_msgsnd
-#define pp_msgsnd CPerlObj::Perl_pp_msgsnd
-#undef pp_msgrcv
-#define pp_msgrcv CPerlObj::Perl_pp_msgrcv
-#undef pp_semget
-#define pp_semget CPerlObj::Perl_pp_semget
-#undef pp_semctl
-#define pp_semctl CPerlObj::Perl_pp_semctl
-#undef pp_semop
-#define pp_semop CPerlObj::Perl_pp_semop
-#undef pp_require
-#define pp_require CPerlObj::Perl_pp_require
-#undef pp_dofile
-#define pp_dofile CPerlObj::Perl_pp_dofile
-#undef pp_entereval
-#define pp_entereval CPerlObj::Perl_pp_entereval
-#undef pp_leaveeval
-#define pp_leaveeval CPerlObj::Perl_pp_leaveeval
-#undef pp_entertry
-#define pp_entertry CPerlObj::Perl_pp_entertry
-#undef pp_leavetry
-#define pp_leavetry CPerlObj::Perl_pp_leavetry
-#undef pp_ghbyname
-#define pp_ghbyname CPerlObj::Perl_pp_ghbyname
-#undef pp_ghbyaddr
-#define pp_ghbyaddr CPerlObj::Perl_pp_ghbyaddr
-#undef pp_ghostent
-#define pp_ghostent CPerlObj::Perl_pp_ghostent
-#undef pp_gnbyname
-#define pp_gnbyname CPerlObj::Perl_pp_gnbyname
-#undef pp_gnbyaddr
-#define pp_gnbyaddr CPerlObj::Perl_pp_gnbyaddr
-#undef pp_gnetent
-#define pp_gnetent CPerlObj::Perl_pp_gnetent
-#undef pp_gpbyname
-#define pp_gpbyname CPerlObj::Perl_pp_gpbyname
-#undef pp_gpbynumber
-#define pp_gpbynumber CPerlObj::Perl_pp_gpbynumber
-#undef pp_gprotoent
-#define pp_gprotoent CPerlObj::Perl_pp_gprotoent
-#undef pp_gsbyname
-#define pp_gsbyname CPerlObj::Perl_pp_gsbyname
-#undef pp_gsbyport
-#define pp_gsbyport CPerlObj::Perl_pp_gsbyport
-#undef pp_gservent
-#define pp_gservent CPerlObj::Perl_pp_gservent
-#undef pp_shostent
-#define pp_shostent CPerlObj::Perl_pp_shostent
-#undef pp_snetent
-#define pp_snetent CPerlObj::Perl_pp_snetent
-#undef pp_sprotoent
-#define pp_sprotoent CPerlObj::Perl_pp_sprotoent
-#undef pp_sservent
-#define pp_sservent CPerlObj::Perl_pp_sservent
-#undef pp_ehostent
-#define pp_ehostent CPerlObj::Perl_pp_ehostent
-#undef pp_enetent
-#define pp_enetent CPerlObj::Perl_pp_enetent
-#undef pp_eprotoent
-#define pp_eprotoent CPerlObj::Perl_pp_eprotoent
-#undef pp_eservent
-#define pp_eservent CPerlObj::Perl_pp_eservent
-#undef pp_gpwnam
-#define pp_gpwnam CPerlObj::Perl_pp_gpwnam
-#undef pp_gpwuid
-#define pp_gpwuid CPerlObj::Perl_pp_gpwuid
-#undef pp_gpwent
-#define pp_gpwent CPerlObj::Perl_pp_gpwent
-#undef pp_spwent
-#define pp_spwent CPerlObj::Perl_pp_spwent
-#undef pp_epwent
-#define pp_epwent CPerlObj::Perl_pp_epwent
-#undef pp_ggrnam
-#define pp_ggrnam CPerlObj::Perl_pp_ggrnam
-#undef pp_ggrgid
-#define pp_ggrgid CPerlObj::Perl_pp_ggrgid
-#undef pp_ggrent
-#define pp_ggrent CPerlObj::Perl_pp_ggrent
-#undef pp_sgrent
-#define pp_sgrent CPerlObj::Perl_pp_sgrent
-#undef pp_egrent
-#define pp_egrent CPerlObj::Perl_pp_egrent
-#undef pp_getlogin
-#define pp_getlogin CPerlObj::Perl_pp_getlogin
-#undef pp_syscall
-#define pp_syscall CPerlObj::Perl_pp_syscall
-#undef pp_lock
-#define pp_lock CPerlObj::Perl_pp_lock
-#undef pp_threadsv
-#define pp_threadsv CPerlObj::Perl_pp_threadsv
-
-OP * (CPERLscope(*check)[]) _((OP *op)) = {
- ck_null, /* null */
- ck_null, /* stub */
- ck_fun, /* scalar */
- ck_null, /* pushmark */
- ck_null, /* wantarray */
- ck_svconst, /* const */
- ck_null, /* gvsv */
- ck_null, /* gv */
- ck_null, /* gelem */
- ck_null, /* padsv */
- ck_null, /* padav */
- ck_null, /* padhv */
- ck_null, /* padany */
- ck_null, /* pushre */
- ck_rvconst, /* rv2gv */
- ck_rvconst, /* rv2sv */
- ck_null, /* av2arylen */
- ck_rvconst, /* rv2cv */
- ck_anoncode, /* anoncode */
- ck_null, /* prototype */
- ck_spair, /* refgen */
- ck_null, /* srefgen */
- ck_fun, /* ref */
- ck_fun, /* bless */
- ck_null, /* backtick */
- ck_glob, /* glob */
- ck_null, /* readline */
- ck_null, /* rcatline */
- ck_fun, /* regcmaybe */
- ck_fun, /* regcreset */
- ck_null, /* regcomp */
- ck_match, /* match */
- ck_match, /* qr */
- ck_null, /* subst */
- ck_null, /* substcont */
- ck_null, /* trans */
- ck_null, /* sassign */
- ck_null, /* aassign */
- ck_spair, /* chop */
- ck_null, /* schop */
- ck_spair, /* chomp */
- ck_null, /* schomp */
- ck_rfun, /* defined */
- ck_lfun, /* undef */
- ck_fun, /* study */
- ck_lfun, /* pos */
- ck_lfun, /* preinc */
- ck_lfun, /* i_preinc */
- ck_lfun, /* predec */
- ck_lfun, /* i_predec */
- ck_lfun, /* postinc */
- ck_lfun, /* i_postinc */
- ck_lfun, /* postdec */
- ck_lfun, /* i_postdec */
- ck_null, /* pow */
- ck_null, /* multiply */
- ck_null, /* i_multiply */
- ck_null, /* divide */
- ck_null, /* i_divide */
- ck_null, /* modulo */
- ck_null, /* i_modulo */
- ck_repeat, /* repeat */
- ck_null, /* add */
- ck_null, /* i_add */
- ck_null, /* subtract */
- ck_null, /* i_subtract */
- ck_concat, /* concat */
- ck_fun, /* stringify */
- ck_bitop, /* left_shift */
- ck_bitop, /* right_shift */
- ck_null, /* lt */
- ck_null, /* i_lt */
- ck_null, /* gt */
- ck_null, /* i_gt */
- ck_null, /* le */
- ck_null, /* i_le */
- ck_null, /* ge */
- ck_null, /* i_ge */
- ck_null, /* eq */
- ck_null, /* i_eq */
- ck_null, /* ne */
- ck_null, /* i_ne */
- ck_null, /* ncmp */
- ck_null, /* i_ncmp */
- ck_scmp, /* slt */
- ck_scmp, /* sgt */
- ck_scmp, /* sle */
- ck_scmp, /* sge */
- ck_null, /* seq */
- ck_null, /* sne */
- ck_scmp, /* scmp */
- ck_bitop, /* bit_and */
- ck_bitop, /* bit_xor */
- ck_bitop, /* bit_or */
- ck_null, /* negate */
- ck_null, /* i_negate */
- ck_null, /* not */
- ck_bitop, /* complement */
- ck_fun, /* atan2 */
- ck_fun, /* sin */
- ck_fun, /* cos */
- ck_fun, /* rand */
- ck_fun, /* srand */
- ck_fun, /* exp */
- ck_fun, /* log */
- ck_fun, /* sqrt */
- ck_fun, /* int */
- ck_fun, /* hex */
- ck_fun, /* oct */
- ck_fun, /* abs */
- ck_lengthconst, /* length */
- ck_fun, /* substr */
- ck_fun, /* vec */
- ck_index, /* index */
- ck_index, /* rindex */
- ck_fun_locale, /* sprintf */
- ck_fun, /* formline */
- ck_fun, /* ord */
- ck_fun, /* chr */
- ck_fun, /* crypt */
- ck_fun_locale, /* ucfirst */
- ck_fun_locale, /* lcfirst */
- ck_fun_locale, /* uc */
- ck_fun_locale, /* lc */
- ck_fun, /* quotemeta */
- ck_rvconst, /* rv2av */
- ck_null, /* aelemfast */
- ck_null, /* aelem */
- ck_null, /* aslice */
- ck_fun, /* each */
- ck_fun, /* values */
- ck_fun, /* keys */
- ck_delete, /* delete */
- ck_exists, /* exists */
- ck_rvconst, /* rv2hv */
- ck_null, /* helem */
- ck_null, /* hslice */
- ck_fun, /* unpack */
- ck_fun, /* pack */
- ck_split, /* split */
- ck_fun, /* join */
- ck_null, /* list */
- ck_null, /* lslice */
- ck_fun, /* anonlist */
- ck_fun, /* anonhash */
- ck_fun, /* splice */
- ck_fun, /* push */
- ck_shift, /* pop */
- ck_shift, /* shift */
- ck_fun, /* unshift */
- ck_sort, /* sort */
- ck_fun, /* reverse */
- ck_grep, /* grepstart */
- ck_null, /* grepwhile */
- ck_grep, /* mapstart */
- ck_null, /* mapwhile */
- ck_null, /* range */
- ck_null, /* flip */
- ck_null, /* flop */
- ck_null, /* and */
- ck_null, /* or */
- ck_null, /* xor */
- ck_null, /* cond_expr */
- ck_null, /* andassign */
- ck_null, /* orassign */
- ck_null, /* method */
- ck_subr, /* entersub */
- ck_null, /* leavesub */
- ck_fun, /* caller */
- ck_fun, /* warn */
- ck_fun, /* die */
- ck_fun, /* reset */
- ck_null, /* lineseq */
- ck_null, /* nextstate */
- ck_null, /* dbstate */
- ck_null, /* unstack */
- ck_null, /* enter */
- ck_null, /* leave */
- ck_null, /* scope */
- ck_null, /* enteriter */
- ck_null, /* iter */
- ck_null, /* enterloop */
- ck_null, /* leaveloop */
- ck_null, /* return */
- ck_null, /* last */
- ck_null, /* next */
- ck_null, /* redo */
- ck_null, /* dump */
- ck_null, /* goto */
- ck_fun, /* exit */
- ck_fun, /* open */
- ck_fun, /* close */
- ck_fun, /* pipe_op */
- ck_fun, /* fileno */
- ck_fun, /* umask */
- ck_fun, /* binmode */
- ck_fun, /* tie */
- ck_fun, /* untie */
- ck_fun, /* tied */
- ck_fun, /* dbmopen */
- ck_fun, /* dbmclose */
- ck_select, /* sselect */
- ck_select, /* select */
- ck_eof, /* getc */
- ck_fun, /* read */
- ck_fun, /* enterwrite */
- ck_null, /* leavewrite */
- ck_listiob, /* prtf */
- ck_listiob, /* print */
- ck_fun, /* sysopen */
- ck_fun, /* sysseek */
- ck_fun, /* sysread */
- ck_fun, /* syswrite */
- ck_fun, /* send */
- ck_fun, /* recv */
- ck_eof, /* eof */
- ck_fun, /* tell */
- ck_fun, /* seek */
- ck_trunc, /* truncate */
- ck_fun, /* fcntl */
- ck_fun, /* ioctl */
- ck_fun, /* flock */
- ck_fun, /* socket */
- ck_fun, /* sockpair */
- ck_fun, /* bind */
- ck_fun, /* connect */
- ck_fun, /* listen */
- ck_fun, /* accept */
- ck_fun, /* shutdown */
- ck_fun, /* gsockopt */
- ck_fun, /* ssockopt */
- ck_fun, /* getsockname */
- ck_fun, /* getpeername */
- ck_ftst, /* lstat */
- ck_ftst, /* stat */
- ck_ftst, /* ftrread */
- ck_ftst, /* ftrwrite */
- ck_ftst, /* ftrexec */
- ck_ftst, /* fteread */
- ck_ftst, /* ftewrite */
- ck_ftst, /* fteexec */
- ck_ftst, /* ftis */
- ck_ftst, /* fteowned */
- ck_ftst, /* ftrowned */
- ck_ftst, /* ftzero */
- ck_ftst, /* ftsize */
- ck_ftst, /* ftmtime */
- ck_ftst, /* ftatime */
- ck_ftst, /* ftctime */
- ck_ftst, /* ftsock */
- ck_ftst, /* ftchr */
- ck_ftst, /* ftblk */
- ck_ftst, /* ftfile */
- ck_ftst, /* ftdir */
- ck_ftst, /* ftpipe */
- ck_ftst, /* ftlink */
- ck_ftst, /* ftsuid */
- ck_ftst, /* ftsgid */
- ck_ftst, /* ftsvtx */
- ck_ftst, /* fttty */
- ck_ftst, /* fttext */
- ck_ftst, /* ftbinary */
- ck_fun, /* chdir */
- ck_fun, /* chown */
- ck_fun, /* chroot */
- ck_fun, /* unlink */
- ck_fun, /* chmod */
- ck_fun, /* utime */
- ck_fun, /* rename */
- ck_fun, /* link */
- ck_fun, /* symlink */
- ck_fun, /* readlink */
- ck_fun, /* mkdir */
- ck_fun, /* rmdir */
- ck_fun, /* open_dir */
- ck_fun, /* readdir */
- ck_fun, /* telldir */
- ck_fun, /* seekdir */
- ck_fun, /* rewinddir */
- ck_fun, /* closedir */
- ck_null, /* fork */
- ck_null, /* wait */
- ck_fun, /* waitpid */
- ck_exec, /* system */
- ck_exec, /* exec */
- ck_fun, /* kill */
- ck_null, /* getppid */
- ck_fun, /* getpgrp */
- ck_fun, /* setpgrp */
- ck_fun, /* getpriority */
- ck_fun, /* setpriority */
- ck_null, /* time */
- ck_null, /* tms */
- ck_fun, /* localtime */
- ck_fun, /* gmtime */
- ck_fun, /* alarm */
- ck_fun, /* sleep */
- ck_fun, /* shmget */
- ck_fun, /* shmctl */
- ck_fun, /* shmread */
- ck_fun, /* shmwrite */
- ck_fun, /* msgget */
- ck_fun, /* msgctl */
- ck_fun, /* msgsnd */
- ck_fun, /* msgrcv */
- ck_fun, /* semget */
- ck_fun, /* semctl */
- ck_fun, /* semop */
- ck_require, /* require */
- ck_fun, /* dofile */
- ck_eval, /* entereval */
- ck_null, /* leaveeval */
- ck_null, /* entertry */
- ck_null, /* leavetry */
- ck_fun, /* ghbyname */
- ck_fun, /* ghbyaddr */
- ck_null, /* ghostent */
- ck_fun, /* gnbyname */
- ck_fun, /* gnbyaddr */
- ck_null, /* gnetent */
- ck_fun, /* gpbyname */
- ck_fun, /* gpbynumber */
- ck_null, /* gprotoent */
- ck_fun, /* gsbyname */
- ck_fun, /* gsbyport */
- ck_null, /* gservent */
- ck_fun, /* shostent */
- ck_fun, /* snetent */
- ck_fun, /* sprotoent */
- ck_fun, /* sservent */
- ck_null, /* ehostent */
- ck_null, /* enetent */
- ck_null, /* eprotoent */
- ck_null, /* eservent */
- ck_fun, /* gpwnam */
- ck_fun, /* gpwuid */
- ck_null, /* gpwent */
- ck_null, /* spwent */
- ck_null, /* epwent */
- ck_fun, /* ggrnam */
- ck_fun, /* ggrgid */
- ck_null, /* ggrent */
- ck_null, /* sgrent */
- ck_null, /* egrent */
- ck_null, /* getlogin */
- ck_fun, /* syscall */
- ck_rfun, /* lock */
- ck_null, /* threadsv */
-};
-
-OP * (CPERLscope(*ppaddr)[])(ARGSproto) = {
- pp_null,
- pp_stub,
- pp_scalar,
- pp_pushmark,
- pp_wantarray,
- pp_const,
- pp_gvsv,
- pp_gv,
- pp_gelem,
- pp_padsv,
- pp_padav,
- pp_padhv,
- pp_padany,
- pp_pushre,
- pp_rv2gv,
- pp_rv2sv,
- pp_av2arylen,
- pp_rv2cv,
- pp_anoncode,
- pp_prototype,
- pp_refgen,
- pp_srefgen,
- pp_ref,
- pp_bless,
- pp_backtick,
- pp_glob,
- pp_readline,
- pp_rcatline,
- pp_regcmaybe,
- pp_regcreset,
- pp_regcomp,
- pp_match,
- pp_qr,
- pp_subst,
- pp_substcont,
- pp_trans,
- pp_sassign,
- pp_aassign,
- pp_chop,
- pp_schop,
- pp_chomp,
- pp_schomp,
- pp_defined,
- pp_undef,
- pp_study,
- pp_pos,
- pp_preinc,
- pp_i_preinc,
- pp_predec,
- pp_i_predec,
- pp_postinc,
- pp_i_postinc,
- pp_postdec,
- pp_i_postdec,
- pp_pow,
- pp_multiply,
- pp_i_multiply,
- pp_divide,
- pp_i_divide,
- pp_modulo,
- pp_i_modulo,
- pp_repeat,
- pp_add,
- pp_i_add,
- pp_subtract,
- pp_i_subtract,
- pp_concat,
- pp_stringify,
- pp_left_shift,
- pp_right_shift,
- pp_lt,
- pp_i_lt,
- pp_gt,
- pp_i_gt,
- pp_le,
- pp_i_le,
- pp_ge,
- pp_i_ge,
- pp_eq,
- pp_i_eq,
- pp_ne,
- pp_i_ne,
- pp_ncmp,
- pp_i_ncmp,
- pp_slt,
- pp_sgt,
- pp_sle,
- pp_sge,
- pp_seq,
- pp_sne,
- pp_scmp,
- pp_bit_and,
- pp_bit_xor,
- pp_bit_or,
- pp_negate,
- pp_i_negate,
- pp_not,
- pp_complement,
- pp_atan2,
- pp_sin,
- pp_cos,
- pp_rand,
- pp_srand,
- pp_exp,
- pp_log,
- pp_sqrt,
- pp_int,
- pp_hex,
- pp_oct,
- pp_abs,
- pp_length,
- pp_substr,
- pp_vec,
- pp_index,
- pp_rindex,
- pp_sprintf,
- pp_formline,
- pp_ord,
- pp_chr,
- pp_crypt,
- pp_ucfirst,
- pp_lcfirst,
- pp_uc,
- pp_lc,
- pp_quotemeta,
- pp_rv2av,
- pp_aelemfast,
- pp_aelem,
- pp_aslice,
- pp_each,
- pp_values,
- pp_keys,
- pp_delete,
- pp_exists,
- pp_rv2hv,
- pp_helem,
- pp_hslice,
- pp_unpack,
- pp_pack,
- pp_split,
- pp_join,
- pp_list,
- pp_lslice,
- pp_anonlist,
- pp_anonhash,
- pp_splice,
- pp_push,
- pp_pop,
- pp_shift,
- pp_unshift,
- pp_sort,
- pp_reverse,
- pp_grepstart,
- pp_grepwhile,
- pp_mapstart,
- pp_mapwhile,
- pp_range,
- pp_flip,
- pp_flop,
- pp_and,
- pp_or,
- pp_xor,
- pp_cond_expr,
- pp_andassign,
- pp_orassign,
- pp_method,
- pp_entersub,
- pp_leavesub,
- pp_caller,
- pp_warn,
- pp_die,
- pp_reset,
- pp_lineseq,
- pp_nextstate,
- pp_dbstate,
- pp_unstack,
- pp_enter,
- pp_leave,
- pp_scope,
- pp_enteriter,
- pp_iter,
- pp_enterloop,
- pp_leaveloop,
- pp_return,
- pp_last,
- pp_next,
- pp_redo,
- pp_dump,
- pp_goto,
- pp_exit,
- pp_open,
- pp_close,
- pp_pipe_op,
- pp_fileno,
- pp_umask,
- pp_binmode,
- pp_tie,
- pp_untie,
- pp_tied,
- pp_dbmopen,
- pp_dbmclose,
- pp_sselect,
- pp_select,
- pp_getc,
- pp_read,
- pp_enterwrite,
- pp_leavewrite,
- pp_prtf,
- pp_print,
- pp_sysopen,
- pp_sysseek,
- pp_sysread,
- pp_syswrite,
- pp_send,
- pp_recv,
- pp_eof,
- pp_tell,
- pp_seek,
- pp_truncate,
- pp_fcntl,
- pp_ioctl,
- pp_flock,
- pp_socket,
- pp_sockpair,
- pp_bind,
- pp_connect,
- pp_listen,
- pp_accept,
- pp_shutdown,
- pp_gsockopt,
- pp_ssockopt,
- pp_getsockname,
- pp_getpeername,
- pp_lstat,
- pp_stat,
- pp_ftrread,
- pp_ftrwrite,
- pp_ftrexec,
- pp_fteread,
- pp_ftewrite,
- pp_fteexec,
- pp_ftis,
- pp_fteowned,
- pp_ftrowned,
- pp_ftzero,
- pp_ftsize,
- pp_ftmtime,
- pp_ftatime,
- pp_ftctime,
- pp_ftsock,
- pp_ftchr,
- pp_ftblk,
- pp_ftfile,
- pp_ftdir,
- pp_ftpipe,
- pp_ftlink,
- pp_ftsuid,
- pp_ftsgid,
- pp_ftsvtx,
- pp_fttty,
- pp_fttext,
- pp_ftbinary,
- pp_chdir,
- pp_chown,
- pp_chroot,
- pp_unlink,
- pp_chmod,
- pp_utime,
- pp_rename,
- pp_link,
- pp_symlink,
- pp_readlink,
- pp_mkdir,
- pp_rmdir,
- pp_open_dir,
- pp_readdir,
- pp_telldir,
- pp_seekdir,
- pp_rewinddir,
- pp_closedir,
- pp_fork,
- pp_wait,
- pp_waitpid,
- pp_system,
- pp_exec,
- pp_kill,
- pp_getppid,
- pp_getpgrp,
- pp_setpgrp,
- pp_getpriority,
- pp_setpriority,
- pp_time,
- pp_tms,
- pp_localtime,
- pp_gmtime,
- pp_alarm,
- pp_sleep,
- pp_shmget,
- pp_shmctl,
- pp_shmread,
- pp_shmwrite,
- pp_msgget,
- pp_msgctl,
- pp_msgsnd,
- pp_msgrcv,
- pp_semget,
- pp_semctl,
- pp_semop,
- pp_require,
- pp_dofile,
- pp_entereval,
- pp_leaveeval,
- pp_entertry,
- pp_leavetry,
- pp_ghbyname,
- pp_ghbyaddr,
- pp_ghostent,
- pp_gnbyname,
- pp_gnbyaddr,
- pp_gnetent,
- pp_gpbyname,
- pp_gpbynumber,
- pp_gprotoent,
- pp_gsbyname,
- pp_gsbyport,
- pp_gservent,
- pp_shostent,
- pp_snetent,
- pp_sprotoent,
- pp_sservent,
- pp_ehostent,
- pp_enetent,
- pp_eprotoent,
- pp_eservent,
- pp_gpwnam,
- pp_gpwuid,
- pp_gpwent,
- pp_spwent,
- pp_epwent,
- pp_ggrnam,
- pp_ggrgid,
- pp_ggrent,
- pp_sgrent,
- pp_egrent,
- pp_getlogin,
- pp_syscall,
- pp_lock,
- pp_threadsv,
-};
-
-int
-fprintf(PerlIO *stream, const char *format, ...)
-{
- va_list(arglist);
- va_start(arglist, format);
- return PerlIO_vprintf(stream, format, arglist);
-}
#undef PERLVAR
#define PERLVAR(x, y)
+#undef PERLVARA
+#define PERLVARA(x, n, y)
#undef PERLVARI
-#define PERLVARI(x, y, z) PL_##x = z;
+#define PERLVARI(x, y, z) interp.x = z;
#undef PERLVARIC
-#define PERLVARIC(x, y, z) PL_##x = z;
+#define PERLVARIC(x, y, z) interp.x = z;
-CPerlObj::CPerlObj(IPerlMem* ipM, IPerlEnv* ipE, IPerlStdIO* ipStd,
- IPerlLIO* ipLIO, IPerlDir* ipD, IPerlSock* ipS, IPerlProc* ipP)
+CPerlObj::CPerlObj(IPerlMem* ipM, IPerlMem* ipMS, IPerlMem* ipMP,
+ IPerlEnv* ipE, IPerlStdIO* ipStd,
+ IPerlLIO* ipLIO, IPerlDir* ipD, IPerlSock* ipS,
+ IPerlProc* ipP)
{
memset(((char*)this)+sizeof(void*), 0, sizeof(CPerlObj)-sizeof(void*));
#include "thrdvar.h"
#include "intrpvar.h"
-#include "perlvars.h"
- PL_piMem = ipM;
- PL_piENV = ipE;
- PL_piStdIO = ipStd;
- PL_piLIO = ipLIO;
- PL_piDir = ipD;
- PL_piSock = ipS;
- PL_piProc = ipP;
+ PL_Mem = ipM;
+ PL_MemShared = ipMS;
+ PL_MemParse = ipMP;
+ PL_Env = ipE;
+ PL_StdIO = ipStd;
+ PL_LIO = ipLIO;
+ PL_Dir = ipD;
+ PL_Sock = ipS;
+ PL_Proc = ipP;
}
void*
CPerlObj::operator new(size_t nSize, IPerlMem *pvtbl)
{
- if(pvtbl != NULL)
- return pvtbl->Malloc(nSize);
-
+ if(pvtbl)
+ return pvtbl->pMalloc(pvtbl, nSize);
+#ifndef __MINGW32__
+ /* operator new is supposed to throw std::bad_alloc */
return NULL;
+#endif
}
-int&
-CPerlObj::ErrorNo(void)
-{
- return errno;
-}
-
+#ifndef __BORLANDC__
void
-CPerlObj::Init(void)
+CPerlObj::operator delete(void *pPerl, IPerlMem *pvtbl)
{
+ if(pvtbl)
+ pvtbl->pFree(pvtbl, pPerl);
}
+#endif
#ifdef WIN32 /* XXX why are these needed? */
bool
-do_exec(char *cmd)
+Perl_do_exec(char *cmd)
{
return PerlProc_Cmd(cmd);
}
int
-do_aspawn(void *vreally, void **vmark, void **vsp)
+CPerlObj::do_aspawn(void *vreally, void **vmark, void **vsp)
{
return PerlProc_aspawn(vreally, vmark, vsp);
}
#endif /* WIN32 */
#endif /* PERL_OBJECT */
+
+int
+Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
+{
+ dTHX;
+ va_list(arglist);
+ va_start(arglist, format);
+ return PerlIO_vprintf(stream, format, arglist);
+}
+
+#include "perlapi.h" /* bring in PL_force_link_funcs */
diff --git a/contrib/perl5/globvar.sym b/contrib/perl5/globvar.sym
new file mode 100644
index 0000000..0d76888
--- /dev/null
+++ b/contrib/perl5/globvar.sym
@@ -0,0 +1,68 @@
+# Global variables that must be exported for embedded applications.
+
+# *** Only structures/arrays with constant initializers should go here.
+# *** Usual globals initialized at runtime should be added in *var*.h.
+# *** Do NOT add functions here, those go in global.sym.
+
+AMG_names
+block_type
+fold
+fold_locale
+freq
+warn_uninit
+warn_nosemi
+warn_reserved
+warn_nl
+no_wrongref
+no_symref
+no_usym
+no_aelem
+no_helem
+no_modify
+no_mem
+no_security
+no_sock_func
+no_dir_func
+no_func
+no_myglob
+check
+op_desc
+op_name
+opargs
+ppaddr
+sig_name
+sig_num
+regkind
+simple
+utf8skip
+uuemap
+varies
+vtbl_sv
+vtbl_env
+vtbl_envelem
+vtbl_sig
+vtbl_sigelem
+vtbl_pack
+vtbl_packelem
+vtbl_dbline
+vtbl_isa
+vtbl_isaelem
+vtbl_arylen
+vtbl_glob
+vtbl_mglob
+vtbl_nkeys
+vtbl_taint
+vtbl_substr
+vtbl_vec
+vtbl_pos
+vtbl_bm
+vtbl_fm
+vtbl_uvar
+vtbl_mutex
+vtbl_defelem
+vtbl_regexp
+vtbl_regdata
+vtbl_regdatum
+vtbl_collxfrm
+vtbl_amagic
+vtbl_amagicelem
diff --git a/contrib/perl5/gv.c b/contrib/perl5/gv.c
index 1845058..be19355 100644
--- a/contrib/perl5/gv.c
+++ b/contrib/perl5/gv.c
@@ -1,6 +1,6 @@
/* gv.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -17,40 +17,41 @@
*/
#include "EXTERN.h"
+#define PERL_IN_GV_C
#include "perl.h"
GV *
-gv_AVadd(register GV *gv)
+Perl_gv_AVadd(pTHX_ register GV *gv)
{
if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
- croak("Bad symbol for array");
+ Perl_croak(aTHX_ "Bad symbol for array");
if (!GvAV(gv))
GvAV(gv) = newAV();
return gv;
}
GV *
-gv_HVadd(register GV *gv)
+Perl_gv_HVadd(pTHX_ register GV *gv)
{
if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
- croak("Bad symbol for hash");
+ Perl_croak(aTHX_ "Bad symbol for hash");
if (!GvHV(gv))
GvHV(gv) = newHV();
return gv;
}
GV *
-gv_IOadd(register GV *gv)
+Perl_gv_IOadd(pTHX_ register GV *gv)
{
if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
- croak("Bad symbol for filehandle");
+ Perl_croak(aTHX_ "Bad symbol for filehandle");
if (!GvIOp(gv))
GvIOp(gv) = newIO();
return gv;
}
GV *
-gv_fetchfile(char *name)
+Perl_gv_fetchfile(pTHX_ const char *name)
{
dTHR;
char smallbuf[256];
@@ -58,6 +59,9 @@ gv_fetchfile(char *name)
STRLEN tmplen;
GV *gv;
+ if (!PL_defstash)
+ return Nullgv;
+
tmplen = strlen(name) + 2;
if (tmplen < sizeof smallbuf)
tmpbuf = smallbuf;
@@ -67,20 +71,19 @@ gv_fetchfile(char *name)
tmpbuf[1] = '<';
strcpy(tmpbuf + 2, name);
gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE);
- if (!isGV(gv))
+ if (!isGV(gv)) {
gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
+ sv_setpv(GvSV(gv), name);
+ if (PERLDB_LINE)
+ hv_magic(GvHVn(gv_AVadd(gv)), gv, 'L');
+ }
if (tmpbuf != smallbuf)
Safefree(tmpbuf);
- sv_setpv(GvSV(gv), name);
- if (*name == '/' && (instr(name, "/lib/") || instr(name, ".pm")))
- GvMULTI_on(gv);
- if (PERLDB_LINE)
- hv_magic(GvHVn(gv_AVadd(gv)), gv, 'L');
return gv;
}
void
-gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
+Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
{
dTHR;
register GP *gp;
@@ -99,8 +102,8 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
Newz(602, gp, 1, GP);
GvGP(gv) = gp_ref(gp);
GvSV(gv) = NEWSV(72,0);
- GvLINE(gv) = PL_curcop->cop_line;
- GvFILEGV(gv) = PL_curcop->cop_filegv;
+ GvLINE(gv) = CopLINE(PL_curcop);
+ GvFILE(gv) = CopFILE(PL_curcop) ? CopFILE(PL_curcop) : "";
GvCVGEN(gv) = 0;
GvEGV(gv) = gv;
sv_magic((SV*)gv, (SV*)gv, '*', name, len);
@@ -119,7 +122,7 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
PL_sub_generation++;
CvGV(GvCV(gv)) = (GV*)SvREFCNT_inc(gv);
- CvFILEGV(GvCV(gv)) = PL_curcop->cop_filegv;
+ CvFILE(GvCV(gv)) = CopFILE(PL_curcop);
CvSTASH(GvCV(gv)) = PL_curstash;
#ifdef USE_THREADS
CvOWNER(GvCV(gv)) = 0;
@@ -136,7 +139,7 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
}
STATIC void
-gv_init_sv(GV *gv, I32 sv_type)
+S_gv_init_sv(pTHX_ GV *gv, I32 sv_type)
{
switch (sv_type) {
case SVt_PVIO:
@@ -151,8 +154,29 @@ gv_init_sv(GV *gv, I32 sv_type)
}
}
+/*
+=for apidoc gv_fetchmeth
+
+Returns the glob with the given C<name> and a defined subroutine or
+C<NULL>. The glob lives in the given C<stash>, or in the stashes
+accessible via @ISA and @UNIVERSAL.
+
+The argument C<level> should be either 0 or -1. If C<level==0>, as a
+side-effect creates a glob with the given C<name> in the given C<stash>
+which in the case of success contains an alias for the subroutine, and sets
+up caching info for this glob. Similarly for all the searched stashes.
+
+This function grants C<"SUPER"> token as a postfix of the stash name. The
+GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
+visible to Perl code. So when calling C<call_sv>, you should not use
+the GV directly; instead, you should use the method's CV, which can be
+obtained from the GV with the C<GvCV> macro.
+
+=cut
+*/
+
GV *
-gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
+Perl_gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level)
{
AV* av;
GV* topgv;
@@ -163,10 +187,10 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
if (!stash)
return 0;
if ((level > 100) || (level < -100))
- croak("Recursive inheritance detected while looking for method '%s' in package '%s'",
+ Perl_croak(aTHX_ "Recursive inheritance detected while looking for method '%s' in package '%s'",
name, HvNAME(stash));
- DEBUG_o( deb("Looking for method %s in package %s\n",name,HvNAME(stash)) );
+ DEBUG_o( Perl_deb(aTHX_ "Looking for method %s in package %s\n",name,HvNAME(stash)) );
gvp = (GV**)hv_fetch(stash, name, len, (level >= 0));
if (!gvp)
@@ -175,7 +199,7 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
topgv = *gvp;
if (SvTYPE(topgv) != SVt_PVGV)
gv_init(topgv, stash, name, len, TRUE);
- if (cv = GvCV(topgv)) {
+ if ((cv = GvCV(topgv))) {
/* If genuine method or valid cache entry, use it */
if (!GvCVGEN(topgv) || GvCVGEN(topgv) == PL_sub_generation)
return topgv;
@@ -206,7 +230,7 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
dTHR; /* just for SvREFCNT_dec */
gvp = (GV**)hv_fetch(stash, "ISA", 3, TRUE);
if (!gvp || !(gv = *gvp))
- croak("Cannot create %s::ISA", HvNAME(stash));
+ Perl_croak(aTHX_ "Cannot create %s::ISA", HvNAME(stash));
if (SvTYPE(gv) != SVt_PVGV)
gv_init(gv, stash, "ISA", 3, TRUE);
SvREFCNT_dec(GvAV(gv));
@@ -223,8 +247,9 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
SV* sv = *svp++;
HV* basestash = gv_stashsv(sv, FALSE);
if (!basestash) {
- if (PL_dowarn)
- warn("Can't locate package %s for @%s::ISA",
+ dTHR; /* just for ckWARN */
+ if (ckWARN(WARN_MISC))
+ Perl_warner(aTHX_ WARN_MISC, "Can't locate package %s for @%s::ISA",
SvPVX(sv), HvNAME(stash));
continue;
}
@@ -240,9 +265,10 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
if (level == 0 || level == -1) {
HV* lastchance;
- if (lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE)) {
- if (gv = gv_fetchmeth(lastchance, name, len,
- (level >= 0) ? level + 1 : level - 1)) {
+ if ((lastchance = gv_stashpvn("UNIVERSAL", 9, FALSE))) {
+ if ((gv = gv_fetchmeth(lastchance, name, len,
+ (level >= 0) ? level + 1 : level - 1)))
+ {
gotcha:
/*
* Cache method in topgv if:
@@ -254,7 +280,7 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
(cv = GvCV(gv)) &&
(CvROOT(cv) || CvXSUB(cv)))
{
- if (cv = GvCV(topgv))
+ if ((cv = GvCV(topgv)))
SvREFCNT_dec(cv);
GvCV(topgv) = (CV*)SvREFCNT_inc(GvCV(gv));
GvCVGEN(topgv) = PL_sub_generation;
@@ -271,18 +297,54 @@ gv_fetchmeth(HV *stash, char *name, STRLEN len, I32 level)
return 0;
}
+/*
+=for apidoc gv_fetchmethod
+
+See L<gv_fetchmethod_autoload>.
+
+=cut
+*/
+
GV *
-gv_fetchmethod(HV *stash, char *name)
+Perl_gv_fetchmethod(pTHX_ HV *stash, const char *name)
{
return gv_fetchmethod_autoload(stash, name, TRUE);
}
+/*
+=for apidoc gv_fetchmethod_autoload
+
+Returns the glob which contains the subroutine to call to invoke the method
+on the C<stash>. In fact in the presence of autoloading this may be the
+glob for "AUTOLOAD". In this case the corresponding variable $AUTOLOAD is
+already setup.
+
+The third parameter of C<gv_fetchmethod_autoload> determines whether
+AUTOLOAD lookup is performed if the given method is not present: non-zero
+means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
+Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
+with a non-zero C<autoload> parameter.
+
+These functions grant C<"SUPER"> token as a prefix of the method name. Note
+that if you want to keep the returned glob for a long time, you need to
+check for it being "AUTOLOAD", since at the later time the call may load a
+different subroutine due to $AUTOLOAD changing its value. Use the glob
+created via a side effect to do this.
+
+These functions have the same side-effects and as C<gv_fetchmeth> with
+C<level==0>. C<name> should be writable if contains C<':'> or C<'
+''>. The warning against passing the GV returned by C<gv_fetchmeth> to
+C<call_sv> apply equally to these functions.
+
+=cut
+*/
+
GV *
-gv_fetchmethod_autoload(HV *stash, char *name, I32 autoload)
+Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload)
{
dTHR;
- register char *nend;
- char *nsplit = 0;
+ register const char *nend;
+ const char *nsplit = 0;
GV* gv;
for (nend = name; *nend; nend++) {
@@ -292,16 +354,16 @@ gv_fetchmethod_autoload(HV *stash, char *name, I32 autoload)
nsplit = ++nend;
}
if (nsplit) {
- char *origname = name;
+ const char *origname = name;
name = nsplit + 1;
if (*nsplit == ':')
--nsplit;
if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) {
/* ->SUPER::method should really be looked up in original stash */
- SV *tmpstr = sv_2mortal(newSVpvf("%s::SUPER",
- HvNAME(PL_curcop->cop_stash)));
+ SV *tmpstr = sv_2mortal(Perl_newSVpvf(aTHX_ "%s::SUPER",
+ CopSTASHPV(PL_curcop)));
stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE);
- DEBUG_o( deb("Treating %s as %s::%s\n",
+ DEBUG_o( Perl_deb(aTHX_ "Treating %s as %s::%s\n",
origname, HvNAME(stash), name) );
}
else
@@ -339,8 +401,9 @@ gv_fetchmethod_autoload(HV *stash, char *name, I32 autoload)
}
GV*
-gv_autoload4(HV *stash, char *name, STRLEN len, I32 method)
+Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
{
+ dTHR;
static char autoload[] = "AUTOLOAD";
static STRLEN autolen = 8;
GV* gv;
@@ -358,8 +421,9 @@ gv_autoload4(HV *stash, char *name, STRLEN len, I32 method)
/*
* Inheriting AUTOLOAD for non-methods works ... for now.
*/
- if (PL_dowarn && !method && (GvCVGEN(gv) || GvSTASH(gv) != stash))
- warn(
+ if (ckWARN(WARN_DEPRECATED) && !method &&
+ (GvCVGEN(gv) || GvSTASH(gv) != stash))
+ Perl_warner(aTHX_ WARN_DEPRECATED,
"Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
HvNAME(stash), (int)len, name);
@@ -381,14 +445,25 @@ gv_autoload4(HV *stash, char *name, STRLEN len, I32 method)
return gv;
}
+/*
+=for apidoc gv_stashpv
+
+Returns a pointer to the stash for a specified package. C<name> should
+be a valid UTF-8 string. If C<create> is set then the package will be
+created if it does not already exist. If C<create> is not set and the
+package does not exist then NULL is returned.
+
+=cut
+*/
+
HV*
-gv_stashpv(char *name, I32 create)
+Perl_gv_stashpv(pTHX_ const char *name, I32 create)
{
return gv_stashpvn(name, strlen(name), create);
}
HV*
-gv_stashpvn(char *name, U32 namelen, I32 create)
+Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 create)
{
char smallbuf[256];
char *tmpbuf;
@@ -416,8 +491,17 @@ gv_stashpvn(char *name, U32 namelen, I32 create)
return stash;
}
+/*
+=for apidoc gv_stashsv
+
+Returns a pointer to the stash for a specified package, which must be a
+valid UTF-8 string. See C<gv_stashpv>.
+
+=cut
+*/
+
HV*
-gv_stashsv(SV *sv, I32 create)
+Perl_gv_stashsv(pTHX_ SV *sv, I32 create)
{
register char *ptr;
STRLEN len;
@@ -427,14 +511,14 @@ gv_stashsv(SV *sv, I32 create)
GV *
-gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
+Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
{
dTHR;
- register char *name = nambeg;
+ register const char *name = nambeg;
register GV *gv = 0;
GV**gvp;
I32 len;
- register char *namend;
+ register const char *namend;
HV *stash = 0;
U32 add_gvflags = 0;
@@ -442,8 +526,8 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
name++;
for (namend = name; *namend; namend++) {
- if ((*namend == '\'' && namend[1]) ||
- (*namend == ':' && namend[1] == ':'))
+ if ((*namend == ':' && namend[1] == ':')
+ || (*namend == '\'' && namend[1]))
{
if (!stash)
stash = PL_defstash;
@@ -498,7 +582,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
/* No stash in name, so see how we can default */
if (!stash) {
- if (isIDFIRST(*name)) {
+ if (isIDFIRST_lazy(name)) {
bool global = FALSE;
if (isUPPER(*name)) {
@@ -538,22 +622,22 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
{
stash = 0;
}
- else if (sv_type == SVt_PV && !GvIMPORTED_SV(*gvp) ||
- sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp) ||
- sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp) )
+ else if ((sv_type == SVt_PV && !GvIMPORTED_SV(*gvp)) ||
+ (sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp)) ||
+ (sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp)) )
{
- warn("Variable \"%c%s\" is not imported",
+ Perl_warn(aTHX_ "Variable \"%c%s\" is not imported",
sv_type == SVt_PVAV ? '@' :
sv_type == SVt_PVHV ? '%' : '$',
name);
if (GvCVu(*gvp))
- warn("(Did you mean &%s instead?)\n", name);
+ Perl_warn(aTHX_ "\t(Did you mean &%s instead?)\n", name);
stash = 0;
}
}
}
else
- stash = PL_curcop->cop_stash;
+ stash = CopSTASH(PL_curcop);
}
else
stash = PL_defstash;
@@ -562,26 +646,15 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
/* By this point we should have a stash and a name */
if (!stash) {
- if (!add)
- return Nullgv;
- if (add & ~GV_ADDMULTI) {
- char sv_type_char = ((sv_type == SVt_PV) ? '$'
- : (sv_type == SVt_PVAV) ? '@'
- : (sv_type == SVt_PVHV) ? '%'
- : 0);
- if (sv_type_char)
- warn("Global symbol \"%c%s\" requires explicit package name",
- sv_type_char, name);
- else
- warn("Global symbol \"%s\" requires explicit package name",
- name);
+ if (add) {
+ qerror(Perl_mess(aTHX_
+ "Global symbol \"%s%s\" requires explicit package name",
+ (sv_type == SVt_PV ? "$"
+ : sv_type == SVt_PVAV ? "@"
+ : sv_type == SVt_PVHV ? "%"
+ : ""), name));
}
- ++PL_error_count;
- stash = PL_curstash ? PL_curstash : PL_defstash; /* avoid core dumps */
- add_gvflags = ((sv_type == SVt_PV) ? GVf_IMPORTED_SV
- : (sv_type == SVt_PVAV) ? GVf_IMPORTED_AV
- : (sv_type == SVt_PVHV) ? GVf_IMPORTED_HV
- : 0);
+ return Nullgv;
}
if (!SvREFCNT(stash)) /* symbol table under destruction */
@@ -603,12 +676,15 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
/* Adding a new symbol */
- if (add & GV_ADDWARN)
- warn("Had to create %s unexpectedly", nambeg);
+ if (add & GV_ADDWARN && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Had to create %s unexpectedly", nambeg);
gv_init(gv, stash, name, len, add & GV_ADDMULTI);
gv_init_sv(gv, sv_type);
GvFLAGS(gv) |= add_gvflags;
+ if (isLEXWARN_on && isALPHA(name[0]) && ! ckWARN(WARN_ONCE))
+ GvMULTI_on(gv) ;
+
/* set up magic where warranted */
switch (*name) {
case 'A':
@@ -630,20 +706,19 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
&& AvFILLp(av) == -1)
{
char *pname;
- av_push(av, newSVpv(pname = "NDBM_File",0));
+ av_push(av, newSVpvn(pname = "NDBM_File",9));
gv_stashpvn(pname, 9, TRUE);
- av_push(av, newSVpv(pname = "DB_File",0));
+ av_push(av, newSVpvn(pname = "DB_File",7));
gv_stashpvn(pname, 7, TRUE);
- av_push(av, newSVpv(pname = "GDBM_File",0));
+ av_push(av, newSVpvn(pname = "GDBM_File",9));
gv_stashpvn(pname, 9, TRUE);
- av_push(av, newSVpv(pname = "SDBM_File",0));
+ av_push(av, newSVpvn(pname = "SDBM_File",9));
gv_stashpvn(pname, 9, TRUE);
- av_push(av, newSVpv(pname = "ODBM_File",0));
+ av_push(av, newSVpvn(pname = "ODBM_File",9));
gv_stashpvn(pname, 9, TRUE);
}
}
break;
-#ifdef OVERLOAD
case 'O':
if (strEQ(name, "OVERLOAD")) {
HV* hv = GvHVn(gv);
@@ -651,44 +726,48 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
hv_magic(hv, gv, 'A');
}
break;
-#endif /* OVERLOAD */
case 'S':
if (strEQ(name, "SIG")) {
HV *hv;
I32 i;
- PL_siggv = gv;
- GvMULTI_on(PL_siggv);
- hv = GvHVn(PL_siggv);
- hv_magic(hv, PL_siggv, 'S');
- for(i=1;sig_name[i];i++) {
+ if (!PL_psig_ptr) {
+ int sig_num[] = { SIG_NUM };
+ New(73, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
+ New(73, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
+ }
+ GvMULTI_on(gv);
+ hv = GvHVn(gv);
+ hv_magic(hv, gv, 'S');
+ for (i = 1; PL_sig_name[i]; i++) {
SV ** init;
- init=hv_fetch(hv,sig_name[i],strlen(sig_name[i]),1);
- if(init)
- sv_setsv(*init,&PL_sv_undef);
- psig_ptr[i] = 0;
- psig_name[i] = 0;
+ init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
+ if (init)
+ sv_setsv(*init, &PL_sv_undef);
+ PL_psig_ptr[i] = 0;
+ PL_psig_name[i] = 0;
}
}
break;
+ case 'V':
+ if (strEQ(name, "VERSION"))
+ GvMULTI_on(gv);
+ break;
case '&':
if (len > 1)
break;
- PL_ampergv = gv;
PL_sawampersand = TRUE;
goto ro_magicalize;
case '`':
if (len > 1)
break;
- PL_leftgv = gv;
PL_sawampersand = TRUE;
goto ro_magicalize;
case '\'':
if (len > 1)
break;
- PL_rightgv = gv;
PL_sawampersand = TRUE;
goto ro_magicalize;
@@ -702,7 +781,7 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
if (len > 1)
break;
#ifdef COMPLEX_STATUS
- sv_upgrade(GvSV(gv), SVt_PVLV);
+ (void)SvUPGRADE(GvSV(gv), SVt_PVLV);
#endif
goto magicalize;
@@ -711,27 +790,34 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
break;
if (sv_type > SVt_PV && PL_curcop != &PL_compiling) {
HV* stash = gv_stashpvn("Errno",5,FALSE);
- if(!stash || !(gv_fetchmethod(stash, "TIEHASH"))) {
+ if (!stash || !(gv_fetchmethod(stash, "TIEHASH"))) {
dSP;
PUTBACK;
- perl_require_pv("Errno.pm");
+ require_pv("Errno.pm");
SPAGAIN;
stash = gv_stashpvn("Errno",5,FALSE);
if (!stash || !(gv_fetchmethod(stash, "TIEHASH")))
- croak("Can't use %%! because Errno.pm is not available");
+ Perl_croak(aTHX_ "Can't use %%! because Errno.pm is not available");
}
}
goto magicalize;
+ case '-':
+ if (len > 1)
+ break;
+ else {
+ AV* av = GvAVn(gv);
+ sv_magic((SV*)av, Nullsv, 'D', Nullch, 0);
+ }
+ goto magicalize;
case '#':
case '*':
- if (PL_dowarn && len == 1 && sv_type == SVt_PV)
- warn("Use of $%s is deprecated", name);
+ if (ckWARN(WARN_DEPRECATED) && len == 1 && sv_type == SVt_PV)
+ Perl_warner(aTHX_ WARN_DEPRECATED, "Use of $%s is deprecated", name);
/* FALL THROUGH */
case '[':
case '^':
case '~':
case '=':
- case '-':
case '%':
case '.':
case '(':
@@ -742,22 +828,37 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
case '\\':
case '/':
case '|':
- case '\001':
- case '\003':
- case '\004':
- case '\005':
- case '\006':
- case '\010':
- case '\011': /* NOT \t in EBCDIC */
- case '\017':
- case '\020':
- case '\024':
- case '\027':
+ case '\001': /* $^A */
+ case '\003': /* $^C */
+ case '\004': /* $^D */
+ case '\005': /* $^E */
+ case '\006': /* $^F */
+ case '\010': /* $^H */
+ case '\011': /* $^I, NOT \t in EBCDIC */
+ case '\017': /* $^O */
+ case '\020': /* $^P */
+ case '\024': /* $^T */
if (len > 1)
break;
goto magicalize;
+ case '\023': /* $^S */
+ if (len > 1)
+ break;
+ goto ro_magicalize;
+ case '\027': /* $^W & $^WARNING_BITS */
+ if (len > 1 && strNE(name, "\027ARNING_BITS")
+ && strNE(name, "\027IDE_SYSTEM_CALLS"))
+ break;
+ goto magicalize;
case '+':
+ if (len > 1)
+ break;
+ else {
+ AV* av = GvAVn(gv);
+ sv_magic((SV*)av, (SV*)av, 'D', Nullch, 0);
+ }
+ /* FALL THROUGH */
case '1':
case '2':
case '3':
@@ -767,14 +868,13 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
case '7':
case '8':
case '9':
- case '\023':
ro_magicalize:
SvREADONLY_on(GvSV(gv));
magicalize:
sv_magic(GvSV(gv), (SV*)gv, 0, name, len);
break;
- case '\014':
+ case '\014': /* $^L */
if (len > 1)
break;
sv_setpv(GvSV(gv),"\f");
@@ -788,22 +888,30 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
case ']':
if (len == 1) {
SV *sv = GvSV(gv);
- sv_upgrade(sv, SVt_PVNV);
- sv_setpv(sv, PL_patchlevel);
- (void)sv_2nv(sv);
+ (void)SvUPGRADE(sv, SVt_PVNV);
+ SvNVX(sv) = SvNVX(PL_patchlevel);
+ SvNOK_on(sv);
+ (void)SvPV_nolen(sv);
SvREADONLY_on(sv);
}
break;
+ case '\026': /* $^V */
+ if (len == 1) {
+ SV *sv = GvSV(gv);
+ GvSV(gv) = SvREFCNT_inc(PL_patchlevel);
+ SvREFCNT_dec(sv);
+ }
+ break;
}
return gv;
}
void
-gv_fullname3(SV *sv, GV *gv, char *prefix)
+Perl_gv_fullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
{
HV *hv = GvSTASH(gv);
if (!hv) {
- SvOK_off(sv);
+ (void)SvOK_off(sv);
return;
}
sv_setpv(sv, prefix ? prefix : "");
@@ -813,7 +921,7 @@ gv_fullname3(SV *sv, GV *gv, char *prefix)
}
void
-gv_efullname3(SV *sv, GV *gv, char *prefix)
+Perl_gv_efullname3(pTHX_ SV *sv, GV *gv, const char *prefix)
{
GV *egv = GvEGV(gv);
if (!egv)
@@ -823,20 +931,20 @@ gv_efullname3(SV *sv, GV *gv, char *prefix)
/* XXX compatibility with versions <= 5.003. */
void
-gv_fullname(SV *sv, GV *gv)
+Perl_gv_fullname(pTHX_ SV *sv, GV *gv)
{
gv_fullname3(sv, gv, sv == (SV*)gv ? "*" : "");
}
/* XXX compatibility with versions <= 5.003. */
void
-gv_efullname(SV *sv, GV *gv)
+Perl_gv_efullname(pTHX_ SV *sv, GV *gv)
{
gv_efullname3(sv, gv, sv == (SV*)gv ? "*" : "");
}
IO *
-newIO(void)
+Perl_newIO(pTHX)
{
dTHR;
IO *io;
@@ -855,14 +963,13 @@ newIO(void)
}
void
-gv_check(HV *stash)
+Perl_gv_check(pTHX_ HV *stash)
{
dTHR;
register HE *entry;
register I32 i;
register GV *gv;
HV *hv;
- GV *filegv;
if (!HvARRAY(stash))
return;
@@ -871,19 +978,31 @@ gv_check(HV *stash)
if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
(gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)) && HvNAME(hv))
{
- if (hv != PL_defstash)
+ if (hv != PL_defstash && hv != stash)
gv_check(hv); /* nested package */
}
else if (isALPHA(*HeKEY(entry))) {
+ char *file;
gv = (GV*)HeVAL(entry);
if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
continue;
- PL_curcop->cop_line = GvLINE(gv);
- filegv = GvFILEGV(gv);
- PL_curcop->cop_filegv = filegv;
- if (filegv && GvMULTI(filegv)) /* Filename began with slash */
+ file = GvFILE(gv);
+ /* performance hack: if filename is absolute and it's a standard
+ * module, don't bother warning */
+ if (file
+ && PERL_FILE_IS_ABSOLUTE(file)
+ && (instr(file, "/lib/") || instr(file, ".pm")))
+ {
continue;
- warn("Name \"%s::%s\" used only once: possible typo",
+ }
+ CopLINE_set(PL_curcop, GvLINE(gv));
+#ifdef USE_ITHREADS
+ CopFILE(PL_curcop) = file; /* set for warning */
+#else
+ CopFILEGV(PL_curcop) = gv_fetchfile(file);
+#endif
+ Perl_warner(aTHX_ WARN_ONCE,
+ "Name \"%s::%s\" used only once: possible typo",
HvNAME(stash), GvNAME(gv));
}
}
@@ -891,17 +1010,19 @@ gv_check(HV *stash)
}
GV *
-newGVgen(char *pack)
+Perl_newGVgen(pTHX_ char *pack)
{
- return gv_fetchpv(form("%s::_GEN_%ld", pack, (long)PL_gensym++),
+ return gv_fetchpv(Perl_form(aTHX_ "%s::_GEN_%ld", pack, (long)PL_gensym++),
TRUE, SVt_PVGV);
}
/* hopefully this is only called on local symbol table entries */
GP*
-gp_ref(GP *gp)
+Perl_gp_ref(pTHX_ GP *gp)
{
+ if (!gp)
+ return (GP*)NULL;
gp->gp_refcnt++;
if (gp->gp_cv) {
if (gp->gp_cvgen) {
@@ -919,15 +1040,17 @@ gp_ref(GP *gp)
}
void
-gp_free(GV *gv)
+Perl_gp_free(pTHX_ GV *gv)
{
+ dTHR;
GP* gp;
- CV* cv;
if (!gv || !(gp = GvGP(gv)))
return;
if (gp->gp_refcnt == 0) {
- warn("Attempt to free unreferenced glob pointers");
+ if (ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL,
+ "Attempt to free unreferenced glob pointers");
return;
}
if (gp->gp_cv) {
@@ -975,21 +1098,22 @@ register GV *gv;
}
#endif /* Microport 2.4 hack */
-#ifdef OVERLOAD
/* Updates and caches the CV's */
bool
-Gv_AMupdate(HV *stash)
+Perl_Gv_AMupdate(pTHX_ HV *stash)
{
- dTHR;
- GV** gvp;
- HV* hv;
+ dTHR;
GV* gv;
CV* cv;
MAGIC* mg=mg_find((SV*)stash,'c');
AMT *amtp = (mg) ? (AMT*)mg->mg_ptr: (AMT *) NULL;
AMT amt;
STRLEN n_a;
+#ifdef OVERLOAD_VIA_HASH
+ GV** gvp;
+ HV* hv;
+#endif
if (mg && amtp->was_ok_am == PL_amagic_generation
&& amtp->was_ok_sub == PL_sub_generation)
@@ -1004,7 +1128,7 @@ Gv_AMupdate(HV *stash)
}
sv_unmagic((SV*)stash, 'c');
- DEBUG_o( deb("Recalcing overload magic in package %s\n",HvNAME(stash)) );
+ DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME(stash)) );
amt.was_ok_am = PL_amagic_generation;
amt.was_ok_sub = PL_sub_generation;
@@ -1020,16 +1144,16 @@ Gv_AMupdate(HV *stash)
SV* sv;
SV** svp;
- /* Work with "fallback" key, which we assume to be first in AMG_names */
+ /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
- if (( cp = (char *)AMG_names[0] ) &&
+ if (( cp = (char *)PL_AMG_names[0] ) &&
(svp = (SV**)hv_fetch(hv,cp,strlen(cp),FALSE)) && (sv = *svp)) {
if (SvTRUE(sv)) amt.fallback=AMGfallYES;
else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
}
for (i = 1; i < NofAMmeth; i++) {
cv = 0;
- cp = (char *)AMG_names[i];
+ cp = (char *)PL_AMG_names[i];
svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
if (svp && ((sv = *svp) != &PL_sv_undef)) {
@@ -1047,19 +1171,19 @@ Gv_AMupdate(HV *stash)
/* FALL THROUGH */
case SVt_PVHV:
case SVt_PVAV:
- croak("Not a subroutine reference in overload table");
+ Perl_croak(aTHX_ "Not a subroutine reference in overload table");
return FALSE;
case SVt_PVCV:
cv = (CV*)sv;
break;
case SVt_PVGV:
if (!(cv = GvCVu((GV*)sv)))
- cv = sv_2cv(sv, &stash, &gv, TRUE);
+ cv = sv_2cv(sv, &stash, &gv, FALSE);
break;
}
if (cv) filled=1;
else {
- croak("Method for operation %s not found in package %.256s during blessing\n",
+ Perl_croak(aTHX_ "Method for operation %s not found in package %.256s during blessing\n",
cp,HvNAME(stash));
return FALSE;
}
@@ -1070,23 +1194,26 @@ Gv_AMupdate(HV *stash)
int i;
const char *cp;
SV* sv = NULL;
- SV** svp;
- /* Work with "fallback" key, which we assume to be first in AMG_names */
+ /* Work with "fallback" key, which we assume to be first in PL_AMG_names */
- if ( cp = AMG_names[0] ) {
+ if ((cp = PL_AMG_names[0])) {
/* Try to find via inheritance. */
gv = gv_fetchmeth(stash, "()", 2, -1); /* A cookie: "()". */
- if (gv) sv = GvSV(gv);
-
- if (!gv) goto no_table;
- else if (SvTRUE(sv)) amt.fallback=AMGfallYES;
- else if (SvOK(sv)) amt.fallback=AMGfallNEVER;
+ if (gv)
+ sv = GvSV(gv);
+
+ if (!gv)
+ goto no_table;
+ else if (SvTRUE(sv))
+ amt.fallback=AMGfallYES;
+ else if (SvOK(sv))
+ amt.fallback=AMGfallNEVER;
}
for (i = 1; i < NofAMmeth; i++) {
- SV *cookie = sv_2mortal(newSVpvf("(%s", cp = AMG_names[i]));
- DEBUG_o( deb("Checking overloading of `%s' in package `%.256s'\n",
+ SV *cookie = sv_2mortal(Perl_newSVpvf(aTHX_ "(%s", cp = PL_AMG_names[i]));
+ DEBUG_o( Perl_deb(aTHX_ "Checking overloading of `%s' in package `%.256s'\n",
cp, HvNAME(stash)) );
/* don't fill the cache while looking up! */
gv = gv_fetchmeth(stash, SvPVX(cookie), SvCUR(cookie), -1);
@@ -1097,7 +1224,7 @@ Gv_AMupdate(HV *stash)
/* GvSV contains the name of the method. */
GV *ngv;
- DEBUG_o( deb("Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
+ DEBUG_o( Perl_deb(aTHX_ "Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) );
if (!SvPOK(GvSV(gv))
|| !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
@@ -1105,17 +1232,17 @@ Gv_AMupdate(HV *stash)
{
/* Can be an import stub (created by `can'). */
if (GvCVGEN(gv)) {
- croak("Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
+ Perl_croak(aTHX_ "Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
(SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
cp, HvNAME(stash));
} else
- croak("Cannot resolve method `%.256s' overloading `%s' in package `%.256s'",
+ Perl_croak(aTHX_ "Can't resolve method `%.256s' overloading `%s' in package `%.256s'",
(SvPOK(GvSV(gv)) ? SvPVX(GvSV(gv)) : "???" ),
cp, HvNAME(stash));
}
cv = GvCV(gv = ngv);
}
- DEBUG_o( deb("Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
+ DEBUG_o( Perl_deb(aTHX_ "Overloading `%s' in package `%.256s' via `%.256s::%.256s' \n",
cp, HvNAME(stash), HvNAME(GvSTASH(CvGV(cv))),
GvNAME(CvGV(cv))) );
filled = 1;
@@ -1137,7 +1264,7 @@ Gv_AMupdate(HV *stash)
}
SV*
-amagic_call(SV *left, SV *right, int method, int flags)
+Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
{
dTHR;
MAGIC *mg;
@@ -1237,12 +1364,21 @@ amagic_call(SV *left, SV *right, int method, int flags)
}
break;
case neg_amg:
- if (cv = cvp[off=subtr_amg]) {
+ if ((cv = cvp[off=subtr_amg])) {
right = left;
left = sv_2mortal(newSViv(0));
lr = 1;
}
break;
+ case iter_amg: /* XXXX Eventually should do to_gv. */
+ case to_sv_amg:
+ case to_av_amg:
+ case to_hv_amg:
+ case to_gv_amg:
+ case to_cv_amg:
+ /* FAIL safe */
+ return NULL; /* Delegate operation to standard mechanisms. */
+ break;
default:
goto not_found;
}
@@ -1296,9 +1432,9 @@ amagic_call(SV *left, SV *right, int method, int flags)
} else {
SV *msg;
if (off==-1) off=method;
- msg = sv_2mortal(newSVpvf(
+ msg = sv_2mortal(Perl_newSVpvf(aTHX_
"Operation `%s': no method found,%sargument %s%s%s%s",
- AMG_names[method + assignshift],
+ PL_AMG_names[method + assignshift],
(flags & AMGf_unary ? " " : "\n\tleft "),
SvAMAGIC(left)?
"in overloaded package ":
@@ -1315,9 +1451,9 @@ amagic_call(SV *left, SV *right, int method, int flags)
HvNAME(SvSTASH(SvRV(right))):
""));
if (amtp && amtp->fallback >= AMGfallYES) {
- DEBUG_o( deb("%s", SvPVX(msg)) );
+ DEBUG_o( Perl_deb(aTHX_ "%s", SvPVX(msg)) );
} else {
- croak("%_", msg);
+ Perl_croak(aTHX_ "%"SVf, msg);
}
return NULL;
}
@@ -1325,13 +1461,13 @@ amagic_call(SV *left, SV *right, int method, int flags)
}
}
if (!notfound) {
- DEBUG_o( deb(
+ DEBUG_o( Perl_deb(aTHX_
"Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
- AMG_names[off],
+ PL_AMG_names[off],
method+assignshift==off? "" :
" (initially `",
method+assignshift==off? "" :
- AMG_names[method+assignshift],
+ PL_AMG_names[method+assignshift],
method+assignshift==off? "" : "')",
flags & AMGf_unary? "" :
lr==1 ? " for right argument": " for left argument",
@@ -1384,24 +1520,25 @@ amagic_call(SV *left, SV *right, int method, int flags)
if (PERLDB_SUB && PL_curstash != PL_debstash)
PL_op->op_private |= OPpENTERSUB_DB;
PUTBACK;
- pp_pushmark(ARGS);
+ pp_pushmark();
EXTEND(SP, notfound + 5);
PUSHs(lr>0? right: left);
PUSHs(lr>0? left: right);
PUSHs( lr > 0 ? &PL_sv_yes : ( assign ? &PL_sv_undef : &PL_sv_no ));
if (notfound) {
- PUSHs( sv_2mortal(newSVpv((char *)AMG_names[method + assignshift],0)) );
+ PUSHs( sv_2mortal(newSVpv((char *)PL_AMG_names[method + assignshift],0)));
}
PUSHs((SV*)cv);
PUTBACK;
- if (PL_op = pp_entersub(ARGS))
- CALLRUNOPS();
+ if ((PL_op = Perl_pp_entersub(aTHX)))
+ CALLRUNOPS(aTHX);
LEAVE;
SPAGAIN;
res=POPs;
+ PUTBACK;
POPSTACK;
CATCH_SET(oldcatch);
@@ -1430,12 +1567,12 @@ amagic_call(SV *left, SV *right, int method, int flags)
case dec_amg:
SvSetSV(left,res); return left;
case not_amg:
- ans=!SvOK(res); break;
+ ans=!SvTRUE(res); break;
}
return boolSV(ans);
} else if (method==copy_amg) {
if (!SvROK(res)) {
- croak("Copy method did not return a reference");
+ Perl_croak(aTHX_ "Copy method did not return a reference");
}
return SvREFCNT_inc(SvRV(res));
} else {
@@ -1443,5 +1580,3 @@ amagic_call(SV *left, SV *right, int method, int flags)
}
}
}
-#endif /* OVERLOAD */
-
diff --git a/contrib/perl5/gv.h b/contrib/perl5/gv.h
index 0226513..d2234a6 100644
--- a/contrib/perl5/gv.h
+++ b/contrib/perl5/gv.h
@@ -1,6 +1,6 @@
/* gv.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -17,9 +17,9 @@ struct gp {
GV * gp_egv; /* effective gv, if *glob */
CV * gp_cv; /* subroutine value */
U32 gp_cvgen; /* generational validity of cached gv_cv */
- I32 gp_lastexpr; /* used by nothing_in_common() */
+ U32 gp_flags; /* XXX unused */
line_t gp_line; /* line first declared at (for -w) */
- GV * gp_filegv; /* file first declared in (for -w) */
+ char * gp_file; /* file first declared in (for -w) */
};
#if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
@@ -34,6 +34,14 @@ struct gp {
#define GvSTASH(gv) (GvXPVGV(gv)->xgv_stash)
#define GvFLAGS(gv) (GvXPVGV(gv)->xgv_flags)
+/*
+=for apidoc Am|SV*|GvSV|GV* gv
+
+Return the SV from the GV.
+
+=cut
+*/
+
#define GvSV(gv) (GvGP(gv)->gp_sv)
#define GvREFCNT(gv) (GvGP(gv)->gp_refcnt)
#define GvIO(gv) ((gv) && SvTYPE((SV*)gv) == SVt_PVGV ? GvIOp(gv) : 0)
@@ -67,10 +75,11 @@ HV *GvHVn();
#define GvCVGEN(gv) (GvGP(gv)->gp_cvgen)
#define GvCVu(gv) (GvGP(gv)->gp_cvgen ? Nullcv : GvGP(gv)->gp_cv)
-#define GvLASTEXPR(gv) (GvGP(gv)->gp_lastexpr)
+#define GvGPFLAGS(gv) (GvGP(gv)->gp_flags)
#define GvLINE(gv) (GvGP(gv)->gp_line)
-#define GvFILEGV(gv) (GvGP(gv)->gp_filegv)
+#define GvFILE(gv) (GvGP(gv)->gp_file)
+#define GvFILEGV(gv) (gv_fetchfile(GvFILE(gv)))
#define GvEGV(gv) (GvGP(gv)->gp_egv)
#define GvENAME(gv) GvNAME(GvEGV(gv) ? GvEGV(gv) : gv)
@@ -79,6 +88,7 @@ HV *GvHVn();
#define GVf_INTRO 0x01
#define GVf_MULTI 0x02
#define GVf_ASSUMECV 0x04
+#define GVf_IN_PAD 0x08
#define GVf_IMPORTED 0xF0
#define GVf_IMPORTED_SV 0x10
#define GVf_IMPORTED_AV 0x20
@@ -117,6 +127,10 @@ HV *GvHVn();
#define GvIMPORTED_CV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_CV)
#define GvIMPORTED_CV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_CV)
+#define GvIN_PAD(gv) (GvFLAGS(gv) & GVf_IN_PAD)
+#define GvIN_PAD_on(gv) (GvFLAGS(gv) |= GVf_IN_PAD)
+#define GvIN_PAD_off(gv) (GvFLAGS(gv) &= ~GVf_IN_PAD)
+
#define Nullgv Null(GV*)
#define DM_UID 0x003
@@ -128,7 +142,7 @@ HV *GvHVn();
#define DM_DELAY 0x100
/*
- * symbol creation flags, for use in gv_fetchpv() and perl_get_*v()
+ * symbol creation flags, for use in gv_fetchpv() and get_*v()
*/
#define GV_ADD 0x01 /* add, if symbol not already there */
#define GV_ADDMULTI 0x02 /* add, pretending it has been added already */
diff --git a/contrib/perl5/handy.h b/contrib/perl5/handy.h
index 7744c31..2c5d706 100644
--- a/contrib/perl5/handy.h
+++ b/contrib/perl5/handy.h
@@ -1,6 +1,6 @@
/* handy.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -19,6 +19,17 @@
#endif
#define Null(type) ((type)NULL)
+
+/*
+=for apidoc AmU||Nullch
+Null character pointer.
+
+=for apidoc AmU||Nullsv
+Null SV pointer.
+
+=cut
+*/
+
#define Nullch Null(char*)
#define Nullfp Null(PerlIO*)
#define Nullsv Null(SV*)
@@ -37,24 +48,24 @@
just figure out all the headers such a test needs.
Andy Dougherty August 1996
*/
-/* bool is built-in for g++-2.6.3, which might be used for an extension.
- If the extension includes <_G_config.h> before this file then
- _G_HAVE_BOOL will be properly set. If, however, the extension includes
- this file first, then you will have to manually set -DHAS_BOOL in
- your command line to avoid a conflict.
+/* 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++
+ actually has bool. Hence, _G_HAVE_BOOL is pretty useless for us.
+ g++ can be identified by __GNUG__.
+ Andy Dougherty February 2000
*/
-#ifdef _G_HAVE_BOOL
-# if _G_HAVE_BOOL
+#ifdef __GNUG__ /* GNU g++ has bool built-in */
# ifndef HAS_BOOL
-# define HAS_BOOL 1
+# define HAS_BOOL 1
# endif
-# endif
#endif
/* The NeXT dynamic loader headers will not build with the bool macro
So declare them now to clear confusion.
*/
-#ifdef NeXT
+#if defined(NeXT) || defined(__NeXT__)
# undef FALSE
# undef TRUE
typedef enum bool { FALSE = 0, TRUE = 1 } bool;
@@ -62,7 +73,7 @@
# ifndef HAS_BOOL
# define HAS_BOOL 1
# endif /* !HAS_BOOL */
-#endif /* NeXT */
+#endif /* NeXT || __NeXT__ */
#ifndef HAS_BOOL
# if defined(UTS) || defined(VMS)
@@ -70,6 +81,7 @@
# else
# define bool char
# endif
+# define HAS_BOOL 1
#endif
/* XXX A note on the perl source internal type system. The
@@ -91,6 +103,7 @@
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)
LONGSIZE == sizeof(long)
@@ -98,49 +111,117 @@
PTRSIZE == sizeof(void *)
DOUBLESIZE == sizeof(double)
LONG_DOUBLESIZE == sizeof(long double) (if HAS_LONG_DOUBLE).
- Most of these are currently unused, but they are mentioned here so
- metaconfig will include the appropriate tests in Configure and
- we can then start to consider how best to deal with long long
- variables.
- Andy Dougherty April 1998
+
*/
-typedef char I8;
-typedef unsigned char U8;
+typedef I8TYPE I8;
+typedef U8TYPE U8;
+typedef I16TYPE I16;
+typedef U16TYPE U16;
+typedef I32TYPE I32;
+typedef U32TYPE U32;
+#ifdef PERL_CORE
+# ifdef HAS_QUAD
+# if QUADKIND == QUAD_IS_INT64_T
+# include <sys/types.h>
+# ifdef I_INTTYPES /* e.g. Linux has int64_t without <inttypes.h> */
+# include <inttypes.h>
+# endif
+# endif
+typedef I64TYPE I64;
+typedef U64TYPE U64;
+# endif
+#endif /* PERL_CORE */
+
+/* Mention I8SIZE, U8SIZE, I16SIZE, U16SIZE, I32SIZE, U32SIZE,
+ I64SIZE, and U64SIZE here so that metaconfig pulls them in. */
+
+#if defined(UINT8_MAX) && defined(INT16_MAX) && defined(INT32_MAX)
+
+/* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type.
+ Please search CHAR_MAX in perl.h for further details. */
+#define U8_MAX UINT8_MAX
+#define U8_MIN UINT8_MIN
+
+#define I16_MAX INT16_MAX
+#define I16_MIN INT16_MIN
+#define U16_MAX UINT16_MAX
+#define U16_MIN UINT16_MIN
+
+#define I32_MAX INT32_MAX
+#define I32_MIN INT32_MIN
+#define U32_MAX UINT32_MAX
+#define U32_MIN UINT32_MIN
+
+#else
+
/* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type.
Please search CHAR_MAX in perl.h for further details. */
#define U8_MAX PERL_UCHAR_MAX
#define U8_MIN PERL_UCHAR_MIN
-typedef short I16;
-typedef unsigned short U16;
#define I16_MAX PERL_SHORT_MAX
#define I16_MIN PERL_SHORT_MIN
#define U16_MAX PERL_USHORT_MAX
#define U16_MIN PERL_USHORT_MIN
#if LONGSIZE > 4
- typedef int I32;
- typedef unsigned int U32;
# define I32_MAX PERL_INT_MAX
# define I32_MIN PERL_INT_MIN
# define U32_MAX PERL_UINT_MAX
# define U32_MIN PERL_UINT_MIN
#else
- typedef long I32;
- typedef unsigned long U32;
# define I32_MAX PERL_LONG_MAX
# define I32_MIN PERL_LONG_MIN
# define U32_MAX PERL_ULONG_MAX
# define U32_MIN PERL_ULONG_MIN
#endif
+#endif
+
#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */
#define TYPE_DIGITS(T) BIT_DIGITS(sizeof(T) * 8)
#define TYPE_CHARS(T) (TYPE_DIGITS(T) + 2) /* sign, NUL */
#define Ctl(ch) ((ch) & 037)
+/*
+=for apidoc Am|bool|strNE|char* s1|char* s2
+Test two strings to see if they are different. Returns true or
+false.
+
+=for apidoc Am|bool|strEQ|char* s1|char* s2
+Test two strings to see if they are equal. Returns true or false.
+
+=for apidoc Am|bool|strLT|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is less than the second,
+C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strLE|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is less than or equal to the
+second, C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strGT|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is greater than the second,
+C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strGE|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is greater than or equal to
+the second, C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strnNE|char* s1|char* s2|STRLEN len
+Test two strings to see if they are different. The C<len> parameter
+indicates the number of bytes to compare. Returns true or false. (A
+wrapper for C<strncmp>).
+
+=for apidoc Am|bool|strnEQ|char* s1|char* s2|STRLEN len
+Test two strings to see if they are equal. The C<len> parameter indicates
+the number of bytes to compare. Returns true or false. (A wrapper for
+C<strncmp>).
+
+=cut
+*/
+
#define strNE(s1,s2) (strcmp(s1,s2))
#define strEQ(s1,s2) (!strcmp(s1,s2))
#define strLT(s1,s2) (strcmp(s1,s2) < 0)
@@ -177,6 +258,39 @@ typedef unsigned short U16;
# endif
#endif
+/*
+=for apidoc Am|bool|isALNUM|char ch
+Returns a boolean indicating whether the C C<char> is an ascii alphanumeric
+character or digit.
+
+=for apidoc Am|bool|isALPHA|char ch
+Returns a boolean indicating whether the C C<char> is an ascii alphabetic
+character.
+
+=for apidoc Am|bool|isSPACE|char ch
+Returns a boolean indicating whether the C C<char> is whitespace.
+
+=for apidoc Am|bool|isDIGIT|char ch
+Returns a boolean indicating whether the C C<char> is an ascii
+digit.
+
+=for apidoc Am|bool|isUPPER|char ch
+Returns a boolean indicating whether the C C<char> is an uppercase
+character.
+
+=for apidoc Am|bool|isLOWER|char ch
+Returns a boolean indicating whether the C C<char> is a lowercase
+character.
+
+=for apidoc Am|char|toUPPER|char ch
+Converts the specified character to uppercase.
+
+=for apidoc Am|char|toLOWER|char ch
+Converts the specified character to lowercase.
+
+=cut
+*/
+
#define isALNUM(c) (isALPHA(c) || isDIGIT(c) || (c) == '_')
#define isIDFIRST(c) (isALPHA(c) || (c) == '_')
#define isALPHA(c) (isUPPER(c) || isLOWER(c))
@@ -187,13 +301,25 @@ typedef unsigned short U16;
/* In EBCDIC we do not do locales: therefore() isupper() is fine. */
# define isUPPER(c) isupper(c)
# define isLOWER(c) islower(c)
+# define isALNUMC(c) isalnum(c)
+# define isASCII(c) isascii(c)
+# define isCNTRL(c) iscntrl(c)
+# define isGRAPH(c) isgraph(c)
# define isPRINT(c) isprint(c)
+# define isPUNCT(c) ispunct(c)
+# define isXDIGIT(c) isxdigit(c)
# define toUPPER(c) toupper(c)
# define toLOWER(c) tolower(c)
#else
# define isUPPER(c) ((c) >= 'A' && (c) <= 'Z')
# define isLOWER(c) ((c) >= 'a' && (c) <= 'z')
+# define isALNUMC(c) (isALPHA(c) || isDIGIT(c))
+# define isASCII(c) ((c) <= 127)
+# define isCNTRL(c) ((c) < ' ')
+# define isGRAPH(c) (isALNUM(c) || isPUNCT(c))
# define isPRINT(c) (((c) > 32 && (c) < 127) || isSPACE(c))
+# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+# define isXDIGIT(c) (isdigit(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
# define toUPPER(c) (isLOWER(c) ? (c) - ('a' - 'A') : (c))
# define toLOWER(c) (isUPPER(c) ? (c) + ('a' - 'A') : (c))
#endif
@@ -201,8 +327,7 @@ typedef unsigned short U16;
#ifdef USE_NEXT_CTYPE
# define isALNUM_LC(c) \
- (NXIsAlpha((unsigned int)(c)) || NXIsDigit((unsigned int)(c)) || \
- (char)(c) == '_')
+ (NXIsAlNum((unsigned int)(c)) || (char)(c) == '_')
# define isIDFIRST_LC(c) \
(NXIsAlpha((unsigned int)(c)) || (char)(c) == '_')
# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c))
@@ -210,45 +335,123 @@ typedef unsigned short U16;
# define isDIGIT_LC(c) NXIsDigit((unsigned int)(c))
# define isUPPER_LC(c) NXIsUpper((unsigned int)(c))
# define isLOWER_LC(c) NXIsLower((unsigned int)(c))
+# define isALNUMC_LC(c) NXIsAlNum((unsigned int)(c))
+# define isCNTRL_LC(c) NXIsCntrl((unsigned int)(c))
+# define isGRAPH_LC(c) NXIsGraph((unsigned int)(c))
# define isPRINT_LC(c) NXIsPrint((unsigned int)(c))
+# define isPUNCT_LC(c) NXIsPunct((unsigned int)(c))
# define toUPPER_LC(c) NXToUpper((unsigned int)(c))
# define toLOWER_LC(c) NXToLower((unsigned int)(c))
#else /* !USE_NEXT_CTYPE */
+
# if defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII))
-# define isALNUM_LC(c) \
- (isalpha((unsigned char)(c)) || \
- isdigit((unsigned char)(c)) || (char)(c) == '_')
+# define isALNUM_LC(c) (isalnum((unsigned char)(c)) || (char)(c) == '_')
# define isIDFIRST_LC(c) (isalpha((unsigned char)(c)) || (char)(c) == '_')
# define isALPHA_LC(c) isalpha((unsigned char)(c))
# define isSPACE_LC(c) isspace((unsigned char)(c))
# define isDIGIT_LC(c) isdigit((unsigned char)(c))
# define isUPPER_LC(c) isupper((unsigned char)(c))
# define isLOWER_LC(c) islower((unsigned char)(c))
+# define isALNUMC_LC(c) isalnum((unsigned char)(c))
+# define isCNTRL_LC(c) iscntrl((unsigned char)(c))
+# define isGRAPH_LC(c) isgraph((unsigned char)(c))
# define isPRINT_LC(c) isprint((unsigned char)(c))
+# define isPUNCT_LC(c) ispunct((unsigned char)(c))
# define toUPPER_LC(c) toupper((unsigned char)(c))
# define toLOWER_LC(c) tolower((unsigned char)(c))
# else
-# define isALNUM_LC(c) \
- (isascii(c) && (isalpha(c) || isdigit(c) || (c) == '_'))
+# define isALNUM_LC(c) (isascii(c) && (isalnum(c) || (c) == '_'))
# define isIDFIRST_LC(c) (isascii(c) && (isalpha(c) || (c) == '_'))
# define isALPHA_LC(c) (isascii(c) && isalpha(c))
# define isSPACE_LC(c) (isascii(c) && isspace(c))
# define isDIGIT_LC(c) (isascii(c) && isdigit(c))
# define isUPPER_LC(c) (isascii(c) && isupper(c))
# define isLOWER_LC(c) (isascii(c) && islower(c))
+# define isALNUMC_LC(c) (isascii(c) && isalnum(c))
+# define isCNTRL_LC(c) (isascii(c) && iscntrl(c))
+# define isGRAPH_LC(c) (isascii(c) && isgraph(c))
# define isPRINT_LC(c) (isascii(c) && isprint(c))
+# define isPUNCT_LC(c) (isascii(c) && ispunct(c))
# define toUPPER_LC(c) toupper(c)
# define toLOWER_LC(c) tolower(c)
# endif
#endif /* USE_NEXT_CTYPE */
+#define isALNUM_uni(c) is_uni_alnum(c)
+#define isIDFIRST_uni(c) is_uni_idfirst(c)
+#define isALPHA_uni(c) is_uni_alpha(c)
+#define isSPACE_uni(c) is_uni_space(c)
+#define isDIGIT_uni(c) is_uni_digit(c)
+#define isUPPER_uni(c) is_uni_upper(c)
+#define isLOWER_uni(c) is_uni_lower(c)
+#define isALNUMC_uni(c) is_uni_alnumc(c)
+#define isASCII_uni(c) is_uni_ascii(c)
+#define isCNTRL_uni(c) is_uni_cntrl(c)
+#define isGRAPH_uni(c) is_uni_graph(c)
+#define isPRINT_uni(c) is_uni_print(c)
+#define isPUNCT_uni(c) is_uni_punct(c)
+#define isXDIGIT_uni(c) is_uni_xdigit(c)
+#define toUPPER_uni(c) to_uni_upper(c)
+#define toTITLE_uni(c) to_uni_title(c)
+#define toLOWER_uni(c) to_uni_lower(c)
+
+#define isALNUM_LC_uni(c) (c < 256 ? isALNUM_LC(c) : is_uni_alnum_lc(c))
+#define isIDFIRST_LC_uni(c) (c < 256 ? isIDFIRST_LC(c) : is_uni_idfirst_lc(c))
+#define isALPHA_LC_uni(c) (c < 256 ? isALPHA_LC(c) : is_uni_alpha_lc(c))
+#define isSPACE_LC_uni(c) (c < 256 ? isSPACE_LC(c) : is_uni_space_lc(c))
+#define isDIGIT_LC_uni(c) (c < 256 ? isDIGIT_LC(c) : is_uni_digit_lc(c))
+#define isUPPER_LC_uni(c) (c < 256 ? isUPPER_LC(c) : is_uni_upper_lc(c))
+#define isLOWER_LC_uni(c) (c < 256 ? isLOWER_LC(c) : is_uni_lower_lc(c))
+#define isALNUMC_LC_uni(c) (c < 256 ? isALNUMC_LC(c) : is_uni_alnumc_lc(c))
+#define isCNTRL_LC_uni(c) (c < 256 ? isCNTRL_LC(c) : is_uni_cntrl_lc(c))
+#define isGRAPH_LC_uni(c) (c < 256 ? isGRAPH_LC(c) : is_uni_graph_lc(c))
+#define isPRINT_LC_uni(c) (c < 256 ? isPRINT_LC(c) : is_uni_print_lc(c))
+#define isPUNCT_LC_uni(c) (c < 256 ? isPUNCT_LC(c) : is_uni_punct_lc(c))
+#define toUPPER_LC_uni(c) (c < 256 ? toUPPER_LC(c) : to_uni_upper_lc(c))
+#define toTITLE_LC_uni(c) (c < 256 ? toUPPER_LC(c) : to_uni_title_lc(c))
+#define toLOWER_LC_uni(c) (c < 256 ? toLOWER_LC(c) : to_uni_lower_lc(c))
+
+#define isALNUM_utf8(p) is_utf8_alnum(p)
+#define isIDFIRST_utf8(p) is_utf8_idfirst(p)
+#define isALPHA_utf8(p) is_utf8_alpha(p)
+#define isSPACE_utf8(p) is_utf8_space(p)
+#define isDIGIT_utf8(p) is_utf8_digit(p)
+#define isUPPER_utf8(p) is_utf8_upper(p)
+#define isLOWER_utf8(p) is_utf8_lower(p)
+#define isALNUMC_utf8(p) is_utf8_alnumc(p)
+#define isASCII_utf8(p) is_utf8_ascii(p)
+#define isCNTRL_utf8(p) is_utf8_cntrl(p)
+#define isGRAPH_utf8(p) is_utf8_graph(p)
+#define isPRINT_utf8(p) is_utf8_print(p)
+#define isPUNCT_utf8(p) is_utf8_punct(p)
+#define isXDIGIT_utf8(p) is_utf8_xdigit(p)
+#define toUPPER_utf8(p) to_utf8_upper(p)
+#define toTITLE_utf8(p) to_utf8_title(p)
+#define toLOWER_utf8(p) to_utf8_lower(p)
+
+#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))
+
#ifdef EBCDIC
-EXT int ebcdic_control _((int));
+EXT int ebcdic_control (int);
# define toCTRL(c) ebcdic_control(c)
#else
/* This conversion works both ways, strangely enough. */
@@ -264,10 +467,10 @@ typedef U16 line_t;
#endif
-/* This looks obsolete (IZ):
-
+/*
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.)
Further, if you try LEAKTEST, you'll also end up calling
Safefree, which might call safexfree() on some things that weren't
malloced with safexmalloc. The correct "fix" to this, if anyone
@@ -276,6 +479,56 @@ typedef U16 line_t;
--Andy Dougherty August 1996
*/
+/*
+=for apidoc Am|SV*|NEWSV|int id|STRLEN len
+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.
+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
+The XSUB-writer's interface to the C C<malloc> function.
+
+=for apidoc Am|void|Newc|int id|void* ptr|int nitems|type|cast
+The XSUB-writer's interface to the C C<malloc> function, with
+cast.
+
+=for apidoc Am|void|Newz|int id|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<malloc> function. The allocated
+memory is zeroed with C<memzero>.
+
+=for apidoc Am|void|Renew|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<realloc> function.
+
+=for apidoc Am|void|Renewc|void* ptr|int nitems|type|cast
+The XSUB-writer's interface to the C C<realloc> function, with
+cast.
+
+=for apidoc Am|void|Safefree|void* src|void* dest|int nitems|type
+The XSUB-writer's interface to the C C<free> function.
+
+=for apidoc Am|void|Move|void* src|void* dest|int nitems|type
+The XSUB-writer's interface to the C C<memmove> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. Can do overlapping moves. See also C<Copy>.
+
+=for apidoc Am|void|Copy|void* src|void* dest|int nitems|type
+The XSUB-writer's interface to the C C<memcpy> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. May fail on overlapping copies. See also C<Move>.
+
+=for apidoc Am|void|Zero|void* dest|int nitems|type
+
+The XSUB-writer's interface to the C C<memzero> function. The C<dest> is the
+destination, C<nitems> is the number of items, and C<type> is the type.
+
+=for apidoc Am|void|StructCopy|type src|type dest|type
+This is an architecture-independant macro to copy one structure to another.
+
+=cut
+*/
+
#ifndef lint
#define NEWSV(x,len) newSV(len)
diff --git a/contrib/perl5/hints/README.hints b/contrib/perl5/hints/README.hints
index e36bd6d..5f23b29 100644
--- a/contrib/perl5/hints/README.hints
+++ b/contrib/perl5/hints/README.hints
@@ -11,7 +11,9 @@ over from perl4.
Please send any problems or suggested changes to perlbug@perl.com.
-Hint file naming convention: Each hint file name should have only
+=head1 Hint file naming convention.
+
+Each hint file name should have only
one '.'. (This is for portability to non-unix file systems.) Names
should also fit in <= 14 characters, for portability to older SVR3
systems. File names are of the form $osname_$osvers.sh, with all '.'
@@ -51,6 +53,56 @@ detect what is needed.
A glossary of config.sh variables is in the file Porting/Glossary.
+=head1 Setting variables
+
+=head2 Optimizer
+
+If you want to set a variable, try to allow for Configure command-line
+overrides. For example, suppose you think the default optimizer
+setting to be -O2 for a particular platform. You should allow for
+command line overrides with something like
+
+ case "$optimize" in
+ '') optimize='-O2' ;;
+ esac
+
+or, if your system has a decent test(1) command,
+
+ test -z "$optimize" && optimize='-O2'
+
+This allows the user to select a different optimization level, e.g.
+-O6 or -g.
+
+=head2 Compiler and Linker flags
+
+If you want to set $ccflags or $ldflags, you should append to the existing
+value to allow Configure command-line settings, e.g. use
+
+ ccflags="$ccflags -DANOTHER_OPTION_I_NEED"
+
+so that the user can do something like
+
+ sh Configure -Dccflags='FIX_NEGATIVE_ZERO'
+
+and have the FIX_NEGATIVE_ZERO value preserved by the hints file.
+
+=head2 Libraries
+
+Configure will attempt to use the libraries listed in the variable
+$libswanted. If necessary, you should remove broken libraries from
+that list, or add additional libraries to that list. You should
+*not* simply set $libs -- that ignores the possibilities of local
+variations. For example, a setting of libs='-lgdbm -lm -lc' would
+fail if another user were to try to compile Perl on a system without
+GDBM but with Berkeley DB. See hints/dec_osf.sh and hints/solaris_2.sh
+for examples.
+
+=head2 Other
+
+In general, try to avoid hard-wiring something that Configure will
+figure out anyway. Also try to allow for Configure command-line
+overrides.
+
=head1 Hint file tricks
=head2 Printing critical messages
@@ -189,12 +241,6 @@ after Configure prompts the user for the C compiler, it will load in
and run the UU/cc.cbu "call-back" unit. See hints/solaris_2.sh for an
example.
-=item Threading-related flags
-
-Similarly, after Configure prompts the user about whether or not to
-compile Perl with threads, it will look for a "call-back" unit
-usethreads.cbu. See hints/linux.sh for an example.
-
=item Future status
I hope this "call-back" scheme is simple enough to use but powerful
@@ -210,4 +256,4 @@ say things like "sh Configure -Dcc=gcc -Dusethreads" on the command line.
Have the appropriate amount of fun :-)
- Andy Dougherty doughera@lafcol.lafayette.edu
+ Andy Dougherty doughera@lafayette.edu
diff --git a/contrib/perl5/hints/aix.sh b/contrib/perl5/hints/aix.sh
index d2c45c0..d6f3dd7 100644
--- a/contrib/perl5/hints/aix.sh
+++ b/contrib/perl5/hints/aix.sh
@@ -2,30 +2,99 @@
# AIX 3.x.x hints thanks to Wayne Scott <wscott@ichips.intel.com>
# AIX 4.1 hints thanks to Christopher Chan-Nui <channui@austin.ibm.com>.
# AIX 4.1 pthreading by Christopher Chan-Nui <channui@austin.ibm.com> and
-# Jarkko Hietaniemi <jhi@iki.fi>.
+# Jarkko Hietaniemi <jhi@iki.fi>.
+# AIX 4.3.x LP64 build by Steven Hirsch <hirschs@btv.ibm.com>
# Merged on Mon Feb 6 10:22:35 EST 1995 by
# Andy Dougherty <doughera@lafcol.lafayette.edu>
+#
+# Contact dfavor@corridor.com for any of the following:
+#
+# - AIX 43x and above support
+# - gcc + threads support
+# - socks support
+#
+# Apr 99 changes:
+#
+# - use nm in AIX 43x and above
+# - gcc + threads now builds
+# [(added support for socks) Jul 99 SOCKS support rewritten]
+#
+# Notes:
+#
+# - shared libperl support is tricky. if ever libperl.a ends up
+# in /usr/local/lib/* it can override any subsequent builds of
+# that same perl release. to make sure you know where the shared
+# libperl.a is coming from do a 'dump -Hv perl' and check all the
+# library search paths in the loader header.
+#
+# it would be nice to warn the user if a libperl.a exists that is
+# going to override the current build, but that would be complex.
+#
+# better yet, a solid fix for this situation should be developed.
+#
# Configure finds setrgid and setruid, but they're useless. The man
# pages state:
# setrgid: The EPERM error code is always returned.
# setruid: The EPERM error code is always returned. Processes cannot
-# reset only their real user IDs.
+# reset only their real user IDs.
d_setrgid='undef'
d_setruid='undef'
alignbytes=8
-usemymalloc='n'
+case "$usemymalloc" in
+'') usemymalloc='n' ;;
+esac
# Intuiting the existence of system calls under AIX is difficult,
# at best; the safest technique is to find them empirically.
-usenm='undef'
+
+# AIX 4.3.* and above default to using nm for symbol extraction
+case "$osvers" in
+ 3.*|4.1.*|4.2.*)
+ usenm='undef'
+ ;;
+ *)
+ usenm='true'
+ ;;
+esac
so="a"
+# AIX itself uses .o (libc.o) but we prefer compatibility
+# with the rest of the world and with rest of the scripting
+# languages (Tcl, Python) and related systems (SWIG).
+# Stephanie Beals <bealzy@us.ibm.com>
dlext="so"
+# Take possible hint from the environment. If 32-bit is set in the
+# environment, we can override it later. If set for 64, the
+# 'sizeof' test sees a native 64-bit architecture and never looks back.
+case "$OBJECT_MODE" in
+32)
+ cat >&4 <<EOF
+
+You have OBJECT_MODE=32 set in the environment.
+I take this as a hint you do not want to
+build for a 64-bit address space. You will be
+given the opportunity to change this later.
+EOF
+ ;;
+64)
+ cat >&4 <<EOF
+
+You have OBJECT_MODE=64 set in the environment.
+This forces a full 64-bit build. If that is
+not what you intended, please terminate this
+program, unset it and restart.
+EOF
+ ;;
+*) ;;
+esac
+
+# Trying to set this breaks the POSIX.c compilation
+
# Make setsockopt work correctly. See man page.
# ccflags='-D_BSD=44'
@@ -34,6 +103,8 @@ case "$archname" in
'') archname="$osname" ;;
esac
+cc=${cc:-cc}
+
case "$osvers" in
3*) d_fchmod=undef
ccflags="$ccflags -D_ALL_SOURCE"
@@ -42,7 +113,7 @@ case "$osvers" in
ccflags="$ccflags -D_ALL_SOURCE -D_ANSI_C_SOURCE -D_POSIX_SOURCE"
case "$cc" in
*gcc*) ;;
- *) ccflags="$ccflags -qmaxmem=8192" ;;
+ *) ccflags="$ccflags -qmaxmem=16384" ;;
esac
nm_opt='-B'
;;
@@ -56,21 +127,26 @@ d_setreuid='undef'
#
# Tell perl which symbols to export for dynamic linking.
case "$cc" in
-*gcc*) ccdlflags='-Xlinker -bE:perl.exp' ;;
-*) ccdlflags='-bE:perl.exp' ;;
+*gcc*) ccdlflags='-Xlinker' ;;
+esac
+# the required -bE:$installarchlib/CORE/perl.exp is added by
+# libperl.U (Configure) later.
+
+case "$ldlibpthname" in
+'') ldlibpthname=LIBPATH ;;
esac
# The first 3 options would not be needed if dynamic libs. could be linked
# with the compiler instead of ld.
# -bI:$(PERL_INC)/perl.exp Read the exported symbols from the perl binary
-# -bE:$(BASEEXT).exp Export these symbols. This file contains only one
-# symbol: boot_$(EXP) can it be auto-generated?
+# -bE:$(BASEEXT).exp Export these symbols. This file contains only one
+# symbol: boot_$(EXP) can it be auto-generated?
case "$osvers" in
3*)
- lddlflags='-H512 -T512 -bhalt:4 -bM:SRE -bI:$(PERL_INC)/perl.exp -bE:$(BASEEXT).exp -e _nostart -lc'
+ lddlflags="$lddlflags -H512 -T512 -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -e _nostart -lc"
;;
*)
- lddlflags='-bhalt:4 -bM:SRE -bI:$(PERL_INC)/perl.exp -bE:$(BASEEXT).exp -b noentry -lc'
+ lddlflags="$lddlflags -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -b noentry -lc"
;;
esac
@@ -79,39 +155,230 @@ esac
cat > UU/usethreads.cbu <<'EOCBU'
case "$usethreads" in
$define|true|[yY]*)
- ccflags="$ccflags -DNEED_PTHREAD_INIT"
- case "$cc" in
- cc_r) ;;
- cc|xlc_r)
+ ccflags="$ccflags -DNEED_PTHREAD_INIT"
+ case "$cc" in
+ gcc) ;;
+ cc_r) ;;
+ cc|xl[cC]_r)
echo >&4 "Switching cc to cc_r because of POSIX threads."
# xlc_r has been known to produce buggy code in AIX 4.3.2.
- # (e.g. pragma/overload core dumps)
+ # (e.g. pragma/overload core dumps) Let's suspect xlC_r, too.
# --jhi@iki.fi
cc=cc_r
- ;;
- '')
+ ;;
+ '')
cc=cc_r
- ;;
- *)
- cat >&4 <<EOM
+ ;;
+ *)
+ cat >&4 <<EOM
For pthreads you should use the AIX C compiler cc_r.
-(now your compiler was '$cc')
+(now your compiler was set to '$cc')
Cannot continue, aborting.
EOM
- exit 1
+ exit 1
;;
- esac
+ esac
- # Add the POSIX threads library and the re-entrant libc.
+ # c_rify libswanted.
+ set `echo X "$libswanted "| sed -e 's/ \([cC]\) / \1_r /g'`
+ shift
+ libswanted="$*"
+ # c_rify lddlflags.
+ set `echo X "$lddlflags "| sed -e 's/ \(-l[cC]\) / \1_r /g'`
+ shift
+ lddlflags="$*"
- lddlflags=`echo $lddlflags | sed 's/ -lc$/ -lpthreads -lc_r -lc/'`
+ # Insert pthreads to libswanted, before any libc or libC.
+ set `echo X "$libswanted "| sed -e 's/ \([cC]\) / pthreads \1 /'`
+ shift
+ libswanted="$*"
+ # Insert pthreads to lddlflags, before any libc or libC.
+ set `echo X "$lddlflags " | sed -e 's/ \(-l[cC]\) / -lpthreads \1 /'`
+ shift
+ lddlflags="$*"
- # Add the c_r library to the list of wanted libraries.
- # Make sure the c_r library is before the c library or
- # make will fail.
- set `echo X "$libswanted "| sed -e 's/ c / c_r c /'`
- shift
- libswanted="$*"
;;
esac
EOCBU
+
+# This script UU/uselargefiles.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use large files.
+cat > UU/uselargefiles.cbu <<'EOCBU'
+case "$uselargefiles" in
+''|$define|true|[yY]*)
+ lfcflags="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
+ lfldflags="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
+ # _Somehow_ in AIX 4.3.1.0 the above getconf call manages to
+ # insert(?) *something* to $ldflags so that later (in Configure) evaluating
+ # $ldflags causes a newline after the '-b64' (the result of the getconf).
+ # (nothing strange shows up in $ldflags even in hexdump;
+ # so it may be something in the shell, instead?)
+ # Try it out: just uncomment the below line and rerun Configure:
+# echo >&4 "AIX 4.3.1.0 $lfldflags mystery" ; exit 1
+ # Just don't ask me how AIX does it, I spent hours wondering.
+ # Therefore the line re-evaluating lfldflags: it seems to fix
+ # the whatever it was that AIX managed to break. --jhi
+ lfldflags="`echo $lfldflags`"
+ lflibs="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+ case "$lfcflags$lfldflags$lflibs" in
+ '');;
+ *) ccflags="$ccflags $lfcflags"
+ ldflags="$ldflags $lfldflags"
+ libswanted="$libswanted $lflibs"
+ ;;
+ esac
+ lfcflags=''
+ lfldflags=''
+ lflibs=''
+ ;;
+esac
+EOCBU
+
+# This script UU/use64bitint.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use 64 bit integers.
+cat > UU/use64bitint.cbu <<'EOCBU'
+case "$use64bitint" in
+$define|true|[yY]*)
+ case "`oslevel`" in
+ 3.*|4.[012].*)
+ cat >&4 <<EOM
+AIX `oslevel` does not support 64-bit interfaces.
+You should upgrade to at least AIX 4.3.
+EOM
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+EOCBU
+
+cat > UU/use64bitall.cbu <<'EOCBU'
+# This script UU/use64bitall.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to be maximally 64-bitty.
+case "$use64bitall" in
+$define|true|[yY]*)
+ case "`oslevel`" in
+ 3.*|4.[012].*)
+ cat >&4 <<EOM
+AIX `oslevel` does not support 64-bit interfaces.
+You should upgrade to at least AIX 4.3.
+EOM
+ exit 1
+ ;;
+ esac
+ echo " "
+ echo "Checking the CPU width of your hardware..." >&4
+ $cat >size.c <<EOCP
+#include <stdio.h>
+#include <sys/systemcfg.h>
+int main (void)
+{
+ printf("%d\n",_system_configuration.width);
+ return(0);
+}
+EOCP
+ set size
+ if eval $compile_ok; then
+ lfcpuwidth=`./size`
+ echo "You are running on $lfcpuwidth bit hardware."
+ else
+ dflt="32"
+ echo " "
+ echo "(I can't seem to compile the test program. Guessing...)"
+ rp="What is the width of your CPU (in bits)?"
+ . ./myread
+ lfcpuwidth="$ans"
+ fi
+ $rm -f size.c size
+ case "$lfcpuwidth" in
+ 32*)
+ cat >&4 <<EOM
+Bzzzt! At present, you can only perform a
+full 64-bit build on a 64-bit machine.
+EOM
+ exit 1
+ ;;
+ esac
+ lfcflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
+ lfldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
+ # See jhi's comments above regarding this re-eval. I've
+ # seen similar weirdness in the form of:
+ #
+# 1506-173 (W) Option lm is not valid. Enter xlc for list of valid options.
+ #
+ # error messages from 'cc -E' invocation. Again, the offending
+ # string is simply not detectable by any means. Since it doesn't
+ # do any harm, I didn't pursue it. -- sh
+ lfldflags="`echo $lfldflags`"
+ lflibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+ # -q32 and -b32 may have been set by uselargefiles or user.
+ # Remove them.
+ ccflags="`echo $ccflags | sed -e 's@-q32@@'`"
+ ldflags="`echo $ldflags | sed -e 's@-b32@@'`"
+ # Tell archiver to use large format. Unless we remove 'ar'
+ # from 'trylist', the Configure script will just reset it to 'ar'
+ # immediately prior to writing config.sh. This took me hours
+ # to figure out.
+ trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @ @g' -e 's@ ar$@@'`"
+ ar="ar -X64"
+ nm_opt="-X64 $nm_opt"
+ # Note: Placing the 'lfcflags' variable into the 'ldflags' string
+ # is NOT a typo. ldlflags is passed to the C compiler for final
+ # linking, and it wants -q64 (-b64 is for ld only!).
+ case "$lfcflags$lfldflags$lflibs" in
+ '');;
+ *) ccflags="$ccflags $lfcflags"
+ ldflags="$ldflags $lfcflags"
+ lddlflags="$lfldflags $lddlflags"
+ libswanted="$libswanted $lflibs"
+ ;;
+ esac
+ case "$ccflags" in
+ *-DUSE_64_BIT_ALL*) ;;
+ *) ccflags="$ccflags -DUSE_64_BIT_ALL";;
+ esac
+ case "$archname64" in
+ ''|64*) archname64=64all ;;
+ esac
+ longsize="8"
+ # Don't try backwards compatibility
+ bincompat="$undef"
+ d_bincompat5005="$undef"
+ lfcflags=''
+ lfldflags=''
+ lflibs=''
+ lfcpuwidth=''
+ ;;
+esac
+EOCBU
+
+cat > UU/uselongdouble.cbu <<'EOCBU'
+# This script UU/uselongdouble.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use long doubles.
+case "$uselongdouble" in
+$define|true|[yY]*)
+ ccflags="$ccflags -qlongdouble"
+ # The explicit cc128, xlc128, xlC128 are not needed,
+ # the -qlongdouble should do the trick. --jhi
+ d_Gconvert='sprintf((b),"%.*llg",(n),(x))'
+ ;;
+esac
+EOCBU
+
+# If the C++ libraries, libC and libC_r, are available we will prefer them
+# over the vanilla libc, because the libC contain loadAndInit() and
+# terminateAndUnload() which work correctly with C++ statics while libc
+# load() and unload() do not. See ext/DynaLoader/dl_aix.xs.
+# The C-to-C_r switch is done by usethreads.cbu, if needed.
+if test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
+ # Cify libswanted.
+ set `echo X "$libswanted "| sed -e 's/ c / C c /'`
+ shift
+ libswanted="$*"
+ # Cify lddlflags.
+ set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
+ shift
+ lddlflags="$*"
+fi
+
+# EOF
diff --git a/contrib/perl5/hints/amigaos.sh b/contrib/perl5/hints/amigaos.sh
index 9d86e52..fff55b0 100644
--- a/contrib/perl5/hints/amigaos.sh
+++ b/contrib/perl5/hints/amigaos.sh
@@ -22,15 +22,20 @@ libpth="$prefix/lib /local/lib"
glibpth="$libpth"
xlibpth="$libpth"
+# This should remove unwanted libraries instead of limiting the set
+# to just these few. E.g. what about Berkeley DB?
libswanted='gdbm m dld'
so=' '
# compiler & linker flags
+# Respect command-line values.
-ccflags='-DAMIGAOS -mstackextend'
-ldflags=''
-optimize='-O2 -fomit-frame-pointer'
+ccflags="$ccflags -DAMIGAOS -mstackextend"
+case "$optimize" in
+'') optimize='-O2 -fomit-frame-pointer';;
+esac
dlext='o'
+# Are these two different from the defaults?
cccdlflags='none'
ccdlflags='none'
lddlflags='-oformat a.out-amiga -r'
diff --git a/contrib/perl5/hints/beos.sh b/contrib/perl5/hints/beos.sh
index 8d76bc5..8017dce 100644
--- a/contrib/perl5/hints/beos.sh
+++ b/contrib/perl5/hints/beos.sh
@@ -51,3 +51,7 @@ ld='gcc'
# Of course, this may also change with R5.
export PATH="$PATH:$PWD/beos"
+
+case "$ldlibpthname" in
+'') ldlibpthname=LIBRARY_PATH ;;
+esac
diff --git a/contrib/perl5/hints/cygwin.sh b/contrib/perl5/hints/cygwin.sh
new file mode 100644
index 0000000..42114c2
--- /dev/null
+++ b/contrib/perl5/hints/cygwin.sh
@@ -0,0 +1,48 @@
+#! /bin/sh
+# cygwin.sh - hints for building perl using the Cygwin environment for Win32
+#
+
+# not otherwise settable
+exe_ext='.exe'
+firstmakefile='GNUmakefile'
+case "$ldlibpthname" in
+'') ldlibpthname=PATH ;;
+esac
+archobjs='cygwin.o'
+
+# mandatory (overrides incorrect defaults)
+test -z "$cc" && cc='gcc'
+if test -z "$plibpth"
+then
+ plibpth=`gcc -print-file-name=libc.a`
+ plibpth=`dirname $plibpth`
+ plibpth=`cd $plibpth && pwd`
+fi
+so='dll'
+# - eliminate -lc, implied by gcc
+libswanted=`echo " $libswanted " | sed -e 's/ c / /g'`
+libswanted="$libswanted cygipc cygwin kernel32"
+# - otherwise i686-cygwin
+archname='cygwin'
+
+# dynamic loading
+# - otherwise -fpic
+cccdlflags=' '
+ld='ld2'
+
+# optional(ish)
+# - perl malloc needs to be unpolluted
+bincompat5005='undef'
+
+# stubs (ENOSYS, not implemented)
+d_chroot='undef'
+d_seteuid='undef'
+d_setegid='undef'
+
+# Win9x problem with non-blocking read from a closed pipe
+d_eofnblk='define'
+
+# strip exe's and dll's
+#ldflags="$ldflags -s"
+#ccdlflags="$ccdlflags -s"
+#lddlflags="$lddlflags -s"
diff --git a/contrib/perl5/hints/darwin.sh b/contrib/perl5/hints/darwin.sh
new file mode 100644
index 0000000..fd61e42
--- /dev/null
+++ b/contrib/perl5/hints/darwin.sh
@@ -0,0 +1,63 @@
+##
+# Darwin (Mac OS) hints
+# Wilfredo Sanchez <wsanchez@apple.com>
+##
+
+##
+# Paths
+##
+
+# BSD paths
+prefix='/usr';
+siteprefix='/usr/local';
+vendorprefix='/usr/local'; usevendorprefix='define';
+
+# 4BSD uses /usr/share/man, not /usr/man.
+# Don't put man pages in /usr/lib; that's goofy.
+man1dir='/usr/share/man/man1';
+man3dir='/usr/share/man/man3';
+
+# Where to put modules.
+privlib='/System/Library/Perl';
+sitelib='/Local/Library/Perl';
+vendorlib='/Network/Library/Perl';
+
+##
+# Tool chain settings
+##
+
+# Since we can build fat, the archname doesn't need the processor type
+archname='darwin';
+
+# nm works.
+usenm='true';
+
+# Libc is in libsystem.
+libc='/System/Library/Frameworks/System.framework/System';
+
+# Optimize.
+optimize='-O3';
+
+# We have a prototype for telldir.
+ccflags="${ccflags} -pipe -fno-common -DHAS_TELLDIR_PROTOTYPE";
+
+# Shared library extension is .dylib.
+# Bundle extension is .bundle.
+ld='cc';
+so='dylib';
+dlext='bundle';
+dlsrc='dl_dyld.xs'; usedl='define';
+cccdlflags='';
+lddlflags="${ldflags} -bundle -undefined suppress";
+ldlibpthname='DYLD_LIBRARY_PATH';
+useshrplib='true';
+
+##
+# System libraries
+##
+
+# vfork works
+usevfork='true';
+
+# malloc works
+usemymalloc='n';
diff --git a/contrib/perl5/hints/dec_osf.sh b/contrib/perl5/hints/dec_osf.sh
index 8758cbb..db7b869 100644
--- a/contrib/perl5/hints/dec_osf.sh
+++ b/contrib/perl5/hints/dec_osf.sh
@@ -58,20 +58,41 @@
# and it is called GEM. Many of the options we are going to use depend
# on the compiler style.
-# do NOT, I repeat, *NOT* take away those leading tabs
+cc=${cc:-cc}
+
+# do NOT, I repeat, *NOT* take away the leading tabs
+# Configure Black Magic (TM)
# reset
- _DEC_uname_r=
_DEC_cc_style=
- # set
- _DEC_uname_r=`uname -r`
- # _DEC_cc_style set soon below
-# Configure Black Magic (TM)
+case "`$cc -v 2>&1 | grep cc`" in
+*gcc*) _gcc_version=`$cc -v 2>&1 | grep "gcc version" | sed 's%^gcc version \([0-9]*\)\.\([0-9]*\) .*%\1 \2%'`
+ set $_gcc_version
+ if test "$1" -lt 2 -o \( "$1" -eq 2 -a "$2" -lt 95 \); then
+ cat >&4 <<EOF
+
+Your cc seems to be gcc and its version seems to be less than 2.95.
+This is not a good idea since old versions of gcc are known to produce
+buggy code when compiling Perl (and no doubt for other programs, too).
+
+Therefore, I strongly suggest upgrading your gcc. (Why don't you
+use the vendor cc is also a good question. It comes with the operating
+system and produces good code.)
+
+Note that as of gcc 2.95 (19990728) and Perl 5.6.0 (end of March 2000)
+if the said Perl is compiled with the said gcc the lib/sdbm test will
+dump core. As this doesn't happen with the vendor cc, this is
+most probably a lingering bug in gcc. Therefore unless you have
+a better gcc you are still better off using the vendor cc.
+
+Cannot continue, aborting.
-case "$cc" in
-*gcc*) ;; # pass
+EOF
+ exit 1
+ fi
+ ;;
*) # compile something small: taint.c is fine for this.
# the main point is the '-v' flag of 'cc'.
- case "`cc -v -I. -c taint.c -o /tmp/taint$$.o 2>&1`" in
+ case "`cc -v -I. -c taint.c -o taint$$.o 2>&1`" in
*/gemc_cc*) # we have the new DEC GEM CC
_DEC_cc_style=new
;;
@@ -80,12 +101,12 @@ case "$cc" in
;;
esac
# cleanup
- rm -f /tmp/taint$$.o
+ rm -f taint$$.o
;;
esac
# be nauseatingly ANSI
-case "$cc" in
+case "`$cc -v 2>&1 | grep gcc`" in
*gcc*) ccflags="$ccflags -ansi"
;;
*) ccflags="$ccflags -std"
@@ -98,7 +119,7 @@ esac
# we want optimisation
case "$optimize" in
-'') case "$cc" in
+'') case "`$cc -v 2>&1 | grep gcc`" in
*gcc*)
optimize='-O3' ;;
*) case "$_DEC_cc_style" in
@@ -147,13 +168,26 @@ lddlflags='-shared -expect_unresolved "*"'
# Fancy compiler suites use optimising linker as well as compiler.
# <spider@Orb.Nashua.NH.US>
-case "$_DEC_uname_r" in
+case "`uname -r`" in
*[123].*) # old loader
lddlflags="$lddlflags -O3"
;;
-*) lddlflags="$lddlflags $optimize -msym"
- # -msym: If using a sufficiently recent /sbin/loader,
- # keep the module symbols with the modules.
+*) if $test "X$optimize" = "X$undef"; then
+ lddlflags="$lddlflags -msym"
+ else
+ case "`/usr/sbin/sizer -v`" in
+ *4.0D*)
+ # QAR 56761: -O4 + .so may produce broken code,
+ # fixed in 4.0E or better.
+ ;;
+ *)
+ lddlflags="$lddlflags $optimize"
+ ;;
+ esac
+ # -msym: If using a sufficiently recent /sbin/loader,
+ # keep the module symbols with the modules.
+ lddlflags="$lddlflags -msym -std"
+ fi
;;
esac
# Yes, the above loses if gcc does not use the system linker.
@@ -165,7 +199,7 @@ esac
# As noted above the -DDEBUGGING is added automagically by Configure if -g.
case "$optimize" in
*-g*) ;; # left intentionally blank
-*) case "$_DEC_uname_r" in
+*) case "`uname -r`" in
*[123].*)
case "$useshrplib" in
false|undef|'') lddlflags="$lddlflags -s" ;;
@@ -187,38 +221,75 @@ case "$_DEC_cc_style.$useshrplib" in
new.) useshrplib="$define" ;;
esac
+# The EFF_ONLY_OK from <sys/access.h> is present but dysfunctional for
+# [RWX]_OK as of Digital UNIX 4.0[A-D]?. If and when this gets fixed,
+# please adjust this appropriately. See also pp_sys.c just before the
+# emulate_eaccess().
+
+# Fixed in V5.0A.
+case "`/usr/sbin/sizer -v`" in
+*5.0[A-Z]*|*5.[1-9]*|*[6-9].[0-9]*)
+ : ok
+ ;;
+*)
+# V5.0 or previous
+pp_sys_cflags='ccflags="$ccflags -DNO_EFF_ONLY_OK"'
+ ;;
+esac
+
+# The off_t is already 8 bytes, so we do have largefileness.
+
+cat > UU/usethreads.cbu <<'EOCBU'
# This script UU/usethreads.cbu will get 'called-back' by Configure
# after it has prompted the user for whether to use threads.
-cat > UU/usethreads.cbu <<'EOCBU'
case "$usethreads" in
$define|true|[yY]*)
- # Threads interfaces changed with V4.0.
- case "`uname -r`" in
- *[123].*)
- libswanted="$libswanted pthreads mach exc c_r"
- ccflags="-threads $ccflags"
- ;;
- *)
- libswanted="$libswanted pthread exc"
- ccflags="-pthread $ccflags"
+ # Threads interfaces changed with V4.0.
+ case "`$cc -v 2>&1 | grep gcc`" in
+ *gcc*)ccflags="-D_REENTRANT $ccflags" ;;
+ *) case "`uname -r`" in
+ *[123].*) ccflags="-threads $ccflags" ;;
+ *) ccflags="-pthread $ccflags" ;;
+ esac
;;
- esac
+ esac
+ case "`uname -r`" in
+ *[123].*) libswanted="$libswanted pthreads mach exc c_r" ;;
+ *) libswanted="$libswanted pthread exc" ;;
+ esac
- usemymalloc='n'
+ case "$usemymalloc" in
+ '')
+ usemymalloc='n'
+ ;;
+ esac
;;
esac
EOCBU
+cat > UU/uselongdouble.cbu <<'EOCBU'
+# This script UU/uselongdouble.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use long doubles.
+case "$uselongdouble" in
+$define|true|[yY]*) d_Gconvert='sprintf((b),"%.*Lg",(n),(x))' ;;
+esac
+EOCBU
+
#
# Unset temporary variables no more needed.
#
unset _DEC_cc_style
-unset _DEC_uname_r
#
# History:
#
+# perl5.005_51:
+#
+# September-1998 Jarkko Hietaniemi <jhi@iki.fi>
+#
+# * Added the -DNO_EFF_ONLY_OK flag ('use filetest;' support).
+#
# perl5.004_57:
#
# 19-Dec-1997 Spider Boardman <spider@Orb.Nashua.NH.US>
diff --git a/contrib/perl5/hints/dgux.sh b/contrib/perl5/hints/dgux.sh
index 03b285d..9a6f7a4 100644
--- a/contrib/perl5/hints/dgux.sh
+++ b/contrib/perl5/hints/dgux.sh
@@ -14,13 +14,8 @@
# as it would suck to try to get support if the vendor learned that you
# were physically replacing the system binaries.
#
-# Be aware that if you opt to use dynamic loading you'll need to set
-# your $LD_LIBRARY_PATH to include the source directory when you build,
-# test and install the software.
-#
# -Roderick Schertler <roderick@argon.org>
-
# Here are the things from some old DGUX hints files which are different
# from what's in here now. I don't know the exact reasons that most of
# these settings were in the hints files, presumably they can be chalked
diff --git a/contrib/perl5/hints/dos_djgpp.sh b/contrib/perl5/hints/dos_djgpp.sh
index 7c59428..d50bca4 100644
--- a/contrib/perl5/hints/dos_djgpp.sh
+++ b/contrib/perl5/hints/dos_djgpp.sh
@@ -3,6 +3,7 @@
# 971015 - archname changed from 'djgpp' to 'dos-djgpp'
# 971210 - threads support
+# 000222 - added -DPERL_EXTERNAL_GLOB to ccflags
archname='dos-djgpp'
archobjs='djgpp.o'
@@ -27,6 +28,9 @@ lns='cp'
usenm='true'
+# this reportedly causes compile errors in system includes
+i_ieeefp='undef'
+
d_link='undef' # these are empty functions in libc.a
d_symlink='undef'
d_fork='undef'
@@ -39,6 +43,7 @@ case "X$optimize" in
optimize="-O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2"
;;
esac
+ccflags="$ccflags -DPERL_EXTERNAL_GLOB"
ldflags='-s'
usemymalloc='n'
timetype='time_t'
diff --git a/contrib/perl5/hints/dynixptx.sh b/contrib/perl5/hints/dynixptx.sh
index 2edf026..11c6b5b 100644
--- a/contrib/perl5/hints/dynixptx.sh
+++ b/contrib/perl5/hints/dynixptx.sh
@@ -19,10 +19,11 @@ libswanted=`echo $libswanted | sed -e 's/ inet / /'`
# Configure defaults to usenm='y', which doesn't work very well
usenm='n'
-# for performance, apparently this makes a huge difference (~krader)
+# removed d_vfork='define'; we can't use it any more ...
-d_vfork='define'
-optimize='-Wc,-O3 -W0,-xstring'
+case "$optimize" in
+'') optimize='-Wc,-O3 -W0,-xstring' ;;
+esac
# We override d_socket because it's very hard for Configure to get it right
# in Dynix/Ptx, for several reasons.
@@ -49,9 +50,9 @@ case "$osvers" in
d_sockpair='define'
;;
4.2*) # on ptx/TCP 4.2, we can use BSD sockets, but they're not the default.
- cppflags='-Wc,+bsd-socket'
- ccflags='-Wc,+bsd-socket'
- ldflags='-Wc,+bsd-socket'
+ cppflags="$cppflags -Wc,+bsd-socket"
+ ccflags="$ccflags -Wc,+bsd-socket"
+ ldflags="$ldflags -Wc,+bsd-socket"
d_socket='define'
d_oldsock='undef'
d_sockpair='define'
diff --git a/contrib/perl5/hints/epix.sh b/contrib/perl5/hints/epix.sh
index b91537a..dcad3c5 100644
--- a/contrib/perl5/hints/epix.sh
+++ b/contrib/perl5/hints/epix.sh
@@ -43,9 +43,9 @@ d_flock='undef'
# of libswanted excludes some libraries found there. You may want to
# prevent "ucb" from being removed from libswanted and see if perl will
# build on your system.
-ldflags='-non_shared -systype svr4 -L/svr4/usr/lib -L/svr4/usr/lib/cmplrs/cc -L/usr/ccs/lib -L/svr4/usr/ucblib'
-ccflags='-systype svr4 -D__STDC__=0 -I/svr4/usr/include -I/svr4/usr/ucbinclude'
-cppflags='-D__STDC__=0 -I/svr4/usr/include -I/svr4/usr/ucbinclude'
+ldflags="$ldflags -non_shared -systype svr4 -L/svr4/usr/lib -L/svr4/usr/lib/cmplrs/cc -L/usr/ccs/lib -L/svr4/usr/ucblib"
+ccflags="$ccflags -systype svr4 -D__STDC__=0 -I/svr4/usr/include -I/svr4/usr/ucbinclude"
+cppflags="$ccflags -D__STDC__=0 -I/svr4/usr/include -I/svr4/usr/ucbinclude"
# Don't use problematic libraries:
@@ -64,12 +64,3 @@ lddlflags="-G $ldflags" # Probably needed for dynamic loading
# We _do_ want the -L paths in ldflags, but we don't want the -non_shared.
lddlflags=`echo $lddlflags | sed 's/-non_shared//'`
-cat <<'EOM' >&4
-
-If you wish to use dynamic linking, you must use
- LD_LIBRARY_PATH=`pwd`; export LD_LIBRARY_PATH
-or
- setenv LD_LIBRARY_PATH `pwd`
-before running make.
-
-EOM
diff --git a/contrib/perl5/hints/esix4.sh b/contrib/perl5/hints/esix4.sh
index 3d3145d..b1d697c 100644
--- a/contrib/perl5/hints/esix4.sh
+++ b/contrib/perl5/hints/esix4.sh
@@ -3,22 +3,26 @@
# Kevin O'Gorman ( kevin@kosman.UUCP, kevin%kosman.uucp@nrc.com )
#
# Use Configure -Dcc=gcc to use gcc.
+
+# Why can't we just use PATH? It contains /usr/ccs/bin.
case "$cc" in
'') cc='/bin/cc'
test -f $cc || cc='/usr/ccs/bin/cc'
;;
esac
-ldflags='-L/usr/ccs/lib -L/usr/ucblib'
+
+ldflags="$ldflags -L/usr/ccs/lib -L/usr/ucblib"
test -d /usr/local/man || mansrc='none'
-ccflags='-I/usr/include -I/usr/ucbinclude'
+# Do we really need to tell cc to look in /usr/include?
+ccflags="$ccflags -I/usr/include -I/usr/ucbinclude"
libswanted=`echo " $libswanted " | sed -e 's/ malloc / /' `
d_index='undef'
d_suidsafe=define
usevfork='false'
if test "$osvers" = "3.0"; then
d_gconvert='undef'
- grep 'define[ ]*AF_OSI[ ]' /usr/include/sys/socket.h | grep '/\*[^*]*$' >/tmp/esix$$
- if test -s /tmp/esix$$; then
+ grep 'define[ ]*AF_OSI[ ]' /usr/include/sys/socket.h | grep '/\*[^*]*$' >esix$$
+ if test -s esix$$; then
cat <<EOM >&2
WARNING: You are likely to have problems compiling the Socket extension
@@ -27,15 +31,6 @@ unless you fix the unterminated comment for AF_OSI in the file
EOM
fi
- rm -f /tmp/esix$$
+ rm -f esix$$
fi
-cat <<'EOM' >&4
-
-If you wish to use dynamic linking, you must use
- LD_LIBRARY_PATH=`pwd`; export LD_LIBRARY_PATH
-or
- setenv LD_LIBRARY_PATH `pwd`
-before running make.
-
-EOM
diff --git a/contrib/perl5/hints/freebsd.sh b/contrib/perl5/hints/freebsd.sh
index 66f6ca0..fd60ba3 100644
--- a/contrib/perl5/hints/freebsd.sh
+++ b/contrib/perl5/hints/freebsd.sh
@@ -99,7 +99,11 @@ esac
case "$osvers" in
0.*|1.0*) ;;
-3.*|4.0*)
+1*|2*) cccdlflags='-DPIC -fpic'
+ lddlflags="-Bshareable $lddlflags"
+ ;;
+
+*)
objformat=`/usr/bin/objformat`
if [ x$objformat = xelf ]; then
libpth="/usr/lib /usr/local/lib"
@@ -108,17 +112,23 @@ case "$osvers" in
lddlflags="-shared "
else
if [ -e /usr/lib/aout ]; then
- libpth="/usr/lib/aout /usr/local/lib /usr/lib"
- glibpth="/usr/lib/aout /usr/local/lib /usr/lib"
- fi
- lddlflags='-Bshareable'
+ libpth="/usr/lib/aout /usr/local/lib /usr/lib"
+ glibpth="/usr/lib/aout /usr/local/lib /usr/lib"
+ fi
+ lddlflags='-Bshareable'
fi
cccdlflags='-DPIC -fpic'
;;
+esac
-*) cccdlflags='-DPIC -fpic'
- lddlflags="-Bshareable $lddlflags"
- ;;
+case "$osvers" in
+0*|1*|2*|3*) ;;
+
+*)
+ if /usr/bin/file -L /usr/lib/libc.so | /usr/bin/grep -vq "not stripped" ; then
+ usenm=false
+ fi
+ ;;
esac
cat <<'EOM' >&4
@@ -147,8 +157,8 @@ case "$osvers" in
# the equivalent in the main Configure so we copy a little
# from Configure XXX Configure should be fixed.
if $test -r $src/patchlevel.h;then
- patchlevel=`awk '/define[ ]+PATCHLEVEL/ {print $3}' $src/patchlevel.h`
- subversion=`awk '/define[ ]+SUBVERSION/ {print $3}' $src/patchlevel.h`
+ patchlevel=`awk '/define[ ]+PERL_VERSION/ {print $3}' $src/patchlevel.h`
+ subversion=`awk '/define[ ]+PERL_SUBVERSION/ {print $3}' $src/patchlevel.h`
else
patchlevel=0
subversion=0
@@ -164,22 +174,17 @@ esac
cat > UU/usethreads.cbu <<'EOCBU'
case "$usethreads" in
$define|true|[yY]*)
- lc_r=`/sbin/ldconfig -r|grep ':-lc_r'|awk '{print $NF}'`
+ lc_r=`/sbin/ldconfig -r|grep ':-lc_r'|awk '{print $NF}'|tail -1`
case "$osvers" in
- 2.2.8*|3.*|4.*)
- if [ ! -r "$lc_r" ]; then
- cat <<EOM >&4
-POSIX threads should be supported by FreeBSD $osvers --
-but your system is missing the shared libc_r.
-(/sbin/ldconfig -r doesn't find any).
+ 0*|1*|2.0*|2.1*) cat <<EOM >&4
+I did not know that FreeBSD $osvers supports POSIX threads.
-Consider using the latest STABLE release.
+Feel free to tell perlbug@perl.com otherwise.
EOM
- exit 1
- fi
- ldflags="-pthread $ldflags"
+ exit 1
;;
- 2.2*)
+
+ 2.2.[0-7]*)
cat <<EOM >&4
POSIX threads are not supported well by FreeBSD $osvers.
@@ -192,13 +197,21 @@ or preferably to 3.something.
EOM
exit 1
;;
- *) cat <<EOM >&4
-I did not know that FreeBSD $osvers supports POSIX threads.
-Feel free to tell perlbug@perl.com otherwise.
+ *)
+ if [ ! -r "$lc_r" ]; then
+ cat <<EOM >&4
+POSIX threads should be supported by FreeBSD $osvers --
+but your system is missing the shared libc_r.
+(/sbin/ldconfig -r doesn't find any).
+
+Consider using the latest STABLE release.
EOM
- exit 1
+ exit 1
+ fi
+ ldflags="-pthread $ldflags"
;;
+
esac
set `echo X "$libswanted "| sed -e 's/ c / c_r /'`
diff --git a/contrib/perl5/hints/hpux.sh b/contrib/perl5/hints/hpux.sh
index 8a9e3cb..ce15f55 100644
--- a/contrib/perl5/hints/hpux.sh
+++ b/contrib/perl5/hints/hpux.sh
@@ -21,8 +21,10 @@
# Don't assume every OS != 10 is < 10, (e.g., 11).
# From: Chuck Phillips <cdp@fc.hp.com>
# HP-UX 10 pthreads hints: Matthew T Harden <mthard@mthard1.monsanto.com>
+# From: Dominic Dunlop <domo@computer.org>
+# Abort and offer advice if bundled (non-ANSI) C compiler selected
-# This version: August 15, 1997
+# This version: March 8, 2000
# Current maintainer: Jeff Okamoto <okamoto@corp.hp.com>
#--------------------------------------------------------------------
@@ -64,21 +66,19 @@
ccflags="$ccflags -D_HPUX_SOURCE"
# Check if you're using the bundled C compiler. This compiler doesn't support
-# ANSI C (the -Aa flag) nor can it produce shared libraries. Thus we have
-# to turn off dynamic loading.
+# ANSI C (the -Aa flag) and so is not suitable for perl 5.5 and later.
case "$cc" in
'') if cc $ccflags -Aa 2>&1 | $contains 'option' >/dev/null
then
- case "$usedl" in
- '') usedl="$undef"
cat <<'EOM' >&4
-The bundled C compiler can not produce shared libraries, so you will
-not be able to use dynamic loading.
+The bundled C compiler is not ANSI-compliant, and so cannot be used to
+build perl. Please see the file README.hpux for advice on alternative
+compilers.
+Cannot continue, aborting.
EOM
- ;;
- esac
+ exit 1
else
ccflags="$ccflags -Aa" # The add-on compiler supports ANSI C
# cppstdin and cpprun need the -Aa option if you use the unbundled
@@ -92,19 +92,22 @@ EOM
cppminus='-'
cpplast='-'
fi
- # For HP's ANSI C compiler, up to "+O3" is safe for everything
- # except shared libraries (PIC code). Max safe for PIC is "+O2".
- # Setting both causes innocuous warnings.
- #optimize='+O3'
- #cccdlflags='+z +O2'
- optimize='-O'
+ case "$optimize" in
+ # For HP's ANSI C compiler, up to "+O3" is safe for everything
+ # except shared libraries (PIC code). Max safe for PIC is "+O2".
+ # Setting both causes innocuous warnings.
+ '') optimize='-O'
+ #optimize='+O3'
+ #cccdlflags='+z +O2'
+ ;;
+ esac
+ cc=cc
;;
esac
-# Even if you use gcc, prefer the HP math library over the GNU one.
-
-case "`$cc -v 2>&1`" in
-"*gcc*" ) test -d /lib/pa1.1 && ccflags="$ccflags -L/lib/pa1.1" ;;
+case `$cc -v 2>&1`"" in
+*gcc*) ccisgcc="$define" ;;
+*) ccisgcc='' ;;
esac
# Determine the architecture type of this system.
@@ -139,60 +142,78 @@ else
selecttype='int *'
fi
-# This script UU/usethreads.cbu will get 'called-back' by Configure
-# after it has prompted the user for whether to use threads.
-cat > UU/usethreads.cbu <<'EOCBU'
-case "$usethreads" in
+# Do this right now instead of the delayed callback unit approach.
+case "$use64bitall" in
+$define|true|[yY]*) use64bitint="$define" ;;
+esac
+case "$use64bitint" in
$define|true|[yY]*)
- if [ "$xxOsRevMajor" -lt 10 ]; then
- cat <<EOM >&4
-HP-UX $xxOsRevMajor cannot support POSIX threads.
-Consider upgrading to at least HP-UX 11.
+ if [ "$xxOsRevMajor" -lt 11 ]; then
+ cat <<EOM >&4
+
+64-bit compilation is not supported on HP-UX $xxOsRevMajor.
+You need at least HP-UX 11.0.
Cannot continue, aborting.
+
EOM
- exit 1
- fi
- case "$xxOsRevMajor" in
- 10)
- # Under 10.X, a threaded perl can be built, but it needs
- # libcma and OLD_PTHREADS_API. Also <pthread.h> needs to
- # be #included before any other includes (in perl.h)
- if [ ! -f /usr/include/pthread.h -o ! -f /usr/lib/libcma.sl ]; then
- cat <<EOM >&4
-In HP-UX 10.X for POSIX threads you need both of the files
-/usr/include/pthread.h and /usr/lib/libcma.sl.
-Either you must install the CMA package or you must upgrade to HP-UX 11.
-Cannot continue, aborting.
+ exit 1
+ fi
+
+ # Without the 64-bit libc we cannot do much.
+ libc='/lib/pa20_64/libc.sl'
+ if [ ! -f "$libc" ]; then
+ cat <<EOM >&4
+
+*** You do not seem to have the 64-bit libraries in /lib/pa20_64.
+*** Most importantly, I cannot find the $libc.
+*** Cannot continue, aborting.
+
EOM
- exit 1
- fi
+ exit 1
+ fi
- # HP-UX 10.X uses the old pthreads API
- case "$d_oldpthreads" in
- '') d_oldpthreads="$define" ;;
- esac
+ ccflags="$ccflags +DD64"
+ ldflags="$ldflags +DD64"
+ test -d /lib/pa20_64 && loclibpth="$loclibpth /lib/pa20_64"
+ libscheck='case "`/usr/bin/file $xxx`" in
+*LP64*|*PA-RISC2.0*) ;;
+*) xxx=/no/64-bit$xxx ;;
+esac'
+ if test -n "$ccisgcc" -o -n "$gccversion"; then
+ ld="$cc"
+ else
+ ld=/usr/bin/ld
+ fi
+ ar=/usr/bin/ar
+ full_ar=$ar
- # include libcma before all the others
- libswanted="cma $libswanted"
+ if test -z "$ccisgcc" -a -z "$gccversion"; then
+ # The strict ANSI mode (-Aa) doesn't like the LL suffixes.
+ ccflags=`echo " $ccflags "|sed 's@ -Aa @ @g'`
+ case "$ccflags" in
+ *-Ae*) ;;
+ *) ccflags="$ccflags -Ae" ;;
+ esac
+ fi
- # tell perl.h to include <pthread.h> before other include files
- ccflags="$ccflags -DPTHREAD_H_FIRST"
+ set `echo " $libswanted " | sed -e 's@ dl @ @'`
+ libswanted="$*"
- # CMA redefines select to cma_select, and cma_select expects int *
- # instead of fd_set * (just like 9.X)
- selecttype='int *'
- ;;
- 11 | 12) # 12 may want upping the _POSIX_C_SOURCE datestamp...
- ccflags=" -D_POSIX_C_SOURCE=199506L $ccflags"
- set `echo X "$libswanted "| sed -e 's/ c / pthread c /'`
- shift
- libswanted="$*"
- ;;
- esac
- usemymalloc='n'
- ;;
+ ;;
+esac
+
+case "$ccisgcc" in
+# Even if you use gcc, prefer the HP math library over the GNU one.
+"$define") test -d /lib/pa1.1 && ccflags="$ccflags -L/lib/pa1.1" ;;
+esac
+
+case "$ccisgcc" in
+"$define") ;;
+*) case "`getconf KERNEL_BITS 2>/dev/null`" in
+ *64*) ldflags="$ldflags -Wl,+vnocompatwarnings" ;;
+ esac
+ ;;
esac
-EOCBU
# Remove bad libraries that will cause problems
# (This doesn't remove libraries that don't actually exist)
@@ -219,7 +240,10 @@ libswanted="$*"
# ccdlflags="-Wl,-E -Wl,-B,immediate,-B,nonfatal $ccdlflags"
ccdlflags="-Wl,-E -Wl,-B,deferred $ccdlflags"
-usemymalloc='y'
+case "$usemymalloc" in
+'') usemymalloc='y' ;;
+esac
+
alignbytes=8
# For native nm, you need "-p" to produce BSD format output.
nm_opt='-p'
@@ -241,6 +265,47 @@ case "$d_dosuid" in
'') d_dosuid="$undef" ;;
esac
+# HP-UX 11 groks also LD_LIBRARY_PATH but SHLIB_PATH
+# is recommended for compatibility.
+case "$ldlibpthname" in
+'') ldlibpthname=SHLIB_PATH ;;
+esac
+
+# HP-UX 10.20 and gcc 2.8.1 break UINT32_MAX.
+case "$ccisgcc" in
+"$define") ccflags="$ccflags -DUINT32_MAX_BROKEN" ;;
+esac
+
+cat > UU/cc.cbu <<'EOSH'
+# XXX This script UU/cc.cbu will get 'called-back' by Configure after it
+# XXX has prompted the user for the C compiler to use.
+# Get gcc to share its secrets.
+echo 'main() { return 0; }' > try.c
+ # Indent to avoid propagation to config.sh
+ verbose=`${cc:-cc} -v -o try try.c 2>&1`
+if echo "$verbose" | grep '^Reading specs from' >/dev/null 2>&1; then
+ # Using gcc.
+ : nothing to see here, move on.
+else
+ # Using cc.
+ ar=${ar:-ar}
+ case "`$ar -V 2>&1`" in
+ *GNU*)
+ if test -x /usr/bin/ar; then
+ cat <<END >&2
+
+*** You are using HP cc(1) but GNU ar(1). This might lead into trouble
+*** later on, I'm switching to HP ar to play safe.
+
+END
+ ar=/usr/bin/ar
+ fi
+ ;;
+ esac
+fi
+
+EOSH
+
# Date: Fri, 6 Sep 96 23:15:31 CDT
# From: "Daniel S. Lewart" <d-lewart@uiuc.edu>
# I looked through the gcc.info and found this:
@@ -248,3 +313,96 @@ esac
# assembler of the form:
# (warning) Use of GR3 when frame >= 8192 may cause conflict.
# These warnings are harmless and can be safely ignored.
+
+cat > UU/usethreads.cbu <<'EOCBU'
+# This script UU/usethreads.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use threads.
+case "$usethreads" in
+$define|true|[yY]*)
+ if [ "$xxOsRevMajor" -lt 10 ]; then
+ cat <<EOM >&4
+HP-UX $xxOsRevMajor cannot support POSIX threads.
+Consider upgrading to at least HP-UX 11.
+Cannot continue, aborting.
+EOM
+ exit 1
+ fi
+ case "$xxOsRevMajor" in
+ 10)
+ # Under 10.X, a threaded perl can be built, but it needs
+ # libcma and OLD_PTHREADS_API. Also <pthread.h> needs to
+ # be #included before any other includes (in perl.h)
+ if [ ! -f /usr/include/pthread.h -o ! -f /usr/lib/libcma.sl ]; then
+ cat <<EOM >&4
+In HP-UX 10.X for POSIX threads you need both of the files
+/usr/include/pthread.h and /usr/lib/libcma.sl.
+Either you must install the CMA package or you must upgrade to HP-UX 11.
+Cannot continue, aborting.
+EOM
+ exit 1
+ fi
+
+ # HP-UX 10.X uses the old pthreads API
+ case "$d_oldpthreads" in
+ '') d_oldpthreads="$define" ;;
+ esac
+
+ # include libcma before all the others
+ libswanted="cma $libswanted"
+
+ # tell perl.h to include <pthread.h> before other include files
+ ccflags="$ccflags -DPTHREAD_H_FIRST"
+
+ # CMA redefines select to cma_select, and cma_select expects int *
+ # instead of fd_set * (just like 9.X)
+ selecttype='int *'
+ ;;
+ 11 | 12) # 12 may want upping the _POSIX_C_SOURCE datestamp...
+ ccflags=" -D_POSIX_C_SOURCE=199506L $ccflags"
+ set `echo X "$libswanted "| sed -e 's/ c / pthread c /'`
+ shift
+ libswanted="$*"
+ ;;
+ esac
+ usemymalloc='n'
+ ;;
+esac
+EOCBU
+
+case "$uselargefiles-$ccisgcc" in
+"$define-$define"|'-define')
+ cat <<EOM >&4
+
+*** I'm ignoring large files for this build because
+*** I don't know how to do use large files in HP-UX using gcc.
+
+EOM
+ uselargefiles="$undef"
+ ;;
+esac
+
+cat > UU/uselargefiles.cbu <<'EOCBU'
+# This script UU/uselargefiles.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use large files.
+case "$uselargefiles" in
+''|$define|true|[yY]*)
+ # there are largefile flags available via getconf(1)
+ # but we cheat for now.
+ ccflags="$ccflags -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
+
+ if test -z "$ccisgcc" -a -z "$gccversion"; then
+ # The strict ANSI mode (-Aa) doesn't like large files.
+ ccflags=`echo " $ccflags "|sed 's@ -Aa @ @g'`
+ case "$ccflags" in
+ *-Ae*) ;;
+ *) ccflags="$ccflags -Ae" ;;
+ esac
+ fi
+
+ ;;
+esac
+EOCBU
+
+# keep that leading tab.
+ ccisgcc=''
+
diff --git a/contrib/perl5/hints/irix_4.sh b/contrib/perl5/hints/irix_4.sh
index 8013c8a..5c5bdb2 100644
--- a/contrib/perl5/hints/irix_4.sh
+++ b/contrib/perl5/hints/irix_4.sh
@@ -33,3 +33,13 @@ EOM
;;
esac
+case " $use64bits $use64bitint $use64bitall " in
+*" $define "*|*" true "*|*" [yY] "*)
+ cat >&4 <<EOM
+IRIX `uname -r` does not support 64-bit types.
+You should upgrade to at least IRIX 6.2.
+Cannot continue, aborting.
+EOM
+ exit 1
+esac
+
diff --git a/contrib/perl5/hints/irix_5.sh b/contrib/perl5/hints/irix_5.sh
index 757ffff..f895bcc 100644
--- a/contrib/perl5/hints/irix_5.sh
+++ b/contrib/perl5/hints/irix_5.sh
@@ -43,3 +43,13 @@ EOM
;;
esac
+case " $use64bits $use64bitint $use64bitall " in
+*" $define "*|*" true "*|*" [yY] "*)
+ cat >&4 <<EOM
+IRIX `uname -r` does not support 64-bit types.
+You should upgrade to at least IRIX 6.2.
+Cannot continue, aborting.
+EOM
+ exit 1
+esac
+
diff --git a/contrib/perl5/hints/irix_6.sh b/contrib/perl5/hints/irix_6.sh
index 3250fc7..9d9852d 100644
--- a/contrib/perl5/hints/irix_6.sh
+++ b/contrib/perl5/hints/irix_6.sh
@@ -25,6 +25,8 @@
# gcc-enabled by Kurt Starsinic <kstar@isinet.com> on 3/24/1998
+# 64-bitty by Jarkko Hietaniemi on 9/1998
+
# Use sh Configure -Dcc='cc -n32' to try compiling with -n32.
# or -Dcc='cc -n32 -mips3' (or -mips4) to force (non)portability
# Don't bother with -n32 unless you have the 7.1 or later compilers.
@@ -33,11 +35,41 @@
# Let's assume we want to use 'cc -n32' by default, unless the
# necessary libm is missing (which has happened at least twice)
case "$cc" in
-'')
- if test -f /usr/lib32/libm.so
- then
- cc='cc -n32'
- fi ;;
+'') case "$use64bitall" in
+ "$define"|true|[yY]*) test -f /usr/lib64/libm.so && cc='cc -64' ;;
+ *) test -f /usr/lib32/libm.so && cc='cc -n32' ;;
+ esac
+esac
+test -z "$cc" && cc=cc
+
+case "$use64bitint" in
+$define|true|[yY]*)
+ case "`uname -r`" in
+ [1-5]*|6.[01])
+ cat >&4 <<EOM
+IRIX `uname -r` does not support 64-bit types.
+You should upgrade to at least IRIX 6.2.
+Cannot continue, aborting.
+EOM
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+case "$use64bitall" in
+"$define"|true|[yY]*)
+ case "`uname -s`" in
+ IRIX)
+ cat >&4 <<EOM
+You cannot use -Duse64bitall in 32-bit IRIX, sorry.
+
+Cannot continue, aborting.
+EOM
+ exit 1
+ ;;
+ esac
+ ;;
esac
# Check for which compiler we're using
@@ -45,6 +77,86 @@ esac
case "$cc" in
*"cc -n32"*)
+ libscheck='case "`/usr/bin/file $xxx`" in
+*N32*) ;;
+*) xxx=/no/n32$xxx ;;
+esac'
+
+ # NOTE: -L/usr/lib32 -L/lib32 are automatically selected by the linker
+ ldflags=' -L/usr/local/lib32 -L/usr/local/lib'
+ cccdlflags=' '
+ # From: David Billinghurst <David.Billinghurst@riotinto.com.au>
+ # If you get complaints about so_locations then change the following
+ # line to something like:
+ # lddlflags="-n32 -shared -check_registry /usr/lib32/so_locations"
+ lddlflags="-n32 -shared"
+ libc='/usr/lib32/libc.so'
+ plibpth='/usr/lib32 /lib32 /usr/ccs/lib'
+ ;;
+*"cc -64")
+
+ loclibpth="$loclibpth /usr/lib64"
+ libscheck='case "`/usr/bin/file $xxx`" in
+*64-bit*) ;;
+*) xxx=/no/64-bit$xxx ;;
+esac'
+ # NOTE: -L/usr/lib64 -L/lib64 are automatically selected by the linker
+ ldflags=' -L/usr/local/lib64 -L/usr/local/lib'
+ cccdlflags=' '
+ # From: David Billinghurst <David.Billinghurst@riotinto.com.au>
+ # If you get complaints about so_locations then change the following
+ # line to something like:
+ # lddlflags="-64 -shared -check_registry /usr/lib64/so_locations"
+ lddlflags="-64 -shared"
+ libc='/usr/lib64/libc.so'
+ plibpth='/usr/lib64 /lib64 /usr/ccs/lib'
+ ;;
+*gcc*)
+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -D_POSIX_C_SOURCE"
+ optimize="-O3"
+ usenm='undef'
+ case "`uname -s`" in
+ # Without the -mabi=64 gcc in 64-bit IRIX has problems passing
+ # and returning small structures. This affects inet_*() and semctl().
+ # See http://reality.sgi.com/ariel/freeware/gcc-2.8.1-notes.html
+ # for more information. Reported by Lionel Cons <lionel.cons@cern.ch>.
+ IRIX64) ccflags="$ccflags -mabi=64"
+ ldflags="$ldflags -mabi=64 -L/usr/lib64"
+ lddlflags="$lddlflags -mabi=64"
+ ;;
+ *) ccflags="$ccflags -DIRIX32_SEMUN_BROKEN_BY_GCC"
+ ;;
+ esac
+ ;;
+*)
+ # this is needed to force the old-32 paths
+ # since the system default can be changed.
+ ccflags="$ccflags -32 -D_BSD_TYPES -D_BSD_TIME -Olimit 3100"
+ optimize='-O'
+ ;;
+esac
+
+# Settings common to both native compiler modes.
+case "$cc" in
+*"cc -n32"|*"cc -64")
+ ld=$cc
+
+ # perl's malloc can return improperly aligned buffer
+ # which (under 5.6.0RC1) leads into really bizarre bus errors
+ # and freak test failures (lib/safe1 #18, for example),
+ # even more so with -Duse64bitall: for example lib/io_linenumtb.
+ # fails under the harness but succeeds when run separately,
+ # under make test pragma/warnings #98 fails, and lib/io_dir
+ # apparently coredumps (the last two don't happen under
+ # the harness. Helmut Jarausch is seeing bus errors from
+ # miniperl, as was Scott Henry with snapshots from just before
+ # the RC1. --jhi
+ usemymalloc='undef'
+#malloc_cflags='ccflags="-DSTRICT_ALIGNMENT $ccflags"'
+
+ nm_opt='-p'
+ nm_so_opt='-p'
+
# Perl 5.004_57 introduced new qsort code into pp_ctl.c that
# makes IRIX cc prior to 7.2.1 to emit bad code.
# so some serious hackery follows to set pp_ctl flags correctly.
@@ -52,11 +164,11 @@ case "$cc" in
# Check for which version of the compiler we're running
case "`$cc -version 2>&1`" in
*7.0*) # Mongoose 7.0
- ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1042,1048,1110,1116,1184 -OPT:Olimit=0"
+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1042,1048,1110,1116,1174,1184,1552 -OPT:Olimit=0"
optimize='none'
;;
*7.1*|*7.2|*7.20) # Mongoose 7.1+
- ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0"
+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1174,1184,1552 -OPT:Olimit=0"
optimize='-O3'
# This is a temporary fix for 5.005.
# Leave pp_ctl_cflags line at left margin for Configure. See
@@ -65,15 +177,15 @@ case "$cc" in
pp_ctl_cflags='optimize=-O'
;;
*7.*) # Mongoose 7.2.1+
- ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0:space=ON"
+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1174,1184,1552 -OPT:Olimit=0:space=ON"
optimize='-O3'
;;
*6.2*) # Ragnarok 6.2
- ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184"
+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1174,1184,1552"
optimize='none'
;;
*) # Be safe and not optimize
- ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1184 -OPT:Olimit=0"
+ ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff 1009,1110,1174,1184,1552 -OPT:Olimit=0"
optimize='none'
;;
esac
@@ -89,45 +201,25 @@ pp_ctl_cflags='optimize=-O'
# absolute paths (again, see the pthread.h change below).
# -- krishna@sgi.com, 8/23/98
-if [ "X${TOOLROOT}" != "X" ]; then
-# we cant set cppflags because it gets overwritten
-# we dont actually need $TOOLROOT/usr/include on the cc line cuz the
-# modules functionality already includes it but
-# XXX - how do I change cppflags in the hints file?
- ccflags="$ccflags -I${TOOLROOT}/usr/include"
+ if [ "X${TOOLROOT}" != "X" ]; then
+ # we cant set cppflags because it gets overwritten
+ # we dont actually need $TOOLROOT/usr/include on the cc line cuz the
+ # modules functionality already includes it but
+ # XXX - how do I change cppflags in the hints file?
+ ccflags="$ccflags -I${TOOLROOT}/usr/include"
usrinc="${TOOLROOT}/usr/include"
-fi
+ fi
- ld=$cc
- # perl's malloc can return improperly aligned buffer
- # usemymalloc='undef'
-malloc_cflags='ccflags="-DSTRICT_ALIGNMENT $ccflags"'
- # NOTE: -L/usr/lib32 -L/lib32 are automatically selected by the linker
- ldflags=' -L/usr/local/lib32 -L/usr/local/lib'
- cccdlflags=' '
- # From: David Billinghurst <David.Billinghurst@riotinto.com.au>
- # If you get complaints about so_locations then change the following
- # line to something like:
- # lddlflags="-n32 -shared -check_registry /usr/lib32/so_locations"
- lddlflags="-n32 -shared"
- libc='/usr/lib32/libc.so'
- plibpth='/usr/lib32 /lib32 /usr/ccs/lib'
- nm_opt='-p'
- nm_so_opt='-p'
- ;;
-*gcc*)
- ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -D_POSIX_C_SOURCE"
- optimize="-O3"
- usenm='undef'
- ;;
-*)
- # this is needed to force the old-32 paths
- # since the system default can be changed.
- ccflags="$ccflags -32 -D_BSD_TYPES -D_BSD_TIME -Olimit 3100"
- optimize='-O'
;;
esac
+# Don't groan about unused libraries.
+ldflags="$ldflags -Wl,-woff,84"
+
+case "`$cc -version 2>&1`" in
+*7.2.*) op_cflags='optimize=-O1' ;; # workaround for an optimizer bug
+esac
+
# We don't want these libraries.
# Socket networking is in libc, these are not installed by default,
# and just slow perl down. (scotth@sgi.com)
@@ -135,6 +227,11 @@ set `echo X "$libswanted "|sed -e 's/ socket / /' -e 's/ nsl / /' -e 's/ dl / /'
shift
libswanted="$*"
+# Irix 6.5.6 seems to have a broken header <sys/mode.h>
+# don't include that (it doesn't contain S_IFMT, S_IFREG, et al)
+
+i_sysmode="$undef"
+
# I have conflicting reports about the sun, crypt, bsd, and PW
# libraries on Irix 6.2.
#
@@ -159,9 +256,9 @@ set `echo X "$libswanted "|sed -e 's/ sun / /' -e 's/ crypt / /' -e 's/ bsd / /'
shift
libswanted="$*"
+cat > UU/usethreads.cbu <<'EOCBU'
# This script UU/usethreads.cbu will get 'called-back' by Configure
# after it has prompted the user for whether to use threads.
-cat > UU/usethreads.cbu <<'EOCBU'
case "$usethreads" in
$define|true|[yY]*)
if test ! -f ${TOOLROOT}/usr/include/pthread.h -o ! -f /usr/lib/libpthread.so; then
@@ -209,3 +306,5 @@ EOM
esac
EOCBU
+# The -n32 makes off_t to be 8 bytes, so we should have largefileness.
+
diff --git a/contrib/perl5/hints/irix_6_0.sh b/contrib/perl5/hints/irix_6_0.sh
index e61db04..50498af 100644
--- a/contrib/perl5/hints/irix_6_0.sh
+++ b/contrib/perl5/hints/irix_6_0.sh
@@ -52,3 +52,13 @@ EOM
;;
esac
+case " $use64bits $use64bitint $use64bitall " in
+*" $define "*|*" true "*|*" [yY] "*)
+ cat >&4 <<EOM
+IRIX `uname -r` does not support 64-bit types.
+You should upgrade to at least IRIX 6.2.
+Cannot continue, aborting.
+EOM
+ exit 1
+esac
+
diff --git a/contrib/perl5/hints/irix_6_1.sh b/contrib/perl5/hints/irix_6_1.sh
index e61db04..50498af 100644
--- a/contrib/perl5/hints/irix_6_1.sh
+++ b/contrib/perl5/hints/irix_6_1.sh
@@ -52,3 +52,13 @@ EOM
;;
esac
+case " $use64bits $use64bitint $use64bitall " in
+*" $define "*|*" true "*|*" [yY] "*)
+ cat >&4 <<EOM
+IRIX `uname -r` does not support 64-bit types.
+You should upgrade to at least IRIX 6.2.
+Cannot continue, aborting.
+EOM
+ exit 1
+esac
+
diff --git a/contrib/perl5/hints/linux.sh b/contrib/perl5/hints/linux.sh
index 4764e9e..4fb2f89 100644
--- a/contrib/perl5/hints/linux.sh
+++ b/contrib/perl5/hints/linux.sh
@@ -43,12 +43,30 @@ ignore_versioned_solibs='y'
# available via anonymous FTP at tsx-11.mit.edu in
# /pub/linux/docs/linux-standards/fsstnd.
# Allow a command line override, e.g. Configure -Dprefix=/foo/bar
-case "$prefix" in
-'') prefix='/usr' ;;
-esac
-
-# gcc-2.6.3 defines _G_HAVE_BOOL to 1, but doesn't actually supply bool.
-ccflags="-Dbool=char -DHAS_BOOL $ccflags"
+#
+# Addendum for 5.005_57 and beyond:
+#
+# However, most Linux users probably already have a /usr/bin/perl.
+# We can't know whether the current user is intending to *replace*
+# that /usr/bin/perl or whether the user is intending to install
+# a *different* installation.
+#
+# Here is what we used to do:
+# Allow a command line override, e.g. Configure -Dprefix=/foo/bar
+# case "$prefix" in
+# '') prefix='/usr' ;;
+# esac
+#
+# For now, let's assume that most Linux users get their /usr/bin/perl
+# from some packaging system, so that those compiling from source are
+# probably the more experimental folks and hence probably aren't
+# intending to replace /usr/bin/perl (at least just yet).
+# This change makes linux consistent with most other unix platforms
+# in having a default of prefix=/usr/local.
+# These notes can probably safely be removed in 5.005_50 and beyond.
+#
+# 9 April 1999 Andy Dougherty <doughera@lafayette.edu>
+#
# BSD compatability library no longer needed
# 'kaffe' has a /usr/lib/libnet.so which is not at all relevent for perl.
@@ -56,6 +74,19 @@ set `echo X "$libswanted "| sed -e 's/ bsd / /' -e 's/ net / /'`
shift
libswanted="$*"
+# If you have glibc, then report the version for ./myconfig bug reporting.
+# (Configure doesn't need to know the specific version since it just uses
+# gcc to load the library for all tests.)
+# Is this sufficiently robust for libc5 systems as well as
+# glibc-2.1.x systems?
+# We don't use __GLIBC__ and __GLIBC_MINOR__ because they
+# are insufficiently precise to distinguish things like
+# libc-2.0.6 and libc-2.0.7.
+if test -L /lib/libc.so.6; then
+ libc=`ls -l /lib/libc.so.6 | awk '{print $NF}'`
+ libc=/lib/$libc
+fi
+
# Configure may fail to find lstat() since it's a static/inline
# function in <sys/stat.h>.
d_lstat=define
@@ -224,6 +255,15 @@ fi
#'osfmach3ppc') ccdlflags='-Wl,-E' ;;
#esac
+case "`uname -r`" in
+sparc-linux)
+ case "$cccdlflags" in
+ *-fpic*) cccdlflags="`echo $cccdlflags|sed 's/-fpic/-fPIC/'`" ;;
+ *) cccdlflags="$cccdlflags -fPIC" ;;
+ esac
+ ;;
+esac
+
# This script UU/usethreads.cbu will get 'called-back' by Configure
# after it has prompted the user for whether to use threads.
cat > UU/usethreads.cbu <<'EOCBU'
@@ -236,3 +276,13 @@ $define|true|[yY]*)
;;
esac
EOCBU
+
+cat > UU/uselargefiles.cbu <<'EOCBU'
+# This script UU/uselargefiles.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use large files.
+case "$uselargefiles" in
+''|$define|true|[yY]*)
+ ccflags="$ccflags -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
+ ;;
+esac
+EOCBU
diff --git a/contrib/perl5/hints/lynxos.sh b/contrib/perl5/hints/lynxos.sh
index ddffcbe..0023e83 100644
--- a/contrib/perl5/hints/lynxos.sh
+++ b/contrib/perl5/hints/lynxos.sh
@@ -4,8 +4,16 @@
# These hints were submitted by:
# Greg Seibert
# seibert@Lynx.COM
+# and
+# Ed Mooring
+# mooring@lynx.com
#
cc='gcc'
so='none'
usemymalloc='n'
+d_union_semun='define'
+ccflags="$ccflags -DEXTRA_F_IN_SEMUN_BUF -D__NO_INCLUDE_WARN__"
+
+# When LynxOS runs a script with "#!" it sets argv[0] to the script name
+toke_cflags='ccflags="$ccflags -DARG_ZERO_IS_SCRIPT"'
diff --git a/contrib/perl5/hints/machten.sh b/contrib/perl5/hints/machten.sh
index f283873..b4409c1 100644
--- a/contrib/perl5/hints/machten.sh
+++ b/contrib/perl5/hints/machten.sh
@@ -1,18 +1,26 @@
+#! /bin/bash
# machten.sh
-# This is for MachTen 4.0.3. It might work on other versions and variants too.
+# This is for MachTen 4.1.4. It might work on other versions and variants
+# too. If it doesn't, tell me, and I'll try to fix it -- domo@computer.org
#
# Users of earlier MachTen versions might need a fixed tr from ftp.tenon.com.
# This should be described in the MachTen release notes.
#
# MachTen 2.x has its own hint file.
#
-# This file has been put together by Andy Dougherty
+# The original version of this file was put together by Andy Dougherty
# <doughera@lafcol.lafayette.edu> based on comments from lots of
# folks, especially
# Mark Pease <peasem@primenet.com>
# Martijn Koster <m.koster@webcrawler.com>
# Richard Yeh <rcyeh@cco.caltech.edu>
#
+# Remove dynamic loading libraries from search; enable SysV IPC with
+# MachTen 4.1.4 and above; define SYSTEM_ALIGN_BYTES for old MT versions
+# -- Dominic Dunlop <domo@computer.org> 000224
+# Disable shadow password file access: MT 4.1.1 has necessary library
+# functions, but not header file (or documentation)
+# -- Dominic Dunlop <domo@computer.org> 990804
# For now, explicitly disable dynamic loading -- MT 4.1.1 has it,
# but these hints do not yet support it.
# Define NOTEDEF_MACHTEN to undo gratuitous Tenon hack to signal.h.
@@ -36,6 +44,13 @@
#
# Comments, questions, and improvements welcome!
#
+# MachTen 4.1.1's support for shadow password file access is incomplete:
+# disable its use completely.
+d_endspent=${d_endspent:-undef}
+d_getspent=${d_getspent:-undef}
+d_getspnam=${d_getspnam:-undef}
+d_setspent=${d_setspent:-undef}
+
# MachTen 4.1.1 does support dynamic loading, but perl doesn't
# know how to use it yet.
usedl=${usedl:-undef}
@@ -61,15 +76,16 @@ fi
# by -DPLAIN_MALLOC and -DNO_FANCY_MALLOC.
usemymalloc=${usemymalloc:-y}
+# Older versions of MachTen malloc() data on a two-byte boundary, which
+# works, but slows down operations on long, float and double data.
+# Perl's malloc() can compensate if SYSTEM_ALLOC_ALIGNMENT is suitably
+# defined.
+if expr "$osvers" \< "4.1" >/dev/null
+then
+system_alloc_alignment=" -DSYSTEM_ALLOC_ALIGNMENT=2"
+fi
# Do not wrap the following long line
-malloc_cflags='ccflags="$ccflags -DPLAIN_MALLOC -DNO_FANCY_MALLOC -DUSE_PERL_SBRK"'
-
-# Note that an empty malloc_cflags appears in config.sh if perl's
-# malloc() is not used. his is harmless.
-case "$usemymalloc" in
-n) unset malloc_cflags;;
-*) ccflags="$ccflags -DHIDEMYMALLOC"
-esac
+malloc_cflags='ccflags="$ccflags -DPLAIN_MALLOC -DNO_FANCY_MALLOC -DUSE_PERL_SBRK$system_alloc_alignment"'
# When MachTen does a fork(), it immediately copies the whole of
# the parent process' data space for the child. This can be
@@ -150,19 +166,46 @@ alignbytes=8
# friends. Use setjmp and friends instead.
expr "$osvers" \< "4.0.3" > /dev/null && d_sigsetjmp='undef'
-# System V IPC support in MachTen 4.1 is incomplete (missing msg function
+# System V IPC before MachTen 4.1.4 is incomplete (missing msg function
# prototypes, no ftok()), buggy (semctl(.., .., IPC_STATUS, ..) hangs
-# system), and undocumented. Claim it's not there until things improve.
+# system), and undocumented. Claim it's not there at all before 4.1.4.
+if expr "$osvers" \< "4.1.4" >/dev/null
+then
d_msg=${d_msg:-undef}
d_sem=${d_sem:-undef}
d_shm=${d_shm:-undef}
+fi
+
+
+# As of MachTen 4.1.4 the msg* and shm* are in libc but unimplemented
+# (an attempt to use them causes a runtime error)
+# XXX Configure probe for really functional msg*() is needed XXX
+# XXX Configure probe for really functional shm*() is needed XXX
+if test "$d_msg" = ""; then
+ d_msgget=${d_msgget:-undef}
+ d_msgctl=${d_msgctl:-undef}
+ d_msgsnd=${d_msgsnd:-undef}
+ d_msgrcv=${d_msgrcv:-undef}
+ case "$d_msgget$d_msgsnd$d_msgctl$d_msgrcv" in
+ *"undef"*) d_msg="$undef" ;;
+ esac
+fi
+if test "$d_shm" = ""; then
+ d_shmat=${d_shmat:-undef}
+ d_shmdt=${d_shmdt:-undef}
+ d_shmget=${d_shmget:-undef}
+ d_shmctl=${d_shmctl:-undef}
+ case "$d_shmat$d_shmctl$d_shmdt$d_shmget" in
+ *"undef"*) d_shm="$undef" ;;
+ esac
+fi
# Get rid of some extra libs which it takes Configure a tediously
-# long time never to find on MachTen
+# long time never to find on MachTen, or which break perl
set `echo X "$libswanted "|sed -e 's/ net / /' -e 's/ socket / /' \
-e 's/ inet / /' -e 's/ nsl / /' -e 's/ nm / /' -e 's/ malloc / /' \
-e 's/ ld / /' -e 's/ sun / /' -e 's/ posix / /' \
- -e 's/ cposix / /' -e 's/ crypt / /' \
+ -e 's/ cposix / /' -e 's/ crypt / /' -e 's/ dl / /' -e 's/ dld / /' \
-e 's/ ucb / /' -e 's/ bsd / /' -e 's/ BSD / /' -e 's/ PW / /'`
shift
libswanted="$*"
@@ -198,6 +241,11 @@ Similarly, when you see
select the default answer: vfork() works, and avoids expensive data
copying.
+You may also see "WHOA THERE!!!" messages concerning \$d_endspent,
+\$d_getspent, \$d_getspnam and \$d_setspent. In all cases, select the
+default answer: MachTen's support for shadow password file access is
+incomplete, and should not be used.
+
At the end of Configure, you will see a harmless message
Hmm...You had some extra variables I don't know about...I'll try to keep 'em.
@@ -205,6 +253,7 @@ Hmm...You had some extra variables I don't know about...I'll try to keep 'em.
Propagating recommended variable nmopts
Propagating recommended variable malloc_cflags...
Propagating recommended variable reg_infty
+ Propagating recommended variable system_alloc_alignment
Read the File::Find documentation for more information about dont_use_nlink
Your perl will be built with a stack size of ${stack_size}k and a regular
diff --git a/contrib/perl5/hints/mint.sh b/contrib/perl5/hints/mint.sh
index 22d854c..ab55e61 100644
--- a/contrib/perl5/hints/mint.sh
+++ b/contrib/perl5/hints/mint.sh
@@ -18,7 +18,7 @@ cc='gcc'
# The weird include path is really to work around some bugs in
# broken system header files.
-ccflags="-D__MINT__ -Uatarist -DDEBUGGING -I$here/../mint"
+ccflags="$ccflags -D__MINT__ -Uatarist -DDEBUGGING -I$here/../mint"
# libs
@@ -44,6 +44,7 @@ util_cflags='ccflags="$ccflags -DLOCALE_ENVIRON_REQUIRED"'
#
# Some good answers to the questions in Configure:
+# Does Configure really get all these wrong?
usenm='true'
d_suidsafe='true'
clocktype='long'
diff --git a/contrib/perl5/hints/mpeix.sh b/contrib/perl5/hints/mpeix.sh
index 9ebb0ba..556d221 100644
--- a/contrib/perl5/hints/mpeix.sh
+++ b/contrib/perl5/hints/mpeix.sh
@@ -12,7 +12,7 @@
# Revised again for 5.004_69 by Mark Bixby, markb@cccd.edu.
#
osname='mpeix'
-osvers='5.5'
+osvers='5.5' # Isn't there a way to determine this dynamically?
#
# Force Configure to use our wrapper mpeix/nm script
#
@@ -24,7 +24,8 @@ usenm='true'
#
# Various directory locations.
#
-prefix='/PERL/PUB'
+# Which ones of these does Configure get wrong?
+test -z "$prefix" && prefix='/PERL/PUB'
archname='PA-RISC1.1'
bin="$prefix"
installman1dir="$prefix/man/man1"
@@ -38,24 +39,30 @@ startsh='#!/bin/sh'
#
# Compiling.
#
-cc='gcc'
+test -z "$cc" && cc='gcc'
cccdlflags='none'
-ccflags='-DMPE -D_POSIX_SOURCE -D_SOCKET_SOURCE -D_POSIX_JOB_CONTROL -DIS_SOCKET_CLIB_ITSELF'
-locincpth='/usr/local/include /usr/contrib/include /BIND/PUB/include'
-optimize='-O2'
+ccflags="$ccflags -DMPE -D_POSIX_SOURCE -D_SOCKET_SOURCE -D_POSIX_JOB_CONTROL -DIS_SOCKET_CLIB_ITSELF"
+locincpth="$locincpth /usr/local/include /usr/contrib/include /BIND/PUB/include"
+test -z "$optimize" && optimize="-O2"
ranlib='/bin/true'
# Special compiling options for certain source files.
+# But what if you want -g?
regcomp_cflags='optimize=-O'
toke_cflags='ccflags="$ccflags -DARG_ZERO_IS_SCRIPT"'
#
# Linking.
#
lddlflags='-b'
-libs='-lbind -lsyslog -lcurses -lsvipc -lsocket -lm -lc'
-loclibpth='/usr/local/lib /usr/contrib/lib /BIND/PUB/lib /SYSLOG/PUB'
+# What if you want additional libs (e.g. gdbm)?
+# This should remove the unwanted libraries from $libswanted and
+# add on whatever ones are needed instead.
+libs="$libs -lbind -lsyslog -lcurses -lsvipc -lsocket -lm -lc"
+loclibpth="$loclibpth /usr/local/lib /usr/contrib/lib /BIND/PUB/lib /SYSLOG/PUB"
#
# External functions and data items.
#
+# Does Configure *really* get *all* of these wrong?
+#
d_crypt='define'
d_difftime='define'
d_dlerror='undef'
diff --git a/contrib/perl5/hints/netbsd.sh b/contrib/perl5/hints/netbsd.sh
index 6d99a13..7bd0a25 100644
--- a/contrib/perl5/hints/netbsd.sh
+++ b/contrib/perl5/hints/netbsd.sh
@@ -34,7 +34,7 @@ case "$osvers" in
# we use -fPIC here because -fpic is *NOT* enough for some of the
# extensions like Tk on some netbsd platforms (the sparc is one)
cccdlflags="-DPIC -fPIC $cccdlflags"
- lddlflags="-Bforcearchive -Bshareable $lddlflags"
+ lddlflags="-Bshareable $lddlflags"
else
d_dlopen=$undef
fi
@@ -63,10 +63,6 @@ case "$usevfork" in
'') usevfork=true ;;
esac
-# Avoid telldir prototype conflict in pp_sys.c (NetBSD uses const DIR *)
-# Configure should test for this. Volunteers?
-pp_sys_cflags='ccflags="$ccflags -DHAS_TELLDIR_PROTOTYPE"'
-
# Pre-empt the /usr/bin/perl question of installperl.
installusrbinperl='n'
diff --git a/contrib/perl5/hints/newsos4.sh b/contrib/perl5/hints/newsos4.sh
index a33cb31..3e447a5 100644
--- a/contrib/perl5/hints/newsos4.sh
+++ b/contrib/perl5/hints/newsos4.sh
@@ -6,11 +6,10 @@ echo
echo 'Compiling Tips:'
echo 'When you have found that ld complains "multiple defined" error'
echo 'on linking /lib/libdbm.a, do following instructions.'
-echo ' cd /tmp (working on /tmp)'
echo ' cp /lib/libdbm.a dbm.o (copy current libdbm.a)'
echo ' ar cr libdbm.a dbm.o (make archive)'
echo ' mv /lib/libdbm.a /lib/libdbm.a.backup (backup original library)'
-echo ' cp /tmp/libdbm.a /lib (copy newer one)'
+echo ' cp libdbm.a /lib (copy newer one)'
echo ' ranlib /lib/libdbm.a (ranlib for later use)'
echo
diff --git a/contrib/perl5/hints/next_3.sh b/contrib/perl5/hints/next_3.sh
index 99adf50..27c9bd9 100644
--- a/contrib/perl5/hints/next_3.sh
+++ b/contrib/perl5/hints/next_3.sh
@@ -32,8 +32,8 @@
# than no perl at all.
#
# So, this hintsfile is using perl's malloc. If you want to turn
-# perl's malloc off, you need to remove '-DUSE_PERL_SBRK' and
-# '-DHIDEMYMALLOC' from the ccflags and set usemymalloc to 'n'.
+# perl's malloc off, you need to remove '-DUSE_PERL_SBRK'
+# from the ccflags and set usemymalloc to 'n'.
#
# 1997:
# From perl5.003_22 the malloc bug has no impact any more. We can run
@@ -42,12 +42,12 @@
#
# use the following two lines to enable USE_PERL_SBRK. Try this if you
# encounter intermittent core dumps:
-#ccflags='-DUSE_NEXT_CTYPE -DUSE_PERL_SBRK -DHIDEMYMALLOC'
+#ccflags='-DUSE_NEXT_CTYPE -DUSE_PERL_SBRK'
#usemymalloc='y'
# use the following two lines if you have perl5.003_22 or better and
# do not encounter intermittent core dumps.
-ccflags='-DUSE_NEXT_CTYPE'
+ccflags="$ccflags -DUSE_NEXT_CTYPE"
usemymalloc='n'
######################################################################
diff --git a/contrib/perl5/hints/next_3_0.sh b/contrib/perl5/hints/next_3_0.sh
index b8cc2c2..b444578 100644
--- a/contrib/perl5/hints/next_3_0.sh
+++ b/contrib/perl5/hints/next_3_0.sh
@@ -16,11 +16,11 @@ echo find it. By default, it is placed in /usr/local/include/gdbm.h. >&4
echo It will not be found there. Try moving it to >&4
echo /NextDeveloper/Headers/bsd/gdbm.h. >&4
-ccflags='-DUSE_NEXT_CTYPE -DNEXT30_NO_ATTRIBUTE'
+ccflags="$ccflags -DUSE_NEXT_CTYPE -DNEXT30_NO_ATTRIBUTE"
POSIX_cflags='ccflags="-posix $ccflags"'
useposix='undef'
-ldflags='-u libsys_s'
-libswanted='dbm gdbm db'
+ldflags="$ldflags -u libsys_s"
+libswanted="$libswanted dbm gdbm db"
#
lddlflags='-r'
# Give cccdlflags an empty value since Configure will detect we are
diff --git a/contrib/perl5/hints/next_4.sh b/contrib/perl5/hints/next_4.sh
index d1d0398..d5c8ba7 100644
--- a/contrib/perl5/hints/next_4.sh
+++ b/contrib/perl5/hints/next_4.sh
@@ -1,13 +1,3 @@
-######################################################################
-#
-# IMPORTANT: before you run 'make', you need to enter one of these two
-# lines (depending on your shell):
-# DYLD_LIBRARY_PATH=`pwd`; export DYLD_LIBRARY_PATH
-# or
-# setenv DYLD_LIBRARY_PATH `pwd`
-#
-######################################################################
-
# Posix support has been removed from NextStep
#
useposix='undef'
@@ -16,9 +6,9 @@ libpth='/lib /usr/lib /usr/local/lib'
libswanted=' '
libc='/NextLibrary/Frameworks/System.framework/System'
-ldflags='-dynamic -prebind'
-lddlflags='-dynamic -bundle -undefined suppress'
-ccflags='-dynamic -fno-common -DUSE_NEXT_CTYPE -DUSE_PERL_SBRK -DHIDEMYMALLOC'
+ldflags="$ldflags -dynamic -prebind"
+lddlflags="$lddlflags -dynamic -bundle -undefined suppress"
+ccflags="$ccflags -dynamic -fno-common -DUSE_NEXT_CTYPE -DUSE_PERL_SBRK"
cccdlflags='none'
ld='cc'
#optimize='-g -O'
@@ -106,3 +96,7 @@ clocktype='int'
# running ranlib. The '5' is an empirical number that's "long enough."
# (Thanks to Andreas Koenig <k@franz.ww.tu-berlin.de>)
ranlib='sleep 5; /bin/ranlib'
+
+case "$ldlibpthname" in
+'') ldlibpthname=DYLD_LIBRARY_PATH ;;
+esac
diff --git a/contrib/perl5/hints/openbsd.sh b/contrib/perl5/hints/openbsd.sh
index e9d8ea4..a7d8bf2 100644
--- a/contrib/perl5/hints/openbsd.sh
+++ b/contrib/perl5/hints/openbsd.sh
@@ -4,36 +4,50 @@
# Edited to allow Configure command-line overrides by
# Andy Dougherty <doughera@lafcol.lafayette.edu>
#
+# To build with distribution paths, use:
+# ./Configure -des -Dopenbsd_distribution=defined
+#
# OpenBSD has a better malloc than perl...
test "$usemymalloc" || usemymalloc='n'
# Currently, vfork(2) is not a real win over fork(2) but this will
-# change in a future release.
+# change starting with OpenBSD 2.7.
usevfork='true'
# setre?[ug]id() have been replaced by the _POSIX_SAVED_IDS versions
# in 4.4BSD. Configure will find these but they are just emulated
# and do not have the same semantics as in 4.3BSD.
-d_setregid='undef'
-d_setreuid='undef'
-d_setrgid='undef'
-d_setruid='undef'
+d_setregid=$undef
+d_setreuid=$undef
+d_setrgid=$undef
+d_setruid=$undef
#
-# Not all platforms support shared libs...
+# Not all platforms support dynamic loading...
#
-case `uname -m` in
-alpha|mips|powerpc|vax)
- d_dlopen=$undef
+case `arch` in
+OpenBSD.alpha|OpenBSD.mips|OpenBSD.powerpc|OpenBSD.vax)
+ usedl=$undef
;;
*)
+ usedl=$define
d_dlopen=$define
d_dlerror=$define
# 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="-Bforcearchive -Bshareable $lddlflags"
+ lddlflags="-Bshareable $lddlflags"
+ ;;
+esac
+
+#
+# Tweaks for various versions of OpenBSD
+#
+case "$osvers" in
+2.5)
+ # OpenBSD 2.5 has broken odbm support
+ i_dbm=$undef
;;
esac
@@ -42,7 +56,7 @@ esac
libswanted=`echo $libswanted | sed 's/ crypt / /'`
# Configure can't figure this out non-interactively
-d_suidsafe='define'
+d_suidsafe=$define
# cc is gcc so we can do better than -O
# Allow a command-line override, such as -Doptimize=-g
@@ -54,8 +68,34 @@ cat > UU/usethreads.cbu <<'EOCBU'
case "$usethreads" in
$define|true|[yY]*)
# any openbsd version dependencies with pthreads?
+ ccflags="-pthread $ccflags"
+ ldflags="-pthread $ldflags"
libswanted="$libswanted pthread"
+ # This is strange.
+ usevfork="$undef"
esac
EOCBU
+# When building in the OpenBSD tree we use different paths
+# This is only part of the story, the rest comes from config.over
+case "$openbsd_distribution" in
+''|$undef|false) ;;
+*)
+ # We put things in /usr, not /usr/local
+ prefix='/usr'
+ prefixexp='/usr'
+ sysman='/usr/share/man/man1'
+ libpth='/usr/lib'
+ glibpth='/usr/lib'
+ # Ports installs non-std libs in /usr/local/lib so look there too
+ locincpth='/usr/local/include'
+ loclibpth='/usr/local/lib'
+ # Link perl with shared libperl
+ if [ "$usedl" = "$define" -a -r shlib_version ]; then
+ useshrplib=true
+ libperl=`. ./shlib_version; echo libperl.so.${major}.${minor}`
+ fi
+ ;;
+esac
+
# end
diff --git a/contrib/perl5/hints/os2.sh b/contrib/perl5/hints/os2.sh
index 310ae91..1d9df36 100644
--- a/contrib/perl5/hints/os2.sh
+++ b/contrib/perl5/hints/os2.sh
@@ -95,6 +95,8 @@ libpth="$libpth $libemx/mt $libemx"
set `emxrev -f emxlibcm`
emxcrtrev=$5
+# indented to not put it into config.sh
+ _defemxcrtrev=-D_EMX_CRT_REV_=$emxcrtrev
so='dll'
@@ -124,8 +126,8 @@ fi
aout_ldflags="$aout_ldflags"
aout_d_fork='define'
-aout_ccflags='-DPERL_CORE -DDOSISH -DPERL_IS_AOUT -DOS2=2 -DEMBED -I.'
-aout_cppflags='-DPERL_CORE -DDOSISH -DPERL_IS_AOUT -DOS2=2 -DEMBED -I.'
+aout_ccflags="-DDOSISH -DPERL_IS_AOUT -DOS2=2 -DEMBED -I. $_defemxcrtrev"
+aout_cppflags="-DDOSISH -DPERL_IS_AOUT -DOS2=2 -DEMBED -I. $_defemxcrtrev"
aout_use_clib='c'
aout_usedl='undef'
aout_archobjs="os2.o dl_os2.o"
@@ -165,9 +167,9 @@ else
# Recursive regmatch may eat 2.5M of stack alone.
ldflags='-Zexe -Zomf -Zmt -Zcrtdll -Zstack 32000'
if [ $emxcrtrev -ge 50 ]; then
- ccflags='-Zomf -Zmt -DDOSISH -DOS2=2 -DEMBED -I.'
+ ccflags="-Zomf -Zmt -DDOSISH -DOS2=2 -DEMBED -I. $_defemxcrtrev"
else
- ccflags='-Zomf -Zmt -DDOSISH -DOS2=2 -DEMBED -I. -DEMX_BAD_SBRK'
+ ccflags="-Zomf -Zmt -DDOSISH -DOS2=2 -DEMBED -I. -DEMX_BAD_SBRK $_defemxcrtrev"
fi
use_clib='c_import'
usedl='define'
@@ -257,9 +259,56 @@ d_setprior='define'
# Commented:
#startsh='extproc ksh\\n#! sh'
+# Find patch:
+gnupatch='patch'
+if (gnupatch -v || gnupatch --version) 2>&1 >/dev/null; then
+ gnupatch=gnupatch
+else
+ if (gpatch -v || gpatch --version) 2>&1 >/dev/null; then
+ gnupatch=gpatch
+ else
+ # They may have a special PATH during configuring
+ if (patch -v || patch --version) 2>&1 >/dev/null; then
+ gnupatch="`./UU/loc patch.exe undef $pth`"
+ fi
+ fi
+fi
+
+# Apply patches if needed
+case "$0$running_c_cmd" in
+ *[/\\]Configure|*[/\\]Configure.|Configure|Configure.) # Skip Configure.cmd
+ if grep "^libnames" ./Configure > /dev/null; then
+ # Not patched!
+ if test -f ./Configure.cmd ; then
+ echo "!!!" >&2
+ echo "!!! ./Configure not patched, but ./Configure.cmd exits" >&2
+ echo "!!! Do not know what to do!" >&2
+ echo "!!!" >&2
+ exit 2
+ fi
+ echo "!!!" >&2
+ echo "!!! You did not patch ./Configure!" >&2
+ echo "!!! I create Configure.cmd and patch it from ./os2/diff.configure." >&2
+ echo "!!!" >&2
+ echo "$gnupatch -b -p1 --output=Configure.cmd <./os2/diff.configure 2>&1 | tee 00_auto_patch" >&2
+ ($gnupatch -b -p1 --output=Configure.cmd <./os2/diff.configure 2>&1 | tee 00_auto_patch) >&2
+ echo "!!!" >&2
+ echo "!!! The report of patching is copied to 00_auto_patch." >&2
+ echo "!!! Now you need to restart Configure.cmd with all the options" >&2
+ echo "!!!" >&2
+ echo "extproc sh" > Configure.ctm
+ cat Configure.cmd >> Configure.ctm && mv -f Configure.ctm Configure.cmd
+ exit 0
+ else
+ echo "!!! Apparently we are running a patched Configure." >&2
+ fi
+ ;;
+ *) echo "!!! Apparently we are running a renamed Configure: '$0'." >&2
+esac
+
# Copy pod:
-cp ./README.os2 ./pod/perlos2.pod
+cp -uf ./README.os2 ./pod/perlos2.pod
# This script UU/usethreads.cbu will get 'called-back' by Configure
# after it has prompted the user for whether to use threads.
@@ -304,6 +353,9 @@ for xxx in * ; do
fi
done
+case "$ldlibpthname" in
+'') ldlibpthname=none ;;
+esac
# Now go back
cd ../..
diff --git a/contrib/perl5/hints/os390.sh b/contrib/perl5/hints/os390.sh
index 08b60c8..d6f6821 100644
--- a/contrib/perl5/hints/os390.sh
+++ b/contrib/perl5/hints/os390.sh
@@ -59,3 +59,51 @@ archobjs=ebcdic.o
# We have our own cppstdin.
echo 'cat >.$$.c; '"$cc"' -E -Wc,NOLOC ${1+"$@"} .$$.c; rm .$$.c' > cppstdin
+
+#
+# Note that Makefile.SH employs a bare yacc to generate
+# perly.[hc] and a2p.[hc], hence you may wish to:
+#
+# alias yacc='myyacc'
+#
+# Then if you would like to use myyacc and skip past the
+# following warnings try invoking Configure like so:
+#
+# sh Configure -Dbyacc=yacc
+#
+# This trick ought to work even if your yacc is byacc.
+#
+if test "X$byacc" = "Xbyacc" ; then
+ if test -e /etc/yyparse.c ; then
+ : we should be OK - perhaps do a test -r?
+ else
+ cat <<EOWARN >&4
+
+Warning. You do not have a copy of yyparse.c, the default
+yacc parser template file, in place in /etc.
+EOWARN
+ if test -e /samples/yyparse.c ; then
+ cat <<EOWARN >&4
+
+There does appear to be a template file in /samples though.
+Please run:
+
+ cp /samples/yyparse.c /etc
+
+before attempting to Configure the build of $package.
+
+EOWARN
+ else
+ cat <<EOWARN >&4
+
+There does not appear to be one in /samples either.
+If you feel you can make use of an alternate yacc-like
+parser generator then please read the comments in the
+hints/os390.sh file carefully.
+
+EOWARN
+ fi
+ exit 1
+ fi
+fi
+
diff --git a/contrib/perl5/hints/posix-bc.sh b/contrib/perl5/hints/posix-bc.sh
new file mode 100644
index 0000000..ec21bc3
--- /dev/null
+++ b/contrib/perl5/hints/posix-bc.sh
@@ -0,0 +1,42 @@
+#! /usr/bin/bash -norc
+# hints/posix-bc.sh
+#
+# BS2000 (Posix Subsystem) hints by Thomas Dorner <Thomas.Dorner@start.de>
+#
+# thanks to the authors of the os390.sh
+#
+
+# To get ANSI C, we need to use c89, and ld doesn't exist
+cc='c89'
+ld='c89'
+
+# C-Flags:
+ccflags='-DPOSIX_BC -DUSE_PURE_BISON -D_XOPEN_SOURCE_EXTENDED'
+
+# Flags on a RISC-Host (SUNRISE):
+if [ -n "`bs2cmd SHOW-SYSTEM-INFO | egrep 'HSI-ATT.*TYPE.*SR'`" ]; then
+ echo
+ echo "Congratulations, you are running a machine with Sunrise CPUs."
+ echo "Let's hope you have the matching RISC compiler as well."
+ ccflags='-K risc_4000 -DPOSIX_BC -DUSE_PURE_BISON -D_XOPEN_SOURCE_EXTENDED'
+ ldflags='-K risc_4000'
+fi
+
+# Turning on optimization breaks perl (CORE-DUMP):
+optimize='none'
+
+# we don''t use dynamic memorys (yet):
+so='none'
+usedl='no'
+dlext='none'
+
+# On BS2000/Posix, libc.a doesn't really hold anything at all,
+# so running nm on it is pretty useless.
+usenm='no'
+
+# other Options:
+
+usemymalloc='no'
+
+archobjs=ebcdic.o
+
diff --git a/contrib/perl5/hints/powerux.sh b/contrib/perl5/hints/powerux.sh
index 6d6bac0..4070c01 100644
--- a/contrib/perl5/hints/powerux.sh
+++ b/contrib/perl5/hints/powerux.sh
@@ -52,7 +52,7 @@ d_csh='undef'
#
cc='/bin/cc'
cccdlflags='-Zpic'
-ccdlflags='-Zlink=dynamic -Wl,-Bexport'
+ccdlflags='-Zlink=dynamic -Wl,-usys_nerr -Wl,-Bexport'
lddlflags='-Zlink=so'
# Configure sometime finds what it believes to be ndbm header files on the
@@ -63,6 +63,12 @@ lddlflags='-Zlink=so'
#
i_ndbm='undef'
+# I have no clude what perl thinks it wants <sys/mode.h> for, but if
+# you include it in a program in PowerMAX without first including
+# <sys/vnode.h> the code don't compile...
+#
+i_sysmode='undef'
+
# There is a bug in memcmp (which I hope will be fixed soon) which sometimes
# fails to provide the correct compare status (it is data dependant), so just
# pretend there is no memcmp...
@@ -85,6 +91,15 @@ useshrplib='false'
#
dont_use_nlink=define
+# Configure comes up with the wrong type for these for some reason. The
+# pointers shouldn't have const in them. (And it looks like I have to
+# provide netdb_hlen_type as well becuase when I predefine the others it
+# comes up empty :-).
+#
+netdb_host_type='char *'
+netdb_name_type='char *'
+netdb_hlen_type='int'
+
# Misc other flags that might be able to change, but I know these work right.
#
d_suidsafe='define'
diff --git a/contrib/perl5/hints/qnx.sh b/contrib/perl5/hints/qnx.sh
index b53a33d..06d9010 100644
--- a/contrib/perl5/hints/qnx.sh
+++ b/contrib/perl5/hints/qnx.sh
@@ -98,13 +98,9 @@ libc='/usr/lib/clib3r.lib'
# constructs make a lot of noise, so I turn those warnings off.
# A few still remain...
#
-# HIDEMYMALLOC is necessary if using mymalloc since it is very
-# tricky (though not impossible) to totally replace the watcom
-# malloc/free set.
-#
# unix.h is required as a general rule for unixy applications.
#----------------------------------------------------------------
-ccflags='-DHIDEMYMALLOC -mf -w4 -Wc,-wcd=202 -Wc,-wcd=203 -Wc,-wcd=302 -Wc,-fi=unix.h'
+ccflags='-mf -w4 -Wc,-wcd=202 -Wc,-wcd=203 -Wc,-wcd=302 -Wc,-fi=unix.h'
#----------------------------------------------------------------
# ldflags:
diff --git a/contrib/perl5/hints/rhapsody.sh b/contrib/perl5/hints/rhapsody.sh
new file mode 100644
index 0000000..933081b
--- /dev/null
+++ b/contrib/perl5/hints/rhapsody.sh
@@ -0,0 +1,67 @@
+##
+# Rhapsody (Mac OS X Server) hints
+# Wilfredo Sanchez <wsanchez@apple.com>
+##
+
+##
+# Paths
+##
+
+# BSD paths
+prefix='/usr';
+siteprefix='/usr/local';
+vendorprefix='/usr/local'; usevendorprefix='define';
+
+# 4BSD uses /usr/share/man, not /usr/man.
+# Don't put man pages in /usr/lib; that's goofy.
+man1dir='/usr/share/man/man1';
+man3dir='/usr/share/man/man3';
+
+# Where to put modules.
+privlib='/System/Library/Perl';
+sitelib='/Local/Library/Perl';
+vendorlib='/Network/Library/Perl';
+
+##
+# Tool chain settings
+##
+
+# Since we can build fat, the archname doesn't need the processor type
+archname='rhapsody';
+
+# nm works.
+usenm='true';
+
+# Libc is in libsystem.
+libc='/System/Library/Frameworks/System.framework/System';
+
+# Optimize.
+optimize='-O3';
+
+# We have a prototype for telldir.
+ccflags="${ccflags} -pipe -fno-common -DHAS_TELLDIR_PROTOTYPE";
+
+# Shared library extension is .dylib.
+# Bundle extension is .bundle.
+ld='cc';
+so='dylib';
+dlext='bundle';
+dlsrc='dl_dyld.xs';
+usedl='define';
+cccdlflags='';
+lddlflags="${ldflags} -bundle -undefined suppress";
+ldlibpthname='DYLD_LIBRARY_PATH';
+useshrplib='true';
+base_address='0x4be00000';
+
+##
+# System libraries
+##
+
+# vfork works
+usevfork='true';
+
+# malloc works
+usemymalloc='n';
+
+
diff --git a/contrib/perl5/hints/sco.sh b/contrib/perl5/hints/sco.sh
index eb59845..079ab78 100644
--- a/contrib/perl5/hints/sco.sh
+++ b/contrib/perl5/hints/sco.sh
@@ -9,6 +9,8 @@
# Mostly rewritten on
# Tue Jan 19 23:00:00 CET 1999
# by Francois Desarmenien <desar@club-internet.fr>
+# Modified by Boyd Gerber <gerberb@zenez.com>
+# Tue Sep 21 1999
###############################################################
#
# To use cc, use sh Configure
@@ -82,6 +84,7 @@ case `/bin/uname -X | egrep '3\.2v'` in
echo "" >&4
echo "" >&4
echo " For UnixWare, use svr4.sh hints instead" >&4
+ echo " For UnixWare 7.*, use svr5.sh hints instead" >&4
echo "" >&4
echo "***********************************************************" >&4
exit
@@ -102,7 +105,7 @@ if test "$scorls" = "3"
then
dlext=''
case "$cc" in
- gcc) optimize='-O2' ;;
+ *gcc*) optimize='-O2' ;;
*) ccflags="$ccflags -W0 -quiet"
optimize='-O' ;;
esac
@@ -114,7 +117,7 @@ else
###############################################################
# In Release 5, always compile ELF objects
case "$cc" in
- gcc)
+ *gcc*)
ccflags="$ccflags -melf"
optimize='-O2'
;;
@@ -139,7 +142,7 @@ else
if test "$usedl" != "n"; then
ld='ld'
case "$cc" in
- gcc)
+ *gcc*)
ccdlflags='-Xlinker -Bexport -L/usr/local/lib'
cccdlflags='-fpic'
lddlflags='-G -L/usr/local/lib'
@@ -178,6 +181,13 @@ shift
libswanted="$*"
###############################################################
+# Remove libbind because it conflicts with libsocket.
+libswanted=`echo " $libswanted " | sed -e 's/ bind / /'`
+set X $libswanted
+shift
+libswanted="$*"
+
+###############################################################
# Try to use libintl.a since it has strcoll and strxfrm
libswanted="intl $libswanted"
diff --git a/contrib/perl5/hints/solaris_2.sh b/contrib/perl5/hints/solaris_2.sh
index 935f00d..8aee6d4 100644
--- a/contrib/perl5/hints/solaris_2.sh
+++ b/contrib/perl5/hints/solaris_2.sh
@@ -1,6 +1,6 @@
# hints/solaris_2.sh
-# Last modified: Wed May 27 13:04:45 EDT 1998
-# Andy Dougherty <doughera@lafcol.lafayette.edu>
+# Last modified: Tue Apr 13 13:12:49 EDT 1999
+# Andy Dougherty <doughera@lafayette.edu>
# Based on input from lots of folks, especially
# Dean Roehrich <roehrich@ironwood-fddi.cray.com>
@@ -9,7 +9,10 @@
# way to do that is to invoke Configure with
#
# sh Configure -Dcc='gcc -B/usr/ccs/bin/'
-#
+#
+# (Note that the trailing slash is *required*.)
+# gcc will occasionally emit warnings about "unused prefix", but
+# these ought to be harmless. See below for more details.
# See man vfork.
usevfork=false
@@ -42,15 +45,51 @@ case "$archname" in
;;
esac
+test -z "`${cc:-cc} -V 2>&1|grep -i workshop`" || ccisworkshop="$define"
+test -z "`${cc:-cc} -v 2>&1|grep -i gcc`" || ccisgcc="$define"
+
+cat >UU/workshoplibpth.cbu<<'EOCBU'
+case "$workshoplibpth_done" in
+'') case "$use64bitall" in
+ "$define"|true|[yY]*)
+ loclibpth="$loclibpth /usr/lib/sparcv9"
+ if test -n "$workshoplibs"; then
+ loclibpth=`echo $loclibpth | sed -e "s% $workshoplibs%%" `
+ for lib in $workshoplibs; do
+ # Logically, it should be sparcv9.
+ # But the reality fights back, it's v9.
+ loclibpth="$loclibpth $lib/sparcv9 $lib/v9"
+ done
+ fi
+ ;;
+ *) loclibpth="$loclibpth $workshoplibs"
+ ;;
+ esac
+ workshoplibpth_done="$define"
+ ;;
+esac
+EOCBU
+
+case "$ccisworkshop" in
+"$define")
+ cat >try.c <<EOF
+#include <sunmath.h>
+int main() { return(0); }
+EOF
+ workshoplibs=`cc -### try.c -lsunmath -o try 2>&1|grep " -Y "|sed 's%.* -Y "P,\(.*\)".*%\1%'|tr ':' '\n'|grep '/SUNWspro/'`
+ . ./UU/workshoplibpth.cbu
+ ;;
+esac
+
######################################################
# General sanity testing. See below for excerpts from the Solaris FAQ.
-
+#
# From roehrich@ironwood-fddi.cray.com Wed Sep 27 12:51:46 1995
# Date: Thu, 7 Sep 1995 16:31:40 -0500
# From: Dean Roehrich <roehrich@ironwood-fddi.cray.com>
# To: perl5-porters@africa.nicoh.com
# Subject: Re: On perl5/solaris/gcc
-
+#
# Here's another draft of the perl5/solaris/gcc sanity-checker.
case `type ${cc:-cc}` in
@@ -140,6 +179,19 @@ cat > UU/cc.cbu <<'EOSH'
#
# Watch out in case they have not set $cc.
+# Perl compiled with some combinations of GNU as and ld may not
+# be able to perform dynamic loading of extensions. If you have a
+# problem with dynamic loading, be sure that you are using the Solaris
+# /usr/ccs/bin/as and /usr/ccs/bin/ld. You can do that with
+# sh Configure -Dcc='gcc -B/usr/ccs/bin/'
+# (note the trailing slash is required).
+# Combinations that are known to work with the following hints:
+#
+# gcc-2.7.2, GNU as 2.7, GNU ld 2.7
+# egcs-1.0.3, GNU as 2.9.1 and GNU ld 2.9.1
+# --Andy Dougherty <doughera@lafayette.edu>
+# Tue Apr 13 17:19:43 EDT 1999
+
# Get gcc to share its secrets.
echo 'main() { return 0; }' > try.c
# Indent to avoid propagation to config.sh
@@ -149,7 +201,6 @@ if echo "$verbose" | grep '^Reading specs from' >/dev/null 2>&1; then
#
# Using gcc.
#
- #echo Using gcc
tmp=`echo "$verbose" | grep '^Reading' |
awk '{print $NF}' | sed 's/specs$/include/'`
@@ -157,67 +208,76 @@ if echo "$verbose" | grep '^Reading specs from' >/dev/null 2>&1; then
# Determine if the fixed-includes look like they'll work.
# Doesn't work anymore for gcc-2.7.2.
- # See if as(1) is GNU as(1). GNU as(1) won't work for this job.
+ # See if as(1) is GNU as(1). GNU as(1) might not work for this job.
if echo "$verbose" | grep ' /usr/ccs/bin/as ' >/dev/null 2>&1; then
:
else
cat <<END >&2
-NOTE: You are using GNU as(1). GNU as(1) will not build Perl.
-I'm arranging to use /usr/ccs/bin/as by including -B/usr/ccs/bin/
+NOTE: You are using GNU as(1). GNU as(1) might not build Perl. If you
+have trouble, you can use /usr/ccs/bin/as by including -B/usr/ccs/bin/
in your ${cc:-cc} command. (Note that the trailing "/" is required.)
END
- cc="${cc:-cc} -B/usr/ccs/bin/"
+ # Apparently not needed, at least for as 2.7 and later.
+ # cc="${cc:-cc} -B/usr/ccs/bin/"
fi
- # See if ld(1) is GNU ld(1). GNU ld(1) won't work for this job.
+ # See if ld(1) is GNU ld(1). GNU ld(1) might not work for this job.
# Recompute $verbose since we may have just changed $cc.
verbose=`${cc:-cc} -v -o try try.c 2>&1 | grep ld 2>&1`
+
if echo "$verbose" | grep ' /usr/ccs/bin/ld ' >/dev/null 2>&1; then
+ # Ok, gcc directly calls the Solaris /usr/ccs/bin/ld.
+ :
+ elif echo "$verbose" | grep "ld: Software Generation Utilities" >/dev/null 2>&1; then
+ # Hmm. gcc doesn't call /usr/ccs/bin/ld directly, but it
+ # does appear to be using it eventually. egcs-1.0.3's ld
+ # wrapper does this.
+ # All Solaris versions of ld I've seen contain the magic
+ # string used in the grep.
:
else
- # It's not /usr/ccs/bin/ld - but it might be egcs's ld wrapper,
- # which calls /usr/ccs/bin/ld in turn. Passing -V to it will
- # make it show its true colors.
+ # No evidence yet of /usr/ccs/bin/ld. Some versions
+ # of egcs's ld wrapper call /usr/ccs/bin/ld in turn but
+ # apparently don't reveal that unless you pass in -V.
+ # (This may all depend on local configurations too.)
myld=`echo $verbose| grep ld | awk '/\/ld/ {print $1}'`
- # This assumes that gcc's output will not change, and that
- # /full/path/to/ld will be the first word of the output.
-
- # all Solaris versions of ld I've seen contain the magic
- # string used in the grep below.
- if $myld -V 2>&1 | grep "ld: Software Generation Utilities" >/dev/null 2>&1; then
- cat <<END >&2
-
-Aha. You're using egcs and /usr/ccs/bin/ld.
-
-END
-
- else
- cat <<END >&2
+ # This assumes that gcc's output will not change, and that
+ # /full/path/to/ld will be the first word of the output.
+ # Thus myld is something like opt/gnu/sparc-sun-solaris2.5/bin/ld
+
+ if $myld -V 2>&1 | grep "ld: Software Generation Utilities" >/dev/null 2>&1; then
+ # Ok, /usr/ccs/bin/ld eventually does get called.
+ :
+ else
+ cat <<END >&2
-NOTE: You are using GNU ld(1). GNU ld(1) will not build Perl.
-I'm arranging to use /usr/ccs/bin/ld by including -B/usr/ccs/bin/
+NOTE: You are using GNU ld(1). GNU ld(1) might not build Perl. If you
+have trouble, you can use /usr/ccs/bin/ld by including -B/usr/ccs/bin/
in your ${cc:-cc} command. (Note that the trailing "/" is required.)
+I will try to use GNU ld by passing in the -Wl,-E flag, but if that
+doesn't work, you should use -B/usr/ccs/bin/ instead.
+
END
- cc="${cc:-cc} -B/usr/ccs/bin/"
- fi
+ ccdlflags="$ccdlflags -Wl,-E"
+ lddlflags="$lddlflags -W,l-E -G"
+ fi
fi
else
#
# Not using gcc.
#
- #echo Not using gcc
- # See if as(1) is GNU as(1). GNU as(1) won't work for this job.
+ # See if as(1) is GNU as(1). GNU might not work for this job.
case `as --version < /dev/null 2>&1` in
*GNU*)
cat <<END >&2
-NOTE: You are using GNU as(1). GNU as(1) will not build Perl.
+NOTE: You are using GNU as(1). GNU as(1) might not build Perl.
You must arrange to use /usr/ccs/bin/as, perhaps by adding /usr/ccs/bin
to the beginning of your PATH.
@@ -225,7 +285,7 @@ END
;;
esac
- # See if ld(1) is GNU ld(1). GNU ld(1) won't work for this job.
+ # See if ld(1) is GNU ld(1). GNU ld(1) might not work for this job.
# ld --version doesn't properly report itself as a GNU tool,
# as of ld version 2.6, so we need to be more strict. TWP 9/5/96
gnu_ld=false
@@ -245,8 +305,8 @@ END
if $gnu_ld ; then
cat <<END >&2
-NOTE: You are apparently using GNU ld(1). GNU ld(1) will not build Perl.
-You must arrange to use /usr/ccs/bin/ld, perhaps by adding /usr/ccs/bin
+NOTE: You are apparently using GNU ld(1). GNU ld(1) might not build Perl.
+You should arrange to use /usr/ccs/bin/ld, perhaps by adding /usr/ccs/bin
to the beginning of your PATH.
END
@@ -261,9 +321,9 @@ rm -f core
# XXX
EOSH
+cat > UU/usethreads.cbu <<'EOCBU'
# This script UU/usethreads.cbu will get 'called-back' by Configure
# after it has prompted the user for whether to use threads.
-cat > UU/usethreads.cbu <<'EOCBU'
case "$usethreads" in
$define|true|[yY]*)
ccflags="-D_REENTRANT $ccflags"
@@ -309,6 +369,135 @@ EOM
esac
EOCBU
+cat > UU/uselargefiles.cbu <<'EOCBU'
+# This script UU/uselargefiles.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use large files.
+case "$uselargefiles" in
+''|$define|true|[yY]*)
+ ccflags="$ccflags `getconf LFS_CFLAGS 2>/dev/null`"
+ ldflags="$ldflags `getconf LFS_LDFLAGS 2>/dev/null`"
+ libswanted="$libswanted `getconf LFS_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+ ;;
+esac
+EOCBU
+
+cat > UU/use64bitint.cbu <<'EOCBU'
+# This script UU/use64bitint.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use 64 bit integers.
+case "$use64bitint" in
+"$define"|true|[yY]*)
+ case "`uname -r`" in
+ 2.[1-6])
+ cat >&4 <<EOM
+Solaris `uname -r` does not support 64-bit integers.
+You should upgrade to at least Solaris 2.7.
+EOM
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+EOCBU
+
+cat > UU/use64bitall.cbu <<'EOCBU'
+# This script UU/use64bitall.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to be maximally 64 bitty.
+case "$use64bitall-$use64bitall_done" in
+"$define-"|true-|[yY]*-)
+ libc='/usr/lib/sparcv9/libc.so'
+ if test ! -f $libc; then
+ cat >&4 <<EOM
+
+I do not see the 64-bit libc, $libc.
+Cannot continue, aborting.
+
+EOM
+ exit 1
+ fi
+ . ./UU/workshoplibpth.cbu
+ case "$cc -v 2>/dev/null" in
+ *gcc*)
+ echo 'main() { return 0; }' > try.c
+ if ${cc:-cc} -mcpu=v9 -m64 -S try.c 2>&1 | grep -e \
+ '-m64 is not supported by this configuration'; then
+ cat >&4 <<EOM
+
+Full 64-bit build not supported by this configuration.
+Cannot continue, aborting.
+
+EOM
+ exit 1
+ fi
+ ccflags="$ccflags -mcpu=v9 -m64"
+ if test X`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null` != X; then
+ ccflags="$ccflags -Wa,`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
+ fi
+ # no changes to ld flags, as (according to man ld):
+ #
+ # There is no specific option that tells ld to link 64-bit
+ # objects; the class of the first object that gets processed
+ # by ld determines whether it is to perform a 32-bit or a
+ # 64-bit link edit.
+ ;;
+ *)
+ ccflags="$ccflags `getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
+ ldflags="$ldflags `getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
+ lddlflags="$lddlflags -G `getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
+ ;;
+ esac
+ libscheck='case "`/usr/bin/file $xxx`" in
+*64-bit*|*SPARCV9*) ;;
+*) xxx=/no/64-bit$xxx ;;
+esac'
+ use64bitall_done=yes
+ ;;
+esac
+EOCBU
+
+# Actually, we want to run this already now, if so requested,
+# because we need to fix up things right now.
+case "$use64bitall" in
+"$define"|true|[yY]*)
+ . ./UU/use64bitall.cbu
+ ;;
+esac
+
+cat > UU/uselongdouble.cbu <<'EOCBU'
+# This script UU/uselongdouble.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use long doubles.
+case "$uselongdouble-$uselongdouble_done" in
+"$define-"|true-|[yY]*-)
+ case "$ccisworkshop" in
+ '') cat >&4 <<EOM
+
+I do not see the Sun Workshop compiler; therefore I do not see
+the libsunmath; therefore I do not know how to do long doubles, sorry.
+I'm disabling the use of long doubles.
+EOM
+ uselongdouble="$undef"
+ ;;
+ *) libswanted="$libswanted sunmath"
+ loclibpth="$loclibpth /opt/SUNWspro/lib"
+ ;;
+ esac
+ uselongdouble_done=yes
+ ;;
+esac
+EOCBU
+
+# Actually, we want to run this already now, if so requested,
+# because we need to fix up things right now.
+case "$uselongdouble" in
+"$define"|true|[yY]*)
+ . ./UU/uselongdouble.cbu
+ ;;
+esac
+
+rm -f try.c try.o try
+# keep that leading tab
+ ccisworkshop=''
+ ccisgcc=''
+
# This is just a trick to include some useful notes.
cat > /dev/null <<'End_of_Solaris_Notes'
@@ -440,5 +629,51 @@ Date: 25 Jul 1995 12:20:18 GMT
Perl 5 compiled out of the box.
+7.0) 64-bitness, from Alan Burlison (added by jhi 2000-02-21)
+
+ You need a machine running Solaris 2.7 or above.
+
+ Here's some rules:
+
+ 1. Solaris 2.7 and above will run in either 32 bit or 64 bit mode,
+ via a reboot.
+ 2. You can build 64 bit apps whilst running 32 bit mode and vice-versa.
+ 3. 32 bit apps will run under Solaris running in either 32 or 64 bit mode.
+ 4. 64 bit apps require Solaris to be running 64 bit mode
+ 5. It is possible to select the appropriate 32 or 64 bit version of an
+ app at run-time using isaexec(3).
+ 6. You can detect the OS mode using "isainfo -v", e.g.
+ fubar$ isainfo -v # Ultra 30 in 64 bit mode
+ 64-bit sparcv9 applications
+ 32-bit sparc applications
+ 7. To compile 64 bit you need to use the flag "-xarch=v9".
+ getconf(1) will tell you this, e.g.
+ fubar$ getconf -a | grep v9
+ XBS5_LP64_OFF64_CFLAGS: -xarch=v9
+ XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
+ XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
+ XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
+ XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
+ XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
+ _XBS5_LP64_OFF64_CFLAGS: -xarch=v9
+ _XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
+ _XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
+ _XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
+ _XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
+ _XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
+
+ > > Now, what should we do, then? Should -Duse64bits in a v9 box cause
+ > > Perl to compiled in v9 mode? Or should we for compatibility stick
+ > > with 32 bit builds and let the people in the know to add the -xarch=v9
+ > > to ccflags (and ldflags?)?
+
+ > I think the second (explicit) mechanism should be the default. Unless
+ > you want to allocate more than ~ 4Gb of memory inside Perl, you don't
+ > need Perl to be a 64-bit app. Put it this way, on a machine running
+ > Solaris 8, there are 463 executables under /usr/bin, but only 15 of
+ > those require 64 bit versions - mainly because they invade the kernel
+ > address space, e.g. adb, kgmon etc. Certainly we don't recommend users
+ > to build 64 bit apps unless they need the address space.
+
End_of_Solaris_Notes
diff --git a/contrib/perl5/hints/sunos_4_1.sh b/contrib/perl5/hints/sunos_4_1.sh
index 4585d79..af0bca1 100644
--- a/contrib/perl5/hints/sunos_4_1.sh
+++ b/contrib/perl5/hints/sunos_4_1.sh
@@ -25,8 +25,20 @@ d_tzname='undef'
# The gcc fix-includes script exposes those incorrect prototypes.
# There may be other examples as well. Volunteers are welcome to
# track them all down :-). In the meantime, we'll just skip unistd.h
-# for SunOS in most of the code. (However, see ext/POSIX/hints/sunos_4.pl.)
+# for SunOS in most of the code.
+# However, see ext/POSIX/hints/sunos_4.pl for one exception.
i_unistd='undef'
+# See util.c for another: We need _SC_OPEN_MAX, which is in
+# <unistd.h>.
+
+# fflush(NULL) will core dump on SunOS 4.1.3. In util.c we'll
+# try explicitly fflushing all open files. Unfortunately,
+# on my SunOS 4.1.3 system, sysconf(_SC_OPEN_MAX) returns
+# 64, but only 32 of those file pointers can be accessed
+# directly by _iob[i]. The remainder are off in dynamically
+# allocated memory somewhere and I don't know to automatically
+# fflush() them. -- Andy Dougherty Wed May 26 15:25:22 EDT 1999
+util_cflags='ccflags="$ccflags -DPERL_FFLUSH_ALL_FOPEN_MAX=32"'
cat << 'EOM' >&4
diff --git a/contrib/perl5/hints/svr4.sh b/contrib/perl5/hints/svr4.sh
index cf6906d..8109b39 100644
--- a/contrib/perl5/hints/svr4.sh
+++ b/contrib/perl5/hints/svr4.sh
@@ -142,12 +142,3 @@ d_lstat=define
d_suidsafe='define' # "./Configure -d" can't figure this out easilly
-cat <<'EOM' >&4
-
-If you wish to use dynamic linking, you must use
- LD_LIBRARY_PATH=`pwd`; export LD_LIBRARY_PATH
-or
- setenv LD_LIBRARY_PATH `pwd`
-before running make.
-
-EOM
diff --git a/contrib/perl5/hints/svr5.sh b/contrib/perl5/hints/svr5.sh
new file mode 100644
index 0000000..f736895
--- /dev/null
+++ b/contrib/perl5/hints/svr5.sh
@@ -0,0 +1,221 @@
+# svr5 hints, System V Release 5.x (UnixWare 7)
+# mods after mail fm Andy Dougherty
+# Reworked by hops@sco.com Sept/Oct 1999 for UW7.1 platform support
+# Boyd Gerber, gerberb@zenez.com 1999/09/21 for threads support.
+# Originally taken from svr4 hints.sh 21-Sep-98 hops@sco.com
+# which was version of 1996/10/25 by Tye McQueen, tye@metronet.com
+
+# Use Configure -Dusethreads to enable threads.
+# Use Configure -Dcc=gcc to use gcc.
+case "$cc" in
+*gcc*)
+ # "$gccversion" not set yet
+ vers=`gcc -v 2>&1 | sed -n -e 's@.*version \([^ ][^ ]*\) .*@\1@p'`
+ case $vers in
+ *2.95*)
+ ccflags='-fno-strict-aliasing'
+ # More optimisation provided in gcc-2.95 causes miniperl to segv.
+ # -fno-strict-aliasing is supposed to correct this but
+ # if it doesn't and you get segv when the build runs miniperl then
+ # disable optimisation as below
+ # optimize=' '
+ ;;
+ esac
+ ;;
+esac
+
+# Hardwire the processor to 586 for consistancy with autoconf
+# archname='i586-svr5'
+# -- seems this is generally disliked by perl porters so leave it to float
+
+# Our default setup excludes anything from /usr/ucblib (and consequently dbm)
+# as later modules assume symbols found are available in shared libs
+# On svr5 these are static archives which causes problems for
+# dynamic modules loaded later (and ucblib is a bad dream anyway)
+#
+# However there is a dbm library built from the ucb sources outside ucblib
+# at http://www.sco.com/skunkware (installing into /usr/local) so if we
+# detect this we'll use it. You can change the default
+# (to allow ucblib and its dbm or disallowing non ucb dbm) by
+# changing 'want_*' config values below to '' to disable or otherwise to enable
+
+# Leave leading tabs so Configure doesn't propagate variables to config.sh
+
+ want_ucb='' # don't use anything from /usr/ucblib - icky
+ want_dbm='yes' # use dbm if can find library in /usr/local/lib
+ want_gdbm='yes' # use gdbm if can find library in /usr/local/lib
+ want_udk70='' # link with old static libc pieces
+ # link with udk70 if building on 7.1 abd want resulting binary
+ # to run on uw7.0* - it will link in referenced static symbols
+ # of libc that are (now) in the shared libc.so on 7.1 but were
+ # not there in 7.0.
+ # There are still scenarios where this is still insufficient so
+ # overall it is preferable to get ptf7051e
+ # ftp://ftp.sco.com/SLS/ptf7051e.Z
+ # installed on any/all 7.0 systems and leave the above unset.
+
+if [ "$want_ucb" ] ; then
+ ldflags= '-L/usr/ucblib'
+ ccflags='-I/usr/ucbinclude'
+ # /usr/ccs/include and /usr/ccs/lib are used implicitly by cc as reqd
+else
+ libswanted=`echo " $libswanted " | sed -e 's/ ucb / /'`
+ glibpth=`echo " $glibpth " | sed -e 's/ \/usr\/ucblib / /'`
+
+ # If see libdbm in /usr/local and not overidden assume its the
+ # non ucblib rebuild from skunkware and use it
+ if [ ! -f /usr/local/lib/libdbm.so -o ! "$want_dbm" ] ; then
+ i_dbm='undef'
+ libswanted=`echo " $libswanted " | sed -e 's/ dbm / /'`
+ fi
+fi
+
+if [ ! "$want_gdbm" ] ; then
+ i_gdbm='undef'
+ libswanted=`echo " $libswanted " | sed -e 's/ gdbm / /'`
+fi
+
+
+# Don't use problematic libraries:
+# libmalloc.a - Probably using Perl's malloc() anyway.
+# libc: on UW7 don't want -lc explicitly as native cc gives warnings/errors
+libswanted=`echo " $libswanted " | sed -e 's/ malloc / /' -e 's/ c / /'`
+
+# remove /shlib and /lib from library search path as both symlink to /usr/lib
+# where runtime shared libc is
+glibpth=`echo " $glibpth " | sed -e 's/ \/shlib / /' -e 's/ \/lib / /`
+
+# Don't use BSD emulation pieces (/usr/ucblib) regardless
+# these would probably be autonondetected anyway but ...
+d_Gconvert='gcvt((x),(n),(b))' # Try gcvt() before gconvert().
+d_bcopy='undef' d_bcmp='undef' d_bzero='undef' d_safebcpy='undef'
+d_index='undef' d_killpg='undef' d_getprior='undef' d_setprior='undef'
+d_setlinebuf='undef'
+d_setregid='undef' d_setreuid='undef' # -- in /usr/lib/libc.so.1
+
+
+# Broken C-Shell tests (Thanks to Tye McQueen):
+# The OS-specific checks may be obsoleted by the this generic test.
+ sh_cnt=`sh -c 'echo /*' | wc -c`
+ csh_cnt=`csh -f -c 'glob /*' 2>/dev/null | wc -c`
+ csh_cnt=`expr 1 + $csh_cnt`
+if [ "$sh_cnt" -ne "$csh_cnt" ]; then
+ echo "You're csh has a broken 'glob', disabling..." >&2
+ d_csh='undef'
+fi
+
+# Unixware-specific problems. UW7 give correctname with uname -s
+# UnixWare has a broken csh. (This might already be detected above).
+# Configure can't detect memcpy or memset on Unixware 2 or 7
+#
+# Leave leading tabs on the next two lines so Configure doesn't
+# propagate these variables to config.sh
+ uw_ver=`uname -v`
+ uw_isuw=`uname -s 2>&1`
+
+if [ "$uw_isuw" = "UnixWare" ]; then
+ case $uw_ver in
+ 7.1*)
+ d_csh='undef'
+ d_memcpy='define'
+ d_memset='define'
+ stdio_cnt='((fp)->__cnt)'
+ d_stdio_cnt_lval='define'
+ stdio_ptr='((fp)->__ptr)'
+ d_stdio_ptr_lval='define'
+
+ d_bcopy='define' # In /usr/lib/libc.so.1
+ d_setregid='define' # "
+ d_setreuid='define' # "
+
+ if [ -f /usr/ccs/lib/libcudk70.a -a "$want_udk70" ] ; then
+ libswanted=" $libswanted cudk70"
+ fi
+ ;;
+ 7*)
+ d_csh='undef'
+ d_memcpy='define'
+ d_memset='define'
+ stdio_cnt='((fp)->__cnt)'
+ d_stdio_cnt_lval='define'
+ stdio_ptr='((fp)->__ptr)'
+ d_stdio_ptr_lval='define'
+ ;;
+ esac
+fi
+# End of Unixware-specific tests.
+
+###############################################################
+# Dynamic loading section: Is default so it should just happen.
+# set below to explicitly force.
+# usedl='define'
+# dlext='so'
+# dlsrc='dl_dlopen.xs'
+#
+# ccdlflags : must tell the linker to export all global symbols
+# cccdlflags: must tell the compiler to generate relocatable code
+# lddlflags : must tell the linker to output a shared library
+
+# use shared perl lib
+useshrplib='true'
+
+case "$cc" in
+ *gcc*)
+ ccdlflags='-Xlinker -Bexport '
+ cccdlflags='-fpic'
+ lddlflags='-G '
+ ;;
+
+ *)
+ ccdlflags='-Wl,-Bexport'
+ cccdlflags='-Kpic'
+ lddlflags='-G -Wl,-Bexport'
+ ;;
+esac
+
+############################################################################
+# Thread support
+# use Configure -Dusethreads to enable
+# This script UU/usethreads.cbu will get 'called-back' by Configure
+# after it has prompted the user for whether to use threads.
+cat > UU/usethreads.cbu <<'EOCBU'
+case "$usethreads" in
+$define|true|[yY]*)
+ ccflags="$ccflags"
+ shift
+ libswanted="$*"
+ case "$cc" in
+ *gcc*)
+ ccflags="-D_REENTRANT $ccflags -fpic -pthread"
+ cccdlflags='-fpic'
+ lddlflags='-pthread -G '
+ ;;
+ *)
+ ccflags="-D_REENTRANT $ccflags -KPIC -Kthread"
+ ccdlflags='-Kthread -Wl,-Bexport'
+ cccdlflags='-KPIC -Kthread'
+ lddlflags='-G -Kthread -Wl,-Bexport '
+ ldflags='-Kthread'
+ ;;
+ esac
+esac
+EOCBU
+
+
+d_suidsafe='define' # "./Configure -d" can't figure this out easily
+
+################## final caveat msgs to builder ###############
+cat <<'EOM' >&4
+
+If you wish to use dynamic linking, you must use
+ LD_LIBRARY_PATH=`pwd`; export LD_LIBRARY_PATH
+or
+ setenv LD_LIBRARY_PATH `pwd`
+before running make.
+
+If you are using shared libraries from /usr/local/lib
+for libdbm or libgdbm you may need to set
+ LD_RUN_PATH=/usr/local/lib; export LD_RUN_PATH
+in order for Configure to compile the simple test program
+
+EOM
diff --git a/contrib/perl5/hints/ultrix_4.sh b/contrib/perl5/hints/ultrix_4.sh
index 7b841e5..f418ea1 100644
--- a/contrib/perl5/hints/ultrix_4.sh
+++ b/contrib/perl5/hints/ultrix_4.sh
@@ -34,16 +34,16 @@ case "$cc" in
*gcc*) ;;
*)
case "$osvers" in
- *4.1*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3400" ;;
- *4.2*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3400"
+ *4.1*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3800" ;;
+ *4.2*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3800"
# Prototypes sometimes cause compilation errors in 4.2.
prototype=undef
case "$myuname" in
*risc*) d_volatile=undef ;;
esac
;;
- *4.3*) ccflags="$ccflags -std1 -DLANGUAGE_C -Olimit 3400" ;;
- *) ccflags="$ccflags -std -Olimit 3400" ;;
+ *4.3*) ccflags="$ccflags -std1 -DLANGUAGE_C -Olimit 3800" ;;
+ *) ccflags="$ccflags -std -Olimit 3800" ;;
esac
;;
esac
@@ -64,3 +64,7 @@ groupstype='int'
# configure test should be beefed up to try using the field when
# it can't find any of the standardly-named fields.
d_dirnamlen='define'
+
+# Ultrix can mmap only character devices, not regular files,
+# which is rather useless state of things for Perl.
+d_mmap='undef'
diff --git a/contrib/perl5/hints/unicos.sh b/contrib/perl5/hints/unicos.sh
index ab0203b..7ffd73f 100644
--- a/contrib/perl5/hints/unicos.sh
+++ b/contrib/perl5/hints/unicos.sh
@@ -14,3 +14,5 @@ case "$usemymalloc" in
usemymalloc='n'
;;
esac
+# Configure gets fooled for some reason. There is no getpgid().
+d_getpgid='undef'
diff --git a/contrib/perl5/hints/unicosmk.sh b/contrib/perl5/hints/unicosmk.sh
index f0b63cb..f3416ff 100644
--- a/contrib/perl5/hints/unicosmk.sh
+++ b/contrib/perl5/hints/unicosmk.sh
@@ -8,3 +8,25 @@ case "$usemymalloc" in
ccflags="$ccflags -DNO_RCHECK"
;;
esac
+# If somebody ignores the Cray PATH.
+case ":$PATH:" in
+*:/opt/ctl/bin:*) ;;
+'') case "$cc" in
+ '') test -x /opt/ctl/bin/cc && cc=/opt/ctl/bin/cc ;;
+ esac
+ ;;
+esac
+# As of UNICOS/mk 2.0.5.24 the shm* are in libc but unimplemented
+# (an attempt to use them causes a runtime error)
+# XXX Configure probe for really functional shm*() is needed XXX
+if test "$d_shm" = ""; then
+ d_shmat=${d_shmat:-undef}
+ d_shmdt=${d_shmdt:-undef}
+ d_shmget=${d_shmget:-undef}
+ d_shmctl=${d_shmctl:-undef}
+ case "$d_shmat$d_shmctl$d_shmdt$d_shmget" in
+ *"undef"*) d_shm="$undef" ;;
+ esac
+fi
+
+
diff --git a/contrib/perl5/hints/vmesa.sh b/contrib/perl5/hints/vmesa.sh
new file mode 100644
index 0000000..bc03387
--- /dev/null
+++ b/contrib/perl5/hints/vmesa.sh
@@ -0,0 +1,338 @@
+# hints/vmesa.sh
+#
+# VM/ESA hints by Neale Ferguson (neale@mailbox.tabnsw.com.au)
+#
+# Currently (1999-Jan-09) Configure cannot be used in VM/ESA because
+# too many things are done differently in the C compiler environment.
+# Therefore the hints file is hand-crafted. --jhi@iki.fi
+#
+
+case "$archname" in
+'') archname="$osname" ;;
+esac
+bin='/usr/local/bin'
+binexp='/usr/local/bin'
+byacc='byacc'
+c='\c'
+cc='c89'
+ccflags="-D_OE_SOCKETS -DOLD_PTHREADS_API -DYYDYNAMIC -DDEBUGGING -I.." \
+ "-I/usr/local/include -W c,hwopts\\\(string\\\),langlvl\\\(ansi\\\)"
+clocktype='clock_t'
+cryptlib="n"
+d_Gconvert='gcvt((x),(n),(b))'
+d_access='define'
+d_alarm='define'
+d_archlib='define'
+# randbits='15'
+archobjs="ebcdic.o vmesa.o"
+d_attribut='undef'
+d_bcmp='define'
+d_bcopy='define'
+d_bsd='undef'
+d_bsdgetpgrp='undef'
+d_bsdsetpgrp='undef'
+d_bzero='define'
+d_casti32='define'
+d_castneg='define'
+d_charvspr='undef'
+d_chown='define'
+d_chroot='undef'
+d_chsize='undef'
+d_closedir='define'
+d_const='define'
+d_crypt='undef'
+d_csh='undef'
+d_cuserid='define'
+d_dbl_dig='define'
+d_difftime='define'
+d_dirnamlen='undef'
+d_dlerror='define'
+d_dlopen='define'
+d_dlsymun='define'
+d_dosuid='undef'
+d_dup2='define'
+d_endgrent='undef'
+d_endpwent='undef'
+d_eofnblk='define'
+d_eunice='undef'
+d_fchmod='define'
+d_fchown='define'
+d_fcntl='define'
+d_fd_macros='define'
+d_fd_set='define'
+d_fds_bits='define'
+d_fgetpos='define'
+d_flexfnam='define'
+d_flock='undef'
+d_fork='undef'
+d_fpathconf='define'
+d_fsetpos='define'
+d_ftime='undef'
+d_getgrent='undef'
+d_gethent='define'
+d_gethname='undef'
+d_getlogin='define'
+d_getpgid='undef'
+d_getpgrp='define'
+d_getpgrp2='undef'
+d_getppid='define'
+d_getprior='undef'
+d_getpwent='undef'
+d_gettimeod='define'
+d_gnulibc='undef'
+d_htonl='define'
+d_index='define'
+d_inetaton='undef'
+d_isascii='define'
+d_killpg='define'
+d_link='define'
+d_locconv='define'
+d_lockf='define'
+d_longdbl='undef'
+d_longllong='undef'
+d_lstat='define'
+d_mblen='define'
+d_mbstowcs='define'
+d_mbtowc='define'
+d_memcmp='define'
+d_memcpy='define'
+d_memmove='define'
+d_memset='define'
+d_mkdir='define'
+d_mkfifo='define'
+d_mktime='define'
+d_msg='define'
+d_msgctl='define'
+d_msgget='define'
+d_msgrcv='define'
+d_msgsnd='define'
+d_mymalloc='undef'
+d_nice='undef'
+d_oldsock='undef'
+d_open3='define'
+d_pathconf='define'
+d_pause='define'
+d_phostname='undef'
+d_pipe='define'
+d_poll='undef'
+d_portable='define'
+d_pwage='undef'
+d_pwchange='undef'
+d_pwclass='undef'
+d_pwcomment='undef'
+d_pwexpire='undef'
+d_pwquota='undef'
+d_readdir='define'
+d_readlink='define'
+d_rename='define'
+d_rewinddir='define'
+d_rmdir='define'
+d_safebcpy='define'
+d_safemcpy='undef'
+d_sanemcmp='define'
+d_sched_yield='undef'
+d_seekdir='undef'
+d_select='define'
+d_sem='define'
+d_semctl='define'
+d_semctl_semid_ds='define'
+d_semget='define'
+d_semop='define'
+d_setegid='define'
+d_seteuid='define'
+d_setgrent='undef'
+d_setgrps='undef'
+d_setlinebuf='undef'
+d_setlocale='define'
+d_setpgid='define'
+d_setpgrp='define'
+d_setpgrp2='undef'
+d_setprior='undef'
+d_setpwent='undef'
+d_setregid='undef'
+d_setresgid='undef'
+d_setresuid='undef'
+d_setreuid='undef'
+d_setrgid='undef'
+d_setruid='undef'
+d_setsid='define'
+d_sfio='undef'
+d_shm='define'
+d_shmat='define'
+d_shmatprototype='define'
+d_shmctl='define'
+d_shmdt='define'
+d_shmget='define'
+d_sigaction='define'
+d_sigsetjmp='define'
+d_socket='define'
+d_sockpair='undef'
+d_statblks='undef'
+d_stdio_cnt_lval='undef'
+d_stdio_ptr_lval='undef'
+d_stdiobase='undef'
+d_stdstdio='undef'
+d_strchr='define'
+d_strcoll='define'
+d_strctcpy='undef'
+d_strerrm='strerror(e)'
+d_strerror='define'
+d_strtod='define'
+d_strtol='define'
+d_strtoul='define'
+d_strxfrm='define'
+d_suidsafe='undef'
+d_symlink='define'
+d_syscall='undef'
+d_sysconf='define'
+d_sysernlst="n"
+d_syserrlst='undef'
+d_system='define'
+d_tcgetpgrp='define'
+d_tcsetpgrp='define'
+d_telldir='undef'
+d_time='define'
+d_times='define'
+d_truncate='define'
+d_tzname='define'
+d_umask='define'
+d_uname='define'
+d_union_semun='undef'
+d_vfork='define'
+d_void_closedir='undef'
+d_voidsig='define'
+d_voidtty="n"
+d_volatile='define'
+d_vprintf='define'
+d_waitpid='define'
+d_wait4='undef'
+d_wcstombs='define'
+d_wctomb='define'
+d_xenix='undef'
+db_hashtype='u_int32_t'
+db_prefixtype='size_t'
+direntrytype='struct dirent'
+dlext='none'
+dlsrc='dl_vmesa.xs'
+dynamic_ext=''
+eagain='EAGAIN'
+ebcdic='define'
+exe_ext=''
+extensions='Fcntl GDBM_File IO NDBM_File Opcode POSIX Socket IPC/SysV Errno Thread attrs re Data/dumper'
+fpostype='fpos_t'
+freetype='void'
+groupstype='gid_t'
+h_fcntl='false'
+h_sysfile='true'
+hint='recommended'
+i_arpainet="define"
+i_bsdioctl="n"
+i_db='undef'
+i_dbm='define'
+i_dirent='define'
+i_dld='define'
+i_dlfcn='define'
+i_fcntl='undef'
+i_float='define'
+i_gdbm='define'
+i_grp='define'
+i_limits='define'
+i_locale='define'
+i_malloc='undef'
+i_math='define'
+i_memory='define'
+i_ndbm='define'
+i_neterrno='undef'
+i_niin='define'
+i_pwd='define'
+i_rpcsvcdbm='undef'
+i_sfio='undef'
+i_sgtty='undef'
+i_stdarg='define'
+i_stddef='define'
+i_stdlib='define'
+i_string='define'
+i_sysdir='define'
+i_sysfile='define'
+i_sysfilio='undef'
+i_sysin='undef'
+i_sysioctl='define'
+i_sysndir='undef'
+i_sysparam='undef'
+i_sysresrc='define'
+i_sysselct='undef'
+i_syssockio="n"
+i_sysstat='define'
+i_systime='define'
+i_systimek='undef'
+i_systimes='define'
+i_systypes='define'
+i_sysun='define'
+i_syswait='define'
+i_termio='undef'
+i_termios='define'
+i_time='undef'
+i_unistd='define'
+i_utime='define'
+i_values='undef'
+i_varargs='undef'
+i_varhdr='stdarg.h'
+i_vfork='undef'
+ld='c89'
+ldflags='-L/usr/local/lib -L.'
+lib_ext='.a'
+libc=''
+libperl='libperl.a'
+libpth='/usr/local/lib /lib /usr/lib'
+libs='-l//posxsock -l//vmmtlib -lgdbm -lxpg4'
+libswanted='gdbm'
+lint="n"
+locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include'
+loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib'
+make_set_make='#'
+make='gnumake'
+mallocobj=''
+mallocsrc=''
+malloctype='void *'
+models='none'
+netdb_hlen_type='size_t'
+netdb_host_type='char *'
+netdb_name_type='const char *'
+netdb_net_type='in_addr_t'
+o_nonblock='O_NONBLOCK'
+obj_ext='.o'
+optimize='undef'
+prefix='/usr/local'
+prefixexp='/usr/local'
+prototype='define'
+ranlib=':'
+rd_nodata='-1'
+scriptdir='/usr/local/bin'
+scriptdirexp='/usr/local/bin'
+selecttype='fd_set *'
+shmattype='void *'
+shrpenv=''
+signal_t='void'
+sig_name_init='"ZERO","HUP","INT","ABRT","ILL","POLL","URG","STOP","FPE","KILL","BUS","SEGV","SYS","PIPE","ALRM","TERM","USR1","USR2","NUM18","CONT","CHLD","TTIN","TTOU","IO","QUIT","TSTP","TRAP","NUM27","WINCH","XCPU","XFSZ","VTALRM","PROF","NUM33","NUM34","NUM35","NUM36","NUM3","NUM38","NUM39","NUM40","NUM41","NUM42","NUM43","NUM44","NUM45","NUM46","NUM47","NUM48","NUM49","CLD"'
+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,20 '
+sizetype='size_t'
+so='.a'
+ssizetype='ssize_t'
+static_ext='Data/Dumper Fcntl GDBM_File IO IPC/SysV NDBM_File Opcode POSIX Socket Thread attrs re'
+stdchar='char'
+stdio_cnt='(fp)->__countIn'
+stdio_ptr='(fp)->__bufPtr'
+timeincl='sys/time.h '
+timetype='time_t'
+uidtype='uid_t'
+usedl='define'
+usemymalloc='n'
+usenm='false'
+useopcode='true'
+useperlio='undef'
+useposix='true'
+usesfio='false'
+useshrplib='false'
+usethreads='y'
+usevfork='true'
+vi='x'
diff --git a/contrib/perl5/hv.c b/contrib/perl5/hv.c
index e0091ea..44d37e3 100644
--- a/contrib/perl5/hv.c
+++ b/contrib/perl5/hv.c
@@ -1,6 +1,6 @@
/* hv.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -12,24 +12,11 @@
*/
#include "EXTERN.h"
+#define PERL_IN_HV_C
#include "perl.h"
-static void hv_magic_check _((HV *hv, bool *needs_copy, bool *needs_store));
-#ifndef PERL_OBJECT
-static void hsplit _((HV *hv));
-static void hfreeentries _((HV *hv));
-static void more_he _((void));
-#endif
-
-#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
-# define ARRAY_ALLOC_BYTES(size) ( (size)*sizeof(HE*) )
-#else
-# define MALLOC_OVERHEAD 16
-# define ARRAY_ALLOC_BYTES(size) ( (size)*sizeof(HE*)*2 - MALLOC_OVERHEAD )
-#endif
-
STATIC HE*
-new_he(void)
+S_new_he(pTHX)
{
HE* he;
LOCK_SV_MUTEX;
@@ -42,7 +29,7 @@ new_he(void)
}
STATIC void
-del_he(HE *p)
+S_del_he(pTHX_ HE *p)
{
LOCK_SV_MUTEX;
HeNEXT(p) = (HE*)PL_he_root;
@@ -51,7 +38,7 @@ del_he(HE *p)
}
STATIC void
-more_he(void)
+S_more_he(pTHX)
{
register HE* he;
register HE* heend;
@@ -65,8 +52,20 @@ more_he(void)
HeNEXT(he) = 0;
}
+#ifdef PURIFY
+
+#define new_HE() (HE*)safemalloc(sizeof(HE))
+#define del_HE(p) safefree((char*)p)
+
+#else
+
+#define new_HE() new_he()
+#define del_HE(p) del_he(p)
+
+#endif
+
STATIC HEK *
-save_hek(char *str, I32 len, U32 hash)
+S_save_hek(pTHX_ const char *str, I32 len, U32 hash)
{
char *k;
register HEK *hek;
@@ -81,16 +80,59 @@ save_hek(char *str, I32 len, U32 hash)
}
void
-unshare_hek(HEK *hek)
+Perl_unshare_hek(pTHX_ HEK *hek)
{
unsharepvn(HEK_KEY(hek),HEK_LEN(hek),HEK_HASH(hek));
}
+#if defined(USE_ITHREADS)
+HE *
+Perl_he_dup(pTHX_ HE *e, bool shared)
+{
+ HE *ret;
+
+ if (!e)
+ return Nullhe;
+ /* look for it in the table first */
+ ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
+ if (ret)
+ return ret;
+
+ /* create anew and remember what it is */
+ ret = new_HE();
+ ptr_table_store(PL_ptr_table, e, ret);
+
+ HeNEXT(ret) = he_dup(HeNEXT(e),shared);
+ if (HeKLEN(e) == HEf_SVKEY)
+ HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e)));
+ else if (shared)
+ HeKEY_hek(ret) = share_hek(HeKEY(e), HeKLEN(e), HeHASH(e));
+ else
+ HeKEY_hek(ret) = save_hek(HeKEY(e), HeKLEN(e), HeHASH(e));
+ HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e)));
+ return ret;
+}
+#endif /* USE_ITHREADS */
+
/* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
* contains an SV* */
+/*
+=for apidoc hv_fetch
+
+Returns the SV which corresponds to the specified key in the hash. The
+C<klen> is the length of the key. If C<lval> is set then the fetch will be
+part of a store. Check that the return value is non-null before
+dereferencing it to a C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+=cut
+*/
+
SV**
-hv_fetch(HV *hv, char *key, U32 klen, I32 lval)
+Perl_hv_fetch(pTHX_ HV *hv, const char *key, U32 klen, I32 lval)
{
register XPVHV* xhv;
register U32 hash;
@@ -113,7 +155,7 @@ hv_fetch(HV *hv, char *key, U32 klen, I32 lval)
U32 i;
for (i = 0; i < klen; ++i)
if (isLOWER(key[i])) {
- char *nkey = strupr(SvPVX(sv_2mortal(newSVpv(key,klen))));
+ char *nkey = strupr(SvPVX(sv_2mortal(newSVpvn(key,klen))));
SV **ret = hv_fetch(hv, nkey, klen, 0);
if (!ret && lval)
ret = hv_store(hv, key, klen, NEWSV(61,0), 0);
@@ -130,7 +172,8 @@ hv_fetch(HV *hv, char *key, U32 klen, I32 lval)
|| (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
#endif
)
- Newz(503,xhv->xhv_array, ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
+ Newz(503, xhv->xhv_array,
+ PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
else
return 0;
}
@@ -149,13 +192,13 @@ hv_fetch(HV *hv, char *key, U32 klen, I32 lval)
}
#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
- char *gotenv;
-
- if ((gotenv = PerlEnv_getenv(key)) != Nullch) {
- sv = newSVpv(gotenv,strlen(gotenv));
- SvTAINTED_on(sv);
- return hv_store(hv,key,klen,sv,hash);
- }
+ unsigned long len;
+ char *env = PerlEnv_ENVgetenv_len(key,&len);
+ if (env) {
+ sv = newSVpvn(env,len);
+ SvTAINTED_on(sv);
+ return hv_store(hv,key,klen,sv,hash);
+ }
}
#endif
if (lval) { /* gonna assign to this, so it better be there */
@@ -167,8 +210,25 @@ hv_fetch(HV *hv, char *key, U32 klen, I32 lval)
/* returns a HE * structure with the all fields set */
/* note that hent_val will be a mortal sv for MAGICAL hashes */
+/*
+=for apidoc hv_fetch_ent
+
+Returns the hash entry which corresponds to the specified key in the hash.
+C<hash> must be a valid precomputed hash number for the given C<key>, or 0
+if you want the function to compute it. IF C<lval> is set then the fetch
+will be part of a store. Make sure the return value is non-null before
+accessing it. The return value when C<tb> is a tied hash is a pointer to a
+static location, so be sure to make a copy of the structure if you need to
+store it somewhere.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+=cut
+*/
+
HE *
-hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash)
+Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
{
register XPVHV* xhv;
register char *key;
@@ -200,7 +260,7 @@ hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash)
key = SvPV(keysv, klen);
for (i = 0; i < klen; ++i)
if (isLOWER(key[i])) {
- SV *nkeysv = sv_2mortal(newSVpv(key,klen));
+ SV *nkeysv = sv_2mortal(newSVpvn(key,klen));
(void)strupr(SvPVX(nkeysv));
entry = hv_fetch_ent(hv, nkeysv, 0, 0);
if (!entry && lval)
@@ -218,7 +278,8 @@ hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash)
|| (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
#endif
)
- Newz(503,xhv->xhv_array, ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
+ Newz(503, xhv->xhv_array,
+ PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
else
return 0;
}
@@ -240,13 +301,13 @@ hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash)
}
#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
- char *gotenv;
-
- if ((gotenv = PerlEnv_getenv(key)) != Nullch) {
- sv = newSVpv(gotenv,strlen(gotenv));
- SvTAINTED_on(sv);
- return hv_store_ent(hv,keysv,sv,hash);
- }
+ unsigned long len;
+ char *env = PerlEnv_ENVgetenv_len(key,&len);
+ if (env) {
+ sv = newSVpvn(env,len);
+ SvTAINTED_on(sv);
+ return hv_store_ent(hv,keysv,sv,hash);
+ }
}
#endif
if (lval) { /* gonna assign to this, so it better be there */
@@ -256,8 +317,8 @@ hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash)
return 0;
}
-static void
-hv_magic_check (HV *hv, bool *needs_copy, bool *needs_store)
+STATIC void
+S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
{
MAGIC *mg = SvMAGIC(hv);
*needs_copy = FALSE;
@@ -275,8 +336,26 @@ hv_magic_check (HV *hv, bool *needs_copy, bool *needs_store)
}
}
+/*
+=for apidoc hv_store
+
+Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
+the length of the key. The C<hash> parameter is the precomputed hash
+value; if it is zero then Perl will compute it. The return value will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes). Otherwise it can
+be dereferenced to get the original C<SV*>. Note that the caller is
+responsible for suitably incrementing the reference count of C<val> before
+the call, and decrementing it if the function returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+=cut
+*/
+
SV**
-hv_store(HV *hv, char *key, U32 klen, SV *val, register U32 hash)
+Perl_hv_store(pTHX_ HV *hv, const char *key, U32 klen, SV *val, register U32 hash)
{
register XPVHV* xhv;
register I32 i;
@@ -297,7 +376,7 @@ hv_store(HV *hv, char *key, U32 klen, SV *val, register U32 hash)
return 0;
#ifdef ENV_IS_CASELESS
else if (mg_find((SV*)hv,'E')) {
- SV *sv = sv_2mortal(newSVpv(key,klen));
+ SV *sv = sv_2mortal(newSVpvn(key,klen));
key = strupr(SvPVX(sv));
hash = 0;
}
@@ -308,7 +387,8 @@ hv_store(HV *hv, char *key, U32 klen, SV *val, register U32 hash)
PERL_HASH(hash, key, klen);
if (!xhv->xhv_array)
- Newz(505, xhv->xhv_array, ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
+ Newz(505, xhv->xhv_array,
+ PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
i = 1;
@@ -325,7 +405,7 @@ hv_store(HV *hv, char *key, U32 klen, SV *val, register U32 hash)
return &HeVAL(entry);
}
- entry = new_he();
+ entry = new_HE();
if (HvSHAREKEYS(hv))
HeKEY_hek(entry) = share_hek(key, klen, hash);
else /* gotta do the real thing */
@@ -344,8 +424,27 @@ hv_store(HV *hv, char *key, U32 klen, SV *val, register U32 hash)
return &HeVAL(entry);
}
+/*
+=for apidoc hv_store_ent
+
+Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
+parameter is the precomputed hash value; if it is zero then Perl will
+compute it. The return value is the new hash entry so created. It will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes). Otherwise the
+contents of the return value can be accessed using the C<He???> macros
+described here. Note that the caller is responsible for suitably
+incrementing the reference count of C<val> before the call, and
+decrementing it if the function returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+=cut
+*/
+
HE *
-hv_store_ent(HV *hv, SV *keysv, SV *val, register U32 hash)
+Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, register U32 hash)
{
register XPVHV* xhv;
register char *key;
@@ -375,7 +474,7 @@ hv_store_ent(HV *hv, SV *keysv, SV *val, register U32 hash)
#ifdef ENV_IS_CASELESS
else if (mg_find((SV*)hv,'E')) {
key = SvPV(keysv, klen);
- keysv = sv_2mortal(newSVpv(key,klen));
+ keysv = sv_2mortal(newSVpvn(key,klen));
(void)strupr(SvPVX(keysv));
hash = 0;
}
@@ -389,7 +488,8 @@ hv_store_ent(HV *hv, SV *keysv, SV *val, register U32 hash)
PERL_HASH(hash, key, klen);
if (!xhv->xhv_array)
- Newz(505, xhv->xhv_array, ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
+ Newz(505, xhv->xhv_array,
+ PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
i = 1;
@@ -406,7 +506,7 @@ hv_store_ent(HV *hv, SV *keysv, SV *val, register U32 hash)
return entry;
}
- entry = new_he();
+ entry = new_HE();
if (HvSHAREKEYS(hv))
HeKEY_hek(entry) = share_hek(key, klen, hash);
else /* gotta do the real thing */
@@ -425,8 +525,19 @@ hv_store_ent(HV *hv, SV *keysv, SV *val, register U32 hash)
return entry;
}
+/*
+=for apidoc hv_delete
+
+Deletes a key/value pair in the hash. The value SV is removed from the
+hash and returned to the caller. The C<klen> is the length of the key.
+The C<flags> value will normally be zero; if set to G_DISCARD then NULL
+will be returned.
+
+=cut
+*/
+
SV *
-hv_delete(HV *hv, char *key, U32 klen, I32 flags)
+Perl_hv_delete(pTHX_ HV *hv, const char *key, U32 klen, I32 flags)
{
register XPVHV* xhv;
register I32 i;
@@ -455,7 +566,7 @@ hv_delete(HV *hv, char *key, U32 klen, I32 flags)
}
#ifdef ENV_IS_CASELESS
else if (mg_find((SV*)hv,'E')) {
- sv = sv_2mortal(newSVpv(key,klen));
+ sv = sv_2mortal(newSVpvn(key,klen));
key = strupr(SvPVX(sv));
}
#endif
@@ -482,8 +593,10 @@ hv_delete(HV *hv, char *key, U32 klen, I32 flags)
xhv->xhv_fill--;
if (flags & G_DISCARD)
sv = Nullsv;
- else
- sv = sv_mortalcopy(HeVAL(entry));
+ else {
+ sv = sv_2mortal(HeVAL(entry));
+ HeVAL(entry) = &PL_sv_undef;
+ }
if (entry == xhv->xhv_eiter)
HvLAZYDEL_on(hv);
else
@@ -494,8 +607,19 @@ hv_delete(HV *hv, char *key, U32 klen, I32 flags)
return Nullsv;
}
+/*
+=for apidoc hv_delete_ent
+
+Deletes a key/value pair in the hash. The value SV is removed from the
+hash and returned to the caller. The C<flags> value will normally be zero;
+if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
+precomputed hash value, or 0 to ask for it to be computed.
+
+=cut
+*/
+
SV *
-hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
+Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
{
register XPVHV* xhv;
register I32 i;
@@ -525,7 +649,7 @@ hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
#ifdef ENV_IS_CASELESS
else if (mg_find((SV*)hv,'E')) {
key = SvPV(keysv, klen);
- keysv = sv_2mortal(newSVpv(key,klen));
+ keysv = sv_2mortal(newSVpvn(key,klen));
(void)strupr(SvPVX(keysv));
hash = 0;
}
@@ -556,8 +680,10 @@ hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
xhv->xhv_fill--;
if (flags & G_DISCARD)
sv = Nullsv;
- else
- sv = sv_mortalcopy(HeVAL(entry));
+ else {
+ sv = sv_2mortal(HeVAL(entry));
+ HeVAL(entry) = &PL_sv_undef;
+ }
if (entry == xhv->xhv_eiter)
HvLAZYDEL_on(hv);
else
@@ -568,8 +694,17 @@ hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
return Nullsv;
}
+/*
+=for apidoc hv_exists
+
+Returns a boolean indicating whether the specified hash key exists. The
+C<klen> is the length of the key.
+
+=cut
+*/
+
bool
-hv_exists(HV *hv, char *key, U32 klen)
+Perl_hv_exists(pTHX_ HV *hv, const char *key, U32 klen)
{
register XPVHV* xhv;
register U32 hash;
@@ -589,18 +724,24 @@ hv_exists(HV *hv, char *key, U32 klen)
}
#ifdef ENV_IS_CASELESS
else if (mg_find((SV*)hv,'E')) {
- sv = sv_2mortal(newSVpv(key,klen));
+ sv = sv_2mortal(newSVpvn(key,klen));
key = strupr(SvPVX(sv));
}
#endif
}
xhv = (XPVHV*)SvANY(hv);
+#ifndef DYNAMIC_ENV_FETCH
if (!xhv->xhv_array)
return 0;
+#endif
PERL_HASH(hash, key, klen);
+#ifdef DYNAMIC_ENV_FETCH
+ if (!xhv->xhv_array) entry = Null(HE*);
+ else
+#endif
entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
for (; entry; entry = HeNEXT(entry)) {
if (HeHASH(entry) != hash) /* strings can't be equal */
@@ -611,12 +752,34 @@ hv_exists(HV *hv, char *key, U32 klen)
continue;
return TRUE;
}
+#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
+ if (HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME)) {
+ unsigned long len;
+ char *env = PerlEnv_ENVgetenv_len(key,&len);
+ if (env) {
+ sv = newSVpvn(env,len);
+ SvTAINTED_on(sv);
+ (void)hv_store(hv,key,klen,sv,hash);
+ return TRUE;
+ }
+ }
+#endif
return FALSE;
}
+/*
+=for apidoc hv_exists_ent
+
+Returns a boolean indicating whether the specified hash key exists. C<hash>
+can be a valid precomputed hash value, or 0 to ask for it to be
+computed.
+
+=cut
+*/
+
bool
-hv_exists_ent(HV *hv, SV *keysv, U32 hash)
+Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
{
register XPVHV* xhv;
register char *key;
@@ -639,7 +802,7 @@ hv_exists_ent(HV *hv, SV *keysv, U32 hash)
#ifdef ENV_IS_CASELESS
else if (mg_find((SV*)hv,'E')) {
key = SvPV(keysv, klen);
- keysv = sv_2mortal(newSVpv(key,klen));
+ keysv = sv_2mortal(newSVpvn(key,klen));
(void)strupr(SvPVX(keysv));
hash = 0;
}
@@ -647,13 +810,19 @@ hv_exists_ent(HV *hv, SV *keysv, U32 hash)
}
xhv = (XPVHV*)SvANY(hv);
+#ifndef DYNAMIC_ENV_FETCH
if (!xhv->xhv_array)
return 0;
+#endif
key = SvPV(keysv, klen);
if (!hash)
PERL_HASH(hash, key, klen);
+#ifdef DYNAMIC_ENV_FETCH
+ if (!xhv->xhv_array) entry = Null(HE*);
+ else
+#endif
entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
for (; entry; entry = HeNEXT(entry)) {
if (HeHASH(entry) != hash) /* strings can't be equal */
@@ -664,11 +833,23 @@ hv_exists_ent(HV *hv, SV *keysv, U32 hash)
continue;
return TRUE;
}
+#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
+ if (HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME)) {
+ unsigned long len;
+ char *env = PerlEnv_ENVgetenv_len(key,&len);
+ if (env) {
+ sv = newSVpvn(env,len);
+ SvTAINTED_on(sv);
+ (void)hv_store_ent(hv,keysv,sv,hash);
+ return TRUE;
+ }
+ }
+#endif
return FALSE;
}
STATIC void
-hsplit(HV *hv)
+S_hsplit(pTHX_ HV *hv)
{
register XPVHV* xhv = (XPVHV*)SvANY(hv);
I32 oldsize = (I32) xhv->xhv_max + 1; /* sic(k) */
@@ -682,21 +863,21 @@ hsplit(HV *hv)
PL_nomemok = TRUE;
#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
- Renew(a, ARRAY_ALLOC_BYTES(newsize), char);
+ Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
if (!a) {
PL_nomemok = FALSE;
return;
}
#else
#define MALLOC_OVERHEAD 16
- New(2, a, ARRAY_ALLOC_BYTES(newsize), char);
+ New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
if (!a) {
PL_nomemok = FALSE;
return;
}
Copy(xhv->xhv_array, a, oldsize * sizeof(HE*), char);
if (oldsize >= 64) {
- offer_nice_chunk(xhv->xhv_array, ARRAY_ALLOC_BYTES(oldsize));
+ offer_nice_chunk(xhv->xhv_array, PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
}
else
Safefree(xhv->xhv_array);
@@ -730,7 +911,7 @@ hsplit(HV *hv)
}
void
-hv_ksplit(HV *hv, IV newmax)
+Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
{
register XPVHV* xhv = (XPVHV*)SvANY(hv);
I32 oldsize = (I32) xhv->xhv_max + 1; /* sic(k) */
@@ -757,20 +938,20 @@ hv_ksplit(HV *hv, IV newmax)
if (a) {
PL_nomemok = TRUE;
#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
- Renew(a, ARRAY_ALLOC_BYTES(newsize), char);
+ Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
if (!a) {
PL_nomemok = FALSE;
return;
}
#else
- New(2, a, ARRAY_ALLOC_BYTES(newsize), char);
+ New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
if (!a) {
PL_nomemok = FALSE;
return;
}
Copy(xhv->xhv_array, a, oldsize * sizeof(HE*), char);
if (oldsize >= 64) {
- offer_nice_chunk(xhv->xhv_array, ARRAY_ALLOC_BYTES(oldsize));
+ offer_nice_chunk(xhv->xhv_array, PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
}
else
Safefree(xhv->xhv_array);
@@ -779,7 +960,7 @@ hv_ksplit(HV *hv, IV newmax)
Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
}
else {
- Newz(0, a, ARRAY_ALLOC_BYTES(newsize), char);
+ Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
}
xhv->xhv_max = --newsize;
xhv->xhv_array = a;
@@ -807,8 +988,16 @@ hv_ksplit(HV *hv, IV newmax)
}
}
+/*
+=for apidoc newHV
+
+Creates a new HV. The reference count is set to 1.
+
+=cut
+*/
+
HV *
-newHV(void)
+Perl_newHV(pTHX)
{
register HV *hv;
register XPVHV* xhv;
@@ -829,7 +1018,7 @@ newHV(void)
}
HV *
-newHVhv(HV *ohv)
+Perl_newHVhv(pTHX_ HV *ohv)
{
register HV *hv;
STRLEN hv_max = ohv ? HvMAX(ohv) : 0;
@@ -855,7 +1044,7 @@ newHVhv(HV *ohv)
/* Slow way */
hv_iterinit(ohv);
- while (entry = hv_iternext(ohv)) {
+ while ((entry = hv_iternext(ohv))) {
hv_store(hv, HeKEY(entry), HeKLEN(entry),
SvREFCNT_inc(HeVAL(entry)), HeHASH(entry));
}
@@ -867,7 +1056,7 @@ newHVhv(HV *ohv)
}
void
-hv_free_ent(HV *hv, register HE *entry)
+Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
{
SV *val;
@@ -885,11 +1074,11 @@ hv_free_ent(HV *hv, register HE *entry)
unshare_hek(HeKEY_hek(entry));
else
Safefree(HeKEY_hek(entry));
- del_he(entry);
+ del_HE(entry);
}
void
-hv_delayfree_ent(HV *hv, register HE *entry)
+Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
{
if (!entry)
return;
@@ -904,11 +1093,19 @@ hv_delayfree_ent(HV *hv, register HE *entry)
unshare_hek(HeKEY_hek(entry));
else
Safefree(HeKEY_hek(entry));
- del_he(entry);
+ del_HE(entry);
}
+/*
+=for apidoc hv_clear
+
+Clears a hash, making it empty.
+
+=cut
+*/
+
void
-hv_clear(HV *hv)
+Perl_hv_clear(pTHX_ HV *hv)
{
register XPVHV* xhv;
if (!hv)
@@ -925,7 +1122,7 @@ hv_clear(HV *hv)
}
STATIC void
-hfreeentries(HV *hv)
+S_hfreeentries(pTHX_ HV *hv)
{
register HE **array;
register HE *entry;
@@ -957,8 +1154,16 @@ hfreeentries(HV *hv)
(void)hv_iterinit(hv);
}
+/*
+=for apidoc hv_undef
+
+Undefines the hash.
+
+=cut
+*/
+
void
-hv_undef(HV *hv)
+Perl_hv_undef(pTHX_ HV *hv)
{
register XPVHV* xhv;
if (!hv)
@@ -979,20 +1184,30 @@ hv_undef(HV *hv)
mg_clear((SV*)hv);
}
+/*
+=for apidoc hv_iterinit
+
+Prepares a starting point to traverse a hash table. Returns the number of
+keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
+currently only meaningful for hashes without tie magic.
+
+NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
+hash buckets that happen to be in use. If you still need that esoteric
+value, you can get it through the macro C<HvFILL(tb)>.
+
+=cut
+*/
+
I32
-hv_iterinit(HV *hv)
+Perl_hv_iterinit(pTHX_ HV *hv)
{
register XPVHV* xhv;
HE *entry;
if (!hv)
- croak("Bad hash");
+ Perl_croak(aTHX_ "Bad hash");
xhv = (XPVHV*)SvANY(hv);
entry = xhv->xhv_eiter;
-#ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
- if (HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME))
- prime_env_iter();
-#endif
if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
HvLAZYDEL_off(hv);
hv_free_ent(hv, entry);
@@ -1002,8 +1217,16 @@ hv_iterinit(HV *hv)
return xhv->xhv_keys; /* used to be xhv->xhv_fill before 5.004_65 */
}
+/*
+=for apidoc hv_iternext
+
+Returns entries from a hash iterator. See C<hv_iterinit>.
+
+=cut
+*/
+
HE *
-hv_iternext(HV *hv)
+Perl_hv_iternext(pTHX_ HV *hv)
{
register XPVHV* xhv;
register HE *entry;
@@ -1011,11 +1234,11 @@ hv_iternext(HV *hv)
MAGIC* mg;
if (!hv)
- croak("Bad hash");
+ Perl_croak(aTHX_ "Bad hash");
xhv = (XPVHV*)SvANY(hv);
oldentry = entry = xhv->xhv_eiter;
- if (mg = SvTIED_mg((SV*)hv, 'P')) {
+ if ((mg = SvTIED_mg((SV*)hv, 'P'))) {
SV *key = sv_newmortal();
if (entry) {
sv_setsv(key, HeSVKEY_force(entry));
@@ -1025,7 +1248,7 @@ hv_iternext(HV *hv)
char *k;
HEK *hek;
- xhv->xhv_eiter = entry = new_he(); /* one HE per MAGICAL hash */
+ xhv->xhv_eiter = entry = new_HE(); /* one HE per MAGICAL hash */
Zero(entry, 1, HE);
Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
hek = (HEK*)k;
@@ -1041,13 +1264,18 @@ hv_iternext(HV *hv)
if (HeVAL(entry))
SvREFCNT_dec(HeVAL(entry));
Safefree(HeKEY_hek(entry));
- del_he(entry);
+ del_HE(entry);
xhv->xhv_eiter = Null(HE*);
return Null(HE*);
}
+#ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
+ if (!entry && HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME))
+ prime_env_iter();
+#endif
if (!xhv->xhv_array)
- Newz(506,xhv->xhv_array, ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
+ Newz(506, xhv->xhv_array,
+ PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
if (entry)
entry = HeNEXT(entry);
while (!entry) {
@@ -1068,8 +1296,17 @@ hv_iternext(HV *hv)
return entry;
}
+/*
+=for apidoc hv_iterkey
+
+Returns the key from the current position of the hash iterator. See
+C<hv_iterinit>.
+
+=cut
+*/
+
char *
-hv_iterkey(register HE *entry, I32 *retlen)
+Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
{
if (HeKLEN(entry) == HEf_SVKEY) {
STRLEN len;
@@ -1084,18 +1321,37 @@ hv_iterkey(register HE *entry, I32 *retlen)
}
/* unlike hv_iterval(), this always returns a mortal copy of the key */
+/*
+=for apidoc hv_iterkeysv
+
+Returns the key as an C<SV*> from the current position of the hash
+iterator. The return value will always be a mortal copy of the key. Also
+see C<hv_iterinit>.
+
+=cut
+*/
+
SV *
-hv_iterkeysv(register HE *entry)
+Perl_hv_iterkeysv(pTHX_ register HE *entry)
{
if (HeKLEN(entry) == HEf_SVKEY)
return sv_mortalcopy(HeKEY_sv(entry));
else
- return sv_2mortal(newSVpv((HeKLEN(entry) ? HeKEY(entry) : ""),
+ return sv_2mortal(newSVpvn((HeKLEN(entry) ? HeKEY(entry) : ""),
HeKLEN(entry)));
}
+/*
+=for apidoc hv_iterval
+
+Returns the value from the current position of the hash iterator. See
+C<hv_iterkey>.
+
+=cut
+*/
+
SV *
-hv_iterval(HV *hv, register HE *entry)
+Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
{
if (SvRMAGICAL(hv)) {
if (mg_find((SV*)hv,'P')) {
@@ -1109,8 +1365,17 @@ hv_iterval(HV *hv, register HE *entry)
return HeVAL(entry);
}
+/*
+=for apidoc hv_iternextsv
+
+Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
+operation.
+
+=cut
+*/
+
SV *
-hv_iternextsv(HV *hv, char **key, I32 *retlen)
+Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
{
HE *he;
if ( (he = hv_iternext(hv)) == NULL)
@@ -1119,14 +1384,22 @@ hv_iternextsv(HV *hv, char **key, I32 *retlen)
return hv_iterval(hv, he);
}
+/*
+=for apidoc hv_magic
+
+Adds magic to a hash. See C<sv_magic>.
+
+=cut
+*/
+
void
-hv_magic(HV *hv, GV *gv, int how)
+Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
{
sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
}
char*
-sharepvn(char *sv, I32 len, U32 hash)
+Perl_sharepvn(pTHX_ const char *sv, I32 len, U32 hash)
{
return HEK_KEY(share_hek(sv, len, hash));
}
@@ -1135,7 +1408,7 @@ sharepvn(char *sv, I32 len, U32 hash)
* len and hash must both be valid for str.
*/
void
-unsharepvn(char *str, I32 len, U32 hash)
+Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
{
register XPVHV* xhv;
register HE *entry;
@@ -1165,15 +1438,18 @@ unsharepvn(char *str, I32 len, U32 hash)
if (i && !*oentry)
xhv->xhv_fill--;
Safefree(HeKEY_hek(entry));
- del_he(entry);
+ del_HE(entry);
--xhv->xhv_keys;
}
break;
}
UNLOCK_STRTAB_MUTEX;
- if (!found)
- warn("Attempt to free non-existent shared string");
+ {
+ dTHR;
+ if (!found && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free non-existent shared string");
+ }
}
/* get a (constant) string ptr from the global string table
@@ -1181,7 +1457,7 @@ unsharepvn(char *str, I32 len, U32 hash)
* len and hash must both be valid for str.
*/
HEK *
-share_hek(char *str, I32 len, register U32 hash)
+Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
{
register XPVHV* xhv;
register HE *entry;
@@ -1209,7 +1485,7 @@ share_hek(char *str, I32 len, register U32 hash)
break;
}
if (!found) {
- entry = new_he();
+ entry = new_HE();
HeKEY_hek(entry) = save_hek(str, len, hash);
HeVAL(entry) = Nullsv;
HeNEXT(entry) = *oentry;
diff --git a/contrib/perl5/hv.h b/contrib/perl5/hv.h
index 007892d..5bc38a0 100644
--- a/contrib/perl5/hv.h
+++ b/contrib/perl5/hv.h
@@ -1,6 +1,6 @@
/* hv.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -28,7 +28,7 @@ struct xpvhv {
STRLEN xhv_fill; /* how full xhv_array currently is */
STRLEN xhv_max; /* subscript of last element of xhv_array */
IV xhv_keys; /* how many elements in the array */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* magic for scalar array */
HV* xmg_stash; /* class package */
@@ -40,14 +40,70 @@ struct xpvhv {
#define PERL_HASH(hash,str,len) \
STMT_START { \
- register char *s_PeRlHaSh = str; \
+ register const char *s_PeRlHaSh = str; \
register I32 i_PeRlHaSh = len; \
register U32 hash_PeRlHaSh = 0; \
while (i_PeRlHaSh--) \
hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
- (hash) = hash_PeRlHaSh; \
+ (hash) = hash_PeRlHaSh + (hash_PeRlHaSh>>5); \
} STMT_END
+/*
+=for apidoc AmU||HEf_SVKEY
+This flag, used in the length slot of hash entries and magic structures,
+specifies the structure contains a C<SV*> pointer where a C<char*> pointer
+is to be expected. (For information only--not to be used).
+
+=for apidoc AmU||Nullhv
+Null HV pointer.
+
+=for apidoc Am|char*|HvNAME|HV* stash
+Returns the package name of a stash. See C<SvSTASH>, C<CvSTASH>.
+
+=for apidoc Am|void*|HeKEY|HE* he
+Returns the actual pointer stored in the key slot of the hash entry. The
+pointer may be either C<char*> or C<SV*>, depending on the value of
+C<HeKLEN()>. Can be assigned to. The C<HePV()> or C<HeSVKEY()> macros are
+usually preferable for finding the value of a key.
+
+=for apidoc Am|STRLEN|HeKLEN|HE* he
+If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
+holds an C<SV*> key. Otherwise, holds the actual length of the key. Can
+be assigned to. The C<HePV()> macro is usually preferable for finding key
+lengths.
+
+=for apidoc Am|SV*|HeVAL|HE* he
+Returns the value slot (type C<SV*>) stored in the hash entry.
+
+=for apidoc Am|U32|HeHASH|HE* he
+Returns the computed hash stored in the hash entry.
+
+=for apidoc Am|char*|HePV|HE* he|STRLEN len
+Returns the key slot of the hash entry as a C<char*> value, doing any
+necessary dereferencing of possibly C<SV*> keys. The length of the string
+is placed in C<len> (this is a macro, so do I<not> use C<&len>). If you do
+not care about what the length of the key is, you may use the global
+variable C<PL_na>, though this is rather less efficient than using a local
+variable. Remember though, that hash keys in perl are free to contain
+embedded nulls, so using C<strlen()> or similar is not a good way to find
+the length of hash keys. This is very similar to the C<SvPV()> macro
+described elsewhere in this document.
+
+=for apidoc Am|SV*|HeSVKEY|HE* he
+Returns the key as an C<SV*>, or C<Nullsv> if the hash entry does not
+contain an C<SV*> key.
+
+=for apidoc Am|SV*|HeSVKEY_force|HE* he
+Returns the key as an C<SV*>. Will create and return a temporary mortal
+C<SV*> if the hash entry contains only a C<char*> key.
+
+=for apidoc Am|SV*|HeSVKEY_set|HE* he|SV* sv
+Sets the key to a given C<SV*>, taking care to set the appropriate flags to
+indicate the presence of an C<SV*> key, and returns the same
+C<SV*>.
+
+=cut
+*/
/* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
#define HEf_SVKEY -2 /* hent_key is a SV* */
@@ -71,8 +127,6 @@ struct xpvhv {
#define HvLAZYDEL_on(hv) (SvFLAGS(hv) |= SVphv_LAZYDEL)
#define HvLAZYDEL_off(hv) (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
-#ifdef OVERLOAD
-
/* Maybe amagical: */
/* #define HV_AMAGICmb(hv) (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
@@ -86,8 +140,6 @@ struct xpvhv {
#define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
*/
-#endif /* OVERLOAD */
-
#define Nullhe Null(HE*)
#define HeNEXT(he) (he)->hent_next
#define HeKEY_hek(he) (he)->hent_hek
@@ -108,7 +160,7 @@ struct xpvhv {
#define HeSVKEY_force(he) (HeKEY(he) ? \
((HeKLEN(he) == HEf_SVKEY) ? \
HeKEY_sv(he) : \
- sv_2mortal(newSVpv(HeKEY(he), \
+ sv_2mortal(newSVpvn(HeKEY(he), \
HeKLEN(he)))) : \
&PL_sv_undef)
#define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
@@ -118,3 +170,13 @@ struct xpvhv {
#define HEK_HASH(hek) (hek)->hek_hash
#define HEK_LEN(hek) (hek)->hek_len
#define HEK_KEY(hek) (hek)->hek_key
+
+#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
+# define PERL_HV_ARRAY_ALLOC_BYTES(size) ((size) * sizeof(HE*))
+#else
+# define MALLOC_OVERHEAD 16
+# define PERL_HV_ARRAY_ALLOC_BYTES(size) \
+ (((size) < 64) \
+ ? (size) * sizeof(HE*) \
+ : (size) * sizeof(HE*) * 2 - MALLOC_OVERHEAD)
+#endif
diff --git a/contrib/perl5/installhtml b/contrib/perl5/installhtml
index fd11ee6..cfbbe9f 100755
--- a/contrib/perl5/installhtml
+++ b/contrib/perl5/installhtml
@@ -9,8 +9,6 @@ use Getopt::Long; # for command-line parsing
use Cwd;
use Pod::Html;
-umask 022;
-
=head1 NAME
installhtml - converts a collection of POD pages to HTML format.
@@ -63,13 +61,13 @@ a URL. The default is `/'.
=item B<--splithead> POD files to split on =head directive
-Colon-separated list of pod files to split by the =head directive. The
+Comma-separated list of pod files to split by the =head directive. The
.pod suffix is optional. These files should have names specified
relative to podroot.
=item B<--splititem> POD files to split on =item directive
-Colon-separated list of all pod files to split by the =item directive.
+Comma-separated list of all pod files to split by the =item directive.
The .pod suffix is optional. I<installhtml> does not do the actual
split, rather it invokes I<splitpod> to do the dirty work. As with
--splithead, these files should have names specified relative to podroot.
@@ -80,7 +78,7 @@ The directory containing the splitpod program. The default is `podroot/pod'.
=item B<--libpods> library PODs for LE<lt>E<gt> links
-Colon-separated list of "library" pod files. This is the same list that
+Comma-separated list of "library" pod files. This is the same list that
will be passed to pod2html when any pod is converted.
=item B<--verbose> verbose output
@@ -100,7 +98,7 @@ perl documentation:
--htmlroot=/perl/nmanual \
--splithead=pod/perlipc \
--splititem=pod/perlfunc \
- --libpods=perlfunc:perlguts:perlvar:perlrun:perlop \
+ --libpods=perlfunc,perlguts,perlvar,perlrun,perlop \
--recurse \
--verbose
@@ -161,6 +159,10 @@ $pod2html = "pod/pod2html";
usage("") unless @ARGV;
+# Overcome shell's p1,..,p8 limitation.
+# See vms/descrip_mms.template -> descrip.mms for invokation.
+if ( $^O eq 'VMS' ) { @ARGV = split(/\s+/,$ARGV[0]); }
+
# parse the command-line
$result = GetOptions( qw(
help
@@ -236,7 +238,12 @@ foreach $dir (@splithead) {
@data = ();
while (<H>) {
last if /NAME=/;
- s,HREF="#(.*)">,HREF="$file/$1.html">,g;
+ $_ =~ s{HREF="#(.*)">}{
+ my $url = "$file/$1.html" ;
+ $url = Pod::Html::relativize_url( $url, "$file.html" )
+ if ( ! defined $opt_htmlroot || $opt_htmlroot eq '' ) ;
+ "HREF=\"$url\">" ;
+ }eg;
push @data, $_;
}
close(H);
@@ -291,6 +298,8 @@ sub absolute_path {
sub create_index {
my($html, $dir) = @_;
my(@files, @filedata, @index, $file);
+ my($lcp1,$lcp2);
+
# get the list of .html files in this directory
opendir(DIR, $dir) ||
@@ -314,17 +323,25 @@ sub create_index {
# pull out the NAME section
($name) = grep(/NAME=/, @filedata);
- $name =~ m,/H1>\s(\S+)\s[\s-]*(.*?)\s*$,sm;
- print HTML qq(<A HREF="$dir/$file">);
- print HTML "<DT>$1</A><DD>$2\n" if defined $1;
-# print HTML qq(<A HREF="$dir/$file">$1</A><BR>\n") if defined $1;
+ ($lcp1,$lcp2) = ($name =~ m,/H1>\s(\S+)\s[\s-]*(.*?)\s*$,sm);
+ if (defined $lcp1 and $lcp1 eq '<P>') { # Uninteresting. Try again.
+ ($lcp1,$lcp2) = ($name =~ m,/H1>\s<P>\s(\S+)\s[\s-]*(.*?)\s*$,sm);
+ }
+ my $url= "$dir/$file" ;
+ if ( ! defined $opt_htmlroot || $opt_htmlroot eq '' ) {
+ $url = Pod::Html::relativize_url( "$dir/$file", $html ) ;
+ }
+
+ print HTML qq(<A HREF="$url">);
+ print HTML "<DT>$lcp1</A><DD>$lcp2\n" if defined $lcp1;
+# print HTML qq(<A HREF="$url">$lcp1</A><BR>\n") if defined $lcp1;
next;
@index = grep(/<!-- INDEX BEGIN -->.*<!-- INDEX END -->/s,
@filedata);
for (@index) {
- s/<!-- INDEX BEGIN -->(\s*<!--)(.*)(-->\s*)<!-- INDEX END -->/$2/s;
+ s/<!-- INDEX BEGIN -->(\s*<!--)(.*)(-->\s*)<!-- INDEX END -->/$lcp2/s;
s,#,$dir/$file#,g;
# print HTML "$_\n";
print HTML "$_\n<P><HR><P>\n";
@@ -500,7 +517,7 @@ sub installdir {
|| die "$0: error opening directory $podroot/$dir: $!\n";
# find the directories to recurse on
- @dirlist = map { "$dir/$_" }
+ @dirlist = map { if ($^O eq 'VMS') {/^(.*)\.dir$/i; "$dir/$1";} else {"$dir/$_";}}
grep(-d "$podroot/$dir/$_" && !/^\.{1,2}/, readdir(DIR)) if $recurse;
rewinddir(DIR);
@@ -571,6 +588,7 @@ sub runpod2html {
#system("./pod2html",
Pod::Html'pod2html(
#Pod::Html'pod2html($pod2html,
+ "--htmldir=$htmldir",
"--htmlroot=$htmlroot",
"--podpath=".join(":", @podpath),
"--podroot=$podroot", "--netscape",
diff --git a/contrib/perl5/installman b/contrib/perl5/installman
index 6fa4231..c9fb0fe 100755
--- a/contrib/perl5/installman
+++ b/contrib/perl5/installman
@@ -10,15 +10,14 @@ use subs qw(unlink chmod rename link);
use vars qw($packlist);
require Cwd;
-umask 022;
$ENV{SHELL} = 'sh' if $^O eq 'os2';
-$ver = $];
-$release = substr($ver,0,3); # Not used presently.
-$patchlevel = substr($ver,3,2);
+$ver = $Config{version};
+$release = substr($],0,3); # Not used presently.
+$patchlevel = substr($],3,2);
die "Patchlevel of perl ($patchlevel)",
- "and patchlevel of config.sh ($Config{'PATCHLEVEL'}) don't match\n"
- if $patchlevel != $Config{'PATCHLEVEL'};
+ "and patchlevel of config.sh ($Config{'PERL_VERSION'}) don't match\n"
+ if $patchlevel != $Config{'PERL_VERSION'};
$usage =
"Usage: installman --man1dir=/usr/wherever --man1ext=1
@@ -65,14 +64,21 @@ runpod2man('lib', $man3dir, $man3ext);
runpod2man('utils', $man1dir, $man1ext, 'c2ph');
runpod2man('utils', $man1dir, $man1ext, 'h2ph');
runpod2man('utils', $man1dir, $man1ext, 'h2xs');
+runpod2man('utils', $man1dir, $man1ext, 'perlcc');
runpod2man('utils', $man1dir, $man1ext, 'perldoc');
runpod2man('utils', $man1dir, $man1ext, 'perlbug');
runpod2man('utils', $man1dir, $man1ext, 'pl2pm');
runpod2man('utils', $man1dir, $man1ext, 'splain');
+runpod2man('utils', $man1dir, $man1ext, 'dprofpp');
runpod2man('x2p', $man1dir, $man1ext, 's2p');
runpod2man('x2p', $man1dir, $man1ext, 'a2p.pod');
+runpod2man('x2p', $man1dir, $man1ext, 'find2perl');
runpod2man('pod', $man1dir, $man1ext, 'pod2man');
runpod2man('pod', $man1dir, $man1ext, 'pod2html');
+runpod2man('pod', $man1dir, $man1ext, 'pod2text');
+runpod2man('pod', $man1dir, $man1ext, 'pod2usage');
+runpod2man('pod', $man1dir, $man1ext, 'podchecker');
+runpod2man('pod', $man1dir, $man1ext, 'podselect');
# It would probably be better to have this page linked
# to the c2ph man page. Or, this one could say ".so man1/c2ph.1",
@@ -120,7 +126,8 @@ sub runpod2man {
# of the pod. This might be useful for pod2man someday.
if ($script) {
@modpods = ($script);
- } else {
+ }
+ else {
@modpods = ();
find(\&lsmodpods, '.');
}
@@ -134,18 +141,22 @@ sub runpod2man {
# Convert name from File/Basename.pm to File::Basename.3 format,
# if necessary.
$manpage =~ s#\.p(m|od)$##;
- if ($^O eq 'os2' || $^O eq 'amigaos' || $^O eq 'uwin') {
+ if ($^O eq 'os2' || $^O eq 'amigaos' || $^O eq 'uwin' || $^O eq 'cygwin') {
$manpage =~ s#/#.#g;
- } else {
+ }
+ else {
$manpage =~ s#/#::#g;
}
$tmp = "${mandir}/${manpage}.tmp";
$manpage = "${mandir}/${manpage}.${manext}";
if (&cmd("$pod2man $mod > $tmp") == 0 && !$notify && -s $tmp) {
- rename($tmp, $manpage) && next;
+ if (rename($tmp, $manpage)) {
+ $packlist->{$manpage} = { type => 'file' };
+ next;
+ }
}
unless ($notify) {
- unlink($tmp);
+ unlink($tmp);
}
}
chdir "$builddir" || die "Unable to cd back to $builddir directory!\n$!\n";
@@ -190,11 +201,11 @@ sub unlink {
my $cnt = 0;
foreach $name (@names) {
-next unless -e $name;
-chmod 0777, $name if $^O eq 'os2';
-print STDERR " unlink $name\n";
-( CORE::unlink($name) and ++$cnt
- or warn "Couldn't unlink $name: $!\n" ) unless $notify;
+ next unless -e $name;
+ chmod 0777, $name if $^O eq 'os2';
+ print STDERR " unlink $name\n";
+ ( CORE::unlink($name) and ++$cnt
+ or warn "Couldn't unlink $name: $!\n" ) unless $notify;
}
return $cnt;
}
@@ -211,14 +222,12 @@ sub link {
? die "AFS" # okay inside eval {}
: warn "Couldn't link $from to $to: $!\n"
unless $notify;
- $packlist->{$to} = { type => 'file' };
};
if ($@) {
File::Copy::copy($from, $to)
? $success++
: warn "Couldn't copy $from to $to: $!\n"
unless $notify;
- $packlist->{$to} = { type => 'file' };
}
$success;
}
@@ -226,16 +235,15 @@ sub link {
sub rename {
local($from,$to) = @_;
if (-f $to and not unlink($to)) {
-my($i);
-for ($i = 1; $i < 50; $i++) {
- last if CORE::rename($to, "$to.$i");
-}
-warn("Cannot rename to `$to.$i': $!"), return 0
- if $i >= 50; # Give up!
+ my($i);
+ for ($i = 1; $i < 50; $i++) {
+ last if CORE::rename($to, "$to.$i");
+ }
+ warn("Cannot rename to `$to.$i': $!"), return 0
+ if $i >= 50; # Give up!
}
link($from,$to) || return 0;
unlink($from);
- $packlist->{$to} = { type => 'file' };
}
sub chmod {
diff --git a/contrib/perl5/installperl b/contrib/perl5/installperl
index b1d5bfb..b2ddc84 100755
--- a/contrib/perl5/installperl
+++ b/contrib/perl5/installperl
@@ -8,12 +8,13 @@ BEGIN {
}
use strict;
-use vars qw($Is_VMS $Is_W32 $Is_OS2 $nonono $versiononly $depth);
+use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $nonono $dostrip $versiononly $depth);
BEGIN {
$Is_VMS = $^O eq 'VMS';
$Is_W32 = $^O eq 'MSWin32';
$Is_OS2 = $^O eq 'os2';
+ $Is_Cygwin = $^O eq 'cygwin';
if ($Is_VMS) { eval 'use VMS::Filespec;' }
}
@@ -39,18 +40,26 @@ my $exe_ext = $Config{exe_ext};
# Allow ``make install PERLNAME=something_besides_perl'':
my $perl = defined($ENV{PERLNAME}) ? $ENV{PERLNAME} : 'perl';
+# This is the base used for versioned names, like "perl5.6.0".
+# It's separate because a common use of $PERLNAME is to install
+# perl as "perl5", if that's used as base for versioned files you
+# get "perl55.6.0".
+my $perl_verbase = defined($ENV{PERLNAME_VERBASE})
+ ? $ENV{PERLNAME_VERBASE}
+ : $perl;
+
while (@ARGV) {
$nonono = 1 if $ARGV[0] eq '-n';
+ $dostrip = 1 if $ARGV[0] eq '-s';
$versiononly = 1 if $ARGV[0] eq '-v';
shift;
}
-umask 022 unless $Is_VMS;
-
my @scripts = qw(utils/c2ph utils/h2ph utils/h2xs utils/perlbug utils/perldoc
- utils/pl2pm utils/splain utils/perlcc
+ utils/pl2pm utils/splain utils/perlcc utils/dprofpp
x2p/s2p x2p/find2perl
- pod/pod2man pod/pod2html pod/pod2latex pod/pod2text);
+ pod/pod2man pod/pod2html pod/pod2latex pod/pod2text
+ pod/pod2usage pod/podchecker pod/podselect);
if ($scr_ext) { @scripts = map { "$_$scr_ext" } @scripts; }
@@ -77,18 +86,34 @@ if ((-e "testcompile") && (defined($ENV{'COMPILE'})))
}
find(sub {
- if ("$File::Find::dir/$_" =~ m{^ext/[^/]+/(.*)\.pm$}) {
- (my $pm = $1) =~ s{^lib/}{};
- $archpms{$pm} = 1;
+ if ("$File::Find::dir/$_" =~ m{^ext\b(.*)/([^/]+)\.pm$}) {
+ my($path, $modname) = ($1,$2);
+
+ # strip trailing component first
+ $path =~ s{/[^/]*$}{};
+
+ # strip optional "/lib";
+ $path =~ s{/lib\b}{};
+
+ # strip any leading /
+ $path =~ s{^/}{};
+
+ # reconstitute canonical module name
+ $modname = "$path/$modname" if length $path;
+
+ # remember it
+ $archpms{$modname} = 1;
}
}, 'ext');
-my $ver = $];
-my $release = substr($ver,0,3); # Not used presently.
-my $patchlevel = substr($ver,3,2);
+# print "[$_]\n" for sort keys %archpms;
+
+my $ver = $Config{version};
+my $release = substr($],0,3); # Not used presently.
+my $patchlevel = substr($],3,2);
die "Patchlevel of perl ($patchlevel)",
- "and patchlevel of config.sh ($Config{'PATCHLEVEL'}) don't match\n"
- if $patchlevel != $Config{'PATCHLEVEL'};
+ "and patchlevel of config.sh ($Config{'PERL_VERSION'}) don't match\n"
+ if $patchlevel != $Config{'PERL_VERSION'};
# Fetch some frequently-used items from %Config
my $installbin = $Config{installbin};
@@ -103,6 +128,7 @@ my $libperl = $Config{libperl};
# Shared library and dynamic loading suffixes.
my $so = $Config{so};
my $dlext = $Config{dlext};
+my $dlsrc = $Config{dlsrc};
my $d_dosuid = $Config{d_dosuid};
my $binexp = $Config{binexp};
@@ -132,19 +158,34 @@ if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
|| warn "WARNING: You've never run 'make test'!!!",
" (Installing anyway.)\n";
-if ($Is_W32) {
-
-my $perldll = 'perl.' . $dlext;
-$perldll = 'perlcore.' . $dlext if $Config{'ccflags'} =~ /PERL_OBJECT/i;
-
--f $perldll || die "No perl DLL built\n";
+if ($Is_W32 or $Is_Cygwin) {
+ my $perldll;
+
+if ($Is_Cygwin) {
+ $perldll = $libperl;
+ $perldll =~ s/(\..*)?$/.$dlext/;
+ if ($Config{useshrplib} eq 'true') {
+ # install ld2 and perlld as well
+ foreach ('ld2', 'perlld') {
+ safe_unlink("$installbin/$_");
+ copy("$_", "$installbin/$_");
+ chmod(0755, "$installbin/$_");
+ };
+ };
+} else {
+ $perldll = 'perl56.' . $dlext;
+}
+ if ($dlsrc ne "dl_none.xs") {
+ -f $perldll || die "No perl DLL built\n";
+ }
# Install the DLL
-safe_unlink("$installbin/$perldll");
-copy("$perldll", "$installbin/$perldll");
-chmod(0755, "$installbin/$perldll");
-}
+ safe_unlink("$installbin/$perldll");
+ copy("$perldll", "$installbin/$perldll");
+ chmod(0755, "$installbin/$perldll");
+
+} # if ($Is_W32 or $Is_Cygwin)
# This will be used to store the packlist
my $packlist = ExtUtils::Packlist->new("$installarchlib/.packlist");
@@ -170,19 +211,20 @@ elsif ($^O eq 'mpeix') {
link($Config{perlpath}, "$installbin/perl$ver$exe_ext");
}
elsif ($^O ne 'dos') {
- safe_unlink("$installbin/$perl$ver$exe_ext");
- copy("perl$exe_ext", "$installbin/$perl$ver$exe_ext");
- chmod(0755, "$installbin/$perl$ver$exe_ext");
+ safe_unlink("$installbin/$perl_verbase$ver$exe_ext");
+ copy("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext");
+ strip("$installbin/$perl_verbase$ver$exe_ext");
+ chmod(0755, "$installbin/$perl_verbase$ver$exe_ext");
}
else {
safe_unlink("$installbin/$perl.exe");
copy("perl.exe", "$installbin/$perl.exe");
}
-safe_unlink("$installbin/s$perl$ver$exe_ext");
+safe_unlink("$installbin/s$perl_verbase$ver$exe_ext");
if ($d_dosuid) {
- copy("suidperl$exe_ext", "$installbin/s$perl$ver$exe_ext");
- chmod(04711, "$installbin/s$perl$ver$exe_ext");
+ copy("suidperl$exe_ext", "$installbin/s$perl_verbase$ver$exe_ext");
+ chmod(04711, "$installbin/s$perl_verbase$ver$exe_ext");
}
# Install library files.
@@ -197,7 +239,7 @@ mkpath($installsitearch, 1, 0777) if ($installsitearch);
if (chdir "lib") {
$do_installarchlib = ! samepath($installarchlib, '.');
$do_installprivlib = ! samepath($installprivlib, '.');
- $do_installprivlib = 0 if $versiononly && !($installprivlib =~ m/\Q$]/);
+ $do_installprivlib = 0 if $versiononly && !($installprivlib =~ m/\Q$ver/);
if ($do_installarchlib || $do_installprivlib) {
find(\&installlib, '.');
@@ -212,12 +254,14 @@ else {
mkpath("$installarchlib/CORE", 1, 0777);
my @corefiles;
if ($Is_VMS) { # We did core file selection during build
- my $coredir = "lib/$Config{'arch'}/$]";
+ my $coredir = "lib/$Config{'arch'}/$ver";
$coredir =~ tr/./_/;
- @corefiles = <$coredir/*.*>;
+ @corefiles = map { s|^$coredir/||i; } <$coredir/*.*>;
}
else {
+ # [als] hard-coded 'libperl' name... not good!
@corefiles = <*.h libperl*.*>;
+
# AIX needs perl.exp installed as well.
push(@corefiles,'perl.exp') if $^O eq 'aix';
if ($^O eq 'mpeix') {
@@ -231,9 +275,14 @@ else {
foreach my $file (@corefiles) {
# HP-UX (at least) needs to maintain execute permissions
# on dynamically-loadable libraries. So we do it for all.
- copy_if_diff($file,"$installarchlib/CORE/$file")
- and chmod($file =~ /\.(so|\Q$dlext\E)$/ ? 0555 : 0444,
- "$installarchlib/CORE/$file");
+ if (copy_if_diff($file,"$installarchlib/CORE/$file")) {
+ if ($file =~ /\.(\Q$so\E|\Q$dlext\E)$/) {
+ chmod(0555, "$installarchlib/CORE/$file");
+ strip("-S", "$installarchlib/CORE/$file") if $^O =~ /^(rhapsody|darwin)$/;
+ } else {
+ chmod(0444, "$installarchlib/CORE/$file");
+ }
+ }
}
# Install main perl executables
@@ -246,9 +295,11 @@ if (! $versiononly && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VM
# We don't want another cloned copy.
symlink($Config{perlpath}, "$installbin/perl$exe_ext");
} else {
- link("$installbin/$perl$ver$exe_ext", "$installbin/$perl$exe_ext");
+ link("$installbin/$perl_verbase$ver$exe_ext",
+ "$installbin/$perl$exe_ext");
}
- link("$installbin/s$perl$ver$exe_ext", "$installbin/suid$perl$exe_ext")
+ link("$installbin/s$perl_verbase$ver$exe_ext",
+ "$installbin/suid$perl$exe_ext")
if $d_dosuid;
}
@@ -324,36 +375,39 @@ if (! $versiononly) {
if (! $versiononly) {
safe_unlink("$installscript/pstruct$scr_ext");
- if ($^O eq 'dos' or $Is_VMS) {
+ if ($^O eq 'dos' or $Is_VMS or $^O eq 'transit') {
copy("$installscript/c2ph$scr_ext", "$installscript/pstruct$scr_ext");
} else {
link("$installscript/c2ph$scr_ext", "$installscript/pstruct$scr_ext");
}
}
-# Install pod pages. Where? I guess in $installprivlib/pod.
+# Install pod pages. Where? I guess in $installprivlib/pod
+# ($installprivlib/pods for cygwin).
-unless ( $versiononly && !($installprivlib =~ m/\Q$]/)) { # as line 200
- mkpath("${installprivlib}/pod", 1, 0777);
+my $pod = $Is_Cygwin ? 'pods' : 'pod';
+unless ( $versiononly && !($installprivlib =~ m/\Q$ver/)) {
+ mkpath("${installprivlib}/$pod", 1, 0777);
# If Perl 5.003's perldiag.pod is there, rename it.
- if (open POD, "${installprivlib}/pod/perldiag.pod") {
+ if (open POD, "${installprivlib}/$pod/perldiag.pod") {
read POD, $_, 4000;
close POD;
# Some of Perl 5.003's diagnostic messages ended with periods.
if (/^=.*\.$/m) {
- my ($from, $to) = ("${installprivlib}/pod/perldiag.pod",
- "${installprivlib}/pod/perldiag-5.003.pod");
- print STDERR " rename $from $to";
+ my ($from, $to) = ("${installprivlib}/$pod/perldiag.pod",
+ "${installprivlib}/$pod/perldiag-5.003.pod");
+ print " rename $from $to";
rename($from, $to)
or warn "Couldn't rename $from to $to: $!\n"
unless $nonono;
}
}
- foreach my $file (@pods) {
- # $file is a name like pod/perl.pod
- copy_if_diff($file, "${installprivlib}/${file}");
+ for (@pods) {
+ # $_ is a name like pod/perl.pod
+ (my $base = $_) =~ s#.*/##;
+ copy_if_diff($_, "${installprivlib}/$pod/${base}");
}
}
@@ -365,7 +419,7 @@ unless ( $versiononly && !($installprivlib =~ m/\Q$]/)) { # as line 200
# installed perl.
if (!$versiononly) {
- my ($path, @path);
+ my ($path, @path);
my $dirsep = ($Is_OS2 || $Is_W32) ? ';' : ':' ;
($path = $ENV{"PATH"}) =~ s:\\:/:g ;
@path = split(/$dirsep/, $path);
@@ -377,14 +431,17 @@ if (!$versiononly) {
}
}
my @otherperls;
+ my %otherperls;
for (@path) {
next unless m,^/,;
# Use &samepath here because some systems have other dirs linked
# to $mainperldir (like SunOS)
next if samepath($_, $binexp);
next if ($mainperl_is_instperl && samepath($_, $mainperldir));
- push(@otherperls, "$_/$perl$exe_ext")
- if (-x "$_/$perl$exe_ext" && ! -d "$_/$perl$exe_ext");
+ my $otherperl = "$_/$perl$exe_ext";
+ next if $otherperls{$otherperl}++;
+ push(@otherperls, $otherperl)
+ if (-x $otherperl && ! -d $otherperl);
}
if (@otherperls) {
print STDERR "\nWarning: $perl appears in your path in the following " .
@@ -398,7 +455,7 @@ if (!$versiononly) {
}
$packlist->write() unless $nonono;
-print STDERR " Installation complete\n";
+print " Installation complete\n";
exit 0;
@@ -408,7 +465,7 @@ sub yn {
my($prompt) = @_;
my($answer);
my($default) = $prompt =~ m/\[([yn])\]\s*$/i;
- print STDERR $prompt;
+ print $prompt;
chop($answer = <STDIN>);
$answer = $default if $answer =~ m/^\s*$/;
($answer =~ m/^[yY]/);
@@ -422,8 +479,8 @@ sub unlink {
foreach my $name (@names) {
next unless -e $name;
- chmod 0777, $name if ($Is_OS2 || $Is_W32);
- print STDERR " unlink $name\n";
+ chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_Cygwin);
+ print " unlink $name\n";
( CORE::unlink($name) and ++$cnt
or warn "Couldn't unlink $name: $!\n" ) unless $nonono;
}
@@ -436,11 +493,11 @@ sub safe_unlink {
foreach my $name (@names) {
next unless -e $name;
chmod 0777, $name if ($Is_OS2 || $Is_W32);
- print STDERR " unlink $name\n";
+ print " unlink $name\n";
next if CORE::unlink($name);
warn "Couldn't unlink $name: $!\n";
if ($! =~ /busy/i) {
- print STDERR " mv $name $name.old\n";
+ print " mv $name $name.old\n";
safe_rename($name, "$name.old")
or warn "Couldn't rename $name: $!\n";
}
@@ -465,18 +522,20 @@ sub link {
my($from,$to) = @_;
my($success) = 0;
- print STDERR " ln $from $to\n";
+ print " ln $from $to\n";
eval {
CORE::link($from, $to)
? $success++
: ($from =~ m#^/afs/# || $to =~ m#^/afs/#)
? die "AFS" # okay inside eval {}
- : warn "Couldn't link $from to $to: $!\n"
+ : die "Couldn't link $from to $to: $!\n"
unless $nonono;
$packlist->{$to} = { from => $from, type => 'link' };
};
if ($@) {
- print STDERR " creating new version of $to\n" if $Is_VMS and -e $to;
+ warn $@;
+ print " cp $from $to\n";
+ print " creating new version of $to\n" if $Is_VMS and -e $to;
File::Copy::copy($from, $to)
? $success++
: warn "Couldn't copy $from to $to: $!\n"
@@ -490,7 +549,7 @@ sub chmod {
my($mode,$name) = @_;
return if ($^O eq 'dos');
- printf STDERR " chmod %o %s\n", $mode, $name;
+ printf " chmod %o %s\n", $mode, $name;
CORE::chmod($mode,$name)
|| warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name)
unless $nonono;
@@ -499,8 +558,8 @@ sub chmod {
sub copy {
my($from,$to) = @_;
- print STDERR " cp $from $to\n";
- print STDERR " creating new version of $to\n" if $Is_VMS and -e $to;
+ print " cp $from $to\n";
+ print " creating new version of $to\n" if $Is_VMS and -e $to;
File::Copy::copy($from, $to)
|| warn "Couldn't copy $from to $to: $!\n"
unless $nonono;
@@ -530,13 +589,15 @@ sub installlib {
my $name = $_;
- if ($name eq 'CVS' && -d $name) {
+ # Ignore RCS and CVS directories.
+ if (($name eq 'CVS' or $name eq 'RCS') and -d $name) {
$File::Find::prune = 1;
return;
}
- # ignore patch backups and the .exists files.
- return if $name =~ m{\.orig$|~$|^\.exists};
+ # ignore patch backups, RCS files, emacs backup & temp files and the
+ # .exists files.
+ return if $name =~ m{\.orig$|~$|^#.+#$|,v$|^\.exists};
$name = "$dir/$name" if $dir ne '';
@@ -586,7 +647,7 @@ sub installlib {
sub copy_if_diff {
my($from,$to)=@_;
return 1 if (($^O eq 'VMS') && (-d $from));
- -f $from || die "$0: $from not found";
+ -f $from || warn "$0: $from not found";
$packlist->{$to} = { type => 'file' };
if (compare($from, $to) || $nonono) {
safe_unlink($to); # In case we don't have write permissions.
@@ -602,3 +663,25 @@ sub copy_if_diff {
1;
}
}
+
+sub strip
+{
+ my(@args) = @_;
+
+ return unless $dostrip;
+
+ my @opts;
+ while (@args && $args[0] =~ /^(-\w+)$/) {
+ push @opts, shift @args;
+ }
+
+ foreach my $file (@args) {
+ if (-f $file) {
+ print " strip $file\n";
+ system("strip", @opts, $file);
+ } else {
+ print "# file '$file' skipped\n";
+ }
+ }
+}
+
diff --git a/contrib/perl5/intrpvar.h b/contrib/perl5/intrpvar.h
index 1f6244d..39d14c9 100644
--- a/contrib/perl5/intrpvar.h
+++ b/contrib/perl5/intrpvar.h
@@ -8,25 +8,21 @@
* generated when built with or without MULTIPLICITY. It is also used
* to generate the appropriate export list for win32.
*
- * When building without MULTIPLICITY, these variables will be truly global.
- *
- * Avoid build-specific #ifdefs here, like DEBUGGING. That way,
- * we can keep binary compatibility of the curinterp structure */
+ * When building without MULTIPLICITY, these variables will be truly global. */
/* pseudo environmental stuff */
PERLVAR(Iorigargc, int)
PERLVAR(Iorigargv, char **)
PERLVAR(Ienvgv, GV *)
-PERLVAR(Isiggv, GV *)
PERLVAR(Iincgv, GV *)
PERLVAR(Ihintgv, GV *)
PERLVAR(Iorigfilename, char *)
PERLVAR(Idiehook, SV *)
PERLVAR(Iwarnhook, SV *)
-PERLVAR(Iparsehook, SV *)
-PERLVAR(Icddir, char *) /* switches */
+
+/* switches */
PERLVAR(Iminus_c, bool)
-PERLVAR(Ipatchlevel[10],char)
+PERLVAR(Ipatchlevel, SV *)
PERLVAR(Ilocalpatches, char **)
PERLVARI(Isplitstr, char *, " ")
PERLVAR(Ipreprocess, bool)
@@ -36,17 +32,25 @@ PERLVAR(Iminus_l, bool)
PERLVAR(Iminus_a, bool)
PERLVAR(Iminus_F, bool)
PERLVAR(Idoswitches, bool)
-PERLVAR(Idowarn, bool)
+
+/*
+=for apidoc Amn|bool|PL_dowarn
+
+The C variable which corresponds to Perl's $^W warning variable.
+
+=cut
+*/
+
+PERLVAR(Idowarn, U8)
+PERLVAR(Iwidesyscalls, bool) /* wide system calls */
PERLVAR(Idoextract, bool)
PERLVAR(Isawampersand, bool) /* must save all match strings */
-PERLVAR(Isawstudy, bool) /* do fbm_instr on all strings */
-PERLVAR(Isawvec, bool)
PERLVAR(Iunsafe, bool)
PERLVAR(Iinplace, char *)
PERLVAR(Ie_script, SV *)
PERLVAR(Iperldb, U32)
-/* This value may be raised by extensions for testing purposes */
+/* This value may be set when embedding for full cleanup */
/* 0=none, 1=full, 2=full with checks */
PERLVARI(Iperl_destruct_level, int, 0)
@@ -59,22 +63,20 @@ PERLVARI(Imaxsysfd, I32, MAXSYSFD)
/* top fd to pass to subprocesses */
PERLVAR(Imultiline, int) /* $*--do strings hold >1 line? */
PERLVAR(Istatusvalue, I32) /* $? */
+PERLVAR(Iexit_flags, U8) /* was exit() unexpected, etc. */
#ifdef VMS
PERLVAR(Istatusvalue_vms,U32)
#endif
/* shortcuts to various I/O objects */
PERLVAR(Istdingv, GV *)
+PERLVAR(Istderrgv, GV *)
PERLVAR(Idefgv, GV *)
PERLVAR(Iargvgv, GV *)
PERLVAR(Iargvoutgv, GV *)
+PERLVAR(Iargvout_stack, AV *)
/* shortcuts to regexp stuff */
-/* XXX these three aren't used anywhere */
-PERLVAR(Ileftgv, GV *)
-PERLVAR(Iampergv, GV *)
-PERLVAR(Irightgv, GV *)
-
/* this one needs to be moved to thrdvar.h and accessed via
* find_threadsv() when USE_THREADS */
PERLVAR(Ireplgv, GV *)
@@ -85,6 +87,29 @@ PERLVAR(Ierrgv, GV *)
/* shortcuts to debugging objects */
PERLVAR(IDBgv, GV *)
PERLVAR(IDBline, GV *)
+
+/*
+=for apidoc Amn|GV *|PL_DBsub
+When Perl is run in debugging mode, with the B<-d> switch, this GV contains
+the SV which holds the name of the sub being debugged. This is the C
+variable which corresponds to Perl's $DB::sub variable. See
+C<PL_DBsingle>.
+
+=for apidoc Amn|SV *|PL_DBsingle
+When Perl is run in debugging mode, with the B<-d> switch, this SV is a
+boolean which indicates whether subs are being single-stepped.
+Single-stepping is automatically turned on after every step. This is the C
+variable which corresponds to Perl's $DB::single variable. See
+C<PL_DBsub>.
+
+=for apidoc Amn|SV *|PL_DBtrace
+Trace variable used when Perl is run in debugging mode, with the B<-d>
+switch. This is the C variable which corresponds to Perl's $DB::trace
+variable. See C<PL_DBsingle>.
+
+=cut
+*/
+
PERLVAR(IDBsub, GV *)
PERLVAR(IDBsingle, SV *)
PERLVAR(IDBtrace, SV *)
@@ -98,6 +123,7 @@ PERLVAR(Iglobalstash, HV *) /* global keyword overrides imported here */
PERLVAR(Icurstname, SV *) /* name of current package */
PERLVAR(Ibeginav, AV *) /* names of BEGIN subroutines */
PERLVAR(Iendav, AV *) /* names of END subroutines */
+PERLVAR(Icheckav, AV *) /* names of CHECK subroutines */
PERLVAR(Iinitav, AV *) /* names of INIT subroutines */
PERLVAR(Istrtab, HV *) /* shared string table */
PERLVARI(Isub_generation,U32,1) /* incr to invalidate method cache */
@@ -109,8 +135,6 @@ PERLVAR(Isv_root, SV*) /* storage for SVs belonging to interp */
PERLVAR(Isv_arenaroot, SV*) /* list of areas for garbage collection */
/* funky return mechanisms */
-PERLVAR(Ilastspbase, I32)
-PERLVAR(Ilastsize, I32)
PERLVAR(Iforkprocess, int) /* so do_open |- can return proc# */
/* subprocess state */
@@ -119,13 +143,6 @@ PERLVAR(Ifdpid, AV *) /* keep fd-to-pid mappings for my_popen */
/* internal state */
PERLVAR(Itainting, bool) /* doing taint checks */
PERLVARI(Iop_mask, char *, NULL) /* masked operations for safe evals */
-PERLVAR(Ilast_proto, char *) /* Prototype of last sub seen. */
-
-/* trace state */
-PERLVAR(Idlevel, I32)
-PERLVARI(Idlmax, I32, 128)
-PERLVAR(Idebname, char *)
-PERLVAR(Idebdelim, char *)
/* current interpreter roots */
PERLVAR(Imain_cv, CV *)
@@ -139,15 +156,11 @@ PERLVARI(Icurcopdb, COP *, NULL)
PERLVARI(Icopline, line_t, NOLINE)
/* statics moved here for shared library purposes */
-PERLVAR(Istrchop, SV) /* return value from chop */
PERLVAR(Ifilemode, int) /* so nextargv() can preserve mode */
PERLVAR(Ilastfd, int) /* what to preserve mode on */
PERLVAR(Ioldname, char *) /* what to preserve mode on */
PERLVAR(IArgv, char **) /* stuff to free from do_aexec, vfork safe */
PERLVAR(ICmd, char *) /* stuff to free from do_aexec, vfork safe */
-PERLVAR(Imystrk, SV *) /* temp key string for do_each() */
-PERLVAR(Idumplvl, I32) /* indentation level on syntax tree dump */
-PERLVAR(Ioldlastpm, PMOP *) /* for saving regexp context in debugger */
PERLVAR(Igensym, I32) /* next symbol for getsym() to define */
PERLVAR(Ipreambled, bool)
PERLVAR(Ipreambleav, AV *)
@@ -164,6 +177,19 @@ PERLVAR(Iofmt, char *) /* output format for numbers $# */
PERLVARI(Iexitlist, PerlExitListEntry *, NULL)
/* list of exit functions */
PERLVARI(Iexitlistlen, I32, 0) /* length of same */
+
+/*
+=for apidoc Amn|HV*|PL_modglobal
+
+C<PL_modglobal> is a general purpose, interpreter global HV for use by
+extensions that need to keep information on a per-interpreter basis.
+In a pinch, it can also be used as a symbol table for extensions
+to share data among each other. It is a good idea to use keys
+prefixed by the package name of the extension that owns the data.
+
+=cut
+*/
+
PERLVAR(Imodglobal, HV *) /* per-interp module data */
/* these used to be in global before 5.004_68 */
@@ -187,7 +213,6 @@ PERLVAR(Isys_intern, struct interp_intern)
/* more statics moved here */
PERLVARI(Igeneration, int, 100) /* from op.c */
PERLVAR(IDBcv, CV *) /* from perl.c */
-PERLVAR(Iarchpat_auto, char*) /* from perl.c */
PERLVARI(Iin_clean_objs,bool, FALSE) /* from sv.c */
PERLVARI(Iin_clean_all, bool, FALSE) /* from sv.c */
@@ -202,18 +227,219 @@ PERLVARI(Ithreadnum, U32, 0) /* incremented each thread creation */
PERLVAR(Istrtab_mutex, perl_mutex) /* Mutex for string table access */
#endif /* USE_THREADS */
-PERLVARI(Ibytecode_iv_overflows,int, 0) /* from bytecode.h */
-PERLVAR(Ibytecode_sv, SV *)
-PERLVAR(Ibytecode_pv, XPV)
-PERLVAR(Ibytecode_obj_list, void **)
-PERLVARI(Ibytecode_obj_list_fill, I32, -1)
-
-#ifdef PERL_OBJECT
-PERLVARI(piMem, IPerlMem*, NULL)
-PERLVARI(piENV, IPerlEnv*, NULL)
-PERLVARI(piStdIO, IPerlStdIO*, NULL)
-PERLVARI(piLIO, IPerlLIO*, NULL)
-PERLVARI(piDir, IPerlDir*, NULL)
-PERLVARI(piSock, IPerlSock*, NULL)
-PERLVARI(piProc, IPerlProc*, NULL)
+PERLVAR(Iuid, Uid_t) /* current real user id */
+PERLVAR(Ieuid, Uid_t) /* current effective user id */
+PERLVAR(Igid, Gid_t) /* current real group id */
+PERLVAR(Iegid, Gid_t) /* current effective group id */
+PERLVAR(Inomemok, bool) /* let malloc context handle nomem */
+PERLVAR(Ian, U32) /* malloc sequence number */
+PERLVAR(Icop_seqmax, U32) /* statement sequence number */
+PERLVAR(Iop_seqmax, U16) /* op sequence number */
+PERLVAR(Ievalseq, U32) /* eval sequence number */
+PERLVAR(Iorigenviron, char **)
+PERLVAR(Iorigalen, U32)
+PERLVAR(Ipidstatus, HV *) /* pid-to-status mappings for waitpid */
+PERLVARI(Imaxo, int, MAXO) /* maximum number of ops */
+PERLVAR(Iosname, char *) /* operating system */
+PERLVARI(Ish_path, char *, SH_PATH)/* full path of shell */
+PERLVAR(Isighandlerp, Sighandler_t)
+
+PERLVAR(Ixiv_arenaroot, XPV*) /* list of allocated xiv areas */
+PERLVAR(Ixiv_root, IV *) /* free xiv list--shared by interpreters */
+PERLVAR(Ixnv_root, NV *) /* free xnv list--shared by interpreters */
+PERLVAR(Ixrv_root, XRV *) /* free xrv list--shared by interpreters */
+PERLVAR(Ixpv_root, XPV *) /* free xpv list--shared by interpreters */
+PERLVAR(Ixpviv_root, XPVIV *) /* free xpviv list--shared by interpreters */
+PERLVAR(Ixpvnv_root, XPVNV *) /* free xpvnv list--shared by interpreters */
+PERLVAR(Ixpvcv_root, XPVCV *) /* free xpvcv list--shared by interpreters */
+PERLVAR(Ixpvav_root, XPVAV *) /* free xpvav list--shared by interpreters */
+PERLVAR(Ixpvhv_root, XPVHV *) /* free xpvhv list--shared by interpreters */
+PERLVAR(Ixpvmg_root, XPVMG *) /* free xpvmg list--shared by interpreters */
+PERLVAR(Ixpvlv_root, XPVLV *) /* free xpvlv list--shared by interpreters */
+PERLVAR(Ixpvbm_root, XPVBM *) /* free xpvbm list--shared by interpreters */
+PERLVAR(Ihe_root, HE *) /* free he list--shared by interpreters */
+PERLVAR(Inice_chunk, char *) /* a nice chunk of memory to reuse */
+PERLVAR(Inice_chunk_size, U32) /* how nice the chunk of memory is */
+
+PERLVARI(Irunops, runops_proc_t, MEMBER_TO_FPTR(RUNOPS_DEFAULT))
+
+PERLVARA(Itokenbuf,256, char)
+
+/*
+=for apidoc Amn|SV|PL_sv_undef
+This is the C<undef> SV. Always refer to this as C<&PL_sv_undef>.
+
+=for apidoc Amn|SV|PL_sv_no
+This is the C<false> SV. See C<PL_sv_yes>. Always refer to this as
+C<&PL_sv_no>.
+
+=for apidoc Amn|SV|PL_sv_yes
+This is the C<true> SV. See C<PL_sv_no>. Always refer to this as
+C<&PL_sv_yes>.
+
+=cut
+*/
+
+PERLVAR(Isv_undef, SV)
+PERLVAR(Isv_no, SV)
+PERLVAR(Isv_yes, SV)
+
+#ifdef CSH
+PERLVARI(Icshname, char *, CSH)
+PERLVAR(Icshlen, I32)
+#endif
+
+PERLVAR(Ilex_state, U32) /* next token is determined */
+PERLVAR(Ilex_defer, U32) /* state after determined token */
+PERLVAR(Ilex_expect, int) /* expect after determined token */
+PERLVAR(Ilex_brackets, I32) /* bracket count */
+PERLVAR(Ilex_formbrack, I32) /* bracket count at outer format level */
+PERLVAR(Ilex_casemods, I32) /* casemod count */
+PERLVAR(Ilex_dojoin, I32) /* doing an array interpolation */
+PERLVAR(Ilex_starts, I32) /* how many interps done on level */
+PERLVAR(Ilex_stuff, SV *) /* runtime pattern from m// or s/// */
+PERLVAR(Ilex_repl, SV *) /* runtime replacement from s/// */
+PERLVAR(Ilex_op, OP *) /* extra info to pass back on op */
+PERLVAR(Ilex_inpat, OP *) /* in pattern $) and $| are special */
+PERLVAR(Ilex_inwhat, I32) /* what kind of quoting are we in */
+PERLVAR(Ilex_brackstack,char *) /* what kind of brackets to pop */
+PERLVAR(Ilex_casestack, char *) /* what kind of case mods in effect */
+
+/* What we know when we're in LEX_KNOWNEXT state. */
+PERLVARA(Inextval,5, YYSTYPE) /* value of next token, if any */
+PERLVARA(Inexttype,5, I32) /* type of next token */
+PERLVAR(Inexttoke, I32)
+
+PERLVAR(Ilinestr, SV *)
+PERLVAR(Ibufptr, char *)
+PERLVAR(Ioldbufptr, char *)
+PERLVAR(Ioldoldbufptr, char *)
+PERLVAR(Ibufend, char *)
+PERLVARI(Iexpect,int, XSTATE) /* how to interpret ambiguous tokens */
+
+PERLVAR(Imulti_start, I32) /* 1st line of multi-line string */
+PERLVAR(Imulti_end, I32) /* last line of multi-line string */
+PERLVAR(Imulti_open, I32) /* delimiter of said string */
+PERLVAR(Imulti_close, I32) /* delimiter of said string */
+
+PERLVAR(Ierror_count, I32) /* how many errors so far, max 10 */
+PERLVAR(Isubline, I32) /* line this subroutine began on */
+PERLVAR(Isubname, SV *) /* name of current subroutine */
+
+PERLVAR(Imin_intro_pending, I32) /* start of vars to introduce */
+PERLVAR(Imax_intro_pending, I32) /* end of vars to introduce */
+PERLVAR(Ipadix, I32) /* max used index in current "register" pad */
+PERLVAR(Ipadix_floor, I32) /* how low may inner block reset padix */
+PERLVAR(Ipad_reset_pending, I32) /* reset pad on next attempted alloc */
+
+PERLVAR(Ilast_uni, char *) /* position of last named-unary op */
+PERLVAR(Ilast_lop, char *) /* position of last list operator */
+PERLVAR(Ilast_lop_op, OPCODE) /* last list operator */
+PERLVAR(Iin_my, I32) /* we're compiling a "my" (or "our") declaration */
+PERLVAR(Iin_my_stash, HV *) /* declared class of this "my" declaration */
+#ifdef FCRYPT
+PERLVAR(Icryptseen, bool) /* has fast crypt() been initialized? */
+#endif
+
+PERLVAR(Ihints, U32) /* pragma-tic compile-time flags */
+
+PERLVAR(Idebug, VOL U32) /* flags given to -D switch */
+
+PERLVAR(Iamagic_generation, long)
+
+#ifdef USE_LOCALE_COLLATE
+PERLVAR(Icollation_ix, U32) /* Collation generation index */
+PERLVAR(Icollation_name,char *) /* Name of current collation */
+PERLVARI(Icollation_standard, bool, TRUE)
+ /* Assume simple collation */
+PERLVAR(Icollxfrm_base, Size_t) /* Basic overhead in *xfrm() */
+PERLVARI(Icollxfrm_mult,Size_t, 2) /* Expansion factor in *xfrm() */
+#endif /* USE_LOCALE_COLLATE */
+
+#ifdef USE_LOCALE_NUMERIC
+
+PERLVAR(Inumeric_name, char *) /* Name of current numeric locale */
+PERLVARI(Inumeric_standard, bool, TRUE)
+ /* Assume simple numerics */
+PERLVARI(Inumeric_local, bool, TRUE)
+ /* Assume local numerics */
+PERLVAR(Inumeric_radix, char)
+ /* The radix character if not '.' */
+
+#endif /* !USE_LOCALE_NUMERIC */
+
+/* utf8 character classes */
+PERLVAR(Iutf8_alnum, SV *)
+PERLVAR(Iutf8_alnumc, SV *)
+PERLVAR(Iutf8_ascii, SV *)
+PERLVAR(Iutf8_alpha, SV *)
+PERLVAR(Iutf8_space, SV *)
+PERLVAR(Iutf8_cntrl, SV *)
+PERLVAR(Iutf8_graph, SV *)
+PERLVAR(Iutf8_digit, SV *)
+PERLVAR(Iutf8_upper, SV *)
+PERLVAR(Iutf8_lower, SV *)
+PERLVAR(Iutf8_print, SV *)
+PERLVAR(Iutf8_punct, SV *)
+PERLVAR(Iutf8_xdigit, SV *)
+PERLVAR(Iutf8_mark, SV *)
+PERLVAR(Iutf8_toupper, SV *)
+PERLVAR(Iutf8_totitle, SV *)
+PERLVAR(Iutf8_tolower, SV *)
+PERLVAR(Ilast_swash_hv, HV *)
+PERLVAR(Ilast_swash_klen, U32)
+PERLVARA(Ilast_swash_key,10, U8)
+PERLVAR(Ilast_swash_tmps, U8 *)
+PERLVAR(Ilast_swash_slen, STRLEN)
+
+/* perly.c globals */
+PERLVAR(Iyydebug, int)
+PERLVAR(Iyynerrs, int)
+PERLVAR(Iyyerrflag, int)
+PERLVAR(Iyychar, int)
+PERLVAR(Iyyval, YYSTYPE)
+PERLVAR(Iyylval, YYSTYPE)
+
+PERLVAR(Iglob_index, int)
+PERLVAR(Isrand_called, bool)
+PERLVARA(Iuudmap,256, char)
+PERLVAR(Ibitcount, char *)
+
+#ifdef USE_THREADS
+PERLVAR(Isv_mutex, perl_mutex) /* Mutex for allocating SVs in sv.c */
+PERLVAR(Ieval_mutex, perl_mutex) /* Mutex for doeval */
+PERLVAR(Ieval_cond, perl_cond) /* Condition variable for doeval */
+PERLVAR(Ieval_owner, struct perl_thread *)
+ /* Owner thread for doeval */
+PERLVAR(Inthreads, int) /* Number of threads currently */
+PERLVAR(Ithreads_mutex, perl_mutex) /* Mutex for nthreads and thread list */
+PERLVAR(Inthreads_cond, perl_cond) /* Condition variable for nthreads */
+PERLVAR(Isvref_mutex, perl_mutex) /* Mutex for SvREFCNT_{inc,dec} */
+PERLVARI(Ithreadsv_names,char *, THREADSV_NAMES)
+#ifdef FAKE_THREADS
+PERLVAR(Icurthr, struct perl_thread *)
+ /* Currently executing (fake) thread */
+#endif
+
+PERLVAR(Icred_mutex, perl_mutex) /* altered credentials in effect */
+
+#endif /* USE_THREADS */
+
+PERLVAR(Ipsig_ptr, SV**)
+PERLVAR(Ipsig_name, SV**)
+
+#if defined(PERL_IMPLICIT_SYS)
+PERLVAR(IMem, struct IPerlMem*)
+PERLVAR(IMemShared, struct IPerlMem*)
+PERLVAR(IMemParse, struct IPerlMem*)
+PERLVAR(IEnv, struct IPerlEnv*)
+PERLVAR(IStdIO, struct IPerlStdIO*)
+PERLVAR(ILIO, struct IPerlLIO*)
+PERLVAR(IDir, struct IPerlDir*)
+PERLVAR(ISock, struct IPerlSock*)
+PERLVAR(IProc, struct IPerlProc*)
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Iptr_table, PTR_TBL_t*)
#endif
diff --git a/contrib/perl5/iperlsys.h b/contrib/perl5/iperlsys.h
index da8c5d6..f36dcd5 100644
--- a/contrib/perl5/iperlsys.h
+++ b/contrib/perl5/iperlsys.h
@@ -71,63 +71,118 @@
# define PERLIO_IS_STDIO
# endif
#else
-extern void PerlIO_init _((void));
+extern void PerlIO_init (void);
#endif
-#ifdef PERL_OBJECT
+#ifndef Sighandler_t
+typedef Signal_t (*Sighandler_t) (int);
+#endif
+
+#if defined(PERL_IMPLICIT_SYS)
#ifndef PerlIO
typedef struct _PerlIO PerlIO;
#endif
-class IPerlStdIO
+/* IPerlStdIO */
+struct IPerlStdIO;
+struct IPerlStdIOInfo;
+typedef PerlIO* (*LPStdin)(struct IPerlStdIO*);
+typedef PerlIO* (*LPStdout)(struct IPerlStdIO*);
+typedef PerlIO* (*LPStderr)(struct IPerlStdIO*);
+typedef PerlIO* (*LPOpen)(struct IPerlStdIO*, const char*,
+ const char*);
+typedef int (*LPClose)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPEof)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPError)(struct IPerlStdIO*, PerlIO*);
+typedef void (*LPClearerr)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPGetc)(struct IPerlStdIO*, PerlIO*);
+typedef char* (*LPGetBase)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPGetBufsiz)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPGetCnt)(struct IPerlStdIO*, PerlIO*);
+typedef char* (*LPGetPtr)(struct IPerlStdIO*, PerlIO*);
+typedef char* (*LPGets)(struct IPerlStdIO*, PerlIO*, char*, int);
+typedef int (*LPPutc)(struct IPerlStdIO*, PerlIO*, int);
+typedef int (*LPPuts)(struct IPerlStdIO*, PerlIO*, const char*);
+typedef int (*LPFlush)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPUngetc)(struct IPerlStdIO*, PerlIO*,int);
+typedef int (*LPFileno)(struct IPerlStdIO*, PerlIO*);
+typedef PerlIO* (*LPFdopen)(struct IPerlStdIO*, int, const char*);
+typedef PerlIO* (*LPReopen)(struct IPerlStdIO*, const char*,
+ const char*, PerlIO*);
+typedef SSize_t (*LPRead)(struct IPerlStdIO*, PerlIO*, void*, Size_t);
+typedef SSize_t (*LPWrite)(struct IPerlStdIO*, PerlIO*, const void*,
+ Size_t);
+typedef void (*LPSetBuf)(struct IPerlStdIO*, PerlIO*, char*);
+typedef int (*LPSetVBuf)(struct IPerlStdIO*, PerlIO*, char*, int,
+ Size_t);
+typedef void (*LPSetCnt)(struct IPerlStdIO*, PerlIO*, int);
+typedef void (*LPSetPtrCnt)(struct IPerlStdIO*, PerlIO*, char*,
+ int);
+typedef void (*LPSetlinebuf)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPPrintf)(struct IPerlStdIO*, PerlIO*, const char*,
+ ...);
+typedef int (*LPVprintf)(struct IPerlStdIO*, PerlIO*, const char*,
+ va_list);
+typedef long (*LPTell)(struct IPerlStdIO*, PerlIO*);
+typedef int (*LPSeek)(struct IPerlStdIO*, PerlIO*, Off_t, int);
+typedef void (*LPRewind)(struct IPerlStdIO*, PerlIO*);
+typedef PerlIO* (*LPTmpfile)(struct IPerlStdIO*);
+typedef int (*LPGetpos)(struct IPerlStdIO*, PerlIO*, Fpos_t*);
+typedef int (*LPSetpos)(struct IPerlStdIO*, PerlIO*,
+ const Fpos_t*);
+typedef void (*LPInit)(struct IPerlStdIO*);
+typedef void (*LPInitOSExtras)(struct IPerlStdIO*);
+typedef PerlIO* (*LPFdupopen)(struct IPerlStdIO*, PerlIO*);
+
+struct IPerlStdIO
{
-public:
- virtual PerlIO * Stdin(void) = 0;
- virtual PerlIO * Stdout(void) = 0;
- virtual PerlIO * Stderr(void) = 0;
- virtual PerlIO * Open(const char *, const char *, int &err) = 0;
- virtual int Close(PerlIO*, int &err) = 0;
- virtual int Eof(PerlIO*, int &err) = 0;
- virtual int Error(PerlIO*, int &err) = 0;
- virtual void Clearerr(PerlIO*, int &err) = 0;
- virtual int Getc(PerlIO*, int &err) = 0;
- virtual char * GetBase(PerlIO *, int &err) = 0;
- virtual int GetBufsiz(PerlIO *, int &err) = 0;
- virtual int GetCnt(PerlIO *, int &err) = 0;
- virtual char * GetPtr(PerlIO *, int &err) = 0;
- virtual char * Gets(PerlIO*, char*, int, int& err) = 0;
- virtual int Putc(PerlIO*, int, int &err) = 0;
- virtual int Puts(PerlIO*, const char *, int &err) = 0;
- virtual int Flush(PerlIO*, int &err) = 0;
- virtual int Ungetc(PerlIO*,int, int &err) = 0;
- virtual int Fileno(PerlIO*, int &err) = 0;
- virtual PerlIO * Fdopen(int, const char *, int &err) = 0;
- virtual PerlIO * Reopen(const char*, const char*, PerlIO*, int &err) = 0;
- virtual SSize_t Read(PerlIO*,void *,Size_t, int &err) = 0;
- virtual SSize_t Write(PerlIO*,const void *,Size_t, int &err) = 0;
- virtual void SetBuf(PerlIO *, char*, int &err) = 0;
- virtual int SetVBuf(PerlIO *, char*, int, Size_t, int &err) = 0;
- virtual void SetCnt(PerlIO *, int, int &err) = 0;
- virtual void SetPtrCnt(PerlIO *, char *, int, int& err) = 0;
- virtual void Setlinebuf(PerlIO*, int &err) = 0;
- virtual int Printf(PerlIO*, int &err, const char *,...) = 0;
- virtual int Vprintf(PerlIO*, int &err, const char *, va_list) = 0;
- virtual long Tell(PerlIO*, int &err) = 0;
- virtual int Seek(PerlIO*, Off_t, int, int &err) = 0;
- virtual void Rewind(PerlIO*, int &err) = 0;
- virtual PerlIO * Tmpfile(int &err) = 0;
- virtual int Getpos(PerlIO*, Fpos_t *, int &err) = 0;
- virtual int Setpos(PerlIO*, const Fpos_t *, int &err) = 0;
- virtual void Init(int &err) = 0;
- virtual void InitOSExtras(void* p) = 0;
-#ifdef WIN32
- virtual int OpenOSfhandle(long osfhandle, int flags) = 0;
- virtual int GetOSfhandle(int filenum) = 0;
-#endif
+ LPStdin pStdin;
+ LPStdout pStdout;
+ LPStderr pStderr;
+ LPOpen pOpen;
+ LPClose pClose;
+ LPEof pEof;
+ LPError pError;
+ LPClearerr pClearerr;
+ LPGetc pGetc;
+ LPGetBase pGetBase;
+ LPGetBufsiz pGetBufsiz;
+ LPGetCnt pGetCnt;
+ LPGetPtr pGetPtr;
+ LPGets pGets;
+ LPPutc pPutc;
+ LPPuts pPuts;
+ LPFlush pFlush;
+ LPUngetc pUngetc;
+ LPFileno pFileno;
+ LPFdopen pFdopen;
+ LPReopen pReopen;
+ LPRead pRead;
+ LPWrite pWrite;
+ LPSetBuf pSetBuf;
+ LPSetVBuf pSetVBuf;
+ LPSetCnt pSetCnt;
+ LPSetPtrCnt pSetPtrCnt;
+ LPSetlinebuf pSetlinebuf;
+ LPPrintf pPrintf;
+ LPVprintf pVprintf;
+ LPTell pTell;
+ LPSeek pSeek;
+ LPRewind pRewind;
+ LPTmpfile pTmpfile;
+ LPGetpos pGetpos;
+ LPSetpos pSetpos;
+ LPInit pInit;
+ LPInitOSExtras pInitOSExtras;
+ LPFdupopen pFdupopen;
};
-
+struct IPerlStdIOInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlStdIO perlStdIOList;
+};
#ifdef USE_STDIO_PTR
# define PerlIO_has_cntptr(f) 1
@@ -154,55 +209,93 @@ public:
#define PerlIO_has_base(f) 0
#endif
-#define PerlIO_stdin() PL_piStdIO->Stdin()
-#define PerlIO_stdout() PL_piStdIO->Stdout()
-#define PerlIO_stderr() PL_piStdIO->Stderr()
-#define PerlIO_open(x,y) PL_piStdIO->Open((x),(y), ErrorNo())
-#define PerlIO_close(f) PL_piStdIO->Close((f), ErrorNo())
-#define PerlIO_eof(f) PL_piStdIO->Eof((f), ErrorNo())
-#define PerlIO_error(f) PL_piStdIO->Error((f), ErrorNo())
-#define PerlIO_clearerr(f) PL_piStdIO->Clearerr((f), ErrorNo())
-#define PerlIO_getc(f) PL_piStdIO->Getc((f), ErrorNo())
-#define PerlIO_get_base(f) PL_piStdIO->GetBase((f), ErrorNo())
-#define PerlIO_get_bufsiz(f) PL_piStdIO->GetBufsiz((f), ErrorNo())
-#define PerlIO_get_cnt(f) PL_piStdIO->GetCnt((f), ErrorNo())
-#define PerlIO_get_ptr(f) PL_piStdIO->GetPtr((f), ErrorNo())
-#define PerlIO_putc(f,c) PL_piStdIO->Putc((f),(c), ErrorNo())
-#define PerlIO_puts(f,s) PL_piStdIO->Puts((f),(s), ErrorNo())
-#define PerlIO_flush(f) PL_piStdIO->Flush((f), ErrorNo())
-#define PerlIO_gets(s, n, fp) PL_piStdIO->Gets((fp), s, n, ErrorNo())
-#define PerlIO_ungetc(f,c) PL_piStdIO->Ungetc((f),(c), ErrorNo())
-#define PerlIO_fileno(f) PL_piStdIO->Fileno((f), ErrorNo())
-#define PerlIO_fdopen(f, s) PL_piStdIO->Fdopen((f),(s), ErrorNo())
-#define PerlIO_reopen(p, m, f) PL_piStdIO->Reopen((p), (m), (f), ErrorNo())
+#define PerlIO_stdin() \
+ (*PL_StdIO->pStdin)(PL_StdIO)
+#define PerlIO_stdout() \
+ (*PL_StdIO->pStdout)(PL_StdIO)
+#define PerlIO_stderr() \
+ (*PL_StdIO->pStderr)(PL_StdIO)
+#define PerlIO_open(x,y) \
+ (*PL_StdIO->pOpen)(PL_StdIO, (x),(y))
+#define PerlIO_close(f) \
+ (*PL_StdIO->pClose)(PL_StdIO, (f))
+#define PerlIO_eof(f) \
+ (*PL_StdIO->pEof)(PL_StdIO, (f))
+#define PerlIO_error(f) \
+ (*PL_StdIO->pError)(PL_StdIO, (f))
+#define PerlIO_clearerr(f) \
+ (*PL_StdIO->pClearerr)(PL_StdIO, (f))
+#define PerlIO_getc(f) \
+ (*PL_StdIO->pGetc)(PL_StdIO, (f))
+#define PerlIO_get_base(f) \
+ (*PL_StdIO->pGetBase)(PL_StdIO, (f))
+#define PerlIO_get_bufsiz(f) \
+ (*PL_StdIO->pGetBufsiz)(PL_StdIO, (f))
+#define PerlIO_get_cnt(f) \
+ (*PL_StdIO->pGetCnt)(PL_StdIO, (f))
+#define PerlIO_get_ptr(f) \
+ (*PL_StdIO->pGetPtr)(PL_StdIO, (f))
+#define PerlIO_putc(f,c) \
+ (*PL_StdIO->pPutc)(PL_StdIO, (f),(c))
+#define PerlIO_puts(f,s) \
+ (*PL_StdIO->pPuts)(PL_StdIO, (f),(s))
+#define PerlIO_flush(f) \
+ (*PL_StdIO->pFlush)(PL_StdIO, (f))
+#define PerlIO_gets(s, n, fp) \
+ (*PL_StdIO->pGets)(PL_StdIO, (fp), s, n)
+#define PerlIO_ungetc(f,c) \
+ (*PL_StdIO->pUngetc)(PL_StdIO, (f),(c))
+#define PerlIO_fileno(f) \
+ (*PL_StdIO->pFileno)(PL_StdIO, (f))
+#define PerlIO_fdopen(f, s) \
+ (*PL_StdIO->pFdopen)(PL_StdIO, (f),(s))
+#define PerlIO_reopen(p, m, f) \
+ (*PL_StdIO->pReopen)(PL_StdIO, (p), (m), (f))
#define PerlIO_read(f,buf,count) \
- (SSize_t)PL_piStdIO->Read((f), (buf), (count), ErrorNo())
+ (SSize_t)(*PL_StdIO->pRead)(PL_StdIO, (f), (buf), (count))
#define PerlIO_write(f,buf,count) \
- PL_piStdIO->Write((f), (buf), (count), ErrorNo())
-#define PerlIO_setbuf(f,b) PL_piStdIO->SetBuf((f), (b), ErrorNo())
-#define PerlIO_setvbuf(f,b,t,s) PL_piStdIO->SetVBuf((f), (b), (t), (s), ErrorNo())
-#define PerlIO_set_cnt(f,c) PL_piStdIO->SetCnt((f), (c), ErrorNo())
+ (*PL_StdIO->pWrite)(PL_StdIO, (f), (buf), (count))
+#define PerlIO_setbuf(f,b) \
+ (*PL_StdIO->pSetBuf)(PL_StdIO, (f), (b))
+#define PerlIO_setvbuf(f,b,t,s) \
+ (*PL_StdIO->pSetVBuf)(PL_StdIO, (f),(b),(t),(s))
+#define PerlIO_set_cnt(f,c) \
+ (*PL_StdIO->pSetCnt)(PL_StdIO, (f), (c))
#define PerlIO_set_ptrcnt(f,p,c) \
- PL_piStdIO->SetPtrCnt((f), (p), (c), ErrorNo())
-#define PerlIO_setlinebuf(f) PL_piStdIO->Setlinebuf((f), ErrorNo())
-#define PerlIO_printf fprintf
-#define PerlIO_stdoutf PL_piStdIO->Printf
-#define PerlIO_vprintf(f,fmt,a) PL_piStdIO->Vprintf((f), ErrorNo(), (fmt),a)
-#define PerlIO_tell(f) PL_piStdIO->Tell((f), ErrorNo())
-#define PerlIO_seek(f,o,w) PL_piStdIO->Seek((f),(o),(w), ErrorNo())
-#define PerlIO_getpos(f,p) PL_piStdIO->Getpos((f),(p), ErrorNo())
-#define PerlIO_setpos(f,p) PL_piStdIO->Setpos((f),(p), ErrorNo())
-#define PerlIO_rewind(f) PL_piStdIO->Rewind((f), ErrorNo())
-#define PerlIO_tmpfile() PL_piStdIO->Tmpfile(ErrorNo())
-#define PerlIO_init() PL_piStdIO->Init(ErrorNo())
+ (*PL_StdIO->pSetPtrCnt)(PL_StdIO, (f), (p), (c))
+#define PerlIO_setlinebuf(f) \
+ (*PL_StdIO->pSetlinebuf)(PL_StdIO, (f))
+#define PerlIO_printf Perl_fprintf_nocontext
+#define PerlIO_stdoutf *PL_StdIO->pPrintf
+#define PerlIO_vprintf(f,fmt,a) \
+ (*PL_StdIO->pVprintf)(PL_StdIO, (f),(fmt),a)
+#define PerlIO_tell(f) \
+ (*PL_StdIO->pTell)(PL_StdIO, (f))
+#define PerlIO_seek(f,o,w) \
+ (*PL_StdIO->pSeek)(PL_StdIO, (f),(o),(w))
+#define PerlIO_getpos(f,p) \
+ (*PL_StdIO->pGetpos)(PL_StdIO, (f),(p))
+#define PerlIO_setpos(f,p) \
+ (*PL_StdIO->pSetpos)(PL_StdIO, (f),(p))
+#define PerlIO_rewind(f) \
+ (*PL_StdIO->pRewind)(PL_StdIO, (f))
+#define PerlIO_tmpfile() \
+ (*PL_StdIO->pTmpfile)(PL_StdIO)
+#define PerlIO_init() \
+ (*PL_StdIO->pInit)(PL_StdIO)
#undef init_os_extras
-#define init_os_extras() PL_piStdIO->InitOSExtras(this)
+#define init_os_extras() \
+ (*PL_StdIO->pInitOSExtras)(PL_StdIO)
+#define PerlIO_fdupopen(f) \
+ (*PL_StdIO->pFdupopen)(PL_StdIO, (f))
-#else /* PERL_OBJECT */
+#else /* PERL_IMPLICIT_SYS */
#include "perlsdio.h"
+#include "perl.h"
+#define PerlIO_fdupopen(f) (f)
-#endif /* PERL_OBJECT */
+#endif /* PERL_IMPLICIT_SYS */
#ifndef PERLIO_IS_STDIO
#ifdef USE_SFIO
@@ -250,133 +343,136 @@ struct _PerlIO;
#endif
#ifndef PerlIO_stdoutf
-extern int PerlIO_stdoutf _((const char *,...))
- __attribute__((format (printf, 1, 2)));
+extern int PerlIO_stdoutf (const char *,...)
+ __attribute__((__format__ (__printf__, 1, 2)));
#endif
#ifndef PerlIO_puts
-extern int PerlIO_puts _((PerlIO *,const char *));
+extern int PerlIO_puts (PerlIO *,const char *);
#endif
#ifndef PerlIO_open
-extern PerlIO * PerlIO_open _((const char *,const char *));
+extern PerlIO * PerlIO_open (const char *,const char *);
#endif
#ifndef PerlIO_close
-extern int PerlIO_close _((PerlIO *));
+extern int PerlIO_close (PerlIO *);
#endif
#ifndef PerlIO_eof
-extern int PerlIO_eof _((PerlIO *));
+extern int PerlIO_eof (PerlIO *);
#endif
#ifndef PerlIO_error
-extern int PerlIO_error _((PerlIO *));
+extern int PerlIO_error (PerlIO *);
#endif
#ifndef PerlIO_clearerr
-extern void PerlIO_clearerr _((PerlIO *));
+extern void PerlIO_clearerr (PerlIO *);
#endif
#ifndef PerlIO_getc
-extern int PerlIO_getc _((PerlIO *));
+extern int PerlIO_getc (PerlIO *);
#endif
#ifndef PerlIO_putc
-extern int PerlIO_putc _((PerlIO *,int));
+extern int PerlIO_putc (PerlIO *,int);
#endif
#ifndef PerlIO_flush
-extern int PerlIO_flush _((PerlIO *));
+extern int PerlIO_flush (PerlIO *);
#endif
#ifndef PerlIO_ungetc
-extern int PerlIO_ungetc _((PerlIO *,int));
+extern int PerlIO_ungetc (PerlIO *,int);
#endif
#ifndef PerlIO_fileno
-extern int PerlIO_fileno _((PerlIO *));
+extern int PerlIO_fileno (PerlIO *);
#endif
#ifndef PerlIO_fdopen
-extern PerlIO * PerlIO_fdopen _((int, const char *));
+extern PerlIO * PerlIO_fdopen (int, const char *);
#endif
#ifndef PerlIO_importFILE
-extern PerlIO * PerlIO_importFILE _((FILE *,int));
+extern PerlIO * PerlIO_importFILE (FILE *,int);
#endif
#ifndef PerlIO_exportFILE
-extern FILE * PerlIO_exportFILE _((PerlIO *,int));
+extern FILE * PerlIO_exportFILE (PerlIO *,int);
#endif
#ifndef PerlIO_findFILE
-extern FILE * PerlIO_findFILE _((PerlIO *));
+extern FILE * PerlIO_findFILE (PerlIO *);
#endif
#ifndef PerlIO_releaseFILE
-extern void PerlIO_releaseFILE _((PerlIO *,FILE *));
+extern void PerlIO_releaseFILE (PerlIO *,FILE *);
#endif
#ifndef PerlIO_read
-extern SSize_t PerlIO_read _((PerlIO *,void *,Size_t));
+extern SSize_t PerlIO_read (PerlIO *,void *,Size_t);
#endif
#ifndef PerlIO_write
-extern SSize_t PerlIO_write _((PerlIO *,const void *,Size_t));
+extern SSize_t PerlIO_write (PerlIO *,const void *,Size_t);
#endif
#ifndef PerlIO_setlinebuf
-extern void PerlIO_setlinebuf _((PerlIO *));
+extern void PerlIO_setlinebuf (PerlIO *);
#endif
#ifndef PerlIO_printf
-extern int PerlIO_printf _((PerlIO *, const char *,...))
- __attribute__((format (printf, 2, 3)));
+extern int PerlIO_printf (PerlIO *, const char *,...)
+ __attribute__((__format__ (__printf__, 2, 3)));
#endif
#ifndef PerlIO_sprintf
-extern int PerlIO_sprintf _((char *, int, const char *,...))
- __attribute__((format (printf, 3, 4)));
+extern int PerlIO_sprintf (char *, int, const char *,...)
+ __attribute__((__format__ (__printf__, 3, 4)));
#endif
#ifndef PerlIO_vprintf
-extern int PerlIO_vprintf _((PerlIO *, const char *, va_list));
+extern int PerlIO_vprintf (PerlIO *, const char *, va_list);
#endif
#ifndef PerlIO_tell
-extern Off_t PerlIO_tell _((PerlIO *));
+extern Off_t PerlIO_tell (PerlIO *);
#endif
#ifndef PerlIO_seek
-extern int PerlIO_seek _((PerlIO *, Off_t, int));
+extern int PerlIO_seek (PerlIO *, Off_t, int);
#endif
#ifndef PerlIO_rewind
-extern void PerlIO_rewind _((PerlIO *));
+extern void PerlIO_rewind (PerlIO *);
#endif
#ifndef PerlIO_has_base
-extern int PerlIO_has_base _((PerlIO *));
+extern int PerlIO_has_base (PerlIO *);
#endif
#ifndef PerlIO_has_cntptr
-extern int PerlIO_has_cntptr _((PerlIO *));
+extern int PerlIO_has_cntptr (PerlIO *);
#endif
#ifndef PerlIO_fast_gets
-extern int PerlIO_fast_gets _((PerlIO *));
+extern int PerlIO_fast_gets (PerlIO *);
#endif
#ifndef PerlIO_canset_cnt
-extern int PerlIO_canset_cnt _((PerlIO *));
+extern int PerlIO_canset_cnt (PerlIO *);
#endif
#ifndef PerlIO_get_ptr
-extern STDCHAR * PerlIO_get_ptr _((PerlIO *));
+extern STDCHAR * PerlIO_get_ptr (PerlIO *);
#endif
#ifndef PerlIO_get_cnt
-extern int PerlIO_get_cnt _((PerlIO *));
+extern int PerlIO_get_cnt (PerlIO *);
#endif
#ifndef PerlIO_set_cnt
-extern void PerlIO_set_cnt _((PerlIO *,int));
+extern void PerlIO_set_cnt (PerlIO *,int);
#endif
#ifndef PerlIO_set_ptrcnt
-extern void PerlIO_set_ptrcnt _((PerlIO *,STDCHAR *,int));
+extern void PerlIO_set_ptrcnt (PerlIO *,STDCHAR *,int);
#endif
#ifndef PerlIO_get_base
-extern STDCHAR * PerlIO_get_base _((PerlIO *));
+extern STDCHAR * PerlIO_get_base (PerlIO *);
#endif
#ifndef PerlIO_get_bufsiz
-extern int PerlIO_get_bufsiz _((PerlIO *));
+extern int PerlIO_get_bufsiz (PerlIO *);
#endif
#ifndef PerlIO_tmpfile
-extern PerlIO * PerlIO_tmpfile _((void));
+extern PerlIO * PerlIO_tmpfile (void);
#endif
#ifndef PerlIO_stdin
-extern PerlIO * PerlIO_stdin _((void));
+extern PerlIO * PerlIO_stdin (void);
#endif
#ifndef PerlIO_stdout
-extern PerlIO * PerlIO_stdout _((void));
+extern PerlIO * PerlIO_stdout (void);
#endif
#ifndef PerlIO_stderr
-extern PerlIO * PerlIO_stderr _((void));
+extern PerlIO * PerlIO_stderr (void);
#endif
#ifndef PerlIO_getpos
-extern int PerlIO_getpos _((PerlIO *,Fpos_t *));
+extern int PerlIO_getpos (PerlIO *,Fpos_t *);
#endif
#ifndef PerlIO_setpos
-extern int PerlIO_setpos _((PerlIO *,const Fpos_t *));
+extern int PerlIO_setpos (PerlIO *,const Fpos_t *);
+#endif
+#ifndef PerlIO_fdupopen
+extern PerlIO * PerlIO_fdupopen (PerlIO *);
#endif
@@ -384,42 +480,74 @@ extern int PerlIO_setpos _((PerlIO *,const Fpos_t *));
* Interface for directory functions
*/
-#ifdef PERL_OBJECT
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlDir */
+struct IPerlDir;
+struct IPerlDirInfo;
+typedef int (*LPMakedir)(struct IPerlDir*, const char*, int);
+typedef int (*LPChdir)(struct IPerlDir*, const char*);
+typedef int (*LPRmdir)(struct IPerlDir*, const char*);
+typedef int (*LPDirClose)(struct IPerlDir*, DIR*);
+typedef DIR* (*LPDirOpen)(struct IPerlDir*, char*);
+typedef struct direct* (*LPDirRead)(struct IPerlDir*, DIR*);
+typedef void (*LPDirRewind)(struct IPerlDir*, DIR*);
+typedef void (*LPDirSeek)(struct IPerlDir*, DIR*, long);
+typedef long (*LPDirTell)(struct IPerlDir*, DIR*);
+#ifdef WIN32
+typedef char* (*LPDirMapPathA)(struct IPerlDir*, const char*);
+typedef WCHAR* (*LPDirMapPathW)(struct IPerlDir*, const WCHAR*);
+#endif
-class IPerlDir
+struct IPerlDir
{
-public:
- virtual int Makedir(const char *dirname, int mode, int &err) = 0;
- virtual int Chdir(const char *dirname, int &err) = 0;
- virtual int Rmdir(const char *dirname, int &err) = 0;
- virtual int Close(DIR *dirp, int &err) = 0;
- virtual DIR * Open(char *filename, int &err) = 0;
- virtual struct direct *Read(DIR *dirp, int &err) = 0;
- virtual void Rewind(DIR *dirp, int &err) = 0;
- virtual void Seek(DIR *dirp, long loc, int &err) = 0;
- virtual long Tell(DIR *dirp, int &err) = 0;
+ LPMakedir pMakedir;
+ LPChdir pChdir;
+ LPRmdir pRmdir;
+ LPDirClose pClose;
+ LPDirOpen pOpen;
+ LPDirRead pRead;
+ LPDirRewind pRewind;
+ LPDirSeek pSeek;
+ LPDirTell pTell;
+#ifdef WIN32
+ LPDirMapPathA pMapPathA;
+ LPDirMapPathW pMapPathW;
+#endif
+};
+
+struct IPerlDirInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlDir perlDirList;
};
#define PerlDir_mkdir(name, mode) \
- PL_piDir->Makedir((name), (mode), ErrorNo())
+ (*PL_Dir->pMakedir)(PL_Dir, (name), (mode))
#define PerlDir_chdir(name) \
- PL_piDir->Chdir((name), ErrorNo())
+ (*PL_Dir->pChdir)(PL_Dir, (name))
#define PerlDir_rmdir(name) \
- PL_piDir->Rmdir((name), ErrorNo())
+ (*PL_Dir->pRmdir)(PL_Dir, (name))
#define PerlDir_close(dir) \
- PL_piDir->Close((dir), ErrorNo())
+ (*PL_Dir->pClose)(PL_Dir, (dir))
#define PerlDir_open(name) \
- PL_piDir->Open((name), ErrorNo())
+ (*PL_Dir->pOpen)(PL_Dir, (name))
#define PerlDir_read(dir) \
- PL_piDir->Read((dir), ErrorNo())
+ (*PL_Dir->pRead)(PL_Dir, (dir))
#define PerlDir_rewind(dir) \
- PL_piDir->Rewind((dir), ErrorNo())
+ (*PL_Dir->pRewind)(PL_Dir, (dir))
#define PerlDir_seek(dir, loc) \
- PL_piDir->Seek((dir), (loc), ErrorNo())
+ (*PL_Dir->pSeek)(PL_Dir, (dir), (loc))
#define PerlDir_tell(dir) \
- PL_piDir->Tell((dir), ErrorNo())
+ (*PL_Dir->pTell)(PL_Dir, (dir))
+#ifdef WIN32
+#define PerlDir_mapA(dir) \
+ (*PL_Dir->pMapPathA)(PL_Dir, (dir))
+#define PerlDir_mapW(dir) \
+ (*PL_Dir->pMapPathW)(PL_Dir, (dir))
+#endif
-#else /* PERL_OBJECT */
+#else /* PERL_IMPLICIT_SYS */
#define PerlDir_mkdir(name, mode) Mkdir((name), (mode))
#ifdef VMS
@@ -434,132 +562,279 @@ public:
#define PerlDir_rewind(dir) rewinddir((dir))
#define PerlDir_seek(dir, loc) seekdir((dir), (loc))
#define PerlDir_tell(dir) telldir((dir))
+#ifdef WIN32
+#define PerlDir_mapA(dir) dir
+#define PerlDir_mapW(dir) dir
+#endif
-#endif /* PERL_OBJECT */
+#endif /* PERL_IMPLICIT_SYS */
/*
Interface for perl environment functions
*/
-#ifdef PERL_OBJECT
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlEnv */
+struct IPerlEnv;
+struct IPerlEnvInfo;
+typedef char* (*LPEnvGetenv)(struct IPerlEnv*, const char*);
+typedef int (*LPEnvPutenv)(struct IPerlEnv*, const char*);
+typedef char* (*LPEnvGetenv_len)(struct IPerlEnv*,
+ const char *varname, unsigned long *len);
+typedef int (*LPEnvUname)(struct IPerlEnv*, struct utsname *name);
+typedef void (*LPEnvClearenv)(struct IPerlEnv*);
+typedef void* (*LPEnvGetChildenv)(struct IPerlEnv*);
+typedef void (*LPEnvFreeChildenv)(struct IPerlEnv*, void* env);
+typedef char* (*LPEnvGetChilddir)(struct IPerlEnv*);
+typedef void (*LPEnvFreeChilddir)(struct IPerlEnv*, char* dir);
+#ifdef HAS_ENVGETENV
+typedef char* (*LPENVGetenv)(struct IPerlEnv*, const char *varname);
+typedef char* (*LPENVGetenv_len)(struct IPerlEnv*,
+ const char *varname, unsigned long *len);
+#endif
+#ifdef WIN32
+typedef unsigned long (*LPEnvOsID)(struct IPerlEnv*);
+typedef char* (*LPEnvLibPath)(struct IPerlEnv*, const char*);
+typedef char* (*LPEnvSiteLibPath)(struct IPerlEnv*, const char*);
+typedef char* (*LPEnvVendorLibPath)(struct IPerlEnv*, const char*);
+typedef void (*LPEnvGetChildIO)(struct IPerlEnv*, child_IO_table*);
+#endif
+
+struct IPerlEnv
+{
+ LPEnvGetenv pGetenv;
+ LPEnvPutenv pPutenv;
+ LPEnvGetenv_len pGetenv_len;
+ LPEnvUname pEnvUname;
+ LPEnvClearenv pClearenv;
+ LPEnvGetChildenv pGetChildenv;
+ LPEnvFreeChildenv pFreeChildenv;
+ LPEnvGetChilddir pGetChilddir;
+ LPEnvFreeChilddir pFreeChilddir;
+#ifdef HAS_ENVGETENV
+ LPENVGetenv pENVGetenv;
+ LPENVGetenv_len pENVGetenv_len;
+#endif
+#ifdef WIN32
+ LPEnvOsID pEnvOsID;
+ LPEnvLibPath pLibPath;
+ LPEnvSiteLibPath pSiteLibPath;
+ LPEnvVendorLibPath pVendorLibPath;
+ LPEnvGetChildIO pGetChildIO;
+#endif
+};
-class IPerlEnv
+struct IPerlEnvInfo
{
-public:
- virtual char * Getenv(const char *varname, int &err) = 0;
- virtual int Putenv(const char *envstring, int &err) = 0;
- virtual char * LibPath(char *patchlevel) =0;
- virtual char * SiteLibPath(char *patchlevel) =0;
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlEnv perlEnvList;
};
-#define PerlEnv_putenv(str) PL_piENV->Putenv((str), ErrorNo())
-#define PerlEnv_getenv(str) PL_piENV->Getenv((str), ErrorNo())
+#define PerlEnv_putenv(str) \
+ (*PL_Env->pPutenv)(PL_Env,(str))
+#define PerlEnv_getenv(str) \
+ (*PL_Env->pGetenv)(PL_Env,(str))
+#define PerlEnv_getenv_len(str,l) \
+ (*PL_Env->pGetenv_len)(PL_Env,(str), (l))
+#define PerlEnv_clearenv() \
+ (*PL_Env->pClearenv)(PL_Env)
+#define PerlEnv_get_childenv() \
+ (*PL_Env->pGetChildenv)(PL_Env)
+#define PerlEnv_free_childenv(e) \
+ (*PL_Env->pFreeChildenv)(PL_Env, (e))
+#define PerlEnv_get_childdir() \
+ (*PL_Env->pGetChilddir)(PL_Env)
+#define PerlEnv_free_childdir(d) \
+ (*PL_Env->pFreeChilddir)(PL_Env, (d))
+#ifdef HAS_ENVGETENV
+# define PerlEnv_ENVgetenv(str) \
+ (*PL_Env->pENVGetenv)(PL_Env,(str))
+# define PerlEnv_ENVgetenv_len(str,l) \
+ (*PL_Env->pENVGetenv_len)(PL_Env,(str), (l))
+#else
+# define PerlEnv_ENVgetenv(str) \
+ PerlEnv_getenv((str))
+# define PerlEnv_ENVgetenv_len(str,l) \
+ PerlEnv_getenv_len((str),(l))
+#endif
+#define PerlEnv_uname(name) \
+ (*PL_Env->pEnvUname)(PL_Env,(name))
#ifdef WIN32
-#define PerlEnv_lib_path(str) PL_piENV->LibPath((str))
-#define PerlEnv_sitelib_path(str) PL_piENV->SiteLibPath((str))
+#define PerlEnv_os_id() \
+ (*PL_Env->pEnvOsID)(PL_Env)
+#define PerlEnv_lib_path(str) \
+ (*PL_Env->pLibPath)(PL_Env,(str))
+#define PerlEnv_sitelib_path(str) \
+ (*PL_Env->pSiteLibPath)(PL_Env,(str))
+#define PerlEnv_vendorlib_path(str) \
+ (*PL_Env->pVendorLibPath)(PL_Env,(str))
+#define PerlEnv_get_child_IO(ptr) \
+ (*PL_Env->pGetChildIO)(PL_Env, ptr)
#endif
-#else /* PERL_OBJECT */
+#else /* PERL_IMPLICIT_SYS */
#define PerlEnv_putenv(str) putenv((str))
#define PerlEnv_getenv(str) getenv((str))
+#define PerlEnv_getenv_len(str,l) getenv_len((str), (l))
+#define PerlEnv_clearenv() clearenv()
+#define PerlEnv_get_childenv() get_childenv()
+#define PerlEnv_free_childenv(e) free_childenv((e))
+#define PerlEnv_get_childdir() get_childdir()
+#define PerlEnv_free_childdir(d) free_childdir((d))
+#ifdef HAS_ENVGETENV
+# define PerlEnv_ENVgetenv(str) ENVgetenv((str))
+# define PerlEnv_ENVgetenv_len(str,l) ENVgetenv_len((str), (l))
+#else
+# define PerlEnv_ENVgetenv(str) PerlEnv_getenv((str))
+# define PerlEnv_ENVgetenv_len(str,l) PerlEnv_getenv_len((str), (l))
+#endif
+#define PerlEnv_uname(name) uname((name))
+
+#ifdef WIN32
+#define PerlEnv_os_id() win32_os_id()
+#define PerlEnv_lib_path(str) win32_get_privlib(str)
+#define PerlEnv_sitelib_path(str) win32_get_sitelib(str)
+#define PerlEnv_vendorlib_path(str) win32_get_vendorlib(str)
+#define PerlEnv_get_child_IO(ptr) win32_get_child_IO(ptr)
+#endif
-#endif /* PERL_OBJECT */
+#endif /* PERL_IMPLICIT_SYS */
/*
Interface for perl low-level IO functions
*/
-#ifdef PERL_OBJECT
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlLIO */
+struct IPerlLIO;
+struct IPerlLIOInfo;
+typedef int (*LPLIOAccess)(struct IPerlLIO*, const char*, int);
+typedef int (*LPLIOChmod)(struct IPerlLIO*, const char*, int);
+typedef int (*LPLIOChown)(struct IPerlLIO*, const char*, uid_t,
+ gid_t);
+typedef int (*LPLIOChsize)(struct IPerlLIO*, int, long);
+typedef int (*LPLIOClose)(struct IPerlLIO*, int);
+typedef int (*LPLIODup)(struct IPerlLIO*, int);
+typedef int (*LPLIODup2)(struct IPerlLIO*, int, int);
+typedef int (*LPLIOFlock)(struct IPerlLIO*, int, int);
+typedef int (*LPLIOFileStat)(struct IPerlLIO*, int, struct stat*);
+typedef int (*LPLIOIOCtl)(struct IPerlLIO*, int, unsigned int,
+ char*);
+typedef int (*LPLIOIsatty)(struct IPerlLIO*, int);
+typedef int (*LPLIOLink)(struct IPerlLIO*, const char*,
+ const char *);
+typedef long (*LPLIOLseek)(struct IPerlLIO*, int, long, int);
+typedef int (*LPLIOLstat)(struct IPerlLIO*, const char*,
+ struct stat*);
+typedef char* (*LPLIOMktemp)(struct IPerlLIO*, char*);
+typedef int (*LPLIOOpen)(struct IPerlLIO*, const char*, int);
+typedef int (*LPLIOOpen3)(struct IPerlLIO*, const char*, int, int);
+typedef int (*LPLIORead)(struct IPerlLIO*, int, void*, unsigned int);
+typedef int (*LPLIORename)(struct IPerlLIO*, const char*,
+ const char*);
+typedef int (*LPLIOSetmode)(struct IPerlLIO*, int, int);
+typedef int (*LPLIONameStat)(struct IPerlLIO*, const char*,
+ struct stat*);
+typedef char* (*LPLIOTmpnam)(struct IPerlLIO*, char*);
+typedef int (*LPLIOUmask)(struct IPerlLIO*, int);
+typedef int (*LPLIOUnlink)(struct IPerlLIO*, const char*);
+typedef int (*LPLIOUtime)(struct IPerlLIO*, char*, struct utimbuf*);
+typedef int (*LPLIOWrite)(struct IPerlLIO*, int, const void*,
+ unsigned int);
+
+struct IPerlLIO
+{
+ LPLIOAccess pAccess;
+ LPLIOChmod pChmod;
+ LPLIOChown pChown;
+ LPLIOChsize pChsize;
+ LPLIOClose pClose;
+ LPLIODup pDup;
+ LPLIODup2 pDup2;
+ LPLIOFlock pFlock;
+ LPLIOFileStat pFileStat;
+ LPLIOIOCtl pIOCtl;
+ LPLIOIsatty pIsatty;
+ LPLIOLink pLink;
+ LPLIOLseek pLseek;
+ LPLIOLstat pLstat;
+ LPLIOMktemp pMktemp;
+ LPLIOOpen pOpen;
+ LPLIOOpen3 pOpen3;
+ LPLIORead pRead;
+ LPLIORename pRename;
+ LPLIOSetmode pSetmode;
+ LPLIONameStat pNameStat;
+ LPLIOTmpnam pTmpnam;
+ LPLIOUmask pUmask;
+ LPLIOUnlink pUnlink;
+ LPLIOUtime pUtime;
+ LPLIOWrite pWrite;
+};
-class IPerlLIO
+struct IPerlLIOInfo
{
-public:
- virtual int Access(const char *path, int mode, int &err) = 0;
- virtual int Chmod(const char *filename, int pmode, int &err) = 0;
- virtual int Chown(const char *filename, uid_t owner,
- gid_t group, int &err) = 0;
- virtual int Chsize(int handle, long size, int &err) = 0;
- virtual int Close(int handle, int &err) = 0;
- virtual int Dup(int handle, int &err) = 0;
- virtual int Dup2(int handle1, int handle2, int &err) = 0;
- virtual int Flock(int fd, int oper, int &err) = 0;
- virtual int FileStat(int handle, struct stat *buffer, int &err) = 0;
- virtual int IOCtl(int i, unsigned int u, char *data, int &err) = 0;
- virtual int Isatty(int handle, int &err) = 0;
- virtual long Lseek(int handle, long offset, int origin, int &err) = 0;
- virtual int Lstat(const char *path, struct stat *buffer, int &err) = 0;
- virtual char * Mktemp(char *Template, int &err) = 0;
- virtual int Open(const char *filename, int oflag, int &err) = 0;
- virtual int Open(const char *filename, int oflag,
- int pmode, int &err) = 0;
- virtual int Read(int handle, void *buffer,
- unsigned int count, int &err) = 0;
- virtual int Rename(const char *oname,
- const char *newname, int &err) = 0;
- virtual int Setmode(int handle, int mode, int &err) = 0;
- virtual int NameStat(const char *path,
- struct stat *buffer, int &err) = 0;
- virtual char * Tmpnam(char *string, int &err) = 0;
- virtual int Umask(int pmode, int &err) = 0;
- virtual int Unlink(const char *filename, int &err) = 0;
- virtual int Utime(char *filename, struct utimbuf *times, int &err) = 0;
- virtual int Write(int handle, const void *buffer,
- unsigned int count, int &err) = 0;
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlLIO perlLIOList;
};
#define PerlLIO_access(file, mode) \
- PL_piLIO->Access((file), (mode), ErrorNo())
+ (*PL_LIO->pAccess)(PL_LIO, (file), (mode))
#define PerlLIO_chmod(file, mode) \
- PL_piLIO->Chmod((file), (mode), ErrorNo())
+ (*PL_LIO->pChmod)(PL_LIO, (file), (mode))
#define PerlLIO_chown(file, owner, group) \
- PL_piLIO->Chown((file), (owner), (group), ErrorNo())
+ (*PL_LIO->pChown)(PL_LIO, (file), (owner), (group))
#define PerlLIO_chsize(fd, size) \
- PL_piLIO->Chsize((fd), (size), ErrorNo())
+ (*PL_LIO->pChsize)(PL_LIO, (fd), (size))
#define PerlLIO_close(fd) \
- PL_piLIO->Close((fd), ErrorNo())
+ (*PL_LIO->pClose)(PL_LIO, (fd))
#define PerlLIO_dup(fd) \
- PL_piLIO->Dup((fd), ErrorNo())
+ (*PL_LIO->pDup)(PL_LIO, (fd))
#define PerlLIO_dup2(fd1, fd2) \
- PL_piLIO->Dup2((fd1), (fd2), ErrorNo())
+ (*PL_LIO->pDup2)(PL_LIO, (fd1), (fd2))
#define PerlLIO_flock(fd, op) \
- PL_piLIO->Flock((fd), (op), ErrorNo())
+ (*PL_LIO->pFlock)(PL_LIO, (fd), (op))
#define PerlLIO_fstat(fd, buf) \
- PL_piLIO->FileStat((fd), (buf), ErrorNo())
+ (*PL_LIO->pFileStat)(PL_LIO, (fd), (buf))
#define PerlLIO_ioctl(fd, u, buf) \
- PL_piLIO->IOCtl((fd), (u), (buf), ErrorNo())
+ (*PL_LIO->pIOCtl)(PL_LIO, (fd), (u), (buf))
#define PerlLIO_isatty(fd) \
- PL_piLIO->Isatty((fd), ErrorNo())
+ (*PL_LIO->pIsatty)(PL_LIO, (fd))
+#define PerlLIO_link(oldname, newname) \
+ (*PL_LIO->pLink)(PL_LIO, (oldname), (newname))
#define PerlLIO_lseek(fd, offset, mode) \
- PL_piLIO->Lseek((fd), (offset), (mode), ErrorNo())
+ (*PL_LIO->pLseek)(PL_LIO, (fd), (offset), (mode))
#define PerlLIO_lstat(name, buf) \
- PL_piLIO->Lstat((name), (buf), ErrorNo())
+ (*PL_LIO->pLstat)(PL_LIO, (name), (buf))
#define PerlLIO_mktemp(file) \
- PL_piLIO->Mktemp((file), ErrorNo())
+ (*PL_LIO->pMktemp)(PL_LIO, (file))
#define PerlLIO_open(file, flag) \
- PL_piLIO->Open((file), (flag), ErrorNo())
+ (*PL_LIO->pOpen)(PL_LIO, (file), (flag))
#define PerlLIO_open3(file, flag, perm) \
- PL_piLIO->Open((file), (flag), (perm), ErrorNo())
+ (*PL_LIO->pOpen3)(PL_LIO, (file), (flag), (perm))
#define PerlLIO_read(fd, buf, count) \
- PL_piLIO->Read((fd), (buf), (count), ErrorNo())
+ (*PL_LIO->pRead)(PL_LIO, (fd), (buf), (count))
#define PerlLIO_rename(oname, newname) \
- PL_piLIO->Rename((oname), (newname), ErrorNo())
+ (*PL_LIO->pRename)(PL_LIO, (oname), (newname))
#define PerlLIO_setmode(fd, mode) \
- PL_piLIO->Setmode((fd), (mode), ErrorNo())
+ (*PL_LIO->pSetmode)(PL_LIO, (fd), (mode))
#define PerlLIO_stat(name, buf) \
- PL_piLIO->NameStat((name), (buf), ErrorNo())
+ (*PL_LIO->pNameStat)(PL_LIO, (name), (buf))
#define PerlLIO_tmpnam(str) \
- PL_piLIO->Tmpnam((str), ErrorNo())
+ (*PL_LIO->pTmpnam)(PL_LIO, (str))
#define PerlLIO_umask(mode) \
- PL_piLIO->Umask((mode), ErrorNo())
+ (*PL_LIO->pUmask)(PL_LIO, (mode))
#define PerlLIO_unlink(file) \
- PL_piLIO->Unlink((file), ErrorNo())
+ (*PL_LIO->pUnlink)(PL_LIO, (file))
#define PerlLIO_utime(file, time) \
- PL_piLIO->Utime((file), (time), ErrorNo())
+ (*PL_LIO->pUtime)(PL_LIO, (file), (time))
#define PerlLIO_write(fd, buf, count) \
- PL_piLIO->Write((fd), (buf), (count), ErrorNo())
+ (*PL_LIO->pWrite)(PL_LIO, (fd), (buf), (count))
-#else /* PERL_OBJECT */
+#else /* PERL_IMPLICIT_SYS */
#define PerlLIO_access(file, mode) access((file), (mode))
#define PerlLIO_chmod(file, mode) chmod((file), (mode))
@@ -572,8 +847,14 @@ public:
#define PerlLIO_fstat(fd, buf) Fstat((fd), (buf))
#define PerlLIO_ioctl(fd, u, buf) ioctl((fd), (u), (buf))
#define PerlLIO_isatty(fd) isatty((fd))
+#define PerlLIO_link(oldname, newname) link((oldname), (newname))
#define PerlLIO_lseek(fd, offset, mode) lseek((fd), (offset), (mode))
-#define PerlLIO_lstat(name, buf) lstat((name), (buf))
+#define PerlLIO_stat(name, buf) Stat((name), (buf))
+#ifdef HAS_LSTAT
+# define PerlLIO_lstat(name, buf) lstat((name), (buf))
+#else
+# define PerlLIO_lstat(name, buf) PerlLIO_stat((name), (buf))
+#endif
#define PerlLIO_mktemp(file) mktemp((file))
#define PerlLIO_mkstemp(file) mkstemp((file))
#define PerlLIO_open(file, flag) open((file), (flag))
@@ -581,138 +862,306 @@ public:
#define PerlLIO_read(fd, buf, count) read((fd), (buf), (count))
#define PerlLIO_rename(old, new) rename((old), (new))
#define PerlLIO_setmode(fd, mode) setmode((fd), (mode))
-#define PerlLIO_stat(name, buf) Stat((name), (buf))
#define PerlLIO_tmpnam(str) tmpnam((str))
#define PerlLIO_umask(mode) umask((mode))
#define PerlLIO_unlink(file) unlink((file))
#define PerlLIO_utime(file, time) utime((file), (time))
#define PerlLIO_write(fd, buf, count) write((fd), (buf), (count))
-#endif /* PERL_OBJECT */
+#endif /* PERL_IMPLICIT_SYS */
/*
Interface for perl memory allocation
*/
-#ifdef PERL_OBJECT
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlMem */
+struct IPerlMem;
+struct IPerlMemInfo;
+typedef void* (*LPMemMalloc)(struct IPerlMem*, size_t);
+typedef void* (*LPMemRealloc)(struct IPerlMem*, void*, size_t);
+typedef void (*LPMemFree)(struct IPerlMem*, void*);
+typedef void* (*LPMemCalloc)(struct IPerlMem*, size_t, size_t);
+typedef void (*LPMemGetLock)(struct IPerlMem*);
+typedef void (*LPMemFreeLock)(struct IPerlMem*);
+typedef int (*LPMemIsLocked)(struct IPerlMem*);
-class IPerlMem
+struct IPerlMem
{
-public:
- virtual void * Malloc(size_t) = 0;
- virtual void * Realloc(void*, size_t) = 0;
- virtual void Free(void*) = 0;
+ LPMemMalloc pMalloc;
+ LPMemRealloc pRealloc;
+ LPMemFree pFree;
+ LPMemCalloc pCalloc;
+ LPMemGetLock pGetLock;
+ LPMemFreeLock pFreeLock;
+ LPMemIsLocked pIsLocked;
};
-#define PerlMem_malloc(size) PL_piMem->Malloc((size))
-#define PerlMem_realloc(buf, size) PL_piMem->Realloc((buf), (size))
-#define PerlMem_free(buf) PL_piMem->Free((buf))
-
-#else /* PERL_OBJECT */
+struct IPerlMemInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlMem perlMemList;
+};
+/* Interpreter specific memory macros */
+#define PerlMem_malloc(size) \
+ (*PL_Mem->pMalloc)(PL_Mem, (size))
+#define PerlMem_realloc(buf, size) \
+ (*PL_Mem->pRealloc)(PL_Mem, (buf), (size))
+#define PerlMem_free(buf) \
+ (*PL_Mem->pFree)(PL_Mem, (buf))
+#define PerlMem_calloc(num, size) \
+ (*PL_Mem->pCalloc)(PL_Mem, (num), (size))
+#define PerlMem_get_lock() \
+ (*PL_Mem->pGetLock)(PL_Mem)
+#define PerlMem_free_lock() \
+ (*PL_Mem->pFreeLock)(PL_Mem)
+#define PerlMem_is_locked() \
+ (*PL_Mem->pIsLocked)(PL_Mem)
+
+/* Shared memory macros */
+#define PerlMemShared_malloc(size) \
+ (*PL_MemShared->pMalloc)(PL_Mem, (size))
+#define PerlMemShared_realloc(buf, size) \
+ (*PL_MemShared->pRealloc)(PL_Mem, (buf), (size))
+#define PerlMemShared_free(buf) \
+ (*PL_MemShared->pFree)(PL_Mem, (buf))
+#define PerlMemShared_calloc(num, size) \
+ (*PL_MemShared->pCalloc)(PL_Mem, (num), (size))
+#define PerlMemShared_get_lock() \
+ (*PL_MemShared->pGetLock)(PL_Mem)
+#define PerlMemShared_free_lock() \
+ (*PL_MemShared->pFreeLock)(PL_Mem)
+#define PerlMemShared_is_locked() \
+ (*PL_MemShared->pIsLocked)(PL_Mem)
+
+
+/* Parse tree memory macros */
+#define PerlMemParse_malloc(size) \
+ (*PL_MemParse->pMalloc)(PL_Mem, (size))
+#define PerlMemParse_realloc(buf, size) \
+ (*PL_MemParse->pRealloc)(PL_Mem, (buf), (size))
+#define PerlMemParse_free(buf) \
+ (*PL_MemParse->pFree)(PL_Mem, (buf))
+#define PerlMemParse_calloc(num, size) \
+ (*PL_MemParse->pCalloc)(PL_Mem, (num), (size))
+#define PerlMemParse_get_lock() \
+ (*PL_MemParse->pGetLock)(PL_Mem)
+#define PerlMemParse_free_lock() \
+ (*PL_MemParse->pFreeLock)(PL_Mem)
+#define PerlMemParse_is_locked() \
+ (*PL_MemParse->pIsLocked)(PL_Mem)
+
+
+#else /* PERL_IMPLICIT_SYS */
+
+/* Interpreter specific memory macros */
#define PerlMem_malloc(size) malloc((size))
#define PerlMem_realloc(buf, size) realloc((buf), (size))
#define PerlMem_free(buf) free((buf))
-
-#endif /* PERL_OBJECT */
+#define PerlMem_calloc(num, size) calloc((num), (size))
+#define PerlMem_get_lock()
+#define PerlMem_free_lock()
+#define PerlMem_is_locked() 0
+
+/* Shared memory macros */
+#define PerlMemShared_malloc(size) malloc((size))
+#define PerlMemShared_realloc(buf, size) realloc((buf), (size))
+#define PerlMemShared_free(buf) free((buf))
+#define PerlMemShared_calloc(num, size) calloc((num), (size))
+#define PerlMemShared_get_lock()
+#define PerlMemShared_free_lock()
+#define PerlMemShared_is_locked() 0
+
+/* Parse tree memory macros */
+#define PerlMemParse_malloc(size) malloc((size))
+#define PerlMemParse_realloc(buf, size) realloc((buf), (size))
+#define PerlMemParse_free(buf) free((buf))
+#define PerlMemParse_calloc(num, size) calloc((num), (size))
+#define PerlMemParse_get_lock()
+#define PerlMemParse_free_lock()
+#define PerlMemParse_is_locked() 0
+
+#endif /* PERL_IMPLICIT_SYS */
/*
Interface for perl process functions
*/
-#ifdef PERL_OBJECT
+#if defined(PERL_IMPLICIT_SYS)
-#ifndef Sighandler_t
-typedef Signal_t (*Sighandler_t) _((int));
-#endif
#ifndef jmp_buf
#include <setjmp.h>
#endif
-class IPerlProc
+/* IPerlProc */
+struct IPerlProc;
+struct IPerlProcInfo;
+typedef void (*LPProcAbort)(struct IPerlProc*);
+typedef char* (*LPProcCrypt)(struct IPerlProc*, const char*,
+ const char*);
+typedef void (*LPProcExit)(struct IPerlProc*, int);
+typedef void (*LPProc_Exit)(struct IPerlProc*, int);
+typedef int (*LPProcExecl)(struct IPerlProc*, const char*,
+ const char*, const char*, const char*,
+ const char*);
+typedef int (*LPProcExecv)(struct IPerlProc*, const char*,
+ const char*const*);
+typedef int (*LPProcExecvp)(struct IPerlProc*, const char*,
+ const char*const*);
+typedef uid_t (*LPProcGetuid)(struct IPerlProc*);
+typedef uid_t (*LPProcGeteuid)(struct IPerlProc*);
+typedef gid_t (*LPProcGetgid)(struct IPerlProc*);
+typedef gid_t (*LPProcGetegid)(struct IPerlProc*);
+typedef char* (*LPProcGetlogin)(struct IPerlProc*);
+typedef int (*LPProcKill)(struct IPerlProc*, int, int);
+typedef int (*LPProcKillpg)(struct IPerlProc*, int, int);
+typedef int (*LPProcPauseProc)(struct IPerlProc*);
+typedef PerlIO* (*LPProcPopen)(struct IPerlProc*, const char*,
+ const char*);
+typedef int (*LPProcPclose)(struct IPerlProc*, PerlIO*);
+typedef int (*LPProcPipe)(struct IPerlProc*, int*);
+typedef int (*LPProcSetuid)(struct IPerlProc*, uid_t);
+typedef int (*LPProcSetgid)(struct IPerlProc*, gid_t);
+typedef int (*LPProcSleep)(struct IPerlProc*, unsigned int);
+typedef int (*LPProcTimes)(struct IPerlProc*, struct tms*);
+typedef int (*LPProcWait)(struct IPerlProc*, int*);
+typedef int (*LPProcWaitpid)(struct IPerlProc*, int, int*, int);
+typedef Sighandler_t (*LPProcSignal)(struct IPerlProc*, int, Sighandler_t);
+typedef int (*LPProcFork)(struct IPerlProc*);
+typedef int (*LPProcGetpid)(struct IPerlProc*);
+#ifdef WIN32
+typedef void* (*LPProcDynaLoader)(struct IPerlProc*, const char*);
+typedef void (*LPProcGetOSError)(struct IPerlProc*,
+ SV* sv, DWORD dwErr);
+typedef void (*LPProcFreeBuf)(struct IPerlProc*, char*);
+typedef BOOL (*LPProcDoCmd)(struct IPerlProc*, char*);
+typedef int (*LPProcSpawn)(struct IPerlProc*, char*);
+typedef int (*LPProcSpawnvp)(struct IPerlProc*, int, const char*,
+ const char*const*);
+typedef int (*LPProcASpawn)(struct IPerlProc*, void*, void**, void**);
+#endif
+
+struct IPerlProc
{
-public:
- virtual void Abort(void) = 0;
- virtual char * Crypt(const char* clear, const char* salt) = 0;
- virtual void Exit(int status) = 0;
- virtual void _Exit(int status) = 0;
- virtual int Execl(const char *cmdname, const char *arg0,
- const char *arg1, const char *arg2,
- const char *arg3) = 0;
- virtual int Execv(const char *cmdname, const char *const *argv) = 0;
- virtual int Execvp(const char *cmdname, const char *const *argv) = 0;
- virtual uid_t Getuid(void) = 0;
- virtual uid_t Geteuid(void) = 0;
- virtual gid_t Getgid(void) = 0;
- virtual gid_t Getegid(void) = 0;
- virtual char * Getlogin(void) = 0;
- virtual int Kill(int pid, int sig) = 0;
- virtual int Killpg(int pid, int sig) = 0;
- virtual int PauseProc(void) = 0;
- virtual PerlIO * Popen(const char *command, const char *mode) = 0;
- virtual int Pclose(PerlIO *stream) = 0;
- virtual int Pipe(int *phandles) = 0;
- virtual int Setuid(uid_t uid) = 0;
- virtual int Setgid(gid_t gid) = 0;
- virtual int Sleep(unsigned int) = 0;
- virtual int Times(struct tms *timebuf) = 0;
- virtual int Wait(int *status) = 0;
- virtual int Waitpid(int pid, int *status, int flags) = 0;
- virtual Sighandler_t Signal(int sig, Sighandler_t subcode) = 0;
+ LPProcAbort pAbort;
+ LPProcCrypt pCrypt;
+ LPProcExit pExit;
+ LPProc_Exit p_Exit;
+ LPProcExecl pExecl;
+ LPProcExecv pExecv;
+ LPProcExecvp pExecvp;
+ LPProcGetuid pGetuid;
+ LPProcGeteuid pGeteuid;
+ LPProcGetgid pGetgid;
+ LPProcGetegid pGetegid;
+ LPProcGetlogin pGetlogin;
+ LPProcKill pKill;
+ LPProcKillpg pKillpg;
+ LPProcPauseProc pPauseProc;
+ LPProcPopen pPopen;
+ LPProcPclose pPclose;
+ LPProcPipe pPipe;
+ LPProcSetuid pSetuid;
+ LPProcSetgid pSetgid;
+ LPProcSleep pSleep;
+ LPProcTimes pTimes;
+ LPProcWait pWait;
+ LPProcWaitpid pWaitpid;
+ LPProcSignal pSignal;
+ LPProcFork pFork;
+ LPProcGetpid pGetpid;
#ifdef WIN32
- virtual void GetSysMsg(char*& msg, DWORD& dwLen, DWORD dwErr) = 0;
- virtual void FreeBuf(char* msg) = 0;
- virtual BOOL DoCmd(char *cmd) = 0;
- virtual int Spawn(char*cmds) = 0;
- virtual int Spawnvp(int mode, const char *cmdname,
- const char *const *argv) = 0;
- virtual int ASpawn(void *vreally, void **vmark, void **vsp) = 0;
+ LPProcDynaLoader pDynaLoader;
+ LPProcGetOSError pGetOSError;
+ LPProcDoCmd pDoCmd;
+ LPProcSpawn pSpawn;
+ LPProcSpawnvp pSpawnvp;
+ LPProcASpawn pASpawn;
#endif
};
-#define PerlProc_abort() PL_piProc->Abort()
-#define PerlProc_crypt(c,s) PL_piProc->Crypt((c), (s))
-#define PerlProc_exit(s) PL_piProc->Exit((s))
-#define PerlProc__exit(s) PL_piProc->_Exit((s))
+struct IPerlProcInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlProc perlProcList;
+};
+
+#define PerlProc_abort() \
+ (*PL_Proc->pAbort)(PL_Proc)
+#define PerlProc_crypt(c,s) \
+ (*PL_Proc->pCrypt)(PL_Proc, (c), (s))
+#define PerlProc_exit(s) \
+ (*PL_Proc->pExit)(PL_Proc, (s))
+#define PerlProc__exit(s) \
+ (*PL_Proc->p_Exit)(PL_Proc, (s))
#define PerlProc_execl(c, w, x, y, z) \
- PL_piProc->Execl((c), (w), (x), (y), (z))
-
-#define PerlProc_execv(c, a) PL_piProc->Execv((c), (a))
-#define PerlProc_execvp(c, a) PL_piProc->Execvp((c), (a))
-#define PerlProc_getuid() PL_piProc->Getuid()
-#define PerlProc_geteuid() PL_piProc->Geteuid()
-#define PerlProc_getgid() PL_piProc->Getgid()
-#define PerlProc_getegid() PL_piProc->Getegid()
-#define PerlProc_getlogin() PL_piProc->Getlogin()
-#define PerlProc_kill(i, a) PL_piProc->Kill((i), (a))
-#define PerlProc_killpg(i, a) PL_piProc->Killpg((i), (a))
-#define PerlProc_pause() PL_piProc->PauseProc()
-#define PerlProc_popen(c, m) PL_piProc->Popen((c), (m))
-#define PerlProc_pclose(f) PL_piProc->Pclose((f))
-#define PerlProc_pipe(fd) PL_piProc->Pipe((fd))
-#define PerlProc_setuid(u) PL_piProc->Setuid((u))
-#define PerlProc_setgid(g) PL_piProc->Setgid((g))
-#define PerlProc_sleep(t) PL_piProc->Sleep((t))
-#define PerlProc_times(t) PL_piProc->Times((t))
-#define PerlProc_wait(t) PL_piProc->Wait((t))
-#define PerlProc_waitpid(p,s,f) PL_piProc->Waitpid((p), (s), (f))
-#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n))
-#define PerlProc_longjmp(b, n) Siglongjmp((b), (n))
-#define PerlProc_signal(n, h) PL_piProc->Signal((n), (h))
+ (*PL_Proc->pExecl)(PL_Proc, (c), (w), (x), (y), (z))
+#define PerlProc_execv(c, a) \
+ (*PL_Proc->pExecv)(PL_Proc, (c), (a))
+#define PerlProc_execvp(c, a) \
+ (*PL_Proc->pExecvp)(PL_Proc, (c), (a))
+#define PerlProc_getuid() \
+ (*PL_Proc->pGetuid)(PL_Proc)
+#define PerlProc_geteuid() \
+ (*PL_Proc->pGeteuid)(PL_Proc)
+#define PerlProc_getgid() \
+ (*PL_Proc->pGetgid)(PL_Proc)
+#define PerlProc_getegid() \
+ (*PL_Proc->pGetegid)(PL_Proc)
+#define PerlProc_getlogin() \
+ (*PL_Proc->pGetlogin)(PL_Proc)
+#define PerlProc_kill(i, a) \
+ (*PL_Proc->pKill)(PL_Proc, (i), (a))
+#define PerlProc_killpg(i, a) \
+ (*PL_Proc->pKillpg)(PL_Proc, (i), (a))
+#define PerlProc_pause() \
+ (*PL_Proc->pPauseProc)(PL_Proc)
+#define PerlProc_popen(c, m) \
+ (*PL_Proc->pPopen)(PL_Proc, (c), (m))
+#define PerlProc_pclose(f) \
+ (*PL_Proc->pPclose)(PL_Proc, (f))
+#define PerlProc_pipe(fd) \
+ (*PL_Proc->pPipe)(PL_Proc, (fd))
+#define PerlProc_setuid(u) \
+ (*PL_Proc->pSetuid)(PL_Proc, (u))
+#define PerlProc_setgid(g) \
+ (*PL_Proc->pSetgid)(PL_Proc, (g))
+#define PerlProc_sleep(t) \
+ (*PL_Proc->pSleep)(PL_Proc, (t))
+#define PerlProc_times(t) \
+ (*PL_Proc->pTimes)(PL_Proc, (t))
+#define PerlProc_wait(t) \
+ (*PL_Proc->pWait)(PL_Proc, (t))
+#define PerlProc_waitpid(p,s,f) \
+ (*PL_Proc->pWaitpid)(PL_Proc, (p), (s), (f))
+#define PerlProc_signal(n, h) \
+ (*PL_Proc->pSignal)(PL_Proc, (n), (h))
+#define PerlProc_fork() \
+ (*PL_Proc->pFork)(PL_Proc)
+#define PerlProc_getpid() \
+ (*PL_Proc->pGetpid)(PL_Proc)
+#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n))
+#define PerlProc_longjmp(b, n) Siglongjmp((b), (n))
#ifdef WIN32
-#define PerlProc_GetSysMsg(s,l,e) \
- PL_piProc->GetSysMsg((s), (l), (e))
-
-#define PerlProc_FreeBuf(s) PL_piProc->FreeBuf((s))
-#define PerlProc_Cmd(s) PL_piProc->DoCmd((s))
-#define do_spawn(s) PL_piProc->Spawn((s))
-#define do_spawnvp(m, c, a) PL_piProc->Spawnvp((m), (c), (a))
-#define PerlProc_aspawn(m,c,a) PL_piProc->ASpawn((m), (c), (a))
-#endif
-
-#else /* PERL_OBJECT */
+#define PerlProc_DynaLoad(f) \
+ (*PL_Proc->pDynaLoader)(PL_Proc, (f))
+#define PerlProc_GetOSError(s,e) \
+ (*PL_Proc->pGetOSError)(PL_Proc, (s), (e))
+#define PerlProc_Cmd(s) \
+ (*PL_Proc->pDoCmd)(PL_Proc, (s))
+#define do_spawn(s) \
+ (*PL_Proc->pSpawn)(PL_Proc, (s))
+#define do_spawnvp(m, c, a) \
+ (*PL_Proc->pSpawnvp)(PL_Proc, (m), (c), (a))
+#define PerlProc_aspawn(m,c,a) \
+ (*PL_Proc->pASpawn)(PL_Proc, (m), (c), (a))
+#endif
+
+#else /* PERL_IMPLICIT_SYS */
#define PerlProc_abort() abort()
#define PerlProc_crypt(c,s) crypt((c), (s))
@@ -742,135 +1191,237 @@ public:
#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n))
#define PerlProc_longjmp(b, n) Siglongjmp((b), (n))
#define PerlProc_signal(n, h) signal((n), (h))
+#define PerlProc_fork() fork()
+#define PerlProc_getpid() getpid()
-
-#endif /* PERL_OBJECT */
+#ifdef WIN32
+#define PerlProc_DynaLoad(f) \
+ win32_dynaload((f))
+#define PerlProc_GetOSError(s,e) \
+ win32_str_os_error((s), (e))
+#endif
+#endif /* PERL_IMPLICIT_SYS */
/*
Interface for perl socket functions
*/
-#ifdef PERL_OBJECT
+#if defined(PERL_IMPLICIT_SYS)
+
+/* PerlSock */
+struct IPerlSock;
+struct IPerlSockInfo;
+typedef u_long (*LPHtonl)(struct IPerlSock*, u_long);
+typedef u_short (*LPHtons)(struct IPerlSock*, u_short);
+typedef u_long (*LPNtohl)(struct IPerlSock*, u_long);
+typedef u_short (*LPNtohs)(struct IPerlSock*, u_short);
+typedef SOCKET (*LPAccept)(struct IPerlSock*, SOCKET,
+ struct sockaddr*, int*);
+typedef int (*LPBind)(struct IPerlSock*, SOCKET,
+ const struct sockaddr*, int);
+typedef int (*LPConnect)(struct IPerlSock*, SOCKET,
+ const struct sockaddr*, int);
+typedef void (*LPEndhostent)(struct IPerlSock*);
+typedef void (*LPEndnetent)(struct IPerlSock*);
+typedef void (*LPEndprotoent)(struct IPerlSock*);
+typedef void (*LPEndservent)(struct IPerlSock*);
+typedef int (*LPGethostname)(struct IPerlSock*, char*, int);
+typedef int (*LPGetpeername)(struct IPerlSock*, SOCKET,
+ struct sockaddr*, int*);
+typedef struct hostent* (*LPGethostbyaddr)(struct IPerlSock*, const char*,
+ int, int);
+typedef struct hostent* (*LPGethostbyname)(struct IPerlSock*, const char*);
+typedef struct hostent* (*LPGethostent)(struct IPerlSock*);
+typedef struct netent* (*LPGetnetbyaddr)(struct IPerlSock*, long, int);
+typedef struct netent* (*LPGetnetbyname)(struct IPerlSock*, const char*);
+typedef struct netent* (*LPGetnetent)(struct IPerlSock*);
+typedef struct protoent*(*LPGetprotobyname)(struct IPerlSock*, const char*);
+typedef struct protoent*(*LPGetprotobynumber)(struct IPerlSock*, int);
+typedef struct protoent*(*LPGetprotoent)(struct IPerlSock*);
+typedef struct servent* (*LPGetservbyname)(struct IPerlSock*, const char*,
+ const char*);
+typedef struct servent* (*LPGetservbyport)(struct IPerlSock*, int,
+ const char*);
+typedef struct servent* (*LPGetservent)(struct IPerlSock*);
+typedef int (*LPGetsockname)(struct IPerlSock*, SOCKET,
+ struct sockaddr*, int*);
+typedef int (*LPGetsockopt)(struct IPerlSock*, SOCKET, int, int,
+ char*, int*);
+typedef unsigned long (*LPInetAddr)(struct IPerlSock*, const char*);
+typedef char* (*LPInetNtoa)(struct IPerlSock*, struct in_addr);
+typedef int (*LPListen)(struct IPerlSock*, SOCKET, int);
+typedef int (*LPRecv)(struct IPerlSock*, SOCKET, char*, int, int);
+typedef int (*LPRecvfrom)(struct IPerlSock*, SOCKET, char*, int,
+ int, struct sockaddr*, int*);
+typedef int (*LPSelect)(struct IPerlSock*, int, char*, char*,
+ char*, const struct timeval*);
+typedef int (*LPSend)(struct IPerlSock*, SOCKET, const char*, int,
+ int);
+typedef int (*LPSendto)(struct IPerlSock*, SOCKET, const char*,
+ int, int, const struct sockaddr*, int);
+typedef void (*LPSethostent)(struct IPerlSock*, int);
+typedef void (*LPSetnetent)(struct IPerlSock*, int);
+typedef void (*LPSetprotoent)(struct IPerlSock*, int);
+typedef void (*LPSetservent)(struct IPerlSock*, int);
+typedef int (*LPSetsockopt)(struct IPerlSock*, SOCKET, int, int,
+ const char*, int);
+typedef int (*LPShutdown)(struct IPerlSock*, SOCKET, int);
+typedef SOCKET (*LPSocket)(struct IPerlSock*, int, int, int);
+typedef int (*LPSocketpair)(struct IPerlSock*, int, int, int,
+ int*);
+#ifdef WIN32
+typedef int (*LPClosesocket)(struct IPerlSock*, SOCKET s);
+#endif
-class IPerlSock
+struct IPerlSock
{
-public:
- virtual u_long Htonl(u_long hostlong) = 0;
- virtual u_short Htons(u_short hostshort) = 0;
- virtual u_long Ntohl(u_long netlong) = 0;
- virtual u_short Ntohs(u_short netshort) = 0;
- virtual SOCKET Accept(SOCKET s, struct sockaddr* addr,
- int* addrlen, int &err) = 0;
- virtual int Bind(SOCKET s, const struct sockaddr* name,
- int namelen, int &err) = 0;
- virtual int Connect(SOCKET s, const struct sockaddr* name,
- int namelen, int &err) = 0;
- virtual void Endhostent(int &err) = 0;
- virtual void Endnetent(int &err) = 0;
- virtual void Endprotoent(int &err) = 0;
- virtual void Endservent(int &err) = 0;
- virtual int Gethostname(char* name, int namelen, int &err) = 0;
- virtual int Getpeername(SOCKET s, struct sockaddr* name,
- int* namelen, int &err) = 0;
- virtual struct hostent * Gethostbyaddr(const char* addr, int len,
- int type, int &err) = 0;
- virtual struct hostent * Gethostbyname(const char* name, int &err) = 0;
- virtual struct hostent * Gethostent(int &err) = 0;
- virtual struct netent * Getnetbyaddr(long net, int type, int &err) = 0;
- virtual struct netent * Getnetbyname(const char *, int &err) = 0;
- virtual struct netent * Getnetent(int &err) = 0;
- virtual struct protoent * Getprotobyname(const char* name, int &err) = 0;
- virtual struct protoent * Getprotobynumber(int number, int &err) = 0;
- virtual struct protoent * Getprotoent(int &err) = 0;
- virtual struct servent * Getservbyname(const char* name,
- const char* proto, int &err) = 0;
- virtual struct servent * Getservbyport(int port, const char* proto,
- int &err) = 0;
- virtual struct servent * Getservent(int &err) = 0;
- virtual int Getsockname(SOCKET s, struct sockaddr* name,
- int* namelen, int &err) = 0;
- virtual int Getsockopt(SOCKET s, int level, int optname,
- char* optval, int* optlen, int &err) = 0;
- virtual unsigned long InetAddr(const char* cp, int &err) = 0;
- virtual char * InetNtoa(struct in_addr in, int &err) = 0;
- virtual int Listen(SOCKET s, int backlog, int &err) = 0;
- virtual int Recv(SOCKET s, char* buf, int len,
- int flags, int &err) = 0;
- virtual int Recvfrom(SOCKET s, char* buf, int len, int flags,
- struct sockaddr* from, int* fromlen, int &err) = 0;
- virtual int Select(int nfds, char* readfds, char* writefds,
- char* exceptfds, const struct timeval* timeout,
- int &err) = 0;
- virtual int Send(SOCKET s, const char* buf, int len,
- int flags, int &err) = 0;
- virtual int Sendto(SOCKET s, const char* buf, int len, int flags,
- const struct sockaddr* to, int tolen, int &err) = 0;
- virtual void Sethostent(int stayopen, int &err) = 0;
- virtual void Setnetent(int stayopen, int &err) = 0;
- virtual void Setprotoent(int stayopen, int &err) = 0;
- virtual void Setservent(int stayopen, int &err) = 0;
- virtual int Setsockopt(SOCKET s, int level, int optname,
- const char* optval, int optlen, int &err) = 0;
- virtual int Shutdown(SOCKET s, int how, int &err) = 0;
- virtual SOCKET Socket(int af, int type, int protocol, int &err) = 0;
- virtual int Socketpair(int domain, int type, int protocol,
- int* fds, int &err) = 0;
+ LPHtonl pHtonl;
+ LPHtons pHtons;
+ LPNtohl pNtohl;
+ LPNtohs pNtohs;
+ LPAccept pAccept;
+ LPBind pBind;
+ LPConnect pConnect;
+ LPEndhostent pEndhostent;
+ LPEndnetent pEndnetent;
+ LPEndprotoent pEndprotoent;
+ LPEndservent pEndservent;
+ LPGethostname pGethostname;
+ LPGetpeername pGetpeername;
+ LPGethostbyaddr pGethostbyaddr;
+ LPGethostbyname pGethostbyname;
+ LPGethostent pGethostent;
+ LPGetnetbyaddr pGetnetbyaddr;
+ LPGetnetbyname pGetnetbyname;
+ LPGetnetent pGetnetent;
+ LPGetprotobyname pGetprotobyname;
+ LPGetprotobynumber pGetprotobynumber;
+ LPGetprotoent pGetprotoent;
+ LPGetservbyname pGetservbyname;
+ LPGetservbyport pGetservbyport;
+ LPGetservent pGetservent;
+ LPGetsockname pGetsockname;
+ LPGetsockopt pGetsockopt;
+ LPInetAddr pInetAddr;
+ LPInetNtoa pInetNtoa;
+ LPListen pListen;
+ LPRecv pRecv;
+ LPRecvfrom pRecvfrom;
+ LPSelect pSelect;
+ LPSend pSend;
+ LPSendto pSendto;
+ LPSethostent pSethostent;
+ LPSetnetent pSetnetent;
+ LPSetprotoent pSetprotoent;
+ LPSetservent pSetservent;
+ LPSetsockopt pSetsockopt;
+ LPShutdown pShutdown;
+ LPSocket pSocket;
+ LPSocketpair pSocketpair;
#ifdef WIN32
- virtual int Closesocket(SOCKET s, int& err) = 0;
- virtual int Ioctlsocket(SOCKET s, long cmd, u_long *argp,
- int& err) = 0;
+ LPClosesocket pClosesocket;
#endif
};
-#define PerlSock_htonl(x) PL_piSock->Htonl(x)
-#define PerlSock_htons(x) PL_piSock->Htons(x)
-#define PerlSock_ntohl(x) PL_piSock->Ntohl(x)
-#define PerlSock_ntohs(x) PL_piSock->Ntohs(x)
-#define PerlSock_accept(s, a, l) PL_piSock->Accept(s, a, l, ErrorNo())
-#define PerlSock_bind(s, n, l) PL_piSock->Bind(s, n, l, ErrorNo())
-#define PerlSock_connect(s, n, l) PL_piSock->Connect(s, n, l, ErrorNo())
-#define PerlSock_endhostent() PL_piSock->Endhostent(ErrorNo())
-#define PerlSock_endnetent() PL_piSock->Endnetent(ErrorNo())
-#define PerlSock_endprotoent() PL_piSock->Endprotoent(ErrorNo())
-#define PerlSock_endservent() PL_piSock->Endservent(ErrorNo())
-#define PerlSock_gethostbyaddr(a, l, t) PL_piSock->Gethostbyaddr(a, l, t, ErrorNo())
-#define PerlSock_gethostbyname(n) PL_piSock->Gethostbyname(n, ErrorNo())
-#define PerlSock_gethostent() PL_piSock->Gethostent(ErrorNo())
-#define PerlSock_gethostname(n, l) PL_piSock->Gethostname(n, l, ErrorNo())
-#define PerlSock_getnetbyaddr(n, t) PL_piSock->Getnetbyaddr(n, t, ErrorNo())
-#define PerlSock_getnetbyname(c) PL_piSock->Getnetbyname(c, ErrorNo())
-#define PerlSock_getnetent() PL_piSock->Getnetent(ErrorNo())
-#define PerlSock_getpeername(s, n, l) PL_piSock->Getpeername(s, n, l, ErrorNo())
-#define PerlSock_getprotobyname(n) PL_piSock->Getprotobyname(n, ErrorNo())
-#define PerlSock_getprotobynumber(n) PL_piSock->Getprotobynumber(n, ErrorNo())
-#define PerlSock_getprotoent() PL_piSock->Getprotoent(ErrorNo())
-#define PerlSock_getservbyname(n, p) PL_piSock->Getservbyname(n, p, ErrorNo())
-#define PerlSock_getservbyport(port, p) PL_piSock->Getservbyport(port, p, ErrorNo())
-#define PerlSock_getservent() PL_piSock->Getservent(ErrorNo())
-#define PerlSock_getsockname(s, n, l) PL_piSock->Getsockname(s, n, l, ErrorNo())
-#define PerlSock_getsockopt(s,l,n,v,i) PL_piSock->Getsockopt(s, l, n, v, i, ErrorNo())
-#define PerlSock_inet_addr(c) PL_piSock->InetAddr(c, ErrorNo())
-#define PerlSock_inet_ntoa(i) PL_piSock->InetNtoa(i, ErrorNo())
-#define PerlSock_listen(s, b) PL_piSock->Listen(s, b, ErrorNo())
-#define PerlSock_recv(s, b, l, f) PL_piSock->Recv(s, b, l, f, ErrorNo())
+struct IPerlSockInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlSock perlSockList;
+};
+
+#define PerlSock_htonl(x) \
+ (*PL_Sock->pHtonl)(PL_Sock, x)
+#define PerlSock_htons(x) \
+ (*PL_Sock->pHtons)(PL_Sock, x)
+#define PerlSock_ntohl(x) \
+ (*PL_Sock->pNtohl)(PL_Sock, x)
+#define PerlSock_ntohs(x) \
+ (*PL_Sock->pNtohs)(PL_Sock, x)
+#define PerlSock_accept(s, a, l) \
+ (*PL_Sock->pAccept)(PL_Sock, s, a, l)
+#define PerlSock_bind(s, n, l) \
+ (*PL_Sock->pBind)(PL_Sock, s, n, l)
+#define PerlSock_connect(s, n, l) \
+ (*PL_Sock->pConnect)(PL_Sock, s, n, l)
+#define PerlSock_endhostent() \
+ (*PL_Sock->pEndhostent)(PL_Sock)
+#define PerlSock_endnetent() \
+ (*PL_Sock->pEndnetent)(PL_Sock)
+#define PerlSock_endprotoent() \
+ (*PL_Sock->pEndprotoent)(PL_Sock)
+#define PerlSock_endservent() \
+ (*PL_Sock->pEndservent)(PL_Sock)
+#define PerlSock_gethostbyaddr(a, l, t) \
+ (*PL_Sock->pGethostbyaddr)(PL_Sock, a, l, t)
+#define PerlSock_gethostbyname(n) \
+ (*PL_Sock->pGethostbyname)(PL_Sock, n)
+#define PerlSock_gethostent() \
+ (*PL_Sock->pGethostent)(PL_Sock)
+#define PerlSock_gethostname(n, l) \
+ (*PL_Sock->pGethostname)(PL_Sock, n, l)
+#define PerlSock_getnetbyaddr(n, t) \
+ (*PL_Sock->pGetnetbyaddr)(PL_Sock, n, t)
+#define PerlSock_getnetbyname(c) \
+ (*PL_Sock->pGetnetbyname)(PL_Sock, c)
+#define PerlSock_getnetent() \
+ (*PL_Sock->pGetnetent)(PL_Sock)
+#define PerlSock_getpeername(s, n, l) \
+ (*PL_Sock->pGetpeername)(PL_Sock, s, n, l)
+#define PerlSock_getprotobyname(n) \
+ (*PL_Sock->pGetprotobyname)(PL_Sock, n)
+#define PerlSock_getprotobynumber(n) \
+ (*PL_Sock->pGetprotobynumber)(PL_Sock, n)
+#define PerlSock_getprotoent() \
+ (*PL_Sock->pGetprotoent)(PL_Sock)
+#define PerlSock_getservbyname(n, p) \
+ (*PL_Sock->pGetservbyname)(PL_Sock, n, p)
+#define PerlSock_getservbyport(port, p) \
+ (*PL_Sock->pGetservbyport)(PL_Sock, port, p)
+#define PerlSock_getservent() \
+ (*PL_Sock->pGetservent)(PL_Sock)
+#define PerlSock_getsockname(s, n, l) \
+ (*PL_Sock->pGetsockname)(PL_Sock, s, n, l)
+#define PerlSock_getsockopt(s,l,n,v,i) \
+ (*PL_Sock->pGetsockopt)(PL_Sock, s, l, n, v, i)
+#define PerlSock_inet_addr(c) \
+ (*PL_Sock->pInetAddr)(PL_Sock, c)
+#define PerlSock_inet_ntoa(i) \
+ (*PL_Sock->pInetNtoa)(PL_Sock, i)
+#define PerlSock_listen(s, b) \
+ (*PL_Sock->pListen)(PL_Sock, s, b)
+#define PerlSock_recv(s, b, l, f) \
+ (*PL_Sock->pRecv)(PL_Sock, s, b, l, f)
#define PerlSock_recvfrom(s,b,l,f,from,fromlen) \
- PL_piSock->Recvfrom(s, b, l, f, from, fromlen, ErrorNo())
+ (*PL_Sock->pRecvfrom)(PL_Sock, s, b, l, f, from, fromlen)
#define PerlSock_select(n, r, w, e, t) \
- PL_piSock->Select(n, (char*)r, (char*)w, (char*)e, t, ErrorNo())
-#define PerlSock_send(s, b, l, f) PL_piSock->Send(s, b, l, f, ErrorNo())
+ (*PL_Sock->pSelect)(PL_Sock, n, (char*)r, (char*)w, (char*)e, t)
+#define PerlSock_send(s, b, l, f) \
+ (*PL_Sock->pSend)(PL_Sock, s, b, l, f)
#define PerlSock_sendto(s, b, l, f, t, tlen) \
- PL_piSock->Sendto(s, b, l, f, t, tlen, ErrorNo())
-#define PerlSock_sethostent(f) PL_piSock->Sethostent(f, ErrorNo())
-#define PerlSock_setnetent(f) PL_piSock->Setnetent(f, ErrorNo())
-#define PerlSock_setprotoent(f) PL_piSock->Setprotoent(f, ErrorNo())
-#define PerlSock_setservent(f) PL_piSock->Setservent(f, ErrorNo())
+ (*PL_Sock->pSendto)(PL_Sock, s, b, l, f, t, tlen)
+#define PerlSock_sethostent(f) \
+ (*PL_Sock->pSethostent)(PL_Sock, f)
+#define PerlSock_setnetent(f) \
+ (*PL_Sock->pSetnetent)(PL_Sock, f)
+#define PerlSock_setprotoent(f) \
+ (*PL_Sock->pSetprotoent)(PL_Sock, f)
+#define PerlSock_setservent(f) \
+ (*PL_Sock->pSetservent)(PL_Sock, f)
#define PerlSock_setsockopt(s, l, n, v, len) \
- PL_piSock->Setsockopt(s, l, n, v, len, ErrorNo())
-#define PerlSock_shutdown(s, h) PL_piSock->Shutdown(s, h, ErrorNo())
-#define PerlSock_socket(a, t, p) PL_piSock->Socket(a, t, p, ErrorNo())
-#define PerlSock_socketpair(a, t, p, f) PL_piSock->Socketpair(a, t, p, f, ErrorNo())
+ (*PL_Sock->pSetsockopt)(PL_Sock, s, l, n, v, len)
+#define PerlSock_shutdown(s, h) \
+ (*PL_Sock->pShutdown)(PL_Sock, s, h)
+#define PerlSock_socket(a, t, p) \
+ (*PL_Sock->pSocket)(PL_Sock, a, t, p)
+#define PerlSock_socketpair(a, t, p, f) \
+ (*PL_Sock->pSocketpair)(PL_Sock, a, t, p, f)
+
+#ifdef WIN32
+#define PerlSock_closesocket(s) \
+ (*PL_Sock->pClosesocket)(PL_Sock, s)
+#endif
-#else /* PERL_OBJECT */
+#else /* PERL_IMPLICIT_SYS */
#define PerlSock_htonl(x) htonl(x)
#define PerlSock_htons(x) htons(x)
@@ -924,8 +1475,11 @@ public:
#define PerlSock_socket(a, t, p) socket(a, t, p)
#define PerlSock_socketpair(a, t, p, f) socketpair(a, t, p, f)
+#ifdef WIN32
+#define PerlSock_closesocket(s) closesocket(s)
+#endif
-#endif /* PERL_OBJECT */
+#endif /* PERL_IMPLICIT_SYS */
#endif /* __Inc__IPerl___ */
diff --git a/contrib/perl5/keywords.h b/contrib/perl5/keywords.h
index e818831..3343041 100644
--- a/contrib/perl5/keywords.h
+++ b/contrib/perl5/keywords.h
@@ -16,235 +16,237 @@
#define KEY_LE 15
#define KEY_LT 16
#define KEY_NE 17
-#define KEY_abs 18
-#define KEY_accept 19
-#define KEY_alarm 20
-#define KEY_and 21
-#define KEY_atan2 22
-#define KEY_bind 23
-#define KEY_binmode 24
-#define KEY_bless 25
-#define KEY_caller 26
-#define KEY_chdir 27
-#define KEY_chmod 28
-#define KEY_chomp 29
-#define KEY_chop 30
-#define KEY_chown 31
-#define KEY_chr 32
-#define KEY_chroot 33
-#define KEY_close 34
-#define KEY_closedir 35
-#define KEY_cmp 36
-#define KEY_connect 37
-#define KEY_continue 38
-#define KEY_cos 39
-#define KEY_crypt 40
-#define KEY_dbmclose 41
-#define KEY_dbmopen 42
-#define KEY_defined 43
-#define KEY_delete 44
-#define KEY_die 45
-#define KEY_do 46
-#define KEY_dump 47
-#define KEY_each 48
-#define KEY_else 49
-#define KEY_elsif 50
-#define KEY_endgrent 51
-#define KEY_endhostent 52
-#define KEY_endnetent 53
-#define KEY_endprotoent 54
-#define KEY_endpwent 55
-#define KEY_endservent 56
-#define KEY_eof 57
-#define KEY_eq 58
-#define KEY_eval 59
-#define KEY_exec 60
-#define KEY_exists 61
-#define KEY_exit 62
-#define KEY_exp 63
-#define KEY_fcntl 64
-#define KEY_fileno 65
-#define KEY_flock 66
-#define KEY_for 67
-#define KEY_foreach 68
-#define KEY_fork 69
-#define KEY_format 70
-#define KEY_formline 71
-#define KEY_ge 72
-#define KEY_getc 73
-#define KEY_getgrent 74
-#define KEY_getgrgid 75
-#define KEY_getgrnam 76
-#define KEY_gethostbyaddr 77
-#define KEY_gethostbyname 78
-#define KEY_gethostent 79
-#define KEY_getlogin 80
-#define KEY_getnetbyaddr 81
-#define KEY_getnetbyname 82
-#define KEY_getnetent 83
-#define KEY_getpeername 84
-#define KEY_getpgrp 85
-#define KEY_getppid 86
-#define KEY_getpriority 87
-#define KEY_getprotobyname 88
-#define KEY_getprotobynumber 89
-#define KEY_getprotoent 90
-#define KEY_getpwent 91
-#define KEY_getpwnam 92
-#define KEY_getpwuid 93
-#define KEY_getservbyname 94
-#define KEY_getservbyport 95
-#define KEY_getservent 96
-#define KEY_getsockname 97
-#define KEY_getsockopt 98
-#define KEY_glob 99
-#define KEY_gmtime 100
-#define KEY_goto 101
-#define KEY_grep 102
-#define KEY_gt 103
-#define KEY_hex 104
-#define KEY_if 105
-#define KEY_index 106
-#define KEY_int 107
-#define KEY_ioctl 108
-#define KEY_join 109
-#define KEY_keys 110
-#define KEY_kill 111
-#define KEY_last 112
-#define KEY_lc 113
-#define KEY_lcfirst 114
-#define KEY_le 115
-#define KEY_length 116
-#define KEY_link 117
-#define KEY_listen 118
-#define KEY_local 119
-#define KEY_localtime 120
-#define KEY_lock 121
-#define KEY_log 122
-#define KEY_lstat 123
-#define KEY_lt 124
-#define KEY_m 125
-#define KEY_map 126
-#define KEY_mkdir 127
-#define KEY_msgctl 128
-#define KEY_msgget 129
-#define KEY_msgrcv 130
-#define KEY_msgsnd 131
-#define KEY_my 132
-#define KEY_ne 133
-#define KEY_next 134
-#define KEY_no 135
-#define KEY_not 136
-#define KEY_oct 137
-#define KEY_open 138
-#define KEY_opendir 139
-#define KEY_or 140
-#define KEY_ord 141
-#define KEY_pack 142
-#define KEY_package 143
-#define KEY_pipe 144
-#define KEY_pop 145
-#define KEY_pos 146
-#define KEY_print 147
-#define KEY_printf 148
-#define KEY_prototype 149
-#define KEY_push 150
-#define KEY_q 151
-#define KEY_qq 152
-#define KEY_qr 153
-#define KEY_quotemeta 154
-#define KEY_qw 155
-#define KEY_qx 156
-#define KEY_rand 157
-#define KEY_read 158
-#define KEY_readdir 159
-#define KEY_readline 160
-#define KEY_readlink 161
-#define KEY_readpipe 162
-#define KEY_recv 163
-#define KEY_redo 164
-#define KEY_ref 165
-#define KEY_rename 166
-#define KEY_require 167
-#define KEY_reset 168
-#define KEY_return 169
-#define KEY_reverse 170
-#define KEY_rewinddir 171
-#define KEY_rindex 172
-#define KEY_rmdir 173
-#define KEY_s 174
-#define KEY_scalar 175
-#define KEY_seek 176
-#define KEY_seekdir 177
-#define KEY_select 178
-#define KEY_semctl 179
-#define KEY_semget 180
-#define KEY_semop 181
-#define KEY_send 182
-#define KEY_setgrent 183
-#define KEY_sethostent 184
-#define KEY_setnetent 185
-#define KEY_setpgrp 186
-#define KEY_setpriority 187
-#define KEY_setprotoent 188
-#define KEY_setpwent 189
-#define KEY_setservent 190
-#define KEY_setsockopt 191
-#define KEY_shift 192
-#define KEY_shmctl 193
-#define KEY_shmget 194
-#define KEY_shmread 195
-#define KEY_shmwrite 196
-#define KEY_shutdown 197
-#define KEY_sin 198
-#define KEY_sleep 199
-#define KEY_socket 200
-#define KEY_socketpair 201
-#define KEY_sort 202
-#define KEY_splice 203
-#define KEY_split 204
-#define KEY_sprintf 205
-#define KEY_sqrt 206
-#define KEY_srand 207
-#define KEY_stat 208
-#define KEY_study 209
-#define KEY_sub 210
-#define KEY_substr 211
-#define KEY_symlink 212
-#define KEY_syscall 213
-#define KEY_sysopen 214
-#define KEY_sysread 215
-#define KEY_sysseek 216
-#define KEY_system 217
-#define KEY_syswrite 218
-#define KEY_tell 219
-#define KEY_telldir 220
-#define KEY_tie 221
-#define KEY_tied 222
-#define KEY_time 223
-#define KEY_times 224
-#define KEY_tr 225
-#define KEY_truncate 226
-#define KEY_uc 227
-#define KEY_ucfirst 228
-#define KEY_umask 229
-#define KEY_undef 230
-#define KEY_unless 231
-#define KEY_unlink 232
-#define KEY_unpack 233
-#define KEY_unshift 234
-#define KEY_untie 235
-#define KEY_until 236
-#define KEY_use 237
-#define KEY_utime 238
-#define KEY_values 239
-#define KEY_vec 240
-#define KEY_wait 241
-#define KEY_waitpid 242
-#define KEY_wantarray 243
-#define KEY_warn 244
-#define KEY_while 245
-#define KEY_write 246
-#define KEY_x 247
-#define KEY_xor 248
-#define KEY_y 249
+#define KEY_CHECK 18
+#define KEY_abs 19
+#define KEY_accept 20
+#define KEY_alarm 21
+#define KEY_and 22
+#define KEY_atan2 23
+#define KEY_bind 24
+#define KEY_binmode 25
+#define KEY_bless 26
+#define KEY_caller 27
+#define KEY_chdir 28
+#define KEY_chmod 29
+#define KEY_chomp 30
+#define KEY_chop 31
+#define KEY_chown 32
+#define KEY_chr 33
+#define KEY_chroot 34
+#define KEY_close 35
+#define KEY_closedir 36
+#define KEY_cmp 37
+#define KEY_connect 38
+#define KEY_continue 39
+#define KEY_cos 40
+#define KEY_crypt 41
+#define KEY_dbmclose 42
+#define KEY_dbmopen 43
+#define KEY_defined 44
+#define KEY_delete 45
+#define KEY_die 46
+#define KEY_do 47
+#define KEY_dump 48
+#define KEY_each 49
+#define KEY_else 50
+#define KEY_elsif 51
+#define KEY_endgrent 52
+#define KEY_endhostent 53
+#define KEY_endnetent 54
+#define KEY_endprotoent 55
+#define KEY_endpwent 56
+#define KEY_endservent 57
+#define KEY_eof 58
+#define KEY_eq 59
+#define KEY_eval 60
+#define KEY_exec 61
+#define KEY_exists 62
+#define KEY_exit 63
+#define KEY_exp 64
+#define KEY_fcntl 65
+#define KEY_fileno 66
+#define KEY_flock 67
+#define KEY_for 68
+#define KEY_foreach 69
+#define KEY_fork 70
+#define KEY_format 71
+#define KEY_formline 72
+#define KEY_ge 73
+#define KEY_getc 74
+#define KEY_getgrent 75
+#define KEY_getgrgid 76
+#define KEY_getgrnam 77
+#define KEY_gethostbyaddr 78
+#define KEY_gethostbyname 79
+#define KEY_gethostent 80
+#define KEY_getlogin 81
+#define KEY_getnetbyaddr 82
+#define KEY_getnetbyname 83
+#define KEY_getnetent 84
+#define KEY_getpeername 85
+#define KEY_getpgrp 86
+#define KEY_getppid 87
+#define KEY_getpriority 88
+#define KEY_getprotobyname 89
+#define KEY_getprotobynumber 90
+#define KEY_getprotoent 91
+#define KEY_getpwent 92
+#define KEY_getpwnam 93
+#define KEY_getpwuid 94
+#define KEY_getservbyname 95
+#define KEY_getservbyport 96
+#define KEY_getservent 97
+#define KEY_getsockname 98
+#define KEY_getsockopt 99
+#define KEY_glob 100
+#define KEY_gmtime 101
+#define KEY_goto 102
+#define KEY_grep 103
+#define KEY_gt 104
+#define KEY_hex 105
+#define KEY_if 106
+#define KEY_index 107
+#define KEY_int 108
+#define KEY_ioctl 109
+#define KEY_join 110
+#define KEY_keys 111
+#define KEY_kill 112
+#define KEY_last 113
+#define KEY_lc 114
+#define KEY_lcfirst 115
+#define KEY_le 116
+#define KEY_length 117
+#define KEY_link 118
+#define KEY_listen 119
+#define KEY_local 120
+#define KEY_localtime 121
+#define KEY_lock 122
+#define KEY_log 123
+#define KEY_lstat 124
+#define KEY_lt 125
+#define KEY_m 126
+#define KEY_map 127
+#define KEY_mkdir 128
+#define KEY_msgctl 129
+#define KEY_msgget 130
+#define KEY_msgrcv 131
+#define KEY_msgsnd 132
+#define KEY_my 133
+#define KEY_ne 134
+#define KEY_next 135
+#define KEY_no 136
+#define KEY_not 137
+#define KEY_oct 138
+#define KEY_open 139
+#define KEY_opendir 140
+#define KEY_or 141
+#define KEY_ord 142
+#define KEY_our 143
+#define KEY_pack 144
+#define KEY_package 145
+#define KEY_pipe 146
+#define KEY_pop 147
+#define KEY_pos 148
+#define KEY_print 149
+#define KEY_printf 150
+#define KEY_prototype 151
+#define KEY_push 152
+#define KEY_q 153
+#define KEY_qq 154
+#define KEY_qr 155
+#define KEY_quotemeta 156
+#define KEY_qw 157
+#define KEY_qx 158
+#define KEY_rand 159
+#define KEY_read 160
+#define KEY_readdir 161
+#define KEY_readline 162
+#define KEY_readlink 163
+#define KEY_readpipe 164
+#define KEY_recv 165
+#define KEY_redo 166
+#define KEY_ref 167
+#define KEY_rename 168
+#define KEY_require 169
+#define KEY_reset 170
+#define KEY_return 171
+#define KEY_reverse 172
+#define KEY_rewinddir 173
+#define KEY_rindex 174
+#define KEY_rmdir 175
+#define KEY_s 176
+#define KEY_scalar 177
+#define KEY_seek 178
+#define KEY_seekdir 179
+#define KEY_select 180
+#define KEY_semctl 181
+#define KEY_semget 182
+#define KEY_semop 183
+#define KEY_send 184
+#define KEY_setgrent 185
+#define KEY_sethostent 186
+#define KEY_setnetent 187
+#define KEY_setpgrp 188
+#define KEY_setpriority 189
+#define KEY_setprotoent 190
+#define KEY_setpwent 191
+#define KEY_setservent 192
+#define KEY_setsockopt 193
+#define KEY_shift 194
+#define KEY_shmctl 195
+#define KEY_shmget 196
+#define KEY_shmread 197
+#define KEY_shmwrite 198
+#define KEY_shutdown 199
+#define KEY_sin 200
+#define KEY_sleep 201
+#define KEY_socket 202
+#define KEY_socketpair 203
+#define KEY_sort 204
+#define KEY_splice 205
+#define KEY_split 206
+#define KEY_sprintf 207
+#define KEY_sqrt 208
+#define KEY_srand 209
+#define KEY_stat 210
+#define KEY_study 211
+#define KEY_sub 212
+#define KEY_substr 213
+#define KEY_symlink 214
+#define KEY_syscall 215
+#define KEY_sysopen 216
+#define KEY_sysread 217
+#define KEY_sysseek 218
+#define KEY_system 219
+#define KEY_syswrite 220
+#define KEY_tell 221
+#define KEY_telldir 222
+#define KEY_tie 223
+#define KEY_tied 224
+#define KEY_time 225
+#define KEY_times 226
+#define KEY_tr 227
+#define KEY_truncate 228
+#define KEY_uc 229
+#define KEY_ucfirst 230
+#define KEY_umask 231
+#define KEY_undef 232
+#define KEY_unless 233
+#define KEY_unlink 234
+#define KEY_unpack 235
+#define KEY_unshift 236
+#define KEY_untie 237
+#define KEY_until 238
+#define KEY_use 239
+#define KEY_utime 240
+#define KEY_values 241
+#define KEY_vec 242
+#define KEY_wait 243
+#define KEY_waitpid 244
+#define KEY_wantarray 245
+#define KEY_warn 246
+#define KEY_while 247
+#define KEY_write 248
+#define KEY_x 249
+#define KEY_xor 250
+#define KEY_y 251
diff --git a/contrib/perl5/keywords.pl b/contrib/perl5/keywords.pl
index f907e3f..46dd53d 100755
--- a/contrib/perl5/keywords.pl
+++ b/contrib/perl5/keywords.pl
@@ -42,6 +42,7 @@ INIT
LE
LT
NE
+CHECK
abs
accept
alarm
@@ -166,6 +167,7 @@ open
opendir
or
ord
+our
pack
package
pipe
diff --git a/contrib/perl5/lib/AnyDBM_File.pm b/contrib/perl5/lib/AnyDBM_File.pm
index aff3c7c..58ffda7 100644
--- a/contrib/perl5/lib/AnyDBM_File.pm
+++ b/contrib/perl5/lib/AnyDBM_File.pm
@@ -1,7 +1,7 @@
package AnyDBM_File;
-use vars qw(@ISA);
-@ISA = qw(NDBM_File DB_File GDBM_File SDBM_File ODBM_File) unless @ISA;
+use 5.005_64;
+our @ISA = qw(NDBM_File DB_File GDBM_File SDBM_File ODBM_File) unless @ISA;
my $mod;
for $mod (@ISA) {
@@ -87,6 +87,6 @@ By default, but can be redefined.
=head1 SEE ALSO
-dbm(3), ndbm(3), DB_File(3)
+dbm(3), ndbm(3), DB_File(3), L<perldbmfilter>
=cut
diff --git a/contrib/perl5/lib/AutoLoader.pm b/contrib/perl5/lib/AutoLoader.pm
index 5b083a7..8fd7d3b 100644
--- a/contrib/perl5/lib/AutoLoader.pm
+++ b/contrib/perl5/lib/AutoLoader.pm
@@ -1,20 +1,23 @@
package AutoLoader;
-use vars qw(@EXPORT @EXPORT_OK);
+use 5.005_64;
+our(@EXPORT, @EXPORT_OK, $VERSION);
my $is_dosish;
my $is_vms;
BEGIN {
require Exporter;
- @EXPORT = ();
- @EXPORT_OK = qw(AUTOLOAD);
+ @EXPORT = @EXPORT = ();
+ @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD);
$is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32';
$is_vms = $^O eq 'VMS';
+ $VERSION = '5.57';
}
AUTOLOAD {
- my $name;
+ my $sub = $AUTOLOAD;
+ my $filename;
# Braces used to preserve $1 et al.
{
# Try to find the autoloaded file from the package-qualified
@@ -30,10 +33,10 @@ AUTOLOAD {
# In this case, we simple prepend the 'auto/' and let the
# C<require> take care of the searching for us.
- my ($pkg,$func) = $AUTOLOAD =~ /(.*)::([^:]+)$/;
+ my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/);
$pkg =~ s#::#/#g;
- if (defined($name=$INC{"$pkg.pm"})) {
- $name =~ s#^(.*)$pkg\.pm$#$1auto/$pkg/$func.al#;
+ if (defined($filename = $INC{"$pkg.pm"})) {
+ $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s;
# if the file exists, then make sure that it is a
# a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al',
@@ -41,45 +44,45 @@ AUTOLOAD {
# (and failing) to find the 'lib/auto/foo/bar.al' because it
# looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib').
- if (-r $name) {
- unless ($name =~ m|^/|) {
+ if (-r $filename) {
+ unless ($filename =~ m|^/|s) {
if ($is_dosish) {
- unless ($name =~ m{^([a-z]:)?[\\/]}i) {
- $name = "./$name";
+ unless ($filename =~ m{^([a-z]:)?[\\/]}is) {
+ $filename = "./$filename";
}
}
elsif ($is_vms) {
- # XXX todo by VMSmiths
- $name = "./$name";
+ # XXX todo by VMSmiths
+ $filename = "./$filename";
}
else {
- $name = "./$name";
+ $filename = "./$filename";
}
}
}
else {
- $name = undef;
+ $filename = undef;
}
}
- unless (defined $name) {
+ unless (defined $filename) {
# let C<require> do the searching
- $name = "auto/$AUTOLOAD.al";
- $name =~ s#::#/#g;
+ $filename = "auto/$sub.al";
+ $filename =~ s#::#/#g;
}
}
my $save = $@;
- eval { local $SIG{__DIE__}; require $name };
+ eval { local $SIG{__DIE__}; require $filename };
if ($@) {
- if (substr($AUTOLOAD,-9) eq '::DESTROY') {
- *$AUTOLOAD = sub {};
+ if (substr($sub,-9) eq '::DESTROY') {
+ *$sub = sub {};
} else {
# The load might just have failed because the filename was too
# long for some old SVR3 systems which treat long names as errors.
# If we can succesfully truncate a long name then it's worth a go.
# There is a slight risk that we could pick up the wrong file here
# but autosplit should have warned about that when splitting.
- if ($name =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
- eval {local $SIG{__DIE__};require $name};
+ if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){
+ eval { local $SIG{__DIE__}; require $filename };
}
if ($@){
$@ =~ s/ at .*\n//;
@@ -90,7 +93,7 @@ AUTOLOAD {
}
}
$@ = $save;
- goto &$AUTOLOAD;
+ goto &$sub;
}
sub import {
@@ -101,7 +104,10 @@ sub import {
# Export symbols, but not by accident of inheritance.
#
- Exporter::export $pkg, $callpkg, @_ if $pkg eq 'AutoLoader';
+ if ($pkg eq 'AutoLoader') {
+ local $Exporter::ExportLevel = 1;
+ Exporter::import $pkg, @_;
+ }
#
# Try to find the autosplit index file. Eg., if the call package
@@ -219,20 +225,20 @@ lines:
use Carp;
sub AUTOLOAD {
- my $constname;
- ($constname = $AUTOLOAD) =~ s/.*:://;
+ my $sub = $AUTOLOAD;
+ (my $constname = $sub) =~ s/.*:://;
my $val = constant($constname, @_ ? $_[0] : 0);
if ($! != 0) {
- if ($! =~ /Invalid/) {
- $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ if ($! =~ /Invalid/ || $!{EINVAL}) {
+ $AutoLoader::AUTOLOAD = $sub;
goto &AutoLoader::AUTOLOAD;
}
else {
croak "Your vendor has not defined constant $constname";
}
}
- *$AUTOLOAD = sub { $val }; # same as: eval "sub $AUTOLOAD { $val }";
- goto &$AUTOLOAD;
+ *$sub = sub { $val }; # same as: eval "sub $sub { $val }";
+ goto &$sub;
}
If any module's own AUTOLOAD subroutine has no need to fallback to the
diff --git a/contrib/perl5/lib/AutoSplit.pm b/contrib/perl5/lib/AutoSplit.pm
index f818371..0be3ae6 100644
--- a/contrib/perl5/lib/AutoSplit.pm
+++ b/contrib/perl5/lib/AutoSplit.pm
@@ -1,17 +1,16 @@
package AutoSplit;
+use 5.005_64;
use Exporter ();
use Config qw(%Config);
use Carp qw(carp);
use File::Basename ();
use File::Path qw(mkpath);
use strict;
-use vars qw(
- $VERSION @ISA @EXPORT @EXPORT_OK
- $Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime
- );
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Verbose, $Keep, $Maxlen,
+ $CheckForAutoloader, $CheckModTime);
-$VERSION = "1.0303";
+$VERSION = "1.0305";
@ISA = qw(Exporter);
@EXPORT = qw(&autosplit &autosplit_lib_modules);
@EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime);
@@ -147,6 +146,13 @@ if (defined (&Dos::UseLFN)) {
}
my $Is_VMS = ($^O eq 'VMS');
+# allow checking for valid ': attrlist' attachments
+my $nested;
+$nested = qr{ \( (?: (?> [^()]+ ) | (??{ $nested }) )* \) }x;
+my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
+my $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
+
+
sub autosplit{
my($file, $autodir, $keep, $ckal, $ckmt) = @_;
@@ -169,10 +175,10 @@ sub autosplit_lib_modules{
while(defined($_ = shift @modules)){
s#::#/#g; # incase specified as ABC::XYZ
s|\\|/|g; # bug in ksh OS/2
- s#^lib/##; # incase specified as lib/*.pm
+ s#^lib/##s; # incase specified as lib/*.pm
if ($Is_VMS && /[:>\]]/) { # may need to convert VMS-style filespecs
- my ($dir,$name) = (/(.*])(.*)/);
- $dir =~ s/.*lib[\.\]]//;
+ my ($dir,$name) = (/(.*])(.*)/s);
+ $dir =~ s/.*lib[\.\]]//s;
$dir =~ s#[\.\]]#/#g;
$_ = $dir . $name;
}
@@ -195,7 +201,7 @@ sub autosplit_file {
# where to write output files
$autodir ||= "lib/auto";
if ($Is_VMS) {
- ($autodir = VMS::Filespec::unixpath($autodir)) =~ s|/$||;
+ ($autodir = VMS::Filespec::unixpath($autodir)) =~ s|/\z||;
$filename = VMS::Filespec::unixify($filename); # may have dirs
}
unless (-d $autodir){
@@ -209,7 +215,7 @@ sub autosplit_file {
}
# allow just a package name to be used
- $filename .= ".pm" unless ($filename =~ m/\.pm$/);
+ $filename .= ".pm" unless ($filename =~ m/\.pm\z/);
open(IN, "<$filename") or die "AutoSplit: Can't open $filename: $!\n";
my($pm_mod_time) = (stat($filename))[9];
@@ -280,7 +286,7 @@ sub autosplit_file {
$last_package = '';
while (<IN>) {
$fnr++;
- $in_pod = 1 if /^=/;
+ $in_pod = 1 if /^=\w/;
$in_pod = 0 if /^=cut/;
next if ($in_pod || /^=cut/);
# the following (tempting) old coding gives big troubles if a
@@ -289,7 +295,7 @@ sub autosplit_file {
if (/^package\s+([\w:]+)\s*;/) {
$this_package = $def_package = $1;
}
- if (/^sub\s+([\w:]+)(\s*\(.*?\))?/) {
+ if (/^sub\s+([\w:]+)(\s*(?:\(.*?\))?(?:$attr_list)?)/) {
print OUT "# end of $last_package\::$subname\n1;\n"
if $last_package;
$subname = $1;
@@ -346,8 +352,10 @@ EOT
}
$last_package = $this_package if defined $this_package;
}
- print OUT @cache,"1;\n# end of $last_package\::$subname\n";
- close(OUT);
+ if ($subname) {
+ print OUT @cache,"1;\n# end of $last_package\::$subname\n";
+ close(OUT);
+ }
close(IN);
if (!$keep){ # don't keep any obsolete *.al files in the directory
@@ -370,7 +378,7 @@ EOT
for my $dir (keys %outdirs) {
opendir(OUTDIR,$dir);
foreach (sort readdir(OUTDIR)){
- next unless /\.al$/;
+ next unless /\.al\z/;
my($file) = "$dir/$_";
$file = lc $file if $Is83 or $Is_VMS;
next if $outfiles{$file};
@@ -459,3 +467,6 @@ sub test6 { return join ":", __FILE__,__LINE__; }
package Yet::Another::AutoSplit;
sub testtesttesttest4_1 ($) { "another test 4\n"; }
sub testtesttesttest4_2 ($$) { "another duplicate test 4\n"; }
+package Yet::More::Attributes;
+sub test_a1 ($) : locked :locked { 1; }
+sub test_a2 : locked { 1; }
diff --git a/contrib/perl5/lib/Benchmark.pm b/contrib/perl5/lib/Benchmark.pm
index ef12d02..3c10a5b 100644
--- a/contrib/perl5/lib/Benchmark.pm
+++ b/contrib/perl5/lib/Benchmark.pm
@@ -2,13 +2,7 @@ package Benchmark;
=head1 NAME
-Benchmark - benchmark running times of code
-
-timethis - run a chunk of code several times
-
-timethese - run several chunks of code several times
-
-timeit - run a chunk of code and see how long it goes
+Benchmark - benchmark running times of Perl code
=head1 SYNOPSIS
@@ -26,14 +20,50 @@ timeit - run a chunk of code and see how long it goes
'Name2' => sub { ...code2... },
});
+ # cmpthese can be used both ways as well
+ cmpthese($count, {
+ 'Name1' => '...code1...',
+ 'Name2' => '...code2...',
+ });
+
+ cmpthese($count, {
+ 'Name1' => sub { ...code1... },
+ 'Name2' => sub { ...code2... },
+ });
+
+ # ...or in two stages
+ $results = timethese($count,
+ {
+ 'Name1' => sub { ...code1... },
+ 'Name2' => sub { ...code2... },
+ },
+ 'none'
+ );
+ cmpthese( $results ) ;
+
$t = timeit($count, '...other code...')
print "$count loops of other code took:",timestr($t),"\n";
+ $t = countit($time, '...other code...')
+ $count = $t->iters ;
+ print "$count loops of other code took:",timestr($t),"\n";
+
=head1 DESCRIPTION
The Benchmark module encapsulates a number of routines to help you
figure out how long it takes to execute some code.
+timethis - run a chunk of code several times
+
+timethese - run several chunks of code several times
+
+cmpthese - print results of timethese as a comparison chart
+
+timeit - run a chunk of code and see how long it goes
+
+countit - see how many times a chunk of code runs in a given time
+
+
=head2 Methods
=over 10
@@ -57,6 +87,10 @@ Enables or disable debugging by setting the C<$Benchmark::Debug> flag:
$t = timeit(10, ' 5 ** $Global ');
debug Benchmark 0;
+=item iters
+
+Returns the number of iterations.
+
=back
=head2 Standard Exports
@@ -119,28 +153,26 @@ The routines are called in string comparison order of KEY.
The COUNT can be zero or negative, see timethis().
+Returns a hash of Benchmark objects, keyed by name.
+
=item timediff ( T1, T2 )
Returns the difference between two Benchmark times as a Benchmark
object suitable for passing to timestr().
-=item timesum ( T1, T2 )
-
-Returns the sum of two Benchmark times as a Benchmark object suitable
-for passing to timestr().
-
=item timestr ( TIMEDIFF, [ STYLE, [ FORMAT ] ] )
Returns a string that formats the times in the TIMEDIFF object in
the requested STYLE. TIMEDIFF is expected to be a Benchmark object
similar to that returned by timediff().
-STYLE can be any of 'all', 'noc', 'nop' or 'auto'. 'all' shows each
-of the 5 times available ('wallclock' time, user time, system time,
+STYLE can be any of 'all', 'none', 'noc', 'nop' or 'auto'. 'all' shows
+each of the 5 times available ('wallclock' time, user time, system time,
user time of children, and system time of children). 'noc' shows all
except the two children times. 'nop' shows only wallclock and the
two children times. 'auto' (the default) will act as 'all' unless
the children times are both zero, in which case it acts as 'noc'.
+'none' prevents output.
FORMAT is the L<printf(3)>-style format specifier (without the
leading '%') to use to print the times. It defaults to '5.2f'.
@@ -162,6 +194,34 @@ Clear the cached time for COUNT rounds of the null loop.
Clear all cached times.
+=item cmpthese ( COUT, CODEHASHREF, [ STYLE ] )
+
+=item cmpthese ( RESULTSHASHREF )
+
+Optionally calls timethese(), then outputs comparison chart. This
+chart is sorted from slowest to fastest, and shows the percent
+speed difference between each pair of tests. Can also be passed
+the data structure that timethese() returns:
+
+ $results = timethese( .... );
+ cmpthese( $results );
+
+Returns the data structure returned by timethese() (or passed in).
+
+=item countit(TIME, CODE)
+
+Arguments: TIME is the minimum length of time to run CODE for, and CODE is
+the code to run. CODE may be either a code reference or a string to
+be eval'd; either way it will be run in the caller's package.
+
+TIME is I<not> negative. countit() will run the loop many times to
+calculate the speed of CODE before running it for TIME. The actual
+time run for will usually be greater than TIME due to system clock
+resolution, so it's best to look at the number of iterations divided
+by the times that you are concerned with, not just the iterations.
+
+Returns: a Benchmark object.
+
=item disablecache ( )
Disable caching of timings for the null loop. This will force Benchmark
@@ -173,6 +233,11 @@ Enable caching of timings for the null loop. The time taken for COUNT
rounds of the null loop will be calculated only once for each
different COUNT used.
+=item timesum ( T1, T2 )
+
+Returns the sum of two Benchmark times as a Benchmark object suitable
+for passing to timestr().
+
=back
=head1 NOTES
@@ -180,7 +245,7 @@ different COUNT used.
The data is stored as a list of values from the time and times
functions:
- ($real, $user, $system, $children_user, $children_system)
+ ($real, $user, $system, $children_user, $children_system, $iters)
in seconds for the whole loop (not divided by the number of rounds).
@@ -192,7 +257,7 @@ The time of the null loop (a loop with the same
number of rounds but empty loop body) is subtracted
from the time of the real loop.
-The null loop times are cached, the key being the
+The null loop times can be cached, the key being the
number of rounds. The caching can be controlled using
calls like these:
@@ -202,6 +267,38 @@ calls like these:
disablecache();
enablecache();
+Caching is off by default, as it can (usually slightly) decrease
+accuracy and does not usually noticably affect runtimes.
+
+=head1 EXAMPLES
+
+For example,
+
+ use Benchmark;$x=3;cmpthese(-5,{a=>sub{$x*$x},b=>sub{$x**2}})
+
+outputs something like this:
+
+ Benchmark: running a, b, each for at least 5 CPU seconds...
+ a: 10 wallclock secs ( 5.14 usr + 0.13 sys = 5.27 CPU) @ 3835055.60/s (n=20210743)
+ b: 5 wallclock secs ( 5.41 usr + 0.00 sys = 5.41 CPU) @ 1574944.92/s (n=8520452)
+ Rate b a
+ b 1574945/s -- -59%
+ a 3835056/s 144% --
+
+while
+
+ use Benchmark;
+ $x=3;
+ $r=timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}},'none');
+ cmpthese($r);
+
+outputs something like this:
+
+ Rate b a
+ b 1559428/s -- -62%
+ a 4152037/s 166% --
+
+
=head1 INHERITANCE
Benchmark inherits from no other class, except of course
@@ -210,7 +307,7 @@ for Exporter.
=head1 CAVEATS
Comparing eval'd strings with code references will give you
-inaccurate results: a code reference will show a slower
+inaccurate results: a code reference will show a slightly slower
execution time than the equivalent eval'd string.
The real time timing is done using time(2) and
@@ -226,6 +323,10 @@ The system time of the null loop might be slightly
more than the system time of the loop with the actual
code and therefore the difference might end up being E<lt> 0.
+=head1 SEE ALSO
+
+L<Devel::DProf> - a Perl code profiler
+
=head1 AUTHORS
Jarkko Hietaniemi <F<jhi@iki.fi>>, Tim Bunce <F<Tim.Bunce@ig.co.uk>>
@@ -241,6 +342,10 @@ documentation.
April 04-07th, 1997: by Jarkko Hietaniemi, added the run-for-some-time
functionality.
+September, 1999; by Barrie Slaymaker: math fixes and accuracy and
+efficiency tweaks. Added cmpthese(). A result is now returned from
+timethese(). Exposed countit() (was runfor()).
+
=cut
# evaluate something in a clean lexical environment
@@ -254,7 +359,10 @@ use Carp;
use Exporter;
@ISA=(Exporter);
@EXPORT=qw(timeit timethis timethese timediff timestr);
-@EXPORT_OK=qw(clearcache clearallcache disablecache enablecache);
+@EXPORT_OK=qw(timesum cmpthese countit
+ clearcache clearallcache disablecache enablecache);
+
+$VERSION = 1.00;
&init;
@@ -273,7 +381,9 @@ sub init {
sub debug { $debug = ($_[1] != 0); }
-sub clearcache { delete $cache{$_[0]}; }
+# The cache needs two branches: 's' for strings and 'c' for code. The
+# emtpy loop is different in these two cases.
+sub clearcache { delete $cache{"$_[0]c"}; delete $cache{"$_[0]s"}; }
sub clearallcache { %cache = (); }
sub enablecache { $cache = 1; }
sub disablecache { $cache = 0; }
@@ -288,6 +398,7 @@ sub cpu_p { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps ; }
sub cpu_c { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $cu+$cs ; }
sub cpu_a { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps+$cu+$cs ; }
sub real { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $r ; }
+sub iters { $_[0]->[5] ; }
sub timediff {
my($a, $b) = @_;
@@ -312,19 +423,19 @@ sub timestr {
my @t = @$tr;
warn "bad time value (@t)" unless @t==6;
my($r, $pu, $ps, $cu, $cs, $n) = @t;
- my($pt, $ct, $t) = ($tr->cpu_p, $tr->cpu_c, $tr->cpu_a);
+ my($pt, $ct, $tt) = ($tr->cpu_p, $tr->cpu_c, $tr->cpu_a);
$f = $defaultfmt unless defined $f;
# format a time in the required style, other formats may be added here
$style ||= $defaultstyle;
$style = ($ct>0) ? 'all' : 'noc' if $style eq 'auto';
my $s = "@t $style"; # default for unknown style
$s=sprintf("%2d wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)",
- @t,$t) if $style eq 'all';
+ $r,$pu,$ps,$cu,$cs,$tt) if $style eq 'all';
$s=sprintf("%2d wallclock secs (%$f usr + %$f sys = %$f CPU)",
$r,$pu,$ps,$pt) if $style eq 'noc';
$s=sprintf("%2d wallclock secs (%$f cusr + %$f csys = %$f CPU)",
$r,$cu,$cs,$ct) if $style eq 'nop';
- $s .= sprintf(" @ %$f/s (n=$n)", $n / ( $pu + $ps )) if $n;
+ $s .= sprintf(" @ %$f/s (n=$n)", $n / ( $pu + $ps )) if $n && $pu+$ps;
$s;
}
@@ -362,11 +473,17 @@ sub runloop {
croak "runloop unable to compile '$c': $@\ncode: $subcode\n" if $@;
print STDERR "runloop $n '$subcode'\n" if $debug;
- $t0 = Benchmark->new(0);
+ # Wait for the user timer to tick. This makes the error range more like
+ # -0.01, +0. If we don't wait, then it's more like -0.01, +0.01. This
+ # may not seem important, but it significantly reduces the chances of
+ # getting a too low initial $n in the initial, 'find the minimum' loop
+ # in &countit. This, in turn, can reduce the number of calls to
+ # &runloop a lot, and thus reduce additive errors.
+ my $tbase = Benchmark->new(0)->[1];
+ while ( ( $t0 = Benchmark->new(0) )->[1] == $tbase ) {} ;
&$subref;
$t1 = Benchmark->new($n);
$td = &timediff($t1, $t0);
-
timedebug("runloop:",$td);
$td;
}
@@ -377,18 +494,20 @@ sub timeit {
my($wn, $wc, $wd);
printf STDERR "timeit $n $code\n" if $debug;
-
- if ($cache && exists $cache{$n}) {
- $wn = $cache{$n};
+ my $cache_key = $n . ( ref( $code ) ? 'c' : 's' );
+ if ($cache && exists $cache{$cache_key} ) {
+ $wn = $cache{$cache_key};
} else {
- $wn = &runloop($n, '');
- $cache{$n} = $wn;
+ $wn = &runloop($n, ref( $code ) ? sub { undef } : '' );
+ # Can't let our baseline have any iterations, or they get subtracted
+ # out of the result.
+ $wn->[5] = 0;
+ $cache{$cache_key} = $wn;
}
$wc = &runloop($n, $code);
$wd = timediff($wc, $wn);
-
timedebug("timeit: ",$wc);
timedebug(" - ",$wn);
timedebug(" = ",$wd);
@@ -400,8 +519,9 @@ sub timeit {
my $default_for = 3;
my $min_for = 0.1;
-sub runfor {
- my ($code, $tmax) = @_;
+
+sub countit {
+ my ( $tmax, $code ) = @_;
if ( not defined $tmax or $tmax == 0 ) {
$tmax = $default_for;
@@ -409,53 +529,61 @@ sub runfor {
$tmax = -$tmax;
}
- die "runfor(..., $tmax): timelimit cannot be less than $min_for.\n"
+ die "countit($tmax, ...): timelimit cannot be less than $min_for.\n"
if $tmax < $min_for;
- my ($n, $td, $tc, $ntot, $rtot, $utot, $stot, $cutot, $cstot );
-
- # First find the minimum $n that gives a non-zero timing.
-
- my $nmin;
+ my ($n, $tc);
- for ($n = 1, $tc = 0; $tc <= 0; $n *= 2 ) {
- $td = timeit($n, $code);
+ # First find the minimum $n that gives a significant timing.
+ for ($n = 1; ; $n *= 2 ) {
+ my $td = timeit($n, $code);
$tc = $td->[1] + $td->[2];
+ last if $tc > 0.1;
}
- $nmin = $n;
-
- my $ttot = 0;
- my $tpra = 0.05 * $tmax; # Target/time practice.
+ my $nmin = $n;
+
+ # Get $n high enough that we can guess the final $n with some accuracy.
+ my $tpra = 0.1 * $tmax; # Target/time practice.
+ while ( $tc < $tpra ) {
+ # The 5% fudge is to keep us from iterating again all
+ # that often (this speeds overall responsiveness when $tmax is big
+ # and we guess a little low). This does not noticably affect
+ # accuracy since we're not couting these times.
+ $n = int( $tpra * 1.05 * $n / $tc ); # Linear approximation.
+ my $td = timeit($n, $code);
+ $tc = $td->[1] + $td->[2];
+ }
- # Double $n until we have think we have practiced enough.
- for ( $n = 1; $ttot < $tpra; $n *= 2 ) {
- $td = timeit($n, $code);
- $tc = $td->cpu_p;
- $ntot += $n;
- $rtot += $td->[0];
- $utot += $td->[1];
- $stot += $td->[2];
- $ttot = $utot + $stot;
+ # Now, do the 'for real' timing(s), repeating until we exceed
+ # the max.
+ my $ntot = 0;
+ my $rtot = 0;
+ my $utot = 0.0;
+ my $stot = 0.0;
+ my $cutot = 0.0;
+ my $cstot = 0.0;
+ my $ttot = 0.0;
+
+ # The 5% fudge is because $n is often a few % low even for routines
+ # with stable times and avoiding extra timeit()s is nice for
+ # accuracy's sake.
+ $n = int( $n * ( 1.05 * $tmax / $tc ) );
+
+ while () {
+ my $td = timeit($n, $code);
+ $ntot += $n;
+ $rtot += $td->[0];
+ $utot += $td->[1];
+ $stot += $td->[2];
$cutot += $td->[3];
$cstot += $td->[4];
- }
-
- my $r;
+ $ttot = $utot + $stot;
+ last if $ttot >= $tmax;
- # Then iterate towards the $tmax.
- while ( $ttot < $tmax ) {
- $r = $tmax / $ttot - 1; # Linear approximation.
- $n = int( $r * $n );
+ my $r = $tmax / $ttot - 1; # Linear approximation.
+ $n = int( $r * $ntot );
$n = $nmin if $n < $nmin;
- $td = timeit($n, $code);
- $ntot += $n;
- $rtot += $td->[0];
- $utot += $td->[1];
- $stot += $td->[2];
- $ttot = $utot + $stot;
- $cutot += $td->[3];
- $cstot += $td->[4];
}
return bless [ $rtot, $utot, $stot, $cutot, $cstot, $ntot ];
@@ -478,14 +606,14 @@ sub timethis{
$title = "timethis $n" unless defined $title;
} else {
$fort = n_to_for( $n );
- $t = runfor($code, $fort);
+ $t = countit( $fort, $code );
$title = "timethis for $fort" unless defined $title;
$forn = $t->[-1];
}
local $| = 1;
$style = "" unless defined $style;
- printf("%10s: ", $title);
- print timestr($t, $style, $defaultfmt),"\n";
+ printf("%10s: ", $title) unless $style eq 'none';
+ print timestr($t, $style, $defaultfmt),"\n" unless $style eq 'none';
$n = $forn if defined $forn;
@@ -505,25 +633,163 @@ sub timethese{
unless ref $alt eq HASH;
my @names = sort keys %$alt;
$style = "" unless defined $style;
- print "Benchmark: ";
+ print "Benchmark: " unless $style eq 'none';
if ( $n > 0 ) {
croak "non-integer loopcount $n, stopped" if int($n)<$n;
- print "timing $n iterations of";
+ print "timing $n iterations of" unless $style eq 'none';
} else {
- print "running";
+ print "running" unless $style eq 'none';
}
- print " ", join(', ',@names);
+ print " ", join(', ',@names) unless $style eq 'none';
unless ( $n > 0 ) {
my $for = n_to_for( $n );
- print ", each for at least $for CPU seconds";
+ print ", each for at least $for CPU seconds" unless $style eq 'none';
}
- print "...\n";
+ print "...\n" unless $style eq 'none';
# we could save the results in an array and produce a summary here
# sum, min, max, avg etc etc
+ my %results;
foreach my $name (@names) {
- timethis ($n, $alt -> {$name}, $name, $style);
+ $results{$name} = timethis ($n, $alt -> {$name}, $name, $style);
+ }
+
+ return \%results;
+}
+
+sub cmpthese{
+ my $results = ref $_[0] ? $_[0] : timethese( @_ );
+
+ return $results
+ if defined $_[2] && $_[2] eq 'none';
+
+ # Flatten in to an array of arrays with the name as the first field
+ my @vals = map{ [ $_, @{$results->{$_}} ] } keys %$results;
+
+ for (@vals) {
+ # The epsilon fudge here is to prevent div by 0. Since clock
+ # resolutions are much larger, it's below the noise floor.
+ my $rate = $_->[6] / ( $_->[2] + $_->[3] + 0.000000000000001 );
+ $_->[7] = $rate;
+ }
+
+ # Sort by rate
+ @vals = sort { $a->[7] <=> $b->[7] } @vals;
+
+ # If more than half of the rates are greater than one...
+ my $display_as_rate = $vals[$#vals>>1]->[7] > 1;
+
+ my @rows;
+ my @col_widths;
+
+ my @top_row = (
+ '',
+ $display_as_rate ? 'Rate' : 's/iter',
+ map { $_->[0] } @vals
+ );
+
+ push @rows, \@top_row;
+ @col_widths = map { length( $_ ) } @top_row;
+
+ # Build the data rows
+ # We leave the last column in even though it never has any data. Perhaps
+ # it should go away. Also, perhaps a style for a single column of
+ # percentages might be nice.
+ for my $row_val ( @vals ) {
+ my @row;
+
+ # Column 0 = test name
+ push @row, $row_val->[0];
+ $col_widths[0] = length( $row_val->[0] )
+ if length( $row_val->[0] ) > $col_widths[0];
+
+ # Column 1 = performance
+ my $row_rate = $row_val->[7];
+
+ # We assume that we'll never get a 0 rate.
+ my $a = $display_as_rate ? $row_rate : 1 / $row_rate;
+
+ # Only give a few decimal places before switching to sci. notation,
+ # since the results aren't usually that accurate anyway.
+ my $format =
+ $a >= 100 ?
+ "%0.0f" :
+ $a >= 10 ?
+ "%0.1f" :
+ $a >= 1 ?
+ "%0.2f" :
+ $a >= 0.1 ?
+ "%0.3f" :
+ "%0.2e";
+
+ $format .= "/s"
+ if $display_as_rate;
+ # Using $b here due to optimizing bug in _58 through _61
+ my $b = sprintf( $format, $a );
+ push @row, $b;
+ $col_widths[1] = length( $b )
+ if length( $b ) > $col_widths[1];
+
+ # Columns 2..N = performance ratios
+ my $skip_rest = 0;
+ for ( my $col_num = 0 ; $col_num < @vals ; ++$col_num ) {
+ my $col_val = $vals[$col_num];
+ my $out;
+ if ( $skip_rest ) {
+ $out = '';
+ }
+ elsif ( $col_val->[0] eq $row_val->[0] ) {
+ $out = "--";
+ # $skip_rest = 1;
+ }
+ else {
+ my $col_rate = $col_val->[7];
+ $out = sprintf( "%.0f%%", 100*$row_rate/$col_rate - 100 );
+ }
+ push @row, $out;
+ $col_widths[$col_num+2] = length( $out )
+ if length( $out ) > $col_widths[$col_num+2];
+
+ # A little wierdness to set the first column width properly
+ $col_widths[$col_num+2] = length( $col_val->[0] )
+ if length( $col_val->[0] ) > $col_widths[$col_num+2];
+ }
+ push @rows, \@row;
}
+
+ # Equalize column widths in the chart as much as possible without
+ # exceeding 80 characters. This does not use or affect cols 0 or 1.
+ my @sorted_width_refs =
+ sort { $$a <=> $$b } map { \$_ } @col_widths[2..$#col_widths];
+ my $max_width = ${$sorted_width_refs[-1]};
+
+ my $total = @col_widths - 1 ;
+ for ( @col_widths ) { $total += $_ }
+
+ STRETCHER:
+ while ( $total < 80 ) {
+ my $min_width = ${$sorted_width_refs[0]};
+ last
+ if $min_width == $max_width;
+ for ( @sorted_width_refs ) {
+ last
+ if $$_ > $min_width;
+ ++$$_;
+ ++$total;
+ last STRETCHER
+ if $total >= 80;
+ }
+ }
+
+ # Dump the output
+ my $format = join( ' ', map { "%${_}s" } @col_widths ) . "\n";
+ substr( $format, 1, 0 ) = '-';
+ for ( @rows ) {
+ printf $format, @$_;
+ }
+
+ return $results;
}
+
1;
diff --git a/contrib/perl5/lib/CGI.pm b/contrib/perl5/lib/CGI.pm
index f5615f2..3e03257 100644
--- a/contrib/perl5/lib/CGI.pm
+++ b/contrib/perl5/lib/CGI.pm
@@ -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.5 1998/12/06 10:19:48 lstein Exp $';
-$CGI::VERSION='2.46';
+$CGI::revision = '$Id: CGI.pm,v 1.19 1999/08/31 17:04:37 lstein Exp $';
+$CGI::VERSION='2.56';
# HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
# UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
@@ -58,6 +58,9 @@ sub initialize_globals {
# Change this to 1 to disable uploads entirely:
$DISABLE_UPLOADS = 0;
+ # Automatically determined -- don't change
+ $EBCDIC = 0;
+
# Change this to 1 to suppress redundant HTTP headers
$HEADERS_ONCE = 0;
@@ -89,9 +92,13 @@ unless ($OS) {
}
}
if ($OS=~/Win/i) {
- $OS = 'WINDOWS';
+ $OS = 'WINDOWS';
} elsif ($OS=~/vms/i) {
- $OS = 'VMS';
+ $OS = 'VMS';
+} elsif ($OS=~/bsdos/i) {
+ $OS = 'UNIX';
+} elsif ($OS=~/dos/i) {
+ $OS = 'DOS';
} elsif ($OS=~/^MacOS$/i) {
$OS = 'MACINTOSH';
} elsif ($OS=~/os2/i) {
@@ -101,7 +108,7 @@ if ($OS=~/Win/i) {
}
# Some OS logic. Binary mode enabled on DOS, NT and VMS
-$needs_binmode = $OS=~/^(WINDOWS|VMS|OS2)/;
+$needs_binmode = $OS=~/^(WINDOWS|DOS|OS2|MSWin)/;
# This is the default class for the CGI object to use when all else fails.
$DefaultClass = 'CGI' unless defined $CGI::DefaultClass;
@@ -112,7 +119,7 @@ $AutoloadClass = $DefaultClass unless defined $CGI::AutoloadClass;
# The path separator is a slash, backslash or semicolon, depending
# on the paltform.
$SL = {
- UNIX=>'/', OS2=>'\\', WINDOWS=>'\\', MACINTOSH=>':', VMS=>'/'
+ UNIX=>'/', OS2=>'\\', WINDOWS=>'\\', DOS=>'\\', MACINTOSH=>':', VMS=>'/'
}->{$OS};
# This no longer seems to be necessary
@@ -123,7 +130,7 @@ $IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/;
# Turn on special checking for Doug MacEachern's modperl
if (exists $ENV{'GATEWAY_INTERFACE'}
&&
- ($MOD_PERL = $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-Perl/))
+ ($MOD_PERL = $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-Perl\//))
{
$| = 1;
require Apache;
@@ -139,11 +146,32 @@ $PERLEX++ if defined($ENV{'GATEWAY_INTERFACE'}) && $ENV{'GATEWAY_INTERFACE'} =~
# really annoying.
$EBCDIC = "\t" ne "\011";
if ($OS eq 'VMS') {
- $CRLF = "\n";
+ $CRLF = "\n";
} elsif ($EBCDIC) {
- $CRLF= "\r\n";
+ $CRLF= "\r\n";
} else {
- $CRLF = "\015\012";
+ $CRLF = "\015\012";
+}
+
+if ($EBCDIC) {
+@A2E = (
+ 0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 21, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
+ 64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
+240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
+124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
+215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109,
+121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
+151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161, 7,
+ 32, 33, 34, 35, 36, 37, 6, 23, 40, 41, 42, 43, 44, 9, 10, 27,
+ 48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 58, 59, 4, 20, 62,255,
+ 65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188,
+144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171,
+100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119,
+172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89,
+ 68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87,
+140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223
+ );
}
if ($needs_binmode) {
@@ -164,15 +192,16 @@ if ($needs_binmode) {
submit reset defaults radio_group popup_menu button autoEscape
scrolling_list image_button start_form end_form startform endform
start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/],
- ':cgi'=>[qw/param path_info path_translated url self_url script_name cookie Dump
- raw_cookie request_method query_string Accept user_agent remote_host
+ ':cgi'=>[qw/param upload path_info path_translated url self_url script_name cookie Dump
+ raw_cookie request_method query_string Accept user_agent remote_host content_type
remote_addr referer server_name server_software server_port server_protocol
virtual_host remote_ident auth_type http use_named_parameters
save_parameters restore_parameters param_fetch
- remote_user user_name header redirect import_names put Delete Delete_all url_param/],
+ remote_user user_name header redirect import_names put
+ Delete Delete_all url_param cgi_error/],
':ssl' => [qw/https/],
':imagemap' => [qw/Area Map/],
- ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam/],
+ ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam Vars/],
':html' => [qw/:html2 :html3 :netscape/],
':standard' => [qw/:html2 :html3 :form :cgi/],
':push' => [qw/multipart_init multipart_start multipart_end/],
@@ -328,7 +357,7 @@ sub init {
# if we get called more than once, we want to initialize
# ourselves from the original query (which may be gone
# if it was read from STDIN originally.)
- if (defined(@QUERY_PARAM) && !defined($initializer)) {
+ if (@QUERY_PARAM && !defined($initializer)) {
foreach (@QUERY_PARAM) {
$self->param('-name'=>$_,'-value'=>$QUERY_PARAM{$_});
}
@@ -337,12 +366,17 @@ sub init {
$meth=$ENV{'REQUEST_METHOD'} if defined($ENV{'REQUEST_METHOD'});
$content_length = defined($ENV{'CONTENT_LENGTH'}) ? $ENV{'CONTENT_LENGTH'} : 0;
- die "Client attempted to POST $content_length bytes, but POSTs are limited to $POST_MAX"
- if ($POST_MAX > 0) && ($content_length > $POST_MAX);
+
$fh = to_filehandle($initializer) if $initializer;
METHOD: {
+ # avoid unreasonably large postings
+ if (($POST_MAX > 0) && ($content_length > $POST_MAX)) {
+ $self->cgi_error("413 Request entity too large");
+ last METHOD;
+ }
+
# Process multipart postings, but only if the initializer is
# not defined.
if ($meth eq 'POST'
@@ -394,7 +428,11 @@ sub init {
# If method is GET or HEAD, fetch the query from
# the environment.
if ($meth=~/^(GET|HEAD)$/) {
- $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
+ if ($MOD_PERL) {
+ $query_string = Apache->request->args;
+ } else {
+ $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};
+ }
last METHOD;
}
@@ -417,7 +455,7 @@ sub init {
# We now have the query string in hand. We do slightly
# different things for keyword lists and parameter lists.
- if ($query_string ne '') {
+ if (defined $query_string && $query_string) {
if ($query_string =~ /=/) {
$self->parse_params($query_string);
} else {
@@ -473,23 +511,34 @@ sub print {
CORE::print(@_);
}
+# get/set last cgi_error
+sub cgi_error {
+ my ($self,$err) = self_or_default(@_);
+ $self->{'.cgi_error'} = $err if defined $err;
+ return $self->{'.cgi_error'};
+}
+
# unescape URL-encoded data
sub unescape {
- shift() if ref($_[0]);
- my $todecode = shift;
- return undef unless defined($todecode);
- $todecode =~ tr/+/ /; # pluses become spaces
- $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
- return $todecode;
+ shift() if ref($_[0]) || (defined $_[1] && $_[0] eq $DefaultClass);
+ my $todecode = shift;
+ return undef unless defined($todecode);
+ $todecode =~ tr/+/ /; # pluses become spaces
+ if ($EBCDIC) {
+ $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",$A2E[hex($1)])/ge;
+ } else {
+ $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
+ }
+ return $todecode;
}
# URL-encode data
sub escape {
- shift() if ref($_[0]) || $_[0] eq $DefaultClass;
- my $toencode = shift;
- return undef unless defined($toencode);
- $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
- return $toencode;
+ shift() if ref($_[0]) || (defined $_[1] && $_[0] eq $DefaultClass);
+ my $toencode = shift;
+ return undef unless defined($toencode);
+ $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
+ return $toencode;
}
sub save_request {
@@ -536,10 +585,10 @@ sub binmode {
sub _make_tag_func {
my ($self,$tagname) = @_;
- my $func = qq#
+ my $func = qq(
sub $tagname {
shift if \$_[0] &&
- (!ref(\$_[0]) && \$_[0] eq \$CGI::DefaultClass) ||
+# (!ref(\$_[0]) && \$_[0] eq \$CGI::DefaultClass) ||
(ref(\$_[0]) &&
(substr(ref(\$_[0]),0,3) eq 'CGI' ||
UNIVERSAL::isa(\$_[0],'CGI')));
@@ -549,7 +598,7 @@ sub _make_tag_func {
my(\@attr) = make_attributes( '',shift() );
\$attr = " \@attr" if \@attr;
}
- #;
+ );
if ($tagname=~/start_(\w+)/i) {
$func .= qq! return "<\U$1\E\$attr>";} !;
} elsif ($tagname=~/end_(\w+)/i) {
@@ -650,7 +699,7 @@ sub _compile {
die $@;
}
}
- delete($sub->{$func_name}); #free storage
+ CORE::delete($sub->{$func_name}); #free storage
return "$pack\:\:$func_name";
}
@@ -746,8 +795,8 @@ END_OF_FUNC
####
sub delete {
my($self,$name) = self_or_default(@_);
- delete $self->{$name};
- delete $self->{'.fieldnames'}->{$name};
+ CORE::delete $self->{$name};
+ CORE::delete $self->{'.fieldnames'}->{$name};
@{$self->{'.parameters'}}=grep($_ ne $name,$self->param());
return wantarray ? () : undef;
}
@@ -762,7 +811,7 @@ sub import_names {
my($self,$namespace,$delete) = self_or_default(@_);
$namespace = 'Q' unless defined($namespace);
die "Can't import names into \"main\"\n" if \%{"${namespace}::"} == \%::;
- if ($delete || $MOD_PERL) {
+ if ($delete || $MOD_PERL || exists $ENV{'FCGI_ROLE'}) {
# can anyone find an easier way to do this?
foreach (keys %{"${namespace}::"}) {
local *symbol = "${namespace}::${_}";
@@ -793,7 +842,7 @@ END_OF_FUNC
sub keywords {
my($self,@values) = self_or_default(@_);
# If values is provided, then we set it.
- $self->{'keywords'}=[@values] if defined(@values);
+ $self->{'keywords'}=[@values] if @values;
my(@result) = defined($self->{'keywords'}) ? @{$self->{'keywords'}} : ();
@result;
}
@@ -801,6 +850,18 @@ END_OF_FUNC
# These are some tie() interfaces for compatibility
# with Steve Brenner's cgi-lib.pl routines
+'Vars' => <<'END_OF_FUNC',
+sub Vars {
+ my $q = shift;
+ my %in;
+ tie(%in,CGI,$q);
+ return %in if wantarray;
+ return \%in;
+}
+END_OF_FUNC
+
+# These are some tie() interfaces for compatibility
+# with Steve Brenner's cgi-lib.pl routines
'ReadParse' => <<'END_OF_FUNC',
sub ReadParse {
local(*in);
@@ -858,7 +919,8 @@ END_OF_FUNC
'TIEHASH' => <<'END_OF_FUNC',
sub TIEHASH {
- return $Q || new CGI;
+ return $_[1] if defined $_[1];
+ return $Q || new shift;
}
END_OF_FUNC
@@ -1031,6 +1093,7 @@ sub dump {
push(@result,"<UL>");
foreach $value ($self->param($param)) {
$value = $self->escapeHTML($value);
+ $value =~ s/\n/<BR>\n/g;
push(@result,"<LI>$value");
}
push(@result,"</UL>");
@@ -1065,7 +1128,7 @@ sub save {
my($escaped_param) = escape($param);
my($value);
foreach $value ($self->param($param)) {
- print $filehandle "$escaped_param=",escape($value),"\n";
+ print $filehandle "$escaped_param=",escape("$value"),"\n";
}
}
print $filehandle "=\n"; # end of record
@@ -1327,7 +1390,7 @@ sub _style {
'-foo'=>'bar', # a trick to allow the '-' to be omitted
ref($style) eq 'ARRAY' ? @$style : %$style);
$type = $stype if $stype;
- push(@result,qq/<LINK REL="stylesheet" HREF="$src">/) if $src;
+ push(@result,qq/<LINK REL="stylesheet" TYPE="$type" HREF="$src">/) if $src;
push(@result,style({'type'=>$type},"<!--\n$code\n-->")) if $code;
} else {
push(@result,style({'type'=>$type},"<!--\n$style\n-->"));
@@ -1348,7 +1411,7 @@ sub _script {
($src,$code,$language) =
$self->rearrange([SRC,CODE,LANGUAGE],
'-foo'=>'bar', # a trick to allow the '-' to be omitted
- ref($style) eq 'ARRAY' ? @$script : %$script);
+ ref($script) eq 'ARRAY' ? @$script : %$script);
} else {
($src,$code,$language) = ('',$script,'JavaScript');
@@ -1360,7 +1423,7 @@ sub _script {
if $code && $language=~/javascript/i;
$code = "<!-- Hide script\n$code\n\# End script hiding -->"
if $code && $language=~/perl/i;
- push(@result,script({@satts},$code));
+ push(@result,script({@satts},$code || ''));
}
@result;
}
@@ -1460,7 +1523,8 @@ END_OF_FUNC
'endform' => <<'END_OF_FUNC',
sub endform {
my($self,@p) = self_or_default(@_);
- return ($self->get_fields,"</FORM>");
+ return wantarray ? ($self->get_fields,"</FORM>") :
+ $self->get_fields ."\n</FORM>";
}
END_OF_FUNC
@@ -1727,9 +1791,7 @@ sub checkbox {
$the_label = $self->escapeHTML($the_label);
my($other) = @other ? " @other" : '';
$self->register_parameter($name);
- return <<END;
-<INPUT TYPE="checkbox" NAME="$name" VALUE="$value"$checked$other>$the_label
-END
+ return qq{<INPUT TYPE="checkbox" NAME="$name" VALUE="$value"$checked$other>$the_label};
}
END_OF_FUNC
@@ -1800,8 +1862,7 @@ END_OF_FUNC
# Escape HTML -- used internally
'escapeHTML' => <<'END_OF_FUNC',
sub escapeHTML {
- my($self,$toencode) = @_;
- $toencode = $self unless ref($self);
+ my ($self,$toencode) = self_or_default(@_);
return undef unless defined($toencode);
return $toencode if ref($self) && $self->{'dontescape'};
@@ -1849,14 +1910,14 @@ sub _tableize {
# rearrange into a pretty table
$result = "<TABLE>";
my($row,$column);
- unshift(@$colheaders,'') if defined(@$colheaders) && defined(@$rowheaders);
- $result .= "<TR>" if defined(@{$colheaders});
+ unshift(@$colheaders,'') if @$colheaders && @$rowheaders;
+ $result .= "<TR>" if @$colheaders;
foreach (@{$colheaders}) {
$result .= "<TH>$_</TH>";
}
for ($row=0;$row<$rows;$row++) {
$result .= "<TR>";
- $result .= "<TH>$rowheaders->[$row]</TH>" if defined(@$rowheaders);
+ $result .= "<TH>$rowheaders->[$row]</TH>" if @$rowheaders;
for ($column=0;$column<$columns;$column++) {
$result .= "<TD>" . $elements[$column*$rows + $row] . "</TD>"
if defined($elements[$column*$rows + $row]);
@@ -2069,7 +2130,7 @@ sub hidden {
$name=$self->escapeHTML($name);
foreach (@value) {
- $_=$self->escapeHTML($_);
+ $_ = defined($_) ? $self->escapeHTML($_) : '';
push(@result,qq/<INPUT TYPE="hidden" NAME="$name" VALUE="$_">/);
}
return wantarray ? @result : join('',@result);
@@ -2135,6 +2196,20 @@ sub url {
my $url;
$full++ if !($relative || $absolute);
+ my $path = $self->path_info;
+ my $script_name;
+ if (exists($ENV{REQUEST_URI})) {
+ my $index;
+ $script_name = $ENV{REQUEST_URI};
+ # strip query string
+ substr($script_name,$index) = '' if ($index = index($script_name,'?')) >= 0;
+ # and path
+ substr($script_name,$index) = '' if exists($ENV{PATH_INFO})
+ and ($index = rindex($script_name,$ENV{PATH_INFO})) >= 0;
+ } else {
+ $script_name = $self->script_name;
+ }
+
if ($full) {
my $protocol = $self->protocol();
$url = "$protocol://";
@@ -2148,13 +2223,13 @@ sub url {
unless (lc($protocol) eq 'http' && $port == 80)
|| (lc($protocol) eq 'https' && $port == 443);
}
- $url .= $self->script_name;
+ $url .= $script_name;
} elsif ($relative) {
- ($url) = $self->script_name =~ m!([^/]+)$!;
+ ($url) = $script_name =~ m!([^/]+)$!;
} elsif ($absolute) {
- $url = $self->script_name;
+ $url = $script_name;
}
- $url .= $self->path_info if $path_info and $self->path_info;
+ $url .= $path if $path_info and defined $path;
$url .= "?" . $self->query_string if $query and $self->query_string;
return $url;
}
@@ -2206,7 +2281,7 @@ sub cookie {
push(@param,'-expires'=>$expires) if $expires;
push(@param,'-secure'=>$secure) if $secure;
- return new CGI::Cookie(@param);
+ return CGI::Cookie->new(@param);
}
END_OF_FUNC
@@ -2236,6 +2311,8 @@ sub expire_calc {
my($offset);
if (!$time || (lc($time) eq 'now')) {
$offset = 0;
+ } elsif ($time=~/^\d+/) {
+ return $time;
} elsif ($time=~/^([+-]?(?:\d+|\d*\.\d*))([mhdMy]?)/) {
$offset = ($mult{$2} || 1)*$1;
} else {
@@ -2247,7 +2324,7 @@ END_OF_FUNC
# This internal routine creates date strings suitable for use in
# cookies and HTTP headers. (They differ, unfortunately.)
-# Thanks to Fisher Mark for this.
+# Thanks to Mark Fisher for this.
'expires' => <<'END_OF_FUNC',
sub expires {
my($time,$format) = @_;
@@ -2330,6 +2407,15 @@ sub request_method {
}
END_OF_FUNC
+#### Method: content_type
+# Returns the content_type string
+####
+'content_type' => <<'END_OF_FUNC',
+sub content_type {
+ return $ENV{'CONTENT_TYPE'};
+}
+END_OF_FUNC
+
#### Method: path_translated
# Return the physical path information provided
# by the URL (if any)
@@ -2353,6 +2439,7 @@ sub query_string {
my($eparam) = escape($param);
foreach $value ($self->param($param)) {
$value = escape($value);
+ next unless defined $value;
push(@pairs,"$eparam=$value");
}
}
@@ -2556,6 +2643,7 @@ END_OF_FUNC
sub http {
my ($self,$parameter) = self_or_CGI(@_);
return $ENV{$parameter} if $parameter=~/^HTTP/;
+ $parameter =~ tr/-/_/;
return $ENV{"HTTP_\U$parameter\E"} if $parameter;
my(@p);
foreach (keys %ENV) {
@@ -2574,6 +2662,7 @@ sub https {
my ($self,$parameter) = self_or_CGI(@_);
return $ENV{HTTPS} unless $parameter;
return $ENV{$parameter} if $parameter=~/^HTTPS/;
+ $parameter =~ tr/-/_/;
return $ENV{"HTTPS_\U$parameter\E"} if $parameter;
my(@p);
foreach (keys %ENV) {
@@ -2754,7 +2843,11 @@ sub read_multipart {
my $filenumber = 0;
while (!$buffer->eof) {
%header = $buffer->readHeader;
- die "Malformed multipart POST\n" unless %header;
+
+ unless (%header) {
+ $self->cgi_error("400 Bad request (malformed multipart POST)");
+ return;
+ }
my($param)= $header{'Content-Disposition'}=~/ name="?([^\";]*)"?/;
@@ -2766,7 +2859,7 @@ sub read_multipart {
# If no filename specified, then just read the data and assign it
# to our parameter list.
- unless ($filename) {
+ if ( !defined($filename) || $filename eq '' ) {
my($value) = $buffer->readBody;
push(@{$self->{$param}},$value);
next;
@@ -2784,13 +2877,16 @@ sub read_multipart {
last UPLOADS;
}
- $tmpfile = new TempFile;
- $tmp = $tmpfile->as_string;
-
- $filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES);
-
+ # choose a relatively unpredictable tmpfile sequence number
+ my $seqno = unpack("%16C*",join('',localtime,values %ENV));
+ for (my $cnt=10;$cnt>0;$cnt--) {
+ next unless $tmpfile = new TempFile($seqno);
+ $tmp = $tmpfile->as_string;
+ last if defined($filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES));
+ $seqno += int rand(100);
+ }
+ die "CGI open of tmpfile: $!\n" unless $filehandle;
$CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode;
- chmod 0600,$tmp; # only the owner can tamper with it
my ($data);
local($\) = '';
@@ -2804,7 +2900,7 @@ sub read_multipart {
# Save some information about the uploaded file where we can get
# at it later.
- $self->{'.tmpfiles'}->{$filename}= {
+ $self->{'.tmpfiles'}->{fileno($filehandle)}= {
name => $tmpfile,
info => {%header},
};
@@ -2814,11 +2910,21 @@ sub read_multipart {
}
END_OF_FUNC
+'upload' =><<'END_OF_FUNC',
+sub upload {
+ my($self,$param_name) = self_or_default(@_);
+ my $param = $self->param($param_name);
+ return unless $param;
+ return unless ref($param) && fileno($param);
+ return $param;
+}
+END_OF_FUNC
+
'tmpFileName' => <<'END_OF_FUNC',
sub tmpFileName {
my($self,$filename) = self_or_default(@_);
- return $self->{'.tmpfiles'}->{$filename}->{name} ?
- $self->{'.tmpfiles'}->{$filename}->{name}->as_string
+ return $self->{'.tmpfiles'}->{fileno($filename)}->{name} ?
+ $self->{'.tmpfiles'}->{fileno($filename)}->{name}->as_string
: '';
}
END_OF_FUNC
@@ -2826,7 +2932,7 @@ END_OF_FUNC
'uploadInfo' => <<'END_OF_FUNC',
sub uploadInfo {
my($self,$filename) = self_or_default(@_);
- return $self->{'.tmpfiles'}->{$filename}->{info};
+ return $self->{'.tmpfiles'}->{fileno($filename)}->{info};
}
END_OF_FUNC
@@ -2878,7 +2984,7 @@ $AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
sub asString {
my $self = shift;
# get rid of package name
- (my $i = $$self) =~ s/^\*(\w+::)+//;
+ (my $i = $$self) =~ s/^\*(\w+::fh\d{5})+//;
$i =~ s/\\(.)/$1/g;
return $i;
# BEGIN DEAD CODE
@@ -2904,12 +3010,10 @@ END_OF_FUNC
sub new {
my($pack,$name,$file,$delete) = @_;
require Fcntl unless defined &Fcntl::O_RDWR;
- ++$FH;
- my $ref = \*{'Fh::' . quotemeta($name)};
- sysopen($ref,$file,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL())
- || die "CGI open of $file: $!\n";
+ my $ref = \*{'Fh::' . ++$FH . quotemeta($name)};
+ sysopen($ref,$file,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL(),0600) || return;
unlink($file) if $delete;
- delete $Fh::{$FH};
+ CORE::delete $Fh::{$FH};
return bless $ref,$pack;
}
END_OF_FUNC
@@ -2976,7 +3080,7 @@ sub new {
# BUG: IE 3.01 on the Macintosh uses just the boundary -- not
# the two extra hyphens. We do a special case here on the user-agent!!!!
- $boundary = "--$boundary" unless CGI::user_agent('MSIE 3\.0[12]; ?Mac');
+ $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac');
} else { # otherwise we find it ourselves
my($old);
@@ -3175,15 +3279,25 @@ $MAC = $CGI::OS eq 'MACINTOSH';
my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : "";
unless ($TMPDIRECTORY) {
@TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp",
- "C:${SL}temp","${SL}tmp","${SL}temp","${vol}${SL}Temporary Items",
+ "C:${SL}temp","${SL}tmp","${SL}temp",
+ "${vol}${SL}Temporary Items","${SL}sys\$scratch",
"${SL}WWW_ROOT");
+ unshift(@TEMP,$ENV{'TMPDIR'}) if exists $ENV{'TMPDIR'};
+
+ #
+ # unshift(@TEMP,(getpwuid($<))[7].'/tmp') if $CGI::OS eq 'UNIX';
+ # Rob: getpwuid() is unfortunately UNIX specific. On brain dead OS'es this
+ # : can generate a 'getpwuid() not implemented' exception, even though
+ # : it's never called. Found under DOS/Win with the DJGPP perl port.
+ # : Refer to getpwuid() only at run-time if we're fortunate and have UNIX.
+ unshift(@TEMP,(eval {(getpwuid($<))[7]}).'/tmp') if $CGI::OS eq 'UNIX';
+
foreach (@TEMP) {
do {$TMPDIRECTORY = $_; last} if -d $_ && -w _;
}
}
$TMPDIRECTORY = $MAC ? "" : "." unless $TMPDIRECTORY;
-$SEQUENCE=0;
$MAXTRIES = 5000;
# cute feature, but overload implementation broke it
@@ -3199,14 +3313,15 @@ $AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD';
'new' => <<'END_OF_FUNC',
sub new {
- my($package) = @_;
- my $directory;
- my $i;
- for ($i = 0; $i < $MAXTRIES; $i++) {
- $directory = sprintf("${TMPDIRECTORY}${SL}CGItemp%d%04d",${$},++$SEQUENCE);
- last if ! -f $directory;
+ my($package,$sequence) = @_;
+ my $filename;
+ for (my $i = 0; $i < $MAXTRIES; $i++) {
+ last if ! -f ($filename = sprintf("${TMPDIRECTORY}${SL}CGItemp%d",$sequence++));
}
- return bless \$directory;
+ # untaint the darn thing
+ return unless $filename =~ m!^([a-zA-Z0-9_ '":/\\]+)$!;
+ $filename = $1;
+ return bless \$filename;
}
END_OF_FUNC
@@ -3240,7 +3355,6 @@ if ($^W) {
$MultipartBuffer::CRLF;
$MultipartBuffer::TIMEOUT;
$MultipartBuffer::INITIAL_FILLUNIT;
- $TempFile::SEQUENCE;
EOF
;
}
@@ -3322,7 +3436,7 @@ script and restore it later.
For example, using the object oriented style, here is how you create
a simple "Hello World" HTML page:
- #!/usr/local/bin/perl
+ #!/usr/local/bin/perl -w
use CGI; # load CGI routines
$q = new CGI; # create new CGI object
print $q->header, # create the HTTP header
@@ -3640,6 +3754,36 @@ can manipulate in any way you like.
You can also use a named argument style using the B<-name> argument.
+=head2 FETCHING THE PARAMETER LIST AS A HASH:
+
+ $params = $q->Vars;
+ print $params->{'address'};
+ @foo = split("\0",$params->{'foo'});
+ %params = $q->Vars;
+
+ use CGI ':cgi-lib';
+ $params = Vars;
+
+Many people want to fetch the entire parameter list as a hash in which
+the keys are the names of the CGI parameters, and the values are the
+parameters' values. The Vars() method does this. Called in a scalar
+context, it returns the parameter list as a tied hash reference.
+Changing a key changes the value of the parameter in the underlying
+CGI parameter list. Called in an array context, it returns the
+parameter list as an ordinary hash. This allows you to read the
+contents of the parameter list, but not to change it.
+
+When using this, the thing you must watch out for are multivalued CGI
+parameters. Because a hash cannot distinguish between scalar and
+array context, multivalued parameters will be returned as a packed
+string, separated by the "\0" (null) character. You must split this
+packed string in order to get at the individual values. This is the
+convention introduced long ago by Steve Brenner in his cgi-lib.pl
+module for Perl version 4.
+
+If you wish to use Vars() as a function, import the I<:cgi-lib> set of
+function calls (also see the section on CGI-LIB compatibility).
+
=head2 SAVING THE STATE OF THE SCRIPT TO A FILE:
$query->save(FILEHANDLE)
@@ -3686,14 +3830,37 @@ a short example of creating multiple session records:
The file format used for save/restore is identical to that used by the
Whitehead Genome Center's data exchange format "Boulderio", and can be
manipulated and even databased using Boulderio utilities. See
-
- http://www.genome.wi.mit.edu/genome_software/other/boulder.html
+
+ http://stein.cshl.org/boulder/
for further details.
If you wish to use this method from the function-oriented (non-OO)
interface, the exported name for this method is B<save_parameters()>.
+=head2 RETRIEVING CGI ERRORS
+
+Errors can occur while processing user input, particularly when
+processing uploaded files. When these errors occur, CGI will stop
+processing and return an empty parameter list. You can test for
+the existence and nature of errors using the I<cgi_error()> function.
+The error messages are formatted as HTTP status codes. You can either
+incorporate the error text into an HTML page, or use it as the value
+of the HTTP status:
+
+ my $error = $q->cgi_error;
+ if ($error) {
+ print $q->header(-status=>$error),
+ $q->start_html('Problems'),
+ $q->h2('Request not processed'),
+ $q->strong($error);
+ exit 0;
+ }
+
+When using the function-oriented interface (see the next section),
+errors may only occur the first time you call I<param()>. Be ready
+for this!
+
=head2 USING THE FUNCTION-ORIENTED INTERFACE
To use the function-oriented interface, you must specify which CGI.pm
@@ -3754,7 +3921,7 @@ Import "standard" features, 'html2', 'html3', 'form' and 'cgi'.
=item B<:all>
Import all the available methods. For the full list, see the CGI.pm
-code, where the variable %TAGS is defined.
+code, where the variable %EXPORT_TAGS is defined.
=back
@@ -3902,20 +4069,40 @@ input, this should work:
use CGI qw(-no_debug :standard);
restore_parameters(join('&',@ARGV));
-
+
See the section on debugging for more details.
=item -private_tempfiles
-CGI.pm can process uploaded file. Ordinarily it spools the
-uploaded file to a temporary directory, then deletes the file
-when done. However, this opens the risk of eavesdropping as
-described in the file upload section.
-Another CGI script author could peek at this data during the
-upload, even if it is confidential information. On Unix systems,
-the -private_tempfiles pragma will cause the temporary file to be unlinked as soon
-as it is opened and before any data is written into it,
-eliminating the risk of eavesdropping.
+CGI.pm can process uploaded file. Ordinarily it spools the uploaded
+file to a temporary directory, then deletes the file when done.
+However, this opens the risk of eavesdropping as described in the file
+upload section. Another CGI script author could peek at this data
+during the upload, even if it is confidential information. On Unix
+systems, the -private_tempfiles pragma will cause the temporary file
+to be unlinked as soon as it is opened and before any data is written
+into it, reducing, but not eliminating the risk of eavesdropping
+(there is still a potential race condition). To make life harder for
+the attacker, the program chooses tempfile names by calculating a 32
+bit checksum of the incoming HTTP headers.
+
+To ensure that the temporary file cannot be read by other CGI scripts,
+use suEXEC or a CGI wrapper program to run your script. The temporary
+file is created with mode 0600 (neither world nor group readable).
+
+The temporary directory is selected using the following algorithm:
+
+ 1. if the current user (e.g. "nobody") has a directory named
+ "tmp" in its home directory, use that (Unix systems only).
+
+ 2. if the environment variable TMPDIR exists, use the location
+ indicated.
+
+ 3. Otherwise try the locations /usr/tmp, /var/tmp, C:\temp,
+ /tmp, /temp, ::Temporary Items, and \WWW_ROOT.
+
+Each of these locations is checked that it is a directory and is
+writable. If not, the algorithm tries the next choice.
=back
@@ -4135,17 +4322,17 @@ You can place other arbitrary HTML elements to the <HEAD> section with the
B<-head> tag. For example, to place the rarely-used <LINK> element in the
head section, use this:
- print $q->start_html(-head=>Link({-rel=>'next',
- -href=>'http://www.capricorn.com/s2.html'}));
+ print start_html(-head=>Link({-rel=>'next',
+ -href=>'http://www.capricorn.com/s2.html'}));
To incorporate multiple HTML elements into the <HEAD> section, just pass an
array reference:
- print $q->start_html(-head=>[
- Link({-rel=>'next',
- -href=>'http://www.capricorn.com/s2.html'}),
- Link({-rel=>'previous',
- -href=>'http://www.capricorn.com/s1.html'})
+ print start_html(-head=>[
+ Link({-rel=>'next',
+ -href=>'http://www.capricorn.com/s2.html'}),
+ Link({-rel=>'previous',
+ -href=>'http://www.capricorn.com/s1.html'})
]
);
@@ -4205,8 +4392,8 @@ one or more of -language, -src, or -code:
);
print $q->(-title=>'The Riddle of the Sphinx',
- -script=>{-language=>'PERLSCRIPT'},
- -code=>'print "hello world!\n;"'
+ -script=>{-language=>'PERLSCRIPT',
+ -code=>'print "hello world!\n;"'}
);
@@ -4215,19 +4402,19 @@ header. Just pass the list of script sections as an array reference.
this allows you to specify different source files for different dialects
of JavaScript. Example:
- print $q-&gt;start_html(-title=&gt;'The Riddle of the Sphinx',
- -script=&gt;[
- { -language =&gt; 'JavaScript1.0',
- -src =&gt; '/javascript/utilities10.js'
+ print $q->start_html(-title=>'The Riddle of the Sphinx',
+ -script=>[
+ { -language => 'JavaScript1.0',
+ -src => '/javascript/utilities10.js'
},
- { -language =&gt; 'JavaScript1.1',
- -src =&gt; '/javascript/utilities11.js'
+ { -language => 'JavaScript1.1',
+ -src => '/javascript/utilities11.js'
},
- { -language =&gt; 'JavaScript1.2',
- -src =&gt; '/javascript/utilities12.js'
+ { -language => 'JavaScript1.2',
+ -src => '/javascript/utilities12.js'
},
- { -language =&gt; 'JavaScript28.2',
- -src =&gt; '/javascript/utilities219.js'
+ { -language => 'JavaScript28.2',
+ -src => '/javascript/utilities219.js'
}
]
);
@@ -4382,7 +4569,7 @@ This example shows how to use the HTML methods:
print $q->blockquote(
"Many years ago on the island of",
$q->a({href=>"http://crete.org/"},"Crete"),
- "there lived a minotaur named",
+ "there lived a Minotaur named",
$q->strong("Fred."),
),
$q->hr;
@@ -4429,7 +4616,7 @@ and values of the associative array become the HTML tag's attributes:
"Open a new frame");
<A HREF="fred.html",TARGET="_new">Open a new frame</A>
-
+
You may dispense with the dashes in front of the attribute names if
you prefer:
@@ -4447,7 +4634,7 @@ Prior to CGI.pm version 2.41, providing an empty ('') string as an
attribute argument was the same as providing undef. However, this has
changed in order to accommodate those who want to create tags of the form
<IMG ALT="">. The difference is shown in these two pieces of code:
-
+
CODE RESULT
img({alt=>undef}) <IMG ALT>
img({alt=>''}) <IMT ALT="">
@@ -4581,7 +4768,7 @@ autoEscape() method with a false value immediately after creating the CGI object
$query = new CGI;
$query->autoEscape(undef);
-
+
=head2 CREATING AN ISINDEX TAG
@@ -4611,7 +4798,7 @@ default is to process the query with the current script.
startform() will return a <FORM> tag with the optional method,
action and form encoding that you specify. The defaults are:
-
+
method: POST
action: this script
enctype: application/x-www-form-urlencoded
@@ -4820,23 +5007,16 @@ field will accept (-maxlength).
=back
When the form is processed, you can retrieve the entered filename
-by calling param().
+by calling param():
$filename = $query->param('uploaded_file');
-In Netscape Navigator 2.0, the filename that gets returned is the full
-local filename on the B<remote user's> machine. If the remote user is
-on a Unix machine, the filename will follow Unix conventions:
-
- /path/to/the/file
-
-On an MS-DOS/Windows and OS/2 machines, the filename will follow DOS conventions:
-
- C:\PATH\TO\THE\FILE.MSW
-
-On a Macintosh machine, the filename will follow Mac conventions:
-
- HD 40:Desktop Folder:Sort Through:Reminders
+Different browsers will return slightly different things for the
+name. Some browsers return the filename only. Others return the full
+path to the file, using the path conventions of the user's machine.
+Regardless, the name returned is always the name of the file on the
+I<user's> machine, and is unrelated to the name of the temporary file
+that CGI.pm creates during upload spooling (see below).
The filename returned is also a file handle. You can read the contents
of the file using standard Perl file reading calls:
@@ -4852,6 +5032,25 @@ of the file using standard Perl file reading calls:
print OUTFILE $buffer;
}
+However, there are problems with the dual nature of the upload fields.
+If you C<use strict>, then Perl will complain when you try to use a
+string as a filehandle. You can get around this by placing the file
+reading code in a block containing the C<no strict> pragma. More
+seriously, it is possible for the remote user to type garbage into the
+upload field, in which case what you get from param() is not a
+filehandle at all, but a string.
+
+To be safe, use the I<upload()> function (new in version 2.47). When
+called with the name of an upload field, I<upload()> returns a
+filehandle, or undef if the parameter is not a valid filehandle.
+
+ $fh = $query->upload('uploaded_file');
+ while (<$fh>) {
+ print;
+ }
+
+This is the recommended idiom.
+
When a file is uploaded the browser usually sends along some
information along with it in the format of headers. The information
usually includes the MIME content type. Future browsers may send
@@ -4867,7 +5066,25 @@ an associative array containing all the document headers.
If you are using a machine that recognizes "text" and "binary" data
modes, be sure to understand when and how to use them (see the Camel book).
-Otherwise you may find that binary files are corrupted during file uploads.
+Otherwise you may find that binary files are corrupted during file
+uploads.
+
+There are occasionally problems involving parsing the uploaded file.
+This usually happens when the user presses "Stop" before the upload is
+finished. In this case, CGI.pm will return undef for the name of the
+uploaded file and set I<cgi_error()> to the string "400 Bad request
+(malformed multipart POST)". This error message is designed so that
+you can incorporate it into a status code to be sent to the browser.
+Example:
+
+ $file = $query->upload('uploaded_file');
+ if (!$file && $query->cgi_error) {
+ print $query->header(-status=>$query->cgi_error);
+ exit 0;
+ }
+
+You are free to create a custom HTML page to complain about the error,
+if you wish.
JAVASCRIPTING: The B<-onChange>, B<-onFocus>, B<-onBlur>,
B<-onMouseOver>, B<-onMouseOut> and B<-onSelect> parameters are
@@ -5025,7 +5242,7 @@ handlers are called.
print $query->checkbox_group(-name=>'group_name',
-values=>['eenie','meenie','minie','moe'],
-rows=2,-columns=>2);
-
+
checkbox_group() creates a list of checkboxes that are related
by the same name.
@@ -5563,7 +5780,7 @@ documentation in Netscape's home pages for details
=item 2. Specify the destination for the document in the HTTP header
You may provide a B<-target> parameter to the header() method:
-
+
print $q->header(-target=>'ResultsWindow');
This will tell the browser to load the output of your script into the
@@ -5700,7 +5917,7 @@ name/value pairs formatted nicely as a nested list. This is useful
for debugging purposes:
print $query->dump
-
+
Produces something that looks like:
@@ -5838,6 +6055,32 @@ Newer browsers do not report the user name for privacy reasons!
Returns the method used to access your script, usually
one of 'POST', 'GET' or 'HEAD'.
+=item B<content_type()>
+
+Returns the content_type of data submitted in a POST, generally
+multipart/form-data or application/x-www-form-urlencoded
+
+=item B<http()>
+
+Called with no arguments returns the list of HTTP environment
+variables, including such things as HTTP_USER_AGENT,
+HTTP_ACCEPT_LANGUAGE, and HTTP_ACCEPT_CHARSET, corresponding to the
+like-named HTTP header fields in the request. Called with the name of
+an HTTP header field, returns its value. Capitalization and the use
+of hyphens versus underscores are not significant.
+
+For example, all three of these examples are equivalent:
+
+ $requested_language = $q->http('Accept-language');
+ $requested_language = $q->http('Accept_language');
+ $requested_language = $q->http('HTTP_ACCEPT_LANGUAGE');
+
+=item B<https()>
+
+The same as I<http()>, but operates on the HTTPS environment variables
+present when the SSL protocol is in effect. Can be used to determine
+whether SSL is turned on.
+
=back
=head1 USING NPH SCRIPTS
@@ -5919,7 +6162,7 @@ a second, and begins again.
=over 4
=item multipart_init()
-
+
multipart_init(-boundary=>$boundary);
Initialize the multipart system. The -boundary argument specifies
@@ -6014,18 +6257,31 @@ initialize_globals().
=back
-Since an attempt to send a POST larger than $POST_MAX bytes
-will cause a fatal error, you might want to use CGI::Carp to echo the
-fatal error message to the browser window as shown in the example
-above. Otherwise the remote user will see only a generic "Internal
-Server" error message. See the L<CGI::Carp> manual page for more
-details.
+An attempt to send a POST larger than $POST_MAX bytes will cause
+I<param()> to return an empty CGI parameter list. You can test for
+this event by checking I<cgi_error()>, either after you create the CGI
+object or, if you are using the function-oriented interface, call
+<param()> for the first time. If the POST was intercepted, then
+cgi_error() will return the message "413 POST too large".
+
+This error message is actually defined by the HTTP protocol, and is
+designed to be returned to the browser as the CGI script's status
+ code. For example:
+
+ $uploaded_file = param('upload');
+ if (!$uploaded_file && cgi_error()) {
+ print header(-status=>cgi_error());
+ exit 0;
+ }
+
+However it isn't clear that any browser currently knows what to do
+with this status code. It might be better just to create an
+HTML page that warns the user of the problem.
=head1 COMPATIBILITY WITH CGI-LIB.PL
-To make it easier to port existing programs that use cgi-lib.pl
-the compatibility routine "ReadParse" is provided. Porting is
-simple:
+To make it easier to port existing programs that use cgi-lib.pl the
+compatibility routine "ReadParse" is provided. Porting is simple:
OLD VERSION
require "cgi-lib.pl";
@@ -6123,9 +6379,9 @@ for suggestions and bug fixes.
#!/usr/local/bin/perl
-
+
use CGI;
-
+
$query = new CGI;
print $query->header;
@@ -6135,35 +6391,35 @@ for suggestions and bug fixes.
&do_work($query);
&print_tail;
print $query->end_html;
-
+
sub print_prompt {
my($query) = @_;
-
+
print $query->startform;
print "<EM>What's your name?</EM><BR>";
print $query->textfield('name');
print $query->checkbox('Not my real name');
-
+
print "<P><EM>Where can you find English Sparrows?</EM><BR>";
print $query->checkbox_group(
-name=>'Sparrow locations',
-values=>[England,France,Spain,Asia,Hoboken],
-linebreak=>'yes',
-defaults=>[England,Asia]);
-
+
print "<P><EM>How far can they fly?</EM><BR>",
$query->radio_group(
-name=>'how far',
-values=>['10 ft','1 mile','10 miles','real far'],
-default=>'1 mile');
-
+
print "<P><EM>What's your favorite color?</EM> ";
print $query->popup_menu(-name=>'Color',
-values=>['black','brown','red','yellow'],
-default=>'red');
-
+
print $query->hidden('Reference','Monty Python and the Holy Grail');
-
+
print "<P><EM>What have you got there?</EM><BR>";
print $query->scrolling_list(
-name=>'possessions',
@@ -6171,19 +6427,19 @@ for suggestions and bug fixes.
'A Sword','A Ticket'],
-size=>5,
-multiple=>'true');
-
+
print "<P><EM>Any parting comments?</EM><BR>";
print $query->textarea(-name=>'Comments',
-rows=>10,
-columns=>50);
-
- print "<P>",$query->Reset;
+
+ print "<P>",$query->reset;
print $query->submit('Action','Shout');
print $query->submit('Action','Scream');
print $query->endform;
print "<HR>\n";
}
-
+
sub do_work {
my($query) = @_;
my(@values,$key);
@@ -6196,7 +6452,7 @@ for suggestions and bug fixes.
print join(", ",@values),"<BR>\n";
}
}
-
+
sub print_tail {
print <<END;
<HR>
diff --git a/contrib/perl5/lib/CGI/Apache.pm b/contrib/perl5/lib/CGI/Apache.pm
index 82a3669..dced866 100644
--- a/contrib/perl5/lib/CGI/Apache.pm
+++ b/contrib/perl5/lib/CGI/Apache.pm
@@ -1,103 +1,23 @@
-package CGI::Apache;
-use Apache ();
-use vars qw(@ISA $VERSION);
-require CGI;
-@ISA = qw(CGI);
-
-$VERSION = (qw$Revision: 1.1 $)[1];
-$CGI::DefaultClass = 'CGI::Apache';
-$CGI::Apache::AutoloadClass = 'CGI';
-
-sub import {
- my $self = shift;
- my ($callpack, $callfile, $callline) = caller;
- ${"${callpack}::AutoloadClass"} = 'CGI';
-}
-
-sub new {
- my($class) = shift;
- my($r) = Apache->request;
- %ENV = $r->cgi_env unless defined $ENV{GATEWAY_INTERFACE}; #PerlSetupEnv On
- my $self = $class->SUPER::new(@_);
- $self->{'.req'} = $r;
- $self;
-}
-
-sub header {
- my ($self,@rest) = CGI::self_or_default(@_);
- my $r = $self->{'.req'};
- $r->basic_http_header;
- return CGI::header($self,@rest);
-}
-
-sub print {
- my($self,@rest) = CGI::self_or_default(@_);
- $self->{'.req'}->print(@rest);
-}
-
-sub read_from_client {
- my($self, $fh, $buff, $len, $offset) = @_;
- my $r = $self->{'.req'} || Apache->request;
- return $r->read($$buff, $len, $offset);
-}
-
-sub new_MultipartBuffer {
- my $self = shift;
- my $new = CGI::Apache::MultipartBuffer->new($self, @_);
- $new->{'.req'} = $self->{'.req'} || Apache->request;
- return $new;
-}
-
-package CGI::Apache::MultipartBuffer;
-use vars qw(@ISA);
-@ISA = qw(MultipartBuffer);
-
-$CGI::Apache::MultipartBuffer::AutoloadClass = 'MultipartBuffer';
-*CGI::Apache::MultipartBuffer::read_from_client =
- \&CGI::Apache::read_from_client;
-
-
+use CGI;
1;
-
__END__
=head1 NAME
-CGI::Apache - Make things work with CGI.pm against Perl-Apache API
+CGI::Apache - Backward compatibility module for CGI.pm
=head1 SYNOPSIS
- require CGI::Apache;
-
- my $q = new Apache::CGI;
+Do not use this module. It is deprecated.
- $q->print($q->header);
-
- #do things just like you do with CGI.pm
+=head1 ABSTRACT
=head1 DESCRIPTION
-When using the Perl-Apache API, your applications are faster, but the
-environment is different than CGI.
-This module attempts to set-up that environment as best it can.
-
-=head1 NOTE 1
+=head1 AUTHOR INFORMATION
-This module used to be named Apache::CGI. Sorry for the confusion.
-
-=head1 NOTE 2
-
-If you're going to inherit from this class, make sure to "use" it
-after your package declaration rather than "require" it. This is
-because CGI.pm does a little magic during the import() step in order
-to make autoloading work correctly.
+=head1 BUGS
=head1 SEE ALSO
-perl(1), Apache(3), CGI(3)
-
-=head1 AUTHOR
-
-Doug MacEachern E<lt>dougm@osf.orgE<gt>, hacked over by Andreas KE<ouml>nig E<lt>a.koenig@mind.deE<gt>, modified by Lincoln Stein <lt>lstein@genome.wi.mit.edu<gt>
-
=cut
diff --git a/contrib/perl5/lib/CGI/Carp.pm b/contrib/perl5/lib/CGI/Carp.pm
index dfae1a6..90e9552 100644
--- a/contrib/perl5/lib/CGI/Carp.pm
+++ b/contrib/perl5/lib/CGI/Carp.pm
@@ -192,9 +192,16 @@ use Carp;
@EXPORT = qw(confess croak carp);
@EXPORT_OK = qw(carpout fatalsToBrowser wrap set_message cluck);
+BEGIN {
+ $] >= 5.005
+ ? eval q#sub ineval { $^S }#
+ : eval q#sub ineval { _longmess() =~ /eval [\{\']/m }#;
+ $@ and die;
+}
+
$main::SIG{__WARN__}=\&CGI::Carp::warn;
$main::SIG{__DIE__}=\&CGI::Carp::die;
-$CGI::Carp::VERSION = '1.13';
+$CGI::Carp::VERSION = '1.14';
$CGI::Carp::CUSTOM_MSG = undef;
# fancy import routine detects and handles 'errorWrap' specially.
@@ -216,7 +223,7 @@ sub realdie { CORE::die(@_); }
sub id {
my $level = shift;
my($pack,$file,$line,$sub) = caller($level);
- my($id) = $file=~m|([^/]+)$|;
+ my($id) = $file=~m|([^/]+)\z|;
return ($file,$line,$id);
}
@@ -228,7 +235,7 @@ sub stamp {
$id = $file;
($pack,$file) = caller($frame++);
} until !$file;
- ($id) = $id=~m|([^/]+)$|;
+ ($id) = $id=~m|([^/]+)\z|;
return "[$time] $id: ";
}
@@ -251,14 +258,15 @@ sub _longmess {
}
sub die {
- my $message = shift;
- my $time = scalar(localtime);
- my($file,$line,$id) = id(1);
- $message .= " at $file line $line." unless $message=~/\n$/;
- &fatalsToBrowser($message) if $WRAP && _longmess() !~ /eval [{\']/m;
- my $stamp = stamp;
- $message=~s/^/$stamp/gm;
- realdie $message;
+ realdie @_ if ineval;
+ my $message = shift;
+ my $time = scalar(localtime);
+ my($file,$line,$id) = id(1);
+ $message .= " at $file line $line." unless $message=~/\n$/;
+ &fatalsToBrowser($message) if $WRAP;
+ my $stamp = stamp;
+ $message=~s/^/$stamp/gm;
+ realdie $message;
}
sub set_message {
diff --git a/contrib/perl5/lib/CGI/Cookie.pm b/contrib/perl5/lib/CGI/Cookie.pm
index 204d67b..bd3c3d8 100644
--- a/contrib/perl5/lib/CGI/Cookie.pm
+++ b/contrib/perl5/lib/CGI/Cookie.pm
@@ -7,19 +7,15 @@ package CGI::Cookie;
# documentation in manual or html file format (these utilities are part of the
# Perl 5 distribution).
-# Copyright 1995,1996, Lincoln D. Stein. All rights reserved.
+# Copyright 1995-1999, Lincoln D. Stein. All rights reserved.
# It may be used and modified freely, but I do request that this copyright
# notice remain attached to the file. You may modify this module as you
# wish, but if you redistribute a modified version, please attach a note
# listing the modifications you have made.
-# The most recent version and complete docs are available at:
-# http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
-# ftp://ftp-genome.wi.mit.edu/pub/software/WWW/
+$CGI::Cookie::VERSION='1.12';
-$CGI::Cookie::VERSION='1.06';
-
-use CGI;
+use CGI qw(-no_debug);
use overload '""' => \&as_string,
'cmp' => \&compare,
'fallback'=>1;
@@ -100,10 +96,13 @@ sub new {
'value'=>[@values],
},$class;
- # IE requires the path to be present for some reason.
- ($path = $ENV{'SCRIPT_NAME'})=~s![^/]+$!! unless $path;
+ # IE requires the path and domain to be present for some reason.
+ $path = CGI::url(-absolute=>1) unless defined $path;
+# however, this breaks networks which use host tables without fully qualified
+# names, so we comment it out.
+# $domain = CGI::virtual_host() unless defined $domain;
- $self->path($path) if defined $path;
+ $self->path($path) if defined $path;
$self->domain($domain) if defined $domain;
$self->secure($secure) if defined $secure;
$self->expires($expires) if defined $expires;
@@ -251,10 +250,10 @@ cookie originated from.
If you provide a cookie path attribute, the browser will check it
against your script's URL before returning the cookie. For example,
if you specify the path "/cgi-bin", then the cookie will be returned
-to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl",
-and "/cgi-bin/customer_service/complain.pl", but not to the script
-"/cgi-private/site_admin.pl". By default, path is set to "/", which
-causes the cookie to be sent to any CGI script on your site.
+to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl", and
+"/cgi-bin/customer_service/complain.pl", but not to the script
+"/cgi-private/site_admin.pl". By default, the path is set to your
+script, so that only it will receive the cookie.
=item B<4. secure flag>
@@ -344,7 +343,7 @@ can iterate through the cookies this way:
In a scalar context, fetch() returns a hash reference, which may be more
efficient if you are manipulating multiple cookies.
-
+
CGI.pm uses the URL escaping methods to save and restore reserved characters
in its cookies. If you are trying to retrieve a cookie set by a foreign server,
this escaping method may trip you up. Use raw_fetch() instead, which has the
@@ -415,5 +414,5 @@ This section intentionally left blank.
=head1 SEE ALSO
L<CGI::Carp>, L<CGI>
-
+
=cut
diff --git a/contrib/perl5/lib/CGI/Fast.pm b/contrib/perl5/lib/CGI/Fast.pm
index a39fe05..b485186 100644
--- a/contrib/perl5/lib/CGI/Fast.pm
+++ b/contrib/perl5/lib/CGI/Fast.pm
@@ -16,7 +16,7 @@ package CGI::Fast;
# The most recent version and complete docs are available at:
# http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
# ftp://ftp-genome.wi.mit.edu/pub/software/WWW/
-$CGI::Fast::VERSION='1.01';
+$CGI::Fast::VERSION='1.02';
use CGI;
use FCGI;
@@ -170,5 +170,5 @@ This section intentionally left blank.
=head1 SEE ALSO
L<CGI::Carp>, L<CGI>
-
+
=cut
diff --git a/contrib/perl5/lib/CGI/Pretty.pm b/contrib/perl5/lib/CGI/Pretty.pm
new file mode 100644
index 0000000..4f2eed4
--- /dev/null
+++ b/contrib/perl5/lib/CGI/Pretty.pm
@@ -0,0 +1,236 @@
+package CGI::Pretty;
+
+# See the bottom of this file for the POD documentation. Search for the
+# string '=head'.
+
+# You can run this file through either pod2man or pod2html to produce pretty
+# documentation in manual or html file format (these utilities are part of the
+# Perl 5 distribution).
+
+use strict;
+use CGI ();
+
+$CGI::Pretty::VERSION = '1.03';
+$CGI::DefaultClass = __PACKAGE__;
+$CGI::Pretty::AutoloadClass = 'CGI';
+@CGI::Pretty::ISA = qw( CGI );
+
+initialize_globals();
+
+sub _prettyPrint {
+ my $input = shift;
+
+ foreach my $i ( @CGI::Pretty::AS_IS ) {
+ if ( $$input =~ /<\/$i>/si ) {
+ my ( $a, $b, $c, $d, $e ) = $$input =~ /(.*)<$i(\s?)(.*?)>(.*?)<\/$i>(.*)/si;
+ _prettyPrint( \$a );
+ _prettyPrint( \$e );
+
+ $$input = "$a<$i$b$c>$d</$i>$e";
+ return;
+ }
+ }
+ $$input =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g;
+}
+
+sub comment {
+ my($self,@p) = CGI::self_or_CGI(@_);
+
+ my $s = "@p";
+ $s =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g;
+
+ return $self->SUPER::comment( "$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT$s$CGI::Pretty::LINEBREAK" ) . $CGI::Pretty::LINEBREAK;
+}
+
+sub _make_tag_func {
+ my ($self,$tagname) = @_;
+ return $self->SUPER::_make_tag_func($tagname) if $tagname=~/^(start|end)_/;
+
+ # As Lincoln as noted, the last else clause is VERY hairy, and it
+ # took me a while to figure out what I was trying to do.
+ # What it does is look for tags that shouldn't be indented (e.g. PRE)
+ # and makes sure that when we nest tags, those tags don't get
+ # indented.
+ # For an example, try print td( pre( "hello\nworld" ) );
+ # If we didn't care about stuff like that, the code would be
+ # MUCH simpler. BTW: I won't claim to be a regular expression
+ # guru, so if anybody wants to contribute something that would
+ # be quicker, easier to read, etc, I would be more than
+ # willing to put it in - Brian
+
+ return qq{
+ sub $tagname {
+ # handle various cases in which we're called
+ # most of this bizarre stuff is to avoid -w errors
+ shift if \$_[0] &&
+ (!ref(\$_[0]) && \$_[0] eq \$CGI::DefaultClass) ||
+ (ref(\$_[0]) &&
+ (substr(ref(\$_[0]),0,3) eq 'CGI' ||
+ UNIVERSAL::isa(\$_[0],'CGI')));
+
+ my(\$attr) = '';
+ if (ref(\$_[0]) && ref(\$_[0]) eq 'HASH') {
+ my(\@attr) = make_attributes('',shift);
+ \$attr = " \@attr" if \@attr;
+ }
+
+ my(\$tag,\$untag) = ("\U<$tagname\E\$attr>","\U</$tagname>\E");
+ return \$tag unless \@_;
+
+ my \@result;
+ my \$NON_PRETTIFY_ENDTAGS = join "", map { "</\$_>" } \@CGI::Pretty::AS_IS;
+
+ if ( \$NON_PRETTIFY_ENDTAGS =~ /\$untag/ ) {
+ \@result = map { "\$tag\$_\$untag\$CGI::Pretty::LINEBREAK" }
+ (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_";
+ }
+ else {
+ \@result = map {
+ chomp;
+ if ( \$_ !~ /<\\// ) {
+ s/\$CGI::Pretty::LINEBREAK/\$CGI::Pretty::LINEBREAK\$CGI::Pretty::INDENT/g;
+ }
+ else {
+ my \$tmp = \$_;
+ CGI::Pretty::_prettyPrint( \\\$tmp );
+ \$_ = \$tmp;
+ }
+ "\$tag\$CGI::Pretty::LINEBREAK\$CGI::Pretty::INDENT\$_\$CGI::Pretty::LINEBREAK\$untag\$CGI::Pretty::LINEBREAK" }
+ (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_";
+ }
+ local \$" = "";
+ return "\@result";
+ }
+ };
+}
+
+sub start_html {
+ return CGI::start_html( @_ ) . $CGI::Pretty::LINEBREAK;
+}
+
+sub end_html {
+ return CGI::end_html( @_ ) . $CGI::Pretty::LINEBREAK;
+}
+
+sub new {
+ my $class = shift;
+ my $this = $class->SUPER::new( @_ );
+
+ Apache->request->register_cleanup(\&CGI::Pretty::_reset_globals) if ($CGI::MOD_PERL);
+ $class->_reset_globals if $CGI::PERLEX;
+
+ return bless $this, $class;
+}
+
+sub initialize_globals {
+ # This is the string used for indentation of tags
+ $CGI::Pretty::INDENT = "\t";
+
+ # This is the string used for seperation between tags
+ $CGI::Pretty::LINEBREAK = "\n";
+
+ # These tags are not prettify'd.
+ @CGI::Pretty::AS_IS = qw( A PRE CODE SCRIPT TEXTAREA );
+
+ 1;
+}
+sub _reset_globals { initialize_globals(); }
+
+1;
+
+=head1 NAME
+
+CGI::Pretty - module to produce nicely formatted HTML code
+
+=head1 SYNOPSIS
+
+ use CGI::Pretty qw( :html3 );
+
+ # Print a table with a single data element
+ print table( TR( td( "foo" ) ) );
+
+=head1 DESCRIPTION
+
+CGI::Pretty is a module that derives from CGI. It's sole function is to
+allow users of CGI to output nicely formatted HTML code.
+
+When using the CGI module, the following code:
+ print table( TR( td( "foo" ) ) );
+
+produces the following output:
+ <TABLE><TR><TD>foo</TD></TR></TABLE>
+
+If a user were to create a table consisting of many rows and many columns,
+the resultant HTML code would be quite difficult to read since it has no
+carriage returns or indentation.
+
+CGI::Pretty fixes this problem. What it does is add a carriage
+return and indentation to the HTML code so that one can easily read
+it.
+
+ print table( TR( td( "foo" ) ) );
+
+now produces the following output:
+ <TABLE>
+ <TR>
+ <TD>
+ foo
+ </TD>
+ </TR>
+ </TABLE>
+
+
+=head2 Tags that won't be formatted
+
+The <A> and <PRE> tags are not formatted. If these tags were formatted, the
+user would see the extra indentation on the web browser causing the page to
+look different than what would be expected. If you wish to add more tags to
+the list of tags that are not to be touched, push them onto the C<@AS_IS> array:
+
+ push @CGI::Pretty::AS_IS,qw(CODE XMP);
+
+=head2 Customizing the Indenting
+
+If you wish to have your own personal style of indenting, you can change the
+C<$INDENT> variable:
+
+ $CGI::Pretty::INDENT = "\t\t";
+
+would cause the indents to be two tabs.
+
+Similarly, if you wish to have more space between lines, you may change the
+C<$LINEBREAK> variable:
+
+ $CGI::Pretty::LINEBREAK = "\n\n";
+
+would create two carriage returns between lines.
+
+If you decide you want to use the regular CGI indenting, you can easily do
+the following:
+
+ $CGI::Pretty::INDENT = $CGI::Pretty::LINEBREAK = "";
+
+=head1 BUGS
+
+This section intentionally left blank.
+
+=head1 AUTHOR
+
+Brian Paulsen <Brian@ThePaulsens.com>, with minor modifications by
+Lincoln Stein <lstein@cshl.org> for incorporation into the CGI.pm
+distribution.
+
+Copyright 1999, Brian Paulsen. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Bug reports and comments to Brian@ThePaulsens.com. You can also write
+to lstein@cshl.org, but this code looks pretty hairy to me and I'm not
+sure I understand it!
+
+=head1 SEE ALSO
+
+L<CGI>
+
+=cut
diff --git a/contrib/perl5/lib/CGI/Push.pm b/contrib/perl5/lib/CGI/Push.pm
index e4a66ae..80683a2 100644
--- a/contrib/perl5/lib/CGI/Push.pm
+++ b/contrib/perl5/lib/CGI/Push.pm
@@ -257,7 +257,7 @@ as shown below:
h1('testing'),
"This page called $counter times";
}
-
+
sub my_last_page {
header(-refresh=>'5; URL=http://somewhere.else/finished.html',
-type=>'text/html'),
diff --git a/contrib/perl5/lib/CGI/Switch.pm b/contrib/perl5/lib/CGI/Switch.pm
index 8afc6a6..b16b9c0 100644
--- a/contrib/perl5/lib/CGI/Switch.pm
+++ b/contrib/perl5/lib/CGI/Switch.pm
@@ -1,71 +1,24 @@
-package CGI::Switch;
-use Carp;
-use strict;
-use vars qw($VERSION @Pref);
-$VERSION = '0.06';
-@Pref = qw(CGI::Apache CGI); #default
-
-sub import {
- my($self,@arg) = @_;
- @Pref = @arg if @arg;
-}
-
-sub new {
- shift;
- my($file,$pack);
- for $pack (@Pref) {
- ($file = $pack) =~ s|::|/|g;
- eval { require "$file.pm"; };
- if ($@) {
-#XXX warn $@;
- next;
- } else {
-#XXX warn "Going to try $pack\->new\n";
- my $obj;
- eval {$obj = $pack->new(@_)};
- if ($@) {
-#XXX warn $@;
- } else {
- return $obj;
- }
- }
- }
- Carp::croak "Couldn't load+construct any of @Pref\n";
-}
-
+use CGI;
1;
+
__END__
=head1 NAME
-CGI::Switch - Try more than one constructors and return the first object available
+CGI::Switch - Backward compatibility module for defunct CGI::Switch
=head1 SYNOPSIS
-
- use CGISwitch;
-
- -or-
+Do not use this module. It is deprecated.
- use CGI::Switch This, That, CGI::XA, Foo, Bar, CGI;
-
- my $q = new CGI::Switch;
+=head1 ABSTRACT
=head1 DESCRIPTION
-Per default the new() method tries to call new() in the three packages
-Apache::CGI, CGI::XA, and CGI. It returns the first CGI object it
-succeeds with.
+=head1 AUTHOR INFORMATION
-The import method allows you to set up the default order of the
-modules to be tested.
+=head1 BUGS
=head1 SEE ALSO
-perl(1), Apache(3), CGI(3), CGI::XA(3)
-
-=head1 AUTHOR
-
-Andreas KE<ouml>nig E<lt>a.koenig@mind.deE<gt>
-
=cut
diff --git a/contrib/perl5/lib/CPAN.pm b/contrib/perl5/lib/CPAN.pm
index 2276943..84dfd31 100644
--- a/contrib/perl5/lib/CPAN.pm
+++ b/contrib/perl5/lib/CPAN.pm
@@ -6,13 +6,13 @@ use vars qw{$Try_autoload
$Frontend $Defaultsite
}; #};
-$VERSION = '1.48';
+$VERSION = '1.52';
-# $Id: CPAN.pm,v 1.260 1999/03/06 19:31:02 k Exp $
+# $Id: CPAN.pm,v 1.276 2000/01/08 15:29:46 k Exp $
# only used during development:
$Revision = "";
-# $Revision = "[".substr(q$Revision: 1.260 $, 10)."]";
+# $Revision = "[".substr(q$Revision: 1.276 $, 10)."]";
use Carp ();
use Config ();
@@ -61,7 +61,7 @@ use strict qw(vars);
@CPAN::ISA = qw(CPAN::Debug Exporter);
@EXPORT = qw(
- autobundle bundle expand force get
+ autobundle bundle expand force get cvs_import
install make readme recompile shell test clean
);
@@ -90,7 +90,7 @@ sub AUTOLOAD {
#-> sub CPAN::shell ;
sub shell {
my($self) = @_;
- $Suppress_readline ||= ! -t STDIN;
+ $Suppress_readline = ! -t STDIN unless defined $Suppress_readline;
CPAN::Config->load unless $CPAN::Config_loaded++;
my $prompt = "cpan> ";
@@ -113,6 +113,12 @@ sub shell {
$readline::rl_completion_function =
$readline::rl_completion_function = 'CPAN::Complete::cpl';
}
+ # $term->OUT is autoflushed anyway
+ my $odef = select STDERR;
+ $| = 1;
+ select STDOUT;
+ $| = 1;
+ select $odef;
}
no strict;
@@ -120,7 +126,8 @@ sub shell {
my $getcwd;
$getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
my $cwd = CPAN->$getcwd();
- my $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub";
+ my $try_detect_readline;
+ $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub" if $term;
my $rl_avail = $Suppress_readline ? "suppressed" :
($term->ReadLine ne "Term::ReadLine::Stub") ? "enabled" :
"available (try ``install Bundle::CPAN'')";
@@ -190,7 +197,8 @@ ReadLine support $rl_avail
my $redef;
local($SIG{__WARN__}) = CPAN::Shell::dotdot_onreload(\$redef);
require Term::ReadLine;
- $CPAN::Frontend->myprint("\n$redef subroutines in Term::ReadLine redefined\n");
+ $CPAN::Frontend->myprint("\n$redef subroutines in ".
+ "Term::ReadLine redefined\n");
goto &shell;
}
}
@@ -285,7 +293,7 @@ sub try_dot_al {
$pkg =~ s|::|/|g;
if (defined($name=$INC{"$pkg.pm"}))
{
- $name =~ s|^(.*)$pkg\.pm$|$1auto/$pkg/$func.al|;
+ $name =~ s|^(.*)$pkg\.pm\z|$1auto/$pkg/$func.al|s;
$name = undef unless (-r $name);
}
unless (defined $name)
@@ -301,7 +309,7 @@ sub try_dot_al {
*$autoload = sub {};
$ok = 1;
} else {
- if ($name =~ s{(\w{12,})\.al$}{substr($1,0,11).".al"}e){
+ if ($name =~ s{(\w{12,})\.al\z}{substr($1,0,11).".al"}e){
eval {local $SIG{__DIE__};require $name};
}
if ($@){
@@ -539,7 +547,40 @@ You may want to kill it and delete the lockfile, maybe. On UNIX try:
}
}
}
- File::Path::mkpath($CPAN::Config->{cpan_home});
+ my $dotcpan = $CPAN::Config->{cpan_home};
+ eval { File::Path::mkpath($dotcpan);};
+ if ($@) {
+ # A special case at least for Jarkko.
+ my $firsterror = $@;
+ my $seconderror;
+ my $symlinkcpan;
+ if (-l $dotcpan) {
+ $symlinkcpan = readlink $dotcpan;
+ die "readlink $dotcpan failed: $!" unless defined $symlinkcpan;
+ eval { File::Path::mkpath($symlinkcpan); };
+ if ($@) {
+ $seconderror = $@;
+ } else {
+ $CPAN::Frontend->mywarn(qq{
+Working directory $symlinkcpan created.
+});
+ }
+ }
+ unless (-d $dotcpan) {
+ my $diemess = qq{
+Your configuration suggests "$dotcpan" as your
+CPAN.pm working directory. I could not create this directory due
+to this error: $firsterror\n};
+ $diemess .= qq{
+As "$dotcpan" is a symlink to "$symlinkcpan",
+I tried to create that, but I failed with this error: $seconderror
+} if $seconderror;
+ $diemess .= qq{
+Please make sure the directory exists and is writable.
+};
+ $CPAN::Frontend->mydie($diemess);
+ }
+ }
my $fh;
unless ($fh = FileHandle->new(">$lockfile")) {
if ($! =~ /Permission/) {
@@ -580,6 +621,27 @@ or
print "Caught SIGINT\n";
$Signal++;
};
+
+# From: Larry Wall <larry@wall.org>
+# Subject: Re: deprecating SIGDIE
+# To: perl5-porters@perl.org
+# Date: Thu, 30 Sep 1999 14:58:40 -0700 (PDT)
+#
+# The original intent of __DIE__ was only to allow you to substitute one
+# kind of death for another on an application-wide basis without respect
+# to whether you were in an eval or not. As a global backstop, it should
+# not be used any more lightly (or any more heavily :-) than class
+# UNIVERSAL. Any attempt to build a general exception model on it should
+# be politely squashed. Any bug that causes every eval {} to have to be
+# modified should be not so politely squashed.
+#
+# Those are my current opinions. It is also my optinion that polite
+# arguments degenerate to personal arguments far too frequently, and that
+# when they do, it's because both people wanted it to, or at least didn't
+# sufficiently want it not to.
+#
+# Larry
+
$SIG{'__DIE__'} = \&cleanup;
$self->debug("Signal handler set.") if $CPAN::DEBUG;
}
@@ -784,7 +846,7 @@ sub disk_usage {
if ($^O eq 'MacOS') {
require Mac::Files;
my $cat = Mac::Files::FSpGetCatInfo($_);
- $Du += $cat->ioFlLgLen() + $cat->ioFlRLgLen();
+ $Du += $cat->ioFlLgLen() + $cat->ioFlRLgLen() if $cat;
} else {
$Du += (-s _);
}
@@ -1103,7 +1165,8 @@ Known options:
commit commit session changes to disk
init go through a dialog to set all parameters
-You may edit key values in the follow fashion:
+You may edit key values in the follow fashion (the "o" is a literal
+letter o):
o conf build_cache 15
@@ -1149,29 +1212,29 @@ sub h {
$CPAN::Frontend->myprint("Detailed help not yet implemented\n");
} else {
$CPAN::Frontend->myprint(q{
-command arguments description
-a string authors
-b or display bundles
-d /regex/ info distributions
-m or about modules
-i none anything of above
-
-r as reinstall recommendations
-u above uninstalled distributions
-See manpage for autobundle, recompile, force, look, etc.
-
-make make
-test modules, make test (implies make)
-install dists, bundles, make install (implies test)
-clean "r" or "u" make clean
-readme display the README file
-
-reload index|cpan load most recent indices/CPAN.pm
-h or ? display this menu
-o various set and query options
-! perl-code eval a perl command
-q quit the shell subroutine
-});
+Display Information
+ a authors
+ b string display bundles
+ d or info distributions
+ m /regex/ about modules
+ i or anything of above
+ r none reinstall recommendations
+ u uninstalled distributions
+
+Download, Test, Make, Install...
+ get download
+ make make (implies get)
+ test modules, make test (implies make)
+ install dists, bundles make install (implies test)
+ clean make clean
+ look open subshell in these dists' directories
+ readme display these dists' README files
+
+Other
+ h,? display this menu ! perl-code eval a perl command
+ o conf [opt] set and query options q quit the cpan shell
+ reload cpan load CPAN.pm again reload index load newer indices
+ autobundle Snapshot force cmd unconditionally do cmd});
}
}
@@ -1190,7 +1253,7 @@ sub b {
my($entry);
for $entry ($dh->read) {
next if -d MM->catdir($bdir,$entry);
- next unless $entry =~ s/\.pm$//;
+ next unless $entry =~ s/\.pm\z//;
$CPAN::META->instance('CPAN::Bundle',"Bundle::$entry");
}
}
@@ -1293,10 +1356,13 @@ sub o {
}
}
} else {
- $CPAN::Frontend->myprint("Valid options for debug are ".
- join(", ",sort(keys %CPAN::DEBUG), 'all').
- qq{ or a number. Completion works on the options. }.
- qq{Case is ignored.\n\n});
+ my $raw = "Valid options for debug are ".
+ join(", ",sort(keys %CPAN::DEBUG), 'all').
+ qq{ or a number. Completion works on the options. }.
+ qq{Case is ignored.};
+ require Text::Wrap;
+ $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
+ $CPAN::Frontend->myprint("\n\n");
}
if ($CPAN::DEBUG) {
$CPAN::Frontend->myprint("Options set for debugging:\n");
@@ -1358,7 +1424,7 @@ index re-reads the index files\n});
sub _binary_extensions {
my($self) = shift @_;
my(@result,$module,%seen,%need,$headerdone);
- my $isaperl = q{perl5[._-]\\d{3}(_[0-4][0-9])?\\.tar[._-]gz$};
+ my $isaperl = q{perl5[._-]\\d{3}(_[0-4][0-9])?\\.tar[._-]gz\z};
for $module ($self->expand('Module','/./')) {
my $file = $module->cpan_file;
next if $file eq "N/A";
@@ -1562,21 +1628,34 @@ sub expand {
my $class = "CPAN::$type";
my $obj;
if (defined $regex) {
- for $obj ( sort {$a->id cmp $b->id} $CPAN::META->all_objects($class)) {
- push @m, $obj
- if
- $obj->id =~ /$regex/i
- or
+ for $obj (
+ sort
+ {$a->id cmp $b->id}
+ $CPAN::META->all_objects($class)
+ ) {
+ unless ($obj->id){
+ # BUG, we got an empty object somewhere
+ CPAN->debug(sprintf(
+ "Empty id on obj[%s]%%[%s]",
+ $obj,
+ join(":", %$obj)
+ )) if $CPAN::DEBUG;
+ next;
+ }
+ push @m, $obj
+ if $obj->id =~ /$regex/i
+ or
(
(
- $] < 5.00303 ### provide sort of compatibility with 5.003
+ $] < 5.00303 ### provide sort of
+ ### compatibility with 5.003
||
$obj->can('name')
)
&&
$obj->name =~ /$regex/i
);
- }
+ }
} else {
my($xarg) = $arg;
if ( $type eq 'Bundle' ) {
@@ -1670,6 +1749,15 @@ sub mydie {
die "\n";
}
+sub setup_output {
+ return if -t STDOUT;
+ my $odef = select STDERR;
+ $| = 1;
+ select STDOUT;
+ $| = 1;
+ select $odef;
+}
+
#-> sub CPAN::Shell::rematein ;
# RE-adme||MA-ke||TE-st||IN-stall
sub rematein {
@@ -1680,6 +1768,7 @@ sub rematein {
$pragma = $meth;
$meth = shift @some;
}
+ setup_output();
CPAN->debug("pragma[$pragma]meth[$meth] some[@some]") if $CPAN::DEBUG;
my($s,@s);
foreach $s (@some) {
@@ -1756,6 +1845,8 @@ sub install { shift->rematein('install',@_); }
sub clean { shift->rematein('clean',@_); }
#-> sub CPAN::Shell::look ;
sub look { shift->rematein('look',@_); }
+#-> sub CPAN::Shell::cvs_import ;
+sub cvs_import { shift->rematein('cvs_import',@_); }
package CPAN::FTP;
@@ -1932,6 +2023,9 @@ sub localize {
my $ret = $self->$method(\@host_seq,$file,$aslocal);
if ($ret) {
$Themethod = $level;
+ my $now = time;
+ # utime $now, $now, $aslocal; # too bad, if we do that, we
+ # might alter a local mirror
$self->debug("level[$level]") if $CPAN::DEBUG;
return $ret;
} else {
@@ -1985,7 +2079,7 @@ sub hosteasy {
$l =~ s|^file:||; # assume they
# meant
# file://localhost
- $l =~ s|^/|| unless -f $l; # e.g. /P:
+ $l =~ s|^/||s unless -f $l; # e.g. /P:
}
if ( -f $l && -r _) {
$Thesite = $i;
@@ -2012,8 +2106,11 @@ sub hosteasy {
my $res = $Ua->mirror($url, $aslocal);
if ($res->is_success) {
$Thesite = $i;
+ my $now = time;
+ utime $now, $now, $aslocal; # download time is more
+ # important than upload time
return $aslocal;
- } elsif ($url !~ /\.gz$/) {
+ } elsif ($url !~ /\.gz\z/) {
my $gzurl = "$url.gz";
$CPAN::Frontend->myprint("Fetching with LWP:
$gzurl
@@ -2050,7 +2147,7 @@ sub hosteasy {
$Thesite = $i;
return $aslocal;
}
- if ($aslocal !~ /\.gz$/) {
+ if ($aslocal !~ /\.gz\z/) {
my $gz = "$aslocal.gz";
$CPAN::Frontend->myprint("Fetching with Net::FTP
$url.gz
@@ -2086,8 +2183,8 @@ sub hosthard {
HOSTHARD: for $i (@$host_seq) {
my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
unless ($self->is_reachable($url)) {
- $CPAN::Frontend->myprint("Skipping $url (not reachable)\n");
- next;
+ $CPAN::Frontend->myprint("Skipping $url (not reachable)\n");
+ next;
}
$url .= "/" unless substr($url,-1) eq "/";
$url .= $file;
@@ -2097,90 +2194,107 @@ sub hosthard {
# if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
# to
if ($url =~ m|^([^:]+)://(.*?)/(.*)/(.*)|) {
- # proto not yet used
- ($proto,$host,$dir,$getfile) = ($1,$2,$3,$4);
+ # proto not yet used
+ ($proto,$host,$dir,$getfile) = ($1,$2,$3,$4);
} else {
- next HOSTHARD; # who said, we could ftp anything except ftp?
+ next HOSTHARD; # who said, we could ftp anything except ftp?
}
+
$self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG;
my($f,$funkyftp);
for $f ('lynx','ncftpget','ncftp') {
- next unless exists $CPAN::Config->{$f};
- $funkyftp = $CPAN::Config->{$f};
- next unless defined $funkyftp;
- next if $funkyftp =~ /^\s*$/;
- my($want_compressed);
- my $aslocal_uncompressed;
- ($aslocal_uncompressed = $aslocal) =~ s/\.gz//;
- my($source_switch) = "";
- $source_switch = " -source" if $funkyftp =~ /\blynx$/;
- $source_switch = " -c" if $funkyftp =~ /\bncftp$/;
- $CPAN::Frontend->myprint(
- qq[
+ next unless exists $CPAN::Config->{$f};
+ $funkyftp = $CPAN::Config->{$f};
+ next unless defined $funkyftp;
+ next if $funkyftp =~ /^\s*$/;
+ my($want_compressed);
+ my $aslocal_uncompressed;
+ ($aslocal_uncompressed = $aslocal) =~ s/\.gz//;
+ my($source_switch) = "";
+ if ($f eq "lynx"){
+ $source_switch = " -source";
+ } elsif ($f eq "ncftp"){
+ $source_switch = " -c";
+ }
+ my($chdir) = "";
+ my($stdout_redir) = " > $aslocal_uncompressed";
+ if ($f eq "ncftpget"){
+ $chdir = "cd $aslocal_dir && ";
+ $stdout_redir = "";
+ }
+ $CPAN::Frontend->myprint(
+ qq[
Trying with "$funkyftp$source_switch" to get
$url
]);
- my($system) = "$funkyftp$source_switch '$url' $devnull > ".
- "$aslocal_uncompressed";
+ my($system) =
+ "$chdir$funkyftp$source_switch '$url' $devnull$stdout_redir";
+ $self->debug("system[$system]") if $CPAN::DEBUG;
+ my($wstatus);
+ if (($wstatus = system($system)) == 0
+ &&
+ ($f eq "lynx" ?
+ -s $aslocal_uncompressed # lynx returns 0 on my
+ # system even if it fails
+ : 1
+ )
+ ) {
+ if (-s $aslocal) {
+ # Looks good
+ } elsif ($aslocal_uncompressed ne $aslocal) {
+ # test gzip integrity
+ if (
+ CPAN::Tarzip->gtest($aslocal_uncompressed)
+ ) {
+ rename $aslocal_uncompressed, $aslocal;
+ } else {
+ CPAN::Tarzip->gzip($aslocal_uncompressed,
+ "$aslocal_uncompressed.gz");
+ }
+ }
+ $Thesite = $i;
+ return $aslocal;
+ } elsif ($url !~ /\.gz\z/) {
+ unlink $aslocal_uncompressed if
+ -f $aslocal_uncompressed && -s _ == 0;
+ my $gz = "$aslocal.gz";
+ my $gzurl = "$url.gz";
+ $CPAN::Frontend->myprint(
+ qq[
+Trying with "$funkyftp$source_switch" to get
+ $url.gz
+]);
+ my($system) = "$funkyftp$source_switch '$url.gz' $devnull > ".
+ "$aslocal_uncompressed.gz";
$self->debug("system[$system]") if $CPAN::DEBUG;
my($wstatus);
if (($wstatus = system($system)) == 0
&&
- -s $aslocal_uncompressed # lynx returns 0 on my
- # system even if it fails
+ -s "$aslocal_uncompressed.gz"
) {
- if ($aslocal_uncompressed ne $aslocal) {
- # test gzip integrity
- if (
- CPAN::Tarzip->gtest($aslocal_uncompressed)
- ) {
- rename $aslocal_uncompressed, $aslocal;
- } else {
- CPAN::Tarzip->gzip($aslocal_uncompressed,
- "$aslocal_uncompressed.gz");
- }
- }
- $Thesite = $i;
- return $aslocal;
- } elsif ($url !~ /\.gz$/) {
- unlink $aslocal_uncompressed if
- -f $aslocal_uncompressed && -s _ == 0;
- my $gz = "$aslocal.gz";
- my $gzurl = "$url.gz";
- $CPAN::Frontend->myprint(
- qq[
-Trying with "$funkyftp$source_switch" to get
- $url.gz
-]);
- my($system) = "$funkyftp$source_switch '$url.gz' $devnull > ".
- "$aslocal_uncompressed.gz";
- $self->debug("system[$system]") if $CPAN::DEBUG;
- my($wstatus);
- if (($wstatus = system($system)) == 0
- &&
- -s "$aslocal_uncompressed.gz"
- ) {
- # test gzip integrity
- if (CPAN::Tarzip->gtest("$aslocal_uncompressed.gz")) {
- CPAN::Tarzip->gunzip("$aslocal_uncompressed.gz",
- $aslocal);
- } else {
- rename $aslocal_uncompressed, $aslocal;
- }
- $Thesite = $i;
- return $aslocal;
+ # test gzip integrity
+ if (CPAN::Tarzip->gtest("$aslocal_uncompressed.gz")) {
+ CPAN::Tarzip->gunzip("$aslocal_uncompressed.gz",
+ $aslocal);
} else {
- unlink "$aslocal_uncompressed.gz" if
- -f "$aslocal_uncompressed.gz";
+ rename $aslocal_uncompressed, $aslocal;
}
+ $Thesite = $i;
+ return $aslocal;
} else {
- my $estatus = $wstatus >> 8;
- my $size = -f $aslocal ? ", left\n$aslocal with size ".-s _ : "";
- $CPAN::Frontend->myprint(qq{
+ unlink "$aslocal_uncompressed.gz" if
+ -f "$aslocal_uncompressed.gz";
+ }
+ } else {
+ my $estatus = $wstatus >> 8;
+ my $size = -f $aslocal ?
+ ", left\n$aslocal with size ".-s _ :
+ "\nWarning: expected file [$aslocal] doesn't exist";
+ $CPAN::Frontend->myprint(qq{
System call "$system"
returned status $estatus (wstat $wstatus)$size
});
- }
+ }
}
}
}
@@ -2208,12 +2322,12 @@ sub hosthardest {
next;
}
my($host,$dir,$getfile) = ($1,$2,$3);
- my($netrcfile,$fh);
my $timestamp = 0;
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,
$ctime,$blksize,$blocks) = stat($aslocal);
$timestamp = $mtime ||= 0;
my($netrc) = CPAN::FTP::netrc->new;
+ my($netrcfile) = $netrc->netrc;
my($verbose) = $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG ? " -v" : "";
my $targetfile = File::Basename::basename($aslocal);
my(@dialog);
@@ -2226,7 +2340,7 @@ sub hosthardest {
"get $getfile $targetfile",
"quit"
);
- if (! $netrc->netrc) {
+ if (! $netrcfile) {
CPAN->debug("No ~/.netrc file found") if $CPAN::DEBUG;
} elsif ($netrc->hasdefault || $netrc->contains($host)) {
CPAN->debug(sprintf("hasdef[%d]cont($host)[%d]",
@@ -2463,10 +2577,10 @@ sub cpl {
/^$word/,
sort qw(
! a b d h i m o q r u autobundle clean
- make test install force reload look
+ make test install force reload look cvs_import
)
);
- } elsif ( $line !~ /^[\!abdhimorutl]/ ) {
+ } elsif ( $line !~ /^[\!abcdhimorutl]/ ) {
@return = ();
} elsif ($line =~ /^a\s/) {
@return = cplx('CPAN::Author',$word);
@@ -2474,7 +2588,7 @@ sub cpl {
@return = cplx('CPAN::Bundle',$word);
} elsif ($line =~ /^d\s/) {
@return = cplx('CPAN::Distribution',$word);
- } elsif ($line =~ /^([mru]|make|clean|test|install|readme|look)\s/ ) {
+ } elsif ($line =~ /^([mru]|make|clean|test|install|readme|look|cvs_import)\s/ ) {
@return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
} elsif ($line =~ /^i\s/) {
@return = cpl_any($word);
@@ -2552,10 +2666,15 @@ sub reload {
# XXX check if a newer one is available. (We currently read it
# from time to time)
for ($CPAN::Config->{index_expire}) {
- $_ = 0.001 unless $_ > 0.001;
+ $_ = 0.001 unless $_ && $_ > 0.001;
}
return if $last_time + $CPAN::Config->{index_expire}*86400 > $time
and ! $force;
+ ## IFF we are developing, it helps to wipe out the memory between
+ ## reloads, otherwise it is not what a user expects.
+
+ ## undef $CPAN::META; # Neue Gruendlichkeit since v1.52(r1.274)
+ ## $CPAN::META = CPAN->new;
my($debug,$t2);
$last_time = $time;
@@ -2675,7 +2794,7 @@ sub rd_modpacks {
my($mod,$version,$dist) = split;
### $version =~ s/^\+//;
- # if it is a bundle, instatiate a bundle object
+ # if it is a bundle, instantiate a bundle object
my($bundle,$id,$userid);
if ($mod eq 'CPAN' &&
@@ -2688,6 +2807,7 @@ sub rd_modpacks {
if ($version > $CPAN::VERSION){
$CPAN::Frontend->myprint(qq{
There\'s a new CPAN.pm version (v$version) available!
+ [Current version is v$CPAN::VERSION]
You might want to try
install Bundle::CPAN
reload cpan
@@ -2731,12 +2851,20 @@ sub rd_modpacks {
}
# instantiate a distribution object
- unless ($CPAN::META->exists('CPAN::Distribution',$dist)) {
- $CPAN::META->instance(
- 'CPAN::Distribution' => $dist
- )->set(
- 'CPAN_USERID' => $userid
- );
+ if ($CPAN::META->exists('CPAN::Distribution',$dist)) {
+ # we do not need CONTAINSMODS unless we do something with
+ # this dist, so we better produce it on demand.
+
+ ## my $obj = $CPAN::META->instance(
+ ## 'CPAN::Distribution' => $dist
+ ## );
+ ## $obj->{CONTAINSMODS}{$mod} = undef; # experimental
+ } else {
+ $CPAN::META->instance(
+ 'CPAN::Distribution' => $dist
+ )->set(
+ 'CPAN_USERID' => $userid
+ );
}
return if $CPAN::Signal;
@@ -2829,9 +2957,15 @@ sub as_string {
$extra .= ")";
}
if (ref($self->{$_}) eq "ARRAY") { # language interface? XXX
- push @m, sprintf " %-12s %s%s\n", $_, "@{$self->{$_}}", $extra;
+ push @m, sprintf " %-12s %s%s\n", $_, "@{$self->{$_}}", $extra;
+ } elsif (ref($self->{$_}) eq "HASH") {
+ push @m, sprintf(
+ " %-12s %s%s\n",
+ $_,
+ join(" ",keys %{$self->{$_}}),
+ $extra);
} else {
- push @m, sprintf " %-12s %s%s\n", $_, $self->{$_}, $extra;
+ push @m, sprintf " %-12s %s%s\n", $_, $self->{$_}, $extra;
}
}
join "", @m, "\n";
@@ -2843,6 +2977,12 @@ sub author {
$CPAN::META->instance(CPAN::Author,$self->{CPAN_USERID})->fullname;
}
+sub dump {
+ my($self) = @_;
+ require Data::Dumper;
+ Data::Dumper::Dumper($self);
+}
+
package CPAN::Author;
#-> sub CPAN::Author::as_glimpse ;
@@ -2870,6 +3010,25 @@ sub email { shift->{'EMAIL'} }
package CPAN::Distribution;
+#-> sub CPAN::Distribution::as_string ;
+sub as_string {
+ my $self = shift;
+ $self->containsmods;
+ $self->SUPER::as_string(@_);
+}
+
+#-> sub CPAN::Distribution::containsmods ;
+sub containsmods {
+ my $self = shift;
+ return if exists $self->{CONTAINSMODS};
+ for my $mod ($CPAN::META->all_objects("CPAN::Module")) {
+ my $mod_file = $mod->{CPAN_FILE} or next;
+ my $dist_id = $self->{ID} or next;
+ my $mod_id = $mod->{ID} or next;
+ $self->{CONTAINSMODS}{$mod_id} = undef if $mod_file eq $dist_id;
+ }
+}
+
#-> sub CPAN::Distribution::called_for ;
sub called_for {
my($self,$id) = @_;
@@ -2919,11 +3078,11 @@ sub get {
$self->debug("Changed directory to tmp") if $CPAN::DEBUG;
if (! $local_file) {
Carp::croak "bad download, can't do anything :-(\n";
- } elsif ($local_file =~ /(\.tar\.(gz|Z)|\.tgz)$/i){
+ } elsif ($local_file =~ /(\.tar\.(gz|Z)|\.tgz)\z/i){
$self->untar_me($local_file);
- } elsif ( $local_file =~ /\.zip$/i ) {
+ } elsif ( $local_file =~ /\.zip\z/i ) {
$self->unzip_me($local_file);
- } elsif ( $local_file =~ /\.pm\.(gz|Z)$/) {
+ } elsif ( $local_file =~ /\.pm\.(gz|Z)\z/) {
$self->pm2dir_me($local_file);
} else {
$self->{archived} = "NO";
@@ -2934,7 +3093,7 @@ sub get {
# Let's check if the package has its own directory.
my $dh = DirHandle->new(File::Spec->curdir)
or Carp::croak("Couldn't opendir .: $!");
- my @readdir = grep $_ !~ /^\.\.?$/, $dh->read; ### MAC??
+ my @readdir = grep $_ !~ /^\.\.?\z/s, $dh->read; ### MAC??
$dh->close;
my ($distdir,$packagedir);
if (@readdir == 1 && -d $readdir[0]) {
@@ -3024,7 +3183,7 @@ sub pm2dir_me {
my($self,$local_file) = @_;
$self->{archived} = "pm";
my $to = File::Basename::basename($local_file);
- $to =~ s/\.(gz|Z)$//;
+ $to =~ s/\.(gz|Z)\z//;
if (CPAN::Tarzip->gunzip($local_file,$to)) {
$self->{unwrapped} = "YES";
} else {
@@ -3075,6 +3234,44 @@ Please define it with "o conf shell <your shell>"
chdir($pwd);
}
+sub cvs_import {
+ my($self) = @_;
+ $self->get;
+ my $dir = $self->dir;
+
+ my $package = $self->called_for;
+ my $module = $CPAN::META->instance('CPAN::Module', $package);
+ my $version = $module->cpan_version;
+
+ my $userid = $self->{CPAN_USERID};
+
+ my $cvs_dir = (split '/', $dir)[-1];
+ $cvs_dir =~ s/-\d+[^-]+\z//;
+ my $cvs_root =
+ $CPAN::Config->{cvsroot} || $ENV{CVSROOT};
+ my $cvs_site_perl =
+ $CPAN::Config->{cvs_site_perl} || $ENV{CVS_SITE_PERL};
+ if ($cvs_site_perl) {
+ $cvs_dir = "$cvs_site_perl/$cvs_dir";
+ }
+ my $cvs_log = qq{"imported $package $version sources"};
+ $version =~ s/\./_/g;
+ my @cmd = ('cvs', '-d', $cvs_root, 'import', '-m', $cvs_log,
+ "$cvs_dir", $userid, "v$version");
+
+ my $getcwd;
+ $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
+ my $pwd = CPAN->$getcwd();
+ chdir($dir);
+
+ $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
+
+ $CPAN::Frontend->myprint(qq{@cmd\n});
+ system(@cmd) == 0 or
+ $CPAN::Frontend->mydie("cvs import failed");
+ chdir($pwd);
+}
+
#-> sub CPAN::Distribution::readme ;
sub readme {
my($self) = @_;
@@ -3146,7 +3343,7 @@ sub verifyMD5 {
$lc_file = CPAN::FTP->localize("authors/id/@local",
"$lc_want.gz",1);
if ($lc_file) {
- $lc_file =~ s/\.gz$//;
+ $lc_file =~ s/\.gz\z//;
CPAN::Tarzip->gunzip("$lc_file.gz",$lc_file);
} else {
return;
@@ -3193,7 +3390,7 @@ sub MD5_check_file {
my $md5 = MD5->new;
my($data,$ref);
$ref = \$data;
- while ($fh->READ($ref, 4096)){
+ while ($fh->READ($ref, 4096) > 0){
$md5->add($data);
}
my $hexdigest = $md5->hexdigest;
@@ -3257,7 +3454,7 @@ sub force {
$self->{'force_update'}++;
for my $att (qw(
MD5_STATUS archived build_dir localfile make install unwrapped
- writemakefile have_sponsored
+ writemakefile
)) {
delete $self->{$att};
}
@@ -3271,8 +3468,8 @@ sub isa_perl {
([._-])
(\d{3}(_[0-4][0-9])?)
\.tar[._-]gz
- $
- }x;
+ \z
+ }xs;
"$1.$3";
}
@@ -3338,8 +3535,8 @@ or
"had problems unarchiving. Please build manually";
exists $self->{writemakefile} &&
- $self->{writemakefile} eq "NO" and push @e,
- "Had some problem writing Makefile";
+ $self->{writemakefile} =~ m/ ^ NO\s* ( .* ) /sx and push @e,
+ $1 || "Had some problem writing Makefile";
defined $self->{'make'} and push @e,
"Has already been processed within this session";
@@ -3396,18 +3593,27 @@ or
kill 9, $pid;
waitpid $pid, 0;
$CPAN::Frontend->myprint($@);
- $self->{writemakefile} = "NO - $@";
+ $self->{writemakefile} = "NO $@";
$@ = "";
return;
}
} else {
$ret = system($system);
if ($ret != 0) {
- $self->{writemakefile} = "NO";
+ $self->{writemakefile} = "NO Makefile.PL returned status $ret";
return;
}
}
- $self->{writemakefile} = "YES";
+ if (-f "Makefile") {
+ $self->{writemakefile} = "YES";
+ } else {
+ $self->{writemakefile} =
+ qq{NO Makefile.PL refused to write a Makefile.};
+ # It's probably worth to record the reason, so let's retry
+ # local $/;
+ # my $fh = IO::File->new("$system |"); # STDERR? STDIN?
+ # $self->{writemakefile} .= <$fh>;
+ }
}
return if $CPAN::Signal;
if (my @prereq = $self->needs_prereq){
@@ -3441,7 +3647,7 @@ of modules we are processing right now?", "yes");
$CPAN::Frontend->myprint(" $system -- OK\n");
$self->{'make'} = "YES";
} else {
- $self->{writemakefile} = "YES";
+ $self->{writemakefile} ||= "YES";
$self->{'make'} = "NO";
$CPAN::Frontend->myprint(" $system -- NOT OK\n");
}
@@ -3474,7 +3680,7 @@ sub needs_prereq {
next if $mo->uptodate;
# it's not needed, so don't push it. We cannot omit this step, because
# if 'force' is in effect, nobody else will check.
- if ($self->{'have_sponsored'}{$p}++){
+ if ($self->{have_sponsored}{$p}++){
# We have already sponsored it and for some reason it's still
# not available. So we do nothing. Or what should we do?
# if we push it again, we have a potential infinite loop
@@ -3657,13 +3863,14 @@ sub contains {
my $fh = FileHandle->new;
local $/ = "\n";
open($fh,$parsefile) or die "Could not open '$parsefile': $!";
- my $inpod = 0;
+ my $in_cont = 0;
$self->debug("parsefile[$parsefile]") if $CPAN::DEBUG;
while (<$fh>) {
- $inpod = m/^=(?!head1\s+CONTENTS)/ ? 0 :
- m/^=head1\s+CONTENTS/ ? 1 : $inpod;
- next unless $inpod;
+ $in_cont = m/^=(?!head1\s+CONTENTS)/ ? 0 :
+ m/^=head1\s+CONTENTS/ ? 1 : $in_cont;
+ next unless $in_cont;
next if /^=/;
+ s/\#.*//;
next if /^\s+$/;
chomp;
push @result, (split " ", $_, 2)[0];
@@ -3709,7 +3916,7 @@ sub find_bundle_file {
$what2 =~ s/:Bundle://;
$what2 =~ tr|:|/|;
} else {
- $what2 =~ s|Bundle/||;
+ $what2 =~ s|Bundle[/\\]||;
}
my $bu;
while (<$fh>) {
@@ -3775,13 +3982,19 @@ explicitly a file $s.
# recap with less noise
if ( $meth eq "install") {
if (%fail) {
- $CPAN::Frontend->myprint(qq{\nBundle summary: }.
- qq{The following items seem to }.
- qq{have had installation problems:\n});
+ require Text::Wrap;
+ my $raw = sprintf(qq{Bundle summary:
+The following items in bundle %s had installation problems:},
+ $self->id
+ );
+ $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
+ $CPAN::Frontend->myprint("\n");
+ my $paragraph = "";
for $s ($self->contains) {
- $CPAN::Frontend->myprint( "$s " ) if $fail{$s};
+ $paragraph .= "$s " if $fail{$s};
}
- $CPAN::Frontend->myprint(qq{\n});
+ $CPAN::Frontend->myprint(Text::Wrap::fill(" "," ",$paragraph));
+ $CPAN::Frontend->myprint("\n");
} else {
$self->{'install'} = 'YES';
}
@@ -3911,7 +4124,7 @@ sub as_string {
sub manpage_headline {
my($self,$local_file) = @_;
my(@local_file) = $local_file;
- $local_file =~ s/\.pm$/.pod/;
+ $local_file =~ s/\.pm\z/.pod/;
push @local_file, $local_file;
my(@result,$locf);
for $locf (@local_file) {
@@ -4011,6 +4224,8 @@ sub rematein {
sub readme { shift->rematein('readme') }
#-> sub CPAN::Module::look ;
sub look { shift->rematein('look') }
+#-> sub CPAN::Module::cvs_import ;
+sub cvs_import { shift->rematein('cvs_import') }
#-> sub CPAN::Module::get ;
sub get { shift->rematein('get',@_); }
#-> sub CPAN::Module::make ;
@@ -4091,7 +4306,7 @@ sub inst_version {
local($^W) = 0 if $] < 5.00303 && $ExtUtils::MakeMaker::VERSION < 5.38;
# warn "HERE";
my $have = MM->parse_version($parsefile) || "undef";
- $have =~ s/\s+//g;
+ $have =~ s/\s*//g; # stringify to float around floating point issues
$have;
}
@@ -4174,7 +4389,7 @@ sub READLINE {
my $gz = $self->{GZ};
my($line,$bytesread);
$bytesread = $gz->gzreadline($line);
- return undef if $bytesread == 0;
+ return undef if $bytesread <= 0;
return $line;
} else {
my $fh = $self->{FH};
@@ -4202,7 +4417,7 @@ sub DESTROY {
$gz->gzclose();
} else {
my $fh = $self->{FH};
- $fh->close;
+ $fh->close if defined $fh;
}
undef $self;
}
@@ -4213,29 +4428,30 @@ sub untar {
if (MM->maybe_command($CPAN::Config->{'gzip'})
&&
MM->maybe_command($CPAN::Config->{'tar'})) {
- if ($^O =~ /win/i) { # irgggh
- # people find the most curious tar binaries that cannot handle
- # pipes
- my $system = "$CPAN::Config->{'gzip'} --decompress $file";
- if (system($system)==0) {
- $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n});
- } else {
- $CPAN::Frontend->mydie(
- qq{Couldn\'t uncompress $file\n}
- );
- }
- $file =~ s/\.gz$//;
- $system = "$CPAN::Config->{tar} xvf $file";
- if (system($system)==0) {
- $CPAN::Frontend->myprint(qq{Untarred $file successfully\n});
- } else {
- $CPAN::Frontend->mydie(qq{Couldn\'t untar $file\n});
- }
- return 1;
+ my $system = "$CPAN::Config->{'gzip'} --decompress --stdout " .
+ "< $file | $CPAN::Config->{tar} xvf -";
+ if (system($system) != 0) {
+ # people find the most curious tar binaries that cannot handle
+ # pipes
+ my $system = "$CPAN::Config->{'gzip'} --decompress $file";
+ if (system($system)==0) {
+ $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n});
+ } else {
+ $CPAN::Frontend->mydie(
+ qq{Couldn\'t uncompress $file\n}
+ );
+ }
+ $file =~ s/\.gz\z//;
+ $system = "$CPAN::Config->{tar} xvf $file";
+ $CPAN::Frontend->myprint(qq{Using Tar:$system:\n});
+ if (system($system)==0) {
+ $CPAN::Frontend->myprint(qq{Untarred $file successfully\n});
+ } else {
+ $CPAN::Frontend->mydie(qq{Couldn\'t untar $file\n});
+ }
+ return 1;
} else {
- my $system = "$CPAN::Config->{'gzip'} --decompress --stdout " .
- "< $file | $CPAN::Config->{tar} xvf -";
- return system($system) == 0;
+ return 1;
}
} elsif ($CPAN::META->has_inst("Archive::Tar")
&&
@@ -4291,8 +4507,8 @@ Modules are fetched from one or more of the mirrored CPAN
directory.
The CPAN module also supports the concept of named and versioned
-'bundles' of modules. Bundles simplify the handling of sets of
-related modules. See BUNDLES below.
+I<bundles> of modules. Bundles simplify the handling of sets of
+related modules. See Bundles below.
The package contains a session manager and a cache manager. There is
no status retained between sessions. The session manager keeps track
@@ -4343,29 +4559,14 @@ objects. The parser recognizes a regular expression only if you
enclose it between two slashes.
The principle is that the number of found objects influences how an
-item is displayed. If the search finds one item, the result is displayed
-as object-E<gt>as_string, but if we find more than one, we display
-each as object-E<gt>as_glimpse. E.g.
-
- cpan> a ANDK
- Author id = ANDK
- EMAIL a.koenig@franz.ww.TU-Berlin.DE
- FULLNAME Andreas König
-
-
- cpan> a /andk/
- Author id = ANDK
- EMAIL a.koenig@franz.ww.TU-Berlin.DE
- FULLNAME Andreas König
-
-
- cpan> a /and.*rt/
- Author ANDYD (Andy Dougherty)
- Author MERLYN (Randal L. Schwartz)
+item is displayed. If the search finds one item, the result is
+displayed with the rather verbose method C<as_string>, but if we find
+more than one, we display each object with the terse method
+<as_glimpse>.
=item make, test, install, clean modules or distributions
-These commands take any number of arguments and investigates what is
+These commands take any number of arguments and investigate what is
necessary to perform the action. If the argument is a distribution
file name (recognized by embedded slashes), it is processed. If it is
a module, CPAN determines the distribution file in which this module
@@ -4407,12 +4608,11 @@ A C<clean> command results in a
being executed within the distribution file's working directory.
-=item readme, look module or distribution
+=item get, readme, look module or distribution
-These two commands take only one argument, be it a module or a
-distribution file. C<readme> unconditionally runs, displaying the
-README of the associated distribution file. C<Look> gets and
-untars (if not yet done) the distribution file, changes to the
+C<get> downloads a distribution file without further action. C<readme>
+displays the README file of the associated distribution. C<Look> gets
+and untars (if not yet done) the distribution file, changes to the
appropriate directory and opens a subshell process in that directory.
=item Signals
@@ -4513,8 +4713,8 @@ functions in the calling package (C<install(...)>).
There's currently only one class that has a stable interface -
CPAN::Shell. All commands that are available in the CPAN shell are
methods of the class CPAN::Shell. Each of the commands that produce
-listings of modules (C<r>, C<autobundle>, C<u>) returns a list of the
-IDs of all modules within the list.
+listings of modules (C<r>, C<autobundle>, C<u>) also return a list of
+the IDs of all modules within the list.
=over 2
@@ -4549,6 +4749,41 @@ functionalities that are available in the shell.
print "No VERSION in ", $mod->id, "\n";
}
+Or if you want to write a cronjob to watch The CPAN, you could list
+all modules that need updating:
+
+ perl -e 'use CPAN; CPAN::Shell->r;'
+
+If you don't want to get any output if all modules are up to date, you
+can parse the output of above command for the regular expression
+//modules are up to date// and decide to mail the output only if it
+doesn't match. Ick?
+
+If you prefer to do it more in a programmer style in one single
+process, maybe something like this suites you better:
+
+ # list all modules on my disk that have newer versions on CPAN
+ for $mod (CPAN::Shell->expand("Module","/./")){
+ next unless $mod->inst_file;
+ next if $mod->uptodate;
+ printf "Module %s is installed as %s, could be updated to %s from CPAN\n",
+ $mod->id, $mod->inst_version, $mod->cpan_version;
+ }
+
+If that gives you too much output every day, you maybe only want to
+watch for three modules. You can write
+
+ for $mod (CPAN::Shell->expand("Module","/Apache|LWP|CGI/")){
+
+as the first line instead. Or you can combine some of the above
+tricks:
+
+ # watch only for a new mod_perl module
+ $mod = CPAN::Shell->expand("Module","mod_perl");
+ exit if $mod->uptodate;
+ # new mod_perl arrived, let me know all update recommendations
+ CPAN::Shell->r;
+
=back
=head2 Methods in the four Classes
@@ -4666,7 +4901,7 @@ you might use CPAN.pm to put together all you need on a networked
machine. Then copy the $CPAN::Config->{keep_source_where} (but not
$CPAN::Config->{build_dir}) directory on a floppy. This floppy is kind
of a personal CPAN. CPAN.pm on the non-networked machines works nicely
-with this floppy.
+with this floppy. See also below the paragraph about CD-ROM support.
=head1 CONFIGURATION
@@ -4689,7 +4924,6 @@ defined:
many seconds inactivity. Set to 0 to never break.
inhibit_startup_message
if true, does not print the startup message
- keep_source keep the source in a local directory?
keep_source_where directory in which to keep the source (if we do)
make location of external make program
make_arg arguments that should always be passed to 'make'
@@ -4713,29 +4947,40 @@ shell with the command set defined within the C<o conf> command:
=over 2
-=item o conf E<lt>scalar optionE<gt>
+=item C<o conf E<lt>scalar optionE<gt>>
prints the current value of the I<scalar option>
-=item o conf E<lt>scalar optionE<gt> E<lt>valueE<gt>
+=item C<o conf E<lt>scalar optionE<gt> E<lt>valueE<gt>>
Sets the value of the I<scalar option> to I<value>
-=item o conf E<lt>list optionE<gt>
+=item C<o conf E<lt>list optionE<gt>>
prints the current value of the I<list option> in MakeMaker's
neatvalue format.
-=item o conf E<lt>list optionE<gt> [shift|pop]
+=item C<o conf E<lt>list optionE<gt> [shift|pop]>
shifts or pops the array in the I<list option> variable
-=item o conf E<lt>list optionE<gt> [unshift|push|splice] E<lt>listE<gt>
+=item C<o conf E<lt>list optionE<gt> [unshift|push|splice] E<lt>listE<gt>>
works like the corresponding perl commands.
=back
+=head2 Note on urllist parameter's format
+
+urllist parameters are URLs according to RFC 1738. We do a little
+guessing if your URL is not compliant, but if you have problems with file URLs, please try the correct format. Either:
+
+ file://localhost/whatever/ftp/pub/CPAN/
+
+or
+
+ file:///home/ftp/pub/CPAN/
+
=head2 urllist parameter has CD-ROM support
The C<urllist> parameter of the configuration table contains a list of
@@ -4780,28 +5025,30 @@ To populate a freshly installed perl with my favorite modules is pretty
easiest by maintaining a private bundle definition file. To get a useful
blueprint of a bundle definition file, the command autobundle can be used
on the CPAN shell command line. This command writes a bundle definition
-file for all modules that re installed for the currently running perl
+file for all modules that are installed for the currently running perl
interpreter. It's recommended to run this command only once and from then
on maintain the file manually under a private name, say
Bundle/my_bundle.pm. With a clever bundle file you can then simply say
cpan> install Bundle::my_bundle
-then answer a few questions and then go out.
+then answer a few questions and then go out for a coffee.
-Maintaining a bundle definition file means to keep track of two things:
-dependencies and interactivity. CPAN.pm (currently) does not take into
-account dependencies between distributions, so a bundle definition file
-should specify distributions that depend on others B<after> the others.
-On the other hand, it's a bit annoying that many distributions need some
-interactive configuring. So what I try to accomplish in my private bundle
-file is to have the packages that need to be configured early in the file
-and the gentle ones later, so I can go out after a few minutes and leave
-CPAN.pm unattained.
+Maintaining a bundle definition file means to keep track of two
+things: dependencies and interactivity. CPAN.pm sometimes fails on
+calculating dependencies because not all modules define all MakeMaker
+attributes correctly, so a bundle definition file should specify
+prerequisites as early as possible. On the other hand, it's a bit
+annoying that many distributions need some interactive configuring. So
+what I try to accomplish in my private bundle file is to have the
+packages that need to be configured early in the file and the gentle
+ones later, so I can go out after a few minutes and leave CPAN.pm
+unattained.
=head1 WORKING WITH CPAN.pm BEHIND FIREWALLS
-Thanks to Graham Barr for contributing the firewall following howto.
+Thanks to Graham Barr for contributing the following paragraphs about
+the interaction between perl, and various firewall configurations.
Firewalls can be categorized into three basic types.
@@ -4820,10 +5067,10 @@ ftp) you will need to use LWP.
=item ftp firewall
-This where the firewall machine runs a ftp server. This kind of firewall will
-only let you access ftp serves outside the firewall. This is usually done by
-connecting to the firewall with ftp, then entering a username like
-"user@outside.host.com"
+This where the firewall machine runs a ftp server. This kind of
+firewall will only let you access ftp servers outside the firewall.
+This is usually done by connecting to the firewall with ftp, then
+entering a username like "user@outside.host.com"
To access servers outside these type of firewalls with perl you
will need to use Net::FTP.
@@ -4860,7 +5107,7 @@ special compiling is need as you can access hosts directly.
=head1 BUGS
-We should give coverage for _all_ of the CPAN and not just the PAUSE
+We should give coverage for B<all> of the CPAN and not just the PAUSE
part, right? In this discussion CPAN and PAUSE have become equal --
but they are not. PAUSE is authors/ and modules/. CPAN is PAUSE plus
the clpa/, doc/, misc/, ports/, src/, scripts/.
@@ -4875,7 +5122,7 @@ traditional method of building a Perl module package from a shell.
=head1 AUTHOR
-Andreas König E<lt>a.koenig@kulturbox.deE<gt>
+Andreas Koenig E<lt>andreas.koenig@anima.deE<gt>
=head1 SEE ALSO
diff --git a/contrib/perl5/lib/CPAN/FirstTime.pm b/contrib/perl5/lib/CPAN/FirstTime.pm
index df95812..0e795da 100644
--- a/contrib/perl5/lib/CPAN/FirstTime.pm
+++ b/contrib/perl5/lib/CPAN/FirstTime.pm
@@ -16,7 +16,7 @@ use FileHandle ();
use File::Basename ();
use File::Path ();
use vars qw($VERSION);
-$VERSION = substr q$Revision: 1.36 $, 10;
+$VERSION = substr q$Revision: 1.38 $, 10;
=head1 NAME
@@ -77,7 +77,9 @@ dialog anytime later by typing 'o conf init' at the cpan prompt.)
*prompt = \&ExtUtils::MakeMaker::prompt;
} else {
$fastread = 1;
- *prompt = sub {
+ $CPAN::Config->{urllist} ||= [];
+ # prototype should match that of &MakeMaker::prompt
+ *prompt = sub ($;$) {
my($q,$a) = @_;
my($ret) = defined $a ? $a : "";
printf qq{%s [%s]\n\n}, $q, $ret;
@@ -358,16 +360,27 @@ sub conf_sites {
require File::Copy;
File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
}
- if ( ! -f $mby ){
- print qq{You have no $mby
+ my $loopcount = 0;
+ while () {
+ if ( ! -f $mby ){
+ print qq{You have no $mby
I\'m trying to fetch one
};
- $mby = CPAN::FTP->localize($m,$mby,3);
- } elsif (-M $mby > 30 ) {
- print qq{Your $mby is older than 30 days,
+ $mby = CPAN::FTP->localize($m,$mby,3);
+ } elsif (-M $mby > 60 && $loopcount == 0) {
+ print qq{Your $mby is older than 60 days,
I\'m trying to fetch one
};
- $mby = CPAN::FTP->localize($m,$mby,3);
+ $mby = CPAN::FTP->localize($m,$mby,3);
+ $loopcount++;
+ } elsif (-s $mby == 0) {
+ print qq{You have an empty $mby,
+ I\'m trying to fetch one
+};
+ $mby = CPAN::FTP->localize($m,$mby,3);
+ } else {
+ last;
+ }
}
read_mirrored_by($mby);
}
diff --git a/contrib/perl5/lib/CPAN/Nox.pm b/contrib/perl5/lib/CPAN/Nox.pm
index e9cb189..8b59ca0 100644
--- a/contrib/perl5/lib/CPAN/Nox.pm
+++ b/contrib/perl5/lib/CPAN/Nox.pm
@@ -1,7 +1,12 @@
package CPAN::Nox;
+use strict;
+use vars qw($VERSION @EXPORT);
-BEGIN{$CPAN::Suppress_readline=1 unless defined $CPAN::term;}
+BEGIN{
+ $CPAN::Suppress_readline=1 unless defined $CPAN::term;
+}
+use base 'Exporter';
use CPAN;
$VERSION = "1.00";
@@ -12,6 +17,8 @@ $CPAN::META->has_inst('Compress::Zlib','no');
*AUTOLOAD = \&CPAN::AUTOLOAD;
+__END__
+
=head1 NAME
CPAN::Nox - Wrapper around CPAN.pm without using any XS module
diff --git a/contrib/perl5/lib/Carp.pm b/contrib/perl5/lib/Carp.pm
index f8f750a..43524dd 100644
--- a/contrib/perl5/lib/Carp.pm
+++ b/contrib/perl5/lib/Carp.pm
@@ -94,98 +94,8 @@ sub export_fail {
# each function call on the stack.
sub longmess {
- return @_ if ref $_[0];
- my $error = join '', @_;
- my $mess = "";
- my $i = 1 + $CarpLevel;
- my ($pack,$file,$line,$sub,$hargs,$eval,$require);
- my (@a);
- #
- # crawl up the stack....
- #
- while (do { { package DB; @a = caller($i++) } } ) {
- # get copies of the variables returned from caller()
- ($pack,$file,$line,$sub,$hargs,undef,$eval,$require) = @a;
- #
- # if the $error error string is newline terminated then it
- # is copied into $mess. Otherwise, $mess gets set (at the end of
- # the 'else {' section below) to one of two things. The first time
- # through, it is set to the "$error at $file line $line" message.
- # $error is then set to 'called' which triggers subsequent loop
- # iterations to append $sub to $mess before appending the "$error
- # at $file line $line" which now actually reads "called at $file line
- # $line". Thus, the stack trace message is constructed:
- #
- # first time: $mess = $error at $file line $line
- # subsequent times: $mess .= $sub $error at $file line $line
- # ^^^^^^
- # "called"
- if ($error =~ m/\n$/) {
- $mess .= $error;
- } else {
- # Build a string, $sub, which names the sub-routine called.
- # This may also be "require ...", "eval '...' or "eval {...}"
- if (defined $eval) {
- if ($require) {
- $sub = "require $eval";
- } else {
- $eval =~ s/([\\\'])/\\$1/g;
- if ($MaxEvalLen && length($eval) > $MaxEvalLen) {
- substr($eval,$MaxEvalLen) = '...';
- }
- $sub = "eval '$eval'";
- }
- } elsif ($sub eq '(eval)') {
- $sub = 'eval {...}';
- }
- # if there are any arguments in the sub-routine call, format
- # them according to the format variables defined earlier in
- # this file and join them onto the $sub sub-routine string
- if ($hargs) {
- # we may trash some of the args so we take a copy
- @a = @DB::args; # must get local copy of args
- # don't print any more than $MaxArgNums
- if ($MaxArgNums and @a > $MaxArgNums) {
- # cap the length of $#a and set the last element to '...'
- $#a = $MaxArgNums;
- $a[$#a] = "...";
- }
- for (@a) {
- # set args to the string "undef" if undefined
- $_ = "undef", next unless defined $_;
- if (ref $_) {
- # dunno what this is for...
- $_ .= '';
- s/'/\\'/g;
- }
- else {
- s/'/\\'/g;
- # terminate the string early with '...' if too long
- substr($_,$MaxArgLen) = '...'
- if $MaxArgLen and $MaxArgLen < length;
- }
- # 'quote' arg unless it looks like a number
- $_ = "'$_'" unless /^-?[\d.]+$/;
- # print high-end chars as 'M-<char>' or '^<char>'
- s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
- s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
- }
- # append ('all', 'the', 'arguments') to the $sub string
- $sub .= '(' . join(', ', @a) . ')';
- }
- # here's where the error message, $mess, gets constructed
- $mess .= "\t$sub " if $error eq "called";
- $mess .= "$error at $file line $line\n";
- }
- # we don't need to print the actual error message again so we can
- # change this to "called" so that the string "$error at $file line
- # $line" makes sense as "called at $file line $line".
- $error = "called";
- }
- # this kludge circumvents die's incorrect handling of NUL
- my $msg = \($mess || $error);
- $$msg =~ tr/\0//d;
- $$msg;
+ { local $@; require Carp::Heavy; } # XXX fix require to not clear $@?
+ goto &longmess_heavy;
}
@@ -196,78 +106,8 @@ sub longmess {
# you always get a stack trace
sub shortmess { # Short-circuit &longmess if called via multiple packages
- goto &longmess if $Verbose;
- return @_ if ref $_[0];
- my $error = join '', @_;
- my ($prevpack) = caller(1);
- my $extra = $CarpLevel;
- my $i = 2;
- my ($pack,$file,$line);
- # when reporting an error, we want to report it from the context of the
- # calling package. So what is the calling package? Within a module,
- # there may be many calls between methods and perhaps between sub-classes
- # and super-classes, but the user isn't interested in what happens
- # inside the package. We start by building a hash array which keeps
- # track of all the packages to which the calling package belongs. We
- # do this by examining its @ISA variable. Any call from a base class
- # method (one of our caller's @ISA packages) can be ignored
- my %isa = ($prevpack,1);
-
- # merge all the caller's @ISA packages into %isa.
- @isa{@{"${prevpack}::ISA"}} = ()
- if(defined @{"${prevpack}::ISA"});
-
- # now we crawl up the calling stack and look at all the packages in
- # there. For each package, we look to see if it has an @ISA and then
- # we see if our caller features in that list. That would imply that
- # our caller is a derived class of that package and its calls can also
- # be ignored
- while (($pack,$file,$line) = caller($i++)) {
- if(defined @{$pack . "::ISA"}) {
- my @i = @{$pack . "::ISA"};
- my %i;
- @i{@i} = ();
- # merge any relevant packages into %isa
- @isa{@i,$pack} = ()
- if(exists $i{$prevpack} || exists $isa{$pack});
- }
-
- # and here's where we do the ignoring... if the package in
- # question is one of our caller's base or derived packages then
- # we can ignore it (skip it) and go onto the next (but note that
- # the continue { } block below gets called every time)
- next
- if(exists $isa{$pack});
-
- # Hey! We've found a package that isn't one of our caller's
- # clan....but wait, $extra refers to the number of 'extra' levels
- # we should skip up. If $extra > 0 then this is a false alarm.
- # We must merge the package into the %isa hash (so we can ignore it
- # if it pops up again), decrement $extra, and continue.
- if ($extra-- > 0) {
- %isa = ($pack,1);
- @isa{@{$pack . "::ISA"}} = ()
- if(defined @{$pack . "::ISA"});
- }
- else {
- # OK! We've got a candidate package. Time to construct the
- # relevant error message and return it. die() doesn't like
- # to be given NUL characters (which $msg may contain) so we
- # remove them first.
- (my $msg = "$error at $file line $line\n") =~ tr/\0//d;
- return $msg;
- }
- }
- continue {
- $prevpack = $pack;
- }
-
- # uh-oh! It looks like we crawled all the way up the stack and
- # never found a candidate package. Oh well, let's call longmess
- # to generate a full stack trace. We use the magical form of 'goto'
- # so that this shortmess() function doesn't appear on the stack
- # to further confuse longmess() about it's calling package.
- goto &longmess;
+ { local $@; require Carp::Heavy; } # XXX fix require to not clear $@?
+ goto &shortmess_heavy;
}
diff --git a/contrib/perl5/lib/Carp/Heavy.pm b/contrib/perl5/lib/Carp/Heavy.pm
new file mode 100644
index 0000000..5e3de49
--- /dev/null
+++ b/contrib/perl5/lib/Carp/Heavy.pm
@@ -0,0 +1,253 @@
+package Carp;
+
+=head1 NAME
+
+Carp::Heavy - Carp guts
+
+=head1 SYNOPIS
+
+(internal use only)
+
+=head1 DESCRIPTION
+
+No user-serviceable parts inside.
+
+=cut
+
+# This package is heavily used. Be small. Be fast. Be good.
+
+# Comments added by Andy Wardley <abw@kfs.org> 09-Apr-98, based on an
+# _almost_ complete understanding of the package. Corrections and
+# comments are welcome.
+
+# longmess() crawls all the way up the stack reporting on all the function
+# calls made. The error string, $error, is originally constructed from the
+# arguments passed into longmess() via confess(), cluck() or shortmess().
+# This gets appended with the stack trace messages which are generated for
+# each function call on the stack.
+
+sub longmess_heavy {
+ return @_ if ref $_[0];
+ my $error = join '', @_;
+ my $mess = "";
+ my $i = 1 + $CarpLevel;
+ my ($pack,$file,$line,$sub,$hargs,$eval,$require);
+ my (@a);
+ #
+ # crawl up the stack....
+ #
+ while (do { { package DB; @a = caller($i++) } } ) {
+ # get copies of the variables returned from caller()
+ ($pack,$file,$line,$sub,$hargs,undef,$eval,$require) = @a;
+ #
+ # if the $error error string is newline terminated then it
+ # is copied into $mess. Otherwise, $mess gets set (at the end of
+ # the 'else {' section below) to one of two things. The first time
+ # through, it is set to the "$error at $file line $line" message.
+ # $error is then set to 'called' which triggers subsequent loop
+ # iterations to append $sub to $mess before appending the "$error
+ # at $file line $line" which now actually reads "called at $file line
+ # $line". Thus, the stack trace message is constructed:
+ #
+ # first time: $mess = $error at $file line $line
+ # subsequent times: $mess .= $sub $error at $file line $line
+ # ^^^^^^
+ # "called"
+ if ($error =~ m/\n$/) {
+ $mess .= $error;
+ } else {
+ # Build a string, $sub, which names the sub-routine called.
+ # This may also be "require ...", "eval '...' or "eval {...}"
+ if (defined $eval) {
+ if ($require) {
+ $sub = "require $eval";
+ } else {
+ $eval =~ s/([\\\'])/\\$1/g;
+ if ($MaxEvalLen && length($eval) > $MaxEvalLen) {
+ substr($eval,$MaxEvalLen) = '...';
+ }
+ $sub = "eval '$eval'";
+ }
+ } elsif ($sub eq '(eval)') {
+ $sub = 'eval {...}';
+ }
+ # if there are any arguments in the sub-routine call, format
+ # them according to the format variables defined earlier in
+ # this file and join them onto the $sub sub-routine string
+ if ($hargs) {
+ # we may trash some of the args so we take a copy
+ @a = @DB::args; # must get local copy of args
+ # don't print any more than $MaxArgNums
+ if ($MaxArgNums and @a > $MaxArgNums) {
+ # cap the length of $#a and set the last element to '...'
+ $#a = $MaxArgNums;
+ $a[$#a] = "...";
+ }
+ for (@a) {
+ # set args to the string "undef" if undefined
+ $_ = "undef", next unless defined $_;
+ if (ref $_) {
+ # force reference to string representation
+ $_ .= '';
+ s/'/\\'/g;
+ }
+ else {
+ s/'/\\'/g;
+ # terminate the string early with '...' if too long
+ substr($_,$MaxArgLen) = '...'
+ if $MaxArgLen and $MaxArgLen < length;
+ }
+ # 'quote' arg unless it looks like a number
+ $_ = "'$_'" unless /^-?[\d.]+$/;
+ # print high-end chars as 'M-<char>'
+ s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+ # print remaining control chars as ^<char>
+ s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+ }
+ # append ('all', 'the', 'arguments') to the $sub string
+ $sub .= '(' . join(', ', @a) . ')';
+ }
+ # here's where the error message, $mess, gets constructed
+ $mess .= "\t$sub " if $error eq "called";
+ $mess .= "$error at $file line $line";
+ if (defined &Thread::tid) {
+ my $tid = Thread->self->tid;
+ $mess .= " thread $tid" if $tid;
+ }
+ $mess .= "\n";
+ }
+ # we don't need to print the actual error message again so we can
+ # change this to "called" so that the string "$error at $file line
+ # $line" makes sense as "called at $file line $line".
+ $error = "called";
+ }
+ # this kludge circumvents die's incorrect handling of NUL
+ my $msg = \($mess || $error);
+ $$msg =~ tr/\0//d;
+ $$msg;
+}
+
+
+# ancestors() returns the complete set of ancestors of a module
+
+sub ancestors($$);
+
+sub ancestors($$){
+ my( $pack, $href ) = @_;
+ if( @{"${pack}::ISA"} ){
+ my $risa = \@{"${pack}::ISA"};
+ my %tree = ();
+ @tree{@$risa} = ();
+ foreach my $mod ( @$risa ){
+ # visit ancestors - if not already in the gallery
+ if( ! defined( $$href{$mod} ) ){
+ my @ancs = ancestors( $mod, $href );
+ @tree{@ancs} = ();
+ }
+ }
+ return ( keys( %tree ) );
+ } else {
+ return ();
+ }
+}
+
+
+# shortmess() is called by carp() and croak() to skip all the way up to
+# the top-level caller's package and report the error from there. confess()
+# and cluck() generate a full stack trace so they call longmess() to
+# generate that. In verbose mode shortmess() calls longmess() so
+# you always get a stack trace
+
+sub shortmess_heavy { # Short-circuit &longmess if called via multiple packages
+ goto &longmess_heavy if $Verbose;
+ return @_ if ref $_[0];
+ my $error = join '', @_;
+ my ($prevpack) = caller(1);
+ my $extra = $CarpLevel;
+
+ my @Clans = ( $prevpack );
+ my $i = 2;
+ my ($pack,$file,$line);
+ # when reporting an error, we want to report it from the context of the
+ # calling package. So what is the calling package? Within a module,
+ # there may be many calls between methods and perhaps between sub-classes
+ # and super-classes, but the user isn't interested in what happens
+ # inside the package. We start by building a hash array which keeps
+ # track of all the packages to which the calling package belongs. We
+ # do this by examining its @ISA variable. Any call from a base class
+ # method (one of our caller's @ISA packages) can be ignored
+ my %isa;
+
+ # merge all the caller's @ISA packages and ancestors into %isa.
+ my @pars = ancestors( $prevpack, \%isa );
+ @isa{@pars} = () if @pars;
+ $isa{$prevpack} = 1;
+
+ # now we crawl up the calling stack and look at all the packages in
+ # there. For each package, we look to see if it has an @ISA and then
+ # we see if our caller features in that list. That would imply that
+ # our caller is a derived class of that package and its calls can also
+ # be ignored
+CALLER:
+ while (($pack,$file,$line) = caller($i++)) {
+
+ # Chances are, the caller's caller (or its caller...) is already
+ # in the gallery - if so, ignore this caller.
+ next if exists( $isa{$pack} );
+
+ # no: collect this module's ancestors.
+ my @i = ancestors( $pack, \%isa );
+ my %i;
+ if( @i ){
+ @i{@i} = ();
+ # check whether our representative of one of the clans is
+ # in this family tree.
+ foreach my $cl (@Clans){
+ if( exists( $i{$cl} ) ){
+ # yes: merge all of the family tree into %isa
+ @isa{@i,$pack} = ();
+ # and here's where we do some more ignoring...
+ # if the package in question is one of our caller's
+ # base or derived packages then we can ignore it (skip it)
+ # and go onto the next.
+ next CALLER if exists( $isa{$pack} );
+ last;
+ }
+ }
+ }
+
+ # Hey! We've found a package that isn't one of our caller's
+ # clan....but wait, $extra refers to the number of 'extra' levels
+ # we should skip up. If $extra > 0 then this is a false alarm.
+ # We must merge the package into the %isa hash (so we can ignore it
+ # if it pops up again), decrement $extra, and continue.
+ if ($extra-- > 0) {
+ push( @Clans, $pack );
+ @isa{@i,$pack} = ();
+ }
+ else {
+ # OK! We've got a candidate package. Time to construct the
+ # relevant error message and return it. die() doesn't like
+ # to be given NUL characters (which $msg may contain) so we
+ # remove them first.
+ my $msg;
+ $msg = "$error at $file line $line";
+ if (defined &Thread::tid) {
+ my $tid = Thread->self->tid;
+ $mess .= " thread $tid" if $tid;
+ }
+ $msg .= "\n";
+ $msg =~ tr/\0//d;
+ return $msg;
+ }
+ }
+
+ # uh-oh! It looks like we crawled all the way up the stack and
+ # never found a candidate package. Oh well, let's call longmess
+ # to generate a full stack trace. We use the magical form of 'goto'
+ # so that this shortmess() function doesn't appear on the stack
+ # to further confuse longmess() about it's calling package.
+ goto &longmess_heavy;
+}
+
+1;
diff --git a/contrib/perl5/lib/Class/Struct.pm b/contrib/perl5/lib/Class/Struct.pm
index 8fddfbf..63eddac 100644
--- a/contrib/perl5/lib/Class/Struct.pm
+++ b/contrib/perl5/lib/Class/Struct.pm
@@ -2,10 +2,11 @@ package Class::Struct;
## See POD after __END__
-require 5.002;
+use 5.005_64;
use strict;
-use vars qw(@ISA @EXPORT);
+use warnings::register;
+our(@ISA, @EXPORT, $VERSION);
use Carp;
@@ -13,6 +14,8 @@ require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(struct);
+$VERSION = '0.58';
+
## Tested on 5.002 and 5.003 without class membership tests:
my $CHECK_CLASS_MEMBERSHIP = ($] >= 5.003_95);
@@ -98,6 +101,8 @@ sub struct {
my $out = '';
$out = "{\n package $class;\n use Carp;\n sub new {\n";
+ $out .= " my (\$class, \%init) = \@_;\n";
+ $out .= " \$class = __PACKAGE__ unless \@_;\n";
my $cnt = 0;
my $idx = 0;
@@ -115,7 +120,7 @@ sub struct {
$type = $decls[$idx+1];
push( @methods, $name );
if( $base_type eq 'HASH' ){
- $elem = "{'$name'}";
+ $elem = "{'${class}::$name'}";
}
elsif( $base_type eq 'ARRAY' ){
$elem = "[$cnt]";
@@ -126,19 +131,27 @@ sub struct {
$refs{$name}++;
$type = $1;
}
+ my $init = "defined(\$init{'$name'}) ? \$init{'$name'} :";
if( $type eq '@' ){
- $out .= " \$r->$elem = [];$cmt\n";
+ $out .= " croak 'Initializer for $name must be array reference'\n";
+ $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'ARRAY';\n";
+ $out .= " \$r->$elem = $init [];$cmt\n";
$arrays{$name}++;
}
elsif( $type eq '%' ){
- $out .= " \$r->$elem = {};$cmt\n";
+ $out .= " croak 'Initializer for $name must be hash reference'\n";
+ $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n";
+ $out .= " \$r->$elem = $init {};$cmt\n";
$hashes{$name}++;
}
elsif ( $type eq '$') {
- $out .= " \$r->$elem = undef;$cmt\n";
+ $out .= " \$r->$elem = $init undef;$cmt\n";
}
elsif( $type =~ /^\w+(?:::\w+)*$/ ){
- $out .= " \$r->$elem = '${type}'->new();$cmt\n";
+ $init = "defined(\$init{'$name'}) ? \%{\$init{'$name'}} : ()";
+ $out .= " croak 'Initializer for $name must be hash reference'\n";
+ $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n";
+ $out .= " \$r->$elem = '${type}'->new($init);$cmt\n";
$classes{$name} = $type;
$got_class = 1;
}
@@ -147,7 +160,7 @@ sub struct {
}
$idx += 2;
}
- $out .= " bless \$r;\n }\n";
+ $out .= " bless \$r, \$class;\n }\n";
# Create accessor methods.
@@ -155,8 +168,8 @@ sub struct {
$cnt = 0;
foreach $name (@methods){
if ( do { no strict 'refs'; defined &{$class . "::$name"} } ) {
- carp "function '$name' already defined, overrides struct accessor method"
- if $^W;
+ warnings::warn "function '$name' already defined, overrides struct accessor method"
+ if warnings::enabled();
}
else {
$pre = $pst = $cmt = $sel = '';
@@ -171,16 +184,16 @@ sub struct {
++$cnt;
}
elsif( $base_type eq 'HASH' ){
- $elem = "{'$name'}";
+ $elem = "{'${class}::$name'}";
}
if( defined $arrays{$name} ){
$out .= " my \$i;\n";
- $out .= " \@_ ? (\$i = shift) : return $pre\$r->$elem$pst;\n";
+ $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n";
$sel = "->[\$i]";
}
elsif( defined $hashes{$name} ){
$out .= " my \$i;\n";
- $out .= " \@_ ? (\$i = shift) : return $pre\$r->$elem$pst;\n";
+ $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n";
$sel = "->{\$i}";
}
elsif( defined $classes{$name} ){
@@ -297,6 +310,11 @@ flexible.
The class created by C<struct> must not be a subclass of another
class other than C<UNIVERSAL>.
+It can, however, be used as a superclass for other classes. To facilitate
+this, the generated constructor method uses a two-argument blessing.
+Furthermore, if the class is hash-based, the key of each element is
+prefixed with the class name (see I<Perl Cookbook>, Recipe 13.12).
+
A function named C<new> must not be explicitly defined in a class
created by C<struct>.
@@ -323,7 +341,8 @@ on the declared type of the element.
=item Scalar (C<'$'> or C<'*$'>)
-The element is a scalar, and is initialized to C<undef>.
+The element is a scalar, and by default is initialized to C<undef>
+(but see L<Initializing with new>).
The accessor's argument, if any, is assigned to the element.
@@ -333,10 +352,11 @@ to the element is returned.
=item Array (C<'@'> or C<'*@'>)
-The element is an array, initialized to C<()>.
+The element is an array, initialized by default to C<()>.
With no argument, the accessor returns a reference to the
-element's whole array.
+element's whole array (whether or not the element was
+specified as C<'@'> or C<'*@'>).
With one or two arguments, the first argument is an index
specifying one element of the array; the second argument, if
@@ -347,10 +367,11 @@ returned.
=item Hash (C<'%'> or C<'*%'>)
-The element is a hash, initialized to C<()>.
+The element is a hash, initialized by default to C<()>.
With no argument, the accessor returns a reference to the
-element's whole hash.
+element's whole hash (whether or not the element was
+specified as C<'%'> or C<'*%'>).
With one or two arguments, the first argument is a key specifying
one element of the hash; the second argument, if present, is
@@ -374,6 +395,23 @@ starts with a C<'*'>, a reference to the element itself is returned.
=back
+=head2 Initializing with C<new>
+
+C<struct> always creates a constructor called C<new>. That constructor
+may take a list of initializers for the various elements of the new
+struct.
+
+Each initializer is a pair of values: I<element name>C< =E<gt> >I<value>.
+The initializer value for a scalar element is just a scalar value. The
+initializer for an array element is an array reference. The initializer
+for a hash is a hash reference.
+
+The initializer for a class element is also a hash reference, and the
+contents of that hash are passed to the element's own constructor.
+
+See Example 3 below for an example of initialization.
+
+
=head1 EXAMPLES
=over
@@ -399,8 +437,8 @@ type C<timeval>.
# create an object:
my $t = new rusage;
- # $t->ru_utime and $t->ru_stime are objects of type timeval.
+ # $t->ru_utime and $t->ru_stime are objects of type timeval.
# set $t->ru_utime to 100.0 sec and $t->ru_stime to 5.0 sec.
$t->ru_utime->tv_secs(100);
$t->ru_utime->tv_usecs(0);
@@ -418,10 +456,10 @@ accessor accordingly.
package MyObj;
use Class::Struct;
- # declare the struct
+ # declare the struct
struct ( 'MyObj', { count => '$', stuff => '%' } );
- # override the default accessor method for 'count'
+ # override the default accessor method for 'count'
sub count {
my $self = shift;
if ( @_ ) {
@@ -443,10 +481,68 @@ accessor accordingly.
print "\$x->count(-5) = ", $x->count(-5), "\n";
# dies due to negative argument!
+=item Example 3
+
+The constructor of a generated class can be passed a list
+of I<element>=>I<value> pairs, with which to initialize the struct.
+If no initializer is specified for a particular element, its default
+initialization is performed instead. Initializers for non-existent
+elements are silently ignored.
+
+Note that the initializer for a nested struct is specified
+as an anonymous hash of initializers, which is passed on to the nested
+struct's constructor.
+
+
+ use Class::Struct;
+
+ struct Breed =>
+ {
+ name => '$',
+ cross => '$',
+ };
+
+ struct Cat =>
+ [
+ name => '$',
+ kittens => '@',
+ markings => '%',
+ breed => 'Breed',
+ ];
+
+
+ my $cat = Cat->new( name => 'Socks',
+ kittens => ['Monica', 'Kenneth'],
+ markings => { socks=>1, blaze=>"white" },
+ breed => { name=>'short-hair', cross=>1 },
+ );
+
+ print "Once a cat called ", $cat->name, "\n";
+ print "(which was a ", $cat->breed->name, ")\n";
+ print "had two kittens: ", join(' and ', @{$cat->kittens}), "\n";
+
+=back
=head1 Author and Modification History
+Modified by Damian Conway, 1999-03-05, v0.58.
+
+ Added handling of hash-like arg list to class ctor.
+
+ Changed to two-argument blessing in ctor to support
+ derivation from created classes.
+
+ Added classname prefixes to keys in hash-based classes
+ (refer to "Perl Cookbook", Recipe 13.12 for rationale).
+
+ Corrected behaviour of accessors for '*@' and '*%' struct
+ elements. Package now implements documented behaviour when
+ returning a reference to an entire hash or array element.
+ Previously these were returned as a reference to a reference
+ to the element.
+
+
Renamed to C<Class::Struct> and modified by Jim Miner, 1997-04-02.
members() function removed.
diff --git a/contrib/perl5/lib/Cwd.pm b/contrib/perl5/lib/Cwd.pm
index 5c10e8e..9a92829 100644
--- a/contrib/perl5/lib/Cwd.pm
+++ b/contrib/perl5/lib/Cwd.pm
@@ -20,7 +20,7 @@ getcwd - get pathname of current working directory
chdir "/tmp";
print $ENV{'PWD'};
- use Cwd 'abs_path';
+ use Cwd 'abs_path'; # aka realpath()
print abs_path($ENV{'PWD'});
use Cwd 'fast_abs_path';
@@ -32,8 +32,11 @@ The getcwd() function re-implements the getcwd(3) (or getwd(3)) functions
in Perl.
The abs_path() function takes a single argument and returns the
-absolute pathname for that argument. It uses the same algorithm as
-getcwd(). (actually getcwd() is abs_path("."))
+absolute pathname for that argument. It uses the same algorithm
+as getcwd(). (Actually, getcwd() is abs_path(".")) Symbolic links
+and relative-path components ("." and "..") are resolved to return
+the canonical pathname, just like realpath(3). Also callable as
+realpath().
The fastcwd() function looks the same as getcwd(), but runs faster.
It's also more dangerous because it might conceivably chdir() you out
@@ -67,12 +70,12 @@ kept up to date if all packages which use chdir import it from Cwd.
use Carp;
-$VERSION = '2.01';
+$VERSION = '2.02';
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
-@EXPORT_OK = qw(chdir abs_path fast_abs_path);
+@EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath);
# The 'natural and safe form' for UNIX (pwd may be setuid root)
@@ -105,9 +108,6 @@ sub getcwd
# This is a faster version of getcwd. It's also more dangerous because
# you might chdir out of a directory that you can't chdir back into.
-# List of metachars taken from do_exec() in doio.c
-my $quoted_shell_meta = quotemeta('$&*(){}[]";\\|?<>~`'."'\n");
-
sub fastcwd {
my($odev, $oino, $cdev, $cino, $tdev, $tino);
my(@path, $path);
@@ -136,9 +136,10 @@ sub fastcwd {
unshift(@path, $direntry);
}
$path = '/' . join('/', @path);
+ if ($^O eq 'apollo') { $path = "/".$path; }
# At this point $path may be tainted (if tainting) and chdir would fail.
# To be more useful we untaint it then check that we landed where we started.
- $path = $1 if $path =~ /^(.*)$/; # untaint
+ $path = $1 if $path =~ /^(.*)\z/s; # untaint
CORE::chdir($path) || return undef;
($cdev, $cino) = stat('.');
die "Unstable directory path, current directory changed unexpectedly"
@@ -166,7 +167,7 @@ sub chdir_init {
$ENV{'PWD'} = cwd();
}
# Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
- if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) {
+ if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
my($pd,$pi) = stat($2);
my($dd,$di) = stat($1);
if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
@@ -183,7 +184,7 @@ sub chdir {
return 0 unless CORE::chdir $newdir;
if ($^O eq 'VMS') { return $ENV{'PWD'} = $ENV{'DEFAULT'} }
- if ($newdir =~ m#^/#) {
+ if ($newdir =~ m#^/#s) {
$ENV{'PWD'} = $newdir;
} else {
my @curdir = split(m#/#,$ENV{'PWD'});
@@ -256,6 +257,10 @@ sub abs_path
$cwd;
}
+# added function alias for those of us more
+# used to the libc function. --tchrist 27-Jan-00
+*realpath = \&abs_path;
+
sub fast_abs_path {
my $cwd = getcwd();
my $path = shift || '.';
@@ -265,6 +270,10 @@ sub fast_abs_path {
$realpath;
}
+# added function alias to follow principle of least surprise
+# based on previous aliasing. --tchrist 27-Jan-00
+*fast_realpath = \&fast_abs_path;
+
# --- PORTING SECTION ---
@@ -330,7 +339,7 @@ sub _qnx_abs_path {
}
{
- local $^W = 0; # assignments trigger 'subroutine redefined' warning
+ no warnings; # assignments trigger 'subroutine redefined' warning
if ($^O eq 'VMS') {
*cwd = \&_vms_cwd;
@@ -371,6 +380,12 @@ sub _qnx_abs_path {
*abs_path = \&_qnx_abs_path;
*fast_abs_path = \&_qnx_abs_path;
}
+ elsif ($^O eq 'cygwin') {
+ *getcwd = \&cwd;
+ *fastgetcwd = \&cwd;
+ *fastcwd = \&cwd;
+ *abs_path = \&fast_abs_path;
+ }
}
# package main; eval join('',<DATA>) || die $@; # quick test
diff --git a/contrib/perl5/lib/DB.pm b/contrib/perl5/lib/DB.pm
new file mode 100644
index 0000000..711acc0
--- /dev/null
+++ b/contrib/perl5/lib/DB.pm
@@ -0,0 +1,802 @@
+#
+# Documentation is at the __END__
+#
+
+package DB;
+
+# "private" globals
+
+my ($running, $ready, $deep, $usrctxt, $evalarg,
+ @stack, @saved, @skippkg, @clients);
+my $preeval = {};
+my $posteval = {};
+my $ineval = {};
+
+####
+#
+# Globals - must be defined at startup so that clients can refer to
+# them right after a C<require DB;>
+#
+####
+
+BEGIN {
+
+ # these are hardcoded in perl source (some are magical)
+
+ $DB::sub = ''; # name of current subroutine
+ %DB::sub = (); # "filename:fromline-toline" for every known sub
+ $DB::single = 0; # single-step flag (set it to 1 to enable stops in BEGIN/use)
+ $DB::signal = 0; # signal flag (will cause a stop at the next line)
+ $DB::trace = 0; # are we tracing through subroutine calls?
+ @DB::args = (); # arguments of current subroutine or @ARGV array
+ @DB::dbline = (); # list of lines in currently loaded file
+ %DB::dbline = (); # actions in current file (keyed by line number)
+ @DB::ret = (); # return value of last sub executed in list context
+ $DB::ret = ''; # return value of last sub executed in scalar context
+
+ # other "public" globals
+
+ $DB::package = ''; # current package space
+ $DB::filename = ''; # current filename
+ $DB::subname = ''; # currently executing sub (fullly qualified name)
+ $DB::lineno = ''; # current line number
+
+ $DB::VERSION = $DB::VERSION = '1.0';
+
+ # initialize private globals to avoid warnings
+
+ $running = 1; # are we running, or are we stopped?
+ @stack = (0);
+ @clients = ();
+ $deep = 100;
+ $ready = 0;
+ @saved = ();
+ @skippkg = ();
+ $usrctxt = '';
+ $evalarg = '';
+}
+
+####
+# entry point for all subroutine calls
+#
+sub sub {
+ push(@stack, $DB::single);
+ $DB::single &= 1;
+ $DB::single |= 4 if $#stack == $deep;
+# print $DB::sub, "\n";
+ if ($DB::sub =~ /(?:^|::)DESTROY$/ or not defined wantarray) {
+ &$DB::sub;
+ $DB::single |= pop(@stack);
+ $DB::ret = undef;
+ }
+ elsif (wantarray) {
+ @DB::ret = &$DB::sub;
+ $DB::single |= pop(@stack);
+ @DB::ret;
+ }
+ else {
+ $DB::ret = &$DB::sub;
+ $DB::single |= pop(@stack);
+ $DB::ret;
+ }
+}
+
+####
+# this is called by perl for every statement
+#
+sub DB {
+ return unless $ready;
+ &save;
+ ($DB::package, $DB::filename, $DB::lineno) = caller;
+
+ return if @skippkg and grep { $_ eq $DB::package } @skippkg;
+
+ $usrctxt = "package $DB::package;"; # this won't let them modify, alas
+ local(*DB::dbline) = "::_<$DB::filename";
+ my ($stop, $action);
+ if (($stop,$action) = split(/\0/,$DB::dbline{$DB::lineno})) {
+ if ($stop eq '1') {
+ $DB::signal |= 1;
+ }
+ else {
+ $stop = 0 unless $stop; # avoid un_init warning
+ $evalarg = "\$DB::signal |= do { $stop; }"; &eval;
+ $DB::dbline{$DB::lineno} =~ s/;9($|\0)/$1/; # clear any temp breakpt
+ }
+ }
+ if ($DB::single || $DB::trace || $DB::signal) {
+ $DB::subname = ($DB::sub =~ /\'|::/) ? $DB::sub : "${DB::package}::$DB::sub"; #';
+ DB->loadfile($DB::filename, $DB::lineno);
+ }
+ $evalarg = $action, &eval if $action;
+ if ($DB::single || $DB::signal) {
+ _outputall($#stack . " levels deep in subroutine calls.\n") if $DB::single & 4;
+ $DB::single = 0;
+ $DB::signal = 0;
+ $running = 0;
+
+ &eval if ($evalarg = DB->prestop);
+ my $c;
+ for $c (@clients) {
+ # perform any client-specific prestop actions
+ &eval if ($evalarg = $c->cprestop);
+
+ # Now sit in an event loop until something sets $running
+ do {
+ $c->idle; # call client event loop; must not block
+ if ($running == 2) { # client wants something eval-ed
+ &eval if ($evalarg = $c->evalcode);
+ $running = 0;
+ }
+ } until $running;
+
+ # perform any client-specific poststop actions
+ &eval if ($evalarg = $c->cpoststop);
+ }
+ &eval if ($evalarg = DB->poststop);
+ }
+ ($@, $!, $,, $/, $\, $^W) = @saved;
+ ();
+}
+
+####
+# this takes its argument via $evalarg to preserve current @_
+#
+sub eval {
+ ($@, $!, $,, $/, $\, $^W) = @saved;
+ eval "$usrctxt $evalarg; &DB::save";
+ _outputall($@) if $@;
+}
+
+###############################################################################
+# no compile-time subroutine call allowed before this point #
+###############################################################################
+
+use strict; # this can run only after DB() and sub() are defined
+
+sub save {
+ @saved = ($@, $!, $,, $/, $\, $^W);
+ $, = ""; $/ = "\n"; $\ = ""; $^W = 0;
+}
+
+sub catch {
+ for (@clients) { $_->awaken; }
+ $DB::signal = 1;
+ $ready = 1;
+}
+
+####
+#
+# Client callable (read inheritable) methods defined after this point
+#
+####
+
+sub register {
+ my $s = shift;
+ $s = _clientname($s) if ref($s);
+ push @clients, $s;
+}
+
+sub done {
+ my $s = shift;
+ $s = _clientname($s) if ref($s);
+ @clients = grep {$_ ne $s} @clients;
+ $s->cleanup;
+# $running = 3 unless @clients;
+ exit(0) unless @clients;
+}
+
+sub _clientname {
+ my $name = shift;
+ "$name" =~ /^(.+)=[A-Z]+\(.+\)$/;
+ return $1;
+}
+
+sub next {
+ my $s = shift;
+ $DB::single = 2;
+ $running = 1;
+}
+
+sub step {
+ my $s = shift;
+ $DB::single = 1;
+ $running = 1;
+}
+
+sub cont {
+ my $s = shift;
+ my $i = shift;
+ $s->set_tbreak($i) if $i;
+ for ($i = 0; $i <= $#stack;) {
+ $stack[$i++] &= ~1;
+ }
+ $DB::single = 0;
+ $running = 1;
+}
+
+####
+# XXX caller must experimentally determine $i (since it depends
+# on how many client call frames are between this call and the DB call).
+# Such is life.
+#
+sub ret {
+ my $s = shift;
+ my $i = shift; # how many levels to get to DB sub
+ $i = 0 unless defined $i;
+ $stack[$#stack-$i] |= 1;
+ $DB::single = 0;
+ $running = 1;
+}
+
+####
+# XXX caller must experimentally determine $start (since it depends
+# on how many client call frames are between this call and the DB call).
+# Such is life.
+#
+sub backtrace {
+ my $self = shift;
+ my $start = shift;
+ my($p,$f,$l,$s,$h,$w,$e,$r,$a, @a, @ret,$i);
+ $start = 1 unless $start;
+ for ($i = $start; ($p,$f,$l,$s,$h,$w,$e,$r) = caller($i); $i++) {
+ @a = @DB::args;
+ for (@a) {
+ s/'/\\'/g;
+ s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/;
+ s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
+ s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
+ }
+ $w = $w ? '@ = ' : '$ = ';
+ $a = $h ? '(' . join(', ', @a) . ')' : '';
+ $e =~ s/\n\s*\;\s*\Z// if $e;
+ $e =~ s/[\\\']/\\$1/g if $e;
+ if ($r) {
+ $s = "require '$e'";
+ } elsif (defined $r) {
+ $s = "eval '$e'";
+ } elsif ($s eq '(eval)') {
+ $s = "eval {...}";
+ }
+ $f = "file `$f'" unless $f eq '-e';
+ push @ret, "$w&$s$a from $f line $l";
+ last if $DB::signal;
+ }
+ return @ret;
+}
+
+sub _outputall {
+ my $c;
+ for $c (@clients) {
+ $c->output(@_);
+ }
+}
+
+sub trace_toggle {
+ my $s = shift;
+ $DB::trace = !$DB::trace;
+}
+
+
+####
+# without args: returns all defined subroutine names
+# with subname args: returns a listref [file, start, end]
+#
+sub subs {
+ my $s = shift;
+ if (@_) {
+ my(@ret) = ();
+ while (@_) {
+ my $name = shift;
+ push @ret, [$DB::sub{$name} =~ /^(.*)\:(\d+)-(\d+)$/]
+ if exists $DB::sub{$name};
+ }
+ return @ret;
+ }
+ return keys %DB::sub;
+}
+
+####
+# first argument is a filename whose subs will be returned
+# if a filename is not supplied, all subs in the current
+# filename are returned.
+#
+sub filesubs {
+ my $s = shift;
+ my $fname = shift;
+ $fname = $DB::filename unless $fname;
+ return grep { $DB::sub{$_} =~ /^$fname/ } keys %DB::sub;
+}
+
+####
+# returns a list of all filenames that DB knows about
+#
+sub files {
+ my $s = shift;
+ my(@f) = grep(m|^_<|, keys %main::);
+ return map { substr($_,2) } @f;
+}
+
+####
+# returns reference to an array holding the lines in currently
+# loaded file
+#
+sub lines {
+ my $s = shift;
+ return \@DB::dbline;
+}
+
+####
+# loadfile($file, $line)
+#
+sub loadfile {
+ my $s = shift;
+ my($file, $line) = @_;
+ if (!defined $main::{'_<' . $file}) {
+ my $try;
+ if (($try) = grep(m|^_<.*$file|, keys %main::)) {
+ $file = substr($try,2);
+ }
+ }
+ if (defined($main::{'_<' . $file})) {
+ my $c;
+# _outputall("Loading file $file..");
+ *DB::dbline = "::_<$file";
+ $DB::filename = $file;
+ for $c (@clients) {
+# print "2 ", $file, '|', $line, "\n";
+ $c->showfile($file, $line);
+ }
+ return $file;
+ }
+ return undef;
+}
+
+sub lineevents {
+ my $s = shift;
+ my $fname = shift;
+ my(%ret) = ();
+ my $i;
+ $fname = $DB::filename unless $fname;
+ local(*DB::dbline) = "::_<$fname";
+ for ($i = 1; $i <= $#DB::dbline; $i++) {
+ $ret{$i} = [$DB::dbline[$i], split(/\0/, $DB::dbline{$i})]
+ if defined $DB::dbline{$i};
+ }
+ return %ret;
+}
+
+sub set_break {
+ my $s = shift;
+ my $i = shift;
+ my $cond = shift;
+ $i ||= $DB::lineno;
+ $cond ||= '1';
+ $i = _find_subline($i) if ($i =~ /\D/);
+ $s->output("Subroutine not found.\n") unless $i;
+ if ($i) {
+ if ($DB::dbline[$i] == 0) {
+ $s->output("Line $i not breakable.\n");
+ }
+ else {
+ $DB::dbline{$i} =~ s/^[^\0]*/$cond/;
+ }
+ }
+}
+
+sub set_tbreak {
+ my $s = shift;
+ my $i = shift;
+ $i = _find_subline($i) if ($i =~ /\D/);
+ $s->output("Subroutine not found.\n") unless $i;
+ if ($i) {
+ if ($DB::dbline[$i] == 0) {
+ $s->output("Line $i not breakable.\n");
+ }
+ else {
+ $DB::dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p.
+ }
+ }
+}
+
+sub _find_subline {
+ my $name = shift;
+ $name =~ s/\'/::/;
+ $name = "${DB::package}\:\:" . $name if $name !~ /::/;
+ $name = "main" . $name if substr($name,0,2) eq "::";
+ my($fname, $from, $to) = ($DB::sub{$name} =~ /^(.*):(\d+)-(\d+)$/);
+ if ($from) {
+ # XXX this needs local()-ization of some sort
+ *DB::dbline = "::_<$fname";
+ ++$from while $DB::dbline[$from] == 0 && $from < $to;
+ return $from;
+ }
+ return undef;
+}
+
+sub clr_breaks {
+ my $s = shift;
+ my $i;
+ if (@_) {
+ while (@_) {
+ $i = shift;
+ $i = _find_subline($i) if ($i =~ /\D/);
+ $s->output("Subroutine not found.\n") unless $i;
+ if (defined $DB::dbline{$i}) {
+ $DB::dbline{$i} =~ s/^[^\0]+//;
+ if ($DB::dbline{$i} =~ s/^\0?$//) {
+ delete $DB::dbline{$i};
+ }
+ }
+ }
+ }
+ else {
+ for ($i = 1; $i <= $#DB::dbline ; $i++) {
+ if (defined $DB::dbline{$i}) {
+ $DB::dbline{$i} =~ s/^[^\0]+//;
+ if ($DB::dbline{$i} =~ s/^\0?$//) {
+ delete $DB::dbline{$i};
+ }
+ }
+ }
+ }
+}
+
+sub set_action {
+ my $s = shift;
+ my $i = shift;
+ my $act = shift;
+ $i = _find_subline($i) if ($i =~ /\D/);
+ $s->output("Subroutine not found.\n") unless $i;
+ if ($i) {
+ if ($DB::dbline[$i] == 0) {
+ $s->output("Line $i not actionable.\n");
+ }
+ else {
+ $DB::dbline{$i} =~ s/\0[^\0]*//;
+ $DB::dbline{$i} .= "\0" . $act;
+ }
+ }
+}
+
+sub clr_actions {
+ my $s = shift;
+ my $i;
+ if (@_) {
+ while (@_) {
+ my $i = shift;
+ $i = _find_subline($i) if ($i =~ /\D/);
+ $s->output("Subroutine not found.\n") unless $i;
+ if ($i && $DB::dbline[$i] != 0) {
+ $DB::dbline{$i} =~ s/\0[^\0]*//;
+ delete $DB::dbline{$i} if $DB::dbline{$i} =~ s/^\0?$//;
+ }
+ }
+ }
+ else {
+ for ($i = 1; $i <= $#DB::dbline ; $i++) {
+ if (defined $DB::dbline{$i}) {
+ $DB::dbline{$i} =~ s/\0[^\0]*//;
+ delete $DB::dbline{$i} if $DB::dbline{$i} =~ s/^\0?$//;
+ }
+ }
+ }
+}
+
+sub prestop {
+ my ($client, $val) = @_;
+ return defined($val) ? $preeval->{$client} = $val : $preeval->{$client};
+}
+
+sub poststop {
+ my ($client, $val) = @_;
+ return defined($val) ? $posteval->{$client} = $val : $posteval->{$client};
+}
+
+#
+# "pure virtual" methods
+#
+
+# client-specific pre/post-stop actions.
+sub cprestop {}
+sub cpoststop {}
+
+# client complete startup
+sub awaken {}
+
+sub skippkg {
+ my $s = shift;
+ push @skippkg, @_ if @_;
+}
+
+sub evalcode {
+ my ($client, $val) = @_;
+ if (defined $val) {
+ $running = 2; # hand over to DB() to evaluate in its context
+ $ineval->{$client} = $val;
+ }
+ return $ineval->{$client};
+}
+
+sub ready {
+ my $s = shift;
+ return $ready = 1;
+}
+
+# stubs
+
+sub init {}
+sub stop {}
+sub idle {}
+sub cleanup {}
+sub output {}
+
+#
+# client init
+#
+for (@clients) { $_->init }
+
+$SIG{'INT'} = \&DB::catch;
+
+# disable this if stepping through END blocks is desired
+# (looks scary and deconstructivist with Swat)
+END { $ready = 0 }
+
+1;
+__END__
+
+=head1 NAME
+
+DB - programmatic interface to the Perl debugging API (draft, subject to
+change)
+
+=head1 SYNOPSIS
+
+ package CLIENT;
+ use DB;
+ @ISA = qw(DB);
+
+ # these (inherited) methods can be called by the client
+
+ CLIENT->register() # register a client package name
+ CLIENT->done() # de-register from the debugging API
+ CLIENT->skippkg('hide::hide') # ask DB not to stop in this package
+ CLIENT->cont([WHERE]) # run some more (until BREAK or another breakpt)
+ CLIENT->step() # single step
+ CLIENT->next() # step over
+ CLIENT->ret() # return from current subroutine
+ CLIENT->backtrace() # return the call stack description
+ CLIENT->ready() # call when client setup is done
+ CLIENT->trace_toggle() # toggle subroutine call trace mode
+ CLIENT->subs([SUBS]) # return subroutine information
+ CLIENT->files() # return list of all files known to DB
+ CLIENT->lines() # return lines in currently loaded file
+ CLIENT->loadfile(FILE,LINE) # load a file and let other clients know
+ CLIENT->lineevents() # return info on lines with actions
+ CLIENT->set_break([WHERE],[COND])
+ CLIENT->set_tbreak([WHERE])
+ CLIENT->clr_breaks([LIST])
+ CLIENT->set_action(WHERE,ACTION)
+ CLIENT->clr_actions([LIST])
+ CLIENT->evalcode(STRING) # eval STRING in executing code's context
+ CLIENT->prestop([STRING]) # execute in code context before stopping
+ CLIENT->poststop([STRING])# execute in code context before resuming
+
+ # These methods will be called at the appropriate times.
+ # Stub versions provided do nothing.
+ # None of these can block.
+
+ CLIENT->init() # called when debug API inits itself
+ CLIENT->stop(FILE,LINE) # when execution stops
+ CLIENT->idle() # while stopped (can be a client event loop)
+ CLIENT->cleanup() # just before exit
+ CLIENT->output(LIST) # called to print any output that API must show
+
+=head1 DESCRIPTION
+
+Perl debug information is frequently required not just by debuggers,
+but also by modules that need some "special" information to do their
+job properly, like profilers.
+
+This module abstracts and provides all of the hooks into Perl internal
+debugging functionality, so that various implementations of Perl debuggers
+(or packages that want to simply get at the "privileged" debugging data)
+can all benefit from the development of this common code. Currently used
+by Swat, the perl/Tk GUI debugger.
+
+Note that multiple "front-ends" can latch into this debugging API
+simultaneously. This is intended to facilitate things like
+debugging with a command line and GUI at the same time, debugging
+debuggers etc. [Sounds nice, but this needs some serious support -- GSAR]
+
+In particular, this API does B<not> provide the following functions:
+
+=over 4
+
+=item *
+
+data display
+
+=item *
+
+command processing
+
+=item *
+
+command alias management
+
+=item *
+
+user interface (tty or graphical)
+
+=back
+
+These are intended to be services performed by the clients of this API.
+
+This module attempts to be squeaky clean w.r.t C<use strict;> and when
+warnings are enabled.
+
+
+=head2 Global Variables
+
+The following "public" global names can be read by clients of this API.
+Beware that these should be considered "readonly".
+
+=over 8
+
+=item $DB::sub
+
+Name of current executing subroutine.
+
+=item %DB::sub
+
+The keys of this hash are the names of all the known subroutines. Each value
+is an encoded string that has the sprintf(3) format
+C<("%s:%d-%d", filename, fromline, toline)>.
+
+=item $DB::single
+
+Single-step flag. Will be true if the API will stop at the next statement.
+
+=item $DB::signal
+
+Signal flag. Will be set to a true value if a signal was caught. Clients may
+check for this flag to abort time-consuming operations.
+
+=item $DB::trace
+
+This flag is set to true if the API is tracing through subroutine calls.
+
+=item @DB::args
+
+Contains the arguments of current subroutine, or the C<@ARGV> array if in the
+toplevel context.
+
+=item @DB::dbline
+
+List of lines in currently loaded file.
+
+=item %DB::dbline
+
+Actions in current file (keys are line numbers). The values are strings that
+have the sprintf(3) format C<("%s\000%s", breakcondition, actioncode)>.
+
+=item $DB::package
+
+Package namespace of currently executing code.
+
+=item $DB::filename
+
+Currently loaded filename.
+
+=item $DB::subname
+
+Fully qualified name of currently executing subroutine.
+
+=item $DB::lineno
+
+Line number that will be executed next.
+
+=back
+
+=head2 API Methods
+
+The following are methods in the DB base class. A client must
+access these methods by inheritance (*not* by calling them directly),
+since the API keeps track of clients through the inheritance
+mechanism.
+
+=over 8
+
+=item CLIENT->register()
+
+register a client object/package
+
+=item CLIENT->evalcode(STRING)
+
+eval STRING in executing code context
+
+=item CLIENT->skippkg('D::hide')
+
+ask DB not to stop in these packages
+
+=item CLIENT->run()
+
+run some more (until a breakpt is reached)
+
+=item CLIENT->step()
+
+single step
+
+=item CLIENT->next()
+
+step over
+
+=item CLIENT->done()
+
+de-register from the debugging API
+
+=back
+
+=head2 Client Callback Methods
+
+The following "virtual" methods can be defined by the client. They will
+be called by the API at appropriate points. Note that unless specified
+otherwise, the debug API only defines empty, non-functional default versions
+of these methods.
+
+=over 8
+
+=item CLIENT->init()
+
+Called after debug API inits itself.
+
+=item CLIENT->prestop([STRING])
+
+Usually inherited from DB package. If no arguments are passed,
+returns the prestop action string.
+
+=item CLIENT->stop()
+
+Called when execution stops (w/ args file, line).
+
+=item CLIENT->idle()
+
+Called while stopped (can be a client event loop).
+
+=item CLIENT->poststop([STRING])
+
+Usually inherited from DB package. If no arguments are passed,
+returns the poststop action string.
+
+=item CLIENT->evalcode(STRING)
+
+Usually inherited from DB package. Ask for a STRING to be C<eval>-ed
+in executing code context.
+
+=item CLIENT->cleanup()
+
+Called just before exit.
+
+=item CLIENT->output(LIST)
+
+Called when API must show a message (warnings, errors etc.).
+
+
+=back
+
+
+=head1 BUGS
+
+The interface defined by this module is missing some of the later additions
+to perl's debugging functionality. As such, this interface should be considered
+highly experimental and subject to change.
+
+=head1 AUTHOR
+
+Gurusamy Sarathy gsar@activestate.com
+
+This code heavily adapted from an early version of perl5db.pl attributable
+to Larry Wall and the Perl Porters.
+
+=cut
diff --git a/contrib/perl5/lib/Dumpvalue.pm b/contrib/perl5/lib/Dumpvalue.pm
index 5bcd58f..475f4ff 100644
--- a/contrib/perl5/lib/Dumpvalue.pm
+++ b/contrib/perl5/lib/Dumpvalue.pm
@@ -1,7 +1,7 @@
-require 5.005; # For (defined ref) and $#$v
+use 5.005_64; # for (defined ref) and $#$v and our
package Dumpvalue;
use strict;
-use vars qw(%address *stab %subs);
+our(%address, $stab, @stab, %stab, %subs);
# translate control chars to ^X - Randal Schwartz
# Modifications to print types by Peter Gordon v1.0
@@ -91,7 +91,7 @@ sub stringify {
{ no strict 'refs';
$_ = &{'overload::StrVal'}($_)
if $self->{bareStringify} and ref $_
- and defined %overload:: and defined &{'overload::StrVal'};
+ and %overload:: and defined &{'overload::StrVal'};
}
if ($tick eq 'auto') {
@@ -162,7 +162,7 @@ sub unwrap {
my $val = $v;
{ no strict 'refs';
$val = &{'overload::StrVal'}($v)
- if defined %overload:: and defined &{'overload::StrVal'};
+ if %overload:: and defined &{'overload::StrVal'};
}
($address) = $val =~ /(0x[0-9a-f]+)\)$/ ;
if (!$self->{dumpReused} && defined $address) {
@@ -181,6 +181,13 @@ sub unwrap {
}
}
+ if (ref $v eq 'Regexp') {
+ my $re = "$v";
+ $re =~ s,/,\\/,g;
+ print "$sp-> qr/$re/\n";
+ return;
+ }
+
if ( UNIVERSAL::isa($v, 'HASH') ) {
my @sortKeys = sort keys(%$v) ;
my $more;
@@ -220,9 +227,9 @@ sub unwrap {
if ($self->{compactDump} && !grep(ref $_, @{$v})) {
if ($#$v >= 0) {
$short = $sp . "0..$#{$v} " .
- join(" ",
- map {$self->stringify($_)} @{$v}[0..$tArrayDepth])
- . "$shortmore";
+ join(" ",
+ map {exists $v->[$_] ? $self->stringify($v->[$_]) : "empty"} ($[..$tArrayDepth)
+ ) . "$shortmore";
} else {
$short = $sp . "empty array";
}
@@ -231,7 +238,11 @@ sub unwrap {
for my $num ($[ .. $tArrayDepth) {
return if $DB::signal and $self->{stopDbSignal};
print "$sp$num ";
- $self->DumpElem($v->[$num], $s);
+ if (exists $v->[$num]) {
+ $self->DumpElem($v->[$num], $s);
+ } else {
+ print "empty slot\n";
+ }
}
print "$sp empty array\n" unless @$v;
print "$sp$more" if defined $more ;
@@ -317,12 +328,12 @@ sub dumpglob {
print( (' ' x $off) . "\$", &unctrl($key), " = " );
$self->DumpElem($stab, 3+$off);
}
- if (($key !~ /^_</ or $self->{dumpDBFiles}) and defined @stab) {
+ if (($key !~ /^_</ or $self->{dumpDBFiles}) and @stab) {
print( (' ' x $off) . "\@$key = (\n" );
$self->unwrap(\@stab,3+$off) ;
print( (' ' x $off) . ")\n" );
}
- if ($key ne "main::" && $key ne "DB::" && defined %stab
+ if ($key ne "main::" && $key ne "DB::" && %stab
&& ($self->{dumpPackages} or $key !~ /::$/)
&& ($key !~ /^_</ or $self->{dumpDBFiles})
&& !($package eq "Dumpvalue" and $key eq "stab")) {
@@ -340,21 +351,35 @@ sub dumpglob {
}
}
+sub CvGV_name {
+ my $self = shift;
+ my $in = shift;
+ return if $self->{skipCvGV}; # Backdoor to avoid problems if XS broken...
+ $in = \&$in; # Hard reference...
+ eval {require Devel::Peek; 1} or return;
+ my $gv = Devel::Peek::CvGV($in) or return;
+ *$gv{PACKAGE} . '::' . *$gv{NAME};
+}
+
sub dumpsub {
my $self = shift;
my ($off,$sub) = @_;
+ my $ini = $sub;
+ my $s;
$sub = $1 if $sub =~ /^\{\*(.*)\}$/;
- my $subref = \&$sub;
- my $place = $DB::sub{$sub} || (($sub = $subs{"$subref"}) && $DB::sub{$sub})
- || ($self->{subdump} && ($sub = $self->findsubs("$subref"))
- && $DB::sub{$sub});
+ my $subref = defined $1 ? \&$sub : \&$ini;
+ my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s})
+ || (($s = $self->CvGV_name($subref)) && $DB::sub{$s})
+ || ($self->{subdump} && ($s = $self->findsubs("$subref"))
+ && $DB::sub{$s});
+ $s = $sub unless defined $s;
$place = '???' unless defined $place;
- print( (' ' x $off) . "&$sub in $place\n" );
+ print( (' ' x $off) . "&$s in $place\n" );
}
sub findsubs {
my $self = shift;
- return undef unless defined %DB::sub;
+ return undef unless %DB::sub;
my ($addr, $name, $loc);
while (($name, $loc) = each %DB::sub) {
$addr = \&$name;
@@ -383,7 +408,8 @@ sub dumpvars {
next if @vars && !grep( matchvar($key, $_), @vars );
if ($self->{usageOnly}) {
$self->globUsage(\$val, $key)
- unless $package eq 'Dumpvalue' and $key eq 'stab';
+ if ($package ne 'Dumpvalue' or $key ne 'stab')
+ and ref(\$val) eq 'GLOB';
} else {
$self->dumpglob($package, 0,$key, $val);
}
@@ -437,9 +463,9 @@ sub globUsage { # glob ref, name
local *stab = *{$_[0]};
my $total = 0;
$total += $self->scalarUsage($stab) if defined $stab;
- $total += $self->arrayUsage(\@stab, $_[1]) if defined @stab;
+ $total += $self->arrayUsage(\@stab, $_[1]) if @stab;
$total += $self->hashUsage(\%stab, $_[1])
- if defined %stab and $_[1] ne "main::" and $_[1] ne "DB::";
+ if %stab and $_[1] ne "main::" and $_[1] ne "DB::";
#and !($package eq "Dumpvalue" and $key eq "stab"));
$total;
}
@@ -450,7 +476,7 @@ sub globUsage { # glob ref, name
Dumpvalue - provides screen dump of Perl data.
-=head1 SYNOPSYS
+=head1 SYNOPSIS
use Dumpvalue;
my $dumper = new Dumpvalue;
diff --git a/contrib/perl5/lib/English.pm b/contrib/perl5/lib/English.pm
index 9f29a48..f6e3ec0 100644
--- a/contrib/perl5/lib/English.pm
+++ b/contrib/perl5/lib/English.pm
@@ -15,14 +15,6 @@ English - use nice English (or awk) names for ugly punctuation variables
=head1 DESCRIPTION
-You should I<not> use this module in programs intended to be portable
-among Perl versions, programs that must perform regular expression
-matching operations efficiently, or libraries intended for use with
-such programs. In a sense, this module is deprecated. The reasons
-for this have to do with implementation details of the Perl
-interpreter which are too thorny to go into here. Perhaps someday
-they will be fixed to make "C<use English>" more practical.
-
This module provides aliases for the built-in variables whose
names no one seems to like to read. Variables with side-effects
which get triggered just by accessing them (like $0) will still
@@ -35,9 +27,15 @@ $INPUT_RECORD_SEPARATOR if you are using the English module.
See L<perlvar> for a complete list of these.
+=head1 BUGS
+
+This module provokes sizeable inefficiencies for regular expressions,
+due to unfortunate implementation details. If performance matters,
+consider avoiding English.
+
=cut
-local $^W = 0;
+no warnings;
# Grandfather $NAME import
sub import {
@@ -98,6 +96,8 @@ sub import {
*WARNING
*EXECUTABLE_NAME
*OSNAME
+ *LAST_REGEXP_CODE_RESULT
+ *EXCEPTIONS_BEING_CAUGHT
);
# The ground of all being. @ARG is deprecated (5.005 makes @_ lexical)
@@ -166,13 +166,15 @@ sub import {
# Internals.
- *PERL_VERSION = *] ;
+ *PERL_VERSION = *^V ;
*ACCUMULATOR = *^A ;
*COMPILING = *^C ;
*DEBUGGING = *^D ;
*SYSTEM_FD_MAX = *^F ;
*INPLACE_EDIT = *^I ;
*PERLDB = *^P ;
+ *LAST_REGEXP_CODE_RESULT = *^R ;
+ *EXCEPTIONS_BEING_CAUGHT = *^S ;
*BASETIME = *^T ;
*WARNING = *^W ;
*EXECUTABLE_NAME = *^X ;
@@ -183,5 +185,6 @@ sub import {
# *ARRAY_BASE = *[ ;
# *OFMT = *# ;
# *MULTILINE_MATCHING = ** ;
+# *OLD_PERL_VERSION = *] ;
1;
diff --git a/contrib/perl5/lib/Env.pm b/contrib/perl5/lib/Env.pm
index b0afc3b..d1ee071 100644
--- a/contrib/perl5/lib/Env.pm
+++ b/contrib/perl5/lib/Env.pm
@@ -2,57 +2,96 @@ package Env;
=head1 NAME
-Env - perl module that imports environment variables
+Env - perl module that imports environment variables as scalars or arrays
=head1 SYNOPSIS
use Env;
use Env qw(PATH HOME TERM);
+ use Env qw($SHELL @LD_LIBRARY_PATH);
=head1 DESCRIPTION
-Perl maintains environment variables in a pseudo-hash named %ENV. For
+Perl maintains environment variables in a special hash named C<%ENV>. For
when this access method is inconvenient, the Perl module C<Env> allows
-environment variables to be treated as simple variables.
+environment variables to be treated as scalar or array variables.
-The Env::import() function ties environment variables with suitable
+The C<Env::import()> function ties environment variables with suitable
names to global Perl variables with the same names. By default it
-does so with all existing environment variables (C<keys %ENV>). If
-the import function receives arguments, it takes them to be a list of
-environment variables to tie; it's okay if they don't yet exist.
+ties all existing environment variables (C<keys %ENV>) to scalars. If
+the C<import> function receives arguments, it takes them to be a list of
+variables to tie; it's okay if they don't yet exist. The scalar type
+prefix '$' is inferred for any element of this list not prefixed by '$'
+or '@'. Arrays are implemented in terms of C<split> and C<join>, using
+C<$Config::Config{path_sep}> as the delimiter.
After an environment variable is tied, merely use it like a normal variable.
You may access its value
@path = split(/:/, $PATH);
+ print join("\n", @LD_LIBRARY_PATH), "\n";
or modify it
$PATH .= ":.";
+ push @LD_LIBRARY_PATH, $dir;
+
+however you'd like. Bear in mind, however, that each access to a tied array
+variable requires splitting the environment variable's string anew.
+
+The code:
+
+ use Env qw(@PATH);
+ push @PATH, '.';
+
+is equivalent to:
+
+ use Env qw(PATH);
+ $PATH .= ":.";
+
+except that if C<$ENV{PATH}> started out empty, the second approach leaves
+it with the (odd) value "C<:.>", but the first approach leaves it with "C<.>".
-however you'd like.
To remove a tied environment variable from
the environment, assign it the undefined value
undef $PATH;
+ undef @LD_LIBRARY_PATH;
+
+=head1 LIMITATIONS
+
+On VMS systems, arrays tied to environment variables are read-only. Attempting
+to change anything will cause a warning.
=head1 AUTHOR
Chip Salzenberg E<lt>F<chip@fin.uucp>E<gt>
+and
+Gregor N. Purdy E<lt>F<gregor@focusresearch.com>E<gt>
=cut
sub import {
my ($callpack) = caller(0);
my $pack = shift;
- my @vars = grep /^[A-Za-z_]\w*$/, (@_ ? @_ : keys(%ENV));
+ my @vars = grep /^[\$\@]?[A-Za-z_]\w*$/, (@_ ? @_ : keys(%ENV));
return unless @vars;
- eval "package $callpack; use vars qw("
- . join(' ', map { '$'.$_ } @vars) . ")";
+ @vars = map { m/^[\$\@]/ ? $_ : '$'.$_ } @vars;
+
+ eval "package $callpack; use vars qw(" . join(' ', @vars) . ")";
die $@ if $@;
foreach (@vars) {
- tie ${"${callpack}::$_"}, Env, $_;
+ my ($type, $name) = m/^([\$\@])(.*)$/;
+ if ($type eq '$') {
+ tie ${"${callpack}::$name"}, Env, $name;
+ } else {
+ if ($^O eq 'VMS') {
+ tie @{"${callpack}::$name"}, Env::Array::VMS, $name;
+ } else {
+ tie @{"${callpack}::$name"}, Env::Array, $name;
+ }
+ }
}
}
@@ -74,4 +113,121 @@ sub STORE {
}
}
+######################################################################
+
+package Env::Array;
+
+use Config;
+use Tie::Array;
+
+@ISA = qw(Tie::Array);
+
+my $sep = $Config::Config{path_sep};
+
+sub TIEARRAY {
+ bless \($_[1]);
+}
+
+sub FETCHSIZE {
+ my ($self) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ return scalar(@temp);
+}
+
+sub STORESIZE {
+ my ($self, $size) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ $#temp = $size - 1;
+ $ENV{$$self} = join($sep, @temp);
+}
+
+sub CLEAR {
+ my ($self) = @_;
+ $ENV{$$self} = '';
+}
+
+sub FETCH {
+ my ($self, $index) = @_;
+ return (split($sep, $ENV{$$self}))[$index];
+}
+
+sub STORE {
+ my ($self, $index, $value) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ $temp[$index] = $value;
+ $ENV{$$self} = join($sep, @temp);
+ return $value;
+}
+
+sub PUSH {
+ my $self = shift;
+ my @temp = split($sep, $ENV{$$self});
+ push @temp, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return scalar(@temp);
+}
+
+sub POP {
+ my ($self) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ my $result = pop @temp;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+}
+
+sub UNSHIFT {
+ my $self = shift;
+ my @temp = split($sep, $ENV{$$self});
+ my $result = unshift @temp, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+}
+
+sub SHIFT {
+ my ($self) = @_;
+ my @temp = split($sep, $ENV{$$self});
+ my $result = shift @temp;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+}
+
+sub SPLICE {
+ my $self = shift;
+ my $offset = shift;
+ my $length = shift;
+ my @temp = split($sep, $ENV{$$self});
+ if (wantarray) {
+ my @result = splice @temp, $self, $offset, $length, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return @result;
+ } else {
+ my $result = scalar splice @temp, $offset, $length, @_;
+ $ENV{$$self} = join($sep, @temp);
+ return $result;
+ }
+}
+
+######################################################################
+
+package Env::Array::VMS;
+use Tie::Array;
+
+@ISA = qw(Tie::Array);
+
+sub TIEARRAY {
+ bless \($_[1]);
+}
+
+sub FETCHSIZE {
+ my ($self) = @_;
+ my $i = 0;
+ while ($i < 127 and defined $ENV{$$self . ';' . $i}) { $i++; };
+ return $i;
+}
+
+sub FETCH {
+ my ($self, $index) = @_;
+ return $ENV{$$self . ';' . $index};
+}
+
1;
diff --git a/contrib/perl5/lib/Exporter.pm b/contrib/perl5/lib/Exporter.pm
index 3f42e40..585109e 100644
--- a/contrib/perl5/lib/Exporter.pm
+++ b/contrib/perl5/lib/Exporter.pm
@@ -2,227 +2,60 @@ package Exporter;
require 5.001;
-#
-# We go to a lot of trouble not to 'require Carp' at file scope,
-# because Carp requires Exporter, and something has to give.
-#
-
$ExportLevel = 0;
-$Verbose = 0 unless $Verbose;
-
-sub export {
+$Verbose ||= 0;
+$VERSION = '5.562';
- # First make import warnings look like they're coming from the "use".
- local $SIG{__WARN__} = sub {
- my $text = shift;
- if ($text =~ s/ at \S*Exporter.pm line \d+.*\n//) {
- require Carp;
- local $Carp::CarpLevel = 1; # ignore package calling us too.
- Carp::carp($text);
- }
- else {
- warn $text;
- }
- };
- local $SIG{__DIE__} = sub {
- require Carp;
- local $Carp::CarpLevel = 1; # ignore package calling us too.
- Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT")
- if $_[0] =~ /^Unable to create sub named "(.*?)::"/;
- };
-
- my($pkg, $callpkg, @imports) = @_;
- my($type, $sym, $oops);
- *exports = *{"${pkg}::EXPORT"};
-
- if (@imports) {
- if (!%exports) {
- grep(s/^&//, @exports);
- @exports{@exports} = (1) x @exports;
- my $ok = \@{"${pkg}::EXPORT_OK"};
- if (@$ok) {
- grep(s/^&//, @$ok);
- @exports{@$ok} = (1) x @$ok;
- }
- }
-
- if ($imports[0] =~ m#^[/!:]#){
- my $tagsref = \%{"${pkg}::EXPORT_TAGS"};
- my $tagdata;
- my %imports;
- my($remove, $spec, @names, @allexports);
- # negated first item implies starting with default set:
- unshift @imports, ':DEFAULT' if $imports[0] =~ m/^!/;
- foreach $spec (@imports){
- $remove = $spec =~ s/^!//;
-
- if ($spec =~ s/^://){
- if ($spec eq 'DEFAULT'){
- @names = @exports;
- }
- elsif ($tagdata = $tagsref->{$spec}) {
- @names = @$tagdata;
- }
- else {
- warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS];
- ++$oops;
- next;
- }
- }
- elsif ($spec =~ m:^/(.*)/$:){
- my $patn = $1;
- @allexports = keys %exports unless @allexports; # only do keys once
- @names = grep(/$patn/, @allexports); # not anchored by default
- }
- else {
- @names = ($spec); # is a normal symbol name
- }
-
- warn "Import ".($remove ? "del":"add").": @names "
- if $Verbose;
-
- if ($remove) {
- foreach $sym (@names) { delete $imports{$sym} }
- }
- else {
- @imports{@names} = (1) x @names;
- }
- }
- @imports = keys %imports;
- }
-
- foreach $sym (@imports) {
- if (!$exports{$sym}) {
- if ($sym =~ m/^\d/) {
- $pkg->require_version($sym);
- # If the version number was the only thing specified
- # then we should act as if nothing was specified:
- if (@imports == 1) {
- @imports = @exports;
- last;
- }
- # We need a way to emulate 'use Foo ()' but still
- # allow an easy version check: "use Foo 1.23, ''";
- if (@imports == 2 and !$imports[1]) {
- @imports = ();
- last;
- }
- } elsif ($sym !~ s/^&// || !$exports{$sym}) {
- require Carp;
- Carp::carp(qq["$sym" is not exported by the $pkg module]);
- $oops++;
- }
- }
- }
- if ($oops) {
- require Carp;
- Carp::croak("Can't continue after import errors");
- }
- }
- else {
- @imports = @exports;
- }
-
- *fail = *{"${pkg}::EXPORT_FAIL"};
- if (@fail) {
- if (!%fail) {
- # Build cache of symbols. Optimise the lookup by adding
- # barewords twice... both with and without a leading &.
- # (Technique could be applied to %exports cache at cost of memory)
- my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @fail;
- warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Verbose;
- @fail{@expanded} = (1) x @expanded;
- }
- my @failed;
- foreach $sym (@imports) { push(@failed, $sym) if $fail{$sym} }
- if (@failed) {
- @failed = $pkg->export_fail(@failed);
- foreach $sym (@failed) {
- require Carp;
- Carp::carp(qq["$sym" is not implemented by the $pkg module ],
- "on this architecture");
- }
- if (@failed) {
- require Carp;
- Carp::croak("Can't continue after import errors");
- }
- }
- }
-
- warn "Importing into $callpkg from $pkg: ",
- join(", ",sort @imports) if $Verbose;
-
- foreach $sym (@imports) {
- # shortcut for the common case of no type character
- (*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"}, next)
- unless $sym =~ s/^(\W)//;
- $type = $1;
- *{"${callpkg}::$sym"} =
- $type eq '&' ? \&{"${pkg}::$sym"} :
- $type eq '$' ? \${"${pkg}::$sym"} :
- $type eq '@' ? \@{"${pkg}::$sym"} :
- $type eq '%' ? \%{"${pkg}::$sym"} :
- $type eq '*' ? *{"${pkg}::$sym"} :
- do { require Carp; Carp::croak("Can't export symbol: $type$sym") };
- }
-}
-
-sub export_to_level
-{
- my $pkg = shift;
- my ($level, $junk) = (shift, shift); # need to get rid of first arg
- # we know it already.
- my $callpkg = caller($level);
- $pkg->export($callpkg, @_);
+sub export_to_level {
+ require Exporter::Heavy;
+ goto &heavy_export_to_level;
}
-sub import {
- my $pkg = shift;
- my $callpkg = caller($ExportLevel);
- export $pkg, $callpkg, @_;
+sub export {
+ require Exporter::Heavy;
+ goto &heavy_export;
}
-
-
-# Utility functions
-
-sub _push_tags {
- my($pkg, $var, $syms) = @_;
- my $nontag;
- *export_tags = \%{"${pkg}::EXPORT_TAGS"};
- push(@{"${pkg}::$var"},
- map { $export_tags{$_} ? @{$export_tags{$_}} : scalar(++$nontag,$_) }
- (@$syms) ? @$syms : keys %export_tags);
- if ($nontag and $^W) {
- # This may change to a die one day
- require Carp;
- Carp::carp("Some names are not tags");
- }
+sub export_tags {
+ require Exporter::Heavy;
+ _push_tags((caller)[0], "EXPORT", \@_);
}
-sub export_tags { _push_tags((caller)[0], "EXPORT", \@_) }
-sub export_ok_tags { _push_tags((caller)[0], "EXPORT_OK", \@_) }
-
-
-# Default methods
-
-sub export_fail {
- my $self = shift;
- @_;
+sub export_ok_tags {
+ require Exporter::Heavy;
+ _push_tags((caller)[0], "EXPORT_OK", \@_);
}
-sub require_version {
- my($self, $wanted) = @_;
- my $pkg = ref $self || $self;
- my $version = ${"${pkg}::VERSION"};
- if (!$version or $version < $wanted) {
- $version ||= "(undef)";
- my $file = $INC{"$pkg.pm"};
- $file &&= " ($file)";
- require Carp;
- Carp::croak("$pkg $wanted required--this is only version $version$file")
+sub import {
+ my $pkg = shift;
+ my $callpkg = caller($ExportLevel);
+ *exports = *{"$pkg\::EXPORT"};
+ # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-(
+ *fail = *{"$pkg\::EXPORT_FAIL"};
+ return export $pkg, $callpkg, @_
+ if $Verbose or $Debug or @fail > 1;
+ my $args = @_ or @_ = @exports;
+
+ if ($args and not %exports) {
+ foreach my $sym (@exports, @{"$pkg\::EXPORT_OK"}) {
+ $sym =~ s/^&//;
+ $exports{$sym} = 1;
}
- $version;
+ }
+ if ($Verbose or $Debug
+ or grep {/\W/ or $args and not exists $exports{$_}
+ or @fail and $_ eq $fail[0]
+ or (@{"$pkg\::EXPORT_OK"}
+ and $_ eq ${"$pkg\::EXPORT_OK"}[0])} @_) {
+ return export $pkg, $callpkg, ($args ? @_ : ());
+ }
+ #local $SIG{__WARN__} = sub {require Carp; goto &Carp::carp};
+ local $SIG{__WARN__} =
+ sub {require Carp; local $Carp::CarpLevel = 1; &Carp::carp};
+ foreach $sym (@_) {
+ # shortcut for the common case of no type character
+ *{"$callpkg\::$sym"} = \&{"$pkg\::$sym"};
+ }
}
1;
@@ -286,6 +119,18 @@ in L<perlfunc> and L<perlmod>. Understanding the concept of
modules and how the C<use> statement operates is important to
understanding the Exporter.
+=head2 How to Export
+
+The arrays C<@EXPORT> and C<@EXPORT_OK> in a module hold lists of
+symbols that are going to be exported into the users name space by
+default, or which they can request to be exported, respectively. The
+symbols can represent functions, scalars, arrays, hashes, or typeglobs.
+The symbols must be given by full name with the exception that the
+ampersand in front of a function is optional, e.g.
+
+ @EXPORT = qw(afunc $scalar @array); # afunc is a function
+ @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc
+
=head2 Selecting What To Export
Do B<not> export method names!
@@ -364,11 +209,12 @@ Exporter has a special method, 'export_to_level' which is used in situations
where you can't directly call Export's import method. The export_to_level
method looks like:
-MyPackage->export_to_level($where_to_export, @what_to_export);
+MyPackage->export_to_level($where_to_export, $package, @what_to_export);
where $where_to_export is an integer telling how far up the calling stack
to export your symbols, and @what_to_export is an array telling what
-symbols *to* export (usually this is @_).
+symbols *to* export (usually this is @_). The $package argument is
+currently unused.
For example, suppose that you have a module, A, which already has an
import function:
diff --git a/contrib/perl5/lib/Exporter/Heavy.pm b/contrib/perl5/lib/Exporter/Heavy.pm
new file mode 100644
index 0000000..6647f70
--- /dev/null
+++ b/contrib/perl5/lib/Exporter/Heavy.pm
@@ -0,0 +1,225 @@
+package Exporter;
+
+=head1 NAME
+
+Exporter::Heavy - Exporter guts
+
+=head1 SYNOPIS
+
+(internal use only)
+
+=head1 DESCRIPTION
+
+No user-serviceable parts inside.
+
+=cut
+#
+# We go to a lot of trouble not to 'require Carp' at file scope,
+# because Carp requires Exporter, and something has to give.
+#
+
+sub heavy_export {
+
+ # First make import warnings look like they're coming from the "use".
+ local $SIG{__WARN__} = sub {
+ my $text = shift;
+ if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//) {
+ require Carp;
+ local $Carp::CarpLevel = 1; # ignore package calling us too.
+ Carp::carp($text);
+ }
+ else {
+ warn $text;
+ }
+ };
+ local $SIG{__DIE__} = sub {
+ require Carp;
+ local $Carp::CarpLevel = 1; # ignore package calling us too.
+ Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT")
+ if $_[0] =~ /^Unable to create sub named "(.*?)::"/;
+ };
+
+ my($pkg, $callpkg, @imports) = @_;
+ my($type, $sym, $oops);
+ *exports = *{"${pkg}::EXPORT"};
+
+ if (@imports) {
+ if (!%exports) {
+ grep(s/^&//, @exports);
+ @exports{@exports} = (1) x @exports;
+ my $ok = \@{"${pkg}::EXPORT_OK"};
+ if (@$ok) {
+ grep(s/^&//, @$ok);
+ @exports{@$ok} = (1) x @$ok;
+ }
+ }
+
+ if ($imports[0] =~ m#^[/!:]#){
+ my $tagsref = \%{"${pkg}::EXPORT_TAGS"};
+ my $tagdata;
+ my %imports;
+ my($remove, $spec, @names, @allexports);
+ # negated first item implies starting with default set:
+ unshift @imports, ':DEFAULT' if $imports[0] =~ m/^!/;
+ foreach $spec (@imports){
+ $remove = $spec =~ s/^!//;
+
+ if ($spec =~ s/^://){
+ if ($spec eq 'DEFAULT'){
+ @names = @exports;
+ }
+ elsif ($tagdata = $tagsref->{$spec}) {
+ @names = @$tagdata;
+ }
+ else {
+ warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS];
+ ++$oops;
+ next;
+ }
+ }
+ elsif ($spec =~ m:^/(.*)/$:){
+ my $patn = $1;
+ @allexports = keys %exports unless @allexports; # only do keys once
+ @names = grep(/$patn/, @allexports); # not anchored by default
+ }
+ else {
+ @names = ($spec); # is a normal symbol name
+ }
+
+ warn "Import ".($remove ? "del":"add").": @names "
+ if $Verbose;
+
+ if ($remove) {
+ foreach $sym (@names) { delete $imports{$sym} }
+ }
+ else {
+ @imports{@names} = (1) x @names;
+ }
+ }
+ @imports = keys %imports;
+ }
+
+ foreach $sym (@imports) {
+ if (!$exports{$sym}) {
+ if ($sym =~ m/^\d/) {
+ $pkg->require_version($sym);
+ # If the version number was the only thing specified
+ # then we should act as if nothing was specified:
+ if (@imports == 1) {
+ @imports = @exports;
+ last;
+ }
+ # We need a way to emulate 'use Foo ()' but still
+ # allow an easy version check: "use Foo 1.23, ''";
+ if (@imports == 2 and !$imports[1]) {
+ @imports = ();
+ last;
+ }
+ } elsif ($sym !~ s/^&// || !$exports{$sym}) {
+ require Carp;
+ Carp::carp(qq["$sym" is not exported by the $pkg module]);
+ $oops++;
+ }
+ }
+ }
+ if ($oops) {
+ require Carp;
+ Carp::croak("Can't continue after import errors");
+ }
+ }
+ else {
+ @imports = @exports;
+ }
+
+ *fail = *{"${pkg}::EXPORT_FAIL"};
+ if (@fail) {
+ if (!%fail) {
+ # Build cache of symbols. Optimise the lookup by adding
+ # barewords twice... both with and without a leading &.
+ # (Technique could be applied to %exports cache at cost of memory)
+ my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @fail;
+ warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Verbose;
+ @fail{@expanded} = (1) x @expanded;
+ }
+ my @failed;
+ foreach $sym (@imports) { push(@failed, $sym) if $fail{$sym} }
+ if (@failed) {
+ @failed = $pkg->export_fail(@failed);
+ foreach $sym (@failed) {
+ require Carp;
+ Carp::carp(qq["$sym" is not implemented by the $pkg module ],
+ "on this architecture");
+ }
+ if (@failed) {
+ require Carp;
+ Carp::croak("Can't continue after import errors");
+ }
+ }
+ }
+
+ warn "Importing into $callpkg from $pkg: ",
+ join(", ",sort @imports) if $Verbose;
+
+ foreach $sym (@imports) {
+ # shortcut for the common case of no type character
+ (*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"}, next)
+ unless $sym =~ s/^(\W)//;
+ $type = $1;
+ *{"${callpkg}::$sym"} =
+ $type eq '&' ? \&{"${pkg}::$sym"} :
+ $type eq '$' ? \${"${pkg}::$sym"} :
+ $type eq '@' ? \@{"${pkg}::$sym"} :
+ $type eq '%' ? \%{"${pkg}::$sym"} :
+ $type eq '*' ? *{"${pkg}::$sym"} :
+ do { require Carp; Carp::croak("Can't export symbol: $type$sym") };
+ }
+}
+
+sub heavy_export_to_level
+{
+ my $pkg = shift;
+ my $level = shift;
+ (undef) = shift; # XXX redundant arg
+ my $callpkg = caller($level);
+ $pkg->export($callpkg, @_);
+}
+
+# Utility functions
+
+sub _push_tags {
+ my($pkg, $var, $syms) = @_;
+ my $nontag;
+ *export_tags = \%{"${pkg}::EXPORT_TAGS"};
+ push(@{"${pkg}::$var"},
+ map { $export_tags{$_} ? @{$export_tags{$_}} : scalar(++$nontag,$_) }
+ (@$syms) ? @$syms : keys %export_tags);
+ if ($nontag and $^W) {
+ # This may change to a die one day
+ require Carp;
+ Carp::carp("Some names are not tags");
+ }
+}
+
+# Default methods
+
+sub export_fail {
+ my $self = shift;
+ @_;
+}
+
+sub require_version {
+ my($self, $wanted) = @_;
+ my $pkg = ref $self || $self;
+ my $version = ${"${pkg}::VERSION"};
+ if (!$version or $version < $wanted) {
+ $version ||= "(undef)";
+ # %INC contains slashes, but $pkg contains double-colons.
+ my $file = (map {s,::,/,g; $INC{$_}} "$pkg.pm")[0];
+ $file &&= " ($file)";
+ require Carp;
+ Carp::croak("$pkg $wanted required--this is only version $version$file")
+ }
+ $version;
+}
+
+1;
diff --git a/contrib/perl5/lib/ExtUtils/Command.pm b/contrib/perl5/lib/ExtUtils/Command.pm
index e900e51..bccc76c 100644
--- a/contrib/perl5/lib/ExtUtils/Command.pm
+++ b/contrib/perl5/lib/ExtUtils/Command.pm
@@ -1,4 +1,6 @@
package ExtUtils::Command;
+
+use 5.005_64;
use strict;
# use AutoLoader;
use Carp;
@@ -7,7 +9,7 @@ use File::Compare;
use File::Basename;
use File::Path qw(rmtree);
require Exporter;
-use vars qw(@ISA @EXPORT $VERSION);
+our(@ISA, @EXPORT, $VERSION);
@ISA = qw(Exporter);
@EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f);
$VERSION = '1.01';
diff --git a/contrib/perl5/lib/ExtUtils/Embed.pm b/contrib/perl5/lib/ExtUtils/Embed.pm
index 4b56e88..b649b6b 100644
--- a/contrib/perl5/lib/ExtUtils/Embed.pm
+++ b/contrib/perl5/lib/ExtUtils/Embed.pm
@@ -51,7 +51,7 @@ sub xsinit {
my($file, $std, $mods) = @_;
my($fh,@mods,%seen);
$file ||= "perlxsi.c";
- my $xsinit_proto = is_perl_object() ? "CPERLarg" : "void";
+ my $xsinit_proto = "pTHXo";
if (@_) {
@mods = @$mods if $mods;
@@ -75,7 +75,7 @@ sub xsinit {
@mods = grep(!$seen{$_}++, @mods);
print $fh &xsi_header();
- print $fh "EXTERN_C void xs_init _(($xsinit_proto));\n\n";
+ print $fh "EXTERN_C void xs_init ($xsinit_proto);\n\n";
print $fh &xsi_protos(@mods);
print $fh "\nEXTERN_C void\nxs_init($xsinit_proto)\n{\n";
@@ -120,14 +120,13 @@ EOF
sub xsi_protos {
my(@exts) = @_;
my(@retval,%seen);
- my $boot_proto = is_perl_object() ?
- "CV* cv _CPERLarg" : "CV* cv";
+ my $boot_proto = "pTHXo_ CV* cv";
foreach $_ (@exts){
my($pname) = canon('/', $_);
my($mname, $cname);
($mname = $pname) =~ s!/!::!g;
($cname = $pname) =~ s!/!__!g;
- my($ccode) = "EXTERN_C void boot_${cname} _(($boot_proto));\n";
+ my($ccode) = "EXTERN_C void boot_${cname} ($boot_proto);\n";
next if $seen{$ccode}++;
push(@retval, $ccode);
}
@@ -333,7 +332,7 @@ B<[@modules]> is an array ref, same as additional arguments mentioned above.
This will generate code with an B<xs_init> function that glues the perl B<Socket::bootstrap> function
-to the C B<boot_Socket> function and writes it to a file named "xsinit.c".
+to the C B<boot_Socket> function and writes it to a file named F<xsinit.c>.
Note that B<DynaLoader> is a special case where it must call B<boot_DynaLoader> directly.
@@ -379,7 +378,7 @@ we should find B<auto/Socket/Socket.a>
When looking for B<DBD::Oracle> relative to a search path,
we should find B<auto/DBD/Oracle/Oracle.a>
-Keep in mind, you can always supply B</my/own/path/ModuleName.a>
+Keep in mind that you can always supply B</my/own/path/ModuleName.a>
as an additional linker argument.
B<--> E<lt>list of linker argsE<gt>
@@ -393,7 +392,7 @@ When invoked with parameters the following are accepted and optional:
C<ldopts($std,[@modules],[@link_args],$path)>
-Where,
+Where:
B<$std> is boolean, equivalent to the B<-std> option.
diff --git a/contrib/perl5/lib/ExtUtils/Install.pm b/contrib/perl5/lib/ExtUtils/Install.pm
index f75aa55..36c7221 100644
--- a/contrib/perl5/lib/ExtUtils/Install.pm
+++ b/contrib/perl5/lib/ExtUtils/Install.pm
@@ -1,12 +1,13 @@
package ExtUtils::Install;
+use 5.005_64;
+our(@ISA, @EXPORT, $VERSION);
$VERSION = substr q$Revision: 1.28 $, 10;
# $Date: 1998/01/25 07:08:24 $
use Exporter;
use Carp ();
use Config qw(%Config);
-use vars qw(@ISA @EXPORT $VERSION);
@ISA = ('Exporter');
@EXPORT = ('install','uninstall','pm_to_blib', 'install_default');
$Is_VMS = $^O eq 'VMS';
@@ -15,7 +16,7 @@ my $splitchar = $^O eq 'VMS' ? '|' : ($^O eq 'os2' || $^O eq 'dos') ? ';' : ':';
my @PERL_ENV_LIB = split $splitchar, defined $ENV{'PERL5LIB'} ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || '';
my $Inc_uninstall_warn_handler;
-#use vars qw( @EXPORT @ISA $Is_VMS );
+#our(@EXPORT, @ISA, $Is_VMS);
#use strict;
sub forceunlink {
@@ -67,7 +68,6 @@ sub install {
}
$packlist->read($pack{"read"}) if (-f $pack{"read"});
my $cwd = cwd();
- my $umask = umask 0 unless $Is_VMS;
my($source);
MOD_INSTALL: foreach $source (sort keys %hash) {
@@ -85,9 +85,7 @@ sub install {
exists $hash{"blib/arch"} and
directory_not_empty("blib/arch")) {
$targetroot = $hash{"blib/arch"};
- print "Files found in blib/arch --> Installing files in "
- . "blib/lib into architecture dependend library tree!\n"
- ; #if $verbose>1;
+ print "Files found in blib/arch: installing files in blib/lib into architecture dependent library tree\n";
}
chdir($source) or next;
find(sub {
@@ -136,7 +134,6 @@ sub install {
}, ".");
chdir($cwd) or Carp::croak("Couldn't chdir to $cwd: $!");
}
- umask $umask unless $Is_VMS;
if ($pack{'write'}) {
$dir = dirname($pack{'write'});
mkpath($dir,0,0755);
@@ -195,7 +192,6 @@ sub uninstall {
forceunlink($_) unless $nonono;
}
print "unlink $fil\n" if $verbose;
- close P;
forceunlink($fil) unless $nonono;
}
@@ -228,7 +224,7 @@ sub inc_uninstall {
if ($nonono) {
if ($verbose) {
$Inc_uninstall_warn_handler ||= new ExtUtils::Install::Warn;
- $libdir =~ s|^\./|| ; # That's just cosmetics, no need to port. It looks prettier.
+ $libdir =~ s|^\./||s ; # That's just cosmetics, no need to port. It looks prettier.
$Inc_uninstall_warn_handler->add("$libdir/$file",$targetfile);
}
# if not verbose, we just say nothing
@@ -261,7 +257,6 @@ sub pm_to_blib {
close(FROMTO);
}
- my $umask = umask 0022 unless $Is_VMS;
mkpath($autodir,0,0755);
foreach (keys %$fromto) {
next if -f $fromto->{$_} && -M $fromto->{$_} < -M $_;
@@ -279,10 +274,9 @@ sub pm_to_blib {
utime($atime,$mtime+$Is_VMS,$fromto->{$_});
chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$fromto->{$_});
print "cp $_ $fromto->{$_}\n";
- next unless /\.pm$/;
+ next unless /\.pm\z/;
autosplit($fromto->{$_},$autodir);
}
- umask $umask unless $Is_VMS;
}
package ExtUtils::Install::Warn;
@@ -345,7 +339,7 @@ There are two keys with a special meaning in the hash: "read" and
target files to the file named by C<$hashref-E<gt>{write}>. If there is
another file named by C<$hashref-E<gt>{read}>, the contents of this file will
be merged into the written file. The read and the written file may be
-identical, but on AFS it is quite likely, people are installing to a
+identical, but on AFS it is quite likely that people are installing to a
different directory than the one where the files later appear.
install_default() takes one or less arguments. If no arguments are
@@ -358,7 +352,7 @@ The argument-less form is convenient for install scripts like
perl -MExtUtils::Install -e install_default Tk/Canvas
-Assuming this command is executed in a directory with populated F<blib>
+Assuming this command is executed in a directory with a populated F<blib>
directory, it will proceed as if the F<blib> was build by MakeMaker on
this machine. This is useful for binary distributions.
diff --git a/contrib/perl5/lib/ExtUtils/Installed.pm b/contrib/perl5/lib/ExtUtils/Installed.pm
index dda594e..6961c6f 100644
--- a/contrib/perl5/lib/ExtUtils/Installed.pm
+++ b/contrib/perl5/lib/ExtUtils/Installed.pm
@@ -1,4 +1,6 @@
package ExtUtils::Installed;
+
+use 5.005_64;
use strict;
use Carp qw();
use ExtUtils::Packlist;
@@ -6,8 +8,7 @@ use ExtUtils::MakeMaker;
use Config;
use File::Find;
use File::Basename;
-use vars qw($VERSION);
-$VERSION = '0.02';
+our $VERSION = '0.02';
sub _is_type($$$)
{
@@ -56,7 +57,7 @@ my $self = {};
# Read the core packlist
$self->{Perl}{packlist} =
ExtUtils::Packlist->new("$Config{installarchlib}/.packlist");
-$self->{Perl}{version} = $];
+$self->{Perl}{version} = $Config{version};
# Read the module packlists
my $sub = sub
@@ -66,8 +67,8 @@ my $sub = sub
# Hack of the leading bits of the paths & convert to a module name
my $module = $File::Find::name;
- $module =~ s!$Config{archlib}/auto/(.*)/.packlist!$1!;
- $module =~ s!$Config{sitearch}/auto/(.*)/.packlist!$1!;
+ $module =~ s!$Config{archlib}/auto/(.*)/.packlist!$1!s;
+ $module =~ s!$Config{sitearch}/auto/(.*)/.packlist!$1!s;
my $modfile = "$module.pm";
$module =~ s!/!::!g;
diff --git a/contrib/perl5/lib/ExtUtils/Liblist.pm b/contrib/perl5/lib/ExtUtils/Liblist.pm
index dae3125..6029557 100644
--- a/contrib/perl5/lib/ExtUtils/Liblist.pm
+++ b/contrib/perl5/lib/ExtUtils/Liblist.pm
@@ -1,8 +1,9 @@
package ExtUtils::Liblist;
-use vars qw($VERSION);
+
+use 5.005_64;
# Broken out of MakeMaker from version 4.11
-$VERSION = substr q$Revision: 1.25 $, 10;
+our $VERSION = substr q$Revision: 1.25 $, 10;
use Config;
use Cwd 'cwd';
@@ -108,13 +109,14 @@ sub _unix_os2_ext {
} elsif (-f ($fullname="$thispth/lib$thislib.$so")
&& (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){
} elsif (-f ($fullname="$thispth/lib${thislib}_s$Config_libext")
+ && (! $Config{'archname'} =~ /RM\d\d\d-svr4/)
&& ($thislib .= "_s") ){ # we must explicitly use _s version
} elsif (-f ($fullname="$thispth/lib$thislib$Config_libext")){
} elsif (-f ($fullname="$thispth/$thislib$Config_libext")){
} elsif (-f ($fullname="$thispth/Slib$thislib$Config_libext")){
} elsif ($^O eq 'dgux'
&& -l ($fullname="$thispth/lib$thislib$Config_libext")
- && readlink($fullname) =~ /^elink:/) {
+ && readlink($fullname) =~ /^elink:/s) {
# Some of DG's libraries look like misconnected symbolic
# links, but development tools can follow them. (They
# look like this:
@@ -136,7 +138,7 @@ sub _unix_os2_ext {
# Now update library lists
# what do we know about this library...
- my $is_dyna = ($fullname !~ /\Q$Config_libext\E$/);
+ my $is_dyna = ($fullname !~ /\Q$Config_libext\E\z/);
my $in_perl = ($libs =~ /\B-l\Q$ {thislib}\E\b/s);
# Do not add it into the list if it is already linked in
@@ -362,7 +364,7 @@ sub _vms_ext {
return ('', '', $crtlstr, '');
}
- my(@dirs,@libs,$dir,$lib,%sh,%olb,%obj,$ldlib);
+ my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib);
my $cwd = cwd();
my($so,$lib_ext,$obj_ext) = @Config{'so','lib_ext','obj_ext'};
# List of common Unix library names and there VMS equivalents
@@ -430,28 +432,28 @@ sub _vms_ext {
warn "\tChecking $name\n" if $verbose > 2;
if (-f ($test = VMS::Filespec::rmsexpand($name))) {
# It's got its own suffix, so we'll have to figure out the type
- if ($test =~ /(?:$so|exe)$/i) { $type = 'sh'; }
- elsif ($test =~ /(?:$lib_ext|olb)$/i) { $type = 'olb'; }
+ if ($test =~ /(?:$so|exe)$/i) { $type = 'SHR'; }
+ elsif ($test =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
elsif ($test =~ /(?:$obj_ext|obj)$/i) {
warn "Note (probably harmless): "
."Plain object file $test found in library list\n";
- $type = 'obj';
+ $type = 'OBJ';
}
else {
warn "Note (probably harmless): "
."Unknown library type for $test; assuming shared\n";
- $type = 'sh';
+ $type = 'SHR';
}
}
elsif (-f ($test = VMS::Filespec::rmsexpand($name,$so)) or
-f ($test = VMS::Filespec::rmsexpand($name,'.exe'))) {
- $type = 'sh';
+ $type = 'SHR';
$name = $test unless $test =~ /exe;?\d*$/i;
}
elsif (not length($ctype) and # If we've got a lib already, don't bother
( -f ($test = VMS::Filespec::rmsexpand($name,$lib_ext)) or
-f ($test = VMS::Filespec::rmsexpand($name,'.olb')))) {
- $type = 'olb';
+ $type = 'OLB';
$name = $test unless $test =~ /olb;?\d*$/i;
}
elsif (not length($ctype) and # If we've got a lib already, don't bother
@@ -459,17 +461,18 @@ sub _vms_ext {
-f ($test = VMS::Filespec::rmsexpand($name,'.obj')))) {
warn "Note (probably harmless): "
."Plain object file $test found in library list\n";
- $type = 'obj';
+ $type = 'OBJ';
$name = $test unless $test =~ /obj;?\d*$/i;
}
if (defined $type) {
$ctype = $type; $cand = $name;
- last if $ctype eq 'sh';
+ last if $ctype eq 'SHR';
}
}
if ($ctype) {
- eval '$' . $ctype . "{'$cand'}++";
- die "Error recording library: $@" if $@;
+ # This has to precede any other CRTLs, so just make it first
+ if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }
+ else { push @{$found{$ctype}}, $cand; }
warn "\tFound as $cand (really $test), type $ctype\n" if $verbose > 1;
next LIB;
}
@@ -478,15 +481,10 @@ sub _vms_ext {
."No library found for $lib\n";
}
- @libs = sort keys %obj;
- # This has to precede any other CRTLs, so just make it first
- if ($olb{VAXCCURSE}) {
- push(@libs,"$olb{VAXCCURSE}/Library");
- delete $olb{VAXCCURSE};
- }
- push(@libs, map { "$_/Library" } sort keys %olb);
- push(@libs, map { "$_/Share" } sort keys %sh);
- $lib = join(' ',@libs);
+ push @fndlibs, @{$found{OBJ}} if exists $found{OBJ};
+ push @fndlibs, map { "$_/Library" } @{$found{OLB}} if exists $found{OLB};
+ push @fndlibs, map { "$_/Share" } @{$found{SHR}} if exists $found{SHR};
+ $lib = join(' ',@fndlibs);
$ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
@@ -544,7 +542,7 @@ below.
=head2 EXTRALIBS
List of libraries that need to be linked with when linking a perl
-binary which includes this extension Only those libraries that
+binary which includes this extension. Only those libraries that
actually exist are included. These are written to a file and used
when linking perl.
@@ -566,7 +564,7 @@ object file. This list is used to create a .bs (bootstrap) file.
=head1 PORTABILITY
This module deals with a lot of system dependencies and has quite a
-few architecture specific B<if>s in the code.
+few architecture specific C<if>s in the code.
=head2 VMS implementation
@@ -686,7 +684,7 @@ enable searching for default libraries specified by C<$Config{libs}>.
The libraries specified may be a mixture of static libraries and
import libraries (to link with DLLs). Since both kinds are used
-pretty transparently on the win32 platform, we do not attempt to
+pretty transparently on the Win32 platform, we do not attempt to
distinguish between them.
=item *
diff --git a/contrib/perl5/lib/ExtUtils/MM_Cygwin.pm b/contrib/perl5/lib/ExtUtils/MM_Cygwin.pm
new file mode 100644
index 0000000..a5ba410
--- /dev/null
+++ b/contrib/perl5/lib/ExtUtils/MM_Cygwin.pm
@@ -0,0 +1,121 @@
+package ExtUtils::MM_Cygwin;
+
+use Config;
+#use Cwd;
+#use File::Basename;
+require Exporter;
+
+Exporter::import('ExtUtils::MakeMaker',
+ qw( $Verbose &neatvalue));
+
+unshift @MM::ISA, 'ExtUtils::MM_Cygwin';
+
+sub canonpath {
+ my($self,$path) = @_;
+ $path =~ s|\\|/|g;
+ return $self->ExtUtils::MM_Unix::canonpath($path);
+}
+
+sub cflags {
+ my($self,$libperl)=@_;
+ return $self->{CFLAGS} if $self->{CFLAGS};
+ my $base =$self->ExtUtils::MM_Unix::cflags($libperl);
+ foreach (split /\n/, $base) {
+ / *= */ and $self->{$`} = $';
+ };
+ $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true');
+
+ return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+LARGE = $self->{LARGE}
+SPLIT = $self->{SPLIT}
+};
+
+}
+
+sub manifypods {
+ my($self, %attribs) = @_;
+ return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
+ %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
+ my($dist);
+ my($pod2man_exe);
+ if (defined $self->{PERL_SRC}) {
+ $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
+ } else {
+ $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
+ }
+ unless ($self->perl_script($pod2man_exe)) {
+ # No pod2man but some MAN3PODS to be installed
+ print <<END;
+
+Warning: I could not locate your pod2man program. Please make sure,
+ your pod2man program is in your PATH before you execute 'make'
+
+END
+ $pod2man_exe = "-S pod2man";
+ }
+ my(@m);
+ push @m,
+qq[POD2MAN_EXE = $pod2man_exe\n],
+qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
+q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
+ $self->{MAKEFILE}, q[";' \\
+-e 'print "Manifying $$m{$$_}\n"; $$m{$$_} =~ s/::/./g;' \\
+-e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
+-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
+];
+ push @m, "\nmanifypods : pure_all ";
+ push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
+
+ push(@m,"\n");
+ if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
+ push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
+ push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
+ }
+ join('', @m);
+}
+
+sub perl_archive
+{
+ return '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
+}
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided there.
+
+=over
+
+=item canonpath
+
+replaces backslashes with forward ones. then acts as *nixish.
+
+=item cflags
+
+if configured for dynamic loading, triggers #define EXT in EXTERN.h
+
+=item manifypods
+
+replaces strings '::' with '.' in man page names
+
+=item perl_archive
+
+points to libperl.a
+
+=back
+
+=cut
+
diff --git a/contrib/perl5/lib/ExtUtils/MM_OS2.pm b/contrib/perl5/lib/ExtUtils/MM_OS2.pm
index 5d6034c..430235a 100644
--- a/contrib/perl5/lib/ExtUtils/MM_OS2.pm
+++ b/contrib/perl5/lib/ExtUtils/MM_OS2.pm
@@ -25,13 +25,13 @@ sub dlsyms {
$self->{BASEEXT}.def: Makefile.PL
",
' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
- Mksymlists("NAME" => "', $self->{NAME},
- '", "DLBASE" => "',$self->{DLBASE},
- '", "DL_FUNCS" => ',neatvalue($funcs),
+ Mksymlists("NAME" => "$(NAME)", "DLBASE" => "$(DLBASE)", ',
+ '"VERSION" => "$(VERSION)", "DISTNAME" => "$(DISTNAME)", ',
+ '"INSTALLDIRS" => "$(INSTALLDIRS)", ',
+ '"DL_FUNCS" => ',neatvalue($funcs),
', "FUNCLIST" => ',neatvalue($funclist),
', "IMPORTS" => ',neatvalue($imports),
- ', "VERSION" => "',$self->{VERSION},
- '", "DL_VARS" => ', neatvalue($vars), ');\'
+ ', "DL_VARS" => ', neatvalue($vars), ');\'
');
}
if (%{$self->{IMPORTS}}) {
diff --git a/contrib/perl5/lib/ExtUtils/MM_Unix.pm b/contrib/perl5/lib/ExtUtils/MM_Unix.pm
index 38bb061..4c8da33 100644
--- a/contrib/perl5/lib/ExtUtils/MM_Unix.pm
+++ b/contrib/perl5/lib/ExtUtils/MM_Unix.pm
@@ -8,11 +8,10 @@ use strict;
use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_PERL_OBJECT
$Verbose %pm %static $Xsubpp_Version);
-$VERSION = substr q$Revision: 1.12602 $, 10;
+$VERSION = substr q$Revision: 1.12603 $, 10;
# $Id: MM_Unix.pm,v 1.126 1998/06/28 21:32:49 k Exp k $
-Exporter::import('ExtUtils::MakeMaker',
- qw( $Verbose &neatvalue));
+Exporter::import('ExtUtils::MakeMaker', qw($Verbose &neatvalue));
$Is_OS2 = $^O eq 'os2';
$Is_Mac = $^O eq 'MacOS';
@@ -81,13 +80,13 @@ path. On UNIX eliminated successive slashes and successive "/.".
sub canonpath {
my($self,$path) = @_;
my $node = '';
- if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/| ) {
+ if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/|s ) {
$node = $1;
}
$path =~ s|(?<=[^/])/+|/|g ; # xx////xx -> xx/xx
$path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx
- $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx
- $path =~ s|(?<=[^/])/$|| ; # xx/ -> xx
+ $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx
+ $path =~ s|(?<=[^/])/\z|| ; # xx/ -> xx
"$node$path";
}
@@ -188,6 +187,7 @@ sub ExtUtils::MM_Unix::fixin ;
sub ExtUtils::MM_Unix::force ;
sub ExtUtils::MM_Unix::guess_name ;
sub ExtUtils::MM_Unix::has_link_code ;
+sub ExtUtils::MM_Unix::htmlifypods ;
sub ExtUtils::MM_Unix::init_dirscan ;
sub ExtUtils::MM_Unix::init_main ;
sub ExtUtils::MM_Unix::init_others ;
@@ -375,21 +375,45 @@ sub cflags {
$self->{uc $_} ||= $cflags{$_}
}
- if ($self->{CAPI} && $Is_PERL_OBJECT) {
- $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\s|$)//;
- $self->{CCFLAGS} .= ' -DPERL_CAPI ';
- if ($Is_Win32 && $Config{'cc'} =~ /^cl.exe/i) {
- # Turn off C++ mode of the MSC compiler
- $self->{CCFLAGS} =~ s/-TP(\s|$)//;
- $self->{OPTIMIZE} =~ s/-TP(\s|$)//;
+ if ($Is_PERL_OBJECT) {
+ $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\b|$)/-DPERL_CAPI/g;
+ if ($Is_Win32) {
+ if ($Config{'cc'} =~ /^cl/i) {
+ # Turn off C++ mode of the MSC compiler
+ $self->{CCFLAGS} =~ s/-TP(\s|$)//g;
+ $self->{OPTIMIZE} =~ s/-TP(\s|$)//g;
+ }
+ elsif ($Config{'cc'} =~ /^bcc32/i) {
+ # Turn off C++ mode of the Borland compiler
+ $self->{CCFLAGS} =~ s/-P(\s|$)//g;
+ $self->{OPTIMIZE} =~ s/-P(\s|$)//g;
+ }
+ elsif ($Config{'cc'} =~ /^gcc/i) {
+ # Turn off C++ mode of the GCC compiler
+ $self->{CCFLAGS} =~ s/-xc\+\+(\s|$)//g;
+ $self->{OPTIMIZE} =~ s/-xc\+\+(\s|$)//g;
+ }
}
}
+
+ if ($self->{POLLUTE}) {
+ $self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
+ }
+
+ my $pollute = '';
+ if ($Config{usemymalloc} and not $Config{bincompat5005}
+ and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
+ and $self->{PERL_MALLOC_OK}) {
+ $pollute = '$(PERL_MALLOC_DEF)';
+ }
+
return $self->{CFLAGS} = qq{
CCFLAGS = $self->{CCFLAGS}
OPTIMIZE = $self->{OPTIMIZE}
PERLTYPE = $self->{PERLTYPE}
LARGE = $self->{LARGE}
SPLIT = $self->{SPLIT}
+MPOLLUTE = $pollute
};
}
@@ -413,13 +437,26 @@ clean ::
');
# clean subdirectories first
for $dir (@{$self->{DIR}}) {
- push @m, "\t-cd $dir && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) clean\n";
+ if ($Is_Win32 && Win32::IsWin95()) {
+ push @m, <<EOT;
+ cd $dir
+ \$(TEST_F) $self->{MAKEFILE}
+ \$(MAKE) clean
+ cd ..
+EOT
+ }
+ else {
+ push @m, <<EOT;
+ -cd $dir && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) clean
+EOT
+ }
}
my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all
- perlmain.c mon.out core so_locations pm_to_blib
+ perlmain.c mon.out core core.*perl.*.?
+ *perl.core so_locations pm_to_blib
*~ */*~ */*/*~ *$(OBJ_EXT) *$(LIB_EXT) perl.exe
$(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
$(BASEEXT).exp
@@ -446,7 +483,7 @@ sub const_cccmd {
return '' unless $self->needs_linking();
return $self->{CONST_CCCMD} =
q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
- $(PERLTYPE) $(LARGE) $(SPLIT) $(DEFINE_VERSION) \\
+ $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) $(DEFINE_VERSION) \\
$(XS_DEFINE_VERSION)};
}
@@ -519,7 +556,7 @@ sub constants {
INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
- PERL_INC PERL FULLPERL
+ PERL_INC PERL FULLPERL FULL_AR
/ ) {
next unless defined $self->{$tmp};
@@ -531,6 +568,7 @@ VERSION_MACRO = VERSION
DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
XS_VERSION_MACRO = XS_VERSION
XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
+PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
};
push @m, qq{
@@ -560,12 +598,19 @@ XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
C_FILES = ".join(" \\\n\t", @{$self->{C}})."
O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
H_FILES = ".join(" \\\n\t", @{$self->{H}})."
+HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
+HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
";
for $tmp (qw/
- INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
+ INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
+ INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
+ INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
+ INST_HTMLLIBDIR HTMLEXT
+ INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
+ INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
/) {
next unless defined $self->{$tmp};
push @m, "$tmp = $self->{$tmp}\n";
@@ -693,7 +738,7 @@ sub dir_target {
my($targ) = $self->catfile($dir,'.exists');
# catfile may have adapted syntax of $dir to target OS, so...
if ($Is_VMS) { # Just remove file name; dirspec is often in macro
- ($targdir = $targ) =~ s:/?\.exists$::;
+ ($targdir = $targ) =~ s:/?\.exists\z::;
}
else { # while elsewhere we expect to see the dir separator in $targ
$targdir = dirname($targ);
@@ -1079,10 +1124,10 @@ Takes as argument a path and returns true, if it is an absolute path.
sub file_name_is_absolute {
my($self,$file) = @_;
if ($Is_Dos){
- $file =~ m{^([a-z]:)?[\\/]}i ;
+ $file =~ m{^([a-z]:)?[\\/]}is ;
}
else {
- $file =~ m:^/: ;
+ $file =~ m:^/:s ;
}
}
@@ -1265,7 +1310,7 @@ sub guess_name {
my($self) = @_;
use Cwd 'cwd';
my $name = basename(cwd());
- $name =~ s|[\-_][\d\.\-]+$||; # this is new with MM 5.00, we
+ $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we
# strip minus or underline
# followed by a float or some such
print "Warning: Guessing NAME [$name] from current directory name.\n";
@@ -1290,9 +1335,60 @@ sub has_link_code {
return $self->{HAS_LINK_CODE} = 0;
}
+=item htmlifypods (o)
+
+Defines targets and routines to translate the pods into HTML manpages
+and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
+directories.
+
+=cut
+
+sub htmlifypods {
+ my($self, %attribs) = @_;
+ return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
+ %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
+ my($dist);
+ my($pod2html_exe);
+ if (defined $self->{PERL_SRC}) {
+ $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
+ } else {
+ $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
+ }
+ unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
+ # No pod2html but some HTMLxxxPODS to be installed
+ print <<END;
+
+Warning: I could not locate your pod2html program. Please make sure,
+ your pod2html program is in your PATH before you execute 'make'
+
+END
+ $pod2html_exe = "-S pod2html";
+ }
+ my(@m);
+ push @m,
+qq[POD2HTML_EXE = $pod2html_exe\n],
+qq[POD2HTML = \$(PERL) -we 'use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){' \\\n],
+q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
+ $self->{MAKEFILE}, q[";' \\
+-e 'print "Htmlifying $$m{$$_}\n";' \\
+-e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\
+-e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
+-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
+];
+ push @m, "\nhtmlifypods : pure_all ";
+ push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
+
+ push(@m,"\n");
+ if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
+ push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
+ push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
+ }
+ join('', @m);
+}
+
=item init_dirscan
-Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
+Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES.
=cut
@@ -1309,24 +1405,26 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
if (-d $name){
next if -l $name; # We do not support symlinks at all
$dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
- } elsif ($name =~ /\.xs$/){
- my($c); ($c = $name) =~ s/\.xs$/.c/;
+ } elsif ($name =~ /\.xs\z/){
+ my($c); ($c = $name) =~ s/\.xs\z/.c/;
$xs{$name} = $c;
$c{$c} = 1;
- } elsif ($name =~ /\.c(pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc
+ } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc
$c{$name} = 1
unless $name =~ m/perlmain\.c/; # See MAP_TARGET
- } elsif ($name =~ /\.h$/i){
+ } elsif ($name =~ /\.h\z/i){
$h{$name} = 1;
- } elsif ($name =~ /\.PL$/) {
- ($pl_files{$name} = $name) =~ s/\.PL$// ;
- } elsif ($Is_VMS && $name =~ /\.pl$/) { # case-insensitive filesystem
+ } elsif ($name =~ /\.PL\z/) {
+ ($pl_files{$name} = $name) =~ s/\.PL\z// ;
+ } elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
+ # case-insensitive filesystem, one dot per name, so foo.h.PL
+ # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
local($/); open(PL,$name); my $txt = <PL>; close PL;
if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
- ($pl_files{$name} = $name) =~ s/\.pl$// ;
+ ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
}
else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); }
- } elsif ($name =~ /\.(p[ml]|pod)$/){
+ } elsif ($name =~ /\.(p[ml]|pod)\z/){
$pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
}
}
@@ -1401,70 +1499,64 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
$self->{PM} = \%pm unless $self->{PM};
$self->{C} = [sort keys %c] unless $self->{C};
my(@o_files) = @{$self->{C}};
- $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ;
+ $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files] ;
$self->{H} = [sort keys %h] unless $self->{H};
$self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
# Set up names of manual pages to generate from pods
- if ($self->{MAN1PODS}) {
- } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
- $self->{MAN1PODS} = {};
- } else {
- my %manifypods = ();
+ my %pods;
+ foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) {
+ unless ($self->{"${man}PODS"}) {
+ $self->{"${man}PODS"} = {};
+ $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/;
+ }
+ }
+
+ if ($pods{MAN1} || $pods{HTMLSCRIPT}) {
if ( exists $self->{EXE_FILES} ) {
foreach $name (@{$self->{EXE_FILES}}) {
-# use FileHandle ();
-# my $fh = new FileHandle;
local *FH;
my($ispod)=0;
-# if ($fh->open("<$name")) {
if (open(FH,"<$name")) {
-# while (<$fh>) {
while (<FH>) {
if (/^=head1\s+\w+/) {
$ispod=1;
last;
}
}
-# $fh->close;
close FH;
} else {
# If it doesn't exist yet, we assume, it has pods in it
$ispod = 1;
}
- if( $ispod ) {
- $manifypods{$name} =
- $self->catfile('$(INST_MAN1DIR)',
- basename($name).'.$(MAN1EXT)');
+ next unless $ispod;
+ if ($pods{HTMLSCRIPT}) {
+ $self->{HTMLSCRIPTPODS}->{$name} =
+ $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
+ }
+ if ($pods{MAN1}) {
+ $self->{MAN1PODS}->{$name} =
+ $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
}
}
}
- $self->{MAN1PODS} = \%manifypods;
}
- if ($self->{MAN3PODS}) {
- } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
- $self->{MAN3PODS} = {};
- } else {
+ if ($pods{MAN3} || $pods{HTMLLIB}) {
my %manifypods = (); # we collect the keys first, i.e. the files
# we have to convert to pod
foreach $name (keys %{$self->{PM}}) {
- if ($name =~ /\.pod$/ ) {
+ if ($name =~ /\.pod\z/ ) {
$manifypods{$name} = $self->{PM}{$name};
- } elsif ($name =~ /\.p[ml]$/ ) {
-# use FileHandle ();
-# my $fh = new FileHandle;
+ } elsif ($name =~ /\.p[ml]\z/ ) {
local *FH;
my($ispod)=0;
-# $fh->open("<$name");
if (open(FH,"<$name")) {
- # while (<$fh>) {
while (<FH>) {
if (/^=head1\s+\w+/) {
$ispod=1;
last;
}
}
- # $fh->close;
close FH;
} else {
$ispod = 1;
@@ -1478,19 +1570,25 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
# Remove "Configure.pm" and similar, if it's not the only pod listed
# To force inclusion, just name it "Configure.pod", or override MAN3PODS
foreach $name (keys %manifypods) {
- if ($name =~ /(config|setup).*\.pm/i) {
+ if ($name =~ /(config|setup).*\.pm/is) {
delete $manifypods{$name};
next;
}
my($manpagename) = $name;
- unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok
+ $manpagename =~ s/\.p(od|m|l)\z//;
+ if ($pods{HTMLLIB}) {
+ $self->{HTMLLIBPODS}->{$name} =
+ $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
+ }
+ unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok
$manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
}
- $manpagename =~ s/\.p(od|m|l)$//;
- $manpagename = $self->replace_manpage_separator($manpagename);
- $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
+ if ($pods{MAN3}) {
+ $manpagename = $self->replace_manpage_separator($manpagename);
+ $self->{MAN3PODS}->{$name} =
+ $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
+ }
}
- $self->{MAN3PODS} = \%manifypods;
}
}
@@ -1531,7 +1629,7 @@ sub init_main {
$modfname = &DynaLoader::mod2fname(\@modparts);
}
- ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)$! ;
+ ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
if (defined &DynaLoader::mod2fname) {
# As of 5.001m, dl_os2 appends '_'
@@ -1601,10 +1699,34 @@ from the perl source tree.
}
} else {
# we should also consider $ENV{PERL5LIB} here
+ my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
$self->{PERL_LIB} ||= $Config::Config{privlibexp};
$self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
$self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
my $perl_h;
+
+ if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
+ and not $old){
+ # Maybe somebody tries to build an extension with an
+ # uninstalled Perl outside of Perl build tree
+ my $found;
+ for my $dir (@INC) {
+ $found = $dir, last if -e $self->catdir($dir, "Config.pm");
+ }
+ if ($found) {
+ my $inc = dirname $found;
+ if (-e $self->catdir($inc, "perl.h")) {
+ $self->{PERL_LIB} = $found;
+ $self->{PERL_ARCHLIB} = $found;
+ $self->{PERL_INC} = $inc;
+ $self->{UNINSTALLED_PERL} = 1;
+ print STDOUT <<EOP;
+... Detected uninstalled Perl. Trying to continue.
+EOP
+ }
+ }
+ }
+
unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
die qq{
Error: Unable to locate installed Perl libraries or Perl source code.
@@ -1695,8 +1817,7 @@ usually solves this kind of problem.
my($install_variable,$search_prefix,$replace_prefix);
- # The rule, taken from Configure, is that if prefix contains perl,
- # we shape the tree
+ # If the prefix contains perl, Configure shapes the tree as follows:
# perlprefix/lib/ INSTALLPRIVLIB
# perlprefix/lib/pod/
# perlprefix/lib/site_perl/ INSTALLSITELIB
@@ -1708,6 +1829,11 @@ usually solves this kind of problem.
# prefix/lib/perl5/site_perl/ INSTALLSITELIB
# prefix/bin/ INSTALLBIN
# prefix/lib/perl5/man/ INSTALLMAN1DIR
+ #
+ # The above results in various kinds of breakage on various
+ # platforms, so we cope with it as follows: if prefix/lib/perl5
+ # or prefix/lib/perl5/man exist, we'll replace those instead
+ # of /prefix/{lib,man}
$replace_prefix = qq[\$\(PREFIX\)];
for $install_variable (qw/
@@ -1716,36 +1842,45 @@ usually solves this kind of problem.
/) {
$self->prefixify($install_variable,$configure_prefix,$replace_prefix);
}
- $search_prefix = $configure_prefix =~ /perl/ ?
- $self->catdir($configure_prefix,"lib") :
- $self->catdir($configure_prefix,"lib","perl5");
+ my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
+ $funkylibdir = '' unless -d $funkylibdir;
+ $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
if ($self->{LIB}) {
$self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
$self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} =
$self->catdir($self->{LIB},$Config{'archname'});
- } else {
- $replace_prefix = $self->{PREFIX} =~ /perl/ ?
- $self->catdir(qq[\$\(PREFIX\)],"lib") :
- $self->catdir(qq[\$\(PREFIX\)],"lib","perl5");
+ }
+ else {
+ if (-d $self->catdir($self->{PREFIX},"lib","perl5")) {
+ $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5");
+ }
+ else {
+ $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib");
+ }
for $install_variable (qw/
INSTALLPRIVLIB
INSTALLARCHLIB
INSTALLSITELIB
INSTALLSITEARCH
- /) {
+ /)
+ {
$self->prefixify($install_variable,$search_prefix,$replace_prefix);
}
}
- $search_prefix = $configure_prefix =~ /perl/ ?
- $self->catdir($configure_prefix,"man") :
- $self->catdir($configure_prefix,"lib","perl5","man");
- $replace_prefix = $self->{PREFIX} =~ /perl/ ?
- $self->catdir(qq[\$\(PREFIX\)],"man") :
- $self->catdir(qq[\$\(PREFIX\)],"lib","perl5","man");
+ my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
+ $funkymandir = '' unless -d $funkymandir;
+ $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
+ if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
+ $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
+ }
+ else {
+ $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man");
+ }
for $install_variable (qw/
INSTALLMAN1DIR
INSTALLMAN3DIR
- /) {
+ /)
+ {
$self->prefixify($install_variable,$search_prefix,$replace_prefix);
}
@@ -1773,6 +1908,30 @@ usually solves this kind of problem.
}
$self->{MAN3EXT} ||= $Config::Config{man3ext};
+ $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir}
+ unless defined $self->{INSTALLHTMLPRIVLIBDIR};
+ $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir}
+ unless defined $self->{INSTALLHTMLSITELIBDIR};
+
+ unless (defined $self->{INST_HTMLLIBDIR}){
+ if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
+ $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
+ } else {
+ $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
+ }
+ }
+
+ $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir}
+ unless defined $self->{INSTALLHTMLSCRIPTDIR};
+ unless (defined $self->{INST_HTMLSCRIPTDIR}){
+ if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
+ $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
+ } else {
+ $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
+ }
+ }
+ $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
+
# Get some stuff out of %Config if we haven't yet done so
print STDOUT "CONFIG must be an array ref\n"
@@ -1846,7 +2005,8 @@ usually solves this kind of problem.
push @defpath, $component if defined $component;
}
$self->{PERL} ||=
- $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
+ $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl',
+ 'perl','perl5',"perl$Config{version}" ],
\@defpath, $Verbose );
# don't check if perl is executable, maybe they have decided to
# supply switches with perl
@@ -1965,6 +2125,8 @@ pure_perl_install ::
$(INST_ARCHLIB) $(INSTALLARCHLIB) \
$(INST_BIN) $(INSTALLBIN) \
$(INST_SCRIPT) $(INSTALLSCRIPT) \
+ $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \
+ $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
$(INST_MAN1DIR) $(INSTALLMAN1DIR) \
$(INST_MAN3DIR) $(INSTALLMAN3DIR)
}.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
@@ -1979,12 +2141,15 @@ pure_site_install ::
$(INST_ARCHLIB) $(INSTALLSITEARCH) \
$(INST_BIN) $(INSTALLBIN) \
$(INST_SCRIPT) $(INSTALLSCRIPT) \
+ $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \
+ $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
$(INST_MAN1DIR) $(INSTALLMAN1DIR) \
$(INST_MAN3DIR) $(INSTALLMAN3DIR)
}.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
}.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
doc_perl_install ::
+ -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
-}.$self->{NOECHO}.q{$(DOC_INSTALL) \
"Module" "$(NAME)" \
"installed into" "$(INSTALLPRIVLIB)" \
@@ -1994,6 +2159,7 @@ doc_perl_install ::
>> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
doc_site_install ::
+ -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
-}.$self->{NOECHO}.q{$(DOC_INSTALL) \
"Module" "$(NAME)" \
"installed into" "$(INSTALLSITELIB)" \
@@ -2219,7 +2385,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
my $incl;
my $xx;
- ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+ ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
$xx =~ s,/?$_,,;
$xx =~ s,/,::,g;
@@ -2237,7 +2403,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
my $excl;
my $xx;
- ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+ ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
$xx =~ s,/?$_,,;
$xx =~ s,/,::,g;
@@ -2254,7 +2420,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
# Once the patch to minimod.PL is in the distribution, I can
# drop it
- return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
+ return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
use Cwd 'cwd';
$static{cwd() . "/" . $_}++;
}, grep( -d $_, @{$searchdirs || []}) );
@@ -2265,7 +2431,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
$extra = [] unless $extra && ref $extra eq 'ARRAY';
for (sort keys %static) {
- next unless /\Q$self->{LIB_EXT}\E$/;
+ next unless /\Q$self->{LIB_EXT}\E\z/;
$_ = dirname($_) . "/extralibs.ld";
push @$extra, $_;
}
@@ -2350,7 +2516,7 @@ $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
$tmp/perlmain.c: $makefilename}, q{
}.$self->{NOECHO}.q{echo Writing $@
}.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
- -e "writemain(grep s#.*/auto/##, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
+ -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
};
push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
@@ -2360,6 +2526,7 @@ $tmp/perlmain.c: $makefilename}, q{
push @m, q{
doc_inst_perl:
}.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
+ -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
-}.$self->{NOECHO}.q{$(DOC_INSTALL) \
"Perl binary" "$(MAP_TARGET)" \
MAP_STATIC "$(MAP_STATIC)" \
@@ -2441,7 +2608,11 @@ sub manifypods {
} else {
$pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
}
- unless ($self->perl_script($pod2man_exe)) {
+ unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
+ # Maybe a build by uninstalled Perl?
+ $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
+ }
+ unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
# No pod2man but some MAN3PODS to be installed
print <<END;
@@ -2568,7 +2739,9 @@ sub nicetext {
=item parse_version
-parse a file and return what you think is $VERSION in this file set to
+parse a file and return what you think is $VERSION in this file set to.
+It will return the string "undef" if it can't figure out what $VERSION
+is.
=cut
@@ -2594,9 +2767,9 @@ sub parse_version {
$_
}; \$$2
};
- local($^W) = 0;
+ no warnings;
$result = eval($eval);
- die "Could not eval '$eval' in $parsefile: $@" if $@;
+ warn "Could not eval '$eval' in $parsefile: $@" if $@;
$result = "undef" unless defined $result;
last;
}
@@ -2618,7 +2791,7 @@ sub parse_abstract {
open(FH,$parsefile) or die "Could not open '$parsefile': $!";
my $inpod = 0;
my $package = $self->{DISTNAME};
- $package =~ s/-/::/;
+ $package =~ s/-/::/g;
while (<FH>) {
$inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
next if !$inpod;
@@ -2710,16 +2883,53 @@ $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
push @m, q{
PERL_HDRS = \
-$(PERL_INC)/EXTERN.h $(PERL_INC)/gv.h $(PERL_INC)/pp.h \
-$(PERL_INC)/INTERN.h $(PERL_INC)/handy.h $(PERL_INC)/proto.h \
-$(PERL_INC)/XSUB.h $(PERL_INC)/hv.h $(PERL_INC)/regcomp.h \
-$(PERL_INC)/av.h $(PERL_INC)/keywords.h $(PERL_INC)/regexp.h \
-$(PERL_INC)/config.h $(PERL_INC)/mg.h $(PERL_INC)/scope.h \
-$(PERL_INC)/cop.h $(PERL_INC)/op.h $(PERL_INC)/sv.h \
-$(PERL_INC)/cv.h $(PERL_INC)/opcode.h $(PERL_INC)/unixish.h \
-$(PERL_INC)/dosish.h $(PERL_INC)/patchlevel.h $(PERL_INC)/util.h \
-$(PERL_INC)/embed.h $(PERL_INC)/perl.h $(PERL_INC)/iperlsys.h \
-$(PERL_INC)/form.h $(PERL_INC)/perly.h
+ $(PERL_INC)/EXTERN.h \
+ $(PERL_INC)/INTERN.h \
+ $(PERL_INC)/XSUB.h \
+ $(PERL_INC)/av.h \
+ $(PERL_INC)/cc_runtime.h \
+ $(PERL_INC)/config.h \
+ $(PERL_INC)/cop.h \
+ $(PERL_INC)/cv.h \
+ $(PERL_INC)/dosish.h \
+ $(PERL_INC)/embed.h \
+ $(PERL_INC)/embedvar.h \
+ $(PERL_INC)/fakethr.h \
+ $(PERL_INC)/form.h \
+ $(PERL_INC)/gv.h \
+ $(PERL_INC)/handy.h \
+ $(PERL_INC)/hv.h \
+ $(PERL_INC)/intrpvar.h \
+ $(PERL_INC)/iperlsys.h \
+ $(PERL_INC)/keywords.h \
+ $(PERL_INC)/mg.h \
+ $(PERL_INC)/nostdio.h \
+ $(PERL_INC)/objXSUB.h \
+ $(PERL_INC)/op.h \
+ $(PERL_INC)/opcode.h \
+ $(PERL_INC)/opnames.h \
+ $(PERL_INC)/patchlevel.h \
+ $(PERL_INC)/perl.h \
+ $(PERL_INC)/perlapi.h \
+ $(PERL_INC)/perlio.h \
+ $(PERL_INC)/perlsdio.h \
+ $(PERL_INC)/perlsfio.h \
+ $(PERL_INC)/perlvars.h \
+ $(PERL_INC)/perly.h \
+ $(PERL_INC)/pp.h \
+ $(PERL_INC)/pp_proto.h \
+ $(PERL_INC)/proto.h \
+ $(PERL_INC)/regcomp.h \
+ $(PERL_INC)/regexp.h \
+ $(PERL_INC)/regnodes.h \
+ $(PERL_INC)/scope.h \
+ $(PERL_INC)/sv.h \
+ $(PERL_INC)/thrdvar.h \
+ $(PERL_INC)/thread.h \
+ $(PERL_INC)/unixish.h \
+ $(PERL_INC)/utf8.h \
+ $(PERL_INC)/util.h \
+ $(PERL_INC)/warnings.h
$(OBJECT) : $(PERL_HDRS)
} if $self->{OBJECT};
@@ -2883,7 +3093,7 @@ sub prefixify {
my($self,$var,$sprefix,$rprefix) = @_;
$self->{uc $var} ||= $Config{lc $var};
$self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
- $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
+ $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/s;
}
=item processPL (o)
@@ -2927,7 +3137,9 @@ sub realclean {
realclean purge :: clean
');
# realclean subdirectories first (already cleaned)
- my $sub = "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
+ my $sub = ($Is_Win32 && Win32::IsWin95()) ?
+ "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" :
+ "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
foreach(@{$self->{DIR}}){
push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
@@ -3005,9 +3217,18 @@ END
# then copy that to $(INST_STATIC) and add $(OBJECT) into it.
push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
+ my $ar;
+ if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
+ # Prefer the absolute pathed ar if available so that PATH
+ # doesn't confuse us. Perl itself is built with the full_ar.
+ $ar = 'FULL_AR';
+ } else {
+ $ar = 'AR';
+ }
push @m,
-q{ $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
- $(CHMOD) $(PERM_RWX) $@
+ "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
+ push @m,
+q{ $(CHMOD) $(PERM_RWX) $@
}.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
};
# Old mechanism - still available:
@@ -3071,12 +3292,25 @@ Helper subroutine for subdirs
sub subdir_x {
my($self, $subdir) = @_;
my(@m);
- qq{
+ if ($Is_Win32 && Win32::IsWin95()) {
+ # XXX: dmake-specific, like rest of Win95 port
+ return <<EOT;
+subdirs ::
+@[
+ cd $subdir
+ \$(MAKE) all \$(PASTHRU)
+ cd ..
+]
+EOT
+ }
+ else {
+ return <<EOT;
subdirs ::
$self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
-};
+EOT
+ }
}
=item subdirs (o)
@@ -3321,13 +3555,13 @@ sub tool_xsubpp {
}
}
- my $xsubpp = $self->{CAPI} ? "xsubpp -object_capi" : "xsubpp";
+ my $xsubpp = "xsubpp";
return qq{
XSUBPPDIR = $xsdir
XSUBPP = \$(XSUBPPDIR)/$xsubpp
XSPROTOARG = $self->{XSPROTOARG}
-XSUBPPDEPS = @tmdeps
+XSUBPPDEPS = @tmdeps \$(XSUBPP)
XSUBPPARGS = @tmargs
};
};
@@ -3403,7 +3637,7 @@ sub top_targets {
';
push @m, '
-all :: pure_all manifypods
+all :: pure_all htmlifypods manifypods
'.$self->{NOECHO}.'$(NOOP)
'
unless $self->{SKIPHASH}{'all'};
@@ -3425,13 +3659,25 @@ config :: $(INST_AUTODIR)/.exists
'.$self->{NOECHO}.'$(NOOP)
';
- push @m, qq{
-config :: Version_check
+ push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
+
+ if (%{$self->{HTMLLIBPODS}}) {
+ push @m, qq[
+config :: \$(INST_HTMLLIBDIR)/.exists
$self->{NOECHO}\$(NOOP)
-} unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
+];
+ push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
+ }
- push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
+ if (%{$self->{HTMLSCRIPTPODS}}) {
+ push @m, qq[
+config :: \$(INST_HTMLSCRIPTDIR)/.exists
+ $self->{NOECHO}\$(NOOP)
+
+];
+ push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
+ }
if (%{$self->{MAN1PODS}}) {
push @m, qq[
@@ -3495,7 +3741,7 @@ sub xs_c {
return '' unless $self->needs_linking();
'
.xs.c:
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
';
}
@@ -3510,7 +3756,7 @@ sub xs_cpp {
return '' unless $self->needs_linking();
'
.xs.cpp:
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
';
}
@@ -3526,7 +3772,7 @@ sub xs_o { # many makes are too dumb to use xs_c then c_o
return '' unless $self->needs_linking();
'
.xs$(OBJ_EXT):
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
$(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
';
}
diff --git a/contrib/perl5/lib/ExtUtils/MM_VMS.pm b/contrib/perl5/lib/ExtUtils/MM_VMS.pm
index 8f8ac17..57a8146 100644
--- a/contrib/perl5/lib/ExtUtils/MM_VMS.pm
+++ b/contrib/perl5/lib/ExtUtils/MM_VMS.pm
@@ -12,10 +12,11 @@ use Config;
require Exporter;
use VMS::Filespec;
use File::Basename;
+use File::Spec;
+our($Revision, @ISA);
+$Revision = '5.56 (27-Apr-1999)';
-use vars qw($Revision);
-$Revision = '5.52 (12-Sep-1998)';
-
+@ISA = qw( File::Spec );
unshift @MM::ISA, 'ExtUtils::MM_VMS';
Exporter::import('ExtUtils::MakeMaker', '$Verbose', '&neatvalue');
@@ -38,156 +39,6 @@ the semantics.
=over
-=item eliminate_macros
-
-Expands MM[KS]/Make macros in a text string, using the contents of
-identically named elements of C<%$self>, and returns the result
-as a file specification in Unix syntax.
-
-=cut
-
-sub eliminate_macros {
- my($self,$path) = @_;
- unless ($path) {
- print "eliminate_macros('') = ||\n" if $Verbose >= 3;
- return '';
- }
- my($npath) = unixify($path);
- my($complex) = 0;
- my($head,$macro,$tail);
-
- # perform m##g in scalar context so it acts as an iterator
- while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#g) {
- if ($self->{$2}) {
- ($head,$macro,$tail) = ($1,$2,$3);
- if (ref $self->{$macro}) {
- if (ref $self->{$macro} eq 'ARRAY') {
- print "Note: expanded array macro \$($macro) in $path\n" if $Verbose;
- $macro = join ' ', @{$self->{$macro}};
- }
- else {
- print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
- "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
- $macro = "\cB$macro\cB";
- $complex = 1;
- }
- }
- else { ($macro = unixify($self->{$macro})) =~ s#/$##; }
- $npath = "$head$macro$tail";
- }
- }
- if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#g; }
- print "eliminate_macros($path) = |$npath|\n" if $Verbose >= 3;
- $npath;
-}
-
-=item fixpath
-
-Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
-in any directory specification, in order to avoid juxtaposing two
-VMS-syntax directories when MM[SK] is run. Also expands expressions which
-are all macro, so that we can tell how long the expansion is, and avoid
-overrunning DCL's command buffer when MM[KS] is running.
-
-If optional second argument has a TRUE value, then the return string is
-a VMS-syntax directory specification, if it is FALSE, the return string
-is a VMS-syntax file specification, and if it is not specified, fixpath()
-checks to see whether it matches the name of a directory in the current
-default directory, and returns a directory or file specification accordingly.
-
-=cut
-
-sub fixpath {
- my($self,$path,$force_path) = @_;
- unless ($path) {
- print "eliminate_macros('') = ||\n" if $Verbose >= 3;
- return '';
- }
- my($fixedpath,$prefix,$name);
-
- if ($path =~ m#^\$\([^\)]+\)$# || $path =~ m#[/:>\]]#) {
- if ($force_path or $path =~ /(?:DIR\)|\])$/) {
- $fixedpath = vmspath($self->eliminate_macros($path));
- }
- else {
- $fixedpath = vmsify($self->eliminate_macros($path));
- }
- }
- elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#)) && $self->{$prefix}) {
- my($vmspre) = $self->eliminate_macros("\$($prefix)");
- # is it a dir or just a name?
- $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR$/) ? vmspath($vmspre) : '';
- $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
- $fixedpath = vmspath($fixedpath) if $force_path;
- }
- else {
- $fixedpath = $path;
- $fixedpath = vmspath($fixedpath) if $force_path;
- }
- # No hints, so we try to guess
- if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
- $fixedpath = vmspath($fixedpath) if -d $fixedpath;
- }
- # Trim off root dirname if it's had other dirs inserted in front of it.
- $fixedpath =~ s/\.000000([\]>])/$1/;
- print "fixpath($path) = |$fixedpath|\n" if $Verbose >= 3;
- $fixedpath;
-}
-
-=item catdir
-
-Concatenates a list of file specifications, and returns the result as a
-VMS-syntax directory specification.
-
-=cut
-
-sub catdir {
- my($self,@dirs) = @_;
- my($dir) = pop @dirs;
- @dirs = grep($_,@dirs);
- my($rslt);
- if (@dirs) {
- my($path) = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
- my($spath,$sdir) = ($path,$dir);
- $spath =~ s/.dir$//; $sdir =~ s/.dir$//;
- $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+$/;
- $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
- }
- else {
- if ($dir =~ /^\$\([^\)]+\)$/) { $rslt = $dir; }
- else { $rslt = vmspath($dir); }
- }
- print "catdir(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
- $rslt;
-}
-
-=item catfile
-
-Concatenates a list of file specifications, and returns the result as a
-VMS-syntax directory specification.
-
-=cut
-
-sub catfile {
- my($self,@files) = @_;
- my($file) = pop @files;
- @files = grep($_,@files);
- my($rslt);
- if (@files) {
- my($path) = (@files == 1 ? $files[0] : $self->catdir(@files));
- my($spath) = $path;
- $spath =~ s/.dir$//;
- if ( $spath =~ /^[^\)\]\/:>]+\)$/ && basename($file) eq $file) { $rslt = "$spath$file"; }
- else {
- $rslt = $self->eliminate_macros($spath);
- $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file));
- }
- }
- else { $rslt = vmsify($file); }
- print "catfile(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
- $rslt;
-}
-
=item wraplist
Converts a list into a string wrapped at approximately 80 columns.
@@ -212,16 +63,6 @@ sub wraplist {
$line;
}
-=item curdir (override)
-
-Returns a string representing of the current directory.
-
-=cut
-
-sub curdir {
- return '[]';
-}
-
=item rootdir (override)
Returns a string representing of the root directory.
@@ -232,16 +73,6 @@ sub rootdir {
return '';
}
-=item updir (override)
-
-Returns a string representing of the parent directory.
-
-=cut
-
-sub updir {
- return '[-]';
-}
-
package ExtUtils::MM_VMS;
sub ExtUtils::MM_VMS::ext;
@@ -447,14 +278,14 @@ sub find_perl {
print "Checking $name\n" if ($trace >= 2);
# If it looks like a potential command, try it without the MCR
if ($name =~ /^[\w\-\$]+$/ &&
- `$name -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
+ `$name -e "require $ver; print ""VER_OK\\n"""` =~ /VER_OK/) {
print "Using PERL=$name\n" if $trace;
return $name;
}
next unless $vmsfile = $self->maybe_command($name);
$vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
print "Executing $vmsfile\n" if ($trace >= 2);
- if (`MCR $vmsfile -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
+ if (`MCR $vmsfile -e "require $ver; print ""VER_OK\\n"""` =~ /VER_OK/) {
print "Using PERL=MCR $vmsfile\n" if $trace;
return "MCR $vmsfile";
}
@@ -625,11 +456,17 @@ sub constants {
my($self) = @_;
my(@m,$def,$macro);
+ # Be kind about case for pollution
+ for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
+
if ($self->{DEFINE} ne '') {
- my(@defs) = split(/\s+/,$self->{DEFINE});
- foreach $def (@defs) {
+ my(@terms) = split(/\s+/,$self->{DEFINE});
+ my(@defs,@udefs);
+ foreach $def (@terms) {
next unless $def;
- if ($def =~ s/^-D//) { # If it was a Unix-style definition
+ my $targ = \@defs;
+ if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
+ if ($1 eq 'U') { $targ = \@udefs; }
$def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
$def =~ s/^'(.*)'$/$1/; # from entire term or argument
}
@@ -637,8 +474,11 @@ sub constants {
$def =~ s/"/""/g; # Protect existing " from DCL
$def = qq["$def"]; # and quote to prevent parsing of =
}
+ push @$targ, $def;
}
- $self->{DEFINE} = join ',',@defs;
+ $self->{DEFINE} = '';
+ if (@defs) { $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; }
+ if (@udefs) { $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; }
}
if ($self->{OBJECT} =~ /\s/) {
@@ -837,32 +677,31 @@ sub cflags {
warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
$quals = '';
}
+ $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
# Deal with $self->{DEFINE} here since some C compilers pay attention
# to only one /Define clause on command line, so we have to
# conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
- if ($quals =~ m:(.*)/define=\(?([^\(\/\)\s]+)\)?(.*)?:i) {
- $quals = "$1/Define=($2," . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
- "\$(DEFINE_VERSION),\$(XS_DEFINE_VERSION))$3";
- }
- else {
- $quals .= '/Define=(' . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
- '$(DEFINE_VERSION),$(XS_DEFINE_VERSION))';
+ # ($self->{DEFINE} has already been VMSified in constants() above)
+ if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
+ for $type (qw(Def Undef)) {
+ my(@terms);
+ while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
+ my $term = $1;
+ $term =~ s:^\((.+)\)$:$1:;
+ push @terms, $term;
+ }
+ if ($type eq 'Def') {
+ push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
+ }
+ if (@terms) {
+ $quals =~ s:/${type}i?n?e?=[^/]+::ig;
+ $quals .= "/${type}ine=(" . join(',',@terms) . ')';
+ }
}
$libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
-# This whole section is commented out, since I don't think it's necessary (or applicable)
-# if ($libperl =~ s/^$Config{'dbgprefix'}//) { $libperl =~ s/perl([^Dd]*)\./perld$1./; }
-# if ($libperl =~ /libperl(\w+)\./i) {
-# my($type) = uc $1;
-# my(%map) = ( 'D' => 'DEBUGGING', 'E' => 'EMBED', 'M' => 'MULTIPLICITY',
-# 'DE' => 'DEBUGGING,EMBED', 'DM' => 'DEBUGGING,MULTIPLICITY',
-# 'EM' => 'EMBED,MULTIPLICITY', 'DEM' => 'DEBUGGING,EMBED,MULTIPLICITY' );
-# my($add) = join(',', grep { $quals !~ /\b$_\b/ } split(/,/,$map{$type}));
-# $quals =~ s:/define=\(([^\)]+)\):/Define=($1,$add):i if $add;
-# $self->{PERLTYPE} ||= $type;
-# }
# Likewise with $self->{INC} and /Include
if ($self->{'INC'}) {
@@ -873,11 +712,12 @@ sub cflags {
}
}
$quals .= "$incstr)";
+# $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
$self->{CCFLAGS} = $quals;
$self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
if ($self->{OPTIMIZE} !~ m!/!) {
- if ($self->{OPTIMIZE} =~ m!\b-g\b!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
+ if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
$self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
}
@@ -1266,13 +1106,6 @@ config :: $(INST_AUTODIR).exists
$(NOECHO) $(NOOP)
';
- push @m, q{
-config :: Version_check
- $(NOECHO) $(NOOP)
-
-} unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
-
-
push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
if (%{$self->{MAN1PODS}}) {
push @m, q[
@@ -1337,7 +1170,7 @@ static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
$(NOECHO) $(NOOP)
') unless $self->{SKIPHASH}{'static'};
- push(@m,'
+ push @m,'
$(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
$(CP) $(MMS$SOURCE) $(MMS$TARGET)
@@ -1345,9 +1178,32 @@ $(BASEEXT).opt : Makefile.PL
$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
- q[, 'FUNCLIST' => ],neatvalue($funclist),')"
- $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)
-');
+ q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
+
+ push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
+ if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
+ $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
+ push @m, ($Config{d_vms_case_sensitive_symbols}
+ ? uc($self->{BASEEXT}) :'$(BASEEXT)');
+ }
+ else { # We don't have a "main" object file, so pull 'em all in
+ # Upcase module names if linker is being case-sensitive
+ my($upcase) = $Config{d_vms_case_sensitive_symbols};
+ my(@omods) = map { s/\.[^.]*$//; # Trim off file type
+ s[\$\(\w+_EXT\)][]; # even as a macro
+ s/.*[:>\/\]]//; # Trim off dir spec
+ $upcase ? uc($_) : $_;
+ } split ' ', $self->eliminate_macros($self->{OBJECT});
+ my($tmp,@lines,$elt) = '';
+ my $tmp = shift @omods;
+ foreach $elt (@omods) {
+ $tmp .= ",$elt";
+ if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
+ }
+ push @lines, $tmp;
+ push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
+ }
+ push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
if (length $self->{LDLOADLIBS}) {
my($lib); my($line) = '';
@@ -1465,8 +1321,8 @@ $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
}
- foreach $lib (split $self->{EXTRALIBS}) {
- $lib = '""' if $lib eq '"';
+ push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
+ foreach $lib (split ' ', $self->{EXTRALIBS}) {
push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
}
push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
@@ -2186,12 +2042,13 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
$(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
Makefile.PL DIR=}, $dir, q{ \
MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
- MAKEAPERL=1 NORECURS=1
+ MAKEAPERL=1 NORECURS=1 };
+
+ push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
$(MAP_TARGET) :: $(MAKE_APERL_FILE)
$(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
};
- push @m, map( " \\\n\t\t$_", @ARGV );
push @m, "\n";
return join '', @m;
@@ -2312,9 +2169,9 @@ $(MAP_TARGET) :: $(MAKE_APERL_FILE)
$tmp = $self->fixpath($tmp,1);
if (@optlibs) { $extralist = join(' ',@optlibs); }
else { $extralist = ''; }
- # Let ExtUtils::Liblist find the necessary for us (but skip PerlShr;
+ # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
# that's what we're building here).
- push @optlibs, grep { !/PerlShr/i } split +($self->ext())[2];
+ push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
if ($libperl) {
unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
print STDOUT "Warning: $libperl not found\n";
diff --git a/contrib/perl5/lib/ExtUtils/MM_Win32.pm b/contrib/perl5/lib/ExtUtils/MM_Win32.pm
index 4070b2e..e08c679 100644
--- a/contrib/perl5/lib/ExtUtils/MM_Win32.pm
+++ b/contrib/perl5/lib/ExtUtils/MM_Win32.pm
@@ -36,6 +36,49 @@ $NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
$PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i;
$OBJ = 1 if $Config{'ccflags'} =~ /PERL_OBJECT/i;
+# a few workarounds for command.com (very basic)
+{
+ package ExtUtils::MM_Win95;
+
+ # the $^O test may be overkill, but we want to be sure Win32::IsWin95()
+ # exists before we try it
+
+ unshift @MM::ISA, 'ExtUtils::MM_Win95'
+ if ($^O =~ /Win32/ && Win32::IsWin95());
+
+ sub xs_c {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs.c:
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
+ $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+ '
+ }
+
+ sub xs_cpp {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs.cpp:
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
+ $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
+ ';
+ }
+
+ # many makes are too dumb to use xs_c then c_o
+ sub xs_o {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+.xs$(OBJ_EXT):
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
+ $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+ $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+ ';
+ }
+} # end of command.com workarounds
+
sub dlsyms {
my($self,%attribs) = @_;
@@ -250,12 +293,19 @@ XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
C_FILES = ".join(" \\\n\t", @{$self->{C}})."
O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
H_FILES = ".join(" \\\n\t", @{$self->{H}})."
+HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
+HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
";
for $tmp (qw/
- INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
+ INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
+ INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
+ INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
+ INST_HTMLLIBDIR HTMLEXT
+ INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
+ INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
/) {
next unless defined $self->{$tmp};
push @m, "$tmp = $self->{$tmp}\n";
@@ -338,7 +388,6 @@ PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
sub path {
- local $^W = 1;
my($self) = @_;
my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
my @path = split(';',$path);
@@ -434,6 +483,18 @@ sub dynamic_lib {
my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
my($ldfrom) = '$(LDFROM)';
my(@m);
+
+# one thing for GCC/Mingw32:
+# we try to overcome non-relocateable-DLL problems by generating
+# a (hopefully unique) image-base from the dll's name
+# -- BKS, 10-19-1999
+ if ($GCC) {
+ my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
+ $dllname =~ /(....)(.{0,4})/;
+ my $baseaddr = unpack("n", $1 ^ $2);
+ $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
+ }
+
push(@m,'
# This section creates the dynamically loadable $(INST_DYNAMIC)
# from $(OBJECT) and possibly $(MYEXTLIB).
@@ -472,11 +533,6 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
sub perl_archive
{
my ($self) = @_;
- if($OBJ) {
- if ($self->{CAPI}) {
- return '$(PERL_INC)\perlCAPI$(LIB_EXT)';
- }
- }
return '$(PERL_INC)\\'.$Config{'libperl'};
}
@@ -516,7 +572,9 @@ any ordinary, readable file.
sub perl_script {
my($self,$file) = @_;
+ return $file if -r $file && -f _;
return "$file.pl" if -r "$file.pl" && -f _;
+ return "$file.bat" if -r "$file.bat" && -f _;
return;
}
@@ -668,7 +726,7 @@ sub top_targets {
';
push @m, '
-all :: pure_all manifypods
+all :: pure_all htmlifypods manifypods
'.$self->{NOECHO}.'$(NOOP)
'
unless $self->{SKIPHASH}{'all'};
@@ -690,13 +748,25 @@ config :: $(INST_AUTODIR)\.exists
'.$self->{NOECHO}.'$(NOOP)
';
- push @m, qq{
-config :: Version_check
+ push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
+
+ if (%{$self->{HTMLLIBPODS}}) {
+ push @m, qq[
+config :: \$(INST_HTMLLIBDIR)/.exists
$self->{NOECHO}\$(NOOP)
-} unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
+];
+ push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
+ }
- push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
+ if (%{$self->{HTMLSCRIPTPODS}}) {
+ push @m, qq[
+config :: \$(INST_HTMLSCRIPTDIR)/.exists
+ $self->{NOECHO}\$(NOOP)
+
+];
+ push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
+ }
if (%{$self->{MAN1PODS}}) {
push @m, qq[
@@ -734,9 +804,62 @@ Version_check:
join('',@m);
}
+=item htmlifypods (o)
+
+Defines targets and routines to translate the pods into HTML manpages
+and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
+directories.
+
+Same as MM_Unix version (changes command-line quoting).
+
+=cut
+
+sub htmlifypods {
+ my($self, %attribs) = @_;
+ return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
+ %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
+ my($dist);
+ my($pod2html_exe);
+ if (defined $self->{PERL_SRC}) {
+ $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
+ } else {
+ $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
+ }
+ unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
+ # No pod2html but some HTMLxxxPODS to be installed
+ print <<END;
+
+Warning: I could not locate your pod2html program. Please make sure,
+ your pod2html program is in your PATH before you execute 'make'
+
+END
+ $pod2html_exe = "-S pod2html";
+ }
+ my(@m);
+ push @m,
+qq[POD2HTML_EXE = $pod2html_exe\n],
+qq[POD2HTML = \$(PERL) -we "use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){" \\\n],
+q[-e "next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M '],
+ $self->{MAKEFILE}, q[';" \\
+-e "print qq(Htmlifying $$m{$$_}\n);" \\
+-e "$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;" \\
+-e "system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn qq(Couldn\\047t install $$m{$$_}\n);" \\
+-e "chmod(oct($(PERM_RW))), $$m{$$_} or warn qq(chmod $(PERM_RW) $$m{$$_}: $$!\n);}"
+];
+ push @m, "\nhtmlifypods : pure_all ";
+ push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
+
+ push(@m,"\n");
+ if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
+ push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
+ push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
+ }
+ join('', @m);
+}
+
=item manifypods (o)
-We don't want manpage process. XXX add pod2html support later.
+We don't want manpage process.
=cut
diff --git a/contrib/perl5/lib/ExtUtils/MakeMaker.pm b/contrib/perl5/lib/ExtUtils/MakeMaker.pm
index 08a1c66..38cb216 100644
--- a/contrib/perl5/lib/ExtUtils/MakeMaker.pm
+++ b/contrib/perl5/lib/ExtUtils/MakeMaker.pm
@@ -2,7 +2,7 @@ BEGIN {require 5.002;} # MakeMaker 5.17 was the last MakeMaker that was compatib
package ExtUtils::MakeMaker;
-$VERSION = "5.4302";
+$VERSION = "5.45";
$Version_OK = "5.17"; # Makefiles older than $Version_OK will die
# (Will be checked from MakeMaker version 4.13 onwards)
($Revision = substr(q$Revision: 1.222 $, 10)) =~ s/\s+$//;
@@ -17,7 +17,7 @@ use Carp ();
use vars qw(
@ISA @EXPORT @EXPORT_OK $AUTOLOAD
- $ISA_TTY $Is_Mac $Is_OS2 $Is_VMS $Revision $Setup_done
+ $ISA_TTY $Is_Mac $Is_OS2 $Is_VMS $Revision
$VERSION $Verbose $Version_OK %Config %Keep_after_flush
%MM_Sections %Prepend_dot_dot %Recognized_Att_Keys
@Get_from_Config @MM_Sections @Overridable @Parent
@@ -70,6 +70,7 @@ $Is_VMS = $^O eq 'VMS';
$Is_OS2 = $^O eq 'os2';
$Is_Mac = $^O eq 'MacOS';
$Is_Win32 = $^O eq 'MSWin32';
+$Is_Cygwin= $^O eq 'cygwin';
require ExtUtils::MM_Unix;
@@ -86,36 +87,15 @@ if ($Is_Mac) {
if ($Is_Win32) {
require ExtUtils::MM_Win32;
}
-
-# The SelfLoader would bring a lot of overhead for MakeMaker, because
-# we know for sure we will use most of the autoloaded functions once
-# we have to use one of them. So we write our own loader
-
-sub AUTOLOAD {
- my $code;
- if (defined fileno(DATA)) {
- my $fh = select DATA;
- my $o = $/; # For future reads from the file.
- $/ = "\n__END__\n";
- $code = <DATA>;
- $/ = $o;
- select $fh;
- close DATA;
- eval $code;
- if ($@) {
- $@ =~ s/ at .*\n//;
- Carp::croak $@;
- }
- } else {
- warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
- }
- defined(&$AUTOLOAD) or die "Myloader inconsistency error";
- goto &$AUTOLOAD;
+if ($Is_Cygwin) {
+ require ExtUtils::MM_Cygwin;
}
-# The only subroutine we do not SelfLoad is Version_Check because it's
-# called so often. Loading this minimum still requires 1.2 secs on my
-# Indy :-(
+full_setup();
+
+# The use of the Version_check target has been dropped between perl
+# 5.5.63 and 5.5.64. We must keep the subroutine for a while so that
+# old Makefiles can satisfy the Version_check target.
sub Version_check {
my($checkversion) = @_;
@@ -136,38 +116,10 @@ sub warnhandler {
warn @_;
}
-sub ExtUtils::MakeMaker::eval_in_subdirs ;
-sub ExtUtils::MakeMaker::eval_in_x ;
-sub ExtUtils::MakeMaker::full_setup ;
-sub ExtUtils::MakeMaker::writeMakefile ;
-sub ExtUtils::MakeMaker::new ;
-sub ExtUtils::MakeMaker::check_manifest ;
-sub ExtUtils::MakeMaker::parse_args ;
-sub ExtUtils::MakeMaker::check_hints ;
-sub ExtUtils::MakeMaker::mv_all_methods ;
-sub ExtUtils::MakeMaker::skipcheck ;
-sub ExtUtils::MakeMaker::flush ;
-sub ExtUtils::MakeMaker::mkbootstrap ;
-sub ExtUtils::MakeMaker::mksymlists ;
-sub ExtUtils::MakeMaker::neatvalue ;
-sub ExtUtils::MakeMaker::selfdocument ;
-sub ExtUtils::MakeMaker::WriteMakefile ;
-sub ExtUtils::MakeMaker::prompt ($;$) ;
-
-1;
-
-__DATA__
-
-package ExtUtils::MakeMaker;
-
sub WriteMakefile {
Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
local $SIG{__WARN__} = \&warnhandler;
- unless ($Setup_done++){
- full_setup();
- undef &ExtUtils::MakeMaker::full_setup; #safe memory
- }
my %att = @_;
MM->new(\%att)->flush;
}
@@ -228,7 +180,6 @@ sub eval_in_x {
sub full_setup {
$Verbose ||= 0;
- $^W=1;
# package name for the classes into which the first object will be blessed
$PACKNAME = "PACK000";
@@ -237,15 +188,19 @@ sub full_setup {
AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION
C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS
- EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE FULLPERL FUNCLIST H IMPORTS
- INC INCLUDE_EXT INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLMAN1DIR
+ EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE FULLPERL FUNCLIST H
+ HTMLLIBPODS HTMLSCRIPTPOD IMPORTS
+ INC INCLUDE_EXT INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLHTMLPRIVLIBDIR
+ INSTALLHTMLSCRIPTDIR INSTALLHTMLSITELIBDIR INSTALLMAN1DIR
INSTALLMAN3DIR INSTALLPRIVLIB INSTALLSCRIPT INSTALLSITEARCH
INSTALLSITELIB INST_ARCHLIB INST_BIN INST_EXE INST_LIB
+ INST_HTMLLIBDIR INST_HTMLSCRIPTDIR
INST_MAN1DIR INST_MAN3DIR INST_SCRIPT LDFROM LIB LIBPERL_A LIBS
LINKTYPE MAKEAPERL MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB
+ PERL_MALLOC_OK
NAME NEEDS_LINKING NOECHO NORECURS NO_VC OBJECT OPTIMIZE PERL PERLMAINCC
PERL_ARCHLIB PERL_LIB PERL_SRC PERM_RW PERM_RWX
- PL_FILES PM PMLIBDIRS PPM_INSTALL_EXEC PPM_INSTALL_SCRIPT PREFIX
+ PL_FILES PM PMLIBDIRS POLLUTE PPM_INSTALL_EXEC PPM_INSTALL_SCRIPT PREFIX
PREREQ_PM SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
XS_VERSION clean depend dist dynamic_lib linkext macro realclean
tool_autosplit
@@ -272,7 +227,8 @@ sub full_setup {
pasthru
c_o xs_c xs_o top_targets linkext dlsyms dynamic dynamic_bs
- dynamic_lib static static_lib manifypods processPL installbin subdirs
+ dynamic_lib static static_lib htmlifypods manifypods processPL
+ installbin subdirs
clean realclean dist_basics dist_core dist_dir dist_test dist_ci
install force perldepend makefile staticmake test ppd
@@ -303,7 +259,8 @@ sub full_setup {
@Get_from_Config =
qw(
ar cc cccdlflags ccdlflags dlext dlsrc ld lddlflags ldflags libc
- lib_ext obj_ext osname osvers ranlib sitelibexp sitearchexp so exe_ext
+ lib_ext obj_ext osname osvers ranlib sitelibexp sitearchexp so
+ exe_ext full_ar
);
my $item;
@@ -324,9 +281,9 @@ sub full_setup {
%Prepend_dot_dot =
qw(
- INST_BIN 1 INST_EXE 1 INST_LIB 1 INST_ARCHLIB 1 INST_SCRIPT
- 1 MAP_TARGET 1 INST_MAN1DIR 1 INST_MAN3DIR 1 PERL_SRC 1
- PERL 1 FULLPERL 1
+ INST_BIN 1 INST_EXE 1 INST_LIB 1 INST_ARCHLIB 1 INST_SCRIPT 1
+ MAP_TARGET 1 INST_HTMLLIBDIR 1 INST_HTMLSCRIPTDIR 1
+ INST_MAN1DIR 1 INST_MAN3DIR 1 PERL_SRC 1 PERL 1 FULLPERL 1
);
@@ -373,9 +330,13 @@ sub ExtUtils::MakeMaker::new {
my($prereq);
foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
- my $eval = "use $prereq $self->{PREREQ_PM}->{$prereq}";
+ my $eval = "require $prereq";
eval $eval;
- if ($@){
+
+ if ($@) {
+ warn "Warning: prerequisite $prereq failed to load: $@";
+ }
+ elsif ($prereq->VERSION < $self->{PREREQ_PM}->{$prereq} ){
warn "Warning: prerequisite $prereq $self->{PREREQ_PM}->{$prereq} not found";
# Why is/was this 'delete' here? We need PREREQ_PM later to make PPDs.
# } else {
@@ -441,11 +402,13 @@ sub ExtUtils::MakeMaker::new {
}
if ($self->{PARENT}) {
$self->{PARENT}->{CHILDREN}->{$newclass} = $self;
- if (exists $self->{PARENT}->{CAPI}
- and not exists $self->{CAPI})
- {
- # inherit, but only if already unspecified
- $self->{CAPI} = $self->{PARENT}->{CAPI};
+ foreach my $opt (qw(CAPI POLLUTE)) {
+ if (exists $self->{PARENT}->{$opt}
+ and not exists $self->{$opt})
+ {
+ # inherit, but only if already unspecified
+ $self->{$opt} = $self->{PARENT}->{$opt};
+ }
}
}
} else {
@@ -471,7 +434,7 @@ sub ExtUtils::MakeMaker::new {
else {
$pthinks =~ s!/Config\.pm$!!; $pthinks =~ s!.*/!!;
}
- print STDOUT <<END;
+ print STDOUT <<END unless $self->{UNINSTALLED_PERL};
Your perl and your Config.pm seem to have different ideas about the architecture
they are running on.
Perl thinks: [$pthinks]
@@ -973,26 +936,29 @@ want to specify some other option, set C<TESTDB_SW> variable:
=head2 make install
make alone puts all relevant files into directories that are named by
-the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_MAN1DIR, and
-INST_MAN3DIR. All these default to something below ./blib if you are
-I<not> building below the perl source directory. If you I<are>
-building below the perl source, INST_LIB and INST_ARCHLIB default to
- ../../lib, and INST_SCRIPT is not defined.
+the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_HTMLLIBDIR,
+INST_HTMLSCRIPTDIR, INST_MAN1DIR, and INST_MAN3DIR. All these default
+to something below ./blib if you are I<not> building below the perl
+source directory. If you I<are> building below the perl source,
+INST_LIB and INST_ARCHLIB default to ../../lib, and INST_SCRIPT is not
+defined.
The I<install> target of the generated Makefile copies the files found
below each of the INST_* directories to their INSTALL*
counterparts. Which counterparts are chosen depends on the setting of
INSTALLDIRS according to the following table:
- INSTALLDIRS set to
- perl site
+ INSTALLDIRS set to
+ perl site
- INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH
- INST_LIB INSTALLPRIVLIB INSTALLSITELIB
- INST_BIN INSTALLBIN
- INST_SCRIPT INSTALLSCRIPT
- INST_MAN1DIR INSTALLMAN1DIR
- INST_MAN3DIR INSTALLMAN3DIR
+ INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH
+ INST_LIB INSTALLPRIVLIB INSTALLSITELIB
+ INST_HTMLLIBDIR INSTALLHTMLPRIVLIBDIR INSTALLHTMLSITELIBDIR
+ INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
+ INST_BIN INSTALLBIN
+ INST_SCRIPT INSTALLSCRIPT
+ INST_MAN1DIR INSTALLMAN1DIR
+ INST_MAN3DIR INSTALLMAN3DIR
The INSTALL... macros in turn default to their %Config
($Config{installprivlib}, $Config{installarchlib}, etc.) counterparts.
@@ -1169,7 +1135,7 @@ MakeMaker gives you much more freedom than needed to configure
internal variables and get different results. It is worth to mention,
that make(1) also lets you configure most of the variables that are
used in the Makefile. But in the majority of situations this will not
-be necessary, and should only be done, if the author of a package
+be necessary, and should only be done if the author of a package
recommends it (or you know what you're doing).
=head2 Using Attributes and Parameters
@@ -1213,6 +1179,9 @@ currently used by MakeMaker but may be handy in Makefile.PLs.
=item CAPI
+[This attribute is obsolete in Perl 5.6. PERL_OBJECT builds are C-compatible
+by default.]
+
Switch to force usage of the Perl C API even when compiling for PERL_OBJECT.
Note that this attribute is passed through to any recursive build,
@@ -1326,6 +1295,20 @@ names are passed through unaltered to the linker options file.
Ref to array of *.h file names. Similar to C.
+=item HTMLLIBPODS
+
+Hashref of .pm and .pod files. MakeMaker will default this to all
+ .pod and any .pm files that include POD directives. The files listed
+here will be converted to HTML format and installed as was requested
+at Configure time.
+
+=item HTMLSCRIPTPODS
+
+Hashref of pod-containing files. MakeMaker will default this to all
+EXE_FILES files that include POD directives. The files listed
+here will be converted to HTML format and installed as was requested
+at Configure time.
+
=item IMPORTS
This attribute is used to specify names to be imported into the
@@ -1366,6 +1349,22 @@ choose: installprivlib and installarchlib versus installsitelib and
installsitearch. The first pair is chosen with INSTALLDIRS=perl, the
second with INSTALLDIRS=site. Default is site.
+=item INSTALLHTMLPRIVLIBDIR
+
+This directory gets the HTML pages at 'make install' time. Defaults to
+$Config{installhtmlprivlibdir}.
+
+=item INSTALLHTMLSCRIPTDIR
+
+This directory gets the HTML pages at 'make install' time. Defaults to
+$Config{installhtmlscriptdir}.
+
+=item INSTALLHTMLSITELIBDIR
+
+This directory gets the HTML pages at 'make install' time. Defaults to
+$Config{installhtmlsitelibdir}.
+
+
=item INSTALLMAN1DIR
This directory gets the man pages at 'make install' time. Defaults to
@@ -1415,6 +1414,14 @@ need to use it.
Directory where we put library files of this extension while building
it.
+=item INST_HTMLLIBDIR
+
+Directory to hold the man pages in HTML format at 'make' time
+
+=item INST_HTMLSCRIPTDIR
+
+Directory to hold the man pages in HTML format at 'make' time
+
=item INST_MAN1DIR
Directory to hold the man pages at 'make' time
@@ -1426,10 +1433,38 @@ Directory to hold the man pages at 'make' time
=item INST_SCRIPT
Directory, where executable files should be installed during
-'make'. Defaults to "./blib/bin", just to have a dummy location during
+'make'. Defaults to "./blib/script", just to have a dummy location during
testing. make install will copy the files in INST_SCRIPT to
INSTALLSCRIPT.
+=item PERL_MALLOC_OK
+
+defaults to 0. Should be set to TRUE if the extension can work with
+the memory allocation routines substituted by the Perl malloc() subsystem.
+This should be applicable to most extensions with exceptions of those
+
+=over
+
+=item *
+
+with bugs in memory allocations which are caught by Perl's malloc();
+
+=item *
+
+which interact with the memory allocator in other ways than via
+malloc(), realloc(), free(), calloc(), sbrk() and brk();
+
+=item *
+
+which rely on special alignment which is not provided by Perl's malloc().
+
+=back
+
+B<NOTE.> Negligence to set this flag in I<any one> of loaded extension
+nullifies many advantages of Perl's malloc(), such as better usage of
+system resources, error detection, memory usage reporting, catchable failure
+of memory allocations, etc.
+
=item LDFROM
defaults to "$(OBJECT)" and is used in the ld command to specify
@@ -1515,9 +1550,9 @@ Makefile.PL.
=item NEEDS_LINKING
-MakeMaker will figure out, if an extension contains linkable code
+MakeMaker will figure out if an extension contains linkable code
anywhere down the directory tree, and will set this variable
-accordingly, but you can speed it up a very little bit, if you define
+accordingly, but you can speed it up a very little bit if you define
this boolean variable yourself.
=item NOECHO
@@ -1532,7 +1567,7 @@ Boolean. Attribute to inhibit descending into subdirectories.
=item NO_VC
-In general any generated Makefile checks for the current version of
+In general, any generated Makefile checks for the current version of
MakeMaker and the version the Makefile was built under. If NO_VC is
set, the version check is neglected. Do not write this into your
Makefile.PL, use it interactively instead.
@@ -1559,7 +1594,7 @@ to $(CC).
=item PERL_ARCHLIB
-Same as above for architecture dependent files
+Same as above for architecture dependent files.
=item PERL_LIB
@@ -1613,6 +1648,18 @@ they contain will be installed in the corresponding location in the
library. A libscan() method can be used to alter the behaviour.
Defining PM in the Makefile.PL will override PMLIBDIRS.
+=item POLLUTE
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility. As of release 5.6, these
+preprocessor definitions are not available by default. The POLLUTE flag
+specifies that the old names should still be defined:
+
+ perl Makefile.PL POLLUTE=1
+
+Please inform the module author if this is necessary to successfully install
+a module under 5.6 or later.
+
=item PPM_INSTALL_EXEC
Name of the executable used to run C<PPM_INSTALL_SCRIPT> below. (e.g. perl)
@@ -1641,8 +1688,8 @@ only check if any version is installed already.
=item SKIP
Arryref. E.g. [qw(name1 name2)] skip (do not write) sections of the
-Makefile. Caution! Do not use the SKIP attribute for the neglectible
-speedup. It may seriously damage the resulting Makefile. Only use it,
+Makefile. Caution! Do not use the SKIP attribute for the negligible
+speedup. It may seriously damage the resulting Makefile. Only use it
if you really need it.
=item TYPEMAPS
@@ -1765,7 +1812,7 @@ NB: Extensions that have nothing but *.pm files had to say
{LINKTYPE => ''}
with Pre-5.0 MakeMakers. Since version 5.00 of MakeMaker such a line
-can be deleted safely. MakeMaker recognizes, when there's nothing to
+can be deleted safely. MakeMaker recognizes when there's nothing to
be linked.
=item macro
@@ -1776,9 +1823,13 @@ be linked.
{FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
+=item test
+
+ {TESTS => 't/*.t'}
+
=item tool_autosplit
- {MAXLEN =E<gt> 8}
+ {MAXLEN => 8}
=back
@@ -1864,7 +1915,7 @@ details)
=item make distclean
does a realclean first and then the distcheck. Note that this is not
-needed to build a new distribution as long as you are sure, that the
+needed to build a new distribution as long as you are sure that the
MANIFEST file is ok.
=item make manifest
diff --git a/contrib/perl5/lib/ExtUtils/Manifest.pm b/contrib/perl5/lib/ExtUtils/Manifest.pm
index 1a6dde7..8bb3fc8 100644
--- a/contrib/perl5/lib/ExtUtils/Manifest.pm
+++ b/contrib/perl5/lib/ExtUtils/Manifest.pm
@@ -25,6 +25,7 @@ $MANIFEST = 'MANIFEST';
# Really cool fix from Ilya :)
unless (defined $Config{d_link}) {
+ no warnings;
*ln = \&cp;
}
@@ -186,7 +187,6 @@ sub manicopy {
require File::Basename;
my(%dirs,$file);
$target = VMS::Filespec::unixify($target) if $Is_VMS;
- umask 0 unless $Is_VMS;
File::Path::mkpath([ $target ],1,$Is_VMS ? undef : 0755);
foreach $file (keys %$read){
$file = VMS::Filespec::unixify($file) if $Is_VMS;
@@ -268,27 +268,27 @@ ExtUtils::Manifest - utilities to write and check a MANIFEST file
=head1 SYNOPSIS
-C<require ExtUtils::Manifest;>
+ require ExtUtils::Manifest;
-C<ExtUtils::Manifest::mkmanifest;>
+ ExtUtils::Manifest::mkmanifest;
-C<ExtUtils::Manifest::manicheck;>
+ ExtUtils::Manifest::manicheck;
-C<ExtUtils::Manifest::filecheck;>
+ ExtUtils::Manifest::filecheck;
-C<ExtUtils::Manifest::fullcheck;>
+ ExtUtils::Manifest::fullcheck;
-C<ExtUtils::Manifest::skipcheck;>
+ ExtUtils::Manifest::skipcheck;
-C<ExtUtild::Manifest::manifind();>
+ ExtUtils::Manifest::manifind();
-C<ExtUtils::Manifest::maniread($file);>
+ ExtUtils::Manifest::maniread($file);
-C<ExtUtils::Manifest::manicopy($read,$target,$how);>
+ ExtUtils::Manifest::manicopy($read,$target,$how);
=head1 DESCRIPTION
-Mkmanifest() writes all files in and below the current directory to a
+mkmanifest() writes all files in and below the current directory to a
file named in the global variable $ExtUtils::Manifest::MANIFEST (which
defaults to C<MANIFEST>) in the current directory. It works similar to
@@ -302,33 +302,33 @@ comments are separated by one or more TAB characters in the
output. All files that match any regular expression in a file
C<MANIFEST.SKIP> (if such a file exists) are ignored.
-Manicheck() checks if all the files within a C<MANIFEST> in the
+manicheck() checks if all the files within a C<MANIFEST> in the
current directory really do exist. It only reports discrepancies and
exits silently if MANIFEST and the tree below the current directory
are in sync.
-Filecheck() finds files below the current directory that are not
+filecheck() finds files below the current directory that are not
mentioned in the C<MANIFEST> file. An optional file C<MANIFEST.SKIP>
will be consulted. Any file matching a regular expression in such a
file will not be reported as missing in the C<MANIFEST> file.
-Fullcheck() does both a manicheck() and a filecheck().
+fullcheck() does both a manicheck() and a filecheck().
-Skipcheck() lists all the files that are skipped due to your
+skipcheck() lists all the files that are skipped due to your
C<MANIFEST.SKIP> file.
-Manifind() returns a hash reference. The keys of the hash are the
+manifind() returns a hash reference. The keys of the hash are the
files found below the current directory.
-Maniread($file) reads a named C<MANIFEST> file (defaults to
+maniread($file) reads a named C<MANIFEST> file (defaults to
C<MANIFEST> in the current directory) and returns a HASH reference
with files being the keys and comments being the values of the HASH.
Blank lines and lines which start with C<#> in the C<MANIFEST> file
are discarded.
-I<Manicopy($read,$target,$how)> copies the files that are the keys in
+C<manicopy($read,$target,$how)> copies the files that are the keys in
the HASH I<%$read> to the named target directory. The HASH reference
-I<$read> is typically returned by the maniread() function. This
+$read is typically returned by the maniread() function. This
function is useful for producing a directory tree identical to the
intended distribution tree. The third parameter $how can be used to
specify a different methods of "copying". Valid values are C<cp>,
diff --git a/contrib/perl5/lib/ExtUtils/Mkbootstrap.pm b/contrib/perl5/lib/ExtUtils/Mkbootstrap.pm
index 25c374c..323c3ab 100644
--- a/contrib/perl5/lib/ExtUtils/Mkbootstrap.pm
+++ b/contrib/perl5/lib/ExtUtils/Mkbootstrap.pm
@@ -81,8 +81,8 @@ C<mkbootstrap>
Mkbootstrap typically gets called from an extension Makefile.
-There is no C<*.bs> file supplied with the extension. Instead a
-C<*_BS> file which has code for the special cases, like posix for
+There is no C<*.bs> file supplied with the extension. Instead, there may
+be a C<*_BS> file which has code for the special cases, like posix for
berkeley db on the NeXT.
This file will get parsed, and produce a maybe empty
diff --git a/contrib/perl5/lib/ExtUtils/Mksymlists.pm b/contrib/perl5/lib/ExtUtils/Mksymlists.pm
index 76535d9..c8f41c7 100644
--- a/contrib/perl5/lib/ExtUtils/Mksymlists.pm
+++ b/contrib/perl5/lib/ExtUtils/Mksymlists.pm
@@ -1,10 +1,12 @@
package ExtUtils::Mksymlists;
+
+use 5.005_64;
use strict qw[ subs refs ];
# no strict 'vars'; # until filehandles are exempted
use Carp;
use Exporter;
-use vars qw( @ISA @EXPORT $VERSION );
+our(@ISA, @EXPORT, $VERSION);
@ISA = 'Exporter';
@EXPORT = '&Mksymlists';
$VERSION = substr q$Revision: 1.17 $, 10;
@@ -76,12 +78,19 @@ sub _write_os2 {
($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
$data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
}
+ my $distname = $data->{DISTNAME} || $data->{NAME};
+ $distname = "Distribution $distname";
+ my $comment = "Perl (v$Config::Config{version}$threaded) module $data->{NAME}";
+ if ($data->{INSTALLDIRS} and $data->{INSTALLDIRS} eq 'perl') {
+ $distname = 'perl5-porters@perl.org';
+ $comment = "Core $comment";
+ }
rename "$data->{FILE}.def", "$data->{FILE}_def.old";
open(DEF,">$data->{FILE}.def")
or croak("Can't create $data->{FILE}.def: $!\n");
print DEF "LIBRARY '$data->{DLBASE}' INITINSTANCE TERMINSTANCE\n";
- print DEF "DESCRIPTION 'Perl (v$]$threaded) module $data->{NAME} v$data->{VERSION}'\n";
+ print DEF "DESCRIPTION '\@#$distname:$data->{VERSION}#\@ $comment'\n";
print DEF "CODE LOADONCALL\n";
print DEF "DATA LOADONCALL NONSHARED MULTIPLE\n";
print DEF "EXPORTS\n ";
@@ -148,7 +157,7 @@ sub _write_vms {
require Config; # a reminder for once we do $^O
require ExtUtils::XSSymSet;
- my($isvax) = $Config::Config{'arch'} =~ /VAX/i;
+ my($isvax) = $Config::Config{'archname'} =~ /VAX/i;
my($set) = new ExtUtils::XSSymSet;
my($sym);
@@ -164,6 +173,8 @@ sub _write_vms {
# We don't do anything to preserve order, so we won't relax
# the GSMATCH criteria for a dynamic extension
+ print OPT "case_sensitive=yes\n"
+ if $Config::Config{d_vms_case_sensitive_symbols};
foreach $sym (@{$data->{FUNCLIST}}) {
my $safe = $set->addsym($sym);
if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
diff --git a/contrib/perl5/lib/ExtUtils/Packlist.pm b/contrib/perl5/lib/ExtUtils/Packlist.pm
index eeb0a5b..88ea206 100644
--- a/contrib/perl5/lib/ExtUtils/Packlist.pm
+++ b/contrib/perl5/lib/ExtUtils/Packlist.pm
@@ -1,8 +1,9 @@
package ExtUtils::Packlist;
+
+use 5.005_64;
use strict;
use Carp qw();
-use vars qw($VERSION);
-$VERSION = '0.03';
+our $VERSION = '0.03';
# Used for generating filehandle globs. IO::File might not be available!
my $fhname = "FH1";
diff --git a/contrib/perl5/lib/ExtUtils/typemap b/contrib/perl5/lib/ExtUtils/typemap
index b1ec063..a34cd4f 100644
--- a/contrib/perl5/lib/ExtUtils/typemap
+++ b/contrib/perl5/lib/ExtUtils/typemap
@@ -1,4 +1,4 @@
-# $Header$
+# $Header: /home/rmb1/misc/CVS/perl5.005_61/lib/ExtUtils/typemap,v 1.3 1999/09/13 09:46:43 rmb1 Exp $
# basic C types
int T_IV
unsigned T_UV
@@ -29,6 +29,7 @@ HV * T_HVREF
CV * T_CVREF
IV T_IV
+UV T_UV
I32 T_IV
I16 T_IV
I8 T_IV
@@ -106,11 +107,11 @@ T_DOUBLE
T_PV
$var = ($type)SvPV($arg,PL_na)
T_PTR
- $var = ($type)SvIV($arg)
+ $var = INT2PTR($type,SvIV($arg))
T_PTRREF
if (SvROK($arg)) {
IV tmp = SvIV((SV*)SvRV($arg));
- $var = ($type) tmp;
+ $var = INT2PTR($type,tmp);
}
else
croak(\"$var is not a reference\")
@@ -131,7 +132,7 @@ T_REF_IV_PTR
T_PTROBJ
if (sv_derived_from($arg, \"${ntype}\")) {
IV tmp = SvIV((SV*)SvRV($arg));
- $var = ($type) tmp;
+ $var = INT2PTR($type,tmp);
}
else
croak(\"$var is not of type ${ntype}\")
@@ -146,14 +147,14 @@ T_PTRDESC
T_REFREF
if (SvROK($arg)) {
IV tmp = SvIV((SV*)SvRV($arg));
- $var = *($type) tmp;
+ $var = *INT2PTR($type,tmp);
}
else
croak(\"$var is not a reference\")
T_REFOBJ
if (sv_isa($arg, \"${ntype}\")) {
IV tmp = SvIV((SV*)SvRV($arg));
- $var = *($type) tmp;
+ $var = *INT2PTR($type,tmp);
}
else
croak(\"$var is not of type ${ntype}\")
@@ -250,7 +251,7 @@ T_REFOBJ
T_OPAQUE
sv_setpvn($arg, (char *)&$var, sizeof($var));
T_OPAQUEPTR
- sv_setpvn($arg, (char *)$var, sizeof(*$var)), XFree((char *)$var);
+ sv_setpvn($arg, (char *)$var, sizeof(*$var));
T_PACKED
XS_pack_$ntype($arg, $var);
T_PACKEDARRAY
diff --git a/contrib/perl5/lib/ExtUtils/xsubpp b/contrib/perl5/lib/ExtUtils/xsubpp
index 1ee7b29..5a71e89 100755
--- a/contrib/perl5/lib/ExtUtils/xsubpp
+++ b/contrib/perl5/lib/ExtUtils/xsubpp
@@ -6,10 +6,12 @@ xsubpp - compiler to convert Perl XS code into C code
=head1 SYNOPSIS
-B<xsubpp> [B<-v>] [B<-C++>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-typemap typemap>] [B<-object_capi>]... file.xs
+B<xsubpp> [B<-v>] [B<-C++>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] ... file.xs
=head1 DESCRIPTION
+This compiler is typically run by the makefiles created by L<ExtUtils::MakeMaker>.
+
I<xsubpp> will compile XS code into C code by embedding the constructs
necessary to let C functions manipulate Perl values and creates the glue
necessary to let Perl access those functions. The compiler uses typemaps to
@@ -23,13 +25,15 @@ typemap taking precedence.
=head1 OPTIONS
+Note that the C<XSOPT> MakeMaker option may be used to add these options to
+any makefiles generated by MakeMaker.
+
=over 5
=item B<-C++>
Adds ``extern "C"'' to the C code.
-
=item B<-except>
Adds exception handling stubs to the C code.
@@ -59,11 +63,22 @@ number.
Prevents the inclusion of `#line' directives in the output.
-=item B<-object_capi>
+=item B<-nooptimize>
+
+Disables certain optimizations. The only optimization that is currently
+affected is the use of I<target>s by the output C code (see L<perlguts>).
+This may significantly slow down the generated code, but this is the way
+B<xsubpp> of 5.005 and earlier operated.
+
+=item B<-noinout>
-Compile code as C in a PERL_OBJECT environment.
+Disable recognition of C<IN>, C<OUT_LIST> and C<INOUT_LIST> declarations.
-back
+=item B<-noargtypes>
+
+Disable recognition of ANSI-like descriptions of function signature.
+
+=back
=head1 ENVIRONMENT
@@ -107,7 +122,7 @@ if ($^O eq 'VMS') {
$FH = 'File0000' ;
-$usage = "Usage: xsubpp [-v] [-C++] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-s pattern] [-typemap typemap]... file.xs\n";
+$usage = "Usage: xsubpp [-v] [-C++] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-s pattern] [-typemap typemap]... file.xs\n";
$proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
# mjn
@@ -118,6 +133,11 @@ $WantPrototypes = -1 ;
$WantVersionChk = 1 ;
$ProtoUsed = 0 ;
$WantLineNumbers = 1 ;
+$WantOptimize = 1 ;
+
+my $process_inout = 1;
+my $process_argtypes = 1;
+
SWITCH: while (@ARGV and $ARGV[0] =~ /^-./) {
$flag = shift @ARGV;
$flag =~ s/^-// ;
@@ -127,12 +147,19 @@ SWITCH: while (@ARGV and $ARGV[0] =~ /^-./) {
$WantPrototypes = 1, next SWITCH if $flag eq 'prototypes';
$WantVersionChk = 0, next SWITCH if $flag eq 'noversioncheck';
$WantVersionChk = 1, next SWITCH if $flag eq 'versioncheck';
+ # XXX left this in for compat
$WantCAPI = 1, next SWITCH if $flag eq 'object_capi';
$except = " TRY", next SWITCH if $flag eq 'except';
push(@tm,shift), next SWITCH if $flag eq 'typemap';
$WantLineNumbers = 0, next SWITCH if $flag eq 'nolinenumbers';
$WantLineNumbers = 1, next SWITCH if $flag eq 'linenumbers';
- (print "xsubpp version $XSUBPP_version\n"), exit
+ $WantOptimize = 0, next SWITCH if $flag eq 'nooptimize';
+ $WantOptimize = 1, next SWITCH if $flag eq 'optimize';
+ $process_inout = 0, next SWITCH if $flag eq 'noinout';
+ $process_inout = 1, next SWITCH if $flag eq 'inout';
+ $process_argtypes = 0, next SWITCH if $flag eq 'noargtypes';
+ $process_argtypes = 1, next SWITCH if $flag eq 'argtypes';
+ (print "xsubpp version $XSUBPP_version\n"), exit
if $flag eq 'v';
die $usage;
}
@@ -238,13 +265,31 @@ foreach $key (keys %input_expr) {
$input_expr{$key} =~ s/\n+$//;
}
+$bal = qr[(?:(?>[^()]+)|\((??{ $bal })\))*]; # ()-balanced
+$cast = qr[(?:\(\s*SV\s*\*\s*\)\s*)?]; # Optional (SV*) cast
+$size = qr[,\s* (??{ $bal }) ]x; # Third arg (to setpvn)
+
+foreach $key (keys %output_expr) {
+ use re 'eval';
+
+ my ($t, $with_size, $arg, $sarg) =
+ ($output_expr{$key} =~
+ m[^ \s+ sv_set ( [iunp] ) v (n)? # Type, is_setpvn
+ \s* \( \s* $cast \$arg \s* ,
+ \s* ( (??{ $bal }) ) # Set from
+ ( (??{ $size }) )? # Possible sizeof set-from
+ \) \s* ; \s* $
+ ]x);
+ $targetable{$key} = [$t, $with_size, $arg, $sarg] if $t;
+}
+
$END = "!End!\n\n"; # "impossible" keyword (multiple newline)
# Match an XS keyword
$BLOCK_re= '\s*(' . join('|', qw(
REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE OUTPUT
CLEANUP ALIAS PROTOTYPES PROTOTYPE VERSIONCHECK INCLUDE
- SCOPE INTERFACE INTERFACE_MACRO C_ARGS
+ SCOPE INTERFACE INTERFACE_MACRO C_ARGS POSTCALL
)) . "|$END)\\s*:";
# Input: ($_, @line) == unparsed input.
@@ -255,6 +300,19 @@ sub check_keyword {
s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2;
}
+my ($C_group_rex, $C_arg);
+# Group in C (no support for comments or literals)
+$C_group_rex = qr/ [({\[]
+ (?: (?> [^()\[\]{}]+ ) | (??{ $C_group_rex }) )*
+ [)}\]] /x ;
+# Chunk in C without comma at toplevel (no comments):
+$C_arg = qr/ (?: (?> [^()\[\]{},"']+ )
+ | (??{ $C_group_rex })
+ | " (?: (?> [^\\"]+ )
+ | \\.
+ )* " # String literal
+ | ' (?: (?> [^\\']+ ) | \\. )* ' # Char literal
+ )* /xs;
if ($WantLineNumbers) {
{
@@ -365,12 +423,23 @@ sub INPUT_handler {
# Check for duplicate definitions
blurt ("Error: duplicate definition of argument '$var_name' ignored"), next
- if $arg_list{$var_name} ++ ;
+ if $arg_list{$var_name}++
+ or defined $arg_types{$var_name} and not $processing_arg_with_types;
$thisdone |= $var_name eq "THIS";
$retvaldone |= $var_name eq "RETVAL";
$var_types{$var_name} = $var_type;
- print "\t" . &map_type($var_type);
+ # XXXX This check is a safeguard against the unfinished conversion of
+ # generate_init(). When generate_init() is fixed,
+ # one can use 2-args map_type() unconditionally.
+ if ($var_type =~ / \( \s* \* \s* \) /x) {
+ # Function pointers are not yet supported with &output_init!
+ print "\t" . &map_type($var_type, $var_name);
+ $name_printed = 1;
+ } else {
+ print "\t" . &map_type($var_type);
+ $name_printed = 0;
+ }
$var_num = $args_match{$var_name};
$proto_arg[$var_num] = ProtoString($var_type)
@@ -379,13 +448,19 @@ sub INPUT_handler {
$var_addr{$var_name} = 1;
$func_args =~ s/\b($var_name)\b/&$1/;
}
- if ($var_init =~ /^[=;]\s*NO_INIT\s*;?\s*$/) {
+ if ($var_init =~ /^[=;]\s*NO_INIT\s*;?\s*$/
+ or $in_out{$var_name} and $in_out{$var_name} eq 'OUTLIST'
+ and $var_init !~ /\S/) {
+ if ($name_printed) {
+ print ";\n";
+ } else {
print "\t$var_name;\n";
+ }
} elsif ($var_init =~ /\S/) {
- &output_init($var_type, $var_num, $var_name, $var_init);
+ &output_init($var_type, $var_num, $var_name, $var_init, $name_printed);
} elsif ($var_num) {
# generate initialization code
- &generate_init($var_type, $var_num, $var_name);
+ &generate_init($var_type, $var_num, $var_name, $name_printed);
} else {
print ";\n";
}
@@ -460,6 +535,7 @@ EOF
sub CLEANUP_handler() { print_section() }
sub PREINIT_handler() { print_section() }
+sub POSTCALL_handler() { print_section() }
sub INIT_handler() { print_section() }
sub GetAliases
@@ -829,7 +905,7 @@ sub fetch_para {
my $tmp_line;
$lastline .= $tmp_line
while ($lastline =~ /\\$/ && defined($tmp_line = <$FH>));
-
+
chomp $lastline;
$lastline =~ s/^\s+$//;
}
@@ -896,15 +972,23 @@ while (fetch_para()) {
undef($static);
undef($elipsis);
undef($wantRETVAL) ;
+ undef($RETVAL_no_return) ;
undef(%arg_list) ;
undef(@proto_arg) ;
+ undef(@arg_with_types) ;
+ undef($processing_arg_with_types) ;
+ undef(%arg_types) ;
+ undef(@in_out) ;
+ undef(%in_out) ;
undef($proto_in_this_xsub) ;
undef($scope_in_this_xsub) ;
undef($interface);
+ undef($prepush_done);
$interface_macro = 'XSINTERFACE_FUNC' ;
$interface_macro_set = 'XSINTERFACE_FUNC_SET' ;
$ProtoThisXSUB = $WantPrototypes ;
$ScopeThisXSUB = 0;
+ $xsreturn = 0;
$_ = shift(@line);
while ($kwd = check_keyword("REQUIRE|PROTOTYPES|VERSIONCHECK|INCLUDE")) {
@@ -924,6 +1008,12 @@ while (fetch_para()) {
# extract return type, function name and arguments
($ret_type) = TidyType($_);
+ $RETVAL_no_return = 1 if $ret_type =~ s/^NO_OUTPUT\s+//;
+
+ # Allow one-line ANSI-like declaration
+ unshift @line, $2
+ if $process_argtypes
+ and $ret_type =~ s/^(.*?\w.*?)\s*\b(\w+\s*\(.*)/$1/s;
# a function definition needs at least 2 lines
blurt ("Error: Function definition too short '$ret_type'"), next PARAGRAPH
@@ -933,7 +1023,7 @@ while (fetch_para()) {
$func_header = shift(@line);
blurt ("Error: Cannot parse function definition from '$func_header'"), next PARAGRAPH
- unless $func_header =~ /^(?:([\w:]*)::)?(\w+)\s*\(\s*(.*?)\s*\)\s*(const)?\s*$/s;
+ unless $func_header =~ /^(?:([\w:]*)::)?(\w+)\s*\(\s*(.*?)\s*\)\s*(const)?\s*(;\s*)?$/s;
($class, $func_name, $orig_args) = ($1, $2, $3) ;
$class = "$4 $class" if $4;
@@ -952,38 +1042,98 @@ while (fetch_para()) {
%XsubAliases = %XsubAliasValues = %Interfaces = ();
$DoSetMagic = 1;
- @args = split(/\s*,\s*/, $orig_args);
+ $orig_args =~ s/\\\s*/ /g; # process line continuations
+
+ my %out_vars;
+ if ($process_argtypes and $orig_args =~ /\S/) {
+ my $args = "$orig_args ,";
+ if ($args =~ /^( (??{ $C_arg }) , )* $ /x) {
+ @args = ($args =~ /\G ( (??{ $C_arg }) ) , /xg);
+ for ( @args ) {
+ s/^\s+//;
+ s/\s+$//;
+ my $arg = $_;
+ my $default;
+ ($arg, $default) = / ( [^=]* ) ( (?: = .* )? ) /x;
+ my ($pre, $name) = ($arg =~ /(.*?) \s* \b(\w+) \s* $ /x);
+ next unless length $pre;
+ my $out_type;
+ my $inout_var;
+ if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST)\s+//) {
+ my $type = $1;
+ $out_type = $type if $type ne 'IN';
+ $arg =~ s/^(IN|IN_OUTLIST|OUTLIST)\s+//;
+ }
+ if (/\W/) { # Has a type
+ push @arg_with_types, $arg;
+ # warn "pushing '$arg'\n";
+ $arg_types{$name} = $arg;
+ $_ = "$name$default";
+ }
+ $out_vars{$_} = 1 if $out_type eq 'OUTLIST';
+ push @in_out, $name if $out_type;
+ $in_out{$name} = $out_type if $out_type;
+ }
+ } else {
+ @args = split(/\s*,\s*/, $orig_args);
+ Warn("Warning: cannot parse argument list '$orig_args', fallback to split");
+ }
+ } else {
+ @args = split(/\s*,\s*/, $orig_args);
+ for (@args) {
+ if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST)\s+//) {
+ my $out_type = $1;
+ next if $out_type eq 'IN';
+ $out_vars{$_} = 1 if $out_type eq 'OUTLIST';
+ push @in_out, $name;
+ $in_out{$_} = $out_type;
+ }
+ }
+ }
if (defined($class)) {
my $arg0 = ((defined($static) or $func_name eq 'new')
? "CLASS" : "THIS");
unshift(@args, $arg0);
- ($orig_args = "$arg0, $orig_args") =~ s/^$arg0, $/$arg0/;
+ ($report_args = "$arg0, $report_args") =~ s/^\w+, $/$arg0/;
}
- $orig_args =~ s/"/\\"/g;
- $min_args = $num_args = @args;
- foreach $i (0..$num_args-1) {
+ my $extra_args = 0;
+ @args_num = ();
+ $num_args = 0;
+ my $report_args = '';
+ foreach $i (0 .. $#args) {
if ($args[$i] =~ s/\.\.\.//) {
$elipsis = 1;
- $min_args--;
- if ($args[$i] eq '' && $i == $num_args - 1) {
+ if ($args[$i] eq '' && $i == $#args) {
+ $report_args .= ", ...";
pop(@args);
last;
}
}
+ if ($out_vars{$args[$i]}) {
+ push @args_num, undef;
+ } else {
+ push @args_num, ++$num_args;
+ $report_args .= ", $args[$i]";
+ }
if ($args[$i] =~ /^([^=]*[^\s=])\s*=\s*(.*)/s) {
- $min_args--;
+ $extra_args++;
$args[$i] = $1;
$defaults{$args[$i]} = $2;
$defaults{$args[$i]} =~ s/"/\\"/g;
}
$proto_arg[$i+1] = "\$" ;
}
- if (defined($class)) {
- $func_args = join(", ", @args[1..$#args]);
- } else {
- $func_args = join(", ", @args);
+ $min_args = $num_args - $extra_args;
+ $report_args =~ s/"/\\"/g;
+ $report_args =~ s/^,\s+//;
+ my @func_args = @args;
+ shift @func_args if defined($class);
+
+ for (@func_args) {
+ s/^/&/ if $in_out{$_};
}
- @args_match{@args} = 1..@args;
+ $func_args = join(", ", @func_args);
+ @args_match{@args} = @args_num;
$PPCODE = grep(/^\s*PPCODE\s*:/, @line);
$CODE = grep(/^\s*CODE\s*:/, @line);
@@ -994,6 +1144,8 @@ while (fetch_para()) {
$ALIAS = grep(/^\s*ALIAS\s*:/, @line);
$INTERFACE = grep(/^\s*INTERFACE\s*:/, @line);
+ $xsreturn = 1 if $EXPLICIT_RETURN;
+
# print function header
print Q<<"EOF";
#XS(XS_${Full_func_name})
@@ -1024,12 +1176,12 @@ EOF
if ($ALIAS)
{ print Q<<"EOF" if $cond }
# if ($cond)
-# croak("Usage: %s($orig_args)", GvNAME(CvGV(cv)));
+# Perl_croak(aTHX_ "Usage: %s($report_args)", GvNAME(CvGV(cv)));
EOF
else
{ print Q<<"EOF" if $cond }
# if ($cond)
-# croak("Usage: $pname($orig_args)");
+# Perl_croak(aTHX_ "Usage: $pname($report_args)");
EOF
print Q<<"EOF" if $PPCODE;
@@ -1080,16 +1232,24 @@ EOF
# do code
if (/^\s*NOT_IMPLEMENTED_YET/) {
- print "\n\tcroak(\"$pname: not implemented yet\");\n";
+ print "\n\tPerl_croak(aTHX_ \"$pname: not implemented yet\");\n";
$_ = '' ;
} else {
if ($ret_type ne "void") {
- print "\t" . &map_type($ret_type) . "\tRETVAL;\n"
+ print "\t" . &map_type($ret_type, 'RETVAL') . ";\n"
if !$retvaldone;
$args_match{"RETVAL"} = 0;
$var_types{"RETVAL"} = $ret_type;
+ print "\tdXSTARG;\n"
+ if $WantOptimize and $targetable{$type_kind{$ret_type}};
}
+ if (@arg_with_types) {
+ unshift @line, @arg_with_types, $_;
+ $_ = "";
+ $processing_arg_with_types = 1;
+ INPUT_handler() ;
+ }
print $deferred;
process_keyword("INIT|ALIAS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS") ;
@@ -1131,19 +1291,55 @@ EOF
}
# do output variables
- $gotRETVAL = 0;
- undef $RETVAL_code ;
+ $gotRETVAL = 0; # 1 if RETVAL seen in OUTPUT section;
+ undef $RETVAL_code ; # code to set RETVAL (from OUTPUT section);
+ # $wantRETVAL set if 'RETVAL =' autogenerated
+ ($wantRETVAL, $ret_type) = (0, 'void') if $RETVAL_no_return;
undef %outargs ;
- process_keyword("OUTPUT|ALIAS|PROTOTYPE");
+ process_keyword("POSTCALL|OUTPUT|ALIAS|PROTOTYPE");
# all OUTPUT done, so now push the return value on the stack
if ($gotRETVAL && $RETVAL_code) {
print "\t$RETVAL_code\n";
} elsif ($gotRETVAL || $wantRETVAL) {
- # RETVAL almost never needs SvSETMAGIC()
- &generate_output($ret_type, 0, 'RETVAL', 0);
+ my $t = $WantOptimize && $targetable{$type_kind{$ret_type}};
+ my $var = 'RETVAL';
+ my $type = $ret_type;
+
+ # 0: type, 1: with_size, 2: how, 3: how_size
+ if ($t and not $t->[1] and $t->[0] eq 'p') {
+ # PUSHp corresponds to setpvn. Treate setpv directly
+ my $what = eval qq("$t->[2]");
+ warn $@ if $@;
+
+ print "\tsv_setpv(TARG, $what); XSprePUSH; PUSHTARG;\n";
+ $prepush_done = 1;
+ }
+ elsif ($t) {
+ my $what = eval qq("$t->[2]");
+ warn $@ if $@;
+
+ my $size = $t->[3];
+ $size = '' unless defined $size;
+ $size = eval qq("$size");
+ warn $@ if $@;
+ print "\tXSprePUSH; PUSH$t->[0]($what$size);\n";
+ $prepush_done = 1;
+ }
+ else {
+ # RETVAL almost never needs SvSETMAGIC()
+ &generate_output($ret_type, 0, 'RETVAL', 0);
+ }
}
+ $xsreturn = 1 if $ret_type ne "void";
+ my $num = $xsreturn;
+ my $c = @in_out;
+ print "\tXSprePUSH;" if $c and not $prepush_done;
+ print "\tEXTEND(SP,$c);\n" if $c;
+ $xsreturn += $c;
+ generate_output($var_types{$_}, $num++, $_, 0, 1) for @in_out;
+
# do cleanup
process_keyword("CLEANUP|ALIAS|PROTOTYPE") ;
@@ -1176,12 +1372,12 @@ EOF
print Q<<EOF if $except;
# if (errbuf[0])
-# croak(errbuf);
+# Perl_croak(aTHX_ errbuf);
EOF
- if ($ret_type ne "void" or $EXPLICIT_RETURN) {
+ if ($xsreturn) {
print Q<<EOF unless $PPCODE;
-# XSRETURN(1);
+# XSRETURN($xsreturn);
EOF
} else {
print Q<<EOF unless $PPCODE;
@@ -1261,24 +1457,10 @@ print Q<<"EOF";
##endif
EOF
-if ($WantCAPI) {
-print Q<<"EOF";
-##ifdef PERL_CAPI
-#XS(boot__CAPI_entry)
-##else
-EOF
-}
-
print Q<<"EOF";
#XS(boot_$Module_cname)
EOF
-if ($WantCAPI) {
-print Q<<"EOF";
-##endif /* PERL_CAPI */
-EOF
-}
-
print Q<<"EOF";
#[[
# dXSARGS;
@@ -1317,37 +1499,27 @@ print Q<<"EOF";;
#
EOF
-if ($WantCAPI) {
-print Q<<"EOF";
-##ifdef PERL_CAPI
-##define XSCAPI(name) void name(CV* cv, void* pPerl)
-#
-##ifdef __cplusplus
-#extern "C"
-##endif
-#XSCAPI(boot_$Module_cname)
-#[[
-# SetCPerlObj(pPerl);
-# boot__CAPI_entry(cv);
-#]]
-##endif /* PERL_CAPI */
-EOF
-}
-
warn("Please specify prototyping behavior for $filename (see perlxs manual)\n")
unless $ProtoUsed ;
&Exit;
sub output_init {
- local($type, $num, $var, $init) = @_;
+ local($type, $num, $var, $init, $name_printed) = @_;
local($arg) = "ST(" . ($num - 1) . ")";
if( $init =~ /^=/ ) {
- eval qq/print "\\t$var $init\\n"/;
+ if ($name_printed) {
+ eval qq/print " $init\\n"/;
+ } else {
+ eval qq/print "\\t$var $init\\n"/;
+ }
warn $@ if $@;
} else {
if( $init =~ s/^\+// && $num ) {
- &generate_init($type, $num, $var);
+ &generate_init($type, $num, $var, $name_printed);
+ } elsif ($name_printed) {
+ print ";\n";
+ $init =~ s/^;//;
} else {
eval qq/print "\\t$var;\\n"/;
warn $@ if $@;
@@ -1394,13 +1566,13 @@ sub generate_init {
$tk = $type_kind{$type};
$tk =~ s/OBJ$/REF/ if $func_name =~ /DESTROY$/;
$type =~ tr/:/_/;
- blurt("Error: No INPUT definition for type '$type' found"), return
+ blurt("Error: No INPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
unless defined $input_expr{$tk} ;
$expr = $input_expr{$tk};
if ($expr =~ /DO_ARRAY_ELEM/) {
blurt("Error: '$subtype' not in typemap"), return
unless defined($type_kind{$subtype});
- blurt("Error: No INPUT definition for type '$subtype' found"), return
+ blurt("Error: No INPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
unless defined $input_expr{$type_kind{$subtype}} ;
$subexpr = $input_expr{$type_kind{$subtype}};
$subexpr =~ s/ntype/subtype/g;
@@ -1416,35 +1588,49 @@ sub generate_init {
if (defined($defaults{$var})) {
$expr =~ s/(\t+)/$1 /g;
$expr =~ s/ /\t/g;
- eval qq/print "\\t$var;\\n"/;
- warn $@ if $@;
- $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+ if ($name_printed) {
+ print ";\n";
+ } else {
+ eval qq/print "\\t$var;\\n"/;
+ warn $@ if $@;
+ }
+ if ($defaults{$var} eq 'NO_INIT') {
+ $deferred .= eval qq/"\\n\\tif (items >= $num) {\\n$expr;\\n\\t}\\n"/;
+ } else {
+ $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+ }
warn $@ if $@;
} elsif ($ScopeThisXSUB or $expr !~ /^\t\$var =/) {
- eval qq/print "\\t$var;\\n"/;
- warn $@ if $@;
+ if ($name_printed) {
+ print ";\n";
+ } else {
+ eval qq/print "\\t$var;\\n"/;
+ warn $@ if $@;
+ }
$deferred .= eval qq/"\\n$expr;\\n"/;
warn $@ if $@;
} else {
+ die "panic: do not know how to handle this branch for function pointers"
+ if $name_printed;
eval qq/print "$expr;\\n"/;
warn $@ if $@;
}
}
sub generate_output {
- local($type, $num, $var, $do_setmagic) = @_;
+ local($type, $num, $var, $do_setmagic, $do_push) = @_;
local($arg) = "ST(" . ($num - ($num != 0)) . ")";
local($argoff) = $num - 1;
local($ntype);
$type = TidyType($type) ;
if ($type =~ /^array\(([^,]*),(.*)\)/) {
- print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1)), XFree((char *)$var);\n";
+ print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1));\n";
print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
} else {
blurt("Error: '$type' not in typemap"), return
unless defined($type_kind{$type});
- blurt("Error: No OUTPUT definition for type '$type' found"), return
+ blurt("Error: No OUTPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
unless defined $output_expr{$type_kind{$type}} ;
($ntype = $type) =~ s/\s*\*/Ptr/g;
$ntype =~ s/\(\)//g;
@@ -1453,7 +1639,7 @@ sub generate_output {
if ($expr =~ /DO_ARRAY_ELEM/) {
blurt("Error: '$subtype' not in typemap"), return
unless defined($type_kind{$subtype});
- blurt("Error: No OUTPUT definition for type '$subtype' found"), return
+ blurt("Error: No OUTPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
unless defined $output_expr{$type_kind{$subtype}} ;
$subexpr = $output_expr{$type_kind{$subtype}};
$subexpr =~ s/ntype/subtype/g;
@@ -1471,8 +1657,8 @@ sub generate_output {
# mortalize it.
eval "print qq\a$expr\a";
warn $@ if $@;
- print "\tsv_2mortal(ST(0));\n";
- print "\tSvSETMAGIC(ST(0));\n" if $do_setmagic;
+ print "\tsv_2mortal(ST($num));\n";
+ print "\tSvSETMAGIC(ST($num));\n" if $do_setmagic;
}
elsif ($expr =~ /^\s*\$arg\s*=/) {
# We expect that $arg has refcnt >=1, so we need
@@ -1493,6 +1679,13 @@ sub generate_output {
# new mortals don't have set magic
}
}
+ elsif ($do_push) {
+ print "\tPUSHs(sv_newmortal());\n";
+ $arg = "ST($num)";
+ eval "print qq\a$expr\a";
+ warn $@ if $@;
+ print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
+ }
elsif ($arg =~ /^ST\(\d+\)$/) {
eval "print qq\a$expr\a";
warn $@ if $@;
@@ -1502,10 +1695,17 @@ sub generate_output {
}
sub map_type {
- my($type) = @_;
+ my($type, $varname) = @_;
$type =~ tr/:/_/;
$type =~ s/^array\(([^,]*),(.*)\).*/$1 */s;
+ if ($varname) {
+ if ($varname && $type =~ / \( \s* \* (?= \s* \) ) /xg) {
+ (substr $type, pos $type, 0) = " $varname ";
+ } else {
+ $type .= "\t$varname";
+ }
+ }
$type;
}
diff --git a/contrib/perl5/lib/Fatal.pm b/contrib/perl5/lib/Fatal.pm
index d1d95af..1496117 100644
--- a/contrib/perl5/lib/Fatal.pm
+++ b/contrib/perl5/lib/Fatal.pm
@@ -1,8 +1,9 @@
package Fatal;
+use 5.005_64;
use Carp;
use strict;
-use vars qw( $AUTOLOAD $Debug $VERSION);
+our($AUTOLOAD, $Debug, $VERSION);
$VERSION = 1.02;
@@ -11,9 +12,15 @@ $Debug = 0 unless defined $Debug;
sub import {
my $self = shift(@_);
my($sym, $pkg);
+ my $void = 0;
$pkg = (caller)[0];
foreach $sym (@_) {
- &_make_fatal($sym, $pkg);
+ if ($sym eq ":void") {
+ $void = 1;
+ }
+ else {
+ &_make_fatal($sym, $pkg, $void);
+ }
}
};
@@ -41,11 +48,11 @@ sub fill_protos {
}
sub write_invocation {
- my ($core, $call, $name, @argvs) = @_;
+ my ($core, $call, $name, $void, @argvs) = @_;
if (@argvs == 1) { # No optional arguments
my @argv = @{$argvs[0]};
shift @argv;
- return "\t" . one_invocation($core, $call, $name, @argv) . ";\n";
+ return "\t" . one_invocation($core, $call, $name, $void, @argv) . ";\n";
} else {
my $else = "\t";
my (@out, @argv, $n);
@@ -55,7 +62,7 @@ sub write_invocation {
push @out, "$ {else}if (\@_ == $n) {\n";
$else = "\t} els";
push @out,
- "\t\treturn " . one_invocation($core, $call, $name, @argv) . ";\n";
+ "\t\treturn " . one_invocation($core, $call, $name, $void, @argv) . ";\n";
}
push @out, <<EOC;
}
@@ -66,21 +73,27 @@ EOC
}
sub one_invocation {
- my ($core, $call, $name, @argv) = @_;
+ my ($core, $call, $name, $void, @argv) = @_;
local $" = ', ';
- return qq{$call(@argv) || croak "Can't $name(\@_)} .
- ($core ? ': $!' : ', \$! is \"$!\"') . '"';
+ if ($void) {
+ return qq/(defined wantarray)?$call(@argv):
+ $call(@argv) || croak "Can't $name(\@_)/ .
+ ($core ? ': $!' : ', \$! is \"$!\"') . '"'
+ } else {
+ return qq{$call(@argv) || croak "Can't $name(\@_)} .
+ ($core ? ': $!' : ', \$! is \"$!\"') . '"';
+ }
}
sub _make_fatal {
- my($sub, $pkg) = @_;
+ my($sub, $pkg, $void) = @_;
my($name, $code, $sref, $real_proto, $proto, $core, $call);
my $ini = $sub;
$sub = "${pkg}::$sub" unless $sub =~ /::/;
$name = $sub;
$name =~ s/.*::// or $name =~ s/^&//;
- print "# _make_fatal: sub=$sub pkg=$pkg name=$name\n" if $Debug;
+ print "# _make_fatal: sub=$sub pkg=$pkg name=$name void=$void\n" if $Debug;
croak "Bad subroutine name for Fatal: $name" unless $name =~ /^\w+$/;
if (defined(&$sub)) { # user subroutine
$sref = \&$sub;
@@ -108,14 +121,14 @@ sub$real_proto {
local(\$", \$!) = (', ', 0);
EOS
my @protos = fill_protos($proto);
- $code .= write_invocation($core, $call, $name, @protos);
+ $code .= write_invocation($core, $call, $name, $void, @protos);
$code .= "}\n";
print $code if $Debug;
{
no strict 'refs'; # to avoid: Can't use string (...) as a symbol ref ...
$code = eval("package $pkg; use Carp; $code");
die if $@;
- local($^W) = 0; # to avoid: Subroutine foo redefined ...
+ no warnings; # to avoid: Subroutine foo redefined ...
*{$sub} = $code;
}
}
@@ -138,11 +151,10 @@ Fatal - replace functions with equivalents which succeed or die
=head1 DESCRIPTION
C<Fatal> provides a way to conveniently replace functions which normally
-return a false value when they fail with equivalents which halt execution
+return a false value when they fail with equivalents which raise exceptions
if they are not successful. This lets you use these functions without
-having to test their return values explicitly on each call. Errors are
-reported via C<die>, so you can trap them using C<$SIG{__DIE__}> if you
-wish to take some action before the program exits.
+having to test their return values explicitly on each call. Exceptions
+can be caught using C<eval{}>. See L<perlfunc> and L<perlvar> for details.
The do-or-die equivalents are set up simply by calling Fatal's
C<import> routine, passing it the names of the functions to be
@@ -150,6 +162,21 @@ replaced. You may wrap both user-defined functions and overridable
CORE operators (except C<exec>, C<system> which cannot be expressed
via prototypes) in this way.
+If the symbol C<:void> appears in the import list, then functions
+named later in that import list raise an exception only when
+these are called in void context--that is, when their return
+values are ignored. For example
+
+ use Fatal qw/:void open close/;
+
+ # properly checked, so no exception raised on error
+ if(open(FH, "< /bogotic") {
+ warn "bogo file, dude: $!";
+ }
+
+ # not checked, so error raises an exception
+ close FH;
+
=head1 AUTHOR
Lionel.Cons@cern.ch
diff --git a/contrib/perl5/lib/File/Basename.pm b/contrib/perl5/lib/File/Basename.pm
index 69bb1fa..4581e7e 100644
--- a/contrib/perl5/lib/File/Basename.pm
+++ b/contrib/perl5/lib/File/Basename.pm
@@ -37,10 +37,10 @@ If the argument passed to it contains one of the substrings
"VMS", "MSDOS", "MacOS", "AmigaOS" or "MSWin32", the file specification
syntax of that operating system is used in future calls to
fileparse(), basename(), and dirname(). If it contains none of
-these substrings, UNIX syntax is used. This pattern matching is
+these substrings, Unix syntax is used. This pattern matching is
case-insensitive. If you've selected VMS syntax, and the file
specification you pass to one of these routines contains a "/",
-they assume you are using UNIX emulation and apply the UNIX syntax
+they assume you are using Unix emulation and apply the Unix syntax
rules instead, for that function call only.
If the argument passed to it contains one of the substrings "VMS",
@@ -73,7 +73,7 @@ file as the input file specification.
=head1 EXAMPLES
-Using UNIX file syntax:
+Using Unix file syntax:
($base,$path,$type) = fileparse('/virgil/aeneid/draft.book7',
'\.book\d+');
@@ -102,7 +102,7 @@ would yield
The basename() routine returns the first element of the list produced
by calling fileparse() with the same arguments, except that it always
quotes metacharacters in the given suffixes. It is provided for
-programmer compatibility with the UNIX shell command basename(1).
+programmer compatibility with the Unix shell command basename(1).
=item C<dirname>
@@ -111,8 +111,8 @@ specification. When using VMS or MacOS syntax, this is identical to the
second element of the list produced by calling fileparse() with the same
input file specification. (Under VMS, if there is no directory information
in the input file specification, then the current default device and
-directory are returned.) When using UNIX or MSDOS syntax, the return
-value conforms to the behavior of the UNIX shell command dirname(1). This
+directory are returned.) When using Unix or MSDOS syntax, the return
+value conforms to the behavior of the Unix shell command dirname(1). This
is usually the same as the behavior of fileparse(), but differs in some
cases. For example, for the input file specification F<lib/>, fileparse()
considers the directory name to be F<lib/>, while dirname() considers the
@@ -124,12 +124,22 @@ directory name to be F<.>).
## use strict;
-use re 'taint';
+# A bit of juggling to insure that C<use re 'taint';> always works, since
+# File::Basename is used during the Perl build, when the re extension may
+# not be available.
+BEGIN {
+ unless (eval { require re; })
+ { eval ' sub re::import { $^H |= 0x00100000; } ' }
+ import re 'taint';
+}
+
+
+use 5.005_64;
+our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(fileparse fileparse_set_fstype basename dirname);
-use vars qw($VERSION $Fileparse_fstype $Fileparse_igncase);
$VERSION = "2.6";
@@ -162,23 +172,23 @@ sub fileparse {
if ($fstype =~ /^VMS/i) {
if ($fullname =~ m#/#) { $fstype = '' } # We're doing Unix emulation
else {
- ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/);
+ ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/s);
$dirpath ||= ''; # should always be defined
}
}
if ($fstype =~ /^MS(DOS|Win32)/i) {
- ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/);
- $dirpath .= '.\\' unless $dirpath =~ /[\\\/]$/;
+ ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/s);
+ $dirpath .= '.\\' unless $dirpath =~ /[\\\/]\z/;
}
- elsif ($fstype =~ /^MacOS/i) {
- ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/);
+ elsif ($fstype =~ /^MacOS/si) {
+ ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/s);
}
elsif ($fstype =~ /^AmigaOS/i) {
- ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/);
+ ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/s);
$dirpath = './' unless $dirpath;
}
elsif ($fstype !~ /^VMS/i) { # default to Unix
- ($dirpath,$basename) = ($fullname =~ m#^(.*/)?(.*)#);
+ ($dirpath,$basename) = ($fullname =~ m#^(.*/)?(.*)#s);
if ($^O eq 'VMS' and $fullname =~ m:/[^/]+/000000/?:) {
# dev:[000000] is top of VMS tree, similar to Unix '/'
($basename,$dirpath) = ('',$fullname);
@@ -190,7 +200,7 @@ sub fileparse {
$tail = '';
foreach $suffix (@suffices) {
my $pat = ($igncase ? '(?i)' : '') . "($suffix)\$";
- if ($basename =~ s/$pat//) {
+ if ($basename =~ s/$pat//s) {
$taint .= substr($suffix,0,0);
$tail = $1 . $tail;
}
@@ -228,30 +238,30 @@ sub dirname {
}
if ($fstype =~ /MacOS/i) { return $dirname }
elsif ($fstype =~ /MSDOS/i) {
- $dirname =~ s/([^:])[\\\/]*$/$1/;
+ $dirname =~ s/([^:])[\\\/]*\z/$1/;
unless( length($basename) ) {
($basename,$dirname) = fileparse $dirname;
- $dirname =~ s/([^:])[\\\/]*$/$1/;
+ $dirname =~ s/([^:])[\\\/]*\z/$1/;
}
}
elsif ($fstype =~ /MSWin32/i) {
- $dirname =~ s/([^:])[\\\/]*$/$1/;
+ $dirname =~ s/([^:])[\\\/]*\z/$1/;
unless( length($basename) ) {
($basename,$dirname) = fileparse $dirname;
- $dirname =~ s/([^:])[\\\/]*$/$1/;
+ $dirname =~ s/([^:])[\\\/]*\z/$1/;
}
}
elsif ($fstype =~ /AmigaOS/i) {
- if ( $dirname =~ /:$/) { return $dirname }
+ if ( $dirname =~ /:\z/) { return $dirname }
chop $dirname;
- $dirname =~ s#[^:/]+$## unless length($basename);
+ $dirname =~ s#[^:/]+\z## unless length($basename);
}
else {
- $dirname =~ s:(.)/*$:$1:;
+ $dirname =~ s:(.)/*\z:$1:s;
unless( length($basename) ) {
local($File::Basename::Fileparse_fstype) = $fstype;
($basename,$dirname) = fileparse $dirname;
- $dirname =~ s:(.)/*$:$1:;
+ $dirname =~ s:(.)/*\z:$1:s;
}
}
diff --git a/contrib/perl5/lib/File/CheckTree.pm b/contrib/perl5/lib/File/CheckTree.pm
index dca7f6a..ae18777 100644
--- a/contrib/perl5/lib/File/CheckTree.pm
+++ b/contrib/perl5/lib/File/CheckTree.pm
@@ -105,7 +105,7 @@ sub validate {
sub valmess {
local($disposition,$this) = @_;
- $file = $cwd . '/' . $file unless $file =~ m|^/|;
+ $file = $cwd . '/' . $file unless $file =~ m|^/|s;
if ($this =~ /^(!?)-(\w)\s+\$file\s*$/) {
$neg = $1;
$tmp = $2;
diff --git a/contrib/perl5/lib/File/Compare.pm b/contrib/perl5/lib/File/Compare.pm
index 2f9c45c..667e7cb 100644
--- a/contrib/perl5/lib/File/Compare.pm
+++ b/contrib/perl5/lib/File/Compare.pm
@@ -1,15 +1,16 @@
package File::Compare;
+use 5.005_64;
use strict;
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $Too_Big *FROM *TO);
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Too_Big);
require Exporter;
use Carp;
-$VERSION = '1.1001';
+$VERSION = '1.1002';
@ISA = qw(Exporter);
@EXPORT = qw(compare);
-@EXPORT_OK = qw(cmp);
+@EXPORT_OK = qw(cmp compare_text);
$Too_Big = 1024 * 1024 * 2;
@@ -22,13 +23,11 @@ sub compare {
croak("Usage: compare( file1, file2 [, buffersize]) ")
unless(@_ == 2 || @_ == 3);
- my $from = shift;
- my $to = shift;
- my $closefrom=0;
- my $closeto=0;
- my ($size, $fromsize, $status, $fr, $tr, $fbuf, $tbuf);
- local(*FROM, *TO);
- local($\) = '';
+ my ($from,$to,$size) = @_;
+ my $text_mode = defined($size) && (ref($size) eq 'CODE' || $size < 0);
+
+ my ($fromsize,$closefrom,$closeto);
+ local (*FROM, *TO);
croak("from undefined") unless (defined $from);
croak("to undefined") unless (defined $to);
@@ -40,9 +39,11 @@ sub compare {
*FROM = $from;
} else {
open(FROM,"<$from") or goto fail_open1;
- binmode FROM;
+ unless ($text_mode) {
+ binmode FROM;
+ $fromsize = -s FROM;
+ }
$closefrom = 1;
- $fromsize = -s FROM;
}
if (ref($to) &&
@@ -52,32 +53,45 @@ sub compare {
*TO = $to;
} else {
open(TO,"<$to") or goto fail_open2;
- binmode TO;
+ binmode TO unless $text_mode;
$closeto = 1;
}
- if ($closefrom && $closeto) {
+ if (!$text_mode && $closefrom && $closeto) {
# If both are opened files we know they differ if their size differ
goto fail_inner if $fromsize != -s TO;
}
- if (@_) {
- $size = shift(@_) + 0;
- croak("Bad buffer size for compare: $size\n") unless ($size > 0);
- } else {
- $size = $fromsize;
- $size = 1024 if ($size < 512);
- $size = $Too_Big if ($size > $Too_Big);
+ if ($text_mode) {
+ local $/ = "\n";
+ my ($fline,$tline);
+ while (defined($fline = <FROM>)) {
+ goto fail_inner unless defined($tline = <TO>);
+ if (ref $size) {
+ # $size contains ref to comparison function
+ goto fail_inner if &$size($fline, $tline);
+ } else {
+ goto fail_inner if $fline ne $tline;
+ }
+ }
+ goto fail_inner if defined($tline = <TO>);
}
+ else {
+ unless (defined($size) && $size > 0) {
+ $size = $fromsize || -s TO || 0;
+ $size = 1024 if $size < 512;
+ $size = $Too_Big if $size > $Too_Big;
+ }
- $fbuf = '';
- $tbuf = '';
- while(defined($fr = read(FROM,$fbuf,$size)) && $fr > 0) {
- unless (defined($tr = read(TO,$tbuf,$fr)) and $tbuf eq $fbuf) {
- goto fail_inner;
+ my ($fr,$tr,$fbuf,$tbuf);
+ $fbuf = $tbuf = '';
+ while(defined($fr = read(FROM,$fbuf,$size)) && $fr > 0) {
+ unless (defined($tr = read(TO,$tbuf,$fr)) && $tbuf eq $fbuf) {
+ goto fail_inner;
+ }
}
+ goto fail_inner if defined($tr = read(TO,$tbuf,$size)) && $tr > 0;
}
- goto fail_inner if (defined($tr = read(TO,$tbuf,$size)) && $tr > 0);
close(TO) || goto fail_open2 if $closeto;
close(FROM) || goto fail_open1 if $closefrom;
@@ -93,7 +107,7 @@ sub compare {
fail_open2:
if ($closefrom) {
- $status = $!;
+ my $status = $!;
$! = 0;
close FROM;
$! = $status unless $!;
@@ -102,8 +116,21 @@ sub compare {
return -1;
}
+sub cmp;
*cmp = \&compare;
+sub compare_text {
+ my ($from,$to,$cmp) = @_;
+ croak("Usage: compare_text( file1, file2 [, cmp-function])")
+ unless @_ == 2 || @_ == 3;
+ croak("Third arg to compare_text() function must be a code reference")
+ if @_ == 3 && ref($cmp) ne 'CODE';
+
+ # Using a negative buffer size puts compare into text_mode too
+ $cmp = -1 unless defined $cmp;
+ compare($from, $to, $cmp);
+}
+
1;
__END__
@@ -129,6 +156,18 @@ from File::Compare by default.
File::Compare::cmp is a synonym for File::Compare::compare. It is
exported from File::Compare only by request.
+File::Compare::compare_text does a line by line comparison of the two
+files. It stops as soon as a difference is detected. compare_text()
+accepts an optional third argument: This must be a CODE reference to
+a line comparison function, which returns 0 when both lines are considered
+equal. For example:
+
+ compare_text($file1, $file2)
+
+is basically equivalent to
+
+ compare_text($file1, $file2, sub {$_[0] ne $_[1]} )
+
=head1 RETURN
File::Compare::compare return 0 if the files are equal, 1 if the
diff --git a/contrib/perl5/lib/File/Copy.pm b/contrib/perl5/lib/File/Copy.pm
index e1da6b6..e6cf786 100644
--- a/contrib/perl5/lib/File/Copy.pm
+++ b/contrib/perl5/lib/File/Copy.pm
@@ -7,17 +7,21 @@
package File::Copy;
+use 5.005_64;
use strict;
use Carp;
-use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION $Too_Big
- &copy &syscopy &cp &mv);
+our(@ISA, @EXPORT, @EXPORT_OK, $VERSION, $Too_Big, $Syscopy_is_copy);
+sub copy;
+sub syscopy;
+sub cp;
+sub mv;
# Note that this module implements only *part* of the API defined by
# the File/Copy.pm module of the File-Tools-2.0 package. However, that
# package has not yet been updated to work with Perl 5.004, and so it
# would be a Bad Thing for the CPAN module to grab it and replace this
# module. Therefore, we set this module's version higher than 2.0.
-$VERSION = '2.02';
+$VERSION = '2.03';
require Exporter;
@ISA = qw(Exporter);
@@ -60,11 +64,12 @@ sub copy {
$to = _catname($from, $to);
}
- if (defined &syscopy && \&syscopy != \&copy
+ if (defined &syscopy && !$Syscopy_is_copy
&& !$to_a_handle
&& !($from_a_handle && $^O eq 'os2' ) # OS/2 cannot handle handles
&& !($from_a_handle && $^O eq 'mpeix') # and neither can MPE/iX.
- )
+ && !($from_a_handle && $^O eq 'MSWin32')
+ )
{
return syscopy($from, $to);
}
@@ -78,20 +83,20 @@ sub copy {
if ($from_a_handle) {
*FROM = *$from{FILEHANDLE};
} else {
- $from = "./$from" if $from =~ /^\s/;
+ $from = "./$from" if $from =~ /^\s/s;
open(FROM, "< $from\0") or goto fail_open1;
binmode FROM or die "($!,$^E)";
$closefrom = 1;
- }
-
+ }
+
if ($to_a_handle) {
*TO = *$to{FILEHANDLE};
- } else {
- $to = "./$to" if $to =~ /^\s/;
+ } else {
+ $to = "./$to" if $to =~ /^\s/s;
open(TO,"> $to\0") or goto fail_open2;
binmode TO or die "($!,$^E)";
$closeto = 1;
- }
+ }
if (@_) {
$size = shift(@_) + 0;
@@ -119,7 +124,7 @@ sub copy {
# Use this idiom to avoid uninitialized value warning.
return 1;
-
+
# All of these contortions try to preserve error messages...
fail_inner:
if ($closeto) {
@@ -162,10 +167,10 @@ sub move {
(($tosz2,$tomt2) = (stat($to))[7,9]) && # $to's there
($tosz1 != $tosz2 or $tomt1 != $tomt2) && # and changed
$tosz2 == $fromsz; # it's all there
-
+
($tosz1,$tomt1) = (stat($to))[7,9]; # just in case rename did something
return 1 if ($copied = copy($from,$to)) && unlink($from);
-
+
($tosz2,$tomt2) = ((stat($to))[7,9],0,0) if defined $tomt1;
unlink($to) if !defined($tomt1) or $tomt1 != $tomt2 or $tosz1 != $tosz2;
($!,$^E) = ($sts,$ossts);
@@ -186,7 +191,13 @@ unless (defined &syscopy) {
# preserve MPE file attributes.
return system('/bin/cp', '-f', $_[0], $_[1]) == 0;
};
+ } elsif ($^O eq 'MSWin32') {
+ *syscopy = sub {
+ return 0 unless @_ == 2;
+ return Win32::CopyFile(@_, 1);
+ };
} else {
+ $Syscopy_is_copy = 1;
*syscopy = \&copy;
}
}
@@ -272,9 +283,9 @@ second parameter, preserving OS-specific attributes and file
structure. For Unix systems, this is equivalent to the simple
C<copy> routine. For VMS systems, this calls the C<rmscopy>
routine (see below). For OS/2 systems, this calls the C<syscopy>
-XSUB directly.
+XSUB directly. For Win32 systems, this calls C<Win32::CopyFile>.
-=head2 Special behaviour if C<syscopy> is defined (VMS and OS/2)
+=head2 Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32)
If both arguments to C<copy> are not file handles,
then C<copy> will perform a "system copy" of
diff --git a/contrib/perl5/lib/File/DosGlob.pm b/contrib/perl5/lib/File/DosGlob.pm
index 594ee2e..d7dea7b 100644
--- a/contrib/perl5/lib/File/DosGlob.pm
+++ b/contrib/perl5/lib/File/DosGlob.pm
@@ -19,13 +19,18 @@ sub doglob {
my $sepchr = '/';
next OUTER unless defined $_ and $_ ne '';
# if arg is within quotes strip em and do no globbing
- if (/^"(.*)"$/) {
+ if (/^"(.*)"\z/s) {
$_ = $1;
if ($cond eq 'd') { push(@retval, $_) if -d $_ }
else { push(@retval, $_) if -e $_ }
next OUTER;
}
- if (m|^(.*)([\\/])([^\\/]*)$|) {
+ # wildcards with a drive prefix such as h:*.pm must be changed
+ # to h:./*.pm to expand correctly
+ if (m|^([A-Za-z]:)[^/\\]|s) {
+ substr($_,0,2) = $1 . "./";
+ }
+ if (m|^(.*)([\\/])([^\\/]*)\z|s) {
my $tail;
($head, $sepchr, $tail) = ($1,$2,$3);
#print "div: |$head|$sepchr|$tail|\n";
@@ -35,7 +40,7 @@ sub doglob {
push(@retval, doglob($cond, map {"$_$sepchr$tail"} @globdirs)),
next OUTER if @globdirs;
}
- $head .= $sepchr if $head eq '' or $head =~ /^[A-Za-z]:$/;
+ $head .= $sepchr if $head eq '' or $head =~ /^[A-Za-z]:\z/s;
$_ = $tail;
}
#
@@ -61,7 +66,7 @@ sub doglob {
s/\?/.?/g;
#print "regex: '$_', head: '$head'\n";
- my $matchsub = eval 'sub { $_[0] =~ m|^' . $_ . '$|io }';
+ my $matchsub = eval 'sub { $_[0] =~ m|^' . $_ . '\\z|ios }';
warn($@), next OUTER if $@;
INNER:
for my $e (@leaves) {
@@ -142,7 +147,7 @@ sub import {
my $pkg = shift;
return unless @_;
my $sym = shift;
- my $callpkg = ($sym =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0));
+ my $callpkg = ($sym =~ s/^GLOBAL_//s ? 'CORE::GLOBAL' : caller(0));
*{$callpkg.'::'.$sym} = \&{$pkg.'::'.$sym} if $sym eq 'glob';
}
@@ -157,16 +162,16 @@ File::DosGlob - DOS like globbing and then some
=head1 SYNOPSIS
require 5.004;
-
+
# override CORE::glob in current package
use File::DosGlob 'glob';
-
+
# override CORE::glob in ALL packages (use with extreme caution!)
use File::DosGlob 'GLOBAL_glob';
@perlfiles = glob "..\\pe?l/*.p?";
print <..\\pe?l/*.p?>;
-
+
# from the command line (overrides only in main::)
> perl -MFile::DosGlob=glob -e "print <../pe*/*p?>"
@@ -206,7 +211,7 @@ pandering to DOS habits. Needs a dose of optimizium too.
=head1 AUTHOR
-Gurusamy Sarathy <gsar@umich.edu>
+Gurusamy Sarathy <gsar@activestate.com>
=head1 HISTORY
diff --git a/contrib/perl5/lib/File/Find.pm b/contrib/perl5/lib/File/Find.pm
index 7e67003..ac73f1b 100644
--- a/contrib/perl5/lib/File/Find.pm
+++ b/contrib/perl5/lib/File/Find.pm
@@ -1,5 +1,5 @@
package File::Find;
-require 5.000;
+use 5.005_64;
require Exporter;
require Cwd;
@@ -12,70 +12,163 @@ finddepth - traverse a directory structure depth-first
=head1 SYNOPSIS
use File::Find;
- find(\&wanted, '/foo','/bar');
+ find(\&wanted, '/foo', '/bar');
sub wanted { ... }
use File::Find;
- finddepth(\&wanted, '/foo','/bar');
+ finddepth(\&wanted, '/foo', '/bar');
sub wanted { ... }
+ use File::Find;
+ find({ wanted => \&process, follow => 1 }, '.');
+
=head1 DESCRIPTION
The first argument to find() is either a hash reference describing the
-operations to be performed for each file, a code reference, or a string
-that contains a subroutine name. If it is a hash reference, then the
-value for the key C<wanted> should be a code reference. This code
-reference is called I<the wanted() function> below.
+operations to be performed for each file, or a code reference.
-Currently the only other supported key for the above hash is
-C<bydepth>, in presense of which the walk over directories is
-performed depth-first. Entry point finddepth() is a shortcut for
-specifying C<{ bydepth => 1}> in the first argument of find().
+Here are the possible keys for the hash:
-The wanted() function does whatever verifications you want.
-$File::Find::dir contains the current directory name, and $_ the
-current filename within that directory. $File::Find::name contains
-C<"$File::Find::dir/$_">. You are chdir()'d to $File::Find::dir when
-the function is called. The function may set $File::Find::prune to
-prune the tree.
+=over 3
+
+=item C<wanted>
+
+The value should be a code reference. This code reference is called
+I<the wanted() function> below.
+
+=item C<bydepth>
+
+Reports the name of a directory only AFTER all its entries
+have been reported. Entry point finddepth() is a shortcut for
+specifying C<{ bydepth => 1 }> in the first argument of find().
+
+=item C<follow>
+
+Causes symbolic links to be followed. Since directory trees with symbolic
+links (followed) may contain files more than once and may even have
+cycles, a hash has to be built up with an entry for each file.
+This might be expensive both in space and time for a large
+directory tree. See I<follow_fast> and I<follow_skip> below.
+If either I<follow> or I<follow_fast> is in effect:
+
+=over 6
+
+=item *
+
+It is guarantueed that an I<lstat> has been called before the user's
+I<wanted()> function is called. This enables fast file checks involving S< _>.
+
+=item *
+
+There is a variable C<$File::Find::fullname> which holds the absolute
+pathname of the file with all symbolic links resolved
+
+=back
+
+=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)
+is worse than just taking time, the option I<follow> should be used.
+
+=item C<follow_skip>
+
+C<follow_skip==1>, which is the default, causes all files which are
+neither directories nor symbolic links to be ignored if they are about
+to be processed a second time. If a directory or a symbolic link
+are about to be processed a second time, File::Find dies.
+C<follow_skip==0> causes File::Find to die if any file is about to be
+processed a second time.
+C<follow_skip==2> causes File::Find to ignore any duplicate files and
+dirctories but to proceed normally otherwise.
-File::Find assumes that you don't alter the $_ variable. If you do then
-make sure you return it to its original value before exiting your function.
+
+=item C<no_chdir>
+
+Does not C<chdir()> to each directory as it recurses. The wanted()
+function will need to be aware of this, of course. In this case,
+C<$_> will be the same as C<$File::Find::name>.
+
+=item C<untaint>
+
+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
+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.
+
+=item C<untaint_skip>
+
+If set, directories (subtrees) which fail the I<untaint_pattern>
+are skipped. The default is to 'die' in such a case.
+
+=back
+
+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>,
+C<$File::Find::topmode> and C<$File::Find::topnlink>.
This library is useful for the C<find2perl> tool, which when fed,
find2perl / -name .nfs\* -mtime +7 \
- -exec rm -f {} \; -o -fstype nfs -prune
+ -exec rm -f {} \; -o -fstype nfs -prune
produces something like:
sub wanted {
- /^\.nfs.*$/ &&
- (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+ /^\.nfs.*\z/s &&
+ (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_)) &&
int(-M _) > 7 &&
unlink($_)
||
- ($nlink || (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) &&
+ ($nlink || (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_))) &&
$dev < 0 &&
($File::Find::prune = 1);
}
-Set the variable $File::Find::dont_use_nlink if you're using AFS,
+Set the variable C<$File::Find::dont_use_nlink> if you're using AFS,
since AFS cheats.
-C<finddepth> is just like C<find>, except that it does a depth-first
-search.
Here's another interesting wanted function. It will find all symlinks
that don't resolve:
sub wanted {
- -l && !-e && print "bogus link: $File::Find::name\n";
+ -l && !-e && print "bogus link: $File::Find::name\n";
}
-=head1 BUGS
+See also the script C<pfind> on CPAN for a nice application of this
+module.
+
+=head1 CAVEAT
+
+Be aware that the option to follow symblic 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).
+Furthermore, deleting or changing files in a symbolically linked directory
+might cause very unpleasant surprises, since you delete or change files
+in an unknown directory.
-There is no way to make find or finddepth follow symlinks.
=cut
@@ -83,150 +176,560 @@ There is no way to make find or finddepth follow symlinks.
@EXPORT = qw(find finddepth);
-sub find_opt {
+use strict;
+my $Is_VMS;
+
+require File::Basename;
+
+my %SLnkSeen;
+my ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow,
+ $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat);
+
+sub contract_name {
+ my ($cdir,$fn) = @_;
+
+ return substr($cdir,0,rindex($cdir,'/')) if $fn eq '.';
+
+ $cdir = substr($cdir,0,rindex($cdir,'/')+1);
+
+ $fn =~ s|^\./||;
+
+ my $abs_name= $cdir . $fn;
+
+ if (substr($fn,0,3) eq '../') {
+ do 1 while ($abs_name=~ s|/(?>[^/]+)/\.\./|/|);
+ }
+
+ return $abs_name;
+}
+
+
+sub PathCombine($$) {
+ my ($Base,$Name) = @_;
+ my $AbsName;
+
+ if (substr($Name,0,1) eq '/') {
+ $AbsName= $Name;
+ }
+ else {
+ $AbsName= contract_name($Base,$Name);
+ }
+
+ # (simple) check for recursion
+ my $newlen= length($AbsName);
+ if ($newlen <= length($Base)) {
+ if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/')
+ && $AbsName eq substr($Base,0,$newlen))
+ {
+ return undef;
+ }
+ }
+ return $AbsName;
+}
+
+sub Follow_SymLink($) {
+ my ($AbsName) = @_;
+
+ my ($NewName,$DEV, $INO);
+ ($DEV, $INO)= lstat $AbsName;
+
+ while (-l _) {
+ if ($SLnkSeen{$DEV, $INO}++) {
+ if ($follow_skip < 2) {
+ die "$AbsName is encountered a second time";
+ }
+ else {
+ return undef;
+ }
+ }
+ $NewName= PathCombine($AbsName, readlink($AbsName));
+ unless(defined $NewName) {
+ if ($follow_skip < 2) {
+ die "$AbsName is a recursive symbolic link";
+ }
+ else {
+ return undef;
+ }
+ }
+ else {
+ $AbsName= $NewName;
+ }
+ ($DEV, $INO) = lstat($AbsName);
+ return undef unless defined $DEV; # dangling symbolic link
+ }
+
+ if ($full_check && $SLnkSeen{$DEV, $INO}++) {
+ if ($follow_skip < 1) {
+ die "$AbsName encountered a second time";
+ }
+ else {
+ return undef;
+ }
+ }
+
+ return $AbsName;
+}
+
+our($dir, $name, $fullname, $prune);
+sub _find_dir_symlnk($$$);
+sub _find_dir($$$);
+
+sub _find_opt {
my $wanted = shift;
- my $bydepth = $wanted->{bydepth};
- my $cwd = $bydepth ? Cwd::fastcwd() : Cwd::cwd();
- # Localize these rather than lexicalizing them for backwards
- # compatibility.
- local($topdir,$topdev,$topino,$topmode,$topnlink);
- foreach $topdir (@_) {
- (($topdev,$topino,$topmode,$topnlink) =
- ($Is_VMS ? stat($topdir) : lstat($topdir)))
- || (warn("Can't stat $topdir: $!\n"), next);
- if (-d _) {
- if (chdir($topdir)) {
- $prune = 0;
- unless ($bydepth) {
- ($dir,$_) = ($topdir,'.');
- $name = $topdir;
- $wanted->{wanted}->();
+ die "invalid top directory" unless defined $_[0];
+
+ my $cwd = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::cwd();
+ my $cwd_untainted = $cwd;
+ $wanted_callback = $wanted->{wanted};
+ $bydepth = $wanted->{bydepth};
+ $no_chdir = $wanted->{no_chdir};
+ $full_check = $wanted->{follow};
+ $follow = $full_check || $wanted->{follow_fast};
+ $follow_skip = $wanted->{follow_skip};
+ $untaint = $wanted->{untaint};
+ $untaint_pat = $wanted->{untaint_pattern};
+ $untaint_skip = $wanted->{untaint_skip};
+
+ # for compatability reasons (find.pl, find2perl)
+ our ($topdir, $topdev, $topino, $topmode, $topnlink);
+
+ # a symbolic link to a directory doesn't increase the link count
+ $avoid_nlink = $follow || $File::Find::dont_use_nlink;
+
+ if ( $untaint ) {
+ $cwd_untainted= $1 if $cwd_untainted =~ m|$untaint_pat|;
+ die "insecure cwd in find(depth)" unless defined($cwd_untainted);
+ }
+
+ my ($abs_dir, $Is_Dir);
+
+ Proc_Top_Item:
+ foreach my $TOP (@_) {
+ my $top_item = $TOP;
+ $top_item =~ s|/\z|| unless $top_item eq '/';
+ $Is_Dir= 0;
+
+ ($topdev,$topino,$topmode,$topnlink) = stat $top_item;
+
+ if ($follow) {
+ if (substr($top_item,0,1) eq '/') {
+ $abs_dir = $top_item;
+ }
+ elsif ($top_item eq '.') {
+ $abs_dir = $cwd;
+ }
+ else { # care about any ../
+ $abs_dir = contract_name("$cwd/",$top_item);
+ }
+ $abs_dir= Follow_SymLink($abs_dir);
+ unless (defined $abs_dir) {
+ warn "$top_item is a dangling symbolic link\n";
+ next Proc_Top_Item;
+ }
+ if (-d _) {
+ _find_dir_symlnk($wanted, $abs_dir, $top_item);
+ $Is_Dir= 1;
+ }
+ }
+ else { # no follow
+ $topdir = $top_item;
+ unless (defined $topnlink) {
+ warn "Can't stat $top_item: $!\n";
+ next Proc_Top_Item;
+ }
+ if (-d _) {
+ $top_item =~ s/\.dir\z// if $Is_VMS;
+ _find_dir($wanted, $top_item, $topnlink);
+ $Is_Dir= 1;
+ }
+ else {
+ $abs_dir= $top_item;
+ }
+ }
+
+ unless ($Is_Dir) {
+ unless (($_,$dir) = File::Basename::fileparse($abs_dir)) {
+ ($dir,$_) = ('./', $top_item);
+ }
+
+ $abs_dir = $dir;
+ if ($untaint) {
+ my $abs_dir_save = $abs_dir;
+ $abs_dir = $1 if $abs_dir =~ m|$untaint_pat|;
+ unless (defined $abs_dir) {
+ if ($untaint_skip == 0) {
+ die "directory $abs_dir_save is still tainted";
+ }
+ else {
+ next Proc_Top_Item;
+ }
}
- next if $prune;
- my $fixtopdir = $topdir;
- $fixtopdir =~ s,/$,, ;
- $fixtopdir =~ s/\.dir$// if $Is_VMS;
- &finddir($wanted,$fixtopdir,$topnlink, $bydepth);
- if ($bydepth) {
- ($dir,$_) = ($fixtopdir,'.');
- $name = $fixtopdir;
- $wanted->{wanted}->();
+ }
+
+ unless ($no_chdir or chdir $abs_dir) {
+ warn "Couldn't chdir $abs_dir: $!\n";
+ next Proc_Top_Item;
+ }
+
+ $name = $abs_dir . $_;
+
+ &$wanted_callback;
+
+ }
+
+ $no_chdir or chdir $cwd_untainted;
+ }
+}
+
+# API:
+# $wanted
+# $p_dir : "parent directory"
+# $nlink : what came back from the stat
+# preconditions:
+# chdir (if not no_chdir) to dir
+
+sub _find_dir($$$) {
+ my ($wanted, $p_dir, $nlink) = @_;
+ my ($CdLvl,$Level) = (0,0);
+ my @Stack;
+ my @filenames;
+ my ($subcount,$sub_nlink);
+ my $SE= [];
+ my $dir_name= $p_dir;
+ my $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" );
+ my $dir_rel= '.'; # directory name relative to current directory
+
+ local ($dir, $name, $prune, *DIR);
+
+ unless ($no_chdir or $p_dir eq '.') {
+ my $udir = $p_dir;
+ if ($untaint) {
+ $udir = $1 if $p_dir =~ m|$untaint_pat|;
+ unless (defined $udir) {
+ if ($untaint_skip == 0) {
+ die "directory $p_dir is still tainted";
+ }
+ else {
+ return;
}
}
- else {
- warn "Can't cd to $topdir: $!\n";
+ }
+ unless (chdir $udir) {
+ warn "Can't cd to $udir: $!\n";
+ return;
+ }
+ }
+
+ push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth;
+
+ while (defined $SE) {
+ unless ($bydepth) {
+ $dir= $p_dir;
+ $name= $dir_name;
+ $_= ($no_chdir ? $dir_name : $dir_rel );
+ # prune may happen here
+ $prune= 0;
+ &$wanted_callback;
+ next if $prune;
+ }
+
+ # change to that directory
+ unless ($no_chdir or $dir_rel eq '.') {
+ my $udir= $dir_rel;
+ if ($untaint) {
+ $udir = $1 if $dir_rel =~ m|$untaint_pat|;
+ unless (defined $udir) {
+ if ($untaint_skip == 0) {
+ die "directory ("
+ . ($p_dir ne '/' ? $p_dir : '')
+ . "/) $dir_rel is still tainted";
+ }
+ }
+ }
+ unless (chdir $udir) {
+ warn "Can't cd to ("
+ . ($p_dir ne '/' ? $p_dir : '')
+ . "/) $udir : $!\n";
+ next;
}
+ $CdLvl++;
}
- else {
- require File::Basename;
- unless (($_,$dir) = File::Basename::fileparse($topdir)) {
- ($dir,$_) = ('.', $topdir);
+
+ $dir= $dir_name;
+
+ # Get the list of files in the current directory.
+ unless (opendir DIR, ($no_chdir ? $dir_name : '.')) {
+ warn "Can't opendir($dir_name): $!\n";
+ next;
+ }
+ @filenames = readdir DIR;
+ closedir(DIR);
+
+ if ($nlink == 2 && !$avoid_nlink) {
+ # This dir has no subdirectories.
+ for my $FN (@filenames) {
+ next if $FN =~ /^\.{1,2}\z/;
+
+ $name = $dir_pref . $FN;
+ $_ = ($no_chdir ? $name : $FN);
+ &$wanted_callback;
}
- if (chdir($dir)) {
- $name = $topdir;
- $wanted->{wanted}->();
+
+ }
+ else {
+ # This dir has subdirectories.
+ $subcount = $nlink - 2;
+
+ for my $FN (@filenames) {
+ next if $FN =~ /^\.{1,2}\z/;
+ if ($subcount > 0 || $avoid_nlink) {
+ # Seen all the subdirs?
+ # check for directoriness.
+ # stat is faster for a file in the current directory
+ $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3];
+
+ if (-d _) {
+ --$subcount;
+ $FN =~ s/\.dir\z// if $Is_VMS;
+ push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink];
+ }
+ else {
+ $name = $dir_pref . $FN;
+ $_= ($no_chdir ? $name : $FN);
+ &$wanted_callback;
+ }
+ }
+ else {
+ $name = $dir_pref . $FN;
+ $_= ($no_chdir ? $name : $FN);
+ &$wanted_callback;
+ }
}
- else {
- warn "Can't cd to $dir: $!\n";
+ }
+ }
+ continue {
+ while ( defined ($SE = pop @Stack) ) {
+ ($Level, $p_dir, $dir_rel, $nlink) = @$SE;
+ if ($CdLvl > $Level && !$no_chdir) {
+ my $tmp = join('/',('..') x ($CdLvl-$Level));
+ die "Can't cd to $dir_name" . $tmp
+ unless chdir ($tmp);
+ $CdLvl = $Level;
}
+ $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
+ $dir_pref = "$dir_name/";
+ if ( $nlink < 0 ) { # must be finddepth, report dirname now
+ $name = $dir_name;
+ if ( substr($name,-2) eq '/.' ) {
+ $name =~ s|/\.$||;
+ }
+ $dir = $p_dir;
+ $_ = ($no_chdir ? $dir_name : $dir_rel );
+ if ( substr($_,-2) eq '/.' ) {
+ s|/\.$||;
+ }
+ &$wanted_callback;
+ } else {
+ push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth;
+ last;
+ }
}
- chdir $cwd;
}
}
-sub finddir {
- my($wanted, $nlink, $bydepth);
- local($dir, $name);
- ($wanted, $dir, $nlink, $bydepth) = @_;
-
- my($dev, $ino, $mode, $subcount);
-
- # Get the list of files in the current directory.
- opendir(DIR,'.') || (warn("Can't open $dir: $!\n"), $bydepth || return);
- my(@filenames) = readdir(DIR);
- closedir(DIR);
-
- if ($nlink == 2 && !$dont_use_nlink) { # This dir has no subdirectories.
- for (@filenames) {
- next if $_ eq '.';
- next if $_ eq '..';
- $name = "$dir/$_";
- $nlink = 0;
- $wanted->{wanted}->();
- }
- }
- else { # This dir has subdirectories.
- $subcount = $nlink - 2;
- for (@filenames) {
- next if $_ eq '.';
- next if $_ eq '..';
- $nlink = 0;
- $prune = 0 unless $bydepth;
- $name = "$dir/$_";
- $wanted->{wanted}->() unless $bydepth;
- if ($subcount > 0 || $dont_use_nlink) { # Seen all the subdirs?
-
- # Get link count and check for directoriness.
-
- ($dev,$ino,$mode,$nlink) = ($Is_VMS ? stat($_) : lstat($_));
- # unless ($nlink || $dont_use_nlink);
-
- if (-d _) {
-
- # It really is a directory, so do it recursively.
-
- --$subcount;
- next if $prune;
- # Untaint $_, so that we can do a chdir
- $_ = $1 if /^(.*)/;
- if (chdir $_) {
- $name =~ s/\.dir$// if $Is_VMS;
- &finddir($wanted,$name,$nlink, $bydepth);
- chdir '..';
+
+# API:
+# $wanted
+# $dir_loc : absolute location of a dir
+# $p_dir : "parent directory"
+# preconditions:
+# chdir (if not no_chdir) to dir
+
+sub _find_dir_symlnk($$$) {
+ my ($wanted, $dir_loc, $p_dir) = @_;
+ my @Stack;
+ my @filenames;
+ my $new_loc;
+ my $pdir_loc = $dir_loc;
+ my $SE = [];
+ my $dir_name = $p_dir;
+ my $dir_pref = ( $p_dir eq '/' ? '/' : "$p_dir/" );
+ my $loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" );
+ my $dir_rel = '.'; # directory name relative to current directory
+ my $byd_flag; # flag for pending stack entry if $bydepth
+
+ local ($dir, $name, $fullname, $prune, *DIR);
+
+ unless ($no_chdir or $p_dir eq '.') {
+ my $udir = $dir_loc;
+ if ($untaint) {
+ $udir = $1 if $dir_loc =~ m|$untaint_pat|;
+ unless (defined $udir) {
+ if ($untaint_skip == 0) {
+ die "directory $dir_loc is still tainted";
+ }
+ else {
+ return;
+ }
+ }
+ }
+ unless (chdir $udir) {
+ warn "Can't cd to $udir: $!\n";
+ return;
+ }
+ }
+
+ push @Stack,[$dir_loc,$pdir_loc,$p_dir,$dir_rel,-1] if $bydepth;
+
+ while (defined $SE) {
+
+ unless ($bydepth) {
+ $dir= $p_dir;
+ $name= $dir_name;
+ $_= ($no_chdir ? $dir_name : $dir_rel );
+ $fullname= $dir_loc;
+ # prune may happen here
+ $prune= 0;
+ &$wanted_callback;
+ next if $prune;
+ }
+
+ # change to that directory
+ unless ($no_chdir or $dir_rel eq '.') {
+ my $udir = $dir_loc;
+ if ($untaint) {
+ $udir = $1 if $dir_loc =~ m|$untaint_pat|;
+ unless (defined $udir ) {
+ if ($untaint_skip == 0) {
+ die "directory $dir_loc is still tainted";
}
else {
- warn "Can't cd to $_: $!\n";
+ next;
}
}
}
- $wanted->{wanted}->() if $bydepth;
+ unless (chdir $udir) {
+ warn "Can't cd to $udir: $!\n";
+ next;
+ }
+ }
+
+ $dir = $dir_name;
+
+ # Get the list of files in the current directory.
+ unless (opendir DIR, ($no_chdir ? $dir_loc : '.')) {
+ warn "Can't opendir($dir_loc): $!\n";
+ next;
+ }
+ @filenames = readdir DIR;
+ closedir(DIR);
+
+ for my $FN (@filenames) {
+ next if $FN =~ /^\.{1,2}\z/;
+
+ # follow symbolic links / do an lstat
+ $new_loc = Follow_SymLink($loc_pref.$FN);
+
+ # ignore if invalid symlink
+ next unless defined $new_loc;
+
+ if (-d _) {
+ push @Stack,[$new_loc,$dir_loc,$dir_name,$FN,1];
+ }
+ else {
+ $fullname = $new_loc;
+ $name = $dir_pref . $FN;
+ $_ = ($no_chdir ? $name : $FN);
+ &$wanted_callback;
+ }
+ }
+
+ }
+ continue {
+ while (defined($SE = pop @Stack)) {
+ ($dir_loc, $pdir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE;
+ $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
+ $dir_pref = "$dir_name/";
+ $loc_pref = "$dir_loc/";
+ if ( $byd_flag < 0 ) { # must be finddepth, report dirname now
+ unless ($no_chdir or $dir_rel eq '.') {
+ my $udir = $pdir_loc;
+ if ($untaint) {
+ $udir = $1 if $dir_loc =~ m|$untaint_pat|;
+ }
+ unless (chdir $udir) {
+ warn "Can't cd to $udir: $!\n";
+ next;
+ }
+ }
+ $fullname = $dir_loc;
+ $name = $dir_name;
+ if ( substr($name,-2) eq '/.' ) {
+ $name =~ s|/\.$||;
+ }
+ $dir = $p_dir;
+ $_ = ($no_chdir ? $dir_name : $dir_rel);
+ if ( substr($_,-2) eq '/.' ) {
+ s|/\.$||;
+ }
+
+ &$wanted_callback;
+ } else {
+ push @Stack,[$dir_loc, $pdir_loc, $p_dir, $dir_rel,-1] if $bydepth;
+ last;
+ }
}
}
}
+
sub wrap_wanted {
- my $wanted = shift;
- ref($wanted) eq 'HASH' ? $wanted : { wanted => $wanted };
+ my $wanted = shift;
+ if ( ref($wanted) eq 'HASH' ) {
+ if ( $wanted->{follow} || $wanted->{follow_fast}) {
+ $wanted->{follow_skip} = 1 unless defined $wanted->{follow_skip};
+ }
+ if ( $wanted->{untaint} ) {
+ $wanted->{untaint_pattern} = qr|^([-+@\w./]+)$|
+ unless defined $wanted->{untaint_pattern};
+ $wanted->{untaint_skip} = 0 unless defined $wanted->{untaint_skip};
+ }
+ return $wanted;
+ }
+ else {
+ return { wanted => $wanted };
+ }
}
sub find {
- my $wanted = shift;
- find_opt(wrap_wanted($wanted), @_);
+ my $wanted = shift;
+ _find_opt(wrap_wanted($wanted), @_);
+ %SLnkSeen= (); # free memory
}
sub finddepth {
- my $wanted = wrap_wanted(shift);
- $wanted->{bydepth} = 1;
- find_opt($wanted, @_);
+ my $wanted = wrap_wanted(shift);
+ $wanted->{bydepth} = 1;
+ _find_opt($wanted, @_);
+ %SLnkSeen= (); # free memory
}
# These are hard-coded for now, but may move to hint files.
if ($^O eq 'VMS') {
- $Is_VMS = 1;
- $dont_use_nlink = 1;
+ $Is_VMS = 1;
+ $File::Find::dont_use_nlink = 1;
}
-$dont_use_nlink = 1
+$File::Find::dont_use_nlink = 1
if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos' || $^O eq 'MSWin32';
# Set dont_use_nlink in your hint file if your system's stat doesn't
# report the number of links in a directory as an indication
# of the number of files.
# See, e.g. hints/machten.sh for MachTen 2.2.
-unless ($dont_use_nlink) {
- require Config;
- $dont_use_nlink = 1 if ($Config::Config{'dont_use_nlink'});
+unless ($File::Find::dont_use_nlink) {
+ require Config;
+ $File::Find::dont_use_nlink = 1 if ($Config::Config{'dont_use_nlink'});
}
1;
-
diff --git a/contrib/perl5/lib/File/Path.pm b/contrib/perl5/lib/File/Path.pm
index 225ecab..46f360a 100644
--- a/contrib/perl5/lib/File/Path.pm
+++ b/contrib/perl5/lib/File/Path.pm
@@ -2,15 +2,14 @@ package File::Path;
=head1 NAME
-File::Path - create or remove a series of directories
+File::Path - create or remove directory trees
=head1 SYNOPSIS
-C<use File::Path>
+ use File::Path;
-C<mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);>
-
-C<rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);>
+ mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);
+ rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);
=head1 DESCRIPTION
@@ -74,7 +73,7 @@ than VMS is settled. (defaults to FALSE)
=back
It returns the number of files successfully deleted. Symlinks are
-treated as ordinary files.
+simply deleted and not followed.
B<NOTE:> If the third parameter is not TRUE, C<rmtree> is B<unsecure>
in the face of failure or interruption. Files and directories which
@@ -90,22 +89,17 @@ in situations where security is an issue.
Tim Bunce <F<Tim.Bunce@ig.co.uk>> and
Charles Bailey <F<bailey@newman.upenn.edu>>
-=head1 REVISION
-
-Current $VERSION is 1.0401.
-
=cut
+use 5.005_64;
use Carp;
use File::Basename ();
-use DirHandle ();
use Exporter ();
use strict;
-use vars qw( $VERSION @ISA @EXPORT );
-$VERSION = "1.0401";
-@ISA = qw( Exporter );
-@EXPORT = qw( mkpath rmtree );
+our $VERSION = "1.0403";
+our @ISA = qw( Exporter );
+our @EXPORT = qw( mkpath rmtree );
my $Is_VMS = $^O eq 'VMS';
@@ -124,20 +118,22 @@ sub mkpath {
$paths = [$paths] unless ref $paths;
my(@created,$path);
foreach $path (@$paths) {
- $path .= '/' if $^O eq 'os2' and $path =~ /^\w:$/; # feature of CRT
+ $path .= '/' if $^O eq 'os2' and $path =~ /^\w:\z/s; # feature of CRT
next if -d $path;
# Logic wants Unix paths, so go with the flow.
$path = VMS::Filespec::unixify($path) if $Is_VMS;
my $parent = File::Basename::dirname($path);
# Allow for creation of new logical filesystems under VMS
if (not $Is_VMS or $parent !~ m:/[^/]+/000000/?:) {
- push(@created,mkpath($parent, $verbose, $mode)) unless (-d $parent);
+ unless (-d $parent or $path eq $parent) {
+ push(@created,mkpath($parent, $verbose, $mode));
+ }
}
print "mkdir $path\n" if $verbose;
unless (mkdir($path,$mode)) {
- my $e = $!;
- # allow for another process to have created it meanwhile
- croak "mkdir $path: $e" unless -d $path;
+ my $e = $!;
+ # allow for another process to have created it meanwhile
+ croak "mkdir $path: $e" unless -d $path;
}
push(@created, $path);
}
@@ -148,13 +144,20 @@ sub rmtree {
my($roots, $verbose, $safe) = @_;
my(@files);
my($count) = 0;
- $roots = [$roots] unless ref $roots;
$verbose ||= 0;
$safe ||= 0;
+ if ( defined($roots) && length($roots) ) {
+ $roots = [$roots] unless ref $roots;
+ }
+ else {
+ carp "No root path(s) specified\n";
+ return 0;
+ }
+
my($root);
foreach $root (@{$roots}) {
- $root =~ s#/$##;
+ $root =~ s#/\z##;
(undef, undef, my $rp) = lstat $root or next;
$rp &= 07777; # don't forget setuid, setgid, sticky bits
if ( -d _ ) {
@@ -166,16 +169,20 @@ sub rmtree {
or carp "Can't make directory $root read+writeable: $!"
unless $safe;
- my $d = DirHandle->new($root)
- or carp "Can't read $root: $!";
- @files = $d->read;
- $d->close;
+ if (opendir my $d, $root) {
+ @files = readdir $d;
+ closedir $d;
+ }
+ else {
+ carp "Can't read $root: $!";
+ @files = ();
+ }
# Deleting large numbers of files from VMS Files-11 filesystems
# is faster if done in reverse ASCIIbetical order
@files = reverse @files if $Is_VMS;
- ($root = VMS::Filespec::unixify($root)) =~ s#\.dir$## if $Is_VMS;
- @files = map("$root/$_", grep $_!~/^\.{1,2}$/,@files);
+ ($root = VMS::Filespec::unixify($root)) =~ s#\.dir\z## if $Is_VMS;
+ @files = map("$root/$_", grep $_!~/^\.{1,2}\z/s,@files);
$count += rmtree(\@files,$verbose,$safe);
if ($safe &&
($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
@@ -198,7 +205,9 @@ sub rmtree {
}
else {
if ($safe &&
- ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
+ ($Is_VMS ? !&VMS::Filespec::candelete($root)
+ : !(-l $root || -w $root)))
+ {
print "skipped $root\n" if $verbose;
next;
}
diff --git a/contrib/perl5/lib/File/Spec.pm b/contrib/perl5/lib/File/Spec.pm
index 616dcbc..40f5345 100644
--- a/contrib/perl5/lib/File/Spec.pm
+++ b/contrib/perl5/lib/File/Spec.pm
@@ -1,47 +1,18 @@
package File::Spec;
-require Exporter;
-
-@ISA = qw(Exporter);
-# Items to export into callers namespace by default. Note: do not export
-# names by default without a very good reason. Use EXPORT_OK instead.
-# Do not simply export all your public functions/methods/constants.
-@EXPORT = qw(
-
-);
-@EXPORT_OK = qw($Verbose);
-
use strict;
-use vars qw(@ISA $VERSION $Verbose);
-
-$VERSION = '0.6';
-
-$Verbose = 0;
+use vars qw(@ISA $VERSION);
-require File::Spec::Unix;
+$VERSION = '0.8';
+my %module = (MacOS => 'Mac',
+ MSWin32 => 'Win32',
+ os2 => 'OS2',
+ VMS => 'VMS');
-sub load {
- my($class,$OS) = @_;
- if ($OS eq 'VMS') {
- require File::Spec::VMS;
- require VMS::Filespec;
- 'File::Spec::VMS'
- } elsif ($OS eq 'os2') {
- require File::Spec::OS2;
- 'File::Spec::OS2'
- } elsif ($OS eq 'MacOS') {
- require File::Spec::Mac;
- 'File::Spec::Mac'
- } elsif ($OS eq 'MSWin32') {
- require File::Spec::Win32;
- 'File::Spec::Win32'
- } else {
- 'File::Spec::Unix'
- }
-}
-
-@ISA = load('File::Spec', $^O);
+my $module = $module{$^O} || 'Unix';
+require "File/Spec/$module.pm";
+@ISA = ("File::Spec::$module");
1;
__END__
@@ -52,11 +23,15 @@ File::Spec - portably perform operations on file names
=head1 SYNOPSIS
-C<use File::Spec;>
+ use File::Spec;
+
+ $x=File::Spec->catfile('a', 'b', 'c');
+
+which returns 'a/b/c' under Unix. Or:
-C<$x=File::Spec-E<gt>catfile('a','b','c');>
+ use File::Spec::Functions;
-which returns 'a/b/c' under Unix.
+ $x = catfile('a', 'b', 'c');
=head1 DESCRIPTION
@@ -78,28 +53,31 @@ OS specific routines is available in a separate module, including:
File::Spec::VMS
The module appropriate for the current OS is automatically loaded by
-File::Spec. Since some modules (like VMS) make use of OS specific
-facilities, it may not be possible to load all modules under all operating
-systems.
+File::Spec. Since some modules (like VMS) make use of facilities available
+only under that OS, it may not be possible to load all modules under all
+operating systems.
Since File::Spec is object oriented, subroutines should not called directly,
as in:
File::Spec::catfile('a','b');
-
+
but rather as class methods:
File::Spec->catfile('a','b');
-For a reference of available functions, please consult L<File::Spec::Unix>,
-which contains the entire set, and inherited by the modules for other
-platforms. For further information, please see L<File::Spec::Mac>,
+For simple uses, L<File::Spec::Functions> provides convenient functional
+forms of these methods.
+
+For a list of available methods, please consult L<File::Spec::Unix>,
+which contains the entire set, and which is inherited by the modules for
+other platforms. For further information, please see L<File::Spec::Mac>,
L<File::Spec::OS2>, L<File::Spec::Win32>, or L<File::Spec::VMS>.
=head1 SEE ALSO
File::Spec::Unix, File::Spec::Mac, File::Spec::OS2, File::Spec::Win32,
-File::Spec::VMS, ExtUtils::MakeMaker
+File::Spec::VMS, File::Spec::Functions, ExtUtils::MakeMaker
=head1 AUTHORS
@@ -108,9 +86,7 @@ Kenneth Albanowski <F<kjahds@kjahds.com>>, Andy Dougherty
<F<A.Koenig@franz.ww.TU-Berlin.DE>>, Tim Bunce <F<Tim.Bunce@ig.co.uk>>. VMS
support by Charles Bailey <F<bailey@newman.upenn.edu>>. OS/2 support by
Ilya Zakharevich <F<ilya@math.ohio-state.edu>>. Mac support by Paul Schinder
-<F<schinder@pobox.com>>.
-
-=cut
-
-
-1;
+<F<schinder@pobox.com>>. abs2rel() and rel2abs() written by
+Shigio Yamaguchi <F<shigio@tamacom.com>>, modified by Barrie Slaymaker
+<F<barries@slaysys.com>>. splitpath(), splitdir(), catpath() and catdir()
+by Barrie Slaymaker.
diff --git a/contrib/perl5/lib/File/Spec/Functions.pm b/contrib/perl5/lib/File/Spec/Functions.pm
new file mode 100644
index 0000000..140738f
--- /dev/null
+++ b/contrib/perl5/lib/File/Spec/Functions.pm
@@ -0,0 +1,95 @@
+package File::Spec::Functions;
+
+use File::Spec;
+use strict;
+
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+
+require Exporter;
+
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ canonpath
+ catdir
+ catfile
+ curdir
+ rootdir
+ updir
+ no_upwards
+ file_name_is_absolute
+ path
+);
+
+@EXPORT_OK = qw(
+ devnull
+ tmpdir
+ splitpath
+ splitdir
+ catpath
+ abs2rel
+ rel2abs
+);
+
+%EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
+
+foreach my $meth (@EXPORT, @EXPORT_OK) {
+ my $sub = File::Spec->can($meth);
+ no strict 'refs';
+ *{$meth} = sub {&$sub('File::Spec', @_)};
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+File::Spec::Functions - portably perform operations on file names
+
+=head1 SYNOPSIS
+
+ use File::Spec::Functions;
+ $x = catfile('a','b');
+
+=head1 DESCRIPTION
+
+This module exports convenience functions for all of the class methods
+provided by File::Spec.
+
+For a reference of available functions, please consult L<File::Spec::Unix>,
+which contains the entire set, and which is inherited by the modules for
+other platforms. For further information, please see L<File::Spec::Mac>,
+L<File::Spec::OS2>, L<File::Spec::Win32>, or L<File::Spec::VMS>.
+
+=head2 Exports
+
+The following functions are exported by default.
+
+ canonpath
+ catdir
+ catfile
+ curdir
+ rootdir
+ updir
+ no_upwards
+ file_name_is_absolute
+ path
+
+
+The following functions are exported only by request.
+
+ devnull
+ tmpdir
+ splitpath
+ splitdir
+ catpath
+ abs2rel
+ rel2abs
+
+All the functions may be imported using the C<:ALL> tag.
+
+=head1 SEE ALSO
+
+File::Spec, File::Spec::Unix, File::Spec::Mac, File::Spec::OS2,
+File::Spec::Win32, File::Spec::VMS, ExtUtils::MakeMaker
diff --git a/contrib/perl5/lib/File/Spec/Mac.pm b/contrib/perl5/lib/File/Spec/Mac.pm
index 63a9e12..959e33d 100644
--- a/contrib/perl5/lib/File/Spec/Mac.pm
+++ b/contrib/perl5/lib/File/Spec/Mac.pm
@@ -1,18 +1,9 @@
package File::Spec::Mac;
-use Exporter ();
-use Config;
use strict;
-use File::Spec;
-use vars qw(@ISA $VERSION $Is_Mac);
-
-$VERSION = '1.0';
-
+use vars qw(@ISA);
+require File::Spec::Unix;
@ISA = qw(File::Spec::Unix);
-$Is_Mac = $^O eq 'MacOS';
-
-Exporter::import('File::Spec', '$Verbose');
-
=head1 NAME
@@ -20,7 +11,7 @@ File::Spec::Mac - File::Spec for MacOS
=head1 SYNOPSIS
-C<require File::Spec::Mac;>
+ require File::Spec::Mac; # Done internally by File::Spec if needed
=head1 DESCRIPTION
@@ -37,8 +28,8 @@ On MacOS, there's nothing to be done. Returns what it's given.
=cut
sub canonpath {
- my($self,$path) = @_;
- $path;
+ my ($self,$path) = @_;
+ return $path;
}
=item catdir
@@ -84,20 +75,17 @@ aren't done here. This routine will treat this as absolute.
=cut
-# ';
-
sub catdir {
shift;
my @args = @_;
- $args[0] =~ s/:$//;
- my $result = shift @args;
- for (@args) {
- s/:$//;
- s/^://;
- $result .= ":$_";
+ my $result = shift @args;
+ $result =~ s/:\z//;
+ foreach (@args) {
+ s/:\z//;
+ s/^://s;
+ $result .= ":$_";
}
- $result .= ":";
- $result;
+ return "$result:";
}
=item catfile
@@ -118,50 +106,69 @@ give the same answer, as one might expect.
=cut
sub catfile {
- my $self = shift @_;
+ my $self = shift;
my $file = pop @_;
return $file unless @_;
my $dir = $self->catdir(@_);
- $file =~ s/^://;
+ $file =~ s/^://s;
return $dir.$file;
}
=item curdir
-Returns a string representing of the current directory.
+Returns a string representing the current directory.
=cut
sub curdir {
- return ":" ;
+ return ":";
+}
+
+=item devnull
+
+Returns a string representing the null device.
+
+=cut
+
+sub devnull {
+ return "Dev:Null";
}
=item rootdir
Returns a string representing the root directory. Under MacPerl,
returns the name of the startup volume, since that's the closest in
-concept, although other volumes aren't rooted there. On any other
-platform returns '', since there's no common way to indicate "root
-directory" across all Macs.
+concept, although other volumes aren't rooted there.
=cut
sub rootdir {
#
-# There's no real root directory on MacOS. If you're using MacPerl,
-# the name of the startup volume is returned, since that's the closest in
-# concept. On other platforms, simply return '', because nothing better
-# can be done.
+# There's no real root directory on MacOS. The name of the startup
+# volume is returned, since that's the closest in concept.
#
- if($Is_Mac) {
- require Mac::Files;
- my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk,
- &Mac::Files::kSystemFolderType);
- $system =~ s/:.*$/:/;
- return $system;
- } else {
- return '';
- }
+ require Mac::Files;
+ my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk,
+ &Mac::Files::kSystemFolderType);
+ $system =~ s/:.*\z/:/s;
+ return $system;
+}
+
+=item tmpdir
+
+Returns a string representation of the first existing directory
+from the following list or '' if none exist:
+
+ $ENV{TMPDIR}
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ $tmpdir = $ENV{TMPDIR} if -d $ENV{TMPDIR};
+ $tmpdir = '' unless defined $tmpdir;
+ return $tmpdir;
}
=item updir
@@ -185,11 +192,11 @@ distinguish unambiguously.
=cut
sub file_name_is_absolute {
- my($self,$file) = @_;
- if ($file =~ /:/) {
- return ($file !~ m/^:/);
- } else {
- return (! -e ":$file");
+ my ($self,$file) = @_;
+ if ($file =~ /:/) {
+ return ($file !~ m/^:/s);
+ } else {
+ return (! -e ":$file");
}
}
@@ -207,16 +214,178 @@ sub path {
# The concept is meaningless under the MacPerl application.
# Under MPW, it has a meaning.
#
- my($self) = @_;
- my @path;
- if(exists $ENV{Commands}) {
- @path = split /,/,$ENV{Commands};
- } else {
- @path = ();
- }
- @path;
+ return unless exists $ENV{Commands};
+ return split(/,/, $ENV{Commands});
+}
+
+=item splitpath
+
+=cut
+
+sub splitpath {
+ my ($self,$path, $nofile) = @_;
+
+ my ($volume,$directory,$file) = ('','','');
+
+ if ( $nofile ) {
+ ( $volume, $directory ) = $path =~ m@((?:[^:]+(?::|\z))?)(.*)@s;
+ }
+ else {
+ $path =~
+ m@^( (?: [^:]+: )? )
+ ( (?: .*: )? )
+ ( .* )
+ @xs;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ # Make sure non-empty volumes and directories end in ':'
+ $volume .= ':' if $volume =~ m@[^:]\z@ ;
+ $directory .= ':' if $directory =~ m@[^:]\z@ ;
+ return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+=cut
+
+sub splitdir {
+ my ($self,$directories) = @_ ;
+ #
+ # split() likes to forget about trailing null fields, so here we
+ # check to be sure that there will not be any before handling the
+ # simple case.
+ #
+ if ( $directories !~ m@:\z@ ) {
+ return split( m@:@, $directories );
+ }
+ else {
+ #
+ # since there was a trailing separator, add a file name to the end,
+ # then do the split, then replace it with ''.
+ #
+ my( @directories )= split( m@:@, "${directories}dummy" ) ;
+ $directories[ $#directories ]= '' ;
+ return @directories ;
+ }
+}
+
+
+=item catpath
+
+=cut
+
+sub catpath {
+ my $self = shift ;
+
+ my $result = shift ;
+ $result =~ s@^([^/])@/$1@s ;
+
+ my $segment ;
+ for $segment ( @_ ) {
+ if ( $result =~ m@[^/]\z@ && $segment =~ m@^[^/]@s ) {
+ $result .= "/$segment" ;
+ }
+ elsif ( $result =~ m@/\z@ && $segment =~ m@^/@s ) {
+ $result =~ s@/+\z@/@;
+ $segment =~ s@^/+@@s;
+ $result .= "$segment" ;
+ }
+ else {
+ $result .= $segment ;
+ }
+ }
+
+ return $result ;
}
+=item abs2rel
+
+=cut
+
+sub abs2rel {
+ my($self,$path,$base) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path );
+ my @basechunks = $self->splitdir( $base );
+
+ while (@pathchunks && @basechunks && $pathchunks[0] eq $basechunks[0]) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ $path = join( ':', @pathchunks );
+
+ # @basechunks now contains the number of directories to climb out of.
+ $base = ':' x @basechunks ;
+
+ return "$base:$path" ;
+}
+
+=item rel2abs
+
+Converts a relative path to an absolute path.
+
+ $abs_path = File::Spec->rel2abs( $destination ) ;
+ $abs_path = File::Spec->rel2abs( $destination, $base ) ;
+
+If $base is not present or '', then L<cwd()> is used. If $base is relative,
+then it is converted to absolute form using L</rel2abs()>. This means that it
+is taken to be relative to L<cwd()>.
+
+On systems with the concept of a volume, this assumes that both paths
+are on the $base volume, and ignores the $destination volume.
+
+On systems that have a grammar that indicates filenames, this ignores the
+$base filename as well. Otherwise all path components are assumed to be
+directories.
+
+If $path is absolute, it is cleaned up and returned using L</canonpath()>.
+
+Based on code written by Shigio Yamaguchi.
+
+No checks against the filesystem are made.
+
+=cut
+
+sub rel2abs($;$;) {
+ my ($self,$path,$base ) = @_;
+
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ $path = $self->canonpath("$base$path") ;
+ }
+
+ return $path ;
+}
+
+
=back
=head1 SEE ALSO
@@ -226,5 +395,3 @@ L<File::Spec>
=cut
1;
-__END__
-
diff --git a/contrib/perl5/lib/File/Spec/OS2.pm b/contrib/perl5/lib/File/Spec/OS2.pm
index d602617..33370f0 100644
--- a/contrib/perl5/lib/File/Spec/OS2.pm
+++ b/contrib/perl5/lib/File/Spec/OS2.pm
@@ -1,34 +1,44 @@
package File::Spec::OS2;
-#use Config;
-#use Cwd;
-#use File::Basename;
use strict;
-require Exporter;
-
-use File::Spec;
use vars qw(@ISA);
-
-Exporter::import('File::Spec',
- qw( $Verbose));
-
+require File::Spec::Unix;
@ISA = qw(File::Spec::Unix);
-$ENV{EMXSHELL} = 'sh'; # to run `commands`
+sub devnull {
+ return "/dev/nul";
+}
+
+sub case_tolerant {
+ return 1;
+}
sub file_name_is_absolute {
- my($self,$file) = @_;
- $file =~ m{^([a-z]:)?[\\/]}i ;
+ my ($self,$file) = @_;
+ return scalar($file =~ m{^([a-z]:)?[\\/]}is);
}
sub path {
- my($self) = @_;
- my $path_sep = ";";
my $path = $ENV{PATH};
$path =~ s:\\:/:g;
- my @path = split $path_sep, $path;
- foreach(@path) { $_ = '.' if $_ eq '' }
- @path;
+ my @path = split(';',$path);
+ foreach (@path) { $_ = '.' if $_ eq '' }
+ return @path;
+}
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ my $self = shift;
+ foreach (@ENV{qw(TMPDIR TEMP TMP)}, qw(/tmp /)) {
+ next unless defined && -d;
+ $tmpdir = $_;
+ last;
+ }
+ $tmpdir = '' unless defined $tmpdir;
+ $tmpdir =~ s:\\:/:g;
+ $tmpdir = $self->canonpath($tmpdir);
+ return $tmpdir;
}
1;
@@ -40,12 +50,10 @@ File::Spec::OS2 - methods for OS/2 file specs
=head1 SYNOPSIS
- use File::Spec::OS2; # Done internally by File::Spec if needed
+ require File::Spec::OS2; # Done internally by File::Spec if needed
=head1 DESCRIPTION
See File::Spec::Unix for a documentation of the methods provided
there. This package overrides the implementation of these methods, not
the semantics.
-
-=cut
diff --git a/contrib/perl5/lib/File/Spec/Unix.pm b/contrib/perl5/lib/File/Spec/Unix.pm
index 77de73a..2305b75 100644
--- a/contrib/perl5/lib/File/Spec/Unix.pm
+++ b/contrib/perl5/lib/File/Spec/Unix.pm
@@ -1,23 +1,8 @@
package File::Spec::Unix;
-use Exporter ();
-use Config;
-use File::Basename qw(basename dirname fileparse);
-use DirHandle;
use strict;
-use vars qw(@ISA $Is_Mac $Is_OS2 $Is_VMS $Is_Win32);
-use File::Spec;
-Exporter::import('File::Spec', '$Verbose');
-
-$Is_OS2 = $^O eq 'os2';
-$Is_Mac = $^O eq 'MacOS';
-$Is_Win32 = $^O eq 'MSWin32';
-
-if ($Is_VMS = $^O eq 'VMS') {
- require VMS::Filespec;
- import VMS::Filespec qw( &vmsify );
-}
+use Cwd;
=head1 NAME
@@ -25,7 +10,7 @@ File::Spec::Unix - methods used by File::Spec
=head1 SYNOPSIS
-C<require File::Spec::Unix;>
+ require File::Spec::Unix; # Done automatically by File::Spec
=head1 DESCRIPTION
@@ -40,15 +25,18 @@ Methods for manipulating file specifications.
No physical check on the filesystem, but a logical cleanup of a
path. On UNIX eliminated successive slashes and successive "/.".
+ $cpath = File::Spec->canonpath( $path ) ;
+
=cut
sub canonpath {
- my($self,$path) = @_;
- $path =~ s|/+|/|g ; # xx////xx -> xx/xx
- $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx
- $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx
- $path =~ s|/$|| unless $path eq "/"; # xx/ -> xx
- $path;
+ my ($self,$path) = @_;
+ $path =~ s|/+|/|g unless($^O eq 'cygwin'); # xx////xx -> xx/xx
+ $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx
+ $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx
+ $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx
+ $path =~ s|/\z|| unless $path eq "/"; # xx/ -> xx
+ return $path;
}
=item catdir
@@ -61,20 +49,14 @@ trailing slash :-)
=cut
-# ';
-
sub catdir {
- shift;
+ my $self = shift;
my @args = @_;
- for (@args) {
+ foreach (@args) {
# append a slash to each argument unless it has one there
- $_ .= "/" if $_ eq '' or substr($_,-1) ne "/";
+ $_ .= "/" if $_ eq '' || substr($_,-1) ne "/";
}
- my $result = join('', @args);
- # remove a trailing slash unless we are root
- substr($result,-1) = ""
- if length($result) > 1 && substr($result,-1) eq "/";
- $result;
+ return $self->canonpath(join('', @args));
}
=item catfile
@@ -85,29 +67,37 @@ complete path ending with a filename
=cut
sub catfile {
- my $self = shift @_;
+ my $self = shift;
my $file = pop @_;
return $file unless @_;
my $dir = $self->catdir(@_);
- for ($dir) {
- $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
- }
+ $dir .= "/" unless substr($dir,-1) eq "/";
return $dir.$file;
}
=item curdir
-Returns a string representing of the current directory. "." on UNIX.
+Returns a string representation of the current directory. "." on UNIX.
=cut
sub curdir {
- return "." ;
+ return ".";
+}
+
+=item devnull
+
+Returns a string representation of the null device. "/dev/null" on UNIX.
+
+=cut
+
+sub devnull {
+ return "/dev/null";
}
=item rootdir
-Returns a string representing of the root directory. "/" on UNIX.
+Returns a string representation of the root directory. "/" on UNIX.
=cut
@@ -115,9 +105,31 @@ sub rootdir {
return "/";
}
+=item tmpdir
+
+Returns a string representation of the first writable directory
+from the following list or "" if none are writable:
+
+ $ENV{TMPDIR}
+ /tmp
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ foreach ($ENV{TMPDIR}, "/tmp") {
+ next unless defined && -d && -w _;
+ $tmpdir = $_;
+ last;
+ }
+ $tmpdir = '' unless defined $tmpdir;
+ return $tmpdir;
+}
+
=item updir
-Returns a string representing of the parent directory. ".." on UNIX.
+Returns a string representation of the parent directory. ".." on UNIX.
=cut
@@ -133,8 +145,19 @@ directory. (Does not strip symlinks, only '.', '..', and equivalents.)
=cut
sub no_upwards {
- my($self) = shift;
- return grep(!/^\.{1,2}$/, @_);
+ my $self = shift;
+ return grep(!/^\.{1,2}\z/s, @_);
+}
+
+=item case_tolerant
+
+Returns a true or false value indicating, respectively, that alphabetic
+is not or is significant when comparing file specifications.
+
+=cut
+
+sub case_tolerant {
+ return 0;
}
=item file_name_is_absolute
@@ -144,8 +167,8 @@ Takes as argument a path and returns true, if it is an absolute path.
=cut
sub file_name_is_absolute {
- my($self,$file) = @_;
- $file =~ m:^/: ;
+ my ($self,$file) = @_;
+ return scalar($file =~ m:^/:s);
}
=item path
@@ -155,12 +178,9 @@ Takes no argument, returns the environment variable PATH as an array.
=cut
sub path {
- my($self) = @_;
- my $path_sep = ":";
- my $path = $ENV{PATH};
- my @path = split $path_sep, $path;
- foreach(@path) { $_ = '.' if $_ eq '' }
- @path;
+ my @path = split(':', $ENV{PATH});
+ foreach (@path) { $_ = '.' if $_ eq '' }
+ return @path;
}
=item join
@@ -170,21 +190,247 @@ join is the same as catfile.
=cut
sub join {
- my($self) = shift @_;
- $self->catfile(@_);
+ my $self = shift;
+ return $self->catfile(@_);
+}
+
+=item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path in to volume, directory, and filename portions. On systems
+with no concept of volume, returns undef for volume.
+
+For systems with no syntax differentiating filenames from directories,
+assumes that the last file is a path unless $no_file is true or a
+trailing separator or /. or /.. is present. On Unix this means that $no_file
+true makes this return ( '', $path, '' ).
+
+The directory portion may or may not be returned with a trailing '/'.
+
+The results can be passed to L</catpath()> to get back a path equivalent to
+(usually identical to) the original path.
+
+=cut
+
+sub splitpath {
+ my ($self,$path, $nofile) = @_;
+
+ my ($volume,$directory,$file) = ('','','');
+
+ if ( $nofile ) {
+ $directory = $path;
+ }
+ else {
+ $path =~ m|^ ( (?: .* / (?: \.\.?\z )? )? ) ([^/]*) |xs;
+ $directory = $1;
+ $file = $2;
+ }
+
+ return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of L</catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+$directories must be only the directory portion of the path on systems
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, empty
+directory names (C<''>) can be returned, because these are significant
+on some OSs (e.g. MacOS).
+
+On Unix,
+
+ File::Spec->splitdir( "/a/b//c/" );
+
+Yields:
+
+ ( '', 'a', 'b', '', 'c', '' )
+
+=cut
+
+sub splitdir {
+ my ($self,$directories) = @_ ;
+ #
+ # split() likes to forget about trailing null fields, so here we
+ # check to be sure that there will not be any before handling the
+ # simple case.
+ #
+ if ( $directories !~ m|/\z| ) {
+ return split( m|/|, $directories );
+ }
+ else {
+ #
+ # since there was a trailing separator, add a file name to the end,
+ # then do the split, then replace it with ''.
+ #
+ my( @directories )= split( m|/|, "${directories}dummy" ) ;
+ $directories[ $#directories ]= '' ;
+ return @directories ;
+ }
}
-=item nativename
-TBW.
+=item catpath
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, $volume is ignored, and directory and file are catenated. A '/' is
+inserted if need be. On other OSs, $volume is significant.
=cut
-sub nativename {
- my($self,$name) = shift @_;
- $name;
+sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ if ( $directory ne '' &&
+ $file ne '' &&
+ substr( $directory, -1 ) ne '/' &&
+ substr( $file, 0, 1 ) ne '/'
+ ) {
+ $directory .= "/$file" ;
+ }
+ else {
+ $directory .= $file ;
+ }
+
+ return $directory ;
}
+=item abs2rel
+
+Takes a destination path and an optional base path returns a relative path
+from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $destination ) ;
+ $rel_path = File::Spec->abs2rel( $destination, $base ) ;
+
+If $base is not present or '', then L<cwd()> is used. If $base is relative,
+then it is converted to absolute form using L</rel2abs()>. This means that it
+is taken to be relative to L<cwd()>.
+
+On systems with the concept of a volume, this assumes that both paths
+are on the $destination volume, and ignores the $base volume.
+
+On systems that have a grammar that indicates filenames, this ignores the
+$base filename as well. Otherwise all path components are assumed to be
+directories.
+
+If $path is relative, it is converted to absolute form using L</rel2abs()>.
+This means that it is taken to be relative to L<cwd()>.
+
+Based on code written by Shigio Yamaguchi.
+
+No checks against the filesystem are made.
+
+=cut
+
+sub abs2rel {
+ my($self,$path,$base) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ }
+ else {
+ $path = $self->canonpath( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path);
+ my @basechunks = $self->splitdir( $base);
+
+ while (@pathchunks && @basechunks && $pathchunks[0] eq $basechunks[0]) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ $path = CORE::join( '/', @pathchunks );
+ $base = CORE::join( '/', @basechunks );
+
+ # $base now contains the directories the resulting relative path
+ # must ascend out of before it can descend to $path_directory. So,
+ # replace all names with $parentDir
+ $base =~ s|[^/]+|..|g ;
+
+ # Glue the two together, using a separator if necessary, and preventing an
+ # empty result.
+ if ( $path ne '' && $base ne '' ) {
+ $path = "$base/$path" ;
+ } else {
+ $path = "$base$path" ;
+ }
+
+ return $self->canonpath( $path ) ;
+}
+
+=item rel2abs
+
+Converts a relative path to an absolute path.
+
+ $abs_path = File::Spec->rel2abs( $destination ) ;
+ $abs_path = File::Spec->rel2abs( $destination, $base ) ;
+
+If $base is not present or '', then L<cwd()> is used. If $base is relative,
+then it is converted to absolute form using L</rel2abs()>. This means that it
+is taken to be relative to L<cwd()>.
+
+On systems with the concept of a volume, this assumes that both paths
+are on the $base volume, and ignores the $destination volume.
+
+On systems that have a grammar that indicates filenames, this ignores the
+$base filename as well. Otherwise all path components are assumed to be
+directories.
+
+If $path is absolute, it is cleaned up and returned using L</canonpath()>.
+
+Based on code written by Shigio Yamaguchi.
+
+No checks against the filesystem are made.
+
+=cut
+
+sub rel2abs($;$;) {
+ my ($self,$path,$base ) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Glom them together
+ $path = $self->catdir( $base, $path ) ;
+ }
+
+ return $self->canonpath( $path ) ;
+}
+
+
=back
=head1 SEE ALSO
@@ -194,4 +440,3 @@ L<File::Spec>
=cut
1;
-__END__
diff --git a/contrib/perl5/lib/File/Spec/VMS.pm b/contrib/perl5/lib/File/Spec/VMS.pm
index c5269fd..a2ac8ca 100644
--- a/contrib/perl5/lib/File/Spec/VMS.pm
+++ b/contrib/perl5/lib/File/Spec/VMS.pm
@@ -1,19 +1,13 @@
-
package File::Spec::VMS;
-use Carp qw( &carp );
-use Config;
-require Exporter;
-use VMS::Filespec;
-use File::Basename;
-
-use File::Spec;
-use vars qw($Revision);
-$Revision = '5.3901 (6-Mar-1997)';
-
+use strict;
+use vars qw(@ISA);
+require File::Spec::Unix;
@ISA = qw(File::Spec::Unix);
-Exporter::import('File::Spec', '$Verbose');
+use Cwd;
+use File::Basename;
+use VMS::Filespec;
=head1 NAME
@@ -21,7 +15,7 @@ File::Spec::VMS - methods for VMS file specs
=head1 SYNOPSIS
- use File::Spec::VMS; # Done internally by File::Spec if needed
+ require File::Spec::VMS; # Done internally by File::Spec if needed
=head1 DESCRIPTION
@@ -29,67 +23,202 @@ See File::Spec::Unix for a documentation of the methods provided
there. This package overrides the implementation of these methods, not
the semantics.
+=over
+
+=item eliminate_macros
+
+Expands MM[KS]/Make macros in a text string, using the contents of
+identically named elements of C<%$self>, and returns the result
+as a file specification in Unix syntax.
+
+=cut
+
+sub eliminate_macros {
+ my($self,$path) = @_;
+ return '' unless $path;
+ $self = {} unless ref $self;
+ my($npath) = unixify($path);
+ my($complex) = 0;
+ my($head,$macro,$tail);
+
+ # perform m##g in scalar context so it acts as an iterator
+ while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
+ if ($self->{$2}) {
+ ($head,$macro,$tail) = ($1,$2,$3);
+ if (ref $self->{$macro}) {
+ if (ref $self->{$macro} eq 'ARRAY') {
+ $macro = join ' ', @{$self->{$macro}};
+ }
+ else {
+ print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
+ "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
+ $macro = "\cB$macro\cB";
+ $complex = 1;
+ }
+ }
+ else { ($macro = unixify($self->{$macro})) =~ s#/\z##; }
+ $npath = "$head$macro$tail";
+ }
+ }
+ if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
+ $npath;
+}
+
+=item fixpath
+
+Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
+in any directory specification, in order to avoid juxtaposing two
+VMS-syntax directories when MM[SK] is run. Also expands expressions which
+are all macro, so that we can tell how long the expansion is, and avoid
+overrunning DCL's command buffer when MM[KS] is running.
+
+If optional second argument has a TRUE value, then the return string is
+a VMS-syntax directory specification, if it is FALSE, the return string
+is a VMS-syntax file specification, and if it is not specified, fixpath()
+checks to see whether it matches the name of a directory in the current
+default directory, and returns a directory or file specification accordingly.
+
+=cut
+
+sub fixpath {
+ my($self,$path,$force_path) = @_;
+ return '' unless $path;
+ $self = bless {} unless ref $self;
+ my($fixedpath,$prefix,$name);
+
+ if ($path =~ m#^\$\([^\)]+\)\z#s || $path =~ m#[/:>\]]#) {
+ if ($force_path or $path =~ /(?:DIR\)|\])\z/) {
+ $fixedpath = vmspath($self->eliminate_macros($path));
+ }
+ else {
+ $fixedpath = vmsify($self->eliminate_macros($path));
+ }
+ }
+ elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
+ my($vmspre) = $self->eliminate_macros("\$($prefix)");
+ # is it a dir or just a name?
+ $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\z/) ? vmspath($vmspre) : '';
+ $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ else {
+ $fixedpath = $path;
+ $fixedpath = vmspath($fixedpath) if $force_path;
+ }
+ # No hints, so we try to guess
+ if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
+ $fixedpath = vmspath($fixedpath) if -d $fixedpath;
+ }
+
+ # Trim off root dirname if it's had other dirs inserted in front of it.
+ $fixedpath =~ s/\.000000([\]>])/$1/;
+ # Special case for VMS absolute directory specs: these will have had device
+ # prepended during trip through Unix syntax in eliminate_macros(), since
+ # Unix syntax has no way to express "absolute from the top of this device's
+ # directory tree".
+ if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
+ $fixedpath;
+}
+
+=back
+
=head2 Methods always loaded
=over
+=item canonpath (override)
+
+Removes redundant portions of file specifications according to VMS syntax.
+
+=cut
+
+sub canonpath {
+ my($self,$path) = @_;
+
+ if ($path =~ m|/|) { # Fake Unix
+ my $pathify = $path =~ m|/\z|;
+ $path = $self->SUPER::canonpath($path);
+ if ($pathify) { return vmspath($path); }
+ else { return vmsify($path); }
+ }
+ else {
+ $path =~ s-\]\[--g; $path =~ s/><//g; # foo.][bar ==> foo.bar
+ $path =~ s/([\[<])000000\./$1/; # [000000.foo ==> foo
+ 1 while $path =~ s{([\[<-])\.-}{$1-}; # [.-.- ==> [--
+ $path =~ s/\.[^\[<\.]+\.-([\]\>])/$1/; # bar.foo.-] ==> bar]
+ $path =~ s/([\[<])(-+)/$1 . "\cx" x length($2)/e; # encode leading '-'s
+ $path =~ s/([\[<\.])([^\[<\.\cx]+)\.-\.?/$1/g; # bar.-.foo ==> foo
+ $path =~ s/([\[<])(\cx+)/$1 . '-' x length($2)/e; # then decode
+ return $path;
+ }
+}
+
=item catdir
Concatenates a list of file specifications, and returns the result as a
-VMS-syntax directory specification.
+VMS-syntax directory specification. No check is made for "impossible"
+cases (e.g. elements other than the first being absolute filespecs).
=cut
sub catdir {
- my($self,@dirs) = @_;
- my($dir) = pop @dirs;
+ my ($self,@dirs) = @_;
+ my $dir = pop @dirs;
@dirs = grep($_,@dirs);
- my($rslt);
+ my $rslt;
if (@dirs) {
- my($path) = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
- my($spath,$sdir) = ($path,$dir);
- $spath =~ s/.dir$//; $sdir =~ s/.dir$//;
- $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+$/;
- $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
+ my $path = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
+ my ($spath,$sdir) = ($path,$dir);
+ $spath =~ s/\.dir\z//; $sdir =~ s/\.dir\z//;
+ $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+\z/s;
+ $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
+
+ # Special case for VMS absolute directory specs: these will have had device
+ # prepended during trip through Unix syntax in eliminate_macros(), since
+ # Unix syntax has no way to express "absolute from the top of this device's
+ # directory tree".
+ if ($spath =~ /^[\[<][^.\-]/s) { $rslt =~ s/^[^\[<]+//s; }
}
- else {
- if ($dir =~ /^\$\([^\)]+\)$/) { $rslt = $dir; }
- else { $rslt = vmspath($dir); }
+ else {
+ if (not defined $dir or not length $dir) { $rslt = ''; }
+ elsif ($dir =~ /^\$\([^\)]+\)\z/s) { $rslt = $dir; }
+ else { $rslt = vmspath($dir); }
}
- print "catdir(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
- $rslt;
+ return $self->canonpath($rslt);
}
=item catfile
Concatenates a list of file specifications, and returns the result as a
-VMS-syntax directory specification.
+VMS-syntax file specification.
=cut
sub catfile {
- my($self,@files) = @_;
- my($file) = pop @files;
+ my ($self,@files) = @_;
+ my $file = pop @files;
@files = grep($_,@files);
- my($rslt);
+ my $rslt;
if (@files) {
- my($path) = (@files == 1 ? $files[0] : $self->catdir(@files));
- my($spath) = $path;
- $spath =~ s/.dir$//;
- if ( $spath =~ /^[^\)\]\/:>]+\)$/ && basename($file) eq $file) { $rslt = "$spath$file"; }
- else {
- $rslt = $self->eliminate_macros($spath);
- $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file));
- }
+ my $path = (@files == 1 ? $files[0] : $self->catdir(@files));
+ my $spath = $path;
+ $spath =~ s/\.dir\z//;
+ if ($spath =~ /^[^\)\]\/:>]+\)\z/s && basename($file) eq $file) {
+ $rslt = "$spath$file";
+ }
+ else {
+ $rslt = $self->eliminate_macros($spath);
+ $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file));
+ }
}
- else { $rslt = vmsify($file); }
- print "catfile(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
- $rslt;
+ else { $rslt = (defined($file) && length($file)) ? vmsify($file) : ''; }
+ return $self->canonpath($rslt);
}
+
=item curdir (override)
-Returns a string representing of the current directory.
+Returns a string representation of the current directory: '[]'
=cut
@@ -97,19 +226,51 @@ sub curdir {
return '[]';
}
+=item devnull (override)
+
+Returns a string representation of the null device: '_NLA0:'
+
+=cut
+
+sub devnull {
+ return "_NLA0:";
+}
+
=item rootdir (override)
-Returns a string representing of the root directory.
+Returns a string representation of the root directory: 'SYS$DISK:[000000]'
=cut
sub rootdir {
- return '';
+ return 'SYS$DISK:[000000]';
+}
+
+=item tmpdir (override)
+
+Returns a string representation of the first writable directory
+from the following list or '' if none are writable:
+
+ sys$scratch
+ $ENV{TMPDIR}
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ foreach ('sys$scratch', $ENV{TMPDIR}) {
+ next unless defined && -d && -w _;
+ $tmpdir = $_;
+ last;
+ }
+ $tmpdir = '' unless defined $tmpdir;
+ return $tmpdir;
}
=item updir (override)
-Returns a string representing of the parent directory.
+Returns a string representation of the parent directory: '[-]'
=cut
@@ -117,6 +278,16 @@ sub updir {
return '[-]';
}
+=item case_tolerant (override)
+
+VMS file specification syntax is case-tolerant.
+
+=cut
+
+sub case_tolerant {
+ return 1;
+}
+
=item path (override)
Translate logical name DCL$PATH as a searchlist, rather than trying
@@ -125,9 +296,9 @@ to C<split> string value of C<$ENV{'PATH'}>.
=cut
sub path {
- my(@dirs,$dir,$i);
+ my (@dirs,$dir,$i);
while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
- @dirs;
+ return @dirs;
}
=item file_name_is_absolute (override)
@@ -137,12 +308,185 @@ Checks for VMS directory spec as well as Unix separators.
=cut
sub file_name_is_absolute {
- my($self,$file) = @_;
+ my ($self,$file) = @_;
# If it's a logical name, expand it.
- $file = $ENV{$file} while $file =~ /^[\w\$\-]+$/ and $ENV{$file};
- $file =~ m!^/! or $file =~ m![<\[][^.\-\]>]! or $file =~ /:[^<\[]/;
+ $file = $ENV{$file} while $file =~ /^[\w\$\-]+\z/s && $ENV{$file};
+ return scalar($file =~ m!^/!s ||
+ $file =~ m![<\[][^.\-\]>]! ||
+ $file =~ /:[^<\[]/);
}
-1;
-__END__
+=item splitpath (override)
+
+Splits using VMS syntax.
+
+=cut
+
+sub splitpath {
+ my($self,$path) = @_;
+ my($dev,$dir,$file) = ('','','');
+
+ vmsify($path) =~ /(.+:)?([\[<].*[\]>])?(.*)/s;
+ return ($1 || '',$2 || '',$3);
+}
+
+=item splitdir (override)
+
+Split dirspec using VMS syntax.
+
+=cut
+
+sub splitdir {
+ my($self,$dirspec) = @_;
+ $dirspec =~ s/\]\[//g; $dirspec =~ s/\-\-/-.-/g;
+ $dirspec = "[$dirspec]" unless $dirspec =~ /[\[<]/; # make legal
+ my(@dirs) = split('\.', vmspath($dirspec));
+ $dirs[0] =~ s/^[\[<]//s; $dirs[-1] =~ s/[\]>]\z//s;
+ @dirs;
+}
+
+
+=item catpath (override)
+
+Construct a complete filespec using VMS syntax
+
+=cut
+
+sub catpath {
+ my($self,$dev,$dir,$file) = @_;
+ if ($dev =~ m|^/+([^/]+)|) { $dev = "$1:"; }
+ else { $dev .= ':' unless $dev eq '' or $dev =~ /:\z/; }
+ if (length($dev) or length($dir)) {
+ $dir = "[$dir]" unless $dir =~ /[\[<\/]/;
+ $dir = vmspath($dir);
+ }
+ "$dev$dir$file";
+}
+
+=item abs2rel (override)
+
+Use VMS syntax when converting filespecs.
+
+=cut
+
+sub abs2rel {
+ my $self = shift;
+
+ return vmspath(File::Spec::Unix::abs2rel( $self, @_ ))
+ if ( join( '', @_ ) =~ m{/} ) ;
+
+ my($path,$base) = @_;
+
+ # Note: we use '/' to glue things together here, then let canonpath()
+ # clean them up at the end.
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ }
+ else {
+ $path = $self->canonpath( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Split up paths
+ my ( undef, $path_directories, $path_file ) =
+ $self->splitpath( $path, 1 ) ;
+
+ $path_directories = $1
+ if $path_directories =~ /^\[(.*)\]\z/s ;
+
+ my ( undef, $base_directories, undef ) =
+ $self->splitpath( $base, 1 ) ;
+
+ $base_directories = $1
+ if $base_directories =~ /^\[(.*)\]\z/s ;
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my @basechunks = $self->splitdir( $base_directories );
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] )
+ ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # @basechunks now contains the directories to climb out of,
+ # @pathchunks now has the directories to descend in to.
+ $path_directories = '-.' x @basechunks . join( '.', @pathchunks ) ;
+ $path_directories =~ s{\.\z}{} ;
+ return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ;
+}
+
+
+=item rel2abs (override)
+
+Use VMS syntax when converting filespecs.
+
+=cut
+
+sub rel2abs($;$;) {
+ my $self = shift ;
+ return vmspath(File::Spec::Unix::rel2abs( $self, @_ ))
+ if ( join( '', @_ ) =~ m{/} ) ;
+
+ my ($path,$base ) = @_;
+ # Clean up and split up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ # Figure out the effective $base and clean it up.
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Split up paths
+ my ( undef, $path_directories, $path_file ) =
+ $self->splitpath( $path ) ;
+
+ my ( $base_volume, $base_directories, undef ) =
+ $self->splitpath( $base ) ;
+
+ $path_directories = '' if $path_directories eq '[]' ||
+ $path_directories eq '<>';
+ my $sep = '' ;
+ $sep = '.'
+ if ( $base_directories =~ m{[^.\]>]\z} &&
+ $path_directories =~ m{^[^.\[<]}s
+ ) ;
+ $base_directories = "$base_directories$sep$path_directories";
+ $base_directories =~ s{\.?[\]>][\[<]\.?}{.};
+
+ $path = $self->catpath( $base_volume, $base_directories, $path_file );
+ }
+
+ return $self->canonpath( $path ) ;
+}
+
+
+=back
+
+=head1 SEE ALSO
+
+L<File::Spec>
+
+=cut
+
+1;
diff --git a/contrib/perl5/lib/File/Spec/Win32.pm b/contrib/perl5/lib/File/Spec/Win32.pm
index 034a0cb..aa95fbd 100644
--- a/contrib/perl5/lib/File/Spec/Win32.pm
+++ b/contrib/perl5/lib/File/Spec/Win32.pm
@@ -1,12 +1,18 @@
package File::Spec::Win32;
+use strict;
+use Cwd;
+use vars qw(@ISA);
+require File::Spec::Unix;
+@ISA = qw(File::Spec::Unix);
+
=head1 NAME
File::Spec::Win32 - methods for Win32 file specs
=head1 SYNOPSIS
- use File::Spec::Win32; # Done internally by File::Spec if needed
+ require File::Spec::Win32; # Done internally by File::Spec if needed
=head1 DESCRIPTION
@@ -16,37 +22,50 @@ the semantics.
=over
-=cut
+=item devnull
-#use Config;
-#use Cwd;
-use File::Basename;
-require Exporter;
-use strict;
+Returns a string representation of the null device.
-use vars qw(@ISA);
+=cut
-use File::Spec;
-Exporter::import('File::Spec', qw( $Verbose));
+sub devnull {
+ return "nul";
+}
-@ISA = qw(File::Spec::Unix);
+=item tmpdir
-$ENV{EMXSHELL} = 'sh'; # to run `commands`
+Returns a string representation of the first existing directory
+from the following list:
-sub file_name_is_absolute {
- my($self,$file) = @_;
- $file =~ m{^([a-z]:)?[\\/]}i ;
-}
+ $ENV{TMPDIR}
+ $ENV{TEMP}
+ $ENV{TMP}
+ /tmp
+ /
-sub catdir {
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
my $self = shift;
- my @args = @_;
- for (@args) {
- # append a slash to each argument unless it has one there
- $_ .= "\\" if $_ eq '' or substr($_,-1) ne "\\";
+ foreach (@ENV{qw(TMPDIR TEMP TMP)}, qw(/tmp /)) {
+ next unless defined && -d;
+ $tmpdir = $_;
+ last;
}
- my $result = $self->canonpath(join('', @args));
- $result;
+ $tmpdir = '' unless defined $tmpdir;
+ $tmpdir = $self->canonpath($tmpdir);
+ return $tmpdir;
+}
+
+sub case_tolerant {
+ return 1;
+}
+
+sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return scalar($file =~ m{^([a-z]:)?[\\/]}is);
}
=item catfile
@@ -57,22 +76,19 @@ complete path ending with a filename
=cut
sub catfile {
- my $self = shift @_;
+ my $self = shift;
my $file = pop @_;
return $file unless @_;
my $dir = $self->catdir(@_);
- $dir =~ s/(\\\.)$//;
- $dir .= "\\" unless substr($dir,length($dir)-1,1) eq "\\";
+ $dir .= "\\" unless substr($dir,-1) eq "\\";
return $dir.$file;
}
sub path {
- local $^W = 1;
- my($self) = @_;
my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
my @path = split(';',$path);
- foreach(@path) { $_ = '.' if $_ eq '' }
- @path;
+ foreach (@path) { $_ = '.' if $_ eq '' }
+ return @path;
}
=item canonpath
@@ -83,22 +99,307 @@ path. On UNIX eliminated successive slashes and successive "/.".
=cut
sub canonpath {
- my($self,$path) = @_;
- $path =~ s/^([a-z]:)/\u$1/;
+ my ($self,$path) = @_;
+ $path =~ s/^([a-z]:)/\u$1/s;
$path =~ s|/|\\|g;
- $path =~ s|\\+|\\|g ; # xx////xx -> xx/xx
- $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx
- $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx
- $path =~ s|\\$||
- unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx
- $path .= '.' if $path =~ m#\\$#;
- $path;
+ $path =~ s|([^\\])\\+|$1\\|g; # xx////xx -> xx/xx
+ $path =~ s|(\\\.)+\\|\\|g; # xx/././xx -> xx/xx
+ $path =~ s|^(\.\\)+||s unless $path eq ".\\"; # ./xx -> xx
+ $path =~ s|\\\z||
+ unless $path =~ m#^([A-Z]:)?\\\z#s; # xx/ -> xx
+ return $path;
}
-1;
-__END__
+=item splitpath
+
+ ($volume,$directories,$file) = File::Spec->splitpath( $path );
+ ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
+
+Splits a path in to volume, directory, and filename portions. Assumes that
+the last file is a path unless the path ends in '\\', '\\.', '\\..'
+or $no_file is true. On Win32 this means that $no_file true makes this return
+( $volume, $path, undef ).
+
+Separators accepted are \ and /.
+
+Volumes can be drive letters or UNC sharenames (\\server\share).
+
+The results can be passed to L</catpath> to get back a path equivalent to
+(usually identical to) the original path.
+
+=cut
+
+sub splitpath {
+ my ($self,$path, $nofile) = @_;
+ my ($volume,$directory,$file) = ('','','');
+ if ( $nofile ) {
+ $path =~
+ m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? )
+ (.*)
+ }xs;
+ $volume = $1;
+ $directory = $2;
+ }
+ else {
+ $path =~
+ m{^ ( (?: [a-zA-Z]: |
+ (?:\\\\|//)[^\\/]+[\\/][^\\/]+
+ )?
+ )
+ ( (?:.*[\\\\/](?:\.\.?\z)?)? )
+ (.*)
+ }xs;
+ $volume = $1;
+ $directory = $2;
+ $file = $3;
+ }
+
+ return ($volume,$directory,$file);
+}
+
+
+=item splitdir
+
+The opposite of L</catdir()>.
+
+ @dirs = File::Spec->splitdir( $directories );
+
+$directories must be only the directory portion of the path on systems
+that have the concept of a volume or that have path syntax that differentiates
+files from directories.
+
+Unlike just splitting the directories on the separator, leading empty and
+trailing directory entries can be returned, because these are significant
+on some OSs. So,
+
+ File::Spec->splitdir( "/a/b/c" );
+
+Yields:
+
+ ( '', 'a', 'b', '', 'c', '' )
+
+=cut
+
+sub splitdir {
+ my ($self,$directories) = @_ ;
+ #
+ # split() likes to forget about trailing null fields, so here we
+ # check to be sure that there will not be any before handling the
+ # simple case.
+ #
+ if ( $directories !~ m|[\\/]\z| ) {
+ return split( m|[\\/]|, $directories );
+ }
+ else {
+ #
+ # since there was a trailing separator, add a file name to the end,
+ # then do the split, then replace it with ''.
+ #
+ my( @directories )= split( m|[\\/]|, "${directories}dummy" ) ;
+ $directories[ $#directories ]= '' ;
+ return @directories ;
+ }
+}
+
+
+=item catpath
+
+Takes volume, directory and file portions and returns an entire path. Under
+Unix, $volume is ignored, and this is just like catfile(). On other OSs,
+the $volume become significant.
+
+=cut
+
+sub catpath {
+ my ($self,$volume,$directory,$file) = @_;
+
+ # If it's UNC, make sure the glue separator is there, reusing
+ # whatever separator is first in the $volume
+ $volume .= $1
+ if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\z@s &&
+ $directory =~ m@^[^\\/]@s
+ ) ;
+
+ $volume .= $directory ;
+
+ # If the volume is not just A:, make sure the glue separator is
+ # there, reusing whatever separator is first in the $volume if possible.
+ if ( $volume !~ m@^[a-zA-Z]:\z@s &&
+ $volume =~ m@[^\\/]\z@ &&
+ $file =~ m@[^\\/]@
+ ) {
+ $volume =~ m@([\\/])@ ;
+ my $sep = $1 ? $1 : '\\' ;
+ $volume .= $sep ;
+ }
+
+ $volume .= $file ;
+
+ return $volume ;
+}
+
+
+=item abs2rel
+
+Takes a destination path and an optional base path returns a relative path
+from the base path to the destination path:
+
+ $rel_path = File::Spec->abs2rel( $destination ) ;
+ $rel_path = File::Spec->abs2rel( $destination, $base ) ;
+
+If $base is not present or '', then L</cwd()> is used. If $base is relative,
+then it is converted to absolute form using L</rel2abs()>. This means that it
+is taken to be relative to L<cwd()>.
+
+On systems with the concept of a volume, this assumes that both paths
+are on the $destination volume, and ignores the $base volume.
+
+On systems that have a grammar that indicates filenames, this ignores the
+$base filename as well. Otherwise all path components are assumed to be
+directories.
+
+If $path is relative, it is converted to absolute form using L</rel2abs()>.
+This means that it is taken to be relative to L</cwd()>.
+
+Based on code written by Shigio Yamaguchi.
+
+No checks against the filesystem are made.
+
+=cut
+
+sub abs2rel {
+ my($self,$path,$base) = @_;
+
+ # Clean up $path
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+ $path = $self->rel2abs( $path ) ;
+ }
+ else {
+ $path = $self->canonpath( $path ) ;
+ }
+
+ # Figure out the effective $base and clean it up.
+ if ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ elsif ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ # Split up paths
+ my ( $path_volume, $path_directories, $path_file ) =
+ $self->splitpath( $path, 1 ) ;
+
+ my ( undef, $base_directories, undef ) =
+ $self->splitpath( $base, 1 ) ;
+
+ # Now, remove all leading components that are the same
+ my @pathchunks = $self->splitdir( $path_directories );
+ my @basechunks = $self->splitdir( $base_directories );
+
+ while ( @pathchunks &&
+ @basechunks &&
+ lc( $pathchunks[0] ) eq lc( $basechunks[0] )
+ ) {
+ shift @pathchunks ;
+ shift @basechunks ;
+ }
+
+ # No need to catdir, we know these are well formed.
+ $path_directories = CORE::join( '\\', @pathchunks );
+ $base_directories = CORE::join( '\\', @basechunks );
+
+ # $base_directories now contains the directories the resulting relative
+ # path must ascend out of before it can descend to $path_directory. So,
+ # replace all names with $parentDir
+
+ #FA Need to replace between backslashes...
+ $base_directories =~ s|[^\\]+|..|g ;
+
+ # Glue the two together, using a separator if necessary, and preventing an
+ # empty result.
+
+ #FA Must check that new directories are not empty.
+ if ( $path_directories ne '' && $base_directories ne '' ) {
+ $path_directories = "$base_directories\\$path_directories" ;
+ } else {
+ $path_directories = "$base_directories$path_directories" ;
+ }
+
+ # It makes no sense to add a relative path to a UNC volume
+ $path_volume = '' unless $path_volume =~ m{^[A-Z]:}is ;
+
+ return $self->canonpath(
+ $self->catpath($path_volume, $path_directories, $path_file )
+ ) ;
+}
+
+=item rel2abs
+
+Converts a relative path to an absolute path.
+
+ $abs_path = File::Spec->rel2abs( $destination ) ;
+ $abs_path = File::Spec->rel2abs( $destination, $base ) ;
+
+If $base is not present or '', then L<cwd()> is used. If $base is relative,
+then it is converted to absolute form using L</rel2abs()>. This means that it
+is taken to be relative to L</cwd()>.
+
+Assumes that both paths are on the $base volume, and ignores the
+$destination volume.
+
+On systems that have a grammar that indicates filenames, this ignores the
+$base filename as well. Otherwise all path components are assumed to be
+directories.
+
+If $path is absolute, it is cleaned up and returned using L</canonpath()>.
+
+Based on code written by Shigio Yamaguchi.
+
+No checks against the filesystem are made.
+
+=cut
+
+sub rel2abs($;$;) {
+ my ($self,$path,$base ) = @_;
+
+ if ( ! $self->file_name_is_absolute( $path ) ) {
+
+ if ( !defined( $base ) || $base eq '' ) {
+ $base = cwd() ;
+ }
+ elsif ( ! $self->file_name_is_absolute( $base ) ) {
+ $base = $self->rel2abs( $base ) ;
+ }
+ else {
+ $base = $self->canonpath( $base ) ;
+ }
+
+ my ( undef, $path_directories, $path_file ) =
+ $self->splitpath( $path, 1 ) ;
+
+ my ( $base_volume, $base_directories, undef ) =
+ $self->splitpath( $base, 1 ) ;
+
+ $path = $self->catpath(
+ $base_volume,
+ $self->catdir( $base_directories, $path_directories ),
+ $path_file
+ ) ;
+ }
+
+ return $self->canonpath( $path ) ;
+}
=back
-=cut
+=head1 SEE ALSO
+
+L<File::Spec>
+=cut
+
+1;
diff --git a/contrib/perl5/lib/File/stat.pm b/contrib/perl5/lib/File/stat.pm
index f5d17f7..0cf7a0b 100644
--- a/contrib/perl5/lib/File/stat.pm
+++ b/contrib/perl5/lib/File/stat.pm
@@ -1,9 +1,11 @@
package File::stat;
use strict;
+use 5.005_64;
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
@EXPORT = qw(stat lstat);
@EXPORT_OK = qw( $st_dev $st_ino $st_mode
$st_nlink $st_uid $st_gid
@@ -13,7 +15,7 @@ BEGIN {
);
%EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
}
-use vars @EXPORT_OK;
+use vars @EXPORT_OK;
# Class::Struct forbids use of @ISA
sub import { goto &Exporter::import }
diff --git a/contrib/perl5/lib/FileHandle.pm b/contrib/perl5/lib/FileHandle.pm
index eec9b61..34c3475 100644
--- a/contrib/perl5/lib/FileHandle.pm
+++ b/contrib/perl5/lib/FileHandle.pm
@@ -1,8 +1,8 @@
package FileHandle;
-use 5.003_11;
+use 5.005_64;
use strict;
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK);
$VERSION = "2.00";
diff --git a/contrib/perl5/lib/FindBin.pm b/contrib/perl5/lib/FindBin.pm
index 9e1c0a0..5d4c575 100644
--- a/contrib/perl5/lib/FindBin.pm
+++ b/contrib/perl5/lib/FindBin.pm
@@ -82,7 +82,7 @@ use File::Spec;
%EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]);
@ISA = qw(Exporter);
-$VERSION = $VERSION = "1.42";
+$VERSION = "1.42";
BEGIN
{
@@ -102,7 +102,7 @@ BEGIN
if ($^O eq 'VMS')
{
- ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*\])(.*)/;
+ ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*\])(.*)/s;
($RealBin,$RealScript) = ($Bin,$Script);
}
else
diff --git a/contrib/perl5/lib/Getopt/Long.pm b/contrib/perl5/lib/Getopt/Long.pm
index c125ccf..f474c7c 100644
--- a/contrib/perl5/lib/Getopt/Long.pm
+++ b/contrib/perl5/lib/Getopt/Long.pm
@@ -2,29 +2,30 @@
package Getopt::Long;
-# RCS Status : $Id: GetoptLong.pl,v 2.18 1998-06-14 15:02:19+02 jv Exp $
+# RCS Status : $Id: GetoptLong.pl,v 2.24 2000-03-14 21:28:52+01 jv Exp $
# Author : Johan Vromans
# Created On : Tue Sep 11 15:00:12 1990
# Last Modified By: Johan Vromans
-# Last Modified On: Fri Jan 8 14:48:43 1999
-# Update Count : 707
+# Last Modified On: Tue Mar 14 21:28:40 2000
+# Update Count : 721
# Status : Released
################ Copyright ################
-# This program is Copyright 1990,1999 by Johan Vromans.
+# This program is Copyright 1990,2000 by Johan Vromans.
# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
+# modify it under the terms of the Perl Artistic License or the
+# GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any
+# later version.
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# If you do not have a copy of the GNU General Public License write to
-# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
# MA 02139, USA.
################ Module Preamble ################
@@ -35,7 +36,7 @@ BEGIN {
require 5.004;
use Exporter ();
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
- $VERSION = "2.19";
+ $VERSION = "2.23";
@ISA = qw(Exporter);
@EXPORT = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER);
@@ -51,14 +52,14 @@ use vars qw($error $debug $major_version $minor_version);
use vars qw($autoabbrev $getopt_compat $ignorecase $bundling $order
$passthrough);
# Official invisible variables.
-use vars qw($genprefix);
+use vars qw($genprefix $caller);
-# Public subroutines.
+# Public subroutines.
sub Configure (@);
sub config (@); # deprecated name
sub GetOptions;
-# Private subroutines.
+# Private subroutines.
sub ConfigDefaults ();
sub FindOption ($$$$$$$);
sub Croak (@); # demand loading the real Croak
@@ -97,8 +98,7 @@ sub ConfigDefaults () {
# Version major/minor numbers.
($major_version, $minor_version) = $VERSION =~ /^(\d+)\.(\d+)/;
-# Set defaults.
-ConfigDefaults ();
+ConfigDefaults();
################ Package return ################
@@ -108,12 +108,12 @@ __END__
################ AutoLoading subroutines ################
-# RCS Status : $Id: GetoptLongAl.pl,v 2.20 1998-06-14 15:02:19+02 jv Exp $
+# RCS Status : $Id: GetoptLongAl.pl,v 2.27 2000-03-17 09:07:26+01 jv Exp $
# Author : Johan Vromans
# Created On : Fri Mar 27 11:50:30 1998
# Last Modified By: Johan Vromans
-# Last Modified On: Sun Jun 14 13:54:35 1998
-# Update Count : 24
+# Last Modified On: Fri Mar 17 09:00:09 2000
+# Update Count : 55
# Status : Released
sub GetOptions {
@@ -122,7 +122,7 @@ sub GetOptions {
my $argend = '--'; # option list terminator
my %opctl = (); # table of arg.specs (long and abbrevs)
my %bopctl = (); # table of arg.specs (bundles)
- my $pkg = (caller)[0]; # current context
+ my $pkg = $caller || (caller)[0]; # current context
# Needed if linkage is omitted.
my %aliases= (); # alias table
my @ret = (); # accum for non-options
@@ -137,7 +137,7 @@ sub GetOptions {
print STDERR ("GetOpt::Long $Getopt::Long::VERSION ",
"called from package \"$pkg\".",
"\n ",
- 'GetOptionsAl $Revision: 2.20 $ ',
+ 'GetOptionsAl $Revision: 2.27 $ ',
"\n ",
"ARGV: (@ARGV)",
"\n ",
@@ -152,9 +152,9 @@ sub GetOptions {
"\n")
if $debug;
- # Check for ref HASH as first argument.
+ # Check for ref HASH as first argument.
# First argument may be an object. It's OK to use this as long
- # as it is really a hash underneath.
+ # as it is really a hash underneath.
$userlinkage = undef;
if ( ref($optionlist[0]) and
"$optionlist[0]" =~ /^(?:.*\=)?HASH\([^\(]*\)$/ ) {
@@ -164,7 +164,11 @@ sub GetOptions {
# See if the first element of the optionlist contains option
# starter characters.
- if ( $optionlist[0] =~ /^\W+$/ ) {
+ # Be careful not to interpret '<>' as option starters.
+ if ( $optionlist[0] =~ /^\W+$/
+ && !($optionlist[0] eq '<>'
+ && @optionlist > 0
+ && ref($optionlist[1])) ) {
$genprefix = shift (@optionlist);
# Turn into regexp. Needs to be parenthesized!
$genprefix =~ s/(\W)/\\$1/g;
@@ -187,7 +191,7 @@ sub GetOptions {
&& ref($userlinkage->{$opt}) ) {
unshift (@optionlist, $userlinkage->{$opt});
}
- unless ( @optionlist > 0
+ unless ( @optionlist > 0
&& ref($optionlist[0]) && ref($optionlist[0]) eq 'CODE' ) {
$error .= "Option spec <> requires a reference to a subroutine\n";
next;
@@ -215,7 +219,7 @@ sub GetOptions {
# Force an alias if the option name is not locase.
$a = $o unless $o eq lc($o);
$o = lc ($o)
- if $ignorecase > 1
+ if $ignorecase > 1
|| ($ignorecase
&& ($bundling ? length($o) > 1 : 1));
@@ -225,17 +229,21 @@ sub GetOptions {
if ( $c eq '!' ) {
$opctl{"no$_"} = $c;
warn ("Ignoring '!' modifier for short option $_\n");
- $c = '';
+ $opctl{$_} = $bopctl{$_} = '';
+ }
+ else {
+ $opctl{$_} = $bopctl{$_} = $c;
}
- $opctl{$_} = $bopctl{$_} = $c;
}
else {
$_ = lc ($_) if $ignorecase;
if ( $c eq '!' ) {
$opctl{"no$_"} = $c;
- $c = '';
+ $opctl{$_} = ''
+ }
+ else {
+ $opctl{$_} = $c;
}
- $opctl{$_} = $c;
}
if ( defined $a ) {
# Note alias.
@@ -278,7 +286,7 @@ sub GetOptions {
$opctl{$o} .= '@'
if $opctl{$o} ne '' and $opctl{$o} !~ /\@$/;
$bopctl{$o} .= '@'
- if $bundling and defined $bopctl{$o} and
+ if $bundling and defined $bopctl{$o} and
$bopctl{$o} ne '' and $bopctl{$o} !~ /\@$/;
}
elsif ( ref($optionlist[0]) =~ /^(HASH)$/ ) {
@@ -286,7 +294,7 @@ sub GetOptions {
$opctl{$o} .= '%'
if $opctl{$o} ne '' and $opctl{$o} !~ /\%$/;
$bopctl{$o} .= '%'
- if $bundling and defined $bopctl{$o} and
+ if $bundling and defined $bopctl{$o} and
$bopctl{$o} ne '' and $bopctl{$o} !~ /\%$/;
}
else {
@@ -339,7 +347,8 @@ sub GetOptions {
}
# Process argument list
- while ( @ARGV > 0 ) {
+ my $goon = 1;
+ while ( $goon && @ARGV > 0 ) {
#### Get next argument ####
@@ -351,7 +360,7 @@ sub GetOptions {
# Double dash is option list terminator.
if ( $opt eq $argend ) {
# Finish. Push back accumulated arguments and return.
- unshift (@ARGV, @ret)
+ unshift (@ARGV, @ret)
if $order == $PERMUTE;
return ($error == 0);
}
@@ -359,16 +368,16 @@ sub GetOptions {
my $tryopt = $opt;
my $found; # success status
my $dsttype; # destination type ('@' or '%')
- my $incr; # destination increment
+ my $incr; # destination increment
my $key; # key (if hash type)
my $arg; # option argument
- ($found, $opt, $arg, $dsttype, $incr, $key) =
- FindOption ($genprefix, $argend, $opt,
+ ($found, $opt, $arg, $dsttype, $incr, $key) =
+ FindOption ($genprefix, $argend, $opt,
\%opctl, \%bopctl, \@opctl, \%aliases);
if ( $found ) {
-
+
# FindOption undefines $opt in case of errors.
next unless defined $opt;
@@ -409,7 +418,20 @@ sub GetOptions {
elsif ( ref($linkage{$opt}) eq 'CODE' ) {
print STDERR ("=> &L{$opt}(\"$opt\", \"$arg\")\n")
if $debug;
- &{$linkage{$opt}}($opt, $arg);
+ local ($@);
+ eval {
+ &{$linkage{$opt}}($opt, $arg);
+ };
+ print STDERR ("=> die($@)\n") if $debug && $@ ne '';
+ if ( $@ =~ /^!/ ) {
+ if ( $@ =~ /^!FINISH\b/ ) {
+ $goon = 0;
+ }
+ }
+ elsif ( $@ ne '' ) {
+ warn ($@);
+ $error++;
+ }
}
else {
print STDERR ("Invalid REF type \"", ref($linkage{$opt}),
@@ -466,7 +488,20 @@ sub GetOptions {
# Try non-options call-back.
my $cb;
if ( (defined ($cb = $linkage{'<>'})) ) {
- &$cb ($tryopt);
+ local ($@);
+ eval {
+ &$cb ($tryopt);
+ };
+ print STDERR ("=> die($@)\n") if $debug && $@ ne '';
+ if ( $@ =~ /^!/ ) {
+ if ( $@ =~ /^!FINISH\b/ ) {
+ $goon = 0;
+ }
+ }
+ elsif ( $@ ne '' ) {
+ warn ($@);
+ $error++;
+ }
}
else {
print STDERR ("=> saving \"$tryopt\" ",
@@ -523,7 +558,7 @@ sub FindOption ($$$$$$$) {
&& $opt =~ /^([^=]+)=(.*)$/s ) {
$opt = $1;
$optarg = $2;
- print STDERR ("=> option \"", $opt,
+ print STDERR ("=> option \"", $opt,
"\", optarg = \"$optarg\"\n") if $debug;
}
@@ -554,7 +589,7 @@ sub FindOption ($$$$$$$) {
$tryopt .= $rest;
undef $rest;
}
- }
+ }
# Try auto-abbreviation.
elsif ( $autoabbrev ) {
@@ -640,7 +675,7 @@ sub FindOption ($$$$$$$) {
($mand, $type, $dsttype, $key) = $type =~ /^(.)(.)([@%]?)$/;
# Check if there is an option argument available.
- if ( defined $optarg ? ($optarg eq '')
+ if ( defined $optarg ? ($optarg eq '')
: !(defined $rest || @ARGV > 0) ) {
# Complain if this option needs an argument.
if ( $mand eq "=" ) {
@@ -662,17 +697,17 @@ sub FindOption ($$$$$$$) {
# Get key if this is a "name=value" pair for a hash option.
$key = undef;
if ($dsttype eq '%' && defined $arg) {
- ($key, $arg) = ($arg =~ /^(.*)=(.*)$/s) ? ($1, $2) : ($arg, 1);
+ ($key, $arg) = ($arg =~ /^([^=]*)=(.*)$/s) ? ($1, $2) : ($arg, 1);
}
#### Check if the argument is valid for this option ####
if ( $type eq "s" ) { # string
- # A mandatory string takes anything.
+ # A mandatory string takes anything.
return (1, $opt,$arg,$dsttype,$incr,$key) if $mand eq "=";
- # An optional string takes almost anything.
- return (1, $opt,$arg,$dsttype,$incr,$key)
+ # An optional string takes almost anything.
+ return (1, $opt,$arg,$dsttype,$incr,$key)
if defined $optarg || defined $rest;
return (1, $opt,$arg,$dsttype,$incr,$key) if $arg eq "-"; # ??
@@ -687,12 +722,12 @@ sub FindOption ($$$$$$$) {
}
elsif ( $type eq "n" || $type eq "i" ) { # numeric/integer
- if ( $bundling && defined $rest && $rest =~ /^(-?[0-9]+)(.*)$/s ) {
+ if ( $bundling && defined $rest && $rest =~ /^([-+]?[0-9]+)(.*)$/s ) {
$arg = $1;
$rest = $2;
unshift (@ARGV, $starter.$rest) if defined $rest && $rest ne '';
}
- elsif ( $arg !~ /^-?[0-9]+$/ ) {
+ elsif ( $arg !~ /^[-+]?[0-9]+$/ ) {
if ( defined $optarg || $mand eq "=" ) {
if ( $passthrough ) {
unshift (@ARGV, defined $rest ? $starter.$rest : $arg)
@@ -720,12 +755,12 @@ sub FindOption ($$$$$$$) {
# and at least one digit following the point and 'e'.
# [-]NN[.NN][eNN]
if ( $bundling && defined $rest &&
- $rest =~ /^(-?[0-9]+(\.[0-9]+)?([eE]-?[0-9]+)?)(.*)$/s ) {
+ $rest =~ /^([-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)?)(.*)$/s ) {
$arg = $1;
$rest = $+;
unshift (@ARGV, $starter.$rest) if defined $rest && $rest ne '';
}
- elsif ( $arg !~ /^-?[0-9.]+(\.[0-9]+)?([eE]-?[0-9]+)?$/ ) {
+ elsif ( $arg !~ /^[-+]?[0-9.]+(\.[0-9]+)?([eE][-+]?[0-9]+)?$/ ) {
if ( defined $optarg || $mand eq "=" ) {
if ( $passthrough ) {
unshift (@ARGV, defined $rest ? $starter.$rest : $arg)
@@ -756,6 +791,18 @@ sub FindOption ($$$$$$$) {
# Getopt::Long Configuration.
sub Configure (@) {
my (@options) = @_;
+
+ my $prevconfig =
+ [ $error, $debug, $major_version, $minor_version,
+ $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
+ $passthrough, $genprefix ];
+
+ if ( ref($options[0]) eq 'ARRAY' ) {
+ ( $error, $debug, $major_version, $minor_version,
+ $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
+ $passthrough, $genprefix ) = @{shift(@options)};
+ }
+
my $opt;
foreach $opt ( @options ) {
my $try = lc ($opt);
@@ -804,7 +851,7 @@ sub Configure (@) {
elsif ( $try =~ /^prefix_pattern=(.+)$/ ) {
$genprefix = $1;
# Parenthesize if needed.
- $genprefix = "(" . $genprefix . ")"
+ $genprefix = "(" . $genprefix . ")"
unless $genprefix =~ /^\(.*\)$/;
eval { '' =~ /$genprefix/; };
Croak ("Getopt::Long: invalid pattern \"$genprefix\"") if $@;
@@ -816,6 +863,7 @@ sub Configure (@) {
Croak ("Getopt::Long: unknown config parameter \"$opt\"")
}
}
+ $prevconfig;
}
# Deprecated name.
@@ -834,7 +882,7 @@ sub Croak (@) {
=head1 NAME
-GetOptions - extended processing of command line options
+Getopt::Long - Extended processing of command line options
=head1 SYNOPSIS
@@ -849,350 +897,548 @@ line options, with GNU extensions. In general, this means that options
have long names instead of single letters, and are introduced with a
double dash "--". Support for bundling of command line options, as was
the case with the more traditional single-letter approach, is provided
-but not enabled by default. For example, the UNIX "ps" command can be
-given the command line "option"
+but not enabled by default.
+
+=head1 Command Line Options, an Introduction
+
+Command line operated programs traditionally take their arguments from
+the command line, for example filenames or other information that the
+program needs to know. Besides arguments, these programs often take
+command line I<options> as well. Options are not necessary for the
+program to work, hence the name 'option', but are used to modify its
+default behaviour. For example, a program could do its job quietly,
+but with a suitable option it could provide verbose information about
+what it did.
+
+Command line options come in several flavours. Historically, they are
+preceded by a single dash C<->, and consist of a single letter.
+
+ -l -a -c
+
+Usually, these single-character options can be bundled:
+
+ -lac
+
+Options can have values, the value is placed after the option
+character. Sometimes with whitespace in between, sometimes not:
+
+ -s 24 -s24
+
+Due to the very cryptic nature of these options, another style was
+developed that used long names. So instead of a cryptic C<-l> one
+could use the more descriptive C<--long>. To distinguish between a
+bundle of single-character options and a long one, two dashes are used
+to precede the option name. Early implementations of long options used
+a plus C<+> instead. Also, option values could be specified either
+like
+
+ --size=24
+
+or
+
+ --size 24
+
+The C<+> form is now obsolete and strongly deprecated.
+
+=head1 Getting Started with Getopt::Long
+
+Getopt::Long is the Perl5 successor of C<newgetopt.pl>. This was
+the firs Perl module that provided support for handling the new style
+of command line options, hence the name Getopt::Long. This module
+also supports single-character options and bundling. In this case, the
+options are restricted to alphabetic characters only, and the
+characters C<?> and C<->.
+
+To use Getopt::Long from a Perl program, you must include the
+following line in your Perl program:
+
+ use Getopt::Long;
+
+This will load the core of the Getopt::Long module and prepare your
+program for using it. Most of the actual Getopt::Long code is not
+loaded until you really call one of its functions.
+
+In the default configuration, options names may be abbreviated to
+uniqueness, case does not matter, and a single dash is sufficient,
+even for long option names. Also, options may be placed between
+non-option arguments. See L<Configuring Getopt::Long> for more
+details on how to configure Getopt::Long.
+
+=head2 Simple options
+
+The most simple options are the ones that take no values. Their mere
+presence on the command line enables the option. Popular examples are:
+
+ --all --verbose --quiet --debug
+
+Handling simple options is straightforward:
+
+ my $verbose = ''; # option variable with default value (false)
+ my $all = ''; # option variable with default value (false)
+ GetOptions ('verbose' => \$verbose, 'all' => \$all);
+
+The call to GetOptions() parses the command line arguments that are
+present in C<@ARGV> and sets the option variable to the value C<1> if
+the option did occur on the command line. Otherwise, the option
+variable is not touched. Setting the option value to true is often
+called I<enabling> the option.
+
+The option name as specified to the GetOptions() function is called
+the option I<specification>. Later we'll see that this specification
+can contain more than just the option name. The reference to the
+variable is called the option I<destination>.
+
+GetOptions() will return a true value if the command line could be
+processed successfully. Otherwise, it will write error messages to
+STDERR, and return a false result.
+
+=head2 A little bit less simple options
+
+Getopt::Long supports two useful variants of simple options:
+I<negatable> options and I<incremental> options.
+
+A negatable option is specified with a exclamation mark C<!> after the
+option name:
+
+ my $verbose = ''; # option variable with default value (false)
+ GetOptions ('verbose!' => \$verbose);
+
+Now, using C<--verbose> on the command line will enable C<$verbose>,
+as expected. But it is also allowed to use C<--noverbose>, which will
+disable C<$verbose> by setting its value to C<0>. Using a suitable
+default value, the program can find out whether C<$verbose> is false
+by default, or disabled by using C<--noverbose>.
+
+An incremental option is specified with a plus C<+> after the
+option name:
+
+ my $verbose = ''; # option variable with default value (false)
+ GetOptions ('verbose+' => \$verbose);
+
+Using C<--verbose> on the command line will increment the value of
+C<$verbose>. This way the program can keep track of how many times the
+option occurred on the command line. For example, each occurrence of
+C<--verbose> could increase the verbosity level of the program.
+
+=head2 Mixing command line option with other arguments
+
+Usually programs take command line options as well as other arguments,
+for example, file names. It is good practice to always specify the
+options first, and the other arguments last. Getopt::Long will,
+however, allow the options and arguments to be mixed and 'filter out'
+all the options before passing the rest of the arguments to the
+program. To stop Getopt::Long from processing further arguments,
+insert a double dash C<--> on the command line:
+
+ --size 24 -- --all
+
+In this example, C<--all> will I<not> be treated as an option, but
+passed to the program unharmed, in C<@ARGV>.
+
+=head2 Options with values
+
+For options that take values it must be specified whether the option
+value is required or not, and what kind of value the option expects.
+
+Three kinds of values are supported: integer numbers, floating point
+numbers, and strings.
+
+If the option value is required, Getopt::Long will take the
+command line argument that follows the option and assign this to the
+option variable. If, however, the option value is specified as
+optional, this will only be done if that value does not look like a
+valid command line option itself.
+
+ my $tag = ''; # option variable with default value
+ GetOptions ('tag=s' => \$tag);
+
+In the option specification, the option name is followed by an equals
+sign C<=> and the letter C<s>. The equals sign indicates that this
+option requires a value. The letter C<s> indicates that this value is
+an arbitrary string. Other possible value types are C<i> for integer
+values, and C<f> for floating point values. Using a colon C<:> instead
+of the equals sign indicates that the option value is optional. In
+this case, if no suitable value is supplied, string valued options get
+an empty string C<''> assigned, while numeric options are set to C<0>.
+
+=head2 Options with multiple values
+
+Options sometimes take several values. For example, a program could
+use multiple directories to search for library files:
+
+ --library lib/stdlib --library lib/extlib
+
+To accomplish this behaviour, simply specify an array reference as the
+destination for the option:
+
+ my @libfiles = ();
+ GetOptions ("library=s" => \@libfiles);
+
+Used with the example above, C<@libfiles> would contain two strings
+upon completion: C<"lib/srdlib"> and C<"lib/extlib">, in that order.
+It is also possible to specify that only integer or floating point
+numbers are acceptible values.
+
+Often it is useful to allow comma-separated lists of values as well as
+multiple occurrences of the options. This is easy using Perl's split()
+and join() operators:
+
+ my @libfiles = ();
+ GetOptions ("library=s" => \@libfiles);
+ @libfiles = split(/,/,join(',',@libfiles));
+
+Of course, it is important to choose the right separator string for
+each purpose.
+
+=head2 Options with hash values
- -vax
+If the option destination is a reference to a hash, the option will
+take, as value, strings of the form I<key>C<=>I<value>. The value will
+be stored with the specified key in the hash.
-which means the combination of B<-v>, B<-a> and B<-x>. With the new
-syntax B<--vax> would be a single option, probably indicating a
-computer architecture.
+ my %defines = ();
+ GetOptions ("define=s" => \%defines);
-Command line options can be used to set values. These values can be
-specified in one of two ways:
+When used with command line options:
- --size 24
- --size=24
+ --define os=linux --define vendor=redhat
-GetOptions is called with a list of option-descriptions, each of which
-consists of two elements: the option specifier and the option linkage.
-The option specifier defines the name of the option and, optionally,
-the value it can take. The option linkage is usually a reference to a
-variable that will be set when the option is used. For example, the
-following call to GetOptions:
+the hash C<%defines> will contain two keys, C<"os"> with value
+C<"linux> and C<"vendor"> with value C<"redhat">.
+It is also possible to specify that only integer or floating point
+numbers are acceptible values. The keys are always taken to be strings.
- GetOptions("size=i" => \$offset);
+=head2 User-defined subroutines to handle options
-will accept a command line option "size" that must have an integer
-value. With a command line of "--size 24" this will cause the variable
-$offset to get the value 24.
+Ultimate control over what should be done when (actually: each time)
+an option is encountered on the command line can be achieved by
+designating a reference to a subroutine (or an anonymous subroutine)
+as the option destination. When GetOptions() encounters the option, it
+will call the subroutine with two arguments: the name of the option,
+and the value to be assigned. It is up to the subroutine to store the
+value, or do whatever it thinks is appropriate.
-Alternatively, the first argument to GetOptions may be a reference to
-a HASH describing the linkage for the options, or an object whose
-class is based on a HASH. The following call is equivalent to the
-example above:
+A trivial application of this mechanism is to implement options that
+are related to each other. For example:
- %optctl = ("size" => \$offset);
- GetOptions(\%optctl, "size=i");
+ my $verbose = ''; # option variable with default value (false)
+ GetOptions ('verbose' => \$verbose,
+ 'quiet' => sub { $verbose = 0 });
-Linkage may be specified using either of the above methods, or both.
-Linkage specified in the argument list takes precedence over the
-linkage specified in the HASH.
+Here C<--verbose> and C<--quiet> control the same variable
+C<$verbose>, but with opposite values.
-The command line options are taken from array @ARGV. Upon completion
-of GetOptions, @ARGV will contain the rest (i.e. the non-options) of
-the command line.
-
-Each option specifier designates the name of the option, optionally
-followed by an argument specifier.
+If the subroutine needs to signal an error, it should call die() with
+the desired error message as its argument. GetOptions() will catch the
+die(), issue the error message, and record that an error result must
+be returned upon completion.
-Options that do not take arguments will have no argument specifier.
-The option variable will be set to 1 if the option is used.
+If the text of the error message starts with an exclamantion mark C<!>
+it is interpreted specially by GetOptions(). There is currently one
+special command implemented: C<die("!FINISH")> will cause GetOptions()
+to stop processing options, as if it encountered a double dash C<-->.
-For the other options, the values for argument specifiers are:
+=head2 Options with multiple names
-=over 8
+Often it is user friendly to supply alternate mnemonic names for
+options. For example C<--height> could be an alternate name for
+C<--length>. Alternate names can be included in the option
+specification, separated by vertical bar C<|> characters. To implement
+the above example:
+
+ GetOptions ('length|height=f' => \$length);
+
+The first name is called the I<primary> name, the other names are
+called I<aliases>.
+
+Multiple alternate names are possible.
+
+=head2 Case and abbreviations
+
+Without additional configuration, GetOptions() will ignore the case of
+option names, and allow the options to be abbreviated to uniqueness.
+
+ GetOptions ('length|height=f' => \$length, "head" => \$head);
+
+This call will allow C<--l> and C<--L> for the length option, but
+requires a least C<--hea> and C<--hei> for the head and height options.
+
+=head2 Summary of Option Specifications
+
+Each option specifier consists of two parts: the name specification
+and the argument specification.
+
+The name specification contains the name of the option, optionally
+followed by a list of alternative names separated by vertical bar
+characters.
+
+ length option name is "length"
+ length|size|l name is "length", aliases are "size" and "l"
+
+The argument specification is optional. If omitted, the option is
+considered boolean, a value of 1 will be assigned when the option is
+used on the command line.
+
+The argument specification can be
+
+=over
=item !
-Option does not take an argument and may be negated, i.e. prefixed by
-"no". E.g. "foo!" will allow B<--foo> (with value 1) and B<-nofoo>
-(with value 0).
-The option variable will be set to 1, or 0 if negated.
+The option does not take an argument and may be negated, i.e. prefixed
+by "no". E.g. C<"foo!"> will allow C<--foo> (a value of 1 will be
+assigned) and C<--nofoo> (a value of 0 will be assigned). If the
+option has aliases, this applies to the aliases as well.
+
+Using negation on a single letter option when bundling is in effect is
+pointless and will result in a warning.
=item +
-Option does not take an argument and will be incremented by 1 every
-time it appears on the command line. E.g. "more+", when used with
-B<--more --more --more>, will set the option variable to 3 (provided
-it was 0 or undefined at first).
+The option does not take an argument and will be incremented by 1
+every time it appears on the command line. E.g. C<"more+">, when used
+with C<--more --more --more>, will increment the value three times,
+resulting in a value of 3 (provided it was 0 or undefined at first).
+
+The C<+> specifier is ignored if the option destination is not a scalar.
-The B<+> specifier is ignored if the option destination is not a SCALAR.
+=item = I<type> [ I<desttype> ]
-=item =s
+The option requires an argument of the given type. Supported types
+are:
-Option takes a mandatory string argument.
-This string will be assigned to the option variable.
-Note that even if the string argument starts with B<-> or B<-->, it
-will not be considered an option on itself.
+=over
-=item :s
+=item s
-Option takes an optional string argument.
-This string will be assigned to the option variable.
-If omitted, it will be assigned "" (an empty string).
-If the string argument starts with B<-> or B<-->, it
-will be considered an option on itself.
+String. An arbitrary sequence of characters. It is valid for the
+argument to start with C<-> or C<-->.
-=item =i
+=item i
-Option takes a mandatory integer argument.
-This value will be assigned to the option variable.
-Note that the value may start with B<-> to indicate a negative
-value.
+Integer. An optional leading plus or minus sign, followed by a
+sequence of digits.
-=item :i
+=item f
-Option takes an optional integer argument.
-This value will be assigned to the option variable.
-If omitted, the value 0 will be assigned.
-Note that the value may start with B<-> to indicate a negative
-value.
+Real number. For example C<3.14>, C<-6.23E24> and so on.
+
+=back
-=item =f
+The I<desttype> can be C<@> or C<%> to specify that the option is
+list or a hash valued. This is only needed when the destination for
+the option value is not otherwise specified. It should be omitted when
+not needed.
-Option takes a mandatory real number argument.
-This value will be assigned to the option variable.
-Note that the value may start with B<-> to indicate a negative
-value.
+=item : I<type> [ I<desttype> ]
-=item :f
+Like C<=>, but designates the argument as optional.
+If omitted, an empty string will be assigned to string values options,
+and the value zero to numeric options.
-Option takes an optional real number argument.
-This value will be assigned to the option variable.
-If omitted, the value 0 will be assigned.
+Note that if a string argument starts with C<-> or C<-->, it will be
+considered an option on itself.
=back
-A lone dash B<-> is considered an option, the corresponding option
-name is the empty string.
+=head1 Advanced Possibilities
-A double dash on itself B<--> signals end of the options list.
+=head2 Documentation and help texts
-=head2 Linkage specification
+Getopt::Long encourages the use of Pod::Usage to produce help
+messages. For example:
-The linkage specifier is optional. If no linkage is explicitly
-specified but a ref HASH is passed, GetOptions will place the value in
-the HASH. For example:
+ use Getopt::Long;
+ use Pod::Usage;
- %optctl = ();
- GetOptions (\%optctl, "size=i");
+ my $man = 0;
+ my $help = 0;
-will perform the equivalent of the assignment
+ GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+ pod2usage(1) if $help;
+ pod2usage(-exitstatus => 0, -verbose => 2) if $man;
- $optctl{"size"} = 24;
+ __END__
-For array options, a reference to an array is used, e.g.:
+ =head1 NAME
- %optctl = ();
- GetOptions (\%optctl, "sizes=i@");
+ sample - Using GetOpt::Long and Pod::Usage
-with command line "-sizes 24 -sizes 48" will perform the equivalent of
-the assignment
+ =head1 SYNOPSIS
- $optctl{"sizes"} = [24, 48];
+ sample [options] [file ...]
-For hash options (an option whose argument looks like "name=value"),
-a reference to a hash is used, e.g.:
+ Options:
+ -help brief help message
+ -man full documentation
- %optctl = ();
- GetOptions (\%optctl, "define=s%");
+ =head1 OPTIONS
-with command line "--define foo=hello --define bar=world" will perform the
-equivalent of the assignment
+ =over 8
- $optctl{"define"} = {foo=>'hello', bar=>'world')
+ =item B<-help>
-If no linkage is explicitly specified and no ref HASH is passed,
-GetOptions will put the value in a global variable named after the
-option, prefixed by "opt_". To yield a usable Perl variable,
-characters that are not part of the syntax for variables are
-translated to underscores. For example, "--fpp-struct-return" will set
-the variable $opt_fpp_struct_return. Note that this variable resides
-in the namespace of the calling program, not necessarily B<main>.
-For example:
+ Print a brief help message and exits.
- GetOptions ("size=i", "sizes=i@");
+ =item B<-man>
-with command line "-size 10 -sizes 24 -sizes 48" will perform the
-equivalent of the assignments
+ Prints the manual page and exits.
- $opt_size = 10;
- @opt_sizes = (24, 48);
+ =back
-A lone dash B<-> is considered an option, the corresponding Perl
-identifier is $opt_ .
+ =head1 DESCRIPTION
-The linkage specifier can be a reference to a scalar, a reference to
-an array, a reference to a hash or a reference to a subroutine.
+ B<This program> will read the given input file(s) and do someting
+ useful with the contents thereof.
-Note that, if your code is running under the recommended C<use strict
-'vars'> pragma, it may be helpful to declare these package variables
-via C<use vars> perhaps something like this:
+ =cut
- use vars qw/ $opt_size @opt_sizes $opt_bar /;
+See L<Pod::Usage> for details.
-If a REF SCALAR is supplied, the new value is stored in the referenced
-variable. If the option occurs more than once, the previous value is
-overwritten.
+=head2 Storing options in a hash
-If a REF ARRAY is supplied, the new value is appended (pushed) to the
-referenced array.
+Sometimes, for example when there are a lot of options, having a
+separate variable for each of them can be cumbersome. GetOptions()
+supports, as an alternative mechanism, storing options in a hash.
-If a REF HASH is supplied, the option value should look like "key" or
-"key=value" (if the "=value" is omitted then a value of 1 is implied).
-In this case, the element of the referenced hash with the key "key"
-is assigned "value".
+To obtain this, a reference to a hash must be passed I<as the first
+argument> to GetOptions(). For each option that is specified on the
+command line, the option value will be stored in the hash with the
+option name as key. Options that are not actually used on the command
+line will not be put in the hash, on other words,
+C<exists($h{option})> (or defined()) can be used to test if an option
+was used. The drawback is that warnings will be issued if the program
+runs under C<use strict> and uses C<$h{option}> without testing with
+exists() or defined() first.
-If a REF CODE is supplied, the referenced subroutine is called with
-two arguments: the option name and the option value.
-The option name is always the true name, not an abbreviation or alias.
+ my %h = ();
+ GetOptions (\%h, 'length=i'); # will store in $h{length}
-=head2 Aliases and abbreviations
+For options that take list or hash values, it is necessary to indicate
+this by appending an C<@> or C<%> sign after the type:
-The option name may actually be a list of option names, separated by
-"|"s, e.g. "foo|bar|blech=s". In this example, "foo" is the true name
-of this option. If no linkage is specified, options "foo", "bar" and
-"blech" all will set $opt_foo. For convenience, the single character
-"?" is allowed as an alias, e.g. "help|?".
+ GetOptions (\%h, 'colours=s@'); # will push to @{$h{colours}}
-Option names may be abbreviated to uniqueness, depending on
-configuration option B<auto_abbrev>.
+To make things more complicated, the hash may contain references to
+the actual destinations, for example:
-=head2 Non-option call-back routine
+ my $len = 0;
+ my %h = ('length' => \$len);
+ GetOptions (\%h, 'length=i'); # will store in $len
-A special option specifier, E<lt>E<gt>, can be used to designate a subroutine
-to handle non-option arguments. GetOptions will immediately call this
-subroutine for every non-option it encounters in the options list.
-This subroutine gets the name of the non-option passed.
-This feature requires configuration option B<permute>, see section
-CONFIGURATION OPTIONS.
+This example is fully equivalent with:
-See also the examples.
+ my $len = 0;
+ GetOptions ('length=i' => \$len); # will store in $len
-=head2 Option starters
+Any mixture is possible. For example, the most frequently used options
+could be stored in variables while all other options get stored in the
+hash:
-On the command line, options can start with B<-> (traditional), B<-->
-(POSIX) and B<+> (GNU, now being phased out). The latter is not
-allowed if the environment variable B<POSIXLY_CORRECT> has been
-defined.
+ my $verbose = 0; # frequently referred
+ my $debug = 0; # frequently referred
+ my %h = ('verbose' => \$verbose, 'debug' => \$debug);
+ GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i');
+ if ( $verbose ) { ... }
+ if ( exists $h{filter} ) { ... option 'filter' was specified ... }
-Options that start with "--" may have an argument appended, separated
-with an "=", e.g. "--foo=bar".
+=head2 Bundling
-=head2 Return values and Errors
+With bundling it is possible to set several single-character options
+at once. For example if C<a>, C<v> and C<x> are all valid options,
-Configuration errors and errors in the option definitions are
-signalled using C<die()> and will terminate the calling
-program unless the call to C<Getopt::Long::GetOptions()> was embedded
-in C<eval { ... }> or C<die()> was trapped using C<$SIG{__DIE__}>.
+ -vax
-A return value of 1 (true) indicates success.
+would set all three.
-A return status of 0 (false) indicates that the function detected one
-or more errors during option parsing. These errors are signalled using
-C<warn()> and can be trapped with C<$SIG{__WARN__}>.
+Getopt::Long supports two levels of bundling. To enable bundling, a
+call to Getopt::Long::Configure is required.
-Errors that can't happen are signalled using C<Carp::croak()>.
+The first level of bundling can be enabled with:
-=head1 COMPATIBILITY
+ Getopt::Long::Configure ("bundling");
-Getopt::Long::GetOptions() is the successor of
-B<newgetopt.pl> that came with Perl 4. It is fully upward compatible.
-In fact, the Perl 5 version of newgetopt.pl is just a wrapper around
-the module.
+Configured this way, single-character options can be bundled but long
+options B<must> always start with a double dash C<--> to avoid
+abiguity. For example, when C<vax>, C<a>, C<v> and C<x> are all valid
+options,
-If an "@" sign is appended to the argument specifier, the option is
-treated as an array. Value(s) are not set, but pushed into array
-@opt_name. If explicit linkage is supplied, this must be a reference
-to an ARRAY.
+ -vax
-If an "%" sign is appended to the argument specifier, the option is
-treated as a hash. Value(s) of the form "name=value" are set by
-setting the element of the hash %opt_name with key "name" to "value"
-(if the "=value" portion is omitted it defaults to 1). If explicit
-linkage is supplied, this must be a reference to a HASH.
+would set C<a>, C<v> and C<x>, but
-If configuration option B<getopt_compat> is set (see section
-CONFIGURATION OPTIONS), options that start with "+" or "-" may also
-include their arguments, e.g. "+foo=bar". This is for compatiblity
-with older implementations of the GNU "getopt" routine.
+ --vax
-If the first argument to GetOptions is a string consisting of only
-non-alphanumeric characters, it is taken to specify the option starter
-characters. Everything starting with one of these characters from the
-starter will be considered an option. B<Using a starter argument is
-strongly deprecated.>
+would set C<vax>.
-For convenience, option specifiers may have a leading B<-> or B<-->,
-so it is possible to write:
+The second level of bundling lifts this restriction. It can be enabled
+with:
- GetOptions qw(-foo=s --bar=i --ar=s);
+ Getopt::Long::Configure ("bundling_override");
-=head1 EXAMPLES
+Now, C<-vax> would set the option C<vax>.
-If the option specifier is "one:i" (i.e. takes an optional integer
-argument), then the following situations are handled:
+When any level of bundling is enabled, option values may be inserted
+in the bundle. For example:
- -one -two -> $opt_one = '', -two is next option
- -one -2 -> $opt_one = -2
+ -h24w80
-Also, assume specifiers "foo=s" and "bar:s" :
+is equivalent to
- -bar -xxx -> $opt_bar = '', '-xxx' is next option
- -foo -bar -> $opt_foo = '-bar'
- -foo -- -> $opt_foo = '--'
+ -h 24 -w 80
-In GNU or POSIX format, option names and values can be combined:
+When configured for bundling, single-character options are matched
+case sensitive while long options are matched case insensitive. To
+have the single-character options matched case insensitive as well,
+use:
- +foo=blech -> $opt_foo = 'blech'
- --bar= -> $opt_bar = ''
- --bar=-- -> $opt_bar = '--'
+ Getopt::Long::Configure ("bundling", "ignorecase_always");
-Example of using variable references:
+It goes without saying that bundling can be quite confusing.
- $ret = GetOptions ('foo=s', \$foo, 'bar=i', 'ar=s', \@ar);
+=head2 The lonesome dash
-With command line options "-foo blech -bar 24 -ar xx -ar yy"
-this will result in:
+Some applications require the option C<-> (that's a lone dash). This
+can be achieved by adding an option specification with an empty name:
- $foo = 'blech'
- $opt_bar = 24
- @ar = ('xx','yy')
+ GetOptions ('' => \$stdio);
-Example of using the E<lt>E<gt> option specifier:
+A lone dash on the command line will now be legal, and set options
+variable C<$stdio>.
- @ARGV = qw(-foo 1 bar -foo 2 blech);
- GetOptions("foo=i", \$myfoo, "<>", \&mysub);
+=head2 Argument call-back
-Results:
+A special option 'name' C<<>> can be used to designate a subroutine
+to handle non-option arguments. When GetOptions() encounters an
+argument that does not look like an option, it will immediately call this
+subroutine and passes it the argument as a parameter.
- mysub("bar") will be called (with $myfoo being 1)
- mysub("blech") will be called (with $myfoo being 2)
+For example:
-Compare this with:
+ my $width = 80;
+ sub process { ... }
+ GetOptions ('width=i' => \$width, '<>' => \&process);
- @ARGV = qw(-foo 1 bar -foo 2 blech);
- GetOptions("foo=i", \$myfoo);
+When applied to the following command line:
-This will leave the non-options in @ARGV:
+ arg1 --width=72 arg2 --width=60 arg3
- $myfoo -> 2
- @ARGV -> qw(bar blech)
+This will call
+C<process("arg1")> while C<$width> is C<80>,
+C<process("arg2")> while C<$width> is C<72>, and
+C<process("arg3")> while C<$width> is C<60>.
-=head1 CONFIGURATION OPTIONS
+This feature requires configuration option B<permute>, see section
+L<Configuring Getopt::Long>.
-B<GetOptions> can be configured by calling subroutine
-B<Getopt::Long::Configure>. This subroutine takes a list of quoted
-strings, each specifying a configuration option to be set, e.g.
-B<ignore_case>. Options can be reset by prefixing with B<no_>, e.g.
-B<no_ignore_case>. Case does not matter. Multiple calls to B<config>
-are possible.
-Previous versions of Getopt::Long used variables for the purpose of
-configuring. Although manipulating these variables still work, it
-is strongly encouraged to use the new B<config> routine. Besides, it
-is much easier.
+=head1 Configuring Getopt::Long
+
+Getopt::Long can be configured by calling subroutine
+Getopt::Long::Configure(). This subroutine takes a list of quoted
+strings, each specifying a configuration option to be set, e.g.
+C<ignore_case>, or reset, e.g. C<no_ignore_case>. Case does not
+matter. Multiple calls to Configure() are possible.
The following options are available:
@@ -1207,122 +1453,102 @@ default values.
Allow option names to be abbreviated to uniqueness.
Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case B<auto_abbrev> is reset.
+POSIXLY_CORRECT has been set, in which case C<auto_abbrev> is reset.
-=item getopt_compat
+=item getopt_compat
-Allow '+' to start options.
+Allow C<+> to start options.
Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case B<getopt_compat> is reset.
+POSIXLY_CORRECT has been set, in which case C<getopt_compat> is reset.
=item require_order
-Whether non-options are allowed to be mixed with
-options.
+Whether command line arguments are allowed to be mixed with options.
Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case b<require_order> is reset.
+POSIXLY_CORRECT has been set, in which case C<require_order> is reset.
-See also B<permute>, which is the opposite of B<require_order>.
+See also C<permute>, which is the opposite of C<require_order>.
=item permute
-Whether non-options are allowed to be mixed with
-options.
+Whether command line arguments are allowed to be mixed with options.
Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case B<permute> is reset.
-Note that B<permute> is the opposite of B<require_order>.
+POSIXLY_CORRECT has been set, in which case C<permute> is reset.
+Note that C<permute> is the opposite of C<require_order>.
-If B<permute> is set, this means that
+If C<permute> is set, this means that
- -foo arg1 -bar arg2 arg3
+ --foo arg1 --bar arg2 arg3
is equivalent to
- -foo -bar arg1 arg2 arg3
+ --foo --bar arg1 arg2 arg3
-If a non-option call-back routine is specified, @ARGV will always be
-empty upon succesful return of GetOptions since all options have been
-processed, except when B<--> is used:
+If an argument call-back routine is specified, C<@ARGV> will always be
+empty upon succesful return of GetOptions() since all options have been
+processed. The only exception is when C<--> is used:
- -foo arg1 -bar arg2 -- arg3
+ --foo arg1 --bar arg2 -- arg3
will call the call-back routine for arg1 and arg2, and terminate
-leaving arg2 in @ARGV.
+GetOptions() leaving C<"arg2"> in C<@ARGV>.
-If B<require_order> is set, options processing
+If C<require_order> is set, options processing
terminates when the first non-option is encountered.
- -foo arg1 -bar arg2 arg3
+ --foo arg1 --bar arg2 arg3
is equivalent to
- -foo -- arg1 -bar arg2 arg3
+ --foo -- arg1 --bar arg2 arg3
=item bundling (default: reset)
-Setting this variable to a non-zero value will allow single-character
-options to be bundled. To distinguish bundles from long option names,
-long options must be introduced with B<--> and single-character
-options (and bundles) with B<->. For example,
+Setting this option will allow single-character options to be bundled.
+To distinguish bundles from long option names, long options I<must> be
+introduced with C<--> and single-character options (and bundles) with
+C<->.
- ps -vax --vax
-
-would be equivalent to
-
- ps -v -a -x --vax
-
-provided "vax", "v", "a" and "x" have been defined to be valid
-options.
-
-Bundled options can also include a value in the bundle; for strings
-this value is the rest of the bundle, but integer and floating values
-may be combined in the bundle, e.g.
-
- scale -h24w80
-
-is equivalent to
-
- scale -h 24 -w 80
-
-Note: resetting B<bundling> also resets B<bundling_override>.
+Note: resetting C<bundling> also resets C<bundling_override>.
=item bundling_override (default: reset)
-If B<bundling_override> is set, bundling is enabled as with
-B<bundling> but now long option names override option bundles. In the
-above example, B<-vax> would be interpreted as the option "vax", not
-the bundle "v", "a", "x".
+If C<bundling_override> is set, bundling is enabled as with
+C<bundling> but now long option names override option bundles.
-Note: resetting B<bundling_override> also resets B<bundling>.
+Note: resetting C<bundling_override> also resets C<bundling>.
B<Note:> Using option bundling can easily lead to unexpected results,
especially when mixing long options and bundles. Caveat emptor.
=item ignore_case (default: set)
-If set, case is ignored when matching options.
+If set, case is ignored when matching long option names. Single
+character options will be treated case-sensitive.
-Note: resetting B<ignore_case> also resets B<ignore_case_always>.
+Note: resetting C<ignore_case> also resets C<ignore_case_always>.
=item ignore_case_always (default: reset)
When bundling is in effect, case is ignored on single-character
options also.
-Note: resetting B<ignore_case_always> also resets B<ignore_case>.
+Note: resetting C<ignore_case_always> also resets C<ignore_case>.
=item pass_through (default: reset)
-Unknown options are passed through in @ARGV instead of being flagged
-as errors. This makes it possible to write wrapper scripts that
-process only part of the user supplied options, and passes the
+Options that are unknown, ambiguous or supplied with an invalid option
+value are passed through in C<@ARGV> instead of being flagged as
+errors. This makes it possible to write wrapper scripts that process
+only part of the user supplied command line arguments, and pass the
remaining options to some other program.
-This can be very confusing, especially when B<permute> is also set.
+This can be very confusing, especially when C<permute> is also set.
=item prefix
-The string that starts options. See also B<prefix_pattern>.
+The string that starts options. If a constant string is not
+sufficient, see C<prefix_pattern>.
=item prefix_pattern
@@ -1336,27 +1562,84 @@ Enable copious debugging output.
=back
-=head1 OTHER USEFUL VARIABLES
+=head1 Return values and Errors
-=over 12
+Configuration errors and errors in the option definitions are
+signalled using die() and will terminate the calling program unless
+the call to Getopt::Long::GetOptions() was embedded in C<eval { ...
+}>, or die() was trapped using C<$SIG{__DIE__}>.
-=item $Getopt::Long::VERSION
+A return value of 1 (true) indicates success.
-The version number of this Getopt::Long implementation in the format
-C<major>.C<minor>. This can be used to have Exporter check the
-version, e.g.
+A return status of 0 (false) indicates that the function detected one
+or more errors during option parsing. These errors are signalled using
+warn() and can be trapped with C<$SIG{__WARN__}>.
- use Getopt::Long 3.00;
+Errors that can't happen are signalled using Carp::croak().
-You can inspect $Getopt::Long::major_version and
-$Getopt::Long::minor_version for the individual components.
+=head1 Legacy
-=item $Getopt::Long::error
+The earliest development of C<newgetopt.pl> started in 1990, with Perl
+version 4. As a result, its development, and the development of
+Getopt::Long, has gone through several stages. Since backward
+compatibility has always been extremely important, the current version
+of Getopt::Long still supports a lot of constructs that nowadays are
+no longer necessary or otherwise unwanted. This section describes
+briefly some of these 'features'.
-Internal error flag. May be incremented from a call-back routine to
-cause options parsing to fail.
+=head2 Default destinations
-=back
+When no destination is specified for an option, GetOptions will store
+the resultant value in a global variable named C<opt_>I<XXX>, where
+I<XXX> is the primary name of this option. When a progam executes
+under C<use strict> (recommended), these variables must be
+pre-declared with our() or C<use vars>.
+
+ our $opt_length = 0;
+ GetOptions ('length=i'); # will store in $opt_length
+
+To yield a usable Perl variable, characters that are not part of the
+syntax for variables are translated to underscores. For example,
+C<--fpp-struct-return> will set the variable
+C<$opt_fpp_struct_return>. Note that this variable resides in the
+namespace of the calling program, not necessarily C<main>. For
+example:
+
+ GetOptions ("size=i", "sizes=i@");
+
+with command line "-size 10 -sizes 24 -sizes 48" will perform the
+equivalent of the assignments
+
+ $opt_size = 10;
+ @opt_sizes = (24, 48);
+
+=head2 Alternative option starters
+
+A string of alternative option starter characters may be passed as the
+first argument (or the first argument after a leading hash reference
+argument).
+
+ my $len = 0;
+ GetOptions ('/', 'length=i' => $len);
+
+Now the command line may look like:
+
+ /length 24 -- arg
+
+Note that to terminate options processing still requires a double dash
+C<-->.
+
+GetOptions() will not interpret a leading C<"<>"> as option starters
+if the next argument is a reference. To force C<"<"> and C<">"> as
+option starters, use C<"><">. Confusing? Well, B<using a starter
+argument is strongly deprecated> anyway.
+
+=head2 Configuration variables
+
+Previous versions of Getopt::Long used variables for the purpose of
+configuring. Although manipulating these variables still work, it
+is strongly encouraged to use the new C<config> routine. Besides, it
+is much easier.
=head1 AUTHOR
@@ -1364,11 +1647,12 @@ Johan Vromans E<lt>jvromans@squirrel.nlE<gt>
=head1 COPYRIGHT AND DISCLAIMER
-This program is Copyright 1990,1999 by Johan Vromans.
+This program is Copyright 2000,1990 by Johan Vromans.
This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
+modify it under the terms of the Perl Artistic License or the
+GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any
+later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -1380,3 +1664,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
MA 02139, USA.
=cut
+
+# Local Variables:
+# mode: perl
+# eval: (load-file "pod.el")
+# End:
diff --git a/contrib/perl5/lib/Getopt/Std.pm b/contrib/perl5/lib/Getopt/Std.pm
index 390bf14..e5b369c 100644
--- a/contrib/perl5/lib/Getopt/Std.pm
+++ b/contrib/perl5/lib/Getopt/Std.pm
@@ -28,21 +28,25 @@ which take an argument don't care whether there is a space between the
switch and the argument.
Note that, if your code is running under the recommended C<use strict
-'vars'> pragma, it may be helpful to declare these package variables
-via C<use vars> perhaps something like this:
+'vars'> pragma, you will need to declare these package variables
+with "our":
- use vars qw/ $opt_foo $opt_bar /;
+ our($opt_foo, $opt_bar);
-For those of you who don't like additional variables being created, getopt()
+For those of you who don't like additional global variables being created, getopt()
and getopts() will also accept a hash reference as an optional second argument.
Hash keys will be x (where x is the switch name) with key values the value of
the argument or 1 if no argument is specified.
+To allow programs to process arguments that look like switches, but aren't,
+both functions will stop processing switches when they see the argument
+C<-->. The C<--> will be removed from @ARGV.
+
=cut
@ISA = qw(Exporter);
@EXPORT = qw(getopt getopts);
-$VERSION = $VERSION = '1.01';
+$VERSION = '1.02';
# Process single-character switches with switch clustering. Pass one argument
# which is a string containing all switches that take an argument. For each
@@ -60,6 +64,10 @@ sub getopt ($;$) {
while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
($first,$rest) = ($1,$2);
+ if (/^--$/) { # early exit if --
+ shift @ARGV;
+ last;
+ }
if (index($argumentative,$first) >= 0) {
if ($rest ne '') {
shift(@ARGV);
@@ -68,22 +76,22 @@ sub getopt ($;$) {
shift(@ARGV);
$rest = shift(@ARGV);
}
- if (ref $hash) {
- $$hash{$first} = $rest;
- }
- else {
- ${"opt_$first"} = $rest;
- push( @EXPORT, "\$opt_$first" );
- }
+ if (ref $hash) {
+ $$hash{$first} = $rest;
+ }
+ else {
+ ${"opt_$first"} = $rest;
+ push( @EXPORT, "\$opt_$first" );
+ }
}
else {
- if (ref $hash) {
- $$hash{$first} = 1;
- }
- else {
- ${"opt_$first"} = 1;
- push( @EXPORT, "\$opt_$first" );
- }
+ if (ref $hash) {
+ $$hash{$first} = 1;
+ }
+ else {
+ ${"opt_$first"} = 1;
+ push( @EXPORT, "\$opt_$first" );
+ }
if ($rest ne '') {
$ARGV[0] = "-$rest";
}
@@ -111,31 +119,35 @@ sub getopts ($;$) {
@args = split( / */, $argumentative );
while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
($first,$rest) = ($1,$2);
+ if (/^--$/) { # early exit if --
+ shift @ARGV;
+ last;
+ }
$pos = index($argumentative,$first);
- if($pos >= 0) {
- if(defined($args[$pos+1]) and ($args[$pos+1] eq ':')) {
+ if ($pos >= 0) {
+ if (defined($args[$pos+1]) and ($args[$pos+1] eq ':')) {
shift(@ARGV);
- if($rest eq '') {
+ if ($rest eq '') {
++$errs unless @ARGV;
$rest = shift(@ARGV);
}
- if (ref $hash) {
- $$hash{$first} = $rest;
- }
- else {
- ${"opt_$first"} = $rest;
- push( @EXPORT, "\$opt_$first" );
- }
+ if (ref $hash) {
+ $$hash{$first} = $rest;
+ }
+ else {
+ ${"opt_$first"} = $rest;
+ push( @EXPORT, "\$opt_$first" );
+ }
}
else {
- if (ref $hash) {
- $$hash{$first} = 1;
- }
- else {
- ${"opt_$first"} = 1;
- push( @EXPORT, "\$opt_$first" );
- }
- if($rest eq '') {
+ if (ref $hash) {
+ $$hash{$first} = 1;
+ }
+ else {
+ ${"opt_$first"} = 1;
+ push( @EXPORT, "\$opt_$first" );
+ }
+ if ($rest eq '') {
shift(@ARGV);
}
else {
@@ -146,7 +158,7 @@ sub getopts ($;$) {
else {
warn "Unknown option: $first\n";
++$errs;
- if($rest ne '') {
+ if ($rest ne '') {
$ARGV[0] = "-$rest";
}
else {
@@ -162,4 +174,3 @@ sub getopts ($;$) {
}
1;
-
diff --git a/contrib/perl5/lib/I18N/Collate.pm b/contrib/perl5/lib/I18N/Collate.pm
index 580ca39..64a03a2 100644
--- a/contrib/perl5/lib/I18N/Collate.pm
+++ b/contrib/perl5/lib/I18N/Collate.pm
@@ -108,6 +108,7 @@ European character set.
# ---
use POSIX qw(strxfrm LC_COLLATE);
+use warnings::register;
require Exporter;
@@ -123,9 +124,9 @@ cmp collate_cmp
sub new {
my $new = $_[1];
- if ($^W && $] >= 5.003_06) {
+ if (warnings::enabled() && $] >= 5.003_06) {
unless ($please_use_I18N_Collate_even_if_deprecated) {
- warn <<___EOD___;
+ warnings::warn <<___EOD___;
***
WARNING: starting from the Perl version 5.003_06
diff --git a/contrib/perl5/lib/IPC/Open2.pm b/contrib/perl5/lib/IPC/Open2.pm
index 32282d6..a5a3561 100644
--- a/contrib/perl5/lib/IPC/Open2.pm
+++ b/contrib/perl5/lib/IPC/Open2.pm
@@ -1,7 +1,7 @@
package IPC::Open2;
use strict;
-use vars qw($VERSION @ISA @EXPORT);
+our ($VERSION, @ISA, @EXPORT);
require 5.000;
require Exporter;
@@ -17,47 +17,71 @@ IPC::Open2, open2 - open a process for both reading and writing
=head1 SYNOPSIS
use IPC::Open2;
- $pid = open2(\*RDR, \*WTR, 'some cmd and args');
- # or
- $pid = open2(\*RDR, \*WTR, 'some', 'cmd', 'and', 'args');
+
+ $pid = open2(\*RDRFH, \*WTRFH, 'some cmd and args');
+ # or without using the shell
+ $pid = open2(\*RDRFH, \*WTRFH, 'some', 'cmd', 'and', 'args');
+
+ # or with handle autovivification
+ my($rdrfh, $wtrfh);
+ $pid = open2($rdrfh, $wtrfh, 'some cmd and args');
+ # or without using the shell
+ $pid = open2($rdrfh, $wtrfh, 'some', 'cmd', 'and', 'args');
=head1 DESCRIPTION
-The open2() function spawns the given $cmd and connects $rdr for
-reading and $wtr for writing. It's what you think should work
+The open2() function runs the given $cmd and connects $rdrfh for
+reading and $wtrfh for writing. It's what you think should work
when you try
- open(HANDLE, "|cmd args|");
+ $pid = open(HANDLE, "|cmd args|");
The write filehandle will have autoflush turned on.
-If $rdr is a string (that is, a bareword filehandle rather than a glob
-or a reference) and it begins with ">&", then the child will send output
-directly to that file handle. If $wtr is a string that begins with
-"<&", then WTR will be closed in the parent, and the child will read
+If $rdrfh is a string (that is, a bareword filehandle rather than a glob
+or a reference) and it begins with C<< >& >>, then the child will send output
+directly to that file handle. If $wtrfh is a string that begins with
+C<< <& >>, then $wtrfh will be closed in the parent, and the child will read
from it directly. In both cases, there will be a dup(2) instead of a
pipe(2) made.
-open2() returns the process ID of the child process. It doesn't return on
-failure: it just raises an exception matching C</^open2:/>.
-
-=head1 WARNING
-
-It will not create these file handles for you. You have to do this yourself.
-So don't pass it empty variables expecting them to get filled in for you.
+If either reader or writer is the null string, this will be replaced
+by an autogenerated filehandle. If so, you must pass a valid lvalue
+in the parameter slot so it can be overwritten in the caller, or
+an exception will be raised.
-Additionally, this is very dangerous as you may block forever.
-It assumes it's going to talk to something like B<bc>, both writing to
-it and reading from it. This is presumably safe because you "know"
-that commands like B<bc> will read a line at a time and output a line at
-a time. Programs like B<sort> that read their entire input stream first,
-however, are quite apt to cause deadlock.
+open2() returns the process ID of the child process. It doesn't return on
+failure: it just raises an exception matching C</^open2:/>. However,
+C<exec> failures in the child are not detected. You'll have to
+trap SIGPIPE yourself.
+
+open2() does not wait for and reap the child process after it exits.
+Except for short programs where it's acceptable to let the operating system
+take care of this, you need to do this yourself. This is normally as
+simple as calling C<waitpid $pid, 0> when you're done with the process.
+Failing to do this can result in an accumulation of defunct or "zombie"
+processes. See L<perlfunc/waitpid> for more information.
+
+This whole affair is quite dangerous, as you may block forever. It
+assumes it's going to talk to something like B<bc>, both writing
+to it and reading from it. This is presumably safe because you
+"know" that commands like B<bc> will read a line at a time and
+output a line at a time. Programs like B<sort> that read their
+entire input stream first, however, are quite apt to cause deadlock.
The big problem with this approach is that if you don't have control
over source code being run in the child process, you can't control
what it does with pipe buffering. Thus you can't just open a pipe to
C<cat -v> and continually read and write a line from it.
+The IO::Pty and Expect modules from CPAN can help with this, as they
+provide a real tty (well, a pseudo-tty, actually), which gets you
+back to line buffering in the invoked command again.
+
+=head1 WARNING
+
+The order of arguments differs from that of open3().
+
=head1 SEE ALSO
See L<IPC::Open3> for an alternative that handles STDERR as well. This
@@ -86,10 +110,9 @@ function is really just a wrapper around open3().
require IPC::Open3;
sub open2 {
- my ($read, $write, @cmd) = @_;
local $Carp::CarpLevel = $Carp::CarpLevel + 1;
return IPC::Open3::_open3('open2', scalar caller,
- $write, $read, '>&STDERR', @cmd);
+ $_[1], $_[0], '>&STDERR', @_[2 .. $#_]);
}
1
diff --git a/contrib/perl5/lib/IPC/Open3.pm b/contrib/perl5/lib/IPC/Open3.pm
index d079041..99709ac 100644
--- a/contrib/perl5/lib/IPC/Open3.pm
+++ b/contrib/perl5/lib/IPC/Open3.pm
@@ -2,9 +2,8 @@ package IPC::Open3;
use strict;
no strict 'refs'; # because users pass me bareword filehandles
-use vars qw($VERSION @ISA @EXPORT $Me);
+our ($VERSION, @ISA, @EXPORT);
-require 5.001;
require Exporter;
use Carp;
@@ -23,37 +22,50 @@ IPC::Open3, open3 - open a process for reading, writing, and error handling
$pid = open3(\*WTRFH, \*RDRFH, \*ERRFH,
'some cmd and args', 'optarg', ...);
+ my($wtr, $rdr, $err);
+ $pid = open3($wtr, $rdr, $err,
+ 'some cmd and args', 'optarg', ...);
+
=head1 DESCRIPTION
Extremely similar to open2(), open3() spawns the given $cmd and
connects RDRFH for reading, WTRFH for writing, and ERRFH for errors. If
-ERRFH is '', or the same as RDRFH, then STDOUT and STDERR of the child are
-on the same file handle. The WTRFH will have autoflush turned on.
+ERRFH is false, or the same file descriptor as RDRFH, then STDOUT and
+STDERR of the child are on the same filehandle. The WTRFH will have
+autoflush turned on.
-If WTRFH begins with "E<lt>&", then WTRFH will be closed in the parent, and
+If WTRFH begins with C<< <& >>, then WTRFH will be closed in the parent, and
the child will read from it directly. If RDRFH or ERRFH begins with
-"E<gt>&", then the child will send output directly to that file handle.
+C<< >& >>, then the child will send output directly to that filehandle.
In both cases, there will be a dup(2) instead of a pipe(2) made.
-If you try to read from the child's stdout writer and their stderr
-writer, you'll have problems with blocking, which means you'll
-want to use select(), which means you'll have to use sysread() instead
-of normal stuff.
+If either reader or writer is the null string, this will be replaced
+by an autogenerated filehandle. If so, you must pass a valid lvalue
+in the parameter slot so it can be overwritten in the caller, or
+an exception will be raised.
open3() returns the process ID of the child process. It doesn't return on
-failure: it just raises an exception matching C</^open3:/>.
+failure: it just raises an exception matching C</^open3:/>. However,
+C<exec> failures in the child are not detected. You'll have to
+trap SIGPIPE yourself.
-=head1 WARNING
-
-It will not create these file handles for you. You have to do this
-yourself. So don't pass it empty variables expecting them to get filled
-in for you.
+open2() does not wait for and reap the child process after it exits.
+Except for short programs where it's acceptable to let the operating system
+take care of this, you need to do this yourself. This is normally as
+simple as calling C<waitpid $pid, 0> when you're done with the process.
+Failing to do this can result in an accumulation of defunct or "zombie"
+processes. See L<perlfunc/waitpid> for more information.
-Additionally, this is very dangerous as you may block forever. It
-assumes it's going to talk to something like B<bc>, both writing to it
-and reading from it. This is presumably safe because you "know" that
-commands like B<bc> will read a line at a time and output a line at a
-time. Programs like B<sort> that read their entire input stream first,
+If you try to read from the child's stdout writer and their stderr
+writer, you'll have problems with blocking, which means you'll want
+to use select() or the IO::Select, which means you'd best use
+sysread() instead of readline() for normal stuff.
+
+This is very dangerous, as you may block forever. It assumes it's
+going to talk to something like B<bc>, both writing to it and reading
+from it. This is presumably safe because you "know" that commands
+like B<bc> will read a line at a time and output a line at a time.
+Programs like B<sort> that read their entire input stream first,
however, are quite apt to cause deadlock.
The big problem with this approach is that if you don't have control
@@ -61,12 +73,17 @@ over source code being run in the child process, you can't control
what it does with pipe buffering. Thus you can't just open a pipe to
C<cat -v> and continually read and write a line from it.
+=head1 WARNING
+
+The order of arguments differs from that of open2().
+
=cut
# &open3: Marc Horowitz <marc@mit.edu>
# derived mostly from &open2 by tom christiansen, <tchrist@convex.com>
# fixed for 5.001 by Ulrich Kunitz <kunitz@mai-koeln.com>
# ported to Win32 by Ron Schmidt, Merrill Lynch almost ended my career
+# fixed for autovivving FHs, tchrist again
#
# $Id: open3.pl,v 1.1 1993/11/23 06:26:15 marc Exp $
#
@@ -94,7 +111,7 @@ C<cat -v> and continually read and write a line from it.
# rdr or wtr are null
# a system call fails
-$Me = 'open3 (bug)'; # you should never see this, it's always localized
+our $Me = 'open3 (bug)'; # you should never see this, it's always localized
# Fatal.pm needs to be fixed WRT prototypes.
@@ -126,15 +143,27 @@ sub _open3 {
my($package, $dad_wtr, $dad_rdr, $dad_err, @cmd) = @_;
my($dup_wtr, $dup_rdr, $dup_err, $kidpid);
- $dad_wtr or croak "$Me: wtr should not be null";
- $dad_rdr or croak "$Me: rdr should not be null";
- $dad_err = $dad_rdr if ($dad_err eq '');
+ # simulate autovivification of filehandles because
+ # it's too ugly to use @_ throughout to make perl do it for us
+ # tchrist 5-Mar-00
+
+ unless (eval {
+ $dad_wtr = $_[1] = gensym unless defined $dad_wtr && length $dad_wtr;
+ $dad_rdr = $_[2] = gensym unless defined $dad_rdr && length $dad_rdr;
+ 1; })
+ {
+ # must strip crud for croak to add back, or looks ugly
+ $@ =~ s/(?<=value attempted) at .*//s;
+ croak "$Me: $@";
+ }
+
+ $dad_err ||= $dad_rdr;
$dup_wtr = ($dad_wtr =~ s/^[<>]&//);
$dup_rdr = ($dad_rdr =~ s/^[<>]&//);
$dup_err = ($dad_err =~ s/^[<>]&//);
- # force unqualified filehandles into callers' package
+ # force unqualified filehandles into caller's package
$dad_wtr = qualify $dad_wtr, $package;
$dad_rdr = qualify $dad_rdr, $package;
$dad_err = qualify $dad_err, $package;
@@ -185,7 +214,7 @@ sub _open3 {
xopen \*STDERR, ">&STDOUT" if fileno(STDERR) != fileno(STDOUT);
}
local($")=(" ");
- exec @cmd
+ exec @cmd # XXX: wrong process to croak from
or croak "$Me: exec of @cmd failed";
} elsif ($do_spawn) {
# All the bookkeeping of coincidence between handles is
diff --git a/contrib/perl5/lib/Math/BigFloat.pm b/contrib/perl5/lib/Math/BigFloat.pm
index 03bc2f4..d8d643c 100644
--- a/contrib/perl5/lib/Math/BigFloat.pm
+++ b/contrib/perl5/lib/Math/BigFloat.pm
@@ -9,10 +9,8 @@ use overload
'+' => sub {new Math::BigFloat &fadd},
'-' => sub {new Math::BigFloat
$_[2]? fsub($_[1],${$_[0]}) : fsub(${$_[0]},$_[1])},
-'<=>' => sub {new Math::BigFloat
- $_[2]? fcmp($_[1],${$_[0]}) : fcmp(${$_[0]},$_[1])},
-'cmp' => sub {new Math::BigFloat
- $_[2]? ($_[1] cmp ${$_[0]}) : (${$_[0]} cmp $_[1])},
+'<=>' => sub {$_[2]? fcmp($_[1],${$_[0]}) : fcmp(${$_[0]},$_[1])},
+'cmp' => sub {$_[2]? ($_[1] cmp ${$_[0]}) : (${$_[0]} cmp $_[1])},
'*' => sub {new Math::BigFloat &fmul},
'/' => sub {new Math::BigFloat
$_[2]? scalar fdiv($_[1],${$_[0]}) :
@@ -28,9 +26,9 @@ qw(
sub new {
my ($class) = shift;
my ($foo) = fnorm(shift);
- panic("Not a number initialized to Math::BigFloat") if $foo eq "NaN";
bless \$foo, $class;
}
+
sub numify { 0 + "${$_[0]}" } # Not needed, additional overhead
# comparing to direct compilation based on
# stringify
@@ -76,6 +74,7 @@ sub fnorm; sub fsqrt;
sub fnorm { #(string) return fnum_str
local($_) = @_;
s/\s+//g; # strip white space
+ no warnings; # $4 and $5 below might legitimately be undefined
if (/^([+-]?)(\d*)(\.(\d*))?([Ee]([+-]?\d+))?$/ && "$2$4" ne '') {
&norm(($1 ? "$1$2$4" : "+$2$4"),(($4 ne '') ? $6-length($4) : $6));
} else {
@@ -159,7 +158,8 @@ sub fdiv #(fnum_str, fnum_str[,scale]) return fnum_str
$scale = length($xm)-1 if (length($xm)-1 > $scale);
$scale = length($ym)-1 if (length($ym)-1 > $scale);
$scale = $scale + length($ym) - length($xm);
- &norm(&round(Math::BigInt::bdiv($xm.('0' x $scale),$ym),$ym),
+ &norm(&round(Math::BigInt::bdiv($xm.('0' x $scale),$ym),
+ Math::BigInt::babs($ym)),
$xe-$ye-$scale);
}
}
@@ -219,7 +219,11 @@ sub ffround { #(fnum_str, scale) return fnum_str
if ($xe < 1) {
'+0E+0';
} elsif ($xe == 1) {
- &norm(&round('+0',"+0".substr($xm,$[+1,1),"+10"), $scale);
+ # The first substr preserves the sign, passing a non-
+ # normalized "-0" to &round when rounding -0.006 (for
+ # example), purely so &round won't lose the sign.
+ &norm(&round(substr($xm,$[,1).'0',
+ "+0".substr($xm,$[+1,1),"+10"), $scale);
} else {
&norm(&round(substr($xm,$[,$xe),
"+0".substr($xm,$[+$xe,1),"+10"), $scale);
@@ -236,12 +240,13 @@ sub fcmp #(fnum_str, fnum_str) return cond_code
if ($x eq "NaN" || $y eq "NaN") {
undef;
} else {
+ local($xm,$xe,$ym,$ye) = split('E', $x."E$y");
+ if ($xm eq '+0' || $ym eq '+0') {
+ return $xm <=> $ym;
+ }
ord($y) <=> ord($x)
- ||
- ( local($xm,$xe,$ym,$ye) = split('E', $x."E$y"),
- (($xe <=> $ye) * (substr($x,$[,1).'1')
- || Math::BigInt::cmp($xm,$ym))
- );
+ || ($xe <=> $ye) * (substr($x,$[,1).'1')
+ || Math::BigInt::cmp($xm,$ym);
}
}
@@ -301,7 +306,7 @@ floats as
=item number format
canonical strings have the form /[+-]\d+E[+-]\d+/ . Input values can
-have imbedded whitespace.
+have embedded whitespace.
=item Error returns 'NaN'
@@ -310,9 +315,24 @@ negative number.
=item Division is computed to
-C<max($div_scale,length(dividend)+length(divisor))> digits by default.
+C<max($Math::BigFloat::div_scale,length(dividend)+length(divisor))>
+digits by default.
Also used for default sqrt scale.
+=item Rounding is performed
+
+according to the value of
+C<$Math::BigFloat::rnd_mode>:
+
+ trunc truncate the value
+ zero round towards 0
+ +inf round towards +infinity (round up)
+ -inf round towards -infinity (round down)
+ even round to the nearest, .5 to the even digit
+ odd round to the nearest, .5 to the odd digit
+
+The default is C<even> rounding.
+
=back
=head1 BUGS
@@ -320,6 +340,15 @@ Also used for default sqrt scale.
The current version of this module is a preliminary version of the
real thing that is currently (as of perl5.002) under development.
+The printf subroutine does not use the value of
+C<$Math::BigFloat::rnd_mode> when rounding values for printing.
+Consequently, the way to print rounded values is
+to specify the number of digits both as an
+argument to C<ffround> and in the C<%f> printf string,
+as follows:
+
+ printf "%.3f\n", $bigfloat->ffround(-3);
+
=head1 AUTHOR
Mark Biggar
diff --git a/contrib/perl5/lib/Math/BigInt.pm b/contrib/perl5/lib/Math/BigInt.pm
index b61b884..a43969c 100644
--- a/contrib/perl5/lib/Math/BigInt.pm
+++ b/contrib/perl5/lib/Math/BigInt.pm
@@ -4,10 +4,8 @@ use overload
'+' => sub {new Math::BigInt &badd},
'-' => sub {new Math::BigInt
$_[2]? bsub($_[1],${$_[0]}) : bsub(${$_[0]},$_[1])},
-'<=>' => sub {new Math::BigInt
- $_[2]? bcmp($_[1],${$_[0]}) : bcmp(${$_[0]},$_[1])},
-'cmp' => sub {new Math::BigInt
- $_[2]? ($_[1] cmp ${$_[0]}) : (${$_[0]} cmp $_[1])},
+'<=>' => sub {$_[2]? bcmp($_[1],${$_[0]}) : bcmp(${$_[0]},$_[1])},
+'cmp' => sub {$_[2]? ($_[1] cmp ${$_[0]}) : (${$_[0]} cmp $_[1])},
'*' => sub {new Math::BigInt &bmul},
'/' => sub {new Math::BigInt
$_[2]? scalar bdiv($_[1],${$_[0]}) :
@@ -18,6 +16,14 @@ use overload
$_[2]? bpow($_[1],${$_[0]}) : bpow(${$_[0]},$_[1])},
'neg' => sub {new Math::BigInt &bneg},
'abs' => sub {new Math::BigInt &babs},
+'<<' => sub {new Math::BigInt
+ $_[2]? blsft($_[1],${$_[0]}) : blsft(${$_[0]},$_[1])},
+'>>' => sub {new Math::BigInt
+ $_[2]? brsft($_[1],${$_[0]}) : brsft(${$_[0]},$_[1])},
+'&' => sub {new Math::BigInt &band},
+'|' => sub {new Math::BigInt &bior},
+'^' => sub {new Math::BigInt &bxor},
+'~' => sub {new Math::BigInt &bnot},
qw(
"" stringify
@@ -258,9 +264,11 @@ sub bdiv { #(dividend: num_str, divisor: num_str) return num_str
else {
push(@x, 0);
}
- @q = (); ($v2,$v1) = ($y[-2] || 0, $y[-1]);
+ @q = (); ($v2,$v1) = @y[-2,-1];
+ $v2 = 0 unless $v2;
while ($#x > $#y) {
- ($u2,$u1,$u0) = ($x[-3] || 0, $x[-2] || 0, $x[-1]);
+ ($u2,$u1,$u0) = @x[-3..-1];
+ $u2 = 0 unless $u2;
$q = (($u0 == $v1) ? 99999 : int(($u0*1e5+$u1)/$v1));
--$q while ($v2*$q > ($u0*1e5+$u1-$q*$v1)*1e5+$u2);
if ($q) {
@@ -328,6 +336,69 @@ sub bpow { #(num_str, num_str) return num_str
}
}
+# compute x << y, y >= 0
+sub blsft { #(num_str, num_str) return num_str
+ &bmul($_[$[], &bpow(2, $_[$[+1]));
+}
+
+# compute x >> y, y >= 0
+sub brsft { #(num_str, num_str) return num_str
+ &bdiv($_[$[], &bpow(2, $_[$[+1]));
+}
+
+# compute x & y
+sub band { #(num_str, num_str) return num_str
+ local($x,$y,$r,$m,$xr,$yr) = (&bnorm($_[$[]),&bnorm($_[$[+1]),0,1);
+ if ($x eq 'NaN' || $y eq 'NaN') {
+ 'NaN';
+ } else {
+ while ($x ne '+0' && $y ne '+0') {
+ ($x, $xr) = &bdiv($x, 0x10000);
+ ($y, $yr) = &bdiv($y, 0x10000);
+ $r = &badd(&bmul(int $xr & $yr, $m), $r);
+ $m = &bmul($m, 0x10000);
+ }
+ $r;
+ }
+}
+
+# compute x | y
+sub bior { #(num_str, num_str) return num_str
+ local($x,$y,$r,$m,$xr,$yr) = (&bnorm($_[$[]),&bnorm($_[$[+1]),0,1);
+ if ($x eq 'NaN' || $y eq 'NaN') {
+ 'NaN';
+ } else {
+ while ($x ne '+0' || $y ne '+0') {
+ ($x, $xr) = &bdiv($x, 0x10000);
+ ($y, $yr) = &bdiv($y, 0x10000);
+ $r = &badd(&bmul(int $xr | $yr, $m), $r);
+ $m = &bmul($m, 0x10000);
+ }
+ $r;
+ }
+}
+
+# compute x ^ y
+sub bxor { #(num_str, num_str) return num_str
+ local($x,$y,$r,$m,$xr,$yr) = (&bnorm($_[$[]),&bnorm($_[$[+1]),0,1);
+ if ($x eq 'NaN' || $y eq 'NaN') {
+ 'NaN';
+ } else {
+ while ($x ne '+0' || $y ne '+0') {
+ ($x, $xr) = &bdiv($x, 0x10000);
+ ($y, $yr) = &bdiv($y, 0x10000);
+ $r = &badd(&bmul(int $xr ^ $yr, $m), $r);
+ $m = &bmul($m, 0x10000);
+ }
+ $r;
+ }
+}
+
+# represent ~x as twos-complement number
+sub bnot { #(num_str) return num_str
+ &bsub(-1,$_[$[]);
+}
+
1;
__END__
@@ -350,6 +421,12 @@ Math::BigInt - Arbitrary size integer math package
$i->bmod(BINT) return BINT modulus
$i->bgcd(BINT) return BINT greatest common divisor
$i->bnorm return BINT normalization
+ $i->blsft(BINT) return BINT left shift
+ $i->brsft(BINT) return (BINT,BINT) right shift (quo,rem) just quo if scalar
+ $i->band(BINT) return BINT bit-wise and
+ $i->bior(BINT) return BINT bit-wise inclusive or
+ $i->bxor(BINT) return BINT bit-wise exclusive or
+ $i->bnot return BINT bit-wise not
=head1 DESCRIPTION
diff --git a/contrib/perl5/lib/Math/Complex.pm b/contrib/perl5/lib/Math/Complex.pm
index 5b69039..1a47f4a 100644
--- a/contrib/perl5/lib/Math/Complex.pm
+++ b/contrib/perl5/lib/Math/Complex.pm
@@ -8,9 +8,10 @@
require Exporter;
package Math::Complex;
+use 5.005_64;
use strict;
-use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);
+our($VERSION, @ISA, @EXPORT, %EXPORT_TAGS);
my ( $i, $ip2, %logn );
@@ -65,9 +66,10 @@ use overload
# Package "privates"
#
-my $package = 'Math::Complex'; # Package name
-my $display = 'cartesian'; # Default display format
-my $eps = 1e-14; # Epsilon
+my $package = 'Math::Complex'; # Package name
+my %DISPLAY_FORMAT = ('style' => 'cartesian',
+ 'polar_pretty_print' => 1);
+my $eps = 1e-14; # Epsilon
#
# Object attributes (internal):
@@ -160,7 +162,7 @@ sub new { &make } # For backward compatibility only.
#
sub cplx {
my ($re, $im) = @_;
- return $package->make($re, defined $im ? $im : 0);
+ return __PACKAGE__->make($re, defined $im ? $im : 0);
}
#
@@ -171,7 +173,7 @@ sub cplx {
#
sub cplxe {
my ($rho, $theta) = @_;
- return $package->emake($rho, defined $theta ? $theta : 0);
+ return __PACKAGE__->emake($rho, defined $theta ? $theta : 0);
}
#
@@ -179,21 +181,21 @@ sub cplxe {
#
# The number defined as pi = 180 degrees
#
-use constant pi => 4 * CORE::atan2(1, 1);
+sub pi () { 4 * CORE::atan2(1, 1) }
#
# pit2
#
# The full circle
#
-use constant pit2 => 2 * pi;
+sub pit2 () { 2 * pi }
#
# pip2
#
# The quarter circle
#
-use constant pip2 => pi / 2;
+sub pip2 () { pi / 2 }
#
# deg1
@@ -201,14 +203,14 @@ use constant pip2 => pi / 2;
# One degree in radians, used in stringify_polar.
#
-use constant deg1 => pi / 180;
+sub deg1 () { pi / 180 }
#
# uplog10
#
# Used in log10().
#
-use constant uplog10 => 1 / CORE::log(10);
+sub uplog10 () { 1 / CORE::log(10) }
#
# i
@@ -835,7 +837,7 @@ sub acos {
my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
$v = -$v if $y > 0 || ($y == 0 && $x < -1);
- return $package->make($u, $v);
+ return __PACKAGE__->make($u, $v);
}
#
@@ -857,7 +859,7 @@ sub asin {
my $u = CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
$v = -$v if $y > 0 || ($y == 0 && $x < -1);
- return $package->make($u, $v);
+ return __PACKAGE__->make($u, $v);
}
#
@@ -1153,34 +1155,53 @@ sub atan2 {
# display_format
# ->display_format
#
-# Set (fetch if no argument) display format for all complex numbers that
+# Set (get if no argument) the display format for all complex numbers that
# don't happen to have overridden it via ->display_format
#
-# When called as a method, this actually sets the display format for
+# When called as an object method, this actually sets the display format for
# the current object.
#
# Valid object formats are 'c' and 'p' for cartesian and polar. The first
# letter is used actually, so the type can be fully spelled out for clarity.
#
sub display_format {
- my $self = shift;
- my $format = undef;
+ my $self = shift;
+ my %display_format = %DISPLAY_FORMAT;
- if (ref $self) { # Called as a method
- $format = shift;
- } else { # Regular procedure call
- $format = $self;
- undef $self;
+ if (ref $self) { # Called as an object method
+ if (exists $self->{display_format}) {
+ my %obj = %{$self->{display_format}};
+ @display_format{keys %obj} = values %obj;
+ }
+ if (@_ == 1) {
+ $display_format{style} = shift;
+ } else {
+ my %new = @_;
+ @display_format{keys %new} = values %new;
+ }
+ } else { # Called as a class method
+ if (@_ = 1) {
+ $display_format{style} = $self;
+ } else {
+ my %new = @_;
+ @display_format{keys %new} = values %new;
+ }
+ undef $self;
}
if (defined $self) {
- return defined $self->{display} ? $self->{display} : $display
- unless defined $format;
- return $self->{display} = $format;
+ $self->{display_format} = { %display_format };
+ return
+ wantarray ?
+ %{$self->{display_format}} :
+ $self->{display_format}->{style};
}
- return $display unless defined $format;
- return $display = $format;
+ %DISPLAY_FORMAT = %display_format;
+ return
+ wantarray ?
+ %DISPLAY_FORMAT :
+ $DISPLAY_FORMAT{style};
}
#
@@ -1195,12 +1216,12 @@ sub display_format {
#
sub stringify {
my ($z) = shift;
- my $format;
- $format = $display;
- $format = $z->{display} if defined $z->{display};
+ my $style = $z->display_format;
+
+ $style = $DISPLAY_FORMAT{style} unless defined $style;
- return $z->stringify_polar if $format =~ /^p/i;
+ return $z->stringify_polar if $style =~ /^p/i;
return $z->stringify_cartesian;
}
@@ -1220,17 +1241,27 @@ sub stringify_cartesian {
if int(CORE::abs($y)) != int(CORE::abs($y) + $eps);
$re = "$x" if CORE::abs($x) >= $eps;
- if ($y == 1) { $im = 'i' }
- elsif ($y == -1) { $im = '-i' }
- elsif (CORE::abs($y) >= $eps) { $im = $y . "i" }
+
+ my %format = $z->display_format;
+ my $format = $format{format};
+
+ if ($y == 1) { $im = 'i' }
+ elsif ($y == -1) { $im = '-i' }
+ elsif (CORE::abs($y) >= $eps) {
+ $im = (defined $format ? sprintf($format, $y) : $y) . "i";
+ }
my $str = '';
- $str = $re if defined $re;
- $str .= "+$im" if defined $im;
- $str =~ s/\+-/-/;
- $str =~ s/^\+//;
- $str =~ s/([-+])1i/$1i/; # Not redundant with the above 1/-1 tests.
- $str = '0' unless $str;
+ $str = defined $format ? sprintf($format, $re) : $re
+ if defined $re;
+ if (defined $im) {
+ if ($y < 0) {
+ $str .= $im;
+ } elsif ($y > 0) {
+ $str .= "+" if defined $re;
+ $str .= $im;
+ }
+ }
return $str;
}
@@ -1277,6 +1308,8 @@ sub stringify_polar {
return '[0,0]' if $r <= $eps;
+ my %format = $z->display_format;
+
my $nt = $t / pit2;
$nt = ($nt - int($nt)) * pit2;
$nt += pit2 if $nt < 0; # Range [0, 2pi]
@@ -1299,7 +1332,7 @@ sub stringify_polar {
$nt -= pit2 if $nt > pi;
- if (CORE::abs($nt) >= deg1) {
+ if ($format{polar_pretty_print} && CORE::abs($nt) >= deg1) {
my ($n, $k, $kpi);
for ($k = 1, $kpi = pi; $k < 10; $k++, $kpi += pi) {
@@ -1328,12 +1361,19 @@ sub stringify_polar {
if ($theta !~ m(^-?\d*pi/\d+$) and
int(CORE::abs($theta)) != int(CORE::abs($theta) + $eps));
+ my $format = $format{format};
+ if (defined $format) {
+ $r = sprintf($format, $r);
+ $theta = sprintf($format, $theta);
+ }
+
return "\[$r,$theta\]";
}
1;
__END__
+=pod
=head1 NAME
Math::Complex - complex numbers and associated mathematical functions
@@ -1617,9 +1657,9 @@ It is possible to write:
$x = cplxe(-3, pi/4);
-but that will be silently converted into C<[3,-3pi/4]>, since the modulus
-must be non-negative (it represents the distance to the origin in the complex
-plane).
+but that will be silently converted into C<[3,-3pi/4]>, since the
+modulus must be non-negative (it represents the distance to the origin
+in the complex plane).
It is also possible to have a complex number as either argument of
either the C<make> or C<emake>: the appropriate component of
@@ -1631,31 +1671,67 @@ the argument will be used.
=head1 STRINGIFICATION
When printed, a complex number is usually shown under its cartesian
-form I<a+bi>, but there are legitimate cases where the polar format
+style I<a+bi>, but there are legitimate cases where the polar style
I<[r,t]> is more appropriate.
-By calling the routine C<Math::Complex::display_format> and supplying either
-C<"polar"> or C<"cartesian">, you override the default display format,
-which is C<"cartesian">. Not supplying any argument returns the current
-setting.
+By calling the class method C<Math::Complex::display_format> and
+supplying either C<"polar"> or C<"cartesian"> as an argument, you
+override the default display style, which is C<"cartesian">. Not
+supplying any argument returns the current settings.
This default can be overridden on a per-number basis by calling the
C<display_format> method instead. As before, not supplying any argument
-returns the current display format for this number. Otherwise whatever you
-specify will be the new display format for I<this> particular number.
+returns the current display style for this number. Otherwise whatever you
+specify will be the new display style for I<this> particular number.
For instance:
use Math::Complex;
Math::Complex::display_format('polar');
- $j = ((root(1, 3))[1];
- print "j = $j\n"; # Prints "j = [1,2pi/3]
+ $j = (root(1, 3))[1];
+ print "j = $j\n"; # Prints "j = [1,2pi/3]"
$j->display_format('cartesian');
print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i"
-The polar format attempts to emphasize arguments like I<k*pi/n>
-(where I<n> is a positive integer and I<k> an integer within [-9,+9]).
+The polar style attempts to emphasize arguments like I<k*pi/n>
+(where I<n> is a positive integer and I<k> an integer within [-9,+9]),
+this is called I<polar pretty-printing>.
+
+=head2 CHANGED IN PERL 5.6
+
+The C<display_format> class method and the corresponding
+C<display_format> object method can now be called using
+a parameter hash instead of just a one parameter.
+
+The old display format style, which can have values C<"cartesian"> or
+C<"polar">, can be changed using the C<"style"> parameter. (The one
+parameter calling convention also still works.)
+
+There are two new display parameters.
+
+The first one is C<"format">, which is a sprintf()-style format
+string to be used for both parts of the complex number(s). The
+default is C<undef>, which corresponds usually (this is somewhat
+system-dependent) to C<"%.15g">. You can revert to the default by
+setting the format string to C<undef>.
+
+ # the $j from the above example
+
+ $j->display_format('format' => '%.5f');
+ print "j = $j\n"; # Prints "j = -0.50000+0.86603i"
+ $j->display_format('format' => '%.6f');
+ print "j = $j\n"; # Prints "j = -0.5+0.86603i"
+
+Notice that this affects also the return values of the
+C<display_format> methods: in list context the whole parameter hash
+will be returned, as opposed to only the style parameter value. If
+you want to know the whole truth for a complex number, you must call
+both the class method and the object method:
+
+The second new display parameter is C<"polar_pretty_print">, which can
+be set to true or false, the default being true. See the previous
+section for what this means.
=head1 USAGE
@@ -1746,7 +1822,7 @@ Whatever it is, it does not manifest itself anywhere else where Perl runs.
=head1 AUTHORS
-Raphael Manfredi <F<Raphael_Manfredi@grenoble.hp.com>> and
+Raphael Manfredi <F<Raphael_Manfredi@pobox.com>> and
Jarkko Hietaniemi <F<jhi@iki.fi>>.
Extensive patches by Daniel S. Lewart <F<d-lewart@uiuc.edu>>.
diff --git a/contrib/perl5/lib/Math/Trig.pm b/contrib/perl5/lib/Math/Trig.pm
index 924286d..492706c 100644
--- a/contrib/perl5/lib/Math/Trig.pm
+++ b/contrib/perl5/lib/Math/Trig.pm
@@ -7,13 +7,12 @@
require Exporter;
package Math::Trig;
+use 5.005_64;
use strict;
use Math::Complex qw(:trig);
-use vars qw($VERSION $PACKAGE
- @ISA
- @EXPORT @EXPORT_OK %EXPORT_TAGS);
+our($VERSION, $PACKAGE, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
@ISA = qw(Exporter);
@@ -37,8 +36,8 @@ my @rdlcnv = qw(cartesian_to_cylindrical
%EXPORT_TAGS = ('radial' => [ @rdlcnv ]);
-use constant pi2 => 2 * pi;
-use constant pip2 => pi / 2;
+sub pi2 () { 2 * pi } # use constant generates warning
+sub pip2 () { pi / 2 } # use constant generates warning
use constant DR => pi2/360;
use constant RD => 360/pi2;
use constant DG => 400/360;
@@ -133,11 +132,11 @@ Math::Trig - trigonometric functions
=head1 SYNOPSIS
use Math::Trig;
-
+
$x = tan(0.9);
$y = acos(3.7);
$z = asin(2.4);
-
+
$halfpi = pi/2;
$rad = deg2rad(120);
@@ -259,7 +258,7 @@ complex numbers as results because the C<Math::Complex> takes care of
details like for example how to display complex numbers. For example:
print asin(2), "\n";
-
+
should produce something like this (take or leave few last decimals):
1.5707963267949-1.31695789692482i
@@ -273,10 +272,10 @@ and the imaginary part of approximately C<-1.317>.
$radians = deg2rad($degrees);
$radians = grad2rad($gradians);
-
+
$degrees = rad2deg($radians);
$degrees = grad2deg($gradians);
-
+
$gradians = deg2grad($degrees);
$gradians = rad2grad($radians);
@@ -409,7 +408,16 @@ To calculate the distance between London (51.3N 0.5W) and Tokyo (35.7N
$km = great_circle_distance(@L, @T, 6378);
The answer may be off by few percentages because of the irregular
-(slightly aspherical) form of the Earth.
+(slightly aspherical) form of the Earth. The used formula
+
+ lat0 = 90 degrees - phi0
+ lat1 = 90 degrees - phi1
+ d = R * arccos(cos(lat0) * cos(lat1) * cos(lon1 - lon01) +
+ sin(lat0) * sin(lat1))
+
+is also somewhat unreliable for small distances (for locations
+separated less than about five degrees) because it uses arc cosine
+which is rather ill-conditioned for values close to zero.
=head1 BUGS
@@ -426,7 +434,7 @@ an answer instead of giving a fatal runtime error.
=head1 AUTHORS
Jarkko Hietaniemi <F<jhi@iki.fi>> and
-Raphael Manfredi <F<Raphael_Manfredi@grenoble.hp.com>>.
+Raphael Manfredi <F<Raphael_Manfredi@pobox.com>>.
=cut
diff --git a/contrib/perl5/lib/Net/Ping.pm b/contrib/perl5/lib/Net/Ping.pm
index 495b82f..2713383 100644
--- a/contrib/perl5/lib/Net/Ping.pm
+++ b/contrib/perl5/lib/Net/Ping.pm
@@ -4,18 +4,17 @@ package Net::Ping;
#
# Authors of the original pingecho():
# karrer@bernina.ethz.ch (Andreas Karrer)
-# pmarquess@bfsec.bt.co.uk (Paul Marquess)
+# Paul.Marquess@btinternet.com (Paul Marquess)
#
# Copyright (c) 1996 Russell Mosemann. All rights reserved. This
# program is free software; you may redistribute it and/or modify it
# under the same terms as Perl itself.
-require 5.002;
+use 5.005_64;
require Exporter;
use strict;
-use vars qw(@ISA @EXPORT $VERSION
- $def_timeout $def_proto $max_datasize);
+our(@ISA, @EXPORT, $VERSION, $def_timeout, $def_proto, $max_datasize);
use FileHandle;
use Socket qw( SOCK_DGRAM SOCK_STREAM SOCK_RAW PF_INET
inet_aton sockaddr_in );
@@ -423,7 +422,7 @@ Net::Ping - check a remote host for reachability
sleep(1);
}
$p->close();
-
+
$p = Net::Ping->new("tcp", 2);
while ($stop_time > time())
{
@@ -432,7 +431,7 @@ Net::Ping - check a remote host for reachability
sleep(300);
}
undef($p);
-
+
# For backward compatibility
print "$host is alive.\n" if pingecho($host);
diff --git a/contrib/perl5/lib/Net/hostent.pm b/contrib/perl5/lib/Net/hostent.pm
index d586358..6cfde72 100644
--- a/contrib/perl5/lib/Net/hostent.pm
+++ b/contrib/perl5/lib/Net/hostent.pm
@@ -1,9 +1,10 @@
package Net::hostent;
use strict;
+use 5.005_64;
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
@EXPORT = qw(gethostbyname gethostbyaddr gethost);
@EXPORT_OK = qw(
$h_name @h_aliases
diff --git a/contrib/perl5/lib/Net/netent.pm b/contrib/perl5/lib/Net/netent.pm
index fbc6d98..b21cd04 100644
--- a/contrib/perl5/lib/Net/netent.pm
+++ b/contrib/perl5/lib/Net/netent.pm
@@ -1,9 +1,10 @@
package Net::netent;
use strict;
+use 5.005_64;
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
@EXPORT = qw(getnetbyname getnetbyaddr getnet);
@EXPORT_OK = qw(
$n_name @n_aliases
@@ -119,26 +120,26 @@ This seems a bug, but here's how to deal with it:
use strict;
use Socket;
use Net::netent;
-
+
@ARGV = ('loopback') unless @ARGV;
-
+
my($n, $net);
-
+
for $net ( @ARGV ) {
-
+
unless ($n = getnetbyname($net)) {
warn "$0: no such net: $net\n";
next;
}
-
+
printf "\n%s is %s%s\n",
$net,
lc($n->name) eq lc($net) ? "" : "*really* ",
$n->name;
-
+
print "\taliases are ", join(", ", @{$n->aliases}), "\n"
if @{$n->aliases};
-
+
# this is stupid; first, why is this not in binary?
# second, why am i going through these convolutions
# to make it looks right
@@ -147,7 +148,7 @@ This seems a bug, but here's how to deal with it:
shift @a while @a && $a[0] == 0;
printf "\taddr is %s [%d.%d.%d.%d]\n", $n->net, @a;
}
-
+
if ($n = getnetbyaddr($n->net)) {
if (lc($n->name) ne lc($net)) {
printf "\tThat addr reverses to net %s!\n", $n->name;
diff --git a/contrib/perl5/lib/Net/protoent.pm b/contrib/perl5/lib/Net/protoent.pm
index 737ff5a..334af78 100644
--- a/contrib/perl5/lib/Net/protoent.pm
+++ b/contrib/perl5/lib/Net/protoent.pm
@@ -1,9 +1,10 @@
package Net::protoent;
use strict;
+use 5.005_64;
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
@EXPORT = qw(getprotobyname getprotobynumber getprotoent);
@EXPORT_OK = qw( $p_name @p_aliases $p_proto );
%EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
diff --git a/contrib/perl5/lib/Net/servent.pm b/contrib/perl5/lib/Net/servent.pm
index fb85dd0..c892af0 100644
--- a/contrib/perl5/lib/Net/servent.pm
+++ b/contrib/perl5/lib/Net/servent.pm
@@ -1,9 +1,10 @@
package Net::servent;
use strict;
+use 5.005_64;
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
@EXPORT = qw(getservbyname getservbyport getservent getserv);
@EXPORT_OK = qw( $s_name @s_aliases $s_port $s_proto );
%EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
diff --git a/contrib/perl5/lib/Pod/Checker.pm b/contrib/perl5/lib/Pod/Checker.pm
new file mode 100644
index 0000000..ae32677
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Checker.pm
@@ -0,0 +1,1195 @@
+#############################################################################
+# Pod/Checker.pm -- check pod documents for syntax errors
+#
+# Copyright (C) 1994-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Checker;
+
+use vars qw($VERSION);
+$VERSION = 1.098; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+use Pod::ParseUtils; ## for hyperlinks and lists
+
+=head1 NAME
+
+Pod::Checker, podchecker() - check pod documents for syntax errors
+
+=head1 SYNOPSIS
+
+ use Pod::Checker;
+
+ $syntax_okay = podchecker($filepath, $outputpath, %options);
+
+ my $checker = new Pod::Checker %options;
+ $checker->parse_from_file($filepath, \*STDERR);
+
+=head1 OPTIONS/ARGUMENTS
+
+C<$filepath> is the input POD to read and C<$outputpath> is
+where to write POD syntax error messages. Either argument may be a scalar
+indicating a file-path, or else a reference to an open filehandle.
+If unspecified, the input-file it defaults to C<\*STDIN>, and
+the output-file defaults to C<\*STDERR>.
+
+=head2 podchecker()
+
+This function can take a hash of options:
+
+=over 4
+
+=item B<-warnings> =E<gt> I<val>
+
+Turn warnings on/off. See L<"Warnings">.
+
+=back
+
+=head1 DESCRIPTION
+
+B<podchecker> will perform syntax checking of Perl5 POD format documentation.
+
+I<NOTE THAT THIS MODULE IS CURRENTLY IN THE BETA STAGE!>
+
+It is hoped that curious/ambitious user will help flesh out and add the
+additional features they wish to see in B<Pod::Checker> and B<podchecker>
+and verify that the checks are consistent with L<perlpod>.
+
+The following checks are currently preformed:
+
+=over 4
+
+=item *
+
+Unknown '=xxxx' commands, unknown 'XE<lt>...E<gt>' interior-sequences,
+and unterminated interior sequences.
+
+=item *
+
+Check for proper balancing of C<=begin> and C<=end>. The contents of such
+a block are generally ignored, i.e. no syntax checks are performed.
+
+=item *
+
+Check for proper nesting and balancing of C<=over>, C<=item> and C<=back>.
+
+=item *
+
+Check for same nested interior-sequences (e.g.
+C<LE<lt>...LE<lt>...E<gt>...E<gt>>).
+
+=item *
+
+Check for malformed or nonexisting entities C<EE<lt>...E<gt>>.
+
+=item *
+
+Check for correct syntax of hyperlinks C<LE<lt>...E<gt>>. See L<perlpod>
+for details.
+
+=item *
+
+Check for unresolved document-internal links. This check may also reveal
+misspelled links that seem to be internal links but should be links
+to something else.
+
+=back
+
+=head1 DIAGNOSTICS
+
+=head2 Errors
+
+=over 4
+
+=item * empty =headn
+
+A heading (C<=head1> or C<=head2>) without any text? That ain't no
+heading!
+
+=item * =over on line I<N> without closing =back
+
+The C<=over> command does not have a corresponding C<=back> before the
+next heading (C<=head1> or C<=head2>) or the end of the file.
+
+=item * =item without previous =over
+
+=item * =back without previous =over
+
+An C<=item> or C<=back> command has been found outside a
+C<=over>/C<=back> block.
+
+=item * No argument for =begin
+
+A C<=begin> command was found that is not followed by the formatter
+specification.
+
+=item * =end without =begin
+
+A standalone C<=end> command was found.
+
+=item * Nested =begin's
+
+There were at least two consecutive C<=begin> commands without
+the corresponding C<=end>. Only one C<=begin> may be active at
+a time.
+
+=item * =for without formatter specification
+
+There is no specification of the formatter after the C<=for> command.
+
+=item * unresolved internal link I<NAME>
+
+The given link to I<NAME> does not have a matching node in the current
+POD. This also happend when a single word node name is not enclosed in
+C<"">.
+
+=item * Unknown command "I<CMD>"
+
+An invalid POD command has been found. Valid are C<=head1>, C<=head2>,
+C<=over>, C<=item>, C<=back>, C<=begin>, C<=end>, C<=for>, C<=pod>,
+C<=cut>
+
+=item * Unknown interior-sequence "I<SEQ>"
+
+An invalid markup command has been encountered. Valid are:
+C<BE<lt>E<gt>>, C<CE<lt>E<gt>>, C<EE<lt>E<gt>>, C<FE<lt>E<gt>>,
+C<IE<lt>E<gt>>, C<LE<lt>E<gt>>, C<SE<lt>E<gt>>, C<XE<lt>E<gt>>,
+C<ZE<lt>E<gt>>
+
+=item * nested commands I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>
+
+Two nested identical markup commands have been found. Generally this
+does not make sense.
+
+=item * garbled entity I<STRING>
+
+The I<STRING> found cannot be interpreted as a character entity.
+
+=item * Entity number out of range
+
+An entity specified by number (dec, hex, oct) is out of range (1-255).
+
+=item * malformed link LE<lt>E<gt>
+
+The link found cannot be parsed because it does not conform to the
+syntax described in L<perlpod>.
+
+=item * nonempty ZE<lt>E<gt>
+
+The C<ZE<lt>E<gt>> sequence is supposed to be empty.
+
+=item * empty XE<lt>E<gt>
+
+The index entry specified contains nothing but whitespace.
+
+=item * Spurious text after =pod / =cut
+
+The commands C<=pod> and C<=cut> do not take any arguments.
+
+=item * Spurious character(s) after =back
+
+The C<=back> command does not take any arguments.
+
+=back
+
+=head2 Warnings
+
+These may not necessarily cause trouble, but indicate mediocre style.
+
+=over 4
+
+=item * multiple occurence of link target I<name>
+
+The POD file has some C<=item> and/or C<=head> commands that have
+the same text. Potential hyperlinks to such a text cannot be unique then.
+
+=item * line containing nothing but whitespace in paragraph
+
+There is some whitespace on a seemingly empty line. POD is very sensitive
+to such things, so this is flagged. B<vi> users switch on the B<list>
+option to avoid this problem.
+
+=item * file does not start with =head
+
+The file starts with a different POD directive than head.
+This is most probably something you do not want.
+
+=item * No numeric argument for =over
+
+The C<=over> command is supposed to have a numeric argument (the
+indentation).
+
+=item * previous =item has no contents
+
+There is a list C<=item> right above the flagged line that has no
+text contents. You probably want to delete empty items.
+
+=item * preceding non-item paragraph(s)
+
+A list introduced by C<=over> starts with a text or verbatim paragraph,
+but continues with C<=item>s. Move the non-item paragraph out of the
+C<=over>/C<=back> block.
+
+=item * =item type mismatch (I<one> vs. I<two>)
+
+A list started with e.g. a bulletted C<=item> and continued with a
+numbered one. This is obviously inconsistent. For most translators the
+type of the I<first> C<=item> determines the type of the list.
+
+=item * I<N> unescaped C<E<lt>E<gt>> in paragraph
+
+Angle brackets not written as C<E<lt>ltE<gt>> and C<E<lt>gtE<gt>>
+can potentially cause errors as they could be misinterpreted as
+markup commands.
+
+=item * Unknown entity
+
+A character entity was found that does not belong to the standard
+ISO set or the POD specials C<verbar> and C<sol>.
+
+=item * No items in =over
+
+The list opened with C<=over> does not contain any items.
+
+=item * No argument for =item
+
+C<=item> without any parameters is deprecated. It should either be followed
+by C<*> to indicate an unordered list, by a number (optionally followed
+by a dot) to indicate an ordered (numbered) list or simple text for a
+definition list.
+
+=item * empty section in previous paragraph
+
+The previous section (introduced by a C<=head> command) does not contain
+any text. This usually indicates that something is missing. Note: A
+C<=head1> followed immediately by C<=head2> does not trigger this warning.
+
+=item * Verbatim paragraph in NAME section
+
+The NAME section (C<=head1 NAME>) should consist of a single paragraph
+with the script/module name, followed by a dash `-' and a very short
+description of what the thing is good for.
+
+=item * Hyperlinks
+
+There are some warnings wrt. hyperlinks:
+Leading/trailing whitespace, newlines in hyperlinks,
+brackets C<()>.
+
+=back
+
+=head1 RETURN VALUE
+
+B<podchecker> returns the number of POD syntax errors found or -1 if
+there were no POD commands at all found in the file.
+
+=head1 EXAMPLES
+
+I<[T.B.D.]>
+
+=head1 INTERFACE
+
+While checking, this module collects document properties, e.g. the nodes
+for hyperlinks (C<=headX>, C<=item>) and index entries (C<XE<lt>E<gt>>).
+POD translators can use this feature to syntax-check and get the nodes in
+a first pass before actually starting to convert. This is expensive in terms
+of execution time, but allows for very robust conversions.
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+use Pod::Parser;
+require VMS::Filespec if $^O eq 'VMS';
+
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Pod::Parser);
+@EXPORT = qw(&podchecker);
+
+use vars qw(%VALID_COMMANDS %VALID_SEQUENCES);
+
+my %VALID_COMMANDS = (
+ 'pod' => 1,
+ 'cut' => 1,
+ 'head1' => 1,
+ 'head2' => 1,
+ 'over' => 1,
+ 'back' => 1,
+ 'item' => 1,
+ 'for' => 1,
+ 'begin' => 1,
+ 'end' => 1,
+);
+
+my %VALID_SEQUENCES = (
+ 'I' => 1,
+ 'B' => 1,
+ 'S' => 1,
+ 'C' => 1,
+ 'L' => 1,
+ 'F' => 1,
+ 'X' => 1,
+ 'Z' => 1,
+ 'E' => 1,
+);
+
+# stolen from HTML::Entities
+my %ENTITIES = (
+ # Some normal chars that have special meaning in SGML context
+ amp => '&', # ampersand
+'gt' => '>', # greater than
+'lt' => '<', # less than
+ quot => '"', # double quote
+
+ # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML
+ AElig => 'Æ', # capital AE diphthong (ligature)
+ Aacute => 'Á', # capital A, acute accent
+ Acirc => 'Â', # capital A, circumflex accent
+ Agrave => 'À', # capital A, grave accent
+ Aring => 'Å', # capital A, ring
+ Atilde => 'Ã', # capital A, tilde
+ Auml => 'Ä', # capital A, dieresis or umlaut mark
+ Ccedil => 'Ç', # capital C, cedilla
+ ETH => 'Ð', # capital Eth, Icelandic
+ Eacute => 'É', # capital E, acute accent
+ Ecirc => 'Ê', # capital E, circumflex accent
+ Egrave => 'È', # capital E, grave accent
+ Euml => 'Ë', # capital E, dieresis or umlaut mark
+ Iacute => 'Í', # capital I, acute accent
+ Icirc => 'Î', # capital I, circumflex accent
+ Igrave => 'Ì', # capital I, grave accent
+ Iuml => 'Ï', # capital I, dieresis or umlaut mark
+ Ntilde => 'Ñ', # capital N, tilde
+ Oacute => 'Ó', # capital O, acute accent
+ Ocirc => 'Ô', # capital O, circumflex accent
+ Ograve => 'Ò', # capital O, grave accent
+ Oslash => 'Ø', # capital O, slash
+ Otilde => 'Õ', # capital O, tilde
+ Ouml => 'Ö', # capital O, dieresis or umlaut mark
+ THORN => 'Þ', # capital THORN, Icelandic
+ Uacute => 'Ú', # capital U, acute accent
+ Ucirc => 'Û', # capital U, circumflex accent
+ Ugrave => 'Ù', # capital U, grave accent
+ Uuml => 'Ü', # capital U, dieresis or umlaut mark
+ Yacute => 'Ý', # capital Y, acute accent
+ aacute => 'á', # small a, acute accent
+ acirc => 'â', # small a, circumflex accent
+ aelig => 'æ', # small ae diphthong (ligature)
+ agrave => 'à', # small a, grave accent
+ aring => 'å', # small a, ring
+ atilde => 'ã', # small a, tilde
+ auml => 'ä', # small a, dieresis or umlaut mark
+ ccedil => 'ç', # small c, cedilla
+ eacute => 'é', # small e, acute accent
+ ecirc => 'ê', # small e, circumflex accent
+ egrave => 'è', # small e, grave accent
+ eth => 'ð', # small eth, Icelandic
+ euml => 'ë', # small e, dieresis or umlaut mark
+ iacute => 'í', # small i, acute accent
+ icirc => 'î', # small i, circumflex accent
+ igrave => 'ì', # small i, grave accent
+ iuml => 'ï', # small i, dieresis or umlaut mark
+ ntilde => 'ñ', # small n, tilde
+ oacute => 'ó', # small o, acute accent
+ ocirc => 'ô', # small o, circumflex accent
+ ograve => 'ò', # small o, grave accent
+ oslash => 'ø', # small o, slash
+ otilde => 'õ', # small o, tilde
+ ouml => 'ö', # small o, dieresis or umlaut mark
+ szlig => 'ß', # small sharp s, German (sz ligature)
+ thorn => 'þ', # small thorn, Icelandic
+ uacute => 'ú', # small u, acute accent
+ ucirc => 'û', # small u, circumflex accent
+ ugrave => 'ù', # small u, grave accent
+ uuml => 'ü', # small u, dieresis or umlaut mark
+ yacute => 'ý', # small y, acute accent
+ yuml => 'ÿ', # small y, dieresis or umlaut mark
+
+ # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96)
+ copy => '©', # copyright sign
+ reg => '®', # registered sign
+ nbsp => "\240", # non breaking space
+
+ # Additional ISO-8859/1 entities listed in rfc1866 (section 14)
+ iexcl => '¡',
+ cent => '¢',
+ pound => '£',
+ curren => '¤',
+ yen => '¥',
+ brvbar => '¦',
+ sect => '§',
+ uml => '¨',
+ ordf => 'ª',
+ laquo => '«',
+'not' => '¬', # not is a keyword in perl
+ shy => '­',
+ macr => '¯',
+ deg => '°',
+ plusmn => '±',
+ sup1 => '¹',
+ sup2 => '²',
+ sup3 => '³',
+ acute => '´',
+ micro => 'µ',
+ para => '¶',
+ middot => '·',
+ cedil => '¸',
+ ordm => 'º',
+ raquo => '»',
+ frac14 => '¼',
+ frac12 => '½',
+ frac34 => '¾',
+ iquest => '¿',
+'times' => '×', # times is a keyword in perl
+ divide => '÷',
+
+# some POD special entities
+ verbar => '|',
+ sol => '/'
+);
+
+##---------------------------------------------------------------------------
+
+##---------------------------------
+## Function definitions begin here
+##---------------------------------
+
+sub podchecker( $ ; $ % ) {
+ my ($infile, $outfile, %options) = @_;
+ local $_;
+
+ ## Set defaults
+ $infile ||= \*STDIN;
+ $outfile ||= \*STDERR;
+
+ ## Now create a pod checker
+ my $checker = new Pod::Checker(%options);
+ $checker->parseopts(-process_cut_cmd => 1, -warnings => 1);
+
+ ## Now check the pod document for errors
+ $checker->parse_from_file($infile, $outfile);
+
+ ## Return the number of errors found
+ return $checker->num_errors();
+}
+
+##---------------------------------------------------------------------------
+
+##-------------------------------
+## Method definitions begin here
+##-------------------------------
+
+## sub new {
+## my $this = shift;
+## my $class = ref($this) || $this;
+## my %params = @_;
+## my $self = {%params};
+## bless $self, $class;
+## $self->initialize();
+## return $self;
+## }
+
+sub initialize {
+ my $self = shift;
+ ## Initialize number of errors, and setup an error function to
+ ## increment this number and then print to the designated output.
+ $self->{_NUM_ERRORS} = 0;
+ $self->errorsub('poderror'); # set the error handling subroutine
+ $self->{_commands} = 0; # total number of POD commands encountered
+ $self->{_list_stack} = []; # stack for nested lists
+ $self->{_have_begin} = ''; # stores =begin
+ $self->{_links} = []; # stack for internal hyperlinks
+ $self->{_nodes} = []; # stack for =head/=item nodes
+ $self->{_index} = []; # text in X<>
+ # print warnings?
+ $self->{-warnings} = 1 unless(defined $self->{-warnings});
+ $self->{_current_head1} = ''; # the current =head1 block
+}
+
+##################################
+
+=over 4
+
+=item C<$checker-E<gt>poderror( @args )>
+
+=item C<$checker-E<gt>poderror( {%opts}, @args )>
+
+Internal method for printing errors and warnings. If no options are
+given, simply prints "@_". The following options are recognized and used
+to form the output:
+
+ -msg
+
+A message to print prior to C<@args>.
+
+ -line
+
+The line number the error occurred in.
+
+ -file
+
+The file (name) the error occurred in.
+
+ -severity
+
+The error level, should be 'WARNING' or 'ERROR'.
+
+=cut
+
+# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args )
+sub poderror {
+ my $self = shift;
+ my %opts = (ref $_[0]) ? %{shift()} : ();
+ $opts{-file} = VMS::Filespec::unixify($opts{-file}) if (exists($opts{-file}) && $^O eq 'VMS');
+
+ ## Retrieve options
+ chomp( my $msg = ($opts{-msg} || "")."@_" );
+ my $line = (exists $opts{-line}) ? " at line $opts{-line}" : "";
+ my $file = (exists $opts{-file}) ? " in file $opts{-file}" : "";
+ unless (exists $opts{-severity}) {
+ ## See if can find severity in message prefix
+ $opts{-severity} = $1 if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// );
+ }
+ my $severity = (exists $opts{-severity}) ? "*** $opts{-severity}: " : "";
+
+ ## Increment error count and print message "
+ ++($self->{_NUM_ERRORS})
+ if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR'));
+ my $out_fh = $self->output_handle();
+ print $out_fh ($severity, $msg, $line, $file, "\n")
+ if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING');
+}
+
+##################################
+
+=item C<$checker-E<gt>num_errors()>
+
+Set (if argument specified) and retrieve the number of errors found.
+
+=cut
+
+sub num_errors {
+ return (@_ > 1) ? ($_[0]->{_NUM_ERRORS} = $_[1]) : $_[0]->{_NUM_ERRORS};
+}
+
+##################################
+
+=item C<$checker-E<gt>name()>
+
+Set (if argument specified) and retrieve the canonical name of POD as
+found in the C<=head1 NAME> section.
+
+=cut
+
+sub name {
+ return (@_ > 1 && $_[1]) ?
+ ($_[0]->{-name} = $_[1]) : $_[0]->{-name};
+}
+
+##################################
+
+=item C<$checker-E<gt>node()>
+
+Add (if argument specified) and retrieve the nodes (as defined by C<=headX>
+and C<=item>) of the current POD. The nodes are returned in the order of
+their occurence. They consist of plain text, each piece of whitespace is
+collapsed to a single blank.
+
+=cut
+
+sub node {
+ my ($self,$text) = @_;
+ if(defined $text) {
+ $text =~ s/\s+$//s; # strip trailing whitespace
+ $text =~ s/\s+/ /gs; # collapse whitespace
+ # add node, order important!
+ push(@{$self->{_nodes}}, $text);
+ # keep also a uniqueness counter
+ $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
+ return $text;
+ }
+ @{$self->{_nodes}};
+}
+
+##################################
+
+=item C<$checker-E<gt>idx()>
+
+Add (if argument specified) and retrieve the index entries (as defined by
+C<XE<lt>E<gt>>) of the current POD. They consist of plain text, each piece
+of whitespace is collapsed to a single blank.
+
+=cut
+
+# set/return index entries of current POD
+sub idx {
+ my ($self,$text) = @_;
+ if(defined $text) {
+ $text =~ s/\s+$//s; # strip trailing whitespace
+ $text =~ s/\s+/ /gs; # collapse whitespace
+ # add node, order important!
+ push(@{$self->{_index}}, $text);
+ # keep also a uniqueness counter
+ $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
+ return $text;
+ }
+ @{$self->{_index}};
+}
+
+##################################
+
+=item C<$checker-E<gt>hyperlink()>
+
+Add (if argument specified) and retrieve the hyperlinks (as defined by
+C<LE<lt>E<gt>>) of the current POD. They consist of an 2-item array: line
+number and C<Pod::Hyperlink> object.
+
+=back
+
+=cut
+
+# set/return hyperlinks of the current POD
+sub hyperlink {
+ my $self = shift;
+ if($_[0]) {
+ push(@{$self->{_links}}, $_[0]);
+ return $_[0];
+ }
+ @{$self->{_links}};
+}
+
+## overrides for Pod::Parser
+
+sub end_pod {
+ ## Do some final checks and
+ ## print the number of errors found
+ my $self = shift;
+ my $infile = $self->input_file();
+ $infile = VMS::Filespec::unixify($infile) if $^O eq 'VMS';
+ my $out_fh = $self->output_handle();
+
+ if(@{$self->{_list_stack}}) {
+ # _TODO_ display, but don't count them for now
+ my $list;
+ while(($list = $self->_close_list('EOF',$infile)) &&
+ $list->indent() ne 'auto') {
+ $self->poderror({ -line => 'EOF', -file => $infile,
+ -severity => 'ERROR', -msg => "=over on line " .
+ $list->start() . " without closing =back" }); #"
+ }
+ }
+
+ # check validity of document internal hyperlinks
+ # first build the node names from the paragraph text
+ my %nodes;
+ foreach($self->node()) {
+ $nodes{$_} = 1;
+ if(/^(\S+)\s+/) {
+ # we have more than one word. Use the first as a node, too.
+ # This is used heavily in perlfunc.pod
+ $nodes{$1} ||= 2; # derived node
+ }
+ }
+ foreach($self->hyperlink()) {
+ my ($line,$link) = @$_;
+ # _TODO_ what if there is a link to the page itself by the name,
+ # e.g. in Tk::Pod : L<Tk::Pod/"DESCRIPTION">
+ if($link->node() && !$link->page() && $link->type() ne 'hyperlink') {
+ my $node = $self->_check_ptree($self->parse_text($link->node(),
+ $line), $line, $infile, 'L');
+ if($node && !$nodes{$node}) {
+ $self->poderror({ -line => $line || '', -file => $infile,
+ -severity => 'ERROR',
+ -msg => "unresolved internal link '$node'"});
+ }
+ }
+ }
+
+ # check the internal nodes for uniqueness. This pertains to
+ # =headX, =item and X<...>
+ foreach(grep($self->{_unique_nodes}->{$_} > 1,
+ keys %{$self->{_unique_nodes}})) {
+ $self->poderror({ -line => '-', -file => $infile,
+ -severity => 'WARNING',
+ -msg => "multiple occurence of link target '$_'"});
+ }
+
+ ## Print the number of errors found
+ my $num_errors = $self->num_errors();
+ if ($num_errors > 0) {
+ printf $out_fh ("$infile has $num_errors pod syntax %s.\n",
+ ($num_errors == 1) ? "error" : "errors");
+ }
+ elsif($self->{_commands} == 0) {
+ print $out_fh "$infile does not contain any pod commands.\n";
+ $self->num_errors(-1);
+ }
+ else {
+ print $out_fh "$infile pod syntax OK.\n";
+ }
+}
+
+# check a POD command directive
+sub command {
+ my ($self, $cmd, $paragraph, $line_num, $pod_para) = @_;
+ my ($file, $line) = $pod_para->file_line;
+ ## Check the command syntax
+ my $arg; # this will hold the command argument
+ if (! $VALID_COMMANDS{$cmd}) {
+ $self->poderror({ -line => $line, -file => $file, -severity => 'ERROR',
+ -msg => "Unknown command '$cmd'" });
+ }
+ else {
+ # found a valid command
+ if(!$self->{_commands}++ && $cmd !~ /^head/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "file does not start with =head" });
+ }
+ ## check syntax of particular command
+ if($cmd eq 'over') {
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ my $indent = 4; # default
+ if($arg && $arg =~ /^\s*(\d+)\s*$/) {
+ $indent = $1;
+ } else {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "No numeric argument for =over"});
+ }
+ # start a new list
+ $self->_open_list($indent,$line,$file);
+ }
+ elsif($cmd eq 'item') {
+ # are we in a list?
+ unless(@{$self->{_list_stack}}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "=item without previous =over" });
+ # auto-open in case we encounter many more
+ $self->_open_list('auto',$line,$file);
+ }
+ my $list = $self->{_list_stack}->[0];
+ # check whether the previous item had some contents
+ if(defined $self->{_list_item_contents} &&
+ $self->{_list_item_contents} == 0) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "previous =item has no contents" });
+ }
+ if($list->{_has_par}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "preceding non-item paragraph(s)" });
+ delete $list->{_has_par};
+ }
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line, $file);
+ if($arg && $arg =~ /(\S+)/) {
+ $arg =~ s/[\s\n]+$//;
+ my $type;
+ if($arg =~ /^[*]\s*(\S*.*)/) {
+ $type = 'bullet';
+ $self->{_list_item_contents} = $1 ? 1 : 0;
+ $arg = $1;
+ }
+ elsif($arg =~ /^\d+\.?\s*(\S*)/) {
+ $type = 'number';
+ $self->{_list_item_contents} = $1 ? 1 : 0;
+ $arg = $1;
+ }
+ else {
+ $type = 'definition';
+ $self->{_list_item_contents} = 1;
+ }
+ my $first = $list->type();
+ if($first && $first ne $type) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "=item type mismatch ('$first' vs. '$type')"});
+ }
+ else { # first item
+ $list->type($type);
+ }
+ }
+ else {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "No argument for =item" });
+ $arg = ' '; # empty
+ $self->{_list_item_contents} = 0;
+ }
+ # add this item
+ $list->item($arg);
+ # remember this node
+ $self->node($arg);
+ }
+ elsif($cmd eq 'back') {
+ # check if we have an open list
+ unless(@{$self->{_list_stack}}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "=back without previous =over" });
+ }
+ else {
+ # check for spurious characters
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ if($arg && $arg =~ /\S/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "Spurious character(s) after =back" });
+ }
+ # close list
+ my $list = $self->_close_list($line,$file);
+ # check for empty lists
+ if(!$list->item() && $self->{-warnings}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "No items in =over (at line " .
+ $list->start() . ") / =back list"}); #"
+ }
+ }
+ }
+ elsif($cmd =~ /^head(\d+)/) {
+ # check whether the previous =head section had some contents
+ if(defined $self->{_commands_in_head} &&
+ $self->{_commands_in_head} == 0 &&
+ defined $self->{_last_head} &&
+ $self->{_last_head} >= $1) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "empty section in previous paragraph"});
+ }
+ $self->{_commands_in_head} = -1;
+ $self->{_last_head} = $1;
+ # check if there is an open list
+ if(@{$self->{_list_stack}}) {
+ my $list;
+ while(($list = $self->_close_list($line,$file)) &&
+ $list->indent() ne 'auto') {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "=over on line ". $list->start() .
+ " without closing =back (at $cmd)" });
+ }
+ }
+ # remember this node
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ $arg =~ s/[\s\n]+$//s;
+ $self->node($arg);
+ unless(length($arg)) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "empty =$cmd"});
+ }
+ if($cmd eq 'head1') {
+ $self->{_current_head1} = $arg;
+ } else {
+ $self->{_current_head1} = '';
+ }
+ }
+ elsif($cmd eq 'begin') {
+ if($self->{_have_begin}) {
+ # already have a begin
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "Nested =begin's (first at line " .
+ $self->{_have_begin} . ")"});
+ }
+ else {
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ unless($arg && $arg =~ /(\S+)/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "No argument for =begin"});
+ }
+ # remember the =begin
+ $self->{_have_begin} = "$line:$1";
+ }
+ }
+ elsif($cmd eq 'end') {
+ if($self->{_have_begin}) {
+ # close the existing =begin
+ $self->{_have_begin} = '';
+ # check for spurious characters
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ # the closing argument is optional
+ #if($arg && $arg =~ /\S/) {
+ # $self->poderror({ -line => $line, -file => $file,
+ # -severity => 'WARNING',
+ # -msg => "Spurious character(s) after =end" });
+ #}
+ }
+ else {
+ # don't have a matching =begin
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "=end without =begin" });
+ }
+ }
+ elsif($cmd eq 'for') {
+ unless($paragraph =~ /\s*(\S+)\s*/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "=for without formatter specification" });
+ }
+ $arg = ''; # do not expand paragraph below
+ }
+ elsif($cmd =~ /^(pod|cut)$/) {
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ if($arg && $arg =~ /(\S+)/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "Spurious text after =$cmd"});
+ }
+ }
+ $self->{_commands_in_head}++;
+ ## Check the interior sequences in the command-text
+ $self->interpolate_and_check($paragraph, $line,$file)
+ unless(defined $arg);
+ }
+}
+
+sub _open_list
+{
+ my ($self,$indent,$line,$file) = @_;
+ my $list = Pod::List->new(
+ -indent => $indent,
+ -start => $line,
+ -file => $file);
+ unshift(@{$self->{_list_stack}}, $list);
+ undef $self->{_list_item_contents};
+ $list;
+}
+
+sub _close_list
+{
+ my ($self,$line,$file) = @_;
+ my $list = shift(@{$self->{_list_stack}});
+ if(defined $self->{_list_item_contents} &&
+ $self->{_list_item_contents} == 0) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "previous =item has no contents" });
+ }
+ undef $self->{_list_item_contents};
+ $list;
+}
+
+# process a block of some text
+sub interpolate_and_check {
+ my ($self, $paragraph, $line, $file) = @_;
+ ## Check the interior sequences in the command-text
+ # and return the text
+ $self->_check_ptree(
+ $self->parse_text($paragraph,$line), $line, $file, '');
+}
+
+sub _check_ptree {
+ my ($self,$ptree,$line,$file,$nestlist) = @_;
+ local($_);
+ my $text = '';
+ # process each node in the parse tree
+ foreach(@$ptree) {
+ # regular text chunk
+ unless(ref) {
+ my $count;
+ # count the unescaped angle brackets
+ my $i = $_;
+ if($count = $i =~ tr/<>/<>/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "$count unescaped <> in paragraph" })
+ if($self->{-warnings});
+ }
+ $text .= $i;
+ next;
+ }
+ # have an interior sequence
+ my $cmd = $_->cmd_name();
+ my $contents = $_->parse_tree();
+ ($file,$line) = $_->file_line();
+ # check for valid tag
+ if (! $VALID_SEQUENCES{$cmd}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => qq(Unknown interior-sequence '$cmd')});
+ # expand it anyway
+ $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+ next;
+ }
+ if($nestlist =~ /$cmd/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "nested commands $cmd<...$cmd<...>...>"});
+ # _TODO_ should we add the contents anyway?
+ # expand it anyway, see below
+ }
+ if($cmd eq 'E') {
+ # preserve entities
+ if(@$contents > 1 || ref $$contents[0] || $$contents[0] !~ /^\w+$/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "garbled entity " . $_->raw_text()});
+ next;
+ }
+ my $ent = $$contents[0];
+ my $val;
+ if($ent =~ /^0x[0-9a-f]+$/i) {
+ # hexadec entity
+ $val = hex($ent);
+ }
+ elsif($ent =~ /^0\d+$/) {
+ # octal
+ $val = oct($ent);
+ }
+ elsif($ent =~ /^\d+$/) {
+ # numeric entity
+ $val = $ent;
+ }
+ if(defined $val) {
+ if($val>0 && $val<256) {
+ $text .= chr($val);
+ }
+ else {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "Entity number out of range " . $_->raw_text()});
+ }
+ }
+ elsif($ENTITIES{$ent}) {
+ # known ISO entity
+ $text .= $ENTITIES{$ent};
+ }
+ else {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "Unknown entity " . $_->raw_text()});
+ $text .= "E<$ent>";
+ }
+ }
+ elsif($cmd eq 'L') {
+ # try to parse the hyperlink
+ my $link = Pod::Hyperlink->new($contents->raw_text());
+ unless(defined $link) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "malformed link " . $_->raw_text() ." : $@"});
+ next;
+ }
+ $link->line($line); # remember line
+ if($self->{-warnings}) {
+ foreach my $w ($link->warning()) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => $w });
+ }
+ }
+ # check the link text
+ $text .= $self->_check_ptree($self->parse_text($link->text(),
+ $line), $line, $file, "$nestlist$cmd");
+ # remember link
+ $self->hyperlink([$line,$link]);
+ }
+ elsif($cmd =~ /[BCFIS]/) {
+ # add the guts
+ $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+ }
+ elsif($cmd eq 'Z') {
+ if(length($contents->raw_text())) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "Nonempty Z<>"});
+ }
+ }
+ elsif($cmd eq 'X') {
+ my $idx = $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+ if($idx =~ /^\s*$/s) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "Empty X<>"});
+ }
+ else {
+ # remember this node
+ $self->idx($idx);
+ }
+ }
+ else {
+ # not reached
+ die "internal error";
+ }
+ }
+ $text;
+}
+
+# process a block of verbatim text
+sub verbatim {
+ ## Nothing particular to check
+ my ($self, $paragraph, $line_num, $pod_para) = @_;
+
+ $self->_preproc_par($paragraph);
+
+ if($self->{_current_head1} eq 'NAME') {
+ my ($file, $line) = $pod_para->file_line;
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'Verbatim paragraph in NAME section' });
+ }
+}
+
+# process a block of regular text
+sub textblock {
+ my ($self, $paragraph, $line_num, $pod_para) = @_;
+ my ($file, $line) = $pod_para->file_line;
+
+ $self->_preproc_par($paragraph);
+
+ # skip this paragraph if in a =begin block
+ unless($self->{_have_begin}) {
+ my $block = $self->interpolate_and_check($paragraph, $line,$file);
+ if($self->{_current_head1} eq 'NAME') {
+ if($block =~ /^\s*(\S+?)\s*[,-]/) {
+ # this is the canonical name
+ $self->{-name} = $1 unless(defined $self->{-name});
+ }
+ }
+ }
+}
+
+sub _preproc_par
+{
+ my $self = shift;
+ $_[0] =~ s/[\s\n]+$//;
+ if($_[0]) {
+ $self->{_commands_in_head}++;
+ $self->{_list_item_contents}++ if(defined $self->{_list_item_contents});
+ if(@{$self->{_list_stack}} && !$self->{_list_stack}->[0]->item()) {
+ $self->{_list_stack}->[0]->{_has_par} = 1;
+ }
+ }
+}
+
+1;
+
+__END__
+
+=head1 AUTHOR
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt> (initial version),
+Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>
+
+Based on code for B<Pod::Text::pod2text()> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
diff --git a/contrib/perl5/lib/Pod/Find.pm b/contrib/perl5/lib/Pod/Find.pm
new file mode 100644
index 0000000..8de197b
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Find.pm
@@ -0,0 +1,278 @@
+#############################################################################
+# Pod/Find.pm -- finds files containing POD documentation
+#
+# Author: Marek Rouchal <marek@saftsack.fs.uni-bayreuth.de>
+#
+# Copyright (C) 1999-2000 by Marek Rouchal (and borrowing code
+# from Nick Ing-Simmon's PodToHtml). All rights reserved.
+# This file is part of "PodParser". Pod::Find is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Find;
+
+use vars qw($VERSION);
+$VERSION = 0.12; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Find - find POD documents in directory trees
+
+=head1 SYNOPSIS
+
+ use Pod::Find qw(pod_find simplify_name);
+ my %pods = pod_find({ -verbose => 1, -inc => 1 });
+ foreach(keys %pods) {
+ print "found library POD `$pods{$_}' in $_\n";
+ }
+
+ print "podname=",simplify_name('a/b/c/mymodule.pod'),"\n";
+
+=head1 DESCRIPTION
+
+B<Pod::Find> provides a function B<pod_find> that searches for POD
+documents in a given set of files and directories. It returns a hash
+with the file names as keys and the POD name as value. The POD name
+is derived from the file name and its position in the directory tree.
+
+E.g. when searching in F<$HOME/perl5lib>, the file
+F<$HOME/perl5lib/MyModule.pm> would get the POD name I<MyModule>,
+whereas F<$HOME/perl5lib/Myclass/Subclass.pm> would be
+I<Myclass::Subclass>. The name information can be used for POD
+translators.
+
+Only text files containing at least one valid POD command are found.
+
+A warning is printed if more than one POD file with the same POD name
+is found, e.g. F<CPAN.pm> in different directories. This usually
+indicates duplicate occurrences of modules in the I<@INC> search path.
+
+The function B<simplify_name> is equivalent to B<basename>, but also
+strips Perl-like extensions (.pm, .pl, .pod) and extensions like
+F<.bat>, F<.cmd> on Win32 and OS/2, respectively.
+
+Note that neither B<pod_find> nor B<simplify_name> are exported by
+default so be sure to specify them in the B<use> statement if you need
+them:
+
+ use Pod::Find qw(pod_find simplify_name);
+
+=head1 OPTIONS
+
+The first argument for B<pod_find> may be a hash reference with options.
+The rest are either directories that are searched recursively or files.
+The POD names of files are the plain basenames with any Perl-like extension
+(.pm, .pl, .pod) stripped.
+
+=over 4
+
+=item B<-verbose>
+
+Print progress information while scanning.
+
+=item B<-perl>
+
+Apply Perl-specific heuristics to find the correct PODs. This includes
+stripping Perl-like extensions, omitting subdirectories that are numeric
+but do I<not> match the current Perl interpreter's version id, suppressing
+F<site_perl> as a module hierarchy name etc.
+
+=item B<-script>
+
+Search for PODs in the current Perl interpreter's installation
+B<scriptdir>. This is taken from the local L<Config|Config> module.
+
+=item B<-inc>
+
+Search for PODs in the current Perl interpreter's I<@INC> paths. This
+automatically considers paths specified in the C<PERL5LIB> environment.
+
+=back
+
+=head1 AUTHOR
+
+Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>,
+heavily borrowing code from Nick Ing-Simmons' PodToHtml.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Checker>
+
+=cut
+
+use strict;
+#use diagnostics;
+use Exporter;
+use File::Spec;
+use File::Find;
+use Cwd;
+
+use vars qw(@ISA @EXPORT_OK $VERSION);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(&pod_find &simplify_name);
+
+# package global variables
+my $SIMPLIFY_RX;
+
+# return a hash of the POD files found
+# first argument may be a hashref (options),
+# rest is a list of directories to search recursively
+sub pod_find
+{
+ my %opts;
+ if(ref $_[0]) {
+ %opts = %{shift()};
+ }
+
+ $opts{-verbose} ||= 0;
+ $opts{-perl} ||= 0;
+
+ my (@search) = @_;
+
+ if($opts{-script}) {
+ require Config;
+ push(@search, $Config::Config{scriptdir});
+ $opts{-perl} = 1;
+ }
+
+ if($opts{-inc}) {
+ push(@search, grep($_ ne '.',@INC));
+ $opts{-perl} = 1;
+ }
+
+ if($opts{-perl}) {
+ require Config;
+ # this code simplifies the POD name for Perl modules:
+ # * remove "site_perl"
+ # * remove e.g. "i586-linux" (from 'archname')
+ # * remove e.g. 5.00503
+ # * remove pod/ if followed by *.pod (e.g. in pod/perlfunc.pod)
+ $SIMPLIFY_RX =
+ qq!^(?i:site_perl/|\Q$Config::Config{archname}\E/|\\d+\\.\\d+([_.]?\\d+)?/|pod/(?=.*?\\.pod\\z))*!;
+
+ }
+
+ my %dirs_visited;
+ my %pods;
+ my %names;
+ my $pwd = cwd();
+
+ foreach my $try (@search) {
+ unless(File::Spec->file_name_is_absolute($try)) {
+ # make path absolute
+ $try = File::Spec->catfile($pwd,$try);
+ }
+ # simplify path
+ $try = File::Spec->canonpath($try);
+ my $name;
+ if(-f $try) {
+ if($name = _check_and_extract_name($try, $opts{-verbose})) {
+ _check_for_duplicates($try, $name, \%names, \%pods);
+ }
+ next;
+ }
+ my $root_rx = qq!^\Q$try\E/!;
+ File::Find::find( sub {
+ my $item = $File::Find::name;
+ if(-d) {
+ if($dirs_visited{$item}) {
+ warn "Directory '$item' already seen, skipping.\n"
+ if($opts{-verbose});
+ $File::Find::prune = 1;
+ return;
+ }
+ else {
+ $dirs_visited{$item} = 1;
+ }
+ if($opts{-perl} && /^(\d+\.[\d_]+)\z/s && eval "$1" != $]) {
+ $File::Find::prune = 1;
+ warn "Perl $] version mismatch on $_, skipping.\n"
+ if($opts{-verbose});
+ }
+ return;
+ }
+ if($name = _check_and_extract_name($item, $opts{-verbose}, $root_rx)) {
+ _check_for_duplicates($item, $name, \%names, \%pods);
+ }
+ }, $try); # end of File::Find::find
+ }
+ chdir $pwd;
+ %pods;
+}
+
+sub _check_for_duplicates {
+ my ($file, $name, $names_ref, $pods_ref) = @_;
+ if($$names_ref{$name}) {
+ warn "Duplicate POD found (shadowing?): $name ($file)\n";
+ warn " Already seen in ",
+ join(' ', grep($$pods_ref{$_} eq $name, keys %$pods_ref)),"\n";
+ }
+ else {
+ $$names_ref{$name} = 1;
+ }
+ $$pods_ref{$file} = $name;
+}
+
+sub _check_and_extract_name {
+ my ($file, $verbose, $root_rx) = @_;
+
+ # check extension or executable flag
+ # this involves testing the .bat extension on Win32!
+ unless($file =~ /\.(pod|pm|plx?)\z/i || (-f $file && -x _ && -T _)) {
+ return undef;
+ }
+
+ # check for one line of POD
+ unless(open(POD,"<$file")) {
+ warn "Error: $file is unreadable: $!\n";
+ return undef;
+ }
+ local $/ = undef;
+ my $pod = <POD>;
+ close(POD);
+ unless($pod =~ /\n=(head\d|pod|over|item)\b/) {
+ warn "No POD in $file, skipping.\n"
+ if($verbose);
+ return;
+ }
+ undef $pod;
+
+ # strip non-significant path components
+ # _TODO_ what happens on e.g. Win32?
+ my $name = $file;
+ if(defined $root_rx) {
+ $name =~ s!$root_rx!!s;
+ $name =~ s!$SIMPLIFY_RX!!os if(defined $SIMPLIFY_RX);
+ }
+ else {
+ $name =~ s:^.*/::s;
+ }
+ _simplify($name);
+ $name =~ s!/+!::!g; #/
+ $name;
+}
+
+# basic simplification of the POD name:
+# basename & strip extension
+sub simplify_name {
+ my ($str) = @_;
+ # remove all path components
+ $str =~ s:^.*/::s;
+ _simplify($str);
+ $str;
+}
+
+# internal sub only
+sub _simplify {
+ # strip Perl's own extensions
+ $_[0] =~ s/\.(pod|pm|plx?)\z//i;
+ # strip meaningless extensions on Win32 and OS/2
+ $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /win|os2/i);
+}
+
+1;
+
diff --git a/contrib/perl5/lib/Pod/Functions.pm b/contrib/perl5/lib/Pod/Functions.pm
index 3cc9b38..03cbf71 100644
--- a/contrib/perl5/lib/Pod/Functions.pm
+++ b/contrib/perl5/lib/Pod/Functions.pm
@@ -65,6 +65,8 @@ while (<DATA>) {
}
}
+close DATA;
+
unless (caller) {
foreach $type ( @Type_Order ) {
$list = join(", ", sort @{$Kinds{$type}});
@@ -90,9 +92,9 @@ __DATA__
abs Math absolute value function
accept Socket accept an incoming socket connect
alarm Process schedule a SIGALRM
-atan2 Math arctangent of Y/X
+atan2 Math arctangent of Y/X in the range -PI to PI
bind Socket binds an address to a socket
-binmode I/O prepare binary files on old systems
+binmode I/O prepare binary files for I/O
bless Objects create an object
caller Flow,Namespace get context of the current subroutine call
chdir File change your current working directory
@@ -104,7 +106,7 @@ chr String get character this number represents
chroot File make directory new root for path lookups
close I/O close file (or pipe or socket) handle
closedir I/O close directory handle
-connect Socket connect to a remove socket
+connect Socket connect to a remote socket
continue Flow optional trailing block in a while or foreach
cos Math cosine function
crypt String one-way passwd-style encryption
@@ -123,12 +125,12 @@ endprotoent Network be done using protocols file
endpwent User be done using passwd file
endservent Network be done using services file
eof I/O test a filehandle for its end
-eval Flow,Misc catch exceptions or compile code
+eval Flow,Misc catch exceptions or compile and run code
exec Process abandon this program to run another
exists HASH test whether a hash key is present
exit Flow terminate this program
exp Math raise I<e> to a power
-fcntl File file control system all
+fcntl File file control system call
fileno I/O return file descriptor from filehandle
flock I/O lock an entire file with an advisory lock
fork Process create a new process just like this one
@@ -145,7 +147,7 @@ getlogin User return who logged in at this tty
getnetbyaddr Network get network record given its address
getnetbyname Network get networks record given name
getnetent Network get next networks record
-getpeername Socket find the other hend of a socket connection
+getpeername Socket find the other end of a socket connection
getpgrp Process get process group
getppid Process get parent process ID
getpriority Process get current nice value
@@ -180,6 +182,7 @@ link File create a hard link in the filesytem
listen Socket register your socket as a server
local Misc,Namespace create a temporary value for a global variable (dynamic scoping)
localtime Time convert UNIX time into record or string using local time
+lock Threads get a thread lock on a variable, subroutine, or method
log Math retrieve the natural logarithm for a number
lstat File stat a symbolic link
m// Regexp match a string with a regular expression pattern
@@ -210,9 +213,11 @@ qq/STRING/ String doubly quote a string
quotemeta Regexp quote regular expression magic characters
qw/STRING/ LIST quote a list of words
qx/STRING/ Process backquote quote a string
+qr/PATTERN/ Regexp Compile pattern
rand Math retrieve the next pseudorandom number
read I/O,Binary fixed-length buffered input from a filehandle
readdir I/O get a directory from a directory handle
+readline I/O fetch a record from a file
readlink File determine where a symbolic link is pointing
recv Socket receive a message over a Socket
redo Flow start this loop iteration over again
@@ -249,7 +254,7 @@ shmget SysV get SysV shared memory segment identifier
shmread SysV read SysV shared memory
shmwrite SysV write SysV shared memory
shutdown Socket close down just half of a socket connection
-sin Math return the sin of a number
+sin Math return the sine of a number
sleep Process block for some number of seconds
socket Socket create a socket
socketpair Socket create a pair of sockets
@@ -266,6 +271,7 @@ substr String get or alter a portion of a stirng
symlink File create a symbolic link to a file
syscall I/O,Binary execute an arbitrary system call
sysread I/O,Binary fixed-length unbuffered input from a filehandle
+sysseek I/O,Binary position I/O pointer on handle used with sysread and syswrite
system Process run a separate program
syswrite I/O,Binary fixed-length unbuffered output to a filehandle
tell I/O get current seekpointer on a filehandle
diff --git a/contrib/perl5/lib/Pod/Html.pm b/contrib/perl5/lib/Pod/Html.pm
index e71afa8..89e3d0f 100644
--- a/contrib/perl5/lib/Pod/Html.pm
+++ b/contrib/perl5/lib/Pod/Html.pm
@@ -1,22 +1,21 @@
package Pod::Html;
-
-use Pod::Functions;
-use Getopt::Long; # package for handling command-line parameters
+use strict;
require Exporter;
-use vars qw($VERSION);
-$VERSION = 1.01;
-@ISA = Exporter;
+
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION = 1.03;
+@ISA = qw(Exporter);
@EXPORT = qw(pod2html htmlify);
-use Cwd;
use Carp;
+use Config;
+use Cwd;
+use File::Spec::Unix;
+use Getopt::Long;
+use Pod::Functions;
use locale; # make \w work right in non-ASCII lands
-use strict;
-
-use Config;
-
=head1 NAME
Pod::Html - module to convert pod files to HTML
@@ -38,12 +37,48 @@ Pod::Html takes the following arguments:
=over 4
+=item backlink
+
+ --backlink="Back to Top"
+
+Adds "Back to Top" links in front of every HEAD1 heading (except for
+the first). By default, no backlink are being generated.
+
+=item css
+
+ --css=stylesheet
+
+Specify the URL of a cascading style sheet.
+
+=item flush
+
+ --flush
+
+Flushes the item and directory caches.
+
+=item header
+
+ --header
+ --noheader
+
+Creates header and footer blocks containing the text of the NAME
+section. By default, no headers are being generated.
+
=item help
--help
Displays the usage message.
+=item htmldir
+
+ --htmldir=name
+
+Sets the directory in which the resulting HTML file is placed. This
+is used to generate relative links to other files. Not passing this
+causes all links to be absolute, since this is the value that tells
+Pod::Html the root of the documentation tree.
+
=item htmlroot
--htmlroot=name
@@ -51,6 +86,14 @@ Displays the usage message.
Sets the base URL for the HTML files. When cross-references are made,
the HTML root is prepended to the URL.
+=item index
+
+ --index
+ --noindex
+
+Generate an index at the top of the HTML file. This is the default
+behaviour.
+
=item infile
--infile=name
@@ -58,26 +101,6 @@ the HTML root is prepended to the URL.
Specify the pod file to convert. Input is taken from STDIN if no
infile is specified.
-=item outfile
-
- --outfile=name
-
-Specify the HTML file to create. Output goes to STDOUT if no outfile
-is specified.
-
-=item podroot
-
- --podroot=name
-
-Specify the base directory for finding library pods.
-
-=item podpath
-
- --podpath=name:...:name
-
-Specify which subdirectories of the podroot contain pod files whose
-HTML converted forms can be linked-to in cross-references.
-
=item libpods
--libpods=name:...:name
@@ -87,39 +110,46 @@ List of page names (eg, "perlfunc") which contain linkable C<=item>s.
=item netscape
--netscape
+ --nonetscape
-Use Netscape HTML directives when applicable.
-
-=item nonetscape
+Use Netscape HTML directives when applicable. By default, they will
+B<not> be used.
- --nonetscape
+=item outfile
-Do not use Netscape HTML directives (default).
+ --outfile=name
-=item index
+Specify the HTML file to create. Output goes to STDOUT if no outfile
+is specified.
- --index
+=item podpath
-Generate an index at the top of the HTML file (default behaviour).
+ --podpath=name:...:name
-=item noindex
+Specify which subdirectories of the podroot contain pod files whose
+HTML converted forms can be linked-to in cross-references.
- --noindex
+=item podroot
-Do not generate an index at the top of the HTML file.
+ --podroot=name
+Specify the base directory for finding library pods.
-=item recurse
+=item quiet
- --recurse
+ --quiet
+ --noquiet
-Recurse into subdirectories specified in podpath (default behaviour).
+Don't display I<mostly harmless> warning messages. These messages
+will be displayed by default. But this is not the same as C<verbose>
+mode.
-=item norecurse
+=item recurse
+ --recurse
--norecurse
-Do not recurse into subdirectories specified in podpath.
+Recurse into subdirectories specified in podpath (default behaviour).
=item title
@@ -130,8 +160,9 @@ Specify the title of the resulting HTML file.
=item verbose
--verbose
+ --noverbose
-Display progress messages.
+Display progress messages. By default, they won't be displayed.
=back
@@ -146,13 +177,13 @@ Display progress messages.
"--infile=foo.pod",
"--outfile=/perl/nmanual/foo.html");
-=head1 AUTHOR
+=head1 ENVIRONMENT
-Tom Christiansen, E<lt>tchrist@perl.comE<gt>.
+Uses $Config{pod2html} to setup default options.
-=head1 BUGS
+=head1 AUTHOR
-Has trouble with C<> etc in = commands.
+Tom Christiansen, E<lt>tchrist@perl.comE<gt>.
=head1 SEE ALSO
@@ -164,30 +195,35 @@ This program is distributed under the Artistic License.
=cut
-my $dircache = "pod2html-dircache";
-my $itemcache = "pod2html-itemcache";
+my $cache_ext = $^O eq 'VMS' ? ".tmp" : ".x~~";
+my $dircache = "pod2htmd$cache_ext";
+my $itemcache = "pod2htmi$cache_ext";
my @begin_stack = (); # begin/end stack
my @libpods = (); # files to search for links from C<> directives
my $htmlroot = "/"; # http-server base directory from which all
# relative paths in $podpath stem.
+my $htmldir = ""; # The directory to which the html pages
+ # will (eventually) be written.
my $htmlfile = ""; # write to stdout by default
+my $htmlfileurl = "" ; # The url that other files would use to
+ # refer to this file. This is only used
+ # to make relative urls that point to
+ # other files.
my $podfile = ""; # read from stdin by default
my @podpath = (); # list of directories containing library pods.
my $podroot = "."; # filesystem base directory from which all
# relative paths in $podpath stem.
+my $css = ''; # Cascading style sheet
my $recurse = 1; # recurse on subdirectories in $podpath.
+my $quiet = 0; # not quiet by default
my $verbose = 0; # not verbose by default
my $doindex = 1; # non-zero if we should generate an index
+my $backlink = ''; # text for "back to top" links
my $listlevel = 0; # current list depth
-my @listitem = (); # stack of HTML commands to use when a =item is
- # encountered. the top of the stack is the
- # current list.
-my @listdata = (); # similar to @listitem, but for the text after
- # an =item
-my @listend = (); # similar to @listitem, but the text to use to
- # end the list.
+my @listend = (); # the text to use to end the list.
+my $after_lpar = 0; # set to true after a par in an =item
my $ignore = 1; # whether or not to format text. we don't
# format text until we hit our first pod
# directive.
@@ -196,42 +232,45 @@ my %items_named = (); # for the multiples of the same item in perlfunc
my @items_seen = ();
my $netscape = 0; # whether or not to use netscape directives.
my $title; # title to give the pod(s)
+my $header = 0; # produce block header/footer
my $top = 1; # true if we are at the top of the doc. used
# to prevent the first <HR> directive.
my $paragraph; # which paragraph we're processing (used
# for error messages)
+my $ptQuote = 0; # status of double-quote conversion
my %pages = (); # associative array used to find the location
# of pages referenced by L<> links.
my %sections = (); # sections within this page
my %items = (); # associative array used to find the location
# of =item directives referenced by C<> links
+my %local_items = (); # local items - avoid destruction of %items
my $Is83; # is dos with short filenames (8.3)
sub init_globals {
-$dircache = "pod2html-dircache";
-$itemcache = "pod2html-itemcache";
+$dircache = "pod2htmd$cache_ext";
+$itemcache = "pod2htmi$cache_ext";
@begin_stack = (); # begin/end stack
@libpods = (); # files to search for links from C<> directives
$htmlroot = "/"; # http-server base directory from which all
# relative paths in $podpath stem.
+$htmldir = ""; # The directory to which the html pages
+ # will (eventually) be written.
$htmlfile = ""; # write to stdout by default
$podfile = ""; # read from stdin by default
@podpath = (); # list of directories containing library pods.
$podroot = "."; # filesystem base directory from which all
# relative paths in $podpath stem.
+$css = ''; # Cascading style sheet
$recurse = 1; # recurse on subdirectories in $podpath.
+$quiet = 0; # not quiet by default
$verbose = 0; # not verbose by default
$doindex = 1; # non-zero if we should generate an index
+$backlink = ''; # text for "back to top" links
$listlevel = 0; # current list depth
-@listitem = (); # stack of HTML commands to use when a =item is
- # encountered. the top of the stack is the
- # current list.
-@listdata = (); # similar to @listitem, but for the text after
- # an =item
-@listend = (); # similar to @listitem, but the text to use to
- # end the list.
+@listend = (); # the text to use to end the list.
+$after_lpar = 0; # set to true after a par in an =item
$ignore = 1; # whether or not to format text. we don't
# format text until we hit our first pod
# directive.
@@ -239,6 +278,7 @@ $ignore = 1; # whether or not to format text. we don't
@items_seen = ();
%items_named = ();
$netscape = 0; # whether or not to use netscape directives.
+$header = 0; # produce block header/footer
$title = ''; # title to give the pod(s)
$top = 1; # true if we are at the top of the doc. used
# to prevent the first <HR> directive.
@@ -252,9 +292,28 @@ $paragraph = ''; # which paragraph we're processing (used
# of pages referenced by L<> links.
#%items = (); # associative array used to find the location
# of =item directives referenced by C<> links
+%local_items = ();
$Is83=$^O eq 'dos';
}
+#
+# clean_data: global clean-up of pod data
+#
+sub clean_data($){
+ my( $dataref ) = @_;
+ my $i;
+ for( $i = 0; $i <= $#$dataref; $i++ ){
+ ${$dataref}[$i] =~ s/\s+\Z//;
+
+ # have a look for all-space lines
+ if( ${$dataref}[$i] =~ /^\s+$/m ){
+ my @chunks = split( /^\s+$/m, ${$dataref}[$i] );
+ splice( @$dataref, $i, 1, @chunks );
+ }
+ }
+}
+
+
sub pod2html {
local(@ARGV) = @_;
local($/);
@@ -283,19 +342,32 @@ sub pod2html {
}
$htmlfile = "-" unless $htmlfile; # stdout
$htmlroot = "" if $htmlroot eq "/"; # so we don't get a //
+ $htmldir =~ s#/\z## ; # so we don't get a //
+ if ( $htmlroot eq ''
+ && defined( $htmldir )
+ && $htmldir ne ''
+ && substr( $htmlfile, 0, length( $htmldir ) ) eq $htmldir
+ )
+ {
+ # Set the 'base' url for this file, so that we can use it
+ # as the location from which to calculate relative links
+ # to other files. If this is '', then absolute links will
+ # be used throughout.
+ $htmlfileurl= "$htmldir/" . substr( $htmlfile, length( $htmldir ) + 1);
+ }
# read the pod a paragraph at a time
warn "Scanning for sections in input file(s)\n" if $verbose;
$/ = "";
my @poddata = <POD>;
close(POD);
+ clean_data( \@poddata );
# scan the pod for =head[1-6] directives and build an index
my $index = scan_headings(\%sections, @poddata);
unless($index) {
- warn "No pod in $podfile\n" if $verbose;
- return;
+ warn "No headings in $podfile\n" if $verbose;
}
# open the output file
@@ -316,7 +388,7 @@ sub pod2html {
}
}
}
- if (!$title and $podfile =~ /\.pod$/) {
+ if (!$title and $podfile =~ /\.pod\z/) {
# probably a split pod so take first =head[12] as title
for (my $i = 0; $i < @poddata; $i++) {
last if ($title) = $poddata[$i] =~ /^=head[12]\s*(.*)/;
@@ -327,46 +399,63 @@ sub pod2html {
if ($title) {
$title =~ s/\s*\(.*\)//;
} else {
- warn "$0: no title for $podfile";
- $podfile =~ /^(.*)(\.[^.\/]+)?$/;
+ warn "$0: no title for $podfile" unless $quiet;
+ $podfile =~ /^(.*)(\.[^.\/]+)?\z/s;
$title = ($podfile eq "-" ? 'No Title' : $1);
warn "using $title" if $verbose;
}
+ my $csslink = $css ? qq(\n<LINK REL="stylesheet" HREF="$css" TYPE="text/css">) : '';
+ $csslink =~ s,\\,/,g;
+ $csslink =~ s,(/.):,$1|,;
+
+ my $block = $header ? <<END_OF_BLOCK : '';
+<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
+<TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
+<FONT SIZE=+1><STRONG><P CLASS=block>&nbsp;$title</P></STRONG></FONT>
+</TD></TR>
+</TABLE>
+END_OF_BLOCK
+
print HTML <<END_OF_HEAD;
<HTML>
<HEAD>
-<TITLE>$title</TITLE>
+<TITLE>$title</TITLE>$csslink
<LINK REV="made" HREF="mailto:$Config{perladmin}">
</HEAD>
<BODY>
-
+$block
END_OF_HEAD
# load/reload/validate/cache %pages and %items
get_cache($dircache, $itemcache, \@podpath, $podroot, $recurse);
# scan the pod for =item directives
- scan_items("", \%items, @poddata);
+ scan_items( \%local_items, "", @poddata);
# put an index at the top of the file. note, if $doindex is 0 we
# still generate an index, but surround it with an html comment.
# that way some other program can extract it if desired.
$index =~ s/--+/-/g;
+ print HTML "<A NAME=\"__index__\"></A>\n";
print HTML "<!-- INDEX BEGIN -->\n";
print HTML "<!--\n" unless $doindex;
print HTML $index;
print HTML "-->\n" unless $doindex;
print HTML "<!-- INDEX END -->\n\n";
- print HTML "<HR>\n" if $doindex;
+ print HTML "<HR>\n" if $doindex and $index;
# now convert this file
- warn "Converting input file\n" if $verbose;
- foreach my $i (0..$#poddata) {
+ my $after_item; # set to true after an =item
+ warn "Converting input file $podfile\n" if $verbose;
+ foreach my $i (0..$#poddata){
+ $ptQuote = 0; # status of quote conversion
+
$_ = $poddata[$i];
$paragraph = $i+1;
if (/^(=.*)/s) { # is it a pod directive?
$ignore = 0;
+ $after_item = 0;
$_ = $1;
if (/^=begin\s+(\S+)\s*(.*)/si) {# =begin
process_begin($1, $2);
@@ -380,14 +469,17 @@ END_OF_HEAD
next if @begin_stack && $begin_stack[-1] ne 'html';
if (/^=(head[1-6])\s+(.*\S)/s) { # =head[1-6] heading
- process_head($1, $2);
- } elsif (/^=item\s*(.*\S)/sm) { # =item text
- process_item($1);
+ process_head( $1, $2, $doindex && $index );
+ } elsif (/^=item\s*(.*\S)?/sm) { # =item text
+ warn "$0: $podfile: =item without bullet, number or text"
+ . " in paragraph $paragraph.\n" if !defined($1) or $1 eq '';
+ process_item( $1 );
+ $after_item = 1;
} elsif (/^=over\s*(.*)/) { # =over N
process_over();
} elsif (/^=back/) { # =back
process_back();
- } elsif (/^=for\s+(\S+)\s+(.*)/si) {# =for
+ } elsif (/^=for\s+(\S+)\s*(.*)/si) {# =for
process_for($1,$2);
} else {
/^=(\S*)\s*/;
@@ -401,14 +493,55 @@ END_OF_HEAD
next if $ignore;
next if @begin_stack && $begin_stack[-1] ne 'html';
my $text = $_;
- process_text(\$text, 1);
- print HTML "<P>\n$text";
+ if( $text =~ /\A\s+/ ){
+ process_pre( \$text );
+ print HTML "<PRE>\n$text</PRE>\n";
+
+ } else {
+ process_text( \$text );
+
+ # experimental: check for a paragraph where all lines
+ # have some ...\t...\t...\n pattern
+ if( $text =~ /\t/ ){
+ my @lines = split( "\n", $text );
+ if( @lines > 1 ){
+ my $all = 2;
+ foreach my $line ( @lines ){
+ if( $line =~ /\S/ && $line !~ /\t/ ){
+ $all--;
+ last if $all == 0;
+ }
+ }
+ if( $all > 0 ){
+ $text =~ s/\t+/<TD>/g;
+ $text =~ s/^/<TR><TD>/gm;
+ $text = '<TABLE CELLSPACING=0 CELLPADDING=0>' .
+ $text . '</TABLE>';
+ }
+ }
+ }
+ ## end of experimental
+
+ if( $after_item ){
+ print HTML "$text\n";
+ $after_lpar = 1;
+ } else {
+ print HTML "<P>$text</P>\n";
+ }
+ }
+ $after_item = 0;
}
}
# finish off any pending directives
finish_list();
+
+ # link to page index
+ print HTML "<P><A HREF=\"#__index__\"><SMALL>$backlink</SMALL></A></P>\n"
+ if $doindex and $index and $backlink;
+
print HTML <<END_OF_TAIL;
+$block
</BODY>
</HTML>
@@ -435,40 +568,52 @@ Usage: $0 --help --htmlroot=<name> --infile=<name> --outfile=<name>
--libpods=<name>:...:<name> --recurse --verbose --index
--netscape --norecurse --noindex
- --flush - flushes the item and directory caches.
- --help - prints this message.
- --htmlroot - http-server base directory from which all relative paths
- in podpath stem (default is /).
- --index - generate an index at the top of the resulting html
- (default).
- --infile - filename for the pod to convert (input taken from stdin
- by default).
- --libpods - colon-separated list of pages to search for =item pod
- directives in as targets of C<> and implicit links (empty
- by default). note, these are not filenames, but rather
- page names like those that appear in L<> links.
- --netscape - will use netscape html directives when applicable.
- --nonetscape - will not use netscape directives (default).
- --outfile - filename for the resulting html file (output sent to
- stdout by default).
- --podpath - colon-separated list of directories containing library
- pods. empty by default.
- --podroot - filesystem base directory from which all relative paths
- in podpath stem (default is .).
- --noindex - don't generate an index at the top of the resulting html.
- --norecurse - don't recurse on those subdirectories listed in podpath.
- --recurse - recurse on those subdirectories listed in podpath
- (default behavior).
- --title - title that will appear in resulting html file.
- --verbose - self-explanatory
+ --backlink - set text for "back to top" links (default: none).
+ --css - stylesheet URL
+ --flush - flushes the item and directory caches.
+ --[no]header - produce block header/footer (default is no headers).
+ --help - prints this message.
+ --htmldir - directory for resulting HTML files.
+ --htmlroot - http-server base directory from which all relative paths
+ in podpath stem (default is /).
+ --[no]index - generate an index at the top of the resulting html
+ (default behaviour).
+ --infile - filename for the pod to convert (input taken from stdin
+ by default).
+ --libpods - colon-separated list of pages to search for =item pod
+ directives in as targets of C<> and implicit links (empty
+ by default). note, these are not filenames, but rather
+ page names like those that appear in L<> links.
+ --[no]netscape - will use netscape html directives when applicable.
+ (default is not to use them).
+ --outfile - filename for the resulting html file (output sent to
+ stdout by default).
+ --podpath - colon-separated list of directories containing library
+ pods (empty by default).
+ --podroot - filesystem base directory from which all relative paths
+ in podpath stem (default is .).
+ --[no]quiet - supress some benign warning messages (default is off).
+ --[no]recurse - recurse on those subdirectories listed in podpath
+ (default behaviour).
+ --title - title that will appear in resulting html file.
+ --[no]verbose - self-explanatory (off by default).
END_OF_USAGE
sub parse_command_line {
- my ($opt_flush,$opt_help,$opt_htmlroot,$opt_index,$opt_infile,$opt_libpods,$opt_netscape,$opt_outfile,$opt_podpath,$opt_podroot,$opt_norecurse,$opt_recurse,$opt_title,$opt_verbose);
+ my ($opt_backlink,$opt_css,$opt_flush,$opt_header,$opt_help,$opt_htmldir,
+ $opt_htmlroot,$opt_index,$opt_infile,$opt_libpods,$opt_netscape,
+ $opt_outfile,$opt_podpath,$opt_podroot,$opt_quiet,$opt_recurse,
+ $opt_title,$opt_verbose);
+
+ unshift @ARGV, split ' ', $Config{pod2html} if $Config{pod2html};
my $result = GetOptions(
+ 'backlink=s' => \$opt_backlink,
+ 'css=s' => \$opt_css,
'flush' => \$opt_flush,
+ 'header!' => \$opt_header,
'help' => \$opt_help,
+ 'htmldir=s' => \$opt_htmldir,
'htmlroot=s' => \$opt_htmlroot,
'index!' => \$opt_index,
'infile=s' => \$opt_infile,
@@ -477,34 +622,37 @@ sub parse_command_line {
'outfile=s' => \$opt_outfile,
'podpath=s' => \$opt_podpath,
'podroot=s' => \$opt_podroot,
- 'norecurse' => \$opt_norecurse,
+ 'quiet!' => \$opt_quiet,
'recurse!' => \$opt_recurse,
'title=s' => \$opt_title,
- 'verbose' => \$opt_verbose,
+ 'verbose!' => \$opt_verbose,
);
usage("-", "invalid parameters") if not $result;
usage("-") if defined $opt_help; # see if the user asked for help
$opt_help = ""; # just to make -w shut-up.
- $podfile = $opt_infile if defined $opt_infile;
- $htmlfile = $opt_outfile if defined $opt_outfile;
-
@podpath = split(":", $opt_podpath) if defined $opt_podpath;
@libpods = split(":", $opt_libpods) if defined $opt_libpods;
+ $backlink = $opt_backlink if defined $opt_backlink;
+ $css = $opt_css if defined $opt_css;
+ $header = $opt_header if defined $opt_header;
+ $htmldir = $opt_htmldir if defined $opt_htmldir;
+ $htmlroot = $opt_htmlroot if defined $opt_htmlroot;
+ $doindex = $opt_index if defined $opt_index;
+ $podfile = $opt_infile if defined $opt_infile;
+ $netscape = $opt_netscape if defined $opt_netscape;
+ $htmlfile = $opt_outfile if defined $opt_outfile;
+ $podroot = $opt_podroot if defined $opt_podroot;
+ $quiet = $opt_quiet if defined $opt_quiet;
+ $recurse = $opt_recurse if defined $opt_recurse;
+ $title = $opt_title if defined $opt_title;
+ $verbose = $opt_verbose if defined $opt_verbose;
+
warn "Flushing item and directory caches\n"
if $opt_verbose && defined $opt_flush;
unlink($dircache, $itemcache) if defined $opt_flush;
-
- $htmlroot = $opt_htmlroot if defined $opt_htmlroot;
- $podroot = $opt_podroot if defined $opt_podroot;
-
- $doindex = $opt_index if defined $opt_index;
- $recurse = $opt_recurse if defined $opt_recurse;
- $title = $opt_title if defined $opt_title;
- $verbose = defined $opt_verbose ? 1 : 0;
- $netscape = $opt_netscape if defined $opt_netscape;
}
@@ -542,7 +690,7 @@ sub get_cache {
sub cache_key {
my($dircache, $itemcache, $podpath, $podroot, $recurse) = @_;
return join('!', $dircache, $itemcache, $recurse,
- @$podpath, $podroot, stat($dircache), stat($itemcache));
+ @$podpath, $podroot, stat($dircache), stat($itemcache));
}
#
@@ -550,7 +698,6 @@ sub cache_key {
# are valid caches of %pages and %items. if they are valid then it loads
# them and returns a non-zero value.
#
-
sub load_cache {
my($dircache, $itemcache, $podpath, $podroot) = @_;
my($tests);
@@ -648,12 +795,14 @@ sub scan_podpath {
next unless defined $pages{$libpod} && $pages{$libpod};
# if there is a directory then use the .pod and .pm files within it.
- if ($pages{$libpod} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+ # NOTE: Only finds the first so-named directory in the tree.
+# if ($pages{$libpod} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+ if ($pages{$libpod} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) {
# find all the .pod and .pm files within the directory
$dirname = $1;
opendir(DIR, $dirname) ||
die "$0: error opening directory $dirname: $!\n";
- @files = grep(/(\.pod|\.pm)$/ && ! -d $_, readdir(DIR));
+ @files = grep(/(\.pod|\.pm)\z/ && ! -d $_, readdir(DIR));
closedir(DIR);
# scan each .pod and .pm file for =item directives
@@ -662,15 +811,17 @@ sub scan_podpath {
die "$0: error opening $dirname/$pod for input: $!\n";
@poddata = <POD>;
close(POD);
+ clean_data( \@poddata );
- scan_items("$dirname/$pod", @poddata);
+ scan_items( \%items, "$dirname/$pod", @poddata);
}
# use the names of files as =item directives too.
- foreach $pod (@files) {
- $pod =~ /^(.*)(\.pod|\.pm)$/;
- $items{$1} = "$dirname/$1.html" if $1;
- }
+### Don't think this should be done this way - confuses issues.(WL)
+### foreach $pod (@files) {
+### $pod =~ /^(.*)(\.pod|\.pm)$/;
+### $items{$1} = "$dirname/$1.html" if $1;
+### }
} elsif ($pages{$libpod} =~ /([^:]*\.pod):/ ||
$pages{$libpod} =~ /([^:]*\.pm):/) {
# scan the .pod or .pm file for =item directives
@@ -679,8 +830,9 @@ sub scan_podpath {
die "$0: error opening $pod for input: $!\n";
@poddata = <POD>;
close(POD);
+ clean_data( \@poddata );
- scan_items("$pod", @poddata);
+ scan_items( \%items, "$pod", @poddata);
} else {
warn "$0: shouldn't be here (line ".__LINE__."\n";
}
@@ -736,13 +888,13 @@ sub scan_dir {
$pages{$_} = "" unless defined $pages{$_};
$pages{$_} .= "$dir/$_:";
push(@subdirs, $_);
- } elsif (/\.pod$/) { # .pod
- s/\.pod$//;
+ } elsif (/\.pod\z/) { # .pod
+ s/\.pod\z//;
$pages{$_} = "" unless defined $pages{$_};
$pages{$_} .= "$dir/$_.pod:";
push(@pods, "$dir/$_.pod");
- } elsif (/\.pm$/) { # .pm
- s/\.pm$//;
+ } elsif (/\.pm\z/) { # .pm
+ s/\.pm\z//;
$pages{$_} = "" unless defined $pages{$_};
$pages{$_} .= "$dir/$_.pm:";
push(@pods, "$dir/$_.pm");
@@ -764,7 +916,7 @@ sub scan_dir {
#
sub scan_headings {
my($sections, @data) = @_;
- my($tag, $which_head, $title, $listdepth, $index);
+ my($tag, $which_head, $otitle, $listdepth, $index);
# here we need local $ignore = 0;
# unfortunately, we can't have it, because $ignore is lexical
@@ -777,9 +929,12 @@ sub scan_headings {
# pointing to each of them.
foreach my $line (@data) {
if ($line =~ /^=(head)([1-6])\s+(.*)/) {
- ($tag,$which_head, $title) = ($1,$2,$3);
- chomp($title);
- $$sections{htmlify(0,$title)} = 1;
+ ($tag, $which_head, $otitle) = ($1,$2,$3);
+
+ my $title = depod( $otitle );
+ my $name = htmlify( $title );
+ $$sections{$name} = 1;
+ $title = process_text( \$otitle );
while ($which_head != $listdepth) {
if ($which_head > $listdepth) {
@@ -792,8 +947,8 @@ sub scan_headings {
}
$index .= "\n" . ("\t" x $listdepth) . "<LI>" .
- "<A HREF=\"#" . htmlify(0,$title) . "\">" .
- html_escape(process_text(\$title, 0)) . "</A>";
+ "<A HREF=\"#" . $name . "\">" .
+ $title . "</A></LI>";
}
}
@@ -815,36 +970,30 @@ sub scan_headings {
# will use this information later on in resolving C<> links.
#
sub scan_items {
- my($pod, @poddata) = @_;
+ my( $itemref, $pod, @poddata ) = @_;
my($i, $item);
local $_;
- $pod =~ s/\.pod$//;
+ $pod =~ s/\.pod\z//;
$pod .= ".html" if $pod;
foreach $i (0..$#poddata) {
- $_ = $poddata[$i];
-
- # remove any formatting instructions
- s,[A-Z]<([^<>]*)>,$1,g;
-
- # figure out what kind of item it is and get the first word of
- # it's name.
- if (/^=item\s+(\w*)\s*.*$/s) {
- if ($1 eq "*") { # bullet list
- /\A=item\s+\*\s*(.*?)\s*\Z/s;
- $item = $1;
- } elsif ($1 =~ /^\d+/) { # numbered list
- /\A=item\s+\d+\.?(.*?)\s*\Z/s;
- $item = $1;
- } else {
-# /\A=item\s+(.*?)\s*\Z/s;
- /\A=item\s+(\w*)/s;
- $item = $1;
- }
-
- $items{$item} = "$pod" if $item;
+ my $txt = depod( $poddata[$i] );
+
+ # figure out what kind of item it is.
+ # Build string for referencing this item.
+ if ( $txt =~ /\A=item\s+\*\s*(.*)\Z/s ) { # bullet
+ next unless $1;
+ $item = $1;
+ } elsif( $txt =~ /\A=item\s+(?>\d+\.?)\s*(.*)\Z/s ) { # numbered list
+ $item = $1;
+ } elsif( $txt =~ /\A=item\s+(.*)\Z/s ) { # plain item
+ $item = $1;
+ } else {
+ next;
}
+ my $fid = fragment_id( $item );
+ $$itemref{$fid} = "$pod" if $fid;
}
}
@@ -852,168 +1001,167 @@ sub scan_items {
# process_head - convert a pod head[1-6] tag and convert it to HTML format.
#
sub process_head {
- my($tag, $heading) = @_;
- my $firstword;
+ my($tag, $heading, $hasindex) = @_;
# figure out the level of the =head
$tag =~ /head([1-6])/;
my $level = $1;
- # can't have a heading full of spaces and speechmarks and so on
- $firstword = $heading; $firstword =~ s/\s*(\w+)\s.*/$1/;
-
- print HTML "<P>\n" unless $listlevel;
- print HTML "<HR>\n" unless $listlevel || $top;
- print HTML "<H$level>"; # unless $listlevel;
- #print HTML "<H$level>" unless $listlevel;
- my $convert = $heading; process_text(\$convert, 0);
- $convert = html_escape($convert);
- print HTML '<A NAME="' . htmlify(0,$heading) . "\">$convert</A>";
- print HTML "</H$level>"; # unless $listlevel;
- print HTML "\n";
+ if( $listlevel ){
+ warn "$0: $podfile: unterminated list at =head in paragraph $paragraph. ignoring.\n";
+ while( $listlevel ){
+ process_back();
+ }
+ }
+
+ print HTML "<P>\n";
+ if( $level == 1 && ! $top ){
+ print HTML "<A HREF=\"#__index__\"><SMALL>$backlink</SMALL></A>\n"
+ if $hasindex and $backlink;
+ print HTML "<HR>\n"
+ }
+
+ my $name = htmlify( depod( $heading ) );
+ my $convert = process_text( \$heading );
+ print HTML "<H$level><A NAME=\"$name\">$convert</A></H$level>\n";
}
+
#
-# process_item - convert a pod item tag and convert it to HTML format.
+# emit_item_tag - print an =item's text
+# Note: The global $EmittedItem is used for inhibiting self-references.
#
-sub process_item {
- my $text = $_[0];
- my($i, $quote, $name);
+my $EmittedItem;
+
+sub emit_item_tag($$$){
+ my( $otext, $text, $compact ) = @_;
+ my $item = fragment_id( $text );
- my $need_preamble = 0;
- my $this_entry;
+ $EmittedItem = $item;
+ ### print STDERR "emit_item_tag=$item ($text)\n";
+ print HTML '<STRONG>';
+ if ($items_named{$item}++) {
+ print HTML process_text( \$otext );
+ } else {
+ my $name = 'item_' . $item;
+ print HTML qq{<A NAME="$name">}, process_text( \$otext ), '</A>';
+ }
+ print HTML "</STRONG><BR>\n";
+ undef( $EmittedItem );
+}
+
+sub emit_li {
+ my( $tag ) = @_;
+ if( $items_seen[$listlevel]++ == 0 ){
+ push( @listend, "</$tag>" );
+ print HTML "<$tag>\n";
+ }
+ print HTML $tag eq 'DL' ? '<DT>' : '<LI>';
+}
+
+#
+# process_item - convert a pod item tag and convert it to HTML format.
+#
+sub process_item {
+ my( $otext ) = @_;
# lots of documents start a list without doing an =over. this is
# bad! but, the proper thing to do seems to be to just assume
# they did do an =over. so warn them once and then continue.
- warn "$0: $podfile: unexpected =item directive in paragraph $paragraph. ignoring.\n"
- unless $listlevel;
- process_over() unless $listlevel;
+ if( $listlevel == 0 ){
+ warn "$0: $podfile: unexpected =item directive in paragraph $paragraph. ignoring.\n";
+ process_over();
+ }
- return unless $listlevel;
+ # formatting: insert a paragraph if preceding item has >1 paragraph
+ if( $after_lpar ){
+ print HTML "<P></P>\n";
+ $after_lpar = 0;
+ }
# remove formatting instructions from the text
- 1 while $text =~ s/[A-Z]<([^<>]*)>/$1/g;
- pre_escape(\$text);
-
- $need_preamble = $items_seen[$listlevel]++ == 0;
-
- # check if this is the first =item after an =over
- $i = $listlevel - 1;
- my $need_new = $listlevel >= @listitem;
-
- if ($text =~ /\A\*/) { # bullet
-
- if ($need_preamble) {
- push(@listend, "</UL>");
- print HTML "<UL>\n";
- }
-
- print HTML '<LI>';
- if ($text =~ /\A\*\s*(.+)\Z/s) {
- print HTML '<STRONG>';
- if ($items_named{$1}++) {
- print HTML html_escape($1);
- } else {
- my $name = 'item_' . htmlify(1,$1);
- print HTML qq(<A NAME="$name">), html_escape($1), '</A>';
- }
- print HTML '</STRONG>';
- }
-
- } elsif ($text =~ /\A[\d#]+/) { # numbered list
-
- if ($need_preamble) {
- push(@listend, "</OL>");
- print HTML "<OL>\n";
- }
-
- print HTML '<LI>';
- if ($text =~ /\A\d+\.?\s*(.+)\Z/s) {
- print HTML '<STRONG>';
- if ($items_named{$1}++) {
- print HTML html_escape($1);
- } else {
- my $name = 'item_' . htmlify(0,$1);
- print HTML qq(<A NAME="$name">), html_escape($1), '</A>';
- }
- print HTML '</STRONG>';
+ my $text = depod( $otext );
+
+ # all the list variants:
+ if( $text =~ /\A\*/ ){ # bullet
+ emit_li( 'UL' );
+ if ($text =~ /\A\*\s+(.+)\Z/s ) { # with additional text
+ my $tag = $1;
+ $otext =~ s/\A\*\s+//;
+ emit_item_tag( $otext, $tag, 1 );
}
- } else { # all others
-
- if ($need_preamble) {
- push(@listend, '</DL>');
- print HTML "<DL>\n";
+ } elsif( $text =~ /\A\d+/ ){ # numbered list
+ emit_li( 'OL' );
+ if ($text =~ /\A(?>\d+\.?)\s*(.+)\Z/s ) { # with additional text
+ my $tag = $1;
+ $otext =~ s/\A\d+\.?\s*//;
+ emit_item_tag( $otext, $tag, 1 );
}
- print HTML '<DT>';
- if ($text =~ /(\S+)/) {
- print HTML '<STRONG>';
- if ($items_named{$1}++) {
- print HTML html_escape($text);
- } else {
- my $name = 'item_' . htmlify(1,$text);
- print HTML qq(<A NAME="$name">), html_escape($text), '</A>';
- }
- print HTML '</STRONG>';
+ } else { # definition list
+ emit_li( 'DL' );
+ if ($text =~ /\A(.+)\Z/s ){ # should have text
+ emit_item_tag( $otext, $text, 1 );
}
print HTML '<DD>';
}
-
print HTML "\n";
}
#
-# process_over - process a pod over tag and start a corresponding HTML
-# list.
+# process_over - process a pod over tag and start a corresponding HTML list.
#
sub process_over {
# start a new list
$listlevel++;
+ push( @items_seen, 0 );
+ $after_lpar = 0;
}
#
# process_back - process a pod back tag and convert it to HTML format.
#
sub process_back {
- warn "$0: $podfile: unexpected =back directive in paragraph $paragraph. ignoring.\n"
- unless $listlevel;
- return unless $listlevel;
+ if( $listlevel == 0 ){
+ warn "$0: $podfile: unexpected =back directive in paragraph $paragraph. ignoring.\n";
+ return;
+ }
# close off the list. note, I check to see if $listend[$listlevel] is
# defined because an =item directive may have never appeared and thus
# $listend[$listlevel] may have never been initialized.
$listlevel--;
- print HTML $listend[$listlevel] if defined $listend[$listlevel];
- print HTML "\n";
-
- # don't need the corresponding perl code anymore
- pop(@listitem);
- pop(@listdata);
- pop(@listend);
+ if( defined $listend[$listlevel] ){
+ print HTML '<P></P>' if $after_lpar;
+ print HTML $listend[$listlevel];
+ print HTML "\n";
+ pop( @listend );
+ }
+ $after_lpar = 0;
- pop(@items_seen);
+ # clean up item count
+ pop( @items_seen );
}
#
-# process_cut - process a pod cut tag, thus stop ignoring pod directives.
+# process_cut - process a pod cut tag, thus start ignoring pod directives.
#
sub process_cut {
$ignore = 1;
}
#
-# process_pod - process a pod pod tag, thus ignore pod directives until we see a
-# corresponding cut.
+# process_pod - process a pod pod tag, thus stop ignoring pod directives
+# until we see a corresponding cut.
#
sub process_pod {
# no need to set $ignore to 0 cause the main loop did it
}
#
-# process_for - process a =for pod tag. if it's for html, split
+# process_for - process a =for pod tag. if it's for html, spit
# it out verbatim, if illustration, center it, otherwise ignore it.
#
sub process_for {
@@ -1053,54 +1201,69 @@ sub process_end {
if ($begin_stack[-1] ne $whom ) {
die "Unmatched begin/end at chunk $paragraph\n"
}
- pop @begin_stack;
+ pop( @begin_stack );
}
#
-# process_text - handles plaintext that appears in the input pod file.
-# there may be pod commands embedded within the text so those must be
-# converted to html commands.
+# process_pre - indented paragraph, made into <PRE></PRE>
#
-sub process_text {
- my($text, $escapeQuotes) = @_;
- my($result, $rest, $s1, $s2, $s3, $s4, $match, $bf);
- my($podcommand, $params, $tag, $quote);
-
+sub process_pre {
+ my( $text ) = @_;
+ my( $rest );
return if $ignore;
- $quote = 0; # status of double-quote conversion
- $result = "";
$rest = $$text;
- if ($rest =~ /^\s+/) { # preformatted text, no pod directives
- $rest =~ s/\n+\Z//;
- $rest =~ s#.*#
+ # insert spaces in place of tabs
+ $rest =~ s#.*#
my $line = $&;
1 while $line =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
$line;
#eg;
- $rest =~ s/&/&amp;/g;
- $rest =~ s/</&lt;/g;
- $rest =~ s/>/&gt;/g;
- $rest =~ s/"/&quot;/g;
-
- # try and create links for all occurrences of perl.* within
- # the preformatted text.
- $rest =~ s{
- (\s*)(perl\w+)
- }{
- if (defined $pages{$2}) { # is a link
- qq($1<A HREF="$htmlroot/$pages{$2}">$2</A>);
- } elsif (defined $pages{dosify($2)}) { # is a link
- qq($1<A HREF="$htmlroot/$pages{dosify($2)}">$2</A>);
- } else {
- "$1$2";
- }
- }xeg;
- $rest =~ s/(<A HREF=)([^>:]*:)?([^>:]*)\.pod:([^>:]*:)?/$1$3.html/g;
-
- my $urls = '(' . join ('|', qw{
+ # convert some special chars to HTML escapes
+ $rest =~ s/&/&amp;/g;
+ $rest =~ s/</&lt;/g;
+ $rest =~ s/>/&gt;/g;
+ $rest =~ s/"/&quot;/g;
+
+ # try and create links for all occurrences of perl.* within
+ # the preformatted text.
+ $rest =~ s{
+ (\s*)(perl\w+)
+ }{
+ if ( defined $pages{$2} ){ # is a link
+ qq($1<A HREF="$htmlroot/$pages{$2}">$2</A>);
+ } elsif (defined $pages{dosify($2)}) { # is a link
+ qq($1<A HREF="$htmlroot/$pages{dosify($2)}">$2</A>);
+ } else {
+ "$1$2";
+ }
+ }xeg;
+ $rest =~ s{
+ (<A\ HREF="?) ([^>:]*:)? ([^>:]*) \.pod: ([^>:]*:)?
+ }{
+ my $url ;
+ if ( $htmlfileurl ne '' ){
+ # Here, we take advantage of the knowledge
+ # that $htmlfileurl ne '' implies $htmlroot eq ''.
+ # Since $htmlroot eq '', we need to prepend $htmldir
+ # on the fron of the link to get the absolute path
+ # of the link's target. We check for a leading '/'
+ # to avoid corrupting links that are #, file:, etc.
+ my $old_url = $3 ;
+ $old_url = "$htmldir$old_url" if $old_url =~ m{^\/};
+ $url = relativize_url( "$old_url.html", $htmlfileurl );
+ } else {
+ $url = "$3.html" ;
+ }
+ "$1$url" ;
+ }xeg;
+
+ # Look for embedded URLs and make them into links. We don't
+ # relativize them since they are best left as the author intended.
+
+ my $urls = '(' . join ('|', qw{
http
telnet
mailto
@@ -1112,15 +1275,16 @@ sub process_text {
} )
. ')';
- my $ltrs = '\w';
- my $gunk = '/#~:.?+=&%@!\-';
- my $punc = '.:?\-';
- my $any = "${ltrs}${gunk}${punc}";
+ my $ltrs = '\w';
+ my $gunk = '/#~:.?+=&%@!\-';
+ my $punc = '.:?\-';
+ my $any = "${ltrs}${gunk}${punc}";
- $rest =~ s{
+ $rest =~ s{
\b # start at word boundary
( # begin $1 {
$urls : # need resource and a colon
+ (?!:) # Ignore File::, among others.
[$any] +? # followed by on or more
# of any valid character, but
# be conservative and take only
@@ -1134,168 +1298,81 @@ sub process_text {
)
}{<A HREF="$1">$1</A>}igox;
- $result = "<PRE>" # text should be as it is (verbatim)
- . "$rest\n"
- . "</PRE>\n";
- } else { # formatted text
- # parse through the string, stopping each time we find a
- # pod-escape. once the string has been throughly processed
- # we can output it.
- while (length $rest) {
- # check to see if there are any possible pod directives in
- # the remaining part of the text.
- if ($rest =~ m/[BCEIFLSZ]</) {
- warn "\$rest\t= $rest\n" unless
- $rest =~ /\A
- ([^<]*?)
- ([BCEIFLSZ]?)
- <
- (.*)\Z/xs;
-
- $s1 = $1; # pure text
- $s2 = $2; # the type of pod-escape that follows
- $s3 = '<'; # '<'
- $s4 = $3; # the rest of the string
- } else {
- $s1 = $rest;
- $s2 = "";
- $s3 = "";
- $s4 = "";
- }
-
- if ($s3 eq '<' && $s2) { # a pod-escape
- $result .= ($escapeQuotes ? process_puretext($s1, \$quote) : $s1);
- $podcommand = "$s2<";
- $rest = $s4;
-
- # find the matching '>'
- $match = 1;
- $bf = 0;
- while ($match && !$bf) {
- $bf = 1;
- if ($rest =~ /\A([^<>]*[BCEIFLSZ]<)(.*)\Z/s) {
- $bf = 0;
- $match++;
- $podcommand .= $1;
- $rest = $2;
- } elsif ($rest =~ /\A([^>]*>)(.*)\Z/s) {
- $bf = 0;
- $match--;
- $podcommand .= $1;
- $rest = $2;
- }
- }
-
- if ($match != 0) {
- warn <<WARN;
-$0: $podfile: cannot find matching > for $s2 in paragraph $paragraph.
-WARN
- $result .= substr $podcommand, 0, 2;
- $rest = substr($podcommand, 2) . $rest;
- next;
- }
+ # text should be as it is (verbatim)
+ $$text = $rest;
+}
- # pull out the parameters to the pod-escape
- $podcommand =~ /^([BCFEILSZ]?)<(.*)>$/s;
- $tag = $1;
- $params = $2;
-
- # process the text within the pod-escape so that any escapes
- # which must occur do.
- process_text(\$params, 0) unless $tag eq 'L';
-
- $s1 = $params;
- if (!$tag || $tag eq " ") { # <> : no tag
- $s1 = "&lt;$params&gt;";
- } elsif ($tag eq "L") { # L<> : link
- $s1 = process_L($params);
- } elsif ($tag eq "I" || # I<> : italicize text
- $tag eq "B" || # B<> : bold text
- $tag eq "F") { # F<> : file specification
- $s1 = process_BFI($tag, $params);
- } elsif ($tag eq "C") { # C<> : literal code
- $s1 = process_C($params, 1);
- } elsif ($tag eq "E") { # E<> : escape
- $s1 = process_E($params);
- } elsif ($tag eq "Z") { # Z<> : zero-width character
- $s1 = process_Z($params);
- } elsif ($tag eq "S") { # S<> : non-breaking space
- $s1 = process_S($params);
- } elsif ($tag eq "X") { # S<> : non-breaking space
- $s1 = process_X($params);
- } else {
- warn "$0: $podfile: unhandled tag '$tag' in paragraph $paragraph\n";
- }
- $result .= "$s1";
- } else {
- # for pure text we must deal with implicit links and
- # double-quotes among other things.
- $result .= ($escapeQuotes ? process_puretext("$s1$s2$s3", \$quote) : "$s1$s2$s3");
- $rest = $s4;
- }
- }
- }
- $$text = $result;
+#
+# pure text processing
+#
+# pure_text/inIS_text: differ with respect to automatic C<> recognition.
+# we don't want this to happen within IS
+#
+sub pure_text($){
+ my $text = shift();
+ process_puretext( $text, \$ptQuote, 1 );
}
-sub html_escape {
- my $rest = $_[0];
- $rest =~ s/&/&amp;/g;
- $rest =~ s/</&lt;/g;
- $rest =~ s/>/&gt;/g;
- $rest =~ s/"/&quot;/g;
- return $rest;
-}
+sub inIS_text($){
+ my $text = shift();
+ process_puretext( $text, \$ptQuote, 0 );
+}
#
# process_puretext - process pure text (without pod-escapes) converting
# double-quotes and handling implicit C<> links.
#
sub process_puretext {
- my($text, $quote) = @_;
- my(@words, $result, $rest, $lead, $trail);
+ my($text, $quote, $notinIS) = @_;
- # convert double-quotes to single-quotes
- $text =~ s/\A([^"]*)"/$1''/s if $$quote;
- while ($text =~ s/\A([^"]*)["]([^"]*)["]/$1``$2''/sg) {}
+ ## Guessing at func() or [$@%&]*var references in plain text is destined
+ ## to produce some strange looking ref's. uncomment to disable:
+ ## $notinIS = 0;
- $$quote = ($text =~ m/"/ ? 1 : 0);
- $text =~ s/\A([^"]*)"/$1``/s if $$quote;
+ my(@words, $lead, $trail);
+
+ # convert double-quotes to single-quotes
+ if( $$quote && $text =~ s/"/''/s ){
+ $$quote = 0;
+ }
+ while ($text =~ s/"([^"]*)"/``$1''/sg) {};
+ $$quote = 1 if $text =~ s/"/``/s;
# keep track of leading and trailing white-space
- $lead = ($text =~ /\A(\s*)/s ? $1 : "");
- $trail = ($text =~ /(\s*)\Z/s ? $1 : "");
+ $lead = ($text =~ s/\A(\s+)//s ? $1 : "");
+ $trail = ($text =~ s/(\s+)\Z//s ? $1 : "");
- # collapse all white space into a single space
- $text =~ s/\s+/ /g;
- @words = split(" ", $text);
+ # split at space/non-space boundaries
+ @words = split( /(?<=\s)(?=\S)|(?<=\S)(?=\s)/, $text );
# process each word individually
foreach my $word (@words) {
+ # skip space runs
+ next if $word =~ /^\s*$/;
# see if we can infer a link
- if ($word =~ /^\w+\(/) {
+ if( $notinIS && $word =~ /^(\w+)\((.*)\)$/ ) {
# has parenthesis so should have been a C<> ref
- $word = process_C($word);
-# $word =~ /^[^()]*]\(/;
-# if (defined $items{$1} && $items{$1}) {
-# $word = "\n<CODE><A HREF=\"$htmlroot/$items{$1}#item_"
-# . htmlify(0,$word)
-# . "\">$word</A></CODE>";
-# } elsif (defined $items{$word} && $items{$word}) {
-# $word = "\n<CODE><A HREF=\"$htmlroot/$items{$word}#item_"
-# . htmlify(0,$word)
-# . "\">$word</A></CODE>";
-# } else {
-# $word = "\n<CODE><A HREF=\"#item_"
-# . htmlify(0,$word)
-# . "\">$word</A></CODE>";
-# }
- } elsif ($word =~ /^[\$\@%&*]+\w+$/) {
- # perl variables, should be a C<> ref
- $word = process_C($word, 1);
+ ## try for a pagename (perlXXX(1))?
+ my( $func, $args ) = ( $1, $2 );
+ if( $args =~ /^\d+$/ ){
+ my $url = page_sect( $word, '' );
+ if( defined $url ){
+ $word = "<A HREF=\"$url\">the $word manpage</A>";
+ next;
+ }
+ }
+ ## try function name for a link, append tt'ed argument list
+ $word = emit_C( $func, '', "($args)");
+
+#### disabled. either all (including $\W, $\w+{.*} etc.) or nothing.
+## } elsif( $notinIS && $word =~ /^[\$\@%&*]+\w+$/) {
+## # perl variables, should be a C<> ref
+## $word = emit_C( $word );
+
} elsif ($word =~ m,^\w+://\w,) {
# looks like a URL
+ # Don't relativize it: leave it as the author intended
$word = qq(<A HREF="$word">$word</A>);
} elsif ($word =~ /[\w.-]+\@[\w-]+\.\w/) {
# looks like an e-mail address
@@ -1311,42 +1388,283 @@ sub process_puretext {
}
}
- # build a new string based upon our conversion
- $result = "";
- $rest = join(" ", @words);
- while (length($rest) > 75) {
- if ( $rest =~ m/^(.{0,75})\s(.*?)$/o ||
- $rest =~ m/^(\S*)\s(.*?)$/o) {
+ # put everything back together
+ return $lead . join( '', @words ) . $trail;
+}
- $result .= "$1\n";
- $rest = $2;
+
+#
+# process_text - handles plaintext that appears in the input pod file.
+# there may be pod commands embedded within the text so those must be
+# converted to html commands.
+#
+
+sub process_text1($$;$$);
+sub pattern ($) { $_[0] ? '[^\S\n]+'.('>' x ($_[0] + 1)) : '>' }
+sub closing ($) { local($_) = shift; (defined && s/\s+$//) ? length : 0 }
+
+sub process_text {
+ return if $ignore;
+ my( $tref ) = @_;
+ my $res = process_text1( 0, $tref );
+ $$tref = $res;
+}
+
+sub process_text1($$;$$){
+ my( $lev, $rstr, $func, $closing ) = @_;
+ my $res = '';
+
+ unless (defined $func) {
+ $func = '';
+ $lev++;
+ }
+
+ if( $func eq 'B' ){
+ # B<text> - boldface
+ $res = '<STRONG>' . process_text1( $lev, $rstr ) . '</STRONG>';
+
+ } elsif( $func eq 'C' ){
+ # C<code> - can be a ref or <CODE></CODE>
+ # need to extract text
+ my $par = go_ahead( $rstr, 'C', $closing );
+
+ ## clean-up of the link target
+ my $text = depod( $par );
+
+ ### my $x = $par =~ /[BI]</ ? 'yes' : 'no' ;
+ ### print STDERR "-->call emit_C($par) lev=$lev, par with BI=$x\n";
+
+ $res = emit_C( $text, $lev > 1 || ($par =~ /[BI]</) );
+
+ } elsif( $func eq 'E' ){
+ # E<x> - convert to character
+ $$rstr =~ s/^(\w+)>//;
+ $res = "&$1;";
+
+ } elsif( $func eq 'F' ){
+ # F<filename> - italizice
+ $res = '<EM>' . process_text1( $lev, $rstr ) . '</EM>';
+
+ } elsif( $func eq 'I' ){
+ # I<text> - italizice
+ $res = '<EM>' . process_text1( $lev, $rstr ) . '</EM>';
+
+ } elsif( $func eq 'L' ){
+ # L<link> - link
+ ## L<text|cross-ref> => produce text, use cross-ref for linking
+ ## L<cross-ref> => make text from cross-ref
+ ## need to extract text
+ my $par = go_ahead( $rstr, 'L', $closing );
+
+ # some L<>'s that shouldn't be:
+ # a) full-blown URL's are emitted as-is
+ if( $par =~ m{^\w+://}s ){
+ return make_URL_href( $par );
+ }
+ # b) C<...> is stripped and treated as C<>
+ if( $par =~ /^C<(.*)>$/ ){
+ my $text = depod( $1 );
+ return emit_C( $text, $lev > 1 || ($par =~ /[BI]</) );
+ }
+
+ # analyze the contents
+ $par =~ s/\n/ /g; # undo word-wrapped tags
+ my $opar = $par;
+ my $linktext;
+ if( $par =~ s{^([^|]+)\|}{} ){
+ $linktext = $1;
+ }
+
+ # make sure sections start with a /
+ $par =~ s{^"}{/"};
+
+ my( $page, $section, $ident );
+
+ # check for link patterns
+ if( $par =~ m{^([^/]+?)/(?!")(.*?)$} ){ # name/ident
+ # we've got a name/ident (no quotes)
+ ( $page, $ident ) = ( $1, $2 );
+ ### print STDERR "--> L<$par> to page $page, ident $ident\n";
+
+ } elsif( $par =~ m{^(.*?)/"?(.*?)"?$} ){ # [name]/"section"
+ # even though this should be a "section", we go for ident first
+ ( $page, $ident ) = ( $1, $2 );
+ ### print STDERR "--> L<$par> to page $page, section $section\n";
+
+ } elsif( $par =~ /\s/ ){ # this must be a section with missing quotes
+ ( $page, $section ) = ( '', $par );
+ ### print STDERR "--> L<$par> to void page, section $section\n";
+
+ } else {
+ ( $page, $section ) = ( $par, '' );
+ ### print STDERR "--> L<$par> to page $par, void section\n";
+ }
+
+ # now, either $section or $ident is defined. the convoluted logic
+ # below tries to resolve L<> according to what the user specified.
+ # failing this, we try to find the next best thing...
+ my( $url, $ltext, $fid );
+
+ RESOLVE: {
+ if( defined $ident ){
+ ## try to resolve $ident as an item
+ ( $url, $fid ) = coderef( $page, $ident );
+ if( $url ){
+ if( ! defined( $linktext ) ){
+ $linktext = $ident;
+ $linktext .= " in " if $ident && $page;
+ $linktext .= "the $page manpage" if $page;
+ }
+ ### print STDERR "got coderef url=$url\n";
+ last RESOLVE;
+ }
+ ## no luck: go for a section (auto-quoting!)
+ $section = $ident;
+ }
+ ## now go for a section
+ my $htmlsection = htmlify( $section );
+ $url = page_sect( $page, $htmlsection );
+ if( $url ){
+ if( ! defined( $linktext ) ){
+ $linktext = $section;
+ $linktext .= " in " if $section && $page;
+ $linktext .= "the $page manpage" if $page;
+ }
+ ### print STDERR "got page/section url=$url\n";
+ last RESOLVE;
+ }
+ ## no luck: go for an ident
+ if( $section ){
+ $ident = $section;
+ } else {
+ $ident = $page;
+ $page = undef();
+ }
+ ( $url, $fid ) = coderef( $page, $ident );
+ if( $url ){
+ if( ! defined( $linktext ) ){
+ $linktext = $ident;
+ $linktext .= " in " if $ident && $page;
+ $linktext .= "the $page manpage" if $page;
+ }
+ ### print STDERR "got section=>coderef url=$url\n";
+ last RESOLVE;
+ }
+
+ # warning; show some text.
+ $linktext = $opar unless defined $linktext;
+ warn "$0: $podfile: cannot resolve L<$opar> in paragraph $paragraph.";
+ }
+
+ # now we have an URL or just plain code
+ $$rstr = $linktext . '>' . $$rstr;
+ if( defined( $url ) ){
+ $res = "<A HREF=\"$url\">" . process_text1( $lev, $rstr ) . '</A>';
+ } else {
+ $res = '<EM>' . process_text1( $lev, $rstr ) . '</EM>';
+ }
+
+ } elsif( $func eq 'S' ){
+ # S<text> - non-breaking spaces
+ $res = process_text1( $lev, $rstr );
+ $res =~ s/ /&nbsp;/g;
+
+ } elsif( $func eq 'X' ){
+ # X<> - ignore
+ $$rstr =~ s/^[^>]*>//;
+
+ } elsif( $func eq 'Z' ){
+ # Z<> - empty
+ warn "$0: $podfile: invalid X<> in paragraph $paragraph."
+ unless $$rstr =~ s/^>//;
+
+ } else {
+ my $term = pattern $closing;
+ while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)//s ){
+ # all others: either recurse into new function or
+ # terminate at closing angle bracket(s)
+ my $pt = $1;
+ $pt .= $2 if !$3 && $lev == 1;
+ $res .= $lev == 1 ? pure_text( $pt ) : inIS_text( $pt );
+ return $res if !$3 && $lev > 1;
+ if( $3 ){
+ $res .= process_text1( $lev, $rstr, $3, closing $4 );
+ }
+ }
+ if( $lev == 1 ){
+ $res .= pure_text( $$rstr );
} else {
- $result .= "$rest\n";
- $rest = "";
+ warn "$0: $podfile: undelimited $func<> in paragraph $paragraph.";
}
}
- $result .= $rest if $rest;
+ return $res;
+}
- # restore the leading and trailing white-space
- $result = "$lead$result$trail";
+#
+# go_ahead: extract text of an IS (can be nested)
+#
+sub go_ahead($$$){
+ my( $rstr, $func, $closing ) = @_;
+ my $res = '';
+ my @closing = ($closing);
+ while( $$rstr =~
+ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|@{[pattern $closing[0]]})//s ){
+ $res .= $1;
+ unless( $3 ){
+ shift @closing;
+ return $res unless @closing;
+ } else {
+ unshift @closing, closing $4;
+ }
+ $res .= $2;
+ }
+ warn "$0: $podfile: undelimited $func<> in paragraph $paragraph.";
+ return $res;
+}
- return $result;
+#
+# emit_C - output result of C<text>
+# $text is the depod-ed text
+#
+sub emit_C($;$$){
+ my( $text, $nocode, $args ) = @_;
+ $args = '' unless defined $args;
+ my $res;
+ my( $url, $fid ) = coderef( undef(), $text );
+
+ # need HTML-safe text
+ my $linktext = html_escape( "$text$args" );
+
+ if( defined( $url ) &&
+ (!defined( $EmittedItem ) || $EmittedItem ne $fid ) ){
+ $res = "<A HREF=\"$url\"><CODE>$linktext</CODE></A>";
+ } elsif( 0 && $nocode ){
+ $res = $linktext;
+ } else {
+ $res = "<CODE>$linktext</CODE>";
+ }
+ return $res;
}
#
-# pre_escape - convert & in text to $amp;
+# html_escape: make text safe for HTML
#
-sub pre_escape {
- my($str) = @_;
+sub html_escape {
+ my $rest = $_[0];
+ $rest =~ s/&/&amp;/g;
+ $rest =~ s/</&lt;/g;
+ $rest =~ s/>/&gt;/g;
+ $rest =~ s/"/&quot;/g;
+ return $rest;
+}
- $$str =~ s,&,&amp;,g;
-}
#
# dosify - convert filenames to 8.3
#
sub dosify {
my($str) = @_;
+ return lc($str) if $^O eq 'VMS'; # VMS just needs casing
if ($Is83) {
$str = lc $str;
$str =~ s/(\.\w+)/substr ($1,0,4)/ge;
@@ -1356,183 +1674,205 @@ sub dosify {
}
#
-# process_L - convert a pod L<> directive to a corresponding HTML link.
-# most of the links made are inferred rather than known about directly
-# (i.e it's not known whether the =head\d section exists in the target file,
-# or whether a .pod file exists in the case of split files). however, the
-# guessing usually works.
-#
-# Unlike the other directives, this should be called with an unprocessed
-# string, else tags in the link won't be matched.
+# page_sect - make an URL from the text of a L<>
#
-sub process_L {
- my($str) = @_;
- my($s1, $s2, $linktext, $page, $page83, $section, $link); # work strings
-
- $str =~ s/\n/ /g; # undo word-wrapped tags
- $s1 = $str;
- for ($s1) {
- # LREF: a la HREF L<show this text|man/section>
- $linktext = $1 if s:^([^|]+)\|::;
-
- # make sure sections start with a /
- s,^",/",g;
- s,^,/,g if (!m,/, && / /);
-
- # check if there's a section specified
- if (m,^(.*?)/"?(.*?)"?$,) { # yes
- ($page, $section) = ($1, $2);
- } else { # no
- ($page, $section) = ($str, "");
- }
-
- # check if we know that this is a section in this page
- if (!defined $pages{$page} && defined $sections{$page}) {
- $section = $page;
- $page = "";
- }
+sub page_sect($$) {
+ my( $page, $section ) = @_;
+ my( $linktext, $page83, $link); # work strings
+
+ # check if we know that this is a section in this page
+ if (!defined $pages{$page} && defined $sections{$page}) {
+ $section = $page;
+ $page = "";
+ ### print STDERR "reset page='', section=$section\n";
}
$page83=dosify($page);
$page=$page83 if (defined $pages{$page83});
if ($page eq "") {
- $link = "#" . htmlify(0,$section);
- $linktext = $section unless defined($linktext);
+ $link = "#" . htmlify( $section );
} elsif ( $page =~ /::/ ) {
- $linktext = ($section ? "$section" : "$page");
$page =~ s,::,/,g;
+ # Search page cache for an entry keyed under the html page name,
+ # then look to see what directory that page might be in. NOTE:
+ # this will only find one page. A better solution might be to produce
+ # an intermediate page that is an index to all such pages.
+ my $page_name = $page ;
+ $page_name =~ s,^.*/,,s ;
+ if ( defined( $pages{ $page_name } ) &&
+ $pages{ $page_name } =~ /([^:]*$page)\.(?:pod|pm):/
+ ) {
+ $page = $1 ;
+ }
+ else {
+ # NOTE: This branch assumes that all A::B pages are located in
+ # $htmlroot/A/B.html . This is often incorrect, since they are
+ # often in $htmlroot/lib/A/B.html or such like. Perhaps we could
+ # analyze the contents of %pages and figure out where any
+ # cousins of A::B are, then assume that. So, if A::B isn't found,
+ # but A::C is found in lib/A/C.pm, then A::B is assumed to be in
+ # lib/A/B.pm. This is also limited, but it's an improvement.
+ # Maybe a hints file so that the links point to the correct places
+ # nonetheless?
+
+ }
$link = "$htmlroot/$page.html";
- $link .= "#" . htmlify(0,$section) if ($section);
+ $link .= "#" . htmlify( $section ) if ($section);
} elsif (!defined $pages{$page}) {
- warn "$0: $podfile: cannot resolve L<$str> in paragraph $paragraph: no such page '$page'\n";
$link = "";
- $linktext = $page unless defined($linktext);
} else {
- $linktext = ($section ? "$section" : "the $page manpage") unless defined($linktext);
- $section = htmlify(0,$section) if $section ne "";
+ $section = htmlify( $section ) if $section ne "";
+ ### print STDERR "...section=$section\n";
# if there is a directory by the name of the page, then assume that an
# appropriate section will exist in the subdirectory
- if ($section ne "" && $pages{$page} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+# if ($section ne "" && $pages{$page} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+ if ($section ne "" && $pages{$page} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) {
$link = "$htmlroot/$1/$section.html";
+ ### print STDERR "...link=$link\n";
# since there is no directory by the name of the page, the section will
# have to exist within a .html of the same name. thus, make sure there
# is a .pod or .pm that might become that .html
} else {
- $section = "#$section";
+ $section = "#$section" if $section;
+ ### print STDERR "...section=$section\n";
+
# check if there is a .pod with the page name
if ($pages{$page} =~ /([^:]*)\.pod:/) {
$link = "$htmlroot/$1.html$section";
} elsif ($pages{$page} =~ /([^:]*)\.pm:/) {
$link = "$htmlroot/$1.html$section";
} else {
- warn "$0: $podfile: cannot resolve L$str in paragraph $paragraph: ".
- "no .pod or .pm found\n";
$link = "";
- $linktext = $section unless defined($linktext);
}
}
}
- process_text(\$linktext, 0);
if ($link) {
- $s1 = "<A HREF=\"$link\">$linktext</A>";
+ # Here, we take advantage of the knowledge that $htmlfileurl ne ''
+ # implies $htmlroot eq ''. This means that the link in question
+ # needs a prefix of $htmldir if it begins with '/'. The test for
+ # the initial '/' is done to avoid '#'-only links, and to allow
+ # for other kinds of links, like file:, ftp:, etc.
+ my $url ;
+ if ( $htmlfileurl ne '' ) {
+ $link = "$htmldir$link" if $link =~ m{^/}s;
+ $url = relativize_url( $link, $htmlfileurl );
+# print( " b: [$link,$htmlfileurl,$url]\n" );
+ }
+ else {
+ $url = $link ;
+ }
+ return $url;
+
} else {
- $s1 = "<EM>$linktext</EM>";
+ return undef();
}
- return $s1;
}
#
-# process_BFI - process any of the B<>, F<>, or I<> pod-escapes and
-# convert them to corresponding HTML directives.
+# relativize_url - convert an absolute URL to one relative to a base URL.
+# Assumes both end in a filename.
#
-sub process_BFI {
- my($tag, $str) = @_;
- my($s1); # work string
- my(%repltext) = ( 'B' => 'STRONG',
- 'F' => 'EM',
- 'I' => 'EM');
+sub relativize_url {
+ my ($dest,$source) = @_ ;
- # extract the modified text and convert to HTML
- $s1 = "<$repltext{$tag}>$str</$repltext{$tag}>";
- return $s1;
-}
-
-#
-# process_C - process the C<> pod-escape.
-#
-sub process_C {
- my($str, $doref) = @_;
- my($s1, $s2);
+ my ($dest_volume,$dest_directory,$dest_file) =
+ File::Spec::Unix->splitpath( $dest ) ;
+ $dest = File::Spec::Unix->catpath( $dest_volume, $dest_directory, '' ) ;
- $s1 = $str;
- $s1 =~ s/\([^()]*\)//g; # delete parentheses
- $s2 = $s1;
- $s1 =~ s/\W//g; # delete bogus characters
- $str = html_escape($str);
+ my ($source_volume,$source_directory,$source_file) =
+ File::Spec::Unix->splitpath( $source ) ;
+ $source = File::Spec::Unix->catpath( $source_volume, $source_directory, '' ) ;
- # if there was a pod file that we found earlier with an appropriate
- # =item directive, then create a link to that page.
- if ($doref && defined $items{$s1}) {
- $s1 = ($items{$s1} ?
- "<A HREF=\"$htmlroot/$items{$s1}#item_" . htmlify(0,$s2) . "\">$str</A>" :
- "<A HREF=\"#item_" . htmlify(0,$s2) . "\">$str</A>");
- $s1 =~ s,(perl\w+/(\S+)\.html)#item_\2\b,$1,;
- confess "s1 has space: $s1" if $s1 =~ /HREF="[^"]*\s[^"]*"/;
- } else {
- $s1 = "<CODE>$str</CODE>";
- # warn "$0: $podfile: cannot resolve C<$str> in paragraph $paragraph\n" if $verbose
+ my $rel_path = '' ;
+ if ( $dest ne '' ) {
+ $rel_path = File::Spec::Unix->abs2rel( $dest, $source ) ;
}
+ if ( $rel_path ne '' &&
+ substr( $rel_path, -1 ) ne '/' &&
+ substr( $dest_file, 0, 1 ) ne '#'
+ ) {
+ $rel_path .= "/$dest_file" ;
+ }
+ else {
+ $rel_path .= "$dest_file" ;
+ }
- return $s1;
+ return $rel_path ;
}
+
#
-# process_E - process the E<> pod directive which seems to escape a character.
+# coderef - make URL from the text of a C<>
#
-sub process_E {
- my($str) = @_;
+sub coderef($$){
+ my( $page, $item ) = @_;
+ my( $url );
+
+ my $fid = fragment_id( $item );
+ if( defined( $page ) ){
+ # we have been given a $page...
+ $page =~ s{::}{/}g;
+
+ # Do we take it? Item could be a section!
+ my $base = $items{$fid} || "";
+ $base =~ s{[^/]*/}{};
+ if( $base ne "$page.html" ){
+ ### print STDERR "coderef( $page, $item ): items{$fid} = $items{$fid} = $base => discard page!\n";
+ $page = undef();
+ }
- for ($str) {
- s,([^/].*),\&$1\;,g;
+ } else {
+ # no page - local items precede cached items
+ if( defined( $fid ) ){
+ if( exists $local_items{$fid} ){
+ $page = $local_items{$fid};
+ } else {
+ $page = $items{$fid};
+ }
+ }
}
- return $str;
-}
+ # if there was a pod file that we found earlier with an appropriate
+ # =item directive, then create a link to that page.
+ if( defined $page ){
+ if( $page ){
+ if( exists $pages{$page} and $pages{$page} =~ /([^:.]*)\.[^:]*:/){
+ $page = $1 . '.html';
+ }
+ my $link = "$htmlroot/$page#item_$fid";
-#
-# process_Z - process the Z<> pod directive which really just amounts to
-# ignoring it. this allows someone to start a paragraph with an =
-#
-sub process_Z {
- my($str) = @_;
+ # Here, we take advantage of the knowledge that $htmlfileurl
+ # ne '' implies $htmlroot eq ''.
+ if ( $htmlfileurl ne '' ) {
+ $link = "$htmldir$link" ;
+ $url = relativize_url( $link, $htmlfileurl ) ;
+ } else {
+ $url = $link ;
+ }
+ } else {
+ $url = "#item_" . $fid;
+ }
- # there is no equivalent in HTML for this so just ignore it.
- $str = "";
- return $str;
+ confess "url has space: $url" if $url =~ /"[^"]*\s[^"]*"/;
+ }
+ return( $url, $fid );
}
-#
-# process_S - process the S<> pod directive which means to convert all
-# spaces in the string to non-breaking spaces (in HTML-eze).
-#
-sub process_S {
- my($str) = @_;
- # convert all spaces in the text to non-breaking spaces in HTML.
- $str =~ s/ /&nbsp;/g;
- return $str;
-}
#
-# process_X - this is supposed to make an index entry. we'll just
-# ignore it.
-#
-sub process_X {
- return '';
+# Adapted from Nick Ing-Simmons' PodToHtml package.
+sub relative_url {
+ my $source_file = shift ;
+ my $destination_file = shift;
+
+ my $source = URI::file->new_abs($source_file);
+ my $uo = URI::file->new($destination_file,$source)->abs;
+ return $uo->rel->as_string;
}
@@ -1549,29 +1889,131 @@ sub finish_list {
#
# htmlify - converts a pod section specification to a suitable section
-# specification for HTML. if first arg is 1, only takes 1st word.
+# specification for HTML. Note that we keep spaces and special characters
+# except ", ? (Netscape problem) and the hyphen (writer's problem...).
#
sub htmlify {
- my($compact, $heading) = @_;
+ my( $heading) = @_;
+ $heading =~ s/(\s+)/ /g;
+ $heading =~ s/\s+\Z//;
+ $heading =~ s/\A\s+//;
+ # The hyphen is a disgrace to the English language.
+ $heading =~ s/[-"?]//g;
+ $heading = lc( $heading );
+ return $heading;
+}
- if ($compact) {
- $heading =~ /^(\w+)/;
- $heading = $1;
- }
+#
+# depod - convert text by eliminating all interior sequences
+# Note: can be called with copy or modify semantics
+#
+my %E2c;
+$E2c{lt} = '<';
+$E2c{gt} = '>';
+$E2c{sol} = '/';
+$E2c{verbar} = '|';
+$E2c{amp} = '&'; # in Tk's pods
+
+sub depod1($;$$);
+
+sub depod($){
+ my $string;
+ if( ref( $_[0] ) ){
+ $string = ${$_[0]};
+ ${$_[0]} = depod1( \$string );
+ } else {
+ $string = $_[0];
+ depod1( \$string );
+ }
+}
- # $heading = lc($heading);
- $heading =~ s/[^\w\s]/_/g;
- $heading =~ s/(\s+)/ /g;
- $heading =~ s/^\s*(.*?)\s*$/$1/s;
- $heading =~ s/ /_/g;
- $heading =~ s/\A(.{32}).*\Z/$1/s;
- $heading =~ s/\s+\Z//;
- $heading =~ s/_{2,}/_/g;
+sub depod1($;$$){
+ my( $rstr, $func, $closing ) = @_;
+ my $res = '';
+ return $res unless defined $$rstr;
+ if( ! defined( $func ) ){
+ # skip to next begin of an interior sequence
+ while( $$rstr =~ s/\A(.*?)([BCEFILSXZ])<(<+[^\S\n]+)?// ){
+ # recurse into its text
+ $res .= $1 . depod1( $rstr, $2, closing $3);
+ }
+ $res .= $$rstr;
+ } elsif( $func eq 'E' ){
+ # E<x> - convert to character
+ $$rstr =~ s/^(\w+)>//;
+ $res .= $E2c{$1} || "";
+ } elsif( $func eq 'X' ){
+ # X<> - ignore
+ $$rstr =~ s/^[^>]*>//;
+ } elsif( $func eq 'Z' ){
+ # Z<> - empty
+ $$rstr =~ s/^>//;
+ } else {
+ # all others: either recurse into new function or
+ # terminate at closing angle bracket
+ my $term = pattern $closing;
+ while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)// ){
+ $res .= $1;
+ last unless $3;
+ $res .= depod1( $rstr, $3, closing $4 );
+ }
+ ## If we're here and $2 ne '>': undelimited interior sequence.
+ ## Ignored, as this is called without proper indication of where we are.
+ ## Rely on process_text to produce diagnostics.
+ }
+ return $res;
+}
- return $heading;
+#
+# fragment_id - construct a fragment identifier from:
+# a) =item text
+# b) contents of C<...>
+#
+my @hc;
+sub fragment_id {
+ my $text = shift();
+ $text =~ s/\s+\Z//s;
+ if( $text ){
+ # a method or function?
+ return $1 if $text =~ /(\w+)\s*\(/;
+ return $1 if $text =~ /->\s*(\w+)\s*\(?/;
+
+ # a variable name?
+ return $1 if $text =~ /^([$@%*]\S+)/;
+
+ # some pattern matching operator?
+ return $1 if $text =~ m|^(\w+/).*/\w*$|;
+
+ # fancy stuff... like "do { }"
+ return $1 if $text =~ m|^(\w+)\s*{.*}$|;
+
+ # honour the perlfunc manpage: func [PAR[,[ ]PAR]...]
+ # and some funnies with ... Module ...
+ return $1 if $text =~ m{^([a-z\d]+)(\s+[A-Z\d,/& ]+)?$};
+ return $1 if $text =~ m{^([a-z\d]+)\s+Module(\s+[A-Z\d,/& ]+)?$};
+
+ # text? normalize!
+ $text =~ s/\s+/_/sg;
+ $text =~ s{(\W)}{
+ defined( $hc[ord($1)] ) ? $hc[ord($1)]
+ : ( $hc[ord($1)] = sprintf( "%%%02X", ord($1) ) ) }gxe;
+ $text = substr( $text, 0, 50 );
+ } else {
+ return undef();
+ }
}
-BEGIN {
+#
+# make_URL_href - generate HTML href from URL
+# Special treatment for CGI queries.
+#
+sub make_URL_href($){
+ my( $url ) = @_;
+ if( $url !~
+ s{^(http:[-\w/#~:.+=&%@!]+)(\?.*)$}{<A HREF="$1$2">$1</A>}i ){
+ $url = "<A HREF=\"$url\">$url</A>";
+ }
+ return $url;
}
1;
diff --git a/contrib/perl5/lib/Pod/InputObjects.pm b/contrib/perl5/lib/Pod/InputObjects.pm
new file mode 100644
index 0000000..849182b
--- /dev/null
+++ b/contrib/perl5/lib/Pod/InputObjects.pm
@@ -0,0 +1,933 @@
+#############################################################################
+# Pod/InputObjects.pm -- package which defines objects for input streams
+# and paragraphs and commands when parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::InputObjects;
+
+use vars qw($VERSION);
+$VERSION = 1.12; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::InputObjects - objects representing POD input paragraphs, commands, etc.
+
+=head1 SYNOPSIS
+
+ use Pod::InputObjects;
+
+=head1 REQUIRES
+
+perl5.004, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+This module defines some basic input objects used by B<Pod::Parser> when
+reading and parsing POD text from an input source. The following objects
+are defined:
+
+=over 4
+
+=begin __PRIVATE__
+
+=item B<Pod::InputSource>
+
+An object corresponding to a source of POD input text. It is mostly a
+wrapper around a filehandle or C<IO::Handle>-type object (or anything
+that implements the C<getline()> method) which keeps track of some
+additional information relevant to the parsing of PODs.
+
+=end __PRIVATE__
+
+=item B<Pod::Paragraph>
+
+An object corresponding to a paragraph of POD input text. It may be a
+plain paragraph, a verbatim paragraph, or a command paragraph (see
+L<perlpod>).
+
+=item B<Pod::InteriorSequence>
+
+An object corresponding to an interior sequence command from the POD
+input text (see L<perlpod>).
+
+=item B<Pod::ParseTree>
+
+An object corresponding to a tree of parsed POD text. Each "node" in
+a parse-tree (or I<ptree>) is either a text-string or a reference to
+a B<Pod::InteriorSequence> object. The nodes appear in the parse-tree
+in they order in which they were parsed from left-to-right.
+
+=back
+
+Each of these input objects are described in further detail in the
+sections which follow.
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+#use Carp;
+
+#############################################################################
+
+package Pod::InputSource;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<Pod::InputSource>
+
+This object corresponds to an input source or stream of POD
+documentation. When parsing PODs, it is necessary to associate and store
+certain context information with each input source. All of this
+information is kept together with the stream itself in one of these
+C<Pod::InputSource> objects. Each such object is merely a wrapper around
+an C<IO::Handle> object of some kind (or at least something that
+implements the C<getline()> method). They have the following
+methods/attributes:
+
+=end __PRIVATE__
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<new()>
+
+ my $pod_input1 = Pod::InputSource->new(-handle => $filehandle);
+ my $pod_input2 = new Pod::InputSource(-handle => $filehandle,
+ -name => $name);
+ my $pod_input3 = new Pod::InputSource(-handle => \*STDIN);
+ my $pod_input4 = Pod::InputSource->new(-handle => \*STDIN,
+ -name => "(STDIN)");
+
+This is a class method that constructs a C<Pod::InputSource> object and
+returns a reference to the new input source object. It takes one or more
+keyword arguments in the form of a hash. The keyword C<-handle> is
+required and designates the corresponding input handle. The keyword
+C<-name> is optional and specifies the name associated with the input
+handle (typically a file name).
+
+=end __PRIVATE__
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = { -name => '(unknown)',
+ -handle => undef,
+ -was_cutting => 0,
+ @_ };
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<name()>
+
+ my $filename = $pod_input->name();
+ $pod_input->name($new_filename_to_use);
+
+This method gets/sets the name of the input source (usually a filename).
+If no argument is given, it returns a string containing the name of
+the input source; otherwise it sets the name of the input source to the
+contents of the given argument.
+
+=end __PRIVATE__
+
+=cut
+
+sub name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## allow 'filename' as an alias for 'name'
+*filename = \&name;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<handle()>
+
+ my $handle = $pod_input->handle();
+
+Returns a reference to the handle object from which input is read (the
+one used to contructed this input source object).
+
+=end __PRIVATE__
+
+=cut
+
+sub handle {
+ return $_[0]->{'-handle'};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<was_cutting()>
+
+ print "Yes.\n" if ($pod_input->was_cutting());
+
+The value of the C<cutting> state (that the B<cutting()> method would
+have returned) immediately before any input was read from this input
+stream. After all input from this stream has been read, the C<cutting>
+state is restored to this value.
+
+=end __PRIVATE__
+
+=cut
+
+sub was_cutting {
+ (@_ > 1) and $_[0]->{-was_cutting} = $_[1];
+ return $_[0]->{-was_cutting};
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::Paragraph;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::Paragraph>
+
+An object representing a paragraph of POD input text.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 B<new()>
+
+ my $pod_para1 = Pod::Paragraph->new(-text => $text);
+ my $pod_para2 = Pod::Paragraph->new(-name => $cmd,
+ -text => $text);
+ my $pod_para3 = new Pod::Paragraph(-text => $text);
+ my $pod_para4 = new Pod::Paragraph(-name => $cmd,
+ -text => $text);
+ my $pod_para5 = Pod::Paragraph->new(-name => $cmd,
+ -text => $text,
+ -file => $filename,
+ -line => $line_number);
+
+This is a class method that constructs a C<Pod::Paragraph> object and
+returns a reference to the new paragraph object. It may be given one or
+two keyword arguments. The C<-text> keyword indicates the corresponding
+text of the POD paragraph. The C<-name> keyword indicates the name of
+the corresponding POD command, such as C<head1> or C<item> (it should
+I<not> contain the C<=> prefix); this is needed only if the POD
+paragraph corresponds to a command paragraph. The C<-file> and C<-line>
+keywords indicate the filename and line number corresponding to the
+beginning of the paragraph
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = {
+ -name => undef,
+ -text => (@_ == 1) ? $_[0] : undef,
+ -file => '<unknown-file>',
+ -line => 0,
+ -prefix => '=',
+ -separator => ' ',
+ -ptree => [],
+ @_
+ };
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<cmd_name()>
+
+ my $para_cmd = $pod_para->cmd_name();
+
+If this paragraph is a command paragraph, then this method will return
+the name of the command (I<without> any leading C<=> prefix).
+
+=cut
+
+sub cmd_name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+=head2 B<text()>
+
+ my $para_text = $pod_para->text();
+
+This method will return the corresponding text of the paragraph.
+
+=cut
+
+sub text {
+ (@_ > 1) and $_[0]->{'-text'} = $_[1];
+ return $_[0]->{'-text'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<raw_text()>
+
+ my $raw_pod_para = $pod_para->raw_text();
+
+This method will return the I<raw> text of the POD paragraph, exactly
+as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ return $_[0]->{'-text'} unless (defined $_[0]->{'-name'});
+ return $_[0]->{'-prefix'} . $_[0]->{'-name'} .
+ $_[0]->{'-separator'} . $_[0]->{'-text'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<cmd_prefix()>
+
+ my $prefix = $pod_para->cmd_prefix();
+
+If this paragraph is a command paragraph, then this method will return
+the prefix used to denote the command (which should be the string "="
+or "==").
+
+=cut
+
+sub cmd_prefix {
+ return $_[0]->{'-prefix'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<cmd_separator()>
+
+ my $separator = $pod_para->cmd_separator();
+
+If this paragraph is a command paragraph, then this method will return
+the text used to separate the command name from the rest of the
+paragraph (if any).
+
+=cut
+
+sub cmd_separator {
+ return $_[0]->{'-separator'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<parse_tree()>
+
+ my $ptree = $pod_parser->parse_text( $pod_para->text() );
+ $pod_para->parse_tree( $ptree );
+ $ptree = $pod_para->parse_tree();
+
+This method will get/set the corresponding parse-tree of the paragraph's text.
+
+=cut
+
+sub parse_tree {
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+}
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 B<file_line()>
+
+ my ($filename, $line_number) = $pod_para->file_line();
+ my $position = $pod_para->file_line();
+
+Returns the current filename and line number for the paragraph
+object. If called in an array context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+ my @loc = ($_[0]->{'-file'} || '<unknown-file>',
+ $_[0]->{'-line'} || 0);
+ return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::InteriorSequence;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::InteriorSequence>
+
+An object representing a POD interior sequence command.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 B<new()>
+
+ my $pod_seq1 = Pod::InteriorSequence->new(-name => $cmd
+ -ldelim => $delimiter);
+ my $pod_seq2 = new Pod::InteriorSequence(-name => $cmd,
+ -ldelim => $delimiter);
+ my $pod_seq3 = new Pod::InteriorSequence(-name => $cmd,
+ -ldelim => $delimiter,
+ -file => $filename,
+ -line => $line_number);
+
+ my $pod_seq4 = new Pod::InteriorSequence(-name => $cmd, $ptree);
+ my $pod_seq5 = new Pod::InteriorSequence($cmd, $ptree);
+
+This is a class method that constructs a C<Pod::InteriorSequence> object
+and returns a reference to the new interior sequence object. It should
+be given two keyword arguments. The C<-ldelim> keyword indicates the
+corresponding left-delimiter of the interior sequence (e.g. 'E<lt>').
+The C<-name> keyword indicates the name of the corresponding interior
+sequence command, such as C<I> or C<B> or C<C>. The C<-file> and
+C<-line> keywords indicate the filename and line number corresponding
+to the beginning of the interior sequence. If the C<$ptree> argument is
+given, it must be the last argument, and it must be either string, or
+else an array-ref suitable for passing to B<Pod::ParseTree::new> (or
+it may be a reference to an Pod::ParseTree object).
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## See if first argument has no keyword
+ if (((@_ <= 2) or (@_ % 2)) and $_[0] !~ /^-\w/) {
+ ## Yup - need an implicit '-name' before first parameter
+ unshift @_, '-name';
+ }
+
+ ## See if odd number of args
+ if ((@_ % 2) != 0) {
+ ## Yup - need an implicit '-ptree' before the last parameter
+ splice @_, $#_, 0, '-ptree';
+ }
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = {
+ -name => (@_ == 1) ? $_[0] : undef,
+ -file => '<unknown-file>',
+ -line => 0,
+ -ldelim => '<',
+ -rdelim => '>',
+ @_
+ };
+
+ ## Initialize contents if they havent been already
+ my $ptree = $self->{'-ptree'} || new Pod::ParseTree();
+ if ( ref $ptree =~ /^(ARRAY)?$/ ) {
+ ## We have an array-ref, or a normal scalar. Pass it as an
+ ## an argument to the ptree-constructor
+ $ptree = new Pod::ParseTree($1 ? [$ptree] : $ptree);
+ }
+ $self->{'-ptree'} = $ptree;
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<cmd_name()>
+
+ my $seq_cmd = $pod_seq->cmd_name();
+
+The name of the interior sequence command.
+
+=cut
+
+sub cmd_name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+## Private subroutine to set the parent pointer of all the given
+## children that are interior-sequences to be $self
+
+sub _set_child2parent_links {
+ my ($self, @children) = @_;
+ ## Make sure any sequences know who their parent is
+ for (@children) {
+ next unless (length and ref and ref ne 'SCALAR');
+ if (UNIVERSAL::isa($_, 'Pod::InteriorSequence') or
+ UNIVERSAL::can($_, 'nested'))
+ {
+ $_->nested($self);
+ }
+ }
+}
+
+## Private subroutine to unset child->parent links
+
+sub _unset_child2parent_links {
+ my $self = shift;
+ $self->{'-parent_sequence'} = undef;
+ my $ptree = $self->{'-ptree'};
+ for (@$ptree) {
+ next unless (length and ref and ref ne 'SCALAR');
+ $_->_unset_child2parent_links()
+ if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<prepend()>
+
+ $pod_seq->prepend($text);
+ $pod_seq1->prepend($pod_seq2);
+
+Prepends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub prepend {
+ my $self = shift;
+ $self->{'-ptree'}->prepend(@_);
+ _set_child2parent_links($self, @_);
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<append()>
+
+ $pod_seq->append($text);
+ $pod_seq1->append($pod_seq2);
+
+Appends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub append {
+ my $self = shift;
+ $self->{'-ptree'}->append(@_);
+ _set_child2parent_links($self, @_);
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<nested()>
+
+ $outer_seq = $pod_seq->nested || print "not nested";
+
+If this interior sequence is nested inside of another interior
+sequence, then the outer/parent sequence that contains it is
+returned. Otherwise C<undef> is returned.
+
+=cut
+
+sub nested {
+ my $self = shift;
+ (@_ == 1) and $self->{'-parent_sequence'} = shift;
+ return $self->{'-parent_sequence'} || undef;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<raw_text()>
+
+ my $seq_raw_text = $pod_seq->raw_text();
+
+This method will return the I<raw> text of the POD interior sequence,
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ my $self = shift;
+ my $text = $self->{'-name'} . $self->{'-ldelim'};
+ for ( $self->{'-ptree'}->children ) {
+ $text .= (ref $_) ? $_->raw_text : $_;
+ }
+ $text .= $self->{'-rdelim'};
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<left_delimiter()>
+
+ my $ldelim = $pod_seq->left_delimiter();
+
+The leftmost delimiter beginning the argument text to the interior
+sequence (should be "<").
+
+=cut
+
+sub left_delimiter {
+ (@_ > 1) and $_[0]->{'-ldelim'} = $_[1];
+ return $_[0]->{'-ldelim'};
+}
+
+## let ldelim() be an alias for left_delimiter()
+*ldelim = \&left_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 B<right_delimiter()>
+
+The rightmost delimiter beginning the argument text to the interior
+sequence (should be ">").
+
+=cut
+
+sub right_delimiter {
+ (@_ > 1) and $_[0]->{'-rdelim'} = $_[1];
+ return $_[0]->{'-rdelim'};
+}
+
+## let rdelim() be an alias for right_delimiter()
+*rdelim = \&right_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 B<parse_tree()>
+
+ my $ptree = $pod_parser->parse_text($paragraph_text);
+ $pod_seq->parse_tree( $ptree );
+ $ptree = $pod_seq->parse_tree();
+
+This method will get/set the corresponding parse-tree of the interior
+sequence's text.
+
+=cut
+
+sub parse_tree {
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+}
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 B<file_line()>
+
+ my ($filename, $line_number) = $pod_seq->file_line();
+ my $position = $pod_seq->file_line();
+
+Returns the current filename and line number for the interior sequence
+object. If called in an array context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+ my @loc = ($_[0]->{'-file'} || '<unknown-file>',
+ $_[0]->{'-line'} || 0);
+ return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<DESTROY()>
+
+This method performs any necessary cleanup for the interior-sequence.
+If you override this method then it is B<imperative> that you invoke
+the parent method from within your own method, otherwise
+I<interior-sequence storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+ ## We need to get rid of all child->parent pointers throughout the
+ ## tree so their reference counts will go to zero and they can be
+ ## garbage-collected
+ _unset_child2parent_links(@_);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::ParseTree;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::ParseTree>
+
+This object corresponds to a tree of parsed POD text. As POD text is
+scanned from left to right, it is parsed into an ordered list of
+text-strings and B<Pod::InteriorSequence> objects (in order of
+appearance). A B<Pod::ParseTree> object corresponds to this list of
+strings and sequences. Each interior sequence in the parse-tree may
+itself contain a parse-tree (since interior sequences may be nested).
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 B<new()>
+
+ my $ptree1 = Pod::ParseTree->new;
+ my $ptree2 = new Pod::ParseTree;
+ my $ptree4 = Pod::ParseTree->new($array_ref);
+ my $ptree3 = new Pod::ParseTree($array_ref);
+
+This is a class method that constructs a C<Pod::Parse_tree> object and
+returns a reference to the new parse-tree. If a single-argument is given,
+it must be a reference to an array, and is used to initialize the root
+(top) of the parse tree.
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ my $self = (@_ == 1 and ref $_[0]) ? $_[0] : [];
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<top()>
+
+ my $top_node = $ptree->top();
+ $ptree->top( $top_node );
+ $ptree->top( @children );
+
+This method gets/sets the top node of the parse-tree. If no arguments are
+given, it returns the topmost node in the tree (the root), which is also
+a B<Pod::ParseTree>. If it is given a single argument that is a reference,
+then the reference is assumed to a parse-tree and becomes the new top node.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub top {
+ my $self = shift;
+ if (@_ > 0) {
+ @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_;
+ }
+ return $self;
+}
+
+## let parse_tree() & ptree() be aliases for the 'top' method
+*parse_tree = *ptree = \&top;
+
+##---------------------------------------------------------------------------
+
+=head2 B<children()>
+
+This method gets/sets the children of the top node in the parse-tree.
+If no arguments are given, it returns the list (array) of children
+(each of which should be either a string or a B<Pod::InteriorSequence>.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub children {
+ my $self = shift;
+ if (@_ > 0) {
+ @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_;
+ }
+ return @{ $self };
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<prepend()>
+
+This method prepends the given text or parse-tree to the current parse-tree.
+If the first item on the parse-tree is text and the argument is also text,
+then the text is prepended to the first item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<before>
+the current one.
+
+=cut
+
+use vars qw(@ptree); ## an alias used for performance reasons
+
+sub prepend {
+ my $self = shift;
+ local *ptree = $self;
+ for (@_) {
+ next unless length;
+ if (@ptree and !(ref $ptree[0]) and !(ref $_)) {
+ $ptree[0] = $_ . $ptree[0];
+ }
+ else {
+ unshift @ptree, $_;
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 B<append()>
+
+This method appends the given text or parse-tree to the current parse-tree.
+If the last item on the parse-tree is text and the argument is also text,
+then the text is appended to the last item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<after>
+the current one.
+
+=cut
+
+sub append {
+ my $self = shift;
+ local *ptree = $self;
+ for (@_) {
+ next unless length;
+ if (@ptree and !(ref $ptree[-1]) and !(ref $_)) {
+ $ptree[-1] .= $_;
+ }
+ else {
+ push @ptree, $_;
+ }
+ }
+}
+
+=head2 B<raw_text()>
+
+ my $ptree_raw_text = $ptree->raw_text();
+
+This method will return the I<raw> text of the POD parse-tree
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ my $self = shift;
+ my $text = "";
+ for ( @$self ) {
+ $text .= (ref $_) ? $_->raw_text : $_;
+ }
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+## Private routines to set/unset child->parent links
+
+sub _unset_child2parent_links {
+ my $self = shift;
+ local *ptree = $self;
+ for (@ptree) {
+ next unless (length and ref and ref ne 'SCALAR');
+ $_->_unset_child2parent_links()
+ if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+ }
+}
+
+sub _set_child2parent_links {
+ ## nothing to do, Pod::ParseTrees cant have parent pointers
+}
+
+=head2 B<DESTROY()>
+
+This method performs any necessary cleanup for the parse-tree.
+If you override this method then it is B<imperative>
+that you invoke the parent method from within your own method,
+otherwise I<parse-tree storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+ ## We need to get rid of all child->parent pointers throughout the
+ ## tree so their reference counts will go to zero and they can be
+ ## garbage-collected
+ _unset_child2parent_links(@_);
+}
+
+#############################################################################
+
+=head1 SEE ALSO
+
+See L<Pod::Parser>, L<Pod::Select>
+
+=head1 AUTHOR
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+=cut
+
+1;
diff --git a/contrib/perl5/lib/Pod/Man.pm b/contrib/perl5/lib/Pod/Man.pm
new file mode 100644
index 0000000..97a3828
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Man.pm
@@ -0,0 +1,1217 @@
+# Pod::Man -- Convert POD data to formatted *roff input.
+# $Id: Man.pm,v 1.2 2000/03/19 07:30:13 eagle Exp $
+#
+# Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module is intended to be a replacement for the pod2man script
+# distributed with versions of Perl prior to 5.6, and attempts to match its
+# output except for some specific circumstances where other decisions seemed
+# to produce better output. It uses Pod::Parser and is designed to be easy
+# to subclass.
+#
+# Perl core hackers, please note that this module is also separately
+# maintained outside of the Perl core as part of the podlators. Please send
+# me any patches at the address above in addition to sending them to the
+# standard Perl mailing lists.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::Man;
+
+require 5.004;
+
+use Carp qw(carp croak);
+use Pod::Parser ();
+
+use strict;
+use subs qw(makespace);
+use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION);
+
+@ISA = qw(Pod::Parser);
+
+# Don't use the CVS revision as the version, since this module is also in
+# 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.02;
+
+
+############################################################################
+# Preamble and *roff output tables
+############################################################################
+
+# The following is the static preamble which starts all *roff output we
+# generate. It's completely static except for the font to use as a
+# fixed-width font, which is designed by @CFONT@. $PREAMBLE should
+# therefore be run through s/\@CFONT\@/<font>/g before output.
+$PREAMBLE = <<'----END OF PREAMBLE----';
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Ip \" List item
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.de Vb \" Begin verbatim text
+.ft @CFONT@
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. | will give a
+.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used
+.\" to do unbreakable dashes and therefore won't be available. \*(C` and
+.\" \*(C' expand to `' in nroff, nothing in troff, for use with C<>
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` `
+. ds C' '
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr
+.\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and
+.\" index entries marked with X<> in POD. Of course, you'll have to process
+.\" the output yourself in some meaningful fashion.
+.if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+. .
+. nr % 0
+. rr F
+.\}
+.\"
+.\" For nroff, turn off justification. Always turn off hyphenation; it
+.\" makes way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+.bd B 3
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+----END OF PREAMBLE----
+
+# 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
+# with double quotes since they contain embedded single quotes, so use \\
+# uniformly for backslash for readability.
+%ESCAPES = (
+ 'amp' => '&', # ampersand
+ 'lt' => '<', # left chevron, less-than
+ 'gt' => '>', # right chevron, greater-than
+ 'quot' => '"', # double quote
+
+ 'Aacute' => "A\\*'", # capital A, acute accent
+ 'aacute' => "a\\*'", # small a, acute accent
+ 'Acirc' => 'A\\*^', # capital A, circumflex accent
+ 'acirc' => 'a\\*^', # small a, circumflex accent
+ 'AElig' => '\*(AE', # capital AE diphthong (ligature)
+ 'aelig' => '\*(ae', # small ae diphthong (ligature)
+ 'Agrave' => "A\\*`", # capital A, grave accent
+ 'agrave' => "A\\*`", # small a, grave accent
+ 'Aring' => 'A\\*o', # capital A, ring
+ 'aring' => 'a\\*o', # small a, ring
+ 'Atilde' => 'A\\*~', # capital A, tilde
+ 'atilde' => 'a\\*~', # small a, tilde
+ 'Auml' => 'A\\*:', # capital A, dieresis or umlaut mark
+ 'auml' => 'a\\*:', # small a, dieresis or umlaut mark
+ 'Ccedil' => 'C\\*,', # capital C, cedilla
+ 'ccedil' => 'c\\*,', # small c, cedilla
+ 'Eacute' => "E\\*'", # capital E, acute accent
+ 'eacute' => "e\\*'", # small e, acute accent
+ 'Ecirc' => 'E\\*^', # capital E, circumflex accent
+ 'ecirc' => 'e\\*^', # small e, circumflex accent
+ 'Egrave' => 'E\\*`', # capital E, grave accent
+ 'egrave' => 'e\\*`', # small e, grave accent
+ 'ETH' => '\\*(D-', # capital Eth, Icelandic
+ 'eth' => '\\*(d-', # small eth, Icelandic
+ 'Euml' => 'E\\*:', # capital E, dieresis or umlaut mark
+ 'euml' => 'e\\*:', # small e, dieresis or umlaut mark
+ 'Iacute' => "I\\*'", # capital I, acute accent
+ 'iacute' => "i\\*'", # small i, acute accent
+ 'Icirc' => 'I\\*^', # capital I, circumflex accent
+ 'icirc' => 'i\\*^', # small i, circumflex accent
+ 'Igrave' => 'I\\*`', # capital I, grave accent
+ 'igrave' => 'i\\*`', # small i, grave accent
+ 'Iuml' => 'I\\*:', # capital I, dieresis or umlaut mark
+ 'iuml' => 'i\\*:', # small i, dieresis or umlaut mark
+ 'Ntilde' => 'N\*~', # capital N, tilde
+ 'ntilde' => 'n\*~', # small n, tilde
+ 'Oacute' => "O\\*'", # capital O, acute accent
+ 'oacute' => "o\\*'", # small o, acute accent
+ 'Ocirc' => 'O\\*^', # capital O, circumflex accent
+ 'ocirc' => 'o\\*^', # small o, circumflex accent
+ 'Ograve' => 'O\\*`', # capital O, grave accent
+ 'ograve' => 'o\\*`', # small o, grave accent
+ 'Oslash' => 'O\\*/', # capital O, slash
+ 'oslash' => 'o\\*/', # small o, slash
+ 'Otilde' => 'O\\*~', # capital O, tilde
+ 'otilde' => 'o\\*~', # small o, tilde
+ 'Ouml' => 'O\\*:', # capital O, dieresis or umlaut mark
+ 'ouml' => 'o\\*:', # small o, dieresis or umlaut mark
+ 'szlig' => '\*8', # small sharp s, German (sz ligature)
+ 'THORN' => '\\*(Th', # capital THORN, Icelandic
+ 'thorn' => '\\*(th', # small thorn, Icelandic
+ 'Uacute' => "U\\*'", # capital U, acute accent
+ 'uacute' => "u\\*'", # small u, acute accent
+ 'Ucirc' => 'U\\*^', # capital U, circumflex accent
+ 'ucirc' => 'u\\*^', # small u, circumflex accent
+ 'Ugrave' => 'U\\*`', # capital U, grave accent
+ 'ugrave' => 'u\\*`', # small u, grave accent
+ 'Uuml' => 'U\\*:', # capital U, dieresis or umlaut mark
+ 'uuml' => 'u\\*:', # small u, dieresis or umlaut mark
+ 'Yacute' => "Y\\*'", # capital Y, acute accent
+ 'yacute' => "y\\*'", # small y, acute accent
+ 'yuml' => 'y\\*:', # small y, dieresis or umlaut mark
+);
+
+
+############################################################################
+# Static helper functions
+############################################################################
+
+# Protect leading quotes and periods against interpretation as commands.
+# Also protect anything starting with a backslash, since it could expand
+# or hide something that *roff would interpret as a command. This is
+# overkill, but it's much simpler than trying to parse *roff here.
+sub protect {
+ local $_ = shift;
+ 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.
+# If there are double quotes, use an if statement to test for nroff, and for
+# nroff output the command followed by the argument in double quotes with
+# embedded double quotes doubled. For other formatters, remap paired double
+# quotes to `` and ''.
+sub switchquotes {
+ my $command = shift;
+ local $_ = shift;
+ my $extra = shift;
+ s/\\\*\([LR]\"/\"/g;
+ if (/\"/) {
+ s/\"/\"\"/g;
+ my $troff = $_;
+ $troff =~ s/\"\"([^\"]*)\"\"/\`\`$1\'\'/g;
+ s/\"/\"\"/g if $extra;
+ $troff =~ s/\"/\"\"/g if $extra;
+ $_ = qq("$_") . ($extra ? " $extra" : '');
+ $troff = qq("$troff") . ($extra ? " $extra" : '');
+ return ".if n $command $_\n.el $command $troff\n";
+ } else {
+ $_ = qq("$_") . ($extra ? " $extra" : '');
+ return "$command $_\n";
+ }
+}
+
+# Translate a font string into an escape.
+sub toescape { (length ($_[0]) > 1 ? '\f(' : '\f') . $_[0] }
+
+
+############################################################################
+# Initialization
+############################################################################
+
+# Initialize the object. Here, we also process any additional options
+# passed to the constructor or set up defaults if none were given. center
+# is the centered title, release is the version number, and date is the date
+# for the documentation. Note that we can't know what file name we're
+# processing due to the architecture of Pod::Parser, so that *has* to either
+# be passed to the constructor or set separately with Pod::Man::name().
+sub initialize {
+ my $self = shift;
+
+ # Figure out the fixed-width font. If user-supplied, make sure that
+ # they are the right length.
+ for (qw/fixed fixedbold fixeditalic fixedbolditalic/) {
+ if (defined $$self{$_}) {
+ if (length ($$self{$_}) < 1 || length ($$self{$_}) > 2) {
+ croak "roff font should be 1 or 2 chars, not `$$self{$_}'";
+ }
+ } else {
+ $$self{$_} = '';
+ }
+ }
+
+ # Set the default fonts. We can't be sure what fixed bold-italic is
+ # going to be called, so default to just bold.
+ $$self{fixed} ||= 'CW';
+ $$self{fixedbold} ||= 'CB';
+ $$self{fixeditalic} ||= 'CI';
+ $$self{fixedbolditalic} ||= 'CB';
+
+ # Set up a table of font escapes. First number is fixed-width, second
+ # is bold, third is italic.
+ $$self{FONTS} = { '000' => '\fR', '001' => '\fI',
+ '010' => '\fB', '011' => '\f(BI',
+ '100' => toescape ($$self{fixed}),
+ '101' => toescape ($$self{fixeditalic}),
+ '110' => toescape ($$self{fixedbold}),
+ '111' => toescape ($$self{fixedbolditalic})};
+
+ # Extra stuff for page titles.
+ $$self{center} = 'User Contributed Perl Documentation'
+ unless defined $$self{center};
+ $$self{indent} = 4 unless defined $$self{indent};
+
+ # We used to try first to get the version number from a local binary,
+ # but we shouldn't need that any more. Get the version from the running
+ # Perl. Work a little magic to handle subversions correctly under both
+ # the pre-5.6 and the post-5.6 version numbering schemes.
+ if (!defined $$self{release}) {
+ my @version = ($] =~ /^(\d+)\.(\d{3})(\d{0,3})$/);
+ $version[2] ||= 0;
+ $version[2] *= 10 ** (3 - length $version[2]);
+ for (@version) { $_ += 0 }
+ $$self{release} = 'perl v' . join ('.', @version);
+ }
+
+ # Double quotes in things that will be quoted.
+ for (qw/center date release/) {
+ $$self{$_} =~ s/\"/\"\"/g if $$self{$_};
+ }
+
+ $$self{INDENT} = 0; # Current indentation level.
+ $$self{INDENTS} = []; # Stack of indentations.
+ $$self{INDEX} = []; # Index keys waiting to be printed.
+
+ $self->SUPER::initialize;
+}
+
+# For each document we process, output the preamble first. Note that the
+# fixed width font is a global default; once we interpolate it into the
+# PREAMBLE, it ain't ever changing. Maybe fix this later.
+sub begin_pod {
+ my $self = shift;
+
+ # Try to figure out the name and section from the file name.
+ my $section = $$self{section} || 1;
+ my $name = $$self{name};
+ if (!defined $name) {
+ $name = $self->input_file;
+ $section = 3 if (!$$self{section} && $name =~ /\.pm\z/i);
+ $name =~ s/\.p(od|[lm])\z//i;
+ if ($section =~ /^1/) {
+ require File::Basename;
+ $name = uc File::Basename::basename ($name);
+ } else {
+ # Lose everything up to the first of
+ # */lib/*perl* standard or site_perl module
+ # */*perl*/lib from -D prefix=/opt/perl
+ # */*perl*/ random module hierarchy
+ # which works. Should be fixed to use File::Spec. Also handle
+ # a leading lib/ since that's what ExtUtils::MakeMaker creates.
+ for ($name) {
+ s%//+%/%g;
+ if ( s%^.*?/lib/[^/]*perl[^/]*/%%si
+ or s%^.*?/[^/]*perl[^/]*/(?:lib/)?%%si) {
+ s%^site(_perl)?/%%s; # site and site_perl
+ s%^(.*-$^O|$^O-.*)/%%so; # arch
+ s%^\d+\.\d+%%s; # version
+ }
+ s%^lib/%%;
+ s%/%::%g;
+ }
+ }
+ }
+
+ # Modification date header. Try to use the modification time of our
+ # input.
+ if (!defined $$self{date}) {
+ my $time = (stat $self->input_file)[9] || time;
+ my ($day, $month, $year) = (localtime $time)[3,4,5];
+ $month++;
+ $year += 1900;
+ $$self{date} = sprintf ('%4d-%02d-%02d', $year, $month, $day);
+ }
+
+ # Now, print out the preamble and the title.
+ $PREAMBLE =~ s/\@CFONT\@/$$self{fixed}/;
+ chomp $PREAMBLE;
+ print { $self->output_handle } <<"----END OF HEADER----";
+.\\" Automatically generated by Pod::Man version $VERSION
+.\\" @{[ scalar localtime ]}
+.\\"
+.\\" Standard preamble:
+.\\" ======================================================================
+$PREAMBLE
+.\\" ======================================================================
+.\\"
+.IX Title "$name $section"
+.TH $name $section "$$self{release}" "$$self{date}" "$$self{center}"
+.UC
+----END OF HEADER----
+#"# for cperl-mode
+
+ # Initialize a few per-file variables.
+ $$self{INDENT} = 0;
+ $$self{NEEDSPACE} = 0;
+}
+
+
+############################################################################
+# Core overrides
+############################################################################
+
+# Called for each command paragraph. Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object. Just dispatches
+# the command to a method named the same as the command. =cut is handled
+# internally by Pod::Parser.
+sub command {
+ my $self = shift;
+ my $command = shift;
+ return if $command eq 'pod';
+ return if ($$self{EXCLUDE} && $command ne 'end');
+ $command = 'cmd_' . $command;
+ $self->$command (@_);
+}
+
+# Called for a verbatim paragraph. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Rofficate backslashes, untabify, put a
+# zero-width character at the beginning of each line to protect against
+# commands, and wrap in .Vb/.Ve.
+sub verbatim {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ local $_ = shift;
+ return if /^\s+$/;
+ s/\s+$/\n/;
+ my $lines = tr/\n/\n/;
+ 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->output (".Vb $lines\n$_.Ve\n");
+ $$self{NEEDSPACE} = 0;
+}
+
+# Called for a regular text block. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Perform interpolation and output the results.
+sub textblock {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ $self->output ($_[0]), return if $$self{VERBATIM};
+
+ # Perform a little magic to collapse multiple L<> references. We'll
+ # just rewrite the whole thing into actual text at this part, bypassing
+ # the whole internal sequence parsing thing.
+ my $text = shift;
+ $text =~ s{
+ (L< # A link of the form L</something>.
+ /
+ (
+ [:\w]+ # The item has to be a simple word...
+ (\(\))? # ...or simple function.
+ )
+ >
+ (
+ ,?\s+(and\s+)? # Allow lots of them, conjuncted.
+ L<
+ /
+ ( [:\w]+ ( \(\) )? )
+ >
+ )+
+ )
+ } {
+ local $_ = $1;
+ s{ L< / ( [^>]+ ) > } {$1}xg;
+ my @items = split /(?:,?\s+(?:and\s+)?)/;
+ my $string = 'the ';
+ my $i;
+ for ($i = 0; $i < @items; $i++) {
+ $string .= $items[$i];
+ $string .= ', ' if @items > 2 && $i != $#items;
+ $string .= ' ' if @items == 2 && $i == 2;
+ $string .= 'and ' if ($i == $#items - 1);
+ }
+ $string .= ' entries elsewhere in this document';
+ $string;
+ }gex;
+
+ # Parse the tree and output it. collapse knows about references to
+ # 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->output (protect $self->mapfonts ($text));
+ $self->outindex;
+ $$self{NEEDSPACE} = 1;
+}
+
+# Called for an interior sequence. Takes a Pod::InteriorSequence object and
+# returns a reference to a scalar. This scalar is the final formatted text.
+# It's returned as a reference so that other interior sequences above us
+# know that the text has already been processed.
+sub sequence {
+ my ($self, $seq) = @_;
+ my $command = $seq->cmd_name;
+
+ # Zero-width characters.
+ if ($command eq 'Z') {
+ # Workaround to generate a blessable reference, needed by 5.005.
+ my $tmp = '\&';
+ return bless \ "$tmp", 'Pod::Man::String';
+ }
+
+ # C<>, L<>, X<>, and E<> don't apply guesswork to their contents.
+ local $_ = $self->collapse ($seq->parse_tree, $command =~ /^[CELX]$/);
+
+ # Handle E<> escapes.
+ if ($command eq 'E') {
+ if (/^\d+$/) {
+ return bless \ chr ($_), 'Pod::Man::String';
+ } elsif (exists $ESCAPES{$_}) {
+ return bless \ "$ESCAPES{$_}", 'Pod::Man::String';
+ } else {
+ carp "Unknown escape E<$1>";
+ return bless \ "E<$_>", 'Pod::Man::String';
+ }
+ }
+
+ # For all the other sequences, empty content produces no output.
+ return '' if $_ eq '';
+
+ # Handle formatting sequences.
+ if ($command eq 'B') {
+ return bless \ ('\f(BS' . $_ . '\f(BE'), 'Pod::Man::String';
+ } elsif ($command eq 'F') {
+ return bless \ ('\f(IS' . $_ . '\f(IE'), 'Pod::Man::String';
+ } elsif ($command eq 'I') {
+ return bless \ ('\f(IS' . $_ . '\f(IE'), 'Pod::Man::String';
+ } elsif ($command eq 'C') {
+ s/-/\\-/g;
+ s/__/_\\|_/g;
+ return bless \ ('\f(FS\*(C`' . $_ . "\\*(C'\\f(FE"),
+ 'Pod::Man::String';
+ }
+
+ # Handle links.
+ if ($command eq 'L') {
+ # A bug in lvalue subs in 5.6 requires the temporary variable.
+ my $tmp = $self->buildlink ($_);
+ return bless \ "$tmp", 'Pod::Man::String';
+ }
+
+ # Whitespace protection replaces whitespace with "\ ".
+ if ($command eq 'S') {
+ s/\s+/\\ /g;
+ return bless \ "$_", 'Pod::Man::String';
+ }
+
+ # Add an index entry to the list of ones waiting to be output.
+ if ($command eq 'X') { push (@{ $$self{INDEX} }, $_); return '' }
+
+ # Anything else is unknown.
+ carp "Unknown sequence $command<$_>";
+}
+
+
+############################################################################
+# Command paragraphs
+############################################################################
+
+# All command paragraphs take the paragraph and the line number.
+
+# First level heading. We can't output .IX in the NAME section due to a bug
+# in some versions of catman, so don't output a .IX for that section. .SH
+# already uses small caps, so remove any E<> sequences that would cause
+# them.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = $self->parse (@_);
+ s/\s+$//;
+ s/\\s-?\d//g;
+ $self->output (switchquotes ('.SH', $self->mapfonts ($_)));
+ $self->outindex (($_ eq 'NAME') ? () : ('Header', $_));
+ $$self{NEEDSPACE} = 0;
+}
+
+# Second level heading.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = $self->parse (@_);
+ s/\s+$//;
+ $self->output (switchquotes ('.Sh', $self->mapfonts ($_)));
+ $self->outindex ('Subsection', $_);
+ $$self{NEEDSPACE} = 0;
+}
+
+# Start a list. For indents after the first, wrap the outside indent in .RS
+# so that hanging paragraph tags will be correct.
+sub cmd_over {
+ my $self = shift;
+ local $_ = shift;
+ unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+ if (@{ $$self{INDENTS} } > 0) {
+ $self->output (".RS $$self{INDENT}\n");
+ }
+ push (@{ $$self{INDENTS} }, $$self{INDENT});
+ $$self{INDENT} = ($_ + 0);
+}
+
+# End a list. If we've closed an embedded indent, we've mangled the hanging
+# paragraph indent, so temporarily replace it with .RS and set WEIRDINDENT.
+# We'll close that .RS at the next =back or =item.
+sub cmd_back {
+ my $self = shift;
+ $$self{INDENT} = pop @{ $$self{INDENTS} };
+ unless (defined $$self{INDENT}) {
+ carp "Unmatched =back";
+ $$self{INDENT} = 0;
+ }
+ if ($$self{WEIRDINDENT}) {
+ $self->output (".RE\n");
+ $$self{WEIRDINDENT} = 0;
+ }
+ if (@{ $$self{INDENTS} } > 0) {
+ $self->output (".RE\n");
+ $self->output (".RS $$self{INDENT}\n");
+ $$self{WEIRDINDENT} = 1;
+ }
+ $$self{NEEDSPACE} = 1;
+}
+
+# An individual list item. Emit an index entry for anything that's
+# interesting, but don't emit index entries for things like bullets and
+# numbers. rofficate bullets too while we're at it (so for nice output, use
+# * for your lists rather than o or . or - or some other thing). Newlines
+# in an item title are turned into spaces since *roff can't handle them
+# embedded.
+sub cmd_item {
+ my $self = shift;
+ local $_ = $self->parse (@_);
+ s/\s+$//;
+ s/\s*\n\s*/ /g;
+ my $index;
+ if (/\w/ && !/^\w[.\)]\s*$/) {
+ $index = $_;
+ $index =~ s/^\s*[-*+o.]?\s*//;
+ }
+ s/^\*(\s|\Z)/\\\(bu$1/;
+ if ($$self{WEIRDINDENT}) {
+ $self->output (".RE\n");
+ $$self{WEIRDINDENT} = 0;
+ }
+ $_ = $self->mapfonts ($_);
+ $self->output (switchquotes ('.Ip', $_, $$self{INDENT}));
+ $self->outindex ($index ? ('Item', $index) : ());
+ $$self{NEEDSPACE} = 0;
+}
+
+# Begin a block for a particular translator. Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+ my $self = shift;
+ local $_ = shift;
+ my ($kind) = /^(\S+)/ or return;
+ if ($kind eq 'man' || $kind eq 'roff') {
+ $$self{VERBATIM} = 1;
+ } else {
+ $$self{EXCLUDE} = 1;
+ }
+}
+
+# End a block for a particular translator. We assume that all =begin/=end
+# pairs are properly closed.
+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 man or roff, in which case we output it verbatim.
+sub cmd_for {
+ my $self = shift;
+ local $_ = shift;
+ return unless s/^(?:man|roff)\b[ \t]*\n?//;
+ $self->output ($_);
+}
+
+
+############################################################################
+# Link handling
+############################################################################
+
+# Handle links. We can't actually make real hyperlinks, so this is all to
+# figure out what text and formatting we print out.
+sub buildlink {
+ my $self = shift;
+ local $_ = shift;
+
+ # Smash whitespace in case we were split across multiple lines.
+ s/\s+/ /g;
+
+ # If we were given any explicit text, just output it.
+ if (m{ ^ ([^|]+) \| }x) { return $1 }
+
+ # Okay, leading and trailing whitespace isn't important.
+ s/^\s+//;
+ s/\s+$//;
+
+ # Default to using the whole content of the link entry as a section
+ # name. Note that L<manpage/> forces a manpage interpretation, as does
+ # something looking like L<manpage(section)>. Do the same thing to
+ # L<manpage(section)> as we would to manpage(section) without the L<>;
+ # see guesswork(). If we've added italics, don't add the "manpage"
+ # text; markup is sufficient.
+ my ($manpage, $section) = ('', $_);
+ if (/^"\s*(.*?)\s*"$/) {
+ $section = '"' . $1 . '"';
+ } elsif (m{ ^ [-:.\w]+ (?: \( \S+ \) )? $ }x) {
+ ($manpage, $section) = ($_, '');
+ $manpage =~ s/^([^\(]+)\(/'\f(IS' . $1 . '\f(IE\|('/e;
+ } elsif (m%/%) {
+ ($manpage, $section) = split (/\s*\/\s*/, $_, 2);
+ if ($manpage =~ /^[-:.\w]+(?:\(\S+\))?$/) {
+ $manpage =~ s/^([^\(]+)\(/'\f(IS' . $1 . '\f(IE\|'/e;
+ }
+ $section =~ s/^\"\s*//;
+ $section =~ s/\s*\"$//;
+ }
+ if ($manpage && $manpage !~ /\\f\(IS/) {
+ $manpage = "the $manpage manpage";
+ }
+
+ # Now build the actual output text.
+ my $text = '';
+ if (!length ($section) && !length ($manpage)) {
+ carp "Invalid link $_";
+ } elsif (!length ($section)) {
+ $text = $manpage;
+ } elsif ($section =~ /^[:\w]+(?:\(\))?/) {
+ $text .= 'the ' . $section . ' entry';
+ $text .= (length $manpage) ? " in $manpage"
+ : " elsewhere in this document";
+ } else {
+ if ($section !~ /^".*"$/) { $section = '"' . $section . '"' }
+ $text .= 'the section on ' . $section;
+ $text .= " in $manpage" if length $manpage;
+ }
+ $text;
+}
+
+
+############################################################################
+# Escaping and fontification
+############################################################################
+
+# At this point, we'll have embedded font codes of the form \f(<font>[SE]
+# where <font> is one of B, I, or F. Turn those into the right font start
+# or end codes. B<someI<thing> else> should map to \fBsome\f(BIthing\fB
+# else\fR. The old pod2man didn't get this right; the second \fB was \fR,
+# so nested sequences didn't work right. We take care of this by using
+# variables as a combined pointer to our current font sequence, and set each
+# to the number of current nestings of start tags for that font. Use them
+# as a vector to look up what font sequence to use.
+sub mapfonts {
+ my $self = shift;
+ local $_ = shift;
+
+ my ($fixed, $bold, $italic) = (0, 0, 0);
+ my %magic = (F => \$fixed, B => \$bold, I => \$italic);
+ s { \\f\((.)(.) } {
+ ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1;
+ $$self{FONTS}{($fixed && 1) . ($bold && 1) . ($italic && 1)};
+ }gxe;
+ $_;
+}
+
+
+############################################################################
+# *roff-specific parsing
+############################################################################
+
+# Called instead of parse_text, calls parse_text with the right flags.
+sub parse {
+ my $self = shift;
+ $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,
+# guesswork() will be called on all plain scalars in the parse tree.
+# Assumes that everything in the parse tree is either a scalar or a
+# reference to a scalar.
+sub collapse {
+ my ($self, $ptree, $literal) = @_;
+ if ($literal) {
+ return join ('', map {
+ if (ref $_) {
+ $$_;
+ } else {
+ s/\\/\\e/g;
+ $_;
+ }
+ } $ptree->children);
+ } else {
+ return join ('', map {
+ ref ($_) ? $$_ : $self->guesswork ($_)
+ } $ptree->children);
+ }
+}
+
+# Takes a text block to perform guesswork on; this is guaranteed not to
+# contain any interior sequences. Returns the text block with remapping
+# done.
+sub guesswork {
+ my $self = shift;
+ local $_ = shift;
+
+ # rofficate backslashes.
+ s/\\/\\e/g;
+
+ # Ensure double underbars have a tiny space between them.
+ s/__/_\\|_/g;
+
+ # Make all caps a little smaller. Be careful here, since we don't want
+ # to make @ARGV into small caps, nor do we want to fix the MIME in
+ # MIME-Version, since it looks weird with the full-height V.
+ s{
+ ( ^ | [\s\(\"\'\`\[\{<>] )
+ ( [A-Z] [A-Z] [/A-Z+:\d_\$&-]* )
+ (?: (?= [\s>\}\]\)\'\".?!,;:] | -- ) | $ )
+ } { $1 . '\s-1' . $2 . '\s0' }egx;
+
+ # Turn PI into a pretty pi.
+ s{ (?: \\s-1 | \b ) PI (?: \\s0 | \b ) } {\\*\(PI}gx;
+
+ # Italize functions in the form func().
+ s{
+ \b
+ (
+ [:\w]+ (?:\\s-1)? \(\)
+ )
+ } { '\f(IS' . $1 . '\f(IE' }egx;
+
+ # func(n) is a reference to a manual page. Make it \fIfunc\fR\|(n).
+ s{
+ \b
+ (\w[-:.\w]+ (?:\\s-1)?)
+ (
+ \( [^\)] \)
+ )
+ } { '\f(IS' . $1 . '\f(IE\|' . $2 }egx;
+
+ # Convert simple Perl variable references to a fixed-width font.
+ s{
+ ( \s+ )
+ ( [\$\@%] [\w:]+ )
+ (?! \( )
+ } { $1 . '\f(FS' . $2 . '\f(FE'}egx;
+
+ # Translate -- into a real em dash if it's used like one and fix up
+ # dashes, but keep hyphens hyphens.
+ s{ (\G|^|.) (-+) (\b|.) } {
+ my ($pre, $dash, $post) = ($1, $2, $3);
+ if (length ($dash) == 1) {
+ ($pre =~ /[a-zA-Z]/) ? "$pre-$post" : "$pre\\-$post";
+ } elsif (length ($dash) == 2
+ && ((!$pre && !$post)
+ || ($pre =~ /\w/ && !$post)
+ || ($pre eq ' ' && $post eq ' ')
+ || ($pre eq '=' && $post ne '=')
+ || ($pre ne '=' && $post eq '='))) {
+ "$pre\\*(--$post";
+ } else {
+ $pre . ('\-' x length $dash) . $post;
+ }
+ }egxs;
+
+ # Fix up double quotes.
+ s{ \" ([^\"]+) \" } { '\*(L"' . $1 . '\*(R"' }egx;
+
+ # Make C++ into \*(C+, which is a squinched version.
+ s{ \b C\+\+ } {\\*\(C+}gx;
+
+ # All done.
+ $_;
+}
+
+
+############################################################################
+# Output formatting
+############################################################################
+
+# Make vertical whitespace.
+sub makespace {
+ my $self = shift;
+ $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n");
+}
+
+# Output any pending index entries, and optionally an index entry given as
+# an argument. Support multiple index entries in X<> separated by slashes,
+# and strip special escapes from index entries.
+sub outindex {
+ my ($self, $section, $index) = @_;
+ my @entries = map { split m%\s*/\s*% } @{ $$self{INDEX} };
+ return unless ($section || @entries);
+ $$self{INDEX} = [];
+ my $output;
+ if (@entries) {
+ my $output = '.IX Xref "'
+ . join (' ', map { s/\"/\"\"/; $_ } @entries)
+ . '"' . "\n";
+ }
+ if ($section) {
+ $index =~ s/\"/\"\"/;
+ $index =~ s/\\-/-/g;
+ $index =~ s/\\(?:s-?\d|.\(..|.)//g;
+ $output .= ".IX $section " . '"' . $index . '"' . "\n";
+ }
+ $self->output ($output);
+}
+
+# Output text to the output device.
+sub output { print { $_[0]->output_handle } $_[1] }
+
+__END__
+
+.\" These are some extra bits of roff that I don't want to lose track of
+.\" but that have been removed from the preamble to make it a bit shorter
+.\" since they're not currently being used. They're accents and special
+.\" characters we don't currently have escapes for.
+.if n \{\
+. ds ? ?
+. ds ! !
+. ds q
+.\}
+.if t \{\
+. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
+. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
+. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
+.\}
+.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
+.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
+.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
+.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
+.ds oe o\h'-(\w'o'u*4/10)'e
+.ds Oe O\h'-(\w'O'u*4/10)'E
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds v \h'-1'\o'\(aa\(ga'
+. ds _ \h'-1'^
+. ds . \h'-1'.
+. ds 3 3
+. ds oe oe
+. ds Oe OE
+.\}
+
+############################################################################
+# Documentation
+############################################################################
+
+=head1 NAME
+
+Pod::Man - Convert POD data to formatted *roff input
+
+=head1 SYNOPSIS
+
+ use Pod::Man;
+ my $parser = Pod::Man->new (release => $VERSION, section => 8);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.1.
+ $parser->parse_from_file ('file.pod', 'file.1');
+
+=head1 DESCRIPTION
+
+Pod::Man is a module to convert documentation in the POD format (the
+preferred language for documenting Perl) into *roff input using the man
+macro set. The resulting *roff code is suitable for display on a terminal
+using nroff(1), normally via man(1), or printing using troff(1). It is
+conventionally invoked using the driver script B<pod2man>, but it can also
+be used directly.
+
+As a derived class from Pod::Parser, Pod::Man supports the same methods and
+interfaces. See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<Pod::Man-E<gt>new()> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs that control the
+behavior of the parser. See below for details.
+
+If no options are given, Pod::Man uses the name of the input file with any
+trailing C<.pod>, C<.pm>, or C<.pl> stripped as the man page title, to
+section 1 unless the file ended in C<.pm> in which case it defaults to
+section 3, to a centered title of "User Contributed Perl Documentation", to
+a centered footer of the Perl version it is run with, and to a left-hand
+footer of the modification date of its input (or the current date if given
+STDIN for input).
+
+Pod::Man assumes that your *roff formatters have a fixed-width font named
+CW. If yours is called something else (like CR), use the C<fixed> option to
+specify it. This generally only matters for troff output for printing.
+Similarly, you can set the fonts used for bold, italic, and bold italic
+fixed-width output.
+
+Besides the obvious pod conversions, Pod::Man also takes care of formatting
+func(), func(n), and simple variable references like $foo or @bar so you
+don't have to use code escapes for them; complex expressions like
+C<$fred{'stuff'}> will still need to be escaped, though. It also translates
+dashes that aren't used as hyphens into en dashes, makes long dashes--like
+this--into proper em dashes, fixes "paired quotes," makes C++ and PI look
+right, puts a little space between double underbars, makes ALLCAPS a teeny
+bit smaller in troff(1), and escapes stuff that *roff treats as special so
+that you don't have to.
+
+The recognized options to new() are as follows. All options take a single
+argument.
+
+=over 4
+
+=item center
+
+Sets the centered page header to use instead of "User Contributed Perl
+Documentation".
+
+=item date
+
+Sets the left-hand footer. By default, the modification date of the input
+file will be used, or the current date if stat() can't find that file (the
+case if the input is from STDIN), and the date will be formatted as
+YYYY-MM-DD.
+
+=item fixed
+
+The fixed-width font to use for vertabim text and code. Defaults to CW.
+Some systems may want CR instead. Only matters for troff(1) output.
+
+=item fixedbold
+
+Bold version of the fixed-width font. Defaults to CB. Only matters for
+troff(1) output.
+
+=item fixeditalic
+
+Italic version of the fixed-width font (actually, something of a misnomer,
+since most fixed-width fonts only have an oblique version, not an italic
+version). Defaults to CI. Only matters for troff(1) output.
+
+=item fixedbolditalic
+
+Bold italic (probably actually oblique) version of the fixed-width font.
+Pod::Man doesn't assume you have this, and defaults to CB. Some systems
+(such as Solaris) have this font available as CX. Only matters for troff(1)
+output.
+
+=item release
+
+Set the centered footer. By default, this is the version of Perl you run
+Pod::Man under. Note that some system an macro sets assume that the
+centered footer will be a modification date and will prepend something like
+"Last modified: "; if this is the case, you may want to set C<release> to
+the last modified date and C<date> to the version number.
+
+=item section
+
+Set the section for the C<.TH> macro. The standard section numbering
+convention is to use 1 for user commands, 2 for system calls, 3 for
+functions, 4 for devices, 5 for file formats, 6 for games, 7 for
+miscellaneous information, and 8 for administrator commands. There is a lot
+of variation here, however; some systems (like Solaris) use 4 for file
+formats, 5 for miscellaneous information, and 7 for devices. Still others
+use 1m instead of 8, or some mix of both. About the only section numbers
+that are reliably consistent are 1, 2, and 3.
+
+By default, section 1 will be used unless the file ends in .pm in which case
+section 3 will be selected.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to. The first defaults
+to STDIN if not given, and the second defaults to STDOUT. The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead. See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item roff font should be 1 or 2 chars, not `%s'
+
+(F) You specified a *roff font (using C<fixed>, C<fixedbold>, etc.) that
+wasn't either one or two characters. Pod::Man doesn't support *roff fonts
+longer than two characters, although some *roff extensions do (the canonical
+versions of nroff(1) and troff(1) don't either).
+
+=item Invalid link %s
+
+(W) The POD source contained a C<LE<lt>E<gt>> sequence that Pod::Man was
+unable to parse. You should never see this error message; it probably
+indicates a bug in Pod::Man.
+
+=item Unknown escape EE<lt>%sE<gt>
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Man didn't
+know about. C<EE<lt>%sE<gt>> was printed verbatim in the output.
+
+=item Unknown sequence %s
+
+(W) The POD source contained a non-standard interior sequence (something of
+the form C<XE<lt>E<gt>>) that Pod::Man didn't know about. It was ignored.
+
+=item Unmatched =back
+
+(W) Pod::Man encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 BUGS
+
+The lint-like features and strict POD format checking done by B<pod2man> are
+not yet implemented and should be, along with the corresponding C<lax>
+option.
+
+The NAME section should be recognized specially and index entries emitted
+for everything in that section. This would have to be deferred until the
+next section, since extraneous things in NAME tends to confuse various man
+page processors.
+
+The handling of hyphens, en dashes, and em dashes is somewhat fragile, and
+one may get the wrong one under some circumstances. This should only matter
+for troff(1) output.
+
+When and whether to use small caps is somewhat tricky, and Pod::Man doesn't
+necessarily get it right.
+
+Pod::Man doesn't handle font names longer than two characters. Neither do
+most troff(1) implementations, but GNU troff does as an extension. It would
+be nice to support as an option for those who want to use it.
+
+The preamble added to each output file is rather verbose, and most of it is
+only necessary in the presence of EE<lt>E<gt> escapes for non-ASCII
+characters. It would ideally be nice if all of those definitions were only
+output if needed, perhaps on the fly as the characters are used.
+
+Some of the automagic applied to file names assumes Unix directory
+separators.
+
+Pod::Man is excessively slow.
+
+=head1 SEE ALSO
+
+L<Pod::Parser|Pod::Parser>, perlpod(1), pod2man(1), nroff(1), troff(1),
+man(1), man(7)
+
+Ossanna, Joseph F., and Brian W. Kernighan. "Troff User's Manual,"
+Computing Science Technical Report No. 54, AT&T Bell Laboratories. This is
+the best documentation of standard nroff(1) and troff(1). At the time of
+this writing, it's available at http://www.cs.bell-labs.com/cm/cs/cstr.html.
+
+The man page documenting the man macro set may be man(5) instead of man(7)
+on your system. Also, please see pod2man(1) for extensive documentation on
+writing manual pages if you've not done it before and aren't familiar with
+the conventions.
+
+=head1 AUTHOR
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the
+original B<pod2man> by Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>.
+
+=cut
diff --git a/contrib/perl5/lib/Pod/ParseUtils.pm b/contrib/perl5/lib/Pod/ParseUtils.pm
new file mode 100644
index 0000000..2cb8cdc
--- /dev/null
+++ b/contrib/perl5/lib/Pod/ParseUtils.pm
@@ -0,0 +1,837 @@
+#############################################################################
+# Pod/ParseUtils.pm -- helpers for POD parsing and conversion
+#
+# Copyright (C) 1999-2000 by Marek Rouchal. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::ParseUtils;
+
+use vars qw($VERSION);
+$VERSION = 0.2; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+=head1 NAME
+
+Pod::ParseUtils - helpers for POD parsing and conversion
+
+=head1 SYNOPSIS
+
+ use Pod::ParseUtils;
+
+ my $list = new Pod::List;
+ my $link = Pod::Hyperlink->new('Pod::Parser');
+
+=head1 DESCRIPTION
+
+B<Pod::ParseUtils> contains a few object-oriented helper packages for
+POD parsing and processing (i.e. in POD formatters and translators).
+
+=cut
+
+#-----------------------------------------------------------------------------
+# Pod::List
+#
+# class to hold POD list info (=over, =item, =back)
+#-----------------------------------------------------------------------------
+
+package Pod::List;
+
+use Carp;
+
+=head2 Pod::List
+
+B<Pod::List> can be used to hold information about POD lists
+(written as =over ... =item ... =back) for further processing.
+The following methods are available:
+
+=over 4
+
+=item new()
+
+Create a new list object. Properties may be specified through a hash
+reference like this:
+
+ my $list = Pod::List->new({ -start => $., -indent => 4 });
+
+See the individual methods/properties for details.
+
+=cut
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my %params = @_;
+ my $self = {%params};
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+sub initialize {
+ my $self = shift;
+ $self->{-file} ||= 'unknown';
+ $self->{-start} ||= 'unknown';
+ $self->{-indent} ||= 4; # perlpod: "should be the default"
+ $self->{_items} = [];
+ $self->{-type} ||= '';
+}
+
+=item file()
+
+Without argument, retrieves the file name the list is in. This must
+have been set before by either specifying B<-file> in the B<new()>
+method or by calling the B<file()> method with a scalar argument.
+
+=cut
+
+# The POD file name the list appears in
+sub file {
+ return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item start()
+
+Without argument, retrieves the line number where the list started.
+This must have been set before by either specifying B<-start> in the
+B<new()> method or by calling the B<start()> method with a scalar
+argument.
+
+=cut
+
+# The line in the file the node appears
+sub start {
+ return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start};
+}
+
+=item indent()
+
+Without argument, retrieves the indent level of the list as specified
+in C<=over n>. This must have been set before by either specifying
+B<-indent> in the B<new()> method or by calling the B<indent()> method
+with a scalar argument.
+
+=cut
+
+# indent level
+sub indent {
+ return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent};
+}
+
+=item type()
+
+Without argument, retrieves the list type, which can be an arbitrary value,
+e.g. C<OL>, C<UL>, ... when thinking the HTML way.
+This must have been set before by either specifying
+B<-type> in the B<new()> method or by calling the B<type()> method
+with a scalar argument.
+
+=cut
+
+# The type of the list (UL, OL, ...)
+sub type {
+ return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
+}
+
+=item rx()
+
+Without argument, retrieves a regular expression for simplifying the
+individual item strings once the list type has been determined. Usage:
+E.g. when converting to HTML, one might strip the leading number in
+an ordered list as C<E<lt>OLE<gt>> already prints numbers itself.
+This must have been set before by either specifying
+B<-rx> in the B<new()> method or by calling the B<rx()> method
+with a scalar argument.
+
+=cut
+
+# The regular expression to simplify the items
+sub rx {
+ return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx};
+}
+
+=item item()
+
+Without argument, retrieves the array of the items in this list.
+The items may be represented by any scalar.
+If an argument has been given, it is pushed on the list of items.
+
+=cut
+
+# The individual =items of this list
+sub item {
+ my ($self,$item) = @_;
+ if(defined $item) {
+ push(@{$self->{_items}}, $item);
+ return $item;
+ }
+ else {
+ return @{$self->{_items}};
+ }
+}
+
+=item parent()
+
+Without argument, retrieves information about the parent holding this
+list, which is represented as an arbitrary scalar.
+This must have been set before by either specifying
+B<-parent> in the B<new()> method or by calling the B<parent()> method
+with a scalar argument.
+
+=cut
+
+# possibility for parsers/translators to store information about the
+# lists's parent object
+sub parent {
+ return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent};
+}
+
+=item tag()
+
+Without argument, retrieves information about the list tag, which can be
+any scalar.
+This must have been set before by either specifying
+B<-tag> in the B<new()> method or by calling the B<tag()> method
+with a scalar argument.
+
+=back
+
+=cut
+
+# possibility for parsers/translators to store information about the
+# list's object
+sub tag {
+ return (@_ > 1) ? ($_[0]->{-tag} = $_[1]) : $_[0]->{-tag};
+}
+
+#-----------------------------------------------------------------------------
+# Pod::Hyperlink
+#
+# class to manipulate POD hyperlinks (L<>)
+#-----------------------------------------------------------------------------
+
+package Pod::Hyperlink;
+
+=head2 Pod::Hyperlink
+
+B<Pod::Hyperlink> is a class for manipulation of POD hyperlinks. Usage:
+
+ my $link = Pod::Hyperlink->new('alternative text|page/"section in page"');
+
+The B<Pod::Hyperlink> class is mainly designed to parse the contents of the
+C<LE<lt>...E<gt>> sequence, providing a simple interface for accessing the
+different parts of a POD hyperlink for further processing. It can also be
+used to construct hyperlinks.
+
+=over 4
+
+=item new()
+
+The B<new()> method can either be passed a set of key/value pairs or a single
+scalar value, namely the contents of a C<LE<lt>...E<gt>> sequence. An object
+of the class C<Pod::Hyperlink> is returned. The value C<undef> indicates a
+failure, the error message is stored in C<$@>.
+
+=cut
+
+use Carp;
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my $self = +{};
+ bless $self, $class;
+ $self->initialize();
+ if(defined $_[0]) {
+ if(ref($_[0])) {
+ # called with a list of parameters
+ %$self = %{$_[0]};
+ $self->_construct_text();
+ }
+ else {
+ # called with L<> contents
+ return undef unless($self->parse($_[0]));
+ }
+ }
+ return $self;
+}
+
+sub initialize {
+ my $self = shift;
+ $self->{-line} ||= 'undef';
+ $self->{-file} ||= 'undef';
+ $self->{-page} ||= '';
+ $self->{-node} ||= '';
+ $self->{-alttext} ||= '';
+ $self->{-type} ||= 'undef';
+ $self->{_warnings} = [];
+}
+
+=item parse($string)
+
+This method can be used to (re)parse a (new) hyperlink, i.e. the contents
+of a C<LE<lt>...E<gt>> sequence. The result is stored in the current object.
+
+=cut
+
+sub parse {
+ my $self = shift;
+ local($_) = $_[0];
+ # syntax check the link and extract destination
+ my ($alttext,$page,$node,$type) = ('','','','');
+
+ $self->{_warnings} = [];
+
+ # collapse newlines with whitespace
+ if(s/\s*\n+\s*/ /g) {
+ $self->warning("collapsing newlines to blanks");
+ }
+ # strip leading/trailing whitespace
+ if(s/^[\s\n]+//) {
+ $self->warning("ignoring leading whitespace in link");
+ }
+ if(s/[\s\n]+$//) {
+ $self->warning("ignoring trailing whitespace in link");
+ }
+ unless(length($_)) {
+ _invalid_link("empty link");
+ return undef;
+ }
+
+ ## Check for different possibilities. This is tedious and error-prone
+ # we match all possibilities (alttext, page, section/item)
+ #warn "DEBUG: link=$_\n";
+
+ # only page
+ # problem: a lot of people use (), or (1) or the like to indicate
+ # man page sections. But this collides with L<func()> that is supposed
+ # to point to an internal funtion...
+ # I would like the following better, here and below:
+ #if(m!^(\w+(?:::\w+)*)$!) {
+ my $page_rx = '[\w.]+(?:::[\w.]+)*';
+ if(m!^($page_rx)$!o) {
+ $page = $1;
+ $type = 'page';
+ }
+ # alttext, page and "section"
+ elsif(m!^(.+?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) {
+ ($alttext, $page, $node) = ($1, $2, $3);
+ $type = 'section';
+ }
+ # alttext and page
+ elsif(m!^(.+?)\s*[|]\s*($page_rx)$!o) {
+ ($alttext, $page) = ($1, $2);
+ $type = 'page';
+ }
+ # alttext and "section"
+ elsif(m!^(.+?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {
+ ($alttext, $node) = ($1,$2);
+ $type = 'section';
+ }
+ # page and "section"
+ elsif(m!^($page_rx)\s*/\s*"(.+)"$!o) {
+ ($page, $node) = ($1, $2);
+ $type = 'section';
+ }
+ # page and item
+ elsif(m!^($page_rx)\s*/\s*(.+)$!o) {
+ ($page, $node) = ($1, $2);
+ $type = 'item';
+ }
+ # only "section"
+ elsif(m!^/?"(.+)"$!) {
+ $node = $1;
+ $type = 'section';
+ }
+ # only item
+ elsif(m!^\s*/(.+)$!) {
+ $node = $1;
+ $type = 'item';
+ }
+ # non-standard: Hyperlink
+ elsif(m!^((?:http|ftp|mailto|news):.+)$!i) {
+ $node = $1;
+ $type = 'hyperlink';
+ }
+ # alttext, page and item
+ elsif(m!^(.+?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) {
+ ($alttext, $page, $node) = ($1, $2, $3);
+ $type = 'item';
+ }
+ # alttext and item
+ elsif(m!^(.+?)\s*[|]\s*/(.+)$!) {
+ ($alttext, $node) = ($1,$2);
+ }
+ # nonstandard: alttext and hyperlink
+ elsif(m!^(.+?)\s*[|]\s*((?:http|ftp|mailto|news):.+)$!) {
+ ($alttext, $node) = ($1,$2);
+ $type = 'hyperlink';
+ }
+ # must be an item or a "malformed" section (without "")
+ else {
+ $node = $_;
+ $type = 'item';
+ }
+ # collapse whitespace in nodes
+ $node =~ s/\s+/ /gs;
+
+ #if($page =~ /[(]\w*[)]$/) {
+ # $self->warning("section in '$page' deprecated");
+ #}
+ if($node =~ m:[|/]:) {
+ $self->warning("node '$node' contains non-escaped | or /");
+ }
+ if($alttext =~ m:[|/]:) {
+ $self->warning("alternative text '$node' contains non-escaped | or /");
+ }
+ $self->{-page} = $page;
+ $self->{-node} = $node;
+ $self->{-alttext} = $alttext;
+ #warn "DEBUG: page=$page section=$section item=$item alttext=$alttext\n";
+ $self->{-type} = $type;
+ $self->_construct_text();
+ 1;
+}
+
+sub _construct_text {
+ my $self = shift;
+ my $alttext = $self->alttext();
+ my $type = $self->type();
+ my $section = $self->node();
+ my $page = $self->page();
+ my $page_ext = '';
+ $page =~ s/([(]\w*[)])$// && ($page_ext = $1);
+ if($alttext) {
+ $self->{_text} = $alttext;
+ }
+ elsif($type eq 'hyperlink') {
+ $self->{_text} = $section;
+ }
+ else {
+ $self->{_text} = (!$section ? '' :
+ $type eq 'item' ? "the $section entry" :
+ "the section on $section" ) .
+ ($page ? ($section ? ' in ':'') . "the $page$page_ext manpage" :
+ ' elsewhere in this document');
+ }
+ # for being marked up later
+ # use the non-standard markers P<> and Q<>, so that the resulting
+ # text can be parsed by the translators. It's their job to put
+ # the correct hypertext around the linktext
+ if($alttext) {
+ $self->{_markup} = "Q<$alttext>";
+ }
+ elsif($type eq 'hyperlink') {
+ $self->{_markup} = "Q<$section>";
+ }
+ else {
+ $self->{_markup} = (!$section ? '' :
+ $type eq 'item' ? "the Q<$section> entry" :
+ "the section on Q<$section>" ) .
+ ($page ? ($section ? ' in ':'') . "the P<$page>$page_ext manpage" :
+ ' elsewhere in this document');
+ }
+}
+
+=item markup($string)
+
+Set/retrieve the textual value of the link. This string contains special
+markers C<PE<lt>E<gt>> and C<QE<lt>E<gt>> that should be expanded by the
+translator's interior sequence expansion engine to the
+formatter-specific code to highlight/activate the hyperlink. The details
+have to be implemented in the translator.
+
+=cut
+
+#' retrieve/set markuped text
+sub markup {
+ return (@_ > 1) ? ($_[0]->{_markup} = $_[1]) : $_[0]->{_markup};
+}
+
+=item text()
+
+This method returns the textual representation of the hyperlink as above,
+but without markers (read only). Depending on the link type this is one of
+the following alternatives (the + and * denote the portions of the text
+that are marked up):
+
+ the +perl+ manpage
+ the *$|* entry in the +perlvar+ manpage
+ the section on *OPTIONS* in the +perldoc+ manpage
+ the section on *DESCRIPTION* elsewhere in this document
+
+=cut
+
+# The complete link's text
+sub text {
+ $_[0]->{_text};
+}
+
+=item warning()
+
+After parsing, this method returns any warnings encountered during the
+parsing process.
+
+=cut
+
+# Set/retrieve warnings
+sub warning {
+ my $self = shift;
+ if(@_) {
+ push(@{$self->{_warnings}}, @_);
+ return @_;
+ }
+ return @{$self->{_warnings}};
+}
+
+=item line(), file()
+
+Just simple slots for storing information about the line and the file
+the link was encountered in. Has to be filled in manually.
+
+=cut
+
+# The line in the file the link appears
+sub line {
+ return (@_ > 1) ? ($_[0]->{-line} = $_[1]) : $_[0]->{-line};
+}
+
+# The POD file name the link appears in
+sub file {
+ return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item page()
+
+This method sets or returns the POD page this link points to.
+
+=cut
+
+# The POD page the link appears on
+sub page {
+ if (@_ > 1) {
+ $_[0]->{-page} = $_[1];
+ $_[0]->_construct_text();
+ }
+ $_[0]->{-page};
+}
+
+=item node()
+
+As above, but the destination node text of the link.
+
+=cut
+
+# The link destination
+sub node {
+ if (@_ > 1) {
+ $_[0]->{-node} = $_[1];
+ $_[0]->_construct_text();
+ }
+ $_[0]->{-node};
+}
+
+=item alttext()
+
+Sets or returns an alternative text specified in the link.
+
+=cut
+
+# Potential alternative text
+sub alttext {
+ if (@_ > 1) {
+ $_[0]->{-alttext} = $_[1];
+ $_[0]->_construct_text();
+ }
+ $_[0]->{-alttext};
+}
+
+=item type()
+
+The node type, either C<section> or C<item>. As an unofficial type,
+there is also C<hyperlink>, derived from e.g. C<LE<lt>http://perl.comE<gt>>
+
+=cut
+
+# The type: item or headn
+sub type {
+ return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
+}
+
+=item link()
+
+Returns the link as contents of C<LE<lt>E<gt>>. Reciprocal to B<parse()>.
+
+=back
+
+=cut
+
+# The link itself
+sub link {
+ my $self = shift;
+ my $link = $self->page() || '';
+ if($self->node()) {
+ my $node = $self->node();
+ $text =~ s/\|/E<verbar>/g;
+ $text =~ s:/:E<sol>:g;
+ if($self->type() eq 'section') {
+ $link .= ($link ? '/' : '') . '"' . $node . '"';
+ }
+ elsif($self->type() eq 'hyperlink') {
+ $link = $self->node();
+ }
+ else { # item
+ $link .= '/' . $node;
+ }
+ }
+ if($self->alttext()) {
+ my $text = $self->alttext();
+ $text =~ s/\|/E<verbar>/g;
+ $text =~ s:/:E<sol>:g;
+ $link = "$text|$link";
+ }
+ $link;
+}
+
+sub _invalid_link {
+ my ($msg) = @_;
+ # this sets @_
+ #eval { die "$msg\n" };
+ #chomp $@;
+ $@ = $msg; # this seems to work, too!
+ undef;
+}
+
+#-----------------------------------------------------------------------------
+# Pod::Cache
+#
+# class to hold POD page details
+#-----------------------------------------------------------------------------
+
+package Pod::Cache;
+
+=head2 Pod::Cache
+
+B<Pod::Cache> holds information about a set of POD documents,
+especially the nodes for hyperlinks.
+The following methods are available:
+
+=over 4
+
+=item new()
+
+Create a new cache object. This object can hold an arbitrary number of
+POD documents of class Pod::Cache::Item.
+
+=cut
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my $self = [];
+ bless $self, $class;
+ return $self;
+}
+
+=item item()
+
+Add a new item to the cache. Without arguments, this method returns a
+list of all cache elements.
+
+=cut
+
+sub item {
+ my ($self,%param) = @_;
+ if(%param) {
+ my $item = Pod::Cache::Item->new(%param);
+ push(@$self, $item);
+ return $item;
+ }
+ else {
+ return @{$self};
+ }
+}
+
+=item find_page($name)
+
+Look for a POD document named C<$name> in the cache. Returns the
+reference to the corresponding Pod::Cache::Item object or undef if
+not found.
+
+=back
+
+=cut
+
+sub find_page {
+ my ($self,$page) = @_;
+ foreach(@$self) {
+ if($_->page() eq $page) {
+ return $_;
+ }
+ }
+ undef;
+}
+
+package Pod::Cache::Item;
+
+=head2 Pod::Cache::Item
+
+B<Pod::Cache::Item> holds information about individual POD documents,
+that can be grouped in a Pod::Cache object.
+It is intended to hold information about the hyperlink nodes of POD
+documents.
+The following methods are available:
+
+=over 4
+
+=item new()
+
+Create a new object.
+
+=cut
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my %params = @_;
+ my $self = {%params};
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+sub initialize {
+ my $self = shift;
+ $self->{-nodes} = [] unless(defined $self->{-nodes});
+}
+
+=item page()
+
+Set/retrieve the POD document name (e.g. "Pod::Parser").
+
+=cut
+
+# The POD page
+sub page {
+ return (@_ > 1) ? ($_[0]->{-page} = $_[1]) : $_[0]->{-page};
+}
+
+=item description()
+
+Set/retrieve the POD short description as found in the C<=head1 NAME>
+section.
+
+=cut
+
+# The POD description, taken out of NAME if present
+sub description {
+ return (@_ > 1) ? ($_[0]->{-description} = $_[1]) : $_[0]->{-description};
+}
+
+=item path()
+
+Set/retrieve the POD file storage path.
+
+=cut
+
+# The file path
+sub path {
+ return (@_ > 1) ? ($_[0]->{-path} = $_[1]) : $_[0]->{-path};
+}
+
+=item file()
+
+Set/retrieve the POD file name.
+
+=cut
+
+# The POD file name
+sub file {
+ return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item nodes()
+
+Add a node (or a list of nodes) to the document's node list. Note that
+the order is kept, i.e. start with the first node and end with the last.
+If no argument is given, the current list of nodes is returned in the
+same order the nodes have been added.
+A node can be any scalar, but usually is a pair of node string and
+unique id for the C<find_node> method to work correctly.
+
+=cut
+
+# The POD nodes
+sub nodes {
+ my ($self,@nodes) = @_;
+ if(@nodes) {
+ push(@{$self->{-nodes}}, @nodes);
+ return @nodes;
+ }
+ else {
+ return @{$self->{-nodes}};
+ }
+}
+
+=item find_node($name)
+
+Look for a node or index entry named C<$name> in the object.
+Returns the unique id of the node (i.e. the second element of the array
+stored in the node arry) or undef if not found.
+
+=back
+
+=cut
+
+sub find_node {
+ my ($self,$node) = @_;
+ my @search;
+ push(@search, @{$self->{-nodes}}) if($self->{-nodes});
+ push(@search, @{$self->{-idx}}) if($self->{-idx});
+ foreach(@search) {
+ if($_->[0] eq $node) {
+ return $_->[1]; # id
+ }
+ }
+ undef;
+}
+
+=item idx()
+
+Add an index entry (or a list of them) to the document's index list. Note that
+the order is kept, i.e. start with the first node and end with the last.
+If no argument is given, the current list of index entries is returned in the
+same order the entries have been added.
+An index entry can be any scalar, but usually is a pair of string and
+unique id.
+
+=cut
+
+# The POD index entries
+sub idx {
+ my ($self,@idx) = @_;
+ if(@idx) {
+ push(@{$self->{-idx}}, @idx);
+ return @idx;
+ }
+ else {
+ return @{$self->{-idx}};
+ }
+}
+
+=head1 AUTHOR
+
+Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>, borrowing
+a lot of things from L<pod2man> and L<pod2roff> as well as other POD
+processing tools by Tom Christiansen, Brad Appleton and Russ Allbery.
+
+=head1 SEE ALSO
+
+L<pod2man>, L<pod2roff>, L<Pod::Parser>, L<Pod::Checker>,
+L<pod2html>
+
+=cut
+
+1;
diff --git a/contrib/perl5/lib/Pod/Parser.pm b/contrib/perl5/lib/Pod/Parser.pm
new file mode 100644
index 0000000..48fc198
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Parser.pm
@@ -0,0 +1,1771 @@
+#############################################################################
+# Pod/Parser.pm -- package which defines a base class for parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Parser;
+
+use vars qw($VERSION);
+$VERSION = 1.12; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Parser - base class for creating POD filters and translators
+
+=head1 SYNOPSIS
+
+ use Pod::Parser;
+
+ package MyParser;
+ @ISA = qw(Pod::Parser);
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num) = @_;
+ ## Interpret the command and its text; sample actions might be:
+ if ($command eq 'head1') { ... }
+ elsif ($command eq 'head2') { ... }
+ ## ... other commands and their actions
+ my $out_fh = $parser->output_handle();
+ my $expansion = $parser->interpolate($paragraph, $line_num);
+ print $out_fh $expansion;
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num) = @_;
+ ## Format verbatim paragraph; sample actions might be:
+ my $out_fh = $parser->output_handle();
+ print $out_fh $paragraph;
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num) = @_;
+ ## Translate/Format this block of text; sample actions might be:
+ my $out_fh = $parser->output_handle();
+ my $expansion = $parser->interpolate($paragraph, $line_num);
+ print $out_fh $expansion;
+ }
+
+ sub interior_sequence {
+ my ($parser, $seq_command, $seq_argument) = @_;
+ ## Expand an interior sequence; sample actions might be:
+ return "*$seq_argument*" if ($seq_command eq 'B');
+ return "`$seq_argument'" if ($seq_command eq 'C');
+ return "_${seq_argument}_'" if ($seq_command eq 'I');
+ ## ... other sequence commands and their resulting text
+ }
+
+ package main;
+
+ ## Create a parser object and have it parse file whose name was
+ ## given on the command-line (use STDIN if no files were given).
+ $parser = new MyParser();
+ $parser->parse_from_filehandle(\*STDIN) if (@ARGV == 0);
+ for (@ARGV) { $parser->parse_from_file($_); }
+
+=head1 REQUIRES
+
+perl5.005, Pod::InputObjects, Exporter, Symbol, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+B<Pod::Parser> is a base class for creating POD filters and translators.
+It handles most of the effort involved with parsing the POD sections
+from an input stream, leaving subclasses free to be concerned only with
+performing the actual translation of text.
+
+B<Pod::Parser> parses PODs, and makes method calls to handle the various
+components of the POD. Subclasses of B<Pod::Parser> override these methods
+to translate the POD into whatever output format they desire.
+
+=head1 QUICK OVERVIEW
+
+To create a POD filter for translating POD documentation into some other
+format, you create a subclass of B<Pod::Parser> which typically overrides
+just the base class implementation for the following methods:
+
+=over 2
+
+=item *
+
+B<command()>
+
+=item *
+
+B<verbatim()>
+
+=item *
+
+B<textblock()>
+
+=item *
+
+B<interior_sequence()>
+
+=back
+
+You may also want to override the B<begin_input()> and B<end_input()>
+methods for your subclass (to perform any needed per-file and/or
+per-document initialization or cleanup).
+
+If you need to perform any preprocesssing of input before it is parsed
+you may want to override one or more of B<preprocess_line()> and/or
+B<preprocess_paragraph()>.
+
+Sometimes it may be necessary to make more than one pass over the input
+files. If this is the case you have several options. You can make the
+first pass using B<Pod::Parser> and override your methods to store the
+intermediate results in memory somewhere for the B<end_pod()> method to
+process. You could use B<Pod::Parser> for several passes with an
+appropriate state variable to control the operation for each pass. If
+your input source can't be reset to start at the beginning, you can
+store it in some other structure as a string or an array and have that
+structure implement a B<getline()> method (which is all that
+B<parse_from_filehandle()> uses to read input).
+
+Feel free to add any member data fields you need to keep track of things
+like current font, indentation, horizontal or vertical position, or
+whatever else you like. Be sure to read L<"PRIVATE METHODS AND DATA">
+to avoid name collisions.
+
+For the most part, the B<Pod::Parser> base class should be able to
+do most of the input parsing for you and leave you free to worry about
+how to intepret the commands and translate the result.
+
+Note that all we have described here in this quick overview is the
+simplest most straightforward use of B<Pod::Parser> to do stream-based
+parsing. It is also possible to use the B<Pod::Parser::parse_text> function
+to do more sophisticated tree-based parsing. See L<"TREE-BASED PARSING">.
+
+=head1 PARSING OPTIONS
+
+A I<parse-option> is simply a named option of B<Pod::Parser> with a
+value that corresponds to a certain specified behavior. These various
+behaviors of B<Pod::Parser> may be enabled/disabled by setting or
+or unsetting one or more I<parse-options> using the B<parseopts()> method.
+The set of currently accepted parse-options is as follows:
+
+=over 3
+
+=item B<-want_nonPODs> (default: unset)
+
+Normally (by default) B<Pod::Parser> will only provide access to
+the POD sections of the input. Input paragraphs that are not part
+of the POD-format documentation are not made available to the caller
+(not even using B<preprocess_paragraph()>). Setting this option to a
+non-empty, non-zero value will allow B<preprocess_paragraph()> to see
+non-POD sections of the input as well as POD sections. The B<cutting()>
+method can be used to determine if the corresponding paragraph is a POD
+paragraph, or some other input paragraph.
+
+=item B<-process_cut_cmd> (default: unset)
+
+Normally (by default) B<Pod::Parser> handles the C<=cut> POD directive
+by itself and does not pass it on to the caller for processing. Setting
+this option to a non-empty, non-zero value will cause B<Pod::Parser> to
+pass the C<=cut> directive to the caller just like any other POD command
+(and hence it may be processed by the B<command()> method).
+
+B<Pod::Parser> will still interpret the C<=cut> directive to mean that
+"cutting mode" has been (re)entered, but the caller will get a chance
+to capture the actual C<=cut> paragraph itself for whatever purpose
+it desires.
+
+=item B<-warnings> (default: unset)
+
+Normally (by default) B<Pod::Parser> recognizes a bare minimum of
+pod syntax errors and warnings and issues diagnostic messages
+for errors, but not for warnings. (Use B<Pod::Checker> to do more
+thorough checking of POD syntax.) Setting this option to a non-empty,
+non-zero value will cause B<Pod::Parser> to issue diagnostics for
+the few warnings it recognizes as well as the errors.
+
+=back
+
+Please see L<"parseopts()"> for a complete description of the interface
+for the setting and unsetting of parse-options.
+
+=cut
+
+#############################################################################
+
+use vars qw(@ISA);
+use strict;
+#use diagnostics;
+use Pod::InputObjects;
+use Carp;
+use Exporter;
+require VMS::Filespec if $^O eq 'VMS';
+BEGIN {
+ if ($] < 5.6) {
+ require Symbol;
+ import Symbol;
+ }
+}
+@ISA = qw(Exporter);
+
+## These "variables" are used as local "glob aliases" for performance
+use vars qw(%myData %myOpts @input_stack);
+
+#############################################################################
+
+=head1 RECOMMENDED SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which most subclasses will probably
+want to override. These methods are as follows:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<command()>
+
+ $parser->command($cmd,$text,$line_num,$pod_para);
+
+This method should be overridden by subclasses to take the appropriate
+action when a POD command paragraph (denoted by a line beginning with
+"=") is encountered. When such a POD directive is seen in the input,
+this method is called and is passed:
+
+=over 3
+
+=item C<$cmd>
+
+the name of the command for this POD paragraph
+
+=item C<$text>
+
+the paragraph text for the given POD paragraph command.
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph command (see L<Pod::InputObjects>
+for details).
+
+=back
+
+B<Note> that this method I<is> called for C<=pod> paragraphs.
+
+The base class implementation of this method simply treats the raw POD
+command as normal block of paragraph text (invoking the B<textblock()>
+method with the command paragraph).
+
+=cut
+
+sub command {
+ my ($self, $cmd, $text, $line_num, $pod_para) = @_;
+ ## Just treat this like a textblock
+ $self->textblock($pod_para->raw_text(), $line_num, $pod_para);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<verbatim()>
+
+ $parser->verbatim($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a block of verbatim text is encountered. It is passed the
+following parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the verbatim paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+The base class implementation of this method simply prints the textblock
+(unmodified) to the output filehandle.
+
+=cut
+
+sub verbatim {
+ my ($self, $text, $line_num, $pod_para) = @_;
+ my $out_fh = $self->{_OUTPUT};
+ print $out_fh $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<textblock()>
+
+ $parser->textblock($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a normal block of POD text is encountered (although the base
+class method will usually do what you want). It is passed the following
+parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the a POD paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+In order to process interior sequences, subclasses implementations of
+this method will probably want to invoke either B<interpolate()> or
+B<parse_text()>, passing it the text block C<$text>, and the corresponding
+line number in C<$line_num>, and then perform any desired processing upon
+the returned result.
+
+The base class implementation of this method simply prints the text block
+as it occurred in the input stream).
+
+=cut
+
+sub textblock {
+ my ($self, $text, $line_num, $pod_para) = @_;
+ my $out_fh = $self->{_OUTPUT};
+ print $out_fh $self->interpolate($text, $line_num);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interior_sequence()>
+
+ $parser->interior_sequence($seq_cmd,$seq_arg,$pod_seq);
+
+This method should be overridden by subclasses to take the appropriate
+action when an interior sequence is encountered. An interior sequence is
+an embedded command within a block of text which appears as a command
+name (usually a single uppercase character) followed immediately by a
+string of text which is enclosed in angle brackets. This method is
+passed the sequence command C<$seq_cmd> and the corresponding text
+C<$seq_arg>. It is invoked by the B<interpolate()> method for each interior
+sequence that occurs in the string that it is passed. It should return
+the desired text string to be used in place of the interior sequence.
+The C<$pod_seq> argument is a reference to a C<Pod::InteriorSequence>
+object which contains further information about the interior sequence.
+Please see L<Pod::InputObjects> for details if you need to access this
+additional information.
+
+Subclass implementations of this method may wish to invoke the
+B<nested()> method of C<$pod_seq> to see if it is nested inside
+some other interior-sequence (and if so, which kind).
+
+The base class implementation of the B<interior_sequence()> method
+simply returns the raw text of the interior sequence (as it occurred
+in the input) to the caller.
+
+=cut
+
+sub interior_sequence {
+ my ($self, $seq_cmd, $seq_arg, $pod_seq) = @_;
+ ## Just return the raw text of the interior sequence
+ return $pod_seq->raw_text();
+}
+
+#############################################################################
+
+=head1 OPTIONAL SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which subclasses may want to override
+to perform any special pre/post-processing. These methods do I<not> have to
+be overridden, but it may be useful for subclasses to take advantage of them.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<new()>
+
+ my $parser = Pod::Parser->new();
+
+This is the constructor for B<Pod::Parser> and its subclasses. You
+I<do not> need to override this method! It is capable of constructing
+subclass objects as well as base class objects, provided you use
+any of the following constructor invocation styles:
+
+ my $parser1 = MyParser->new();
+ my $parser2 = new MyParser();
+ my $parser3 = $parser2->new();
+
+where C<MyParser> is some subclass of B<Pod::Parser>.
+
+Using the syntax C<MyParser::new()> to invoke the constructor is I<not>
+recommended, but if you insist on being able to do this, then the
+subclass I<will> need to override the B<new()> constructor method. If
+you do override the constructor, you I<must> be sure to invoke the
+B<initialize()> method of the newly blessed object.
+
+Using any of the above invocations, the first argument to the
+constructor is always the corresponding package name (or object
+reference). No other arguments are required, but if desired, an
+associative array (or hash-table) my be passed to the B<new()>
+constructor, as in:
+
+ my $parser1 = MyParser->new( MYDATA => $value1, MOREDATA => $value2 );
+ my $parser2 = new MyParser( -myflag => 1 );
+
+All arguments passed to the B<new()> constructor will be treated as
+key/value pairs in a hash-table. The newly constructed object will be
+initialized by copying the contents of the given hash-table (which may
+have been empty). The B<new()> constructor for this class and all of its
+subclasses returns a blessed reference to the initialized object (hash-table).
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object.
+ my %params = @_;
+ my $self = { %params };
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<initialize()>
+
+ $parser->initialize();
+
+This method performs any necessary object initialization. It takes no
+arguments (other than the object instance of course, which is typically
+copied to a local variable named C<$self>). If subclasses override this
+method then they I<must> be sure to invoke C<$self-E<gt>SUPER::initialize()>.
+
+=cut
+
+sub initialize {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_pod()>
+
+ $parser->begin_pod();
+
+This method is invoked at the beginning of processing for each POD
+document that is encountered in the input. Subclasses should override
+this method to perform any per-document initialization.
+
+=cut
+
+sub begin_pod {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_input()>
+
+ $parser->begin_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<before>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+initializations.
+
+Note that if multiple files are parsed for a single POD document
+(perhaps the result of some future C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+initializations once per document, then you should use B<begin_pod()>.
+
+=cut
+
+sub begin_input {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_input()>
+
+ $parser->end_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<after>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+cleanup actions.
+
+Please note that if multiple files are parsed for a single POD document
+(perhaps the result of some kind of C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+cleanup actions once per document, then you should use B<end_pod()>.
+
+=cut
+
+sub end_input {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_pod()>
+
+ $parser->end_pod();
+
+This method is invoked at the end of processing for each POD document
+that is encountered in the input. Subclasses should override this method
+to perform any per-document finalization.
+
+=cut
+
+sub end_pod {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_line()>
+
+ $textline = $parser->preprocess_line($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform
+any kind of preprocessing for each I<line> of input (I<before> it has
+been determined whether or not it is part of a POD paragraph). The
+parameter C<$text> is the input line; and the parameter C<$line_num> is
+the line number of the corresponding text line.
+
+The value returned should correspond to the new text to use in its
+place. If the empty string or an undefined value is returned then no
+further processing will be performed for this line.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections, then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_line {
+ my ($self, $text, $line_num) = @_;
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_paragraph()>
+
+ $textblock = $parser->preprocess_paragraph($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform any
+kind of preprocessing for each block (paragraph) of POD documentation
+that appears in the input stream. The parameter C<$text> is the POD
+paragraph from the input file; and the parameter C<$line_num> is the
+line number for the beginning of the corresponding paragraph.
+
+The value returned should correspond to the new text to use in its
+place If the empty string is returned or an undefined value is
+returned, then the given C<$text> is ignored (not processed).
+
+This method is invoked after gathering up all the lines in a paragraph
+and after determining the cutting state of the paragraph,
+but before trying to further parse or interpret them. After
+B<preprocess_paragraph()> returns, the current cutting state (which
+is returned by C<$self-E<gt>cutting()>) is examined. If it evaluates
+to true then input text (including the given C<$text>) is cut (not
+processed) until the next POD directive is encountered.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and either it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections or the C<-want_nonPODs> option is true,
+then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_paragraph {
+ my ($self, $text, $line_num) = @_;
+ return $text;
+}
+
+#############################################################################
+
+=head1 METHODS FOR PARSING AND PROCESSING
+
+B<Pod::Parser> provides several methods to process input text. These
+methods typically won't need to be overridden (and in some cases they
+can't be overridden), but subclasses may want to invoke them to exploit
+their functionality.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_text()>
+
+ $ptree1 = $parser->parse_text($text, $line_num);
+ $ptree2 = $parser->parse_text({%opts}, $text, $line_num);
+ $ptree3 = $parser->parse_text(\%opts, $text, $line_num);
+
+This method is useful if you need to perform your own interpolation
+of interior sequences and can't rely upon B<interpolate> to expand
+them in simple bottom-up order order.
+
+The parameter C<$text> is a string or block of text to be parsed
+for interior sequences; and the parameter C<$line_num> is the
+line number curresponding to the beginning of C<$text>.
+
+B<parse_text()> will parse the given text into a parse-tree of "nodes."
+and interior-sequences. Each "node" in the parse tree is either a
+text-string, or a B<Pod::InteriorSequence>. The result returned is a
+parse-tree of type B<Pod::ParseTree>. Please see L<Pod::InputObjects>
+for more information about B<Pod::InteriorSequence> and B<Pod::ParseTree>.
+
+If desired, an optional hash-ref may be specified as the first argument
+to customize certain aspects of the parse-tree that is created and
+returned. The set of recognized option keywords are:
+
+=over 3
+
+=item B<-expand_seq> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain an
+unexpanded C<Pod::InteriorSequence> object for each interior-sequence
+encountered. Specifying B<-expand_seq> tells B<parse_text()> to "expand"
+every interior-sequence it sees by invoking the referenced function
+(or named method of the parser object) and using the return value as the
+expanded result.
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $sequence )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $sequence )
+
+where C<$parser> is a reference to the parser object, and C<$sequence>
+is a reference to the interior-sequence object.
+[I<NOTE>: If the B<interior_sequence()> method is specified, then it is
+invoked according to the interface specified in L<"interior_sequence()">].
+
+=item B<-expand_text> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain a
+text-string for each contiguous sequence of characters outside of an
+interior-sequence. Specifying B<-expand_text> tells B<parse_text()> to
+"preprocess" every such text-string it sees by invoking the referenced
+function (or named method of the parser object) and using the return value
+as the preprocessed (or "expanded") result. [Note that if the result is
+an interior-sequence, then it will I<not> be expanded as specified by the
+B<-expand_seq> option; Any such recursive expansion needs to be handled by
+the specified callback routine.]
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $text, $ptree_node )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $text, $ptree_node )
+
+where C<$parser> is a reference to the parser object, C<$text> is the
+text-string encountered, and C<$ptree_node> is a reference to the current
+node in the parse-tree (usually an interior-sequence object or else the
+top-level node of the parse-tree).
+
+=item B<-expand_ptree> =E<gt> I<code-ref>|I<method-name>
+
+Rather than returning a C<Pod::ParseTree>, pass the parse-tree as an
+argument to the referenced subroutine (or named method of the parser
+object) and return the result instead of the parse-tree object.
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $ptree )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $ptree )
+
+where C<$parser> is a reference to the parser object, and C<$ptree>
+is a reference to the parse-tree object.
+
+=back
+
+=cut
+
+sub parse_text {
+ my $self = shift;
+ local $_ = '';
+
+ ## Get options and set any defaults
+ my %opts = (ref $_[0]) ? %{ shift() } : ();
+ my $expand_seq = $opts{'-expand_seq'} || undef;
+ my $expand_text = $opts{'-expand_text'} || undef;
+ my $expand_ptree = $opts{'-expand_ptree'} || undef;
+
+ my $text = shift;
+ my $line = shift;
+ my $file = $self->input_file();
+ my $cmd = "";
+
+ ## Convert method calls into closures, for our convenience
+ my $xseq_sub = $expand_seq;
+ my $xtext_sub = $expand_text;
+ my $xptree_sub = $expand_ptree;
+ if (defined $expand_seq and $expand_seq eq 'interior_sequence') {
+ ## If 'interior_sequence' is the method to use, we have to pass
+ ## more than just the sequence object, we also need to pass the
+ ## sequence name and text.
+ $xseq_sub = sub {
+ my ($self, $iseq) = @_;
+ my $args = join("", $iseq->parse_tree->children);
+ return $self->interior_sequence($iseq->name, $args, $iseq);
+ };
+ }
+ ref $xseq_sub or $xseq_sub = sub { shift()->$expand_seq(@_) };
+ ref $xtext_sub or $xtext_sub = sub { shift()->$expand_text(@_) };
+ ref $xptree_sub or $xptree_sub = sub { shift()->$expand_ptree(@_) };
+
+ ## Keep track of the "current" interior sequence, and maintain a stack
+ ## of "in progress" sequences.
+ ##
+ ## NOTE that we push our own "accumulator" at the very beginning of the
+ ## stack. It's really a parse-tree, not a sequence; but it implements
+ ## the methods we need so we can use it to gather-up all the sequences
+ ## and strings we parse. Thus, by the end of our parsing, it should be
+ ## the only thing left on our stack and all we have to do is return it!
+ ##
+ my $seq = Pod::ParseTree->new();
+ my @seq_stack = ($seq);
+ my ($ldelim, $rdelim) = ('', '');
+
+ ## Iterate over all sequence starts text (NOTE: split with
+ ## capturing parens keeps the delimiters)
+ $_ = $text;
+ my @tokens = split /([A-Z]<(?:<+\s+)?)/;
+ while ( @tokens ) {
+ $_ = shift @tokens;
+ ## Look for the beginning of a sequence
+ if ( /^([A-Z])(<(?:<+\s+)?)$/ ) {
+ ## Push a new sequence onto the stack of those "in-progress"
+ ($cmd, $ldelim) = ($1, $2);
+ $seq = Pod::InteriorSequence->new(
+ -name => $cmd,
+ -ldelim => $ldelim, -rdelim => '',
+ -file => $file, -line => $line
+ );
+ $ldelim =~ s/\s+$//, ($rdelim = $ldelim) =~ tr/</>/;
+ (@seq_stack > 1) and $seq->nested($seq_stack[-1]);
+ push @seq_stack, $seq;
+ }
+ ## Look for sequence ending
+ elsif ( @seq_stack > 1 ) {
+ ## Make sure we match the right kind of closing delimiter
+ my ($seq_end, $post_seq) = ("", "");
+ if ( ($ldelim eq '<' and /\A(.*?)(>)/s)
+ or /\A(.*?)(\s+$rdelim)/s )
+ {
+ ## Found end-of-sequence, capture the interior and the
+ ## closing the delimiter, and put the rest back on the
+ ## token-list
+ $post_seq = substr($_, length($1) + length($2));
+ ($_, $seq_end) = ($1, $2);
+ (length $post_seq) and unshift @tokens, $post_seq;
+ }
+ if (length) {
+ ## In the middle of a sequence, append this text to it, and
+ ## dont forget to "expand" it if that's what the caller wanted
+ $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+ $_ .= $seq_end;
+ }
+ if (length $seq_end) {
+ ## End of current sequence, record terminating delimiter
+ $seq->rdelim($seq_end);
+ ## Pop it off the stack of "in progress" sequences
+ pop @seq_stack;
+ ## Append result to its parent in current parse tree
+ $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq)
+ : $seq);
+ ## Remember the current cmd-name and left-delimiter
+ $cmd = (@seq_stack > 1) ? $seq_stack[-1]->name : '';
+ $ldelim = (@seq_stack > 1) ? $seq_stack[-1]->ldelim : '';
+ $ldelim =~ s/\s+$//, ($rdelim = $ldelim) =~ tr/</>/;
+ }
+ }
+ elsif (length) {
+ ## In the middle of a sequence, append this text to it, and
+ ## dont forget to "expand" it if that's what the caller wanted
+ $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+ }
+ ## Keep track of line count
+ $line += tr/\n//;
+ ## Remember the "current" sequence
+ $seq = $seq_stack[-1];
+ }
+
+ ## Handle unterminated sequences
+ my $errorsub = (@seq_stack > 1) ? $self->errorsub() : undef;
+ while (@seq_stack > 1) {
+ ($cmd, $file, $line) = ($seq->name, $seq->file_line);
+ $file = VMS::Filespec::unixify($file) if $^O eq 'VMS';
+ $ldelim = $seq->ldelim;
+ ($rdelim = $ldelim) =~ tr/</>/;
+ $rdelim =~ s/^(\S+)(\s*)$/$2$1/;
+ pop @seq_stack;
+ my $errmsg = "*** ERROR: unterminated ${cmd}${ldelim}...${rdelim}".
+ " at line $line in file $file\n";
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $self->$errorsub($errmsg)
+ or warn($errmsg);
+ $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) : $seq);
+ $seq = $seq_stack[-1];
+ }
+
+ ## Return the resulting parse-tree
+ my $ptree = (pop @seq_stack)->parse_tree;
+ return $expand_ptree ? &$xptree_sub($self, $ptree) : $ptree;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interpolate()>
+
+ $textblock = $parser->interpolate($text, $line_num);
+
+This method translates all text (including any embedded interior sequences)
+in the given text string C<$text> and returns the interpolated result. The
+parameter C<$line_num> is the line number corresponding to the beginning
+of C<$text>.
+
+B<interpolate()> merely invokes a private method to recursively expand
+nested interior sequences in bottom-up order (innermost sequences are
+expanded first). If there is a need to expand nested sequences in
+some alternate order, use B<parse_text> instead.
+
+=cut
+
+sub interpolate {
+ my($self, $text, $line_num) = @_;
+ my %parse_opts = ( -expand_seq => 'interior_sequence' );
+ my $ptree = $self->parse_text( \%parse_opts, $text, $line_num );
+ return join "", $ptree->children();
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<parse_paragraph()>
+
+ $parser->parse_paragraph($text, $line_num);
+
+This method takes the text of a POD paragraph to be processed, along
+with its corresponding line number, and invokes the appropriate method
+(one of B<command()>, B<verbatim()>, or B<textblock()>).
+
+For performance reasons, this method is invoked directly without any
+dynamic lookup; Hence subclasses may I<not> override it!
+
+=end __PRIVATE__
+
+=cut
+
+sub parse_paragraph {
+ my ($self, $text, $line_num) = @_;
+ local *myData = $self; ## alias to avoid deref-ing overhead
+ local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options
+ local $_;
+
+ ## See if we want to preprocess nonPOD paragraphs as well as POD ones.
+ my $wantNonPods = $myOpts{'-want_nonPODs'};
+
+ ## Update cutting status
+ $myData{_CUTTING} = 0 if $text =~ /^={1,2}\S/;
+
+ ## Perform any desired preprocessing if we wanted it this early
+ $wantNonPods and $text = $self->preprocess_paragraph($text, $line_num);
+
+ ## Ignore up until next POD directive if we are cutting
+ return if $myData{_CUTTING};
+
+ ## Now we know this is block of text in a POD section!
+
+ ##-----------------------------------------------------------------
+ ## This is a hook (hack ;-) for Pod::Select to do its thing without
+ ## having to override methods, but also without Pod::Parser assuming
+ ## $self is an instance of Pod::Select (if the _SELECTED_SECTIONS
+ ## field exists then we assume there is an is_selected() method for
+ ## us to invoke (calling $self->can('is_selected') could verify this
+ ## but that is more overhead than I want to incur)
+ ##-----------------------------------------------------------------
+
+ ## Ignore this block if it isnt in one of the selected sections
+ if (exists $myData{_SELECTED_SECTIONS}) {
+ $self->is_selected($text) or return ($myData{_CUTTING} = 1);
+ }
+
+ ## If we havent already, perform any desired preprocessing and
+ ## then re-check the "cutting" state
+ unless ($wantNonPods) {
+ $text = $self->preprocess_paragraph($text, $line_num);
+ return 1 unless ((defined $text) and (length $text));
+ return 1 if ($myData{_CUTTING});
+ }
+
+ ## Look for one of the three types of paragraphs
+ my ($pfx, $cmd, $arg, $sep) = ('', '', '', '');
+ my $pod_para = undef;
+ if ($text =~ /^(={1,2})(?=\S)/) {
+ ## Looks like a command paragraph. Capture the command prefix used
+ ## ("=" or "=="), as well as the command-name, its paragraph text,
+ ## and whatever sequence of characters was used to separate them
+ $pfx = $1;
+ $_ = substr($text, length $pfx);
+ ($cmd, $sep, $text) = split /(\s+)/, $_, 2;
+ ## If this is a "cut" directive then we dont need to do anything
+ ## except return to "cutting" mode.
+ if ($cmd eq 'cut') {
+ $myData{_CUTTING} = 1;
+ return unless $myOpts{'-process_cut_cmd'};
+ }
+ }
+ ## Save the attributes indicating how the command was specified.
+ $pod_para = new Pod::Paragraph(
+ -name => $cmd,
+ -text => $text,
+ -prefix => $pfx,
+ -separator => $sep,
+ -file => $myData{_INFILE},
+ -line => $line_num
+ );
+ # ## Invoke appropriate callbacks
+ # if (exists $myData{_CALLBACKS}) {
+ # ## Look through the callback list, invoke callbacks,
+ # ## then see if we need to do the default actions
+ # ## (invoke_callbacks will return true if we do).
+ # return 1 unless $self->invoke_callbacks($cmd, $text, $line_num, $pod_para);
+ # }
+ if (length $cmd) {
+ ## A command paragraph
+ $self->command($cmd, $text, $line_num, $pod_para);
+ }
+ elsif ($text =~ /^\s+/) {
+ ## Indented text - must be a verbatim paragraph
+ $self->verbatim($text, $line_num, $pod_para);
+ }
+ else {
+ ## Looks like an ordinary block of text
+ $self->textblock($text, $line_num, $pod_para);
+ }
+ return 1;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_filehandle()>
+
+ $parser->parse_from_filehandle($in_fh,$out_fh);
+
+This method takes an input filehandle (which is assumed to already be
+opened for reading) and reads the entire input stream looking for blocks
+(paragraphs) of POD documentation to be processed. If no first argument
+is given the default input filehandle C<STDIN> is used.
+
+The C<$in_fh> parameter may be any object that provides a B<getline()>
+method to retrieve a single line of input text (hence, an appropriate
+wrapper object could be used to parse PODs from a single string or an
+array of strings).
+
+Using C<$in_fh-E<gt>getline()>, input is read line-by-line and assembled
+into paragraphs or "blocks" (which are separated by lines containing
+nothing but whitespace). For each block of POD documentation
+encountered it will invoke a method to parse the given paragraph.
+
+If a second argument is given then it should correspond to a filehandle where
+output should be sent (otherwise the default output filehandle is
+C<STDOUT> if no output filehandle is currently in use).
+
+B<NOTE:> For performance reasons, this method caches the input stream at
+the top of the stack in a local variable. Any attempts by clients to
+change the stack contents during processing when in the midst executing
+of this method I<will not affect> the input stream used by the current
+invocation of this method.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_filehandle {
+ my $self = shift;
+ my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+ my ($in_fh, $out_fh) = @_;
+ $in_fh = \*STDIN unless ($in_fh);
+ local *myData = $self; ## alias to avoid deref-ing overhead
+ local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options
+ local $_;
+
+ ## Put this stream at the top of the stack and do beginning-of-input
+ ## processing. NOTE that $in_fh might be reset during this process.
+ my $topstream = $self->_push_input_stream($in_fh, $out_fh);
+ (exists $opts{-cutting}) and $self->cutting( $opts{-cutting} );
+
+ ## Initialize line/paragraph
+ my ($textline, $paragraph) = ('', '');
+ my ($nlines, $plines) = (0, 0);
+
+ ## Use <$fh> instead of $fh->getline where possible (for speed)
+ $_ = ref $in_fh;
+ my $tied_fh = (/^(?:GLOB|FileHandle|IO::\w+)$/ or tied $in_fh);
+
+ ## Read paragraphs line-by-line
+ while (defined ($textline = $tied_fh ? <$in_fh> : $in_fh->getline)) {
+ $textline = $self->preprocess_line($textline, ++$nlines);
+ next unless ((defined $textline) && (length $textline));
+ $_ = $paragraph; ## save previous contents
+
+ if ((! length $paragraph) && ($textline =~ /^==/)) {
+ ## '==' denotes a one-line command paragraph
+ $paragraph = $textline;
+ $plines = 1;
+ $textline = '';
+ } else {
+ ## Append this line to the current paragraph
+ $paragraph .= $textline;
+ ++$plines;
+ }
+
+ ## See if this line is blank and ends the current paragraph.
+ ## If it isnt, then keep iterating until it is.
+ next unless (($textline =~ /^([^\S\r\n]*)[\r\n]*$/)
+ && (length $paragraph));
+
+ ## Issue a warning about any non-empty blank lines
+ if (length($1) > 1 and $myOpts{'-warnings'} and ! $myData{_CUTTING}) {
+ my $errorsub = $self->errorsub();
+ my $file = $self->input_file();
+ $file = VMS::Filespec::unixify($file) if $^O eq 'VMS';
+ my $errmsg = "*** WARNING: line containing nothing but whitespace".
+ " in paragraph at line $nlines in file $file\n";
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $self->$errorsub($errmsg)
+ or warn($errmsg);
+ }
+
+ ## Now process the paragraph
+ parse_paragraph($self, $paragraph, ($nlines - $plines) + 1);
+ $paragraph = '';
+ $plines = 0;
+ }
+ ## Dont forget about the last paragraph in the file
+ if (length $paragraph) {
+ parse_paragraph($self, $paragraph, ($nlines - $plines) + 1)
+ }
+
+ ## Now pop the input stream off the top of the input stack.
+ $self->_pop_input_stream();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_file()>
+
+ $parser->parse_from_file($filename,$outfile);
+
+This method takes a filename and does the following:
+
+=over 2
+
+=item *
+
+opens the input and output files for reading
+(creating the appropriate filehandles)
+
+=item *
+
+invokes the B<parse_from_filehandle()> method passing it the
+corresponding input and output filehandles.
+
+=item *
+
+closes the input and output files.
+
+=back
+
+If the special input filename "-" or "<&STDIN" is given then the STDIN
+filehandle is used for input (and no open or close is performed). If no
+input filename is specified then "-" is implied.
+
+If a second argument is given then it should be the name of the desired
+output file. If the special output filename "-" or ">&STDOUT" is given
+then the STDOUT filehandle is used for output (and no open or close is
+performed). If the special output filename ">&STDERR" is given then the
+STDERR filehandle is used for output (and no open or close is
+performed). If no output filehandle is currently in use and no output
+filename is specified, then "-" is implied.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_file {
+ my $self = shift;
+ my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+ my ($infile, $outfile) = @_;
+ my ($in_fh, $out_fh) = (gensym, gensym) if ($] < 5.6);
+ my ($close_input, $close_output) = (0, 0);
+ local *myData = $self;
+ local $_;
+
+ ## Is $infile a filename or a (possibly implied) filehandle
+ $infile = '-' unless ((defined $infile) && (length $infile));
+ if (($infile eq '-') || ($infile =~ /^<&(STDIN|0)$/i)) {
+ ## Not a filename, just a string implying STDIN
+ $myData{_INFILE} = "<standard input>";
+ $in_fh = \*STDIN;
+ }
+ elsif (ref $infile) {
+ ## Must be a filehandle-ref (or else assume its a ref to an object
+ ## that supports the common IO read operations).
+ $myData{_INFILE} = ${$infile};
+ $in_fh = $infile;
+ }
+ else {
+ ## We have a filename, open it for reading
+ $myData{_INFILE} = $infile;
+ open($in_fh, "< $infile") or
+ croak "Can't open $infile for reading: $!\n";
+ $close_input = 1;
+ }
+
+ ## NOTE: we need to be *very* careful when "defaulting" the output
+ ## file. We only want to use a default if this is the beginning of
+ ## the entire document (but *not* if this is an included file). We
+ ## determine this by seeing if the input stream stack has been set-up
+ ## already
+ ##
+ unless ((defined $outfile) && (length $outfile)) {
+ (defined $myData{_TOP_STREAM}) && ($out_fh = $myData{_OUTPUT})
+ || ($outfile = '-');
+ }
+ ## Is $outfile a filename or a (possibly implied) filehandle
+ if ((defined $outfile) && (length $outfile)) {
+ if (($outfile eq '-') || ($outfile =~ /^>&?(?:STDOUT|1)$/i)) {
+ ## Not a filename, just a string implying STDOUT
+ $myData{_OUTFILE} = "<standard output>";
+ $out_fh = \*STDOUT;
+ }
+ elsif ($outfile =~ /^>&(STDERR|2)$/i) {
+ ## Not a filename, just a string implying STDERR
+ $myData{_OUTFILE} = "<standard error>";
+ $out_fh = \*STDERR;
+ }
+ elsif (ref $outfile) {
+ ## Must be a filehandle-ref (or else assume its a ref to an
+ ## object that supports the common IO write operations).
+ $myData{_OUTFILE} = ${$outfile};
+ $out_fh = $outfile;
+ }
+ else {
+ ## We have a filename, open it for writing
+ $myData{_OUTFILE} = $outfile;
+ (-d $outfile) and croak "$outfile is a directory, not POD input!\n";
+ open($out_fh, "> $outfile") or
+ croak "Can't open $outfile for writing: $!\n";
+ $close_output = 1;
+ }
+ }
+
+ ## Whew! That was a lot of work to set up reasonably/robust behavior
+ ## in the case of a non-filename for reading and writing. Now we just
+ ## have to parse the input and close the handles when we're finished.
+ $self->parse_from_filehandle(\%opts, $in_fh, $out_fh);
+
+ $close_input and
+ close($in_fh) || croak "Can't close $infile after reading: $!\n";
+ $close_output and
+ close($out_fh) || croak "Can't close $outfile after writing: $!\n";
+}
+
+#############################################################################
+
+=head1 ACCESSOR METHODS
+
+Clients of B<Pod::Parser> should use the following methods to access
+instance data fields:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<errorsub()>
+
+ $parser->errorsub("method_name");
+ $parser->errorsub(\&warn_user);
+ $parser->errorsub(sub { print STDERR, @_ });
+
+Specifies the method or subroutine to use when printing error messages
+about POD syntax. The supplied method/subroutine I<must> return TRUE upon
+successful printing of the message. If C<undef> is given, then the B<warn>
+builtin is used to issue error messages (this is the default behavior).
+
+ my $errorsub = $parser->errorsub()
+ my $errmsg = "This is an error message!\n"
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $parser->$errorsub($errmsg)
+ or warn($errmsg);
+
+Returns a method name, or else a reference to the user-supplied subroutine
+used to print error messages. Returns C<undef> if the B<warn> builtin
+is used to issue error messages (this is the default behavior).
+
+=cut
+
+sub errorsub {
+ return (@_ > 1) ? ($_[0]->{_ERRORSUB} = $_[1]) : $_[0]->{_ERRORSUB};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<cutting()>
+
+ $boolean = $parser->cutting();
+
+Returns the current C<cutting> state: a boolean-valued scalar which
+evaluates to true if text from the input file is currently being "cut"
+(meaning it is I<not> considered part of the POD document).
+
+ $parser->cutting($boolean);
+
+Sets the current C<cutting> state to the given value and returns the
+result.
+
+=cut
+
+sub cutting {
+ return (@_ > 1) ? ($_[0]->{_CUTTING} = $_[1]) : $_[0]->{_CUTTING};
+}
+
+##---------------------------------------------------------------------------
+
+##---------------------------------------------------------------------------
+
+=head1 B<parseopts()>
+
+When invoked with no additional arguments, B<parseopts> returns a hashtable
+of all the current parsing options.
+
+ ## See if we are parsing non-POD sections as well as POD ones
+ my %opts = $parser->parseopts();
+ $opts{'-want_nonPODs}' and print "-want_nonPODs\n";
+
+When invoked using a single string, B<parseopts> treats the string as the
+name of a parse-option and returns its corresponding value if it exists
+(returns C<undef> if it doesn't).
+
+ ## Did we ask to see '=cut' paragraphs?
+ my $want_cut = $parser->parseopts('-process_cut_cmd');
+ $want_cut and print "-process_cut_cmd\n";
+
+When invoked with multiple arguments, B<parseopts> treats them as
+key/value pairs and the specified parse-option names are set to the
+given values. Any unspecified parse-options are unaffected.
+
+ ## Set them back to the default
+ $parser->parseopts(-warnings => 0);
+
+When passed a single hash-ref, B<parseopts> uses that hash to completely
+reset the existing parse-options, all previous parse-option values
+are lost.
+
+ ## Reset all options to default
+ $parser->parseopts( { } );
+
+See L<"PARSING OPTIONS"> for more information on the name and meaning of each
+parse-option currently recognized.
+
+=cut
+
+sub parseopts {
+ local *myData = shift;
+ local *myOpts = ($myData{_PARSEOPTS} ||= {});
+ return %myOpts if (@_ == 0);
+ if (@_ == 1) {
+ local $_ = shift;
+ return ref($_) ? $myData{_PARSEOPTS} = $_ : $myOpts{$_};
+ }
+ my @newOpts = (%myOpts, @_);
+ $myData{_PARSEOPTS} = { @newOpts };
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_file()>
+
+ $fname = $parser->output_file();
+
+Returns the name of the output file being written.
+
+=cut
+
+sub output_file {
+ return $_[0]->{_OUTFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_handle()>
+
+ $fhandle = $parser->output_handle();
+
+Returns the output filehandle object.
+
+=cut
+
+sub output_handle {
+ return $_[0]->{_OUTPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_file()>
+
+ $fname = $parser->input_file();
+
+Returns the name of the input file being read.
+
+=cut
+
+sub input_file {
+ return $_[0]->{_INFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_handle()>
+
+ $fhandle = $parser->input_handle();
+
+Returns the current input filehandle object.
+
+=cut
+
+sub input_handle {
+ return $_[0]->{_INPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<input_streams()>
+
+ $listref = $parser->input_streams();
+
+Returns a reference to an array which corresponds to the stack of all
+the input streams that are currently in the middle of being parsed.
+
+While parsing an input stream, it is possible to invoke
+B<parse_from_file()> or B<parse_from_filehandle()> to parse a new input
+stream and then return to parsing the previous input stream. Each input
+stream to be parsed is pushed onto the end of this input stack
+before any of its input is read. The input stream that is currently
+being parsed is always at the end (or top) of the input stack. When an
+input stream has been exhausted, it is popped off the end of the
+input stack.
+
+Each element on this input stack is a reference to C<Pod::InputSource>
+object. Please see L<Pod::InputObjects> for more details.
+
+This method might be invoked when printing diagnostic messages, for example,
+to obtain the name and line number of the all input files that are currently
+being processed.
+
+=end __PRIVATE__
+
+=cut
+
+sub input_streams {
+ return $_[0]->{_INPUT_STREAMS};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<top_stream()>
+
+ $hashref = $parser->top_stream();
+
+Returns a reference to the hash-table that represents the element
+that is currently at the top (end) of the input stream stack
+(see L<"input_streams()">). The return value will be the C<undef>
+if the input stack is empty.
+
+This method might be used when printing diagnostic messages, for example,
+to obtain the name and line number of the current input file.
+
+=end __PRIVATE__
+
+=cut
+
+sub top_stream {
+ return $_[0]->{_TOP_STREAM} || undef;
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Parser> makes use of several internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions for client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Parser> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Parser> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_push_input_stream()>
+
+ $hashref = $parser->_push_input_stream($in_fh,$out_fh);
+
+This method will push the given input stream on the input stack and
+perform any necessary beginning-of-document or beginning-of-file
+processing. The argument C<$in_fh> is the input stream filehandle to
+push, and C<$out_fh> is the corresponding output filehandle to use (if
+it is not given or is undefined, then the current output stream is used,
+which defaults to standard output if it doesnt exist yet).
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack. I<Please Note> that it is
+possible for this method to use default values for the input and output
+file handles. If this happens, you will need to look at the C<INPUT>
+and C<OUTPUT> instance data members to determine their new values.
+
+=end _PRIVATE_
+
+=cut
+
+sub _push_input_stream {
+ my ($self, $in_fh, $out_fh) = @_;
+ local *myData = $self;
+
+ ## Initialize stuff for the entire document if this is *not*
+ ## an included file.
+ ##
+ ## NOTE: we need to be *very* careful when "defaulting" the output
+ ## filehandle. We only want to use a default value if this is the
+ ## beginning of the entire document (but *not* if this is an included
+ ## file).
+ unless (defined $myData{_TOP_STREAM}) {
+ $out_fh = \*STDOUT unless (defined $out_fh);
+ $myData{_CUTTING} = 1; ## current "cutting" state
+ $myData{_INPUT_STREAMS} = []; ## stack of all input streams
+ }
+
+ ## Initialize input indicators
+ $myData{_OUTFILE} = '(unknown)' unless (defined $myData{_OUTFILE});
+ $myData{_OUTPUT} = $out_fh if (defined $out_fh);
+ $in_fh = \*STDIN unless (defined $in_fh);
+ $myData{_INFILE} = '(unknown)' unless (defined $myData{_INFILE});
+ $myData{_INPUT} = $in_fh;
+ my $input_top = $myData{_TOP_STREAM}
+ = new Pod::InputSource(
+ -name => $myData{_INFILE},
+ -handle => $in_fh,
+ -was_cutting => $myData{_CUTTING}
+ );
+ local *input_stack = $myData{_INPUT_STREAMS};
+ push(@input_stack, $input_top);
+
+ ## Perform beginning-of-document and/or beginning-of-input processing
+ $self->begin_pod() if (@input_stack == 1);
+ $self->begin_input();
+
+ return $input_top;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_pop_input_stream()>
+
+ $hashref = $parser->_pop_input_stream();
+
+This takes no arguments. It will perform any necessary end-of-file or
+end-of-document processing and then pop the current input stream from
+the top of the input stack.
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack.
+
+=end _PRIVATE_
+
+=cut
+
+sub _pop_input_stream {
+ my ($self) = @_;
+ local *myData = $self;
+ local *input_stack = $myData{_INPUT_STREAMS};
+
+ ## Perform end-of-input and/or end-of-document processing
+ $self->end_input() if (@input_stack > 0);
+ $self->end_pod() if (@input_stack == 1);
+
+ ## Restore cutting state to whatever it was before we started
+ ## parsing this file.
+ my $old_top = pop(@input_stack);
+ $myData{_CUTTING} = $old_top->was_cutting();
+
+ ## Dont forget to reset the input indicators
+ my $input_top = undef;
+ if (@input_stack > 0) {
+ $input_top = $myData{_TOP_STREAM} = $input_stack[-1];
+ $myData{_INFILE} = $input_top->name();
+ $myData{_INPUT} = $input_top->handle();
+ } else {
+ delete $myData{_TOP_STREAM};
+ delete $myData{_INPUT_STREAMS};
+ }
+
+ return $input_top;
+}
+
+#############################################################################
+
+=head1 TREE-BASED PARSING
+
+If straightforward stream-based parsing wont meet your needs (as is
+likely the case for tasks such as translating PODs into structured
+markup languages like HTML and XML) then you may need to take the
+tree-based approach. Rather than doing everything in one pass and
+calling the B<interpolate()> method to expand sequences into text, it
+may be desirable to instead create a parse-tree using the B<parse_text()>
+method to return a tree-like structure which may contain an ordered list
+list of children (each of which may be a text-string, or a similar
+tree-like structure).
+
+Pay special attention to L<"METHODS FOR PARSING AND PROCESSING"> and
+to the objects described in L<Pod::InputObjects>. The former describes
+the gory details and parameters for how to customize and extend the
+parsing behavior of B<Pod::Parser>. B<Pod::InputObjects> provides
+several objects that may all be used interchangeably as parse-trees. The
+most obvious one is the B<Pod::ParseTree> object. It defines the basic
+interface and functionality that all things trying to be a POD parse-tree
+should do. A B<Pod::ParseTree> is defined such that each "node" may be a
+text-string, or a reference to another parse-tree. Each B<Pod::Paragraph>
+object and each B<Pod::InteriorSequence> object also supports the basic
+parse-tree interface.
+
+The B<parse_text()> method takes a given paragraph of text, and
+returns a parse-tree that contains one or more children, each of which
+may be a text-string, or an InteriorSequence object. There are also
+callback-options that may be passed to B<parse_text()> to customize
+the way it expands or transforms interior-sequences, as well as the
+returned result. These callbacks can be used to create a parse-tree
+with custom-made objects (which may or may not support the parse-tree
+interface, depending on how you choose to do it).
+
+If you wish to turn an entire POD document into a parse-tree, that process
+is fairly straightforward. The B<parse_text()> method is the key to doing
+this successfully. Every paragraph-callback (i.e. the polymorphic methods
+for B<command()>, B<verbatim()>, and B<textblock()> paragraphs) takes
+a B<Pod::Paragraph> object as an argument. Each paragraph object has a
+B<parse_tree()> method that can be used to get or set a corresponding
+parse-tree. So for each of those paragraph-callback methods, simply call
+B<parse_text()> with the options you desire, and then use the returned
+parse-tree to assign to the given paragraph object.
+
+That gives you a parse-tree for each paragraph - so now all you need is
+an ordered list of paragraphs. You can maintain that yourself as a data
+element in the object/hash. The most straightforward way would be simply
+to use an array-ref, with the desired set of custom "options" for each
+invocation of B<parse_text>. Let's assume the desired option-set is
+given by the hash C<%options>. Then we might do something like the
+following:
+
+ package MyPodParserTree;
+
+ @ISA = qw( Pod::Parser );
+
+ ...
+
+ sub begin_pod {
+ my $self = shift;
+ $self->{'-paragraphs'} = []; ## initialize paragraph list
+ }
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ ...
+
+ package main;
+ ...
+ my $parser = new MyPodParserTree(...);
+ $parser->parse_from_file(...);
+ my $paragraphs_ref = $parser->{'-paragraphs'};
+
+Of course, in this module-author's humble opinion, I'd be more inclined to
+use the existing B<Pod::ParseTree> object than a simple array. That way
+everything in it, paragraphs and sequences, all respond to the same core
+interface for all parse-tree nodes. The result would look something like:
+
+ package MyPodParserTree2;
+
+ ...
+
+ sub begin_pod {
+ my $self = shift;
+ $self->{'-ptree'} = new Pod::ParseTree; ## initialize parse-tree
+ }
+
+ sub parse_tree {
+ ## convenience method to get/set the parse-tree for the entire POD
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+ }
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ ...
+
+ package main;
+ ...
+ my $parser = new MyPodParserTree2(...);
+ $parser->parse_from_file(...);
+ my $ptree = $parser->parse_tree;
+ ...
+
+Now you have the entire POD document as one great big parse-tree. You
+can even use the B<-expand_seq> option to B<parse_text> to insert
+whole different kinds of objects. Just don't expect B<Pod::Parser>
+to know what to do with them after that. That will need to be in your
+code. Or, alternatively, you can insert any object you like so long as
+it conforms to the B<Pod::ParseTree> interface.
+
+One could use this to create subclasses of B<Pod::Paragraphs> and
+B<Pod::InteriorSequences> for specific commands (or to create your own
+custom node-types in the parse-tree) and add some kind of B<emit()>
+method to each custom node/subclass object in the tree. Then all you'd
+need to do is recursively walk the tree in the desired order, processing
+the children (most likely from left to right) by formatting them if
+they are text-strings, or by calling their B<emit()> method if they
+are objects/references.
+
+=head1 SEE ALSO
+
+L<Pod::InputObjects>, L<Pod::Select>
+
+B<Pod::InputObjects> defines POD input objects corresponding to
+command paragraphs, parse-trees, and interior-sequences.
+
+B<Pod::Select> is a subclass of B<Pod::Parser> which provides the ability
+to selectively include and/or exclude sections of a POD document from being
+translated based upon the current heading, subheading, subsubheading, etc.
+
+=for __PRIVATE__
+B<Pod::Callbacks> is a subclass of B<Pod::Parser> which gives its users
+the ability the employ I<callback functions> instead of, or in addition
+to, overriding methods of the base class.
+
+=for __PRIVATE__
+B<Pod::Select> and B<Pod::Callbacks> do not override any
+methods nor do they define any new methods with the same name. Because
+of this, they may I<both> be used (in combination) as a base class of
+the same subclass in order to combine their functionality without
+causing any namespace clashes due to multiple inheritance.
+
+=head1 AUTHOR
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+1;
diff --git a/contrib/perl5/lib/Pod/Plainer.pm b/contrib/perl5/lib/Pod/Plainer.pm
new file mode 100644
index 0000000..373e8d0
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Plainer.pm
@@ -0,0 +1,69 @@
+package Pod::Plainer;
+use strict;
+use Pod::Parser;
+our @ISA = qw(Pod::Parser);
+our $VERSION = '0.01';
+
+our %E = qw( < lt > gt );
+
+sub escape_ltgt {
+ (undef, my $text) = @_;
+ $text =~ s/([<>])/E<$E{$1}>/g;
+ $text
+}
+
+sub simple_delimiters {
+ (undef, my $seq) = @_;
+ $seq -> left_delimiter( '<' );
+ $seq -> right_delimiter( '>' );
+ $seq;
+}
+
+sub textblock {
+ my($parser,$text,$line) = @_;
+ print {$parser->output_handle()}
+ $parser->parse_text(
+ { -expand_text => q(escape_ltgt),
+ -expand_seq => q(simple_delimiters) },
+ $text, $line ) -> raw_text();
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Plainer - Perl extension for converting Pod to old style Pod.
+
+=head1 SYNOPSIS
+
+ use Pod::Plainer;
+
+ my $parser = Pod::Plainer -> new ();
+ $parser -> parse_from_filehandle(\*STDIN);
+
+=head1 DESCRIPTION
+
+Pod::Plainer uses Pod::Parser which takes Pod with the (new)
+'CE<lt>E<lt> .. E<gt>E<gt>' constructs
+and returns the old(er) style with just 'CE<lt>E<gt>';
+'<' and '>' are replaced by 'EE<lt>ltE<gt>' and 'EE<lt>gtE<gt>'.
+
+This can be used to pre-process Pod before using tools which do not
+recognise the new style Pods.
+
+=head2 EXPORT
+
+None by default.
+
+=head1 AUTHOR
+
+Robin Barker, rmb1@cise.npl.co.uk
+
+=head1 SEE ALSO
+
+See L<Pod::Parser>.
+
+=cut
+
diff --git a/contrib/perl5/lib/Pod/Select.pm b/contrib/perl5/lib/Pod/Select.pm
new file mode 100644
index 0000000..5dd1595
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Select.pm
@@ -0,0 +1,745 @@
+#############################################################################
+# Pod/Select.pm -- function to select portions of POD docs
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Select;
+
+use vars qw($VERSION);
+$VERSION = 1.12; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Select, podselect() - extract selected sections of POD from input
+
+=head1 SYNOPSIS
+
+ use Pod::Select;
+
+ ## Select all the POD sections for each file in @filelist
+ ## and print the result on standard output.
+ podselect(@filelist);
+
+ ## Same as above, but write to tmp.out
+ podselect({-output => "tmp.out"}, @filelist):
+
+ ## Select from the given filelist, only those POD sections that are
+ ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+ podselect({-sections => ["NAME|SYNOPSIS", "OPTIONS"]}, @filelist):
+
+ ## Select the "DESCRIPTION" section of the PODs from STDIN and write
+ ## the result to STDERR.
+ podselect({-output => ">&STDERR", -sections => ["DESCRIPTION"]}, \*STDIN);
+
+or
+
+ use Pod::Select;
+
+ ## Create a parser object for selecting POD sections from the input
+ $parser = new Pod::Select();
+
+ ## Select all the POD sections for each file in @filelist
+ ## and print the result to tmp.out.
+ $parser->parse_from_file("<&STDIN", "tmp.out");
+
+ ## Select from the given filelist, only those POD sections that are
+ ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+ $parser->select("NAME|SYNOPSIS", "OPTIONS");
+ for (@filelist) { $parser->parse_from_file($_); }
+
+ ## Select the "DESCRIPTION" and "SEE ALSO" sections of the PODs from
+ ## STDIN and write the result to STDERR.
+ $parser->select("DESCRIPTION");
+ $parser->add_selection("SEE ALSO");
+ $parser->parse_from_filehandle(\*STDIN, \*STDERR);
+
+=head1 REQUIRES
+
+perl5.005, Pod::Parser, Exporter, Carp
+
+=head1 EXPORTS
+
+podselect()
+
+=head1 DESCRIPTION
+
+B<podselect()> is a function which will extract specified sections of
+pod documentation from an input stream. This ability is provided by the
+B<Pod::Select> module which is a subclass of B<Pod::Parser>.
+B<Pod::Select> provides a method named B<select()> to specify the set of
+POD sections to select for processing/printing. B<podselect()> merely
+creates a B<Pod::Select> object and then invokes the B<podselect()>
+followed by B<parse_from_file()>.
+
+=head1 SECTION SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"section specifications" to restrict the text processed to only the
+desired set of sections and their corresponding subsections. A section
+specification is a string containing one or more Perl-style regular
+expressions separated by forward slashes ("/"). If you need to use a
+forward slash literally within a section title you can escape it with a
+backslash ("\/").
+
+The formal syntax of a section specification is:
+
+=over 4
+
+=item
+
+I<head1-title-regex>/I<head2-title-regex>/...
+
+=back
+
+Any omitted or empty regular expressions will default to ".*".
+Please note that each regular expression given is implicitly
+anchored by adding "^" and "$" to the beginning and end. Also, if a
+given regular expression starts with a "!" character, then the
+expression is I<negated> (so C<!foo> would match anything I<except>
+C<foo>).
+
+Some example section specifications follow.
+
+=over 4
+
+=item
+Match the C<NAME> and C<SYNOPSIS> sections and all of their subsections:
+
+C<NAME|SYNOPSIS>
+
+=item
+Match only the C<Question> and C<Answer> subsections of the C<DESCRIPTION>
+section:
+
+C<DESCRIPTION/Question|Answer>
+
+=item
+Match the C<Comments> subsection of I<all> sections:
+
+C</Comments>
+
+=item
+Match all subsections of C<DESCRIPTION> I<except> for C<Comments>:
+
+C<DESCRIPTION/!Comments>
+
+=item
+Match the C<DESCRIPTION> section but do I<not> match any of its subsections:
+
+C<DESCRIPTION/!.+>
+
+=item
+Match all top level sections but none of their subsections:
+
+C</!.+>
+
+=back
+
+=begin _NOT_IMPLEMENTED_
+
+=head1 RANGE SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"range specifications" to restrict the text processed to only the
+desired ranges of paragraphs in the desired set of sections. A range
+specification is a string containing a single Perl-style regular
+expression (a regex), or else two Perl-style regular expressions
+(regexs) separated by a ".." (Perl's "range" operator is "..").
+The regexs in a range specification are delimited by forward slashes
+("/"). If you need to use a forward slash literally within a regex you
+can escape it with a backslash ("\/").
+
+The formal syntax of a range specification is:
+
+=over 4
+
+=item
+
+/I<start-range-regex>/[../I<end-range-regex>/]
+
+=back
+
+Where each the item inside square brackets (the ".." followed by the
+end-range-regex) is optional. Each "range-regex" is of the form:
+
+ =cmd-expr text-expr
+
+Where I<cmd-expr> is intended to match the name of one or more POD
+commands, and I<text-expr> is intended to match the paragraph text for
+the command. If a range-regex is supposed to match a POD command, then
+the first character of the regex (the one after the initial '/')
+absolutely I<must> be an single '=' character; it may not be anything
+else (not even a regex meta-character) if it is supposed to match
+against the name of a POD command.
+
+If no I<=cmd-expr> is given then the text-expr will be matched against
+plain textblocks unless it is preceded by a space, in which case it is
+matched against verbatim text-blocks. If no I<text-expr> is given then
+only the command-portion of the paragraph is matched against.
+
+Note that these two expressions are each implicitly anchored. This
+means that when matching against the command-name, there will be an
+implicit '^' and '$' around the given I<=cmd-expr>; and when matching
+against the paragraph text there will be an implicit '\A' and '\Z'
+around the given I<text-expr>.
+
+Unlike with section-specs, the '!' character does I<not> have any special
+meaning (negation or otherwise) at the beginning of a range-spec!
+
+Some example range specifications follow.
+
+=over 4
+
+=item
+Match all C<=for html> paragraphs:
+
+C</=for html/>
+
+=item
+Match all paragraphs between C<=begin html> and C<=end html>
+(note that this will I<not> work correctly if such sections
+are nested):
+
+C</=begin html/../=end html/>
+
+=item
+Match all paragraphs between the given C<=item> name until the end of the
+current section:
+
+C</=item mine/../=head\d/>
+
+=item
+Match all paragraphs between the given C<=item> until the next item, or
+until the end of the itemized list (note that this will I<not> work as
+desired if the item contains an itemized list nested within it):
+
+C</=item mine/../=(item|back)/>
+
+=back
+
+=end _NOT_IMPLEMENTED_
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+use Carp;
+use Pod::Parser 1.04;
+use vars qw(@ISA @EXPORT $MAX_HEADING_LEVEL);
+
+@ISA = qw(Pod::Parser);
+@EXPORT = qw(&podselect);
+
+## Maximum number of heading levels supported for '=headN' directives
+*MAX_HEADING_LEVEL = \3;
+
+#############################################################################
+
+=head1 OBJECT METHODS
+
+The following methods are provided in this module. Each one takes a
+reference to the object itself as an implicit first parameter.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+## =begin _PRIVATE_
+##
+## =head1 B<_init_headings()>
+##
+## Initialize the current set of active section headings.
+##
+## =cut
+##
+## =end _PRIVATE_
+
+use vars qw(%myData @section_headings);
+
+sub _init_headings {
+ my $self = shift;
+ local *myData = $self;
+
+ ## Initialize current section heading titles if necessary
+ unless (defined $myData{_SECTION_HEADINGS}) {
+ local *section_headings = $myData{_SECTION_HEADINGS} = [];
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $section_headings[$i] = '';
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<curr_headings()>
+
+ ($head1, $head2, $head3, ...) = $parser->curr_headings();
+ $head1 = $parser->curr_headings(1);
+
+This method returns a list of the currently active section headings and
+subheadings in the document being parsed. The list of headings returned
+corresponds to the most recently parsed paragraph of the input.
+
+If an argument is given, it must correspond to the desired section
+heading number, in which case only the specified section heading is
+returned. If there is no current section heading at the specified
+level, then C<undef> is returned.
+
+=cut
+
+sub curr_headings {
+ my $self = shift;
+ $self->_init_headings() unless (defined $self->{_SECTION_HEADINGS});
+ my @headings = @{ $self->{_SECTION_HEADINGS} };
+ return (@_ > 0 and $_[0] =~ /^\d+$/) ? $headings[$_[0] - 1] : @headings;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<select()>
+
+ $parser->select($section_spec1,$section_spec2,...);
+
+This method is used to select the particular sections and subsections of
+POD documentation that are to be printed and/or processed. The existing
+set of selected sections is I<replaced> with the given set of sections.
+See B<add_selection()> for adding to the current set of selected
+sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">. The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+If no C<$section_spec> arguments are given, then the existing set of
+selected sections is cleared out (which means C<all> sections will be
+processed).
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+use vars qw(@selected_sections);
+
+sub select {
+ my $self = shift;
+ my @sections = @_;
+ local *myData = $self;
+ local $_;
+
+### NEED TO DISCERN A SECTION-SPEC FROM A RANGE-SPEC (look for m{^/.+/$}?)
+
+ ##---------------------------------------------------------------------
+ ## The following is a blatant hack for backward compatibility, and for
+ ## implementing add_selection(). If the *first* *argument* is the
+ ## string "+", then the remaining section specifications are *added*
+ ## to the current set of selections; otherwise the given section
+ ## specifications will *replace* the current set of selections.
+ ##
+ ## This should probably be fixed someday, but for the present time,
+ ## it seems incredibly unlikely that "+" would ever correspond to
+ ## a legitimate section heading
+ ##---------------------------------------------------------------------
+ my $add = ($sections[0] eq "+") ? shift(@sections) : "";
+
+ ## Reset the set of sections to use
+ unless (@sections > 0) {
+ delete $myData{_SELECTED_SECTIONS} unless ($add);
+ return;
+ }
+ $myData{_SELECTED_SECTIONS} = []
+ unless ($add && exists $myData{_SELECTED_SECTIONS});
+ local *selected_sections = $myData{_SELECTED_SECTIONS};
+
+ ## Compile each spec
+ my $spec;
+ for $spec (@sections) {
+ if ( defined($_ = &_compile_section_spec($spec)) ) {
+ ## Store them in our sections array
+ push(@selected_sections, $_);
+ }
+ else {
+ carp "Ignoring section spec \"$spec\"!\n";
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<add_selection()>
+
+ $parser->add_selection($section_spec1,$section_spec2,...);
+
+This method is used to add to the currently selected sections and
+subsections of POD documentation that are to be printed and/or
+processed. See <select()> for replacing the currently selected sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">. The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub add_selection {
+ my $self = shift;
+ $self->select("+", @_);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<clear_selections()>
+
+ $parser->clear_selections();
+
+This method takes no arguments, it has the exact same effect as invoking
+<select()> with no arguments.
+
+=cut
+
+sub clear_selections {
+ my $self = shift;
+ $self->select();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<match_section()>
+
+ $boolean = $parser->match_section($heading1,$heading2,...);
+
+Returns a value of true if the given section and subsection heading
+titles match any of the currently selected section specifications in
+effect from prior calls to B<select()> and B<add_selection()> (or if
+there are no explictly selected/deselected sections).
+
+The arguments C<$heading1>, C<$heading2>, etc. are the heading titles of
+the corresponding sections, subsections, etc. to try and match. If
+C<$headingN> is omitted then it defaults to the current corresponding
+section heading title in the input.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub match_section {
+ my $self = shift;
+ my (@headings) = @_;
+ local *myData = $self;
+
+ ## Return true if no restrictions were explicitly specified
+ my $selections = (exists $myData{_SELECTED_SECTIONS})
+ ? $myData{_SELECTED_SECTIONS} : undef;
+ return 1 unless ((defined $selections) && (@{$selections} > 0));
+
+ ## Default any unspecified sections to the current one
+ my @current_headings = $self->curr_headings();
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ (defined $headings[$i]) or $headings[$i] = $current_headings[$i];
+ }
+
+ ## Look for a match against the specified section expressions
+ my ($section_spec, $regex, $negated, $match);
+ for $section_spec ( @{$selections} ) {
+ ##------------------------------------------------------
+ ## Each portion of this spec must match in order for
+ ## the spec to be matched. So we will start with a
+ ## match-value of 'true' and logically 'and' it with
+ ## the results of matching a given element of the spec.
+ ##------------------------------------------------------
+ $match = 1;
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $regex = $section_spec->[$i];
+ $negated = ($regex =~ s/^\!//);
+ $match &= ($negated ? ($headings[$i] !~ /${regex}/)
+ : ($headings[$i] =~ /${regex}/));
+ last unless ($match);
+ }
+ return 1 if ($match);
+ }
+ return 0; ## no match
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<is_selected()>
+
+ $boolean = $parser->is_selected($paragraph);
+
+This method is used to determine if the block of text given in
+C<$paragraph> falls within the currently selected set of POD sections
+and subsections to be printed or processed. This method is also
+responsible for keeping track of the current input section and
+subsections. It is assumed that C<$paragraph> is the most recently read
+(but not yet processed) input paragraph.
+
+The value returned will be true if the C<$paragraph> and the rest of the
+text in the same section as C<$paragraph> should be selected (included)
+for processing; otherwise a false value is returned.
+
+=cut
+
+sub is_selected {
+ my ($self, $paragraph) = @_;
+ local $_;
+ local *myData = $self;
+
+ $self->_init_headings() unless (defined $myData{_SECTION_HEADINGS});
+
+ ## Keep track of current sections levels and headings
+ $_ = $paragraph;
+ if (/^=((?:sub)*)(?:head(?:ing)?|sec(?:tion)?)(\d*)\s+(.*)\s*$/) {
+ ## This is a section heading command
+ my ($level, $heading) = ($2, $3);
+ $level = 1 + (length($1) / 3) if ((! length $level) || (length $1));
+ ## Reset the current section heading at this level
+ $myData{_SECTION_HEADINGS}->[$level - 1] = $heading;
+ ## Reset subsection headings of this one to empty
+ for (my $i = $level; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $myData{_SECTION_HEADINGS}->[$i] = '';
+ }
+ }
+
+ return $self->match_section();
+}
+
+#############################################################################
+
+=head1 EXPORTED FUNCTIONS
+
+The following functions are exported by this module. Please note that
+these are functions (not methods) and therefore C<do not> take an
+implicit first argument.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<podselect()>
+
+ podselect(\%options,@filelist);
+
+B<podselect> will print the raw (untranslated) POD paragraphs of all
+POD sections in the given input files specified by C<@filelist>
+according to the given options.
+
+If any argument to B<podselect> is a reference to a hash
+(associative array) then the values with the following keys are
+processed as follows:
+
+=over 4
+
+=item B<-output>
+
+A string corresponding to the desired output file (or ">&STDOUT"
+or ">&STDERR"). The default is to use standard output.
+
+=item B<-sections>
+
+A reference to an array of sections specifications (as described in
+L<"SECTION SPECIFICATIONS">) which indicate the desired set of POD
+sections and subsections to be selected from input. If no section
+specifications are given, then all sections of the PODs are used.
+
+=begin _NOT_IMPLEMENTED_
+
+=item B<-ranges>
+
+A reference to an array of range specifications (as described in
+L<"RANGE SPECIFICATIONS">) which indicate the desired range of POD
+paragraphs to be selected from the desired input sections. If no range
+specifications are given, then all paragraphs of the desired sections
+are used.
+
+=end _NOT_IMPLEMENTED_
+
+=back
+
+All other arguments should correspond to the names of input files
+containing POD sections. A file name of "-" or "<&STDIN" will
+be interpeted to mean standard input (which is the default if no
+filenames are given).
+
+=cut
+
+sub podselect {
+ my(@argv) = @_;
+ my %defaults = ();
+ my $pod_parser = new Pod::Select(%defaults);
+ my $num_inputs = 0;
+ my $output = ">&STDOUT";
+ my %opts = ();
+ local $_;
+ for (@argv) {
+ if (ref($_)) {
+ next unless (ref($_) eq 'HASH');
+ %opts = (%defaults, %{$_});
+
+ ##-------------------------------------------------------------
+ ## Need this for backward compatibility since we formerly used
+ ## options that were all uppercase words rather than ones that
+ ## looked like Unix command-line options.
+ ## to be uppercase keywords)
+ ##-------------------------------------------------------------
+ %opts = map {
+ my ($key, $val) = (lc $_, $opts{$_});
+ $key =~ s/^(?=\w)/-/;
+ $key =~ /^-se[cl]/ and $key = '-sections';
+ #! $key eq '-range' and $key .= 's';
+ ($key => $val);
+ } (keys %opts);
+
+ ## Process the options
+ (exists $opts{'-output'}) and $output = $opts{'-output'};
+
+ ## Select the desired sections
+ $pod_parser->select(@{ $opts{'-sections'} })
+ if ( (defined $opts{'-sections'})
+ && ((ref $opts{'-sections'}) eq 'ARRAY') );
+
+ #! ## Select the desired paragraph ranges
+ #! $pod_parser->select(@{ $opts{'-ranges'} })
+ #! if ( (defined $opts{'-ranges'})
+ #! && ((ref $opts{'-ranges'}) eq 'ARRAY') );
+ }
+ else {
+ $pod_parser->parse_from_file($_, $output);
+ ++$num_inputs;
+ }
+ }
+ $pod_parser->parse_from_file("-") unless ($num_inputs > 0);
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Select> makes uses a number of internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions with client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Select> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Select> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_compile_section_spec()>
+
+ $listref = $parser->_compile_section_spec($section_spec);
+
+This function (note it is a function and I<not> a method) takes a
+section specification (as described in L<"SECTION SPECIFICATIONS">)
+given in C<$section_sepc>, and compiles it into a list of regular
+expressions. If C<$section_spec> has no syntax errors, then a reference
+to the list (array) of corresponding regular expressions is returned;
+otherwise C<undef> is returned and an error message is printed (using
+B<carp>) for each invalid regex.
+
+=end _PRIVATE_
+
+=cut
+
+sub _compile_section_spec {
+ my ($section_spec) = @_;
+ my (@regexs, $negated);
+
+ ## Compile the spec into a list of regexs
+ local $_ = $section_spec;
+ s|\\\\|\001|g; ## handle escaped backward slashes
+ s|\\/|\002|g; ## handle escaped forward slashes
+
+ ## Parse the regexs for the heading titles
+ @regexs = split('/', $_, $MAX_HEADING_LEVEL);
+
+ ## Set default regex for ommitted levels
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $regexs[$i] = '.*' unless ((defined $regexs[$i])
+ && (length $regexs[$i]));
+ }
+ ## Modify the regexs as needed and validate their syntax
+ my $bad_regexs = 0;
+ for (@regexs) {
+ $_ .= '.+' if ($_ eq '!');
+ s|\001|\\\\|g; ## restore escaped backward slashes
+ s|\002|\\/|g; ## restore escaped forward slashes
+ $negated = s/^\!//; ## check for negation
+ eval "/$_/"; ## check regex syntax
+ if ($@) {
+ ++$bad_regexs;
+ carp "Bad regular expression /$_/ in \"$section_spec\": $@\n";
+ }
+ else {
+ ## Add the forward and rear anchors (and put the negator back)
+ $_ = '^' . $_ unless (/^\^/);
+ $_ = $_ . '$' unless (/\$$/);
+ $_ = '!' . $_ if ($negated);
+ }
+ }
+ return (! $bad_regexs) ? [ @regexs ] : undef;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SECTION_HEADINGS}
+
+A reference to an array of the current section heading titles for each
+heading level (note that the first heading level title is at index 0).
+
+=end _PRIVATE_
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SELECTED_SECTIONS}
+
+A reference to an array of references to arrays. Each subarray is a list
+of anchored regular expressions (preceded by a "!" if the expression is to
+be negated). The index of the expression in the subarray should correspond
+to the index of the heading title in C<$self-E<gt>{_SECTION_HEADINGS}>
+that it is to be matched against.
+
+=end _PRIVATE_
+
+=cut
+
+#############################################################################
+
+=head1 SEE ALSO
+
+L<Pod::Parser>
+
+=head1 AUTHOR
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<pod2text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+1;
+
diff --git a/contrib/perl5/lib/Pod/Text.pm b/contrib/perl5/lib/Pod/Text.pm
index 549bab5..d93e5a4 100644
--- a/contrib/perl5/lib/Pod/Text.pm
+++ b/contrib/perl5/lib/Pod/Text.pm
@@ -1,551 +1,743 @@
-package Pod::Text;
-
-=head1 NAME
+# Pod::Text -- Convert POD data to formatted ASCII text.
+# $Id: Text.pm,v 2.3 1999/10/07 09:41:57 eagle Exp $
+#
+# Copyright 1999 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module is intended to be a replacement for Pod::Text, and attempts to
+# match its output except for some specific circumstances where other
+# decisions seemed to produce better output. It uses Pod::Parser and is
+# designed to be very easy to subclass.
+
+############################################################################
+# Modules and declarations
+############################################################################
-Pod::Text - convert POD data to formatted ASCII text
-
-=head1 SYNOPSIS
+package Pod::Text;
- use Pod::Text;
+require 5.004;
- pod2text("perlfunc.pod");
+use Carp qw(carp croak);
+use Exporter ();
+use Pod::Select ();
-Also:
+use strict;
+use vars qw(@ISA @EXPORT %ESCAPES $VERSION);
- pod2text [B<-a>] [B<->I<width>] < input.pod
+# We inherit from Pod::Select instead of Pod::Parser so that we can be used
+# by Pod::Usage.
+@ISA = qw(Pod::Select Exporter);
-=head1 DESCRIPTION
+# We have to export pod2text for backward compatibility.
+@EXPORT = qw(pod2text);
-Pod::Text is a module that can convert documentation in the POD format (such
-as can be found throughout the Perl distribution) into formatted ASCII.
-Termcap is optionally supported for boldface/underline, and can enabled via
-C<$Pod::Text::termcap=1>. If termcap has not been enabled, then backspaces
-will be used to simulate bold and underlined text.
+($VERSION = (split (' ', q$Revision: 2.3 $ ))[1]) =~ s/\.(\d)$/.0$1/;
+
+
+############################################################################
+# Table of supported E<> escapes
+############################################################################
+
+# This table is taken near verbatim from Pod::PlainText in Pod::Parser,
+# which got it near verbatim from the original Pod::Text. It is therefore
+# credited to Tom Christiansen, and I'm glad I didn't have to write it. :)
+# "iexcl" to "divide" added by Tim Jenness
+%ESCAPES = (
+ 'amp' => '&', # ampersand
+ 'lt' => '<', # left chevron, less-than
+ 'gt' => '>', # right chevron, greater-than
+ 'quot' => '"', # double quote
+
+ "Aacute" => "\xC1", # capital A, acute accent
+ "aacute" => "\xE1", # small a, acute accent
+ "Acirc" => "\xC2", # capital A, circumflex accent
+ "acirc" => "\xE2", # small a, circumflex accent
+ "AElig" => "\xC6", # capital AE diphthong (ligature)
+ "aelig" => "\xE6", # small ae diphthong (ligature)
+ "Agrave" => "\xC0", # capital A, grave accent
+ "agrave" => "\xE0", # small a, grave accent
+ "Aring" => "\xC5", # capital A, ring
+ "aring" => "\xE5", # small a, ring
+ "Atilde" => "\xC3", # capital A, tilde
+ "atilde" => "\xE3", # small a, tilde
+ "Auml" => "\xC4", # capital A, dieresis or umlaut mark
+ "auml" => "\xE4", # small a, dieresis or umlaut mark
+ "Ccedil" => "\xC7", # capital C, cedilla
+ "ccedil" => "\xE7", # small c, cedilla
+ "Eacute" => "\xC9", # capital E, acute accent
+ "eacute" => "\xE9", # small e, acute accent
+ "Ecirc" => "\xCA", # capital E, circumflex accent
+ "ecirc" => "\xEA", # small e, circumflex accent
+ "Egrave" => "\xC8", # capital E, grave accent
+ "egrave" => "\xE8", # small e, grave accent
+ "ETH" => "\xD0", # capital Eth, Icelandic
+ "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
+ "Icirc" => "\xCE", # capital I, circumflex accent
+ "icirc" => "\xEE", # small i, circumflex accent
+ "Igrave" => "\xCD", # capital I, grave accent
+ "igrave" => "\xED", # small i, grave accent
+ "Iuml" => "\xCF", # capital I, dieresis or umlaut mark
+ "iuml" => "\xEF", # small i, dieresis or umlaut mark
+ "Ntilde" => "\xD1", # capital N, tilde
+ "ntilde" => "\xF1", # small n, tilde
+ "Oacute" => "\xD3", # capital O, acute accent
+ "oacute" => "\xF3", # small o, acute accent
+ "Ocirc" => "\xD4", # capital O, circumflex accent
+ "ocirc" => "\xF4", # small o, circumflex accent
+ "Ograve" => "\xD2", # capital O, grave accent
+ "ograve" => "\xF2", # small o, grave accent
+ "Oslash" => "\xD8", # capital O, slash
+ "oslash" => "\xF8", # small o, slash
+ "Otilde" => "\xD5", # capital O, tilde
+ "otilde" => "\xF5", # small o, tilde
+ "Ouml" => "\xD6", # capital O, dieresis or umlaut mark
+ "ouml" => "\xF6", # small o, dieresis or umlaut mark
+ "szlig" => "\xDF", # small sharp s, German (sz ligature)
+ "THORN" => "\xDE", # capital THORN, Icelandic
+ "thorn" => "\xFE", # small thorn, Icelandic
+ "Uacute" => "\xDA", # capital U, acute accent
+ "uacute" => "\xFA", # small u, acute accent
+ "Ucirc" => "\xDB", # capital U, circumflex accent
+ "ucirc" => "\xFB", # small u, circumflex accent
+ "Ugrave" => "\xD9", # capital U, grave accent
+ "ugrave" => "\xF9", # small u, grave accent
+ "Uuml" => "\xDC", # capital U, dieresis or umlaut mark
+ "uuml" => "\xFC", # small u, dieresis or umlaut mark
+ "Yacute" => "\xDD", # capital Y, acute accent
+ "yacute" => "\xFD", # small y, acute accent
+ "yuml" => "\xFF", # small y, dieresis or umlaut mark
+
+ "lchevron" => "\xAB", # left chevron (double less than) laquo
+ "rchevron" => "\xBB", # right chevron (double greater than) raquo
+
+ "iexcl" => "\xA1", # inverted exclamation mark
+ "cent" => "\xA2", # cent sign
+ "pound" => "\xA3", # (UK) pound sign
+ "curren" => "\xA4", # currency sign
+ "yen" => "\xA5", # yen sign
+ "brvbar" => "\xA6", # broken vertical bar
+ "sect" => "\xA7", # section sign
+ "uml" => "\xA8", # diaresis
+ "copy" => "\xA9", # Copyright symbol
+ "ordf" => "\xAA", # feminine ordinal indicator
+ "laquo" => "\xAB", # left pointing double angle quotation mark
+ "not" => "\xAC", # not sign
+ "shy" => "\xAD", # soft hyphen
+ "reg" => "\xAE", # registered trademark
+ "macr" => "\xAF", # macron, overline
+ "deg" => "\xB0", # degree sign
+ "plusmn" => "\xB1", # plus-minus sign
+ "sup2" => "\xB2", # superscript 2
+ "sup3" => "\xB3", # superscript 3
+ "acute" => "\xB4", # acute accent
+ "micro" => "\xB5", # micro sign
+ "para" => "\xB6", # pilcrow sign = paragraph sign
+ "middot" => "\xB7", # middle dot = Georgian comma
+ "cedil" => "\xB8", # cedilla
+ "sup1" => "\xB9", # superscript 1
+ "ordm" => "\xBA", # masculine ordinal indicator
+ "raquo" => "\xBB", # right pointing double angle quotation mark
+ "frac14" => "\xBC", # vulgar fraction one quarter
+ "frac12" => "\xBD", # vulgar fraction one half
+ "frac34" => "\xBE", # vulgar fraction three quarters
+ "iquest" => "\xBF", # inverted question mark
+ "times" => "\xD7", # multiplication sign
+ "divide" => "\xF7", # division sign
+);
-A separate F<pod2text> program is included that is primarily a wrapper for
-Pod::Text.
-The single function C<pod2text()> can take the optional options B<-a>
-for an alternative output format, then a B<->I<width> option with the
-max terminal width, followed by one or two arguments. The first
-should be the name of a file to read the pod from, or "E<lt>&STDIN" to read from
-STDIN. A second argument, if provided, should be a filehandle glob where
-output should be sent.
+############################################################################
+# Initialization
+############################################################################
-=head1 AUTHOR
+# Initialize the object. Must be sure to call our parent initializer.
+sub initialize {
+ my $self = shift;
-Tom Christiansen E<lt>F<tchrist@mox.perl.com>E<gt>
+ $$self{alt} = 0 unless defined $$self{alt};
+ $$self{indent} = 4 unless defined $$self{indent};
+ $$self{loose} = 0 unless defined $$self{loose};
+ $$self{sentence} = 0 unless defined $$self{sentence};
+ $$self{width} = 76 unless defined $$self{width};
-=head1 TODO
+ $$self{INDENTS} = []; # Stack of indentations.
+ $$self{MARGIN} = $$self{indent}; # Current left margin in spaces.
-Cleanup work. The input and output locations need to be more flexible,
-termcap shouldn't be a global variable, and the terminal speed needs to
-be properly calculated.
+ $self->SUPER::initialize;
+}
-=cut
-use Term::Cap;
-require Exporter;
-@ISA = Exporter;
-@EXPORT = qw(pod2text);
-
-use vars qw($VERSION);
-$VERSION = "1.0203";
+############################################################################
+# Core overrides
+############################################################################
+
+# Called for each command paragraph. Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object. Just dispatches
+# the command to a method named the same as the command. =cut is handled
+# internally by Pod::Parser.
+sub command {
+ my $self = shift;
+ my $command = shift;
+ return if $command eq 'pod';
+ return if ($$self{EXCLUDE} && $command ne 'end');
+ $self->item ("\n") if defined $$self{ITEM};
+ $command = 'cmd_' . $command;
+ $self->$command (@_);
+}
-use locale; # make \w work right in non-ASCII lands
+# Called for a verbatim paragraph. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Just output it verbatim, but with tabs converted
+# to spaces.
+sub verbatim {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ $self->item if defined $$self{ITEM};
+ local $_ = shift;
+ return if /^\s*$/;
+ s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme;
+ $self->output ($_);
+}
-$termcap=0;
+# Called for a regular text block. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Perform interpolation and output the results.
+sub textblock {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ $self->output ($_[0]), return if $$self{VERBATIM};
+ local $_ = shift;
+ my $line = shift;
-$opt_alt_format = 0;
+ # Perform a little magic to collapse multiple L<> references. This is
+ # here mostly for backwards-compatibility. We'll just rewrite the whole
+ # thing into actual text at this part, bypassing the whole internal
+ # sequence parsing thing.
+ s{
+ (
+ L< # A link of the form L</something>.
+ /
+ (
+ [:\w]+ # The item has to be a simple word...
+ (\(\))? # ...or simple function.
+ )
+ >
+ (
+ ,?\s+(and\s+)? # Allow lots of them, conjuncted.
+ L<
+ /
+ (
+ [:\w]+
+ (\(\))?
+ )
+ >
+ )+
+ )
+ } {
+ local $_ = $1;
+ s%L</([^>]+)>%$1%g;
+ my @items = split /(?:,?\s+(?:and\s+)?)/;
+ my $string = "the ";
+ my $i;
+ for ($i = 0; $i < @items; $i++) {
+ $string .= $items[$i];
+ $string .= ", " if @items > 2 && $i != $#items;
+ $string .= " and " if ($i == $#items - 1);
+ }
+ $string .= " entries elsewhere in this document";
+ $string;
+ }gex;
+
+ # Now actually interpolate and output the paragraph.
+ $_ = $self->interpolate ($_, $line);
+ s/\s+$/\n/;
+ if (defined $$self{ITEM}) {
+ $self->item ($_ . "\n");
+ } else {
+ $self->output ($self->reformat ($_ . "\n"));
+ }
+}
-#$use_format=1;
+# Called for an interior sequence. Gets the command, argument, and a
+# Pod::InteriorSequence object and is expected to return the resulting text.
+# Calls code, bold, italic, file, and link to handle those types of
+# sequences, and handles S<>, E<>, X<>, and Z<> directly.
+sub interior_sequence {
+ my $self = shift;
+ my $command = shift;
+ local $_ = shift;
+ return '' if ($command eq 'X' || $command eq 'Z');
-$UNDL = "\x1b[4m";
-$INV = "\x1b[7m";
-$BOLD = "\x1b[1m";
-$NORM = "\x1b[0m";
+ # Expand escapes into the actual character now, carping if invalid.
+ if ($command eq 'E') {
+ if (/^\d+$/) {
+ return chr;
+ } else {
+ return $ESCAPES{$_} if defined $ESCAPES{$_};
+ carp "Unknown escape: E<$_>";
+ return "E<$_>";
+ }
+ }
-sub pod2text {
-shift if $opt_alt_format = ($_[0] eq '-a');
+ # For all the other sequences, empty content produces no output.
+ return if $_ eq '';
-if($termcap and !$setuptermcap) {
- $setuptermcap=1;
+ # For S<>, compress all internal whitespace and then map spaces to \01.
+ # When we output the text, we'll map this back.
+ if ($command eq 'S') {
+ s/\s{2,}/ /g;
+ tr/ /\01/;
+ return $_;
+ }
- my($term) = Tgetent Term::Cap { TERM => undef, OSPEED => 9600 };
- $UNDL = $term->{'_us'};
- $INV = $term->{'_mr'};
- $BOLD = $term->{'_md'};
- $NORM = $term->{'_me'};
+ # Anything else needs to get dispatched to another method.
+ if ($command eq 'B') { return $self->seq_b ($_) }
+ elsif ($command eq 'C') { return $self->seq_c ($_) }
+ elsif ($command eq 'F') { return $self->seq_f ($_) }
+ elsif ($command eq 'I') { return $self->seq_i ($_) }
+ elsif ($command eq 'L') { return $self->seq_l ($_) }
+ else { carp "Unknown sequence $command<$_>" }
}
-$SCREEN = ($_[0] =~ /^-(\d+)/ && (shift, $1))
- || $ENV{COLUMNS}
- || ($ENV{TERMCAP} =~ /co#(\d+)/)[0]
- || ($^O ne 'MSWin32' && $^O ne 'dos' && (`stty -a 2>/dev/null` =~ /(\d+) columns/)[0])
- || 72;
+# Called for each paragraph that's actually part of the POD. We take
+# advantage of this opportunity to untabify the input.
+sub preprocess_paragraph {
+ my $self = shift;
+ local $_ = shift;
+ 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
+ $_;
+}
-@_ = ("<&STDIN") unless @_;
-local($file,*OUTPUT) = @_;
-*OUTPUT = *STDOUT if @_<2;
-local $: = $:;
-$: = " \n" if $opt_alt_format; # Do not break ``-L/lib/'' into ``- L/lib/''.
+############################################################################
+# Command paragraphs
+############################################################################
-$/ = "";
+# All command paragraphs take the paragraph and the line number.
-$FANCY = 0;
+# First level heading.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n==== $_ ====\n\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output ($_ . "\n");
+ }
+}
-$cutting = 1;
-$DEF_INDENT = 4;
-$indent = $DEF_INDENT;
-$needspace = 0;
-$begun = "";
+# Second level heading.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n== $_ ==\n\n");
+ } else {
+ $self->output (' ' x ($$self{indent} / 2) . $_ . "\n\n");
+ }
+}
-open(IN, $file) || die "Couldn't open $file: $!";
+# Start a list.
+sub cmd_over {
+ my $self = shift;
+ local $_ = shift;
+ unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+ push (@{ $$self{INDENTS} }, $$self{MARGIN});
+ $$self{MARGIN} += ($_ + 0);
+}
-POD_DIRECTIVE: while (<IN>) {
- if ($cutting) {
- next unless /^=/;
- $cutting = 0;
- }
- if ($begun) {
- if (/^=end\s+$begun/) {
- $begun = "";
- }
- elsif ($begun eq "text") {
- print OUTPUT $_;
- }
- next;
- }
- 1 while s{^(.*?)(\t+)(.*)$}{
- $1
- . (' ' x (length($2) * 8 - length($1) % 8))
- . $3
- }me;
- # Translate verbatim paragraph
- if (/^\s/) {
- output($_);
- next;
+# End a list.
+sub cmd_back {
+ my $self = shift;
+ $$self{MARGIN} = pop @{ $$self{INDENTS} };
+ unless (defined $$self{MARGIN}) {
+ carp "Unmatched =back";
+ $$self{MARGIN} = $$self{indent};
}
+}
- if (/^=for\s+(\S+)\s*(.*)/s) {
- if ($1 eq "text") {
- print OUTPUT $2,"";
- } else {
- # ignore unknown for
- }
- next;
- }
- elsif (/^=begin\s+(\S+)\s*(.*)/s) {
- $begun = $1;
- if ($1 eq "text") {
- print OUTPUT $2."";
- }
- next;
- }
+# An individual list item.
+sub cmd_item {
+ my $self = shift;
+ if (defined $$self{ITEM}) { $self->item }
+ local $_ = shift;
+ s/\s+$//;
+ $$self{ITEM} = $self->interpolate ($_);
+}
-sub prepare_for_output {
-
- s/\s*$/\n/;
- &init_noremap;
-
- # need to hide E<> first; they're processed in clear_noremap
- s/(E<[^<>]+>)/noremap($1)/ge;
- $maxnest = 10;
- while ($maxnest-- && /[A-Z]</) {
- unless ($FANCY) {
- if ($opt_alt_format) {
- s/[BC]<(.*?)>/``$1''/sg;
- s/F<(.*?)>/"$1"/sg;
- } else {
- s/C<(.*?)>/`$1'/sg;
- }
- } else {
- s/C<(.*?)>/noremap("E<lchevron>${1}E<rchevron>")/sge;
- }
- # s/[IF]<(.*?)>/italic($1)/ge;
- s/I<(.*?)>/*$1*/sg;
- # s/[CB]<(.*?)>/bold($1)/ge;
- s/X<.*?>//sg;
-
- # LREF: a la HREF L<show this text|man/section>
- s:L<([^|>]+)\|[^>]+>:$1:g;
-
- # LREF: a manpage(3f)
- s:L<([a-zA-Z][^\s\/]+)(\([^\)]+\))?>:the $1$2 manpage:g;
- # LREF: an =item on another manpage
- s{
- L<
- ([^/]+)
- /
- (
- [:\w]+
- (\(\))?
- )
- >
- } {the "$2" entry in the $1 manpage}gx;
-
- # LREF: an =item on this manpage
- s{
- ((?:
- L<
- /
- (
- [:\w]+
- (\(\))?
- )
- >
- (,?\s+(and\s+)?)?
- )+)
- } { internal_lrefs($1) }gex;
-
- # LREF: a =head2 (head1?), maybe on a manpage, maybe right here
- # the "func" can disambiguate
- s{
- L<
- (?:
- ([a-zA-Z]\S+?) /
- )?
- "?(.*?)"?
- >
- }{
- do {
- $1 # if no $1, assume it means on this page.
- ? "the section on \"$2\" in the $1 manpage"
- : "the section on \"$2\""
- }
- }sgex;
-
- s/[A-Z]<(.*?)>/$1/sg;
+# Begin a block for a particular translator. Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+ my $self = shift;
+ local $_ = shift;
+ my ($kind) = /^(\S+)/ or return;
+ if ($kind eq 'text') {
+ $$self{VERBATIM} = 1;
+ } else {
+ $$self{EXCLUDE} = 1;
}
- clear_noremap(1);
}
- &prepare_for_output;
-
- if (s/^=//) {
- # $needspace = 0; # Assume this.
- # s/\n/ /g;
- ($Cmd, $_) = split(' ', $_, 2);
- # clear_noremap(1);
- if ($Cmd eq 'cut') {
- $cutting = 1;
- }
- elsif ($Cmd eq 'pod') {
- $cutting = 0;
- }
- elsif ($Cmd eq 'head1') {
- makespace();
- if ($opt_alt_format) {
- print OUTPUT "\n";
- s/^(.+?)[ \t]*$/==== $1 ====/;
- }
- print OUTPUT;
- # print OUTPUT uc($_);
- $needspace = $opt_alt_format;
- }
- elsif ($Cmd eq 'head2') {
- makespace();
- # s/(\w+)/\u\L$1/g;
- #print ' ' x $DEF_INDENT, $_;
- # print "\xA7";
- s/(\w)/\xA7 $1/ if $FANCY;
- if ($opt_alt_format) {
- s/^(.+?)[ \t]*$/== $1 ==/;
- print OUTPUT "\n", $_;
- } else {
- print OUTPUT ' ' x ($DEF_INDENT/2), $_, "\n";
- }
- $needspace = $opt_alt_format;
- }
- elsif ($Cmd eq 'over') {
- push(@indent,$indent);
- $indent += ($_ + 0) || $DEF_INDENT;
- }
- elsif ($Cmd eq 'back') {
- $indent = pop(@indent);
- warn "Unmatched =back\n" unless defined $indent;
- }
- elsif ($Cmd eq 'item') {
- makespace();
- # s/\A(\s*)\*/$1\xb7/ if $FANCY;
- # s/^(\s*\*\s+)/$1 /;
- {
- if (length() + 3 < $indent) {
- my $paratag = $_;
- $_ = <IN>;
- if (/^=/) { # tricked!
- local($indent) = $indent[$#indent - 1] || $DEF_INDENT;
- output($paratag);
- redo POD_DIRECTIVE;
- }
- &prepare_for_output;
- IP_output($paratag, $_);
- } else {
- local($indent) = $indent[$#indent - 1] || $DEF_INDENT;
- output($_, 0);
- }
- }
- }
- else {
- warn "Unrecognized directive: $Cmd\n";
- }
- }
- else {
- # clear_noremap(1);
- makespace();
- output($_, 1);
- }
+# End a block for a particular translator. We assume that all =begin/=end
+# pairs are properly closed.
+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.
+sub cmd_for {
+ my $self = shift;
+ local $_ = shift;
+ my $line = shift;
+ return unless s/^text\b[ \t]*\n?//;
+ $self->verbatim ($_, $line);
}
-close(IN);
-}
+############################################################################
+# Interior sequences
+############################################################################
+
+# The simple formatting ones. These are here mostly so that subclasses can
+# override them and do more complicated things.
+sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] }
+sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" }
+sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] }
+sub seq_i { return '*' . $_[1] . '*' }
+
+# The complicated one. Handle links. Since this is plain text, we can't
+# actually make any real links, so this is all to figure out what text we
+# print out.
+sub seq_l {
+ my $self = shift;
+ local $_ = shift;
-#########################################################################
+ # Smash whitespace in case we were split across multiple lines.
+ s/\s+/ /g;
-sub makespace {
- if ($needspace) {
- print OUTPUT "\n";
- $needspace = 0;
+ # If we were given any explicit text, just output it.
+ if (/^([^|]+)\|/) { return $1 }
+
+ # Okay, leading and trailing whitespace isn't important; get rid of it.
+ s/^\s+//;
+ s/\s+$//;
+
+ # Default to using the whole content of the link entry as a section
+ # name. Note that L<manpage/> forces a manpage interpretation, as does
+ # something looking like L<manpage(section)>. The latter is an
+ # enhancement over the original Pod::Text.
+ my ($manpage, $section) = ('', $_);
+ if (/^"\s*(.*?)\s*"$/) {
+ $section = '"' . $1 . '"';
+ } elsif (m/^[-:.\w]+(?:\(\S+\))?$/) {
+ ($manpage, $section) = ($_, '');
+ } elsif (m%/%) {
+ ($manpage, $section) = split (/\s*\/\s*/, $_, 2);
}
-}
-sub bold {
- my $line = shift;
- return $line if $use_format;
- if($termcap) {
- $line = "$BOLD$line$NORM";
+ # Now build the actual output text.
+ my $text = '';
+ if (!length $section) {
+ $text = "the $manpage manpage" if length $manpage;
+ } elsif ($section =~ /^[:\w]+(?:\(\))?/) {
+ $text .= 'the ' . $section . ' entry';
+ $text .= (length $manpage) ? " in the $manpage manpage"
+ : " elsewhere in this document";
} else {
- $line =~ s/(.)/$1\b$1/g;
- }
-# $line = "$BOLD$line$NORM" if $ansify;
- return $line;
+ $section =~ s/^\"\s*//;
+ $section =~ s/\s*\"$//;
+ $text .= 'the section on "' . $section . '"';
+ $text .= " in the $manpage manpage" if length $manpage;
+ }
+ $text;
}
-sub italic {
- my $line = shift;
- return $line if $use_format;
- if($termcap) {
- $line = "$UNDL$line$NORM";
+
+############################################################################
+# List handling
+############################################################################
+
+# This method is called whenever an =item command is complete (in other
+# words, we've seen its associated paragraph or know for certain that it
+# doesn't have one). It gets the paragraph associated with the item as an
+# argument. If that argument is empty, just output the item tag; if it
+# contains a newline, output the item tag followed by the newline.
+# Otherwise, see if there's enough room for us to output the item tag in the
+# margin of the text or if we have to put it on a separate line.
+sub item {
+ my $self = shift;
+ local $_ = shift;
+ my $tag = $$self{ITEM};
+ unless (defined $tag) {
+ carp "item called without tag";
+ return;
+ }
+ undef $$self{ITEM};
+ my $indent = $$self{INDENTS}[-1];
+ unless (defined $indent) { $indent = $$self{indent} }
+ my $space = ' ' x $indent;
+ $space =~ s/^ /:/ if $$self{alt};
+ if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) {
+ my $margin = $$self{MARGIN};
+ $$self{MARGIN} = $indent;
+ my $output = $self->reformat ($tag);
+ $output =~ s/\n*$/\n/;
+ $self->output ($output);
+ $$self{MARGIN} = $margin;
+ $self->output ($self->reformat ($_)) if /\S/;
} else {
- $line =~ s/(.)/$1\b_/g;
+ $_ = $self->reformat ($_);
+ s/^ /:/ if ($$self{alt} && $indent > 0);
+ my $tagspace = ' ' x length $tag;
+ s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item";
+ $self->output ($_);
}
-# $line = "$UNDL$line$NORM" if $ansify;
- return $line;
}
-# Fill a paragraph including underlined and overstricken chars.
-# It's not perfect for words longer than the margin, and it's probably
-# slow, but it works.
-sub fill {
+
+############################################################################
+# Output formatting
+############################################################################
+
+# Wrap a line, indenting by the current left margin. We can't use
+# Text::Wrap because it plays games with tabs. We can't use formline, even
+# though we'd really like to, because it screws up non-printing characters.
+# So we have to do the wrapping ourselves.
+sub wrap {
+ my $self = shift;
local $_ = shift;
- my $par = "";
- my $indent_space = " " x $indent;
- my $marg = $SCREEN-$indent;
- my $line = $indent_space;
- my $line_length;
- foreach (split) {
- my $word_length = length;
- $word_length -= 2 while /\010/g; # Subtract backspaces
-
- if ($line_length + $word_length > $marg) {
- $par .= $line . "\n";
- $line= $indent_space . $_;
- $line_length = $word_length;
- }
- else {
- if ($line_length) {
- $line_length++;
- $line .= " ";
- }
- $line_length += $word_length;
- $line .= $_;
- }
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{width} - $$self{MARGIN};
+ while (length > $width) {
+ if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
}
- $par .= "$line\n" if $line;
- $par .= "\n";
- return $par;
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ $output;
}
-sub IP_output {
- local($tag, $_) = @_;
- local($tag_indent) = $indent[$#indent - 1] || $DEF_INDENT;
- $tag_cols = $SCREEN - $tag_indent;
- $cols = $SCREEN - $indent;
- $tag =~ s/\s*$//;
- s/\s+/ /g;
- s/^ //;
- $str = "format OUTPUT = \n"
- . (($opt_alt_format && $tag_indent > 1)
- ? ":" . " " x ($tag_indent - 1)
- : " " x ($tag_indent))
- . '@' . ('<' x ($indent - $tag_indent - 1))
- . "^" . ("<" x ($cols - 1)) . "\n"
- . '$tag, $_'
- . "\n~~"
- . (" " x ($indent-2))
- . "^" . ("<" x ($cols - 5)) . "\n"
- . '$_' . "\n\n.\n1";
- #warn $str; warn "tag is $tag, _ is $_";
- eval $str || die;
- write OUTPUT;
-}
+# Reformat a paragraph of text for the current margin. Takes the text to
+# reformat and returns the formatted text.
+sub reformat {
+ my $self = shift;
+ local $_ = shift;
-sub output {
- local($_, $reformat) = @_;
- if ($reformat) {
- $cols = $SCREEN - $indent;
- s/\s+/ /g;
- s/^ //;
- $str = "format OUTPUT = \n~~"
- . (" " x ($indent-2))
- . "^" . ("<" x ($cols - 5)) . "\n"
- . '$_' . "\n\n.\n1";
- eval $str || die;
- write OUTPUT;
+ # If we're trying to preserve two spaces after sentences, do some
+ # munging to support that. Otherwise, smash all repeated whitespace.
+ if ($$self{sentence}) {
+ s/ +$//mg;
+ s/\.\n/. \n/g;
+ s/\n/ /g;
+ s/ +/ /g;
} else {
- s/^/' ' x $indent/gem;
- s/^\s+\n$/\n/gm;
- s/^ /: /s if defined($reformat) && $opt_alt_format;
- print OUTPUT;
+ s/\s+/ /g;
}
+ $self->wrap ($_);
}
-sub noremap {
- local($thing_to_hide) = shift;
- $thing_to_hide =~ tr/\000-\177/\200-\377/;
- return $thing_to_hide;
-}
+# Output text to the output device.
+sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] }
-sub init_noremap {
- die "unmatched init" if $mapready++;
- #mask off high bit characters in input stream
- s/([\200-\377])/"E<".ord($1).">"/ge;
-}
-sub clear_noremap {
- my $ready_to_print = $_[0];
- die "unmatched clear" unless $mapready--;
- tr/\200-\377/\000-\177/;
- # now for the E<>s, which have been hidden until now
- # otherwise the interative \w<> processing would have
- # been hosed by the E<gt>
- s {
- E<
- (
- ( \d+ )
- | ( [A-Za-z]+ )
- )
- >
- } {
- do {
- defined $2
- ? chr($2)
- :
- defined $HTML_Escapes{$3}
- ? do { $HTML_Escapes{$3} }
- : do {
- warn "Unknown escape: E<$1> in $_";
- "E<$1>";
- }
- }
- }egx if $ready_to_print;
-}
+############################################################################
+# Backwards compatibility
+############################################################################
-sub internal_lrefs {
- local($_) = shift;
- s{L</([^>]+)>}{$1}g;
- my(@items) = split( /(?:,?\s+(?:and\s+)?)/ );
- my $retstr = "the ";
- my $i;
- for ($i = 0; $i <= $#items; $i++) {
- $retstr .= "C<$items[$i]>";
- $retstr .= ", " if @items > 2 && $i != $#items;
- $retstr .= " and " if $i+2 == @items;
+# The old Pod::Text module did everything in a pod2text() function. This
+# tries to provide the same interface for legacy applications.
+sub pod2text {
+ my @args;
+
+ # This is really ugly; I hate doing option parsing in the middle of a
+ # module. But the old Pod::Text module supported passing flags to its
+ # entry function, so handle -a and -<number>.
+ while ($_[0] =~ /^-/) {
+ my $flag = shift;
+ if ($flag eq '-a') { push (@args, alt => 1) }
+ elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
+ else {
+ unshift (@_, $flag);
+ last;
+ }
}
- $retstr .= " entr" . ( @items > 1 ? "ies" : "y" )
- . " elsewhere in this document ";
-
- return $retstr;
-
+ # Now that we know what arguments we're using, create the parser.
+ my $parser = Pod::Text->new (@args);
+
+ # If two arguments were given, the second argument is going to be a file
+ # handle. That means we want to call parse_from_filehandle(), which
+ # means we need to turn the first argument into a file handle. Magic
+ # open will handle the <&STDIN case automagically.
+ if (defined $_[1]) {
+ local *IN;
+ unless (open (IN, $_[0])) {
+ croak ("Can't open $_[0] for reading: $!\n");
+ return;
+ }
+ $_[0] = \*IN;
+ return $parser->parse_from_filehandle (@_);
+ } else {
+ return $parser->parse_from_file (@_);
+ }
}
-BEGIN {
-
-%HTML_Escapes = (
- 'amp' => '&', # ampersand
- 'lt' => '<', # left chevron, less-than
- 'gt' => '>', # right chevron, greater-than
- 'quot' => '"', # double quote
-
- "Aacute" => "\xC1", # capital A, acute accent
- "aacute" => "\xE1", # small a, acute accent
- "Acirc" => "\xC2", # capital A, circumflex accent
- "acirc" => "\xE2", # small a, circumflex accent
- "AElig" => "\xC6", # capital AE diphthong (ligature)
- "aelig" => "\xE6", # small ae diphthong (ligature)
- "Agrave" => "\xC0", # capital A, grave accent
- "agrave" => "\xE0", # small a, grave accent
- "Aring" => "\xC5", # capital A, ring
- "aring" => "\xE5", # small a, ring
- "Atilde" => "\xC3", # capital A, tilde
- "atilde" => "\xE3", # small a, tilde
- "Auml" => "\xC4", # capital A, dieresis or umlaut mark
- "auml" => "\xE4", # small a, dieresis or umlaut mark
- "Ccedil" => "\xC7", # capital C, cedilla
- "ccedil" => "\xE7", # small c, cedilla
- "Eacute" => "\xC9", # capital E, acute accent
- "eacute" => "\xE9", # small e, acute accent
- "Ecirc" => "\xCA", # capital E, circumflex accent
- "ecirc" => "\xEA", # small e, circumflex accent
- "Egrave" => "\xC8", # capital E, grave accent
- "egrave" => "\xE8", # small e, grave accent
- "ETH" => "\xD0", # capital Eth, Icelandic
- "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
- "Icirc" => "\xCE", # capital I, circumflex accent
- "icirc" => "\xEE", # small i, circumflex accent
- "Igrave" => "\xCD", # capital I, grave accent
- "igrave" => "\xED", # small i, grave accent
- "Iuml" => "\xCF", # capital I, dieresis or umlaut mark
- "iuml" => "\xEF", # small i, dieresis or umlaut mark
- "Ntilde" => "\xD1", # capital N, tilde
- "ntilde" => "\xF1", # small n, tilde
- "Oacute" => "\xD3", # capital O, acute accent
- "oacute" => "\xF3", # small o, acute accent
- "Ocirc" => "\xD4", # capital O, circumflex accent
- "ocirc" => "\xF4", # small o, circumflex accent
- "Ograve" => "\xD2", # capital O, grave accent
- "ograve" => "\xF2", # small o, grave accent
- "Oslash" => "\xD8", # capital O, slash
- "oslash" => "\xF8", # small o, slash
- "Otilde" => "\xD5", # capital O, tilde
- "otilde" => "\xF5", # small o, tilde
- "Ouml" => "\xD6", # capital O, dieresis or umlaut mark
- "ouml" => "\xF6", # small o, dieresis or umlaut mark
- "szlig" => "\xDF", # small sharp s, German (sz ligature)
- "THORN" => "\xDE", # capital THORN, Icelandic
- "thorn" => "\xFE", # small thorn, Icelandic
- "Uacute" => "\xDA", # capital U, acute accent
- "uacute" => "\xFA", # small u, acute accent
- "Ucirc" => "\xDB", # capital U, circumflex accent
- "ucirc" => "\xFB", # small u, circumflex accent
- "Ugrave" => "\xD9", # capital U, grave accent
- "ugrave" => "\xF9", # small u, grave accent
- "Uuml" => "\xDC", # capital U, dieresis or umlaut mark
- "uuml" => "\xFC", # small u, dieresis or umlaut mark
- "Yacute" => "\xDD", # capital Y, acute accent
- "yacute" => "\xFD", # small y, acute accent
- "yuml" => "\xFF", # small y, dieresis or umlaut mark
-
- "lchevron" => "\xAB", # left chevron (double less than)
- "rchevron" => "\xBB", # right chevron (double greater than)
-);
-}
+
+############################################################################
+# Module return value and documentation
+############################################################################
1;
+__END__
+
+=head1 NAME
+
+Pod::Text - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+ use Pod::Text;
+ my $parser = Pod::Text->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted ASCII. It uses no
+special formatting controls or codes whatsoever, and its output is therefore
+suitable for nearly any device.
+
+As a derived class from Pod::Parser, Pod::Text supports the same methods and
+interfaces. See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<Pod::Text-E<gt>new()> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser. The currently recognized options are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin. Defaults to false.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks. Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=head1> heading.
+If set to false (the default), no blank line is printed after C<=head1>,
+although one is still printed after C<=head2>. This is the default because
+it's the expected formatting for manual pages; if you're formatting
+arbitrary text documents, setting this to true may result in more pleasing
+output.
+
+=item sentence
+
+If set to a true value, Pod::Text will assume that each sentence ends in two
+spaces, and will try to preserve that spacing. If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a
+single space. Defaults to true.
+
+=item width
+
+The column at which to wrap text on the right-hand side. Defaults to 76.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to. The first defaults
+to STDIN if not given, and the second defaults to STDOUT. The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead. See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bizarre space in item
+
+(W) Something has gone wrong in internal C<=item> processing. This message
+indicates a bug in Pod::Text; you should never see it.
+
+=item Can't open %s for reading: %s
+
+(F) Pod::Text was invoked via the compatibility mode pod2text() interface
+and the input file it was given could not be opened.
+
+=item Unknown escape: %s
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Text didn't
+know about.
+
+=item Unknown sequence: %s
+
+(W) The POD source contained a non-standard internal sequence (something of
+the form C<XE<lt>E<gt>>) that Pod::Text didn't know about.
+
+=item Unmatched =back
+
+(W) Pod::Text encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 RESTRICTIONS
+
+Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on
+output, due to an internal implementation detail.
+
+=head1 NOTES
+
+This is a replacement for an earlier Pod::Text module written by Tom
+Christiansen. It has a revamped interface, since it now uses Pod::Parser,
+but an interface roughly compatible with the old Pod::Text::pod2text()
+function is still available. Please change to the new calling convention,
+though.
+
+The original Pod::Text contained code to do formatting via termcap
+sequences, although it wasn't turned on by default and it was problematic to
+get it to work at all. This rewrite doesn't even try to do that, but a
+subclass of it does. Look for L<Pod::Text::Termcap|Pod::Text::Termcap>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser|Pod::Parser>, L<Pod::Text::Termcap|Pod::Text::Termcap>,
+pod2text(1)
+
+=head1 AUTHOR
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the
+original Pod::Text by Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> and
+its conversion to Pod::Parser by Brad Appleton
+E<lt>bradapp@enteract.comE<gt>.
+
+=cut
diff --git a/contrib/perl5/lib/Pod/Text/Color.pm b/contrib/perl5/lib/Pod/Text/Color.pm
new file mode 100644
index 0000000..10e1d9f
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Text/Color.pm
@@ -0,0 +1,125 @@
+# Pod::Text::Color -- Convert POD data to formatted color ASCII text
+# $Id: Color.pm,v 0.5 1999/09/20 10:15:16 eagle Exp $
+#
+# Copyright 1999 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This is just a basic proof of concept. It should later be modified to
+# make better use of color, take options changing what colors are used for
+# what text, and the like.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::Text::Color;
+
+require 5.004;
+
+use Pod::Text ();
+use Term::ANSIColor qw(colored);
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+# Use the CVS revision of this file as its version number.
+($VERSION = (split (' ', q$Revision: 0.5 $ ))[1]) =~ s/\.(\d)$/.0$1/;
+
+
+############################################################################
+# Overrides
+############################################################################
+
+# Make level one headings bold.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $self->SUPER::cmd_head1 (colored ($_, 'bold'));
+}
+
+# Make level two headings bold.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $self->SUPER::cmd_head2 (colored ($_, 'bold'));
+}
+
+# Fix the various interior sequences.
+sub seq_b { return colored ($_[1], 'bold') }
+sub seq_f { return colored ($_[1], 'cyan') }
+sub seq_i { return colored ($_[1], 'yellow') }
+
+# We unfortunately have to override the wrapping code here, since the normal
+# wrapping code gets really confused by all the escape sequences.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{width} - $$self{MARGIN};
+ while (length > $width) {
+ if (s/^((?:(?:\e\[[\d;]+m)?[^\n]){0,$width})\s+//
+ || s/^((?:(?:\e\[[\d;]+m)?[^\n]){$width})//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ $output;
+}
+
+############################################################################
+# Module return value and documentation
+############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text::Color - Convert POD data to formatted color ASCII text
+
+=head1 SYNOPSIS
+
+ use Pod::Text::Color;
+ my $parser = Pod::Text::Color->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Color is a simple subclass of Pod::Text that highlights output
+text using ANSI color escape sequences. Apart from the color, it in all
+ways functions like Pod::Text. See L<Pod::Text> for details and available
+options.
+
+Term::ANSIColor is used to get colors and therefore must be installed to use
+this module.
+
+=head1 BUGS
+
+This is just a basic proof of concept. It should be seriously expanded to
+support configurable coloration via options passed to the constructor, and
+B<pod2text> should be taught about those.
+
+=head1 SEE ALSO
+
+L<Pod::Text|Pod::Text>, L<Pod::Parser|Pod::Parser>
+
+=head1 AUTHOR
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>.
+
+=cut
diff --git a/contrib/perl5/lib/Pod/Text/Termcap.pm b/contrib/perl5/lib/Pod/Text/Termcap.pm
new file mode 100644
index 0000000..7e89ec6
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Text/Termcap.pm
@@ -0,0 +1,142 @@
+# Pod::Text::Termcap -- Convert POD data to ASCII text with format escapes.
+# $Id: Termcap.pm,v 0.4 1999/09/20 10:17:45 eagle Exp $
+#
+# Copyright 1999 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This is a simple subclass of Pod::Text that overrides a few key methods to
+# output the right termcap escape sequences for formatted text on the
+# current terminal type.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::Text::Termcap;
+
+require 5.004;
+
+use Pod::Text ();
+use POSIX ();
+use Term::Cap;
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+# Use the CVS revision of this file as its version number.
+($VERSION = (split (' ', q$Revision: 0.4 $ ))[1]) =~ s/\.(\d)$/.0$1/;
+
+
+############################################################################
+# Overrides
+############################################################################
+
+# In the initialization method, grab our terminal characteristics as well as
+# do all the stuff we normally do.
+sub initialize {
+ my $self = shift;
+
+ # The default Term::Cap path won't work on Solaris.
+ $ENV{TERMPATH} = "$ENV{HOME}/.termcap:/etc/termcap"
+ . ":/usr/share/misc/termcap:/usr/share/lib/termcap";
+
+ my $termios = POSIX::Termios->new;
+ $termios->getattr;
+ my $ospeed = $termios->getospeed;
+ my $term = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };
+ $$self{BOLD} = $$term{_md} or die 'BOLD';
+ $$self{UNDL} = $$term{_us} or die 'UNDL';
+ $$self{NORM} = $$term{_me} or die 'NORM';
+
+ unless (defined $$self{width}) {
+ $$self{width} = $ENV{COLUMNS} || $$term{_co} || 78;
+ $$self{width} -= 2;
+ }
+
+ $self->SUPER::initialize;
+}
+
+# Make level one headings bold.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $self->SUPER::cmd_head1 ("$$self{BOLD}$_$$self{NORM}");
+}
+
+# Make level two headings bold.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $self->SUPER::cmd_head2 ("$$self{BOLD}$_$$self{NORM}");
+}
+
+# Fix up B<> and I<>. Note that we intentionally don't do F<>.
+sub seq_b { my $self = shift; return "$$self{BOLD}$_[0]$$self{NORM}" }
+sub seq_i { my $self = shift; return "$$self{UNDL}$_[0]$$self{NORM}" }
+
+# Override the wrapping code to igore the special sequences.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{width} - $$self{MARGIN};
+ my $code = "(?:\Q$$self{BOLD}\E|\Q$$self{UNDL}\E|\Q$$self{NORM}\E)";
+ while (length > $width) {
+ if (s/^((?:$code?[^\n]){0,$width})\s+//
+ || s/^((?:$code?[^\n]){$width})//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ $output;
+}
+
+
+############################################################################
+# Module return value and documentation
+############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text::Color - Convert POD data to ASCII text with format escapes
+
+=head1 SYNOPSIS
+
+ use Pod::Text::Termcap;
+ my $parser = Pod::Text::Termcap->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Termcap is a simple subclass of Pod::Text that highlights output
+text using the correct termcap escape sequences for the current terminal.
+Apart from the format codes, it in all ways functions like Pod::Text. See
+L<Pod::Text> for details and available options.
+
+=head1 SEE ALSO
+
+L<Pod::Text|Pod::Text>, L<Pod::Parser|Pod::Parser>
+
+=head1 AUTHOR
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>.
+
+=cut
diff --git a/contrib/perl5/lib/Pod/Usage.pm b/contrib/perl5/lib/Pod/Usage.pm
new file mode 100644
index 0000000..aa8f712
--- /dev/null
+++ b/contrib/perl5/lib/Pod/Usage.pm
@@ -0,0 +1,544 @@
+#############################################################################
+# Pod/Usage.pm -- print usage messages for the running script.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Usage;
+
+use vars qw($VERSION);
+$VERSION = 1.12; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+=head1 NAME
+
+Pod::Usage, pod2usage() - print a usage message from embedded pod documentation
+
+=head1 SYNOPSIS
+
+ use Pod::Usage
+
+ my $message_text = "This text precedes the usage message.";
+ my $exit_status = 2; ## The exit status to use
+ my $verbose_level = 0; ## The verbose level to use
+ my $filehandle = \*STDERR; ## The filehandle to write to
+
+ pod2usage($message_text);
+
+ pod2usage($exit_status);
+
+ pod2usage( { -message => $message_text ,
+ -exitval => $exit_status ,
+ -verbose => $verbose_level,
+ -output => $filehandle } );
+
+ pod2usage( -msg => $message_text ,
+ -exitval => $exit_status ,
+ -verbose => $verbose_level,
+ -output => $filehandle );
+
+=head1 ARGUMENTS
+
+B<pod2usage> should be given either a single argument, or a list of
+arguments corresponding to an associative array (a "hash"). When a single
+argument is given, it should correspond to exactly one of the following:
+
+=over
+
+=item *
+
+A string containing the text of a message to print I<before> printing
+the usage message
+
+=item *
+
+A numeric value corresponding to the desired exit status
+
+=item *
+
+A reference to a hash
+
+=back
+
+If more than one argument is given then the entire argument list is
+assumed to be a hash. If a hash is supplied (either as a reference or
+as a list) it should contain one or more elements with the following
+keys:
+
+=over
+
+=item C<-message>
+
+=item C<-msg>
+
+The text of a message to print immediately prior to printing the
+program's usage message.
+
+=item C<-exitval>
+
+The desired exit status to pass to the B<exit()> function.
+
+=item C<-verbose>
+
+The desired level of "verboseness" to use when printing the usage
+message. If the corresponding value is 0, then only the "SYNOPSIS"
+section of the pod documentation is printed. If the corresponding value
+is 1, then the "SYNOPSIS" section, along with any section entitled
+"OPTIONS", "ARGUMENTS", or "OPTIONS AND ARGUMENTS" is printed. If the
+corresponding value is 2 or more then the entire manpage is printed.
+
+=item C<-output>
+
+A reference to a filehandle, or the pathname of a file to which the
+usage message should be written. The default is C<\*STDERR> unless the
+exit value is less than 2 (in which case the default is C<\*STDOUT>).
+
+=item C<-input>
+
+A reference to a filehandle, or the pathname of a file from which the
+invoking script's pod documentation should be read. It defaults to the
+file indicated by C<$0> (C<$PROGRAM_NAME> for users of F<English.pm>).
+
+=item C<-pathlist>
+
+A list of directory paths. If the input file does not exist, then it
+will be searched for in the given directory list (in the order the
+directories appear in the list). It defaults to the list of directories
+implied by C<$ENV{PATH}>. The list may be specified either by a reference
+to an array, or by a string of directory paths which use the same path
+separator as C<$ENV{PATH}> on your system (e.g., C<:> for Unix, C<;> for
+MSWin32 and DOS).
+
+=back
+
+=head1 DESCRIPTION
+
+B<pod2usage> will print a usage message for the invoking script (using
+its embedded pod documentation) and then exit the script with the
+desired exit status. The usage message printed may have any one of three
+levels of "verboseness": If the verbose level is 0, then only a synopsis
+is printed. If the verbose level is 1, then the synopsis is printed
+along with a description (if present) of the command line options and
+arguments. If the verbose level is 2, then the entire manual page is
+printed.
+
+Unless they are explicitly specified, the default values for the exit
+status, verbose level, and output stream to use are determined as
+follows:
+
+=over
+
+=item *
+
+If neither the exit status nor the verbose level is specified, then the
+default is to use an exit status of 2 with a verbose level of 0.
+
+=item *
+
+If an exit status I<is> specified but the verbose level is I<not>, then the
+verbose level will default to 1 if the exit status is less than 2 and
+will default to 0 otherwise.
+
+=item *
+
+If an exit status is I<not> specified but verbose level I<is> given, then
+the exit status will default to 2 if the verbose level is 0 and will
+default to 1 otherwise.
+
+=item *
+
+If the exit status used is less than 2, then output is printed on
+C<STDOUT>. Otherwise output is printed on C<STDERR>.
+
+=back
+
+Although the above may seem a bit confusing at first, it generally does
+"the right thing" in most situations. This determination of the default
+values to use is based upon the following typical Unix conventions:
+
+=over
+
+=item *
+
+An exit status of 0 implies "success". For example, B<diff(1)> exits
+with a status of 0 if the two files have the same contents.
+
+=item *
+
+An exit status of 1 implies possibly abnormal, but non-defective, program
+termination. For example, B<grep(1)> exits with a status of 1 if
+it did I<not> find a matching line for the given regular expression.
+
+=item *
+
+An exit status of 2 or more implies a fatal error. For example, B<ls(1)>
+exits with a status of 2 if you specify an illegal (unknown) option on
+the command line.
+
+=item *
+
+Usage messages issued as a result of bad command-line syntax should go
+to C<STDERR>. However, usage messages issued due to an explicit request
+to print usage (like specifying B<-help> on the command line) should go
+to C<STDOUT>, just in case the user wants to pipe the output to a pager
+(such as B<more(1)>).
+
+=item *
+
+If program usage has been explicitly requested by the user, it is often
+desireable to exit with a status of 1 (as opposed to 0) after issuing
+the user-requested usage message. It is also desireable to give a
+more verbose description of program usage in this case.
+
+=back
+
+B<pod2usage> doesn't force the above conventions upon you, but it will
+use them by default if you don't expressly tell it to do otherwise. The
+ability of B<pod2usage()> to accept a single number or a string makes it
+convenient to use as an innocent looking error message handling function:
+
+ use Pod::Usage;
+ use Getopt::Long;
+
+ ## Parse options
+ GetOptions("help", "man", "flag1") || pod2usage(2);
+ pod2usage(1) if ($opt_help);
+ pod2usage(-verbose => 2) if ($opt_man);
+
+ ## Check for too many filenames
+ pod2usage("$0: Too many files given.\n") if (@ARGV > 1);
+
+Some user's however may feel that the above "economy of expression" is
+not particularly readable nor consistent and may instead choose to do
+something more like the following:
+
+ use Pod::Usage;
+ use Getopt::Long;
+
+ ## Parse options
+ GetOptions("help", "man", "flag1") || pod2usage(-verbose => 0);
+ pod2usage(-verbose => 1) if ($opt_help);
+ pod2usage(-verbose => 2) if ($opt_man);
+
+ ## Check for too many filenames
+ pod2usage(-verbose => 2, -message => "$0: Too many files given.\n")
+ if (@ARGV > 1);
+
+As with all things in Perl, I<there's more than one way to do it>, and
+B<pod2usage()> adheres to this philosophy. If you are interested in
+seeing a number of different ways to invoke B<pod2usage> (although by no
+means exhaustive), please refer to L<"EXAMPLES">.
+
+=head1 EXAMPLES
+
+Each of the following invocations of C<pod2usage()> will print just the
+"SYNOPSIS" section to C<STDERR> and will exit with a status of 2:
+
+ pod2usage();
+
+ pod2usage(2);
+
+ pod2usage(-verbose => 0);
+
+ pod2usage(-exitval => 2);
+
+ pod2usage({-exitval => 2, -output => \*STDERR});
+
+ pod2usage({-verbose => 0, -output => \*STDERR});
+
+ pod2usage(-exitval => 2, -verbose => 0);
+
+ pod2usage(-exitval => 2, -verbose => 0, -output => \*STDERR);
+
+Each of the following invocations of C<pod2usage()> will print a message
+of "Syntax error." (followed by a newline) to C<STDERR>, immediately
+followed by just the "SYNOPSIS" section (also printed to C<STDERR>) and
+will exit with a status of 2:
+
+ pod2usage("Syntax error.");
+
+ pod2usage(-message => "Syntax error.", -verbose => 0);
+
+ pod2usage(-msg => "Syntax error.", -exitval => 2);
+
+ pod2usage({-msg => "Syntax error.", -exitval => 2, -output => \*STDERR});
+
+ pod2usage({-msg => "Syntax error.", -verbose => 0, -output => \*STDERR});
+
+ pod2usage(-msg => "Syntax error.", -exitval => 2, -verbose => 0);
+
+ pod2usage(-message => "Syntax error.",
+ -exitval => 2,
+ -verbose => 0,
+ -output => \*STDERR);
+
+Each of the following invocations of C<pod2usage()> will print the
+"SYNOPSIS" section and any "OPTIONS" and/or "ARGUMENTS" sections to
+C<STDOUT> and will exit with a status of 1:
+
+ pod2usage(1);
+
+ pod2usage(-verbose => 1);
+
+ pod2usage(-exitval => 1);
+
+ pod2usage({-exitval => 1, -output => \*STDOUT});
+
+ pod2usage({-verbose => 1, -output => \*STDOUT});
+
+ pod2usage(-exitval => 1, -verbose => 1);
+
+ pod2usage(-exitval => 1, -verbose => 1, -output => \*STDOUT});
+
+Each of the following invocations of C<pod2usage()> will print the
+entire manual page to C<STDOUT> and will exit with a status of 1:
+
+ pod2usage(-verbose => 2);
+
+ pod2usage({-verbose => 2, -output => \*STDOUT});
+
+ pod2usage(-exitval => 1, -verbose => 2);
+
+ pod2usage({-exitval => 1, -verbose => 2, -output => \*STDOUT});
+
+=head2 Recommended Use
+
+Most scripts should print some type of usage message to C<STDERR> when a
+command line syntax error is detected. They should also provide an
+option (usually C<-H> or C<-help>) to print a (possibly more verbose)
+usage message to C<STDOUT>. Some scripts may even wish to go so far as to
+provide a means of printing their complete documentation to C<STDOUT>
+(perhaps by allowing a C<-man> option). The following complete example
+uses B<Pod::Usage> in combination with B<Getopt::Long> to do all of these
+things:
+
+ use Getopt::Long;
+ use Pod::Usage;
+
+ my $man = 0;
+ my $help = 0;
+ ## Parse options and print usage if there is a syntax error,
+ ## or if usage was explicitly requested.
+ GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+ pod2usage(1) if $help;
+ pod2usage(-verbose => 2) if $man;
+
+ ## If no arguments were given, then allow STDIN to be used only
+ ## if it's not connected to a terminal (otherwise print usage)
+ pod2usage("$0: No files given.") if ((@ARGV == 0) && (-t STDIN));
+ __END__
+
+ =head1 NAME
+
+ sample - Using GetOpt::Long and Pod::Usage
+
+ =head1 SYNOPSIS
+
+ sample [options] [file ...]
+
+ Options:
+ -help brief help message
+ -man full documentation
+
+ =head1 OPTIONS
+
+ =over 8
+
+ =item B<-help>
+
+ Print a brief help message and exits.
+
+ =item B<-man>
+
+ Prints the manual page and exits.
+
+ =back
+
+ =head1 DESCRIPTION
+
+ B<This program> will read the given input file(s) and do something
+ useful with the contents thereof.
+
+ =cut
+
+=head1 CAVEATS
+
+By default, B<pod2usage()> will use C<$0> as the path to the pod input
+file. Unfortunately, not all systems on which Perl runs will set C<$0>
+properly (although if C<$0> isn't found, B<pod2usage()> will search
+C<$ENV{PATH}> or else the list specified by the C<-pathlist> option).
+If this is the case for your system, you may need to explicitly specify
+the path to the pod docs for the invoking script using something
+similar to the following:
+
+ pod2usage(-exitval => 2, -input => "/path/to/your/pod/docs");
+
+=head1 AUTHOR
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text::pod2text()> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=head1 ACKNOWLEDGEMENTS
+
+Steven McDougall E<lt>swmcd@world.std.comE<gt> for his help and patience
+with re-writing this manpage.
+
+=cut
+
+#############################################################################
+
+use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+use File::Spec;
+
+use vars qw(@ISA @EXPORT);
+@EXPORT = qw(&pod2usage);
+BEGIN {
+ if ( $] >= 5.005_58 ) {
+ require Pod::Text;
+ @ISA = qw( Pod::Text );
+ }
+ else {
+ require Pod::PlainText;
+ @ISA = qw( Pod::PlainText );
+ }
+}
+
+
+##---------------------------------------------------------------------------
+
+##---------------------------------
+## Function definitions begin here
+##---------------------------------
+
+sub pod2usage {
+ local($_) = shift || "";
+ my %opts;
+ ## Collect arguments
+ if (@_ > 0) {
+ ## Too many arguments - assume that this is a hash and
+ ## the user forgot to pass a reference to it.
+ %opts = ($_, @_);
+ }
+ elsif (ref $_) {
+ ## User passed a ref to a hash
+ %opts = %{$_} if (ref($_) eq 'HASH');
+ }
+ elsif (/^[-+]?\d+$/) {
+ ## User passed in the exit value to use
+ $opts{"-exitval"} = $_;
+ }
+ else {
+ ## User passed in a message to print before issuing usage.
+ $_ and $opts{"-message"} = $_;
+ }
+
+ ## Need this for backward compatibility since we formerly used
+ ## options that were all uppercase words rather than ones that
+ ## looked like Unix command-line options.
+ ## to be uppercase keywords)
+ %opts = map {
+ my $val = $opts{$_};
+ s/^(?=\w)/-/;
+ /^-msg/i and $_ = '-message';
+ /^-exit/i and $_ = '-exitval';
+ lc($_) => $val;
+ } (keys %opts);
+
+ ## Now determine default -exitval and -verbose values to use
+ if ((! defined $opts{"-exitval"}) && (! defined $opts{"-verbose"})) {
+ $opts{"-exitval"} = 2;
+ $opts{"-verbose"} = 0;
+ }
+ elsif (! defined $opts{"-exitval"}) {
+ $opts{"-exitval"} = ($opts{"-verbose"} > 0) ? 1 : 2;
+ }
+ elsif (! defined $opts{"-verbose"}) {
+ $opts{"-verbose"} = ($opts{"-exitval"} < 2);
+ }
+
+ ## Default the output file
+ $opts{"-output"} = ($opts{"-exitval"} < 2) ? \*STDOUT : \*STDERR
+ unless (defined $opts{"-output"});
+ ## Default the input file
+ $opts{"-input"} = $0 unless (defined $opts{"-input"});
+
+ ## Look up input file in path if it doesnt exist.
+ unless ((ref $opts{"-input"}) || (-e $opts{"-input"})) {
+ my ($dirname, $basename) = ('', $opts{"-input"});
+ my $pathsep = ($^O =~ /^(?:dos|os2|MSWin32)$/) ? ";"
+ : (($^O eq 'MacOS') ? ',' : ":");
+ my $pathspec = $opts{"-pathlist"} || $ENV{PATH} || $ENV{PERL5LIB};
+
+ my @paths = (ref $pathspec) ? @$pathspec : split($pathsep, $pathspec);
+ for $dirname (@paths) {
+ $_ = File::Spec->catfile($dirname, $basename) if length;
+ last if (-e $_) && ($opts{"-input"} = $_);
+ }
+ }
+
+ ## Now create a pod reader and constrain it to the desired sections.
+ my $parser = new Pod::Usage(USAGE_OPTIONS => \%opts);
+ if ($opts{"-verbose"} == 0) {
+ $parser->select("SYNOPSIS");
+ }
+ elsif ($opts{"-verbose"} == 1) {
+ my $opt_re = '(?i)' .
+ '(?:OPTIONS|ARGUMENTS)' .
+ '(?:\s*(?:AND|\/)\s*(?:OPTIONS|ARGUMENTS))?';
+ $parser->select( 'SYNOPSIS', $opt_re, "DESCRIPTION/$opt_re" );
+ }
+
+ ## Now translate the pod document and then exit with the desired status
+ $parser->parse_from_file($opts{"-input"}, $opts{"-output"});
+ exit($opts{"-exitval"});
+}
+
+##---------------------------------------------------------------------------
+
+##-------------------------------
+## Method definitions begin here
+##-------------------------------
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my %params = @_;
+ my $self = {%params};
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+sub begin_pod {
+ my $self = shift;
+ $self->SUPER::begin_pod(); ## Have to call superclass
+ my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1;
+ my $out_fh = $self->output_handle();
+ print $out_fh "$msg\n";
+}
+
+sub preprocess_paragraph {
+ my $self = shift;
+ local $_ = shift;
+ my $line = shift;
+ ## See if this is a heading and we arent printing the entire manpage.
+ if (($self->{USAGE_OPTIONS}->{-verbose} < 2) && /^=head/) {
+ ## Change the title of the SYNOPSIS section to USAGE
+ s/^=head1\s+SYNOPSIS\s*$/=head1 USAGE/;
+ ## Try to do some lowercasing instead of all-caps in headings
+ s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge;
+ ## Use a colon to end all headings
+ s/\s*$/:/ unless (/:\s*$/);
+ $_ .= "\n";
+ }
+ return $self->SUPER::preprocess_paragraph($_);
+}
+
diff --git a/contrib/perl5/lib/SelfLoader.pm b/contrib/perl5/lib/SelfLoader.pm
index 311d953..99372f2 100644
--- a/contrib/perl5/lib/SelfLoader.pm
+++ b/contrib/perl5/lib/SelfLoader.pm
@@ -1,14 +1,22 @@
package SelfLoader;
-use Carp;
+# use Carp;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(AUTOLOAD);
-$VERSION = "1.08";
+$VERSION = "1.0901";
sub Version {$VERSION}
$DEBUG = 0;
my %Cache; # private cache for all SelfLoader's client packages
+# allow checking for valid ': attrlist' attachments
+my $nested;
+$nested = qr{ \( (?: (?> [^()]+ ) | (??{ $nested }) )* \) }x;
+my $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
+my $attr_list = qr{ \s* : \s* (?: $one_attr )* }x;
+
+sub croak { require Carp; goto &Carp::croak }
+
AUTOLOAD {
print STDERR "SelfLoader::AUTOLOAD for $AUTOLOAD\n" if $DEBUG;
my $SL_code = $Cache{$AUTOLOAD};
@@ -48,7 +56,7 @@ sub _load_stubs {
local($/) = "\n";
while(defined($line = <$fh>) and $line !~ m/^__END__/) {
- if ($line =~ m/^sub\s+([\w:]+)\s*(\([\\\$\@\%\&\*\;]*\))?/) {
+ if ($line =~ m/^sub\s+([\w:]+)\s*((?:\([\\\$\@\%\&\*\;]*\))?(?:$attr_list)?)/) {
push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype));
$protoype = $2;
@lines = ($line);
@@ -92,7 +100,8 @@ sub _load_stubs {
sub _add_to_cache {
my($self,$fullname,$pack,$lines, $protoype) = @_;
return () unless $fullname;
- carp("Redefining sub $fullname") if exists $Cache{$fullname};
+ (require Carp), Carp::carp("Redefining sub $fullname")
+ if exists $Cache{$fullname};
$Cache{$fullname} = join('', "package $pack; ",@$lines);
print STDERR "SelfLoader cached $fullname: $Cache{$fullname}" if $DEBUG;
# return stub to be eval'd
@@ -112,9 +121,9 @@ SelfLoader - load functions only on demand
package FOOBAR;
use SelfLoader;
-
+
... (initializing code)
-
+
__DATA__
sub {....
diff --git a/contrib/perl5/lib/Shell.pm b/contrib/perl5/lib/Shell.pm
index f4ef431..62aa829 100644
--- a/contrib/perl5/lib/Shell.pm
+++ b/contrib/perl5/lib/Shell.pm
@@ -1,6 +1,8 @@
package Shell;
+use 5.005_64;
+our($capture_stderr, $VERSION);
-use Config;
+$VERSION = '0.2';
sub import {
my $self = shift;
@@ -20,12 +22,12 @@ sub import {
AUTOLOAD {
my $cmd = $AUTOLOAD;
$cmd =~ s/^.*:://;
- eval qq {
- *$AUTOLOAD = sub {
+ eval <<"*END*";
+ sub $AUTOLOAD {
if (\@_ < 1) {
- `$cmd`;
+ \$Shell::capture_stderr ? `$cmd 2>&1` : `$cmd`;
}
- elsif (\$Config{'archname'} eq 'os2') {
+ elsif ('$^O' eq 'os2') {
local(\*SAVEOUT, \*READ, \*WRITE);
open SAVEOUT, '>&STDOUT' or die;
@@ -33,8 +35,8 @@ AUTOLOAD {
open STDOUT, '>&WRITE' or die;
close WRITE;
- my \$pid = system(1, \$cmd, \@_);
- die "Can't execute $cmd: \$!\n" if \$pid < 0;
+ my \$pid = system(1, '$cmd', \@_);
+ die "Can't execute $cmd: \$!\\n" if \$pid < 0;
open STDOUT, '>&SAVEOUT' or die;
close SAVEOUT;
@@ -54,9 +56,34 @@ AUTOLOAD {
}
}
else {
- open(SUBPROC, "-|")
- or exec '$cmd', \@_
- or die "Can't exec $cmd: \$!\n";
+ my \$a;
+ my \@arr = \@_;
+ if ('$^O' eq 'MSWin32') {
+ # XXX this special-casing should not be needed
+ # if we do quoting right on Windows. :-(
+ #
+ # First, escape all quotes. Cover the case where we
+ # want to pass along a quote preceded by a backslash
+ # (i.e., C<"param \\""" end">).
+ # Ugly, yup? You know, windoze.
+ # Enclose in quotes only the parameters that need it:
+ # try this: c:\> dir "/w"
+ # and this: c:\> dir /w
+ for (\@arr) {
+ s/"/\\\\"/g;
+ s/\\\\\\\\"/\\\\\\\\"""/g;
+ \$_ = qq["\$_"] if /\\s/;
+ }
+ }
+ else {
+ for (\@arr) {
+ s/(['\\\\])/\\\\\$1/g;
+ \$_ = "'\$_'";
+ }
+ }
+ push \@arr, '2>&1' if \$Shell::capture_stderr;
+ open(SUBPROC, join(' ', '$cmd', \@arr, '|'))
+ or die "Can't exec $cmd: \$!\\n";
if (wantarray) {
my \@ret = <SUBPROC>;
close SUBPROC; # XXX Oughta use a destructor.
@@ -70,7 +97,9 @@ AUTOLOAD {
}
}
}
- };
+*END*
+
+ die "$@\n" if $@;
goto &$AUTOLOAD;
}
@@ -119,8 +148,17 @@ usage should be
Larry
+If you set $Shell::capture_stderr to 1, the module will attempt to
+capture the STDERR of the process as well.
+
+The module now should work on Win32.
+
+ Jenda
+
=head1 AUTHOR
Larry Wall
+Changes by Jenda@Krynicky.cz and Dave Cottle <d.cottle@csc.canterbury.ac.nz>
+
=cut
diff --git a/contrib/perl5/lib/Term/ANSIColor.pm b/contrib/perl5/lib/Term/ANSIColor.pm
new file mode 100644
index 0000000..e7a2157
--- /dev/null
+++ b/contrib/perl5/lib/Term/ANSIColor.pm
@@ -0,0 +1,307 @@
+# Term::ANSIColor -- Color screen output using ANSI escape sequences.
+# $Id: ANSIColor.pm,v 1.1 1997/12/10 20:05:29 eagle Exp $
+#
+# Copyright 1996, 1997 by Russ Allbery <rra@stanford.edu>
+# and Zenin <zenin@best.com>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Term::ANSIColor;
+require 5.001;
+
+use strict;
+use vars qw(@ISA @EXPORT %EXPORT_TAGS $VERSION $AUTOLOAD %attributes
+ $AUTORESET $EACHLINE);
+
+use Exporter ();
+@ISA = qw(Exporter);
+@EXPORT = qw(color colored);
+%EXPORT_TAGS = (constants => [qw(CLEAR RESET BOLD UNDERLINE UNDERSCORE BLINK
+ REVERSE CONCEALED BLACK RED GREEN YELLOW
+ BLUE MAGENTA CYAN WHITE ON_BLACK ON_RED
+ ON_GREEN ON_YELLOW ON_BLUE ON_MAGENTA
+ ON_CYAN ON_WHITE)]);
+Exporter::export_ok_tags ('constants');
+
+($VERSION = (split (' ', q$Revision: 1.1 $ ))[1]) =~ s/\.(\d)$/.0$1/;
+
+
+############################################################################
+# Internal data structures
+############################################################################
+
+%attributes = ('clear' => 0,
+ 'reset' => 0,
+ 'bold' => 1,
+ 'underline' => 4,
+ 'underscore' => 4,
+ 'blink' => 5,
+ 'reverse' => 7,
+ 'concealed' => 8,
+
+ 'black' => 30, 'on_black' => 40,
+ 'red' => 31, 'on_red' => 41,
+ 'green' => 32, 'on_green' => 42,
+ 'yellow' => 33, 'on_yellow' => 43,
+ 'blue' => 34, 'on_blue' => 44,
+ 'magenta' => 35, 'on_magenta' => 45,
+ 'cyan' => 36, 'on_cyan' => 46,
+ 'white' => 37, 'on_white' => 47);
+
+
+############################################################################
+# Implementation (constant form)
+############################################################################
+
+# Time to have fun! We now want to define the constant subs, which are
+# named the same as the attributes above but in all caps. Each constant sub
+# needs to act differently depending on whether $AUTORESET is set. Without
+# autoreset:
+#
+# BLUE "text\n" ==> "\e[34mtext\n"
+#
+# If $AUTORESET is set, we should instead get:
+#
+# BLUE "text\n" ==> "\e[34mtext\n\e[0m"
+#
+# The sub also needs to handle the case where it has no arguments correctly.
+# Maintaining all of this as separate subs would be a major nightmare, as
+# well as duplicate the %attributes hash, so instead we define an AUTOLOAD
+# sub to define the constant subs on demand. To do that, we check the name
+# of the called sub against the list of attributes, and if it's an all-caps
+# version of one of them, we define the sub on the fly and then run it.
+sub AUTOLOAD {
+ my $sub;
+ ($sub = $AUTOLOAD) =~ s/^.*:://;
+ my $attr = $attributes{lc $sub};
+ if ($sub =~ /^[A-Z_]+$/ && defined $attr) {
+ $attr = "\e[" . $attr . 'm';
+ eval qq {
+ sub $AUTOLOAD {
+ if (\$AUTORESET && \@_) {
+ '$attr' . "\@_" . "\e[0m";
+ } else {
+ ('$attr' . "\@_");
+ }
+ }
+ };
+ goto &$AUTOLOAD;
+ } else {
+ die "undefined subroutine &$AUTOLOAD called";
+ }
+}
+
+
+############################################################################
+# Implementation (attribute string form)
+############################################################################
+
+# Return the escape code for a given set of color attributes.
+sub color {
+ my @codes = map { split } @_;
+ my $attribute = '';
+ foreach (@codes) {
+ $_ = lc $_;
+ unless (defined $attributes{$_}) {
+ require Carp;
+ Carp::croak ("Invalid attribute name $_");
+ }
+ $attribute .= $attributes{$_} . ';';
+ }
+ chop $attribute;
+ ($attribute ne '') ? "\e[${attribute}m" : undef;
+}
+
+# Given a string and a set of attributes, returns the string surrounded by
+# escape codes to set those attributes and then clear them at the end of the
+# string. If $EACHLINE is set, insert a reset before each occurrence of the
+# string $EACHLINE and the starting attribute code after the string
+# $EACHLINE, so that no attribute crosses line delimiters (this is often
+# desirable if the output is to be piped to a pager or some other program).
+sub colored {
+ my $string = shift;
+ if (defined $EACHLINE) {
+ my $attr = color (@_);
+ join '',
+ map { $_ && $_ ne $EACHLINE ? $attr . $_ . "\e[0m" : $_ }
+ split (/(\Q$EACHLINE\E)/, $string);
+ } else {
+ color (@_) . $string . "\e[0m";
+ }
+}
+
+
+############################################################################
+# Module return value and documentation
+############################################################################
+
+# Ensure we evaluate to true.
+1;
+__END__
+
+=head1 NAME
+
+Term::ANSIColor - Color screen output using ANSI escape sequences
+
+=head1 SYNOPSIS
+
+ use Term::ANSIColor;
+ print color 'bold blue';
+ print "This text is bold blue.\n";
+ print color 'reset';
+ print "This text is normal.\n";
+ print colored ("Yellow on magenta.\n", 'yellow on_magenta');
+ print "This text is normal.\n";
+
+ use Term::ANSIColor qw(:constants);
+ print BOLD, BLUE, "This text is in bold blue.\n", RESET;
+
+ use Term::ANSIColor qw(:constants);
+ $Term::ANSIColor::AUTORESET = 1;
+ print BOLD BLUE "This text is in bold blue.\n";
+ print "This text is normal.\n";
+
+=head1 DESCRIPTION
+
+This module has two interfaces, one through color() and colored() and the
+other through constants.
+
+color() takes any number of strings as arguments and considers them to be
+space-separated lists of attributes. It then forms and returns the escape
+sequence to set those attributes. It doesn't print it out, just returns
+it, so you'll have to print it yourself if you want to (this is so that
+you can save it as a string, pass it to something else, send it to a file
+handle, or do anything else with it that you might care to).
+
+The recognized attributes (all of which should be fairly intuitive) are
+clear, reset, bold, underline, underscore, blink, reverse, concealed,
+black, red, green, yellow, blue, magenta, on_black, on_red, on_green,
+on_yellow, on_blue, on_magenta, on_cyan, and on_white. Case is not
+significant. Underline and underscore are equivalent, as are clear and
+reset, so use whichever is the most intuitive to you. The color alone
+sets the foreground color, and on_color sets the background color.
+
+Note that attributes, once set, last until they are unset (by sending the
+attribute "reset"). Be careful to do this, or otherwise your attribute will
+last after your script is done running, and people get very annoyed at
+having their prompt and typing changed to weird colors.
+
+As an aid to help with this, colored() takes a scalar as the first
+argument and any number of attribute strings as the second argument and
+returns the scalar wrapped in escape codes so that the attributes will be
+set as requested before the string and reset to normal after the string.
+Normally, colored() just puts attribute codes at the beginning and end of
+the string, but if you set $Term::ANSIColor::EACHLINE to some string,
+that string will be considered the line delimiter and the attribute will
+be set at the beginning of each line of the passed string and reset at the
+end of each line. This is often desirable if the output is being sent to
+a program like a pager that can be confused by attributes that span lines.
+Normally you'll want to set $Term::ANSIColor::EACHLINE to C<"\n"> to use
+this feature.
+
+Alternately, if you import C<:constants>, you can use the constants CLEAR,
+RESET, BOLD, UNDERLINE, UNDERSCORE, BLINK, REVERSE, CONCEALED, BLACK, RED,
+GREEN, YELLOW, BLUE, MAGENTA, ON_BLACK, ON_RED, ON_GREEN, ON_YELLOW,
+ON_BLUE, ON_MAGENTA, ON_CYAN, and ON_WHITE directly. These are the same
+as color('attribute') and can be used if you prefer typing:
+
+ print BOLD BLUE ON_WHITE "Text\n", RESET;
+
+to
+
+ print colored ("Text\n", 'bold blue on_white');
+
+When using the constants, if you don't want to have to remember to add the
+C<, RESET> at the end of each print line, you can set
+$Term::ANSIColor::AUTORESET to a true value. Then, the display mode will
+automatically be reset if there is no comma after the constant. In other
+words, with that variable set:
+
+ print BOLD BLUE "Text\n";
+
+will reset the display mode afterwards, whereas:
+
+ print BOLD, BLUE, "Text\n";
+
+will not.
+
+The subroutine interface has the advantage over the constants interface in
+that only 2 soubrutines are exported into your namespace, verses 22 in the
+constants interface. On the flip side, the constants interface has the
+advantage of better compile time error checking, since misspelled names of
+colors or attributes in calls to color() and colored() won't be caught
+until runtime whereas misspelled names of constants will be caught at
+compile time. So, polute your namespace with almost two dozen subrutines
+that you may not even use that oftin, or risk a silly bug by mistyping an
+attribute. Your choice, TMTOWTDI after all.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Invalid attribute name %s
+
+You passed an invalid attribute name to either color() or colored().
+
+=item Identifier %s used only once: possible typo
+
+You probably mistyped a constant color name such as:
+
+ print FOOBAR "This text is color FOOBAR\n";
+
+It's probably better to always use commas after constant names in order to
+force the next error.
+
+=item No comma allowed after filehandle
+
+You probably mistyped a constant color name such as:
+
+ print FOOBAR, "This text is color FOOBAR\n";
+
+Generating this fatal compile error is one of the main advantages of using
+the constants interface, since you'll immediately know if you mistype a
+color name.
+
+=item Bareword %s not allowed while "strict subs" in use
+
+You probably mistyped a constant color name such as:
+
+ $Foobar = FOOBAR . "This line should be blue\n";
+
+or:
+
+ @Foobar = FOOBAR, "This line should be blue\n";
+
+This will only show up under use strict (another good reason to run under
+use strict).
+
+=back
+
+=head1 RESTRICTIONS
+
+It would be nice if one could leave off the commas around the constants
+entirely and just say:
+
+ print BOLD BLUE ON_WHITE "Text\n" RESET;
+
+but the syntax of Perl doesn't allow this. You need a comma after the
+string. (Of course, you may consider it a bug that commas between all the
+constants aren't required, in which case you may feel free to insert
+commas unless you're using $Term::ANSIColor::AUTORESET.)
+
+For easier debuging, you may prefer to always use the commas when not
+setting $Term::ANSIColor::AUTORESET so that you'll get a fatal compile
+error rather than a warning.
+
+=head1 AUTHORS
+
+Original idea (using constants) by Zenin (zenin@best.com), reimplemented
+using subs by Russ Allbery (rra@stanford.edu), and then combined with the
+original idea by Russ with input from Zenin.
+
+=cut
diff --git a/contrib/perl5/lib/Term/Cap.pm b/contrib/perl5/lib/Term/Cap.pm
index 1e95ec3..0954000 100644
--- a/contrib/perl5/lib/Term/Cap.pm
+++ b/contrib/perl5/lib/Term/Cap.pm
@@ -107,8 +107,8 @@ sub termcap_path { ## private
push(@termcap_path, $ENV{TERMCAP})
if ((exists $ENV{TERMCAP}) &&
(($^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'dos')
- ? $ENV{TERMCAP} =~ /^[a-z]:[\\\/]/i
- : $ENV{TERMCAP} =~ /^\//));
+ ? $ENV{TERMCAP} =~ /^[a-z]:[\\\/]/is
+ : $ENV{TERMCAP} =~ /^\//s));
if ((exists $ENV{TERMPATH}) && ($ENV{TERMPATH})) {
# Add the users $TERMPATH
push(@termcap_path, split(/(:|\s+)/, $ENV{TERMPATH}))
@@ -157,7 +157,7 @@ sub Tgetent { ## public -- static method
my $foo = (exists $ENV{TERMCAP} ? $ENV{TERMCAP} : '');
# $entry is the extracted termcap entry
- if (($foo !~ m:^/:) && ($foo =~ m/(^|\|)${termpat}[:|]/)) {
+ if (($foo !~ m:^/:s) && ($foo =~ m/(^|\|)${termpat}[:|]/s)) {
$entry = $foo;
}
diff --git a/contrib/perl5/lib/Term/ReadLine.pm b/contrib/perl5/lib/Term/ReadLine.pm
index e7cf00c..8bb8205 100644
--- a/contrib/perl5/lib/Term/ReadLine.pm
+++ b/contrib/perl5/lib/Term/ReadLine.pm
@@ -193,7 +193,7 @@ sub findConsole {
$console = "sys\$command";
}
- if (($^O eq 'amigaos') || ($^O eq 'beos')) {
+ if (($^O eq 'amigaos') || ($^O eq 'beos') || ($^O eq 'epoc')) {
$console = undef;
}
elsif ($^O eq 'os2') {
diff --git a/contrib/perl5/lib/Test.pm b/contrib/perl5/lib/Test.pm
index 7a0e59b..c708f57 100644
--- a/contrib/perl5/lib/Test.pm
+++ b/contrib/perl5/lib/Test.pm
@@ -1,10 +1,11 @@
use strict;
package Test;
+use 5.005_64;
use Test::Harness 1.1601 ();
use Carp;
-use vars (qw($VERSION @ISA @EXPORT @EXPORT_OK $ntest $TestLevel), #public-ish
- qw($TESTOUT $ONFAIL %todo %history $planned @FAILDETAIL)); #private-ish
-$VERSION = '1.122';
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $ntest, $TestLevel); #public-ish
+our($TESTOUT, $ONFAIL, %todo, %history, $planned, @FAILDETAIL); #private-ish
+$VERSION = '1.13';
require Exporter;
@ISA=('Exporter');
@EXPORT=qw(&plan &ok &skip);
@@ -63,7 +64,11 @@ sub ok ($;$$) {
} else {
$expected = to_value(shift);
my ($regex,$ignore);
- if ((ref($expected)||'') eq 'Regexp') {
+ if (!defined $expected) {
+ $ok = !defined $result;
+ } elsif (!defined $result) {
+ $ok = 0;
+ } elsif ((ref($expected)||'') eq 'Regexp') {
$ok = $result =~ /$expected/;
} elsif (($regex) = ($expected =~ m,^ / (.+) / $,sx) or
($ignore, $regex) = ($expected =~ m,^ m([^\w\s]) (.+) \1 $,sx)) {
@@ -94,7 +99,8 @@ sub ok ($;$$) {
}
} else {
my $prefix = "Test $ntest";
- print $TESTOUT "# $prefix got: '$result' ($context)\n";
+ print $TESTOUT "# $prefix got: ".
+ (defined $result? "'$result'":'<UNDEF>')." ($context)\n";
$prefix = ' ' x (length($prefix) - 5);
if ((ref($expected)||'') eq 'Regexp') {
$expected = 'qr/'.$expected.'/'
@@ -220,7 +226,7 @@ triggered at the end of a test run. C<onfail> is passed an array ref
of hash refs that describe each test failure. Each hash will contain
at least the following fields: C<package>, C<repetition>, and
C<result>. (The file, line, and test number are not included because
-their correspondance to a particular test is tenuous.) If the test
+their correspondence to a particular test is tenuous.) If the test
had an expected value or a diagnostic string, these will also be
included.
@@ -239,7 +245,7 @@ L<Test::Harness> and, perhaps, test coverage analysis tools.
=head1 AUTHOR
-Copyright (c) 1998 Joshua Nathaniel Pritikin. All rights reserved.
+Copyright (c) 1998-1999 Joshua Nathaniel Pritikin. All rights reserved.
This package is free software and is provided "as is" without express
or implied warranty. It may be used, redistributed and/or modified
diff --git a/contrib/perl5/lib/Test/Harness.pm b/contrib/perl5/lib/Test/Harness.pm
index 935e8f0..9902741 100644
--- a/contrib/perl5/lib/Test/Harness.pm
+++ b/contrib/perl5/lib/Test/Harness.pm
@@ -1,17 +1,19 @@
package Test::Harness;
-BEGIN {require 5.002;}
+use 5.005_64;
use Exporter;
use Benchmark;
use Config;
use FileHandle;
use strict;
-use vars qw($VERSION $verbose $switches $have_devel_corestack $curtest
- @ISA @EXPORT @EXPORT_OK);
+our($VERSION, $verbose, $switches, $have_devel_corestack, $curtest,
+ @ISA, @EXPORT, @EXPORT_OK);
$have_devel_corestack = 0;
-$VERSION = "1.1602";
+$VERSION = "1.1604";
+
+$ENV{HARNESS_ACTIVE} = 1;
# Some experimental versions of OS/2 build have broken $?
my $ignore_exitcode = $ENV{HARNESS_IGNORE_EXITCODE};
@@ -62,26 +64,46 @@ sub runtests {
# pass -I flags to children
my $old5lib = $ENV{PERL5LIB};
- local($ENV{'PERL5LIB'}) = join($Config{path_sep}, @INC);
- if ($^O eq 'VMS') { $switches =~ s/-(\S*[A-Z]\S*)/"-$1"/g }
+ # VMS has a 255-byte limit on the length of %ENV entries, so
+ # toss the ones that involve perl_root, the install location
+ # for VMS
+ my $new5lib;
+ if ($^O eq 'VMS') {
+ $new5lib = join($Config{path_sep}, grep {!/perl_root/i;} @INC);
+ $switches =~ s/-(\S*[A-Z]\S*)/"-$1"/g;
+ }
+ else {
+ $new5lib = join($Config{path_sep}, @INC);
+ }
+
+ local($ENV{'PERL5LIB'}) = $new5lib;
my @dir_files = globdir $files_in_dir if defined $files_in_dir;
my $t_start = new Benchmark;
while ($test = shift(@tests)) {
$te = $test;
chop($te);
- if ($^O eq 'VMS') { $te =~ s/^.*\.t\./[.t./; }
- print "$te" . '.' x (20 - length($te));
+ if ($^O eq 'VMS') { $te =~ s/^.*\.t\./[.t./s; }
+ my $blank = (' ' x 77);
+ my $leader = "$te" . '.' x (20 - length($te));
+ my $ml = "";
+ $ml = "\r$blank\r$leader"
+ if -t STDOUT and not $ENV{HARNESS_NOTTY} and not $verbose;
+ print $leader;
my $fh = new FileHandle;
$fh->open($test) or print "can't open $test. $!\n";
my $first = <$fh>;
my $s = $switches;
- $s .= q[ "-T"] if $first =~ /^#!.*\bperl.*-\w*T/;
+ $s .= " $ENV{'HARNESS_PERL_SWITCHES'}"
+ if exists $ENV{'HARNESS_PERL_SWITCHES'};
+ $s .= join " ", q[ "-T"], map {qq["-I$_"]} @INC
+ if $first =~ /^#!.*\bperl.*-\w*T/;
$fh->close or print "can't close $test. $!\n";
- my $cmd = ($ENV{'COMPILE_TEST'})?
-"./perl -I../lib ../utils/perlcc $test -run -verbose dcf -log ./compilelog |"
- : "$^X $s $test|";
+ my $cmd = ($ENV{'HARNESS_COMPILE_TEST'})
+ ? "./perl -I../lib ../utils/perlcc $test "
+ . "-run 2>> ./compilelog |"
+ : "$^X $s $test|";
$cmd = "MCR $cmd" if $^O eq 'VMS';
$fh->open($cmd) or print "can't run $test. $!\n";
$ok = $next = $max = 0;
@@ -89,6 +111,7 @@ sub runtests {
my %todo = ();
my $bonus = 0;
my $skipped = 0;
+ my $skip_reason;
while (<$fh>) {
if( $verbose ){
print $_;
@@ -99,26 +122,39 @@ sub runtests {
$totmax += $max;
$files++;
$next = 1;
- } elsif (/^1\.\.([0-9]+)/) {
+ } elsif (/^1\.\.([0-9]+)(\s*\#\s*[Ss]kip\S*(?>\s+)(.+))?/) {
$max = $1;
$totmax += $max;
$files++;
$next = 1;
+ $skip_reason = $3 if not $max and defined $3;
} elsif ($max && /^(not\s+)?ok\b/) {
my $this = $next;
if (/^not ok\s*(\d*)/){
$this = $1 if $1 > 0;
+ print "${ml}NOK $this" if $ml;
if (!$todo{$this}) {
push @failed, $this;
} else {
$ok++;
$totok++;
}
- } elsif (/^ok\s*(\d*)(\s*\#\s*[Ss]kip)?/) {
+ } elsif (/^ok\s*(\d*)(\s*\#\s*[Ss]kip\S*(?:(?>\s+)(.+))?)?/) {
$this = $1 if $1 > 0;
+ print "${ml}ok $this/$max" if $ml;
$ok++;
$totok++;
$skipped++ if defined $2;
+ my $reason;
+ $reason = 'unknown reason' if defined $2;
+ $reason = $3 if defined $3;
+ if (defined $reason and defined $skip_reason) {
+ # print "was: '$skip_reason' new '$reason'\n";
+ $skip_reason = 'various reasons'
+ if $skip_reason ne $reason;
+ } elsif (defined $reason) {
+ $skip_reason = $reason;
+ }
$bonus++, $totbonus++ if $todo{$this};
}
if ($this > $next) {
@@ -141,7 +177,7 @@ sub runtests {
: $wstatus >> 8);
if ($wstatus) {
my ($failed, $canon, $percent) = ('??', '??');
- printf "dubious\n\tTest returned status $estatus (wstat %d, 0x%x)\n",
+ printf "${ml}dubious\n\tTest returned status $estatus (wstat %d, 0x%x)\n",
$wstatus,$wstatus;
print "\t\t(VMS status is $estatus)\n" if $^O eq 'VMS';
if (corestatus($wstatus)) { # until we have a wait module
@@ -173,16 +209,18 @@ sub runtests {
} elsif ($ok == $max && $next == $max+1) {
if ($max and $skipped + $bonus) {
my @msg;
- push(@msg, "$skipped/$max subtest".($skipped>1?'s':'')." skipped")
+ push(@msg, "$skipped/$max skipped: $skip_reason")
if $skipped;
- push(@msg, "$bonus subtest".($bonus>1?'s':'').
- " unexpectedly succeeded")
+ push(@msg, "$bonus/$max unexpectedly succeeded")
if $bonus;
- print "ok, ".join(', ', @msg)."\n";
+ print "${ml}ok, ".join(', ', @msg)."\n";
} elsif ($max) {
- print "ok\n";
+ print "${ml}ok\n";
+ } elsif (defined $skip_reason) {
+ print "skipped: $skip_reason\n";
+ $tests_skipped++;
} else {
- print "skipping test on this platform\n";
+ print "skipped test on this platform\n";
$tests_skipped++;
}
$good++;
@@ -243,14 +281,17 @@ sub runtests {
" UNEXPECTEDLY SUCCEEDED)")
if $totbonus;
if ($tests_skipped) {
- $bonusmsg .= ", $tests_skipped test" . ($tests_skipped != 1 ? 's' : '') .
- ' skipped';
+ $bonusmsg .= ", $tests_skipped test" . ($tests_skipped != 1 ? 's' : '');
+ if ($subtests_skipped) {
+ $bonusmsg .= " and $subtests_skipped subtest"
+ . ($subtests_skipped != 1 ? 's' : '');
+ }
+ $bonusmsg .= ' skipped';
}
- if ($subtests_skipped) {
- $bonusmsg .= ($tests_skipped ? ', plus ' : ', ').
- "$subtests_skipped subtest"
- . ($subtests_skipped != 1 ? 's' : '') .
- " skipped";
+ elsif ($subtests_skipped) {
+ $bonusmsg .= ", $subtests_skipped subtest"
+ . ($subtests_skipped != 1 ? 's' : '')
+ . " skipped";
}
if ($bad == 0 && $totmax) {
print "All tests successful$bonusmsg.\n";
@@ -274,7 +315,7 @@ sub runtests {
die "Failed $bad/$total test scripts, $pct% okay.$subpct\n";
}
}
- printf("Files=%d, Tests=%d, %s\n", $files, $totmax, timestr($t_total, 'nop'));
+ printf("Files=%d, Tests=%d, %s\n", $files, $totmax, timestr($t_total, 'nop'));
return ($bad == 0 && $totmax) ;
}
@@ -408,6 +449,12 @@ variations in spacing and case) after C<ok> or C<ok NUMBER>, it is
counted as a skipped test. If the whole testscript succeeds, the
count of skipped tests is included in the generated output.
+C<Test::Harness> reports the text after C< # Skip(whatever)> as a
+reason for skipping. Similarly, one can include a similar explanation
+in a C<1..0> line emitted if the test is skipped completely:
+
+ 1..0 # Skipped: no leverage found
+
=head1 EXPORT
C<&runtests> is exported by Test::Harness per default.
@@ -445,6 +492,15 @@ above messages.
Setting C<HARNESS_IGNORE_EXITCODE> makes harness ignore the exit status
of child processes.
+Setting C<HARNESS_NOTTY> to a true value forces it to behave as though
+STDOUT were not a console. You may need to set this if you don't want
+harness to output more frequent progress messages using carriage returns.
+Some consoles may not handle carriage returns properly (which results
+in a somewhat messy output).
+
+Setting C<HARNESS_COMPILE_TEST> to a true value will make harness attempt
+to compile the test using C<perlcc> before running it.
+
If C<HARNESS_FILELEAK_IN_DIR> is set to the name of a directory, harness
will check after each test whether new files appeared in that directory,
and report them as
@@ -455,6 +511,15 @@ If relative, directory name is with respect to the current directory at
the moment runtests() was called. Putting absolute path into
C<HARNESS_FILELEAK_IN_DIR> may give more predicatable results.
+The value of C<HARNESS_PERL_SWITCHES> will be prepended to the
+switches used to invoke perl on each test. For example, setting
+C<HARNESS_PERL_SWITCHES> to "-W" will run all tests with all
+warnings enabled.
+
+Harness sets C<HARNESS_ACTIVE> before executing the individual tests.
+This allows the tests to determine if they are being executed through the
+harness or by any other means.
+
=head1 SEE ALSO
L<Test> for writing test scripts and also L<Benchmark> for the
diff --git a/contrib/perl5/lib/Text/Abbrev.pm b/contrib/perl5/lib/Text/Abbrev.pm
index ae6797c..d4f12d0 100644
--- a/contrib/perl5/lib/Text/Abbrev.pm
+++ b/contrib/perl5/lib/Text/Abbrev.pm
@@ -1,5 +1,5 @@
package Text::Abbrev;
-require 5.000;
+require 5.005; # Probably works on earlier versions too.
require Exporter;
=head1 NAME
@@ -15,7 +15,7 @@ abbrev - create an abbreviation table from a list
=head1 DESCRIPTION
Stores all unambiguous truncations of each element of LIST
-as keys key in the associative array referenced to by C<$hashref>.
+as keys in the associative array referenced by C<$hashref>.
The values are the original list elements.
=head1 EXAMPLE
@@ -34,54 +34,48 @@ The values are the original list elements.
@EXPORT = qw(abbrev);
# Usage:
-# &abbrev(*foo,LIST);
+# abbrev \%foo, LIST;
# ...
# $long = $foo{$short};
sub abbrev {
- my (%domain);
- my ($name, $ref, $glob);
+ my ($word, $hashref, $glob, %table, $returnvoid);
if (ref($_[0])) { # hash reference preferably
- $ref = shift;
- } elsif ($_[0] =~ /^\*/) { # looks like a glob (deprecated)
- $glob = shift;
- }
- my @cmp = @_;
-
- foreach $name (@_) {
- my @extra = split(//,$name);
- my $abbrev = shift(@extra);
- my $len = 1;
- my $cmp;
- WORD: foreach $cmp (@cmp) {
- next if $cmp eq $name;
- while (substr($cmp,0,$len) eq $abbrev) {
- last WORD unless @extra;
- $abbrev .= shift(@extra);
- ++$len;
+ $hashref = shift;
+ $returnvoid = 1;
+ } elsif (ref \$_[0] eq 'GLOB') { # is actually a glob (deprecated)
+ $hashref = \%{shift()};
+ $returnvoid = 1;
+ }
+ %{$hashref} = ();
+
+ WORD: foreach $word (@_) {
+ for (my $len = (length $word) - 1; $len > 0; --$len) {
+ my $abbrev = substr($word,0,$len);
+ my $seen = ++$table{$abbrev};
+ if ($seen == 1) { # We're the first word so far to have
+ # this abbreviation.
+ $hashref->{$abbrev} = $word;
+ } elsif ($seen == 2) { # We're the second word to have this
+ # abbreviation, so we can't use it.
+ delete $hashref->{$abbrev};
+ } else { # We're the third word to have this
+ # abbreviation, so skip to the next word.
+ next WORD;
}
}
- $domain{$abbrev} = $name;
- while (@extra) {
- $abbrev .= shift(@extra);
- $domain{$abbrev} = $name;
- }
}
- if ($ref) {
- %$ref = %domain;
- return;
- } elsif ($glob) { # old style
- local (*hash) = $glob;
- %hash = %domain;
- return;
+ # Non-abbreviations always get entered, even if they aren't unique
+ foreach $word (@_) {
+ $hashref->{$word} = $word;
}
+ return if $returnvoid;
if (wantarray) {
- %domain;
+ %{$hashref};
} else {
- \%domain;
+ $hashref;
}
}
1;
-
diff --git a/contrib/perl5/lib/Text/ParseWords.pm b/contrib/perl5/lib/Text/ParseWords.pm
index 065c2f7..2a6afc3 100644
--- a/contrib/perl5/lib/Text/ParseWords.pm
+++ b/contrib/perl5/lib/Text/ParseWords.pm
@@ -1,7 +1,7 @@
package Text::ParseWords;
use vars qw($VERSION @ISA @EXPORT $PERL_SINGLE_QUOTE);
-$VERSION = "3.1";
+$VERSION = "3.2";
require 5.000;
@@ -49,7 +49,7 @@ sub nested_quotewords {
sub parse_line {
# We will be testing undef strings
- local($^W) = 0;
+ no warnings;
my($delimiter, $keep, $line) = @_;
my($quote, $quoted, $unquoted, $delim, $word, @pieces);
diff --git a/contrib/perl5/lib/Text/Soundex.pm b/contrib/perl5/lib/Text/Soundex.pm
index ddc758c..3079b90 100644
--- a/contrib/perl5/lib/Text/Soundex.pm
+++ b/contrib/perl5/lib/Text/Soundex.pm
@@ -5,6 +5,8 @@ require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(&soundex $soundex_nocode);
+$VERSION = '1.0';
+
# $Id: soundex.pl,v 1.2 1994/03/24 00:30:27 mike Exp $
#
# Implementation of soundex algorithm as described by Knuth in volume
diff --git a/contrib/perl5/lib/Text/Tabs.pm b/contrib/perl5/lib/Text/Tabs.pm
index acd7afb..933f917 100644
--- a/contrib/perl5/lib/Text/Tabs.pm
+++ b/contrib/perl5/lib/Text/Tabs.pm
@@ -7,7 +7,7 @@ require Exporter;
@EXPORT = qw(expand unexpand $tabstop);
use vars qw($VERSION $tabstop $debug);
-$VERSION = 96.121201;
+$VERSION = 98.112801;
use strict;
@@ -18,7 +18,7 @@ BEGIN {
sub expand
{
- my @l = @_;
+ my (@l) = @_;
for $_ (@l) {
1 while s/(^|\n)([^\t\n]*)(\t+)/
$1. $2 . (" " x
@@ -32,7 +32,7 @@ sub expand
sub unexpand
{
- my @l = @_;
+ my (@l) = @_;
my @e;
my $x;
my $line;
@@ -73,11 +73,11 @@ Text::Tabs -- expand and unexpand tabs per the unix expand(1) and unexpand(1)
=head1 SYNOPSIS
-use Text::Tabs;
+ use Text::Tabs;
-$tabstop = 4;
-@lines_without_tabs = expand(@lines_with_tabs);
-@lines_with_tabs = unexpand(@lines_without_tabs);
+ $tabstop = 4;
+ @lines_without_tabs = expand(@lines_with_tabs);
+ @lines_with_tabs = unexpand(@lines_without_tabs);
=head1 DESCRIPTION
diff --git a/contrib/perl5/lib/Tie/Array.pm b/contrib/perl5/lib/Tie/Array.pm
index 3f34c3b..eb83aae 100644
--- a/contrib/perl5/lib/Tie/Array.pm
+++ b/contrib/perl5/lib/Tie/Array.pm
@@ -1,7 +1,9 @@
package Tie::Array;
-use vars qw($VERSION);
+
+use 5.005_64;
use strict;
-$VERSION = '1.00';
+use Carp;
+our $VERSION = '1.01';
# Pod documentation after __END__ below.
@@ -74,6 +76,16 @@ sub SPLICE
return @result;
}
+sub EXISTS {
+ my $pkg = ref $_[0];
+ croak "$pkg dosn't define an EXISTS method";
+}
+
+sub DELETE {
+ my $pkg = ref $_[0];
+ croak "$pkg dosn't define a DELETE method";
+}
+
package Tie::StdArray;
use vars qw(@ISA);
@ISA = 'Tie::Array';
@@ -88,6 +100,8 @@ sub POP { pop(@{$_[0]}) }
sub PUSH { my $o = shift; push(@$o,@_) }
sub SHIFT { shift(@{$_[0]}) }
sub UNSHIFT { my $o = shift; unshift(@$o,@_) }
+sub EXISTS { exists $_[0]->[$_[1]] }
+sub DELETE { delete $_[0]->[$_[1]] }
sub SPLICE
{
@@ -112,15 +126,17 @@ Tie::Array - base class for tied arrays
package NewArray;
use Tie::Array;
@ISA = ('Tie::Array');
-
+
# mandatory methods
sub TIEARRAY { ... }
sub FETCH { ... }
sub FETCHSIZE { ... }
-
+
sub STORE { ... } # mandatory if elements writeable
sub STORESIZE { ... } # mandatory if elements can be added/deleted
-
+ sub EXISTS { ... } # mandatory if exists() expected to work
+ sub DELETE { ... } # mandatory if delete() expected to work
+
# optional methods - for efficiency
sub CLEAR { ... }
sub PUSH { ... }
@@ -133,7 +149,7 @@ Tie::Array - base class for tied arrays
package NewStdArray;
use Tie::Array;
-
+
@ISA = ('Tie::StdArray');
# all methods provided by default
@@ -150,9 +166,11 @@ Tie::Array - base class for tied arrays
This module provides methods for array-tying classes. See
L<perltie> for a list of the functions required in order to tie an array
-to a package. The basic B<Tie::Array> package provides stub C<DELETE>
-and C<EXTEND> methods, and implementations of C<PUSH>, C<POP>, C<SHIFT>,
-C<UNSHIFT>, C<SPLICE> and C<CLEAR> in terms of basic C<FETCH>, C<STORE>,
+to a package. The basic B<Tie::Array> package provides stub C<DESTROY>,
+and C<EXTEND> methods that do nothing, stub C<DELETE> and C<EXISTS>
+methods that croak() if the delete() or exists() builtins are ever called
+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
@@ -203,6 +221,18 @@ deleted.
Informative call that array is likely to grow to have I<count> entries.
Can be used to optimize allocation. This method need do nothing.
+=item EXISTS this, key
+
+Verify that the element at index I<key> exists in the tied array I<this>.
+
+The B<Tie::Array> implementation is a stub that simply croaks.
+
+=item DELETE this, key
+
+Delete the element at index I<key> from the tied array I<this>.
+
+The B<Tie::Array> implementation is a stub that simply croaks.
+
=item CLEAR this
Clear (remove, delete, ...) all values from the tied array associated with
diff --git a/contrib/perl5/lib/Tie/Handle.pm b/contrib/perl5/lib/Tie/Handle.pm
index c755053..588ecea 100644
--- a/contrib/perl5/lib/Tie/Handle.pm
+++ b/contrib/perl5/lib/Tie/Handle.pm
@@ -1,22 +1,25 @@
package Tie::Handle;
+use 5.005_64;
+our $VERSION = '1.0';
+
=head1 NAME
-Tie::Handle - base class definitions for tied handles
+Tie::Handle, Tie::StdHandle - base class definitions for tied handles
=head1 SYNOPSIS
package NewHandle;
require Tie::Handle;
-
+
@ISA = (Tie::Handle);
-
+
sub READ { ... } # Provide a needed method
sub TIEHANDLE { ... } # Overrides inherited method
-
-
+
+
package main;
-
+
tie *FH, 'NewHandle';
=head1 DESCRIPTION
@@ -24,9 +27,7 @@ Tie::Handle - base class definitions for tied handles
This module provides some skeletal methods for handle-tying classes. See
L<perltie> for a list of the functions required in tying a handle to a package.
The basic B<Tie::Handle> package provides a C<new> method, as well as methods
-C<TIESCALAR>, C<FETCH> and C<STORE>. The C<new> method is provided as a means
-of grandfathering, for classes that forget to provide their own C<TIESCALAR>
-method.
+C<TIEHANDLE>, C<PRINT>, C<PRINTF> and C<GETC>.
For developers wishing to write their own tied-handle classes, the methods
are summarized below. The L<perltie> section not only documents these, but
@@ -65,6 +66,32 @@ Read a single line
Get a single character
+=item CLOSE this
+
+Close the handle
+
+=item OPEN this, filename
+
+(Re-)open the handle
+
+=item BINMODE this
+
+Specify content is binary
+
+=item EOF this
+
+Test for end of file.
+
+=item TELL this
+
+Return position in the file.
+
+=item SEEK this, offset, whence
+
+Position the file.
+
+Test for end of file.
+
=item DESTROY this
Free the storage associated with the tied handle referenced by I<this>.
@@ -81,6 +108,7 @@ The L<perltie> section contains an example of tying handles.
=cut
use Carp;
+use warnings::register;
sub new {
my $pkg = shift;
@@ -92,8 +120,8 @@ sub new {
sub TIEHANDLE {
my $pkg = shift;
if (defined &{"{$pkg}::new"}) {
- carp "WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"
- if $^W;
+ warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"
+ if warnings::enabled();
$pkg->new(@_);
}
else {
@@ -117,7 +145,7 @@ sub PRINTF {
my $self = shift;
if($self->can('WRITE') != \&WRITE) {
- my $buf = sprintf(@_);
+ my $buf = sprintf(shift,@_);
$self->WRITE($buf,length($buf),0);
}
else {
@@ -156,6 +184,43 @@ sub WRITE {
sub CLOSE {
my $pkg = ref $_[0];
croak "$pkg doesn't define a CLOSE method";
+}
+
+package Tie::StdHandle;
+our @ISA = 'Tie::Handle';
+use Carp;
+
+sub TIEHANDLE
+{
+ my $class = shift;
+ my $fh = do { \local *HANDLE};
+ bless $fh,$class;
+ $fh->OPEN(@_) if (@_);
+ return $fh;
+}
+
+sub EOF { eof($_[0]) }
+sub TELL { tell($_[0]) }
+sub FILENO { fileno($_[0]) }
+sub SEEK { seek($_[0],$_[1],$_[2]) }
+sub CLOSE { close($_[0]) }
+sub BINMODE { binmode($_[0]) }
+
+sub OPEN
+{
+ $_[0]->CLOSE if defined($_[0]->FILENO);
+ open($_[0],$_[1]);
+}
+
+sub READ { read($_[0],$_[1],$_[2]) }
+sub READLINE { my $fh = $_[0]; <$fh> }
+sub GETC { getc($_[0]) }
+
+sub WRITE
+{
+ my $fh = $_[0];
+ print $fh substr($_[1],0,$_[2])
}
+
1;
diff --git a/contrib/perl5/lib/Tie/Hash.pm b/contrib/perl5/lib/Tie/Hash.pm
index 2902efb..c6ec3d4 100644
--- a/contrib/perl5/lib/Tie/Hash.pm
+++ b/contrib/perl5/lib/Tie/Hash.pm
@@ -73,6 +73,8 @@ Return the next key for the hash.
Verify that I<key> exists with the tied hash I<this>.
+The B<Tie::Hash> implementation is a stub that simply croaks.
+
=item DELETE this, key
Delete the key I<key> from the tied hash I<this>.
@@ -100,6 +102,7 @@ good working examples.
=cut
use Carp;
+use warnings::register;
sub new {
my $pkg = shift;
@@ -111,8 +114,8 @@ sub new {
sub TIEHASH {
my $pkg = shift;
if (defined &{"${pkg}::new"}) {
- carp "WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing"
- if $^W;
+ warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing"
+ if warnings::enabled();
$pkg->new(@_);
}
else {
diff --git a/contrib/perl5/lib/Tie/RefHash.pm b/contrib/perl5/lib/Tie/RefHash.pm
index 66de257..ffa9eb2 100644
--- a/contrib/perl5/lib/Tie/RefHash.pm
+++ b/contrib/perl5/lib/Tie/RefHash.pm
@@ -39,11 +39,11 @@ see the C<tie> entry in perlfunc(1) and perltie(1) for more information.
=head1 AUTHOR
-Gurusamy Sarathy gsar@umich.edu
+Gurusamy Sarathy gsar@activestate.com
=head1 VERSION
-Version 1.2 15 Dec 1996
+Version 1.21 22 Jun 1999
=head1 SEE ALSO
@@ -94,7 +94,8 @@ sub EXISTS {
sub FIRSTKEY {
my $s = shift;
- my $a = scalar(keys %{$s->[0]}) + scalar(keys %{$s->[1]});
+ keys %{$s->[0]}; # reset iterator
+ keys %{$s->[1]}; # reset iterator
$s->[2] = 0;
$s->NEXTKEY;
}
diff --git a/contrib/perl5/lib/Tie/Scalar.pm b/contrib/perl5/lib/Tie/Scalar.pm
index ef27dc1..0c67590 100644
--- a/contrib/perl5/lib/Tie/Scalar.pm
+++ b/contrib/perl5/lib/Tie/Scalar.pm
@@ -8,24 +8,24 @@ Tie::Scalar, Tie::StdScalar - base class definitions for tied scalars
package NewScalar;
require Tie::Scalar;
-
+
@ISA = (Tie::Scalar);
-
+
sub FETCH { ... } # Provide a needed method
sub TIESCALAR { ... } # Overrides inherited method
-
-
+
+
package NewStdScalar;
require Tie::Scalar;
-
+
@ISA = (Tie::StdScalar);
-
+
# All methods provided by default, so define only what needs be overridden
sub FETCH { ... }
-
-
+
+
package main;
-
+
tie $new_scalar, 'NewScalar';
tie $new_std_scalar, 'NewStdScalar';
@@ -79,6 +79,7 @@ process IDs with priority.
=cut
use Carp;
+use warnings::register;
sub new {
my $pkg = shift;
@@ -90,8 +91,8 @@ sub new {
sub TIESCALAR {
my $pkg = shift;
if (defined &{"{$pkg}::new"}) {
- carp "WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing"
- if $^W;
+ warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing"
+ if warnings::enabled();
$pkg->new(@_);
}
else {
diff --git a/contrib/perl5/lib/Time/Local.pm b/contrib/perl5/lib/Time/Local.pm
index b2fba7c..a480884 100644
--- a/contrib/perl5/lib/Time/Local.pm
+++ b/contrib/perl5/lib/Time/Local.pm
@@ -3,60 +3,44 @@ require 5.000;
require Exporter;
use Carp;
-@ISA = qw(Exporter);
-@EXPORT = qw(timegm timelocal);
+@ISA = qw( Exporter );
+@EXPORT = qw( timegm timelocal );
+@EXPORT_OK = qw( timegm_nocheck timelocal_nocheck );
-=head1 NAME
-
-Time::Local - efficiently compute time from local and GMT time
-
-=head1 SYNOPSIS
-
- $time = timelocal($sec,$min,$hours,$mday,$mon,$year);
- $time = timegm($sec,$min,$hours,$mday,$mon,$year);
-
-=head1 DESCRIPTION
-
-These routines are quite efficient and yet are always guaranteed to
-agree with localtime() and gmtime(), the most notable points being
-that year is year-1900 and month is 0..11. We manage this by caching
-the start times of any months we've seen before. If we know the start
-time of the month, we can always calculate any time within the month.
-The start times themselves are guessed by successive approximation
-starting at the current time, since most dates seen in practice are
-close to the current date. Unlike algorithms that do a binary search
-(calling gmtime once for each bit of the time value, resulting in 32
-calls), this algorithm calls it at most 6 times, and usually only once
-or twice. If you hit the month cache, of course, it doesn't call it
-at all.
-
-timelocal is implemented using the same cache. We just assume that we're
-translating a GMT time, and then fudge it when we're done for the timezone
-and daylight savings arguments. The timezone is determined by examining
-the result of localtime(0) when the package is initialized. The daylight
-savings offset is currently assumed to be one hour.
-
-Both routines return -1 if the integer limit is hit. I.e. for dates
-after the 1st of January, 2038 on most machines.
-
-=cut
-
-BEGIN {
+# Set up constants
$SEC = 1;
$MIN = 60 * $SEC;
$HR = 60 * $MIN;
$DAY = 24 * $HR;
- $epoch = (localtime(2*$DAY))[5]; # Allow for bugs near localtime == 0.
+# Determine breakpoint for rolling century
+ my $thisYear = (localtime())[5];
+ $nextCentury = int($thisYear / 100) * 100;
+ $breakpoint = ($thisYear + 50) % 100;
+ $nextCentury += 100 if $breakpoint < 50;
- $YearFix = ((gmtime(946684800))[5] == 100) ? 100 : 0;
+my %options;
+sub timegm {
+ my (@date) = @_;
+ if ($date[5] > 999) {
+ $date[5] -= 1900;
+ }
+ elsif ($date[5] >= 0 && $date[5] < 100) {
+ $date[5] -= 100 if $date[5] > $breakpoint;
+ $date[5] += $nextCentury;
+ }
+ $ym = pack(C2, @date[5,4]);
+ $cheat = $cheat{$ym} || &cheat(@date);
+ $cheat
+ + $date[0] * $SEC
+ + $date[1] * $MIN
+ + $date[2] * $HR
+ + ($date[3]-1) * $DAY;
}
-sub timegm {
- $ym = pack(C2, @_[5,4]);
- $cheat = $cheat{$ym} || &cheat;
- return -1 if $cheat<0 and $^O ne 'VMS';
- $cheat + $_[0] * $SEC + $_[1] * $MIN + $_[2] * $HR + ($_[3]-1) * $DAY;
+sub timegm_nocheck {
+ local $options{no_range_check} = 1;
+ &timegm;
}
sub timelocal {
@@ -66,16 +50,15 @@ sub timelocal {
my (@lt) = localtime($t);
my (@gt) = gmtime($t);
if ($t < $DAY and ($lt[5] >= 70 or $gt[5] >= 70 )) {
- # Wrap error, too early a date
- # Try a safer date
- $tt = $DAY;
- @lt = localtime($tt);
- @gt = gmtime($tt);
+ # Wrap error, too early a date
+ # Try a safer date
+ $tt += $DAY;
+ @lt = localtime($tt);
+ @gt = gmtime($tt);
}
my $tzsec = ($gt[1] - $lt[1]) * $MIN + ($gt[2] - $lt[2]) * $HR;
- my($lday,$gday) = ($lt[7],$gt[7]);
if($lt[5] > $gt[5]) {
$tzsec -= $DAY;
}
@@ -89,25 +72,28 @@ sub timelocal {
$tzsec += $HR if($lt[8]);
$time = $t + $tzsec;
- return -1 if $cheat<0 and $^O ne 'VMS';
@test = localtime($time + ($tt - $t));
$time -= $HR if $test[2] != $_[2];
$time;
}
+sub timelocal_nocheck {
+ local $options{no_range_check} = 1;
+ &timelocal;
+}
+
sub cheat {
$year = $_[5];
- $year -= 1900
- if $year > 1900;
$month = $_[4];
- croak "Month '$month' out of range 0..11" if $month > 11 || $month < 0;
- croak "Day '$_[3]' out of range 1..31" if $_[3] > 31 || $_[3] < 1;
- croak "Hour '$_[2]' out of range 0..23" if $_[2] > 23 || $_[2] < 0;
- croak "Minute '$_[1]' out of range 0..59" if $_[1] > 59 || $_[1] < 0;
- croak "Second '$_[0]' out of range 0..59" if $_[0] > 59 || $_[0] < 0;
+ unless ($options{no_range_check}) {
+ croak "Month '$month' out of range 0..11" if $month > 11 || $month < 0;
+ croak "Day '$_[3]' out of range 1..31" if $_[3] > 31 || $_[3] < 1;
+ croak "Hour '$_[2]' out of range 0..23" if $_[2] > 23 || $_[2] < 0;
+ croak "Minute '$_[1]' out of range 0..59" if $_[1] > 59 || $_[1] < 0;
+ croak "Second '$_[0]' out of range 0..59" if $_[0] > 59 || $_[0] < 0;
+ }
$guess = $^T;
@g = gmtime($guess);
- $year += $YearFix if $year < $epoch;
$lastguess = "";
$counter = 0;
while ($diff = $year - $g[5]) {
@@ -115,7 +101,8 @@ sub cheat {
$guess += $diff * (363 * $DAY);
@g = gmtime($guess);
if (($thisguess = "@g") eq $lastguess){
- return -1; #date beyond this machine's integer limit
+ croak "Can't handle date (".join(", ",@_).")";
+ #date beyond this machine's integer limit
}
$lastguess = $thisguess;
}
@@ -124,13 +111,15 @@ sub cheat {
$guess += $diff * (27 * $DAY);
@g = gmtime($guess);
if (($thisguess = "@g") eq $lastguess){
- return -1; #date beyond this machine's integer limit
+ croak "Can't handle date (".join(", ",@_).")";
+ #date beyond this machine's integer limit
}
$lastguess = $thisguess;
}
@gfake = gmtime($guess-1); #still being sceptic
if ("@gfake" eq $lastguess){
- return -1; #date beyond this machine's integer limit
+ croak "Can't handle date (".join(", ",@_).")";
+ #date beyond this machine's integer limit
}
$g[3]--;
$guess -= $g[0] * $SEC + $g[1] * $MIN + $g[2] * $HR + $g[3] * $DAY;
@@ -138,3 +127,120 @@ sub cheat {
}
1;
+
+__END__
+
+=head1 NAME
+
+Time::Local - efficiently compute time from local and GMT time
+
+=head1 SYNOPSIS
+
+ $time = timelocal($sec,$min,$hours,$mday,$mon,$year);
+ $time = timegm($sec,$min,$hours,$mday,$mon,$year);
+
+=head1 DESCRIPTION
+
+These routines are the inverse of built-in perl fuctions localtime()
+and gmtime(). They accept a date as a six-element array, and return
+the corresponding time(2) value in seconds since the Epoch (Midnight,
+January 1, 1970). This value can be positive or negative.
+
+It is worth drawing particular attention to the expected ranges for
+the values provided. While the day of the month is expected to be in
+the range 1..31, the month should be in the range 0..11.
+This is consistent with the values returned from localtime() and gmtime().
+
+The timelocal() and timegm() functions perform range checking on the
+input $sec, $min, $hours, $mday, and $mon values by default. If you'd
+rather they didn't, you can explicitly import the timelocal_nocheck()
+and timegm_nocheck() functions.
+
+ use Time::Local 'timelocal_nocheck';
+
+ {
+ # The 365th day of 1999
+ print scalar localtime timelocal_nocheck 0,0,0,365,0,99;
+
+ # The twenty thousandth day since 1970
+ print scalar localtime timelocal_nocheck 0,0,0,20000,0,70;
+
+ # And even the 10,000,000th second since 1999!
+ print scalar localtime timelocal_nocheck 10000000,0,0,1,0,99;
+ }
+
+Your mileage may vary when trying these with minutes and hours,
+and it doesn't work at all for months.
+
+Strictly speaking, the year should also be specified in a form consistent
+with localtime(), i.e. the offset from 1900.
+In order to make the interpretation of the year easier for humans,
+however, who are more accustomed to seeing years as two-digit or four-digit
+values, the following conventions are followed:
+
+=over 4
+
+=item *
+
+Years greater than 999 are interpreted as being the actual year,
+rather than the offset from 1900. Thus, 1963 would indicate the year
+Martin Luther King won the Nobel prize, not the year 2863.
+
+=item *
+
+Years in the range 100..999 are interpreted as offset from 1900,
+so that 112 indicates 2012. This rule also applies to years less than zero
+(but see note below regarding date range).
+
+=item *
+
+Years in the range 0..99 are interpreted as shorthand for years in the
+rolling "current century," defined as 50 years on either side of the current
+year. Thus, today, in 1999, 0 would refer to 2000, and 45 to 2045,
+but 55 would refer to 1955. Twenty years from now, 55 would instead refer
+to 2055. This is messy, but matches the way people currently think about
+two digit dates. Whenever possible, use an absolute four digit year instead.
+
+=back
+
+The scheme above allows interpretation of a wide range of dates, particularly
+if 4-digit years are used.
+
+Please note, however, that the range of dates that can be actually be handled
+depends on the size of an integer (time_t) on a given platform.
+Currently, this is 32 bits for most systems, yielding an approximate range
+from Dec 1901 to Jan 2038.
+
+Both timelocal() and timegm() croak if given dates outside the supported
+range.
+
+=head1 IMPLEMENTATION
+
+These routines are quite efficient and yet are always guaranteed to agree
+with localtime() and gmtime(). We manage this by caching the start times
+of any months we've seen before. If we know the start time of the month,
+we can always calculate any time within the month. The start times
+themselves are guessed by successive approximation starting at the
+current time, since most dates seen in practice are close to the
+current date. Unlike algorithms that do a binary search (calling gmtime
+once for each bit of the time value, resulting in 32 calls), this algorithm
+calls it at most 6 times, and usually only once or twice. If you hit
+the month cache, of course, it doesn't call it at all.
+
+timelocal() is implemented using the same cache. We just assume that we're
+translating a GMT time, and then fudge it when we're done for the timezone
+and daylight savings arguments. Note that the timezone is evaluated for
+each date because countries occasionally change their official timezones.
+Assuming that localtime() corrects for these changes, this routine will
+also be correct. The daylight savings offset is currently assumed
+to be one hour.
+
+=head1 BUGS
+
+The whole scheme for interpreting two-digit years can be considered a bug.
+
+Note that the cache currently handles only years from 1900 through 2155.
+
+The proclivity to croak() is probably a bug.
+
+=cut
diff --git a/contrib/perl5/lib/Time/gmtime.pm b/contrib/perl5/lib/Time/gmtime.pm
index 9b823f6..6ff4bc8 100644
--- a/contrib/perl5/lib/Time/gmtime.pm
+++ b/contrib/perl5/lib/Time/gmtime.pm
@@ -2,9 +2,10 @@ package Time::gmtime;
use strict;
use Time::tm;
+use 5.005_64;
+our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
BEGIN {
use Exporter ();
- use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
@ISA = qw(Exporter Time::tm);
@EXPORT = qw(gmtime gmctime);
@EXPORT_OK = qw(
diff --git a/contrib/perl5/lib/Time/localtime.pm b/contrib/perl5/lib/Time/localtime.pm
index 18a36c7..0ca07af 100644
--- a/contrib/perl5/lib/Time/localtime.pm
+++ b/contrib/perl5/lib/Time/localtime.pm
@@ -2,9 +2,10 @@ package Time::localtime;
use strict;
use Time::tm;
-BEGIN {
+use 5.005_64;
+our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
+BEGIN {
use Exporter ();
- use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
@ISA = qw(Exporter Time::tm);
@EXPORT = qw(localtime ctime);
@EXPORT_OK = qw(
diff --git a/contrib/perl5/lib/UNIVERSAL.pm b/contrib/perl5/lib/UNIVERSAL.pm
index dc02423..f2f1fe9 100644
--- a/contrib/perl5/lib/UNIVERSAL.pm
+++ b/contrib/perl5/lib/UNIVERSAL.pm
@@ -62,19 +62,23 @@ The C<isa> and C<can> methods can also be called as subroutines
=item UNIVERSAL::isa ( VAL, TYPE )
-C<isa> returns I<true> if the first argument is a reference and either
-of the following statements is true.
+C<isa> returns I<true> if one of the following statements is true.
=over 8
-=item
+=item *
-C<VAL> is a blessed reference and is blessed into package C<TYPE>
-or inherits from package C<TYPE>
+C<VAL> is a reference blessed into either package C<TYPE> or a package
+which inherits from package C<TYPE>.
-=item
+=item *
-C<VAL> is a reference to a C<TYPE> of perl variable (er 'HASH')
+C<VAL> is a reference to a C<TYPE> of Perl variable (e.g. 'HASH').
+
+=item *
+
+C<VAL> is the name of a package that inherits from (or is itself)
+package C<TYPE>.
=back
diff --git a/contrib/perl5/lib/User/grent.pm b/contrib/perl5/lib/User/grent.pm
index e4e226d..95e4189 100644
--- a/contrib/perl5/lib/User/grent.pm
+++ b/contrib/perl5/lib/User/grent.pm
@@ -1,9 +1,10 @@
package User::grent;
use strict;
+use 5.005_64;
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
@EXPORT = qw(getgrent getgrgid getgrnam getgr);
@EXPORT_OK = qw($gr_name $gr_gid $gr_passwd $gr_mem @gr_members);
%EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
diff --git a/contrib/perl5/lib/User/pwent.pm b/contrib/perl5/lib/User/pwent.pm
index bb2dace..8c05926 100644
--- a/contrib/perl5/lib/User/pwent.pm
+++ b/contrib/perl5/lib/User/pwent.pm
@@ -1,50 +1,179 @@
package User::pwent;
+
+use 5.006;
+
use strict;
+use warnings;
+
+use Config;
+use Carp;
-BEGIN {
+our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
@EXPORT = qw(getpwent getpwuid getpwnam getpw);
@EXPORT_OK = qw(
- $pw_name $pw_passwd $pw_uid
- $pw_gid $pw_quota $pw_comment
- $pw_gecos $pw_dir $pw_shell
- );
- %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+ pw_has
+
+ $pw_name $pw_passwd $pw_uid $pw_gid
+ $pw_gecos $pw_dir $pw_shell
+ $pw_expire $pw_change $pw_class
+ $pw_age
+ $pw_quota $pw_comment
+ $pw_expire
+
+ );
+ %EXPORT_TAGS = (
+ FIELDS => [ grep(/^\$pw_/, @EXPORT_OK), @EXPORT ],
+ ALL => [ @EXPORT, @EXPORT_OK ],
+ );
}
-use vars @EXPORT_OK;
+use vars grep /^\$pw_/, @EXPORT_OK;
+
+#
+# XXX: these mean somebody hacked this module's source
+# without understanding the underlying assumptions.
+#
+my $IE = "[INTERNAL ERROR]";
# Class::Struct forbids use of @ISA
sub import { goto &Exporter::import }
use Class::Struct qw(struct);
struct 'User::pwent' => [
- name => '$',
- passwd => '$',
- uid => '$',
- gid => '$',
- quota => '$',
- comment => '$',
- gecos => '$',
- dir => '$',
- shell => '$',
+ name => '$', # pwent[0]
+ passwd => '$', # pwent[1]
+ uid => '$', # pwent[2]
+ gid => '$', # pwent[3]
+
+ # you'll only have one/none of these three
+ change => '$', # pwent[4]
+ age => '$', # pwent[4]
+ quota => '$', # pwent[4]
+
+ # you'll only have one/none of these two
+ comment => '$', # pwent[5]
+ class => '$', # pwent[5]
+
+ # you might not have this one
+ gecos => '$', # pwent[6]
+
+ dir => '$', # pwent[7]
+ shell => '$', # pwent[8]
+
+ # you might not have this one
+ expire => '$', # pwent[9]
+
];
-sub populate (@) {
+
+# init our groks hash to be true if the built platform knew how
+# to do each struct pwd field that perl can ever under any circumstances
+# know about. we do not use /^pw_?/, but just the tails.
+sub _feature_init {
+ our %Groks; # whether build system knew how to do this feature
+ for my $feep ( qw{
+ pwage pwchange pwclass pwcomment
+ pwexpire pwgecos pwpasswd pwquota
+ }
+ )
+ {
+ my $short = $feep =~ /^pw(.*)/
+ ? $1
+ : do {
+ # not cluck, as we know we called ourselves,
+ # and a confession is probably imminent anyway
+ warn("$IE $feep is a funny struct pwd field");
+ $feep;
+ };
+
+ exists $Config{ "d_" . $feep }
+ || confess("$IE Configure doesn't d_$feep");
+ $Groks{$short} = defined $Config{ "d_" . $feep };
+ }
+ # assume that any that are left are always there
+ for my $feep (grep /^\$pw_/s, @EXPORT_OK) {
+ $feep =~ /^\$pw_(.*)/;
+ $Groks{$1} = 1 unless defined $Groks{$1};
+ }
+}
+
+# With arguments, reports whether one or more fields are all implemented
+# in the build machine's struct pwd pw_*. May be whitespace separated.
+# We do not use /^pw_?/, just the tails.
+#
+# Without arguments, returns the list of fields implemented on build
+# machine, space separated in scalar context.
+#
+# Takes exception to being asked whether this machine's struct pwd has
+# a field that Perl never knows how to provide under any circumstances.
+# If the module does this idiocy to itself, the explosion is noisier.
+#
+sub pw_has {
+ our %Groks; # whether build system knew how to do this feature
+ my $cando = 1;
+ my $sploder = caller() ne __PACKAGE__
+ ? \&croak
+ : sub { confess("$IE @_") };
+ if (@_ == 0) {
+ my @valid = sort grep { $Groks{$_} } keys %Groks;
+ return wantarray ? @valid : "@valid";
+ }
+ for my $feep (map { split } @_) {
+ defined $Groks{$feep}
+ || $sploder->("$feep is never a valid struct pwd field");
+ $cando &&= $Groks{$feep};
+ }
+ return $cando;
+}
+
+sub _populate (@) {
return unless @_;
my $pwob = new();
- ( $pw_name, $pw_passwd, $pw_uid,
- $pw_gid, $pw_quota, $pw_comment,
- $pw_gecos, $pw_dir, $pw_shell, ) = @$pwob = @_;
+ # Any that haven't been pw_had are assumed on "all" platforms of
+ # course, this may not be so, but you can't get here otherwise,
+ # since the underlying core call already took exception to your
+ # impudence.
+
+ $pw_name = $pwob->name ( $_[0] );
+ $pw_passwd = $pwob->passwd ( $_[1] ) if pw_has("passwd");
+ $pw_uid = $pwob->uid ( $_[2] );
+ $pw_gid = $pwob->gid ( $_[3] );
+
+ if (pw_has("change")) {
+ $pw_change = $pwob->change ( $_[4] );
+ }
+ elsif (pw_has("age")) {
+ $pw_age = $pwob->age ( $_[4] );
+ }
+ elsif (pw_has("quota")) {
+ $pw_quota = $pwob->quota ( $_[4] );
+ }
+
+ if (pw_has("class")) {
+ $pw_class = $pwob->class ( $_[5] );
+ }
+ elsif (pw_has("comment")) {
+ $pw_comment = $pwob->comment( $_[5] );
+ }
+
+ $pw_gecos = $pwob->gecos ( $_[6] ) if pw_has("gecos");
+
+ $pw_dir = $pwob->dir ( $_[7] );
+ $pw_shell = $pwob->shell ( $_[8] );
+
+ $pw_expire = $pwob->expire ( $_[9] ) if pw_has("expire");
return $pwob;
-}
+}
-sub getpwent ( ) { populate(CORE::getpwent()) }
-sub getpwnam ($) { populate(CORE::getpwnam(shift)) }
-sub getpwuid ($) { populate(CORE::getpwuid(shift)) }
-sub getpw ($) { ($_[0] =~ /^\d+/) ? &getpwuid : &getpwnam }
+sub getpwent ( ) { _populate(CORE::getpwent()) }
+sub getpwnam ($) { _populate(CORE::getpwnam(shift)) }
+sub getpwuid ($) { _populate(CORE::getpwuid(shift)) }
+sub getpw ($) { ($_[0] =~ /^\d+\z/s) ? &getpwuid : &getpwnam }
+
+_feature_init();
1;
__END__
@@ -56,42 +185,95 @@ User::pwent - by-name interface to Perl's built-in getpw*() functions
=head1 SYNOPSIS
use User::pwent;
- $pw = getpwnam('daemon') or die "No daemon user";
- if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?$# ) {
+ $pw = getpwnam('daemon') || die "No daemon user";
+ if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?\z#s ) {
print "gid 1 on root dir";
- }
+ }
+
+ $real_shell = $pw->shell || '/bin/sh';
+
+ for (($fullname, $office, $workphone, $homephone) =
+ split /\s*,\s*/, $pw->gecos)
+ {
+ s/&/ucfirst(lc($pw->name))/ge;
+ }
use User::pwent qw(:FIELDS);
- getpwnam('daemon') or die "No daemon user";
- if ( $pw_uid == 1 && $pw_dir =~ m#^/(bin|tmp)?$# ) {
+ getpwnam('daemon') || die "No daemon user";
+ if ( $pw_uid == 1 && $pw_dir =~ m#^/(bin|tmp)?\z#s ) {
print "gid 1 on root dir";
- }
+ }
$pw = getpw($whoever);
+ use User::pwent qw/:DEFAULT pw_has/;
+ if (pw_has(qw[gecos expire quota])) { .... }
+ if (pw_has("name uid gid passwd")) { .... }
+ print "Your struct pwd has: ", scalar pw_has(), "\n";
+
=head1 DESCRIPTION
This module's default exports override the core getpwent(), getpwuid(),
and getpwnam() functions, replacing them with versions that return
-"User::pwent" objects. This object has methods that return the similarly
-named structure field name from the C's passwd structure from F<pwd.h>;
-namely name, passwd, uid, gid, quota, comment, gecos, dir, and shell.
+C<User::pwent> objects. This object has methods that return the
+similarly named structure field name from the C's passwd structure
+from F<pwd.h>, stripped of their leading "pw_" parts, namely C<name>,
+C<passwd>, C<uid>, C<gid>, C<change>, C<age>, C<quota>, C<comment>,
+C<class>, C<gecos>, C<dir>, C<shell>, and C<expire>. The C<passwd>,
+C<gecos>, and C<shell> fields are tainted when running in taint mode.
-You may also import all the structure fields directly into your namespace
-as regular variables using the :FIELDS import tag. (Note that this still
-overrides your core functions.) Access these fields as
-variables named with a preceding C<pw_> in front their method names.
-Thus, C<$passwd_obj-E<gt>shell()> corresponds to $pw_shell if you import
-the fields.
+You may also import all the structure fields directly into your
+namespace as regular variables using the :FIELDS import tag. (Note
+that this still overrides your core functions.) Access these fields
+as variables named with a preceding C<pw_> in front their method
+names. Thus, C<< $passwd_obj->shell >> corresponds to $pw_shell
+if you import the fields.
The getpw() function is a simple front-end that forwards
a numeric argument to getpwuid() and the rest to getpwnam().
-To access this functionality without the core overrides,
-pass the C<use> an empty import list, and then access
-function functions with their full qualified names.
-On the other hand, the built-ins are still available
-via the C<CORE::> pseudo-package.
+To access this functionality without the core overrides, pass the
+C<use> an empty import list, and then access function functions
+with their full qualified names. The built-ins are always still
+available via the C<CORE::> pseudo-package.
+
+=head2 System Specifics
+
+Perl believes that no machine ever has more than one of C<change>,
+C<age>, or C<quota> implemented, nor more than one of either
+C<comment> or C<class>. Some machines do not support C<expire>,
+C<gecos>, or allegedly, C<passwd>. You may call these methods
+no matter what machine you're on, but they return C<undef> if
+unimplemented.
+
+You may ask whether one of these was implemented on the system Perl
+was built on by asking the importable C<pw_has> function about them.
+This function returns true if all parameters are supported fields
+on the build platform, false if one or more were not, and raises
+an exception if you asked about a field that Perl never knows how
+to provide. Parameters may be in a space-separated string, or as
+separate arguments. If you pass no parameters, the function returns
+the list of C<struct pwd> fields supported by your build platform's
+C library, as a list in list context, or a space-separated string
+in scalar context. Note that just because your C library had
+a field doesn't necessarily mean that it's fully implemented on
+that system.
+
+Interpretation of the C<gecos> field varies between systems, but
+traditionally holds 4 comma-separated fields containing the user's
+full name, office location, work phone number, and home phone number.
+An C<&> in the gecos field should be replaced by the user's properly
+capitalized login C<name>. The C<shell> field, if blank, must be
+assumed to be F</bin/sh>. Perl does not do this for you. The
+C<passwd> is one-way hashed garble, not clear text, and may not be
+unhashed save by brute-force guessing. Secure systems use more a
+more secure hashing than DES. On systems supporting shadow password
+systems, Perl automatically returns the shadow password entry when
+called by a suitably empowered user, even if your underlying
+vendor-provided C library was too short-sighted to realize it should
+do this.
+
+See passwd(5) and getpwent(3) for details.
=head1 NOTE
@@ -101,3 +283,15 @@ module to build a struct-like class, you shouldn't rely upon this.
=head1 AUTHOR
Tom Christiansen
+
+=head1 HISTORY
+
+=over
+
+=item March 18th, 2000
+
+Reworked internals to support better interface to dodgey fields
+than normal Perl function provides. Added pw_has() field. Improved
+documentation.
+
+=back
diff --git a/contrib/perl5/lib/abbrev.pl b/contrib/perl5/lib/abbrev.pl
index 62975e6..c505a6f 100644
--- a/contrib/perl5/lib/abbrev.pl
+++ b/contrib/perl5/lib/abbrev.pl
@@ -4,6 +4,16 @@
;# ...
;# $long = $foo{$short};
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Text::Abbrev
+#
+
package abbrev;
sub main'abbrev {
diff --git a/contrib/perl5/lib/attributes.pm b/contrib/perl5/lib/attributes.pm
new file mode 100644
index 0000000..f111645
--- /dev/null
+++ b/contrib/perl5/lib/attributes.pm
@@ -0,0 +1,399 @@
+package attributes;
+
+$VERSION = 0.03;
+
+@EXPORT_OK = qw(get reftype);
+@EXPORT = ();
+%EXPORT_TAGS = (ALL => [@EXPORT, @EXPORT_OK]);
+
+use strict;
+
+sub croak {
+ require Carp;
+ goto &Carp::croak;
+}
+
+sub carp {
+ require Carp;
+ goto &Carp::carp;
+}
+
+## forward declaration(s) rather than wrapping the bootstrap call in BEGIN{}
+#sub reftype ($) ;
+#sub _fetch_attrs ($) ;
+#sub _guess_stash ($) ;
+#sub _modify_attrs ;
+#sub _warn_reserved () ;
+#
+# The extra trips through newATTRSUB in the interpreter wipe out any savings
+# from avoiding the BEGIN block. Just do the bootstrap now.
+BEGIN { bootstrap }
+
+sub import {
+ @_ > 2 && ref $_[2] or do {
+ require Exporter;
+ goto &Exporter::import;
+ };
+ my (undef,$home_stash,$svref,@attrs) = @_;
+
+ my $svtype = uc reftype($svref);
+ my $pkgmeth;
+ $pkgmeth = UNIVERSAL::can($home_stash, "MODIFY_${svtype}_ATTRIBUTES")
+ if defined $home_stash && $home_stash ne '';
+ my @badattrs;
+ if ($pkgmeth) {
+ my @pkgattrs = _modify_attrs($svref, @attrs);
+ @badattrs = $pkgmeth->($home_stash, $svref, @attrs);
+ if (!@badattrs && @pkgattrs) {
+ return unless _warn_reserved;
+ @pkgattrs = grep { m/\A[[:lower:]]+(?:\z|\()/ } @pkgattrs;
+ if (@pkgattrs) {
+ for my $attr (@pkgattrs) {
+ $attr =~ s/\(.+\z//s;
+ }
+ my $s = ((@pkgattrs == 1) ? '' : 's');
+ carp "$svtype package attribute$s " .
+ "may clash with future reserved word$s: " .
+ join(' : ' , @pkgattrs);
+ }
+ }
+ }
+ else {
+ @badattrs = _modify_attrs($svref, @attrs);
+ }
+ if (@badattrs) {
+ croak "Invalid $svtype attribute" .
+ (( @badattrs == 1 ) ? '' : 's') .
+ ": " .
+ join(' : ', @badattrs);
+ }
+}
+
+sub get ($) {
+ @_ == 1 && ref $_[0] or
+ croak 'Usage: '.__PACKAGE__.'::get $ref';
+ my $svref = shift;
+ my $svtype = uc reftype $svref;
+ my $stash = _guess_stash $svref;
+ $stash = caller unless defined $stash;
+ my $pkgmeth;
+ $pkgmeth = UNIVERSAL::can($stash, "FETCH_${svtype}_ATTRIBUTES")
+ if defined $stash && $stash ne '';
+ return $pkgmeth ?
+ (_fetch_attrs($svref), $pkgmeth->($stash, $svref)) :
+ (_fetch_attrs($svref))
+ ;
+}
+
+sub require_version { goto &UNIVERSAL::VERSION }
+
+1;
+__END__
+#The POD goes here
+
+=head1 NAME
+
+attributes - get/set subroutine or variable attributes
+
+=head1 SYNOPSIS
+
+ sub foo : method ;
+ my ($x,@y,%z) : Bent ;
+ my $s = sub : method { ... };
+
+ use attributes (); # optional, to get subroutine declarations
+ my @attrlist = attributes::get(\&foo);
+
+ use attributes 'get'; # import the attributes::get subroutine
+ my @attrlist = get \&foo;
+
+=head1 DESCRIPTION
+
+Subroutine declarations and definitions may optionally have attribute lists
+associated with them. (Variable C<my> declarations also may, but see the
+warning below.) Perl handles these declarations by passing some information
+about the call site and the thing being declared along with the attribute
+list to this module. In particular, the first example above is equivalent to
+the following:
+
+ use attributes __PACKAGE__, \&foo, 'method';
+
+The second example in the synopsis does something equivalent to this:
+
+ use attributes __PACKAGE__, \$x, 'Bent';
+ use attributes __PACKAGE__, \@y, 'Bent';
+ use attributes __PACKAGE__, \%z, 'Bent';
+
+Yes, that's three invocations.
+
+B<WARNING>: attribute declarations for variables are an I<experimental>
+feature. The semantics of such declarations could change or be removed
+in future versions. They are present for purposes of experimentation
+with what the semantics ought to be. Do not rely on the current
+implementation of this feature.
+
+There are only a few attributes currently handled by Perl itself (or
+directly by this module, depending on how you look at it.) However,
+package-specific attributes are allowed by an extension mechanism.
+(See L<"Package-specific Attribute Handling"> below.)
+
+The setting of attributes happens at compile time. An attempt to set
+an unrecognized attribute is a fatal error. (The error is trappable, but
+it still stops the compilation within that C<eval>.) Setting an attribute
+with a name that's all lowercase letters that's not a built-in attribute
+(such as "foo")
+will result in a warning with B<-w> or C<use warnings 'reserved'>.
+
+=head2 Built-in Attributes
+
+The following are the built-in attributes for subroutines:
+
+=over 4
+
+=item locked
+
+Setting this attribute is only meaningful when the subroutine or
+method is to be called by multiple threads. When set on a method
+subroutine (i.e., one marked with the B<method> attribute below),
+Perl ensures that any invocation of it implicitly locks its first
+argument before execution. When set on a non-method subroutine,
+Perl ensures that a lock is taken on the subroutine itself before
+execution. The semantics of the lock are exactly those of one
+explicitly taken with the C<lock> operator immediately after the
+subroutine is entered.
+
+=item method
+
+Indicates that the referenced subroutine is a method.
+This has a meaning when taken together with the B<locked> attribute,
+as described there. It also means that a subroutine so marked
+will not trigger the "Ambiguous call resolved as CORE::%s" warning.
+
+=item lvalue
+
+Indicates that the referenced subroutine is a valid lvalue and can
+be assigned to. The subroutine must return a modifiable value such
+as a scalar variable, as described in L<perlsub>.
+
+=back
+
+There are no built-in attributes for anything other than subroutines.
+
+=head2 Available Subroutines
+
+The following subroutines are available for general use once this module
+has been loaded:
+
+=over 4
+
+=item get
+
+This routine expects a single parameter--a reference to a
+subroutine or variable. It returns a list of attributes, which may be
+empty. If passed invalid arguments, it uses die() (via L<Carp::croak|Carp>)
+to raise a fatal exception. If it can find an appropriate package name
+for a class method lookup, it will include the results from a
+C<FETCH_I<type>_ATTRIBUTES> call in its return list, as described in
+L<"Package-specific Attribute Handling"> below.
+Otherwise, only L<built-in attributes|"Built-in Attributes"> will be returned.
+
+=item reftype
+
+This routine expects a single parameter--a reference to a subroutine or
+variable. It returns the built-in type of the referenced variable,
+ignoring any package into which it might have been blessed.
+This can be useful for determining the I<type> value which forms part of
+the method names described in L<"Package-specific Attribute Handling"> below.
+
+=back
+
+Note that these routines are I<not> exported by default.
+
+=head2 Package-specific Attribute Handling
+
+B<WARNING>: the mechanisms described here are still experimental. Do not
+rely on the current implementation. In particular, there is no provision
+for applying package attributes to 'cloned' copies of subroutines used as
+closures. (See L<perlref/"Making References"> for information on closures.)
+Package-specific attribute handling may change incompatibly in a future
+release.
+
+When an attribute list is present in a declaration, a check is made to see
+whether an attribute 'modify' handler is present in the appropriate package
+(or its @ISA inheritance tree). Similarly, when C<attributes::get> is
+called on a valid reference, a check is made for an appropriate attribute
+'fetch' handler. See L<"EXAMPLES"> to see how the "appropriate package"
+determination works.
+
+The handler names are based on the underlying type of the variable being
+declared or of the reference passed. Because these attributes are
+associated with subroutine or variable declarations, this deliberately
+ignores any possibility of being blessed into some package. Thus, a
+subroutine declaration uses "CODE" as its I<type>, and even a blessed
+hash reference uses "HASH" as its I<type>.
+
+The class methods invoked for modifying and fetching are these:
+
+=over 4
+
+=item FETCH_I<type>_ATTRIBUTES
+
+This method receives a single argument, which is a reference to the
+variable or subroutine for which package-defined attributes are desired.
+The expected return value is a list of associated attributes.
+This list may be empty.
+
+=item MODIFY_I<type>_ATTRIBUTES
+
+This method is called with two fixed arguments, followed by the list of
+attributes from the relevant declaration. The two fixed arguments are
+the relevant package name and a reference to the declared subroutine or
+variable. The expected return value as a list of attributes which were
+not recognized by this handler. Note that this allows for a derived class
+to delegate a call to its base class, and then only examine the attributes
+which the base class didn't already handle for it.
+
+The call to this method is currently made I<during> the processing of the
+declaration. In particular, this means that a subroutine reference will
+probably be for an undefined subroutine, even if this declaration is
+actually part of the definition.
+
+=back
+
+Calling C<attributes::get()> from within the scope of a null package
+declaration C<package ;> for an unblessed variable reference will
+not provide any starting package name for the 'fetch' method lookup.
+Thus, this circumstance will not result in a method call for package-defined
+attributes. A named subroutine knows to which symbol table entry it belongs
+(or originally belonged), and it will use the corresponding package.
+An anonymous subroutine knows the package name into which it was compiled
+(unless it was also compiled with a null package declaration), and so it
+will use that package name.
+
+=head2 Syntax of Attribute Lists
+
+An attribute list is a sequence of attribute specifications, separated by
+whitespace or a colon (with optional whitespace).
+Each attribute specification is a simple
+name, optionally followed by a parenthesised parameter list.
+If such a parameter list is present, it is scanned past as for the rules
+for the C<q()> operator. (See L<perlop/"Quote and Quote-like Operators">.)
+The parameter list is passed as it was found, however, and not as per C<q()>.
+
+Some examples of syntactically valid attribute lists:
+
+ switch(10,foo(7,3)) : expensive
+ Ugly('\(") :Bad
+ _5x5
+ locked method
+
+Some examples of syntactically invalid attribute lists (with annotation):
+
+ switch(10,foo() # ()-string not balanced
+ Ugly('(') # ()-string not balanced
+ 5x5 # "5x5" not a valid identifier
+ Y2::north # "Y2::north" not a simple identifier
+ foo + bar # "+" neither a colon nor whitespace
+
+=head1 EXPORTS
+
+=head2 Default exports
+
+None.
+
+=head2 Available exports
+
+The routines C<get> and C<reftype> are exportable.
+
+=head2 Export tags defined
+
+The C<:ALL> tag will get all of the above exports.
+
+=head1 EXAMPLES
+
+Here are some samples of syntactically valid declarations, with annotation
+as to how they resolve internally into C<use attributes> invocations by
+perl. These examples are primarily useful to see how the "appropriate
+package" is found for the possible method lookups for package-defined
+attributes.
+
+=over 4
+
+=item 1.
+
+Code:
+
+ package Canine;
+ package Dog;
+ my Canine $spot : Watchful ;
+
+Effect:
+
+ use attributes Canine => \$spot, "Watchful";
+
+=item 2.
+
+Code:
+
+ package Felis;
+ my $cat : Nervous;
+
+Effect:
+
+ use attributes Felis => \$cat, "Nervous";
+
+=item 3.
+
+Code:
+
+ package X;
+ sub foo : locked ;
+
+Effect:
+
+ use attributes X => \&foo, "locked";
+
+=item 4.
+
+Code:
+
+ package X;
+ sub Y::x : locked { 1 }
+
+Effect:
+
+ use attributes Y => \&Y::x, "locked";
+
+=item 5.
+
+Code:
+
+ package X;
+ sub foo { 1 }
+
+ package Y;
+ BEGIN { *bar = \&X::foo; }
+
+ package Z;
+ sub Y::bar : locked ;
+
+Effect:
+
+ use attributes X => \&X::foo, "locked";
+
+=back
+
+This last example is purely for purposes of completeness. You should not
+be trying to mess with the attributes of something in a package that's
+not your own.
+
+=head1 SEE ALSO
+
+L<perlsub/"Private Variables via my()"> and
+L<perlsub/"Subroutine Attributes"> for details on the basic declarations;
+L<attrs> for the obsolescent form of subroutine attribute specification
+which this module replaces;
+L<perlfunc/use> for details on the normal invocation mechanism.
+
+=cut
+
diff --git a/contrib/perl5/lib/autouse.pm b/contrib/perl5/lib/autouse.pm
index 4445c6c..179c382 100644
--- a/contrib/perl5/lib/autouse.pm
+++ b/contrib/perl5/lib/autouse.pm
@@ -3,7 +3,7 @@ package autouse;
#use strict; # debugging only
use 5.003_90; # ->can, for my $var
-$autouse::VERSION = '1.01';
+$autouse::VERSION = '1.02';
$autouse::DEBUG ||= 0;
@@ -25,7 +25,7 @@ sub import {
vet_import $module;
local $Exporter::ExportLevel = $Exporter::ExportLevel + 1;
# $Exporter::Verbose = 1;
- return $module->import(map { (my $f = $_) =~ s/\(.*?\)$// } @_);
+ return $module->import(map { (my $f = $_) =~ s/\(.*?\)$//; $f } @_);
}
# It is not loaded: need to do real work.
diff --git a/contrib/perl5/lib/base.pm b/contrib/perl5/lib/base.pm
index 3500cbf..3cb42f5 100644
--- a/contrib/perl5/lib/base.pm
+++ b/contrib/perl5/lib/base.pm
@@ -19,12 +19,21 @@ Roughly similar in effect to
Will also initialize the %FIELDS hash if one of the base classes has
it. Multiple inheritance of %FIELDS is not supported. The 'base'
-pragma will croak if multiple base classes has a %FIELDS hash. See
+pragma will croak if multiple base classes have a %FIELDS hash. See
L<fields> for a description of this feature.
When strict 'vars' is in scope I<base> also let you assign to @ISA
without having to declare @ISA with the 'vars' pragma first.
+If any of the base classes are not loaded yet, I<base> silently
+C<require>s them. Whether to C<require> a base class package is
+determined by the absence of a global $VERSION in the base package.
+If $VERSION is not detected even after loading it, <base> will
+define $VERSION in the base package, setting it to the string
+C<-1, defined by base.pm>.
+
+=head1 HISTORY
+
This module was introduced with Perl 5.004_04.
=head1 SEE ALSO
@@ -35,22 +44,30 @@ L<fields>
package base;
+use 5.005_64;
+our $VERSION = "1.01";
+
sub import {
my $class = shift;
my $fields_base;
+ my $pkg = caller(0);
foreach my $base (@_) {
- unless (defined %{"$base\::"}) {
+ next if $pkg->isa($base);
+ push @{"$pkg\::ISA"}, $base;
+ unless (exists ${"$base\::"}{VERSION}) {
eval "require $base";
# Only ignore "Can't locate" errors from our eval require.
# Other fatal errors (syntax etc) must be reported.
die if $@ && $@ !~ /^Can't locate .*? at \(eval /;
- unless (defined %{"$base\::"}) {
+ unless (%{"$base\::"}) {
require Carp;
Carp::croak("Base class package \"$base\" is empty.\n",
"\t(Perhaps you need to 'use' the module ",
"which defines that package first.)");
}
+ ${"$base\::VERSION"} = "-1, set by base.pm"
+ unless exists ${"$base\::"}{VERSION};
}
# A simple test like (defined %{"$base\::FIELDS"}) will
@@ -66,8 +83,6 @@ sub import {
}
}
}
- my $pkg = caller(0);
- push @{"$pkg\::ISA"}, @_;
if ($fields_base) {
require fields;
fields::inherit($pkg, $fields_base);
diff --git a/contrib/perl5/lib/bigfloat.pl b/contrib/perl5/lib/bigfloat.pl
index d687c78..8c28abd 100644
--- a/contrib/perl5/lib/bigfloat.pl
+++ b/contrib/perl5/lib/bigfloat.pl
@@ -1,12 +1,21 @@
package bigfloat;
require "bigint.pl";
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Math::BigFloat
+#
# Arbitrary length float math package
#
# by Mark Biggar
#
# number format
# canonical strings have the form /[+-]\d+E[+-]\d+/
-# Input values can have inbedded whitespace
+# Input values can have embedded whitespace
# Error returns
# 'NaN' An input parameter was "Not a Number" or
# divide by zero or sqrt of negative number
@@ -70,7 +79,12 @@ sub norm { #(mantissa, exponent) return fnum_str
sub main'fneg { #(fnum_str) return fnum_str
local($_) = &'fnorm($_[$[]);
vec($_,0,8) ^= ord('+') ^ ord('-') unless $_ eq '+0E+0'; # flip sign
- s/^H/N/;
+ if ( ord("\t") == 9 ) { # ascii
+ s/^H/N/;
+ }
+ else { # ebcdic character set
+ s/\373/N/;
+ }
$_;
}
@@ -126,7 +140,7 @@ sub main'fdiv #(fnum_str, fnum_str[,scale]) return fnum_str
$scale = length($xm)-1 if (length($xm)-1 > $scale);
$scale = length($ym)-1 if (length($ym)-1 > $scale);
$scale = $scale + length($ym) - length($xm);
- &norm(&round(&'bdiv($xm.('0' x $scale),$ym),$ym),
+ &norm(&round(&'bdiv($xm.('0' x $scale),$ym),&'babs($ym)),
$xe-$ye-$scale);
}
}
@@ -186,7 +200,12 @@ sub main'ffround { #(fnum_str, scale) return fnum_str
if ($xe < 1) {
'+0E+0';
} elsif ($xe == 1) {
- &norm(&round('+0',"+0".substr($xm,$[+1,1),"+10"), $scale);
+ # The first substr preserves the sign, which means that
+ # we'll pass a non-normalized "-0" to &round when rounding
+ # -0.006 (for example), purely so that &round won't lose
+ # the sign.
+ &norm(&round(substr($xm,$[,1).'0',
+ "+0".substr($xm,$[+1,1),"+10"), $scale);
} else {
&norm(&round(substr($xm,$[,$xe),
"+0".substr($xm,$[+$xe,1),"+10"), $scale);
diff --git a/contrib/perl5/lib/bigint.pl b/contrib/perl5/lib/bigint.pl
index adeb17f..4044f7f 100644
--- a/contrib/perl5/lib/bigint.pl
+++ b/contrib/perl5/lib/bigint.pl
@@ -1,5 +1,13 @@
package bigint;
-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Math::BigInt
+#
# arbitrary size integer math package
#
# by Mark Biggar
diff --git a/contrib/perl5/lib/bigrat.pl b/contrib/perl5/lib/bigrat.pl
index fb436ce..2d3738f 100644
--- a/contrib/perl5/lib/bigrat.pl
+++ b/contrib/perl5/lib/bigrat.pl
@@ -1,6 +1,12 @@
package bigrat;
require "bigint.pl";
-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
# Arbitrary size rational math package
#
# by Mark Biggar
diff --git a/contrib/perl5/lib/blib.pm b/contrib/perl5/lib/blib.pm
index 1d56a58..0916f79 100644
--- a/contrib/perl5/lib/blib.pm
+++ b/contrib/perl5/lib/blib.pm
@@ -45,12 +45,12 @@ sub import
{
my $package = shift;
my $dir = getcwd;
- if ($^O eq 'VMS') { ($dir = VMS::Filespec::unixify($dir)) =~ s-/$--; }
+ if ($^O eq 'VMS') { ($dir = VMS::Filespec::unixify($dir)) =~ s-/\z--; }
if (@_)
{
$dir = shift;
- $dir =~ s/blib$//;
- $dir =~ s,/+$,,;
+ $dir =~ s/blib\z//;
+ $dir =~ s,/+\z,,;
$dir = '.' unless ($dir);
die "$dir is not a directory\n" unless (-d $dir);
}
diff --git a/contrib/perl5/lib/bytes.pm b/contrib/perl5/lib/bytes.pm
new file mode 100644
index 0000000..f93d615
--- /dev/null
+++ b/contrib/perl5/lib/bytes.pm
@@ -0,0 +1,52 @@
+package bytes;
+
+$bytes::hint_bits = 0x00000008;
+
+sub import {
+ $^H |= $bytes::hint_bits;
+}
+
+sub unimport {
+ $^H &= ~$bytes::hint_bits;
+}
+
+sub AUTOLOAD {
+ require "bytes_heavy.pl";
+ goto &$AUTOLOAD;
+}
+
+sub length ($);
+
+1;
+__END__
+
+=head1 NAME
+
+bytes - Perl pragma to force byte semantics rather than character semantics
+
+=head1 SYNOPSIS
+
+ use bytes;
+ no bytes;
+
+=head1 DESCRIPTION
+
+WARNING: The implementation of Unicode support in Perl is incomplete.
+See L<perlunicode> for the exact details.
+
+The C<use bytes> pragma disables character semantics for the rest of the
+lexical scope in which it appears. C<no bytes> can be used to reverse
+the effect of C<use bytes> within the current lexical scope.
+
+Perl normally assumes character semantics in the presence of
+character data (i.e. data that has come from a source that has
+been marked as being of a particular character encoding).
+
+To understand the implications and differences between character
+semantics and byte semantics, see L<perlunicode>.
+
+=head1 SEE ALSO
+
+L<perlunicode>, L<utf8>
+
+=cut
diff --git a/contrib/perl5/lib/bytes_heavy.pl b/contrib/perl5/lib/bytes_heavy.pl
new file mode 100644
index 0000000..47bdbf9
--- /dev/null
+++ b/contrib/perl5/lib/bytes_heavy.pl
@@ -0,0 +1,8 @@
+package bytes;
+
+sub length ($) {
+ BEGIN { bytes::import() }
+ return CORE::length($_[0]);
+}
+
+1;
diff --git a/contrib/perl5/lib/cacheout.pl b/contrib/perl5/lib/cacheout.pl
index 64378cf..d2669a1 100644
--- a/contrib/perl5/lib/cacheout.pl
+++ b/contrib/perl5/lib/cacheout.pl
@@ -1,3 +1,12 @@
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: FileCache
+
# Open in their package.
sub cacheout'open {
diff --git a/contrib/perl5/lib/charnames.pm b/contrib/perl5/lib/charnames.pm
new file mode 100644
index 0000000..7c2209b
--- /dev/null
+++ b/contrib/perl5/lib/charnames.pm
@@ -0,0 +1,135 @@
+package charnames;
+use bytes (); # for $bytes::hint_bits
+$charnames::hint_bits = 0x20000;
+
+my $txt;
+
+# This is not optimized in any way yet
+sub charnames {
+ $name = shift;
+ $txt = do "unicode/Name.pl" unless $txt;
+ my @off;
+ if ($^H{charnames_full} and $txt =~ /\t\t$name$/m) {
+ @off = ($-[0], $+[0]);
+ }
+ unless (@off) {
+ if ($^H{charnames_short} and $name =~ /^(.*?):(.*)/s) {
+ my ($script, $cname) = ($1,$2);
+ my $case = ( $cname =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL");
+ if ($txt =~ m/\t\t\U$script\E (?:$case )?LETTER \U$cname$/m) {
+ @off = ($-[0], $+[0]);
+ }
+ }
+ }
+ unless (@off) {
+ my $case = ( $name =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL");
+ for ( @{$^H{charnames_scripts}} ) {
+ (@off = ($-[0], $+[0])), last
+ if $txt =~ m/\t\t$_ (?:$case )?LETTER \U$name$/m;
+ }
+ }
+ die "Unknown charname '$name'" unless @off;
+
+ my $ord = hex substr $txt, $off[0] - 4, 4;
+ if ($^H & $bytes::hint_bits) { # "use bytes" in effect?
+ use bytes;
+ return chr $ord if $ord <= 255;
+ my $hex = sprintf '%X=0%o', $ord, $ord;
+ my $fname = substr $txt, $off[0] + 2, $off[1] - $off[0] - 2;
+ die "Character 0x$hex with name '$fname' is above 0xFF";
+ }
+ return chr $ord;
+}
+
+sub import {
+ shift;
+ die "`use charnames' needs explicit imports list" unless @_;
+ $^H |= $charnames::hint_bits;
+ $^H{charnames} = \&charnames ;
+ my %h;
+ @h{@_} = (1) x @_;
+ $^H{charnames_full} = delete $h{':full'};
+ $^H{charnames_short} = delete $h{':short'};
+ $^H{charnames_scripts} = [map uc, keys %h];
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+charnames - define character names for C<\N{named}> string literal escape.
+
+=head1 SYNOPSIS
+
+ use charnames ':full';
+ print "\N{GREEK SMALL LETTER SIGMA} is called sigma.\n";
+
+ use charnames ':short';
+ print "\N{greek:Sigma} is an upper-case sigma.\n";
+
+ use charnames qw(cyrillic greek);
+ print "\N{sigma} is Greek sigma, and \N{be} is Cyrillic b.\n";
+
+=head1 DESCRIPTION
+
+Pragma C<use charnames> supports arguments C<:full>, C<:short> and
+script names. If C<:full> is present, for expansion of
+C<\N{CHARNAME}}> string C<CHARNAME> is first looked in the list of
+standard Unicode names of chars. If C<:short> is present, and
+C<CHARNAME> has the form C<SCRIPT:CNAME>, then C<CNAME> is looked up
+as a letter in script C<SCRIPT>. If pragma C<use charnames> is used
+with script name arguments, then for C<\N{CHARNAME}}> the name
+C<CHARNAME> is looked up as a letter in the given scripts (in the
+specified order).
+
+For lookup of C<CHARNAME> inside a given script C<SCRIPTNAME>
+this pragma looks for the names
+
+ SCRIPTNAME CAPITAL LETTER CHARNAME
+ SCRIPTNAME SMALL LETTER CHARNAME
+ SCRIPTNAME LETTER CHARNAME
+
+in the table of standard Unicode names. If C<CHARNAME> is lowercase,
+then the C<CAPITAL> variant is ignored, otherwise the C<SMALL> variant is
+ignored.
+
+=head1 CUSTOM TRANSLATORS
+
+The mechanism of translation of C<\N{...}> escapes is general and not
+hardwired into F<charnames.pm>. A module can install custom
+translations (inside the scope which C<use>s the module) with the
+following magic incantation:
+
+ use charnames (); # for $charnames::hint_bits
+ sub import {
+ shift;
+ $^H |= $charnames::hint_bits;
+ $^H{charnames} = \&translator;
+ }
+
+Here translator() is a subroutine which takes C<CHARNAME> as an
+argument, and returns text to insert into the string instead of the
+C<\N{CHARNAME}> escape. Since the text to insert should be different
+in C<bytes> mode and out of it, the function should check the current
+state of C<bytes>-flag as in:
+
+ use bytes (); # for $bytes::hint_bits
+ sub translator {
+ if ($^H & $bytes::hint_bits) {
+ return bytes_translator(@_);
+ }
+ else {
+ return utf8_translator(@_);
+ }
+ }
+
+=head1 BUGS
+
+Since evaluation of the translation function happens in a middle of
+compilation (of a string literal), the translation function should not
+do any C<eval>s or C<require>s. This restriction should be lifted in
+a future version of Perl.
+
+=cut
diff --git a/contrib/perl5/lib/chat2.pl b/contrib/perl5/lib/chat2.pl
index 094d3df..504fa7e 100644
--- a/contrib/perl5/lib/chat2.pl
+++ b/contrib/perl5/lib/chat2.pl
@@ -1,4 +1,13 @@
# chat.pl: chat with a server
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Socket
+#
# Based on: V2.01.alpha.7 91/06/16
# Randal L. Schwartz (was <merlyn@stonehenge.com>)
# multihome additions by A.Macpherson@bnr.co.uk
diff --git a/contrib/perl5/lib/complete.pl b/contrib/perl5/lib/complete.pl
index 539f2f7..925ce86 100644
--- a/contrib/perl5/lib/complete.pl
+++ b/contrib/perl5/lib/complete.pl
@@ -1,4 +1,13 @@
;#
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Term::Complete
+#
;# @(#)complete.pl,v1.1 (me@anywhere.EBay.Sun.COM) 09/23/91
;#
;# Author: Wayne Thompson
diff --git a/contrib/perl5/lib/constant.pm b/contrib/perl5/lib/constant.pm
index 5d3dd91..72ad793 100644
--- a/contrib/perl5/lib/constant.pm
+++ b/contrib/perl5/lib/constant.pm
@@ -1,6 +1,107 @@
package constant;
-$VERSION = '1.00';
+use strict;
+use 5.005_64;
+use warnings::register;
+
+our($VERSION, %declared);
+$VERSION = '1.02';
+
+#=======================================================================
+
+# Some names are evil choices.
+my %keywords = map +($_, 1), qw{ BEGIN INIT CHECK END DESTROY AUTOLOAD };
+
+my %forced_into_main = map +($_, 1),
+ qw{ STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG };
+
+my %forbidden = (%keywords, %forced_into_main);
+
+#=======================================================================
+# import() - import symbols into user's namespace
+#
+# What we actually do is define a function in the caller's namespace
+# which returns the value. The function we create will normally
+# be inlined as a constant, thereby avoiding further sub calling
+# overhead.
+#=======================================================================
+sub import {
+ my $class = shift;
+ return unless @_; # Ignore 'use constant;'
+ my $name = shift;
+ unless (defined $name) {
+ require Carp;
+ Carp::croak("Can't use undef as constant name");
+ }
+ my $pkg = caller;
+
+ # Normal constant name
+ if ($name =~ /^_?[^\W_0-9]\w*\z/ and !$forbidden{$name}) {
+ # Everything is okay
+
+ # Name forced into main, but we're not in main. Fatal.
+ } elsif ($forced_into_main{$name} and $pkg ne 'main') {
+ require Carp;
+ Carp::croak("Constant name '$name' is forced into main::");
+
+ # Starts with double underscore. Fatal.
+ } elsif ($name =~ /^__/) {
+ require Carp;
+ Carp::croak("Constant name '$name' begins with '__'");
+
+ # Maybe the name is tolerable
+ } elsif ($name =~ /^[A-Za-z_]\w*\z/) {
+ # Then we'll warn only if you've asked for warnings
+ if (warnings::enabled()) {
+ if ($keywords{$name}) {
+ warnings::warn("Constant name '$name' is a Perl keyword");
+ } elsif ($forced_into_main{$name}) {
+ warnings::warn("Constant name '$name' is " .
+ "forced into package main::");
+ } else {
+ # Catch-all - what did I miss? If you get this error,
+ # please let me know what your constant's name was.
+ # Write to <rootbeer@redcat.com>. Thanks!
+ warnings::warn("Constant name '$name' has unknown problems");
+ }
+ }
+
+ # Looks like a boolean
+ # use constant FRED == fred;
+ } elsif ($name =~ /^[01]?\z/) {
+ require Carp;
+ if (@_) {
+ Carp::croak("Constant name '$name' is invalid");
+ } else {
+ Carp::croak("Constant name looks like boolean value");
+ }
+
+ } else {
+ # Must have bad characters
+ require Carp;
+ Carp::croak("Constant name '$name' has invalid characters");
+ }
+
+ {
+ no strict 'refs';
+ my $full_name = "${pkg}::$name";
+ $declared{$full_name}++;
+ if (@_ == 1) {
+ my $scalar = $_[0];
+ *$full_name = sub () { $scalar };
+ } elsif (@_) {
+ my @list = @_;
+ *$full_name = sub () { @list };
+ } else {
+ *$full_name = sub () { };
+ }
+ }
+
+}
+
+1;
+
+__END__
=head1 NAME
@@ -20,7 +121,7 @@ constant - Perl pragma to declare constants
print "This line does nothing" unless DEBUGGING;
- # references can be declared constant
+ # references can be constants
use constant CHASH => { foo => 42 };
use constant CARRAY => [ 1,2,3,4 ];
use constant CPSEUDOHASH => [ { foo => 1}, 42 ];
@@ -30,7 +131,7 @@ constant - Perl pragma to declare constants
print CARRAY->[$i];
print CPSEUDOHASH->{foo};
print CCODE->("me");
- print CHASH->[10]; # compile-time error
+ print CHASH->[10]; # compile-time error
=head1 DESCRIPTION
@@ -63,7 +164,10 @@ List constants are returned as lists, not as arrays.
The use of all caps for constant names is merely a convention,
although it is recommended in order to make constants stand out
and to help avoid collisions with other barewords, keywords, and
-subroutine names. Constant names must begin with a letter.
+subroutine names. Constant names must begin with a letter or
+underscore. Names beginning with a double underscore are reserved. Some
+poor choices for names will generate warnings, if warnings are enabled at
+compile time.
Constant symbols are package scoped (rather than block scoped, as
C<use strict> is). That is, you can refer to a constant from package
@@ -98,7 +202,24 @@ constants at compile time, allowing for way cool stuff like this.
print E2BIG, "\n"; # something like "Arg list too long"
print 0+E2BIG, "\n"; # "7"
-Errors in dereferencing constant references are trapped at compile-time.
+Dereferencing constant references incorrectly (such as using an array
+subscript on a constant hash reference, or vice versa) will be trapped at
+compile time.
+
+In the rare case in which you need to discover at run time whether a
+particular constant has been declared via this module, you may use
+this function to examine the hash C<%constant::declared>. If the given
+constant name does not include a package name, the current package is
+used.
+
+ sub declared ($) {
+ use constant 1.01; # don't omit this!
+ my $name = shift;
+ $name =~ s/^::/main::/;
+ my $pkg = caller;
+ my $full_name = $name =~ /::/ ? $name : "${pkg}::$name";
+ $constant::declared{$full_name};
+ }
=head1 TECHNICAL NOTE
@@ -115,7 +236,19 @@ In the current version of Perl, list constants are not inlined
and some symbols may be redefined without generating a warning.
It is not possible to have a subroutine or keyword with the same
-name as a constant. This is probably a Good Thing.
+name as a constant in the same package. This is probably a Good Thing.
+
+A constant with a name in the list C<STDIN STDOUT STDERR ARGV ARGVOUT
+ENV INC SIG> is not allowed anywhere but in package C<main::>, for
+technical reasons.
+
+Even though a reference may be declared as a constant, the reference may
+point to data which may be changed, as this code shows.
+
+ use constant CARRAY => [ 1,2,3,4 ];
+ print CARRAY->[1];
+ CARRAY->[1] = " be changed";
+ print CARRAY->[1];
Unlike constants in some languages, these cannot be overridden
on the command line or via environment variables.
@@ -126,61 +259,20 @@ For example, you can't say C<$hash{CONSTANT}> because C<CONSTANT> will
be interpreted as a string. Use C<$hash{CONSTANT()}> or
C<$hash{+CONSTANT}> to prevent the bareword quoting mechanism from
kicking in. Similarly, since the C<=E<gt>> operator quotes a bareword
-immediately to its left you have to say C<CONSTANT() =E<gt> 'value'>
-instead of C<CONSTANT =E<gt> 'value'>.
+immediately to its left, you have to say C<CONSTANT() =E<gt> 'value'>
+(or simply use a comma in place of the big arrow) instead of
+C<CONSTANT =E<gt> 'value'>.
=head1 AUTHOR
-Tom Phoenix, E<lt>F<rootbeer@teleport.com>E<gt>, with help from
+Tom Phoenix, E<lt>F<rootbeer@redcat.com>E<gt>, with help from
many other folks.
=head1 COPYRIGHT
-Copyright (C) 1997, Tom Phoenix
+Copyright (C) 1997, 1999 Tom Phoenix
This module is free software; you can redistribute it or modify it
under the same terms as Perl itself.
=cut
-
-use strict;
-use Carp;
-use vars qw($VERSION);
-
-#=======================================================================
-
-# Some of this stuff didn't work in version 5.003, alas.
-require 5.003_96;
-
-#=======================================================================
-# import() - import symbols into user's namespace
-#
-# What we actually do is define a function in the caller's namespace
-# which returns the value. The function we create will normally
-# be inlined as a constant, thereby avoiding further sub calling
-# overhead.
-#=======================================================================
-sub import {
- my $class = shift;
- my $name = shift or return; # Ignore 'use constant;'
- croak qq{Can't define "$name" as constant} .
- qq{ (name contains invalid characters or is empty)}
- unless $name =~ /^[^\W_0-9]\w*$/;
-
- my $pkg = caller;
- {
- no strict 'refs';
- if (@_ == 1) {
- my $scalar = $_[0];
- *{"${pkg}::$name"} = sub () { $scalar };
- } elsif (@_) {
- my @list = @_;
- *{"${pkg}::$name"} = sub () { @list };
- } else {
- *{"${pkg}::$name"} = sub () { };
- }
- }
-
-}
-
-1;
diff --git a/contrib/perl5/lib/ctime.pl b/contrib/perl5/lib/ctime.pl
index 14e122a..6a3f295 100644
--- a/contrib/perl5/lib/ctime.pl
+++ b/contrib/perl5/lib/ctime.pl
@@ -1,4 +1,12 @@
;# ctime.pl is a simple Perl emulation for the well known ctime(3C) function.
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: the POSIX ctime function
;#
;# Waldemar Kebsch, Federal Republic of Germany, November 1988
;# kebsch.pad@nixpbe.UUCP
diff --git a/contrib/perl5/lib/diagnostics.pm b/contrib/perl5/lib/diagnostics.pm
index b9aaba5..a2c927b 100755
--- a/contrib/perl5/lib/diagnostics.pm
+++ b/contrib/perl5/lib/diagnostics.pm
@@ -51,6 +51,11 @@ The B<-verbose> flag first prints out the L<perldiag> introduction before
any other diagnostics. The $diagnostics::PRETTY variable can generate nicer
escape sequences for pagers.
+Warnings dispatched from perl itself (or more accurately, those that match
+descriptions found in L<perldiag>) are only displayed once (no duplicate
+descriptions). User code generated warnings ala warn() are unaffected,
+allowing duplicate user messages to be displayed.
+
=head2 The I<splain> Program
While apparently a whole nuther program, I<splain> is actually nothing
@@ -162,9 +167,11 @@ Tom Christiansen <F<tchrist@mox.perl.com>>, 25 June 1995.
=cut
-require 5.001;
+use 5.005_64;
use Carp;
+$VERSION = v1.0;
+
use Config;
($privlib, $archlib) = @Config{qw(privlibexp archlibexp)};
if ($^O eq 'VMS') {
@@ -172,9 +179,14 @@ if ($^O eq 'VMS') {
$privlib = VMS::Filespec::unixify($privlib);
$archlib = VMS::Filespec::unixify($archlib);
}
-@trypod = ("$archlib/pod/perldiag.pod",
- "$privlib/pod/perldiag-$].pod",
- "$privlib/pod/perldiag.pod");
+@trypod = (
+ "$archlib/pod/perldiag.pod",
+ "$privlib/pod/perldiag-$Config{version}.pod",
+ "$privlib/pod/perldiag.pod",
+ "$archlib/pods/perldiag.pod",
+ "$privlib/pods/perldiag-$Config{version}.pod",
+ "$privlib/pods/perldiag.pod",
+ );
# handy for development testing of new warnings etc
unshift @trypod, "./pod/perldiag.pod" if -e "pod/perldiag.pod";
($PODFILE) = ((grep { -e } @trypod), $trypod[$#trypod])[0];
@@ -274,7 +286,7 @@ if (eof(POD_DIAG)) {
$transmo = <<EOFUNC;
sub transmo {
- local \$^W = 0; # recursive warnings we do NOT need!
+ #local \$^W = 0; # recursive warnings we do NOT need!
study;
EOFUNC
@@ -323,7 +335,7 @@ EOFUNC
# strip formatting directives in =item line
($header = $1) =~ s/[A-Z]<(.*?)>/$1/g;
- if ($header =~ /%[sd]/) {
+ if ($header =~ /%[csd]/) {
$rhs = $lhs = $header;
#if ($lhs =~ s/(.*?)%d(?!%d)(.*)/\Q$1\E\\d+\Q$2\E\$/g) {
if ($lhs =~ s/(.*?)%d(?!%d)(.*)/\Q$1\E\\d+\Q$2\E/g) {
@@ -336,6 +348,7 @@ EOFUNC
$lhs =~ s/\377//g;
$lhs =~ s/\.\*\?$/.*/; # Allow %s at the end to eat it all
}
+ $lhs =~ s/\\%c/./g;
$transmo .= " s{^$lhs}\n {\Q$rhs\E}s\n\t&& return 1;\n";
} else {
$transmo .= " m{^\Q$header\E} && return 1;\n";
@@ -366,12 +379,13 @@ if ($standalone) {
}
exit;
} else {
- $old_w = 0; $oldwarn = ''; $olddie = '';
+ #$old_w = 0;
+ $oldwarn = ''; $olddie = '';
}
sub import {
shift;
- $old_w = $^W;
+ #$old_w = $^W;
$^W = 1; # yup, clobbered the global variable; tough, if you
# want diags, you want diags.
return if $SIG{__WARN__} eq \&warn_trap;
@@ -407,7 +421,7 @@ sub enable { &import }
sub disable {
shift;
- $^W = $old_w;
+ #$^W = $old_w;
return unless $SIG{__WARN__} eq \&warn_trap;
$SIG{__WARN__} = $oldwarn;
$SIG{__DIE__} = $olddie;
@@ -458,13 +472,15 @@ sub splainthis {
s/\.?\n+$//;
my $orig = $_;
# return unless defined;
- if ($exact_duplicate{$_}++) {
- return 1;
- }
s/, <.*?> (?:line|chunk).*$//;
$real = s/(.*?) at .*? (?:line|chunk) \d+.*/$1/;
s/^\((.*)\)$/$1/;
- return 0 unless &transmo;
+ if ($exact_duplicate{$orig}++) {
+ return &transmo;
+ }
+ else {
+ return 0 unless &transmo;
+ }
$orig = shorten($orig);
if ($old_diag{$_}) {
autodescribe();
@@ -526,7 +542,7 @@ sub shorten {
}
-# have to do this: RS isn't set until run time, but we're executing at compile time
+# have to do this: RS isn't set until run time, but we're executing at compiletime
$RS = "\n";
1 unless $standalone; # or it'll complain about itself
diff --git a/contrib/perl5/lib/dotsh.pl b/contrib/perl5/lib/dotsh.pl
index 877467e..5be2413 100644
--- a/contrib/perl5/lib/dotsh.pl
+++ b/contrib/perl5/lib/dotsh.pl
@@ -1,6 +1,13 @@
#
# @(#)dotsh.pl 03/19/94
#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+#
# Author: Charles Collins
#
# Description:
@@ -26,7 +33,9 @@
#
sub dotsh {
local(@sh) = @_;
- local($tmp,$key,$shell,*dotsh,$command,$args,$vars) = '';
+ local($tmp,$key,$shell,$command,$args,$vars) = '';
+ local(*dotsh);
+ undef *dotsh;
$dotsh = shift(@sh);
@dotsh = split (/\s/, $dotsh);
$command = shift (@dotsh);
@@ -37,7 +46,7 @@ sub dotsh {
$shell = "$1 -c" if ($_ =~ /^\#\!\s*(\S+(\/sh|\/ksh|\/zsh|\/csh))\s*$/);
close (_SH_ENV);
if (!$shell) {
- if ($ENV{'SHELL'} =~ /\/sh$|\/ksh$|\/zsh$|\/csh$/) {
+ if ($ENV{'SHELL'} =~ /\/sh$|\/ksh$|\/zsh$|\/bash$|\/csh$/) {
$shell = "$ENV{'SHELL'} -c";
} else {
print "SHELL not recognized!\nUsing /bin/sh...\n";
diff --git a/contrib/perl5/lib/dumpvar.pl b/contrib/perl5/lib/dumpvar.pl
index 32d4692..51e9c88 100644
--- a/contrib/perl5/lib/dumpvar.pl
+++ b/contrib/perl5/lib/dumpvar.pl
@@ -53,7 +53,7 @@ sub stringify {
return $_ . "" if ref \$_ eq 'GLOB';
$_ = &{'overload::StrVal'}($_)
if $bareStringify and ref $_
- and defined %overload:: and defined &{'overload::StrVal'};
+ and %overload:: and defined &{'overload::StrVal'};
if ($tick eq 'auto') {
if (/[\000-\011\013-\037\177]/) {
@@ -125,7 +125,7 @@ sub unwrap {
if (ref $v) {
my $val = $v;
$val = &{'overload::StrVal'}($v)
- if defined %overload:: and defined &{'overload::StrVal'};
+ if %overload:: and defined &{'overload::StrVal'};
($address) = $val =~ /(0x[0-9a-f]+)\)$/ ;
if (!$dumpReused && defined $address) {
$address{$address}++ ;
@@ -143,6 +143,13 @@ sub unwrap {
}
}
+ if (ref $v eq 'Regexp') {
+ my $re = "$v";
+ $re =~ s,/,\\/,g;
+ print "$sp-> qr/$re/\n";
+ return;
+ }
+
if ( UNIVERSAL::isa($v, 'HASH') ) {
@sortKeys = sort keys(%$v) ;
undef $more ;
@@ -188,8 +195,8 @@ sub unwrap {
if ($#$v >= 0) {
$short = $sp . "0..$#{$v} " .
join(" ",
- map {stringify $_} @{$v}[0..$tArrayDepth])
- . "$shortmore";
+ map {exists $v->[$_] ? stringify $v->[$_] : "empty"} ($[..$tArrayDepth)
+ ) . "$shortmore";
} else {
$short = $sp . "empty array";
}
@@ -202,7 +209,11 @@ sub unwrap {
for $num ($[ .. $tArrayDepth) {
return if $DB::signal;
print "$sp$num ";
- DumpElem $v->[$num], $s;
+ if (exists $v->[$num]) {
+ DumpElem $v->[$num], $s;
+ } else {
+ print "empty slot\n";
+ }
}
print "$sp empty array\n" unless @$v;
print "$sp$more" if defined $more ;
@@ -282,12 +293,12 @@ sub dumpglob {
print( (' ' x $off) . "\$", &unctrl($key), " = " );
DumpElem $entry, 3+$off;
}
- if (($key !~ /^_</ or $dumpDBFiles) and defined @entry) {
+ if (($key !~ /^_</ or $dumpDBFiles) and @entry) {
print( (' ' x $off) . "\@$key = (\n" );
unwrap(\@entry,3+$off) ;
print( (' ' x $off) . ")\n" );
}
- if ($key ne "main::" && $key ne "DB::" && defined %entry
+ if ($key ne "main::" && $key ne "DB::" && %entry
&& ($dumpPackages or $key !~ /::$/)
&& ($key !~ /^_</ or $dumpDBFiles)
&& !($package eq "dumpvar" and $key eq "stab")) {
@@ -305,18 +316,31 @@ sub dumpglob {
}
}
+sub CvGV_name_or_bust {
+ my $in = shift;
+ return if $skipCvGV; # Backdoor to avoid problems if XS broken...
+ $in = \&$in; # Hard reference...
+ eval {require Devel::Peek; 1} or return;
+ my $gv = Devel::Peek::CvGV($in) or return;
+ *$gv{PACKAGE} . '::' . *$gv{NAME};
+}
+
sub dumpsub {
my ($off,$sub) = @_;
+ my $ini = $sub;
+ my $s;
$sub = $1 if $sub =~ /^\{\*(.*)\}$/;
- my $subref = \&$sub;
- my $place = $DB::sub{$sub} || (($sub = $subs{"$subref"}) && $DB::sub{$sub})
- || ($subdump && ($sub = findsubs("$subref")) && $DB::sub{$sub});
+ my $subref = defined $1 ? \&$sub : \&$ini;
+ my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s})
+ || (($s = CvGV_name_or_bust($subref)) && $DB::sub{$s})
+ || ($subdump && ($s = findsubs("$subref")) && $DB::sub{$s});
$place = '???' unless defined $place;
- print( (' ' x $off) . "&$sub in $place\n" );
+ $s = $sub unless defined $s;
+ print( (' ' x $off) . "&$s in $place\n" );
}
sub findsubs {
- return undef unless defined %DB::sub;
+ return undef unless %DB::sub;
my ($addr, $name, $loc);
while (($name, $loc) = each %DB::sub) {
$addr = \&$name;
@@ -341,7 +365,9 @@ sub main::dumpvar {
return if $DB::signal;
next if @vars && !grep( matchvar($key, $_), @vars );
if ($usageOnly) {
- globUsage(\$val, $key) unless $package eq 'dumpvar' and $key eq 'stab';
+ globUsage(\$val, $key)
+ if ($package ne 'dumpvar' or $key ne 'stab')
+ and ref(\$val) eq 'GLOB';
} else {
dumpglob(0,$key, $val);
}
@@ -388,8 +414,8 @@ sub globUsage { # glob ref, name
local *name = *{$_[0]};
$total = 0;
$total += scalarUsage $name if defined $name;
- $total += arrayUsage \@name, $_[1] if defined @name;
- $total += hashUsage \%name, $_[1] if defined %name and $_[1] ne "main::"
+ $total += arrayUsage \@name, $_[1] if @name;
+ $total += hashUsage \%name, $_[1] if %name and $_[1] ne "main::"
and $_[1] ne "DB::"; #and !($package eq "dumpvar" and $key eq "stab"));
$total;
}
diff --git a/contrib/perl5/lib/exceptions.pl b/contrib/perl5/lib/exceptions.pl
index 02c4498..ed1f927 100644
--- a/contrib/perl5/lib/exceptions.pl
+++ b/contrib/perl5/lib/exceptions.pl
@@ -1,5 +1,12 @@
# exceptions.pl
# tchrist@convex.com
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
#
# Here's a little code I use for exception handling. It's really just
# glorfied eval/die. The way to use use it is when you might otherwise
diff --git a/contrib/perl5/lib/fastcwd.pl b/contrib/perl5/lib/fastcwd.pl
index 6b452e8..ecd87c8 100644
--- a/contrib/perl5/lib/fastcwd.pl
+++ b/contrib/perl5/lib/fastcwd.pl
@@ -1,5 +1,13 @@
# By John Bazik
#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
# Usage: $cwd = &fastcwd;
#
# This is a faster version of getcwd. It's also more dangerous because
diff --git a/contrib/perl5/lib/fields.pm b/contrib/perl5/lib/fields.pm
index 54602a6..ac45810 100644
--- a/contrib/perl5/lib/fields.pm
+++ b/contrib/perl5/lib/fields.pm
@@ -8,59 +8,117 @@ fields - compile-time class fields
{
package Foo;
- use fields qw(foo bar _private);
+ use fields qw(foo bar _Foo_private);
+ sub new {
+ my Foo $self = shift;
+ unless (ref $self) {
+ $self = fields::new($self);
+ $self->{_Foo_private} = "this is Foo's secret";
+ }
+ $self->{foo} = 10;
+ $self->{bar} = 20;
+ return $self;
+ }
}
- ...
- my Foo $var = new Foo;
+
+ my Foo $var = Foo::->new;
$var->{foo} = 42;
- # This will generate a compile-time error.
+ # this will generate a compile-time error
$var->{zap} = 42;
+ # subclassing
{
package Bar;
use base 'Foo';
- use fields 'bar'; # hides Foo->{bar}
- use fields qw(baz _private); # not shared with Foo
+ use fields qw(baz _Bar_private); # not shared with Foo
+ sub new {
+ my $class = shift;
+ my $self = fields::new($class);
+ $self->SUPER::new(); # init base fields
+ $self->{baz} = 10; # init own fields
+ $self->{_Bar_private} = "this is Bar's secret";
+ return $self;
+ }
}
=head1 DESCRIPTION
-The C<fields> pragma enables compile-time verified class fields. It
-does so by updating the %FIELDS hash in the calling package.
+The C<fields> pragma enables compile-time verified class fields.
+
+NOTE: The current implementation keeps the declared fields in the %FIELDS
+hash of the calling package, but this may change in future versions.
+Do B<not> update the %FIELDS hash directly, because it must be created
+at compile-time for it to be fully useful, as is done by this pragma.
If a typed lexical variable holding a reference is used to access a
-hash element and the %FIELDS hash of the given type exists, then the
-operation is turned into an array access at compile time. The %FIELDS
-hash maps from hash element names to the array indices. If the hash
-element is not present in the %FIELDS hash, then a compile-time error
-is signaled.
-
-Since the %FIELDS hash is used at compile-time, it must be set up at
-compile-time too. This is made easier with the help of the 'fields'
-and the 'base' pragma modules. The 'base' pragma will copy fields
-from base classes and the 'fields' pragma adds new fields. Field
-names that start with an underscore character are made private to a
-class and are not visible to subclasses. Inherited fields can be
+hash element and a package with the same name as the type has declared
+class fields using this pragma, then the operation is turned into an
+array access at compile time.
+
+The related C<base> pragma will combine fields from base classes and any
+fields declared using the C<fields> pragma. This enables field
+inheritance to work properly.
+
+Field names that start with an underscore character are made private to
+the class and are not visible to subclasses. Inherited fields can be
overridden but will generate a warning if used together with the C<-w>
switch.
The effect of all this is that you can have objects with named fields
which are as compact and as fast arrays to access. This only works
as long as the objects are accessed through properly typed variables.
-For untyped access to work you have to make sure that a reference to
-the proper %FIELDS hash is assigned to the 0'th element of the array
-object (so that the objects can be treated like an pseudo-hash). A
-constructor like this does the job:
+If the objects are not typed, access is only checked at run time.
- sub new
- {
- my $class = shift;
- no strict 'refs';
- my $self = bless [\%{"$class\::FIELDS"}], $class;
- $self;
- }
+The following functions are supported:
+=over 8
+
+=item new
+
+fields::new() creates and blesses a pseudo-hash comprised of the fields
+declared using the C<fields> pragma into the specified class.
+This makes it possible to write a constructor like this:
+
+ package Critter::Sounds;
+ use fields qw(cat dog bird);
+
+ sub new {
+ my Critter::Sounds $self = shift;
+ $self = fields::new($self) unless ref $self;
+ $self->{cat} = 'meow'; # scalar element
+ @$self{'dog','bird'} = ('bark','tweet'); # slice
+ return $self;
+ }
+
+=item phash
+
+fields::phash() can be used to create and initialize a plain (unblessed)
+pseudo-hash. This function should always be used instead of creating
+pseudo-hashes directly.
+
+If the first argument is a reference to an array, the pseudo-hash will
+be created with keys from that array. If a second argument is supplied,
+it must also be a reference to an array whose elements will be used as
+the values. If the second array contains less elements than the first,
+the trailing elements of the pseudo-hash will not be initialized.
+This makes it particularly useful for creating a pseudo-hash from
+subroutine arguments:
+
+ sub dogtag {
+ my $tag = fields::phash([qw(name rank ser_num)], [@_]);
+ }
+
+fields::phash() also accepts a list of key-value pairs that will
+be used to construct the pseudo hash. Examples:
+
+ my $tag = fields::phash(name => "Joe",
+ rank => "captain",
+ ser_num => 42);
+
+ my $pseudohash = fields::phash(%args);
+
+=back
=head1 SEE ALSO
@@ -69,88 +127,160 @@ L<perlref/Pseudo-hashes: Using an array as a hash>
=cut
+use 5.005_64;
use strict;
no strict 'refs';
-use vars qw(%attr $VERSION);
+use warnings::register;
+our(%attr, $VERSION);
-$VERSION = "0.02";
+$VERSION = "1.01";
# some constants
sub _PUBLIC () { 1 }
sub _PRIVATE () { 2 }
-sub _INHERITED () { 4 }
# The %attr hash holds the attributes of the currently assigned fields
# per class. The hash is indexed by class names and the hash value is
-# an array reference. The array is indexed with the field numbers
-# (minus one) and the values are integer bit masks (or undef). The
-# size of the array also indicate the next field index too assign for
-# additional fields in this class.
+# an array reference. The first element in the array is the lowest field
+# number not belonging to a base class. The remaining elements' indices
+# are the field numbers. The values are integer bit masks, or undef
+# in the case of base class private fields (which occupy a slot but are
+# otherwise irrelevant to the class).
sub import {
my $class = shift;
+ return unless @_;
my $package = caller(0);
+ # avoid possible typo warnings
+ %{"$package\::FIELDS"} = () unless %{"$package\::FIELDS"};
my $fields = \%{"$package\::FIELDS"};
- my $fattr = ($attr{$package} ||= []);
+ my $fattr = ($attr{$package} ||= [1]);
+ my $next = @$fattr;
+ if ($next > $fattr->[0]
+ and ($fields->{$_[0]} || 0) >= $fattr->[0])
+ {
+ # There are already fields not belonging to base classes.
+ # Looks like a possible module reload...
+ $next = $fattr->[0];
+ }
foreach my $f (@_) {
- if (my $fno = $fields->{$f}) {
+ my $fno = $fields->{$f};
+
+ # Allow the module to be reloaded so long as field positions
+ # have not changed.
+ if ($fno and $fno != $next) {
require Carp;
- if ($fattr->[$fno-1] & _INHERITED) {
- Carp::carp("Hides field '$f' in base class") if $^W;
+ if ($fno < $fattr->[0]) {
+ warnings::warn("Hides field '$f' in base class")
+ if warnings::enabled();
} else {
Carp::croak("Field name '$f' already in use");
}
}
- $fields->{$f} = @$fattr + 1;
- push(@$fattr, ($f =~ /^_/) ? _PRIVATE : _PUBLIC);
+ $fields->{$f} = $next;
+ $fattr->[$next] = ($f =~ /^_/) ? _PRIVATE : _PUBLIC;
+ $next += 1;
+ }
+ if (@$fattr > $next) {
+ # Well, we gave them the benefit of the doubt by guessing the
+ # module was reloaded, but they appear to be declaring fields
+ # in more than one place. We can't be sure (without some extra
+ # bookkeeping) that the rest of the fields will be declared or
+ # have the same positions, so punt.
+ require Carp;
+ Carp::croak ("Reloaded module must declare all fields at once");
}
}
-sub inherit # called by base.pm
-{
+sub inherit { # called by base.pm when $base_fields is nonempty
my($derived, $base) = @_;
+ my $base_attr = $attr{$base};
+ my $derived_attr = $attr{$derived} ||= [];
+ # avoid possible typo warnings
+ %{"$base\::FIELDS"} = () unless %{"$base\::FIELDS"};
+ %{"$derived\::FIELDS"} = () unless %{"$derived\::FIELDS"};
+ my $base_fields = \%{"$base\::FIELDS"};
+ my $derived_fields = \%{"$derived\::FIELDS"};
- if (defined %{"$derived\::FIELDS"}) {
- require Carp;
- Carp::croak("Inherited %FIELDS can't override existing %FIELDS");
- } else {
- my $base_fields = \%{"$base\::FIELDS"};
- my $derived_fields = \%{"$derived\::FIELDS"};
-
- $attr{$derived}[@{$attr{$base}}-1] = undef;
- while (my($k,$v) = each %$base_fields) {
- next if $attr{$base}[$v-1] & _PRIVATE;
- $attr{$derived}[$v-1] = _INHERITED;
- $derived_fields->{$k} = $v;
- }
- }
-
+ $derived_attr->[0] = $base_attr ? scalar(@$base_attr) : 1;
+ while (my($k,$v) = each %$base_fields) {
+ my($fno);
+ if ($fno = $derived_fields->{$k} and $fno != $v) {
+ require Carp;
+ Carp::croak ("Inherited %FIELDS can't override existing %FIELDS");
+ }
+ if ($base_attr->[$v] & _PRIVATE) {
+ $derived_attr->[$v] = undef;
+ } else {
+ $derived_attr->[$v] = $base_attr->[$v];
+ $derived_fields->{$k} = $v;
+ }
+ }
}
sub _dump # sometimes useful for debugging
{
- for my $pkg (sort keys %attr) {
- print "\n$pkg";
- if (defined @{"$pkg\::ISA"}) {
- print " (", join(", ", @{"$pkg\::ISA"}), ")";
- }
- print "\n";
- my $fields = \%{"$pkg\::FIELDS"};
- for my $f (sort {$fields->{$a} <=> $fields->{$b}} keys %$fields) {
- my $no = $fields->{$f};
- print " $no: $f";
- my $fattr = $attr{$pkg}[$no-1];
- if (defined $fattr) {
- my @a;
- push(@a, "public") if $fattr & _PUBLIC;
- push(@a, "private") if $fattr & _PRIVATE;
- push(@a, "inherited") if $fattr & _INHERITED;
- print "\t(", join(", ", @a), ")";
- }
- print "\n";
- }
- }
+ for my $pkg (sort keys %attr) {
+ print "\n$pkg";
+ if (@{"$pkg\::ISA"}) {
+ print " (", join(", ", @{"$pkg\::ISA"}), ")";
+ }
+ print "\n";
+ my $fields = \%{"$pkg\::FIELDS"};
+ for my $f (sort {$fields->{$a} <=> $fields->{$b}} keys %$fields) {
+ my $no = $fields->{$f};
+ print " $no: $f";
+ my $fattr = $attr{$pkg}[$no];
+ if (defined $fattr) {
+ my @a;
+ push(@a, "public") if $fattr & _PUBLIC;
+ push(@a, "private") if $fattr & _PRIVATE;
+ push(@a, "inherited") if $no < $attr{$pkg}[0];
+ print "\t(", join(", ", @a), ")";
+ }
+ print "\n";
+ }
+ }
+}
+
+sub new {
+ my $class = shift;
+ $class = ref $class if ref $class;
+ return bless [\%{$class . "::FIELDS"}], $class;
+}
+
+sub phash {
+ my $h;
+ my $v;
+ if (@_) {
+ if (ref $_[0] eq 'ARRAY') {
+ my $a = shift;
+ @$h{@$a} = 1 .. @$a;
+ if (@_) {
+ $v = shift;
+ unless (! @_ and ref $v eq 'ARRAY') {
+ require Carp;
+ Carp::croak ("Expected at most two array refs\n");
+ }
+ }
+ }
+ else {
+ if (@_ % 2) {
+ require Carp;
+ Carp::croak ("Odd number of elements initializing pseudo-hash\n");
+ }
+ my $i = 0;
+ @$h{grep ++$i % 2, @_} = 1 .. @_ / 2;
+ $i = 0;
+ $v = [grep $i++ % 2, @_];
+ }
+ }
+ else {
+ $h = {};
+ $v = [];
+ }
+ [ $h, @$v ];
}
1;
diff --git a/contrib/perl5/lib/filetest.pm b/contrib/perl5/lib/filetest.pm
new file mode 100644
index 0000000..b52a9b48
--- /dev/null
+++ b/contrib/perl5/lib/filetest.pm
@@ -0,0 +1,68 @@
+package filetest;
+
+=head1 NAME
+
+filetest - Perl pragma to control the filetest permission operators
+
+=head1 SYNOPSIS
+
+ $can_perhaps_read = -r "file"; # use the mode bits
+ {
+ use filetest 'access'; # intuit harder
+ $can_really_read = -r "file";
+ }
+ $can_perhaps_read = -r "file"; # use the mode bits again
+
+=head1 DESCRIPTION
+
+This pragma tells the compiler to change the behaviour of the filetest
+permissions operators, the C<-r> C<-w> C<-x> C<-R> C<-W> C<-X>
+(see L<perlfunc>).
+
+The default behaviour to use the mode bits as returned by the stat()
+family of calls. This, however, may not be the right thing to do if
+for example various ACL (access control lists) schemes are in use.
+For such environments, C<use filetest> may help the permission
+operators to return results more consistent with other tools.
+
+Each "use filetest" or "no filetest" affects statements to the end of
+the enclosing block.
+
+There may be a slight performance decrease in the filetests
+when C<use filetest> is in effect, because in some systems
+the extended functionality needs to be emulated.
+
+B<NOTE>: using the file tests for security purposes is a lost cause
+from the start: there is a window open for race conditions (who is to
+say that the permissions will not change between the test and the real
+operation?). Therefore if you are serious about security, just try
+the real operation and test for its success. Think atomicity.
+
+=head2 subpragma access
+
+Currently only one subpragma, C<access> is implemented. It enables
+(or disables) the use of access() or similar system calls. This
+extended filetest functionality is used only when the argument of the
+operators is a filename, not when it is a filehandle.
+
+=cut
+
+$filetest::hint_bits = 0x00400000;
+
+sub import {
+ if ( $_[1] eq 'access' ) {
+ $^H |= $filetest::hint_bits;
+ } else {
+ die "filetest: the only implemented subpragma is 'access'.\n";
+ }
+}
+
+sub unimport {
+ if ( $_[1] eq 'access' ) {
+ $^H &= ~$filetest::hint_bits;
+ } else {
+ die "filetest: the only implemented subpragma is 'access'.\n";
+ }
+}
+
+1;
diff --git a/contrib/perl5/lib/flush.pl b/contrib/perl5/lib/flush.pl
index 55002b9..8aa6d55 100644
--- a/contrib/perl5/lib/flush.pl
+++ b/contrib/perl5/lib/flush.pl
@@ -1,3 +1,12 @@
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: IO::Handle
+#
;# Usage: &flush(FILEHANDLE)
;# flushes the named filehandle
diff --git a/contrib/perl5/lib/ftp.pl b/contrib/perl5/lib/ftp.pl
index fd78162..aa6a489 100644
--- a/contrib/perl5/lib/ftp.pl
+++ b/contrib/perl5/lib/ftp.pl
@@ -1,4 +1,13 @@
#-*-perl-*-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Net::FTP
+#
# This is a wrapper to the chat2.pl routines that make life easier
# to do ftp type work.
# Mostly by Lee McLoughlin <lmjm@doc.ic.ac.uk>
diff --git a/contrib/perl5/lib/getcwd.pl b/contrib/perl5/lib/getcwd.pl
index 9dd6945..eca6ba1 100644
--- a/contrib/perl5/lib/getcwd.pl
+++ b/contrib/perl5/lib/getcwd.pl
@@ -1,5 +1,14 @@
# By Brandon S. Allbery
#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
+#
# Usage: $cwd = &getcwd;
sub getcwd
diff --git a/contrib/perl5/lib/getopt.pl b/contrib/perl5/lib/getopt.pl
index f871e41..77d8d89 100644
--- a/contrib/perl5/lib/getopt.pl
+++ b/contrib/perl5/lib/getopt.pl
@@ -1,5 +1,13 @@
;# $RCSfile: getopt.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:23:58 $
-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternatives: Getopt::Long or Getopt::Std
+#
;# Process single-character switches with switch clustering. Pass one argument
;# which is a string containing all switches that take an argument. For each
;# switch found, sets $opt_x (where x is the switch name) to the value of the
diff --git a/contrib/perl5/lib/getopts.pl b/contrib/perl5/lib/getopts.pl
index 852aae8..2595819 100644
--- a/contrib/perl5/lib/getopts.pl
+++ b/contrib/perl5/lib/getopts.pl
@@ -1,5 +1,13 @@
;# getopts.pl - a better getopt.pl
-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternatives: Getopt::Long or Getopt::Std
+#
;# Usage:
;# do Getopts('a:bc'); # -a takes arg. -b & -c not. Sets opt_* as a
;# # side effect.
diff --git a/contrib/perl5/lib/hostname.pl b/contrib/perl5/lib/hostname.pl
index 5394c6e..63eea8f 100644
--- a/contrib/perl5/lib/hostname.pl
+++ b/contrib/perl5/lib/hostname.pl
@@ -1,5 +1,13 @@
# From: asherman@fmrco.com (Aaron Sherman)
-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Sys::Hostname
+#
sub hostname
{
local(*P,@tmp,$hostname,$_);
diff --git a/contrib/perl5/lib/integer.pm b/contrib/perl5/lib/integer.pm
index 8949318..86afcaf 100644
--- a/contrib/perl5/lib/integer.pm
+++ b/contrib/perl5/lib/integer.pm
@@ -28,16 +28,29 @@ code
you'll be left with C<$x == 1.5>, C<$y == 2> and C<$z == -1>. The $z
case happens because unary C<-> counts as an operation.
+Native integer arithmetic (as provided by your C compiler) is used.
+This means that Perl's own semantics for arithmetic operations may
+not be preserved. One common source of trouble is the modulus of
+negative numbers, which Perl does one way, but your hardware may do
+another.
+
+ % perl -le 'print (4 % -3)'
+ -2
+ % perl -Minteger -le 'print (4 % -3)'
+ 1
+
See L<perlmod/Pragmatic Modules>.
=cut
+$integer::hint_bits = 0x1;
+
sub import {
- $^H |= 1;
+ $^H |= $integer::hint_bits;
}
sub unimport {
- $^H &= ~1;
+ $^H &= ~$integer::hint_bits;
}
1;
diff --git a/contrib/perl5/lib/lib.pm b/contrib/perl5/lib/lib.pm
index 6e6e15e..98e2f73 100644
--- a/contrib/perl5/lib/lib.pm
+++ b/contrib/perl5/lib/lib.pm
@@ -1,55 +1,59 @@
package lib;
-use vars qw(@ORIG_INC);
+use 5.005_64;
use Config;
-my $archname = $Config{'archname'};
-
-@ORIG_INC = @INC; # take a handy copy of 'original' value
+my $archname = defined($Config{'archname'}) ? $Config{'archname'} : '';
+my $ver = defined($Config{'version'}) ? $Config{'version'} : '';
+my @inc_version_list = defined($Config{'inc_version_list'}) ?
+ reverse split / /, $Config{'inc_version_list'} : ();
+our @ORIG_INC = @INC; # take a handy copy of 'original' value
+our $VERSION = '0.5564';
sub import {
shift;
+
+ my %names;
foreach (reverse @_) {
- ## Ignore this if not defined.
- next unless defined($_);
if ($_ eq '') {
require Carp;
Carp::carp("Empty compile time value given to use lib");
- # at foo.pl line ...
}
if (-e && ! -d _) {
require Carp;
Carp::carp("Parameter to use lib must be directory, not file");
}
unshift(@INC, $_);
+ # Add any previous version directories we found at configure time
+ foreach my $incver (@inc_version_list)
+ {
+ unshift(@INC, "$_/$incver") if -d "$_/$incver";
+ }
# Put a corresponding archlib directory infront of $_ if it
# looks like $_ has an archlib directory below it.
- if (-d "$_/$archname") {
- unshift(@INC, "$_/$archname") if -d "$_/$archname/auto";
- unshift(@INC, "$_/$archname/$]") if -d "$_/$archname/$]/auto";
- }
+ unshift(@INC, "$_/$ver") if -d "$_/$ver";
+ unshift(@INC, "$_/$ver/$archname") if -d "$_/$ver/$archname";
}
+
+ # remove trailing duplicates
+ @INC = grep { ++$names{$_} == 1 } @INC;
+ return;
}
sub unimport {
shift;
- my $mode = shift if $_[0] =~ m/^:[A-Z]+/;
my %names;
- foreach(@_) {
+ foreach (@_) {
++$names{$_};
++$names{"$_/$archname"} if -d "$_/$archname/auto";
}
- if ($mode and $mode eq ':ALL') {
- # Remove ALL instances of each named directory.
- @INC = grep { !exists $names{$_} } @INC;
- } else {
- # Remove INITIAL instance(s) of each named directory.
- @INC = grep { --$names{$_} < 0 } @INC;
- }
+ # Remove ALL instances of each named directory.
+ @INC = grep { !exists $names{$_} } @INC;
+ return;
}
1;
@@ -74,7 +78,7 @@ It is typically used to add extra directories to perl's search path so
that later C<use> or C<require> statements will find modules which are
not located on perl's default search path.
-=head2 ADDING DIRECTORIES TO @INC
+=head2 Adding directories to @INC
The parameters to C<use lib> are added to the start of the perl search
path. Saying
@@ -90,10 +94,10 @@ checks to see if a directory called $dir/$archname/auto exists.
If so the $dir/$archname directory is assumed to be a corresponding
architecture specific directory and is added to @INC in front of $dir.
-If LIST includes both $dir and $dir/$archname then $dir/$archname will
-be added to @INC twice (if $dir/$archname/auto exists).
+To avoid memory leaks, all trailing duplicate entries in @INC are
+removed.
-=head2 DELETING DIRECTORIES FROM @INC
+=head2 Deleting directories from @INC
You should normally only add directories to @INC. If you need to
delete directories from @INC take care to only delete those which you
@@ -101,24 +105,15 @@ added yourself or which you are certain are not needed by other modules
in your script. Other modules may have added directories which they
need for correct operation.
-By default the C<no lib> statement deletes the I<first> instance of
-each named directory from @INC. To delete multiple instances of the
-same name from @INC you can specify the name multiple times.
-
-To delete I<all> instances of I<all> the specified names from @INC you can
-specify ':ALL' as the first parameter of C<no lib>. For example:
-
- no lib qw(:ALL .);
+The C<no lib> statement deletes all instances of each named directory
+from @INC.
For each directory in LIST (called $dir here) the lib module also
checks to see if a directory called $dir/$archname/auto exists.
If so the $dir/$archname directory is assumed to be a corresponding
architecture specific directory and is also deleted from @INC.
-If LIST includes both $dir and $dir/$archname then $dir/$archname will
-be deleted from @INC twice (if $dir/$archname/auto exists).
-
-=head2 RESTORING ORIGINAL @INC
+=head2 Restoring original @INC
When the lib module is first loaded it records the current value of @INC
in an array C<@lib::ORIG_INC>. To restore @INC to that value you
@@ -136,4 +131,3 @@ FindBin - optional module which deals with paths relative to the source file.
Tim Bunce, 2nd June 1995.
=cut
-
diff --git a/contrib/perl5/lib/locale.pm b/contrib/perl5/lib/locale.pm
index 48213ab..6314aca 100644
--- a/contrib/perl5/lib/locale.pm
+++ b/contrib/perl5/lib/locale.pm
@@ -20,14 +20,19 @@ locales for built-in operations (LC_CTYPE for regular expressions, and
LC_COLLATE for string comparison). Each "use locale" or "no locale"
affects statements to the end of the enclosing BLOCK.
+See L<perllocale> for more detailed information on how Perl supports
+locales.
+
=cut
+$locale::hint_bits = 0x800;
+
sub import {
- $^H |= 0x800;
+ $^H |= $locale::hint_bits;
}
sub unimport {
- $^H &= ~0x800;
+ $^H &= ~$locale::hint_bits;
}
1;
diff --git a/contrib/perl5/lib/look.pl b/contrib/perl5/lib/look.pl
index e8dc8aa..ccc9b61 100644
--- a/contrib/perl5/lib/look.pl
+++ b/contrib/perl5/lib/look.pl
@@ -1,5 +1,11 @@
;# Usage: &look(*FILEHANDLE,$key,$dict,$fold)
-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
;# Sets file position in FILEHANDLE to be first line greater than or equal
;# (stringwise) to $key. Pass flags for dictionary order and case folding.
diff --git a/contrib/perl5/lib/open.pm b/contrib/perl5/lib/open.pm
new file mode 100644
index 0000000..cdd20ac
--- /dev/null
+++ b/contrib/perl5/lib/open.pm
@@ -0,0 +1,76 @@
+package open;
+$open::hint_bits = 0x20000;
+
+sub import {
+ shift;
+ die "`use open' needs explicit list of disciplines" unless @_;
+ $^H |= $open::hint_bits;
+ while (@_) {
+ my $type = shift;
+ if ($type =~ /^(IN|OUT)\z/s) {
+ my $discp = shift;
+ unless ($discp =~ /^\s*:(raw|crlf)\s*\z/s) {
+ die "Unknown discipline '$discp'";
+ }
+ $^H{"open_$type"} = $discp;
+ }
+ else {
+ die "Unknown discipline class '$type'";
+ }
+ }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+open - perl pragma to set default disciplines for input and output
+
+=head1 SYNOPSIS
+
+ use open IN => ":crlf", OUT => ":raw";
+
+=head1 DESCRIPTION
+
+The open pragma is used to declare one or more default disciplines for
+I/O operations. Any open() and readpipe() (aka qx//) operators found
+within the lexical scope of this pragma will use the declared defaults.
+Neither open() with an explicit set of disciplines, nor sysopen() are
+influenced by this pragma.
+
+Only the two pseudo-disciplines ":raw" and ":crlf" are currently
+available.
+
+The ":raw" discipline corresponds to "binary mode" and the ":crlf"
+discipline corresponds to "text mode" on platforms that distinguish
+between the two modes when opening files (which is many DOS-like
+platforms, including Windows). These two disciplines are currently
+no-ops on platforms where binmode() is a no-op, but will be
+supported everywhere in future.
+
+=head1 UNIMPLEMENTED FUNCTIONALITY
+
+Full-fledged support for I/O disciplines is currently unimplemented.
+When they are eventually supported, this pragma will serve as one of
+the interfaces to declare default disciplines for all I/O.
+
+In future, any default disciplines declared by this pragma will be
+available by the special discipline name ":DEFAULT", and could be used
+within handle constructors that allow disciplines to be specified.
+This would make it possible to stack new disciplines over the default
+ones.
+
+ open FH, "<:para :DEFAULT", $file or die "can't open $file: $!";
+
+Socket and directory handles will also support disciplines in
+future.
+
+Full support for I/O disciplines will enable all of the supported
+disciplines to work on all platforms.
+
+=head1 SEE ALSO
+
+L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode>
+
+=cut
diff --git a/contrib/perl5/lib/overload.pm b/contrib/perl5/lib/overload.pm
index f06b49c..ba96bc9 100644
--- a/contrib/perl5/lib/overload.pm
+++ b/contrib/perl5/lib/overload.pm
@@ -1,5 +1,7 @@
package overload;
+$overload::hint_bits = 0x20000;
+
sub nil {}
sub OVERLOAD {
@@ -87,7 +89,7 @@ sub AddrRef {
}
sub StrVal {
- (OverloadedStringify($_[0])) ?
+ (OverloadedStringify($_[0]) or ref($_[0]) eq 'Regexp') ?
(AddrRef(shift)) :
"$_[0]";
}
@@ -113,21 +115,23 @@ sub mycan { # Real can would leave stubs.
%ops = ( with_assign => "+ - * / % ** << >> x .",
assign => "+= -= *= /= %= **= <<= >>= x= .=",
- str_comparison => "< <= > >= == !=",
+ num_comparison => "< <= > >= == !=",
'3way_comparison'=> "<=> cmp",
- num_comparison => "lt le gt ge eq ne",
+ str_comparison => "lt le gt ge eq ne",
binary => "& | ^",
unary => "neg ! ~",
mutators => '++ --',
func => "atan2 cos sin exp abs log sqrt",
conversion => 'bool "" 0+',
+ iterators => '<>',
+ dereferencing => '${} @{} %{} &{} *{}',
special => 'nomethod fallback =');
sub constant {
# Arguments: what, sub
while (@_) {
$^H{$_[0]} = $_[1];
- $^H |= $constants{$_[0]} | 0x20000;
+ $^H |= $constants{$_[0]} | $overload::hint_bits;
shift, shift;
}
}
@@ -355,12 +359,29 @@ for "E<lt>" or "E<lt>=E<gt>" combined with either unary minus or subtraction.
"bool", "\"\"", "0+",
-If one or two of these operations are unavailable, the remaining ones can
+If one or two of these operations are not overloaded, the remaining ones can
be used instead. C<bool> is used in the flow control operators
(like C<while>) and for the ternary "C<?:>" operation. These functions can
return any arbitrary Perl value. If the corresponding operation for this value
is overloaded too, that operation will be called again with this value.
+=item * I<Iteration>
+
+ "<>"
+
+If not overloaded, the argument will be converted to a filehandle or
+glob (which may require a stringification). The same overloading
+happens both for the I<read-filehandle> syntax C<E<lt>$varE<gt>> and
+I<globbing> syntax C<E<lt>${var}E<gt>>.
+
+=item * I<Dereferencing>
+
+ '${}', '@{}', '%{}', '&{}', '*{}'.
+
+If not overloaded, the argument will be dereferenced I<as is>, thus
+should be of correct type. These functions should return a reference
+of correct type, or another object with overloaded dereferencing.
+
=item * I<Special>
"nomethod", "fallback", "=",
@@ -377,14 +398,16 @@ A computer-readable form of the above table is available in the hash
with_assign => '+ - * / % ** << >> x .',
assign => '+= -= *= /= %= **= <<= >>= x= .=',
- str_comparison => '< <= > >= == !=',
+ num_comparison => '< <= > >= == !=',
'3way_comparison'=> '<=> cmp',
- num_comparison => 'lt le gt ge eq ne',
+ str_comparison => 'lt le gt ge eq ne',
binary => '& | ^',
unary => 'neg ! ~',
mutators => '++ --',
func => 'atan2 cos sin exp abs log sqrt',
conversion => 'bool "" 0+',
+ iterators => '<>',
+ dereferencing => '${} @{} %{} &{} *{}',
special => 'nomethod fallback ='
=head2 Inheritance and overloading
@@ -582,6 +605,14 @@ C<E<lt>=E<gt>> or C<cmp>:
<, >, <=, >=, ==, != in terms of <=>
lt, gt, le, ge, eq, ne in terms of cmp
+=item I<Iterator>
+
+ <> in terms of builtin operations
+
+=item I<Dereferencing>
+
+ ${} @{} %{} &{} *{} in terms of builtin operations
+
=item I<Copy operator>
can be expressed in terms of an assignment to the dereferenced value, if this
@@ -844,6 +875,134 @@ numeric value.) This prints:
seven=vii, seven=7, eight=8
seven contains `i'
+=head2 Two-face references
+
+Suppose you want to create an object which is accessible as both an
+array reference, and a hash reference, similar to the builtin
+L<array-accessible-as-a-hash|perlref/"Pseudo-hashes: Using an array as
+a hash"> builtin Perl type. Let us make it better than the builtin
+type, there will be no restriction that you cannot use the index 0 of
+your array.
+
+ package two_refs;
+ use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
+ sub new {
+ my $p = shift;
+ bless \ [@_], $p;
+ }
+ sub gethash {
+ my %h;
+ my $self = shift;
+ tie %h, ref $self, $self;
+ \%h;
+ }
+
+ sub TIEHASH { my $p = shift; bless \ shift, $p }
+ my %fields;
+ my $i = 0;
+ $fields{$_} = $i++ foreach qw{zero one two three};
+ sub STORE {
+ my $self = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $$self->[$key] = shift;
+ }
+ sub FETCH {
+ my $self = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $$self->[$key];
+ }
+
+Now one can access an object using both the array and hash syntax:
+
+ my $bar = new two_refs 3,4,5,6;
+ $bar->[2] = 11;
+ $bar->{two} == 11 or die 'bad hash fetch';
+
+Note several important features of this example. First of all, the
+I<actual> type of $bar is a scalar reference, and we do not overload
+the scalar dereference. Thus we can get the I<actual> non-overloaded
+contents of $bar by just using C<$$bar> (what we do in functions which
+overload dereference). Similarly, the object returned by the
+TIEHASH() method is a scalar reference.
+
+Second, we create a new tied hash each time the hash syntax is used.
+This allows us not to worry about a possibility of a reference loop,
+would would lead to a memory leak.
+
+Both these problems can be cured. Say, if we want to overload hash
+dereference on a reference to an object which is I<implemented> as a
+hash itself, the only problem one has to circumvent is how to access
+this I<actual> hash (as opposed to the I<virtual> exhibited by
+overloaded dereference operator). Here is one possible fetching routine:
+
+ sub access_hash {
+ my ($self, $key) = (shift, shift);
+ my $class = ref $self;
+ bless $self, 'overload::dummy'; # Disable overloading of %{}
+ my $out = $self->{$key};
+ bless $self, $class; # Restore overloading
+ $out;
+ }
+
+To move creation of the tied hash on each access, one may an extra
+level of indirection which allows a non-circular structure of references:
+
+ package two_refs1;
+ use overload '%{}' => sub { ${shift()}->[1] },
+ '@{}' => sub { ${shift()}->[0] };
+ sub new {
+ my $p = shift;
+ my $a = [@_];
+ my %h;
+ tie %h, $p, $a;
+ bless \ [$a, \%h], $p;
+ }
+ sub gethash {
+ my %h;
+ my $self = shift;
+ tie %h, ref $self, $self;
+ \%h;
+ }
+
+ sub TIEHASH { my $p = shift; bless \ shift, $p }
+ my %fields;
+ my $i = 0;
+ $fields{$_} = $i++ foreach qw{zero one two three};
+ sub STORE {
+ my $a = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $a->[$key] = shift;
+ }
+ sub FETCH {
+ my $a = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $a->[$key];
+ }
+
+Now if $baz is overloaded like this, then C<$bar> is a reference to a
+reference to the intermediate array, which keeps a reference to an
+actual array, and the access hash. The tie()ing object for the access
+hash is also a reference to a reference to the actual array, so
+
+=over
+
+=item *
+
+There are no loops of references.
+
+=item *
+
+Both "objects" which are blessed into the class C<two_refs1> are
+references to a reference to an array, thus references to a I<scalar>.
+Thus the accessor expression C<$$foo-E<gt>[$ind]> involves no
+overloaded operations.
+
+=back
+
=head2 Symbolic calculator
Put this in F<symbolic.pm> in your Perl library directory:
@@ -872,7 +1031,7 @@ circumscribed octagon using the above package:
my $iter = 1; # 2**($iter+2) = 8
my $side = new symbolic 1;
my $cnt = $iter;
-
+
while ($cnt--) {
$side = (sqrt(1 + $side**2) - 1)/$side;
}
@@ -997,7 +1156,7 @@ Use this module like this:
my $iter = new symbolic 2; # 16-gon
my $side = new symbolic 1;
my $cnt = $iter;
-
+
while ($cnt) {
$cnt = $cnt - 1; # Mutator `--' not implemented
$side = (sqrt(1 + $side**2) - 1)/$side;
diff --git a/contrib/perl5/lib/perl5db.pl b/contrib/perl5/lib/perl5db.pl
index 4d05e6d..132e08e 100644
--- a/contrib/perl5/lib/perl5db.pl
+++ b/contrib/perl5/lib/perl5db.pl
@@ -2,17 +2,9 @@ package DB;
# Debugger for Perl 5.00x; perl5db.pl patch level:
-$VERSION = 1.0402;
+$VERSION = 1.07;
$header = "perl5db.pl version $VERSION";
-# Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
-# Latest version available: ftp://ftp.math.ohio-state.edu/pub/users/ilya/perl
-
-# modified Perl debugger, to be run from Emacs in perldb-mode
-# Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
-# Johan Vromans -- upgrade to 4.0 pl 10
-# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
-
#
# This file is automatically included if you do perl -d.
# It's probably not useful to include this yourself.
@@ -76,6 +68,8 @@ $header = "perl5db.pl version $VERSION";
# LineInfo - file or pipe to print line number info to. If it is a
# pipe, a short "emacs like" message is used.
#
+# RemotePort - host:port to connect to on remote host for remote debugging.
+#
# Example $rcfile: (delete leading hashes!)
#
# &parse_options("NonStop=1 LineInfo=db.out");
@@ -86,6 +80,15 @@ $header = "perl5db.pl version $VERSION";
# reset LineInfo to something "interactive"!)
#
##################################################################
+
+# Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
+# Latest version available: ftp://ftp.math.ohio-state.edu/pub/users/ilya/perl
+
+# modified Perl debugger, to be run from Emacs in perldb-mode
+# Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
+# Johan Vromans -- upgrade to 4.0 pl 10
+# Ilya Zakharevich -- patches after 5.001 (and some before ;-)
+
# Changelog:
# A lot of things changed after 0.94. First of all, core now informs
@@ -142,6 +145,48 @@ $header = "perl5db.pl version $VERSION";
# `b load' strips trailing whitespace.
# completion ignores leading `|'; takes into account current package
# when completing a subroutine name (same for `l').
+# Changes: 1.07: Many fixed by tchrist 13-March-2000
+# BUG FIXES:
+# + Added bare mimimal security checks on perldb rc files, plus
+# comments on what else is needed.
+# + Fixed the ornaments that made "|h" completely unusable.
+# They are not used in print_help if they will hurt. Strip pod
+# if we're paging to less.
+# + Fixed mis-formatting of help messages caused by ornaments
+# to restore Larry's original formatting.
+# + Fixed many other formatting errors. The code is still suboptimal,
+# and needs a lot of work at restructuing. It's also misindented
+# in many places.
+# + Fixed bug where trying to look at an option like your pager
+# shows "1".
+# + Fixed some $? processing. Note: if you use csh or tcsh, you will
+# lose. You should consider shell escapes not using their shell,
+# or else not caring about detailed status. This should really be
+# unified into one place, too.
+# + Fixed bug where invisible trailing whitespace on commands hoses you,
+# tricking Perl into thinking you wern't calling a debugger command!
+# + Fixed bug where leading whitespace on commands hoses you. (One
+# suggests a leading semicolon or any other irrelevant non-whitespace
+# to indicate literal Perl code.)
+# + Fixed bugs that ate warnings due to wrong selected handle.
+# + Fixed a precedence bug on signal stuff.
+# + Fixed some unseemly wording.
+# + Fixed bug in help command trying to call perl method code.
+# + Fixed to call dumpvar from exception handler. SIGPIPE killed us.
+# ENHANCEMENTS:
+# + Added some comments. This code is still nasty spaghetti.
+# + Added message if you clear your pre/post command stacks which was
+# very easy to do if you just typed a bare >, <, or {. (A command
+# without an argument should *never* be a destructive action; this
+# API is fundamentally screwed up; likewise option setting, which
+# is equally buggered.)
+# + Added command stack dump on argument of "?" for >, <, or {.
+# + Added a semi-built-in doc viewer command that calls man with the
+# proper %Config::Config path (and thus gets caching, man -k, etc),
+# or else perldoc on obstreperous platforms.
+# + Added to and rearranged the help information.
+# + Detected apparent misuse of { ... } to declare a block; this used
+# to work but now is a command, and mysteriously gave no complaint.
####################################################################
@@ -179,7 +224,8 @@ $inhibit_exit = $option{PrintRet} = 1;
TTY noTTY ReadLine NonStop LineInfo maxTraceLen
recallCommand ShellBang pager tkRunning ornaments
signalLevel warnLevel dieLevel inhibit_exit
- ImmediateStop bareStringify);
+ ImmediateStop bareStringify
+ RemotePort);
%optionVars = (
hashDepth => \$dumpvar::hashDepth,
@@ -197,6 +243,7 @@ $inhibit_exit = $option{PrintRet} = 1;
inhibit_exit => \$inhibit_exit,
maxTraceLen => \$maxtrace,
ImmediateStop => \$ImmediateStop,
+ RemotePort => \$remoteport,
);
%optionAction = (
@@ -216,6 +263,7 @@ $inhibit_exit = $option{PrintRet} = 1;
dieLevel => \&dieLevel,
tkRunning => \&tkRunning,
ornaments => \&ornaments,
+ RemotePort => \&RemotePort,
);
%optionRequire = (
@@ -225,43 +273,93 @@ $inhibit_exit = $option{PrintRet} = 1;
);
# These guys may be defined in $ENV{PERL5DB} :
-$rl = 1 unless defined $rl;
-$warnLevel = 1 unless defined $warnLevel;
-$dieLevel = 1 unless defined $dieLevel;
-$signalLevel = 1 unless defined $signalLevel;
-$pre = [] unless defined $pre;
-$post = [] unless defined $post;
-$pretype = [] unless defined $pretype;
+$rl = 1 unless defined $rl;
+$warnLevel = 0 unless defined $warnLevel;
+$dieLevel = 0 unless defined $dieLevel;
+$signalLevel = 1 unless defined $signalLevel;
+$pre = [] unless defined $pre;
+$post = [] unless defined $post;
+$pretype = [] unless defined $pretype;
+
warnLevel($warnLevel);
dieLevel($dieLevel);
signalLevel($signalLevel);
-&pager((defined($ENV{PAGER})
+
+&pager(
+ (defined($ENV{PAGER})
? $ENV{PAGER}
: ($^O eq 'os2'
? 'cmd /c more'
: 'more'))) unless defined $pager;
+setman();
&recallCommand("!") unless defined $prc;
&shellBang("!") unless defined $psh;
$maxtrace = 400 unless defined $maxtrace;
-if (-e "/dev/tty") {
+if (-e "/dev/tty") { # this is the wrong metric!
$rcfile=".perldb";
} else {
$rcfile="perldb.ini";
}
+# This isn't really safe, because there's a race
+# between checking and opening. The solution is to
+# open and fstat the handle, but then you have to read and
+# eval the contents. But then the silly thing gets
+# your lexical scope, which is unfortunately at best.
+sub safe_do {
+ my $file = shift;
+
+ # Just exactly what part of the word "CORE::" don't you understand?
+ local $SIG{__WARN__};
+ local $SIG{__DIE__};
+
+ unless (is_safe_file($file)) {
+ CORE::warn <<EO_GRIPE;
+perldb: Must not source insecure rcfile $file.
+ You or the superuser must be the owner, and it must not
+ be writable by anyone but its owner.
+EO_GRIPE
+ return;
+ }
+
+ do $file;
+ CORE::warn("perldb: couldn't parse $file: $@") if $@;
+}
+
+
+# Verifies that owner is either real user or superuser and that no
+# one but owner may write to it. This function is of limited use
+# when called on a path instead of upon a handle, because there are
+# no guarantees that filename (by dirent) whose file (by ino) is
+# eventually accessed is the same as the one tested.
+# Assumes that the file's existence is not in doubt.
+sub is_safe_file {
+ my $path = shift;
+ stat($path) || return; # mysteriously vaporized
+ my($dev,$ino,$mode,$nlink,$uid,$gid) = stat(_);
+
+ return 0 if $uid != 0 && $uid != $<;
+ return 0 if $mode & 022;
+ return 1;
+}
+
if (-f $rcfile) {
- do "./$rcfile";
-} elsif (defined $ENV{LOGDIR} and -f "$ENV{LOGDIR}/$rcfile") {
- do "$ENV{LOGDIR}/$rcfile";
-} elsif (defined $ENV{HOME} and -f "$ENV{HOME}/$rcfile") {
- do "$ENV{HOME}/$rcfile";
+ safe_do("./$rcfile");
+}
+elsif (defined $ENV{HOME} && -f "$ENV{HOME}/$rcfile") {
+ safe_do("$ENV{HOME}/$rcfile");
+}
+elsif (defined $ENV{LOGDIR} && -f "$ENV{LOGDIR}/$rcfile") {
+ safe_do("$ENV{LOGDIR}/$rcfile");
}
if (defined $ENV{PERLDB_OPTS}) {
parse_options($ENV{PERLDB_OPTS});
}
+# Here begin the unreadable code. It needs fixing.
+
if (exists $ENV{PERLDB_RESTART}) {
delete $ENV{PERLDB_RESTART};
# $restart = 1;
@@ -290,13 +388,16 @@ if (exists $ENV{PERLDB_RESTART}) {
if ($notty) {
$runnonstop = 1;
} else {
- # Is Perl being run from Emacs?
- $emacs = ((defined $main::ARGV[0]) and ($main::ARGV[0] eq '-emacs'));
- $rl = 0, shift(@main::ARGV) if $emacs;
+ # Is Perl being run from a slave editor or graphical debugger?
+ $slave_editor = ((defined $main::ARGV[0]) and ($main::ARGV[0] eq '-emacs'));
+ $rl = 0, shift(@main::ARGV) if $slave_editor;
#require Term::ReadLine;
- if (-e "/dev/tty") {
+ if ($^O eq 'cygwin') {
+ # /dev/tty is binary. use stdin for textmode
+ undef $console;
+ } elsif (-e "/dev/tty") {
$console = "/dev/tty";
} elsif ($^O eq 'dos' or -e "con" or $^O eq 'MSWin32') {
$console = "con";
@@ -304,30 +405,45 @@ if ($notty) {
$console = "sys\$command";
}
- if (($^O eq 'MSWin32') and ($emacs or defined $ENV{EMACS})) {
+ if (($^O eq 'MSWin32') and ($slave_editor or defined $ENV{EMACS})) {
$console = undef;
}
# Around a bug:
- if (defined $ENV{OS2_SHELL} and ($emacs or $ENV{WINDOWID})) { # In OS/2
+ if (defined $ENV{OS2_SHELL} and ($slave_editor or $ENV{WINDOWID})) { # In OS/2
+ $console = undef;
+ }
+
+ if ($^O eq 'epoc') {
$console = undef;
}
$console = $tty if defined $tty;
- if (defined $console) {
- open(IN,"+<$console") || open(IN,"<$console") || open(IN,"<&STDIN");
- open(OUT,"+>$console") || open(OUT,">$console") || open(OUT,">&STDERR")
- || open(OUT,">&STDOUT"); # so we don't dongle stdout
- } else {
- open(IN,"<&STDIN");
- open(OUT,">&STDERR") || open(OUT,">&STDOUT"); # so we don't dongle stdout
- $console = 'STDIN/OUT';
+ if (defined $remoteport) {
+ require IO::Socket;
+ $OUT = new IO::Socket::INET( Timeout => '10',
+ PeerAddr => $remoteport,
+ Proto => 'tcp',
+ );
+ if (!$OUT) { die "Could not create socket to connect to remote host."; }
+ $IN = $OUT;
}
- # so open("|more") can read from STDOUT and so we don't dingle stdin
- $IN = \*IN;
+ else {
+ if (defined $console) {
+ open(IN,"+<$console") || open(IN,"<$console") || open(IN,"<&STDIN");
+ open(OUT,"+>$console") || open(OUT,">$console") || open(OUT,">&STDERR")
+ || open(OUT,">&STDOUT"); # so we don't dongle stdout
+ } else {
+ open(IN,"<&STDIN");
+ open(OUT,">&STDERR") || open(OUT,">&STDOUT"); # so we don't dongle stdout
+ $console = 'STDIN/OUT';
+ }
+ # so open("|more") can read from STDOUT and so we don't dingle stdin
+ $IN = \*IN;
- $OUT = \*OUT;
+ $OUT = \*OUT;
+ }
select($OUT);
$| = 1; # for DB::OUT
select(STDOUT);
@@ -340,10 +456,10 @@ if ($notty) {
$header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
unless ($runnonstop) {
print $OUT "\nLoading DB routines from $header\n";
- print $OUT ("Emacs support ",
- $emacs ? "enabled" : "available",
+ print $OUT ("Editor support ",
+ $slave_editor ? "enabled" : "available",
".\n");
- print $OUT "\nEnter h or `h h' for help.\n\n";
+ print $OUT "\nEnter h or `h h' for help, or `$doccmd perldebug' for more help.\n\n";
}
}
@@ -416,7 +532,7 @@ EOP
$was_signal = $signal;
$signal = 0;
if ($single || ($trace & 1) || $was_signal) {
- if ($emacs) {
+ if ($slave_editor) {
$position = "\032\032$filename:$line:0\n";
print $LINEINFO $position;
} elsif ($package eq 'DB::fake') {
@@ -427,7 +543,7 @@ Debugged program terminated. Use B<q> to quit or B<R> to restart,
B<h q>, B<h R> or B<h O> to get additional info.
EOP
$package = 'main';
- $usercontext = '($@, $!, $,, $/, $\, $^W) = @saved;' .
+ $usercontext = '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' .
"package $package;"; # this won't let them modify, alas
} else {
$sub =~ s/\'/::/;
@@ -471,13 +587,14 @@ EOP
if $single & 4;
$start = $line;
$incr = -1; # for backward motion.
- @typeahead = @$pretype, @typeahead;
+ @typeahead = (@$pretype, @typeahead);
CMD:
while (($term || &setterm),
($term_pid == $$ or &resetterm),
defined ($cmd=&readline(" DB" . ('<' x $level) .
($#hist+1) . ('>' x $level) .
- " "))) {
+ " ")))
+ {
$single = 0;
$signal = 0;
$cmd =~ s/\\$/\n/ && do {
@@ -487,8 +604,19 @@ EOP
$cmd =~ /^$/ && ($cmd = $laststep);
push(@hist,$cmd) if length($cmd) > 1;
PIPE: {
+ $cmd =~ s/^\s+//s; # trim annoying leading whitespace
+ $cmd =~ s/\s+$//s; # trim annoying trailing whitespace
($i) = split(/\s+/,$cmd);
- eval "\$cmd =~ $alias{$i}", print $OUT $@ if $alias{$i};
+ if ($alias{$i}) {
+ # squelch the sigmangler
+ local $SIG{__DIE__};
+ local $SIG{__WARN__};
+ eval "\$cmd =~ $alias{$i}";
+ if ($@) {
+ print $OUT "Couldn't evaluate `$i' alias: $@";
+ next CMD;
+ }
+ }
$cmd =~ /^q$/ && ($exiting = 1) && exit 0;
$cmd =~ /^h$/ && do {
print_help($help);
@@ -496,10 +624,14 @@ EOP
$cmd =~ /^h\s+h$/ && do {
print_help($summary);
next CMD; };
- $cmd =~ /^h\s+(\S)$/ && do {
- my $asked = "\Q$1";
- if ($help =~ /^(?:[IB]<)$asked/m) {
- while ($help =~ /^((?:[IB]<)$asked([\s\S]*?)\n)(?!\s)/mg) {
+ # support long commands; otherwise bogus errors
+ # happen when you ask for h on <CR> for example
+ $cmd =~ /^h\s+(\S.*)$/ && do {
+ my $asked = $1; # for proper errmsg
+ my $qasked = quotemeta($asked); # for searching
+ # XXX: finds CR but not <CR>
+ if ($help =~ /^<?(?:[IB]<)$qasked/m) {
+ while ($help =~ /^(<?(?:[IB]<)$qasked([\s\S]*?)\n)(?!\s)/mg) {
print_help($1);
}
} else {
@@ -507,7 +639,7 @@ EOP
}
next CMD; };
$cmd =~ /^t$/ && do {
- ($trace & 1) ? ($trace &= ~1) : ($trace |= 1);
+ $trace ^= 1;
print $OUT "Trace = " .
(($trace & 1) ? "on" : "off" ) . "\n";
next CMD; };
@@ -532,7 +664,11 @@ EOP
if (defined &main::dumpvar) {
local $frame = 0;
local $doret = -2;
- &main::dumpvar($packname,@vars);
+ # must detect sigpipe failures
+ eval { &main::dumpvar($packname,@vars) };
+ if ($@) {
+ die unless $@ =~ /dumpvar print failed/;
+ }
} else {
print $OUT "dumpvar.pl not available.\n";
}
@@ -574,16 +710,26 @@ EOP
}
};
$cmd =~ s/^l\s+-\s*$/-/;
- $cmd =~ /^l\b\s*([\':A-Za-z_][\':\w]*)/ && do {
+ $cmd =~ /^([lb])\b\s*(\$.*)/s && do {
+ $evalarg = $2;
+ my ($s) = &eval;
+ print($OUT "Error: $@\n"), next CMD if $@;
+ $s = CvGV_name($s);
+ print($OUT "Interpreted as: $1 $s\n");
+ $cmd = "$1 $s";
+ };
+ $cmd =~ /^l\b\s*([\':A-Za-z_][\':\w]*(\[.*\])?)/s && do {
$subname = $1;
$subname =~ s/\'/::/;
$subname = $package."::".$subname
unless $subname =~ /::/;
$subname = "main".$subname if substr($subname,0,2) eq "::";
- @pieces = split(/:/,find_sub($subname));
+ @pieces = split(/:/,find_sub($subname) || $sub{$subname});
$subrange = pop @pieces;
$file = join(':', @pieces);
if ($file ne $filename) {
+ print $OUT "Switching to file '$file'.\n"
+ unless $slave_editor;
*dbline = $main::{'_<' . $file};
$max = $#dbline;
$filename = $file;
@@ -631,7 +777,7 @@ EOP
$i = $line if $i eq '.';
$i = 1 if $i < 1;
$incr = $end - $i;
- if ($emacs) {
+ if ($slave_editor) {
print $OUT "\032\032$filename:$i:0\n";
$i = $end;
} else {
@@ -667,11 +813,14 @@ EOP
}
}
}
+
+ if (not $had_breakpoints{$file} &= ~1) {
+ delete $had_breakpoints{$file};
+ }
}
undef %postponed;
undef %postponed_file;
undef %break_on_load;
- undef %had_breakpoints;
next CMD; };
$cmd =~ /^L$/ && do {
my $file;
@@ -682,7 +831,7 @@ EOP
for ($i = 1; $i <= $max; $i++) {
if (defined $dbline{$i}) {
- print "$file:\n" unless $was++;
+ print $OUT "$file:\n" unless $was++;
print $OUT " $i:\t", $dbline[$i];
($stop,$action) = split(/\0/, $dbline{$i});
print $OUT " break if (", $stop, ")\n"
@@ -746,7 +895,7 @@ EOP
$break_on_load{$::INC{$file}} = 1 if $::INC{$file};
$file .= '.pm', redo unless $file =~ /\./;
}
- $had_breakpoints{$file} = 1;
+ $had_breakpoints{$file} |= 1;
print $OUT "Will stop on load of `@{[join '\', `', sort keys %break_on_load]}'.\n";
next CMD; };
$cmd =~ /^b\b\s*(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ && do {
@@ -759,7 +908,7 @@ EOP
$postponed{$subname} = $break
? "break +0 if $cond" : "compile";
next CMD; };
- $cmd =~ /^b\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ && do {
+ $cmd =~ /^b\b\s*([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ && do {
$subname = $1;
$cond = $2 || '1';
$subname =~ s/\'/::/;
@@ -770,9 +919,9 @@ EOP
($file,$i) = (find_sub($subname) =~ /^(.*):(.*)$/);
$i += 0;
if ($i) {
- $filename = $file;
- *dbline = $main::{'_<' . $filename};
- $had_breakpoints{$filename} = 1;
+ local $filename = $file;
+ local *dbline = $main::{'_<' . $filename};
+ $had_breakpoints{$filename} |= 1;
$max = $#dbline;
++$i while $dbline[$i] == 0 && $i < $max;
$dbline{$i} =~ s/^[^\0]*/$cond/;
@@ -781,21 +930,22 @@ EOP
}
next CMD; };
$cmd =~ /^b\b\s*(\d*)\s*(.*)/ && do {
- $i = ($1?$1:$line);
+ $i = $1 || $line;
$cond = $2 || '1';
if ($dbline[$i] == 0) {
print $OUT "Line $i not breakable.\n";
} else {
- $had_breakpoints{$filename} = 1;
+ $had_breakpoints{$filename} |= 1;
$dbline{$i} =~ s/^[^\0]*/$cond/;
}
next CMD; };
- $cmd =~ /^d\b\s*(\d+)?/ && do {
- $i = ($1?$1:$line);
+ $cmd =~ /^d\b\s*(\d*)/ && do {
+ $i = $1 || $line;
$dbline{$i} =~ s/^[^\0]*//;
delete $dbline{$i} if $dbline{$i} eq '';
next CMD; };
$cmd =~ /^A$/ && do {
+ print $OUT "Deleting all actions...\n";
my $file;
for $file (keys %had_breakpoints) {
local *dbline = $main::{'_<' . $file};
@@ -808,6 +958,10 @@ EOP
delete $dbline{$i} if $dbline{$i} eq '';
}
}
+
+ unless ($had_breakpoints{$file} &= ~2) {
+ delete $had_breakpoints{$file};
+ }
}
next CMD; };
$cmd =~ /^O\s*$/ && do {
@@ -825,27 +979,90 @@ EOP
push @$post, action($1);
next CMD; };
$cmd =~ /^<\s*(.*)/ && do {
- $pre = [], next CMD unless $1;
+ unless ($1) {
+ print OUT "All < actions cleared.\n";
+ $pre = [];
+ next CMD;
+ }
+ if ($1 eq '?') {
+ unless (@$pre) {
+ print OUT "No pre-prompt Perl actions.\n";
+ next CMD;
+ }
+ print OUT "Perl commands run before each prompt:\n";
+ for my $action ( @$pre ) {
+ print "\t< -- $action\n";
+ }
+ next CMD;
+ }
$pre = [action($1)];
next CMD; };
$cmd =~ /^>\s*(.*)/ && do {
- $post = [], next CMD unless $1;
+ unless ($1) {
+ print OUT "All > actions cleared.\n";
+ $post = [];
+ next CMD;
+ }
+ if ($1 eq '?') {
+ unless (@$post) {
+ print OUT "No post-prompt Perl actions.\n";
+ next CMD;
+ }
+ print OUT "Perl commands run after each prompt:\n";
+ for my $action ( @$post ) {
+ print "\t> -- $action\n";
+ }
+ next CMD;
+ }
$post = [action($1)];
next CMD; };
$cmd =~ /^\{\{\s*(.*)/ && do {
+ if ($cmd =~ /^\{.*\}$/ && unbalanced(substr($cmd,2))) {
+ print OUT "{{ is now a debugger command\n",
+ "use `;{{' if you mean Perl code\n";
+ $cmd = "h {{";
+ redo CMD;
+ }
push @$pretype, $1;
next CMD; };
$cmd =~ /^\{\s*(.*)/ && do {
- $pretype = [], next CMD unless $1;
+ unless ($1) {
+ print OUT "All { actions cleared.\n";
+ $pretype = [];
+ next CMD;
+ }
+ if ($1 eq '?') {
+ unless (@$pretype) {
+ print OUT "No pre-prompt debugger actions.\n";
+ next CMD;
+ }
+ print OUT "Debugger commands run before each prompt:\n";
+ for my $action ( @$pretype ) {
+ print "\t{ -- $action\n";
+ }
+ next CMD;
+ }
+ if ($cmd =~ /^\{.*\}$/ && unbalanced(substr($cmd,1))) {
+ print OUT "{ is now a debugger command\n",
+ "use `;{' if you mean Perl code\n";
+ $cmd = "h {";
+ redo CMD;
+ }
$pretype = [$1];
next CMD; };
- $cmd =~ /^a\b\s*(\d+)(\s+(.*))?/ && do {
- $i = $1; $j = $3;
- if ($dbline[$i] == 0) {
- print $OUT "Line $i may not have an action.\n";
+ $cmd =~ /^a\b\s*(\d*)\s*(.*)/ && do {
+ $i = $1 || $line; $j = $2;
+ if (length $j) {
+ if ($dbline[$i] == 0) {
+ print $OUT "Line $i may not have an action.\n";
+ } else {
+ $had_breakpoints{$filename} |= 2;
+ $dbline{$i} =~ s/\0[^\0]*//;
+ $dbline{$i} .= "\0" . action($j);
+ }
} else {
$dbline{$i} =~ s/\0[^\0]*//;
- $dbline{$i} .= "\0" . action($j);
+ delete $dbline{$i} if $dbline{$i} eq '';
}
next CMD; };
$cmd =~ /^n$/ && do {
@@ -861,6 +1078,10 @@ EOP
$cmd =~ /^c\b\s*([\w:]*)\s*$/ && do {
end_report(), next CMD if $finished and $level <= 1;
$subname = $i = $1;
+ # Probably not needed, since we finish an interactive
+ # sub-session anyway...
+ # local $filename = $filename;
+ # local *dbline = *dbline; # XXX Would this work?!
if ($i =~ /\D/) { # subroutine name
$subname = $package."::".$subname
unless $subname =~ /::/;
@@ -869,7 +1090,7 @@ EOP
if ($i) {
$filename = $file;
*dbline = $main::{'_<' . $filename};
- $had_breakpoints{$filename}++;
+ $had_breakpoints{$filename} |= 1;
$max = $#dbline;
++$i while $dbline[$i] == 0 && $i < $max;
} else {
@@ -906,7 +1127,7 @@ EOP
set_list("PERLDB_INC", @ini_INC);
if ($0 eq '-e') {
for (1..$#{'::_<-e'}) { # The first line is PERL5DB
- chomp ($cl = $ {'::_<-e'}[$_]);
+ chomp ($cl = ${'::_<-e'}[$_]);
push @script, '-e', $cl;
}
} else {
@@ -970,8 +1191,8 @@ EOP
set_list("PERLDB_POST", @$post);
set_list("PERLDB_TYPEAHEAD", @typeahead);
$ENV{PERLDB_RESTART} = 1;
- #print "$^X, '-d', @flags, @script, ($emacs ? '-emacs' : ()), @ARGS";
- exec $^X, '-d', @flags, @script, ($emacs ? '-emacs' : ()), @ARGS;
+ #print "$^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS";
+ exec $^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS;
print $OUT "exec failed: $!\n";
last CMD; };
$cmd =~ /^T$/ && do {
@@ -993,6 +1214,9 @@ EOP
$inpat = $1;
$inpat =~ s:([^\\])/$:$1:;
if ($inpat ne "") {
+ # squelch the sigmangler
+ local $SIG{__DIE__};
+ local $SIG{__WARN__};
eval '$inpat =~ m'."\a$inpat\a";
if ($@ ne "") {
print $OUT "$@";
@@ -1008,7 +1232,7 @@ EOP
$start = 1 if ($start > $max);
last if ($start == $end);
if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
- if ($emacs) {
+ if ($slave_editor) {
print $OUT "\032\032$filename:$start:0\n";
} else {
print $OUT "$start:\t", $dbline[$start], "\n";
@@ -1022,9 +1246,12 @@ EOP
$inpat = $1;
$inpat =~ s:([^\\])\?$:$1:;
if ($inpat ne "") {
+ # squelch the sigmangler
+ local $SIG{__DIE__};
+ local $SIG{__WARN__};
eval '$inpat =~ m'."\a$inpat\a";
if ($@ ne "") {
- print $OUT "$@";
+ print $OUT $@;
next CMD;
}
$pat = $inpat;
@@ -1037,7 +1264,7 @@ EOP
$start = $max if ($start <= 0);
last if ($start == $end);
if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
- if ($emacs) {
+ if ($slave_editor) {
print $OUT "\032\032$filename:$start:0\n";
} else {
print $OUT "$start:\t", $dbline[$start], "\n";
@@ -1049,9 +1276,9 @@ EOP
next CMD; };
$cmd =~ /^$rc+\s*(-)?(\d+)?$/ && do {
pop(@hist) if length($cmd) > 1;
- $i = $1 ? ($#hist-($2?$2:1)) : ($2?$2:$#hist);
+ $i = $1 ? ($#hist-($2||1)) : ($2||$#hist);
$cmd = $hist[$i];
- print $OUT $cmd;
+ print $OUT $cmd, "\n";
redo CMD; };
$cmd =~ /^$sh$sh\s*([\x00-\xff]*)/ && do {
&system($1);
@@ -1067,37 +1294,62 @@ EOP
next CMD;
}
$cmd = $hist[$i];
- print $OUT $cmd;
+ print $OUT $cmd, "\n";
redo CMD; };
$cmd =~ /^$sh$/ && do {
&system($ENV{SHELL}||"/bin/sh");
next CMD; };
$cmd =~ /^$sh\s*([\x00-\xff]*)/ && do {
+ # XXX: using csh or tcsh destroys sigint retvals!
+ #&system($1); # use this instead
&system($ENV{SHELL}||"/bin/sh","-c",$1);
next CMD; };
$cmd =~ /^H\b\s*(-(\d+))?/ && do {
- $end = $2?($#hist-$2):0;
+ $end = $2 ? ($#hist-$2) : 0;
$hist = 0 if $hist < 0;
for ($i=$#hist; $i>$end; $i--) {
print $OUT "$i: ",$hist[$i],"\n"
unless $hist[$i] =~ /^.?$/;
};
next CMD; };
+ $cmd =~ /^(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?$/ && do {
+ runman($1);
+ next CMD; };
$cmd =~ s/^p$/print {\$DB::OUT} \$_/;
$cmd =~ s/^p\b/print {\$DB::OUT} /;
- $cmd =~ /^=/ && do {
- if (local($k,$v) = ($cmd =~ /^=\s*(\S+)\s+(.*)/)) {
- $alias{$k}="s~$k~$v~";
- print $OUT "$k = $v\n";
- } elsif ($cmd =~ /^=\s*$/) {
- foreach $k (sort keys(%alias)) {
- if (($v = $alias{$k}) =~ s~^s\~$k\~(.*)\~$~$1~) {
- print $OUT "$k = $v\n";
- } else {
+ $cmd =~ s/^=\s*// && do {
+ my @keys;
+ if (length $cmd == 0) {
+ @keys = sort keys %alias;
+ }
+ elsif (my($k,$v) = ($cmd =~ /^(\S+)\s+(\S.*)/)) {
+ # can't use $_ or kill //g state
+ for my $x ($k, $v) { $x =~ s/\a/\\a/g }
+ $alias{$k} = "s\a$k\a$v\a";
+ # squelch the sigmangler
+ local $SIG{__DIE__};
+ local $SIG{__WARN__};
+ unless (eval "sub { s\a$k\a$v\a }; 1") {
+ print $OUT "Can't alias $k to $v: $@\n";
+ delete $alias{$k};
+ next CMD;
+ }
+ @keys = ($k);
+ }
+ else {
+ @keys = ($cmd);
+ }
+ for my $k (@keys) {
+ if ((my $v = $alias{$k}) =~ ss\a$k\a(.*)\a$1) {
+ print $OUT "$k\t= $1\n";
+ }
+ elsif (defined $alias{$k}) {
print $OUT "$k\t$alias{$k}\n";
- };
- };
- };
+ }
+ else {
+ print "No alias for $k\n";
+ }
+ }
next CMD; };
$cmd =~ /^\|\|?\s*[^|]/ && do {
if ($pager =~ /^\|/) {
@@ -1106,25 +1358,29 @@ EOP
} else {
open(SAVEOUT,">&OUT") || &warn("Can't save DB::OUT");
}
+ fix_less();
unless ($piped=open(OUT,$pager)) {
&warn("Can't pipe output to `$pager'");
if ($pager =~ /^\|/) {
- open(OUT,">&STDOUT") || &warn("Can't restore DB::OUT");
+ open(OUT,">&STDOUT") # XXX: lost message
+ || &warn("Can't restore DB::OUT");
open(STDOUT,">&SAVEOUT")
|| &warn("Can't restore STDOUT");
close(SAVEOUT);
} else {
- open(OUT,">&STDOUT") || &warn("Can't restore DB::OUT");
+ open(OUT,">&STDOUT") # XXX: lost message
+ || &warn("Can't restore DB::OUT");
}
next CMD;
}
$SIG{PIPE}= \&DB::catch if $pager =~ /^\|/
- && "" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE};
+ && ("" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE});
$selected= select(OUT);
$|= 1;
select( $selected ), $selected= "" unless $cmd =~ /^\|\|/;
$cmd =~ s/^\|+\s*//;
- redo PIPE; };
+ redo PIPE;
+ };
# XXX Local variants do not work!
$cmd =~ s/^t\s/\$DB::trace |= 1;\n/;
$cmd =~ s/^s\s/\$DB::single = 1;\n/ && do {$laststep = 's'};
@@ -1139,14 +1395,27 @@ EOP
} continue { # CMD:
if ($piped) {
if ($pager =~ /^\|/) {
- $?= 0; close(OUT) || &warn("Can't close DB::OUT");
- &warn( "Pager `$pager' failed: ",
- ($?>>8) > 128 ? ($?>>8)-256 : ($?>>8),
- ( $? & 128 ) ? " (core dumped)" : "",
- ( $? & 127 ) ? " (SIG ".($?&127).")" : "", "\n" ) if $?;
+ $? = 0;
+ # we cannot warn here: the handle is missing --tchrist
+ close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n";
+
+ # most of the $? crud was coping with broken cshisms
+ if ($?) {
+ print SAVEOUT "Pager `$pager' failed: ";
+ if ($? == -1) {
+ print SAVEOUT "shell returned -1\n";
+ } elsif ($? >> 8) {
+ print SAVEOUT
+ ( $? & 127 ) ? " (SIG#".($?&127).")" : "",
+ ( $? & 128 ) ? " -- core dumped" : "", "\n";
+ } else {
+ print SAVEOUT "status ", ($? >> 8), "\n";
+ }
+ }
+
open(OUT,">&STDOUT") || &warn("Can't restore DB::OUT");
open(STDOUT,">&SAVEOUT") || &warn("Can't restore STDOUT");
- $SIG{PIPE}= "DEFAULT" if $SIG{PIPE} eq \&DB::catch;
+ $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch;
# Will stop ignoring SIGPIPE if done like nohup(1)
# does SIGINT but Perl doesn't give us a choice.
} else {
@@ -1231,11 +1500,13 @@ sub save {
# The following takes its argument via $evalarg to preserve current @_
sub eval {
- my @res;
+ # 'my' would make it visible from user code
+ # but so does local! --tchrist
+ local @res;
{
- my $otrace = $trace;
- my $osingle = $single;
- my $od = $^D;
+ local $otrace = $trace;
+ local $osingle = $single;
+ local $od = $^D;
@res = eval "$usercontext $evalarg;\n"; # '\n' for nice recursive debug
$trace = $otrace;
$single = $osingle;
@@ -1264,7 +1535,7 @@ sub postponed_sub {
$i += $offset;
local *dbline = $main::{'_<' . $file};
local $^W = 0; # != 0 is magical below
- $had_breakpoints{$file}++;
+ $had_breakpoints{$file} |= 1;
my $max = $#dbline;
++$i until $dbline[$i] != 0 or $i >= $max;
$dbline{$i} = delete $postponed{$subname};
@@ -1292,11 +1563,11 @@ sub postponed {
if $break_on_load{$filename};
print $LINEINFO ' ' x $stack_depth, "Package $filename.\n" if $frame;
return unless $postponed_file{$filename};
- $had_breakpoints{$filename}++;
+ $had_breakpoints{$filename} |= 1;
#%dbline = %{$postponed_file{$filename}}; # Cannot be done: unsufficient magic
my $key;
for $key (keys %{$postponed_file{$filename}}) {
- $dbline{$key} = $ {$postponed_file{$filename}}{$key};
+ $dbline{$key} = ${$postponed_file{$filename}}{$key};
}
delete $postponed_file{$filename};
}
@@ -1412,6 +1683,20 @@ sub action {
$action;
}
+sub unbalanced {
+ # i hate using globals!
+ $balanced_brace_re ||= qr{
+ ^ \{
+ (?:
+ (?> [^{}] + ) # Non-parens without backtracking
+ |
+ (??{ $balanced_brace_re }) # Group with matching parens
+ ) *
+ \} $
+ }x;
+ return $_[0] !~ m/$balanced_brace_re/;
+}
+
sub gets {
local($.);
#<IN>;
@@ -1420,19 +1705,30 @@ sub gets {
sub system {
# We save, change, then restore STDIN and STDOUT to avoid fork() since
- # many non-Unix systems can do system() but have problems with fork().
+ # some non-Unix systems can do system() but have problems with fork().
open(SAVEIN,"<&STDIN") || &warn("Can't save STDIN");
open(SAVEOUT,">&STDOUT") || &warn("Can't save STDOUT");
open(STDIN,"<&IN") || &warn("Can't redirect STDIN");
open(STDOUT,">&OUT") || &warn("Can't redirect STDOUT");
+
+ # XXX: using csh or tcsh destroys sigint retvals!
system(@_);
open(STDIN,"<&SAVEIN") || &warn("Can't restore STDIN");
open(STDOUT,">&SAVEOUT") || &warn("Can't restore STDOUT");
- close(SAVEIN); close(SAVEOUT);
- &warn( "(Command returned ", ($?>>8) > 128 ? ($?>>8)-256 : ($?>>8), ")",
- ( $? & 128 ) ? " (core dumped)" : "",
- ( $? & 127 ) ? " (SIG ".($?&127).")" : "", "\n" ) if $?;
- $?;
+ close(SAVEIN);
+ close(SAVEOUT);
+
+
+ # most of the $? crud was coping with broken cshisms
+ if ($? >> 8) {
+ &warn("(Command exited ", ($? >> 8), ")\n");
+ } elsif ($?) {
+ &warn( "(Command died of SIG#", ($? & 127),
+ (($? & 128) ? " -- core dumped" : "") , ")", "\n");
+ }
+
+ return $?;
+
}
sub setterm {
@@ -1449,7 +1745,7 @@ sub setterm {
$| = 1;
select($sel);
} else {
- eval "require Term::Rendezvous;" or die $@;
+ eval "require Term::Rendezvous;" or die;
my $rv = $ENV{PERLDB_NOTTY} || "/tmp/perldbtty$$";
my $term_rv = new Term::Rendezvous $rv;
$IN = $term_rv->IN;
@@ -1518,7 +1814,15 @@ sub readline {
}
local $frame = 0;
local $doret = -2;
- $term->readline(@_);
+ if (ref $OUT and UNIVERSAL::isa($OUT, 'IO::Socket::INET')) {
+ print $OUT @_;
+ my $stuff;
+ $IN->recv( $stuff, 2048 ); # XXX: what's wrong with sysread?
+ $stuff;
+ }
+ else {
+ $term->readline(@_);
+ }
}
sub dump_option {
@@ -1532,15 +1836,15 @@ sub option_val {
my ($opt, $default)= @_;
my $val;
if (defined $optionVars{$opt}
- and defined $ {$optionVars{$opt}}) {
- $val = $ {$optionVars{$opt}};
+ and defined ${$optionVars{$opt}}) {
+ $val = ${$optionVars{$opt}};
} elsif (defined $optionAction{$opt}
and defined &{$optionAction{$opt}}) {
$val = &{$optionAction{$opt}}();
} elsif (defined $optionAction{$opt}
and not defined $option{$opt}
or defined $optionVars{$opt}
- and not defined $ {$optionVars{$opt}}) {
+ and not defined ${$optionVars{$opt}}) {
$val = $default;
} else {
$val = $option{$opt};
@@ -1550,8 +1854,16 @@ sub option_val {
sub parse_options {
local($_)= @_;
- while ($_ ne "") {
- s/^(\w+)(\s*$|\W)// or print($OUT "Invalid option `$_'\n"), last;
+ # too dangerous to let intuitive usage overwrite important things
+ # defaultion should never be the default
+ my %opt_needs_val = map { ( $_ => 1 ) } qw{
+ arrayDepth hashDepth LineInfo maxTraceLen ornaments
+ pager quote ReadLine recallCommand RemotePort ShellBang TTY
+ };
+ while (length) {
+ my $val_defaulted;
+ s/^\s+// && next;
+ s/^(\w+)(\W?)// or print($OUT "Invalid option `$_'\n"), last;
my ($opt,$sep) = ($1,$2);
my $val;
if ("?" eq $sep) {
@@ -1559,59 +1871,83 @@ sub parse_options {
if /^\S/;
#&dump_option($opt);
} elsif ($sep !~ /\S/) {
- $val = "1";
+ $val_defaulted = 1;
+ $val = "1"; # this is an evil default; make 'em set it!
} elsif ($sep eq "=") {
- s/^(\S*)($|\s+)//;
+
+ if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) {
+ my $quote = $1;
+ ($val = $2) =~ s/\\([$quote\\])/$1/g;
+ } else {
+ s/^(\S*)//;
$val = $1;
+ print OUT qq(Option better cleared using $opt=""\n)
+ unless length $val;
+ }
+
} else { #{ to "let some poor schmuck bounce on the % key in B<vi>."
my ($end) = "\\" . substr( ")]>}$sep", index("([<{",$sep), 1 ); #}
s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)// or
print($OUT "Unclosed option value `$opt$sep$_'\n"), last;
- $val = $1;
- $val =~ s/\\([\\$end])/$1/g;
+ ($val = $1) =~ s/\\([\\$end])/$1/g;
}
- my ($option);
- my $matches =
- grep( /^\Q$opt/ && ($option = $_), @options );
- $matches = grep( /^\Q$opt/i && ($option = $_), @options )
- unless $matches;
- print $OUT "Unknown option `$opt'\n" unless $matches;
- print $OUT "Ambiguous option `$opt'\n" if $matches > 1;
- $option{$option} = $val if $matches == 1 and defined $val;
- eval "local \$frame = 0; local \$doret = -2;
- require '$optionRequire{$option}'"
- if $matches == 1 and defined $optionRequire{$option} and defined $val;
- $ {$optionVars{$option}} = $val
- if $matches == 1
- and defined $optionVars{$option} and defined $val;
- & {$optionAction{$option}} ($val)
- if $matches == 1
- and defined $optionAction{$option}
- and defined &{$optionAction{$option}} and defined $val;
- &dump_option($option) if $matches == 1 && $OUT ne \*STDERR; # Not $rcfile
- s/^\s+//;
+
+ my $option;
+ my $matches = grep( /^\Q$opt/ && ($option = $_), @options )
+ || grep( /^\Q$opt/i && ($option = $_), @options );
+
+ print($OUT "Unknown option `$opt'\n"), next unless $matches;
+ print($OUT "Ambiguous option `$opt'\n"), next if $matches > 1;
+
+ if ($opt_needs_val{$option} && $val_defaulted) {
+ print $OUT "Option `$opt' is non-boolean. Use `O $option=VAL' to set, `O $option?' to query\n";
+ next;
+ }
+
+ $option{$option} = $val if defined $val;
+
+ eval qq{
+ local \$frame = 0;
+ local \$doret = -2;
+ require '$optionRequire{$option}';
+ 1;
+ } || die # XXX: shouldn't happen
+ if defined $optionRequire{$option} &&
+ defined $val;
+
+ ${$optionVars{$option}} = $val
+ if defined $optionVars{$option} &&
+ defined $val;
+
+ &{$optionAction{$option}} ($val)
+ if defined $optionAction{$option} &&
+ defined &{$optionAction{$option}} &&
+ defined $val;
+
+ # Not $rcfile
+ dump_option($option) unless $OUT eq \*STDERR;
}
}
sub set_list {
my ($stem,@list) = @_;
my $val;
- $ENV{"$ {stem}_n"} = @list;
+ $ENV{"${stem}_n"} = @list;
for $i (0 .. $#list) {
$val = $list[$i];
$val =~ s/\\/\\\\/g;
$val =~ s/([\0-\37\177\200-\377])/"\\0x" . unpack('H2',$1)/eg;
- $ENV{"$ {stem}_$i"} = $val;
+ $ENV{"${stem}_$i"} = $val;
}
}
sub get_list {
my $stem = shift;
my @list;
- my $n = delete $ENV{"$ {stem}_n"};
+ my $n = delete $ENV{"${stem}_n"};
my $val;
for $i (0 .. $n - 1) {
- $val = delete $ENV{"$ {stem}_$i"};
+ $val = delete $ENV{"${stem}_$i"};
$val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge;
push @list, $val;
}
@@ -1666,8 +2002,16 @@ sub ReadLine {
$rl;
}
+sub RemotePort {
+ if ($term) {
+ &warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_;
+ }
+ $remoteport = shift if @_;
+ $remoteport;
+}
+
sub tkRunning {
- if ($ {$term->Features}{tkRunning}) {
+ if (${$term->Features}{tkRunning}) {
return $term->tkRunning(@_);
} else {
print $OUT "tkRunning not supported by current ReadLine package.\n";
@@ -1729,7 +2073,7 @@ sub LineInfo {
return $lineinfo unless @_;
$lineinfo = shift;
my $stream = ($lineinfo =~ /^(\+?\>|\|)/) ? $lineinfo : ">$lineinfo";
- $emacs = ($stream =~ /^\|/);
+ $slave_editor = ($stream =~ /^\|/);
open(LINEINFO, "$stream") || &warn("Cannot open `$stream' for write");
$LINEINFO = \*LINEINFO;
my $save = select($LINEINFO);
@@ -1747,8 +2091,8 @@ sub list_versions {
s,/,::,g ;
s/^perl5db$/DB/;
s/^Term::ReadLine::readline$/readline/;
- if (defined $ { $_ . '::VERSION' }) {
- $version{$file} = "$ { $_ . '::VERSION' } from ";
+ if (defined ${ $_ . '::VERSION' }) {
+ $version{$file} = "${ $_ . '::VERSION' } from ";
}
$version{$file} .= $INC{$file};
}
@@ -1756,6 +2100,10 @@ sub list_versions {
}
sub sethelp {
+ # XXX: make sure these are tabs between the command and explantion,
+ # or print_help will screw up your formatting if you have
+ # eeevil ornaments enabled. This is an insane mess.
+
$help = "
B<T> Stack trace.
B<s> [I<expr>] Single step [in I<expr>].
@@ -1768,11 +2116,18 @@ B<l> I<min>B<+>I<incr> List I<incr>+1 lines starting at I<min>.
B<l> I<min>B<->I<max> List lines I<min> through I<max>.
B<l> I<line> List single I<line>.
B<l> I<subname> List first window of lines from subroutine.
+B<l> I<\$var> List first window of lines from subroutine referenced by I<\$var>.
B<l> List next window of lines.
B<-> List previous window of lines.
B<w> [I<line>] List window around I<line>.
B<.> Return to the executed line.
-B<f> I<filename> Switch to viewing I<filename>. Must be loaded.
+B<f> I<filename> Switch to viewing I<filename>. File must be already loaded.
+ I<filename> may be either the full name of the file, or a regular
+ expression matching the full file name:
+ B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
+ Evals (with saved bodies) are considered to be filenames:
+ B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
+ (in the order of execution).
B</>I<pattern>B</> Search forwards for I<pattern>; final B</> is optional.
B<?>I<pattern>B<?> Search backwards for I<pattern>; final B<?> is optional.
B<L> List all breakpoints and actions.
@@ -1784,6 +2139,7 @@ B<b> [I<line>] [I<condition>]
I<condition> breaks if it evaluates to true, defaults to '1'.
B<b> I<subname> [I<condition>]
Set breakpoint at first line of subroutine.
+B<b> I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>.
B<b> B<load> I<filename> Set breakpoint on `require'ing the given file.
B<b> B<postpone> I<subname> [I<condition>]
Set breakpoint at first line of subroutine after
@@ -1793,10 +2149,12 @@ B<b> B<compile> I<subname>
B<d> [I<line>] Delete the breakpoint for I<line>.
B<D> Delete all breakpoints.
B<a> [I<line>] I<command>
- Set an action to be done before the I<line> is executed.
+ Set an action to be done before the I<line> is executed;
+ I<line> defaults to the current execution line.
Sequence is: check for breakpoint/watchpoint, print line
if necessary, do action, prompt user if necessary,
- execute expression.
+ execute line.
+B<a> [I<line>] Delete the action for I<line>.
B<A> Delete all actions.
B<W> I<expr> Add a global watch-expression.
B<W> Delete all watch-expressions.
@@ -1807,37 +2165,16 @@ B<x> I<expr> Evals expression in array context, dumps the result.
B<m> I<expr> Evals expression in array context, prints methods callable
on the first element of the result.
B<m> I<class> Prints methods callable via the given class.
-B<O> [I<opt>[B<=>I<val>]] [I<opt>B<\">I<val>B<\">] [I<opt>B<?>]...
- Set or query values of options. I<val> defaults to 1. I<opt> can
- be abbreviated. Several options can be listed.
- I<recallCommand>, I<ShellBang>: chars used to recall command or spawn shell;
- I<pager>: program for output of \"|cmd\";
- I<tkRunning>: run Tk while prompting (with ReadLine);
- I<signalLevel> I<warnLevel> I<dieLevel>: level of verbosity;
- I<inhibit_exit> Allows stepping off the end of the script.
- I<ImmediateStop> Debugger should stop as early as possible.
- The following options affect what happens with B<V>, B<X>, and B<x> commands:
- I<arrayDepth>, I<hashDepth>: print only first N elements ('' for all);
- I<compactDump>, I<veryCompact>: change style of array and hash dump;
- I<globPrint>: whether to print contents of globs;
- I<DumpDBFiles>: dump arrays holding debugged files;
- I<DumpPackages>: dump symbol tables of packages;
- I<DumpReused>: dump contents of \"reused\" addresses;
- I<quote>, I<HighBit>, I<undefPrint>: change style of string dump;
- I<bareStringify>: Do not print the overload-stringified value;
- Option I<PrintRet> affects printing of return value after B<r> command,
- I<frame> affects printing messages on entry and exit from subroutines.
- I<AutoTrace> affects printing messages on every possible breaking point.
- I<maxTraceLen> gives maximal length of evals/args listed in stack trace.
- I<ornaments> affects screen appearance of the command line.
- During startup options are initialized from \$ENV{PERLDB_OPTS}.
- You can put additional initialization options I<TTY>, I<noTTY>,
- I<ReadLine>, and I<NonStop> there (or use `B<R>' after you set them).
+
+B<<> ? List Perl commands to run before each prompt.
B<<> I<expr> Define Perl command to run before each prompt.
B<<<> I<expr> Add to the list of Perl commands to run before each prompt.
+B<>> ? List Perl commands to run after each prompt.
B<>> I<expr> Define Perl command to run after each prompt.
-B<>>B<>> I<expr> Add to the list of Perl commands to run after each prompt.
+B<>>B<>> I<expr> Add to the list of Perl commands to run after each prompt.
B<{> I<db_command> Define debugger command to run before each prompt.
+B<{> ? List debugger commands to run before each prompt.
+B<<> I<expr> Define Perl command to run before each prompt.
B<{{> I<db_command> Add to the list of debugger commands to run before each prompt.
B<$prc> I<number> Redo a previous command (default previous command).
B<$prc> I<-number> Redo number'th-to-last command.
@@ -1859,28 +2196,65 @@ B<R> Pure-man-restart of debugger, some of debugger state
Currently the following setting are preserved:
history, breakpoints and actions, debugger B<O>ptions
and the following command-line options: I<-w>, I<-I>, I<-e>.
+
+B<O> [I<opt>] ... Set boolean option to true
+B<O> [I<opt>B<?>] Query options
+B<O> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ...
+ Set options. Use quotes in spaces in value.
+ I<recallCommand>, I<ShellBang> chars used to recall command or spawn shell;
+ I<pager> program for output of \"|cmd\";
+ I<tkRunning> run Tk while prompting (with ReadLine);
+ I<signalLevel> I<warnLevel> I<dieLevel> level of verbosity;
+ I<inhibit_exit> Allows stepping off the end of the script.
+ I<ImmediateStop> Debugger should stop as early as possible.
+ I<RemotePort> Remote hostname:port for remote debugging
+ The following options affect what happens with B<V>, B<X>, and B<x> commands:
+ I<arrayDepth>, I<hashDepth> print only first N elements ('' for all);
+ I<compactDump>, I<veryCompact> change style of array and hash dump;
+ I<globPrint> whether to print contents of globs;
+ I<DumpDBFiles> dump arrays holding debugged files;
+ I<DumpPackages> dump symbol tables of packages;
+ I<DumpReused> dump contents of \"reused\" addresses;
+ I<quote>, I<HighBit>, I<undefPrint> change style of string dump;
+ I<bareStringify> Do not print the overload-stringified value;
+ Other options include:
+ I<PrintRet> affects printing of return value after B<r> command,
+ I<frame> affects printing messages on entry and exit from subroutines.
+ I<AutoTrace> affects printing messages on every possible breaking point.
+ I<maxTraceLen> gives maximal length of evals/args listed in stack trace.
+ I<ornaments> affects screen appearance of the command line.
+ During startup options are initialized from \$ENV{PERLDB_OPTS}.
+ You can put additional initialization options I<TTY>, I<noTTY>,
+ I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
+ `B<R>' after you set them).
+
+B<q> or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction.
B<h> [I<db_command>] Get help [on a specific debugger command], enter B<|h> to page.
B<h h> Summary of debugger commands.
-B<q> or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction.
+B<$doccmd> I<manpage> Runs the external doc viewer B<$doccmd> command on the
+ named Perl I<manpage>, or on B<$doccmd> itself if omitted.
+ Set B<\$DB::doccmd> to change viewer.
+
+Type `|h' for a paged display if this was too hard to read.
+
+"; # Fix balance of vi % matching: } }}
-";
$summary = <<"END_SUM";
I<List/search source lines:> I<Control script execution:>
B<l> [I<ln>|I<sub>] List source code B<T> Stack trace
B<-> or B<.> List previous/current line B<s> [I<expr>] Single step [in expr]
B<w> [I<line>] List around line B<n> [I<expr>] Next, steps over subs
- B<f> I<filename> View source in file <B<CR>> Repeat last B<n> or B<s>
+ B<f> I<filename> View source in file <B<CR>/B<Enter>> Repeat last B<n> or B<s>
B</>I<pattern>B</> B<?>I<patt>B<?> Search forw/backw B<r> Return from subroutine
B<v> Show versions of modules B<c> [I<ln>|I<sub>] Continue until position
I<Debugger controls:> B<L> List break/watch/actions
B<O> [...] Set debugger options B<t> [I<expr>] Toggle trace [trace expr]
- B<<>[B<<>] or B<{>[B<{>] [I<cmd>] Do before prompt B<b> [I<ln>|I<event>] [I<cnd>] Set breakpoint
- B<>>[B<>>] [I<cmd>] Do after prompt B<b> I<sub> [I<cnd>] Set breakpoint for sub
+ B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
B<$prc> [I<N>|I<pat>] Redo a previous command B<d> [I<ln>] or B<D> Delete a/all breakpoints
B<H> [I<-num>] Display last num commands B<a> [I<ln>] I<cmd> Do cmd before line
B<=> [I<a> I<val>] Define/list an alias B<W> I<expr> Add a watch expression
B<h> [I<db_cmd>] Get help on command B<A> or B<W> Delete all actions/watch
- B<|>[B<|>]I<dbcmd> Send output to pager B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
+ B<|>[B<|>]I<db_cmd> Send output to pager B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
B<q> or B<^D> Quit B<R> Attempt a restart
I<Data Examination:> B<expr> Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
B<x>|B<m> I<expr> Evals expr in array context, dumps the result or lists methods.
@@ -1888,17 +2262,71 @@ I<Data Examination:> B<expr> Execute perl code, also see: B<s>,B<n>,B<
B<S> [[B<!>]I<pat>] List subroutine names [not] matching pattern
B<V> [I<Pk> [I<Vars>]] List Variables in Package. Vars can be ~pattern or !pattern.
B<X> [I<Vars>] Same as \"B<V> I<current_package> [I<Vars>]\".
+For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
END_SUM
- # ')}}; # Fix balance of Emacs parsing
+ # ')}}; # Fix balance of vi % matching
}
sub print_help {
- my $message = shift;
- if (@Term::ReadLine::TermCap::rl_term_set) {
- $message =~ s/B<([^>]+|>)>/$Term::ReadLine::TermCap::rl_term_set[2]$1$Term::ReadLine::TermCap::rl_term_set[3]/g;
- $message =~ s/I<([^>]+|>)>/$Term::ReadLine::TermCap::rl_term_set[0]$1$Term::ReadLine::TermCap::rl_term_set[1]/g;
- }
- print $OUT $message;
+ local $_ = shift;
+
+ # Restore proper alignment destroyed by eeevil I<> and B<>
+ # ornaments: A pox on both their houses!
+ #
+ # A help command will have everything up to and including
+ # the first tab sequence paddeed into a field 16 (or if indented 20)
+ # wide. If it's wide than that, an extra space will be added.
+ s{
+ ^ # only matters at start of line
+ ( \040{4} | \t )* # some subcommands are indented
+ ( < ? # so <CR> works
+ [BI] < [^\t\n] + ) # find an eeevil ornament
+ ( \t+ ) # original separation, discarded
+ ( .* ) # this will now start (no earlier) than
+ # column 16
+ } {
+ my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4);
+ my $clean = $command;
+ $clean =~ s/[BI]<([^>]*)>/$1/g;
+ # replace with this whole string:
+ (length($leadwhite) ? " " x 4 : "")
+ . $command
+ . ((" " x (16 + (length($leadwhite) ? 4 : 0) - length($clean))) || " ")
+ . $text;
+
+ }mgex;
+
+ s{ # handle bold ornaments
+ B < ( [^>] + | > ) >
+ } {
+ $Term::ReadLine::TermCap::rl_term_set[2]
+ . $1
+ . $Term::ReadLine::TermCap::rl_term_set[3]
+ }gex;
+
+ s{ # handle italic ornaments
+ I < ( [^>] + | > ) >
+ } {
+ $Term::ReadLine::TermCap::rl_term_set[0]
+ . $1
+ . $Term::ReadLine::TermCap::rl_term_set[1]
+ }gex;
+
+ print $OUT $_;
+}
+
+sub fix_less {
+ return if defined $ENV{LESS} && $ENV{LESS} =~ /r/;
+ my $is_less = $pager =~ /\bless\b/;
+ if ($pager =~ /\bmore\b/) {
+ my @st_more = stat('/usr/bin/more');
+ my @st_less = stat('/usr/bin/less');
+ $is_less = @st_more && @st_less
+ && $st_more[0] == $st_less[0]
+ && $st_more[1] == $st_less[1];
+ }
+ # changes environment!
+ $ENV{LESS} .= 'r' if $is_less;
}
sub diesignal {
@@ -1949,8 +2377,10 @@ sub dbdie {
}
eval { require Carp } if defined $^S; # If error/warning during compilation,
# require may be broken.
+
die(@_, "\nCannot print stack trace, load with -MCarp option to see stack")
unless defined &Carp::longmess;
+
# We do not want to debug this chunk (automatic disabling works
# inside DB::DB, but not in Carp).
my ($mysingle,$mytrace) = ($single,$trace);
@@ -2008,10 +2438,31 @@ sub signalLevel {
$signalLevel;
}
+sub CvGV_name {
+ my $in = shift;
+ my $name = CvGV_name_or_bust($in);
+ defined $name ? $name : $in;
+}
+
+sub CvGV_name_or_bust {
+ my $in = shift;
+ return if $skipCvGV; # Backdoor to avoid problems if XS broken...
+ $in = \&$in; # Hard reference...
+ eval {require Devel::Peek; 1} or return;
+ my $gv = Devel::Peek::CvGV($in) or return;
+ *$gv{PACKAGE} . '::' . *$gv{NAME};
+}
+
sub find_sub {
my $subr = shift;
- return unless defined &$subr;
$sub{$subr} or do {
+ return unless defined &$subr;
+ my $name = CvGV_name_or_bust($subr);
+ my $data;
+ $data = $sub{$name} if defined $name;
+ return $data if defined $data;
+
+ # Old stupid way...
$subr = \&$subr; # Hard reference
my $s;
for (keys %sub) {
@@ -2036,18 +2487,81 @@ sub methods_via {
my $prefix = shift;
my $prepend = $prefix ? "via $prefix: " : '';
my $name;
- for $name (grep {defined &{$ {"$ {class}::"}{$_}}}
- sort keys %{"$ {class}::"}) {
+ for $name (grep {defined &{${"${class}::"}{$_}}}
+ sort keys %{"${class}::"}) {
next if $seen{ $name }++;
print $DB::OUT "$prepend$name\n";
}
return unless shift; # Recurse?
- for $name (@{"$ {class}::ISA"}) {
+ for $name (@{"${class}::ISA"}) {
$prepend = $prefix ? $prefix . " -> $name" : $name;
methods_via($name, $prepend, 1);
}
}
+sub setman {
+ $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|MacOS)\z/s
+ ? "man" # O Happy Day!
+ : "perldoc"; # Alas, poor unfortunates
+}
+
+sub runman {
+ my $page = shift;
+ unless ($page) {
+ &system("$doccmd $doccmd");
+ return;
+ }
+ # this way user can override, like with $doccmd="man -Mwhatever"
+ # or even just "man " to disable the path check.
+ unless ($doccmd eq 'man') {
+ &system("$doccmd $page");
+ return;
+ }
+
+ $page = 'perl' if lc($page) eq 'help';
+
+ require Config;
+ my $man1dir = $Config::Config{'man1dir'};
+ my $man3dir = $Config::Config{'man3dir'};
+ for ($man1dir, $man3dir) { s#/[^/]*\z## if /\S/ }
+ my $manpath = '';
+ $manpath .= "$man1dir:" if $man1dir =~ /\S/;
+ $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir;
+ chop $manpath if $manpath;
+ # harmless if missing, I figure
+ my $oldpath = $ENV{MANPATH};
+ $ENV{MANPATH} = $manpath if $manpath;
+ my $nopathopt = $^O =~ /dunno what goes here/;
+ if (system($doccmd,
+ # I just *know* there are men without -M
+ (($manpath && !$nopathopt) ? ("-M", $manpath) : ()),
+ split ' ', $page) )
+ {
+ unless ($page =~ /^perl\w/) {
+ if (grep { $page eq $_ } qw{
+ 5004delta 5005delta amiga api apio book boot bot call compile
+ cygwin data dbmfilter debug debguts delta diag doc dos dsc embed
+ faq faq1 faq2 faq3 faq4 faq5 faq6 faq7 faq8 faq9 filter fork
+ form func guts hack hist hpux intern ipc lexwarn locale lol mod
+ modinstall modlib number obj op opentut os2 os390 pod port
+ ref reftut run sec style sub syn thrtut tie toc todo toot tootc
+ trap unicode var vms win32 xs xstut
+ })
+ {
+ $page =~ s/^/perl/;
+ system($doccmd,
+ (($manpath && !$nopathopt) ? ("-M", $manpath) : ()),
+ $page);
+ }
+ }
+ }
+ if (defined $oldpath) {
+ $ENV{MANPATH} = $manpath;
+ } else {
+ delete $ENV{MANPATH};
+ }
+}
+
# The following BEGIN is very handy if debugger goes havoc, debugging debugger?
BEGIN { # This does not compile, alas.
@@ -2085,7 +2599,7 @@ sub db_complete {
# Specific code for b c l V m f O, &blah, $blah, @blah, %blah
my($text, $line, $start) = @_;
my ($itext, $search, $prefix, $pack) =
- ($text, "^\Q$ {'package'}::\E([^:]+)\$");
+ ($text, "^\Q${'package'}::\E([^:]+)\$");
return sort grep /^\Q$text/, (keys %sub), qw(postpone load compile), # subroutines
(map { /$search/ ? ($1) : () } keys %sub)
diff --git a/contrib/perl5/lib/pwd.pl b/contrib/perl5/lib/pwd.pl
index beb5916..6b429eb 100644
--- a/contrib/perl5/lib/pwd.pl
+++ b/contrib/perl5/lib/pwd.pl
@@ -1,5 +1,14 @@
;# pwd.pl - keeps track of current working directory in PWD environment var
;#
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Cwd
+#
;# $RCSfile: pwd.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:11 $
;#
;# $Log: pwd.pl,v $
@@ -16,7 +25,7 @@ sub main'initpwd {
if ($ENV{'PWD'}) {
local($dd,$di) = stat('.');
local($pd,$pi) = stat($ENV{'PWD'});
- if ($di != $pi || $dd != $pd) {
+ if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
chop($ENV{'PWD'} = `pwd`);
}
}
@@ -26,7 +35,7 @@ sub main'initpwd {
if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) {
local($pd,$pi) = stat($2);
local($dd,$di) = stat($1);
- if ($di == $pi && $dd == $pd) {
+ if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
$ENV{'PWD'}="$2$3";
}
}
diff --git a/contrib/perl5/lib/strict.pm b/contrib/perl5/lib/strict.pm
index 940e8bf..042227f 100644
--- a/contrib/perl5/lib/strict.pm
+++ b/contrib/perl5/lib/strict.pm
@@ -34,12 +34,14 @@ use symbolic references (see L<perlref>).
print $$ref; # ok
$ref = "foo";
print $$ref; # runtime error; normally ok
+ $file = "STDOUT";
+ print $file "Hi!"; # error; note: no comma after $file
=item C<strict vars>
This generates a compile-time error if you access a variable that wasn't
-declared via C<use vars>,
-localized via C<my()> or wasn't fully qualified. Because this is to avoid
+declared via "our" or C<use vars>,
+localized via C<my()>, or wasn't fully qualified. Because this is to avoid
variable suicide problems and subtle dynamic scoping issues, a merely
local() variable isn't good enough. See L<perlfunc/my> and
L<perlfunc/local>.
@@ -50,12 +52,15 @@ L<perlfunc/local>.
local $foo = 9; # blows up
package Cinna;
- use vars qw/ $bar /; # Declares $bar in current package
+ our $bar; # Declares $bar in current package
$bar = 'HgS'; # ok, global declared via pragma
The local() generated a compile-time error because you just touched a global
name without fully qualifying it.
+Because of their special use by sort(), the variables $a and $b are
+exempted from this check.
+
=item C<strict subs>
This disables the poetry optimization, generating a compile-time error if
diff --git a/contrib/perl5/lib/syslog.pl b/contrib/perl5/lib/syslog.pl
index 9e03399..70c439b 100644
--- a/contrib/perl5/lib/syslog.pl
+++ b/contrib/perl5/lib/syslog.pl
@@ -29,10 +29,12 @@
package syslog;
+use warnings::register;
+
$host = 'localhost' unless $host; # set $syslog'host to change
-if ($] >= 5) {
- warn "You should 'use Sys::Syslog' instead; continuing" # if $^W
+if ($] >= 5 && warnings::enabled()) {
+ warnings::warn "You should 'use Sys::Syslog' instead; continuing";
}
require 'syslog.ph';
diff --git a/contrib/perl5/lib/termcap.pl b/contrib/perl5/lib/termcap.pl
index 3731343..06da956 100644
--- a/contrib/perl5/lib/termcap.pl
+++ b/contrib/perl5/lib/termcap.pl
@@ -1,4 +1,13 @@
;# $RCSfile: termcap.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:16 $
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
+# Suggested alternative: Term::Cap
+#
;#
;# Usage:
;# require 'ioctl.pl';
diff --git a/contrib/perl5/lib/unicode/ArabLink.pl b/contrib/perl5/lib/unicode/ArabLink.pl
new file mode 100644
index 0000000..fd5ed8a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/ArabLink.pl
@@ -0,0 +1,46 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0622 0625 R
+0626 D
+0627 R
+0628 D
+0629 R
+062a 062e D
+062f 0632 R
+0633 063a D
+0640 C
+0641 0647 D
+0648 0649 R
+064a D
+0671 U
+0672 0673 R
+0674 U
+0675 0677 R
+0678 0687 D
+0688 0699 R
+069a 06bf D
+06c0 R
+06c1 D
+06c2 06cb R
+06cc D
+06cd R
+06ce D
+06cf R
+06d0 06d1 D
+06d2 06d3 R
+06d5 U
+06fa 06fc D
+0710 R
+0712 0714 D
+0715 0719 R
+071a 071d D
+071e R
+071f 0727 D
+0728 R
+0729 D
+072a R
+072b D
+072c R
+END
diff --git a/contrib/perl5/lib/unicode/ArabLnkGrp.pl b/contrib/perl5/lib/unicode/ArabLnkGrp.pl
new file mode 100644
index 0000000..61f30d4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/ArabLnkGrp.pl
@@ -0,0 +1,94 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0622 0623 ALEF
+0624 WAW
+0625 ALEF
+0626 YEH
+0627 ALEF
+0628 BEH
+0629 TEH MARBUTA
+062a 062b BEH
+062c 062e HAH
+062f 0630 DAL
+0631 0632 REH
+0633 0634 SEEN
+0635 0636 SAD
+0637 0638 TAH
+0639 063a AIN
+0640 <no shaping>
+0641 FEH
+0642 QAF
+0643 KAF
+0644 LAM
+0645 MEEM
+0646 NOON
+0647 HEH
+0648 WAW
+0649 064a YEH
+0671 <no shaping>
+0672 0673 ALEF
+0674 <no shaping>
+0675 ALEF
+0676 0677 WAW
+0678 YEH
+0679 0680 BEH
+0681 0687 HAH
+0688 0690 DAL
+0691 0699 REH
+069a 069c SEEN
+069d 069e SAD
+069f TAH
+06a0 AIN
+06a1 06a6 FEH
+06a7 06a8 QAF
+06a9 GAF
+06aa SWASH KAF
+06ab GAF
+06ac 06ae KAF
+06af 06b4 GAF
+06b5 06b8 LAM
+06b9 06bd NOON
+06be KNOTTED HEH
+06bf HAH
+06c0 TEH MARBUTA
+06c1 HEH GOAL
+06c2 06c3 HAMZA ON HEH GOAL
+06c4 06cb WAW
+06cc YEH
+06cd YEH WITH TAIL
+06ce YEH
+06cf WAW
+06d0 06d1 YEH
+06d2 06d3 YEH BARREE
+06d5 <no shaping>
+06fa SEEN
+06fb SAD
+06fc AIN
+0710 ALAPH
+0712 BETH
+0713 0714 GAMAL
+0715 0716 DALATH RISH
+0717 HE
+0718 WAW
+0719 ZAIN
+071a HETH
+071b 071c TETH
+071d YUDH
+071e YUDH HE
+071f KAPH
+0720 LAMADH
+0721 MIM
+0722 NUN
+0723 SEMKATH
+0724 FINAL SEMKATH
+0725 E
+0726 PE
+0727 REVERSED PE
+0728 SADHE
+0729 QAPH
+072a DALATH RISH
+072b SHIN
+072c TAW
+END
diff --git a/contrib/perl5/lib/unicode/ArabShap.txt b/contrib/perl5/lib/unicode/ArabShap.txt
new file mode 100644
index 0000000..6092d62
--- /dev/null
+++ b/contrib/perl5/lib/unicode/ArabShap.txt
@@ -0,0 +1,170 @@
+# Unicode; Schematic Name; Link; Link Group
+# Arabic characters
+0622; MADDA ON ALEF; R; ALEF
+0623; HAMZA ON ALEF; R; ALEF
+0624; HAMZA ON WAW; R; WAW
+0625; HAMZA UNDER ALEF; R; ALEF
+0626; HAMZA ON YEH; D; YEH
+0627; ALEF; R; ALEF
+0628; BEH; D; BEH
+0629; TEH MARBUTA; R; TEH MARBUTA
+062A; TEH; D; BEH
+062B; THEH; D; BEH
+062C; JEEM; D; HAH
+062D; HAH; D; HAH
+062E; KHAH; D; HAH
+062F; DAL; R; DAL
+0630; THAL; R; DAL
+0631; REH; R; REH
+0632; ZAIN; R; REH
+0633; SEEN; D; SEEN
+0634; SHEEN; D; SEEN
+0635; SAD; D; SAD
+0636; DAD; D; SAD
+0637; TAH; D; TAH
+0638; ZAH; D; TAH
+0639; AIN; D; AIN
+063A; GHAIN; D; AIN
+0640; TATWEEL; C; <no shaping>
+0641; FEH; D; FEH
+0642; QAF; D; QAF
+0643; KAF; D; KAF
+0644; LAM; D; LAM
+0645; MEEM; D; MEEM
+0646; NOON; D; NOON
+0647; HEH; D; HEH
+0648; WAW; R; WAW
+0649; ALEF MAKSURA; R; YEH
+064A; YEH; D; YEH
+0671; HAMZAT WASL ON ALEF; U; <no shaping>
+0672; WAVY HAMZA ON ALEF; R; ALEF
+0673; WAVY HAMZA UNDER ALEF; R; ALEF
+0674; HIGH HAMZA; U; <no shaping>
+0675; HIGH HAMZA ALEF; R; ALEF
+0676; HIGH HAMZA WAW; R; WAW
+0677; HIGH HAMZA WAW WITH DAMMA; R; WAW
+0678; HIGH HAMZA YEH; D; YEH
+0679; TEH WITH SMALL TAH; D; BEH
+067A; TEH WITH 2 DOTS VERTICAL ABOVE; D; BEH
+067B; BEH WITH 2 DOTS VERTICAL BELOW; D; BEH
+067C; TEH WITH RING; D; BEH
+067D; TEH WITH 3 DOTS ABOVE DOWNWARD; D; BEH
+067E; TEH WITH 3 DOTS BELOW; D; BEH
+067F; TEH WITH 4 DOTS ABOVE; D; BEH
+0680; BEH WITH 4 DOTS BELOW; D; BEH
+0681; HAMZA ON HAH; D; HAH
+0682; HAH WITH 2 DOTS VERTICAL ABOVE; D; HAH
+0683; HAH WITH MIDDLE 2 DOTS; D; HAH
+0684; HAH WITH MIDDLE 2 DOTS VERTICAL; D; HAH
+0685; HAH WITH 3 DOTS ABOVE; D; HAH
+0686; HAH WITH MIDDLE 3 DOTS DOWNWARD; D; HAH
+0687; HAH WITH MIDDLE 4 DOTS; D; HAH
+0688; DAL WITH SMALL TAH; R; DAL
+0689; DAL WITH RING; R; DAL
+068A; DAL WITH DOT BELOW; R; DAL
+068B; DAL WITH DOT BELOW AND SMALL TAH; R; DAL
+068C; DAL WITH 2 DOTS ABOVE; R; DAL
+068D; DAL WITH 2 DOTS BELOW; R; DAL
+068E; DAL WITH 3 DOTS ABOVE; R; DAL
+068F; DAL WITH 3 DOTS ABOVE DOWNWARD; R; DAL
+0690; DAL WITH 4 DOTS ABOVE; R; DAL
+0691; REH WITH SMALL TAH; R; REH
+0692; REH WITH SMALL V; R; REH
+0693; REH WITH RING; R; REH
+0694; REH WITH DOT BELOW; R; REH
+0695; REH WITH SMALL V BELOW; R; REH
+0696; REH WITH DOT BELOW AND DOT ABOVE; R; REH
+0697; REH WITH 2 DOTS ABOVE; R; REH
+0698; REH WITH 3 DOTS ABOVE; R; REH
+0699; REH WITH 4 DOTS ABOVE; R; REH
+069A; SEEN WITH DOT BELOW AND DOT ABOVE; D; SEEN
+069B; SEEN WITH 3 DOTS BELOW; D; SEEN
+069C; SEEN WITH 3 DOTS BELOW AND 3 DOTS ABOVE; D; SEEN
+069D; SAD WITH 2 DOTS BELOW; D; SAD
+069E; SAD WITH 3 DOTS ABOVE; D; SAD
+069F; TAH WITH 3 DOTS ABOVE; D; TAH
+06A0; AIN WITH 3 DOTS ABOVE; D; AIN
+06A1; DOTLESS FEH; D; FEH
+06A2; FEH WITH DOT MOVED BELOW; D; FEH
+06A3; FEH WITH DOT BELOW; D; FEH
+06A4; FEH WITH 3 DOTS ABOVE; D; FEH
+06A5; FEH WITH 3 DOTS BELOW; D; FEH
+06A6; FEH WITH 4 DOTS ABOVE; D; FEH
+06A7; QAF WITH DOT ABOVE; D; QAF
+06A8; QAF WITH 3 DOTS ABOVE; D; QAF
+06A9; OPEN KAF; D; GAF
+06AA; SWASH KAF; D; SWASH KAF
+06AB; KAF WITH RING; D; GAF
+06AC; KAF WITH DOT ABOVE; D; KAF
+06AD; KAF WITH 3 DOTS ABOVE; D; KAF
+06AE; KAF WITH 3 DOTS BELOW; D; KAF
+06AF; GAF; D; GAF
+06B0; GAF WITH RING; D; GAF
+06B1; GAF WITH 2 DOTS ABOVE; D; GAF
+06B2; GAF WITH 2 DOTS BELOW; D; GAF
+06B3; GAF WITH 2 DOTS VERTICAL BELOW; D; GAF
+06B4; GAF WITH 3 DOTS ABOVE; D; GAF
+06B5; LAM WITH SMALL V; D; LAM
+06B6; LAM WITH DOT ABOVE; D; LAM
+06B7; LAM WITH 3 DOTS ABOVE; D; LAM
+06B8; LAM WITH 3 DOTS BELOW; D; LAM
+06B9; NOON WITH DOT BELOW; D; NOON
+06BA; DOTLESS NOON; D; NOON
+06BB; DOTLESS NOON WITH SMALL TAH; D; NOON
+06BC; NOON WITH RING; D; NOON
+06BD; NOON WITH 3 DOTS ABOVE; D; NOON
+06BE; KNOTTED HEH; D; KNOTTED HEH
+06BF; HAH WITH MIDDLE 3 DOTS DOWNWARD AND DOT ABOVE; D; HAH
+06C0; HAMZA ON HEH; R; TEH MARBUTA
+06C1; HEH GOAL; D; HEH GOAL
+06C2; HAMZA ON HEH GOAL; R; HAMZA ON HEH GOAL
+06C3; TEH MARBUTA GOAL; R; HAMZA ON HEH GOAL
+06C4; WAW WITH RING; R; WAW
+06C5; WAW WITH BAR; R; WAW
+06C6; WAW WITH SMALL V; R; WAW
+06C7; WAW WITH DAMMA; R; WAW
+06C8; WAW WITH ALEF ABOVE; R; WAW
+06C9; WAW WITH INVERTED SMALL V; R; WAW
+06CA; WAW WITH 2 DOTS ABOVE; R; WAW
+06CB; WAW WITH 3 DOTS ABOVE; R; WAW
+06CC; DOTLESS YEH; D; YEH
+06CD; YEH WITH TAIL; R; YEH WITH TAIL
+06CE; YEH WITH SMALL V; D; YEH
+06CF; WAW WITH DOT ABOVE; R; WAW
+06D0; YEH WITH 2 DOTS VERTICAL BELOW; D; YEH
+06D1; YEH WITH 3 DOTS BELOW; D; YEH
+06D2; YEH BARREE; R; YEH BARREE
+06D3; HAMZA ON YEH BARREE; R; YEH BARREE
+06D5; AE; U; <no shaping>
+06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN
+06FB; DAD WITH DOT BELOW; D; SAD
+06FC; GHAIN WITH DOT BELOW; D; AIN
+# Syriac characters
+0710; ALAPH; R; ALAPH
+0712; BETH; D; BETH
+0713; GAMAL; D; GAMAL
+0714; GAMAL GARSHUNI; D; GAMAL
+0715; DALATH; R; DALATH RISH
+0716; DOTLESS DALATH RISH; R; DALATH RISH
+0717; HE; R; HE
+0718; WAW; R; WAW
+0719; ZAIN; R; ZAIN
+071A; HETH; D; HETH
+071B; TETH; D; TETH
+071C; TETH GARSHUNI; D; TETH
+071D; YUDH; D; YUDH
+071E; YUDH HE; R; YUDH HE
+071F; KAPH; D; KAPH
+0720; LAMADH; D; LAMADH
+0721; MIM; D; MIM
+0722; NUN; D; NUN
+0723; SEMKATH; D; SEMKATH
+0724; FINAL SEMKATH; D; FINAL SEMKATH
+0725; E; D; E
+0726; PE; D; PE
+0727; REVERSED PE; D; REVERSED PE
+0728; SADHE; R; SADHE
+0729; QAPH; D; QAPH
+072A; RISH; R; DALATH RISH
+072B; SHIN; D; SHIN
+072C; TAW; R; TAW
diff --git a/contrib/perl5/lib/unicode/Bidirectional.pl b/contrib/perl5/lib/unicode/Bidirectional.pl
new file mode 100644
index 0000000..73898b8
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Bidirectional.pl
@@ -0,0 +1,638 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 0008 BN
+0009 S
+000a B
+000b S
+000c WS
+000d B
+000e 001b BN
+001c 001e B
+001f S
+0020 WS
+0021 0022 ON
+0023 0025 ET
+0026 002a ON
+002b ET
+002c CS
+002d ET
+002e CS
+002f ES
+0030 0039 EN
+003a CS
+003b 0040 ON
+0041 005a L
+005b 0060 ON
+0061 007a L
+007b 007e ON
+007f 0084 BN
+0085 B
+0086 009f BN
+00a0 CS
+00a1 ON
+00a2 00a5 ET
+00a6 00a9 ON
+00aa L
+00ab 00af ON
+00b0 00b1 ET
+00b2 00b3 EN
+00b4 ON
+00b5 L
+00b6 00b8 ON
+00b9 EN
+00ba L
+00bb 00bf ON
+00c0 00d6 L
+00d7 ON
+00d8 00f6 L
+00f7 ON
+00f8 021f L
+0222 0233 L
+0250 02ad L
+02b0 02b8 L
+02b9 02ba ON
+02bb 02c1 L
+02c2 02cf ON
+02d0 02d1 L
+02d2 02df ON
+02e0 02e4 L
+02e5 02ed ON
+02ee L
+0300 034e NSM
+0360 0362 NSM
+0374 0375 ON
+037a L
+037e ON
+0384 0385 ON
+0386 L
+0387 ON
+0388 038a L
+038c L
+038e 03a1 L
+03a3 03ce L
+03d0 03d7 L
+03da 03f3 L
+0400 0482 L
+0483 0486 NSM
+0488 0489 NSM
+048c 04c4 L
+04c7 04c8 L
+04cb 04cc L
+04d0 04f5 L
+04f8 04f9 L
+0531 0556 L
+0559 055f L
+0561 0587 L
+0589 L
+058a ON
+0591 05a1 NSM
+05a3 05b9 NSM
+05bb 05bd NSM
+05be R
+05bf NSM
+05c0 R
+05c1 05c2 NSM
+05c3 R
+05c4 NSM
+05d0 05ea R
+05f0 05f4 R
+060c CS
+061b AL
+061f AL
+0621 063a AL
+0640 064a AL
+064b 0655 NSM
+0660 0669 AN
+066a ET
+066b 066c AN
+066d AL
+0670 NSM
+0671 06d5 AL
+06d6 06e4 NSM
+06e5 06e6 AL
+06e7 06e8 NSM
+06e9 ON
+06ea 06ed NSM
+06f0 06f9 EN
+06fa 06fe AL
+0700 070d AL
+070f BN
+0710 AL
+0711 NSM
+0712 072c AL
+0730 074a NSM
+0780 07a5 AL
+07a6 07b0 NSM
+0901 0902 NSM
+0903 L
+0905 0939 L
+093c NSM
+093d 0940 L
+0941 0948 NSM
+0949 094c L
+094d NSM
+0950 L
+0951 0954 NSM
+0958 0961 L
+0962 0963 NSM
+0964 0970 L
+0981 NSM
+0982 0983 L
+0985 098c L
+098f 0990 L
+0993 09a8 L
+09aa 09b0 L
+09b2 L
+09b6 09b9 L
+09bc NSM
+09be 09c0 L
+09c1 09c4 NSM
+09c7 09c8 L
+09cb 09cc L
+09cd NSM
+09d7 L
+09dc 09dd L
+09df 09e1 L
+09e2 09e3 NSM
+09e6 09f1 L
+09f2 09f3 ET
+09f4 09fa L
+0a02 NSM
+0a05 0a0a L
+0a0f 0a10 L
+0a13 0a28 L
+0a2a 0a30 L
+0a32 0a33 L
+0a35 0a36 L
+0a38 0a39 L
+0a3c NSM
+0a3e 0a40 L
+0a41 0a42 NSM
+0a47 0a48 NSM
+0a4b 0a4d NSM
+0a59 0a5c L
+0a5e L
+0a66 0a6f L
+0a70 0a71 NSM
+0a72 0a74 L
+0a81 0a82 NSM
+0a83 L
+0a85 0a8b L
+0a8d L
+0a8f 0a91 L
+0a93 0aa8 L
+0aaa 0ab0 L
+0ab2 0ab3 L
+0ab5 0ab9 L
+0abc NSM
+0abd 0ac0 L
+0ac1 0ac5 NSM
+0ac7 0ac8 NSM
+0ac9 L
+0acb 0acc L
+0acd NSM
+0ad0 L
+0ae0 L
+0ae6 0aef L
+0b01 NSM
+0b02 0b03 L
+0b05 0b0c L
+0b0f 0b10 L
+0b13 0b28 L
+0b2a 0b30 L
+0b32 0b33 L
+0b36 0b39 L
+0b3c NSM
+0b3d 0b3e L
+0b3f NSM
+0b40 L
+0b41 0b43 NSM
+0b47 0b48 L
+0b4b 0b4c L
+0b4d NSM
+0b56 NSM
+0b57 L
+0b5c 0b5d L
+0b5f 0b61 L
+0b66 0b70 L
+0b82 NSM
+0b83 L
+0b85 0b8a L
+0b8e 0b90 L
+0b92 0b95 L
+0b99 0b9a L
+0b9c L
+0b9e 0b9f L
+0ba3 0ba4 L
+0ba8 0baa L
+0bae 0bb5 L
+0bb7 0bb9 L
+0bbe 0bbf L
+0bc0 NSM
+0bc1 0bc2 L
+0bc6 0bc8 L
+0bca 0bcc L
+0bcd NSM
+0bd7 L
+0be7 0bf2 L
+0c01 0c03 L
+0c05 0c0c L
+0c0e 0c10 L
+0c12 0c28 L
+0c2a 0c33 L
+0c35 0c39 L
+0c3e 0c40 NSM
+0c41 0c44 L
+0c46 0c48 NSM
+0c4a 0c4d NSM
+0c55 0c56 NSM
+0c60 0c61 L
+0c66 0c6f L
+0c82 0c83 L
+0c85 0c8c L
+0c8e 0c90 L
+0c92 0ca8 L
+0caa 0cb3 L
+0cb5 0cb9 L
+0cbe L
+0cbf NSM
+0cc0 0cc4 L
+0cc6 NSM
+0cc7 0cc8 L
+0cca 0ccb L
+0ccc 0ccd NSM
+0cd5 0cd6 L
+0cde L
+0ce0 0ce1 L
+0ce6 0cef L
+0d02 0d03 L
+0d05 0d0c L
+0d0e 0d10 L
+0d12 0d28 L
+0d2a 0d39 L
+0d3e 0d40 L
+0d41 0d43 NSM
+0d46 0d48 L
+0d4a 0d4c L
+0d4d NSM
+0d57 L
+0d60 0d61 L
+0d66 0d6f L
+0d82 0d83 L
+0d85 0d96 L
+0d9a 0db1 L
+0db3 0dbb L
+0dbd L
+0dc0 0dc6 L
+0dca NSM
+0dcf 0dd1 L
+0dd2 0dd4 NSM
+0dd6 NSM
+0dd8 0ddf L
+0df2 0df4 L
+0e01 0e30 L
+0e31 NSM
+0e32 0e33 L
+0e34 0e3a NSM
+0e3f ET
+0e40 0e46 L
+0e47 0e4e NSM
+0e4f 0e5b L
+0e81 0e82 L
+0e84 L
+0e87 0e88 L
+0e8a L
+0e8d L
+0e94 0e97 L
+0e99 0e9f L
+0ea1 0ea3 L
+0ea5 L
+0ea7 L
+0eaa 0eab L
+0ead 0eb0 L
+0eb1 NSM
+0eb2 0eb3 L
+0eb4 0eb9 NSM
+0ebb 0ebc NSM
+0ebd L
+0ec0 0ec4 L
+0ec6 L
+0ec8 0ecd NSM
+0ed0 0ed9 L
+0edc 0edd L
+0f00 0f17 L
+0f18 0f19 NSM
+0f1a 0f34 L
+0f35 NSM
+0f36 L
+0f37 NSM
+0f38 L
+0f39 NSM
+0f3a 0f3d ON
+0f3e 0f47 L
+0f49 0f6a L
+0f71 0f7e NSM
+0f7f L
+0f80 0f84 NSM
+0f85 L
+0f86 0f87 NSM
+0f88 0f8b L
+0f90 0f97 NSM
+0f99 0fbc NSM
+0fbe 0fc5 L
+0fc6 NSM
+0fc7 0fcc L
+0fcf L
+1000 1021 L
+1023 1027 L
+1029 102a L
+102c L
+102d 1030 NSM
+1031 L
+1032 NSM
+1036 1037 NSM
+1038 L
+1039 NSM
+1040 1057 L
+1058 1059 NSM
+10a0 10c5 L
+10d0 10f6 L
+10fb L
+1100 1159 L
+115f 11a2 L
+11a8 11f9 L
+1200 1206 L
+1208 1246 L
+1248 L
+124a 124d L
+1250 1256 L
+1258 L
+125a 125d L
+1260 1286 L
+1288 L
+128a 128d L
+1290 12ae L
+12b0 L
+12b2 12b5 L
+12b8 12be L
+12c0 L
+12c2 12c5 L
+12c8 12ce L
+12d0 12d6 L
+12d8 12ee L
+12f0 130e L
+1310 L
+1312 1315 L
+1318 131e L
+1320 1346 L
+1348 135a L
+1361 137c L
+13a0 13f4 L
+1401 1676 L
+1680 WS
+1681 169a L
+169b 169c ON
+16a0 16f0 L
+1780 17b6 L
+17b7 17bd NSM
+17be 17c5 L
+17c6 NSM
+17c7 17c8 L
+17c9 17d3 NSM
+17d4 17da L
+17db ET
+17dc L
+17e0 17e9 L
+1800 180a ON
+180b 180e BN
+1810 1819 L
+1820 1877 L
+1880 18a8 L
+18a9 NSM
+1e00 1e9b L
+1ea0 1ef9 L
+1f00 1f15 L
+1f18 1f1d L
+1f20 1f45 L
+1f48 1f4d L
+1f50 1f57 L
+1f59 L
+1f5b L
+1f5d L
+1f5f 1f7d L
+1f80 1fb4 L
+1fb6 1fbc L
+1fbd ON
+1fbe L
+1fbf 1fc1 ON
+1fc2 1fc4 L
+1fc6 1fcc L
+1fcd 1fcf ON
+1fd0 1fd3 L
+1fd6 1fdb L
+1fdd 1fdf ON
+1fe0 1fec L
+1fed 1fef ON
+1ff2 1ff4 L
+1ff6 1ffc L
+1ffd 1ffe ON
+2000 200a WS
+200b 200d BN
+200e L
+200f R
+2010 2027 ON
+2028 WS
+2029 B
+202a LRE
+202b RLE
+202c PDF
+202d LRO
+202e RLO
+202f WS
+2030 2034 ET
+2035 2046 ON
+2048 204d ON
+206a 206f BN
+2070 EN
+2074 2079 EN
+207a 207b ET
+207c 207e ON
+207f L
+2080 2089 EN
+208a 208b ET
+208c 208e ON
+20a0 20af ET
+20d0 20e3 NSM
+2100 2101 ON
+2102 L
+2103 2106 ON
+2107 L
+2108 2109 ON
+210a 2113 L
+2114 ON
+2115 L
+2116 2118 ON
+2119 211d L
+211e 2123 ON
+2124 L
+2125 ON
+2126 L
+2127 ON
+2128 L
+2129 ON
+212a 212d L
+212e ET
+212f 2131 L
+2132 ON
+2133 2139 L
+213a ON
+2153 215f ON
+2160 2183 L
+2190 21f3 ON
+2200 2211 ON
+2212 2213 ET
+2214 22f1 ON
+2300 2335 ON
+2336 237a L
+237b ON
+237d 2394 ON
+2395 L
+2396 239a ON
+2400 2426 ON
+2440 244a ON
+2460 249b EN
+249c 24e9 L
+24ea EN
+2500 2595 ON
+25a0 25f7 ON
+2600 2613 ON
+2619 2671 ON
+2701 2704 ON
+2706 2709 ON
+270c 2727 ON
+2729 274b ON
+274d ON
+274f 2752 ON
+2756 ON
+2758 275e ON
+2761 2767 ON
+2776 2794 ON
+2798 27af ON
+27b1 27be ON
+2800 28ff ON
+2e80 2e99 ON
+2e9b 2ef3 ON
+2f00 2fd5 ON
+2ff0 2ffb ON
+3000 WS
+3001 3004 ON
+3005 3007 L
+3008 3020 ON
+3021 3029 L
+302a 302f NSM
+3030 ON
+3031 3035 L
+3036 3037 ON
+3038 303a L
+303e 303f ON
+3041 3094 L
+3099 309a NSM
+309b 309c ON
+309d 309e L
+30a1 30fa L
+30fb ON
+30fc 30fe L
+3105 312c L
+3131 318e L
+3190 31b7 L
+3200 321c L
+3220 3243 L
+3260 327b L
+327f 32b0 L
+32c0 32cb L
+32d0 32fe L
+3300 3376 L
+337b 33dd L
+33e0 33fe L
+3400 4db5 L
+4e00 9fa5 L
+a000 a48c L
+a490 a4a1 ON
+a4a4 a4b3 ON
+a4b5 a4c0 ON
+a4c2 a4c4 ON
+a4c6 ON
+ac00 d7a3 L
+d800 db7f L
+db80 dbff L
+dc00 dfff L
+e000 f8ff L
+f900 fa2d L
+fb00 fb06 L
+fb13 fb17 L
+fb1d R
+fb1e NSM
+fb1f fb28 R
+fb29 ET
+fb2a fb36 R
+fb38 fb3c R
+fb3e R
+fb40 fb41 R
+fb43 fb44 R
+fb46 fb4f R
+fb50 fbb1 AL
+fbd3 fd3d AL
+fd3e fd3f ON
+fd50 fd8f AL
+fd92 fdc7 AL
+fdf0 fdfb AL
+fe20 fe23 NSM
+fe30 fe44 ON
+fe49 fe4f ON
+fe50 CS
+fe51 ON
+fe52 CS
+fe54 ON
+fe55 CS
+fe56 fe5e ON
+fe5f ET
+fe60 fe61 ON
+fe62 fe63 ET
+fe64 fe66 ON
+fe68 ON
+fe69 fe6a ET
+fe6b ON
+fe70 fe72 AL
+fe74 AL
+fe76 fefc AL
+feff BN
+ff01 ff02 ON
+ff03 ff05 ET
+ff06 ff0a ON
+ff0b ET
+ff0c CS
+ff0d ET
+ff0e CS
+ff0f ES
+ff10 ff19 EN
+ff1a CS
+ff1b ff20 ON
+ff21 ff3a L
+ff3b ff40 ON
+ff41 ff5a L
+ff5b ff5e ON
+ff61 ff65 ON
+ff66 ffbe L
+ffc2 ffc7 L
+ffca ffcf L
+ffd2 ffd7 L
+ffda ffdc L
+ffe0 ffe1 ET
+ffe2 ffe4 ON
+ffe5 ffe6 ET
+ffe8 ffee ON
+fff9 fffb BN
+fffc fffd ON
+END
diff --git a/contrib/perl5/lib/unicode/Block.pl b/contrib/perl5/lib/unicode/Block.pl
new file mode 100644
index 0000000..ee680b7
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Block.pl
@@ -0,0 +1,93 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 007F Basic Latin
+0080 00FF Latin-1 Supplement
+0100 017F Latin Extended-A
+0180 024F Latin Extended-B
+0250 02AF IPA Extensions
+02B0 02FF Spacing Modifier Letters
+0300 036F Combining Diacritical Marks
+0370 03FF Greek
+0400 04FF Cyrillic
+0530 058F Armenian
+0590 05FF Hebrew
+0600 06FF Arabic
+0700 074F Syriac
+0780 07BF Thaana
+0900 097F Devanagari
+0980 09FF Bengali
+0A00 0A7F Gurmukhi
+0A80 0AFF Gujarati
+0B00 0B7F Oriya
+0B80 0BFF Tamil
+0C00 0C7F Telugu
+0C80 0CFF Kannada
+0D00 0D7F Malayalam
+0D80 0DFF Sinhala
+0E00 0E7F Thai
+0E80 0EFF Lao
+0F00 0FFF Tibetan
+1000 109F Myanmar
+10A0 10FF Georgian
+1100 11FF Hangul Jamo
+1200 137F Ethiopic
+13A0 13FF Cherokee
+1400 167F Unified Canadian Aboriginal Syllabics
+1680 169F Ogham
+16A0 16FF Runic
+1780 17FF Khmer
+1800 18AF Mongolian
+1E00 1EFF Latin Extended Additional
+1F00 1FFF Greek Extended
+2000 206F General Punctuation
+2070 209F Superscripts and Subscripts
+20A0 20CF Currency Symbols
+20D0 20FF Combining Marks for Symbols
+2100 214F Letterlike Symbols
+2150 218F Number Forms
+2190 21FF Arrows
+2200 22FF Mathematical Operators
+2300 23FF Miscellaneous Technical
+2400 243F Control Pictures
+2440 245F Optical Character Recognition
+2460 24FF Enclosed Alphanumerics
+2500 257F Box Drawing
+2580 259F Block Elements
+25A0 25FF Geometric Shapes
+2600 26FF Miscellaneous Symbols
+2700 27BF Dingbats
+2800 28FF Braille Patterns
+2E80 2EFF CJK Radicals Supplement
+2F00 2FDF Kangxi Radicals
+2FF0 2FFF Ideographic Description Characters
+3000 303F CJK Symbols and Punctuation
+3040 309F Hiragana
+30A0 30FF Katakana
+3100 312F Bopomofo
+3130 318F Hangul Compatibility Jamo
+3190 319F Kanbun
+31A0 31BF Bopomofo Extended
+3200 32FF Enclosed CJK Letters and Months
+3300 33FF CJK Compatibility
+3400 4DB5 CJK Unified Ideographs Extension A
+4E00 9FFF CJK Unified Ideographs
+A000 A48F Yi Syllables
+A490 A4CF Yi Radicals
+AC00 D7A3 Hangul Syllables
+D800 DB7F High Surrogates
+DB80 DBFF High Private Use Surrogates
+DC00 DFFF Low Surrogates
+E000 F8FF Private Use
+F900 FAFF CJK Compatibility Ideographs
+FB00 FB4F Alphabetic Presentation Forms
+FB50 FDFF Arabic Presentation Forms-A
+FE20 FE2F Combining Half Marks
+FE30 FE4F CJK Compatibility Forms
+FE50 FE6F Small Form Variants
+FE70 FEFE Arabic Presentation Forms-B
+FEFF FEFF Specials
+FF00 FFEF Halfwidth and Fullwidth Forms
+FFF0 FFFD Specials
+END
diff --git a/contrib/perl5/lib/unicode/Blocks.txt b/contrib/perl5/lib/unicode/Blocks.txt
new file mode 100644
index 0000000..15c8957
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Blocks.txt
@@ -0,0 +1,90 @@
+# Start Code; End Code; Block Name
+0000; 007F; Basic Latin
+0080; 00FF; Latin-1 Supplement
+0100; 017F; Latin Extended-A
+0180; 024F; Latin Extended-B
+0250; 02AF; IPA Extensions
+02B0; 02FF; Spacing Modifier Letters
+0300; 036F; Combining Diacritical Marks
+0370; 03FF; Greek
+0400; 04FF; Cyrillic
+0530; 058F; Armenian
+0590; 05FF; Hebrew
+0600; 06FF; Arabic
+0700; 074F; Syriac
+0780; 07BF; Thaana
+0900; 097F; Devanagari
+0980; 09FF; Bengali
+0A00; 0A7F; Gurmukhi
+0A80; 0AFF; Gujarati
+0B00; 0B7F; Oriya
+0B80; 0BFF; Tamil
+0C00; 0C7F; Telugu
+0C80; 0CFF; Kannada
+0D00; 0D7F; Malayalam
+0D80; 0DFF; Sinhala
+0E00; 0E7F; Thai
+0E80; 0EFF; Lao
+0F00; 0FFF; Tibetan
+1000; 109F; Myanmar
+10A0; 10FF; Georgian
+1100; 11FF; Hangul Jamo
+1200; 137F; Ethiopic
+13A0; 13FF; Cherokee
+1400; 167F; Unified Canadian Aboriginal Syllabics
+1680; 169F; Ogham
+16A0; 16FF; Runic
+1780; 17FF; Khmer
+1800; 18AF; Mongolian
+1E00; 1EFF; Latin Extended Additional
+1F00; 1FFF; Greek Extended
+2000; 206F; General Punctuation
+2070; 209F; Superscripts and Subscripts
+20A0; 20CF; Currency Symbols
+20D0; 20FF; Combining Marks for Symbols
+2100; 214F; Letterlike Symbols
+2150; 218F; Number Forms
+2190; 21FF; Arrows
+2200; 22FF; Mathematical Operators
+2300; 23FF; Miscellaneous Technical
+2400; 243F; Control Pictures
+2440; 245F; Optical Character Recognition
+2460; 24FF; Enclosed Alphanumerics
+2500; 257F; Box Drawing
+2580; 259F; Block Elements
+25A0; 25FF; Geometric Shapes
+2600; 26FF; Miscellaneous Symbols
+2700; 27BF; Dingbats
+2800; 28FF; Braille Patterns
+2E80; 2EFF; CJK Radicals Supplement
+2F00; 2FDF; Kangxi Radicals
+2FF0; 2FFF; Ideographic Description Characters
+3000; 303F; CJK Symbols and Punctuation
+3040; 309F; Hiragana
+30A0; 30FF; Katakana
+3100; 312F; Bopomofo
+3130; 318F; Hangul Compatibility Jamo
+3190; 319F; Kanbun
+31A0; 31BF; Bopomofo Extended
+3200; 32FF; Enclosed CJK Letters and Months
+3300; 33FF; CJK Compatibility
+3400; 4DB5; CJK Unified Ideographs Extension A
+4E00; 9FFF; CJK Unified Ideographs
+A000; A48F; Yi Syllables
+A490; A4CF; Yi Radicals
+AC00; D7A3; Hangul Syllables
+D800; DB7F; High Surrogates
+DB80; DBFF; High Private Use Surrogates
+DC00; DFFF; Low Surrogates
+E000; F8FF; Private Use
+F900; FAFF; CJK Compatibility Ideographs
+FB00; FB4F; Alphabetic Presentation Forms
+FB50; FDFF; Arabic Presentation Forms-A
+FE20; FE2F; Combining Half Marks
+FE30; FE4F; CJK Compatibility Forms
+FE50; FE6F; Small Form Variants
+FE70; FEFE; Arabic Presentation Forms-B
+FEFF; FEFF; Specials
+FF00; FFEF; Halfwidth and Fullwidth Forms
+FFF0; FFFD; Specials
+
diff --git a/contrib/perl5/lib/unicode/Category.pl b/contrib/perl5/lib/unicode/Category.pl
new file mode 100644
index 0000000..bffd116
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Category.pl
@@ -0,0 +1,1506 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 001f Cc
+0020 Zs
+0021 0023 Po
+0024 Sc
+0025 0027 Po
+0028 Ps
+0029 Pe
+002a Po
+002b Sm
+002c Po
+002d Pd
+002e 002f Po
+0030 0039 Nd
+003a 003b Po
+003c 003e Sm
+003f 0040 Po
+0041 005a Lu
+005b Ps
+005c Po
+005d Pe
+005e Sk
+005f Pc
+0060 Sk
+0061 007a Ll
+007b Ps
+007c Sm
+007d Pe
+007e Sm
+007f 009f Cc
+00a0 Zs
+00a1 Po
+00a2 00a5 Sc
+00a6 00a7 So
+00a8 Sk
+00a9 So
+00aa Ll
+00ab Pi
+00ac Sm
+00ad Pd
+00ae So
+00af Sk
+00b0 So
+00b1 Sm
+00b2 00b3 No
+00b4 Sk
+00b5 Ll
+00b6 So
+00b7 Po
+00b8 Sk
+00b9 No
+00ba Ll
+00bb Pf
+00bc 00be No
+00bf Po
+00c0 00d6 Lu
+00d7 Sm
+00d8 00de Lu
+00df 00f6 Ll
+00f7 Sm
+00f8 00ff Ll
+0100 Lu
+0101 Ll
+0102 Lu
+0103 Ll
+0104 Lu
+0105 Ll
+0106 Lu
+0107 Ll
+0108 Lu
+0109 Ll
+010a Lu
+010b Ll
+010c Lu
+010d Ll
+010e Lu
+010f Ll
+0110 Lu
+0111 Ll
+0112 Lu
+0113 Ll
+0114 Lu
+0115 Ll
+0116 Lu
+0117 Ll
+0118 Lu
+0119 Ll
+011a Lu
+011b Ll
+011c Lu
+011d Ll
+011e Lu
+011f Ll
+0120 Lu
+0121 Ll
+0122 Lu
+0123 Ll
+0124 Lu
+0125 Ll
+0126 Lu
+0127 Ll
+0128 Lu
+0129 Ll
+012a Lu
+012b Ll
+012c Lu
+012d Ll
+012e Lu
+012f Ll
+0130 Lu
+0131 Ll
+0132 Lu
+0133 Ll
+0134 Lu
+0135 Ll
+0136 Lu
+0137 0138 Ll
+0139 Lu
+013a Ll
+013b Lu
+013c Ll
+013d Lu
+013e Ll
+013f Lu
+0140 Ll
+0141 Lu
+0142 Ll
+0143 Lu
+0144 Ll
+0145 Lu
+0146 Ll
+0147 Lu
+0148 0149 Ll
+014a Lu
+014b Ll
+014c Lu
+014d Ll
+014e Lu
+014f Ll
+0150 Lu
+0151 Ll
+0152 Lu
+0153 Ll
+0154 Lu
+0155 Ll
+0156 Lu
+0157 Ll
+0158 Lu
+0159 Ll
+015a Lu
+015b Ll
+015c Lu
+015d Ll
+015e Lu
+015f Ll
+0160 Lu
+0161 Ll
+0162 Lu
+0163 Ll
+0164 Lu
+0165 Ll
+0166 Lu
+0167 Ll
+0168 Lu
+0169 Ll
+016a Lu
+016b Ll
+016c Lu
+016d Ll
+016e Lu
+016f Ll
+0170 Lu
+0171 Ll
+0172 Lu
+0173 Ll
+0174 Lu
+0175 Ll
+0176 Lu
+0177 Ll
+0178 0179 Lu
+017a Ll
+017b Lu
+017c Ll
+017d Lu
+017e 0180 Ll
+0181 0182 Lu
+0183 Ll
+0184 Lu
+0185 Ll
+0186 0187 Lu
+0188 Ll
+0189 018b Lu
+018c 018d Ll
+018e 0191 Lu
+0192 Ll
+0193 0194 Lu
+0195 Ll
+0196 0198 Lu
+0199 019b Ll
+019c 019d Lu
+019e Ll
+019f 01a0 Lu
+01a1 Ll
+01a2 Lu
+01a3 Ll
+01a4 Lu
+01a5 Ll
+01a6 01a7 Lu
+01a8 Ll
+01a9 Lu
+01aa 01ab Ll
+01ac Lu
+01ad Ll
+01ae 01af Lu
+01b0 Ll
+01b1 01b3 Lu
+01b4 Ll
+01b5 Lu
+01b6 Ll
+01b7 01b8 Lu
+01b9 01ba Ll
+01bb Lo
+01bc Lu
+01bd 01bf Ll
+01c0 01c3 Lo
+01c4 Lu
+01c5 Lt
+01c6 Ll
+01c7 Lu
+01c8 Lt
+01c9 Ll
+01ca Lu
+01cb Lt
+01cc Ll
+01cd Lu
+01ce Ll
+01cf Lu
+01d0 Ll
+01d1 Lu
+01d2 Ll
+01d3 Lu
+01d4 Ll
+01d5 Lu
+01d6 Ll
+01d7 Lu
+01d8 Ll
+01d9 Lu
+01da Ll
+01db Lu
+01dc 01dd Ll
+01de Lu
+01df Ll
+01e0 Lu
+01e1 Ll
+01e2 Lu
+01e3 Ll
+01e4 Lu
+01e5 Ll
+01e6 Lu
+01e7 Ll
+01e8 Lu
+01e9 Ll
+01ea Lu
+01eb Ll
+01ec Lu
+01ed Ll
+01ee Lu
+01ef 01f0 Ll
+01f1 Lu
+01f2 Lt
+01f3 Ll
+01f4 Lu
+01f5 Ll
+01f6 01f8 Lu
+01f9 Ll
+01fa Lu
+01fb Ll
+01fc Lu
+01fd Ll
+01fe Lu
+01ff Ll
+0200 Lu
+0201 Ll
+0202 Lu
+0203 Ll
+0204 Lu
+0205 Ll
+0206 Lu
+0207 Ll
+0208 Lu
+0209 Ll
+020a Lu
+020b Ll
+020c Lu
+020d Ll
+020e Lu
+020f Ll
+0210 Lu
+0211 Ll
+0212 Lu
+0213 Ll
+0214 Lu
+0215 Ll
+0216 Lu
+0217 Ll
+0218 Lu
+0219 Ll
+021a Lu
+021b Ll
+021c Lu
+021d Ll
+021e Lu
+021f Ll
+0222 Lu
+0223 Ll
+0224 Lu
+0225 Ll
+0226 Lu
+0227 Ll
+0228 Lu
+0229 Ll
+022a Lu
+022b Ll
+022c Lu
+022d Ll
+022e Lu
+022f Ll
+0230 Lu
+0231 Ll
+0232 Lu
+0233 Ll
+0250 02ad Ll
+02b0 02b8 Lm
+02b9 02ba Sk
+02bb 02c1 Lm
+02c2 02cf Sk
+02d0 02d1 Lm
+02d2 02df Sk
+02e0 02e4 Lm
+02e5 02ed Sk
+02ee Lm
+0300 034e Mn
+0360 0362 Mn
+0374 0375 Sk
+037a Lm
+037e Po
+0384 0385 Sk
+0386 Lu
+0387 Po
+0388 038a Lu
+038c Lu
+038e 038f Lu
+0390 Ll
+0391 03a1 Lu
+03a3 03ab Lu
+03ac 03ce Ll
+03d0 03d1 Ll
+03d2 03d4 Lu
+03d5 03d7 Ll
+03da Lu
+03db Ll
+03dc Lu
+03dd Ll
+03de Lu
+03df Ll
+03e0 Lu
+03e1 Ll
+03e2 Lu
+03e3 Ll
+03e4 Lu
+03e5 Ll
+03e6 Lu
+03e7 Ll
+03e8 Lu
+03e9 Ll
+03ea Lu
+03eb Ll
+03ec Lu
+03ed Ll
+03ee Lu
+03ef 03f3 Ll
+0400 042f Lu
+0430 045f Ll
+0460 Lu
+0461 Ll
+0462 Lu
+0463 Ll
+0464 Lu
+0465 Ll
+0466 Lu
+0467 Ll
+0468 Lu
+0469 Ll
+046a Lu
+046b Ll
+046c Lu
+046d Ll
+046e Lu
+046f Ll
+0470 Lu
+0471 Ll
+0472 Lu
+0473 Ll
+0474 Lu
+0475 Ll
+0476 Lu
+0477 Ll
+0478 Lu
+0479 Ll
+047a Lu
+047b Ll
+047c Lu
+047d Ll
+047e Lu
+047f Ll
+0480 Lu
+0481 Ll
+0482 So
+0483 0486 Mn
+0488 0489 Me
+048c Lu
+048d Ll
+048e Lu
+048f Ll
+0490 Lu
+0491 Ll
+0492 Lu
+0493 Ll
+0494 Lu
+0495 Ll
+0496 Lu
+0497 Ll
+0498 Lu
+0499 Ll
+049a Lu
+049b Ll
+049c Lu
+049d Ll
+049e Lu
+049f Ll
+04a0 Lu
+04a1 Ll
+04a2 Lu
+04a3 Ll
+04a4 Lu
+04a5 Ll
+04a6 Lu
+04a7 Ll
+04a8 Lu
+04a9 Ll
+04aa Lu
+04ab Ll
+04ac Lu
+04ad Ll
+04ae Lu
+04af Ll
+04b0 Lu
+04b1 Ll
+04b2 Lu
+04b3 Ll
+04b4 Lu
+04b5 Ll
+04b6 Lu
+04b7 Ll
+04b8 Lu
+04b9 Ll
+04ba Lu
+04bb Ll
+04bc Lu
+04bd Ll
+04be Lu
+04bf Ll
+04c0 04c1 Lu
+04c2 Ll
+04c3 Lu
+04c4 Ll
+04c7 Lu
+04c8 Ll
+04cb Lu
+04cc Ll
+04d0 Lu
+04d1 Ll
+04d2 Lu
+04d3 Ll
+04d4 Lu
+04d5 Ll
+04d6 Lu
+04d7 Ll
+04d8 Lu
+04d9 Ll
+04da Lu
+04db Ll
+04dc Lu
+04dd Ll
+04de Lu
+04df Ll
+04e0 Lu
+04e1 Ll
+04e2 Lu
+04e3 Ll
+04e4 Lu
+04e5 Ll
+04e6 Lu
+04e7 Ll
+04e8 Lu
+04e9 Ll
+04ea Lu
+04eb Ll
+04ec Lu
+04ed Ll
+04ee Lu
+04ef Ll
+04f0 Lu
+04f1 Ll
+04f2 Lu
+04f3 Ll
+04f4 Lu
+04f5 Ll
+04f8 Lu
+04f9 Ll
+0531 0556 Lu
+0559 Lm
+055a 055f Po
+0561 0587 Ll
+0589 Po
+058a Pd
+0591 05a1 Mn
+05a3 05b9 Mn
+05bb 05bd Mn
+05be Po
+05bf Mn
+05c0 Po
+05c1 05c2 Mn
+05c3 Po
+05c4 Mn
+05d0 05ea Lo
+05f0 05f2 Lo
+05f3 05f4 Po
+060c Po
+061b Po
+061f Po
+0621 063a Lo
+0640 Lm
+0641 064a Lo
+064b 0655 Mn
+0660 0669 Nd
+066a 066d Po
+0670 Mn
+0671 06d3 Lo
+06d4 Po
+06d5 Lo
+06d6 06dc Mn
+06dd 06de Me
+06df 06e4 Mn
+06e5 06e6 Lm
+06e7 06e8 Mn
+06e9 So
+06ea 06ed Mn
+06f0 06f9 Nd
+06fa 06fc Lo
+06fd 06fe So
+0700 070d Po
+070f Cf
+0710 Lo
+0711 Mn
+0712 072c Lo
+0730 074a Mn
+0780 07a5 Lo
+07a6 07b0 Mn
+0901 0902 Mn
+0903 Mc
+0905 0939 Lo
+093c Mn
+093d Lo
+093e 0940 Mc
+0941 0948 Mn
+0949 094c Mc
+094d Mn
+0950 Lo
+0951 0954 Mn
+0958 0961 Lo
+0962 0963 Mn
+0964 0965 Po
+0966 096f Nd
+0970 Po
+0981 Mn
+0982 0983 Mc
+0985 098c Lo
+098f 0990 Lo
+0993 09a8 Lo
+09aa 09b0 Lo
+09b2 Lo
+09b6 09b9 Lo
+09bc Mn
+09be 09c0 Mc
+09c1 09c4 Mn
+09c7 09c8 Mc
+09cb 09cc Mc
+09cd Mn
+09d7 Mc
+09dc 09dd Lo
+09df 09e1 Lo
+09e2 09e3 Mn
+09e6 09ef Nd
+09f0 09f1 Lo
+09f2 09f3 Sc
+09f4 09f9 No
+09fa So
+0a02 Mn
+0a05 0a0a Lo
+0a0f 0a10 Lo
+0a13 0a28 Lo
+0a2a 0a30 Lo
+0a32 0a33 Lo
+0a35 0a36 Lo
+0a38 0a39 Lo
+0a3c Mn
+0a3e 0a40 Mc
+0a41 0a42 Mn
+0a47 0a48 Mn
+0a4b 0a4d Mn
+0a59 0a5c Lo
+0a5e Lo
+0a66 0a6f Nd
+0a70 0a71 Mn
+0a72 0a74 Lo
+0a81 0a82 Mn
+0a83 Mc
+0a85 0a8b Lo
+0a8d Lo
+0a8f 0a91 Lo
+0a93 0aa8 Lo
+0aaa 0ab0 Lo
+0ab2 0ab3 Lo
+0ab5 0ab9 Lo
+0abc Mn
+0abd Lo
+0abe 0ac0 Mc
+0ac1 0ac5 Mn
+0ac7 0ac8 Mn
+0ac9 Mc
+0acb 0acc Mc
+0acd Mn
+0ad0 Lo
+0ae0 Lo
+0ae6 0aef Nd
+0b01 Mn
+0b02 0b03 Mc
+0b05 0b0c Lo
+0b0f 0b10 Lo
+0b13 0b28 Lo
+0b2a 0b30 Lo
+0b32 0b33 Lo
+0b36 0b39 Lo
+0b3c Mn
+0b3d Lo
+0b3e Mc
+0b3f Mn
+0b40 Mc
+0b41 0b43 Mn
+0b47 0b48 Mc
+0b4b 0b4c Mc
+0b4d Mn
+0b56 Mn
+0b57 Mc
+0b5c 0b5d Lo
+0b5f 0b61 Lo
+0b66 0b6f Nd
+0b70 So
+0b82 Mn
+0b83 Mc
+0b85 0b8a Lo
+0b8e 0b90 Lo
+0b92 0b95 Lo
+0b99 0b9a Lo
+0b9c Lo
+0b9e 0b9f Lo
+0ba3 0ba4 Lo
+0ba8 0baa Lo
+0bae 0bb5 Lo
+0bb7 0bb9 Lo
+0bbe 0bbf Mc
+0bc0 Mn
+0bc1 0bc2 Mc
+0bc6 0bc8 Mc
+0bca 0bcc Mc
+0bcd Mn
+0bd7 Mc
+0be7 0bef Nd
+0bf0 0bf2 No
+0c01 0c03 Mc
+0c05 0c0c Lo
+0c0e 0c10 Lo
+0c12 0c28 Lo
+0c2a 0c33 Lo
+0c35 0c39 Lo
+0c3e 0c40 Mn
+0c41 0c44 Mc
+0c46 0c48 Mn
+0c4a 0c4d Mn
+0c55 0c56 Mn
+0c60 0c61 Lo
+0c66 0c6f Nd
+0c82 0c83 Mc
+0c85 0c8c Lo
+0c8e 0c90 Lo
+0c92 0ca8 Lo
+0caa 0cb3 Lo
+0cb5 0cb9 Lo
+0cbe Mc
+0cbf Mn
+0cc0 0cc4 Mc
+0cc6 Mn
+0cc7 0cc8 Mc
+0cca 0ccb Mc
+0ccc 0ccd Mn
+0cd5 0cd6 Mc
+0cde Lo
+0ce0 0ce1 Lo
+0ce6 0cef Nd
+0d02 0d03 Mc
+0d05 0d0c Lo
+0d0e 0d10 Lo
+0d12 0d28 Lo
+0d2a 0d39 Lo
+0d3e 0d40 Mc
+0d41 0d43 Mn
+0d46 0d48 Mc
+0d4a 0d4c Mc
+0d4d Mn
+0d57 Mc
+0d60 0d61 Lo
+0d66 0d6f Nd
+0d82 0d83 Mc
+0d85 0d96 Lo
+0d9a 0db1 Lo
+0db3 0dbb Lo
+0dbd Lo
+0dc0 0dc6 Lo
+0dca Mn
+0dcf 0dd1 Mc
+0dd2 0dd4 Mn
+0dd6 Mn
+0dd8 0ddf Mc
+0df2 0df3 Mc
+0df4 Po
+0e01 0e30 Lo
+0e31 Mn
+0e32 0e33 Lo
+0e34 0e3a Mn
+0e3f Sc
+0e40 0e45 Lo
+0e46 Lm
+0e47 0e4e Mn
+0e4f Po
+0e50 0e59 Nd
+0e5a 0e5b Po
+0e81 0e82 Lo
+0e84 Lo
+0e87 0e88 Lo
+0e8a Lo
+0e8d Lo
+0e94 0e97 Lo
+0e99 0e9f Lo
+0ea1 0ea3 Lo
+0ea5 Lo
+0ea7 Lo
+0eaa 0eab Lo
+0ead 0eb0 Lo
+0eb1 Mn
+0eb2 0eb3 Lo
+0eb4 0eb9 Mn
+0ebb 0ebc Mn
+0ebd Lo
+0ec0 0ec4 Lo
+0ec6 Lm
+0ec8 0ecd Mn
+0ed0 0ed9 Nd
+0edc 0edd Lo
+0f00 Lo
+0f01 0f03 So
+0f04 0f12 Po
+0f13 0f17 So
+0f18 0f19 Mn
+0f1a 0f1f So
+0f20 0f29 Nd
+0f2a 0f33 No
+0f34 So
+0f35 Mn
+0f36 So
+0f37 Mn
+0f38 So
+0f39 Mn
+0f3a Ps
+0f3b Pe
+0f3c Ps
+0f3d Pe
+0f3e 0f3f Mc
+0f40 0f47 Lo
+0f49 0f6a Lo
+0f71 0f7e Mn
+0f7f Mc
+0f80 0f84 Mn
+0f85 Po
+0f86 0f87 Mn
+0f88 0f8b Lo
+0f90 0f97 Mn
+0f99 0fbc Mn
+0fbe 0fc5 So
+0fc6 Mn
+0fc7 0fcc So
+0fcf So
+1000 1021 Lo
+1023 1027 Lo
+1029 102a Lo
+102c Mc
+102d 1030 Mn
+1031 Mc
+1032 Mn
+1036 1037 Mn
+1038 Mc
+1039 Mn
+1040 1049 Nd
+104a 104f Po
+1050 1055 Lo
+1056 1057 Mc
+1058 1059 Mn
+10a0 10c5 Lu
+10d0 10f6 Lo
+10fb Po
+1100 1159 Lo
+115f 11a2 Lo
+11a8 11f9 Lo
+1200 1206 Lo
+1208 1246 Lo
+1248 Lo
+124a 124d Lo
+1250 1256 Lo
+1258 Lo
+125a 125d Lo
+1260 1286 Lo
+1288 Lo
+128a 128d Lo
+1290 12ae Lo
+12b0 Lo
+12b2 12b5 Lo
+12b8 12be Lo
+12c0 Lo
+12c2 12c5 Lo
+12c8 12ce Lo
+12d0 12d6 Lo
+12d8 12ee Lo
+12f0 130e Lo
+1310 Lo
+1312 1315 Lo
+1318 131e Lo
+1320 1346 Lo
+1348 135a Lo
+1361 1368 Po
+1369 1371 Nd
+1372 137c No
+13a0 13f4 Lo
+1401 166c Lo
+166d 166e Po
+166f 1676 Lo
+1680 Zs
+1681 169a Lo
+169b Ps
+169c Pe
+16a0 16ea Lo
+16eb 16ed Po
+16ee 16f0 No
+1780 17b3 Lo
+17b4 17b6 Mc
+17b7 17bd Mn
+17be 17c5 Mc
+17c6 Mn
+17c7 17c8 Mc
+17c9 17d3 Mn
+17d4 17da Po
+17db Sc
+17dc Po
+17e0 17e9 Nd
+1800 1805 Po
+1806 Pd
+1807 180a Po
+180b 180e Cf
+1810 1819 Nd
+1820 1842 Lo
+1843 Lm
+1844 1877 Lo
+1880 18a8 Lo
+18a9 Mn
+1e00 Lu
+1e01 Ll
+1e02 Lu
+1e03 Ll
+1e04 Lu
+1e05 Ll
+1e06 Lu
+1e07 Ll
+1e08 Lu
+1e09 Ll
+1e0a Lu
+1e0b Ll
+1e0c Lu
+1e0d Ll
+1e0e Lu
+1e0f Ll
+1e10 Lu
+1e11 Ll
+1e12 Lu
+1e13 Ll
+1e14 Lu
+1e15 Ll
+1e16 Lu
+1e17 Ll
+1e18 Lu
+1e19 Ll
+1e1a Lu
+1e1b Ll
+1e1c Lu
+1e1d Ll
+1e1e Lu
+1e1f Ll
+1e20 Lu
+1e21 Ll
+1e22 Lu
+1e23 Ll
+1e24 Lu
+1e25 Ll
+1e26 Lu
+1e27 Ll
+1e28 Lu
+1e29 Ll
+1e2a Lu
+1e2b Ll
+1e2c Lu
+1e2d Ll
+1e2e Lu
+1e2f Ll
+1e30 Lu
+1e31 Ll
+1e32 Lu
+1e33 Ll
+1e34 Lu
+1e35 Ll
+1e36 Lu
+1e37 Ll
+1e38 Lu
+1e39 Ll
+1e3a Lu
+1e3b Ll
+1e3c Lu
+1e3d Ll
+1e3e Lu
+1e3f Ll
+1e40 Lu
+1e41 Ll
+1e42 Lu
+1e43 Ll
+1e44 Lu
+1e45 Ll
+1e46 Lu
+1e47 Ll
+1e48 Lu
+1e49 Ll
+1e4a Lu
+1e4b Ll
+1e4c Lu
+1e4d Ll
+1e4e Lu
+1e4f Ll
+1e50 Lu
+1e51 Ll
+1e52 Lu
+1e53 Ll
+1e54 Lu
+1e55 Ll
+1e56 Lu
+1e57 Ll
+1e58 Lu
+1e59 Ll
+1e5a Lu
+1e5b Ll
+1e5c Lu
+1e5d Ll
+1e5e Lu
+1e5f Ll
+1e60 Lu
+1e61 Ll
+1e62 Lu
+1e63 Ll
+1e64 Lu
+1e65 Ll
+1e66 Lu
+1e67 Ll
+1e68 Lu
+1e69 Ll
+1e6a Lu
+1e6b Ll
+1e6c Lu
+1e6d Ll
+1e6e Lu
+1e6f Ll
+1e70 Lu
+1e71 Ll
+1e72 Lu
+1e73 Ll
+1e74 Lu
+1e75 Ll
+1e76 Lu
+1e77 Ll
+1e78 Lu
+1e79 Ll
+1e7a Lu
+1e7b Ll
+1e7c Lu
+1e7d Ll
+1e7e Lu
+1e7f Ll
+1e80 Lu
+1e81 Ll
+1e82 Lu
+1e83 Ll
+1e84 Lu
+1e85 Ll
+1e86 Lu
+1e87 Ll
+1e88 Lu
+1e89 Ll
+1e8a Lu
+1e8b Ll
+1e8c Lu
+1e8d Ll
+1e8e Lu
+1e8f Ll
+1e90 Lu
+1e91 Ll
+1e92 Lu
+1e93 Ll
+1e94 Lu
+1e95 1e9b Ll
+1ea0 Lu
+1ea1 Ll
+1ea2 Lu
+1ea3 Ll
+1ea4 Lu
+1ea5 Ll
+1ea6 Lu
+1ea7 Ll
+1ea8 Lu
+1ea9 Ll
+1eaa Lu
+1eab Ll
+1eac Lu
+1ead Ll
+1eae Lu
+1eaf Ll
+1eb0 Lu
+1eb1 Ll
+1eb2 Lu
+1eb3 Ll
+1eb4 Lu
+1eb5 Ll
+1eb6 Lu
+1eb7 Ll
+1eb8 Lu
+1eb9 Ll
+1eba Lu
+1ebb Ll
+1ebc Lu
+1ebd Ll
+1ebe Lu
+1ebf Ll
+1ec0 Lu
+1ec1 Ll
+1ec2 Lu
+1ec3 Ll
+1ec4 Lu
+1ec5 Ll
+1ec6 Lu
+1ec7 Ll
+1ec8 Lu
+1ec9 Ll
+1eca Lu
+1ecb Ll
+1ecc Lu
+1ecd Ll
+1ece Lu
+1ecf Ll
+1ed0 Lu
+1ed1 Ll
+1ed2 Lu
+1ed3 Ll
+1ed4 Lu
+1ed5 Ll
+1ed6 Lu
+1ed7 Ll
+1ed8 Lu
+1ed9 Ll
+1eda Lu
+1edb Ll
+1edc Lu
+1edd Ll
+1ede Lu
+1edf Ll
+1ee0 Lu
+1ee1 Ll
+1ee2 Lu
+1ee3 Ll
+1ee4 Lu
+1ee5 Ll
+1ee6 Lu
+1ee7 Ll
+1ee8 Lu
+1ee9 Ll
+1eea Lu
+1eeb Ll
+1eec Lu
+1eed Ll
+1eee Lu
+1eef Ll
+1ef0 Lu
+1ef1 Ll
+1ef2 Lu
+1ef3 Ll
+1ef4 Lu
+1ef5 Ll
+1ef6 Lu
+1ef7 Ll
+1ef8 Lu
+1ef9 Ll
+1f00 1f07 Ll
+1f08 1f0f Lu
+1f10 1f15 Ll
+1f18 1f1d Lu
+1f20 1f27 Ll
+1f28 1f2f Lu
+1f30 1f37 Ll
+1f38 1f3f Lu
+1f40 1f45 Ll
+1f48 1f4d Lu
+1f50 1f57 Ll
+1f59 Lu
+1f5b Lu
+1f5d Lu
+1f5f Lu
+1f60 1f67 Ll
+1f68 1f6f Lu
+1f70 1f7d Ll
+1f80 1f87 Ll
+1f88 1f8f Lt
+1f90 1f97 Ll
+1f98 1f9f Lt
+1fa0 1fa7 Ll
+1fa8 1faf Lt
+1fb0 1fb4 Ll
+1fb6 1fb7 Ll
+1fb8 1fbb Lu
+1fbc Lt
+1fbd Sk
+1fbe Ll
+1fbf 1fc1 Sk
+1fc2 1fc4 Ll
+1fc6 1fc7 Ll
+1fc8 1fcb Lu
+1fcc Lt
+1fcd 1fcf Sk
+1fd0 1fd3 Ll
+1fd6 1fd7 Ll
+1fd8 1fdb Lu
+1fdd 1fdf Sk
+1fe0 1fe7 Ll
+1fe8 1fec Lu
+1fed 1fef Sk
+1ff2 1ff4 Ll
+1ff6 1ff7 Ll
+1ff8 1ffb Lu
+1ffc Lt
+1ffd 1ffe Sk
+2000 200b Zs
+200c 200f Cf
+2010 2015 Pd
+2016 2017 Po
+2018 Pi
+2019 Pf
+201a Ps
+201b 201c Pi
+201d Pf
+201e Ps
+201f Pi
+2020 2027 Po
+2028 Zl
+2029 Zp
+202a 202e Cf
+202f Zs
+2030 2038 Po
+2039 Pi
+203a Pf
+203b 203e Po
+203f 2040 Pc
+2041 2043 Po
+2044 Sm
+2045 Ps
+2046 Pe
+2048 204d Po
+206a 206f Cf
+2070 No
+2074 2079 No
+207a 207c Sm
+207d Ps
+207e Pe
+207f Ll
+2080 2089 No
+208a 208c Sm
+208d Ps
+208e Pe
+20a0 20af Sc
+20d0 20dc Mn
+20dd 20e0 Me
+20e1 Mn
+20e2 20e3 Me
+2100 2101 So
+2102 Lu
+2103 2106 So
+2107 Lu
+2108 2109 So
+210a Ll
+210b 210d Lu
+210e 210f Ll
+2110 2112 Lu
+2113 Ll
+2114 So
+2115 Lu
+2116 2118 So
+2119 211d Lu
+211e 2123 So
+2124 Lu
+2125 So
+2126 Lu
+2127 So
+2128 Lu
+2129 So
+212a 212d Lu
+212e So
+212f Ll
+2130 2131 Lu
+2132 So
+2133 Lu
+2134 Ll
+2135 2138 Lo
+2139 Ll
+213a So
+2153 215f No
+2160 2183 Nl
+2190 2194 Sm
+2195 2199 So
+219a 219b Sm
+219c 219f So
+21a0 Sm
+21a1 21a2 So
+21a3 Sm
+21a4 21a5 So
+21a6 Sm
+21a7 21ad So
+21ae Sm
+21af 21cd So
+21ce 21cf Sm
+21d0 21d1 So
+21d2 Sm
+21d3 So
+21d4 Sm
+21d5 21f3 So
+2200 22f1 Sm
+2300 2307 So
+2308 230b Sm
+230c 231f So
+2320 2321 Sm
+2322 2328 So
+2329 Ps
+232a Pe
+232b 237b So
+237d 239a So
+2400 2426 So
+2440 244a So
+2460 249b No
+249c 24e9 So
+24ea No
+2500 2595 So
+25a0 25b6 So
+25b7 Sm
+25b8 25c0 So
+25c1 Sm
+25c2 25f7 So
+2600 2613 So
+2619 266e So
+266f Sm
+2670 2671 So
+2701 2704 So
+2706 2709 So
+270c 2727 So
+2729 274b So
+274d So
+274f 2752 So
+2756 So
+2758 275e So
+2761 2767 So
+2776 2793 No
+2794 So
+2798 27af So
+27b1 27be So
+2800 28ff So
+2e80 2e99 So
+2e9b 2ef3 So
+2f00 2fd5 So
+2ff0 2ffb So
+3000 Zs
+3001 3003 Po
+3004 So
+3005 Lm
+3006 Lo
+3007 Nl
+3008 Ps
+3009 Pe
+300a Ps
+300b Pe
+300c Ps
+300d Pe
+300e Ps
+300f Pe
+3010 Ps
+3011 Pe
+3012 3013 So
+3014 Ps
+3015 Pe
+3016 Ps
+3017 Pe
+3018 Ps
+3019 Pe
+301a Ps
+301b Pe
+301c Pd
+301d Ps
+301e 301f Pe
+3020 So
+3021 3029 Nl
+302a 302f Mn
+3030 Pd
+3031 3035 Lm
+3036 3037 So
+3038 303a Nl
+303e 303f So
+3041 3094 Lo
+3099 309a Mn
+309b 309c Sk
+309d 309e Lm
+30a1 30fa Lo
+30fb Pc
+30fc 30fe Lm
+3105 312c Lo
+3131 318e Lo
+3190 3191 So
+3192 3195 No
+3196 319f So
+31a0 31b7 Lo
+3200 321c So
+3220 3229 No
+322a 3243 So
+3260 327b So
+327f So
+3280 3289 No
+328a 32b0 So
+32c0 32cb So
+32d0 32fe So
+3300 3376 So
+337b 33dd So
+33e0 33fe So
+3400 4db5 Lo
+4e00 9fa5 Lo
+a000 a48c Lo
+a490 a4a1 So
+a4a4 a4b3 So
+a4b5 a4c0 So
+a4c2 a4c4 So
+a4c6 So
+ac00 d7a3 Lo
+d800 db7f Cs
+db80 dbff Cs
+dc00 dfff Cs
+e000 f8ff Co
+f900 fa2d Lo
+fb00 fb06 Ll
+fb13 fb17 Ll
+fb1d Lo
+fb1e Mn
+fb1f fb28 Lo
+fb29 Sm
+fb2a fb36 Lo
+fb38 fb3c Lo
+fb3e Lo
+fb40 fb41 Lo
+fb43 fb44 Lo
+fb46 fbb1 Lo
+fbd3 fd3d Lo
+fd3e Ps
+fd3f Pe
+fd50 fd8f Lo
+fd92 fdc7 Lo
+fdf0 fdfb Lo
+fe20 fe23 Mn
+fe30 Po
+fe31 fe32 Pd
+fe33 fe34 Pc
+fe35 Ps
+fe36 Pe
+fe37 Ps
+fe38 Pe
+fe39 Ps
+fe3a Pe
+fe3b Ps
+fe3c Pe
+fe3d Ps
+fe3e Pe
+fe3f Ps
+fe40 Pe
+fe41 Ps
+fe42 Pe
+fe43 Ps
+fe44 Pe
+fe49 fe4c Po
+fe4d fe4f Pc
+fe50 fe52 Po
+fe54 fe57 Po
+fe58 Pd
+fe59 Ps
+fe5a Pe
+fe5b Ps
+fe5c Pe
+fe5d Ps
+fe5e Pe
+fe5f fe61 Po
+fe62 Sm
+fe63 Pd
+fe64 fe66 Sm
+fe68 Po
+fe69 Sc
+fe6a fe6b Po
+fe70 fe72 Lo
+fe74 Lo
+fe76 fefc Lo
+feff Cf
+ff01 ff03 Po
+ff04 Sc
+ff05 ff07 Po
+ff08 Ps
+ff09 Pe
+ff0a Po
+ff0b Sm
+ff0c Po
+ff0d Pd
+ff0e ff0f Po
+ff10 ff19 Nd
+ff1a ff1b Po
+ff1c ff1e Sm
+ff1f ff20 Po
+ff21 ff3a Lu
+ff3b Ps
+ff3c Po
+ff3d Pe
+ff3e Sk
+ff3f Pc
+ff40 Sk
+ff41 ff5a Ll
+ff5b Ps
+ff5c Sm
+ff5d Pe
+ff5e Sm
+ff61 Po
+ff62 Ps
+ff63 Pe
+ff64 Po
+ff65 Pc
+ff66 ff6f Lo
+ff70 Lm
+ff71 ff9d Lo
+ff9e ff9f Lm
+ffa0 ffbe Lo
+ffc2 ffc7 Lo
+ffca ffcf Lo
+ffd2 ffd7 Lo
+ffda ffdc Lo
+ffe0 ffe1 Sc
+ffe2 Sm
+ffe3 Sk
+ffe4 So
+ffe5 ffe6 Sc
+ffe8 So
+ffe9 ffec Sm
+ffed ffee So
+fff9 fffb Cf
+fffc fffd So
+END
diff --git a/contrib/perl5/lib/unicode/CombiningClass.pl b/contrib/perl5/lib/unicode/CombiningClass.pl
new file mode 100644
index 0000000..a409498
--- /dev/null
+++ b/contrib/perl5/lib/unicode/CombiningClass.pl
@@ -0,0 +1,152 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0300 0314 230
+0315 232
+0316 0319 220
+031a 232
+031b 216
+031c 0320 220
+0321 0322 202
+0323 0326 220
+0327 0328 202
+0329 0333 220
+0334 0338 1
+0339 033c 220
+033d 0344 230
+0345 240
+0346 230
+0347 0349 220
+034a 034c 230
+034d 034e 220
+0360 0361 234
+0362 233
+0483 0486 230
+0591 220
+0592 0595 230
+0596 220
+0597 0599 230
+059a 222
+059b 220
+059c 05a1 230
+05a3 05a7 220
+05a8 05a9 230
+05aa 220
+05ab 05ac 230
+05ad 222
+05ae 228
+05af 230
+05b0 10
+05b1 11
+05b2 12
+05b3 13
+05b4 14
+05b5 15
+05b6 16
+05b7 17
+05b8 18
+05b9 19
+05bb 20
+05bc 21
+05bd 22
+05bf 23
+05c1 24
+05c2 25
+05c4 230
+064b 27
+064c 28
+064d 29
+064e 30
+064f 31
+0650 32
+0651 33
+0652 34
+0653 0654 230
+0655 220
+0670 35
+06d6 06dc 230
+06df 06e2 230
+06e3 220
+06e4 230
+06e7 06e8 230
+06ea 220
+06eb 06ec 230
+06ed 220
+0711 36
+0730 230
+0731 220
+0732 0733 230
+0734 220
+0735 0736 230
+0737 0739 220
+073a 230
+073b 073c 220
+073d 230
+073e 220
+073f 0741 230
+0742 220
+0743 230
+0744 220
+0745 230
+0746 220
+0747 230
+0748 220
+0749 074a 230
+093c 7
+094d 9
+0951 230
+0952 220
+0953 0954 230
+09bc 7
+09cd 9
+0a3c 7
+0a4d 9
+0abc 7
+0acd 9
+0b3c 7
+0b4d 9
+0bcd 9
+0c4d 9
+0c55 84
+0c56 91
+0ccd 9
+0d4d 9
+0dca 9
+0e38 0e39 103
+0e3a 9
+0e48 0e4b 107
+0eb8 0eb9 118
+0ec8 0ecb 122
+0f18 0f19 220
+0f35 220
+0f37 220
+0f39 216
+0f71 129
+0f72 130
+0f74 132
+0f7a 0f7d 130
+0f80 130
+0f82 0f83 230
+0f84 9
+0f86 0f87 230
+0fc6 220
+1037 7
+1039 9
+17d2 9
+18a9 228
+20d0 20d1 230
+20d2 20d3 1
+20d4 20d7 230
+20d8 20da 1
+20db 20dc 230
+20e1 230
+302a 218
+302b 228
+302c 232
+302d 222
+302e 302f 224
+3099 309a 8
+fb1e 26
+fe20 fe23 230
+END
diff --git a/contrib/perl5/lib/unicode/CompExcl.txt b/contrib/perl5/lib/unicode/CompExcl.txt
new file mode 100644
index 0000000..5ea46af
--- /dev/null
+++ b/contrib/perl5/lib/unicode/CompExcl.txt
@@ -0,0 +1,143 @@
+# Composition Exclusions
+# This file lists the characters from the UTR #15 Composition Exclusion Table.
+#
+# For more information, see
+# http://www.unicode.org/unicode/reports/tr15/#Primary Exclusion List Table
+
+# (1) Script Specifics
+# This list of characters cannot be derived from the UnicodeData file.
+
+0958 # DEVANAGARI LETTER QA
+0959 # DEVANAGARI LETTER KHHA
+095A # DEVANAGARI LETTER GHHA
+095B # DEVANAGARI LETTER ZA
+095C # DEVANAGARI LETTER DDDHA
+095D # DEVANAGARI LETTER RHA
+095E # DEVANAGARI LETTER FA
+095F # DEVANAGARI LETTER YYA
+09DC # BENGALI LETTER RRA
+09DD # BENGALI LETTER RHA
+09DF # BENGALI LETTER YYA
+0A33 # GURMUKHI LETTER LLA
+0A36 # GURMUKHI LETTER SHA
+0A59 # GURMUKHI LETTER KHHA
+0A5A # GURMUKHI LETTER GHHA
+0A5B # GURMUKHI LETTER ZA
+0A5E # GURMUKHI LETTER FA
+0B5C # ORIYA LETTER RRA
+0B5D # ORIYA LETTER RHA
+0F43 # TIBETAN LETTER GHA
+0F4D # TIBETAN LETTER DDHA
+0F52 # TIBETAN LETTER DHA
+0F57 # TIBETAN LETTER BHA
+0F5C # TIBETAN LETTER DZHA
+0F69 # TIBETAN LETTER KSSA
+0F76 # TIBETAN VOWEL SIGN VOCALIC R
+0F78 # TIBETAN VOWEL SIGN VOCALIC L
+0F93 # TIBETAN SUBJOINED LETTER GHA
+0F9D # TIBETAN SUBJOINED LETTER DDHA
+0FA2 # TIBETAN SUBJOINED LETTER DHA
+0FA7 # TIBETAN SUBJOINED LETTER BHA
+0FAC # TIBETAN SUBJOINED LETTER DZHA
+0FB9 # TIBETAN SUBJOINED LETTER KSSA
+FB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB2A # HEBREW LETTER SHIN WITH SHIN DOT
+FB2B # HEBREW LETTER SHIN WITH SIN DOT
+FB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E # HEBREW LETTER ALEF WITH PATAH
+FB2F # HEBREW LETTER ALEF WITH QAMATS
+FB30 # HEBREW LETTER ALEF WITH MAPIQ
+FB31 # HEBREW LETTER BET WITH DAGESH
+FB32 # HEBREW LETTER GIMEL WITH DAGESH
+FB33 # HEBREW LETTER DALET WITH DAGESH
+FB34 # HEBREW LETTER HE WITH MAPIQ
+FB35 # HEBREW LETTER VAV WITH DAGESH
+FB36 # HEBREW LETTER ZAYIN WITH DAGESH
+FB38 # HEBREW LETTER TET WITH DAGESH
+FB39 # HEBREW LETTER YOD WITH DAGESH
+FB3A # HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B # HEBREW LETTER KAF WITH DAGESH
+FB3C # HEBREW LETTER LAMED WITH DAGESH
+FB3E # HEBREW LETTER MEM WITH DAGESH
+FB40 # HEBREW LETTER NUN WITH DAGESH
+FB41 # HEBREW LETTER SAMEKH WITH DAGESH
+FB43 # HEBREW LETTER FINAL PE WITH DAGESH
+FB44 # HEBREW LETTER PE WITH DAGESH
+FB46 # HEBREW LETTER TSADI WITH DAGESH
+FB47 # HEBREW LETTER QOF WITH DAGESH
+FB48 # HEBREW LETTER RESH WITH DAGESH
+FB49 # HEBREW LETTER SHIN WITH DAGESH
+FB4A # HEBREW LETTER TAV WITH DAGESH
+FB4B # HEBREW LETTER VAV WITH HOLAM
+FB4C # HEBREW LETTER BET WITH RAFE
+FB4D # HEBREW LETTER KAF WITH RAFE
+FB4E # HEBREW LETTER PE WITH RAFE
+
+# (2) Post Composition Version characters
+# These characters cannot be derived from the UnicodeData file.
+# (There are no characters in this category in this version of Unicode.)
+
+# (3) Singleton Decompositions
+# These characters can be derived from the UnicodeData file
+# by including all characters whose canonical decomposition
+# consists of a single character.
+# These characters are simply quoted here for reference.
+
+# 0340 COMBINING GRAVE TONE MARK
+# 0341 COMBINING ACUTE TONE MARK
+# 0343 COMBINING GREEK KORONIS
+# 0374 GREEK NUMERAL SIGN
+# 037E GREEK QUESTION MARK
+# 0387 GREEK ANO TELEIA
+# 1F71 GREEK SMALL LETTER ALPHA WITH OXIA
+# 1F73 GREEK SMALL LETTER EPSILON WITH OXIA
+# 1F75 GREEK SMALL LETTER ETA WITH OXIA
+# 1F77 GREEK SMALL LETTER IOTA WITH OXIA
+# 1F79 GREEK SMALL LETTER OMICRON WITH OXIA
+# 1F7B GREEK SMALL LETTER UPSILON WITH OXIA
+# 1F7D GREEK SMALL LETTER OMEGA WITH OXIA
+# 1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA
+# 1FBE GREEK PROSGEGRAMMENI
+# 1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA
+# 1FCB GREEK CAPITAL LETTER ETA WITH OXIA
+# 1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+# 1FDB GREEK CAPITAL LETTER IOTA WITH OXIA
+# 1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+# 1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA
+# 1FEE GREEK DIALYTIKA AND OXIA
+# 1FEF GREEK VARIA
+# 1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA
+# 1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA
+# 1FFD GREEK OXIA
+# 2000 EN QUAD
+# 2001 EM QUAD
+# 2126 OHM SIGN
+# 212A KELVIN SIGN
+# 212B ANGSTROM SIGN
+# 2329 LEFT-POINTING ANGLE BRACKET
+# 232A RIGHT-POINTING ANGLE BRACKET
+# F900 CJK COMPATIBILITY IDEOGRAPH-F900
+#.. FA0D CJK COMPATIBILITY IDEOGRAPH-FA0D
+# FA10 CJK COMPATIBILITY IDEOGRAPH-FA10
+# FA12 CJK COMPATIBILITY IDEOGRAPH-FA12
+# FA15 CJK COMPATIBILITY IDEOGRAPH-FA15
+#.. FA1E CJK COMPATIBILITY IDEOGRAPH-FA1E
+# FA20 CJK COMPATIBILITY IDEOGRAPH-FA20
+# FA22 CJK COMPATIBILITY IDEOGRAPH-FA22
+# FA25 CJK COMPATIBILITY IDEOGRAPH-FA25
+# FA26 CJK COMPATIBILITY IDEOGRAPH-FA26
+# FA2A CJK COMPATIBILITY IDEOGRAPH-FA2A
+#.. FA2D CJK COMPATIBILITY IDEOGRAPH-FA2D
+
+# (4) Non-Starter Decompositions
+# These characters can be derived from the UnicodeData file
+# by including all characters whose canonical decomposition consists
+# of a sequence of characters, the first of which has a canonical
+# class of zero.
+# These characters are simply quoted here for reference.
+
+# 0344 COMBINING GREEK DIALYTIKA TONOS
+# 0F73 TIBETAN VOWEL SIGN II
+# 0F75 TIBETAN VOWEL SIGN UU
+# 0F81 TIBETAN VOWEL SIGN REVERSED II
diff --git a/contrib/perl5/lib/unicode/Decomposition.pl b/contrib/perl5/lib/unicode/Decomposition.pl
new file mode 100644
index 0000000..ecc30b2
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Decomposition.pl
@@ -0,0 +1,3470 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00a0 <noBreak> 0020
+00a8 <compat> 0020 0308
+00aa <super> 0061
+00af <compat> 0020 0304
+00b2 <super> 0032
+00b3 <super> 0033
+00b4 <compat> 0020 0301
+00b5 <compat> 03BC
+00b8 <compat> 0020 0327
+00b9 <super> 0031
+00ba <super> 006F
+00bc <fraction> 0031 2044 0034
+00bd <fraction> 0031 2044 0032
+00be <fraction> 0033 2044 0034
+00c0 0041 0300
+00c1 0041 0301
+00c2 0041 0302
+00c3 0041 0303
+00c4 0041 0308
+00c5 0041 030A
+00c7 0043 0327
+00c8 0045 0300
+00c9 0045 0301
+00ca 0045 0302
+00cb 0045 0308
+00cc 0049 0300
+00cd 0049 0301
+00ce 0049 0302
+00cf 0049 0308
+00d1 004E 0303
+00d2 004F 0300
+00d3 004F 0301
+00d4 004F 0302
+00d5 004F 0303
+00d6 004F 0308
+00d9 0055 0300
+00da 0055 0301
+00db 0055 0302
+00dc 0055 0308
+00dd 0059 0301
+00e0 0061 0300
+00e1 0061 0301
+00e2 0061 0302
+00e3 0061 0303
+00e4 0061 0308
+00e5 0061 030A
+00e7 0063 0327
+00e8 0065 0300
+00e9 0065 0301
+00ea 0065 0302
+00eb 0065 0308
+00ec 0069 0300
+00ed 0069 0301
+00ee 0069 0302
+00ef 0069 0308
+00f1 006E 0303
+00f2 006F 0300
+00f3 006F 0301
+00f4 006F 0302
+00f5 006F 0303
+00f6 006F 0308
+00f9 0075 0300
+00fa 0075 0301
+00fb 0075 0302
+00fc 0075 0308
+00fd 0079 0301
+00ff 0079 0308
+0100 0041 0304
+0101 0061 0304
+0102 0041 0306
+0103 0061 0306
+0104 0041 0328
+0105 0061 0328
+0106 0043 0301
+0107 0063 0301
+0108 0043 0302
+0109 0063 0302
+010a 0043 0307
+010b 0063 0307
+010c 0043 030C
+010d 0063 030C
+010e 0044 030C
+010f 0064 030C
+0112 0045 0304
+0113 0065 0304
+0114 0045 0306
+0115 0065 0306
+0116 0045 0307
+0117 0065 0307
+0118 0045 0328
+0119 0065 0328
+011a 0045 030C
+011b 0065 030C
+011c 0047 0302
+011d 0067 0302
+011e 0047 0306
+011f 0067 0306
+0120 0047 0307
+0121 0067 0307
+0122 0047 0327
+0123 0067 0327
+0124 0048 0302
+0125 0068 0302
+0128 0049 0303
+0129 0069 0303
+012a 0049 0304
+012b 0069 0304
+012c 0049 0306
+012d 0069 0306
+012e 0049 0328
+012f 0069 0328
+0130 0049 0307
+0132 <compat> 0049 004A
+0133 <compat> 0069 006A
+0134 004A 0302
+0135 006A 0302
+0136 004B 0327
+0137 006B 0327
+0139 004C 0301
+013a 006C 0301
+013b 004C 0327
+013c 006C 0327
+013d 004C 030C
+013e 006C 030C
+013f <compat> 004C 00B7
+0140 <compat> 006C 00B7
+0143 004E 0301
+0144 006E 0301
+0145 004E 0327
+0146 006E 0327
+0147 004E 030C
+0148 006E 030C
+0149 <compat> 02BC 006E
+014c 004F 0304
+014d 006F 0304
+014e 004F 0306
+014f 006F 0306
+0150 004F 030B
+0151 006F 030B
+0154 0052 0301
+0155 0072 0301
+0156 0052 0327
+0157 0072 0327
+0158 0052 030C
+0159 0072 030C
+015a 0053 0301
+015b 0073 0301
+015c 0053 0302
+015d 0073 0302
+015e 0053 0327
+015f 0073 0327
+0160 0053 030C
+0161 0073 030C
+0162 0054 0327
+0163 0074 0327
+0164 0054 030C
+0165 0074 030C
+0168 0055 0303
+0169 0075 0303
+016a 0055 0304
+016b 0075 0304
+016c 0055 0306
+016d 0075 0306
+016e 0055 030A
+016f 0075 030A
+0170 0055 030B
+0171 0075 030B
+0172 0055 0328
+0173 0075 0328
+0174 0057 0302
+0175 0077 0302
+0176 0059 0302
+0177 0079 0302
+0178 0059 0308
+0179 005A 0301
+017a 007A 0301
+017b 005A 0307
+017c 007A 0307
+017d 005A 030C
+017e 007A 030C
+017f <compat> 0073
+01a0 004F 031B
+01a1 006F 031B
+01af 0055 031B
+01b0 0075 031B
+01c4 <compat> 0044 017D
+01c5 <compat> 0044 017E
+01c6 <compat> 0064 017E
+01c7 <compat> 004C 004A
+01c8 <compat> 004C 006A
+01c9 <compat> 006C 006A
+01ca <compat> 004E 004A
+01cb <compat> 004E 006A
+01cc <compat> 006E 006A
+01cd 0041 030C
+01ce 0061 030C
+01cf 0049 030C
+01d0 0069 030C
+01d1 004F 030C
+01d2 006F 030C
+01d3 0055 030C
+01d4 0075 030C
+01d5 00DC 0304
+01d6 00FC 0304
+01d7 00DC 0301
+01d8 00FC 0301
+01d9 00DC 030C
+01da 00FC 030C
+01db 00DC 0300
+01dc 00FC 0300
+01de 00C4 0304
+01df 00E4 0304
+01e0 0226 0304
+01e1 0227 0304
+01e2 00C6 0304
+01e3 00E6 0304
+01e6 0047 030C
+01e7 0067 030C
+01e8 004B 030C
+01e9 006B 030C
+01ea 004F 0328
+01eb 006F 0328
+01ec 01EA 0304
+01ed 01EB 0304
+01ee 01B7 030C
+01ef 0292 030C
+01f0 006A 030C
+01f1 <compat> 0044 005A
+01f2 <compat> 0044 007A
+01f3 <compat> 0064 007A
+01f4 0047 0301
+01f5 0067 0301
+01f8 004E 0300
+01f9 006E 0300
+01fa 00C5 0301
+01fb 00E5 0301
+01fc 00C6 0301
+01fd 00E6 0301
+01fe 00D8 0301
+01ff 00F8 0301
+0200 0041 030F
+0201 0061 030F
+0202 0041 0311
+0203 0061 0311
+0204 0045 030F
+0205 0065 030F
+0206 0045 0311
+0207 0065 0311
+0208 0049 030F
+0209 0069 030F
+020a 0049 0311
+020b 0069 0311
+020c 004F 030F
+020d 006F 030F
+020e 004F 0311
+020f 006F 0311
+0210 0052 030F
+0211 0072 030F
+0212 0052 0311
+0213 0072 0311
+0214 0055 030F
+0215 0075 030F
+0216 0055 0311
+0217 0075 0311
+0218 0053 0326
+0219 0073 0326
+021a 0054 0326
+021b 0074 0326
+021e 0048 030C
+021f 0068 030C
+0226 0041 0307
+0227 0061 0307
+0228 0045 0327
+0229 0065 0327
+022a 00D6 0304
+022b 00F6 0304
+022c 00D5 0304
+022d 00F5 0304
+022e 004F 0307
+022f 006F 0307
+0230 022E 0304
+0231 022F 0304
+0232 0059 0304
+0233 0079 0304
+02b0 <super> 0068
+02b1 <super> 0266
+02b2 <super> 006A
+02b3 <super> 0072
+02b4 <super> 0279
+02b5 <super> 027B
+02b6 <super> 0281
+02b7 <super> 0077
+02b8 <super> 0079
+02d8 <compat> 0020 0306
+02d9 <compat> 0020 0307
+02da <compat> 0020 030A
+02db <compat> 0020 0328
+02dc <compat> 0020 0303
+02dd <compat> 0020 030B
+02e0 <super> 0263
+02e1 <super> 006C
+02e2 <super> 0073
+02e3 <super> 0078
+02e4 <super> 0295
+0340 0300
+0341 0301
+0343 0313
+0344 0308 0301
+0374 02B9
+037a <compat> 0020 0345
+037e 003B
+0384 <compat> 0020 0301
+0385 00A8 0301
+0386 0391 0301
+0387 00B7
+0388 0395 0301
+0389 0397 0301
+038a 0399 0301
+038c 039F 0301
+038e 03A5 0301
+038f 03A9 0301
+0390 03CA 0301
+03aa 0399 0308
+03ab 03A5 0308
+03ac 03B1 0301
+03ad 03B5 0301
+03ae 03B7 0301
+03af 03B9 0301
+03b0 03CB 0301
+03ca 03B9 0308
+03cb 03C5 0308
+03cc 03BF 0301
+03cd 03C5 0301
+03ce 03C9 0301
+03d0 <compat> 03B2
+03d1 <compat> 03B8
+03d2 <compat> 03A5
+03d3 03D2 0301
+03d4 03D2 0308
+03d5 <compat> 03C6
+03d6 <compat> 03C0
+03f0 <compat> 03BA
+03f1 <compat> 03C1
+03f2 <compat> 03C2
+0400 0415 0300
+0401 0415 0308
+0403 0413 0301
+0407 0406 0308
+040c 041A 0301
+040d 0418 0300
+040e 0423 0306
+0419 0418 0306
+0439 0438 0306
+0450 0435 0300
+0451 0435 0308
+0453 0433 0301
+0457 0456 0308
+045c 043A 0301
+045d 0438 0300
+045e 0443 0306
+0476 0474 030F
+0477 0475 030F
+04c1 0416 0306
+04c2 0436 0306
+04d0 0410 0306
+04d1 0430 0306
+04d2 0410 0308
+04d3 0430 0308
+04d6 0415 0306
+04d7 0435 0306
+04da 04D8 0308
+04db 04D9 0308
+04dc 0416 0308
+04dd 0436 0308
+04de 0417 0308
+04df 0437 0308
+04e2 0418 0304
+04e3 0438 0304
+04e4 0418 0308
+04e5 0438 0308
+04e6 041E 0308
+04e7 043E 0308
+04ea 04E8 0308
+04eb 04E9 0308
+04ec 042D 0308
+04ed 044D 0308
+04ee 0423 0304
+04ef 0443 0304
+04f0 0423 0308
+04f1 0443 0308
+04f2 0423 030B
+04f3 0443 030B
+04f4 0427 0308
+04f5 0447 0308
+04f8 042B 0308
+04f9 044B 0308
+0587 <compat> 0565 0582
+0622 0627 0653
+0623 0627 0654
+0624 0648 0654
+0625 0627 0655
+0626 064A 0654
+0675 <compat> 0627 0674
+0676 <compat> 0648 0674
+0677 <compat> 06C7 0674
+0678 <compat> 064A 0674
+06c0 06D5 0654
+06c2 06C1 0654
+06d3 06D2 0654
+0929 0928 093C
+0931 0930 093C
+0934 0933 093C
+0958 0915 093C
+0959 0916 093C
+095a 0917 093C
+095b 091C 093C
+095c 0921 093C
+095d 0922 093C
+095e 092B 093C
+095f 092F 093C
+09cb 09C7 09BE
+09cc 09C7 09D7
+09dc 09A1 09BC
+09dd 09A2 09BC
+09df 09AF 09BC
+0a33 0A32 0A3C
+0a36 0A38 0A3C
+0a59 0A16 0A3C
+0a5a 0A17 0A3C
+0a5b 0A1C 0A3C
+0a5e 0A2B 0A3C
+0b48 0B47 0B56
+0b4b 0B47 0B3E
+0b4c 0B47 0B57
+0b5c 0B21 0B3C
+0b5d 0B22 0B3C
+0b94 0B92 0BD7
+0bca 0BC6 0BBE
+0bcb 0BC7 0BBE
+0bcc 0BC6 0BD7
+0c48 0C46 0C56
+0cc0 0CBF 0CD5
+0cc7 0CC6 0CD5
+0cc8 0CC6 0CD6
+0cca 0CC6 0CC2
+0ccb 0CCA 0CD5
+0d4a 0D46 0D3E
+0d4b 0D47 0D3E
+0d4c 0D46 0D57
+0dda 0DD9 0DCA
+0ddc 0DD9 0DCF
+0ddd 0DDC 0DCA
+0dde 0DD9 0DDF
+0e33 <compat> 0E4D 0E32
+0eb3 <compat> 0ECD 0EB2
+0edc <compat> 0EAB 0E99
+0edd <compat> 0EAB 0EA1
+0f0c <noBreak> 0F0B
+0f43 0F42 0FB7
+0f4d 0F4C 0FB7
+0f52 0F51 0FB7
+0f57 0F56 0FB7
+0f5c 0F5B 0FB7
+0f69 0F40 0FB5
+0f73 0F71 0F72
+0f75 0F71 0F74
+0f76 0FB2 0F80
+0f77 <compat> 0FB2 0F81
+0f78 0FB3 0F80
+0f79 <compat> 0FB3 0F81
+0f81 0F71 0F80
+0f93 0F92 0FB7
+0f9d 0F9C 0FB7
+0fa2 0FA1 0FB7
+0fa7 0FA6 0FB7
+0fac 0FAB 0FB7
+0fb9 0F90 0FB5
+1026 1025 102E
+1e00 0041 0325
+1e01 0061 0325
+1e02 0042 0307
+1e03 0062 0307
+1e04 0042 0323
+1e05 0062 0323
+1e06 0042 0331
+1e07 0062 0331
+1e08 00C7 0301
+1e09 00E7 0301
+1e0a 0044 0307
+1e0b 0064 0307
+1e0c 0044 0323
+1e0d 0064 0323
+1e0e 0044 0331
+1e0f 0064 0331
+1e10 0044 0327
+1e11 0064 0327
+1e12 0044 032D
+1e13 0064 032D
+1e14 0112 0300
+1e15 0113 0300
+1e16 0112 0301
+1e17 0113 0301
+1e18 0045 032D
+1e19 0065 032D
+1e1a 0045 0330
+1e1b 0065 0330
+1e1c 0228 0306
+1e1d 0229 0306
+1e1e 0046 0307
+1e1f 0066 0307
+1e20 0047 0304
+1e21 0067 0304
+1e22 0048 0307
+1e23 0068 0307
+1e24 0048 0323
+1e25 0068 0323
+1e26 0048 0308
+1e27 0068 0308
+1e28 0048 0327
+1e29 0068 0327
+1e2a 0048 032E
+1e2b 0068 032E
+1e2c 0049 0330
+1e2d 0069 0330
+1e2e 00CF 0301
+1e2f 00EF 0301
+1e30 004B 0301
+1e31 006B 0301
+1e32 004B 0323
+1e33 006B 0323
+1e34 004B 0331
+1e35 006B 0331
+1e36 004C 0323
+1e37 006C 0323
+1e38 1E36 0304
+1e39 1E37 0304
+1e3a 004C 0331
+1e3b 006C 0331
+1e3c 004C 032D
+1e3d 006C 032D
+1e3e 004D 0301
+1e3f 006D 0301
+1e40 004D 0307
+1e41 006D 0307
+1e42 004D 0323
+1e43 006D 0323
+1e44 004E 0307
+1e45 006E 0307
+1e46 004E 0323
+1e47 006E 0323
+1e48 004E 0331
+1e49 006E 0331
+1e4a 004E 032D
+1e4b 006E 032D
+1e4c 00D5 0301
+1e4d 00F5 0301
+1e4e 00D5 0308
+1e4f 00F5 0308
+1e50 014C 0300
+1e51 014D 0300
+1e52 014C 0301
+1e53 014D 0301
+1e54 0050 0301
+1e55 0070 0301
+1e56 0050 0307
+1e57 0070 0307
+1e58 0052 0307
+1e59 0072 0307
+1e5a 0052 0323
+1e5b 0072 0323
+1e5c 1E5A 0304
+1e5d 1E5B 0304
+1e5e 0052 0331
+1e5f 0072 0331
+1e60 0053 0307
+1e61 0073 0307
+1e62 0053 0323
+1e63 0073 0323
+1e64 015A 0307
+1e65 015B 0307
+1e66 0160 0307
+1e67 0161 0307
+1e68 1E62 0307
+1e69 1E63 0307
+1e6a 0054 0307
+1e6b 0074 0307
+1e6c 0054 0323
+1e6d 0074 0323
+1e6e 0054 0331
+1e6f 0074 0331
+1e70 0054 032D
+1e71 0074 032D
+1e72 0055 0324
+1e73 0075 0324
+1e74 0055 0330
+1e75 0075 0330
+1e76 0055 032D
+1e77 0075 032D
+1e78 0168 0301
+1e79 0169 0301
+1e7a 016A 0308
+1e7b 016B 0308
+1e7c 0056 0303
+1e7d 0076 0303
+1e7e 0056 0323
+1e7f 0076 0323
+1e80 0057 0300
+1e81 0077 0300
+1e82 0057 0301
+1e83 0077 0301
+1e84 0057 0308
+1e85 0077 0308
+1e86 0057 0307
+1e87 0077 0307
+1e88 0057 0323
+1e89 0077 0323
+1e8a 0058 0307
+1e8b 0078 0307
+1e8c 0058 0308
+1e8d 0078 0308
+1e8e 0059 0307
+1e8f 0079 0307
+1e90 005A 0302
+1e91 007A 0302
+1e92 005A 0323
+1e93 007A 0323
+1e94 005A 0331
+1e95 007A 0331
+1e96 0068 0331
+1e97 0074 0308
+1e98 0077 030A
+1e99 0079 030A
+1e9a <compat> 0061 02BE
+1e9b 017F 0307
+1ea0 0041 0323
+1ea1 0061 0323
+1ea2 0041 0309
+1ea3 0061 0309
+1ea4 00C2 0301
+1ea5 00E2 0301
+1ea6 00C2 0300
+1ea7 00E2 0300
+1ea8 00C2 0309
+1ea9 00E2 0309
+1eaa 00C2 0303
+1eab 00E2 0303
+1eac 1EA0 0302
+1ead 1EA1 0302
+1eae 0102 0301
+1eaf 0103 0301
+1eb0 0102 0300
+1eb1 0103 0300
+1eb2 0102 0309
+1eb3 0103 0309
+1eb4 0102 0303
+1eb5 0103 0303
+1eb6 1EA0 0306
+1eb7 1EA1 0306
+1eb8 0045 0323
+1eb9 0065 0323
+1eba 0045 0309
+1ebb 0065 0309
+1ebc 0045 0303
+1ebd 0065 0303
+1ebe 00CA 0301
+1ebf 00EA 0301
+1ec0 00CA 0300
+1ec1 00EA 0300
+1ec2 00CA 0309
+1ec3 00EA 0309
+1ec4 00CA 0303
+1ec5 00EA 0303
+1ec6 1EB8 0302
+1ec7 1EB9 0302
+1ec8 0049 0309
+1ec9 0069 0309
+1eca 0049 0323
+1ecb 0069 0323
+1ecc 004F 0323
+1ecd 006F 0323
+1ece 004F 0309
+1ecf 006F 0309
+1ed0 00D4 0301
+1ed1 00F4 0301
+1ed2 00D4 0300
+1ed3 00F4 0300
+1ed4 00D4 0309
+1ed5 00F4 0309
+1ed6 00D4 0303
+1ed7 00F4 0303
+1ed8 1ECC 0302
+1ed9 1ECD 0302
+1eda 01A0 0301
+1edb 01A1 0301
+1edc 01A0 0300
+1edd 01A1 0300
+1ede 01A0 0309
+1edf 01A1 0309
+1ee0 01A0 0303
+1ee1 01A1 0303
+1ee2 01A0 0323
+1ee3 01A1 0323
+1ee4 0055 0323
+1ee5 0075 0323
+1ee6 0055 0309
+1ee7 0075 0309
+1ee8 01AF 0301
+1ee9 01B0 0301
+1eea 01AF 0300
+1eeb 01B0 0300
+1eec 01AF 0309
+1eed 01B0 0309
+1eee 01AF 0303
+1eef 01B0 0303
+1ef0 01AF 0323
+1ef1 01B0 0323
+1ef2 0059 0300
+1ef3 0079 0300
+1ef4 0059 0323
+1ef5 0079 0323
+1ef6 0059 0309
+1ef7 0079 0309
+1ef8 0059 0303
+1ef9 0079 0303
+1f00 03B1 0313
+1f01 03B1 0314
+1f02 1F00 0300
+1f03 1F01 0300
+1f04 1F00 0301
+1f05 1F01 0301
+1f06 1F00 0342
+1f07 1F01 0342
+1f08 0391 0313
+1f09 0391 0314
+1f0a 1F08 0300
+1f0b 1F09 0300
+1f0c 1F08 0301
+1f0d 1F09 0301
+1f0e 1F08 0342
+1f0f 1F09 0342
+1f10 03B5 0313
+1f11 03B5 0314
+1f12 1F10 0300
+1f13 1F11 0300
+1f14 1F10 0301
+1f15 1F11 0301
+1f18 0395 0313
+1f19 0395 0314
+1f1a 1F18 0300
+1f1b 1F19 0300
+1f1c 1F18 0301
+1f1d 1F19 0301
+1f20 03B7 0313
+1f21 03B7 0314
+1f22 1F20 0300
+1f23 1F21 0300
+1f24 1F20 0301
+1f25 1F21 0301
+1f26 1F20 0342
+1f27 1F21 0342
+1f28 0397 0313
+1f29 0397 0314
+1f2a 1F28 0300
+1f2b 1F29 0300
+1f2c 1F28 0301
+1f2d 1F29 0301
+1f2e 1F28 0342
+1f2f 1F29 0342
+1f30 03B9 0313
+1f31 03B9 0314
+1f32 1F30 0300
+1f33 1F31 0300
+1f34 1F30 0301
+1f35 1F31 0301
+1f36 1F30 0342
+1f37 1F31 0342
+1f38 0399 0313
+1f39 0399 0314
+1f3a 1F38 0300
+1f3b 1F39 0300
+1f3c 1F38 0301
+1f3d 1F39 0301
+1f3e 1F38 0342
+1f3f 1F39 0342
+1f40 03BF 0313
+1f41 03BF 0314
+1f42 1F40 0300
+1f43 1F41 0300
+1f44 1F40 0301
+1f45 1F41 0301
+1f48 039F 0313
+1f49 039F 0314
+1f4a 1F48 0300
+1f4b 1F49 0300
+1f4c 1F48 0301
+1f4d 1F49 0301
+1f50 03C5 0313
+1f51 03C5 0314
+1f52 1F50 0300
+1f53 1F51 0300
+1f54 1F50 0301
+1f55 1F51 0301
+1f56 1F50 0342
+1f57 1F51 0342
+1f59 03A5 0314
+1f5b 1F59 0300
+1f5d 1F59 0301
+1f5f 1F59 0342
+1f60 03C9 0313
+1f61 03C9 0314
+1f62 1F60 0300
+1f63 1F61 0300
+1f64 1F60 0301
+1f65 1F61 0301
+1f66 1F60 0342
+1f67 1F61 0342
+1f68 03A9 0313
+1f69 03A9 0314
+1f6a 1F68 0300
+1f6b 1F69 0300
+1f6c 1F68 0301
+1f6d 1F69 0301
+1f6e 1F68 0342
+1f6f 1F69 0342
+1f70 03B1 0300
+1f71 03AC
+1f72 03B5 0300
+1f73 03AD
+1f74 03B7 0300
+1f75 03AE
+1f76 03B9 0300
+1f77 03AF
+1f78 03BF 0300
+1f79 03CC
+1f7a 03C5 0300
+1f7b 03CD
+1f7c 03C9 0300
+1f7d 03CE
+1f80 1F00 0345
+1f81 1F01 0345
+1f82 1F02 0345
+1f83 1F03 0345
+1f84 1F04 0345
+1f85 1F05 0345
+1f86 1F06 0345
+1f87 1F07 0345
+1f88 1F08 0345
+1f89 1F09 0345
+1f8a 1F0A 0345
+1f8b 1F0B 0345
+1f8c 1F0C 0345
+1f8d 1F0D 0345
+1f8e 1F0E 0345
+1f8f 1F0F 0345
+1f90 1F20 0345
+1f91 1F21 0345
+1f92 1F22 0345
+1f93 1F23 0345
+1f94 1F24 0345
+1f95 1F25 0345
+1f96 1F26 0345
+1f97 1F27 0345
+1f98 1F28 0345
+1f99 1F29 0345
+1f9a 1F2A 0345
+1f9b 1F2B 0345
+1f9c 1F2C 0345
+1f9d 1F2D 0345
+1f9e 1F2E 0345
+1f9f 1F2F 0345
+1fa0 1F60 0345
+1fa1 1F61 0345
+1fa2 1F62 0345
+1fa3 1F63 0345
+1fa4 1F64 0345
+1fa5 1F65 0345
+1fa6 1F66 0345
+1fa7 1F67 0345
+1fa8 1F68 0345
+1fa9 1F69 0345
+1faa 1F6A 0345
+1fab 1F6B 0345
+1fac 1F6C 0345
+1fad 1F6D 0345
+1fae 1F6E 0345
+1faf 1F6F 0345
+1fb0 03B1 0306
+1fb1 03B1 0304
+1fb2 1F70 0345
+1fb3 03B1 0345
+1fb4 03AC 0345
+1fb6 03B1 0342
+1fb7 1FB6 0345
+1fb8 0391 0306
+1fb9 0391 0304
+1fba 0391 0300
+1fbb 0386
+1fbc 0391 0345
+1fbd <compat> 0020 0313
+1fbe 03B9
+1fbf <compat> 0020 0313
+1fc0 <compat> 0020 0342
+1fc1 00A8 0342
+1fc2 1F74 0345
+1fc3 03B7 0345
+1fc4 03AE 0345
+1fc6 03B7 0342
+1fc7 1FC6 0345
+1fc8 0395 0300
+1fc9 0388
+1fca 0397 0300
+1fcb 0389
+1fcc 0397 0345
+1fcd 1FBF 0300
+1fce 1FBF 0301
+1fcf 1FBF 0342
+1fd0 03B9 0306
+1fd1 03B9 0304
+1fd2 03CA 0300
+1fd3 0390
+1fd6 03B9 0342
+1fd7 03CA 0342
+1fd8 0399 0306
+1fd9 0399 0304
+1fda 0399 0300
+1fdb 038A
+1fdd 1FFE 0300
+1fde 1FFE 0301
+1fdf 1FFE 0342
+1fe0 03C5 0306
+1fe1 03C5 0304
+1fe2 03CB 0300
+1fe3 03B0
+1fe4 03C1 0313
+1fe5 03C1 0314
+1fe6 03C5 0342
+1fe7 03CB 0342
+1fe8 03A5 0306
+1fe9 03A5 0304
+1fea 03A5 0300
+1feb 038E
+1fec 03A1 0314
+1fed 00A8 0300
+1fee 0385
+1fef 0060
+1ff2 1F7C 0345
+1ff3 03C9 0345
+1ff4 03CE 0345
+1ff6 03C9 0342
+1ff7 1FF6 0345
+1ff8 039F 0300
+1ff9 038C
+1ffa 03A9 0300
+1ffb 038F
+1ffc 03A9 0345
+1ffd 00B4
+1ffe <compat> 0020 0314
+2000 2002
+2001 2003
+2002 2006 <compat> 0020
+2007 <noBreak> 0020
+2008 200a <compat> 0020
+2011 <noBreak> 2010
+2017 <compat> 0020 0333
+2024 <compat> 002E
+2025 <compat> 002E 002E
+2026 <compat> 002E 002E 002E
+202f <noBreak> 0020
+2033 <compat> 2032 2032
+2034 <compat> 2032 2032 2032
+2036 <compat> 2035 2035
+2037 <compat> 2035 2035 2035
+203c <compat> 0021 0021
+203e <compat> 0020 0305
+2048 <compat> 003F 0021
+2049 <compat> 0021 003F
+2070 <super> 0030
+2074 <super> 0034
+2075 <super> 0035
+2076 <super> 0036
+2077 <super> 0037
+2078 <super> 0038
+2079 <super> 0039
+207a <super> 002B
+207b <super> 2212
+207c <super> 003D
+207d <super> 0028
+207e <super> 0029
+207f <super> 006E
+2080 <sub> 0030
+2081 <sub> 0031
+2082 <sub> 0032
+2083 <sub> 0033
+2084 <sub> 0034
+2085 <sub> 0035
+2086 <sub> 0036
+2087 <sub> 0037
+2088 <sub> 0038
+2089 <sub> 0039
+208a <sub> 002B
+208b <sub> 2212
+208c <sub> 003D
+208d <sub> 0028
+208e <sub> 0029
+20a8 <compat> 0052 0073
+2100 <compat> 0061 002F 0063
+2101 <compat> 0061 002F 0073
+2102 <font> 0043
+2103 <compat> 00B0 0043
+2105 <compat> 0063 002F 006F
+2106 <compat> 0063 002F 0075
+2107 <compat> 0190
+2109 <compat> 00B0 0046
+210a <font> 0067
+210b 210d <font> 0048
+210e <font> 0068
+210f <font> 0127
+2110 2111 <font> 0049
+2112 <font> 004C
+2113 <font> 006C
+2115 <font> 004E
+2116 <compat> 004E 006F
+2119 <font> 0050
+211a <font> 0051
+211b 211d <font> 0052
+2120 <super> 0053 004D
+2121 <compat> 0054 0045 004C
+2122 <super> 0054 004D
+2124 <font> 005A
+2126 03A9
+2128 <font> 005A
+212a 004B
+212b 00C5
+212c <font> 0042
+212d <font> 0043
+212f <font> 0065
+2130 <font> 0045
+2131 <font> 0046
+2133 <font> 004D
+2134 <font> 006F
+2135 <compat> 05D0
+2136 <compat> 05D1
+2137 <compat> 05D2
+2138 <compat> 05D3
+2139 <font> 0069
+2153 <fraction> 0031 2044 0033
+2154 <fraction> 0032 2044 0033
+2155 <fraction> 0031 2044 0035
+2156 <fraction> 0032 2044 0035
+2157 <fraction> 0033 2044 0035
+2158 <fraction> 0034 2044 0035
+2159 <fraction> 0031 2044 0036
+215a <fraction> 0035 2044 0036
+215b <fraction> 0031 2044 0038
+215c <fraction> 0033 2044 0038
+215d <fraction> 0035 2044 0038
+215e <fraction> 0037 2044 0038
+215f <fraction> 0031 2044
+2160 <compat> 0049
+2161 <compat> 0049 0049
+2162 <compat> 0049 0049 0049
+2163 <compat> 0049 0056
+2164 <compat> 0056
+2165 <compat> 0056 0049
+2166 <compat> 0056 0049 0049
+2167 <compat> 0056 0049 0049 0049
+2168 <compat> 0049 0058
+2169 <compat> 0058
+216a <compat> 0058 0049
+216b <compat> 0058 0049 0049
+216c <compat> 004C
+216d <compat> 0043
+216e <compat> 0044
+216f <compat> 004D
+2170 <compat> 0069
+2171 <compat> 0069 0069
+2172 <compat> 0069 0069 0069
+2173 <compat> 0069 0076
+2174 <compat> 0076
+2175 <compat> 0076 0069
+2176 <compat> 0076 0069 0069
+2177 <compat> 0076 0069 0069 0069
+2178 <compat> 0069 0078
+2179 <compat> 0078
+217a <compat> 0078 0069
+217b <compat> 0078 0069 0069
+217c <compat> 006C
+217d <compat> 0063
+217e <compat> 0064
+217f <compat> 006D
+219a 2190 0338
+219b 2192 0338
+21ae 2194 0338
+21cd 21D0 0338
+21ce 21D4 0338
+21cf 21D2 0338
+2204 2203 0338
+2209 2208 0338
+220c 220B 0338
+2224 2223 0338
+2226 2225 0338
+222c <compat> 222B 222B
+222d <compat> 222B 222B 222B
+222f <compat> 222E 222E
+2230 <compat> 222E 222E 222E
+2241 223C 0338
+2244 2243 0338
+2247 2245 0338
+2249 2248 0338
+2260 003D 0338
+2262 2261 0338
+226d 224D 0338
+226e 003C 0338
+226f 003E 0338
+2270 2264 0338
+2271 2265 0338
+2274 2272 0338
+2275 2273 0338
+2278 2276 0338
+2279 2277 0338
+2280 227A 0338
+2281 227B 0338
+2284 2282 0338
+2285 2283 0338
+2288 2286 0338
+2289 2287 0338
+22ac 22A2 0338
+22ad 22A8 0338
+22ae 22A9 0338
+22af 22AB 0338
+22e0 227C 0338
+22e1 227D 0338
+22e2 2291 0338
+22e3 2292 0338
+22ea 22B2 0338
+22eb 22B3 0338
+22ec 22B4 0338
+22ed 22B5 0338
+2329 3008
+232a 3009
+2460 <circle> 0031
+2461 <circle> 0032
+2462 <circle> 0033
+2463 <circle> 0034
+2464 <circle> 0035
+2465 <circle> 0036
+2466 <circle> 0037
+2467 <circle> 0038
+2468 <circle> 0039
+2469 <circle> 0031 0030
+246a <circle> 0031 0031
+246b <circle> 0031 0032
+246c <circle> 0031 0033
+246d <circle> 0031 0034
+246e <circle> 0031 0035
+246f <circle> 0031 0036
+2470 <circle> 0031 0037
+2471 <circle> 0031 0038
+2472 <circle> 0031 0039
+2473 <circle> 0032 0030
+2474 <compat> 0028 0031 0029
+2475 <compat> 0028 0032 0029
+2476 <compat> 0028 0033 0029
+2477 <compat> 0028 0034 0029
+2478 <compat> 0028 0035 0029
+2479 <compat> 0028 0036 0029
+247a <compat> 0028 0037 0029
+247b <compat> 0028 0038 0029
+247c <compat> 0028 0039 0029
+247d <compat> 0028 0031 0030 0029
+247e <compat> 0028 0031 0031 0029
+247f <compat> 0028 0031 0032 0029
+2480 <compat> 0028 0031 0033 0029
+2481 <compat> 0028 0031 0034 0029
+2482 <compat> 0028 0031 0035 0029
+2483 <compat> 0028 0031 0036 0029
+2484 <compat> 0028 0031 0037 0029
+2485 <compat> 0028 0031 0038 0029
+2486 <compat> 0028 0031 0039 0029
+2487 <compat> 0028 0032 0030 0029
+2488 <compat> 0031 002E
+2489 <compat> 0032 002E
+248a <compat> 0033 002E
+248b <compat> 0034 002E
+248c <compat> 0035 002E
+248d <compat> 0036 002E
+248e <compat> 0037 002E
+248f <compat> 0038 002E
+2490 <compat> 0039 002E
+2491 <compat> 0031 0030 002E
+2492 <compat> 0031 0031 002E
+2493 <compat> 0031 0032 002E
+2494 <compat> 0031 0033 002E
+2495 <compat> 0031 0034 002E
+2496 <compat> 0031 0035 002E
+2497 <compat> 0031 0036 002E
+2498 <compat> 0031 0037 002E
+2499 <compat> 0031 0038 002E
+249a <compat> 0031 0039 002E
+249b <compat> 0032 0030 002E
+249c <compat> 0028 0061 0029
+249d <compat> 0028 0062 0029
+249e <compat> 0028 0063 0029
+249f <compat> 0028 0064 0029
+24a0 <compat> 0028 0065 0029
+24a1 <compat> 0028 0066 0029
+24a2 <compat> 0028 0067 0029
+24a3 <compat> 0028 0068 0029
+24a4 <compat> 0028 0069 0029
+24a5 <compat> 0028 006A 0029
+24a6 <compat> 0028 006B 0029
+24a7 <compat> 0028 006C 0029
+24a8 <compat> 0028 006D 0029
+24a9 <compat> 0028 006E 0029
+24aa <compat> 0028 006F 0029
+24ab <compat> 0028 0070 0029
+24ac <compat> 0028 0071 0029
+24ad <compat> 0028 0072 0029
+24ae <compat> 0028 0073 0029
+24af <compat> 0028 0074 0029
+24b0 <compat> 0028 0075 0029
+24b1 <compat> 0028 0076 0029
+24b2 <compat> 0028 0077 0029
+24b3 <compat> 0028 0078 0029
+24b4 <compat> 0028 0079 0029
+24b5 <compat> 0028 007A 0029
+24b6 <circle> 0041
+24b7 <circle> 0042
+24b8 <circle> 0043
+24b9 <circle> 0044
+24ba <circle> 0045
+24bb <circle> 0046
+24bc <circle> 0047
+24bd <circle> 0048
+24be <circle> 0049
+24bf <circle> 004A
+24c0 <circle> 004B
+24c1 <circle> 004C
+24c2 <circle> 004D
+24c3 <circle> 004E
+24c4 <circle> 004F
+24c5 <circle> 0050
+24c6 <circle> 0051
+24c7 <circle> 0052
+24c8 <circle> 0053
+24c9 <circle> 0054
+24ca <circle> 0055
+24cb <circle> 0056
+24cc <circle> 0057
+24cd <circle> 0058
+24ce <circle> 0059
+24cf <circle> 005A
+24d0 <circle> 0061
+24d1 <circle> 0062
+24d2 <circle> 0063
+24d3 <circle> 0064
+24d4 <circle> 0065
+24d5 <circle> 0066
+24d6 <circle> 0067
+24d7 <circle> 0068
+24d8 <circle> 0069
+24d9 <circle> 006A
+24da <circle> 006B
+24db <circle> 006C
+24dc <circle> 006D
+24dd <circle> 006E
+24de <circle> 006F
+24df <circle> 0070
+24e0 <circle> 0071
+24e1 <circle> 0072
+24e2 <circle> 0073
+24e3 <circle> 0074
+24e4 <circle> 0075
+24e5 <circle> 0076
+24e6 <circle> 0077
+24e7 <circle> 0078
+24e8 <circle> 0079
+24e9 <circle> 007A
+24ea <circle> 0030
+2e9f <compat> 6BCD
+2ef3 <compat> 9F9F
+2f00 <compat> 4E00
+2f01 <compat> 4E28
+2f02 <compat> 4E36
+2f03 <compat> 4E3F
+2f04 <compat> 4E59
+2f05 <compat> 4E85
+2f06 <compat> 4E8C
+2f07 <compat> 4EA0
+2f08 <compat> 4EBA
+2f09 <compat> 513F
+2f0a <compat> 5165
+2f0b <compat> 516B
+2f0c <compat> 5182
+2f0d <compat> 5196
+2f0e <compat> 51AB
+2f0f <compat> 51E0
+2f10 <compat> 51F5
+2f11 <compat> 5200
+2f12 <compat> 529B
+2f13 <compat> 52F9
+2f14 <compat> 5315
+2f15 <compat> 531A
+2f16 <compat> 5338
+2f17 <compat> 5341
+2f18 <compat> 535C
+2f19 <compat> 5369
+2f1a <compat> 5382
+2f1b <compat> 53B6
+2f1c <compat> 53C8
+2f1d <compat> 53E3
+2f1e <compat> 56D7
+2f1f <compat> 571F
+2f20 <compat> 58EB
+2f21 <compat> 5902
+2f22 <compat> 590A
+2f23 <compat> 5915
+2f24 <compat> 5927
+2f25 <compat> 5973
+2f26 <compat> 5B50
+2f27 <compat> 5B80
+2f28 <compat> 5BF8
+2f29 <compat> 5C0F
+2f2a <compat> 5C22
+2f2b <compat> 5C38
+2f2c <compat> 5C6E
+2f2d <compat> 5C71
+2f2e <compat> 5DDB
+2f2f <compat> 5DE5
+2f30 <compat> 5DF1
+2f31 <compat> 5DFE
+2f32 <compat> 5E72
+2f33 <compat> 5E7A
+2f34 <compat> 5E7F
+2f35 <compat> 5EF4
+2f36 <compat> 5EFE
+2f37 <compat> 5F0B
+2f38 <compat> 5F13
+2f39 <compat> 5F50
+2f3a <compat> 5F61
+2f3b <compat> 5F73
+2f3c <compat> 5FC3
+2f3d <compat> 6208
+2f3e <compat> 6236
+2f3f <compat> 624B
+2f40 <compat> 652F
+2f41 <compat> 6534
+2f42 <compat> 6587
+2f43 <compat> 6597
+2f44 <compat> 65A4
+2f45 <compat> 65B9
+2f46 <compat> 65E0
+2f47 <compat> 65E5
+2f48 <compat> 66F0
+2f49 <compat> 6708
+2f4a <compat> 6728
+2f4b <compat> 6B20
+2f4c <compat> 6B62
+2f4d <compat> 6B79
+2f4e <compat> 6BB3
+2f4f <compat> 6BCB
+2f50 <compat> 6BD4
+2f51 <compat> 6BDB
+2f52 <compat> 6C0F
+2f53 <compat> 6C14
+2f54 <compat> 6C34
+2f55 <compat> 706B
+2f56 <compat> 722A
+2f57 <compat> 7236
+2f58 <compat> 723B
+2f59 <compat> 723F
+2f5a <compat> 7247
+2f5b <compat> 7259
+2f5c <compat> 725B
+2f5d <compat> 72AC
+2f5e <compat> 7384
+2f5f <compat> 7389
+2f60 <compat> 74DC
+2f61 <compat> 74E6
+2f62 <compat> 7518
+2f63 <compat> 751F
+2f64 <compat> 7528
+2f65 <compat> 7530
+2f66 <compat> 758B
+2f67 <compat> 7592
+2f68 <compat> 7676
+2f69 <compat> 767D
+2f6a <compat> 76AE
+2f6b <compat> 76BF
+2f6c <compat> 76EE
+2f6d <compat> 77DB
+2f6e <compat> 77E2
+2f6f <compat> 77F3
+2f70 <compat> 793A
+2f71 <compat> 79B8
+2f72 <compat> 79BE
+2f73 <compat> 7A74
+2f74 <compat> 7ACB
+2f75 <compat> 7AF9
+2f76 <compat> 7C73
+2f77 <compat> 7CF8
+2f78 <compat> 7F36
+2f79 <compat> 7F51
+2f7a <compat> 7F8A
+2f7b <compat> 7FBD
+2f7c <compat> 8001
+2f7d <compat> 800C
+2f7e <compat> 8012
+2f7f <compat> 8033
+2f80 <compat> 807F
+2f81 <compat> 8089
+2f82 <compat> 81E3
+2f83 <compat> 81EA
+2f84 <compat> 81F3
+2f85 <compat> 81FC
+2f86 <compat> 820C
+2f87 <compat> 821B
+2f88 <compat> 821F
+2f89 <compat> 826E
+2f8a <compat> 8272
+2f8b <compat> 8278
+2f8c <compat> 864D
+2f8d <compat> 866B
+2f8e <compat> 8840
+2f8f <compat> 884C
+2f90 <compat> 8863
+2f91 <compat> 897E
+2f92 <compat> 898B
+2f93 <compat> 89D2
+2f94 <compat> 8A00
+2f95 <compat> 8C37
+2f96 <compat> 8C46
+2f97 <compat> 8C55
+2f98 <compat> 8C78
+2f99 <compat> 8C9D
+2f9a <compat> 8D64
+2f9b <compat> 8D70
+2f9c <compat> 8DB3
+2f9d <compat> 8EAB
+2f9e <compat> 8ECA
+2f9f <compat> 8F9B
+2fa0 <compat> 8FB0
+2fa1 <compat> 8FB5
+2fa2 <compat> 9091
+2fa3 <compat> 9149
+2fa4 <compat> 91C6
+2fa5 <compat> 91CC
+2fa6 <compat> 91D1
+2fa7 <compat> 9577
+2fa8 <compat> 9580
+2fa9 <compat> 961C
+2faa <compat> 96B6
+2fab <compat> 96B9
+2fac <compat> 96E8
+2fad <compat> 9751
+2fae <compat> 975E
+2faf <compat> 9762
+2fb0 <compat> 9769
+2fb1 <compat> 97CB
+2fb2 <compat> 97ED
+2fb3 <compat> 97F3
+2fb4 <compat> 9801
+2fb5 <compat> 98A8
+2fb6 <compat> 98DB
+2fb7 <compat> 98DF
+2fb8 <compat> 9996
+2fb9 <compat> 9999
+2fba <compat> 99AC
+2fbb <compat> 9AA8
+2fbc <compat> 9AD8
+2fbd <compat> 9ADF
+2fbe <compat> 9B25
+2fbf <compat> 9B2F
+2fc0 <compat> 9B32
+2fc1 <compat> 9B3C
+2fc2 <compat> 9B5A
+2fc3 <compat> 9CE5
+2fc4 <compat> 9E75
+2fc5 <compat> 9E7F
+2fc6 <compat> 9EA5
+2fc7 <compat> 9EBB
+2fc8 <compat> 9EC3
+2fc9 <compat> 9ECD
+2fca <compat> 9ED1
+2fcb <compat> 9EF9
+2fcc <compat> 9EFD
+2fcd <compat> 9F0E
+2fce <compat> 9F13
+2fcf <compat> 9F20
+2fd0 <compat> 9F3B
+2fd1 <compat> 9F4A
+2fd2 <compat> 9F52
+2fd3 <compat> 9F8D
+2fd4 <compat> 9F9C
+2fd5 <compat> 9FA0
+3000 <wide> 0020
+3036 <compat> 3012
+3038 <compat> 5341
+3039 <compat> 5344
+303a <compat> 5345
+304c 304B 3099
+304e 304D 3099
+3050 304F 3099
+3052 3051 3099
+3054 3053 3099
+3056 3055 3099
+3058 3057 3099
+305a 3059 3099
+305c 305B 3099
+305e 305D 3099
+3060 305F 3099
+3062 3061 3099
+3065 3064 3099
+3067 3066 3099
+3069 3068 3099
+3070 306F 3099
+3071 306F 309A
+3073 3072 3099
+3074 3072 309A
+3076 3075 3099
+3077 3075 309A
+3079 3078 3099
+307a 3078 309A
+307c 307B 3099
+307d 307B 309A
+3094 3046 3099
+309b <compat> 0020 3099
+309c <compat> 0020 309A
+309e 309D 3099
+30ac 30AB 3099
+30ae 30AD 3099
+30b0 30AF 3099
+30b2 30B1 3099
+30b4 30B3 3099
+30b6 30B5 3099
+30b8 30B7 3099
+30ba 30B9 3099
+30bc 30BB 3099
+30be 30BD 3099
+30c0 30BF 3099
+30c2 30C1 3099
+30c5 30C4 3099
+30c7 30C6 3099
+30c9 30C8 3099
+30d0 30CF 3099
+30d1 30CF 309A
+30d3 30D2 3099
+30d4 30D2 309A
+30d6 30D5 3099
+30d7 30D5 309A
+30d9 30D8 3099
+30da 30D8 309A
+30dc 30DB 3099
+30dd 30DB 309A
+30f4 30A6 3099
+30f7 30EF 3099
+30f8 30F0 3099
+30f9 30F1 3099
+30fa 30F2 3099
+30fe 30FD 3099
+3131 <compat> 1100
+3132 <compat> 1101
+3133 <compat> 11AA
+3134 <compat> 1102
+3135 <compat> 11AC
+3136 <compat> 11AD
+3137 <compat> 1103
+3138 <compat> 1104
+3139 <compat> 1105
+313a <compat> 11B0
+313b <compat> 11B1
+313c <compat> 11B2
+313d <compat> 11B3
+313e <compat> 11B4
+313f <compat> 11B5
+3140 <compat> 111A
+3141 <compat> 1106
+3142 <compat> 1107
+3143 <compat> 1108
+3144 <compat> 1121
+3145 <compat> 1109
+3146 <compat> 110A
+3147 <compat> 110B
+3148 <compat> 110C
+3149 <compat> 110D
+314a <compat> 110E
+314b <compat> 110F
+314c <compat> 1110
+314d <compat> 1111
+314e <compat> 1112
+314f <compat> 1161
+3150 <compat> 1162
+3151 <compat> 1163
+3152 <compat> 1164
+3153 <compat> 1165
+3154 <compat> 1166
+3155 <compat> 1167
+3156 <compat> 1168
+3157 <compat> 1169
+3158 <compat> 116A
+3159 <compat> 116B
+315a <compat> 116C
+315b <compat> 116D
+315c <compat> 116E
+315d <compat> 116F
+315e <compat> 1170
+315f <compat> 1171
+3160 <compat> 1172
+3161 <compat> 1173
+3162 <compat> 1174
+3163 <compat> 1175
+3164 <compat> 1160
+3165 <compat> 1114
+3166 <compat> 1115
+3167 <compat> 11C7
+3168 <compat> 11C8
+3169 <compat> 11CC
+316a <compat> 11CE
+316b <compat> 11D3
+316c <compat> 11D7
+316d <compat> 11D9
+316e <compat> 111C
+316f <compat> 11DD
+3170 <compat> 11DF
+3171 <compat> 111D
+3172 <compat> 111E
+3173 <compat> 1120
+3174 <compat> 1122
+3175 <compat> 1123
+3176 <compat> 1127
+3177 <compat> 1129
+3178 <compat> 112B
+3179 <compat> 112C
+317a <compat> 112D
+317b <compat> 112E
+317c <compat> 112F
+317d <compat> 1132
+317e <compat> 1136
+317f <compat> 1140
+3180 <compat> 1147
+3181 <compat> 114C
+3182 <compat> 11F1
+3183 <compat> 11F2
+3184 <compat> 1157
+3185 <compat> 1158
+3186 <compat> 1159
+3187 <compat> 1184
+3188 <compat> 1185
+3189 <compat> 1188
+318a <compat> 1191
+318b <compat> 1192
+318c <compat> 1194
+318d <compat> 119E
+318e <compat> 11A1
+3192 <super> 4E00
+3193 <super> 4E8C
+3194 <super> 4E09
+3195 <super> 56DB
+3196 <super> 4E0A
+3197 <super> 4E2D
+3198 <super> 4E0B
+3199 <super> 7532
+319a <super> 4E59
+319b <super> 4E19
+319c <super> 4E01
+319d <super> 5929
+319e <super> 5730
+319f <super> 4EBA
+3200 <compat> 0028 1100 0029
+3201 <compat> 0028 1102 0029
+3202 <compat> 0028 1103 0029
+3203 <compat> 0028 1105 0029
+3204 <compat> 0028 1106 0029
+3205 <compat> 0028 1107 0029
+3206 <compat> 0028 1109 0029
+3207 <compat> 0028 110B 0029
+3208 <compat> 0028 110C 0029
+3209 <compat> 0028 110E 0029
+320a <compat> 0028 110F 0029
+320b <compat> 0028 1110 0029
+320c <compat> 0028 1111 0029
+320d <compat> 0028 1112 0029
+320e <compat> 0028 1100 1161 0029
+320f <compat> 0028 1102 1161 0029
+3210 <compat> 0028 1103 1161 0029
+3211 <compat> 0028 1105 1161 0029
+3212 <compat> 0028 1106 1161 0029
+3213 <compat> 0028 1107 1161 0029
+3214 <compat> 0028 1109 1161 0029
+3215 <compat> 0028 110B 1161 0029
+3216 <compat> 0028 110C 1161 0029
+3217 <compat> 0028 110E 1161 0029
+3218 <compat> 0028 110F 1161 0029
+3219 <compat> 0028 1110 1161 0029
+321a <compat> 0028 1111 1161 0029
+321b <compat> 0028 1112 1161 0029
+321c <compat> 0028 110C 116E 0029
+3220 <compat> 0028 4E00 0029
+3221 <compat> 0028 4E8C 0029
+3222 <compat> 0028 4E09 0029
+3223 <compat> 0028 56DB 0029
+3224 <compat> 0028 4E94 0029
+3225 <compat> 0028 516D 0029
+3226 <compat> 0028 4E03 0029
+3227 <compat> 0028 516B 0029
+3228 <compat> 0028 4E5D 0029
+3229 <compat> 0028 5341 0029
+322a <compat> 0028 6708 0029
+322b <compat> 0028 706B 0029
+322c <compat> 0028 6C34 0029
+322d <compat> 0028 6728 0029
+322e <compat> 0028 91D1 0029
+322f <compat> 0028 571F 0029
+3230 <compat> 0028 65E5 0029
+3231 <compat> 0028 682A 0029
+3232 <compat> 0028 6709 0029
+3233 <compat> 0028 793E 0029
+3234 <compat> 0028 540D 0029
+3235 <compat> 0028 7279 0029
+3236 <compat> 0028 8CA1 0029
+3237 <compat> 0028 795D 0029
+3238 <compat> 0028 52B4 0029
+3239 <compat> 0028 4EE3 0029
+323a <compat> 0028 547C 0029
+323b <compat> 0028 5B66 0029
+323c <compat> 0028 76E3 0029
+323d <compat> 0028 4F01 0029
+323e <compat> 0028 8CC7 0029
+323f <compat> 0028 5354 0029
+3240 <compat> 0028 796D 0029
+3241 <compat> 0028 4F11 0029
+3242 <compat> 0028 81EA 0029
+3243 <compat> 0028 81F3 0029
+3260 <circle> 1100
+3261 <circle> 1102
+3262 <circle> 1103
+3263 <circle> 1105
+3264 <circle> 1106
+3265 <circle> 1107
+3266 <circle> 1109
+3267 <circle> 110B
+3268 <circle> 110C
+3269 <circle> 110E
+326a <circle> 110F
+326b <circle> 1110
+326c <circle> 1111
+326d <circle> 1112
+326e <circle> 1100 1161
+326f <circle> 1102 1161
+3270 <circle> 1103 1161
+3271 <circle> 1105 1161
+3272 <circle> 1106 1161
+3273 <circle> 1107 1161
+3274 <circle> 1109 1161
+3275 <circle> 110B 1161
+3276 <circle> 110C 1161
+3277 <circle> 110E 1161
+3278 <circle> 110F 1161
+3279 <circle> 1110 1161
+327a <circle> 1111 1161
+327b <circle> 1112 1161
+3280 <circle> 4E00
+3281 <circle> 4E8C
+3282 <circle> 4E09
+3283 <circle> 56DB
+3284 <circle> 4E94
+3285 <circle> 516D
+3286 <circle> 4E03
+3287 <circle> 516B
+3288 <circle> 4E5D
+3289 <circle> 5341
+328a <circle> 6708
+328b <circle> 706B
+328c <circle> 6C34
+328d <circle> 6728
+328e <circle> 91D1
+328f <circle> 571F
+3290 <circle> 65E5
+3291 <circle> 682A
+3292 <circle> 6709
+3293 <circle> 793E
+3294 <circle> 540D
+3295 <circle> 7279
+3296 <circle> 8CA1
+3297 <circle> 795D
+3298 <circle> 52B4
+3299 <circle> 79D8
+329a <circle> 7537
+329b <circle> 5973
+329c <circle> 9069
+329d <circle> 512A
+329e <circle> 5370
+329f <circle> 6CE8
+32a0 <circle> 9805
+32a1 <circle> 4F11
+32a2 <circle> 5199
+32a3 <circle> 6B63
+32a4 <circle> 4E0A
+32a5 <circle> 4E2D
+32a6 <circle> 4E0B
+32a7 <circle> 5DE6
+32a8 <circle> 53F3
+32a9 <circle> 533B
+32aa <circle> 5B97
+32ab <circle> 5B66
+32ac <circle> 76E3
+32ad <circle> 4F01
+32ae <circle> 8CC7
+32af <circle> 5354
+32b0 <circle> 591C
+32c0 <compat> 0031 6708
+32c1 <compat> 0032 6708
+32c2 <compat> 0033 6708
+32c3 <compat> 0034 6708
+32c4 <compat> 0035 6708
+32c5 <compat> 0036 6708
+32c6 <compat> 0037 6708
+32c7 <compat> 0038 6708
+32c8 <compat> 0039 6708
+32c9 <compat> 0031 0030 6708
+32ca <compat> 0031 0031 6708
+32cb <compat> 0031 0032 6708
+32d0 <circle> 30A2
+32d1 <circle> 30A4
+32d2 <circle> 30A6
+32d3 <circle> 30A8
+32d4 <circle> 30AA
+32d5 <circle> 30AB
+32d6 <circle> 30AD
+32d7 <circle> 30AF
+32d8 <circle> 30B1
+32d9 <circle> 30B3
+32da <circle> 30B5
+32db <circle> 30B7
+32dc <circle> 30B9
+32dd <circle> 30BB
+32de <circle> 30BD
+32df <circle> 30BF
+32e0 <circle> 30C1
+32e1 <circle> 30C4
+32e2 <circle> 30C6
+32e3 <circle> 30C8
+32e4 <circle> 30CA
+32e5 <circle> 30CB
+32e6 <circle> 30CC
+32e7 <circle> 30CD
+32e8 <circle> 30CE
+32e9 <circle> 30CF
+32ea <circle> 30D2
+32eb <circle> 30D5
+32ec <circle> 30D8
+32ed <circle> 30DB
+32ee <circle> 30DE
+32ef <circle> 30DF
+32f0 <circle> 30E0
+32f1 <circle> 30E1
+32f2 <circle> 30E2
+32f3 <circle> 30E4
+32f4 <circle> 30E6
+32f5 <circle> 30E8
+32f6 <circle> 30E9
+32f7 <circle> 30EA
+32f8 <circle> 30EB
+32f9 <circle> 30EC
+32fa <circle> 30ED
+32fb <circle> 30EF
+32fc <circle> 30F0
+32fd <circle> 30F1
+32fe <circle> 30F2
+3300 <square> 30A2 30D1 30FC 30C8
+3301 <square> 30A2 30EB 30D5 30A1
+3302 <square> 30A2 30F3 30DA 30A2
+3303 <square> 30A2 30FC 30EB
+3304 <square> 30A4 30CB 30F3 30B0
+3305 <square> 30A4 30F3 30C1
+3306 <square> 30A6 30A9 30F3
+3307 <square> 30A8 30B9 30AF 30FC 30C9
+3308 <square> 30A8 30FC 30AB 30FC
+3309 <square> 30AA 30F3 30B9
+330a <square> 30AA 30FC 30E0
+330b <square> 30AB 30A4 30EA
+330c <square> 30AB 30E9 30C3 30C8
+330d <square> 30AB 30ED 30EA 30FC
+330e <square> 30AC 30ED 30F3
+330f <square> 30AC 30F3 30DE
+3310 <square> 30AE 30AC
+3311 <square> 30AE 30CB 30FC
+3312 <square> 30AD 30E5 30EA 30FC
+3313 <square> 30AE 30EB 30C0 30FC
+3314 <square> 30AD 30ED
+3315 <square> 30AD 30ED 30B0 30E9 30E0
+3316 <square> 30AD 30ED 30E1 30FC 30C8 30EB
+3317 <square> 30AD 30ED 30EF 30C3 30C8
+3318 <square> 30B0 30E9 30E0
+3319 <square> 30B0 30E9 30E0 30C8 30F3
+331a <square> 30AF 30EB 30BC 30A4 30ED
+331b <square> 30AF 30ED 30FC 30CD
+331c <square> 30B1 30FC 30B9
+331d <square> 30B3 30EB 30CA
+331e <square> 30B3 30FC 30DD
+331f <square> 30B5 30A4 30AF 30EB
+3320 <square> 30B5 30F3 30C1 30FC 30E0
+3321 <square> 30B7 30EA 30F3 30B0
+3322 <square> 30BB 30F3 30C1
+3323 <square> 30BB 30F3 30C8
+3324 <square> 30C0 30FC 30B9
+3325 <square> 30C7 30B7
+3326 <square> 30C9 30EB
+3327 <square> 30C8 30F3
+3328 <square> 30CA 30CE
+3329 <square> 30CE 30C3 30C8
+332a <square> 30CF 30A4 30C4
+332b <square> 30D1 30FC 30BB 30F3 30C8
+332c <square> 30D1 30FC 30C4
+332d <square> 30D0 30FC 30EC 30EB
+332e <square> 30D4 30A2 30B9 30C8 30EB
+332f <square> 30D4 30AF 30EB
+3330 <square> 30D4 30B3
+3331 <square> 30D3 30EB
+3332 <square> 30D5 30A1 30E9 30C3 30C9
+3333 <square> 30D5 30A3 30FC 30C8
+3334 <square> 30D6 30C3 30B7 30A7 30EB
+3335 <square> 30D5 30E9 30F3
+3336 <square> 30D8 30AF 30BF 30FC 30EB
+3337 <square> 30DA 30BD
+3338 <square> 30DA 30CB 30D2
+3339 <square> 30D8 30EB 30C4
+333a <square> 30DA 30F3 30B9
+333b <square> 30DA 30FC 30B8
+333c <square> 30D9 30FC 30BF
+333d <square> 30DD 30A4 30F3 30C8
+333e <square> 30DC 30EB 30C8
+333f <square> 30DB 30F3
+3340 <square> 30DD 30F3 30C9
+3341 <square> 30DB 30FC 30EB
+3342 <square> 30DB 30FC 30F3
+3343 <square> 30DE 30A4 30AF 30ED
+3344 <square> 30DE 30A4 30EB
+3345 <square> 30DE 30C3 30CF
+3346 <square> 30DE 30EB 30AF
+3347 <square> 30DE 30F3 30B7 30E7 30F3
+3348 <square> 30DF 30AF 30ED 30F3
+3349 <square> 30DF 30EA
+334a <square> 30DF 30EA 30D0 30FC 30EB
+334b <square> 30E1 30AC
+334c <square> 30E1 30AC 30C8 30F3
+334d <square> 30E1 30FC 30C8 30EB
+334e <square> 30E4 30FC 30C9
+334f <square> 30E4 30FC 30EB
+3350 <square> 30E6 30A2 30F3
+3351 <square> 30EA 30C3 30C8 30EB
+3352 <square> 30EA 30E9
+3353 <square> 30EB 30D4 30FC
+3354 <square> 30EB 30FC 30D6 30EB
+3355 <square> 30EC 30E0
+3356 <square> 30EC 30F3 30C8 30B2 30F3
+3357 <square> 30EF 30C3 30C8
+3358 <compat> 0030 70B9
+3359 <compat> 0031 70B9
+335a <compat> 0032 70B9
+335b <compat> 0033 70B9
+335c <compat> 0034 70B9
+335d <compat> 0035 70B9
+335e <compat> 0036 70B9
+335f <compat> 0037 70B9
+3360 <compat> 0038 70B9
+3361 <compat> 0039 70B9
+3362 <compat> 0031 0030 70B9
+3363 <compat> 0031 0031 70B9
+3364 <compat> 0031 0032 70B9
+3365 <compat> 0031 0033 70B9
+3366 <compat> 0031 0034 70B9
+3367 <compat> 0031 0035 70B9
+3368 <compat> 0031 0036 70B9
+3369 <compat> 0031 0037 70B9
+336a <compat> 0031 0038 70B9
+336b <compat> 0031 0039 70B9
+336c <compat> 0032 0030 70B9
+336d <compat> 0032 0031 70B9
+336e <compat> 0032 0032 70B9
+336f <compat> 0032 0033 70B9
+3370 <compat> 0032 0034 70B9
+3371 <square> 0068 0050 0061
+3372 <square> 0064 0061
+3373 <square> 0041 0055
+3374 <square> 0062 0061 0072
+3375 <square> 006F 0056
+3376 <square> 0070 0063
+337b <square> 5E73 6210
+337c <square> 662D 548C
+337d <square> 5927 6B63
+337e <square> 660E 6CBB
+337f <square> 682A 5F0F 4F1A 793E
+3380 <square> 0070 0041
+3381 <square> 006E 0041
+3382 <square> 03BC 0041
+3383 <square> 006D 0041
+3384 <square> 006B 0041
+3385 <square> 004B 0042
+3386 <square> 004D 0042
+3387 <square> 0047 0042
+3388 <square> 0063 0061 006C
+3389 <square> 006B 0063 0061 006C
+338a <square> 0070 0046
+338b <square> 006E 0046
+338c <square> 03BC 0046
+338d <square> 03BC 0067
+338e <square> 006D 0067
+338f <square> 006B 0067
+3390 <square> 0048 007A
+3391 <square> 006B 0048 007A
+3392 <square> 004D 0048 007A
+3393 <square> 0047 0048 007A
+3394 <square> 0054 0048 007A
+3395 <square> 03BC 2113
+3396 <square> 006D 2113
+3397 <square> 0064 2113
+3398 <square> 006B 2113
+3399 <square> 0066 006D
+339a <square> 006E 006D
+339b <square> 03BC 006D
+339c <square> 006D 006D
+339d <square> 0063 006D
+339e <square> 006B 006D
+339f <square> 006D 006D 00B2
+33a0 <square> 0063 006D 00B2
+33a1 <square> 006D 00B2
+33a2 <square> 006B 006D 00B2
+33a3 <square> 006D 006D 00B3
+33a4 <square> 0063 006D 00B3
+33a5 <square> 006D 00B3
+33a6 <square> 006B 006D 00B3
+33a7 <square> 006D 2215 0073
+33a8 <square> 006D 2215 0073 00B2
+33a9 <square> 0050 0061
+33aa <square> 006B 0050 0061
+33ab <square> 004D 0050 0061
+33ac <square> 0047 0050 0061
+33ad <square> 0072 0061 0064
+33ae <square> 0072 0061 0064 2215 0073
+33af <square> 0072 0061 0064 2215 0073 00B2
+33b0 <square> 0070 0073
+33b1 <square> 006E 0073
+33b2 <square> 03BC 0073
+33b3 <square> 006D 0073
+33b4 <square> 0070 0056
+33b5 <square> 006E 0056
+33b6 <square> 03BC 0056
+33b7 <square> 006D 0056
+33b8 <square> 006B 0056
+33b9 <square> 004D 0056
+33ba <square> 0070 0057
+33bb <square> 006E 0057
+33bc <square> 03BC 0057
+33bd <square> 006D 0057
+33be <square> 006B 0057
+33bf <square> 004D 0057
+33c0 <square> 006B 03A9
+33c1 <square> 004D 03A9
+33c2 <square> 0061 002E 006D 002E
+33c3 <square> 0042 0071
+33c4 <square> 0063 0063
+33c5 <square> 0063 0064
+33c6 <square> 0043 2215 006B 0067
+33c7 <square> 0043 006F 002E
+33c8 <square> 0064 0042
+33c9 <square> 0047 0079
+33ca <square> 0068 0061
+33cb <square> 0048 0050
+33cc <square> 0069 006E
+33cd <square> 004B 004B
+33ce <square> 004B 004D
+33cf <square> 006B 0074
+33d0 <square> 006C 006D
+33d1 <square> 006C 006E
+33d2 <square> 006C 006F 0067
+33d3 <square> 006C 0078
+33d4 <square> 006D 0062
+33d5 <square> 006D 0069 006C
+33d6 <square> 006D 006F 006C
+33d7 <square> 0050 0048
+33d8 <square> 0070 002E 006D 002E
+33d9 <square> 0050 0050 004D
+33da <square> 0050 0052
+33db <square> 0073 0072
+33dc <square> 0053 0076
+33dd <square> 0057 0062
+33e0 <compat> 0031 65E5
+33e1 <compat> 0032 65E5
+33e2 <compat> 0033 65E5
+33e3 <compat> 0034 65E5
+33e4 <compat> 0035 65E5
+33e5 <compat> 0036 65E5
+33e6 <compat> 0037 65E5
+33e7 <compat> 0038 65E5
+33e8 <compat> 0039 65E5
+33e9 <compat> 0031 0030 65E5
+33ea <compat> 0031 0031 65E5
+33eb <compat> 0031 0032 65E5
+33ec <compat> 0031 0033 65E5
+33ed <compat> 0031 0034 65E5
+33ee <compat> 0031 0035 65E5
+33ef <compat> 0031 0036 65E5
+33f0 <compat> 0031 0037 65E5
+33f1 <compat> 0031 0038 65E5
+33f2 <compat> 0031 0039 65E5
+33f3 <compat> 0032 0030 65E5
+33f4 <compat> 0032 0031 65E5
+33f5 <compat> 0032 0032 65E5
+33f6 <compat> 0032 0033 65E5
+33f7 <compat> 0032 0034 65E5
+33f8 <compat> 0032 0035 65E5
+33f9 <compat> 0032 0036 65E5
+33fa <compat> 0032 0037 65E5
+33fb <compat> 0032 0038 65E5
+33fc <compat> 0032 0039 65E5
+33fd <compat> 0033 0030 65E5
+33fe <compat> 0033 0031 65E5
+f900 8C48
+f901 66F4
+f902 8ECA
+f903 8CC8
+f904 6ED1
+f905 4E32
+f906 53E5
+f907 f908 9F9C
+f909 5951
+f90a 91D1
+f90b 5587
+f90c 5948
+f90d 61F6
+f90e 7669
+f90f 7F85
+f910 863F
+f911 87BA
+f912 88F8
+f913 908F
+f914 6A02
+f915 6D1B
+f916 70D9
+f917 73DE
+f918 843D
+f919 916A
+f91a 99F1
+f91b 4E82
+f91c 5375
+f91d 6B04
+f91e 721B
+f91f 862D
+f920 9E1E
+f921 5D50
+f922 6FEB
+f923 85CD
+f924 8964
+f925 62C9
+f926 81D8
+f927 881F
+f928 5ECA
+f929 6717
+f92a 6D6A
+f92b 72FC
+f92c 90CE
+f92d 4F86
+f92e 51B7
+f92f 52DE
+f930 64C4
+f931 6AD3
+f932 7210
+f933 76E7
+f934 8001
+f935 8606
+f936 865C
+f937 8DEF
+f938 9732
+f939 9B6F
+f93a 9DFA
+f93b 788C
+f93c 797F
+f93d 7DA0
+f93e 83C9
+f93f 9304
+f940 9E7F
+f941 8AD6
+f942 58DF
+f943 5F04
+f944 7C60
+f945 807E
+f946 7262
+f947 78CA
+f948 8CC2
+f949 96F7
+f94a 58D8
+f94b 5C62
+f94c 6A13
+f94d 6DDA
+f94e 6F0F
+f94f 7D2F
+f950 7E37
+f951 96FB
+f952 52D2
+f953 808B
+f954 51DC
+f955 51CC
+f956 7A1C
+f957 7DBE
+f958 83F1
+f959 9675
+f95a 8B80
+f95b 62CF
+f95c 6A02
+f95d 8AFE
+f95e 4E39
+f95f 5BE7
+f960 6012
+f961 7387
+f962 7570
+f963 5317
+f964 78FB
+f965 4FBF
+f966 5FA9
+f967 4E0D
+f968 6CCC
+f969 6578
+f96a 7D22
+f96b 53C3
+f96c 585E
+f96d 7701
+f96e 8449
+f96f 8AAA
+f970 6BBA
+f971 8FB0
+f972 6C88
+f973 62FE
+f974 82E5
+f975 63A0
+f976 7565
+f977 4EAE
+f978 5169
+f979 51C9
+f97a 6881
+f97b 7CE7
+f97c 826F
+f97d 8AD2
+f97e 91CF
+f97f 52F5
+f980 5442
+f981 5973
+f982 5EEC
+f983 65C5
+f984 6FFE
+f985 792A
+f986 95AD
+f987 9A6A
+f988 9E97
+f989 9ECE
+f98a 529B
+f98b 66C6
+f98c 6B77
+f98d 8F62
+f98e 5E74
+f98f 6190
+f990 6200
+f991 649A
+f992 6F23
+f993 7149
+f994 7489
+f995 79CA
+f996 7DF4
+f997 806F
+f998 8F26
+f999 84EE
+f99a 9023
+f99b 934A
+f99c 5217
+f99d 52A3
+f99e 54BD
+f99f 70C8
+f9a0 88C2
+f9a1 8AAA
+f9a2 5EC9
+f9a3 5FF5
+f9a4 637B
+f9a5 6BAE
+f9a6 7C3E
+f9a7 7375
+f9a8 4EE4
+f9a9 56F9
+f9aa 5BE7
+f9ab 5DBA
+f9ac 601C
+f9ad 73B2
+f9ae 7469
+f9af 7F9A
+f9b0 8046
+f9b1 9234
+f9b2 96F6
+f9b3 9748
+f9b4 9818
+f9b5 4F8B
+f9b6 79AE
+f9b7 91B4
+f9b8 96B8
+f9b9 60E1
+f9ba 4E86
+f9bb 50DA
+f9bc 5BEE
+f9bd 5C3F
+f9be 6599
+f9bf 6A02
+f9c0 71CE
+f9c1 7642
+f9c2 84FC
+f9c3 907C
+f9c4 9F8D
+f9c5 6688
+f9c6 962E
+f9c7 5289
+f9c8 677B
+f9c9 67F3
+f9ca 6D41
+f9cb 6E9C
+f9cc 7409
+f9cd 7559
+f9ce 786B
+f9cf 7D10
+f9d0 985E
+f9d1 516D
+f9d2 622E
+f9d3 9678
+f9d4 502B
+f9d5 5D19
+f9d6 6DEA
+f9d7 8F2A
+f9d8 5F8B
+f9d9 6144
+f9da 6817
+f9db 7387
+f9dc 9686
+f9dd 5229
+f9de 540F
+f9df 5C65
+f9e0 6613
+f9e1 674E
+f9e2 68A8
+f9e3 6CE5
+f9e4 7406
+f9e5 75E2
+f9e6 7F79
+f9e7 88CF
+f9e8 88E1
+f9e9 91CC
+f9ea 96E2
+f9eb 533F
+f9ec 6EBA
+f9ed 541D
+f9ee 71D0
+f9ef 7498
+f9f0 85FA
+f9f1 96A3
+f9f2 9C57
+f9f3 9E9F
+f9f4 6797
+f9f5 6DCB
+f9f6 81E8
+f9f7 7ACB
+f9f8 7B20
+f9f9 7C92
+f9fa 72C0
+f9fb 7099
+f9fc 8B58
+f9fd 4EC0
+f9fe 8336
+f9ff 523A
+fa00 5207
+fa01 5EA6
+fa02 62D3
+fa03 7CD6
+fa04 5B85
+fa05 6D1E
+fa06 66B4
+fa07 8F3B
+fa08 884C
+fa09 964D
+fa0a 898B
+fa0b 5ED3
+fa0c 5140
+fa0d 55C0
+fa10 585A
+fa12 6674
+fa15 51DE
+fa16 732A
+fa17 76CA
+fa18 793C
+fa19 795E
+fa1a 7965
+fa1b 798F
+fa1c 9756
+fa1d 7CBE
+fa1e 7FBD
+fa20 8612
+fa22 8AF8
+fa25 9038
+fa26 90FD
+fa2a 98EF
+fa2b 98FC
+fa2c 9928
+fa2d 9DB4
+fb00 <compat> 0066 0066
+fb01 <compat> 0066 0069
+fb02 <compat> 0066 006C
+fb03 <compat> 0066 0066 0069
+fb04 <compat> 0066 0066 006C
+fb05 <compat> 017F 0074
+fb06 <compat> 0073 0074
+fb13 <compat> 0574 0576
+fb14 <compat> 0574 0565
+fb15 <compat> 0574 056B
+fb16 <compat> 057E 0576
+fb17 <compat> 0574 056D
+fb1d 05D9 05B4
+fb1f 05F2 05B7
+fb20 <font> 05E2
+fb21 <font> 05D0
+fb22 <font> 05D3
+fb23 <font> 05D4
+fb24 <font> 05DB
+fb25 <font> 05DC
+fb26 <font> 05DD
+fb27 <font> 05E8
+fb28 <font> 05EA
+fb29 <font> 002B
+fb2a 05E9 05C1
+fb2b 05E9 05C2
+fb2c FB49 05C1
+fb2d FB49 05C2
+fb2e 05D0 05B7
+fb2f 05D0 05B8
+fb30 05D0 05BC
+fb31 05D1 05BC
+fb32 05D2 05BC
+fb33 05D3 05BC
+fb34 05D4 05BC
+fb35 05D5 05BC
+fb36 05D6 05BC
+fb38 05D8 05BC
+fb39 05D9 05BC
+fb3a 05DA 05BC
+fb3b 05DB 05BC
+fb3c 05DC 05BC
+fb3e 05DE 05BC
+fb40 05E0 05BC
+fb41 05E1 05BC
+fb43 05E3 05BC
+fb44 05E4 05BC
+fb46 05E6 05BC
+fb47 05E7 05BC
+fb48 05E8 05BC
+fb49 05E9 05BC
+fb4a 05EA 05BC
+fb4b 05D5 05B9
+fb4c 05D1 05BF
+fb4d 05DB 05BF
+fb4e 05E4 05BF
+fb4f <compat> 05D0 05DC
+fb50 <isolated> 0671
+fb51 <final> 0671
+fb52 <isolated> 067B
+fb53 <final> 067B
+fb54 <initial> 067B
+fb55 <medial> 067B
+fb56 <isolated> 067E
+fb57 <final> 067E
+fb58 <initial> 067E
+fb59 <medial> 067E
+fb5a <isolated> 0680
+fb5b <final> 0680
+fb5c <initial> 0680
+fb5d <medial> 0680
+fb5e <isolated> 067A
+fb5f <final> 067A
+fb60 <initial> 067A
+fb61 <medial> 067A
+fb62 <isolated> 067F
+fb63 <final> 067F
+fb64 <initial> 067F
+fb65 <medial> 067F
+fb66 <isolated> 0679
+fb67 <final> 0679
+fb68 <initial> 0679
+fb69 <medial> 0679
+fb6a <isolated> 06A4
+fb6b <final> 06A4
+fb6c <initial> 06A4
+fb6d <medial> 06A4
+fb6e <isolated> 06A6
+fb6f <final> 06A6
+fb70 <initial> 06A6
+fb71 <medial> 06A6
+fb72 <isolated> 0684
+fb73 <final> 0684
+fb74 <initial> 0684
+fb75 <medial> 0684
+fb76 <isolated> 0683
+fb77 <final> 0683
+fb78 <initial> 0683
+fb79 <medial> 0683
+fb7a <isolated> 0686
+fb7b <final> 0686
+fb7c <initial> 0686
+fb7d <medial> 0686
+fb7e <isolated> 0687
+fb7f <final> 0687
+fb80 <initial> 0687
+fb81 <medial> 0687
+fb82 <isolated> 068D
+fb83 <final> 068D
+fb84 <isolated> 068C
+fb85 <final> 068C
+fb86 <isolated> 068E
+fb87 <final> 068E
+fb88 <isolated> 0688
+fb89 <final> 0688
+fb8a <isolated> 0698
+fb8b <final> 0698
+fb8c <isolated> 0691
+fb8d <final> 0691
+fb8e <isolated> 06A9
+fb8f <final> 06A9
+fb90 <initial> 06A9
+fb91 <medial> 06A9
+fb92 <isolated> 06AF
+fb93 <final> 06AF
+fb94 <initial> 06AF
+fb95 <medial> 06AF
+fb96 <isolated> 06B3
+fb97 <final> 06B3
+fb98 <initial> 06B3
+fb99 <medial> 06B3
+fb9a <isolated> 06B1
+fb9b <final> 06B1
+fb9c <initial> 06B1
+fb9d <medial> 06B1
+fb9e <isolated> 06BA
+fb9f <final> 06BA
+fba0 <isolated> 06BB
+fba1 <final> 06BB
+fba2 <initial> 06BB
+fba3 <medial> 06BB
+fba4 <isolated> 06C0
+fba5 <final> 06C0
+fba6 <isolated> 06C1
+fba7 <final> 06C1
+fba8 <initial> 06C1
+fba9 <medial> 06C1
+fbaa <isolated> 06BE
+fbab <final> 06BE
+fbac <initial> 06BE
+fbad <medial> 06BE
+fbae <isolated> 06D2
+fbaf <final> 06D2
+fbb0 <isolated> 06D3
+fbb1 <final> 06D3
+fbd3 <isolated> 06AD
+fbd4 <final> 06AD
+fbd5 <initial> 06AD
+fbd6 <medial> 06AD
+fbd7 <isolated> 06C7
+fbd8 <final> 06C7
+fbd9 <isolated> 06C6
+fbda <final> 06C6
+fbdb <isolated> 06C8
+fbdc <final> 06C8
+fbdd <isolated> 0677
+fbde <isolated> 06CB
+fbdf <final> 06CB
+fbe0 <isolated> 06C5
+fbe1 <final> 06C5
+fbe2 <isolated> 06C9
+fbe3 <final> 06C9
+fbe4 <isolated> 06D0
+fbe5 <final> 06D0
+fbe6 <initial> 06D0
+fbe7 <medial> 06D0
+fbe8 <initial> 0649
+fbe9 <medial> 0649
+fbea <isolated> 0626 0627
+fbeb <final> 0626 0627
+fbec <isolated> 0626 06D5
+fbed <final> 0626 06D5
+fbee <isolated> 0626 0648
+fbef <final> 0626 0648
+fbf0 <isolated> 0626 06C7
+fbf1 <final> 0626 06C7
+fbf2 <isolated> 0626 06C6
+fbf3 <final> 0626 06C6
+fbf4 <isolated> 0626 06C8
+fbf5 <final> 0626 06C8
+fbf6 <isolated> 0626 06D0
+fbf7 <final> 0626 06D0
+fbf8 <initial> 0626 06D0
+fbf9 <isolated> 0626 0649
+fbfa <final> 0626 0649
+fbfb <initial> 0626 0649
+fbfc <isolated> 06CC
+fbfd <final> 06CC
+fbfe <initial> 06CC
+fbff <medial> 06CC
+fc00 <isolated> 0626 062C
+fc01 <isolated> 0626 062D
+fc02 <isolated> 0626 0645
+fc03 <isolated> 0626 0649
+fc04 <isolated> 0626 064A
+fc05 <isolated> 0628 062C
+fc06 <isolated> 0628 062D
+fc07 <isolated> 0628 062E
+fc08 <isolated> 0628 0645
+fc09 <isolated> 0628 0649
+fc0a <isolated> 0628 064A
+fc0b <isolated> 062A 062C
+fc0c <isolated> 062A 062D
+fc0d <isolated> 062A 062E
+fc0e <isolated> 062A 0645
+fc0f <isolated> 062A 0649
+fc10 <isolated> 062A 064A
+fc11 <isolated> 062B 062C
+fc12 <isolated> 062B 0645
+fc13 <isolated> 062B 0649
+fc14 <isolated> 062B 064A
+fc15 <isolated> 062C 062D
+fc16 <isolated> 062C 0645
+fc17 <isolated> 062D 062C
+fc18 <isolated> 062D 0645
+fc19 <isolated> 062E 062C
+fc1a <isolated> 062E 062D
+fc1b <isolated> 062E 0645
+fc1c <isolated> 0633 062C
+fc1d <isolated> 0633 062D
+fc1e <isolated> 0633 062E
+fc1f <isolated> 0633 0645
+fc20 <isolated> 0635 062D
+fc21 <isolated> 0635 0645
+fc22 <isolated> 0636 062C
+fc23 <isolated> 0636 062D
+fc24 <isolated> 0636 062E
+fc25 <isolated> 0636 0645
+fc26 <isolated> 0637 062D
+fc27 <isolated> 0637 0645
+fc28 <isolated> 0638 0645
+fc29 <isolated> 0639 062C
+fc2a <isolated> 0639 0645
+fc2b <isolated> 063A 062C
+fc2c <isolated> 063A 0645
+fc2d <isolated> 0641 062C
+fc2e <isolated> 0641 062D
+fc2f <isolated> 0641 062E
+fc30 <isolated> 0641 0645
+fc31 <isolated> 0641 0649
+fc32 <isolated> 0641 064A
+fc33 <isolated> 0642 062D
+fc34 <isolated> 0642 0645
+fc35 <isolated> 0642 0649
+fc36 <isolated> 0642 064A
+fc37 <isolated> 0643 0627
+fc38 <isolated> 0643 062C
+fc39 <isolated> 0643 062D
+fc3a <isolated> 0643 062E
+fc3b <isolated> 0643 0644
+fc3c <isolated> 0643 0645
+fc3d <isolated> 0643 0649
+fc3e <isolated> 0643 064A
+fc3f <isolated> 0644 062C
+fc40 <isolated> 0644 062D
+fc41 <isolated> 0644 062E
+fc42 <isolated> 0644 0645
+fc43 <isolated> 0644 0649
+fc44 <isolated> 0644 064A
+fc45 <isolated> 0645 062C
+fc46 <isolated> 0645 062D
+fc47 <isolated> 0645 062E
+fc48 <isolated> 0645 0645
+fc49 <isolated> 0645 0649
+fc4a <isolated> 0645 064A
+fc4b <isolated> 0646 062C
+fc4c <isolated> 0646 062D
+fc4d <isolated> 0646 062E
+fc4e <isolated> 0646 0645
+fc4f <isolated> 0646 0649
+fc50 <isolated> 0646 064A
+fc51 <isolated> 0647 062C
+fc52 <isolated> 0647 0645
+fc53 <isolated> 0647 0649
+fc54 <isolated> 0647 064A
+fc55 <isolated> 064A 062C
+fc56 <isolated> 064A 062D
+fc57 <isolated> 064A 062E
+fc58 <isolated> 064A 0645
+fc59 <isolated> 064A 0649
+fc5a <isolated> 064A 064A
+fc5b <isolated> 0630 0670
+fc5c <isolated> 0631 0670
+fc5d <isolated> 0649 0670
+fc5e <isolated> 0020 064C 0651
+fc5f <isolated> 0020 064D 0651
+fc60 <isolated> 0020 064E 0651
+fc61 <isolated> 0020 064F 0651
+fc62 <isolated> 0020 0650 0651
+fc63 <isolated> 0020 0651 0670
+fc64 <final> 0626 0631
+fc65 <final> 0626 0632
+fc66 <final> 0626 0645
+fc67 <final> 0626 0646
+fc68 <final> 0626 0649
+fc69 <final> 0626 064A
+fc6a <final> 0628 0631
+fc6b <final> 0628 0632
+fc6c <final> 0628 0645
+fc6d <final> 0628 0646
+fc6e <final> 0628 0649
+fc6f <final> 0628 064A
+fc70 <final> 062A 0631
+fc71 <final> 062A 0632
+fc72 <final> 062A 0645
+fc73 <final> 062A 0646
+fc74 <final> 062A 0649
+fc75 <final> 062A 064A
+fc76 <final> 062B 0631
+fc77 <final> 062B 0632
+fc78 <final> 062B 0645
+fc79 <final> 062B 0646
+fc7a <final> 062B 0649
+fc7b <final> 062B 064A
+fc7c <final> 0641 0649
+fc7d <final> 0641 064A
+fc7e <final> 0642 0649
+fc7f <final> 0642 064A
+fc80 <final> 0643 0627
+fc81 <final> 0643 0644
+fc82 <final> 0643 0645
+fc83 <final> 0643 0649
+fc84 <final> 0643 064A
+fc85 <final> 0644 0645
+fc86 <final> 0644 0649
+fc87 <final> 0644 064A
+fc88 <final> 0645 0627
+fc89 <final> 0645 0645
+fc8a <final> 0646 0631
+fc8b <final> 0646 0632
+fc8c <final> 0646 0645
+fc8d <final> 0646 0646
+fc8e <final> 0646 0649
+fc8f <final> 0646 064A
+fc90 <final> 0649 0670
+fc91 <final> 064A 0631
+fc92 <final> 064A 0632
+fc93 <final> 064A 0645
+fc94 <final> 064A 0646
+fc95 <final> 064A 0649
+fc96 <final> 064A 064A
+fc97 <initial> 0626 062C
+fc98 <initial> 0626 062D
+fc99 <initial> 0626 062E
+fc9a <initial> 0626 0645
+fc9b <initial> 0626 0647
+fc9c <initial> 0628 062C
+fc9d <initial> 0628 062D
+fc9e <initial> 0628 062E
+fc9f <initial> 0628 0645
+fca0 <initial> 0628 0647
+fca1 <initial> 062A 062C
+fca2 <initial> 062A 062D
+fca3 <initial> 062A 062E
+fca4 <initial> 062A 0645
+fca5 <initial> 062A 0647
+fca6 <initial> 062B 0645
+fca7 <initial> 062C 062D
+fca8 <initial> 062C 0645
+fca9 <initial> 062D 062C
+fcaa <initial> 062D 0645
+fcab <initial> 062E 062C
+fcac <initial> 062E 0645
+fcad <initial> 0633 062C
+fcae <initial> 0633 062D
+fcaf <initial> 0633 062E
+fcb0 <initial> 0633 0645
+fcb1 <initial> 0635 062D
+fcb2 <initial> 0635 062E
+fcb3 <initial> 0635 0645
+fcb4 <initial> 0636 062C
+fcb5 <initial> 0636 062D
+fcb6 <initial> 0636 062E
+fcb7 <initial> 0636 0645
+fcb8 <initial> 0637 062D
+fcb9 <initial> 0638 0645
+fcba <initial> 0639 062C
+fcbb <initial> 0639 0645
+fcbc <initial> 063A 062C
+fcbd <initial> 063A 0645
+fcbe <initial> 0641 062C
+fcbf <initial> 0641 062D
+fcc0 <initial> 0641 062E
+fcc1 <initial> 0641 0645
+fcc2 <initial> 0642 062D
+fcc3 <initial> 0642 0645
+fcc4 <initial> 0643 062C
+fcc5 <initial> 0643 062D
+fcc6 <initial> 0643 062E
+fcc7 <initial> 0643 0644
+fcc8 <initial> 0643 0645
+fcc9 <initial> 0644 062C
+fcca <initial> 0644 062D
+fccb <initial> 0644 062E
+fccc <initial> 0644 0645
+fccd <initial> 0644 0647
+fcce <initial> 0645 062C
+fccf <initial> 0645 062D
+fcd0 <initial> 0645 062E
+fcd1 <initial> 0645 0645
+fcd2 <initial> 0646 062C
+fcd3 <initial> 0646 062D
+fcd4 <initial> 0646 062E
+fcd5 <initial> 0646 0645
+fcd6 <initial> 0646 0647
+fcd7 <initial> 0647 062C
+fcd8 <initial> 0647 0645
+fcd9 <initial> 0647 0670
+fcda <initial> 064A 062C
+fcdb <initial> 064A 062D
+fcdc <initial> 064A 062E
+fcdd <initial> 064A 0645
+fcde <initial> 064A 0647
+fcdf <medial> 0626 0645
+fce0 <medial> 0626 0647
+fce1 <medial> 0628 0645
+fce2 <medial> 0628 0647
+fce3 <medial> 062A 0645
+fce4 <medial> 062A 0647
+fce5 <medial> 062B 0645
+fce6 <medial> 062B 0647
+fce7 <medial> 0633 0645
+fce8 <medial> 0633 0647
+fce9 <medial> 0634 0645
+fcea <medial> 0634 0647
+fceb <medial> 0643 0644
+fcec <medial> 0643 0645
+fced <medial> 0644 0645
+fcee <medial> 0646 0645
+fcef <medial> 0646 0647
+fcf0 <medial> 064A 0645
+fcf1 <medial> 064A 0647
+fcf2 <medial> 0640 064E 0651
+fcf3 <medial> 0640 064F 0651
+fcf4 <medial> 0640 0650 0651
+fcf5 <isolated> 0637 0649
+fcf6 <isolated> 0637 064A
+fcf7 <isolated> 0639 0649
+fcf8 <isolated> 0639 064A
+fcf9 <isolated> 063A 0649
+fcfa <isolated> 063A 064A
+fcfb <isolated> 0633 0649
+fcfc <isolated> 0633 064A
+fcfd <isolated> 0634 0649
+fcfe <isolated> 0634 064A
+fcff <isolated> 062D 0649
+fd00 <isolated> 062D 064A
+fd01 <isolated> 062C 0649
+fd02 <isolated> 062C 064A
+fd03 <isolated> 062E 0649
+fd04 <isolated> 062E 064A
+fd05 <isolated> 0635 0649
+fd06 <isolated> 0635 064A
+fd07 <isolated> 0636 0649
+fd08 <isolated> 0636 064A
+fd09 <isolated> 0634 062C
+fd0a <isolated> 0634 062D
+fd0b <isolated> 0634 062E
+fd0c <isolated> 0634 0645
+fd0d <isolated> 0634 0631
+fd0e <isolated> 0633 0631
+fd0f <isolated> 0635 0631
+fd10 <isolated> 0636 0631
+fd11 <final> 0637 0649
+fd12 <final> 0637 064A
+fd13 <final> 0639 0649
+fd14 <final> 0639 064A
+fd15 <final> 063A 0649
+fd16 <final> 063A 064A
+fd17 <final> 0633 0649
+fd18 <final> 0633 064A
+fd19 <final> 0634 0649
+fd1a <final> 0634 064A
+fd1b <final> 062D 0649
+fd1c <final> 062D 064A
+fd1d <final> 062C 0649
+fd1e <final> 062C 064A
+fd1f <final> 062E 0649
+fd20 <final> 062E 064A
+fd21 <final> 0635 0649
+fd22 <final> 0635 064A
+fd23 <final> 0636 0649
+fd24 <final> 0636 064A
+fd25 <final> 0634 062C
+fd26 <final> 0634 062D
+fd27 <final> 0634 062E
+fd28 <final> 0634 0645
+fd29 <final> 0634 0631
+fd2a <final> 0633 0631
+fd2b <final> 0635 0631
+fd2c <final> 0636 0631
+fd2d <initial> 0634 062C
+fd2e <initial> 0634 062D
+fd2f <initial> 0634 062E
+fd30 <initial> 0634 0645
+fd31 <initial> 0633 0647
+fd32 <initial> 0634 0647
+fd33 <initial> 0637 0645
+fd34 <medial> 0633 062C
+fd35 <medial> 0633 062D
+fd36 <medial> 0633 062E
+fd37 <medial> 0634 062C
+fd38 <medial> 0634 062D
+fd39 <medial> 0634 062E
+fd3a <medial> 0637 0645
+fd3b <medial> 0638 0645
+fd3c <final> 0627 064B
+fd3d <isolated> 0627 064B
+fd50 <initial> 062A 062C 0645
+fd51 <final> 062A 062D 062C
+fd52 <initial> 062A 062D 062C
+fd53 <initial> 062A 062D 0645
+fd54 <initial> 062A 062E 0645
+fd55 <initial> 062A 0645 062C
+fd56 <initial> 062A 0645 062D
+fd57 <initial> 062A 0645 062E
+fd58 <final> 062C 0645 062D
+fd59 <initial> 062C 0645 062D
+fd5a <final> 062D 0645 064A
+fd5b <final> 062D 0645 0649
+fd5c <initial> 0633 062D 062C
+fd5d <initial> 0633 062C 062D
+fd5e <final> 0633 062C 0649
+fd5f <final> 0633 0645 062D
+fd60 <initial> 0633 0645 062D
+fd61 <initial> 0633 0645 062C
+fd62 <final> 0633 0645 0645
+fd63 <initial> 0633 0645 0645
+fd64 <final> 0635 062D 062D
+fd65 <initial> 0635 062D 062D
+fd66 <final> 0635 0645 0645
+fd67 <final> 0634 062D 0645
+fd68 <initial> 0634 062D 0645
+fd69 <final> 0634 062C 064A
+fd6a <final> 0634 0645 062E
+fd6b <initial> 0634 0645 062E
+fd6c <final> 0634 0645 0645
+fd6d <initial> 0634 0645 0645
+fd6e <final> 0636 062D 0649
+fd6f <final> 0636 062E 0645
+fd70 <initial> 0636 062E 0645
+fd71 <final> 0637 0645 062D
+fd72 <initial> 0637 0645 062D
+fd73 <initial> 0637 0645 0645
+fd74 <final> 0637 0645 064A
+fd75 <final> 0639 062C 0645
+fd76 <final> 0639 0645 0645
+fd77 <initial> 0639 0645 0645
+fd78 <final> 0639 0645 0649
+fd79 <final> 063A 0645 0645
+fd7a <final> 063A 0645 064A
+fd7b <final> 063A 0645 0649
+fd7c <final> 0641 062E 0645
+fd7d <initial> 0641 062E 0645
+fd7e <final> 0642 0645 062D
+fd7f <final> 0642 0645 0645
+fd80 <final> 0644 062D 0645
+fd81 <final> 0644 062D 064A
+fd82 <final> 0644 062D 0649
+fd83 <initial> 0644 062C 062C
+fd84 <final> 0644 062C 062C
+fd85 <final> 0644 062E 0645
+fd86 <initial> 0644 062E 0645
+fd87 <final> 0644 0645 062D
+fd88 <initial> 0644 0645 062D
+fd89 <initial> 0645 062D 062C
+fd8a <initial> 0645 062D 0645
+fd8b <final> 0645 062D 064A
+fd8c <initial> 0645 062C 062D
+fd8d <initial> 0645 062C 0645
+fd8e <initial> 0645 062E 062C
+fd8f <initial> 0645 062E 0645
+fd92 <initial> 0645 062C 062E
+fd93 <initial> 0647 0645 062C
+fd94 <initial> 0647 0645 0645
+fd95 <initial> 0646 062D 0645
+fd96 <final> 0646 062D 0649
+fd97 <final> 0646 062C 0645
+fd98 <initial> 0646 062C 0645
+fd99 <final> 0646 062C 0649
+fd9a <final> 0646 0645 064A
+fd9b <final> 0646 0645 0649
+fd9c <final> 064A 0645 0645
+fd9d <initial> 064A 0645 0645
+fd9e <final> 0628 062E 064A
+fd9f <final> 062A 062C 064A
+fda0 <final> 062A 062C 0649
+fda1 <final> 062A 062E 064A
+fda2 <final> 062A 062E 0649
+fda3 <final> 062A 0645 064A
+fda4 <final> 062A 0645 0649
+fda5 <final> 062C 0645 064A
+fda6 <final> 062C 062D 0649
+fda7 <final> 062C 0645 0649
+fda8 <final> 0633 062E 0649
+fda9 <final> 0635 062D 064A
+fdaa <final> 0634 062D 064A
+fdab <final> 0636 062D 064A
+fdac <final> 0644 062C 064A
+fdad <final> 0644 0645 064A
+fdae <final> 064A 062D 064A
+fdaf <final> 064A 062C 064A
+fdb0 <final> 064A 0645 064A
+fdb1 <final> 0645 0645 064A
+fdb2 <final> 0642 0645 064A
+fdb3 <final> 0646 062D 064A
+fdb4 <initial> 0642 0645 062D
+fdb5 <initial> 0644 062D 0645
+fdb6 <final> 0639 0645 064A
+fdb7 <final> 0643 0645 064A
+fdb8 <initial> 0646 062C 062D
+fdb9 <final> 0645 062E 064A
+fdba <initial> 0644 062C 0645
+fdbb <final> 0643 0645 0645
+fdbc <final> 0644 062C 0645
+fdbd <final> 0646 062C 062D
+fdbe <final> 062C 062D 064A
+fdbf <final> 062D 062C 064A
+fdc0 <final> 0645 062C 064A
+fdc1 <final> 0641 0645 064A
+fdc2 <final> 0628 062D 064A
+fdc3 <initial> 0643 0645 0645
+fdc4 <initial> 0639 062C 0645
+fdc5 <initial> 0635 0645 0645
+fdc6 <final> 0633 062E 064A
+fdc7 <final> 0646 062C 064A
+fdf0 <isolated> 0635 0644 06D2
+fdf1 <isolated> 0642 0644 06D2
+fdf2 <isolated> 0627 0644 0644 0647
+fdf3 <isolated> 0627 0643 0628 0631
+fdf4 <isolated> 0645 062D 0645 062F
+fdf5 <isolated> 0635 0644 0639 0645
+fdf6 <isolated> 0631 0633 0648 0644
+fdf7 <isolated> 0639 0644 064A 0647
+fdf8 <isolated> 0648 0633 0644 0645
+fdf9 <isolated> 0635 0644 0649
+fdfa <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645
+fdfb <isolated> 062C 0644 0020 062C 0644 0627 0644 0647
+fe30 <vertical> 2025
+fe31 <vertical> 2014
+fe32 <vertical> 2013
+fe33 fe34 <vertical> 005F
+fe35 <vertical> 0028
+fe36 <vertical> 0029
+fe37 <vertical> 007B
+fe38 <vertical> 007D
+fe39 <vertical> 3014
+fe3a <vertical> 3015
+fe3b <vertical> 3010
+fe3c <vertical> 3011
+fe3d <vertical> 300A
+fe3e <vertical> 300B
+fe3f <vertical> 3008
+fe40 <vertical> 3009
+fe41 <vertical> 300C
+fe42 <vertical> 300D
+fe43 <vertical> 300E
+fe44 <vertical> 300F
+fe49 fe4c <compat> 203E
+fe4d fe4f <compat> 005F
+fe50 <small> 002C
+fe51 <small> 3001
+fe52 <small> 002E
+fe54 <small> 003B
+fe55 <small> 003A
+fe56 <small> 003F
+fe57 <small> 0021
+fe58 <small> 2014
+fe59 <small> 0028
+fe5a <small> 0029
+fe5b <small> 007B
+fe5c <small> 007D
+fe5d <small> 3014
+fe5e <small> 3015
+fe5f <small> 0023
+fe60 <small> 0026
+fe61 <small> 002A
+fe62 <small> 002B
+fe63 <small> 002D
+fe64 <small> 003C
+fe65 <small> 003E
+fe66 <small> 003D
+fe68 <small> 005C
+fe69 <small> 0024
+fe6a <small> 0025
+fe6b <small> 0040
+fe70 <isolated> 0020 064B
+fe71 <medial> 0640 064B
+fe72 <isolated> 0020 064C
+fe74 <isolated> 0020 064D
+fe76 <isolated> 0020 064E
+fe77 <medial> 0640 064E
+fe78 <isolated> 0020 064F
+fe79 <medial> 0640 064F
+fe7a <isolated> 0020 0650
+fe7b <medial> 0640 0650
+fe7c <isolated> 0020 0651
+fe7d <medial> 0640 0651
+fe7e <isolated> 0020 0652
+fe7f <medial> 0640 0652
+fe80 <isolated> 0621
+fe81 <isolated> 0622
+fe82 <final> 0622
+fe83 <isolated> 0623
+fe84 <final> 0623
+fe85 <isolated> 0624
+fe86 <final> 0624
+fe87 <isolated> 0625
+fe88 <final> 0625
+fe89 <isolated> 0626
+fe8a <final> 0626
+fe8b <initial> 0626
+fe8c <medial> 0626
+fe8d <isolated> 0627
+fe8e <final> 0627
+fe8f <isolated> 0628
+fe90 <final> 0628
+fe91 <initial> 0628
+fe92 <medial> 0628
+fe93 <isolated> 0629
+fe94 <final> 0629
+fe95 <isolated> 062A
+fe96 <final> 062A
+fe97 <initial> 062A
+fe98 <medial> 062A
+fe99 <isolated> 062B
+fe9a <final> 062B
+fe9b <initial> 062B
+fe9c <medial> 062B
+fe9d <isolated> 062C
+fe9e <final> 062C
+fe9f <initial> 062C
+fea0 <medial> 062C
+fea1 <isolated> 062D
+fea2 <final> 062D
+fea3 <initial> 062D
+fea4 <medial> 062D
+fea5 <isolated> 062E
+fea6 <final> 062E
+fea7 <initial> 062E
+fea8 <medial> 062E
+fea9 <isolated> 062F
+feaa <final> 062F
+feab <isolated> 0630
+feac <final> 0630
+fead <isolated> 0631
+feae <final> 0631
+feaf <isolated> 0632
+feb0 <final> 0632
+feb1 <isolated> 0633
+feb2 <final> 0633
+feb3 <initial> 0633
+feb4 <medial> 0633
+feb5 <isolated> 0634
+feb6 <final> 0634
+feb7 <initial> 0634
+feb8 <medial> 0634
+feb9 <isolated> 0635
+feba <final> 0635
+febb <initial> 0635
+febc <medial> 0635
+febd <isolated> 0636
+febe <final> 0636
+febf <initial> 0636
+fec0 <medial> 0636
+fec1 <isolated> 0637
+fec2 <final> 0637
+fec3 <initial> 0637
+fec4 <medial> 0637
+fec5 <isolated> 0638
+fec6 <final> 0638
+fec7 <initial> 0638
+fec8 <medial> 0638
+fec9 <isolated> 0639
+feca <final> 0639
+fecb <initial> 0639
+fecc <medial> 0639
+fecd <isolated> 063A
+fece <final> 063A
+fecf <initial> 063A
+fed0 <medial> 063A
+fed1 <isolated> 0641
+fed2 <final> 0641
+fed3 <initial> 0641
+fed4 <medial> 0641
+fed5 <isolated> 0642
+fed6 <final> 0642
+fed7 <initial> 0642
+fed8 <medial> 0642
+fed9 <isolated> 0643
+feda <final> 0643
+fedb <initial> 0643
+fedc <medial> 0643
+fedd <isolated> 0644
+fede <final> 0644
+fedf <initial> 0644
+fee0 <medial> 0644
+fee1 <isolated> 0645
+fee2 <final> 0645
+fee3 <initial> 0645
+fee4 <medial> 0645
+fee5 <isolated> 0646
+fee6 <final> 0646
+fee7 <initial> 0646
+fee8 <medial> 0646
+fee9 <isolated> 0647
+feea <final> 0647
+feeb <initial> 0647
+feec <medial> 0647
+feed <isolated> 0648
+feee <final> 0648
+feef <isolated> 0649
+fef0 <final> 0649
+fef1 <isolated> 064A
+fef2 <final> 064A
+fef3 <initial> 064A
+fef4 <medial> 064A
+fef5 <isolated> 0644 0622
+fef6 <final> 0644 0622
+fef7 <isolated> 0644 0623
+fef8 <final> 0644 0623
+fef9 <isolated> 0644 0625
+fefa <final> 0644 0625
+fefb <isolated> 0644 0627
+fefc <final> 0644 0627
+ff01 <wide> 0021
+ff02 <wide> 0022
+ff03 <wide> 0023
+ff04 <wide> 0024
+ff05 <wide> 0025
+ff06 <wide> 0026
+ff07 <wide> 0027
+ff08 <wide> 0028
+ff09 <wide> 0029
+ff0a <wide> 002A
+ff0b <wide> 002B
+ff0c <wide> 002C
+ff0d <wide> 002D
+ff0e <wide> 002E
+ff0f <wide> 002F
+ff10 <wide> 0030
+ff11 <wide> 0031
+ff12 <wide> 0032
+ff13 <wide> 0033
+ff14 <wide> 0034
+ff15 <wide> 0035
+ff16 <wide> 0036
+ff17 <wide> 0037
+ff18 <wide> 0038
+ff19 <wide> 0039
+ff1a <wide> 003A
+ff1b <wide> 003B
+ff1c <wide> 003C
+ff1d <wide> 003D
+ff1e <wide> 003E
+ff1f <wide> 003F
+ff20 <wide> 0040
+ff21 <wide> 0041
+ff22 <wide> 0042
+ff23 <wide> 0043
+ff24 <wide> 0044
+ff25 <wide> 0045
+ff26 <wide> 0046
+ff27 <wide> 0047
+ff28 <wide> 0048
+ff29 <wide> 0049
+ff2a <wide> 004A
+ff2b <wide> 004B
+ff2c <wide> 004C
+ff2d <wide> 004D
+ff2e <wide> 004E
+ff2f <wide> 004F
+ff30 <wide> 0050
+ff31 <wide> 0051
+ff32 <wide> 0052
+ff33 <wide> 0053
+ff34 <wide> 0054
+ff35 <wide> 0055
+ff36 <wide> 0056
+ff37 <wide> 0057
+ff38 <wide> 0058
+ff39 <wide> 0059
+ff3a <wide> 005A
+ff3b <wide> 005B
+ff3c <wide> 005C
+ff3d <wide> 005D
+ff3e <wide> 005E
+ff3f <wide> 005F
+ff40 <wide> 0060
+ff41 <wide> 0061
+ff42 <wide> 0062
+ff43 <wide> 0063
+ff44 <wide> 0064
+ff45 <wide> 0065
+ff46 <wide> 0066
+ff47 <wide> 0067
+ff48 <wide> 0068
+ff49 <wide> 0069
+ff4a <wide> 006A
+ff4b <wide> 006B
+ff4c <wide> 006C
+ff4d <wide> 006D
+ff4e <wide> 006E
+ff4f <wide> 006F
+ff50 <wide> 0070
+ff51 <wide> 0071
+ff52 <wide> 0072
+ff53 <wide> 0073
+ff54 <wide> 0074
+ff55 <wide> 0075
+ff56 <wide> 0076
+ff57 <wide> 0077
+ff58 <wide> 0078
+ff59 <wide> 0079
+ff5a <wide> 007A
+ff5b <wide> 007B
+ff5c <wide> 007C
+ff5d <wide> 007D
+ff5e <wide> 007E
+ff61 <narrow> 3002
+ff62 <narrow> 300C
+ff63 <narrow> 300D
+ff64 <narrow> 3001
+ff65 <narrow> 30FB
+ff66 <narrow> 30F2
+ff67 <narrow> 30A1
+ff68 <narrow> 30A3
+ff69 <narrow> 30A5
+ff6a <narrow> 30A7
+ff6b <narrow> 30A9
+ff6c <narrow> 30E3
+ff6d <narrow> 30E5
+ff6e <narrow> 30E7
+ff6f <narrow> 30C3
+ff70 <narrow> 30FC
+ff71 <narrow> 30A2
+ff72 <narrow> 30A4
+ff73 <narrow> 30A6
+ff74 <narrow> 30A8
+ff75 <narrow> 30AA
+ff76 <narrow> 30AB
+ff77 <narrow> 30AD
+ff78 <narrow> 30AF
+ff79 <narrow> 30B1
+ff7a <narrow> 30B3
+ff7b <narrow> 30B5
+ff7c <narrow> 30B7
+ff7d <narrow> 30B9
+ff7e <narrow> 30BB
+ff7f <narrow> 30BD
+ff80 <narrow> 30BF
+ff81 <narrow> 30C1
+ff82 <narrow> 30C4
+ff83 <narrow> 30C6
+ff84 <narrow> 30C8
+ff85 <narrow> 30CA
+ff86 <narrow> 30CB
+ff87 <narrow> 30CC
+ff88 <narrow> 30CD
+ff89 <narrow> 30CE
+ff8a <narrow> 30CF
+ff8b <narrow> 30D2
+ff8c <narrow> 30D5
+ff8d <narrow> 30D8
+ff8e <narrow> 30DB
+ff8f <narrow> 30DE
+ff90 <narrow> 30DF
+ff91 <narrow> 30E0
+ff92 <narrow> 30E1
+ff93 <narrow> 30E2
+ff94 <narrow> 30E4
+ff95 <narrow> 30E6
+ff96 <narrow> 30E8
+ff97 <narrow> 30E9
+ff98 <narrow> 30EA
+ff99 <narrow> 30EB
+ff9a <narrow> 30EC
+ff9b <narrow> 30ED
+ff9c <narrow> 30EF
+ff9d <narrow> 30F3
+ff9e <narrow> 3099
+ff9f <narrow> 309A
+ffa0 <narrow> 3164
+ffa1 <narrow> 3131
+ffa2 <narrow> 3132
+ffa3 <narrow> 3133
+ffa4 <narrow> 3134
+ffa5 <narrow> 3135
+ffa6 <narrow> 3136
+ffa7 <narrow> 3137
+ffa8 <narrow> 3138
+ffa9 <narrow> 3139
+ffaa <narrow> 313A
+ffab <narrow> 313B
+ffac <narrow> 313C
+ffad <narrow> 313D
+ffae <narrow> 313E
+ffaf <narrow> 313F
+ffb0 <narrow> 3140
+ffb1 <narrow> 3141
+ffb2 <narrow> 3142
+ffb3 <narrow> 3143
+ffb4 <narrow> 3144
+ffb5 <narrow> 3145
+ffb6 <narrow> 3146
+ffb7 <narrow> 3147
+ffb8 <narrow> 3148
+ffb9 <narrow> 3149
+ffba <narrow> 314A
+ffbb <narrow> 314B
+ffbc <narrow> 314C
+ffbd <narrow> 314D
+ffbe <narrow> 314E
+ffc2 <narrow> 314F
+ffc3 <narrow> 3150
+ffc4 <narrow> 3151
+ffc5 <narrow> 3152
+ffc6 <narrow> 3153
+ffc7 <narrow> 3154
+ffca <narrow> 3155
+ffcb <narrow> 3156
+ffcc <narrow> 3157
+ffcd <narrow> 3158
+ffce <narrow> 3159
+ffcf <narrow> 315A
+ffd2 <narrow> 315B
+ffd3 <narrow> 315C
+ffd4 <narrow> 315D
+ffd5 <narrow> 315E
+ffd6 <narrow> 315F
+ffd7 <narrow> 3160
+ffda <narrow> 3161
+ffdb <narrow> 3162
+ffdc <narrow> 3163
+ffe0 <wide> 00A2
+ffe1 <wide> 00A3
+ffe2 <wide> 00AC
+ffe3 <wide> 00AF
+ffe4 <wide> 00A6
+ffe5 <wide> 00A5
+ffe6 <wide> 20A9
+ffe8 <narrow> 2502
+ffe9 <narrow> 2190
+ffea <narrow> 2191
+ffeb <narrow> 2192
+ffec <narrow> 2193
+ffed <narrow> 25A0
+ffee <narrow> 25CB
+END
diff --git a/contrib/perl5/lib/unicode/EAWidth.txt b/contrib/perl5/lib/unicode/EAWidth.txt
new file mode 100644
index 0000000..2b3577b
--- /dev/null
+++ b/contrib/perl5/lib/unicode/EAWidth.txt
@@ -0,0 +1,10636 @@
+# EastAsianWidth-3.txt
+#
+# East Asian Width Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It contains informative data only.
+# The format is three fields separated by semicolons.
+# Field 1: Unicode value
+# Field 2: East Asian Width property, consisting of one of the following values:
+# "N", "A", "H", "W", "F", "Na"
+# - Assigned characters that are not listed explicitly are given the value "N".
+# - Characters within ranges marked by "First>" and "Last>" are omitted,
+# as in UnicodeData.txt. For example, the following means that
+# all characters between 3400 and 4DB5 have the value "W"
+# 3400;W;<CJK Ideograph Extension A, First>
+# 4DB5;W;<CJK Ideograph Extension A, Last>
+# Field 3: Unicode name (this is purely informative)
+#
+# See UTR #11: East Asian Character Width for more information
+0000;N;<control>
+0001;N;<control>
+0002;N;<control>
+0003;N;<control>
+0004;N;<control>
+0005;N;<control>
+0006;N;<control>
+0007;N;<control>
+0008;N;<control>
+0009;N;<control>
+000A;N;<control>
+000B;N;<control>
+000C;N;<control>
+000D;N;<control>
+000E;N;<control>
+000F;N;<control>
+0010;N;<control>
+0011;N;<control>
+0012;N;<control>
+0013;N;<control>
+0014;N;<control>
+0015;N;<control>
+0016;N;<control>
+0017;N;<control>
+0018;N;<control>
+0019;N;<control>
+001A;N;<control>
+001B;N;<control>
+001C;N;<control>
+001D;N;<control>
+001E;N;<control>
+001F;N;<control>
+0020;Na;SPACE
+0021;Na;EXCLAMATION MARK
+0022;Na;QUOTATION MARK
+0023;Na;NUMBER SIGN
+0024;Na;DOLLAR SIGN
+0025;Na;PERCENT SIGN
+0026;Na;AMPERSAND
+0027;Na;APOSTROPHE
+0028;Na;LEFT PARENTHESIS
+0029;Na;RIGHT PARENTHESIS
+002A;Na;ASTERISK
+002B;Na;PLUS SIGN
+002C;Na;COMMA
+002D;Na;HYPHEN-MINUS
+002E;Na;FULL STOP
+002F;Na;SOLIDUS
+0030;Na;DIGIT ZERO
+0031;Na;DIGIT ONE
+0032;Na;DIGIT TWO
+0033;Na;DIGIT THREE
+0034;Na;DIGIT FOUR
+0035;Na;DIGIT FIVE
+0036;Na;DIGIT SIX
+0037;Na;DIGIT SEVEN
+0038;Na;DIGIT EIGHT
+0039;Na;DIGIT NINE
+003A;Na;COLON
+003B;Na;SEMICOLON
+003C;Na;LESS-THAN SIGN
+003D;Na;EQUALS SIGN
+003E;Na;GREATER-THAN SIGN
+003F;Na;QUESTION MARK
+0040;Na;COMMERCIAL AT
+0041;Na;LATIN CAPITAL LETTER A
+0042;Na;LATIN CAPITAL LETTER B
+0043;Na;LATIN CAPITAL LETTER C
+0044;Na;LATIN CAPITAL LETTER D
+0045;Na;LATIN CAPITAL LETTER E
+0046;Na;LATIN CAPITAL LETTER F
+0047;Na;LATIN CAPITAL LETTER G
+0048;Na;LATIN CAPITAL LETTER H
+0049;Na;LATIN CAPITAL LETTER I
+004A;Na;LATIN CAPITAL LETTER J
+004B;Na;LATIN CAPITAL LETTER K
+004C;Na;LATIN CAPITAL LETTER L
+004D;Na;LATIN CAPITAL LETTER M
+004E;Na;LATIN CAPITAL LETTER N
+004F;Na;LATIN CAPITAL LETTER O
+0050;Na;LATIN CAPITAL LETTER P
+0051;Na;LATIN CAPITAL LETTER Q
+0052;Na;LATIN CAPITAL LETTER R
+0053;Na;LATIN CAPITAL LETTER S
+0054;Na;LATIN CAPITAL LETTER T
+0055;Na;LATIN CAPITAL LETTER U
+0056;Na;LATIN CAPITAL LETTER V
+0057;Na;LATIN CAPITAL LETTER W
+0058;Na;LATIN CAPITAL LETTER X
+0059;Na;LATIN CAPITAL LETTER Y
+005A;Na;LATIN CAPITAL LETTER Z
+005B;Na;LEFT SQUARE BRACKET
+005C;Na;REVERSE SOLIDUS
+005D;Na;RIGHT SQUARE BRACKET
+005E;Na;CIRCUMFLEX ACCENT
+005F;Na;LOW LINE
+0060;Na;GRAVE ACCENT
+0061;Na;LATIN SMALL LETTER A
+0062;Na;LATIN SMALL LETTER B
+0063;Na;LATIN SMALL LETTER C
+0064;Na;LATIN SMALL LETTER D
+0065;Na;LATIN SMALL LETTER E
+0066;Na;LATIN SMALL LETTER F
+0067;Na;LATIN SMALL LETTER G
+0068;Na;LATIN SMALL LETTER H
+0069;Na;LATIN SMALL LETTER I
+006A;Na;LATIN SMALL LETTER J
+006B;Na;LATIN SMALL LETTER K
+006C;Na;LATIN SMALL LETTER L
+006D;Na;LATIN SMALL LETTER M
+006E;Na;LATIN SMALL LETTER N
+006F;Na;LATIN SMALL LETTER O
+0070;Na;LATIN SMALL LETTER P
+0071;Na;LATIN SMALL LETTER Q
+0072;Na;LATIN SMALL LETTER R
+0073;Na;LATIN SMALL LETTER S
+0074;Na;LATIN SMALL LETTER T
+0075;Na;LATIN SMALL LETTER U
+0076;Na;LATIN SMALL LETTER V
+0077;Na;LATIN SMALL LETTER W
+0078;Na;LATIN SMALL LETTER X
+0079;Na;LATIN SMALL LETTER Y
+007A;Na;LATIN SMALL LETTER Z
+007B;Na;LEFT CURLY BRACKET
+007C;Na;VERTICAL LINE
+007D;Na;RIGHT CURLY BRACKET
+007E;Na;TILDE
+007F;N;<control>
+0080;N;<control>
+0081;N;<control>
+0082;N;<control>
+0083;N;<control>
+0084;N;<control>
+0085;N;<control>
+0086;N;<control>
+0087;N;<control>
+0088;N;<control>
+0089;N;<control>
+008A;N;<control>
+008B;N;<control>
+008C;N;<control>
+008D;N;<control>
+008E;N;<control>
+008F;N;<control>
+0090;N;<control>
+0091;N;<control>
+0092;N;<control>
+0093;N;<control>
+0094;N;<control>
+0095;N;<control>
+0096;N;<control>
+0097;N;<control>
+0098;N;<control>
+0099;N;<control>
+009A;N;<control>
+009B;N;<control>
+009C;N;<control>
+009D;N;<control>
+009E;N;<control>
+009F;N;<control>
+00A0;N;NO-BREAK SPACE
+00A1;A;INVERTED EXCLAMATION MARK
+00A2;Na;CENT SIGN
+00A3;Na;POUND SIGN
+00A4;A;CURRENCY SIGN
+00A5;Na;YEN SIGN
+00A6;Na;BROKEN BAR
+00A7;A;SECTION SIGN
+00A8;A;DIAERESIS
+00A9;N;COPYRIGHT SIGN
+00AA;A;FEMININE ORDINAL INDICATOR
+00AB;N;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC;Na;NOT SIGN
+00AD;A;SOFT HYPHEN
+00AE;N;REGISTERED SIGN
+00AF;Na;MACRON
+00B0;A;DEGREE SIGN
+00B1;A;PLUS-MINUS SIGN
+00B2;A;SUPERSCRIPT TWO
+00B3;A;SUPERSCRIPT THREE
+00B4;A;ACUTE ACCENT
+00B5;N;MICRO SIGN
+00B6;A;PILCROW SIGN
+00B7;A;MIDDLE DOT
+00B8;A;CEDILLA
+00B9;A;SUPERSCRIPT ONE
+00BA;A;MASCULINE ORDINAL INDICATOR
+00BB;N;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC;A;VULGAR FRACTION ONE QUARTER
+00BD;A;VULGAR FRACTION ONE HALF
+00BE;A;VULGAR FRACTION THREE QUARTERS
+00BF;A;INVERTED QUESTION MARK
+00C0;N;LATIN CAPITAL LETTER A WITH GRAVE
+00C1;N;LATIN CAPITAL LETTER A WITH ACUTE
+00C2;N;LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3;N;LATIN CAPITAL LETTER A WITH TILDE
+00C4;N;LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5;N;LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6;A;LATIN CAPITAL LETTER AE
+00C7;N;LATIN CAPITAL LETTER C WITH CEDILLA
+00C8;N;LATIN CAPITAL LETTER E WITH GRAVE
+00C9;N;LATIN CAPITAL LETTER E WITH ACUTE
+00CA;N;LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB;N;LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC;N;LATIN CAPITAL LETTER I WITH GRAVE
+00CD;N;LATIN CAPITAL LETTER I WITH ACUTE
+00CE;N;LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF;N;LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0;A;LATIN CAPITAL LETTER ETH
+00D1;N;LATIN CAPITAL LETTER N WITH TILDE
+00D2;N;LATIN CAPITAL LETTER O WITH GRAVE
+00D3;N;LATIN CAPITAL LETTER O WITH ACUTE
+00D4;N;LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5;N;LATIN CAPITAL LETTER O WITH TILDE
+00D6;N;LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7;A;MULTIPLICATION SIGN
+00D8;A;LATIN CAPITAL LETTER O WITH STROKE
+00D9;N;LATIN CAPITAL LETTER U WITH GRAVE
+00DA;N;LATIN CAPITAL LETTER U WITH ACUTE
+00DB;N;LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC;N;LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD;N;LATIN CAPITAL LETTER Y WITH ACUTE
+00DE;A;LATIN CAPITAL LETTER THORN
+00DF;A;LATIN SMALL LETTER SHARP S
+00E0;A;LATIN SMALL LETTER A WITH GRAVE
+00E1;A;LATIN SMALL LETTER A WITH ACUTE
+00E2;N;LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3;N;LATIN SMALL LETTER A WITH TILDE
+00E4;N;LATIN SMALL LETTER A WITH DIAERESIS
+00E5;N;LATIN SMALL LETTER A WITH RING ABOVE
+00E6;A;LATIN SMALL LETTER AE
+00E7;N;LATIN SMALL LETTER C WITH CEDILLA
+00E8;A;LATIN SMALL LETTER E WITH GRAVE
+00E9;A;LATIN SMALL LETTER E WITH ACUTE
+00EA;A;LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB;N;LATIN SMALL LETTER E WITH DIAERESIS
+00EC;A;LATIN SMALL LETTER I WITH GRAVE
+00ED;A;LATIN SMALL LETTER I WITH ACUTE
+00EE;N;LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF;N;LATIN SMALL LETTER I WITH DIAERESIS
+00F0;A;LATIN SMALL LETTER ETH
+00F1;N;LATIN SMALL LETTER N WITH TILDE
+00F2;A;LATIN SMALL LETTER O WITH GRAVE
+00F3;A;LATIN SMALL LETTER O WITH ACUTE
+00F4;N;LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5;N;LATIN SMALL LETTER O WITH TILDE
+00F6;N;LATIN SMALL LETTER O WITH DIAERESIS
+00F7;A;DIVISION SIGN
+00F8;A;LATIN SMALL LETTER O WITH STROKE
+00F9;A;LATIN SMALL LETTER U WITH GRAVE
+00FA;A;LATIN SMALL LETTER U WITH ACUTE
+00FB;N;LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC;A;LATIN SMALL LETTER U WITH DIAERESIS
+00FD;N;LATIN SMALL LETTER Y WITH ACUTE
+00FE;A;LATIN SMALL LETTER THORN
+00FF;N;LATIN SMALL LETTER Y WITH DIAERESIS
+0100;N;LATIN CAPITAL LETTER A WITH MACRON
+0101;A;LATIN SMALL LETTER A WITH MACRON
+0102;N;LATIN CAPITAL LETTER A WITH BREVE
+0103;N;LATIN SMALL LETTER A WITH BREVE
+0104;N;LATIN CAPITAL LETTER A WITH OGONEK
+0105;N;LATIN SMALL LETTER A WITH OGONEK
+0106;N;LATIN CAPITAL LETTER C WITH ACUTE
+0107;N;LATIN SMALL LETTER C WITH ACUTE
+0108;N;LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109;N;LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A;N;LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B;N;LATIN SMALL LETTER C WITH DOT ABOVE
+010C;N;LATIN CAPITAL LETTER C WITH CARON
+010D;N;LATIN SMALL LETTER C WITH CARON
+010E;N;LATIN CAPITAL LETTER D WITH CARON
+010F;N;LATIN SMALL LETTER D WITH CARON
+0110;N;LATIN CAPITAL LETTER D WITH STROKE
+0111;A;LATIN SMALL LETTER D WITH STROKE
+0112;N;LATIN CAPITAL LETTER E WITH MACRON
+0113;A;LATIN SMALL LETTER E WITH MACRON
+0114;N;LATIN CAPITAL LETTER E WITH BREVE
+0115;N;LATIN SMALL LETTER E WITH BREVE
+0116;N;LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117;N;LATIN SMALL LETTER E WITH DOT ABOVE
+0118;N;LATIN CAPITAL LETTER E WITH OGONEK
+0119;N;LATIN SMALL LETTER E WITH OGONEK
+011A;N;LATIN CAPITAL LETTER E WITH CARON
+011B;A;LATIN SMALL LETTER E WITH CARON
+011C;N;LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D;N;LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E;N;LATIN CAPITAL LETTER G WITH BREVE
+011F;N;LATIN SMALL LETTER G WITH BREVE
+0120;N;LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121;N;LATIN SMALL LETTER G WITH DOT ABOVE
+0122;N;LATIN CAPITAL LETTER G WITH CEDILLA
+0123;N;LATIN SMALL LETTER G WITH CEDILLA
+0124;N;LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125;N;LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126;A;LATIN CAPITAL LETTER H WITH STROKE
+0127;A;LATIN SMALL LETTER H WITH STROKE
+0128;N;LATIN CAPITAL LETTER I WITH TILDE
+0129;N;LATIN SMALL LETTER I WITH TILDE
+012A;N;LATIN CAPITAL LETTER I WITH MACRON
+012B;A;LATIN SMALL LETTER I WITH MACRON
+012C;N;LATIN CAPITAL LETTER I WITH BREVE
+012D;N;LATIN SMALL LETTER I WITH BREVE
+012E;N;LATIN CAPITAL LETTER I WITH OGONEK
+012F;N;LATIN SMALL LETTER I WITH OGONEK
+0130;N;LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131;A;LATIN SMALL LETTER DOTLESS I
+0132;A;LATIN CAPITAL LIGATURE IJ
+0133;A;LATIN SMALL LIGATURE IJ
+0134;N;LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135;N;LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136;N;LATIN CAPITAL LETTER K WITH CEDILLA
+0137;N;LATIN SMALL LETTER K WITH CEDILLA
+0138;A;LATIN SMALL LETTER KRA
+0139;N;LATIN CAPITAL LETTER L WITH ACUTE
+013A;N;LATIN SMALL LETTER L WITH ACUTE
+013B;N;LATIN CAPITAL LETTER L WITH CEDILLA
+013C;N;LATIN SMALL LETTER L WITH CEDILLA
+013D;N;LATIN CAPITAL LETTER L WITH CARON
+013E;N;LATIN SMALL LETTER L WITH CARON
+013F;A;LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140;A;LATIN SMALL LETTER L WITH MIDDLE DOT
+0141;A;LATIN CAPITAL LETTER L WITH STROKE
+0142;A;LATIN SMALL LETTER L WITH STROKE
+0143;N;LATIN CAPITAL LETTER N WITH ACUTE
+0144;A;LATIN SMALL LETTER N WITH ACUTE
+0145;N;LATIN CAPITAL LETTER N WITH CEDILLA
+0146;N;LATIN SMALL LETTER N WITH CEDILLA
+0147;N;LATIN CAPITAL LETTER N WITH CARON
+0148;A;LATIN SMALL LETTER N WITH CARON
+0149;A;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A;A;LATIN CAPITAL LETTER ENG
+014B;N;LATIN SMALL LETTER ENG
+014C;N;LATIN CAPITAL LETTER O WITH MACRON
+014D;A;LATIN SMALL LETTER O WITH MACRON
+014E;N;LATIN CAPITAL LETTER O WITH BREVE
+014F;N;LATIN SMALL LETTER O WITH BREVE
+0150;N;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151;N;LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152;A;LATIN CAPITAL LIGATURE OE
+0153;A;LATIN SMALL LIGATURE OE
+0154;N;LATIN CAPITAL LETTER R WITH ACUTE
+0155;N;LATIN SMALL LETTER R WITH ACUTE
+0156;N;LATIN CAPITAL LETTER R WITH CEDILLA
+0157;N;LATIN SMALL LETTER R WITH CEDILLA
+0158;N;LATIN CAPITAL LETTER R WITH CARON
+0159;N;LATIN SMALL LETTER R WITH CARON
+015A;N;LATIN CAPITAL LETTER S WITH ACUTE
+015B;N;LATIN SMALL LETTER S WITH ACUTE
+015C;N;LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D;N;LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E;N;LATIN CAPITAL LETTER S WITH CEDILLA
+015F;N;LATIN SMALL LETTER S WITH CEDILLA
+0160;N;LATIN CAPITAL LETTER S WITH CARON
+0161;N;LATIN SMALL LETTER S WITH CARON
+0162;N;LATIN CAPITAL LETTER T WITH CEDILLA
+0163;N;LATIN SMALL LETTER T WITH CEDILLA
+0164;N;LATIN CAPITAL LETTER T WITH CARON
+0165;N;LATIN SMALL LETTER T WITH CARON
+0166;A;LATIN CAPITAL LETTER T WITH STROKE
+0167;A;LATIN SMALL LETTER T WITH STROKE
+0168;N;LATIN CAPITAL LETTER U WITH TILDE
+0169;N;LATIN SMALL LETTER U WITH TILDE
+016A;N;LATIN CAPITAL LETTER U WITH MACRON
+016B;A;LATIN SMALL LETTER U WITH MACRON
+016C;N;LATIN CAPITAL LETTER U WITH BREVE
+016D;N;LATIN SMALL LETTER U WITH BREVE
+016E;N;LATIN CAPITAL LETTER U WITH RING ABOVE
+016F;N;LATIN SMALL LETTER U WITH RING ABOVE
+0170;N;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171;N;LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172;N;LATIN CAPITAL LETTER U WITH OGONEK
+0173;N;LATIN SMALL LETTER U WITH OGONEK
+0174;N;LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175;N;LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176;N;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177;N;LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178;N;LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179;N;LATIN CAPITAL LETTER Z WITH ACUTE
+017A;N;LATIN SMALL LETTER Z WITH ACUTE
+017B;N;LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C;N;LATIN SMALL LETTER Z WITH DOT ABOVE
+017D;N;LATIN CAPITAL LETTER Z WITH CARON
+017E;N;LATIN SMALL LETTER Z WITH CARON
+017F;N;LATIN SMALL LETTER LONG S
+0180;N;LATIN SMALL LETTER B WITH STROKE
+0181;N;LATIN CAPITAL LETTER B WITH HOOK
+0182;N;LATIN CAPITAL LETTER B WITH TOPBAR
+0183;N;LATIN SMALL LETTER B WITH TOPBAR
+0184;N;LATIN CAPITAL LETTER TONE SIX
+0185;N;LATIN SMALL LETTER TONE SIX
+0186;N;LATIN CAPITAL LETTER OPEN O
+0187;N;LATIN CAPITAL LETTER C WITH HOOK
+0188;N;LATIN SMALL LETTER C WITH HOOK
+0189;N;LATIN CAPITAL LETTER AFRICAN D
+018A;N;LATIN CAPITAL LETTER D WITH HOOK
+018B;N;LATIN CAPITAL LETTER D WITH TOPBAR
+018C;N;LATIN SMALL LETTER D WITH TOPBAR
+018D;N;LATIN SMALL LETTER TURNED DELTA
+018E;N;LATIN CAPITAL LETTER REVERSED E
+018F;N;LATIN CAPITAL LETTER SCHWA
+0190;N;LATIN CAPITAL LETTER OPEN E
+0191;N;LATIN CAPITAL LETTER F WITH HOOK
+0192;N;LATIN SMALL LETTER F WITH HOOK
+0193;N;LATIN CAPITAL LETTER G WITH HOOK
+0194;N;LATIN CAPITAL LETTER GAMMA
+0195;N;LATIN SMALL LETTER HV
+0196;N;LATIN CAPITAL LETTER IOTA
+0197;N;LATIN CAPITAL LETTER I WITH STROKE
+0198;N;LATIN CAPITAL LETTER K WITH HOOK
+0199;N;LATIN SMALL LETTER K WITH HOOK
+019A;N;LATIN SMALL LETTER L WITH BAR
+019B;N;LATIN SMALL LETTER LAMBDA WITH STROKE
+019C;N;LATIN CAPITAL LETTER TURNED M
+019D;N;LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E;N;LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F;N;LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0;N;LATIN CAPITAL LETTER O WITH HORN
+01A1;N;LATIN SMALL LETTER O WITH HORN
+01A2;N;LATIN CAPITAL LETTER OI
+01A3;N;LATIN SMALL LETTER OI
+01A4;N;LATIN CAPITAL LETTER P WITH HOOK
+01A5;N;LATIN SMALL LETTER P WITH HOOK
+01A6;N;LATIN LETTER YR
+01A7;N;LATIN CAPITAL LETTER TONE TWO
+01A8;N;LATIN SMALL LETTER TONE TWO
+01A9;N;LATIN CAPITAL LETTER ESH
+01AA;N;LATIN LETTER REVERSED ESH LOOP
+01AB;N;LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC;N;LATIN CAPITAL LETTER T WITH HOOK
+01AD;N;LATIN SMALL LETTER T WITH HOOK
+01AE;N;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF;N;LATIN CAPITAL LETTER U WITH HORN
+01B0;N;LATIN SMALL LETTER U WITH HORN
+01B1;N;LATIN CAPITAL LETTER UPSILON
+01B2;N;LATIN CAPITAL LETTER V WITH HOOK
+01B3;N;LATIN CAPITAL LETTER Y WITH HOOK
+01B4;N;LATIN SMALL LETTER Y WITH HOOK
+01B5;N;LATIN CAPITAL LETTER Z WITH STROKE
+01B6;N;LATIN SMALL LETTER Z WITH STROKE
+01B7;N;LATIN CAPITAL LETTER EZH
+01B8;N;LATIN CAPITAL LETTER EZH REVERSED
+01B9;N;LATIN SMALL LETTER EZH REVERSED
+01BA;N;LATIN SMALL LETTER EZH WITH TAIL
+01BB;N;LATIN LETTER TWO WITH STROKE
+01BC;N;LATIN CAPITAL LETTER TONE FIVE
+01BD;N;LATIN SMALL LETTER TONE FIVE
+01BE;N;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF;N;LATIN LETTER WYNN
+01C0;N;LATIN LETTER DENTAL CLICK
+01C1;N;LATIN LETTER LATERAL CLICK
+01C2;N;LATIN LETTER ALVEOLAR CLICK
+01C3;N;LATIN LETTER RETROFLEX CLICK
+01C4;N;LATIN CAPITAL LETTER DZ WITH CARON
+01C5;N;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6;N;LATIN SMALL LETTER DZ WITH CARON
+01C7;N;LATIN CAPITAL LETTER LJ
+01C8;N;LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9;N;LATIN SMALL LETTER LJ
+01CA;N;LATIN CAPITAL LETTER NJ
+01CB;N;LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC;N;LATIN SMALL LETTER NJ
+01CD;N;LATIN CAPITAL LETTER A WITH CARON
+01CE;A;LATIN SMALL LETTER A WITH CARON
+01CF;N;LATIN CAPITAL LETTER I WITH CARON
+01D0;A;LATIN SMALL LETTER I WITH CARON
+01D1;N;LATIN CAPITAL LETTER O WITH CARON
+01D2;A;LATIN SMALL LETTER O WITH CARON
+01D3;N;LATIN CAPITAL LETTER U WITH CARON
+01D4;A;LATIN SMALL LETTER U WITH CARON
+01D5;N;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6;A;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7;N;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8;A;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9;N;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA;A;LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB;N;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC;A;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD;N;LATIN SMALL LETTER TURNED E
+01DE;N;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF;N;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0;N;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1;N;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2;N;LATIN CAPITAL LETTER AE WITH MACRON
+01E3;N;LATIN SMALL LETTER AE WITH MACRON
+01E4;N;LATIN CAPITAL LETTER G WITH STROKE
+01E5;N;LATIN SMALL LETTER G WITH STROKE
+01E6;N;LATIN CAPITAL LETTER G WITH CARON
+01E7;N;LATIN SMALL LETTER G WITH CARON
+01E8;N;LATIN CAPITAL LETTER K WITH CARON
+01E9;N;LATIN SMALL LETTER K WITH CARON
+01EA;N;LATIN CAPITAL LETTER O WITH OGONEK
+01EB;N;LATIN SMALL LETTER O WITH OGONEK
+01EC;N;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED;N;LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE;N;LATIN CAPITAL LETTER EZH WITH CARON
+01EF;N;LATIN SMALL LETTER EZH WITH CARON
+01F0;N;LATIN SMALL LETTER J WITH CARON
+01F1;N;LATIN CAPITAL LETTER DZ
+01F2;N;LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3;N;LATIN SMALL LETTER DZ
+01F4;N;LATIN CAPITAL LETTER G WITH ACUTE
+01F5;N;LATIN SMALL LETTER G WITH ACUTE
+01F6;N;LATIN CAPITAL LETTER HWAIR
+01F7;N;LATIN CAPITAL LETTER WYNN
+01F8;N;LATIN CAPITAL LETTER N WITH GRAVE
+01F9;N;LATIN SMALL LETTER N WITH GRAVE
+01FA;N;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB;N;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC;N;LATIN CAPITAL LETTER AE WITH ACUTE
+01FD;N;LATIN SMALL LETTER AE WITH ACUTE
+01FE;N;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF;N;LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200;N;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201;N;LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202;N;LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203;N;LATIN SMALL LETTER A WITH INVERTED BREVE
+0204;N;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205;N;LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206;N;LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207;N;LATIN SMALL LETTER E WITH INVERTED BREVE
+0208;N;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209;N;LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A;N;LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B;N;LATIN SMALL LETTER I WITH INVERTED BREVE
+020C;N;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D;N;LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E;N;LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F;N;LATIN SMALL LETTER O WITH INVERTED BREVE
+0210;N;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211;N;LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212;N;LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213;N;LATIN SMALL LETTER R WITH INVERTED BREVE
+0214;N;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215;N;LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216;N;LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217;N;LATIN SMALL LETTER U WITH INVERTED BREVE
+0218;N;LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219;N;LATIN SMALL LETTER S WITH COMMA BELOW
+021A;N;LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B;N;LATIN SMALL LETTER T WITH COMMA BELOW
+021C;N;LATIN CAPITAL LETTER YOGH
+021D;N;LATIN SMALL LETTER YOGH
+021E;N;LATIN CAPITAL LETTER H WITH CARON
+021F;N;LATIN SMALL LETTER H WITH CARON
+0222;N;LATIN CAPITAL LETTER OU
+0223;N;LATIN SMALL LETTER OU
+0224;N;LATIN CAPITAL LETTER Z WITH HOOK
+0225;N;LATIN SMALL LETTER Z WITH HOOK
+0226;N;LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227;N;LATIN SMALL LETTER A WITH DOT ABOVE
+0228;N;LATIN CAPITAL LETTER E WITH CEDILLA
+0229;N;LATIN SMALL LETTER E WITH CEDILLA
+022A;N;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B;N;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C;N;LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D;N;LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E;N;LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F;N;LATIN SMALL LETTER O WITH DOT ABOVE
+0230;N;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231;N;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232;N;LATIN CAPITAL LETTER Y WITH MACRON
+0233;N;LATIN SMALL LETTER Y WITH MACRON
+0250;N;LATIN SMALL LETTER TURNED A
+0251;A;LATIN SMALL LETTER ALPHA
+0252;N;LATIN SMALL LETTER TURNED ALPHA
+0253;N;LATIN SMALL LETTER B WITH HOOK
+0254;N;LATIN SMALL LETTER OPEN O
+0255;N;LATIN SMALL LETTER C WITH CURL
+0256;N;LATIN SMALL LETTER D WITH TAIL
+0257;N;LATIN SMALL LETTER D WITH HOOK
+0258;N;LATIN SMALL LETTER REVERSED E
+0259;N;LATIN SMALL LETTER SCHWA
+025A;N;LATIN SMALL LETTER SCHWA WITH HOOK
+025B;N;LATIN SMALL LETTER OPEN E
+025C;N;LATIN SMALL LETTER REVERSED OPEN E
+025D;N;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E;N;LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F;N;LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260;N;LATIN SMALL LETTER G WITH HOOK
+0261;A;LATIN SMALL LETTER SCRIPT G
+0262;N;LATIN LETTER SMALL CAPITAL G
+0263;N;LATIN SMALL LETTER GAMMA
+0264;N;LATIN SMALL LETTER RAMS HORN
+0265;N;LATIN SMALL LETTER TURNED H
+0266;N;LATIN SMALL LETTER H WITH HOOK
+0267;N;LATIN SMALL LETTER HENG WITH HOOK
+0268;N;LATIN SMALL LETTER I WITH STROKE
+0269;N;LATIN SMALL LETTER IOTA
+026A;N;LATIN LETTER SMALL CAPITAL I
+026B;N;LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C;N;LATIN SMALL LETTER L WITH BELT
+026D;N;LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E;N;LATIN SMALL LETTER LEZH
+026F;N;LATIN SMALL LETTER TURNED M
+0270;N;LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271;N;LATIN SMALL LETTER M WITH HOOK
+0272;N;LATIN SMALL LETTER N WITH LEFT HOOK
+0273;N;LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274;N;LATIN LETTER SMALL CAPITAL N
+0275;N;LATIN SMALL LETTER BARRED O
+0276;N;LATIN LETTER SMALL CAPITAL OE
+0277;N;LATIN SMALL LETTER CLOSED OMEGA
+0278;N;LATIN SMALL LETTER PHI
+0279;N;LATIN SMALL LETTER TURNED R
+027A;N;LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B;N;LATIN SMALL LETTER TURNED R WITH HOOK
+027C;N;LATIN SMALL LETTER R WITH LONG LEG
+027D;N;LATIN SMALL LETTER R WITH TAIL
+027E;N;LATIN SMALL LETTER R WITH FISHHOOK
+027F;N;LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280;N;LATIN LETTER SMALL CAPITAL R
+0281;N;LATIN LETTER SMALL CAPITAL INVERTED R
+0282;N;LATIN SMALL LETTER S WITH HOOK
+0283;N;LATIN SMALL LETTER ESH
+0284;N;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285;N;LATIN SMALL LETTER SQUAT REVERSED ESH
+0286;N;LATIN SMALL LETTER ESH WITH CURL
+0287;N;LATIN SMALL LETTER TURNED T
+0288;N;LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289;N;LATIN SMALL LETTER U BAR
+028A;N;LATIN SMALL LETTER UPSILON
+028B;N;LATIN SMALL LETTER V WITH HOOK
+028C;N;LATIN SMALL LETTER TURNED V
+028D;N;LATIN SMALL LETTER TURNED W
+028E;N;LATIN SMALL LETTER TURNED Y
+028F;N;LATIN LETTER SMALL CAPITAL Y
+0290;N;LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291;N;LATIN SMALL LETTER Z WITH CURL
+0292;N;LATIN SMALL LETTER EZH
+0293;N;LATIN SMALL LETTER EZH WITH CURL
+0294;N;LATIN LETTER GLOTTAL STOP
+0295;N;LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296;N;LATIN LETTER INVERTED GLOTTAL STOP
+0297;N;LATIN LETTER STRETCHED C
+0298;N;LATIN LETTER BILABIAL CLICK
+0299;N;LATIN LETTER SMALL CAPITAL B
+029A;N;LATIN SMALL LETTER CLOSED OPEN E
+029B;N;LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C;N;LATIN LETTER SMALL CAPITAL H
+029D;N;LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E;N;LATIN SMALL LETTER TURNED K
+029F;N;LATIN LETTER SMALL CAPITAL L
+02A0;N;LATIN SMALL LETTER Q WITH HOOK
+02A1;N;LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2;N;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3;N;LATIN SMALL LETTER DZ DIGRAPH
+02A4;N;LATIN SMALL LETTER DEZH DIGRAPH
+02A5;N;LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6;N;LATIN SMALL LETTER TS DIGRAPH
+02A7;N;LATIN SMALL LETTER TESH DIGRAPH
+02A8;N;LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9;N;LATIN SMALL LETTER FENG DIGRAPH
+02AA;N;LATIN SMALL LETTER LS DIGRAPH
+02AB;N;LATIN SMALL LETTER LZ DIGRAPH
+02AC;N;LATIN LETTER BILABIAL PERCUSSIVE
+02AD;N;LATIN LETTER BIDENTAL PERCUSSIVE
+02B0;N;MODIFIER LETTER SMALL H
+02B1;N;MODIFIER LETTER SMALL H WITH HOOK
+02B2;N;MODIFIER LETTER SMALL J
+02B3;N;MODIFIER LETTER SMALL R
+02B4;N;MODIFIER LETTER SMALL TURNED R
+02B5;N;MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6;N;MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7;N;MODIFIER LETTER SMALL W
+02B8;N;MODIFIER LETTER SMALL Y
+02B9;N;MODIFIER LETTER PRIME
+02BA;N;MODIFIER LETTER DOUBLE PRIME
+02BB;N;MODIFIER LETTER TURNED COMMA
+02BC;N;MODIFIER LETTER APOSTROPHE
+02BD;N;MODIFIER LETTER REVERSED COMMA
+02BE;N;MODIFIER LETTER RIGHT HALF RING
+02BF;N;MODIFIER LETTER LEFT HALF RING
+02C0;N;MODIFIER LETTER GLOTTAL STOP
+02C1;N;MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2;N;MODIFIER LETTER LEFT ARROWHEAD
+02C3;N;MODIFIER LETTER RIGHT ARROWHEAD
+02C4;N;MODIFIER LETTER UP ARROWHEAD
+02C5;N;MODIFIER LETTER DOWN ARROWHEAD
+02C6;N;MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7;A;CARON
+02C8;N;MODIFIER LETTER VERTICAL LINE
+02C9;A;MODIFIER LETTER MACRON
+02CA;A;MODIFIER LETTER ACUTE ACCENT
+02CB;A;MODIFIER LETTER GRAVE ACCENT
+02CC;N;MODIFIER LETTER LOW VERTICAL LINE
+02CD;A;MODIFIER LETTER LOW MACRON
+02CE;N;MODIFIER LETTER LOW GRAVE ACCENT
+02CF;N;MODIFIER LETTER LOW ACUTE ACCENT
+02D0;A;MODIFIER LETTER TRIANGULAR COLON
+02D1;N;MODIFIER LETTER HALF TRIANGULAR COLON
+02D2;N;MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3;N;MODIFIER LETTER CENTRED LEFT HALF RING
+02D4;N;MODIFIER LETTER UP TACK
+02D5;N;MODIFIER LETTER DOWN TACK
+02D6;N;MODIFIER LETTER PLUS SIGN
+02D7;N;MODIFIER LETTER MINUS SIGN
+02D8;A;BREVE
+02D9;A;DOT ABOVE
+02DA;A;RING ABOVE
+02DB;A;OGONEK
+02DC;N;SMALL TILDE
+02DD;A;DOUBLE ACUTE ACCENT
+02DE;N;MODIFIER LETTER RHOTIC HOOK
+02DF;N;MODIFIER LETTER CROSS ACCENT
+02E0;N;MODIFIER LETTER SMALL GAMMA
+02E1;N;MODIFIER LETTER SMALL L
+02E2;N;MODIFIER LETTER SMALL S
+02E3;N;MODIFIER LETTER SMALL X
+02E4;N;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5;N;MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6;N;MODIFIER LETTER HIGH TONE BAR
+02E7;N;MODIFIER LETTER MID TONE BAR
+02E8;N;MODIFIER LETTER LOW TONE BAR
+02E9;N;MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA;N;MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB;N;MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC;N;MODIFIER LETTER VOICING
+02ED;N;MODIFIER LETTER UNASPIRATED
+02EE;N;MODIFIER LETTER DOUBLE APOSTROPHE
+0300;A;COMBINING GRAVE ACCENT
+0301;A;COMBINING ACUTE ACCENT
+0302;A;COMBINING CIRCUMFLEX ACCENT
+0303;A;COMBINING TILDE
+0304;A;COMBINING MACRON
+0305;A;COMBINING OVERLINE
+0306;A;COMBINING BREVE
+0307;A;COMBINING DOT ABOVE
+0308;A;COMBINING DIAERESIS
+0309;A;COMBINING HOOK ABOVE
+030A;A;COMBINING RING ABOVE
+030B;A;COMBINING DOUBLE ACUTE ACCENT
+030C;A;COMBINING CARON
+030D;A;COMBINING VERTICAL LINE ABOVE
+030E;A;COMBINING DOUBLE VERTICAL LINE ABOVE
+030F;A;COMBINING DOUBLE GRAVE ACCENT
+0310;A;COMBINING CANDRABINDU
+0311;A;COMBINING INVERTED BREVE
+0312;A;COMBINING TURNED COMMA ABOVE
+0313;A;COMBINING COMMA ABOVE
+0314;A;COMBINING REVERSED COMMA ABOVE
+0315;A;COMBINING COMMA ABOVE RIGHT
+0316;A;COMBINING GRAVE ACCENT BELOW
+0317;A;COMBINING ACUTE ACCENT BELOW
+0318;A;COMBINING LEFT TACK BELOW
+0319;A;COMBINING RIGHT TACK BELOW
+031A;A;COMBINING LEFT ANGLE ABOVE
+031B;A;COMBINING HORN
+031C;A;COMBINING LEFT HALF RING BELOW
+031D;A;COMBINING UP TACK BELOW
+031E;A;COMBINING DOWN TACK BELOW
+031F;A;COMBINING PLUS SIGN BELOW
+0320;A;COMBINING MINUS SIGN BELOW
+0321;A;COMBINING PALATALIZED HOOK BELOW
+0322;A;COMBINING RETROFLEX HOOK BELOW
+0323;A;COMBINING DOT BELOW
+0324;A;COMBINING DIAERESIS BELOW
+0325;A;COMBINING RING BELOW
+0326;A;COMBINING COMMA BELOW
+0327;A;COMBINING CEDILLA
+0328;A;COMBINING OGONEK
+0329;A;COMBINING VERTICAL LINE BELOW
+032A;A;COMBINING BRIDGE BELOW
+032B;A;COMBINING INVERTED DOUBLE ARCH BELOW
+032C;A;COMBINING CARON BELOW
+032D;A;COMBINING CIRCUMFLEX ACCENT BELOW
+032E;A;COMBINING BREVE BELOW
+032F;A;COMBINING INVERTED BREVE BELOW
+0330;A;COMBINING TILDE BELOW
+0331;A;COMBINING MACRON BELOW
+0332;A;COMBINING LOW LINE
+0333;A;COMBINING DOUBLE LOW LINE
+0334;A;COMBINING TILDE OVERLAY
+0335;A;COMBINING SHORT STROKE OVERLAY
+0336;A;COMBINING LONG STROKE OVERLAY
+0337;A;COMBINING SHORT SOLIDUS OVERLAY
+0338;A;COMBINING LONG SOLIDUS OVERLAY
+0339;A;COMBINING RIGHT HALF RING BELOW
+033A;A;COMBINING INVERTED BRIDGE BELOW
+033B;A;COMBINING SQUARE BELOW
+033C;A;COMBINING SEAGULL BELOW
+033D;A;COMBINING X ABOVE
+033E;A;COMBINING VERTICAL TILDE
+033F;A;COMBINING DOUBLE OVERLINE
+0340;A;COMBINING GRAVE TONE MARK
+0341;A;COMBINING ACUTE TONE MARK
+0342;A;COMBINING GREEK PERISPOMENI
+0343;A;COMBINING GREEK KORONIS
+0344;A;COMBINING GREEK DIALYTIKA TONOS
+0345;A;COMBINING GREEK YPOGEGRAMMENI
+0346;A;COMBINING BRIDGE ABOVE
+0347;A;COMBINING EQUALS SIGN BELOW
+0348;A;COMBINING DOUBLE VERTICAL LINE BELOW
+0349;A;COMBINING LEFT ANGLE BELOW
+034A;A;COMBINING NOT TILDE ABOVE
+034B;A;COMBINING HOMOTHETIC ABOVE
+034C;A;COMBINING ALMOST EQUAL TO ABOVE
+034D;A;COMBINING LEFT RIGHT ARROW BELOW
+034E;A;COMBINING UPWARDS ARROW BELOW
+0360;A;COMBINING DOUBLE TILDE
+0361;A;COMBINING DOUBLE INVERTED BREVE
+0362;A;COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0374;N;GREEK NUMERAL SIGN
+0375;N;GREEK LOWER NUMERAL SIGN
+037A;N;GREEK YPOGEGRAMMENI
+037E;N;GREEK QUESTION MARK
+0384;N;GREEK TONOS
+0385;N;GREEK DIALYTIKA TONOS
+0386;N;GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387;N;GREEK ANO TELEIA
+0388;N;GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389;N;GREEK CAPITAL LETTER ETA WITH TONOS
+038A;N;GREEK CAPITAL LETTER IOTA WITH TONOS
+038C;N;GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E;N;GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F;N;GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390;N;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391;A;GREEK CAPITAL LETTER ALPHA
+0392;A;GREEK CAPITAL LETTER BETA
+0393;A;GREEK CAPITAL LETTER GAMMA
+0394;A;GREEK CAPITAL LETTER DELTA
+0395;A;GREEK CAPITAL LETTER EPSILON
+0396;A;GREEK CAPITAL LETTER ZETA
+0397;A;GREEK CAPITAL LETTER ETA
+0398;A;GREEK CAPITAL LETTER THETA
+0399;A;GREEK CAPITAL LETTER IOTA
+039A;A;GREEK CAPITAL LETTER KAPPA
+039B;A;GREEK CAPITAL LETTER LAMDA
+039C;A;GREEK CAPITAL LETTER MU
+039D;A;GREEK CAPITAL LETTER NU
+039E;A;GREEK CAPITAL LETTER XI
+039F;A;GREEK CAPITAL LETTER OMICRON
+03A0;A;GREEK CAPITAL LETTER PI
+03A1;A;GREEK CAPITAL LETTER RHO
+03A3;A;GREEK CAPITAL LETTER SIGMA
+03A4;A;GREEK CAPITAL LETTER TAU
+03A5;A;GREEK CAPITAL LETTER UPSILON
+03A6;A;GREEK CAPITAL LETTER PHI
+03A7;A;GREEK CAPITAL LETTER CHI
+03A8;A;GREEK CAPITAL LETTER PSI
+03A9;A;GREEK CAPITAL LETTER OMEGA
+03AA;N;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB;N;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC;N;GREEK SMALL LETTER ALPHA WITH TONOS
+03AD;N;GREEK SMALL LETTER EPSILON WITH TONOS
+03AE;N;GREEK SMALL LETTER ETA WITH TONOS
+03AF;N;GREEK SMALL LETTER IOTA WITH TONOS
+03B0;N;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1;A;GREEK SMALL LETTER ALPHA
+03B2;A;GREEK SMALL LETTER BETA
+03B3;A;GREEK SMALL LETTER GAMMA
+03B4;A;GREEK SMALL LETTER DELTA
+03B5;A;GREEK SMALL LETTER EPSILON
+03B6;A;GREEK SMALL LETTER ZETA
+03B7;A;GREEK SMALL LETTER ETA
+03B8;A;GREEK SMALL LETTER THETA
+03B9;A;GREEK SMALL LETTER IOTA
+03BA;A;GREEK SMALL LETTER KAPPA
+03BB;A;GREEK SMALL LETTER LAMDA
+03BC;A;GREEK SMALL LETTER MU
+03BD;A;GREEK SMALL LETTER NU
+03BE;A;GREEK SMALL LETTER XI
+03BF;A;GREEK SMALL LETTER OMICRON
+03C0;A;GREEK SMALL LETTER PI
+03C1;A;GREEK SMALL LETTER RHO
+03C2;N;GREEK SMALL LETTER FINAL SIGMA
+03C3;A;GREEK SMALL LETTER SIGMA
+03C4;A;GREEK SMALL LETTER TAU
+03C5;A;GREEK SMALL LETTER UPSILON
+03C6;A;GREEK SMALL LETTER PHI
+03C7;A;GREEK SMALL LETTER CHI
+03C8;A;GREEK SMALL LETTER PSI
+03C9;A;GREEK SMALL LETTER OMEGA
+03CA;N;GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB;N;GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC;N;GREEK SMALL LETTER OMICRON WITH TONOS
+03CD;N;GREEK SMALL LETTER UPSILON WITH TONOS
+03CE;N;GREEK SMALL LETTER OMEGA WITH TONOS
+03D0;N;GREEK BETA SYMBOL
+03D1;N;GREEK THETA SYMBOL
+03D2;N;GREEK UPSILON WITH HOOK SYMBOL
+03D3;N;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4;N;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5;N;GREEK PHI SYMBOL
+03D6;N;GREEK PI SYMBOL
+03D7;N;GREEK KAI SYMBOL
+03DA;N;GREEK LETTER STIGMA
+03DB;N;GREEK SMALL LETTER STIGMA
+03DC;N;GREEK LETTER DIGAMMA
+03DD;N;GREEK SMALL LETTER DIGAMMA
+03DE;N;GREEK LETTER KOPPA
+03DF;N;GREEK SMALL LETTER KOPPA
+03E0;N;GREEK LETTER SAMPI
+03E1;N;GREEK SMALL LETTER SAMPI
+03E2;N;COPTIC CAPITAL LETTER SHEI
+03E3;N;COPTIC SMALL LETTER SHEI
+03E4;N;COPTIC CAPITAL LETTER FEI
+03E5;N;COPTIC SMALL LETTER FEI
+03E6;N;COPTIC CAPITAL LETTER KHEI
+03E7;N;COPTIC SMALL LETTER KHEI
+03E8;N;COPTIC CAPITAL LETTER HORI
+03E9;N;COPTIC SMALL LETTER HORI
+03EA;N;COPTIC CAPITAL LETTER GANGIA
+03EB;N;COPTIC SMALL LETTER GANGIA
+03EC;N;COPTIC CAPITAL LETTER SHIMA
+03ED;N;COPTIC SMALL LETTER SHIMA
+03EE;N;COPTIC CAPITAL LETTER DEI
+03EF;N;COPTIC SMALL LETTER DEI
+03F0;N;GREEK KAPPA SYMBOL
+03F1;N;GREEK RHO SYMBOL
+03F2;N;GREEK LUNATE SIGMA SYMBOL
+03F3;N;GREEK LETTER YOT
+0400;N;CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401;A;CYRILLIC CAPITAL LETTER IO
+0402;N;CYRILLIC CAPITAL LETTER DJE
+0403;N;CYRILLIC CAPITAL LETTER GJE
+0404;N;CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405;N;CYRILLIC CAPITAL LETTER DZE
+0406;N;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407;N;CYRILLIC CAPITAL LETTER YI
+0408;N;CYRILLIC CAPITAL LETTER JE
+0409;N;CYRILLIC CAPITAL LETTER LJE
+040A;N;CYRILLIC CAPITAL LETTER NJE
+040B;N;CYRILLIC CAPITAL LETTER TSHE
+040C;N;CYRILLIC CAPITAL LETTER KJE
+040D;N;CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E;N;CYRILLIC CAPITAL LETTER SHORT U
+040F;N;CYRILLIC CAPITAL LETTER DZHE
+0410;A;CYRILLIC CAPITAL LETTER A
+0411;A;CYRILLIC CAPITAL LETTER BE
+0412;A;CYRILLIC CAPITAL LETTER VE
+0413;A;CYRILLIC CAPITAL LETTER GHE
+0414;A;CYRILLIC CAPITAL LETTER DE
+0415;A;CYRILLIC CAPITAL LETTER IE
+0416;A;CYRILLIC CAPITAL LETTER ZHE
+0417;A;CYRILLIC CAPITAL LETTER ZE
+0418;A;CYRILLIC CAPITAL LETTER I
+0419;A;CYRILLIC CAPITAL LETTER SHORT I
+041A;A;CYRILLIC CAPITAL LETTER KA
+041B;A;CYRILLIC CAPITAL LETTER EL
+041C;A;CYRILLIC CAPITAL LETTER EM
+041D;A;CYRILLIC CAPITAL LETTER EN
+041E;A;CYRILLIC CAPITAL LETTER O
+041F;A;CYRILLIC CAPITAL LETTER PE
+0420;A;CYRILLIC CAPITAL LETTER ER
+0421;A;CYRILLIC CAPITAL LETTER ES
+0422;A;CYRILLIC CAPITAL LETTER TE
+0423;A;CYRILLIC CAPITAL LETTER U
+0424;A;CYRILLIC CAPITAL LETTER EF
+0425;A;CYRILLIC CAPITAL LETTER HA
+0426;A;CYRILLIC CAPITAL LETTER TSE
+0427;A;CYRILLIC CAPITAL LETTER CHE
+0428;A;CYRILLIC CAPITAL LETTER SHA
+0429;A;CYRILLIC CAPITAL LETTER SHCHA
+042A;A;CYRILLIC CAPITAL LETTER HARD SIGN
+042B;A;CYRILLIC CAPITAL LETTER YERU
+042C;A;CYRILLIC CAPITAL LETTER SOFT SIGN
+042D;A;CYRILLIC CAPITAL LETTER E
+042E;A;CYRILLIC CAPITAL LETTER YU
+042F;A;CYRILLIC CAPITAL LETTER YA
+0430;A;CYRILLIC SMALL LETTER A
+0431;A;CYRILLIC SMALL LETTER BE
+0432;A;CYRILLIC SMALL LETTER VE
+0433;A;CYRILLIC SMALL LETTER GHE
+0434;A;CYRILLIC SMALL LETTER DE
+0435;A;CYRILLIC SMALL LETTER IE
+0436;A;CYRILLIC SMALL LETTER ZHE
+0437;A;CYRILLIC SMALL LETTER ZE
+0438;A;CYRILLIC SMALL LETTER I
+0439;A;CYRILLIC SMALL LETTER SHORT I
+043A;A;CYRILLIC SMALL LETTER KA
+043B;A;CYRILLIC SMALL LETTER EL
+043C;A;CYRILLIC SMALL LETTER EM
+043D;A;CYRILLIC SMALL LETTER EN
+043E;A;CYRILLIC SMALL LETTER O
+043F;A;CYRILLIC SMALL LETTER PE
+0440;A;CYRILLIC SMALL LETTER ER
+0441;A;CYRILLIC SMALL LETTER ES
+0442;A;CYRILLIC SMALL LETTER TE
+0443;A;CYRILLIC SMALL LETTER U
+0444;A;CYRILLIC SMALL LETTER EF
+0445;A;CYRILLIC SMALL LETTER HA
+0446;A;CYRILLIC SMALL LETTER TSE
+0447;A;CYRILLIC SMALL LETTER CHE
+0448;A;CYRILLIC SMALL LETTER SHA
+0449;A;CYRILLIC SMALL LETTER SHCHA
+044A;A;CYRILLIC SMALL LETTER HARD SIGN
+044B;A;CYRILLIC SMALL LETTER YERU
+044C;A;CYRILLIC SMALL LETTER SOFT SIGN
+044D;A;CYRILLIC SMALL LETTER E
+044E;A;CYRILLIC SMALL LETTER YU
+044F;A;CYRILLIC SMALL LETTER YA
+0450;N;CYRILLIC SMALL LETTER IE WITH GRAVE
+0451;A;CYRILLIC SMALL LETTER IO
+0452;N;CYRILLIC SMALL LETTER DJE
+0453;N;CYRILLIC SMALL LETTER GJE
+0454;N;CYRILLIC SMALL LETTER UKRAINIAN IE
+0455;N;CYRILLIC SMALL LETTER DZE
+0456;N;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457;N;CYRILLIC SMALL LETTER YI
+0458;N;CYRILLIC SMALL LETTER JE
+0459;N;CYRILLIC SMALL LETTER LJE
+045A;N;CYRILLIC SMALL LETTER NJE
+045B;N;CYRILLIC SMALL LETTER TSHE
+045C;N;CYRILLIC SMALL LETTER KJE
+045D;N;CYRILLIC SMALL LETTER I WITH GRAVE
+045E;N;CYRILLIC SMALL LETTER SHORT U
+045F;N;CYRILLIC SMALL LETTER DZHE
+0460;N;CYRILLIC CAPITAL LETTER OMEGA
+0461;N;CYRILLIC SMALL LETTER OMEGA
+0462;N;CYRILLIC CAPITAL LETTER YAT
+0463;N;CYRILLIC SMALL LETTER YAT
+0464;N;CYRILLIC CAPITAL LETTER IOTIFIED E
+0465;N;CYRILLIC SMALL LETTER IOTIFIED E
+0466;N;CYRILLIC CAPITAL LETTER LITTLE YUS
+0467;N;CYRILLIC SMALL LETTER LITTLE YUS
+0468;N;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469;N;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A;N;CYRILLIC CAPITAL LETTER BIG YUS
+046B;N;CYRILLIC SMALL LETTER BIG YUS
+046C;N;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D;N;CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E;N;CYRILLIC CAPITAL LETTER KSI
+046F;N;CYRILLIC SMALL LETTER KSI
+0470;N;CYRILLIC CAPITAL LETTER PSI
+0471;N;CYRILLIC SMALL LETTER PSI
+0472;N;CYRILLIC CAPITAL LETTER FITA
+0473;N;CYRILLIC SMALL LETTER FITA
+0474;N;CYRILLIC CAPITAL LETTER IZHITSA
+0475;N;CYRILLIC SMALL LETTER IZHITSA
+0476;N;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477;N;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478;N;CYRILLIC CAPITAL LETTER UK
+0479;N;CYRILLIC SMALL LETTER UK
+047A;N;CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B;N;CYRILLIC SMALL LETTER ROUND OMEGA
+047C;N;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D;N;CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E;N;CYRILLIC CAPITAL LETTER OT
+047F;N;CYRILLIC SMALL LETTER OT
+0480;N;CYRILLIC CAPITAL LETTER KOPPA
+0481;N;CYRILLIC SMALL LETTER KOPPA
+0482;N;CYRILLIC THOUSANDS SIGN
+0483;N;COMBINING CYRILLIC TITLO
+0484;N;COMBINING CYRILLIC PALATALIZATION
+0485;N;COMBINING CYRILLIC DASIA PNEUMATA
+0486;N;COMBINING CYRILLIC PSILI PNEUMATA
+0488;N;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489;N;COMBINING CYRILLIC MILLIONS SIGN
+048C;N;CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D;N;CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E;N;CYRILLIC CAPITAL LETTER ER WITH TICK
+048F;N;CYRILLIC SMALL LETTER ER WITH TICK
+0490;N;CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491;N;CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492;N;CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493;N;CYRILLIC SMALL LETTER GHE WITH STROKE
+0494;N;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495;N;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496;N;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497;N;CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498;N;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499;N;CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A;N;CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B;N;CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C;N;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D;N;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E;N;CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F;N;CYRILLIC SMALL LETTER KA WITH STROKE
+04A0;N;CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1;N;CYRILLIC SMALL LETTER BASHKIR KA
+04A2;N;CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3;N;CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4;N;CYRILLIC CAPITAL LIGATURE EN GHE
+04A5;N;CYRILLIC SMALL LIGATURE EN GHE
+04A6;N;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7;N;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8;N;CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9;N;CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA;N;CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB;N;CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC;N;CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD;N;CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE;N;CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF;N;CYRILLIC SMALL LETTER STRAIGHT U
+04B0;N;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1;N;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2;N;CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3;N;CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4;N;CYRILLIC CAPITAL LIGATURE TE TSE
+04B5;N;CYRILLIC SMALL LIGATURE TE TSE
+04B6;N;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7;N;CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8;N;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9;N;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA;N;CYRILLIC CAPITAL LETTER SHHA
+04BB;N;CYRILLIC SMALL LETTER SHHA
+04BC;N;CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD;N;CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE;N;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF;N;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0;N;CYRILLIC LETTER PALOCHKA
+04C1;N;CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2;N;CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3;N;CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4;N;CYRILLIC SMALL LETTER KA WITH HOOK
+04C7;N;CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8;N;CYRILLIC SMALL LETTER EN WITH HOOK
+04CB;N;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC;N;CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04D0;N;CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1;N;CYRILLIC SMALL LETTER A WITH BREVE
+04D2;N;CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3;N;CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4;N;CYRILLIC CAPITAL LIGATURE A IE
+04D5;N;CYRILLIC SMALL LIGATURE A IE
+04D6;N;CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7;N;CYRILLIC SMALL LETTER IE WITH BREVE
+04D8;N;CYRILLIC CAPITAL LETTER SCHWA
+04D9;N;CYRILLIC SMALL LETTER SCHWA
+04DA;N;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB;N;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC;N;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD;N;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE;N;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF;N;CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0;N;CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1;N;CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2;N;CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3;N;CYRILLIC SMALL LETTER I WITH MACRON
+04E4;N;CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5;N;CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6;N;CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7;N;CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8;N;CYRILLIC CAPITAL LETTER BARRED O
+04E9;N;CYRILLIC SMALL LETTER BARRED O
+04EA;N;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB;N;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC;N;CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED;N;CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE;N;CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF;N;CYRILLIC SMALL LETTER U WITH MACRON
+04F0;N;CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1;N;CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2;N;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3;N;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4;N;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5;N;CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F8;N;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9;N;CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0531;N;ARMENIAN CAPITAL LETTER AYB
+0532;N;ARMENIAN CAPITAL LETTER BEN
+0533;N;ARMENIAN CAPITAL LETTER GIM
+0534;N;ARMENIAN CAPITAL LETTER DA
+0535;N;ARMENIAN CAPITAL LETTER ECH
+0536;N;ARMENIAN CAPITAL LETTER ZA
+0537;N;ARMENIAN CAPITAL LETTER EH
+0538;N;ARMENIAN CAPITAL LETTER ET
+0539;N;ARMENIAN CAPITAL LETTER TO
+053A;N;ARMENIAN CAPITAL LETTER ZHE
+053B;N;ARMENIAN CAPITAL LETTER INI
+053C;N;ARMENIAN CAPITAL LETTER LIWN
+053D;N;ARMENIAN CAPITAL LETTER XEH
+053E;N;ARMENIAN CAPITAL LETTER CA
+053F;N;ARMENIAN CAPITAL LETTER KEN
+0540;N;ARMENIAN CAPITAL LETTER HO
+0541;N;ARMENIAN CAPITAL LETTER JA
+0542;N;ARMENIAN CAPITAL LETTER GHAD
+0543;N;ARMENIAN CAPITAL LETTER CHEH
+0544;N;ARMENIAN CAPITAL LETTER MEN
+0545;N;ARMENIAN CAPITAL LETTER YI
+0546;N;ARMENIAN CAPITAL LETTER NOW
+0547;N;ARMENIAN CAPITAL LETTER SHA
+0548;N;ARMENIAN CAPITAL LETTER VO
+0549;N;ARMENIAN CAPITAL LETTER CHA
+054A;N;ARMENIAN CAPITAL LETTER PEH
+054B;N;ARMENIAN CAPITAL LETTER JHEH
+054C;N;ARMENIAN CAPITAL LETTER RA
+054D;N;ARMENIAN CAPITAL LETTER SEH
+054E;N;ARMENIAN CAPITAL LETTER VEW
+054F;N;ARMENIAN CAPITAL LETTER TIWN
+0550;N;ARMENIAN CAPITAL LETTER REH
+0551;N;ARMENIAN CAPITAL LETTER CO
+0552;N;ARMENIAN CAPITAL LETTER YIWN
+0553;N;ARMENIAN CAPITAL LETTER PIWR
+0554;N;ARMENIAN CAPITAL LETTER KEH
+0555;N;ARMENIAN CAPITAL LETTER OH
+0556;N;ARMENIAN CAPITAL LETTER FEH
+0559;N;ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A;N;ARMENIAN APOSTROPHE
+055B;N;ARMENIAN EMPHASIS MARK
+055C;N;ARMENIAN EXCLAMATION MARK
+055D;N;ARMENIAN COMMA
+055E;N;ARMENIAN QUESTION MARK
+055F;N;ARMENIAN ABBREVIATION MARK
+0561;N;ARMENIAN SMALL LETTER AYB
+0562;N;ARMENIAN SMALL LETTER BEN
+0563;N;ARMENIAN SMALL LETTER GIM
+0564;N;ARMENIAN SMALL LETTER DA
+0565;N;ARMENIAN SMALL LETTER ECH
+0566;N;ARMENIAN SMALL LETTER ZA
+0567;N;ARMENIAN SMALL LETTER EH
+0568;N;ARMENIAN SMALL LETTER ET
+0569;N;ARMENIAN SMALL LETTER TO
+056A;N;ARMENIAN SMALL LETTER ZHE
+056B;N;ARMENIAN SMALL LETTER INI
+056C;N;ARMENIAN SMALL LETTER LIWN
+056D;N;ARMENIAN SMALL LETTER XEH
+056E;N;ARMENIAN SMALL LETTER CA
+056F;N;ARMENIAN SMALL LETTER KEN
+0570;N;ARMENIAN SMALL LETTER HO
+0571;N;ARMENIAN SMALL LETTER JA
+0572;N;ARMENIAN SMALL LETTER GHAD
+0573;N;ARMENIAN SMALL LETTER CHEH
+0574;N;ARMENIAN SMALL LETTER MEN
+0575;N;ARMENIAN SMALL LETTER YI
+0576;N;ARMENIAN SMALL LETTER NOW
+0577;N;ARMENIAN SMALL LETTER SHA
+0578;N;ARMENIAN SMALL LETTER VO
+0579;N;ARMENIAN SMALL LETTER CHA
+057A;N;ARMENIAN SMALL LETTER PEH
+057B;N;ARMENIAN SMALL LETTER JHEH
+057C;N;ARMENIAN SMALL LETTER RA
+057D;N;ARMENIAN SMALL LETTER SEH
+057E;N;ARMENIAN SMALL LETTER VEW
+057F;N;ARMENIAN SMALL LETTER TIWN
+0580;N;ARMENIAN SMALL LETTER REH
+0581;N;ARMENIAN SMALL LETTER CO
+0582;N;ARMENIAN SMALL LETTER YIWN
+0583;N;ARMENIAN SMALL LETTER PIWR
+0584;N;ARMENIAN SMALL LETTER KEH
+0585;N;ARMENIAN SMALL LETTER OH
+0586;N;ARMENIAN SMALL LETTER FEH
+0587;N;ARMENIAN SMALL LIGATURE ECH YIWN
+0589;N;ARMENIAN FULL STOP
+058A;N;ARMENIAN HYPHEN
+0591;N;HEBREW ACCENT ETNAHTA
+0592;N;HEBREW ACCENT SEGOL
+0593;N;HEBREW ACCENT SHALSHELET
+0594;N;HEBREW ACCENT ZAQEF QATAN
+0595;N;HEBREW ACCENT ZAQEF GADOL
+0596;N;HEBREW ACCENT TIPEHA
+0597;N;HEBREW ACCENT REVIA
+0598;N;HEBREW ACCENT ZARQA
+0599;N;HEBREW ACCENT PASHTA
+059A;N;HEBREW ACCENT YETIV
+059B;N;HEBREW ACCENT TEVIR
+059C;N;HEBREW ACCENT GERESH
+059D;N;HEBREW ACCENT GERESH MUQDAM
+059E;N;HEBREW ACCENT GERSHAYIM
+059F;N;HEBREW ACCENT QARNEY PARA
+05A0;N;HEBREW ACCENT TELISHA GEDOLA
+05A1;N;HEBREW ACCENT PAZER
+05A3;N;HEBREW ACCENT MUNAH
+05A4;N;HEBREW ACCENT MAHAPAKH
+05A5;N;HEBREW ACCENT MERKHA
+05A6;N;HEBREW ACCENT MERKHA KEFULA
+05A7;N;HEBREW ACCENT DARGA
+05A8;N;HEBREW ACCENT QADMA
+05A9;N;HEBREW ACCENT TELISHA QETANA
+05AA;N;HEBREW ACCENT YERAH BEN YOMO
+05AB;N;HEBREW ACCENT OLE
+05AC;N;HEBREW ACCENT ILUY
+05AD;N;HEBREW ACCENT DEHI
+05AE;N;HEBREW ACCENT ZINOR
+05AF;N;HEBREW MARK MASORA CIRCLE
+05B0;N;HEBREW POINT SHEVA
+05B1;N;HEBREW POINT HATAF SEGOL
+05B2;N;HEBREW POINT HATAF PATAH
+05B3;N;HEBREW POINT HATAF QAMATS
+05B4;N;HEBREW POINT HIRIQ
+05B5;N;HEBREW POINT TSERE
+05B6;N;HEBREW POINT SEGOL
+05B7;N;HEBREW POINT PATAH
+05B8;N;HEBREW POINT QAMATS
+05B9;N;HEBREW POINT HOLAM
+05BB;N;HEBREW POINT QUBUTS
+05BC;N;HEBREW POINT DAGESH OR MAPIQ
+05BD;N;HEBREW POINT METEG
+05BE;N;HEBREW PUNCTUATION MAQAF
+05BF;N;HEBREW POINT RAFE
+05C0;N;HEBREW PUNCTUATION PASEQ
+05C1;N;HEBREW POINT SHIN DOT
+05C2;N;HEBREW POINT SIN DOT
+05C3;N;HEBREW PUNCTUATION SOF PASUQ
+05C4;N;HEBREW MARK UPPER DOT
+05D0;N;HEBREW LETTER ALEF
+05D1;N;HEBREW LETTER BET
+05D2;N;HEBREW LETTER GIMEL
+05D3;N;HEBREW LETTER DALET
+05D4;N;HEBREW LETTER HE
+05D5;N;HEBREW LETTER VAV
+05D6;N;HEBREW LETTER ZAYIN
+05D7;N;HEBREW LETTER HET
+05D8;N;HEBREW LETTER TET
+05D9;N;HEBREW LETTER YOD
+05DA;N;HEBREW LETTER FINAL KAF
+05DB;N;HEBREW LETTER KAF
+05DC;N;HEBREW LETTER LAMED
+05DD;N;HEBREW LETTER FINAL MEM
+05DE;N;HEBREW LETTER MEM
+05DF;N;HEBREW LETTER FINAL NUN
+05E0;N;HEBREW LETTER NUN
+05E1;N;HEBREW LETTER SAMEKH
+05E2;N;HEBREW LETTER AYIN
+05E3;N;HEBREW LETTER FINAL PE
+05E4;N;HEBREW LETTER PE
+05E5;N;HEBREW LETTER FINAL TSADI
+05E6;N;HEBREW LETTER TSADI
+05E7;N;HEBREW LETTER QOF
+05E8;N;HEBREW LETTER RESH
+05E9;N;HEBREW LETTER SHIN
+05EA;N;HEBREW LETTER TAV
+05F0;N;HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1;N;HEBREW LIGATURE YIDDISH VAV YOD
+05F2;N;HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3;N;HEBREW PUNCTUATION GERESH
+05F4;N;HEBREW PUNCTUATION GERSHAYIM
+060C;N;ARABIC COMMA
+061B;N;ARABIC SEMICOLON
+061F;N;ARABIC QUESTION MARK
+0621;N;ARABIC LETTER HAMZA
+0622;N;ARABIC LETTER ALEF WITH MADDA ABOVE
+0623;N;ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624;N;ARABIC LETTER WAW WITH HAMZA ABOVE
+0625;N;ARABIC LETTER ALEF WITH HAMZA BELOW
+0626;N;ARABIC LETTER YEH WITH HAMZA ABOVE
+0627;N;ARABIC LETTER ALEF
+0628;N;ARABIC LETTER BEH
+0629;N;ARABIC LETTER TEH MARBUTA
+062A;N;ARABIC LETTER TEH
+062B;N;ARABIC LETTER THEH
+062C;N;ARABIC LETTER JEEM
+062D;N;ARABIC LETTER HAH
+062E;N;ARABIC LETTER KHAH
+062F;N;ARABIC LETTER DAL
+0630;N;ARABIC LETTER THAL
+0631;N;ARABIC LETTER REH
+0632;N;ARABIC LETTER ZAIN
+0633;N;ARABIC LETTER SEEN
+0634;N;ARABIC LETTER SHEEN
+0635;N;ARABIC LETTER SAD
+0636;N;ARABIC LETTER DAD
+0637;N;ARABIC LETTER TAH
+0638;N;ARABIC LETTER ZAH
+0639;N;ARABIC LETTER AIN
+063A;N;ARABIC LETTER GHAIN
+0640;N;ARABIC TATWEEL
+0641;N;ARABIC LETTER FEH
+0642;N;ARABIC LETTER QAF
+0643;N;ARABIC LETTER KAF
+0644;N;ARABIC LETTER LAM
+0645;N;ARABIC LETTER MEEM
+0646;N;ARABIC LETTER NOON
+0647;N;ARABIC LETTER HEH
+0648;N;ARABIC LETTER WAW
+0649;N;ARABIC LETTER ALEF MAKSURA
+064A;N;ARABIC LETTER YEH
+064B;N;ARABIC FATHATAN
+064C;N;ARABIC DAMMATAN
+064D;N;ARABIC KASRATAN
+064E;N;ARABIC FATHA
+064F;N;ARABIC DAMMA
+0650;N;ARABIC KASRA
+0651;N;ARABIC SHADDA
+0652;N;ARABIC SUKUN
+0653;N;ARABIC MADDAH ABOVE
+0654;N;ARABIC HAMZA ABOVE
+0655;N;ARABIC HAMZA BELOW
+0660;N;ARABIC-INDIC DIGIT ZERO
+0661;N;ARABIC-INDIC DIGIT ONE
+0662;N;ARABIC-INDIC DIGIT TWO
+0663;N;ARABIC-INDIC DIGIT THREE
+0664;N;ARABIC-INDIC DIGIT FOUR
+0665;N;ARABIC-INDIC DIGIT FIVE
+0666;N;ARABIC-INDIC DIGIT SIX
+0667;N;ARABIC-INDIC DIGIT SEVEN
+0668;N;ARABIC-INDIC DIGIT EIGHT
+0669;N;ARABIC-INDIC DIGIT NINE
+066A;N;ARABIC PERCENT SIGN
+066B;N;ARABIC DECIMAL SEPARATOR
+066C;N;ARABIC THOUSANDS SEPARATOR
+066D;N;ARABIC FIVE POINTED STAR
+0670;N;ARABIC LETTER SUPERSCRIPT ALEF
+0671;N;ARABIC LETTER ALEF WASLA
+0672;N;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673;N;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674;N;ARABIC LETTER HIGH HAMZA
+0675;N;ARABIC LETTER HIGH HAMZA ALEF
+0676;N;ARABIC LETTER HIGH HAMZA WAW
+0677;N;ARABIC LETTER U WITH HAMZA ABOVE
+0678;N;ARABIC LETTER HIGH HAMZA YEH
+0679;N;ARABIC LETTER TTEH
+067A;N;ARABIC LETTER TTEHEH
+067B;N;ARABIC LETTER BEEH
+067C;N;ARABIC LETTER TEH WITH RING
+067D;N;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E;N;ARABIC LETTER PEH
+067F;N;ARABIC LETTER TEHEH
+0680;N;ARABIC LETTER BEHEH
+0681;N;ARABIC LETTER HAH WITH HAMZA ABOVE
+0682;N;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683;N;ARABIC LETTER NYEH
+0684;N;ARABIC LETTER DYEH
+0685;N;ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686;N;ARABIC LETTER TCHEH
+0687;N;ARABIC LETTER TCHEHEH
+0688;N;ARABIC LETTER DDAL
+0689;N;ARABIC LETTER DAL WITH RING
+068A;N;ARABIC LETTER DAL WITH DOT BELOW
+068B;N;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C;N;ARABIC LETTER DAHAL
+068D;N;ARABIC LETTER DDAHAL
+068E;N;ARABIC LETTER DUL
+068F;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690;N;ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691;N;ARABIC LETTER RREH
+0692;N;ARABIC LETTER REH WITH SMALL V
+0693;N;ARABIC LETTER REH WITH RING
+0694;N;ARABIC LETTER REH WITH DOT BELOW
+0695;N;ARABIC LETTER REH WITH SMALL V BELOW
+0696;N;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697;N;ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698;N;ARABIC LETTER JEH
+0699;N;ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A;N;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B;N;ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C;N;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D;N;ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E;N;ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F;N;ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0;N;ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1;N;ARABIC LETTER DOTLESS FEH
+06A2;N;ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3;N;ARABIC LETTER FEH WITH DOT BELOW
+06A4;N;ARABIC LETTER VEH
+06A5;N;ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6;N;ARABIC LETTER PEHEH
+06A7;N;ARABIC LETTER QAF WITH DOT ABOVE
+06A8;N;ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9;N;ARABIC LETTER KEHEH
+06AA;N;ARABIC LETTER SWASH KAF
+06AB;N;ARABIC LETTER KAF WITH RING
+06AC;N;ARABIC LETTER KAF WITH DOT ABOVE
+06AD;N;ARABIC LETTER NG
+06AE;N;ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF;N;ARABIC LETTER GAF
+06B0;N;ARABIC LETTER GAF WITH RING
+06B1;N;ARABIC LETTER NGOEH
+06B2;N;ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3;N;ARABIC LETTER GUEH
+06B4;N;ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5;N;ARABIC LETTER LAM WITH SMALL V
+06B6;N;ARABIC LETTER LAM WITH DOT ABOVE
+06B7;N;ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8;N;ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9;N;ARABIC LETTER NOON WITH DOT BELOW
+06BA;N;ARABIC LETTER NOON GHUNNA
+06BB;N;ARABIC LETTER RNOON
+06BC;N;ARABIC LETTER NOON WITH RING
+06BD;N;ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE;N;ARABIC LETTER HEH DOACHASHMEE
+06BF;N;ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0;N;ARABIC LETTER HEH WITH YEH ABOVE
+06C1;N;ARABIC LETTER HEH GOAL
+06C2;N;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3;N;ARABIC LETTER TEH MARBUTA GOAL
+06C4;N;ARABIC LETTER WAW WITH RING
+06C5;N;ARABIC LETTER KIRGHIZ OE
+06C6;N;ARABIC LETTER OE
+06C7;N;ARABIC LETTER U
+06C8;N;ARABIC LETTER YU
+06C9;N;ARABIC LETTER KIRGHIZ YU
+06CA;N;ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB;N;ARABIC LETTER VE
+06CC;N;ARABIC LETTER FARSI YEH
+06CD;N;ARABIC LETTER YEH WITH TAIL
+06CE;N;ARABIC LETTER YEH WITH SMALL V
+06CF;N;ARABIC LETTER WAW WITH DOT ABOVE
+06D0;N;ARABIC LETTER E
+06D1;N;ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2;N;ARABIC LETTER YEH BARREE
+06D3;N;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4;N;ARABIC FULL STOP
+06D5;N;ARABIC LETTER AE
+06D6;N;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7;N;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8;N;ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9;N;ARABIC SMALL HIGH LAM ALEF
+06DA;N;ARABIC SMALL HIGH JEEM
+06DB;N;ARABIC SMALL HIGH THREE DOTS
+06DC;N;ARABIC SMALL HIGH SEEN
+06DD;N;ARABIC END OF AYAH
+06DE;N;ARABIC START OF RUB EL HIZB
+06DF;N;ARABIC SMALL HIGH ROUNDED ZERO
+06E0;N;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1;N;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2;N;ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3;N;ARABIC SMALL LOW SEEN
+06E4;N;ARABIC SMALL HIGH MADDA
+06E5;N;ARABIC SMALL WAW
+06E6;N;ARABIC SMALL YEH
+06E7;N;ARABIC SMALL HIGH YEH
+06E8;N;ARABIC SMALL HIGH NOON
+06E9;N;ARABIC PLACE OF SAJDAH
+06EA;N;ARABIC EMPTY CENTRE LOW STOP
+06EB;N;ARABIC EMPTY CENTRE HIGH STOP
+06EC;N;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED;N;ARABIC SMALL LOW MEEM
+06F0;N;EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1;N;EXTENDED ARABIC-INDIC DIGIT ONE
+06F2;N;EXTENDED ARABIC-INDIC DIGIT TWO
+06F3;N;EXTENDED ARABIC-INDIC DIGIT THREE
+06F4;N;EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5;N;EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6;N;EXTENDED ARABIC-INDIC DIGIT SIX
+06F7;N;EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8;N;EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9;N;EXTENDED ARABIC-INDIC DIGIT NINE
+06FA;N;ARABIC LETTER SHEEN WITH DOT BELOW
+06FB;N;ARABIC LETTER DAD WITH DOT BELOW
+06FC;N;ARABIC LETTER GHAIN WITH DOT BELOW
+06FD;N;ARABIC SIGN SINDHI AMPERSAND
+06FE;N;ARABIC SIGN SINDHI POSTPOSITION MEN
+0700;N;SYRIAC END OF PARAGRAPH
+0701;N;SYRIAC SUPRALINEAR FULL STOP
+0702;N;SYRIAC SUBLINEAR FULL STOP
+0703;N;SYRIAC SUPRALINEAR COLON
+0704;N;SYRIAC SUBLINEAR COLON
+0705;N;SYRIAC HORIZONTAL COLON
+0706;N;SYRIAC COLON SKEWED LEFT
+0707;N;SYRIAC COLON SKEWED RIGHT
+0708;N;SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709;N;SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A;N;SYRIAC CONTRACTION
+070B;N;SYRIAC HARKLEAN OBELUS
+070C;N;SYRIAC HARKLEAN METOBELUS
+070D;N;SYRIAC HARKLEAN ASTERISCUS
+070F;N;SYRIAC ABBREVIATION MARK
+0710;N;SYRIAC LETTER ALAPH
+0711;N;SYRIAC LETTER SUPERSCRIPT ALAPH
+0712;N;SYRIAC LETTER BETH
+0713;N;SYRIAC LETTER GAMAL
+0714;N;SYRIAC LETTER GAMAL GARSHUNI
+0715;N;SYRIAC LETTER DALATH
+0716;N;SYRIAC LETTER DOTLESS DALATH RISH
+0717;N;SYRIAC LETTER HE
+0718;N;SYRIAC LETTER WAW
+0719;N;SYRIAC LETTER ZAIN
+071A;N;SYRIAC LETTER HETH
+071B;N;SYRIAC LETTER TETH
+071C;N;SYRIAC LETTER TETH GARSHUNI
+071D;N;SYRIAC LETTER YUDH
+071E;N;SYRIAC LETTER YUDH HE
+071F;N;SYRIAC LETTER KAPH
+0720;N;SYRIAC LETTER LAMADH
+0721;N;SYRIAC LETTER MIM
+0722;N;SYRIAC LETTER NUN
+0723;N;SYRIAC LETTER SEMKATH
+0724;N;SYRIAC LETTER FINAL SEMKATH
+0725;N;SYRIAC LETTER E
+0726;N;SYRIAC LETTER PE
+0727;N;SYRIAC LETTER REVERSED PE
+0728;N;SYRIAC LETTER SADHE
+0729;N;SYRIAC LETTER QAPH
+072A;N;SYRIAC LETTER RISH
+072B;N;SYRIAC LETTER SHIN
+072C;N;SYRIAC LETTER TAW
+0730;N;SYRIAC PTHAHA ABOVE
+0731;N;SYRIAC PTHAHA BELOW
+0732;N;SYRIAC PTHAHA DOTTED
+0733;N;SYRIAC ZQAPHA ABOVE
+0734;N;SYRIAC ZQAPHA BELOW
+0735;N;SYRIAC ZQAPHA DOTTED
+0736;N;SYRIAC RBASA ABOVE
+0737;N;SYRIAC RBASA BELOW
+0738;N;SYRIAC DOTTED ZLAMA HORIZONTAL
+0739;N;SYRIAC DOTTED ZLAMA ANGULAR
+073A;N;SYRIAC HBASA ABOVE
+073B;N;SYRIAC HBASA BELOW
+073C;N;SYRIAC HBASA-ESASA DOTTED
+073D;N;SYRIAC ESASA ABOVE
+073E;N;SYRIAC ESASA BELOW
+073F;N;SYRIAC RWAHA
+0740;N;SYRIAC FEMININE DOT
+0741;N;SYRIAC QUSHSHAYA
+0742;N;SYRIAC RUKKAKHA
+0743;N;SYRIAC TWO VERTICAL DOTS ABOVE
+0744;N;SYRIAC TWO VERTICAL DOTS BELOW
+0745;N;SYRIAC THREE DOTS ABOVE
+0746;N;SYRIAC THREE DOTS BELOW
+0747;N;SYRIAC OBLIQUE LINE ABOVE
+0748;N;SYRIAC OBLIQUE LINE BELOW
+0749;N;SYRIAC MUSIC
+074A;N;SYRIAC BARREKH
+0780;N;THAANA LETTER HAA
+0781;N;THAANA LETTER SHAVIYANI
+0782;N;THAANA LETTER NOONU
+0783;N;THAANA LETTER RAA
+0784;N;THAANA LETTER BAA
+0785;N;THAANA LETTER LHAVIYANI
+0786;N;THAANA LETTER KAAFU
+0787;N;THAANA LETTER ALIFU
+0788;N;THAANA LETTER VAAVU
+0789;N;THAANA LETTER MEEMU
+078A;N;THAANA LETTER FAAFU
+078B;N;THAANA LETTER DHAALU
+078C;N;THAANA LETTER THAA
+078D;N;THAANA LETTER LAAMU
+078E;N;THAANA LETTER GAAFU
+078F;N;THAANA LETTER GNAVIYANI
+0790;N;THAANA LETTER SEENU
+0791;N;THAANA LETTER DAVIYANI
+0792;N;THAANA LETTER ZAVIYANI
+0793;N;THAANA LETTER TAVIYANI
+0794;N;THAANA LETTER YAA
+0795;N;THAANA LETTER PAVIYANI
+0796;N;THAANA LETTER JAVIYANI
+0797;N;THAANA LETTER CHAVIYANI
+0798;N;THAANA LETTER TTAA
+0799;N;THAANA LETTER HHAA
+079A;N;THAANA LETTER KHAA
+079B;N;THAANA LETTER THAALU
+079C;N;THAANA LETTER ZAA
+079D;N;THAANA LETTER SHEENU
+079E;N;THAANA LETTER SAADHU
+079F;N;THAANA LETTER DAADHU
+07A0;N;THAANA LETTER TO
+07A1;N;THAANA LETTER ZO
+07A2;N;THAANA LETTER AINU
+07A3;N;THAANA LETTER GHAINU
+07A4;N;THAANA LETTER QAAFU
+07A5;N;THAANA LETTER WAAVU
+07A6;N;THAANA ABAFILI
+07A7;N;THAANA AABAAFILI
+07A8;N;THAANA IBIFILI
+07A9;N;THAANA EEBEEFILI
+07AA;N;THAANA UBUFILI
+07AB;N;THAANA OOBOOFILI
+07AC;N;THAANA EBEFILI
+07AD;N;THAANA EYBEYFILI
+07AE;N;THAANA OBOFILI
+07AF;N;THAANA OABOAFILI
+07B0;N;THAANA SUKUN
+0901;N;DEVANAGARI SIGN CANDRABINDU
+0902;N;DEVANAGARI SIGN ANUSVARA
+0903;N;DEVANAGARI SIGN VISARGA
+0905;N;DEVANAGARI LETTER A
+0906;N;DEVANAGARI LETTER AA
+0907;N;DEVANAGARI LETTER I
+0908;N;DEVANAGARI LETTER II
+0909;N;DEVANAGARI LETTER U
+090A;N;DEVANAGARI LETTER UU
+090B;N;DEVANAGARI LETTER VOCALIC R
+090C;N;DEVANAGARI LETTER VOCALIC L
+090D;N;DEVANAGARI LETTER CANDRA E
+090E;N;DEVANAGARI LETTER SHORT E
+090F;N;DEVANAGARI LETTER E
+0910;N;DEVANAGARI LETTER AI
+0911;N;DEVANAGARI LETTER CANDRA O
+0912;N;DEVANAGARI LETTER SHORT O
+0913;N;DEVANAGARI LETTER O
+0914;N;DEVANAGARI LETTER AU
+0915;N;DEVANAGARI LETTER KA
+0916;N;DEVANAGARI LETTER KHA
+0917;N;DEVANAGARI LETTER GA
+0918;N;DEVANAGARI LETTER GHA
+0919;N;DEVANAGARI LETTER NGA
+091A;N;DEVANAGARI LETTER CA
+091B;N;DEVANAGARI LETTER CHA
+091C;N;DEVANAGARI LETTER JA
+091D;N;DEVANAGARI LETTER JHA
+091E;N;DEVANAGARI LETTER NYA
+091F;N;DEVANAGARI LETTER TTA
+0920;N;DEVANAGARI LETTER TTHA
+0921;N;DEVANAGARI LETTER DDA
+0922;N;DEVANAGARI LETTER DDHA
+0923;N;DEVANAGARI LETTER NNA
+0924;N;DEVANAGARI LETTER TA
+0925;N;DEVANAGARI LETTER THA
+0926;N;DEVANAGARI LETTER DA
+0927;N;DEVANAGARI LETTER DHA
+0928;N;DEVANAGARI LETTER NA
+0929;N;DEVANAGARI LETTER NNNA
+092A;N;DEVANAGARI LETTER PA
+092B;N;DEVANAGARI LETTER PHA
+092C;N;DEVANAGARI LETTER BA
+092D;N;DEVANAGARI LETTER BHA
+092E;N;DEVANAGARI LETTER MA
+092F;N;DEVANAGARI LETTER YA
+0930;N;DEVANAGARI LETTER RA
+0931;N;DEVANAGARI LETTER RRA
+0932;N;DEVANAGARI LETTER LA
+0933;N;DEVANAGARI LETTER LLA
+0934;N;DEVANAGARI LETTER LLLA
+0935;N;DEVANAGARI LETTER VA
+0936;N;DEVANAGARI LETTER SHA
+0937;N;DEVANAGARI LETTER SSA
+0938;N;DEVANAGARI LETTER SA
+0939;N;DEVANAGARI LETTER HA
+093C;N;DEVANAGARI SIGN NUKTA
+093D;N;DEVANAGARI SIGN AVAGRAHA
+093E;N;DEVANAGARI VOWEL SIGN AA
+093F;N;DEVANAGARI VOWEL SIGN I
+0940;N;DEVANAGARI VOWEL SIGN II
+0941;N;DEVANAGARI VOWEL SIGN U
+0942;N;DEVANAGARI VOWEL SIGN UU
+0943;N;DEVANAGARI VOWEL SIGN VOCALIC R
+0944;N;DEVANAGARI VOWEL SIGN VOCALIC RR
+0945;N;DEVANAGARI VOWEL SIGN CANDRA E
+0946;N;DEVANAGARI VOWEL SIGN SHORT E
+0947;N;DEVANAGARI VOWEL SIGN E
+0948;N;DEVANAGARI VOWEL SIGN AI
+0949;N;DEVANAGARI VOWEL SIGN CANDRA O
+094A;N;DEVANAGARI VOWEL SIGN SHORT O
+094B;N;DEVANAGARI VOWEL SIGN O
+094C;N;DEVANAGARI VOWEL SIGN AU
+094D;N;DEVANAGARI SIGN VIRAMA
+0950;N;DEVANAGARI OM
+0951;N;DEVANAGARI STRESS SIGN UDATTA
+0952;N;DEVANAGARI STRESS SIGN ANUDATTA
+0953;N;DEVANAGARI GRAVE ACCENT
+0954;N;DEVANAGARI ACUTE ACCENT
+0958;N;DEVANAGARI LETTER QA
+0959;N;DEVANAGARI LETTER KHHA
+095A;N;DEVANAGARI LETTER GHHA
+095B;N;DEVANAGARI LETTER ZA
+095C;N;DEVANAGARI LETTER DDDHA
+095D;N;DEVANAGARI LETTER RHA
+095E;N;DEVANAGARI LETTER FA
+095F;N;DEVANAGARI LETTER YYA
+0960;N;DEVANAGARI LETTER VOCALIC RR
+0961;N;DEVANAGARI LETTER VOCALIC LL
+0962;N;DEVANAGARI VOWEL SIGN VOCALIC L
+0963;N;DEVANAGARI VOWEL SIGN VOCALIC LL
+0964;N;DEVANAGARI DANDA
+0965;N;DEVANAGARI DOUBLE DANDA
+0966;N;DEVANAGARI DIGIT ZERO
+0967;N;DEVANAGARI DIGIT ONE
+0968;N;DEVANAGARI DIGIT TWO
+0969;N;DEVANAGARI DIGIT THREE
+096A;N;DEVANAGARI DIGIT FOUR
+096B;N;DEVANAGARI DIGIT FIVE
+096C;N;DEVANAGARI DIGIT SIX
+096D;N;DEVANAGARI DIGIT SEVEN
+096E;N;DEVANAGARI DIGIT EIGHT
+096F;N;DEVANAGARI DIGIT NINE
+0970;N;DEVANAGARI ABBREVIATION SIGN
+0981;N;BENGALI SIGN CANDRABINDU
+0982;N;BENGALI SIGN ANUSVARA
+0983;N;BENGALI SIGN VISARGA
+0985;N;BENGALI LETTER A
+0986;N;BENGALI LETTER AA
+0987;N;BENGALI LETTER I
+0988;N;BENGALI LETTER II
+0989;N;BENGALI LETTER U
+098A;N;BENGALI LETTER UU
+098B;N;BENGALI LETTER VOCALIC R
+098C;N;BENGALI LETTER VOCALIC L
+098F;N;BENGALI LETTER E
+0990;N;BENGALI LETTER AI
+0993;N;BENGALI LETTER O
+0994;N;BENGALI LETTER AU
+0995;N;BENGALI LETTER KA
+0996;N;BENGALI LETTER KHA
+0997;N;BENGALI LETTER GA
+0998;N;BENGALI LETTER GHA
+0999;N;BENGALI LETTER NGA
+099A;N;BENGALI LETTER CA
+099B;N;BENGALI LETTER CHA
+099C;N;BENGALI LETTER JA
+099D;N;BENGALI LETTER JHA
+099E;N;BENGALI LETTER NYA
+099F;N;BENGALI LETTER TTA
+09A0;N;BENGALI LETTER TTHA
+09A1;N;BENGALI LETTER DDA
+09A2;N;BENGALI LETTER DDHA
+09A3;N;BENGALI LETTER NNA
+09A4;N;BENGALI LETTER TA
+09A5;N;BENGALI LETTER THA
+09A6;N;BENGALI LETTER DA
+09A7;N;BENGALI LETTER DHA
+09A8;N;BENGALI LETTER NA
+09AA;N;BENGALI LETTER PA
+09AB;N;BENGALI LETTER PHA
+09AC;N;BENGALI LETTER BA
+09AD;N;BENGALI LETTER BHA
+09AE;N;BENGALI LETTER MA
+09AF;N;BENGALI LETTER YA
+09B0;N;BENGALI LETTER RA
+09B2;N;BENGALI LETTER LA
+09B6;N;BENGALI LETTER SHA
+09B7;N;BENGALI LETTER SSA
+09B8;N;BENGALI LETTER SA
+09B9;N;BENGALI LETTER HA
+09BC;N;BENGALI SIGN NUKTA
+09BE;N;BENGALI VOWEL SIGN AA
+09BF;N;BENGALI VOWEL SIGN I
+09C0;N;BENGALI VOWEL SIGN II
+09C1;N;BENGALI VOWEL SIGN U
+09C2;N;BENGALI VOWEL SIGN UU
+09C3;N;BENGALI VOWEL SIGN VOCALIC R
+09C4;N;BENGALI VOWEL SIGN VOCALIC RR
+09C7;N;BENGALI VOWEL SIGN E
+09C8;N;BENGALI VOWEL SIGN AI
+09CB;N;BENGALI VOWEL SIGN O
+09CC;N;BENGALI VOWEL SIGN AU
+09CD;N;BENGALI SIGN VIRAMA
+09D7;N;BENGALI AU LENGTH MARK
+09DC;N;BENGALI LETTER RRA
+09DD;N;BENGALI LETTER RHA
+09DF;N;BENGALI LETTER YYA
+09E0;N;BENGALI LETTER VOCALIC RR
+09E1;N;BENGALI LETTER VOCALIC LL
+09E2;N;BENGALI VOWEL SIGN VOCALIC L
+09E3;N;BENGALI VOWEL SIGN VOCALIC LL
+09E6;N;BENGALI DIGIT ZERO
+09E7;N;BENGALI DIGIT ONE
+09E8;N;BENGALI DIGIT TWO
+09E9;N;BENGALI DIGIT THREE
+09EA;N;BENGALI DIGIT FOUR
+09EB;N;BENGALI DIGIT FIVE
+09EC;N;BENGALI DIGIT SIX
+09ED;N;BENGALI DIGIT SEVEN
+09EE;N;BENGALI DIGIT EIGHT
+09EF;N;BENGALI DIGIT NINE
+09F0;N;BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1;N;BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2;N;BENGALI RUPEE MARK
+09F3;N;BENGALI RUPEE SIGN
+09F4;N;BENGALI CURRENCY NUMERATOR ONE
+09F5;N;BENGALI CURRENCY NUMERATOR TWO
+09F6;N;BENGALI CURRENCY NUMERATOR THREE
+09F7;N;BENGALI CURRENCY NUMERATOR FOUR
+09F8;N;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9;N;BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA;N;BENGALI ISSHAR
+0A02;N;GURMUKHI SIGN BINDI
+0A05;N;GURMUKHI LETTER A
+0A06;N;GURMUKHI LETTER AA
+0A07;N;GURMUKHI LETTER I
+0A08;N;GURMUKHI LETTER II
+0A09;N;GURMUKHI LETTER U
+0A0A;N;GURMUKHI LETTER UU
+0A0F;N;GURMUKHI LETTER EE
+0A10;N;GURMUKHI LETTER AI
+0A13;N;GURMUKHI LETTER OO
+0A14;N;GURMUKHI LETTER AU
+0A15;N;GURMUKHI LETTER KA
+0A16;N;GURMUKHI LETTER KHA
+0A17;N;GURMUKHI LETTER GA
+0A18;N;GURMUKHI LETTER GHA
+0A19;N;GURMUKHI LETTER NGA
+0A1A;N;GURMUKHI LETTER CA
+0A1B;N;GURMUKHI LETTER CHA
+0A1C;N;GURMUKHI LETTER JA
+0A1D;N;GURMUKHI LETTER JHA
+0A1E;N;GURMUKHI LETTER NYA
+0A1F;N;GURMUKHI LETTER TTA
+0A20;N;GURMUKHI LETTER TTHA
+0A21;N;GURMUKHI LETTER DDA
+0A22;N;GURMUKHI LETTER DDHA
+0A23;N;GURMUKHI LETTER NNA
+0A24;N;GURMUKHI LETTER TA
+0A25;N;GURMUKHI LETTER THA
+0A26;N;GURMUKHI LETTER DA
+0A27;N;GURMUKHI LETTER DHA
+0A28;N;GURMUKHI LETTER NA
+0A2A;N;GURMUKHI LETTER PA
+0A2B;N;GURMUKHI LETTER PHA
+0A2C;N;GURMUKHI LETTER BA
+0A2D;N;GURMUKHI LETTER BHA
+0A2E;N;GURMUKHI LETTER MA
+0A2F;N;GURMUKHI LETTER YA
+0A30;N;GURMUKHI LETTER RA
+0A32;N;GURMUKHI LETTER LA
+0A33;N;GURMUKHI LETTER LLA
+0A35;N;GURMUKHI LETTER VA
+0A36;N;GURMUKHI LETTER SHA
+0A38;N;GURMUKHI LETTER SA
+0A39;N;GURMUKHI LETTER HA
+0A3C;N;GURMUKHI SIGN NUKTA
+0A3E;N;GURMUKHI VOWEL SIGN AA
+0A3F;N;GURMUKHI VOWEL SIGN I
+0A40;N;GURMUKHI VOWEL SIGN II
+0A41;N;GURMUKHI VOWEL SIGN U
+0A42;N;GURMUKHI VOWEL SIGN UU
+0A47;N;GURMUKHI VOWEL SIGN EE
+0A48;N;GURMUKHI VOWEL SIGN AI
+0A4B;N;GURMUKHI VOWEL SIGN OO
+0A4C;N;GURMUKHI VOWEL SIGN AU
+0A4D;N;GURMUKHI SIGN VIRAMA
+0A59;N;GURMUKHI LETTER KHHA
+0A5A;N;GURMUKHI LETTER GHHA
+0A5B;N;GURMUKHI LETTER ZA
+0A5C;N;GURMUKHI LETTER RRA
+0A5E;N;GURMUKHI LETTER FA
+0A66;N;GURMUKHI DIGIT ZERO
+0A67;N;GURMUKHI DIGIT ONE
+0A68;N;GURMUKHI DIGIT TWO
+0A69;N;GURMUKHI DIGIT THREE
+0A6A;N;GURMUKHI DIGIT FOUR
+0A6B;N;GURMUKHI DIGIT FIVE
+0A6C;N;GURMUKHI DIGIT SIX
+0A6D;N;GURMUKHI DIGIT SEVEN
+0A6E;N;GURMUKHI DIGIT EIGHT
+0A6F;N;GURMUKHI DIGIT NINE
+0A70;N;GURMUKHI TIPPI
+0A71;N;GURMUKHI ADDAK
+0A72;N;GURMUKHI IRI
+0A73;N;GURMUKHI URA
+0A74;N;GURMUKHI EK ONKAR
+0A81;N;GUJARATI SIGN CANDRABINDU
+0A82;N;GUJARATI SIGN ANUSVARA
+0A83;N;GUJARATI SIGN VISARGA
+0A85;N;GUJARATI LETTER A
+0A86;N;GUJARATI LETTER AA
+0A87;N;GUJARATI LETTER I
+0A88;N;GUJARATI LETTER II
+0A89;N;GUJARATI LETTER U
+0A8A;N;GUJARATI LETTER UU
+0A8B;N;GUJARATI LETTER VOCALIC R
+0A8D;N;GUJARATI VOWEL CANDRA E
+0A8F;N;GUJARATI LETTER E
+0A90;N;GUJARATI LETTER AI
+0A91;N;GUJARATI VOWEL CANDRA O
+0A93;N;GUJARATI LETTER O
+0A94;N;GUJARATI LETTER AU
+0A95;N;GUJARATI LETTER KA
+0A96;N;GUJARATI LETTER KHA
+0A97;N;GUJARATI LETTER GA
+0A98;N;GUJARATI LETTER GHA
+0A99;N;GUJARATI LETTER NGA
+0A9A;N;GUJARATI LETTER CA
+0A9B;N;GUJARATI LETTER CHA
+0A9C;N;GUJARATI LETTER JA
+0A9D;N;GUJARATI LETTER JHA
+0A9E;N;GUJARATI LETTER NYA
+0A9F;N;GUJARATI LETTER TTA
+0AA0;N;GUJARATI LETTER TTHA
+0AA1;N;GUJARATI LETTER DDA
+0AA2;N;GUJARATI LETTER DDHA
+0AA3;N;GUJARATI LETTER NNA
+0AA4;N;GUJARATI LETTER TA
+0AA5;N;GUJARATI LETTER THA
+0AA6;N;GUJARATI LETTER DA
+0AA7;N;GUJARATI LETTER DHA
+0AA8;N;GUJARATI LETTER NA
+0AAA;N;GUJARATI LETTER PA
+0AAB;N;GUJARATI LETTER PHA
+0AAC;N;GUJARATI LETTER BA
+0AAD;N;GUJARATI LETTER BHA
+0AAE;N;GUJARATI LETTER MA
+0AAF;N;GUJARATI LETTER YA
+0AB0;N;GUJARATI LETTER RA
+0AB2;N;GUJARATI LETTER LA
+0AB3;N;GUJARATI LETTER LLA
+0AB5;N;GUJARATI LETTER VA
+0AB6;N;GUJARATI LETTER SHA
+0AB7;N;GUJARATI LETTER SSA
+0AB8;N;GUJARATI LETTER SA
+0AB9;N;GUJARATI LETTER HA
+0ABC;N;GUJARATI SIGN NUKTA
+0ABD;N;GUJARATI SIGN AVAGRAHA
+0ABE;N;GUJARATI VOWEL SIGN AA
+0ABF;N;GUJARATI VOWEL SIGN I
+0AC0;N;GUJARATI VOWEL SIGN II
+0AC1;N;GUJARATI VOWEL SIGN U
+0AC2;N;GUJARATI VOWEL SIGN UU
+0AC3;N;GUJARATI VOWEL SIGN VOCALIC R
+0AC4;N;GUJARATI VOWEL SIGN VOCALIC RR
+0AC5;N;GUJARATI VOWEL SIGN CANDRA E
+0AC7;N;GUJARATI VOWEL SIGN E
+0AC8;N;GUJARATI VOWEL SIGN AI
+0AC9;N;GUJARATI VOWEL SIGN CANDRA O
+0ACB;N;GUJARATI VOWEL SIGN O
+0ACC;N;GUJARATI VOWEL SIGN AU
+0ACD;N;GUJARATI SIGN VIRAMA
+0AD0;N;GUJARATI OM
+0AE0;N;GUJARATI LETTER VOCALIC RR
+0AE6;N;GUJARATI DIGIT ZERO
+0AE7;N;GUJARATI DIGIT ONE
+0AE8;N;GUJARATI DIGIT TWO
+0AE9;N;GUJARATI DIGIT THREE
+0AEA;N;GUJARATI DIGIT FOUR
+0AEB;N;GUJARATI DIGIT FIVE
+0AEC;N;GUJARATI DIGIT SIX
+0AED;N;GUJARATI DIGIT SEVEN
+0AEE;N;GUJARATI DIGIT EIGHT
+0AEF;N;GUJARATI DIGIT NINE
+0B01;N;ORIYA SIGN CANDRABINDU
+0B02;N;ORIYA SIGN ANUSVARA
+0B03;N;ORIYA SIGN VISARGA
+0B05;N;ORIYA LETTER A
+0B06;N;ORIYA LETTER AA
+0B07;N;ORIYA LETTER I
+0B08;N;ORIYA LETTER II
+0B09;N;ORIYA LETTER U
+0B0A;N;ORIYA LETTER UU
+0B0B;N;ORIYA LETTER VOCALIC R
+0B0C;N;ORIYA LETTER VOCALIC L
+0B0F;N;ORIYA LETTER E
+0B10;N;ORIYA LETTER AI
+0B13;N;ORIYA LETTER O
+0B14;N;ORIYA LETTER AU
+0B15;N;ORIYA LETTER KA
+0B16;N;ORIYA LETTER KHA
+0B17;N;ORIYA LETTER GA
+0B18;N;ORIYA LETTER GHA
+0B19;N;ORIYA LETTER NGA
+0B1A;N;ORIYA LETTER CA
+0B1B;N;ORIYA LETTER CHA
+0B1C;N;ORIYA LETTER JA
+0B1D;N;ORIYA LETTER JHA
+0B1E;N;ORIYA LETTER NYA
+0B1F;N;ORIYA LETTER TTA
+0B20;N;ORIYA LETTER TTHA
+0B21;N;ORIYA LETTER DDA
+0B22;N;ORIYA LETTER DDHA
+0B23;N;ORIYA LETTER NNA
+0B24;N;ORIYA LETTER TA
+0B25;N;ORIYA LETTER THA
+0B26;N;ORIYA LETTER DA
+0B27;N;ORIYA LETTER DHA
+0B28;N;ORIYA LETTER NA
+0B2A;N;ORIYA LETTER PA
+0B2B;N;ORIYA LETTER PHA
+0B2C;N;ORIYA LETTER BA
+0B2D;N;ORIYA LETTER BHA
+0B2E;N;ORIYA LETTER MA
+0B2F;N;ORIYA LETTER YA
+0B30;N;ORIYA LETTER RA
+0B32;N;ORIYA LETTER LA
+0B33;N;ORIYA LETTER LLA
+0B36;N;ORIYA LETTER SHA
+0B37;N;ORIYA LETTER SSA
+0B38;N;ORIYA LETTER SA
+0B39;N;ORIYA LETTER HA
+0B3C;N;ORIYA SIGN NUKTA
+0B3D;N;ORIYA SIGN AVAGRAHA
+0B3E;N;ORIYA VOWEL SIGN AA
+0B3F;N;ORIYA VOWEL SIGN I
+0B40;N;ORIYA VOWEL SIGN II
+0B41;N;ORIYA VOWEL SIGN U
+0B42;N;ORIYA VOWEL SIGN UU
+0B43;N;ORIYA VOWEL SIGN VOCALIC R
+0B47;N;ORIYA VOWEL SIGN E
+0B48;N;ORIYA VOWEL SIGN AI
+0B4B;N;ORIYA VOWEL SIGN O
+0B4C;N;ORIYA VOWEL SIGN AU
+0B4D;N;ORIYA SIGN VIRAMA
+0B56;N;ORIYA AI LENGTH MARK
+0B57;N;ORIYA AU LENGTH MARK
+0B5C;N;ORIYA LETTER RRA
+0B5D;N;ORIYA LETTER RHA
+0B5F;N;ORIYA LETTER YYA
+0B60;N;ORIYA LETTER VOCALIC RR
+0B61;N;ORIYA LETTER VOCALIC LL
+0B66;N;ORIYA DIGIT ZERO
+0B67;N;ORIYA DIGIT ONE
+0B68;N;ORIYA DIGIT TWO
+0B69;N;ORIYA DIGIT THREE
+0B6A;N;ORIYA DIGIT FOUR
+0B6B;N;ORIYA DIGIT FIVE
+0B6C;N;ORIYA DIGIT SIX
+0B6D;N;ORIYA DIGIT SEVEN
+0B6E;N;ORIYA DIGIT EIGHT
+0B6F;N;ORIYA DIGIT NINE
+0B70;N;ORIYA ISSHAR
+0B82;N;TAMIL SIGN ANUSVARA
+0B83;N;TAMIL SIGN VISARGA
+0B85;N;TAMIL LETTER A
+0B86;N;TAMIL LETTER AA
+0B87;N;TAMIL LETTER I
+0B88;N;TAMIL LETTER II
+0B89;N;TAMIL LETTER U
+0B8A;N;TAMIL LETTER UU
+0B8E;N;TAMIL LETTER E
+0B8F;N;TAMIL LETTER EE
+0B90;N;TAMIL LETTER AI
+0B92;N;TAMIL LETTER O
+0B93;N;TAMIL LETTER OO
+0B94;N;TAMIL LETTER AU
+0B95;N;TAMIL LETTER KA
+0B99;N;TAMIL LETTER NGA
+0B9A;N;TAMIL LETTER CA
+0B9C;N;TAMIL LETTER JA
+0B9E;N;TAMIL LETTER NYA
+0B9F;N;TAMIL LETTER TTA
+0BA3;N;TAMIL LETTER NNA
+0BA4;N;TAMIL LETTER TA
+0BA8;N;TAMIL LETTER NA
+0BA9;N;TAMIL LETTER NNNA
+0BAA;N;TAMIL LETTER PA
+0BAE;N;TAMIL LETTER MA
+0BAF;N;TAMIL LETTER YA
+0BB0;N;TAMIL LETTER RA
+0BB1;N;TAMIL LETTER RRA
+0BB2;N;TAMIL LETTER LA
+0BB3;N;TAMIL LETTER LLA
+0BB4;N;TAMIL LETTER LLLA
+0BB5;N;TAMIL LETTER VA
+0BB7;N;TAMIL LETTER SSA
+0BB8;N;TAMIL LETTER SA
+0BB9;N;TAMIL LETTER HA
+0BBE;N;TAMIL VOWEL SIGN AA
+0BBF;N;TAMIL VOWEL SIGN I
+0BC0;N;TAMIL VOWEL SIGN II
+0BC1;N;TAMIL VOWEL SIGN U
+0BC2;N;TAMIL VOWEL SIGN UU
+0BC6;N;TAMIL VOWEL SIGN E
+0BC7;N;TAMIL VOWEL SIGN EE
+0BC8;N;TAMIL VOWEL SIGN AI
+0BCA;N;TAMIL VOWEL SIGN O
+0BCB;N;TAMIL VOWEL SIGN OO
+0BCC;N;TAMIL VOWEL SIGN AU
+0BCD;N;TAMIL SIGN VIRAMA
+0BD7;N;TAMIL AU LENGTH MARK
+0BE7;N;TAMIL DIGIT ONE
+0BE8;N;TAMIL DIGIT TWO
+0BE9;N;TAMIL DIGIT THREE
+0BEA;N;TAMIL DIGIT FOUR
+0BEB;N;TAMIL DIGIT FIVE
+0BEC;N;TAMIL DIGIT SIX
+0BED;N;TAMIL DIGIT SEVEN
+0BEE;N;TAMIL DIGIT EIGHT
+0BEF;N;TAMIL DIGIT NINE
+0BF0;N;TAMIL NUMBER TEN
+0BF1;N;TAMIL NUMBER ONE HUNDRED
+0BF2;N;TAMIL NUMBER ONE THOUSAND
+0C01;N;TELUGU SIGN CANDRABINDU
+0C02;N;TELUGU SIGN ANUSVARA
+0C03;N;TELUGU SIGN VISARGA
+0C05;N;TELUGU LETTER A
+0C06;N;TELUGU LETTER AA
+0C07;N;TELUGU LETTER I
+0C08;N;TELUGU LETTER II
+0C09;N;TELUGU LETTER U
+0C0A;N;TELUGU LETTER UU
+0C0B;N;TELUGU LETTER VOCALIC R
+0C0C;N;TELUGU LETTER VOCALIC L
+0C0E;N;TELUGU LETTER E
+0C0F;N;TELUGU LETTER EE
+0C10;N;TELUGU LETTER AI
+0C12;N;TELUGU LETTER O
+0C13;N;TELUGU LETTER OO
+0C14;N;TELUGU LETTER AU
+0C15;N;TELUGU LETTER KA
+0C16;N;TELUGU LETTER KHA
+0C17;N;TELUGU LETTER GA
+0C18;N;TELUGU LETTER GHA
+0C19;N;TELUGU LETTER NGA
+0C1A;N;TELUGU LETTER CA
+0C1B;N;TELUGU LETTER CHA
+0C1C;N;TELUGU LETTER JA
+0C1D;N;TELUGU LETTER JHA
+0C1E;N;TELUGU LETTER NYA
+0C1F;N;TELUGU LETTER TTA
+0C20;N;TELUGU LETTER TTHA
+0C21;N;TELUGU LETTER DDA
+0C22;N;TELUGU LETTER DDHA
+0C23;N;TELUGU LETTER NNA
+0C24;N;TELUGU LETTER TA
+0C25;N;TELUGU LETTER THA
+0C26;N;TELUGU LETTER DA
+0C27;N;TELUGU LETTER DHA
+0C28;N;TELUGU LETTER NA
+0C2A;N;TELUGU LETTER PA
+0C2B;N;TELUGU LETTER PHA
+0C2C;N;TELUGU LETTER BA
+0C2D;N;TELUGU LETTER BHA
+0C2E;N;TELUGU LETTER MA
+0C2F;N;TELUGU LETTER YA
+0C30;N;TELUGU LETTER RA
+0C31;N;TELUGU LETTER RRA
+0C32;N;TELUGU LETTER LA
+0C33;N;TELUGU LETTER LLA
+0C35;N;TELUGU LETTER VA
+0C36;N;TELUGU LETTER SHA
+0C37;N;TELUGU LETTER SSA
+0C38;N;TELUGU LETTER SA
+0C39;N;TELUGU LETTER HA
+0C3E;N;TELUGU VOWEL SIGN AA
+0C3F;N;TELUGU VOWEL SIGN I
+0C40;N;TELUGU VOWEL SIGN II
+0C41;N;TELUGU VOWEL SIGN U
+0C42;N;TELUGU VOWEL SIGN UU
+0C43;N;TELUGU VOWEL SIGN VOCALIC R
+0C44;N;TELUGU VOWEL SIGN VOCALIC RR
+0C46;N;TELUGU VOWEL SIGN E
+0C47;N;TELUGU VOWEL SIGN EE
+0C48;N;TELUGU VOWEL SIGN AI
+0C4A;N;TELUGU VOWEL SIGN O
+0C4B;N;TELUGU VOWEL SIGN OO
+0C4C;N;TELUGU VOWEL SIGN AU
+0C4D;N;TELUGU SIGN VIRAMA
+0C55;N;TELUGU LENGTH MARK
+0C56;N;TELUGU AI LENGTH MARK
+0C60;N;TELUGU LETTER VOCALIC RR
+0C61;N;TELUGU LETTER VOCALIC LL
+0C66;N;TELUGU DIGIT ZERO
+0C67;N;TELUGU DIGIT ONE
+0C68;N;TELUGU DIGIT TWO
+0C69;N;TELUGU DIGIT THREE
+0C6A;N;TELUGU DIGIT FOUR
+0C6B;N;TELUGU DIGIT FIVE
+0C6C;N;TELUGU DIGIT SIX
+0C6D;N;TELUGU DIGIT SEVEN
+0C6E;N;TELUGU DIGIT EIGHT
+0C6F;N;TELUGU DIGIT NINE
+0C82;N;KANNADA SIGN ANUSVARA
+0C83;N;KANNADA SIGN VISARGA
+0C85;N;KANNADA LETTER A
+0C86;N;KANNADA LETTER AA
+0C87;N;KANNADA LETTER I
+0C88;N;KANNADA LETTER II
+0C89;N;KANNADA LETTER U
+0C8A;N;KANNADA LETTER UU
+0C8B;N;KANNADA LETTER VOCALIC R
+0C8C;N;KANNADA LETTER VOCALIC L
+0C8E;N;KANNADA LETTER E
+0C8F;N;KANNADA LETTER EE
+0C90;N;KANNADA LETTER AI
+0C92;N;KANNADA LETTER O
+0C93;N;KANNADA LETTER OO
+0C94;N;KANNADA LETTER AU
+0C95;N;KANNADA LETTER KA
+0C96;N;KANNADA LETTER KHA
+0C97;N;KANNADA LETTER GA
+0C98;N;KANNADA LETTER GHA
+0C99;N;KANNADA LETTER NGA
+0C9A;N;KANNADA LETTER CA
+0C9B;N;KANNADA LETTER CHA
+0C9C;N;KANNADA LETTER JA
+0C9D;N;KANNADA LETTER JHA
+0C9E;N;KANNADA LETTER NYA
+0C9F;N;KANNADA LETTER TTA
+0CA0;N;KANNADA LETTER TTHA
+0CA1;N;KANNADA LETTER DDA
+0CA2;N;KANNADA LETTER DDHA
+0CA3;N;KANNADA LETTER NNA
+0CA4;N;KANNADA LETTER TA
+0CA5;N;KANNADA LETTER THA
+0CA6;N;KANNADA LETTER DA
+0CA7;N;KANNADA LETTER DHA
+0CA8;N;KANNADA LETTER NA
+0CAA;N;KANNADA LETTER PA
+0CAB;N;KANNADA LETTER PHA
+0CAC;N;KANNADA LETTER BA
+0CAD;N;KANNADA LETTER BHA
+0CAE;N;KANNADA LETTER MA
+0CAF;N;KANNADA LETTER YA
+0CB0;N;KANNADA LETTER RA
+0CB1;N;KANNADA LETTER RRA
+0CB2;N;KANNADA LETTER LA
+0CB3;N;KANNADA LETTER LLA
+0CB5;N;KANNADA LETTER VA
+0CB6;N;KANNADA LETTER SHA
+0CB7;N;KANNADA LETTER SSA
+0CB8;N;KANNADA LETTER SA
+0CB9;N;KANNADA LETTER HA
+0CBE;N;KANNADA VOWEL SIGN AA
+0CBF;N;KANNADA VOWEL SIGN I
+0CC0;N;KANNADA VOWEL SIGN II
+0CC1;N;KANNADA VOWEL SIGN U
+0CC2;N;KANNADA VOWEL SIGN UU
+0CC3;N;KANNADA VOWEL SIGN VOCALIC R
+0CC4;N;KANNADA VOWEL SIGN VOCALIC RR
+0CC6;N;KANNADA VOWEL SIGN E
+0CC7;N;KANNADA VOWEL SIGN EE
+0CC8;N;KANNADA VOWEL SIGN AI
+0CCA;N;KANNADA VOWEL SIGN O
+0CCB;N;KANNADA VOWEL SIGN OO
+0CCC;N;KANNADA VOWEL SIGN AU
+0CCD;N;KANNADA SIGN VIRAMA
+0CD5;N;KANNADA LENGTH MARK
+0CD6;N;KANNADA AI LENGTH MARK
+0CDE;N;KANNADA LETTER FA
+0CE0;N;KANNADA LETTER VOCALIC RR
+0CE1;N;KANNADA LETTER VOCALIC LL
+0CE6;N;KANNADA DIGIT ZERO
+0CE7;N;KANNADA DIGIT ONE
+0CE8;N;KANNADA DIGIT TWO
+0CE9;N;KANNADA DIGIT THREE
+0CEA;N;KANNADA DIGIT FOUR
+0CEB;N;KANNADA DIGIT FIVE
+0CEC;N;KANNADA DIGIT SIX
+0CED;N;KANNADA DIGIT SEVEN
+0CEE;N;KANNADA DIGIT EIGHT
+0CEF;N;KANNADA DIGIT NINE
+0D02;N;MALAYALAM SIGN ANUSVARA
+0D03;N;MALAYALAM SIGN VISARGA
+0D05;N;MALAYALAM LETTER A
+0D06;N;MALAYALAM LETTER AA
+0D07;N;MALAYALAM LETTER I
+0D08;N;MALAYALAM LETTER II
+0D09;N;MALAYALAM LETTER U
+0D0A;N;MALAYALAM LETTER UU
+0D0B;N;MALAYALAM LETTER VOCALIC R
+0D0C;N;MALAYALAM LETTER VOCALIC L
+0D0E;N;MALAYALAM LETTER E
+0D0F;N;MALAYALAM LETTER EE
+0D10;N;MALAYALAM LETTER AI
+0D12;N;MALAYALAM LETTER O
+0D13;N;MALAYALAM LETTER OO
+0D14;N;MALAYALAM LETTER AU
+0D15;N;MALAYALAM LETTER KA
+0D16;N;MALAYALAM LETTER KHA
+0D17;N;MALAYALAM LETTER GA
+0D18;N;MALAYALAM LETTER GHA
+0D19;N;MALAYALAM LETTER NGA
+0D1A;N;MALAYALAM LETTER CA
+0D1B;N;MALAYALAM LETTER CHA
+0D1C;N;MALAYALAM LETTER JA
+0D1D;N;MALAYALAM LETTER JHA
+0D1E;N;MALAYALAM LETTER NYA
+0D1F;N;MALAYALAM LETTER TTA
+0D20;N;MALAYALAM LETTER TTHA
+0D21;N;MALAYALAM LETTER DDA
+0D22;N;MALAYALAM LETTER DDHA
+0D23;N;MALAYALAM LETTER NNA
+0D24;N;MALAYALAM LETTER TA
+0D25;N;MALAYALAM LETTER THA
+0D26;N;MALAYALAM LETTER DA
+0D27;N;MALAYALAM LETTER DHA
+0D28;N;MALAYALAM LETTER NA
+0D2A;N;MALAYALAM LETTER PA
+0D2B;N;MALAYALAM LETTER PHA
+0D2C;N;MALAYALAM LETTER BA
+0D2D;N;MALAYALAM LETTER BHA
+0D2E;N;MALAYALAM LETTER MA
+0D2F;N;MALAYALAM LETTER YA
+0D30;N;MALAYALAM LETTER RA
+0D31;N;MALAYALAM LETTER RRA
+0D32;N;MALAYALAM LETTER LA
+0D33;N;MALAYALAM LETTER LLA
+0D34;N;MALAYALAM LETTER LLLA
+0D35;N;MALAYALAM LETTER VA
+0D36;N;MALAYALAM LETTER SHA
+0D37;N;MALAYALAM LETTER SSA
+0D38;N;MALAYALAM LETTER SA
+0D39;N;MALAYALAM LETTER HA
+0D3E;N;MALAYALAM VOWEL SIGN AA
+0D3F;N;MALAYALAM VOWEL SIGN I
+0D40;N;MALAYALAM VOWEL SIGN II
+0D41;N;MALAYALAM VOWEL SIGN U
+0D42;N;MALAYALAM VOWEL SIGN UU
+0D43;N;MALAYALAM VOWEL SIGN VOCALIC R
+0D46;N;MALAYALAM VOWEL SIGN E
+0D47;N;MALAYALAM VOWEL SIGN EE
+0D48;N;MALAYALAM VOWEL SIGN AI
+0D4A;N;MALAYALAM VOWEL SIGN O
+0D4B;N;MALAYALAM VOWEL SIGN OO
+0D4C;N;MALAYALAM VOWEL SIGN AU
+0D4D;N;MALAYALAM SIGN VIRAMA
+0D57;N;MALAYALAM AU LENGTH MARK
+0D60;N;MALAYALAM LETTER VOCALIC RR
+0D61;N;MALAYALAM LETTER VOCALIC LL
+0D66;N;MALAYALAM DIGIT ZERO
+0D67;N;MALAYALAM DIGIT ONE
+0D68;N;MALAYALAM DIGIT TWO
+0D69;N;MALAYALAM DIGIT THREE
+0D6A;N;MALAYALAM DIGIT FOUR
+0D6B;N;MALAYALAM DIGIT FIVE
+0D6C;N;MALAYALAM DIGIT SIX
+0D6D;N;MALAYALAM DIGIT SEVEN
+0D6E;N;MALAYALAM DIGIT EIGHT
+0D6F;N;MALAYALAM DIGIT NINE
+0D82;N;SINHALA SIGN ANUSVARAYA
+0D83;N;SINHALA SIGN VISARGAYA
+0D85;N;SINHALA LETTER AYANNA
+0D86;N;SINHALA LETTER AAYANNA
+0D87;N;SINHALA LETTER AEYANNA
+0D88;N;SINHALA LETTER AEEYANNA
+0D89;N;SINHALA LETTER IYANNA
+0D8A;N;SINHALA LETTER IIYANNA
+0D8B;N;SINHALA LETTER UYANNA
+0D8C;N;SINHALA LETTER UUYANNA
+0D8D;N;SINHALA LETTER IRUYANNA
+0D8E;N;SINHALA LETTER IRUUYANNA
+0D8F;N;SINHALA LETTER ILUYANNA
+0D90;N;SINHALA LETTER ILUUYANNA
+0D91;N;SINHALA LETTER EYANNA
+0D92;N;SINHALA LETTER EEYANNA
+0D93;N;SINHALA LETTER AIYANNA
+0D94;N;SINHALA LETTER OYANNA
+0D95;N;SINHALA LETTER OOYANNA
+0D96;N;SINHALA LETTER AUYANNA
+0D9A;N;SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B;N;SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C;N;SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D;N;SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E;N;SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F;N;SINHALA LETTER SANYAKA GAYANNA
+0DA0;N;SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1;N;SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2;N;SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3;N;SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4;N;SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5;N;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6;N;SINHALA LETTER SANYAKA JAYANNA
+0DA7;N;SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8;N;SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9;N;SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA;N;SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB;N;SINHALA LETTER MUURDHAJA NAYANNA
+0DAC;N;SINHALA LETTER SANYAKA DDAYANNA
+0DAD;N;SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE;N;SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF;N;SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0;N;SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1;N;SINHALA LETTER DANTAJA NAYANNA
+0DB3;N;SINHALA LETTER SANYAKA DAYANNA
+0DB4;N;SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5;N;SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6;N;SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7;N;SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8;N;SINHALA LETTER MAYANNA
+0DB9;N;SINHALA LETTER AMBA BAYANNA
+0DBA;N;SINHALA LETTER YAYANNA
+0DBB;N;SINHALA LETTER RAYANNA
+0DBD;N;SINHALA LETTER DANTAJA LAYANNA
+0DC0;N;SINHALA LETTER VAYANNA
+0DC1;N;SINHALA LETTER TAALUJA SAYANNA
+0DC2;N;SINHALA LETTER MUURDHAJA SAYANNA
+0DC3;N;SINHALA LETTER DANTAJA SAYANNA
+0DC4;N;SINHALA LETTER HAYANNA
+0DC5;N;SINHALA LETTER MUURDHAJA LAYANNA
+0DC6;N;SINHALA LETTER FAYANNA
+0DCA;N;SINHALA SIGN AL-LAKUNA
+0DCF;N;SINHALA VOWEL SIGN AELA-PILLA
+0DD0;N;SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1;N;SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2;N;SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3;N;SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4;N;SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6;N;SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8;N;SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9;N;SINHALA VOWEL SIGN KOMBUVA
+0DDA;N;SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB;N;SINHALA VOWEL SIGN KOMBU DEKA
+0DDC;N;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD;N;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE;N;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF;N;SINHALA VOWEL SIGN GAYANUKITTA
+0DF2;N;SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3;N;SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4;N;SINHALA PUNCTUATION KUNDDALIYA
+0E01;N;THAI CHARACTER KO KAI
+0E02;N;THAI CHARACTER KHO KHAI
+0E03;N;THAI CHARACTER KHO KHUAT
+0E04;N;THAI CHARACTER KHO KHWAI
+0E05;N;THAI CHARACTER KHO KHON
+0E06;N;THAI CHARACTER KHO RAKHANG
+0E07;N;THAI CHARACTER NGO NGU
+0E08;N;THAI CHARACTER CHO CHAN
+0E09;N;THAI CHARACTER CHO CHING
+0E0A;N;THAI CHARACTER CHO CHANG
+0E0B;N;THAI CHARACTER SO SO
+0E0C;N;THAI CHARACTER CHO CHOE
+0E0D;N;THAI CHARACTER YO YING
+0E0E;N;THAI CHARACTER DO CHADA
+0E0F;N;THAI CHARACTER TO PATAK
+0E10;N;THAI CHARACTER THO THAN
+0E11;N;THAI CHARACTER THO NANGMONTHO
+0E12;N;THAI CHARACTER THO PHUTHAO
+0E13;N;THAI CHARACTER NO NEN
+0E14;N;THAI CHARACTER DO DEK
+0E15;N;THAI CHARACTER TO TAO
+0E16;N;THAI CHARACTER THO THUNG
+0E17;N;THAI CHARACTER THO THAHAN
+0E18;N;THAI CHARACTER THO THONG
+0E19;N;THAI CHARACTER NO NU
+0E1A;N;THAI CHARACTER BO BAIMAI
+0E1B;N;THAI CHARACTER PO PLA
+0E1C;N;THAI CHARACTER PHO PHUNG
+0E1D;N;THAI CHARACTER FO FA
+0E1E;N;THAI CHARACTER PHO PHAN
+0E1F;N;THAI CHARACTER FO FAN
+0E20;N;THAI CHARACTER PHO SAMPHAO
+0E21;N;THAI CHARACTER MO MA
+0E22;N;THAI CHARACTER YO YAK
+0E23;N;THAI CHARACTER RO RUA
+0E24;N;THAI CHARACTER RU
+0E25;N;THAI CHARACTER LO LING
+0E26;N;THAI CHARACTER LU
+0E27;N;THAI CHARACTER WO WAEN
+0E28;N;THAI CHARACTER SO SALA
+0E29;N;THAI CHARACTER SO RUSI
+0E2A;N;THAI CHARACTER SO SUA
+0E2B;N;THAI CHARACTER HO HIP
+0E2C;N;THAI CHARACTER LO CHULA
+0E2D;N;THAI CHARACTER O ANG
+0E2E;N;THAI CHARACTER HO NOKHUK
+0E2F;N;THAI CHARACTER PAIYANNOI
+0E30;N;THAI CHARACTER SARA A
+0E31;N;THAI CHARACTER MAI HAN-AKAT
+0E32;N;THAI CHARACTER SARA AA
+0E33;N;THAI CHARACTER SARA AM
+0E34;N;THAI CHARACTER SARA I
+0E35;N;THAI CHARACTER SARA II
+0E36;N;THAI CHARACTER SARA UE
+0E37;N;THAI CHARACTER SARA UEE
+0E38;N;THAI CHARACTER SARA U
+0E39;N;THAI CHARACTER SARA UU
+0E3A;N;THAI CHARACTER PHINTHU
+0E3F;N;THAI CURRENCY SYMBOL BAHT
+0E40;N;THAI CHARACTER SARA E
+0E41;N;THAI CHARACTER SARA AE
+0E42;N;THAI CHARACTER SARA O
+0E43;N;THAI CHARACTER SARA AI MAIMUAN
+0E44;N;THAI CHARACTER SARA AI MAIMALAI
+0E45;N;THAI CHARACTER LAKKHANGYAO
+0E46;N;THAI CHARACTER MAIYAMOK
+0E47;N;THAI CHARACTER MAITAIKHU
+0E48;N;THAI CHARACTER MAI EK
+0E49;N;THAI CHARACTER MAI THO
+0E4A;N;THAI CHARACTER MAI TRI
+0E4B;N;THAI CHARACTER MAI CHATTAWA
+0E4C;N;THAI CHARACTER THANTHAKHAT
+0E4D;N;THAI CHARACTER NIKHAHIT
+0E4E;N;THAI CHARACTER YAMAKKAN
+0E4F;N;THAI CHARACTER FONGMAN
+0E50;N;THAI DIGIT ZERO
+0E51;N;THAI DIGIT ONE
+0E52;N;THAI DIGIT TWO
+0E53;N;THAI DIGIT THREE
+0E54;N;THAI DIGIT FOUR
+0E55;N;THAI DIGIT FIVE
+0E56;N;THAI DIGIT SIX
+0E57;N;THAI DIGIT SEVEN
+0E58;N;THAI DIGIT EIGHT
+0E59;N;THAI DIGIT NINE
+0E5A;N;THAI CHARACTER ANGKHANKHU
+0E5B;N;THAI CHARACTER KHOMUT
+0E81;N;LAO LETTER KO
+0E82;N;LAO LETTER KHO SUNG
+0E84;N;LAO LETTER KHO TAM
+0E87;N;LAO LETTER NGO
+0E88;N;LAO LETTER CO
+0E8A;N;LAO LETTER SO TAM
+0E8D;N;LAO LETTER NYO
+0E94;N;LAO LETTER DO
+0E95;N;LAO LETTER TO
+0E96;N;LAO LETTER THO SUNG
+0E97;N;LAO LETTER THO TAM
+0E99;N;LAO LETTER NO
+0E9A;N;LAO LETTER BO
+0E9B;N;LAO LETTER PO
+0E9C;N;LAO LETTER PHO SUNG
+0E9D;N;LAO LETTER FO TAM
+0E9E;N;LAO LETTER PHO TAM
+0E9F;N;LAO LETTER FO SUNG
+0EA1;N;LAO LETTER MO
+0EA2;N;LAO LETTER YO
+0EA3;N;LAO LETTER LO LING
+0EA5;N;LAO LETTER LO LOOT
+0EA7;N;LAO LETTER WO
+0EAA;N;LAO LETTER SO SUNG
+0EAB;N;LAO LETTER HO SUNG
+0EAD;N;LAO LETTER O
+0EAE;N;LAO LETTER HO TAM
+0EAF;N;LAO ELLIPSIS
+0EB0;N;LAO VOWEL SIGN A
+0EB1;N;LAO VOWEL SIGN MAI KAN
+0EB2;N;LAO VOWEL SIGN AA
+0EB3;N;LAO VOWEL SIGN AM
+0EB4;N;LAO VOWEL SIGN I
+0EB5;N;LAO VOWEL SIGN II
+0EB6;N;LAO VOWEL SIGN Y
+0EB7;N;LAO VOWEL SIGN YY
+0EB8;N;LAO VOWEL SIGN U
+0EB9;N;LAO VOWEL SIGN UU
+0EBB;N;LAO VOWEL SIGN MAI KON
+0EBC;N;LAO SEMIVOWEL SIGN LO
+0EBD;N;LAO SEMIVOWEL SIGN NYO
+0EC0;N;LAO VOWEL SIGN E
+0EC1;N;LAO VOWEL SIGN EI
+0EC2;N;LAO VOWEL SIGN O
+0EC3;N;LAO VOWEL SIGN AY
+0EC4;N;LAO VOWEL SIGN AI
+0EC6;N;LAO KO LA
+0EC8;N;LAO TONE MAI EK
+0EC9;N;LAO TONE MAI THO
+0ECA;N;LAO TONE MAI TI
+0ECB;N;LAO TONE MAI CATAWA
+0ECC;N;LAO CANCELLATION MARK
+0ECD;N;LAO NIGGAHITA
+0ED0;N;LAO DIGIT ZERO
+0ED1;N;LAO DIGIT ONE
+0ED2;N;LAO DIGIT TWO
+0ED3;N;LAO DIGIT THREE
+0ED4;N;LAO DIGIT FOUR
+0ED5;N;LAO DIGIT FIVE
+0ED6;N;LAO DIGIT SIX
+0ED7;N;LAO DIGIT SEVEN
+0ED8;N;LAO DIGIT EIGHT
+0ED9;N;LAO DIGIT NINE
+0EDC;N;LAO HO NO
+0EDD;N;LAO HO MO
+0F00;N;TIBETAN SYLLABLE OM
+0F01;N;TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02;N;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03;N;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04;N;TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05;N;TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06;N;TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07;N;TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08;N;TIBETAN MARK SBRUL SHAD
+0F09;N;TIBETAN MARK BSKUR YIG MGO
+0F0A;N;TIBETAN MARK BKA- SHOG YIG MGO
+0F0B;N;TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C;N;TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D;N;TIBETAN MARK SHAD
+0F0E;N;TIBETAN MARK NYIS SHAD
+0F0F;N;TIBETAN MARK TSHEG SHAD
+0F10;N;TIBETAN MARK NYIS TSHEG SHAD
+0F11;N;TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12;N;TIBETAN MARK RGYA GRAM SHAD
+0F13;N;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14;N;TIBETAN MARK GTER TSHEG
+0F15;N;TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16;N;TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17;N;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18;N;TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19;N;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A;N;TIBETAN SIGN RDEL DKAR GCIG
+0F1B;N;TIBETAN SIGN RDEL DKAR GNYIS
+0F1C;N;TIBETAN SIGN RDEL DKAR GSUM
+0F1D;N;TIBETAN SIGN RDEL NAG GCIG
+0F1E;N;TIBETAN SIGN RDEL NAG GNYIS
+0F1F;N;TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20;N;TIBETAN DIGIT ZERO
+0F21;N;TIBETAN DIGIT ONE
+0F22;N;TIBETAN DIGIT TWO
+0F23;N;TIBETAN DIGIT THREE
+0F24;N;TIBETAN DIGIT FOUR
+0F25;N;TIBETAN DIGIT FIVE
+0F26;N;TIBETAN DIGIT SIX
+0F27;N;TIBETAN DIGIT SEVEN
+0F28;N;TIBETAN DIGIT EIGHT
+0F29;N;TIBETAN DIGIT NINE
+0F2A;N;TIBETAN DIGIT HALF ONE
+0F2B;N;TIBETAN DIGIT HALF TWO
+0F2C;N;TIBETAN DIGIT HALF THREE
+0F2D;N;TIBETAN DIGIT HALF FOUR
+0F2E;N;TIBETAN DIGIT HALF FIVE
+0F2F;N;TIBETAN DIGIT HALF SIX
+0F30;N;TIBETAN DIGIT HALF SEVEN
+0F31;N;TIBETAN DIGIT HALF EIGHT
+0F32;N;TIBETAN DIGIT HALF NINE
+0F33;N;TIBETAN DIGIT HALF ZERO
+0F34;N;TIBETAN MARK BSDUS RTAGS
+0F35;N;TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36;N;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37;N;TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38;N;TIBETAN MARK CHE MGO
+0F39;N;TIBETAN MARK TSA -PHRU
+0F3A;N;TIBETAN MARK GUG RTAGS GYON
+0F3B;N;TIBETAN MARK GUG RTAGS GYAS
+0F3C;N;TIBETAN MARK ANG KHANG GYON
+0F3D;N;TIBETAN MARK ANG KHANG GYAS
+0F3E;N;TIBETAN SIGN YAR TSHES
+0F3F;N;TIBETAN SIGN MAR TSHES
+0F40;N;TIBETAN LETTER KA
+0F41;N;TIBETAN LETTER KHA
+0F42;N;TIBETAN LETTER GA
+0F43;N;TIBETAN LETTER GHA
+0F44;N;TIBETAN LETTER NGA
+0F45;N;TIBETAN LETTER CA
+0F46;N;TIBETAN LETTER CHA
+0F47;N;TIBETAN LETTER JA
+0F49;N;TIBETAN LETTER NYA
+0F4A;N;TIBETAN LETTER TTA
+0F4B;N;TIBETAN LETTER TTHA
+0F4C;N;TIBETAN LETTER DDA
+0F4D;N;TIBETAN LETTER DDHA
+0F4E;N;TIBETAN LETTER NNA
+0F4F;N;TIBETAN LETTER TA
+0F50;N;TIBETAN LETTER THA
+0F51;N;TIBETAN LETTER DA
+0F52;N;TIBETAN LETTER DHA
+0F53;N;TIBETAN LETTER NA
+0F54;N;TIBETAN LETTER PA
+0F55;N;TIBETAN LETTER PHA
+0F56;N;TIBETAN LETTER BA
+0F57;N;TIBETAN LETTER BHA
+0F58;N;TIBETAN LETTER MA
+0F59;N;TIBETAN LETTER TSA
+0F5A;N;TIBETAN LETTER TSHA
+0F5B;N;TIBETAN LETTER DZA
+0F5C;N;TIBETAN LETTER DZHA
+0F5D;N;TIBETAN LETTER WA
+0F5E;N;TIBETAN LETTER ZHA
+0F5F;N;TIBETAN LETTER ZA
+0F60;N;TIBETAN LETTER -A
+0F61;N;TIBETAN LETTER YA
+0F62;N;TIBETAN LETTER RA
+0F63;N;TIBETAN LETTER LA
+0F64;N;TIBETAN LETTER SHA
+0F65;N;TIBETAN LETTER SSA
+0F66;N;TIBETAN LETTER SA
+0F67;N;TIBETAN LETTER HA
+0F68;N;TIBETAN LETTER A
+0F69;N;TIBETAN LETTER KSSA
+0F6A;N;TIBETAN LETTER FIXED-FORM RA
+0F71;N;TIBETAN VOWEL SIGN AA
+0F72;N;TIBETAN VOWEL SIGN I
+0F73;N;TIBETAN VOWEL SIGN II
+0F74;N;TIBETAN VOWEL SIGN U
+0F75;N;TIBETAN VOWEL SIGN UU
+0F76;N;TIBETAN VOWEL SIGN VOCALIC R
+0F77;N;TIBETAN VOWEL SIGN VOCALIC RR
+0F78;N;TIBETAN VOWEL SIGN VOCALIC L
+0F79;N;TIBETAN VOWEL SIGN VOCALIC LL
+0F7A;N;TIBETAN VOWEL SIGN E
+0F7B;N;TIBETAN VOWEL SIGN EE
+0F7C;N;TIBETAN VOWEL SIGN O
+0F7D;N;TIBETAN VOWEL SIGN OO
+0F7E;N;TIBETAN SIGN RJES SU NGA RO
+0F7F;N;TIBETAN SIGN RNAM BCAD
+0F80;N;TIBETAN VOWEL SIGN REVERSED I
+0F81;N;TIBETAN VOWEL SIGN REVERSED II
+0F82;N;TIBETAN SIGN NYI ZLA NAA DA
+0F83;N;TIBETAN SIGN SNA LDAN
+0F84;N;TIBETAN MARK HALANTA
+0F85;N;TIBETAN MARK PALUTA
+0F86;N;TIBETAN SIGN LCI RTAGS
+0F87;N;TIBETAN SIGN YANG RTAGS
+0F88;N;TIBETAN SIGN LCE TSA CAN
+0F89;N;TIBETAN SIGN MCHU CAN
+0F8A;N;TIBETAN SIGN GRU CAN RGYINGS
+0F8B;N;TIBETAN SIGN GRU MED RGYINGS
+0F90;N;TIBETAN SUBJOINED LETTER KA
+0F91;N;TIBETAN SUBJOINED LETTER KHA
+0F92;N;TIBETAN SUBJOINED LETTER GA
+0F93;N;TIBETAN SUBJOINED LETTER GHA
+0F94;N;TIBETAN SUBJOINED LETTER NGA
+0F95;N;TIBETAN SUBJOINED LETTER CA
+0F96;N;TIBETAN SUBJOINED LETTER CHA
+0F97;N;TIBETAN SUBJOINED LETTER JA
+0F99;N;TIBETAN SUBJOINED LETTER NYA
+0F9A;N;TIBETAN SUBJOINED LETTER TTA
+0F9B;N;TIBETAN SUBJOINED LETTER TTHA
+0F9C;N;TIBETAN SUBJOINED LETTER DDA
+0F9D;N;TIBETAN SUBJOINED LETTER DDHA
+0F9E;N;TIBETAN SUBJOINED LETTER NNA
+0F9F;N;TIBETAN SUBJOINED LETTER TA
+0FA0;N;TIBETAN SUBJOINED LETTER THA
+0FA1;N;TIBETAN SUBJOINED LETTER DA
+0FA2;N;TIBETAN SUBJOINED LETTER DHA
+0FA3;N;TIBETAN SUBJOINED LETTER NA
+0FA4;N;TIBETAN SUBJOINED LETTER PA
+0FA5;N;TIBETAN SUBJOINED LETTER PHA
+0FA6;N;TIBETAN SUBJOINED LETTER BA
+0FA7;N;TIBETAN SUBJOINED LETTER BHA
+0FA8;N;TIBETAN SUBJOINED LETTER MA
+0FA9;N;TIBETAN SUBJOINED LETTER TSA
+0FAA;N;TIBETAN SUBJOINED LETTER TSHA
+0FAB;N;TIBETAN SUBJOINED LETTER DZA
+0FAC;N;TIBETAN SUBJOINED LETTER DZHA
+0FAD;N;TIBETAN SUBJOINED LETTER WA
+0FAE;N;TIBETAN SUBJOINED LETTER ZHA
+0FAF;N;TIBETAN SUBJOINED LETTER ZA
+0FB0;N;TIBETAN SUBJOINED LETTER -A
+0FB1;N;TIBETAN SUBJOINED LETTER YA
+0FB2;N;TIBETAN SUBJOINED LETTER RA
+0FB3;N;TIBETAN SUBJOINED LETTER LA
+0FB4;N;TIBETAN SUBJOINED LETTER SHA
+0FB5;N;TIBETAN SUBJOINED LETTER SSA
+0FB6;N;TIBETAN SUBJOINED LETTER SA
+0FB7;N;TIBETAN SUBJOINED LETTER HA
+0FB8;N;TIBETAN SUBJOINED LETTER A
+0FB9;N;TIBETAN SUBJOINED LETTER KSSA
+0FBA;N;TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB;N;TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC;N;TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE;N;TIBETAN KU RU KHA
+0FBF;N;TIBETAN KU RU KHA BZHI MIG CAN
+0FC0;N;TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1;N;TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2;N;TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3;N;TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4;N;TIBETAN SYMBOL DRIL BU
+0FC5;N;TIBETAN SYMBOL RDO RJE
+0FC6;N;TIBETAN SYMBOL PADMA GDAN
+0FC7;N;TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8;N;TIBETAN SYMBOL PHUR PA
+0FC9;N;TIBETAN SYMBOL NOR BU
+0FCA;N;TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB;N;TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC;N;TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF;N;TIBETAN SIGN RDEL NAG GSUM
+1000;N;MYANMAR LETTER KA
+1001;N;MYANMAR LETTER KHA
+1002;N;MYANMAR LETTER GA
+1003;N;MYANMAR LETTER GHA
+1004;N;MYANMAR LETTER NGA
+1005;N;MYANMAR LETTER CA
+1006;N;MYANMAR LETTER CHA
+1007;N;MYANMAR LETTER JA
+1008;N;MYANMAR LETTER JHA
+1009;N;MYANMAR LETTER NYA
+100A;N;MYANMAR LETTER NNYA
+100B;N;MYANMAR LETTER TTA
+100C;N;MYANMAR LETTER TTHA
+100D;N;MYANMAR LETTER DDA
+100E;N;MYANMAR LETTER DDHA
+100F;N;MYANMAR LETTER NNA
+1010;N;MYANMAR LETTER TA
+1011;N;MYANMAR LETTER THA
+1012;N;MYANMAR LETTER DA
+1013;N;MYANMAR LETTER DHA
+1014;N;MYANMAR LETTER NA
+1015;N;MYANMAR LETTER PA
+1016;N;MYANMAR LETTER PHA
+1017;N;MYANMAR LETTER BA
+1018;N;MYANMAR LETTER BHA
+1019;N;MYANMAR LETTER MA
+101A;N;MYANMAR LETTER YA
+101B;N;MYANMAR LETTER RA
+101C;N;MYANMAR LETTER LA
+101D;N;MYANMAR LETTER WA
+101E;N;MYANMAR LETTER SA
+101F;N;MYANMAR LETTER HA
+1020;N;MYANMAR LETTER LLA
+1021;N;MYANMAR LETTER A
+1023;N;MYANMAR LETTER I
+1024;N;MYANMAR LETTER II
+1025;N;MYANMAR LETTER U
+1026;N;MYANMAR LETTER UU
+1027;N;MYANMAR LETTER E
+1029;N;MYANMAR LETTER O
+102A;N;MYANMAR LETTER AU
+102C;N;MYANMAR VOWEL SIGN AA
+102D;N;MYANMAR VOWEL SIGN I
+102E;N;MYANMAR VOWEL SIGN II
+102F;N;MYANMAR VOWEL SIGN U
+1030;N;MYANMAR VOWEL SIGN UU
+1031;N;MYANMAR VOWEL SIGN E
+1032;N;MYANMAR VOWEL SIGN AI
+1036;N;MYANMAR SIGN ANUSVARA
+1037;N;MYANMAR SIGN DOT BELOW
+1038;N;MYANMAR SIGN VISARGA
+1039;N;MYANMAR SIGN VIRAMA
+1040;N;MYANMAR DIGIT ZERO
+1041;N;MYANMAR DIGIT ONE
+1042;N;MYANMAR DIGIT TWO
+1043;N;MYANMAR DIGIT THREE
+1044;N;MYANMAR DIGIT FOUR
+1045;N;MYANMAR DIGIT FIVE
+1046;N;MYANMAR DIGIT SIX
+1047;N;MYANMAR DIGIT SEVEN
+1048;N;MYANMAR DIGIT EIGHT
+1049;N;MYANMAR DIGIT NINE
+104A;N;MYANMAR SIGN LITTLE SECTION
+104B;N;MYANMAR SIGN SECTION
+104C;N;MYANMAR SYMBOL LOCATIVE
+104D;N;MYANMAR SYMBOL COMPLETED
+104E;N;MYANMAR SYMBOL AFOREMENTIONED
+104F;N;MYANMAR SYMBOL GENITIVE
+1050;N;MYANMAR LETTER SHA
+1051;N;MYANMAR LETTER SSA
+1052;N;MYANMAR LETTER VOCALIC R
+1053;N;MYANMAR LETTER VOCALIC RR
+1054;N;MYANMAR LETTER VOCALIC L
+1055;N;MYANMAR LETTER VOCALIC LL
+1056;N;MYANMAR VOWEL SIGN VOCALIC R
+1057;N;MYANMAR VOWEL SIGN VOCALIC RR
+1058;N;MYANMAR VOWEL SIGN VOCALIC L
+1059;N;MYANMAR VOWEL SIGN VOCALIC LL
+10A0;N;GEORGIAN CAPITAL LETTER AN
+10A1;N;GEORGIAN CAPITAL LETTER BAN
+10A2;N;GEORGIAN CAPITAL LETTER GAN
+10A3;N;GEORGIAN CAPITAL LETTER DON
+10A4;N;GEORGIAN CAPITAL LETTER EN
+10A5;N;GEORGIAN CAPITAL LETTER VIN
+10A6;N;GEORGIAN CAPITAL LETTER ZEN
+10A7;N;GEORGIAN CAPITAL LETTER TAN
+10A8;N;GEORGIAN CAPITAL LETTER IN
+10A9;N;GEORGIAN CAPITAL LETTER KAN
+10AA;N;GEORGIAN CAPITAL LETTER LAS
+10AB;N;GEORGIAN CAPITAL LETTER MAN
+10AC;N;GEORGIAN CAPITAL LETTER NAR
+10AD;N;GEORGIAN CAPITAL LETTER ON
+10AE;N;GEORGIAN CAPITAL LETTER PAR
+10AF;N;GEORGIAN CAPITAL LETTER ZHAR
+10B0;N;GEORGIAN CAPITAL LETTER RAE
+10B1;N;GEORGIAN CAPITAL LETTER SAN
+10B2;N;GEORGIAN CAPITAL LETTER TAR
+10B3;N;GEORGIAN CAPITAL LETTER UN
+10B4;N;GEORGIAN CAPITAL LETTER PHAR
+10B5;N;GEORGIAN CAPITAL LETTER KHAR
+10B6;N;GEORGIAN CAPITAL LETTER GHAN
+10B7;N;GEORGIAN CAPITAL LETTER QAR
+10B8;N;GEORGIAN CAPITAL LETTER SHIN
+10B9;N;GEORGIAN CAPITAL LETTER CHIN
+10BA;N;GEORGIAN CAPITAL LETTER CAN
+10BB;N;GEORGIAN CAPITAL LETTER JIL
+10BC;N;GEORGIAN CAPITAL LETTER CIL
+10BD;N;GEORGIAN CAPITAL LETTER CHAR
+10BE;N;GEORGIAN CAPITAL LETTER XAN
+10BF;N;GEORGIAN CAPITAL LETTER JHAN
+10C0;N;GEORGIAN CAPITAL LETTER HAE
+10C1;N;GEORGIAN CAPITAL LETTER HE
+10C2;N;GEORGIAN CAPITAL LETTER HIE
+10C3;N;GEORGIAN CAPITAL LETTER WE
+10C4;N;GEORGIAN CAPITAL LETTER HAR
+10C5;N;GEORGIAN CAPITAL LETTER HOE
+10D0;N;GEORGIAN LETTER AN
+10D1;N;GEORGIAN LETTER BAN
+10D2;N;GEORGIAN LETTER GAN
+10D3;N;GEORGIAN LETTER DON
+10D4;N;GEORGIAN LETTER EN
+10D5;N;GEORGIAN LETTER VIN
+10D6;N;GEORGIAN LETTER ZEN
+10D7;N;GEORGIAN LETTER TAN
+10D8;N;GEORGIAN LETTER IN
+10D9;N;GEORGIAN LETTER KAN
+10DA;N;GEORGIAN LETTER LAS
+10DB;N;GEORGIAN LETTER MAN
+10DC;N;GEORGIAN LETTER NAR
+10DD;N;GEORGIAN LETTER ON
+10DE;N;GEORGIAN LETTER PAR
+10DF;N;GEORGIAN LETTER ZHAR
+10E0;N;GEORGIAN LETTER RAE
+10E1;N;GEORGIAN LETTER SAN
+10E2;N;GEORGIAN LETTER TAR
+10E3;N;GEORGIAN LETTER UN
+10E4;N;GEORGIAN LETTER PHAR
+10E5;N;GEORGIAN LETTER KHAR
+10E6;N;GEORGIAN LETTER GHAN
+10E7;N;GEORGIAN LETTER QAR
+10E8;N;GEORGIAN LETTER SHIN
+10E9;N;GEORGIAN LETTER CHIN
+10EA;N;GEORGIAN LETTER CAN
+10EB;N;GEORGIAN LETTER JIL
+10EC;N;GEORGIAN LETTER CIL
+10ED;N;GEORGIAN LETTER CHAR
+10EE;N;GEORGIAN LETTER XAN
+10EF;N;GEORGIAN LETTER JHAN
+10F0;N;GEORGIAN LETTER HAE
+10F1;N;GEORGIAN LETTER HE
+10F2;N;GEORGIAN LETTER HIE
+10F3;N;GEORGIAN LETTER WE
+10F4;N;GEORGIAN LETTER HAR
+10F5;N;GEORGIAN LETTER HOE
+10F6;N;GEORGIAN LETTER FI
+10FB;N;GEORGIAN PARAGRAPH SEPARATOR
+1100;W;HANGUL CHOSEONG KIYEOK
+1101;W;HANGUL CHOSEONG SSANGKIYEOK
+1102;W;HANGUL CHOSEONG NIEUN
+1103;W;HANGUL CHOSEONG TIKEUT
+1104;W;HANGUL CHOSEONG SSANGTIKEUT
+1105;W;HANGUL CHOSEONG RIEUL
+1106;W;HANGUL CHOSEONG MIEUM
+1107;W;HANGUL CHOSEONG PIEUP
+1108;W;HANGUL CHOSEONG SSANGPIEUP
+1109;W;HANGUL CHOSEONG SIOS
+110A;W;HANGUL CHOSEONG SSANGSIOS
+110B;W;HANGUL CHOSEONG IEUNG
+110C;W;HANGUL CHOSEONG CIEUC
+110D;W;HANGUL CHOSEONG SSANGCIEUC
+110E;W;HANGUL CHOSEONG CHIEUCH
+110F;W;HANGUL CHOSEONG KHIEUKH
+1110;W;HANGUL CHOSEONG THIEUTH
+1111;W;HANGUL CHOSEONG PHIEUPH
+1112;W;HANGUL CHOSEONG HIEUH
+1113;W;HANGUL CHOSEONG NIEUN-KIYEOK
+1114;W;HANGUL CHOSEONG SSANGNIEUN
+1115;W;HANGUL CHOSEONG NIEUN-TIKEUT
+1116;W;HANGUL CHOSEONG NIEUN-PIEUP
+1117;W;HANGUL CHOSEONG TIKEUT-KIYEOK
+1118;W;HANGUL CHOSEONG RIEUL-NIEUN
+1119;W;HANGUL CHOSEONG SSANGRIEUL
+111A;W;HANGUL CHOSEONG RIEUL-HIEUH
+111B;W;HANGUL CHOSEONG KAPYEOUNRIEUL
+111C;W;HANGUL CHOSEONG MIEUM-PIEUP
+111D;W;HANGUL CHOSEONG KAPYEOUNMIEUM
+111E;W;HANGUL CHOSEONG PIEUP-KIYEOK
+111F;W;HANGUL CHOSEONG PIEUP-NIEUN
+1120;W;HANGUL CHOSEONG PIEUP-TIKEUT
+1121;W;HANGUL CHOSEONG PIEUP-SIOS
+1122;W;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123;W;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124;W;HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125;W;HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126;W;HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127;W;HANGUL CHOSEONG PIEUP-CIEUC
+1128;W;HANGUL CHOSEONG PIEUP-CHIEUCH
+1129;W;HANGUL CHOSEONG PIEUP-THIEUTH
+112A;W;HANGUL CHOSEONG PIEUP-PHIEUPH
+112B;W;HANGUL CHOSEONG KAPYEOUNPIEUP
+112C;W;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D;W;HANGUL CHOSEONG SIOS-KIYEOK
+112E;W;HANGUL CHOSEONG SIOS-NIEUN
+112F;W;HANGUL CHOSEONG SIOS-TIKEUT
+1130;W;HANGUL CHOSEONG SIOS-RIEUL
+1131;W;HANGUL CHOSEONG SIOS-MIEUM
+1132;W;HANGUL CHOSEONG SIOS-PIEUP
+1133;W;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134;W;HANGUL CHOSEONG SIOS-SSANGSIOS
+1135;W;HANGUL CHOSEONG SIOS-IEUNG
+1136;W;HANGUL CHOSEONG SIOS-CIEUC
+1137;W;HANGUL CHOSEONG SIOS-CHIEUCH
+1138;W;HANGUL CHOSEONG SIOS-KHIEUKH
+1139;W;HANGUL CHOSEONG SIOS-THIEUTH
+113A;W;HANGUL CHOSEONG SIOS-PHIEUPH
+113B;W;HANGUL CHOSEONG SIOS-HIEUH
+113C;W;HANGUL CHOSEONG CHITUEUMSIOS
+113D;W;HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E;W;HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F;W;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140;W;HANGUL CHOSEONG PANSIOS
+1141;W;HANGUL CHOSEONG IEUNG-KIYEOK
+1142;W;HANGUL CHOSEONG IEUNG-TIKEUT
+1143;W;HANGUL CHOSEONG IEUNG-MIEUM
+1144;W;HANGUL CHOSEONG IEUNG-PIEUP
+1145;W;HANGUL CHOSEONG IEUNG-SIOS
+1146;W;HANGUL CHOSEONG IEUNG-PANSIOS
+1147;W;HANGUL CHOSEONG SSANGIEUNG
+1148;W;HANGUL CHOSEONG IEUNG-CIEUC
+1149;W;HANGUL CHOSEONG IEUNG-CHIEUCH
+114A;W;HANGUL CHOSEONG IEUNG-THIEUTH
+114B;W;HANGUL CHOSEONG IEUNG-PHIEUPH
+114C;W;HANGUL CHOSEONG YESIEUNG
+114D;W;HANGUL CHOSEONG CIEUC-IEUNG
+114E;W;HANGUL CHOSEONG CHITUEUMCIEUC
+114F;W;HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150;W;HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151;W;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152;W;HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153;W;HANGUL CHOSEONG CHIEUCH-HIEUH
+1154;W;HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155;W;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156;W;HANGUL CHOSEONG PHIEUPH-PIEUP
+1157;W;HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158;W;HANGUL CHOSEONG SSANGHIEUH
+1159;W;HANGUL CHOSEONG YEORINHIEUH
+115F;W;HANGUL CHOSEONG FILLER
+1160;N;HANGUL JUNGSEONG FILLER
+1161;N;HANGUL JUNGSEONG A
+1162;N;HANGUL JUNGSEONG AE
+1163;N;HANGUL JUNGSEONG YA
+1164;N;HANGUL JUNGSEONG YAE
+1165;N;HANGUL JUNGSEONG EO
+1166;N;HANGUL JUNGSEONG E
+1167;N;HANGUL JUNGSEONG YEO
+1168;N;HANGUL JUNGSEONG YE
+1169;N;HANGUL JUNGSEONG O
+116A;N;HANGUL JUNGSEONG WA
+116B;N;HANGUL JUNGSEONG WAE
+116C;N;HANGUL JUNGSEONG OE
+116D;N;HANGUL JUNGSEONG YO
+116E;N;HANGUL JUNGSEONG U
+116F;N;HANGUL JUNGSEONG WEO
+1170;N;HANGUL JUNGSEONG WE
+1171;N;HANGUL JUNGSEONG WI
+1172;N;HANGUL JUNGSEONG YU
+1173;N;HANGUL JUNGSEONG EU
+1174;N;HANGUL JUNGSEONG YI
+1175;N;HANGUL JUNGSEONG I
+1176;N;HANGUL JUNGSEONG A-O
+1177;N;HANGUL JUNGSEONG A-U
+1178;N;HANGUL JUNGSEONG YA-O
+1179;N;HANGUL JUNGSEONG YA-YO
+117A;N;HANGUL JUNGSEONG EO-O
+117B;N;HANGUL JUNGSEONG EO-U
+117C;N;HANGUL JUNGSEONG EO-EU
+117D;N;HANGUL JUNGSEONG YEO-O
+117E;N;HANGUL JUNGSEONG YEO-U
+117F;N;HANGUL JUNGSEONG O-EO
+1180;N;HANGUL JUNGSEONG O-E
+1181;N;HANGUL JUNGSEONG O-YE
+1182;N;HANGUL JUNGSEONG O-O
+1183;N;HANGUL JUNGSEONG O-U
+1184;N;HANGUL JUNGSEONG YO-YA
+1185;N;HANGUL JUNGSEONG YO-YAE
+1186;N;HANGUL JUNGSEONG YO-YEO
+1187;N;HANGUL JUNGSEONG YO-O
+1188;N;HANGUL JUNGSEONG YO-I
+1189;N;HANGUL JUNGSEONG U-A
+118A;N;HANGUL JUNGSEONG U-AE
+118B;N;HANGUL JUNGSEONG U-EO-EU
+118C;N;HANGUL JUNGSEONG U-YE
+118D;N;HANGUL JUNGSEONG U-U
+118E;N;HANGUL JUNGSEONG YU-A
+118F;N;HANGUL JUNGSEONG YU-EO
+1190;N;HANGUL JUNGSEONG YU-E
+1191;N;HANGUL JUNGSEONG YU-YEO
+1192;N;HANGUL JUNGSEONG YU-YE
+1193;N;HANGUL JUNGSEONG YU-U
+1194;N;HANGUL JUNGSEONG YU-I
+1195;N;HANGUL JUNGSEONG EU-U
+1196;N;HANGUL JUNGSEONG EU-EU
+1197;N;HANGUL JUNGSEONG YI-U
+1198;N;HANGUL JUNGSEONG I-A
+1199;N;HANGUL JUNGSEONG I-YA
+119A;N;HANGUL JUNGSEONG I-O
+119B;N;HANGUL JUNGSEONG I-U
+119C;N;HANGUL JUNGSEONG I-EU
+119D;N;HANGUL JUNGSEONG I-ARAEA
+119E;N;HANGUL JUNGSEONG ARAEA
+119F;N;HANGUL JUNGSEONG ARAEA-EO
+11A0;N;HANGUL JUNGSEONG ARAEA-U
+11A1;N;HANGUL JUNGSEONG ARAEA-I
+11A2;N;HANGUL JUNGSEONG SSANGARAEA
+11A8;N;HANGUL JONGSEONG KIYEOK
+11A9;N;HANGUL JONGSEONG SSANGKIYEOK
+11AA;N;HANGUL JONGSEONG KIYEOK-SIOS
+11AB;N;HANGUL JONGSEONG NIEUN
+11AC;N;HANGUL JONGSEONG NIEUN-CIEUC
+11AD;N;HANGUL JONGSEONG NIEUN-HIEUH
+11AE;N;HANGUL JONGSEONG TIKEUT
+11AF;N;HANGUL JONGSEONG RIEUL
+11B0;N;HANGUL JONGSEONG RIEUL-KIYEOK
+11B1;N;HANGUL JONGSEONG RIEUL-MIEUM
+11B2;N;HANGUL JONGSEONG RIEUL-PIEUP
+11B3;N;HANGUL JONGSEONG RIEUL-SIOS
+11B4;N;HANGUL JONGSEONG RIEUL-THIEUTH
+11B5;N;HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6;N;HANGUL JONGSEONG RIEUL-HIEUH
+11B7;N;HANGUL JONGSEONG MIEUM
+11B8;N;HANGUL JONGSEONG PIEUP
+11B9;N;HANGUL JONGSEONG PIEUP-SIOS
+11BA;N;HANGUL JONGSEONG SIOS
+11BB;N;HANGUL JONGSEONG SSANGSIOS
+11BC;N;HANGUL JONGSEONG IEUNG
+11BD;N;HANGUL JONGSEONG CIEUC
+11BE;N;HANGUL JONGSEONG CHIEUCH
+11BF;N;HANGUL JONGSEONG KHIEUKH
+11C0;N;HANGUL JONGSEONG THIEUTH
+11C1;N;HANGUL JONGSEONG PHIEUPH
+11C2;N;HANGUL JONGSEONG HIEUH
+11C3;N;HANGUL JONGSEONG KIYEOK-RIEUL
+11C4;N;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5;N;HANGUL JONGSEONG NIEUN-KIYEOK
+11C6;N;HANGUL JONGSEONG NIEUN-TIKEUT
+11C7;N;HANGUL JONGSEONG NIEUN-SIOS
+11C8;N;HANGUL JONGSEONG NIEUN-PANSIOS
+11C9;N;HANGUL JONGSEONG NIEUN-THIEUTH
+11CA;N;HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB;N;HANGUL JONGSEONG TIKEUT-RIEUL
+11CC;N;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD;N;HANGUL JONGSEONG RIEUL-NIEUN
+11CE;N;HANGUL JONGSEONG RIEUL-TIKEUT
+11CF;N;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0;N;HANGUL JONGSEONG SSANGRIEUL
+11D1;N;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2;N;HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3;N;HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4;N;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5;N;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6;N;HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7;N;HANGUL JONGSEONG RIEUL-PANSIOS
+11D8;N;HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9;N;HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA;N;HANGUL JONGSEONG MIEUM-KIYEOK
+11DB;N;HANGUL JONGSEONG MIEUM-RIEUL
+11DC;N;HANGUL JONGSEONG MIEUM-PIEUP
+11DD;N;HANGUL JONGSEONG MIEUM-SIOS
+11DE;N;HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF;N;HANGUL JONGSEONG MIEUM-PANSIOS
+11E0;N;HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1;N;HANGUL JONGSEONG MIEUM-HIEUH
+11E2;N;HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3;N;HANGUL JONGSEONG PIEUP-RIEUL
+11E4;N;HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5;N;HANGUL JONGSEONG PIEUP-HIEUH
+11E6;N;HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7;N;HANGUL JONGSEONG SIOS-KIYEOK
+11E8;N;HANGUL JONGSEONG SIOS-TIKEUT
+11E9;N;HANGUL JONGSEONG SIOS-RIEUL
+11EA;N;HANGUL JONGSEONG SIOS-PIEUP
+11EB;N;HANGUL JONGSEONG PANSIOS
+11EC;N;HANGUL JONGSEONG IEUNG-KIYEOK
+11ED;N;HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE;N;HANGUL JONGSEONG SSANGIEUNG
+11EF;N;HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0;N;HANGUL JONGSEONG YESIEUNG
+11F1;N;HANGUL JONGSEONG YESIEUNG-SIOS
+11F2;N;HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3;N;HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4;N;HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5;N;HANGUL JONGSEONG HIEUH-NIEUN
+11F6;N;HANGUL JONGSEONG HIEUH-RIEUL
+11F7;N;HANGUL JONGSEONG HIEUH-MIEUM
+11F8;N;HANGUL JONGSEONG HIEUH-PIEUP
+11F9;N;HANGUL JONGSEONG YEORINHIEUH
+1200;N;ETHIOPIC SYLLABLE HA
+1201;N;ETHIOPIC SYLLABLE HU
+1202;N;ETHIOPIC SYLLABLE HI
+1203;N;ETHIOPIC SYLLABLE HAA
+1204;N;ETHIOPIC SYLLABLE HEE
+1205;N;ETHIOPIC SYLLABLE HE
+1206;N;ETHIOPIC SYLLABLE HO
+1208;N;ETHIOPIC SYLLABLE LA
+1209;N;ETHIOPIC SYLLABLE LU
+120A;N;ETHIOPIC SYLLABLE LI
+120B;N;ETHIOPIC SYLLABLE LAA
+120C;N;ETHIOPIC SYLLABLE LEE
+120D;N;ETHIOPIC SYLLABLE LE
+120E;N;ETHIOPIC SYLLABLE LO
+120F;N;ETHIOPIC SYLLABLE LWA
+1210;N;ETHIOPIC SYLLABLE HHA
+1211;N;ETHIOPIC SYLLABLE HHU
+1212;N;ETHIOPIC SYLLABLE HHI
+1213;N;ETHIOPIC SYLLABLE HHAA
+1214;N;ETHIOPIC SYLLABLE HHEE
+1215;N;ETHIOPIC SYLLABLE HHE
+1216;N;ETHIOPIC SYLLABLE HHO
+1217;N;ETHIOPIC SYLLABLE HHWA
+1218;N;ETHIOPIC SYLLABLE MA
+1219;N;ETHIOPIC SYLLABLE MU
+121A;N;ETHIOPIC SYLLABLE MI
+121B;N;ETHIOPIC SYLLABLE MAA
+121C;N;ETHIOPIC SYLLABLE MEE
+121D;N;ETHIOPIC SYLLABLE ME
+121E;N;ETHIOPIC SYLLABLE MO
+121F;N;ETHIOPIC SYLLABLE MWA
+1220;N;ETHIOPIC SYLLABLE SZA
+1221;N;ETHIOPIC SYLLABLE SZU
+1222;N;ETHIOPIC SYLLABLE SZI
+1223;N;ETHIOPIC SYLLABLE SZAA
+1224;N;ETHIOPIC SYLLABLE SZEE
+1225;N;ETHIOPIC SYLLABLE SZE
+1226;N;ETHIOPIC SYLLABLE SZO
+1227;N;ETHIOPIC SYLLABLE SZWA
+1228;N;ETHIOPIC SYLLABLE RA
+1229;N;ETHIOPIC SYLLABLE RU
+122A;N;ETHIOPIC SYLLABLE RI
+122B;N;ETHIOPIC SYLLABLE RAA
+122C;N;ETHIOPIC SYLLABLE REE
+122D;N;ETHIOPIC SYLLABLE RE
+122E;N;ETHIOPIC SYLLABLE RO
+122F;N;ETHIOPIC SYLLABLE RWA
+1230;N;ETHIOPIC SYLLABLE SA
+1231;N;ETHIOPIC SYLLABLE SU
+1232;N;ETHIOPIC SYLLABLE SI
+1233;N;ETHIOPIC SYLLABLE SAA
+1234;N;ETHIOPIC SYLLABLE SEE
+1235;N;ETHIOPIC SYLLABLE SE
+1236;N;ETHIOPIC SYLLABLE SO
+1237;N;ETHIOPIC SYLLABLE SWA
+1238;N;ETHIOPIC SYLLABLE SHA
+1239;N;ETHIOPIC SYLLABLE SHU
+123A;N;ETHIOPIC SYLLABLE SHI
+123B;N;ETHIOPIC SYLLABLE SHAA
+123C;N;ETHIOPIC SYLLABLE SHEE
+123D;N;ETHIOPIC SYLLABLE SHE
+123E;N;ETHIOPIC SYLLABLE SHO
+123F;N;ETHIOPIC SYLLABLE SHWA
+1240;N;ETHIOPIC SYLLABLE QA
+1241;N;ETHIOPIC SYLLABLE QU
+1242;N;ETHIOPIC SYLLABLE QI
+1243;N;ETHIOPIC SYLLABLE QAA
+1244;N;ETHIOPIC SYLLABLE QEE
+1245;N;ETHIOPIC SYLLABLE QE
+1246;N;ETHIOPIC SYLLABLE QO
+1248;N;ETHIOPIC SYLLABLE QWA
+124A;N;ETHIOPIC SYLLABLE QWI
+124B;N;ETHIOPIC SYLLABLE QWAA
+124C;N;ETHIOPIC SYLLABLE QWEE
+124D;N;ETHIOPIC SYLLABLE QWE
+1250;N;ETHIOPIC SYLLABLE QHA
+1251;N;ETHIOPIC SYLLABLE QHU
+1252;N;ETHIOPIC SYLLABLE QHI
+1253;N;ETHIOPIC SYLLABLE QHAA
+1254;N;ETHIOPIC SYLLABLE QHEE
+1255;N;ETHIOPIC SYLLABLE QHE
+1256;N;ETHIOPIC SYLLABLE QHO
+1258;N;ETHIOPIC SYLLABLE QHWA
+125A;N;ETHIOPIC SYLLABLE QHWI
+125B;N;ETHIOPIC SYLLABLE QHWAA
+125C;N;ETHIOPIC SYLLABLE QHWEE
+125D;N;ETHIOPIC SYLLABLE QHWE
+1260;N;ETHIOPIC SYLLABLE BA
+1261;N;ETHIOPIC SYLLABLE BU
+1262;N;ETHIOPIC SYLLABLE BI
+1263;N;ETHIOPIC SYLLABLE BAA
+1264;N;ETHIOPIC SYLLABLE BEE
+1265;N;ETHIOPIC SYLLABLE BE
+1266;N;ETHIOPIC SYLLABLE BO
+1267;N;ETHIOPIC SYLLABLE BWA
+1268;N;ETHIOPIC SYLLABLE VA
+1269;N;ETHIOPIC SYLLABLE VU
+126A;N;ETHIOPIC SYLLABLE VI
+126B;N;ETHIOPIC SYLLABLE VAA
+126C;N;ETHIOPIC SYLLABLE VEE
+126D;N;ETHIOPIC SYLLABLE VE
+126E;N;ETHIOPIC SYLLABLE VO
+126F;N;ETHIOPIC SYLLABLE VWA
+1270;N;ETHIOPIC SYLLABLE TA
+1271;N;ETHIOPIC SYLLABLE TU
+1272;N;ETHIOPIC SYLLABLE TI
+1273;N;ETHIOPIC SYLLABLE TAA
+1274;N;ETHIOPIC SYLLABLE TEE
+1275;N;ETHIOPIC SYLLABLE TE
+1276;N;ETHIOPIC SYLLABLE TO
+1277;N;ETHIOPIC SYLLABLE TWA
+1278;N;ETHIOPIC SYLLABLE CA
+1279;N;ETHIOPIC SYLLABLE CU
+127A;N;ETHIOPIC SYLLABLE CI
+127B;N;ETHIOPIC SYLLABLE CAA
+127C;N;ETHIOPIC SYLLABLE CEE
+127D;N;ETHIOPIC SYLLABLE CE
+127E;N;ETHIOPIC SYLLABLE CO
+127F;N;ETHIOPIC SYLLABLE CWA
+1280;N;ETHIOPIC SYLLABLE XA
+1281;N;ETHIOPIC SYLLABLE XU
+1282;N;ETHIOPIC SYLLABLE XI
+1283;N;ETHIOPIC SYLLABLE XAA
+1284;N;ETHIOPIC SYLLABLE XEE
+1285;N;ETHIOPIC SYLLABLE XE
+1286;N;ETHIOPIC SYLLABLE XO
+1288;N;ETHIOPIC SYLLABLE XWA
+128A;N;ETHIOPIC SYLLABLE XWI
+128B;N;ETHIOPIC SYLLABLE XWAA
+128C;N;ETHIOPIC SYLLABLE XWEE
+128D;N;ETHIOPIC SYLLABLE XWE
+1290;N;ETHIOPIC SYLLABLE NA
+1291;N;ETHIOPIC SYLLABLE NU
+1292;N;ETHIOPIC SYLLABLE NI
+1293;N;ETHIOPIC SYLLABLE NAA
+1294;N;ETHIOPIC SYLLABLE NEE
+1295;N;ETHIOPIC SYLLABLE NE
+1296;N;ETHIOPIC SYLLABLE NO
+1297;N;ETHIOPIC SYLLABLE NWA
+1298;N;ETHIOPIC SYLLABLE NYA
+1299;N;ETHIOPIC SYLLABLE NYU
+129A;N;ETHIOPIC SYLLABLE NYI
+129B;N;ETHIOPIC SYLLABLE NYAA
+129C;N;ETHIOPIC SYLLABLE NYEE
+129D;N;ETHIOPIC SYLLABLE NYE
+129E;N;ETHIOPIC SYLLABLE NYO
+129F;N;ETHIOPIC SYLLABLE NYWA
+12A0;N;ETHIOPIC SYLLABLE GLOTTAL A
+12A1;N;ETHIOPIC SYLLABLE GLOTTAL U
+12A2;N;ETHIOPIC SYLLABLE GLOTTAL I
+12A3;N;ETHIOPIC SYLLABLE GLOTTAL AA
+12A4;N;ETHIOPIC SYLLABLE GLOTTAL EE
+12A5;N;ETHIOPIC SYLLABLE GLOTTAL E
+12A6;N;ETHIOPIC SYLLABLE GLOTTAL O
+12A7;N;ETHIOPIC SYLLABLE GLOTTAL WA
+12A8;N;ETHIOPIC SYLLABLE KA
+12A9;N;ETHIOPIC SYLLABLE KU
+12AA;N;ETHIOPIC SYLLABLE KI
+12AB;N;ETHIOPIC SYLLABLE KAA
+12AC;N;ETHIOPIC SYLLABLE KEE
+12AD;N;ETHIOPIC SYLLABLE KE
+12AE;N;ETHIOPIC SYLLABLE KO
+12B0;N;ETHIOPIC SYLLABLE KWA
+12B2;N;ETHIOPIC SYLLABLE KWI
+12B3;N;ETHIOPIC SYLLABLE KWAA
+12B4;N;ETHIOPIC SYLLABLE KWEE
+12B5;N;ETHIOPIC SYLLABLE KWE
+12B8;N;ETHIOPIC SYLLABLE KXA
+12B9;N;ETHIOPIC SYLLABLE KXU
+12BA;N;ETHIOPIC SYLLABLE KXI
+12BB;N;ETHIOPIC SYLLABLE KXAA
+12BC;N;ETHIOPIC SYLLABLE KXEE
+12BD;N;ETHIOPIC SYLLABLE KXE
+12BE;N;ETHIOPIC SYLLABLE KXO
+12C0;N;ETHIOPIC SYLLABLE KXWA
+12C2;N;ETHIOPIC SYLLABLE KXWI
+12C3;N;ETHIOPIC SYLLABLE KXWAA
+12C4;N;ETHIOPIC SYLLABLE KXWEE
+12C5;N;ETHIOPIC SYLLABLE KXWE
+12C8;N;ETHIOPIC SYLLABLE WA
+12C9;N;ETHIOPIC SYLLABLE WU
+12CA;N;ETHIOPIC SYLLABLE WI
+12CB;N;ETHIOPIC SYLLABLE WAA
+12CC;N;ETHIOPIC SYLLABLE WEE
+12CD;N;ETHIOPIC SYLLABLE WE
+12CE;N;ETHIOPIC SYLLABLE WO
+12D0;N;ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1;N;ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2;N;ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3;N;ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4;N;ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5;N;ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6;N;ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8;N;ETHIOPIC SYLLABLE ZA
+12D9;N;ETHIOPIC SYLLABLE ZU
+12DA;N;ETHIOPIC SYLLABLE ZI
+12DB;N;ETHIOPIC SYLLABLE ZAA
+12DC;N;ETHIOPIC SYLLABLE ZEE
+12DD;N;ETHIOPIC SYLLABLE ZE
+12DE;N;ETHIOPIC SYLLABLE ZO
+12DF;N;ETHIOPIC SYLLABLE ZWA
+12E0;N;ETHIOPIC SYLLABLE ZHA
+12E1;N;ETHIOPIC SYLLABLE ZHU
+12E2;N;ETHIOPIC SYLLABLE ZHI
+12E3;N;ETHIOPIC SYLLABLE ZHAA
+12E4;N;ETHIOPIC SYLLABLE ZHEE
+12E5;N;ETHIOPIC SYLLABLE ZHE
+12E6;N;ETHIOPIC SYLLABLE ZHO
+12E7;N;ETHIOPIC SYLLABLE ZHWA
+12E8;N;ETHIOPIC SYLLABLE YA
+12E9;N;ETHIOPIC SYLLABLE YU
+12EA;N;ETHIOPIC SYLLABLE YI
+12EB;N;ETHIOPIC SYLLABLE YAA
+12EC;N;ETHIOPIC SYLLABLE YEE
+12ED;N;ETHIOPIC SYLLABLE YE
+12EE;N;ETHIOPIC SYLLABLE YO
+12F0;N;ETHIOPIC SYLLABLE DA
+12F1;N;ETHIOPIC SYLLABLE DU
+12F2;N;ETHIOPIC SYLLABLE DI
+12F3;N;ETHIOPIC SYLLABLE DAA
+12F4;N;ETHIOPIC SYLLABLE DEE
+12F5;N;ETHIOPIC SYLLABLE DE
+12F6;N;ETHIOPIC SYLLABLE DO
+12F7;N;ETHIOPIC SYLLABLE DWA
+12F8;N;ETHIOPIC SYLLABLE DDA
+12F9;N;ETHIOPIC SYLLABLE DDU
+12FA;N;ETHIOPIC SYLLABLE DDI
+12FB;N;ETHIOPIC SYLLABLE DDAA
+12FC;N;ETHIOPIC SYLLABLE DDEE
+12FD;N;ETHIOPIC SYLLABLE DDE
+12FE;N;ETHIOPIC SYLLABLE DDO
+12FF;N;ETHIOPIC SYLLABLE DDWA
+1300;N;ETHIOPIC SYLLABLE JA
+1301;N;ETHIOPIC SYLLABLE JU
+1302;N;ETHIOPIC SYLLABLE JI
+1303;N;ETHIOPIC SYLLABLE JAA
+1304;N;ETHIOPIC SYLLABLE JEE
+1305;N;ETHIOPIC SYLLABLE JE
+1306;N;ETHIOPIC SYLLABLE JO
+1307;N;ETHIOPIC SYLLABLE JWA
+1308;N;ETHIOPIC SYLLABLE GA
+1309;N;ETHIOPIC SYLLABLE GU
+130A;N;ETHIOPIC SYLLABLE GI
+130B;N;ETHIOPIC SYLLABLE GAA
+130C;N;ETHIOPIC SYLLABLE GEE
+130D;N;ETHIOPIC SYLLABLE GE
+130E;N;ETHIOPIC SYLLABLE GO
+1310;N;ETHIOPIC SYLLABLE GWA
+1312;N;ETHIOPIC SYLLABLE GWI
+1313;N;ETHIOPIC SYLLABLE GWAA
+1314;N;ETHIOPIC SYLLABLE GWEE
+1315;N;ETHIOPIC SYLLABLE GWE
+1318;N;ETHIOPIC SYLLABLE GGA
+1319;N;ETHIOPIC SYLLABLE GGU
+131A;N;ETHIOPIC SYLLABLE GGI
+131B;N;ETHIOPIC SYLLABLE GGAA
+131C;N;ETHIOPIC SYLLABLE GGEE
+131D;N;ETHIOPIC SYLLABLE GGE
+131E;N;ETHIOPIC SYLLABLE GGO
+1320;N;ETHIOPIC SYLLABLE THA
+1321;N;ETHIOPIC SYLLABLE THU
+1322;N;ETHIOPIC SYLLABLE THI
+1323;N;ETHIOPIC SYLLABLE THAA
+1324;N;ETHIOPIC SYLLABLE THEE
+1325;N;ETHIOPIC SYLLABLE THE
+1326;N;ETHIOPIC SYLLABLE THO
+1327;N;ETHIOPIC SYLLABLE THWA
+1328;N;ETHIOPIC SYLLABLE CHA
+1329;N;ETHIOPIC SYLLABLE CHU
+132A;N;ETHIOPIC SYLLABLE CHI
+132B;N;ETHIOPIC SYLLABLE CHAA
+132C;N;ETHIOPIC SYLLABLE CHEE
+132D;N;ETHIOPIC SYLLABLE CHE
+132E;N;ETHIOPIC SYLLABLE CHO
+132F;N;ETHIOPIC SYLLABLE CHWA
+1330;N;ETHIOPIC SYLLABLE PHA
+1331;N;ETHIOPIC SYLLABLE PHU
+1332;N;ETHIOPIC SYLLABLE PHI
+1333;N;ETHIOPIC SYLLABLE PHAA
+1334;N;ETHIOPIC SYLLABLE PHEE
+1335;N;ETHIOPIC SYLLABLE PHE
+1336;N;ETHIOPIC SYLLABLE PHO
+1337;N;ETHIOPIC SYLLABLE PHWA
+1338;N;ETHIOPIC SYLLABLE TSA
+1339;N;ETHIOPIC SYLLABLE TSU
+133A;N;ETHIOPIC SYLLABLE TSI
+133B;N;ETHIOPIC SYLLABLE TSAA
+133C;N;ETHIOPIC SYLLABLE TSEE
+133D;N;ETHIOPIC SYLLABLE TSE
+133E;N;ETHIOPIC SYLLABLE TSO
+133F;N;ETHIOPIC SYLLABLE TSWA
+1340;N;ETHIOPIC SYLLABLE TZA
+1341;N;ETHIOPIC SYLLABLE TZU
+1342;N;ETHIOPIC SYLLABLE TZI
+1343;N;ETHIOPIC SYLLABLE TZAA
+1344;N;ETHIOPIC SYLLABLE TZEE
+1345;N;ETHIOPIC SYLLABLE TZE
+1346;N;ETHIOPIC SYLLABLE TZO
+1348;N;ETHIOPIC SYLLABLE FA
+1349;N;ETHIOPIC SYLLABLE FU
+134A;N;ETHIOPIC SYLLABLE FI
+134B;N;ETHIOPIC SYLLABLE FAA
+134C;N;ETHIOPIC SYLLABLE FEE
+134D;N;ETHIOPIC SYLLABLE FE
+134E;N;ETHIOPIC SYLLABLE FO
+134F;N;ETHIOPIC SYLLABLE FWA
+1350;N;ETHIOPIC SYLLABLE PA
+1351;N;ETHIOPIC SYLLABLE PU
+1352;N;ETHIOPIC SYLLABLE PI
+1353;N;ETHIOPIC SYLLABLE PAA
+1354;N;ETHIOPIC SYLLABLE PEE
+1355;N;ETHIOPIC SYLLABLE PE
+1356;N;ETHIOPIC SYLLABLE PO
+1357;N;ETHIOPIC SYLLABLE PWA
+1358;N;ETHIOPIC SYLLABLE RYA
+1359;N;ETHIOPIC SYLLABLE MYA
+135A;N;ETHIOPIC SYLLABLE FYA
+1361;N;ETHIOPIC WORDSPACE
+1362;N;ETHIOPIC FULL STOP
+1363;N;ETHIOPIC COMMA
+1364;N;ETHIOPIC SEMICOLON
+1365;N;ETHIOPIC COLON
+1366;N;ETHIOPIC PREFACE COLON
+1367;N;ETHIOPIC QUESTION MARK
+1368;N;ETHIOPIC PARAGRAPH SEPARATOR
+1369;N;ETHIOPIC DIGIT ONE
+136A;N;ETHIOPIC DIGIT TWO
+136B;N;ETHIOPIC DIGIT THREE
+136C;N;ETHIOPIC DIGIT FOUR
+136D;N;ETHIOPIC DIGIT FIVE
+136E;N;ETHIOPIC DIGIT SIX
+136F;N;ETHIOPIC DIGIT SEVEN
+1370;N;ETHIOPIC DIGIT EIGHT
+1371;N;ETHIOPIC DIGIT NINE
+1372;N;ETHIOPIC NUMBER TEN
+1373;N;ETHIOPIC NUMBER TWENTY
+1374;N;ETHIOPIC NUMBER THIRTY
+1375;N;ETHIOPIC NUMBER FORTY
+1376;N;ETHIOPIC NUMBER FIFTY
+1377;N;ETHIOPIC NUMBER SIXTY
+1378;N;ETHIOPIC NUMBER SEVENTY
+1379;N;ETHIOPIC NUMBER EIGHTY
+137A;N;ETHIOPIC NUMBER NINETY
+137B;N;ETHIOPIC NUMBER HUNDRED
+137C;N;ETHIOPIC NUMBER TEN THOUSAND
+13A0;N;CHEROKEE LETTER A
+13A1;N;CHEROKEE LETTER E
+13A2;N;CHEROKEE LETTER I
+13A3;N;CHEROKEE LETTER O
+13A4;N;CHEROKEE LETTER U
+13A5;N;CHEROKEE LETTER V
+13A6;N;CHEROKEE LETTER GA
+13A7;N;CHEROKEE LETTER KA
+13A8;N;CHEROKEE LETTER GE
+13A9;N;CHEROKEE LETTER GI
+13AA;N;CHEROKEE LETTER GO
+13AB;N;CHEROKEE LETTER GU
+13AC;N;CHEROKEE LETTER GV
+13AD;N;CHEROKEE LETTER HA
+13AE;N;CHEROKEE LETTER HE
+13AF;N;CHEROKEE LETTER HI
+13B0;N;CHEROKEE LETTER HO
+13B1;N;CHEROKEE LETTER HU
+13B2;N;CHEROKEE LETTER HV
+13B3;N;CHEROKEE LETTER LA
+13B4;N;CHEROKEE LETTER LE
+13B5;N;CHEROKEE LETTER LI
+13B6;N;CHEROKEE LETTER LO
+13B7;N;CHEROKEE LETTER LU
+13B8;N;CHEROKEE LETTER LV
+13B9;N;CHEROKEE LETTER MA
+13BA;N;CHEROKEE LETTER ME
+13BB;N;CHEROKEE LETTER MI
+13BC;N;CHEROKEE LETTER MO
+13BD;N;CHEROKEE LETTER MU
+13BE;N;CHEROKEE LETTER NA
+13BF;N;CHEROKEE LETTER HNA
+13C0;N;CHEROKEE LETTER NAH
+13C1;N;CHEROKEE LETTER NE
+13C2;N;CHEROKEE LETTER NI
+13C3;N;CHEROKEE LETTER NO
+13C4;N;CHEROKEE LETTER NU
+13C5;N;CHEROKEE LETTER NV
+13C6;N;CHEROKEE LETTER QUA
+13C7;N;CHEROKEE LETTER QUE
+13C8;N;CHEROKEE LETTER QUI
+13C9;N;CHEROKEE LETTER QUO
+13CA;N;CHEROKEE LETTER QUU
+13CB;N;CHEROKEE LETTER QUV
+13CC;N;CHEROKEE LETTER SA
+13CD;N;CHEROKEE LETTER S
+13CE;N;CHEROKEE LETTER SE
+13CF;N;CHEROKEE LETTER SI
+13D0;N;CHEROKEE LETTER SO
+13D1;N;CHEROKEE LETTER SU
+13D2;N;CHEROKEE LETTER SV
+13D3;N;CHEROKEE LETTER DA
+13D4;N;CHEROKEE LETTER TA
+13D5;N;CHEROKEE LETTER DE
+13D6;N;CHEROKEE LETTER TE
+13D7;N;CHEROKEE LETTER DI
+13D8;N;CHEROKEE LETTER TI
+13D9;N;CHEROKEE LETTER DO
+13DA;N;CHEROKEE LETTER DU
+13DB;N;CHEROKEE LETTER DV
+13DC;N;CHEROKEE LETTER DLA
+13DD;N;CHEROKEE LETTER TLA
+13DE;N;CHEROKEE LETTER TLE
+13DF;N;CHEROKEE LETTER TLI
+13E0;N;CHEROKEE LETTER TLO
+13E1;N;CHEROKEE LETTER TLU
+13E2;N;CHEROKEE LETTER TLV
+13E3;N;CHEROKEE LETTER TSA
+13E4;N;CHEROKEE LETTER TSE
+13E5;N;CHEROKEE LETTER TSI
+13E6;N;CHEROKEE LETTER TSO
+13E7;N;CHEROKEE LETTER TSU
+13E8;N;CHEROKEE LETTER TSV
+13E9;N;CHEROKEE LETTER WA
+13EA;N;CHEROKEE LETTER WE
+13EB;N;CHEROKEE LETTER WI
+13EC;N;CHEROKEE LETTER WO
+13ED;N;CHEROKEE LETTER WU
+13EE;N;CHEROKEE LETTER WV
+13EF;N;CHEROKEE LETTER YA
+13F0;N;CHEROKEE LETTER YE
+13F1;N;CHEROKEE LETTER YI
+13F2;N;CHEROKEE LETTER YO
+13F3;N;CHEROKEE LETTER YU
+13F4;N;CHEROKEE LETTER YV
+1401;N;CANADIAN SYLLABICS E
+1402;N;CANADIAN SYLLABICS AAI
+1403;N;CANADIAN SYLLABICS I
+1404;N;CANADIAN SYLLABICS II
+1405;N;CANADIAN SYLLABICS O
+1406;N;CANADIAN SYLLABICS OO
+1407;N;CANADIAN SYLLABICS Y-CREE OO
+1408;N;CANADIAN SYLLABICS CARRIER EE
+1409;N;CANADIAN SYLLABICS CARRIER I
+140A;N;CANADIAN SYLLABICS A
+140B;N;CANADIAN SYLLABICS AA
+140C;N;CANADIAN SYLLABICS WE
+140D;N;CANADIAN SYLLABICS WEST-CREE WE
+140E;N;CANADIAN SYLLABICS WI
+140F;N;CANADIAN SYLLABICS WEST-CREE WI
+1410;N;CANADIAN SYLLABICS WII
+1411;N;CANADIAN SYLLABICS WEST-CREE WII
+1412;N;CANADIAN SYLLABICS WO
+1413;N;CANADIAN SYLLABICS WEST-CREE WO
+1414;N;CANADIAN SYLLABICS WOO
+1415;N;CANADIAN SYLLABICS WEST-CREE WOO
+1416;N;CANADIAN SYLLABICS NASKAPI WOO
+1417;N;CANADIAN SYLLABICS WA
+1418;N;CANADIAN SYLLABICS WEST-CREE WA
+1419;N;CANADIAN SYLLABICS WAA
+141A;N;CANADIAN SYLLABICS WEST-CREE WAA
+141B;N;CANADIAN SYLLABICS NASKAPI WAA
+141C;N;CANADIAN SYLLABICS AI
+141D;N;CANADIAN SYLLABICS Y-CREE W
+141E;N;CANADIAN SYLLABICS GLOTTAL STOP
+141F;N;CANADIAN SYLLABICS FINAL ACUTE
+1420;N;CANADIAN SYLLABICS FINAL GRAVE
+1421;N;CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422;N;CANADIAN SYLLABICS FINAL TOP HALF RING
+1423;N;CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424;N;CANADIAN SYLLABICS FINAL RING
+1425;N;CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426;N;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427;N;CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428;N;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429;N;CANADIAN SYLLABICS FINAL PLUS
+142A;N;CANADIAN SYLLABICS FINAL DOWN TACK
+142B;N;CANADIAN SYLLABICS EN
+142C;N;CANADIAN SYLLABICS IN
+142D;N;CANADIAN SYLLABICS ON
+142E;N;CANADIAN SYLLABICS AN
+142F;N;CANADIAN SYLLABICS PE
+1430;N;CANADIAN SYLLABICS PAAI
+1431;N;CANADIAN SYLLABICS PI
+1432;N;CANADIAN SYLLABICS PII
+1433;N;CANADIAN SYLLABICS PO
+1434;N;CANADIAN SYLLABICS POO
+1435;N;CANADIAN SYLLABICS Y-CREE POO
+1436;N;CANADIAN SYLLABICS CARRIER HEE
+1437;N;CANADIAN SYLLABICS CARRIER HI
+1438;N;CANADIAN SYLLABICS PA
+1439;N;CANADIAN SYLLABICS PAA
+143A;N;CANADIAN SYLLABICS PWE
+143B;N;CANADIAN SYLLABICS WEST-CREE PWE
+143C;N;CANADIAN SYLLABICS PWI
+143D;N;CANADIAN SYLLABICS WEST-CREE PWI
+143E;N;CANADIAN SYLLABICS PWII
+143F;N;CANADIAN SYLLABICS WEST-CREE PWII
+1440;N;CANADIAN SYLLABICS PWO
+1441;N;CANADIAN SYLLABICS WEST-CREE PWO
+1442;N;CANADIAN SYLLABICS PWOO
+1443;N;CANADIAN SYLLABICS WEST-CREE PWOO
+1444;N;CANADIAN SYLLABICS PWA
+1445;N;CANADIAN SYLLABICS WEST-CREE PWA
+1446;N;CANADIAN SYLLABICS PWAA
+1447;N;CANADIAN SYLLABICS WEST-CREE PWAA
+1448;N;CANADIAN SYLLABICS Y-CREE PWAA
+1449;N;CANADIAN SYLLABICS P
+144A;N;CANADIAN SYLLABICS WEST-CREE P
+144B;N;CANADIAN SYLLABICS CARRIER H
+144C;N;CANADIAN SYLLABICS TE
+144D;N;CANADIAN SYLLABICS TAAI
+144E;N;CANADIAN SYLLABICS TI
+144F;N;CANADIAN SYLLABICS TII
+1450;N;CANADIAN SYLLABICS TO
+1451;N;CANADIAN SYLLABICS TOO
+1452;N;CANADIAN SYLLABICS Y-CREE TOO
+1453;N;CANADIAN SYLLABICS CARRIER DEE
+1454;N;CANADIAN SYLLABICS CARRIER DI
+1455;N;CANADIAN SYLLABICS TA
+1456;N;CANADIAN SYLLABICS TAA
+1457;N;CANADIAN SYLLABICS TWE
+1458;N;CANADIAN SYLLABICS WEST-CREE TWE
+1459;N;CANADIAN SYLLABICS TWI
+145A;N;CANADIAN SYLLABICS WEST-CREE TWI
+145B;N;CANADIAN SYLLABICS TWII
+145C;N;CANADIAN SYLLABICS WEST-CREE TWII
+145D;N;CANADIAN SYLLABICS TWO
+145E;N;CANADIAN SYLLABICS WEST-CREE TWO
+145F;N;CANADIAN SYLLABICS TWOO
+1460;N;CANADIAN SYLLABICS WEST-CREE TWOO
+1461;N;CANADIAN SYLLABICS TWA
+1462;N;CANADIAN SYLLABICS WEST-CREE TWA
+1463;N;CANADIAN SYLLABICS TWAA
+1464;N;CANADIAN SYLLABICS WEST-CREE TWAA
+1465;N;CANADIAN SYLLABICS NASKAPI TWAA
+1466;N;CANADIAN SYLLABICS T
+1467;N;CANADIAN SYLLABICS TTE
+1468;N;CANADIAN SYLLABICS TTI
+1469;N;CANADIAN SYLLABICS TTO
+146A;N;CANADIAN SYLLABICS TTA
+146B;N;CANADIAN SYLLABICS KE
+146C;N;CANADIAN SYLLABICS KAAI
+146D;N;CANADIAN SYLLABICS KI
+146E;N;CANADIAN SYLLABICS KII
+146F;N;CANADIAN SYLLABICS KO
+1470;N;CANADIAN SYLLABICS KOO
+1471;N;CANADIAN SYLLABICS Y-CREE KOO
+1472;N;CANADIAN SYLLABICS KA
+1473;N;CANADIAN SYLLABICS KAA
+1474;N;CANADIAN SYLLABICS KWE
+1475;N;CANADIAN SYLLABICS WEST-CREE KWE
+1476;N;CANADIAN SYLLABICS KWI
+1477;N;CANADIAN SYLLABICS WEST-CREE KWI
+1478;N;CANADIAN SYLLABICS KWII
+1479;N;CANADIAN SYLLABICS WEST-CREE KWII
+147A;N;CANADIAN SYLLABICS KWO
+147B;N;CANADIAN SYLLABICS WEST-CREE KWO
+147C;N;CANADIAN SYLLABICS KWOO
+147D;N;CANADIAN SYLLABICS WEST-CREE KWOO
+147E;N;CANADIAN SYLLABICS KWA
+147F;N;CANADIAN SYLLABICS WEST-CREE KWA
+1480;N;CANADIAN SYLLABICS KWAA
+1481;N;CANADIAN SYLLABICS WEST-CREE KWAA
+1482;N;CANADIAN SYLLABICS NASKAPI KWAA
+1483;N;CANADIAN SYLLABICS K
+1484;N;CANADIAN SYLLABICS KW
+1485;N;CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486;N;CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487;N;CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488;N;CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489;N;CANADIAN SYLLABICS CE
+148A;N;CANADIAN SYLLABICS CAAI
+148B;N;CANADIAN SYLLABICS CI
+148C;N;CANADIAN SYLLABICS CII
+148D;N;CANADIAN SYLLABICS CO
+148E;N;CANADIAN SYLLABICS COO
+148F;N;CANADIAN SYLLABICS Y-CREE COO
+1490;N;CANADIAN SYLLABICS CA
+1491;N;CANADIAN SYLLABICS CAA
+1492;N;CANADIAN SYLLABICS CWE
+1493;N;CANADIAN SYLLABICS WEST-CREE CWE
+1494;N;CANADIAN SYLLABICS CWI
+1495;N;CANADIAN SYLLABICS WEST-CREE CWI
+1496;N;CANADIAN SYLLABICS CWII
+1497;N;CANADIAN SYLLABICS WEST-CREE CWII
+1498;N;CANADIAN SYLLABICS CWO
+1499;N;CANADIAN SYLLABICS WEST-CREE CWO
+149A;N;CANADIAN SYLLABICS CWOO
+149B;N;CANADIAN SYLLABICS WEST-CREE CWOO
+149C;N;CANADIAN SYLLABICS CWA
+149D;N;CANADIAN SYLLABICS WEST-CREE CWA
+149E;N;CANADIAN SYLLABICS CWAA
+149F;N;CANADIAN SYLLABICS WEST-CREE CWAA
+14A0;N;CANADIAN SYLLABICS NASKAPI CWAA
+14A1;N;CANADIAN SYLLABICS C
+14A2;N;CANADIAN SYLLABICS SAYISI TH
+14A3;N;CANADIAN SYLLABICS ME
+14A4;N;CANADIAN SYLLABICS MAAI
+14A5;N;CANADIAN SYLLABICS MI
+14A6;N;CANADIAN SYLLABICS MII
+14A7;N;CANADIAN SYLLABICS MO
+14A8;N;CANADIAN SYLLABICS MOO
+14A9;N;CANADIAN SYLLABICS Y-CREE MOO
+14AA;N;CANADIAN SYLLABICS MA
+14AB;N;CANADIAN SYLLABICS MAA
+14AC;N;CANADIAN SYLLABICS MWE
+14AD;N;CANADIAN SYLLABICS WEST-CREE MWE
+14AE;N;CANADIAN SYLLABICS MWI
+14AF;N;CANADIAN SYLLABICS WEST-CREE MWI
+14B0;N;CANADIAN SYLLABICS MWII
+14B1;N;CANADIAN SYLLABICS WEST-CREE MWII
+14B2;N;CANADIAN SYLLABICS MWO
+14B3;N;CANADIAN SYLLABICS WEST-CREE MWO
+14B4;N;CANADIAN SYLLABICS MWOO
+14B5;N;CANADIAN SYLLABICS WEST-CREE MWOO
+14B6;N;CANADIAN SYLLABICS MWA
+14B7;N;CANADIAN SYLLABICS WEST-CREE MWA
+14B8;N;CANADIAN SYLLABICS MWAA
+14B9;N;CANADIAN SYLLABICS WEST-CREE MWAA
+14BA;N;CANADIAN SYLLABICS NASKAPI MWAA
+14BB;N;CANADIAN SYLLABICS M
+14BC;N;CANADIAN SYLLABICS WEST-CREE M
+14BD;N;CANADIAN SYLLABICS MH
+14BE;N;CANADIAN SYLLABICS ATHAPASCAN M
+14BF;N;CANADIAN SYLLABICS SAYISI M
+14C0;N;CANADIAN SYLLABICS NE
+14C1;N;CANADIAN SYLLABICS NAAI
+14C2;N;CANADIAN SYLLABICS NI
+14C3;N;CANADIAN SYLLABICS NII
+14C4;N;CANADIAN SYLLABICS NO
+14C5;N;CANADIAN SYLLABICS NOO
+14C6;N;CANADIAN SYLLABICS Y-CREE NOO
+14C7;N;CANADIAN SYLLABICS NA
+14C8;N;CANADIAN SYLLABICS NAA
+14C9;N;CANADIAN SYLLABICS NWE
+14CA;N;CANADIAN SYLLABICS WEST-CREE NWE
+14CB;N;CANADIAN SYLLABICS NWA
+14CC;N;CANADIAN SYLLABICS WEST-CREE NWA
+14CD;N;CANADIAN SYLLABICS NWAA
+14CE;N;CANADIAN SYLLABICS WEST-CREE NWAA
+14CF;N;CANADIAN SYLLABICS NASKAPI NWAA
+14D0;N;CANADIAN SYLLABICS N
+14D1;N;CANADIAN SYLLABICS CARRIER NG
+14D2;N;CANADIAN SYLLABICS NH
+14D3;N;CANADIAN SYLLABICS LE
+14D4;N;CANADIAN SYLLABICS LAAI
+14D5;N;CANADIAN SYLLABICS LI
+14D6;N;CANADIAN SYLLABICS LII
+14D7;N;CANADIAN SYLLABICS LO
+14D8;N;CANADIAN SYLLABICS LOO
+14D9;N;CANADIAN SYLLABICS Y-CREE LOO
+14DA;N;CANADIAN SYLLABICS LA
+14DB;N;CANADIAN SYLLABICS LAA
+14DC;N;CANADIAN SYLLABICS LWE
+14DD;N;CANADIAN SYLLABICS WEST-CREE LWE
+14DE;N;CANADIAN SYLLABICS LWI
+14DF;N;CANADIAN SYLLABICS WEST-CREE LWI
+14E0;N;CANADIAN SYLLABICS LWII
+14E1;N;CANADIAN SYLLABICS WEST-CREE LWII
+14E2;N;CANADIAN SYLLABICS LWO
+14E3;N;CANADIAN SYLLABICS WEST-CREE LWO
+14E4;N;CANADIAN SYLLABICS LWOO
+14E5;N;CANADIAN SYLLABICS WEST-CREE LWOO
+14E6;N;CANADIAN SYLLABICS LWA
+14E7;N;CANADIAN SYLLABICS WEST-CREE LWA
+14E8;N;CANADIAN SYLLABICS LWAA
+14E9;N;CANADIAN SYLLABICS WEST-CREE LWAA
+14EA;N;CANADIAN SYLLABICS L
+14EB;N;CANADIAN SYLLABICS WEST-CREE L
+14EC;N;CANADIAN SYLLABICS MEDIAL L
+14ED;N;CANADIAN SYLLABICS SE
+14EE;N;CANADIAN SYLLABICS SAAI
+14EF;N;CANADIAN SYLLABICS SI
+14F0;N;CANADIAN SYLLABICS SII
+14F1;N;CANADIAN SYLLABICS SO
+14F2;N;CANADIAN SYLLABICS SOO
+14F3;N;CANADIAN SYLLABICS Y-CREE SOO
+14F4;N;CANADIAN SYLLABICS SA
+14F5;N;CANADIAN SYLLABICS SAA
+14F6;N;CANADIAN SYLLABICS SWE
+14F7;N;CANADIAN SYLLABICS WEST-CREE SWE
+14F8;N;CANADIAN SYLLABICS SWI
+14F9;N;CANADIAN SYLLABICS WEST-CREE SWI
+14FA;N;CANADIAN SYLLABICS SWII
+14FB;N;CANADIAN SYLLABICS WEST-CREE SWII
+14FC;N;CANADIAN SYLLABICS SWO
+14FD;N;CANADIAN SYLLABICS WEST-CREE SWO
+14FE;N;CANADIAN SYLLABICS SWOO
+14FF;N;CANADIAN SYLLABICS WEST-CREE SWOO
+1500;N;CANADIAN SYLLABICS SWA
+1501;N;CANADIAN SYLLABICS WEST-CREE SWA
+1502;N;CANADIAN SYLLABICS SWAA
+1503;N;CANADIAN SYLLABICS WEST-CREE SWAA
+1504;N;CANADIAN SYLLABICS NASKAPI SWAA
+1505;N;CANADIAN SYLLABICS S
+1506;N;CANADIAN SYLLABICS ATHAPASCAN S
+1507;N;CANADIAN SYLLABICS SW
+1508;N;CANADIAN SYLLABICS BLACKFOOT S
+1509;N;CANADIAN SYLLABICS MOOSE-CREE SK
+150A;N;CANADIAN SYLLABICS NASKAPI SKW
+150B;N;CANADIAN SYLLABICS NASKAPI S-W
+150C;N;CANADIAN SYLLABICS NASKAPI SPWA
+150D;N;CANADIAN SYLLABICS NASKAPI STWA
+150E;N;CANADIAN SYLLABICS NASKAPI SKWA
+150F;N;CANADIAN SYLLABICS NASKAPI SCWA
+1510;N;CANADIAN SYLLABICS SHE
+1511;N;CANADIAN SYLLABICS SHI
+1512;N;CANADIAN SYLLABICS SHII
+1513;N;CANADIAN SYLLABICS SHO
+1514;N;CANADIAN SYLLABICS SHOO
+1515;N;CANADIAN SYLLABICS SHA
+1516;N;CANADIAN SYLLABICS SHAA
+1517;N;CANADIAN SYLLABICS SHWE
+1518;N;CANADIAN SYLLABICS WEST-CREE SHWE
+1519;N;CANADIAN SYLLABICS SHWI
+151A;N;CANADIAN SYLLABICS WEST-CREE SHWI
+151B;N;CANADIAN SYLLABICS SHWII
+151C;N;CANADIAN SYLLABICS WEST-CREE SHWII
+151D;N;CANADIAN SYLLABICS SHWO
+151E;N;CANADIAN SYLLABICS WEST-CREE SHWO
+151F;N;CANADIAN SYLLABICS SHWOO
+1520;N;CANADIAN SYLLABICS WEST-CREE SHWOO
+1521;N;CANADIAN SYLLABICS SHWA
+1522;N;CANADIAN SYLLABICS WEST-CREE SHWA
+1523;N;CANADIAN SYLLABICS SHWAA
+1524;N;CANADIAN SYLLABICS WEST-CREE SHWAA
+1525;N;CANADIAN SYLLABICS SH
+1526;N;CANADIAN SYLLABICS YE
+1527;N;CANADIAN SYLLABICS YAAI
+1528;N;CANADIAN SYLLABICS YI
+1529;N;CANADIAN SYLLABICS YII
+152A;N;CANADIAN SYLLABICS YO
+152B;N;CANADIAN SYLLABICS YOO
+152C;N;CANADIAN SYLLABICS Y-CREE YOO
+152D;N;CANADIAN SYLLABICS YA
+152E;N;CANADIAN SYLLABICS YAA
+152F;N;CANADIAN SYLLABICS YWE
+1530;N;CANADIAN SYLLABICS WEST-CREE YWE
+1531;N;CANADIAN SYLLABICS YWI
+1532;N;CANADIAN SYLLABICS WEST-CREE YWI
+1533;N;CANADIAN SYLLABICS YWII
+1534;N;CANADIAN SYLLABICS WEST-CREE YWII
+1535;N;CANADIAN SYLLABICS YWO
+1536;N;CANADIAN SYLLABICS WEST-CREE YWO
+1537;N;CANADIAN SYLLABICS YWOO
+1538;N;CANADIAN SYLLABICS WEST-CREE YWOO
+1539;N;CANADIAN SYLLABICS YWA
+153A;N;CANADIAN SYLLABICS WEST-CREE YWA
+153B;N;CANADIAN SYLLABICS YWAA
+153C;N;CANADIAN SYLLABICS WEST-CREE YWAA
+153D;N;CANADIAN SYLLABICS NASKAPI YWAA
+153E;N;CANADIAN SYLLABICS Y
+153F;N;CANADIAN SYLLABICS BIBLE-CREE Y
+1540;N;CANADIAN SYLLABICS WEST-CREE Y
+1541;N;CANADIAN SYLLABICS SAYISI YI
+1542;N;CANADIAN SYLLABICS RE
+1543;N;CANADIAN SYLLABICS R-CREE RE
+1544;N;CANADIAN SYLLABICS WEST-CREE LE
+1545;N;CANADIAN SYLLABICS RAAI
+1546;N;CANADIAN SYLLABICS RI
+1547;N;CANADIAN SYLLABICS RII
+1548;N;CANADIAN SYLLABICS RO
+1549;N;CANADIAN SYLLABICS ROO
+154A;N;CANADIAN SYLLABICS WEST-CREE LO
+154B;N;CANADIAN SYLLABICS RA
+154C;N;CANADIAN SYLLABICS RAA
+154D;N;CANADIAN SYLLABICS WEST-CREE LA
+154E;N;CANADIAN SYLLABICS RWAA
+154F;N;CANADIAN SYLLABICS WEST-CREE RWAA
+1550;N;CANADIAN SYLLABICS R
+1551;N;CANADIAN SYLLABICS WEST-CREE R
+1552;N;CANADIAN SYLLABICS MEDIAL R
+1553;N;CANADIAN SYLLABICS FE
+1554;N;CANADIAN SYLLABICS FAAI
+1555;N;CANADIAN SYLLABICS FI
+1556;N;CANADIAN SYLLABICS FII
+1557;N;CANADIAN SYLLABICS FO
+1558;N;CANADIAN SYLLABICS FOO
+1559;N;CANADIAN SYLLABICS FA
+155A;N;CANADIAN SYLLABICS FAA
+155B;N;CANADIAN SYLLABICS FWAA
+155C;N;CANADIAN SYLLABICS WEST-CREE FWAA
+155D;N;CANADIAN SYLLABICS F
+155E;N;CANADIAN SYLLABICS THE
+155F;N;CANADIAN SYLLABICS N-CREE THE
+1560;N;CANADIAN SYLLABICS THI
+1561;N;CANADIAN SYLLABICS N-CREE THI
+1562;N;CANADIAN SYLLABICS THII
+1563;N;CANADIAN SYLLABICS N-CREE THII
+1564;N;CANADIAN SYLLABICS THO
+1565;N;CANADIAN SYLLABICS THOO
+1566;N;CANADIAN SYLLABICS THA
+1567;N;CANADIAN SYLLABICS THAA
+1568;N;CANADIAN SYLLABICS THWAA
+1569;N;CANADIAN SYLLABICS WEST-CREE THWAA
+156A;N;CANADIAN SYLLABICS TH
+156B;N;CANADIAN SYLLABICS TTHE
+156C;N;CANADIAN SYLLABICS TTHI
+156D;N;CANADIAN SYLLABICS TTHO
+156E;N;CANADIAN SYLLABICS TTHA
+156F;N;CANADIAN SYLLABICS TTH
+1570;N;CANADIAN SYLLABICS TYE
+1571;N;CANADIAN SYLLABICS TYI
+1572;N;CANADIAN SYLLABICS TYO
+1573;N;CANADIAN SYLLABICS TYA
+1574;N;CANADIAN SYLLABICS NUNAVIK HE
+1575;N;CANADIAN SYLLABICS NUNAVIK HI
+1576;N;CANADIAN SYLLABICS NUNAVIK HII
+1577;N;CANADIAN SYLLABICS NUNAVIK HO
+1578;N;CANADIAN SYLLABICS NUNAVIK HOO
+1579;N;CANADIAN SYLLABICS NUNAVIK HA
+157A;N;CANADIAN SYLLABICS NUNAVIK HAA
+157B;N;CANADIAN SYLLABICS NUNAVIK H
+157C;N;CANADIAN SYLLABICS NUNAVUT H
+157D;N;CANADIAN SYLLABICS HK
+157E;N;CANADIAN SYLLABICS QAAI
+157F;N;CANADIAN SYLLABICS QI
+1580;N;CANADIAN SYLLABICS QII
+1581;N;CANADIAN SYLLABICS QO
+1582;N;CANADIAN SYLLABICS QOO
+1583;N;CANADIAN SYLLABICS QA
+1584;N;CANADIAN SYLLABICS QAA
+1585;N;CANADIAN SYLLABICS Q
+1586;N;CANADIAN SYLLABICS TLHE
+1587;N;CANADIAN SYLLABICS TLHI
+1588;N;CANADIAN SYLLABICS TLHO
+1589;N;CANADIAN SYLLABICS TLHA
+158A;N;CANADIAN SYLLABICS WEST-CREE RE
+158B;N;CANADIAN SYLLABICS WEST-CREE RI
+158C;N;CANADIAN SYLLABICS WEST-CREE RO
+158D;N;CANADIAN SYLLABICS WEST-CREE RA
+158E;N;CANADIAN SYLLABICS NGAAI
+158F;N;CANADIAN SYLLABICS NGI
+1590;N;CANADIAN SYLLABICS NGII
+1591;N;CANADIAN SYLLABICS NGO
+1592;N;CANADIAN SYLLABICS NGOO
+1593;N;CANADIAN SYLLABICS NGA
+1594;N;CANADIAN SYLLABICS NGAA
+1595;N;CANADIAN SYLLABICS NG
+1596;N;CANADIAN SYLLABICS NNG
+1597;N;CANADIAN SYLLABICS SAYISI SHE
+1598;N;CANADIAN SYLLABICS SAYISI SHI
+1599;N;CANADIAN SYLLABICS SAYISI SHO
+159A;N;CANADIAN SYLLABICS SAYISI SHA
+159B;N;CANADIAN SYLLABICS WOODS-CREE THE
+159C;N;CANADIAN SYLLABICS WOODS-CREE THI
+159D;N;CANADIAN SYLLABICS WOODS-CREE THO
+159E;N;CANADIAN SYLLABICS WOODS-CREE THA
+159F;N;CANADIAN SYLLABICS WOODS-CREE TH
+15A0;N;CANADIAN SYLLABICS LHI
+15A1;N;CANADIAN SYLLABICS LHII
+15A2;N;CANADIAN SYLLABICS LHO
+15A3;N;CANADIAN SYLLABICS LHOO
+15A4;N;CANADIAN SYLLABICS LHA
+15A5;N;CANADIAN SYLLABICS LHAA
+15A6;N;CANADIAN SYLLABICS LH
+15A7;N;CANADIAN SYLLABICS TH-CREE THE
+15A8;N;CANADIAN SYLLABICS TH-CREE THI
+15A9;N;CANADIAN SYLLABICS TH-CREE THII
+15AA;N;CANADIAN SYLLABICS TH-CREE THO
+15AB;N;CANADIAN SYLLABICS TH-CREE THOO
+15AC;N;CANADIAN SYLLABICS TH-CREE THA
+15AD;N;CANADIAN SYLLABICS TH-CREE THAA
+15AE;N;CANADIAN SYLLABICS TH-CREE TH
+15AF;N;CANADIAN SYLLABICS AIVILIK B
+15B0;N;CANADIAN SYLLABICS BLACKFOOT E
+15B1;N;CANADIAN SYLLABICS BLACKFOOT I
+15B2;N;CANADIAN SYLLABICS BLACKFOOT O
+15B3;N;CANADIAN SYLLABICS BLACKFOOT A
+15B4;N;CANADIAN SYLLABICS BLACKFOOT WE
+15B5;N;CANADIAN SYLLABICS BLACKFOOT WI
+15B6;N;CANADIAN SYLLABICS BLACKFOOT WO
+15B7;N;CANADIAN SYLLABICS BLACKFOOT WA
+15B8;N;CANADIAN SYLLABICS BLACKFOOT NE
+15B9;N;CANADIAN SYLLABICS BLACKFOOT NI
+15BA;N;CANADIAN SYLLABICS BLACKFOOT NO
+15BB;N;CANADIAN SYLLABICS BLACKFOOT NA
+15BC;N;CANADIAN SYLLABICS BLACKFOOT KE
+15BD;N;CANADIAN SYLLABICS BLACKFOOT KI
+15BE;N;CANADIAN SYLLABICS BLACKFOOT KO
+15BF;N;CANADIAN SYLLABICS BLACKFOOT KA
+15C0;N;CANADIAN SYLLABICS SAYISI HE
+15C1;N;CANADIAN SYLLABICS SAYISI HI
+15C2;N;CANADIAN SYLLABICS SAYISI HO
+15C3;N;CANADIAN SYLLABICS SAYISI HA
+15C4;N;CANADIAN SYLLABICS CARRIER GHU
+15C5;N;CANADIAN SYLLABICS CARRIER GHO
+15C6;N;CANADIAN SYLLABICS CARRIER GHE
+15C7;N;CANADIAN SYLLABICS CARRIER GHEE
+15C8;N;CANADIAN SYLLABICS CARRIER GHI
+15C9;N;CANADIAN SYLLABICS CARRIER GHA
+15CA;N;CANADIAN SYLLABICS CARRIER RU
+15CB;N;CANADIAN SYLLABICS CARRIER RO
+15CC;N;CANADIAN SYLLABICS CARRIER RE
+15CD;N;CANADIAN SYLLABICS CARRIER REE
+15CE;N;CANADIAN SYLLABICS CARRIER RI
+15CF;N;CANADIAN SYLLABICS CARRIER RA
+15D0;N;CANADIAN SYLLABICS CARRIER WU
+15D1;N;CANADIAN SYLLABICS CARRIER WO
+15D2;N;CANADIAN SYLLABICS CARRIER WE
+15D3;N;CANADIAN SYLLABICS CARRIER WEE
+15D4;N;CANADIAN SYLLABICS CARRIER WI
+15D5;N;CANADIAN SYLLABICS CARRIER WA
+15D6;N;CANADIAN SYLLABICS CARRIER HWU
+15D7;N;CANADIAN SYLLABICS CARRIER HWO
+15D8;N;CANADIAN SYLLABICS CARRIER HWE
+15D9;N;CANADIAN SYLLABICS CARRIER HWEE
+15DA;N;CANADIAN SYLLABICS CARRIER HWI
+15DB;N;CANADIAN SYLLABICS CARRIER HWA
+15DC;N;CANADIAN SYLLABICS CARRIER THU
+15DD;N;CANADIAN SYLLABICS CARRIER THO
+15DE;N;CANADIAN SYLLABICS CARRIER THE
+15DF;N;CANADIAN SYLLABICS CARRIER THEE
+15E0;N;CANADIAN SYLLABICS CARRIER THI
+15E1;N;CANADIAN SYLLABICS CARRIER THA
+15E2;N;CANADIAN SYLLABICS CARRIER TTU
+15E3;N;CANADIAN SYLLABICS CARRIER TTO
+15E4;N;CANADIAN SYLLABICS CARRIER TTE
+15E5;N;CANADIAN SYLLABICS CARRIER TTEE
+15E6;N;CANADIAN SYLLABICS CARRIER TTI
+15E7;N;CANADIAN SYLLABICS CARRIER TTA
+15E8;N;CANADIAN SYLLABICS CARRIER PU
+15E9;N;CANADIAN SYLLABICS CARRIER PO
+15EA;N;CANADIAN SYLLABICS CARRIER PE
+15EB;N;CANADIAN SYLLABICS CARRIER PEE
+15EC;N;CANADIAN SYLLABICS CARRIER PI
+15ED;N;CANADIAN SYLLABICS CARRIER PA
+15EE;N;CANADIAN SYLLABICS CARRIER P
+15EF;N;CANADIAN SYLLABICS CARRIER GU
+15F0;N;CANADIAN SYLLABICS CARRIER GO
+15F1;N;CANADIAN SYLLABICS CARRIER GE
+15F2;N;CANADIAN SYLLABICS CARRIER GEE
+15F3;N;CANADIAN SYLLABICS CARRIER GI
+15F4;N;CANADIAN SYLLABICS CARRIER GA
+15F5;N;CANADIAN SYLLABICS CARRIER KHU
+15F6;N;CANADIAN SYLLABICS CARRIER KHO
+15F7;N;CANADIAN SYLLABICS CARRIER KHE
+15F8;N;CANADIAN SYLLABICS CARRIER KHEE
+15F9;N;CANADIAN SYLLABICS CARRIER KHI
+15FA;N;CANADIAN SYLLABICS CARRIER KHA
+15FB;N;CANADIAN SYLLABICS CARRIER KKU
+15FC;N;CANADIAN SYLLABICS CARRIER KKO
+15FD;N;CANADIAN SYLLABICS CARRIER KKE
+15FE;N;CANADIAN SYLLABICS CARRIER KKEE
+15FF;N;CANADIAN SYLLABICS CARRIER KKI
+1600;N;CANADIAN SYLLABICS CARRIER KKA
+1601;N;CANADIAN SYLLABICS CARRIER KK
+1602;N;CANADIAN SYLLABICS CARRIER NU
+1603;N;CANADIAN SYLLABICS CARRIER NO
+1604;N;CANADIAN SYLLABICS CARRIER NE
+1605;N;CANADIAN SYLLABICS CARRIER NEE
+1606;N;CANADIAN SYLLABICS CARRIER NI
+1607;N;CANADIAN SYLLABICS CARRIER NA
+1608;N;CANADIAN SYLLABICS CARRIER MU
+1609;N;CANADIAN SYLLABICS CARRIER MO
+160A;N;CANADIAN SYLLABICS CARRIER ME
+160B;N;CANADIAN SYLLABICS CARRIER MEE
+160C;N;CANADIAN SYLLABICS CARRIER MI
+160D;N;CANADIAN SYLLABICS CARRIER MA
+160E;N;CANADIAN SYLLABICS CARRIER YU
+160F;N;CANADIAN SYLLABICS CARRIER YO
+1610;N;CANADIAN SYLLABICS CARRIER YE
+1611;N;CANADIAN SYLLABICS CARRIER YEE
+1612;N;CANADIAN SYLLABICS CARRIER YI
+1613;N;CANADIAN SYLLABICS CARRIER YA
+1614;N;CANADIAN SYLLABICS CARRIER JU
+1615;N;CANADIAN SYLLABICS SAYISI JU
+1616;N;CANADIAN SYLLABICS CARRIER JO
+1617;N;CANADIAN SYLLABICS CARRIER JE
+1618;N;CANADIAN SYLLABICS CARRIER JEE
+1619;N;CANADIAN SYLLABICS CARRIER JI
+161A;N;CANADIAN SYLLABICS SAYISI JI
+161B;N;CANADIAN SYLLABICS CARRIER JA
+161C;N;CANADIAN SYLLABICS CARRIER JJU
+161D;N;CANADIAN SYLLABICS CARRIER JJO
+161E;N;CANADIAN SYLLABICS CARRIER JJE
+161F;N;CANADIAN SYLLABICS CARRIER JJEE
+1620;N;CANADIAN SYLLABICS CARRIER JJI
+1621;N;CANADIAN SYLLABICS CARRIER JJA
+1622;N;CANADIAN SYLLABICS CARRIER LU
+1623;N;CANADIAN SYLLABICS CARRIER LO
+1624;N;CANADIAN SYLLABICS CARRIER LE
+1625;N;CANADIAN SYLLABICS CARRIER LEE
+1626;N;CANADIAN SYLLABICS CARRIER LI
+1627;N;CANADIAN SYLLABICS CARRIER LA
+1628;N;CANADIAN SYLLABICS CARRIER DLU
+1629;N;CANADIAN SYLLABICS CARRIER DLO
+162A;N;CANADIAN SYLLABICS CARRIER DLE
+162B;N;CANADIAN SYLLABICS CARRIER DLEE
+162C;N;CANADIAN SYLLABICS CARRIER DLI
+162D;N;CANADIAN SYLLABICS CARRIER DLA
+162E;N;CANADIAN SYLLABICS CARRIER LHU
+162F;N;CANADIAN SYLLABICS CARRIER LHO
+1630;N;CANADIAN SYLLABICS CARRIER LHE
+1631;N;CANADIAN SYLLABICS CARRIER LHEE
+1632;N;CANADIAN SYLLABICS CARRIER LHI
+1633;N;CANADIAN SYLLABICS CARRIER LHA
+1634;N;CANADIAN SYLLABICS CARRIER TLHU
+1635;N;CANADIAN SYLLABICS CARRIER TLHO
+1636;N;CANADIAN SYLLABICS CARRIER TLHE
+1637;N;CANADIAN SYLLABICS CARRIER TLHEE
+1638;N;CANADIAN SYLLABICS CARRIER TLHI
+1639;N;CANADIAN SYLLABICS CARRIER TLHA
+163A;N;CANADIAN SYLLABICS CARRIER TLU
+163B;N;CANADIAN SYLLABICS CARRIER TLO
+163C;N;CANADIAN SYLLABICS CARRIER TLE
+163D;N;CANADIAN SYLLABICS CARRIER TLEE
+163E;N;CANADIAN SYLLABICS CARRIER TLI
+163F;N;CANADIAN SYLLABICS CARRIER TLA
+1640;N;CANADIAN SYLLABICS CARRIER ZU
+1641;N;CANADIAN SYLLABICS CARRIER ZO
+1642;N;CANADIAN SYLLABICS CARRIER ZE
+1643;N;CANADIAN SYLLABICS CARRIER ZEE
+1644;N;CANADIAN SYLLABICS CARRIER ZI
+1645;N;CANADIAN SYLLABICS CARRIER ZA
+1646;N;CANADIAN SYLLABICS CARRIER Z
+1647;N;CANADIAN SYLLABICS CARRIER INITIAL Z
+1648;N;CANADIAN SYLLABICS CARRIER DZU
+1649;N;CANADIAN SYLLABICS CARRIER DZO
+164A;N;CANADIAN SYLLABICS CARRIER DZE
+164B;N;CANADIAN SYLLABICS CARRIER DZEE
+164C;N;CANADIAN SYLLABICS CARRIER DZI
+164D;N;CANADIAN SYLLABICS CARRIER DZA
+164E;N;CANADIAN SYLLABICS CARRIER SU
+164F;N;CANADIAN SYLLABICS CARRIER SO
+1650;N;CANADIAN SYLLABICS CARRIER SE
+1651;N;CANADIAN SYLLABICS CARRIER SEE
+1652;N;CANADIAN SYLLABICS CARRIER SI
+1653;N;CANADIAN SYLLABICS CARRIER SA
+1654;N;CANADIAN SYLLABICS CARRIER SHU
+1655;N;CANADIAN SYLLABICS CARRIER SHO
+1656;N;CANADIAN SYLLABICS CARRIER SHE
+1657;N;CANADIAN SYLLABICS CARRIER SHEE
+1658;N;CANADIAN SYLLABICS CARRIER SHI
+1659;N;CANADIAN SYLLABICS CARRIER SHA
+165A;N;CANADIAN SYLLABICS CARRIER SH
+165B;N;CANADIAN SYLLABICS CARRIER TSU
+165C;N;CANADIAN SYLLABICS CARRIER TSO
+165D;N;CANADIAN SYLLABICS CARRIER TSE
+165E;N;CANADIAN SYLLABICS CARRIER TSEE
+165F;N;CANADIAN SYLLABICS CARRIER TSI
+1660;N;CANADIAN SYLLABICS CARRIER TSA
+1661;N;CANADIAN SYLLABICS CARRIER CHU
+1662;N;CANADIAN SYLLABICS CARRIER CHO
+1663;N;CANADIAN SYLLABICS CARRIER CHE
+1664;N;CANADIAN SYLLABICS CARRIER CHEE
+1665;N;CANADIAN SYLLABICS CARRIER CHI
+1666;N;CANADIAN SYLLABICS CARRIER CHA
+1667;N;CANADIAN SYLLABICS CARRIER TTSU
+1668;N;CANADIAN SYLLABICS CARRIER TTSO
+1669;N;CANADIAN SYLLABICS CARRIER TTSE
+166A;N;CANADIAN SYLLABICS CARRIER TTSEE
+166B;N;CANADIAN SYLLABICS CARRIER TTSI
+166C;N;CANADIAN SYLLABICS CARRIER TTSA
+166D;N;CANADIAN SYLLABICS CHI SIGN
+166E;N;CANADIAN SYLLABICS FULL STOP
+166F;N;CANADIAN SYLLABICS QAI
+1670;N;CANADIAN SYLLABICS NGAI
+1671;N;CANADIAN SYLLABICS NNGI
+1672;N;CANADIAN SYLLABICS NNGII
+1673;N;CANADIAN SYLLABICS NNGO
+1674;N;CANADIAN SYLLABICS NNGOO
+1675;N;CANADIAN SYLLABICS NNGA
+1676;N;CANADIAN SYLLABICS NNGAA
+1680;N;OGHAM SPACE MARK
+1681;N;OGHAM LETTER BEITH
+1682;N;OGHAM LETTER LUIS
+1683;N;OGHAM LETTER FEARN
+1684;N;OGHAM LETTER SAIL
+1685;N;OGHAM LETTER NION
+1686;N;OGHAM LETTER UATH
+1687;N;OGHAM LETTER DAIR
+1688;N;OGHAM LETTER TINNE
+1689;N;OGHAM LETTER COLL
+168A;N;OGHAM LETTER CEIRT
+168B;N;OGHAM LETTER MUIN
+168C;N;OGHAM LETTER GORT
+168D;N;OGHAM LETTER NGEADAL
+168E;N;OGHAM LETTER STRAIF
+168F;N;OGHAM LETTER RUIS
+1690;N;OGHAM LETTER AILM
+1691;N;OGHAM LETTER ONN
+1692;N;OGHAM LETTER UR
+1693;N;OGHAM LETTER EADHADH
+1694;N;OGHAM LETTER IODHADH
+1695;N;OGHAM LETTER EABHADH
+1696;N;OGHAM LETTER OR
+1697;N;OGHAM LETTER UILLEANN
+1698;N;OGHAM LETTER IFIN
+1699;N;OGHAM LETTER EAMHANCHOLL
+169A;N;OGHAM LETTER PEITH
+169B;N;OGHAM FEATHER MARK
+169C;N;OGHAM REVERSED FEATHER MARK
+16A0;N;RUNIC LETTER FEHU FEOH FE F
+16A1;N;RUNIC LETTER V
+16A2;N;RUNIC LETTER URUZ UR U
+16A3;N;RUNIC LETTER YR
+16A4;N;RUNIC LETTER Y
+16A5;N;RUNIC LETTER W
+16A6;N;RUNIC LETTER THURISAZ THURS THORN
+16A7;N;RUNIC LETTER ETH
+16A8;N;RUNIC LETTER ANSUZ A
+16A9;N;RUNIC LETTER OS O
+16AA;N;RUNIC LETTER AC A
+16AB;N;RUNIC LETTER AESC
+16AC;N;RUNIC LETTER LONG-BRANCH-OSS O
+16AD;N;RUNIC LETTER SHORT-TWIG-OSS O
+16AE;N;RUNIC LETTER O
+16AF;N;RUNIC LETTER OE
+16B0;N;RUNIC LETTER ON
+16B1;N;RUNIC LETTER RAIDO RAD REID R
+16B2;N;RUNIC LETTER KAUNA
+16B3;N;RUNIC LETTER CEN
+16B4;N;RUNIC LETTER KAUN K
+16B5;N;RUNIC LETTER G
+16B6;N;RUNIC LETTER ENG
+16B7;N;RUNIC LETTER GEBO GYFU G
+16B8;N;RUNIC LETTER GAR
+16B9;N;RUNIC LETTER WUNJO WYNN W
+16BA;N;RUNIC LETTER HAGLAZ H
+16BB;N;RUNIC LETTER HAEGL H
+16BC;N;RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD;N;RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE;N;RUNIC LETTER NAUDIZ NYD NAUD N
+16BF;N;RUNIC LETTER SHORT-TWIG-NAUD N
+16C0;N;RUNIC LETTER DOTTED-N
+16C1;N;RUNIC LETTER ISAZ IS ISS I
+16C2;N;RUNIC LETTER E
+16C3;N;RUNIC LETTER JERAN J
+16C4;N;RUNIC LETTER GER
+16C5;N;RUNIC LETTER LONG-BRANCH-AR AE
+16C6;N;RUNIC LETTER SHORT-TWIG-AR A
+16C7;N;RUNIC LETTER IWAZ EOH
+16C8;N;RUNIC LETTER PERTHO PEORTH P
+16C9;N;RUNIC LETTER ALGIZ EOLHX
+16CA;N;RUNIC LETTER SOWILO S
+16CB;N;RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC;N;RUNIC LETTER SHORT-TWIG-SOL S
+16CD;N;RUNIC LETTER C
+16CE;N;RUNIC LETTER Z
+16CF;N;RUNIC LETTER TIWAZ TIR TYR T
+16D0;N;RUNIC LETTER SHORT-TWIG-TYR T
+16D1;N;RUNIC LETTER D
+16D2;N;RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3;N;RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4;N;RUNIC LETTER DOTTED-P
+16D5;N;RUNIC LETTER OPEN-P
+16D6;N;RUNIC LETTER EHWAZ EH E
+16D7;N;RUNIC LETTER MANNAZ MAN M
+16D8;N;RUNIC LETTER LONG-BRANCH-MADR M
+16D9;N;RUNIC LETTER SHORT-TWIG-MADR M
+16DA;N;RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB;N;RUNIC LETTER DOTTED-L
+16DC;N;RUNIC LETTER INGWAZ
+16DD;N;RUNIC LETTER ING
+16DE;N;RUNIC LETTER DAGAZ DAEG D
+16DF;N;RUNIC LETTER OTHALAN ETHEL O
+16E0;N;RUNIC LETTER EAR
+16E1;N;RUNIC LETTER IOR
+16E2;N;RUNIC LETTER CWEORTH
+16E3;N;RUNIC LETTER CALC
+16E4;N;RUNIC LETTER CEALC
+16E5;N;RUNIC LETTER STAN
+16E6;N;RUNIC LETTER LONG-BRANCH-YR
+16E7;N;RUNIC LETTER SHORT-TWIG-YR
+16E8;N;RUNIC LETTER ICELANDIC-YR
+16E9;N;RUNIC LETTER Q
+16EA;N;RUNIC LETTER X
+16EB;N;RUNIC SINGLE PUNCTUATION
+16EC;N;RUNIC MULTIPLE PUNCTUATION
+16ED;N;RUNIC CROSS PUNCTUATION
+16EE;N;RUNIC ARLAUG SYMBOL
+16EF;N;RUNIC TVIMADUR SYMBOL
+16F0;N;RUNIC BELGTHOR SYMBOL
+1780;N;KHMER LETTER KA
+1781;N;KHMER LETTER KHA
+1782;N;KHMER LETTER KO
+1783;N;KHMER LETTER KHO
+1784;N;KHMER LETTER NGO
+1785;N;KHMER LETTER CA
+1786;N;KHMER LETTER CHA
+1787;N;KHMER LETTER CO
+1788;N;KHMER LETTER CHO
+1789;N;KHMER LETTER NYO
+178A;N;KHMER LETTER DA
+178B;N;KHMER LETTER TTHA
+178C;N;KHMER LETTER DO
+178D;N;KHMER LETTER TTHO
+178E;N;KHMER LETTER NNO
+178F;N;KHMER LETTER TA
+1790;N;KHMER LETTER THA
+1791;N;KHMER LETTER TO
+1792;N;KHMER LETTER THO
+1793;N;KHMER LETTER NO
+1794;N;KHMER LETTER BA
+1795;N;KHMER LETTER PHA
+1796;N;KHMER LETTER PO
+1797;N;KHMER LETTER PHO
+1798;N;KHMER LETTER MO
+1799;N;KHMER LETTER YO
+179A;N;KHMER LETTER RO
+179B;N;KHMER LETTER LO
+179C;N;KHMER LETTER VO
+179D;N;KHMER LETTER SHA
+179E;N;KHMER LETTER SSO
+179F;N;KHMER LETTER SA
+17A0;N;KHMER LETTER HA
+17A1;N;KHMER LETTER LA
+17A2;N;KHMER LETTER QA
+17A3;N;KHMER INDEPENDENT VOWEL QAQ
+17A4;N;KHMER INDEPENDENT VOWEL QAA
+17A5;N;KHMER INDEPENDENT VOWEL QI
+17A6;N;KHMER INDEPENDENT VOWEL QII
+17A7;N;KHMER INDEPENDENT VOWEL QU
+17A8;N;KHMER INDEPENDENT VOWEL QUK
+17A9;N;KHMER INDEPENDENT VOWEL QUU
+17AA;N;KHMER INDEPENDENT VOWEL QUUV
+17AB;N;KHMER INDEPENDENT VOWEL RY
+17AC;N;KHMER INDEPENDENT VOWEL RYY
+17AD;N;KHMER INDEPENDENT VOWEL LY
+17AE;N;KHMER INDEPENDENT VOWEL LYY
+17AF;N;KHMER INDEPENDENT VOWEL QE
+17B0;N;KHMER INDEPENDENT VOWEL QAI
+17B1;N;KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2;N;KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3;N;KHMER INDEPENDENT VOWEL QAU
+17B4;N;KHMER VOWEL INHERENT AQ
+17B5;N;KHMER VOWEL INHERENT AA
+17B6;N;KHMER VOWEL SIGN AA
+17B7;N;KHMER VOWEL SIGN I
+17B8;N;KHMER VOWEL SIGN II
+17B9;N;KHMER VOWEL SIGN Y
+17BA;N;KHMER VOWEL SIGN YY
+17BB;N;KHMER VOWEL SIGN U
+17BC;N;KHMER VOWEL SIGN UU
+17BD;N;KHMER VOWEL SIGN UA
+17BE;N;KHMER VOWEL SIGN OE
+17BF;N;KHMER VOWEL SIGN YA
+17C0;N;KHMER VOWEL SIGN IE
+17C1;N;KHMER VOWEL SIGN E
+17C2;N;KHMER VOWEL SIGN AE
+17C3;N;KHMER VOWEL SIGN AI
+17C4;N;KHMER VOWEL SIGN OO
+17C5;N;KHMER VOWEL SIGN AU
+17C6;N;KHMER SIGN NIKAHIT
+17C7;N;KHMER SIGN REAHMUK
+17C8;N;KHMER SIGN YUUKALEAPINTU
+17C9;N;KHMER SIGN MUUSIKATOAN
+17CA;N;KHMER SIGN TRIISAP
+17CB;N;KHMER SIGN BANTOC
+17CC;N;KHMER SIGN ROBAT
+17CD;N;KHMER SIGN TOANDAKHIAT
+17CE;N;KHMER SIGN KAKABAT
+17CF;N;KHMER SIGN AHSDA
+17D0;N;KHMER SIGN SAMYOK SANNYA
+17D1;N;KHMER SIGN VIRIAM
+17D2;N;KHMER SIGN COENG
+17D3;N;KHMER SIGN BATHAMASAT
+17D4;N;KHMER SIGN KHAN
+17D5;N;KHMER SIGN BARIYOOSAN
+17D6;N;KHMER SIGN CAMNUC PII KUUH
+17D7;N;KHMER SIGN LEK TOO
+17D8;N;KHMER SIGN BEYYAL
+17D9;N;KHMER SIGN PHNAEK MUAN
+17DA;N;KHMER SIGN KOOMUUT
+17DB;N;KHMER CURRENCY SYMBOL RIEL
+17DC;N;KHMER SIGN AVAKRAHASANYA
+17E0;N;KHMER DIGIT ZERO
+17E1;N;KHMER DIGIT ONE
+17E2;N;KHMER DIGIT TWO
+17E3;N;KHMER DIGIT THREE
+17E4;N;KHMER DIGIT FOUR
+17E5;N;KHMER DIGIT FIVE
+17E6;N;KHMER DIGIT SIX
+17E7;N;KHMER DIGIT SEVEN
+17E8;N;KHMER DIGIT EIGHT
+17E9;N;KHMER DIGIT NINE
+1800;N;MONGOLIAN BIRGA
+1801;N;MONGOLIAN ELLIPSIS
+1802;N;MONGOLIAN COMMA
+1803;N;MONGOLIAN FULL STOP
+1804;N;MONGOLIAN COLON
+1805;N;MONGOLIAN FOUR DOTS
+1806;N;MONGOLIAN TODO SOFT HYPHEN
+1807;N;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808;N;MONGOLIAN MANCHU COMMA
+1809;N;MONGOLIAN MANCHU FULL STOP
+180A;N;MONGOLIAN NIRUGU
+180B;N;MONGOLIAN FREE VARIATION SELECTOR ONE
+180C;N;MONGOLIAN FREE VARIATION SELECTOR TWO
+180D;N;MONGOLIAN FREE VARIATION SELECTOR THREE
+180E;N;MONGOLIAN VOWEL SEPARATOR
+1810;N;MONGOLIAN DIGIT ZERO
+1811;N;MONGOLIAN DIGIT ONE
+1812;N;MONGOLIAN DIGIT TWO
+1813;N;MONGOLIAN DIGIT THREE
+1814;N;MONGOLIAN DIGIT FOUR
+1815;N;MONGOLIAN DIGIT FIVE
+1816;N;MONGOLIAN DIGIT SIX
+1817;N;MONGOLIAN DIGIT SEVEN
+1818;N;MONGOLIAN DIGIT EIGHT
+1819;N;MONGOLIAN DIGIT NINE
+1820;N;MONGOLIAN LETTER A
+1821;N;MONGOLIAN LETTER E
+1822;N;MONGOLIAN LETTER I
+1823;N;MONGOLIAN LETTER O
+1824;N;MONGOLIAN LETTER U
+1825;N;MONGOLIAN LETTER OE
+1826;N;MONGOLIAN LETTER UE
+1827;N;MONGOLIAN LETTER EE
+1828;N;MONGOLIAN LETTER NA
+1829;N;MONGOLIAN LETTER ANG
+182A;N;MONGOLIAN LETTER BA
+182B;N;MONGOLIAN LETTER PA
+182C;N;MONGOLIAN LETTER QA
+182D;N;MONGOLIAN LETTER GA
+182E;N;MONGOLIAN LETTER MA
+182F;N;MONGOLIAN LETTER LA
+1830;N;MONGOLIAN LETTER SA
+1831;N;MONGOLIAN LETTER SHA
+1832;N;MONGOLIAN LETTER TA
+1833;N;MONGOLIAN LETTER DA
+1834;N;MONGOLIAN LETTER CHA
+1835;N;MONGOLIAN LETTER JA
+1836;N;MONGOLIAN LETTER YA
+1837;N;MONGOLIAN LETTER RA
+1838;N;MONGOLIAN LETTER WA
+1839;N;MONGOLIAN LETTER FA
+183A;N;MONGOLIAN LETTER KA
+183B;N;MONGOLIAN LETTER KHA
+183C;N;MONGOLIAN LETTER TSA
+183D;N;MONGOLIAN LETTER ZA
+183E;N;MONGOLIAN LETTER HAA
+183F;N;MONGOLIAN LETTER ZRA
+1840;N;MONGOLIAN LETTER LHA
+1841;N;MONGOLIAN LETTER ZHI
+1842;N;MONGOLIAN LETTER CHI
+1843;N;MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844;N;MONGOLIAN LETTER TODO E
+1845;N;MONGOLIAN LETTER TODO I
+1846;N;MONGOLIAN LETTER TODO O
+1847;N;MONGOLIAN LETTER TODO U
+1848;N;MONGOLIAN LETTER TODO OE
+1849;N;MONGOLIAN LETTER TODO UE
+184A;N;MONGOLIAN LETTER TODO ANG
+184B;N;MONGOLIAN LETTER TODO BA
+184C;N;MONGOLIAN LETTER TODO PA
+184D;N;MONGOLIAN LETTER TODO QA
+184E;N;MONGOLIAN LETTER TODO GA
+184F;N;MONGOLIAN LETTER TODO MA
+1850;N;MONGOLIAN LETTER TODO TA
+1851;N;MONGOLIAN LETTER TODO DA
+1852;N;MONGOLIAN LETTER TODO CHA
+1853;N;MONGOLIAN LETTER TODO JA
+1854;N;MONGOLIAN LETTER TODO TSA
+1855;N;MONGOLIAN LETTER TODO YA
+1856;N;MONGOLIAN LETTER TODO WA
+1857;N;MONGOLIAN LETTER TODO KA
+1858;N;MONGOLIAN LETTER TODO GAA
+1859;N;MONGOLIAN LETTER TODO HAA
+185A;N;MONGOLIAN LETTER TODO JIA
+185B;N;MONGOLIAN LETTER TODO NIA
+185C;N;MONGOLIAN LETTER TODO DZA
+185D;N;MONGOLIAN LETTER SIBE E
+185E;N;MONGOLIAN LETTER SIBE I
+185F;N;MONGOLIAN LETTER SIBE IY
+1860;N;MONGOLIAN LETTER SIBE UE
+1861;N;MONGOLIAN LETTER SIBE U
+1862;N;MONGOLIAN LETTER SIBE ANG
+1863;N;MONGOLIAN LETTER SIBE KA
+1864;N;MONGOLIAN LETTER SIBE GA
+1865;N;MONGOLIAN LETTER SIBE HA
+1866;N;MONGOLIAN LETTER SIBE PA
+1867;N;MONGOLIAN LETTER SIBE SHA
+1868;N;MONGOLIAN LETTER SIBE TA
+1869;N;MONGOLIAN LETTER SIBE DA
+186A;N;MONGOLIAN LETTER SIBE JA
+186B;N;MONGOLIAN LETTER SIBE FA
+186C;N;MONGOLIAN LETTER SIBE GAA
+186D;N;MONGOLIAN LETTER SIBE HAA
+186E;N;MONGOLIAN LETTER SIBE TSA
+186F;N;MONGOLIAN LETTER SIBE ZA
+1870;N;MONGOLIAN LETTER SIBE RAA
+1871;N;MONGOLIAN LETTER SIBE CHA
+1872;N;MONGOLIAN LETTER SIBE ZHA
+1873;N;MONGOLIAN LETTER MANCHU I
+1874;N;MONGOLIAN LETTER MANCHU KA
+1875;N;MONGOLIAN LETTER MANCHU RA
+1876;N;MONGOLIAN LETTER MANCHU FA
+1877;N;MONGOLIAN LETTER MANCHU ZHA
+1880;N;MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881;N;MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882;N;MONGOLIAN LETTER ALI GALI DAMARU
+1883;N;MONGOLIAN LETTER ALI GALI UBADAMA
+1884;N;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885;N;MONGOLIAN LETTER ALI GALI BALUDA
+1886;N;MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887;N;MONGOLIAN LETTER ALI GALI A
+1888;N;MONGOLIAN LETTER ALI GALI I
+1889;N;MONGOLIAN LETTER ALI GALI KA
+188A;N;MONGOLIAN LETTER ALI GALI NGA
+188B;N;MONGOLIAN LETTER ALI GALI CA
+188C;N;MONGOLIAN LETTER ALI GALI TTA
+188D;N;MONGOLIAN LETTER ALI GALI TTHA
+188E;N;MONGOLIAN LETTER ALI GALI DDA
+188F;N;MONGOLIAN LETTER ALI GALI NNA
+1890;N;MONGOLIAN LETTER ALI GALI TA
+1891;N;MONGOLIAN LETTER ALI GALI DA
+1892;N;MONGOLIAN LETTER ALI GALI PA
+1893;N;MONGOLIAN LETTER ALI GALI PHA
+1894;N;MONGOLIAN LETTER ALI GALI SSA
+1895;N;MONGOLIAN LETTER ALI GALI ZHA
+1896;N;MONGOLIAN LETTER ALI GALI ZA
+1897;N;MONGOLIAN LETTER ALI GALI AH
+1898;N;MONGOLIAN LETTER TODO ALI GALI TA
+1899;N;MONGOLIAN LETTER TODO ALI GALI ZHA
+189A;N;MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B;N;MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C;N;MONGOLIAN LETTER MANCHU ALI GALI CA
+189D;N;MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E;N;MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F;N;MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0;N;MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1;N;MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2;N;MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3;N;MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4;N;MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5;N;MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6;N;MONGOLIAN LETTER ALI GALI HALF U
+18A7;N;MONGOLIAN LETTER ALI GALI HALF YA
+18A8;N;MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9;N;MONGOLIAN LETTER ALI GALI DAGALGA
+1E00;N;LATIN CAPITAL LETTER A WITH RING BELOW
+1E01;N;LATIN SMALL LETTER A WITH RING BELOW
+1E02;N;LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03;N;LATIN SMALL LETTER B WITH DOT ABOVE
+1E04;N;LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05;N;LATIN SMALL LETTER B WITH DOT BELOW
+1E06;N;LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07;N;LATIN SMALL LETTER B WITH LINE BELOW
+1E08;N;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09;N;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A;N;LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B;N;LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C;N;LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D;N;LATIN SMALL LETTER D WITH DOT BELOW
+1E0E;N;LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F;N;LATIN SMALL LETTER D WITH LINE BELOW
+1E10;N;LATIN CAPITAL LETTER D WITH CEDILLA
+1E11;N;LATIN SMALL LETTER D WITH CEDILLA
+1E12;N;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13;N;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14;N;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15;N;LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16;N;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17;N;LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18;N;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19;N;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A;N;LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B;N;LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C;N;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D;N;LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E;N;LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F;N;LATIN SMALL LETTER F WITH DOT ABOVE
+1E20;N;LATIN CAPITAL LETTER G WITH MACRON
+1E21;N;LATIN SMALL LETTER G WITH MACRON
+1E22;N;LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23;N;LATIN SMALL LETTER H WITH DOT ABOVE
+1E24;N;LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25;N;LATIN SMALL LETTER H WITH DOT BELOW
+1E26;N;LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27;N;LATIN SMALL LETTER H WITH DIAERESIS
+1E28;N;LATIN CAPITAL LETTER H WITH CEDILLA
+1E29;N;LATIN SMALL LETTER H WITH CEDILLA
+1E2A;N;LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B;N;LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C;N;LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D;N;LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E;N;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F;N;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30;N;LATIN CAPITAL LETTER K WITH ACUTE
+1E31;N;LATIN SMALL LETTER K WITH ACUTE
+1E32;N;LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33;N;LATIN SMALL LETTER K WITH DOT BELOW
+1E34;N;LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35;N;LATIN SMALL LETTER K WITH LINE BELOW
+1E36;N;LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37;N;LATIN SMALL LETTER L WITH DOT BELOW
+1E38;N;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39;N;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A;N;LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B;N;LATIN SMALL LETTER L WITH LINE BELOW
+1E3C;N;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D;N;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E;N;LATIN CAPITAL LETTER M WITH ACUTE
+1E3F;N;LATIN SMALL LETTER M WITH ACUTE
+1E40;N;LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41;N;LATIN SMALL LETTER M WITH DOT ABOVE
+1E42;N;LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43;N;LATIN SMALL LETTER M WITH DOT BELOW
+1E44;N;LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45;N;LATIN SMALL LETTER N WITH DOT ABOVE
+1E46;N;LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47;N;LATIN SMALL LETTER N WITH DOT BELOW
+1E48;N;LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49;N;LATIN SMALL LETTER N WITH LINE BELOW
+1E4A;N;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B;N;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C;N;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D;N;LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E;N;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F;N;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50;N;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51;N;LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52;N;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53;N;LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54;N;LATIN CAPITAL LETTER P WITH ACUTE
+1E55;N;LATIN SMALL LETTER P WITH ACUTE
+1E56;N;LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57;N;LATIN SMALL LETTER P WITH DOT ABOVE
+1E58;N;LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59;N;LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A;N;LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B;N;LATIN SMALL LETTER R WITH DOT BELOW
+1E5C;N;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D;N;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E;N;LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F;N;LATIN SMALL LETTER R WITH LINE BELOW
+1E60;N;LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61;N;LATIN SMALL LETTER S WITH DOT ABOVE
+1E62;N;LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63;N;LATIN SMALL LETTER S WITH DOT BELOW
+1E64;N;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65;N;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66;N;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67;N;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68;N;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69;N;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A;N;LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B;N;LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C;N;LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D;N;LATIN SMALL LETTER T WITH DOT BELOW
+1E6E;N;LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F;N;LATIN SMALL LETTER T WITH LINE BELOW
+1E70;N;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71;N;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72;N;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73;N;LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74;N;LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75;N;LATIN SMALL LETTER U WITH TILDE BELOW
+1E76;N;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77;N;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78;N;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79;N;LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A;N;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B;N;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C;N;LATIN CAPITAL LETTER V WITH TILDE
+1E7D;N;LATIN SMALL LETTER V WITH TILDE
+1E7E;N;LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F;N;LATIN SMALL LETTER V WITH DOT BELOW
+1E80;N;LATIN CAPITAL LETTER W WITH GRAVE
+1E81;N;LATIN SMALL LETTER W WITH GRAVE
+1E82;N;LATIN CAPITAL LETTER W WITH ACUTE
+1E83;N;LATIN SMALL LETTER W WITH ACUTE
+1E84;N;LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85;N;LATIN SMALL LETTER W WITH DIAERESIS
+1E86;N;LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87;N;LATIN SMALL LETTER W WITH DOT ABOVE
+1E88;N;LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89;N;LATIN SMALL LETTER W WITH DOT BELOW
+1E8A;N;LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B;N;LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C;N;LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D;N;LATIN SMALL LETTER X WITH DIAERESIS
+1E8E;N;LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F;N;LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90;N;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91;N;LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92;N;LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93;N;LATIN SMALL LETTER Z WITH DOT BELOW
+1E94;N;LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95;N;LATIN SMALL LETTER Z WITH LINE BELOW
+1E96;N;LATIN SMALL LETTER H WITH LINE BELOW
+1E97;N;LATIN SMALL LETTER T WITH DIAERESIS
+1E98;N;LATIN SMALL LETTER W WITH RING ABOVE
+1E99;N;LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A;N;LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B;N;LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0;N;LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1;N;LATIN SMALL LETTER A WITH DOT BELOW
+1EA2;N;LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3;N;LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4;N;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5;N;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6;N;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7;N;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8;N;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9;N;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA;N;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB;N;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC;N;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD;N;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE;N;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF;N;LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0;N;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1;N;LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2;N;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3;N;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4;N;LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5;N;LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6;N;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7;N;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8;N;LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9;N;LATIN SMALL LETTER E WITH DOT BELOW
+1EBA;N;LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB;N;LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC;N;LATIN CAPITAL LETTER E WITH TILDE
+1EBD;N;LATIN SMALL LETTER E WITH TILDE
+1EBE;N;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF;N;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0;N;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1;N;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2;N;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3;N;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4;N;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5;N;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6;N;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7;N;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8;N;LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9;N;LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA;N;LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB;N;LATIN SMALL LETTER I WITH DOT BELOW
+1ECC;N;LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD;N;LATIN SMALL LETTER O WITH DOT BELOW
+1ECE;N;LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF;N;LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0;N;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1;N;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2;N;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3;N;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4;N;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5;N;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6;N;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7;N;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8;N;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9;N;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA;N;LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB;N;LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC;N;LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD;N;LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE;N;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF;N;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0;N;LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1;N;LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2;N;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3;N;LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4;N;LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5;N;LATIN SMALL LETTER U WITH DOT BELOW
+1EE6;N;LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7;N;LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8;N;LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9;N;LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA;N;LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB;N;LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC;N;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED;N;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE;N;LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF;N;LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0;N;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1;N;LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2;N;LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3;N;LATIN SMALL LETTER Y WITH GRAVE
+1EF4;N;LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5;N;LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6;N;LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7;N;LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8;N;LATIN CAPITAL LETTER Y WITH TILDE
+1EF9;N;LATIN SMALL LETTER Y WITH TILDE
+1F00;N;GREEK SMALL LETTER ALPHA WITH PSILI
+1F01;N;GREEK SMALL LETTER ALPHA WITH DASIA
+1F02;N;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03;N;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04;N;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05;N;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06;N;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07;N;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08;N;GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09;N;GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A;N;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B;N;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C;N;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D;N;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E;N;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F;N;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10;N;GREEK SMALL LETTER EPSILON WITH PSILI
+1F11;N;GREEK SMALL LETTER EPSILON WITH DASIA
+1F12;N;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13;N;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14;N;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15;N;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18;N;GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19;N;GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A;N;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B;N;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C;N;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D;N;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20;N;GREEK SMALL LETTER ETA WITH PSILI
+1F21;N;GREEK SMALL LETTER ETA WITH DASIA
+1F22;N;GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23;N;GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24;N;GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25;N;GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26;N;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27;N;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28;N;GREEK CAPITAL LETTER ETA WITH PSILI
+1F29;N;GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A;N;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B;N;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C;N;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D;N;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E;N;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F;N;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30;N;GREEK SMALL LETTER IOTA WITH PSILI
+1F31;N;GREEK SMALL LETTER IOTA WITH DASIA
+1F32;N;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33;N;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34;N;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35;N;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36;N;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37;N;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38;N;GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39;N;GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A;N;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B;N;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C;N;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D;N;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E;N;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F;N;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40;N;GREEK SMALL LETTER OMICRON WITH PSILI
+1F41;N;GREEK SMALL LETTER OMICRON WITH DASIA
+1F42;N;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43;N;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44;N;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45;N;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48;N;GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49;N;GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A;N;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B;N;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C;N;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D;N;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50;N;GREEK SMALL LETTER UPSILON WITH PSILI
+1F51;N;GREEK SMALL LETTER UPSILON WITH DASIA
+1F52;N;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53;N;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54;N;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55;N;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56;N;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57;N;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59;N;GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B;N;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D;N;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F;N;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60;N;GREEK SMALL LETTER OMEGA WITH PSILI
+1F61;N;GREEK SMALL LETTER OMEGA WITH DASIA
+1F62;N;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63;N;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64;N;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65;N;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66;N;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67;N;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68;N;GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69;N;GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A;N;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B;N;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C;N;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D;N;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E;N;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F;N;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70;N;GREEK SMALL LETTER ALPHA WITH VARIA
+1F71;N;GREEK SMALL LETTER ALPHA WITH OXIA
+1F72;N;GREEK SMALL LETTER EPSILON WITH VARIA
+1F73;N;GREEK SMALL LETTER EPSILON WITH OXIA
+1F74;N;GREEK SMALL LETTER ETA WITH VARIA
+1F75;N;GREEK SMALL LETTER ETA WITH OXIA
+1F76;N;GREEK SMALL LETTER IOTA WITH VARIA
+1F77;N;GREEK SMALL LETTER IOTA WITH OXIA
+1F78;N;GREEK SMALL LETTER OMICRON WITH VARIA
+1F79;N;GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A;N;GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B;N;GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C;N;GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D;N;GREEK SMALL LETTER OMEGA WITH OXIA
+1F80;N;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81;N;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82;N;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83;N;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84;N;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85;N;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86;N;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87;N;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88;N;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89;N;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A;N;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B;N;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C;N;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D;N;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E;N;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F;N;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90;N;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91;N;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92;N;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93;N;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94;N;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95;N;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96;N;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97;N;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98;N;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99;N;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A;N;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B;N;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C;N;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D;N;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E;N;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F;N;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0;N;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1;N;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2;N;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3;N;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4;N;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5;N;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6;N;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7;N;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8;N;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9;N;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA;N;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB;N;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC;N;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD;N;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE;N;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF;N;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0;N;GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1;N;GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2;N;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3;N;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4;N;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6;N;GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7;N;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8;N;GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9;N;GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA;N;GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB;N;GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC;N;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD;N;GREEK KORONIS
+1FBE;N;GREEK PROSGEGRAMMENI
+1FBF;N;GREEK PSILI
+1FC0;N;GREEK PERISPOMENI
+1FC1;N;GREEK DIALYTIKA AND PERISPOMENI
+1FC2;N;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3;N;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4;N;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6;N;GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7;N;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8;N;GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9;N;GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA;N;GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB;N;GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC;N;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD;N;GREEK PSILI AND VARIA
+1FCE;N;GREEK PSILI AND OXIA
+1FCF;N;GREEK PSILI AND PERISPOMENI
+1FD0;N;GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1;N;GREEK SMALL LETTER IOTA WITH MACRON
+1FD2;N;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3;N;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6;N;GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7;N;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8;N;GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9;N;GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA;N;GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB;N;GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD;N;GREEK DASIA AND VARIA
+1FDE;N;GREEK DASIA AND OXIA
+1FDF;N;GREEK DASIA AND PERISPOMENI
+1FE0;N;GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1;N;GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2;N;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3;N;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4;N;GREEK SMALL LETTER RHO WITH PSILI
+1FE5;N;GREEK SMALL LETTER RHO WITH DASIA
+1FE6;N;GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7;N;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8;N;GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9;N;GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA;N;GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB;N;GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC;N;GREEK CAPITAL LETTER RHO WITH DASIA
+1FED;N;GREEK DIALYTIKA AND VARIA
+1FEE;N;GREEK DIALYTIKA AND OXIA
+1FEF;N;GREEK VARIA
+1FF2;N;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3;N;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4;N;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6;N;GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7;N;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8;N;GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9;N;GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA;N;GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB;N;GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC;N;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD;N;GREEK OXIA
+1FFE;N;GREEK DASIA
+2000;N;EN QUAD
+2001;N;EM QUAD
+2002;N;EN SPACE
+2003;N;EM SPACE
+2004;N;THREE-PER-EM SPACE
+2005;N;FOUR-PER-EM SPACE
+2006;N;SIX-PER-EM SPACE
+2007;N;FIGURE SPACE
+2008;N;PUNCTUATION SPACE
+2009;N;THIN SPACE
+200A;N;HAIR SPACE
+200B;N;ZERO WIDTH SPACE
+200C;N;ZERO WIDTH NON-JOINER
+200D;N;ZERO WIDTH JOINER
+200E;N;LEFT-TO-RIGHT MARK
+200F;N;RIGHT-TO-LEFT MARK
+2010;A;HYPHEN
+2011;N;NON-BREAKING HYPHEN
+2012;N;FIGURE DASH
+2013;A;EN DASH
+2014;A;EM DASH
+2015;A;HORIZONTAL BAR
+2016;A;DOUBLE VERTICAL LINE
+2017;N;DOUBLE LOW LINE
+2018;A;LEFT SINGLE QUOTATION MARK
+2019;A;RIGHT SINGLE QUOTATION MARK
+201A;N;SINGLE LOW-9 QUOTATION MARK
+201B;N;SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C;A;LEFT DOUBLE QUOTATION MARK
+201D;A;RIGHT DOUBLE QUOTATION MARK
+201E;N;DOUBLE LOW-9 QUOTATION MARK
+201F;N;DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020;A;DAGGER
+2021;A;DOUBLE DAGGER
+2022;N;BULLET
+2023;N;TRIANGULAR BULLET
+2024;N;ONE DOT LEADER
+2025;A;TWO DOT LEADER
+2026;A;HORIZONTAL ELLIPSIS
+2027;A;HYPHENATION POINT
+2028;N;LINE SEPARATOR
+2029;N;PARAGRAPH SEPARATOR
+202A;N;LEFT-TO-RIGHT EMBEDDING
+202B;N;RIGHT-TO-LEFT EMBEDDING
+202C;N;POP DIRECTIONAL FORMATTING
+202D;N;LEFT-TO-RIGHT OVERRIDE
+202E;N;RIGHT-TO-LEFT OVERRIDE
+202F;N;NARROW NO-BREAK SPACE
+2030;A;PER MILLE SIGN
+2031;N;PER TEN THOUSAND SIGN
+2032;A;PRIME
+2033;A;DOUBLE PRIME
+2034;N;TRIPLE PRIME
+2035;A;REVERSED PRIME
+2036;N;REVERSED DOUBLE PRIME
+2037;N;REVERSED TRIPLE PRIME
+2038;N;CARET
+2039;N;SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A;N;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B;A;REFERENCE MARK
+203C;N;DOUBLE EXCLAMATION MARK
+203D;N;INTERROBANG
+203E;N;OVERLINE
+203F;N;UNDERTIE
+2040;N;CHARACTER TIE
+2041;N;CARET INSERTION POINT
+2042;N;ASTERISM
+2043;N;HYPHEN BULLET
+2044;N;FRACTION SLASH
+2045;N;LEFT SQUARE BRACKET WITH QUILL
+2046;N;RIGHT SQUARE BRACKET WITH QUILL
+2048;N;QUESTION EXCLAMATION MARK
+2049;N;EXCLAMATION QUESTION MARK
+204A;N;TIRONIAN SIGN ET
+204B;N;REVERSED PILCROW SIGN
+204C;N;BLACK LEFTWARDS BULLET
+204D;N;BLACK RIGHTWARDS BULLET
+206A;N;INHIBIT SYMMETRIC SWAPPING
+206B;N;ACTIVATE SYMMETRIC SWAPPING
+206C;N;INHIBIT ARABIC FORM SHAPING
+206D;N;ACTIVATE ARABIC FORM SHAPING
+206E;N;NATIONAL DIGIT SHAPES
+206F;N;NOMINAL DIGIT SHAPES
+2070;N;SUPERSCRIPT ZERO
+2074;A;SUPERSCRIPT FOUR
+2075;N;SUPERSCRIPT FIVE
+2076;N;SUPERSCRIPT SIX
+2077;N;SUPERSCRIPT SEVEN
+2078;N;SUPERSCRIPT EIGHT
+2079;N;SUPERSCRIPT NINE
+207A;N;SUPERSCRIPT PLUS SIGN
+207B;N;SUPERSCRIPT MINUS
+207C;N;SUPERSCRIPT EQUALS SIGN
+207D;N;SUPERSCRIPT LEFT PARENTHESIS
+207E;N;SUPERSCRIPT RIGHT PARENTHESIS
+207F;A;SUPERSCRIPT LATIN SMALL LETTER N
+2080;N;SUBSCRIPT ZERO
+2081;A;SUBSCRIPT ONE
+2082;A;SUBSCRIPT TWO
+2083;A;SUBSCRIPT THREE
+2084;A;SUBSCRIPT FOUR
+2085;N;SUBSCRIPT FIVE
+2086;N;SUBSCRIPT SIX
+2087;N;SUBSCRIPT SEVEN
+2088;N;SUBSCRIPT EIGHT
+2089;N;SUBSCRIPT NINE
+208A;N;SUBSCRIPT PLUS SIGN
+208B;N;SUBSCRIPT MINUS
+208C;N;SUBSCRIPT EQUALS SIGN
+208D;N;SUBSCRIPT LEFT PARENTHESIS
+208E;N;SUBSCRIPT RIGHT PARENTHESIS
+20A0;N;EURO-CURRENCY SIGN
+20A1;N;COLON SIGN
+20A2;N;CRUZEIRO SIGN
+20A3;N;FRENCH FRANC SIGN
+20A4;N;LIRA SIGN
+20A5;N;MILL SIGN
+20A6;N;NAIRA SIGN
+20A7;N;PESETA SIGN
+20A8;N;RUPEE SIGN
+20A9;H;WON SIGN
+20AA;N;NEW SHEQEL SIGN
+20AB;N;DONG SIGN
+20AC;A;EURO SIGN
+20AD;N;KIP SIGN
+20AE;N;TUGRIK SIGN
+20AF;N;DRACHMA SIGN
+20D0;N;COMBINING LEFT HARPOON ABOVE
+20D1;N;COMBINING RIGHT HARPOON ABOVE
+20D2;N;COMBINING LONG VERTICAL LINE OVERLAY
+20D3;N;COMBINING SHORT VERTICAL LINE OVERLAY
+20D4;N;COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5;N;COMBINING CLOCKWISE ARROW ABOVE
+20D6;N;COMBINING LEFT ARROW ABOVE
+20D7;N;COMBINING RIGHT ARROW ABOVE
+20D8;N;COMBINING RING OVERLAY
+20D9;N;COMBINING CLOCKWISE RING OVERLAY
+20DA;N;COMBINING ANTICLOCKWISE RING OVERLAY
+20DB;N;COMBINING THREE DOTS ABOVE
+20DC;N;COMBINING FOUR DOTS ABOVE
+20DD;N;COMBINING ENCLOSING CIRCLE
+20DE;N;COMBINING ENCLOSING SQUARE
+20DF;N;COMBINING ENCLOSING DIAMOND
+20E0;N;COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1;N;COMBINING LEFT RIGHT ARROW ABOVE
+20E2;N;COMBINING ENCLOSING SCREEN
+20E3;N;COMBINING ENCLOSING KEYCAP
+2100;N;ACCOUNT OF
+2101;N;ADDRESSED TO THE SUBJECT
+2102;N;DOUBLE-STRUCK CAPITAL C
+2103;A;DEGREE CELSIUS
+2104;N;CENTRE LINE SYMBOL
+2105;A;CARE OF
+2106;N;CADA UNA
+2107;N;EULER CONSTANT
+2108;N;SCRUPLE
+2109;A;DEGREE FAHRENHEIT
+210A;N;SCRIPT SMALL G
+210B;N;SCRIPT CAPITAL H
+210C;N;BLACK-LETTER CAPITAL H
+210D;N;DOUBLE-STRUCK CAPITAL H
+210E;N;PLANCK CONSTANT
+210F;N;PLANCK CONSTANT OVER TWO PI
+2110;N;SCRIPT CAPITAL I
+2111;N;BLACK-LETTER CAPITAL I
+2112;N;SCRIPT CAPITAL L
+2113;A;SCRIPT SMALL L
+2114;N;L B BAR SYMBOL
+2115;N;DOUBLE-STRUCK CAPITAL N
+2116;N;NUMERO SIGN
+2117;N;SOUND RECORDING COPYRIGHT
+2118;N;SCRIPT CAPITAL P
+2119;N;DOUBLE-STRUCK CAPITAL P
+211A;N;DOUBLE-STRUCK CAPITAL Q
+211B;N;SCRIPT CAPITAL R
+211C;N;BLACK-LETTER CAPITAL R
+211D;N;DOUBLE-STRUCK CAPITAL R
+211E;N;PRESCRIPTION TAKE
+211F;N;RESPONSE
+2120;N;SERVICE MARK
+2121;A;TELEPHONE SIGN
+2122;A;TRADE MARK SIGN
+2123;N;VERSICLE
+2124;N;DOUBLE-STRUCK CAPITAL Z
+2125;N;OUNCE SIGN
+2126;A;OHM SIGN
+2127;N;INVERTED OHM SIGN
+2128;N;BLACK-LETTER CAPITAL Z
+2129;N;TURNED GREEK SMALL LETTER IOTA
+212A;N;KELVIN SIGN
+212B;A;ANGSTROM SIGN
+212C;N;SCRIPT CAPITAL B
+212D;N;BLACK-LETTER CAPITAL C
+212E;N;ESTIMATED SYMBOL
+212F;N;SCRIPT SMALL E
+2130;N;SCRIPT CAPITAL E
+2131;N;SCRIPT CAPITAL F
+2132;N;TURNED CAPITAL F
+2133;N;SCRIPT CAPITAL M
+2134;N;SCRIPT SMALL O
+2135;N;ALEF SYMBOL
+2136;N;BET SYMBOL
+2137;N;GIMEL SYMBOL
+2138;N;DALET SYMBOL
+2139;N;INFORMATION SOURCE
+213A;N;ROTATED CAPITAL Q
+2153;N;VULGAR FRACTION ONE THIRD
+2154;A;VULGAR FRACTION TWO THIRDS
+2155;A;VULGAR FRACTION ONE FIFTH
+2156;N;VULGAR FRACTION TWO FIFTHS
+2157;N;VULGAR FRACTION THREE FIFTHS
+2158;N;VULGAR FRACTION FOUR FIFTHS
+2159;N;VULGAR FRACTION ONE SIXTH
+215A;N;VULGAR FRACTION FIVE SIXTHS
+215B;A;VULGAR FRACTION ONE EIGHTH
+215C;N;VULGAR FRACTION THREE EIGHTHS
+215D;N;VULGAR FRACTION FIVE EIGHTHS
+215E;A;VULGAR FRACTION SEVEN EIGHTHS
+215F;N;FRACTION NUMERATOR ONE
+2160;A;ROMAN NUMERAL ONE
+2161;A;ROMAN NUMERAL TWO
+2162;A;ROMAN NUMERAL THREE
+2163;A;ROMAN NUMERAL FOUR
+2164;A;ROMAN NUMERAL FIVE
+2165;A;ROMAN NUMERAL SIX
+2166;A;ROMAN NUMERAL SEVEN
+2167;A;ROMAN NUMERAL EIGHT
+2168;A;ROMAN NUMERAL NINE
+2169;A;ROMAN NUMERAL TEN
+216A;A;ROMAN NUMERAL ELEVEN
+216B;A;ROMAN NUMERAL TWELVE
+216C;N;ROMAN NUMERAL FIFTY
+216D;N;ROMAN NUMERAL ONE HUNDRED
+216E;N;ROMAN NUMERAL FIVE HUNDRED
+216F;N;ROMAN NUMERAL ONE THOUSAND
+2170;A;SMALL ROMAN NUMERAL ONE
+2171;A;SMALL ROMAN NUMERAL TWO
+2172;A;SMALL ROMAN NUMERAL THREE
+2173;A;SMALL ROMAN NUMERAL FOUR
+2174;A;SMALL ROMAN NUMERAL FIVE
+2175;A;SMALL ROMAN NUMERAL SIX
+2176;A;SMALL ROMAN NUMERAL SEVEN
+2177;A;SMALL ROMAN NUMERAL EIGHT
+2178;A;SMALL ROMAN NUMERAL NINE
+2179;A;SMALL ROMAN NUMERAL TEN
+217A;N;SMALL ROMAN NUMERAL ELEVEN
+217B;N;SMALL ROMAN NUMERAL TWELVE
+217C;N;SMALL ROMAN NUMERAL FIFTY
+217D;N;SMALL ROMAN NUMERAL ONE HUNDRED
+217E;N;SMALL ROMAN NUMERAL FIVE HUNDRED
+217F;N;SMALL ROMAN NUMERAL ONE THOUSAND
+2180;N;ROMAN NUMERAL ONE THOUSAND C D
+2181;N;ROMAN NUMERAL FIVE THOUSAND
+2182;N;ROMAN NUMERAL TEN THOUSAND
+2183;N;ROMAN NUMERAL REVERSED ONE HUNDRED
+2190;A;LEFTWARDS ARROW
+2191;A;UPWARDS ARROW
+2192;A;RIGHTWARDS ARROW
+2193;A;DOWNWARDS ARROW
+2194;A;LEFT RIGHT ARROW
+2195;A;UP DOWN ARROW
+2196;A;NORTH WEST ARROW
+2197;A;NORTH EAST ARROW
+2198;A;SOUTH EAST ARROW
+2199;A;SOUTH WEST ARROW
+219A;N;LEFTWARDS ARROW WITH STROKE
+219B;N;RIGHTWARDS ARROW WITH STROKE
+219C;N;LEFTWARDS WAVE ARROW
+219D;N;RIGHTWARDS WAVE ARROW
+219E;N;LEFTWARDS TWO HEADED ARROW
+219F;N;UPWARDS TWO HEADED ARROW
+21A0;N;RIGHTWARDS TWO HEADED ARROW
+21A1;N;DOWNWARDS TWO HEADED ARROW
+21A2;N;LEFTWARDS ARROW WITH TAIL
+21A3;N;RIGHTWARDS ARROW WITH TAIL
+21A4;N;LEFTWARDS ARROW FROM BAR
+21A5;N;UPWARDS ARROW FROM BAR
+21A6;N;RIGHTWARDS ARROW FROM BAR
+21A7;N;DOWNWARDS ARROW FROM BAR
+21A8;N;UP DOWN ARROW WITH BASE
+21A9;N;LEFTWARDS ARROW WITH HOOK
+21AA;N;RIGHTWARDS ARROW WITH HOOK
+21AB;N;LEFTWARDS ARROW WITH LOOP
+21AC;N;RIGHTWARDS ARROW WITH LOOP
+21AD;N;LEFT RIGHT WAVE ARROW
+21AE;N;LEFT RIGHT ARROW WITH STROKE
+21AF;N;DOWNWARDS ZIGZAG ARROW
+21B0;N;UPWARDS ARROW WITH TIP LEFTWARDS
+21B1;N;UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2;N;DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3;N;DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4;N;RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5;N;DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6;N;ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7;N;CLOCKWISE TOP SEMICIRCLE ARROW
+21B8;N;NORTH WEST ARROW TO LONG BAR
+21B9;N;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA;N;ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB;N;CLOCKWISE OPEN CIRCLE ARROW
+21BC;N;LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD;N;LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE;N;UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF;N;UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0;N;RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1;N;RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2;N;DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3;N;DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4;N;RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5;N;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6;N;LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7;N;LEFTWARDS PAIRED ARROWS
+21C8;N;UPWARDS PAIRED ARROWS
+21C9;N;RIGHTWARDS PAIRED ARROWS
+21CA;N;DOWNWARDS PAIRED ARROWS
+21CB;N;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC;N;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD;N;LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE;N;LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF;N;RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0;N;LEFTWARDS DOUBLE ARROW
+21D1;N;UPWARDS DOUBLE ARROW
+21D2;A;RIGHTWARDS DOUBLE ARROW
+21D3;N;DOWNWARDS DOUBLE ARROW
+21D4;A;LEFT RIGHT DOUBLE ARROW
+21D5;N;UP DOWN DOUBLE ARROW
+21D6;N;NORTH WEST DOUBLE ARROW
+21D7;N;NORTH EAST DOUBLE ARROW
+21D8;N;SOUTH EAST DOUBLE ARROW
+21D9;N;SOUTH WEST DOUBLE ARROW
+21DA;N;LEFTWARDS TRIPLE ARROW
+21DB;N;RIGHTWARDS TRIPLE ARROW
+21DC;N;LEFTWARDS SQUIGGLE ARROW
+21DD;N;RIGHTWARDS SQUIGGLE ARROW
+21DE;N;UPWARDS ARROW WITH DOUBLE STROKE
+21DF;N;DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0;N;LEFTWARDS DASHED ARROW
+21E1;N;UPWARDS DASHED ARROW
+21E2;N;RIGHTWARDS DASHED ARROW
+21E3;N;DOWNWARDS DASHED ARROW
+21E4;N;LEFTWARDS ARROW TO BAR
+21E5;N;RIGHTWARDS ARROW TO BAR
+21E6;N;LEFTWARDS WHITE ARROW
+21E7;N;UPWARDS WHITE ARROW
+21E8;N;RIGHTWARDS WHITE ARROW
+21E9;N;DOWNWARDS WHITE ARROW
+21EA;N;UPWARDS WHITE ARROW FROM BAR
+21EB;N;UPWARDS WHITE ARROW ON PEDESTAL
+21EC;N;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED;N;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE;N;UPWARDS WHITE DOUBLE ARROW
+21EF;N;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0;N;RIGHTWARDS WHITE ARROW FROM WALL
+21F1;N;NORTH WEST ARROW TO CORNER
+21F2;N;SOUTH EAST ARROW TO CORNER
+21F3;N;UP DOWN WHITE ARROW
+2200;A;FOR ALL
+2201;N;COMPLEMENT
+2202;A;PARTIAL DIFFERENTIAL
+2203;A;THERE EXISTS
+2204;N;THERE DOES NOT EXIST
+2205;N;EMPTY SET
+2206;N;INCREMENT
+2207;A;NABLA
+2208;A;ELEMENT OF
+2209;N;NOT AN ELEMENT OF
+220A;N;SMALL ELEMENT OF
+220B;A;CONTAINS AS MEMBER
+220C;N;DOES NOT CONTAIN AS MEMBER
+220D;N;SMALL CONTAINS AS MEMBER
+220E;N;END OF PROOF
+220F;A;N-ARY PRODUCT
+2210;N;N-ARY COPRODUCT
+2211;A;N-ARY SUMMATION
+2212;N;MINUS SIGN
+2213;N;MINUS-OR-PLUS SIGN
+2214;N;DOT PLUS
+2215;A;DIVISION SLASH
+2216;N;SET MINUS
+2217;N;ASTERISK OPERATOR
+2218;N;RING OPERATOR
+2219;N;BULLET OPERATOR
+221A;A;SQUARE ROOT
+221B;N;CUBE ROOT
+221C;N;FOURTH ROOT
+221D;A;PROPORTIONAL TO
+221E;A;INFINITY
+221F;A;RIGHT ANGLE
+2220;A;ANGLE
+2221;N;MEASURED ANGLE
+2222;N;SPHERICAL ANGLE
+2223;A;DIVIDES
+2224;N;DOES NOT DIVIDE
+2225;A;PARALLEL TO
+2226;N;NOT PARALLEL TO
+2227;A;LOGICAL AND
+2228;A;LOGICAL OR
+2229;A;INTERSECTION
+222A;A;UNION
+222B;A;INTEGRAL
+222C;A;DOUBLE INTEGRAL
+222D;N;TRIPLE INTEGRAL
+222E;A;CONTOUR INTEGRAL
+222F;N;SURFACE INTEGRAL
+2230;N;VOLUME INTEGRAL
+2231;N;CLOCKWISE INTEGRAL
+2232;N;CLOCKWISE CONTOUR INTEGRAL
+2233;N;ANTICLOCKWISE CONTOUR INTEGRAL
+2234;A;THEREFORE
+2235;A;BECAUSE
+2236;A;RATIO
+2237;A;PROPORTION
+2238;N;DOT MINUS
+2239;N;EXCESS
+223A;N;GEOMETRIC PROPORTION
+223B;N;HOMOTHETIC
+223C;A;TILDE OPERATOR
+223D;A;REVERSED TILDE
+223E;N;INVERTED LAZY S
+223F;N;SINE WAVE
+2240;N;WREATH PRODUCT
+2241;N;NOT TILDE
+2242;N;MINUS TILDE
+2243;N;ASYMPTOTICALLY EQUAL TO
+2244;N;NOT ASYMPTOTICALLY EQUAL TO
+2245;N;APPROXIMATELY EQUAL TO
+2246;N;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247;N;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248;A;ALMOST EQUAL TO
+2249;N;NOT ALMOST EQUAL TO
+224A;N;ALMOST EQUAL OR EQUAL TO
+224B;N;TRIPLE TILDE
+224C;A;ALL EQUAL TO
+224D;N;EQUIVALENT TO
+224E;N;GEOMETRICALLY EQUIVALENT TO
+224F;N;DIFFERENCE BETWEEN
+2250;N;APPROACHES THE LIMIT
+2251;N;GEOMETRICALLY EQUAL TO
+2252;A;APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253;N;IMAGE OF OR APPROXIMATELY EQUAL TO
+2254;N;COLON EQUALS
+2255;N;EQUALS COLON
+2256;N;RING IN EQUAL TO
+2257;N;RING EQUAL TO
+2258;N;CORRESPONDS TO
+2259;N;ESTIMATES
+225A;N;EQUIANGULAR TO
+225B;N;STAR EQUALS
+225C;N;DELTA EQUAL TO
+225D;N;EQUAL TO BY DEFINITION
+225E;N;MEASURED BY
+225F;N;QUESTIONED EQUAL TO
+2260;A;NOT EQUAL TO
+2261;A;IDENTICAL TO
+2262;N;NOT IDENTICAL TO
+2263;N;STRICTLY EQUIVALENT TO
+2264;A;LESS-THAN OR EQUAL TO
+2265;A;GREATER-THAN OR EQUAL TO
+2266;A;LESS-THAN OVER EQUAL TO
+2267;A;GREATER-THAN OVER EQUAL TO
+2268;N;LESS-THAN BUT NOT EQUAL TO
+2269;N;GREATER-THAN BUT NOT EQUAL TO
+226A;A;MUCH LESS-THAN
+226B;A;MUCH GREATER-THAN
+226C;N;BETWEEN
+226D;N;NOT EQUIVALENT TO
+226E;A;NOT LESS-THAN
+226F;A;NOT GREATER-THAN
+2270;N;NEITHER LESS-THAN NOR EQUAL TO
+2271;N;NEITHER GREATER-THAN NOR EQUAL TO
+2272;N;LESS-THAN OR EQUIVALENT TO
+2273;N;GREATER-THAN OR EQUIVALENT TO
+2274;N;NEITHER LESS-THAN NOR EQUIVALENT TO
+2275;N;NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276;N;LESS-THAN OR GREATER-THAN
+2277;N;GREATER-THAN OR LESS-THAN
+2278;N;NEITHER LESS-THAN NOR GREATER-THAN
+2279;N;NEITHER GREATER-THAN NOR LESS-THAN
+227A;N;PRECEDES
+227B;N;SUCCEEDS
+227C;N;PRECEDES OR EQUAL TO
+227D;N;SUCCEEDS OR EQUAL TO
+227E;N;PRECEDES OR EQUIVALENT TO
+227F;N;SUCCEEDS OR EQUIVALENT TO
+2280;N;DOES NOT PRECEDE
+2281;N;DOES NOT SUCCEED
+2282;A;SUBSET OF
+2283;A;SUPERSET OF
+2284;N;NOT A SUBSET OF
+2285;N;NOT A SUPERSET OF
+2286;A;SUBSET OF OR EQUAL TO
+2287;A;SUPERSET OF OR EQUAL TO
+2288;N;NEITHER A SUBSET OF NOR EQUAL TO
+2289;N;NEITHER A SUPERSET OF NOR EQUAL TO
+228A;N;SUBSET OF WITH NOT EQUAL TO
+228B;N;SUPERSET OF WITH NOT EQUAL TO
+228C;N;MULTISET
+228D;N;MULTISET MULTIPLICATION
+228E;N;MULTISET UNION
+228F;N;SQUARE IMAGE OF
+2290;N;SQUARE ORIGINAL OF
+2291;N;SQUARE IMAGE OF OR EQUAL TO
+2292;N;SQUARE ORIGINAL OF OR EQUAL TO
+2293;N;SQUARE CAP
+2294;N;SQUARE CUP
+2295;A;CIRCLED PLUS
+2296;N;CIRCLED MINUS
+2297;N;CIRCLED TIMES
+2298;N;CIRCLED DIVISION SLASH
+2299;A;CIRCLED DOT OPERATOR
+229A;N;CIRCLED RING OPERATOR
+229B;N;CIRCLED ASTERISK OPERATOR
+229C;N;CIRCLED EQUALS
+229D;N;CIRCLED DASH
+229E;N;SQUARED PLUS
+229F;N;SQUARED MINUS
+22A0;N;SQUARED TIMES
+22A1;N;SQUARED DOT OPERATOR
+22A2;N;RIGHT TACK
+22A3;N;LEFT TACK
+22A4;N;DOWN TACK
+22A5;A;UP TACK
+22A6;N;ASSERTION
+22A7;N;MODELS
+22A8;N;TRUE
+22A9;N;FORCES
+22AA;N;TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB;N;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC;N;DOES NOT PROVE
+22AD;N;NOT TRUE
+22AE;N;DOES NOT FORCE
+22AF;N;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0;N;PRECEDES UNDER RELATION
+22B1;N;SUCCEEDS UNDER RELATION
+22B2;N;NORMAL SUBGROUP OF
+22B3;N;CONTAINS AS NORMAL SUBGROUP
+22B4;N;NORMAL SUBGROUP OF OR EQUAL TO
+22B5;N;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6;N;ORIGINAL OF
+22B7;N;IMAGE OF
+22B8;N;MULTIMAP
+22B9;N;HERMITIAN CONJUGATE MATRIX
+22BA;N;INTERCALATE
+22BB;N;XOR
+22BC;N;NAND
+22BD;N;NOR
+22BE;N;RIGHT ANGLE WITH ARC
+22BF;A;RIGHT TRIANGLE
+22C0;N;N-ARY LOGICAL AND
+22C1;N;N-ARY LOGICAL OR
+22C2;N;N-ARY INTERSECTION
+22C3;N;N-ARY UNION
+22C4;N;DIAMOND OPERATOR
+22C5;N;DOT OPERATOR
+22C6;N;STAR OPERATOR
+22C7;N;DIVISION TIMES
+22C8;N;BOWTIE
+22C9;N;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA;N;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB;N;LEFT SEMIDIRECT PRODUCT
+22CC;N;RIGHT SEMIDIRECT PRODUCT
+22CD;N;REVERSED TILDE EQUALS
+22CE;N;CURLY LOGICAL OR
+22CF;N;CURLY LOGICAL AND
+22D0;N;DOUBLE SUBSET
+22D1;N;DOUBLE SUPERSET
+22D2;N;DOUBLE INTERSECTION
+22D3;N;DOUBLE UNION
+22D4;N;PITCHFORK
+22D5;N;EQUAL AND PARALLEL TO
+22D6;N;LESS-THAN WITH DOT
+22D7;N;GREATER-THAN WITH DOT
+22D8;N;VERY MUCH LESS-THAN
+22D9;N;VERY MUCH GREATER-THAN
+22DA;N;LESS-THAN EQUAL TO OR GREATER-THAN
+22DB;N;GREATER-THAN EQUAL TO OR LESS-THAN
+22DC;N;EQUAL TO OR LESS-THAN
+22DD;N;EQUAL TO OR GREATER-THAN
+22DE;N;EQUAL TO OR PRECEDES
+22DF;N;EQUAL TO OR SUCCEEDS
+22E0;N;DOES NOT PRECEDE OR EQUAL
+22E1;N;DOES NOT SUCCEED OR EQUAL
+22E2;N;NOT SQUARE IMAGE OF OR EQUAL TO
+22E3;N;NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4;N;SQUARE IMAGE OF OR NOT EQUAL TO
+22E5;N;SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6;N;LESS-THAN BUT NOT EQUIVALENT TO
+22E7;N;GREATER-THAN BUT NOT EQUIVALENT TO
+22E8;N;PRECEDES BUT NOT EQUIVALENT TO
+22E9;N;SUCCEEDS BUT NOT EQUIVALENT TO
+22EA;N;NOT NORMAL SUBGROUP OF
+22EB;N;DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC;N;NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED;N;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE;N;VERTICAL ELLIPSIS
+22EF;N;MIDLINE HORIZONTAL ELLIPSIS
+22F0;N;UP RIGHT DIAGONAL ELLIPSIS
+22F1;N;DOWN RIGHT DIAGONAL ELLIPSIS
+2300;N;DIAMETER SIGN
+2301;N;ELECTRIC ARROW
+2302;N;HOUSE
+2303;N;UP ARROWHEAD
+2304;N;DOWN ARROWHEAD
+2305;N;PROJECTIVE
+2306;N;PERSPECTIVE
+2307;N;WAVY LINE
+2308;N;LEFT CEILING
+2309;N;RIGHT CEILING
+230A;N;LEFT FLOOR
+230B;N;RIGHT FLOOR
+230C;N;BOTTOM RIGHT CROP
+230D;N;BOTTOM LEFT CROP
+230E;N;TOP RIGHT CROP
+230F;N;TOP LEFT CROP
+2310;N;REVERSED NOT SIGN
+2311;N;SQUARE LOZENGE
+2312;A;ARC
+2313;N;SEGMENT
+2314;N;SECTOR
+2315;N;TELEPHONE RECORDER
+2316;N;POSITION INDICATOR
+2317;N;VIEWDATA SQUARE
+2318;N;PLACE OF INTEREST SIGN
+2319;N;TURNED NOT SIGN
+231A;N;WATCH
+231B;N;HOURGLASS
+231C;N;TOP LEFT CORNER
+231D;N;TOP RIGHT CORNER
+231E;N;BOTTOM LEFT CORNER
+231F;N;BOTTOM RIGHT CORNER
+2320;N;TOP HALF INTEGRAL
+2321;N;BOTTOM HALF INTEGRAL
+2322;N;FROWN
+2323;N;SMILE
+2324;N;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325;N;OPTION KEY
+2326;N;ERASE TO THE RIGHT
+2327;N;X IN A RECTANGLE BOX
+2328;N;KEYBOARD
+2329;N;LEFT-POINTING ANGLE BRACKET
+232A;N;RIGHT-POINTING ANGLE BRACKET
+232B;N;ERASE TO THE LEFT
+232C;N;BENZENE RING
+232D;N;CYLINDRICITY
+232E;N;ALL AROUND-PROFILE
+232F;N;SYMMETRY
+2330;N;TOTAL RUNOUT
+2331;N;DIMENSION ORIGIN
+2332;N;CONICAL TAPER
+2333;N;SLOPE
+2334;N;COUNTERBORE
+2335;N;COUNTERSINK
+2336;N;APL FUNCTIONAL SYMBOL I-BEAM
+2337;N;APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338;N;APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339;N;APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A;N;APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B;N;APL FUNCTIONAL SYMBOL QUAD JOT
+233C;N;APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D;N;APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E;N;APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F;N;APL FUNCTIONAL SYMBOL SLASH BAR
+2340;N;APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341;N;APL FUNCTIONAL SYMBOL QUAD SLASH
+2342;N;APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343;N;APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344;N;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345;N;APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346;N;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347;N;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348;N;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349;N;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A;N;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B;N;APL FUNCTIONAL SYMBOL DELTA STILE
+234C;N;APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D;N;APL FUNCTIONAL SYMBOL QUAD DELTA
+234E;N;APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F;N;APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350;N;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351;N;APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352;N;APL FUNCTIONAL SYMBOL DEL STILE
+2353;N;APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354;N;APL FUNCTIONAL SYMBOL QUAD DEL
+2355;N;APL FUNCTIONAL SYMBOL UP TACK JOT
+2356;N;APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357;N;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358;N;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359;N;APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A;N;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B;N;APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C;N;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D;N;APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E;N;APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F;N;APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360;N;APL FUNCTIONAL SYMBOL QUAD COLON
+2361;N;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362;N;APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363;N;APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364;N;APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365;N;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366;N;APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367;N;APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368;N;APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369;N;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A;N;APL FUNCTIONAL SYMBOL COMMA BAR
+236B;N;APL FUNCTIONAL SYMBOL DEL TILDE
+236C;N;APL FUNCTIONAL SYMBOL ZILDE
+236D;N;APL FUNCTIONAL SYMBOL STILE TILDE
+236E;N;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F;N;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370;N;APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371;N;APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372;N;APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373;N;APL FUNCTIONAL SYMBOL IOTA
+2374;N;APL FUNCTIONAL SYMBOL RHO
+2375;N;APL FUNCTIONAL SYMBOL OMEGA
+2376;N;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377;N;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378;N;APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379;N;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A;N;APL FUNCTIONAL SYMBOL ALPHA
+237B;N;NOT CHECK MARK
+237D;N;SHOULDERED OPEN BOX
+237E;N;BELL SYMBOL
+237F;N;VERTICAL LINE WITH MIDDLE DOT
+2380;N;INSERTION SYMBOL
+2381;N;CONTINUOUS UNDERLINE SYMBOL
+2382;N;DISCONTINUOUS UNDERLINE SYMBOL
+2383;N;EMPHASIS SYMBOL
+2384;N;COMPOSITION SYMBOL
+2385;N;WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386;N;ENTER SYMBOL
+2387;N;ALTERNATIVE KEY SYMBOL
+2388;N;HELM SYMBOL
+2389;N;CIRCLED HORIZONTAL BAR WITH NOTCH
+238A;N;CIRCLED TRIANGLE DOWN
+238B;N;BROKEN CIRCLE WITH NORTHWEST ARROW
+238C;N;UNDO SYMBOL
+238D;N;MONOSTABLE SYMBOL
+238E;N;HYSTERESIS SYMBOL
+238F;N;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390;N;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391;N;PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392;N;PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393;N;DIRECT CURRENT SYMBOL FORM TWO
+2394;N;SOFTWARE-FUNCTION SYMBOL
+2395;N;APL FUNCTIONAL SYMBOL QUAD
+2396;N;DECIMAL SEPARATOR KEY SYMBOL
+2397;N;PREVIOUS PAGE
+2398;N;NEXT PAGE
+2399;N;PRINT SCREEN SYMBOL
+239A;N;CLEAR SCREEN SYMBOL
+2400;N;SYMBOL FOR NULL
+2401;N;SYMBOL FOR START OF HEADING
+2402;N;SYMBOL FOR START OF TEXT
+2403;N;SYMBOL FOR END OF TEXT
+2404;N;SYMBOL FOR END OF TRANSMISSION
+2405;N;SYMBOL FOR ENQUIRY
+2406;N;SYMBOL FOR ACKNOWLEDGE
+2407;N;SYMBOL FOR BELL
+2408;N;SYMBOL FOR BACKSPACE
+2409;N;SYMBOL FOR HORIZONTAL TABULATION
+240A;N;SYMBOL FOR LINE FEED
+240B;N;SYMBOL FOR VERTICAL TABULATION
+240C;N;SYMBOL FOR FORM FEED
+240D;N;SYMBOL FOR CARRIAGE RETURN
+240E;N;SYMBOL FOR SHIFT OUT
+240F;N;SYMBOL FOR SHIFT IN
+2410;N;SYMBOL FOR DATA LINK ESCAPE
+2411;N;SYMBOL FOR DEVICE CONTROL ONE
+2412;N;SYMBOL FOR DEVICE CONTROL TWO
+2413;N;SYMBOL FOR DEVICE CONTROL THREE
+2414;N;SYMBOL FOR DEVICE CONTROL FOUR
+2415;N;SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416;N;SYMBOL FOR SYNCHRONOUS IDLE
+2417;N;SYMBOL FOR END OF TRANSMISSION BLOCK
+2418;N;SYMBOL FOR CANCEL
+2419;N;SYMBOL FOR END OF MEDIUM
+241A;N;SYMBOL FOR SUBSTITUTE
+241B;N;SYMBOL FOR ESCAPE
+241C;N;SYMBOL FOR FILE SEPARATOR
+241D;N;SYMBOL FOR GROUP SEPARATOR
+241E;N;SYMBOL FOR RECORD SEPARATOR
+241F;N;SYMBOL FOR UNIT SEPARATOR
+2420;N;SYMBOL FOR SPACE
+2421;N;SYMBOL FOR DELETE
+2422;N;BLANK SYMBOL
+2423;N;OPEN BOX
+2424;N;SYMBOL FOR NEWLINE
+2425;N;SYMBOL FOR DELETE FORM TWO
+2426;N;SYMBOL FOR SUBSTITUTE FORM TWO
+2440;N;OCR HOOK
+2441;N;OCR CHAIR
+2442;N;OCR FORK
+2443;N;OCR INVERTED FORK
+2444;N;OCR BELT BUCKLE
+2445;N;OCR BOW TIE
+2446;N;OCR BRANCH BANK IDENTIFICATION
+2447;N;OCR AMOUNT OF CHECK
+2448;N;OCR DASH
+2449;N;OCR CUSTOMER ACCOUNT NUMBER
+244A;N;OCR DOUBLE BACKSLASH
+2460;A;CIRCLED DIGIT ONE
+2461;A;CIRCLED DIGIT TWO
+2462;A;CIRCLED DIGIT THREE
+2463;A;CIRCLED DIGIT FOUR
+2464;A;CIRCLED DIGIT FIVE
+2465;A;CIRCLED DIGIT SIX
+2466;A;CIRCLED DIGIT SEVEN
+2467;A;CIRCLED DIGIT EIGHT
+2468;A;CIRCLED DIGIT NINE
+2469;A;CIRCLED NUMBER TEN
+246A;A;CIRCLED NUMBER ELEVEN
+246B;A;CIRCLED NUMBER TWELVE
+246C;A;CIRCLED NUMBER THIRTEEN
+246D;A;CIRCLED NUMBER FOURTEEN
+246E;A;CIRCLED NUMBER FIFTEEN
+246F;A;CIRCLED NUMBER SIXTEEN
+2470;A;CIRCLED NUMBER SEVENTEEN
+2471;A;CIRCLED NUMBER EIGHTEEN
+2472;A;CIRCLED NUMBER NINETEEN
+2473;A;CIRCLED NUMBER TWENTY
+2474;A;PARENTHESIZED DIGIT ONE
+2475;A;PARENTHESIZED DIGIT TWO
+2476;A;PARENTHESIZED DIGIT THREE
+2477;A;PARENTHESIZED DIGIT FOUR
+2478;A;PARENTHESIZED DIGIT FIVE
+2479;A;PARENTHESIZED DIGIT SIX
+247A;A;PARENTHESIZED DIGIT SEVEN
+247B;A;PARENTHESIZED DIGIT EIGHT
+247C;A;PARENTHESIZED DIGIT NINE
+247D;A;PARENTHESIZED NUMBER TEN
+247E;A;PARENTHESIZED NUMBER ELEVEN
+247F;A;PARENTHESIZED NUMBER TWELVE
+2480;A;PARENTHESIZED NUMBER THIRTEEN
+2481;A;PARENTHESIZED NUMBER FOURTEEN
+2482;A;PARENTHESIZED NUMBER FIFTEEN
+2483;A;PARENTHESIZED NUMBER SIXTEEN
+2484;A;PARENTHESIZED NUMBER SEVENTEEN
+2485;A;PARENTHESIZED NUMBER EIGHTEEN
+2486;A;PARENTHESIZED NUMBER NINETEEN
+2487;A;PARENTHESIZED NUMBER TWENTY
+2488;A;DIGIT ONE FULL STOP
+2489;A;DIGIT TWO FULL STOP
+248A;A;DIGIT THREE FULL STOP
+248B;A;DIGIT FOUR FULL STOP
+248C;A;DIGIT FIVE FULL STOP
+248D;A;DIGIT SIX FULL STOP
+248E;A;DIGIT SEVEN FULL STOP
+248F;A;DIGIT EIGHT FULL STOP
+2490;A;DIGIT NINE FULL STOP
+2491;A;NUMBER TEN FULL STOP
+2492;A;NUMBER ELEVEN FULL STOP
+2493;A;NUMBER TWELVE FULL STOP
+2494;A;NUMBER THIRTEEN FULL STOP
+2495;A;NUMBER FOURTEEN FULL STOP
+2496;A;NUMBER FIFTEEN FULL STOP
+2497;A;NUMBER SIXTEEN FULL STOP
+2498;A;NUMBER SEVENTEEN FULL STOP
+2499;A;NUMBER EIGHTEEN FULL STOP
+249A;A;NUMBER NINETEEN FULL STOP
+249B;A;NUMBER TWENTY FULL STOP
+249C;A;PARENTHESIZED LATIN SMALL LETTER A
+249D;A;PARENTHESIZED LATIN SMALL LETTER B
+249E;A;PARENTHESIZED LATIN SMALL LETTER C
+249F;A;PARENTHESIZED LATIN SMALL LETTER D
+24A0;A;PARENTHESIZED LATIN SMALL LETTER E
+24A1;A;PARENTHESIZED LATIN SMALL LETTER F
+24A2;A;PARENTHESIZED LATIN SMALL LETTER G
+24A3;A;PARENTHESIZED LATIN SMALL LETTER H
+24A4;A;PARENTHESIZED LATIN SMALL LETTER I
+24A5;A;PARENTHESIZED LATIN SMALL LETTER J
+24A6;A;PARENTHESIZED LATIN SMALL LETTER K
+24A7;A;PARENTHESIZED LATIN SMALL LETTER L
+24A8;A;PARENTHESIZED LATIN SMALL LETTER M
+24A9;A;PARENTHESIZED LATIN SMALL LETTER N
+24AA;A;PARENTHESIZED LATIN SMALL LETTER O
+24AB;A;PARENTHESIZED LATIN SMALL LETTER P
+24AC;A;PARENTHESIZED LATIN SMALL LETTER Q
+24AD;A;PARENTHESIZED LATIN SMALL LETTER R
+24AE;A;PARENTHESIZED LATIN SMALL LETTER S
+24AF;A;PARENTHESIZED LATIN SMALL LETTER T
+24B0;A;PARENTHESIZED LATIN SMALL LETTER U
+24B1;A;PARENTHESIZED LATIN SMALL LETTER V
+24B2;A;PARENTHESIZED LATIN SMALL LETTER W
+24B3;A;PARENTHESIZED LATIN SMALL LETTER X
+24B4;A;PARENTHESIZED LATIN SMALL LETTER Y
+24B5;A;PARENTHESIZED LATIN SMALL LETTER Z
+24B6;A;CIRCLED LATIN CAPITAL LETTER A
+24B7;A;CIRCLED LATIN CAPITAL LETTER B
+24B8;A;CIRCLED LATIN CAPITAL LETTER C
+24B9;A;CIRCLED LATIN CAPITAL LETTER D
+24BA;A;CIRCLED LATIN CAPITAL LETTER E
+24BB;A;CIRCLED LATIN CAPITAL LETTER F
+24BC;A;CIRCLED LATIN CAPITAL LETTER G
+24BD;A;CIRCLED LATIN CAPITAL LETTER H
+24BE;A;CIRCLED LATIN CAPITAL LETTER I
+24BF;A;CIRCLED LATIN CAPITAL LETTER J
+24C0;N;CIRCLED LATIN CAPITAL LETTER K
+24C1;N;CIRCLED LATIN CAPITAL LETTER L
+24C2;N;CIRCLED LATIN CAPITAL LETTER M
+24C3;N;CIRCLED LATIN CAPITAL LETTER N
+24C4;N;CIRCLED LATIN CAPITAL LETTER O
+24C5;N;CIRCLED LATIN CAPITAL LETTER P
+24C6;N;CIRCLED LATIN CAPITAL LETTER Q
+24C7;N;CIRCLED LATIN CAPITAL LETTER R
+24C8;N;CIRCLED LATIN CAPITAL LETTER S
+24C9;N;CIRCLED LATIN CAPITAL LETTER T
+24CA;N;CIRCLED LATIN CAPITAL LETTER U
+24CB;N;CIRCLED LATIN CAPITAL LETTER V
+24CC;N;CIRCLED LATIN CAPITAL LETTER W
+24CD;N;CIRCLED LATIN CAPITAL LETTER X
+24CE;N;CIRCLED LATIN CAPITAL LETTER Y
+24CF;N;CIRCLED LATIN CAPITAL LETTER Z
+24D0;A;CIRCLED LATIN SMALL LETTER A
+24D1;A;CIRCLED LATIN SMALL LETTER B
+24D2;A;CIRCLED LATIN SMALL LETTER C
+24D3;A;CIRCLED LATIN SMALL LETTER D
+24D4;A;CIRCLED LATIN SMALL LETTER E
+24D5;A;CIRCLED LATIN SMALL LETTER F
+24D6;A;CIRCLED LATIN SMALL LETTER G
+24D7;A;CIRCLED LATIN SMALL LETTER H
+24D8;A;CIRCLED LATIN SMALL LETTER I
+24D9;A;CIRCLED LATIN SMALL LETTER J
+24DA;A;CIRCLED LATIN SMALL LETTER K
+24DB;A;CIRCLED LATIN SMALL LETTER L
+24DC;A;CIRCLED LATIN SMALL LETTER M
+24DD;A;CIRCLED LATIN SMALL LETTER N
+24DE;A;CIRCLED LATIN SMALL LETTER O
+24DF;A;CIRCLED LATIN SMALL LETTER P
+24E0;A;CIRCLED LATIN SMALL LETTER Q
+24E1;A;CIRCLED LATIN SMALL LETTER R
+24E2;A;CIRCLED LATIN SMALL LETTER S
+24E3;A;CIRCLED LATIN SMALL LETTER T
+24E4;A;CIRCLED LATIN SMALL LETTER U
+24E5;A;CIRCLED LATIN SMALL LETTER V
+24E6;A;CIRCLED LATIN SMALL LETTER W
+24E7;A;CIRCLED LATIN SMALL LETTER X
+24E8;A;CIRCLED LATIN SMALL LETTER Y
+24E9;A;CIRCLED LATIN SMALL LETTER Z
+24EA;N;CIRCLED DIGIT ZERO
+2500;A;BOX DRAWINGS LIGHT HORIZONTAL
+2501;A;BOX DRAWINGS HEAVY HORIZONTAL
+2502;A;BOX DRAWINGS LIGHT VERTICAL
+2503;A;BOX DRAWINGS HEAVY VERTICAL
+2504;A;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505;A;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506;A;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507;A;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508;A;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509;A;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A;A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B;A;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C;A;BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D;A;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E;A;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F;A;BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510;A;BOX DRAWINGS LIGHT DOWN AND LEFT
+2511;A;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512;A;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513;A;BOX DRAWINGS HEAVY DOWN AND LEFT
+2514;A;BOX DRAWINGS LIGHT UP AND RIGHT
+2515;A;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516;A;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517;A;BOX DRAWINGS HEAVY UP AND RIGHT
+2518;A;BOX DRAWINGS LIGHT UP AND LEFT
+2519;A;BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A;A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B;A;BOX DRAWINGS HEAVY UP AND LEFT
+251C;A;BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D;A;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E;A;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F;A;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520;A;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521;A;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522;A;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523;A;BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524;A;BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525;A;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526;A;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527;A;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528;A;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529;A;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A;A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B;A;BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C;A;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D;A;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E;A;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F;A;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530;A;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531;A;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532;A;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533;A;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534;A;BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535;A;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536;A;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537;A;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538;A;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539;A;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A;A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B;A;BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C;A;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D;A;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E;A;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F;A;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540;A;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541;A;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542;A;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543;A;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544;A;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545;A;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546;A;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547;A;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548;A;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549;A;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A;A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B;A;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C;N;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D;N;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E;N;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F;N;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550;A;BOX DRAWINGS DOUBLE HORIZONTAL
+2551;A;BOX DRAWINGS DOUBLE VERTICAL
+2552;A;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553;A;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554;A;BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555;A;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556;A;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557;A;BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558;A;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559;A;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A;A;BOX DRAWINGS DOUBLE UP AND RIGHT
+255B;A;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C;A;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D;A;BOX DRAWINGS DOUBLE UP AND LEFT
+255E;A;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F;A;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560;A;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561;A;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562;A;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563;A;BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564;A;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565;A;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566;A;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567;A;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568;A;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569;A;BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A;A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B;A;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C;A;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D;A;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E;A;BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F;A;BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570;A;BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571;A;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572;A;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573;A;BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574;A;BOX DRAWINGS LIGHT LEFT
+2575;N;BOX DRAWINGS LIGHT UP
+2576;N;BOX DRAWINGS LIGHT RIGHT
+2577;N;BOX DRAWINGS LIGHT DOWN
+2578;N;BOX DRAWINGS HEAVY LEFT
+2579;N;BOX DRAWINGS HEAVY UP
+257A;N;BOX DRAWINGS HEAVY RIGHT
+257B;N;BOX DRAWINGS HEAVY DOWN
+257C;N;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D;N;BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E;N;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F;N;BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580;A;UPPER HALF BLOCK
+2581;A;LOWER ONE EIGHTH BLOCK
+2582;A;LOWER ONE QUARTER BLOCK
+2583;A;LOWER THREE EIGHTHS BLOCK
+2584;A;LOWER HALF BLOCK
+2585;A;LOWER FIVE EIGHTHS BLOCK
+2586;A;LOWER THREE QUARTERS BLOCK
+2587;A;LOWER SEVEN EIGHTHS BLOCK
+2588;A;FULL BLOCK
+2589;A;LEFT SEVEN EIGHTHS BLOCK
+258A;A;LEFT THREE QUARTERS BLOCK
+258B;A;LEFT FIVE EIGHTHS BLOCK
+258C;A;LEFT HALF BLOCK
+258D;A;LEFT THREE EIGHTHS BLOCK
+258E;A;LEFT ONE QUARTER BLOCK
+258F;A;LEFT ONE EIGHTH BLOCK
+2590;N;RIGHT HALF BLOCK
+2591;N;LIGHT SHADE
+2592;A;MEDIUM SHADE
+2593;A;DARK SHADE
+2594;A;UPPER ONE EIGHTH BLOCK
+2595;A;RIGHT ONE EIGHTH BLOCK
+25A0;A;BLACK SQUARE
+25A1;A;WHITE SQUARE
+25A2;N;WHITE SQUARE WITH ROUNDED CORNERS
+25A3;A;WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4;A;SQUARE WITH HORIZONTAL FILL
+25A5;A;SQUARE WITH VERTICAL FILL
+25A6;A;SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7;A;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8;A;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9;A;SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA;N;BLACK SMALL SQUARE
+25AB;N;WHITE SMALL SQUARE
+25AC;N;BLACK RECTANGLE
+25AD;N;WHITE RECTANGLE
+25AE;N;BLACK VERTICAL RECTANGLE
+25AF;N;WHITE VERTICAL RECTANGLE
+25B0;N;BLACK PARALLELOGRAM
+25B1;N;WHITE PARALLELOGRAM
+25B2;A;BLACK UP-POINTING TRIANGLE
+25B3;A;WHITE UP-POINTING TRIANGLE
+25B4;N;BLACK UP-POINTING SMALL TRIANGLE
+25B5;N;WHITE UP-POINTING SMALL TRIANGLE
+25B6;A;BLACK RIGHT-POINTING TRIANGLE
+25B7;A;WHITE RIGHT-POINTING TRIANGLE
+25B8;N;BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9;N;WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA;N;BLACK RIGHT-POINTING POINTER
+25BB;N;WHITE RIGHT-POINTING POINTER
+25BC;A;BLACK DOWN-POINTING TRIANGLE
+25BD;A;WHITE DOWN-POINTING TRIANGLE
+25BE;N;BLACK DOWN-POINTING SMALL TRIANGLE
+25BF;N;WHITE DOWN-POINTING SMALL TRIANGLE
+25C0;A;BLACK LEFT-POINTING TRIANGLE
+25C1;A;WHITE LEFT-POINTING TRIANGLE
+25C2;N;BLACK LEFT-POINTING SMALL TRIANGLE
+25C3;N;WHITE LEFT-POINTING SMALL TRIANGLE
+25C4;N;BLACK LEFT-POINTING POINTER
+25C5;N;WHITE LEFT-POINTING POINTER
+25C6;A;BLACK DIAMOND
+25C7;A;WHITE DIAMOND
+25C8;A;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9;N;FISHEYE
+25CA;N;LOZENGE
+25CB;A;WHITE CIRCLE
+25CC;N;DOTTED CIRCLE
+25CD;N;CIRCLE WITH VERTICAL FILL
+25CE;A;BULLSEYE
+25CF;A;BLACK CIRCLE
+25D0;A;CIRCLE WITH LEFT HALF BLACK
+25D1;A;CIRCLE WITH RIGHT HALF BLACK
+25D2;N;CIRCLE WITH LOWER HALF BLACK
+25D3;N;CIRCLE WITH UPPER HALF BLACK
+25D4;N;CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5;N;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6;N;LEFT HALF BLACK CIRCLE
+25D7;N;RIGHT HALF BLACK CIRCLE
+25D8;N;INVERSE BULLET
+25D9;N;INVERSE WHITE CIRCLE
+25DA;N;UPPER HALF INVERSE WHITE CIRCLE
+25DB;N;LOWER HALF INVERSE WHITE CIRCLE
+25DC;N;UPPER LEFT QUADRANT CIRCULAR ARC
+25DD;N;UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE;N;LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF;N;LOWER LEFT QUADRANT CIRCULAR ARC
+25E0;N;UPPER HALF CIRCLE
+25E1;N;LOWER HALF CIRCLE
+25E2;A;BLACK LOWER RIGHT TRIANGLE
+25E3;A;BLACK LOWER LEFT TRIANGLE
+25E4;A;BLACK UPPER LEFT TRIANGLE
+25E5;A;BLACK UPPER RIGHT TRIANGLE
+25E6;N;WHITE BULLET
+25E7;N;SQUARE WITH LEFT HALF BLACK
+25E8;N;SQUARE WITH RIGHT HALF BLACK
+25E9;N;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA;N;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB;N;WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC;N;WHITE UP-POINTING TRIANGLE WITH DOT
+25ED;N;UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE;N;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF;A;LARGE CIRCLE
+25F0;N;WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1;N;WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2;N;WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3;N;WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4;N;WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5;N;WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6;N;WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7;N;WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+2600;N;BLACK SUN WITH RAYS
+2601;N;CLOUD
+2602;N;UMBRELLA
+2603;N;SNOWMAN
+2604;N;COMET
+2605;A;BLACK STAR
+2606;A;WHITE STAR
+2607;N;LIGHTNING
+2608;N;THUNDERSTORM
+2609;A;SUN
+260A;N;ASCENDING NODE
+260B;N;DESCENDING NODE
+260C;N;CONJUNCTION
+260D;N;OPPOSITION
+260E;A;BLACK TELEPHONE
+260F;A;WHITE TELEPHONE
+2610;N;BALLOT BOX
+2611;N;BALLOT BOX WITH CHECK
+2612;N;BALLOT BOX WITH X
+2613;N;SALTIRE
+2619;N;REVERSED ROTATED FLORAL HEART BULLET
+261A;N;BLACK LEFT POINTING INDEX
+261B;N;BLACK RIGHT POINTING INDEX
+261C;A;WHITE LEFT POINTING INDEX
+261D;N;WHITE UP POINTING INDEX
+261E;A;WHITE RIGHT POINTING INDEX
+261F;N;WHITE DOWN POINTING INDEX
+2620;N;SKULL AND CROSSBONES
+2621;N;CAUTION SIGN
+2622;N;RADIOACTIVE SIGN
+2623;N;BIOHAZARD SIGN
+2624;N;CADUCEUS
+2625;N;ANKH
+2626;N;ORTHODOX CROSS
+2627;N;CHI RHO
+2628;N;CROSS OF LORRAINE
+2629;N;CROSS OF JERUSALEM
+262A;N;STAR AND CRESCENT
+262B;N;FARSI SYMBOL
+262C;N;ADI SHAKTI
+262D;N;HAMMER AND SICKLE
+262E;N;PEACE SYMBOL
+262F;N;YIN YANG
+2630;N;TRIGRAM FOR HEAVEN
+2631;N;TRIGRAM FOR LAKE
+2632;N;TRIGRAM FOR FIRE
+2633;N;TRIGRAM FOR THUNDER
+2634;N;TRIGRAM FOR WIND
+2635;N;TRIGRAM FOR WATER
+2636;N;TRIGRAM FOR MOUNTAIN
+2637;N;TRIGRAM FOR EARTH
+2638;N;WHEEL OF DHARMA
+2639;N;WHITE FROWNING FACE
+263A;N;WHITE SMILING FACE
+263B;N;BLACK SMILING FACE
+263C;N;WHITE SUN WITH RAYS
+263D;N;FIRST QUARTER MOON
+263E;N;LAST QUARTER MOON
+263F;N;MERCURY
+2640;A;FEMALE SIGN
+2641;N;EARTH
+2642;A;MALE SIGN
+2643;N;JUPITER
+2644;N;SATURN
+2645;N;URANUS
+2646;N;NEPTUNE
+2647;N;PLUTO
+2648;N;ARIES
+2649;N;TAURUS
+264A;N;GEMINI
+264B;N;CANCER
+264C;N;LEO
+264D;N;VIRGO
+264E;N;LIBRA
+264F;N;SCORPIUS
+2650;N;SAGITTARIUS
+2651;N;CAPRICORN
+2652;N;AQUARIUS
+2653;N;PISCES
+2654;N;WHITE CHESS KING
+2655;N;WHITE CHESS QUEEN
+2656;N;WHITE CHESS ROOK
+2657;N;WHITE CHESS BISHOP
+2658;N;WHITE CHESS KNIGHT
+2659;N;WHITE CHESS PAWN
+265A;N;BLACK CHESS KING
+265B;N;BLACK CHESS QUEEN
+265C;N;BLACK CHESS ROOK
+265D;N;BLACK CHESS BISHOP
+265E;N;BLACK CHESS KNIGHT
+265F;N;BLACK CHESS PAWN
+2660;A;BLACK SPADE SUIT
+2661;A;WHITE HEART SUIT
+2662;N;WHITE DIAMOND SUIT
+2663;A;BLACK CLUB SUIT
+2664;A;WHITE SPADE SUIT
+2665;A;BLACK HEART SUIT
+2666;N;BLACK DIAMOND SUIT
+2667;A;WHITE CLUB SUIT
+2668;A;HOT SPRINGS
+2669;A;QUARTER NOTE
+266A;A;EIGHTH NOTE
+266B;N;BEAMED EIGHTH NOTES
+266C;A;BEAMED SIXTEENTH NOTES
+266D;A;MUSIC FLAT SIGN
+266E;N;MUSIC NATURAL SIGN
+266F;A;MUSIC SHARP SIGN
+2670;N;WEST SYRIAC CROSS
+2671;N;EAST SYRIAC CROSS
+2701;N;UPPER BLADE SCISSORS
+2702;N;BLACK SCISSORS
+2703;N;LOWER BLADE SCISSORS
+2704;N;WHITE SCISSORS
+2706;N;TELEPHONE LOCATION SIGN
+2707;N;TAPE DRIVE
+2708;N;AIRPLANE
+2709;N;ENVELOPE
+270C;N;VICTORY HAND
+270D;N;WRITING HAND
+270E;N;LOWER RIGHT PENCIL
+270F;N;PENCIL
+2710;N;UPPER RIGHT PENCIL
+2711;N;WHITE NIB
+2712;N;BLACK NIB
+2713;N;CHECK MARK
+2714;N;HEAVY CHECK MARK
+2715;N;MULTIPLICATION X
+2716;N;HEAVY MULTIPLICATION X
+2717;N;BALLOT X
+2718;N;HEAVY BALLOT X
+2719;N;OUTLINED GREEK CROSS
+271A;N;HEAVY GREEK CROSS
+271B;N;OPEN CENTRE CROSS
+271C;N;HEAVY OPEN CENTRE CROSS
+271D;N;LATIN CROSS
+271E;N;SHADOWED WHITE LATIN CROSS
+271F;N;OUTLINED LATIN CROSS
+2720;N;MALTESE CROSS
+2721;N;STAR OF DAVID
+2722;N;FOUR TEARDROP-SPOKED ASTERISK
+2723;N;FOUR BALLOON-SPOKED ASTERISK
+2724;N;HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725;N;FOUR CLUB-SPOKED ASTERISK
+2726;N;BLACK FOUR POINTED STAR
+2727;N;WHITE FOUR POINTED STAR
+2729;N;STRESS OUTLINED WHITE STAR
+272A;N;CIRCLED WHITE STAR
+272B;N;OPEN CENTRE BLACK STAR
+272C;N;BLACK CENTRE WHITE STAR
+272D;N;OUTLINED BLACK STAR
+272E;N;HEAVY OUTLINED BLACK STAR
+272F;N;PINWHEEL STAR
+2730;N;SHADOWED WHITE STAR
+2731;N;HEAVY ASTERISK
+2732;N;OPEN CENTRE ASTERISK
+2733;N;EIGHT SPOKED ASTERISK
+2734;N;EIGHT POINTED BLACK STAR
+2735;N;EIGHT POINTED PINWHEEL STAR
+2736;N;SIX POINTED BLACK STAR
+2737;N;EIGHT POINTED RECTILINEAR BLACK STAR
+2738;N;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739;N;TWELVE POINTED BLACK STAR
+273A;N;SIXTEEN POINTED ASTERISK
+273B;N;TEARDROP-SPOKED ASTERISK
+273C;N;OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D;N;HEAVY TEARDROP-SPOKED ASTERISK
+273E;N;SIX PETALLED BLACK AND WHITE FLORETTE
+273F;N;BLACK FLORETTE
+2740;N;WHITE FLORETTE
+2741;N;EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742;N;CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743;N;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744;N;SNOWFLAKE
+2745;N;TIGHT TRIFOLIATE SNOWFLAKE
+2746;N;HEAVY CHEVRON SNOWFLAKE
+2747;N;SPARKLE
+2748;N;HEAVY SPARKLE
+2749;N;BALLOON-SPOKED ASTERISK
+274A;N;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B;N;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D;N;SHADOWED WHITE CIRCLE
+274F;N;LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750;N;UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751;N;LOWER RIGHT SHADOWED WHITE SQUARE
+2752;N;UPPER RIGHT SHADOWED WHITE SQUARE
+2756;N;BLACK DIAMOND MINUS WHITE X
+2758;N;LIGHT VERTICAL BAR
+2759;N;MEDIUM VERTICAL BAR
+275A;N;HEAVY VERTICAL BAR
+275B;N;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C;N;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D;N;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E;N;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761;N;CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762;N;HEAVY EXCLAMATION MARK ORNAMENT
+2763;N;HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764;N;HEAVY BLACK HEART
+2765;N;ROTATED HEAVY BLACK HEART BULLET
+2766;N;FLORAL HEART
+2767;N;ROTATED FLORAL HEART BULLET
+2776;N;DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777;N;DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778;N;DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779;N;DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A;N;DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B;N;DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C;N;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D;N;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E;N;DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F;N;DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780;N;DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781;N;DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782;N;DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783;N;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784;N;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785;N;DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786;N;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787;N;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788;N;DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789;N;DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793;N;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794;N;HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798;N;HEAVY SOUTH EAST ARROW
+2799;N;HEAVY RIGHTWARDS ARROW
+279A;N;HEAVY NORTH EAST ARROW
+279B;N;DRAFTING POINT RIGHTWARDS ARROW
+279C;N;HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D;N;TRIANGLE-HEADED RIGHTWARDS ARROW
+279E;N;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F;N;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0;N;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1;N;BLACK RIGHTWARDS ARROW
+27A2;N;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3;N;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4;N;BLACK RIGHTWARDS ARROWHEAD
+27A5;N;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6;N;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7;N;SQUAT BLACK RIGHTWARDS ARROW
+27A8;N;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9;N;RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA;N;LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB;N;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC;N;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2;N;CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3;N;WHITE-FEATHERED RIGHTWARDS ARROW
+27B4;N;BLACK-FEATHERED SOUTH EAST ARROW
+27B5;N;BLACK-FEATHERED RIGHTWARDS ARROW
+27B6;N;BLACK-FEATHERED NORTH EAST ARROW
+27B7;N;HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8;N;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9;N;HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA;N;TEARDROP-BARBED RIGHTWARDS ARROW
+27BB;N;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC;N;WEDGE-TAILED RIGHTWARDS ARROW
+27BD;N;HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE;N;OPEN-OUTLINED RIGHTWARDS ARROW
+2800;N;BRAILLE PATTERN BLANK
+2801;N;BRAILLE PATTERN DOTS-1
+2802;N;BRAILLE PATTERN DOTS-2
+2803;N;BRAILLE PATTERN DOTS-12
+2804;N;BRAILLE PATTERN DOTS-3
+2805;N;BRAILLE PATTERN DOTS-13
+2806;N;BRAILLE PATTERN DOTS-23
+2807;N;BRAILLE PATTERN DOTS-123
+2808;N;BRAILLE PATTERN DOTS-4
+2809;N;BRAILLE PATTERN DOTS-14
+280A;N;BRAILLE PATTERN DOTS-24
+280B;N;BRAILLE PATTERN DOTS-124
+280C;N;BRAILLE PATTERN DOTS-34
+280D;N;BRAILLE PATTERN DOTS-134
+280E;N;BRAILLE PATTERN DOTS-234
+280F;N;BRAILLE PATTERN DOTS-1234
+2810;N;BRAILLE PATTERN DOTS-5
+2811;N;BRAILLE PATTERN DOTS-15
+2812;N;BRAILLE PATTERN DOTS-25
+2813;N;BRAILLE PATTERN DOTS-125
+2814;N;BRAILLE PATTERN DOTS-35
+2815;N;BRAILLE PATTERN DOTS-135
+2816;N;BRAILLE PATTERN DOTS-235
+2817;N;BRAILLE PATTERN DOTS-1235
+2818;N;BRAILLE PATTERN DOTS-45
+2819;N;BRAILLE PATTERN DOTS-145
+281A;N;BRAILLE PATTERN DOTS-245
+281B;N;BRAILLE PATTERN DOTS-1245
+281C;N;BRAILLE PATTERN DOTS-345
+281D;N;BRAILLE PATTERN DOTS-1345
+281E;N;BRAILLE PATTERN DOTS-2345
+281F;N;BRAILLE PATTERN DOTS-12345
+2820;N;BRAILLE PATTERN DOTS-6
+2821;N;BRAILLE PATTERN DOTS-16
+2822;N;BRAILLE PATTERN DOTS-26
+2823;N;BRAILLE PATTERN DOTS-126
+2824;N;BRAILLE PATTERN DOTS-36
+2825;N;BRAILLE PATTERN DOTS-136
+2826;N;BRAILLE PATTERN DOTS-236
+2827;N;BRAILLE PATTERN DOTS-1236
+2828;N;BRAILLE PATTERN DOTS-46
+2829;N;BRAILLE PATTERN DOTS-146
+282A;N;BRAILLE PATTERN DOTS-246
+282B;N;BRAILLE PATTERN DOTS-1246
+282C;N;BRAILLE PATTERN DOTS-346
+282D;N;BRAILLE PATTERN DOTS-1346
+282E;N;BRAILLE PATTERN DOTS-2346
+282F;N;BRAILLE PATTERN DOTS-12346
+2830;N;BRAILLE PATTERN DOTS-56
+2831;N;BRAILLE PATTERN DOTS-156
+2832;N;BRAILLE PATTERN DOTS-256
+2833;N;BRAILLE PATTERN DOTS-1256
+2834;N;BRAILLE PATTERN DOTS-356
+2835;N;BRAILLE PATTERN DOTS-1356
+2836;N;BRAILLE PATTERN DOTS-2356
+2837;N;BRAILLE PATTERN DOTS-12356
+2838;N;BRAILLE PATTERN DOTS-456
+2839;N;BRAILLE PATTERN DOTS-1456
+283A;N;BRAILLE PATTERN DOTS-2456
+283B;N;BRAILLE PATTERN DOTS-12456
+283C;N;BRAILLE PATTERN DOTS-3456
+283D;N;BRAILLE PATTERN DOTS-13456
+283E;N;BRAILLE PATTERN DOTS-23456
+283F;N;BRAILLE PATTERN DOTS-123456
+2840;N;BRAILLE PATTERN DOTS-7
+2841;N;BRAILLE PATTERN DOTS-17
+2842;N;BRAILLE PATTERN DOTS-27
+2843;N;BRAILLE PATTERN DOTS-127
+2844;N;BRAILLE PATTERN DOTS-37
+2845;N;BRAILLE PATTERN DOTS-137
+2846;N;BRAILLE PATTERN DOTS-237
+2847;N;BRAILLE PATTERN DOTS-1237
+2848;N;BRAILLE PATTERN DOTS-47
+2849;N;BRAILLE PATTERN DOTS-147
+284A;N;BRAILLE PATTERN DOTS-247
+284B;N;BRAILLE PATTERN DOTS-1247
+284C;N;BRAILLE PATTERN DOTS-347
+284D;N;BRAILLE PATTERN DOTS-1347
+284E;N;BRAILLE PATTERN DOTS-2347
+284F;N;BRAILLE PATTERN DOTS-12347
+2850;N;BRAILLE PATTERN DOTS-57
+2851;N;BRAILLE PATTERN DOTS-157
+2852;N;BRAILLE PATTERN DOTS-257
+2853;N;BRAILLE PATTERN DOTS-1257
+2854;N;BRAILLE PATTERN DOTS-357
+2855;N;BRAILLE PATTERN DOTS-1357
+2856;N;BRAILLE PATTERN DOTS-2357
+2857;N;BRAILLE PATTERN DOTS-12357
+2858;N;BRAILLE PATTERN DOTS-457
+2859;N;BRAILLE PATTERN DOTS-1457
+285A;N;BRAILLE PATTERN DOTS-2457
+285B;N;BRAILLE PATTERN DOTS-12457
+285C;N;BRAILLE PATTERN DOTS-3457
+285D;N;BRAILLE PATTERN DOTS-13457
+285E;N;BRAILLE PATTERN DOTS-23457
+285F;N;BRAILLE PATTERN DOTS-123457
+2860;N;BRAILLE PATTERN DOTS-67
+2861;N;BRAILLE PATTERN DOTS-167
+2862;N;BRAILLE PATTERN DOTS-267
+2863;N;BRAILLE PATTERN DOTS-1267
+2864;N;BRAILLE PATTERN DOTS-367
+2865;N;BRAILLE PATTERN DOTS-1367
+2866;N;BRAILLE PATTERN DOTS-2367
+2867;N;BRAILLE PATTERN DOTS-12367
+2868;N;BRAILLE PATTERN DOTS-467
+2869;N;BRAILLE PATTERN DOTS-1467
+286A;N;BRAILLE PATTERN DOTS-2467
+286B;N;BRAILLE PATTERN DOTS-12467
+286C;N;BRAILLE PATTERN DOTS-3467
+286D;N;BRAILLE PATTERN DOTS-13467
+286E;N;BRAILLE PATTERN DOTS-23467
+286F;N;BRAILLE PATTERN DOTS-123467
+2870;N;BRAILLE PATTERN DOTS-567
+2871;N;BRAILLE PATTERN DOTS-1567
+2872;N;BRAILLE PATTERN DOTS-2567
+2873;N;BRAILLE PATTERN DOTS-12567
+2874;N;BRAILLE PATTERN DOTS-3567
+2875;N;BRAILLE PATTERN DOTS-13567
+2876;N;BRAILLE PATTERN DOTS-23567
+2877;N;BRAILLE PATTERN DOTS-123567
+2878;N;BRAILLE PATTERN DOTS-4567
+2879;N;BRAILLE PATTERN DOTS-14567
+287A;N;BRAILLE PATTERN DOTS-24567
+287B;N;BRAILLE PATTERN DOTS-124567
+287C;N;BRAILLE PATTERN DOTS-34567
+287D;N;BRAILLE PATTERN DOTS-134567
+287E;N;BRAILLE PATTERN DOTS-234567
+287F;N;BRAILLE PATTERN DOTS-1234567
+2880;N;BRAILLE PATTERN DOTS-8
+2881;N;BRAILLE PATTERN DOTS-18
+2882;N;BRAILLE PATTERN DOTS-28
+2883;N;BRAILLE PATTERN DOTS-128
+2884;N;BRAILLE PATTERN DOTS-38
+2885;N;BRAILLE PATTERN DOTS-138
+2886;N;BRAILLE PATTERN DOTS-238
+2887;N;BRAILLE PATTERN DOTS-1238
+2888;N;BRAILLE PATTERN DOTS-48
+2889;N;BRAILLE PATTERN DOTS-148
+288A;N;BRAILLE PATTERN DOTS-248
+288B;N;BRAILLE PATTERN DOTS-1248
+288C;N;BRAILLE PATTERN DOTS-348
+288D;N;BRAILLE PATTERN DOTS-1348
+288E;N;BRAILLE PATTERN DOTS-2348
+288F;N;BRAILLE PATTERN DOTS-12348
+2890;N;BRAILLE PATTERN DOTS-58
+2891;N;BRAILLE PATTERN DOTS-158
+2892;N;BRAILLE PATTERN DOTS-258
+2893;N;BRAILLE PATTERN DOTS-1258
+2894;N;BRAILLE PATTERN DOTS-358
+2895;N;BRAILLE PATTERN DOTS-1358
+2896;N;BRAILLE PATTERN DOTS-2358
+2897;N;BRAILLE PATTERN DOTS-12358
+2898;N;BRAILLE PATTERN DOTS-458
+2899;N;BRAILLE PATTERN DOTS-1458
+289A;N;BRAILLE PATTERN DOTS-2458
+289B;N;BRAILLE PATTERN DOTS-12458
+289C;N;BRAILLE PATTERN DOTS-3458
+289D;N;BRAILLE PATTERN DOTS-13458
+289E;N;BRAILLE PATTERN DOTS-23458
+289F;N;BRAILLE PATTERN DOTS-123458
+28A0;N;BRAILLE PATTERN DOTS-68
+28A1;N;BRAILLE PATTERN DOTS-168
+28A2;N;BRAILLE PATTERN DOTS-268
+28A3;N;BRAILLE PATTERN DOTS-1268
+28A4;N;BRAILLE PATTERN DOTS-368
+28A5;N;BRAILLE PATTERN DOTS-1368
+28A6;N;BRAILLE PATTERN DOTS-2368
+28A7;N;BRAILLE PATTERN DOTS-12368
+28A8;N;BRAILLE PATTERN DOTS-468
+28A9;N;BRAILLE PATTERN DOTS-1468
+28AA;N;BRAILLE PATTERN DOTS-2468
+28AB;N;BRAILLE PATTERN DOTS-12468
+28AC;N;BRAILLE PATTERN DOTS-3468
+28AD;N;BRAILLE PATTERN DOTS-13468
+28AE;N;BRAILLE PATTERN DOTS-23468
+28AF;N;BRAILLE PATTERN DOTS-123468
+28B0;N;BRAILLE PATTERN DOTS-568
+28B1;N;BRAILLE PATTERN DOTS-1568
+28B2;N;BRAILLE PATTERN DOTS-2568
+28B3;N;BRAILLE PATTERN DOTS-12568
+28B4;N;BRAILLE PATTERN DOTS-3568
+28B5;N;BRAILLE PATTERN DOTS-13568
+28B6;N;BRAILLE PATTERN DOTS-23568
+28B7;N;BRAILLE PATTERN DOTS-123568
+28B8;N;BRAILLE PATTERN DOTS-4568
+28B9;N;BRAILLE PATTERN DOTS-14568
+28BA;N;BRAILLE PATTERN DOTS-24568
+28BB;N;BRAILLE PATTERN DOTS-124568
+28BC;N;BRAILLE PATTERN DOTS-34568
+28BD;N;BRAILLE PATTERN DOTS-134568
+28BE;N;BRAILLE PATTERN DOTS-234568
+28BF;N;BRAILLE PATTERN DOTS-1234568
+28C0;N;BRAILLE PATTERN DOTS-78
+28C1;N;BRAILLE PATTERN DOTS-178
+28C2;N;BRAILLE PATTERN DOTS-278
+28C3;N;BRAILLE PATTERN DOTS-1278
+28C4;N;BRAILLE PATTERN DOTS-378
+28C5;N;BRAILLE PATTERN DOTS-1378
+28C6;N;BRAILLE PATTERN DOTS-2378
+28C7;N;BRAILLE PATTERN DOTS-12378
+28C8;N;BRAILLE PATTERN DOTS-478
+28C9;N;BRAILLE PATTERN DOTS-1478
+28CA;N;BRAILLE PATTERN DOTS-2478
+28CB;N;BRAILLE PATTERN DOTS-12478
+28CC;N;BRAILLE PATTERN DOTS-3478
+28CD;N;BRAILLE PATTERN DOTS-13478
+28CE;N;BRAILLE PATTERN DOTS-23478
+28CF;N;BRAILLE PATTERN DOTS-123478
+28D0;N;BRAILLE PATTERN DOTS-578
+28D1;N;BRAILLE PATTERN DOTS-1578
+28D2;N;BRAILLE PATTERN DOTS-2578
+28D3;N;BRAILLE PATTERN DOTS-12578
+28D4;N;BRAILLE PATTERN DOTS-3578
+28D5;N;BRAILLE PATTERN DOTS-13578
+28D6;N;BRAILLE PATTERN DOTS-23578
+28D7;N;BRAILLE PATTERN DOTS-123578
+28D8;N;BRAILLE PATTERN DOTS-4578
+28D9;N;BRAILLE PATTERN DOTS-14578
+28DA;N;BRAILLE PATTERN DOTS-24578
+28DB;N;BRAILLE PATTERN DOTS-124578
+28DC;N;BRAILLE PATTERN DOTS-34578
+28DD;N;BRAILLE PATTERN DOTS-134578
+28DE;N;BRAILLE PATTERN DOTS-234578
+28DF;N;BRAILLE PATTERN DOTS-1234578
+28E0;N;BRAILLE PATTERN DOTS-678
+28E1;N;BRAILLE PATTERN DOTS-1678
+28E2;N;BRAILLE PATTERN DOTS-2678
+28E3;N;BRAILLE PATTERN DOTS-12678
+28E4;N;BRAILLE PATTERN DOTS-3678
+28E5;N;BRAILLE PATTERN DOTS-13678
+28E6;N;BRAILLE PATTERN DOTS-23678
+28E7;N;BRAILLE PATTERN DOTS-123678
+28E8;N;BRAILLE PATTERN DOTS-4678
+28E9;N;BRAILLE PATTERN DOTS-14678
+28EA;N;BRAILLE PATTERN DOTS-24678
+28EB;N;BRAILLE PATTERN DOTS-124678
+28EC;N;BRAILLE PATTERN DOTS-34678
+28ED;N;BRAILLE PATTERN DOTS-134678
+28EE;N;BRAILLE PATTERN DOTS-234678
+28EF;N;BRAILLE PATTERN DOTS-1234678
+28F0;N;BRAILLE PATTERN DOTS-5678
+28F1;N;BRAILLE PATTERN DOTS-15678
+28F2;N;BRAILLE PATTERN DOTS-25678
+28F3;N;BRAILLE PATTERN DOTS-125678
+28F4;N;BRAILLE PATTERN DOTS-35678
+28F5;N;BRAILLE PATTERN DOTS-135678
+28F6;N;BRAILLE PATTERN DOTS-235678
+28F7;N;BRAILLE PATTERN DOTS-1235678
+28F8;N;BRAILLE PATTERN DOTS-45678
+28F9;N;BRAILLE PATTERN DOTS-145678
+28FA;N;BRAILLE PATTERN DOTS-245678
+28FB;N;BRAILLE PATTERN DOTS-1245678
+28FC;N;BRAILLE PATTERN DOTS-345678
+28FD;N;BRAILLE PATTERN DOTS-1345678
+28FE;N;BRAILLE PATTERN DOTS-2345678
+28FF;N;BRAILLE PATTERN DOTS-12345678
+2E80;W;CJK RADICAL REPEAT
+2E81;W;CJK RADICAL CLIFF
+2E82;W;CJK RADICAL SECOND ONE
+2E83;W;CJK RADICAL SECOND TWO
+2E84;W;CJK RADICAL SECOND THREE
+2E85;W;CJK RADICAL PERSON
+2E86;W;CJK RADICAL BOX
+2E87;W;CJK RADICAL TABLE
+2E88;W;CJK RADICAL KNIFE ONE
+2E89;W;CJK RADICAL KNIFE TWO
+2E8A;W;CJK RADICAL DIVINATION
+2E8B;W;CJK RADICAL SEAL
+2E8C;W;CJK RADICAL SMALL ONE
+2E8D;W;CJK RADICAL SMALL TWO
+2E8E;W;CJK RADICAL LAME ONE
+2E8F;W;CJK RADICAL LAME TWO
+2E90;W;CJK RADICAL LAME THREE
+2E91;W;CJK RADICAL LAME FOUR
+2E92;W;CJK RADICAL SNAKE
+2E93;W;CJK RADICAL THREAD
+2E94;W;CJK RADICAL SNOUT ONE
+2E95;W;CJK RADICAL SNOUT TWO
+2E96;W;CJK RADICAL HEART ONE
+2E97;W;CJK RADICAL HEART TWO
+2E98;W;CJK RADICAL HAND
+2E99;W;CJK RADICAL RAP
+2E9B;W;CJK RADICAL CHOKE
+2E9C;W;CJK RADICAL SUN
+2E9D;W;CJK RADICAL MOON
+2E9E;W;CJK RADICAL DEATH
+2E9F;W;CJK RADICAL MOTHER
+2EA0;W;CJK RADICAL CIVILIAN
+2EA1;W;CJK RADICAL WATER ONE
+2EA2;W;CJK RADICAL WATER TWO
+2EA3;W;CJK RADICAL FIRE
+2EA4;W;CJK RADICAL PAW ONE
+2EA5;W;CJK RADICAL PAW TWO
+2EA6;W;CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7;W;CJK RADICAL COW
+2EA8;W;CJK RADICAL DOG
+2EA9;W;CJK RADICAL JADE
+2EAA;W;CJK RADICAL BOLT OF CLOTH
+2EAB;W;CJK RADICAL EYE
+2EAC;W;CJK RADICAL SPIRIT ONE
+2EAD;W;CJK RADICAL SPIRIT TWO
+2EAE;W;CJK RADICAL BAMBOO
+2EAF;W;CJK RADICAL SILK
+2EB0;W;CJK RADICAL C-SIMPLIFIED SILK
+2EB1;W;CJK RADICAL NET ONE
+2EB2;W;CJK RADICAL NET TWO
+2EB3;W;CJK RADICAL NET THREE
+2EB4;W;CJK RADICAL NET FOUR
+2EB5;W;CJK RADICAL MESH
+2EB6;W;CJK RADICAL SHEEP
+2EB7;W;CJK RADICAL RAM
+2EB8;W;CJK RADICAL EWE
+2EB9;W;CJK RADICAL OLD
+2EBA;W;CJK RADICAL BRUSH ONE
+2EBB;W;CJK RADICAL BRUSH TWO
+2EBC;W;CJK RADICAL MEAT
+2EBD;W;CJK RADICAL MORTAR
+2EBE;W;CJK RADICAL GRASS ONE
+2EBF;W;CJK RADICAL GRASS TWO
+2EC0;W;CJK RADICAL GRASS THREE
+2EC1;W;CJK RADICAL TIGER
+2EC2;W;CJK RADICAL CLOTHES
+2EC3;W;CJK RADICAL WEST ONE
+2EC4;W;CJK RADICAL WEST TWO
+2EC5;W;CJK RADICAL C-SIMPLIFIED SEE
+2EC6;W;CJK RADICAL SIMPLIFIED HORN
+2EC7;W;CJK RADICAL HORN
+2EC8;W;CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9;W;CJK RADICAL C-SIMPLIFIED SHELL
+2ECA;W;CJK RADICAL FOOT
+2ECB;W;CJK RADICAL C-SIMPLIFIED CART
+2ECC;W;CJK RADICAL SIMPLIFIED WALK
+2ECD;W;CJK RADICAL WALK ONE
+2ECE;W;CJK RADICAL WALK TWO
+2ECF;W;CJK RADICAL CITY
+2ED0;W;CJK RADICAL C-SIMPLIFIED GOLD
+2ED1;W;CJK RADICAL LONG ONE
+2ED2;W;CJK RADICAL LONG TWO
+2ED3;W;CJK RADICAL C-SIMPLIFIED LONG
+2ED4;W;CJK RADICAL C-SIMPLIFIED GATE
+2ED5;W;CJK RADICAL MOUND ONE
+2ED6;W;CJK RADICAL MOUND TWO
+2ED7;W;CJK RADICAL RAIN
+2ED8;W;CJK RADICAL BLUE
+2ED9;W;CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA;W;CJK RADICAL C-SIMPLIFIED LEAF
+2EDB;W;CJK RADICAL C-SIMPLIFIED WIND
+2EDC;W;CJK RADICAL C-SIMPLIFIED FLY
+2EDD;W;CJK RADICAL EAT ONE
+2EDE;W;CJK RADICAL EAT TWO
+2EDF;W;CJK RADICAL EAT THREE
+2EE0;W;CJK RADICAL C-SIMPLIFIED EAT
+2EE1;W;CJK RADICAL HEAD
+2EE2;W;CJK RADICAL C-SIMPLIFIED HORSE
+2EE3;W;CJK RADICAL BONE
+2EE4;W;CJK RADICAL GHOST
+2EE5;W;CJK RADICAL C-SIMPLIFIED FISH
+2EE6;W;CJK RADICAL C-SIMPLIFIED BIRD
+2EE7;W;CJK RADICAL C-SIMPLIFIED SALT
+2EE8;W;CJK RADICAL SIMPLIFIED WHEAT
+2EE9;W;CJK RADICAL SIMPLIFIED YELLOW
+2EEA;W;CJK RADICAL C-SIMPLIFIED FROG
+2EEB;W;CJK RADICAL J-SIMPLIFIED EVEN
+2EEC;W;CJK RADICAL C-SIMPLIFIED EVEN
+2EED;W;CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE;W;CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF;W;CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0;W;CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1;W;CJK RADICAL TURTLE
+2EF2;W;CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3;W;CJK RADICAL C-SIMPLIFIED TURTLE
+2F00;W;KANGXI RADICAL ONE
+2F01;W;KANGXI RADICAL LINE
+2F02;W;KANGXI RADICAL DOT
+2F03;W;KANGXI RADICAL SLASH
+2F04;W;KANGXI RADICAL SECOND
+2F05;W;KANGXI RADICAL HOOK
+2F06;W;KANGXI RADICAL TWO
+2F07;W;KANGXI RADICAL LID
+2F08;W;KANGXI RADICAL MAN
+2F09;W;KANGXI RADICAL LEGS
+2F0A;W;KANGXI RADICAL ENTER
+2F0B;W;KANGXI RADICAL EIGHT
+2F0C;W;KANGXI RADICAL DOWN BOX
+2F0D;W;KANGXI RADICAL COVER
+2F0E;W;KANGXI RADICAL ICE
+2F0F;W;KANGXI RADICAL TABLE
+2F10;W;KANGXI RADICAL OPEN BOX
+2F11;W;KANGXI RADICAL KNIFE
+2F12;W;KANGXI RADICAL POWER
+2F13;W;KANGXI RADICAL WRAP
+2F14;W;KANGXI RADICAL SPOON
+2F15;W;KANGXI RADICAL RIGHT OPEN BOX
+2F16;W;KANGXI RADICAL HIDING ENCLOSURE
+2F17;W;KANGXI RADICAL TEN
+2F18;W;KANGXI RADICAL DIVINATION
+2F19;W;KANGXI RADICAL SEAL
+2F1A;W;KANGXI RADICAL CLIFF
+2F1B;W;KANGXI RADICAL PRIVATE
+2F1C;W;KANGXI RADICAL AGAIN
+2F1D;W;KANGXI RADICAL MOUTH
+2F1E;W;KANGXI RADICAL ENCLOSURE
+2F1F;W;KANGXI RADICAL EARTH
+2F20;W;KANGXI RADICAL SCHOLAR
+2F21;W;KANGXI RADICAL GO
+2F22;W;KANGXI RADICAL GO SLOWLY
+2F23;W;KANGXI RADICAL EVENING
+2F24;W;KANGXI RADICAL BIG
+2F25;W;KANGXI RADICAL WOMAN
+2F26;W;KANGXI RADICAL CHILD
+2F27;W;KANGXI RADICAL ROOF
+2F28;W;KANGXI RADICAL INCH
+2F29;W;KANGXI RADICAL SMALL
+2F2A;W;KANGXI RADICAL LAME
+2F2B;W;KANGXI RADICAL CORPSE
+2F2C;W;KANGXI RADICAL SPROUT
+2F2D;W;KANGXI RADICAL MOUNTAIN
+2F2E;W;KANGXI RADICAL RIVER
+2F2F;W;KANGXI RADICAL WORK
+2F30;W;KANGXI RADICAL ONESELF
+2F31;W;KANGXI RADICAL TURBAN
+2F32;W;KANGXI RADICAL DRY
+2F33;W;KANGXI RADICAL SHORT THREAD
+2F34;W;KANGXI RADICAL DOTTED CLIFF
+2F35;W;KANGXI RADICAL LONG STRIDE
+2F36;W;KANGXI RADICAL TWO HANDS
+2F37;W;KANGXI RADICAL SHOOT
+2F38;W;KANGXI RADICAL BOW
+2F39;W;KANGXI RADICAL SNOUT
+2F3A;W;KANGXI RADICAL BRISTLE
+2F3B;W;KANGXI RADICAL STEP
+2F3C;W;KANGXI RADICAL HEART
+2F3D;W;KANGXI RADICAL HALBERD
+2F3E;W;KANGXI RADICAL DOOR
+2F3F;W;KANGXI RADICAL HAND
+2F40;W;KANGXI RADICAL BRANCH
+2F41;W;KANGXI RADICAL RAP
+2F42;W;KANGXI RADICAL SCRIPT
+2F43;W;KANGXI RADICAL DIPPER
+2F44;W;KANGXI RADICAL AXE
+2F45;W;KANGXI RADICAL SQUARE
+2F46;W;KANGXI RADICAL NOT
+2F47;W;KANGXI RADICAL SUN
+2F48;W;KANGXI RADICAL SAY
+2F49;W;KANGXI RADICAL MOON
+2F4A;W;KANGXI RADICAL TREE
+2F4B;W;KANGXI RADICAL LACK
+2F4C;W;KANGXI RADICAL STOP
+2F4D;W;KANGXI RADICAL DEATH
+2F4E;W;KANGXI RADICAL WEAPON
+2F4F;W;KANGXI RADICAL DO NOT
+2F50;W;KANGXI RADICAL COMPARE
+2F51;W;KANGXI RADICAL FUR
+2F52;W;KANGXI RADICAL CLAN
+2F53;W;KANGXI RADICAL STEAM
+2F54;W;KANGXI RADICAL WATER
+2F55;W;KANGXI RADICAL FIRE
+2F56;W;KANGXI RADICAL CLAW
+2F57;W;KANGXI RADICAL FATHER
+2F58;W;KANGXI RADICAL DOUBLE X
+2F59;W;KANGXI RADICAL HALF TREE TRUNK
+2F5A;W;KANGXI RADICAL SLICE
+2F5B;W;KANGXI RADICAL FANG
+2F5C;W;KANGXI RADICAL COW
+2F5D;W;KANGXI RADICAL DOG
+2F5E;W;KANGXI RADICAL PROFOUND
+2F5F;W;KANGXI RADICAL JADE
+2F60;W;KANGXI RADICAL MELON
+2F61;W;KANGXI RADICAL TILE
+2F62;W;KANGXI RADICAL SWEET
+2F63;W;KANGXI RADICAL LIFE
+2F64;W;KANGXI RADICAL USE
+2F65;W;KANGXI RADICAL FIELD
+2F66;W;KANGXI RADICAL BOLT OF CLOTH
+2F67;W;KANGXI RADICAL SICKNESS
+2F68;W;KANGXI RADICAL DOTTED TENT
+2F69;W;KANGXI RADICAL WHITE
+2F6A;W;KANGXI RADICAL SKIN
+2F6B;W;KANGXI RADICAL DISH
+2F6C;W;KANGXI RADICAL EYE
+2F6D;W;KANGXI RADICAL SPEAR
+2F6E;W;KANGXI RADICAL ARROW
+2F6F;W;KANGXI RADICAL STONE
+2F70;W;KANGXI RADICAL SPIRIT
+2F71;W;KANGXI RADICAL TRACK
+2F72;W;KANGXI RADICAL GRAIN
+2F73;W;KANGXI RADICAL CAVE
+2F74;W;KANGXI RADICAL STAND
+2F75;W;KANGXI RADICAL BAMBOO
+2F76;W;KANGXI RADICAL RICE
+2F77;W;KANGXI RADICAL SILK
+2F78;W;KANGXI RADICAL JAR
+2F79;W;KANGXI RADICAL NET
+2F7A;W;KANGXI RADICAL SHEEP
+2F7B;W;KANGXI RADICAL FEATHER
+2F7C;W;KANGXI RADICAL OLD
+2F7D;W;KANGXI RADICAL AND
+2F7E;W;KANGXI RADICAL PLOW
+2F7F;W;KANGXI RADICAL EAR
+2F80;W;KANGXI RADICAL BRUSH
+2F81;W;KANGXI RADICAL MEAT
+2F82;W;KANGXI RADICAL MINISTER
+2F83;W;KANGXI RADICAL SELF
+2F84;W;KANGXI RADICAL ARRIVE
+2F85;W;KANGXI RADICAL MORTAR
+2F86;W;KANGXI RADICAL TONGUE
+2F87;W;KANGXI RADICAL OPPOSE
+2F88;W;KANGXI RADICAL BOAT
+2F89;W;KANGXI RADICAL STOPPING
+2F8A;W;KANGXI RADICAL COLOR
+2F8B;W;KANGXI RADICAL GRASS
+2F8C;W;KANGXI RADICAL TIGER
+2F8D;W;KANGXI RADICAL INSECT
+2F8E;W;KANGXI RADICAL BLOOD
+2F8F;W;KANGXI RADICAL WALK ENCLOSURE
+2F90;W;KANGXI RADICAL CLOTHES
+2F91;W;KANGXI RADICAL WEST
+2F92;W;KANGXI RADICAL SEE
+2F93;W;KANGXI RADICAL HORN
+2F94;W;KANGXI RADICAL SPEECH
+2F95;W;KANGXI RADICAL VALLEY
+2F96;W;KANGXI RADICAL BEAN
+2F97;W;KANGXI RADICAL PIG
+2F98;W;KANGXI RADICAL BADGER
+2F99;W;KANGXI RADICAL SHELL
+2F9A;W;KANGXI RADICAL RED
+2F9B;W;KANGXI RADICAL RUN
+2F9C;W;KANGXI RADICAL FOOT
+2F9D;W;KANGXI RADICAL BODY
+2F9E;W;KANGXI RADICAL CART
+2F9F;W;KANGXI RADICAL BITTER
+2FA0;W;KANGXI RADICAL MORNING
+2FA1;W;KANGXI RADICAL WALK
+2FA2;W;KANGXI RADICAL CITY
+2FA3;W;KANGXI RADICAL WINE
+2FA4;W;KANGXI RADICAL DISTINGUISH
+2FA5;W;KANGXI RADICAL VILLAGE
+2FA6;W;KANGXI RADICAL GOLD
+2FA7;W;KANGXI RADICAL LONG
+2FA8;W;KANGXI RADICAL GATE
+2FA9;W;KANGXI RADICAL MOUND
+2FAA;W;KANGXI RADICAL SLAVE
+2FAB;W;KANGXI RADICAL SHORT TAILED BIRD
+2FAC;W;KANGXI RADICAL RAIN
+2FAD;W;KANGXI RADICAL BLUE
+2FAE;W;KANGXI RADICAL WRONG
+2FAF;W;KANGXI RADICAL FACE
+2FB0;W;KANGXI RADICAL LEATHER
+2FB1;W;KANGXI RADICAL TANNED LEATHER
+2FB2;W;KANGXI RADICAL LEEK
+2FB3;W;KANGXI RADICAL SOUND
+2FB4;W;KANGXI RADICAL LEAF
+2FB5;W;KANGXI RADICAL WIND
+2FB6;W;KANGXI RADICAL FLY
+2FB7;W;KANGXI RADICAL EAT
+2FB8;W;KANGXI RADICAL HEAD
+2FB9;W;KANGXI RADICAL FRAGRANT
+2FBA;W;KANGXI RADICAL HORSE
+2FBB;W;KANGXI RADICAL BONE
+2FBC;W;KANGXI RADICAL TALL
+2FBD;W;KANGXI RADICAL HAIR
+2FBE;W;KANGXI RADICAL FIGHT
+2FBF;W;KANGXI RADICAL SACRIFICIAL WINE
+2FC0;W;KANGXI RADICAL CAULDRON
+2FC1;W;KANGXI RADICAL GHOST
+2FC2;W;KANGXI RADICAL FISH
+2FC3;W;KANGXI RADICAL BIRD
+2FC4;W;KANGXI RADICAL SALT
+2FC5;W;KANGXI RADICAL DEER
+2FC6;W;KANGXI RADICAL WHEAT
+2FC7;W;KANGXI RADICAL HEMP
+2FC8;W;KANGXI RADICAL YELLOW
+2FC9;W;KANGXI RADICAL MILLET
+2FCA;W;KANGXI RADICAL BLACK
+2FCB;W;KANGXI RADICAL EMBROIDERY
+2FCC;W;KANGXI RADICAL FROG
+2FCD;W;KANGXI RADICAL TRIPOD
+2FCE;W;KANGXI RADICAL DRUM
+2FCF;W;KANGXI RADICAL RAT
+2FD0;W;KANGXI RADICAL NOSE
+2FD1;W;KANGXI RADICAL EVEN
+2FD2;W;KANGXI RADICAL TOOTH
+2FD3;W;KANGXI RADICAL DRAGON
+2FD4;W;KANGXI RADICAL TURTLE
+2FD5;W;KANGXI RADICAL FLUTE
+2FF0;W;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1;W;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2;W;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3;W;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4;W;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5;W;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6;W;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7;W;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8;W;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9;W;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA;W;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB;W;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000;W;IDEOGRAPHIC SPACE
+3001;W;IDEOGRAPHIC COMMA
+3002;W;IDEOGRAPHIC FULL STOP
+3003;W;DITTO MARK
+3004;W;JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005;W;IDEOGRAPHIC ITERATION MARK
+3006;W;IDEOGRAPHIC CLOSING MARK
+3007;W;IDEOGRAPHIC NUMBER ZERO
+3008;W;LEFT ANGLE BRACKET
+3009;W;RIGHT ANGLE BRACKET
+300A;A;LEFT DOUBLE ANGLE BRACKET
+300B;A;RIGHT DOUBLE ANGLE BRACKET
+300C;W;LEFT CORNER BRACKET
+300D;W;RIGHT CORNER BRACKET
+300E;W;LEFT WHITE CORNER BRACKET
+300F;W;RIGHT WHITE CORNER BRACKET
+3010;W;LEFT BLACK LENTICULAR BRACKET
+3011;W;RIGHT BLACK LENTICULAR BRACKET
+3012;W;POSTAL MARK
+3013;W;GETA MARK
+3014;W;LEFT TORTOISE SHELL BRACKET
+3015;W;RIGHT TORTOISE SHELL BRACKET
+3016;W;LEFT WHITE LENTICULAR BRACKET
+3017;W;RIGHT WHITE LENTICULAR BRACKET
+3018;W;LEFT WHITE TORTOISE SHELL BRACKET
+3019;W;RIGHT WHITE TORTOISE SHELL BRACKET
+301A;A;LEFT WHITE SQUARE BRACKET
+301B;A;RIGHT WHITE SQUARE BRACKET
+301C;W;WAVE DASH
+301D;W;REVERSED DOUBLE PRIME QUOTATION MARK
+301E;W;DOUBLE PRIME QUOTATION MARK
+301F;W;LOW DOUBLE PRIME QUOTATION MARK
+3020;W;POSTAL MARK FACE
+3021;W;HANGZHOU NUMERAL ONE
+3022;W;HANGZHOU NUMERAL TWO
+3023;W;HANGZHOU NUMERAL THREE
+3024;W;HANGZHOU NUMERAL FOUR
+3025;W;HANGZHOU NUMERAL FIVE
+3026;W;HANGZHOU NUMERAL SIX
+3027;W;HANGZHOU NUMERAL SEVEN
+3028;W;HANGZHOU NUMERAL EIGHT
+3029;W;HANGZHOU NUMERAL NINE
+302A;W;IDEOGRAPHIC LEVEL TONE MARK
+302B;W;IDEOGRAPHIC RISING TONE MARK
+302C;W;IDEOGRAPHIC DEPARTING TONE MARK
+302D;W;IDEOGRAPHIC ENTERING TONE MARK
+302E;W;HANGUL SINGLE DOT TONE MARK
+302F;W;HANGUL DOUBLE DOT TONE MARK
+3030;W;WAVY DASH
+3031;W;VERTICAL KANA REPEAT MARK
+3032;W;VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033;W;VERTICAL KANA REPEAT MARK UPPER HALF
+3034;W;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035;W;VERTICAL KANA REPEAT MARK LOWER HALF
+3036;W;CIRCLED POSTAL MARK
+3037;W;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038;W;HANGZHOU NUMERAL TEN
+3039;W;HANGZHOU NUMERAL TWENTY
+303A;W;HANGZHOU NUMERAL THIRTY
+303E;W;IDEOGRAPHIC VARIATION INDICATOR
+303F;N;IDEOGRAPHIC HALF FILL SPACE
+3041;W;HIRAGANA LETTER SMALL A
+3042;W;HIRAGANA LETTER A
+3043;W;HIRAGANA LETTER SMALL I
+3044;W;HIRAGANA LETTER I
+3045;W;HIRAGANA LETTER SMALL U
+3046;W;HIRAGANA LETTER U
+3047;W;HIRAGANA LETTER SMALL E
+3048;W;HIRAGANA LETTER E
+3049;W;HIRAGANA LETTER SMALL O
+304A;W;HIRAGANA LETTER O
+304B;W;HIRAGANA LETTER KA
+304C;W;HIRAGANA LETTER GA
+304D;W;HIRAGANA LETTER KI
+304E;W;HIRAGANA LETTER GI
+304F;W;HIRAGANA LETTER KU
+3050;W;HIRAGANA LETTER GU
+3051;W;HIRAGANA LETTER KE
+3052;W;HIRAGANA LETTER GE
+3053;W;HIRAGANA LETTER KO
+3054;W;HIRAGANA LETTER GO
+3055;W;HIRAGANA LETTER SA
+3056;W;HIRAGANA LETTER ZA
+3057;W;HIRAGANA LETTER SI
+3058;W;HIRAGANA LETTER ZI
+3059;W;HIRAGANA LETTER SU
+305A;W;HIRAGANA LETTER ZU
+305B;W;HIRAGANA LETTER SE
+305C;W;HIRAGANA LETTER ZE
+305D;W;HIRAGANA LETTER SO
+305E;W;HIRAGANA LETTER ZO
+305F;W;HIRAGANA LETTER TA
+3060;W;HIRAGANA LETTER DA
+3061;W;HIRAGANA LETTER TI
+3062;W;HIRAGANA LETTER DI
+3063;W;HIRAGANA LETTER SMALL TU
+3064;W;HIRAGANA LETTER TU
+3065;W;HIRAGANA LETTER DU
+3066;W;HIRAGANA LETTER TE
+3067;W;HIRAGANA LETTER DE
+3068;W;HIRAGANA LETTER TO
+3069;W;HIRAGANA LETTER DO
+306A;W;HIRAGANA LETTER NA
+306B;W;HIRAGANA LETTER NI
+306C;W;HIRAGANA LETTER NU
+306D;W;HIRAGANA LETTER NE
+306E;W;HIRAGANA LETTER NO
+306F;W;HIRAGANA LETTER HA
+3070;W;HIRAGANA LETTER BA
+3071;W;HIRAGANA LETTER PA
+3072;W;HIRAGANA LETTER HI
+3073;W;HIRAGANA LETTER BI
+3074;W;HIRAGANA LETTER PI
+3075;W;HIRAGANA LETTER HU
+3076;W;HIRAGANA LETTER BU
+3077;W;HIRAGANA LETTER PU
+3078;W;HIRAGANA LETTER HE
+3079;W;HIRAGANA LETTER BE
+307A;W;HIRAGANA LETTER PE
+307B;W;HIRAGANA LETTER HO
+307C;W;HIRAGANA LETTER BO
+307D;W;HIRAGANA LETTER PO
+307E;W;HIRAGANA LETTER MA
+307F;W;HIRAGANA LETTER MI
+3080;W;HIRAGANA LETTER MU
+3081;W;HIRAGANA LETTER ME
+3082;W;HIRAGANA LETTER MO
+3083;W;HIRAGANA LETTER SMALL YA
+3084;W;HIRAGANA LETTER YA
+3085;W;HIRAGANA LETTER SMALL YU
+3086;W;HIRAGANA LETTER YU
+3087;W;HIRAGANA LETTER SMALL YO
+3088;W;HIRAGANA LETTER YO
+3089;W;HIRAGANA LETTER RA
+308A;W;HIRAGANA LETTER RI
+308B;W;HIRAGANA LETTER RU
+308C;W;HIRAGANA LETTER RE
+308D;W;HIRAGANA LETTER RO
+308E;W;HIRAGANA LETTER SMALL WA
+308F;W;HIRAGANA LETTER WA
+3090;W;HIRAGANA LETTER WI
+3091;W;HIRAGANA LETTER WE
+3092;W;HIRAGANA LETTER WO
+3093;W;HIRAGANA LETTER N
+3094;W;HIRAGANA LETTER VU
+3099;W;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A;W;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B;W;KATAKANA-HIRAGANA VOICED SOUND MARK
+309C;W;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D;W;HIRAGANA ITERATION MARK
+309E;W;HIRAGANA VOICED ITERATION MARK
+30A1;W;KATAKANA LETTER SMALL A
+30A2;W;KATAKANA LETTER A
+30A3;W;KATAKANA LETTER SMALL I
+30A4;W;KATAKANA LETTER I
+30A5;W;KATAKANA LETTER SMALL U
+30A6;W;KATAKANA LETTER U
+30A7;W;KATAKANA LETTER SMALL E
+30A8;W;KATAKANA LETTER E
+30A9;W;KATAKANA LETTER SMALL O
+30AA;W;KATAKANA LETTER O
+30AB;W;KATAKANA LETTER KA
+30AC;W;KATAKANA LETTER GA
+30AD;W;KATAKANA LETTER KI
+30AE;W;KATAKANA LETTER GI
+30AF;W;KATAKANA LETTER KU
+30B0;W;KATAKANA LETTER GU
+30B1;W;KATAKANA LETTER KE
+30B2;W;KATAKANA LETTER GE
+30B3;W;KATAKANA LETTER KO
+30B4;W;KATAKANA LETTER GO
+30B5;W;KATAKANA LETTER SA
+30B6;W;KATAKANA LETTER ZA
+30B7;W;KATAKANA LETTER SI
+30B8;W;KATAKANA LETTER ZI
+30B9;W;KATAKANA LETTER SU
+30BA;W;KATAKANA LETTER ZU
+30BB;W;KATAKANA LETTER SE
+30BC;W;KATAKANA LETTER ZE
+30BD;W;KATAKANA LETTER SO
+30BE;W;KATAKANA LETTER ZO
+30BF;W;KATAKANA LETTER TA
+30C0;W;KATAKANA LETTER DA
+30C1;W;KATAKANA LETTER TI
+30C2;W;KATAKANA LETTER DI
+30C3;W;KATAKANA LETTER SMALL TU
+30C4;W;KATAKANA LETTER TU
+30C5;W;KATAKANA LETTER DU
+30C6;W;KATAKANA LETTER TE
+30C7;W;KATAKANA LETTER DE
+30C8;W;KATAKANA LETTER TO
+30C9;W;KATAKANA LETTER DO
+30CA;W;KATAKANA LETTER NA
+30CB;W;KATAKANA LETTER NI
+30CC;W;KATAKANA LETTER NU
+30CD;W;KATAKANA LETTER NE
+30CE;W;KATAKANA LETTER NO
+30CF;W;KATAKANA LETTER HA
+30D0;W;KATAKANA LETTER BA
+30D1;W;KATAKANA LETTER PA
+30D2;W;KATAKANA LETTER HI
+30D3;W;KATAKANA LETTER BI
+30D4;W;KATAKANA LETTER PI
+30D5;W;KATAKANA LETTER HU
+30D6;W;KATAKANA LETTER BU
+30D7;W;KATAKANA LETTER PU
+30D8;W;KATAKANA LETTER HE
+30D9;W;KATAKANA LETTER BE
+30DA;W;KATAKANA LETTER PE
+30DB;W;KATAKANA LETTER HO
+30DC;W;KATAKANA LETTER BO
+30DD;W;KATAKANA LETTER PO
+30DE;W;KATAKANA LETTER MA
+30DF;W;KATAKANA LETTER MI
+30E0;W;KATAKANA LETTER MU
+30E1;W;KATAKANA LETTER ME
+30E2;W;KATAKANA LETTER MO
+30E3;W;KATAKANA LETTER SMALL YA
+30E4;W;KATAKANA LETTER YA
+30E5;W;KATAKANA LETTER SMALL YU
+30E6;W;KATAKANA LETTER YU
+30E7;W;KATAKANA LETTER SMALL YO
+30E8;W;KATAKANA LETTER YO
+30E9;W;KATAKANA LETTER RA
+30EA;W;KATAKANA LETTER RI
+30EB;W;KATAKANA LETTER RU
+30EC;W;KATAKANA LETTER RE
+30ED;W;KATAKANA LETTER RO
+30EE;W;KATAKANA LETTER SMALL WA
+30EF;W;KATAKANA LETTER WA
+30F0;W;KATAKANA LETTER WI
+30F1;W;KATAKANA LETTER WE
+30F2;W;KATAKANA LETTER WO
+30F3;W;KATAKANA LETTER N
+30F4;W;KATAKANA LETTER VU
+30F5;W;KATAKANA LETTER SMALL KA
+30F6;W;KATAKANA LETTER SMALL KE
+30F7;W;KATAKANA LETTER VA
+30F8;W;KATAKANA LETTER VI
+30F9;W;KATAKANA LETTER VE
+30FA;W;KATAKANA LETTER VO
+30FB;W;KATAKANA MIDDLE DOT
+30FC;W;KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD;W;KATAKANA ITERATION MARK
+30FE;W;KATAKANA VOICED ITERATION MARK
+3105;W;BOPOMOFO LETTER B
+3106;W;BOPOMOFO LETTER P
+3107;W;BOPOMOFO LETTER M
+3108;W;BOPOMOFO LETTER F
+3109;W;BOPOMOFO LETTER D
+310A;W;BOPOMOFO LETTER T
+310B;W;BOPOMOFO LETTER N
+310C;W;BOPOMOFO LETTER L
+310D;W;BOPOMOFO LETTER G
+310E;W;BOPOMOFO LETTER K
+310F;W;BOPOMOFO LETTER H
+3110;W;BOPOMOFO LETTER J
+3111;W;BOPOMOFO LETTER Q
+3112;W;BOPOMOFO LETTER X
+3113;W;BOPOMOFO LETTER ZH
+3114;W;BOPOMOFO LETTER CH
+3115;W;BOPOMOFO LETTER SH
+3116;W;BOPOMOFO LETTER R
+3117;W;BOPOMOFO LETTER Z
+3118;W;BOPOMOFO LETTER C
+3119;W;BOPOMOFO LETTER S
+311A;W;BOPOMOFO LETTER A
+311B;W;BOPOMOFO LETTER O
+311C;W;BOPOMOFO LETTER E
+311D;W;BOPOMOFO LETTER EH
+311E;W;BOPOMOFO LETTER AI
+311F;W;BOPOMOFO LETTER EI
+3120;W;BOPOMOFO LETTER AU
+3121;W;BOPOMOFO LETTER OU
+3122;W;BOPOMOFO LETTER AN
+3123;W;BOPOMOFO LETTER EN
+3124;W;BOPOMOFO LETTER ANG
+3125;W;BOPOMOFO LETTER ENG
+3126;W;BOPOMOFO LETTER ER
+3127;W;BOPOMOFO LETTER I
+3128;W;BOPOMOFO LETTER U
+3129;W;BOPOMOFO LETTER IU
+312A;W;BOPOMOFO LETTER V
+312B;W;BOPOMOFO LETTER NG
+312C;W;BOPOMOFO LETTER GN
+3131;W;HANGUL LETTER KIYEOK
+3132;W;HANGUL LETTER SSANGKIYEOK
+3133;W;HANGUL LETTER KIYEOK-SIOS
+3134;W;HANGUL LETTER NIEUN
+3135;W;HANGUL LETTER NIEUN-CIEUC
+3136;W;HANGUL LETTER NIEUN-HIEUH
+3137;W;HANGUL LETTER TIKEUT
+3138;W;HANGUL LETTER SSANGTIKEUT
+3139;W;HANGUL LETTER RIEUL
+313A;W;HANGUL LETTER RIEUL-KIYEOK
+313B;W;HANGUL LETTER RIEUL-MIEUM
+313C;W;HANGUL LETTER RIEUL-PIEUP
+313D;W;HANGUL LETTER RIEUL-SIOS
+313E;W;HANGUL LETTER RIEUL-THIEUTH
+313F;W;HANGUL LETTER RIEUL-PHIEUPH
+3140;W;HANGUL LETTER RIEUL-HIEUH
+3141;W;HANGUL LETTER MIEUM
+3142;W;HANGUL LETTER PIEUP
+3143;W;HANGUL LETTER SSANGPIEUP
+3144;W;HANGUL LETTER PIEUP-SIOS
+3145;W;HANGUL LETTER SIOS
+3146;W;HANGUL LETTER SSANGSIOS
+3147;W;HANGUL LETTER IEUNG
+3148;W;HANGUL LETTER CIEUC
+3149;W;HANGUL LETTER SSANGCIEUC
+314A;W;HANGUL LETTER CHIEUCH
+314B;W;HANGUL LETTER KHIEUKH
+314C;W;HANGUL LETTER THIEUTH
+314D;W;HANGUL LETTER PHIEUPH
+314E;W;HANGUL LETTER HIEUH
+314F;W;HANGUL LETTER A
+3150;W;HANGUL LETTER AE
+3151;W;HANGUL LETTER YA
+3152;W;HANGUL LETTER YAE
+3153;W;HANGUL LETTER EO
+3154;W;HANGUL LETTER E
+3155;W;HANGUL LETTER YEO
+3156;W;HANGUL LETTER YE
+3157;W;HANGUL LETTER O
+3158;W;HANGUL LETTER WA
+3159;W;HANGUL LETTER WAE
+315A;W;HANGUL LETTER OE
+315B;W;HANGUL LETTER YO
+315C;W;HANGUL LETTER U
+315D;W;HANGUL LETTER WEO
+315E;W;HANGUL LETTER WE
+315F;W;HANGUL LETTER WI
+3160;W;HANGUL LETTER YU
+3161;W;HANGUL LETTER EU
+3162;W;HANGUL LETTER YI
+3163;W;HANGUL LETTER I
+3164;W;HANGUL FILLER
+3165;W;HANGUL LETTER SSANGNIEUN
+3166;W;HANGUL LETTER NIEUN-TIKEUT
+3167;W;HANGUL LETTER NIEUN-SIOS
+3168;W;HANGUL LETTER NIEUN-PANSIOS
+3169;W;HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A;W;HANGUL LETTER RIEUL-TIKEUT
+316B;W;HANGUL LETTER RIEUL-PIEUP-SIOS
+316C;W;HANGUL LETTER RIEUL-PANSIOS
+316D;W;HANGUL LETTER RIEUL-YEORINHIEUH
+316E;W;HANGUL LETTER MIEUM-PIEUP
+316F;W;HANGUL LETTER MIEUM-SIOS
+3170;W;HANGUL LETTER MIEUM-PANSIOS
+3171;W;HANGUL LETTER KAPYEOUNMIEUM
+3172;W;HANGUL LETTER PIEUP-KIYEOK
+3173;W;HANGUL LETTER PIEUP-TIKEUT
+3174;W;HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175;W;HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176;W;HANGUL LETTER PIEUP-CIEUC
+3177;W;HANGUL LETTER PIEUP-THIEUTH
+3178;W;HANGUL LETTER KAPYEOUNPIEUP
+3179;W;HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A;W;HANGUL LETTER SIOS-KIYEOK
+317B;W;HANGUL LETTER SIOS-NIEUN
+317C;W;HANGUL LETTER SIOS-TIKEUT
+317D;W;HANGUL LETTER SIOS-PIEUP
+317E;W;HANGUL LETTER SIOS-CIEUC
+317F;W;HANGUL LETTER PANSIOS
+3180;W;HANGUL LETTER SSANGIEUNG
+3181;W;HANGUL LETTER YESIEUNG
+3182;W;HANGUL LETTER YESIEUNG-SIOS
+3183;W;HANGUL LETTER YESIEUNG-PANSIOS
+3184;W;HANGUL LETTER KAPYEOUNPHIEUPH
+3185;W;HANGUL LETTER SSANGHIEUH
+3186;W;HANGUL LETTER YEORINHIEUH
+3187;W;HANGUL LETTER YO-YA
+3188;W;HANGUL LETTER YO-YAE
+3189;W;HANGUL LETTER YO-I
+318A;W;HANGUL LETTER YU-YEO
+318B;W;HANGUL LETTER YU-YE
+318C;W;HANGUL LETTER YU-I
+318D;W;HANGUL LETTER ARAEA
+318E;W;HANGUL LETTER ARAEAE
+3190;W;IDEOGRAPHIC ANNOTATION LINKING MARK
+3191;W;IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192;W;IDEOGRAPHIC ANNOTATION ONE MARK
+3193;W;IDEOGRAPHIC ANNOTATION TWO MARK
+3194;W;IDEOGRAPHIC ANNOTATION THREE MARK
+3195;W;IDEOGRAPHIC ANNOTATION FOUR MARK
+3196;W;IDEOGRAPHIC ANNOTATION TOP MARK
+3197;W;IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198;W;IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199;W;IDEOGRAPHIC ANNOTATION FIRST MARK
+319A;W;IDEOGRAPHIC ANNOTATION SECOND MARK
+319B;W;IDEOGRAPHIC ANNOTATION THIRD MARK
+319C;W;IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D;W;IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E;W;IDEOGRAPHIC ANNOTATION EARTH MARK
+319F;W;IDEOGRAPHIC ANNOTATION MAN MARK
+31A0;W;BOPOMOFO LETTER BU
+31A1;W;BOPOMOFO LETTER ZI
+31A2;W;BOPOMOFO LETTER JI
+31A3;W;BOPOMOFO LETTER GU
+31A4;W;BOPOMOFO LETTER EE
+31A5;W;BOPOMOFO LETTER ENN
+31A6;W;BOPOMOFO LETTER OO
+31A7;W;BOPOMOFO LETTER ONN
+31A8;W;BOPOMOFO LETTER IR
+31A9;W;BOPOMOFO LETTER ANN
+31AA;W;BOPOMOFO LETTER INN
+31AB;W;BOPOMOFO LETTER UNN
+31AC;W;BOPOMOFO LETTER IM
+31AD;W;BOPOMOFO LETTER NGG
+31AE;W;BOPOMOFO LETTER AINN
+31AF;W;BOPOMOFO LETTER AUNN
+31B0;W;BOPOMOFO LETTER AM
+31B1;W;BOPOMOFO LETTER OM
+31B2;W;BOPOMOFO LETTER ONG
+31B3;W;BOPOMOFO LETTER INNN
+31B4;W;BOPOMOFO FINAL LETTER P
+31B5;W;BOPOMOFO FINAL LETTER T
+31B6;W;BOPOMOFO FINAL LETTER K
+31B7;W;BOPOMOFO FINAL LETTER H
+3200;W;PARENTHESIZED HANGUL KIYEOK
+3201;W;PARENTHESIZED HANGUL NIEUN
+3202;W;PARENTHESIZED HANGUL TIKEUT
+3203;W;PARENTHESIZED HANGUL RIEUL
+3204;W;PARENTHESIZED HANGUL MIEUM
+3205;W;PARENTHESIZED HANGUL PIEUP
+3206;W;PARENTHESIZED HANGUL SIOS
+3207;W;PARENTHESIZED HANGUL IEUNG
+3208;W;PARENTHESIZED HANGUL CIEUC
+3209;W;PARENTHESIZED HANGUL CHIEUCH
+320A;W;PARENTHESIZED HANGUL KHIEUKH
+320B;W;PARENTHESIZED HANGUL THIEUTH
+320C;W;PARENTHESIZED HANGUL PHIEUPH
+320D;W;PARENTHESIZED HANGUL HIEUH
+320E;W;PARENTHESIZED HANGUL KIYEOK A
+320F;W;PARENTHESIZED HANGUL NIEUN A
+3210;W;PARENTHESIZED HANGUL TIKEUT A
+3211;W;PARENTHESIZED HANGUL RIEUL A
+3212;W;PARENTHESIZED HANGUL MIEUM A
+3213;W;PARENTHESIZED HANGUL PIEUP A
+3214;W;PARENTHESIZED HANGUL SIOS A
+3215;W;PARENTHESIZED HANGUL IEUNG A
+3216;W;PARENTHESIZED HANGUL CIEUC A
+3217;W;PARENTHESIZED HANGUL CHIEUCH A
+3218;W;PARENTHESIZED HANGUL KHIEUKH A
+3219;W;PARENTHESIZED HANGUL THIEUTH A
+321A;W;PARENTHESIZED HANGUL PHIEUPH A
+321B;W;PARENTHESIZED HANGUL HIEUH A
+321C;W;PARENTHESIZED HANGUL CIEUC U
+3220;W;PARENTHESIZED IDEOGRAPH ONE
+3221;W;PARENTHESIZED IDEOGRAPH TWO
+3222;W;PARENTHESIZED IDEOGRAPH THREE
+3223;W;PARENTHESIZED IDEOGRAPH FOUR
+3224;W;PARENTHESIZED IDEOGRAPH FIVE
+3225;W;PARENTHESIZED IDEOGRAPH SIX
+3226;W;PARENTHESIZED IDEOGRAPH SEVEN
+3227;W;PARENTHESIZED IDEOGRAPH EIGHT
+3228;W;PARENTHESIZED IDEOGRAPH NINE
+3229;W;PARENTHESIZED IDEOGRAPH TEN
+322A;W;PARENTHESIZED IDEOGRAPH MOON
+322B;W;PARENTHESIZED IDEOGRAPH FIRE
+322C;W;PARENTHESIZED IDEOGRAPH WATER
+322D;W;PARENTHESIZED IDEOGRAPH WOOD
+322E;W;PARENTHESIZED IDEOGRAPH METAL
+322F;W;PARENTHESIZED IDEOGRAPH EARTH
+3230;W;PARENTHESIZED IDEOGRAPH SUN
+3231;W;PARENTHESIZED IDEOGRAPH STOCK
+3232;W;PARENTHESIZED IDEOGRAPH HAVE
+3233;W;PARENTHESIZED IDEOGRAPH SOCIETY
+3234;W;PARENTHESIZED IDEOGRAPH NAME
+3235;W;PARENTHESIZED IDEOGRAPH SPECIAL
+3236;W;PARENTHESIZED IDEOGRAPH FINANCIAL
+3237;W;PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238;W;PARENTHESIZED IDEOGRAPH LABOR
+3239;W;PARENTHESIZED IDEOGRAPH REPRESENT
+323A;W;PARENTHESIZED IDEOGRAPH CALL
+323B;W;PARENTHESIZED IDEOGRAPH STUDY
+323C;W;PARENTHESIZED IDEOGRAPH SUPERVISE
+323D;W;PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E;W;PARENTHESIZED IDEOGRAPH RESOURCE
+323F;W;PARENTHESIZED IDEOGRAPH ALLIANCE
+3240;W;PARENTHESIZED IDEOGRAPH FESTIVAL
+3241;W;PARENTHESIZED IDEOGRAPH REST
+3242;W;PARENTHESIZED IDEOGRAPH SELF
+3243;W;PARENTHESIZED IDEOGRAPH REACH
+3260;W;CIRCLED HANGUL KIYEOK
+3261;W;CIRCLED HANGUL NIEUN
+3262;W;CIRCLED HANGUL TIKEUT
+3263;W;CIRCLED HANGUL RIEUL
+3264;W;CIRCLED HANGUL MIEUM
+3265;W;CIRCLED HANGUL PIEUP
+3266;W;CIRCLED HANGUL SIOS
+3267;W;CIRCLED HANGUL IEUNG
+3268;W;CIRCLED HANGUL CIEUC
+3269;W;CIRCLED HANGUL CHIEUCH
+326A;W;CIRCLED HANGUL KHIEUKH
+326B;W;CIRCLED HANGUL THIEUTH
+326C;W;CIRCLED HANGUL PHIEUPH
+326D;W;CIRCLED HANGUL HIEUH
+326E;W;CIRCLED HANGUL KIYEOK A
+326F;W;CIRCLED HANGUL NIEUN A
+3270;W;CIRCLED HANGUL TIKEUT A
+3271;W;CIRCLED HANGUL RIEUL A
+3272;W;CIRCLED HANGUL MIEUM A
+3273;W;CIRCLED HANGUL PIEUP A
+3274;W;CIRCLED HANGUL SIOS A
+3275;W;CIRCLED HANGUL IEUNG A
+3276;W;CIRCLED HANGUL CIEUC A
+3277;W;CIRCLED HANGUL CHIEUCH A
+3278;W;CIRCLED HANGUL KHIEUKH A
+3279;W;CIRCLED HANGUL THIEUTH A
+327A;W;CIRCLED HANGUL PHIEUPH A
+327B;W;CIRCLED HANGUL HIEUH A
+327F;W;KOREAN STANDARD SYMBOL
+3280;W;CIRCLED IDEOGRAPH ONE
+3281;W;CIRCLED IDEOGRAPH TWO
+3282;W;CIRCLED IDEOGRAPH THREE
+3283;W;CIRCLED IDEOGRAPH FOUR
+3284;W;CIRCLED IDEOGRAPH FIVE
+3285;W;CIRCLED IDEOGRAPH SIX
+3286;W;CIRCLED IDEOGRAPH SEVEN
+3287;W;CIRCLED IDEOGRAPH EIGHT
+3288;W;CIRCLED IDEOGRAPH NINE
+3289;W;CIRCLED IDEOGRAPH TEN
+328A;W;CIRCLED IDEOGRAPH MOON
+328B;W;CIRCLED IDEOGRAPH FIRE
+328C;W;CIRCLED IDEOGRAPH WATER
+328D;W;CIRCLED IDEOGRAPH WOOD
+328E;W;CIRCLED IDEOGRAPH METAL
+328F;W;CIRCLED IDEOGRAPH EARTH
+3290;W;CIRCLED IDEOGRAPH SUN
+3291;W;CIRCLED IDEOGRAPH STOCK
+3292;W;CIRCLED IDEOGRAPH HAVE
+3293;W;CIRCLED IDEOGRAPH SOCIETY
+3294;W;CIRCLED IDEOGRAPH NAME
+3295;W;CIRCLED IDEOGRAPH SPECIAL
+3296;W;CIRCLED IDEOGRAPH FINANCIAL
+3297;W;CIRCLED IDEOGRAPH CONGRATULATION
+3298;W;CIRCLED IDEOGRAPH LABOR
+3299;W;CIRCLED IDEOGRAPH SECRET
+329A;W;CIRCLED IDEOGRAPH MALE
+329B;W;CIRCLED IDEOGRAPH FEMALE
+329C;W;CIRCLED IDEOGRAPH SUITABLE
+329D;W;CIRCLED IDEOGRAPH EXCELLENT
+329E;W;CIRCLED IDEOGRAPH PRINT
+329F;W;CIRCLED IDEOGRAPH ATTENTION
+32A0;W;CIRCLED IDEOGRAPH ITEM
+32A1;W;CIRCLED IDEOGRAPH REST
+32A2;W;CIRCLED IDEOGRAPH COPY
+32A3;W;CIRCLED IDEOGRAPH CORRECT
+32A4;W;CIRCLED IDEOGRAPH HIGH
+32A5;W;CIRCLED IDEOGRAPH CENTRE
+32A6;W;CIRCLED IDEOGRAPH LOW
+32A7;W;CIRCLED IDEOGRAPH LEFT
+32A8;W;CIRCLED IDEOGRAPH RIGHT
+32A9;W;CIRCLED IDEOGRAPH MEDICINE
+32AA;W;CIRCLED IDEOGRAPH RELIGION
+32AB;W;CIRCLED IDEOGRAPH STUDY
+32AC;W;CIRCLED IDEOGRAPH SUPERVISE
+32AD;W;CIRCLED IDEOGRAPH ENTERPRISE
+32AE;W;CIRCLED IDEOGRAPH RESOURCE
+32AF;W;CIRCLED IDEOGRAPH ALLIANCE
+32B0;W;CIRCLED IDEOGRAPH NIGHT
+32C0;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32D0;W;CIRCLED KATAKANA A
+32D1;W;CIRCLED KATAKANA I
+32D2;W;CIRCLED KATAKANA U
+32D3;W;CIRCLED KATAKANA E
+32D4;W;CIRCLED KATAKANA O
+32D5;W;CIRCLED KATAKANA KA
+32D6;W;CIRCLED KATAKANA KI
+32D7;W;CIRCLED KATAKANA KU
+32D8;W;CIRCLED KATAKANA KE
+32D9;W;CIRCLED KATAKANA KO
+32DA;W;CIRCLED KATAKANA SA
+32DB;W;CIRCLED KATAKANA SI
+32DC;W;CIRCLED KATAKANA SU
+32DD;W;CIRCLED KATAKANA SE
+32DE;W;CIRCLED KATAKANA SO
+32DF;W;CIRCLED KATAKANA TA
+32E0;W;CIRCLED KATAKANA TI
+32E1;W;CIRCLED KATAKANA TU
+32E2;W;CIRCLED KATAKANA TE
+32E3;W;CIRCLED KATAKANA TO
+32E4;W;CIRCLED KATAKANA NA
+32E5;W;CIRCLED KATAKANA NI
+32E6;W;CIRCLED KATAKANA NU
+32E7;W;CIRCLED KATAKANA NE
+32E8;W;CIRCLED KATAKANA NO
+32E9;W;CIRCLED KATAKANA HA
+32EA;W;CIRCLED KATAKANA HI
+32EB;W;CIRCLED KATAKANA HU
+32EC;W;CIRCLED KATAKANA HE
+32ED;W;CIRCLED KATAKANA HO
+32EE;W;CIRCLED KATAKANA MA
+32EF;W;CIRCLED KATAKANA MI
+32F0;W;CIRCLED KATAKANA MU
+32F1;W;CIRCLED KATAKANA ME
+32F2;W;CIRCLED KATAKANA MO
+32F3;W;CIRCLED KATAKANA YA
+32F4;W;CIRCLED KATAKANA YU
+32F5;W;CIRCLED KATAKANA YO
+32F6;W;CIRCLED KATAKANA RA
+32F7;W;CIRCLED KATAKANA RI
+32F8;W;CIRCLED KATAKANA RU
+32F9;W;CIRCLED KATAKANA RE
+32FA;W;CIRCLED KATAKANA RO
+32FB;W;CIRCLED KATAKANA WA
+32FC;W;CIRCLED KATAKANA WI
+32FD;W;CIRCLED KATAKANA WE
+32FE;W;CIRCLED KATAKANA WO
+3300;W;SQUARE APAATO
+3301;W;SQUARE ARUHUA
+3302;W;SQUARE ANPEA
+3303;W;SQUARE AARU
+3304;W;SQUARE ININGU
+3305;W;SQUARE INTI
+3306;W;SQUARE UON
+3307;W;SQUARE ESUKUUDO
+3308;W;SQUARE EEKAA
+3309;W;SQUARE ONSU
+330A;W;SQUARE OOMU
+330B;W;SQUARE KAIRI
+330C;W;SQUARE KARATTO
+330D;W;SQUARE KARORII
+330E;W;SQUARE GARON
+330F;W;SQUARE GANMA
+3310;W;SQUARE GIGA
+3311;W;SQUARE GINII
+3312;W;SQUARE KYURII
+3313;W;SQUARE GIRUDAA
+3314;W;SQUARE KIRO
+3315;W;SQUARE KIROGURAMU
+3316;W;SQUARE KIROMEETORU
+3317;W;SQUARE KIROWATTO
+3318;W;SQUARE GURAMU
+3319;W;SQUARE GURAMUTON
+331A;W;SQUARE KURUZEIRO
+331B;W;SQUARE KUROONE
+331C;W;SQUARE KEESU
+331D;W;SQUARE KORUNA
+331E;W;SQUARE KOOPO
+331F;W;SQUARE SAIKURU
+3320;W;SQUARE SANTIIMU
+3321;W;SQUARE SIRINGU
+3322;W;SQUARE SENTI
+3323;W;SQUARE SENTO
+3324;W;SQUARE DAASU
+3325;W;SQUARE DESI
+3326;W;SQUARE DORU
+3327;W;SQUARE TON
+3328;W;SQUARE NANO
+3329;W;SQUARE NOTTO
+332A;W;SQUARE HAITU
+332B;W;SQUARE PAASENTO
+332C;W;SQUARE PAATU
+332D;W;SQUARE BAARERU
+332E;W;SQUARE PIASUTORU
+332F;W;SQUARE PIKURU
+3330;W;SQUARE PIKO
+3331;W;SQUARE BIRU
+3332;W;SQUARE HUARADDO
+3333;W;SQUARE HUIITO
+3334;W;SQUARE BUSSYERU
+3335;W;SQUARE HURAN
+3336;W;SQUARE HEKUTAARU
+3337;W;SQUARE PESO
+3338;W;SQUARE PENIHI
+3339;W;SQUARE HERUTU
+333A;W;SQUARE PENSU
+333B;W;SQUARE PEEZI
+333C;W;SQUARE BEETA
+333D;W;SQUARE POINTO
+333E;W;SQUARE BORUTO
+333F;W;SQUARE HON
+3340;W;SQUARE PONDO
+3341;W;SQUARE HOORU
+3342;W;SQUARE HOON
+3343;W;SQUARE MAIKURO
+3344;W;SQUARE MAIRU
+3345;W;SQUARE MAHHA
+3346;W;SQUARE MARUKU
+3347;W;SQUARE MANSYON
+3348;W;SQUARE MIKURON
+3349;W;SQUARE MIRI
+334A;W;SQUARE MIRIBAARU
+334B;W;SQUARE MEGA
+334C;W;SQUARE MEGATON
+334D;W;SQUARE MEETORU
+334E;W;SQUARE YAADO
+334F;W;SQUARE YAARU
+3350;W;SQUARE YUAN
+3351;W;SQUARE RITTORU
+3352;W;SQUARE RIRA
+3353;W;SQUARE RUPII
+3354;W;SQUARE RUUBURU
+3355;W;SQUARE REMU
+3356;W;SQUARE RENTOGEN
+3357;W;SQUARE WATTO
+3358;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371;W;SQUARE HPA
+3372;W;SQUARE DA
+3373;W;SQUARE AU
+3374;W;SQUARE BAR
+3375;W;SQUARE OV
+3376;W;SQUARE PC
+337B;W;SQUARE ERA NAME HEISEI
+337C;W;SQUARE ERA NAME SYOUWA
+337D;W;SQUARE ERA NAME TAISYOU
+337E;W;SQUARE ERA NAME MEIZI
+337F;W;SQUARE CORPORATION
+3380;W;SQUARE PA AMPS
+3381;W;SQUARE NA
+3382;W;SQUARE MU A
+3383;W;SQUARE MA
+3384;W;SQUARE KA
+3385;W;SQUARE KB
+3386;W;SQUARE MB
+3387;W;SQUARE GB
+3388;W;SQUARE CAL
+3389;W;SQUARE KCAL
+338A;W;SQUARE PF
+338B;W;SQUARE NF
+338C;W;SQUARE MU F
+338D;W;SQUARE MU G
+338E;W;SQUARE MG
+338F;W;SQUARE KG
+3390;W;SQUARE HZ
+3391;W;SQUARE KHZ
+3392;W;SQUARE MHZ
+3393;W;SQUARE GHZ
+3394;W;SQUARE THZ
+3395;W;SQUARE MU L
+3396;W;SQUARE ML
+3397;W;SQUARE DL
+3398;W;SQUARE KL
+3399;W;SQUARE FM
+339A;W;SQUARE NM
+339B;W;SQUARE MU M
+339C;W;SQUARE MM
+339D;W;SQUARE CM
+339E;W;SQUARE KM
+339F;W;SQUARE MM SQUARED
+33A0;W;SQUARE CM SQUARED
+33A1;W;SQUARE M SQUARED
+33A2;W;SQUARE KM SQUARED
+33A3;W;SQUARE MM CUBED
+33A4;W;SQUARE CM CUBED
+33A5;W;SQUARE M CUBED
+33A6;W;SQUARE KM CUBED
+33A7;W;SQUARE M OVER S
+33A8;W;SQUARE M OVER S SQUARED
+33A9;W;SQUARE PA
+33AA;W;SQUARE KPA
+33AB;W;SQUARE MPA
+33AC;W;SQUARE GPA
+33AD;W;SQUARE RAD
+33AE;W;SQUARE RAD OVER S
+33AF;W;SQUARE RAD OVER S SQUARED
+33B0;W;SQUARE PS
+33B1;W;SQUARE NS
+33B2;W;SQUARE MU S
+33B3;W;SQUARE MS
+33B4;W;SQUARE PV
+33B5;W;SQUARE NV
+33B6;W;SQUARE MU V
+33B7;W;SQUARE MV
+33B8;W;SQUARE KV
+33B9;W;SQUARE MV MEGA
+33BA;W;SQUARE PW
+33BB;W;SQUARE NW
+33BC;W;SQUARE MU W
+33BD;W;SQUARE MW
+33BE;W;SQUARE KW
+33BF;W;SQUARE MW MEGA
+33C0;W;SQUARE K OHM
+33C1;W;SQUARE M OHM
+33C2;W;SQUARE AM
+33C3;W;SQUARE BQ
+33C4;W;SQUARE CC
+33C5;W;SQUARE CD
+33C6;W;SQUARE C OVER KG
+33C7;W;SQUARE CO
+33C8;W;SQUARE DB
+33C9;W;SQUARE GY
+33CA;W;SQUARE HA
+33CB;W;SQUARE HP
+33CC;W;SQUARE IN
+33CD;W;SQUARE KK
+33CE;W;SQUARE KM CAPITAL
+33CF;W;SQUARE KT
+33D0;W;SQUARE LM
+33D1;W;SQUARE LN
+33D2;W;SQUARE LOG
+33D3;W;SQUARE LX
+33D4;W;SQUARE MB SMALL
+33D5;W;SQUARE MIL
+33D6;W;SQUARE MOL
+33D7;W;SQUARE PH
+33D8;W;SQUARE PM
+33D9;W;SQUARE PPM
+33DA;W;SQUARE PR
+33DB;W;SQUARE SR
+33DC;W;SQUARE SV
+33DD;W;SQUARE WB
+33E0;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE;W;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+3400;W;<CJK Ideograph Extension A, First>
+4DB5;W;<CJK Ideograph Extension A, Last>
+4E00;W;<CJK Ideograph, First>
+9FA5;W;<CJK Ideograph, Last>
+A000;W;YI SYLLABLE IT
+A001;W;YI SYLLABLE IX
+A002;W;YI SYLLABLE I
+A003;W;YI SYLLABLE IP
+A004;W;YI SYLLABLE IET
+A005;W;YI SYLLABLE IEX
+A006;W;YI SYLLABLE IE
+A007;W;YI SYLLABLE IEP
+A008;W;YI SYLLABLE AT
+A009;W;YI SYLLABLE AX
+A00A;W;YI SYLLABLE A
+A00B;W;YI SYLLABLE AP
+A00C;W;YI SYLLABLE UOX
+A00D;W;YI SYLLABLE UO
+A00E;W;YI SYLLABLE UOP
+A00F;W;YI SYLLABLE OT
+A010;W;YI SYLLABLE OX
+A011;W;YI SYLLABLE O
+A012;W;YI SYLLABLE OP
+A013;W;YI SYLLABLE EX
+A014;W;YI SYLLABLE E
+A015;W;YI SYLLABLE WU
+A016;W;YI SYLLABLE BIT
+A017;W;YI SYLLABLE BIX
+A018;W;YI SYLLABLE BI
+A019;W;YI SYLLABLE BIP
+A01A;W;YI SYLLABLE BIET
+A01B;W;YI SYLLABLE BIEX
+A01C;W;YI SYLLABLE BIE
+A01D;W;YI SYLLABLE BIEP
+A01E;W;YI SYLLABLE BAT
+A01F;W;YI SYLLABLE BAX
+A020;W;YI SYLLABLE BA
+A021;W;YI SYLLABLE BAP
+A022;W;YI SYLLABLE BUOX
+A023;W;YI SYLLABLE BUO
+A024;W;YI SYLLABLE BUOP
+A025;W;YI SYLLABLE BOT
+A026;W;YI SYLLABLE BOX
+A027;W;YI SYLLABLE BO
+A028;W;YI SYLLABLE BOP
+A029;W;YI SYLLABLE BEX
+A02A;W;YI SYLLABLE BE
+A02B;W;YI SYLLABLE BEP
+A02C;W;YI SYLLABLE BUT
+A02D;W;YI SYLLABLE BUX
+A02E;W;YI SYLLABLE BU
+A02F;W;YI SYLLABLE BUP
+A030;W;YI SYLLABLE BURX
+A031;W;YI SYLLABLE BUR
+A032;W;YI SYLLABLE BYT
+A033;W;YI SYLLABLE BYX
+A034;W;YI SYLLABLE BY
+A035;W;YI SYLLABLE BYP
+A036;W;YI SYLLABLE BYRX
+A037;W;YI SYLLABLE BYR
+A038;W;YI SYLLABLE PIT
+A039;W;YI SYLLABLE PIX
+A03A;W;YI SYLLABLE PI
+A03B;W;YI SYLLABLE PIP
+A03C;W;YI SYLLABLE PIEX
+A03D;W;YI SYLLABLE PIE
+A03E;W;YI SYLLABLE PIEP
+A03F;W;YI SYLLABLE PAT
+A040;W;YI SYLLABLE PAX
+A041;W;YI SYLLABLE PA
+A042;W;YI SYLLABLE PAP
+A043;W;YI SYLLABLE PUOX
+A044;W;YI SYLLABLE PUO
+A045;W;YI SYLLABLE PUOP
+A046;W;YI SYLLABLE POT
+A047;W;YI SYLLABLE POX
+A048;W;YI SYLLABLE PO
+A049;W;YI SYLLABLE POP
+A04A;W;YI SYLLABLE PUT
+A04B;W;YI SYLLABLE PUX
+A04C;W;YI SYLLABLE PU
+A04D;W;YI SYLLABLE PUP
+A04E;W;YI SYLLABLE PURX
+A04F;W;YI SYLLABLE PUR
+A050;W;YI SYLLABLE PYT
+A051;W;YI SYLLABLE PYX
+A052;W;YI SYLLABLE PY
+A053;W;YI SYLLABLE PYP
+A054;W;YI SYLLABLE PYRX
+A055;W;YI SYLLABLE PYR
+A056;W;YI SYLLABLE BBIT
+A057;W;YI SYLLABLE BBIX
+A058;W;YI SYLLABLE BBI
+A059;W;YI SYLLABLE BBIP
+A05A;W;YI SYLLABLE BBIET
+A05B;W;YI SYLLABLE BBIEX
+A05C;W;YI SYLLABLE BBIE
+A05D;W;YI SYLLABLE BBIEP
+A05E;W;YI SYLLABLE BBAT
+A05F;W;YI SYLLABLE BBAX
+A060;W;YI SYLLABLE BBA
+A061;W;YI SYLLABLE BBAP
+A062;W;YI SYLLABLE BBUOX
+A063;W;YI SYLLABLE BBUO
+A064;W;YI SYLLABLE BBUOP
+A065;W;YI SYLLABLE BBOT
+A066;W;YI SYLLABLE BBOX
+A067;W;YI SYLLABLE BBO
+A068;W;YI SYLLABLE BBOP
+A069;W;YI SYLLABLE BBEX
+A06A;W;YI SYLLABLE BBE
+A06B;W;YI SYLLABLE BBEP
+A06C;W;YI SYLLABLE BBUT
+A06D;W;YI SYLLABLE BBUX
+A06E;W;YI SYLLABLE BBU
+A06F;W;YI SYLLABLE BBUP
+A070;W;YI SYLLABLE BBURX
+A071;W;YI SYLLABLE BBUR
+A072;W;YI SYLLABLE BBYT
+A073;W;YI SYLLABLE BBYX
+A074;W;YI SYLLABLE BBY
+A075;W;YI SYLLABLE BBYP
+A076;W;YI SYLLABLE NBIT
+A077;W;YI SYLLABLE NBIX
+A078;W;YI SYLLABLE NBI
+A079;W;YI SYLLABLE NBIP
+A07A;W;YI SYLLABLE NBIEX
+A07B;W;YI SYLLABLE NBIE
+A07C;W;YI SYLLABLE NBIEP
+A07D;W;YI SYLLABLE NBAT
+A07E;W;YI SYLLABLE NBAX
+A07F;W;YI SYLLABLE NBA
+A080;W;YI SYLLABLE NBAP
+A081;W;YI SYLLABLE NBOT
+A082;W;YI SYLLABLE NBOX
+A083;W;YI SYLLABLE NBO
+A084;W;YI SYLLABLE NBOP
+A085;W;YI SYLLABLE NBUT
+A086;W;YI SYLLABLE NBUX
+A087;W;YI SYLLABLE NBU
+A088;W;YI SYLLABLE NBUP
+A089;W;YI SYLLABLE NBURX
+A08A;W;YI SYLLABLE NBUR
+A08B;W;YI SYLLABLE NBYT
+A08C;W;YI SYLLABLE NBYX
+A08D;W;YI SYLLABLE NBY
+A08E;W;YI SYLLABLE NBYP
+A08F;W;YI SYLLABLE NBYRX
+A090;W;YI SYLLABLE NBYR
+A091;W;YI SYLLABLE HMIT
+A092;W;YI SYLLABLE HMIX
+A093;W;YI SYLLABLE HMI
+A094;W;YI SYLLABLE HMIP
+A095;W;YI SYLLABLE HMIEX
+A096;W;YI SYLLABLE HMIE
+A097;W;YI SYLLABLE HMIEP
+A098;W;YI SYLLABLE HMAT
+A099;W;YI SYLLABLE HMAX
+A09A;W;YI SYLLABLE HMA
+A09B;W;YI SYLLABLE HMAP
+A09C;W;YI SYLLABLE HMUOX
+A09D;W;YI SYLLABLE HMUO
+A09E;W;YI SYLLABLE HMUOP
+A09F;W;YI SYLLABLE HMOT
+A0A0;W;YI SYLLABLE HMOX
+A0A1;W;YI SYLLABLE HMO
+A0A2;W;YI SYLLABLE HMOP
+A0A3;W;YI SYLLABLE HMUT
+A0A4;W;YI SYLLABLE HMUX
+A0A5;W;YI SYLLABLE HMU
+A0A6;W;YI SYLLABLE HMUP
+A0A7;W;YI SYLLABLE HMURX
+A0A8;W;YI SYLLABLE HMUR
+A0A9;W;YI SYLLABLE HMYX
+A0AA;W;YI SYLLABLE HMY
+A0AB;W;YI SYLLABLE HMYP
+A0AC;W;YI SYLLABLE HMYRX
+A0AD;W;YI SYLLABLE HMYR
+A0AE;W;YI SYLLABLE MIT
+A0AF;W;YI SYLLABLE MIX
+A0B0;W;YI SYLLABLE MI
+A0B1;W;YI SYLLABLE MIP
+A0B2;W;YI SYLLABLE MIEX
+A0B3;W;YI SYLLABLE MIE
+A0B4;W;YI SYLLABLE MIEP
+A0B5;W;YI SYLLABLE MAT
+A0B6;W;YI SYLLABLE MAX
+A0B7;W;YI SYLLABLE MA
+A0B8;W;YI SYLLABLE MAP
+A0B9;W;YI SYLLABLE MUOT
+A0BA;W;YI SYLLABLE MUOX
+A0BB;W;YI SYLLABLE MUO
+A0BC;W;YI SYLLABLE MUOP
+A0BD;W;YI SYLLABLE MOT
+A0BE;W;YI SYLLABLE MOX
+A0BF;W;YI SYLLABLE MO
+A0C0;W;YI SYLLABLE MOP
+A0C1;W;YI SYLLABLE MEX
+A0C2;W;YI SYLLABLE ME
+A0C3;W;YI SYLLABLE MUT
+A0C4;W;YI SYLLABLE MUX
+A0C5;W;YI SYLLABLE MU
+A0C6;W;YI SYLLABLE MUP
+A0C7;W;YI SYLLABLE MURX
+A0C8;W;YI SYLLABLE MUR
+A0C9;W;YI SYLLABLE MYT
+A0CA;W;YI SYLLABLE MYX
+A0CB;W;YI SYLLABLE MY
+A0CC;W;YI SYLLABLE MYP
+A0CD;W;YI SYLLABLE FIT
+A0CE;W;YI SYLLABLE FIX
+A0CF;W;YI SYLLABLE FI
+A0D0;W;YI SYLLABLE FIP
+A0D1;W;YI SYLLABLE FAT
+A0D2;W;YI SYLLABLE FAX
+A0D3;W;YI SYLLABLE FA
+A0D4;W;YI SYLLABLE FAP
+A0D5;W;YI SYLLABLE FOX
+A0D6;W;YI SYLLABLE FO
+A0D7;W;YI SYLLABLE FOP
+A0D8;W;YI SYLLABLE FUT
+A0D9;W;YI SYLLABLE FUX
+A0DA;W;YI SYLLABLE FU
+A0DB;W;YI SYLLABLE FUP
+A0DC;W;YI SYLLABLE FURX
+A0DD;W;YI SYLLABLE FUR
+A0DE;W;YI SYLLABLE FYT
+A0DF;W;YI SYLLABLE FYX
+A0E0;W;YI SYLLABLE FY
+A0E1;W;YI SYLLABLE FYP
+A0E2;W;YI SYLLABLE VIT
+A0E3;W;YI SYLLABLE VIX
+A0E4;W;YI SYLLABLE VI
+A0E5;W;YI SYLLABLE VIP
+A0E6;W;YI SYLLABLE VIET
+A0E7;W;YI SYLLABLE VIEX
+A0E8;W;YI SYLLABLE VIE
+A0E9;W;YI SYLLABLE VIEP
+A0EA;W;YI SYLLABLE VAT
+A0EB;W;YI SYLLABLE VAX
+A0EC;W;YI SYLLABLE VA
+A0ED;W;YI SYLLABLE VAP
+A0EE;W;YI SYLLABLE VOT
+A0EF;W;YI SYLLABLE VOX
+A0F0;W;YI SYLLABLE VO
+A0F1;W;YI SYLLABLE VOP
+A0F2;W;YI SYLLABLE VEX
+A0F3;W;YI SYLLABLE VEP
+A0F4;W;YI SYLLABLE VUT
+A0F5;W;YI SYLLABLE VUX
+A0F6;W;YI SYLLABLE VU
+A0F7;W;YI SYLLABLE VUP
+A0F8;W;YI SYLLABLE VURX
+A0F9;W;YI SYLLABLE VUR
+A0FA;W;YI SYLLABLE VYT
+A0FB;W;YI SYLLABLE VYX
+A0FC;W;YI SYLLABLE VY
+A0FD;W;YI SYLLABLE VYP
+A0FE;W;YI SYLLABLE VYRX
+A0FF;W;YI SYLLABLE VYR
+A100;W;YI SYLLABLE DIT
+A101;W;YI SYLLABLE DIX
+A102;W;YI SYLLABLE DI
+A103;W;YI SYLLABLE DIP
+A104;W;YI SYLLABLE DIEX
+A105;W;YI SYLLABLE DIE
+A106;W;YI SYLLABLE DIEP
+A107;W;YI SYLLABLE DAT
+A108;W;YI SYLLABLE DAX
+A109;W;YI SYLLABLE DA
+A10A;W;YI SYLLABLE DAP
+A10B;W;YI SYLLABLE DUOX
+A10C;W;YI SYLLABLE DUO
+A10D;W;YI SYLLABLE DOT
+A10E;W;YI SYLLABLE DOX
+A10F;W;YI SYLLABLE DO
+A110;W;YI SYLLABLE DOP
+A111;W;YI SYLLABLE DEX
+A112;W;YI SYLLABLE DE
+A113;W;YI SYLLABLE DEP
+A114;W;YI SYLLABLE DUT
+A115;W;YI SYLLABLE DUX
+A116;W;YI SYLLABLE DU
+A117;W;YI SYLLABLE DUP
+A118;W;YI SYLLABLE DURX
+A119;W;YI SYLLABLE DUR
+A11A;W;YI SYLLABLE TIT
+A11B;W;YI SYLLABLE TIX
+A11C;W;YI SYLLABLE TI
+A11D;W;YI SYLLABLE TIP
+A11E;W;YI SYLLABLE TIEX
+A11F;W;YI SYLLABLE TIE
+A120;W;YI SYLLABLE TIEP
+A121;W;YI SYLLABLE TAT
+A122;W;YI SYLLABLE TAX
+A123;W;YI SYLLABLE TA
+A124;W;YI SYLLABLE TAP
+A125;W;YI SYLLABLE TUOT
+A126;W;YI SYLLABLE TUOX
+A127;W;YI SYLLABLE TUO
+A128;W;YI SYLLABLE TUOP
+A129;W;YI SYLLABLE TOT
+A12A;W;YI SYLLABLE TOX
+A12B;W;YI SYLLABLE TO
+A12C;W;YI SYLLABLE TOP
+A12D;W;YI SYLLABLE TEX
+A12E;W;YI SYLLABLE TE
+A12F;W;YI SYLLABLE TEP
+A130;W;YI SYLLABLE TUT
+A131;W;YI SYLLABLE TUX
+A132;W;YI SYLLABLE TU
+A133;W;YI SYLLABLE TUP
+A134;W;YI SYLLABLE TURX
+A135;W;YI SYLLABLE TUR
+A136;W;YI SYLLABLE DDIT
+A137;W;YI SYLLABLE DDIX
+A138;W;YI SYLLABLE DDI
+A139;W;YI SYLLABLE DDIP
+A13A;W;YI SYLLABLE DDIEX
+A13B;W;YI SYLLABLE DDIE
+A13C;W;YI SYLLABLE DDIEP
+A13D;W;YI SYLLABLE DDAT
+A13E;W;YI SYLLABLE DDAX
+A13F;W;YI SYLLABLE DDA
+A140;W;YI SYLLABLE DDAP
+A141;W;YI SYLLABLE DDUOX
+A142;W;YI SYLLABLE DDUO
+A143;W;YI SYLLABLE DDUOP
+A144;W;YI SYLLABLE DDOT
+A145;W;YI SYLLABLE DDOX
+A146;W;YI SYLLABLE DDO
+A147;W;YI SYLLABLE DDOP
+A148;W;YI SYLLABLE DDEX
+A149;W;YI SYLLABLE DDE
+A14A;W;YI SYLLABLE DDEP
+A14B;W;YI SYLLABLE DDUT
+A14C;W;YI SYLLABLE DDUX
+A14D;W;YI SYLLABLE DDU
+A14E;W;YI SYLLABLE DDUP
+A14F;W;YI SYLLABLE DDURX
+A150;W;YI SYLLABLE DDUR
+A151;W;YI SYLLABLE NDIT
+A152;W;YI SYLLABLE NDIX
+A153;W;YI SYLLABLE NDI
+A154;W;YI SYLLABLE NDIP
+A155;W;YI SYLLABLE NDIEX
+A156;W;YI SYLLABLE NDIE
+A157;W;YI SYLLABLE NDAT
+A158;W;YI SYLLABLE NDAX
+A159;W;YI SYLLABLE NDA
+A15A;W;YI SYLLABLE NDAP
+A15B;W;YI SYLLABLE NDOT
+A15C;W;YI SYLLABLE NDOX
+A15D;W;YI SYLLABLE NDO
+A15E;W;YI SYLLABLE NDOP
+A15F;W;YI SYLLABLE NDEX
+A160;W;YI SYLLABLE NDE
+A161;W;YI SYLLABLE NDEP
+A162;W;YI SYLLABLE NDUT
+A163;W;YI SYLLABLE NDUX
+A164;W;YI SYLLABLE NDU
+A165;W;YI SYLLABLE NDUP
+A166;W;YI SYLLABLE NDURX
+A167;W;YI SYLLABLE NDUR
+A168;W;YI SYLLABLE HNIT
+A169;W;YI SYLLABLE HNIX
+A16A;W;YI SYLLABLE HNI
+A16B;W;YI SYLLABLE HNIP
+A16C;W;YI SYLLABLE HNIET
+A16D;W;YI SYLLABLE HNIEX
+A16E;W;YI SYLLABLE HNIE
+A16F;W;YI SYLLABLE HNIEP
+A170;W;YI SYLLABLE HNAT
+A171;W;YI SYLLABLE HNAX
+A172;W;YI SYLLABLE HNA
+A173;W;YI SYLLABLE HNAP
+A174;W;YI SYLLABLE HNUOX
+A175;W;YI SYLLABLE HNUO
+A176;W;YI SYLLABLE HNOT
+A177;W;YI SYLLABLE HNOX
+A178;W;YI SYLLABLE HNOP
+A179;W;YI SYLLABLE HNEX
+A17A;W;YI SYLLABLE HNE
+A17B;W;YI SYLLABLE HNEP
+A17C;W;YI SYLLABLE HNUT
+A17D;W;YI SYLLABLE NIT
+A17E;W;YI SYLLABLE NIX
+A17F;W;YI SYLLABLE NI
+A180;W;YI SYLLABLE NIP
+A181;W;YI SYLLABLE NIEX
+A182;W;YI SYLLABLE NIE
+A183;W;YI SYLLABLE NIEP
+A184;W;YI SYLLABLE NAX
+A185;W;YI SYLLABLE NA
+A186;W;YI SYLLABLE NAP
+A187;W;YI SYLLABLE NUOX
+A188;W;YI SYLLABLE NUO
+A189;W;YI SYLLABLE NUOP
+A18A;W;YI SYLLABLE NOT
+A18B;W;YI SYLLABLE NOX
+A18C;W;YI SYLLABLE NO
+A18D;W;YI SYLLABLE NOP
+A18E;W;YI SYLLABLE NEX
+A18F;W;YI SYLLABLE NE
+A190;W;YI SYLLABLE NEP
+A191;W;YI SYLLABLE NUT
+A192;W;YI SYLLABLE NUX
+A193;W;YI SYLLABLE NU
+A194;W;YI SYLLABLE NUP
+A195;W;YI SYLLABLE NURX
+A196;W;YI SYLLABLE NUR
+A197;W;YI SYLLABLE HLIT
+A198;W;YI SYLLABLE HLIX
+A199;W;YI SYLLABLE HLI
+A19A;W;YI SYLLABLE HLIP
+A19B;W;YI SYLLABLE HLIEX
+A19C;W;YI SYLLABLE HLIE
+A19D;W;YI SYLLABLE HLIEP
+A19E;W;YI SYLLABLE HLAT
+A19F;W;YI SYLLABLE HLAX
+A1A0;W;YI SYLLABLE HLA
+A1A1;W;YI SYLLABLE HLAP
+A1A2;W;YI SYLLABLE HLUOX
+A1A3;W;YI SYLLABLE HLUO
+A1A4;W;YI SYLLABLE HLUOP
+A1A5;W;YI SYLLABLE HLOX
+A1A6;W;YI SYLLABLE HLO
+A1A7;W;YI SYLLABLE HLOP
+A1A8;W;YI SYLLABLE HLEX
+A1A9;W;YI SYLLABLE HLE
+A1AA;W;YI SYLLABLE HLEP
+A1AB;W;YI SYLLABLE HLUT
+A1AC;W;YI SYLLABLE HLUX
+A1AD;W;YI SYLLABLE HLU
+A1AE;W;YI SYLLABLE HLUP
+A1AF;W;YI SYLLABLE HLURX
+A1B0;W;YI SYLLABLE HLUR
+A1B1;W;YI SYLLABLE HLYT
+A1B2;W;YI SYLLABLE HLYX
+A1B3;W;YI SYLLABLE HLY
+A1B4;W;YI SYLLABLE HLYP
+A1B5;W;YI SYLLABLE HLYRX
+A1B6;W;YI SYLLABLE HLYR
+A1B7;W;YI SYLLABLE LIT
+A1B8;W;YI SYLLABLE LIX
+A1B9;W;YI SYLLABLE LI
+A1BA;W;YI SYLLABLE LIP
+A1BB;W;YI SYLLABLE LIET
+A1BC;W;YI SYLLABLE LIEX
+A1BD;W;YI SYLLABLE LIE
+A1BE;W;YI SYLLABLE LIEP
+A1BF;W;YI SYLLABLE LAT
+A1C0;W;YI SYLLABLE LAX
+A1C1;W;YI SYLLABLE LA
+A1C2;W;YI SYLLABLE LAP
+A1C3;W;YI SYLLABLE LUOT
+A1C4;W;YI SYLLABLE LUOX
+A1C5;W;YI SYLLABLE LUO
+A1C6;W;YI SYLLABLE LUOP
+A1C7;W;YI SYLLABLE LOT
+A1C8;W;YI SYLLABLE LOX
+A1C9;W;YI SYLLABLE LO
+A1CA;W;YI SYLLABLE LOP
+A1CB;W;YI SYLLABLE LEX
+A1CC;W;YI SYLLABLE LE
+A1CD;W;YI SYLLABLE LEP
+A1CE;W;YI SYLLABLE LUT
+A1CF;W;YI SYLLABLE LUX
+A1D0;W;YI SYLLABLE LU
+A1D1;W;YI SYLLABLE LUP
+A1D2;W;YI SYLLABLE LURX
+A1D3;W;YI SYLLABLE LUR
+A1D4;W;YI SYLLABLE LYT
+A1D5;W;YI SYLLABLE LYX
+A1D6;W;YI SYLLABLE LY
+A1D7;W;YI SYLLABLE LYP
+A1D8;W;YI SYLLABLE LYRX
+A1D9;W;YI SYLLABLE LYR
+A1DA;W;YI SYLLABLE GIT
+A1DB;W;YI SYLLABLE GIX
+A1DC;W;YI SYLLABLE GI
+A1DD;W;YI SYLLABLE GIP
+A1DE;W;YI SYLLABLE GIET
+A1DF;W;YI SYLLABLE GIEX
+A1E0;W;YI SYLLABLE GIE
+A1E1;W;YI SYLLABLE GIEP
+A1E2;W;YI SYLLABLE GAT
+A1E3;W;YI SYLLABLE GAX
+A1E4;W;YI SYLLABLE GA
+A1E5;W;YI SYLLABLE GAP
+A1E6;W;YI SYLLABLE GUOT
+A1E7;W;YI SYLLABLE GUOX
+A1E8;W;YI SYLLABLE GUO
+A1E9;W;YI SYLLABLE GUOP
+A1EA;W;YI SYLLABLE GOT
+A1EB;W;YI SYLLABLE GOX
+A1EC;W;YI SYLLABLE GO
+A1ED;W;YI SYLLABLE GOP
+A1EE;W;YI SYLLABLE GET
+A1EF;W;YI SYLLABLE GEX
+A1F0;W;YI SYLLABLE GE
+A1F1;W;YI SYLLABLE GEP
+A1F2;W;YI SYLLABLE GUT
+A1F3;W;YI SYLLABLE GUX
+A1F4;W;YI SYLLABLE GU
+A1F5;W;YI SYLLABLE GUP
+A1F6;W;YI SYLLABLE GURX
+A1F7;W;YI SYLLABLE GUR
+A1F8;W;YI SYLLABLE KIT
+A1F9;W;YI SYLLABLE KIX
+A1FA;W;YI SYLLABLE KI
+A1FB;W;YI SYLLABLE KIP
+A1FC;W;YI SYLLABLE KIEX
+A1FD;W;YI SYLLABLE KIE
+A1FE;W;YI SYLLABLE KIEP
+A1FF;W;YI SYLLABLE KAT
+A200;W;YI SYLLABLE KAX
+A201;W;YI SYLLABLE KA
+A202;W;YI SYLLABLE KAP
+A203;W;YI SYLLABLE KUOX
+A204;W;YI SYLLABLE KUO
+A205;W;YI SYLLABLE KUOP
+A206;W;YI SYLLABLE KOT
+A207;W;YI SYLLABLE KOX
+A208;W;YI SYLLABLE KO
+A209;W;YI SYLLABLE KOP
+A20A;W;YI SYLLABLE KET
+A20B;W;YI SYLLABLE KEX
+A20C;W;YI SYLLABLE KE
+A20D;W;YI SYLLABLE KEP
+A20E;W;YI SYLLABLE KUT
+A20F;W;YI SYLLABLE KUX
+A210;W;YI SYLLABLE KU
+A211;W;YI SYLLABLE KUP
+A212;W;YI SYLLABLE KURX
+A213;W;YI SYLLABLE KUR
+A214;W;YI SYLLABLE GGIT
+A215;W;YI SYLLABLE GGIX
+A216;W;YI SYLLABLE GGI
+A217;W;YI SYLLABLE GGIEX
+A218;W;YI SYLLABLE GGIE
+A219;W;YI SYLLABLE GGIEP
+A21A;W;YI SYLLABLE GGAT
+A21B;W;YI SYLLABLE GGAX
+A21C;W;YI SYLLABLE GGA
+A21D;W;YI SYLLABLE GGAP
+A21E;W;YI SYLLABLE GGUOT
+A21F;W;YI SYLLABLE GGUOX
+A220;W;YI SYLLABLE GGUO
+A221;W;YI SYLLABLE GGUOP
+A222;W;YI SYLLABLE GGOT
+A223;W;YI SYLLABLE GGOX
+A224;W;YI SYLLABLE GGO
+A225;W;YI SYLLABLE GGOP
+A226;W;YI SYLLABLE GGET
+A227;W;YI SYLLABLE GGEX
+A228;W;YI SYLLABLE GGE
+A229;W;YI SYLLABLE GGEP
+A22A;W;YI SYLLABLE GGUT
+A22B;W;YI SYLLABLE GGUX
+A22C;W;YI SYLLABLE GGU
+A22D;W;YI SYLLABLE GGUP
+A22E;W;YI SYLLABLE GGURX
+A22F;W;YI SYLLABLE GGUR
+A230;W;YI SYLLABLE MGIEX
+A231;W;YI SYLLABLE MGIE
+A232;W;YI SYLLABLE MGAT
+A233;W;YI SYLLABLE MGAX
+A234;W;YI SYLLABLE MGA
+A235;W;YI SYLLABLE MGAP
+A236;W;YI SYLLABLE MGUOX
+A237;W;YI SYLLABLE MGUO
+A238;W;YI SYLLABLE MGUOP
+A239;W;YI SYLLABLE MGOT
+A23A;W;YI SYLLABLE MGOX
+A23B;W;YI SYLLABLE MGO
+A23C;W;YI SYLLABLE MGOP
+A23D;W;YI SYLLABLE MGEX
+A23E;W;YI SYLLABLE MGE
+A23F;W;YI SYLLABLE MGEP
+A240;W;YI SYLLABLE MGUT
+A241;W;YI SYLLABLE MGUX
+A242;W;YI SYLLABLE MGU
+A243;W;YI SYLLABLE MGUP
+A244;W;YI SYLLABLE MGURX
+A245;W;YI SYLLABLE MGUR
+A246;W;YI SYLLABLE HXIT
+A247;W;YI SYLLABLE HXIX
+A248;W;YI SYLLABLE HXI
+A249;W;YI SYLLABLE HXIP
+A24A;W;YI SYLLABLE HXIET
+A24B;W;YI SYLLABLE HXIEX
+A24C;W;YI SYLLABLE HXIE
+A24D;W;YI SYLLABLE HXIEP
+A24E;W;YI SYLLABLE HXAT
+A24F;W;YI SYLLABLE HXAX
+A250;W;YI SYLLABLE HXA
+A251;W;YI SYLLABLE HXAP
+A252;W;YI SYLLABLE HXUOT
+A253;W;YI SYLLABLE HXUOX
+A254;W;YI SYLLABLE HXUO
+A255;W;YI SYLLABLE HXUOP
+A256;W;YI SYLLABLE HXOT
+A257;W;YI SYLLABLE HXOX
+A258;W;YI SYLLABLE HXO
+A259;W;YI SYLLABLE HXOP
+A25A;W;YI SYLLABLE HXEX
+A25B;W;YI SYLLABLE HXE
+A25C;W;YI SYLLABLE HXEP
+A25D;W;YI SYLLABLE NGIEX
+A25E;W;YI SYLLABLE NGIE
+A25F;W;YI SYLLABLE NGIEP
+A260;W;YI SYLLABLE NGAT
+A261;W;YI SYLLABLE NGAX
+A262;W;YI SYLLABLE NGA
+A263;W;YI SYLLABLE NGAP
+A264;W;YI SYLLABLE NGUOT
+A265;W;YI SYLLABLE NGUOX
+A266;W;YI SYLLABLE NGUO
+A267;W;YI SYLLABLE NGOT
+A268;W;YI SYLLABLE NGOX
+A269;W;YI SYLLABLE NGO
+A26A;W;YI SYLLABLE NGOP
+A26B;W;YI SYLLABLE NGEX
+A26C;W;YI SYLLABLE NGE
+A26D;W;YI SYLLABLE NGEP
+A26E;W;YI SYLLABLE HIT
+A26F;W;YI SYLLABLE HIEX
+A270;W;YI SYLLABLE HIE
+A271;W;YI SYLLABLE HAT
+A272;W;YI SYLLABLE HAX
+A273;W;YI SYLLABLE HA
+A274;W;YI SYLLABLE HAP
+A275;W;YI SYLLABLE HUOT
+A276;W;YI SYLLABLE HUOX
+A277;W;YI SYLLABLE HUO
+A278;W;YI SYLLABLE HUOP
+A279;W;YI SYLLABLE HOT
+A27A;W;YI SYLLABLE HOX
+A27B;W;YI SYLLABLE HO
+A27C;W;YI SYLLABLE HOP
+A27D;W;YI SYLLABLE HEX
+A27E;W;YI SYLLABLE HE
+A27F;W;YI SYLLABLE HEP
+A280;W;YI SYLLABLE WAT
+A281;W;YI SYLLABLE WAX
+A282;W;YI SYLLABLE WA
+A283;W;YI SYLLABLE WAP
+A284;W;YI SYLLABLE WUOX
+A285;W;YI SYLLABLE WUO
+A286;W;YI SYLLABLE WUOP
+A287;W;YI SYLLABLE WOX
+A288;W;YI SYLLABLE WO
+A289;W;YI SYLLABLE WOP
+A28A;W;YI SYLLABLE WEX
+A28B;W;YI SYLLABLE WE
+A28C;W;YI SYLLABLE WEP
+A28D;W;YI SYLLABLE ZIT
+A28E;W;YI SYLLABLE ZIX
+A28F;W;YI SYLLABLE ZI
+A290;W;YI SYLLABLE ZIP
+A291;W;YI SYLLABLE ZIEX
+A292;W;YI SYLLABLE ZIE
+A293;W;YI SYLLABLE ZIEP
+A294;W;YI SYLLABLE ZAT
+A295;W;YI SYLLABLE ZAX
+A296;W;YI SYLLABLE ZA
+A297;W;YI SYLLABLE ZAP
+A298;W;YI SYLLABLE ZUOX
+A299;W;YI SYLLABLE ZUO
+A29A;W;YI SYLLABLE ZUOP
+A29B;W;YI SYLLABLE ZOT
+A29C;W;YI SYLLABLE ZOX
+A29D;W;YI SYLLABLE ZO
+A29E;W;YI SYLLABLE ZOP
+A29F;W;YI SYLLABLE ZEX
+A2A0;W;YI SYLLABLE ZE
+A2A1;W;YI SYLLABLE ZEP
+A2A2;W;YI SYLLABLE ZUT
+A2A3;W;YI SYLLABLE ZUX
+A2A4;W;YI SYLLABLE ZU
+A2A5;W;YI SYLLABLE ZUP
+A2A6;W;YI SYLLABLE ZURX
+A2A7;W;YI SYLLABLE ZUR
+A2A8;W;YI SYLLABLE ZYT
+A2A9;W;YI SYLLABLE ZYX
+A2AA;W;YI SYLLABLE ZY
+A2AB;W;YI SYLLABLE ZYP
+A2AC;W;YI SYLLABLE ZYRX
+A2AD;W;YI SYLLABLE ZYR
+A2AE;W;YI SYLLABLE CIT
+A2AF;W;YI SYLLABLE CIX
+A2B0;W;YI SYLLABLE CI
+A2B1;W;YI SYLLABLE CIP
+A2B2;W;YI SYLLABLE CIET
+A2B3;W;YI SYLLABLE CIEX
+A2B4;W;YI SYLLABLE CIE
+A2B5;W;YI SYLLABLE CIEP
+A2B6;W;YI SYLLABLE CAT
+A2B7;W;YI SYLLABLE CAX
+A2B8;W;YI SYLLABLE CA
+A2B9;W;YI SYLLABLE CAP
+A2BA;W;YI SYLLABLE CUOX
+A2BB;W;YI SYLLABLE CUO
+A2BC;W;YI SYLLABLE CUOP
+A2BD;W;YI SYLLABLE COT
+A2BE;W;YI SYLLABLE COX
+A2BF;W;YI SYLLABLE CO
+A2C0;W;YI SYLLABLE COP
+A2C1;W;YI SYLLABLE CEX
+A2C2;W;YI SYLLABLE CE
+A2C3;W;YI SYLLABLE CEP
+A2C4;W;YI SYLLABLE CUT
+A2C5;W;YI SYLLABLE CUX
+A2C6;W;YI SYLLABLE CU
+A2C7;W;YI SYLLABLE CUP
+A2C8;W;YI SYLLABLE CURX
+A2C9;W;YI SYLLABLE CUR
+A2CA;W;YI SYLLABLE CYT
+A2CB;W;YI SYLLABLE CYX
+A2CC;W;YI SYLLABLE CY
+A2CD;W;YI SYLLABLE CYP
+A2CE;W;YI SYLLABLE CYRX
+A2CF;W;YI SYLLABLE CYR
+A2D0;W;YI SYLLABLE ZZIT
+A2D1;W;YI SYLLABLE ZZIX
+A2D2;W;YI SYLLABLE ZZI
+A2D3;W;YI SYLLABLE ZZIP
+A2D4;W;YI SYLLABLE ZZIET
+A2D5;W;YI SYLLABLE ZZIEX
+A2D6;W;YI SYLLABLE ZZIE
+A2D7;W;YI SYLLABLE ZZIEP
+A2D8;W;YI SYLLABLE ZZAT
+A2D9;W;YI SYLLABLE ZZAX
+A2DA;W;YI SYLLABLE ZZA
+A2DB;W;YI SYLLABLE ZZAP
+A2DC;W;YI SYLLABLE ZZOX
+A2DD;W;YI SYLLABLE ZZO
+A2DE;W;YI SYLLABLE ZZOP
+A2DF;W;YI SYLLABLE ZZEX
+A2E0;W;YI SYLLABLE ZZE
+A2E1;W;YI SYLLABLE ZZEP
+A2E2;W;YI SYLLABLE ZZUX
+A2E3;W;YI SYLLABLE ZZU
+A2E4;W;YI SYLLABLE ZZUP
+A2E5;W;YI SYLLABLE ZZURX
+A2E6;W;YI SYLLABLE ZZUR
+A2E7;W;YI SYLLABLE ZZYT
+A2E8;W;YI SYLLABLE ZZYX
+A2E9;W;YI SYLLABLE ZZY
+A2EA;W;YI SYLLABLE ZZYP
+A2EB;W;YI SYLLABLE ZZYRX
+A2EC;W;YI SYLLABLE ZZYR
+A2ED;W;YI SYLLABLE NZIT
+A2EE;W;YI SYLLABLE NZIX
+A2EF;W;YI SYLLABLE NZI
+A2F0;W;YI SYLLABLE NZIP
+A2F1;W;YI SYLLABLE NZIEX
+A2F2;W;YI SYLLABLE NZIE
+A2F3;W;YI SYLLABLE NZIEP
+A2F4;W;YI SYLLABLE NZAT
+A2F5;W;YI SYLLABLE NZAX
+A2F6;W;YI SYLLABLE NZA
+A2F7;W;YI SYLLABLE NZAP
+A2F8;W;YI SYLLABLE NZUOX
+A2F9;W;YI SYLLABLE NZUO
+A2FA;W;YI SYLLABLE NZOX
+A2FB;W;YI SYLLABLE NZOP
+A2FC;W;YI SYLLABLE NZEX
+A2FD;W;YI SYLLABLE NZE
+A2FE;W;YI SYLLABLE NZUX
+A2FF;W;YI SYLLABLE NZU
+A300;W;YI SYLLABLE NZUP
+A301;W;YI SYLLABLE NZURX
+A302;W;YI SYLLABLE NZUR
+A303;W;YI SYLLABLE NZYT
+A304;W;YI SYLLABLE NZYX
+A305;W;YI SYLLABLE NZY
+A306;W;YI SYLLABLE NZYP
+A307;W;YI SYLLABLE NZYRX
+A308;W;YI SYLLABLE NZYR
+A309;W;YI SYLLABLE SIT
+A30A;W;YI SYLLABLE SIX
+A30B;W;YI SYLLABLE SI
+A30C;W;YI SYLLABLE SIP
+A30D;W;YI SYLLABLE SIEX
+A30E;W;YI SYLLABLE SIE
+A30F;W;YI SYLLABLE SIEP
+A310;W;YI SYLLABLE SAT
+A311;W;YI SYLLABLE SAX
+A312;W;YI SYLLABLE SA
+A313;W;YI SYLLABLE SAP
+A314;W;YI SYLLABLE SUOX
+A315;W;YI SYLLABLE SUO
+A316;W;YI SYLLABLE SUOP
+A317;W;YI SYLLABLE SOT
+A318;W;YI SYLLABLE SOX
+A319;W;YI SYLLABLE SO
+A31A;W;YI SYLLABLE SOP
+A31B;W;YI SYLLABLE SEX
+A31C;W;YI SYLLABLE SE
+A31D;W;YI SYLLABLE SEP
+A31E;W;YI SYLLABLE SUT
+A31F;W;YI SYLLABLE SUX
+A320;W;YI SYLLABLE SU
+A321;W;YI SYLLABLE SUP
+A322;W;YI SYLLABLE SURX
+A323;W;YI SYLLABLE SUR
+A324;W;YI SYLLABLE SYT
+A325;W;YI SYLLABLE SYX
+A326;W;YI SYLLABLE SY
+A327;W;YI SYLLABLE SYP
+A328;W;YI SYLLABLE SYRX
+A329;W;YI SYLLABLE SYR
+A32A;W;YI SYLLABLE SSIT
+A32B;W;YI SYLLABLE SSIX
+A32C;W;YI SYLLABLE SSI
+A32D;W;YI SYLLABLE SSIP
+A32E;W;YI SYLLABLE SSIEX
+A32F;W;YI SYLLABLE SSIE
+A330;W;YI SYLLABLE SSIEP
+A331;W;YI SYLLABLE SSAT
+A332;W;YI SYLLABLE SSAX
+A333;W;YI SYLLABLE SSA
+A334;W;YI SYLLABLE SSAP
+A335;W;YI SYLLABLE SSOT
+A336;W;YI SYLLABLE SSOX
+A337;W;YI SYLLABLE SSO
+A338;W;YI SYLLABLE SSOP
+A339;W;YI SYLLABLE SSEX
+A33A;W;YI SYLLABLE SSE
+A33B;W;YI SYLLABLE SSEP
+A33C;W;YI SYLLABLE SSUT
+A33D;W;YI SYLLABLE SSUX
+A33E;W;YI SYLLABLE SSU
+A33F;W;YI SYLLABLE SSUP
+A340;W;YI SYLLABLE SSYT
+A341;W;YI SYLLABLE SSYX
+A342;W;YI SYLLABLE SSY
+A343;W;YI SYLLABLE SSYP
+A344;W;YI SYLLABLE SSYRX
+A345;W;YI SYLLABLE SSYR
+A346;W;YI SYLLABLE ZHAT
+A347;W;YI SYLLABLE ZHAX
+A348;W;YI SYLLABLE ZHA
+A349;W;YI SYLLABLE ZHAP
+A34A;W;YI SYLLABLE ZHUOX
+A34B;W;YI SYLLABLE ZHUO
+A34C;W;YI SYLLABLE ZHUOP
+A34D;W;YI SYLLABLE ZHOT
+A34E;W;YI SYLLABLE ZHOX
+A34F;W;YI SYLLABLE ZHO
+A350;W;YI SYLLABLE ZHOP
+A351;W;YI SYLLABLE ZHET
+A352;W;YI SYLLABLE ZHEX
+A353;W;YI SYLLABLE ZHE
+A354;W;YI SYLLABLE ZHEP
+A355;W;YI SYLLABLE ZHUT
+A356;W;YI SYLLABLE ZHUX
+A357;W;YI SYLLABLE ZHU
+A358;W;YI SYLLABLE ZHUP
+A359;W;YI SYLLABLE ZHURX
+A35A;W;YI SYLLABLE ZHUR
+A35B;W;YI SYLLABLE ZHYT
+A35C;W;YI SYLLABLE ZHYX
+A35D;W;YI SYLLABLE ZHY
+A35E;W;YI SYLLABLE ZHYP
+A35F;W;YI SYLLABLE ZHYRX
+A360;W;YI SYLLABLE ZHYR
+A361;W;YI SYLLABLE CHAT
+A362;W;YI SYLLABLE CHAX
+A363;W;YI SYLLABLE CHA
+A364;W;YI SYLLABLE CHAP
+A365;W;YI SYLLABLE CHUOT
+A366;W;YI SYLLABLE CHUOX
+A367;W;YI SYLLABLE CHUO
+A368;W;YI SYLLABLE CHUOP
+A369;W;YI SYLLABLE CHOT
+A36A;W;YI SYLLABLE CHOX
+A36B;W;YI SYLLABLE CHO
+A36C;W;YI SYLLABLE CHOP
+A36D;W;YI SYLLABLE CHET
+A36E;W;YI SYLLABLE CHEX
+A36F;W;YI SYLLABLE CHE
+A370;W;YI SYLLABLE CHEP
+A371;W;YI SYLLABLE CHUX
+A372;W;YI SYLLABLE CHU
+A373;W;YI SYLLABLE CHUP
+A374;W;YI SYLLABLE CHURX
+A375;W;YI SYLLABLE CHUR
+A376;W;YI SYLLABLE CHYT
+A377;W;YI SYLLABLE CHYX
+A378;W;YI SYLLABLE CHY
+A379;W;YI SYLLABLE CHYP
+A37A;W;YI SYLLABLE CHYRX
+A37B;W;YI SYLLABLE CHYR
+A37C;W;YI SYLLABLE RRAX
+A37D;W;YI SYLLABLE RRA
+A37E;W;YI SYLLABLE RRUOX
+A37F;W;YI SYLLABLE RRUO
+A380;W;YI SYLLABLE RROT
+A381;W;YI SYLLABLE RROX
+A382;W;YI SYLLABLE RRO
+A383;W;YI SYLLABLE RROP
+A384;W;YI SYLLABLE RRET
+A385;W;YI SYLLABLE RREX
+A386;W;YI SYLLABLE RRE
+A387;W;YI SYLLABLE RREP
+A388;W;YI SYLLABLE RRUT
+A389;W;YI SYLLABLE RRUX
+A38A;W;YI SYLLABLE RRU
+A38B;W;YI SYLLABLE RRUP
+A38C;W;YI SYLLABLE RRURX
+A38D;W;YI SYLLABLE RRUR
+A38E;W;YI SYLLABLE RRYT
+A38F;W;YI SYLLABLE RRYX
+A390;W;YI SYLLABLE RRY
+A391;W;YI SYLLABLE RRYP
+A392;W;YI SYLLABLE RRYRX
+A393;W;YI SYLLABLE RRYR
+A394;W;YI SYLLABLE NRAT
+A395;W;YI SYLLABLE NRAX
+A396;W;YI SYLLABLE NRA
+A397;W;YI SYLLABLE NRAP
+A398;W;YI SYLLABLE NROX
+A399;W;YI SYLLABLE NRO
+A39A;W;YI SYLLABLE NROP
+A39B;W;YI SYLLABLE NRET
+A39C;W;YI SYLLABLE NREX
+A39D;W;YI SYLLABLE NRE
+A39E;W;YI SYLLABLE NREP
+A39F;W;YI SYLLABLE NRUT
+A3A0;W;YI SYLLABLE NRUX
+A3A1;W;YI SYLLABLE NRU
+A3A2;W;YI SYLLABLE NRUP
+A3A3;W;YI SYLLABLE NRURX
+A3A4;W;YI SYLLABLE NRUR
+A3A5;W;YI SYLLABLE NRYT
+A3A6;W;YI SYLLABLE NRYX
+A3A7;W;YI SYLLABLE NRY
+A3A8;W;YI SYLLABLE NRYP
+A3A9;W;YI SYLLABLE NRYRX
+A3AA;W;YI SYLLABLE NRYR
+A3AB;W;YI SYLLABLE SHAT
+A3AC;W;YI SYLLABLE SHAX
+A3AD;W;YI SYLLABLE SHA
+A3AE;W;YI SYLLABLE SHAP
+A3AF;W;YI SYLLABLE SHUOX
+A3B0;W;YI SYLLABLE SHUO
+A3B1;W;YI SYLLABLE SHUOP
+A3B2;W;YI SYLLABLE SHOT
+A3B3;W;YI SYLLABLE SHOX
+A3B4;W;YI SYLLABLE SHO
+A3B5;W;YI SYLLABLE SHOP
+A3B6;W;YI SYLLABLE SHET
+A3B7;W;YI SYLLABLE SHEX
+A3B8;W;YI SYLLABLE SHE
+A3B9;W;YI SYLLABLE SHEP
+A3BA;W;YI SYLLABLE SHUT
+A3BB;W;YI SYLLABLE SHUX
+A3BC;W;YI SYLLABLE SHU
+A3BD;W;YI SYLLABLE SHUP
+A3BE;W;YI SYLLABLE SHURX
+A3BF;W;YI SYLLABLE SHUR
+A3C0;W;YI SYLLABLE SHYT
+A3C1;W;YI SYLLABLE SHYX
+A3C2;W;YI SYLLABLE SHY
+A3C3;W;YI SYLLABLE SHYP
+A3C4;W;YI SYLLABLE SHYRX
+A3C5;W;YI SYLLABLE SHYR
+A3C6;W;YI SYLLABLE RAT
+A3C7;W;YI SYLLABLE RAX
+A3C8;W;YI SYLLABLE RA
+A3C9;W;YI SYLLABLE RAP
+A3CA;W;YI SYLLABLE RUOX
+A3CB;W;YI SYLLABLE RUO
+A3CC;W;YI SYLLABLE RUOP
+A3CD;W;YI SYLLABLE ROT
+A3CE;W;YI SYLLABLE ROX
+A3CF;W;YI SYLLABLE RO
+A3D0;W;YI SYLLABLE ROP
+A3D1;W;YI SYLLABLE REX
+A3D2;W;YI SYLLABLE RE
+A3D3;W;YI SYLLABLE REP
+A3D4;W;YI SYLLABLE RUT
+A3D5;W;YI SYLLABLE RUX
+A3D6;W;YI SYLLABLE RU
+A3D7;W;YI SYLLABLE RUP
+A3D8;W;YI SYLLABLE RURX
+A3D9;W;YI SYLLABLE RUR
+A3DA;W;YI SYLLABLE RYT
+A3DB;W;YI SYLLABLE RYX
+A3DC;W;YI SYLLABLE RY
+A3DD;W;YI SYLLABLE RYP
+A3DE;W;YI SYLLABLE RYRX
+A3DF;W;YI SYLLABLE RYR
+A3E0;W;YI SYLLABLE JIT
+A3E1;W;YI SYLLABLE JIX
+A3E2;W;YI SYLLABLE JI
+A3E3;W;YI SYLLABLE JIP
+A3E4;W;YI SYLLABLE JIET
+A3E5;W;YI SYLLABLE JIEX
+A3E6;W;YI SYLLABLE JIE
+A3E7;W;YI SYLLABLE JIEP
+A3E8;W;YI SYLLABLE JUOT
+A3E9;W;YI SYLLABLE JUOX
+A3EA;W;YI SYLLABLE JUO
+A3EB;W;YI SYLLABLE JUOP
+A3EC;W;YI SYLLABLE JOT
+A3ED;W;YI SYLLABLE JOX
+A3EE;W;YI SYLLABLE JO
+A3EF;W;YI SYLLABLE JOP
+A3F0;W;YI SYLLABLE JUT
+A3F1;W;YI SYLLABLE JUX
+A3F2;W;YI SYLLABLE JU
+A3F3;W;YI SYLLABLE JUP
+A3F4;W;YI SYLLABLE JURX
+A3F5;W;YI SYLLABLE JUR
+A3F6;W;YI SYLLABLE JYT
+A3F7;W;YI SYLLABLE JYX
+A3F8;W;YI SYLLABLE JY
+A3F9;W;YI SYLLABLE JYP
+A3FA;W;YI SYLLABLE JYRX
+A3FB;W;YI SYLLABLE JYR
+A3FC;W;YI SYLLABLE QIT
+A3FD;W;YI SYLLABLE QIX
+A3FE;W;YI SYLLABLE QI
+A3FF;W;YI SYLLABLE QIP
+A400;W;YI SYLLABLE QIET
+A401;W;YI SYLLABLE QIEX
+A402;W;YI SYLLABLE QIE
+A403;W;YI SYLLABLE QIEP
+A404;W;YI SYLLABLE QUOT
+A405;W;YI SYLLABLE QUOX
+A406;W;YI SYLLABLE QUO
+A407;W;YI SYLLABLE QUOP
+A408;W;YI SYLLABLE QOT
+A409;W;YI SYLLABLE QOX
+A40A;W;YI SYLLABLE QO
+A40B;W;YI SYLLABLE QOP
+A40C;W;YI SYLLABLE QUT
+A40D;W;YI SYLLABLE QUX
+A40E;W;YI SYLLABLE QU
+A40F;W;YI SYLLABLE QUP
+A410;W;YI SYLLABLE QURX
+A411;W;YI SYLLABLE QUR
+A412;W;YI SYLLABLE QYT
+A413;W;YI SYLLABLE QYX
+A414;W;YI SYLLABLE QY
+A415;W;YI SYLLABLE QYP
+A416;W;YI SYLLABLE QYRX
+A417;W;YI SYLLABLE QYR
+A418;W;YI SYLLABLE JJIT
+A419;W;YI SYLLABLE JJIX
+A41A;W;YI SYLLABLE JJI
+A41B;W;YI SYLLABLE JJIP
+A41C;W;YI SYLLABLE JJIET
+A41D;W;YI SYLLABLE JJIEX
+A41E;W;YI SYLLABLE JJIE
+A41F;W;YI SYLLABLE JJIEP
+A420;W;YI SYLLABLE JJUOX
+A421;W;YI SYLLABLE JJUO
+A422;W;YI SYLLABLE JJUOP
+A423;W;YI SYLLABLE JJOT
+A424;W;YI SYLLABLE JJOX
+A425;W;YI SYLLABLE JJO
+A426;W;YI SYLLABLE JJOP
+A427;W;YI SYLLABLE JJUT
+A428;W;YI SYLLABLE JJUX
+A429;W;YI SYLLABLE JJU
+A42A;W;YI SYLLABLE JJUP
+A42B;W;YI SYLLABLE JJURX
+A42C;W;YI SYLLABLE JJUR
+A42D;W;YI SYLLABLE JJYT
+A42E;W;YI SYLLABLE JJYX
+A42F;W;YI SYLLABLE JJY
+A430;W;YI SYLLABLE JJYP
+A431;W;YI SYLLABLE NJIT
+A432;W;YI SYLLABLE NJIX
+A433;W;YI SYLLABLE NJI
+A434;W;YI SYLLABLE NJIP
+A435;W;YI SYLLABLE NJIET
+A436;W;YI SYLLABLE NJIEX
+A437;W;YI SYLLABLE NJIE
+A438;W;YI SYLLABLE NJIEP
+A439;W;YI SYLLABLE NJUOX
+A43A;W;YI SYLLABLE NJUO
+A43B;W;YI SYLLABLE NJOT
+A43C;W;YI SYLLABLE NJOX
+A43D;W;YI SYLLABLE NJO
+A43E;W;YI SYLLABLE NJOP
+A43F;W;YI SYLLABLE NJUX
+A440;W;YI SYLLABLE NJU
+A441;W;YI SYLLABLE NJUP
+A442;W;YI SYLLABLE NJURX
+A443;W;YI SYLLABLE NJUR
+A444;W;YI SYLLABLE NJYT
+A445;W;YI SYLLABLE NJYX
+A446;W;YI SYLLABLE NJY
+A447;W;YI SYLLABLE NJYP
+A448;W;YI SYLLABLE NJYRX
+A449;W;YI SYLLABLE NJYR
+A44A;W;YI SYLLABLE NYIT
+A44B;W;YI SYLLABLE NYIX
+A44C;W;YI SYLLABLE NYI
+A44D;W;YI SYLLABLE NYIP
+A44E;W;YI SYLLABLE NYIET
+A44F;W;YI SYLLABLE NYIEX
+A450;W;YI SYLLABLE NYIE
+A451;W;YI SYLLABLE NYIEP
+A452;W;YI SYLLABLE NYUOX
+A453;W;YI SYLLABLE NYUO
+A454;W;YI SYLLABLE NYUOP
+A455;W;YI SYLLABLE NYOT
+A456;W;YI SYLLABLE NYOX
+A457;W;YI SYLLABLE NYO
+A458;W;YI SYLLABLE NYOP
+A459;W;YI SYLLABLE NYUT
+A45A;W;YI SYLLABLE NYUX
+A45B;W;YI SYLLABLE NYU
+A45C;W;YI SYLLABLE NYUP
+A45D;W;YI SYLLABLE XIT
+A45E;W;YI SYLLABLE XIX
+A45F;W;YI SYLLABLE XI
+A460;W;YI SYLLABLE XIP
+A461;W;YI SYLLABLE XIET
+A462;W;YI SYLLABLE XIEX
+A463;W;YI SYLLABLE XIE
+A464;W;YI SYLLABLE XIEP
+A465;W;YI SYLLABLE XUOX
+A466;W;YI SYLLABLE XUO
+A467;W;YI SYLLABLE XOT
+A468;W;YI SYLLABLE XOX
+A469;W;YI SYLLABLE XO
+A46A;W;YI SYLLABLE XOP
+A46B;W;YI SYLLABLE XYT
+A46C;W;YI SYLLABLE XYX
+A46D;W;YI SYLLABLE XY
+A46E;W;YI SYLLABLE XYP
+A46F;W;YI SYLLABLE XYRX
+A470;W;YI SYLLABLE XYR
+A471;W;YI SYLLABLE YIT
+A472;W;YI SYLLABLE YIX
+A473;W;YI SYLLABLE YI
+A474;W;YI SYLLABLE YIP
+A475;W;YI SYLLABLE YIET
+A476;W;YI SYLLABLE YIEX
+A477;W;YI SYLLABLE YIE
+A478;W;YI SYLLABLE YIEP
+A479;W;YI SYLLABLE YUOT
+A47A;W;YI SYLLABLE YUOX
+A47B;W;YI SYLLABLE YUO
+A47C;W;YI SYLLABLE YUOP
+A47D;W;YI SYLLABLE YOT
+A47E;W;YI SYLLABLE YOX
+A47F;W;YI SYLLABLE YO
+A480;W;YI SYLLABLE YOP
+A481;W;YI SYLLABLE YUT
+A482;W;YI SYLLABLE YUX
+A483;W;YI SYLLABLE YU
+A484;W;YI SYLLABLE YUP
+A485;W;YI SYLLABLE YURX
+A486;W;YI SYLLABLE YUR
+A487;W;YI SYLLABLE YYT
+A488;W;YI SYLLABLE YYX
+A489;W;YI SYLLABLE YY
+A48A;W;YI SYLLABLE YYP
+A48B;W;YI SYLLABLE YYRX
+A48C;W;YI SYLLABLE YYR
+A490;W;YI RADICAL QOT
+A491;W;YI RADICAL LI
+A492;W;YI RADICAL KIT
+A493;W;YI RADICAL NYIP
+A494;W;YI RADICAL CYP
+A495;W;YI RADICAL SSI
+A496;W;YI RADICAL GGOP
+A497;W;YI RADICAL GEP
+A498;W;YI RADICAL MI
+A499;W;YI RADICAL HXIT
+A49A;W;YI RADICAL LYR
+A49B;W;YI RADICAL BBUT
+A49C;W;YI RADICAL MOP
+A49D;W;YI RADICAL YO
+A49E;W;YI RADICAL PUT
+A49F;W;YI RADICAL HXUO
+A4A0;W;YI RADICAL TAT
+A4A1;W;YI RADICAL GA
+A4A4;W;YI RADICAL DDUR
+A4A5;W;YI RADICAL BUR
+A4A6;W;YI RADICAL GGUO
+A4A7;W;YI RADICAL NYOP
+A4A8;W;YI RADICAL TU
+A4A9;W;YI RADICAL OP
+A4AA;W;YI RADICAL JJUT
+A4AB;W;YI RADICAL ZOT
+A4AC;W;YI RADICAL PYT
+A4AD;W;YI RADICAL HMO
+A4AE;W;YI RADICAL YIT
+A4AF;W;YI RADICAL VUR
+A4B0;W;YI RADICAL SHY
+A4B1;W;YI RADICAL VEP
+A4B2;W;YI RADICAL ZA
+A4B3;W;YI RADICAL JO
+A4B5;W;YI RADICAL JJY
+A4B6;W;YI RADICAL GOT
+A4B7;W;YI RADICAL JJIE
+A4B8;W;YI RADICAL WO
+A4B9;W;YI RADICAL DU
+A4BA;W;YI RADICAL SHUR
+A4BB;W;YI RADICAL LIE
+A4BC;W;YI RADICAL CY
+A4BD;W;YI RADICAL CUOP
+A4BE;W;YI RADICAL CIP
+A4BF;W;YI RADICAL HXOP
+A4C0;W;YI RADICAL SHAT
+A4C2;W;YI RADICAL SHOP
+A4C3;W;YI RADICAL CHE
+A4C4;W;YI RADICAL ZZIET
+A4C6;W;YI RADICAL KE
+AC00;W;<Hangul Syllable, First>
+D7A3;W;<Hangul Syllable, Last>
+D800;N;<Non Private Use High Surrogate, First>
+DB7F;N;<Non Private Use High Surrogate, Last>
+DB80;N;<Private Use High Surrogate, First>
+DBFF;N;<Private Use High Surrogate, Last>
+DC00;N;<Low Surrogate, First>
+DFFF;N;<Low Surrogate, Last>
+E000;A;<Private Use, First>
+F8FF;A;<Private Use, Last>
+F900;W;CJK COMPATIBILITY IDEOGRAPH-F900
+F901;W;CJK COMPATIBILITY IDEOGRAPH-F901
+F902;W;CJK COMPATIBILITY IDEOGRAPH-F902
+F903;W;CJK COMPATIBILITY IDEOGRAPH-F903
+F904;W;CJK COMPATIBILITY IDEOGRAPH-F904
+F905;W;CJK COMPATIBILITY IDEOGRAPH-F905
+F906;W;CJK COMPATIBILITY IDEOGRAPH-F906
+F907;W;CJK COMPATIBILITY IDEOGRAPH-F907
+F908;W;CJK COMPATIBILITY IDEOGRAPH-F908
+F909;W;CJK COMPATIBILITY IDEOGRAPH-F909
+F90A;W;CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B;W;CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C;W;CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D;W;CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E;W;CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F;W;CJK COMPATIBILITY IDEOGRAPH-F90F
+F910;W;CJK COMPATIBILITY IDEOGRAPH-F910
+F911;W;CJK COMPATIBILITY IDEOGRAPH-F911
+F912;W;CJK COMPATIBILITY IDEOGRAPH-F912
+F913;W;CJK COMPATIBILITY IDEOGRAPH-F913
+F914;W;CJK COMPATIBILITY IDEOGRAPH-F914
+F915;W;CJK COMPATIBILITY IDEOGRAPH-F915
+F916;W;CJK COMPATIBILITY IDEOGRAPH-F916
+F917;W;CJK COMPATIBILITY IDEOGRAPH-F917
+F918;W;CJK COMPATIBILITY IDEOGRAPH-F918
+F919;W;CJK COMPATIBILITY IDEOGRAPH-F919
+F91A;W;CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B;W;CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C;W;CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D;W;CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E;W;CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F;W;CJK COMPATIBILITY IDEOGRAPH-F91F
+F920;W;CJK COMPATIBILITY IDEOGRAPH-F920
+F921;W;CJK COMPATIBILITY IDEOGRAPH-F921
+F922;W;CJK COMPATIBILITY IDEOGRAPH-F922
+F923;W;CJK COMPATIBILITY IDEOGRAPH-F923
+F924;W;CJK COMPATIBILITY IDEOGRAPH-F924
+F925;W;CJK COMPATIBILITY IDEOGRAPH-F925
+F926;W;CJK COMPATIBILITY IDEOGRAPH-F926
+F927;W;CJK COMPATIBILITY IDEOGRAPH-F927
+F928;W;CJK COMPATIBILITY IDEOGRAPH-F928
+F929;W;CJK COMPATIBILITY IDEOGRAPH-F929
+F92A;W;CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B;W;CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C;W;CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D;W;CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E;W;CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F;W;CJK COMPATIBILITY IDEOGRAPH-F92F
+F930;W;CJK COMPATIBILITY IDEOGRAPH-F930
+F931;W;CJK COMPATIBILITY IDEOGRAPH-F931
+F932;W;CJK COMPATIBILITY IDEOGRAPH-F932
+F933;W;CJK COMPATIBILITY IDEOGRAPH-F933
+F934;W;CJK COMPATIBILITY IDEOGRAPH-F934
+F935;W;CJK COMPATIBILITY IDEOGRAPH-F935
+F936;W;CJK COMPATIBILITY IDEOGRAPH-F936
+F937;W;CJK COMPATIBILITY IDEOGRAPH-F937
+F938;W;CJK COMPATIBILITY IDEOGRAPH-F938
+F939;W;CJK COMPATIBILITY IDEOGRAPH-F939
+F93A;W;CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B;W;CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C;W;CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D;W;CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E;W;CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F;W;CJK COMPATIBILITY IDEOGRAPH-F93F
+F940;W;CJK COMPATIBILITY IDEOGRAPH-F940
+F941;W;CJK COMPATIBILITY IDEOGRAPH-F941
+F942;W;CJK COMPATIBILITY IDEOGRAPH-F942
+F943;W;CJK COMPATIBILITY IDEOGRAPH-F943
+F944;W;CJK COMPATIBILITY IDEOGRAPH-F944
+F945;W;CJK COMPATIBILITY IDEOGRAPH-F945
+F946;W;CJK COMPATIBILITY IDEOGRAPH-F946
+F947;W;CJK COMPATIBILITY IDEOGRAPH-F947
+F948;W;CJK COMPATIBILITY IDEOGRAPH-F948
+F949;W;CJK COMPATIBILITY IDEOGRAPH-F949
+F94A;W;CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B;W;CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C;W;CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D;W;CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E;W;CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F;W;CJK COMPATIBILITY IDEOGRAPH-F94F
+F950;W;CJK COMPATIBILITY IDEOGRAPH-F950
+F951;W;CJK COMPATIBILITY IDEOGRAPH-F951
+F952;W;CJK COMPATIBILITY IDEOGRAPH-F952
+F953;W;CJK COMPATIBILITY IDEOGRAPH-F953
+F954;W;CJK COMPATIBILITY IDEOGRAPH-F954
+F955;W;CJK COMPATIBILITY IDEOGRAPH-F955
+F956;W;CJK COMPATIBILITY IDEOGRAPH-F956
+F957;W;CJK COMPATIBILITY IDEOGRAPH-F957
+F958;W;CJK COMPATIBILITY IDEOGRAPH-F958
+F959;W;CJK COMPATIBILITY IDEOGRAPH-F959
+F95A;W;CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B;W;CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C;W;CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D;W;CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E;W;CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F;W;CJK COMPATIBILITY IDEOGRAPH-F95F
+F960;W;CJK COMPATIBILITY IDEOGRAPH-F960
+F961;W;CJK COMPATIBILITY IDEOGRAPH-F961
+F962;W;CJK COMPATIBILITY IDEOGRAPH-F962
+F963;W;CJK COMPATIBILITY IDEOGRAPH-F963
+F964;W;CJK COMPATIBILITY IDEOGRAPH-F964
+F965;W;CJK COMPATIBILITY IDEOGRAPH-F965
+F966;W;CJK COMPATIBILITY IDEOGRAPH-F966
+F967;W;CJK COMPATIBILITY IDEOGRAPH-F967
+F968;W;CJK COMPATIBILITY IDEOGRAPH-F968
+F969;W;CJK COMPATIBILITY IDEOGRAPH-F969
+F96A;W;CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B;W;CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C;W;CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D;W;CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E;W;CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F;W;CJK COMPATIBILITY IDEOGRAPH-F96F
+F970;W;CJK COMPATIBILITY IDEOGRAPH-F970
+F971;W;CJK COMPATIBILITY IDEOGRAPH-F971
+F972;W;CJK COMPATIBILITY IDEOGRAPH-F972
+F973;W;CJK COMPATIBILITY IDEOGRAPH-F973
+F974;W;CJK COMPATIBILITY IDEOGRAPH-F974
+F975;W;CJK COMPATIBILITY IDEOGRAPH-F975
+F976;W;CJK COMPATIBILITY IDEOGRAPH-F976
+F977;W;CJK COMPATIBILITY IDEOGRAPH-F977
+F978;W;CJK COMPATIBILITY IDEOGRAPH-F978
+F979;W;CJK COMPATIBILITY IDEOGRAPH-F979
+F97A;W;CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B;W;CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C;W;CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D;W;CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E;W;CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F;W;CJK COMPATIBILITY IDEOGRAPH-F97F
+F980;W;CJK COMPATIBILITY IDEOGRAPH-F980
+F981;W;CJK COMPATIBILITY IDEOGRAPH-F981
+F982;W;CJK COMPATIBILITY IDEOGRAPH-F982
+F983;W;CJK COMPATIBILITY IDEOGRAPH-F983
+F984;W;CJK COMPATIBILITY IDEOGRAPH-F984
+F985;W;CJK COMPATIBILITY IDEOGRAPH-F985
+F986;W;CJK COMPATIBILITY IDEOGRAPH-F986
+F987;W;CJK COMPATIBILITY IDEOGRAPH-F987
+F988;W;CJK COMPATIBILITY IDEOGRAPH-F988
+F989;W;CJK COMPATIBILITY IDEOGRAPH-F989
+F98A;W;CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B;W;CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C;W;CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D;W;CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E;W;CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F;W;CJK COMPATIBILITY IDEOGRAPH-F98F
+F990;W;CJK COMPATIBILITY IDEOGRAPH-F990
+F991;W;CJK COMPATIBILITY IDEOGRAPH-F991
+F992;W;CJK COMPATIBILITY IDEOGRAPH-F992
+F993;W;CJK COMPATIBILITY IDEOGRAPH-F993
+F994;W;CJK COMPATIBILITY IDEOGRAPH-F994
+F995;W;CJK COMPATIBILITY IDEOGRAPH-F995
+F996;W;CJK COMPATIBILITY IDEOGRAPH-F996
+F997;W;CJK COMPATIBILITY IDEOGRAPH-F997
+F998;W;CJK COMPATIBILITY IDEOGRAPH-F998
+F999;W;CJK COMPATIBILITY IDEOGRAPH-F999
+F99A;W;CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B;W;CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C;W;CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D;W;CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E;W;CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F;W;CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0;W;CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1;W;CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2;W;CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3;W;CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4;W;CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5;W;CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6;W;CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7;W;CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8;W;CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9;W;CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA;W;CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB;W;CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC;W;CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD;W;CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE;W;CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF;W;CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0;W;CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1;W;CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2;W;CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3;W;CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4;W;CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5;W;CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6;W;CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7;W;CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8;W;CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9;W;CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA;W;CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB;W;CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC;W;CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD;W;CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE;W;CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF;W;CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0;W;CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1;W;CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2;W;CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3;W;CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4;W;CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5;W;CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6;W;CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7;W;CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8;W;CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9;W;CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA;W;CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB;W;CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC;W;CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD;W;CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE;W;CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF;W;CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0;W;CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1;W;CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2;W;CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3;W;CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4;W;CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5;W;CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6;W;CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7;W;CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8;W;CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9;W;CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA;W;CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB;W;CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC;W;CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD;W;CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE;W;CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF;W;CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0;W;CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1;W;CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2;W;CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3;W;CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4;W;CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5;W;CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6;W;CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7;W;CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8;W;CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9;W;CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA;W;CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB;W;CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC;W;CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED;W;CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE;W;CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF;W;CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0;W;CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1;W;CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2;W;CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3;W;CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4;W;CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5;W;CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6;W;CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7;W;CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8;W;CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9;W;CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA;W;CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB;W;CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC;W;CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD;W;CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE;W;CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF;W;CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00;W;CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01;W;CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02;W;CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03;W;CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04;W;CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05;W;CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06;W;CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07;W;CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08;W;CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09;W;CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A;W;CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B;W;CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C;W;CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D;W;CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E;W;CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F;W;CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10;W;CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11;W;CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12;W;CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13;W;CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14;W;CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15;W;CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16;W;CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17;W;CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18;W;CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19;W;CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A;W;CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B;W;CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C;W;CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D;W;CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E;W;CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F;W;CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20;W;CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21;W;CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22;W;CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23;W;CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24;W;CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25;W;CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26;W;CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27;W;CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28;W;CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29;W;CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A;W;CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B;W;CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C;W;CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D;W;CJK COMPATIBILITY IDEOGRAPH-FA2D
+FB00;N;LATIN SMALL LIGATURE FF
+FB01;N;LATIN SMALL LIGATURE FI
+FB02;N;LATIN SMALL LIGATURE FL
+FB03;N;LATIN SMALL LIGATURE FFI
+FB04;N;LATIN SMALL LIGATURE FFL
+FB05;N;LATIN SMALL LIGATURE LONG S T
+FB06;N;LATIN SMALL LIGATURE ST
+FB13;N;ARMENIAN SMALL LIGATURE MEN NOW
+FB14;N;ARMENIAN SMALL LIGATURE MEN ECH
+FB15;N;ARMENIAN SMALL LIGATURE MEN INI
+FB16;N;ARMENIAN SMALL LIGATURE VEW NOW
+FB17;N;ARMENIAN SMALL LIGATURE MEN XEH
+FB1D;N;HEBREW LETTER YOD WITH HIRIQ
+FB1E;N;HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F;N;HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20;N;HEBREW LETTER ALTERNATIVE AYIN
+FB21;N;HEBREW LETTER WIDE ALEF
+FB22;N;HEBREW LETTER WIDE DALET
+FB23;N;HEBREW LETTER WIDE HE
+FB24;N;HEBREW LETTER WIDE KAF
+FB25;N;HEBREW LETTER WIDE LAMED
+FB26;N;HEBREW LETTER WIDE FINAL MEM
+FB27;N;HEBREW LETTER WIDE RESH
+FB28;N;HEBREW LETTER WIDE TAV
+FB29;N;HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A;N;HEBREW LETTER SHIN WITH SHIN DOT
+FB2B;N;HEBREW LETTER SHIN WITH SIN DOT
+FB2C;N;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D;N;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E;N;HEBREW LETTER ALEF WITH PATAH
+FB2F;N;HEBREW LETTER ALEF WITH QAMATS
+FB30;N;HEBREW LETTER ALEF WITH MAPIQ
+FB31;N;HEBREW LETTER BET WITH DAGESH
+FB32;N;HEBREW LETTER GIMEL WITH DAGESH
+FB33;N;HEBREW LETTER DALET WITH DAGESH
+FB34;N;HEBREW LETTER HE WITH MAPIQ
+FB35;N;HEBREW LETTER VAV WITH DAGESH
+FB36;N;HEBREW LETTER ZAYIN WITH DAGESH
+FB38;N;HEBREW LETTER TET WITH DAGESH
+FB39;N;HEBREW LETTER YOD WITH DAGESH
+FB3A;N;HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B;N;HEBREW LETTER KAF WITH DAGESH
+FB3C;N;HEBREW LETTER LAMED WITH DAGESH
+FB3E;N;HEBREW LETTER MEM WITH DAGESH
+FB40;N;HEBREW LETTER NUN WITH DAGESH
+FB41;N;HEBREW LETTER SAMEKH WITH DAGESH
+FB43;N;HEBREW LETTER FINAL PE WITH DAGESH
+FB44;N;HEBREW LETTER PE WITH DAGESH
+FB46;N;HEBREW LETTER TSADI WITH DAGESH
+FB47;N;HEBREW LETTER QOF WITH DAGESH
+FB48;N;HEBREW LETTER RESH WITH DAGESH
+FB49;N;HEBREW LETTER SHIN WITH DAGESH
+FB4A;N;HEBREW LETTER TAV WITH DAGESH
+FB4B;N;HEBREW LETTER VAV WITH HOLAM
+FB4C;N;HEBREW LETTER BET WITH RAFE
+FB4D;N;HEBREW LETTER KAF WITH RAFE
+FB4E;N;HEBREW LETTER PE WITH RAFE
+FB4F;N;HEBREW LIGATURE ALEF LAMED
+FB50;N;ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51;N;ARABIC LETTER ALEF WASLA FINAL FORM
+FB52;N;ARABIC LETTER BEEH ISOLATED FORM
+FB53;N;ARABIC LETTER BEEH FINAL FORM
+FB54;N;ARABIC LETTER BEEH INITIAL FORM
+FB55;N;ARABIC LETTER BEEH MEDIAL FORM
+FB56;N;ARABIC LETTER PEH ISOLATED FORM
+FB57;N;ARABIC LETTER PEH FINAL FORM
+FB58;N;ARABIC LETTER PEH INITIAL FORM
+FB59;N;ARABIC LETTER PEH MEDIAL FORM
+FB5A;N;ARABIC LETTER BEHEH ISOLATED FORM
+FB5B;N;ARABIC LETTER BEHEH FINAL FORM
+FB5C;N;ARABIC LETTER BEHEH INITIAL FORM
+FB5D;N;ARABIC LETTER BEHEH MEDIAL FORM
+FB5E;N;ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F;N;ARABIC LETTER TTEHEH FINAL FORM
+FB60;N;ARABIC LETTER TTEHEH INITIAL FORM
+FB61;N;ARABIC LETTER TTEHEH MEDIAL FORM
+FB62;N;ARABIC LETTER TEHEH ISOLATED FORM
+FB63;N;ARABIC LETTER TEHEH FINAL FORM
+FB64;N;ARABIC LETTER TEHEH INITIAL FORM
+FB65;N;ARABIC LETTER TEHEH MEDIAL FORM
+FB66;N;ARABIC LETTER TTEH ISOLATED FORM
+FB67;N;ARABIC LETTER TTEH FINAL FORM
+FB68;N;ARABIC LETTER TTEH INITIAL FORM
+FB69;N;ARABIC LETTER TTEH MEDIAL FORM
+FB6A;N;ARABIC LETTER VEH ISOLATED FORM
+FB6B;N;ARABIC LETTER VEH FINAL FORM
+FB6C;N;ARABIC LETTER VEH INITIAL FORM
+FB6D;N;ARABIC LETTER VEH MEDIAL FORM
+FB6E;N;ARABIC LETTER PEHEH ISOLATED FORM
+FB6F;N;ARABIC LETTER PEHEH FINAL FORM
+FB70;N;ARABIC LETTER PEHEH INITIAL FORM
+FB71;N;ARABIC LETTER PEHEH MEDIAL FORM
+FB72;N;ARABIC LETTER DYEH ISOLATED FORM
+FB73;N;ARABIC LETTER DYEH FINAL FORM
+FB74;N;ARABIC LETTER DYEH INITIAL FORM
+FB75;N;ARABIC LETTER DYEH MEDIAL FORM
+FB76;N;ARABIC LETTER NYEH ISOLATED FORM
+FB77;N;ARABIC LETTER NYEH FINAL FORM
+FB78;N;ARABIC LETTER NYEH INITIAL FORM
+FB79;N;ARABIC LETTER NYEH MEDIAL FORM
+FB7A;N;ARABIC LETTER TCHEH ISOLATED FORM
+FB7B;N;ARABIC LETTER TCHEH FINAL FORM
+FB7C;N;ARABIC LETTER TCHEH INITIAL FORM
+FB7D;N;ARABIC LETTER TCHEH MEDIAL FORM
+FB7E;N;ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F;N;ARABIC LETTER TCHEHEH FINAL FORM
+FB80;N;ARABIC LETTER TCHEHEH INITIAL FORM
+FB81;N;ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82;N;ARABIC LETTER DDAHAL ISOLATED FORM
+FB83;N;ARABIC LETTER DDAHAL FINAL FORM
+FB84;N;ARABIC LETTER DAHAL ISOLATED FORM
+FB85;N;ARABIC LETTER DAHAL FINAL FORM
+FB86;N;ARABIC LETTER DUL ISOLATED FORM
+FB87;N;ARABIC LETTER DUL FINAL FORM
+FB88;N;ARABIC LETTER DDAL ISOLATED FORM
+FB89;N;ARABIC LETTER DDAL FINAL FORM
+FB8A;N;ARABIC LETTER JEH ISOLATED FORM
+FB8B;N;ARABIC LETTER JEH FINAL FORM
+FB8C;N;ARABIC LETTER RREH ISOLATED FORM
+FB8D;N;ARABIC LETTER RREH FINAL FORM
+FB8E;N;ARABIC LETTER KEHEH ISOLATED FORM
+FB8F;N;ARABIC LETTER KEHEH FINAL FORM
+FB90;N;ARABIC LETTER KEHEH INITIAL FORM
+FB91;N;ARABIC LETTER KEHEH MEDIAL FORM
+FB92;N;ARABIC LETTER GAF ISOLATED FORM
+FB93;N;ARABIC LETTER GAF FINAL FORM
+FB94;N;ARABIC LETTER GAF INITIAL FORM
+FB95;N;ARABIC LETTER GAF MEDIAL FORM
+FB96;N;ARABIC LETTER GUEH ISOLATED FORM
+FB97;N;ARABIC LETTER GUEH FINAL FORM
+FB98;N;ARABIC LETTER GUEH INITIAL FORM
+FB99;N;ARABIC LETTER GUEH MEDIAL FORM
+FB9A;N;ARABIC LETTER NGOEH ISOLATED FORM
+FB9B;N;ARABIC LETTER NGOEH FINAL FORM
+FB9C;N;ARABIC LETTER NGOEH INITIAL FORM
+FB9D;N;ARABIC LETTER NGOEH MEDIAL FORM
+FB9E;N;ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F;N;ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0;N;ARABIC LETTER RNOON ISOLATED FORM
+FBA1;N;ARABIC LETTER RNOON FINAL FORM
+FBA2;N;ARABIC LETTER RNOON INITIAL FORM
+FBA3;N;ARABIC LETTER RNOON MEDIAL FORM
+FBA4;N;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5;N;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6;N;ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7;N;ARABIC LETTER HEH GOAL FINAL FORM
+FBA8;N;ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9;N;ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA;N;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB;N;ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC;N;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD;N;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE;N;ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF;N;ARABIC LETTER YEH BARREE FINAL FORM
+FBB0;N;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1;N;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3;N;ARABIC LETTER NG ISOLATED FORM
+FBD4;N;ARABIC LETTER NG FINAL FORM
+FBD5;N;ARABIC LETTER NG INITIAL FORM
+FBD6;N;ARABIC LETTER NG MEDIAL FORM
+FBD7;N;ARABIC LETTER U ISOLATED FORM
+FBD8;N;ARABIC LETTER U FINAL FORM
+FBD9;N;ARABIC LETTER OE ISOLATED FORM
+FBDA;N;ARABIC LETTER OE FINAL FORM
+FBDB;N;ARABIC LETTER YU ISOLATED FORM
+FBDC;N;ARABIC LETTER YU FINAL FORM
+FBDD;N;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE;N;ARABIC LETTER VE ISOLATED FORM
+FBDF;N;ARABIC LETTER VE FINAL FORM
+FBE0;N;ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1;N;ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2;N;ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3;N;ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4;N;ARABIC LETTER E ISOLATED FORM
+FBE5;N;ARABIC LETTER E FINAL FORM
+FBE6;N;ARABIC LETTER E INITIAL FORM
+FBE7;N;ARABIC LETTER E MEDIAL FORM
+FBE8;N;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9;N;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9;N;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA;N;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB;N;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC;N;ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD;N;ARABIC LETTER FARSI YEH FINAL FORM
+FBFE;N;ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF;N;ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05;N;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06;N;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07;N;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08;N;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09;N;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A;N;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B;N;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C;N;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D;N;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E;N;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F;N;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10;N;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11;N;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12;N;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13;N;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14;N;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15;N;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16;N;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17;N;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18;N;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19;N;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A;N;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B;N;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C;N;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D;N;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E;N;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F;N;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20;N;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21;N;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22;N;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23;N;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24;N;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25;N;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26;N;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27;N;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28;N;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29;N;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A;N;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B;N;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C;N;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D;N;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E;N;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F;N;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30;N;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31;N;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32;N;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33;N;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34;N;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35;N;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36;N;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37;N;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38;N;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39;N;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A;N;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B;N;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C;N;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D;N;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E;N;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F;N;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40;N;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41;N;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42;N;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43;N;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44;N;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45;N;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46;N;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47;N;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48;N;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49;N;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A;N;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B;N;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C;N;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D;N;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E;N;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F;N;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50;N;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51;N;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52;N;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53;N;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54;N;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55;N;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56;N;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57;N;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58;N;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59;N;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A;N;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B;N;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C;N;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D;N;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E;N;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F;N;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60;N;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61;N;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62;N;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63;N;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A;N;ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B;N;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C;N;ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D;N;ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E;N;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F;N;ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70;N;ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71;N;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72;N;ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73;N;ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74;N;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75;N;ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76;N;ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77;N;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78;N;ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79;N;ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A;N;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B;N;ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C;N;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D;N;ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E;N;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F;N;ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80;N;ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81;N;ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82;N;ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83;N;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84;N;ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85;N;ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86;N;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87;N;ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88;N;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89;N;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A;N;ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B;N;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C;N;ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D;N;ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E;N;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F;N;ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90;N;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91;N;ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92;N;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93;N;ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94;N;ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95;N;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96;N;ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C;N;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D;N;ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E;N;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F;N;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0;N;ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1;N;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2;N;ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3;N;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4;N;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5;N;ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6;N;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7;N;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8;N;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9;N;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA;N;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB;N;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC;N;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD;N;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE;N;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF;N;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0;N;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1;N;ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2;N;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3;N;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4;N;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5;N;ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6;N;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7;N;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8;N;ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9;N;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA;N;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB;N;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC;N;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD;N;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE;N;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF;N;ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0;N;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1;N;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2;N;ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3;N;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4;N;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5;N;ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6;N;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7;N;ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8;N;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9;N;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA;N;ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB;N;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC;N;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD;N;ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE;N;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF;N;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0;N;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1;N;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2;N;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3;N;ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4;N;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5;N;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6;N;ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7;N;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8;N;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9;N;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA;N;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB;N;ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC;N;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD;N;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE;N;ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0;N;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1;N;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2;N;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3;N;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4;N;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5;N;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6;N;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7;N;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8;N;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9;N;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA;N;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB;N;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC;N;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED;N;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE;N;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF;N;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0;N;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1;N;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2;N;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3;N;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4;N;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5;N;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6;N;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7;N;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8;N;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9;N;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA;N;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB;N;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC;N;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD;N;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE;N;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF;N;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00;N;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01;N;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02;N;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03;N;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04;N;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05;N;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06;N;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07;N;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08;N;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09;N;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A;N;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B;N;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C;N;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D;N;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E;N;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F;N;ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10;N;ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11;N;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12;N;ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13;N;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14;N;ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15;N;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16;N;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17;N;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18;N;ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19;N;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A;N;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B;N;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C;N;ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D;N;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E;N;ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F;N;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20;N;ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21;N;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22;N;ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23;N;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24;N;ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25;N;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26;N;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27;N;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28;N;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29;N;ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A;N;ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B;N;ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C;N;ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D;N;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E;N;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F;N;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30;N;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31;N;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32;N;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33;N;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34;N;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35;N;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36;N;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37;N;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38;N;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39;N;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A;N;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B;N;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C;N;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D;N;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E;N;ORNATE LEFT PARENTHESIS
+FD3F;N;ORNATE RIGHT PARENTHESIS
+FD50;N;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51;N;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52;N;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53;N;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54;N;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55;N;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56;N;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57;N;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58;N;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59;N;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A;N;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B;N;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C;N;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D;N;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E;N;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F;N;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60;N;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61;N;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62;N;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63;N;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64;N;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65;N;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66;N;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67;N;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68;N;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69;N;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A;N;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B;N;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C;N;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D;N;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E;N;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F;N;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70;N;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71;N;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72;N;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73;N;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74;N;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75;N;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76;N;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77;N;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78;N;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79;N;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A;N;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B;N;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C;N;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D;N;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E;N;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F;N;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80;N;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81;N;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82;N;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83;N;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84;N;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85;N;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86;N;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87;N;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88;N;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89;N;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A;N;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B;N;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C;N;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D;N;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E;N;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F;N;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92;N;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93;N;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94;N;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95;N;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96;N;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97;N;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98;N;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99;N;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A;N;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B;N;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C;N;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D;N;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E;N;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F;N;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0;N;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1;N;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2;N;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3;N;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4;N;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5;N;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6;N;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7;N;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8;N;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9;N;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA;N;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB;N;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC;N;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD;N;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE;N;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF;N;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0;N;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1;N;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2;N;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3;N;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4;N;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5;N;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6;N;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7;N;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8;N;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9;N;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA;N;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB;N;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC;N;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD;N;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE;N;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF;N;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0;N;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1;N;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2;N;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3;N;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4;N;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5;N;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6;N;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7;N;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0;N;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1;N;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2;N;ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3;N;ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4;N;ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5;N;ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6;N;ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7;N;ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8;N;ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9;N;ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA;N;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB;N;ARABIC LIGATURE JALLAJALALOUHOU
+FE20;N;COMBINING LIGATURE LEFT HALF
+FE21;N;COMBINING LIGATURE RIGHT HALF
+FE22;N;COMBINING DOUBLE TILDE LEFT HALF
+FE23;N;COMBINING DOUBLE TILDE RIGHT HALF
+FE30;W;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31;W;PRESENTATION FORM FOR VERTICAL EM DASH
+FE32;W;PRESENTATION FORM FOR VERTICAL EN DASH
+FE33;W;PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34;W;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35;W;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36;W;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37;W;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38;W;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39;W;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A;W;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B;W;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C;W;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D;W;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E;W;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F;W;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40;W;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41;W;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42;W;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43;W;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44;W;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE49;W;DASHED OVERLINE
+FE4A;W;CENTRELINE OVERLINE
+FE4B;W;WAVY OVERLINE
+FE4C;W;DOUBLE WAVY OVERLINE
+FE4D;W;DASHED LOW LINE
+FE4E;W;CENTRELINE LOW LINE
+FE4F;W;WAVY LOW LINE
+FE50;W;SMALL COMMA
+FE51;W;SMALL IDEOGRAPHIC COMMA
+FE52;W;SMALL FULL STOP
+FE54;W;SMALL SEMICOLON
+FE55;W;SMALL COLON
+FE56;W;SMALL QUESTION MARK
+FE57;W;SMALL EXCLAMATION MARK
+FE58;W;SMALL EM DASH
+FE59;W;SMALL LEFT PARENTHESIS
+FE5A;W;SMALL RIGHT PARENTHESIS
+FE5B;W;SMALL LEFT CURLY BRACKET
+FE5C;W;SMALL RIGHT CURLY BRACKET
+FE5D;W;SMALL LEFT TORTOISE SHELL BRACKET
+FE5E;W;SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F;W;SMALL NUMBER SIGN
+FE60;W;SMALL AMPERSAND
+FE61;W;SMALL ASTERISK
+FE62;W;SMALL PLUS SIGN
+FE63;W;SMALL HYPHEN-MINUS
+FE64;W;SMALL LESS-THAN SIGN
+FE65;W;SMALL GREATER-THAN SIGN
+FE66;W;SMALL EQUALS SIGN
+FE68;W;SMALL REVERSE SOLIDUS
+FE69;W;SMALL DOLLAR SIGN
+FE6A;W;SMALL PERCENT SIGN
+FE6B;W;SMALL COMMERCIAL AT
+FE70;N;ARABIC FATHATAN ISOLATED FORM
+FE71;N;ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72;N;ARABIC DAMMATAN ISOLATED FORM
+FE74;N;ARABIC KASRATAN ISOLATED FORM
+FE76;N;ARABIC FATHA ISOLATED FORM
+FE77;N;ARABIC FATHA MEDIAL FORM
+FE78;N;ARABIC DAMMA ISOLATED FORM
+FE79;N;ARABIC DAMMA MEDIAL FORM
+FE7A;N;ARABIC KASRA ISOLATED FORM
+FE7B;N;ARABIC KASRA MEDIAL FORM
+FE7C;N;ARABIC SHADDA ISOLATED FORM
+FE7D;N;ARABIC SHADDA MEDIAL FORM
+FE7E;N;ARABIC SUKUN ISOLATED FORM
+FE7F;N;ARABIC SUKUN MEDIAL FORM
+FE80;N;ARABIC LETTER HAMZA ISOLATED FORM
+FE81;N;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82;N;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83;N;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84;N;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85;N;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86;N;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87;N;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88;N;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89;N;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A;N;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B;N;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C;N;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D;N;ARABIC LETTER ALEF ISOLATED FORM
+FE8E;N;ARABIC LETTER ALEF FINAL FORM
+FE8F;N;ARABIC LETTER BEH ISOLATED FORM
+FE90;N;ARABIC LETTER BEH FINAL FORM
+FE91;N;ARABIC LETTER BEH INITIAL FORM
+FE92;N;ARABIC LETTER BEH MEDIAL FORM
+FE93;N;ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94;N;ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95;N;ARABIC LETTER TEH ISOLATED FORM
+FE96;N;ARABIC LETTER TEH FINAL FORM
+FE97;N;ARABIC LETTER TEH INITIAL FORM
+FE98;N;ARABIC LETTER TEH MEDIAL FORM
+FE99;N;ARABIC LETTER THEH ISOLATED FORM
+FE9A;N;ARABIC LETTER THEH FINAL FORM
+FE9B;N;ARABIC LETTER THEH INITIAL FORM
+FE9C;N;ARABIC LETTER THEH MEDIAL FORM
+FE9D;N;ARABIC LETTER JEEM ISOLATED FORM
+FE9E;N;ARABIC LETTER JEEM FINAL FORM
+FE9F;N;ARABIC LETTER JEEM INITIAL FORM
+FEA0;N;ARABIC LETTER JEEM MEDIAL FORM
+FEA1;N;ARABIC LETTER HAH ISOLATED FORM
+FEA2;N;ARABIC LETTER HAH FINAL FORM
+FEA3;N;ARABIC LETTER HAH INITIAL FORM
+FEA4;N;ARABIC LETTER HAH MEDIAL FORM
+FEA5;N;ARABIC LETTER KHAH ISOLATED FORM
+FEA6;N;ARABIC LETTER KHAH FINAL FORM
+FEA7;N;ARABIC LETTER KHAH INITIAL FORM
+FEA8;N;ARABIC LETTER KHAH MEDIAL FORM
+FEA9;N;ARABIC LETTER DAL ISOLATED FORM
+FEAA;N;ARABIC LETTER DAL FINAL FORM
+FEAB;N;ARABIC LETTER THAL ISOLATED FORM
+FEAC;N;ARABIC LETTER THAL FINAL FORM
+FEAD;N;ARABIC LETTER REH ISOLATED FORM
+FEAE;N;ARABIC LETTER REH FINAL FORM
+FEAF;N;ARABIC LETTER ZAIN ISOLATED FORM
+FEB0;N;ARABIC LETTER ZAIN FINAL FORM
+FEB1;N;ARABIC LETTER SEEN ISOLATED FORM
+FEB2;N;ARABIC LETTER SEEN FINAL FORM
+FEB3;N;ARABIC LETTER SEEN INITIAL FORM
+FEB4;N;ARABIC LETTER SEEN MEDIAL FORM
+FEB5;N;ARABIC LETTER SHEEN ISOLATED FORM
+FEB6;N;ARABIC LETTER SHEEN FINAL FORM
+FEB7;N;ARABIC LETTER SHEEN INITIAL FORM
+FEB8;N;ARABIC LETTER SHEEN MEDIAL FORM
+FEB9;N;ARABIC LETTER SAD ISOLATED FORM
+FEBA;N;ARABIC LETTER SAD FINAL FORM
+FEBB;N;ARABIC LETTER SAD INITIAL FORM
+FEBC;N;ARABIC LETTER SAD MEDIAL FORM
+FEBD;N;ARABIC LETTER DAD ISOLATED FORM
+FEBE;N;ARABIC LETTER DAD FINAL FORM
+FEBF;N;ARABIC LETTER DAD INITIAL FORM
+FEC0;N;ARABIC LETTER DAD MEDIAL FORM
+FEC1;N;ARABIC LETTER TAH ISOLATED FORM
+FEC2;N;ARABIC LETTER TAH FINAL FORM
+FEC3;N;ARABIC LETTER TAH INITIAL FORM
+FEC4;N;ARABIC LETTER TAH MEDIAL FORM
+FEC5;N;ARABIC LETTER ZAH ISOLATED FORM
+FEC6;N;ARABIC LETTER ZAH FINAL FORM
+FEC7;N;ARABIC LETTER ZAH INITIAL FORM
+FEC8;N;ARABIC LETTER ZAH MEDIAL FORM
+FEC9;N;ARABIC LETTER AIN ISOLATED FORM
+FECA;N;ARABIC LETTER AIN FINAL FORM
+FECB;N;ARABIC LETTER AIN INITIAL FORM
+FECC;N;ARABIC LETTER AIN MEDIAL FORM
+FECD;N;ARABIC LETTER GHAIN ISOLATED FORM
+FECE;N;ARABIC LETTER GHAIN FINAL FORM
+FECF;N;ARABIC LETTER GHAIN INITIAL FORM
+FED0;N;ARABIC LETTER GHAIN MEDIAL FORM
+FED1;N;ARABIC LETTER FEH ISOLATED FORM
+FED2;N;ARABIC LETTER FEH FINAL FORM
+FED3;N;ARABIC LETTER FEH INITIAL FORM
+FED4;N;ARABIC LETTER FEH MEDIAL FORM
+FED5;N;ARABIC LETTER QAF ISOLATED FORM
+FED6;N;ARABIC LETTER QAF FINAL FORM
+FED7;N;ARABIC LETTER QAF INITIAL FORM
+FED8;N;ARABIC LETTER QAF MEDIAL FORM
+FED9;N;ARABIC LETTER KAF ISOLATED FORM
+FEDA;N;ARABIC LETTER KAF FINAL FORM
+FEDB;N;ARABIC LETTER KAF INITIAL FORM
+FEDC;N;ARABIC LETTER KAF MEDIAL FORM
+FEDD;N;ARABIC LETTER LAM ISOLATED FORM
+FEDE;N;ARABIC LETTER LAM FINAL FORM
+FEDF;N;ARABIC LETTER LAM INITIAL FORM
+FEE0;N;ARABIC LETTER LAM MEDIAL FORM
+FEE1;N;ARABIC LETTER MEEM ISOLATED FORM
+FEE2;N;ARABIC LETTER MEEM FINAL FORM
+FEE3;N;ARABIC LETTER MEEM INITIAL FORM
+FEE4;N;ARABIC LETTER MEEM MEDIAL FORM
+FEE5;N;ARABIC LETTER NOON ISOLATED FORM
+FEE6;N;ARABIC LETTER NOON FINAL FORM
+FEE7;N;ARABIC LETTER NOON INITIAL FORM
+FEE8;N;ARABIC LETTER NOON MEDIAL FORM
+FEE9;N;ARABIC LETTER HEH ISOLATED FORM
+FEEA;N;ARABIC LETTER HEH FINAL FORM
+FEEB;N;ARABIC LETTER HEH INITIAL FORM
+FEEC;N;ARABIC LETTER HEH MEDIAL FORM
+FEED;N;ARABIC LETTER WAW ISOLATED FORM
+FEEE;N;ARABIC LETTER WAW FINAL FORM
+FEEF;N;ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0;N;ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1;N;ARABIC LETTER YEH ISOLATED FORM
+FEF2;N;ARABIC LETTER YEH FINAL FORM
+FEF3;N;ARABIC LETTER YEH INITIAL FORM
+FEF4;N;ARABIC LETTER YEH MEDIAL FORM
+FEF5;N;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6;N;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7;N;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8;N;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9;N;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA;N;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB;N;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC;N;ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF;N;ZERO WIDTH NO-BREAK SPACE
+FF01;F;FULLWIDTH EXCLAMATION MARK
+FF02;F;FULLWIDTH QUOTATION MARK
+FF03;F;FULLWIDTH NUMBER SIGN
+FF04;F;FULLWIDTH DOLLAR SIGN
+FF05;F;FULLWIDTH PERCENT SIGN
+FF06;F;FULLWIDTH AMPERSAND
+FF07;F;FULLWIDTH APOSTROPHE
+FF08;F;FULLWIDTH LEFT PARENTHESIS
+FF09;F;FULLWIDTH RIGHT PARENTHESIS
+FF0A;F;FULLWIDTH ASTERISK
+FF0B;F;FULLWIDTH PLUS SIGN
+FF0C;F;FULLWIDTH COMMA
+FF0D;F;FULLWIDTH HYPHEN-MINUS
+FF0E;F;FULLWIDTH FULL STOP
+FF0F;F;FULLWIDTH SOLIDUS
+FF10;F;FULLWIDTH DIGIT ZERO
+FF11;F;FULLWIDTH DIGIT ONE
+FF12;F;FULLWIDTH DIGIT TWO
+FF13;F;FULLWIDTH DIGIT THREE
+FF14;F;FULLWIDTH DIGIT FOUR
+FF15;F;FULLWIDTH DIGIT FIVE
+FF16;F;FULLWIDTH DIGIT SIX
+FF17;F;FULLWIDTH DIGIT SEVEN
+FF18;F;FULLWIDTH DIGIT EIGHT
+FF19;F;FULLWIDTH DIGIT NINE
+FF1A;F;FULLWIDTH COLON
+FF1B;F;FULLWIDTH SEMICOLON
+FF1C;F;FULLWIDTH LESS-THAN SIGN
+FF1D;F;FULLWIDTH EQUALS SIGN
+FF1E;F;FULLWIDTH GREATER-THAN SIGN
+FF1F;F;FULLWIDTH QUESTION MARK
+FF20;F;FULLWIDTH COMMERCIAL AT
+FF21;F;FULLWIDTH LATIN CAPITAL LETTER A
+FF22;F;FULLWIDTH LATIN CAPITAL LETTER B
+FF23;F;FULLWIDTH LATIN CAPITAL LETTER C
+FF24;F;FULLWIDTH LATIN CAPITAL LETTER D
+FF25;F;FULLWIDTH LATIN CAPITAL LETTER E
+FF26;F;FULLWIDTH LATIN CAPITAL LETTER F
+FF27;F;FULLWIDTH LATIN CAPITAL LETTER G
+FF28;F;FULLWIDTH LATIN CAPITAL LETTER H
+FF29;F;FULLWIDTH LATIN CAPITAL LETTER I
+FF2A;F;FULLWIDTH LATIN CAPITAL LETTER J
+FF2B;F;FULLWIDTH LATIN CAPITAL LETTER K
+FF2C;F;FULLWIDTH LATIN CAPITAL LETTER L
+FF2D;F;FULLWIDTH LATIN CAPITAL LETTER M
+FF2E;F;FULLWIDTH LATIN CAPITAL LETTER N
+FF2F;F;FULLWIDTH LATIN CAPITAL LETTER O
+FF30;F;FULLWIDTH LATIN CAPITAL LETTER P
+FF31;F;FULLWIDTH LATIN CAPITAL LETTER Q
+FF32;F;FULLWIDTH LATIN CAPITAL LETTER R
+FF33;F;FULLWIDTH LATIN CAPITAL LETTER S
+FF34;F;FULLWIDTH LATIN CAPITAL LETTER T
+FF35;F;FULLWIDTH LATIN CAPITAL LETTER U
+FF36;F;FULLWIDTH LATIN CAPITAL LETTER V
+FF37;F;FULLWIDTH LATIN CAPITAL LETTER W
+FF38;F;FULLWIDTH LATIN CAPITAL LETTER X
+FF39;F;FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A;F;FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B;F;FULLWIDTH LEFT SQUARE BRACKET
+FF3C;F;FULLWIDTH REVERSE SOLIDUS
+FF3D;F;FULLWIDTH RIGHT SQUARE BRACKET
+FF3E;F;FULLWIDTH CIRCUMFLEX ACCENT
+FF3F;F;FULLWIDTH LOW LINE
+FF40;F;FULLWIDTH GRAVE ACCENT
+FF41;F;FULLWIDTH LATIN SMALL LETTER A
+FF42;F;FULLWIDTH LATIN SMALL LETTER B
+FF43;F;FULLWIDTH LATIN SMALL LETTER C
+FF44;F;FULLWIDTH LATIN SMALL LETTER D
+FF45;F;FULLWIDTH LATIN SMALL LETTER E
+FF46;F;FULLWIDTH LATIN SMALL LETTER F
+FF47;F;FULLWIDTH LATIN SMALL LETTER G
+FF48;F;FULLWIDTH LATIN SMALL LETTER H
+FF49;F;FULLWIDTH LATIN SMALL LETTER I
+FF4A;F;FULLWIDTH LATIN SMALL LETTER J
+FF4B;F;FULLWIDTH LATIN SMALL LETTER K
+FF4C;F;FULLWIDTH LATIN SMALL LETTER L
+FF4D;F;FULLWIDTH LATIN SMALL LETTER M
+FF4E;F;FULLWIDTH LATIN SMALL LETTER N
+FF4F;F;FULLWIDTH LATIN SMALL LETTER O
+FF50;F;FULLWIDTH LATIN SMALL LETTER P
+FF51;F;FULLWIDTH LATIN SMALL LETTER Q
+FF52;F;FULLWIDTH LATIN SMALL LETTER R
+FF53;F;FULLWIDTH LATIN SMALL LETTER S
+FF54;F;FULLWIDTH LATIN SMALL LETTER T
+FF55;F;FULLWIDTH LATIN SMALL LETTER U
+FF56;F;FULLWIDTH LATIN SMALL LETTER V
+FF57;F;FULLWIDTH LATIN SMALL LETTER W
+FF58;F;FULLWIDTH LATIN SMALL LETTER X
+FF59;F;FULLWIDTH LATIN SMALL LETTER Y
+FF5A;F;FULLWIDTH LATIN SMALL LETTER Z
+FF5B;F;FULLWIDTH LEFT CURLY BRACKET
+FF5C;F;FULLWIDTH VERTICAL LINE
+FF5D;F;FULLWIDTH RIGHT CURLY BRACKET
+FF5E;F;FULLWIDTH TILDE
+FF61;H;HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62;H;HALFWIDTH LEFT CORNER BRACKET
+FF63;H;HALFWIDTH RIGHT CORNER BRACKET
+FF64;H;HALFWIDTH IDEOGRAPHIC COMMA
+FF65;H;HALFWIDTH KATAKANA MIDDLE DOT
+FF66;H;HALFWIDTH KATAKANA LETTER WO
+FF67;H;HALFWIDTH KATAKANA LETTER SMALL A
+FF68;H;HALFWIDTH KATAKANA LETTER SMALL I
+FF69;H;HALFWIDTH KATAKANA LETTER SMALL U
+FF6A;H;HALFWIDTH KATAKANA LETTER SMALL E
+FF6B;H;HALFWIDTH KATAKANA LETTER SMALL O
+FF6C;H;HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D;H;HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E;H;HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F;H;HALFWIDTH KATAKANA LETTER SMALL TU
+FF70;H;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71;H;HALFWIDTH KATAKANA LETTER A
+FF72;H;HALFWIDTH KATAKANA LETTER I
+FF73;H;HALFWIDTH KATAKANA LETTER U
+FF74;H;HALFWIDTH KATAKANA LETTER E
+FF75;H;HALFWIDTH KATAKANA LETTER O
+FF76;H;HALFWIDTH KATAKANA LETTER KA
+FF77;H;HALFWIDTH KATAKANA LETTER KI
+FF78;H;HALFWIDTH KATAKANA LETTER KU
+FF79;H;HALFWIDTH KATAKANA LETTER KE
+FF7A;H;HALFWIDTH KATAKANA LETTER KO
+FF7B;H;HALFWIDTH KATAKANA LETTER SA
+FF7C;H;HALFWIDTH KATAKANA LETTER SI
+FF7D;H;HALFWIDTH KATAKANA LETTER SU
+FF7E;H;HALFWIDTH KATAKANA LETTER SE
+FF7F;H;HALFWIDTH KATAKANA LETTER SO
+FF80;H;HALFWIDTH KATAKANA LETTER TA
+FF81;H;HALFWIDTH KATAKANA LETTER TI
+FF82;H;HALFWIDTH KATAKANA LETTER TU
+FF83;H;HALFWIDTH KATAKANA LETTER TE
+FF84;H;HALFWIDTH KATAKANA LETTER TO
+FF85;H;HALFWIDTH KATAKANA LETTER NA
+FF86;H;HALFWIDTH KATAKANA LETTER NI
+FF87;H;HALFWIDTH KATAKANA LETTER NU
+FF88;H;HALFWIDTH KATAKANA LETTER NE
+FF89;H;HALFWIDTH KATAKANA LETTER NO
+FF8A;H;HALFWIDTH KATAKANA LETTER HA
+FF8B;H;HALFWIDTH KATAKANA LETTER HI
+FF8C;H;HALFWIDTH KATAKANA LETTER HU
+FF8D;H;HALFWIDTH KATAKANA LETTER HE
+FF8E;H;HALFWIDTH KATAKANA LETTER HO
+FF8F;H;HALFWIDTH KATAKANA LETTER MA
+FF90;H;HALFWIDTH KATAKANA LETTER MI
+FF91;H;HALFWIDTH KATAKANA LETTER MU
+FF92;H;HALFWIDTH KATAKANA LETTER ME
+FF93;H;HALFWIDTH KATAKANA LETTER MO
+FF94;H;HALFWIDTH KATAKANA LETTER YA
+FF95;H;HALFWIDTH KATAKANA LETTER YU
+FF96;H;HALFWIDTH KATAKANA LETTER YO
+FF97;H;HALFWIDTH KATAKANA LETTER RA
+FF98;H;HALFWIDTH KATAKANA LETTER RI
+FF99;H;HALFWIDTH KATAKANA LETTER RU
+FF9A;H;HALFWIDTH KATAKANA LETTER RE
+FF9B;H;HALFWIDTH KATAKANA LETTER RO
+FF9C;H;HALFWIDTH KATAKANA LETTER WA
+FF9D;H;HALFWIDTH KATAKANA LETTER N
+FF9E;H;HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F;H;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0;H;HALFWIDTH HANGUL FILLER
+FFA1;H;HALFWIDTH HANGUL LETTER KIYEOK
+FFA2;H;HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3;H;HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4;H;HALFWIDTH HANGUL LETTER NIEUN
+FFA5;H;HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6;H;HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7;H;HALFWIDTH HANGUL LETTER TIKEUT
+FFA8;H;HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9;H;HALFWIDTH HANGUL LETTER RIEUL
+FFAA;H;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB;H;HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC;H;HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD;H;HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE;H;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF;H;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0;H;HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1;H;HALFWIDTH HANGUL LETTER MIEUM
+FFB2;H;HALFWIDTH HANGUL LETTER PIEUP
+FFB3;H;HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4;H;HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5;H;HALFWIDTH HANGUL LETTER SIOS
+FFB6;H;HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7;H;HALFWIDTH HANGUL LETTER IEUNG
+FFB8;H;HALFWIDTH HANGUL LETTER CIEUC
+FFB9;H;HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA;H;HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB;H;HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC;H;HALFWIDTH HANGUL LETTER THIEUTH
+FFBD;H;HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE;H;HALFWIDTH HANGUL LETTER HIEUH
+FFC2;H;HALFWIDTH HANGUL LETTER A
+FFC3;H;HALFWIDTH HANGUL LETTER AE
+FFC4;H;HALFWIDTH HANGUL LETTER YA
+FFC5;H;HALFWIDTH HANGUL LETTER YAE
+FFC6;H;HALFWIDTH HANGUL LETTER EO
+FFC7;H;HALFWIDTH HANGUL LETTER E
+FFCA;H;HALFWIDTH HANGUL LETTER YEO
+FFCB;H;HALFWIDTH HANGUL LETTER YE
+FFCC;H;HALFWIDTH HANGUL LETTER O
+FFCD;H;HALFWIDTH HANGUL LETTER WA
+FFCE;H;HALFWIDTH HANGUL LETTER WAE
+FFCF;H;HALFWIDTH HANGUL LETTER OE
+FFD2;H;HALFWIDTH HANGUL LETTER YO
+FFD3;H;HALFWIDTH HANGUL LETTER U
+FFD4;H;HALFWIDTH HANGUL LETTER WEO
+FFD5;H;HALFWIDTH HANGUL LETTER WE
+FFD6;H;HALFWIDTH HANGUL LETTER WI
+FFD7;H;HALFWIDTH HANGUL LETTER YU
+FFDA;H;HALFWIDTH HANGUL LETTER EU
+FFDB;H;HALFWIDTH HANGUL LETTER YI
+FFDC;H;HALFWIDTH HANGUL LETTER I
+FFE0;F;FULLWIDTH CENT SIGN
+FFE1;F;FULLWIDTH POUND SIGN
+FFE2;F;FULLWIDTH NOT SIGN
+FFE3;F;FULLWIDTH MACRON
+FFE4;F;FULLWIDTH BROKEN BAR
+FFE5;F;FULLWIDTH YEN SIGN
+FFE6;F;FULLWIDTH WON SIGN
+FFE8;H;HALFWIDTH FORMS LIGHT VERTICAL
+FFE9;H;HALFWIDTH LEFTWARDS ARROW
+FFEA;H;HALFWIDTH UPWARDS ARROW
+FFEB;H;HALFWIDTH RIGHTWARDS ARROW
+FFEC;H;HALFWIDTH DOWNWARDS ARROW
+FFED;H;HALFWIDTH BLACK SQUARE
+FFEE;H;HALFWIDTH WHITE CIRCLE
+FFF9;N;INTERLINEAR ANNOTATION ANCHOR
+FFFA;N;INTERLINEAR ANNOTATION SEPARATOR
+FFFB;N;INTERLINEAR ANNOTATION TERMINATOR
+FFFC;N;OBJECT REPLACEMENT CHARACTER
+FFFD;A;REPLACEMENT CHARACTER
diff --git a/contrib/perl5/lib/unicode/In/AlphabeticPresentationForms.pl b/contrib/perl5/lib/unicode/In/AlphabeticPresentationForms.pl
new file mode 100644
index 0000000..c42e944
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/AlphabeticPresentationForms.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FB00 FB4F
+END
diff --git a/contrib/perl5/lib/unicode/In/Arabic.pl b/contrib/perl5/lib/unicode/In/Arabic.pl
new file mode 100644
index 0000000..5010ab7
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Arabic.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0600 06FF
+END
diff --git a/contrib/perl5/lib/unicode/In/ArabicPresentationForms-A.pl b/contrib/perl5/lib/unicode/In/ArabicPresentationForms-A.pl
new file mode 100644
index 0000000..6edd74d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/ArabicPresentationForms-A.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FB50 FDFF
+END
diff --git a/contrib/perl5/lib/unicode/In/ArabicPresentationForms-B.pl b/contrib/perl5/lib/unicode/In/ArabicPresentationForms-B.pl
new file mode 100644
index 0000000..9640739
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/ArabicPresentationForms-B.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FE70 FEFE
+END
diff --git a/contrib/perl5/lib/unicode/In/Armenian.pl b/contrib/perl5/lib/unicode/In/Armenian.pl
new file mode 100644
index 0000000..19b74ac
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Armenian.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0530 058F
+END
diff --git a/contrib/perl5/lib/unicode/In/Arrows.pl b/contrib/perl5/lib/unicode/In/Arrows.pl
new file mode 100644
index 0000000..7ce4418
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Arrows.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2190 21FF
+END
diff --git a/contrib/perl5/lib/unicode/In/BasicLatin.pl b/contrib/perl5/lib/unicode/In/BasicLatin.pl
new file mode 100644
index 0000000..39987f1
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/BasicLatin.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 007F
+END
diff --git a/contrib/perl5/lib/unicode/In/Bengali.pl b/contrib/perl5/lib/unicode/In/Bengali.pl
new file mode 100644
index 0000000..c0a47d3
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Bengali.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0980 09FF
+END
diff --git a/contrib/perl5/lib/unicode/In/BlockElements.pl b/contrib/perl5/lib/unicode/In/BlockElements.pl
new file mode 100644
index 0000000..e96e64f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/BlockElements.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2580 259F
+END
diff --git a/contrib/perl5/lib/unicode/In/Bopomofo.pl b/contrib/perl5/lib/unicode/In/Bopomofo.pl
new file mode 100644
index 0000000..5535606
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Bopomofo.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3100 312F
+END
diff --git a/contrib/perl5/lib/unicode/In/BopomofoExtended.pl b/contrib/perl5/lib/unicode/In/BopomofoExtended.pl
new file mode 100644
index 0000000..d0ee43a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/BopomofoExtended.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+31A0 31BF
+END
diff --git a/contrib/perl5/lib/unicode/In/BoxDrawing.pl b/contrib/perl5/lib/unicode/In/BoxDrawing.pl
new file mode 100644
index 0000000..d580199
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/BoxDrawing.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2500 257F
+END
diff --git a/contrib/perl5/lib/unicode/In/BraillePatterns.pl b/contrib/perl5/lib/unicode/In/BraillePatterns.pl
new file mode 100644
index 0000000..e5c9e4c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/BraillePatterns.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2800 28FF
+END
diff --git a/contrib/perl5/lib/unicode/In/CJKCompatibility.pl b/contrib/perl5/lib/unicode/In/CJKCompatibility.pl
new file mode 100644
index 0000000..07ab8ed
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CJKCompatibility.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3300 33FF
+END
diff --git a/contrib/perl5/lib/unicode/In/CJKCompatibilityForms.pl b/contrib/perl5/lib/unicode/In/CJKCompatibilityForms.pl
new file mode 100644
index 0000000..122ccd7
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CJKCompatibilityForms.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FE30 FE4F
+END
diff --git a/contrib/perl5/lib/unicode/In/CJKCompatibilityIdeographs.pl b/contrib/perl5/lib/unicode/In/CJKCompatibilityIdeographs.pl
new file mode 100644
index 0000000..59c8e5d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CJKCompatibilityIdeographs.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+F900 FAFF
+END
diff --git a/contrib/perl5/lib/unicode/In/CJKRadicalsSupplement.pl b/contrib/perl5/lib/unicode/In/CJKRadicalsSupplement.pl
new file mode 100644
index 0000000..d4c0c82
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CJKRadicalsSupplement.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2E80 2EFF
+END
diff --git a/contrib/perl5/lib/unicode/In/CJKSymbolsandPunctuation.pl b/contrib/perl5/lib/unicode/In/CJKSymbolsandPunctuation.pl
new file mode 100644
index 0000000..24ecc37
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CJKSymbolsandPunctuation.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3000 303F
+END
diff --git a/contrib/perl5/lib/unicode/In/CJKUnifiedIdeographs.pl b/contrib/perl5/lib/unicode/In/CJKUnifiedIdeographs.pl
new file mode 100644
index 0000000..351cf74
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CJKUnifiedIdeographs.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+4E00 9FFF
+END
diff --git a/contrib/perl5/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl b/contrib/perl5/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
new file mode 100644
index 0000000..012f54c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3400 4DB5
+END
diff --git a/contrib/perl5/lib/unicode/In/Cherokee.pl b/contrib/perl5/lib/unicode/In/Cherokee.pl
new file mode 100644
index 0000000..10cae1a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Cherokee.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+13A0 13FF
+END
diff --git a/contrib/perl5/lib/unicode/In/CombiningDiacriticalMarks.pl b/contrib/perl5/lib/unicode/In/CombiningDiacriticalMarks.pl
new file mode 100644
index 0000000..a32f974
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CombiningDiacriticalMarks.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0300 036F
+END
diff --git a/contrib/perl5/lib/unicode/In/CombiningHalfMarks.pl b/contrib/perl5/lib/unicode/In/CombiningHalfMarks.pl
new file mode 100644
index 0000000..100471b
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CombiningHalfMarks.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FE20 FE2F
+END
diff --git a/contrib/perl5/lib/unicode/In/CombiningMarksforSymbols.pl b/contrib/perl5/lib/unicode/In/CombiningMarksforSymbols.pl
new file mode 100644
index 0000000..f45e7e0
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CombiningMarksforSymbols.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+20D0 20FF
+END
diff --git a/contrib/perl5/lib/unicode/In/ControlPictures.pl b/contrib/perl5/lib/unicode/In/ControlPictures.pl
new file mode 100644
index 0000000..77a759f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/ControlPictures.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2400 243F
+END
diff --git a/contrib/perl5/lib/unicode/In/CurrencySymbols.pl b/contrib/perl5/lib/unicode/In/CurrencySymbols.pl
new file mode 100644
index 0000000..567ae97
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/CurrencySymbols.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+20A0 20CF
+END
diff --git a/contrib/perl5/lib/unicode/In/Cyrillic.pl b/contrib/perl5/lib/unicode/In/Cyrillic.pl
new file mode 100644
index 0000000..9ca104c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Cyrillic.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0400 04FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Devanagari.pl b/contrib/perl5/lib/unicode/In/Devanagari.pl
new file mode 100644
index 0000000..61372b5
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Devanagari.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0900 097F
+END
diff --git a/contrib/perl5/lib/unicode/In/Dingbats.pl b/contrib/perl5/lib/unicode/In/Dingbats.pl
new file mode 100644
index 0000000..0f820ca
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Dingbats.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2700 27BF
+END
diff --git a/contrib/perl5/lib/unicode/In/EnclosedAlphanumerics.pl b/contrib/perl5/lib/unicode/In/EnclosedAlphanumerics.pl
new file mode 100644
index 0000000..de52aa8
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/EnclosedAlphanumerics.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2460 24FF
+END
diff --git a/contrib/perl5/lib/unicode/In/EnclosedCJKLettersandMonths.pl b/contrib/perl5/lib/unicode/In/EnclosedCJKLettersandMonths.pl
new file mode 100644
index 0000000..e4de0e0
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/EnclosedCJKLettersandMonths.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3200 32FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Ethiopic.pl b/contrib/perl5/lib/unicode/In/Ethiopic.pl
new file mode 100644
index 0000000..13c3090
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Ethiopic.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1200 137F
+END
diff --git a/contrib/perl5/lib/unicode/In/GeneralPunctuation.pl b/contrib/perl5/lib/unicode/In/GeneralPunctuation.pl
new file mode 100644
index 0000000..81c7699
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/GeneralPunctuation.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2000 206F
+END
diff --git a/contrib/perl5/lib/unicode/In/GeometricShapes.pl b/contrib/perl5/lib/unicode/In/GeometricShapes.pl
new file mode 100644
index 0000000..170422d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/GeometricShapes.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+25A0 25FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Georgian.pl b/contrib/perl5/lib/unicode/In/Georgian.pl
new file mode 100644
index 0000000..773ed156
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Georgian.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+10A0 10FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Greek.pl b/contrib/perl5/lib/unicode/In/Greek.pl
new file mode 100644
index 0000000..ff753d1
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Greek.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0370 03FF
+END
diff --git a/contrib/perl5/lib/unicode/In/GreekExtended.pl b/contrib/perl5/lib/unicode/In/GreekExtended.pl
new file mode 100644
index 0000000..b8f02e7
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/GreekExtended.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1F00 1FFF
+END
diff --git a/contrib/perl5/lib/unicode/In/Gujarati.pl b/contrib/perl5/lib/unicode/In/Gujarati.pl
new file mode 100644
index 0000000..ff6c650
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Gujarati.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0A80 0AFF
+END
diff --git a/contrib/perl5/lib/unicode/In/Gurmukhi.pl b/contrib/perl5/lib/unicode/In/Gurmukhi.pl
new file mode 100644
index 0000000..b888df6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Gurmukhi.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0A00 0A7F
+END
diff --git a/contrib/perl5/lib/unicode/In/HalfwidthandFullwidthForms.pl b/contrib/perl5/lib/unicode/In/HalfwidthandFullwidthForms.pl
new file mode 100644
index 0000000..e452653
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/HalfwidthandFullwidthForms.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FF00 FFEF
+END
diff --git a/contrib/perl5/lib/unicode/In/HangulCompatibilityJamo.pl b/contrib/perl5/lib/unicode/In/HangulCompatibilityJamo.pl
new file mode 100644
index 0000000..c15379f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/HangulCompatibilityJamo.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3130 318F
+END
diff --git a/contrib/perl5/lib/unicode/In/HangulJamo.pl b/contrib/perl5/lib/unicode/In/HangulJamo.pl
new file mode 100644
index 0000000..c329b54
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/HangulJamo.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1100 11FF
+END
diff --git a/contrib/perl5/lib/unicode/In/HangulSyllables.pl b/contrib/perl5/lib/unicode/In/HangulSyllables.pl
new file mode 100644
index 0000000..7d91a36
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/HangulSyllables.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+AC00 D7A3
+END
diff --git a/contrib/perl5/lib/unicode/In/Hebrew.pl b/contrib/perl5/lib/unicode/In/Hebrew.pl
new file mode 100644
index 0000000..abe7b9e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Hebrew.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0590 05FF
+END
diff --git a/contrib/perl5/lib/unicode/In/HighPrivateUseSurrogates.pl b/contrib/perl5/lib/unicode/In/HighPrivateUseSurrogates.pl
new file mode 100644
index 0000000..6ed7ac9
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/HighPrivateUseSurrogates.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+DB80 DBFF
+END
diff --git a/contrib/perl5/lib/unicode/In/HighSurrogates.pl b/contrib/perl5/lib/unicode/In/HighSurrogates.pl
new file mode 100644
index 0000000..924a0c9
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/HighSurrogates.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+D800 DB7F
+END
diff --git a/contrib/perl5/lib/unicode/In/Hiragana.pl b/contrib/perl5/lib/unicode/In/Hiragana.pl
new file mode 100644
index 0000000..7a65302
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Hiragana.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3040 309F
+END
diff --git a/contrib/perl5/lib/unicode/In/IPAExtensions.pl b/contrib/perl5/lib/unicode/In/IPAExtensions.pl
new file mode 100644
index 0000000..20906d6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/IPAExtensions.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0250 02AF
+END
diff --git a/contrib/perl5/lib/unicode/In/IdeographicDescriptionCharacters.pl b/contrib/perl5/lib/unicode/In/IdeographicDescriptionCharacters.pl
new file mode 100644
index 0000000..4baae88
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/IdeographicDescriptionCharacters.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2FF0 2FFF
+END
diff --git a/contrib/perl5/lib/unicode/In/Kanbun.pl b/contrib/perl5/lib/unicode/In/Kanbun.pl
new file mode 100644
index 0000000..57d6bd2
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Kanbun.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3190 319F
+END
diff --git a/contrib/perl5/lib/unicode/In/KangxiRadicals.pl b/contrib/perl5/lib/unicode/In/KangxiRadicals.pl
new file mode 100644
index 0000000..d26fd6c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/KangxiRadicals.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2F00 2FDF
+END
diff --git a/contrib/perl5/lib/unicode/In/Kannada.pl b/contrib/perl5/lib/unicode/In/Kannada.pl
new file mode 100644
index 0000000..109197a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Kannada.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0C80 0CFF
+END
diff --git a/contrib/perl5/lib/unicode/In/Katakana.pl b/contrib/perl5/lib/unicode/In/Katakana.pl
new file mode 100644
index 0000000..93bd5a0
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Katakana.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+30A0 30FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Khmer.pl b/contrib/perl5/lib/unicode/In/Khmer.pl
new file mode 100644
index 0000000..f3e8685
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Khmer.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1780 17FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Lao.pl b/contrib/perl5/lib/unicode/In/Lao.pl
new file mode 100644
index 0000000..41ff11f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Lao.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0E80 0EFF
+END
diff --git a/contrib/perl5/lib/unicode/In/Latin-1Supplement.pl b/contrib/perl5/lib/unicode/In/Latin-1Supplement.pl
new file mode 100644
index 0000000..1b252eb
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Latin-1Supplement.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0080 00FF
+END
diff --git a/contrib/perl5/lib/unicode/In/LatinExtended-A.pl b/contrib/perl5/lib/unicode/In/LatinExtended-A.pl
new file mode 100644
index 0000000..b8be987
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/LatinExtended-A.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0100 017F
+END
diff --git a/contrib/perl5/lib/unicode/In/LatinExtended-B.pl b/contrib/perl5/lib/unicode/In/LatinExtended-B.pl
new file mode 100644
index 0000000..b9aff43
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/LatinExtended-B.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0180 024F
+END
diff --git a/contrib/perl5/lib/unicode/In/LatinExtendedAdditional.pl b/contrib/perl5/lib/unicode/In/LatinExtendedAdditional.pl
new file mode 100644
index 0000000..d309e90
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/LatinExtendedAdditional.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1E00 1EFF
+END
diff --git a/contrib/perl5/lib/unicode/In/LetterlikeSymbols.pl b/contrib/perl5/lib/unicode/In/LetterlikeSymbols.pl
new file mode 100644
index 0000000..1768740
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/LetterlikeSymbols.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2100 214F
+END
diff --git a/contrib/perl5/lib/unicode/In/LowSurrogates.pl b/contrib/perl5/lib/unicode/In/LowSurrogates.pl
new file mode 100644
index 0000000..752b264
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/LowSurrogates.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+DC00 DFFF
+END
diff --git a/contrib/perl5/lib/unicode/In/Malayalam.pl b/contrib/perl5/lib/unicode/In/Malayalam.pl
new file mode 100644
index 0000000..8fb57cd
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Malayalam.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0D00 0D7F
+END
diff --git a/contrib/perl5/lib/unicode/In/MathematicalOperators.pl b/contrib/perl5/lib/unicode/In/MathematicalOperators.pl
new file mode 100644
index 0000000..055f19e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/MathematicalOperators.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2200 22FF
+END
diff --git a/contrib/perl5/lib/unicode/In/MiscellaneousSymbols.pl b/contrib/perl5/lib/unicode/In/MiscellaneousSymbols.pl
new file mode 100644
index 0000000..9dcdd26
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/MiscellaneousSymbols.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2600 26FF
+END
diff --git a/contrib/perl5/lib/unicode/In/MiscellaneousTechnical.pl b/contrib/perl5/lib/unicode/In/MiscellaneousTechnical.pl
new file mode 100644
index 0000000..370c00f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/MiscellaneousTechnical.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2300 23FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Mongolian.pl b/contrib/perl5/lib/unicode/In/Mongolian.pl
new file mode 100644
index 0000000..394014d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Mongolian.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1800 18AF
+END
diff --git a/contrib/perl5/lib/unicode/In/Myanmar.pl b/contrib/perl5/lib/unicode/In/Myanmar.pl
new file mode 100644
index 0000000..4b3f318
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Myanmar.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1000 109F
+END
diff --git a/contrib/perl5/lib/unicode/In/NumberForms.pl b/contrib/perl5/lib/unicode/In/NumberForms.pl
new file mode 100644
index 0000000..d33ece0
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/NumberForms.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2150 218F
+END
diff --git a/contrib/perl5/lib/unicode/In/Ogham.pl b/contrib/perl5/lib/unicode/In/Ogham.pl
new file mode 100644
index 0000000..e097d90
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Ogham.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1680 169F
+END
diff --git a/contrib/perl5/lib/unicode/In/OpticalCharacterRecognition.pl b/contrib/perl5/lib/unicode/In/OpticalCharacterRecognition.pl
new file mode 100644
index 0000000..be1d981
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/OpticalCharacterRecognition.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2440 245F
+END
diff --git a/contrib/perl5/lib/unicode/In/Oriya.pl b/contrib/perl5/lib/unicode/In/Oriya.pl
new file mode 100644
index 0000000..5a680f6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Oriya.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0B00 0B7F
+END
diff --git a/contrib/perl5/lib/unicode/In/PrivateUse.pl b/contrib/perl5/lib/unicode/In/PrivateUse.pl
new file mode 100644
index 0000000..0c118f4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/PrivateUse.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+E000 F8FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Runic.pl b/contrib/perl5/lib/unicode/In/Runic.pl
new file mode 100644
index 0000000..0bd42df
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Runic.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+16A0 16FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Sinhala.pl b/contrib/perl5/lib/unicode/In/Sinhala.pl
new file mode 100644
index 0000000..37e007c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Sinhala.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0D80 0DFF
+END
diff --git a/contrib/perl5/lib/unicode/In/SmallFormVariants.pl b/contrib/perl5/lib/unicode/In/SmallFormVariants.pl
new file mode 100644
index 0000000..736415e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/SmallFormVariants.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FE50 FE6F
+END
diff --git a/contrib/perl5/lib/unicode/In/SpacingModifierLetters.pl b/contrib/perl5/lib/unicode/In/SpacingModifierLetters.pl
new file mode 100644
index 0000000..6e9cdf0
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/SpacingModifierLetters.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+02B0 02FF
+END
diff --git a/contrib/perl5/lib/unicode/In/Specials.pl b/contrib/perl5/lib/unicode/In/Specials.pl
new file mode 100644
index 0000000..f9f730f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Specials.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+FFF0 FFFD
+END
diff --git a/contrib/perl5/lib/unicode/In/SuperscriptsandSubscripts.pl b/contrib/perl5/lib/unicode/In/SuperscriptsandSubscripts.pl
new file mode 100644
index 0000000..efcec0b
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/SuperscriptsandSubscripts.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2070 209F
+END
diff --git a/contrib/perl5/lib/unicode/In/Syriac.pl b/contrib/perl5/lib/unicode/In/Syriac.pl
new file mode 100644
index 0000000..7c81fb6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Syriac.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0700 074F
+END
diff --git a/contrib/perl5/lib/unicode/In/Tamil.pl b/contrib/perl5/lib/unicode/In/Tamil.pl
new file mode 100644
index 0000000..e65ed2f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Tamil.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0B80 0BFF
+END
diff --git a/contrib/perl5/lib/unicode/In/Telugu.pl b/contrib/perl5/lib/unicode/In/Telugu.pl
new file mode 100644
index 0000000..d5ed236
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Telugu.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0C00 0C7F
+END
diff --git a/contrib/perl5/lib/unicode/In/Thaana.pl b/contrib/perl5/lib/unicode/In/Thaana.pl
new file mode 100644
index 0000000..361bd4d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Thaana.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0780 07BF
+END
diff --git a/contrib/perl5/lib/unicode/In/Thai.pl b/contrib/perl5/lib/unicode/In/Thai.pl
new file mode 100644
index 0000000..3376de4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Thai.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0E00 0E7F
+END
diff --git a/contrib/perl5/lib/unicode/In/Tibetan.pl b/contrib/perl5/lib/unicode/In/Tibetan.pl
new file mode 100644
index 0000000..50837ad
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/Tibetan.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0F00 0FFF
+END
diff --git a/contrib/perl5/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl b/contrib/perl5/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
new file mode 100644
index 0000000..ad4eb27
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1400 167F
+END
diff --git a/contrib/perl5/lib/unicode/In/YiRadicals.pl b/contrib/perl5/lib/unicode/In/YiRadicals.pl
new file mode 100644
index 0000000..f25c695
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/YiRadicals.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+A490 A4CF
+END
diff --git a/contrib/perl5/lib/unicode/In/YiSyllables.pl b/contrib/perl5/lib/unicode/In/YiSyllables.pl
new file mode 100644
index 0000000..f4e3a8b
--- /dev/null
+++ b/contrib/perl5/lib/unicode/In/YiSyllables.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+A000 A48F
+END
diff --git a/contrib/perl5/lib/unicode/Index.txt b/contrib/perl5/lib/unicode/Index.txt
new file mode 100644
index 0000000..1ebeea6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Index.txt
@@ -0,0 +1,3055 @@
+8859-1 (Latin-1), Based on ISO 00A0
+8859-2, -3, -4, -9 (European Latin), Based on ISO 0100
+8859-5 (Cyrillic), Based on ISO 0400
+8859-6 (Arabic), Based on ISO 0600
+8859-7 (Greek), Based on ISO 0370
+8859-8 (Hebrew), Based on ISO 05D0
+a, latin small letter script 0251
+A, LATIN SMALL LETTER TURNED 0250
+ABBREVIATION MARK, ARMENIAN 055F
+ABBREVIATION SIGN, DEVANAGARI 0970
+Abbreviations, Squared Latin 3371
+Aboriginal Syllabics, Unified Canadian 1400
+ABOVE RIGHT, COMBINING COMMA 0315
+above, cedilla 0312
+ABOVE, COMBINING ALMOST EQUAL TO 034C
+ABOVE, COMBINING BRIDGE 0346
+ABOVE, COMBINING CLOCKWISE ARROW 20D5
+ABOVE, COMBINING COMMA 0313
+ABOVE, COMBINING DOT 0307
+ABOVE, COMBINING DOUBLE VERTICAL LINE 030E
+ABOVE, COMBINING FOUR DOTS 20DC
+ABOVE, COMBINING HOMOTHETIC 034B
+ABOVE, COMBINING HOOK 0309
+ABOVE, COMBINING LEFT ANGLE 031A
+ABOVE, COMBINING LEFT ARROW 20D6
+ABOVE, COMBINING LEFT HARPOON 20D0
+ABOVE, COMBINING LEFT RIGHT ARROW 20E1
+ABOVE, COMBINING NOT TILDE 034A
+ABOVE, COMBINING REVERSED COMMA 0314
+ABOVE, COMBINING RING 030A
+ABOVE, COMBINING THREE DOTS 20DB
+ABOVE, COMBINING TURNED COMMA 0312
+ABOVE, COMBINING VERTICAL LINE 030D
+ABOVE, COMBINING X 033D
+ABOVE, DOT 02D9
+above, double dot 0308
+ABOVE, RING 02DA
+above, vee 030C
+ACCENT BELOW, COMBINING ACUTE 0317
+ACCENT BELOW, COMBINING CIRCUMFLEX 032D
+ACCENT BELOW, COMBINING GRAVE 0316
+ACCENT, ACUTE 00B4
+ACCENT, CIRCUMFLEX 005E
+ACCENT, COMBINING ACUTE 0301
+ACCENT, COMBINING CIRCUMFLEX 0302
+ACCENT, COMBINING DOUBLE ACUTE 030B
+ACCENT, COMBINING DOUBLE GRAVE 030F
+ACCENT, COMBINING GRAVE 0300
+ACCENT, DOUBLE ACUTE 02DD
+ACCENT, GRAVE 0060
+ACCENT, MODIFIER LETTER ACUTE 02CA
+ACCENT, MODIFIER LETTER CIRCUMFLEX 02C6
+ACCENT, MODIFIER LETTER CROSS 02DF
+ACCENT, MODIFIER LETTER GRAVE 02CB
+ACCENT, MODIFIER LETTER LOW ACUTE 02CF
+ACCENT, MODIFIER LETTER LOW GRAVE 02CE
+accent, swedish grave 02DF
+ACCOUNT OF 2100
+acknowledge 0006
+acknowledge, graphic for negative 237B
+acknowledge, negative 0015
+ACKNOWLEDGE, SYMBOL FOR 2406
+ACKNOWLEDGE, SYMBOL FOR NEGATIVE 2415
+ACTIVATE ARABIC FORM SHAPING 206D
+ACTIVATE SYMMETRIC SWAPPING 206B
+ACUTE ACCENT 00B4
+ACUTE ACCENT BELOW, COMBINING 0317
+ACUTE ACCENT, COMBINING 0301
+ACUTE ACCENT, COMBINING DOUBLE 030B
+ACUTE ACCENT, DEVANAGARI 0954
+ACUTE ACCENT, DOUBLE 02DD
+ACUTE ACCENT, MODIFIER LETTER 02CA
+ACUTE ACCENT, MODIFIER LETTER LOW 02CF
+ACUTE TONE MARK, COMBINING 0341
+acute, spacing 00B4
+ADDRESSED TO THE SUBJECT 2101
+AE, LATIN SMALL LETTER 00E6
+AIRPLANE 2708
+aldus leaf 2766
+ALEF SYMBOL 2135
+ALL AROUND-PROFILE 232E
+ALL EQUAL TO 224C
+ALL, FOR 2200
+ALMOST EQUAL TO 2248
+ALMOST EQUAL TO ABOVE, COMBINING 034C
+ALPHA, LATIN SMALL LETTER 0251
+ALPHA, LATIN SMALL LETTER TURNED 0252
+Alphabetic Presentation Forms FB00
+Alphanumerics, Enclosed 2460
+alternating current 223F
+ALTERNATIVE KEY SYMBOL 2387
+ALVEOLAR CLICK, LATIN LETTER 01C2
+AMPERSAND 0026
+AND, CURLY LOGICAL 22CF
+AND, LOGICAL 2227
+AND, N-ARY LOGICAL 22C0
+ANGLE 2220
+ANGLE ABOVE, COMBINING LEFT 031A
+angle arc 2222
+ANGLE BELOW, COMBINING LEFT 0349
+ANGLE BRACKET, LEFT 3008
+ANGLE BRACKET, LEFT DOUBLE 300A
+ANGLE BRACKET, LEFT-POINTING 2329
+ANGLE BRACKET, RIGHT-POINTING 232A
+ANGLE QUOTATION MARK, LEFT-POINTING DOUBLE 00AB
+ANGLE QUOTATION MARK, RIGHT-POINTING DOUBLE 00BB
+ANGLE QUOTATION MARK, SINGLE LEFT-POINTING 2039
+ANGLE QUOTATION MARK, SINGLE RIGHT-POINTING 203A
+ANGLE WITH ARC, RIGHT 22BE
+ANGLE, MEASURED 2221
+ANGLE, RIGHT 221F
+ANGLE, SPHERICAL 2222
+angled dash 00AC
+ANGSTROM SIGN 212B
+ANKH 2625
+Annotation Signs, Koranic 06D6
+Annotation, Interlinear FFF9
+Annotation, Kanbun Ideographic 3190
+APL 2336
+APL Functional Symbols 2336
+apl jot 2218
+apl overbar 00AF
+apl quote 0022
+apl stile 2223
+apl tilde 223C
+apl upstile 2308
+APOSTROPHE 0027
+apostrophe 02BC
+apostrophe 2019
+APOSTROPHE, ARMENIAN 055A
+APOSTROPHE, MODIFIER LETTER 02BC
+APOSTROPHE, MODIFIER LETTER DOUBLE 02EE
+apostrophe-quote 0027
+application program command 009F
+APPROACHES THE LIMIT 2250
+APPROXIMATELY EQUAL TO 2245
+approximately equal to 2257
+AQUARIUS 2652
+Arabic 0600
+ARABIC COMMA 060C
+ARABIC DECIMAL SEPARATOR 066B
+ARABIC FIVE POINTED STAR 066D
+ARABIC FORM SHAPING, ACTIVATE 206D
+ARABIC FORM SHAPING, INHIBIT 206C
+ARABIC FULL STOP 06D4
+Arabic Letters 0627
+ARABIC PERCENT SIGN 066A
+Arabic Points 064B
+Arabic Presentation Forms-A FB50
+Arabic Presentation Forms-B FE70
+ARABIC QUESTION MARK 061F
+ARABIC SEMICOLON 061B
+ARABIC THOUSANDS SEPARATOR 066C
+Arabic, Extended 0671
+Arabic-Indic Digits 0660
+Arabic-Indic Digits for Persian and Urdu, Eastern 06F0
+ARC 2312
+arc, angle 2222
+ARC, RIGHT ANGLE WITH 22BE
+ARCH BELOW, COMBINING INVERTED DOUBLE 032B
+Arcs 25DC
+area, end of guarded 0097
+area, end of selected 0087
+area, start of guarded 0096
+area, start of selected 0086
+ARIES 2648
+Armenian 0530
+ARMENIAN ABBREVIATION MARK 055F
+ARMENIAN APOSTROPHE 055A
+Armenian Capital Letters 0531
+ARMENIAN COMMA 055D
+ARMENIAN EMPHASIS MARK 055B
+ARMENIAN EXCLAMATION MARK 055C
+ARMENIAN FULL STOP 0589
+ARMENIAN HYPHEN 058A
+Armenian Ligatures FB13
+ARMENIAN QUESTION MARK 055E
+Armenian Small Letters 0561
+ARROW ABOVE, COMBINING CLOCKWISE 20D5
+ARROW ABOVE, COMBINING LEFT 20D6
+ARROW ABOVE, COMBINING LEFT RIGHT 20E1
+ARROW BELOW, COMBINING DOUBLE RIGHTWARDS 0362
+ARROW BELOW, COMBINING LEFT RIGHT 034D
+ARROW BELOW, COMBINING UPWARDS 034E
+Arrow Dingbats 2794
+ARROW, ELECTRIC 2301
+ARROWHEAD, UP 2303
+Arrowheads, Modifier Letter 02C2
+Arrows 2190
+ASCENDING NODE 260A
+ASCII 0020
+ASCII C0 Control Codes 0000
+ASCII Digits 0030
+ASCII Variants, Fullwidth FF01
+ash 00E6
+ASSERTION 22A6
+ASTERISK 002A
+Asterisk Dingbats 2722
+ASTERISK OPERATOR 2217
+ASTERISK OPERATOR, CIRCLED 229B
+Asterisks and Snowflakes, Stars, 2721
+ASTERISM 2042
+Astrological Symbols 263D
+asymptotic to 2248
+ASYMPTOTICALLY EQUAL TO 2243
+AT, COMMERCIAL 0040
+B, LATIN LETTER SMALL CAPITAL 0299
+B, SCRIPT CAPITAL 212C
+baby gamma, latin small letter 0264
+backslash 005C
+BACKSLASH, COMBINING ENCLOSING CIRCLE 20E0
+backspace 0008
+BACKSPACE, SYMBOL FOR 2408
+backward difference 2207
+BAHT, THAI CURRENCY SYMBOL 0E3F
+BALLOT BOX 2610
+BALLOT BOX WITH CHECK 2611
+BALLOT BOX WITH X 2612
+BALLOT X 2717
+BALLOT X, HEAVY 2718
+bang 0021
+Bar Dingbats, Vertical 2758
+bar, broken vertical 00A6
+BAR, HORIZONTAL 2015
+bar, vertical 007C
+barred o, latin capital letter 019F
+BARRED O, LATIN SMALL LETTER 0275
+Basic Latin, C0 Controls and 0000
+Basic Russian Alphabet 0410
+BEAMED EIGHTH NOTES 266B
+BEAMED SIXTEENTH NOTES 266C
+BECAUSE 2235
+beginning of line 2310
+bell 0007
+BELL SYMBOL 237E
+BELL, SYMBOL FOR 2407
+BELOW, COMBINING ACUTE ACCENT 0317
+BELOW, COMBINING BREVE 032E
+BELOW, COMBINING BRIDGE 032A
+BELOW, COMBINING CARON 032C
+BELOW, COMBINING CIRCUMFLEX ACCENT 032D
+BELOW, COMBINING COMMA 0326
+BELOW, COMBINING DIAERESIS 0324
+BELOW, COMBINING DOT 0323
+BELOW, COMBINING DOUBLE RIGHTWARDS ARROW 0362
+BELOW, COMBINING DOUBLE VERTICAL LINE 0348
+BELOW, COMBINING EQUALS SIGN 0347
+BELOW, COMBINING GRAVE ACCENT 0316
+BELOW, COMBINING INVERTED BREVE 032F
+BELOW, COMBINING INVERTED BRIDGE 033A
+BELOW, COMBINING INVERTED DOUBLE ARCH 032B
+BELOW, COMBINING LEFT ANGLE 0349
+BELOW, COMBINING LEFT HALF RING 031C
+BELOW, COMBINING LEFT RIGHT ARROW 034D
+BELOW, COMBINING LEFT TACK 0318
+BELOW, COMBINING MACRON 0331
+BELOW, COMBINING MINUS SIGN 0320
+BELOW, COMBINING PALATALIZED HOOK 0321
+BELOW, COMBINING PLUS SIGN 031F
+BELOW, COMBINING RETROFLEX HOOK 0322
+BELOW, COMBINING RIGHT HALF RING 0339
+BELOW, COMBINING RING 0325
+BELOW, COMBINING SEAGULL 033C
+BELOW, COMBINING SQUARE 033B
+BELOW, COMBINING TILDE 0330
+BELOW, COMBINING UP TACK 031D
+BELOW, COMBINING UPWARDS ARROW 034E
+BELOW, COMBINING VERTICAL LINE 0329
+below, greek non-spacing iota 0345
+Bengali 0980
+Bengali Currency Signs 09F2
+Bengali Digits 09E6
+Bengali Letters 0985
+BENGALI RUPEE MARK 09F2
+BENGALI RUPEE SIGN 09F3
+BENZENE RING 232C
+bernoulli function 212C
+BET SYMBOL 2136
+Betty BOOP
+BETWEEN 226C
+BIDENTAL PERCUSSIVE, LATIN LETTER 02AD
+Bidirectional Formatting Controls 202A
+Big 5, Duplicates from FA0C
+BILABIAL CLICK, LATIN LETTER 0298
+BILABIAL PERCUSSIVE, LATIN LETTER 02AC
+BIOHAZARD SIGN 2623
+BLACK LEFT POINTING INDEX 261A
+BLACK LEFTWARDS BULLET 204C
+BLACK LENTICULAR BRACKET, LEFT 3010
+BLACK NIB 2712
+BLACK PARALLELOGRAM 25B0
+BLACK SCISSORS 2702
+black small circle 2022
+BLACK SMILING FACE 263B
+BLACK STAR 2605
+BLACK SUN WITH RAYS 2600
+BLACK TELEPHONE 260E
+BLACK-LETTER CAPITAL C 212D
+BLACK-LETTER CAPITAL H 210C
+BLACK-LETTER CAPITAL I 2111
+BLACK-LETTER CAPITAL R 211C
+BLACK-LETTER CAPITAL Z 2128
+BLANK SYMBOL 2422
+Block Elements 2580
+block, end of transmission 0017
+BLOCK, SYMBOL FOR END OF TRANSMISSION 2417
+bom FEFF
+Bopomofo Extended for Minnan and Hakka, Chinese 31A0
+Bopomofo, Chinese 3100
+BOWTIE 22C8
+Box Drawing 2500
+BOX WITH CHECK, BALLOT 2611
+BOX WITH X, BALLOT 2612
+BOX, BALLOT 2610
+BOX, OPEN 2423
+BOX, SHOULDERED OPEN 237D
+BOX, X IN A RECTANGLE 2327
+bra 2329
+brace, closing 007D
+brace, opening 007B
+BRACKET WITH QUILL, LEFT SQUARE 2045
+bracket, closing curly 007D
+bracket, closing square 005D
+BRACKET, LEFT ANGLE 3008
+BRACKET, LEFT BLACK LENTICULAR 3010
+BRACKET, LEFT CORNER 300C
+BRACKET, LEFT CURLY 007B
+BRACKET, LEFT DOUBLE ANGLE 300A
+BRACKET, LEFT SQUARE 005B
+BRACKET, LEFT TORTOISE SHELL 3014
+BRACKET, LEFT WHITE CORNER 300E
+BRACKET, LEFT WHITE LENTICULAR 3016
+BRACKET, LEFT WHITE SQUARE 301A
+BRACKET, LEFT WHITE TORTOISE SHELL 3018
+BRACKET, LEFT-POINTING ANGLE 2329
+bracket, opening curly 007B
+bracket, opening square 005B
+BRACKET, RIGHT CURLY 007D
+BRACKET, RIGHT SQUARE 005D
+Braille Patterns 2800
+brazilian currency 20A2
+break here, no 0083
+break permitted here 0082
+breathing, rough 0314
+breathing, smooth 0313
+BREVE 02D8
+BREVE BELOW, COMBINING 032E
+BREVE BELOW, COMBINING INVERTED 032F
+BREVE, COMBINING 0306
+BREVE, COMBINING DOUBLE INVERTED 0361
+BREVE, COMBINING INVERTED 0311
+BRIDGE ABOVE, COMBINING 0346
+BRIDGE BELOW, COMBINING 032A
+BRIDGE BELOW, COMBINING INVERTED 033A
+broken vertical bar 00A6
+BULLET 2022
+BULLET OPERATOR 2219
+BULLET, BLACK LEFTWARDS 204C
+BULLET, HYPHEN 2043
+BULLET, REVERSED ROTATED FLORAL HEART 2619
+bullet, tainome (japanese, a kind of) 25C9
+BULLET, TRIANGULAR 2023
+BULLET, WHITE 25E6
+BULLSEYE 25CE
+bullseye, latin letter 0298
+by definition, equal to 225C
+BY DEFINITION, EQUAL TO 225D
+BY, MEASURED 225E
+byte order mark FEFF
+C, BLACK-LETTER CAPITAL 212D
+C, DOUBLE-STRUCK CAPITAL 2102
+C, LATIN LETTER STRETCHED 0297
+C0 Controls and Basic Latin 0000
+C1 Controls and Latin-1 Supplement 0080
+CADA UNA 2106
+CADUCEUS 2624
+Canadian Aboriginal Syllabics, Unified 1400
+cancel 0018
+cancel character 0094
+CANCEL, SYMBOL FOR 2418
+CANCER 264B
+CANDRABINDU, COMBINING 0310
+Cantillation Marks, Hebrew 0591
+cap 2229
+CAP, SQUARE 2293
+Capital Letters, Armenian 0531
+Capital Letters, Cyrillic 0401
+Capital Letters, Georgian 10A0
+Capital Letters, Greek 0391
+Capital Letters, Latin 0041
+CAPRICORN 2651
+caps lock 21EA
+caps lock 21EC
+Card Suits, Playing 2660
+cardinal (countable), first transfinite 2135
+cardinal (functions of a real variable), third transfinite 2137
+cardinal (the continuum), second transfinite 2136
+CARE OF 2105
+caret 028C
+CARET 2038
+CARET INSERTION POINT 2041
+CARON 02C7
+CARON BELOW, COMBINING 032C
+CARON, COMBINING 030C
+carriage return 000D
+carriage return 21B5
+CARRIAGE RETURN, SYMBOL FOR 240D
+CAUTION SIGN 2621
+CEDILLA 00B8
+cedilla above 0312
+CEDILLA, COMBINING 0327
+cedilla, spacing 00B8
+CEILING, LEFT 2308
+CELSIUS, DEGREE 2103
+CENT SIGN 00A2
+centigrade, degrees 2103
+CENTRE LINE SYMBOL 2104
+CENTRED LEFT HALF RING, MODIFIER LETTER 02D3
+CENTRELINE LOW LINE FE4E
+CENTRELINE OVERLINE FE4A
+character introducer, single 009A
+character tabulation set 0088
+character tabulation with justification 0089
+CHARACTER TIE 2040
+Chart Components, Form and 2500
+CHECK MARK 2713
+CHECK MARK, HEAVY 2714
+CHECK MARK, NOT 237B
+CHECK, BALLOT BOX WITH 2611
+Cherokee 13A0
+Chess Pieces 2654
+chevrons 00AB
+CHI RHO 2627
+Chinese Bopomofo 3100
+Chinese Bopomofo Extended for Minnan and Hakka 31A0
+CIRCLE BACKSLASH, COMBINING ENCLOSING 20E0
+CIRCLE, BLACK 25CF
+circle, black small 2022
+CIRCLE, COMBINING ENCLOSING 20DD
+circle, jis composition 20DD
+CIRCLE, LARGE 25EF
+CIRCLED ASTERISK OPERATOR 229B
+CIRCLED DASH 229D
+CIRCLED DIGIT ZERO 24EA
+Circled Digits, Dingbat 2776
+CIRCLED DIVISION SLASH 2298
+CIRCLED DOT OPERATOR 2299
+CIRCLED EQUALS 229C
+Circled Ideographs 3280
+Circled Inverse Numbers 2776
+Circled Japanese Katakana 32D0
+Circled Korean Hangul Elements 3260
+Circled Korean Hangul Syllables 326E
+Circled Latin Letters 24B6
+CIRCLED MINUS 2296
+Circled Numbers 2460
+CIRCLED PLUS 2295
+CIRCLED POSTAL MARK 3036
+CIRCLED RING OPERATOR 229A
+CIRCLED TIMES 2297
+Circles 25CB
+CIRCUMFLEX ACCENT 005E
+CIRCUMFLEX ACCENT BELOW, COMBINING 032D
+CIRCUMFLEX ACCENT, COMBINING 0302
+CIRCUMFLEX ACCENT, MODIFIER LETTER 02C6
+circumflex, spacing 005E
+CJK Compatibility 3300
+CJK Compatibility Forms FE30
+CJK Compatibility Ideographs F900
+CJK Compatibility Ideographs, IBM FA0E
+CJK Ideographs Area 3400
+CJK Letters and Ideographs, Enclosed 3200
+CJK Phonetics and Symbols Area 2E00
+CJK Radicals Supplement 2E80
+CJK Symbols and Punctuation 3000
+CJK Unified Ideographs 4E00
+CJK Unified Ideographs Extension A 3400
+clear key 2327
+CLEAR SCREEN SYMBOL 239A
+clear weather 2600
+CLICK, LATIN LETTER ALVEOLAR 01C2
+CLICK, LATIN LETTER BILABIAL 0298
+CLICK, LATIN LETTER DENTAL 01C0
+CLICK, LATIN LETTER LATERAL 01C1
+CLICK, LATIN LETTER RETROFLEX 01C3
+CLOCKWISE ARROW ABOVE, COMBINING 20D5
+CLOCKWISE CONTOUR INTEGRAL 2232
+CLOCKWISE INTEGRAL 2231
+CLOCKWISE RING OVERLAY, COMBINING 20D9
+clone 2104
+Clones of Diacritics, Spacing 02D8
+closed epsilon, latin small letter 029A
+CLOSED OMEGA, LATIN SMALL LETTER 0277
+CLOSED OPEN E, LATIN SMALL LETTER 029A
+closed reversed epsilon, latin small letter 025E
+CLOSED REVERSED OPEN E, LATIN SMALL LETTER 025E
+closing brace 007D
+closing curly bracket 007D
+CLOSING MARK, IDEOGRAPHIC 3006
+closing parenthesis 0029
+closing square bracket 005D
+CLOUD 2601
+cloudy weather 2601
+COLON 003A
+COLON EQUALS 2254
+COLON SIGN 20A1
+COLON, ETHIOPIC 1365
+COLON, MODIFIER LETTER HALF TRIANGULAR 02D1
+COLON, MODIFIER LETTER TRIANGULAR 02D0
+COLON, MONGOLIAN 1804
+COMBINING ACUTE ACCENT 0301
+COMBINING ACUTE ACCENT BELOW 0317
+COMBINING ACUTE TONE MARK 0341
+COMBINING ALMOST EQUAL TO ABOVE 034C
+Combining Alphabet, Korean Hangul Jamo 1100
+COMBINING BREVE 0306
+COMBINING BREVE BELOW 032E
+COMBINING BRIDGE ABOVE 0346
+COMBINING BRIDGE BELOW 032A
+COMBINING CANDRABINDU 0310
+COMBINING CARON 030C
+COMBINING CARON BELOW 032C
+COMBINING CEDILLA 0327
+Combining Characters, Cyrillic 0483
+COMBINING CIRCUMFLEX ACCENT 0302
+COMBINING CIRCUMFLEX ACCENT BELOW 032D
+COMBINING CLOCKWISE ARROW ABOVE 20D5
+COMBINING CLOCKWISE RING OVERLAY 20D9
+COMBINING COMMA ABOVE 0313
+COMBINING COMMA ABOVE RIGHT 0315
+COMBINING COMMA BELOW 0326
+Combining Diacritical Marks 0300
+Combining Diacritical Marks for Symbols 20D0
+COMBINING DIAERESIS 0308
+COMBINING DIAERESIS BELOW 0324
+COMBINING DOT ABOVE 0307
+COMBINING DOT BELOW 0323
+COMBINING DOUBLE ACUTE ACCENT 030B
+COMBINING DOUBLE GRAVE ACCENT 030F
+COMBINING DOUBLE INVERTED BREVE 0361
+COMBINING DOUBLE LOW LINE 0333
+COMBINING DOUBLE OVERLINE 033F
+COMBINING DOUBLE RIGHTWARDS ARROW BELOW 0362
+COMBINING DOUBLE TILDE 0360
+COMBINING DOUBLE TILDE LEFT HALF FE22
+COMBINING DOUBLE VERTICAL LINE ABOVE 030E
+COMBINING DOUBLE VERTICAL LINE BELOW 0348
+COMBINING DOWN TACK BELOW 031E
+COMBINING ENCLOSING CIRCLE 20DD
+COMBINING ENCLOSING CIRCLE BACKSLASH 20E0
+COMBINING ENCLOSING DIAMOND 20DF
+COMBINING ENCLOSING KEYCAP 20E3
+COMBINING ENCLOSING SCREEN 20E2
+COMBINING ENCLOSING SQUARE 20DE
+COMBINING EQUALS SIGN BELOW 0347
+COMBINING FOUR DOTS ABOVE 20DC
+COMBINING GRAVE ACCENT 0300
+COMBINING GRAVE ACCENT BELOW 0316
+COMBINING GRAVE TONE MARK 0340
+COMBINING GREEK DIALYTIKA TONOS 0344
+COMBINING GREEK KORONIS 0343
+COMBINING GREEK PERISPOMENI 0342
+COMBINING GREEK YPOGEGRAMMENI 0345
+combining hacek 030C
+Combining Half Marks FE20
+COMBINING HOMOTHETIC ABOVE 034B
+COMBINING HOOK ABOVE 0309
+COMBINING HORN 031B
+COMBINING INVERTED BREVE 0311
+COMBINING INVERTED BREVE BELOW 032F
+COMBINING INVERTED BRIDGE BELOW 033A
+COMBINING INVERTED DOUBLE ARCH BELOW 032B
+COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK 3099
+COMBINING LEFT ANGLE ABOVE 031A
+COMBINING LEFT ANGLE BELOW 0349
+COMBINING LEFT ARROW ABOVE 20D6
+COMBINING LEFT HALF RING BELOW 031C
+COMBINING LEFT HARPOON ABOVE 20D0
+COMBINING LEFT RIGHT ARROW ABOVE 20E1
+COMBINING LEFT RIGHT ARROW BELOW 034D
+COMBINING LEFT TACK BELOW 0318
+COMBINING LIGATURE LEFT HALF FE20
+COMBINING LONG SOLIDUS OVERLAY 0338
+COMBINING LONG STROKE OVERLAY 0336
+COMBINING LONG VERTICAL LINE OVERLAY 20D2
+COMBINING LOW LINE 0332
+COMBINING MACRON 0304
+COMBINING MACRON BELOW 0331
+COMBINING MINUS SIGN BELOW 0320
+COMBINING NOT TILDE ABOVE 034A
+COMBINING OGONEK 0328
+COMBINING OVERLINE 0305
+COMBINING PALATALIZED HOOK BELOW 0321
+COMBINING PLUS SIGN BELOW 031F
+COMBINING RETROFLEX HOOK BELOW 0322
+COMBINING REVERSED COMMA ABOVE 0314
+COMBINING RIGHT HALF RING BELOW 0339
+COMBINING RING ABOVE 030A
+COMBINING RING BELOW 0325
+COMBINING RING OVERLAY 20D8
+COMBINING SEAGULL BELOW 033C
+COMBINING SHORT SOLIDUS OVERLAY 0337
+COMBINING SHORT STROKE OVERLAY 0335
+COMBINING SHORT VERTICAL LINE OVERLAY 20D3
+COMBINING SQUARE BELOW 033B
+COMBINING THREE DOTS ABOVE 20DB
+COMBINING TILDE 0303
+COMBINING TILDE BELOW 0330
+COMBINING TILDE OVERLAY 0334
+COMBINING TURNED COMMA ABOVE 0312
+COMBINING UP TACK BELOW 031D
+COMBINING UPWARDS ARROW BELOW 034E
+COMBINING VERTICAL LINE ABOVE 030D
+COMBINING VERTICAL LINE BELOW 0329
+COMBINING VERTICAL TILDE 033E
+COMBINING X ABOVE 033D
+COMET 2604
+COMMA 002C
+COMMA ABOVE RIGHT, COMBINING 0315
+COMMA ABOVE, COMBINING 0313
+COMMA ABOVE, COMBINING REVERSED 0314
+COMMA ABOVE, COMBINING TURNED 0312
+COMMA BELOW, COMBINING 0326
+comma quotation mark, double 201D
+comma quotation mark, double reversed 201F
+comma quotation mark, double turned 201C
+comma quotation mark, low double 201E
+comma quotation mark, low single 201A
+comma quotation mark, single 2019
+comma quotation mark, single reversed 201B
+comma quotation mark, single turned 2018
+COMMA, ARABIC 060C
+COMMA, ARMENIAN 055D
+COMMA, ETHIOPIC 1363
+comma, georgian 00B7
+COMMA, IDEOGRAPHIC 3001
+COMMA, MODIFIER LETTER REVERSED 02BD
+COMMA, MODIFIER LETTER TURNED 02BB
+COMMA, MONGOLIAN 1802
+command key 2318
+command, application program 009F
+command, operating system 009D
+COMMERCIAL AT 0040
+compass 263C
+Compatibility and Specials Area F900
+Compatibility Forms, CJK FE30
+Compatibility Ideographs, CJK F900
+Compatibility Ideographs, IBM CJK FA0E
+Compatibility Jamo, Korean Hangul 3130
+Compatibility, CJK 3300
+COMPLEMENT 2201
+complex numbers, the set of 2102
+Components, Form and Chart 2500
+composite function 2218
+composition circle, jis 20DD
+COMPOSITION SYMBOL 2384
+conductance 2127
+CONICAL TAPER 2332
+CONJUGATE MATRIX, HERMITIAN 22B9
+conjunction 2227
+CONJUNCTION 260C
+CONTAINS AS MEMBER 220B
+CONTAINS AS MEMBER, SMALL 220D
+CONTAINS AS NORMAL SUBGROUP 22B3
+CONTINUOUS UNDERLINE SYMBOL 2381
+continuum, second transfinite cardinal 2136
+CONTOUR INTEGRAL 222E
+CONTOUR INTEGRAL, CLOCKWISE 2232
+Control Code Graphics 25F0
+Control Codes, ASCII C0 0000
+Control Codes, C1 0080
+Control Codes, Graphic Pictures for 2400
+Control Codes, Graphics for 237B
+control sequence introducer 009B
+control string, device 0090
+control, graphic for 2388
+Control, Syriac Format 070F
+Controls and Basic Latin, C0 0000
+Controls and Latin-1 Supplement, C1 0080
+Controls, Bidirectional Formatting 202A
+Controls, Mongolian Format 180B
+COPRODUCT, N-ARY 2210
+Coptic, Greek and 0370
+Coptic-unique Letters 03E2
+COPYRIGHT SIGN 00A9
+COPYRIGHT, SOUND RECORDING 2117
+CORNER BRACKET, LEFT 300C
+CORNER BRACKET, LEFT WHITE 300E
+CORNER, TOP LEFT 231C
+CORPORATION, SQUARE 337F
+CORRESPONDS TO 2258
+corresponds to 2259
+costa rican currency 20A1
+countable, first transfinite cardinal 2135
+COUNTERBORE 2334
+COUNTERSINK 2335
+cr 000D
+CRESCENT, STAR AND 262A
+Croatian Digraphs Matching Serbian Cyrillic Letters 01C4
+Croatian, Additions for Slovenian and 0200
+CROP, TOP LEFT 230F
+CROSS ACCENT, MODIFIER LETTER 02DF
+Cross Dingbats 2719
+CROSS OF JERUSALEM 2629
+CROSS OF LORRAINE 2628
+cross ratio 211E
+CROSS, EAST SYRIAC 2671
+CROSS, LATIN 271D
+cross, long 2020
+CROSS, MALTESE 2720
+CROSS, ORTHODOX 2626
+cross, st. andrew's 2613
+CROSS, WEST SYRIAC 2670
+CROSSBONES, SKULL AND 2620
+crosshatch 0023
+CRUZEIRO SIGN 20A2
+CUBE ROOT 221B
+cubed 00B3
+cup 222A
+CUP, SQUARE 2294
+curly bracket, closing 007D
+CURLY BRACKET, LEFT 007B
+curly bracket, opening 007B
+CURLY BRACKET, RIGHT 007D
+CURLY LOGICAL AND 22CF
+CURLY LOGICAL OR 22CE
+CURRENCY SIGN 00A4
+Currency Signs, Bengali 09F2
+CURRENCY SYMBOL BAHT, THAI 0E3F
+currency symbol, florin 0192
+Currency Symbols 20A0
+currency, brazilian 20A2
+currency, costa rican 20A1
+currency, el salvadorian 20A1
+currency, euro european 20AC
+currency, french 20A3
+currency, greek 20AF
+currency, hebrew 20AA
+currency, indian 20A8
+currency, israeli 20AA
+currency, italian 20A4
+currency, korean 20A9
+currency, laotian 20AD
+currency, mongolian 20AE
+currency, nigerian 20A6
+currency, spanish 20A7
+currency, turkish 20A4
+currency, vietnamese 20AB
+CURRENT SYMBOL FORM TWO, DIRECT 2393
+current, alternating 223F
+cycle 223C
+CYLINDRICITY 232D
+Cyrillic 0400
+Cyrillic Capital Letters 0401
+Cyrillic Combining Characters 0483
+Cyrillic Extensions 0450
+Cyrillic Historic Letters 0460
+Cyrillic Small Letters 0430
+Cyrillic, Extended 048C
+d retroflex hook, latin small letter 0256
+D WITH TAIL, LATIN SMALL LETTER 0256
+D, LATIN CAPITAL LETTER AFRICAN 0189
+DAGGER 2020
+DAGGER, DOUBLE 2021
+DALET SYMBOL 2138
+DANDA, DEVANAGARI 0964
+DANDA, DEVANAGARI DOUBLE 0965
+dash, angled 00AC
+DASH, CIRCLED 229D
+DASH, EM 2014
+DASH, EN 2013
+DASH, FIGURE 2012
+dash, long 2015
+dash, quotation 2015
+dash, swung 007E
+DASH, WAVE 301C
+DASH, WAVY 3030
+DASHED LOW LINE FE4D
+DASHED OVERLINE FE49
+Dashes 2010
+dasia 0314
+data link escape 0010
+DATA LINK ESCAPE, SYMBOL FOR 2410
+DAVID, STAR OF 2721
+Days, Telegraph Symbols for 33E0
+decimal point 002E
+decimal separator 002C
+DECIMAL SEPARATOR KEY SYMBOL 2396
+DECIMAL SEPARATOR, ARABIC 066B
+definition, equal to by 225C
+DEFINITION, EQUAL TO BY 225D
+DEGREE CELSIUS 2103
+DEGREE FAHRENHEIT 2109
+DEGREE SIGN 00B0
+degrees centigrade 2103
+degrees kelvin 212A
+del 2207
+delete 007F
+DELETE FORM TWO, SYMBOL FOR 2425
+delete to the left key 232B
+delete to the right key 2326
+DELETE, SYMBOL FOR 2421
+delete, undoable 2425
+DELTA EQUAL TO 225C
+DELTA, LATIN SMALL LETTER TURNED 018D
+DENTAL CLICK, LATIN LETTER 01C0
+depth symbol 21A7
+derivative 0307
+derivative, double 0308
+derivative, fourth 20DC
+derivative, third 20DB
+DESCENDING NODE 260B
+Description Characters, Ideographic 2FF0
+Devanagari 0900
+DEVANAGARI DANDA 0964
+Devanagari Digits 0966
+DEVANAGARI DOUBLE DANDA 0965
+Devanagari Letters 0905
+DEVANAGARI OM 0950
+device control four 0014
+DEVICE CONTROL FOUR, SYMBOL FOR 2414
+device control one 0011
+DEVICE CONTROL ONE, SYMBOL FOR 2411
+device control string 0090
+device control three 0013
+DEVICE CONTROL THREE, SYMBOL FOR 2413
+device control two 0012
+DEVICE CONTROL TWO, SYMBOL FOR 2412
+DHARMA, WHEEL OF 2638
+Diacritic-vowel Combinations, Pinyin 01CD
+Diacritical Marks for Symbols, Combining 20D0
+Diacritical Marks, Combining 0300
+Diacritics for Greek 0342
+Diacritics for IPA 0346
+Diacritics, Double 0360
+Diacritics, Enclosing 20DD
+Diacritics, Overstruck 0334
+Diacritics, Spacing Clones of 02D8
+DIAERESIS 00A8
+DIAERESIS BELOW, COMBINING 0324
+DIAERESIS, COMBINING 0308
+diaeresis, spacing 00A8
+DIAGONAL ELLIPSIS, UP RIGHT 22F0
+dialytika 0308
+DIALYTIKA TONOS, COMBINING GREEK 0344
+DIAMETER SIGN 2300
+diameter symbol 2205
+DIAMOND OPERATOR 22C4
+DIAMOND, COMBINING ENCLOSING 20DF
+Diamonds 25C6
+diesis 2021
+difference between 223C
+DIFFERENCE BETWEEN 224F
+difference, backward 2207
+difference, forward 2206
+difference, symmetric 2238
+difference, symmetric 2296
+DIFFERENTIAL, PARTIAL 2202
+DIGIT SHAPES, NATIONAL 206E
+DIGIT SHAPES, NOMINAL 206F
+Digits for Persian and Urdu, Eastern Arabic-Indic 06F0
+Digits, Arabic-Indic 0660
+Digits, ASCII 0030
+Digits, Bengali 09E6
+Digits, Devanagari 0966
+Digits, Dingbat Circled 2776
+Digits, Ethiopic 1369
+Digits, Gujarati 0AE6
+Digits, Gurmukhi 0A66
+Digits, Kannada 0CE6
+Digits, Khmer 17E0
+Digits, Lao 0ED0
+Digits, Malayalam 0D66
+Digits, Mongolian 1810
+Digits, Myanmar 1040
+Digits, Oriya 0B66
+Digits, Subscript 2080
+Digits, Superscript 2070
+Digits, Tamil 0BE7
+Digits, Telugu 0C66
+Digits, Thai 0E50
+Digits, Tibetan 0F20
+Digraphs Matching Serbian Cyrillic Letters, Croatian 01C4
+Digraphs, Phonetic 02A3
+Digraphs, Yiddish 05F0
+DIMENSION ORIGIN 2331
+Dingbat Circled Digits 2776
+Dingbats 2700
+Dingbats Series 100, ITC Zapf 2700
+Dingbats, Arrow 2794
+Dingbats, Asterisk 2722
+Dingbats, Cross 2719
+Dingbats, Drop-Shadowed 274D
+Dingbats, Hazard 2620
+Dingbats, Heart 2763
+Dingbats, Miscellaneous 2600
+Dingbats, Music 2669
+Dingbats, Pencil 270E
+Dingbats, Pointing Index Finger 261A
+Dingbats, Quotation Mark 275B
+Dingbats, Scissors 2701
+Dingbats, Snowflake 2744
+Dingbats, Star 2726
+Dingbats, Vertical Bar 2758
+Dingbats, Warning 2620
+Dingbats, Weather 2600
+Dingbats, Zapf 2700
+DIRECT CURRENT SYMBOL FORM TWO 2393
+direct product 2299
+direct sum 2295
+Directional Formatting Controls 202A
+DIRECTIONAL FORMATTING, POP 202C
+DISCONTINUOUS UNDERLINE SYMBOL 2382
+discretionary hyphen 00AD
+disjunction 2228
+DITTO MARK 3003
+DIVIDES 2223
+DIVISION SIGN 00F7
+DIVISION SLASH 2215
+DIVISION SLASH, CIRCLED 2298
+DIVISION TIMES 22C7
+does not yield 22A3
+DOLLAR SIGN 0024
+DONG SIGN 20AB
+dot 002E
+DOT ABOVE 02D9
+DOT ABOVE, COMBINING 0307
+dot above, double 0308
+DOT ABOVE, LATIN CAPITAL LETTER I WITH 0130
+DOT BELOW, COMBINING 0323
+DOT MINUS 2238
+DOT OPERATOR 22C5
+DOT OPERATOR, CIRCLED 2299
+DOT OPERATOR, SQUARED 22A1
+DOT PLUS 2214
+dot, greek middle 00B7
+DOT, KATAKANA MIDDLE 30FB
+DOT, MIDDLE 00B7
+DOTLESS I, LATIN SMALL LETTER 0131
+DOTS ABOVE, COMBINING FOUR 20DC
+DOTS ABOVE, COMBINING THREE 20DB
+DOUBLE ACUTE ACCENT 02DD
+DOUBLE ACUTE ACCENT, COMBINING 030B
+DOUBLE ANGLE BRACKET, LEFT 300A
+DOUBLE ANGLE QUOTATION MARK, LEFT-POINTING 00AB
+DOUBLE ANGLE QUOTATION MARK, RIGHT-POINTING 00BB
+DOUBLE APOSTROPHE, MODIFIER LETTER 02EE
+DOUBLE ARCH BELOW, COMBINING INVERTED 032B
+double bar, latin letter pipe 01C2
+double comma quotation mark 201D
+double comma quotation mark, low 201E
+DOUBLE DAGGER 2021
+DOUBLE DANDA, DEVANAGARI 0965
+double derivative 0308
+Double Diacritics 0360
+double dot above 0308
+DOUBLE EXCLAMATION MARK 203C
+DOUBLE GRAVE ACCENT, COMBINING 030F
+DOUBLE HIGH-REVERSED-9 QUOTATION MARK 201F
+DOUBLE INTEGRAL 222C
+DOUBLE INTERSECTION 22D2
+DOUBLE INVERTED BREVE, COMBINING 0361
+DOUBLE LOW LINE 2017
+DOUBLE LOW LINE, COMBINING 0333
+DOUBLE LOW-9 QUOTATION MARK 201E
+double obelisk 2021
+DOUBLE OVERLINE, COMBINING 033F
+double pipe 01C1
+DOUBLE PRIME 2033
+DOUBLE PRIME QUOTATION MARK 301E
+DOUBLE PRIME QUOTATION MARK, LOW 301F
+DOUBLE PRIME QUOTATION MARK, REVERSED 301D
+DOUBLE PRIME, MODIFIER LETTER 02BA
+DOUBLE PRIME, REVERSED 2036
+DOUBLE QUOTATION MARK, LEFT 201C
+DOUBLE QUOTATION MARK, RIGHT 201D
+double reversed comma quotation mark 201F
+DOUBLE RIGHTWARDS ARROW BELOW, COMBINING 0362
+DOUBLE SUBSET 22D0
+DOUBLE SUPERSET 22D1
+DOUBLE TILDE LEFT HALF, COMBINING FE22
+DOUBLE TILDE, COMBINING 0360
+double turned comma quotation mark 201C
+double underline 0333
+double underscore 0333
+double underscore, spacing 2017
+DOUBLE UNION 22D3
+DOUBLE VERTICAL LINE 2016
+DOUBLE VERTICAL LINE ABOVE, COMBINING 030E
+DOUBLE VERTICAL LINE BELOW, COMBINING 0348
+DOUBLE WAVY OVERLINE FE4C
+double-barred pipe 01C2
+DOUBLE-STRUCK CAPITAL C 2102
+DOUBLE-STRUCK CAPITAL H 210D
+DOUBLE-STRUCK CAPITAL N 2115
+DOUBLE-STRUCK CAPITAL P 2119
+DOUBLE-STRUCK CAPITAL Q 211A
+DOUBLE-STRUCK CAPITAL R 211D
+DOUBLE-STRUCK CAPITAL Z 2124
+DOWN TACK 22A4
+DOWN TACK BELOW, COMBINING 031E
+down, page 21DF
+DRACHMA SIGN 20AF
+dram 0292
+drop 264F
+Duplicates from Big 5 FA0C
+E, LATIN CAPITAL LETTER OPEN 0190
+E, LATIN CAPITAL LETTER REVERSED 018E
+e, latin capital letter turned 018E
+E, LATIN SMALL LETTER CLOSED OPEN 029A
+E, LATIN SMALL LETTER CLOSED REVERSED OPEN 025E
+E, LATIN SMALL LETTER OPEN 025B
+E, LATIN SMALL LETTER REVERSED 0258
+E, LATIN SMALL LETTER REVERSED OPEN 025C
+E, LATIN SMALL LETTER TURNED 01DD
+E, SCRIPT CAPITAL 2130
+E, SCRIPT SMALL 212F
+EARTH 2641
+Eastern Arabic-Indic Digits for Persian and Urdu 06F0
+ecu 20A0
+EIGHTH NOTE 266A
+EIGHTH NOTES, BEAMED 266B
+Eighths, Fractions 215B
+EK ONKAR, GURMUKHI 0A74
+el salvadorian currency 20A1
+ELECTRIC ARROW 2301
+electro-magnetic force, emf 2130
+electrolysis 21AF
+Electrotechnical Symbols from IR 181 238D
+ELEMENT OF 2208
+ELEMENT OF, NOT AN 2209
+ELEMENT OF, SMALL 220A
+element, unique 2129
+ELLIPSIS, HORIZONTAL 2026
+ELLIPSIS, MIDLINE HORIZONTAL 22EF
+ELLIPSIS, UP RIGHT DIAGONAL 22F0
+ELLIPSIS, VERTICAL 22EE
+elliptic function, weierstrass 2118
+EM DASH 2014
+EM QUAD 2001
+EM SPACE 2003
+EMBEDDING, LEFT-TO-RIGHT 202A
+EMBEDDING, RIGHT-TO-LEFT 202B
+emf 2130
+EMPHASIS MARK, ARMENIAN 055B
+EMPHASIS SYMBOL 2383
+EMPTY SET 2205
+EN DASH 2013
+EN QUAD 2000
+EN SPACE 2002
+Enclosed Alphanumerics 2460
+Enclosed CJK Letters and Ideographs 3200
+ENCLOSING CIRCLE BACKSLASH, COMBINING 20E0
+ENCLOSING CIRCLE, COMBINING 20DD
+Enclosing Diacritics 20DD
+ENCLOSING DIAMOND, COMBINING 20DF
+ENCLOSING KEYCAP, COMBINING 20E3
+ENCLOSING SCREEN, COMBINING 20E2
+ENCLOSING SQUARE, COMBINING 20DE
+end 21F2
+end of guarded area 0097
+end of medium 0019
+end of medium, graphic for 237F
+END OF MEDIUM, SYMBOL FOR 2419
+END OF PROOF 220E
+end of selected area 0087
+end of text 0003
+END OF TEXT, SYMBOL FOR 2403
+end of transmission 0004
+end of transmission block 0017
+END OF TRANSMISSION BLOCK, SYMBOL FOR 2417
+end of transmission, graphic for 2301
+END OF TRANSMISSION, SYMBOL FOR 2404
+ENG, LATIN SMALL LETTER 014B
+enotikon, greek 203F
+enquiry 0005
+ENQUIRY, SYMBOL FOR 2405
+enter key 2324
+ENTER SYMBOL 2386
+ENVELOPE 2709
+epsilon, latin capital letter 0190
+epsilon, latin small letter 025B
+epsilon, latin small letter closed 029A
+epsilon, latin small letter closed reversed 025E
+epsilon, reversed straight 220D
+epsilon, straight 220A
+EQUAL TO ABOVE, COMBINING ALMOST 034C
+equal to by definition 225C
+EQUAL TO BY DEFINITION 225D
+EQUAL TO, ALL 224C
+EQUAL TO, ALMOST 2248
+EQUAL TO, APPROXIMATELY 2245
+equal to, approximately 2257
+EQUAL TO, ASYMPTOTICALLY 2243
+EQUAL TO, DELTA 225C
+EQUAL TO, GEOMETRICALLY 2251
+EQUAL TO, GREATER-THAN OR 2265
+EQUAL TO, LESS-THAN OR 2264
+EQUAL TO, NOT 2260
+EQUAL TO, QUESTIONED 225F
+EQUAL TO, RING 2257
+EQUAL TO, RING IN 2256
+EQUALS COLON 2255
+EQUALS SIGN 003D
+EQUALS SIGN BELOW, COMBINING 0347
+EQUALS SIGN, SUBSCRIPT 208C
+EQUALS SIGN, SUPERSCRIPT 207C
+EQUALS, CIRCLED 229C
+EQUALS, REVERSED TILDE 22CD
+EQUALS, STAR 225B
+equiangular 225C
+EQUIANGULAR TO 225A
+EQUIVALENT TO 224D
+EQUIVALENT TO, GEOMETRICALLY 224E
+EQUIVALENT TO, STRICTLY 2263
+Era Names, Japanese 337B
+ERASE TO THE LEFT 232B
+ERASE TO THE RIGHT 2326
+error 212F
+escape 001B
+escape, data link 0010
+ESCAPE, SYMBOL FOR 241B
+ESCAPE, SYMBOL FOR DATA LINK 2410
+escudo 0024
+ESH LOOP, LATIN LETTER REVERSED 01AA
+ESH, LATIN CAPITAL LETTER 01A9
+ESH, LATIN SMALL LETTER 0283
+ESH, LATIN SMALL LETTER SQUAT REVERSED 0285
+ESTIMATED SYMBOL 212E
+ESTIMATES 2259
+eszett 00DF
+ET, TIRONIAN SIGN 204A
+ETH, LATIN SMALL LETTER 00F0
+ethel 0153
+Ethiopic 1200
+ETHIOPIC COLON 1365
+ETHIOPIC COMMA 1363
+Ethiopic Digits 1369
+ETHIOPIC FULL STOP 1362
+ETHIOPIC QUESTION MARK 1367
+ETHIOPIC SEMICOLON 1364
+ETHIOPIC WORDSPACE 1361
+EULER CONSTANT 2107
+EURO SIGN 20AC
+European Latin 0100
+european paragraph sign 00A7
+european section sign 00B6
+EXCESS 2239
+EXCLAMATION MARK 0021
+EXCLAMATION MARK ORNAMENT, HEAVY 2762
+EXCLAMATION MARK, ARMENIAN 055C
+EXCLAMATION MARK, DOUBLE 203C
+EXCLAMATION MARK, INVERTED 00A1
+exclamation mark, latin letter 01C3
+EXCLAMATION MARK, QUESTION 2048
+EXCLAMATION QUESTION MARK 2049
+EXISTS, THERE 2203
+Extended Additional, Latin 1E00
+Extended Arabic 0671
+Extended Cyrillic 048C
+Extended for Minnan and Hakka, Chinese Bopomofo 31A0
+Extended Greek 1F00
+Extended-A, Latin 0100
+Extended-B, Latin 0180
+Extension A, CJK Unified Ideographs 3400
+Extensions for Sanskrit and Tibetan, Mongolian 1880
+Extensions for Vietnamese, Latin 1EA0
+Extensions, Cyrillic 0450
+Extensions, IPA 0250
+EZH REVERSED, LATIN SMALL LETTER 01B9
+EZH, LATIN CAPITAL LETTER 01B7
+EZH, LATIN SMALL LETTER 0292
+F WITH HOOK, LATIN SMALL LETTER 0192
+F, SCRIPT CAPITAL 2131
+F, TURNED CAPITAL 2132
+FACE, BLACK SMILING 263B
+FACE, POSTAL MARK 3020
+FACE, WHITE FROWNING 2639
+FACE, WHITE SMILING 263A
+factorial 0021
+FAHRENHEIT, DEGREE 2109
+feet 2032
+FEMALE SIGN 2640
+FEMININE ORDINAL INDICATOR 00AA
+Fifths, Fractions 2155
+FIGURE DASH 2012
+FIGURE SPACE 2007
+file separator 001C
+FILE SEPARATOR, SYMBOL FOR 241C
+Finger Dingbats, Pointing Index 261A
+FIRST QUARTER MOON 263D
+first transfinite cardinal (countable) 2135
+FISHEYE 25C9
+fist 261E
+FIVE POINTED STAR, ARABIC 066D
+FIVE, LATIN SMALL LETTER TONE 01BD
+FLAT SIGN, MUSIC 266D
+FLOOR, LEFT 230A
+FLORAL HEART BULLET, REVERSED ROTATED 2619
+florin currency symbol 0192
+folder 0192
+FOR ALL 2200
+FORCES 22A9
+Form and Chart Components 2500
+form feed 000C
+form feed 21A1
+FORM FEED, SYMBOL FOR 240C
+Format Control, Syriac 070F
+Format Controls, Mongolian 180B
+Formatting Characters 200C
+Formatting Characters 2028
+Formatting Controls, Bidirectional 202A
+FORMATTING, POP DIRECTIONAL 202C
+forward difference 2206
+FOUR DOTS ABOVE, COMBINING 20DC
+FOUR-PER-EM SPACE 2005
+fourier transform 2131
+fourth derivative 20DC
+FOURTH ROOT 221C
+fourth transfinite cardinal 2138
+Fourths, Fractions 00BC
+FRACTION NUMERATOR ONE 215F
+FRACTION ONE HALF, VULGAR 00BD
+FRACTION ONE QUARTER, VULGAR 00BC
+FRACTION SLASH 2044
+FRACTION THREE QUARTERS, VULGAR 00BE
+Fractions 2153
+FRANC SIGN, FRENCH 20A3
+FRICATIVE, LATIN LETTER PHARYNGEAL VOICED 0295
+FROWN 2322
+FROWNING FACE, WHITE 2639
+FULL BLOCK 2588
+FULL STOP 002E
+FULL STOP, ARABIC 06D4
+FULL STOP, ARMENIAN 0589
+FULL STOP, ETHIOPIC 1362
+full stop, georgian 0589
+FULL STOP, IDEOGRAPHIC 3002
+FULL STOP, MONGOLIAN 1803
+Fullwidth ASCII Variants FF01
+Fullwidth Forms, Halfwidth and FF00
+Fullwidth Symbol Variants FFE0
+function symbol 0192
+function, gamma 0393
+G, LATIN LETTER SMALL CAPITAL 0262
+G, LATIN SMALL LETTER SCRIPT 0261
+G, SCRIPT SMALL 210A
+gamma function 0393
+GAMMA, LATIN CAPITAL LETTER 0194
+GAMMA, LATIN SMALL LETTER 0263
+gamma, latin small letter baby 0264
+GAMMA, MODIFIER LETTER SMALL 02E0
+GB 2312 (Chinese), Based on 3100
+GEMINI 264A
+General Punctuation 2000
+General Scripts Area 0000
+GEOMETRIC PROPORTION 223A
+Geometric Shapes 25A0
+GEOMETRICALLY EQUAL TO 2251
+GEOMETRICALLY EQUIVALENT TO 224E
+Georgian 10A0
+Georgian Capital Letters 10A0
+georgian comma 00B7
+georgian full stop 0589
+GEORGIAN PARAGRAPH SEPARATOR 10FB
+Georgian Small Letters 10D0
+german mark 2133
+GETA MARK 3013
+GIMEL SYMBOL 2137
+glottal stop 02BC
+GLOTTAL STOP, LATIN LETTER 0294
+GLOTTAL STOP, LATIN LETTER INVERTED 0296
+glottal stop, latin letter reversed 0295
+GLOTTAL STOP, MODIFIER LETTER 02C0
+GLOTTAL STOP, MODIFIER LETTER REVERSED 02C1
+GLOTTAL STOP, MODIFIER LETTER SMALL REVERSED 02E4
+Golden Number Runes 16EE
+Graphic Pictures for Control Codes 2400
+Graphics for Control Codes 237B
+Graphics, Control Code 25F0
+GRAVE ACCENT 0060
+GRAVE ACCENT BELOW, COMBINING 0316
+GRAVE ACCENT, COMBINING 0300
+GRAVE ACCENT, COMBINING DOUBLE 030F
+GRAVE ACCENT, DEVANAGARI 0953
+GRAVE ACCENT, MODIFIER LETTER 02CB
+GRAVE ACCENT, MODIFIER LETTER LOW 02CE
+grave accent, swedish 02DF
+GRAVE TONE MARK, COMBINING 0340
+grave, spacing 0060
+GREATER-THAN OR EQUAL TO 2265
+GREATER-THAN SIGN 003E
+GREATER-THAN, MUCH 226B
+GREATER-THAN, VERY MUCH 22D9
+Greek and Coptic 0370
+Greek Capital Letters 0391
+greek currency 20AF
+GREEK DIALYTIKA TONOS, COMBINING 0344
+greek enotikon 203F
+GREEK KORONIS, COMBINING 0343
+greek middle dot 00B7
+greek non-spacing iota below 0345
+GREEK PERISPOMENI, COMBINING 0342
+GREEK QUESTION MARK 037E
+GREEK SMALL LETTER IOTA, TURNED 2129
+Greek Small Letters 03B1
+Greek Symbols 03D0
+GREEK YPOGEGRAMMENI, COMBINING 0345
+Greek, Diacritics for 0342
+Greek, Extended 1F00
+group lock 21F0
+group separator 001D
+GROUP SEPARATOR, SYMBOL FOR 241D
+guarded area, end of 0097
+guarded area, start of 0096
+guillemet, left pointing 00AB
+guillemet, left pointing single 2039
+guillemet, right pointing 00BB
+guillemet, right pointing single 203A
+Gujarati 0A80
+Gujarati Digits 0AE6
+Gujarati Letters 0A85
+Gurmukhi 0A00
+Gurmukhi Digits 0A66
+Gurmukhi Letters 0A05
+H, BLACK-LETTER CAPITAL 210C
+H, DOUBLE-STRUCK CAPITAL 210D
+H, LATIN LETTER SMALL CAPITAL 029C
+H, LATIN SMALL LETTER TURNED 0265
+H, MODIFIER LETTER SMALL 02B0
+H, SCRIPT CAPITAL 210B
+hacek, combining 030C
+hacek, modifier letter 02C7
+HAIR SPACE 200A
+Hakka, Chinese Bopomofo Extended for Minnan and 31A0
+halant, bengali 09CD
+halant, devanagari 094D
+HALF FILL SPACE, IDEOGRAPHIC 303F
+HALF INTEGRAL, TOP 2320
+Half Marks, Combining FE20
+HALF RING BELOW, COMBINING LEFT 031C
+HALF RING BELOW, COMBINING RIGHT 0339
+HALF RING, MODIFIER LETTER CENTRED LEFT 02D3
+HALF RING, MODIFIER LETTER LEFT 02BF
+HALF TRIANGULAR COLON, MODIFIER LETTER 02D1
+HALF, COMBINING DOUBLE TILDE LEFT FE22
+HALF, COMBINING LIGATURE LEFT FE20
+HALF, VULGAR FRACTION ONE 00BD
+Halfwidth and Fullwidth Forms FF00
+Halfwidth Japanese Katakana Variants FF61
+Halfwidth Korean Hangul Variants FFA0
+hamiltonian function 210B
+HAMMER AND SICKLE 262D
+Han Ideographs 4E00
+Hand Symbols, Pointing 261A
+HAND, VICTORY 270C
+HAND, WRITING 270D
+HANGUL CHOSEONG FILLER 115F
+Hangul Compatibility Jamo, Korean 3130
+Hangul Elements, Circled Korean 3260
+Hangul Elements, Parenthesized Korean 3200
+HANGUL FILLER 3164
+Hangul Jamo Combining Alphabet, Korean 1100
+HANGUL JUNGSEONG FILLER 1160
+Hangul Syllables Area, Korean AC00
+Hangul Syllables, Circled Korean 326E
+Hangul Syllables, Parenthesized Korean 320E
+Hangul Variants, Halfwidth Korean FFA0
+Hangul, Based on KS C 5601 (Korean) 3130
+Hangzhou-style Numerals 3021
+HARPOON ABOVE, COMBINING LEFT 20D0
+hash 0023
+hat 0302
+hat 2229
+have a nice day! 263A
+Hazard Dingbats 2620
+heading, start of 0001
+HEADING, SYMBOL FOR START OF 2401
+Heart Ornaments 2763
+HEAVY BALLOT X 2718
+HEAVY CHECK MARK 2714
+HEAVY MULTIPLICATION X 2716
+Hebrew 0590
+Hebrew Cantillation Marks 0591
+hebrew currency 20AA
+Hebrew Letters 05D0
+Hebrew Points 05B0
+Hebrew Presentation Forms FB1D
+HELM SYMBOL 2388
+HERMITIAN CONJUGATE MATRIX 22B9
+High Surrogates D800
+HIGH-REVERSED-9 QUOTATION MARK, DOUBLE 201F
+HIGH-REVERSED-9 QUOTATION MARK, SINGLE 201B
+higher rank than 227B
+hilbert space 210C
+HIRAGANA ITERATION MARK 309D
+Hiragana, Based on JIS X 0208 (Japanese) 3040
+histogram marker 25AE
+Historic Letters, Cyrillic 0460
+home 21B8
+home 21F1
+HOMOTHETIC 223B
+HOMOTHETIC ABOVE, COMBINING 034B
+HOOK ABOVE, COMBINING 0309
+HOOK BELOW, COMBINING PALATALIZED 0321
+HOOK BELOW, COMBINING RETROFLEX 0322
+HOOK, MODIFIER LETTER RHOTIC 02DE
+hook, nasal 0328
+HORIZONTAL BAR 2015
+HORIZONTAL ELLIPSIS 2026
+HORIZONTAL ELLIPSIS, MIDLINE 22EF
+horizontal tabulation 0009
+HORIZONTAL TABULATION, SYMBOL FOR 2409
+HORN, COMBINING 031B
+HORN, LATIN SMALL LETTER RAMS 0264
+HOT SPRINGS 2668
+HOURGLASS 231B
+Hours, Telegraph Symbols for 3358
+HOUSE 2302
+HV, LATIN SMALL LETTER 0195
+HWAIR, LATIN CAPITAL LETTER 01F6
+HYPHEN 2010
+HYPHEN BULLET 2043
+hyphen or minus sign 002D
+HYPHEN, ARMENIAN 058A
+hyphen, discretionary 00AD
+HYPHEN, NON-BREAKING 2011
+HYPHEN, SOFT 00AD
+HYPHEN-MINUS 002D
+HYPHENATION POINT 2027
+hyphus 002D
+HYSTERESIS SYMBOL 238E
+I WITH DOT ABOVE, LATIN CAPITAL LETTER 0130
+I, BLACK-LETTER CAPITAL 2111
+I, LATIN LETTER SMALL CAPITAL 026A
+I, LATIN SMALL LETTER DOTLESS 0131
+I, SCRIPT CAPITAL 2110
+IBM CJK Compatibility Ideographs FA0E
+IDENTICAL TO 2261
+Ideographic Annotation, Japanese Kanbun 3190
+IDEOGRAPHIC CLOSING MARK 3006
+IDEOGRAPHIC COMMA 3001
+Ideographic Description Characters 2FF0
+IDEOGRAPHIC FULL STOP 3002
+IDEOGRAPHIC HALF FILL SPACE 303F
+IDEOGRAPHIC ITERATION MARK 3005
+IDEOGRAPHIC NUMBER ZERO 3007
+IDEOGRAPHIC SPACE 3000
+Ideographic Tone Marks 302A
+Ideographs Area, CJK 3400
+Ideographs Extension A, CJK Unified 3400
+Ideographs, Circled 3280
+Ideographs, CJK Compatibility F900
+Ideographs, CJK Unified 4E00
+Ideographs, Enclosed CJK Letters and 3200
+Ideographs, Han 4E00
+Ideographs, IBM CJK Compatibility FA0E
+Ideographs, Parenthesized 3220
+IDLE, SYMBOL FOR SYNCHRONOUS 2416
+idle, synchronous 0016
+IJ, LATIN SMALL LIGATURE 0133
+IMAGE OF 22B7
+IMAGE OF, SQUARE 228F
+imaginary part 2111
+implies 22A2
+inches 2033
+included in set 2282
+includes in set 2283
+incorporated, japanese 337F
+INCREMENT 2206
+index 0084
+Index Finger Dingbats, Pointing 261A
+indian currency 20A8
+inferior order to, of 2134
+INFINITY 221E
+INFORMATION SOURCE 2139
+INHIBIT ARABIC FORM SHAPING 206C
+INHIBIT SYMMETRIC SWAPPING 206A
+INSERTION POINT, CARET 2041
+INSERTION SYMBOL 2380
+integers, the set of 2124
+INTEGRAL 222B
+INTEGRAL, CLOCKWISE 2231
+INTEGRAL, CLOCKWISE CONTOUR 2232
+INTEGRAL, CONTOUR 222E
+INTEGRAL, DOUBLE 222C
+integral, riemann 211B
+INTEGRAL, SURFACE 222F
+INTEGRAL, TOP HALF 2320
+INTEGRAL, TRIPLE 222D
+INTEGRAL, VOLUME 2230
+INTERCALATE 22BA
+Interlinear Annotation FFF9
+International Phonetic Alphabet 0250
+INTERROBANG 203D
+INTERSECTION 2229
+INTERSECTION, DOUBLE 22D2
+INTERSECTION, N-ARY 22C2
+intersection, proper 22D4
+introducer, control sequence 009B
+introducer, single character 009A
+Inverse Numbers, Circled 2776
+INVERTED BREVE BELOW, COMBINING 032F
+INVERTED BREVE, COMBINING 0311
+INVERTED BREVE, COMBINING DOUBLE 0361
+INVERTED BRIDGE BELOW, COMBINING 033A
+INVERTED DOUBLE ARCH BELOW, COMBINING 032B
+INVERTED EXCLAMATION MARK 00A1
+INVERTED GLOTTAL STOP, LATIN LETTER 0296
+INVERTED LAZY S 223E
+INVERTED OHM SIGN 2127
+INVERTED QUESTION MARK 00BF
+INVERTED R, LATIN LETTER SMALL CAPITAL 0281
+INVERTED R, MODIFIER LETTER SMALL CAPITAL 02B6
+iota below, greek non-spacing 0345
+IOTA, LATIN CAPITAL LETTER 0196
+IOTA, LATIN SMALL LETTER 0269
+IOTA, TURNED GREEK SMALL LETTER 2129
+IPA Extensions 0250
+IPA, Diacritics for 0346
+IR 181, Electrotechnical Symbols from 238D
+iran, symbol of 262B
+irish punt 00A3
+ISCII 1988 (Devanagari), Based on 0901
+ISO 8859-1 (Latin-1), Based on 00A0
+ISO 8859-2, -3, -4, -9 (European Latin), Based on 0100
+ISO 8859-5 (Cyrillic), Based on 0400
+ISO 8859-6 (Arabic), Based on 0600
+ISO 8859-7 (Greek), Based on 0370
+ISO 8859-8 (Hebrew), Based on 05D0
+ISO 9995-7, Keyboard Symbols from 2380
+ISO 9995-7, Keyboard Symbols from 2396
+israeli currency 20AA
+italian currency 20A4
+ITC Zapf Dingbats Series 100 2700
+ITERATION MARK, HIRAGANA 309D
+ITERATION MARK, IDEOGRAPHIC 3005
+ITERATION MARK, KATAKANA 30FD
+ivy leaf 2767
+J, MODIFIER LETTER SMALL 02B2
+jack 2749
+Jamo Combining Alphabet, Korean Hangul 1100
+Jamo, Korean Hangul Compatibility 3130
+Japanese Era Names 337B
+Japanese Hiragana 3040
+japanese incorporated 337F
+JAPANESE INDUSTRIAL STANDARD SYMBOL 3004
+Japanese Kanbun (Ideographic Annotation) 3190
+Japanese Katakana 30A0
+Japanese Katakana Variants, Halfwidth FF61
+Japanese Katakana Words, Squared 3300
+Japanese Katakana, Circled 32D0
+japanese kome 203B
+JERUSALEM, CROSS OF 2629
+jis composition circle 20DD
+JIS X 0208, Based on 3040
+JOINER, ZERO WIDTH 200D
+jot, apl 2218
+JUPITER 2643
+justification, character tabulation with 0089
+K, LATIN SMALL LETTER TURNED 029E
+kabusiki-gaisya 337F
+Kana Repeat Marks 3031
+Kanbun (Ideographic Annotation), Japanese 3190
+Kangxi Radicals 2F00
+Kannada 0C80
+Kannada Digits 0CE6
+Kannada Letters 0C85
+KATAKANA ITERATION MARK 30FD
+KATAKANA MIDDLE DOT 30FB
+Katakana Variants, Halfwidth Japanese FF61
+Katakana Words, Squared Japanese 3300
+Katakana, Circled Japanese 32D0
+Katakana, Japanese 30A0
+KATAKANA-HIRAGANA PROLONGED SOUND MARK 30FC
+KATAKANA-HIRAGANA VOICED SOUND MARK 309B
+KATAKANA-HIRAGANA VOICED SOUND MARK, COMBINING 3099
+KELVIN SIGN 212A
+ket 232A
+KEY SYMBOL, ALTERNATIVE 2387
+KEY SYMBOL, DECIMAL SEPARATOR 2396
+key, clear 2327
+key, command 2318
+key, delete to the left 232B
+key, delete to the right 2326
+key, enter 2324
+KEY, OPTION 2325
+KEYBOARD 2328
+Keyboard Symbols from ISO 9995-7 2380
+Keyboard Symbols from ISO 9995-7 2396
+KEYCAP, COMBINING ENCLOSING 20E3
+Khmer 1780
+Khmer Digits 17E0
+KIP SIGN 20AD
+kome, japanese 203B
+Koranic Annotation Signs 06D6
+korean currency 20A9
+Korean Hangul Compatibility Jamo 3130
+Korean Hangul Elements, Circled 3260
+Korean Hangul Elements, Parenthesized 3200
+Korean Hangul Jamo Combining Alphabet 1100
+Korean Hangul Syllables Area AC00
+Korean Hangul Syllables, Circled 326E
+Korean Hangul Syllables, Parenthesized 320E
+Korean Hangul Variants, Halfwidth FFA0
+KOREAN STANDARD SYMBOL 327F
+KORONIS, COMBINING GREEK 0343
+KRA, LATIN SMALL LETTER 0138
+KS C 5601 (Korean Hangul), Based on 3130
+L B BAR SYMBOL 2114
+L WITH MIDDLE DOT, LATIN SMALL LETTER 0140
+L WITH MIDDLE TILDE, LATIN SMALL LETTER 026B
+L, LATIN LETTER SMALL CAPITAL 029F
+L, MODIFIER LETTER SMALL 02E1
+L, SCRIPT CAPITAL 2112
+L, SCRIPT SMALL 2113
+lambda bar, latin letter 019B
+Lao 0E80
+Lao Digits 0ED0
+Lao Letters 0E81
+laotian currency 20AD
+laplace operator 2206
+laplace operator 2207
+laplace symbol 2112
+LAST QUARTER MOON 263E
+LATERAL CLICK, LATIN LETTER 01C1
+Latin Abbreviations, Squared 3371
+Latin Capital Letters 0041
+LATIN CROSS 271D
+Latin Extended Additional 1E00
+Latin Extended-A 0100
+Latin Extended-B 0180
+Latin Extensions for Vietnamese 1EA0
+Latin Letters, Circled 24B6
+Latin Letters, Parenthesized 249C
+Latin Letters, Phonetic Modifiers Derived from 02B0
+Latin Ligatures FB00
+Latin Small Letters 0061
+Latin, Based on ISO 8859-2, -3, -4, -9 (European) 0100
+Latin, C0 Controls and Basic 0000
+Latin, European 0100
+Latin-1 Supplement, C1 Controls and 0080
+Latin-1, ISO 8859-1 aka 00A0
+lazy s 223D
+LAZY S, INVERTED 223E
+LEADER, ONE DOT 2024
+leader, three dot 2026
+LEADER, TWO DOT 2025
+leaf, aldus 2766
+leaf, ivy 2767
+LEFT ANGLE ABOVE, COMBINING 031A
+LEFT ANGLE BELOW, COMBINING 0349
+LEFT ANGLE BRACKET 3008
+LEFT ARROW ABOVE, COMBINING 20D6
+LEFT BLACK LENTICULAR BRACKET 3010
+LEFT CEILING 2308
+LEFT CORNER BRACKET 300C
+LEFT CORNER, TOP 231C
+LEFT CROP, TOP 230F
+LEFT CURLY BRACKET 007B
+LEFT DOUBLE ANGLE BRACKET 300A
+LEFT DOUBLE QUOTATION MARK 201C
+LEFT FLOOR 230A
+LEFT HALF RING BELOW, COMBINING 031C
+LEFT HALF RING, MODIFIER LETTER 02BF
+LEFT HALF RING, MODIFIER LETTER CENTRED 02D3
+LEFT HALF, COMBINING DOUBLE TILDE FE22
+LEFT HALF, COMBINING LIGATURE FE20
+LEFT HARPOON ABOVE, COMBINING 20D0
+left key, delete to the 232B
+LEFT PARENTHESIS 0028
+LEFT PARENTHESIS, ORNATE FD3E
+LEFT PARENTHESIS, SUBSCRIPT 208D
+LEFT PARENTHESIS, SUPERSCRIPT 207D
+left pointing guillemet 00AB
+LEFT POINTING INDEX, BLACK 261A
+left pointing single guillemet 2039
+LEFT RIGHT ARROW ABOVE, COMBINING 20E1
+LEFT RIGHT ARROW BELOW, COMBINING 034D
+LEFT SEMIDIRECT PRODUCT 22CB
+LEFT SINGLE QUOTATION MARK 2018
+LEFT SQUARE BRACKET 005B
+LEFT SQUARE BRACKET WITH QUILL 2045
+LEFT TACK 22A3
+LEFT TACK BELOW, COMBINING 0318
+LEFT TORTOISE SHELL BRACKET 3014
+LEFT WHITE CORNER BRACKET 300E
+LEFT WHITE LENTICULAR BRACKET 3016
+LEFT WHITE SQUARE BRACKET 301A
+LEFT WHITE TORTOISE SHELL BRACKET 3018
+LEFT-POINTING ANGLE BRACKET 2329
+LEFT-POINTING ANGLE QUOTATION MARK, SINGLE 2039
+LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 00AB
+LEFT-TO-RIGHT EMBEDDING 202A
+LEFT-TO-RIGHT MARK 200E
+LEFT-TO-RIGHT OVERRIDE 202D
+leftward tab 21E4
+LEFTWARDS BULLET, BLACK 204C
+LENTICULAR BRACKET, LEFT BLACK 3010
+LENTICULAR BRACKET, LEFT WHITE 3016
+LEO 264C
+LESS-THAN OR EQUAL TO 2264
+LESS-THAN SIGN 003C
+LESS-THAN, MUCH 226A
+LESS-THAN, VERY MUCH 22D8
+Letterlike Symbols 2100
+level 2 lock 21EB
+level 3 lock 21EF
+level 3 select 21EE
+LEZH, LATIN SMALL LETTER 026E
+lf 000A
+LIBRA 264E
+ligature ae, latin small 00E6
+LIGATURE IJ, LATIN SMALL 0133
+LIGATURE LEFT HALF, COMBINING FE20
+LIGATURE OE, LATIN SMALL 0153
+Ligatures, Armenian FB13
+Ligatures, Latin FB00
+LIGHTNING 2607
+LIMIT, APPROACHES THE 2250
+LINE ABOVE, COMBINING DOUBLE VERTICAL 030E
+LINE ABOVE, COMBINING VERTICAL 030D
+LINE BELOW, COMBINING DOUBLE VERTICAL 0348
+LINE BELOW, COMBINING VERTICAL 0329
+line down, partial 008B
+line feed 000A
+line feed 21B4
+line feed, reverse 008D
+LINE FEED, SYMBOL FOR 240A
+line marker 2319
+LINE OVERLAY, COMBINING LONG VERTICAL 20D2
+LINE OVERLAY, COMBINING SHORT VERTICAL 20D3
+LINE SEPARATOR 2028
+LINE SYMBOL, CENTRE 2104
+line tabulation set 008A
+line up, partial 008C
+LINE WITH MIDDLE DOT, VERTICAL 237F
+line, beginning of 2310
+LINE, CENTRELINE LOW FE4E
+LINE, COMBINING DOUBLE LOW 0333
+LINE, COMBINING LOW 0332
+LINE, DASHED LOW FE4D
+LINE, DOUBLE LOW 2017
+LINE, DOUBLE VERTICAL 2016
+LINE, LOW 005F
+LINE, MODIFIER LETTER LOW VERTICAL 02CC
+LINE, MODIFIER LETTER VERTICAL 02C8
+line, new 21B5
+line, next 0085
+LINE, VERTICAL 007C
+LINE, WAVY 2307
+LINE, WAVY LOW FE4F
+LIRA SIGN 20A4
+liter 2113
+Livonian, Additions for 022A
+LOCATION SIGN, TELEPHONE 2706
+lock, caps 21EA
+lock, caps 21EC
+lock, group 21F0
+lock, level 2 21EB
+lock, level 3 21EF
+lock, numerics 21ED
+LOGICAL AND 2227
+LOGICAL AND, CURLY 22CF
+LOGICAL AND, N-ARY 22C0
+LOGICAL OR 2228
+LOGICAL OR, CURLY 22CE
+LOGICAL OR, N-ARY 22C1
+long 0304
+long cross 2020
+long dash 2015
+LONG S, LATIN SMALL LETTER 017F
+long slash overlay 0338
+LONG SOLIDUS OVERLAY, COMBINING 0338
+LONG STROKE OVERLAY, COMBINING 0336
+LONG VERTICAL LINE OVERLAY, COMBINING 20D2
+LORRAINE, CROSS OF 2628
+LOW ACUTE ACCENT, MODIFIER LETTER 02CF
+low double comma quotation mark 201E
+LOW DOUBLE PRIME QUOTATION MARK 301F
+LOW GRAVE ACCENT, MODIFIER LETTER 02CE
+LOW LINE 005F
+LOW LINE, CENTRELINE FE4E
+LOW LINE, COMBINING 0332
+LOW LINE, COMBINING DOUBLE 0333
+LOW LINE, DASHED FE4D
+LOW LINE, DOUBLE 2017
+LOW LINE, WAVY FE4F
+LOW MACRON, MODIFIER LETTER 02CD
+low single comma quotation mark 201A
+Low Surrogates DC00
+LOW VERTICAL LINE, MODIFIER LETTER 02CC
+LOW-9 QUOTATION MARK, DOUBLE 201E
+LOW-9 QUOTATION MARK, SINGLE 201A
+lower rank than 227A
+LOZENGE 25CA
+LOZENGE, SQUARE 2311
+lre 202A
+lrm 200E
+lro 202D
+M, LATIN CAPITAL LETTER TURNED 019C
+M, LATIN SMALL LETTER TURNED 026F
+M, SCRIPT CAPITAL 2133
+m-matrix 2133
+MACRON 00AF
+MACRON BELOW, COMBINING 0331
+MACRON, COMBINING 0304
+MACRON, MODIFIER LETTER 02C9
+MACRON, MODIFIER LETTER LOW 02CD
+macron, spacing 00AF
+Malayalam 0D00
+Malayalam Digits 0D66
+Malayalam Letters 0D05
+MALE SIGN 2642
+MALTESE CROSS 2720
+Manchu Letters, Mongolian 1873
+mark, german 2133
+marker, histogram 25AE
+mars 2642
+MASCULINE ORDINAL INDICATOR 00BA
+Mathematical Operators 2200
+MATRIX, HERMITIAN CONJUGATE 22B9
+MEASURED ANGLE 2221
+MEASURED BY 225E
+medium, end of 0019
+MEDIUM, SYMBOL FOR END OF 2419
+MEMBER, CONTAINS AS 220B
+MEMBER, SMALL CONTAINS AS 220D
+MERCURY 263F
+message waiting 0095
+message, privacy 009E
+mho 2127
+MICRO SIGN 00B5
+mid space 2005
+MIDDLE DOT 00B7
+middle dot, greek 00B7
+MIDDLE DOT, KATAKANA 30FB
+MIDDLE DOT, LATIN SMALL LETTER L WITH 0140
+MIDDLE DOT, VERTICAL LINE WITH 237F
+MIDDLE TILDE, LATIN CAPITAL LETTER O WITH 019F
+MIDDLE TILDE, LATIN SMALL LETTER L WITH 026B
+MIDLINE HORIZONTAL ELLIPSIS 22EF
+midpoint 00B7
+MILL SIGN 20A5
+MILLE SIGN, PER 2030
+milreis 0024
+minim 264F
+minim (alternate glyph) 264D
+Minnan and Hakka, Chinese Bopomofo Extended for 31A0
+MINUS SIGN 2212
+MINUS SIGN BELOW, COMBINING 0320
+minus sign, hyphen or 002D
+MINUS SIGN, MODIFIER LETTER 02D7
+MINUS TILDE 2242
+MINUS, CIRCLED 2296
+MINUS, DOT 2238
+MINUS, SET 2216
+MINUS, SQUARED 229F
+MINUS, SUBSCRIPT 208B
+MINUS, SUPERSCRIPT 207B
+MINUS-OR-PLUS SIGN 2213
+minutes 2032
+Miscellaneous Symbols 2600
+Miscellaneous Technical 2300
+MODELS 22A7
+Modifier Letters, Spacing 02B0
+Mongolian 1800
+MONGOLIAN COLON 1804
+MONGOLIAN COMMA 1802
+mongolian currency 20AE
+Mongolian Digits 1810
+Mongolian Extensions for Sanskrit and Tibetan 1880
+Mongolian Format Controls 180B
+MONGOLIAN FULL STOP 1803
+Mongolian Manchu Letters 1873
+Mongolian Sibe Letters 185D
+Mongolian Todo Letters 1843
+MONOSTABLE SYMBOL 238D
+Months, Enclosed CJK Letters and 3200
+Months, Telegraph Symbols for 32C0
+MOON, FIRST QUARTER 263D
+MOON, LAST QUARTER 263E
+most positive 223E
+MUCH GREATER-THAN 226B
+MUCH GREATER-THAN, VERY 22D9
+MUCH LESS-THAN 226A
+MUCH LESS-THAN, VERY 22D8
+MULTIMAP 22B8
+MULTIPLICATION SIGN 00D7
+MULTIPLICATION X 2715
+MULTIPLICATION X, HEAVY 2716
+MULTIPLICATION, MULTISET 228D
+MULTISET 228C
+MULTISET MULTIPLICATION 228D
+MULTISET UNION 228E
+MUSIC FLAT SIGN 266D
+MUSIC NATURAL SIGN 266E
+MUSIC SHARP SIGN 266F
+Musical Symbols 2669
+mutton 2003
+mutton quad 2001
+Myanmar 1000
+Myanmar Digits 1040
+N, DOUBLE-STRUCK CAPITAL 2115
+N, LATIN LETTER SMALL CAPITAL 0274
+N-ARY COPRODUCT 2210
+N-ARY INTERSECTION 22C2
+N-ARY LOGICAL AND 22C0
+N-ARY LOGICAL OR 22C1
+N-ARY PRODUCT 220F
+N-ARY SUMMATION 2211
+N-ARY UNION 22C3
+NABLA 2207
+NAIRA SIGN 20A6
+NAND 22BC
+nang 0323
+NARROW NO-BREAK SPACE 202F
+nasal hook 0328
+NATIONAL DIGIT SHAPES 206E
+natural number 2115
+NATURAL SIGN, MUSIC 266E
+negation 20D3
+negative acknowledge 0015
+negative acknowledge, graphic for 237B
+NEGATIVE ACKNOWLEDGE, SYMBOL FOR 2415
+NEPTUNE 2646
+new line 21B5
+NEW SHEQEL SIGN 20AA
+NEWLINE, SYMBOL FOR 2424
+next line 0085
+NEXT PAGE 2398
+NIB, BLACK 2712
+nigerian currency 20A6
+no break here 0083
+no break space, graphic for 237D
+NO-BREAK SPACE 00A0
+NO-BREAK SPACE, NARROW 202F
+NO-BREAK SPACE, ZERO WIDTH FEFF
+NODE, ASCENDING 260A
+NODE, DESCENDING 260B
+NOMINAL DIGIT SHAPES 206F
+NON-BREAKING HYPHEN 2011
+non-breaking space 00A0
+NON-JOINER, ZERO WIDTH 200C
+non-theorem 22A3
+NOR 22BD
+NORMAL SUBGROUP OF 22B2
+NORMAL SUBGROUP, CONTAINS AS 22B3
+not 223C
+Not a Character FFFE
+Not a Character FFFF
+NOT AN ELEMENT OF 2209
+NOT CHECK MARK 237B
+NOT EQUAL TO 2260
+NOT SIGN 00AC
+NOT SIGN, REVERSED 2310
+NOT SIGN, TURNED 2319
+NOT TILDE ABOVE, COMBINING 034A
+not yield, does 22A3
+NOTE, EIGHTH 266A
+NOTE, QUARTER 2669
+NOTES, BEAMED EIGHTH 266B
+NOTES, BEAMED SIXTEENTH 266C
+null 0000
+null set 2205
+NULL, SYMBOL FOR 2400
+Number Forms 2150
+Number Runes, Golden 16EE
+NUMBER SIGN 0023
+number symbol, real 210A
+NUMBER ZERO, IDEOGRAPHIC 3007
+number, natural 2115
+Numbers Period 2488
+Numbers, Circled 2460
+Numbers, Circled Inverse 2776
+Numbers, Parenthesized 2474
+numbers, the set of complex 2102
+numbers, the set of rational 211A
+numbers, the set of real 211D
+Numerals, Hangzhou-style 3021
+Numerals, Roman 2160
+NUMERATOR ONE, FRACTION 215F
+numerics lock 21ED
+NUMERO SIGN 2116
+nut 2002
+o bar 019F
+o bar 0275
+o e, latin small letter 0153
+O WITH MIDDLE TILDE, LATIN CAPITAL LETTER 019F
+o, latin capital letter barred 019F
+O, LATIN CAPITAL LETTER OPEN 0186
+O, LATIN SMALL LETTER BARRED 0275
+O, LATIN SMALL LETTER OPEN 0254
+O, SCRIPT SMALL 2134
+obelisk 2020
+obelisk, double 2021
+OBJECT REPLACEMENT CHARACTER FFFC
+OCR, Optical Character Recognition 2440
+octothorpe 0023
+OE, LATIN LETTER SMALL CAPITAL 0276
+OE, LATIN SMALL LIGATURE 0153
+Ogham 1680
+OGHAM SPACE MARK 1680
+OGONEK 02DB
+OGONEK, COMBINING 0328
+OHM SIGN 2126
+OHM SIGN, INVERTED 2127
+OI, LATIN SMALL LETTER 01A3
+OM, DEVANAGARI 0950
+OMEGA, LATIN SMALL LETTER CLOSED 0277
+ONE DOT LEADER 2024
+ONE HALF, VULGAR FRACTION 00BD
+ONE QUARTER, VULGAR FRACTION 00BC
+ONE, FRACTION NUMERATOR 215F
+ONE, SUPERSCRIPT 00B9
+OPEN BOX 2423
+OPEN BOX, SHOULDERED 237D
+OPEN E, LATIN CAPITAL LETTER 0190
+OPEN E, LATIN SMALL LETTER 025B
+OPEN E, LATIN SMALL LETTER CLOSED 029A
+OPEN E, LATIN SMALL LETTER CLOSED REVERSED 025E
+OPEN E, LATIN SMALL LETTER REVERSED 025C
+OPEN O, LATIN CAPITAL LETTER 0186
+OPEN O, LATIN SMALL LETTER 0254
+opening brace 007B
+opening curly bracket 007B
+opening parenthesis 0028
+opening square bracket 005B
+operating system command 009D
+OPERATOR, ASTERISK 2217
+OPERATOR, BULLET 2219
+OPERATOR, CIRCLED ASTERISK 229B
+OPERATOR, CIRCLED DOT 2299
+OPERATOR, CIRCLED RING 229A
+OPERATOR, DIAMOND 22C4
+OPERATOR, DOT 22C5
+OPERATOR, RING 2218
+OPERATOR, SQUARED DOT 22A1
+OPERATOR, STAR 22C6
+OPERATOR, TILDE 223C
+Operators, Mathematical 2200
+OPPOSITION 260D
+Optical Character Recognition (OCR) 2440
+OPTION KEY 2325
+OR, CURLY LOGICAL 22CE
+OR, LOGICAL 2228
+OR, N-ARY LOGICAL 22C1
+order 2134
+ORDINAL INDICATOR, FEMININE 00AA
+ORDINAL INDICATOR, MASCULINE 00BA
+ORIGIN, DIMENSION 2331
+ORIGINAL OF 22B6
+ORIGINAL OF, SQUARE 2290
+Oriya 0B00
+Oriya Digits 0B66
+Oriya Letters 0B05
+Ornaments, Heart 2763
+Ornaments, Punctuation 275B
+ORNATE LEFT PARENTHESIS FD3E
+ORTHODOX CROSS 2626
+orthogonal to 22A5
+OU, LATIN SMALL LETTER 0223
+OUNCE SIGN 2125
+overbar, apl 00AF
+OVERLAY, COMBINING CLOCKWISE RING 20D9
+OVERLAY, COMBINING LONG SOLIDUS 0338
+OVERLAY, COMBINING LONG STROKE 0336
+OVERLAY, COMBINING LONG VERTICAL LINE 20D2
+OVERLAY, COMBINING RING 20D8
+OVERLAY, COMBINING SHORT SOLIDUS 0337
+OVERLAY, COMBINING SHORT STROKE 0335
+OVERLAY, COMBINING SHORT VERTICAL LINE 20D3
+OVERLAY, COMBINING TILDE 0334
+overlay, long slash 0338
+overlay, short slash 0337
+overline 00AF
+OVERLINE 203E
+OVERLINE, CENTRELINE FE4A
+OVERLINE, COMBINING 0305
+OVERLINE, COMBINING DOUBLE 033F
+OVERLINE, DASHED FE49
+OVERLINE, DOUBLE WAVY FE4C
+OVERLINE, WAVY FE4B
+OVERRIDE, LEFT-TO-RIGHT 202D
+OVERRIDE, RIGHT-TO-LEFT 202E
+overscore 0305
+overscore, spacing 203E
+Overscores and Underscores FE49
+Overstruck Diacritics 0334
+oxia 0301
+P, DOUBLE-STRUCK CAPITAL 2119
+P, SCRIPT CAPITAL 2118
+page down 21DF
+page up 21DE
+PAGE, NEXT 2398
+PAGE, PREVIOUS 2397
+PALATALIZED HOOK BELOW, COMBINING 0321
+PARAGRAPH SEPARATOR 2029
+PARAGRAPH SEPARATOR, GEORGIAN 10FB
+paragraph separator, urdu 203B
+paragraph sign 00B6
+PARAGRAPH SIGN ORNAMENT, CURVED STEM 2761
+paragraph sign, european 00A7
+PARALLEL TO 2225
+PARALLELOGRAM, BLACK 25B0
+parenthesis, closing 0029
+PARENTHESIS, LEFT 0028
+parenthesis, opening 0028
+PARENTHESIS, ORNATE LEFT FD3E
+PARENTHESIS, RIGHT 0029
+PARENTHESIS, SUBSCRIPT LEFT 208D
+PARENTHESIS, SUPERSCRIPT LEFT 207D
+Parenthesized Ideographs 3220
+Parenthesized Korean Hangul Elements 3200
+Parenthesized Korean Hangul Syllables 320E
+Parenthesized Latin Letters 249C
+Parenthesized Numbers 2474
+parted rule 00A6
+PARTIAL DIFFERENTIAL 2202
+partial line down 008B
+partial line up 008C
+pdf 202C
+PEACE SYMBOL 262E
+Pencil Dingbats 270E
+PENCIL, UPPER RIGHT 2710
+per 2118
+PER MILLE SIGN 2030
+PER TEN THOUSAND SIGN 2031
+PERCENT SIGN 0025
+PERCENT SIGN, ARABIC 066A
+PERCUSSIVE, LATIN LETTER BIDENTAL 02AD
+PERCUSSIVE, LATIN LETTER BILABIAL 02AC
+period 002E
+PERISPOMENI, COMBINING GREEK 0342
+perpendicular 22A5
+Persian and Urdu, Eastern Arabic-Indic Digits for 06F0
+PERSPECTIVE 2306
+PESETA SIGN 20A7
+PHARYNGEAL VOICED FRICATIVE, LATIN LETTER 0295
+PHI, LATIN SMALL LETTER 0278
+Phonetic Alphabet, International 0250
+Phonetic Modifiers Derived from Latin Letters 02B0
+Phonetics and Symbols Area, CJK 2E00
+phonorecord sign 2117
+pi, mathematical constant 03C0
+Pictures for Control Codes, Graphic 2400
+PILCROW SIGN 00B6
+PILCROW SIGN, REVERSED 204B
+Pinyin Diacritic-vowel Combinations 01CD
+pipe 01C0
+pipe, double 01C1
+pipe, double-barred 01C2
+PISCES 2653
+PITCHFORK 22D4
+PLACE OF INTEREST SIGN 2318
+plaintiff 226C
+PLANCK CONSTANT 210E
+PLANCK CONSTANT OVER TWO PI 210F
+Planet Symbols 263F
+Playing Card Suits 2660
+PLUS SIGN 002B
+PLUS SIGN BELOW, COMBINING 031F
+PLUS SIGN, MODIFIER LETTER 02D6
+PLUS SIGN, SUBSCRIPT 208A
+PLUS SIGN, SUPERSCRIPT 207A
+PLUS, CIRCLED 2295
+PLUS, DOT 2214
+PLUS, SQUARED 229E
+PLUS-MINUS SIGN 00B1
+PLUTO 2647
+Pointers 25BA
+Points, Arabic 064B
+Points, Hebrew 05B0
+poison 2620
+Political Symbols, Religious and 2626
+POP DIRECTIONAL FORMATTING 202C
+POSITION INDICATOR 2316
+positive, most 223E
+POSTAL MARK 3012
+POSTAL MARK FACE 3020
+POSTAL MARK, CIRCLED 3036
+pound sign 0023
+POUND SIGN 00A3
+pound sterling 00A3
+pounds 2114
+power set 2118
+PRECEDES 227A
+PRECEDES UNDER RELATION 22B0
+PRESCRIPTION TAKE 211E
+Presentation Forms, Alphabetic FB00
+Presentation Forms, Hebrew FB1D
+Presentation Forms-A, Arabic FB50
+Presentation Forms-B, Arabic FE70
+PREVIOUS PAGE 2397
+PRIME 2032
+PRIME QUOTATION MARK, DOUBLE 301E
+PRIME QUOTATION MARK, LOW DOUBLE 301F
+PRIME QUOTATION MARK, REVERSED DOUBLE 301D
+PRIME, DOUBLE 2033
+PRIME, MODIFIER LETTER 02B9
+PRIME, MODIFIER LETTER DOUBLE 02BA
+PRIME, REVERSED 2035
+PRIME, REVERSED DOUBLE 2036
+PRIME, REVERSED TRIPLE 2037
+PRIME, TRIPLE 2034
+PRINT SCREEN SYMBOL 2399
+privacy message 009E
+Private Use Area E000
+private use one 0091
+private use two 0092
+product, direct 2299
+PRODUCT, LEFT SEMIDIRECT 22CB
+PRODUCT, N-ARY 220F
+product, tensor 2297
+PRODUCT, WREATH 2240
+PROFILE, ALL AROUND- 232E
+prohibition 20E0
+PROJECTIVE 2305
+PROOF, END OF 220E
+PROPORTION 2237
+PROPORTION, GEOMETRIC 223A
+PROPORTIONAL TO 221D
+proportional to, varies with 223C
+proves 22A2
+psili 0313
+published 2117
+Punctuation Ornaments 275B
+PUNCTUATION SPACE 2008
+Punctuation, CJK Symbols and 3000
+Punctuation, General 2000
+punt, irish 00A3
+Q, DOUBLE-STRUCK CAPITAL 211A
+Q, ROTATED CAPITAL 213A
+qed 220E
+QUAD, EM 2001
+QUAD, EN 2000
+quad, mutton 2001
+quadrature 25A1
+quantic 226C
+QUARTER MOON, FIRST 263D
+QUARTER MOON, LAST 263E
+QUARTER NOTE 2669
+Quarters, Fractions 00BC
+QUESTION EXCLAMATION MARK 2048
+QUESTION MARK 003F
+QUESTION MARK, ARABIC 061F
+QUESTION MARK, ARMENIAN 055E
+QUESTION MARK, ETHIOPIC 1367
+QUESTION MARK, EXCLAMATION 2049
+QUESTION MARK, GREEK 037E
+QUESTION MARK, INVERTED 00BF
+QUESTIONED EQUAL TO 225F
+QUILL, LEFT SQUARE BRACKET WITH 2045
+quotation dash 2015
+QUOTATION MARK 0022
+Quotation Mark Ornaments 275B
+quotation mark, double comma 201D
+QUOTATION MARK, DOUBLE HIGH-REVERSED-9 201F
+QUOTATION MARK, DOUBLE LOW-9 201E
+QUOTATION MARK, DOUBLE PRIME 301E
+quotation mark, double reversed comma 201F
+quotation mark, double turned comma 201C
+QUOTATION MARK, LEFT DOUBLE 201C
+QUOTATION MARK, LEFT SINGLE 2018
+QUOTATION MARK, LEFT-POINTING DOUBLE ANGLE 00AB
+quotation mark, low double comma 201E
+QUOTATION MARK, LOW DOUBLE PRIME 301F
+quotation mark, low single comma 201A
+QUOTATION MARK, REVERSED DOUBLE PRIME 301D
+QUOTATION MARK, RIGHT DOUBLE 201D
+QUOTATION MARK, RIGHT SINGLE 2019
+QUOTATION MARK, RIGHT-POINTING DOUBLE ANGLE 00BB
+quotation mark, single comma 2019
+QUOTATION MARK, SINGLE HIGH-REVERSED-9 201B
+QUOTATION MARK, SINGLE LEFT-POINTING ANGLE 2039
+QUOTATION MARK, SINGLE LOW-9 201A
+quotation mark, single reversed comma 201B
+QUOTATION MARK, SINGLE RIGHT-POINTING ANGLE 203A
+quotation mark, single turned comma 2018
+quote, apl 0022
+R, BLACK-LETTER CAPITAL 211C
+R, DOUBLE-STRUCK CAPITAL 211D
+R, LATIN LETTER SMALL CAPITAL 0280
+R, LATIN LETTER SMALL CAPITAL INVERTED 0281
+R, LATIN SMALL LETTER TURNED 0279
+R, MODIFIER LETTER SMALL 02B3
+R, MODIFIER LETTER SMALL CAPITAL INVERTED 02B6
+R, MODIFIER LETTER SMALL TURNED 02B4
+R, SCRIPT CAPITAL 211B
+radical sign 221A
+Radicals Supplement, CJK 2E80
+Radicals, Kangxi 2F00
+Radicals, Yi A490
+RADIOACTIVE SIGN 2622
+rainy weather 2602
+RAMS HORN, LATIN SMALL LETTER 0264
+RATIO 2236
+ratio, cross 211E
+rational numbers, the set of 211A
+real number symbol 210A
+real numbers, the set of 211D
+real part 211C
+recipe 211E
+record separator 001E
+RECORD SEPARATOR, SYMBOL FOR 241E
+RECORDER, TELEPHONE 2315
+RECORDING COPYRIGHT, SOUND 2117
+Rectangles 25AC
+reduces to 22A6
+reducible 22A2
+REFERENCE MARK 203B
+registered trade mark sign 00AE
+Religious and Political Symbols 2626
+Repeat Marks, Kana 3031
+REPLACEMENT CHARACTER FFFD
+REPLACEMENT CHARACTER, OBJECT FFFC
+resistance 2126
+RESPONSE 211F
+results in 22A8
+RETROFLEX CLICK, LATIN LETTER 01C3
+RETROFLEX HOOK BELOW, COMBINING 0322
+retroflex hook, latin small letter d 0256
+return, carriage 000D
+return, carriage 21B5
+RETURN, SYMBOL FOR CARRIAGE 240D
+reverse line feed 008D
+REVERSE SOLIDUS 005C
+reverse turnstile 22A3
+REVERSED COMMA ABOVE, COMBINING 0314
+reversed comma quotation mark, double 201F
+reversed comma quotation mark, single 201B
+REVERSED COMMA, MODIFIER LETTER 02BD
+REVERSED DOUBLE PRIME 2036
+REVERSED DOUBLE PRIME QUOTATION MARK 301D
+REVERSED E, LATIN CAPITAL LETTER 018E
+REVERSED E, LATIN SMALL LETTER 0258
+reversed epsilon, latin small letter closed 025E
+REVERSED ESH LOOP, LATIN LETTER 01AA
+REVERSED ESH, LATIN SMALL LETTER SQUAT 0285
+reversed glottal stop, latin letter 0295
+REVERSED GLOTTAL STOP, MODIFIER LETTER 02C1
+REVERSED GLOTTAL STOP, MODIFIER LETTER SMALL 02E4
+REVERSED NOT SIGN 2310
+REVERSED OPEN E, LATIN SMALL LETTER 025C
+REVERSED OPEN E, LATIN SMALL LETTER CLOSED 025E
+REVERSED PILCROW SIGN 204B
+REVERSED PRIME 2035
+reversed straight epsilon 220D
+REVERSED TILDE 223D
+REVERSED TILDE EQUALS 22CD
+REVERSED TRIPLE PRIME 2037
+REVERSED, LATIN SMALL LETTER EZH 01B9
+RHOTIC HOOK, MODIFIER LETTER 02DE
+riemann integral 211B
+RIGHT ANGLE 221F
+RIGHT ANGLE WITH ARC 22BE
+RIGHT CURLY BRACKET 007D
+RIGHT PARENTHESIS 0029
+right pointing guillemet 00BB
+right pointing single guillemet 203A
+RIGHT SQUARE BRACKET 005D
+RIGHT TRIANGLE 22BF
+RIGHT-POINTING ANGLE QUOTATION MARK, SINGLE 203A
+RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 00BB
+RIGHT-TO-LEFT EMBEDDING 202B
+RIGHT-TO-LEFT MARK 200F
+RIGHT-TO-LEFT OVERRIDE 202E
+RING ABOVE 02DA
+RING ABOVE, COMBINING 030A
+RING BELOW, COMBINING 0325
+RING BELOW, COMBINING LEFT HALF 031C
+RING BELOW, COMBINING RIGHT HALF 0339
+RING EQUAL TO 2257
+RING IN EQUAL TO 2256
+RING OPERATOR 2218
+RING OPERATOR, CIRCLED 229A
+RING OVERLAY, COMBINING 20D8
+RING OVERLAY, COMBINING CLOCKWISE 20D9
+RING, BENZENE 232C
+RING, MODIFIER LETTER CENTRED LEFT HALF 02D3
+RING, MODIFIER LETTER LEFT HALF 02BF
+rle 202B
+rlm 200F
+rlo 202E
+Roman Numerals 2160
+Romanian, Additions for 0218
+ROOT, CUBE 221B
+ROOT, FOURTH 221C
+ROOT, SQUARE 221A
+ROTATED CAPITAL Q 213A
+rotation 20D5
+rough breathing 0314
+rule, parted 00A6
+Runes, Golden Number 16EE
+Runic 16A0
+RUNOUT, TOTAL 2330
+RUPEE MARK, BENGALI 09F2
+RUPEE SIGN 20A8
+RUPEE SIGN, BENGALI 09F3
+Russian Alphabet, Basic 0410
+S, INVERTED LAZY 223E
+S, LATIN SMALL LETTER LONG 017F
+S, LATIN SMALL LETTER SHARP 00DF
+s, lazy 223D
+S, MODIFIER LETTER SMALL 02E2
+SAGITTARIUS 2650
+SALTIRE 2613
+Sanskrit and Tibetan, Mongolian Extensions for 1880
+satisfies 22A8
+SATURN 2644
+SCHWA, LATIN CAPITAL LETTER 018F
+SCHWA, LATIN SMALL LETTER 0259
+Scissors Dingbats 2701
+SCORPIUS 264F
+SCREEN, COMBINING ENCLOSING 20E2
+script a, latin small letter 0251
+SCRIPT CAPITAL B 212C
+SCRIPT CAPITAL E 2130
+SCRIPT CAPITAL F 2131
+SCRIPT CAPITAL H 210B
+SCRIPT CAPITAL I 2110
+SCRIPT CAPITAL L 2112
+SCRIPT CAPITAL M 2133
+SCRIPT CAPITAL P 2118
+SCRIPT CAPITAL R 211B
+script f, latin small letter 0192
+SCRIPT G, LATIN SMALL LETTER 0261
+SCRIPT SMALL E 212F
+SCRIPT SMALL G 210A
+SCRIPT SMALL L 2113
+SCRIPT SMALL O 2134
+script v, latin capital letter 01B2
+script v, latin small letter 028B
+Scripts Area, General 0000
+scrolling 21F3
+SCRUPLE 2108
+SEAGULL BELOW, COMBINING 033C
+second transfinite cardinal (the continuum) 2136
+seconds 2033
+SECTION SIGN 00A7
+section sign, european 00B6
+SECTOR 2314
+SEGMENT 2313
+selected area, end of 0087
+selected area, start of 0086
+SEMICOLON 003B
+SEMICOLON, ARABIC 061B
+SEMICOLON, ETHIOPIC 1364
+SEMIDIRECT PRODUCT, LEFT 22CB
+SEPARATOR KEY SYMBOL, DECIMAL 2396
+SEPARATOR, ARABIC DECIMAL 066B
+SEPARATOR, ARABIC THOUSANDS 066C
+separator, decimal 002C
+separator, devanagari phrase 0964
+separator, file 001C
+SEPARATOR, GEORGIAN PARAGRAPH 10FB
+separator, group 001D
+SEPARATOR, LINE 2028
+SEPARATOR, PARAGRAPH 2029
+separator, record 001E
+SEPARATOR, SYMBOL FOR FILE 241C
+SEPARATOR, SYMBOL FOR GROUP 241D
+SEPARATOR, SYMBOL FOR RECORD 241E
+SEPARATOR, SYMBOL FOR UNIT 241F
+separator, unit 001F
+separator, urdu paragraph 203B
+sequence introducer, control 009B
+Serbian Cyrillic Letters, Croatian Digraphs Matching 01C4
+SERVICE MARK 2120
+SET MINUS 2216
+set of complex numbers, the 2102
+set of integers, the 2124
+set of rational numbers, the 211A
+set of real numbers, the 211D
+set transmit state 0093
+SET, EMPTY 2205
+set, included in 2282
+set, includes in 2283
+set, null 2205
+set, power 2118
+sextile 2736
+Shade Characters 2591
+shamrock 2663
+Shapes, Geometric 25A0
+SHARP S, LATIN SMALL LETTER 00DF
+SHARP SIGN, MUSIC 266F
+SHEQEL SIGN, NEW 20AA
+shift 21E7
+shift in 000F
+SHIFT IN, SYMBOL FOR 240F
+shift out 000E
+SHIFT OUT, SYMBOL FOR 240E
+shilling 002F
+short 0306
+short slash overlay 0337
+SHORT SOLIDUS OVERLAY, COMBINING 0337
+SHORT STROKE OVERLAY, COMBINING 0335
+SHORT VERTICAL LINE OVERLAY, COMBINING 20D3
+SHOULDERED OPEN BOX 237D
+Sibe Letters, Mongolian 185D
+similar to 223C
+SINE WAVE 223F
+single character introducer 009A
+single comma quotation mark 2019
+single comma quotation mark, low 201A
+single guillemet, left pointing 2039
+single guillemet, right pointing 203A
+SINGLE HIGH-REVERSED-9 QUOTATION MARK 201B
+SINGLE LEFT-POINTING ANGLE QUOTATION MARK 2039
+SINGLE LOW-9 QUOTATION MARK 201A
+SINGLE QUOTATION MARK, LEFT 2018
+SINGLE QUOTATION MARK, RIGHT 2019
+single reversed comma quotation mark 201B
+SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 203A
+single shift three 008F
+single shift two 008E
+single turned comma quotation mark 2018
+Sinhala 0D80
+SIX-PER-EM SPACE 2006
+SIXTEENTH NOTES, BEAMED 266C
+Sixths, Fractions 2159
+SKULL AND CROSSBONES 2620
+slash 002F
+slash overlay, long 0338
+slash overlay, short 0337
+SLASH, CIRCLED DIVISION 2298
+SLASH, DIVISION 2215
+SLASH, FRACTION 2044
+SLOPE 2333
+Slovenian and Croatian, Additions for 0200
+SMALL CAPITAL B, LATIN LETTER 0299
+SMALL CAPITAL G, LATIN LETTER 0262
+SMALL CAPITAL H, LATIN LETTER 029C
+SMALL CAPITAL I, LATIN LETTER 026A
+SMALL CAPITAL INVERTED R, LATIN LETTER 0281
+SMALL CAPITAL INVERTED R, MODIFIER LETTER 02B6
+SMALL CAPITAL L, LATIN LETTER 029F
+SMALL CAPITAL N, LATIN LETTER 0274
+SMALL CAPITAL OE, LATIN LETTER 0276
+SMALL CAPITAL R, LATIN LETTER 0280
+SMALL CAPITAL Y, LATIN LETTER 028F
+small circle, black 2022
+SMALL CONTAINS AS MEMBER 220D
+SMALL ELEMENT OF 220A
+Small Form Variants FE50
+Small Letters, Armenian 0561
+Small Letters, Cyrillic 0430
+Small Letters, Georgian 10D0
+Small Letters, Greek 03B1
+Small Letters, Latin 0061
+SMILE 2323
+SMILING FACE, BLACK 263B
+SMILING FACE, WHITE 263A
+smooth breathing 0313
+Snowflake Dingbats 2744
+Snowflakes, Stars, Asterisks and 2721
+SNOWMAN 2603
+snowy weather 2603
+SOFT HYPHEN 00AD
+SOFTWARE-FUNCTION SYMBOL 2394
+solid 2588
+SOLIDUS 002F
+solidus 2044
+SOLIDUS OVERLAY, COMBINING LONG 0338
+SOLIDUS OVERLAY, COMBINING SHORT 0337
+SOLIDUS, REVERSE 005C
+SOUND RECORDING COPYRIGHT 2117
+SOURCE, INFORMATION 2139
+SPACE 0020
+SPACE MARK, OGHAM 1680
+SPACE, EM 2003
+SPACE, EN 2002
+SPACE, FIGURE 2007
+SPACE, FOUR-PER-EM 2005
+space, graphic for 2422
+space, graphic for 2423
+space, graphic for no break 237D
+SPACE, HAIR 200A
+SPACE, IDEOGRAPHIC 3000
+space, mid 2005
+SPACE, NARROW NO-BREAK 202F
+SPACE, NO-BREAK 00A0
+SPACE, PUNCTUATION 2008
+SPACE, SIX-PER-EM 2006
+SPACE, SYMBOL FOR 2420
+space, thick 2004
+SPACE, THIN 2009
+SPACE, THREE-PER-EM 2004
+SPACE, ZERO WIDTH 200B
+SPACE, ZERO WIDTH NO-BREAK FEFF
+Spaces 2000
+spacing acute 00B4
+spacing cedilla 00B8
+spacing circumflex 005E
+Spacing Clones of Diacritics 02D8
+spacing diaeresis 00A8
+spacing double underscore 2017
+spacing grave 0060
+spacing macron 00AF
+Spacing Modifier Letters 02B0
+spacing overscore 203E
+spacing underscore 005F
+spanish currency 20A7
+Specials FFF0
+Specials Area, Compatibility and F900
+SPHERICAL ANGLE 2222
+SQUARE BELOW, COMBINING 033B
+SQUARE BRACKET WITH QUILL, LEFT 2045
+square bracket, closing 005D
+SQUARE BRACKET, LEFT 005B
+SQUARE BRACKET, LEFT WHITE 301A
+square bracket, opening 005B
+SQUARE BRACKET, RIGHT 005D
+SQUARE CAP 2293
+SQUARE CORPORATION 337F
+SQUARE CUP 2294
+SQUARE IMAGE OF 228F
+SQUARE LOZENGE 2311
+SQUARE ORIGINAL OF 2290
+SQUARE ROOT 221A
+SQUARE, COMBINING ENCLOSING 20DE
+SQUARE, VIEWDATA 2317
+squared 00B2
+SQUARED DOT OPERATOR 22A1
+Squared Japanese Katakana Words 3300
+Squared Latin Abbreviations 3371
+SQUARED MINUS 229F
+SQUARED PLUS 229E
+SQUARED TIMES 22A0
+Squares 25A0
+SQUAT REVERSED ESH, LATIN SMALL LETTER 0285
+st. andrew's cross 2613
+star 002A
+STAR AND CRESCENT 262A
+Star Dingbats 2726
+STAR EQUALS 225B
+STAR OF DAVID 2721
+STAR OPERATOR 22C6
+STAR, ARABIC FIVE POINTED 066D
+STAR, BLACK 2605
+starburst 273A
+Stars, Asterisks and Snowflakes 2721
+start of guarded area 0096
+start of heading 0001
+START OF HEADING, SYMBOL FOR 2401
+start of selected area 0086
+start of string 0098
+start of text 0002
+START OF TEXT, SYMBOL FOR 2402
+statement is true 22A8
+sterling, pound 00A3
+stile, apl 2223
+straight epsilon 220A
+straight epsilon, reversed 220D
+stress mark 0301
+STRETCHED C, LATIN LETTER 0297
+STRICTLY EQUIVALENT TO 2263
+string terminator 009C
+string, device control 0090
+string, start of 0098
+STROKE OVERLAY, COMBINING LONG 0336
+STROKE OVERLAY, COMBINING SHORT 0335
+SUBGROUP OF, NORMAL 22B2
+SUBGROUP, CONTAINS AS NORMAL 22B3
+Subscript Digits 2080
+SUBSCRIPT EQUALS SIGN 208C
+SUBSCRIPT LEFT PARENTHESIS 208D
+SUBSCRIPT MINUS 208B
+SUBSCRIPT PLUS SIGN 208A
+subscript, iota 0345
+Subscripts 2080
+SUBSET OF 2282
+SUBSET, DOUBLE 22D0
+substitute 001A
+SUBSTITUTE FORM TWO, SYMBOL FOR 2426
+SUBSTITUTE, SYMBOL FOR 241A
+SUCCEEDS 227B
+SUCCEEDS UNDER RELATION 22B1
+such that 220B
+such that 2223
+Suits, Playing Card 2660
+sum, direct 2295
+SUMMATION, N-ARY 2211
+SUN 2609
+SUN WITH RAYS, BLACK 2600
+SUPERSCRIPT ALEF, ARABIC LETTER 0670
+Superscript Digits 2070
+SUPERSCRIPT EQUALS SIGN 207C
+SUPERSCRIPT LEFT PARENTHESIS 207D
+SUPERSCRIPT MINUS 207B
+SUPERSCRIPT ONE 00B9
+SUPERSCRIPT PLUS SIGN 207A
+SUPERSCRIPT THREE 00B3
+SUPERSCRIPT TWO 00B2
+SUPERSCRIPT ZERO 2070
+Superscripts 2070
+Superscripts and Subscripts 2070
+SUPERSET OF 2283
+SUPERSET, DOUBLE 22D1
+SURFACE INTEGRAL 222F
+Surrogates Area D800
+Surrogates, High D800
+Surrogates, Low DC00
+swedish grave accent 02DF
+swung dash 007E
+Syllabics, Unified Canadian Aboriginal 1400
+Syllables Area, Korean Hangul AC00
+Syllables, Yi A000
+Symbol Variants, Fullwidth FFE0
+Symbols and Punctuation, CJK 3000
+Symbols Area 2000
+Symbols Area, CJK Phonetics and 2E00
+Symbols for Control Codes, Graphic 2400
+Symbols, Combining Diacritical Marks for 20D0
+Symbols, Greek 03D0
+Symbols, Letterlike 2100
+Symbols, Miscellaneous 2600
+symmetric difference 2238
+symmetric difference 2296
+SYMMETRIC SWAPPING, ACTIVATE 206B
+SYMMETRIC SWAPPING, INHIBIT 206A
+SYMMETRY 232F
+synchronous idle 0016
+SYNCHRONOUS IDLE, SYMBOL FOR 2416
+Syriac 0700
+SYRIAC CROSS, EAST 2671
+SYRIAC CROSS, WEST 2670
+Syriac Format Control 070F
+T, LATIN SMALL LETTER TURNED 0287
+tab 0009
+tab with shift tab 21B9
+tab, leftward 21E4
+tab, rightward 21E5
+tab, symbol for 2409
+tabulation set, character 0088
+tabulation set, line 008A
+tabulation with justification, character 0089
+tabulation, horizontal 0009
+TABULATION, SYMBOL FOR HORIZONTAL 2409
+TABULATION, SYMBOL FOR VERTICAL 240B
+tabulation, vertical 000B
+TACK BELOW, COMBINING LEFT 0318
+TACK BELOW, COMBINING UP 031D
+TACK, LEFT 22A3
+TACK, MODIFIER LETTER UP 02D4
+TACK, RIGHT 22A2
+TACK, UP 22A5
+tainome (japanese, a kind of bullet) 25C9
+TAKE, PRESCRIPTION 211E
+Tamil 0B80
+Tamil Digits 0BE7
+Tamil Letters 0B85
+TAPE DRIVE 2707
+TAPER, CONICAL 2332
+TAURUS 2649
+tautology 22A8
+Technical, Miscellaneous 2300
+Telegraph Symbols for Days 33E0
+Telegraph Symbols for Hours 3358
+Telegraph Symbols for Months 32C0
+TELEPHONE LOCATION SIGN 2706
+TELEPHONE RECORDER 2315
+TELEPHONE SIGN 2121
+TELEPHONE, BLACK 260E
+Telugu 0C00
+Telugu Digits 0C66
+Telugu Letters 0C05
+TEN THOUSAND SIGN, PER 2031
+tensor 20E1
+tensor product 2297
+terminator, string 009C
+text, end of 0003
+text, start of 0002
+TEXT, SYMBOL FOR END OF 2403
+TEXT, SYMBOL FOR START OF 2402
+Thaana 0780
+Thai 0E00
+THAI CURRENCY SYMBOL BAHT 0E3F
+Thai Digits 0E50
+Thai Letters 0E01
+THERE EXISTS 2203
+THEREFORE 2234
+thick space 2004
+THIN SPACE 2009
+third derivative 20DB
+third transfinite cardinal (functions of a real variable) 2137
+Thirds, Fractions 2153
+THORN, LATIN CAPITAL LETTER 00DE
+THORN, LATIN SMALL LETTER 00FE
+THOUSANDS SEPARATOR, ARABIC 066C
+THOUSANDS SIGN, CYRILLIC 0482
+three dot leader 2026
+THREE DOTS ABOVE, COMBINING 20DB
+THREE QUARTERS, VULGAR FRACTION 00BE
+THREE, SUPERSCRIPT 00B3
+THREE-PER-EM SPACE 2004
+THUNDERSTORM 2608
+Tibetan 0F00
+Tibetan Digits 0F20
+Tibetan Letters 0F40
+Tibetan, Mongolian Extensions for Sanskrit and 1880
+TIE, CHARACTER 2040
+TILDE 007E
+TILDE ABOVE, COMBINING NOT 034A
+TILDE BELOW, COMBINING 0330
+TILDE EQUALS, REVERSED 22CD
+TILDE LEFT HALF, COMBINING DOUBLE FE22
+TILDE OPERATOR 223C
+TILDE OVERLAY, COMBINING 0334
+tilde, apl 223C
+TILDE, COMBINING 0303
+TILDE, COMBINING DOUBLE 0360
+TILDE, COMBINING VERTICAL 033E
+TILDE, MINUS 2242
+TILDE, REVERSED 223D
+TILDE, SMALL 02DC
+TILDE, TRIPLE 224B
+TIMES, CIRCLED 2297
+TIMES, DIVISION 22C7
+TIMES, SQUARED 22A0
+TIRONIAN SIGN ET 204A
+TIS 620-2529 (Thai), Based on 0E01
+Todo Letters, Mongolian 1843
+Tone Bar Letters 02E5
+TONE FIVE, LATIN SMALL LETTER 01BD
+TONE MARK, COMBINING ACUTE 0341
+TONE MARK, COMBINING GRAVE 0340
+Tone Marks, Ideographic 302A
+Tone Marks, Vietnamese 0340
+TONE SIX, LATIN SMALL LETTER 0185
+TONE TWO, LATIN SMALL LETTER 01A8
+tonos 0301
+TONOS, COMBINING GREEK DIALYTIKA 0344
+TOP HALF INTEGRAL 2320
+TOP LEFT CORNER 231C
+TOP LEFT CROP 230F
+TORTOISE SHELL BRACKET, LEFT 3014
+TORTOISE SHELL BRACKET, LEFT WHITE 3018
+TOTAL RUNOUT 2330
+TRADE MARK SIGN 2122
+trade mark sign, registered 00AE
+transfinite cardinal (countable), first 2135
+transfinite cardinal (functions of a real variable), third 2137
+transfinite cardinal (the continuum), second 2136
+transfinite cardinal, fourth 2138
+transmission block, end of 0017
+TRANSMISSION BLOCK, SYMBOL FOR END OF 2417
+transmission, end of 0004
+transmission, graphic for end of 2301
+TRANSMISSION, SYMBOL FOR END OF 2404
+transmit state, set 0093
+TRIANGLE, RIGHT 22BF
+Triangles 25B2
+TRIANGULAR BULLET 2023
+TRIANGULAR COLON, MODIFIER LETTER 02D0
+TRIANGULAR COLON, MODIFIER LETTER HALF 02D1
+Trigram Symbols, Yijing 2630
+trine 25B3
+TRIPLE INTEGRAL 222D
+TRIPLE PRIME 2034
+TRIPLE PRIME, REVERSED 2037
+TRIPLE TILDE 224B
+TRUE 22A8
+TUGRIK SIGN 20AE
+turbofan 274B
+turkish currency 20A4
+TURNED A, LATIN SMALL LETTER 0250
+TURNED ALPHA, LATIN SMALL LETTER 0252
+TURNED CAPITAL F 2132
+TURNED COMMA ABOVE, COMBINING 0312
+turned comma quotation mark, double 201C
+turned comma quotation mark, single 2018
+TURNED COMMA, MODIFIER LETTER 02BB
+TURNED DELTA, LATIN SMALL LETTER 018D
+turned e, latin capital letter 018E
+TURNED E, LATIN SMALL LETTER 01DD
+TURNED GREEK SMALL LETTER IOTA 2129
+TURNED H, LATIN SMALL LETTER 0265
+TURNED K, LATIN SMALL LETTER 029E
+TURNED M, LATIN CAPITAL LETTER 019C
+TURNED M, LATIN SMALL LETTER 026F
+TURNED NOT SIGN 2319
+turned question mark 00BF
+TURNED R, LATIN SMALL LETTER 0279
+TURNED R, MODIFIER LETTER SMALL 02B4
+TURNED T, LATIN SMALL LETTER 0287
+TURNED V, LATIN SMALL LETTER 028C
+TURNED W, LATIN SMALL LETTER 028D
+TURNED Y, LATIN SMALL LETTER 028E
+turnstile 22A2
+turnstile, reverse 22A3
+TWO DOT LEADER 2025
+TWO, SUPERSCRIPT 00B2
+UMBRELLA 2602
+umlaut 0308
+UNASPIRATED, MODIFIER LETTER 02ED
+underline 0332
+UNDERLINE SYMBOL, CONTINUOUS 2381
+UNDERLINE SYMBOL, DISCONTINUOUS 2382
+underline, double 0333
+underscore 0332
+underscore, double 0333
+underscore, spacing 005F
+underscore, spacing double 2017
+Underscores, Overscores and FE49
+UNDERTIE 203F
+UNDO SYMBOL 238C
+undoable delete 2425
+UNION 222A
+UNION, DOUBLE 22D3
+UNION, MULTISET 228E
+UNION, N-ARY 22C3
+unique element 2129
+unit separator 001F
+UNIT SEPARATOR, SYMBOL FOR 241F
+UP ARROWHEAD 2303
+UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS 2324
+UP RIGHT DIAGONAL ELLIPSIS 22F0
+UP TACK 22A5
+UP TACK BELOW, COMBINING 031D
+UP TACK, MODIFIER LETTER 02D4
+up, page 21DE
+UPPER BLADE SCISSORS 2701
+UPPER RIGHT PENCIL 2710
+UPSILON, LATIN CAPITAL LETTER 01B1
+UPSILON, LATIN SMALL LETTER 028A
+upstile, apl 2308
+UPWARDS ARROW BELOW, COMBINING 034E
+URANUS 2645
+urdu paragraph separator 203B
+Urdu, Eastern Arabic-Indic Digits for Persian and 06F0
+V WITH HOOK, LATIN CAPITAL LETTER 01B2
+v, latin capital letter script 01B2
+v, latin small letter script 028B
+V, LATIN SMALL LETTER TURNED 028C
+valentine 2665
+valid 22A8
+varia 0300
+varies with (proportional to) 223C
+vector 20D0
+vector 20D6
+vector pointing into page 2295
+vector pointing into page 2297
+vector pointing out of page 2299
+vee 2228
+vee above 030C
+venus 2640
+VERSICLE 2123
+vertical bar 007C
+Vertical Bar Dingbats 2758
+vertical bar, broken 00A6
+VERTICAL ELLIPSIS 22EE
+VERTICAL KANA REPEAT MARK 3031
+VERTICAL LINE 007C
+VERTICAL LINE ABOVE, COMBINING 030D
+VERTICAL LINE ABOVE, COMBINING DOUBLE 030E
+VERTICAL LINE BELOW, COMBINING 0329
+VERTICAL LINE BELOW, COMBINING DOUBLE 0348
+VERTICAL LINE OVERLAY, COMBINING LONG 20D2
+VERTICAL LINE OVERLAY, COMBINING SHORT 20D3
+VERTICAL LINE WITH MIDDLE DOT 237F
+VERTICAL LINE, DOUBLE 2016
+VERTICAL LINE, MODIFIER LETTER 02C8
+VERTICAL LINE, MODIFIER LETTER LOW 02CC
+vertical tabulation 000B
+VERTICAL TABULATION, SYMBOL FOR 240B
+VERTICAL TILDE, COMBINING 033E
+Vertical Variants, Glyphs for FE30
+VERY MUCH GREATER-THAN 22D9
+VERY MUCH LESS-THAN 22D8
+VICTORY HAND 270C
+vietnamese currency 20AB
+Vietnamese Tone Marks 0340
+Vietnamese, Latin Extensions for 1EA0
+VIEWDATA SQUARE 2317
+vinculum 0305
+VIRAMA, BENGALI SIGN 09CD
+VIRAMA, DEVANAGARI SIGN 094D
+VIRAMA, GUJARATI SIGN 0ACD
+VIRAMA, GURMUKHI SIGN 0A4D
+VIRAMA, KANNADA SIGN 0CCD
+VIRAMA, MALAYALAM SIGN 0D4D
+VIRAMA, ORIYA SIGN 0B4D
+VIRAMA, TAMIL SIGN 0BCD
+VIRAMA, TELUGU SIGN 0C4D
+VIRGO 264D
+virgule 002F
+VOICED FRICATIVE, LATIN LETTER PHARYNGEAL 0295
+VOICED SOUND MARK, COMBINING KATAKANA-HIRAGANA 3099
+VOICED SOUND MARK, KATAKANA-HIRAGANA 309B
+VOICING, MODIFIER LETTER 02EC
+VOLUME INTEGRAL 2230
+vrachy 0306
+W, LATIN SMALL LETTER TURNED 028D
+W, MODIFIER LETTER SMALL 02B7
+Warning Signs 2620
+WATCH 231A
+WAVE DASH 301C
+WAVE, SINE 223F
+WAVY DASH 3030
+WAVY LINE 2307
+WAVY LOW LINE FE4F
+WAVY OVERLINE FE4B
+WAVY OVERLINE, DOUBLE FE4C
+Weather and Astrological Symbols 2600
+wedge 028C
+wedge 2227
+weierstrass elliptic function 2118
+WHEEL OF DHARMA 2638
+WON SIGN 20A9
+Words, Squared Japanese Katakana 3300
+WORDSPACE, ETHIOPIC 1361
+WREATH PRODUCT 2240
+WRITING HAND 270D
+WYNN, LATIN CAPITAL LETTER 01F7
+WYNN, LATIN LETTER 01BF
+X ABOVE, COMBINING 033D
+X IN A RECTANGLE BOX 2327
+X, BALLOT 2717
+X, BALLOT BOX WITH 2612
+X, HEAVY BALLOT 2718
+X, HEAVY MULTIPLICATION 2716
+X, MODIFIER LETTER SMALL 02E3
+X, MULTIPLICATION 2715
+XOR 22BB
+Y, LATIN LETTER SMALL CAPITAL 028F
+Y, LATIN SMALL LETTER TURNED 028E
+Y, MODIFIER LETTER SMALL 02B8
+YANG, YIN 262F
+YEN SIGN 00A5
+Yi Radicals A490
+Yi Syllables A000
+Yiddish Digraphs 05F0
+yields 22A2
+Yijing Trigram Symbols 2630
+YIN YANG 262F
+yogh, latin capital letter 01B7
+YOGH, LATIN SMALL LETTER 021D
+yogh, latin small letter 0292
+YPOGEGRAMMENI, COMBINING GREEK 0345
+YR, LATIN LETTER 01A6
+yuan sign 00A5
+Z, BLACK-LETTER CAPITAL 2128
+Z, DOUBLE-STRUCK CAPITAL 2124
+Zapf Dingbats Series 100, ITC 2700
+ZERO WIDTH JOINER 200D
+ZERO WIDTH NO-BREAK SPACE FEFF
+ZERO WIDTH NON-JOINER 200C
+ZERO WIDTH SPACE 200B
+ZERO, CIRCLED DIGIT 24EA
+ZERO, IDEOGRAPHIC NUMBER 3007
+ZERO, SUPERSCRIPT 2070
+Zodiacal Symbols 2648
+zwj 200D
+zwnj 200C
diff --git a/contrib/perl5/lib/unicode/Is/ASCII.pl b/contrib/perl5/lib/unicode/Is/ASCII.pl
new file mode 100644
index 0000000..63f95ae
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/ASCII.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 007f
+END
diff --git a/contrib/perl5/lib/unicode/Is/Alnum.pl b/contrib/perl5/lib/unicode/Is/Alnum.pl
new file mode 100644
index 0000000..d44f744
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Alnum.pl
@@ -0,0 +1,276 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039
+0041 005a
+0061 007a
+00aa
+00b5
+00ba
+00c0 00d6
+00d8 00f6
+00f8 01c4
+01c6 01c7
+01c9 01ca
+01cc 01f1
+01f3 021f
+0222 0233
+0250 02ad
+0386
+0388 038a
+038c
+038e 03a1
+03a3 03ce
+03d0 03d7
+03da 03f3
+0400 0481
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0561 0587
+05d0 05ea
+05f0 05f2
+0621 063a
+0641 064a
+0660 0669
+0671 06d3
+06d5
+06f0 06fc
+0710
+0712 072c
+0780 07a5
+0905 0939
+093d
+0950
+0958 0961
+0966 096f
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09dc 09dd
+09df 09e1
+09e6 09f1
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a59 0a5c
+0a5e
+0a66 0a6f
+0a72 0a74
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abd
+0ad0
+0ae0
+0ae6 0aef
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3d
+0b5c 0b5d
+0b5f 0b61
+0b66 0b6f
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0be7 0bef
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c60 0c61
+0c66 0c6f
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cde
+0ce0 0ce1
+0ce6 0cef
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d60 0d61
+0d66 0d6f
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0e01 0e30
+0e32 0e33
+0e40 0e45
+0e50 0e59
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb0
+0eb2 0eb3
+0ebd
+0ec0 0ec4
+0ed0 0ed9
+0edc 0edd
+0f00
+0f20 0f29
+0f40 0f47
+0f49 0f6a
+0f88 0f8b
+1000 1021
+1023 1027
+1029 102a
+1040 1049
+1050 1055
+10a0 10c5
+10d0 10f6
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+1369 1371
+13a0 13f4
+1401 166c
+166f 1676
+1681 169a
+16a0 16ea
+1780 17b3
+17e0 17e9
+1810 1819
+1820 1842
+1844 1877
+1880 18a8
+1e00 1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1f87
+1f90 1f97
+1fa0 1fa7
+1fb0 1fb4
+1fb6 1fbb
+1fbe
+1fc2 1fc4
+1fc6 1fcb
+1fd0 1fd3
+1fd6 1fdb
+1fe0 1fec
+1ff2 1ff4
+1ff6 1ffb
+207f
+2102
+2107
+210a 2113
+2115
+2119 211d
+2124
+2126
+2128
+212a 212d
+212f 2131
+2133 2139
+3006
+3041 3094
+30a1 30fa
+3105 312c
+3131 318e
+31a0 31b7
+3400 4db5
+4e00 9fa5
+a000 a48c
+ac00 d7a3
+f900 fa2d
+fb00 fb06
+fb13 fb17
+fb1d
+fb1f fb28
+fb2a fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe70 fe72
+fe74
+fe76 fefc
+ff10 ff19
+ff21 ff3a
+ff41 ff5a
+ff66 ff6f
+ff71 ff9d
+ffa0 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+END
diff --git a/contrib/perl5/lib/unicode/Is/Alpha.pl b/contrib/perl5/lib/unicode/Is/Alpha.pl
new file mode 100644
index 0000000..0e94688
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Alpha.pl
@@ -0,0 +1,258 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0041 005a
+0061 007a
+00aa
+00b5
+00ba
+00c0 00d6
+00d8 00f6
+00f8 01c4
+01c6 01c7
+01c9 01ca
+01cc 01f1
+01f3 021f
+0222 0233
+0250 02ad
+0386
+0388 038a
+038c
+038e 03a1
+03a3 03ce
+03d0 03d7
+03da 03f3
+0400 0481
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0561 0587
+05d0 05ea
+05f0 05f2
+0621 063a
+0641 064a
+0671 06d3
+06d5
+06fa 06fc
+0710
+0712 072c
+0780 07a5
+0905 0939
+093d
+0950
+0958 0961
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09dc 09dd
+09df 09e1
+09f0 09f1
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a59 0a5c
+0a5e
+0a72 0a74
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abd
+0ad0
+0ae0
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3d
+0b5c 0b5d
+0b5f 0b61
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c60 0c61
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cde
+0ce0 0ce1
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d60 0d61
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0e01 0e30
+0e32 0e33
+0e40 0e45
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb0
+0eb2 0eb3
+0ebd
+0ec0 0ec4
+0edc 0edd
+0f00
+0f40 0f47
+0f49 0f6a
+0f88 0f8b
+1000 1021
+1023 1027
+1029 102a
+1050 1055
+10a0 10c5
+10d0 10f6
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+13a0 13f4
+1401 166c
+166f 1676
+1681 169a
+16a0 16ea
+1780 17b3
+1820 1842
+1844 1877
+1880 18a8
+1e00 1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1f87
+1f90 1f97
+1fa0 1fa7
+1fb0 1fb4
+1fb6 1fbb
+1fbe
+1fc2 1fc4
+1fc6 1fcb
+1fd0 1fd3
+1fd6 1fdb
+1fe0 1fec
+1ff2 1ff4
+1ff6 1ffb
+207f
+2102
+2107
+210a 2113
+2115
+2119 211d
+2124
+2126
+2128
+212a 212d
+212f 2131
+2133 2139
+3006
+3041 3094
+30a1 30fa
+3105 312c
+3131 318e
+31a0 31b7
+3400 4db5
+4e00 9fa5
+a000 a48c
+ac00 d7a3
+f900 fa2d
+fb00 fb06
+fb13 fb17
+fb1d
+fb1f fb28
+fb2a fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe70 fe72
+fe74
+fe76 fefc
+ff21 ff3a
+ff41 ff5a
+ff66 ff6f
+ff71 ff9d
+ffa0 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiAN.pl b/contrib/perl5/lib/unicode/Is/BidiAN.pl
new file mode 100644
index 0000000..4a71ae5
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiAN.pl
@@ -0,0 +1,7 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0660 0669
+066b 066c
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiB.pl b/contrib/perl5/lib/unicode/Is/BidiB.pl
new file mode 100644
index 0000000..e4ba165
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiB.pl
@@ -0,0 +1,10 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+000a
+000d
+001c 001e
+0085
+2029
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiCS.pl b/contrib/perl5/lib/unicode/Is/BidiCS.pl
new file mode 100644
index 0000000..f8d037d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiCS.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+002c
+002e
+003a
+00a0
+060c
+fe50
+fe52
+fe55
+ff0c
+ff0e
+ff1a
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiEN.pl b/contrib/perl5/lib/unicode/Is/BidiEN.pl
new file mode 100644
index 0000000..d63270a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiEN.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039
+00b2 00b3
+00b9
+06f0 06f9
+2070
+2074 2079
+2080 2089
+2460 249b
+24ea
+ff10 ff19
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiES.pl b/contrib/perl5/lib/unicode/Is/BidiES.pl
new file mode 100644
index 0000000..5a1a36a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiES.pl
@@ -0,0 +1,7 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+002f
+ff0f
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiET.pl b/contrib/perl5/lib/unicode/Is/BidiET.pl
new file mode 100644
index 0000000..5e7af2b
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiET.pl
@@ -0,0 +1,29 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0023 0025
+002b
+002d
+00a2 00a5
+00b0 00b1
+066a
+09f2 09f3
+0e3f
+17db
+2030 2034
+207a 207b
+208a 208b
+20a0 20af
+212e
+2212 2213
+fb29
+fe5f
+fe62 fe63
+fe69 fe6a
+ff03 ff05
+ff0b
+ff0d
+ffe0 ffe1
+ffe5 ffe6
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiL.pl b/contrib/perl5/lib/unicode/Is/BidiL.pl
new file mode 100644
index 0000000..8dc4ca8
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiL.pl
@@ -0,0 +1,323 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0041 005a
+0061 007a
+00aa
+00b5
+00ba
+00c0 00d6
+00d8 00f6
+00f8 021f
+0222 0233
+0250 02ad
+02b0 02b8
+02bb 02c1
+02d0 02d1
+02e0 02e4
+02ee
+037a
+0386
+0388 038a
+038c
+038e 03a1
+03a3 03ce
+03d0 03d7
+03da 03f3
+0400 0482
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0559 055f
+0561 0587
+0589
+0903
+0905 0939
+093d 0940
+0949 094c
+0950
+0958 0961
+0964 0970
+0982 0983
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09be 09c0
+09c7 09c8
+09cb 09cc
+09d7
+09dc 09dd
+09df 09e1
+09e6 09f1
+09f4 09fa
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a3e 0a40
+0a59 0a5c
+0a5e
+0a66 0a6f
+0a72 0a74
+0a83
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abd 0ac0
+0ac9
+0acb 0acc
+0ad0
+0ae0
+0ae6 0aef
+0b02 0b03
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3d 0b3e
+0b40
+0b47 0b48
+0b4b 0b4c
+0b57
+0b5c 0b5d
+0b5f 0b61
+0b66 0b70
+0b83
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0bbe 0bbf
+0bc1 0bc2
+0bc6 0bc8
+0bca 0bcc
+0bd7
+0be7 0bf2
+0c01 0c03
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c41 0c44
+0c60 0c61
+0c66 0c6f
+0c82 0c83
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cbe
+0cc0 0cc4
+0cc7 0cc8
+0cca 0ccb
+0cd5 0cd6
+0cde
+0ce0 0ce1
+0ce6 0cef
+0d02 0d03
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d3e 0d40
+0d46 0d48
+0d4a 0d4c
+0d57
+0d60 0d61
+0d66 0d6f
+0d82 0d83
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0dcf 0dd1
+0dd8 0ddf
+0df2 0df4
+0e01 0e30
+0e32 0e33
+0e40 0e46
+0e4f 0e5b
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb0
+0eb2 0eb3
+0ebd
+0ec0 0ec4
+0ec6
+0ed0 0ed9
+0edc 0edd
+0f00 0f17
+0f1a 0f34
+0f36
+0f38
+0f3e 0f47
+0f49 0f6a
+0f7f
+0f85
+0f88 0f8b
+0fbe 0fc5
+0fc7 0fcc
+0fcf
+1000 1021
+1023 1027
+1029 102a
+102c
+1031
+1038
+1040 1057
+10a0 10c5
+10d0 10f6
+10fb
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+1361 137c
+13a0 13f4
+1401 1676
+1681 169a
+16a0 16f0
+1780 17b6
+17be 17c5
+17c7 17c8
+17d4 17da
+17dc
+17e0 17e9
+1810 1819
+1820 1877
+1880 18a8
+1e00 1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1fb4
+1fb6 1fbc
+1fbe
+1fc2 1fc4
+1fc6 1fcc
+1fd0 1fd3
+1fd6 1fdb
+1fe0 1fec
+1ff2 1ff4
+1ff6 1ffc
+200e
+207f
+2102
+2107
+210a 2113
+2115
+2119 211d
+2124
+2126
+2128
+212a 212d
+212f 2131
+2133 2139
+2160 2183
+2336 237a
+2395
+249c 24e9
+3005 3007
+3021 3029
+3031 3035
+3038 303a
+3041 3094
+309d 309e
+30a1 30fa
+30fc 30fe
+3105 312c
+3131 318e
+3190 31b7
+3200 321c
+3220 3243
+3260 327b
+327f 32b0
+32c0 32cb
+32d0 32fe
+3300 3376
+337b 33dd
+33e0 33fe
+3400 4db5
+4e00 9fa5
+a000 a48c
+ac00 d7a3
+d800 db7f
+db80 dbff
+dc00 dfff
+e000 f8ff
+f900 fa2d
+fb00 fb06
+fb13 fb17
+ff21 ff3a
+ff41 ff5a
+ff66 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiON.pl b/contrib/perl5/lib/unicode/Is/BidiON.pl
new file mode 100644
index 0000000..bde00ff
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiON.pl
@@ -0,0 +1,115 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0021 0022
+0026 002a
+003b 0040
+005b 0060
+007b 007e
+00a1
+00a6 00a9
+00ab 00af
+00b4
+00b6 00b8
+00bb 00bf
+00d7
+00f7
+02b9 02ba
+02c2 02cf
+02d2 02df
+02e5 02ed
+0374 0375
+037e
+0384 0385
+0387
+058a
+06e9
+0f3a 0f3d
+169b 169c
+1800 180a
+1fbd
+1fbf 1fc1
+1fcd 1fcf
+1fdd 1fdf
+1fed 1fef
+1ffd 1ffe
+2010 2027
+2035 2046
+2048 204d
+207c 207e
+208c 208e
+2100 2101
+2103 2106
+2108 2109
+2114
+2116 2118
+211e 2123
+2125
+2127
+2129
+2132
+213a
+2153 215f
+2190 21f3
+2200 2211
+2214 22f1
+2300 2335
+237b
+237d 2394
+2396 239a
+2400 2426
+2440 244a
+2500 2595
+25a0 25f7
+2600 2613
+2619 2671
+2701 2704
+2706 2709
+270c 2727
+2729 274b
+274d
+274f 2752
+2756
+2758 275e
+2761 2767
+2776 2794
+2798 27af
+27b1 27be
+2800 28ff
+2e80 2e99
+2e9b 2ef3
+2f00 2fd5
+2ff0 2ffb
+3001 3004
+3008 3020
+3030
+3036 3037
+303e 303f
+309b 309c
+30fb
+a490 a4a1
+a4a4 a4b3
+a4b5 a4c0
+a4c2 a4c4
+a4c6
+fd3e fd3f
+fe30 fe44
+fe49 fe4f
+fe51
+fe54
+fe56 fe5e
+fe60 fe61
+fe64 fe66
+fe68
+fe6b
+ff01 ff02
+ff06 ff0a
+ff1b ff20
+ff3b ff40
+ff5b ff5e
+ff61 ff65
+ffe2 ffe4
+ffe8 ffee
+fffc fffd
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiR.pl b/contrib/perl5/lib/unicode/Is/BidiR.pl
new file mode 100644
index 0000000..fccc1f6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiR.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+05be
+05c0
+05c3
+05d0 05ea
+05f0 05f4
+200f
+fb1d
+fb1f fb28
+fb2a fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fb4f
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiS.pl b/contrib/perl5/lib/unicode/Is/BidiS.pl
new file mode 100644
index 0000000..b28b331
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiS.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0009
+000b
+001f
+END
diff --git a/contrib/perl5/lib/unicode/Is/BidiWS.pl b/contrib/perl5/lib/unicode/Is/BidiWS.pl
new file mode 100644
index 0000000..25d8b8f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/BidiWS.pl
@@ -0,0 +1,12 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+000c
+0020
+1680
+2000 200a
+2028
+202f
+3000
+END
diff --git a/contrib/perl5/lib/unicode/Is/C.pl b/contrib/perl5/lib/unicode/Is/C.pl
new file mode 100644
index 0000000..0db83c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/C.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 001f
+007f 009f
+070f
+180b 180e
+200c 200f
+202a 202e
+206a 206f
+d800 db7f
+db80 dbff
+dc00 dfff
+e000 f8ff
+feff
+fff9 fffb
+END
diff --git a/contrib/perl5/lib/unicode/Is/Cc.pl b/contrib/perl5/lib/unicode/Is/Cc.pl
new file mode 100644
index 0000000..d7184e3
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Cc.pl
@@ -0,0 +1,7 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 001f
+007f 009f
+END
diff --git a/contrib/perl5/lib/unicode/Is/Cn.pl b/contrib/perl5/lib/unicode/Is/Cn.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Cn.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/Cntrl.pl b/contrib/perl5/lib/unicode/Is/Cntrl.pl
new file mode 100644
index 0000000..0db83c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Cntrl.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 001f
+007f 009f
+070f
+180b 180e
+200c 200f
+202a 202e
+206a 206f
+d800 db7f
+db80 dbff
+dc00 dfff
+e000 f8ff
+feff
+fff9 fffb
+END
diff --git a/contrib/perl5/lib/unicode/Is/Co.pl b/contrib/perl5/lib/unicode/Is/Co.pl
new file mode 100644
index 0000000..c456d33
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Co.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+e000 f8ff
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCcircle.pl b/contrib/perl5/lib/unicode/Is/DCcircle.pl
new file mode 100644
index 0000000..4c47b28
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCcircle.pl
@@ -0,0 +1,10 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2460 2473
+24b6 24ea
+3260 327b
+3280 32b0
+32d0 32fe
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCcompat.pl b/contrib/perl5/lib/unicode/Is/DCcompat.pl
new file mode 100644
index 0000000..75d2569
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCcompat.pl
@@ -0,0 +1,69 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00a8
+00af
+00b4 00b5
+00b8
+0132 0133
+013f 0140
+0149
+017f
+01c4 01cc
+01f1 01f3
+02d8 02dd
+037a
+0384
+03d0 03d2
+03d5 03d6
+03f0 03f2
+0587
+0675 0678
+0e33
+0eb3
+0edc 0edd
+0f77
+0f79
+1e9a
+1fbd
+1fbf 1fc0
+1ffe
+2002 2006
+2008 200a
+2017
+2024 2026
+2033 2034
+2036 2037
+203c
+203e
+2048 2049
+20a8
+2100 2101
+2103
+2105 2107
+2109
+2116
+2121
+2135 2138
+2160 217f
+222c 222d
+222f 2230
+2474 24b5
+2e9f
+2ef3
+2f00 2fd5
+3036
+3038 303a
+309b 309c
+3131 318e
+3200 321c
+3220 3243
+32c0 32cb
+3358 3370
+33e0 33fe
+fb00 fb06
+fb13 fb17
+fb4f
+fe49 fe4f
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCfinal.pl b/contrib/perl5/lib/unicode/Is/DCfinal.pl
new file mode 100644
index 0000000..33fbf6a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCfinal.pl
@@ -0,0 +1,118 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+fb51
+fb53
+fb57
+fb5b
+fb5f
+fb63
+fb67
+fb6b
+fb6f
+fb73
+fb77
+fb7b
+fb7f
+fb83
+fb85
+fb87
+fb89
+fb8b
+fb8d
+fb8f
+fb93
+fb97
+fb9b
+fb9f
+fba1
+fba5
+fba7
+fbab
+fbaf
+fbb1
+fbd4
+fbd8
+fbda
+fbdc
+fbdf
+fbe1
+fbe3
+fbe5
+fbeb
+fbed
+fbef
+fbf1
+fbf3
+fbf5
+fbf7
+fbfa
+fbfd
+fc64 fc96
+fd11 fd2c
+fd3c
+fd51
+fd58
+fd5a fd5b
+fd5e fd5f
+fd62
+fd64
+fd66 fd67
+fd69 fd6a
+fd6c
+fd6e fd6f
+fd71
+fd74 fd76
+fd78 fd7c
+fd7e fd82
+fd84 fd85
+fd87
+fd8b
+fd96 fd97
+fd99 fd9c
+fd9e fdb3
+fdb6 fdb7
+fdb9
+fdbb fdc2
+fdc6 fdc7
+fe82
+fe84
+fe86
+fe88
+fe8a
+fe8e
+fe90
+fe94
+fe96
+fe9a
+fe9e
+fea2
+fea6
+feaa
+feac
+feae
+feb0
+feb2
+feb6
+feba
+febe
+fec2
+fec6
+feca
+fece
+fed2
+fed6
+feda
+fede
+fee2
+fee6
+feea
+feee
+fef0
+fef2
+fef6
+fef8
+fefa
+fefc
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCfont.pl b/contrib/perl5/lib/unicode/Is/DCfont.pl
new file mode 100644
index 0000000..c72234b
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCfont.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2102
+210a 2113
+2115
+2119 211d
+2124
+2128
+212c 212d
+212f 2131
+2133 2134
+2139
+fb20 fb29
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCinital.pl b/contrib/perl5/lib/unicode/Is/DCinital.pl
new file mode 100644
index 0000000..2c9cf47
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCinital.pl
@@ -0,0 +1,59 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+fb55
+fb59
+fb5d
+fb61
+fb65
+fb69
+fb6d
+fb71
+fb75
+fb79
+fb7d
+fb81
+fb91
+fb95
+fb99
+fb9d
+fba3
+fba9
+fbad
+fbd6
+fbe7
+fbe9
+fbff
+fcdf fcf4
+fd34 fd3b
+fe71
+fe77
+fe79
+fe7b
+fe7d
+fe7f
+fe8c
+fe92
+fe98
+fe9c
+fea0
+fea4
+fea8
+feb4
+feb8
+febc
+fec0
+fec4
+fec8
+fecc
+fed0
+fed4
+fed8
+fedc
+fee0
+fee4
+fee8
+feec
+fef4
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCinitial.pl b/contrib/perl5/lib/unicode/Is/DCinitial.pl
new file mode 100644
index 0000000..0145b7d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCinitial.pl
@@ -0,0 +1,80 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+fb54
+fb58
+fb5c
+fb60
+fb64
+fb68
+fb6c
+fb70
+fb74
+fb78
+fb7c
+fb80
+fb90
+fb94
+fb98
+fb9c
+fba2
+fba8
+fbac
+fbd5
+fbe6
+fbe8
+fbf8
+fbfb
+fbfe
+fc97 fcde
+fd2d fd33
+fd50
+fd52 fd57
+fd59
+fd5c fd5d
+fd60 fd61
+fd63
+fd65
+fd68
+fd6b
+fd6d
+fd70
+fd72 fd73
+fd77
+fd7d
+fd83
+fd86
+fd88 fd8a
+fd8c fd8f
+fd92 fd95
+fd98
+fd9d
+fdb4 fdb5
+fdb8
+fdba
+fdc3 fdc5
+fe8b
+fe91
+fe97
+fe9b
+fe9f
+fea3
+fea7
+feb3
+feb7
+febb
+febf
+fec3
+fec7
+fecb
+fecf
+fed3
+fed7
+fedb
+fedf
+fee3
+fee7
+feeb
+fef3
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCisolated.pl b/contrib/perl5/lib/unicode/Is/DCisolated.pl
new file mode 100644
index 0000000..cc8541e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCisolated.pl
@@ -0,0 +1,103 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+fb50
+fb52
+fb56
+fb5a
+fb5e
+fb62
+fb66
+fb6a
+fb6e
+fb72
+fb76
+fb7a
+fb7e
+fb82
+fb84
+fb86
+fb88
+fb8a
+fb8c
+fb8e
+fb92
+fb96
+fb9a
+fb9e
+fba0
+fba4
+fba6
+fbaa
+fbae
+fbb0
+fbd3
+fbd7
+fbd9
+fbdb
+fbdd fbde
+fbe0
+fbe2
+fbe4
+fbea
+fbec
+fbee
+fbf0
+fbf2
+fbf4
+fbf6
+fbf9
+fbfc
+fc00 fc63
+fcf5 fd10
+fd3d
+fdf0 fdfb
+fe70
+fe72
+fe74
+fe76
+fe78
+fe7a
+fe7c
+fe7e
+fe80 fe81
+fe83
+fe85
+fe87
+fe89
+fe8d
+fe8f
+fe93
+fe95
+fe99
+fe9d
+fea1
+fea5
+fea9
+feab
+fead
+feaf
+feb1
+feb5
+feb9
+febd
+fec1
+fec5
+fec9
+fecd
+fed1
+fed5
+fed9
+fedd
+fee1
+fee5
+fee9
+feed
+feef
+fef1
+fef5
+fef7
+fef9
+fefb
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCnarrow.pl b/contrib/perl5/lib/unicode/Is/DCnarrow.pl
new file mode 100644
index 0000000..9417de1
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCnarrow.pl
@@ -0,0 +1,11 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+ff61 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+ffe8 ffee
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCnoBreak.pl b/contrib/perl5/lib/unicode/Is/DCnoBreak.pl
new file mode 100644
index 0000000..1fd9e87
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCnoBreak.pl
@@ -0,0 +1,10 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00a0
+0f0c
+2007
+2011
+202f
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCsmall.pl b/contrib/perl5/lib/unicode/Is/DCsmall.pl
new file mode 100644
index 0000000..f6c8069
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCsmall.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+fe50 fe52
+fe54 fe66
+fe68 fe6b
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCsquare.pl b/contrib/perl5/lib/unicode/Is/DCsquare.pl
new file mode 100644
index 0000000..b55fdd9
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCsquare.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3300 3357
+3371 3376
+337b 33dd
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCsub.pl b/contrib/perl5/lib/unicode/Is/DCsub.pl
new file mode 100644
index 0000000..98c4dfa
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCsub.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2080 208e
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCsuper.pl b/contrib/perl5/lib/unicode/Is/DCsuper.pl
new file mode 100644
index 0000000..865a26d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCsuper.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00aa
+00b2 00b3
+00b9 00ba
+02b0 02b8
+02e0 02e4
+2070
+2074 207f
+2120
+2122
+3192 319f
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCvertical.pl b/contrib/perl5/lib/unicode/Is/DCvertical.pl
new file mode 100644
index 0000000..5d55483
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCvertical.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+fe30 fe44
+END
diff --git a/contrib/perl5/lib/unicode/Is/DCwide.pl b/contrib/perl5/lib/unicode/Is/DCwide.pl
new file mode 100644
index 0000000..09dae19
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DCwide.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+3000
+ff01 ff5e
+ffe0 ffe6
+END
diff --git a/contrib/perl5/lib/unicode/Is/DecoCanon.pl b/contrib/perl5/lib/unicode/Is/DecoCanon.pl
new file mode 100644
index 0000000..c5a59f6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DecoCanon.pl
@@ -0,0 +1,212 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00c0 00c5
+00c7 00cf
+00d1 00d6
+00d9 00dd
+00e0 00e5
+00e7 00ef
+00f1 00f6
+00f9 00fd
+00ff 010f
+0112 0125
+0128 0130
+0134 0137
+0139 013e
+0143 0148
+014c 0151
+0154 0165
+0168 017e
+01a0 01a1
+01af 01b0
+01cd 01dc
+01de 01e3
+01e6 01f0
+01f4 01f5
+01f8 021b
+021e 021f
+0226 0233
+0340 0341
+0343 0344
+0374
+037e
+0385 038a
+038c
+038e 0390
+03aa 03b0
+03ca 03ce
+03d3 03d4
+0400 0401
+0403
+0407
+040c 040e
+0419
+0439
+0450 0451
+0453
+0457
+045c 045e
+0476 0477
+04c1 04c2
+04d0 04d3
+04d6 04d7
+04da 04df
+04e2 04e7
+04ea 04f5
+04f8 04f9
+0622 0626
+06c0
+06c2
+06d3
+0929
+0931
+0934
+0958 095f
+09cb 09cc
+09dc 09dd
+09df
+0a33
+0a36
+0a59 0a5b
+0a5e
+0b48
+0b4b 0b4c
+0b5c 0b5d
+0b94
+0bca 0bcc
+0c48
+0cc0
+0cc7 0cc8
+0cca 0ccb
+0d4a 0d4c
+0dda
+0ddc 0dde
+0f43
+0f4d
+0f52
+0f57
+0f5c
+0f69
+0f73
+0f75 0f76
+0f78
+0f81
+0f93
+0f9d
+0fa2
+0fa7
+0fac
+0fb9
+1026
+1e00 1e99
+1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1fb4
+1fb6 1fbc
+1fbe
+1fc1 1fc4
+1fc6 1fd3
+1fd6 1fdb
+1fdd 1fef
+1ff2 1ff4
+1ff6 1ffd
+2000 2001
+2126
+212a 212b
+219a 219b
+21ae
+21cd 21cf
+2204
+2209
+220c
+2224
+2226
+2241
+2244
+2247
+2249
+2260
+2262
+226d 2271
+2274 2275
+2278 2279
+2280 2281
+2284 2285
+2288 2289
+22ac 22af
+22e0 22e3
+22ea 22ed
+2329 232a
+304c
+304e
+3050
+3052
+3054
+3056
+3058
+305a
+305c
+305e
+3060
+3062
+3065
+3067
+3069
+3070 3071
+3073 3074
+3076 3077
+3079 307a
+307c 307d
+3094
+309e
+30ac
+30ae
+30b0
+30b2
+30b4
+30b6
+30b8
+30ba
+30bc
+30be
+30c0
+30c2
+30c5
+30c7
+30c9
+30d0 30d1
+30d3 30d4
+30d6 30d7
+30d9 30da
+30dc 30dd
+30f4
+30f7 30fa
+30fe
+f900 fa0d
+fa10
+fa12
+fa15 fa1e
+fa20
+fa22
+fa25 fa26
+fa2a fa2d
+fb1d
+fb1f
+fb2a fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fb4e
+END
diff --git a/contrib/perl5/lib/unicode/Is/DecoCompat.pl b/contrib/perl5/lib/unicode/Is/DecoCompat.pl
new file mode 100644
index 0000000..43d34fc
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/DecoCompat.pl
@@ -0,0 +1,107 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00a0
+00a8
+00aa
+00af
+00b2 00b5
+00b8 00ba
+00bc 00be
+0132 0133
+013f 0140
+0149
+017f
+01c4 01cc
+01f1 01f3
+02b0 02b8
+02d8 02dd
+02e0 02e4
+037a
+0384
+03d0 03d2
+03d5 03d6
+03f0 03f2
+0587
+0675 0678
+0e33
+0eb3
+0edc 0edd
+0f0c
+0f77
+0f79
+1e9a
+1fbd
+1fbf 1fc0
+1ffe
+2002 200a
+2011
+2017
+2024 2026
+202f
+2033 2034
+2036 2037
+203c
+203e
+2048 2049
+2070
+2074 208e
+20a8
+2100 2103
+2105 2107
+2109 2113
+2115 2116
+2119 211d
+2120 2122
+2124
+2128
+212c 212d
+212f 2131
+2133 2139
+2153 217f
+222c 222d
+222f 2230
+2460 24ea
+2e9f
+2ef3
+2f00 2fd5
+3000
+3036
+3038 303a
+309b 309c
+3131 318e
+3192 319f
+3200 321c
+3220 3243
+3260 327b
+3280 32b0
+32c0 32cb
+32d0 32fe
+3300 3376
+337b 33dd
+33e0 33fe
+fb00 fb06
+fb13 fb17
+fb20 fb29
+fb4f fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe30 fe44
+fe49 fe52
+fe54 fe66
+fe68 fe6b
+fe70 fe72
+fe74
+fe76 fefc
+ff01 ff5e
+ff61 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+ffe0 ffe6
+ffe8 ffee
+END
diff --git a/contrib/perl5/lib/unicode/Is/Digit.pl b/contrib/perl5/lib/unicode/Is/Digit.pl
new file mode 100644
index 0000000..2ab8156
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Digit.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039
+0660 0669
+06f0 06f9
+0966 096f
+09e6 09ef
+0a66 0a6f
+0ae6 0aef
+0b66 0b6f
+0be7 0bef
+0c66 0c6f
+0ce6 0cef
+0d66 0d6f
+0e50 0e59
+0ed0 0ed9
+0f20 0f29
+1040 1049
+1369 1371
+17e0 17e9
+1810 1819
+ff10 ff19
+END
diff --git a/contrib/perl5/lib/unicode/Is/Graph.pl b/contrib/perl5/lib/unicode/Is/Graph.pl
new file mode 100644
index 0000000..9c94bb7
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Graph.pl
@@ -0,0 +1,362 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0021 007e
+00a0 021f
+0222 0233
+0250 02ad
+02b0 02ee
+0300 034e
+0360 0362
+0374 0375
+037a
+037e
+0384 038a
+038c
+038e 03a1
+03a3 03ce
+03d0 03d7
+03da 03f3
+0400 0486
+0488 0489
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0559 055f
+0561 0587
+0589 058a
+0591 05a1
+05a3 05b9
+05bb 05c4
+05d0 05ea
+05f0 05f4
+060c
+061b
+061f
+0621 063a
+0640 0655
+0660 066d
+0670 06ed
+06f0 06fe
+0700 070d
+0710 072c
+0730 074a
+0780 07b0
+0901 0903
+0905 0939
+093c 094d
+0950 0954
+0958 0970
+0981 0983
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09bc
+09be 09c4
+09c7 09c8
+09cb 09cd
+09d7
+09dc 09dd
+09df 09e3
+09e6 09fa
+0a02
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a3c
+0a3e 0a42
+0a47 0a48
+0a4b 0a4d
+0a59 0a5c
+0a5e
+0a66 0a74
+0a81 0a83
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abc 0ac5
+0ac7 0ac9
+0acb 0acd
+0ad0
+0ae0
+0ae6 0aef
+0b01 0b03
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3c 0b43
+0b47 0b48
+0b4b 0b4d
+0b56 0b57
+0b5c 0b5d
+0b5f 0b61
+0b66 0b70
+0b82 0b83
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0bbe 0bc2
+0bc6 0bc8
+0bca 0bcd
+0bd7
+0be7 0bf2
+0c01 0c03
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c3e 0c44
+0c46 0c48
+0c4a 0c4d
+0c55 0c56
+0c60 0c61
+0c66 0c6f
+0c82 0c83
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cbe 0cc4
+0cc6 0cc8
+0cca 0ccd
+0cd5 0cd6
+0cde
+0ce0 0ce1
+0ce6 0cef
+0d02 0d03
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d3e 0d43
+0d46 0d48
+0d4a 0d4d
+0d57
+0d60 0d61
+0d66 0d6f
+0d82 0d83
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0dca
+0dcf 0dd4
+0dd6
+0dd8 0ddf
+0df2 0df4
+0e01 0e3a
+0e3f 0e5b
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb9
+0ebb 0ebd
+0ec0 0ec4
+0ec6
+0ec8 0ecd
+0ed0 0ed9
+0edc 0edd
+0f00 0f47
+0f49 0f6a
+0f71 0f8b
+0f90 0f97
+0f99 0fbc
+0fbe 0fcc
+0fcf
+1000 1021
+1023 1027
+1029 102a
+102c 1032
+1036 1039
+1040 1059
+10a0 10c5
+10d0 10f6
+10fb
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+1361 137c
+13a0 13f4
+1401 1676
+1680 169c
+16a0 16f0
+1780 17dc
+17e0 17e9
+1800 180a
+1810 1819
+1820 1877
+1880 18a9
+1e00 1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1fb4
+1fb6 1fc4
+1fc6 1fd3
+1fd6 1fdb
+1fdd 1fef
+1ff2 1ff4
+1ff6 1ffe
+2000 200b
+2010 2029
+202f 2046
+2048 204d
+2070
+2074 208e
+20a0 20af
+20d0 20e3
+2100 213a
+2153 2183
+2190 21f3
+2200 22f1
+2300 237b
+237d 239a
+2400 2426
+2440 244a
+2460 24ea
+2500 2595
+25a0 25f7
+2600 2613
+2619 2671
+2701 2704
+2706 2709
+270c 2727
+2729 274b
+274d
+274f 2752
+2756
+2758 275e
+2761 2767
+2776 2794
+2798 27af
+27b1 27be
+2800 28ff
+2e80 2e99
+2e9b 2ef3
+2f00 2fd5
+2ff0 2ffb
+3000 303a
+303e 303f
+3041 3094
+3099 309e
+30a1 30fe
+3105 312c
+3131 318e
+3190 31b7
+3200 321c
+3220 3243
+3260 327b
+327f 32b0
+32c0 32cb
+32d0 32fe
+3300 3376
+337b 33dd
+33e0 33fe
+3400 4db5
+4e00 9fa5
+a000 a48c
+a490 a4a1
+a4a4 a4b3
+a4b5 a4c0
+a4c2 a4c4
+a4c6
+ac00 d7a3
+f900 fa2d
+fb00 fb06
+fb13 fb17
+fb1d fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3f
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe20 fe23
+fe30 fe44
+fe49 fe52
+fe54 fe66
+fe68 fe6b
+fe70 fe72
+fe74
+fe76 fefc
+ff01 ff5e
+ff61 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+ffe0 ffe6
+ffe8 ffee
+fffc fffd
+END
diff --git a/contrib/perl5/lib/unicode/Is/L.pl b/contrib/perl5/lib/unicode/Is/L.pl
new file mode 100644
index 0000000..c32f830
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/L.pl
@@ -0,0 +1,260 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0041 005a
+0061 007a
+00aa
+00b5
+00ba
+00c0 00d6
+00d8 00f6
+00f8 021f
+0222 0233
+0250 02ad
+02b0 02b8
+02bb 02c1
+02d0 02d1
+02e0 02e4
+02ee
+037a
+0386
+0388 038a
+038c
+038e 03a1
+03a3 03ce
+03d0 03d7
+03da 03f3
+0400 0481
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0559
+0561 0587
+05d0 05ea
+05f0 05f2
+0621 063a
+0640 064a
+0671 06d3
+06d5
+06e5 06e6
+06fa 06fc
+0710
+0712 072c
+0780 07a5
+0905 0939
+093d
+0950
+0958 0961
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09dc 09dd
+09df 09e1
+09f0 09f1
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a59 0a5c
+0a5e
+0a72 0a74
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abd
+0ad0
+0ae0
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3d
+0b5c 0b5d
+0b5f 0b61
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c60 0c61
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cde
+0ce0 0ce1
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d60 0d61
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0e01 0e30
+0e32 0e33
+0e40 0e46
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb0
+0eb2 0eb3
+0ebd
+0ec0 0ec4
+0ec6
+0edc 0edd
+0f00
+0f40 0f47
+0f49 0f6a
+0f88 0f8b
+1000 1021
+1023 1027
+1029 102a
+1050 1055
+10a0 10c5
+10d0 10f6
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+13a0 13f4
+1401 166c
+166f 1676
+1681 169a
+16a0 16ea
+1780 17b3
+1820 1877
+1880 18a8
+1e00 1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1fb4
+1fb6 1fbc
+1fbe
+1fc2 1fc4
+1fc6 1fcc
+1fd0 1fd3
+1fd6 1fdb
+1fe0 1fec
+1ff2 1ff4
+1ff6 1ffc
+207f
+2102
+2107
+210a 2113
+2115
+2119 211d
+2124
+2126
+2128
+212a 212d
+212f 2131
+2133 2139
+3005 3006
+3031 3035
+3041 3094
+309d 309e
+30a1 30fa
+30fc 30fe
+3105 312c
+3131 318e
+31a0 31b7
+3400 4db5
+4e00 9fa5
+a000 a48c
+ac00 d7a3
+f900 fa2d
+fb00 fb06
+fb13 fb17
+fb1d
+fb1f fb28
+fb2a fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe70 fe72
+fe74
+fe76 fefc
+ff21 ff3a
+ff41 ff5a
+ff66 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+END
diff --git a/contrib/perl5/lib/unicode/Is/Ll.pl b/contrib/perl5/lib/unicode/Is/Ll.pl
new file mode 100644
index 0000000..2814794
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Ll.pl
@@ -0,0 +1,379 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0061 007a
+00aa
+00b5
+00ba
+00df 00f6
+00f8 00ff
+0101
+0103
+0105
+0107
+0109
+010b
+010d
+010f
+0111
+0113
+0115
+0117
+0119
+011b
+011d
+011f
+0121
+0123
+0125
+0127
+0129
+012b
+012d
+012f
+0131
+0133
+0135
+0137 0138
+013a
+013c
+013e
+0140
+0142
+0144
+0146
+0148 0149
+014b
+014d
+014f
+0151
+0153
+0155
+0157
+0159
+015b
+015d
+015f
+0161
+0163
+0165
+0167
+0169
+016b
+016d
+016f
+0171
+0173
+0175
+0177
+017a
+017c
+017e 0180
+0183
+0185
+0188
+018c 018d
+0192
+0195
+0199 019b
+019e
+01a1
+01a3
+01a5
+01a8
+01aa 01ab
+01ad
+01b0
+01b4
+01b6
+01b9 01ba
+01bd 01bf
+01c6
+01c9
+01cc
+01ce
+01d0
+01d2
+01d4
+01d6
+01d8
+01da
+01dc 01dd
+01df
+01e1
+01e3
+01e5
+01e7
+01e9
+01eb
+01ed
+01ef 01f0
+01f3
+01f5
+01f9
+01fb
+01fd
+01ff
+0201
+0203
+0205
+0207
+0209
+020b
+020d
+020f
+0211
+0213
+0215
+0217
+0219
+021b
+021d
+021f
+0223
+0225
+0227
+0229
+022b
+022d
+022f
+0231
+0233
+0250 02ad
+0390
+03ac 03ce
+03d0 03d1
+03d5 03d7
+03db
+03dd
+03df
+03e1
+03e3
+03e5
+03e7
+03e9
+03eb
+03ed
+03ef 03f3
+0430 045f
+0461
+0463
+0465
+0467
+0469
+046b
+046d
+046f
+0471
+0473
+0475
+0477
+0479
+047b
+047d
+047f
+0481
+048d
+048f
+0491
+0493
+0495
+0497
+0499
+049b
+049d
+049f
+04a1
+04a3
+04a5
+04a7
+04a9
+04ab
+04ad
+04af
+04b1
+04b3
+04b5
+04b7
+04b9
+04bb
+04bd
+04bf
+04c2
+04c4
+04c8
+04cc
+04d1
+04d3
+04d5
+04d7
+04d9
+04db
+04dd
+04df
+04e1
+04e3
+04e5
+04e7
+04e9
+04eb
+04ed
+04ef
+04f1
+04f3
+04f5
+04f9
+0561 0587
+1e01
+1e03
+1e05
+1e07
+1e09
+1e0b
+1e0d
+1e0f
+1e11
+1e13
+1e15
+1e17
+1e19
+1e1b
+1e1d
+1e1f
+1e21
+1e23
+1e25
+1e27
+1e29
+1e2b
+1e2d
+1e2f
+1e31
+1e33
+1e35
+1e37
+1e39
+1e3b
+1e3d
+1e3f
+1e41
+1e43
+1e45
+1e47
+1e49
+1e4b
+1e4d
+1e4f
+1e51
+1e53
+1e55
+1e57
+1e59
+1e5b
+1e5d
+1e5f
+1e61
+1e63
+1e65
+1e67
+1e69
+1e6b
+1e6d
+1e6f
+1e71
+1e73
+1e75
+1e77
+1e79
+1e7b
+1e7d
+1e7f
+1e81
+1e83
+1e85
+1e87
+1e89
+1e8b
+1e8d
+1e8f
+1e91
+1e93
+1e95 1e9b
+1ea1
+1ea3
+1ea5
+1ea7
+1ea9
+1eab
+1ead
+1eaf
+1eb1
+1eb3
+1eb5
+1eb7
+1eb9
+1ebb
+1ebd
+1ebf
+1ec1
+1ec3
+1ec5
+1ec7
+1ec9
+1ecb
+1ecd
+1ecf
+1ed1
+1ed3
+1ed5
+1ed7
+1ed9
+1edb
+1edd
+1edf
+1ee1
+1ee3
+1ee5
+1ee7
+1ee9
+1eeb
+1eed
+1eef
+1ef1
+1ef3
+1ef5
+1ef7
+1ef9
+1f00 1f07
+1f10 1f15
+1f20 1f27
+1f30 1f37
+1f40 1f45
+1f50 1f57
+1f60 1f67
+1f70 1f7d
+1f80 1f87
+1f90 1f97
+1fa0 1fa7
+1fb0 1fb4
+1fb6 1fb7
+1fbe
+1fc2 1fc4
+1fc6 1fc7
+1fd0 1fd3
+1fd6 1fd7
+1fe0 1fe7
+1ff2 1ff4
+1ff6 1ff7
+207f
+210a
+210e 210f
+2113
+212f
+2134
+2139
+fb00 fb06
+fb13 fb17
+ff41 ff5a
+END
diff --git a/contrib/perl5/lib/unicode/Is/Lm.pl b/contrib/perl5/lib/unicode/Is/Lm.pl
new file mode 100644
index 0000000..4380afe
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Lm.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+02b0 02b8
+02bb 02c1
+02d0 02d1
+02e0 02e4
+02ee
+037a
+0559
+0640
+06e5 06e6
+0e46
+0ec6
+1843
+3005
+3031 3035
+309d 309e
+30fc 30fe
+ff70
+ff9e ff9f
+END
diff --git a/contrib/perl5/lib/unicode/Is/Lo.pl b/contrib/perl5/lib/unicode/Is/Lo.pl
new file mode 100644
index 0000000..78fab4c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Lo.pl
@@ -0,0 +1,191 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+01bb
+01c0 01c3
+05d0 05ea
+05f0 05f2
+0621 063a
+0641 064a
+0671 06d3
+06d5
+06fa 06fc
+0710
+0712 072c
+0780 07a5
+0905 0939
+093d
+0950
+0958 0961
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09dc 09dd
+09df 09e1
+09f0 09f1
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a59 0a5c
+0a5e
+0a72 0a74
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abd
+0ad0
+0ae0
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3d
+0b5c 0b5d
+0b5f 0b61
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c60 0c61
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cde
+0ce0 0ce1
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d60 0d61
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0e01 0e30
+0e32 0e33
+0e40 0e45
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb0
+0eb2 0eb3
+0ebd
+0ec0 0ec4
+0edc 0edd
+0f00
+0f40 0f47
+0f49 0f6a
+0f88 0f8b
+1000 1021
+1023 1027
+1029 102a
+1050 1055
+10d0 10f6
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+13a0 13f4
+1401 166c
+166f 1676
+1681 169a
+16a0 16ea
+1780 17b3
+1820 1842
+1844 1877
+1880 18a8
+2135 2138
+3006
+3041 3094
+30a1 30fa
+3105 312c
+3131 318e
+31a0 31b7
+3400 4db5
+4e00 9fa5
+a000 a48c
+ac00 d7a3
+f900 fa2d
+fb1d
+fb1f fb28
+fb2a fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe70 fe72
+fe74
+fe76 fefc
+ff66 ff6f
+ff71 ff9d
+ffa0 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+END
diff --git a/contrib/perl5/lib/unicode/Is/Lower.pl b/contrib/perl5/lib/unicode/Is/Lower.pl
new file mode 100644
index 0000000..2814794
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Lower.pl
@@ -0,0 +1,379 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0061 007a
+00aa
+00b5
+00ba
+00df 00f6
+00f8 00ff
+0101
+0103
+0105
+0107
+0109
+010b
+010d
+010f
+0111
+0113
+0115
+0117
+0119
+011b
+011d
+011f
+0121
+0123
+0125
+0127
+0129
+012b
+012d
+012f
+0131
+0133
+0135
+0137 0138
+013a
+013c
+013e
+0140
+0142
+0144
+0146
+0148 0149
+014b
+014d
+014f
+0151
+0153
+0155
+0157
+0159
+015b
+015d
+015f
+0161
+0163
+0165
+0167
+0169
+016b
+016d
+016f
+0171
+0173
+0175
+0177
+017a
+017c
+017e 0180
+0183
+0185
+0188
+018c 018d
+0192
+0195
+0199 019b
+019e
+01a1
+01a3
+01a5
+01a8
+01aa 01ab
+01ad
+01b0
+01b4
+01b6
+01b9 01ba
+01bd 01bf
+01c6
+01c9
+01cc
+01ce
+01d0
+01d2
+01d4
+01d6
+01d8
+01da
+01dc 01dd
+01df
+01e1
+01e3
+01e5
+01e7
+01e9
+01eb
+01ed
+01ef 01f0
+01f3
+01f5
+01f9
+01fb
+01fd
+01ff
+0201
+0203
+0205
+0207
+0209
+020b
+020d
+020f
+0211
+0213
+0215
+0217
+0219
+021b
+021d
+021f
+0223
+0225
+0227
+0229
+022b
+022d
+022f
+0231
+0233
+0250 02ad
+0390
+03ac 03ce
+03d0 03d1
+03d5 03d7
+03db
+03dd
+03df
+03e1
+03e3
+03e5
+03e7
+03e9
+03eb
+03ed
+03ef 03f3
+0430 045f
+0461
+0463
+0465
+0467
+0469
+046b
+046d
+046f
+0471
+0473
+0475
+0477
+0479
+047b
+047d
+047f
+0481
+048d
+048f
+0491
+0493
+0495
+0497
+0499
+049b
+049d
+049f
+04a1
+04a3
+04a5
+04a7
+04a9
+04ab
+04ad
+04af
+04b1
+04b3
+04b5
+04b7
+04b9
+04bb
+04bd
+04bf
+04c2
+04c4
+04c8
+04cc
+04d1
+04d3
+04d5
+04d7
+04d9
+04db
+04dd
+04df
+04e1
+04e3
+04e5
+04e7
+04e9
+04eb
+04ed
+04ef
+04f1
+04f3
+04f5
+04f9
+0561 0587
+1e01
+1e03
+1e05
+1e07
+1e09
+1e0b
+1e0d
+1e0f
+1e11
+1e13
+1e15
+1e17
+1e19
+1e1b
+1e1d
+1e1f
+1e21
+1e23
+1e25
+1e27
+1e29
+1e2b
+1e2d
+1e2f
+1e31
+1e33
+1e35
+1e37
+1e39
+1e3b
+1e3d
+1e3f
+1e41
+1e43
+1e45
+1e47
+1e49
+1e4b
+1e4d
+1e4f
+1e51
+1e53
+1e55
+1e57
+1e59
+1e5b
+1e5d
+1e5f
+1e61
+1e63
+1e65
+1e67
+1e69
+1e6b
+1e6d
+1e6f
+1e71
+1e73
+1e75
+1e77
+1e79
+1e7b
+1e7d
+1e7f
+1e81
+1e83
+1e85
+1e87
+1e89
+1e8b
+1e8d
+1e8f
+1e91
+1e93
+1e95 1e9b
+1ea1
+1ea3
+1ea5
+1ea7
+1ea9
+1eab
+1ead
+1eaf
+1eb1
+1eb3
+1eb5
+1eb7
+1eb9
+1ebb
+1ebd
+1ebf
+1ec1
+1ec3
+1ec5
+1ec7
+1ec9
+1ecb
+1ecd
+1ecf
+1ed1
+1ed3
+1ed5
+1ed7
+1ed9
+1edb
+1edd
+1edf
+1ee1
+1ee3
+1ee5
+1ee7
+1ee9
+1eeb
+1eed
+1eef
+1ef1
+1ef3
+1ef5
+1ef7
+1ef9
+1f00 1f07
+1f10 1f15
+1f20 1f27
+1f30 1f37
+1f40 1f45
+1f50 1f57
+1f60 1f67
+1f70 1f7d
+1f80 1f87
+1f90 1f97
+1fa0 1fa7
+1fb0 1fb4
+1fb6 1fb7
+1fbe
+1fc2 1fc4
+1fc6 1fc7
+1fd0 1fd3
+1fd6 1fd7
+1fe0 1fe7
+1ff2 1ff4
+1ff6 1ff7
+207f
+210a
+210e 210f
+2113
+212f
+2134
+2139
+fb00 fb06
+fb13 fb17
+ff41 ff5a
+END
diff --git a/contrib/perl5/lib/unicode/Is/Lt.pl b/contrib/perl5/lib/unicode/Is/Lt.pl
new file mode 100644
index 0000000..809c37a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Lt.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+01c5
+01c8
+01cb
+01f2
+1f88 1f8f
+1f98 1f9f
+1fa8 1faf
+1fbc
+1fcc
+1ffc
+END
diff --git a/contrib/perl5/lib/unicode/Is/Lu.pl b/contrib/perl5/lib/unicode/Is/Lu.pl
new file mode 100644
index 0000000..8dde274
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Lu.pl
@@ -0,0 +1,376 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0041 005a
+00c0 00d6
+00d8 00de
+0100
+0102
+0104
+0106
+0108
+010a
+010c
+010e
+0110
+0112
+0114
+0116
+0118
+011a
+011c
+011e
+0120
+0122
+0124
+0126
+0128
+012a
+012c
+012e
+0130
+0132
+0134
+0136
+0139
+013b
+013d
+013f
+0141
+0143
+0145
+0147
+014a
+014c
+014e
+0150
+0152
+0154
+0156
+0158
+015a
+015c
+015e
+0160
+0162
+0164
+0166
+0168
+016a
+016c
+016e
+0170
+0172
+0174
+0176
+0178 0179
+017b
+017d
+0181 0182
+0184
+0186 0187
+0189 018b
+018e 0191
+0193 0194
+0196 0198
+019c 019d
+019f 01a0
+01a2
+01a4
+01a6 01a7
+01a9
+01ac
+01ae 01af
+01b1 01b3
+01b5
+01b7 01b8
+01bc
+01c4
+01c7
+01ca
+01cd
+01cf
+01d1
+01d3
+01d5
+01d7
+01d9
+01db
+01de
+01e0
+01e2
+01e4
+01e6
+01e8
+01ea
+01ec
+01ee
+01f1
+01f4
+01f6 01f8
+01fa
+01fc
+01fe
+0200
+0202
+0204
+0206
+0208
+020a
+020c
+020e
+0210
+0212
+0214
+0216
+0218
+021a
+021c
+021e
+0222
+0224
+0226
+0228
+022a
+022c
+022e
+0230
+0232
+0386
+0388 038a
+038c
+038e 038f
+0391 03a1
+03a3 03ab
+03d2 03d4
+03da
+03dc
+03de
+03e0
+03e2
+03e4
+03e6
+03e8
+03ea
+03ec
+03ee
+0400 042f
+0460
+0462
+0464
+0466
+0468
+046a
+046c
+046e
+0470
+0472
+0474
+0476
+0478
+047a
+047c
+047e
+0480
+048c
+048e
+0490
+0492
+0494
+0496
+0498
+049a
+049c
+049e
+04a0
+04a2
+04a4
+04a6
+04a8
+04aa
+04ac
+04ae
+04b0
+04b2
+04b4
+04b6
+04b8
+04ba
+04bc
+04be
+04c0 04c1
+04c3
+04c7
+04cb
+04d0
+04d2
+04d4
+04d6
+04d8
+04da
+04dc
+04de
+04e0
+04e2
+04e4
+04e6
+04e8
+04ea
+04ec
+04ee
+04f0
+04f2
+04f4
+04f8
+0531 0556
+10a0 10c5
+1e00
+1e02
+1e04
+1e06
+1e08
+1e0a
+1e0c
+1e0e
+1e10
+1e12
+1e14
+1e16
+1e18
+1e1a
+1e1c
+1e1e
+1e20
+1e22
+1e24
+1e26
+1e28
+1e2a
+1e2c
+1e2e
+1e30
+1e32
+1e34
+1e36
+1e38
+1e3a
+1e3c
+1e3e
+1e40
+1e42
+1e44
+1e46
+1e48
+1e4a
+1e4c
+1e4e
+1e50
+1e52
+1e54
+1e56
+1e58
+1e5a
+1e5c
+1e5e
+1e60
+1e62
+1e64
+1e66
+1e68
+1e6a
+1e6c
+1e6e
+1e70
+1e72
+1e74
+1e76
+1e78
+1e7a
+1e7c
+1e7e
+1e80
+1e82
+1e84
+1e86
+1e88
+1e8a
+1e8c
+1e8e
+1e90
+1e92
+1e94
+1ea0
+1ea2
+1ea4
+1ea6
+1ea8
+1eaa
+1eac
+1eae
+1eb0
+1eb2
+1eb4
+1eb6
+1eb8
+1eba
+1ebc
+1ebe
+1ec0
+1ec2
+1ec4
+1ec6
+1ec8
+1eca
+1ecc
+1ece
+1ed0
+1ed2
+1ed4
+1ed6
+1ed8
+1eda
+1edc
+1ede
+1ee0
+1ee2
+1ee4
+1ee6
+1ee8
+1eea
+1eec
+1eee
+1ef0
+1ef2
+1ef4
+1ef6
+1ef8
+1f08 1f0f
+1f18 1f1d
+1f28 1f2f
+1f38 1f3f
+1f48 1f4d
+1f59
+1f5b
+1f5d
+1f5f
+1f68 1f6f
+1fb8 1fbb
+1fc8 1fcb
+1fd8 1fdb
+1fe8 1fec
+1ff8 1ffb
+2102
+2107
+210b 210d
+2110 2112
+2115
+2119 211d
+2124
+2126
+2128
+212a 212d
+2130 2131
+2133
+ff21 ff3a
+END
diff --git a/contrib/perl5/lib/unicode/Is/M.pl b/contrib/perl5/lib/unicode/Is/M.pl
new file mode 100644
index 0000000..9367775
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/M.pl
@@ -0,0 +1,105 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0300 034e
+0360 0362
+0483 0486
+0488 0489
+0591 05a1
+05a3 05b9
+05bb 05bd
+05bf
+05c1 05c2
+05c4
+064b 0655
+0670
+06d6 06e4
+06e7 06e8
+06ea 06ed
+0711
+0730 074a
+07a6 07b0
+0901 0903
+093c
+093e 094d
+0951 0954
+0962 0963
+0981 0983
+09bc
+09be 09c4
+09c7 09c8
+09cb 09cd
+09d7
+09e2 09e3
+0a02
+0a3c
+0a3e 0a42
+0a47 0a48
+0a4b 0a4d
+0a70 0a71
+0a81 0a83
+0abc
+0abe 0ac5
+0ac7 0ac9
+0acb 0acd
+0b01 0b03
+0b3c
+0b3e 0b43
+0b47 0b48
+0b4b 0b4d
+0b56 0b57
+0b82 0b83
+0bbe 0bc2
+0bc6 0bc8
+0bca 0bcd
+0bd7
+0c01 0c03
+0c3e 0c44
+0c46 0c48
+0c4a 0c4d
+0c55 0c56
+0c82 0c83
+0cbe 0cc4
+0cc6 0cc8
+0cca 0ccd
+0cd5 0cd6
+0d02 0d03
+0d3e 0d43
+0d46 0d48
+0d4a 0d4d
+0d57
+0d82 0d83
+0dca
+0dcf 0dd4
+0dd6
+0dd8 0ddf
+0df2 0df3
+0e31
+0e34 0e3a
+0e47 0e4e
+0eb1
+0eb4 0eb9
+0ebb 0ebc
+0ec8 0ecd
+0f18 0f19
+0f35
+0f37
+0f39
+0f3e 0f3f
+0f71 0f84
+0f86 0f87
+0f90 0f97
+0f99 0fbc
+0fc6
+102c 1032
+1036 1039
+1056 1059
+17b4 17d3
+18a9
+20d0 20e3
+302a 302f
+3099 309a
+fb1e
+fe20 fe23
+END
diff --git a/contrib/perl5/lib/unicode/Is/Mc.pl b/contrib/perl5/lib/unicode/Is/Mc.pl
new file mode 100644
index 0000000..937d8d4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Mc.pl
@@ -0,0 +1,56 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0903
+093e 0940
+0949 094c
+0982 0983
+09be 09c0
+09c7 09c8
+09cb 09cc
+09d7
+0a3e 0a40
+0a83
+0abe 0ac0
+0ac9
+0acb 0acc
+0b02 0b03
+0b3e
+0b40
+0b47 0b48
+0b4b 0b4c
+0b57
+0b83
+0bbe 0bbf
+0bc1 0bc2
+0bc6 0bc8
+0bca 0bcc
+0bd7
+0c01 0c03
+0c41 0c44
+0c82 0c83
+0cbe
+0cc0 0cc4
+0cc7 0cc8
+0cca 0ccb
+0cd5 0cd6
+0d02 0d03
+0d3e 0d40
+0d46 0d48
+0d4a 0d4c
+0d57
+0d82 0d83
+0dcf 0dd1
+0dd8 0ddf
+0df2 0df3
+0f3e 0f3f
+0f7f
+102c
+1031
+1038
+1056 1057
+17b4 17b6
+17be 17c5
+17c7 17c8
+END
diff --git a/contrib/perl5/lib/unicode/Is/Mirrored.pl b/contrib/perl5/lib/unicode/Is/Mirrored.pl
new file mode 100644
index 0000000..e2c55a6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Mirrored.pl
@@ -0,0 +1,48 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0028 0029
+003c
+003e
+005b
+005d
+007b
+007d
+00ab
+00bb
+2039 203a
+2045 2046
+207d 207e
+208d 208e
+2201 2204
+2208 220d
+2211
+2215 2216
+221a 221d
+221f 2222
+2224
+2226
+222b 2233
+2239
+223b 224c
+2252 2255
+225f 2260
+2262
+2264 226b
+226e 228c
+228f 2292
+2298
+22a2 22a3
+22a6 22b8
+22be 22bf
+22c9 22cd
+22d0 22d1
+22d6 22ed
+22f0 22f1
+2308 230b
+2320 2321
+2329 232a
+3008 3011
+3014 301b
+END
diff --git a/contrib/perl5/lib/unicode/Is/Mn.pl b/contrib/perl5/lib/unicode/Is/Mn.pl
new file mode 100644
index 0000000..aba40af
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Mn.pl
@@ -0,0 +1,98 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0300 034e
+0360 0362
+0483 0486
+0591 05a1
+05a3 05b9
+05bb 05bd
+05bf
+05c1 05c2
+05c4
+064b 0655
+0670
+06d6 06dc
+06df 06e4
+06e7 06e8
+06ea 06ed
+0711
+0730 074a
+07a6 07b0
+0901 0902
+093c
+0941 0948
+094d
+0951 0954
+0962 0963
+0981
+09bc
+09c1 09c4
+09cd
+09e2 09e3
+0a02
+0a3c
+0a41 0a42
+0a47 0a48
+0a4b 0a4d
+0a70 0a71
+0a81 0a82
+0abc
+0ac1 0ac5
+0ac7 0ac8
+0acd
+0b01
+0b3c
+0b3f
+0b41 0b43
+0b4d
+0b56
+0b82
+0bc0
+0bcd
+0c3e 0c40
+0c46 0c48
+0c4a 0c4d
+0c55 0c56
+0cbf
+0cc6
+0ccc 0ccd
+0d41 0d43
+0d4d
+0dca
+0dd2 0dd4
+0dd6
+0e31
+0e34 0e3a
+0e47 0e4e
+0eb1
+0eb4 0eb9
+0ebb 0ebc
+0ec8 0ecd
+0f18 0f19
+0f35
+0f37
+0f39
+0f71 0f7e
+0f80 0f84
+0f86 0f87
+0f90 0f97
+0f99 0fbc
+0fc6
+102d 1030
+1032
+1036 1037
+1039
+1058 1059
+17b7 17bd
+17c6
+17c9 17d3
+18a9
+20d0 20dc
+20e1
+302a 302f
+3099 309a
+fb1e
+fe20 fe23
+END
diff --git a/contrib/perl5/lib/unicode/Is/N.pl b/contrib/perl5/lib/unicode/Is/N.pl
new file mode 100644
index 0000000..1291f27
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/N.pl
@@ -0,0 +1,43 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039
+00b2 00b3
+00b9
+00bc 00be
+0660 0669
+06f0 06f9
+0966 096f
+09e6 09ef
+09f4 09f9
+0a66 0a6f
+0ae6 0aef
+0b66 0b6f
+0be7 0bf2
+0c66 0c6f
+0ce6 0cef
+0d66 0d6f
+0e50 0e59
+0ed0 0ed9
+0f20 0f33
+1040 1049
+1369 137c
+16ee 16f0
+17e0 17e9
+1810 1819
+2070
+2074 2079
+2080 2089
+2153 2183
+2460 249b
+24ea
+2776 2793
+3007
+3021 3029
+3038 303a
+3192 3195
+3220 3229
+3280 3289
+ff10 ff19
+END
diff --git a/contrib/perl5/lib/unicode/Is/Nd.pl b/contrib/perl5/lib/unicode/Is/Nd.pl
new file mode 100644
index 0000000..2ab8156
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Nd.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039
+0660 0669
+06f0 06f9
+0966 096f
+09e6 09ef
+0a66 0a6f
+0ae6 0aef
+0b66 0b6f
+0be7 0bef
+0c66 0c6f
+0ce6 0cef
+0d66 0d6f
+0e50 0e59
+0ed0 0ed9
+0f20 0f29
+1040 1049
+1369 1371
+17e0 17e9
+1810 1819
+ff10 ff19
+END
diff --git a/contrib/perl5/lib/unicode/Is/No.pl b/contrib/perl5/lib/unicode/Is/No.pl
new file mode 100644
index 0000000..6a57dc5
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/No.pl
@@ -0,0 +1,23 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00b2 00b3
+00b9
+00bc 00be
+09f4 09f9
+0bf0 0bf2
+0f2a 0f33
+1372 137c
+16ee 16f0
+2070
+2074 2079
+2080 2089
+2153 215f
+2460 249b
+24ea
+2776 2793
+3192 3195
+3220 3229
+3280 3289
+END
diff --git a/contrib/perl5/lib/unicode/Is/P.pl b/contrib/perl5/lib/unicode/Is/P.pl
new file mode 100644
index 0000000..8fd1e8e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/P.pl
@@ -0,0 +1,80 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0021 0023
+0025 002a
+002c 002f
+003a 003b
+003f 0040
+005b 005d
+005f
+007b
+007d
+00a1
+00ab
+00ad
+00b7
+00bb
+00bf
+037e
+0387
+055a 055f
+0589 058a
+05be
+05c0
+05c3
+05f3 05f4
+060c
+061b
+061f
+066a 066d
+06d4
+0700 070d
+0964 0965
+0970
+0df4
+0e4f
+0e5a 0e5b
+0f04 0f12
+0f3a 0f3d
+0f85
+104a 104f
+10fb
+1361 1368
+166d 166e
+169b 169c
+16eb 16ed
+17d4 17da
+17dc
+1800 180a
+2010 2027
+2030 2043
+2045 2046
+2048 204d
+207d 207e
+208d 208e
+2329 232a
+3001 3003
+3008 3011
+3014 301f
+3030
+30fb
+fd3e fd3f
+fe30 fe44
+fe49 fe52
+fe54 fe61
+fe63
+fe68
+fe6a fe6b
+ff01 ff03
+ff05 ff0a
+ff0c ff0f
+ff1a ff1b
+ff1f ff20
+ff3b ff3d
+ff3f
+ff5b
+ff5d
+ff61 ff65
+END
diff --git a/contrib/perl5/lib/unicode/Is/Pd.pl b/contrib/perl5/lib/unicode/Is/Pd.pl
new file mode 100644
index 0000000..58997ca
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Pd.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+002d
+00ad
+058a
+1806
+2010 2015
+301c
+3030
+fe31 fe32
+fe58
+fe63
+ff0d
+END
diff --git a/contrib/perl5/lib/unicode/Is/Pe.pl b/contrib/perl5/lib/unicode/Is/Pe.pl
new file mode 100644
index 0000000..8879191
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Pe.pl
@@ -0,0 +1,41 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0029
+005d
+007d
+0f3b
+0f3d
+169c
+2046
+207e
+208e
+232a
+3009
+300b
+300d
+300f
+3011
+3015
+3017
+3019
+301b
+301e 301f
+fd3f
+fe36
+fe38
+fe3a
+fe3c
+fe3e
+fe40
+fe42
+fe44
+fe5a
+fe5c
+fe5e
+ff09
+ff3d
+ff5d
+ff63
+END
diff --git a/contrib/perl5/lib/unicode/Is/Po.pl b/contrib/perl5/lib/unicode/Is/Po.pl
new file mode 100644
index 0000000..e6b8b02
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Po.pl
@@ -0,0 +1,70 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0021 0023
+0025 0027
+002a
+002c
+002e 002f
+003a 003b
+003f 0040
+005c
+00a1
+00b7
+00bf
+037e
+0387
+055a 055f
+0589
+05be
+05c0
+05c3
+05f3 05f4
+060c
+061b
+061f
+066a 066d
+06d4
+0700 070d
+0964 0965
+0970
+0df4
+0e4f
+0e5a 0e5b
+0f04 0f12
+0f85
+104a 104f
+10fb
+1361 1368
+166d 166e
+16eb 16ed
+17d4 17da
+17dc
+1800 1805
+1807 180a
+2016 2017
+2020 2027
+2030 2038
+203b 203e
+2041 2043
+2048 204d
+3001 3003
+fe30
+fe49 fe4c
+fe50 fe52
+fe54 fe57
+fe5f fe61
+fe68
+fe6a fe6b
+ff01 ff03
+ff05 ff07
+ff0a
+ff0c
+ff0e ff0f
+ff1a ff1b
+ff1f ff20
+ff3c
+ff61
+ff64
+END
diff --git a/contrib/perl5/lib/unicode/Is/Print.pl b/contrib/perl5/lib/unicode/Is/Print.pl
new file mode 100644
index 0000000..9560586
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Print.pl
@@ -0,0 +1,362 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0020 007e
+00a0 021f
+0222 0233
+0250 02ad
+02b0 02ee
+0300 034e
+0360 0362
+0374 0375
+037a
+037e
+0384 038a
+038c
+038e 03a1
+03a3 03ce
+03d0 03d7
+03da 03f3
+0400 0486
+0488 0489
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0559 055f
+0561 0587
+0589 058a
+0591 05a1
+05a3 05b9
+05bb 05c4
+05d0 05ea
+05f0 05f4
+060c
+061b
+061f
+0621 063a
+0640 0655
+0660 066d
+0670 06ed
+06f0 06fe
+0700 070d
+0710 072c
+0730 074a
+0780 07b0
+0901 0903
+0905 0939
+093c 094d
+0950 0954
+0958 0970
+0981 0983
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09bc
+09be 09c4
+09c7 09c8
+09cb 09cd
+09d7
+09dc 09dd
+09df 09e3
+09e6 09fa
+0a02
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a3c
+0a3e 0a42
+0a47 0a48
+0a4b 0a4d
+0a59 0a5c
+0a5e
+0a66 0a74
+0a81 0a83
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abc 0ac5
+0ac7 0ac9
+0acb 0acd
+0ad0
+0ae0
+0ae6 0aef
+0b01 0b03
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3c 0b43
+0b47 0b48
+0b4b 0b4d
+0b56 0b57
+0b5c 0b5d
+0b5f 0b61
+0b66 0b70
+0b82 0b83
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0bbe 0bc2
+0bc6 0bc8
+0bca 0bcd
+0bd7
+0be7 0bf2
+0c01 0c03
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c3e 0c44
+0c46 0c48
+0c4a 0c4d
+0c55 0c56
+0c60 0c61
+0c66 0c6f
+0c82 0c83
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cbe 0cc4
+0cc6 0cc8
+0cca 0ccd
+0cd5 0cd6
+0cde
+0ce0 0ce1
+0ce6 0cef
+0d02 0d03
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d3e 0d43
+0d46 0d48
+0d4a 0d4d
+0d57
+0d60 0d61
+0d66 0d6f
+0d82 0d83
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0dca
+0dcf 0dd4
+0dd6
+0dd8 0ddf
+0df2 0df4
+0e01 0e3a
+0e3f 0e5b
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb9
+0ebb 0ebd
+0ec0 0ec4
+0ec6
+0ec8 0ecd
+0ed0 0ed9
+0edc 0edd
+0f00 0f47
+0f49 0f6a
+0f71 0f8b
+0f90 0f97
+0f99 0fbc
+0fbe 0fcc
+0fcf
+1000 1021
+1023 1027
+1029 102a
+102c 1032
+1036 1039
+1040 1059
+10a0 10c5
+10d0 10f6
+10fb
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+1361 137c
+13a0 13f4
+1401 1676
+1680 169c
+16a0 16f0
+1780 17dc
+17e0 17e9
+1800 180a
+1810 1819
+1820 1877
+1880 18a9
+1e00 1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1fb4
+1fb6 1fc4
+1fc6 1fd3
+1fd6 1fdb
+1fdd 1fef
+1ff2 1ff4
+1ff6 1ffe
+2000 200b
+2010 2029
+202f 2046
+2048 204d
+2070
+2074 208e
+20a0 20af
+20d0 20e3
+2100 213a
+2153 2183
+2190 21f3
+2200 22f1
+2300 237b
+237d 239a
+2400 2426
+2440 244a
+2460 24ea
+2500 2595
+25a0 25f7
+2600 2613
+2619 2671
+2701 2704
+2706 2709
+270c 2727
+2729 274b
+274d
+274f 2752
+2756
+2758 275e
+2761 2767
+2776 2794
+2798 27af
+27b1 27be
+2800 28ff
+2e80 2e99
+2e9b 2ef3
+2f00 2fd5
+2ff0 2ffb
+3000 303a
+303e 303f
+3041 3094
+3099 309e
+30a1 30fe
+3105 312c
+3131 318e
+3190 31b7
+3200 321c
+3220 3243
+3260 327b
+327f 32b0
+32c0 32cb
+32d0 32fe
+3300 3376
+337b 33dd
+33e0 33fe
+3400 4db5
+4e00 9fa5
+a000 a48c
+a490 a4a1
+a4a4 a4b3
+a4b5 a4c0
+a4c2 a4c4
+a4c6
+ac00 d7a3
+f900 fa2d
+fb00 fb06
+fb13 fb17
+fb1d fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3f
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe20 fe23
+fe30 fe44
+fe49 fe52
+fe54 fe66
+fe68 fe6b
+fe70 fe72
+fe74
+fe76 fefc
+ff01 ff5e
+ff61 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+ffe0 ffe6
+ffe8 ffee
+fffc fffd
+END
diff --git a/contrib/perl5/lib/unicode/Is/Ps.pl b/contrib/perl5/lib/unicode/Is/Ps.pl
new file mode 100644
index 0000000..a7dee37
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Ps.pl
@@ -0,0 +1,43 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0028
+005b
+007b
+0f3a
+0f3c
+169b
+201a
+201e
+2045
+207d
+208d
+2329
+3008
+300a
+300c
+300e
+3010
+3014
+3016
+3018
+301a
+301d
+fd3e
+fe35
+fe37
+fe39
+fe3b
+fe3d
+fe3f
+fe41
+fe43
+fe59
+fe5b
+fe5d
+ff08
+ff3b
+ff5b
+ff62
+END
diff --git a/contrib/perl5/lib/unicode/Is/Punct.pl b/contrib/perl5/lib/unicode/Is/Punct.pl
new file mode 100644
index 0000000..8fd1e8e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Punct.pl
@@ -0,0 +1,80 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0021 0023
+0025 002a
+002c 002f
+003a 003b
+003f 0040
+005b 005d
+005f
+007b
+007d
+00a1
+00ab
+00ad
+00b7
+00bb
+00bf
+037e
+0387
+055a 055f
+0589 058a
+05be
+05c0
+05c3
+05f3 05f4
+060c
+061b
+061f
+066a 066d
+06d4
+0700 070d
+0964 0965
+0970
+0df4
+0e4f
+0e5a 0e5b
+0f04 0f12
+0f3a 0f3d
+0f85
+104a 104f
+10fb
+1361 1368
+166d 166e
+169b 169c
+16eb 16ed
+17d4 17da
+17dc
+1800 180a
+2010 2027
+2030 2043
+2045 2046
+2048 204d
+207d 207e
+208d 208e
+2329 232a
+3001 3003
+3008 3011
+3014 301f
+3030
+30fb
+fd3e fd3f
+fe30 fe44
+fe49 fe52
+fe54 fe61
+fe63
+fe68
+fe6a fe6b
+ff01 ff03
+ff05 ff0a
+ff0c ff0f
+ff1a ff1b
+ff1f ff20
+ff3b ff3d
+ff3f
+ff5b
+ff5d
+ff61 ff65
+END
diff --git a/contrib/perl5/lib/unicode/Is/S.pl b/contrib/perl5/lib/unicode/Is/S.pl
new file mode 100644
index 0000000..8851766
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/S.pl
@@ -0,0 +1,131 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0024
+002b
+003c 003e
+005e
+0060
+007c
+007e
+00a2 00a9
+00ac
+00ae 00b1
+00b4
+00b6
+00b8
+00d7
+00f7
+02b9 02ba
+02c2 02cf
+02d2 02df
+02e5 02ed
+0374 0375
+0384 0385
+0482
+06e9
+06fd 06fe
+09f2 09f3
+09fa
+0b70
+0e3f
+0f01 0f03
+0f13 0f17
+0f1a 0f1f
+0f34
+0f36
+0f38
+0fbe 0fc5
+0fc7 0fcc
+0fcf
+17db
+1fbd
+1fbf 1fc1
+1fcd 1fcf
+1fdd 1fdf
+1fed 1fef
+1ffd 1ffe
+2044
+207a 207c
+208a 208c
+20a0 20af
+2100 2101
+2103 2106
+2108 2109
+2114
+2116 2118
+211e 2123
+2125
+2127
+2129
+212e
+2132
+213a
+2190 21f3
+2200 22f1
+2300 2328
+232b 237b
+237d 239a
+2400 2426
+2440 244a
+249c 24e9
+2500 2595
+25a0 25f7
+2600 2613
+2619 2671
+2701 2704
+2706 2709
+270c 2727
+2729 274b
+274d
+274f 2752
+2756
+2758 275e
+2761 2767
+2794
+2798 27af
+27b1 27be
+2800 28ff
+2e80 2e99
+2e9b 2ef3
+2f00 2fd5
+2ff0 2ffb
+3004
+3012 3013
+3020
+3036 3037
+303e 303f
+309b 309c
+3190 3191
+3196 319f
+3200 321c
+322a 3243
+3260 327b
+327f
+328a 32b0
+32c0 32cb
+32d0 32fe
+3300 3376
+337b 33dd
+33e0 33fe
+a490 a4a1
+a4a4 a4b3
+a4b5 a4c0
+a4c2 a4c4
+a4c6
+fb29
+fe62
+fe64 fe66
+fe69
+ff04
+ff0b
+ff1c ff1e
+ff3e
+ff40
+ff5c
+ff5e
+ffe0 ffe6
+ffe8 ffee
+fffc fffd
+END
diff --git a/contrib/perl5/lib/unicode/Is/Sc.pl b/contrib/perl5/lib/unicode/Is/Sc.pl
new file mode 100644
index 0000000..5776bd6
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Sc.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0024
+00a2 00a5
+09f2 09f3
+0e3f
+17db
+20a0 20af
+fe69
+ff04
+ffe0 ffe1
+ffe5 ffe6
+END
diff --git a/contrib/perl5/lib/unicode/Is/Sm.pl b/contrib/perl5/lib/unicode/Is/Sm.pl
new file mode 100644
index 0000000..ae9424c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Sm.pl
@@ -0,0 +1,40 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+002b
+003c 003e
+007c
+007e
+00ac
+00b1
+00d7
+00f7
+2044
+207a 207c
+208a 208c
+2190 2194
+219a 219b
+21a0
+21a3
+21a6
+21ae
+21ce 21cf
+21d2
+21d4
+2200 22f1
+2308 230b
+2320 2321
+25b7
+25c1
+266f
+fb29
+fe62
+fe64 fe66
+ff0b
+ff1c ff1e
+ff5c
+ff5e
+ffe2
+ffe9 ffec
+END
diff --git a/contrib/perl5/lib/unicode/Is/So.pl b/contrib/perl5/lib/unicode/Is/So.pl
new file mode 100644
index 0000000..4e9dfc2
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/So.pl
@@ -0,0 +1,103 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+00a6 00a7
+00a9
+00ae
+00b0
+00b6
+0482
+06e9
+06fd 06fe
+09fa
+0b70
+0f01 0f03
+0f13 0f17
+0f1a 0f1f
+0f34
+0f36
+0f38
+0fbe 0fc5
+0fc7 0fcc
+0fcf
+2100 2101
+2103 2106
+2108 2109
+2114
+2116 2118
+211e 2123
+2125
+2127
+2129
+212e
+2132
+213a
+2195 2199
+219c 219f
+21a1 21a2
+21a4 21a5
+21a7 21ad
+21af 21cd
+21d0 21d1
+21d3
+21d5 21f3
+2300 2307
+230c 231f
+2322 2328
+232b 237b
+237d 239a
+2400 2426
+2440 244a
+249c 24e9
+2500 2595
+25a0 25b6
+25b8 25c0
+25c2 25f7
+2600 2613
+2619 266e
+2670 2671
+2701 2704
+2706 2709
+270c 2727
+2729 274b
+274d
+274f 2752
+2756
+2758 275e
+2761 2767
+2794
+2798 27af
+27b1 27be
+2800 28ff
+2e80 2e99
+2e9b 2ef3
+2f00 2fd5
+2ff0 2ffb
+3004
+3012 3013
+3020
+3036 3037
+303e 303f
+3190 3191
+3196 319f
+3200 321c
+322a 3243
+3260 327b
+327f
+328a 32b0
+32c0 32cb
+32d0 32fe
+3300 3376
+337b 33dd
+33e0 33fe
+a490 a4a1
+a4a4 a4b3
+a4b5 a4c0
+a4c2 a4c4
+a4c6
+ffe4
+ffe8
+ffed ffee
+fffc fffd
+END
diff --git a/contrib/perl5/lib/unicode/Is/Space.pl b/contrib/perl5/lib/unicode/Is/Space.pl
new file mode 100644
index 0000000..4121ef4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Space.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0009 000a
+000c 000d
+0020
+00a0
+1680
+2000 200b
+2028 2029
+202f
+3000
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylA.pl b/contrib/perl5/lib/unicode/Is/SylA.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylA.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylC.pl b/contrib/perl5/lib/unicode/Is/SylC.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylC.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylE.pl b/contrib/perl5/lib/unicode/Is/SylE.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylE.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylI.pl b/contrib/perl5/lib/unicode/Is/SylI.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylI.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylO.pl b/contrib/perl5/lib/unicode/Is/SylO.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylO.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylU.pl b/contrib/perl5/lib/unicode/Is/SylU.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylU.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylV.pl b/contrib/perl5/lib/unicode/Is/SylV.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylV.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylWA.pl b/contrib/perl5/lib/unicode/Is/SylWA.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylWA.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylWC.pl b/contrib/perl5/lib/unicode/Is/SylWC.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylWC.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylWE.pl b/contrib/perl5/lib/unicode/Is/SylWE.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylWE.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylWI.pl b/contrib/perl5/lib/unicode/Is/SylWI.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylWI.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/SylWV.pl b/contrib/perl5/lib/unicode/Is/SylWV.pl
new file mode 100644
index 0000000..ec287c4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/SylWV.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/contrib/perl5/lib/unicode/Is/Syllable.pl b/contrib/perl5/lib/unicode/Is/Syllable.pl
new file mode 100644
index 0000000..707ad94
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Syllable.pl
@@ -0,0 +1,4 @@
+return <<'END';
+0d00 0d7f
+1200 135a
+END
diff --git a/contrib/perl5/lib/unicode/Is/Upper.pl b/contrib/perl5/lib/unicode/Is/Upper.pl
new file mode 100644
index 0000000..8dde274
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Upper.pl
@@ -0,0 +1,376 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0041 005a
+00c0 00d6
+00d8 00de
+0100
+0102
+0104
+0106
+0108
+010a
+010c
+010e
+0110
+0112
+0114
+0116
+0118
+011a
+011c
+011e
+0120
+0122
+0124
+0126
+0128
+012a
+012c
+012e
+0130
+0132
+0134
+0136
+0139
+013b
+013d
+013f
+0141
+0143
+0145
+0147
+014a
+014c
+014e
+0150
+0152
+0154
+0156
+0158
+015a
+015c
+015e
+0160
+0162
+0164
+0166
+0168
+016a
+016c
+016e
+0170
+0172
+0174
+0176
+0178 0179
+017b
+017d
+0181 0182
+0184
+0186 0187
+0189 018b
+018e 0191
+0193 0194
+0196 0198
+019c 019d
+019f 01a0
+01a2
+01a4
+01a6 01a7
+01a9
+01ac
+01ae 01af
+01b1 01b3
+01b5
+01b7 01b8
+01bc
+01c4
+01c7
+01ca
+01cd
+01cf
+01d1
+01d3
+01d5
+01d7
+01d9
+01db
+01de
+01e0
+01e2
+01e4
+01e6
+01e8
+01ea
+01ec
+01ee
+01f1
+01f4
+01f6 01f8
+01fa
+01fc
+01fe
+0200
+0202
+0204
+0206
+0208
+020a
+020c
+020e
+0210
+0212
+0214
+0216
+0218
+021a
+021c
+021e
+0222
+0224
+0226
+0228
+022a
+022c
+022e
+0230
+0232
+0386
+0388 038a
+038c
+038e 038f
+0391 03a1
+03a3 03ab
+03d2 03d4
+03da
+03dc
+03de
+03e0
+03e2
+03e4
+03e6
+03e8
+03ea
+03ec
+03ee
+0400 042f
+0460
+0462
+0464
+0466
+0468
+046a
+046c
+046e
+0470
+0472
+0474
+0476
+0478
+047a
+047c
+047e
+0480
+048c
+048e
+0490
+0492
+0494
+0496
+0498
+049a
+049c
+049e
+04a0
+04a2
+04a4
+04a6
+04a8
+04aa
+04ac
+04ae
+04b0
+04b2
+04b4
+04b6
+04b8
+04ba
+04bc
+04be
+04c0 04c1
+04c3
+04c7
+04cb
+04d0
+04d2
+04d4
+04d6
+04d8
+04da
+04dc
+04de
+04e0
+04e2
+04e4
+04e6
+04e8
+04ea
+04ec
+04ee
+04f0
+04f2
+04f4
+04f8
+0531 0556
+10a0 10c5
+1e00
+1e02
+1e04
+1e06
+1e08
+1e0a
+1e0c
+1e0e
+1e10
+1e12
+1e14
+1e16
+1e18
+1e1a
+1e1c
+1e1e
+1e20
+1e22
+1e24
+1e26
+1e28
+1e2a
+1e2c
+1e2e
+1e30
+1e32
+1e34
+1e36
+1e38
+1e3a
+1e3c
+1e3e
+1e40
+1e42
+1e44
+1e46
+1e48
+1e4a
+1e4c
+1e4e
+1e50
+1e52
+1e54
+1e56
+1e58
+1e5a
+1e5c
+1e5e
+1e60
+1e62
+1e64
+1e66
+1e68
+1e6a
+1e6c
+1e6e
+1e70
+1e72
+1e74
+1e76
+1e78
+1e7a
+1e7c
+1e7e
+1e80
+1e82
+1e84
+1e86
+1e88
+1e8a
+1e8c
+1e8e
+1e90
+1e92
+1e94
+1ea0
+1ea2
+1ea4
+1ea6
+1ea8
+1eaa
+1eac
+1eae
+1eb0
+1eb2
+1eb4
+1eb6
+1eb8
+1eba
+1ebc
+1ebe
+1ec0
+1ec2
+1ec4
+1ec6
+1ec8
+1eca
+1ecc
+1ece
+1ed0
+1ed2
+1ed4
+1ed6
+1ed8
+1eda
+1edc
+1ede
+1ee0
+1ee2
+1ee4
+1ee6
+1ee8
+1eea
+1eec
+1eee
+1ef0
+1ef2
+1ef4
+1ef6
+1ef8
+1f08 1f0f
+1f18 1f1d
+1f28 1f2f
+1f38 1f3f
+1f48 1f4d
+1f59
+1f5b
+1f5d
+1f5f
+1f68 1f6f
+1fb8 1fbb
+1fc8 1fcb
+1fd8 1fdb
+1fe8 1fec
+1ff8 1ffb
+2102
+2107
+210b 210d
+2110 2112
+2115
+2119 211d
+2124
+2126
+2128
+212a 212d
+2130 2131
+2133
+ff21 ff3a
+END
diff --git a/contrib/perl5/lib/unicode/Is/Word.pl b/contrib/perl5/lib/unicode/Is/Word.pl
new file mode 100644
index 0000000..23186bd
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Word.pl
@@ -0,0 +1,277 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039
+0041 005a
+005f
+0061 007a
+00aa
+00b5
+00ba
+00c0 00d6
+00d8 00f6
+00f8 01c4
+01c6 01c7
+01c9 01ca
+01cc 01f1
+01f3 021f
+0222 0233
+0250 02ad
+0386
+0388 038a
+038c
+038e 03a1
+03a3 03ce
+03d0 03d7
+03da 03f3
+0400 0481
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0561 0587
+05d0 05ea
+05f0 05f2
+0621 063a
+0641 064a
+0660 0669
+0671 06d3
+06d5
+06f0 06fc
+0710
+0712 072c
+0780 07a5
+0905 0939
+093d
+0950
+0958 0961
+0966 096f
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09dc 09dd
+09df 09e1
+09e6 09f1
+0a05 0a0a
+0a0f 0a10
+0a13 0a28
+0a2a 0a30
+0a32 0a33
+0a35 0a36
+0a38 0a39
+0a59 0a5c
+0a5e
+0a66 0a6f
+0a72 0a74
+0a85 0a8b
+0a8d
+0a8f 0a91
+0a93 0aa8
+0aaa 0ab0
+0ab2 0ab3
+0ab5 0ab9
+0abd
+0ad0
+0ae0
+0ae6 0aef
+0b05 0b0c
+0b0f 0b10
+0b13 0b28
+0b2a 0b30
+0b32 0b33
+0b36 0b39
+0b3d
+0b5c 0b5d
+0b5f 0b61
+0b66 0b6f
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0be7 0bef
+0c05 0c0c
+0c0e 0c10
+0c12 0c28
+0c2a 0c33
+0c35 0c39
+0c60 0c61
+0c66 0c6f
+0c85 0c8c
+0c8e 0c90
+0c92 0ca8
+0caa 0cb3
+0cb5 0cb9
+0cde
+0ce0 0ce1
+0ce6 0cef
+0d05 0d0c
+0d0e 0d10
+0d12 0d28
+0d2a 0d39
+0d60 0d61
+0d66 0d6f
+0d85 0d96
+0d9a 0db1
+0db3 0dbb
+0dbd
+0dc0 0dc6
+0e01 0e30
+0e32 0e33
+0e40 0e45
+0e50 0e59
+0e81 0e82
+0e84
+0e87 0e88
+0e8a
+0e8d
+0e94 0e97
+0e99 0e9f
+0ea1 0ea3
+0ea5
+0ea7
+0eaa 0eab
+0ead 0eb0
+0eb2 0eb3
+0ebd
+0ec0 0ec4
+0ed0 0ed9
+0edc 0edd
+0f00
+0f20 0f29
+0f40 0f47
+0f49 0f6a
+0f88 0f8b
+1000 1021
+1023 1027
+1029 102a
+1040 1049
+1050 1055
+10a0 10c5
+10d0 10f6
+1100 1159
+115f 11a2
+11a8 11f9
+1200 1206
+1208 1246
+1248
+124a 124d
+1250 1256
+1258
+125a 125d
+1260 1286
+1288
+128a 128d
+1290 12ae
+12b0
+12b2 12b5
+12b8 12be
+12c0
+12c2 12c5
+12c8 12ce
+12d0 12d6
+12d8 12ee
+12f0 130e
+1310
+1312 1315
+1318 131e
+1320 1346
+1348 135a
+1369 1371
+13a0 13f4
+1401 166c
+166f 1676
+1681 169a
+16a0 16ea
+1780 17b3
+17e0 17e9
+1810 1819
+1820 1842
+1844 1877
+1880 18a8
+1e00 1e9b
+1ea0 1ef9
+1f00 1f15
+1f18 1f1d
+1f20 1f45
+1f48 1f4d
+1f50 1f57
+1f59
+1f5b
+1f5d
+1f5f 1f7d
+1f80 1f87
+1f90 1f97
+1fa0 1fa7
+1fb0 1fb4
+1fb6 1fbb
+1fbe
+1fc2 1fc4
+1fc6 1fcb
+1fd0 1fd3
+1fd6 1fdb
+1fe0 1fec
+1ff2 1ff4
+1ff6 1ffb
+207f
+2102
+2107
+210a 2113
+2115
+2119 211d
+2124
+2126
+2128
+212a 212d
+212f 2131
+2133 2139
+3006
+3041 3094
+30a1 30fa
+3105 312c
+3131 318e
+31a0 31b7
+3400 4db5
+4e00 9fa5
+a000 a48c
+ac00 d7a3
+f900 fa2d
+fb00 fb06
+fb13 fb17
+fb1d
+fb1f fb28
+fb2a fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe70 fe72
+fe74
+fe76 fefc
+ff10 ff19
+ff21 ff3a
+ff41 ff5a
+ff66 ff6f
+ff71 ff9d
+ffa0 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+END
diff --git a/contrib/perl5/lib/unicode/Is/XDigit.pl b/contrib/perl5/lib/unicode/Is/XDigit.pl
new file mode 100644
index 0000000..e556825
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/XDigit.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039
+0041 0046
+0061 0066
+END
diff --git a/contrib/perl5/lib/unicode/Is/Z.pl b/contrib/perl5/lib/unicode/Is/Z.pl
new file mode 100644
index 0000000..22a9792
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Z.pl
@@ -0,0 +1,12 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0020
+00a0
+1680
+2000 200b
+2028 2029
+202f
+3000
+END
diff --git a/contrib/perl5/lib/unicode/Is/Zl.pl b/contrib/perl5/lib/unicode/Is/Zl.pl
new file mode 100644
index 0000000..0989e1d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Zl.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2028
+END
diff --git a/contrib/perl5/lib/unicode/Is/Zp.pl b/contrib/perl5/lib/unicode/Is/Zp.pl
new file mode 100644
index 0000000..3b23446
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Zp.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+2029
+END
diff --git a/contrib/perl5/lib/unicode/Is/Zs.pl b/contrib/perl5/lib/unicode/Is/Zs.pl
new file mode 100644
index 0000000..db18055
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Is/Zs.pl
@@ -0,0 +1,11 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0020
+00a0
+1680
+2000 200b
+202f
+3000
+END
diff --git a/contrib/perl5/lib/unicode/Jamo.txt b/contrib/perl5/lib/unicode/Jamo.txt
new file mode 100644
index 0000000..6910ab9
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Jamo.txt
@@ -0,0 +1,69 @@
+#Value; Short Name; Unicode Name
+U+1100; G; HANGUL CHOSEONG KIYEOK
+U+1101; GG; HANGUL CHOSEONG SSANGKIYEOK
+U+1102; N; HANGUL CHOSEONG NIEUN
+U+1103; D; HANGUL CHOSEONG TIKEUT
+U+1104; DD; HANGUL CHOSEONG SSANGTIKEUT
+U+1105; R; HANGUL CHOSEONG RIEUL
+U+1106; M; HANGUL CHOSEONG MIEUM
+U+1107; B; HANGUL CHOSEONG PIEUP
+U+1108; BB; HANGUL CHOSEONG SSANGPIEUP
+U+1109; S; HANGUL CHOSEONG SIOS
+U+110A; SS; HANGUL CHOSEONG SSANGSIOS
+U+110B; ; HANGUL CHOSEONG IEUNG
+U+110C; J; HANGUL CHOSEONG CIEUC
+U+110D; JJ; HANGUL CHOSEONG SSANGCIEUC
+U+110E; C; HANGUL CHOSEONG CHIEUCH
+U+110F; K; HANGUL CHOSEONG KHIEUKH
+U+1110; T; HANGUL CHOSEONG THIEUTH
+U+1111; P; HANGUL CHOSEONG PHIEUPH
+U+1112; H; HANGUL CHOSEONG HIEUH
+U+1161; A; HANGUL JUNGSEONG A
+U+1162; AE; HANGUL JUNGSEONG AE
+U+1163; YA; HANGUL JUNGSEONG YA
+U+1164; YAE; HANGUL JUNGSEONG YAE
+U+1165; EO; HANGUL JUNGSEONG EO
+U+1166; E; HANGUL JUNGSEONG E
+U+1167; YEO; HANGUL JUNGSEONG YEO
+U+1168; YE; HANGUL JUNGSEONG YE
+U+1169; O; HANGUL JUNGSEONG O
+U+116A; WA; HANGUL JUNGSEONG WA
+U+116B; WAE; HANGUL JUNGSEONG WAE
+U+116C; OE; HANGUL JUNGSEONG OE
+U+116D; YO; HANGUL JUNGSEONG YO
+U+116E; U; HANGUL JUNGSEONG U
+U+116F; WEO; HANGUL JUNGSEONG WEO
+U+1170; WE; HANGUL JUNGSEONG WE
+U+1171; WI; HANGUL JUNGSEONG WI
+U+1172; YU; HANGUL JUNGSEONG YU
+U+1173; EU; HANGUL JUNGSEONG EU
+U+1174; YI; HANGUL JUNGSEONG YI
+U+1175; I; HANGUL JUNGSEONG I
+U+11A8; G; HANGUL JONGSEONG KIYEOK
+U+11A9; GG; HANGUL JONGSEONG SSANGKIYEOK
+U+11AA; GS; HANGUL JONGSEONG KIYEOK-SIOS
+U+11AB; N; HANGUL JONGSEONG NIEUN
+U+11AC; NJ; HANGUL JONGSEONG NIEUN-CIEUC
+U+11AD; NH; HANGUL JONGSEONG NIEUN-HIEUH
+U+11AE; D; HANGUL JONGSEONG TIKEUT
+U+11AF; L; HANGUL JONGSEONG RIEUL
+U+11B0; LG; HANGUL JONGSEONG RIEUL-KIYEOK
+U+11B1; LM; HANGUL JONGSEONG RIEUL-MIEUM
+U+11B2; LB; HANGUL JONGSEONG RIEUL-PIEUP
+U+11B3; LS; HANGUL JONGSEONG RIEUL-SIOS
+U+11B4; LT; HANGUL JONGSEONG RIEUL-THIEUTH
+U+11B5; LP; HANGUL JONGSEONG RIEUL-PHIEUPH
+U+11B6; LH; HANGUL JONGSEONG RIEUL-HIEUH
+U+11B7; M; HANGUL JONGSEONG MIEUM
+U+11B8; B; HANGUL JONGSEONG PIEUP
+U+11B9; BS; HANGUL JONGSEONG PIEUP-SIOS
+U+11BA; S; HANGUL JONGSEONG SIOS
+U+11BB; SS; HANGUL JONGSEONG SSANGSIOS
+U+11BC; NG; HANGUL JONGSEONG IEUNG
+U+11BD; J; HANGUL JONGSEONG CIEUC
+U+11BE; C; HANGUL JONGSEONG CHIEUCH
+U+11BF; K; HANGUL JONGSEONG KHIEUKH
+U+11C0; T; HANGUL JONGSEONG THIEUTH
+U+11C1; P; HANGUL JONGSEONG PHIEUPH
+U+11C2; H; HANGUL JONGSEONG HIEUH
+
diff --git a/contrib/perl5/lib/unicode/JamoShort.pl b/contrib/perl5/lib/unicode/JamoShort.pl
new file mode 100644
index 0000000..760bcba
--- /dev/null
+++ b/contrib/perl5/lib/unicode/JamoShort.pl
@@ -0,0 +1,72 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+1100 G
+1101 GG
+1102 N
+1103 D
+1104 DD
+1105 R
+1106 M
+1107 B
+1108 BB
+1109 S
+110a SS
+110b
+110c J
+110d JJ
+110e C
+110f K
+1110 T
+1111 P
+1112 H
+1161 A
+1162 AE
+1163 YA
+1164 YAE
+1165 EO
+1166 E
+1167 YEO
+1168 YE
+1169 O
+116a WA
+116b WAE
+116c OE
+116d YO
+116e U
+116f WEO
+1170 WE
+1171 WI
+1172 YU
+1173 EU
+1174 YI
+1175 I
+11a8 G
+11a9 GG
+11aa GS
+11ab N
+11ac NJ
+11ad NH
+11ae D
+11af L
+11b0 LG
+11b1 LM
+11b2 LB
+11b3 LS
+11b4 LT
+11b5 LP
+11b6 LH
+11b7 M
+11b8 B
+11b9 BS
+11ba S
+11bb SS
+11bc NG
+11bd J
+11be C
+11bf K
+11c0 T
+11c1 P
+11c2 H
+END
diff --git a/contrib/perl5/lib/unicode/LineBrk.txt b/contrib/perl5/lib/unicode/LineBrk.txt
new file mode 100644
index 0000000..48f6c50
--- /dev/null
+++ b/contrib/perl5/lib/unicode/LineBrk.txt
@@ -0,0 +1,10643 @@
+# LineBreak-5.txt
+#
+# Line Break Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It contains both normative and informative data.
+# The format is three fields separated by semicolons.
+# Field 1: Unicode value
+# Field 2: LineBreak property, consisting of one of the following values:
+# Normative:
+# "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW"
+# Informative:
+# "XX", "OP", "CL", "QU", "NS", "EX", "SY",
+# "IS", "PR", "PO", "NU", "AL", "ID", "IN", "HY",
+# "BB", "BA", "SA", "AI", "B2"
+# - Assigned characters that are not listed explicitly are given the value
+# "AL".
+# - Unassigned characters are given the value "XX".
+# - Characters within ranges marked by "First>" and "Last>" are omitted,
+# as in UnicodeData.txt. For example, the following means that
+# all characters between 3400 and 4DB5 have the value "ID"
+# 3400;ID;<CJK Ideograph Extension A, First>
+# 4DB5;ID;<CJK Ideograph Extension A, Last>
+# Field 3: Unicode name (this is purely informative)
+#
+# See UTR #14: Line Breaking Properties for more information
+0000;CM;<control>
+0001;CM;<control>
+0002;CM;<control>
+0003;CM;<control>
+0004;CM;<control>
+0005;CM;<control>
+0006;CM;<control>
+0007;CM;<control>
+0008;CM;<control>
+0009;BA;<control>
+000A;LF;<control>
+000B;CM;<control>
+000C;BK;<control>
+000D;CR;<control>
+000E;CM;<control>
+000F;CM;<control>
+0010;CM;<control>
+0011;CM;<control>
+0012;CM;<control>
+0013;CM;<control>
+0014;CM;<control>
+0015;CM;<control>
+0016;CM;<control>
+0017;CM;<control>
+0018;CM;<control>
+0019;CM;<control>
+001A;CM;<control>
+001B;CM;<control>
+001C;CM;<control>
+001D;CM;<control>
+001E;CM;<control>
+001F;CM;<control>
+0020;SP;SPACE
+0021;EX;EXCLAMATION MARK
+0022;QU;QUOTATION MARK
+0023;AL;NUMBER SIGN
+0024;PR;DOLLAR SIGN
+0025;PO;PERCENT SIGN
+0026;AL;AMPERSAND
+0027;QU;APOSTROPHE
+0028;OP;LEFT PARENTHESIS
+0029;CL;RIGHT PARENTHESIS
+002A;AL;ASTERISK
+002B;PR;PLUS SIGN
+002C;IS;COMMA
+002D;HY;HYPHEN-MINUS
+002E;IS;FULL STOP
+002F;SY;SOLIDUS
+0030;NU;DIGIT ZERO
+0031;NU;DIGIT ONE
+0032;NU;DIGIT TWO
+0033;NU;DIGIT THREE
+0034;NU;DIGIT FOUR
+0035;NU;DIGIT FIVE
+0036;NU;DIGIT SIX
+0037;NU;DIGIT SEVEN
+0038;NU;DIGIT EIGHT
+0039;NU;DIGIT NINE
+003A;IS;COLON
+003B;IS;SEMICOLON
+003C;AL;LESS-THAN SIGN
+003D;AL;EQUALS SIGN
+003E;AL;GREATER-THAN SIGN
+003F;EX;QUESTION MARK
+0040;AL;COMMERCIAL AT
+0041;AL;LATIN CAPITAL LETTER A
+0042;AL;LATIN CAPITAL LETTER B
+0043;AL;LATIN CAPITAL LETTER C
+0044;AL;LATIN CAPITAL LETTER D
+0045;AL;LATIN CAPITAL LETTER E
+0046;AL;LATIN CAPITAL LETTER F
+0047;AL;LATIN CAPITAL LETTER G
+0048;AL;LATIN CAPITAL LETTER H
+0049;AL;LATIN CAPITAL LETTER I
+004A;AL;LATIN CAPITAL LETTER J
+004B;AL;LATIN CAPITAL LETTER K
+004C;AL;LATIN CAPITAL LETTER L
+004D;AL;LATIN CAPITAL LETTER M
+004E;AL;LATIN CAPITAL LETTER N
+004F;AL;LATIN CAPITAL LETTER O
+0050;AL;LATIN CAPITAL LETTER P
+0051;AL;LATIN CAPITAL LETTER Q
+0052;AL;LATIN CAPITAL LETTER R
+0053;AL;LATIN CAPITAL LETTER S
+0054;AL;LATIN CAPITAL LETTER T
+0055;AL;LATIN CAPITAL LETTER U
+0056;AL;LATIN CAPITAL LETTER V
+0057;AL;LATIN CAPITAL LETTER W
+0058;AL;LATIN CAPITAL LETTER X
+0059;AL;LATIN CAPITAL LETTER Y
+005A;AL;LATIN CAPITAL LETTER Z
+005B;OP;LEFT SQUARE BRACKET
+005C;PR;REVERSE SOLIDUS
+005D;CL;RIGHT SQUARE BRACKET
+005E;AL;CIRCUMFLEX ACCENT
+005F;AL;LOW LINE
+0060;AL;GRAVE ACCENT
+0061;AL;LATIN SMALL LETTER A
+0062;AL;LATIN SMALL LETTER B
+0063;AL;LATIN SMALL LETTER C
+0064;AL;LATIN SMALL LETTER D
+0065;AL;LATIN SMALL LETTER E
+0066;AL;LATIN SMALL LETTER F
+0067;AL;LATIN SMALL LETTER G
+0068;AL;LATIN SMALL LETTER H
+0069;AL;LATIN SMALL LETTER I
+006A;AL;LATIN SMALL LETTER J
+006B;AL;LATIN SMALL LETTER K
+006C;AL;LATIN SMALL LETTER L
+006D;AL;LATIN SMALL LETTER M
+006E;AL;LATIN SMALL LETTER N
+006F;AL;LATIN SMALL LETTER O
+0070;AL;LATIN SMALL LETTER P
+0071;AL;LATIN SMALL LETTER Q
+0072;AL;LATIN SMALL LETTER R
+0073;AL;LATIN SMALL LETTER S
+0074;AL;LATIN SMALL LETTER T
+0075;AL;LATIN SMALL LETTER U
+0076;AL;LATIN SMALL LETTER V
+0077;AL;LATIN SMALL LETTER W
+0078;AL;LATIN SMALL LETTER X
+0079;AL;LATIN SMALL LETTER Y
+007A;AL;LATIN SMALL LETTER Z
+007B;OP;LEFT CURLY BRACKET
+007C;BA;VERTICAL LINE
+007D;CL;RIGHT CURLY BRACKET
+007E;AL;TILDE
+007F;CM;<control>
+0080;CM;<control>
+0081;CM;<control>
+0082;CM;<control>
+0083;CM;<control>
+0084;CM;<control>
+0085;CM;<control>
+0086;CM;<control>
+0087;CM;<control>
+0088;CM;<control>
+0089;CM;<control>
+008A;CM;<control>
+008B;CM;<control>
+008C;CM;<control>
+008D;CM;<control>
+008E;CM;<control>
+008F;CM;<control>
+0090;CM;<control>
+0091;CM;<control>
+0092;CM;<control>
+0093;CM;<control>
+0094;CM;<control>
+0095;CM;<control>
+0096;CM;<control>
+0097;CM;<control>
+0098;CM;<control>
+0099;CM;<control>
+009A;CM;<control>
+009B;CM;<control>
+009C;CM;<control>
+009D;CM;<control>
+009E;CM;<control>
+009F;CM;<control>
+00A0;GL;NO-BREAK SPACE
+00A1;AI;INVERTED EXCLAMATION MARK
+00A2;PO;CENT SIGN
+00A3;PR;POUND SIGN
+00A4;PR;CURRENCY SIGN
+00A5;PR;YEN SIGN
+00A6;AL;BROKEN BAR
+00A7;AI;SECTION SIGN
+00A8;AI;DIAERESIS
+00A9;AL;COPYRIGHT SIGN
+00AA;AI;FEMININE ORDINAL INDICATOR
+00AB;QU;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC;AL;NOT SIGN
+00AD;BA;SOFT HYPHEN
+00AE;AL;REGISTERED SIGN
+00AF;AL;MACRON
+00B0;PO;DEGREE SIGN
+00B1;PR;PLUS-MINUS SIGN
+00B2;AI;SUPERSCRIPT TWO
+00B3;AI;SUPERSCRIPT THREE
+00B4;BA;ACUTE ACCENT
+00B5;AL;MICRO SIGN
+00B6;AI;PILCROW SIGN
+00B7;AI;MIDDLE DOT
+00B8;AI;CEDILLA
+00B9;AI;SUPERSCRIPT ONE
+00BA;AI;MASCULINE ORDINAL INDICATOR
+00BB;QU;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC;AI;VULGAR FRACTION ONE QUARTER
+00BD;AI;VULGAR FRACTION ONE HALF
+00BE;AI;VULGAR FRACTION THREE QUARTERS
+00BF;AI;INVERTED QUESTION MARK
+00C0;AL;LATIN CAPITAL LETTER A WITH GRAVE
+00C1;AL;LATIN CAPITAL LETTER A WITH ACUTE
+00C2;AL;LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3;AL;LATIN CAPITAL LETTER A WITH TILDE
+00C4;AL;LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5;AL;LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6;AI;LATIN CAPITAL LETTER AE
+00C7;AL;LATIN CAPITAL LETTER C WITH CEDILLA
+00C8;AL;LATIN CAPITAL LETTER E WITH GRAVE
+00C9;AL;LATIN CAPITAL LETTER E WITH ACUTE
+00CA;AL;LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB;AL;LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC;AL;LATIN CAPITAL LETTER I WITH GRAVE
+00CD;AL;LATIN CAPITAL LETTER I WITH ACUTE
+00CE;AL;LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF;AL;LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0;AI;LATIN CAPITAL LETTER ETH
+00D1;AL;LATIN CAPITAL LETTER N WITH TILDE
+00D2;AL;LATIN CAPITAL LETTER O WITH GRAVE
+00D3;AL;LATIN CAPITAL LETTER O WITH ACUTE
+00D4;AL;LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5;AL;LATIN CAPITAL LETTER O WITH TILDE
+00D6;AL;LATIN CAPITAL LETTER O WITH DIAERESIS
+00D7;AI;MULTIPLICATION SIGN
+00D8;AI;LATIN CAPITAL LETTER O WITH STROKE
+00D9;AL;LATIN CAPITAL LETTER U WITH GRAVE
+00DA;AL;LATIN CAPITAL LETTER U WITH ACUTE
+00DB;AL;LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC;AL;LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD;AL;LATIN CAPITAL LETTER Y WITH ACUTE
+00DE;AI;LATIN CAPITAL LETTER THORN
+00DF;AI;LATIN SMALL LETTER SHARP S
+00E0;AI;LATIN SMALL LETTER A WITH GRAVE
+00E1;AI;LATIN SMALL LETTER A WITH ACUTE
+00E2;AL;LATIN SMALL LETTER A WITH CIRCUMFLEX
+00E3;AL;LATIN SMALL LETTER A WITH TILDE
+00E4;AL;LATIN SMALL LETTER A WITH DIAERESIS
+00E5;AL;LATIN SMALL LETTER A WITH RING ABOVE
+00E6;AI;LATIN SMALL LETTER AE
+00E7;AL;LATIN SMALL LETTER C WITH CEDILLA
+00E8;AI;LATIN SMALL LETTER E WITH GRAVE
+00E9;AI;LATIN SMALL LETTER E WITH ACUTE
+00EA;AI;LATIN SMALL LETTER E WITH CIRCUMFLEX
+00EB;AL;LATIN SMALL LETTER E WITH DIAERESIS
+00EC;AI;LATIN SMALL LETTER I WITH GRAVE
+00ED;AI;LATIN SMALL LETTER I WITH ACUTE
+00EE;AL;LATIN SMALL LETTER I WITH CIRCUMFLEX
+00EF;AL;LATIN SMALL LETTER I WITH DIAERESIS
+00F0;AI;LATIN SMALL LETTER ETH
+00F1;AL;LATIN SMALL LETTER N WITH TILDE
+00F2;AI;LATIN SMALL LETTER O WITH GRAVE
+00F3;AI;LATIN SMALL LETTER O WITH ACUTE
+00F4;AL;LATIN SMALL LETTER O WITH CIRCUMFLEX
+00F5;AL;LATIN SMALL LETTER O WITH TILDE
+00F6;AL;LATIN SMALL LETTER O WITH DIAERESIS
+00F7;AI;DIVISION SIGN
+00F8;AI;LATIN SMALL LETTER O WITH STROKE
+00F9;AI;LATIN SMALL LETTER U WITH GRAVE
+00FA;AI;LATIN SMALL LETTER U WITH ACUTE
+00FB;AL;LATIN SMALL LETTER U WITH CIRCUMFLEX
+00FC;AI;LATIN SMALL LETTER U WITH DIAERESIS
+00FD;AL;LATIN SMALL LETTER Y WITH ACUTE
+00FE;AI;LATIN SMALL LETTER THORN
+00FF;AL;LATIN SMALL LETTER Y WITH DIAERESIS
+0100;AL;LATIN CAPITAL LETTER A WITH MACRON
+0101;AI;LATIN SMALL LETTER A WITH MACRON
+0102;AL;LATIN CAPITAL LETTER A WITH BREVE
+0103;AL;LATIN SMALL LETTER A WITH BREVE
+0104;AL;LATIN CAPITAL LETTER A WITH OGONEK
+0105;AL;LATIN SMALL LETTER A WITH OGONEK
+0106;AL;LATIN CAPITAL LETTER C WITH ACUTE
+0107;AL;LATIN SMALL LETTER C WITH ACUTE
+0108;AL;LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109;AL;LATIN SMALL LETTER C WITH CIRCUMFLEX
+010A;AL;LATIN CAPITAL LETTER C WITH DOT ABOVE
+010B;AL;LATIN SMALL LETTER C WITH DOT ABOVE
+010C;AL;LATIN CAPITAL LETTER C WITH CARON
+010D;AL;LATIN SMALL LETTER C WITH CARON
+010E;AL;LATIN CAPITAL LETTER D WITH CARON
+010F;AL;LATIN SMALL LETTER D WITH CARON
+0110;AL;LATIN CAPITAL LETTER D WITH STROKE
+0111;AI;LATIN SMALL LETTER D WITH STROKE
+0112;AL;LATIN CAPITAL LETTER E WITH MACRON
+0113;AI;LATIN SMALL LETTER E WITH MACRON
+0114;AL;LATIN CAPITAL LETTER E WITH BREVE
+0115;AL;LATIN SMALL LETTER E WITH BREVE
+0116;AL;LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117;AL;LATIN SMALL LETTER E WITH DOT ABOVE
+0118;AL;LATIN CAPITAL LETTER E WITH OGONEK
+0119;AL;LATIN SMALL LETTER E WITH OGONEK
+011A;AL;LATIN CAPITAL LETTER E WITH CARON
+011B;AI;LATIN SMALL LETTER E WITH CARON
+011C;AL;LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011D;AL;LATIN SMALL LETTER G WITH CIRCUMFLEX
+011E;AL;LATIN CAPITAL LETTER G WITH BREVE
+011F;AL;LATIN SMALL LETTER G WITH BREVE
+0120;AL;LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121;AL;LATIN SMALL LETTER G WITH DOT ABOVE
+0122;AL;LATIN CAPITAL LETTER G WITH CEDILLA
+0123;AL;LATIN SMALL LETTER G WITH CEDILLA
+0124;AL;LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125;AL;LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126;AI;LATIN CAPITAL LETTER H WITH STROKE
+0127;AI;LATIN SMALL LETTER H WITH STROKE
+0128;AL;LATIN CAPITAL LETTER I WITH TILDE
+0129;AL;LATIN SMALL LETTER I WITH TILDE
+012A;AL;LATIN CAPITAL LETTER I WITH MACRON
+012B;AI;LATIN SMALL LETTER I WITH MACRON
+012C;AL;LATIN CAPITAL LETTER I WITH BREVE
+012D;AL;LATIN SMALL LETTER I WITH BREVE
+012E;AL;LATIN CAPITAL LETTER I WITH OGONEK
+012F;AL;LATIN SMALL LETTER I WITH OGONEK
+0130;AL;LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131;AI;LATIN SMALL LETTER DOTLESS I
+0132;AI;LATIN CAPITAL LIGATURE IJ
+0133;AI;LATIN SMALL LIGATURE IJ
+0134;AL;LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135;AL;LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136;AL;LATIN CAPITAL LETTER K WITH CEDILLA
+0137;AL;LATIN SMALL LETTER K WITH CEDILLA
+0138;AI;LATIN SMALL LETTER KRA
+0139;AL;LATIN CAPITAL LETTER L WITH ACUTE
+013A;AL;LATIN SMALL LETTER L WITH ACUTE
+013B;AL;LATIN CAPITAL LETTER L WITH CEDILLA
+013C;AL;LATIN SMALL LETTER L WITH CEDILLA
+013D;AL;LATIN CAPITAL LETTER L WITH CARON
+013E;AL;LATIN SMALL LETTER L WITH CARON
+013F;AI;LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140;AI;LATIN SMALL LETTER L WITH MIDDLE DOT
+0141;AI;LATIN CAPITAL LETTER L WITH STROKE
+0142;AI;LATIN SMALL LETTER L WITH STROKE
+0143;AL;LATIN CAPITAL LETTER N WITH ACUTE
+0144;AI;LATIN SMALL LETTER N WITH ACUTE
+0145;AL;LATIN CAPITAL LETTER N WITH CEDILLA
+0146;AL;LATIN SMALL LETTER N WITH CEDILLA
+0147;AL;LATIN CAPITAL LETTER N WITH CARON
+0148;AI;LATIN SMALL LETTER N WITH CARON
+0149;AI;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A;AI;LATIN CAPITAL LETTER ENG
+014B;AL;LATIN SMALL LETTER ENG
+014C;AL;LATIN CAPITAL LETTER O WITH MACRON
+014D;AI;LATIN SMALL LETTER O WITH MACRON
+014E;AL;LATIN CAPITAL LETTER O WITH BREVE
+014F;AL;LATIN SMALL LETTER O WITH BREVE
+0150;AL;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151;AL;LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152;AI;LATIN CAPITAL LIGATURE OE
+0153;AI;LATIN SMALL LIGATURE OE
+0154;AL;LATIN CAPITAL LETTER R WITH ACUTE
+0155;AL;LATIN SMALL LETTER R WITH ACUTE
+0156;AL;LATIN CAPITAL LETTER R WITH CEDILLA
+0157;AL;LATIN SMALL LETTER R WITH CEDILLA
+0158;AL;LATIN CAPITAL LETTER R WITH CARON
+0159;AL;LATIN SMALL LETTER R WITH CARON
+015A;AL;LATIN CAPITAL LETTER S WITH ACUTE
+015B;AL;LATIN SMALL LETTER S WITH ACUTE
+015C;AL;LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015D;AL;LATIN SMALL LETTER S WITH CIRCUMFLEX
+015E;AL;LATIN CAPITAL LETTER S WITH CEDILLA
+015F;AL;LATIN SMALL LETTER S WITH CEDILLA
+0160;AL;LATIN CAPITAL LETTER S WITH CARON
+0161;AL;LATIN SMALL LETTER S WITH CARON
+0162;AL;LATIN CAPITAL LETTER T WITH CEDILLA
+0163;AL;LATIN SMALL LETTER T WITH CEDILLA
+0164;AL;LATIN CAPITAL LETTER T WITH CARON
+0165;AL;LATIN SMALL LETTER T WITH CARON
+0166;AI;LATIN CAPITAL LETTER T WITH STROKE
+0167;AI;LATIN SMALL LETTER T WITH STROKE
+0168;AL;LATIN CAPITAL LETTER U WITH TILDE
+0169;AL;LATIN SMALL LETTER U WITH TILDE
+016A;AL;LATIN CAPITAL LETTER U WITH MACRON
+016B;AI;LATIN SMALL LETTER U WITH MACRON
+016C;AL;LATIN CAPITAL LETTER U WITH BREVE
+016D;AL;LATIN SMALL LETTER U WITH BREVE
+016E;AL;LATIN CAPITAL LETTER U WITH RING ABOVE
+016F;AL;LATIN SMALL LETTER U WITH RING ABOVE
+0170;AL;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171;AL;LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172;AL;LATIN CAPITAL LETTER U WITH OGONEK
+0173;AL;LATIN SMALL LETTER U WITH OGONEK
+0174;AL;LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175;AL;LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176;AL;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177;AL;LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178;AL;LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179;AL;LATIN CAPITAL LETTER Z WITH ACUTE
+017A;AL;LATIN SMALL LETTER Z WITH ACUTE
+017B;AL;LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017C;AL;LATIN SMALL LETTER Z WITH DOT ABOVE
+017D;AL;LATIN CAPITAL LETTER Z WITH CARON
+017E;AL;LATIN SMALL LETTER Z WITH CARON
+017F;AL;LATIN SMALL LETTER LONG S
+0180;AL;LATIN SMALL LETTER B WITH STROKE
+0181;AL;LATIN CAPITAL LETTER B WITH HOOK
+0182;AL;LATIN CAPITAL LETTER B WITH TOPBAR
+0183;AL;LATIN SMALL LETTER B WITH TOPBAR
+0184;AL;LATIN CAPITAL LETTER TONE SIX
+0185;AL;LATIN SMALL LETTER TONE SIX
+0186;AL;LATIN CAPITAL LETTER OPEN O
+0187;AL;LATIN CAPITAL LETTER C WITH HOOK
+0188;AL;LATIN SMALL LETTER C WITH HOOK
+0189;AL;LATIN CAPITAL LETTER AFRICAN D
+018A;AL;LATIN CAPITAL LETTER D WITH HOOK
+018B;AL;LATIN CAPITAL LETTER D WITH TOPBAR
+018C;AL;LATIN SMALL LETTER D WITH TOPBAR
+018D;AL;LATIN SMALL LETTER TURNED DELTA
+018E;AL;LATIN CAPITAL LETTER REVERSED E
+018F;AL;LATIN CAPITAL LETTER SCHWA
+0190;AL;LATIN CAPITAL LETTER OPEN E
+0191;AL;LATIN CAPITAL LETTER F WITH HOOK
+0192;AL;LATIN SMALL LETTER F WITH HOOK
+0193;AL;LATIN CAPITAL LETTER G WITH HOOK
+0194;AL;LATIN CAPITAL LETTER GAMMA
+0195;AL;LATIN SMALL LETTER HV
+0196;AL;LATIN CAPITAL LETTER IOTA
+0197;AL;LATIN CAPITAL LETTER I WITH STROKE
+0198;AL;LATIN CAPITAL LETTER K WITH HOOK
+0199;AL;LATIN SMALL LETTER K WITH HOOK
+019A;AL;LATIN SMALL LETTER L WITH BAR
+019B;AL;LATIN SMALL LETTER LAMBDA WITH STROKE
+019C;AL;LATIN CAPITAL LETTER TURNED M
+019D;AL;LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E;AL;LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019F;AL;LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0;AL;LATIN CAPITAL LETTER O WITH HORN
+01A1;AL;LATIN SMALL LETTER O WITH HORN
+01A2;AL;LATIN CAPITAL LETTER OI
+01A3;AL;LATIN SMALL LETTER OI
+01A4;AL;LATIN CAPITAL LETTER P WITH HOOK
+01A5;AL;LATIN SMALL LETTER P WITH HOOK
+01A6;AL;LATIN LETTER YR
+01A7;AL;LATIN CAPITAL LETTER TONE TWO
+01A8;AL;LATIN SMALL LETTER TONE TWO
+01A9;AL;LATIN CAPITAL LETTER ESH
+01AA;AL;LATIN LETTER REVERSED ESH LOOP
+01AB;AL;LATIN SMALL LETTER T WITH PALATAL HOOK
+01AC;AL;LATIN CAPITAL LETTER T WITH HOOK
+01AD;AL;LATIN SMALL LETTER T WITH HOOK
+01AE;AL;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF;AL;LATIN CAPITAL LETTER U WITH HORN
+01B0;AL;LATIN SMALL LETTER U WITH HORN
+01B1;AL;LATIN CAPITAL LETTER UPSILON
+01B2;AL;LATIN CAPITAL LETTER V WITH HOOK
+01B3;AL;LATIN CAPITAL LETTER Y WITH HOOK
+01B4;AL;LATIN SMALL LETTER Y WITH HOOK
+01B5;AL;LATIN CAPITAL LETTER Z WITH STROKE
+01B6;AL;LATIN SMALL LETTER Z WITH STROKE
+01B7;AL;LATIN CAPITAL LETTER EZH
+01B8;AL;LATIN CAPITAL LETTER EZH REVERSED
+01B9;AL;LATIN SMALL LETTER EZH REVERSED
+01BA;AL;LATIN SMALL LETTER EZH WITH TAIL
+01BB;AL;LATIN LETTER TWO WITH STROKE
+01BC;AL;LATIN CAPITAL LETTER TONE FIVE
+01BD;AL;LATIN SMALL LETTER TONE FIVE
+01BE;AL;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01BF;AL;LATIN LETTER WYNN
+01C0;AL;LATIN LETTER DENTAL CLICK
+01C1;AL;LATIN LETTER LATERAL CLICK
+01C2;AL;LATIN LETTER ALVEOLAR CLICK
+01C3;AL;LATIN LETTER RETROFLEX CLICK
+01C4;AL;LATIN CAPITAL LETTER DZ WITH CARON
+01C5;AL;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C6;AL;LATIN SMALL LETTER DZ WITH CARON
+01C7;AL;LATIN CAPITAL LETTER LJ
+01C8;AL;LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01C9;AL;LATIN SMALL LETTER LJ
+01CA;AL;LATIN CAPITAL LETTER NJ
+01CB;AL;LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CC;AL;LATIN SMALL LETTER NJ
+01CD;AL;LATIN CAPITAL LETTER A WITH CARON
+01CE;AI;LATIN SMALL LETTER A WITH CARON
+01CF;AL;LATIN CAPITAL LETTER I WITH CARON
+01D0;AI;LATIN SMALL LETTER I WITH CARON
+01D1;AL;LATIN CAPITAL LETTER O WITH CARON
+01D2;AI;LATIN SMALL LETTER O WITH CARON
+01D3;AL;LATIN CAPITAL LETTER U WITH CARON
+01D4;AI;LATIN SMALL LETTER U WITH CARON
+01D5;AL;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D6;AI;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01D7;AL;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D8;AI;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01D9;AL;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DA;AI;LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01DB;AL;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DC;AI;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DD;AL;LATIN SMALL LETTER TURNED E
+01DE;AL;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01DF;AL;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01E0;AL;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E1;AL;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01E2;AL;LATIN CAPITAL LETTER AE WITH MACRON
+01E3;AL;LATIN SMALL LETTER AE WITH MACRON
+01E4;AL;LATIN CAPITAL LETTER G WITH STROKE
+01E5;AL;LATIN SMALL LETTER G WITH STROKE
+01E6;AL;LATIN CAPITAL LETTER G WITH CARON
+01E7;AL;LATIN SMALL LETTER G WITH CARON
+01E8;AL;LATIN CAPITAL LETTER K WITH CARON
+01E9;AL;LATIN SMALL LETTER K WITH CARON
+01EA;AL;LATIN CAPITAL LETTER O WITH OGONEK
+01EB;AL;LATIN SMALL LETTER O WITH OGONEK
+01EC;AL;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ED;AL;LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01EE;AL;LATIN CAPITAL LETTER EZH WITH CARON
+01EF;AL;LATIN SMALL LETTER EZH WITH CARON
+01F0;AL;LATIN SMALL LETTER J WITH CARON
+01F1;AL;LATIN CAPITAL LETTER DZ
+01F2;AL;LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F3;AL;LATIN SMALL LETTER DZ
+01F4;AL;LATIN CAPITAL LETTER G WITH ACUTE
+01F5;AL;LATIN SMALL LETTER G WITH ACUTE
+01F6;AL;LATIN CAPITAL LETTER HWAIR
+01F7;AL;LATIN CAPITAL LETTER WYNN
+01F8;AL;LATIN CAPITAL LETTER N WITH GRAVE
+01F9;AL;LATIN SMALL LETTER N WITH GRAVE
+01FA;AL;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FB;AL;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01FC;AL;LATIN CAPITAL LETTER AE WITH ACUTE
+01FD;AL;LATIN SMALL LETTER AE WITH ACUTE
+01FE;AL;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01FF;AL;LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200;AL;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201;AL;LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202;AL;LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203;AL;LATIN SMALL LETTER A WITH INVERTED BREVE
+0204;AL;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205;AL;LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206;AL;LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207;AL;LATIN SMALL LETTER E WITH INVERTED BREVE
+0208;AL;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209;AL;LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020A;AL;LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020B;AL;LATIN SMALL LETTER I WITH INVERTED BREVE
+020C;AL;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020D;AL;LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020E;AL;LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020F;AL;LATIN SMALL LETTER O WITH INVERTED BREVE
+0210;AL;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211;AL;LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212;AL;LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213;AL;LATIN SMALL LETTER R WITH INVERTED BREVE
+0214;AL;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215;AL;LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216;AL;LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217;AL;LATIN SMALL LETTER U WITH INVERTED BREVE
+0218;AL;LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219;AL;LATIN SMALL LETTER S WITH COMMA BELOW
+021A;AL;LATIN CAPITAL LETTER T WITH COMMA BELOW
+021B;AL;LATIN SMALL LETTER T WITH COMMA BELOW
+021C;AL;LATIN CAPITAL LETTER YOGH
+021D;AL;LATIN SMALL LETTER YOGH
+021E;AL;LATIN CAPITAL LETTER H WITH CARON
+021F;AL;LATIN SMALL LETTER H WITH CARON
+0222;AL;LATIN CAPITAL LETTER OU
+0223;AL;LATIN SMALL LETTER OU
+0224;AL;LATIN CAPITAL LETTER Z WITH HOOK
+0225;AL;LATIN SMALL LETTER Z WITH HOOK
+0226;AL;LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227;AL;LATIN SMALL LETTER A WITH DOT ABOVE
+0228;AL;LATIN CAPITAL LETTER E WITH CEDILLA
+0229;AL;LATIN SMALL LETTER E WITH CEDILLA
+022A;AL;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022B;AL;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022C;AL;LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022D;AL;LATIN SMALL LETTER O WITH TILDE AND MACRON
+022E;AL;LATIN CAPITAL LETTER O WITH DOT ABOVE
+022F;AL;LATIN SMALL LETTER O WITH DOT ABOVE
+0230;AL;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231;AL;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232;AL;LATIN CAPITAL LETTER Y WITH MACRON
+0233;AL;LATIN SMALL LETTER Y WITH MACRON
+0250;AL;LATIN SMALL LETTER TURNED A
+0251;AI;LATIN SMALL LETTER ALPHA
+0252;AL;LATIN SMALL LETTER TURNED ALPHA
+0253;AL;LATIN SMALL LETTER B WITH HOOK
+0254;AL;LATIN SMALL LETTER OPEN O
+0255;AL;LATIN SMALL LETTER C WITH CURL
+0256;AL;LATIN SMALL LETTER D WITH TAIL
+0257;AL;LATIN SMALL LETTER D WITH HOOK
+0258;AL;LATIN SMALL LETTER REVERSED E
+0259;AL;LATIN SMALL LETTER SCHWA
+025A;AL;LATIN SMALL LETTER SCHWA WITH HOOK
+025B;AL;LATIN SMALL LETTER OPEN E
+025C;AL;LATIN SMALL LETTER REVERSED OPEN E
+025D;AL;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E;AL;LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025F;AL;LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260;AL;LATIN SMALL LETTER G WITH HOOK
+0261;AI;LATIN SMALL LETTER SCRIPT G
+0262;AL;LATIN LETTER SMALL CAPITAL G
+0263;AL;LATIN SMALL LETTER GAMMA
+0264;AL;LATIN SMALL LETTER RAMS HORN
+0265;AL;LATIN SMALL LETTER TURNED H
+0266;AL;LATIN SMALL LETTER H WITH HOOK
+0267;AL;LATIN SMALL LETTER HENG WITH HOOK
+0268;AL;LATIN SMALL LETTER I WITH STROKE
+0269;AL;LATIN SMALL LETTER IOTA
+026A;AL;LATIN LETTER SMALL CAPITAL I
+026B;AL;LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C;AL;LATIN SMALL LETTER L WITH BELT
+026D;AL;LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026E;AL;LATIN SMALL LETTER LEZH
+026F;AL;LATIN SMALL LETTER TURNED M
+0270;AL;LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271;AL;LATIN SMALL LETTER M WITH HOOK
+0272;AL;LATIN SMALL LETTER N WITH LEFT HOOK
+0273;AL;LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274;AL;LATIN LETTER SMALL CAPITAL N
+0275;AL;LATIN SMALL LETTER BARRED O
+0276;AL;LATIN LETTER SMALL CAPITAL OE
+0277;AL;LATIN SMALL LETTER CLOSED OMEGA
+0278;AL;LATIN SMALL LETTER PHI
+0279;AL;LATIN SMALL LETTER TURNED R
+027A;AL;LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B;AL;LATIN SMALL LETTER TURNED R WITH HOOK
+027C;AL;LATIN SMALL LETTER R WITH LONG LEG
+027D;AL;LATIN SMALL LETTER R WITH TAIL
+027E;AL;LATIN SMALL LETTER R WITH FISHHOOK
+027F;AL;LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280;AL;LATIN LETTER SMALL CAPITAL R
+0281;AL;LATIN LETTER SMALL CAPITAL INVERTED R
+0282;AL;LATIN SMALL LETTER S WITH HOOK
+0283;AL;LATIN SMALL LETTER ESH
+0284;AL;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285;AL;LATIN SMALL LETTER SQUAT REVERSED ESH
+0286;AL;LATIN SMALL LETTER ESH WITH CURL
+0287;AL;LATIN SMALL LETTER TURNED T
+0288;AL;LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289;AL;LATIN SMALL LETTER U BAR
+028A;AL;LATIN SMALL LETTER UPSILON
+028B;AL;LATIN SMALL LETTER V WITH HOOK
+028C;AL;LATIN SMALL LETTER TURNED V
+028D;AL;LATIN SMALL LETTER TURNED W
+028E;AL;LATIN SMALL LETTER TURNED Y
+028F;AL;LATIN LETTER SMALL CAPITAL Y
+0290;AL;LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291;AL;LATIN SMALL LETTER Z WITH CURL
+0292;AL;LATIN SMALL LETTER EZH
+0293;AL;LATIN SMALL LETTER EZH WITH CURL
+0294;AL;LATIN LETTER GLOTTAL STOP
+0295;AL;LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296;AL;LATIN LETTER INVERTED GLOTTAL STOP
+0297;AL;LATIN LETTER STRETCHED C
+0298;AL;LATIN LETTER BILABIAL CLICK
+0299;AL;LATIN LETTER SMALL CAPITAL B
+029A;AL;LATIN SMALL LETTER CLOSED OPEN E
+029B;AL;LATIN LETTER SMALL CAPITAL G WITH HOOK
+029C;AL;LATIN LETTER SMALL CAPITAL H
+029D;AL;LATIN SMALL LETTER J WITH CROSSED-TAIL
+029E;AL;LATIN SMALL LETTER TURNED K
+029F;AL;LATIN LETTER SMALL CAPITAL L
+02A0;AL;LATIN SMALL LETTER Q WITH HOOK
+02A1;AL;LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2;AL;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02A3;AL;LATIN SMALL LETTER DZ DIGRAPH
+02A4;AL;LATIN SMALL LETTER DEZH DIGRAPH
+02A5;AL;LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02A6;AL;LATIN SMALL LETTER TS DIGRAPH
+02A7;AL;LATIN SMALL LETTER TESH DIGRAPH
+02A8;AL;LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02A9;AL;LATIN SMALL LETTER FENG DIGRAPH
+02AA;AL;LATIN SMALL LETTER LS DIGRAPH
+02AB;AL;LATIN SMALL LETTER LZ DIGRAPH
+02AC;AL;LATIN LETTER BILABIAL PERCUSSIVE
+02AD;AL;LATIN LETTER BIDENTAL PERCUSSIVE
+02B0;AL;MODIFIER LETTER SMALL H
+02B1;AL;MODIFIER LETTER SMALL H WITH HOOK
+02B2;AL;MODIFIER LETTER SMALL J
+02B3;AL;MODIFIER LETTER SMALL R
+02B4;AL;MODIFIER LETTER SMALL TURNED R
+02B5;AL;MODIFIER LETTER SMALL TURNED R WITH HOOK
+02B6;AL;MODIFIER LETTER SMALL CAPITAL INVERTED R
+02B7;AL;MODIFIER LETTER SMALL W
+02B8;AL;MODIFIER LETTER SMALL Y
+02B9;AL;MODIFIER LETTER PRIME
+02BA;AL;MODIFIER LETTER DOUBLE PRIME
+02BB;AL;MODIFIER LETTER TURNED COMMA
+02BC;AL;MODIFIER LETTER APOSTROPHE
+02BD;AL;MODIFIER LETTER REVERSED COMMA
+02BE;AL;MODIFIER LETTER RIGHT HALF RING
+02BF;AL;MODIFIER LETTER LEFT HALF RING
+02C0;AL;MODIFIER LETTER GLOTTAL STOP
+02C1;AL;MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2;AL;MODIFIER LETTER LEFT ARROWHEAD
+02C3;AL;MODIFIER LETTER RIGHT ARROWHEAD
+02C4;AL;MODIFIER LETTER UP ARROWHEAD
+02C5;AL;MODIFIER LETTER DOWN ARROWHEAD
+02C6;AL;MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7;AI;CARON
+02C8;BB;MODIFIER LETTER VERTICAL LINE
+02C9;AI;MODIFIER LETTER MACRON
+02CA;AI;MODIFIER LETTER ACUTE ACCENT
+02CB;AI;MODIFIER LETTER GRAVE ACCENT
+02CC;BB;MODIFIER LETTER LOW VERTICAL LINE
+02CD;AI;MODIFIER LETTER LOW MACRON
+02CE;AL;MODIFIER LETTER LOW GRAVE ACCENT
+02CF;AL;MODIFIER LETTER LOW ACUTE ACCENT
+02D0;AI;MODIFIER LETTER TRIANGULAR COLON
+02D1;AL;MODIFIER LETTER HALF TRIANGULAR COLON
+02D2;AL;MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3;AL;MODIFIER LETTER CENTRED LEFT HALF RING
+02D4;AL;MODIFIER LETTER UP TACK
+02D5;AL;MODIFIER LETTER DOWN TACK
+02D6;AL;MODIFIER LETTER PLUS SIGN
+02D7;AL;MODIFIER LETTER MINUS SIGN
+02D8;AI;BREVE
+02D9;AI;DOT ABOVE
+02DA;AI;RING ABOVE
+02DB;AI;OGONEK
+02DC;AL;SMALL TILDE
+02DD;AI;DOUBLE ACUTE ACCENT
+02DE;AL;MODIFIER LETTER RHOTIC HOOK
+02DF;AL;MODIFIER LETTER CROSS ACCENT
+02E0;AL;MODIFIER LETTER SMALL GAMMA
+02E1;AL;MODIFIER LETTER SMALL L
+02E2;AL;MODIFIER LETTER SMALL S
+02E3;AL;MODIFIER LETTER SMALL X
+02E4;AL;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02E5;AL;MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6;AL;MODIFIER LETTER HIGH TONE BAR
+02E7;AL;MODIFIER LETTER MID TONE BAR
+02E8;AL;MODIFIER LETTER LOW TONE BAR
+02E9;AL;MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA;AL;MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB;AL;MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC;AL;MODIFIER LETTER VOICING
+02ED;AL;MODIFIER LETTER UNASPIRATED
+02EE;AL;MODIFIER LETTER DOUBLE APOSTROPHE
+0300;CM;COMBINING GRAVE ACCENT
+0301;CM;COMBINING ACUTE ACCENT
+0302;CM;COMBINING CIRCUMFLEX ACCENT
+0303;CM;COMBINING TILDE
+0304;CM;COMBINING MACRON
+0305;CM;COMBINING OVERLINE
+0306;CM;COMBINING BREVE
+0307;CM;COMBINING DOT ABOVE
+0308;CM;COMBINING DIAERESIS
+0309;CM;COMBINING HOOK ABOVE
+030A;CM;COMBINING RING ABOVE
+030B;CM;COMBINING DOUBLE ACUTE ACCENT
+030C;CM;COMBINING CARON
+030D;CM;COMBINING VERTICAL LINE ABOVE
+030E;CM;COMBINING DOUBLE VERTICAL LINE ABOVE
+030F;CM;COMBINING DOUBLE GRAVE ACCENT
+0310;CM;COMBINING CANDRABINDU
+0311;CM;COMBINING INVERTED BREVE
+0312;CM;COMBINING TURNED COMMA ABOVE
+0313;CM;COMBINING COMMA ABOVE
+0314;CM;COMBINING REVERSED COMMA ABOVE
+0315;CM;COMBINING COMMA ABOVE RIGHT
+0316;CM;COMBINING GRAVE ACCENT BELOW
+0317;CM;COMBINING ACUTE ACCENT BELOW
+0318;CM;COMBINING LEFT TACK BELOW
+0319;CM;COMBINING RIGHT TACK BELOW
+031A;CM;COMBINING LEFT ANGLE ABOVE
+031B;CM;COMBINING HORN
+031C;CM;COMBINING LEFT HALF RING BELOW
+031D;CM;COMBINING UP TACK BELOW
+031E;CM;COMBINING DOWN TACK BELOW
+031F;CM;COMBINING PLUS SIGN BELOW
+0320;CM;COMBINING MINUS SIGN BELOW
+0321;CM;COMBINING PALATALIZED HOOK BELOW
+0322;CM;COMBINING RETROFLEX HOOK BELOW
+0323;CM;COMBINING DOT BELOW
+0324;CM;COMBINING DIAERESIS BELOW
+0325;CM;COMBINING RING BELOW
+0326;CM;COMBINING COMMA BELOW
+0327;CM;COMBINING CEDILLA
+0328;CM;COMBINING OGONEK
+0329;CM;COMBINING VERTICAL LINE BELOW
+032A;CM;COMBINING BRIDGE BELOW
+032B;CM;COMBINING INVERTED DOUBLE ARCH BELOW
+032C;CM;COMBINING CARON BELOW
+032D;CM;COMBINING CIRCUMFLEX ACCENT BELOW
+032E;CM;COMBINING BREVE BELOW
+032F;CM;COMBINING INVERTED BREVE BELOW
+0330;CM;COMBINING TILDE BELOW
+0331;CM;COMBINING MACRON BELOW
+0332;CM;COMBINING LOW LINE
+0333;CM;COMBINING DOUBLE LOW LINE
+0334;CM;COMBINING TILDE OVERLAY
+0335;CM;COMBINING SHORT STROKE OVERLAY
+0336;CM;COMBINING LONG STROKE OVERLAY
+0337;CM;COMBINING SHORT SOLIDUS OVERLAY
+0338;CM;COMBINING LONG SOLIDUS OVERLAY
+0339;CM;COMBINING RIGHT HALF RING BELOW
+033A;CM;COMBINING INVERTED BRIDGE BELOW
+033B;CM;COMBINING SQUARE BELOW
+033C;CM;COMBINING SEAGULL BELOW
+033D;CM;COMBINING X ABOVE
+033E;CM;COMBINING VERTICAL TILDE
+033F;CM;COMBINING DOUBLE OVERLINE
+0340;CM;COMBINING GRAVE TONE MARK
+0341;CM;COMBINING ACUTE TONE MARK
+0342;CM;COMBINING GREEK PERISPOMENI
+0343;CM;COMBINING GREEK KORONIS
+0344;CM;COMBINING GREEK DIALYTIKA TONOS
+0345;CM;COMBINING GREEK YPOGEGRAMMENI
+0346;CM;COMBINING BRIDGE ABOVE
+0347;CM;COMBINING EQUALS SIGN BELOW
+0348;CM;COMBINING DOUBLE VERTICAL LINE BELOW
+0349;CM;COMBINING LEFT ANGLE BELOW
+034A;CM;COMBINING NOT TILDE ABOVE
+034B;CM;COMBINING HOMOTHETIC ABOVE
+034C;CM;COMBINING ALMOST EQUAL TO ABOVE
+034D;CM;COMBINING LEFT RIGHT ARROW BELOW
+034E;CM;COMBINING UPWARDS ARROW BELOW
+0360;CM;COMBINING DOUBLE TILDE
+0361;CM;COMBINING DOUBLE INVERTED BREVE
+0362;CM;COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0374;AL;GREEK NUMERAL SIGN
+0375;AL;GREEK LOWER NUMERAL SIGN
+037A;AL;GREEK YPOGEGRAMMENI
+037E;AL;GREEK QUESTION MARK
+0384;AL;GREEK TONOS
+0385;AL;GREEK DIALYTIKA TONOS
+0386;AL;GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387;AL;GREEK ANO TELEIA
+0388;AL;GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389;AL;GREEK CAPITAL LETTER ETA WITH TONOS
+038A;AL;GREEK CAPITAL LETTER IOTA WITH TONOS
+038C;AL;GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E;AL;GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F;AL;GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390;AL;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391;AI;GREEK CAPITAL LETTER ALPHA
+0392;AI;GREEK CAPITAL LETTER BETA
+0393;AI;GREEK CAPITAL LETTER GAMMA
+0394;AI;GREEK CAPITAL LETTER DELTA
+0395;AI;GREEK CAPITAL LETTER EPSILON
+0396;AI;GREEK CAPITAL LETTER ZETA
+0397;AI;GREEK CAPITAL LETTER ETA
+0398;AI;GREEK CAPITAL LETTER THETA
+0399;AI;GREEK CAPITAL LETTER IOTA
+039A;AI;GREEK CAPITAL LETTER KAPPA
+039B;AI;GREEK CAPITAL LETTER LAMDA
+039C;AI;GREEK CAPITAL LETTER MU
+039D;AI;GREEK CAPITAL LETTER NU
+039E;AI;GREEK CAPITAL LETTER XI
+039F;AI;GREEK CAPITAL LETTER OMICRON
+03A0;AI;GREEK CAPITAL LETTER PI
+03A1;AI;GREEK CAPITAL LETTER RHO
+03A3;AI;GREEK CAPITAL LETTER SIGMA
+03A4;AI;GREEK CAPITAL LETTER TAU
+03A5;AI;GREEK CAPITAL LETTER UPSILON
+03A6;AI;GREEK CAPITAL LETTER PHI
+03A7;AI;GREEK CAPITAL LETTER CHI
+03A8;AI;GREEK CAPITAL LETTER PSI
+03A9;AI;GREEK CAPITAL LETTER OMEGA
+03AA;AL;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB;AL;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03AC;AL;GREEK SMALL LETTER ALPHA WITH TONOS
+03AD;AL;GREEK SMALL LETTER EPSILON WITH TONOS
+03AE;AL;GREEK SMALL LETTER ETA WITH TONOS
+03AF;AL;GREEK SMALL LETTER IOTA WITH TONOS
+03B0;AL;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03B1;AI;GREEK SMALL LETTER ALPHA
+03B2;AI;GREEK SMALL LETTER BETA
+03B3;AI;GREEK SMALL LETTER GAMMA
+03B4;AI;GREEK SMALL LETTER DELTA
+03B5;AI;GREEK SMALL LETTER EPSILON
+03B6;AI;GREEK SMALL LETTER ZETA
+03B7;AI;GREEK SMALL LETTER ETA
+03B8;AI;GREEK SMALL LETTER THETA
+03B9;AI;GREEK SMALL LETTER IOTA
+03BA;AI;GREEK SMALL LETTER KAPPA
+03BB;AI;GREEK SMALL LETTER LAMDA
+03BC;AI;GREEK SMALL LETTER MU
+03BD;AI;GREEK SMALL LETTER NU
+03BE;AI;GREEK SMALL LETTER XI
+03BF;AI;GREEK SMALL LETTER OMICRON
+03C0;AI;GREEK SMALL LETTER PI
+03C1;AI;GREEK SMALL LETTER RHO
+03C2;AL;GREEK SMALL LETTER FINAL SIGMA
+03C3;AI;GREEK SMALL LETTER SIGMA
+03C4;AI;GREEK SMALL LETTER TAU
+03C5;AI;GREEK SMALL LETTER UPSILON
+03C6;AI;GREEK SMALL LETTER PHI
+03C7;AI;GREEK SMALL LETTER CHI
+03C8;AI;GREEK SMALL LETTER PSI
+03C9;AI;GREEK SMALL LETTER OMEGA
+03CA;AL;GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03CB;AL;GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03CC;AL;GREEK SMALL LETTER OMICRON WITH TONOS
+03CD;AL;GREEK SMALL LETTER UPSILON WITH TONOS
+03CE;AL;GREEK SMALL LETTER OMEGA WITH TONOS
+03D0;AL;GREEK BETA SYMBOL
+03D1;AL;GREEK THETA SYMBOL
+03D2;AL;GREEK UPSILON WITH HOOK SYMBOL
+03D3;AL;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03D4;AL;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03D5;AL;GREEK PHI SYMBOL
+03D6;AL;GREEK PI SYMBOL
+03D7;AL;GREEK KAI SYMBOL
+03DA;AL;GREEK LETTER STIGMA
+03DB;AL;GREEK SMALL LETTER STIGMA
+03DC;AL;GREEK LETTER DIGAMMA
+03DD;AL;GREEK SMALL LETTER DIGAMMA
+03DE;AL;GREEK LETTER KOPPA
+03DF;AL;GREEK SMALL LETTER KOPPA
+03E0;AL;GREEK LETTER SAMPI
+03E1;AL;GREEK SMALL LETTER SAMPI
+03E2;AL;COPTIC CAPITAL LETTER SHEI
+03E3;AL;COPTIC SMALL LETTER SHEI
+03E4;AL;COPTIC CAPITAL LETTER FEI
+03E5;AL;COPTIC SMALL LETTER FEI
+03E6;AL;COPTIC CAPITAL LETTER KHEI
+03E7;AL;COPTIC SMALL LETTER KHEI
+03E8;AL;COPTIC CAPITAL LETTER HORI
+03E9;AL;COPTIC SMALL LETTER HORI
+03EA;AL;COPTIC CAPITAL LETTER GANGIA
+03EB;AL;COPTIC SMALL LETTER GANGIA
+03EC;AL;COPTIC CAPITAL LETTER SHIMA
+03ED;AL;COPTIC SMALL LETTER SHIMA
+03EE;AL;COPTIC CAPITAL LETTER DEI
+03EF;AL;COPTIC SMALL LETTER DEI
+03F0;AL;GREEK KAPPA SYMBOL
+03F1;AL;GREEK RHO SYMBOL
+03F2;AL;GREEK LUNATE SIGMA SYMBOL
+03F3;AL;GREEK LETTER YOT
+0400;AL;CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401;AI;CYRILLIC CAPITAL LETTER IO
+0402;AL;CYRILLIC CAPITAL LETTER DJE
+0403;AL;CYRILLIC CAPITAL LETTER GJE
+0404;AL;CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405;AL;CYRILLIC CAPITAL LETTER DZE
+0406;AL;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407;AL;CYRILLIC CAPITAL LETTER YI
+0408;AL;CYRILLIC CAPITAL LETTER JE
+0409;AL;CYRILLIC CAPITAL LETTER LJE
+040A;AL;CYRILLIC CAPITAL LETTER NJE
+040B;AL;CYRILLIC CAPITAL LETTER TSHE
+040C;AL;CYRILLIC CAPITAL LETTER KJE
+040D;AL;CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E;AL;CYRILLIC CAPITAL LETTER SHORT U
+040F;AL;CYRILLIC CAPITAL LETTER DZHE
+0410;AI;CYRILLIC CAPITAL LETTER A
+0411;AI;CYRILLIC CAPITAL LETTER BE
+0412;AI;CYRILLIC CAPITAL LETTER VE
+0413;AI;CYRILLIC CAPITAL LETTER GHE
+0414;AI;CYRILLIC CAPITAL LETTER DE
+0415;AI;CYRILLIC CAPITAL LETTER IE
+0416;AI;CYRILLIC CAPITAL LETTER ZHE
+0417;AI;CYRILLIC CAPITAL LETTER ZE
+0418;AI;CYRILLIC CAPITAL LETTER I
+0419;AI;CYRILLIC CAPITAL LETTER SHORT I
+041A;AI;CYRILLIC CAPITAL LETTER KA
+041B;AI;CYRILLIC CAPITAL LETTER EL
+041C;AI;CYRILLIC CAPITAL LETTER EM
+041D;AI;CYRILLIC CAPITAL LETTER EN
+041E;AI;CYRILLIC CAPITAL LETTER O
+041F;AI;CYRILLIC CAPITAL LETTER PE
+0420;AI;CYRILLIC CAPITAL LETTER ER
+0421;AI;CYRILLIC CAPITAL LETTER ES
+0422;AI;CYRILLIC CAPITAL LETTER TE
+0423;AI;CYRILLIC CAPITAL LETTER U
+0424;AI;CYRILLIC CAPITAL LETTER EF
+0425;AI;CYRILLIC CAPITAL LETTER HA
+0426;AI;CYRILLIC CAPITAL LETTER TSE
+0427;AI;CYRILLIC CAPITAL LETTER CHE
+0428;AI;CYRILLIC CAPITAL LETTER SHA
+0429;AI;CYRILLIC CAPITAL LETTER SHCHA
+042A;AI;CYRILLIC CAPITAL LETTER HARD SIGN
+042B;AI;CYRILLIC CAPITAL LETTER YERU
+042C;AI;CYRILLIC CAPITAL LETTER SOFT SIGN
+042D;AI;CYRILLIC CAPITAL LETTER E
+042E;AI;CYRILLIC CAPITAL LETTER YU
+042F;AI;CYRILLIC CAPITAL LETTER YA
+0430;AI;CYRILLIC SMALL LETTER A
+0431;AI;CYRILLIC SMALL LETTER BE
+0432;AI;CYRILLIC SMALL LETTER VE
+0433;AI;CYRILLIC SMALL LETTER GHE
+0434;AI;CYRILLIC SMALL LETTER DE
+0435;AI;CYRILLIC SMALL LETTER IE
+0436;AI;CYRILLIC SMALL LETTER ZHE
+0437;AI;CYRILLIC SMALL LETTER ZE
+0438;AI;CYRILLIC SMALL LETTER I
+0439;AI;CYRILLIC SMALL LETTER SHORT I
+043A;AI;CYRILLIC SMALL LETTER KA
+043B;AI;CYRILLIC SMALL LETTER EL
+043C;AI;CYRILLIC SMALL LETTER EM
+043D;AI;CYRILLIC SMALL LETTER EN
+043E;AI;CYRILLIC SMALL LETTER O
+043F;AI;CYRILLIC SMALL LETTER PE
+0440;AI;CYRILLIC SMALL LETTER ER
+0441;AI;CYRILLIC SMALL LETTER ES
+0442;AI;CYRILLIC SMALL LETTER TE
+0443;AI;CYRILLIC SMALL LETTER U
+0444;AI;CYRILLIC SMALL LETTER EF
+0445;AI;CYRILLIC SMALL LETTER HA
+0446;AI;CYRILLIC SMALL LETTER TSE
+0447;AI;CYRILLIC SMALL LETTER CHE
+0448;AI;CYRILLIC SMALL LETTER SHA
+0449;AI;CYRILLIC SMALL LETTER SHCHA
+044A;AI;CYRILLIC SMALL LETTER HARD SIGN
+044B;AI;CYRILLIC SMALL LETTER YERU
+044C;AI;CYRILLIC SMALL LETTER SOFT SIGN
+044D;AI;CYRILLIC SMALL LETTER E
+044E;AI;CYRILLIC SMALL LETTER YU
+044F;AI;CYRILLIC SMALL LETTER YA
+0450;AL;CYRILLIC SMALL LETTER IE WITH GRAVE
+0451;AI;CYRILLIC SMALL LETTER IO
+0452;AL;CYRILLIC SMALL LETTER DJE
+0453;AL;CYRILLIC SMALL LETTER GJE
+0454;AL;CYRILLIC SMALL LETTER UKRAINIAN IE
+0455;AL;CYRILLIC SMALL LETTER DZE
+0456;AL;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457;AL;CYRILLIC SMALL LETTER YI
+0458;AL;CYRILLIC SMALL LETTER JE
+0459;AL;CYRILLIC SMALL LETTER LJE
+045A;AL;CYRILLIC SMALL LETTER NJE
+045B;AL;CYRILLIC SMALL LETTER TSHE
+045C;AL;CYRILLIC SMALL LETTER KJE
+045D;AL;CYRILLIC SMALL LETTER I WITH GRAVE
+045E;AL;CYRILLIC SMALL LETTER SHORT U
+045F;AL;CYRILLIC SMALL LETTER DZHE
+0460;AL;CYRILLIC CAPITAL LETTER OMEGA
+0461;AL;CYRILLIC SMALL LETTER OMEGA
+0462;AL;CYRILLIC CAPITAL LETTER YAT
+0463;AL;CYRILLIC SMALL LETTER YAT
+0464;AL;CYRILLIC CAPITAL LETTER IOTIFIED E
+0465;AL;CYRILLIC SMALL LETTER IOTIFIED E
+0466;AL;CYRILLIC CAPITAL LETTER LITTLE YUS
+0467;AL;CYRILLIC SMALL LETTER LITTLE YUS
+0468;AL;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469;AL;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A;AL;CYRILLIC CAPITAL LETTER BIG YUS
+046B;AL;CYRILLIC SMALL LETTER BIG YUS
+046C;AL;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D;AL;CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E;AL;CYRILLIC CAPITAL LETTER KSI
+046F;AL;CYRILLIC SMALL LETTER KSI
+0470;AL;CYRILLIC CAPITAL LETTER PSI
+0471;AL;CYRILLIC SMALL LETTER PSI
+0472;AL;CYRILLIC CAPITAL LETTER FITA
+0473;AL;CYRILLIC SMALL LETTER FITA
+0474;AL;CYRILLIC CAPITAL LETTER IZHITSA
+0475;AL;CYRILLIC SMALL LETTER IZHITSA
+0476;AL;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477;AL;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478;AL;CYRILLIC CAPITAL LETTER UK
+0479;AL;CYRILLIC SMALL LETTER UK
+047A;AL;CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B;AL;CYRILLIC SMALL LETTER ROUND OMEGA
+047C;AL;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D;AL;CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E;AL;CYRILLIC CAPITAL LETTER OT
+047F;AL;CYRILLIC SMALL LETTER OT
+0480;AL;CYRILLIC CAPITAL LETTER KOPPA
+0481;AL;CYRILLIC SMALL LETTER KOPPA
+0482;AL;CYRILLIC THOUSANDS SIGN
+0483;CM;COMBINING CYRILLIC TITLO
+0484;CM;COMBINING CYRILLIC PALATALIZATION
+0485;CM;COMBINING CYRILLIC DASIA PNEUMATA
+0486;CM;COMBINING CYRILLIC PSILI PNEUMATA
+0488;CM;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489;CM;COMBINING CYRILLIC MILLIONS SIGN
+048C;AL;CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D;AL;CYRILLIC SMALL LETTER SEMISOFT SIGN
+048E;AL;CYRILLIC CAPITAL LETTER ER WITH TICK
+048F;AL;CYRILLIC SMALL LETTER ER WITH TICK
+0490;AL;CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491;AL;CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492;AL;CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493;AL;CYRILLIC SMALL LETTER GHE WITH STROKE
+0494;AL;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495;AL;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496;AL;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497;AL;CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498;AL;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499;AL;CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049A;AL;CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B;AL;CYRILLIC SMALL LETTER KA WITH DESCENDER
+049C;AL;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D;AL;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049E;AL;CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F;AL;CYRILLIC SMALL LETTER KA WITH STROKE
+04A0;AL;CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1;AL;CYRILLIC SMALL LETTER BASHKIR KA
+04A2;AL;CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3;AL;CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A4;AL;CYRILLIC CAPITAL LIGATURE EN GHE
+04A5;AL;CYRILLIC SMALL LIGATURE EN GHE
+04A6;AL;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A7;AL;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A8;AL;CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9;AL;CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA;AL;CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB;AL;CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AC;AL;CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD;AL;CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AE;AL;CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF;AL;CYRILLIC SMALL LETTER STRAIGHT U
+04B0;AL;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1;AL;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B2;AL;CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3;AL;CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B4;AL;CYRILLIC CAPITAL LIGATURE TE TSE
+04B5;AL;CYRILLIC SMALL LIGATURE TE TSE
+04B6;AL;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7;AL;CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B8;AL;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9;AL;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04BA;AL;CYRILLIC CAPITAL LETTER SHHA
+04BB;AL;CYRILLIC SMALL LETTER SHHA
+04BC;AL;CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD;AL;CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE;AL;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF;AL;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04C0;AL;CYRILLIC LETTER PALOCHKA
+04C1;AL;CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C2;AL;CYRILLIC SMALL LETTER ZHE WITH BREVE
+04C3;AL;CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4;AL;CYRILLIC SMALL LETTER KA WITH HOOK
+04C7;AL;CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8;AL;CYRILLIC SMALL LETTER EN WITH HOOK
+04CB;AL;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC;AL;CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04D0;AL;CYRILLIC CAPITAL LETTER A WITH BREVE
+04D1;AL;CYRILLIC SMALL LETTER A WITH BREVE
+04D2;AL;CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D3;AL;CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D4;AL;CYRILLIC CAPITAL LIGATURE A IE
+04D5;AL;CYRILLIC SMALL LIGATURE A IE
+04D6;AL;CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D7;AL;CYRILLIC SMALL LETTER IE WITH BREVE
+04D8;AL;CYRILLIC CAPITAL LETTER SCHWA
+04D9;AL;CYRILLIC SMALL LETTER SCHWA
+04DA;AL;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DB;AL;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DC;AL;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DD;AL;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DE;AL;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04DF;AL;CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E0;AL;CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1;AL;CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E2;AL;CYRILLIC CAPITAL LETTER I WITH MACRON
+04E3;AL;CYRILLIC SMALL LETTER I WITH MACRON
+04E4;AL;CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E5;AL;CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E6;AL;CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E7;AL;CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E8;AL;CYRILLIC CAPITAL LETTER BARRED O
+04E9;AL;CYRILLIC SMALL LETTER BARRED O
+04EA;AL;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EB;AL;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EC;AL;CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ED;AL;CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EE;AL;CYRILLIC CAPITAL LETTER U WITH MACRON
+04EF;AL;CYRILLIC SMALL LETTER U WITH MACRON
+04F0;AL;CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F1;AL;CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F2;AL;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F3;AL;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F4;AL;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F5;AL;CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F8;AL;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04F9;AL;CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0531;AL;ARMENIAN CAPITAL LETTER AYB
+0532;AL;ARMENIAN CAPITAL LETTER BEN
+0533;AL;ARMENIAN CAPITAL LETTER GIM
+0534;AL;ARMENIAN CAPITAL LETTER DA
+0535;AL;ARMENIAN CAPITAL LETTER ECH
+0536;AL;ARMENIAN CAPITAL LETTER ZA
+0537;AL;ARMENIAN CAPITAL LETTER EH
+0538;AL;ARMENIAN CAPITAL LETTER ET
+0539;AL;ARMENIAN CAPITAL LETTER TO
+053A;AL;ARMENIAN CAPITAL LETTER ZHE
+053B;AL;ARMENIAN CAPITAL LETTER INI
+053C;AL;ARMENIAN CAPITAL LETTER LIWN
+053D;AL;ARMENIAN CAPITAL LETTER XEH
+053E;AL;ARMENIAN CAPITAL LETTER CA
+053F;AL;ARMENIAN CAPITAL LETTER KEN
+0540;AL;ARMENIAN CAPITAL LETTER HO
+0541;AL;ARMENIAN CAPITAL LETTER JA
+0542;AL;ARMENIAN CAPITAL LETTER GHAD
+0543;AL;ARMENIAN CAPITAL LETTER CHEH
+0544;AL;ARMENIAN CAPITAL LETTER MEN
+0545;AL;ARMENIAN CAPITAL LETTER YI
+0546;AL;ARMENIAN CAPITAL LETTER NOW
+0547;AL;ARMENIAN CAPITAL LETTER SHA
+0548;AL;ARMENIAN CAPITAL LETTER VO
+0549;AL;ARMENIAN CAPITAL LETTER CHA
+054A;AL;ARMENIAN CAPITAL LETTER PEH
+054B;AL;ARMENIAN CAPITAL LETTER JHEH
+054C;AL;ARMENIAN CAPITAL LETTER RA
+054D;AL;ARMENIAN CAPITAL LETTER SEH
+054E;AL;ARMENIAN CAPITAL LETTER VEW
+054F;AL;ARMENIAN CAPITAL LETTER TIWN
+0550;AL;ARMENIAN CAPITAL LETTER REH
+0551;AL;ARMENIAN CAPITAL LETTER CO
+0552;AL;ARMENIAN CAPITAL LETTER YIWN
+0553;AL;ARMENIAN CAPITAL LETTER PIWR
+0554;AL;ARMENIAN CAPITAL LETTER KEH
+0555;AL;ARMENIAN CAPITAL LETTER OH
+0556;AL;ARMENIAN CAPITAL LETTER FEH
+0559;AL;ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A;AL;ARMENIAN APOSTROPHE
+055B;AL;ARMENIAN EMPHASIS MARK
+055C;AL;ARMENIAN EXCLAMATION MARK
+055D;AL;ARMENIAN COMMA
+055E;AL;ARMENIAN QUESTION MARK
+055F;AL;ARMENIAN ABBREVIATION MARK
+0561;AL;ARMENIAN SMALL LETTER AYB
+0562;AL;ARMENIAN SMALL LETTER BEN
+0563;AL;ARMENIAN SMALL LETTER GIM
+0564;AL;ARMENIAN SMALL LETTER DA
+0565;AL;ARMENIAN SMALL LETTER ECH
+0566;AL;ARMENIAN SMALL LETTER ZA
+0567;AL;ARMENIAN SMALL LETTER EH
+0568;AL;ARMENIAN SMALL LETTER ET
+0569;AL;ARMENIAN SMALL LETTER TO
+056A;AL;ARMENIAN SMALL LETTER ZHE
+056B;AL;ARMENIAN SMALL LETTER INI
+056C;AL;ARMENIAN SMALL LETTER LIWN
+056D;AL;ARMENIAN SMALL LETTER XEH
+056E;AL;ARMENIAN SMALL LETTER CA
+056F;AL;ARMENIAN SMALL LETTER KEN
+0570;AL;ARMENIAN SMALL LETTER HO
+0571;AL;ARMENIAN SMALL LETTER JA
+0572;AL;ARMENIAN SMALL LETTER GHAD
+0573;AL;ARMENIAN SMALL LETTER CHEH
+0574;AL;ARMENIAN SMALL LETTER MEN
+0575;AL;ARMENIAN SMALL LETTER YI
+0576;AL;ARMENIAN SMALL LETTER NOW
+0577;AL;ARMENIAN SMALL LETTER SHA
+0578;AL;ARMENIAN SMALL LETTER VO
+0579;AL;ARMENIAN SMALL LETTER CHA
+057A;AL;ARMENIAN SMALL LETTER PEH
+057B;AL;ARMENIAN SMALL LETTER JHEH
+057C;AL;ARMENIAN SMALL LETTER RA
+057D;AL;ARMENIAN SMALL LETTER SEH
+057E;AL;ARMENIAN SMALL LETTER VEW
+057F;AL;ARMENIAN SMALL LETTER TIWN
+0580;AL;ARMENIAN SMALL LETTER REH
+0581;AL;ARMENIAN SMALL LETTER CO
+0582;AL;ARMENIAN SMALL LETTER YIWN
+0583;AL;ARMENIAN SMALL LETTER PIWR
+0584;AL;ARMENIAN SMALL LETTER KEH
+0585;AL;ARMENIAN SMALL LETTER OH
+0586;AL;ARMENIAN SMALL LETTER FEH
+0587;AL;ARMENIAN SMALL LIGATURE ECH YIWN
+0589;IS;ARMENIAN FULL STOP
+058A;BA;ARMENIAN HYPHEN
+0591;CM;HEBREW ACCENT ETNAHTA
+0592;CM;HEBREW ACCENT SEGOL
+0593;CM;HEBREW ACCENT SHALSHELET
+0594;CM;HEBREW ACCENT ZAQEF QATAN
+0595;CM;HEBREW ACCENT ZAQEF GADOL
+0596;CM;HEBREW ACCENT TIPEHA
+0597;CM;HEBREW ACCENT REVIA
+0598;CM;HEBREW ACCENT ZARQA
+0599;CM;HEBREW ACCENT PASHTA
+059A;CM;HEBREW ACCENT YETIV
+059B;CM;HEBREW ACCENT TEVIR
+059C;CM;HEBREW ACCENT GERESH
+059D;CM;HEBREW ACCENT GERESH MUQDAM
+059E;CM;HEBREW ACCENT GERSHAYIM
+059F;CM;HEBREW ACCENT QARNEY PARA
+05A0;CM;HEBREW ACCENT TELISHA GEDOLA
+05A1;CM;HEBREW ACCENT PAZER
+05A3;CM;HEBREW ACCENT MUNAH
+05A4;CM;HEBREW ACCENT MAHAPAKH
+05A5;CM;HEBREW ACCENT MERKHA
+05A6;CM;HEBREW ACCENT MERKHA KEFULA
+05A7;CM;HEBREW ACCENT DARGA
+05A8;CM;HEBREW ACCENT QADMA
+05A9;CM;HEBREW ACCENT TELISHA QETANA
+05AA;CM;HEBREW ACCENT YERAH BEN YOMO
+05AB;CM;HEBREW ACCENT OLE
+05AC;CM;HEBREW ACCENT ILUY
+05AD;CM;HEBREW ACCENT DEHI
+05AE;CM;HEBREW ACCENT ZINOR
+05AF;CM;HEBREW MARK MASORA CIRCLE
+05B0;CM;HEBREW POINT SHEVA
+05B1;CM;HEBREW POINT HATAF SEGOL
+05B2;CM;HEBREW POINT HATAF PATAH
+05B3;CM;HEBREW POINT HATAF QAMATS
+05B4;CM;HEBREW POINT HIRIQ
+05B5;CM;HEBREW POINT TSERE
+05B6;CM;HEBREW POINT SEGOL
+05B7;CM;HEBREW POINT PATAH
+05B8;CM;HEBREW POINT QAMATS
+05B9;CM;HEBREW POINT HOLAM
+05BB;CM;HEBREW POINT QUBUTS
+05BC;CM;HEBREW POINT DAGESH OR MAPIQ
+05BD;CM;HEBREW POINT METEG
+05BE;AL;HEBREW PUNCTUATION MAQAF
+05BF;CM;HEBREW POINT RAFE
+05C0;AL;HEBREW PUNCTUATION PASEQ
+05C1;CM;HEBREW POINT SHIN DOT
+05C2;CM;HEBREW POINT SIN DOT
+05C3;AL;HEBREW PUNCTUATION SOF PASUQ
+05C4;CM;HEBREW MARK UPPER DOT
+05D0;AL;HEBREW LETTER ALEF
+05D1;AL;HEBREW LETTER BET
+05D2;AL;HEBREW LETTER GIMEL
+05D3;AL;HEBREW LETTER DALET
+05D4;AL;HEBREW LETTER HE
+05D5;AL;HEBREW LETTER VAV
+05D6;AL;HEBREW LETTER ZAYIN
+05D7;AL;HEBREW LETTER HET
+05D8;AL;HEBREW LETTER TET
+05D9;AL;HEBREW LETTER YOD
+05DA;AL;HEBREW LETTER FINAL KAF
+05DB;AL;HEBREW LETTER KAF
+05DC;AL;HEBREW LETTER LAMED
+05DD;AL;HEBREW LETTER FINAL MEM
+05DE;AL;HEBREW LETTER MEM
+05DF;AL;HEBREW LETTER FINAL NUN
+05E0;AL;HEBREW LETTER NUN
+05E1;AL;HEBREW LETTER SAMEKH
+05E2;AL;HEBREW LETTER AYIN
+05E3;AL;HEBREW LETTER FINAL PE
+05E4;AL;HEBREW LETTER PE
+05E5;AL;HEBREW LETTER FINAL TSADI
+05E6;AL;HEBREW LETTER TSADI
+05E7;AL;HEBREW LETTER QOF
+05E8;AL;HEBREW LETTER RESH
+05E9;AL;HEBREW LETTER SHIN
+05EA;AL;HEBREW LETTER TAV
+05F0;AL;HEBREW LIGATURE YIDDISH DOUBLE VAV
+05F1;AL;HEBREW LIGATURE YIDDISH VAV YOD
+05F2;AL;HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3;AL;HEBREW PUNCTUATION GERESH
+05F4;AL;HEBREW PUNCTUATION GERSHAYIM
+060C;AL;ARABIC COMMA
+061B;AL;ARABIC SEMICOLON
+061F;AL;ARABIC QUESTION MARK
+0621;AL;ARABIC LETTER HAMZA
+0622;AL;ARABIC LETTER ALEF WITH MADDA ABOVE
+0623;AL;ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624;AL;ARABIC LETTER WAW WITH HAMZA ABOVE
+0625;AL;ARABIC LETTER ALEF WITH HAMZA BELOW
+0626;AL;ARABIC LETTER YEH WITH HAMZA ABOVE
+0627;AL;ARABIC LETTER ALEF
+0628;AL;ARABIC LETTER BEH
+0629;AL;ARABIC LETTER TEH MARBUTA
+062A;AL;ARABIC LETTER TEH
+062B;AL;ARABIC LETTER THEH
+062C;AL;ARABIC LETTER JEEM
+062D;AL;ARABIC LETTER HAH
+062E;AL;ARABIC LETTER KHAH
+062F;AL;ARABIC LETTER DAL
+0630;AL;ARABIC LETTER THAL
+0631;AL;ARABIC LETTER REH
+0632;AL;ARABIC LETTER ZAIN
+0633;AL;ARABIC LETTER SEEN
+0634;AL;ARABIC LETTER SHEEN
+0635;AL;ARABIC LETTER SAD
+0636;AL;ARABIC LETTER DAD
+0637;AL;ARABIC LETTER TAH
+0638;AL;ARABIC LETTER ZAH
+0639;AL;ARABIC LETTER AIN
+063A;AL;ARABIC LETTER GHAIN
+0640;AL;ARABIC TATWEEL
+0641;AL;ARABIC LETTER FEH
+0642;AL;ARABIC LETTER QAF
+0643;AL;ARABIC LETTER KAF
+0644;AL;ARABIC LETTER LAM
+0645;AL;ARABIC LETTER MEEM
+0646;AL;ARABIC LETTER NOON
+0647;AL;ARABIC LETTER HEH
+0648;AL;ARABIC LETTER WAW
+0649;AL;ARABIC LETTER ALEF MAKSURA
+064A;AL;ARABIC LETTER YEH
+064B;CM;ARABIC FATHATAN
+064C;CM;ARABIC DAMMATAN
+064D;CM;ARABIC KASRATAN
+064E;CM;ARABIC FATHA
+064F;CM;ARABIC DAMMA
+0650;CM;ARABIC KASRA
+0651;CM;ARABIC SHADDA
+0652;CM;ARABIC SUKUN
+0653;CM;ARABIC MADDAH ABOVE
+0654;CM;ARABIC HAMZA ABOVE
+0655;CM;ARABIC HAMZA BELOW
+0660;NU;ARABIC-INDIC DIGIT ZERO
+0661;NU;ARABIC-INDIC DIGIT ONE
+0662;NU;ARABIC-INDIC DIGIT TWO
+0663;NU;ARABIC-INDIC DIGIT THREE
+0664;NU;ARABIC-INDIC DIGIT FOUR
+0665;NU;ARABIC-INDIC DIGIT FIVE
+0666;NU;ARABIC-INDIC DIGIT SIX
+0667;NU;ARABIC-INDIC DIGIT SEVEN
+0668;NU;ARABIC-INDIC DIGIT EIGHT
+0669;NU;ARABIC-INDIC DIGIT NINE
+066A;AL;ARABIC PERCENT SIGN
+066B;AL;ARABIC DECIMAL SEPARATOR
+066C;AL;ARABIC THOUSANDS SEPARATOR
+066D;AL;ARABIC FIVE POINTED STAR
+0670;CM;ARABIC LETTER SUPERSCRIPT ALEF
+0671;AL;ARABIC LETTER ALEF WASLA
+0672;AL;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673;AL;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674;AL;ARABIC LETTER HIGH HAMZA
+0675;AL;ARABIC LETTER HIGH HAMZA ALEF
+0676;AL;ARABIC LETTER HIGH HAMZA WAW
+0677;AL;ARABIC LETTER U WITH HAMZA ABOVE
+0678;AL;ARABIC LETTER HIGH HAMZA YEH
+0679;AL;ARABIC LETTER TTEH
+067A;AL;ARABIC LETTER TTEHEH
+067B;AL;ARABIC LETTER BEEH
+067C;AL;ARABIC LETTER TEH WITH RING
+067D;AL;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067E;AL;ARABIC LETTER PEH
+067F;AL;ARABIC LETTER TEHEH
+0680;AL;ARABIC LETTER BEHEH
+0681;AL;ARABIC LETTER HAH WITH HAMZA ABOVE
+0682;AL;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683;AL;ARABIC LETTER NYEH
+0684;AL;ARABIC LETTER DYEH
+0685;AL;ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686;AL;ARABIC LETTER TCHEH
+0687;AL;ARABIC LETTER TCHEHEH
+0688;AL;ARABIC LETTER DDAL
+0689;AL;ARABIC LETTER DAL WITH RING
+068A;AL;ARABIC LETTER DAL WITH DOT BELOW
+068B;AL;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C;AL;ARABIC LETTER DAHAL
+068D;AL;ARABIC LETTER DDAHAL
+068E;AL;ARABIC LETTER DUL
+068F;AL;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690;AL;ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691;AL;ARABIC LETTER RREH
+0692;AL;ARABIC LETTER REH WITH SMALL V
+0693;AL;ARABIC LETTER REH WITH RING
+0694;AL;ARABIC LETTER REH WITH DOT BELOW
+0695;AL;ARABIC LETTER REH WITH SMALL V BELOW
+0696;AL;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697;AL;ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698;AL;ARABIC LETTER JEH
+0699;AL;ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069A;AL;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B;AL;ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C;AL;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069D;AL;ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E;AL;ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069F;AL;ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06A0;AL;ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06A1;AL;ARABIC LETTER DOTLESS FEH
+06A2;AL;ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3;AL;ARABIC LETTER FEH WITH DOT BELOW
+06A4;AL;ARABIC LETTER VEH
+06A5;AL;ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6;AL;ARABIC LETTER PEHEH
+06A7;AL;ARABIC LETTER QAF WITH DOT ABOVE
+06A8;AL;ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06A9;AL;ARABIC LETTER KEHEH
+06AA;AL;ARABIC LETTER SWASH KAF
+06AB;AL;ARABIC LETTER KAF WITH RING
+06AC;AL;ARABIC LETTER KAF WITH DOT ABOVE
+06AD;AL;ARABIC LETTER NG
+06AE;AL;ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF;AL;ARABIC LETTER GAF
+06B0;AL;ARABIC LETTER GAF WITH RING
+06B1;AL;ARABIC LETTER NGOEH
+06B2;AL;ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3;AL;ARABIC LETTER GUEH
+06B4;AL;ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06B5;AL;ARABIC LETTER LAM WITH SMALL V
+06B6;AL;ARABIC LETTER LAM WITH DOT ABOVE
+06B7;AL;ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8;AL;ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9;AL;ARABIC LETTER NOON WITH DOT BELOW
+06BA;AL;ARABIC LETTER NOON GHUNNA
+06BB;AL;ARABIC LETTER RNOON
+06BC;AL;ARABIC LETTER NOON WITH RING
+06BD;AL;ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06BE;AL;ARABIC LETTER HEH DOACHASHMEE
+06BF;AL;ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0;AL;ARABIC LETTER HEH WITH YEH ABOVE
+06C1;AL;ARABIC LETTER HEH GOAL
+06C2;AL;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06C3;AL;ARABIC LETTER TEH MARBUTA GOAL
+06C4;AL;ARABIC LETTER WAW WITH RING
+06C5;AL;ARABIC LETTER KIRGHIZ OE
+06C6;AL;ARABIC LETTER OE
+06C7;AL;ARABIC LETTER U
+06C8;AL;ARABIC LETTER YU
+06C9;AL;ARABIC LETTER KIRGHIZ YU
+06CA;AL;ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB;AL;ARABIC LETTER VE
+06CC;AL;ARABIC LETTER FARSI YEH
+06CD;AL;ARABIC LETTER YEH WITH TAIL
+06CE;AL;ARABIC LETTER YEH WITH SMALL V
+06CF;AL;ARABIC LETTER WAW WITH DOT ABOVE
+06D0;AL;ARABIC LETTER E
+06D1;AL;ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2;AL;ARABIC LETTER YEH BARREE
+06D3;AL;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4;AL;ARABIC FULL STOP
+06D5;AL;ARABIC LETTER AE
+06D6;CM;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7;CM;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8;CM;ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9;CM;ARABIC SMALL HIGH LAM ALEF
+06DA;CM;ARABIC SMALL HIGH JEEM
+06DB;CM;ARABIC SMALL HIGH THREE DOTS
+06DC;CM;ARABIC SMALL HIGH SEEN
+06DD;CM;ARABIC END OF AYAH
+06DE;CM;ARABIC START OF RUB EL HIZB
+06DF;CM;ARABIC SMALL HIGH ROUNDED ZERO
+06E0;CM;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1;CM;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2;CM;ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3;CM;ARABIC SMALL LOW SEEN
+06E4;CM;ARABIC SMALL HIGH MADDA
+06E5;AL;ARABIC SMALL WAW
+06E6;AL;ARABIC SMALL YEH
+06E7;CM;ARABIC SMALL HIGH YEH
+06E8;CM;ARABIC SMALL HIGH NOON
+06E9;AL;ARABIC PLACE OF SAJDAH
+06EA;CM;ARABIC EMPTY CENTRE LOW STOP
+06EB;CM;ARABIC EMPTY CENTRE HIGH STOP
+06EC;CM;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED;CM;ARABIC SMALL LOW MEEM
+06F0;NU;EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1;NU;EXTENDED ARABIC-INDIC DIGIT ONE
+06F2;NU;EXTENDED ARABIC-INDIC DIGIT TWO
+06F3;NU;EXTENDED ARABIC-INDIC DIGIT THREE
+06F4;NU;EXTENDED ARABIC-INDIC DIGIT FOUR
+06F5;NU;EXTENDED ARABIC-INDIC DIGIT FIVE
+06F6;NU;EXTENDED ARABIC-INDIC DIGIT SIX
+06F7;NU;EXTENDED ARABIC-INDIC DIGIT SEVEN
+06F8;NU;EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9;NU;EXTENDED ARABIC-INDIC DIGIT NINE
+06FA;AL;ARABIC LETTER SHEEN WITH DOT BELOW
+06FB;AL;ARABIC LETTER DAD WITH DOT BELOW
+06FC;AL;ARABIC LETTER GHAIN WITH DOT BELOW
+06FD;AL;ARABIC SIGN SINDHI AMPERSAND
+06FE;AL;ARABIC SIGN SINDHI POSTPOSITION MEN
+0700;AL;SYRIAC END OF PARAGRAPH
+0701;AL;SYRIAC SUPRALINEAR FULL STOP
+0702;AL;SYRIAC SUBLINEAR FULL STOP
+0703;AL;SYRIAC SUPRALINEAR COLON
+0704;AL;SYRIAC SUBLINEAR COLON
+0705;AL;SYRIAC HORIZONTAL COLON
+0706;AL;SYRIAC COLON SKEWED LEFT
+0707;AL;SYRIAC COLON SKEWED RIGHT
+0708;AL;SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709;AL;SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A;AL;SYRIAC CONTRACTION
+070B;AL;SYRIAC HARKLEAN OBELUS
+070C;AL;SYRIAC HARKLEAN METOBELUS
+070D;AL;SYRIAC HARKLEAN ASTERISCUS
+070F;CM;SYRIAC ABBREVIATION MARK
+0710;AL;SYRIAC LETTER ALAPH
+0711;CM;SYRIAC LETTER SUPERSCRIPT ALAPH
+0712;AL;SYRIAC LETTER BETH
+0713;AL;SYRIAC LETTER GAMAL
+0714;AL;SYRIAC LETTER GAMAL GARSHUNI
+0715;AL;SYRIAC LETTER DALATH
+0716;AL;SYRIAC LETTER DOTLESS DALATH RISH
+0717;AL;SYRIAC LETTER HE
+0718;AL;SYRIAC LETTER WAW
+0719;AL;SYRIAC LETTER ZAIN
+071A;AL;SYRIAC LETTER HETH
+071B;AL;SYRIAC LETTER TETH
+071C;AL;SYRIAC LETTER TETH GARSHUNI
+071D;AL;SYRIAC LETTER YUDH
+071E;AL;SYRIAC LETTER YUDH HE
+071F;AL;SYRIAC LETTER KAPH
+0720;AL;SYRIAC LETTER LAMADH
+0721;AL;SYRIAC LETTER MIM
+0722;AL;SYRIAC LETTER NUN
+0723;AL;SYRIAC LETTER SEMKATH
+0724;AL;SYRIAC LETTER FINAL SEMKATH
+0725;AL;SYRIAC LETTER E
+0726;AL;SYRIAC LETTER PE
+0727;AL;SYRIAC LETTER REVERSED PE
+0728;AL;SYRIAC LETTER SADHE
+0729;AL;SYRIAC LETTER QAPH
+072A;AL;SYRIAC LETTER RISH
+072B;AL;SYRIAC LETTER SHIN
+072C;AL;SYRIAC LETTER TAW
+0730;CM;SYRIAC PTHAHA ABOVE
+0731;CM;SYRIAC PTHAHA BELOW
+0732;CM;SYRIAC PTHAHA DOTTED
+0733;CM;SYRIAC ZQAPHA ABOVE
+0734;CM;SYRIAC ZQAPHA BELOW
+0735;CM;SYRIAC ZQAPHA DOTTED
+0736;CM;SYRIAC RBASA ABOVE
+0737;CM;SYRIAC RBASA BELOW
+0738;CM;SYRIAC DOTTED ZLAMA HORIZONTAL
+0739;CM;SYRIAC DOTTED ZLAMA ANGULAR
+073A;CM;SYRIAC HBASA ABOVE
+073B;CM;SYRIAC HBASA BELOW
+073C;CM;SYRIAC HBASA-ESASA DOTTED
+073D;CM;SYRIAC ESASA ABOVE
+073E;CM;SYRIAC ESASA BELOW
+073F;CM;SYRIAC RWAHA
+0740;CM;SYRIAC FEMININE DOT
+0741;CM;SYRIAC QUSHSHAYA
+0742;CM;SYRIAC RUKKAKHA
+0743;CM;SYRIAC TWO VERTICAL DOTS ABOVE
+0744;CM;SYRIAC TWO VERTICAL DOTS BELOW
+0745;CM;SYRIAC THREE DOTS ABOVE
+0746;CM;SYRIAC THREE DOTS BELOW
+0747;CM;SYRIAC OBLIQUE LINE ABOVE
+0748;CM;SYRIAC OBLIQUE LINE BELOW
+0749;CM;SYRIAC MUSIC
+074A;CM;SYRIAC BARREKH
+0780;AL;THAANA LETTER HAA
+0781;AL;THAANA LETTER SHAVIYANI
+0782;AL;THAANA LETTER NOONU
+0783;AL;THAANA LETTER RAA
+0784;AL;THAANA LETTER BAA
+0785;AL;THAANA LETTER LHAVIYANI
+0786;AL;THAANA LETTER KAAFU
+0787;AL;THAANA LETTER ALIFU
+0788;AL;THAANA LETTER VAAVU
+0789;AL;THAANA LETTER MEEMU
+078A;AL;THAANA LETTER FAAFU
+078B;AL;THAANA LETTER DHAALU
+078C;AL;THAANA LETTER THAA
+078D;AL;THAANA LETTER LAAMU
+078E;AL;THAANA LETTER GAAFU
+078F;AL;THAANA LETTER GNAVIYANI
+0790;AL;THAANA LETTER SEENU
+0791;AL;THAANA LETTER DAVIYANI
+0792;AL;THAANA LETTER ZAVIYANI
+0793;AL;THAANA LETTER TAVIYANI
+0794;AL;THAANA LETTER YAA
+0795;AL;THAANA LETTER PAVIYANI
+0796;AL;THAANA LETTER JAVIYANI
+0797;AL;THAANA LETTER CHAVIYANI
+0798;AL;THAANA LETTER TTAA
+0799;AL;THAANA LETTER HHAA
+079A;AL;THAANA LETTER KHAA
+079B;AL;THAANA LETTER THAALU
+079C;AL;THAANA LETTER ZAA
+079D;AL;THAANA LETTER SHEENU
+079E;AL;THAANA LETTER SAADHU
+079F;AL;THAANA LETTER DAADHU
+07A0;AL;THAANA LETTER TO
+07A1;AL;THAANA LETTER ZO
+07A2;AL;THAANA LETTER AINU
+07A3;AL;THAANA LETTER GHAINU
+07A4;AL;THAANA LETTER QAAFU
+07A5;AL;THAANA LETTER WAAVU
+07A6;CM;THAANA ABAFILI
+07A7;CM;THAANA AABAAFILI
+07A8;CM;THAANA IBIFILI
+07A9;CM;THAANA EEBEEFILI
+07AA;CM;THAANA UBUFILI
+07AB;CM;THAANA OOBOOFILI
+07AC;CM;THAANA EBEFILI
+07AD;CM;THAANA EYBEYFILI
+07AE;CM;THAANA OBOFILI
+07AF;CM;THAANA OABOAFILI
+07B0;CM;THAANA SUKUN
+0901;CM;DEVANAGARI SIGN CANDRABINDU
+0902;CM;DEVANAGARI SIGN ANUSVARA
+0903;CM;DEVANAGARI SIGN VISARGA
+0905;AL;DEVANAGARI LETTER A
+0906;AL;DEVANAGARI LETTER AA
+0907;AL;DEVANAGARI LETTER I
+0908;AL;DEVANAGARI LETTER II
+0909;AL;DEVANAGARI LETTER U
+090A;AL;DEVANAGARI LETTER UU
+090B;AL;DEVANAGARI LETTER VOCALIC R
+090C;AL;DEVANAGARI LETTER VOCALIC L
+090D;AL;DEVANAGARI LETTER CANDRA E
+090E;AL;DEVANAGARI LETTER SHORT E
+090F;AL;DEVANAGARI LETTER E
+0910;AL;DEVANAGARI LETTER AI
+0911;AL;DEVANAGARI LETTER CANDRA O
+0912;AL;DEVANAGARI LETTER SHORT O
+0913;AL;DEVANAGARI LETTER O
+0914;AL;DEVANAGARI LETTER AU
+0915;AL;DEVANAGARI LETTER KA
+0916;AL;DEVANAGARI LETTER KHA
+0917;AL;DEVANAGARI LETTER GA
+0918;AL;DEVANAGARI LETTER GHA
+0919;AL;DEVANAGARI LETTER NGA
+091A;AL;DEVANAGARI LETTER CA
+091B;AL;DEVANAGARI LETTER CHA
+091C;AL;DEVANAGARI LETTER JA
+091D;AL;DEVANAGARI LETTER JHA
+091E;AL;DEVANAGARI LETTER NYA
+091F;AL;DEVANAGARI LETTER TTA
+0920;AL;DEVANAGARI LETTER TTHA
+0921;AL;DEVANAGARI LETTER DDA
+0922;AL;DEVANAGARI LETTER DDHA
+0923;AL;DEVANAGARI LETTER NNA
+0924;AL;DEVANAGARI LETTER TA
+0925;AL;DEVANAGARI LETTER THA
+0926;AL;DEVANAGARI LETTER DA
+0927;AL;DEVANAGARI LETTER DHA
+0928;AL;DEVANAGARI LETTER NA
+0929;AL;DEVANAGARI LETTER NNNA
+092A;AL;DEVANAGARI LETTER PA
+092B;AL;DEVANAGARI LETTER PHA
+092C;AL;DEVANAGARI LETTER BA
+092D;AL;DEVANAGARI LETTER BHA
+092E;AL;DEVANAGARI LETTER MA
+092F;AL;DEVANAGARI LETTER YA
+0930;AL;DEVANAGARI LETTER RA
+0931;AL;DEVANAGARI LETTER RRA
+0932;AL;DEVANAGARI LETTER LA
+0933;AL;DEVANAGARI LETTER LLA
+0934;AL;DEVANAGARI LETTER LLLA
+0935;AL;DEVANAGARI LETTER VA
+0936;AL;DEVANAGARI LETTER SHA
+0937;AL;DEVANAGARI LETTER SSA
+0938;AL;DEVANAGARI LETTER SA
+0939;AL;DEVANAGARI LETTER HA
+093C;CM;DEVANAGARI SIGN NUKTA
+093D;AL;DEVANAGARI SIGN AVAGRAHA
+093E;CM;DEVANAGARI VOWEL SIGN AA
+093F;CM;DEVANAGARI VOWEL SIGN I
+0940;CM;DEVANAGARI VOWEL SIGN II
+0941;CM;DEVANAGARI VOWEL SIGN U
+0942;CM;DEVANAGARI VOWEL SIGN UU
+0943;CM;DEVANAGARI VOWEL SIGN VOCALIC R
+0944;CM;DEVANAGARI VOWEL SIGN VOCALIC RR
+0945;CM;DEVANAGARI VOWEL SIGN CANDRA E
+0946;CM;DEVANAGARI VOWEL SIGN SHORT E
+0947;CM;DEVANAGARI VOWEL SIGN E
+0948;CM;DEVANAGARI VOWEL SIGN AI
+0949;CM;DEVANAGARI VOWEL SIGN CANDRA O
+094A;CM;DEVANAGARI VOWEL SIGN SHORT O
+094B;CM;DEVANAGARI VOWEL SIGN O
+094C;CM;DEVANAGARI VOWEL SIGN AU
+094D;CM;DEVANAGARI SIGN VIRAMA
+0950;AL;DEVANAGARI OM
+0951;CM;DEVANAGARI STRESS SIGN UDATTA
+0952;CM;DEVANAGARI STRESS SIGN ANUDATTA
+0953;CM;DEVANAGARI GRAVE ACCENT
+0954;CM;DEVANAGARI ACUTE ACCENT
+0958;AL;DEVANAGARI LETTER QA
+0959;AL;DEVANAGARI LETTER KHHA
+095A;AL;DEVANAGARI LETTER GHHA
+095B;AL;DEVANAGARI LETTER ZA
+095C;AL;DEVANAGARI LETTER DDDHA
+095D;AL;DEVANAGARI LETTER RHA
+095E;AL;DEVANAGARI LETTER FA
+095F;AL;DEVANAGARI LETTER YYA
+0960;AL;DEVANAGARI LETTER VOCALIC RR
+0961;AL;DEVANAGARI LETTER VOCALIC LL
+0962;CM;DEVANAGARI VOWEL SIGN VOCALIC L
+0963;CM;DEVANAGARI VOWEL SIGN VOCALIC LL
+0964;AL;DEVANAGARI DANDA
+0965;AL;DEVANAGARI DOUBLE DANDA
+0966;NU;DEVANAGARI DIGIT ZERO
+0967;NU;DEVANAGARI DIGIT ONE
+0968;NU;DEVANAGARI DIGIT TWO
+0969;NU;DEVANAGARI DIGIT THREE
+096A;NU;DEVANAGARI DIGIT FOUR
+096B;NU;DEVANAGARI DIGIT FIVE
+096C;NU;DEVANAGARI DIGIT SIX
+096D;NU;DEVANAGARI DIGIT SEVEN
+096E;NU;DEVANAGARI DIGIT EIGHT
+096F;NU;DEVANAGARI DIGIT NINE
+0970;AL;DEVANAGARI ABBREVIATION SIGN
+0981;CM;BENGALI SIGN CANDRABINDU
+0982;CM;BENGALI SIGN ANUSVARA
+0983;CM;BENGALI SIGN VISARGA
+0985;AL;BENGALI LETTER A
+0986;AL;BENGALI LETTER AA
+0987;AL;BENGALI LETTER I
+0988;AL;BENGALI LETTER II
+0989;AL;BENGALI LETTER U
+098A;AL;BENGALI LETTER UU
+098B;AL;BENGALI LETTER VOCALIC R
+098C;AL;BENGALI LETTER VOCALIC L
+098F;AL;BENGALI LETTER E
+0990;AL;BENGALI LETTER AI
+0993;AL;BENGALI LETTER O
+0994;AL;BENGALI LETTER AU
+0995;AL;BENGALI LETTER KA
+0996;AL;BENGALI LETTER KHA
+0997;AL;BENGALI LETTER GA
+0998;AL;BENGALI LETTER GHA
+0999;AL;BENGALI LETTER NGA
+099A;AL;BENGALI LETTER CA
+099B;AL;BENGALI LETTER CHA
+099C;AL;BENGALI LETTER JA
+099D;AL;BENGALI LETTER JHA
+099E;AL;BENGALI LETTER NYA
+099F;AL;BENGALI LETTER TTA
+09A0;AL;BENGALI LETTER TTHA
+09A1;AL;BENGALI LETTER DDA
+09A2;AL;BENGALI LETTER DDHA
+09A3;AL;BENGALI LETTER NNA
+09A4;AL;BENGALI LETTER TA
+09A5;AL;BENGALI LETTER THA
+09A6;AL;BENGALI LETTER DA
+09A7;AL;BENGALI LETTER DHA
+09A8;AL;BENGALI LETTER NA
+09AA;AL;BENGALI LETTER PA
+09AB;AL;BENGALI LETTER PHA
+09AC;AL;BENGALI LETTER BA
+09AD;AL;BENGALI LETTER BHA
+09AE;AL;BENGALI LETTER MA
+09AF;AL;BENGALI LETTER YA
+09B0;AL;BENGALI LETTER RA
+09B2;AL;BENGALI LETTER LA
+09B6;AL;BENGALI LETTER SHA
+09B7;AL;BENGALI LETTER SSA
+09B8;AL;BENGALI LETTER SA
+09B9;AL;BENGALI LETTER HA
+09BC;CM;BENGALI SIGN NUKTA
+09BE;CM;BENGALI VOWEL SIGN AA
+09BF;CM;BENGALI VOWEL SIGN I
+09C0;CM;BENGALI VOWEL SIGN II
+09C1;CM;BENGALI VOWEL SIGN U
+09C2;CM;BENGALI VOWEL SIGN UU
+09C3;CM;BENGALI VOWEL SIGN VOCALIC R
+09C4;CM;BENGALI VOWEL SIGN VOCALIC RR
+09C7;CM;BENGALI VOWEL SIGN E
+09C8;CM;BENGALI VOWEL SIGN AI
+09CB;CM;BENGALI VOWEL SIGN O
+09CC;CM;BENGALI VOWEL SIGN AU
+09CD;CM;BENGALI SIGN VIRAMA
+09D7;CM;BENGALI AU LENGTH MARK
+09DC;AL;BENGALI LETTER RRA
+09DD;AL;BENGALI LETTER RHA
+09DF;AL;BENGALI LETTER YYA
+09E0;AL;BENGALI LETTER VOCALIC RR
+09E1;AL;BENGALI LETTER VOCALIC LL
+09E2;CM;BENGALI VOWEL SIGN VOCALIC L
+09E3;CM;BENGALI VOWEL SIGN VOCALIC LL
+09E6;NU;BENGALI DIGIT ZERO
+09E7;NU;BENGALI DIGIT ONE
+09E8;NU;BENGALI DIGIT TWO
+09E9;NU;BENGALI DIGIT THREE
+09EA;NU;BENGALI DIGIT FOUR
+09EB;NU;BENGALI DIGIT FIVE
+09EC;NU;BENGALI DIGIT SIX
+09ED;NU;BENGALI DIGIT SEVEN
+09EE;NU;BENGALI DIGIT EIGHT
+09EF;NU;BENGALI DIGIT NINE
+09F0;AL;BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09F1;AL;BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2;PR;BENGALI RUPEE MARK
+09F3;PR;BENGALI RUPEE SIGN
+09F4;AL;BENGALI CURRENCY NUMERATOR ONE
+09F5;AL;BENGALI CURRENCY NUMERATOR TWO
+09F6;AL;BENGALI CURRENCY NUMERATOR THREE
+09F7;AL;BENGALI CURRENCY NUMERATOR FOUR
+09F8;AL;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9;AL;BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA;AL;BENGALI ISSHAR
+0A02;CM;GURMUKHI SIGN BINDI
+0A05;AL;GURMUKHI LETTER A
+0A06;AL;GURMUKHI LETTER AA
+0A07;AL;GURMUKHI LETTER I
+0A08;AL;GURMUKHI LETTER II
+0A09;AL;GURMUKHI LETTER U
+0A0A;AL;GURMUKHI LETTER UU
+0A0F;AL;GURMUKHI LETTER EE
+0A10;AL;GURMUKHI LETTER AI
+0A13;AL;GURMUKHI LETTER OO
+0A14;AL;GURMUKHI LETTER AU
+0A15;AL;GURMUKHI LETTER KA
+0A16;AL;GURMUKHI LETTER KHA
+0A17;AL;GURMUKHI LETTER GA
+0A18;AL;GURMUKHI LETTER GHA
+0A19;AL;GURMUKHI LETTER NGA
+0A1A;AL;GURMUKHI LETTER CA
+0A1B;AL;GURMUKHI LETTER CHA
+0A1C;AL;GURMUKHI LETTER JA
+0A1D;AL;GURMUKHI LETTER JHA
+0A1E;AL;GURMUKHI LETTER NYA
+0A1F;AL;GURMUKHI LETTER TTA
+0A20;AL;GURMUKHI LETTER TTHA
+0A21;AL;GURMUKHI LETTER DDA
+0A22;AL;GURMUKHI LETTER DDHA
+0A23;AL;GURMUKHI LETTER NNA
+0A24;AL;GURMUKHI LETTER TA
+0A25;AL;GURMUKHI LETTER THA
+0A26;AL;GURMUKHI LETTER DA
+0A27;AL;GURMUKHI LETTER DHA
+0A28;AL;GURMUKHI LETTER NA
+0A2A;AL;GURMUKHI LETTER PA
+0A2B;AL;GURMUKHI LETTER PHA
+0A2C;AL;GURMUKHI LETTER BA
+0A2D;AL;GURMUKHI LETTER BHA
+0A2E;AL;GURMUKHI LETTER MA
+0A2F;AL;GURMUKHI LETTER YA
+0A30;AL;GURMUKHI LETTER RA
+0A32;AL;GURMUKHI LETTER LA
+0A33;AL;GURMUKHI LETTER LLA
+0A35;AL;GURMUKHI LETTER VA
+0A36;AL;GURMUKHI LETTER SHA
+0A38;AL;GURMUKHI LETTER SA
+0A39;AL;GURMUKHI LETTER HA
+0A3C;CM;GURMUKHI SIGN NUKTA
+0A3E;CM;GURMUKHI VOWEL SIGN AA
+0A3F;CM;GURMUKHI VOWEL SIGN I
+0A40;CM;GURMUKHI VOWEL SIGN II
+0A41;CM;GURMUKHI VOWEL SIGN U
+0A42;CM;GURMUKHI VOWEL SIGN UU
+0A47;CM;GURMUKHI VOWEL SIGN EE
+0A48;CM;GURMUKHI VOWEL SIGN AI
+0A4B;CM;GURMUKHI VOWEL SIGN OO
+0A4C;CM;GURMUKHI VOWEL SIGN AU
+0A4D;CM;GURMUKHI SIGN VIRAMA
+0A59;AL;GURMUKHI LETTER KHHA
+0A5A;AL;GURMUKHI LETTER GHHA
+0A5B;AL;GURMUKHI LETTER ZA
+0A5C;AL;GURMUKHI LETTER RRA
+0A5E;AL;GURMUKHI LETTER FA
+0A66;NU;GURMUKHI DIGIT ZERO
+0A67;NU;GURMUKHI DIGIT ONE
+0A68;NU;GURMUKHI DIGIT TWO
+0A69;NU;GURMUKHI DIGIT THREE
+0A6A;NU;GURMUKHI DIGIT FOUR
+0A6B;NU;GURMUKHI DIGIT FIVE
+0A6C;NU;GURMUKHI DIGIT SIX
+0A6D;NU;GURMUKHI DIGIT SEVEN
+0A6E;NU;GURMUKHI DIGIT EIGHT
+0A6F;NU;GURMUKHI DIGIT NINE
+0A70;CM;GURMUKHI TIPPI
+0A71;CM;GURMUKHI ADDAK
+0A72;AL;GURMUKHI IRI
+0A73;AL;GURMUKHI URA
+0A74;AL;GURMUKHI EK ONKAR
+0A81;CM;GUJARATI SIGN CANDRABINDU
+0A82;CM;GUJARATI SIGN ANUSVARA
+0A83;CM;GUJARATI SIGN VISARGA
+0A85;AL;GUJARATI LETTER A
+0A86;AL;GUJARATI LETTER AA
+0A87;AL;GUJARATI LETTER I
+0A88;AL;GUJARATI LETTER II
+0A89;AL;GUJARATI LETTER U
+0A8A;AL;GUJARATI LETTER UU
+0A8B;AL;GUJARATI LETTER VOCALIC R
+0A8D;AL;GUJARATI VOWEL CANDRA E
+0A8F;AL;GUJARATI LETTER E
+0A90;AL;GUJARATI LETTER AI
+0A91;AL;GUJARATI VOWEL CANDRA O
+0A93;AL;GUJARATI LETTER O
+0A94;AL;GUJARATI LETTER AU
+0A95;AL;GUJARATI LETTER KA
+0A96;AL;GUJARATI LETTER KHA
+0A97;AL;GUJARATI LETTER GA
+0A98;AL;GUJARATI LETTER GHA
+0A99;AL;GUJARATI LETTER NGA
+0A9A;AL;GUJARATI LETTER CA
+0A9B;AL;GUJARATI LETTER CHA
+0A9C;AL;GUJARATI LETTER JA
+0A9D;AL;GUJARATI LETTER JHA
+0A9E;AL;GUJARATI LETTER NYA
+0A9F;AL;GUJARATI LETTER TTA
+0AA0;AL;GUJARATI LETTER TTHA
+0AA1;AL;GUJARATI LETTER DDA
+0AA2;AL;GUJARATI LETTER DDHA
+0AA3;AL;GUJARATI LETTER NNA
+0AA4;AL;GUJARATI LETTER TA
+0AA5;AL;GUJARATI LETTER THA
+0AA6;AL;GUJARATI LETTER DA
+0AA7;AL;GUJARATI LETTER DHA
+0AA8;AL;GUJARATI LETTER NA
+0AAA;AL;GUJARATI LETTER PA
+0AAB;AL;GUJARATI LETTER PHA
+0AAC;AL;GUJARATI LETTER BA
+0AAD;AL;GUJARATI LETTER BHA
+0AAE;AL;GUJARATI LETTER MA
+0AAF;AL;GUJARATI LETTER YA
+0AB0;AL;GUJARATI LETTER RA
+0AB2;AL;GUJARATI LETTER LA
+0AB3;AL;GUJARATI LETTER LLA
+0AB5;AL;GUJARATI LETTER VA
+0AB6;AL;GUJARATI LETTER SHA
+0AB7;AL;GUJARATI LETTER SSA
+0AB8;AL;GUJARATI LETTER SA
+0AB9;AL;GUJARATI LETTER HA
+0ABC;CM;GUJARATI SIGN NUKTA
+0ABD;AL;GUJARATI SIGN AVAGRAHA
+0ABE;CM;GUJARATI VOWEL SIGN AA
+0ABF;CM;GUJARATI VOWEL SIGN I
+0AC0;CM;GUJARATI VOWEL SIGN II
+0AC1;CM;GUJARATI VOWEL SIGN U
+0AC2;CM;GUJARATI VOWEL SIGN UU
+0AC3;CM;GUJARATI VOWEL SIGN VOCALIC R
+0AC4;CM;GUJARATI VOWEL SIGN VOCALIC RR
+0AC5;CM;GUJARATI VOWEL SIGN CANDRA E
+0AC7;CM;GUJARATI VOWEL SIGN E
+0AC8;CM;GUJARATI VOWEL SIGN AI
+0AC9;CM;GUJARATI VOWEL SIGN CANDRA O
+0ACB;CM;GUJARATI VOWEL SIGN O
+0ACC;CM;GUJARATI VOWEL SIGN AU
+0ACD;CM;GUJARATI SIGN VIRAMA
+0AD0;AL;GUJARATI OM
+0AE0;AL;GUJARATI LETTER VOCALIC RR
+0AE6;NU;GUJARATI DIGIT ZERO
+0AE7;NU;GUJARATI DIGIT ONE
+0AE8;NU;GUJARATI DIGIT TWO
+0AE9;NU;GUJARATI DIGIT THREE
+0AEA;NU;GUJARATI DIGIT FOUR
+0AEB;NU;GUJARATI DIGIT FIVE
+0AEC;NU;GUJARATI DIGIT SIX
+0AED;NU;GUJARATI DIGIT SEVEN
+0AEE;NU;GUJARATI DIGIT EIGHT
+0AEF;NU;GUJARATI DIGIT NINE
+0B01;CM;ORIYA SIGN CANDRABINDU
+0B02;CM;ORIYA SIGN ANUSVARA
+0B03;CM;ORIYA SIGN VISARGA
+0B05;AL;ORIYA LETTER A
+0B06;AL;ORIYA LETTER AA
+0B07;AL;ORIYA LETTER I
+0B08;AL;ORIYA LETTER II
+0B09;AL;ORIYA LETTER U
+0B0A;AL;ORIYA LETTER UU
+0B0B;AL;ORIYA LETTER VOCALIC R
+0B0C;AL;ORIYA LETTER VOCALIC L
+0B0F;AL;ORIYA LETTER E
+0B10;AL;ORIYA LETTER AI
+0B13;AL;ORIYA LETTER O
+0B14;AL;ORIYA LETTER AU
+0B15;AL;ORIYA LETTER KA
+0B16;AL;ORIYA LETTER KHA
+0B17;AL;ORIYA LETTER GA
+0B18;AL;ORIYA LETTER GHA
+0B19;AL;ORIYA LETTER NGA
+0B1A;AL;ORIYA LETTER CA
+0B1B;AL;ORIYA LETTER CHA
+0B1C;AL;ORIYA LETTER JA
+0B1D;AL;ORIYA LETTER JHA
+0B1E;AL;ORIYA LETTER NYA
+0B1F;AL;ORIYA LETTER TTA
+0B20;AL;ORIYA LETTER TTHA
+0B21;AL;ORIYA LETTER DDA
+0B22;AL;ORIYA LETTER DDHA
+0B23;AL;ORIYA LETTER NNA
+0B24;AL;ORIYA LETTER TA
+0B25;AL;ORIYA LETTER THA
+0B26;AL;ORIYA LETTER DA
+0B27;AL;ORIYA LETTER DHA
+0B28;AL;ORIYA LETTER NA
+0B2A;AL;ORIYA LETTER PA
+0B2B;AL;ORIYA LETTER PHA
+0B2C;AL;ORIYA LETTER BA
+0B2D;AL;ORIYA LETTER BHA
+0B2E;AL;ORIYA LETTER MA
+0B2F;AL;ORIYA LETTER YA
+0B30;AL;ORIYA LETTER RA
+0B32;AL;ORIYA LETTER LA
+0B33;AL;ORIYA LETTER LLA
+0B36;AL;ORIYA LETTER SHA
+0B37;AL;ORIYA LETTER SSA
+0B38;AL;ORIYA LETTER SA
+0B39;AL;ORIYA LETTER HA
+0B3C;CM;ORIYA SIGN NUKTA
+0B3D;AL;ORIYA SIGN AVAGRAHA
+0B3E;CM;ORIYA VOWEL SIGN AA
+0B3F;CM;ORIYA VOWEL SIGN I
+0B40;CM;ORIYA VOWEL SIGN II
+0B41;CM;ORIYA VOWEL SIGN U
+0B42;CM;ORIYA VOWEL SIGN UU
+0B43;CM;ORIYA VOWEL SIGN VOCALIC R
+0B47;CM;ORIYA VOWEL SIGN E
+0B48;CM;ORIYA VOWEL SIGN AI
+0B4B;CM;ORIYA VOWEL SIGN O
+0B4C;CM;ORIYA VOWEL SIGN AU
+0B4D;CM;ORIYA SIGN VIRAMA
+0B56;CM;ORIYA AI LENGTH MARK
+0B57;CM;ORIYA AU LENGTH MARK
+0B5C;AL;ORIYA LETTER RRA
+0B5D;AL;ORIYA LETTER RHA
+0B5F;AL;ORIYA LETTER YYA
+0B60;AL;ORIYA LETTER VOCALIC RR
+0B61;AL;ORIYA LETTER VOCALIC LL
+0B66;NU;ORIYA DIGIT ZERO
+0B67;NU;ORIYA DIGIT ONE
+0B68;NU;ORIYA DIGIT TWO
+0B69;NU;ORIYA DIGIT THREE
+0B6A;NU;ORIYA DIGIT FOUR
+0B6B;NU;ORIYA DIGIT FIVE
+0B6C;NU;ORIYA DIGIT SIX
+0B6D;NU;ORIYA DIGIT SEVEN
+0B6E;NU;ORIYA DIGIT EIGHT
+0B6F;NU;ORIYA DIGIT NINE
+0B70;AL;ORIYA ISSHAR
+0B82;CM;TAMIL SIGN ANUSVARA
+0B83;CM;TAMIL SIGN VISARGA
+0B85;AL;TAMIL LETTER A
+0B86;AL;TAMIL LETTER AA
+0B87;AL;TAMIL LETTER I
+0B88;AL;TAMIL LETTER II
+0B89;AL;TAMIL LETTER U
+0B8A;AL;TAMIL LETTER UU
+0B8E;AL;TAMIL LETTER E
+0B8F;AL;TAMIL LETTER EE
+0B90;AL;TAMIL LETTER AI
+0B92;AL;TAMIL LETTER O
+0B93;AL;TAMIL LETTER OO
+0B94;AL;TAMIL LETTER AU
+0B95;AL;TAMIL LETTER KA
+0B99;AL;TAMIL LETTER NGA
+0B9A;AL;TAMIL LETTER CA
+0B9C;AL;TAMIL LETTER JA
+0B9E;AL;TAMIL LETTER NYA
+0B9F;AL;TAMIL LETTER TTA
+0BA3;AL;TAMIL LETTER NNA
+0BA4;AL;TAMIL LETTER TA
+0BA8;AL;TAMIL LETTER NA
+0BA9;AL;TAMIL LETTER NNNA
+0BAA;AL;TAMIL LETTER PA
+0BAE;AL;TAMIL LETTER MA
+0BAF;AL;TAMIL LETTER YA
+0BB0;AL;TAMIL LETTER RA
+0BB1;AL;TAMIL LETTER RRA
+0BB2;AL;TAMIL LETTER LA
+0BB3;AL;TAMIL LETTER LLA
+0BB4;AL;TAMIL LETTER LLLA
+0BB5;AL;TAMIL LETTER VA
+0BB7;AL;TAMIL LETTER SSA
+0BB8;AL;TAMIL LETTER SA
+0BB9;AL;TAMIL LETTER HA
+0BBE;CM;TAMIL VOWEL SIGN AA
+0BBF;CM;TAMIL VOWEL SIGN I
+0BC0;CM;TAMIL VOWEL SIGN II
+0BC1;CM;TAMIL VOWEL SIGN U
+0BC2;CM;TAMIL VOWEL SIGN UU
+0BC6;CM;TAMIL VOWEL SIGN E
+0BC7;CM;TAMIL VOWEL SIGN EE
+0BC8;CM;TAMIL VOWEL SIGN AI
+0BCA;CM;TAMIL VOWEL SIGN O
+0BCB;CM;TAMIL VOWEL SIGN OO
+0BCC;CM;TAMIL VOWEL SIGN AU
+0BCD;CM;TAMIL SIGN VIRAMA
+0BD7;CM;TAMIL AU LENGTH MARK
+0BE7;NU;TAMIL DIGIT ONE
+0BE8;NU;TAMIL DIGIT TWO
+0BE9;NU;TAMIL DIGIT THREE
+0BEA;NU;TAMIL DIGIT FOUR
+0BEB;NU;TAMIL DIGIT FIVE
+0BEC;NU;TAMIL DIGIT SIX
+0BED;NU;TAMIL DIGIT SEVEN
+0BEE;NU;TAMIL DIGIT EIGHT
+0BEF;NU;TAMIL DIGIT NINE
+0BF0;AL;TAMIL NUMBER TEN
+0BF1;AL;TAMIL NUMBER ONE HUNDRED
+0BF2;AL;TAMIL NUMBER ONE THOUSAND
+0C01;CM;TELUGU SIGN CANDRABINDU
+0C02;CM;TELUGU SIGN ANUSVARA
+0C03;CM;TELUGU SIGN VISARGA
+0C05;AL;TELUGU LETTER A
+0C06;AL;TELUGU LETTER AA
+0C07;AL;TELUGU LETTER I
+0C08;AL;TELUGU LETTER II
+0C09;AL;TELUGU LETTER U
+0C0A;AL;TELUGU LETTER UU
+0C0B;AL;TELUGU LETTER VOCALIC R
+0C0C;AL;TELUGU LETTER VOCALIC L
+0C0E;AL;TELUGU LETTER E
+0C0F;AL;TELUGU LETTER EE
+0C10;AL;TELUGU LETTER AI
+0C12;AL;TELUGU LETTER O
+0C13;AL;TELUGU LETTER OO
+0C14;AL;TELUGU LETTER AU
+0C15;AL;TELUGU LETTER KA
+0C16;AL;TELUGU LETTER KHA
+0C17;AL;TELUGU LETTER GA
+0C18;AL;TELUGU LETTER GHA
+0C19;AL;TELUGU LETTER NGA
+0C1A;AL;TELUGU LETTER CA
+0C1B;AL;TELUGU LETTER CHA
+0C1C;AL;TELUGU LETTER JA
+0C1D;AL;TELUGU LETTER JHA
+0C1E;AL;TELUGU LETTER NYA
+0C1F;AL;TELUGU LETTER TTA
+0C20;AL;TELUGU LETTER TTHA
+0C21;AL;TELUGU LETTER DDA
+0C22;AL;TELUGU LETTER DDHA
+0C23;AL;TELUGU LETTER NNA
+0C24;AL;TELUGU LETTER TA
+0C25;AL;TELUGU LETTER THA
+0C26;AL;TELUGU LETTER DA
+0C27;AL;TELUGU LETTER DHA
+0C28;AL;TELUGU LETTER NA
+0C2A;AL;TELUGU LETTER PA
+0C2B;AL;TELUGU LETTER PHA
+0C2C;AL;TELUGU LETTER BA
+0C2D;AL;TELUGU LETTER BHA
+0C2E;AL;TELUGU LETTER MA
+0C2F;AL;TELUGU LETTER YA
+0C30;AL;TELUGU LETTER RA
+0C31;AL;TELUGU LETTER RRA
+0C32;AL;TELUGU LETTER LA
+0C33;AL;TELUGU LETTER LLA
+0C35;AL;TELUGU LETTER VA
+0C36;AL;TELUGU LETTER SHA
+0C37;AL;TELUGU LETTER SSA
+0C38;AL;TELUGU LETTER SA
+0C39;AL;TELUGU LETTER HA
+0C3E;CM;TELUGU VOWEL SIGN AA
+0C3F;CM;TELUGU VOWEL SIGN I
+0C40;CM;TELUGU VOWEL SIGN II
+0C41;CM;TELUGU VOWEL SIGN U
+0C42;CM;TELUGU VOWEL SIGN UU
+0C43;CM;TELUGU VOWEL SIGN VOCALIC R
+0C44;CM;TELUGU VOWEL SIGN VOCALIC RR
+0C46;CM;TELUGU VOWEL SIGN E
+0C47;CM;TELUGU VOWEL SIGN EE
+0C48;CM;TELUGU VOWEL SIGN AI
+0C4A;CM;TELUGU VOWEL SIGN O
+0C4B;CM;TELUGU VOWEL SIGN OO
+0C4C;CM;TELUGU VOWEL SIGN AU
+0C4D;CM;TELUGU SIGN VIRAMA
+0C55;CM;TELUGU LENGTH MARK
+0C56;CM;TELUGU AI LENGTH MARK
+0C60;AL;TELUGU LETTER VOCALIC RR
+0C61;AL;TELUGU LETTER VOCALIC LL
+0C66;NU;TELUGU DIGIT ZERO
+0C67;NU;TELUGU DIGIT ONE
+0C68;NU;TELUGU DIGIT TWO
+0C69;NU;TELUGU DIGIT THREE
+0C6A;NU;TELUGU DIGIT FOUR
+0C6B;NU;TELUGU DIGIT FIVE
+0C6C;NU;TELUGU DIGIT SIX
+0C6D;NU;TELUGU DIGIT SEVEN
+0C6E;NU;TELUGU DIGIT EIGHT
+0C6F;NU;TELUGU DIGIT NINE
+0C82;CM;KANNADA SIGN ANUSVARA
+0C83;CM;KANNADA SIGN VISARGA
+0C85;AL;KANNADA LETTER A
+0C86;AL;KANNADA LETTER AA
+0C87;AL;KANNADA LETTER I
+0C88;AL;KANNADA LETTER II
+0C89;AL;KANNADA LETTER U
+0C8A;AL;KANNADA LETTER UU
+0C8B;AL;KANNADA LETTER VOCALIC R
+0C8C;AL;KANNADA LETTER VOCALIC L
+0C8E;AL;KANNADA LETTER E
+0C8F;AL;KANNADA LETTER EE
+0C90;AL;KANNADA LETTER AI
+0C92;AL;KANNADA LETTER O
+0C93;AL;KANNADA LETTER OO
+0C94;AL;KANNADA LETTER AU
+0C95;AL;KANNADA LETTER KA
+0C96;AL;KANNADA LETTER KHA
+0C97;AL;KANNADA LETTER GA
+0C98;AL;KANNADA LETTER GHA
+0C99;AL;KANNADA LETTER NGA
+0C9A;AL;KANNADA LETTER CA
+0C9B;AL;KANNADA LETTER CHA
+0C9C;AL;KANNADA LETTER JA
+0C9D;AL;KANNADA LETTER JHA
+0C9E;AL;KANNADA LETTER NYA
+0C9F;AL;KANNADA LETTER TTA
+0CA0;AL;KANNADA LETTER TTHA
+0CA1;AL;KANNADA LETTER DDA
+0CA2;AL;KANNADA LETTER DDHA
+0CA3;AL;KANNADA LETTER NNA
+0CA4;AL;KANNADA LETTER TA
+0CA5;AL;KANNADA LETTER THA
+0CA6;AL;KANNADA LETTER DA
+0CA7;AL;KANNADA LETTER DHA
+0CA8;AL;KANNADA LETTER NA
+0CAA;AL;KANNADA LETTER PA
+0CAB;AL;KANNADA LETTER PHA
+0CAC;AL;KANNADA LETTER BA
+0CAD;AL;KANNADA LETTER BHA
+0CAE;AL;KANNADA LETTER MA
+0CAF;AL;KANNADA LETTER YA
+0CB0;AL;KANNADA LETTER RA
+0CB1;AL;KANNADA LETTER RRA
+0CB2;AL;KANNADA LETTER LA
+0CB3;AL;KANNADA LETTER LLA
+0CB5;AL;KANNADA LETTER VA
+0CB6;AL;KANNADA LETTER SHA
+0CB7;AL;KANNADA LETTER SSA
+0CB8;AL;KANNADA LETTER SA
+0CB9;AL;KANNADA LETTER HA
+0CBE;CM;KANNADA VOWEL SIGN AA
+0CBF;CM;KANNADA VOWEL SIGN I
+0CC0;CM;KANNADA VOWEL SIGN II
+0CC1;CM;KANNADA VOWEL SIGN U
+0CC2;CM;KANNADA VOWEL SIGN UU
+0CC3;CM;KANNADA VOWEL SIGN VOCALIC R
+0CC4;CM;KANNADA VOWEL SIGN VOCALIC RR
+0CC6;CM;KANNADA VOWEL SIGN E
+0CC7;CM;KANNADA VOWEL SIGN EE
+0CC8;CM;KANNADA VOWEL SIGN AI
+0CCA;CM;KANNADA VOWEL SIGN O
+0CCB;CM;KANNADA VOWEL SIGN OO
+0CCC;CM;KANNADA VOWEL SIGN AU
+0CCD;CM;KANNADA SIGN VIRAMA
+0CD5;CM;KANNADA LENGTH MARK
+0CD6;CM;KANNADA AI LENGTH MARK
+0CDE;AL;KANNADA LETTER FA
+0CE0;AL;KANNADA LETTER VOCALIC RR
+0CE1;AL;KANNADA LETTER VOCALIC LL
+0CE6;NU;KANNADA DIGIT ZERO
+0CE7;NU;KANNADA DIGIT ONE
+0CE8;NU;KANNADA DIGIT TWO
+0CE9;NU;KANNADA DIGIT THREE
+0CEA;NU;KANNADA DIGIT FOUR
+0CEB;NU;KANNADA DIGIT FIVE
+0CEC;NU;KANNADA DIGIT SIX
+0CED;NU;KANNADA DIGIT SEVEN
+0CEE;NU;KANNADA DIGIT EIGHT
+0CEF;NU;KANNADA DIGIT NINE
+0D02;CM;MALAYALAM SIGN ANUSVARA
+0D03;CM;MALAYALAM SIGN VISARGA
+0D05;AL;MALAYALAM LETTER A
+0D06;AL;MALAYALAM LETTER AA
+0D07;AL;MALAYALAM LETTER I
+0D08;AL;MALAYALAM LETTER II
+0D09;AL;MALAYALAM LETTER U
+0D0A;AL;MALAYALAM LETTER UU
+0D0B;AL;MALAYALAM LETTER VOCALIC R
+0D0C;AL;MALAYALAM LETTER VOCALIC L
+0D0E;AL;MALAYALAM LETTER E
+0D0F;AL;MALAYALAM LETTER EE
+0D10;AL;MALAYALAM LETTER AI
+0D12;AL;MALAYALAM LETTER O
+0D13;AL;MALAYALAM LETTER OO
+0D14;AL;MALAYALAM LETTER AU
+0D15;AL;MALAYALAM LETTER KA
+0D16;AL;MALAYALAM LETTER KHA
+0D17;AL;MALAYALAM LETTER GA
+0D18;AL;MALAYALAM LETTER GHA
+0D19;AL;MALAYALAM LETTER NGA
+0D1A;AL;MALAYALAM LETTER CA
+0D1B;AL;MALAYALAM LETTER CHA
+0D1C;AL;MALAYALAM LETTER JA
+0D1D;AL;MALAYALAM LETTER JHA
+0D1E;AL;MALAYALAM LETTER NYA
+0D1F;AL;MALAYALAM LETTER TTA
+0D20;AL;MALAYALAM LETTER TTHA
+0D21;AL;MALAYALAM LETTER DDA
+0D22;AL;MALAYALAM LETTER DDHA
+0D23;AL;MALAYALAM LETTER NNA
+0D24;AL;MALAYALAM LETTER TA
+0D25;AL;MALAYALAM LETTER THA
+0D26;AL;MALAYALAM LETTER DA
+0D27;AL;MALAYALAM LETTER DHA
+0D28;AL;MALAYALAM LETTER NA
+0D2A;AL;MALAYALAM LETTER PA
+0D2B;AL;MALAYALAM LETTER PHA
+0D2C;AL;MALAYALAM LETTER BA
+0D2D;AL;MALAYALAM LETTER BHA
+0D2E;AL;MALAYALAM LETTER MA
+0D2F;AL;MALAYALAM LETTER YA
+0D30;AL;MALAYALAM LETTER RA
+0D31;AL;MALAYALAM LETTER RRA
+0D32;AL;MALAYALAM LETTER LA
+0D33;AL;MALAYALAM LETTER LLA
+0D34;AL;MALAYALAM LETTER LLLA
+0D35;AL;MALAYALAM LETTER VA
+0D36;AL;MALAYALAM LETTER SHA
+0D37;AL;MALAYALAM LETTER SSA
+0D38;AL;MALAYALAM LETTER SA
+0D39;AL;MALAYALAM LETTER HA
+0D3E;CM;MALAYALAM VOWEL SIGN AA
+0D3F;CM;MALAYALAM VOWEL SIGN I
+0D40;CM;MALAYALAM VOWEL SIGN II
+0D41;CM;MALAYALAM VOWEL SIGN U
+0D42;CM;MALAYALAM VOWEL SIGN UU
+0D43;CM;MALAYALAM VOWEL SIGN VOCALIC R
+0D46;CM;MALAYALAM VOWEL SIGN E
+0D47;CM;MALAYALAM VOWEL SIGN EE
+0D48;CM;MALAYALAM VOWEL SIGN AI
+0D4A;CM;MALAYALAM VOWEL SIGN O
+0D4B;CM;MALAYALAM VOWEL SIGN OO
+0D4C;CM;MALAYALAM VOWEL SIGN AU
+0D4D;CM;MALAYALAM SIGN VIRAMA
+0D57;CM;MALAYALAM AU LENGTH MARK
+0D60;AL;MALAYALAM LETTER VOCALIC RR
+0D61;AL;MALAYALAM LETTER VOCALIC LL
+0D66;NU;MALAYALAM DIGIT ZERO
+0D67;NU;MALAYALAM DIGIT ONE
+0D68;NU;MALAYALAM DIGIT TWO
+0D69;NU;MALAYALAM DIGIT THREE
+0D6A;NU;MALAYALAM DIGIT FOUR
+0D6B;NU;MALAYALAM DIGIT FIVE
+0D6C;NU;MALAYALAM DIGIT SIX
+0D6D;NU;MALAYALAM DIGIT SEVEN
+0D6E;NU;MALAYALAM DIGIT EIGHT
+0D6F;NU;MALAYALAM DIGIT NINE
+0D82;CM;SINHALA SIGN ANUSVARAYA
+0D83;CM;SINHALA SIGN VISARGAYA
+0D85;AL;SINHALA LETTER AYANNA
+0D86;AL;SINHALA LETTER AAYANNA
+0D87;AL;SINHALA LETTER AEYANNA
+0D88;AL;SINHALA LETTER AEEYANNA
+0D89;AL;SINHALA LETTER IYANNA
+0D8A;AL;SINHALA LETTER IIYANNA
+0D8B;AL;SINHALA LETTER UYANNA
+0D8C;AL;SINHALA LETTER UUYANNA
+0D8D;AL;SINHALA LETTER IRUYANNA
+0D8E;AL;SINHALA LETTER IRUUYANNA
+0D8F;AL;SINHALA LETTER ILUYANNA
+0D90;AL;SINHALA LETTER ILUUYANNA
+0D91;AL;SINHALA LETTER EYANNA
+0D92;AL;SINHALA LETTER EEYANNA
+0D93;AL;SINHALA LETTER AIYANNA
+0D94;AL;SINHALA LETTER OYANNA
+0D95;AL;SINHALA LETTER OOYANNA
+0D96;AL;SINHALA LETTER AUYANNA
+0D9A;AL;SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B;AL;SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C;AL;SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D;AL;SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E;AL;SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F;AL;SINHALA LETTER SANYAKA GAYANNA
+0DA0;AL;SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1;AL;SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2;AL;SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3;AL;SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4;AL;SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5;AL;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6;AL;SINHALA LETTER SANYAKA JAYANNA
+0DA7;AL;SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8;AL;SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9;AL;SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA;AL;SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB;AL;SINHALA LETTER MUURDHAJA NAYANNA
+0DAC;AL;SINHALA LETTER SANYAKA DDAYANNA
+0DAD;AL;SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE;AL;SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF;AL;SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0;AL;SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1;AL;SINHALA LETTER DANTAJA NAYANNA
+0DB3;AL;SINHALA LETTER SANYAKA DAYANNA
+0DB4;AL;SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5;AL;SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6;AL;SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7;AL;SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8;AL;SINHALA LETTER MAYANNA
+0DB9;AL;SINHALA LETTER AMBA BAYANNA
+0DBA;AL;SINHALA LETTER YAYANNA
+0DBB;AL;SINHALA LETTER RAYANNA
+0DBD;AL;SINHALA LETTER DANTAJA LAYANNA
+0DC0;AL;SINHALA LETTER VAYANNA
+0DC1;AL;SINHALA LETTER TAALUJA SAYANNA
+0DC2;AL;SINHALA LETTER MUURDHAJA SAYANNA
+0DC3;AL;SINHALA LETTER DANTAJA SAYANNA
+0DC4;AL;SINHALA LETTER HAYANNA
+0DC5;AL;SINHALA LETTER MUURDHAJA LAYANNA
+0DC6;AL;SINHALA LETTER FAYANNA
+0DCA;CM;SINHALA SIGN AL-LAKUNA
+0DCF;CM;SINHALA VOWEL SIGN AELA-PILLA
+0DD0;CM;SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1;CM;SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2;CM;SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3;CM;SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4;CM;SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6;CM;SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8;CM;SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9;CM;SINHALA VOWEL SIGN KOMBUVA
+0DDA;CM;SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB;CM;SINHALA VOWEL SIGN KOMBU DEKA
+0DDC;CM;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD;CM;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE;CM;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF;CM;SINHALA VOWEL SIGN GAYANUKITTA
+0DF2;CM;SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3;CM;SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4;AL;SINHALA PUNCTUATION KUNDDALIYA
+0E01;SA;THAI CHARACTER KO KAI
+0E02;SA;THAI CHARACTER KHO KHAI
+0E03;SA;THAI CHARACTER KHO KHUAT
+0E04;SA;THAI CHARACTER KHO KHWAI
+0E05;SA;THAI CHARACTER KHO KHON
+0E06;SA;THAI CHARACTER KHO RAKHANG
+0E07;SA;THAI CHARACTER NGO NGU
+0E08;SA;THAI CHARACTER CHO CHAN
+0E09;SA;THAI CHARACTER CHO CHING
+0E0A;SA;THAI CHARACTER CHO CHANG
+0E0B;SA;THAI CHARACTER SO SO
+0E0C;SA;THAI CHARACTER CHO CHOE
+0E0D;SA;THAI CHARACTER YO YING
+0E0E;SA;THAI CHARACTER DO CHADA
+0E0F;SA;THAI CHARACTER TO PATAK
+0E10;SA;THAI CHARACTER THO THAN
+0E11;SA;THAI CHARACTER THO NANGMONTHO
+0E12;SA;THAI CHARACTER THO PHUTHAO
+0E13;SA;THAI CHARACTER NO NEN
+0E14;SA;THAI CHARACTER DO DEK
+0E15;SA;THAI CHARACTER TO TAO
+0E16;SA;THAI CHARACTER THO THUNG
+0E17;SA;THAI CHARACTER THO THAHAN
+0E18;SA;THAI CHARACTER THO THONG
+0E19;SA;THAI CHARACTER NO NU
+0E1A;SA;THAI CHARACTER BO BAIMAI
+0E1B;SA;THAI CHARACTER PO PLA
+0E1C;SA;THAI CHARACTER PHO PHUNG
+0E1D;SA;THAI CHARACTER FO FA
+0E1E;SA;THAI CHARACTER PHO PHAN
+0E1F;SA;THAI CHARACTER FO FAN
+0E20;SA;THAI CHARACTER PHO SAMPHAO
+0E21;SA;THAI CHARACTER MO MA
+0E22;SA;THAI CHARACTER YO YAK
+0E23;SA;THAI CHARACTER RO RUA
+0E24;SA;THAI CHARACTER RU
+0E25;SA;THAI CHARACTER LO LING
+0E26;SA;THAI CHARACTER LU
+0E27;SA;THAI CHARACTER WO WAEN
+0E28;SA;THAI CHARACTER SO SALA
+0E29;SA;THAI CHARACTER SO RUSI
+0E2A;SA;THAI CHARACTER SO SUA
+0E2B;SA;THAI CHARACTER HO HIP
+0E2C;SA;THAI CHARACTER LO CHULA
+0E2D;SA;THAI CHARACTER O ANG
+0E2E;SA;THAI CHARACTER HO NOKHUK
+0E2F;SA;THAI CHARACTER PAIYANNOI
+0E30;SA;THAI CHARACTER SARA A
+0E31;CM;THAI CHARACTER MAI HAN-AKAT
+0E32;SA;THAI CHARACTER SARA AA
+0E33;SA;THAI CHARACTER SARA AM
+0E34;CM;THAI CHARACTER SARA I
+0E35;CM;THAI CHARACTER SARA II
+0E36;CM;THAI CHARACTER SARA UE
+0E37;CM;THAI CHARACTER SARA UEE
+0E38;CM;THAI CHARACTER SARA U
+0E39;CM;THAI CHARACTER SARA UU
+0E3A;CM;THAI CHARACTER PHINTHU
+0E3F;PR;THAI CURRENCY SYMBOL BAHT
+0E40;SA;THAI CHARACTER SARA E
+0E41;SA;THAI CHARACTER SARA AE
+0E42;SA;THAI CHARACTER SARA O
+0E43;SA;THAI CHARACTER SARA AI MAIMUAN
+0E44;SA;THAI CHARACTER SARA AI MAIMALAI
+0E45;SA;THAI CHARACTER LAKKHANGYAO
+0E46;SA;THAI CHARACTER MAIYAMOK
+0E47;CM;THAI CHARACTER MAITAIKHU
+0E48;CM;THAI CHARACTER MAI EK
+0E49;CM;THAI CHARACTER MAI THO
+0E4A;CM;THAI CHARACTER MAI TRI
+0E4B;CM;THAI CHARACTER MAI CHATTAWA
+0E4C;CM;THAI CHARACTER THANTHAKHAT
+0E4D;CM;THAI CHARACTER NIKHAHIT
+0E4E;CM;THAI CHARACTER YAMAKKAN
+0E4F;AL;THAI CHARACTER FONGMAN
+0E50;NU;THAI DIGIT ZERO
+0E51;NU;THAI DIGIT ONE
+0E52;NU;THAI DIGIT TWO
+0E53;NU;THAI DIGIT THREE
+0E54;NU;THAI DIGIT FOUR
+0E55;NU;THAI DIGIT FIVE
+0E56;NU;THAI DIGIT SIX
+0E57;NU;THAI DIGIT SEVEN
+0E58;NU;THAI DIGIT EIGHT
+0E59;NU;THAI DIGIT NINE
+0E5A;NS;THAI CHARACTER ANGKHANKHU
+0E5B;NS;THAI CHARACTER KHOMUT
+0E81;SA;LAO LETTER KO
+0E82;SA;LAO LETTER KHO SUNG
+0E84;SA;LAO LETTER KHO TAM
+0E87;SA;LAO LETTER NGO
+0E88;SA;LAO LETTER CO
+0E8A;SA;LAO LETTER SO TAM
+0E8D;SA;LAO LETTER NYO
+0E94;SA;LAO LETTER DO
+0E95;SA;LAO LETTER TO
+0E96;SA;LAO LETTER THO SUNG
+0E97;SA;LAO LETTER THO TAM
+0E99;SA;LAO LETTER NO
+0E9A;SA;LAO LETTER BO
+0E9B;SA;LAO LETTER PO
+0E9C;SA;LAO LETTER PHO SUNG
+0E9D;SA;LAO LETTER FO TAM
+0E9E;SA;LAO LETTER PHO TAM
+0E9F;SA;LAO LETTER FO SUNG
+0EA1;SA;LAO LETTER MO
+0EA2;SA;LAO LETTER YO
+0EA3;SA;LAO LETTER LO LING
+0EA5;SA;LAO LETTER LO LOOT
+0EA7;SA;LAO LETTER WO
+0EAA;SA;LAO LETTER SO SUNG
+0EAB;SA;LAO LETTER HO SUNG
+0EAD;SA;LAO LETTER O
+0EAE;SA;LAO LETTER HO TAM
+0EAF;SA;LAO ELLIPSIS
+0EB0;SA;LAO VOWEL SIGN A
+0EB1;CM;LAO VOWEL SIGN MAI KAN
+0EB2;SA;LAO VOWEL SIGN AA
+0EB3;SA;LAO VOWEL SIGN AM
+0EB4;CM;LAO VOWEL SIGN I
+0EB5;CM;LAO VOWEL SIGN II
+0EB6;CM;LAO VOWEL SIGN Y
+0EB7;CM;LAO VOWEL SIGN YY
+0EB8;CM;LAO VOWEL SIGN U
+0EB9;CM;LAO VOWEL SIGN UU
+0EBB;CM;LAO VOWEL SIGN MAI KON
+0EBC;CM;LAO SEMIVOWEL SIGN LO
+0EBD;SA;LAO SEMIVOWEL SIGN NYO
+0EC0;SA;LAO VOWEL SIGN E
+0EC1;SA;LAO VOWEL SIGN EI
+0EC2;SA;LAO VOWEL SIGN O
+0EC3;SA;LAO VOWEL SIGN AY
+0EC4;SA;LAO VOWEL SIGN AI
+0EC6;SA;LAO KO LA
+0EC8;CM;LAO TONE MAI EK
+0EC9;CM;LAO TONE MAI THO
+0ECA;CM;LAO TONE MAI TI
+0ECB;CM;LAO TONE MAI CATAWA
+0ECC;CM;LAO CANCELLATION MARK
+0ECD;CM;LAO NIGGAHITA
+0ED0;NU;LAO DIGIT ZERO
+0ED1;NU;LAO DIGIT ONE
+0ED2;NU;LAO DIGIT TWO
+0ED3;NU;LAO DIGIT THREE
+0ED4;NU;LAO DIGIT FOUR
+0ED5;NU;LAO DIGIT FIVE
+0ED6;NU;LAO DIGIT SIX
+0ED7;NU;LAO DIGIT SEVEN
+0ED8;NU;LAO DIGIT EIGHT
+0ED9;NU;LAO DIGIT NINE
+0EDC;SA;LAO HO NO
+0EDD;SA;LAO HO MO
+0F00;AL;TIBETAN SYLLABLE OM
+0F01;AL;TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02;AL;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03;AL;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04;AL;TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05;AL;TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06;AL;TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07;AL;TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08;AL;TIBETAN MARK SBRUL SHAD
+0F09;AL;TIBETAN MARK BSKUR YIG MGO
+0F0A;AL;TIBETAN MARK BKA- SHOG YIG MGO
+0F0B;BA;TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C;GL;TIBETAN MARK DELIMITER TSHEG BSTAR
+0F0D;AL;TIBETAN MARK SHAD
+0F0E;AL;TIBETAN MARK NYIS SHAD
+0F0F;AL;TIBETAN MARK TSHEG SHAD
+0F10;AL;TIBETAN MARK NYIS TSHEG SHAD
+0F11;AL;TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12;AL;TIBETAN MARK RGYA GRAM SHAD
+0F13;AL;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14;AL;TIBETAN MARK GTER TSHEG
+0F15;AL;TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16;AL;TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17;AL;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18;CM;TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19;CM;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A;AL;TIBETAN SIGN RDEL DKAR GCIG
+0F1B;AL;TIBETAN SIGN RDEL DKAR GNYIS
+0F1C;AL;TIBETAN SIGN RDEL DKAR GSUM
+0F1D;AL;TIBETAN SIGN RDEL NAG GCIG
+0F1E;AL;TIBETAN SIGN RDEL NAG GNYIS
+0F1F;AL;TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20;NU;TIBETAN DIGIT ZERO
+0F21;NU;TIBETAN DIGIT ONE
+0F22;NU;TIBETAN DIGIT TWO
+0F23;NU;TIBETAN DIGIT THREE
+0F24;NU;TIBETAN DIGIT FOUR
+0F25;NU;TIBETAN DIGIT FIVE
+0F26;NU;TIBETAN DIGIT SIX
+0F27;NU;TIBETAN DIGIT SEVEN
+0F28;NU;TIBETAN DIGIT EIGHT
+0F29;NU;TIBETAN DIGIT NINE
+0F2A;AL;TIBETAN DIGIT HALF ONE
+0F2B;AL;TIBETAN DIGIT HALF TWO
+0F2C;AL;TIBETAN DIGIT HALF THREE
+0F2D;AL;TIBETAN DIGIT HALF FOUR
+0F2E;AL;TIBETAN DIGIT HALF FIVE
+0F2F;AL;TIBETAN DIGIT HALF SIX
+0F30;AL;TIBETAN DIGIT HALF SEVEN
+0F31;AL;TIBETAN DIGIT HALF EIGHT
+0F32;AL;TIBETAN DIGIT HALF NINE
+0F33;AL;TIBETAN DIGIT HALF ZERO
+0F34;AL;TIBETAN MARK BSDUS RTAGS
+0F35;CM;TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36;AL;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37;CM;TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38;AL;TIBETAN MARK CHE MGO
+0F39;CM;TIBETAN MARK TSA -PHRU
+0F3A;OP;TIBETAN MARK GUG RTAGS GYON
+0F3B;CL;TIBETAN MARK GUG RTAGS GYAS
+0F3C;OP;TIBETAN MARK ANG KHANG GYON
+0F3D;CL;TIBETAN MARK ANG KHANG GYAS
+0F3E;CM;TIBETAN SIGN YAR TSHES
+0F3F;CM;TIBETAN SIGN MAR TSHES
+0F40;AL;TIBETAN LETTER KA
+0F41;AL;TIBETAN LETTER KHA
+0F42;AL;TIBETAN LETTER GA
+0F43;AL;TIBETAN LETTER GHA
+0F44;AL;TIBETAN LETTER NGA
+0F45;AL;TIBETAN LETTER CA
+0F46;AL;TIBETAN LETTER CHA
+0F47;AL;TIBETAN LETTER JA
+0F49;AL;TIBETAN LETTER NYA
+0F4A;AL;TIBETAN LETTER TTA
+0F4B;AL;TIBETAN LETTER TTHA
+0F4C;AL;TIBETAN LETTER DDA
+0F4D;AL;TIBETAN LETTER DDHA
+0F4E;AL;TIBETAN LETTER NNA
+0F4F;AL;TIBETAN LETTER TA
+0F50;AL;TIBETAN LETTER THA
+0F51;AL;TIBETAN LETTER DA
+0F52;AL;TIBETAN LETTER DHA
+0F53;AL;TIBETAN LETTER NA
+0F54;AL;TIBETAN LETTER PA
+0F55;AL;TIBETAN LETTER PHA
+0F56;AL;TIBETAN LETTER BA
+0F57;AL;TIBETAN LETTER BHA
+0F58;AL;TIBETAN LETTER MA
+0F59;AL;TIBETAN LETTER TSA
+0F5A;AL;TIBETAN LETTER TSHA
+0F5B;AL;TIBETAN LETTER DZA
+0F5C;AL;TIBETAN LETTER DZHA
+0F5D;AL;TIBETAN LETTER WA
+0F5E;AL;TIBETAN LETTER ZHA
+0F5F;AL;TIBETAN LETTER ZA
+0F60;AL;TIBETAN LETTER -A
+0F61;AL;TIBETAN LETTER YA
+0F62;AL;TIBETAN LETTER RA
+0F63;AL;TIBETAN LETTER LA
+0F64;AL;TIBETAN LETTER SHA
+0F65;AL;TIBETAN LETTER SSA
+0F66;AL;TIBETAN LETTER SA
+0F67;AL;TIBETAN LETTER HA
+0F68;AL;TIBETAN LETTER A
+0F69;AL;TIBETAN LETTER KSSA
+0F6A;AL;TIBETAN LETTER FIXED-FORM RA
+0F71;CM;TIBETAN VOWEL SIGN AA
+0F72;CM;TIBETAN VOWEL SIGN I
+0F73;CM;TIBETAN VOWEL SIGN II
+0F74;CM;TIBETAN VOWEL SIGN U
+0F75;CM;TIBETAN VOWEL SIGN UU
+0F76;CM;TIBETAN VOWEL SIGN VOCALIC R
+0F77;CM;TIBETAN VOWEL SIGN VOCALIC RR
+0F78;CM;TIBETAN VOWEL SIGN VOCALIC L
+0F79;CM;TIBETAN VOWEL SIGN VOCALIC LL
+0F7A;CM;TIBETAN VOWEL SIGN E
+0F7B;CM;TIBETAN VOWEL SIGN EE
+0F7C;CM;TIBETAN VOWEL SIGN O
+0F7D;CM;TIBETAN VOWEL SIGN OO
+0F7E;CM;TIBETAN SIGN RJES SU NGA RO
+0F7F;CM;TIBETAN SIGN RNAM BCAD
+0F80;CM;TIBETAN VOWEL SIGN REVERSED I
+0F81;CM;TIBETAN VOWEL SIGN REVERSED II
+0F82;CM;TIBETAN SIGN NYI ZLA NAA DA
+0F83;CM;TIBETAN SIGN SNA LDAN
+0F84;CM;TIBETAN MARK HALANTA
+0F85;AL;TIBETAN MARK PALUTA
+0F86;CM;TIBETAN SIGN LCI RTAGS
+0F87;CM;TIBETAN SIGN YANG RTAGS
+0F88;AL;TIBETAN SIGN LCE TSA CAN
+0F89;AL;TIBETAN SIGN MCHU CAN
+0F8A;AL;TIBETAN SIGN GRU CAN RGYINGS
+0F8B;AL;TIBETAN SIGN GRU MED RGYINGS
+0F90;CM;TIBETAN SUBJOINED LETTER KA
+0F91;CM;TIBETAN SUBJOINED LETTER KHA
+0F92;CM;TIBETAN SUBJOINED LETTER GA
+0F93;CM;TIBETAN SUBJOINED LETTER GHA
+0F94;CM;TIBETAN SUBJOINED LETTER NGA
+0F95;CM;TIBETAN SUBJOINED LETTER CA
+0F96;CM;TIBETAN SUBJOINED LETTER CHA
+0F97;CM;TIBETAN SUBJOINED LETTER JA
+0F99;CM;TIBETAN SUBJOINED LETTER NYA
+0F9A;CM;TIBETAN SUBJOINED LETTER TTA
+0F9B;CM;TIBETAN SUBJOINED LETTER TTHA
+0F9C;CM;TIBETAN SUBJOINED LETTER DDA
+0F9D;CM;TIBETAN SUBJOINED LETTER DDHA
+0F9E;CM;TIBETAN SUBJOINED LETTER NNA
+0F9F;CM;TIBETAN SUBJOINED LETTER TA
+0FA0;CM;TIBETAN SUBJOINED LETTER THA
+0FA1;CM;TIBETAN SUBJOINED LETTER DA
+0FA2;CM;TIBETAN SUBJOINED LETTER DHA
+0FA3;CM;TIBETAN SUBJOINED LETTER NA
+0FA4;CM;TIBETAN SUBJOINED LETTER PA
+0FA5;CM;TIBETAN SUBJOINED LETTER PHA
+0FA6;CM;TIBETAN SUBJOINED LETTER BA
+0FA7;CM;TIBETAN SUBJOINED LETTER BHA
+0FA8;CM;TIBETAN SUBJOINED LETTER MA
+0FA9;CM;TIBETAN SUBJOINED LETTER TSA
+0FAA;CM;TIBETAN SUBJOINED LETTER TSHA
+0FAB;CM;TIBETAN SUBJOINED LETTER DZA
+0FAC;CM;TIBETAN SUBJOINED LETTER DZHA
+0FAD;CM;TIBETAN SUBJOINED LETTER WA
+0FAE;CM;TIBETAN SUBJOINED LETTER ZHA
+0FAF;CM;TIBETAN SUBJOINED LETTER ZA
+0FB0;CM;TIBETAN SUBJOINED LETTER -A
+0FB1;CM;TIBETAN SUBJOINED LETTER YA
+0FB2;CM;TIBETAN SUBJOINED LETTER RA
+0FB3;CM;TIBETAN SUBJOINED LETTER LA
+0FB4;CM;TIBETAN SUBJOINED LETTER SHA
+0FB5;CM;TIBETAN SUBJOINED LETTER SSA
+0FB6;CM;TIBETAN SUBJOINED LETTER SA
+0FB7;CM;TIBETAN SUBJOINED LETTER HA
+0FB8;CM;TIBETAN SUBJOINED LETTER A
+0FB9;CM;TIBETAN SUBJOINED LETTER KSSA
+0FBA;CM;TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0FBB;CM;TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0FBC;CM;TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE;AL;TIBETAN KU RU KHA
+0FBF;AL;TIBETAN KU RU KHA BZHI MIG CAN
+0FC0;AL;TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1;AL;TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2;AL;TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3;AL;TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4;AL;TIBETAN SYMBOL DRIL BU
+0FC5;AL;TIBETAN SYMBOL RDO RJE
+0FC6;CM;TIBETAN SYMBOL PADMA GDAN
+0FC7;AL;TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8;AL;TIBETAN SYMBOL PHUR PA
+0FC9;AL;TIBETAN SYMBOL NOR BU
+0FCA;AL;TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB;AL;TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC;AL;TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF;AL;TIBETAN SIGN RDEL NAG GSUM
+1000;SA;MYANMAR LETTER KA
+1001;SA;MYANMAR LETTER KHA
+1002;SA;MYANMAR LETTER GA
+1003;SA;MYANMAR LETTER GHA
+1004;SA;MYANMAR LETTER NGA
+1005;SA;MYANMAR LETTER CA
+1006;SA;MYANMAR LETTER CHA
+1007;SA;MYANMAR LETTER JA
+1008;SA;MYANMAR LETTER JHA
+1009;SA;MYANMAR LETTER NYA
+100A;SA;MYANMAR LETTER NNYA
+100B;SA;MYANMAR LETTER TTA
+100C;SA;MYANMAR LETTER TTHA
+100D;SA;MYANMAR LETTER DDA
+100E;SA;MYANMAR LETTER DDHA
+100F;SA;MYANMAR LETTER NNA
+1010;SA;MYANMAR LETTER TA
+1011;SA;MYANMAR LETTER THA
+1012;SA;MYANMAR LETTER DA
+1013;SA;MYANMAR LETTER DHA
+1014;SA;MYANMAR LETTER NA
+1015;SA;MYANMAR LETTER PA
+1016;SA;MYANMAR LETTER PHA
+1017;SA;MYANMAR LETTER BA
+1018;SA;MYANMAR LETTER BHA
+1019;SA;MYANMAR LETTER MA
+101A;SA;MYANMAR LETTER YA
+101B;SA;MYANMAR LETTER RA
+101C;SA;MYANMAR LETTER LA
+101D;SA;MYANMAR LETTER WA
+101E;SA;MYANMAR LETTER SA
+101F;SA;MYANMAR LETTER HA
+1020;SA;MYANMAR LETTER LLA
+1021;SA;MYANMAR LETTER A
+1023;SA;MYANMAR LETTER I
+1024;SA;MYANMAR LETTER II
+1025;SA;MYANMAR LETTER U
+1026;SA;MYANMAR LETTER UU
+1027;SA;MYANMAR LETTER E
+1029;SA;MYANMAR LETTER O
+102A;SA;MYANMAR LETTER AU
+102C;CM;MYANMAR VOWEL SIGN AA
+102D;CM;MYANMAR VOWEL SIGN I
+102E;CM;MYANMAR VOWEL SIGN II
+102F;CM;MYANMAR VOWEL SIGN U
+1030;CM;MYANMAR VOWEL SIGN UU
+1031;CM;MYANMAR VOWEL SIGN E
+1032;CM;MYANMAR VOWEL SIGN AI
+1036;CM;MYANMAR SIGN ANUSVARA
+1037;CM;MYANMAR SIGN DOT BELOW
+1038;CM;MYANMAR SIGN VISARGA
+1039;CM;MYANMAR SIGN VIRAMA
+1040;NU;MYANMAR DIGIT ZERO
+1041;NU;MYANMAR DIGIT ONE
+1042;NU;MYANMAR DIGIT TWO
+1043;NU;MYANMAR DIGIT THREE
+1044;NU;MYANMAR DIGIT FOUR
+1045;NU;MYANMAR DIGIT FIVE
+1046;NU;MYANMAR DIGIT SIX
+1047;NU;MYANMAR DIGIT SEVEN
+1048;NU;MYANMAR DIGIT EIGHT
+1049;NU;MYANMAR DIGIT NINE
+104A;AL;MYANMAR SIGN LITTLE SECTION
+104B;AL;MYANMAR SIGN SECTION
+104C;AL;MYANMAR SYMBOL LOCATIVE
+104D;AL;MYANMAR SYMBOL COMPLETED
+104E;AL;MYANMAR SYMBOL AFOREMENTIONED
+104F;AL;MYANMAR SYMBOL GENITIVE
+1050;SA;MYANMAR LETTER SHA
+1051;SA;MYANMAR LETTER SSA
+1052;SA;MYANMAR LETTER VOCALIC R
+1053;SA;MYANMAR LETTER VOCALIC RR
+1054;SA;MYANMAR LETTER VOCALIC L
+1055;SA;MYANMAR LETTER VOCALIC LL
+1056;CM;MYANMAR VOWEL SIGN VOCALIC R
+1057;CM;MYANMAR VOWEL SIGN VOCALIC RR
+1058;CM;MYANMAR VOWEL SIGN VOCALIC L
+1059;CM;MYANMAR VOWEL SIGN VOCALIC LL
+10A0;AL;GEORGIAN CAPITAL LETTER AN
+10A1;AL;GEORGIAN CAPITAL LETTER BAN
+10A2;AL;GEORGIAN CAPITAL LETTER GAN
+10A3;AL;GEORGIAN CAPITAL LETTER DON
+10A4;AL;GEORGIAN CAPITAL LETTER EN
+10A5;AL;GEORGIAN CAPITAL LETTER VIN
+10A6;AL;GEORGIAN CAPITAL LETTER ZEN
+10A7;AL;GEORGIAN CAPITAL LETTER TAN
+10A8;AL;GEORGIAN CAPITAL LETTER IN
+10A9;AL;GEORGIAN CAPITAL LETTER KAN
+10AA;AL;GEORGIAN CAPITAL LETTER LAS
+10AB;AL;GEORGIAN CAPITAL LETTER MAN
+10AC;AL;GEORGIAN CAPITAL LETTER NAR
+10AD;AL;GEORGIAN CAPITAL LETTER ON
+10AE;AL;GEORGIAN CAPITAL LETTER PAR
+10AF;AL;GEORGIAN CAPITAL LETTER ZHAR
+10B0;AL;GEORGIAN CAPITAL LETTER RAE
+10B1;AL;GEORGIAN CAPITAL LETTER SAN
+10B2;AL;GEORGIAN CAPITAL LETTER TAR
+10B3;AL;GEORGIAN CAPITAL LETTER UN
+10B4;AL;GEORGIAN CAPITAL LETTER PHAR
+10B5;AL;GEORGIAN CAPITAL LETTER KHAR
+10B6;AL;GEORGIAN CAPITAL LETTER GHAN
+10B7;AL;GEORGIAN CAPITAL LETTER QAR
+10B8;AL;GEORGIAN CAPITAL LETTER SHIN
+10B9;AL;GEORGIAN CAPITAL LETTER CHIN
+10BA;AL;GEORGIAN CAPITAL LETTER CAN
+10BB;AL;GEORGIAN CAPITAL LETTER JIL
+10BC;AL;GEORGIAN CAPITAL LETTER CIL
+10BD;AL;GEORGIAN CAPITAL LETTER CHAR
+10BE;AL;GEORGIAN CAPITAL LETTER XAN
+10BF;AL;GEORGIAN CAPITAL LETTER JHAN
+10C0;AL;GEORGIAN CAPITAL LETTER HAE
+10C1;AL;GEORGIAN CAPITAL LETTER HE
+10C2;AL;GEORGIAN CAPITAL LETTER HIE
+10C3;AL;GEORGIAN CAPITAL LETTER WE
+10C4;AL;GEORGIAN CAPITAL LETTER HAR
+10C5;AL;GEORGIAN CAPITAL LETTER HOE
+10D0;AL;GEORGIAN LETTER AN
+10D1;AL;GEORGIAN LETTER BAN
+10D2;AL;GEORGIAN LETTER GAN
+10D3;AL;GEORGIAN LETTER DON
+10D4;AL;GEORGIAN LETTER EN
+10D5;AL;GEORGIAN LETTER VIN
+10D6;AL;GEORGIAN LETTER ZEN
+10D7;AL;GEORGIAN LETTER TAN
+10D8;AL;GEORGIAN LETTER IN
+10D9;AL;GEORGIAN LETTER KAN
+10DA;AL;GEORGIAN LETTER LAS
+10DB;AL;GEORGIAN LETTER MAN
+10DC;AL;GEORGIAN LETTER NAR
+10DD;AL;GEORGIAN LETTER ON
+10DE;AL;GEORGIAN LETTER PAR
+10DF;AL;GEORGIAN LETTER ZHAR
+10E0;AL;GEORGIAN LETTER RAE
+10E1;AL;GEORGIAN LETTER SAN
+10E2;AL;GEORGIAN LETTER TAR
+10E3;AL;GEORGIAN LETTER UN
+10E4;AL;GEORGIAN LETTER PHAR
+10E5;AL;GEORGIAN LETTER KHAR
+10E6;AL;GEORGIAN LETTER GHAN
+10E7;AL;GEORGIAN LETTER QAR
+10E8;AL;GEORGIAN LETTER SHIN
+10E9;AL;GEORGIAN LETTER CHIN
+10EA;AL;GEORGIAN LETTER CAN
+10EB;AL;GEORGIAN LETTER JIL
+10EC;AL;GEORGIAN LETTER CIL
+10ED;AL;GEORGIAN LETTER CHAR
+10EE;AL;GEORGIAN LETTER XAN
+10EF;AL;GEORGIAN LETTER JHAN
+10F0;AL;GEORGIAN LETTER HAE
+10F1;AL;GEORGIAN LETTER HE
+10F2;AL;GEORGIAN LETTER HIE
+10F3;AL;GEORGIAN LETTER WE
+10F4;AL;GEORGIAN LETTER HAR
+10F5;AL;GEORGIAN LETTER HOE
+10F6;AL;GEORGIAN LETTER FI
+10FB;AL;GEORGIAN PARAGRAPH SEPARATOR
+1100;ID;HANGUL CHOSEONG KIYEOK
+1101;ID;HANGUL CHOSEONG SSANGKIYEOK
+1102;ID;HANGUL CHOSEONG NIEUN
+1103;ID;HANGUL CHOSEONG TIKEUT
+1104;ID;HANGUL CHOSEONG SSANGTIKEUT
+1105;ID;HANGUL CHOSEONG RIEUL
+1106;ID;HANGUL CHOSEONG MIEUM
+1107;ID;HANGUL CHOSEONG PIEUP
+1108;ID;HANGUL CHOSEONG SSANGPIEUP
+1109;ID;HANGUL CHOSEONG SIOS
+110A;ID;HANGUL CHOSEONG SSANGSIOS
+110B;ID;HANGUL CHOSEONG IEUNG
+110C;ID;HANGUL CHOSEONG CIEUC
+110D;ID;HANGUL CHOSEONG SSANGCIEUC
+110E;ID;HANGUL CHOSEONG CHIEUCH
+110F;ID;HANGUL CHOSEONG KHIEUKH
+1110;ID;HANGUL CHOSEONG THIEUTH
+1111;ID;HANGUL CHOSEONG PHIEUPH
+1112;ID;HANGUL CHOSEONG HIEUH
+1113;ID;HANGUL CHOSEONG NIEUN-KIYEOK
+1114;ID;HANGUL CHOSEONG SSANGNIEUN
+1115;ID;HANGUL CHOSEONG NIEUN-TIKEUT
+1116;ID;HANGUL CHOSEONG NIEUN-PIEUP
+1117;ID;HANGUL CHOSEONG TIKEUT-KIYEOK
+1118;ID;HANGUL CHOSEONG RIEUL-NIEUN
+1119;ID;HANGUL CHOSEONG SSANGRIEUL
+111A;ID;HANGUL CHOSEONG RIEUL-HIEUH
+111B;ID;HANGUL CHOSEONG KAPYEOUNRIEUL
+111C;ID;HANGUL CHOSEONG MIEUM-PIEUP
+111D;ID;HANGUL CHOSEONG KAPYEOUNMIEUM
+111E;ID;HANGUL CHOSEONG PIEUP-KIYEOK
+111F;ID;HANGUL CHOSEONG PIEUP-NIEUN
+1120;ID;HANGUL CHOSEONG PIEUP-TIKEUT
+1121;ID;HANGUL CHOSEONG PIEUP-SIOS
+1122;ID;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123;ID;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124;ID;HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125;ID;HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126;ID;HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127;ID;HANGUL CHOSEONG PIEUP-CIEUC
+1128;ID;HANGUL CHOSEONG PIEUP-CHIEUCH
+1129;ID;HANGUL CHOSEONG PIEUP-THIEUTH
+112A;ID;HANGUL CHOSEONG PIEUP-PHIEUPH
+112B;ID;HANGUL CHOSEONG KAPYEOUNPIEUP
+112C;ID;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D;ID;HANGUL CHOSEONG SIOS-KIYEOK
+112E;ID;HANGUL CHOSEONG SIOS-NIEUN
+112F;ID;HANGUL CHOSEONG SIOS-TIKEUT
+1130;ID;HANGUL CHOSEONG SIOS-RIEUL
+1131;ID;HANGUL CHOSEONG SIOS-MIEUM
+1132;ID;HANGUL CHOSEONG SIOS-PIEUP
+1133;ID;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134;ID;HANGUL CHOSEONG SIOS-SSANGSIOS
+1135;ID;HANGUL CHOSEONG SIOS-IEUNG
+1136;ID;HANGUL CHOSEONG SIOS-CIEUC
+1137;ID;HANGUL CHOSEONG SIOS-CHIEUCH
+1138;ID;HANGUL CHOSEONG SIOS-KHIEUKH
+1139;ID;HANGUL CHOSEONG SIOS-THIEUTH
+113A;ID;HANGUL CHOSEONG SIOS-PHIEUPH
+113B;ID;HANGUL CHOSEONG SIOS-HIEUH
+113C;ID;HANGUL CHOSEONG CHITUEUMSIOS
+113D;ID;HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E;ID;HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F;ID;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140;ID;HANGUL CHOSEONG PANSIOS
+1141;ID;HANGUL CHOSEONG IEUNG-KIYEOK
+1142;ID;HANGUL CHOSEONG IEUNG-TIKEUT
+1143;ID;HANGUL CHOSEONG IEUNG-MIEUM
+1144;ID;HANGUL CHOSEONG IEUNG-PIEUP
+1145;ID;HANGUL CHOSEONG IEUNG-SIOS
+1146;ID;HANGUL CHOSEONG IEUNG-PANSIOS
+1147;ID;HANGUL CHOSEONG SSANGIEUNG
+1148;ID;HANGUL CHOSEONG IEUNG-CIEUC
+1149;ID;HANGUL CHOSEONG IEUNG-CHIEUCH
+114A;ID;HANGUL CHOSEONG IEUNG-THIEUTH
+114B;ID;HANGUL CHOSEONG IEUNG-PHIEUPH
+114C;ID;HANGUL CHOSEONG YESIEUNG
+114D;ID;HANGUL CHOSEONG CIEUC-IEUNG
+114E;ID;HANGUL CHOSEONG CHITUEUMCIEUC
+114F;ID;HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150;ID;HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151;ID;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152;ID;HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153;ID;HANGUL CHOSEONG CHIEUCH-HIEUH
+1154;ID;HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155;ID;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156;ID;HANGUL CHOSEONG PHIEUPH-PIEUP
+1157;ID;HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158;ID;HANGUL CHOSEONG SSANGHIEUH
+1159;ID;HANGUL CHOSEONG YEORINHIEUH
+115F;ID;HANGUL CHOSEONG FILLER
+1160;CM;HANGUL JUNGSEONG FILLER
+1161;CM;HANGUL JUNGSEONG A
+1162;CM;HANGUL JUNGSEONG AE
+1163;CM;HANGUL JUNGSEONG YA
+1164;CM;HANGUL JUNGSEONG YAE
+1165;CM;HANGUL JUNGSEONG EO
+1166;CM;HANGUL JUNGSEONG E
+1167;CM;HANGUL JUNGSEONG YEO
+1168;CM;HANGUL JUNGSEONG YE
+1169;CM;HANGUL JUNGSEONG O
+116A;CM;HANGUL JUNGSEONG WA
+116B;CM;HANGUL JUNGSEONG WAE
+116C;CM;HANGUL JUNGSEONG OE
+116D;CM;HANGUL JUNGSEONG YO
+116E;CM;HANGUL JUNGSEONG U
+116F;CM;HANGUL JUNGSEONG WEO
+1170;CM;HANGUL JUNGSEONG WE
+1171;CM;HANGUL JUNGSEONG WI
+1172;CM;HANGUL JUNGSEONG YU
+1173;CM;HANGUL JUNGSEONG EU
+1174;CM;HANGUL JUNGSEONG YI
+1175;CM;HANGUL JUNGSEONG I
+1176;CM;HANGUL JUNGSEONG A-O
+1177;CM;HANGUL JUNGSEONG A-U
+1178;CM;HANGUL JUNGSEONG YA-O
+1179;CM;HANGUL JUNGSEONG YA-YO
+117A;CM;HANGUL JUNGSEONG EO-O
+117B;CM;HANGUL JUNGSEONG EO-U
+117C;CM;HANGUL JUNGSEONG EO-EU
+117D;CM;HANGUL JUNGSEONG YEO-O
+117E;CM;HANGUL JUNGSEONG YEO-U
+117F;CM;HANGUL JUNGSEONG O-EO
+1180;CM;HANGUL JUNGSEONG O-E
+1181;CM;HANGUL JUNGSEONG O-YE
+1182;CM;HANGUL JUNGSEONG O-O
+1183;CM;HANGUL JUNGSEONG O-U
+1184;CM;HANGUL JUNGSEONG YO-YA
+1185;CM;HANGUL JUNGSEONG YO-YAE
+1186;CM;HANGUL JUNGSEONG YO-YEO
+1187;CM;HANGUL JUNGSEONG YO-O
+1188;CM;HANGUL JUNGSEONG YO-I
+1189;CM;HANGUL JUNGSEONG U-A
+118A;CM;HANGUL JUNGSEONG U-AE
+118B;CM;HANGUL JUNGSEONG U-EO-EU
+118C;CM;HANGUL JUNGSEONG U-YE
+118D;CM;HANGUL JUNGSEONG U-U
+118E;CM;HANGUL JUNGSEONG YU-A
+118F;CM;HANGUL JUNGSEONG YU-EO
+1190;CM;HANGUL JUNGSEONG YU-E
+1191;CM;HANGUL JUNGSEONG YU-YEO
+1192;CM;HANGUL JUNGSEONG YU-YE
+1193;CM;HANGUL JUNGSEONG YU-U
+1194;CM;HANGUL JUNGSEONG YU-I
+1195;CM;HANGUL JUNGSEONG EU-U
+1196;CM;HANGUL JUNGSEONG EU-EU
+1197;CM;HANGUL JUNGSEONG YI-U
+1198;CM;HANGUL JUNGSEONG I-A
+1199;CM;HANGUL JUNGSEONG I-YA
+119A;CM;HANGUL JUNGSEONG I-O
+119B;CM;HANGUL JUNGSEONG I-U
+119C;CM;HANGUL JUNGSEONG I-EU
+119D;CM;HANGUL JUNGSEONG I-ARAEA
+119E;CM;HANGUL JUNGSEONG ARAEA
+119F;CM;HANGUL JUNGSEONG ARAEA-EO
+11A0;CM;HANGUL JUNGSEONG ARAEA-U
+11A1;CM;HANGUL JUNGSEONG ARAEA-I
+11A2;CM;HANGUL JUNGSEONG SSANGARAEA
+11A8;CM;HANGUL JONGSEONG KIYEOK
+11A9;CM;HANGUL JONGSEONG SSANGKIYEOK
+11AA;CM;HANGUL JONGSEONG KIYEOK-SIOS
+11AB;CM;HANGUL JONGSEONG NIEUN
+11AC;CM;HANGUL JONGSEONG NIEUN-CIEUC
+11AD;CM;HANGUL JONGSEONG NIEUN-HIEUH
+11AE;CM;HANGUL JONGSEONG TIKEUT
+11AF;CM;HANGUL JONGSEONG RIEUL
+11B0;CM;HANGUL JONGSEONG RIEUL-KIYEOK
+11B1;CM;HANGUL JONGSEONG RIEUL-MIEUM
+11B2;CM;HANGUL JONGSEONG RIEUL-PIEUP
+11B3;CM;HANGUL JONGSEONG RIEUL-SIOS
+11B4;CM;HANGUL JONGSEONG RIEUL-THIEUTH
+11B5;CM;HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6;CM;HANGUL JONGSEONG RIEUL-HIEUH
+11B7;CM;HANGUL JONGSEONG MIEUM
+11B8;CM;HANGUL JONGSEONG PIEUP
+11B9;CM;HANGUL JONGSEONG PIEUP-SIOS
+11BA;CM;HANGUL JONGSEONG SIOS
+11BB;CM;HANGUL JONGSEONG SSANGSIOS
+11BC;CM;HANGUL JONGSEONG IEUNG
+11BD;CM;HANGUL JONGSEONG CIEUC
+11BE;CM;HANGUL JONGSEONG CHIEUCH
+11BF;CM;HANGUL JONGSEONG KHIEUKH
+11C0;CM;HANGUL JONGSEONG THIEUTH
+11C1;CM;HANGUL JONGSEONG PHIEUPH
+11C2;CM;HANGUL JONGSEONG HIEUH
+11C3;CM;HANGUL JONGSEONG KIYEOK-RIEUL
+11C4;CM;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5;CM;HANGUL JONGSEONG NIEUN-KIYEOK
+11C6;CM;HANGUL JONGSEONG NIEUN-TIKEUT
+11C7;CM;HANGUL JONGSEONG NIEUN-SIOS
+11C8;CM;HANGUL JONGSEONG NIEUN-PANSIOS
+11C9;CM;HANGUL JONGSEONG NIEUN-THIEUTH
+11CA;CM;HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB;CM;HANGUL JONGSEONG TIKEUT-RIEUL
+11CC;CM;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD;CM;HANGUL JONGSEONG RIEUL-NIEUN
+11CE;CM;HANGUL JONGSEONG RIEUL-TIKEUT
+11CF;CM;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0;CM;HANGUL JONGSEONG SSANGRIEUL
+11D1;CM;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2;CM;HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3;CM;HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4;CM;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5;CM;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6;CM;HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7;CM;HANGUL JONGSEONG RIEUL-PANSIOS
+11D8;CM;HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9;CM;HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA;CM;HANGUL JONGSEONG MIEUM-KIYEOK
+11DB;CM;HANGUL JONGSEONG MIEUM-RIEUL
+11DC;CM;HANGUL JONGSEONG MIEUM-PIEUP
+11DD;CM;HANGUL JONGSEONG MIEUM-SIOS
+11DE;CM;HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF;CM;HANGUL JONGSEONG MIEUM-PANSIOS
+11E0;CM;HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1;CM;HANGUL JONGSEONG MIEUM-HIEUH
+11E2;CM;HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3;CM;HANGUL JONGSEONG PIEUP-RIEUL
+11E4;CM;HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5;CM;HANGUL JONGSEONG PIEUP-HIEUH
+11E6;CM;HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7;CM;HANGUL JONGSEONG SIOS-KIYEOK
+11E8;CM;HANGUL JONGSEONG SIOS-TIKEUT
+11E9;CM;HANGUL JONGSEONG SIOS-RIEUL
+11EA;CM;HANGUL JONGSEONG SIOS-PIEUP
+11EB;CM;HANGUL JONGSEONG PANSIOS
+11EC;CM;HANGUL JONGSEONG IEUNG-KIYEOK
+11ED;CM;HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE;CM;HANGUL JONGSEONG SSANGIEUNG
+11EF;CM;HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0;CM;HANGUL JONGSEONG YESIEUNG
+11F1;CM;HANGUL JONGSEONG YESIEUNG-SIOS
+11F2;CM;HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3;CM;HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4;CM;HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5;CM;HANGUL JONGSEONG HIEUH-NIEUN
+11F6;CM;HANGUL JONGSEONG HIEUH-RIEUL
+11F7;CM;HANGUL JONGSEONG HIEUH-MIEUM
+11F8;CM;HANGUL JONGSEONG HIEUH-PIEUP
+11F9;CM;HANGUL JONGSEONG YEORINHIEUH
+1200;AL;ETHIOPIC SYLLABLE HA
+1201;AL;ETHIOPIC SYLLABLE HU
+1202;AL;ETHIOPIC SYLLABLE HI
+1203;AL;ETHIOPIC SYLLABLE HAA
+1204;AL;ETHIOPIC SYLLABLE HEE
+1205;AL;ETHIOPIC SYLLABLE HE
+1206;AL;ETHIOPIC SYLLABLE HO
+1208;AL;ETHIOPIC SYLLABLE LA
+1209;AL;ETHIOPIC SYLLABLE LU
+120A;AL;ETHIOPIC SYLLABLE LI
+120B;AL;ETHIOPIC SYLLABLE LAA
+120C;AL;ETHIOPIC SYLLABLE LEE
+120D;AL;ETHIOPIC SYLLABLE LE
+120E;AL;ETHIOPIC SYLLABLE LO
+120F;AL;ETHIOPIC SYLLABLE LWA
+1210;AL;ETHIOPIC SYLLABLE HHA
+1211;AL;ETHIOPIC SYLLABLE HHU
+1212;AL;ETHIOPIC SYLLABLE HHI
+1213;AL;ETHIOPIC SYLLABLE HHAA
+1214;AL;ETHIOPIC SYLLABLE HHEE
+1215;AL;ETHIOPIC SYLLABLE HHE
+1216;AL;ETHIOPIC SYLLABLE HHO
+1217;AL;ETHIOPIC SYLLABLE HHWA
+1218;AL;ETHIOPIC SYLLABLE MA
+1219;AL;ETHIOPIC SYLLABLE MU
+121A;AL;ETHIOPIC SYLLABLE MI
+121B;AL;ETHIOPIC SYLLABLE MAA
+121C;AL;ETHIOPIC SYLLABLE MEE
+121D;AL;ETHIOPIC SYLLABLE ME
+121E;AL;ETHIOPIC SYLLABLE MO
+121F;AL;ETHIOPIC SYLLABLE MWA
+1220;AL;ETHIOPIC SYLLABLE SZA
+1221;AL;ETHIOPIC SYLLABLE SZU
+1222;AL;ETHIOPIC SYLLABLE SZI
+1223;AL;ETHIOPIC SYLLABLE SZAA
+1224;AL;ETHIOPIC SYLLABLE SZEE
+1225;AL;ETHIOPIC SYLLABLE SZE
+1226;AL;ETHIOPIC SYLLABLE SZO
+1227;AL;ETHIOPIC SYLLABLE SZWA
+1228;AL;ETHIOPIC SYLLABLE RA
+1229;AL;ETHIOPIC SYLLABLE RU
+122A;AL;ETHIOPIC SYLLABLE RI
+122B;AL;ETHIOPIC SYLLABLE RAA
+122C;AL;ETHIOPIC SYLLABLE REE
+122D;AL;ETHIOPIC SYLLABLE RE
+122E;AL;ETHIOPIC SYLLABLE RO
+122F;AL;ETHIOPIC SYLLABLE RWA
+1230;AL;ETHIOPIC SYLLABLE SA
+1231;AL;ETHIOPIC SYLLABLE SU
+1232;AL;ETHIOPIC SYLLABLE SI
+1233;AL;ETHIOPIC SYLLABLE SAA
+1234;AL;ETHIOPIC SYLLABLE SEE
+1235;AL;ETHIOPIC SYLLABLE SE
+1236;AL;ETHIOPIC SYLLABLE SO
+1237;AL;ETHIOPIC SYLLABLE SWA
+1238;AL;ETHIOPIC SYLLABLE SHA
+1239;AL;ETHIOPIC SYLLABLE SHU
+123A;AL;ETHIOPIC SYLLABLE SHI
+123B;AL;ETHIOPIC SYLLABLE SHAA
+123C;AL;ETHIOPIC SYLLABLE SHEE
+123D;AL;ETHIOPIC SYLLABLE SHE
+123E;AL;ETHIOPIC SYLLABLE SHO
+123F;AL;ETHIOPIC SYLLABLE SHWA
+1240;AL;ETHIOPIC SYLLABLE QA
+1241;AL;ETHIOPIC SYLLABLE QU
+1242;AL;ETHIOPIC SYLLABLE QI
+1243;AL;ETHIOPIC SYLLABLE QAA
+1244;AL;ETHIOPIC SYLLABLE QEE
+1245;AL;ETHIOPIC SYLLABLE QE
+1246;AL;ETHIOPIC SYLLABLE QO
+1248;AL;ETHIOPIC SYLLABLE QWA
+124A;AL;ETHIOPIC SYLLABLE QWI
+124B;AL;ETHIOPIC SYLLABLE QWAA
+124C;AL;ETHIOPIC SYLLABLE QWEE
+124D;AL;ETHIOPIC SYLLABLE QWE
+1250;AL;ETHIOPIC SYLLABLE QHA
+1251;AL;ETHIOPIC SYLLABLE QHU
+1252;AL;ETHIOPIC SYLLABLE QHI
+1253;AL;ETHIOPIC SYLLABLE QHAA
+1254;AL;ETHIOPIC SYLLABLE QHEE
+1255;AL;ETHIOPIC SYLLABLE QHE
+1256;AL;ETHIOPIC SYLLABLE QHO
+1258;AL;ETHIOPIC SYLLABLE QHWA
+125A;AL;ETHIOPIC SYLLABLE QHWI
+125B;AL;ETHIOPIC SYLLABLE QHWAA
+125C;AL;ETHIOPIC SYLLABLE QHWEE
+125D;AL;ETHIOPIC SYLLABLE QHWE
+1260;AL;ETHIOPIC SYLLABLE BA
+1261;AL;ETHIOPIC SYLLABLE BU
+1262;AL;ETHIOPIC SYLLABLE BI
+1263;AL;ETHIOPIC SYLLABLE BAA
+1264;AL;ETHIOPIC SYLLABLE BEE
+1265;AL;ETHIOPIC SYLLABLE BE
+1266;AL;ETHIOPIC SYLLABLE BO
+1267;AL;ETHIOPIC SYLLABLE BWA
+1268;AL;ETHIOPIC SYLLABLE VA
+1269;AL;ETHIOPIC SYLLABLE VU
+126A;AL;ETHIOPIC SYLLABLE VI
+126B;AL;ETHIOPIC SYLLABLE VAA
+126C;AL;ETHIOPIC SYLLABLE VEE
+126D;AL;ETHIOPIC SYLLABLE VE
+126E;AL;ETHIOPIC SYLLABLE VO
+126F;AL;ETHIOPIC SYLLABLE VWA
+1270;AL;ETHIOPIC SYLLABLE TA
+1271;AL;ETHIOPIC SYLLABLE TU
+1272;AL;ETHIOPIC SYLLABLE TI
+1273;AL;ETHIOPIC SYLLABLE TAA
+1274;AL;ETHIOPIC SYLLABLE TEE
+1275;AL;ETHIOPIC SYLLABLE TE
+1276;AL;ETHIOPIC SYLLABLE TO
+1277;AL;ETHIOPIC SYLLABLE TWA
+1278;AL;ETHIOPIC SYLLABLE CA
+1279;AL;ETHIOPIC SYLLABLE CU
+127A;AL;ETHIOPIC SYLLABLE CI
+127B;AL;ETHIOPIC SYLLABLE CAA
+127C;AL;ETHIOPIC SYLLABLE CEE
+127D;AL;ETHIOPIC SYLLABLE CE
+127E;AL;ETHIOPIC SYLLABLE CO
+127F;AL;ETHIOPIC SYLLABLE CWA
+1280;AL;ETHIOPIC SYLLABLE XA
+1281;AL;ETHIOPIC SYLLABLE XU
+1282;AL;ETHIOPIC SYLLABLE XI
+1283;AL;ETHIOPIC SYLLABLE XAA
+1284;AL;ETHIOPIC SYLLABLE XEE
+1285;AL;ETHIOPIC SYLLABLE XE
+1286;AL;ETHIOPIC SYLLABLE XO
+1288;AL;ETHIOPIC SYLLABLE XWA
+128A;AL;ETHIOPIC SYLLABLE XWI
+128B;AL;ETHIOPIC SYLLABLE XWAA
+128C;AL;ETHIOPIC SYLLABLE XWEE
+128D;AL;ETHIOPIC SYLLABLE XWE
+1290;AL;ETHIOPIC SYLLABLE NA
+1291;AL;ETHIOPIC SYLLABLE NU
+1292;AL;ETHIOPIC SYLLABLE NI
+1293;AL;ETHIOPIC SYLLABLE NAA
+1294;AL;ETHIOPIC SYLLABLE NEE
+1295;AL;ETHIOPIC SYLLABLE NE
+1296;AL;ETHIOPIC SYLLABLE NO
+1297;AL;ETHIOPIC SYLLABLE NWA
+1298;AL;ETHIOPIC SYLLABLE NYA
+1299;AL;ETHIOPIC SYLLABLE NYU
+129A;AL;ETHIOPIC SYLLABLE NYI
+129B;AL;ETHIOPIC SYLLABLE NYAA
+129C;AL;ETHIOPIC SYLLABLE NYEE
+129D;AL;ETHIOPIC SYLLABLE NYE
+129E;AL;ETHIOPIC SYLLABLE NYO
+129F;AL;ETHIOPIC SYLLABLE NYWA
+12A0;AL;ETHIOPIC SYLLABLE GLOTTAL A
+12A1;AL;ETHIOPIC SYLLABLE GLOTTAL U
+12A2;AL;ETHIOPIC SYLLABLE GLOTTAL I
+12A3;AL;ETHIOPIC SYLLABLE GLOTTAL AA
+12A4;AL;ETHIOPIC SYLLABLE GLOTTAL EE
+12A5;AL;ETHIOPIC SYLLABLE GLOTTAL E
+12A6;AL;ETHIOPIC SYLLABLE GLOTTAL O
+12A7;AL;ETHIOPIC SYLLABLE GLOTTAL WA
+12A8;AL;ETHIOPIC SYLLABLE KA
+12A9;AL;ETHIOPIC SYLLABLE KU
+12AA;AL;ETHIOPIC SYLLABLE KI
+12AB;AL;ETHIOPIC SYLLABLE KAA
+12AC;AL;ETHIOPIC SYLLABLE KEE
+12AD;AL;ETHIOPIC SYLLABLE KE
+12AE;AL;ETHIOPIC SYLLABLE KO
+12B0;AL;ETHIOPIC SYLLABLE KWA
+12B2;AL;ETHIOPIC SYLLABLE KWI
+12B3;AL;ETHIOPIC SYLLABLE KWAA
+12B4;AL;ETHIOPIC SYLLABLE KWEE
+12B5;AL;ETHIOPIC SYLLABLE KWE
+12B8;AL;ETHIOPIC SYLLABLE KXA
+12B9;AL;ETHIOPIC SYLLABLE KXU
+12BA;AL;ETHIOPIC SYLLABLE KXI
+12BB;AL;ETHIOPIC SYLLABLE KXAA
+12BC;AL;ETHIOPIC SYLLABLE KXEE
+12BD;AL;ETHIOPIC SYLLABLE KXE
+12BE;AL;ETHIOPIC SYLLABLE KXO
+12C0;AL;ETHIOPIC SYLLABLE KXWA
+12C2;AL;ETHIOPIC SYLLABLE KXWI
+12C3;AL;ETHIOPIC SYLLABLE KXWAA
+12C4;AL;ETHIOPIC SYLLABLE KXWEE
+12C5;AL;ETHIOPIC SYLLABLE KXWE
+12C8;AL;ETHIOPIC SYLLABLE WA
+12C9;AL;ETHIOPIC SYLLABLE WU
+12CA;AL;ETHIOPIC SYLLABLE WI
+12CB;AL;ETHIOPIC SYLLABLE WAA
+12CC;AL;ETHIOPIC SYLLABLE WEE
+12CD;AL;ETHIOPIC SYLLABLE WE
+12CE;AL;ETHIOPIC SYLLABLE WO
+12D0;AL;ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1;AL;ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2;AL;ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3;AL;ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4;AL;ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5;AL;ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6;AL;ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8;AL;ETHIOPIC SYLLABLE ZA
+12D9;AL;ETHIOPIC SYLLABLE ZU
+12DA;AL;ETHIOPIC SYLLABLE ZI
+12DB;AL;ETHIOPIC SYLLABLE ZAA
+12DC;AL;ETHIOPIC SYLLABLE ZEE
+12DD;AL;ETHIOPIC SYLLABLE ZE
+12DE;AL;ETHIOPIC SYLLABLE ZO
+12DF;AL;ETHIOPIC SYLLABLE ZWA
+12E0;AL;ETHIOPIC SYLLABLE ZHA
+12E1;AL;ETHIOPIC SYLLABLE ZHU
+12E2;AL;ETHIOPIC SYLLABLE ZHI
+12E3;AL;ETHIOPIC SYLLABLE ZHAA
+12E4;AL;ETHIOPIC SYLLABLE ZHEE
+12E5;AL;ETHIOPIC SYLLABLE ZHE
+12E6;AL;ETHIOPIC SYLLABLE ZHO
+12E7;AL;ETHIOPIC SYLLABLE ZHWA
+12E8;AL;ETHIOPIC SYLLABLE YA
+12E9;AL;ETHIOPIC SYLLABLE YU
+12EA;AL;ETHIOPIC SYLLABLE YI
+12EB;AL;ETHIOPIC SYLLABLE YAA
+12EC;AL;ETHIOPIC SYLLABLE YEE
+12ED;AL;ETHIOPIC SYLLABLE YE
+12EE;AL;ETHIOPIC SYLLABLE YO
+12F0;AL;ETHIOPIC SYLLABLE DA
+12F1;AL;ETHIOPIC SYLLABLE DU
+12F2;AL;ETHIOPIC SYLLABLE DI
+12F3;AL;ETHIOPIC SYLLABLE DAA
+12F4;AL;ETHIOPIC SYLLABLE DEE
+12F5;AL;ETHIOPIC SYLLABLE DE
+12F6;AL;ETHIOPIC SYLLABLE DO
+12F7;AL;ETHIOPIC SYLLABLE DWA
+12F8;AL;ETHIOPIC SYLLABLE DDA
+12F9;AL;ETHIOPIC SYLLABLE DDU
+12FA;AL;ETHIOPIC SYLLABLE DDI
+12FB;AL;ETHIOPIC SYLLABLE DDAA
+12FC;AL;ETHIOPIC SYLLABLE DDEE
+12FD;AL;ETHIOPIC SYLLABLE DDE
+12FE;AL;ETHIOPIC SYLLABLE DDO
+12FF;AL;ETHIOPIC SYLLABLE DDWA
+1300;AL;ETHIOPIC SYLLABLE JA
+1301;AL;ETHIOPIC SYLLABLE JU
+1302;AL;ETHIOPIC SYLLABLE JI
+1303;AL;ETHIOPIC SYLLABLE JAA
+1304;AL;ETHIOPIC SYLLABLE JEE
+1305;AL;ETHIOPIC SYLLABLE JE
+1306;AL;ETHIOPIC SYLLABLE JO
+1307;AL;ETHIOPIC SYLLABLE JWA
+1308;AL;ETHIOPIC SYLLABLE GA
+1309;AL;ETHIOPIC SYLLABLE GU
+130A;AL;ETHIOPIC SYLLABLE GI
+130B;AL;ETHIOPIC SYLLABLE GAA
+130C;AL;ETHIOPIC SYLLABLE GEE
+130D;AL;ETHIOPIC SYLLABLE GE
+130E;AL;ETHIOPIC SYLLABLE GO
+1310;AL;ETHIOPIC SYLLABLE GWA
+1312;AL;ETHIOPIC SYLLABLE GWI
+1313;AL;ETHIOPIC SYLLABLE GWAA
+1314;AL;ETHIOPIC SYLLABLE GWEE
+1315;AL;ETHIOPIC SYLLABLE GWE
+1318;AL;ETHIOPIC SYLLABLE GGA
+1319;AL;ETHIOPIC SYLLABLE GGU
+131A;AL;ETHIOPIC SYLLABLE GGI
+131B;AL;ETHIOPIC SYLLABLE GGAA
+131C;AL;ETHIOPIC SYLLABLE GGEE
+131D;AL;ETHIOPIC SYLLABLE GGE
+131E;AL;ETHIOPIC SYLLABLE GGO
+1320;AL;ETHIOPIC SYLLABLE THA
+1321;AL;ETHIOPIC SYLLABLE THU
+1322;AL;ETHIOPIC SYLLABLE THI
+1323;AL;ETHIOPIC SYLLABLE THAA
+1324;AL;ETHIOPIC SYLLABLE THEE
+1325;AL;ETHIOPIC SYLLABLE THE
+1326;AL;ETHIOPIC SYLLABLE THO
+1327;AL;ETHIOPIC SYLLABLE THWA
+1328;AL;ETHIOPIC SYLLABLE CHA
+1329;AL;ETHIOPIC SYLLABLE CHU
+132A;AL;ETHIOPIC SYLLABLE CHI
+132B;AL;ETHIOPIC SYLLABLE CHAA
+132C;AL;ETHIOPIC SYLLABLE CHEE
+132D;AL;ETHIOPIC SYLLABLE CHE
+132E;AL;ETHIOPIC SYLLABLE CHO
+132F;AL;ETHIOPIC SYLLABLE CHWA
+1330;AL;ETHIOPIC SYLLABLE PHA
+1331;AL;ETHIOPIC SYLLABLE PHU
+1332;AL;ETHIOPIC SYLLABLE PHI
+1333;AL;ETHIOPIC SYLLABLE PHAA
+1334;AL;ETHIOPIC SYLLABLE PHEE
+1335;AL;ETHIOPIC SYLLABLE PHE
+1336;AL;ETHIOPIC SYLLABLE PHO
+1337;AL;ETHIOPIC SYLLABLE PHWA
+1338;AL;ETHIOPIC SYLLABLE TSA
+1339;AL;ETHIOPIC SYLLABLE TSU
+133A;AL;ETHIOPIC SYLLABLE TSI
+133B;AL;ETHIOPIC SYLLABLE TSAA
+133C;AL;ETHIOPIC SYLLABLE TSEE
+133D;AL;ETHIOPIC SYLLABLE TSE
+133E;AL;ETHIOPIC SYLLABLE TSO
+133F;AL;ETHIOPIC SYLLABLE TSWA
+1340;AL;ETHIOPIC SYLLABLE TZA
+1341;AL;ETHIOPIC SYLLABLE TZU
+1342;AL;ETHIOPIC SYLLABLE TZI
+1343;AL;ETHIOPIC SYLLABLE TZAA
+1344;AL;ETHIOPIC SYLLABLE TZEE
+1345;AL;ETHIOPIC SYLLABLE TZE
+1346;AL;ETHIOPIC SYLLABLE TZO
+1348;AL;ETHIOPIC SYLLABLE FA
+1349;AL;ETHIOPIC SYLLABLE FU
+134A;AL;ETHIOPIC SYLLABLE FI
+134B;AL;ETHIOPIC SYLLABLE FAA
+134C;AL;ETHIOPIC SYLLABLE FEE
+134D;AL;ETHIOPIC SYLLABLE FE
+134E;AL;ETHIOPIC SYLLABLE FO
+134F;AL;ETHIOPIC SYLLABLE FWA
+1350;AL;ETHIOPIC SYLLABLE PA
+1351;AL;ETHIOPIC SYLLABLE PU
+1352;AL;ETHIOPIC SYLLABLE PI
+1353;AL;ETHIOPIC SYLLABLE PAA
+1354;AL;ETHIOPIC SYLLABLE PEE
+1355;AL;ETHIOPIC SYLLABLE PE
+1356;AL;ETHIOPIC SYLLABLE PO
+1357;AL;ETHIOPIC SYLLABLE PWA
+1358;AL;ETHIOPIC SYLLABLE RYA
+1359;AL;ETHIOPIC SYLLABLE MYA
+135A;AL;ETHIOPIC SYLLABLE FYA
+1361;BA;ETHIOPIC WORDSPACE
+1362;AL;ETHIOPIC FULL STOP
+1363;AL;ETHIOPIC COMMA
+1364;AL;ETHIOPIC SEMICOLON
+1365;AL;ETHIOPIC COLON
+1366;AL;ETHIOPIC PREFACE COLON
+1367;AL;ETHIOPIC QUESTION MARK
+1368;AL;ETHIOPIC PARAGRAPH SEPARATOR
+1369;NU;ETHIOPIC DIGIT ONE
+136A;NU;ETHIOPIC DIGIT TWO
+136B;NU;ETHIOPIC DIGIT THREE
+136C;NU;ETHIOPIC DIGIT FOUR
+136D;NU;ETHIOPIC DIGIT FIVE
+136E;NU;ETHIOPIC DIGIT SIX
+136F;NU;ETHIOPIC DIGIT SEVEN
+1370;NU;ETHIOPIC DIGIT EIGHT
+1371;NU;ETHIOPIC DIGIT NINE
+1372;AL;ETHIOPIC NUMBER TEN
+1373;AL;ETHIOPIC NUMBER TWENTY
+1374;AL;ETHIOPIC NUMBER THIRTY
+1375;AL;ETHIOPIC NUMBER FORTY
+1376;AL;ETHIOPIC NUMBER FIFTY
+1377;AL;ETHIOPIC NUMBER SIXTY
+1378;AL;ETHIOPIC NUMBER SEVENTY
+1379;AL;ETHIOPIC NUMBER EIGHTY
+137A;AL;ETHIOPIC NUMBER NINETY
+137B;AL;ETHIOPIC NUMBER HUNDRED
+137C;AL;ETHIOPIC NUMBER TEN THOUSAND
+13A0;AL;CHEROKEE LETTER A
+13A1;AL;CHEROKEE LETTER E
+13A2;AL;CHEROKEE LETTER I
+13A3;AL;CHEROKEE LETTER O
+13A4;AL;CHEROKEE LETTER U
+13A5;AL;CHEROKEE LETTER V
+13A6;AL;CHEROKEE LETTER GA
+13A7;AL;CHEROKEE LETTER KA
+13A8;AL;CHEROKEE LETTER GE
+13A9;AL;CHEROKEE LETTER GI
+13AA;AL;CHEROKEE LETTER GO
+13AB;AL;CHEROKEE LETTER GU
+13AC;AL;CHEROKEE LETTER GV
+13AD;AL;CHEROKEE LETTER HA
+13AE;AL;CHEROKEE LETTER HE
+13AF;AL;CHEROKEE LETTER HI
+13B0;AL;CHEROKEE LETTER HO
+13B1;AL;CHEROKEE LETTER HU
+13B2;AL;CHEROKEE LETTER HV
+13B3;AL;CHEROKEE LETTER LA
+13B4;AL;CHEROKEE LETTER LE
+13B5;AL;CHEROKEE LETTER LI
+13B6;AL;CHEROKEE LETTER LO
+13B7;AL;CHEROKEE LETTER LU
+13B8;AL;CHEROKEE LETTER LV
+13B9;AL;CHEROKEE LETTER MA
+13BA;AL;CHEROKEE LETTER ME
+13BB;AL;CHEROKEE LETTER MI
+13BC;AL;CHEROKEE LETTER MO
+13BD;AL;CHEROKEE LETTER MU
+13BE;AL;CHEROKEE LETTER NA
+13BF;AL;CHEROKEE LETTER HNA
+13C0;AL;CHEROKEE LETTER NAH
+13C1;AL;CHEROKEE LETTER NE
+13C2;AL;CHEROKEE LETTER NI
+13C3;AL;CHEROKEE LETTER NO
+13C4;AL;CHEROKEE LETTER NU
+13C5;AL;CHEROKEE LETTER NV
+13C6;AL;CHEROKEE LETTER QUA
+13C7;AL;CHEROKEE LETTER QUE
+13C8;AL;CHEROKEE LETTER QUI
+13C9;AL;CHEROKEE LETTER QUO
+13CA;AL;CHEROKEE LETTER QUU
+13CB;AL;CHEROKEE LETTER QUV
+13CC;AL;CHEROKEE LETTER SA
+13CD;AL;CHEROKEE LETTER S
+13CE;AL;CHEROKEE LETTER SE
+13CF;AL;CHEROKEE LETTER SI
+13D0;AL;CHEROKEE LETTER SO
+13D1;AL;CHEROKEE LETTER SU
+13D2;AL;CHEROKEE LETTER SV
+13D3;AL;CHEROKEE LETTER DA
+13D4;AL;CHEROKEE LETTER TA
+13D5;AL;CHEROKEE LETTER DE
+13D6;AL;CHEROKEE LETTER TE
+13D7;AL;CHEROKEE LETTER DI
+13D8;AL;CHEROKEE LETTER TI
+13D9;AL;CHEROKEE LETTER DO
+13DA;AL;CHEROKEE LETTER DU
+13DB;AL;CHEROKEE LETTER DV
+13DC;AL;CHEROKEE LETTER DLA
+13DD;AL;CHEROKEE LETTER TLA
+13DE;AL;CHEROKEE LETTER TLE
+13DF;AL;CHEROKEE LETTER TLI
+13E0;AL;CHEROKEE LETTER TLO
+13E1;AL;CHEROKEE LETTER TLU
+13E2;AL;CHEROKEE LETTER TLV
+13E3;AL;CHEROKEE LETTER TSA
+13E4;AL;CHEROKEE LETTER TSE
+13E5;AL;CHEROKEE LETTER TSI
+13E6;AL;CHEROKEE LETTER TSO
+13E7;AL;CHEROKEE LETTER TSU
+13E8;AL;CHEROKEE LETTER TSV
+13E9;AL;CHEROKEE LETTER WA
+13EA;AL;CHEROKEE LETTER WE
+13EB;AL;CHEROKEE LETTER WI
+13EC;AL;CHEROKEE LETTER WO
+13ED;AL;CHEROKEE LETTER WU
+13EE;AL;CHEROKEE LETTER WV
+13EF;AL;CHEROKEE LETTER YA
+13F0;AL;CHEROKEE LETTER YE
+13F1;AL;CHEROKEE LETTER YI
+13F2;AL;CHEROKEE LETTER YO
+13F3;AL;CHEROKEE LETTER YU
+13F4;AL;CHEROKEE LETTER YV
+1401;AL;CANADIAN SYLLABICS E
+1402;AL;CANADIAN SYLLABICS AAI
+1403;AL;CANADIAN SYLLABICS I
+1404;AL;CANADIAN SYLLABICS II
+1405;AL;CANADIAN SYLLABICS O
+1406;AL;CANADIAN SYLLABICS OO
+1407;AL;CANADIAN SYLLABICS Y-CREE OO
+1408;AL;CANADIAN SYLLABICS CARRIER EE
+1409;AL;CANADIAN SYLLABICS CARRIER I
+140A;AL;CANADIAN SYLLABICS A
+140B;AL;CANADIAN SYLLABICS AA
+140C;AL;CANADIAN SYLLABICS WE
+140D;AL;CANADIAN SYLLABICS WEST-CREE WE
+140E;AL;CANADIAN SYLLABICS WI
+140F;AL;CANADIAN SYLLABICS WEST-CREE WI
+1410;AL;CANADIAN SYLLABICS WII
+1411;AL;CANADIAN SYLLABICS WEST-CREE WII
+1412;AL;CANADIAN SYLLABICS WO
+1413;AL;CANADIAN SYLLABICS WEST-CREE WO
+1414;AL;CANADIAN SYLLABICS WOO
+1415;AL;CANADIAN SYLLABICS WEST-CREE WOO
+1416;AL;CANADIAN SYLLABICS NASKAPI WOO
+1417;AL;CANADIAN SYLLABICS WA
+1418;AL;CANADIAN SYLLABICS WEST-CREE WA
+1419;AL;CANADIAN SYLLABICS WAA
+141A;AL;CANADIAN SYLLABICS WEST-CREE WAA
+141B;AL;CANADIAN SYLLABICS NASKAPI WAA
+141C;AL;CANADIAN SYLLABICS AI
+141D;AL;CANADIAN SYLLABICS Y-CREE W
+141E;AL;CANADIAN SYLLABICS GLOTTAL STOP
+141F;AL;CANADIAN SYLLABICS FINAL ACUTE
+1420;AL;CANADIAN SYLLABICS FINAL GRAVE
+1421;AL;CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422;AL;CANADIAN SYLLABICS FINAL TOP HALF RING
+1423;AL;CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424;AL;CANADIAN SYLLABICS FINAL RING
+1425;AL;CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426;AL;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427;AL;CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428;AL;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429;AL;CANADIAN SYLLABICS FINAL PLUS
+142A;AL;CANADIAN SYLLABICS FINAL DOWN TACK
+142B;AL;CANADIAN SYLLABICS EN
+142C;AL;CANADIAN SYLLABICS IN
+142D;AL;CANADIAN SYLLABICS ON
+142E;AL;CANADIAN SYLLABICS AN
+142F;AL;CANADIAN SYLLABICS PE
+1430;AL;CANADIAN SYLLABICS PAAI
+1431;AL;CANADIAN SYLLABICS PI
+1432;AL;CANADIAN SYLLABICS PII
+1433;AL;CANADIAN SYLLABICS PO
+1434;AL;CANADIAN SYLLABICS POO
+1435;AL;CANADIAN SYLLABICS Y-CREE POO
+1436;AL;CANADIAN SYLLABICS CARRIER HEE
+1437;AL;CANADIAN SYLLABICS CARRIER HI
+1438;AL;CANADIAN SYLLABICS PA
+1439;AL;CANADIAN SYLLABICS PAA
+143A;AL;CANADIAN SYLLABICS PWE
+143B;AL;CANADIAN SYLLABICS WEST-CREE PWE
+143C;AL;CANADIAN SYLLABICS PWI
+143D;AL;CANADIAN SYLLABICS WEST-CREE PWI
+143E;AL;CANADIAN SYLLABICS PWII
+143F;AL;CANADIAN SYLLABICS WEST-CREE PWII
+1440;AL;CANADIAN SYLLABICS PWO
+1441;AL;CANADIAN SYLLABICS WEST-CREE PWO
+1442;AL;CANADIAN SYLLABICS PWOO
+1443;AL;CANADIAN SYLLABICS WEST-CREE PWOO
+1444;AL;CANADIAN SYLLABICS PWA
+1445;AL;CANADIAN SYLLABICS WEST-CREE PWA
+1446;AL;CANADIAN SYLLABICS PWAA
+1447;AL;CANADIAN SYLLABICS WEST-CREE PWAA
+1448;AL;CANADIAN SYLLABICS Y-CREE PWAA
+1449;AL;CANADIAN SYLLABICS P
+144A;AL;CANADIAN SYLLABICS WEST-CREE P
+144B;AL;CANADIAN SYLLABICS CARRIER H
+144C;AL;CANADIAN SYLLABICS TE
+144D;AL;CANADIAN SYLLABICS TAAI
+144E;AL;CANADIAN SYLLABICS TI
+144F;AL;CANADIAN SYLLABICS TII
+1450;AL;CANADIAN SYLLABICS TO
+1451;AL;CANADIAN SYLLABICS TOO
+1452;AL;CANADIAN SYLLABICS Y-CREE TOO
+1453;AL;CANADIAN SYLLABICS CARRIER DEE
+1454;AL;CANADIAN SYLLABICS CARRIER DI
+1455;AL;CANADIAN SYLLABICS TA
+1456;AL;CANADIAN SYLLABICS TAA
+1457;AL;CANADIAN SYLLABICS TWE
+1458;AL;CANADIAN SYLLABICS WEST-CREE TWE
+1459;AL;CANADIAN SYLLABICS TWI
+145A;AL;CANADIAN SYLLABICS WEST-CREE TWI
+145B;AL;CANADIAN SYLLABICS TWII
+145C;AL;CANADIAN SYLLABICS WEST-CREE TWII
+145D;AL;CANADIAN SYLLABICS TWO
+145E;AL;CANADIAN SYLLABICS WEST-CREE TWO
+145F;AL;CANADIAN SYLLABICS TWOO
+1460;AL;CANADIAN SYLLABICS WEST-CREE TWOO
+1461;AL;CANADIAN SYLLABICS TWA
+1462;AL;CANADIAN SYLLABICS WEST-CREE TWA
+1463;AL;CANADIAN SYLLABICS TWAA
+1464;AL;CANADIAN SYLLABICS WEST-CREE TWAA
+1465;AL;CANADIAN SYLLABICS NASKAPI TWAA
+1466;AL;CANADIAN SYLLABICS T
+1467;AL;CANADIAN SYLLABICS TTE
+1468;AL;CANADIAN SYLLABICS TTI
+1469;AL;CANADIAN SYLLABICS TTO
+146A;AL;CANADIAN SYLLABICS TTA
+146B;AL;CANADIAN SYLLABICS KE
+146C;AL;CANADIAN SYLLABICS KAAI
+146D;AL;CANADIAN SYLLABICS KI
+146E;AL;CANADIAN SYLLABICS KII
+146F;AL;CANADIAN SYLLABICS KO
+1470;AL;CANADIAN SYLLABICS KOO
+1471;AL;CANADIAN SYLLABICS Y-CREE KOO
+1472;AL;CANADIAN SYLLABICS KA
+1473;AL;CANADIAN SYLLABICS KAA
+1474;AL;CANADIAN SYLLABICS KWE
+1475;AL;CANADIAN SYLLABICS WEST-CREE KWE
+1476;AL;CANADIAN SYLLABICS KWI
+1477;AL;CANADIAN SYLLABICS WEST-CREE KWI
+1478;AL;CANADIAN SYLLABICS KWII
+1479;AL;CANADIAN SYLLABICS WEST-CREE KWII
+147A;AL;CANADIAN SYLLABICS KWO
+147B;AL;CANADIAN SYLLABICS WEST-CREE KWO
+147C;AL;CANADIAN SYLLABICS KWOO
+147D;AL;CANADIAN SYLLABICS WEST-CREE KWOO
+147E;AL;CANADIAN SYLLABICS KWA
+147F;AL;CANADIAN SYLLABICS WEST-CREE KWA
+1480;AL;CANADIAN SYLLABICS KWAA
+1481;AL;CANADIAN SYLLABICS WEST-CREE KWAA
+1482;AL;CANADIAN SYLLABICS NASKAPI KWAA
+1483;AL;CANADIAN SYLLABICS K
+1484;AL;CANADIAN SYLLABICS KW
+1485;AL;CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486;AL;CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487;AL;CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488;AL;CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489;AL;CANADIAN SYLLABICS CE
+148A;AL;CANADIAN SYLLABICS CAAI
+148B;AL;CANADIAN SYLLABICS CI
+148C;AL;CANADIAN SYLLABICS CII
+148D;AL;CANADIAN SYLLABICS CO
+148E;AL;CANADIAN SYLLABICS COO
+148F;AL;CANADIAN SYLLABICS Y-CREE COO
+1490;AL;CANADIAN SYLLABICS CA
+1491;AL;CANADIAN SYLLABICS CAA
+1492;AL;CANADIAN SYLLABICS CWE
+1493;AL;CANADIAN SYLLABICS WEST-CREE CWE
+1494;AL;CANADIAN SYLLABICS CWI
+1495;AL;CANADIAN SYLLABICS WEST-CREE CWI
+1496;AL;CANADIAN SYLLABICS CWII
+1497;AL;CANADIAN SYLLABICS WEST-CREE CWII
+1498;AL;CANADIAN SYLLABICS CWO
+1499;AL;CANADIAN SYLLABICS WEST-CREE CWO
+149A;AL;CANADIAN SYLLABICS CWOO
+149B;AL;CANADIAN SYLLABICS WEST-CREE CWOO
+149C;AL;CANADIAN SYLLABICS CWA
+149D;AL;CANADIAN SYLLABICS WEST-CREE CWA
+149E;AL;CANADIAN SYLLABICS CWAA
+149F;AL;CANADIAN SYLLABICS WEST-CREE CWAA
+14A0;AL;CANADIAN SYLLABICS NASKAPI CWAA
+14A1;AL;CANADIAN SYLLABICS C
+14A2;AL;CANADIAN SYLLABICS SAYISI TH
+14A3;AL;CANADIAN SYLLABICS ME
+14A4;AL;CANADIAN SYLLABICS MAAI
+14A5;AL;CANADIAN SYLLABICS MI
+14A6;AL;CANADIAN SYLLABICS MII
+14A7;AL;CANADIAN SYLLABICS MO
+14A8;AL;CANADIAN SYLLABICS MOO
+14A9;AL;CANADIAN SYLLABICS Y-CREE MOO
+14AA;AL;CANADIAN SYLLABICS MA
+14AB;AL;CANADIAN SYLLABICS MAA
+14AC;AL;CANADIAN SYLLABICS MWE
+14AD;AL;CANADIAN SYLLABICS WEST-CREE MWE
+14AE;AL;CANADIAN SYLLABICS MWI
+14AF;AL;CANADIAN SYLLABICS WEST-CREE MWI
+14B0;AL;CANADIAN SYLLABICS MWII
+14B1;AL;CANADIAN SYLLABICS WEST-CREE MWII
+14B2;AL;CANADIAN SYLLABICS MWO
+14B3;AL;CANADIAN SYLLABICS WEST-CREE MWO
+14B4;AL;CANADIAN SYLLABICS MWOO
+14B5;AL;CANADIAN SYLLABICS WEST-CREE MWOO
+14B6;AL;CANADIAN SYLLABICS MWA
+14B7;AL;CANADIAN SYLLABICS WEST-CREE MWA
+14B8;AL;CANADIAN SYLLABICS MWAA
+14B9;AL;CANADIAN SYLLABICS WEST-CREE MWAA
+14BA;AL;CANADIAN SYLLABICS NASKAPI MWAA
+14BB;AL;CANADIAN SYLLABICS M
+14BC;AL;CANADIAN SYLLABICS WEST-CREE M
+14BD;AL;CANADIAN SYLLABICS MH
+14BE;AL;CANADIAN SYLLABICS ATHAPASCAN M
+14BF;AL;CANADIAN SYLLABICS SAYISI M
+14C0;AL;CANADIAN SYLLABICS NE
+14C1;AL;CANADIAN SYLLABICS NAAI
+14C2;AL;CANADIAN SYLLABICS NI
+14C3;AL;CANADIAN SYLLABICS NII
+14C4;AL;CANADIAN SYLLABICS NO
+14C5;AL;CANADIAN SYLLABICS NOO
+14C6;AL;CANADIAN SYLLABICS Y-CREE NOO
+14C7;AL;CANADIAN SYLLABICS NA
+14C8;AL;CANADIAN SYLLABICS NAA
+14C9;AL;CANADIAN SYLLABICS NWE
+14CA;AL;CANADIAN SYLLABICS WEST-CREE NWE
+14CB;AL;CANADIAN SYLLABICS NWA
+14CC;AL;CANADIAN SYLLABICS WEST-CREE NWA
+14CD;AL;CANADIAN SYLLABICS NWAA
+14CE;AL;CANADIAN SYLLABICS WEST-CREE NWAA
+14CF;AL;CANADIAN SYLLABICS NASKAPI NWAA
+14D0;AL;CANADIAN SYLLABICS N
+14D1;AL;CANADIAN SYLLABICS CARRIER NG
+14D2;AL;CANADIAN SYLLABICS NH
+14D3;AL;CANADIAN SYLLABICS LE
+14D4;AL;CANADIAN SYLLABICS LAAI
+14D5;AL;CANADIAN SYLLABICS LI
+14D6;AL;CANADIAN SYLLABICS LII
+14D7;AL;CANADIAN SYLLABICS LO
+14D8;AL;CANADIAN SYLLABICS LOO
+14D9;AL;CANADIAN SYLLABICS Y-CREE LOO
+14DA;AL;CANADIAN SYLLABICS LA
+14DB;AL;CANADIAN SYLLABICS LAA
+14DC;AL;CANADIAN SYLLABICS LWE
+14DD;AL;CANADIAN SYLLABICS WEST-CREE LWE
+14DE;AL;CANADIAN SYLLABICS LWI
+14DF;AL;CANADIAN SYLLABICS WEST-CREE LWI
+14E0;AL;CANADIAN SYLLABICS LWII
+14E1;AL;CANADIAN SYLLABICS WEST-CREE LWII
+14E2;AL;CANADIAN SYLLABICS LWO
+14E3;AL;CANADIAN SYLLABICS WEST-CREE LWO
+14E4;AL;CANADIAN SYLLABICS LWOO
+14E5;AL;CANADIAN SYLLABICS WEST-CREE LWOO
+14E6;AL;CANADIAN SYLLABICS LWA
+14E7;AL;CANADIAN SYLLABICS WEST-CREE LWA
+14E8;AL;CANADIAN SYLLABICS LWAA
+14E9;AL;CANADIAN SYLLABICS WEST-CREE LWAA
+14EA;AL;CANADIAN SYLLABICS L
+14EB;AL;CANADIAN SYLLABICS WEST-CREE L
+14EC;AL;CANADIAN SYLLABICS MEDIAL L
+14ED;AL;CANADIAN SYLLABICS SE
+14EE;AL;CANADIAN SYLLABICS SAAI
+14EF;AL;CANADIAN SYLLABICS SI
+14F0;AL;CANADIAN SYLLABICS SII
+14F1;AL;CANADIAN SYLLABICS SO
+14F2;AL;CANADIAN SYLLABICS SOO
+14F3;AL;CANADIAN SYLLABICS Y-CREE SOO
+14F4;AL;CANADIAN SYLLABICS SA
+14F5;AL;CANADIAN SYLLABICS SAA
+14F6;AL;CANADIAN SYLLABICS SWE
+14F7;AL;CANADIAN SYLLABICS WEST-CREE SWE
+14F8;AL;CANADIAN SYLLABICS SWI
+14F9;AL;CANADIAN SYLLABICS WEST-CREE SWI
+14FA;AL;CANADIAN SYLLABICS SWII
+14FB;AL;CANADIAN SYLLABICS WEST-CREE SWII
+14FC;AL;CANADIAN SYLLABICS SWO
+14FD;AL;CANADIAN SYLLABICS WEST-CREE SWO
+14FE;AL;CANADIAN SYLLABICS SWOO
+14FF;AL;CANADIAN SYLLABICS WEST-CREE SWOO
+1500;AL;CANADIAN SYLLABICS SWA
+1501;AL;CANADIAN SYLLABICS WEST-CREE SWA
+1502;AL;CANADIAN SYLLABICS SWAA
+1503;AL;CANADIAN SYLLABICS WEST-CREE SWAA
+1504;AL;CANADIAN SYLLABICS NASKAPI SWAA
+1505;AL;CANADIAN SYLLABICS S
+1506;AL;CANADIAN SYLLABICS ATHAPASCAN S
+1507;AL;CANADIAN SYLLABICS SW
+1508;AL;CANADIAN SYLLABICS BLACKFOOT S
+1509;AL;CANADIAN SYLLABICS MOOSE-CREE SK
+150A;AL;CANADIAN SYLLABICS NASKAPI SKW
+150B;AL;CANADIAN SYLLABICS NASKAPI S-W
+150C;AL;CANADIAN SYLLABICS NASKAPI SPWA
+150D;AL;CANADIAN SYLLABICS NASKAPI STWA
+150E;AL;CANADIAN SYLLABICS NASKAPI SKWA
+150F;AL;CANADIAN SYLLABICS NASKAPI SCWA
+1510;AL;CANADIAN SYLLABICS SHE
+1511;AL;CANADIAN SYLLABICS SHI
+1512;AL;CANADIAN SYLLABICS SHII
+1513;AL;CANADIAN SYLLABICS SHO
+1514;AL;CANADIAN SYLLABICS SHOO
+1515;AL;CANADIAN SYLLABICS SHA
+1516;AL;CANADIAN SYLLABICS SHAA
+1517;AL;CANADIAN SYLLABICS SHWE
+1518;AL;CANADIAN SYLLABICS WEST-CREE SHWE
+1519;AL;CANADIAN SYLLABICS SHWI
+151A;AL;CANADIAN SYLLABICS WEST-CREE SHWI
+151B;AL;CANADIAN SYLLABICS SHWII
+151C;AL;CANADIAN SYLLABICS WEST-CREE SHWII
+151D;AL;CANADIAN SYLLABICS SHWO
+151E;AL;CANADIAN SYLLABICS WEST-CREE SHWO
+151F;AL;CANADIAN SYLLABICS SHWOO
+1520;AL;CANADIAN SYLLABICS WEST-CREE SHWOO
+1521;AL;CANADIAN SYLLABICS SHWA
+1522;AL;CANADIAN SYLLABICS WEST-CREE SHWA
+1523;AL;CANADIAN SYLLABICS SHWAA
+1524;AL;CANADIAN SYLLABICS WEST-CREE SHWAA
+1525;AL;CANADIAN SYLLABICS SH
+1526;AL;CANADIAN SYLLABICS YE
+1527;AL;CANADIAN SYLLABICS YAAI
+1528;AL;CANADIAN SYLLABICS YI
+1529;AL;CANADIAN SYLLABICS YII
+152A;AL;CANADIAN SYLLABICS YO
+152B;AL;CANADIAN SYLLABICS YOO
+152C;AL;CANADIAN SYLLABICS Y-CREE YOO
+152D;AL;CANADIAN SYLLABICS YA
+152E;AL;CANADIAN SYLLABICS YAA
+152F;AL;CANADIAN SYLLABICS YWE
+1530;AL;CANADIAN SYLLABICS WEST-CREE YWE
+1531;AL;CANADIAN SYLLABICS YWI
+1532;AL;CANADIAN SYLLABICS WEST-CREE YWI
+1533;AL;CANADIAN SYLLABICS YWII
+1534;AL;CANADIAN SYLLABICS WEST-CREE YWII
+1535;AL;CANADIAN SYLLABICS YWO
+1536;AL;CANADIAN SYLLABICS WEST-CREE YWO
+1537;AL;CANADIAN SYLLABICS YWOO
+1538;AL;CANADIAN SYLLABICS WEST-CREE YWOO
+1539;AL;CANADIAN SYLLABICS YWA
+153A;AL;CANADIAN SYLLABICS WEST-CREE YWA
+153B;AL;CANADIAN SYLLABICS YWAA
+153C;AL;CANADIAN SYLLABICS WEST-CREE YWAA
+153D;AL;CANADIAN SYLLABICS NASKAPI YWAA
+153E;AL;CANADIAN SYLLABICS Y
+153F;AL;CANADIAN SYLLABICS BIBLE-CREE Y
+1540;AL;CANADIAN SYLLABICS WEST-CREE Y
+1541;AL;CANADIAN SYLLABICS SAYISI YI
+1542;AL;CANADIAN SYLLABICS RE
+1543;AL;CANADIAN SYLLABICS R-CREE RE
+1544;AL;CANADIAN SYLLABICS WEST-CREE LE
+1545;AL;CANADIAN SYLLABICS RAAI
+1546;AL;CANADIAN SYLLABICS RI
+1547;AL;CANADIAN SYLLABICS RII
+1548;AL;CANADIAN SYLLABICS RO
+1549;AL;CANADIAN SYLLABICS ROO
+154A;AL;CANADIAN SYLLABICS WEST-CREE LO
+154B;AL;CANADIAN SYLLABICS RA
+154C;AL;CANADIAN SYLLABICS RAA
+154D;AL;CANADIAN SYLLABICS WEST-CREE LA
+154E;AL;CANADIAN SYLLABICS RWAA
+154F;AL;CANADIAN SYLLABICS WEST-CREE RWAA
+1550;AL;CANADIAN SYLLABICS R
+1551;AL;CANADIAN SYLLABICS WEST-CREE R
+1552;AL;CANADIAN SYLLABICS MEDIAL R
+1553;AL;CANADIAN SYLLABICS FE
+1554;AL;CANADIAN SYLLABICS FAAI
+1555;AL;CANADIAN SYLLABICS FI
+1556;AL;CANADIAN SYLLABICS FII
+1557;AL;CANADIAN SYLLABICS FO
+1558;AL;CANADIAN SYLLABICS FOO
+1559;AL;CANADIAN SYLLABICS FA
+155A;AL;CANADIAN SYLLABICS FAA
+155B;AL;CANADIAN SYLLABICS FWAA
+155C;AL;CANADIAN SYLLABICS WEST-CREE FWAA
+155D;AL;CANADIAN SYLLABICS F
+155E;AL;CANADIAN SYLLABICS THE
+155F;AL;CANADIAN SYLLABICS N-CREE THE
+1560;AL;CANADIAN SYLLABICS THI
+1561;AL;CANADIAN SYLLABICS N-CREE THI
+1562;AL;CANADIAN SYLLABICS THII
+1563;AL;CANADIAN SYLLABICS N-CREE THII
+1564;AL;CANADIAN SYLLABICS THO
+1565;AL;CANADIAN SYLLABICS THOO
+1566;AL;CANADIAN SYLLABICS THA
+1567;AL;CANADIAN SYLLABICS THAA
+1568;AL;CANADIAN SYLLABICS THWAA
+1569;AL;CANADIAN SYLLABICS WEST-CREE THWAA
+156A;AL;CANADIAN SYLLABICS TH
+156B;AL;CANADIAN SYLLABICS TTHE
+156C;AL;CANADIAN SYLLABICS TTHI
+156D;AL;CANADIAN SYLLABICS TTHO
+156E;AL;CANADIAN SYLLABICS TTHA
+156F;AL;CANADIAN SYLLABICS TTH
+1570;AL;CANADIAN SYLLABICS TYE
+1571;AL;CANADIAN SYLLABICS TYI
+1572;AL;CANADIAN SYLLABICS TYO
+1573;AL;CANADIAN SYLLABICS TYA
+1574;AL;CANADIAN SYLLABICS NUNAVIK HE
+1575;AL;CANADIAN SYLLABICS NUNAVIK HI
+1576;AL;CANADIAN SYLLABICS NUNAVIK HII
+1577;AL;CANADIAN SYLLABICS NUNAVIK HO
+1578;AL;CANADIAN SYLLABICS NUNAVIK HOO
+1579;AL;CANADIAN SYLLABICS NUNAVIK HA
+157A;AL;CANADIAN SYLLABICS NUNAVIK HAA
+157B;AL;CANADIAN SYLLABICS NUNAVIK H
+157C;AL;CANADIAN SYLLABICS NUNAVUT H
+157D;AL;CANADIAN SYLLABICS HK
+157E;AL;CANADIAN SYLLABICS QAAI
+157F;AL;CANADIAN SYLLABICS QI
+1580;AL;CANADIAN SYLLABICS QII
+1581;AL;CANADIAN SYLLABICS QO
+1582;AL;CANADIAN SYLLABICS QOO
+1583;AL;CANADIAN SYLLABICS QA
+1584;AL;CANADIAN SYLLABICS QAA
+1585;AL;CANADIAN SYLLABICS Q
+1586;AL;CANADIAN SYLLABICS TLHE
+1587;AL;CANADIAN SYLLABICS TLHI
+1588;AL;CANADIAN SYLLABICS TLHO
+1589;AL;CANADIAN SYLLABICS TLHA
+158A;AL;CANADIAN SYLLABICS WEST-CREE RE
+158B;AL;CANADIAN SYLLABICS WEST-CREE RI
+158C;AL;CANADIAN SYLLABICS WEST-CREE RO
+158D;AL;CANADIAN SYLLABICS WEST-CREE RA
+158E;AL;CANADIAN SYLLABICS NGAAI
+158F;AL;CANADIAN SYLLABICS NGI
+1590;AL;CANADIAN SYLLABICS NGII
+1591;AL;CANADIAN SYLLABICS NGO
+1592;AL;CANADIAN SYLLABICS NGOO
+1593;AL;CANADIAN SYLLABICS NGA
+1594;AL;CANADIAN SYLLABICS NGAA
+1595;AL;CANADIAN SYLLABICS NG
+1596;AL;CANADIAN SYLLABICS NNG
+1597;AL;CANADIAN SYLLABICS SAYISI SHE
+1598;AL;CANADIAN SYLLABICS SAYISI SHI
+1599;AL;CANADIAN SYLLABICS SAYISI SHO
+159A;AL;CANADIAN SYLLABICS SAYISI SHA
+159B;AL;CANADIAN SYLLABICS WOODS-CREE THE
+159C;AL;CANADIAN SYLLABICS WOODS-CREE THI
+159D;AL;CANADIAN SYLLABICS WOODS-CREE THO
+159E;AL;CANADIAN SYLLABICS WOODS-CREE THA
+159F;AL;CANADIAN SYLLABICS WOODS-CREE TH
+15A0;AL;CANADIAN SYLLABICS LHI
+15A1;AL;CANADIAN SYLLABICS LHII
+15A2;AL;CANADIAN SYLLABICS LHO
+15A3;AL;CANADIAN SYLLABICS LHOO
+15A4;AL;CANADIAN SYLLABICS LHA
+15A5;AL;CANADIAN SYLLABICS LHAA
+15A6;AL;CANADIAN SYLLABICS LH
+15A7;AL;CANADIAN SYLLABICS TH-CREE THE
+15A8;AL;CANADIAN SYLLABICS TH-CREE THI
+15A9;AL;CANADIAN SYLLABICS TH-CREE THII
+15AA;AL;CANADIAN SYLLABICS TH-CREE THO
+15AB;AL;CANADIAN SYLLABICS TH-CREE THOO
+15AC;AL;CANADIAN SYLLABICS TH-CREE THA
+15AD;AL;CANADIAN SYLLABICS TH-CREE THAA
+15AE;AL;CANADIAN SYLLABICS TH-CREE TH
+15AF;AL;CANADIAN SYLLABICS AIVILIK B
+15B0;AL;CANADIAN SYLLABICS BLACKFOOT E
+15B1;AL;CANADIAN SYLLABICS BLACKFOOT I
+15B2;AL;CANADIAN SYLLABICS BLACKFOOT O
+15B3;AL;CANADIAN SYLLABICS BLACKFOOT A
+15B4;AL;CANADIAN SYLLABICS BLACKFOOT WE
+15B5;AL;CANADIAN SYLLABICS BLACKFOOT WI
+15B6;AL;CANADIAN SYLLABICS BLACKFOOT WO
+15B7;AL;CANADIAN SYLLABICS BLACKFOOT WA
+15B8;AL;CANADIAN SYLLABICS BLACKFOOT NE
+15B9;AL;CANADIAN SYLLABICS BLACKFOOT NI
+15BA;AL;CANADIAN SYLLABICS BLACKFOOT NO
+15BB;AL;CANADIAN SYLLABICS BLACKFOOT NA
+15BC;AL;CANADIAN SYLLABICS BLACKFOOT KE
+15BD;AL;CANADIAN SYLLABICS BLACKFOOT KI
+15BE;AL;CANADIAN SYLLABICS BLACKFOOT KO
+15BF;AL;CANADIAN SYLLABICS BLACKFOOT KA
+15C0;AL;CANADIAN SYLLABICS SAYISI HE
+15C1;AL;CANADIAN SYLLABICS SAYISI HI
+15C2;AL;CANADIAN SYLLABICS SAYISI HO
+15C3;AL;CANADIAN SYLLABICS SAYISI HA
+15C4;AL;CANADIAN SYLLABICS CARRIER GHU
+15C5;AL;CANADIAN SYLLABICS CARRIER GHO
+15C6;AL;CANADIAN SYLLABICS CARRIER GHE
+15C7;AL;CANADIAN SYLLABICS CARRIER GHEE
+15C8;AL;CANADIAN SYLLABICS CARRIER GHI
+15C9;AL;CANADIAN SYLLABICS CARRIER GHA
+15CA;AL;CANADIAN SYLLABICS CARRIER RU
+15CB;AL;CANADIAN SYLLABICS CARRIER RO
+15CC;AL;CANADIAN SYLLABICS CARRIER RE
+15CD;AL;CANADIAN SYLLABICS CARRIER REE
+15CE;AL;CANADIAN SYLLABICS CARRIER RI
+15CF;AL;CANADIAN SYLLABICS CARRIER RA
+15D0;AL;CANADIAN SYLLABICS CARRIER WU
+15D1;AL;CANADIAN SYLLABICS CARRIER WO
+15D2;AL;CANADIAN SYLLABICS CARRIER WE
+15D3;AL;CANADIAN SYLLABICS CARRIER WEE
+15D4;AL;CANADIAN SYLLABICS CARRIER WI
+15D5;AL;CANADIAN SYLLABICS CARRIER WA
+15D6;AL;CANADIAN SYLLABICS CARRIER HWU
+15D7;AL;CANADIAN SYLLABICS CARRIER HWO
+15D8;AL;CANADIAN SYLLABICS CARRIER HWE
+15D9;AL;CANADIAN SYLLABICS CARRIER HWEE
+15DA;AL;CANADIAN SYLLABICS CARRIER HWI
+15DB;AL;CANADIAN SYLLABICS CARRIER HWA
+15DC;AL;CANADIAN SYLLABICS CARRIER THU
+15DD;AL;CANADIAN SYLLABICS CARRIER THO
+15DE;AL;CANADIAN SYLLABICS CARRIER THE
+15DF;AL;CANADIAN SYLLABICS CARRIER THEE
+15E0;AL;CANADIAN SYLLABICS CARRIER THI
+15E1;AL;CANADIAN SYLLABICS CARRIER THA
+15E2;AL;CANADIAN SYLLABICS CARRIER TTU
+15E3;AL;CANADIAN SYLLABICS CARRIER TTO
+15E4;AL;CANADIAN SYLLABICS CARRIER TTE
+15E5;AL;CANADIAN SYLLABICS CARRIER TTEE
+15E6;AL;CANADIAN SYLLABICS CARRIER TTI
+15E7;AL;CANADIAN SYLLABICS CARRIER TTA
+15E8;AL;CANADIAN SYLLABICS CARRIER PU
+15E9;AL;CANADIAN SYLLABICS CARRIER PO
+15EA;AL;CANADIAN SYLLABICS CARRIER PE
+15EB;AL;CANADIAN SYLLABICS CARRIER PEE
+15EC;AL;CANADIAN SYLLABICS CARRIER PI
+15ED;AL;CANADIAN SYLLABICS CARRIER PA
+15EE;AL;CANADIAN SYLLABICS CARRIER P
+15EF;AL;CANADIAN SYLLABICS CARRIER GU
+15F0;AL;CANADIAN SYLLABICS CARRIER GO
+15F1;AL;CANADIAN SYLLABICS CARRIER GE
+15F2;AL;CANADIAN SYLLABICS CARRIER GEE
+15F3;AL;CANADIAN SYLLABICS CARRIER GI
+15F4;AL;CANADIAN SYLLABICS CARRIER GA
+15F5;AL;CANADIAN SYLLABICS CARRIER KHU
+15F6;AL;CANADIAN SYLLABICS CARRIER KHO
+15F7;AL;CANADIAN SYLLABICS CARRIER KHE
+15F8;AL;CANADIAN SYLLABICS CARRIER KHEE
+15F9;AL;CANADIAN SYLLABICS CARRIER KHI
+15FA;AL;CANADIAN SYLLABICS CARRIER KHA
+15FB;AL;CANADIAN SYLLABICS CARRIER KKU
+15FC;AL;CANADIAN SYLLABICS CARRIER KKO
+15FD;AL;CANADIAN SYLLABICS CARRIER KKE
+15FE;AL;CANADIAN SYLLABICS CARRIER KKEE
+15FF;AL;CANADIAN SYLLABICS CARRIER KKI
+1600;AL;CANADIAN SYLLABICS CARRIER KKA
+1601;AL;CANADIAN SYLLABICS CARRIER KK
+1602;AL;CANADIAN SYLLABICS CARRIER NU
+1603;AL;CANADIAN SYLLABICS CARRIER NO
+1604;AL;CANADIAN SYLLABICS CARRIER NE
+1605;AL;CANADIAN SYLLABICS CARRIER NEE
+1606;AL;CANADIAN SYLLABICS CARRIER NI
+1607;AL;CANADIAN SYLLABICS CARRIER NA
+1608;AL;CANADIAN SYLLABICS CARRIER MU
+1609;AL;CANADIAN SYLLABICS CARRIER MO
+160A;AL;CANADIAN SYLLABICS CARRIER ME
+160B;AL;CANADIAN SYLLABICS CARRIER MEE
+160C;AL;CANADIAN SYLLABICS CARRIER MI
+160D;AL;CANADIAN SYLLABICS CARRIER MA
+160E;AL;CANADIAN SYLLABICS CARRIER YU
+160F;AL;CANADIAN SYLLABICS CARRIER YO
+1610;AL;CANADIAN SYLLABICS CARRIER YE
+1611;AL;CANADIAN SYLLABICS CARRIER YEE
+1612;AL;CANADIAN SYLLABICS CARRIER YI
+1613;AL;CANADIAN SYLLABICS CARRIER YA
+1614;AL;CANADIAN SYLLABICS CARRIER JU
+1615;AL;CANADIAN SYLLABICS SAYISI JU
+1616;AL;CANADIAN SYLLABICS CARRIER JO
+1617;AL;CANADIAN SYLLABICS CARRIER JE
+1618;AL;CANADIAN SYLLABICS CARRIER JEE
+1619;AL;CANADIAN SYLLABICS CARRIER JI
+161A;AL;CANADIAN SYLLABICS SAYISI JI
+161B;AL;CANADIAN SYLLABICS CARRIER JA
+161C;AL;CANADIAN SYLLABICS CARRIER JJU
+161D;AL;CANADIAN SYLLABICS CARRIER JJO
+161E;AL;CANADIAN SYLLABICS CARRIER JJE
+161F;AL;CANADIAN SYLLABICS CARRIER JJEE
+1620;AL;CANADIAN SYLLABICS CARRIER JJI
+1621;AL;CANADIAN SYLLABICS CARRIER JJA
+1622;AL;CANADIAN SYLLABICS CARRIER LU
+1623;AL;CANADIAN SYLLABICS CARRIER LO
+1624;AL;CANADIAN SYLLABICS CARRIER LE
+1625;AL;CANADIAN SYLLABICS CARRIER LEE
+1626;AL;CANADIAN SYLLABICS CARRIER LI
+1627;AL;CANADIAN SYLLABICS CARRIER LA
+1628;AL;CANADIAN SYLLABICS CARRIER DLU
+1629;AL;CANADIAN SYLLABICS CARRIER DLO
+162A;AL;CANADIAN SYLLABICS CARRIER DLE
+162B;AL;CANADIAN SYLLABICS CARRIER DLEE
+162C;AL;CANADIAN SYLLABICS CARRIER DLI
+162D;AL;CANADIAN SYLLABICS CARRIER DLA
+162E;AL;CANADIAN SYLLABICS CARRIER LHU
+162F;AL;CANADIAN SYLLABICS CARRIER LHO
+1630;AL;CANADIAN SYLLABICS CARRIER LHE
+1631;AL;CANADIAN SYLLABICS CARRIER LHEE
+1632;AL;CANADIAN SYLLABICS CARRIER LHI
+1633;AL;CANADIAN SYLLABICS CARRIER LHA
+1634;AL;CANADIAN SYLLABICS CARRIER TLHU
+1635;AL;CANADIAN SYLLABICS CARRIER TLHO
+1636;AL;CANADIAN SYLLABICS CARRIER TLHE
+1637;AL;CANADIAN SYLLABICS CARRIER TLHEE
+1638;AL;CANADIAN SYLLABICS CARRIER TLHI
+1639;AL;CANADIAN SYLLABICS CARRIER TLHA
+163A;AL;CANADIAN SYLLABICS CARRIER TLU
+163B;AL;CANADIAN SYLLABICS CARRIER TLO
+163C;AL;CANADIAN SYLLABICS CARRIER TLE
+163D;AL;CANADIAN SYLLABICS CARRIER TLEE
+163E;AL;CANADIAN SYLLABICS CARRIER TLI
+163F;AL;CANADIAN SYLLABICS CARRIER TLA
+1640;AL;CANADIAN SYLLABICS CARRIER ZU
+1641;AL;CANADIAN SYLLABICS CARRIER ZO
+1642;AL;CANADIAN SYLLABICS CARRIER ZE
+1643;AL;CANADIAN SYLLABICS CARRIER ZEE
+1644;AL;CANADIAN SYLLABICS CARRIER ZI
+1645;AL;CANADIAN SYLLABICS CARRIER ZA
+1646;AL;CANADIAN SYLLABICS CARRIER Z
+1647;AL;CANADIAN SYLLABICS CARRIER INITIAL Z
+1648;AL;CANADIAN SYLLABICS CARRIER DZU
+1649;AL;CANADIAN SYLLABICS CARRIER DZO
+164A;AL;CANADIAN SYLLABICS CARRIER DZE
+164B;AL;CANADIAN SYLLABICS CARRIER DZEE
+164C;AL;CANADIAN SYLLABICS CARRIER DZI
+164D;AL;CANADIAN SYLLABICS CARRIER DZA
+164E;AL;CANADIAN SYLLABICS CARRIER SU
+164F;AL;CANADIAN SYLLABICS CARRIER SO
+1650;AL;CANADIAN SYLLABICS CARRIER SE
+1651;AL;CANADIAN SYLLABICS CARRIER SEE
+1652;AL;CANADIAN SYLLABICS CARRIER SI
+1653;AL;CANADIAN SYLLABICS CARRIER SA
+1654;AL;CANADIAN SYLLABICS CARRIER SHU
+1655;AL;CANADIAN SYLLABICS CARRIER SHO
+1656;AL;CANADIAN SYLLABICS CARRIER SHE
+1657;AL;CANADIAN SYLLABICS CARRIER SHEE
+1658;AL;CANADIAN SYLLABICS CARRIER SHI
+1659;AL;CANADIAN SYLLABICS CARRIER SHA
+165A;AL;CANADIAN SYLLABICS CARRIER SH
+165B;AL;CANADIAN SYLLABICS CARRIER TSU
+165C;AL;CANADIAN SYLLABICS CARRIER TSO
+165D;AL;CANADIAN SYLLABICS CARRIER TSE
+165E;AL;CANADIAN SYLLABICS CARRIER TSEE
+165F;AL;CANADIAN SYLLABICS CARRIER TSI
+1660;AL;CANADIAN SYLLABICS CARRIER TSA
+1661;AL;CANADIAN SYLLABICS CARRIER CHU
+1662;AL;CANADIAN SYLLABICS CARRIER CHO
+1663;AL;CANADIAN SYLLABICS CARRIER CHE
+1664;AL;CANADIAN SYLLABICS CARRIER CHEE
+1665;AL;CANADIAN SYLLABICS CARRIER CHI
+1666;AL;CANADIAN SYLLABICS CARRIER CHA
+1667;AL;CANADIAN SYLLABICS CARRIER TTSU
+1668;AL;CANADIAN SYLLABICS CARRIER TTSO
+1669;AL;CANADIAN SYLLABICS CARRIER TTSE
+166A;AL;CANADIAN SYLLABICS CARRIER TTSEE
+166B;AL;CANADIAN SYLLABICS CARRIER TTSI
+166C;AL;CANADIAN SYLLABICS CARRIER TTSA
+166D;AL;CANADIAN SYLLABICS CHI SIGN
+166E;AL;CANADIAN SYLLABICS FULL STOP
+166F;AL;CANADIAN SYLLABICS QAI
+1670;AL;CANADIAN SYLLABICS NGAI
+1671;AL;CANADIAN SYLLABICS NNGI
+1672;AL;CANADIAN SYLLABICS NNGII
+1673;AL;CANADIAN SYLLABICS NNGO
+1674;AL;CANADIAN SYLLABICS NNGOO
+1675;AL;CANADIAN SYLLABICS NNGA
+1676;AL;CANADIAN SYLLABICS NNGAA
+1680;BA;OGHAM SPACE MARK
+1681;AL;OGHAM LETTER BEITH
+1682;AL;OGHAM LETTER LUIS
+1683;AL;OGHAM LETTER FEARN
+1684;AL;OGHAM LETTER SAIL
+1685;AL;OGHAM LETTER NION
+1686;AL;OGHAM LETTER UATH
+1687;AL;OGHAM LETTER DAIR
+1688;AL;OGHAM LETTER TINNE
+1689;AL;OGHAM LETTER COLL
+168A;AL;OGHAM LETTER CEIRT
+168B;AL;OGHAM LETTER MUIN
+168C;AL;OGHAM LETTER GORT
+168D;AL;OGHAM LETTER NGEADAL
+168E;AL;OGHAM LETTER STRAIF
+168F;AL;OGHAM LETTER RUIS
+1690;AL;OGHAM LETTER AILM
+1691;AL;OGHAM LETTER ONN
+1692;AL;OGHAM LETTER UR
+1693;AL;OGHAM LETTER EADHADH
+1694;AL;OGHAM LETTER IODHADH
+1695;AL;OGHAM LETTER EABHADH
+1696;AL;OGHAM LETTER OR
+1697;AL;OGHAM LETTER UILLEANN
+1698;AL;OGHAM LETTER IFIN
+1699;AL;OGHAM LETTER EAMHANCHOLL
+169A;AL;OGHAM LETTER PEITH
+169B;OP;OGHAM FEATHER MARK
+169C;CL;OGHAM REVERSED FEATHER MARK
+16A0;AL;RUNIC LETTER FEHU FEOH FE F
+16A1;AL;RUNIC LETTER V
+16A2;AL;RUNIC LETTER URUZ UR U
+16A3;AL;RUNIC LETTER YR
+16A4;AL;RUNIC LETTER Y
+16A5;AL;RUNIC LETTER W
+16A6;AL;RUNIC LETTER THURISAZ THURS THORN
+16A7;AL;RUNIC LETTER ETH
+16A8;AL;RUNIC LETTER ANSUZ A
+16A9;AL;RUNIC LETTER OS O
+16AA;AL;RUNIC LETTER AC A
+16AB;AL;RUNIC LETTER AESC
+16AC;AL;RUNIC LETTER LONG-BRANCH-OSS O
+16AD;AL;RUNIC LETTER SHORT-TWIG-OSS O
+16AE;AL;RUNIC LETTER O
+16AF;AL;RUNIC LETTER OE
+16B0;AL;RUNIC LETTER ON
+16B1;AL;RUNIC LETTER RAIDO RAD REID R
+16B2;AL;RUNIC LETTER KAUNA
+16B3;AL;RUNIC LETTER CEN
+16B4;AL;RUNIC LETTER KAUN K
+16B5;AL;RUNIC LETTER G
+16B6;AL;RUNIC LETTER ENG
+16B7;AL;RUNIC LETTER GEBO GYFU G
+16B8;AL;RUNIC LETTER GAR
+16B9;AL;RUNIC LETTER WUNJO WYNN W
+16BA;AL;RUNIC LETTER HAGLAZ H
+16BB;AL;RUNIC LETTER HAEGL H
+16BC;AL;RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD;AL;RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE;AL;RUNIC LETTER NAUDIZ NYD NAUD N
+16BF;AL;RUNIC LETTER SHORT-TWIG-NAUD N
+16C0;AL;RUNIC LETTER DOTTED-N
+16C1;AL;RUNIC LETTER ISAZ IS ISS I
+16C2;AL;RUNIC LETTER E
+16C3;AL;RUNIC LETTER JERAN J
+16C4;AL;RUNIC LETTER GER
+16C5;AL;RUNIC LETTER LONG-BRANCH-AR AE
+16C6;AL;RUNIC LETTER SHORT-TWIG-AR A
+16C7;AL;RUNIC LETTER IWAZ EOH
+16C8;AL;RUNIC LETTER PERTHO PEORTH P
+16C9;AL;RUNIC LETTER ALGIZ EOLHX
+16CA;AL;RUNIC LETTER SOWILO S
+16CB;AL;RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC;AL;RUNIC LETTER SHORT-TWIG-SOL S
+16CD;AL;RUNIC LETTER C
+16CE;AL;RUNIC LETTER Z
+16CF;AL;RUNIC LETTER TIWAZ TIR TYR T
+16D0;AL;RUNIC LETTER SHORT-TWIG-TYR T
+16D1;AL;RUNIC LETTER D
+16D2;AL;RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3;AL;RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4;AL;RUNIC LETTER DOTTED-P
+16D5;AL;RUNIC LETTER OPEN-P
+16D6;AL;RUNIC LETTER EHWAZ EH E
+16D7;AL;RUNIC LETTER MANNAZ MAN M
+16D8;AL;RUNIC LETTER LONG-BRANCH-MADR M
+16D9;AL;RUNIC LETTER SHORT-TWIG-MADR M
+16DA;AL;RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB;AL;RUNIC LETTER DOTTED-L
+16DC;AL;RUNIC LETTER INGWAZ
+16DD;AL;RUNIC LETTER ING
+16DE;AL;RUNIC LETTER DAGAZ DAEG D
+16DF;AL;RUNIC LETTER OTHALAN ETHEL O
+16E0;AL;RUNIC LETTER EAR
+16E1;AL;RUNIC LETTER IOR
+16E2;AL;RUNIC LETTER CWEORTH
+16E3;AL;RUNIC LETTER CALC
+16E4;AL;RUNIC LETTER CEALC
+16E5;AL;RUNIC LETTER STAN
+16E6;AL;RUNIC LETTER LONG-BRANCH-YR
+16E7;AL;RUNIC LETTER SHORT-TWIG-YR
+16E8;AL;RUNIC LETTER ICELANDIC-YR
+16E9;AL;RUNIC LETTER Q
+16EA;AL;RUNIC LETTER X
+16EB;AL;RUNIC SINGLE PUNCTUATION
+16EC;AL;RUNIC MULTIPLE PUNCTUATION
+16ED;AL;RUNIC CROSS PUNCTUATION
+16EE;AL;RUNIC ARLAUG SYMBOL
+16EF;AL;RUNIC TVIMADUR SYMBOL
+16F0;AL;RUNIC BELGTHOR SYMBOL
+1780;SA;KHMER LETTER KA
+1781;SA;KHMER LETTER KHA
+1782;SA;KHMER LETTER KO
+1783;SA;KHMER LETTER KHO
+1784;SA;KHMER LETTER NGO
+1785;SA;KHMER LETTER CA
+1786;SA;KHMER LETTER CHA
+1787;SA;KHMER LETTER CO
+1788;SA;KHMER LETTER CHO
+1789;SA;KHMER LETTER NYO
+178A;SA;KHMER LETTER DA
+178B;SA;KHMER LETTER TTHA
+178C;SA;KHMER LETTER DO
+178D;SA;KHMER LETTER TTHO
+178E;SA;KHMER LETTER NNO
+178F;SA;KHMER LETTER TA
+1790;SA;KHMER LETTER THA
+1791;SA;KHMER LETTER TO
+1792;SA;KHMER LETTER THO
+1793;SA;KHMER LETTER NO
+1794;SA;KHMER LETTER BA
+1795;SA;KHMER LETTER PHA
+1796;SA;KHMER LETTER PO
+1797;SA;KHMER LETTER PHO
+1798;SA;KHMER LETTER MO
+1799;SA;KHMER LETTER YO
+179A;SA;KHMER LETTER RO
+179B;SA;KHMER LETTER LO
+179C;SA;KHMER LETTER VO
+179D;SA;KHMER LETTER SHA
+179E;SA;KHMER LETTER SSO
+179F;SA;KHMER LETTER SA
+17A0;SA;KHMER LETTER HA
+17A1;SA;KHMER LETTER LA
+17A2;SA;KHMER LETTER QA
+17A3;SA;KHMER INDEPENDENT VOWEL QAQ
+17A4;SA;KHMER INDEPENDENT VOWEL QAA
+17A5;SA;KHMER INDEPENDENT VOWEL QI
+17A6;SA;KHMER INDEPENDENT VOWEL QII
+17A7;SA;KHMER INDEPENDENT VOWEL QU
+17A8;SA;KHMER INDEPENDENT VOWEL QUK
+17A9;SA;KHMER INDEPENDENT VOWEL QUU
+17AA;SA;KHMER INDEPENDENT VOWEL QUUV
+17AB;SA;KHMER INDEPENDENT VOWEL RY
+17AC;SA;KHMER INDEPENDENT VOWEL RYY
+17AD;SA;KHMER INDEPENDENT VOWEL LY
+17AE;SA;KHMER INDEPENDENT VOWEL LYY
+17AF;SA;KHMER INDEPENDENT VOWEL QE
+17B0;SA;KHMER INDEPENDENT VOWEL QAI
+17B1;SA;KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2;SA;KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3;SA;KHMER INDEPENDENT VOWEL QAU
+17B4;CM;KHMER VOWEL INHERENT AQ
+17B5;CM;KHMER VOWEL INHERENT AA
+17B6;CM;KHMER VOWEL SIGN AA
+17B7;CM;KHMER VOWEL SIGN I
+17B8;CM;KHMER VOWEL SIGN II
+17B9;CM;KHMER VOWEL SIGN Y
+17BA;CM;KHMER VOWEL SIGN YY
+17BB;CM;KHMER VOWEL SIGN U
+17BC;CM;KHMER VOWEL SIGN UU
+17BD;CM;KHMER VOWEL SIGN UA
+17BE;CM;KHMER VOWEL SIGN OE
+17BF;CM;KHMER VOWEL SIGN YA
+17C0;CM;KHMER VOWEL SIGN IE
+17C1;CM;KHMER VOWEL SIGN E
+17C2;CM;KHMER VOWEL SIGN AE
+17C3;CM;KHMER VOWEL SIGN AI
+17C4;CM;KHMER VOWEL SIGN OO
+17C5;CM;KHMER VOWEL SIGN AU
+17C6;CM;KHMER SIGN NIKAHIT
+17C7;CM;KHMER SIGN REAHMUK
+17C8;CM;KHMER SIGN YUUKALEAPINTU
+17C9;CM;KHMER SIGN MUUSIKATOAN
+17CA;CM;KHMER SIGN TRIISAP
+17CB;CM;KHMER SIGN BANTOC
+17CC;CM;KHMER SIGN ROBAT
+17CD;CM;KHMER SIGN TOANDAKHIAT
+17CE;CM;KHMER SIGN KAKABAT
+17CF;CM;KHMER SIGN AHSDA
+17D0;CM;KHMER SIGN SAMYOK SANNYA
+17D1;CM;KHMER SIGN VIRIAM
+17D2;CM;KHMER SIGN COENG
+17D3;CM;KHMER SIGN BATHAMASAT
+17D4;NS;KHMER SIGN KHAN
+17D5;BA;KHMER SIGN BARIYOOSAN
+17D6;NS;KHMER SIGN CAMNUC PII KUUH
+17D7;NS;KHMER SIGN LEK TOO
+17D8;NS;KHMER SIGN BEYYAL
+17D9;NS;KHMER SIGN PHNAEK MUAN
+17DA;NS;KHMER SIGN KOOMUUT
+17DB;PR;KHMER CURRENCY SYMBOL RIEL
+17DC;AL;KHMER SIGN AVAKRAHASANYA
+17E0;NU;KHMER DIGIT ZERO
+17E1;NU;KHMER DIGIT ONE
+17E2;NU;KHMER DIGIT TWO
+17E3;NU;KHMER DIGIT THREE
+17E4;NU;KHMER DIGIT FOUR
+17E5;NU;KHMER DIGIT FIVE
+17E6;NU;KHMER DIGIT SIX
+17E7;NU;KHMER DIGIT SEVEN
+17E8;NU;KHMER DIGIT EIGHT
+17E9;NU;KHMER DIGIT NINE
+1800;AL;MONGOLIAN BIRGA
+1801;AL;MONGOLIAN ELLIPSIS
+1802;AL;MONGOLIAN COMMA
+1803;AL;MONGOLIAN FULL STOP
+1804;AL;MONGOLIAN COLON
+1805;AL;MONGOLIAN FOUR DOTS
+1806;BB;MONGOLIAN TODO SOFT HYPHEN
+1807;AL;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808;AL;MONGOLIAN MANCHU COMMA
+1809;AL;MONGOLIAN MANCHU FULL STOP
+180A;AL;MONGOLIAN NIRUGU
+180B;CM;MONGOLIAN FREE VARIATION SELECTOR ONE
+180C;CM;MONGOLIAN FREE VARIATION SELECTOR TWO
+180D;CM;MONGOLIAN FREE VARIATION SELECTOR THREE
+180E;CM;MONGOLIAN VOWEL SEPARATOR
+1810;NU;MONGOLIAN DIGIT ZERO
+1811;NU;MONGOLIAN DIGIT ONE
+1812;NU;MONGOLIAN DIGIT TWO
+1813;NU;MONGOLIAN DIGIT THREE
+1814;NU;MONGOLIAN DIGIT FOUR
+1815;NU;MONGOLIAN DIGIT FIVE
+1816;NU;MONGOLIAN DIGIT SIX
+1817;NU;MONGOLIAN DIGIT SEVEN
+1818;NU;MONGOLIAN DIGIT EIGHT
+1819;NU;MONGOLIAN DIGIT NINE
+1820;AL;MONGOLIAN LETTER A
+1821;AL;MONGOLIAN LETTER E
+1822;AL;MONGOLIAN LETTER I
+1823;AL;MONGOLIAN LETTER O
+1824;AL;MONGOLIAN LETTER U
+1825;AL;MONGOLIAN LETTER OE
+1826;AL;MONGOLIAN LETTER UE
+1827;AL;MONGOLIAN LETTER EE
+1828;AL;MONGOLIAN LETTER NA
+1829;AL;MONGOLIAN LETTER ANG
+182A;AL;MONGOLIAN LETTER BA
+182B;AL;MONGOLIAN LETTER PA
+182C;AL;MONGOLIAN LETTER QA
+182D;AL;MONGOLIAN LETTER GA
+182E;AL;MONGOLIAN LETTER MA
+182F;AL;MONGOLIAN LETTER LA
+1830;AL;MONGOLIAN LETTER SA
+1831;AL;MONGOLIAN LETTER SHA
+1832;AL;MONGOLIAN LETTER TA
+1833;AL;MONGOLIAN LETTER DA
+1834;AL;MONGOLIAN LETTER CHA
+1835;AL;MONGOLIAN LETTER JA
+1836;AL;MONGOLIAN LETTER YA
+1837;AL;MONGOLIAN LETTER RA
+1838;AL;MONGOLIAN LETTER WA
+1839;AL;MONGOLIAN LETTER FA
+183A;AL;MONGOLIAN LETTER KA
+183B;AL;MONGOLIAN LETTER KHA
+183C;AL;MONGOLIAN LETTER TSA
+183D;AL;MONGOLIAN LETTER ZA
+183E;AL;MONGOLIAN LETTER HAA
+183F;AL;MONGOLIAN LETTER ZRA
+1840;AL;MONGOLIAN LETTER LHA
+1841;AL;MONGOLIAN LETTER ZHI
+1842;AL;MONGOLIAN LETTER CHI
+1843;AL;MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844;AL;MONGOLIAN LETTER TODO E
+1845;AL;MONGOLIAN LETTER TODO I
+1846;AL;MONGOLIAN LETTER TODO O
+1847;AL;MONGOLIAN LETTER TODO U
+1848;AL;MONGOLIAN LETTER TODO OE
+1849;AL;MONGOLIAN LETTER TODO UE
+184A;AL;MONGOLIAN LETTER TODO ANG
+184B;AL;MONGOLIAN LETTER TODO BA
+184C;AL;MONGOLIAN LETTER TODO PA
+184D;AL;MONGOLIAN LETTER TODO QA
+184E;AL;MONGOLIAN LETTER TODO GA
+184F;AL;MONGOLIAN LETTER TODO MA
+1850;AL;MONGOLIAN LETTER TODO TA
+1851;AL;MONGOLIAN LETTER TODO DA
+1852;AL;MONGOLIAN LETTER TODO CHA
+1853;AL;MONGOLIAN LETTER TODO JA
+1854;AL;MONGOLIAN LETTER TODO TSA
+1855;AL;MONGOLIAN LETTER TODO YA
+1856;AL;MONGOLIAN LETTER TODO WA
+1857;AL;MONGOLIAN LETTER TODO KA
+1858;AL;MONGOLIAN LETTER TODO GAA
+1859;AL;MONGOLIAN LETTER TODO HAA
+185A;AL;MONGOLIAN LETTER TODO JIA
+185B;AL;MONGOLIAN LETTER TODO NIA
+185C;AL;MONGOLIAN LETTER TODO DZA
+185D;AL;MONGOLIAN LETTER SIBE E
+185E;AL;MONGOLIAN LETTER SIBE I
+185F;AL;MONGOLIAN LETTER SIBE IY
+1860;AL;MONGOLIAN LETTER SIBE UE
+1861;AL;MONGOLIAN LETTER SIBE U
+1862;AL;MONGOLIAN LETTER SIBE ANG
+1863;AL;MONGOLIAN LETTER SIBE KA
+1864;AL;MONGOLIAN LETTER SIBE GA
+1865;AL;MONGOLIAN LETTER SIBE HA
+1866;AL;MONGOLIAN LETTER SIBE PA
+1867;AL;MONGOLIAN LETTER SIBE SHA
+1868;AL;MONGOLIAN LETTER SIBE TA
+1869;AL;MONGOLIAN LETTER SIBE DA
+186A;AL;MONGOLIAN LETTER SIBE JA
+186B;AL;MONGOLIAN LETTER SIBE FA
+186C;AL;MONGOLIAN LETTER SIBE GAA
+186D;AL;MONGOLIAN LETTER SIBE HAA
+186E;AL;MONGOLIAN LETTER SIBE TSA
+186F;AL;MONGOLIAN LETTER SIBE ZA
+1870;AL;MONGOLIAN LETTER SIBE RAA
+1871;AL;MONGOLIAN LETTER SIBE CHA
+1872;AL;MONGOLIAN LETTER SIBE ZHA
+1873;AL;MONGOLIAN LETTER MANCHU I
+1874;AL;MONGOLIAN LETTER MANCHU KA
+1875;AL;MONGOLIAN LETTER MANCHU RA
+1876;AL;MONGOLIAN LETTER MANCHU FA
+1877;AL;MONGOLIAN LETTER MANCHU ZHA
+1880;AL;MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881;AL;MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882;AL;MONGOLIAN LETTER ALI GALI DAMARU
+1883;AL;MONGOLIAN LETTER ALI GALI UBADAMA
+1884;AL;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885;AL;MONGOLIAN LETTER ALI GALI BALUDA
+1886;AL;MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887;AL;MONGOLIAN LETTER ALI GALI A
+1888;AL;MONGOLIAN LETTER ALI GALI I
+1889;AL;MONGOLIAN LETTER ALI GALI KA
+188A;AL;MONGOLIAN LETTER ALI GALI NGA
+188B;AL;MONGOLIAN LETTER ALI GALI CA
+188C;AL;MONGOLIAN LETTER ALI GALI TTA
+188D;AL;MONGOLIAN LETTER ALI GALI TTHA
+188E;AL;MONGOLIAN LETTER ALI GALI DDA
+188F;AL;MONGOLIAN LETTER ALI GALI NNA
+1890;AL;MONGOLIAN LETTER ALI GALI TA
+1891;AL;MONGOLIAN LETTER ALI GALI DA
+1892;AL;MONGOLIAN LETTER ALI GALI PA
+1893;AL;MONGOLIAN LETTER ALI GALI PHA
+1894;AL;MONGOLIAN LETTER ALI GALI SSA
+1895;AL;MONGOLIAN LETTER ALI GALI ZHA
+1896;AL;MONGOLIAN LETTER ALI GALI ZA
+1897;AL;MONGOLIAN LETTER ALI GALI AH
+1898;AL;MONGOLIAN LETTER TODO ALI GALI TA
+1899;AL;MONGOLIAN LETTER TODO ALI GALI ZHA
+189A;AL;MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B;AL;MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C;AL;MONGOLIAN LETTER MANCHU ALI GALI CA
+189D;AL;MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E;AL;MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F;AL;MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0;AL;MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1;AL;MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2;AL;MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3;AL;MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4;AL;MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5;AL;MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6;AL;MONGOLIAN LETTER ALI GALI HALF U
+18A7;AL;MONGOLIAN LETTER ALI GALI HALF YA
+18A8;AL;MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9;CM;MONGOLIAN LETTER ALI GALI DAGALGA
+1E00;AL;LATIN CAPITAL LETTER A WITH RING BELOW
+1E01;AL;LATIN SMALL LETTER A WITH RING BELOW
+1E02;AL;LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E03;AL;LATIN SMALL LETTER B WITH DOT ABOVE
+1E04;AL;LATIN CAPITAL LETTER B WITH DOT BELOW
+1E05;AL;LATIN SMALL LETTER B WITH DOT BELOW
+1E06;AL;LATIN CAPITAL LETTER B WITH LINE BELOW
+1E07;AL;LATIN SMALL LETTER B WITH LINE BELOW
+1E08;AL;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E09;AL;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1E0A;AL;LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0B;AL;LATIN SMALL LETTER D WITH DOT ABOVE
+1E0C;AL;LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0D;AL;LATIN SMALL LETTER D WITH DOT BELOW
+1E0E;AL;LATIN CAPITAL LETTER D WITH LINE BELOW
+1E0F;AL;LATIN SMALL LETTER D WITH LINE BELOW
+1E10;AL;LATIN CAPITAL LETTER D WITH CEDILLA
+1E11;AL;LATIN SMALL LETTER D WITH CEDILLA
+1E12;AL;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E13;AL;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1E14;AL;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E15;AL;LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1E16;AL;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E17;AL;LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1E18;AL;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E19;AL;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1E1A;AL;LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1B;AL;LATIN SMALL LETTER E WITH TILDE BELOW
+1E1C;AL;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1D;AL;LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1E1E;AL;LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E1F;AL;LATIN SMALL LETTER F WITH DOT ABOVE
+1E20;AL;LATIN CAPITAL LETTER G WITH MACRON
+1E21;AL;LATIN SMALL LETTER G WITH MACRON
+1E22;AL;LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E23;AL;LATIN SMALL LETTER H WITH DOT ABOVE
+1E24;AL;LATIN CAPITAL LETTER H WITH DOT BELOW
+1E25;AL;LATIN SMALL LETTER H WITH DOT BELOW
+1E26;AL;LATIN CAPITAL LETTER H WITH DIAERESIS
+1E27;AL;LATIN SMALL LETTER H WITH DIAERESIS
+1E28;AL;LATIN CAPITAL LETTER H WITH CEDILLA
+1E29;AL;LATIN SMALL LETTER H WITH CEDILLA
+1E2A;AL;LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2B;AL;LATIN SMALL LETTER H WITH BREVE BELOW
+1E2C;AL;LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2D;AL;LATIN SMALL LETTER I WITH TILDE BELOW
+1E2E;AL;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E2F;AL;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1E30;AL;LATIN CAPITAL LETTER K WITH ACUTE
+1E31;AL;LATIN SMALL LETTER K WITH ACUTE
+1E32;AL;LATIN CAPITAL LETTER K WITH DOT BELOW
+1E33;AL;LATIN SMALL LETTER K WITH DOT BELOW
+1E34;AL;LATIN CAPITAL LETTER K WITH LINE BELOW
+1E35;AL;LATIN SMALL LETTER K WITH LINE BELOW
+1E36;AL;LATIN CAPITAL LETTER L WITH DOT BELOW
+1E37;AL;LATIN SMALL LETTER L WITH DOT BELOW
+1E38;AL;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E39;AL;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1E3A;AL;LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3B;AL;LATIN SMALL LETTER L WITH LINE BELOW
+1E3C;AL;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3D;AL;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1E3E;AL;LATIN CAPITAL LETTER M WITH ACUTE
+1E3F;AL;LATIN SMALL LETTER M WITH ACUTE
+1E40;AL;LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E41;AL;LATIN SMALL LETTER M WITH DOT ABOVE
+1E42;AL;LATIN CAPITAL LETTER M WITH DOT BELOW
+1E43;AL;LATIN SMALL LETTER M WITH DOT BELOW
+1E44;AL;LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E45;AL;LATIN SMALL LETTER N WITH DOT ABOVE
+1E46;AL;LATIN CAPITAL LETTER N WITH DOT BELOW
+1E47;AL;LATIN SMALL LETTER N WITH DOT BELOW
+1E48;AL;LATIN CAPITAL LETTER N WITH LINE BELOW
+1E49;AL;LATIN SMALL LETTER N WITH LINE BELOW
+1E4A;AL;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4B;AL;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1E4C;AL;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4D;AL;LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1E4E;AL;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E4F;AL;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1E50;AL;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E51;AL;LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1E52;AL;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E53;AL;LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1E54;AL;LATIN CAPITAL LETTER P WITH ACUTE
+1E55;AL;LATIN SMALL LETTER P WITH ACUTE
+1E56;AL;LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E57;AL;LATIN SMALL LETTER P WITH DOT ABOVE
+1E58;AL;LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E59;AL;LATIN SMALL LETTER R WITH DOT ABOVE
+1E5A;AL;LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5B;AL;LATIN SMALL LETTER R WITH DOT BELOW
+1E5C;AL;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5D;AL;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1E5E;AL;LATIN CAPITAL LETTER R WITH LINE BELOW
+1E5F;AL;LATIN SMALL LETTER R WITH LINE BELOW
+1E60;AL;LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E61;AL;LATIN SMALL LETTER S WITH DOT ABOVE
+1E62;AL;LATIN CAPITAL LETTER S WITH DOT BELOW
+1E63;AL;LATIN SMALL LETTER S WITH DOT BELOW
+1E64;AL;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E65;AL;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1E66;AL;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E67;AL;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1E68;AL;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E69;AL;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A;AL;LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6B;AL;LATIN SMALL LETTER T WITH DOT ABOVE
+1E6C;AL;LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6D;AL;LATIN SMALL LETTER T WITH DOT BELOW
+1E6E;AL;LATIN CAPITAL LETTER T WITH LINE BELOW
+1E6F;AL;LATIN SMALL LETTER T WITH LINE BELOW
+1E70;AL;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E71;AL;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1E72;AL;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E73;AL;LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1E74;AL;LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E75;AL;LATIN SMALL LETTER U WITH TILDE BELOW
+1E76;AL;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E77;AL;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1E78;AL;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E79;AL;LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1E7A;AL;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7B;AL;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1E7C;AL;LATIN CAPITAL LETTER V WITH TILDE
+1E7D;AL;LATIN SMALL LETTER V WITH TILDE
+1E7E;AL;LATIN CAPITAL LETTER V WITH DOT BELOW
+1E7F;AL;LATIN SMALL LETTER V WITH DOT BELOW
+1E80;AL;LATIN CAPITAL LETTER W WITH GRAVE
+1E81;AL;LATIN SMALL LETTER W WITH GRAVE
+1E82;AL;LATIN CAPITAL LETTER W WITH ACUTE
+1E83;AL;LATIN SMALL LETTER W WITH ACUTE
+1E84;AL;LATIN CAPITAL LETTER W WITH DIAERESIS
+1E85;AL;LATIN SMALL LETTER W WITH DIAERESIS
+1E86;AL;LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E87;AL;LATIN SMALL LETTER W WITH DOT ABOVE
+1E88;AL;LATIN CAPITAL LETTER W WITH DOT BELOW
+1E89;AL;LATIN SMALL LETTER W WITH DOT BELOW
+1E8A;AL;LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8B;AL;LATIN SMALL LETTER X WITH DOT ABOVE
+1E8C;AL;LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8D;AL;LATIN SMALL LETTER X WITH DIAERESIS
+1E8E;AL;LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E8F;AL;LATIN SMALL LETTER Y WITH DOT ABOVE
+1E90;AL;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E91;AL;LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1E92;AL;LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E93;AL;LATIN SMALL LETTER Z WITH DOT BELOW
+1E94;AL;LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E95;AL;LATIN SMALL LETTER Z WITH LINE BELOW
+1E96;AL;LATIN SMALL LETTER H WITH LINE BELOW
+1E97;AL;LATIN SMALL LETTER T WITH DIAERESIS
+1E98;AL;LATIN SMALL LETTER W WITH RING ABOVE
+1E99;AL;LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A;AL;LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B;AL;LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0;AL;LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA1;AL;LATIN SMALL LETTER A WITH DOT BELOW
+1EA2;AL;LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA3;AL;LATIN SMALL LETTER A WITH HOOK ABOVE
+1EA4;AL;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA5;AL;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6;AL;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA7;AL;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8;AL;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EA9;AL;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA;AL;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAB;AL;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC;AL;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAD;AL;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE;AL;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EAF;AL;LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1EB0;AL;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB1;AL;LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1EB2;AL;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB3;AL;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4;AL;LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB5;AL;LATIN SMALL LETTER A WITH BREVE AND TILDE
+1EB6;AL;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB7;AL;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1EB8;AL;LATIN CAPITAL LETTER E WITH DOT BELOW
+1EB9;AL;LATIN SMALL LETTER E WITH DOT BELOW
+1EBA;AL;LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBB;AL;LATIN SMALL LETTER E WITH HOOK ABOVE
+1EBC;AL;LATIN CAPITAL LETTER E WITH TILDE
+1EBD;AL;LATIN SMALL LETTER E WITH TILDE
+1EBE;AL;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EBF;AL;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0;AL;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC1;AL;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2;AL;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC3;AL;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4;AL;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC5;AL;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6;AL;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC7;AL;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8;AL;LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1EC9;AL;LATIN SMALL LETTER I WITH HOOK ABOVE
+1ECA;AL;LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECB;AL;LATIN SMALL LETTER I WITH DOT BELOW
+1ECC;AL;LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECD;AL;LATIN SMALL LETTER O WITH DOT BELOW
+1ECE;AL;LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ECF;AL;LATIN SMALL LETTER O WITH HOOK ABOVE
+1ED0;AL;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED1;AL;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2;AL;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED3;AL;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4;AL;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED5;AL;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6;AL;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED7;AL;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8;AL;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ED9;AL;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA;AL;LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDB;AL;LATIN SMALL LETTER O WITH HORN AND ACUTE
+1EDC;AL;LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDD;AL;LATIN SMALL LETTER O WITH HORN AND GRAVE
+1EDE;AL;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EDF;AL;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1EE0;AL;LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE1;AL;LATIN SMALL LETTER O WITH HORN AND TILDE
+1EE2;AL;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE3;AL;LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1EE4;AL;LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE5;AL;LATIN SMALL LETTER U WITH DOT BELOW
+1EE6;AL;LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE7;AL;LATIN SMALL LETTER U WITH HOOK ABOVE
+1EE8;AL;LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EE9;AL;LATIN SMALL LETTER U WITH HORN AND ACUTE
+1EEA;AL;LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEB;AL;LATIN SMALL LETTER U WITH HORN AND GRAVE
+1EEC;AL;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EED;AL;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1EEE;AL;LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EEF;AL;LATIN SMALL LETTER U WITH HORN AND TILDE
+1EF0;AL;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF1;AL;LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1EF2;AL;LATIN CAPITAL LETTER Y WITH GRAVE
+1EF3;AL;LATIN SMALL LETTER Y WITH GRAVE
+1EF4;AL;LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF5;AL;LATIN SMALL LETTER Y WITH DOT BELOW
+1EF6;AL;LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF7;AL;LATIN SMALL LETTER Y WITH HOOK ABOVE
+1EF8;AL;LATIN CAPITAL LETTER Y WITH TILDE
+1EF9;AL;LATIN SMALL LETTER Y WITH TILDE
+1F00;AL;GREEK SMALL LETTER ALPHA WITH PSILI
+1F01;AL;GREEK SMALL LETTER ALPHA WITH DASIA
+1F02;AL;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1F03;AL;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1F04;AL;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1F05;AL;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1F06;AL;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F07;AL;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F08;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F10;AL;GREEK SMALL LETTER EPSILON WITH PSILI
+1F11;AL;GREEK SMALL LETTER EPSILON WITH DASIA
+1F12;AL;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1F13;AL;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1F14;AL;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1F15;AL;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18;AL;GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19;AL;GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A;AL;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B;AL;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C;AL;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D;AL;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20;AL;GREEK SMALL LETTER ETA WITH PSILI
+1F21;AL;GREEK SMALL LETTER ETA WITH DASIA
+1F22;AL;GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1F23;AL;GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1F24;AL;GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1F25;AL;GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1F26;AL;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1F27;AL;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1F28;AL;GREEK CAPITAL LETTER ETA WITH PSILI
+1F29;AL;GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A;AL;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B;AL;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C;AL;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D;AL;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E;AL;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F;AL;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F30;AL;GREEK SMALL LETTER IOTA WITH PSILI
+1F31;AL;GREEK SMALL LETTER IOTA WITH DASIA
+1F32;AL;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1F33;AL;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1F34;AL;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1F35;AL;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1F36;AL;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F37;AL;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F38;AL;GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39;AL;GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A;AL;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B;AL;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C;AL;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D;AL;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E;AL;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F;AL;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F40;AL;GREEK SMALL LETTER OMICRON WITH PSILI
+1F41;AL;GREEK SMALL LETTER OMICRON WITH DASIA
+1F42;AL;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1F43;AL;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1F44;AL;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1F45;AL;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48;AL;GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49;AL;GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A;AL;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B;AL;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C;AL;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D;AL;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50;AL;GREEK SMALL LETTER UPSILON WITH PSILI
+1F51;AL;GREEK SMALL LETTER UPSILON WITH DASIA
+1F52;AL;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F53;AL;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1F54;AL;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F55;AL;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1F56;AL;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F57;AL;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59;AL;GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B;AL;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D;AL;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F;AL;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F60;AL;GREEK SMALL LETTER OMEGA WITH PSILI
+1F61;AL;GREEK SMALL LETTER OMEGA WITH DASIA
+1F62;AL;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1F63;AL;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1F64;AL;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1F65;AL;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1F66;AL;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F67;AL;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F68;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F70;AL;GREEK SMALL LETTER ALPHA WITH VARIA
+1F71;AL;GREEK SMALL LETTER ALPHA WITH OXIA
+1F72;AL;GREEK SMALL LETTER EPSILON WITH VARIA
+1F73;AL;GREEK SMALL LETTER EPSILON WITH OXIA
+1F74;AL;GREEK SMALL LETTER ETA WITH VARIA
+1F75;AL;GREEK SMALL LETTER ETA WITH OXIA
+1F76;AL;GREEK SMALL LETTER IOTA WITH VARIA
+1F77;AL;GREEK SMALL LETTER IOTA WITH OXIA
+1F78;AL;GREEK SMALL LETTER OMICRON WITH VARIA
+1F79;AL;GREEK SMALL LETTER OMICRON WITH OXIA
+1F7A;AL;GREEK SMALL LETTER UPSILON WITH VARIA
+1F7B;AL;GREEK SMALL LETTER UPSILON WITH OXIA
+1F7C;AL;GREEK SMALL LETTER OMEGA WITH VARIA
+1F7D;AL;GREEK SMALL LETTER OMEGA WITH OXIA
+1F80;AL;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81;AL;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82;AL;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83;AL;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84;AL;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85;AL;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86;AL;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87;AL;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E;AL;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F;AL;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90;AL;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91;AL;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92;AL;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93;AL;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94;AL;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95;AL;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96;AL;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97;AL;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98;AL;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99;AL;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A;AL;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B;AL;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C;AL;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D;AL;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E;AL;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F;AL;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0;AL;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1;AL;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2;AL;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3;AL;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4;AL;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5;AL;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6;AL;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7;AL;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE;AL;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF;AL;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB0;AL;GREEK SMALL LETTER ALPHA WITH VRACHY
+1FB1;AL;GREEK SMALL LETTER ALPHA WITH MACRON
+1FB2;AL;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3;AL;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4;AL;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6;AL;GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7;AL;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8;AL;GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9;AL;GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA;AL;GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB;AL;GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC;AL;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD;AL;GREEK KORONIS
+1FBE;AL;GREEK PROSGEGRAMMENI
+1FBF;AL;GREEK PSILI
+1FC0;AL;GREEK PERISPOMENI
+1FC1;AL;GREEK DIALYTIKA AND PERISPOMENI
+1FC2;AL;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3;AL;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4;AL;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6;AL;GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7;AL;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8;AL;GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9;AL;GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA;AL;GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB;AL;GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC;AL;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD;AL;GREEK PSILI AND VARIA
+1FCE;AL;GREEK PSILI AND OXIA
+1FCF;AL;GREEK PSILI AND PERISPOMENI
+1FD0;AL;GREEK SMALL LETTER IOTA WITH VRACHY
+1FD1;AL;GREEK SMALL LETTER IOTA WITH MACRON
+1FD2;AL;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3;AL;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6;AL;GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7;AL;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8;AL;GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9;AL;GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA;AL;GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB;AL;GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD;AL;GREEK DASIA AND VARIA
+1FDE;AL;GREEK DASIA AND OXIA
+1FDF;AL;GREEK DASIA AND PERISPOMENI
+1FE0;AL;GREEK SMALL LETTER UPSILON WITH VRACHY
+1FE1;AL;GREEK SMALL LETTER UPSILON WITH MACRON
+1FE2;AL;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3;AL;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4;AL;GREEK SMALL LETTER RHO WITH PSILI
+1FE5;AL;GREEK SMALL LETTER RHO WITH DASIA
+1FE6;AL;GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7;AL;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8;AL;GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9;AL;GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA;AL;GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB;AL;GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC;AL;GREEK CAPITAL LETTER RHO WITH DASIA
+1FED;AL;GREEK DIALYTIKA AND VARIA
+1FEE;AL;GREEK DIALYTIKA AND OXIA
+1FEF;AL;GREEK VARIA
+1FF2;AL;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3;AL;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4;AL;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6;AL;GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7;AL;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8;AL;GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9;AL;GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA;AL;GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB;AL;GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC;AL;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD;AL;GREEK OXIA
+1FFE;AL;GREEK DASIA
+2000;BA;EN QUAD
+2001;BA;EM QUAD
+2002;BA;EN SPACE
+2003;BA;EM SPACE
+2004;BA;THREE-PER-EM SPACE
+2005;BA;FOUR-PER-EM SPACE
+2006;BA;SIX-PER-EM SPACE
+2007;GL;FIGURE SPACE
+2008;BA;PUNCTUATION SPACE
+2009;BA;THIN SPACE
+200A;BA;HAIR SPACE
+200B;ZW;ZERO WIDTH SPACE
+200C;CM;ZERO WIDTH NON-JOINER
+200D;CM;ZERO WIDTH JOINER
+200E;CM;LEFT-TO-RIGHT MARK
+200F;CM;RIGHT-TO-LEFT MARK
+2010;BA;HYPHEN
+2011;GL;NON-BREAKING HYPHEN
+2012;BA;FIGURE DASH
+2013;BA;EN DASH
+2014;B2;EM DASH
+2015;AL;HORIZONTAL BAR
+2016;AI;DOUBLE VERTICAL LINE
+2017;AL;DOUBLE LOW LINE
+2018;QU;LEFT SINGLE QUOTATION MARK
+2019;QU;RIGHT SINGLE QUOTATION MARK
+201A;OP;SINGLE LOW-9 QUOTATION MARK
+201B;QU;SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C;QU;LEFT DOUBLE QUOTATION MARK
+201D;QU;RIGHT DOUBLE QUOTATION MARK
+201E;OP;DOUBLE LOW-9 QUOTATION MARK
+201F;QU;DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020;AI;DAGGER
+2021;AI;DOUBLE DAGGER
+2022;AL;BULLET
+2023;AL;TRIANGULAR BULLET
+2024;IN;ONE DOT LEADER
+2025;IN;TWO DOT LEADER
+2026;IN;HORIZONTAL ELLIPSIS
+2027;BA;HYPHENATION POINT
+2028;BK;LINE SEPARATOR
+2029;BK;PARAGRAPH SEPARATOR
+202A;CM;LEFT-TO-RIGHT EMBEDDING
+202B;CM;RIGHT-TO-LEFT EMBEDDING
+202C;CM;POP DIRECTIONAL FORMATTING
+202D;CM;LEFT-TO-RIGHT OVERRIDE
+202E;CM;RIGHT-TO-LEFT OVERRIDE
+202F;GL;NARROW NO-BREAK SPACE
+2030;PO;PER MILLE SIGN
+2031;PO;PER TEN THOUSAND SIGN
+2032;PO;PRIME
+2033;PO;DOUBLE PRIME
+2034;PO;TRIPLE PRIME
+2035;PO;REVERSED PRIME
+2036;PO;REVERSED DOUBLE PRIME
+2037;PO;REVERSED TRIPLE PRIME
+2038;AL;CARET
+2039;QU;SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A;QU;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B;AI;REFERENCE MARK
+203C;NS;DOUBLE EXCLAMATION MARK
+203D;AL;INTERROBANG
+203E;AL;OVERLINE
+203F;AL;UNDERTIE
+2040;AL;CHARACTER TIE
+2041;AL;CARET INSERTION POINT
+2042;AL;ASTERISM
+2043;AL;HYPHEN BULLET
+2044;NS;FRACTION SLASH
+2045;OP;LEFT SQUARE BRACKET WITH QUILL
+2046;CL;RIGHT SQUARE BRACKET WITH QUILL
+2048;AL;QUESTION EXCLAMATION MARK
+2049;AL;EXCLAMATION QUESTION MARK
+204A;AL;TIRONIAN SIGN ET
+204B;AL;REVERSED PILCROW SIGN
+204C;AL;BLACK LEFTWARDS BULLET
+204D;AL;BLACK RIGHTWARDS BULLET
+206A;CM;INHIBIT SYMMETRIC SWAPPING
+206B;CM;ACTIVATE SYMMETRIC SWAPPING
+206C;CM;INHIBIT ARABIC FORM SHAPING
+206D;CM;ACTIVATE ARABIC FORM SHAPING
+206E;CM;NATIONAL DIGIT SHAPES
+206F;CM;NOMINAL DIGIT SHAPES
+2070;AL;SUPERSCRIPT ZERO
+2074;AI;SUPERSCRIPT FOUR
+2075;AL;SUPERSCRIPT FIVE
+2076;AL;SUPERSCRIPT SIX
+2077;AL;SUPERSCRIPT SEVEN
+2078;AL;SUPERSCRIPT EIGHT
+2079;AL;SUPERSCRIPT NINE
+207A;AL;SUPERSCRIPT PLUS SIGN
+207B;AL;SUPERSCRIPT MINUS
+207C;AL;SUPERSCRIPT EQUALS SIGN
+207D;OP;SUPERSCRIPT LEFT PARENTHESIS
+207E;CL;SUPERSCRIPT RIGHT PARENTHESIS
+207F;AI;SUPERSCRIPT LATIN SMALL LETTER N
+2080;AL;SUBSCRIPT ZERO
+2081;AI;SUBSCRIPT ONE
+2082;AI;SUBSCRIPT TWO
+2083;AI;SUBSCRIPT THREE
+2084;AI;SUBSCRIPT FOUR
+2085;AL;SUBSCRIPT FIVE
+2086;AL;SUBSCRIPT SIX
+2087;AL;SUBSCRIPT SEVEN
+2088;AL;SUBSCRIPT EIGHT
+2089;AL;SUBSCRIPT NINE
+208A;AL;SUBSCRIPT PLUS SIGN
+208B;AL;SUBSCRIPT MINUS
+208C;AL;SUBSCRIPT EQUALS SIGN
+208D;OP;SUBSCRIPT LEFT PARENTHESIS
+208E;CL;SUBSCRIPT RIGHT PARENTHESIS
+20A0;PR;EURO-CURRENCY SIGN
+20A1;PR;COLON SIGN
+20A2;PR;CRUZEIRO SIGN
+20A3;PR;FRENCH FRANC SIGN
+20A4;PR;LIRA SIGN
+20A5;PR;MILL SIGN
+20A6;PR;NAIRA SIGN
+20A7;PO;PESETA SIGN
+20A8;PR;RUPEE SIGN
+20A9;PR;WON SIGN
+20AA;PR;NEW SHEQEL SIGN
+20AB;PR;DONG SIGN
+20AC;PR;EURO SIGN
+20AD;PR;KIP SIGN
+20AE;PR;TUGRIK SIGN
+20AF;PR;DRACHMA SIGN
+20D0;CM;COMBINING LEFT HARPOON ABOVE
+20D1;CM;COMBINING RIGHT HARPOON ABOVE
+20D2;CM;COMBINING LONG VERTICAL LINE OVERLAY
+20D3;CM;COMBINING SHORT VERTICAL LINE OVERLAY
+20D4;CM;COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5;CM;COMBINING CLOCKWISE ARROW ABOVE
+20D6;CM;COMBINING LEFT ARROW ABOVE
+20D7;CM;COMBINING RIGHT ARROW ABOVE
+20D8;CM;COMBINING RING OVERLAY
+20D9;CM;COMBINING CLOCKWISE RING OVERLAY
+20DA;CM;COMBINING ANTICLOCKWISE RING OVERLAY
+20DB;CM;COMBINING THREE DOTS ABOVE
+20DC;CM;COMBINING FOUR DOTS ABOVE
+20DD;CM;COMBINING ENCLOSING CIRCLE
+20DE;CM;COMBINING ENCLOSING SQUARE
+20DF;CM;COMBINING ENCLOSING DIAMOND
+20E0;CM;COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1;CM;COMBINING LEFT RIGHT ARROW ABOVE
+20E2;CM;COMBINING ENCLOSING SCREEN
+20E3;CM;COMBINING ENCLOSING KEYCAP
+2100;AL;ACCOUNT OF
+2101;AL;ADDRESSED TO THE SUBJECT
+2102;AL;DOUBLE-STRUCK CAPITAL C
+2103;PO;DEGREE CELSIUS
+2104;AL;CENTRE LINE SYMBOL
+2105;AI;CARE OF
+2106;AL;CADA UNA
+2107;AL;EULER CONSTANT
+2108;AL;SCRUPLE
+2109;PO;DEGREE FAHRENHEIT
+210A;AL;SCRIPT SMALL G
+210B;AL;SCRIPT CAPITAL H
+210C;AL;BLACK-LETTER CAPITAL H
+210D;AL;DOUBLE-STRUCK CAPITAL H
+210E;AL;PLANCK CONSTANT
+210F;AL;PLANCK CONSTANT OVER TWO PI
+2110;AL;SCRIPT CAPITAL I
+2111;AL;BLACK-LETTER CAPITAL I
+2112;AL;SCRIPT CAPITAL L
+2113;AI;SCRIPT SMALL L
+2114;AL;L B BAR SYMBOL
+2115;AL;DOUBLE-STRUCK CAPITAL N
+2116;PR;NUMERO SIGN
+2117;AL;SOUND RECORDING COPYRIGHT
+2118;AL;SCRIPT CAPITAL P
+2119;AL;DOUBLE-STRUCK CAPITAL P
+211A;AL;DOUBLE-STRUCK CAPITAL Q
+211B;AL;SCRIPT CAPITAL R
+211C;AL;BLACK-LETTER CAPITAL R
+211D;AL;DOUBLE-STRUCK CAPITAL R
+211E;AL;PRESCRIPTION TAKE
+211F;AL;RESPONSE
+2120;AL;SERVICE MARK
+2121;AI;TELEPHONE SIGN
+2122;AI;TRADE MARK SIGN
+2123;AL;VERSICLE
+2124;AL;DOUBLE-STRUCK CAPITAL Z
+2125;AL;OUNCE SIGN
+2126;PO;OHM SIGN
+2127;AL;INVERTED OHM SIGN
+2128;AL;BLACK-LETTER CAPITAL Z
+2129;AL;TURNED GREEK SMALL LETTER IOTA
+212A;AL;KELVIN SIGN
+212B;AI;ANGSTROM SIGN
+212C;AL;SCRIPT CAPITAL B
+212D;AL;BLACK-LETTER CAPITAL C
+212E;AL;ESTIMATED SYMBOL
+212F;AL;SCRIPT SMALL E
+2130;AL;SCRIPT CAPITAL E
+2131;AL;SCRIPT CAPITAL F
+2132;AL;TURNED CAPITAL F
+2133;AL;SCRIPT CAPITAL M
+2134;AL;SCRIPT SMALL O
+2135;AL;ALEF SYMBOL
+2136;AL;BET SYMBOL
+2137;AL;GIMEL SYMBOL
+2138;AL;DALET SYMBOL
+2139;AL;INFORMATION SOURCE
+213A;AL;ROTATED CAPITAL Q
+2153;AL;VULGAR FRACTION ONE THIRD
+2154;AI;VULGAR FRACTION TWO THIRDS
+2155;AI;VULGAR FRACTION ONE FIFTH
+2156;AL;VULGAR FRACTION TWO FIFTHS
+2157;AL;VULGAR FRACTION THREE FIFTHS
+2158;AL;VULGAR FRACTION FOUR FIFTHS
+2159;AL;VULGAR FRACTION ONE SIXTH
+215A;AL;VULGAR FRACTION FIVE SIXTHS
+215B;AI;VULGAR FRACTION ONE EIGHTH
+215C;AL;VULGAR FRACTION THREE EIGHTHS
+215D;AL;VULGAR FRACTION FIVE EIGHTHS
+215E;AI;VULGAR FRACTION SEVEN EIGHTHS
+215F;AL;FRACTION NUMERATOR ONE
+2160;AI;ROMAN NUMERAL ONE
+2161;AI;ROMAN NUMERAL TWO
+2162;AI;ROMAN NUMERAL THREE
+2163;AI;ROMAN NUMERAL FOUR
+2164;AI;ROMAN NUMERAL FIVE
+2165;AI;ROMAN NUMERAL SIX
+2166;AI;ROMAN NUMERAL SEVEN
+2167;AI;ROMAN NUMERAL EIGHT
+2168;AI;ROMAN NUMERAL NINE
+2169;AI;ROMAN NUMERAL TEN
+216A;AI;ROMAN NUMERAL ELEVEN
+216B;AI;ROMAN NUMERAL TWELVE
+216C;AL;ROMAN NUMERAL FIFTY
+216D;AL;ROMAN NUMERAL ONE HUNDRED
+216E;AL;ROMAN NUMERAL FIVE HUNDRED
+216F;AL;ROMAN NUMERAL ONE THOUSAND
+2170;AI;SMALL ROMAN NUMERAL ONE
+2171;AI;SMALL ROMAN NUMERAL TWO
+2172;AI;SMALL ROMAN NUMERAL THREE
+2173;AI;SMALL ROMAN NUMERAL FOUR
+2174;AI;SMALL ROMAN NUMERAL FIVE
+2175;AI;SMALL ROMAN NUMERAL SIX
+2176;AI;SMALL ROMAN NUMERAL SEVEN
+2177;AI;SMALL ROMAN NUMERAL EIGHT
+2178;AI;SMALL ROMAN NUMERAL NINE
+2179;AI;SMALL ROMAN NUMERAL TEN
+217A;AL;SMALL ROMAN NUMERAL ELEVEN
+217B;AL;SMALL ROMAN NUMERAL TWELVE
+217C;AL;SMALL ROMAN NUMERAL FIFTY
+217D;AL;SMALL ROMAN NUMERAL ONE HUNDRED
+217E;AL;SMALL ROMAN NUMERAL FIVE HUNDRED
+217F;AL;SMALL ROMAN NUMERAL ONE THOUSAND
+2180;AL;ROMAN NUMERAL ONE THOUSAND C D
+2181;AL;ROMAN NUMERAL FIVE THOUSAND
+2182;AL;ROMAN NUMERAL TEN THOUSAND
+2183;AL;ROMAN NUMERAL REVERSED ONE HUNDRED
+2190;AI;LEFTWARDS ARROW
+2191;AI;UPWARDS ARROW
+2192;AI;RIGHTWARDS ARROW
+2193;AI;DOWNWARDS ARROW
+2194;AI;LEFT RIGHT ARROW
+2195;AI;UP DOWN ARROW
+2196;AI;NORTH WEST ARROW
+2197;AI;NORTH EAST ARROW
+2198;AI;SOUTH EAST ARROW
+2199;AI;SOUTH WEST ARROW
+219A;AL;LEFTWARDS ARROW WITH STROKE
+219B;AL;RIGHTWARDS ARROW WITH STROKE
+219C;AL;LEFTWARDS WAVE ARROW
+219D;AL;RIGHTWARDS WAVE ARROW
+219E;AL;LEFTWARDS TWO HEADED ARROW
+219F;AL;UPWARDS TWO HEADED ARROW
+21A0;AL;RIGHTWARDS TWO HEADED ARROW
+21A1;AL;DOWNWARDS TWO HEADED ARROW
+21A2;AL;LEFTWARDS ARROW WITH TAIL
+21A3;AL;RIGHTWARDS ARROW WITH TAIL
+21A4;AL;LEFTWARDS ARROW FROM BAR
+21A5;AL;UPWARDS ARROW FROM BAR
+21A6;AL;RIGHTWARDS ARROW FROM BAR
+21A7;AL;DOWNWARDS ARROW FROM BAR
+21A8;AL;UP DOWN ARROW WITH BASE
+21A9;AL;LEFTWARDS ARROW WITH HOOK
+21AA;AL;RIGHTWARDS ARROW WITH HOOK
+21AB;AL;LEFTWARDS ARROW WITH LOOP
+21AC;AL;RIGHTWARDS ARROW WITH LOOP
+21AD;AL;LEFT RIGHT WAVE ARROW
+21AE;AL;LEFT RIGHT ARROW WITH STROKE
+21AF;AL;DOWNWARDS ZIGZAG ARROW
+21B0;AL;UPWARDS ARROW WITH TIP LEFTWARDS
+21B1;AL;UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2;AL;DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3;AL;DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4;AL;RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5;AL;DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6;AL;ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7;AL;CLOCKWISE TOP SEMICIRCLE ARROW
+21B8;AL;NORTH WEST ARROW TO LONG BAR
+21B9;AL;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA;AL;ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB;AL;CLOCKWISE OPEN CIRCLE ARROW
+21BC;AL;LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD;AL;LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE;AL;UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF;AL;UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0;AL;RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1;AL;RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2;AL;DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3;AL;DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4;AL;RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5;AL;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6;AL;LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7;AL;LEFTWARDS PAIRED ARROWS
+21C8;AL;UPWARDS PAIRED ARROWS
+21C9;AL;RIGHTWARDS PAIRED ARROWS
+21CA;AL;DOWNWARDS PAIRED ARROWS
+21CB;AL;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC;AL;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD;AL;LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE;AL;LEFT RIGHT DOUBLE ARROW WITH STROKE
+21CF;AL;RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0;AL;LEFTWARDS DOUBLE ARROW
+21D1;AL;UPWARDS DOUBLE ARROW
+21D2;AI;RIGHTWARDS DOUBLE ARROW
+21D3;AL;DOWNWARDS DOUBLE ARROW
+21D4;AI;LEFT RIGHT DOUBLE ARROW
+21D5;AL;UP DOWN DOUBLE ARROW
+21D6;AL;NORTH WEST DOUBLE ARROW
+21D7;AL;NORTH EAST DOUBLE ARROW
+21D8;AL;SOUTH EAST DOUBLE ARROW
+21D9;AL;SOUTH WEST DOUBLE ARROW
+21DA;AL;LEFTWARDS TRIPLE ARROW
+21DB;AL;RIGHTWARDS TRIPLE ARROW
+21DC;AL;LEFTWARDS SQUIGGLE ARROW
+21DD;AL;RIGHTWARDS SQUIGGLE ARROW
+21DE;AL;UPWARDS ARROW WITH DOUBLE STROKE
+21DF;AL;DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0;AL;LEFTWARDS DASHED ARROW
+21E1;AL;UPWARDS DASHED ARROW
+21E2;AL;RIGHTWARDS DASHED ARROW
+21E3;AL;DOWNWARDS DASHED ARROW
+21E4;AL;LEFTWARDS ARROW TO BAR
+21E5;AL;RIGHTWARDS ARROW TO BAR
+21E6;AL;LEFTWARDS WHITE ARROW
+21E7;AL;UPWARDS WHITE ARROW
+21E8;AL;RIGHTWARDS WHITE ARROW
+21E9;AL;DOWNWARDS WHITE ARROW
+21EA;AL;UPWARDS WHITE ARROW FROM BAR
+21EB;AL;UPWARDS WHITE ARROW ON PEDESTAL
+21EC;AL;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED;AL;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE;AL;UPWARDS WHITE DOUBLE ARROW
+21EF;AL;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0;AL;RIGHTWARDS WHITE ARROW FROM WALL
+21F1;AL;NORTH WEST ARROW TO CORNER
+21F2;AL;SOUTH EAST ARROW TO CORNER
+21F3;AL;UP DOWN WHITE ARROW
+2200;AI;FOR ALL
+2201;AL;COMPLEMENT
+2202;AI;PARTIAL DIFFERENTIAL
+2203;AI;THERE EXISTS
+2204;AL;THERE DOES NOT EXIST
+2205;AL;EMPTY SET
+2206;AL;INCREMENT
+2207;AI;NABLA
+2208;AI;ELEMENT OF
+2209;AL;NOT AN ELEMENT OF
+220A;AL;SMALL ELEMENT OF
+220B;AI;CONTAINS AS MEMBER
+220C;AL;DOES NOT CONTAIN AS MEMBER
+220D;AL;SMALL CONTAINS AS MEMBER
+220E;AL;END OF PROOF
+220F;AI;N-ARY PRODUCT
+2210;AL;N-ARY COPRODUCT
+2211;AI;N-ARY SUMMATION
+2212;PR;MINUS SIGN
+2213;PR;MINUS-OR-PLUS SIGN
+2214;AL;DOT PLUS
+2215;AI;DIVISION SLASH
+2216;AL;SET MINUS
+2217;AL;ASTERISK OPERATOR
+2218;AL;RING OPERATOR
+2219;AL;BULLET OPERATOR
+221A;AI;SQUARE ROOT
+221B;AL;CUBE ROOT
+221C;AL;FOURTH ROOT
+221D;AI;PROPORTIONAL TO
+221E;AI;INFINITY
+221F;AI;RIGHT ANGLE
+2220;AI;ANGLE
+2221;AL;MEASURED ANGLE
+2222;AL;SPHERICAL ANGLE
+2223;AI;DIVIDES
+2224;AL;DOES NOT DIVIDE
+2225;AI;PARALLEL TO
+2226;AL;NOT PARALLEL TO
+2227;AI;LOGICAL AND
+2228;AI;LOGICAL OR
+2229;AI;INTERSECTION
+222A;AI;UNION
+222B;AI;INTEGRAL
+222C;AI;DOUBLE INTEGRAL
+222D;AL;TRIPLE INTEGRAL
+222E;AI;CONTOUR INTEGRAL
+222F;AL;SURFACE INTEGRAL
+2230;AL;VOLUME INTEGRAL
+2231;AL;CLOCKWISE INTEGRAL
+2232;AL;CLOCKWISE CONTOUR INTEGRAL
+2233;AL;ANTICLOCKWISE CONTOUR INTEGRAL
+2234;AI;THEREFORE
+2235;AI;BECAUSE
+2236;AI;RATIO
+2237;AI;PROPORTION
+2238;AL;DOT MINUS
+2239;AL;EXCESS
+223A;AL;GEOMETRIC PROPORTION
+223B;AL;HOMOTHETIC
+223C;AI;TILDE OPERATOR
+223D;AI;REVERSED TILDE
+223E;AL;INVERTED LAZY S
+223F;AL;SINE WAVE
+2240;AL;WREATH PRODUCT
+2241;AL;NOT TILDE
+2242;AL;MINUS TILDE
+2243;AL;ASYMPTOTICALLY EQUAL TO
+2244;AL;NOT ASYMPTOTICALLY EQUAL TO
+2245;AL;APPROXIMATELY EQUAL TO
+2246;AL;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247;AL;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248;AI;ALMOST EQUAL TO
+2249;AL;NOT ALMOST EQUAL TO
+224A;AL;ALMOST EQUAL OR EQUAL TO
+224B;AL;TRIPLE TILDE
+224C;AI;ALL EQUAL TO
+224D;AL;EQUIVALENT TO
+224E;AL;GEOMETRICALLY EQUIVALENT TO
+224F;AL;DIFFERENCE BETWEEN
+2250;AL;APPROACHES THE LIMIT
+2251;AL;GEOMETRICALLY EQUAL TO
+2252;AI;APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253;AL;IMAGE OF OR APPROXIMATELY EQUAL TO
+2254;AL;COLON EQUALS
+2255;AL;EQUALS COLON
+2256;AL;RING IN EQUAL TO
+2257;AL;RING EQUAL TO
+2258;AL;CORRESPONDS TO
+2259;AL;ESTIMATES
+225A;AL;EQUIANGULAR TO
+225B;AL;STAR EQUALS
+225C;AL;DELTA EQUAL TO
+225D;AL;EQUAL TO BY DEFINITION
+225E;AL;MEASURED BY
+225F;AL;QUESTIONED EQUAL TO
+2260;AI;NOT EQUAL TO
+2261;AI;IDENTICAL TO
+2262;AL;NOT IDENTICAL TO
+2263;AL;STRICTLY EQUIVALENT TO
+2264;AI;LESS-THAN OR EQUAL TO
+2265;AI;GREATER-THAN OR EQUAL TO
+2266;AI;LESS-THAN OVER EQUAL TO
+2267;AI;GREATER-THAN OVER EQUAL TO
+2268;AL;LESS-THAN BUT NOT EQUAL TO
+2269;AL;GREATER-THAN BUT NOT EQUAL TO
+226A;AI;MUCH LESS-THAN
+226B;AI;MUCH GREATER-THAN
+226C;AL;BETWEEN
+226D;AL;NOT EQUIVALENT TO
+226E;AI;NOT LESS-THAN
+226F;AI;NOT GREATER-THAN
+2270;AL;NEITHER LESS-THAN NOR EQUAL TO
+2271;AL;NEITHER GREATER-THAN NOR EQUAL TO
+2272;AL;LESS-THAN OR EQUIVALENT TO
+2273;AL;GREATER-THAN OR EQUIVALENT TO
+2274;AL;NEITHER LESS-THAN NOR EQUIVALENT TO
+2275;AL;NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276;AL;LESS-THAN OR GREATER-THAN
+2277;AL;GREATER-THAN OR LESS-THAN
+2278;AL;NEITHER LESS-THAN NOR GREATER-THAN
+2279;AL;NEITHER GREATER-THAN NOR LESS-THAN
+227A;AL;PRECEDES
+227B;AL;SUCCEEDS
+227C;AL;PRECEDES OR EQUAL TO
+227D;AL;SUCCEEDS OR EQUAL TO
+227E;AL;PRECEDES OR EQUIVALENT TO
+227F;AL;SUCCEEDS OR EQUIVALENT TO
+2280;AL;DOES NOT PRECEDE
+2281;AL;DOES NOT SUCCEED
+2282;AI;SUBSET OF
+2283;AI;SUPERSET OF
+2284;AL;NOT A SUBSET OF
+2285;AL;NOT A SUPERSET OF
+2286;AI;SUBSET OF OR EQUAL TO
+2287;AI;SUPERSET OF OR EQUAL TO
+2288;AL;NEITHER A SUBSET OF NOR EQUAL TO
+2289;AL;NEITHER A SUPERSET OF NOR EQUAL TO
+228A;AL;SUBSET OF WITH NOT EQUAL TO
+228B;AL;SUPERSET OF WITH NOT EQUAL TO
+228C;AL;MULTISET
+228D;AL;MULTISET MULTIPLICATION
+228E;AL;MULTISET UNION
+228F;AL;SQUARE IMAGE OF
+2290;AL;SQUARE ORIGINAL OF
+2291;AL;SQUARE IMAGE OF OR EQUAL TO
+2292;AL;SQUARE ORIGINAL OF OR EQUAL TO
+2293;AL;SQUARE CAP
+2294;AL;SQUARE CUP
+2295;AI;CIRCLED PLUS
+2296;AL;CIRCLED MINUS
+2297;AL;CIRCLED TIMES
+2298;AL;CIRCLED DIVISION SLASH
+2299;AI;CIRCLED DOT OPERATOR
+229A;AL;CIRCLED RING OPERATOR
+229B;AL;CIRCLED ASTERISK OPERATOR
+229C;AL;CIRCLED EQUALS
+229D;AL;CIRCLED DASH
+229E;AL;SQUARED PLUS
+229F;AL;SQUARED MINUS
+22A0;AL;SQUARED TIMES
+22A1;AL;SQUARED DOT OPERATOR
+22A2;AL;RIGHT TACK
+22A3;AL;LEFT TACK
+22A4;AL;DOWN TACK
+22A5;AI;UP TACK
+22A6;AL;ASSERTION
+22A7;AL;MODELS
+22A8;AL;TRUE
+22A9;AL;FORCES
+22AA;AL;TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB;AL;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC;AL;DOES NOT PROVE
+22AD;AL;NOT TRUE
+22AE;AL;DOES NOT FORCE
+22AF;AL;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0;AL;PRECEDES UNDER RELATION
+22B1;AL;SUCCEEDS UNDER RELATION
+22B2;AL;NORMAL SUBGROUP OF
+22B3;AL;CONTAINS AS NORMAL SUBGROUP
+22B4;AL;NORMAL SUBGROUP OF OR EQUAL TO
+22B5;AL;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6;AL;ORIGINAL OF
+22B7;AL;IMAGE OF
+22B8;AL;MULTIMAP
+22B9;AL;HERMITIAN CONJUGATE MATRIX
+22BA;AL;INTERCALATE
+22BB;AL;XOR
+22BC;AL;NAND
+22BD;AL;NOR
+22BE;AL;RIGHT ANGLE WITH ARC
+22BF;AI;RIGHT TRIANGLE
+22C0;AL;N-ARY LOGICAL AND
+22C1;AL;N-ARY LOGICAL OR
+22C2;AL;N-ARY INTERSECTION
+22C3;AL;N-ARY UNION
+22C4;AL;DIAMOND OPERATOR
+22C5;AL;DOT OPERATOR
+22C6;AL;STAR OPERATOR
+22C7;AL;DIVISION TIMES
+22C8;AL;BOWTIE
+22C9;AL;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA;AL;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB;AL;LEFT SEMIDIRECT PRODUCT
+22CC;AL;RIGHT SEMIDIRECT PRODUCT
+22CD;AL;REVERSED TILDE EQUALS
+22CE;AL;CURLY LOGICAL OR
+22CF;AL;CURLY LOGICAL AND
+22D0;AL;DOUBLE SUBSET
+22D1;AL;DOUBLE SUPERSET
+22D2;AL;DOUBLE INTERSECTION
+22D3;AL;DOUBLE UNION
+22D4;AL;PITCHFORK
+22D5;AL;EQUAL AND PARALLEL TO
+22D6;AL;LESS-THAN WITH DOT
+22D7;AL;GREATER-THAN WITH DOT
+22D8;AL;VERY MUCH LESS-THAN
+22D9;AL;VERY MUCH GREATER-THAN
+22DA;AL;LESS-THAN EQUAL TO OR GREATER-THAN
+22DB;AL;GREATER-THAN EQUAL TO OR LESS-THAN
+22DC;AL;EQUAL TO OR LESS-THAN
+22DD;AL;EQUAL TO OR GREATER-THAN
+22DE;AL;EQUAL TO OR PRECEDES
+22DF;AL;EQUAL TO OR SUCCEEDS
+22E0;AL;DOES NOT PRECEDE OR EQUAL
+22E1;AL;DOES NOT SUCCEED OR EQUAL
+22E2;AL;NOT SQUARE IMAGE OF OR EQUAL TO
+22E3;AL;NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4;AL;SQUARE IMAGE OF OR NOT EQUAL TO
+22E5;AL;SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6;AL;LESS-THAN BUT NOT EQUIVALENT TO
+22E7;AL;GREATER-THAN BUT NOT EQUIVALENT TO
+22E8;AL;PRECEDES BUT NOT EQUIVALENT TO
+22E9;AL;SUCCEEDS BUT NOT EQUIVALENT TO
+22EA;AL;NOT NORMAL SUBGROUP OF
+22EB;AL;DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC;AL;NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED;AL;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22EE;AL;VERTICAL ELLIPSIS
+22EF;AL;MIDLINE HORIZONTAL ELLIPSIS
+22F0;AL;UP RIGHT DIAGONAL ELLIPSIS
+22F1;AL;DOWN RIGHT DIAGONAL ELLIPSIS
+2300;AL;DIAMETER SIGN
+2301;AL;ELECTRIC ARROW
+2302;AL;HOUSE
+2303;AL;UP ARROWHEAD
+2304;AL;DOWN ARROWHEAD
+2305;AL;PROJECTIVE
+2306;AL;PERSPECTIVE
+2307;AL;WAVY LINE
+2308;AL;LEFT CEILING
+2309;AL;RIGHT CEILING
+230A;AL;LEFT FLOOR
+230B;AL;RIGHT FLOOR
+230C;AL;BOTTOM RIGHT CROP
+230D;AL;BOTTOM LEFT CROP
+230E;AL;TOP RIGHT CROP
+230F;AL;TOP LEFT CROP
+2310;AL;REVERSED NOT SIGN
+2311;AL;SQUARE LOZENGE
+2312;AI;ARC
+2313;AL;SEGMENT
+2314;AL;SECTOR
+2315;AL;TELEPHONE RECORDER
+2316;AL;POSITION INDICATOR
+2317;AL;VIEWDATA SQUARE
+2318;AL;PLACE OF INTEREST SIGN
+2319;AL;TURNED NOT SIGN
+231A;AL;WATCH
+231B;AL;HOURGLASS
+231C;AL;TOP LEFT CORNER
+231D;AL;TOP RIGHT CORNER
+231E;AL;BOTTOM LEFT CORNER
+231F;AL;BOTTOM RIGHT CORNER
+2320;AL;TOP HALF INTEGRAL
+2321;AL;BOTTOM HALF INTEGRAL
+2322;AL;FROWN
+2323;AL;SMILE
+2324;AL;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325;AL;OPTION KEY
+2326;AL;ERASE TO THE RIGHT
+2327;AL;X IN A RECTANGLE BOX
+2328;AL;KEYBOARD
+2329;OP;LEFT-POINTING ANGLE BRACKET
+232A;CL;RIGHT-POINTING ANGLE BRACKET
+232B;AL;ERASE TO THE LEFT
+232C;AL;BENZENE RING
+232D;AL;CYLINDRICITY
+232E;AL;ALL AROUND-PROFILE
+232F;AL;SYMMETRY
+2330;AL;TOTAL RUNOUT
+2331;AL;DIMENSION ORIGIN
+2332;AL;CONICAL TAPER
+2333;AL;SLOPE
+2334;AL;COUNTERBORE
+2335;AL;COUNTERSINK
+2336;AL;APL FUNCTIONAL SYMBOL I-BEAM
+2337;AL;APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338;AL;APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339;AL;APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A;AL;APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B;AL;APL FUNCTIONAL SYMBOL QUAD JOT
+233C;AL;APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D;AL;APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E;AL;APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F;AL;APL FUNCTIONAL SYMBOL SLASH BAR
+2340;AL;APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341;AL;APL FUNCTIONAL SYMBOL QUAD SLASH
+2342;AL;APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343;AL;APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344;AL;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345;AL;APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346;AL;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347;AL;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348;AL;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349;AL;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A;AL;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B;AL;APL FUNCTIONAL SYMBOL DELTA STILE
+234C;AL;APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D;AL;APL FUNCTIONAL SYMBOL QUAD DELTA
+234E;AL;APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F;AL;APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350;AL;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351;AL;APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352;AL;APL FUNCTIONAL SYMBOL DEL STILE
+2353;AL;APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354;AL;APL FUNCTIONAL SYMBOL QUAD DEL
+2355;AL;APL FUNCTIONAL SYMBOL UP TACK JOT
+2356;AL;APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357;AL;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358;AL;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359;AL;APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A;AL;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B;AL;APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C;AL;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D;AL;APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E;AL;APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F;AL;APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360;AL;APL FUNCTIONAL SYMBOL QUAD COLON
+2361;AL;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362;AL;APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363;AL;APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364;AL;APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365;AL;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366;AL;APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367;AL;APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368;AL;APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369;AL;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A;AL;APL FUNCTIONAL SYMBOL COMMA BAR
+236B;AL;APL FUNCTIONAL SYMBOL DEL TILDE
+236C;AL;APL FUNCTIONAL SYMBOL ZILDE
+236D;AL;APL FUNCTIONAL SYMBOL STILE TILDE
+236E;AL;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F;AL;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370;AL;APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371;AL;APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372;AL;APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373;AL;APL FUNCTIONAL SYMBOL IOTA
+2374;AL;APL FUNCTIONAL SYMBOL RHO
+2375;AL;APL FUNCTIONAL SYMBOL OMEGA
+2376;AL;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377;AL;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378;AL;APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379;AL;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A;AL;APL FUNCTIONAL SYMBOL ALPHA
+237B;AL;NOT CHECK MARK
+237D;AL;SHOULDERED OPEN BOX
+237E;AL;BELL SYMBOL
+237F;AL;VERTICAL LINE WITH MIDDLE DOT
+2380;AL;INSERTION SYMBOL
+2381;AL;CONTINUOUS UNDERLINE SYMBOL
+2382;AL;DISCONTINUOUS UNDERLINE SYMBOL
+2383;AL;EMPHASIS SYMBOL
+2384;AL;COMPOSITION SYMBOL
+2385;AL;WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386;AL;ENTER SYMBOL
+2387;AL;ALTERNATIVE KEY SYMBOL
+2388;AL;HELM SYMBOL
+2389;AL;CIRCLED HORIZONTAL BAR WITH NOTCH
+238A;AL;CIRCLED TRIANGLE DOWN
+238B;AL;BROKEN CIRCLE WITH NORTHWEST ARROW
+238C;AL;UNDO SYMBOL
+238D;AL;MONOSTABLE SYMBOL
+238E;AL;HYSTERESIS SYMBOL
+238F;AL;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390;AL;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391;AL;PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392;AL;PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393;AL;DIRECT CURRENT SYMBOL FORM TWO
+2394;AL;SOFTWARE-FUNCTION SYMBOL
+2395;AL;APL FUNCTIONAL SYMBOL QUAD
+2396;AL;DECIMAL SEPARATOR KEY SYMBOL
+2397;AL;PREVIOUS PAGE
+2398;AL;NEXT PAGE
+2399;AL;PRINT SCREEN SYMBOL
+239A;AL;CLEAR SCREEN SYMBOL
+2400;AL;SYMBOL FOR NULL
+2401;AL;SYMBOL FOR START OF HEADING
+2402;AL;SYMBOL FOR START OF TEXT
+2403;AL;SYMBOL FOR END OF TEXT
+2404;AL;SYMBOL FOR END OF TRANSMISSION
+2405;AL;SYMBOL FOR ENQUIRY
+2406;AL;SYMBOL FOR ACKNOWLEDGE
+2407;AL;SYMBOL FOR BELL
+2408;AL;SYMBOL FOR BACKSPACE
+2409;AL;SYMBOL FOR HORIZONTAL TABULATION
+240A;AL;SYMBOL FOR LINE FEED
+240B;AL;SYMBOL FOR VERTICAL TABULATION
+240C;AL;SYMBOL FOR FORM FEED
+240D;AL;SYMBOL FOR CARRIAGE RETURN
+240E;AL;SYMBOL FOR SHIFT OUT
+240F;AL;SYMBOL FOR SHIFT IN
+2410;AL;SYMBOL FOR DATA LINK ESCAPE
+2411;AL;SYMBOL FOR DEVICE CONTROL ONE
+2412;AL;SYMBOL FOR DEVICE CONTROL TWO
+2413;AL;SYMBOL FOR DEVICE CONTROL THREE
+2414;AL;SYMBOL FOR DEVICE CONTROL FOUR
+2415;AL;SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416;AL;SYMBOL FOR SYNCHRONOUS IDLE
+2417;AL;SYMBOL FOR END OF TRANSMISSION BLOCK
+2418;AL;SYMBOL FOR CANCEL
+2419;AL;SYMBOL FOR END OF MEDIUM
+241A;AL;SYMBOL FOR SUBSTITUTE
+241B;AL;SYMBOL FOR ESCAPE
+241C;AL;SYMBOL FOR FILE SEPARATOR
+241D;AL;SYMBOL FOR GROUP SEPARATOR
+241E;AL;SYMBOL FOR RECORD SEPARATOR
+241F;AL;SYMBOL FOR UNIT SEPARATOR
+2420;AL;SYMBOL FOR SPACE
+2421;AL;SYMBOL FOR DELETE
+2422;AL;BLANK SYMBOL
+2423;AL;OPEN BOX
+2424;AL;SYMBOL FOR NEWLINE
+2425;AL;SYMBOL FOR DELETE FORM TWO
+2426;AL;SYMBOL FOR SUBSTITUTE FORM TWO
+2440;AL;OCR HOOK
+2441;AL;OCR CHAIR
+2442;AL;OCR FORK
+2443;AL;OCR INVERTED FORK
+2444;AL;OCR BELT BUCKLE
+2445;AL;OCR BOW TIE
+2446;AL;OCR BRANCH BANK IDENTIFICATION
+2447;AL;OCR AMOUNT OF CHECK
+2448;AL;OCR DASH
+2449;AL;OCR CUSTOMER ACCOUNT NUMBER
+244A;AL;OCR DOUBLE BACKSLASH
+2460;AI;CIRCLED DIGIT ONE
+2461;AI;CIRCLED DIGIT TWO
+2462;AI;CIRCLED DIGIT THREE
+2463;AI;CIRCLED DIGIT FOUR
+2464;AI;CIRCLED DIGIT FIVE
+2465;AI;CIRCLED DIGIT SIX
+2466;AI;CIRCLED DIGIT SEVEN
+2467;AI;CIRCLED DIGIT EIGHT
+2468;AI;CIRCLED DIGIT NINE
+2469;AI;CIRCLED NUMBER TEN
+246A;AI;CIRCLED NUMBER ELEVEN
+246B;AI;CIRCLED NUMBER TWELVE
+246C;AI;CIRCLED NUMBER THIRTEEN
+246D;AI;CIRCLED NUMBER FOURTEEN
+246E;AI;CIRCLED NUMBER FIFTEEN
+246F;AI;CIRCLED NUMBER SIXTEEN
+2470;AI;CIRCLED NUMBER SEVENTEEN
+2471;AI;CIRCLED NUMBER EIGHTEEN
+2472;AI;CIRCLED NUMBER NINETEEN
+2473;AI;CIRCLED NUMBER TWENTY
+2474;AI;PARENTHESIZED DIGIT ONE
+2475;AI;PARENTHESIZED DIGIT TWO
+2476;AI;PARENTHESIZED DIGIT THREE
+2477;AI;PARENTHESIZED DIGIT FOUR
+2478;AI;PARENTHESIZED DIGIT FIVE
+2479;AI;PARENTHESIZED DIGIT SIX
+247A;AI;PARENTHESIZED DIGIT SEVEN
+247B;AI;PARENTHESIZED DIGIT EIGHT
+247C;AI;PARENTHESIZED DIGIT NINE
+247D;AI;PARENTHESIZED NUMBER TEN
+247E;AI;PARENTHESIZED NUMBER ELEVEN
+247F;AI;PARENTHESIZED NUMBER TWELVE
+2480;AI;PARENTHESIZED NUMBER THIRTEEN
+2481;AI;PARENTHESIZED NUMBER FOURTEEN
+2482;AI;PARENTHESIZED NUMBER FIFTEEN
+2483;AI;PARENTHESIZED NUMBER SIXTEEN
+2484;AI;PARENTHESIZED NUMBER SEVENTEEN
+2485;AI;PARENTHESIZED NUMBER EIGHTEEN
+2486;AI;PARENTHESIZED NUMBER NINETEEN
+2487;AI;PARENTHESIZED NUMBER TWENTY
+2488;AI;DIGIT ONE FULL STOP
+2489;AI;DIGIT TWO FULL STOP
+248A;AI;DIGIT THREE FULL STOP
+248B;AI;DIGIT FOUR FULL STOP
+248C;AI;DIGIT FIVE FULL STOP
+248D;AI;DIGIT SIX FULL STOP
+248E;AI;DIGIT SEVEN FULL STOP
+248F;AI;DIGIT EIGHT FULL STOP
+2490;AI;DIGIT NINE FULL STOP
+2491;AI;NUMBER TEN FULL STOP
+2492;AI;NUMBER ELEVEN FULL STOP
+2493;AI;NUMBER TWELVE FULL STOP
+2494;AI;NUMBER THIRTEEN FULL STOP
+2495;AI;NUMBER FOURTEEN FULL STOP
+2496;AI;NUMBER FIFTEEN FULL STOP
+2497;AI;NUMBER SIXTEEN FULL STOP
+2498;AI;NUMBER SEVENTEEN FULL STOP
+2499;AI;NUMBER EIGHTEEN FULL STOP
+249A;AI;NUMBER NINETEEN FULL STOP
+249B;AI;NUMBER TWENTY FULL STOP
+249C;AI;PARENTHESIZED LATIN SMALL LETTER A
+249D;AI;PARENTHESIZED LATIN SMALL LETTER B
+249E;AI;PARENTHESIZED LATIN SMALL LETTER C
+249F;AI;PARENTHESIZED LATIN SMALL LETTER D
+24A0;AI;PARENTHESIZED LATIN SMALL LETTER E
+24A1;AI;PARENTHESIZED LATIN SMALL LETTER F
+24A2;AI;PARENTHESIZED LATIN SMALL LETTER G
+24A3;AI;PARENTHESIZED LATIN SMALL LETTER H
+24A4;AI;PARENTHESIZED LATIN SMALL LETTER I
+24A5;AI;PARENTHESIZED LATIN SMALL LETTER J
+24A6;AI;PARENTHESIZED LATIN SMALL LETTER K
+24A7;AI;PARENTHESIZED LATIN SMALL LETTER L
+24A8;AI;PARENTHESIZED LATIN SMALL LETTER M
+24A9;AI;PARENTHESIZED LATIN SMALL LETTER N
+24AA;AI;PARENTHESIZED LATIN SMALL LETTER O
+24AB;AI;PARENTHESIZED LATIN SMALL LETTER P
+24AC;AI;PARENTHESIZED LATIN SMALL LETTER Q
+24AD;AI;PARENTHESIZED LATIN SMALL LETTER R
+24AE;AI;PARENTHESIZED LATIN SMALL LETTER S
+24AF;AI;PARENTHESIZED LATIN SMALL LETTER T
+24B0;AI;PARENTHESIZED LATIN SMALL LETTER U
+24B1;AI;PARENTHESIZED LATIN SMALL LETTER V
+24B2;AI;PARENTHESIZED LATIN SMALL LETTER W
+24B3;AI;PARENTHESIZED LATIN SMALL LETTER X
+24B4;AI;PARENTHESIZED LATIN SMALL LETTER Y
+24B5;AI;PARENTHESIZED LATIN SMALL LETTER Z
+24B6;AI;CIRCLED LATIN CAPITAL LETTER A
+24B7;AI;CIRCLED LATIN CAPITAL LETTER B
+24B8;AI;CIRCLED LATIN CAPITAL LETTER C
+24B9;AI;CIRCLED LATIN CAPITAL LETTER D
+24BA;AI;CIRCLED LATIN CAPITAL LETTER E
+24BB;AI;CIRCLED LATIN CAPITAL LETTER F
+24BC;AI;CIRCLED LATIN CAPITAL LETTER G
+24BD;AI;CIRCLED LATIN CAPITAL LETTER H
+24BE;AI;CIRCLED LATIN CAPITAL LETTER I
+24BF;AI;CIRCLED LATIN CAPITAL LETTER J
+24C0;AL;CIRCLED LATIN CAPITAL LETTER K
+24C1;AL;CIRCLED LATIN CAPITAL LETTER L
+24C2;AL;CIRCLED LATIN CAPITAL LETTER M
+24C3;AL;CIRCLED LATIN CAPITAL LETTER N
+24C4;AL;CIRCLED LATIN CAPITAL LETTER O
+24C5;AL;CIRCLED LATIN CAPITAL LETTER P
+24C6;AL;CIRCLED LATIN CAPITAL LETTER Q
+24C7;AL;CIRCLED LATIN CAPITAL LETTER R
+24C8;AL;CIRCLED LATIN CAPITAL LETTER S
+24C9;AL;CIRCLED LATIN CAPITAL LETTER T
+24CA;AL;CIRCLED LATIN CAPITAL LETTER U
+24CB;AL;CIRCLED LATIN CAPITAL LETTER V
+24CC;AL;CIRCLED LATIN CAPITAL LETTER W
+24CD;AL;CIRCLED LATIN CAPITAL LETTER X
+24CE;AL;CIRCLED LATIN CAPITAL LETTER Y
+24CF;AL;CIRCLED LATIN CAPITAL LETTER Z
+24D0;AI;CIRCLED LATIN SMALL LETTER A
+24D1;AI;CIRCLED LATIN SMALL LETTER B
+24D2;AI;CIRCLED LATIN SMALL LETTER C
+24D3;AI;CIRCLED LATIN SMALL LETTER D
+24D4;AI;CIRCLED LATIN SMALL LETTER E
+24D5;AI;CIRCLED LATIN SMALL LETTER F
+24D6;AI;CIRCLED LATIN SMALL LETTER G
+24D7;AI;CIRCLED LATIN SMALL LETTER H
+24D8;AI;CIRCLED LATIN SMALL LETTER I
+24D9;AI;CIRCLED LATIN SMALL LETTER J
+24DA;AI;CIRCLED LATIN SMALL LETTER K
+24DB;AI;CIRCLED LATIN SMALL LETTER L
+24DC;AI;CIRCLED LATIN SMALL LETTER M
+24DD;AI;CIRCLED LATIN SMALL LETTER N
+24DE;AI;CIRCLED LATIN SMALL LETTER O
+24DF;AI;CIRCLED LATIN SMALL LETTER P
+24E0;AI;CIRCLED LATIN SMALL LETTER Q
+24E1;AI;CIRCLED LATIN SMALL LETTER R
+24E2;AI;CIRCLED LATIN SMALL LETTER S
+24E3;AI;CIRCLED LATIN SMALL LETTER T
+24E4;AI;CIRCLED LATIN SMALL LETTER U
+24E5;AI;CIRCLED LATIN SMALL LETTER V
+24E6;AI;CIRCLED LATIN SMALL LETTER W
+24E7;AI;CIRCLED LATIN SMALL LETTER X
+24E8;AI;CIRCLED LATIN SMALL LETTER Y
+24E9;AI;CIRCLED LATIN SMALL LETTER Z
+24EA;AL;CIRCLED DIGIT ZERO
+2500;AI;BOX DRAWINGS LIGHT HORIZONTAL
+2501;AI;BOX DRAWINGS HEAVY HORIZONTAL
+2502;AI;BOX DRAWINGS LIGHT VERTICAL
+2503;AI;BOX DRAWINGS HEAVY VERTICAL
+2504;AI;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505;AI;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506;AI;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507;AI;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508;AI;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509;AI;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A;AI;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B;AI;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C;AI;BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D;AI;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E;AI;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F;AI;BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510;AI;BOX DRAWINGS LIGHT DOWN AND LEFT
+2511;AI;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512;AI;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513;AI;BOX DRAWINGS HEAVY DOWN AND LEFT
+2514;AI;BOX DRAWINGS LIGHT UP AND RIGHT
+2515;AI;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516;AI;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517;AI;BOX DRAWINGS HEAVY UP AND RIGHT
+2518;AI;BOX DRAWINGS LIGHT UP AND LEFT
+2519;AI;BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A;AI;BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B;AI;BOX DRAWINGS HEAVY UP AND LEFT
+251C;AI;BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D;AI;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E;AI;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F;AI;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520;AI;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521;AI;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522;AI;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523;AI;BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524;AI;BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525;AI;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526;AI;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527;AI;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528;AI;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529;AI;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A;AI;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B;AI;BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C;AI;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D;AI;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E;AI;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F;AI;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530;AI;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531;AI;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532;AI;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533;AI;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534;AI;BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535;AI;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536;AI;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537;AI;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538;AI;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539;AI;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A;AI;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B;AI;BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C;AI;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D;AI;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E;AI;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F;AI;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540;AI;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541;AI;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542;AI;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543;AI;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544;AI;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545;AI;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546;AI;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547;AI;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548;AI;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549;AI;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A;AI;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B;AI;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C;AL;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D;AL;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E;AL;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F;AL;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550;AI;BOX DRAWINGS DOUBLE HORIZONTAL
+2551;AI;BOX DRAWINGS DOUBLE VERTICAL
+2552;AI;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553;AI;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554;AI;BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555;AI;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556;AI;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557;AI;BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558;AI;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559;AI;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A;AI;BOX DRAWINGS DOUBLE UP AND RIGHT
+255B;AI;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C;AI;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D;AI;BOX DRAWINGS DOUBLE UP AND LEFT
+255E;AI;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F;AI;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560;AI;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561;AI;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562;AI;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563;AI;BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564;AI;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565;AI;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566;AI;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567;AI;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568;AI;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569;AI;BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A;AI;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B;AI;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C;AI;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D;AI;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E;AI;BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F;AI;BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570;AI;BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571;AI;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572;AI;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573;AI;BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574;AI;BOX DRAWINGS LIGHT LEFT
+2575;AL;BOX DRAWINGS LIGHT UP
+2576;AL;BOX DRAWINGS LIGHT RIGHT
+2577;AL;BOX DRAWINGS LIGHT DOWN
+2578;AL;BOX DRAWINGS HEAVY LEFT
+2579;AL;BOX DRAWINGS HEAVY UP
+257A;AL;BOX DRAWINGS HEAVY RIGHT
+257B;AL;BOX DRAWINGS HEAVY DOWN
+257C;AL;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D;AL;BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E;AL;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F;AL;BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580;AI;UPPER HALF BLOCK
+2581;AI;LOWER ONE EIGHTH BLOCK
+2582;AI;LOWER ONE QUARTER BLOCK
+2583;AI;LOWER THREE EIGHTHS BLOCK
+2584;AI;LOWER HALF BLOCK
+2585;AI;LOWER FIVE EIGHTHS BLOCK
+2586;AI;LOWER THREE QUARTERS BLOCK
+2587;AI;LOWER SEVEN EIGHTHS BLOCK
+2588;AI;FULL BLOCK
+2589;AI;LEFT SEVEN EIGHTHS BLOCK
+258A;AI;LEFT THREE QUARTERS BLOCK
+258B;AI;LEFT FIVE EIGHTHS BLOCK
+258C;AI;LEFT HALF BLOCK
+258D;AI;LEFT THREE EIGHTHS BLOCK
+258E;AI;LEFT ONE QUARTER BLOCK
+258F;AI;LEFT ONE EIGHTH BLOCK
+2590;AL;RIGHT HALF BLOCK
+2591;AL;LIGHT SHADE
+2592;AI;MEDIUM SHADE
+2593;AI;DARK SHADE
+2594;AI;UPPER ONE EIGHTH BLOCK
+2595;AI;RIGHT ONE EIGHTH BLOCK
+25A0;AI;BLACK SQUARE
+25A1;AI;WHITE SQUARE
+25A2;AL;WHITE SQUARE WITH ROUNDED CORNERS
+25A3;AI;WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4;AI;SQUARE WITH HORIZONTAL FILL
+25A5;AI;SQUARE WITH VERTICAL FILL
+25A6;AI;SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7;AI;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8;AI;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9;AI;SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA;AL;BLACK SMALL SQUARE
+25AB;AL;WHITE SMALL SQUARE
+25AC;AL;BLACK RECTANGLE
+25AD;AL;WHITE RECTANGLE
+25AE;AL;BLACK VERTICAL RECTANGLE
+25AF;AL;WHITE VERTICAL RECTANGLE
+25B0;AL;BLACK PARALLELOGRAM
+25B1;AL;WHITE PARALLELOGRAM
+25B2;AI;BLACK UP-POINTING TRIANGLE
+25B3;AI;WHITE UP-POINTING TRIANGLE
+25B4;AL;BLACK UP-POINTING SMALL TRIANGLE
+25B5;AL;WHITE UP-POINTING SMALL TRIANGLE
+25B6;AI;BLACK RIGHT-POINTING TRIANGLE
+25B7;AI;WHITE RIGHT-POINTING TRIANGLE
+25B8;AL;BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9;AL;WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA;AL;BLACK RIGHT-POINTING POINTER
+25BB;AL;WHITE RIGHT-POINTING POINTER
+25BC;AI;BLACK DOWN-POINTING TRIANGLE
+25BD;AI;WHITE DOWN-POINTING TRIANGLE
+25BE;AL;BLACK DOWN-POINTING SMALL TRIANGLE
+25BF;AL;WHITE DOWN-POINTING SMALL TRIANGLE
+25C0;AI;BLACK LEFT-POINTING TRIANGLE
+25C1;AI;WHITE LEFT-POINTING TRIANGLE
+25C2;AL;BLACK LEFT-POINTING SMALL TRIANGLE
+25C3;AL;WHITE LEFT-POINTING SMALL TRIANGLE
+25C4;AL;BLACK LEFT-POINTING POINTER
+25C5;AL;WHITE LEFT-POINTING POINTER
+25C6;AI;BLACK DIAMOND
+25C7;AI;WHITE DIAMOND
+25C8;AL;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9;AL;FISHEYE
+25CA;AL;LOZENGE
+25CB;AI;WHITE CIRCLE
+25CC;AL;DOTTED CIRCLE
+25CD;AL;CIRCLE WITH VERTICAL FILL
+25CE;AI;BULLSEYE
+25CF;AI;BLACK CIRCLE
+25D0;AI;CIRCLE WITH LEFT HALF BLACK
+25D1;AI;CIRCLE WITH RIGHT HALF BLACK
+25D2;AL;CIRCLE WITH LOWER HALF BLACK
+25D3;AL;CIRCLE WITH UPPER HALF BLACK
+25D4;AL;CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5;AL;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6;AL;LEFT HALF BLACK CIRCLE
+25D7;AL;RIGHT HALF BLACK CIRCLE
+25D8;AL;INVERSE BULLET
+25D9;AL;INVERSE WHITE CIRCLE
+25DA;AL;UPPER HALF INVERSE WHITE CIRCLE
+25DB;AL;LOWER HALF INVERSE WHITE CIRCLE
+25DC;AL;UPPER LEFT QUADRANT CIRCULAR ARC
+25DD;AL;UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE;AL;LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF;AL;LOWER LEFT QUADRANT CIRCULAR ARC
+25E0;AL;UPPER HALF CIRCLE
+25E1;AL;LOWER HALF CIRCLE
+25E2;AI;BLACK LOWER RIGHT TRIANGLE
+25E3;AI;BLACK LOWER LEFT TRIANGLE
+25E4;AI;BLACK UPPER LEFT TRIANGLE
+25E5;AI;BLACK UPPER RIGHT TRIANGLE
+25E6;AL;WHITE BULLET
+25E7;AL;SQUARE WITH LEFT HALF BLACK
+25E8;AL;SQUARE WITH RIGHT HALF BLACK
+25E9;AL;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA;AL;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB;AL;WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC;AL;WHITE UP-POINTING TRIANGLE WITH DOT
+25ED;AL;UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE;AL;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF;AI;LARGE CIRCLE
+25F0;AL;WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1;AL;WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2;AL;WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3;AL;WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4;AL;WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5;AL;WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6;AL;WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7;AL;WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+2600;AL;BLACK SUN WITH RAYS
+2601;AL;CLOUD
+2602;AL;UMBRELLA
+2603;AL;SNOWMAN
+2604;AL;COMET
+2605;AI;BLACK STAR
+2606;AI;WHITE STAR
+2607;AL;LIGHTNING
+2608;AL;THUNDERSTORM
+2609;AI;SUN
+260A;AL;ASCENDING NODE
+260B;AL;DESCENDING NODE
+260C;AL;CONJUNCTION
+260D;AL;OPPOSITION
+260E;AI;BLACK TELEPHONE
+260F;AI;WHITE TELEPHONE
+2610;AL;BALLOT BOX
+2611;AL;BALLOT BOX WITH CHECK
+2612;AL;BALLOT BOX WITH X
+2613;AL;SALTIRE
+2619;AL;REVERSED ROTATED FLORAL HEART BULLET
+261A;AL;BLACK LEFT POINTING INDEX
+261B;AL;BLACK RIGHT POINTING INDEX
+261C;AI;WHITE LEFT POINTING INDEX
+261D;AL;WHITE UP POINTING INDEX
+261E;AI;WHITE RIGHT POINTING INDEX
+261F;AL;WHITE DOWN POINTING INDEX
+2620;AL;SKULL AND CROSSBONES
+2621;AL;CAUTION SIGN
+2622;AL;RADIOACTIVE SIGN
+2623;AL;BIOHAZARD SIGN
+2624;AL;CADUCEUS
+2625;AL;ANKH
+2626;AL;ORTHODOX CROSS
+2627;AL;CHI RHO
+2628;AL;CROSS OF LORRAINE
+2629;AL;CROSS OF JERUSALEM
+262A;AL;STAR AND CRESCENT
+262B;AL;FARSI SYMBOL
+262C;AL;ADI SHAKTI
+262D;AL;HAMMER AND SICKLE
+262E;AL;PEACE SYMBOL
+262F;AL;YIN YANG
+2630;AL;TRIGRAM FOR HEAVEN
+2631;AL;TRIGRAM FOR LAKE
+2632;AL;TRIGRAM FOR FIRE
+2633;AL;TRIGRAM FOR THUNDER
+2634;AL;TRIGRAM FOR WIND
+2635;AL;TRIGRAM FOR WATER
+2636;AL;TRIGRAM FOR MOUNTAIN
+2637;AL;TRIGRAM FOR EARTH
+2638;AL;WHEEL OF DHARMA
+2639;AL;WHITE FROWNING FACE
+263A;AL;WHITE SMILING FACE
+263B;AL;BLACK SMILING FACE
+263C;AL;WHITE SUN WITH RAYS
+263D;AL;FIRST QUARTER MOON
+263E;AL;LAST QUARTER MOON
+263F;AL;MERCURY
+2640;AI;FEMALE SIGN
+2641;AL;EARTH
+2642;AI;MALE SIGN
+2643;AL;JUPITER
+2644;AL;SATURN
+2645;AL;URANUS
+2646;AL;NEPTUNE
+2647;AL;PLUTO
+2648;AL;ARIES
+2649;AL;TAURUS
+264A;AL;GEMINI
+264B;AL;CANCER
+264C;AL;LEO
+264D;AL;VIRGO
+264E;AL;LIBRA
+264F;AL;SCORPIUS
+2650;AL;SAGITTARIUS
+2651;AL;CAPRICORN
+2652;AL;AQUARIUS
+2653;AL;PISCES
+2654;AL;WHITE CHESS KING
+2655;AL;WHITE CHESS QUEEN
+2656;AL;WHITE CHESS ROOK
+2657;AL;WHITE CHESS BISHOP
+2658;AL;WHITE CHESS KNIGHT
+2659;AL;WHITE CHESS PAWN
+265A;AL;BLACK CHESS KING
+265B;AL;BLACK CHESS QUEEN
+265C;AL;BLACK CHESS ROOK
+265D;AL;BLACK CHESS BISHOP
+265E;AL;BLACK CHESS KNIGHT
+265F;AL;BLACK CHESS PAWN
+2660;AI;BLACK SPADE SUIT
+2661;AI;WHITE HEART SUIT
+2662;AL;WHITE DIAMOND SUIT
+2663;AI;BLACK CLUB SUIT
+2664;AI;WHITE SPADE SUIT
+2665;AI;BLACK HEART SUIT
+2666;AL;BLACK DIAMOND SUIT
+2667;AI;WHITE CLUB SUIT
+2668;AI;HOT SPRINGS
+2669;AI;QUARTER NOTE
+266A;AI;EIGHTH NOTE
+266B;AL;BEAMED EIGHTH NOTES
+266C;AI;BEAMED SIXTEENTH NOTES
+266D;AI;MUSIC FLAT SIGN
+266E;AL;MUSIC NATURAL SIGN
+266F;AI;MUSIC SHARP SIGN
+2670;AL;WEST SYRIAC CROSS
+2671;AL;EAST SYRIAC CROSS
+2701;AL;UPPER BLADE SCISSORS
+2702;AL;BLACK SCISSORS
+2703;AL;LOWER BLADE SCISSORS
+2704;AL;WHITE SCISSORS
+2706;AL;TELEPHONE LOCATION SIGN
+2707;AL;TAPE DRIVE
+2708;AL;AIRPLANE
+2709;AL;ENVELOPE
+270C;AL;VICTORY HAND
+270D;AL;WRITING HAND
+270E;AL;LOWER RIGHT PENCIL
+270F;AL;PENCIL
+2710;AL;UPPER RIGHT PENCIL
+2711;AL;WHITE NIB
+2712;AL;BLACK NIB
+2713;AL;CHECK MARK
+2714;AL;HEAVY CHECK MARK
+2715;AL;MULTIPLICATION X
+2716;AL;HEAVY MULTIPLICATION X
+2717;AL;BALLOT X
+2718;AL;HEAVY BALLOT X
+2719;AL;OUTLINED GREEK CROSS
+271A;AL;HEAVY GREEK CROSS
+271B;AL;OPEN CENTRE CROSS
+271C;AL;HEAVY OPEN CENTRE CROSS
+271D;AL;LATIN CROSS
+271E;AL;SHADOWED WHITE LATIN CROSS
+271F;AL;OUTLINED LATIN CROSS
+2720;AL;MALTESE CROSS
+2721;AL;STAR OF DAVID
+2722;AL;FOUR TEARDROP-SPOKED ASTERISK
+2723;AL;FOUR BALLOON-SPOKED ASTERISK
+2724;AL;HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725;AL;FOUR CLUB-SPOKED ASTERISK
+2726;AL;BLACK FOUR POINTED STAR
+2727;AL;WHITE FOUR POINTED STAR
+2729;AL;STRESS OUTLINED WHITE STAR
+272A;AL;CIRCLED WHITE STAR
+272B;AL;OPEN CENTRE BLACK STAR
+272C;AL;BLACK CENTRE WHITE STAR
+272D;AL;OUTLINED BLACK STAR
+272E;AL;HEAVY OUTLINED BLACK STAR
+272F;AL;PINWHEEL STAR
+2730;AL;SHADOWED WHITE STAR
+2731;AL;HEAVY ASTERISK
+2732;AL;OPEN CENTRE ASTERISK
+2733;AL;EIGHT SPOKED ASTERISK
+2734;AL;EIGHT POINTED BLACK STAR
+2735;AL;EIGHT POINTED PINWHEEL STAR
+2736;AL;SIX POINTED BLACK STAR
+2737;AL;EIGHT POINTED RECTILINEAR BLACK STAR
+2738;AL;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739;AL;TWELVE POINTED BLACK STAR
+273A;AL;SIXTEEN POINTED ASTERISK
+273B;AL;TEARDROP-SPOKED ASTERISK
+273C;AL;OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D;AL;HEAVY TEARDROP-SPOKED ASTERISK
+273E;AL;SIX PETALLED BLACK AND WHITE FLORETTE
+273F;AL;BLACK FLORETTE
+2740;AL;WHITE FLORETTE
+2741;AL;EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742;AL;CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743;AL;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744;AL;SNOWFLAKE
+2745;AL;TIGHT TRIFOLIATE SNOWFLAKE
+2746;AL;HEAVY CHEVRON SNOWFLAKE
+2747;AL;SPARKLE
+2748;AL;HEAVY SPARKLE
+2749;AL;BALLOON-SPOKED ASTERISK
+274A;AL;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B;AL;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D;AL;SHADOWED WHITE CIRCLE
+274F;AL;LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750;AL;UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751;AL;LOWER RIGHT SHADOWED WHITE SQUARE
+2752;AL;UPPER RIGHT SHADOWED WHITE SQUARE
+2756;AL;BLACK DIAMOND MINUS WHITE X
+2758;AL;LIGHT VERTICAL BAR
+2759;AL;MEDIUM VERTICAL BAR
+275A;AL;HEAVY VERTICAL BAR
+275B;AL;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C;AL;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D;AL;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E;AL;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761;AL;CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762;AL;HEAVY EXCLAMATION MARK ORNAMENT
+2763;AL;HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764;AL;HEAVY BLACK HEART
+2765;AL;ROTATED HEAVY BLACK HEART BULLET
+2766;AL;FLORAL HEART
+2767;AL;ROTATED FLORAL HEART BULLET
+2776;AL;DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777;AL;DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778;AL;DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779;AL;DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A;AL;DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B;AL;DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C;AL;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D;AL;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E;AL;DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F;AL;DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780;AL;DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781;AL;DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782;AL;DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783;AL;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784;AL;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785;AL;DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786;AL;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787;AL;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788;AL;DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789;AL;DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793;AL;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794;AL;HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798;AL;HEAVY SOUTH EAST ARROW
+2799;AL;HEAVY RIGHTWARDS ARROW
+279A;AL;HEAVY NORTH EAST ARROW
+279B;AL;DRAFTING POINT RIGHTWARDS ARROW
+279C;AL;HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D;AL;TRIANGLE-HEADED RIGHTWARDS ARROW
+279E;AL;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F;AL;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0;AL;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1;AL;BLACK RIGHTWARDS ARROW
+27A2;AL;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3;AL;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4;AL;BLACK RIGHTWARDS ARROWHEAD
+27A5;AL;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6;AL;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7;AL;SQUAT BLACK RIGHTWARDS ARROW
+27A8;AL;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9;AL;RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA;AL;LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB;AL;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC;AL;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD;AL;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE;AL;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF;AL;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1;AL;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2;AL;CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3;AL;WHITE-FEATHERED RIGHTWARDS ARROW
+27B4;AL;BLACK-FEATHERED SOUTH EAST ARROW
+27B5;AL;BLACK-FEATHERED RIGHTWARDS ARROW
+27B6;AL;BLACK-FEATHERED NORTH EAST ARROW
+27B7;AL;HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8;AL;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9;AL;HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA;AL;TEARDROP-BARBED RIGHTWARDS ARROW
+27BB;AL;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC;AL;WEDGE-TAILED RIGHTWARDS ARROW
+27BD;AL;HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE;AL;OPEN-OUTLINED RIGHTWARDS ARROW
+2800;AL;BRAILLE PATTERN BLANK
+2801;AL;BRAILLE PATTERN DOTS-1
+2802;AL;BRAILLE PATTERN DOTS-2
+2803;AL;BRAILLE PATTERN DOTS-12
+2804;AL;BRAILLE PATTERN DOTS-3
+2805;AL;BRAILLE PATTERN DOTS-13
+2806;AL;BRAILLE PATTERN DOTS-23
+2807;AL;BRAILLE PATTERN DOTS-123
+2808;AL;BRAILLE PATTERN DOTS-4
+2809;AL;BRAILLE PATTERN DOTS-14
+280A;AL;BRAILLE PATTERN DOTS-24
+280B;AL;BRAILLE PATTERN DOTS-124
+280C;AL;BRAILLE PATTERN DOTS-34
+280D;AL;BRAILLE PATTERN DOTS-134
+280E;AL;BRAILLE PATTERN DOTS-234
+280F;AL;BRAILLE PATTERN DOTS-1234
+2810;AL;BRAILLE PATTERN DOTS-5
+2811;AL;BRAILLE PATTERN DOTS-15
+2812;AL;BRAILLE PATTERN DOTS-25
+2813;AL;BRAILLE PATTERN DOTS-125
+2814;AL;BRAILLE PATTERN DOTS-35
+2815;AL;BRAILLE PATTERN DOTS-135
+2816;AL;BRAILLE PATTERN DOTS-235
+2817;AL;BRAILLE PATTERN DOTS-1235
+2818;AL;BRAILLE PATTERN DOTS-45
+2819;AL;BRAILLE PATTERN DOTS-145
+281A;AL;BRAILLE PATTERN DOTS-245
+281B;AL;BRAILLE PATTERN DOTS-1245
+281C;AL;BRAILLE PATTERN DOTS-345
+281D;AL;BRAILLE PATTERN DOTS-1345
+281E;AL;BRAILLE PATTERN DOTS-2345
+281F;AL;BRAILLE PATTERN DOTS-12345
+2820;AL;BRAILLE PATTERN DOTS-6
+2821;AL;BRAILLE PATTERN DOTS-16
+2822;AL;BRAILLE PATTERN DOTS-26
+2823;AL;BRAILLE PATTERN DOTS-126
+2824;AL;BRAILLE PATTERN DOTS-36
+2825;AL;BRAILLE PATTERN DOTS-136
+2826;AL;BRAILLE PATTERN DOTS-236
+2827;AL;BRAILLE PATTERN DOTS-1236
+2828;AL;BRAILLE PATTERN DOTS-46
+2829;AL;BRAILLE PATTERN DOTS-146
+282A;AL;BRAILLE PATTERN DOTS-246
+282B;AL;BRAILLE PATTERN DOTS-1246
+282C;AL;BRAILLE PATTERN DOTS-346
+282D;AL;BRAILLE PATTERN DOTS-1346
+282E;AL;BRAILLE PATTERN DOTS-2346
+282F;AL;BRAILLE PATTERN DOTS-12346
+2830;AL;BRAILLE PATTERN DOTS-56
+2831;AL;BRAILLE PATTERN DOTS-156
+2832;AL;BRAILLE PATTERN DOTS-256
+2833;AL;BRAILLE PATTERN DOTS-1256
+2834;AL;BRAILLE PATTERN DOTS-356
+2835;AL;BRAILLE PATTERN DOTS-1356
+2836;AL;BRAILLE PATTERN DOTS-2356
+2837;AL;BRAILLE PATTERN DOTS-12356
+2838;AL;BRAILLE PATTERN DOTS-456
+2839;AL;BRAILLE PATTERN DOTS-1456
+283A;AL;BRAILLE PATTERN DOTS-2456
+283B;AL;BRAILLE PATTERN DOTS-12456
+283C;AL;BRAILLE PATTERN DOTS-3456
+283D;AL;BRAILLE PATTERN DOTS-13456
+283E;AL;BRAILLE PATTERN DOTS-23456
+283F;AL;BRAILLE PATTERN DOTS-123456
+2840;AL;BRAILLE PATTERN DOTS-7
+2841;AL;BRAILLE PATTERN DOTS-17
+2842;AL;BRAILLE PATTERN DOTS-27
+2843;AL;BRAILLE PATTERN DOTS-127
+2844;AL;BRAILLE PATTERN DOTS-37
+2845;AL;BRAILLE PATTERN DOTS-137
+2846;AL;BRAILLE PATTERN DOTS-237
+2847;AL;BRAILLE PATTERN DOTS-1237
+2848;AL;BRAILLE PATTERN DOTS-47
+2849;AL;BRAILLE PATTERN DOTS-147
+284A;AL;BRAILLE PATTERN DOTS-247
+284B;AL;BRAILLE PATTERN DOTS-1247
+284C;AL;BRAILLE PATTERN DOTS-347
+284D;AL;BRAILLE PATTERN DOTS-1347
+284E;AL;BRAILLE PATTERN DOTS-2347
+284F;AL;BRAILLE PATTERN DOTS-12347
+2850;AL;BRAILLE PATTERN DOTS-57
+2851;AL;BRAILLE PATTERN DOTS-157
+2852;AL;BRAILLE PATTERN DOTS-257
+2853;AL;BRAILLE PATTERN DOTS-1257
+2854;AL;BRAILLE PATTERN DOTS-357
+2855;AL;BRAILLE PATTERN DOTS-1357
+2856;AL;BRAILLE PATTERN DOTS-2357
+2857;AL;BRAILLE PATTERN DOTS-12357
+2858;AL;BRAILLE PATTERN DOTS-457
+2859;AL;BRAILLE PATTERN DOTS-1457
+285A;AL;BRAILLE PATTERN DOTS-2457
+285B;AL;BRAILLE PATTERN DOTS-12457
+285C;AL;BRAILLE PATTERN DOTS-3457
+285D;AL;BRAILLE PATTERN DOTS-13457
+285E;AL;BRAILLE PATTERN DOTS-23457
+285F;AL;BRAILLE PATTERN DOTS-123457
+2860;AL;BRAILLE PATTERN DOTS-67
+2861;AL;BRAILLE PATTERN DOTS-167
+2862;AL;BRAILLE PATTERN DOTS-267
+2863;AL;BRAILLE PATTERN DOTS-1267
+2864;AL;BRAILLE PATTERN DOTS-367
+2865;AL;BRAILLE PATTERN DOTS-1367
+2866;AL;BRAILLE PATTERN DOTS-2367
+2867;AL;BRAILLE PATTERN DOTS-12367
+2868;AL;BRAILLE PATTERN DOTS-467
+2869;AL;BRAILLE PATTERN DOTS-1467
+286A;AL;BRAILLE PATTERN DOTS-2467
+286B;AL;BRAILLE PATTERN DOTS-12467
+286C;AL;BRAILLE PATTERN DOTS-3467
+286D;AL;BRAILLE PATTERN DOTS-13467
+286E;AL;BRAILLE PATTERN DOTS-23467
+286F;AL;BRAILLE PATTERN DOTS-123467
+2870;AL;BRAILLE PATTERN DOTS-567
+2871;AL;BRAILLE PATTERN DOTS-1567
+2872;AL;BRAILLE PATTERN DOTS-2567
+2873;AL;BRAILLE PATTERN DOTS-12567
+2874;AL;BRAILLE PATTERN DOTS-3567
+2875;AL;BRAILLE PATTERN DOTS-13567
+2876;AL;BRAILLE PATTERN DOTS-23567
+2877;AL;BRAILLE PATTERN DOTS-123567
+2878;AL;BRAILLE PATTERN DOTS-4567
+2879;AL;BRAILLE PATTERN DOTS-14567
+287A;AL;BRAILLE PATTERN DOTS-24567
+287B;AL;BRAILLE PATTERN DOTS-124567
+287C;AL;BRAILLE PATTERN DOTS-34567
+287D;AL;BRAILLE PATTERN DOTS-134567
+287E;AL;BRAILLE PATTERN DOTS-234567
+287F;AL;BRAILLE PATTERN DOTS-1234567
+2880;AL;BRAILLE PATTERN DOTS-8
+2881;AL;BRAILLE PATTERN DOTS-18
+2882;AL;BRAILLE PATTERN DOTS-28
+2883;AL;BRAILLE PATTERN DOTS-128
+2884;AL;BRAILLE PATTERN DOTS-38
+2885;AL;BRAILLE PATTERN DOTS-138
+2886;AL;BRAILLE PATTERN DOTS-238
+2887;AL;BRAILLE PATTERN DOTS-1238
+2888;AL;BRAILLE PATTERN DOTS-48
+2889;AL;BRAILLE PATTERN DOTS-148
+288A;AL;BRAILLE PATTERN DOTS-248
+288B;AL;BRAILLE PATTERN DOTS-1248
+288C;AL;BRAILLE PATTERN DOTS-348
+288D;AL;BRAILLE PATTERN DOTS-1348
+288E;AL;BRAILLE PATTERN DOTS-2348
+288F;AL;BRAILLE PATTERN DOTS-12348
+2890;AL;BRAILLE PATTERN DOTS-58
+2891;AL;BRAILLE PATTERN DOTS-158
+2892;AL;BRAILLE PATTERN DOTS-258
+2893;AL;BRAILLE PATTERN DOTS-1258
+2894;AL;BRAILLE PATTERN DOTS-358
+2895;AL;BRAILLE PATTERN DOTS-1358
+2896;AL;BRAILLE PATTERN DOTS-2358
+2897;AL;BRAILLE PATTERN DOTS-12358
+2898;AL;BRAILLE PATTERN DOTS-458
+2899;AL;BRAILLE PATTERN DOTS-1458
+289A;AL;BRAILLE PATTERN DOTS-2458
+289B;AL;BRAILLE PATTERN DOTS-12458
+289C;AL;BRAILLE PATTERN DOTS-3458
+289D;AL;BRAILLE PATTERN DOTS-13458
+289E;AL;BRAILLE PATTERN DOTS-23458
+289F;AL;BRAILLE PATTERN DOTS-123458
+28A0;AL;BRAILLE PATTERN DOTS-68
+28A1;AL;BRAILLE PATTERN DOTS-168
+28A2;AL;BRAILLE PATTERN DOTS-268
+28A3;AL;BRAILLE PATTERN DOTS-1268
+28A4;AL;BRAILLE PATTERN DOTS-368
+28A5;AL;BRAILLE PATTERN DOTS-1368
+28A6;AL;BRAILLE PATTERN DOTS-2368
+28A7;AL;BRAILLE PATTERN DOTS-12368
+28A8;AL;BRAILLE PATTERN DOTS-468
+28A9;AL;BRAILLE PATTERN DOTS-1468
+28AA;AL;BRAILLE PATTERN DOTS-2468
+28AB;AL;BRAILLE PATTERN DOTS-12468
+28AC;AL;BRAILLE PATTERN DOTS-3468
+28AD;AL;BRAILLE PATTERN DOTS-13468
+28AE;AL;BRAILLE PATTERN DOTS-23468
+28AF;AL;BRAILLE PATTERN DOTS-123468
+28B0;AL;BRAILLE PATTERN DOTS-568
+28B1;AL;BRAILLE PATTERN DOTS-1568
+28B2;AL;BRAILLE PATTERN DOTS-2568
+28B3;AL;BRAILLE PATTERN DOTS-12568
+28B4;AL;BRAILLE PATTERN DOTS-3568
+28B5;AL;BRAILLE PATTERN DOTS-13568
+28B6;AL;BRAILLE PATTERN DOTS-23568
+28B7;AL;BRAILLE PATTERN DOTS-123568
+28B8;AL;BRAILLE PATTERN DOTS-4568
+28B9;AL;BRAILLE PATTERN DOTS-14568
+28BA;AL;BRAILLE PATTERN DOTS-24568
+28BB;AL;BRAILLE PATTERN DOTS-124568
+28BC;AL;BRAILLE PATTERN DOTS-34568
+28BD;AL;BRAILLE PATTERN DOTS-134568
+28BE;AL;BRAILLE PATTERN DOTS-234568
+28BF;AL;BRAILLE PATTERN DOTS-1234568
+28C0;AL;BRAILLE PATTERN DOTS-78
+28C1;AL;BRAILLE PATTERN DOTS-178
+28C2;AL;BRAILLE PATTERN DOTS-278
+28C3;AL;BRAILLE PATTERN DOTS-1278
+28C4;AL;BRAILLE PATTERN DOTS-378
+28C5;AL;BRAILLE PATTERN DOTS-1378
+28C6;AL;BRAILLE PATTERN DOTS-2378
+28C7;AL;BRAILLE PATTERN DOTS-12378
+28C8;AL;BRAILLE PATTERN DOTS-478
+28C9;AL;BRAILLE PATTERN DOTS-1478
+28CA;AL;BRAILLE PATTERN DOTS-2478
+28CB;AL;BRAILLE PATTERN DOTS-12478
+28CC;AL;BRAILLE PATTERN DOTS-3478
+28CD;AL;BRAILLE PATTERN DOTS-13478
+28CE;AL;BRAILLE PATTERN DOTS-23478
+28CF;AL;BRAILLE PATTERN DOTS-123478
+28D0;AL;BRAILLE PATTERN DOTS-578
+28D1;AL;BRAILLE PATTERN DOTS-1578
+28D2;AL;BRAILLE PATTERN DOTS-2578
+28D3;AL;BRAILLE PATTERN DOTS-12578
+28D4;AL;BRAILLE PATTERN DOTS-3578
+28D5;AL;BRAILLE PATTERN DOTS-13578
+28D6;AL;BRAILLE PATTERN DOTS-23578
+28D7;AL;BRAILLE PATTERN DOTS-123578
+28D8;AL;BRAILLE PATTERN DOTS-4578
+28D9;AL;BRAILLE PATTERN DOTS-14578
+28DA;AL;BRAILLE PATTERN DOTS-24578
+28DB;AL;BRAILLE PATTERN DOTS-124578
+28DC;AL;BRAILLE PATTERN DOTS-34578
+28DD;AL;BRAILLE PATTERN DOTS-134578
+28DE;AL;BRAILLE PATTERN DOTS-234578
+28DF;AL;BRAILLE PATTERN DOTS-1234578
+28E0;AL;BRAILLE PATTERN DOTS-678
+28E1;AL;BRAILLE PATTERN DOTS-1678
+28E2;AL;BRAILLE PATTERN DOTS-2678
+28E3;AL;BRAILLE PATTERN DOTS-12678
+28E4;AL;BRAILLE PATTERN DOTS-3678
+28E5;AL;BRAILLE PATTERN DOTS-13678
+28E6;AL;BRAILLE PATTERN DOTS-23678
+28E7;AL;BRAILLE PATTERN DOTS-123678
+28E8;AL;BRAILLE PATTERN DOTS-4678
+28E9;AL;BRAILLE PATTERN DOTS-14678
+28EA;AL;BRAILLE PATTERN DOTS-24678
+28EB;AL;BRAILLE PATTERN DOTS-124678
+28EC;AL;BRAILLE PATTERN DOTS-34678
+28ED;AL;BRAILLE PATTERN DOTS-134678
+28EE;AL;BRAILLE PATTERN DOTS-234678
+28EF;AL;BRAILLE PATTERN DOTS-1234678
+28F0;AL;BRAILLE PATTERN DOTS-5678
+28F1;AL;BRAILLE PATTERN DOTS-15678
+28F2;AL;BRAILLE PATTERN DOTS-25678
+28F3;AL;BRAILLE PATTERN DOTS-125678
+28F4;AL;BRAILLE PATTERN DOTS-35678
+28F5;AL;BRAILLE PATTERN DOTS-135678
+28F6;AL;BRAILLE PATTERN DOTS-235678
+28F7;AL;BRAILLE PATTERN DOTS-1235678
+28F8;AL;BRAILLE PATTERN DOTS-45678
+28F9;AL;BRAILLE PATTERN DOTS-145678
+28FA;AL;BRAILLE PATTERN DOTS-245678
+28FB;AL;BRAILLE PATTERN DOTS-1245678
+28FC;AL;BRAILLE PATTERN DOTS-345678
+28FD;AL;BRAILLE PATTERN DOTS-1345678
+28FE;AL;BRAILLE PATTERN DOTS-2345678
+28FF;AL;BRAILLE PATTERN DOTS-12345678
+2E80;ID;CJK RADICAL REPEAT
+2E81;ID;CJK RADICAL CLIFF
+2E82;ID;CJK RADICAL SECOND ONE
+2E83;ID;CJK RADICAL SECOND TWO
+2E84;ID;CJK RADICAL SECOND THREE
+2E85;ID;CJK RADICAL PERSON
+2E86;ID;CJK RADICAL BOX
+2E87;ID;CJK RADICAL TABLE
+2E88;ID;CJK RADICAL KNIFE ONE
+2E89;ID;CJK RADICAL KNIFE TWO
+2E8A;ID;CJK RADICAL DIVINATION
+2E8B;ID;CJK RADICAL SEAL
+2E8C;ID;CJK RADICAL SMALL ONE
+2E8D;ID;CJK RADICAL SMALL TWO
+2E8E;ID;CJK RADICAL LAME ONE
+2E8F;ID;CJK RADICAL LAME TWO
+2E90;ID;CJK RADICAL LAME THREE
+2E91;ID;CJK RADICAL LAME FOUR
+2E92;ID;CJK RADICAL SNAKE
+2E93;ID;CJK RADICAL THREAD
+2E94;ID;CJK RADICAL SNOUT ONE
+2E95;ID;CJK RADICAL SNOUT TWO
+2E96;ID;CJK RADICAL HEART ONE
+2E97;ID;CJK RADICAL HEART TWO
+2E98;ID;CJK RADICAL HAND
+2E99;ID;CJK RADICAL RAP
+2E9B;ID;CJK RADICAL CHOKE
+2E9C;ID;CJK RADICAL SUN
+2E9D;ID;CJK RADICAL MOON
+2E9E;ID;CJK RADICAL DEATH
+2E9F;ID;CJK RADICAL MOTHER
+2EA0;ID;CJK RADICAL CIVILIAN
+2EA1;ID;CJK RADICAL WATER ONE
+2EA2;ID;CJK RADICAL WATER TWO
+2EA3;ID;CJK RADICAL FIRE
+2EA4;ID;CJK RADICAL PAW ONE
+2EA5;ID;CJK RADICAL PAW TWO
+2EA6;ID;CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7;ID;CJK RADICAL COW
+2EA8;ID;CJK RADICAL DOG
+2EA9;ID;CJK RADICAL JADE
+2EAA;ID;CJK RADICAL BOLT OF CLOTH
+2EAB;ID;CJK RADICAL EYE
+2EAC;ID;CJK RADICAL SPIRIT ONE
+2EAD;ID;CJK RADICAL SPIRIT TWO
+2EAE;ID;CJK RADICAL BAMBOO
+2EAF;ID;CJK RADICAL SILK
+2EB0;ID;CJK RADICAL C-SIMPLIFIED SILK
+2EB1;ID;CJK RADICAL NET ONE
+2EB2;ID;CJK RADICAL NET TWO
+2EB3;ID;CJK RADICAL NET THREE
+2EB4;ID;CJK RADICAL NET FOUR
+2EB5;ID;CJK RADICAL MESH
+2EB6;ID;CJK RADICAL SHEEP
+2EB7;ID;CJK RADICAL RAM
+2EB8;ID;CJK RADICAL EWE
+2EB9;ID;CJK RADICAL OLD
+2EBA;ID;CJK RADICAL BRUSH ONE
+2EBB;ID;CJK RADICAL BRUSH TWO
+2EBC;ID;CJK RADICAL MEAT
+2EBD;ID;CJK RADICAL MORTAR
+2EBE;ID;CJK RADICAL GRASS ONE
+2EBF;ID;CJK RADICAL GRASS TWO
+2EC0;ID;CJK RADICAL GRASS THREE
+2EC1;ID;CJK RADICAL TIGER
+2EC2;ID;CJK RADICAL CLOTHES
+2EC3;ID;CJK RADICAL WEST ONE
+2EC4;ID;CJK RADICAL WEST TWO
+2EC5;ID;CJK RADICAL C-SIMPLIFIED SEE
+2EC6;ID;CJK RADICAL SIMPLIFIED HORN
+2EC7;ID;CJK RADICAL HORN
+2EC8;ID;CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9;ID;CJK RADICAL C-SIMPLIFIED SHELL
+2ECA;ID;CJK RADICAL FOOT
+2ECB;ID;CJK RADICAL C-SIMPLIFIED CART
+2ECC;ID;CJK RADICAL SIMPLIFIED WALK
+2ECD;ID;CJK RADICAL WALK ONE
+2ECE;ID;CJK RADICAL WALK TWO
+2ECF;ID;CJK RADICAL CITY
+2ED0;ID;CJK RADICAL C-SIMPLIFIED GOLD
+2ED1;ID;CJK RADICAL LONG ONE
+2ED2;ID;CJK RADICAL LONG TWO
+2ED3;ID;CJK RADICAL C-SIMPLIFIED LONG
+2ED4;ID;CJK RADICAL C-SIMPLIFIED GATE
+2ED5;ID;CJK RADICAL MOUND ONE
+2ED6;ID;CJK RADICAL MOUND TWO
+2ED7;ID;CJK RADICAL RAIN
+2ED8;ID;CJK RADICAL BLUE
+2ED9;ID;CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA;ID;CJK RADICAL C-SIMPLIFIED LEAF
+2EDB;ID;CJK RADICAL C-SIMPLIFIED WIND
+2EDC;ID;CJK RADICAL C-SIMPLIFIED FLY
+2EDD;ID;CJK RADICAL EAT ONE
+2EDE;ID;CJK RADICAL EAT TWO
+2EDF;ID;CJK RADICAL EAT THREE
+2EE0;ID;CJK RADICAL C-SIMPLIFIED EAT
+2EE1;ID;CJK RADICAL HEAD
+2EE2;ID;CJK RADICAL C-SIMPLIFIED HORSE
+2EE3;ID;CJK RADICAL BONE
+2EE4;ID;CJK RADICAL GHOST
+2EE5;ID;CJK RADICAL C-SIMPLIFIED FISH
+2EE6;ID;CJK RADICAL C-SIMPLIFIED BIRD
+2EE7;ID;CJK RADICAL C-SIMPLIFIED SALT
+2EE8;ID;CJK RADICAL SIMPLIFIED WHEAT
+2EE9;ID;CJK RADICAL SIMPLIFIED YELLOW
+2EEA;ID;CJK RADICAL C-SIMPLIFIED FROG
+2EEB;ID;CJK RADICAL J-SIMPLIFIED EVEN
+2EEC;ID;CJK RADICAL C-SIMPLIFIED EVEN
+2EED;ID;CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE;ID;CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF;ID;CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0;ID;CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1;ID;CJK RADICAL TURTLE
+2EF2;ID;CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3;ID;CJK RADICAL C-SIMPLIFIED TURTLE
+2F00;ID;KANGXI RADICAL ONE
+2F01;ID;KANGXI RADICAL LINE
+2F02;ID;KANGXI RADICAL DOT
+2F03;ID;KANGXI RADICAL SLASH
+2F04;ID;KANGXI RADICAL SECOND
+2F05;ID;KANGXI RADICAL HOOK
+2F06;ID;KANGXI RADICAL TWO
+2F07;ID;KANGXI RADICAL LID
+2F08;ID;KANGXI RADICAL MAN
+2F09;ID;KANGXI RADICAL LEGS
+2F0A;ID;KANGXI RADICAL ENTER
+2F0B;ID;KANGXI RADICAL EIGHT
+2F0C;ID;KANGXI RADICAL DOWN BOX
+2F0D;ID;KANGXI RADICAL COVER
+2F0E;ID;KANGXI RADICAL ICE
+2F0F;ID;KANGXI RADICAL TABLE
+2F10;ID;KANGXI RADICAL OPEN BOX
+2F11;ID;KANGXI RADICAL KNIFE
+2F12;ID;KANGXI RADICAL POWER
+2F13;ID;KANGXI RADICAL WRAP
+2F14;ID;KANGXI RADICAL SPOON
+2F15;ID;KANGXI RADICAL RIGHT OPEN BOX
+2F16;ID;KANGXI RADICAL HIDING ENCLOSURE
+2F17;ID;KANGXI RADICAL TEN
+2F18;ID;KANGXI RADICAL DIVINATION
+2F19;ID;KANGXI RADICAL SEAL
+2F1A;ID;KANGXI RADICAL CLIFF
+2F1B;ID;KANGXI RADICAL PRIVATE
+2F1C;ID;KANGXI RADICAL AGAIN
+2F1D;ID;KANGXI RADICAL MOUTH
+2F1E;ID;KANGXI RADICAL ENCLOSURE
+2F1F;ID;KANGXI RADICAL EARTH
+2F20;ID;KANGXI RADICAL SCHOLAR
+2F21;ID;KANGXI RADICAL GO
+2F22;ID;KANGXI RADICAL GO SLOWLY
+2F23;ID;KANGXI RADICAL EVENING
+2F24;ID;KANGXI RADICAL BIG
+2F25;ID;KANGXI RADICAL WOMAN
+2F26;ID;KANGXI RADICAL CHILD
+2F27;ID;KANGXI RADICAL ROOF
+2F28;ID;KANGXI RADICAL INCH
+2F29;ID;KANGXI RADICAL SMALL
+2F2A;ID;KANGXI RADICAL LAME
+2F2B;ID;KANGXI RADICAL CORPSE
+2F2C;ID;KANGXI RADICAL SPROUT
+2F2D;ID;KANGXI RADICAL MOUNTAIN
+2F2E;ID;KANGXI RADICAL RIVER
+2F2F;ID;KANGXI RADICAL WORK
+2F30;ID;KANGXI RADICAL ONESELF
+2F31;ID;KANGXI RADICAL TURBAN
+2F32;ID;KANGXI RADICAL DRY
+2F33;ID;KANGXI RADICAL SHORT THREAD
+2F34;ID;KANGXI RADICAL DOTTED CLIFF
+2F35;ID;KANGXI RADICAL LONG STRIDE
+2F36;ID;KANGXI RADICAL TWO HANDS
+2F37;ID;KANGXI RADICAL SHOOT
+2F38;ID;KANGXI RADICAL BOW
+2F39;ID;KANGXI RADICAL SNOUT
+2F3A;ID;KANGXI RADICAL BRISTLE
+2F3B;ID;KANGXI RADICAL STEP
+2F3C;ID;KANGXI RADICAL HEART
+2F3D;ID;KANGXI RADICAL HALBERD
+2F3E;ID;KANGXI RADICAL DOOR
+2F3F;ID;KANGXI RADICAL HAND
+2F40;ID;KANGXI RADICAL BRANCH
+2F41;ID;KANGXI RADICAL RAP
+2F42;ID;KANGXI RADICAL SCRIPT
+2F43;ID;KANGXI RADICAL DIPPER
+2F44;ID;KANGXI RADICAL AXE
+2F45;ID;KANGXI RADICAL SQUARE
+2F46;ID;KANGXI RADICAL NOT
+2F47;ID;KANGXI RADICAL SUN
+2F48;ID;KANGXI RADICAL SAY
+2F49;ID;KANGXI RADICAL MOON
+2F4A;ID;KANGXI RADICAL TREE
+2F4B;ID;KANGXI RADICAL LACK
+2F4C;ID;KANGXI RADICAL STOP
+2F4D;ID;KANGXI RADICAL DEATH
+2F4E;ID;KANGXI RADICAL WEAPON
+2F4F;ID;KANGXI RADICAL DO NOT
+2F50;ID;KANGXI RADICAL COMPARE
+2F51;ID;KANGXI RADICAL FUR
+2F52;ID;KANGXI RADICAL CLAN
+2F53;ID;KANGXI RADICAL STEAM
+2F54;ID;KANGXI RADICAL WATER
+2F55;ID;KANGXI RADICAL FIRE
+2F56;ID;KANGXI RADICAL CLAW
+2F57;ID;KANGXI RADICAL FATHER
+2F58;ID;KANGXI RADICAL DOUBLE X
+2F59;ID;KANGXI RADICAL HALF TREE TRUNK
+2F5A;ID;KANGXI RADICAL SLICE
+2F5B;ID;KANGXI RADICAL FANG
+2F5C;ID;KANGXI RADICAL COW
+2F5D;ID;KANGXI RADICAL DOG
+2F5E;ID;KANGXI RADICAL PROFOUND
+2F5F;ID;KANGXI RADICAL JADE
+2F60;ID;KANGXI RADICAL MELON
+2F61;ID;KANGXI RADICAL TILE
+2F62;ID;KANGXI RADICAL SWEET
+2F63;ID;KANGXI RADICAL LIFE
+2F64;ID;KANGXI RADICAL USE
+2F65;ID;KANGXI RADICAL FIELD
+2F66;ID;KANGXI RADICAL BOLT OF CLOTH
+2F67;ID;KANGXI RADICAL SICKNESS
+2F68;ID;KANGXI RADICAL DOTTED TENT
+2F69;ID;KANGXI RADICAL WHITE
+2F6A;ID;KANGXI RADICAL SKIN
+2F6B;ID;KANGXI RADICAL DISH
+2F6C;ID;KANGXI RADICAL EYE
+2F6D;ID;KANGXI RADICAL SPEAR
+2F6E;ID;KANGXI RADICAL ARROW
+2F6F;ID;KANGXI RADICAL STONE
+2F70;ID;KANGXI RADICAL SPIRIT
+2F71;ID;KANGXI RADICAL TRACK
+2F72;ID;KANGXI RADICAL GRAIN
+2F73;ID;KANGXI RADICAL CAVE
+2F74;ID;KANGXI RADICAL STAND
+2F75;ID;KANGXI RADICAL BAMBOO
+2F76;ID;KANGXI RADICAL RICE
+2F77;ID;KANGXI RADICAL SILK
+2F78;ID;KANGXI RADICAL JAR
+2F79;ID;KANGXI RADICAL NET
+2F7A;ID;KANGXI RADICAL SHEEP
+2F7B;ID;KANGXI RADICAL FEATHER
+2F7C;ID;KANGXI RADICAL OLD
+2F7D;ID;KANGXI RADICAL AND
+2F7E;ID;KANGXI RADICAL PLOW
+2F7F;ID;KANGXI RADICAL EAR
+2F80;ID;KANGXI RADICAL BRUSH
+2F81;ID;KANGXI RADICAL MEAT
+2F82;ID;KANGXI RADICAL MINISTER
+2F83;ID;KANGXI RADICAL SELF
+2F84;ID;KANGXI RADICAL ARRIVE
+2F85;ID;KANGXI RADICAL MORTAR
+2F86;ID;KANGXI RADICAL TONGUE
+2F87;ID;KANGXI RADICAL OPPOSE
+2F88;ID;KANGXI RADICAL BOAT
+2F89;ID;KANGXI RADICAL STOPPING
+2F8A;ID;KANGXI RADICAL COLOR
+2F8B;ID;KANGXI RADICAL GRASS
+2F8C;ID;KANGXI RADICAL TIGER
+2F8D;ID;KANGXI RADICAL INSECT
+2F8E;ID;KANGXI RADICAL BLOOD
+2F8F;ID;KANGXI RADICAL WALK ENCLOSURE
+2F90;ID;KANGXI RADICAL CLOTHES
+2F91;ID;KANGXI RADICAL WEST
+2F92;ID;KANGXI RADICAL SEE
+2F93;ID;KANGXI RADICAL HORN
+2F94;ID;KANGXI RADICAL SPEECH
+2F95;ID;KANGXI RADICAL VALLEY
+2F96;ID;KANGXI RADICAL BEAN
+2F97;ID;KANGXI RADICAL PIG
+2F98;ID;KANGXI RADICAL BADGER
+2F99;ID;KANGXI RADICAL SHELL
+2F9A;ID;KANGXI RADICAL RED
+2F9B;ID;KANGXI RADICAL RUN
+2F9C;ID;KANGXI RADICAL FOOT
+2F9D;ID;KANGXI RADICAL BODY
+2F9E;ID;KANGXI RADICAL CART
+2F9F;ID;KANGXI RADICAL BITTER
+2FA0;ID;KANGXI RADICAL MORNING
+2FA1;ID;KANGXI RADICAL WALK
+2FA2;ID;KANGXI RADICAL CITY
+2FA3;ID;KANGXI RADICAL WINE
+2FA4;ID;KANGXI RADICAL DISTINGUISH
+2FA5;ID;KANGXI RADICAL VILLAGE
+2FA6;ID;KANGXI RADICAL GOLD
+2FA7;ID;KANGXI RADICAL LONG
+2FA8;ID;KANGXI RADICAL GATE
+2FA9;ID;KANGXI RADICAL MOUND
+2FAA;ID;KANGXI RADICAL SLAVE
+2FAB;ID;KANGXI RADICAL SHORT TAILED BIRD
+2FAC;ID;KANGXI RADICAL RAIN
+2FAD;ID;KANGXI RADICAL BLUE
+2FAE;ID;KANGXI RADICAL WRONG
+2FAF;ID;KANGXI RADICAL FACE
+2FB0;ID;KANGXI RADICAL LEATHER
+2FB1;ID;KANGXI RADICAL TANNED LEATHER
+2FB2;ID;KANGXI RADICAL LEEK
+2FB3;ID;KANGXI RADICAL SOUND
+2FB4;ID;KANGXI RADICAL LEAF
+2FB5;ID;KANGXI RADICAL WIND
+2FB6;ID;KANGXI RADICAL FLY
+2FB7;ID;KANGXI RADICAL EAT
+2FB8;ID;KANGXI RADICAL HEAD
+2FB9;ID;KANGXI RADICAL FRAGRANT
+2FBA;ID;KANGXI RADICAL HORSE
+2FBB;ID;KANGXI RADICAL BONE
+2FBC;ID;KANGXI RADICAL TALL
+2FBD;ID;KANGXI RADICAL HAIR
+2FBE;ID;KANGXI RADICAL FIGHT
+2FBF;ID;KANGXI RADICAL SACRIFICIAL WINE
+2FC0;ID;KANGXI RADICAL CAULDRON
+2FC1;ID;KANGXI RADICAL GHOST
+2FC2;ID;KANGXI RADICAL FISH
+2FC3;ID;KANGXI RADICAL BIRD
+2FC4;ID;KANGXI RADICAL SALT
+2FC5;ID;KANGXI RADICAL DEER
+2FC6;ID;KANGXI RADICAL WHEAT
+2FC7;ID;KANGXI RADICAL HEMP
+2FC8;ID;KANGXI RADICAL YELLOW
+2FC9;ID;KANGXI RADICAL MILLET
+2FCA;ID;KANGXI RADICAL BLACK
+2FCB;ID;KANGXI RADICAL EMBROIDERY
+2FCC;ID;KANGXI RADICAL FROG
+2FCD;ID;KANGXI RADICAL TRIPOD
+2FCE;ID;KANGXI RADICAL DRUM
+2FCF;ID;KANGXI RADICAL RAT
+2FD0;ID;KANGXI RADICAL NOSE
+2FD1;ID;KANGXI RADICAL EVEN
+2FD2;ID;KANGXI RADICAL TOOTH
+2FD3;ID;KANGXI RADICAL DRAGON
+2FD4;ID;KANGXI RADICAL TURTLE
+2FD5;ID;KANGXI RADICAL FLUTE
+2FF0;ID;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1;ID;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2;ID;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3;ID;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4;ID;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5;ID;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6;ID;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7;ID;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8;ID;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9;ID;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA;ID;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB;ID;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000;ID;IDEOGRAPHIC SPACE
+3001;CL;IDEOGRAPHIC COMMA
+3002;CL;IDEOGRAPHIC FULL STOP
+3003;ID;DITTO MARK
+3004;ID;JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005;NS;IDEOGRAPHIC ITERATION MARK
+3006;ID;IDEOGRAPHIC CLOSING MARK
+3007;ID;IDEOGRAPHIC NUMBER ZERO
+3008;OP;LEFT ANGLE BRACKET
+3009;CL;RIGHT ANGLE BRACKET
+300A;OP;LEFT DOUBLE ANGLE BRACKET
+300B;CL;RIGHT DOUBLE ANGLE BRACKET
+300C;OP;LEFT CORNER BRACKET
+300D;CL;RIGHT CORNER BRACKET
+300E;OP;LEFT WHITE CORNER BRACKET
+300F;CL;RIGHT WHITE CORNER BRACKET
+3010;OP;LEFT BLACK LENTICULAR BRACKET
+3011;CL;RIGHT BLACK LENTICULAR BRACKET
+3012;ID;POSTAL MARK
+3013;ID;GETA MARK
+3014;OP;LEFT TORTOISE SHELL BRACKET
+3015;CL;RIGHT TORTOISE SHELL BRACKET
+3016;OP;LEFT WHITE LENTICULAR BRACKET
+3017;CL;RIGHT WHITE LENTICULAR BRACKET
+3018;OP;LEFT WHITE TORTOISE SHELL BRACKET
+3019;CL;RIGHT WHITE TORTOISE SHELL BRACKET
+301A;OP;LEFT WHITE SQUARE BRACKET
+301B;CL;RIGHT WHITE SQUARE BRACKET
+301C;NS;WAVE DASH
+301D;OP;REVERSED DOUBLE PRIME QUOTATION MARK
+301E;CL;DOUBLE PRIME QUOTATION MARK
+301F;CL;LOW DOUBLE PRIME QUOTATION MARK
+3020;ID;POSTAL MARK FACE
+3021;ID;HANGZHOU NUMERAL ONE
+3022;ID;HANGZHOU NUMERAL TWO
+3023;ID;HANGZHOU NUMERAL THREE
+3024;ID;HANGZHOU NUMERAL FOUR
+3025;ID;HANGZHOU NUMERAL FIVE
+3026;ID;HANGZHOU NUMERAL SIX
+3027;ID;HANGZHOU NUMERAL SEVEN
+3028;ID;HANGZHOU NUMERAL EIGHT
+3029;ID;HANGZHOU NUMERAL NINE
+302A;CM;IDEOGRAPHIC LEVEL TONE MARK
+302B;CM;IDEOGRAPHIC RISING TONE MARK
+302C;CM;IDEOGRAPHIC DEPARTING TONE MARK
+302D;CM;IDEOGRAPHIC ENTERING TONE MARK
+302E;CM;HANGUL SINGLE DOT TONE MARK
+302F;CM;HANGUL DOUBLE DOT TONE MARK
+3030;ID;WAVY DASH
+3031;ID;VERTICAL KANA REPEAT MARK
+3032;ID;VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033;ID;VERTICAL KANA REPEAT MARK UPPER HALF
+3034;ID;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035;ID;VERTICAL KANA REPEAT MARK LOWER HALF
+3036;ID;CIRCLED POSTAL MARK
+3037;ID;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038;ID;HANGZHOU NUMERAL TEN
+3039;ID;HANGZHOU NUMERAL TWENTY
+303A;ID;HANGZHOU NUMERAL THIRTY
+303E;ID;IDEOGRAPHIC VARIATION INDICATOR
+303F;ID;IDEOGRAPHIC HALF FILL SPACE
+3041;NS;HIRAGANA LETTER SMALL A
+3042;ID;HIRAGANA LETTER A
+3043;NS;HIRAGANA LETTER SMALL I
+3044;ID;HIRAGANA LETTER I
+3045;NS;HIRAGANA LETTER SMALL U
+3046;ID;HIRAGANA LETTER U
+3047;NS;HIRAGANA LETTER SMALL E
+3048;ID;HIRAGANA LETTER E
+3049;NS;HIRAGANA LETTER SMALL O
+304A;ID;HIRAGANA LETTER O
+304B;ID;HIRAGANA LETTER KA
+304C;ID;HIRAGANA LETTER GA
+304D;ID;HIRAGANA LETTER KI
+304E;ID;HIRAGANA LETTER GI
+304F;ID;HIRAGANA LETTER KU
+3050;ID;HIRAGANA LETTER GU
+3051;ID;HIRAGANA LETTER KE
+3052;ID;HIRAGANA LETTER GE
+3053;ID;HIRAGANA LETTER KO
+3054;ID;HIRAGANA LETTER GO
+3055;ID;HIRAGANA LETTER SA
+3056;ID;HIRAGANA LETTER ZA
+3057;ID;HIRAGANA LETTER SI
+3058;ID;HIRAGANA LETTER ZI
+3059;ID;HIRAGANA LETTER SU
+305A;ID;HIRAGANA LETTER ZU
+305B;ID;HIRAGANA LETTER SE
+305C;ID;HIRAGANA LETTER ZE
+305D;ID;HIRAGANA LETTER SO
+305E;ID;HIRAGANA LETTER ZO
+305F;ID;HIRAGANA LETTER TA
+3060;ID;HIRAGANA LETTER DA
+3061;ID;HIRAGANA LETTER TI
+3062;ID;HIRAGANA LETTER DI
+3063;NS;HIRAGANA LETTER SMALL TU
+3064;ID;HIRAGANA LETTER TU
+3065;ID;HIRAGANA LETTER DU
+3066;ID;HIRAGANA LETTER TE
+3067;ID;HIRAGANA LETTER DE
+3068;ID;HIRAGANA LETTER TO
+3069;ID;HIRAGANA LETTER DO
+306A;ID;HIRAGANA LETTER NA
+306B;ID;HIRAGANA LETTER NI
+306C;ID;HIRAGANA LETTER NU
+306D;ID;HIRAGANA LETTER NE
+306E;ID;HIRAGANA LETTER NO
+306F;ID;HIRAGANA LETTER HA
+3070;ID;HIRAGANA LETTER BA
+3071;ID;HIRAGANA LETTER PA
+3072;ID;HIRAGANA LETTER HI
+3073;ID;HIRAGANA LETTER BI
+3074;ID;HIRAGANA LETTER PI
+3075;ID;HIRAGANA LETTER HU
+3076;ID;HIRAGANA LETTER BU
+3077;ID;HIRAGANA LETTER PU
+3078;ID;HIRAGANA LETTER HE
+3079;ID;HIRAGANA LETTER BE
+307A;ID;HIRAGANA LETTER PE
+307B;ID;HIRAGANA LETTER HO
+307C;ID;HIRAGANA LETTER BO
+307D;ID;HIRAGANA LETTER PO
+307E;ID;HIRAGANA LETTER MA
+307F;ID;HIRAGANA LETTER MI
+3080;ID;HIRAGANA LETTER MU
+3081;ID;HIRAGANA LETTER ME
+3082;ID;HIRAGANA LETTER MO
+3083;NS;HIRAGANA LETTER SMALL YA
+3084;ID;HIRAGANA LETTER YA
+3085;NS;HIRAGANA LETTER SMALL YU
+3086;ID;HIRAGANA LETTER YU
+3087;NS;HIRAGANA LETTER SMALL YO
+3088;ID;HIRAGANA LETTER YO
+3089;ID;HIRAGANA LETTER RA
+308A;ID;HIRAGANA LETTER RI
+308B;ID;HIRAGANA LETTER RU
+308C;ID;HIRAGANA LETTER RE
+308D;ID;HIRAGANA LETTER RO
+308E;NS;HIRAGANA LETTER SMALL WA
+308F;ID;HIRAGANA LETTER WA
+3090;ID;HIRAGANA LETTER WI
+3091;ID;HIRAGANA LETTER WE
+3092;ID;HIRAGANA LETTER WO
+3093;ID;HIRAGANA LETTER N
+3094;ID;HIRAGANA LETTER VU
+3099;CM;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A;CM;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B;NS;KATAKANA-HIRAGANA VOICED SOUND MARK
+309C;NS;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D;NS;HIRAGANA ITERATION MARK
+309E;NS;HIRAGANA VOICED ITERATION MARK
+30A1;NS;KATAKANA LETTER SMALL A
+30A2;ID;KATAKANA LETTER A
+30A3;NS;KATAKANA LETTER SMALL I
+30A4;ID;KATAKANA LETTER I
+30A5;NS;KATAKANA LETTER SMALL U
+30A6;ID;KATAKANA LETTER U
+30A7;NS;KATAKANA LETTER SMALL E
+30A8;ID;KATAKANA LETTER E
+30A9;NS;KATAKANA LETTER SMALL O
+30AA;ID;KATAKANA LETTER O
+30AB;ID;KATAKANA LETTER KA
+30AC;ID;KATAKANA LETTER GA
+30AD;ID;KATAKANA LETTER KI
+30AE;ID;KATAKANA LETTER GI
+30AF;ID;KATAKANA LETTER KU
+30B0;ID;KATAKANA LETTER GU
+30B1;ID;KATAKANA LETTER KE
+30B2;ID;KATAKANA LETTER GE
+30B3;ID;KATAKANA LETTER KO
+30B4;ID;KATAKANA LETTER GO
+30B5;ID;KATAKANA LETTER SA
+30B6;ID;KATAKANA LETTER ZA
+30B7;ID;KATAKANA LETTER SI
+30B8;ID;KATAKANA LETTER ZI
+30B9;ID;KATAKANA LETTER SU
+30BA;ID;KATAKANA LETTER ZU
+30BB;ID;KATAKANA LETTER SE
+30BC;ID;KATAKANA LETTER ZE
+30BD;ID;KATAKANA LETTER SO
+30BE;ID;KATAKANA LETTER ZO
+30BF;ID;KATAKANA LETTER TA
+30C0;ID;KATAKANA LETTER DA
+30C1;ID;KATAKANA LETTER TI
+30C2;ID;KATAKANA LETTER DI
+30C3;NS;KATAKANA LETTER SMALL TU
+30C4;ID;KATAKANA LETTER TU
+30C5;ID;KATAKANA LETTER DU
+30C6;ID;KATAKANA LETTER TE
+30C7;ID;KATAKANA LETTER DE
+30C8;ID;KATAKANA LETTER TO
+30C9;ID;KATAKANA LETTER DO
+30CA;ID;KATAKANA LETTER NA
+30CB;ID;KATAKANA LETTER NI
+30CC;ID;KATAKANA LETTER NU
+30CD;ID;KATAKANA LETTER NE
+30CE;ID;KATAKANA LETTER NO
+30CF;ID;KATAKANA LETTER HA
+30D0;ID;KATAKANA LETTER BA
+30D1;ID;KATAKANA LETTER PA
+30D2;ID;KATAKANA LETTER HI
+30D3;ID;KATAKANA LETTER BI
+30D4;ID;KATAKANA LETTER PI
+30D5;ID;KATAKANA LETTER HU
+30D6;ID;KATAKANA LETTER BU
+30D7;ID;KATAKANA LETTER PU
+30D8;ID;KATAKANA LETTER HE
+30D9;ID;KATAKANA LETTER BE
+30DA;ID;KATAKANA LETTER PE
+30DB;ID;KATAKANA LETTER HO
+30DC;ID;KATAKANA LETTER BO
+30DD;ID;KATAKANA LETTER PO
+30DE;ID;KATAKANA LETTER MA
+30DF;ID;KATAKANA LETTER MI
+30E0;ID;KATAKANA LETTER MU
+30E1;ID;KATAKANA LETTER ME
+30E2;ID;KATAKANA LETTER MO
+30E3;NS;KATAKANA LETTER SMALL YA
+30E4;ID;KATAKANA LETTER YA
+30E5;NS;KATAKANA LETTER SMALL YU
+30E6;ID;KATAKANA LETTER YU
+30E7;NS;KATAKANA LETTER SMALL YO
+30E8;ID;KATAKANA LETTER YO
+30E9;ID;KATAKANA LETTER RA
+30EA;ID;KATAKANA LETTER RI
+30EB;ID;KATAKANA LETTER RU
+30EC;ID;KATAKANA LETTER RE
+30ED;ID;KATAKANA LETTER RO
+30EE;NS;KATAKANA LETTER SMALL WA
+30EF;ID;KATAKANA LETTER WA
+30F0;ID;KATAKANA LETTER WI
+30F1;ID;KATAKANA LETTER WE
+30F2;ID;KATAKANA LETTER WO
+30F3;ID;KATAKANA LETTER N
+30F4;ID;KATAKANA LETTER VU
+30F5;NS;KATAKANA LETTER SMALL KA
+30F6;NS;KATAKANA LETTER SMALL KE
+30F7;ID;KATAKANA LETTER VA
+30F8;ID;KATAKANA LETTER VI
+30F9;ID;KATAKANA LETTER VE
+30FA;ID;KATAKANA LETTER VO
+30FB;NS;KATAKANA MIDDLE DOT
+30FC;ID;KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD;NS;KATAKANA ITERATION MARK
+30FE;ID;KATAKANA VOICED ITERATION MARK
+3105;ID;BOPOMOFO LETTER B
+3106;ID;BOPOMOFO LETTER P
+3107;ID;BOPOMOFO LETTER M
+3108;ID;BOPOMOFO LETTER F
+3109;ID;BOPOMOFO LETTER D
+310A;ID;BOPOMOFO LETTER T
+310B;ID;BOPOMOFO LETTER N
+310C;ID;BOPOMOFO LETTER L
+310D;ID;BOPOMOFO LETTER G
+310E;ID;BOPOMOFO LETTER K
+310F;ID;BOPOMOFO LETTER H
+3110;ID;BOPOMOFO LETTER J
+3111;ID;BOPOMOFO LETTER Q
+3112;ID;BOPOMOFO LETTER X
+3113;ID;BOPOMOFO LETTER ZH
+3114;ID;BOPOMOFO LETTER CH
+3115;ID;BOPOMOFO LETTER SH
+3116;ID;BOPOMOFO LETTER R
+3117;ID;BOPOMOFO LETTER Z
+3118;ID;BOPOMOFO LETTER C
+3119;ID;BOPOMOFO LETTER S
+311A;ID;BOPOMOFO LETTER A
+311B;ID;BOPOMOFO LETTER O
+311C;ID;BOPOMOFO LETTER E
+311D;ID;BOPOMOFO LETTER EH
+311E;ID;BOPOMOFO LETTER AI
+311F;ID;BOPOMOFO LETTER EI
+3120;ID;BOPOMOFO LETTER AU
+3121;ID;BOPOMOFO LETTER OU
+3122;ID;BOPOMOFO LETTER AN
+3123;ID;BOPOMOFO LETTER EN
+3124;ID;BOPOMOFO LETTER ANG
+3125;ID;BOPOMOFO LETTER ENG
+3126;ID;BOPOMOFO LETTER ER
+3127;ID;BOPOMOFO LETTER I
+3128;ID;BOPOMOFO LETTER U
+3129;ID;BOPOMOFO LETTER IU
+312A;ID;BOPOMOFO LETTER V
+312B;ID;BOPOMOFO LETTER NG
+312C;ID;BOPOMOFO LETTER GN
+3131;ID;HANGUL LETTER KIYEOK
+3132;ID;HANGUL LETTER SSANGKIYEOK
+3133;ID;HANGUL LETTER KIYEOK-SIOS
+3134;ID;HANGUL LETTER NIEUN
+3135;ID;HANGUL LETTER NIEUN-CIEUC
+3136;ID;HANGUL LETTER NIEUN-HIEUH
+3137;ID;HANGUL LETTER TIKEUT
+3138;ID;HANGUL LETTER SSANGTIKEUT
+3139;ID;HANGUL LETTER RIEUL
+313A;ID;HANGUL LETTER RIEUL-KIYEOK
+313B;ID;HANGUL LETTER RIEUL-MIEUM
+313C;ID;HANGUL LETTER RIEUL-PIEUP
+313D;ID;HANGUL LETTER RIEUL-SIOS
+313E;ID;HANGUL LETTER RIEUL-THIEUTH
+313F;ID;HANGUL LETTER RIEUL-PHIEUPH
+3140;ID;HANGUL LETTER RIEUL-HIEUH
+3141;ID;HANGUL LETTER MIEUM
+3142;ID;HANGUL LETTER PIEUP
+3143;ID;HANGUL LETTER SSANGPIEUP
+3144;ID;HANGUL LETTER PIEUP-SIOS
+3145;ID;HANGUL LETTER SIOS
+3146;ID;HANGUL LETTER SSANGSIOS
+3147;ID;HANGUL LETTER IEUNG
+3148;ID;HANGUL LETTER CIEUC
+3149;ID;HANGUL LETTER SSANGCIEUC
+314A;ID;HANGUL LETTER CHIEUCH
+314B;ID;HANGUL LETTER KHIEUKH
+314C;ID;HANGUL LETTER THIEUTH
+314D;ID;HANGUL LETTER PHIEUPH
+314E;ID;HANGUL LETTER HIEUH
+314F;ID;HANGUL LETTER A
+3150;ID;HANGUL LETTER AE
+3151;ID;HANGUL LETTER YA
+3152;ID;HANGUL LETTER YAE
+3153;ID;HANGUL LETTER EO
+3154;ID;HANGUL LETTER E
+3155;ID;HANGUL LETTER YEO
+3156;ID;HANGUL LETTER YE
+3157;ID;HANGUL LETTER O
+3158;ID;HANGUL LETTER WA
+3159;ID;HANGUL LETTER WAE
+315A;ID;HANGUL LETTER OE
+315B;ID;HANGUL LETTER YO
+315C;ID;HANGUL LETTER U
+315D;ID;HANGUL LETTER WEO
+315E;ID;HANGUL LETTER WE
+315F;ID;HANGUL LETTER WI
+3160;ID;HANGUL LETTER YU
+3161;ID;HANGUL LETTER EU
+3162;ID;HANGUL LETTER YI
+3163;ID;HANGUL LETTER I
+3164;ID;HANGUL FILLER
+3165;ID;HANGUL LETTER SSANGNIEUN
+3166;ID;HANGUL LETTER NIEUN-TIKEUT
+3167;ID;HANGUL LETTER NIEUN-SIOS
+3168;ID;HANGUL LETTER NIEUN-PANSIOS
+3169;ID;HANGUL LETTER RIEUL-KIYEOK-SIOS
+316A;ID;HANGUL LETTER RIEUL-TIKEUT
+316B;ID;HANGUL LETTER RIEUL-PIEUP-SIOS
+316C;ID;HANGUL LETTER RIEUL-PANSIOS
+316D;ID;HANGUL LETTER RIEUL-YEORINHIEUH
+316E;ID;HANGUL LETTER MIEUM-PIEUP
+316F;ID;HANGUL LETTER MIEUM-SIOS
+3170;ID;HANGUL LETTER MIEUM-PANSIOS
+3171;ID;HANGUL LETTER KAPYEOUNMIEUM
+3172;ID;HANGUL LETTER PIEUP-KIYEOK
+3173;ID;HANGUL LETTER PIEUP-TIKEUT
+3174;ID;HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175;ID;HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176;ID;HANGUL LETTER PIEUP-CIEUC
+3177;ID;HANGUL LETTER PIEUP-THIEUTH
+3178;ID;HANGUL LETTER KAPYEOUNPIEUP
+3179;ID;HANGUL LETTER KAPYEOUNSSANGPIEUP
+317A;ID;HANGUL LETTER SIOS-KIYEOK
+317B;ID;HANGUL LETTER SIOS-NIEUN
+317C;ID;HANGUL LETTER SIOS-TIKEUT
+317D;ID;HANGUL LETTER SIOS-PIEUP
+317E;ID;HANGUL LETTER SIOS-CIEUC
+317F;ID;HANGUL LETTER PANSIOS
+3180;ID;HANGUL LETTER SSANGIEUNG
+3181;ID;HANGUL LETTER YESIEUNG
+3182;ID;HANGUL LETTER YESIEUNG-SIOS
+3183;ID;HANGUL LETTER YESIEUNG-PANSIOS
+3184;ID;HANGUL LETTER KAPYEOUNPHIEUPH
+3185;ID;HANGUL LETTER SSANGHIEUH
+3186;ID;HANGUL LETTER YEORINHIEUH
+3187;ID;HANGUL LETTER YO-YA
+3188;ID;HANGUL LETTER YO-YAE
+3189;ID;HANGUL LETTER YO-I
+318A;ID;HANGUL LETTER YU-YEO
+318B;ID;HANGUL LETTER YU-YE
+318C;ID;HANGUL LETTER YU-I
+318D;ID;HANGUL LETTER ARAEA
+318E;ID;HANGUL LETTER ARAEAE
+3190;ID;IDEOGRAPHIC ANNOTATION LINKING MARK
+3191;ID;IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192;ID;IDEOGRAPHIC ANNOTATION ONE MARK
+3193;ID;IDEOGRAPHIC ANNOTATION TWO MARK
+3194;ID;IDEOGRAPHIC ANNOTATION THREE MARK
+3195;ID;IDEOGRAPHIC ANNOTATION FOUR MARK
+3196;ID;IDEOGRAPHIC ANNOTATION TOP MARK
+3197;ID;IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198;ID;IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199;ID;IDEOGRAPHIC ANNOTATION FIRST MARK
+319A;ID;IDEOGRAPHIC ANNOTATION SECOND MARK
+319B;ID;IDEOGRAPHIC ANNOTATION THIRD MARK
+319C;ID;IDEOGRAPHIC ANNOTATION FOURTH MARK
+319D;ID;IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319E;ID;IDEOGRAPHIC ANNOTATION EARTH MARK
+319F;ID;IDEOGRAPHIC ANNOTATION MAN MARK
+31A0;ID;BOPOMOFO LETTER BU
+31A1;ID;BOPOMOFO LETTER ZI
+31A2;ID;BOPOMOFO LETTER JI
+31A3;ID;BOPOMOFO LETTER GU
+31A4;ID;BOPOMOFO LETTER EE
+31A5;ID;BOPOMOFO LETTER ENN
+31A6;ID;BOPOMOFO LETTER OO
+31A7;ID;BOPOMOFO LETTER ONN
+31A8;ID;BOPOMOFO LETTER IR
+31A9;ID;BOPOMOFO LETTER ANN
+31AA;ID;BOPOMOFO LETTER INN
+31AB;ID;BOPOMOFO LETTER UNN
+31AC;ID;BOPOMOFO LETTER IM
+31AD;ID;BOPOMOFO LETTER NGG
+31AE;ID;BOPOMOFO LETTER AINN
+31AF;ID;BOPOMOFO LETTER AUNN
+31B0;ID;BOPOMOFO LETTER AM
+31B1;ID;BOPOMOFO LETTER OM
+31B2;ID;BOPOMOFO LETTER ONG
+31B3;ID;BOPOMOFO LETTER INNN
+31B4;ID;BOPOMOFO FINAL LETTER P
+31B5;ID;BOPOMOFO FINAL LETTER T
+31B6;ID;BOPOMOFO FINAL LETTER K
+31B7;ID;BOPOMOFO FINAL LETTER H
+3200;ID;PARENTHESIZED HANGUL KIYEOK
+3201;ID;PARENTHESIZED HANGUL NIEUN
+3202;ID;PARENTHESIZED HANGUL TIKEUT
+3203;ID;PARENTHESIZED HANGUL RIEUL
+3204;ID;PARENTHESIZED HANGUL MIEUM
+3205;ID;PARENTHESIZED HANGUL PIEUP
+3206;ID;PARENTHESIZED HANGUL SIOS
+3207;ID;PARENTHESIZED HANGUL IEUNG
+3208;ID;PARENTHESIZED HANGUL CIEUC
+3209;ID;PARENTHESIZED HANGUL CHIEUCH
+320A;ID;PARENTHESIZED HANGUL KHIEUKH
+320B;ID;PARENTHESIZED HANGUL THIEUTH
+320C;ID;PARENTHESIZED HANGUL PHIEUPH
+320D;ID;PARENTHESIZED HANGUL HIEUH
+320E;ID;PARENTHESIZED HANGUL KIYEOK A
+320F;ID;PARENTHESIZED HANGUL NIEUN A
+3210;ID;PARENTHESIZED HANGUL TIKEUT A
+3211;ID;PARENTHESIZED HANGUL RIEUL A
+3212;ID;PARENTHESIZED HANGUL MIEUM A
+3213;ID;PARENTHESIZED HANGUL PIEUP A
+3214;ID;PARENTHESIZED HANGUL SIOS A
+3215;ID;PARENTHESIZED HANGUL IEUNG A
+3216;ID;PARENTHESIZED HANGUL CIEUC A
+3217;ID;PARENTHESIZED HANGUL CHIEUCH A
+3218;ID;PARENTHESIZED HANGUL KHIEUKH A
+3219;ID;PARENTHESIZED HANGUL THIEUTH A
+321A;ID;PARENTHESIZED HANGUL PHIEUPH A
+321B;ID;PARENTHESIZED HANGUL HIEUH A
+321C;ID;PARENTHESIZED HANGUL CIEUC U
+3220;ID;PARENTHESIZED IDEOGRAPH ONE
+3221;ID;PARENTHESIZED IDEOGRAPH TWO
+3222;ID;PARENTHESIZED IDEOGRAPH THREE
+3223;ID;PARENTHESIZED IDEOGRAPH FOUR
+3224;ID;PARENTHESIZED IDEOGRAPH FIVE
+3225;ID;PARENTHESIZED IDEOGRAPH SIX
+3226;ID;PARENTHESIZED IDEOGRAPH SEVEN
+3227;ID;PARENTHESIZED IDEOGRAPH EIGHT
+3228;ID;PARENTHESIZED IDEOGRAPH NINE
+3229;ID;PARENTHESIZED IDEOGRAPH TEN
+322A;ID;PARENTHESIZED IDEOGRAPH MOON
+322B;ID;PARENTHESIZED IDEOGRAPH FIRE
+322C;ID;PARENTHESIZED IDEOGRAPH WATER
+322D;ID;PARENTHESIZED IDEOGRAPH WOOD
+322E;ID;PARENTHESIZED IDEOGRAPH METAL
+322F;ID;PARENTHESIZED IDEOGRAPH EARTH
+3230;ID;PARENTHESIZED IDEOGRAPH SUN
+3231;ID;PARENTHESIZED IDEOGRAPH STOCK
+3232;ID;PARENTHESIZED IDEOGRAPH HAVE
+3233;ID;PARENTHESIZED IDEOGRAPH SOCIETY
+3234;ID;PARENTHESIZED IDEOGRAPH NAME
+3235;ID;PARENTHESIZED IDEOGRAPH SPECIAL
+3236;ID;PARENTHESIZED IDEOGRAPH FINANCIAL
+3237;ID;PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238;ID;PARENTHESIZED IDEOGRAPH LABOR
+3239;ID;PARENTHESIZED IDEOGRAPH REPRESENT
+323A;ID;PARENTHESIZED IDEOGRAPH CALL
+323B;ID;PARENTHESIZED IDEOGRAPH STUDY
+323C;ID;PARENTHESIZED IDEOGRAPH SUPERVISE
+323D;ID;PARENTHESIZED IDEOGRAPH ENTERPRISE
+323E;ID;PARENTHESIZED IDEOGRAPH RESOURCE
+323F;ID;PARENTHESIZED IDEOGRAPH ALLIANCE
+3240;ID;PARENTHESIZED IDEOGRAPH FESTIVAL
+3241;ID;PARENTHESIZED IDEOGRAPH REST
+3242;ID;PARENTHESIZED IDEOGRAPH SELF
+3243;ID;PARENTHESIZED IDEOGRAPH REACH
+3260;ID;CIRCLED HANGUL KIYEOK
+3261;ID;CIRCLED HANGUL NIEUN
+3262;ID;CIRCLED HANGUL TIKEUT
+3263;ID;CIRCLED HANGUL RIEUL
+3264;ID;CIRCLED HANGUL MIEUM
+3265;ID;CIRCLED HANGUL PIEUP
+3266;ID;CIRCLED HANGUL SIOS
+3267;ID;CIRCLED HANGUL IEUNG
+3268;ID;CIRCLED HANGUL CIEUC
+3269;ID;CIRCLED HANGUL CHIEUCH
+326A;ID;CIRCLED HANGUL KHIEUKH
+326B;ID;CIRCLED HANGUL THIEUTH
+326C;ID;CIRCLED HANGUL PHIEUPH
+326D;ID;CIRCLED HANGUL HIEUH
+326E;ID;CIRCLED HANGUL KIYEOK A
+326F;ID;CIRCLED HANGUL NIEUN A
+3270;ID;CIRCLED HANGUL TIKEUT A
+3271;ID;CIRCLED HANGUL RIEUL A
+3272;ID;CIRCLED HANGUL MIEUM A
+3273;ID;CIRCLED HANGUL PIEUP A
+3274;ID;CIRCLED HANGUL SIOS A
+3275;ID;CIRCLED HANGUL IEUNG A
+3276;ID;CIRCLED HANGUL CIEUC A
+3277;ID;CIRCLED HANGUL CHIEUCH A
+3278;ID;CIRCLED HANGUL KHIEUKH A
+3279;ID;CIRCLED HANGUL THIEUTH A
+327A;ID;CIRCLED HANGUL PHIEUPH A
+327B;ID;CIRCLED HANGUL HIEUH A
+327F;ID;KOREAN STANDARD SYMBOL
+3280;ID;CIRCLED IDEOGRAPH ONE
+3281;ID;CIRCLED IDEOGRAPH TWO
+3282;ID;CIRCLED IDEOGRAPH THREE
+3283;ID;CIRCLED IDEOGRAPH FOUR
+3284;ID;CIRCLED IDEOGRAPH FIVE
+3285;ID;CIRCLED IDEOGRAPH SIX
+3286;ID;CIRCLED IDEOGRAPH SEVEN
+3287;ID;CIRCLED IDEOGRAPH EIGHT
+3288;ID;CIRCLED IDEOGRAPH NINE
+3289;ID;CIRCLED IDEOGRAPH TEN
+328A;ID;CIRCLED IDEOGRAPH MOON
+328B;ID;CIRCLED IDEOGRAPH FIRE
+328C;ID;CIRCLED IDEOGRAPH WATER
+328D;ID;CIRCLED IDEOGRAPH WOOD
+328E;ID;CIRCLED IDEOGRAPH METAL
+328F;ID;CIRCLED IDEOGRAPH EARTH
+3290;ID;CIRCLED IDEOGRAPH SUN
+3291;ID;CIRCLED IDEOGRAPH STOCK
+3292;ID;CIRCLED IDEOGRAPH HAVE
+3293;ID;CIRCLED IDEOGRAPH SOCIETY
+3294;ID;CIRCLED IDEOGRAPH NAME
+3295;ID;CIRCLED IDEOGRAPH SPECIAL
+3296;ID;CIRCLED IDEOGRAPH FINANCIAL
+3297;ID;CIRCLED IDEOGRAPH CONGRATULATION
+3298;ID;CIRCLED IDEOGRAPH LABOR
+3299;ID;CIRCLED IDEOGRAPH SECRET
+329A;ID;CIRCLED IDEOGRAPH MALE
+329B;ID;CIRCLED IDEOGRAPH FEMALE
+329C;ID;CIRCLED IDEOGRAPH SUITABLE
+329D;ID;CIRCLED IDEOGRAPH EXCELLENT
+329E;ID;CIRCLED IDEOGRAPH PRINT
+329F;ID;CIRCLED IDEOGRAPH ATTENTION
+32A0;ID;CIRCLED IDEOGRAPH ITEM
+32A1;ID;CIRCLED IDEOGRAPH REST
+32A2;ID;CIRCLED IDEOGRAPH COPY
+32A3;ID;CIRCLED IDEOGRAPH CORRECT
+32A4;ID;CIRCLED IDEOGRAPH HIGH
+32A5;ID;CIRCLED IDEOGRAPH CENTRE
+32A6;ID;CIRCLED IDEOGRAPH LOW
+32A7;ID;CIRCLED IDEOGRAPH LEFT
+32A8;ID;CIRCLED IDEOGRAPH RIGHT
+32A9;ID;CIRCLED IDEOGRAPH MEDICINE
+32AA;ID;CIRCLED IDEOGRAPH RELIGION
+32AB;ID;CIRCLED IDEOGRAPH STUDY
+32AC;ID;CIRCLED IDEOGRAPH SUPERVISE
+32AD;ID;CIRCLED IDEOGRAPH ENTERPRISE
+32AE;ID;CIRCLED IDEOGRAPH RESOURCE
+32AF;ID;CIRCLED IDEOGRAPH ALLIANCE
+32B0;ID;CIRCLED IDEOGRAPH NIGHT
+32C0;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32C1;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32C2;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32C3;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32C4;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32C5;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32C6;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32C7;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32C8;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32C9;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32CA;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32CB;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32D0;ID;CIRCLED KATAKANA A
+32D1;ID;CIRCLED KATAKANA I
+32D2;ID;CIRCLED KATAKANA U
+32D3;ID;CIRCLED KATAKANA E
+32D4;ID;CIRCLED KATAKANA O
+32D5;ID;CIRCLED KATAKANA KA
+32D6;ID;CIRCLED KATAKANA KI
+32D7;ID;CIRCLED KATAKANA KU
+32D8;ID;CIRCLED KATAKANA KE
+32D9;ID;CIRCLED KATAKANA KO
+32DA;ID;CIRCLED KATAKANA SA
+32DB;ID;CIRCLED KATAKANA SI
+32DC;ID;CIRCLED KATAKANA SU
+32DD;ID;CIRCLED KATAKANA SE
+32DE;ID;CIRCLED KATAKANA SO
+32DF;ID;CIRCLED KATAKANA TA
+32E0;ID;CIRCLED KATAKANA TI
+32E1;ID;CIRCLED KATAKANA TU
+32E2;ID;CIRCLED KATAKANA TE
+32E3;ID;CIRCLED KATAKANA TO
+32E4;ID;CIRCLED KATAKANA NA
+32E5;ID;CIRCLED KATAKANA NI
+32E6;ID;CIRCLED KATAKANA NU
+32E7;ID;CIRCLED KATAKANA NE
+32E8;ID;CIRCLED KATAKANA NO
+32E9;ID;CIRCLED KATAKANA HA
+32EA;ID;CIRCLED KATAKANA HI
+32EB;ID;CIRCLED KATAKANA HU
+32EC;ID;CIRCLED KATAKANA HE
+32ED;ID;CIRCLED KATAKANA HO
+32EE;ID;CIRCLED KATAKANA MA
+32EF;ID;CIRCLED KATAKANA MI
+32F0;ID;CIRCLED KATAKANA MU
+32F1;ID;CIRCLED KATAKANA ME
+32F2;ID;CIRCLED KATAKANA MO
+32F3;ID;CIRCLED KATAKANA YA
+32F4;ID;CIRCLED KATAKANA YU
+32F5;ID;CIRCLED KATAKANA YO
+32F6;ID;CIRCLED KATAKANA RA
+32F7;ID;CIRCLED KATAKANA RI
+32F8;ID;CIRCLED KATAKANA RU
+32F9;ID;CIRCLED KATAKANA RE
+32FA;ID;CIRCLED KATAKANA RO
+32FB;ID;CIRCLED KATAKANA WA
+32FC;ID;CIRCLED KATAKANA WI
+32FD;ID;CIRCLED KATAKANA WE
+32FE;ID;CIRCLED KATAKANA WO
+3300;ID;SQUARE APAATO
+3301;ID;SQUARE ARUHUA
+3302;ID;SQUARE ANPEA
+3303;ID;SQUARE AARU
+3304;ID;SQUARE ININGU
+3305;ID;SQUARE INTI
+3306;ID;SQUARE UON
+3307;ID;SQUARE ESUKUUDO
+3308;ID;SQUARE EEKAA
+3309;ID;SQUARE ONSU
+330A;ID;SQUARE OOMU
+330B;ID;SQUARE KAIRI
+330C;ID;SQUARE KARATTO
+330D;ID;SQUARE KARORII
+330E;ID;SQUARE GARON
+330F;ID;SQUARE GANMA
+3310;ID;SQUARE GIGA
+3311;ID;SQUARE GINII
+3312;ID;SQUARE KYURII
+3313;ID;SQUARE GIRUDAA
+3314;ID;SQUARE KIRO
+3315;ID;SQUARE KIROGURAMU
+3316;ID;SQUARE KIROMEETORU
+3317;ID;SQUARE KIROWATTO
+3318;ID;SQUARE GURAMU
+3319;ID;SQUARE GURAMUTON
+331A;ID;SQUARE KURUZEIRO
+331B;ID;SQUARE KUROONE
+331C;ID;SQUARE KEESU
+331D;ID;SQUARE KORUNA
+331E;ID;SQUARE KOOPO
+331F;ID;SQUARE SAIKURU
+3320;ID;SQUARE SANTIIMU
+3321;ID;SQUARE SIRINGU
+3322;ID;SQUARE SENTI
+3323;ID;SQUARE SENTO
+3324;ID;SQUARE DAASU
+3325;ID;SQUARE DESI
+3326;ID;SQUARE DORU
+3327;ID;SQUARE TON
+3328;ID;SQUARE NANO
+3329;ID;SQUARE NOTTO
+332A;ID;SQUARE HAITU
+332B;ID;SQUARE PAASENTO
+332C;ID;SQUARE PAATU
+332D;ID;SQUARE BAARERU
+332E;ID;SQUARE PIASUTORU
+332F;ID;SQUARE PIKURU
+3330;ID;SQUARE PIKO
+3331;ID;SQUARE BIRU
+3332;ID;SQUARE HUARADDO
+3333;ID;SQUARE HUIITO
+3334;ID;SQUARE BUSSYERU
+3335;ID;SQUARE HURAN
+3336;ID;SQUARE HEKUTAARU
+3337;ID;SQUARE PESO
+3338;ID;SQUARE PENIHI
+3339;ID;SQUARE HERUTU
+333A;ID;SQUARE PENSU
+333B;ID;SQUARE PEEZI
+333C;ID;SQUARE BEETA
+333D;ID;SQUARE POINTO
+333E;ID;SQUARE BORUTO
+333F;ID;SQUARE HON
+3340;ID;SQUARE PONDO
+3341;ID;SQUARE HOORU
+3342;ID;SQUARE HOON
+3343;ID;SQUARE MAIKURO
+3344;ID;SQUARE MAIRU
+3345;ID;SQUARE MAHHA
+3346;ID;SQUARE MARUKU
+3347;ID;SQUARE MANSYON
+3348;ID;SQUARE MIKURON
+3349;ID;SQUARE MIRI
+334A;ID;SQUARE MIRIBAARU
+334B;ID;SQUARE MEGA
+334C;ID;SQUARE MEGATON
+334D;ID;SQUARE MEETORU
+334E;ID;SQUARE YAADO
+334F;ID;SQUARE YAARU
+3350;ID;SQUARE YUAN
+3351;ID;SQUARE RITTORU
+3352;ID;SQUARE RIRA
+3353;ID;SQUARE RUPII
+3354;ID;SQUARE RUUBURU
+3355;ID;SQUARE REMU
+3356;ID;SQUARE RENTOGEN
+3357;ID;SQUARE WATTO
+3358;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335A;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335B;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335C;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335D;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335E;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335F;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336A;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336B;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336C;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336D;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336E;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336F;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371;ID;SQUARE HPA
+3372;ID;SQUARE DA
+3373;ID;SQUARE AU
+3374;ID;SQUARE BAR
+3375;ID;SQUARE OV
+3376;ID;SQUARE PC
+337B;ID;SQUARE ERA NAME HEISEI
+337C;ID;SQUARE ERA NAME SYOUWA
+337D;ID;SQUARE ERA NAME TAISYOU
+337E;ID;SQUARE ERA NAME MEIZI
+337F;ID;SQUARE CORPORATION
+3380;ID;SQUARE PA AMPS
+3381;ID;SQUARE NA
+3382;ID;SQUARE MU A
+3383;ID;SQUARE MA
+3384;ID;SQUARE KA
+3385;ID;SQUARE KB
+3386;ID;SQUARE MB
+3387;ID;SQUARE GB
+3388;ID;SQUARE CAL
+3389;ID;SQUARE KCAL
+338A;ID;SQUARE PF
+338B;ID;SQUARE NF
+338C;ID;SQUARE MU F
+338D;ID;SQUARE MU G
+338E;ID;SQUARE MG
+338F;ID;SQUARE KG
+3390;ID;SQUARE HZ
+3391;ID;SQUARE KHZ
+3392;ID;SQUARE MHZ
+3393;ID;SQUARE GHZ
+3394;ID;SQUARE THZ
+3395;ID;SQUARE MU L
+3396;ID;SQUARE ML
+3397;ID;SQUARE DL
+3398;ID;SQUARE KL
+3399;ID;SQUARE FM
+339A;ID;SQUARE NM
+339B;ID;SQUARE MU M
+339C;ID;SQUARE MM
+339D;ID;SQUARE CM
+339E;ID;SQUARE KM
+339F;ID;SQUARE MM SQUARED
+33A0;ID;SQUARE CM SQUARED
+33A1;ID;SQUARE M SQUARED
+33A2;ID;SQUARE KM SQUARED
+33A3;ID;SQUARE MM CUBED
+33A4;ID;SQUARE CM CUBED
+33A5;ID;SQUARE M CUBED
+33A6;ID;SQUARE KM CUBED
+33A7;ID;SQUARE M OVER S
+33A8;ID;SQUARE M OVER S SQUARED
+33A9;ID;SQUARE PA
+33AA;ID;SQUARE KPA
+33AB;ID;SQUARE MPA
+33AC;ID;SQUARE GPA
+33AD;ID;SQUARE RAD
+33AE;ID;SQUARE RAD OVER S
+33AF;ID;SQUARE RAD OVER S SQUARED
+33B0;ID;SQUARE PS
+33B1;ID;SQUARE NS
+33B2;ID;SQUARE MU S
+33B3;ID;SQUARE MS
+33B4;ID;SQUARE PV
+33B5;ID;SQUARE NV
+33B6;ID;SQUARE MU V
+33B7;ID;SQUARE MV
+33B8;ID;SQUARE KV
+33B9;ID;SQUARE MV MEGA
+33BA;ID;SQUARE PW
+33BB;ID;SQUARE NW
+33BC;ID;SQUARE MU W
+33BD;ID;SQUARE MW
+33BE;ID;SQUARE KW
+33BF;ID;SQUARE MW MEGA
+33C0;ID;SQUARE K OHM
+33C1;ID;SQUARE M OHM
+33C2;ID;SQUARE AM
+33C3;ID;SQUARE BQ
+33C4;ID;SQUARE CC
+33C5;ID;SQUARE CD
+33C6;ID;SQUARE C OVER KG
+33C7;ID;SQUARE CO
+33C8;ID;SQUARE DB
+33C9;ID;SQUARE GY
+33CA;ID;SQUARE HA
+33CB;ID;SQUARE HP
+33CC;ID;SQUARE IN
+33CD;ID;SQUARE KK
+33CE;ID;SQUARE KM CAPITAL
+33CF;ID;SQUARE KT
+33D0;ID;SQUARE LM
+33D1;ID;SQUARE LN
+33D2;ID;SQUARE LOG
+33D3;ID;SQUARE LX
+33D4;ID;SQUARE MB SMALL
+33D5;ID;SQUARE MIL
+33D6;ID;SQUARE MOL
+33D7;ID;SQUARE PH
+33D8;ID;SQUARE PM
+33D9;ID;SQUARE PPM
+33DA;ID;SQUARE PR
+33DB;ID;SQUARE SR
+33DC;ID;SQUARE SV
+33DD;ID;SQUARE WB
+33E0;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33E1;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33E2;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33E3;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33E4;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33E5;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33E6;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33E7;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33E8;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33E9;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33EA;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33EB;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33EC;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ED;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33EE;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33EF;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33F0;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33F1;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33F2;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33F3;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33F4;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33F5;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33F6;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33F7;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33F8;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33F9;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33FA;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33FB;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33FC;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33FD;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33FE;ID;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+3400;ID;<CJK Ideograph Extension A, First>
+4DB5;ID;<CJK Ideograph Extension A, Last>
+4E00;ID;<CJK Ideograph, First>
+9FA5;ID;<CJK Ideograph, Last>
+A000;ID;YI SYLLABLE IT
+A001;ID;YI SYLLABLE IX
+A002;ID;YI SYLLABLE I
+A003;ID;YI SYLLABLE IP
+A004;ID;YI SYLLABLE IET
+A005;ID;YI SYLLABLE IEX
+A006;ID;YI SYLLABLE IE
+A007;ID;YI SYLLABLE IEP
+A008;ID;YI SYLLABLE AT
+A009;ID;YI SYLLABLE AX
+A00A;ID;YI SYLLABLE A
+A00B;ID;YI SYLLABLE AP
+A00C;ID;YI SYLLABLE UOX
+A00D;ID;YI SYLLABLE UO
+A00E;ID;YI SYLLABLE UOP
+A00F;ID;YI SYLLABLE OT
+A010;ID;YI SYLLABLE OX
+A011;ID;YI SYLLABLE O
+A012;ID;YI SYLLABLE OP
+A013;ID;YI SYLLABLE EX
+A014;ID;YI SYLLABLE E
+A015;ID;YI SYLLABLE WU
+A016;ID;YI SYLLABLE BIT
+A017;ID;YI SYLLABLE BIX
+A018;ID;YI SYLLABLE BI
+A019;ID;YI SYLLABLE BIP
+A01A;ID;YI SYLLABLE BIET
+A01B;ID;YI SYLLABLE BIEX
+A01C;ID;YI SYLLABLE BIE
+A01D;ID;YI SYLLABLE BIEP
+A01E;ID;YI SYLLABLE BAT
+A01F;ID;YI SYLLABLE BAX
+A020;ID;YI SYLLABLE BA
+A021;ID;YI SYLLABLE BAP
+A022;ID;YI SYLLABLE BUOX
+A023;ID;YI SYLLABLE BUO
+A024;ID;YI SYLLABLE BUOP
+A025;ID;YI SYLLABLE BOT
+A026;ID;YI SYLLABLE BOX
+A027;ID;YI SYLLABLE BO
+A028;ID;YI SYLLABLE BOP
+A029;ID;YI SYLLABLE BEX
+A02A;ID;YI SYLLABLE BE
+A02B;ID;YI SYLLABLE BEP
+A02C;ID;YI SYLLABLE BUT
+A02D;ID;YI SYLLABLE BUX
+A02E;ID;YI SYLLABLE BU
+A02F;ID;YI SYLLABLE BUP
+A030;ID;YI SYLLABLE BURX
+A031;ID;YI SYLLABLE BUR
+A032;ID;YI SYLLABLE BYT
+A033;ID;YI SYLLABLE BYX
+A034;ID;YI SYLLABLE BY
+A035;ID;YI SYLLABLE BYP
+A036;ID;YI SYLLABLE BYRX
+A037;ID;YI SYLLABLE BYR
+A038;ID;YI SYLLABLE PIT
+A039;ID;YI SYLLABLE PIX
+A03A;ID;YI SYLLABLE PI
+A03B;ID;YI SYLLABLE PIP
+A03C;ID;YI SYLLABLE PIEX
+A03D;ID;YI SYLLABLE PIE
+A03E;ID;YI SYLLABLE PIEP
+A03F;ID;YI SYLLABLE PAT
+A040;ID;YI SYLLABLE PAX
+A041;ID;YI SYLLABLE PA
+A042;ID;YI SYLLABLE PAP
+A043;ID;YI SYLLABLE PUOX
+A044;ID;YI SYLLABLE PUO
+A045;ID;YI SYLLABLE PUOP
+A046;ID;YI SYLLABLE POT
+A047;ID;YI SYLLABLE POX
+A048;ID;YI SYLLABLE PO
+A049;ID;YI SYLLABLE POP
+A04A;ID;YI SYLLABLE PUT
+A04B;ID;YI SYLLABLE PUX
+A04C;ID;YI SYLLABLE PU
+A04D;ID;YI SYLLABLE PUP
+A04E;ID;YI SYLLABLE PURX
+A04F;ID;YI SYLLABLE PUR
+A050;ID;YI SYLLABLE PYT
+A051;ID;YI SYLLABLE PYX
+A052;ID;YI SYLLABLE PY
+A053;ID;YI SYLLABLE PYP
+A054;ID;YI SYLLABLE PYRX
+A055;ID;YI SYLLABLE PYR
+A056;ID;YI SYLLABLE BBIT
+A057;ID;YI SYLLABLE BBIX
+A058;ID;YI SYLLABLE BBI
+A059;ID;YI SYLLABLE BBIP
+A05A;ID;YI SYLLABLE BBIET
+A05B;ID;YI SYLLABLE BBIEX
+A05C;ID;YI SYLLABLE BBIE
+A05D;ID;YI SYLLABLE BBIEP
+A05E;ID;YI SYLLABLE BBAT
+A05F;ID;YI SYLLABLE BBAX
+A060;ID;YI SYLLABLE BBA
+A061;ID;YI SYLLABLE BBAP
+A062;ID;YI SYLLABLE BBUOX
+A063;ID;YI SYLLABLE BBUO
+A064;ID;YI SYLLABLE BBUOP
+A065;ID;YI SYLLABLE BBOT
+A066;ID;YI SYLLABLE BBOX
+A067;ID;YI SYLLABLE BBO
+A068;ID;YI SYLLABLE BBOP
+A069;ID;YI SYLLABLE BBEX
+A06A;ID;YI SYLLABLE BBE
+A06B;ID;YI SYLLABLE BBEP
+A06C;ID;YI SYLLABLE BBUT
+A06D;ID;YI SYLLABLE BBUX
+A06E;ID;YI SYLLABLE BBU
+A06F;ID;YI SYLLABLE BBUP
+A070;ID;YI SYLLABLE BBURX
+A071;ID;YI SYLLABLE BBUR
+A072;ID;YI SYLLABLE BBYT
+A073;ID;YI SYLLABLE BBYX
+A074;ID;YI SYLLABLE BBY
+A075;ID;YI SYLLABLE BBYP
+A076;ID;YI SYLLABLE NBIT
+A077;ID;YI SYLLABLE NBIX
+A078;ID;YI SYLLABLE NBI
+A079;ID;YI SYLLABLE NBIP
+A07A;ID;YI SYLLABLE NBIEX
+A07B;ID;YI SYLLABLE NBIE
+A07C;ID;YI SYLLABLE NBIEP
+A07D;ID;YI SYLLABLE NBAT
+A07E;ID;YI SYLLABLE NBAX
+A07F;ID;YI SYLLABLE NBA
+A080;ID;YI SYLLABLE NBAP
+A081;ID;YI SYLLABLE NBOT
+A082;ID;YI SYLLABLE NBOX
+A083;ID;YI SYLLABLE NBO
+A084;ID;YI SYLLABLE NBOP
+A085;ID;YI SYLLABLE NBUT
+A086;ID;YI SYLLABLE NBUX
+A087;ID;YI SYLLABLE NBU
+A088;ID;YI SYLLABLE NBUP
+A089;ID;YI SYLLABLE NBURX
+A08A;ID;YI SYLLABLE NBUR
+A08B;ID;YI SYLLABLE NBYT
+A08C;ID;YI SYLLABLE NBYX
+A08D;ID;YI SYLLABLE NBY
+A08E;ID;YI SYLLABLE NBYP
+A08F;ID;YI SYLLABLE NBYRX
+A090;ID;YI SYLLABLE NBYR
+A091;ID;YI SYLLABLE HMIT
+A092;ID;YI SYLLABLE HMIX
+A093;ID;YI SYLLABLE HMI
+A094;ID;YI SYLLABLE HMIP
+A095;ID;YI SYLLABLE HMIEX
+A096;ID;YI SYLLABLE HMIE
+A097;ID;YI SYLLABLE HMIEP
+A098;ID;YI SYLLABLE HMAT
+A099;ID;YI SYLLABLE HMAX
+A09A;ID;YI SYLLABLE HMA
+A09B;ID;YI SYLLABLE HMAP
+A09C;ID;YI SYLLABLE HMUOX
+A09D;ID;YI SYLLABLE HMUO
+A09E;ID;YI SYLLABLE HMUOP
+A09F;ID;YI SYLLABLE HMOT
+A0A0;ID;YI SYLLABLE HMOX
+A0A1;ID;YI SYLLABLE HMO
+A0A2;ID;YI SYLLABLE HMOP
+A0A3;ID;YI SYLLABLE HMUT
+A0A4;ID;YI SYLLABLE HMUX
+A0A5;ID;YI SYLLABLE HMU
+A0A6;ID;YI SYLLABLE HMUP
+A0A7;ID;YI SYLLABLE HMURX
+A0A8;ID;YI SYLLABLE HMUR
+A0A9;ID;YI SYLLABLE HMYX
+A0AA;ID;YI SYLLABLE HMY
+A0AB;ID;YI SYLLABLE HMYP
+A0AC;ID;YI SYLLABLE HMYRX
+A0AD;ID;YI SYLLABLE HMYR
+A0AE;ID;YI SYLLABLE MIT
+A0AF;ID;YI SYLLABLE MIX
+A0B0;ID;YI SYLLABLE MI
+A0B1;ID;YI SYLLABLE MIP
+A0B2;ID;YI SYLLABLE MIEX
+A0B3;ID;YI SYLLABLE MIE
+A0B4;ID;YI SYLLABLE MIEP
+A0B5;ID;YI SYLLABLE MAT
+A0B6;ID;YI SYLLABLE MAX
+A0B7;ID;YI SYLLABLE MA
+A0B8;ID;YI SYLLABLE MAP
+A0B9;ID;YI SYLLABLE MUOT
+A0BA;ID;YI SYLLABLE MUOX
+A0BB;ID;YI SYLLABLE MUO
+A0BC;ID;YI SYLLABLE MUOP
+A0BD;ID;YI SYLLABLE MOT
+A0BE;ID;YI SYLLABLE MOX
+A0BF;ID;YI SYLLABLE MO
+A0C0;ID;YI SYLLABLE MOP
+A0C1;ID;YI SYLLABLE MEX
+A0C2;ID;YI SYLLABLE ME
+A0C3;ID;YI SYLLABLE MUT
+A0C4;ID;YI SYLLABLE MUX
+A0C5;ID;YI SYLLABLE MU
+A0C6;ID;YI SYLLABLE MUP
+A0C7;ID;YI SYLLABLE MURX
+A0C8;ID;YI SYLLABLE MUR
+A0C9;ID;YI SYLLABLE MYT
+A0CA;ID;YI SYLLABLE MYX
+A0CB;ID;YI SYLLABLE MY
+A0CC;ID;YI SYLLABLE MYP
+A0CD;ID;YI SYLLABLE FIT
+A0CE;ID;YI SYLLABLE FIX
+A0CF;ID;YI SYLLABLE FI
+A0D0;ID;YI SYLLABLE FIP
+A0D1;ID;YI SYLLABLE FAT
+A0D2;ID;YI SYLLABLE FAX
+A0D3;ID;YI SYLLABLE FA
+A0D4;ID;YI SYLLABLE FAP
+A0D5;ID;YI SYLLABLE FOX
+A0D6;ID;YI SYLLABLE FO
+A0D7;ID;YI SYLLABLE FOP
+A0D8;ID;YI SYLLABLE FUT
+A0D9;ID;YI SYLLABLE FUX
+A0DA;ID;YI SYLLABLE FU
+A0DB;ID;YI SYLLABLE FUP
+A0DC;ID;YI SYLLABLE FURX
+A0DD;ID;YI SYLLABLE FUR
+A0DE;ID;YI SYLLABLE FYT
+A0DF;ID;YI SYLLABLE FYX
+A0E0;ID;YI SYLLABLE FY
+A0E1;ID;YI SYLLABLE FYP
+A0E2;ID;YI SYLLABLE VIT
+A0E3;ID;YI SYLLABLE VIX
+A0E4;ID;YI SYLLABLE VI
+A0E5;ID;YI SYLLABLE VIP
+A0E6;ID;YI SYLLABLE VIET
+A0E7;ID;YI SYLLABLE VIEX
+A0E8;ID;YI SYLLABLE VIE
+A0E9;ID;YI SYLLABLE VIEP
+A0EA;ID;YI SYLLABLE VAT
+A0EB;ID;YI SYLLABLE VAX
+A0EC;ID;YI SYLLABLE VA
+A0ED;ID;YI SYLLABLE VAP
+A0EE;ID;YI SYLLABLE VOT
+A0EF;ID;YI SYLLABLE VOX
+A0F0;ID;YI SYLLABLE VO
+A0F1;ID;YI SYLLABLE VOP
+A0F2;ID;YI SYLLABLE VEX
+A0F3;ID;YI SYLLABLE VEP
+A0F4;ID;YI SYLLABLE VUT
+A0F5;ID;YI SYLLABLE VUX
+A0F6;ID;YI SYLLABLE VU
+A0F7;ID;YI SYLLABLE VUP
+A0F8;ID;YI SYLLABLE VURX
+A0F9;ID;YI SYLLABLE VUR
+A0FA;ID;YI SYLLABLE VYT
+A0FB;ID;YI SYLLABLE VYX
+A0FC;ID;YI SYLLABLE VY
+A0FD;ID;YI SYLLABLE VYP
+A0FE;ID;YI SYLLABLE VYRX
+A0FF;ID;YI SYLLABLE VYR
+A100;ID;YI SYLLABLE DIT
+A101;ID;YI SYLLABLE DIX
+A102;ID;YI SYLLABLE DI
+A103;ID;YI SYLLABLE DIP
+A104;ID;YI SYLLABLE DIEX
+A105;ID;YI SYLLABLE DIE
+A106;ID;YI SYLLABLE DIEP
+A107;ID;YI SYLLABLE DAT
+A108;ID;YI SYLLABLE DAX
+A109;ID;YI SYLLABLE DA
+A10A;ID;YI SYLLABLE DAP
+A10B;ID;YI SYLLABLE DUOX
+A10C;ID;YI SYLLABLE DUO
+A10D;ID;YI SYLLABLE DOT
+A10E;ID;YI SYLLABLE DOX
+A10F;ID;YI SYLLABLE DO
+A110;ID;YI SYLLABLE DOP
+A111;ID;YI SYLLABLE DEX
+A112;ID;YI SYLLABLE DE
+A113;ID;YI SYLLABLE DEP
+A114;ID;YI SYLLABLE DUT
+A115;ID;YI SYLLABLE DUX
+A116;ID;YI SYLLABLE DU
+A117;ID;YI SYLLABLE DUP
+A118;ID;YI SYLLABLE DURX
+A119;ID;YI SYLLABLE DUR
+A11A;ID;YI SYLLABLE TIT
+A11B;ID;YI SYLLABLE TIX
+A11C;ID;YI SYLLABLE TI
+A11D;ID;YI SYLLABLE TIP
+A11E;ID;YI SYLLABLE TIEX
+A11F;ID;YI SYLLABLE TIE
+A120;ID;YI SYLLABLE TIEP
+A121;ID;YI SYLLABLE TAT
+A122;ID;YI SYLLABLE TAX
+A123;ID;YI SYLLABLE TA
+A124;ID;YI SYLLABLE TAP
+A125;ID;YI SYLLABLE TUOT
+A126;ID;YI SYLLABLE TUOX
+A127;ID;YI SYLLABLE TUO
+A128;ID;YI SYLLABLE TUOP
+A129;ID;YI SYLLABLE TOT
+A12A;ID;YI SYLLABLE TOX
+A12B;ID;YI SYLLABLE TO
+A12C;ID;YI SYLLABLE TOP
+A12D;ID;YI SYLLABLE TEX
+A12E;ID;YI SYLLABLE TE
+A12F;ID;YI SYLLABLE TEP
+A130;ID;YI SYLLABLE TUT
+A131;ID;YI SYLLABLE TUX
+A132;ID;YI SYLLABLE TU
+A133;ID;YI SYLLABLE TUP
+A134;ID;YI SYLLABLE TURX
+A135;ID;YI SYLLABLE TUR
+A136;ID;YI SYLLABLE DDIT
+A137;ID;YI SYLLABLE DDIX
+A138;ID;YI SYLLABLE DDI
+A139;ID;YI SYLLABLE DDIP
+A13A;ID;YI SYLLABLE DDIEX
+A13B;ID;YI SYLLABLE DDIE
+A13C;ID;YI SYLLABLE DDIEP
+A13D;ID;YI SYLLABLE DDAT
+A13E;ID;YI SYLLABLE DDAX
+A13F;ID;YI SYLLABLE DDA
+A140;ID;YI SYLLABLE DDAP
+A141;ID;YI SYLLABLE DDUOX
+A142;ID;YI SYLLABLE DDUO
+A143;ID;YI SYLLABLE DDUOP
+A144;ID;YI SYLLABLE DDOT
+A145;ID;YI SYLLABLE DDOX
+A146;ID;YI SYLLABLE DDO
+A147;ID;YI SYLLABLE DDOP
+A148;ID;YI SYLLABLE DDEX
+A149;ID;YI SYLLABLE DDE
+A14A;ID;YI SYLLABLE DDEP
+A14B;ID;YI SYLLABLE DDUT
+A14C;ID;YI SYLLABLE DDUX
+A14D;ID;YI SYLLABLE DDU
+A14E;ID;YI SYLLABLE DDUP
+A14F;ID;YI SYLLABLE DDURX
+A150;ID;YI SYLLABLE DDUR
+A151;ID;YI SYLLABLE NDIT
+A152;ID;YI SYLLABLE NDIX
+A153;ID;YI SYLLABLE NDI
+A154;ID;YI SYLLABLE NDIP
+A155;ID;YI SYLLABLE NDIEX
+A156;ID;YI SYLLABLE NDIE
+A157;ID;YI SYLLABLE NDAT
+A158;ID;YI SYLLABLE NDAX
+A159;ID;YI SYLLABLE NDA
+A15A;ID;YI SYLLABLE NDAP
+A15B;ID;YI SYLLABLE NDOT
+A15C;ID;YI SYLLABLE NDOX
+A15D;ID;YI SYLLABLE NDO
+A15E;ID;YI SYLLABLE NDOP
+A15F;ID;YI SYLLABLE NDEX
+A160;ID;YI SYLLABLE NDE
+A161;ID;YI SYLLABLE NDEP
+A162;ID;YI SYLLABLE NDUT
+A163;ID;YI SYLLABLE NDUX
+A164;ID;YI SYLLABLE NDU
+A165;ID;YI SYLLABLE NDUP
+A166;ID;YI SYLLABLE NDURX
+A167;ID;YI SYLLABLE NDUR
+A168;ID;YI SYLLABLE HNIT
+A169;ID;YI SYLLABLE HNIX
+A16A;ID;YI SYLLABLE HNI
+A16B;ID;YI SYLLABLE HNIP
+A16C;ID;YI SYLLABLE HNIET
+A16D;ID;YI SYLLABLE HNIEX
+A16E;ID;YI SYLLABLE HNIE
+A16F;ID;YI SYLLABLE HNIEP
+A170;ID;YI SYLLABLE HNAT
+A171;ID;YI SYLLABLE HNAX
+A172;ID;YI SYLLABLE HNA
+A173;ID;YI SYLLABLE HNAP
+A174;ID;YI SYLLABLE HNUOX
+A175;ID;YI SYLLABLE HNUO
+A176;ID;YI SYLLABLE HNOT
+A177;ID;YI SYLLABLE HNOX
+A178;ID;YI SYLLABLE HNOP
+A179;ID;YI SYLLABLE HNEX
+A17A;ID;YI SYLLABLE HNE
+A17B;ID;YI SYLLABLE HNEP
+A17C;ID;YI SYLLABLE HNUT
+A17D;ID;YI SYLLABLE NIT
+A17E;ID;YI SYLLABLE NIX
+A17F;ID;YI SYLLABLE NI
+A180;ID;YI SYLLABLE NIP
+A181;ID;YI SYLLABLE NIEX
+A182;ID;YI SYLLABLE NIE
+A183;ID;YI SYLLABLE NIEP
+A184;ID;YI SYLLABLE NAX
+A185;ID;YI SYLLABLE NA
+A186;ID;YI SYLLABLE NAP
+A187;ID;YI SYLLABLE NUOX
+A188;ID;YI SYLLABLE NUO
+A189;ID;YI SYLLABLE NUOP
+A18A;ID;YI SYLLABLE NOT
+A18B;ID;YI SYLLABLE NOX
+A18C;ID;YI SYLLABLE NO
+A18D;ID;YI SYLLABLE NOP
+A18E;ID;YI SYLLABLE NEX
+A18F;ID;YI SYLLABLE NE
+A190;ID;YI SYLLABLE NEP
+A191;ID;YI SYLLABLE NUT
+A192;ID;YI SYLLABLE NUX
+A193;ID;YI SYLLABLE NU
+A194;ID;YI SYLLABLE NUP
+A195;ID;YI SYLLABLE NURX
+A196;ID;YI SYLLABLE NUR
+A197;ID;YI SYLLABLE HLIT
+A198;ID;YI SYLLABLE HLIX
+A199;ID;YI SYLLABLE HLI
+A19A;ID;YI SYLLABLE HLIP
+A19B;ID;YI SYLLABLE HLIEX
+A19C;ID;YI SYLLABLE HLIE
+A19D;ID;YI SYLLABLE HLIEP
+A19E;ID;YI SYLLABLE HLAT
+A19F;ID;YI SYLLABLE HLAX
+A1A0;ID;YI SYLLABLE HLA
+A1A1;ID;YI SYLLABLE HLAP
+A1A2;ID;YI SYLLABLE HLUOX
+A1A3;ID;YI SYLLABLE HLUO
+A1A4;ID;YI SYLLABLE HLUOP
+A1A5;ID;YI SYLLABLE HLOX
+A1A6;ID;YI SYLLABLE HLO
+A1A7;ID;YI SYLLABLE HLOP
+A1A8;ID;YI SYLLABLE HLEX
+A1A9;ID;YI SYLLABLE HLE
+A1AA;ID;YI SYLLABLE HLEP
+A1AB;ID;YI SYLLABLE HLUT
+A1AC;ID;YI SYLLABLE HLUX
+A1AD;ID;YI SYLLABLE HLU
+A1AE;ID;YI SYLLABLE HLUP
+A1AF;ID;YI SYLLABLE HLURX
+A1B0;ID;YI SYLLABLE HLUR
+A1B1;ID;YI SYLLABLE HLYT
+A1B2;ID;YI SYLLABLE HLYX
+A1B3;ID;YI SYLLABLE HLY
+A1B4;ID;YI SYLLABLE HLYP
+A1B5;ID;YI SYLLABLE HLYRX
+A1B6;ID;YI SYLLABLE HLYR
+A1B7;ID;YI SYLLABLE LIT
+A1B8;ID;YI SYLLABLE LIX
+A1B9;ID;YI SYLLABLE LI
+A1BA;ID;YI SYLLABLE LIP
+A1BB;ID;YI SYLLABLE LIET
+A1BC;ID;YI SYLLABLE LIEX
+A1BD;ID;YI SYLLABLE LIE
+A1BE;ID;YI SYLLABLE LIEP
+A1BF;ID;YI SYLLABLE LAT
+A1C0;ID;YI SYLLABLE LAX
+A1C1;ID;YI SYLLABLE LA
+A1C2;ID;YI SYLLABLE LAP
+A1C3;ID;YI SYLLABLE LUOT
+A1C4;ID;YI SYLLABLE LUOX
+A1C5;ID;YI SYLLABLE LUO
+A1C6;ID;YI SYLLABLE LUOP
+A1C7;ID;YI SYLLABLE LOT
+A1C8;ID;YI SYLLABLE LOX
+A1C9;ID;YI SYLLABLE LO
+A1CA;ID;YI SYLLABLE LOP
+A1CB;ID;YI SYLLABLE LEX
+A1CC;ID;YI SYLLABLE LE
+A1CD;ID;YI SYLLABLE LEP
+A1CE;ID;YI SYLLABLE LUT
+A1CF;ID;YI SYLLABLE LUX
+A1D0;ID;YI SYLLABLE LU
+A1D1;ID;YI SYLLABLE LUP
+A1D2;ID;YI SYLLABLE LURX
+A1D3;ID;YI SYLLABLE LUR
+A1D4;ID;YI SYLLABLE LYT
+A1D5;ID;YI SYLLABLE LYX
+A1D6;ID;YI SYLLABLE LY
+A1D7;ID;YI SYLLABLE LYP
+A1D8;ID;YI SYLLABLE LYRX
+A1D9;ID;YI SYLLABLE LYR
+A1DA;ID;YI SYLLABLE GIT
+A1DB;ID;YI SYLLABLE GIX
+A1DC;ID;YI SYLLABLE GI
+A1DD;ID;YI SYLLABLE GIP
+A1DE;ID;YI SYLLABLE GIET
+A1DF;ID;YI SYLLABLE GIEX
+A1E0;ID;YI SYLLABLE GIE
+A1E1;ID;YI SYLLABLE GIEP
+A1E2;ID;YI SYLLABLE GAT
+A1E3;ID;YI SYLLABLE GAX
+A1E4;ID;YI SYLLABLE GA
+A1E5;ID;YI SYLLABLE GAP
+A1E6;ID;YI SYLLABLE GUOT
+A1E7;ID;YI SYLLABLE GUOX
+A1E8;ID;YI SYLLABLE GUO
+A1E9;ID;YI SYLLABLE GUOP
+A1EA;ID;YI SYLLABLE GOT
+A1EB;ID;YI SYLLABLE GOX
+A1EC;ID;YI SYLLABLE GO
+A1ED;ID;YI SYLLABLE GOP
+A1EE;ID;YI SYLLABLE GET
+A1EF;ID;YI SYLLABLE GEX
+A1F0;ID;YI SYLLABLE GE
+A1F1;ID;YI SYLLABLE GEP
+A1F2;ID;YI SYLLABLE GUT
+A1F3;ID;YI SYLLABLE GUX
+A1F4;ID;YI SYLLABLE GU
+A1F5;ID;YI SYLLABLE GUP
+A1F6;ID;YI SYLLABLE GURX
+A1F7;ID;YI SYLLABLE GUR
+A1F8;ID;YI SYLLABLE KIT
+A1F9;ID;YI SYLLABLE KIX
+A1FA;ID;YI SYLLABLE KI
+A1FB;ID;YI SYLLABLE KIP
+A1FC;ID;YI SYLLABLE KIEX
+A1FD;ID;YI SYLLABLE KIE
+A1FE;ID;YI SYLLABLE KIEP
+A1FF;ID;YI SYLLABLE KAT
+A200;ID;YI SYLLABLE KAX
+A201;ID;YI SYLLABLE KA
+A202;ID;YI SYLLABLE KAP
+A203;ID;YI SYLLABLE KUOX
+A204;ID;YI SYLLABLE KUO
+A205;ID;YI SYLLABLE KUOP
+A206;ID;YI SYLLABLE KOT
+A207;ID;YI SYLLABLE KOX
+A208;ID;YI SYLLABLE KO
+A209;ID;YI SYLLABLE KOP
+A20A;ID;YI SYLLABLE KET
+A20B;ID;YI SYLLABLE KEX
+A20C;ID;YI SYLLABLE KE
+A20D;ID;YI SYLLABLE KEP
+A20E;ID;YI SYLLABLE KUT
+A20F;ID;YI SYLLABLE KUX
+A210;ID;YI SYLLABLE KU
+A211;ID;YI SYLLABLE KUP
+A212;ID;YI SYLLABLE KURX
+A213;ID;YI SYLLABLE KUR
+A214;ID;YI SYLLABLE GGIT
+A215;ID;YI SYLLABLE GGIX
+A216;ID;YI SYLLABLE GGI
+A217;ID;YI SYLLABLE GGIEX
+A218;ID;YI SYLLABLE GGIE
+A219;ID;YI SYLLABLE GGIEP
+A21A;ID;YI SYLLABLE GGAT
+A21B;ID;YI SYLLABLE GGAX
+A21C;ID;YI SYLLABLE GGA
+A21D;ID;YI SYLLABLE GGAP
+A21E;ID;YI SYLLABLE GGUOT
+A21F;ID;YI SYLLABLE GGUOX
+A220;ID;YI SYLLABLE GGUO
+A221;ID;YI SYLLABLE GGUOP
+A222;ID;YI SYLLABLE GGOT
+A223;ID;YI SYLLABLE GGOX
+A224;ID;YI SYLLABLE GGO
+A225;ID;YI SYLLABLE GGOP
+A226;ID;YI SYLLABLE GGET
+A227;ID;YI SYLLABLE GGEX
+A228;ID;YI SYLLABLE GGE
+A229;ID;YI SYLLABLE GGEP
+A22A;ID;YI SYLLABLE GGUT
+A22B;ID;YI SYLLABLE GGUX
+A22C;ID;YI SYLLABLE GGU
+A22D;ID;YI SYLLABLE GGUP
+A22E;ID;YI SYLLABLE GGURX
+A22F;ID;YI SYLLABLE GGUR
+A230;ID;YI SYLLABLE MGIEX
+A231;ID;YI SYLLABLE MGIE
+A232;ID;YI SYLLABLE MGAT
+A233;ID;YI SYLLABLE MGAX
+A234;ID;YI SYLLABLE MGA
+A235;ID;YI SYLLABLE MGAP
+A236;ID;YI SYLLABLE MGUOX
+A237;ID;YI SYLLABLE MGUO
+A238;ID;YI SYLLABLE MGUOP
+A239;ID;YI SYLLABLE MGOT
+A23A;ID;YI SYLLABLE MGOX
+A23B;ID;YI SYLLABLE MGO
+A23C;ID;YI SYLLABLE MGOP
+A23D;ID;YI SYLLABLE MGEX
+A23E;ID;YI SYLLABLE MGE
+A23F;ID;YI SYLLABLE MGEP
+A240;ID;YI SYLLABLE MGUT
+A241;ID;YI SYLLABLE MGUX
+A242;ID;YI SYLLABLE MGU
+A243;ID;YI SYLLABLE MGUP
+A244;ID;YI SYLLABLE MGURX
+A245;ID;YI SYLLABLE MGUR
+A246;ID;YI SYLLABLE HXIT
+A247;ID;YI SYLLABLE HXIX
+A248;ID;YI SYLLABLE HXI
+A249;ID;YI SYLLABLE HXIP
+A24A;ID;YI SYLLABLE HXIET
+A24B;ID;YI SYLLABLE HXIEX
+A24C;ID;YI SYLLABLE HXIE
+A24D;ID;YI SYLLABLE HXIEP
+A24E;ID;YI SYLLABLE HXAT
+A24F;ID;YI SYLLABLE HXAX
+A250;ID;YI SYLLABLE HXA
+A251;ID;YI SYLLABLE HXAP
+A252;ID;YI SYLLABLE HXUOT
+A253;ID;YI SYLLABLE HXUOX
+A254;ID;YI SYLLABLE HXUO
+A255;ID;YI SYLLABLE HXUOP
+A256;ID;YI SYLLABLE HXOT
+A257;ID;YI SYLLABLE HXOX
+A258;ID;YI SYLLABLE HXO
+A259;ID;YI SYLLABLE HXOP
+A25A;ID;YI SYLLABLE HXEX
+A25B;ID;YI SYLLABLE HXE
+A25C;ID;YI SYLLABLE HXEP
+A25D;ID;YI SYLLABLE NGIEX
+A25E;ID;YI SYLLABLE NGIE
+A25F;ID;YI SYLLABLE NGIEP
+A260;ID;YI SYLLABLE NGAT
+A261;ID;YI SYLLABLE NGAX
+A262;ID;YI SYLLABLE NGA
+A263;ID;YI SYLLABLE NGAP
+A264;ID;YI SYLLABLE NGUOT
+A265;ID;YI SYLLABLE NGUOX
+A266;ID;YI SYLLABLE NGUO
+A267;ID;YI SYLLABLE NGOT
+A268;ID;YI SYLLABLE NGOX
+A269;ID;YI SYLLABLE NGO
+A26A;ID;YI SYLLABLE NGOP
+A26B;ID;YI SYLLABLE NGEX
+A26C;ID;YI SYLLABLE NGE
+A26D;ID;YI SYLLABLE NGEP
+A26E;ID;YI SYLLABLE HIT
+A26F;ID;YI SYLLABLE HIEX
+A270;ID;YI SYLLABLE HIE
+A271;ID;YI SYLLABLE HAT
+A272;ID;YI SYLLABLE HAX
+A273;ID;YI SYLLABLE HA
+A274;ID;YI SYLLABLE HAP
+A275;ID;YI SYLLABLE HUOT
+A276;ID;YI SYLLABLE HUOX
+A277;ID;YI SYLLABLE HUO
+A278;ID;YI SYLLABLE HUOP
+A279;ID;YI SYLLABLE HOT
+A27A;ID;YI SYLLABLE HOX
+A27B;ID;YI SYLLABLE HO
+A27C;ID;YI SYLLABLE HOP
+A27D;ID;YI SYLLABLE HEX
+A27E;ID;YI SYLLABLE HE
+A27F;ID;YI SYLLABLE HEP
+A280;ID;YI SYLLABLE WAT
+A281;ID;YI SYLLABLE WAX
+A282;ID;YI SYLLABLE WA
+A283;ID;YI SYLLABLE WAP
+A284;ID;YI SYLLABLE WUOX
+A285;ID;YI SYLLABLE WUO
+A286;ID;YI SYLLABLE WUOP
+A287;ID;YI SYLLABLE WOX
+A288;ID;YI SYLLABLE WO
+A289;ID;YI SYLLABLE WOP
+A28A;ID;YI SYLLABLE WEX
+A28B;ID;YI SYLLABLE WE
+A28C;ID;YI SYLLABLE WEP
+A28D;ID;YI SYLLABLE ZIT
+A28E;ID;YI SYLLABLE ZIX
+A28F;ID;YI SYLLABLE ZI
+A290;ID;YI SYLLABLE ZIP
+A291;ID;YI SYLLABLE ZIEX
+A292;ID;YI SYLLABLE ZIE
+A293;ID;YI SYLLABLE ZIEP
+A294;ID;YI SYLLABLE ZAT
+A295;ID;YI SYLLABLE ZAX
+A296;ID;YI SYLLABLE ZA
+A297;ID;YI SYLLABLE ZAP
+A298;ID;YI SYLLABLE ZUOX
+A299;ID;YI SYLLABLE ZUO
+A29A;ID;YI SYLLABLE ZUOP
+A29B;ID;YI SYLLABLE ZOT
+A29C;ID;YI SYLLABLE ZOX
+A29D;ID;YI SYLLABLE ZO
+A29E;ID;YI SYLLABLE ZOP
+A29F;ID;YI SYLLABLE ZEX
+A2A0;ID;YI SYLLABLE ZE
+A2A1;ID;YI SYLLABLE ZEP
+A2A2;ID;YI SYLLABLE ZUT
+A2A3;ID;YI SYLLABLE ZUX
+A2A4;ID;YI SYLLABLE ZU
+A2A5;ID;YI SYLLABLE ZUP
+A2A6;ID;YI SYLLABLE ZURX
+A2A7;ID;YI SYLLABLE ZUR
+A2A8;ID;YI SYLLABLE ZYT
+A2A9;ID;YI SYLLABLE ZYX
+A2AA;ID;YI SYLLABLE ZY
+A2AB;ID;YI SYLLABLE ZYP
+A2AC;ID;YI SYLLABLE ZYRX
+A2AD;ID;YI SYLLABLE ZYR
+A2AE;ID;YI SYLLABLE CIT
+A2AF;ID;YI SYLLABLE CIX
+A2B0;ID;YI SYLLABLE CI
+A2B1;ID;YI SYLLABLE CIP
+A2B2;ID;YI SYLLABLE CIET
+A2B3;ID;YI SYLLABLE CIEX
+A2B4;ID;YI SYLLABLE CIE
+A2B5;ID;YI SYLLABLE CIEP
+A2B6;ID;YI SYLLABLE CAT
+A2B7;ID;YI SYLLABLE CAX
+A2B8;ID;YI SYLLABLE CA
+A2B9;ID;YI SYLLABLE CAP
+A2BA;ID;YI SYLLABLE CUOX
+A2BB;ID;YI SYLLABLE CUO
+A2BC;ID;YI SYLLABLE CUOP
+A2BD;ID;YI SYLLABLE COT
+A2BE;ID;YI SYLLABLE COX
+A2BF;ID;YI SYLLABLE CO
+A2C0;ID;YI SYLLABLE COP
+A2C1;ID;YI SYLLABLE CEX
+A2C2;ID;YI SYLLABLE CE
+A2C3;ID;YI SYLLABLE CEP
+A2C4;ID;YI SYLLABLE CUT
+A2C5;ID;YI SYLLABLE CUX
+A2C6;ID;YI SYLLABLE CU
+A2C7;ID;YI SYLLABLE CUP
+A2C8;ID;YI SYLLABLE CURX
+A2C9;ID;YI SYLLABLE CUR
+A2CA;ID;YI SYLLABLE CYT
+A2CB;ID;YI SYLLABLE CYX
+A2CC;ID;YI SYLLABLE CY
+A2CD;ID;YI SYLLABLE CYP
+A2CE;ID;YI SYLLABLE CYRX
+A2CF;ID;YI SYLLABLE CYR
+A2D0;ID;YI SYLLABLE ZZIT
+A2D1;ID;YI SYLLABLE ZZIX
+A2D2;ID;YI SYLLABLE ZZI
+A2D3;ID;YI SYLLABLE ZZIP
+A2D4;ID;YI SYLLABLE ZZIET
+A2D5;ID;YI SYLLABLE ZZIEX
+A2D6;ID;YI SYLLABLE ZZIE
+A2D7;ID;YI SYLLABLE ZZIEP
+A2D8;ID;YI SYLLABLE ZZAT
+A2D9;ID;YI SYLLABLE ZZAX
+A2DA;ID;YI SYLLABLE ZZA
+A2DB;ID;YI SYLLABLE ZZAP
+A2DC;ID;YI SYLLABLE ZZOX
+A2DD;ID;YI SYLLABLE ZZO
+A2DE;ID;YI SYLLABLE ZZOP
+A2DF;ID;YI SYLLABLE ZZEX
+A2E0;ID;YI SYLLABLE ZZE
+A2E1;ID;YI SYLLABLE ZZEP
+A2E2;ID;YI SYLLABLE ZZUX
+A2E3;ID;YI SYLLABLE ZZU
+A2E4;ID;YI SYLLABLE ZZUP
+A2E5;ID;YI SYLLABLE ZZURX
+A2E6;ID;YI SYLLABLE ZZUR
+A2E7;ID;YI SYLLABLE ZZYT
+A2E8;ID;YI SYLLABLE ZZYX
+A2E9;ID;YI SYLLABLE ZZY
+A2EA;ID;YI SYLLABLE ZZYP
+A2EB;ID;YI SYLLABLE ZZYRX
+A2EC;ID;YI SYLLABLE ZZYR
+A2ED;ID;YI SYLLABLE NZIT
+A2EE;ID;YI SYLLABLE NZIX
+A2EF;ID;YI SYLLABLE NZI
+A2F0;ID;YI SYLLABLE NZIP
+A2F1;ID;YI SYLLABLE NZIEX
+A2F2;ID;YI SYLLABLE NZIE
+A2F3;ID;YI SYLLABLE NZIEP
+A2F4;ID;YI SYLLABLE NZAT
+A2F5;ID;YI SYLLABLE NZAX
+A2F6;ID;YI SYLLABLE NZA
+A2F7;ID;YI SYLLABLE NZAP
+A2F8;ID;YI SYLLABLE NZUOX
+A2F9;ID;YI SYLLABLE NZUO
+A2FA;ID;YI SYLLABLE NZOX
+A2FB;ID;YI SYLLABLE NZOP
+A2FC;ID;YI SYLLABLE NZEX
+A2FD;ID;YI SYLLABLE NZE
+A2FE;ID;YI SYLLABLE NZUX
+A2FF;ID;YI SYLLABLE NZU
+A300;ID;YI SYLLABLE NZUP
+A301;ID;YI SYLLABLE NZURX
+A302;ID;YI SYLLABLE NZUR
+A303;ID;YI SYLLABLE NZYT
+A304;ID;YI SYLLABLE NZYX
+A305;ID;YI SYLLABLE NZY
+A306;ID;YI SYLLABLE NZYP
+A307;ID;YI SYLLABLE NZYRX
+A308;ID;YI SYLLABLE NZYR
+A309;ID;YI SYLLABLE SIT
+A30A;ID;YI SYLLABLE SIX
+A30B;ID;YI SYLLABLE SI
+A30C;ID;YI SYLLABLE SIP
+A30D;ID;YI SYLLABLE SIEX
+A30E;ID;YI SYLLABLE SIE
+A30F;ID;YI SYLLABLE SIEP
+A310;ID;YI SYLLABLE SAT
+A311;ID;YI SYLLABLE SAX
+A312;ID;YI SYLLABLE SA
+A313;ID;YI SYLLABLE SAP
+A314;ID;YI SYLLABLE SUOX
+A315;ID;YI SYLLABLE SUO
+A316;ID;YI SYLLABLE SUOP
+A317;ID;YI SYLLABLE SOT
+A318;ID;YI SYLLABLE SOX
+A319;ID;YI SYLLABLE SO
+A31A;ID;YI SYLLABLE SOP
+A31B;ID;YI SYLLABLE SEX
+A31C;ID;YI SYLLABLE SE
+A31D;ID;YI SYLLABLE SEP
+A31E;ID;YI SYLLABLE SUT
+A31F;ID;YI SYLLABLE SUX
+A320;ID;YI SYLLABLE SU
+A321;ID;YI SYLLABLE SUP
+A322;ID;YI SYLLABLE SURX
+A323;ID;YI SYLLABLE SUR
+A324;ID;YI SYLLABLE SYT
+A325;ID;YI SYLLABLE SYX
+A326;ID;YI SYLLABLE SY
+A327;ID;YI SYLLABLE SYP
+A328;ID;YI SYLLABLE SYRX
+A329;ID;YI SYLLABLE SYR
+A32A;ID;YI SYLLABLE SSIT
+A32B;ID;YI SYLLABLE SSIX
+A32C;ID;YI SYLLABLE SSI
+A32D;ID;YI SYLLABLE SSIP
+A32E;ID;YI SYLLABLE SSIEX
+A32F;ID;YI SYLLABLE SSIE
+A330;ID;YI SYLLABLE SSIEP
+A331;ID;YI SYLLABLE SSAT
+A332;ID;YI SYLLABLE SSAX
+A333;ID;YI SYLLABLE SSA
+A334;ID;YI SYLLABLE SSAP
+A335;ID;YI SYLLABLE SSOT
+A336;ID;YI SYLLABLE SSOX
+A337;ID;YI SYLLABLE SSO
+A338;ID;YI SYLLABLE SSOP
+A339;ID;YI SYLLABLE SSEX
+A33A;ID;YI SYLLABLE SSE
+A33B;ID;YI SYLLABLE SSEP
+A33C;ID;YI SYLLABLE SSUT
+A33D;ID;YI SYLLABLE SSUX
+A33E;ID;YI SYLLABLE SSU
+A33F;ID;YI SYLLABLE SSUP
+A340;ID;YI SYLLABLE SSYT
+A341;ID;YI SYLLABLE SSYX
+A342;ID;YI SYLLABLE SSY
+A343;ID;YI SYLLABLE SSYP
+A344;ID;YI SYLLABLE SSYRX
+A345;ID;YI SYLLABLE SSYR
+A346;ID;YI SYLLABLE ZHAT
+A347;ID;YI SYLLABLE ZHAX
+A348;ID;YI SYLLABLE ZHA
+A349;ID;YI SYLLABLE ZHAP
+A34A;ID;YI SYLLABLE ZHUOX
+A34B;ID;YI SYLLABLE ZHUO
+A34C;ID;YI SYLLABLE ZHUOP
+A34D;ID;YI SYLLABLE ZHOT
+A34E;ID;YI SYLLABLE ZHOX
+A34F;ID;YI SYLLABLE ZHO
+A350;ID;YI SYLLABLE ZHOP
+A351;ID;YI SYLLABLE ZHET
+A352;ID;YI SYLLABLE ZHEX
+A353;ID;YI SYLLABLE ZHE
+A354;ID;YI SYLLABLE ZHEP
+A355;ID;YI SYLLABLE ZHUT
+A356;ID;YI SYLLABLE ZHUX
+A357;ID;YI SYLLABLE ZHU
+A358;ID;YI SYLLABLE ZHUP
+A359;ID;YI SYLLABLE ZHURX
+A35A;ID;YI SYLLABLE ZHUR
+A35B;ID;YI SYLLABLE ZHYT
+A35C;ID;YI SYLLABLE ZHYX
+A35D;ID;YI SYLLABLE ZHY
+A35E;ID;YI SYLLABLE ZHYP
+A35F;ID;YI SYLLABLE ZHYRX
+A360;ID;YI SYLLABLE ZHYR
+A361;ID;YI SYLLABLE CHAT
+A362;ID;YI SYLLABLE CHAX
+A363;ID;YI SYLLABLE CHA
+A364;ID;YI SYLLABLE CHAP
+A365;ID;YI SYLLABLE CHUOT
+A366;ID;YI SYLLABLE CHUOX
+A367;ID;YI SYLLABLE CHUO
+A368;ID;YI SYLLABLE CHUOP
+A369;ID;YI SYLLABLE CHOT
+A36A;ID;YI SYLLABLE CHOX
+A36B;ID;YI SYLLABLE CHO
+A36C;ID;YI SYLLABLE CHOP
+A36D;ID;YI SYLLABLE CHET
+A36E;ID;YI SYLLABLE CHEX
+A36F;ID;YI SYLLABLE CHE
+A370;ID;YI SYLLABLE CHEP
+A371;ID;YI SYLLABLE CHUX
+A372;ID;YI SYLLABLE CHU
+A373;ID;YI SYLLABLE CHUP
+A374;ID;YI SYLLABLE CHURX
+A375;ID;YI SYLLABLE CHUR
+A376;ID;YI SYLLABLE CHYT
+A377;ID;YI SYLLABLE CHYX
+A378;ID;YI SYLLABLE CHY
+A379;ID;YI SYLLABLE CHYP
+A37A;ID;YI SYLLABLE CHYRX
+A37B;ID;YI SYLLABLE CHYR
+A37C;ID;YI SYLLABLE RRAX
+A37D;ID;YI SYLLABLE RRA
+A37E;ID;YI SYLLABLE RRUOX
+A37F;ID;YI SYLLABLE RRUO
+A380;ID;YI SYLLABLE RROT
+A381;ID;YI SYLLABLE RROX
+A382;ID;YI SYLLABLE RRO
+A383;ID;YI SYLLABLE RROP
+A384;ID;YI SYLLABLE RRET
+A385;ID;YI SYLLABLE RREX
+A386;ID;YI SYLLABLE RRE
+A387;ID;YI SYLLABLE RREP
+A388;ID;YI SYLLABLE RRUT
+A389;ID;YI SYLLABLE RRUX
+A38A;ID;YI SYLLABLE RRU
+A38B;ID;YI SYLLABLE RRUP
+A38C;ID;YI SYLLABLE RRURX
+A38D;ID;YI SYLLABLE RRUR
+A38E;ID;YI SYLLABLE RRYT
+A38F;ID;YI SYLLABLE RRYX
+A390;ID;YI SYLLABLE RRY
+A391;ID;YI SYLLABLE RRYP
+A392;ID;YI SYLLABLE RRYRX
+A393;ID;YI SYLLABLE RRYR
+A394;ID;YI SYLLABLE NRAT
+A395;ID;YI SYLLABLE NRAX
+A396;ID;YI SYLLABLE NRA
+A397;ID;YI SYLLABLE NRAP
+A398;ID;YI SYLLABLE NROX
+A399;ID;YI SYLLABLE NRO
+A39A;ID;YI SYLLABLE NROP
+A39B;ID;YI SYLLABLE NRET
+A39C;ID;YI SYLLABLE NREX
+A39D;ID;YI SYLLABLE NRE
+A39E;ID;YI SYLLABLE NREP
+A39F;ID;YI SYLLABLE NRUT
+A3A0;ID;YI SYLLABLE NRUX
+A3A1;ID;YI SYLLABLE NRU
+A3A2;ID;YI SYLLABLE NRUP
+A3A3;ID;YI SYLLABLE NRURX
+A3A4;ID;YI SYLLABLE NRUR
+A3A5;ID;YI SYLLABLE NRYT
+A3A6;ID;YI SYLLABLE NRYX
+A3A7;ID;YI SYLLABLE NRY
+A3A8;ID;YI SYLLABLE NRYP
+A3A9;ID;YI SYLLABLE NRYRX
+A3AA;ID;YI SYLLABLE NRYR
+A3AB;ID;YI SYLLABLE SHAT
+A3AC;ID;YI SYLLABLE SHAX
+A3AD;ID;YI SYLLABLE SHA
+A3AE;ID;YI SYLLABLE SHAP
+A3AF;ID;YI SYLLABLE SHUOX
+A3B0;ID;YI SYLLABLE SHUO
+A3B1;ID;YI SYLLABLE SHUOP
+A3B2;ID;YI SYLLABLE SHOT
+A3B3;ID;YI SYLLABLE SHOX
+A3B4;ID;YI SYLLABLE SHO
+A3B5;ID;YI SYLLABLE SHOP
+A3B6;ID;YI SYLLABLE SHET
+A3B7;ID;YI SYLLABLE SHEX
+A3B8;ID;YI SYLLABLE SHE
+A3B9;ID;YI SYLLABLE SHEP
+A3BA;ID;YI SYLLABLE SHUT
+A3BB;ID;YI SYLLABLE SHUX
+A3BC;ID;YI SYLLABLE SHU
+A3BD;ID;YI SYLLABLE SHUP
+A3BE;ID;YI SYLLABLE SHURX
+A3BF;ID;YI SYLLABLE SHUR
+A3C0;ID;YI SYLLABLE SHYT
+A3C1;ID;YI SYLLABLE SHYX
+A3C2;ID;YI SYLLABLE SHY
+A3C3;ID;YI SYLLABLE SHYP
+A3C4;ID;YI SYLLABLE SHYRX
+A3C5;ID;YI SYLLABLE SHYR
+A3C6;ID;YI SYLLABLE RAT
+A3C7;ID;YI SYLLABLE RAX
+A3C8;ID;YI SYLLABLE RA
+A3C9;ID;YI SYLLABLE RAP
+A3CA;ID;YI SYLLABLE RUOX
+A3CB;ID;YI SYLLABLE RUO
+A3CC;ID;YI SYLLABLE RUOP
+A3CD;ID;YI SYLLABLE ROT
+A3CE;ID;YI SYLLABLE ROX
+A3CF;ID;YI SYLLABLE RO
+A3D0;ID;YI SYLLABLE ROP
+A3D1;ID;YI SYLLABLE REX
+A3D2;ID;YI SYLLABLE RE
+A3D3;ID;YI SYLLABLE REP
+A3D4;ID;YI SYLLABLE RUT
+A3D5;ID;YI SYLLABLE RUX
+A3D6;ID;YI SYLLABLE RU
+A3D7;ID;YI SYLLABLE RUP
+A3D8;ID;YI SYLLABLE RURX
+A3D9;ID;YI SYLLABLE RUR
+A3DA;ID;YI SYLLABLE RYT
+A3DB;ID;YI SYLLABLE RYX
+A3DC;ID;YI SYLLABLE RY
+A3DD;ID;YI SYLLABLE RYP
+A3DE;ID;YI SYLLABLE RYRX
+A3DF;ID;YI SYLLABLE RYR
+A3E0;ID;YI SYLLABLE JIT
+A3E1;ID;YI SYLLABLE JIX
+A3E2;ID;YI SYLLABLE JI
+A3E3;ID;YI SYLLABLE JIP
+A3E4;ID;YI SYLLABLE JIET
+A3E5;ID;YI SYLLABLE JIEX
+A3E6;ID;YI SYLLABLE JIE
+A3E7;ID;YI SYLLABLE JIEP
+A3E8;ID;YI SYLLABLE JUOT
+A3E9;ID;YI SYLLABLE JUOX
+A3EA;ID;YI SYLLABLE JUO
+A3EB;ID;YI SYLLABLE JUOP
+A3EC;ID;YI SYLLABLE JOT
+A3ED;ID;YI SYLLABLE JOX
+A3EE;ID;YI SYLLABLE JO
+A3EF;ID;YI SYLLABLE JOP
+A3F0;ID;YI SYLLABLE JUT
+A3F1;ID;YI SYLLABLE JUX
+A3F2;ID;YI SYLLABLE JU
+A3F3;ID;YI SYLLABLE JUP
+A3F4;ID;YI SYLLABLE JURX
+A3F5;ID;YI SYLLABLE JUR
+A3F6;ID;YI SYLLABLE JYT
+A3F7;ID;YI SYLLABLE JYX
+A3F8;ID;YI SYLLABLE JY
+A3F9;ID;YI SYLLABLE JYP
+A3FA;ID;YI SYLLABLE JYRX
+A3FB;ID;YI SYLLABLE JYR
+A3FC;ID;YI SYLLABLE QIT
+A3FD;ID;YI SYLLABLE QIX
+A3FE;ID;YI SYLLABLE QI
+A3FF;ID;YI SYLLABLE QIP
+A400;ID;YI SYLLABLE QIET
+A401;ID;YI SYLLABLE QIEX
+A402;ID;YI SYLLABLE QIE
+A403;ID;YI SYLLABLE QIEP
+A404;ID;YI SYLLABLE QUOT
+A405;ID;YI SYLLABLE QUOX
+A406;ID;YI SYLLABLE QUO
+A407;ID;YI SYLLABLE QUOP
+A408;ID;YI SYLLABLE QOT
+A409;ID;YI SYLLABLE QOX
+A40A;ID;YI SYLLABLE QO
+A40B;ID;YI SYLLABLE QOP
+A40C;ID;YI SYLLABLE QUT
+A40D;ID;YI SYLLABLE QUX
+A40E;ID;YI SYLLABLE QU
+A40F;ID;YI SYLLABLE QUP
+A410;ID;YI SYLLABLE QURX
+A411;ID;YI SYLLABLE QUR
+A412;ID;YI SYLLABLE QYT
+A413;ID;YI SYLLABLE QYX
+A414;ID;YI SYLLABLE QY
+A415;ID;YI SYLLABLE QYP
+A416;ID;YI SYLLABLE QYRX
+A417;ID;YI SYLLABLE QYR
+A418;ID;YI SYLLABLE JJIT
+A419;ID;YI SYLLABLE JJIX
+A41A;ID;YI SYLLABLE JJI
+A41B;ID;YI SYLLABLE JJIP
+A41C;ID;YI SYLLABLE JJIET
+A41D;ID;YI SYLLABLE JJIEX
+A41E;ID;YI SYLLABLE JJIE
+A41F;ID;YI SYLLABLE JJIEP
+A420;ID;YI SYLLABLE JJUOX
+A421;ID;YI SYLLABLE JJUO
+A422;ID;YI SYLLABLE JJUOP
+A423;ID;YI SYLLABLE JJOT
+A424;ID;YI SYLLABLE JJOX
+A425;ID;YI SYLLABLE JJO
+A426;ID;YI SYLLABLE JJOP
+A427;ID;YI SYLLABLE JJUT
+A428;ID;YI SYLLABLE JJUX
+A429;ID;YI SYLLABLE JJU
+A42A;ID;YI SYLLABLE JJUP
+A42B;ID;YI SYLLABLE JJURX
+A42C;ID;YI SYLLABLE JJUR
+A42D;ID;YI SYLLABLE JJYT
+A42E;ID;YI SYLLABLE JJYX
+A42F;ID;YI SYLLABLE JJY
+A430;ID;YI SYLLABLE JJYP
+A431;ID;YI SYLLABLE NJIT
+A432;ID;YI SYLLABLE NJIX
+A433;ID;YI SYLLABLE NJI
+A434;ID;YI SYLLABLE NJIP
+A435;ID;YI SYLLABLE NJIET
+A436;ID;YI SYLLABLE NJIEX
+A437;ID;YI SYLLABLE NJIE
+A438;ID;YI SYLLABLE NJIEP
+A439;ID;YI SYLLABLE NJUOX
+A43A;ID;YI SYLLABLE NJUO
+A43B;ID;YI SYLLABLE NJOT
+A43C;ID;YI SYLLABLE NJOX
+A43D;ID;YI SYLLABLE NJO
+A43E;ID;YI SYLLABLE NJOP
+A43F;ID;YI SYLLABLE NJUX
+A440;ID;YI SYLLABLE NJU
+A441;ID;YI SYLLABLE NJUP
+A442;ID;YI SYLLABLE NJURX
+A443;ID;YI SYLLABLE NJUR
+A444;ID;YI SYLLABLE NJYT
+A445;ID;YI SYLLABLE NJYX
+A446;ID;YI SYLLABLE NJY
+A447;ID;YI SYLLABLE NJYP
+A448;ID;YI SYLLABLE NJYRX
+A449;ID;YI SYLLABLE NJYR
+A44A;ID;YI SYLLABLE NYIT
+A44B;ID;YI SYLLABLE NYIX
+A44C;ID;YI SYLLABLE NYI
+A44D;ID;YI SYLLABLE NYIP
+A44E;ID;YI SYLLABLE NYIET
+A44F;ID;YI SYLLABLE NYIEX
+A450;ID;YI SYLLABLE NYIE
+A451;ID;YI SYLLABLE NYIEP
+A452;ID;YI SYLLABLE NYUOX
+A453;ID;YI SYLLABLE NYUO
+A454;ID;YI SYLLABLE NYUOP
+A455;ID;YI SYLLABLE NYOT
+A456;ID;YI SYLLABLE NYOX
+A457;ID;YI SYLLABLE NYO
+A458;ID;YI SYLLABLE NYOP
+A459;ID;YI SYLLABLE NYUT
+A45A;ID;YI SYLLABLE NYUX
+A45B;ID;YI SYLLABLE NYU
+A45C;ID;YI SYLLABLE NYUP
+A45D;ID;YI SYLLABLE XIT
+A45E;ID;YI SYLLABLE XIX
+A45F;ID;YI SYLLABLE XI
+A460;ID;YI SYLLABLE XIP
+A461;ID;YI SYLLABLE XIET
+A462;ID;YI SYLLABLE XIEX
+A463;ID;YI SYLLABLE XIE
+A464;ID;YI SYLLABLE XIEP
+A465;ID;YI SYLLABLE XUOX
+A466;ID;YI SYLLABLE XUO
+A467;ID;YI SYLLABLE XOT
+A468;ID;YI SYLLABLE XOX
+A469;ID;YI SYLLABLE XO
+A46A;ID;YI SYLLABLE XOP
+A46B;ID;YI SYLLABLE XYT
+A46C;ID;YI SYLLABLE XYX
+A46D;ID;YI SYLLABLE XY
+A46E;ID;YI SYLLABLE XYP
+A46F;ID;YI SYLLABLE XYRX
+A470;ID;YI SYLLABLE XYR
+A471;ID;YI SYLLABLE YIT
+A472;ID;YI SYLLABLE YIX
+A473;ID;YI SYLLABLE YI
+A474;ID;YI SYLLABLE YIP
+A475;ID;YI SYLLABLE YIET
+A476;ID;YI SYLLABLE YIEX
+A477;ID;YI SYLLABLE YIE
+A478;ID;YI SYLLABLE YIEP
+A479;ID;YI SYLLABLE YUOT
+A47A;ID;YI SYLLABLE YUOX
+A47B;ID;YI SYLLABLE YUO
+A47C;ID;YI SYLLABLE YUOP
+A47D;ID;YI SYLLABLE YOT
+A47E;ID;YI SYLLABLE YOX
+A47F;ID;YI SYLLABLE YO
+A480;ID;YI SYLLABLE YOP
+A481;ID;YI SYLLABLE YUT
+A482;ID;YI SYLLABLE YUX
+A483;ID;YI SYLLABLE YU
+A484;ID;YI SYLLABLE YUP
+A485;ID;YI SYLLABLE YURX
+A486;ID;YI SYLLABLE YUR
+A487;ID;YI SYLLABLE YYT
+A488;ID;YI SYLLABLE YYX
+A489;ID;YI SYLLABLE YY
+A48A;ID;YI SYLLABLE YYP
+A48B;ID;YI SYLLABLE YYRX
+A48C;ID;YI SYLLABLE YYR
+A490;ID;YI RADICAL QOT
+A491;ID;YI RADICAL LI
+A492;ID;YI RADICAL KIT
+A493;ID;YI RADICAL NYIP
+A494;ID;YI RADICAL CYP
+A495;ID;YI RADICAL SSI
+A496;ID;YI RADICAL GGOP
+A497;ID;YI RADICAL GEP
+A498;ID;YI RADICAL MI
+A499;ID;YI RADICAL HXIT
+A49A;ID;YI RADICAL LYR
+A49B;ID;YI RADICAL BBUT
+A49C;ID;YI RADICAL MOP
+A49D;ID;YI RADICAL YO
+A49E;ID;YI RADICAL PUT
+A49F;ID;YI RADICAL HXUO
+A4A0;ID;YI RADICAL TAT
+A4A1;ID;YI RADICAL GA
+A4A4;ID;YI RADICAL DDUR
+A4A5;ID;YI RADICAL BUR
+A4A6;ID;YI RADICAL GGUO
+A4A7;ID;YI RADICAL NYOP
+A4A8;ID;YI RADICAL TU
+A4A9;ID;YI RADICAL OP
+A4AA;ID;YI RADICAL JJUT
+A4AB;ID;YI RADICAL ZOT
+A4AC;ID;YI RADICAL PYT
+A4AD;ID;YI RADICAL HMO
+A4AE;ID;YI RADICAL YIT
+A4AF;ID;YI RADICAL VUR
+A4B0;ID;YI RADICAL SHY
+A4B1;ID;YI RADICAL VEP
+A4B2;ID;YI RADICAL ZA
+A4B3;ID;YI RADICAL JO
+A4B5;ID;YI RADICAL JJY
+A4B6;ID;YI RADICAL GOT
+A4B7;ID;YI RADICAL JJIE
+A4B8;ID;YI RADICAL WO
+A4B9;ID;YI RADICAL DU
+A4BA;ID;YI RADICAL SHUR
+A4BB;ID;YI RADICAL LIE
+A4BC;ID;YI RADICAL CY
+A4BD;ID;YI RADICAL CUOP
+A4BE;ID;YI RADICAL CIP
+A4BF;ID;YI RADICAL HXOP
+A4C0;ID;YI RADICAL SHAT
+A4C2;ID;YI RADICAL SHOP
+A4C3;ID;YI RADICAL CHE
+A4C4;ID;YI RADICAL ZZIET
+A4C6;ID;YI RADICAL KE
+AC00;ID;<Hangul Syllable, First>
+D7A3;ID;<Hangul Syllable, Last>
+D800;SG;<Non Private Use High Surrogate, First>
+DB7F;SG;<Non Private Use High Surrogate, Last>
+DB80;SG;<Private Use High Surrogate, First>
+DBFF;SG;<Private Use High Surrogate, Last>
+DC00;SG;<Low Surrogate, First>
+DFFF;SG;<Low Surrogate, Last>
+E000;AI;<Private Use, First>
+F8FF;AI;<Private Use, Last>
+F900;ID;CJK COMPATIBILITY IDEOGRAPH-F900
+F901;ID;CJK COMPATIBILITY IDEOGRAPH-F901
+F902;ID;CJK COMPATIBILITY IDEOGRAPH-F902
+F903;ID;CJK COMPATIBILITY IDEOGRAPH-F903
+F904;ID;CJK COMPATIBILITY IDEOGRAPH-F904
+F905;ID;CJK COMPATIBILITY IDEOGRAPH-F905
+F906;ID;CJK COMPATIBILITY IDEOGRAPH-F906
+F907;ID;CJK COMPATIBILITY IDEOGRAPH-F907
+F908;ID;CJK COMPATIBILITY IDEOGRAPH-F908
+F909;ID;CJK COMPATIBILITY IDEOGRAPH-F909
+F90A;ID;CJK COMPATIBILITY IDEOGRAPH-F90A
+F90B;ID;CJK COMPATIBILITY IDEOGRAPH-F90B
+F90C;ID;CJK COMPATIBILITY IDEOGRAPH-F90C
+F90D;ID;CJK COMPATIBILITY IDEOGRAPH-F90D
+F90E;ID;CJK COMPATIBILITY IDEOGRAPH-F90E
+F90F;ID;CJK COMPATIBILITY IDEOGRAPH-F90F
+F910;ID;CJK COMPATIBILITY IDEOGRAPH-F910
+F911;ID;CJK COMPATIBILITY IDEOGRAPH-F911
+F912;ID;CJK COMPATIBILITY IDEOGRAPH-F912
+F913;ID;CJK COMPATIBILITY IDEOGRAPH-F913
+F914;ID;CJK COMPATIBILITY IDEOGRAPH-F914
+F915;ID;CJK COMPATIBILITY IDEOGRAPH-F915
+F916;ID;CJK COMPATIBILITY IDEOGRAPH-F916
+F917;ID;CJK COMPATIBILITY IDEOGRAPH-F917
+F918;ID;CJK COMPATIBILITY IDEOGRAPH-F918
+F919;ID;CJK COMPATIBILITY IDEOGRAPH-F919
+F91A;ID;CJK COMPATIBILITY IDEOGRAPH-F91A
+F91B;ID;CJK COMPATIBILITY IDEOGRAPH-F91B
+F91C;ID;CJK COMPATIBILITY IDEOGRAPH-F91C
+F91D;ID;CJK COMPATIBILITY IDEOGRAPH-F91D
+F91E;ID;CJK COMPATIBILITY IDEOGRAPH-F91E
+F91F;ID;CJK COMPATIBILITY IDEOGRAPH-F91F
+F920;ID;CJK COMPATIBILITY IDEOGRAPH-F920
+F921;ID;CJK COMPATIBILITY IDEOGRAPH-F921
+F922;ID;CJK COMPATIBILITY IDEOGRAPH-F922
+F923;ID;CJK COMPATIBILITY IDEOGRAPH-F923
+F924;ID;CJK COMPATIBILITY IDEOGRAPH-F924
+F925;ID;CJK COMPATIBILITY IDEOGRAPH-F925
+F926;ID;CJK COMPATIBILITY IDEOGRAPH-F926
+F927;ID;CJK COMPATIBILITY IDEOGRAPH-F927
+F928;ID;CJK COMPATIBILITY IDEOGRAPH-F928
+F929;ID;CJK COMPATIBILITY IDEOGRAPH-F929
+F92A;ID;CJK COMPATIBILITY IDEOGRAPH-F92A
+F92B;ID;CJK COMPATIBILITY IDEOGRAPH-F92B
+F92C;ID;CJK COMPATIBILITY IDEOGRAPH-F92C
+F92D;ID;CJK COMPATIBILITY IDEOGRAPH-F92D
+F92E;ID;CJK COMPATIBILITY IDEOGRAPH-F92E
+F92F;ID;CJK COMPATIBILITY IDEOGRAPH-F92F
+F930;ID;CJK COMPATIBILITY IDEOGRAPH-F930
+F931;ID;CJK COMPATIBILITY IDEOGRAPH-F931
+F932;ID;CJK COMPATIBILITY IDEOGRAPH-F932
+F933;ID;CJK COMPATIBILITY IDEOGRAPH-F933
+F934;ID;CJK COMPATIBILITY IDEOGRAPH-F934
+F935;ID;CJK COMPATIBILITY IDEOGRAPH-F935
+F936;ID;CJK COMPATIBILITY IDEOGRAPH-F936
+F937;ID;CJK COMPATIBILITY IDEOGRAPH-F937
+F938;ID;CJK COMPATIBILITY IDEOGRAPH-F938
+F939;ID;CJK COMPATIBILITY IDEOGRAPH-F939
+F93A;ID;CJK COMPATIBILITY IDEOGRAPH-F93A
+F93B;ID;CJK COMPATIBILITY IDEOGRAPH-F93B
+F93C;ID;CJK COMPATIBILITY IDEOGRAPH-F93C
+F93D;ID;CJK COMPATIBILITY IDEOGRAPH-F93D
+F93E;ID;CJK COMPATIBILITY IDEOGRAPH-F93E
+F93F;ID;CJK COMPATIBILITY IDEOGRAPH-F93F
+F940;ID;CJK COMPATIBILITY IDEOGRAPH-F940
+F941;ID;CJK COMPATIBILITY IDEOGRAPH-F941
+F942;ID;CJK COMPATIBILITY IDEOGRAPH-F942
+F943;ID;CJK COMPATIBILITY IDEOGRAPH-F943
+F944;ID;CJK COMPATIBILITY IDEOGRAPH-F944
+F945;ID;CJK COMPATIBILITY IDEOGRAPH-F945
+F946;ID;CJK COMPATIBILITY IDEOGRAPH-F946
+F947;ID;CJK COMPATIBILITY IDEOGRAPH-F947
+F948;ID;CJK COMPATIBILITY IDEOGRAPH-F948
+F949;ID;CJK COMPATIBILITY IDEOGRAPH-F949
+F94A;ID;CJK COMPATIBILITY IDEOGRAPH-F94A
+F94B;ID;CJK COMPATIBILITY IDEOGRAPH-F94B
+F94C;ID;CJK COMPATIBILITY IDEOGRAPH-F94C
+F94D;ID;CJK COMPATIBILITY IDEOGRAPH-F94D
+F94E;ID;CJK COMPATIBILITY IDEOGRAPH-F94E
+F94F;ID;CJK COMPATIBILITY IDEOGRAPH-F94F
+F950;ID;CJK COMPATIBILITY IDEOGRAPH-F950
+F951;ID;CJK COMPATIBILITY IDEOGRAPH-F951
+F952;ID;CJK COMPATIBILITY IDEOGRAPH-F952
+F953;ID;CJK COMPATIBILITY IDEOGRAPH-F953
+F954;ID;CJK COMPATIBILITY IDEOGRAPH-F954
+F955;ID;CJK COMPATIBILITY IDEOGRAPH-F955
+F956;ID;CJK COMPATIBILITY IDEOGRAPH-F956
+F957;ID;CJK COMPATIBILITY IDEOGRAPH-F957
+F958;ID;CJK COMPATIBILITY IDEOGRAPH-F958
+F959;ID;CJK COMPATIBILITY IDEOGRAPH-F959
+F95A;ID;CJK COMPATIBILITY IDEOGRAPH-F95A
+F95B;ID;CJK COMPATIBILITY IDEOGRAPH-F95B
+F95C;ID;CJK COMPATIBILITY IDEOGRAPH-F95C
+F95D;ID;CJK COMPATIBILITY IDEOGRAPH-F95D
+F95E;ID;CJK COMPATIBILITY IDEOGRAPH-F95E
+F95F;ID;CJK COMPATIBILITY IDEOGRAPH-F95F
+F960;ID;CJK COMPATIBILITY IDEOGRAPH-F960
+F961;ID;CJK COMPATIBILITY IDEOGRAPH-F961
+F962;ID;CJK COMPATIBILITY IDEOGRAPH-F962
+F963;ID;CJK COMPATIBILITY IDEOGRAPH-F963
+F964;ID;CJK COMPATIBILITY IDEOGRAPH-F964
+F965;ID;CJK COMPATIBILITY IDEOGRAPH-F965
+F966;ID;CJK COMPATIBILITY IDEOGRAPH-F966
+F967;ID;CJK COMPATIBILITY IDEOGRAPH-F967
+F968;ID;CJK COMPATIBILITY IDEOGRAPH-F968
+F969;ID;CJK COMPATIBILITY IDEOGRAPH-F969
+F96A;ID;CJK COMPATIBILITY IDEOGRAPH-F96A
+F96B;ID;CJK COMPATIBILITY IDEOGRAPH-F96B
+F96C;ID;CJK COMPATIBILITY IDEOGRAPH-F96C
+F96D;ID;CJK COMPATIBILITY IDEOGRAPH-F96D
+F96E;ID;CJK COMPATIBILITY IDEOGRAPH-F96E
+F96F;ID;CJK COMPATIBILITY IDEOGRAPH-F96F
+F970;ID;CJK COMPATIBILITY IDEOGRAPH-F970
+F971;ID;CJK COMPATIBILITY IDEOGRAPH-F971
+F972;ID;CJK COMPATIBILITY IDEOGRAPH-F972
+F973;ID;CJK COMPATIBILITY IDEOGRAPH-F973
+F974;ID;CJK COMPATIBILITY IDEOGRAPH-F974
+F975;ID;CJK COMPATIBILITY IDEOGRAPH-F975
+F976;ID;CJK COMPATIBILITY IDEOGRAPH-F976
+F977;ID;CJK COMPATIBILITY IDEOGRAPH-F977
+F978;ID;CJK COMPATIBILITY IDEOGRAPH-F978
+F979;ID;CJK COMPATIBILITY IDEOGRAPH-F979
+F97A;ID;CJK COMPATIBILITY IDEOGRAPH-F97A
+F97B;ID;CJK COMPATIBILITY IDEOGRAPH-F97B
+F97C;ID;CJK COMPATIBILITY IDEOGRAPH-F97C
+F97D;ID;CJK COMPATIBILITY IDEOGRAPH-F97D
+F97E;ID;CJK COMPATIBILITY IDEOGRAPH-F97E
+F97F;ID;CJK COMPATIBILITY IDEOGRAPH-F97F
+F980;ID;CJK COMPATIBILITY IDEOGRAPH-F980
+F981;ID;CJK COMPATIBILITY IDEOGRAPH-F981
+F982;ID;CJK COMPATIBILITY IDEOGRAPH-F982
+F983;ID;CJK COMPATIBILITY IDEOGRAPH-F983
+F984;ID;CJK COMPATIBILITY IDEOGRAPH-F984
+F985;ID;CJK COMPATIBILITY IDEOGRAPH-F985
+F986;ID;CJK COMPATIBILITY IDEOGRAPH-F986
+F987;ID;CJK COMPATIBILITY IDEOGRAPH-F987
+F988;ID;CJK COMPATIBILITY IDEOGRAPH-F988
+F989;ID;CJK COMPATIBILITY IDEOGRAPH-F989
+F98A;ID;CJK COMPATIBILITY IDEOGRAPH-F98A
+F98B;ID;CJK COMPATIBILITY IDEOGRAPH-F98B
+F98C;ID;CJK COMPATIBILITY IDEOGRAPH-F98C
+F98D;ID;CJK COMPATIBILITY IDEOGRAPH-F98D
+F98E;ID;CJK COMPATIBILITY IDEOGRAPH-F98E
+F98F;ID;CJK COMPATIBILITY IDEOGRAPH-F98F
+F990;ID;CJK COMPATIBILITY IDEOGRAPH-F990
+F991;ID;CJK COMPATIBILITY IDEOGRAPH-F991
+F992;ID;CJK COMPATIBILITY IDEOGRAPH-F992
+F993;ID;CJK COMPATIBILITY IDEOGRAPH-F993
+F994;ID;CJK COMPATIBILITY IDEOGRAPH-F994
+F995;ID;CJK COMPATIBILITY IDEOGRAPH-F995
+F996;ID;CJK COMPATIBILITY IDEOGRAPH-F996
+F997;ID;CJK COMPATIBILITY IDEOGRAPH-F997
+F998;ID;CJK COMPATIBILITY IDEOGRAPH-F998
+F999;ID;CJK COMPATIBILITY IDEOGRAPH-F999
+F99A;ID;CJK COMPATIBILITY IDEOGRAPH-F99A
+F99B;ID;CJK COMPATIBILITY IDEOGRAPH-F99B
+F99C;ID;CJK COMPATIBILITY IDEOGRAPH-F99C
+F99D;ID;CJK COMPATIBILITY IDEOGRAPH-F99D
+F99E;ID;CJK COMPATIBILITY IDEOGRAPH-F99E
+F99F;ID;CJK COMPATIBILITY IDEOGRAPH-F99F
+F9A0;ID;CJK COMPATIBILITY IDEOGRAPH-F9A0
+F9A1;ID;CJK COMPATIBILITY IDEOGRAPH-F9A1
+F9A2;ID;CJK COMPATIBILITY IDEOGRAPH-F9A2
+F9A3;ID;CJK COMPATIBILITY IDEOGRAPH-F9A3
+F9A4;ID;CJK COMPATIBILITY IDEOGRAPH-F9A4
+F9A5;ID;CJK COMPATIBILITY IDEOGRAPH-F9A5
+F9A6;ID;CJK COMPATIBILITY IDEOGRAPH-F9A6
+F9A7;ID;CJK COMPATIBILITY IDEOGRAPH-F9A7
+F9A8;ID;CJK COMPATIBILITY IDEOGRAPH-F9A8
+F9A9;ID;CJK COMPATIBILITY IDEOGRAPH-F9A9
+F9AA;ID;CJK COMPATIBILITY IDEOGRAPH-F9AA
+F9AB;ID;CJK COMPATIBILITY IDEOGRAPH-F9AB
+F9AC;ID;CJK COMPATIBILITY IDEOGRAPH-F9AC
+F9AD;ID;CJK COMPATIBILITY IDEOGRAPH-F9AD
+F9AE;ID;CJK COMPATIBILITY IDEOGRAPH-F9AE
+F9AF;ID;CJK COMPATIBILITY IDEOGRAPH-F9AF
+F9B0;ID;CJK COMPATIBILITY IDEOGRAPH-F9B0
+F9B1;ID;CJK COMPATIBILITY IDEOGRAPH-F9B1
+F9B2;ID;CJK COMPATIBILITY IDEOGRAPH-F9B2
+F9B3;ID;CJK COMPATIBILITY IDEOGRAPH-F9B3
+F9B4;ID;CJK COMPATIBILITY IDEOGRAPH-F9B4
+F9B5;ID;CJK COMPATIBILITY IDEOGRAPH-F9B5
+F9B6;ID;CJK COMPATIBILITY IDEOGRAPH-F9B6
+F9B7;ID;CJK COMPATIBILITY IDEOGRAPH-F9B7
+F9B8;ID;CJK COMPATIBILITY IDEOGRAPH-F9B8
+F9B9;ID;CJK COMPATIBILITY IDEOGRAPH-F9B9
+F9BA;ID;CJK COMPATIBILITY IDEOGRAPH-F9BA
+F9BB;ID;CJK COMPATIBILITY IDEOGRAPH-F9BB
+F9BC;ID;CJK COMPATIBILITY IDEOGRAPH-F9BC
+F9BD;ID;CJK COMPATIBILITY IDEOGRAPH-F9BD
+F9BE;ID;CJK COMPATIBILITY IDEOGRAPH-F9BE
+F9BF;ID;CJK COMPATIBILITY IDEOGRAPH-F9BF
+F9C0;ID;CJK COMPATIBILITY IDEOGRAPH-F9C0
+F9C1;ID;CJK COMPATIBILITY IDEOGRAPH-F9C1
+F9C2;ID;CJK COMPATIBILITY IDEOGRAPH-F9C2
+F9C3;ID;CJK COMPATIBILITY IDEOGRAPH-F9C3
+F9C4;ID;CJK COMPATIBILITY IDEOGRAPH-F9C4
+F9C5;ID;CJK COMPATIBILITY IDEOGRAPH-F9C5
+F9C6;ID;CJK COMPATIBILITY IDEOGRAPH-F9C6
+F9C7;ID;CJK COMPATIBILITY IDEOGRAPH-F9C7
+F9C8;ID;CJK COMPATIBILITY IDEOGRAPH-F9C8
+F9C9;ID;CJK COMPATIBILITY IDEOGRAPH-F9C9
+F9CA;ID;CJK COMPATIBILITY IDEOGRAPH-F9CA
+F9CB;ID;CJK COMPATIBILITY IDEOGRAPH-F9CB
+F9CC;ID;CJK COMPATIBILITY IDEOGRAPH-F9CC
+F9CD;ID;CJK COMPATIBILITY IDEOGRAPH-F9CD
+F9CE;ID;CJK COMPATIBILITY IDEOGRAPH-F9CE
+F9CF;ID;CJK COMPATIBILITY IDEOGRAPH-F9CF
+F9D0;ID;CJK COMPATIBILITY IDEOGRAPH-F9D0
+F9D1;ID;CJK COMPATIBILITY IDEOGRAPH-F9D1
+F9D2;ID;CJK COMPATIBILITY IDEOGRAPH-F9D2
+F9D3;ID;CJK COMPATIBILITY IDEOGRAPH-F9D3
+F9D4;ID;CJK COMPATIBILITY IDEOGRAPH-F9D4
+F9D5;ID;CJK COMPATIBILITY IDEOGRAPH-F9D5
+F9D6;ID;CJK COMPATIBILITY IDEOGRAPH-F9D6
+F9D7;ID;CJK COMPATIBILITY IDEOGRAPH-F9D7
+F9D8;ID;CJK COMPATIBILITY IDEOGRAPH-F9D8
+F9D9;ID;CJK COMPATIBILITY IDEOGRAPH-F9D9
+F9DA;ID;CJK COMPATIBILITY IDEOGRAPH-F9DA
+F9DB;ID;CJK COMPATIBILITY IDEOGRAPH-F9DB
+F9DC;ID;CJK COMPATIBILITY IDEOGRAPH-F9DC
+F9DD;ID;CJK COMPATIBILITY IDEOGRAPH-F9DD
+F9DE;ID;CJK COMPATIBILITY IDEOGRAPH-F9DE
+F9DF;ID;CJK COMPATIBILITY IDEOGRAPH-F9DF
+F9E0;ID;CJK COMPATIBILITY IDEOGRAPH-F9E0
+F9E1;ID;CJK COMPATIBILITY IDEOGRAPH-F9E1
+F9E2;ID;CJK COMPATIBILITY IDEOGRAPH-F9E2
+F9E3;ID;CJK COMPATIBILITY IDEOGRAPH-F9E3
+F9E4;ID;CJK COMPATIBILITY IDEOGRAPH-F9E4
+F9E5;ID;CJK COMPATIBILITY IDEOGRAPH-F9E5
+F9E6;ID;CJK COMPATIBILITY IDEOGRAPH-F9E6
+F9E7;ID;CJK COMPATIBILITY IDEOGRAPH-F9E7
+F9E8;ID;CJK COMPATIBILITY IDEOGRAPH-F9E8
+F9E9;ID;CJK COMPATIBILITY IDEOGRAPH-F9E9
+F9EA;ID;CJK COMPATIBILITY IDEOGRAPH-F9EA
+F9EB;ID;CJK COMPATIBILITY IDEOGRAPH-F9EB
+F9EC;ID;CJK COMPATIBILITY IDEOGRAPH-F9EC
+F9ED;ID;CJK COMPATIBILITY IDEOGRAPH-F9ED
+F9EE;ID;CJK COMPATIBILITY IDEOGRAPH-F9EE
+F9EF;ID;CJK COMPATIBILITY IDEOGRAPH-F9EF
+F9F0;ID;CJK COMPATIBILITY IDEOGRAPH-F9F0
+F9F1;ID;CJK COMPATIBILITY IDEOGRAPH-F9F1
+F9F2;ID;CJK COMPATIBILITY IDEOGRAPH-F9F2
+F9F3;ID;CJK COMPATIBILITY IDEOGRAPH-F9F3
+F9F4;ID;CJK COMPATIBILITY IDEOGRAPH-F9F4
+F9F5;ID;CJK COMPATIBILITY IDEOGRAPH-F9F5
+F9F6;ID;CJK COMPATIBILITY IDEOGRAPH-F9F6
+F9F7;ID;CJK COMPATIBILITY IDEOGRAPH-F9F7
+F9F8;ID;CJK COMPATIBILITY IDEOGRAPH-F9F8
+F9F9;ID;CJK COMPATIBILITY IDEOGRAPH-F9F9
+F9FA;ID;CJK COMPATIBILITY IDEOGRAPH-F9FA
+F9FB;ID;CJK COMPATIBILITY IDEOGRAPH-F9FB
+F9FC;ID;CJK COMPATIBILITY IDEOGRAPH-F9FC
+F9FD;ID;CJK COMPATIBILITY IDEOGRAPH-F9FD
+F9FE;ID;CJK COMPATIBILITY IDEOGRAPH-F9FE
+F9FF;ID;CJK COMPATIBILITY IDEOGRAPH-F9FF
+FA00;ID;CJK COMPATIBILITY IDEOGRAPH-FA00
+FA01;ID;CJK COMPATIBILITY IDEOGRAPH-FA01
+FA02;ID;CJK COMPATIBILITY IDEOGRAPH-FA02
+FA03;ID;CJK COMPATIBILITY IDEOGRAPH-FA03
+FA04;ID;CJK COMPATIBILITY IDEOGRAPH-FA04
+FA05;ID;CJK COMPATIBILITY IDEOGRAPH-FA05
+FA06;ID;CJK COMPATIBILITY IDEOGRAPH-FA06
+FA07;ID;CJK COMPATIBILITY IDEOGRAPH-FA07
+FA08;ID;CJK COMPATIBILITY IDEOGRAPH-FA08
+FA09;ID;CJK COMPATIBILITY IDEOGRAPH-FA09
+FA0A;ID;CJK COMPATIBILITY IDEOGRAPH-FA0A
+FA0B;ID;CJK COMPATIBILITY IDEOGRAPH-FA0B
+FA0C;ID;CJK COMPATIBILITY IDEOGRAPH-FA0C
+FA0D;ID;CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA0E;ID;CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F;ID;CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA10;ID;CJK COMPATIBILITY IDEOGRAPH-FA10
+FA11;ID;CJK COMPATIBILITY IDEOGRAPH-FA11
+FA12;ID;CJK COMPATIBILITY IDEOGRAPH-FA12
+FA13;ID;CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14;ID;CJK COMPATIBILITY IDEOGRAPH-FA14
+FA15;ID;CJK COMPATIBILITY IDEOGRAPH-FA15
+FA16;ID;CJK COMPATIBILITY IDEOGRAPH-FA16
+FA17;ID;CJK COMPATIBILITY IDEOGRAPH-FA17
+FA18;ID;CJK COMPATIBILITY IDEOGRAPH-FA18
+FA19;ID;CJK COMPATIBILITY IDEOGRAPH-FA19
+FA1A;ID;CJK COMPATIBILITY IDEOGRAPH-FA1A
+FA1B;ID;CJK COMPATIBILITY IDEOGRAPH-FA1B
+FA1C;ID;CJK COMPATIBILITY IDEOGRAPH-FA1C
+FA1D;ID;CJK COMPATIBILITY IDEOGRAPH-FA1D
+FA1E;ID;CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA1F;ID;CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA20;ID;CJK COMPATIBILITY IDEOGRAPH-FA20
+FA21;ID;CJK COMPATIBILITY IDEOGRAPH-FA21
+FA22;ID;CJK COMPATIBILITY IDEOGRAPH-FA22
+FA23;ID;CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24;ID;CJK COMPATIBILITY IDEOGRAPH-FA24
+FA25;ID;CJK COMPATIBILITY IDEOGRAPH-FA25
+FA26;ID;CJK COMPATIBILITY IDEOGRAPH-FA26
+FA27;ID;CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28;ID;CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29;ID;CJK COMPATIBILITY IDEOGRAPH-FA29
+FA2A;ID;CJK COMPATIBILITY IDEOGRAPH-FA2A
+FA2B;ID;CJK COMPATIBILITY IDEOGRAPH-FA2B
+FA2C;ID;CJK COMPATIBILITY IDEOGRAPH-FA2C
+FA2D;ID;CJK COMPATIBILITY IDEOGRAPH-FA2D
+FB00;AL;LATIN SMALL LIGATURE FF
+FB01;AL;LATIN SMALL LIGATURE FI
+FB02;AL;LATIN SMALL LIGATURE FL
+FB03;AL;LATIN SMALL LIGATURE FFI
+FB04;AL;LATIN SMALL LIGATURE FFL
+FB05;AL;LATIN SMALL LIGATURE LONG S T
+FB06;AL;LATIN SMALL LIGATURE ST
+FB13;AL;ARMENIAN SMALL LIGATURE MEN NOW
+FB14;AL;ARMENIAN SMALL LIGATURE MEN ECH
+FB15;AL;ARMENIAN SMALL LIGATURE MEN INI
+FB16;AL;ARMENIAN SMALL LIGATURE VEW NOW
+FB17;AL;ARMENIAN SMALL LIGATURE MEN XEH
+FB1D;AL;HEBREW LETTER YOD WITH HIRIQ
+FB1E;CM;HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F;AL;HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB20;AL;HEBREW LETTER ALTERNATIVE AYIN
+FB21;AL;HEBREW LETTER WIDE ALEF
+FB22;AL;HEBREW LETTER WIDE DALET
+FB23;AL;HEBREW LETTER WIDE HE
+FB24;AL;HEBREW LETTER WIDE KAF
+FB25;AL;HEBREW LETTER WIDE LAMED
+FB26;AL;HEBREW LETTER WIDE FINAL MEM
+FB27;AL;HEBREW LETTER WIDE RESH
+FB28;AL;HEBREW LETTER WIDE TAV
+FB29;AL;HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A;AL;HEBREW LETTER SHIN WITH SHIN DOT
+FB2B;AL;HEBREW LETTER SHIN WITH SIN DOT
+FB2C;AL;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+FB2D;AL;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+FB2E;AL;HEBREW LETTER ALEF WITH PATAH
+FB2F;AL;HEBREW LETTER ALEF WITH QAMATS
+FB30;AL;HEBREW LETTER ALEF WITH MAPIQ
+FB31;AL;HEBREW LETTER BET WITH DAGESH
+FB32;AL;HEBREW LETTER GIMEL WITH DAGESH
+FB33;AL;HEBREW LETTER DALET WITH DAGESH
+FB34;AL;HEBREW LETTER HE WITH MAPIQ
+FB35;AL;HEBREW LETTER VAV WITH DAGESH
+FB36;AL;HEBREW LETTER ZAYIN WITH DAGESH
+FB38;AL;HEBREW LETTER TET WITH DAGESH
+FB39;AL;HEBREW LETTER YOD WITH DAGESH
+FB3A;AL;HEBREW LETTER FINAL KAF WITH DAGESH
+FB3B;AL;HEBREW LETTER KAF WITH DAGESH
+FB3C;AL;HEBREW LETTER LAMED WITH DAGESH
+FB3E;AL;HEBREW LETTER MEM WITH DAGESH
+FB40;AL;HEBREW LETTER NUN WITH DAGESH
+FB41;AL;HEBREW LETTER SAMEKH WITH DAGESH
+FB43;AL;HEBREW LETTER FINAL PE WITH DAGESH
+FB44;AL;HEBREW LETTER PE WITH DAGESH
+FB46;AL;HEBREW LETTER TSADI WITH DAGESH
+FB47;AL;HEBREW LETTER QOF WITH DAGESH
+FB48;AL;HEBREW LETTER RESH WITH DAGESH
+FB49;AL;HEBREW LETTER SHIN WITH DAGESH
+FB4A;AL;HEBREW LETTER TAV WITH DAGESH
+FB4B;AL;HEBREW LETTER VAV WITH HOLAM
+FB4C;AL;HEBREW LETTER BET WITH RAFE
+FB4D;AL;HEBREW LETTER KAF WITH RAFE
+FB4E;AL;HEBREW LETTER PE WITH RAFE
+FB4F;AL;HEBREW LIGATURE ALEF LAMED
+FB50;AL;ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB51;AL;ARABIC LETTER ALEF WASLA FINAL FORM
+FB52;AL;ARABIC LETTER BEEH ISOLATED FORM
+FB53;AL;ARABIC LETTER BEEH FINAL FORM
+FB54;AL;ARABIC LETTER BEEH INITIAL FORM
+FB55;AL;ARABIC LETTER BEEH MEDIAL FORM
+FB56;AL;ARABIC LETTER PEH ISOLATED FORM
+FB57;AL;ARABIC LETTER PEH FINAL FORM
+FB58;AL;ARABIC LETTER PEH INITIAL FORM
+FB59;AL;ARABIC LETTER PEH MEDIAL FORM
+FB5A;AL;ARABIC LETTER BEHEH ISOLATED FORM
+FB5B;AL;ARABIC LETTER BEHEH FINAL FORM
+FB5C;AL;ARABIC LETTER BEHEH INITIAL FORM
+FB5D;AL;ARABIC LETTER BEHEH MEDIAL FORM
+FB5E;AL;ARABIC LETTER TTEHEH ISOLATED FORM
+FB5F;AL;ARABIC LETTER TTEHEH FINAL FORM
+FB60;AL;ARABIC LETTER TTEHEH INITIAL FORM
+FB61;AL;ARABIC LETTER TTEHEH MEDIAL FORM
+FB62;AL;ARABIC LETTER TEHEH ISOLATED FORM
+FB63;AL;ARABIC LETTER TEHEH FINAL FORM
+FB64;AL;ARABIC LETTER TEHEH INITIAL FORM
+FB65;AL;ARABIC LETTER TEHEH MEDIAL FORM
+FB66;AL;ARABIC LETTER TTEH ISOLATED FORM
+FB67;AL;ARABIC LETTER TTEH FINAL FORM
+FB68;AL;ARABIC LETTER TTEH INITIAL FORM
+FB69;AL;ARABIC LETTER TTEH MEDIAL FORM
+FB6A;AL;ARABIC LETTER VEH ISOLATED FORM
+FB6B;AL;ARABIC LETTER VEH FINAL FORM
+FB6C;AL;ARABIC LETTER VEH INITIAL FORM
+FB6D;AL;ARABIC LETTER VEH MEDIAL FORM
+FB6E;AL;ARABIC LETTER PEHEH ISOLATED FORM
+FB6F;AL;ARABIC LETTER PEHEH FINAL FORM
+FB70;AL;ARABIC LETTER PEHEH INITIAL FORM
+FB71;AL;ARABIC LETTER PEHEH MEDIAL FORM
+FB72;AL;ARABIC LETTER DYEH ISOLATED FORM
+FB73;AL;ARABIC LETTER DYEH FINAL FORM
+FB74;AL;ARABIC LETTER DYEH INITIAL FORM
+FB75;AL;ARABIC LETTER DYEH MEDIAL FORM
+FB76;AL;ARABIC LETTER NYEH ISOLATED FORM
+FB77;AL;ARABIC LETTER NYEH FINAL FORM
+FB78;AL;ARABIC LETTER NYEH INITIAL FORM
+FB79;AL;ARABIC LETTER NYEH MEDIAL FORM
+FB7A;AL;ARABIC LETTER TCHEH ISOLATED FORM
+FB7B;AL;ARABIC LETTER TCHEH FINAL FORM
+FB7C;AL;ARABIC LETTER TCHEH INITIAL FORM
+FB7D;AL;ARABIC LETTER TCHEH MEDIAL FORM
+FB7E;AL;ARABIC LETTER TCHEHEH ISOLATED FORM
+FB7F;AL;ARABIC LETTER TCHEHEH FINAL FORM
+FB80;AL;ARABIC LETTER TCHEHEH INITIAL FORM
+FB81;AL;ARABIC LETTER TCHEHEH MEDIAL FORM
+FB82;AL;ARABIC LETTER DDAHAL ISOLATED FORM
+FB83;AL;ARABIC LETTER DDAHAL FINAL FORM
+FB84;AL;ARABIC LETTER DAHAL ISOLATED FORM
+FB85;AL;ARABIC LETTER DAHAL FINAL FORM
+FB86;AL;ARABIC LETTER DUL ISOLATED FORM
+FB87;AL;ARABIC LETTER DUL FINAL FORM
+FB88;AL;ARABIC LETTER DDAL ISOLATED FORM
+FB89;AL;ARABIC LETTER DDAL FINAL FORM
+FB8A;AL;ARABIC LETTER JEH ISOLATED FORM
+FB8B;AL;ARABIC LETTER JEH FINAL FORM
+FB8C;AL;ARABIC LETTER RREH ISOLATED FORM
+FB8D;AL;ARABIC LETTER RREH FINAL FORM
+FB8E;AL;ARABIC LETTER KEHEH ISOLATED FORM
+FB8F;AL;ARABIC LETTER KEHEH FINAL FORM
+FB90;AL;ARABIC LETTER KEHEH INITIAL FORM
+FB91;AL;ARABIC LETTER KEHEH MEDIAL FORM
+FB92;AL;ARABIC LETTER GAF ISOLATED FORM
+FB93;AL;ARABIC LETTER GAF FINAL FORM
+FB94;AL;ARABIC LETTER GAF INITIAL FORM
+FB95;AL;ARABIC LETTER GAF MEDIAL FORM
+FB96;AL;ARABIC LETTER GUEH ISOLATED FORM
+FB97;AL;ARABIC LETTER GUEH FINAL FORM
+FB98;AL;ARABIC LETTER GUEH INITIAL FORM
+FB99;AL;ARABIC LETTER GUEH MEDIAL FORM
+FB9A;AL;ARABIC LETTER NGOEH ISOLATED FORM
+FB9B;AL;ARABIC LETTER NGOEH FINAL FORM
+FB9C;AL;ARABIC LETTER NGOEH INITIAL FORM
+FB9D;AL;ARABIC LETTER NGOEH MEDIAL FORM
+FB9E;AL;ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FB9F;AL;ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA0;AL;ARABIC LETTER RNOON ISOLATED FORM
+FBA1;AL;ARABIC LETTER RNOON FINAL FORM
+FBA2;AL;ARABIC LETTER RNOON INITIAL FORM
+FBA3;AL;ARABIC LETTER RNOON MEDIAL FORM
+FBA4;AL;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA5;AL;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA6;AL;ARABIC LETTER HEH GOAL ISOLATED FORM
+FBA7;AL;ARABIC LETTER HEH GOAL FINAL FORM
+FBA8;AL;ARABIC LETTER HEH GOAL INITIAL FORM
+FBA9;AL;ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAA;AL;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAB;AL;ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAC;AL;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBAD;AL;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBAE;AL;ARABIC LETTER YEH BARREE ISOLATED FORM
+FBAF;AL;ARABIC LETTER YEH BARREE FINAL FORM
+FBB0;AL;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBB1;AL;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3;AL;ARABIC LETTER NG ISOLATED FORM
+FBD4;AL;ARABIC LETTER NG FINAL FORM
+FBD5;AL;ARABIC LETTER NG INITIAL FORM
+FBD6;AL;ARABIC LETTER NG MEDIAL FORM
+FBD7;AL;ARABIC LETTER U ISOLATED FORM
+FBD8;AL;ARABIC LETTER U FINAL FORM
+FBD9;AL;ARABIC LETTER OE ISOLATED FORM
+FBDA;AL;ARABIC LETTER OE FINAL FORM
+FBDB;AL;ARABIC LETTER YU ISOLATED FORM
+FBDC;AL;ARABIC LETTER YU FINAL FORM
+FBDD;AL;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+FBDE;AL;ARABIC LETTER VE ISOLATED FORM
+FBDF;AL;ARABIC LETTER VE FINAL FORM
+FBE0;AL;ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE1;AL;ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE2;AL;ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE3;AL;ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE4;AL;ARABIC LETTER E ISOLATED FORM
+FBE5;AL;ARABIC LETTER E FINAL FORM
+FBE6;AL;ARABIC LETTER E INITIAL FORM
+FBE7;AL;ARABIC LETTER E MEDIAL FORM
+FBE8;AL;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBE9;AL;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBEA;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEB;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBEC;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBED;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEE;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBEF;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF0;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF1;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF2;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF3;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF4;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF5;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF6;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF7;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBF8;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBF9;AL;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFA;AL;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFB;AL;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFC;AL;ARABIC LETTER FARSI YEH ISOLATED FORM
+FBFD;AL;ARABIC LETTER FARSI YEH FINAL FORM
+FBFE;AL;ARABIC LETTER FARSI YEH INITIAL FORM
+FBFF;AL;ARABIC LETTER FARSI YEH MEDIAL FORM
+FC00;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+FC01;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+FC02;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+FC03;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FC04;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+FC05;AL;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+FC06;AL;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+FC07;AL;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+FC08;AL;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+FC09;AL;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+FC0A;AL;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+FC0B;AL;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+FC0C;AL;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+FC0D;AL;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+FC0E;AL;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+FC0F;AL;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+FC10;AL;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+FC11;AL;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+FC12;AL;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+FC13;AL;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+FC14;AL;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+FC15;AL;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+FC16;AL;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+FC17;AL;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+FC18;AL;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+FC19;AL;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+FC1A;AL;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+FC1B;AL;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+FC1C;AL;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+FC1D;AL;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+FC1E;AL;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+FC1F;AL;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+FC20;AL;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+FC21;AL;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+FC22;AL;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+FC23;AL;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+FC24;AL;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+FC25;AL;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+FC26;AL;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+FC27;AL;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+FC28;AL;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+FC29;AL;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+FC2A;AL;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+FC2B;AL;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+FC2C;AL;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+FC2D;AL;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+FC2E;AL;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+FC2F;AL;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+FC30;AL;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+FC31;AL;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+FC32;AL;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+FC33;AL;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+FC34;AL;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+FC35;AL;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+FC36;AL;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+FC37;AL;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+FC38;AL;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+FC39;AL;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+FC3A;AL;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+FC3B;AL;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+FC3C;AL;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+FC3D;AL;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+FC3E;AL;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+FC3F;AL;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+FC40;AL;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+FC41;AL;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+FC42;AL;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+FC43;AL;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+FC44;AL;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+FC45;AL;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+FC46;AL;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+FC47;AL;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+FC48;AL;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+FC49;AL;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+FC4A;AL;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+FC4B;AL;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+FC4C;AL;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+FC4D;AL;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+FC4E;AL;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+FC4F;AL;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+FC50;AL;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+FC51;AL;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+FC52;AL;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+FC53;AL;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+FC54;AL;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+FC55;AL;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+FC56;AL;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+FC57;AL;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+FC58;AL;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+FC59;AL;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+FC5A;AL;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+FC5B;AL;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5C;AL;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5D;AL;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC5E;AL;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+FC5F;AL;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+FC60;AL;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+FC61;AL;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+FC62;AL;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+FC63;AL;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FC64;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+FC65;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+FC66;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+FC67;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+FC68;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FC69;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+FC6A;AL;ARABIC LIGATURE BEH WITH REH FINAL FORM
+FC6B;AL;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+FC6C;AL;ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+FC6D;AL;ARABIC LIGATURE BEH WITH NOON FINAL FORM
+FC6E;AL;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+FC6F;AL;ARABIC LIGATURE BEH WITH YEH FINAL FORM
+FC70;AL;ARABIC LIGATURE TEH WITH REH FINAL FORM
+FC71;AL;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+FC72;AL;ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+FC73;AL;ARABIC LIGATURE TEH WITH NOON FINAL FORM
+FC74;AL;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+FC75;AL;ARABIC LIGATURE TEH WITH YEH FINAL FORM
+FC76;AL;ARABIC LIGATURE THEH WITH REH FINAL FORM
+FC77;AL;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+FC78;AL;ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+FC79;AL;ARABIC LIGATURE THEH WITH NOON FINAL FORM
+FC7A;AL;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+FC7B;AL;ARABIC LIGATURE THEH WITH YEH FINAL FORM
+FC7C;AL;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+FC7D;AL;ARABIC LIGATURE FEH WITH YEH FINAL FORM
+FC7E;AL;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+FC7F;AL;ARABIC LIGATURE QAF WITH YEH FINAL FORM
+FC80;AL;ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+FC81;AL;ARABIC LIGATURE KAF WITH LAM FINAL FORM
+FC82;AL;ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+FC83;AL;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+FC84;AL;ARABIC LIGATURE KAF WITH YEH FINAL FORM
+FC85;AL;ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+FC86;AL;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+FC87;AL;ARABIC LIGATURE LAM WITH YEH FINAL FORM
+FC88;AL;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+FC89;AL;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+FC8A;AL;ARABIC LIGATURE NOON WITH REH FINAL FORM
+FC8B;AL;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+FC8C;AL;ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+FC8D;AL;ARABIC LIGATURE NOON WITH NOON FINAL FORM
+FC8E;AL;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+FC8F;AL;ARABIC LIGATURE NOON WITH YEH FINAL FORM
+FC90;AL;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+FC91;AL;ARABIC LIGATURE YEH WITH REH FINAL FORM
+FC92;AL;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+FC93;AL;ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+FC94;AL;ARABIC LIGATURE YEH WITH NOON FINAL FORM
+FC95;AL;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+FC96;AL;ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FC97;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+FC98;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+FC99;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+FC9A;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+FC9B;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+FC9C;AL;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+FC9D;AL;ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+FC9E;AL;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+FC9F;AL;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+FCA0;AL;ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+FCA1;AL;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+FCA2;AL;ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+FCA3;AL;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+FCA4;AL;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+FCA5;AL;ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+FCA6;AL;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+FCA7;AL;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+FCA8;AL;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+FCA9;AL;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+FCAA;AL;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+FCAB;AL;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+FCAC;AL;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+FCAD;AL;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+FCAE;AL;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+FCAF;AL;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+FCB0;AL;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+FCB1;AL;ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+FCB2;AL;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+FCB3;AL;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+FCB4;AL;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+FCB5;AL;ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+FCB6;AL;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+FCB7;AL;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+FCB8;AL;ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+FCB9;AL;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+FCBA;AL;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+FCBB;AL;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+FCBC;AL;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+FCBD;AL;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+FCBE;AL;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+FCBF;AL;ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+FCC0;AL;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+FCC1;AL;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+FCC2;AL;ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+FCC3;AL;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+FCC4;AL;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+FCC5;AL;ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+FCC6;AL;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+FCC7;AL;ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+FCC8;AL;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+FCC9;AL;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+FCCA;AL;ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+FCCB;AL;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+FCCC;AL;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+FCCD;AL;ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+FCCE;AL;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+FCCF;AL;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+FCD0;AL;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+FCD1;AL;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+FCD2;AL;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+FCD3;AL;ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+FCD4;AL;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+FCD5;AL;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+FCD6;AL;ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+FCD7;AL;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+FCD8;AL;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+FCD9;AL;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+FCDA;AL;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+FCDB;AL;ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+FCDC;AL;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+FCDD;AL;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+FCDE;AL;ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FCDF;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+FCE0;AL;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+FCE1;AL;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+FCE2;AL;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+FCE3;AL;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+FCE4;AL;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+FCE5;AL;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+FCE6;AL;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+FCE7;AL;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+FCE8;AL;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+FCE9;AL;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+FCEA;AL;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+FCEB;AL;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+FCEC;AL;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+FCED;AL;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+FCEE;AL;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+FCEF;AL;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+FCF0;AL;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+FCF1;AL;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+FCF2;AL;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+FCF3;AL;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+FCF4;AL;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FCF5;AL;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+FCF6;AL;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+FCF7;AL;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+FCF8;AL;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+FCF9;AL;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+FCFA;AL;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+FCFB;AL;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFC;AL;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+FCFD;AL;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+FCFE;AL;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+FCFF;AL;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+FD00;AL;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+FD01;AL;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+FD02;AL;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+FD03;AL;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+FD04;AL;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+FD05;AL;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+FD06;AL;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+FD07;AL;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+FD08;AL;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+FD09;AL;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+FD0A;AL;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+FD0B;AL;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+FD0C;AL;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+FD0D;AL;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+FD0E;AL;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+FD0F;AL;ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+FD10;AL;ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD11;AL;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+FD12;AL;ARABIC LIGATURE TAH WITH YEH FINAL FORM
+FD13;AL;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+FD14;AL;ARABIC LIGATURE AIN WITH YEH FINAL FORM
+FD15;AL;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+FD16;AL;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+FD17;AL;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+FD18;AL;ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+FD19;AL;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+FD1A;AL;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+FD1B;AL;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+FD1C;AL;ARABIC LIGATURE HAH WITH YEH FINAL FORM
+FD1D;AL;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+FD1E;AL;ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+FD1F;AL;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+FD20;AL;ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+FD21;AL;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+FD22;AL;ARABIC LIGATURE SAD WITH YEH FINAL FORM
+FD23;AL;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+FD24;AL;ARABIC LIGATURE DAD WITH YEH FINAL FORM
+FD25;AL;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+FD26;AL;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+FD27;AL;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+FD28;AL;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+FD29;AL;ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+FD2A;AL;ARABIC LIGATURE SEEN WITH REH FINAL FORM
+FD2B;AL;ARABIC LIGATURE SAD WITH REH FINAL FORM
+FD2C;AL;ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD2D;AL;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+FD2E;AL;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+FD2F;AL;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+FD30;AL;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+FD31;AL;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+FD32;AL;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+FD33;AL;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD34;AL;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+FD35;AL;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+FD36;AL;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+FD37;AL;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+FD38;AL;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+FD39;AL;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+FD3A;AL;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+FD3B;AL;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FD3C;AL;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD3D;AL;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD3E;OP;ORNATE LEFT PARENTHESIS
+FD3F;CL;ORNATE RIGHT PARENTHESIS
+FD50;AL;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD51;AL;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD52;AL;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+FD53;AL;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+FD54;AL;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+FD55;AL;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+FD56;AL;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+FD57;AL;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD58;AL;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD59;AL;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5A;AL;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+FD5B;AL;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5C;AL;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+FD5D;AL;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD5E;AL;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD5F;AL;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD60;AL;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+FD61;AL;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD62;AL;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD63;AL;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD64;AL;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD65;AL;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD66;AL;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+FD67;AL;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD68;AL;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD69;AL;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+FD6A;AL;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6B;AL;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6C;AL;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6D;AL;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD6E;AL;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD6F;AL;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD70;AL;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD71;AL;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD72;AL;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+FD73;AL;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD74;AL;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+FD75;AL;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+FD76;AL;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD77;AL;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD78;AL;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD79;AL;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+FD7A;AL;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+FD7B;AL;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD7C;AL;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7D;AL;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD7E;AL;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+FD7F;AL;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+FD80;AL;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+FD81;AL;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+FD82;AL;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD83;AL;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD84;AL;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+FD85;AL;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD86;AL;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD87;AL;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD88;AL;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+FD89;AL;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+FD8A;AL;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8B;AL;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD8C;AL;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+FD8D;AL;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+FD8E;AL;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+FD8F;AL;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92;AL;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+FD93;AL;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+FD94;AL;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+FD95;AL;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD96;AL;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD97;AL;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD98;AL;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD99;AL;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FD9A;AL;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+FD9B;AL;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD9C;AL;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9D;AL;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FD9E;AL;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+FD9F;AL;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+FDA0;AL;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+FDA1;AL;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+FDA2;AL;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA3;AL;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+FDA4;AL;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA5;AL;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+FDA6;AL;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FDA7;AL;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FDA8;AL;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+FDA9;AL;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+FDAA;AL;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+FDAB;AL;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+FDAC;AL;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+FDAD;AL;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+FDAE;AL;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+FDAF;AL;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+FDB0;AL;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+FDB1;AL;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+FDB2;AL;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+FDB3;AL;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB4;AL;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+FDB5;AL;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB6;AL;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+FDB7;AL;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB8;AL;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDB9;AL;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBA;AL;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDBB;AL;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+FDBC;AL;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+FDBD;AL;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+FDBE;AL;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+FDBF;AL;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+FDC0;AL;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+FDC1;AL;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+FDC2;AL;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC3;AL;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+FDC4;AL;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+FDC5;AL;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FDC6;AL;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+FDC7;AL;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0;AL;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF1;AL;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+FDF2;AL;ARABIC LIGATURE ALLAH ISOLATED FORM
+FDF3;AL;ARABIC LIGATURE AKBAR ISOLATED FORM
+FDF4;AL;ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+FDF5;AL;ARABIC LIGATURE SALAM ISOLATED FORM
+FDF6;AL;ARABIC LIGATURE RASOUL ISOLATED FORM
+FDF7;AL;ARABIC LIGATURE ALAYHE ISOLATED FORM
+FDF8;AL;ARABIC LIGATURE WASALLAM ISOLATED FORM
+FDF9;AL;ARABIC LIGATURE SALLA ISOLATED FORM
+FDFA;AL;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+FDFB;AL;ARABIC LIGATURE JALLAJALALOUHOU
+FE20;CM;COMBINING LIGATURE LEFT HALF
+FE21;CM;COMBINING LIGATURE RIGHT HALF
+FE22;CM;COMBINING DOUBLE TILDE LEFT HALF
+FE23;CM;COMBINING DOUBLE TILDE RIGHT HALF
+FE30;ID;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31;ID;PRESENTATION FORM FOR VERTICAL EM DASH
+FE32;ID;PRESENTATION FORM FOR VERTICAL EN DASH
+FE33;ID;PRESENTATION FORM FOR VERTICAL LOW LINE
+FE34;ID;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35;OP;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36;CL;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37;OP;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38;CL;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39;OP;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A;CL;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B;OP;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C;CL;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D;OP;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E;CL;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F;OP;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40;CL;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41;OP;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42;CL;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43;OP;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44;CL;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE49;ID;DASHED OVERLINE
+FE4A;ID;CENTRELINE OVERLINE
+FE4B;ID;WAVY OVERLINE
+FE4C;ID;DOUBLE WAVY OVERLINE
+FE4D;ID;DASHED LOW LINE
+FE4E;ID;CENTRELINE LOW LINE
+FE4F;ID;WAVY LOW LINE
+FE50;CL;SMALL COMMA
+FE51;ID;SMALL IDEOGRAPHIC COMMA
+FE52;CL;SMALL FULL STOP
+FE54;NS;SMALL SEMICOLON
+FE55;NS;SMALL COLON
+FE56;EX;SMALL QUESTION MARK
+FE57;EX;SMALL EXCLAMATION MARK
+FE58;ID;SMALL EM DASH
+FE59;OP;SMALL LEFT PARENTHESIS
+FE5A;CL;SMALL RIGHT PARENTHESIS
+FE5B;OP;SMALL LEFT CURLY BRACKET
+FE5C;CL;SMALL RIGHT CURLY BRACKET
+FE5D;OP;SMALL LEFT TORTOISE SHELL BRACKET
+FE5E;CL;SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F;ID;SMALL NUMBER SIGN
+FE60;ID;SMALL AMPERSAND
+FE61;ID;SMALL ASTERISK
+FE62;ID;SMALL PLUS SIGN
+FE63;ID;SMALL HYPHEN-MINUS
+FE64;ID;SMALL LESS-THAN SIGN
+FE65;ID;SMALL GREATER-THAN SIGN
+FE66;ID;SMALL EQUALS SIGN
+FE68;ID;SMALL REVERSE SOLIDUS
+FE69;PR;SMALL DOLLAR SIGN
+FE6A;PO;SMALL PERCENT SIGN
+FE6B;AL;SMALL COMMERCIAL AT
+FE70;AL;ARABIC FATHATAN ISOLATED FORM
+FE71;AL;ARABIC TATWEEL WITH FATHATAN ABOVE
+FE72;AL;ARABIC DAMMATAN ISOLATED FORM
+FE74;AL;ARABIC KASRATAN ISOLATED FORM
+FE76;AL;ARABIC FATHA ISOLATED FORM
+FE77;AL;ARABIC FATHA MEDIAL FORM
+FE78;AL;ARABIC DAMMA ISOLATED FORM
+FE79;AL;ARABIC DAMMA MEDIAL FORM
+FE7A;AL;ARABIC KASRA ISOLATED FORM
+FE7B;AL;ARABIC KASRA MEDIAL FORM
+FE7C;AL;ARABIC SHADDA ISOLATED FORM
+FE7D;AL;ARABIC SHADDA MEDIAL FORM
+FE7E;AL;ARABIC SUKUN ISOLATED FORM
+FE7F;AL;ARABIC SUKUN MEDIAL FORM
+FE80;AL;ARABIC LETTER HAMZA ISOLATED FORM
+FE81;AL;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE82;AL;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE83;AL;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE84;AL;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE85;AL;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE86;AL;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE87;AL;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE88;AL;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE89;AL;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8A;AL;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8B;AL;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE8C;AL;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE8D;AL;ARABIC LETTER ALEF ISOLATED FORM
+FE8E;AL;ARABIC LETTER ALEF FINAL FORM
+FE8F;AL;ARABIC LETTER BEH ISOLATED FORM
+FE90;AL;ARABIC LETTER BEH FINAL FORM
+FE91;AL;ARABIC LETTER BEH INITIAL FORM
+FE92;AL;ARABIC LETTER BEH MEDIAL FORM
+FE93;AL;ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE94;AL;ARABIC LETTER TEH MARBUTA FINAL FORM
+FE95;AL;ARABIC LETTER TEH ISOLATED FORM
+FE96;AL;ARABIC LETTER TEH FINAL FORM
+FE97;AL;ARABIC LETTER TEH INITIAL FORM
+FE98;AL;ARABIC LETTER TEH MEDIAL FORM
+FE99;AL;ARABIC LETTER THEH ISOLATED FORM
+FE9A;AL;ARABIC LETTER THEH FINAL FORM
+FE9B;AL;ARABIC LETTER THEH INITIAL FORM
+FE9C;AL;ARABIC LETTER THEH MEDIAL FORM
+FE9D;AL;ARABIC LETTER JEEM ISOLATED FORM
+FE9E;AL;ARABIC LETTER JEEM FINAL FORM
+FE9F;AL;ARABIC LETTER JEEM INITIAL FORM
+FEA0;AL;ARABIC LETTER JEEM MEDIAL FORM
+FEA1;AL;ARABIC LETTER HAH ISOLATED FORM
+FEA2;AL;ARABIC LETTER HAH FINAL FORM
+FEA3;AL;ARABIC LETTER HAH INITIAL FORM
+FEA4;AL;ARABIC LETTER HAH MEDIAL FORM
+FEA5;AL;ARABIC LETTER KHAH ISOLATED FORM
+FEA6;AL;ARABIC LETTER KHAH FINAL FORM
+FEA7;AL;ARABIC LETTER KHAH INITIAL FORM
+FEA8;AL;ARABIC LETTER KHAH MEDIAL FORM
+FEA9;AL;ARABIC LETTER DAL ISOLATED FORM
+FEAA;AL;ARABIC LETTER DAL FINAL FORM
+FEAB;AL;ARABIC LETTER THAL ISOLATED FORM
+FEAC;AL;ARABIC LETTER THAL FINAL FORM
+FEAD;AL;ARABIC LETTER REH ISOLATED FORM
+FEAE;AL;ARABIC LETTER REH FINAL FORM
+FEAF;AL;ARABIC LETTER ZAIN ISOLATED FORM
+FEB0;AL;ARABIC LETTER ZAIN FINAL FORM
+FEB1;AL;ARABIC LETTER SEEN ISOLATED FORM
+FEB2;AL;ARABIC LETTER SEEN FINAL FORM
+FEB3;AL;ARABIC LETTER SEEN INITIAL FORM
+FEB4;AL;ARABIC LETTER SEEN MEDIAL FORM
+FEB5;AL;ARABIC LETTER SHEEN ISOLATED FORM
+FEB6;AL;ARABIC LETTER SHEEN FINAL FORM
+FEB7;AL;ARABIC LETTER SHEEN INITIAL FORM
+FEB8;AL;ARABIC LETTER SHEEN MEDIAL FORM
+FEB9;AL;ARABIC LETTER SAD ISOLATED FORM
+FEBA;AL;ARABIC LETTER SAD FINAL FORM
+FEBB;AL;ARABIC LETTER SAD INITIAL FORM
+FEBC;AL;ARABIC LETTER SAD MEDIAL FORM
+FEBD;AL;ARABIC LETTER DAD ISOLATED FORM
+FEBE;AL;ARABIC LETTER DAD FINAL FORM
+FEBF;AL;ARABIC LETTER DAD INITIAL FORM
+FEC0;AL;ARABIC LETTER DAD MEDIAL FORM
+FEC1;AL;ARABIC LETTER TAH ISOLATED FORM
+FEC2;AL;ARABIC LETTER TAH FINAL FORM
+FEC3;AL;ARABIC LETTER TAH INITIAL FORM
+FEC4;AL;ARABIC LETTER TAH MEDIAL FORM
+FEC5;AL;ARABIC LETTER ZAH ISOLATED FORM
+FEC6;AL;ARABIC LETTER ZAH FINAL FORM
+FEC7;AL;ARABIC LETTER ZAH INITIAL FORM
+FEC8;AL;ARABIC LETTER ZAH MEDIAL FORM
+FEC9;AL;ARABIC LETTER AIN ISOLATED FORM
+FECA;AL;ARABIC LETTER AIN FINAL FORM
+FECB;AL;ARABIC LETTER AIN INITIAL FORM
+FECC;AL;ARABIC LETTER AIN MEDIAL FORM
+FECD;AL;ARABIC LETTER GHAIN ISOLATED FORM
+FECE;AL;ARABIC LETTER GHAIN FINAL FORM
+FECF;AL;ARABIC LETTER GHAIN INITIAL FORM
+FED0;AL;ARABIC LETTER GHAIN MEDIAL FORM
+FED1;AL;ARABIC LETTER FEH ISOLATED FORM
+FED2;AL;ARABIC LETTER FEH FINAL FORM
+FED3;AL;ARABIC LETTER FEH INITIAL FORM
+FED4;AL;ARABIC LETTER FEH MEDIAL FORM
+FED5;AL;ARABIC LETTER QAF ISOLATED FORM
+FED6;AL;ARABIC LETTER QAF FINAL FORM
+FED7;AL;ARABIC LETTER QAF INITIAL FORM
+FED8;AL;ARABIC LETTER QAF MEDIAL FORM
+FED9;AL;ARABIC LETTER KAF ISOLATED FORM
+FEDA;AL;ARABIC LETTER KAF FINAL FORM
+FEDB;AL;ARABIC LETTER KAF INITIAL FORM
+FEDC;AL;ARABIC LETTER KAF MEDIAL FORM
+FEDD;AL;ARABIC LETTER LAM ISOLATED FORM
+FEDE;AL;ARABIC LETTER LAM FINAL FORM
+FEDF;AL;ARABIC LETTER LAM INITIAL FORM
+FEE0;AL;ARABIC LETTER LAM MEDIAL FORM
+FEE1;AL;ARABIC LETTER MEEM ISOLATED FORM
+FEE2;AL;ARABIC LETTER MEEM FINAL FORM
+FEE3;AL;ARABIC LETTER MEEM INITIAL FORM
+FEE4;AL;ARABIC LETTER MEEM MEDIAL FORM
+FEE5;AL;ARABIC LETTER NOON ISOLATED FORM
+FEE6;AL;ARABIC LETTER NOON FINAL FORM
+FEE7;AL;ARABIC LETTER NOON INITIAL FORM
+FEE8;AL;ARABIC LETTER NOON MEDIAL FORM
+FEE9;AL;ARABIC LETTER HEH ISOLATED FORM
+FEEA;AL;ARABIC LETTER HEH FINAL FORM
+FEEB;AL;ARABIC LETTER HEH INITIAL FORM
+FEEC;AL;ARABIC LETTER HEH MEDIAL FORM
+FEED;AL;ARABIC LETTER WAW ISOLATED FORM
+FEEE;AL;ARABIC LETTER WAW FINAL FORM
+FEEF;AL;ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF0;AL;ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF1;AL;ARABIC LETTER YEH ISOLATED FORM
+FEF2;AL;ARABIC LETTER YEH FINAL FORM
+FEF3;AL;ARABIC LETTER YEH INITIAL FORM
+FEF4;AL;ARABIC LETTER YEH MEDIAL FORM
+FEF5;AL;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF6;AL;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF7;AL;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF8;AL;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEF9;AL;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFA;AL;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFB;AL;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+FEFC;AL;ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFF;GL;ZERO WIDTH NO-BREAK SPACE
+FF01;EX;FULLWIDTH EXCLAMATION MARK
+FF02;ID;FULLWIDTH QUOTATION MARK
+FF03;ID;FULLWIDTH NUMBER SIGN
+FF04;PR;FULLWIDTH DOLLAR SIGN
+FF05;PO;FULLWIDTH PERCENT SIGN
+FF06;ID;FULLWIDTH AMPERSAND
+FF07;ID;FULLWIDTH APOSTROPHE
+FF08;OP;FULLWIDTH LEFT PARENTHESIS
+FF09;CL;FULLWIDTH RIGHT PARENTHESIS
+FF0A;ID;FULLWIDTH ASTERISK
+FF0B;ID;FULLWIDTH PLUS SIGN
+FF0C;CL;FULLWIDTH COMMA
+FF0D;ID;FULLWIDTH HYPHEN-MINUS
+FF0E;CL;FULLWIDTH FULL STOP
+FF0F;ID;FULLWIDTH SOLIDUS
+FF10;ID;FULLWIDTH DIGIT ZERO
+FF11;ID;FULLWIDTH DIGIT ONE
+FF12;ID;FULLWIDTH DIGIT TWO
+FF13;ID;FULLWIDTH DIGIT THREE
+FF14;ID;FULLWIDTH DIGIT FOUR
+FF15;ID;FULLWIDTH DIGIT FIVE
+FF16;ID;FULLWIDTH DIGIT SIX
+FF17;ID;FULLWIDTH DIGIT SEVEN
+FF18;ID;FULLWIDTH DIGIT EIGHT
+FF19;ID;FULLWIDTH DIGIT NINE
+FF1A;NS;FULLWIDTH COLON
+FF1B;NS;FULLWIDTH SEMICOLON
+FF1C;ID;FULLWIDTH LESS-THAN SIGN
+FF1D;ID;FULLWIDTH EQUALS SIGN
+FF1E;ID;FULLWIDTH GREATER-THAN SIGN
+FF1F;EX;FULLWIDTH QUESTION MARK
+FF20;ID;FULLWIDTH COMMERCIAL AT
+FF21;ID;FULLWIDTH LATIN CAPITAL LETTER A
+FF22;ID;FULLWIDTH LATIN CAPITAL LETTER B
+FF23;ID;FULLWIDTH LATIN CAPITAL LETTER C
+FF24;ID;FULLWIDTH LATIN CAPITAL LETTER D
+FF25;ID;FULLWIDTH LATIN CAPITAL LETTER E
+FF26;ID;FULLWIDTH LATIN CAPITAL LETTER F
+FF27;ID;FULLWIDTH LATIN CAPITAL LETTER G
+FF28;ID;FULLWIDTH LATIN CAPITAL LETTER H
+FF29;ID;FULLWIDTH LATIN CAPITAL LETTER I
+FF2A;ID;FULLWIDTH LATIN CAPITAL LETTER J
+FF2B;ID;FULLWIDTH LATIN CAPITAL LETTER K
+FF2C;ID;FULLWIDTH LATIN CAPITAL LETTER L
+FF2D;ID;FULLWIDTH LATIN CAPITAL LETTER M
+FF2E;ID;FULLWIDTH LATIN CAPITAL LETTER N
+FF2F;ID;FULLWIDTH LATIN CAPITAL LETTER O
+FF30;ID;FULLWIDTH LATIN CAPITAL LETTER P
+FF31;ID;FULLWIDTH LATIN CAPITAL LETTER Q
+FF32;ID;FULLWIDTH LATIN CAPITAL LETTER R
+FF33;ID;FULLWIDTH LATIN CAPITAL LETTER S
+FF34;ID;FULLWIDTH LATIN CAPITAL LETTER T
+FF35;ID;FULLWIDTH LATIN CAPITAL LETTER U
+FF36;ID;FULLWIDTH LATIN CAPITAL LETTER V
+FF37;ID;FULLWIDTH LATIN CAPITAL LETTER W
+FF38;ID;FULLWIDTH LATIN CAPITAL LETTER X
+FF39;ID;FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A;ID;FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B;OP;FULLWIDTH LEFT SQUARE BRACKET
+FF3C;ID;FULLWIDTH REVERSE SOLIDUS
+FF3D;CL;FULLWIDTH RIGHT SQUARE BRACKET
+FF3E;ID;FULLWIDTH CIRCUMFLEX ACCENT
+FF3F;ID;FULLWIDTH LOW LINE
+FF40;ID;FULLWIDTH GRAVE ACCENT
+FF41;ID;FULLWIDTH LATIN SMALL LETTER A
+FF42;ID;FULLWIDTH LATIN SMALL LETTER B
+FF43;ID;FULLWIDTH LATIN SMALL LETTER C
+FF44;ID;FULLWIDTH LATIN SMALL LETTER D
+FF45;ID;FULLWIDTH LATIN SMALL LETTER E
+FF46;ID;FULLWIDTH LATIN SMALL LETTER F
+FF47;ID;FULLWIDTH LATIN SMALL LETTER G
+FF48;ID;FULLWIDTH LATIN SMALL LETTER H
+FF49;ID;FULLWIDTH LATIN SMALL LETTER I
+FF4A;ID;FULLWIDTH LATIN SMALL LETTER J
+FF4B;ID;FULLWIDTH LATIN SMALL LETTER K
+FF4C;ID;FULLWIDTH LATIN SMALL LETTER L
+FF4D;ID;FULLWIDTH LATIN SMALL LETTER M
+FF4E;ID;FULLWIDTH LATIN SMALL LETTER N
+FF4F;ID;FULLWIDTH LATIN SMALL LETTER O
+FF50;ID;FULLWIDTH LATIN SMALL LETTER P
+FF51;ID;FULLWIDTH LATIN SMALL LETTER Q
+FF52;ID;FULLWIDTH LATIN SMALL LETTER R
+FF53;ID;FULLWIDTH LATIN SMALL LETTER S
+FF54;ID;FULLWIDTH LATIN SMALL LETTER T
+FF55;ID;FULLWIDTH LATIN SMALL LETTER U
+FF56;ID;FULLWIDTH LATIN SMALL LETTER V
+FF57;ID;FULLWIDTH LATIN SMALL LETTER W
+FF58;ID;FULLWIDTH LATIN SMALL LETTER X
+FF59;ID;FULLWIDTH LATIN SMALL LETTER Y
+FF5A;ID;FULLWIDTH LATIN SMALL LETTER Z
+FF5B;OP;FULLWIDTH LEFT CURLY BRACKET
+FF5C;ID;FULLWIDTH VERTICAL LINE
+FF5D;CL;FULLWIDTH RIGHT CURLY BRACKET
+FF5E;ID;FULLWIDTH TILDE
+FF61;CL;HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62;OP;HALFWIDTH LEFT CORNER BRACKET
+FF63;CL;HALFWIDTH RIGHT CORNER BRACKET
+FF64;CL;HALFWIDTH IDEOGRAPHIC COMMA
+FF65;NS;HALFWIDTH KATAKANA MIDDLE DOT
+FF66;AL;HALFWIDTH KATAKANA LETTER WO
+FF67;NS;HALFWIDTH KATAKANA LETTER SMALL A
+FF68;NS;HALFWIDTH KATAKANA LETTER SMALL I
+FF69;NS;HALFWIDTH KATAKANA LETTER SMALL U
+FF6A;NS;HALFWIDTH KATAKANA LETTER SMALL E
+FF6B;NS;HALFWIDTH KATAKANA LETTER SMALL O
+FF6C;NS;HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D;NS;HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E;NS;HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F;NS;HALFWIDTH KATAKANA LETTER SMALL TU
+FF70;NS;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71;AL;HALFWIDTH KATAKANA LETTER A
+FF72;AL;HALFWIDTH KATAKANA LETTER I
+FF73;AL;HALFWIDTH KATAKANA LETTER U
+FF74;AL;HALFWIDTH KATAKANA LETTER E
+FF75;AL;HALFWIDTH KATAKANA LETTER O
+FF76;AL;HALFWIDTH KATAKANA LETTER KA
+FF77;AL;HALFWIDTH KATAKANA LETTER KI
+FF78;AL;HALFWIDTH KATAKANA LETTER KU
+FF79;AL;HALFWIDTH KATAKANA LETTER KE
+FF7A;AL;HALFWIDTH KATAKANA LETTER KO
+FF7B;AL;HALFWIDTH KATAKANA LETTER SA
+FF7C;AL;HALFWIDTH KATAKANA LETTER SI
+FF7D;AL;HALFWIDTH KATAKANA LETTER SU
+FF7E;AL;HALFWIDTH KATAKANA LETTER SE
+FF7F;AL;HALFWIDTH KATAKANA LETTER SO
+FF80;AL;HALFWIDTH KATAKANA LETTER TA
+FF81;AL;HALFWIDTH KATAKANA LETTER TI
+FF82;AL;HALFWIDTH KATAKANA LETTER TU
+FF83;AL;HALFWIDTH KATAKANA LETTER TE
+FF84;AL;HALFWIDTH KATAKANA LETTER TO
+FF85;AL;HALFWIDTH KATAKANA LETTER NA
+FF86;AL;HALFWIDTH KATAKANA LETTER NI
+FF87;AL;HALFWIDTH KATAKANA LETTER NU
+FF88;AL;HALFWIDTH KATAKANA LETTER NE
+FF89;AL;HALFWIDTH KATAKANA LETTER NO
+FF8A;AL;HALFWIDTH KATAKANA LETTER HA
+FF8B;AL;HALFWIDTH KATAKANA LETTER HI
+FF8C;AL;HALFWIDTH KATAKANA LETTER HU
+FF8D;AL;HALFWIDTH KATAKANA LETTER HE
+FF8E;AL;HALFWIDTH KATAKANA LETTER HO
+FF8F;AL;HALFWIDTH KATAKANA LETTER MA
+FF90;AL;HALFWIDTH KATAKANA LETTER MI
+FF91;AL;HALFWIDTH KATAKANA LETTER MU
+FF92;AL;HALFWIDTH KATAKANA LETTER ME
+FF93;AL;HALFWIDTH KATAKANA LETTER MO
+FF94;AL;HALFWIDTH KATAKANA LETTER YA
+FF95;AL;HALFWIDTH KATAKANA LETTER YU
+FF96;AL;HALFWIDTH KATAKANA LETTER YO
+FF97;AL;HALFWIDTH KATAKANA LETTER RA
+FF98;AL;HALFWIDTH KATAKANA LETTER RI
+FF99;AL;HALFWIDTH KATAKANA LETTER RU
+FF9A;AL;HALFWIDTH KATAKANA LETTER RE
+FF9B;AL;HALFWIDTH KATAKANA LETTER RO
+FF9C;AL;HALFWIDTH KATAKANA LETTER WA
+FF9D;AL;HALFWIDTH KATAKANA LETTER N
+FF9E;NS;HALFWIDTH KATAKANA VOICED SOUND MARK
+FF9F;NS;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0;AL;HALFWIDTH HANGUL FILLER
+FFA1;AL;HALFWIDTH HANGUL LETTER KIYEOK
+FFA2;AL;HALFWIDTH HANGUL LETTER SSANGKIYEOK
+FFA3;AL;HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+FFA4;AL;HALFWIDTH HANGUL LETTER NIEUN
+FFA5;AL;HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+FFA6;AL;HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+FFA7;AL;HALFWIDTH HANGUL LETTER TIKEUT
+FFA8;AL;HALFWIDTH HANGUL LETTER SSANGTIKEUT
+FFA9;AL;HALFWIDTH HANGUL LETTER RIEUL
+FFAA;AL;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+FFAB;AL;HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+FFAC;AL;HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+FFAD;AL;HALFWIDTH HANGUL LETTER RIEUL-SIOS
+FFAE;AL;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+FFAF;AL;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+FFB0;AL;HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+FFB1;AL;HALFWIDTH HANGUL LETTER MIEUM
+FFB2;AL;HALFWIDTH HANGUL LETTER PIEUP
+FFB3;AL;HALFWIDTH HANGUL LETTER SSANGPIEUP
+FFB4;AL;HALFWIDTH HANGUL LETTER PIEUP-SIOS
+FFB5;AL;HALFWIDTH HANGUL LETTER SIOS
+FFB6;AL;HALFWIDTH HANGUL LETTER SSANGSIOS
+FFB7;AL;HALFWIDTH HANGUL LETTER IEUNG
+FFB8;AL;HALFWIDTH HANGUL LETTER CIEUC
+FFB9;AL;HALFWIDTH HANGUL LETTER SSANGCIEUC
+FFBA;AL;HALFWIDTH HANGUL LETTER CHIEUCH
+FFBB;AL;HALFWIDTH HANGUL LETTER KHIEUKH
+FFBC;AL;HALFWIDTH HANGUL LETTER THIEUTH
+FFBD;AL;HALFWIDTH HANGUL LETTER PHIEUPH
+FFBE;AL;HALFWIDTH HANGUL LETTER HIEUH
+FFC2;AL;HALFWIDTH HANGUL LETTER A
+FFC3;AL;HALFWIDTH HANGUL LETTER AE
+FFC4;AL;HALFWIDTH HANGUL LETTER YA
+FFC5;AL;HALFWIDTH HANGUL LETTER YAE
+FFC6;AL;HALFWIDTH HANGUL LETTER EO
+FFC7;AL;HALFWIDTH HANGUL LETTER E
+FFCA;AL;HALFWIDTH HANGUL LETTER YEO
+FFCB;AL;HALFWIDTH HANGUL LETTER YE
+FFCC;AL;HALFWIDTH HANGUL LETTER O
+FFCD;AL;HALFWIDTH HANGUL LETTER WA
+FFCE;AL;HALFWIDTH HANGUL LETTER WAE
+FFCF;AL;HALFWIDTH HANGUL LETTER OE
+FFD2;AL;HALFWIDTH HANGUL LETTER YO
+FFD3;AL;HALFWIDTH HANGUL LETTER U
+FFD4;AL;HALFWIDTH HANGUL LETTER WEO
+FFD5;AL;HALFWIDTH HANGUL LETTER WE
+FFD6;AL;HALFWIDTH HANGUL LETTER WI
+FFD7;AL;HALFWIDTH HANGUL LETTER YU
+FFDA;AL;HALFWIDTH HANGUL LETTER EU
+FFDB;AL;HALFWIDTH HANGUL LETTER YI
+FFDC;AL;HALFWIDTH HANGUL LETTER I
+FFE0;PO;FULLWIDTH CENT SIGN
+FFE1;PR;FULLWIDTH POUND SIGN
+FFE2;ID;FULLWIDTH NOT SIGN
+FFE3;ID;FULLWIDTH MACRON
+FFE4;ID;FULLWIDTH BROKEN BAR
+FFE5;PR;FULLWIDTH YEN SIGN
+FFE6;PR;FULLWIDTH WON SIGN
+FFE8;AL;HALFWIDTH FORMS LIGHT VERTICAL
+FFE9;AL;HALFWIDTH LEFTWARDS ARROW
+FFEA;AL;HALFWIDTH UPWARDS ARROW
+FFEB;AL;HALFWIDTH RIGHTWARDS ARROW
+FFEC;AL;HALFWIDTH DOWNWARDS ARROW
+FFED;AL;HALFWIDTH BLACK SQUARE
+FFEE;AL;HALFWIDTH WHITE CIRCLE
+FFF9;CM;INTERLINEAR ANNOTATION ANCHOR
+FFFA;CM;INTERLINEAR ANNOTATION SEPARATOR
+FFFB;CM;INTERLINEAR ANNOTATION TERMINATOR
+FFFC;CB;OBJECT REPLACEMENT CHARACTER
+FFFD;AI;REPLACEMENT CHARACTER
diff --git a/contrib/perl5/lib/unicode/Makefile b/contrib/perl5/lib/unicode/Makefile
new file mode 100644
index 0000000..c68fa3a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Makefile
@@ -0,0 +1,6 @@
+all:
+ ./mktables.PL
+ ./MakeEthiopicSyllables.PL
+
+clean:
+ rm -f *.pl */*.pl
diff --git a/contrib/perl5/lib/unicode/Name.pl b/contrib/perl5/lib/unicode/Name.pl
new file mode 100644
index 0000000..ef8979f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Name.pl
@@ -0,0 +1,10552 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0000 001f <control>
+0020 SPACE
+0021 EXCLAMATION MARK
+0022 QUOTATION MARK
+0023 NUMBER SIGN
+0024 DOLLAR SIGN
+0025 PERCENT SIGN
+0026 AMPERSAND
+0027 APOSTROPHE
+0028 LEFT PARENTHESIS
+0029 RIGHT PARENTHESIS
+002a ASTERISK
+002b PLUS SIGN
+002c COMMA
+002d HYPHEN-MINUS
+002e FULL STOP
+002f SOLIDUS
+0030 DIGIT ZERO
+0031 DIGIT ONE
+0032 DIGIT TWO
+0033 DIGIT THREE
+0034 DIGIT FOUR
+0035 DIGIT FIVE
+0036 DIGIT SIX
+0037 DIGIT SEVEN
+0038 DIGIT EIGHT
+0039 DIGIT NINE
+003a COLON
+003b SEMICOLON
+003c LESS-THAN SIGN
+003d EQUALS SIGN
+003e GREATER-THAN SIGN
+003f QUESTION MARK
+0040 COMMERCIAL AT
+0041 LATIN CAPITAL LETTER A
+0042 LATIN CAPITAL LETTER B
+0043 LATIN CAPITAL LETTER C
+0044 LATIN CAPITAL LETTER D
+0045 LATIN CAPITAL LETTER E
+0046 LATIN CAPITAL LETTER F
+0047 LATIN CAPITAL LETTER G
+0048 LATIN CAPITAL LETTER H
+0049 LATIN CAPITAL LETTER I
+004a LATIN CAPITAL LETTER J
+004b LATIN CAPITAL LETTER K
+004c LATIN CAPITAL LETTER L
+004d LATIN CAPITAL LETTER M
+004e LATIN CAPITAL LETTER N
+004f LATIN CAPITAL LETTER O
+0050 LATIN CAPITAL LETTER P
+0051 LATIN CAPITAL LETTER Q
+0052 LATIN CAPITAL LETTER R
+0053 LATIN CAPITAL LETTER S
+0054 LATIN CAPITAL LETTER T
+0055 LATIN CAPITAL LETTER U
+0056 LATIN CAPITAL LETTER V
+0057 LATIN CAPITAL LETTER W
+0058 LATIN CAPITAL LETTER X
+0059 LATIN CAPITAL LETTER Y
+005a LATIN CAPITAL LETTER Z
+005b LEFT SQUARE BRACKET
+005c REVERSE SOLIDUS
+005d RIGHT SQUARE BRACKET
+005e CIRCUMFLEX ACCENT
+005f LOW LINE
+0060 GRAVE ACCENT
+0061 LATIN SMALL LETTER A
+0062 LATIN SMALL LETTER B
+0063 LATIN SMALL LETTER C
+0064 LATIN SMALL LETTER D
+0065 LATIN SMALL LETTER E
+0066 LATIN SMALL LETTER F
+0067 LATIN SMALL LETTER G
+0068 LATIN SMALL LETTER H
+0069 LATIN SMALL LETTER I
+006a LATIN SMALL LETTER J
+006b LATIN SMALL LETTER K
+006c LATIN SMALL LETTER L
+006d LATIN SMALL LETTER M
+006e LATIN SMALL LETTER N
+006f LATIN SMALL LETTER O
+0070 LATIN SMALL LETTER P
+0071 LATIN SMALL LETTER Q
+0072 LATIN SMALL LETTER R
+0073 LATIN SMALL LETTER S
+0074 LATIN SMALL LETTER T
+0075 LATIN SMALL LETTER U
+0076 LATIN SMALL LETTER V
+0077 LATIN SMALL LETTER W
+0078 LATIN SMALL LETTER X
+0079 LATIN SMALL LETTER Y
+007a LATIN SMALL LETTER Z
+007b LEFT CURLY BRACKET
+007c VERTICAL LINE
+007d RIGHT CURLY BRACKET
+007e TILDE
+007f 009f <control>
+00a0 NO-BREAK SPACE
+00a1 INVERTED EXCLAMATION MARK
+00a2 CENT SIGN
+00a3 POUND SIGN
+00a4 CURRENCY SIGN
+00a5 YEN SIGN
+00a6 BROKEN BAR
+00a7 SECTION SIGN
+00a8 DIAERESIS
+00a9 COPYRIGHT SIGN
+00aa FEMININE ORDINAL INDICATOR
+00ab LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00ac NOT SIGN
+00ad SOFT HYPHEN
+00ae REGISTERED SIGN
+00af MACRON
+00b0 DEGREE SIGN
+00b1 PLUS-MINUS SIGN
+00b2 SUPERSCRIPT TWO
+00b3 SUPERSCRIPT THREE
+00b4 ACUTE ACCENT
+00b5 MICRO SIGN
+00b6 PILCROW SIGN
+00b7 MIDDLE DOT
+00b8 CEDILLA
+00b9 SUPERSCRIPT ONE
+00ba MASCULINE ORDINAL INDICATOR
+00bb RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00bc VULGAR FRACTION ONE QUARTER
+00bd VULGAR FRACTION ONE HALF
+00be VULGAR FRACTION THREE QUARTERS
+00bf INVERTED QUESTION MARK
+00c0 LATIN CAPITAL LETTER A WITH GRAVE
+00c1 LATIN CAPITAL LETTER A WITH ACUTE
+00c2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00c3 LATIN CAPITAL LETTER A WITH TILDE
+00c4 LATIN CAPITAL LETTER A WITH DIAERESIS
+00c5 LATIN CAPITAL LETTER A WITH RING ABOVE
+00c6 LATIN CAPITAL LETTER AE
+00c7 LATIN CAPITAL LETTER C WITH CEDILLA
+00c8 LATIN CAPITAL LETTER E WITH GRAVE
+00c9 LATIN CAPITAL LETTER E WITH ACUTE
+00ca LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00cb LATIN CAPITAL LETTER E WITH DIAERESIS
+00cc LATIN CAPITAL LETTER I WITH GRAVE
+00cd LATIN CAPITAL LETTER I WITH ACUTE
+00ce LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00cf LATIN CAPITAL LETTER I WITH DIAERESIS
+00d0 LATIN CAPITAL LETTER ETH
+00d1 LATIN CAPITAL LETTER N WITH TILDE
+00d2 LATIN CAPITAL LETTER O WITH GRAVE
+00d3 LATIN CAPITAL LETTER O WITH ACUTE
+00d4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00d5 LATIN CAPITAL LETTER O WITH TILDE
+00d6 LATIN CAPITAL LETTER O WITH DIAERESIS
+00d7 MULTIPLICATION SIGN
+00d8 LATIN CAPITAL LETTER O WITH STROKE
+00d9 LATIN CAPITAL LETTER U WITH GRAVE
+00da LATIN CAPITAL LETTER U WITH ACUTE
+00db LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00dc LATIN CAPITAL LETTER U WITH DIAERESIS
+00dd LATIN CAPITAL LETTER Y WITH ACUTE
+00de LATIN CAPITAL LETTER THORN
+00df LATIN SMALL LETTER SHARP S
+00e0 LATIN SMALL LETTER A WITH GRAVE
+00e1 LATIN SMALL LETTER A WITH ACUTE
+00e2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+00e3 LATIN SMALL LETTER A WITH TILDE
+00e4 LATIN SMALL LETTER A WITH DIAERESIS
+00e5 LATIN SMALL LETTER A WITH RING ABOVE
+00e6 LATIN SMALL LETTER AE
+00e7 LATIN SMALL LETTER C WITH CEDILLA
+00e8 LATIN SMALL LETTER E WITH GRAVE
+00e9 LATIN SMALL LETTER E WITH ACUTE
+00ea LATIN SMALL LETTER E WITH CIRCUMFLEX
+00eb LATIN SMALL LETTER E WITH DIAERESIS
+00ec LATIN SMALL LETTER I WITH GRAVE
+00ed LATIN SMALL LETTER I WITH ACUTE
+00ee LATIN SMALL LETTER I WITH CIRCUMFLEX
+00ef LATIN SMALL LETTER I WITH DIAERESIS
+00f0 LATIN SMALL LETTER ETH
+00f1 LATIN SMALL LETTER N WITH TILDE
+00f2 LATIN SMALL LETTER O WITH GRAVE
+00f3 LATIN SMALL LETTER O WITH ACUTE
+00f4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+00f5 LATIN SMALL LETTER O WITH TILDE
+00f6 LATIN SMALL LETTER O WITH DIAERESIS
+00f7 DIVISION SIGN
+00f8 LATIN SMALL LETTER O WITH STROKE
+00f9 LATIN SMALL LETTER U WITH GRAVE
+00fa LATIN SMALL LETTER U WITH ACUTE
+00fb LATIN SMALL LETTER U WITH CIRCUMFLEX
+00fc LATIN SMALL LETTER U WITH DIAERESIS
+00fd LATIN SMALL LETTER Y WITH ACUTE
+00fe LATIN SMALL LETTER THORN
+00ff LATIN SMALL LETTER Y WITH DIAERESIS
+0100 LATIN CAPITAL LETTER A WITH MACRON
+0101 LATIN SMALL LETTER A WITH MACRON
+0102 LATIN CAPITAL LETTER A WITH BREVE
+0103 LATIN SMALL LETTER A WITH BREVE
+0104 LATIN CAPITAL LETTER A WITH OGONEK
+0105 LATIN SMALL LETTER A WITH OGONEK
+0106 LATIN CAPITAL LETTER C WITH ACUTE
+0107 LATIN SMALL LETTER C WITH ACUTE
+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX
+010a LATIN CAPITAL LETTER C WITH DOT ABOVE
+010b LATIN SMALL LETTER C WITH DOT ABOVE
+010c LATIN CAPITAL LETTER C WITH CARON
+010d LATIN SMALL LETTER C WITH CARON
+010e LATIN CAPITAL LETTER D WITH CARON
+010f LATIN SMALL LETTER D WITH CARON
+0110 LATIN CAPITAL LETTER D WITH STROKE
+0111 LATIN SMALL LETTER D WITH STROKE
+0112 LATIN CAPITAL LETTER E WITH MACRON
+0113 LATIN SMALL LETTER E WITH MACRON
+0114 LATIN CAPITAL LETTER E WITH BREVE
+0115 LATIN SMALL LETTER E WITH BREVE
+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+0117 LATIN SMALL LETTER E WITH DOT ABOVE
+0118 LATIN CAPITAL LETTER E WITH OGONEK
+0119 LATIN SMALL LETTER E WITH OGONEK
+011a LATIN CAPITAL LETTER E WITH CARON
+011b LATIN SMALL LETTER E WITH CARON
+011c LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011d LATIN SMALL LETTER G WITH CIRCUMFLEX
+011e LATIN CAPITAL LETTER G WITH BREVE
+011f LATIN SMALL LETTER G WITH BREVE
+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
+0121 LATIN SMALL LETTER G WITH DOT ABOVE
+0122 LATIN CAPITAL LETTER G WITH CEDILLA
+0123 LATIN SMALL LETTER G WITH CEDILLA
+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX
+0126 LATIN CAPITAL LETTER H WITH STROKE
+0127 LATIN SMALL LETTER H WITH STROKE
+0128 LATIN CAPITAL LETTER I WITH TILDE
+0129 LATIN SMALL LETTER I WITH TILDE
+012a LATIN CAPITAL LETTER I WITH MACRON
+012b LATIN SMALL LETTER I WITH MACRON
+012c LATIN CAPITAL LETTER I WITH BREVE
+012d LATIN SMALL LETTER I WITH BREVE
+012e LATIN CAPITAL LETTER I WITH OGONEK
+012f LATIN SMALL LETTER I WITH OGONEK
+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131 LATIN SMALL LETTER DOTLESS I
+0132 LATIN CAPITAL LIGATURE IJ
+0133 LATIN SMALL LIGATURE IJ
+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX
+0136 LATIN CAPITAL LETTER K WITH CEDILLA
+0137 LATIN SMALL LETTER K WITH CEDILLA
+0138 LATIN SMALL LETTER KRA
+0139 LATIN CAPITAL LETTER L WITH ACUTE
+013a LATIN SMALL LETTER L WITH ACUTE
+013b LATIN CAPITAL LETTER L WITH CEDILLA
+013c LATIN SMALL LETTER L WITH CEDILLA
+013d LATIN CAPITAL LETTER L WITH CARON
+013e LATIN SMALL LETTER L WITH CARON
+013f LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0140 LATIN SMALL LETTER L WITH MIDDLE DOT
+0141 LATIN CAPITAL LETTER L WITH STROKE
+0142 LATIN SMALL LETTER L WITH STROKE
+0143 LATIN CAPITAL LETTER N WITH ACUTE
+0144 LATIN SMALL LETTER N WITH ACUTE
+0145 LATIN CAPITAL LETTER N WITH CEDILLA
+0146 LATIN SMALL LETTER N WITH CEDILLA
+0147 LATIN CAPITAL LETTER N WITH CARON
+0148 LATIN SMALL LETTER N WITH CARON
+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014a LATIN CAPITAL LETTER ENG
+014b LATIN SMALL LETTER ENG
+014c LATIN CAPITAL LETTER O WITH MACRON
+014d LATIN SMALL LETTER O WITH MACRON
+014e LATIN CAPITAL LETTER O WITH BREVE
+014f LATIN SMALL LETTER O WITH BREVE
+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0152 LATIN CAPITAL LIGATURE OE
+0153 LATIN SMALL LIGATURE OE
+0154 LATIN CAPITAL LETTER R WITH ACUTE
+0155 LATIN SMALL LETTER R WITH ACUTE
+0156 LATIN CAPITAL LETTER R WITH CEDILLA
+0157 LATIN SMALL LETTER R WITH CEDILLA
+0158 LATIN CAPITAL LETTER R WITH CARON
+0159 LATIN SMALL LETTER R WITH CARON
+015a LATIN CAPITAL LETTER S WITH ACUTE
+015b LATIN SMALL LETTER S WITH ACUTE
+015c LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015d LATIN SMALL LETTER S WITH CIRCUMFLEX
+015e LATIN CAPITAL LETTER S WITH CEDILLA
+015f LATIN SMALL LETTER S WITH CEDILLA
+0160 LATIN CAPITAL LETTER S WITH CARON
+0161 LATIN SMALL LETTER S WITH CARON
+0162 LATIN CAPITAL LETTER T WITH CEDILLA
+0163 LATIN SMALL LETTER T WITH CEDILLA
+0164 LATIN CAPITAL LETTER T WITH CARON
+0165 LATIN SMALL LETTER T WITH CARON
+0166 LATIN CAPITAL LETTER T WITH STROKE
+0167 LATIN SMALL LETTER T WITH STROKE
+0168 LATIN CAPITAL LETTER U WITH TILDE
+0169 LATIN SMALL LETTER U WITH TILDE
+016a LATIN CAPITAL LETTER U WITH MACRON
+016b LATIN SMALL LETTER U WITH MACRON
+016c LATIN CAPITAL LETTER U WITH BREVE
+016d LATIN SMALL LETTER U WITH BREVE
+016e LATIN CAPITAL LETTER U WITH RING ABOVE
+016f LATIN SMALL LETTER U WITH RING ABOVE
+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0172 LATIN CAPITAL LETTER U WITH OGONEK
+0173 LATIN SMALL LETTER U WITH OGONEK
+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX
+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179 LATIN CAPITAL LETTER Z WITH ACUTE
+017a LATIN SMALL LETTER Z WITH ACUTE
+017b LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017c LATIN SMALL LETTER Z WITH DOT ABOVE
+017d LATIN CAPITAL LETTER Z WITH CARON
+017e LATIN SMALL LETTER Z WITH CARON
+017f LATIN SMALL LETTER LONG S
+0180 LATIN SMALL LETTER B WITH STROKE
+0181 LATIN CAPITAL LETTER B WITH HOOK
+0182 LATIN CAPITAL LETTER B WITH TOPBAR
+0183 LATIN SMALL LETTER B WITH TOPBAR
+0184 LATIN CAPITAL LETTER TONE SIX
+0185 LATIN SMALL LETTER TONE SIX
+0186 LATIN CAPITAL LETTER OPEN O
+0187 LATIN CAPITAL LETTER C WITH HOOK
+0188 LATIN SMALL LETTER C WITH HOOK
+0189 LATIN CAPITAL LETTER AFRICAN D
+018a LATIN CAPITAL LETTER D WITH HOOK
+018b LATIN CAPITAL LETTER D WITH TOPBAR
+018c LATIN SMALL LETTER D WITH TOPBAR
+018d LATIN SMALL LETTER TURNED DELTA
+018e LATIN CAPITAL LETTER REVERSED E
+018f LATIN CAPITAL LETTER SCHWA
+0190 LATIN CAPITAL LETTER OPEN E
+0191 LATIN CAPITAL LETTER F WITH HOOK
+0192 LATIN SMALL LETTER F WITH HOOK
+0193 LATIN CAPITAL LETTER G WITH HOOK
+0194 LATIN CAPITAL LETTER GAMMA
+0195 LATIN SMALL LETTER HV
+0196 LATIN CAPITAL LETTER IOTA
+0197 LATIN CAPITAL LETTER I WITH STROKE
+0198 LATIN CAPITAL LETTER K WITH HOOK
+0199 LATIN SMALL LETTER K WITH HOOK
+019a LATIN SMALL LETTER L WITH BAR
+019b LATIN SMALL LETTER LAMBDA WITH STROKE
+019c LATIN CAPITAL LETTER TURNED M
+019d LATIN CAPITAL LETTER N WITH LEFT HOOK
+019e LATIN SMALL LETTER N WITH LONG RIGHT LEG
+019f LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01a0 LATIN CAPITAL LETTER O WITH HORN
+01a1 LATIN SMALL LETTER O WITH HORN
+01a2 LATIN CAPITAL LETTER OI
+01a3 LATIN SMALL LETTER OI
+01a4 LATIN CAPITAL LETTER P WITH HOOK
+01a5 LATIN SMALL LETTER P WITH HOOK
+01a6 LATIN LETTER YR
+01a7 LATIN CAPITAL LETTER TONE TWO
+01a8 LATIN SMALL LETTER TONE TWO
+01a9 LATIN CAPITAL LETTER ESH
+01aa LATIN LETTER REVERSED ESH LOOP
+01ab LATIN SMALL LETTER T WITH PALATAL HOOK
+01ac LATIN CAPITAL LETTER T WITH HOOK
+01ad LATIN SMALL LETTER T WITH HOOK
+01ae LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01af LATIN CAPITAL LETTER U WITH HORN
+01b0 LATIN SMALL LETTER U WITH HORN
+01b1 LATIN CAPITAL LETTER UPSILON
+01b2 LATIN CAPITAL LETTER V WITH HOOK
+01b3 LATIN CAPITAL LETTER Y WITH HOOK
+01b4 LATIN SMALL LETTER Y WITH HOOK
+01b5 LATIN CAPITAL LETTER Z WITH STROKE
+01b6 LATIN SMALL LETTER Z WITH STROKE
+01b7 LATIN CAPITAL LETTER EZH
+01b8 LATIN CAPITAL LETTER EZH REVERSED
+01b9 LATIN SMALL LETTER EZH REVERSED
+01ba LATIN SMALL LETTER EZH WITH TAIL
+01bb LATIN LETTER TWO WITH STROKE
+01bc LATIN CAPITAL LETTER TONE FIVE
+01bd LATIN SMALL LETTER TONE FIVE
+01be LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+01bf LATIN LETTER WYNN
+01c0 LATIN LETTER DENTAL CLICK
+01c1 LATIN LETTER LATERAL CLICK
+01c2 LATIN LETTER ALVEOLAR CLICK
+01c3 LATIN LETTER RETROFLEX CLICK
+01c4 LATIN CAPITAL LETTER DZ WITH CARON
+01c5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01c6 LATIN SMALL LETTER DZ WITH CARON
+01c7 LATIN CAPITAL LETTER LJ
+01c8 LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01c9 LATIN SMALL LETTER LJ
+01ca LATIN CAPITAL LETTER NJ
+01cb LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01cc LATIN SMALL LETTER NJ
+01cd LATIN CAPITAL LETTER A WITH CARON
+01ce LATIN SMALL LETTER A WITH CARON
+01cf LATIN CAPITAL LETTER I WITH CARON
+01d0 LATIN SMALL LETTER I WITH CARON
+01d1 LATIN CAPITAL LETTER O WITH CARON
+01d2 LATIN SMALL LETTER O WITH CARON
+01d3 LATIN CAPITAL LETTER U WITH CARON
+01d4 LATIN SMALL LETTER U WITH CARON
+01d5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01d6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+01d7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01d8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+01d9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01da LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+01db LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01dc LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01dd LATIN SMALL LETTER TURNED E
+01de LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01df LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+01e0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01e1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+01e2 LATIN CAPITAL LETTER AE WITH MACRON
+01e3 LATIN SMALL LETTER AE WITH MACRON
+01e4 LATIN CAPITAL LETTER G WITH STROKE
+01e5 LATIN SMALL LETTER G WITH STROKE
+01e6 LATIN CAPITAL LETTER G WITH CARON
+01e7 LATIN SMALL LETTER G WITH CARON
+01e8 LATIN CAPITAL LETTER K WITH CARON
+01e9 LATIN SMALL LETTER K WITH CARON
+01ea LATIN CAPITAL LETTER O WITH OGONEK
+01eb LATIN SMALL LETTER O WITH OGONEK
+01ec LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01ed LATIN SMALL LETTER O WITH OGONEK AND MACRON
+01ee LATIN CAPITAL LETTER EZH WITH CARON
+01ef LATIN SMALL LETTER EZH WITH CARON
+01f0 LATIN SMALL LETTER J WITH CARON
+01f1 LATIN CAPITAL LETTER DZ
+01f2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01f3 LATIN SMALL LETTER DZ
+01f4 LATIN CAPITAL LETTER G WITH ACUTE
+01f5 LATIN SMALL LETTER G WITH ACUTE
+01f6 LATIN CAPITAL LETTER HWAIR
+01f7 LATIN CAPITAL LETTER WYNN
+01f8 LATIN CAPITAL LETTER N WITH GRAVE
+01f9 LATIN SMALL LETTER N WITH GRAVE
+01fa LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01fb LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+01fc LATIN CAPITAL LETTER AE WITH ACUTE
+01fd LATIN SMALL LETTER AE WITH ACUTE
+01fe LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+01ff LATIN SMALL LETTER O WITH STROKE AND ACUTE
+0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE
+0202 LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0203 LATIN SMALL LETTER A WITH INVERTED BREVE
+0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE
+0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0207 LATIN SMALL LETTER E WITH INVERTED BREVE
+0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE
+020a LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020b LATIN SMALL LETTER I WITH INVERTED BREVE
+020c LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020d LATIN SMALL LETTER O WITH DOUBLE GRAVE
+020e LATIN CAPITAL LETTER O WITH INVERTED BREVE
+020f LATIN SMALL LETTER O WITH INVERTED BREVE
+0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE
+0212 LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0213 LATIN SMALL LETTER R WITH INVERTED BREVE
+0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE
+0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0217 LATIN SMALL LETTER U WITH INVERTED BREVE
+0218 LATIN CAPITAL LETTER S WITH COMMA BELOW
+0219 LATIN SMALL LETTER S WITH COMMA BELOW
+021a LATIN CAPITAL LETTER T WITH COMMA BELOW
+021b LATIN SMALL LETTER T WITH COMMA BELOW
+021c LATIN CAPITAL LETTER YOGH
+021d LATIN SMALL LETTER YOGH
+021e LATIN CAPITAL LETTER H WITH CARON
+021f LATIN SMALL LETTER H WITH CARON
+0222 LATIN CAPITAL LETTER OU
+0223 LATIN SMALL LETTER OU
+0224 LATIN CAPITAL LETTER Z WITH HOOK
+0225 LATIN SMALL LETTER Z WITH HOOK
+0226 LATIN CAPITAL LETTER A WITH DOT ABOVE
+0227 LATIN SMALL LETTER A WITH DOT ABOVE
+0228 LATIN CAPITAL LETTER E WITH CEDILLA
+0229 LATIN SMALL LETTER E WITH CEDILLA
+022a LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022b LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+022c LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022d LATIN SMALL LETTER O WITH TILDE AND MACRON
+022e LATIN CAPITAL LETTER O WITH DOT ABOVE
+022f LATIN SMALL LETTER O WITH DOT ABOVE
+0230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+0232 LATIN CAPITAL LETTER Y WITH MACRON
+0233 LATIN SMALL LETTER Y WITH MACRON
+0250 LATIN SMALL LETTER TURNED A
+0251 LATIN SMALL LETTER ALPHA
+0252 LATIN SMALL LETTER TURNED ALPHA
+0253 LATIN SMALL LETTER B WITH HOOK
+0254 LATIN SMALL LETTER OPEN O
+0255 LATIN SMALL LETTER C WITH CURL
+0256 LATIN SMALL LETTER D WITH TAIL
+0257 LATIN SMALL LETTER D WITH HOOK
+0258 LATIN SMALL LETTER REVERSED E
+0259 LATIN SMALL LETTER SCHWA
+025a LATIN SMALL LETTER SCHWA WITH HOOK
+025b LATIN SMALL LETTER OPEN E
+025c LATIN SMALL LETTER REVERSED OPEN E
+025d LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025e LATIN SMALL LETTER CLOSED REVERSED OPEN E
+025f LATIN SMALL LETTER DOTLESS J WITH STROKE
+0260 LATIN SMALL LETTER G WITH HOOK
+0261 LATIN SMALL LETTER SCRIPT G
+0262 LATIN LETTER SMALL CAPITAL G
+0263 LATIN SMALL LETTER GAMMA
+0264 LATIN SMALL LETTER RAMS HORN
+0265 LATIN SMALL LETTER TURNED H
+0266 LATIN SMALL LETTER H WITH HOOK
+0267 LATIN SMALL LETTER HENG WITH HOOK
+0268 LATIN SMALL LETTER I WITH STROKE
+0269 LATIN SMALL LETTER IOTA
+026a LATIN LETTER SMALL CAPITAL I
+026b LATIN SMALL LETTER L WITH MIDDLE TILDE
+026c LATIN SMALL LETTER L WITH BELT
+026d LATIN SMALL LETTER L WITH RETROFLEX HOOK
+026e LATIN SMALL LETTER LEZH
+026f LATIN SMALL LETTER TURNED M
+0270 LATIN SMALL LETTER TURNED M WITH LONG LEG
+0271 LATIN SMALL LETTER M WITH HOOK
+0272 LATIN SMALL LETTER N WITH LEFT HOOK
+0273 LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0274 LATIN LETTER SMALL CAPITAL N
+0275 LATIN SMALL LETTER BARRED O
+0276 LATIN LETTER SMALL CAPITAL OE
+0277 LATIN SMALL LETTER CLOSED OMEGA
+0278 LATIN SMALL LETTER PHI
+0279 LATIN SMALL LETTER TURNED R
+027a LATIN SMALL LETTER TURNED R WITH LONG LEG
+027b LATIN SMALL LETTER TURNED R WITH HOOK
+027c LATIN SMALL LETTER R WITH LONG LEG
+027d LATIN SMALL LETTER R WITH TAIL
+027e LATIN SMALL LETTER R WITH FISHHOOK
+027f LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0280 LATIN LETTER SMALL CAPITAL R
+0281 LATIN LETTER SMALL CAPITAL INVERTED R
+0282 LATIN SMALL LETTER S WITH HOOK
+0283 LATIN SMALL LETTER ESH
+0284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+0285 LATIN SMALL LETTER SQUAT REVERSED ESH
+0286 LATIN SMALL LETTER ESH WITH CURL
+0287 LATIN SMALL LETTER TURNED T
+0288 LATIN SMALL LETTER T WITH RETROFLEX HOOK
+0289 LATIN SMALL LETTER U BAR
+028a LATIN SMALL LETTER UPSILON
+028b LATIN SMALL LETTER V WITH HOOK
+028c LATIN SMALL LETTER TURNED V
+028d LATIN SMALL LETTER TURNED W
+028e LATIN SMALL LETTER TURNED Y
+028f LATIN LETTER SMALL CAPITAL Y
+0290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291 LATIN SMALL LETTER Z WITH CURL
+0292 LATIN SMALL LETTER EZH
+0293 LATIN SMALL LETTER EZH WITH CURL
+0294 LATIN LETTER GLOTTAL STOP
+0295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+0296 LATIN LETTER INVERTED GLOTTAL STOP
+0297 LATIN LETTER STRETCHED C
+0298 LATIN LETTER BILABIAL CLICK
+0299 LATIN LETTER SMALL CAPITAL B
+029a LATIN SMALL LETTER CLOSED OPEN E
+029b LATIN LETTER SMALL CAPITAL G WITH HOOK
+029c LATIN LETTER SMALL CAPITAL H
+029d LATIN SMALL LETTER J WITH CROSSED-TAIL
+029e LATIN SMALL LETTER TURNED K
+029f LATIN LETTER SMALL CAPITAL L
+02a0 LATIN SMALL LETTER Q WITH HOOK
+02a1 LATIN LETTER GLOTTAL STOP WITH STROKE
+02a2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+02a3 LATIN SMALL LETTER DZ DIGRAPH
+02a4 LATIN SMALL LETTER DEZH DIGRAPH
+02a5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+02a6 LATIN SMALL LETTER TS DIGRAPH
+02a7 LATIN SMALL LETTER TESH DIGRAPH
+02a8 LATIN SMALL LETTER TC DIGRAPH WITH CURL
+02a9 LATIN SMALL LETTER FENG DIGRAPH
+02aa LATIN SMALL LETTER LS DIGRAPH
+02ab LATIN SMALL LETTER LZ DIGRAPH
+02ac LATIN LETTER BILABIAL PERCUSSIVE
+02ad LATIN LETTER BIDENTAL PERCUSSIVE
+02b0 MODIFIER LETTER SMALL H
+02b1 MODIFIER LETTER SMALL H WITH HOOK
+02b2 MODIFIER LETTER SMALL J
+02b3 MODIFIER LETTER SMALL R
+02b4 MODIFIER LETTER SMALL TURNED R
+02b5 MODIFIER LETTER SMALL TURNED R WITH HOOK
+02b6 MODIFIER LETTER SMALL CAPITAL INVERTED R
+02b7 MODIFIER LETTER SMALL W
+02b8 MODIFIER LETTER SMALL Y
+02b9 MODIFIER LETTER PRIME
+02ba MODIFIER LETTER DOUBLE PRIME
+02bb MODIFIER LETTER TURNED COMMA
+02bc MODIFIER LETTER APOSTROPHE
+02bd MODIFIER LETTER REVERSED COMMA
+02be MODIFIER LETTER RIGHT HALF RING
+02bf MODIFIER LETTER LEFT HALF RING
+02c0 MODIFIER LETTER GLOTTAL STOP
+02c1 MODIFIER LETTER REVERSED GLOTTAL STOP
+02c2 MODIFIER LETTER LEFT ARROWHEAD
+02c3 MODIFIER LETTER RIGHT ARROWHEAD
+02c4 MODIFIER LETTER UP ARROWHEAD
+02c5 MODIFIER LETTER DOWN ARROWHEAD
+02c6 MODIFIER LETTER CIRCUMFLEX ACCENT
+02c7 CARON
+02c8 MODIFIER LETTER VERTICAL LINE
+02c9 MODIFIER LETTER MACRON
+02ca MODIFIER LETTER ACUTE ACCENT
+02cb MODIFIER LETTER GRAVE ACCENT
+02cc MODIFIER LETTER LOW VERTICAL LINE
+02cd MODIFIER LETTER LOW MACRON
+02ce MODIFIER LETTER LOW GRAVE ACCENT
+02cf MODIFIER LETTER LOW ACUTE ACCENT
+02d0 MODIFIER LETTER TRIANGULAR COLON
+02d1 MODIFIER LETTER HALF TRIANGULAR COLON
+02d2 MODIFIER LETTER CENTRED RIGHT HALF RING
+02d3 MODIFIER LETTER CENTRED LEFT HALF RING
+02d4 MODIFIER LETTER UP TACK
+02d5 MODIFIER LETTER DOWN TACK
+02d6 MODIFIER LETTER PLUS SIGN
+02d7 MODIFIER LETTER MINUS SIGN
+02d8 BREVE
+02d9 DOT ABOVE
+02da RING ABOVE
+02db OGONEK
+02dc SMALL TILDE
+02dd DOUBLE ACUTE ACCENT
+02de MODIFIER LETTER RHOTIC HOOK
+02df MODIFIER LETTER CROSS ACCENT
+02e0 MODIFIER LETTER SMALL GAMMA
+02e1 MODIFIER LETTER SMALL L
+02e2 MODIFIER LETTER SMALL S
+02e3 MODIFIER LETTER SMALL X
+02e4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02e5 MODIFIER LETTER EXTRA-HIGH TONE BAR
+02e6 MODIFIER LETTER HIGH TONE BAR
+02e7 MODIFIER LETTER MID TONE BAR
+02e8 MODIFIER LETTER LOW TONE BAR
+02e9 MODIFIER LETTER EXTRA-LOW TONE BAR
+02ea MODIFIER LETTER YIN DEPARTING TONE MARK
+02eb MODIFIER LETTER YANG DEPARTING TONE MARK
+02ec MODIFIER LETTER VOICING
+02ed MODIFIER LETTER UNASPIRATED
+02ee MODIFIER LETTER DOUBLE APOSTROPHE
+0300 COMBINING GRAVE ACCENT
+0301 COMBINING ACUTE ACCENT
+0302 COMBINING CIRCUMFLEX ACCENT
+0303 COMBINING TILDE
+0304 COMBINING MACRON
+0305 COMBINING OVERLINE
+0306 COMBINING BREVE
+0307 COMBINING DOT ABOVE
+0308 COMBINING DIAERESIS
+0309 COMBINING HOOK ABOVE
+030a COMBINING RING ABOVE
+030b COMBINING DOUBLE ACUTE ACCENT
+030c COMBINING CARON
+030d COMBINING VERTICAL LINE ABOVE
+030e COMBINING DOUBLE VERTICAL LINE ABOVE
+030f COMBINING DOUBLE GRAVE ACCENT
+0310 COMBINING CANDRABINDU
+0311 COMBINING INVERTED BREVE
+0312 COMBINING TURNED COMMA ABOVE
+0313 COMBINING COMMA ABOVE
+0314 COMBINING REVERSED COMMA ABOVE
+0315 COMBINING COMMA ABOVE RIGHT
+0316 COMBINING GRAVE ACCENT BELOW
+0317 COMBINING ACUTE ACCENT BELOW
+0318 COMBINING LEFT TACK BELOW
+0319 COMBINING RIGHT TACK BELOW
+031a COMBINING LEFT ANGLE ABOVE
+031b COMBINING HORN
+031c COMBINING LEFT HALF RING BELOW
+031d COMBINING UP TACK BELOW
+031e COMBINING DOWN TACK BELOW
+031f COMBINING PLUS SIGN BELOW
+0320 COMBINING MINUS SIGN BELOW
+0321 COMBINING PALATALIZED HOOK BELOW
+0322 COMBINING RETROFLEX HOOK BELOW
+0323 COMBINING DOT BELOW
+0324 COMBINING DIAERESIS BELOW
+0325 COMBINING RING BELOW
+0326 COMBINING COMMA BELOW
+0327 COMBINING CEDILLA
+0328 COMBINING OGONEK
+0329 COMBINING VERTICAL LINE BELOW
+032a COMBINING BRIDGE BELOW
+032b COMBINING INVERTED DOUBLE ARCH BELOW
+032c COMBINING CARON BELOW
+032d COMBINING CIRCUMFLEX ACCENT BELOW
+032e COMBINING BREVE BELOW
+032f COMBINING INVERTED BREVE BELOW
+0330 COMBINING TILDE BELOW
+0331 COMBINING MACRON BELOW
+0332 COMBINING LOW LINE
+0333 COMBINING DOUBLE LOW LINE
+0334 COMBINING TILDE OVERLAY
+0335 COMBINING SHORT STROKE OVERLAY
+0336 COMBINING LONG STROKE OVERLAY
+0337 COMBINING SHORT SOLIDUS OVERLAY
+0338 COMBINING LONG SOLIDUS OVERLAY
+0339 COMBINING RIGHT HALF RING BELOW
+033a COMBINING INVERTED BRIDGE BELOW
+033b COMBINING SQUARE BELOW
+033c COMBINING SEAGULL BELOW
+033d COMBINING X ABOVE
+033e COMBINING VERTICAL TILDE
+033f COMBINING DOUBLE OVERLINE
+0340 COMBINING GRAVE TONE MARK
+0341 COMBINING ACUTE TONE MARK
+0342 COMBINING GREEK PERISPOMENI
+0343 COMBINING GREEK KORONIS
+0344 COMBINING GREEK DIALYTIKA TONOS
+0345 COMBINING GREEK YPOGEGRAMMENI
+0346 COMBINING BRIDGE ABOVE
+0347 COMBINING EQUALS SIGN BELOW
+0348 COMBINING DOUBLE VERTICAL LINE BELOW
+0349 COMBINING LEFT ANGLE BELOW
+034a COMBINING NOT TILDE ABOVE
+034b COMBINING HOMOTHETIC ABOVE
+034c COMBINING ALMOST EQUAL TO ABOVE
+034d COMBINING LEFT RIGHT ARROW BELOW
+034e COMBINING UPWARDS ARROW BELOW
+0360 COMBINING DOUBLE TILDE
+0361 COMBINING DOUBLE INVERTED BREVE
+0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0374 GREEK NUMERAL SIGN
+0375 GREEK LOWER NUMERAL SIGN
+037a GREEK YPOGEGRAMMENI
+037e GREEK QUESTION MARK
+0384 GREEK TONOS
+0385 GREEK DIALYTIKA TONOS
+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387 GREEK ANO TELEIA
+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389 GREEK CAPITAL LETTER ETA WITH TONOS
+038a GREEK CAPITAL LETTER IOTA WITH TONOS
+038c GREEK CAPITAL LETTER OMICRON WITH TONOS
+038e GREEK CAPITAL LETTER UPSILON WITH TONOS
+038f GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391 GREEK CAPITAL LETTER ALPHA
+0392 GREEK CAPITAL LETTER BETA
+0393 GREEK CAPITAL LETTER GAMMA
+0394 GREEK CAPITAL LETTER DELTA
+0395 GREEK CAPITAL LETTER EPSILON
+0396 GREEK CAPITAL LETTER ZETA
+0397 GREEK CAPITAL LETTER ETA
+0398 GREEK CAPITAL LETTER THETA
+0399 GREEK CAPITAL LETTER IOTA
+039a GREEK CAPITAL LETTER KAPPA
+039b GREEK CAPITAL LETTER LAMDA
+039c GREEK CAPITAL LETTER MU
+039d GREEK CAPITAL LETTER NU
+039e GREEK CAPITAL LETTER XI
+039f GREEK CAPITAL LETTER OMICRON
+03a0 GREEK CAPITAL LETTER PI
+03a1 GREEK CAPITAL LETTER RHO
+03a3 GREEK CAPITAL LETTER SIGMA
+03a4 GREEK CAPITAL LETTER TAU
+03a5 GREEK CAPITAL LETTER UPSILON
+03a6 GREEK CAPITAL LETTER PHI
+03a7 GREEK CAPITAL LETTER CHI
+03a8 GREEK CAPITAL LETTER PSI
+03a9 GREEK CAPITAL LETTER OMEGA
+03aa GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03ab GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03ac GREEK SMALL LETTER ALPHA WITH TONOS
+03ad GREEK SMALL LETTER EPSILON WITH TONOS
+03ae GREEK SMALL LETTER ETA WITH TONOS
+03af GREEK SMALL LETTER IOTA WITH TONOS
+03b0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03b1 GREEK SMALL LETTER ALPHA
+03b2 GREEK SMALL LETTER BETA
+03b3 GREEK SMALL LETTER GAMMA
+03b4 GREEK SMALL LETTER DELTA
+03b5 GREEK SMALL LETTER EPSILON
+03b6 GREEK SMALL LETTER ZETA
+03b7 GREEK SMALL LETTER ETA
+03b8 GREEK SMALL LETTER THETA
+03b9 GREEK SMALL LETTER IOTA
+03ba GREEK SMALL LETTER KAPPA
+03bb GREEK SMALL LETTER LAMDA
+03bc GREEK SMALL LETTER MU
+03bd GREEK SMALL LETTER NU
+03be GREEK SMALL LETTER XI
+03bf GREEK SMALL LETTER OMICRON
+03c0 GREEK SMALL LETTER PI
+03c1 GREEK SMALL LETTER RHO
+03c2 GREEK SMALL LETTER FINAL SIGMA
+03c3 GREEK SMALL LETTER SIGMA
+03c4 GREEK SMALL LETTER TAU
+03c5 GREEK SMALL LETTER UPSILON
+03c6 GREEK SMALL LETTER PHI
+03c7 GREEK SMALL LETTER CHI
+03c8 GREEK SMALL LETTER PSI
+03c9 GREEK SMALL LETTER OMEGA
+03ca GREEK SMALL LETTER IOTA WITH DIALYTIKA
+03cb GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+03cc GREEK SMALL LETTER OMICRON WITH TONOS
+03cd GREEK SMALL LETTER UPSILON WITH TONOS
+03ce GREEK SMALL LETTER OMEGA WITH TONOS
+03d0 GREEK BETA SYMBOL
+03d1 GREEK THETA SYMBOL
+03d2 GREEK UPSILON WITH HOOK SYMBOL
+03d3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+03d4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+03d5 GREEK PHI SYMBOL
+03d6 GREEK PI SYMBOL
+03d7 GREEK KAI SYMBOL
+03da GREEK LETTER STIGMA
+03db GREEK SMALL LETTER STIGMA
+03dc GREEK LETTER DIGAMMA
+03dd GREEK SMALL LETTER DIGAMMA
+03de GREEK LETTER KOPPA
+03df GREEK SMALL LETTER KOPPA
+03e0 GREEK LETTER SAMPI
+03e1 GREEK SMALL LETTER SAMPI
+03e2 COPTIC CAPITAL LETTER SHEI
+03e3 COPTIC SMALL LETTER SHEI
+03e4 COPTIC CAPITAL LETTER FEI
+03e5 COPTIC SMALL LETTER FEI
+03e6 COPTIC CAPITAL LETTER KHEI
+03e7 COPTIC SMALL LETTER KHEI
+03e8 COPTIC CAPITAL LETTER HORI
+03e9 COPTIC SMALL LETTER HORI
+03ea COPTIC CAPITAL LETTER GANGIA
+03eb COPTIC SMALL LETTER GANGIA
+03ec COPTIC CAPITAL LETTER SHIMA
+03ed COPTIC SMALL LETTER SHIMA
+03ee COPTIC CAPITAL LETTER DEI
+03ef COPTIC SMALL LETTER DEI
+03f0 GREEK KAPPA SYMBOL
+03f1 GREEK RHO SYMBOL
+03f2 GREEK LUNATE SIGMA SYMBOL
+03f3 GREEK LETTER YOT
+0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401 CYRILLIC CAPITAL LETTER IO
+0402 CYRILLIC CAPITAL LETTER DJE
+0403 CYRILLIC CAPITAL LETTER GJE
+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405 CYRILLIC CAPITAL LETTER DZE
+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407 CYRILLIC CAPITAL LETTER YI
+0408 CYRILLIC CAPITAL LETTER JE
+0409 CYRILLIC CAPITAL LETTER LJE
+040a CYRILLIC CAPITAL LETTER NJE
+040b CYRILLIC CAPITAL LETTER TSHE
+040c CYRILLIC CAPITAL LETTER KJE
+040d CYRILLIC CAPITAL LETTER I WITH GRAVE
+040e CYRILLIC CAPITAL LETTER SHORT U
+040f CYRILLIC CAPITAL LETTER DZHE
+0410 CYRILLIC CAPITAL LETTER A
+0411 CYRILLIC CAPITAL LETTER BE
+0412 CYRILLIC CAPITAL LETTER VE
+0413 CYRILLIC CAPITAL LETTER GHE
+0414 CYRILLIC CAPITAL LETTER DE
+0415 CYRILLIC CAPITAL LETTER IE
+0416 CYRILLIC CAPITAL LETTER ZHE
+0417 CYRILLIC CAPITAL LETTER ZE
+0418 CYRILLIC CAPITAL LETTER I
+0419 CYRILLIC CAPITAL LETTER SHORT I
+041a CYRILLIC CAPITAL LETTER KA
+041b CYRILLIC CAPITAL LETTER EL
+041c CYRILLIC CAPITAL LETTER EM
+041d CYRILLIC CAPITAL LETTER EN
+041e CYRILLIC CAPITAL LETTER O
+041f CYRILLIC CAPITAL LETTER PE
+0420 CYRILLIC CAPITAL LETTER ER
+0421 CYRILLIC CAPITAL LETTER ES
+0422 CYRILLIC CAPITAL LETTER TE
+0423 CYRILLIC CAPITAL LETTER U
+0424 CYRILLIC CAPITAL LETTER EF
+0425 CYRILLIC CAPITAL LETTER HA
+0426 CYRILLIC CAPITAL LETTER TSE
+0427 CYRILLIC CAPITAL LETTER CHE
+0428 CYRILLIC CAPITAL LETTER SHA
+0429 CYRILLIC CAPITAL LETTER SHCHA
+042a CYRILLIC CAPITAL LETTER HARD SIGN
+042b CYRILLIC CAPITAL LETTER YERU
+042c CYRILLIC CAPITAL LETTER SOFT SIGN
+042d CYRILLIC CAPITAL LETTER E
+042e CYRILLIC CAPITAL LETTER YU
+042f CYRILLIC CAPITAL LETTER YA
+0430 CYRILLIC SMALL LETTER A
+0431 CYRILLIC SMALL LETTER BE
+0432 CYRILLIC SMALL LETTER VE
+0433 CYRILLIC SMALL LETTER GHE
+0434 CYRILLIC SMALL LETTER DE
+0435 CYRILLIC SMALL LETTER IE
+0436 CYRILLIC SMALL LETTER ZHE
+0437 CYRILLIC SMALL LETTER ZE
+0438 CYRILLIC SMALL LETTER I
+0439 CYRILLIC SMALL LETTER SHORT I
+043a CYRILLIC SMALL LETTER KA
+043b CYRILLIC SMALL LETTER EL
+043c CYRILLIC SMALL LETTER EM
+043d CYRILLIC SMALL LETTER EN
+043e CYRILLIC SMALL LETTER O
+043f CYRILLIC SMALL LETTER PE
+0440 CYRILLIC SMALL LETTER ER
+0441 CYRILLIC SMALL LETTER ES
+0442 CYRILLIC SMALL LETTER TE
+0443 CYRILLIC SMALL LETTER U
+0444 CYRILLIC SMALL LETTER EF
+0445 CYRILLIC SMALL LETTER HA
+0446 CYRILLIC SMALL LETTER TSE
+0447 CYRILLIC SMALL LETTER CHE
+0448 CYRILLIC SMALL LETTER SHA
+0449 CYRILLIC SMALL LETTER SHCHA
+044a CYRILLIC SMALL LETTER HARD SIGN
+044b CYRILLIC SMALL LETTER YERU
+044c CYRILLIC SMALL LETTER SOFT SIGN
+044d CYRILLIC SMALL LETTER E
+044e CYRILLIC SMALL LETTER YU
+044f CYRILLIC SMALL LETTER YA
+0450 CYRILLIC SMALL LETTER IE WITH GRAVE
+0451 CYRILLIC SMALL LETTER IO
+0452 CYRILLIC SMALL LETTER DJE
+0453 CYRILLIC SMALL LETTER GJE
+0454 CYRILLIC SMALL LETTER UKRAINIAN IE
+0455 CYRILLIC SMALL LETTER DZE
+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0457 CYRILLIC SMALL LETTER YI
+0458 CYRILLIC SMALL LETTER JE
+0459 CYRILLIC SMALL LETTER LJE
+045a CYRILLIC SMALL LETTER NJE
+045b CYRILLIC SMALL LETTER TSHE
+045c CYRILLIC SMALL LETTER KJE
+045d CYRILLIC SMALL LETTER I WITH GRAVE
+045e CYRILLIC SMALL LETTER SHORT U
+045f CYRILLIC SMALL LETTER DZHE
+0460 CYRILLIC CAPITAL LETTER OMEGA
+0461 CYRILLIC SMALL LETTER OMEGA
+0462 CYRILLIC CAPITAL LETTER YAT
+0463 CYRILLIC SMALL LETTER YAT
+0464 CYRILLIC CAPITAL LETTER IOTIFIED E
+0465 CYRILLIC SMALL LETTER IOTIFIED E
+0466 CYRILLIC CAPITAL LETTER LITTLE YUS
+0467 CYRILLIC SMALL LETTER LITTLE YUS
+0468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046a CYRILLIC CAPITAL LETTER BIG YUS
+046b CYRILLIC SMALL LETTER BIG YUS
+046c CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046d CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046e CYRILLIC CAPITAL LETTER KSI
+046f CYRILLIC SMALL LETTER KSI
+0470 CYRILLIC CAPITAL LETTER PSI
+0471 CYRILLIC SMALL LETTER PSI
+0472 CYRILLIC CAPITAL LETTER FITA
+0473 CYRILLIC SMALL LETTER FITA
+0474 CYRILLIC CAPITAL LETTER IZHITSA
+0475 CYRILLIC SMALL LETTER IZHITSA
+0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478 CYRILLIC CAPITAL LETTER UK
+0479 CYRILLIC SMALL LETTER UK
+047a CYRILLIC CAPITAL LETTER ROUND OMEGA
+047b CYRILLIC SMALL LETTER ROUND OMEGA
+047c CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047d CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047e CYRILLIC CAPITAL LETTER OT
+047f CYRILLIC SMALL LETTER OT
+0480 CYRILLIC CAPITAL LETTER KOPPA
+0481 CYRILLIC SMALL LETTER KOPPA
+0482 CYRILLIC THOUSANDS SIGN
+0483 COMBINING CYRILLIC TITLO
+0484 COMBINING CYRILLIC PALATALIZATION
+0485 COMBINING CYRILLIC DASIA PNEUMATA
+0486 COMBINING CYRILLIC PSILI PNEUMATA
+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489 COMBINING CYRILLIC MILLIONS SIGN
+048c CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048d CYRILLIC SMALL LETTER SEMISOFT SIGN
+048e CYRILLIC CAPITAL LETTER ER WITH TICK
+048f CYRILLIC SMALL LETTER ER WITH TICK
+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493 CYRILLIC SMALL LETTER GHE WITH STROKE
+0494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499 CYRILLIC SMALL LETTER ZE WITH DESCENDER
+049a CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049b CYRILLIC SMALL LETTER KA WITH DESCENDER
+049c CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049d CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049e CYRILLIC CAPITAL LETTER KA WITH STROKE
+049f CYRILLIC SMALL LETTER KA WITH STROKE
+04a0 CYRILLIC CAPITAL LETTER BASHKIR KA
+04a1 CYRILLIC SMALL LETTER BASHKIR KA
+04a2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04a3 CYRILLIC SMALL LETTER EN WITH DESCENDER
+04a4 CYRILLIC CAPITAL LIGATURE EN GHE
+04a5 CYRILLIC SMALL LIGATURE EN GHE
+04a6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04a7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04a8 CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04a9 CYRILLIC SMALL LETTER ABKHASIAN HA
+04aa CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04ab CYRILLIC SMALL LETTER ES WITH DESCENDER
+04ac CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04ad CYRILLIC SMALL LETTER TE WITH DESCENDER
+04ae CYRILLIC CAPITAL LETTER STRAIGHT U
+04af CYRILLIC SMALL LETTER STRAIGHT U
+04b0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04b1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04b2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04b3 CYRILLIC SMALL LETTER HA WITH DESCENDER
+04b4 CYRILLIC CAPITAL LIGATURE TE TSE
+04b5 CYRILLIC SMALL LIGATURE TE TSE
+04b6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04b7 CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04b8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04b9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04ba CYRILLIC CAPITAL LETTER SHHA
+04bb CYRILLIC SMALL LETTER SHHA
+04bc CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04bd CYRILLIC SMALL LETTER ABKHASIAN CHE
+04be CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04bf CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04c0 CYRILLIC LETTER PALOCHKA
+04c1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04c2 CYRILLIC SMALL LETTER ZHE WITH BREVE
+04c3 CYRILLIC CAPITAL LETTER KA WITH HOOK
+04c4 CYRILLIC SMALL LETTER KA WITH HOOK
+04c7 CYRILLIC CAPITAL LETTER EN WITH HOOK
+04c8 CYRILLIC SMALL LETTER EN WITH HOOK
+04cb CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04cc CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04d0 CYRILLIC CAPITAL LETTER A WITH BREVE
+04d1 CYRILLIC SMALL LETTER A WITH BREVE
+04d2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04d3 CYRILLIC SMALL LETTER A WITH DIAERESIS
+04d4 CYRILLIC CAPITAL LIGATURE A IE
+04d5 CYRILLIC SMALL LIGATURE A IE
+04d6 CYRILLIC CAPITAL LETTER IE WITH BREVE
+04d7 CYRILLIC SMALL LETTER IE WITH BREVE
+04d8 CYRILLIC CAPITAL LETTER SCHWA
+04d9 CYRILLIC SMALL LETTER SCHWA
+04da CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04db CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04dc CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04dd CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04de CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04df CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04e0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04e1 CYRILLIC SMALL LETTER ABKHASIAN DZE
+04e2 CYRILLIC CAPITAL LETTER I WITH MACRON
+04e3 CYRILLIC SMALL LETTER I WITH MACRON
+04e4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04e5 CYRILLIC SMALL LETTER I WITH DIAERESIS
+04e6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04e7 CYRILLIC SMALL LETTER O WITH DIAERESIS
+04e8 CYRILLIC CAPITAL LETTER BARRED O
+04e9 CYRILLIC SMALL LETTER BARRED O
+04ea CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04eb CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04ec CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04ed CYRILLIC SMALL LETTER E WITH DIAERESIS
+04ee CYRILLIC CAPITAL LETTER U WITH MACRON
+04ef CYRILLIC SMALL LETTER U WITH MACRON
+04f0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04f1 CYRILLIC SMALL LETTER U WITH DIAERESIS
+04f2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04f3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04f4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04f5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04f8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+04f9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0531 ARMENIAN CAPITAL LETTER AYB
+0532 ARMENIAN CAPITAL LETTER BEN
+0533 ARMENIAN CAPITAL LETTER GIM
+0534 ARMENIAN CAPITAL LETTER DA
+0535 ARMENIAN CAPITAL LETTER ECH
+0536 ARMENIAN CAPITAL LETTER ZA
+0537 ARMENIAN CAPITAL LETTER EH
+0538 ARMENIAN CAPITAL LETTER ET
+0539 ARMENIAN CAPITAL LETTER TO
+053a ARMENIAN CAPITAL LETTER ZHE
+053b ARMENIAN CAPITAL LETTER INI
+053c ARMENIAN CAPITAL LETTER LIWN
+053d ARMENIAN CAPITAL LETTER XEH
+053e ARMENIAN CAPITAL LETTER CA
+053f ARMENIAN CAPITAL LETTER KEN
+0540 ARMENIAN CAPITAL LETTER HO
+0541 ARMENIAN CAPITAL LETTER JA
+0542 ARMENIAN CAPITAL LETTER GHAD
+0543 ARMENIAN CAPITAL LETTER CHEH
+0544 ARMENIAN CAPITAL LETTER MEN
+0545 ARMENIAN CAPITAL LETTER YI
+0546 ARMENIAN CAPITAL LETTER NOW
+0547 ARMENIAN CAPITAL LETTER SHA
+0548 ARMENIAN CAPITAL LETTER VO
+0549 ARMENIAN CAPITAL LETTER CHA
+054a ARMENIAN CAPITAL LETTER PEH
+054b ARMENIAN CAPITAL LETTER JHEH
+054c ARMENIAN CAPITAL LETTER RA
+054d ARMENIAN CAPITAL LETTER SEH
+054e ARMENIAN CAPITAL LETTER VEW
+054f ARMENIAN CAPITAL LETTER TIWN
+0550 ARMENIAN CAPITAL LETTER REH
+0551 ARMENIAN CAPITAL LETTER CO
+0552 ARMENIAN CAPITAL LETTER YIWN
+0553 ARMENIAN CAPITAL LETTER PIWR
+0554 ARMENIAN CAPITAL LETTER KEH
+0555 ARMENIAN CAPITAL LETTER OH
+0556 ARMENIAN CAPITAL LETTER FEH
+0559 ARMENIAN MODIFIER LETTER LEFT HALF RING
+055a ARMENIAN APOSTROPHE
+055b ARMENIAN EMPHASIS MARK
+055c ARMENIAN EXCLAMATION MARK
+055d ARMENIAN COMMA
+055e ARMENIAN QUESTION MARK
+055f ARMENIAN ABBREVIATION MARK
+0561 ARMENIAN SMALL LETTER AYB
+0562 ARMENIAN SMALL LETTER BEN
+0563 ARMENIAN SMALL LETTER GIM
+0564 ARMENIAN SMALL LETTER DA
+0565 ARMENIAN SMALL LETTER ECH
+0566 ARMENIAN SMALL LETTER ZA
+0567 ARMENIAN SMALL LETTER EH
+0568 ARMENIAN SMALL LETTER ET
+0569 ARMENIAN SMALL LETTER TO
+056a ARMENIAN SMALL LETTER ZHE
+056b ARMENIAN SMALL LETTER INI
+056c ARMENIAN SMALL LETTER LIWN
+056d ARMENIAN SMALL LETTER XEH
+056e ARMENIAN SMALL LETTER CA
+056f ARMENIAN SMALL LETTER KEN
+0570 ARMENIAN SMALL LETTER HO
+0571 ARMENIAN SMALL LETTER JA
+0572 ARMENIAN SMALL LETTER GHAD
+0573 ARMENIAN SMALL LETTER CHEH
+0574 ARMENIAN SMALL LETTER MEN
+0575 ARMENIAN SMALL LETTER YI
+0576 ARMENIAN SMALL LETTER NOW
+0577 ARMENIAN SMALL LETTER SHA
+0578 ARMENIAN SMALL LETTER VO
+0579 ARMENIAN SMALL LETTER CHA
+057a ARMENIAN SMALL LETTER PEH
+057b ARMENIAN SMALL LETTER JHEH
+057c ARMENIAN SMALL LETTER RA
+057d ARMENIAN SMALL LETTER SEH
+057e ARMENIAN SMALL LETTER VEW
+057f ARMENIAN SMALL LETTER TIWN
+0580 ARMENIAN SMALL LETTER REH
+0581 ARMENIAN SMALL LETTER CO
+0582 ARMENIAN SMALL LETTER YIWN
+0583 ARMENIAN SMALL LETTER PIWR
+0584 ARMENIAN SMALL LETTER KEH
+0585 ARMENIAN SMALL LETTER OH
+0586 ARMENIAN SMALL LETTER FEH
+0587 ARMENIAN SMALL LIGATURE ECH YIWN
+0589 ARMENIAN FULL STOP
+058a ARMENIAN HYPHEN
+0591 HEBREW ACCENT ETNAHTA
+0592 HEBREW ACCENT SEGOL
+0593 HEBREW ACCENT SHALSHELET
+0594 HEBREW ACCENT ZAQEF QATAN
+0595 HEBREW ACCENT ZAQEF GADOL
+0596 HEBREW ACCENT TIPEHA
+0597 HEBREW ACCENT REVIA
+0598 HEBREW ACCENT ZARQA
+0599 HEBREW ACCENT PASHTA
+059a HEBREW ACCENT YETIV
+059b HEBREW ACCENT TEVIR
+059c HEBREW ACCENT GERESH
+059d HEBREW ACCENT GERESH MUQDAM
+059e HEBREW ACCENT GERSHAYIM
+059f HEBREW ACCENT QARNEY PARA
+05a0 HEBREW ACCENT TELISHA GEDOLA
+05a1 HEBREW ACCENT PAZER
+05a3 HEBREW ACCENT MUNAH
+05a4 HEBREW ACCENT MAHAPAKH
+05a5 HEBREW ACCENT MERKHA
+05a6 HEBREW ACCENT MERKHA KEFULA
+05a7 HEBREW ACCENT DARGA
+05a8 HEBREW ACCENT QADMA
+05a9 HEBREW ACCENT TELISHA QETANA
+05aa HEBREW ACCENT YERAH BEN YOMO
+05ab HEBREW ACCENT OLE
+05ac HEBREW ACCENT ILUY
+05ad HEBREW ACCENT DEHI
+05ae HEBREW ACCENT ZINOR
+05af HEBREW MARK MASORA CIRCLE
+05b0 HEBREW POINT SHEVA
+05b1 HEBREW POINT HATAF SEGOL
+05b2 HEBREW POINT HATAF PATAH
+05b3 HEBREW POINT HATAF QAMATS
+05b4 HEBREW POINT HIRIQ
+05b5 HEBREW POINT TSERE
+05b6 HEBREW POINT SEGOL
+05b7 HEBREW POINT PATAH
+05b8 HEBREW POINT QAMATS
+05b9 HEBREW POINT HOLAM
+05bb HEBREW POINT QUBUTS
+05bc HEBREW POINT DAGESH OR MAPIQ
+05bd HEBREW POINT METEG
+05be HEBREW PUNCTUATION MAQAF
+05bf HEBREW POINT RAFE
+05c0 HEBREW PUNCTUATION PASEQ
+05c1 HEBREW POINT SHIN DOT
+05c2 HEBREW POINT SIN DOT
+05c3 HEBREW PUNCTUATION SOF PASUQ
+05c4 HEBREW MARK UPPER DOT
+05d0 HEBREW LETTER ALEF
+05d1 HEBREW LETTER BET
+05d2 HEBREW LETTER GIMEL
+05d3 HEBREW LETTER DALET
+05d4 HEBREW LETTER HE
+05d5 HEBREW LETTER VAV
+05d6 HEBREW LETTER ZAYIN
+05d7 HEBREW LETTER HET
+05d8 HEBREW LETTER TET
+05d9 HEBREW LETTER YOD
+05da HEBREW LETTER FINAL KAF
+05db HEBREW LETTER KAF
+05dc HEBREW LETTER LAMED
+05dd HEBREW LETTER FINAL MEM
+05de HEBREW LETTER MEM
+05df HEBREW LETTER FINAL NUN
+05e0 HEBREW LETTER NUN
+05e1 HEBREW LETTER SAMEKH
+05e2 HEBREW LETTER AYIN
+05e3 HEBREW LETTER FINAL PE
+05e4 HEBREW LETTER PE
+05e5 HEBREW LETTER FINAL TSADI
+05e6 HEBREW LETTER TSADI
+05e7 HEBREW LETTER QOF
+05e8 HEBREW LETTER RESH
+05e9 HEBREW LETTER SHIN
+05ea HEBREW LETTER TAV
+05f0 HEBREW LIGATURE YIDDISH DOUBLE VAV
+05f1 HEBREW LIGATURE YIDDISH VAV YOD
+05f2 HEBREW LIGATURE YIDDISH DOUBLE YOD
+05f3 HEBREW PUNCTUATION GERESH
+05f4 HEBREW PUNCTUATION GERSHAYIM
+060c ARABIC COMMA
+061b ARABIC SEMICOLON
+061f ARABIC QUESTION MARK
+0621 ARABIC LETTER HAMZA
+0622 ARABIC LETTER ALEF WITH MADDA ABOVE
+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
+0624 ARABIC LETTER WAW WITH HAMZA ABOVE
+0625 ARABIC LETTER ALEF WITH HAMZA BELOW
+0626 ARABIC LETTER YEH WITH HAMZA ABOVE
+0627 ARABIC LETTER ALEF
+0628 ARABIC LETTER BEH
+0629 ARABIC LETTER TEH MARBUTA
+062a ARABIC LETTER TEH
+062b ARABIC LETTER THEH
+062c ARABIC LETTER JEEM
+062d ARABIC LETTER HAH
+062e ARABIC LETTER KHAH
+062f ARABIC LETTER DAL
+0630 ARABIC LETTER THAL
+0631 ARABIC LETTER REH
+0632 ARABIC LETTER ZAIN
+0633 ARABIC LETTER SEEN
+0634 ARABIC LETTER SHEEN
+0635 ARABIC LETTER SAD
+0636 ARABIC LETTER DAD
+0637 ARABIC LETTER TAH
+0638 ARABIC LETTER ZAH
+0639 ARABIC LETTER AIN
+063a ARABIC LETTER GHAIN
+0640 ARABIC TATWEEL
+0641 ARABIC LETTER FEH
+0642 ARABIC LETTER QAF
+0643 ARABIC LETTER KAF
+0644 ARABIC LETTER LAM
+0645 ARABIC LETTER MEEM
+0646 ARABIC LETTER NOON
+0647 ARABIC LETTER HEH
+0648 ARABIC LETTER WAW
+0649 ARABIC LETTER ALEF MAKSURA
+064a ARABIC LETTER YEH
+064b ARABIC FATHATAN
+064c ARABIC DAMMATAN
+064d ARABIC KASRATAN
+064e ARABIC FATHA
+064f ARABIC DAMMA
+0650 ARABIC KASRA
+0651 ARABIC SHADDA
+0652 ARABIC SUKUN
+0653 ARABIC MADDAH ABOVE
+0654 ARABIC HAMZA ABOVE
+0655 ARABIC HAMZA BELOW
+0660 ARABIC-INDIC DIGIT ZERO
+0661 ARABIC-INDIC DIGIT ONE
+0662 ARABIC-INDIC DIGIT TWO
+0663 ARABIC-INDIC DIGIT THREE
+0664 ARABIC-INDIC DIGIT FOUR
+0665 ARABIC-INDIC DIGIT FIVE
+0666 ARABIC-INDIC DIGIT SIX
+0667 ARABIC-INDIC DIGIT SEVEN
+0668 ARABIC-INDIC DIGIT EIGHT
+0669 ARABIC-INDIC DIGIT NINE
+066a ARABIC PERCENT SIGN
+066b ARABIC DECIMAL SEPARATOR
+066c ARABIC THOUSANDS SEPARATOR
+066d ARABIC FIVE POINTED STAR
+0670 ARABIC LETTER SUPERSCRIPT ALEF
+0671 ARABIC LETTER ALEF WASLA
+0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0674 ARABIC LETTER HIGH HAMZA
+0675 ARABIC LETTER HIGH HAMZA ALEF
+0676 ARABIC LETTER HIGH HAMZA WAW
+0677 ARABIC LETTER U WITH HAMZA ABOVE
+0678 ARABIC LETTER HIGH HAMZA YEH
+0679 ARABIC LETTER TTEH
+067a ARABIC LETTER TTEHEH
+067b ARABIC LETTER BEEH
+067c ARABIC LETTER TEH WITH RING
+067d ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067e ARABIC LETTER PEH
+067f ARABIC LETTER TEHEH
+0680 ARABIC LETTER BEHEH
+0681 ARABIC LETTER HAH WITH HAMZA ABOVE
+0682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0683 ARABIC LETTER NYEH
+0684 ARABIC LETTER DYEH
+0685 ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0686 ARABIC LETTER TCHEH
+0687 ARABIC LETTER TCHEHEH
+0688 ARABIC LETTER DDAL
+0689 ARABIC LETTER DAL WITH RING
+068a ARABIC LETTER DAL WITH DOT BELOW
+068b ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068c ARABIC LETTER DAHAL
+068d ARABIC LETTER DDAHAL
+068e ARABIC LETTER DUL
+068f ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+0691 ARABIC LETTER RREH
+0692 ARABIC LETTER REH WITH SMALL V
+0693 ARABIC LETTER REH WITH RING
+0694 ARABIC LETTER REH WITH DOT BELOW
+0695 ARABIC LETTER REH WITH SMALL V BELOW
+0696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697 ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698 ARABIC LETTER JEH
+0699 ARABIC LETTER REH WITH FOUR DOTS ABOVE
+069a ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069b ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069c ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+069d ARABIC LETTER SAD WITH TWO DOTS BELOW
+069e ARABIC LETTER SAD WITH THREE DOTS ABOVE
+069f ARABIC LETTER TAH WITH THREE DOTS ABOVE
+06a0 ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06a1 ARABIC LETTER DOTLESS FEH
+06a2 ARABIC LETTER FEH WITH DOT MOVED BELOW
+06a3 ARABIC LETTER FEH WITH DOT BELOW
+06a4 ARABIC LETTER VEH
+06a5 ARABIC LETTER FEH WITH THREE DOTS BELOW
+06a6 ARABIC LETTER PEHEH
+06a7 ARABIC LETTER QAF WITH DOT ABOVE
+06a8 ARABIC LETTER QAF WITH THREE DOTS ABOVE
+06a9 ARABIC LETTER KEHEH
+06aa ARABIC LETTER SWASH KAF
+06ab ARABIC LETTER KAF WITH RING
+06ac ARABIC LETTER KAF WITH DOT ABOVE
+06ad ARABIC LETTER NG
+06ae ARABIC LETTER KAF WITH THREE DOTS BELOW
+06af ARABIC LETTER GAF
+06b0 ARABIC LETTER GAF WITH RING
+06b1 ARABIC LETTER NGOEH
+06b2 ARABIC LETTER GAF WITH TWO DOTS BELOW
+06b3 ARABIC LETTER GUEH
+06b4 ARABIC LETTER GAF WITH THREE DOTS ABOVE
+06b5 ARABIC LETTER LAM WITH SMALL V
+06b6 ARABIC LETTER LAM WITH DOT ABOVE
+06b7 ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06b8 ARABIC LETTER LAM WITH THREE DOTS BELOW
+06b9 ARABIC LETTER NOON WITH DOT BELOW
+06ba ARABIC LETTER NOON GHUNNA
+06bb ARABIC LETTER RNOON
+06bc ARABIC LETTER NOON WITH RING
+06bd ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06be ARABIC LETTER HEH DOACHASHMEE
+06bf ARABIC LETTER TCHEH WITH DOT ABOVE
+06c0 ARABIC LETTER HEH WITH YEH ABOVE
+06c1 ARABIC LETTER HEH GOAL
+06c2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06c3 ARABIC LETTER TEH MARBUTA GOAL
+06c4 ARABIC LETTER WAW WITH RING
+06c5 ARABIC LETTER KIRGHIZ OE
+06c6 ARABIC LETTER OE
+06c7 ARABIC LETTER U
+06c8 ARABIC LETTER YU
+06c9 ARABIC LETTER KIRGHIZ YU
+06ca ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06cb ARABIC LETTER VE
+06cc ARABIC LETTER FARSI YEH
+06cd ARABIC LETTER YEH WITH TAIL
+06ce ARABIC LETTER YEH WITH SMALL V
+06cf ARABIC LETTER WAW WITH DOT ABOVE
+06d0 ARABIC LETTER E
+06d1 ARABIC LETTER YEH WITH THREE DOTS BELOW
+06d2 ARABIC LETTER YEH BARREE
+06d3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06d4 ARABIC FULL STOP
+06d5 ARABIC LETTER AE
+06d6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06d7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06d8 ARABIC SMALL HIGH MEEM INITIAL FORM
+06d9 ARABIC SMALL HIGH LAM ALEF
+06da ARABIC SMALL HIGH JEEM
+06db ARABIC SMALL HIGH THREE DOTS
+06dc ARABIC SMALL HIGH SEEN
+06dd ARABIC END OF AYAH
+06de ARABIC START OF RUB EL HIZB
+06df ARABIC SMALL HIGH ROUNDED ZERO
+06e0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06e1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06e2 ARABIC SMALL HIGH MEEM ISOLATED FORM
+06e3 ARABIC SMALL LOW SEEN
+06e4 ARABIC SMALL HIGH MADDA
+06e5 ARABIC SMALL WAW
+06e6 ARABIC SMALL YEH
+06e7 ARABIC SMALL HIGH YEH
+06e8 ARABIC SMALL HIGH NOON
+06e9 ARABIC PLACE OF SAJDAH
+06ea ARABIC EMPTY CENTRE LOW STOP
+06eb ARABIC EMPTY CENTRE HIGH STOP
+06ec ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ed ARABIC SMALL LOW MEEM
+06f0 EXTENDED ARABIC-INDIC DIGIT ZERO
+06f1 EXTENDED ARABIC-INDIC DIGIT ONE
+06f2 EXTENDED ARABIC-INDIC DIGIT TWO
+06f3 EXTENDED ARABIC-INDIC DIGIT THREE
+06f4 EXTENDED ARABIC-INDIC DIGIT FOUR
+06f5 EXTENDED ARABIC-INDIC DIGIT FIVE
+06f6 EXTENDED ARABIC-INDIC DIGIT SIX
+06f7 EXTENDED ARABIC-INDIC DIGIT SEVEN
+06f8 EXTENDED ARABIC-INDIC DIGIT EIGHT
+06f9 EXTENDED ARABIC-INDIC DIGIT NINE
+06fa ARABIC LETTER SHEEN WITH DOT BELOW
+06fb ARABIC LETTER DAD WITH DOT BELOW
+06fc ARABIC LETTER GHAIN WITH DOT BELOW
+06fd ARABIC SIGN SINDHI AMPERSAND
+06fe ARABIC SIGN SINDHI POSTPOSITION MEN
+0700 SYRIAC END OF PARAGRAPH
+0701 SYRIAC SUPRALINEAR FULL STOP
+0702 SYRIAC SUBLINEAR FULL STOP
+0703 SYRIAC SUPRALINEAR COLON
+0704 SYRIAC SUBLINEAR COLON
+0705 SYRIAC HORIZONTAL COLON
+0706 SYRIAC COLON SKEWED LEFT
+0707 SYRIAC COLON SKEWED RIGHT
+0708 SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709 SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070a SYRIAC CONTRACTION
+070b SYRIAC HARKLEAN OBELUS
+070c SYRIAC HARKLEAN METOBELUS
+070d SYRIAC HARKLEAN ASTERISCUS
+070f SYRIAC ABBREVIATION MARK
+0710 SYRIAC LETTER ALAPH
+0711 SYRIAC LETTER SUPERSCRIPT ALAPH
+0712 SYRIAC LETTER BETH
+0713 SYRIAC LETTER GAMAL
+0714 SYRIAC LETTER GAMAL GARSHUNI
+0715 SYRIAC LETTER DALATH
+0716 SYRIAC LETTER DOTLESS DALATH RISH
+0717 SYRIAC LETTER HE
+0718 SYRIAC LETTER WAW
+0719 SYRIAC LETTER ZAIN
+071a SYRIAC LETTER HETH
+071b SYRIAC LETTER TETH
+071c SYRIAC LETTER TETH GARSHUNI
+071d SYRIAC LETTER YUDH
+071e SYRIAC LETTER YUDH HE
+071f SYRIAC LETTER KAPH
+0720 SYRIAC LETTER LAMADH
+0721 SYRIAC LETTER MIM
+0722 SYRIAC LETTER NUN
+0723 SYRIAC LETTER SEMKATH
+0724 SYRIAC LETTER FINAL SEMKATH
+0725 SYRIAC LETTER E
+0726 SYRIAC LETTER PE
+0727 SYRIAC LETTER REVERSED PE
+0728 SYRIAC LETTER SADHE
+0729 SYRIAC LETTER QAPH
+072a SYRIAC LETTER RISH
+072b SYRIAC LETTER SHIN
+072c SYRIAC LETTER TAW
+0730 SYRIAC PTHAHA ABOVE
+0731 SYRIAC PTHAHA BELOW
+0732 SYRIAC PTHAHA DOTTED
+0733 SYRIAC ZQAPHA ABOVE
+0734 SYRIAC ZQAPHA BELOW
+0735 SYRIAC ZQAPHA DOTTED
+0736 SYRIAC RBASA ABOVE
+0737 SYRIAC RBASA BELOW
+0738 SYRIAC DOTTED ZLAMA HORIZONTAL
+0739 SYRIAC DOTTED ZLAMA ANGULAR
+073a SYRIAC HBASA ABOVE
+073b SYRIAC HBASA BELOW
+073c SYRIAC HBASA-ESASA DOTTED
+073d SYRIAC ESASA ABOVE
+073e SYRIAC ESASA BELOW
+073f SYRIAC RWAHA
+0740 SYRIAC FEMININE DOT
+0741 SYRIAC QUSHSHAYA
+0742 SYRIAC RUKKAKHA
+0743 SYRIAC TWO VERTICAL DOTS ABOVE
+0744 SYRIAC TWO VERTICAL DOTS BELOW
+0745 SYRIAC THREE DOTS ABOVE
+0746 SYRIAC THREE DOTS BELOW
+0747 SYRIAC OBLIQUE LINE ABOVE
+0748 SYRIAC OBLIQUE LINE BELOW
+0749 SYRIAC MUSIC
+074a SYRIAC BARREKH
+0780 THAANA LETTER HAA
+0781 THAANA LETTER SHAVIYANI
+0782 THAANA LETTER NOONU
+0783 THAANA LETTER RAA
+0784 THAANA LETTER BAA
+0785 THAANA LETTER LHAVIYANI
+0786 THAANA LETTER KAAFU
+0787 THAANA LETTER ALIFU
+0788 THAANA LETTER VAAVU
+0789 THAANA LETTER MEEMU
+078a THAANA LETTER FAAFU
+078b THAANA LETTER DHAALU
+078c THAANA LETTER THAA
+078d THAANA LETTER LAAMU
+078e THAANA LETTER GAAFU
+078f THAANA LETTER GNAVIYANI
+0790 THAANA LETTER SEENU
+0791 THAANA LETTER DAVIYANI
+0792 THAANA LETTER ZAVIYANI
+0793 THAANA LETTER TAVIYANI
+0794 THAANA LETTER YAA
+0795 THAANA LETTER PAVIYANI
+0796 THAANA LETTER JAVIYANI
+0797 THAANA LETTER CHAVIYANI
+0798 THAANA LETTER TTAA
+0799 THAANA LETTER HHAA
+079a THAANA LETTER KHAA
+079b THAANA LETTER THAALU
+079c THAANA LETTER ZAA
+079d THAANA LETTER SHEENU
+079e THAANA LETTER SAADHU
+079f THAANA LETTER DAADHU
+07a0 THAANA LETTER TO
+07a1 THAANA LETTER ZO
+07a2 THAANA LETTER AINU
+07a3 THAANA LETTER GHAINU
+07a4 THAANA LETTER QAAFU
+07a5 THAANA LETTER WAAVU
+07a6 THAANA ABAFILI
+07a7 THAANA AABAAFILI
+07a8 THAANA IBIFILI
+07a9 THAANA EEBEEFILI
+07aa THAANA UBUFILI
+07ab THAANA OOBOOFILI
+07ac THAANA EBEFILI
+07ad THAANA EYBEYFILI
+07ae THAANA OBOFILI
+07af THAANA OABOAFILI
+07b0 THAANA SUKUN
+0901 DEVANAGARI SIGN CANDRABINDU
+0902 DEVANAGARI SIGN ANUSVARA
+0903 DEVANAGARI SIGN VISARGA
+0905 DEVANAGARI LETTER A
+0906 DEVANAGARI LETTER AA
+0907 DEVANAGARI LETTER I
+0908 DEVANAGARI LETTER II
+0909 DEVANAGARI LETTER U
+090a DEVANAGARI LETTER UU
+090b DEVANAGARI LETTER VOCALIC R
+090c DEVANAGARI LETTER VOCALIC L
+090d DEVANAGARI LETTER CANDRA E
+090e DEVANAGARI LETTER SHORT E
+090f DEVANAGARI LETTER E
+0910 DEVANAGARI LETTER AI
+0911 DEVANAGARI LETTER CANDRA O
+0912 DEVANAGARI LETTER SHORT O
+0913 DEVANAGARI LETTER O
+0914 DEVANAGARI LETTER AU
+0915 DEVANAGARI LETTER KA
+0916 DEVANAGARI LETTER KHA
+0917 DEVANAGARI LETTER GA
+0918 DEVANAGARI LETTER GHA
+0919 DEVANAGARI LETTER NGA
+091a DEVANAGARI LETTER CA
+091b DEVANAGARI LETTER CHA
+091c DEVANAGARI LETTER JA
+091d DEVANAGARI LETTER JHA
+091e DEVANAGARI LETTER NYA
+091f DEVANAGARI LETTER TTA
+0920 DEVANAGARI LETTER TTHA
+0921 DEVANAGARI LETTER DDA
+0922 DEVANAGARI LETTER DDHA
+0923 DEVANAGARI LETTER NNA
+0924 DEVANAGARI LETTER TA
+0925 DEVANAGARI LETTER THA
+0926 DEVANAGARI LETTER DA
+0927 DEVANAGARI LETTER DHA
+0928 DEVANAGARI LETTER NA
+0929 DEVANAGARI LETTER NNNA
+092a DEVANAGARI LETTER PA
+092b DEVANAGARI LETTER PHA
+092c DEVANAGARI LETTER BA
+092d DEVANAGARI LETTER BHA
+092e DEVANAGARI LETTER MA
+092f DEVANAGARI LETTER YA
+0930 DEVANAGARI LETTER RA
+0931 DEVANAGARI LETTER RRA
+0932 DEVANAGARI LETTER LA
+0933 DEVANAGARI LETTER LLA
+0934 DEVANAGARI LETTER LLLA
+0935 DEVANAGARI LETTER VA
+0936 DEVANAGARI LETTER SHA
+0937 DEVANAGARI LETTER SSA
+0938 DEVANAGARI LETTER SA
+0939 DEVANAGARI LETTER HA
+093c DEVANAGARI SIGN NUKTA
+093d DEVANAGARI SIGN AVAGRAHA
+093e DEVANAGARI VOWEL SIGN AA
+093f DEVANAGARI VOWEL SIGN I
+0940 DEVANAGARI VOWEL SIGN II
+0941 DEVANAGARI VOWEL SIGN U
+0942 DEVANAGARI VOWEL SIGN UU
+0943 DEVANAGARI VOWEL SIGN VOCALIC R
+0944 DEVANAGARI VOWEL SIGN VOCALIC RR
+0945 DEVANAGARI VOWEL SIGN CANDRA E
+0946 DEVANAGARI VOWEL SIGN SHORT E
+0947 DEVANAGARI VOWEL SIGN E
+0948 DEVANAGARI VOWEL SIGN AI
+0949 DEVANAGARI VOWEL SIGN CANDRA O
+094a DEVANAGARI VOWEL SIGN SHORT O
+094b DEVANAGARI VOWEL SIGN O
+094c DEVANAGARI VOWEL SIGN AU
+094d DEVANAGARI SIGN VIRAMA
+0950 DEVANAGARI OM
+0951 DEVANAGARI STRESS SIGN UDATTA
+0952 DEVANAGARI STRESS SIGN ANUDATTA
+0953 DEVANAGARI GRAVE ACCENT
+0954 DEVANAGARI ACUTE ACCENT
+0958 DEVANAGARI LETTER QA
+0959 DEVANAGARI LETTER KHHA
+095a DEVANAGARI LETTER GHHA
+095b DEVANAGARI LETTER ZA
+095c DEVANAGARI LETTER DDDHA
+095d DEVANAGARI LETTER RHA
+095e DEVANAGARI LETTER FA
+095f DEVANAGARI LETTER YYA
+0960 DEVANAGARI LETTER VOCALIC RR
+0961 DEVANAGARI LETTER VOCALIC LL
+0962 DEVANAGARI VOWEL SIGN VOCALIC L
+0963 DEVANAGARI VOWEL SIGN VOCALIC LL
+0964 DEVANAGARI DANDA
+0965 DEVANAGARI DOUBLE DANDA
+0966 DEVANAGARI DIGIT ZERO
+0967 DEVANAGARI DIGIT ONE
+0968 DEVANAGARI DIGIT TWO
+0969 DEVANAGARI DIGIT THREE
+096a DEVANAGARI DIGIT FOUR
+096b DEVANAGARI DIGIT FIVE
+096c DEVANAGARI DIGIT SIX
+096d DEVANAGARI DIGIT SEVEN
+096e DEVANAGARI DIGIT EIGHT
+096f DEVANAGARI DIGIT NINE
+0970 DEVANAGARI ABBREVIATION SIGN
+0981 BENGALI SIGN CANDRABINDU
+0982 BENGALI SIGN ANUSVARA
+0983 BENGALI SIGN VISARGA
+0985 BENGALI LETTER A
+0986 BENGALI LETTER AA
+0987 BENGALI LETTER I
+0988 BENGALI LETTER II
+0989 BENGALI LETTER U
+098a BENGALI LETTER UU
+098b BENGALI LETTER VOCALIC R
+098c BENGALI LETTER VOCALIC L
+098f BENGALI LETTER E
+0990 BENGALI LETTER AI
+0993 BENGALI LETTER O
+0994 BENGALI LETTER AU
+0995 BENGALI LETTER KA
+0996 BENGALI LETTER KHA
+0997 BENGALI LETTER GA
+0998 BENGALI LETTER GHA
+0999 BENGALI LETTER NGA
+099a BENGALI LETTER CA
+099b BENGALI LETTER CHA
+099c BENGALI LETTER JA
+099d BENGALI LETTER JHA
+099e BENGALI LETTER NYA
+099f BENGALI LETTER TTA
+09a0 BENGALI LETTER TTHA
+09a1 BENGALI LETTER DDA
+09a2 BENGALI LETTER DDHA
+09a3 BENGALI LETTER NNA
+09a4 BENGALI LETTER TA
+09a5 BENGALI LETTER THA
+09a6 BENGALI LETTER DA
+09a7 BENGALI LETTER DHA
+09a8 BENGALI LETTER NA
+09aa BENGALI LETTER PA
+09ab BENGALI LETTER PHA
+09ac BENGALI LETTER BA
+09ad BENGALI LETTER BHA
+09ae BENGALI LETTER MA
+09af BENGALI LETTER YA
+09b0 BENGALI LETTER RA
+09b2 BENGALI LETTER LA
+09b6 BENGALI LETTER SHA
+09b7 BENGALI LETTER SSA
+09b8 BENGALI LETTER SA
+09b9 BENGALI LETTER HA
+09bc BENGALI SIGN NUKTA
+09be BENGALI VOWEL SIGN AA
+09bf BENGALI VOWEL SIGN I
+09c0 BENGALI VOWEL SIGN II
+09c1 BENGALI VOWEL SIGN U
+09c2 BENGALI VOWEL SIGN UU
+09c3 BENGALI VOWEL SIGN VOCALIC R
+09c4 BENGALI VOWEL SIGN VOCALIC RR
+09c7 BENGALI VOWEL SIGN E
+09c8 BENGALI VOWEL SIGN AI
+09cb BENGALI VOWEL SIGN O
+09cc BENGALI VOWEL SIGN AU
+09cd BENGALI SIGN VIRAMA
+09d7 BENGALI AU LENGTH MARK
+09dc BENGALI LETTER RRA
+09dd BENGALI LETTER RHA
+09df BENGALI LETTER YYA
+09e0 BENGALI LETTER VOCALIC RR
+09e1 BENGALI LETTER VOCALIC LL
+09e2 BENGALI VOWEL SIGN VOCALIC L
+09e3 BENGALI VOWEL SIGN VOCALIC LL
+09e6 BENGALI DIGIT ZERO
+09e7 BENGALI DIGIT ONE
+09e8 BENGALI DIGIT TWO
+09e9 BENGALI DIGIT THREE
+09ea BENGALI DIGIT FOUR
+09eb BENGALI DIGIT FIVE
+09ec BENGALI DIGIT SIX
+09ed BENGALI DIGIT SEVEN
+09ee BENGALI DIGIT EIGHT
+09ef BENGALI DIGIT NINE
+09f0 BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09f1 BENGALI LETTER RA WITH LOWER DIAGONAL
+09f2 BENGALI RUPEE MARK
+09f3 BENGALI RUPEE SIGN
+09f4 BENGALI CURRENCY NUMERATOR ONE
+09f5 BENGALI CURRENCY NUMERATOR TWO
+09f6 BENGALI CURRENCY NUMERATOR THREE
+09f7 BENGALI CURRENCY NUMERATOR FOUR
+09f8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09f9 BENGALI CURRENCY DENOMINATOR SIXTEEN
+09fa BENGALI ISSHAR
+0a02 GURMUKHI SIGN BINDI
+0a05 GURMUKHI LETTER A
+0a06 GURMUKHI LETTER AA
+0a07 GURMUKHI LETTER I
+0a08 GURMUKHI LETTER II
+0a09 GURMUKHI LETTER U
+0a0a GURMUKHI LETTER UU
+0a0f GURMUKHI LETTER EE
+0a10 GURMUKHI LETTER AI
+0a13 GURMUKHI LETTER OO
+0a14 GURMUKHI LETTER AU
+0a15 GURMUKHI LETTER KA
+0a16 GURMUKHI LETTER KHA
+0a17 GURMUKHI LETTER GA
+0a18 GURMUKHI LETTER GHA
+0a19 GURMUKHI LETTER NGA
+0a1a GURMUKHI LETTER CA
+0a1b GURMUKHI LETTER CHA
+0a1c GURMUKHI LETTER JA
+0a1d GURMUKHI LETTER JHA
+0a1e GURMUKHI LETTER NYA
+0a1f GURMUKHI LETTER TTA
+0a20 GURMUKHI LETTER TTHA
+0a21 GURMUKHI LETTER DDA
+0a22 GURMUKHI LETTER DDHA
+0a23 GURMUKHI LETTER NNA
+0a24 GURMUKHI LETTER TA
+0a25 GURMUKHI LETTER THA
+0a26 GURMUKHI LETTER DA
+0a27 GURMUKHI LETTER DHA
+0a28 GURMUKHI LETTER NA
+0a2a GURMUKHI LETTER PA
+0a2b GURMUKHI LETTER PHA
+0a2c GURMUKHI LETTER BA
+0a2d GURMUKHI LETTER BHA
+0a2e GURMUKHI LETTER MA
+0a2f GURMUKHI LETTER YA
+0a30 GURMUKHI LETTER RA
+0a32 GURMUKHI LETTER LA
+0a33 GURMUKHI LETTER LLA
+0a35 GURMUKHI LETTER VA
+0a36 GURMUKHI LETTER SHA
+0a38 GURMUKHI LETTER SA
+0a39 GURMUKHI LETTER HA
+0a3c GURMUKHI SIGN NUKTA
+0a3e GURMUKHI VOWEL SIGN AA
+0a3f GURMUKHI VOWEL SIGN I
+0a40 GURMUKHI VOWEL SIGN II
+0a41 GURMUKHI VOWEL SIGN U
+0a42 GURMUKHI VOWEL SIGN UU
+0a47 GURMUKHI VOWEL SIGN EE
+0a48 GURMUKHI VOWEL SIGN AI
+0a4b GURMUKHI VOWEL SIGN OO
+0a4c GURMUKHI VOWEL SIGN AU
+0a4d GURMUKHI SIGN VIRAMA
+0a59 GURMUKHI LETTER KHHA
+0a5a GURMUKHI LETTER GHHA
+0a5b GURMUKHI LETTER ZA
+0a5c GURMUKHI LETTER RRA
+0a5e GURMUKHI LETTER FA
+0a66 GURMUKHI DIGIT ZERO
+0a67 GURMUKHI DIGIT ONE
+0a68 GURMUKHI DIGIT TWO
+0a69 GURMUKHI DIGIT THREE
+0a6a GURMUKHI DIGIT FOUR
+0a6b GURMUKHI DIGIT FIVE
+0a6c GURMUKHI DIGIT SIX
+0a6d GURMUKHI DIGIT SEVEN
+0a6e GURMUKHI DIGIT EIGHT
+0a6f GURMUKHI DIGIT NINE
+0a70 GURMUKHI TIPPI
+0a71 GURMUKHI ADDAK
+0a72 GURMUKHI IRI
+0a73 GURMUKHI URA
+0a74 GURMUKHI EK ONKAR
+0a81 GUJARATI SIGN CANDRABINDU
+0a82 GUJARATI SIGN ANUSVARA
+0a83 GUJARATI SIGN VISARGA
+0a85 GUJARATI LETTER A
+0a86 GUJARATI LETTER AA
+0a87 GUJARATI LETTER I
+0a88 GUJARATI LETTER II
+0a89 GUJARATI LETTER U
+0a8a GUJARATI LETTER UU
+0a8b GUJARATI LETTER VOCALIC R
+0a8d GUJARATI VOWEL CANDRA E
+0a8f GUJARATI LETTER E
+0a90 GUJARATI LETTER AI
+0a91 GUJARATI VOWEL CANDRA O
+0a93 GUJARATI LETTER O
+0a94 GUJARATI LETTER AU
+0a95 GUJARATI LETTER KA
+0a96 GUJARATI LETTER KHA
+0a97 GUJARATI LETTER GA
+0a98 GUJARATI LETTER GHA
+0a99 GUJARATI LETTER NGA
+0a9a GUJARATI LETTER CA
+0a9b GUJARATI LETTER CHA
+0a9c GUJARATI LETTER JA
+0a9d GUJARATI LETTER JHA
+0a9e GUJARATI LETTER NYA
+0a9f GUJARATI LETTER TTA
+0aa0 GUJARATI LETTER TTHA
+0aa1 GUJARATI LETTER DDA
+0aa2 GUJARATI LETTER DDHA
+0aa3 GUJARATI LETTER NNA
+0aa4 GUJARATI LETTER TA
+0aa5 GUJARATI LETTER THA
+0aa6 GUJARATI LETTER DA
+0aa7 GUJARATI LETTER DHA
+0aa8 GUJARATI LETTER NA
+0aaa GUJARATI LETTER PA
+0aab GUJARATI LETTER PHA
+0aac GUJARATI LETTER BA
+0aad GUJARATI LETTER BHA
+0aae GUJARATI LETTER MA
+0aaf GUJARATI LETTER YA
+0ab0 GUJARATI LETTER RA
+0ab2 GUJARATI LETTER LA
+0ab3 GUJARATI LETTER LLA
+0ab5 GUJARATI LETTER VA
+0ab6 GUJARATI LETTER SHA
+0ab7 GUJARATI LETTER SSA
+0ab8 GUJARATI LETTER SA
+0ab9 GUJARATI LETTER HA
+0abc GUJARATI SIGN NUKTA
+0abd GUJARATI SIGN AVAGRAHA
+0abe GUJARATI VOWEL SIGN AA
+0abf GUJARATI VOWEL SIGN I
+0ac0 GUJARATI VOWEL SIGN II
+0ac1 GUJARATI VOWEL SIGN U
+0ac2 GUJARATI VOWEL SIGN UU
+0ac3 GUJARATI VOWEL SIGN VOCALIC R
+0ac4 GUJARATI VOWEL SIGN VOCALIC RR
+0ac5 GUJARATI VOWEL SIGN CANDRA E
+0ac7 GUJARATI VOWEL SIGN E
+0ac8 GUJARATI VOWEL SIGN AI
+0ac9 GUJARATI VOWEL SIGN CANDRA O
+0acb GUJARATI VOWEL SIGN O
+0acc GUJARATI VOWEL SIGN AU
+0acd GUJARATI SIGN VIRAMA
+0ad0 GUJARATI OM
+0ae0 GUJARATI LETTER VOCALIC RR
+0ae6 GUJARATI DIGIT ZERO
+0ae7 GUJARATI DIGIT ONE
+0ae8 GUJARATI DIGIT TWO
+0ae9 GUJARATI DIGIT THREE
+0aea GUJARATI DIGIT FOUR
+0aeb GUJARATI DIGIT FIVE
+0aec GUJARATI DIGIT SIX
+0aed GUJARATI DIGIT SEVEN
+0aee GUJARATI DIGIT EIGHT
+0aef GUJARATI DIGIT NINE
+0b01 ORIYA SIGN CANDRABINDU
+0b02 ORIYA SIGN ANUSVARA
+0b03 ORIYA SIGN VISARGA
+0b05 ORIYA LETTER A
+0b06 ORIYA LETTER AA
+0b07 ORIYA LETTER I
+0b08 ORIYA LETTER II
+0b09 ORIYA LETTER U
+0b0a ORIYA LETTER UU
+0b0b ORIYA LETTER VOCALIC R
+0b0c ORIYA LETTER VOCALIC L
+0b0f ORIYA LETTER E
+0b10 ORIYA LETTER AI
+0b13 ORIYA LETTER O
+0b14 ORIYA LETTER AU
+0b15 ORIYA LETTER KA
+0b16 ORIYA LETTER KHA
+0b17 ORIYA LETTER GA
+0b18 ORIYA LETTER GHA
+0b19 ORIYA LETTER NGA
+0b1a ORIYA LETTER CA
+0b1b ORIYA LETTER CHA
+0b1c ORIYA LETTER JA
+0b1d ORIYA LETTER JHA
+0b1e ORIYA LETTER NYA
+0b1f ORIYA LETTER TTA
+0b20 ORIYA LETTER TTHA
+0b21 ORIYA LETTER DDA
+0b22 ORIYA LETTER DDHA
+0b23 ORIYA LETTER NNA
+0b24 ORIYA LETTER TA
+0b25 ORIYA LETTER THA
+0b26 ORIYA LETTER DA
+0b27 ORIYA LETTER DHA
+0b28 ORIYA LETTER NA
+0b2a ORIYA LETTER PA
+0b2b ORIYA LETTER PHA
+0b2c ORIYA LETTER BA
+0b2d ORIYA LETTER BHA
+0b2e ORIYA LETTER MA
+0b2f ORIYA LETTER YA
+0b30 ORIYA LETTER RA
+0b32 ORIYA LETTER LA
+0b33 ORIYA LETTER LLA
+0b36 ORIYA LETTER SHA
+0b37 ORIYA LETTER SSA
+0b38 ORIYA LETTER SA
+0b39 ORIYA LETTER HA
+0b3c ORIYA SIGN NUKTA
+0b3d ORIYA SIGN AVAGRAHA
+0b3e ORIYA VOWEL SIGN AA
+0b3f ORIYA VOWEL SIGN I
+0b40 ORIYA VOWEL SIGN II
+0b41 ORIYA VOWEL SIGN U
+0b42 ORIYA VOWEL SIGN UU
+0b43 ORIYA VOWEL SIGN VOCALIC R
+0b47 ORIYA VOWEL SIGN E
+0b48 ORIYA VOWEL SIGN AI
+0b4b ORIYA VOWEL SIGN O
+0b4c ORIYA VOWEL SIGN AU
+0b4d ORIYA SIGN VIRAMA
+0b56 ORIYA AI LENGTH MARK
+0b57 ORIYA AU LENGTH MARK
+0b5c ORIYA LETTER RRA
+0b5d ORIYA LETTER RHA
+0b5f ORIYA LETTER YYA
+0b60 ORIYA LETTER VOCALIC RR
+0b61 ORIYA LETTER VOCALIC LL
+0b66 ORIYA DIGIT ZERO
+0b67 ORIYA DIGIT ONE
+0b68 ORIYA DIGIT TWO
+0b69 ORIYA DIGIT THREE
+0b6a ORIYA DIGIT FOUR
+0b6b ORIYA DIGIT FIVE
+0b6c ORIYA DIGIT SIX
+0b6d ORIYA DIGIT SEVEN
+0b6e ORIYA DIGIT EIGHT
+0b6f ORIYA DIGIT NINE
+0b70 ORIYA ISSHAR
+0b82 TAMIL SIGN ANUSVARA
+0b83 TAMIL SIGN VISARGA
+0b85 TAMIL LETTER A
+0b86 TAMIL LETTER AA
+0b87 TAMIL LETTER I
+0b88 TAMIL LETTER II
+0b89 TAMIL LETTER U
+0b8a TAMIL LETTER UU
+0b8e TAMIL LETTER E
+0b8f TAMIL LETTER EE
+0b90 TAMIL LETTER AI
+0b92 TAMIL LETTER O
+0b93 TAMIL LETTER OO
+0b94 TAMIL LETTER AU
+0b95 TAMIL LETTER KA
+0b99 TAMIL LETTER NGA
+0b9a TAMIL LETTER CA
+0b9c TAMIL LETTER JA
+0b9e TAMIL LETTER NYA
+0b9f TAMIL LETTER TTA
+0ba3 TAMIL LETTER NNA
+0ba4 TAMIL LETTER TA
+0ba8 TAMIL LETTER NA
+0ba9 TAMIL LETTER NNNA
+0baa TAMIL LETTER PA
+0bae TAMIL LETTER MA
+0baf TAMIL LETTER YA
+0bb0 TAMIL LETTER RA
+0bb1 TAMIL LETTER RRA
+0bb2 TAMIL LETTER LA
+0bb3 TAMIL LETTER LLA
+0bb4 TAMIL LETTER LLLA
+0bb5 TAMIL LETTER VA
+0bb7 TAMIL LETTER SSA
+0bb8 TAMIL LETTER SA
+0bb9 TAMIL LETTER HA
+0bbe TAMIL VOWEL SIGN AA
+0bbf TAMIL VOWEL SIGN I
+0bc0 TAMIL VOWEL SIGN II
+0bc1 TAMIL VOWEL SIGN U
+0bc2 TAMIL VOWEL SIGN UU
+0bc6 TAMIL VOWEL SIGN E
+0bc7 TAMIL VOWEL SIGN EE
+0bc8 TAMIL VOWEL SIGN AI
+0bca TAMIL VOWEL SIGN O
+0bcb TAMIL VOWEL SIGN OO
+0bcc TAMIL VOWEL SIGN AU
+0bcd TAMIL SIGN VIRAMA
+0bd7 TAMIL AU LENGTH MARK
+0be7 TAMIL DIGIT ONE
+0be8 TAMIL DIGIT TWO
+0be9 TAMIL DIGIT THREE
+0bea TAMIL DIGIT FOUR
+0beb TAMIL DIGIT FIVE
+0bec TAMIL DIGIT SIX
+0bed TAMIL DIGIT SEVEN
+0bee TAMIL DIGIT EIGHT
+0bef TAMIL DIGIT NINE
+0bf0 TAMIL NUMBER TEN
+0bf1 TAMIL NUMBER ONE HUNDRED
+0bf2 TAMIL NUMBER ONE THOUSAND
+0c01 TELUGU SIGN CANDRABINDU
+0c02 TELUGU SIGN ANUSVARA
+0c03 TELUGU SIGN VISARGA
+0c05 TELUGU LETTER A
+0c06 TELUGU LETTER AA
+0c07 TELUGU LETTER I
+0c08 TELUGU LETTER II
+0c09 TELUGU LETTER U
+0c0a TELUGU LETTER UU
+0c0b TELUGU LETTER VOCALIC R
+0c0c TELUGU LETTER VOCALIC L
+0c0e TELUGU LETTER E
+0c0f TELUGU LETTER EE
+0c10 TELUGU LETTER AI
+0c12 TELUGU LETTER O
+0c13 TELUGU LETTER OO
+0c14 TELUGU LETTER AU
+0c15 TELUGU LETTER KA
+0c16 TELUGU LETTER KHA
+0c17 TELUGU LETTER GA
+0c18 TELUGU LETTER GHA
+0c19 TELUGU LETTER NGA
+0c1a TELUGU LETTER CA
+0c1b TELUGU LETTER CHA
+0c1c TELUGU LETTER JA
+0c1d TELUGU LETTER JHA
+0c1e TELUGU LETTER NYA
+0c1f TELUGU LETTER TTA
+0c20 TELUGU LETTER TTHA
+0c21 TELUGU LETTER DDA
+0c22 TELUGU LETTER DDHA
+0c23 TELUGU LETTER NNA
+0c24 TELUGU LETTER TA
+0c25 TELUGU LETTER THA
+0c26 TELUGU LETTER DA
+0c27 TELUGU LETTER DHA
+0c28 TELUGU LETTER NA
+0c2a TELUGU LETTER PA
+0c2b TELUGU LETTER PHA
+0c2c TELUGU LETTER BA
+0c2d TELUGU LETTER BHA
+0c2e TELUGU LETTER MA
+0c2f TELUGU LETTER YA
+0c30 TELUGU LETTER RA
+0c31 TELUGU LETTER RRA
+0c32 TELUGU LETTER LA
+0c33 TELUGU LETTER LLA
+0c35 TELUGU LETTER VA
+0c36 TELUGU LETTER SHA
+0c37 TELUGU LETTER SSA
+0c38 TELUGU LETTER SA
+0c39 TELUGU LETTER HA
+0c3e TELUGU VOWEL SIGN AA
+0c3f TELUGU VOWEL SIGN I
+0c40 TELUGU VOWEL SIGN II
+0c41 TELUGU VOWEL SIGN U
+0c42 TELUGU VOWEL SIGN UU
+0c43 TELUGU VOWEL SIGN VOCALIC R
+0c44 TELUGU VOWEL SIGN VOCALIC RR
+0c46 TELUGU VOWEL SIGN E
+0c47 TELUGU VOWEL SIGN EE
+0c48 TELUGU VOWEL SIGN AI
+0c4a TELUGU VOWEL SIGN O
+0c4b TELUGU VOWEL SIGN OO
+0c4c TELUGU VOWEL SIGN AU
+0c4d TELUGU SIGN VIRAMA
+0c55 TELUGU LENGTH MARK
+0c56 TELUGU AI LENGTH MARK
+0c60 TELUGU LETTER VOCALIC RR
+0c61 TELUGU LETTER VOCALIC LL
+0c66 TELUGU DIGIT ZERO
+0c67 TELUGU DIGIT ONE
+0c68 TELUGU DIGIT TWO
+0c69 TELUGU DIGIT THREE
+0c6a TELUGU DIGIT FOUR
+0c6b TELUGU DIGIT FIVE
+0c6c TELUGU DIGIT SIX
+0c6d TELUGU DIGIT SEVEN
+0c6e TELUGU DIGIT EIGHT
+0c6f TELUGU DIGIT NINE
+0c82 KANNADA SIGN ANUSVARA
+0c83 KANNADA SIGN VISARGA
+0c85 KANNADA LETTER A
+0c86 KANNADA LETTER AA
+0c87 KANNADA LETTER I
+0c88 KANNADA LETTER II
+0c89 KANNADA LETTER U
+0c8a KANNADA LETTER UU
+0c8b KANNADA LETTER VOCALIC R
+0c8c KANNADA LETTER VOCALIC L
+0c8e KANNADA LETTER E
+0c8f KANNADA LETTER EE
+0c90 KANNADA LETTER AI
+0c92 KANNADA LETTER O
+0c93 KANNADA LETTER OO
+0c94 KANNADA LETTER AU
+0c95 KANNADA LETTER KA
+0c96 KANNADA LETTER KHA
+0c97 KANNADA LETTER GA
+0c98 KANNADA LETTER GHA
+0c99 KANNADA LETTER NGA
+0c9a KANNADA LETTER CA
+0c9b KANNADA LETTER CHA
+0c9c KANNADA LETTER JA
+0c9d KANNADA LETTER JHA
+0c9e KANNADA LETTER NYA
+0c9f KANNADA LETTER TTA
+0ca0 KANNADA LETTER TTHA
+0ca1 KANNADA LETTER DDA
+0ca2 KANNADA LETTER DDHA
+0ca3 KANNADA LETTER NNA
+0ca4 KANNADA LETTER TA
+0ca5 KANNADA LETTER THA
+0ca6 KANNADA LETTER DA
+0ca7 KANNADA LETTER DHA
+0ca8 KANNADA LETTER NA
+0caa KANNADA LETTER PA
+0cab KANNADA LETTER PHA
+0cac KANNADA LETTER BA
+0cad KANNADA LETTER BHA
+0cae KANNADA LETTER MA
+0caf KANNADA LETTER YA
+0cb0 KANNADA LETTER RA
+0cb1 KANNADA LETTER RRA
+0cb2 KANNADA LETTER LA
+0cb3 KANNADA LETTER LLA
+0cb5 KANNADA LETTER VA
+0cb6 KANNADA LETTER SHA
+0cb7 KANNADA LETTER SSA
+0cb8 KANNADA LETTER SA
+0cb9 KANNADA LETTER HA
+0cbe KANNADA VOWEL SIGN AA
+0cbf KANNADA VOWEL SIGN I
+0cc0 KANNADA VOWEL SIGN II
+0cc1 KANNADA VOWEL SIGN U
+0cc2 KANNADA VOWEL SIGN UU
+0cc3 KANNADA VOWEL SIGN VOCALIC R
+0cc4 KANNADA VOWEL SIGN VOCALIC RR
+0cc6 KANNADA VOWEL SIGN E
+0cc7 KANNADA VOWEL SIGN EE
+0cc8 KANNADA VOWEL SIGN AI
+0cca KANNADA VOWEL SIGN O
+0ccb KANNADA VOWEL SIGN OO
+0ccc KANNADA VOWEL SIGN AU
+0ccd KANNADA SIGN VIRAMA
+0cd5 KANNADA LENGTH MARK
+0cd6 KANNADA AI LENGTH MARK
+0cde KANNADA LETTER FA
+0ce0 KANNADA LETTER VOCALIC RR
+0ce1 KANNADA LETTER VOCALIC LL
+0ce6 KANNADA DIGIT ZERO
+0ce7 KANNADA DIGIT ONE
+0ce8 KANNADA DIGIT TWO
+0ce9 KANNADA DIGIT THREE
+0cea KANNADA DIGIT FOUR
+0ceb KANNADA DIGIT FIVE
+0cec KANNADA DIGIT SIX
+0ced KANNADA DIGIT SEVEN
+0cee KANNADA DIGIT EIGHT
+0cef KANNADA DIGIT NINE
+0d02 MALAYALAM SIGN ANUSVARA
+0d03 MALAYALAM SIGN VISARGA
+0d05 MALAYALAM LETTER A
+0d06 MALAYALAM LETTER AA
+0d07 MALAYALAM LETTER I
+0d08 MALAYALAM LETTER II
+0d09 MALAYALAM LETTER U
+0d0a MALAYALAM LETTER UU
+0d0b MALAYALAM LETTER VOCALIC R
+0d0c MALAYALAM LETTER VOCALIC L
+0d0e MALAYALAM LETTER E
+0d0f MALAYALAM LETTER EE
+0d10 MALAYALAM LETTER AI
+0d12 MALAYALAM LETTER O
+0d13 MALAYALAM LETTER OO
+0d14 MALAYALAM LETTER AU
+0d15 MALAYALAM LETTER KA
+0d16 MALAYALAM LETTER KHA
+0d17 MALAYALAM LETTER GA
+0d18 MALAYALAM LETTER GHA
+0d19 MALAYALAM LETTER NGA
+0d1a MALAYALAM LETTER CA
+0d1b MALAYALAM LETTER CHA
+0d1c MALAYALAM LETTER JA
+0d1d MALAYALAM LETTER JHA
+0d1e MALAYALAM LETTER NYA
+0d1f MALAYALAM LETTER TTA
+0d20 MALAYALAM LETTER TTHA
+0d21 MALAYALAM LETTER DDA
+0d22 MALAYALAM LETTER DDHA
+0d23 MALAYALAM LETTER NNA
+0d24 MALAYALAM LETTER TA
+0d25 MALAYALAM LETTER THA
+0d26 MALAYALAM LETTER DA
+0d27 MALAYALAM LETTER DHA
+0d28 MALAYALAM LETTER NA
+0d2a MALAYALAM LETTER PA
+0d2b MALAYALAM LETTER PHA
+0d2c MALAYALAM LETTER BA
+0d2d MALAYALAM LETTER BHA
+0d2e MALAYALAM LETTER MA
+0d2f MALAYALAM LETTER YA
+0d30 MALAYALAM LETTER RA
+0d31 MALAYALAM LETTER RRA
+0d32 MALAYALAM LETTER LA
+0d33 MALAYALAM LETTER LLA
+0d34 MALAYALAM LETTER LLLA
+0d35 MALAYALAM LETTER VA
+0d36 MALAYALAM LETTER SHA
+0d37 MALAYALAM LETTER SSA
+0d38 MALAYALAM LETTER SA
+0d39 MALAYALAM LETTER HA
+0d3e MALAYALAM VOWEL SIGN AA
+0d3f MALAYALAM VOWEL SIGN I
+0d40 MALAYALAM VOWEL SIGN II
+0d41 MALAYALAM VOWEL SIGN U
+0d42 MALAYALAM VOWEL SIGN UU
+0d43 MALAYALAM VOWEL SIGN VOCALIC R
+0d46 MALAYALAM VOWEL SIGN E
+0d47 MALAYALAM VOWEL SIGN EE
+0d48 MALAYALAM VOWEL SIGN AI
+0d4a MALAYALAM VOWEL SIGN O
+0d4b MALAYALAM VOWEL SIGN OO
+0d4c MALAYALAM VOWEL SIGN AU
+0d4d MALAYALAM SIGN VIRAMA
+0d57 MALAYALAM AU LENGTH MARK
+0d60 MALAYALAM LETTER VOCALIC RR
+0d61 MALAYALAM LETTER VOCALIC LL
+0d66 MALAYALAM DIGIT ZERO
+0d67 MALAYALAM DIGIT ONE
+0d68 MALAYALAM DIGIT TWO
+0d69 MALAYALAM DIGIT THREE
+0d6a MALAYALAM DIGIT FOUR
+0d6b MALAYALAM DIGIT FIVE
+0d6c MALAYALAM DIGIT SIX
+0d6d MALAYALAM DIGIT SEVEN
+0d6e MALAYALAM DIGIT EIGHT
+0d6f MALAYALAM DIGIT NINE
+0d82 SINHALA SIGN ANUSVARAYA
+0d83 SINHALA SIGN VISARGAYA
+0d85 SINHALA LETTER AYANNA
+0d86 SINHALA LETTER AAYANNA
+0d87 SINHALA LETTER AEYANNA
+0d88 SINHALA LETTER AEEYANNA
+0d89 SINHALA LETTER IYANNA
+0d8a SINHALA LETTER IIYANNA
+0d8b SINHALA LETTER UYANNA
+0d8c SINHALA LETTER UUYANNA
+0d8d SINHALA LETTER IRUYANNA
+0d8e SINHALA LETTER IRUUYANNA
+0d8f SINHALA LETTER ILUYANNA
+0d90 SINHALA LETTER ILUUYANNA
+0d91 SINHALA LETTER EYANNA
+0d92 SINHALA LETTER EEYANNA
+0d93 SINHALA LETTER AIYANNA
+0d94 SINHALA LETTER OYANNA
+0d95 SINHALA LETTER OOYANNA
+0d96 SINHALA LETTER AUYANNA
+0d9a SINHALA LETTER ALPAPRAANA KAYANNA
+0d9b SINHALA LETTER MAHAAPRAANA KAYANNA
+0d9c SINHALA LETTER ALPAPRAANA GAYANNA
+0d9d SINHALA LETTER MAHAAPRAANA GAYANNA
+0d9e SINHALA LETTER KANTAJA NAASIKYAYA
+0d9f SINHALA LETTER SANYAKA GAYANNA
+0da0 SINHALA LETTER ALPAPRAANA CAYANNA
+0da1 SINHALA LETTER MAHAAPRAANA CAYANNA
+0da2 SINHALA LETTER ALPAPRAANA JAYANNA
+0da3 SINHALA LETTER MAHAAPRAANA JAYANNA
+0da4 SINHALA LETTER TAALUJA NAASIKYAYA
+0da5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0da6 SINHALA LETTER SANYAKA JAYANNA
+0da7 SINHALA LETTER ALPAPRAANA TTAYANNA
+0da8 SINHALA LETTER MAHAAPRAANA TTAYANNA
+0da9 SINHALA LETTER ALPAPRAANA DDAYANNA
+0daa SINHALA LETTER MAHAAPRAANA DDAYANNA
+0dab SINHALA LETTER MUURDHAJA NAYANNA
+0dac SINHALA LETTER SANYAKA DDAYANNA
+0dad SINHALA LETTER ALPAPRAANA TAYANNA
+0dae SINHALA LETTER MAHAAPRAANA TAYANNA
+0daf SINHALA LETTER ALPAPRAANA DAYANNA
+0db0 SINHALA LETTER MAHAAPRAANA DAYANNA
+0db1 SINHALA LETTER DANTAJA NAYANNA
+0db3 SINHALA LETTER SANYAKA DAYANNA
+0db4 SINHALA LETTER ALPAPRAANA PAYANNA
+0db5 SINHALA LETTER MAHAAPRAANA PAYANNA
+0db6 SINHALA LETTER ALPAPRAANA BAYANNA
+0db7 SINHALA LETTER MAHAAPRAANA BAYANNA
+0db8 SINHALA LETTER MAYANNA
+0db9 SINHALA LETTER AMBA BAYANNA
+0dba SINHALA LETTER YAYANNA
+0dbb SINHALA LETTER RAYANNA
+0dbd SINHALA LETTER DANTAJA LAYANNA
+0dc0 SINHALA LETTER VAYANNA
+0dc1 SINHALA LETTER TAALUJA SAYANNA
+0dc2 SINHALA LETTER MUURDHAJA SAYANNA
+0dc3 SINHALA LETTER DANTAJA SAYANNA
+0dc4 SINHALA LETTER HAYANNA
+0dc5 SINHALA LETTER MUURDHAJA LAYANNA
+0dc6 SINHALA LETTER FAYANNA
+0dca SINHALA SIGN AL-LAKUNA
+0dcf SINHALA VOWEL SIGN AELA-PILLA
+0dd0 SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0dd1 SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0dd2 SINHALA VOWEL SIGN KETTI IS-PILLA
+0dd3 SINHALA VOWEL SIGN DIGA IS-PILLA
+0dd4 SINHALA VOWEL SIGN KETTI PAA-PILLA
+0dd6 SINHALA VOWEL SIGN DIGA PAA-PILLA
+0dd8 SINHALA VOWEL SIGN GAETTA-PILLA
+0dd9 SINHALA VOWEL SIGN KOMBUVA
+0dda SINHALA VOWEL SIGN DIGA KOMBUVA
+0ddb SINHALA VOWEL SIGN KOMBU DEKA
+0ddc SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0ddd SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0dde SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0ddf SINHALA VOWEL SIGN GAYANUKITTA
+0df2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0df3 SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0df4 SINHALA PUNCTUATION KUNDDALIYA
+0e01 THAI CHARACTER KO KAI
+0e02 THAI CHARACTER KHO KHAI
+0e03 THAI CHARACTER KHO KHUAT
+0e04 THAI CHARACTER KHO KHWAI
+0e05 THAI CHARACTER KHO KHON
+0e06 THAI CHARACTER KHO RAKHANG
+0e07 THAI CHARACTER NGO NGU
+0e08 THAI CHARACTER CHO CHAN
+0e09 THAI CHARACTER CHO CHING
+0e0a THAI CHARACTER CHO CHANG
+0e0b THAI CHARACTER SO SO
+0e0c THAI CHARACTER CHO CHOE
+0e0d THAI CHARACTER YO YING
+0e0e THAI CHARACTER DO CHADA
+0e0f THAI CHARACTER TO PATAK
+0e10 THAI CHARACTER THO THAN
+0e11 THAI CHARACTER THO NANGMONTHO
+0e12 THAI CHARACTER THO PHUTHAO
+0e13 THAI CHARACTER NO NEN
+0e14 THAI CHARACTER DO DEK
+0e15 THAI CHARACTER TO TAO
+0e16 THAI CHARACTER THO THUNG
+0e17 THAI CHARACTER THO THAHAN
+0e18 THAI CHARACTER THO THONG
+0e19 THAI CHARACTER NO NU
+0e1a THAI CHARACTER BO BAIMAI
+0e1b THAI CHARACTER PO PLA
+0e1c THAI CHARACTER PHO PHUNG
+0e1d THAI CHARACTER FO FA
+0e1e THAI CHARACTER PHO PHAN
+0e1f THAI CHARACTER FO FAN
+0e20 THAI CHARACTER PHO SAMPHAO
+0e21 THAI CHARACTER MO MA
+0e22 THAI CHARACTER YO YAK
+0e23 THAI CHARACTER RO RUA
+0e24 THAI CHARACTER RU
+0e25 THAI CHARACTER LO LING
+0e26 THAI CHARACTER LU
+0e27 THAI CHARACTER WO WAEN
+0e28 THAI CHARACTER SO SALA
+0e29 THAI CHARACTER SO RUSI
+0e2a THAI CHARACTER SO SUA
+0e2b THAI CHARACTER HO HIP
+0e2c THAI CHARACTER LO CHULA
+0e2d THAI CHARACTER O ANG
+0e2e THAI CHARACTER HO NOKHUK
+0e2f THAI CHARACTER PAIYANNOI
+0e30 THAI CHARACTER SARA A
+0e31 THAI CHARACTER MAI HAN-AKAT
+0e32 THAI CHARACTER SARA AA
+0e33 THAI CHARACTER SARA AM
+0e34 THAI CHARACTER SARA I
+0e35 THAI CHARACTER SARA II
+0e36 THAI CHARACTER SARA UE
+0e37 THAI CHARACTER SARA UEE
+0e38 THAI CHARACTER SARA U
+0e39 THAI CHARACTER SARA UU
+0e3a THAI CHARACTER PHINTHU
+0e3f THAI CURRENCY SYMBOL BAHT
+0e40 THAI CHARACTER SARA E
+0e41 THAI CHARACTER SARA AE
+0e42 THAI CHARACTER SARA O
+0e43 THAI CHARACTER SARA AI MAIMUAN
+0e44 THAI CHARACTER SARA AI MAIMALAI
+0e45 THAI CHARACTER LAKKHANGYAO
+0e46 THAI CHARACTER MAIYAMOK
+0e47 THAI CHARACTER MAITAIKHU
+0e48 THAI CHARACTER MAI EK
+0e49 THAI CHARACTER MAI THO
+0e4a THAI CHARACTER MAI TRI
+0e4b THAI CHARACTER MAI CHATTAWA
+0e4c THAI CHARACTER THANTHAKHAT
+0e4d THAI CHARACTER NIKHAHIT
+0e4e THAI CHARACTER YAMAKKAN
+0e4f THAI CHARACTER FONGMAN
+0e50 THAI DIGIT ZERO
+0e51 THAI DIGIT ONE
+0e52 THAI DIGIT TWO
+0e53 THAI DIGIT THREE
+0e54 THAI DIGIT FOUR
+0e55 THAI DIGIT FIVE
+0e56 THAI DIGIT SIX
+0e57 THAI DIGIT SEVEN
+0e58 THAI DIGIT EIGHT
+0e59 THAI DIGIT NINE
+0e5a THAI CHARACTER ANGKHANKHU
+0e5b THAI CHARACTER KHOMUT
+0e81 LAO LETTER KO
+0e82 LAO LETTER KHO SUNG
+0e84 LAO LETTER KHO TAM
+0e87 LAO LETTER NGO
+0e88 LAO LETTER CO
+0e8a LAO LETTER SO TAM
+0e8d LAO LETTER NYO
+0e94 LAO LETTER DO
+0e95 LAO LETTER TO
+0e96 LAO LETTER THO SUNG
+0e97 LAO LETTER THO TAM
+0e99 LAO LETTER NO
+0e9a LAO LETTER BO
+0e9b LAO LETTER PO
+0e9c LAO LETTER PHO SUNG
+0e9d LAO LETTER FO TAM
+0e9e LAO LETTER PHO TAM
+0e9f LAO LETTER FO SUNG
+0ea1 LAO LETTER MO
+0ea2 LAO LETTER YO
+0ea3 LAO LETTER LO LING
+0ea5 LAO LETTER LO LOOT
+0ea7 LAO LETTER WO
+0eaa LAO LETTER SO SUNG
+0eab LAO LETTER HO SUNG
+0ead LAO LETTER O
+0eae LAO LETTER HO TAM
+0eaf LAO ELLIPSIS
+0eb0 LAO VOWEL SIGN A
+0eb1 LAO VOWEL SIGN MAI KAN
+0eb2 LAO VOWEL SIGN AA
+0eb3 LAO VOWEL SIGN AM
+0eb4 LAO VOWEL SIGN I
+0eb5 LAO VOWEL SIGN II
+0eb6 LAO VOWEL SIGN Y
+0eb7 LAO VOWEL SIGN YY
+0eb8 LAO VOWEL SIGN U
+0eb9 LAO VOWEL SIGN UU
+0ebb LAO VOWEL SIGN MAI KON
+0ebc LAO SEMIVOWEL SIGN LO
+0ebd LAO SEMIVOWEL SIGN NYO
+0ec0 LAO VOWEL SIGN E
+0ec1 LAO VOWEL SIGN EI
+0ec2 LAO VOWEL SIGN O
+0ec3 LAO VOWEL SIGN AY
+0ec4 LAO VOWEL SIGN AI
+0ec6 LAO KO LA
+0ec8 LAO TONE MAI EK
+0ec9 LAO TONE MAI THO
+0eca LAO TONE MAI TI
+0ecb LAO TONE MAI CATAWA
+0ecc LAO CANCELLATION MARK
+0ecd LAO NIGGAHITA
+0ed0 LAO DIGIT ZERO
+0ed1 LAO DIGIT ONE
+0ed2 LAO DIGIT TWO
+0ed3 LAO DIGIT THREE
+0ed4 LAO DIGIT FOUR
+0ed5 LAO DIGIT FIVE
+0ed6 LAO DIGIT SIX
+0ed7 LAO DIGIT SEVEN
+0ed8 LAO DIGIT EIGHT
+0ed9 LAO DIGIT NINE
+0edc LAO HO NO
+0edd LAO HO MO
+0f00 TIBETAN SYLLABLE OM
+0f01 TIBETAN MARK GTER YIG MGO TRUNCATED A
+0f02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0f03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0f04 TIBETAN MARK INITIAL YIG MGO MDUN MA
+0f05 TIBETAN MARK CLOSING YIG MGO SGAB MA
+0f06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0f07 TIBETAN MARK YIG MGO TSHEG SHAD MA
+0f08 TIBETAN MARK SBRUL SHAD
+0f09 TIBETAN MARK BSKUR YIG MGO
+0f0a TIBETAN MARK BKA- SHOG YIG MGO
+0f0b TIBETAN MARK INTERSYLLABIC TSHEG
+0f0c TIBETAN MARK DELIMITER TSHEG BSTAR
+0f0d TIBETAN MARK SHAD
+0f0e TIBETAN MARK NYIS SHAD
+0f0f TIBETAN MARK TSHEG SHAD
+0f10 TIBETAN MARK NYIS TSHEG SHAD
+0f11 TIBETAN MARK RIN CHEN SPUNGS SHAD
+0f12 TIBETAN MARK RGYA GRAM SHAD
+0f13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0f14 TIBETAN MARK GTER TSHEG
+0f15 TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0f16 TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0f17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0f18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0f19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0f1a TIBETAN SIGN RDEL DKAR GCIG
+0f1b TIBETAN SIGN RDEL DKAR GNYIS
+0f1c TIBETAN SIGN RDEL DKAR GSUM
+0f1d TIBETAN SIGN RDEL NAG GCIG
+0f1e TIBETAN SIGN RDEL NAG GNYIS
+0f1f TIBETAN SIGN RDEL DKAR RDEL NAG
+0f20 TIBETAN DIGIT ZERO
+0f21 TIBETAN DIGIT ONE
+0f22 TIBETAN DIGIT TWO
+0f23 TIBETAN DIGIT THREE
+0f24 TIBETAN DIGIT FOUR
+0f25 TIBETAN DIGIT FIVE
+0f26 TIBETAN DIGIT SIX
+0f27 TIBETAN DIGIT SEVEN
+0f28 TIBETAN DIGIT EIGHT
+0f29 TIBETAN DIGIT NINE
+0f2a TIBETAN DIGIT HALF ONE
+0f2b TIBETAN DIGIT HALF TWO
+0f2c TIBETAN DIGIT HALF THREE
+0f2d TIBETAN DIGIT HALF FOUR
+0f2e TIBETAN DIGIT HALF FIVE
+0f2f TIBETAN DIGIT HALF SIX
+0f30 TIBETAN DIGIT HALF SEVEN
+0f31 TIBETAN DIGIT HALF EIGHT
+0f32 TIBETAN DIGIT HALF NINE
+0f33 TIBETAN DIGIT HALF ZERO
+0f34 TIBETAN MARK BSDUS RTAGS
+0f35 TIBETAN MARK NGAS BZUNG NYI ZLA
+0f36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0f37 TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0f38 TIBETAN MARK CHE MGO
+0f39 TIBETAN MARK TSA -PHRU
+0f3a TIBETAN MARK GUG RTAGS GYON
+0f3b TIBETAN MARK GUG RTAGS GYAS
+0f3c TIBETAN MARK ANG KHANG GYON
+0f3d TIBETAN MARK ANG KHANG GYAS
+0f3e TIBETAN SIGN YAR TSHES
+0f3f TIBETAN SIGN MAR TSHES
+0f40 TIBETAN LETTER KA
+0f41 TIBETAN LETTER KHA
+0f42 TIBETAN LETTER GA
+0f43 TIBETAN LETTER GHA
+0f44 TIBETAN LETTER NGA
+0f45 TIBETAN LETTER CA
+0f46 TIBETAN LETTER CHA
+0f47 TIBETAN LETTER JA
+0f49 TIBETAN LETTER NYA
+0f4a TIBETAN LETTER TTA
+0f4b TIBETAN LETTER TTHA
+0f4c TIBETAN LETTER DDA
+0f4d TIBETAN LETTER DDHA
+0f4e TIBETAN LETTER NNA
+0f4f TIBETAN LETTER TA
+0f50 TIBETAN LETTER THA
+0f51 TIBETAN LETTER DA
+0f52 TIBETAN LETTER DHA
+0f53 TIBETAN LETTER NA
+0f54 TIBETAN LETTER PA
+0f55 TIBETAN LETTER PHA
+0f56 TIBETAN LETTER BA
+0f57 TIBETAN LETTER BHA
+0f58 TIBETAN LETTER MA
+0f59 TIBETAN LETTER TSA
+0f5a TIBETAN LETTER TSHA
+0f5b TIBETAN LETTER DZA
+0f5c TIBETAN LETTER DZHA
+0f5d TIBETAN LETTER WA
+0f5e TIBETAN LETTER ZHA
+0f5f TIBETAN LETTER ZA
+0f60 TIBETAN LETTER -A
+0f61 TIBETAN LETTER YA
+0f62 TIBETAN LETTER RA
+0f63 TIBETAN LETTER LA
+0f64 TIBETAN LETTER SHA
+0f65 TIBETAN LETTER SSA
+0f66 TIBETAN LETTER SA
+0f67 TIBETAN LETTER HA
+0f68 TIBETAN LETTER A
+0f69 TIBETAN LETTER KSSA
+0f6a TIBETAN LETTER FIXED-FORM RA
+0f71 TIBETAN VOWEL SIGN AA
+0f72 TIBETAN VOWEL SIGN I
+0f73 TIBETAN VOWEL SIGN II
+0f74 TIBETAN VOWEL SIGN U
+0f75 TIBETAN VOWEL SIGN UU
+0f76 TIBETAN VOWEL SIGN VOCALIC R
+0f77 TIBETAN VOWEL SIGN VOCALIC RR
+0f78 TIBETAN VOWEL SIGN VOCALIC L
+0f79 TIBETAN VOWEL SIGN VOCALIC LL
+0f7a TIBETAN VOWEL SIGN E
+0f7b TIBETAN VOWEL SIGN EE
+0f7c TIBETAN VOWEL SIGN O
+0f7d TIBETAN VOWEL SIGN OO
+0f7e TIBETAN SIGN RJES SU NGA RO
+0f7f TIBETAN SIGN RNAM BCAD
+0f80 TIBETAN VOWEL SIGN REVERSED I
+0f81 TIBETAN VOWEL SIGN REVERSED II
+0f82 TIBETAN SIGN NYI ZLA NAA DA
+0f83 TIBETAN SIGN SNA LDAN
+0f84 TIBETAN MARK HALANTA
+0f85 TIBETAN MARK PALUTA
+0f86 TIBETAN SIGN LCI RTAGS
+0f87 TIBETAN SIGN YANG RTAGS
+0f88 TIBETAN SIGN LCE TSA CAN
+0f89 TIBETAN SIGN MCHU CAN
+0f8a TIBETAN SIGN GRU CAN RGYINGS
+0f8b TIBETAN SIGN GRU MED RGYINGS
+0f90 TIBETAN SUBJOINED LETTER KA
+0f91 TIBETAN SUBJOINED LETTER KHA
+0f92 TIBETAN SUBJOINED LETTER GA
+0f93 TIBETAN SUBJOINED LETTER GHA
+0f94 TIBETAN SUBJOINED LETTER NGA
+0f95 TIBETAN SUBJOINED LETTER CA
+0f96 TIBETAN SUBJOINED LETTER CHA
+0f97 TIBETAN SUBJOINED LETTER JA
+0f99 TIBETAN SUBJOINED LETTER NYA
+0f9a TIBETAN SUBJOINED LETTER TTA
+0f9b TIBETAN SUBJOINED LETTER TTHA
+0f9c TIBETAN SUBJOINED LETTER DDA
+0f9d TIBETAN SUBJOINED LETTER DDHA
+0f9e TIBETAN SUBJOINED LETTER NNA
+0f9f TIBETAN SUBJOINED LETTER TA
+0fa0 TIBETAN SUBJOINED LETTER THA
+0fa1 TIBETAN SUBJOINED LETTER DA
+0fa2 TIBETAN SUBJOINED LETTER DHA
+0fa3 TIBETAN SUBJOINED LETTER NA
+0fa4 TIBETAN SUBJOINED LETTER PA
+0fa5 TIBETAN SUBJOINED LETTER PHA
+0fa6 TIBETAN SUBJOINED LETTER BA
+0fa7 TIBETAN SUBJOINED LETTER BHA
+0fa8 TIBETAN SUBJOINED LETTER MA
+0fa9 TIBETAN SUBJOINED LETTER TSA
+0faa TIBETAN SUBJOINED LETTER TSHA
+0fab TIBETAN SUBJOINED LETTER DZA
+0fac TIBETAN SUBJOINED LETTER DZHA
+0fad TIBETAN SUBJOINED LETTER WA
+0fae TIBETAN SUBJOINED LETTER ZHA
+0faf TIBETAN SUBJOINED LETTER ZA
+0fb0 TIBETAN SUBJOINED LETTER -A
+0fb1 TIBETAN SUBJOINED LETTER YA
+0fb2 TIBETAN SUBJOINED LETTER RA
+0fb3 TIBETAN SUBJOINED LETTER LA
+0fb4 TIBETAN SUBJOINED LETTER SHA
+0fb5 TIBETAN SUBJOINED LETTER SSA
+0fb6 TIBETAN SUBJOINED LETTER SA
+0fb7 TIBETAN SUBJOINED LETTER HA
+0fb8 TIBETAN SUBJOINED LETTER A
+0fb9 TIBETAN SUBJOINED LETTER KSSA
+0fba TIBETAN SUBJOINED LETTER FIXED-FORM WA
+0fbb TIBETAN SUBJOINED LETTER FIXED-FORM YA
+0fbc TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0fbe TIBETAN KU RU KHA
+0fbf TIBETAN KU RU KHA BZHI MIG CAN
+0fc0 TIBETAN CANTILLATION SIGN HEAVY BEAT
+0fc1 TIBETAN CANTILLATION SIGN LIGHT BEAT
+0fc2 TIBETAN CANTILLATION SIGN CANG TE-U
+0fc3 TIBETAN CANTILLATION SIGN SBUB -CHAL
+0fc4 TIBETAN SYMBOL DRIL BU
+0fc5 TIBETAN SYMBOL RDO RJE
+0fc6 TIBETAN SYMBOL PADMA GDAN
+0fc7 TIBETAN SYMBOL RDO RJE RGYA GRAM
+0fc8 TIBETAN SYMBOL PHUR PA
+0fc9 TIBETAN SYMBOL NOR BU
+0fca TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0fcb TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0fcc TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0fcf TIBETAN SIGN RDEL NAG GSUM
+1000 MYANMAR LETTER KA
+1001 MYANMAR LETTER KHA
+1002 MYANMAR LETTER GA
+1003 MYANMAR LETTER GHA
+1004 MYANMAR LETTER NGA
+1005 MYANMAR LETTER CA
+1006 MYANMAR LETTER CHA
+1007 MYANMAR LETTER JA
+1008 MYANMAR LETTER JHA
+1009 MYANMAR LETTER NYA
+100a MYANMAR LETTER NNYA
+100b MYANMAR LETTER TTA
+100c MYANMAR LETTER TTHA
+100d MYANMAR LETTER DDA
+100e MYANMAR LETTER DDHA
+100f MYANMAR LETTER NNA
+1010 MYANMAR LETTER TA
+1011 MYANMAR LETTER THA
+1012 MYANMAR LETTER DA
+1013 MYANMAR LETTER DHA
+1014 MYANMAR LETTER NA
+1015 MYANMAR LETTER PA
+1016 MYANMAR LETTER PHA
+1017 MYANMAR LETTER BA
+1018 MYANMAR LETTER BHA
+1019 MYANMAR LETTER MA
+101a MYANMAR LETTER YA
+101b MYANMAR LETTER RA
+101c MYANMAR LETTER LA
+101d MYANMAR LETTER WA
+101e MYANMAR LETTER SA
+101f MYANMAR LETTER HA
+1020 MYANMAR LETTER LLA
+1021 MYANMAR LETTER A
+1023 MYANMAR LETTER I
+1024 MYANMAR LETTER II
+1025 MYANMAR LETTER U
+1026 MYANMAR LETTER UU
+1027 MYANMAR LETTER E
+1029 MYANMAR LETTER O
+102a MYANMAR LETTER AU
+102c MYANMAR VOWEL SIGN AA
+102d MYANMAR VOWEL SIGN I
+102e MYANMAR VOWEL SIGN II
+102f MYANMAR VOWEL SIGN U
+1030 MYANMAR VOWEL SIGN UU
+1031 MYANMAR VOWEL SIGN E
+1032 MYANMAR VOWEL SIGN AI
+1036 MYANMAR SIGN ANUSVARA
+1037 MYANMAR SIGN DOT BELOW
+1038 MYANMAR SIGN VISARGA
+1039 MYANMAR SIGN VIRAMA
+1040 MYANMAR DIGIT ZERO
+1041 MYANMAR DIGIT ONE
+1042 MYANMAR DIGIT TWO
+1043 MYANMAR DIGIT THREE
+1044 MYANMAR DIGIT FOUR
+1045 MYANMAR DIGIT FIVE
+1046 MYANMAR DIGIT SIX
+1047 MYANMAR DIGIT SEVEN
+1048 MYANMAR DIGIT EIGHT
+1049 MYANMAR DIGIT NINE
+104a MYANMAR SIGN LITTLE SECTION
+104b MYANMAR SIGN SECTION
+104c MYANMAR SYMBOL LOCATIVE
+104d MYANMAR SYMBOL COMPLETED
+104e MYANMAR SYMBOL AFOREMENTIONED
+104f MYANMAR SYMBOL GENITIVE
+1050 MYANMAR LETTER SHA
+1051 MYANMAR LETTER SSA
+1052 MYANMAR LETTER VOCALIC R
+1053 MYANMAR LETTER VOCALIC RR
+1054 MYANMAR LETTER VOCALIC L
+1055 MYANMAR LETTER VOCALIC LL
+1056 MYANMAR VOWEL SIGN VOCALIC R
+1057 MYANMAR VOWEL SIGN VOCALIC RR
+1058 MYANMAR VOWEL SIGN VOCALIC L
+1059 MYANMAR VOWEL SIGN VOCALIC LL
+10a0 GEORGIAN CAPITAL LETTER AN
+10a1 GEORGIAN CAPITAL LETTER BAN
+10a2 GEORGIAN CAPITAL LETTER GAN
+10a3 GEORGIAN CAPITAL LETTER DON
+10a4 GEORGIAN CAPITAL LETTER EN
+10a5 GEORGIAN CAPITAL LETTER VIN
+10a6 GEORGIAN CAPITAL LETTER ZEN
+10a7 GEORGIAN CAPITAL LETTER TAN
+10a8 GEORGIAN CAPITAL LETTER IN
+10a9 GEORGIAN CAPITAL LETTER KAN
+10aa GEORGIAN CAPITAL LETTER LAS
+10ab GEORGIAN CAPITAL LETTER MAN
+10ac GEORGIAN CAPITAL LETTER NAR
+10ad GEORGIAN CAPITAL LETTER ON
+10ae GEORGIAN CAPITAL LETTER PAR
+10af GEORGIAN CAPITAL LETTER ZHAR
+10b0 GEORGIAN CAPITAL LETTER RAE
+10b1 GEORGIAN CAPITAL LETTER SAN
+10b2 GEORGIAN CAPITAL LETTER TAR
+10b3 GEORGIAN CAPITAL LETTER UN
+10b4 GEORGIAN CAPITAL LETTER PHAR
+10b5 GEORGIAN CAPITAL LETTER KHAR
+10b6 GEORGIAN CAPITAL LETTER GHAN
+10b7 GEORGIAN CAPITAL LETTER QAR
+10b8 GEORGIAN CAPITAL LETTER SHIN
+10b9 GEORGIAN CAPITAL LETTER CHIN
+10ba GEORGIAN CAPITAL LETTER CAN
+10bb GEORGIAN CAPITAL LETTER JIL
+10bc GEORGIAN CAPITAL LETTER CIL
+10bd GEORGIAN CAPITAL LETTER CHAR
+10be GEORGIAN CAPITAL LETTER XAN
+10bf GEORGIAN CAPITAL LETTER JHAN
+10c0 GEORGIAN CAPITAL LETTER HAE
+10c1 GEORGIAN CAPITAL LETTER HE
+10c2 GEORGIAN CAPITAL LETTER HIE
+10c3 GEORGIAN CAPITAL LETTER WE
+10c4 GEORGIAN CAPITAL LETTER HAR
+10c5 GEORGIAN CAPITAL LETTER HOE
+10d0 GEORGIAN LETTER AN
+10d1 GEORGIAN LETTER BAN
+10d2 GEORGIAN LETTER GAN
+10d3 GEORGIAN LETTER DON
+10d4 GEORGIAN LETTER EN
+10d5 GEORGIAN LETTER VIN
+10d6 GEORGIAN LETTER ZEN
+10d7 GEORGIAN LETTER TAN
+10d8 GEORGIAN LETTER IN
+10d9 GEORGIAN LETTER KAN
+10da GEORGIAN LETTER LAS
+10db GEORGIAN LETTER MAN
+10dc GEORGIAN LETTER NAR
+10dd GEORGIAN LETTER ON
+10de GEORGIAN LETTER PAR
+10df GEORGIAN LETTER ZHAR
+10e0 GEORGIAN LETTER RAE
+10e1 GEORGIAN LETTER SAN
+10e2 GEORGIAN LETTER TAR
+10e3 GEORGIAN LETTER UN
+10e4 GEORGIAN LETTER PHAR
+10e5 GEORGIAN LETTER KHAR
+10e6 GEORGIAN LETTER GHAN
+10e7 GEORGIAN LETTER QAR
+10e8 GEORGIAN LETTER SHIN
+10e9 GEORGIAN LETTER CHIN
+10ea GEORGIAN LETTER CAN
+10eb GEORGIAN LETTER JIL
+10ec GEORGIAN LETTER CIL
+10ed GEORGIAN LETTER CHAR
+10ee GEORGIAN LETTER XAN
+10ef GEORGIAN LETTER JHAN
+10f0 GEORGIAN LETTER HAE
+10f1 GEORGIAN LETTER HE
+10f2 GEORGIAN LETTER HIE
+10f3 GEORGIAN LETTER WE
+10f4 GEORGIAN LETTER HAR
+10f5 GEORGIAN LETTER HOE
+10f6 GEORGIAN LETTER FI
+10fb GEORGIAN PARAGRAPH SEPARATOR
+1100 HANGUL CHOSEONG KIYEOK
+1101 HANGUL CHOSEONG SSANGKIYEOK
+1102 HANGUL CHOSEONG NIEUN
+1103 HANGUL CHOSEONG TIKEUT
+1104 HANGUL CHOSEONG SSANGTIKEUT
+1105 HANGUL CHOSEONG RIEUL
+1106 HANGUL CHOSEONG MIEUM
+1107 HANGUL CHOSEONG PIEUP
+1108 HANGUL CHOSEONG SSANGPIEUP
+1109 HANGUL CHOSEONG SIOS
+110a HANGUL CHOSEONG SSANGSIOS
+110b HANGUL CHOSEONG IEUNG
+110c HANGUL CHOSEONG CIEUC
+110d HANGUL CHOSEONG SSANGCIEUC
+110e HANGUL CHOSEONG CHIEUCH
+110f HANGUL CHOSEONG KHIEUKH
+1110 HANGUL CHOSEONG THIEUTH
+1111 HANGUL CHOSEONG PHIEUPH
+1112 HANGUL CHOSEONG HIEUH
+1113 HANGUL CHOSEONG NIEUN-KIYEOK
+1114 HANGUL CHOSEONG SSANGNIEUN
+1115 HANGUL CHOSEONG NIEUN-TIKEUT
+1116 HANGUL CHOSEONG NIEUN-PIEUP
+1117 HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 HANGUL CHOSEONG RIEUL-NIEUN
+1119 HANGUL CHOSEONG SSANGRIEUL
+111a HANGUL CHOSEONG RIEUL-HIEUH
+111b HANGUL CHOSEONG KAPYEOUNRIEUL
+111c HANGUL CHOSEONG MIEUM-PIEUP
+111d HANGUL CHOSEONG KAPYEOUNMIEUM
+111e HANGUL CHOSEONG PIEUP-KIYEOK
+111f HANGUL CHOSEONG PIEUP-NIEUN
+1120 HANGUL CHOSEONG PIEUP-TIKEUT
+1121 HANGUL CHOSEONG PIEUP-SIOS
+1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 HANGUL CHOSEONG PIEUP-CIEUC
+1128 HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 HANGUL CHOSEONG PIEUP-THIEUTH
+112a HANGUL CHOSEONG PIEUP-PHIEUPH
+112b HANGUL CHOSEONG KAPYEOUNPIEUP
+112c HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112d HANGUL CHOSEONG SIOS-KIYEOK
+112e HANGUL CHOSEONG SIOS-NIEUN
+112f HANGUL CHOSEONG SIOS-TIKEUT
+1130 HANGUL CHOSEONG SIOS-RIEUL
+1131 HANGUL CHOSEONG SIOS-MIEUM
+1132 HANGUL CHOSEONG SIOS-PIEUP
+1133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 HANGUL CHOSEONG SIOS-IEUNG
+1136 HANGUL CHOSEONG SIOS-CIEUC
+1137 HANGUL CHOSEONG SIOS-CHIEUCH
+1138 HANGUL CHOSEONG SIOS-KHIEUKH
+1139 HANGUL CHOSEONG SIOS-THIEUTH
+113a HANGUL CHOSEONG SIOS-PHIEUPH
+113b HANGUL CHOSEONG SIOS-HIEUH
+113c HANGUL CHOSEONG CHITUEUMSIOS
+113d HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113e HANGUL CHOSEONG CEONGCHIEUMSIOS
+113f HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 HANGUL CHOSEONG PANSIOS
+1141 HANGUL CHOSEONG IEUNG-KIYEOK
+1142 HANGUL CHOSEONG IEUNG-TIKEUT
+1143 HANGUL CHOSEONG IEUNG-MIEUM
+1144 HANGUL CHOSEONG IEUNG-PIEUP
+1145 HANGUL CHOSEONG IEUNG-SIOS
+1146 HANGUL CHOSEONG IEUNG-PANSIOS
+1147 HANGUL CHOSEONG SSANGIEUNG
+1148 HANGUL CHOSEONG IEUNG-CIEUC
+1149 HANGUL CHOSEONG IEUNG-CHIEUCH
+114a HANGUL CHOSEONG IEUNG-THIEUTH
+114b HANGUL CHOSEONG IEUNG-PHIEUPH
+114c HANGUL CHOSEONG YESIEUNG
+114d HANGUL CHOSEONG CIEUC-IEUNG
+114e HANGUL CHOSEONG CHITUEUMCIEUC
+114f HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158 HANGUL CHOSEONG SSANGHIEUH
+1159 HANGUL CHOSEONG YEORINHIEUH
+115f HANGUL CHOSEONG FILLER
+1160 HANGUL JUNGSEONG FILLER
+1161 HANGUL JUNGSEONG A
+1162 HANGUL JUNGSEONG AE
+1163 HANGUL JUNGSEONG YA
+1164 HANGUL JUNGSEONG YAE
+1165 HANGUL JUNGSEONG EO
+1166 HANGUL JUNGSEONG E
+1167 HANGUL JUNGSEONG YEO
+1168 HANGUL JUNGSEONG YE
+1169 HANGUL JUNGSEONG O
+116a HANGUL JUNGSEONG WA
+116b HANGUL JUNGSEONG WAE
+116c HANGUL JUNGSEONG OE
+116d HANGUL JUNGSEONG YO
+116e HANGUL JUNGSEONG U
+116f HANGUL JUNGSEONG WEO
+1170 HANGUL JUNGSEONG WE
+1171 HANGUL JUNGSEONG WI
+1172 HANGUL JUNGSEONG YU
+1173 HANGUL JUNGSEONG EU
+1174 HANGUL JUNGSEONG YI
+1175 HANGUL JUNGSEONG I
+1176 HANGUL JUNGSEONG A-O
+1177 HANGUL JUNGSEONG A-U
+1178 HANGUL JUNGSEONG YA-O
+1179 HANGUL JUNGSEONG YA-YO
+117a HANGUL JUNGSEONG EO-O
+117b HANGUL JUNGSEONG EO-U
+117c HANGUL JUNGSEONG EO-EU
+117d HANGUL JUNGSEONG YEO-O
+117e HANGUL JUNGSEONG YEO-U
+117f HANGUL JUNGSEONG O-EO
+1180 HANGUL JUNGSEONG O-E
+1181 HANGUL JUNGSEONG O-YE
+1182 HANGUL JUNGSEONG O-O
+1183 HANGUL JUNGSEONG O-U
+1184 HANGUL JUNGSEONG YO-YA
+1185 HANGUL JUNGSEONG YO-YAE
+1186 HANGUL JUNGSEONG YO-YEO
+1187 HANGUL JUNGSEONG YO-O
+1188 HANGUL JUNGSEONG YO-I
+1189 HANGUL JUNGSEONG U-A
+118a HANGUL JUNGSEONG U-AE
+118b HANGUL JUNGSEONG U-EO-EU
+118c HANGUL JUNGSEONG U-YE
+118d HANGUL JUNGSEONG U-U
+118e HANGUL JUNGSEONG YU-A
+118f HANGUL JUNGSEONG YU-EO
+1190 HANGUL JUNGSEONG YU-E
+1191 HANGUL JUNGSEONG YU-YEO
+1192 HANGUL JUNGSEONG YU-YE
+1193 HANGUL JUNGSEONG YU-U
+1194 HANGUL JUNGSEONG YU-I
+1195 HANGUL JUNGSEONG EU-U
+1196 HANGUL JUNGSEONG EU-EU
+1197 HANGUL JUNGSEONG YI-U
+1198 HANGUL JUNGSEONG I-A
+1199 HANGUL JUNGSEONG I-YA
+119a HANGUL JUNGSEONG I-O
+119b HANGUL JUNGSEONG I-U
+119c HANGUL JUNGSEONG I-EU
+119d HANGUL JUNGSEONG I-ARAEA
+119e HANGUL JUNGSEONG ARAEA
+119f HANGUL JUNGSEONG ARAEA-EO
+11a0 HANGUL JUNGSEONG ARAEA-U
+11a1 HANGUL JUNGSEONG ARAEA-I
+11a2 HANGUL JUNGSEONG SSANGARAEA
+11a8 HANGUL JONGSEONG KIYEOK
+11a9 HANGUL JONGSEONG SSANGKIYEOK
+11aa HANGUL JONGSEONG KIYEOK-SIOS
+11ab HANGUL JONGSEONG NIEUN
+11ac HANGUL JONGSEONG NIEUN-CIEUC
+11ad HANGUL JONGSEONG NIEUN-HIEUH
+11ae HANGUL JONGSEONG TIKEUT
+11af HANGUL JONGSEONG RIEUL
+11b0 HANGUL JONGSEONG RIEUL-KIYEOK
+11b1 HANGUL JONGSEONG RIEUL-MIEUM
+11b2 HANGUL JONGSEONG RIEUL-PIEUP
+11b3 HANGUL JONGSEONG RIEUL-SIOS
+11b4 HANGUL JONGSEONG RIEUL-THIEUTH
+11b5 HANGUL JONGSEONG RIEUL-PHIEUPH
+11b6 HANGUL JONGSEONG RIEUL-HIEUH
+11b7 HANGUL JONGSEONG MIEUM
+11b8 HANGUL JONGSEONG PIEUP
+11b9 HANGUL JONGSEONG PIEUP-SIOS
+11ba HANGUL JONGSEONG SIOS
+11bb HANGUL JONGSEONG SSANGSIOS
+11bc HANGUL JONGSEONG IEUNG
+11bd HANGUL JONGSEONG CIEUC
+11be HANGUL JONGSEONG CHIEUCH
+11bf HANGUL JONGSEONG KHIEUKH
+11c0 HANGUL JONGSEONG THIEUTH
+11c1 HANGUL JONGSEONG PHIEUPH
+11c2 HANGUL JONGSEONG HIEUH
+11c3 HANGUL JONGSEONG KIYEOK-RIEUL
+11c4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11c5 HANGUL JONGSEONG NIEUN-KIYEOK
+11c6 HANGUL JONGSEONG NIEUN-TIKEUT
+11c7 HANGUL JONGSEONG NIEUN-SIOS
+11c8 HANGUL JONGSEONG NIEUN-PANSIOS
+11c9 HANGUL JONGSEONG NIEUN-THIEUTH
+11ca HANGUL JONGSEONG TIKEUT-KIYEOK
+11cb HANGUL JONGSEONG TIKEUT-RIEUL
+11cc HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11cd HANGUL JONGSEONG RIEUL-NIEUN
+11ce HANGUL JONGSEONG RIEUL-TIKEUT
+11cf HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11d0 HANGUL JONGSEONG SSANGRIEUL
+11d1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11d2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11d3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11d4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11d5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11d6 HANGUL JONGSEONG RIEUL-SSANGSIOS
+11d7 HANGUL JONGSEONG RIEUL-PANSIOS
+11d8 HANGUL JONGSEONG RIEUL-KHIEUKH
+11d9 HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11da HANGUL JONGSEONG MIEUM-KIYEOK
+11db HANGUL JONGSEONG MIEUM-RIEUL
+11dc HANGUL JONGSEONG MIEUM-PIEUP
+11dd HANGUL JONGSEONG MIEUM-SIOS
+11de HANGUL JONGSEONG MIEUM-SSANGSIOS
+11df HANGUL JONGSEONG MIEUM-PANSIOS
+11e0 HANGUL JONGSEONG MIEUM-CHIEUCH
+11e1 HANGUL JONGSEONG MIEUM-HIEUH
+11e2 HANGUL JONGSEONG KAPYEOUNMIEUM
+11e3 HANGUL JONGSEONG PIEUP-RIEUL
+11e4 HANGUL JONGSEONG PIEUP-PHIEUPH
+11e5 HANGUL JONGSEONG PIEUP-HIEUH
+11e6 HANGUL JONGSEONG KAPYEOUNPIEUP
+11e7 HANGUL JONGSEONG SIOS-KIYEOK
+11e8 HANGUL JONGSEONG SIOS-TIKEUT
+11e9 HANGUL JONGSEONG SIOS-RIEUL
+11ea HANGUL JONGSEONG SIOS-PIEUP
+11eb HANGUL JONGSEONG PANSIOS
+11ec HANGUL JONGSEONG IEUNG-KIYEOK
+11ed HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11ee HANGUL JONGSEONG SSANGIEUNG
+11ef HANGUL JONGSEONG IEUNG-KHIEUKH
+11f0 HANGUL JONGSEONG YESIEUNG
+11f1 HANGUL JONGSEONG YESIEUNG-SIOS
+11f2 HANGUL JONGSEONG YESIEUNG-PANSIOS
+11f3 HANGUL JONGSEONG PHIEUPH-PIEUP
+11f4 HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11f5 HANGUL JONGSEONG HIEUH-NIEUN
+11f6 HANGUL JONGSEONG HIEUH-RIEUL
+11f7 HANGUL JONGSEONG HIEUH-MIEUM
+11f8 HANGUL JONGSEONG HIEUH-PIEUP
+11f9 HANGUL JONGSEONG YEORINHIEUH
+1200 ETHIOPIC SYLLABLE HA
+1201 ETHIOPIC SYLLABLE HU
+1202 ETHIOPIC SYLLABLE HI
+1203 ETHIOPIC SYLLABLE HAA
+1204 ETHIOPIC SYLLABLE HEE
+1205 ETHIOPIC SYLLABLE HE
+1206 ETHIOPIC SYLLABLE HO
+1208 ETHIOPIC SYLLABLE LA
+1209 ETHIOPIC SYLLABLE LU
+120a ETHIOPIC SYLLABLE LI
+120b ETHIOPIC SYLLABLE LAA
+120c ETHIOPIC SYLLABLE LEE
+120d ETHIOPIC SYLLABLE LE
+120e ETHIOPIC SYLLABLE LO
+120f ETHIOPIC SYLLABLE LWA
+1210 ETHIOPIC SYLLABLE HHA
+1211 ETHIOPIC SYLLABLE HHU
+1212 ETHIOPIC SYLLABLE HHI
+1213 ETHIOPIC SYLLABLE HHAA
+1214 ETHIOPIC SYLLABLE HHEE
+1215 ETHIOPIC SYLLABLE HHE
+1216 ETHIOPIC SYLLABLE HHO
+1217 ETHIOPIC SYLLABLE HHWA
+1218 ETHIOPIC SYLLABLE MA
+1219 ETHIOPIC SYLLABLE MU
+121a ETHIOPIC SYLLABLE MI
+121b ETHIOPIC SYLLABLE MAA
+121c ETHIOPIC SYLLABLE MEE
+121d ETHIOPIC SYLLABLE ME
+121e ETHIOPIC SYLLABLE MO
+121f ETHIOPIC SYLLABLE MWA
+1220 ETHIOPIC SYLLABLE SZA
+1221 ETHIOPIC SYLLABLE SZU
+1222 ETHIOPIC SYLLABLE SZI
+1223 ETHIOPIC SYLLABLE SZAA
+1224 ETHIOPIC SYLLABLE SZEE
+1225 ETHIOPIC SYLLABLE SZE
+1226 ETHIOPIC SYLLABLE SZO
+1227 ETHIOPIC SYLLABLE SZWA
+1228 ETHIOPIC SYLLABLE RA
+1229 ETHIOPIC SYLLABLE RU
+122a ETHIOPIC SYLLABLE RI
+122b ETHIOPIC SYLLABLE RAA
+122c ETHIOPIC SYLLABLE REE
+122d ETHIOPIC SYLLABLE RE
+122e ETHIOPIC SYLLABLE RO
+122f ETHIOPIC SYLLABLE RWA
+1230 ETHIOPIC SYLLABLE SA
+1231 ETHIOPIC SYLLABLE SU
+1232 ETHIOPIC SYLLABLE SI
+1233 ETHIOPIC SYLLABLE SAA
+1234 ETHIOPIC SYLLABLE SEE
+1235 ETHIOPIC SYLLABLE SE
+1236 ETHIOPIC SYLLABLE SO
+1237 ETHIOPIC SYLLABLE SWA
+1238 ETHIOPIC SYLLABLE SHA
+1239 ETHIOPIC SYLLABLE SHU
+123a ETHIOPIC SYLLABLE SHI
+123b ETHIOPIC SYLLABLE SHAA
+123c ETHIOPIC SYLLABLE SHEE
+123d ETHIOPIC SYLLABLE SHE
+123e ETHIOPIC SYLLABLE SHO
+123f ETHIOPIC SYLLABLE SHWA
+1240 ETHIOPIC SYLLABLE QA
+1241 ETHIOPIC SYLLABLE QU
+1242 ETHIOPIC SYLLABLE QI
+1243 ETHIOPIC SYLLABLE QAA
+1244 ETHIOPIC SYLLABLE QEE
+1245 ETHIOPIC SYLLABLE QE
+1246 ETHIOPIC SYLLABLE QO
+1248 ETHIOPIC SYLLABLE QWA
+124a ETHIOPIC SYLLABLE QWI
+124b ETHIOPIC SYLLABLE QWAA
+124c ETHIOPIC SYLLABLE QWEE
+124d ETHIOPIC SYLLABLE QWE
+1250 ETHIOPIC SYLLABLE QHA
+1251 ETHIOPIC SYLLABLE QHU
+1252 ETHIOPIC SYLLABLE QHI
+1253 ETHIOPIC SYLLABLE QHAA
+1254 ETHIOPIC SYLLABLE QHEE
+1255 ETHIOPIC SYLLABLE QHE
+1256 ETHIOPIC SYLLABLE QHO
+1258 ETHIOPIC SYLLABLE QHWA
+125a ETHIOPIC SYLLABLE QHWI
+125b ETHIOPIC SYLLABLE QHWAA
+125c ETHIOPIC SYLLABLE QHWEE
+125d ETHIOPIC SYLLABLE QHWE
+1260 ETHIOPIC SYLLABLE BA
+1261 ETHIOPIC SYLLABLE BU
+1262 ETHIOPIC SYLLABLE BI
+1263 ETHIOPIC SYLLABLE BAA
+1264 ETHIOPIC SYLLABLE BEE
+1265 ETHIOPIC SYLLABLE BE
+1266 ETHIOPIC SYLLABLE BO
+1267 ETHIOPIC SYLLABLE BWA
+1268 ETHIOPIC SYLLABLE VA
+1269 ETHIOPIC SYLLABLE VU
+126a ETHIOPIC SYLLABLE VI
+126b ETHIOPIC SYLLABLE VAA
+126c ETHIOPIC SYLLABLE VEE
+126d ETHIOPIC SYLLABLE VE
+126e ETHIOPIC SYLLABLE VO
+126f ETHIOPIC SYLLABLE VWA
+1270 ETHIOPIC SYLLABLE TA
+1271 ETHIOPIC SYLLABLE TU
+1272 ETHIOPIC SYLLABLE TI
+1273 ETHIOPIC SYLLABLE TAA
+1274 ETHIOPIC SYLLABLE TEE
+1275 ETHIOPIC SYLLABLE TE
+1276 ETHIOPIC SYLLABLE TO
+1277 ETHIOPIC SYLLABLE TWA
+1278 ETHIOPIC SYLLABLE CA
+1279 ETHIOPIC SYLLABLE CU
+127a ETHIOPIC SYLLABLE CI
+127b ETHIOPIC SYLLABLE CAA
+127c ETHIOPIC SYLLABLE CEE
+127d ETHIOPIC SYLLABLE CE
+127e ETHIOPIC SYLLABLE CO
+127f ETHIOPIC SYLLABLE CWA
+1280 ETHIOPIC SYLLABLE XA
+1281 ETHIOPIC SYLLABLE XU
+1282 ETHIOPIC SYLLABLE XI
+1283 ETHIOPIC SYLLABLE XAA
+1284 ETHIOPIC SYLLABLE XEE
+1285 ETHIOPIC SYLLABLE XE
+1286 ETHIOPIC SYLLABLE XO
+1288 ETHIOPIC SYLLABLE XWA
+128a ETHIOPIC SYLLABLE XWI
+128b ETHIOPIC SYLLABLE XWAA
+128c ETHIOPIC SYLLABLE XWEE
+128d ETHIOPIC SYLLABLE XWE
+1290 ETHIOPIC SYLLABLE NA
+1291 ETHIOPIC SYLLABLE NU
+1292 ETHIOPIC SYLLABLE NI
+1293 ETHIOPIC SYLLABLE NAA
+1294 ETHIOPIC SYLLABLE NEE
+1295 ETHIOPIC SYLLABLE NE
+1296 ETHIOPIC SYLLABLE NO
+1297 ETHIOPIC SYLLABLE NWA
+1298 ETHIOPIC SYLLABLE NYA
+1299 ETHIOPIC SYLLABLE NYU
+129a ETHIOPIC SYLLABLE NYI
+129b ETHIOPIC SYLLABLE NYAA
+129c ETHIOPIC SYLLABLE NYEE
+129d ETHIOPIC SYLLABLE NYE
+129e ETHIOPIC SYLLABLE NYO
+129f ETHIOPIC SYLLABLE NYWA
+12a0 ETHIOPIC SYLLABLE GLOTTAL A
+12a1 ETHIOPIC SYLLABLE GLOTTAL U
+12a2 ETHIOPIC SYLLABLE GLOTTAL I
+12a3 ETHIOPIC SYLLABLE GLOTTAL AA
+12a4 ETHIOPIC SYLLABLE GLOTTAL EE
+12a5 ETHIOPIC SYLLABLE GLOTTAL E
+12a6 ETHIOPIC SYLLABLE GLOTTAL O
+12a7 ETHIOPIC SYLLABLE GLOTTAL WA
+12a8 ETHIOPIC SYLLABLE KA
+12a9 ETHIOPIC SYLLABLE KU
+12aa ETHIOPIC SYLLABLE KI
+12ab ETHIOPIC SYLLABLE KAA
+12ac ETHIOPIC SYLLABLE KEE
+12ad ETHIOPIC SYLLABLE KE
+12ae ETHIOPIC SYLLABLE KO
+12b0 ETHIOPIC SYLLABLE KWA
+12b2 ETHIOPIC SYLLABLE KWI
+12b3 ETHIOPIC SYLLABLE KWAA
+12b4 ETHIOPIC SYLLABLE KWEE
+12b5 ETHIOPIC SYLLABLE KWE
+12b8 ETHIOPIC SYLLABLE KXA
+12b9 ETHIOPIC SYLLABLE KXU
+12ba ETHIOPIC SYLLABLE KXI
+12bb ETHIOPIC SYLLABLE KXAA
+12bc ETHIOPIC SYLLABLE KXEE
+12bd ETHIOPIC SYLLABLE KXE
+12be ETHIOPIC SYLLABLE KXO
+12c0 ETHIOPIC SYLLABLE KXWA
+12c2 ETHIOPIC SYLLABLE KXWI
+12c3 ETHIOPIC SYLLABLE KXWAA
+12c4 ETHIOPIC SYLLABLE KXWEE
+12c5 ETHIOPIC SYLLABLE KXWE
+12c8 ETHIOPIC SYLLABLE WA
+12c9 ETHIOPIC SYLLABLE WU
+12ca ETHIOPIC SYLLABLE WI
+12cb ETHIOPIC SYLLABLE WAA
+12cc ETHIOPIC SYLLABLE WEE
+12cd ETHIOPIC SYLLABLE WE
+12ce ETHIOPIC SYLLABLE WO
+12d0 ETHIOPIC SYLLABLE PHARYNGEAL A
+12d1 ETHIOPIC SYLLABLE PHARYNGEAL U
+12d2 ETHIOPIC SYLLABLE PHARYNGEAL I
+12d3 ETHIOPIC SYLLABLE PHARYNGEAL AA
+12d4 ETHIOPIC SYLLABLE PHARYNGEAL EE
+12d5 ETHIOPIC SYLLABLE PHARYNGEAL E
+12d6 ETHIOPIC SYLLABLE PHARYNGEAL O
+12d8 ETHIOPIC SYLLABLE ZA
+12d9 ETHIOPIC SYLLABLE ZU
+12da ETHIOPIC SYLLABLE ZI
+12db ETHIOPIC SYLLABLE ZAA
+12dc ETHIOPIC SYLLABLE ZEE
+12dd ETHIOPIC SYLLABLE ZE
+12de ETHIOPIC SYLLABLE ZO
+12df ETHIOPIC SYLLABLE ZWA
+12e0 ETHIOPIC SYLLABLE ZHA
+12e1 ETHIOPIC SYLLABLE ZHU
+12e2 ETHIOPIC SYLLABLE ZHI
+12e3 ETHIOPIC SYLLABLE ZHAA
+12e4 ETHIOPIC SYLLABLE ZHEE
+12e5 ETHIOPIC SYLLABLE ZHE
+12e6 ETHIOPIC SYLLABLE ZHO
+12e7 ETHIOPIC SYLLABLE ZHWA
+12e8 ETHIOPIC SYLLABLE YA
+12e9 ETHIOPIC SYLLABLE YU
+12ea ETHIOPIC SYLLABLE YI
+12eb ETHIOPIC SYLLABLE YAA
+12ec ETHIOPIC SYLLABLE YEE
+12ed ETHIOPIC SYLLABLE YE
+12ee ETHIOPIC SYLLABLE YO
+12f0 ETHIOPIC SYLLABLE DA
+12f1 ETHIOPIC SYLLABLE DU
+12f2 ETHIOPIC SYLLABLE DI
+12f3 ETHIOPIC SYLLABLE DAA
+12f4 ETHIOPIC SYLLABLE DEE
+12f5 ETHIOPIC SYLLABLE DE
+12f6 ETHIOPIC SYLLABLE DO
+12f7 ETHIOPIC SYLLABLE DWA
+12f8 ETHIOPIC SYLLABLE DDA
+12f9 ETHIOPIC SYLLABLE DDU
+12fa ETHIOPIC SYLLABLE DDI
+12fb ETHIOPIC SYLLABLE DDAA
+12fc ETHIOPIC SYLLABLE DDEE
+12fd ETHIOPIC SYLLABLE DDE
+12fe ETHIOPIC SYLLABLE DDO
+12ff ETHIOPIC SYLLABLE DDWA
+1300 ETHIOPIC SYLLABLE JA
+1301 ETHIOPIC SYLLABLE JU
+1302 ETHIOPIC SYLLABLE JI
+1303 ETHIOPIC SYLLABLE JAA
+1304 ETHIOPIC SYLLABLE JEE
+1305 ETHIOPIC SYLLABLE JE
+1306 ETHIOPIC SYLLABLE JO
+1307 ETHIOPIC SYLLABLE JWA
+1308 ETHIOPIC SYLLABLE GA
+1309 ETHIOPIC SYLLABLE GU
+130a ETHIOPIC SYLLABLE GI
+130b ETHIOPIC SYLLABLE GAA
+130c ETHIOPIC SYLLABLE GEE
+130d ETHIOPIC SYLLABLE GE
+130e ETHIOPIC SYLLABLE GO
+1310 ETHIOPIC SYLLABLE GWA
+1312 ETHIOPIC SYLLABLE GWI
+1313 ETHIOPIC SYLLABLE GWAA
+1314 ETHIOPIC SYLLABLE GWEE
+1315 ETHIOPIC SYLLABLE GWE
+1318 ETHIOPIC SYLLABLE GGA
+1319 ETHIOPIC SYLLABLE GGU
+131a ETHIOPIC SYLLABLE GGI
+131b ETHIOPIC SYLLABLE GGAA
+131c ETHIOPIC SYLLABLE GGEE
+131d ETHIOPIC SYLLABLE GGE
+131e ETHIOPIC SYLLABLE GGO
+1320 ETHIOPIC SYLLABLE THA
+1321 ETHIOPIC SYLLABLE THU
+1322 ETHIOPIC SYLLABLE THI
+1323 ETHIOPIC SYLLABLE THAA
+1324 ETHIOPIC SYLLABLE THEE
+1325 ETHIOPIC SYLLABLE THE
+1326 ETHIOPIC SYLLABLE THO
+1327 ETHIOPIC SYLLABLE THWA
+1328 ETHIOPIC SYLLABLE CHA
+1329 ETHIOPIC SYLLABLE CHU
+132a ETHIOPIC SYLLABLE CHI
+132b ETHIOPIC SYLLABLE CHAA
+132c ETHIOPIC SYLLABLE CHEE
+132d ETHIOPIC SYLLABLE CHE
+132e ETHIOPIC SYLLABLE CHO
+132f ETHIOPIC SYLLABLE CHWA
+1330 ETHIOPIC SYLLABLE PHA
+1331 ETHIOPIC SYLLABLE PHU
+1332 ETHIOPIC SYLLABLE PHI
+1333 ETHIOPIC SYLLABLE PHAA
+1334 ETHIOPIC SYLLABLE PHEE
+1335 ETHIOPIC SYLLABLE PHE
+1336 ETHIOPIC SYLLABLE PHO
+1337 ETHIOPIC SYLLABLE PHWA
+1338 ETHIOPIC SYLLABLE TSA
+1339 ETHIOPIC SYLLABLE TSU
+133a ETHIOPIC SYLLABLE TSI
+133b ETHIOPIC SYLLABLE TSAA
+133c ETHIOPIC SYLLABLE TSEE
+133d ETHIOPIC SYLLABLE TSE
+133e ETHIOPIC SYLLABLE TSO
+133f ETHIOPIC SYLLABLE TSWA
+1340 ETHIOPIC SYLLABLE TZA
+1341 ETHIOPIC SYLLABLE TZU
+1342 ETHIOPIC SYLLABLE TZI
+1343 ETHIOPIC SYLLABLE TZAA
+1344 ETHIOPIC SYLLABLE TZEE
+1345 ETHIOPIC SYLLABLE TZE
+1346 ETHIOPIC SYLLABLE TZO
+1348 ETHIOPIC SYLLABLE FA
+1349 ETHIOPIC SYLLABLE FU
+134a ETHIOPIC SYLLABLE FI
+134b ETHIOPIC SYLLABLE FAA
+134c ETHIOPIC SYLLABLE FEE
+134d ETHIOPIC SYLLABLE FE
+134e ETHIOPIC SYLLABLE FO
+134f ETHIOPIC SYLLABLE FWA
+1350 ETHIOPIC SYLLABLE PA
+1351 ETHIOPIC SYLLABLE PU
+1352 ETHIOPIC SYLLABLE PI
+1353 ETHIOPIC SYLLABLE PAA
+1354 ETHIOPIC SYLLABLE PEE
+1355 ETHIOPIC SYLLABLE PE
+1356 ETHIOPIC SYLLABLE PO
+1357 ETHIOPIC SYLLABLE PWA
+1358 ETHIOPIC SYLLABLE RYA
+1359 ETHIOPIC SYLLABLE MYA
+135a ETHIOPIC SYLLABLE FYA
+1361 ETHIOPIC WORDSPACE
+1362 ETHIOPIC FULL STOP
+1363 ETHIOPIC COMMA
+1364 ETHIOPIC SEMICOLON
+1365 ETHIOPIC COLON
+1366 ETHIOPIC PREFACE COLON
+1367 ETHIOPIC QUESTION MARK
+1368 ETHIOPIC PARAGRAPH SEPARATOR
+1369 ETHIOPIC DIGIT ONE
+136a ETHIOPIC DIGIT TWO
+136b ETHIOPIC DIGIT THREE
+136c ETHIOPIC DIGIT FOUR
+136d ETHIOPIC DIGIT FIVE
+136e ETHIOPIC DIGIT SIX
+136f ETHIOPIC DIGIT SEVEN
+1370 ETHIOPIC DIGIT EIGHT
+1371 ETHIOPIC DIGIT NINE
+1372 ETHIOPIC NUMBER TEN
+1373 ETHIOPIC NUMBER TWENTY
+1374 ETHIOPIC NUMBER THIRTY
+1375 ETHIOPIC NUMBER FORTY
+1376 ETHIOPIC NUMBER FIFTY
+1377 ETHIOPIC NUMBER SIXTY
+1378 ETHIOPIC NUMBER SEVENTY
+1379 ETHIOPIC NUMBER EIGHTY
+137a ETHIOPIC NUMBER NINETY
+137b ETHIOPIC NUMBER HUNDRED
+137c ETHIOPIC NUMBER TEN THOUSAND
+13a0 CHEROKEE LETTER A
+13a1 CHEROKEE LETTER E
+13a2 CHEROKEE LETTER I
+13a3 CHEROKEE LETTER O
+13a4 CHEROKEE LETTER U
+13a5 CHEROKEE LETTER V
+13a6 CHEROKEE LETTER GA
+13a7 CHEROKEE LETTER KA
+13a8 CHEROKEE LETTER GE
+13a9 CHEROKEE LETTER GI
+13aa CHEROKEE LETTER GO
+13ab CHEROKEE LETTER GU
+13ac CHEROKEE LETTER GV
+13ad CHEROKEE LETTER HA
+13ae CHEROKEE LETTER HE
+13af CHEROKEE LETTER HI
+13b0 CHEROKEE LETTER HO
+13b1 CHEROKEE LETTER HU
+13b2 CHEROKEE LETTER HV
+13b3 CHEROKEE LETTER LA
+13b4 CHEROKEE LETTER LE
+13b5 CHEROKEE LETTER LI
+13b6 CHEROKEE LETTER LO
+13b7 CHEROKEE LETTER LU
+13b8 CHEROKEE LETTER LV
+13b9 CHEROKEE LETTER MA
+13ba CHEROKEE LETTER ME
+13bb CHEROKEE LETTER MI
+13bc CHEROKEE LETTER MO
+13bd CHEROKEE LETTER MU
+13be CHEROKEE LETTER NA
+13bf CHEROKEE LETTER HNA
+13c0 CHEROKEE LETTER NAH
+13c1 CHEROKEE LETTER NE
+13c2 CHEROKEE LETTER NI
+13c3 CHEROKEE LETTER NO
+13c4 CHEROKEE LETTER NU
+13c5 CHEROKEE LETTER NV
+13c6 CHEROKEE LETTER QUA
+13c7 CHEROKEE LETTER QUE
+13c8 CHEROKEE LETTER QUI
+13c9 CHEROKEE LETTER QUO
+13ca CHEROKEE LETTER QUU
+13cb CHEROKEE LETTER QUV
+13cc CHEROKEE LETTER SA
+13cd CHEROKEE LETTER S
+13ce CHEROKEE LETTER SE
+13cf CHEROKEE LETTER SI
+13d0 CHEROKEE LETTER SO
+13d1 CHEROKEE LETTER SU
+13d2 CHEROKEE LETTER SV
+13d3 CHEROKEE LETTER DA
+13d4 CHEROKEE LETTER TA
+13d5 CHEROKEE LETTER DE
+13d6 CHEROKEE LETTER TE
+13d7 CHEROKEE LETTER DI
+13d8 CHEROKEE LETTER TI
+13d9 CHEROKEE LETTER DO
+13da CHEROKEE LETTER DU
+13db CHEROKEE LETTER DV
+13dc CHEROKEE LETTER DLA
+13dd CHEROKEE LETTER TLA
+13de CHEROKEE LETTER TLE
+13df CHEROKEE LETTER TLI
+13e0 CHEROKEE LETTER TLO
+13e1 CHEROKEE LETTER TLU
+13e2 CHEROKEE LETTER TLV
+13e3 CHEROKEE LETTER TSA
+13e4 CHEROKEE LETTER TSE
+13e5 CHEROKEE LETTER TSI
+13e6 CHEROKEE LETTER TSO
+13e7 CHEROKEE LETTER TSU
+13e8 CHEROKEE LETTER TSV
+13e9 CHEROKEE LETTER WA
+13ea CHEROKEE LETTER WE
+13eb CHEROKEE LETTER WI
+13ec CHEROKEE LETTER WO
+13ed CHEROKEE LETTER WU
+13ee CHEROKEE LETTER WV
+13ef CHEROKEE LETTER YA
+13f0 CHEROKEE LETTER YE
+13f1 CHEROKEE LETTER YI
+13f2 CHEROKEE LETTER YO
+13f3 CHEROKEE LETTER YU
+13f4 CHEROKEE LETTER YV
+1401 CANADIAN SYLLABICS E
+1402 CANADIAN SYLLABICS AAI
+1403 CANADIAN SYLLABICS I
+1404 CANADIAN SYLLABICS II
+1405 CANADIAN SYLLABICS O
+1406 CANADIAN SYLLABICS OO
+1407 CANADIAN SYLLABICS Y-CREE OO
+1408 CANADIAN SYLLABICS CARRIER EE
+1409 CANADIAN SYLLABICS CARRIER I
+140a CANADIAN SYLLABICS A
+140b CANADIAN SYLLABICS AA
+140c CANADIAN SYLLABICS WE
+140d CANADIAN SYLLABICS WEST-CREE WE
+140e CANADIAN SYLLABICS WI
+140f CANADIAN SYLLABICS WEST-CREE WI
+1410 CANADIAN SYLLABICS WII
+1411 CANADIAN SYLLABICS WEST-CREE WII
+1412 CANADIAN SYLLABICS WO
+1413 CANADIAN SYLLABICS WEST-CREE WO
+1414 CANADIAN SYLLABICS WOO
+1415 CANADIAN SYLLABICS WEST-CREE WOO
+1416 CANADIAN SYLLABICS NASKAPI WOO
+1417 CANADIAN SYLLABICS WA
+1418 CANADIAN SYLLABICS WEST-CREE WA
+1419 CANADIAN SYLLABICS WAA
+141a CANADIAN SYLLABICS WEST-CREE WAA
+141b CANADIAN SYLLABICS NASKAPI WAA
+141c CANADIAN SYLLABICS AI
+141d CANADIAN SYLLABICS Y-CREE W
+141e CANADIAN SYLLABICS GLOTTAL STOP
+141f CANADIAN SYLLABICS FINAL ACUTE
+1420 CANADIAN SYLLABICS FINAL GRAVE
+1421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422 CANADIAN SYLLABICS FINAL TOP HALF RING
+1423 CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424 CANADIAN SYLLABICS FINAL RING
+1425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427 CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429 CANADIAN SYLLABICS FINAL PLUS
+142a CANADIAN SYLLABICS FINAL DOWN TACK
+142b CANADIAN SYLLABICS EN
+142c CANADIAN SYLLABICS IN
+142d CANADIAN SYLLABICS ON
+142e CANADIAN SYLLABICS AN
+142f CANADIAN SYLLABICS PE
+1430 CANADIAN SYLLABICS PAAI
+1431 CANADIAN SYLLABICS PI
+1432 CANADIAN SYLLABICS PII
+1433 CANADIAN SYLLABICS PO
+1434 CANADIAN SYLLABICS POO
+1435 CANADIAN SYLLABICS Y-CREE POO
+1436 CANADIAN SYLLABICS CARRIER HEE
+1437 CANADIAN SYLLABICS CARRIER HI
+1438 CANADIAN SYLLABICS PA
+1439 CANADIAN SYLLABICS PAA
+143a CANADIAN SYLLABICS PWE
+143b CANADIAN SYLLABICS WEST-CREE PWE
+143c CANADIAN SYLLABICS PWI
+143d CANADIAN SYLLABICS WEST-CREE PWI
+143e CANADIAN SYLLABICS PWII
+143f CANADIAN SYLLABICS WEST-CREE PWII
+1440 CANADIAN SYLLABICS PWO
+1441 CANADIAN SYLLABICS WEST-CREE PWO
+1442 CANADIAN SYLLABICS PWOO
+1443 CANADIAN SYLLABICS WEST-CREE PWOO
+1444 CANADIAN SYLLABICS PWA
+1445 CANADIAN SYLLABICS WEST-CREE PWA
+1446 CANADIAN SYLLABICS PWAA
+1447 CANADIAN SYLLABICS WEST-CREE PWAA
+1448 CANADIAN SYLLABICS Y-CREE PWAA
+1449 CANADIAN SYLLABICS P
+144a CANADIAN SYLLABICS WEST-CREE P
+144b CANADIAN SYLLABICS CARRIER H
+144c CANADIAN SYLLABICS TE
+144d CANADIAN SYLLABICS TAAI
+144e CANADIAN SYLLABICS TI
+144f CANADIAN SYLLABICS TII
+1450 CANADIAN SYLLABICS TO
+1451 CANADIAN SYLLABICS TOO
+1452 CANADIAN SYLLABICS Y-CREE TOO
+1453 CANADIAN SYLLABICS CARRIER DEE
+1454 CANADIAN SYLLABICS CARRIER DI
+1455 CANADIAN SYLLABICS TA
+1456 CANADIAN SYLLABICS TAA
+1457 CANADIAN SYLLABICS TWE
+1458 CANADIAN SYLLABICS WEST-CREE TWE
+1459 CANADIAN SYLLABICS TWI
+145a CANADIAN SYLLABICS WEST-CREE TWI
+145b CANADIAN SYLLABICS TWII
+145c CANADIAN SYLLABICS WEST-CREE TWII
+145d CANADIAN SYLLABICS TWO
+145e CANADIAN SYLLABICS WEST-CREE TWO
+145f CANADIAN SYLLABICS TWOO
+1460 CANADIAN SYLLABICS WEST-CREE TWOO
+1461 CANADIAN SYLLABICS TWA
+1462 CANADIAN SYLLABICS WEST-CREE TWA
+1463 CANADIAN SYLLABICS TWAA
+1464 CANADIAN SYLLABICS WEST-CREE TWAA
+1465 CANADIAN SYLLABICS NASKAPI TWAA
+1466 CANADIAN SYLLABICS T
+1467 CANADIAN SYLLABICS TTE
+1468 CANADIAN SYLLABICS TTI
+1469 CANADIAN SYLLABICS TTO
+146a CANADIAN SYLLABICS TTA
+146b CANADIAN SYLLABICS KE
+146c CANADIAN SYLLABICS KAAI
+146d CANADIAN SYLLABICS KI
+146e CANADIAN SYLLABICS KII
+146f CANADIAN SYLLABICS KO
+1470 CANADIAN SYLLABICS KOO
+1471 CANADIAN SYLLABICS Y-CREE KOO
+1472 CANADIAN SYLLABICS KA
+1473 CANADIAN SYLLABICS KAA
+1474 CANADIAN SYLLABICS KWE
+1475 CANADIAN SYLLABICS WEST-CREE KWE
+1476 CANADIAN SYLLABICS KWI
+1477 CANADIAN SYLLABICS WEST-CREE KWI
+1478 CANADIAN SYLLABICS KWII
+1479 CANADIAN SYLLABICS WEST-CREE KWII
+147a CANADIAN SYLLABICS KWO
+147b CANADIAN SYLLABICS WEST-CREE KWO
+147c CANADIAN SYLLABICS KWOO
+147d CANADIAN SYLLABICS WEST-CREE KWOO
+147e CANADIAN SYLLABICS KWA
+147f CANADIAN SYLLABICS WEST-CREE KWA
+1480 CANADIAN SYLLABICS KWAA
+1481 CANADIAN SYLLABICS WEST-CREE KWAA
+1482 CANADIAN SYLLABICS NASKAPI KWAA
+1483 CANADIAN SYLLABICS K
+1484 CANADIAN SYLLABICS KW
+1485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489 CANADIAN SYLLABICS CE
+148a CANADIAN SYLLABICS CAAI
+148b CANADIAN SYLLABICS CI
+148c CANADIAN SYLLABICS CII
+148d CANADIAN SYLLABICS CO
+148e CANADIAN SYLLABICS COO
+148f CANADIAN SYLLABICS Y-CREE COO
+1490 CANADIAN SYLLABICS CA
+1491 CANADIAN SYLLABICS CAA
+1492 CANADIAN SYLLABICS CWE
+1493 CANADIAN SYLLABICS WEST-CREE CWE
+1494 CANADIAN SYLLABICS CWI
+1495 CANADIAN SYLLABICS WEST-CREE CWI
+1496 CANADIAN SYLLABICS CWII
+1497 CANADIAN SYLLABICS WEST-CREE CWII
+1498 CANADIAN SYLLABICS CWO
+1499 CANADIAN SYLLABICS WEST-CREE CWO
+149a CANADIAN SYLLABICS CWOO
+149b CANADIAN SYLLABICS WEST-CREE CWOO
+149c CANADIAN SYLLABICS CWA
+149d CANADIAN SYLLABICS WEST-CREE CWA
+149e CANADIAN SYLLABICS CWAA
+149f CANADIAN SYLLABICS WEST-CREE CWAA
+14a0 CANADIAN SYLLABICS NASKAPI CWAA
+14a1 CANADIAN SYLLABICS C
+14a2 CANADIAN SYLLABICS SAYISI TH
+14a3 CANADIAN SYLLABICS ME
+14a4 CANADIAN SYLLABICS MAAI
+14a5 CANADIAN SYLLABICS MI
+14a6 CANADIAN SYLLABICS MII
+14a7 CANADIAN SYLLABICS MO
+14a8 CANADIAN SYLLABICS MOO
+14a9 CANADIAN SYLLABICS Y-CREE MOO
+14aa CANADIAN SYLLABICS MA
+14ab CANADIAN SYLLABICS MAA
+14ac CANADIAN SYLLABICS MWE
+14ad CANADIAN SYLLABICS WEST-CREE MWE
+14ae CANADIAN SYLLABICS MWI
+14af CANADIAN SYLLABICS WEST-CREE MWI
+14b0 CANADIAN SYLLABICS MWII
+14b1 CANADIAN SYLLABICS WEST-CREE MWII
+14b2 CANADIAN SYLLABICS MWO
+14b3 CANADIAN SYLLABICS WEST-CREE MWO
+14b4 CANADIAN SYLLABICS MWOO
+14b5 CANADIAN SYLLABICS WEST-CREE MWOO
+14b6 CANADIAN SYLLABICS MWA
+14b7 CANADIAN SYLLABICS WEST-CREE MWA
+14b8 CANADIAN SYLLABICS MWAA
+14b9 CANADIAN SYLLABICS WEST-CREE MWAA
+14ba CANADIAN SYLLABICS NASKAPI MWAA
+14bb CANADIAN SYLLABICS M
+14bc CANADIAN SYLLABICS WEST-CREE M
+14bd CANADIAN SYLLABICS MH
+14be CANADIAN SYLLABICS ATHAPASCAN M
+14bf CANADIAN SYLLABICS SAYISI M
+14c0 CANADIAN SYLLABICS NE
+14c1 CANADIAN SYLLABICS NAAI
+14c2 CANADIAN SYLLABICS NI
+14c3 CANADIAN SYLLABICS NII
+14c4 CANADIAN SYLLABICS NO
+14c5 CANADIAN SYLLABICS NOO
+14c6 CANADIAN SYLLABICS Y-CREE NOO
+14c7 CANADIAN SYLLABICS NA
+14c8 CANADIAN SYLLABICS NAA
+14c9 CANADIAN SYLLABICS NWE
+14ca CANADIAN SYLLABICS WEST-CREE NWE
+14cb CANADIAN SYLLABICS NWA
+14cc CANADIAN SYLLABICS WEST-CREE NWA
+14cd CANADIAN SYLLABICS NWAA
+14ce CANADIAN SYLLABICS WEST-CREE NWAA
+14cf CANADIAN SYLLABICS NASKAPI NWAA
+14d0 CANADIAN SYLLABICS N
+14d1 CANADIAN SYLLABICS CARRIER NG
+14d2 CANADIAN SYLLABICS NH
+14d3 CANADIAN SYLLABICS LE
+14d4 CANADIAN SYLLABICS LAAI
+14d5 CANADIAN SYLLABICS LI
+14d6 CANADIAN SYLLABICS LII
+14d7 CANADIAN SYLLABICS LO
+14d8 CANADIAN SYLLABICS LOO
+14d9 CANADIAN SYLLABICS Y-CREE LOO
+14da CANADIAN SYLLABICS LA
+14db CANADIAN SYLLABICS LAA
+14dc CANADIAN SYLLABICS LWE
+14dd CANADIAN SYLLABICS WEST-CREE LWE
+14de CANADIAN SYLLABICS LWI
+14df CANADIAN SYLLABICS WEST-CREE LWI
+14e0 CANADIAN SYLLABICS LWII
+14e1 CANADIAN SYLLABICS WEST-CREE LWII
+14e2 CANADIAN SYLLABICS LWO
+14e3 CANADIAN SYLLABICS WEST-CREE LWO
+14e4 CANADIAN SYLLABICS LWOO
+14e5 CANADIAN SYLLABICS WEST-CREE LWOO
+14e6 CANADIAN SYLLABICS LWA
+14e7 CANADIAN SYLLABICS WEST-CREE LWA
+14e8 CANADIAN SYLLABICS LWAA
+14e9 CANADIAN SYLLABICS WEST-CREE LWAA
+14ea CANADIAN SYLLABICS L
+14eb CANADIAN SYLLABICS WEST-CREE L
+14ec CANADIAN SYLLABICS MEDIAL L
+14ed CANADIAN SYLLABICS SE
+14ee CANADIAN SYLLABICS SAAI
+14ef CANADIAN SYLLABICS SI
+14f0 CANADIAN SYLLABICS SII
+14f1 CANADIAN SYLLABICS SO
+14f2 CANADIAN SYLLABICS SOO
+14f3 CANADIAN SYLLABICS Y-CREE SOO
+14f4 CANADIAN SYLLABICS SA
+14f5 CANADIAN SYLLABICS SAA
+14f6 CANADIAN SYLLABICS SWE
+14f7 CANADIAN SYLLABICS WEST-CREE SWE
+14f8 CANADIAN SYLLABICS SWI
+14f9 CANADIAN SYLLABICS WEST-CREE SWI
+14fa CANADIAN SYLLABICS SWII
+14fb CANADIAN SYLLABICS WEST-CREE SWII
+14fc CANADIAN SYLLABICS SWO
+14fd CANADIAN SYLLABICS WEST-CREE SWO
+14fe CANADIAN SYLLABICS SWOO
+14ff CANADIAN SYLLABICS WEST-CREE SWOO
+1500 CANADIAN SYLLABICS SWA
+1501 CANADIAN SYLLABICS WEST-CREE SWA
+1502 CANADIAN SYLLABICS SWAA
+1503 CANADIAN SYLLABICS WEST-CREE SWAA
+1504 CANADIAN SYLLABICS NASKAPI SWAA
+1505 CANADIAN SYLLABICS S
+1506 CANADIAN SYLLABICS ATHAPASCAN S
+1507 CANADIAN SYLLABICS SW
+1508 CANADIAN SYLLABICS BLACKFOOT S
+1509 CANADIAN SYLLABICS MOOSE-CREE SK
+150a CANADIAN SYLLABICS NASKAPI SKW
+150b CANADIAN SYLLABICS NASKAPI S-W
+150c CANADIAN SYLLABICS NASKAPI SPWA
+150d CANADIAN SYLLABICS NASKAPI STWA
+150e CANADIAN SYLLABICS NASKAPI SKWA
+150f CANADIAN SYLLABICS NASKAPI SCWA
+1510 CANADIAN SYLLABICS SHE
+1511 CANADIAN SYLLABICS SHI
+1512 CANADIAN SYLLABICS SHII
+1513 CANADIAN SYLLABICS SHO
+1514 CANADIAN SYLLABICS SHOO
+1515 CANADIAN SYLLABICS SHA
+1516 CANADIAN SYLLABICS SHAA
+1517 CANADIAN SYLLABICS SHWE
+1518 CANADIAN SYLLABICS WEST-CREE SHWE
+1519 CANADIAN SYLLABICS SHWI
+151a CANADIAN SYLLABICS WEST-CREE SHWI
+151b CANADIAN SYLLABICS SHWII
+151c CANADIAN SYLLABICS WEST-CREE SHWII
+151d CANADIAN SYLLABICS SHWO
+151e CANADIAN SYLLABICS WEST-CREE SHWO
+151f CANADIAN SYLLABICS SHWOO
+1520 CANADIAN SYLLABICS WEST-CREE SHWOO
+1521 CANADIAN SYLLABICS SHWA
+1522 CANADIAN SYLLABICS WEST-CREE SHWA
+1523 CANADIAN SYLLABICS SHWAA
+1524 CANADIAN SYLLABICS WEST-CREE SHWAA
+1525 CANADIAN SYLLABICS SH
+1526 CANADIAN SYLLABICS YE
+1527 CANADIAN SYLLABICS YAAI
+1528 CANADIAN SYLLABICS YI
+1529 CANADIAN SYLLABICS YII
+152a CANADIAN SYLLABICS YO
+152b CANADIAN SYLLABICS YOO
+152c CANADIAN SYLLABICS Y-CREE YOO
+152d CANADIAN SYLLABICS YA
+152e CANADIAN SYLLABICS YAA
+152f CANADIAN SYLLABICS YWE
+1530 CANADIAN SYLLABICS WEST-CREE YWE
+1531 CANADIAN SYLLABICS YWI
+1532 CANADIAN SYLLABICS WEST-CREE YWI
+1533 CANADIAN SYLLABICS YWII
+1534 CANADIAN SYLLABICS WEST-CREE YWII
+1535 CANADIAN SYLLABICS YWO
+1536 CANADIAN SYLLABICS WEST-CREE YWO
+1537 CANADIAN SYLLABICS YWOO
+1538 CANADIAN SYLLABICS WEST-CREE YWOO
+1539 CANADIAN SYLLABICS YWA
+153a CANADIAN SYLLABICS WEST-CREE YWA
+153b CANADIAN SYLLABICS YWAA
+153c CANADIAN SYLLABICS WEST-CREE YWAA
+153d CANADIAN SYLLABICS NASKAPI YWAA
+153e CANADIAN SYLLABICS Y
+153f CANADIAN SYLLABICS BIBLE-CREE Y
+1540 CANADIAN SYLLABICS WEST-CREE Y
+1541 CANADIAN SYLLABICS SAYISI YI
+1542 CANADIAN SYLLABICS RE
+1543 CANADIAN SYLLABICS R-CREE RE
+1544 CANADIAN SYLLABICS WEST-CREE LE
+1545 CANADIAN SYLLABICS RAAI
+1546 CANADIAN SYLLABICS RI
+1547 CANADIAN SYLLABICS RII
+1548 CANADIAN SYLLABICS RO
+1549 CANADIAN SYLLABICS ROO
+154a CANADIAN SYLLABICS WEST-CREE LO
+154b CANADIAN SYLLABICS RA
+154c CANADIAN SYLLABICS RAA
+154d CANADIAN SYLLABICS WEST-CREE LA
+154e CANADIAN SYLLABICS RWAA
+154f CANADIAN SYLLABICS WEST-CREE RWAA
+1550 CANADIAN SYLLABICS R
+1551 CANADIAN SYLLABICS WEST-CREE R
+1552 CANADIAN SYLLABICS MEDIAL R
+1553 CANADIAN SYLLABICS FE
+1554 CANADIAN SYLLABICS FAAI
+1555 CANADIAN SYLLABICS FI
+1556 CANADIAN SYLLABICS FII
+1557 CANADIAN SYLLABICS FO
+1558 CANADIAN SYLLABICS FOO
+1559 CANADIAN SYLLABICS FA
+155a CANADIAN SYLLABICS FAA
+155b CANADIAN SYLLABICS FWAA
+155c CANADIAN SYLLABICS WEST-CREE FWAA
+155d CANADIAN SYLLABICS F
+155e CANADIAN SYLLABICS THE
+155f CANADIAN SYLLABICS N-CREE THE
+1560 CANADIAN SYLLABICS THI
+1561 CANADIAN SYLLABICS N-CREE THI
+1562 CANADIAN SYLLABICS THII
+1563 CANADIAN SYLLABICS N-CREE THII
+1564 CANADIAN SYLLABICS THO
+1565 CANADIAN SYLLABICS THOO
+1566 CANADIAN SYLLABICS THA
+1567 CANADIAN SYLLABICS THAA
+1568 CANADIAN SYLLABICS THWAA
+1569 CANADIAN SYLLABICS WEST-CREE THWAA
+156a CANADIAN SYLLABICS TH
+156b CANADIAN SYLLABICS TTHE
+156c CANADIAN SYLLABICS TTHI
+156d CANADIAN SYLLABICS TTHO
+156e CANADIAN SYLLABICS TTHA
+156f CANADIAN SYLLABICS TTH
+1570 CANADIAN SYLLABICS TYE
+1571 CANADIAN SYLLABICS TYI
+1572 CANADIAN SYLLABICS TYO
+1573 CANADIAN SYLLABICS TYA
+1574 CANADIAN SYLLABICS NUNAVIK HE
+1575 CANADIAN SYLLABICS NUNAVIK HI
+1576 CANADIAN SYLLABICS NUNAVIK HII
+1577 CANADIAN SYLLABICS NUNAVIK HO
+1578 CANADIAN SYLLABICS NUNAVIK HOO
+1579 CANADIAN SYLLABICS NUNAVIK HA
+157a CANADIAN SYLLABICS NUNAVIK HAA
+157b CANADIAN SYLLABICS NUNAVIK H
+157c CANADIAN SYLLABICS NUNAVUT H
+157d CANADIAN SYLLABICS HK
+157e CANADIAN SYLLABICS QAAI
+157f CANADIAN SYLLABICS QI
+1580 CANADIAN SYLLABICS QII
+1581 CANADIAN SYLLABICS QO
+1582 CANADIAN SYLLABICS QOO
+1583 CANADIAN SYLLABICS QA
+1584 CANADIAN SYLLABICS QAA
+1585 CANADIAN SYLLABICS Q
+1586 CANADIAN SYLLABICS TLHE
+1587 CANADIAN SYLLABICS TLHI
+1588 CANADIAN SYLLABICS TLHO
+1589 CANADIAN SYLLABICS TLHA
+158a CANADIAN SYLLABICS WEST-CREE RE
+158b CANADIAN SYLLABICS WEST-CREE RI
+158c CANADIAN SYLLABICS WEST-CREE RO
+158d CANADIAN SYLLABICS WEST-CREE RA
+158e CANADIAN SYLLABICS NGAAI
+158f CANADIAN SYLLABICS NGI
+1590 CANADIAN SYLLABICS NGII
+1591 CANADIAN SYLLABICS NGO
+1592 CANADIAN SYLLABICS NGOO
+1593 CANADIAN SYLLABICS NGA
+1594 CANADIAN SYLLABICS NGAA
+1595 CANADIAN SYLLABICS NG
+1596 CANADIAN SYLLABICS NNG
+1597 CANADIAN SYLLABICS SAYISI SHE
+1598 CANADIAN SYLLABICS SAYISI SHI
+1599 CANADIAN SYLLABICS SAYISI SHO
+159a CANADIAN SYLLABICS SAYISI SHA
+159b CANADIAN SYLLABICS WOODS-CREE THE
+159c CANADIAN SYLLABICS WOODS-CREE THI
+159d CANADIAN SYLLABICS WOODS-CREE THO
+159e CANADIAN SYLLABICS WOODS-CREE THA
+159f CANADIAN SYLLABICS WOODS-CREE TH
+15a0 CANADIAN SYLLABICS LHI
+15a1 CANADIAN SYLLABICS LHII
+15a2 CANADIAN SYLLABICS LHO
+15a3 CANADIAN SYLLABICS LHOO
+15a4 CANADIAN SYLLABICS LHA
+15a5 CANADIAN SYLLABICS LHAA
+15a6 CANADIAN SYLLABICS LH
+15a7 CANADIAN SYLLABICS TH-CREE THE
+15a8 CANADIAN SYLLABICS TH-CREE THI
+15a9 CANADIAN SYLLABICS TH-CREE THII
+15aa CANADIAN SYLLABICS TH-CREE THO
+15ab CANADIAN SYLLABICS TH-CREE THOO
+15ac CANADIAN SYLLABICS TH-CREE THA
+15ad CANADIAN SYLLABICS TH-CREE THAA
+15ae CANADIAN SYLLABICS TH-CREE TH
+15af CANADIAN SYLLABICS AIVILIK B
+15b0 CANADIAN SYLLABICS BLACKFOOT E
+15b1 CANADIAN SYLLABICS BLACKFOOT I
+15b2 CANADIAN SYLLABICS BLACKFOOT O
+15b3 CANADIAN SYLLABICS BLACKFOOT A
+15b4 CANADIAN SYLLABICS BLACKFOOT WE
+15b5 CANADIAN SYLLABICS BLACKFOOT WI
+15b6 CANADIAN SYLLABICS BLACKFOOT WO
+15b7 CANADIAN SYLLABICS BLACKFOOT WA
+15b8 CANADIAN SYLLABICS BLACKFOOT NE
+15b9 CANADIAN SYLLABICS BLACKFOOT NI
+15ba CANADIAN SYLLABICS BLACKFOOT NO
+15bb CANADIAN SYLLABICS BLACKFOOT NA
+15bc CANADIAN SYLLABICS BLACKFOOT KE
+15bd CANADIAN SYLLABICS BLACKFOOT KI
+15be CANADIAN SYLLABICS BLACKFOOT KO
+15bf CANADIAN SYLLABICS BLACKFOOT KA
+15c0 CANADIAN SYLLABICS SAYISI HE
+15c1 CANADIAN SYLLABICS SAYISI HI
+15c2 CANADIAN SYLLABICS SAYISI HO
+15c3 CANADIAN SYLLABICS SAYISI HA
+15c4 CANADIAN SYLLABICS CARRIER GHU
+15c5 CANADIAN SYLLABICS CARRIER GHO
+15c6 CANADIAN SYLLABICS CARRIER GHE
+15c7 CANADIAN SYLLABICS CARRIER GHEE
+15c8 CANADIAN SYLLABICS CARRIER GHI
+15c9 CANADIAN SYLLABICS CARRIER GHA
+15ca CANADIAN SYLLABICS CARRIER RU
+15cb CANADIAN SYLLABICS CARRIER RO
+15cc CANADIAN SYLLABICS CARRIER RE
+15cd CANADIAN SYLLABICS CARRIER REE
+15ce CANADIAN SYLLABICS CARRIER RI
+15cf CANADIAN SYLLABICS CARRIER RA
+15d0 CANADIAN SYLLABICS CARRIER WU
+15d1 CANADIAN SYLLABICS CARRIER WO
+15d2 CANADIAN SYLLABICS CARRIER WE
+15d3 CANADIAN SYLLABICS CARRIER WEE
+15d4 CANADIAN SYLLABICS CARRIER WI
+15d5 CANADIAN SYLLABICS CARRIER WA
+15d6 CANADIAN SYLLABICS CARRIER HWU
+15d7 CANADIAN SYLLABICS CARRIER HWO
+15d8 CANADIAN SYLLABICS CARRIER HWE
+15d9 CANADIAN SYLLABICS CARRIER HWEE
+15da CANADIAN SYLLABICS CARRIER HWI
+15db CANADIAN SYLLABICS CARRIER HWA
+15dc CANADIAN SYLLABICS CARRIER THU
+15dd CANADIAN SYLLABICS CARRIER THO
+15de CANADIAN SYLLABICS CARRIER THE
+15df CANADIAN SYLLABICS CARRIER THEE
+15e0 CANADIAN SYLLABICS CARRIER THI
+15e1 CANADIAN SYLLABICS CARRIER THA
+15e2 CANADIAN SYLLABICS CARRIER TTU
+15e3 CANADIAN SYLLABICS CARRIER TTO
+15e4 CANADIAN SYLLABICS CARRIER TTE
+15e5 CANADIAN SYLLABICS CARRIER TTEE
+15e6 CANADIAN SYLLABICS CARRIER TTI
+15e7 CANADIAN SYLLABICS CARRIER TTA
+15e8 CANADIAN SYLLABICS CARRIER PU
+15e9 CANADIAN SYLLABICS CARRIER PO
+15ea CANADIAN SYLLABICS CARRIER PE
+15eb CANADIAN SYLLABICS CARRIER PEE
+15ec CANADIAN SYLLABICS CARRIER PI
+15ed CANADIAN SYLLABICS CARRIER PA
+15ee CANADIAN SYLLABICS CARRIER P
+15ef CANADIAN SYLLABICS CARRIER GU
+15f0 CANADIAN SYLLABICS CARRIER GO
+15f1 CANADIAN SYLLABICS CARRIER GE
+15f2 CANADIAN SYLLABICS CARRIER GEE
+15f3 CANADIAN SYLLABICS CARRIER GI
+15f4 CANADIAN SYLLABICS CARRIER GA
+15f5 CANADIAN SYLLABICS CARRIER KHU
+15f6 CANADIAN SYLLABICS CARRIER KHO
+15f7 CANADIAN SYLLABICS CARRIER KHE
+15f8 CANADIAN SYLLABICS CARRIER KHEE
+15f9 CANADIAN SYLLABICS CARRIER KHI
+15fa CANADIAN SYLLABICS CARRIER KHA
+15fb CANADIAN SYLLABICS CARRIER KKU
+15fc CANADIAN SYLLABICS CARRIER KKO
+15fd CANADIAN SYLLABICS CARRIER KKE
+15fe CANADIAN SYLLABICS CARRIER KKEE
+15ff CANADIAN SYLLABICS CARRIER KKI
+1600 CANADIAN SYLLABICS CARRIER KKA
+1601 CANADIAN SYLLABICS CARRIER KK
+1602 CANADIAN SYLLABICS CARRIER NU
+1603 CANADIAN SYLLABICS CARRIER NO
+1604 CANADIAN SYLLABICS CARRIER NE
+1605 CANADIAN SYLLABICS CARRIER NEE
+1606 CANADIAN SYLLABICS CARRIER NI
+1607 CANADIAN SYLLABICS CARRIER NA
+1608 CANADIAN SYLLABICS CARRIER MU
+1609 CANADIAN SYLLABICS CARRIER MO
+160a CANADIAN SYLLABICS CARRIER ME
+160b CANADIAN SYLLABICS CARRIER MEE
+160c CANADIAN SYLLABICS CARRIER MI
+160d CANADIAN SYLLABICS CARRIER MA
+160e CANADIAN SYLLABICS CARRIER YU
+160f CANADIAN SYLLABICS CARRIER YO
+1610 CANADIAN SYLLABICS CARRIER YE
+1611 CANADIAN SYLLABICS CARRIER YEE
+1612 CANADIAN SYLLABICS CARRIER YI
+1613 CANADIAN SYLLABICS CARRIER YA
+1614 CANADIAN SYLLABICS CARRIER JU
+1615 CANADIAN SYLLABICS SAYISI JU
+1616 CANADIAN SYLLABICS CARRIER JO
+1617 CANADIAN SYLLABICS CARRIER JE
+1618 CANADIAN SYLLABICS CARRIER JEE
+1619 CANADIAN SYLLABICS CARRIER JI
+161a CANADIAN SYLLABICS SAYISI JI
+161b CANADIAN SYLLABICS CARRIER JA
+161c CANADIAN SYLLABICS CARRIER JJU
+161d CANADIAN SYLLABICS CARRIER JJO
+161e CANADIAN SYLLABICS CARRIER JJE
+161f CANADIAN SYLLABICS CARRIER JJEE
+1620 CANADIAN SYLLABICS CARRIER JJI
+1621 CANADIAN SYLLABICS CARRIER JJA
+1622 CANADIAN SYLLABICS CARRIER LU
+1623 CANADIAN SYLLABICS CARRIER LO
+1624 CANADIAN SYLLABICS CARRIER LE
+1625 CANADIAN SYLLABICS CARRIER LEE
+1626 CANADIAN SYLLABICS CARRIER LI
+1627 CANADIAN SYLLABICS CARRIER LA
+1628 CANADIAN SYLLABICS CARRIER DLU
+1629 CANADIAN SYLLABICS CARRIER DLO
+162a CANADIAN SYLLABICS CARRIER DLE
+162b CANADIAN SYLLABICS CARRIER DLEE
+162c CANADIAN SYLLABICS CARRIER DLI
+162d CANADIAN SYLLABICS CARRIER DLA
+162e CANADIAN SYLLABICS CARRIER LHU
+162f CANADIAN SYLLABICS CARRIER LHO
+1630 CANADIAN SYLLABICS CARRIER LHE
+1631 CANADIAN SYLLABICS CARRIER LHEE
+1632 CANADIAN SYLLABICS CARRIER LHI
+1633 CANADIAN SYLLABICS CARRIER LHA
+1634 CANADIAN SYLLABICS CARRIER TLHU
+1635 CANADIAN SYLLABICS CARRIER TLHO
+1636 CANADIAN SYLLABICS CARRIER TLHE
+1637 CANADIAN SYLLABICS CARRIER TLHEE
+1638 CANADIAN SYLLABICS CARRIER TLHI
+1639 CANADIAN SYLLABICS CARRIER TLHA
+163a CANADIAN SYLLABICS CARRIER TLU
+163b CANADIAN SYLLABICS CARRIER TLO
+163c CANADIAN SYLLABICS CARRIER TLE
+163d CANADIAN SYLLABICS CARRIER TLEE
+163e CANADIAN SYLLABICS CARRIER TLI
+163f CANADIAN SYLLABICS CARRIER TLA
+1640 CANADIAN SYLLABICS CARRIER ZU
+1641 CANADIAN SYLLABICS CARRIER ZO
+1642 CANADIAN SYLLABICS CARRIER ZE
+1643 CANADIAN SYLLABICS CARRIER ZEE
+1644 CANADIAN SYLLABICS CARRIER ZI
+1645 CANADIAN SYLLABICS CARRIER ZA
+1646 CANADIAN SYLLABICS CARRIER Z
+1647 CANADIAN SYLLABICS CARRIER INITIAL Z
+1648 CANADIAN SYLLABICS CARRIER DZU
+1649 CANADIAN SYLLABICS CARRIER DZO
+164a CANADIAN SYLLABICS CARRIER DZE
+164b CANADIAN SYLLABICS CARRIER DZEE
+164c CANADIAN SYLLABICS CARRIER DZI
+164d CANADIAN SYLLABICS CARRIER DZA
+164e CANADIAN SYLLABICS CARRIER SU
+164f CANADIAN SYLLABICS CARRIER SO
+1650 CANADIAN SYLLABICS CARRIER SE
+1651 CANADIAN SYLLABICS CARRIER SEE
+1652 CANADIAN SYLLABICS CARRIER SI
+1653 CANADIAN SYLLABICS CARRIER SA
+1654 CANADIAN SYLLABICS CARRIER SHU
+1655 CANADIAN SYLLABICS CARRIER SHO
+1656 CANADIAN SYLLABICS CARRIER SHE
+1657 CANADIAN SYLLABICS CARRIER SHEE
+1658 CANADIAN SYLLABICS CARRIER SHI
+1659 CANADIAN SYLLABICS CARRIER SHA
+165a CANADIAN SYLLABICS CARRIER SH
+165b CANADIAN SYLLABICS CARRIER TSU
+165c CANADIAN SYLLABICS CARRIER TSO
+165d CANADIAN SYLLABICS CARRIER TSE
+165e CANADIAN SYLLABICS CARRIER TSEE
+165f CANADIAN SYLLABICS CARRIER TSI
+1660 CANADIAN SYLLABICS CARRIER TSA
+1661 CANADIAN SYLLABICS CARRIER CHU
+1662 CANADIAN SYLLABICS CARRIER CHO
+1663 CANADIAN SYLLABICS CARRIER CHE
+1664 CANADIAN SYLLABICS CARRIER CHEE
+1665 CANADIAN SYLLABICS CARRIER CHI
+1666 CANADIAN SYLLABICS CARRIER CHA
+1667 CANADIAN SYLLABICS CARRIER TTSU
+1668 CANADIAN SYLLABICS CARRIER TTSO
+1669 CANADIAN SYLLABICS CARRIER TTSE
+166a CANADIAN SYLLABICS CARRIER TTSEE
+166b CANADIAN SYLLABICS CARRIER TTSI
+166c CANADIAN SYLLABICS CARRIER TTSA
+166d CANADIAN SYLLABICS CHI SIGN
+166e CANADIAN SYLLABICS FULL STOP
+166f CANADIAN SYLLABICS QAI
+1670 CANADIAN SYLLABICS NGAI
+1671 CANADIAN SYLLABICS NNGI
+1672 CANADIAN SYLLABICS NNGII
+1673 CANADIAN SYLLABICS NNGO
+1674 CANADIAN SYLLABICS NNGOO
+1675 CANADIAN SYLLABICS NNGA
+1676 CANADIAN SYLLABICS NNGAA
+1680 OGHAM SPACE MARK
+1681 OGHAM LETTER BEITH
+1682 OGHAM LETTER LUIS
+1683 OGHAM LETTER FEARN
+1684 OGHAM LETTER SAIL
+1685 OGHAM LETTER NION
+1686 OGHAM LETTER UATH
+1687 OGHAM LETTER DAIR
+1688 OGHAM LETTER TINNE
+1689 OGHAM LETTER COLL
+168a OGHAM LETTER CEIRT
+168b OGHAM LETTER MUIN
+168c OGHAM LETTER GORT
+168d OGHAM LETTER NGEADAL
+168e OGHAM LETTER STRAIF
+168f OGHAM LETTER RUIS
+1690 OGHAM LETTER AILM
+1691 OGHAM LETTER ONN
+1692 OGHAM LETTER UR
+1693 OGHAM LETTER EADHADH
+1694 OGHAM LETTER IODHADH
+1695 OGHAM LETTER EABHADH
+1696 OGHAM LETTER OR
+1697 OGHAM LETTER UILLEANN
+1698 OGHAM LETTER IFIN
+1699 OGHAM LETTER EAMHANCHOLL
+169a OGHAM LETTER PEITH
+169b OGHAM FEATHER MARK
+169c OGHAM REVERSED FEATHER MARK
+16a0 RUNIC LETTER FEHU FEOH FE F
+16a1 RUNIC LETTER V
+16a2 RUNIC LETTER URUZ UR U
+16a3 RUNIC LETTER YR
+16a4 RUNIC LETTER Y
+16a5 RUNIC LETTER W
+16a6 RUNIC LETTER THURISAZ THURS THORN
+16a7 RUNIC LETTER ETH
+16a8 RUNIC LETTER ANSUZ A
+16a9 RUNIC LETTER OS O
+16aa RUNIC LETTER AC A
+16ab RUNIC LETTER AESC
+16ac RUNIC LETTER LONG-BRANCH-OSS O
+16ad RUNIC LETTER SHORT-TWIG-OSS O
+16ae RUNIC LETTER O
+16af RUNIC LETTER OE
+16b0 RUNIC LETTER ON
+16b1 RUNIC LETTER RAIDO RAD REID R
+16b2 RUNIC LETTER KAUNA
+16b3 RUNIC LETTER CEN
+16b4 RUNIC LETTER KAUN K
+16b5 RUNIC LETTER G
+16b6 RUNIC LETTER ENG
+16b7 RUNIC LETTER GEBO GYFU G
+16b8 RUNIC LETTER GAR
+16b9 RUNIC LETTER WUNJO WYNN W
+16ba RUNIC LETTER HAGLAZ H
+16bb RUNIC LETTER HAEGL H
+16bc RUNIC LETTER LONG-BRANCH-HAGALL H
+16bd RUNIC LETTER SHORT-TWIG-HAGALL H
+16be RUNIC LETTER NAUDIZ NYD NAUD N
+16bf RUNIC LETTER SHORT-TWIG-NAUD N
+16c0 RUNIC LETTER DOTTED-N
+16c1 RUNIC LETTER ISAZ IS ISS I
+16c2 RUNIC LETTER E
+16c3 RUNIC LETTER JERAN J
+16c4 RUNIC LETTER GER
+16c5 RUNIC LETTER LONG-BRANCH-AR AE
+16c6 RUNIC LETTER SHORT-TWIG-AR A
+16c7 RUNIC LETTER IWAZ EOH
+16c8 RUNIC LETTER PERTHO PEORTH P
+16c9 RUNIC LETTER ALGIZ EOLHX
+16ca RUNIC LETTER SOWILO S
+16cb RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16cc RUNIC LETTER SHORT-TWIG-SOL S
+16cd RUNIC LETTER C
+16ce RUNIC LETTER Z
+16cf RUNIC LETTER TIWAZ TIR TYR T
+16d0 RUNIC LETTER SHORT-TWIG-TYR T
+16d1 RUNIC LETTER D
+16d2 RUNIC LETTER BERKANAN BEORC BJARKAN B
+16d3 RUNIC LETTER SHORT-TWIG-BJARKAN B
+16d4 RUNIC LETTER DOTTED-P
+16d5 RUNIC LETTER OPEN-P
+16d6 RUNIC LETTER EHWAZ EH E
+16d7 RUNIC LETTER MANNAZ MAN M
+16d8 RUNIC LETTER LONG-BRANCH-MADR M
+16d9 RUNIC LETTER SHORT-TWIG-MADR M
+16da RUNIC LETTER LAUKAZ LAGU LOGR L
+16db RUNIC LETTER DOTTED-L
+16dc RUNIC LETTER INGWAZ
+16dd RUNIC LETTER ING
+16de RUNIC LETTER DAGAZ DAEG D
+16df RUNIC LETTER OTHALAN ETHEL O
+16e0 RUNIC LETTER EAR
+16e1 RUNIC LETTER IOR
+16e2 RUNIC LETTER CWEORTH
+16e3 RUNIC LETTER CALC
+16e4 RUNIC LETTER CEALC
+16e5 RUNIC LETTER STAN
+16e6 RUNIC LETTER LONG-BRANCH-YR
+16e7 RUNIC LETTER SHORT-TWIG-YR
+16e8 RUNIC LETTER ICELANDIC-YR
+16e9 RUNIC LETTER Q
+16ea RUNIC LETTER X
+16eb RUNIC SINGLE PUNCTUATION
+16ec RUNIC MULTIPLE PUNCTUATION
+16ed RUNIC CROSS PUNCTUATION
+16ee RUNIC ARLAUG SYMBOL
+16ef RUNIC TVIMADUR SYMBOL
+16f0 RUNIC BELGTHOR SYMBOL
+1780 KHMER LETTER KA
+1781 KHMER LETTER KHA
+1782 KHMER LETTER KO
+1783 KHMER LETTER KHO
+1784 KHMER LETTER NGO
+1785 KHMER LETTER CA
+1786 KHMER LETTER CHA
+1787 KHMER LETTER CO
+1788 KHMER LETTER CHO
+1789 KHMER LETTER NYO
+178a KHMER LETTER DA
+178b KHMER LETTER TTHA
+178c KHMER LETTER DO
+178d KHMER LETTER TTHO
+178e KHMER LETTER NNO
+178f KHMER LETTER TA
+1790 KHMER LETTER THA
+1791 KHMER LETTER TO
+1792 KHMER LETTER THO
+1793 KHMER LETTER NO
+1794 KHMER LETTER BA
+1795 KHMER LETTER PHA
+1796 KHMER LETTER PO
+1797 KHMER LETTER PHO
+1798 KHMER LETTER MO
+1799 KHMER LETTER YO
+179a KHMER LETTER RO
+179b KHMER LETTER LO
+179c KHMER LETTER VO
+179d KHMER LETTER SHA
+179e KHMER LETTER SSO
+179f KHMER LETTER SA
+17a0 KHMER LETTER HA
+17a1 KHMER LETTER LA
+17a2 KHMER LETTER QA
+17a3 KHMER INDEPENDENT VOWEL QAQ
+17a4 KHMER INDEPENDENT VOWEL QAA
+17a5 KHMER INDEPENDENT VOWEL QI
+17a6 KHMER INDEPENDENT VOWEL QII
+17a7 KHMER INDEPENDENT VOWEL QU
+17a8 KHMER INDEPENDENT VOWEL QUK
+17a9 KHMER INDEPENDENT VOWEL QUU
+17aa KHMER INDEPENDENT VOWEL QUUV
+17ab KHMER INDEPENDENT VOWEL RY
+17ac KHMER INDEPENDENT VOWEL RYY
+17ad KHMER INDEPENDENT VOWEL LY
+17ae KHMER INDEPENDENT VOWEL LYY
+17af KHMER INDEPENDENT VOWEL QE
+17b0 KHMER INDEPENDENT VOWEL QAI
+17b1 KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17b2 KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17b3 KHMER INDEPENDENT VOWEL QAU
+17b4 KHMER VOWEL INHERENT AQ
+17b5 KHMER VOWEL INHERENT AA
+17b6 KHMER VOWEL SIGN AA
+17b7 KHMER VOWEL SIGN I
+17b8 KHMER VOWEL SIGN II
+17b9 KHMER VOWEL SIGN Y
+17ba KHMER VOWEL SIGN YY
+17bb KHMER VOWEL SIGN U
+17bc KHMER VOWEL SIGN UU
+17bd KHMER VOWEL SIGN UA
+17be KHMER VOWEL SIGN OE
+17bf KHMER VOWEL SIGN YA
+17c0 KHMER VOWEL SIGN IE
+17c1 KHMER VOWEL SIGN E
+17c2 KHMER VOWEL SIGN AE
+17c3 KHMER VOWEL SIGN AI
+17c4 KHMER VOWEL SIGN OO
+17c5 KHMER VOWEL SIGN AU
+17c6 KHMER SIGN NIKAHIT
+17c7 KHMER SIGN REAHMUK
+17c8 KHMER SIGN YUUKALEAPINTU
+17c9 KHMER SIGN MUUSIKATOAN
+17ca KHMER SIGN TRIISAP
+17cb KHMER SIGN BANTOC
+17cc KHMER SIGN ROBAT
+17cd KHMER SIGN TOANDAKHIAT
+17ce KHMER SIGN KAKABAT
+17cf KHMER SIGN AHSDA
+17d0 KHMER SIGN SAMYOK SANNYA
+17d1 KHMER SIGN VIRIAM
+17d2 KHMER SIGN COENG
+17d3 KHMER SIGN BATHAMASAT
+17d4 KHMER SIGN KHAN
+17d5 KHMER SIGN BARIYOOSAN
+17d6 KHMER SIGN CAMNUC PII KUUH
+17d7 KHMER SIGN LEK TOO
+17d8 KHMER SIGN BEYYAL
+17d9 KHMER SIGN PHNAEK MUAN
+17da KHMER SIGN KOOMUUT
+17db KHMER CURRENCY SYMBOL RIEL
+17dc KHMER SIGN AVAKRAHASANYA
+17e0 KHMER DIGIT ZERO
+17e1 KHMER DIGIT ONE
+17e2 KHMER DIGIT TWO
+17e3 KHMER DIGIT THREE
+17e4 KHMER DIGIT FOUR
+17e5 KHMER DIGIT FIVE
+17e6 KHMER DIGIT SIX
+17e7 KHMER DIGIT SEVEN
+17e8 KHMER DIGIT EIGHT
+17e9 KHMER DIGIT NINE
+1800 MONGOLIAN BIRGA
+1801 MONGOLIAN ELLIPSIS
+1802 MONGOLIAN COMMA
+1803 MONGOLIAN FULL STOP
+1804 MONGOLIAN COLON
+1805 MONGOLIAN FOUR DOTS
+1806 MONGOLIAN TODO SOFT HYPHEN
+1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808 MONGOLIAN MANCHU COMMA
+1809 MONGOLIAN MANCHU FULL STOP
+180a MONGOLIAN NIRUGU
+180b MONGOLIAN FREE VARIATION SELECTOR ONE
+180c MONGOLIAN FREE VARIATION SELECTOR TWO
+180d MONGOLIAN FREE VARIATION SELECTOR THREE
+180e MONGOLIAN VOWEL SEPARATOR
+1810 MONGOLIAN DIGIT ZERO
+1811 MONGOLIAN DIGIT ONE
+1812 MONGOLIAN DIGIT TWO
+1813 MONGOLIAN DIGIT THREE
+1814 MONGOLIAN DIGIT FOUR
+1815 MONGOLIAN DIGIT FIVE
+1816 MONGOLIAN DIGIT SIX
+1817 MONGOLIAN DIGIT SEVEN
+1818 MONGOLIAN DIGIT EIGHT
+1819 MONGOLIAN DIGIT NINE
+1820 MONGOLIAN LETTER A
+1821 MONGOLIAN LETTER E
+1822 MONGOLIAN LETTER I
+1823 MONGOLIAN LETTER O
+1824 MONGOLIAN LETTER U
+1825 MONGOLIAN LETTER OE
+1826 MONGOLIAN LETTER UE
+1827 MONGOLIAN LETTER EE
+1828 MONGOLIAN LETTER NA
+1829 MONGOLIAN LETTER ANG
+182a MONGOLIAN LETTER BA
+182b MONGOLIAN LETTER PA
+182c MONGOLIAN LETTER QA
+182d MONGOLIAN LETTER GA
+182e MONGOLIAN LETTER MA
+182f MONGOLIAN LETTER LA
+1830 MONGOLIAN LETTER SA
+1831 MONGOLIAN LETTER SHA
+1832 MONGOLIAN LETTER TA
+1833 MONGOLIAN LETTER DA
+1834 MONGOLIAN LETTER CHA
+1835 MONGOLIAN LETTER JA
+1836 MONGOLIAN LETTER YA
+1837 MONGOLIAN LETTER RA
+1838 MONGOLIAN LETTER WA
+1839 MONGOLIAN LETTER FA
+183a MONGOLIAN LETTER KA
+183b MONGOLIAN LETTER KHA
+183c MONGOLIAN LETTER TSA
+183d MONGOLIAN LETTER ZA
+183e MONGOLIAN LETTER HAA
+183f MONGOLIAN LETTER ZRA
+1840 MONGOLIAN LETTER LHA
+1841 MONGOLIAN LETTER ZHI
+1842 MONGOLIAN LETTER CHI
+1843 MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844 MONGOLIAN LETTER TODO E
+1845 MONGOLIAN LETTER TODO I
+1846 MONGOLIAN LETTER TODO O
+1847 MONGOLIAN LETTER TODO U
+1848 MONGOLIAN LETTER TODO OE
+1849 MONGOLIAN LETTER TODO UE
+184a MONGOLIAN LETTER TODO ANG
+184b MONGOLIAN LETTER TODO BA
+184c MONGOLIAN LETTER TODO PA
+184d MONGOLIAN LETTER TODO QA
+184e MONGOLIAN LETTER TODO GA
+184f MONGOLIAN LETTER TODO MA
+1850 MONGOLIAN LETTER TODO TA
+1851 MONGOLIAN LETTER TODO DA
+1852 MONGOLIAN LETTER TODO CHA
+1853 MONGOLIAN LETTER TODO JA
+1854 MONGOLIAN LETTER TODO TSA
+1855 MONGOLIAN LETTER TODO YA
+1856 MONGOLIAN LETTER TODO WA
+1857 MONGOLIAN LETTER TODO KA
+1858 MONGOLIAN LETTER TODO GAA
+1859 MONGOLIAN LETTER TODO HAA
+185a MONGOLIAN LETTER TODO JIA
+185b MONGOLIAN LETTER TODO NIA
+185c MONGOLIAN LETTER TODO DZA
+185d MONGOLIAN LETTER SIBE E
+185e MONGOLIAN LETTER SIBE I
+185f MONGOLIAN LETTER SIBE IY
+1860 MONGOLIAN LETTER SIBE UE
+1861 MONGOLIAN LETTER SIBE U
+1862 MONGOLIAN LETTER SIBE ANG
+1863 MONGOLIAN LETTER SIBE KA
+1864 MONGOLIAN LETTER SIBE GA
+1865 MONGOLIAN LETTER SIBE HA
+1866 MONGOLIAN LETTER SIBE PA
+1867 MONGOLIAN LETTER SIBE SHA
+1868 MONGOLIAN LETTER SIBE TA
+1869 MONGOLIAN LETTER SIBE DA
+186a MONGOLIAN LETTER SIBE JA
+186b MONGOLIAN LETTER SIBE FA
+186c MONGOLIAN LETTER SIBE GAA
+186d MONGOLIAN LETTER SIBE HAA
+186e MONGOLIAN LETTER SIBE TSA
+186f MONGOLIAN LETTER SIBE ZA
+1870 MONGOLIAN LETTER SIBE RAA
+1871 MONGOLIAN LETTER SIBE CHA
+1872 MONGOLIAN LETTER SIBE ZHA
+1873 MONGOLIAN LETTER MANCHU I
+1874 MONGOLIAN LETTER MANCHU KA
+1875 MONGOLIAN LETTER MANCHU RA
+1876 MONGOLIAN LETTER MANCHU FA
+1877 MONGOLIAN LETTER MANCHU ZHA
+1880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882 MONGOLIAN LETTER ALI GALI DAMARU
+1883 MONGOLIAN LETTER ALI GALI UBADAMA
+1884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885 MONGOLIAN LETTER ALI GALI BALUDA
+1886 MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887 MONGOLIAN LETTER ALI GALI A
+1888 MONGOLIAN LETTER ALI GALI I
+1889 MONGOLIAN LETTER ALI GALI KA
+188a MONGOLIAN LETTER ALI GALI NGA
+188b MONGOLIAN LETTER ALI GALI CA
+188c MONGOLIAN LETTER ALI GALI TTA
+188d MONGOLIAN LETTER ALI GALI TTHA
+188e MONGOLIAN LETTER ALI GALI DDA
+188f MONGOLIAN LETTER ALI GALI NNA
+1890 MONGOLIAN LETTER ALI GALI TA
+1891 MONGOLIAN LETTER ALI GALI DA
+1892 MONGOLIAN LETTER ALI GALI PA
+1893 MONGOLIAN LETTER ALI GALI PHA
+1894 MONGOLIAN LETTER ALI GALI SSA
+1895 MONGOLIAN LETTER ALI GALI ZHA
+1896 MONGOLIAN LETTER ALI GALI ZA
+1897 MONGOLIAN LETTER ALI GALI AH
+1898 MONGOLIAN LETTER TODO ALI GALI TA
+1899 MONGOLIAN LETTER TODO ALI GALI ZHA
+189a MONGOLIAN LETTER MANCHU ALI GALI GHA
+189b MONGOLIAN LETTER MANCHU ALI GALI NGA
+189c MONGOLIAN LETTER MANCHU ALI GALI CA
+189d MONGOLIAN LETTER MANCHU ALI GALI JHA
+189e MONGOLIAN LETTER MANCHU ALI GALI TTA
+189f MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18a0 MONGOLIAN LETTER MANCHU ALI GALI TA
+18a1 MONGOLIAN LETTER MANCHU ALI GALI DHA
+18a2 MONGOLIAN LETTER MANCHU ALI GALI SSA
+18a3 MONGOLIAN LETTER MANCHU ALI GALI CYA
+18a4 MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18a5 MONGOLIAN LETTER MANCHU ALI GALI ZA
+18a6 MONGOLIAN LETTER ALI GALI HALF U
+18a7 MONGOLIAN LETTER ALI GALI HALF YA
+18a8 MONGOLIAN LETTER MANCHU ALI GALI BHA
+18a9 MONGOLIAN LETTER ALI GALI DAGALGA
+1e00 LATIN CAPITAL LETTER A WITH RING BELOW
+1e01 LATIN SMALL LETTER A WITH RING BELOW
+1e02 LATIN CAPITAL LETTER B WITH DOT ABOVE
+1e03 LATIN SMALL LETTER B WITH DOT ABOVE
+1e04 LATIN CAPITAL LETTER B WITH DOT BELOW
+1e05 LATIN SMALL LETTER B WITH DOT BELOW
+1e06 LATIN CAPITAL LETTER B WITH LINE BELOW
+1e07 LATIN SMALL LETTER B WITH LINE BELOW
+1e08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1e09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+1e0a LATIN CAPITAL LETTER D WITH DOT ABOVE
+1e0b LATIN SMALL LETTER D WITH DOT ABOVE
+1e0c LATIN CAPITAL LETTER D WITH DOT BELOW
+1e0d LATIN SMALL LETTER D WITH DOT BELOW
+1e0e LATIN CAPITAL LETTER D WITH LINE BELOW
+1e0f LATIN SMALL LETTER D WITH LINE BELOW
+1e10 LATIN CAPITAL LETTER D WITH CEDILLA
+1e11 LATIN SMALL LETTER D WITH CEDILLA
+1e12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1e13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+1e14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1e15 LATIN SMALL LETTER E WITH MACRON AND GRAVE
+1e16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1e17 LATIN SMALL LETTER E WITH MACRON AND ACUTE
+1e18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1e19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+1e1a LATIN CAPITAL LETTER E WITH TILDE BELOW
+1e1b LATIN SMALL LETTER E WITH TILDE BELOW
+1e1c LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1e1d LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+1e1e LATIN CAPITAL LETTER F WITH DOT ABOVE
+1e1f LATIN SMALL LETTER F WITH DOT ABOVE
+1e20 LATIN CAPITAL LETTER G WITH MACRON
+1e21 LATIN SMALL LETTER G WITH MACRON
+1e22 LATIN CAPITAL LETTER H WITH DOT ABOVE
+1e23 LATIN SMALL LETTER H WITH DOT ABOVE
+1e24 LATIN CAPITAL LETTER H WITH DOT BELOW
+1e25 LATIN SMALL LETTER H WITH DOT BELOW
+1e26 LATIN CAPITAL LETTER H WITH DIAERESIS
+1e27 LATIN SMALL LETTER H WITH DIAERESIS
+1e28 LATIN CAPITAL LETTER H WITH CEDILLA
+1e29 LATIN SMALL LETTER H WITH CEDILLA
+1e2a LATIN CAPITAL LETTER H WITH BREVE BELOW
+1e2b LATIN SMALL LETTER H WITH BREVE BELOW
+1e2c LATIN CAPITAL LETTER I WITH TILDE BELOW
+1e2d LATIN SMALL LETTER I WITH TILDE BELOW
+1e2e LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1e2f LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+1e30 LATIN CAPITAL LETTER K WITH ACUTE
+1e31 LATIN SMALL LETTER K WITH ACUTE
+1e32 LATIN CAPITAL LETTER K WITH DOT BELOW
+1e33 LATIN SMALL LETTER K WITH DOT BELOW
+1e34 LATIN CAPITAL LETTER K WITH LINE BELOW
+1e35 LATIN SMALL LETTER K WITH LINE BELOW
+1e36 LATIN CAPITAL LETTER L WITH DOT BELOW
+1e37 LATIN SMALL LETTER L WITH DOT BELOW
+1e38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1e39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+1e3a LATIN CAPITAL LETTER L WITH LINE BELOW
+1e3b LATIN SMALL LETTER L WITH LINE BELOW
+1e3c LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1e3d LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+1e3e LATIN CAPITAL LETTER M WITH ACUTE
+1e3f LATIN SMALL LETTER M WITH ACUTE
+1e40 LATIN CAPITAL LETTER M WITH DOT ABOVE
+1e41 LATIN SMALL LETTER M WITH DOT ABOVE
+1e42 LATIN CAPITAL LETTER M WITH DOT BELOW
+1e43 LATIN SMALL LETTER M WITH DOT BELOW
+1e44 LATIN CAPITAL LETTER N WITH DOT ABOVE
+1e45 LATIN SMALL LETTER N WITH DOT ABOVE
+1e46 LATIN CAPITAL LETTER N WITH DOT BELOW
+1e47 LATIN SMALL LETTER N WITH DOT BELOW
+1e48 LATIN CAPITAL LETTER N WITH LINE BELOW
+1e49 LATIN SMALL LETTER N WITH LINE BELOW
+1e4a LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1e4b LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+1e4c LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1e4d LATIN SMALL LETTER O WITH TILDE AND ACUTE
+1e4e LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1e4f LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+1e50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1e51 LATIN SMALL LETTER O WITH MACRON AND GRAVE
+1e52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1e53 LATIN SMALL LETTER O WITH MACRON AND ACUTE
+1e54 LATIN CAPITAL LETTER P WITH ACUTE
+1e55 LATIN SMALL LETTER P WITH ACUTE
+1e56 LATIN CAPITAL LETTER P WITH DOT ABOVE
+1e57 LATIN SMALL LETTER P WITH DOT ABOVE
+1e58 LATIN CAPITAL LETTER R WITH DOT ABOVE
+1e59 LATIN SMALL LETTER R WITH DOT ABOVE
+1e5a LATIN CAPITAL LETTER R WITH DOT BELOW
+1e5b LATIN SMALL LETTER R WITH DOT BELOW
+1e5c LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1e5d LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+1e5e LATIN CAPITAL LETTER R WITH LINE BELOW
+1e5f LATIN SMALL LETTER R WITH LINE BELOW
+1e60 LATIN CAPITAL LETTER S WITH DOT ABOVE
+1e61 LATIN SMALL LETTER S WITH DOT ABOVE
+1e62 LATIN CAPITAL LETTER S WITH DOT BELOW
+1e63 LATIN SMALL LETTER S WITH DOT BELOW
+1e64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1e65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+1e66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1e67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+1e68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1e69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+1e6a LATIN CAPITAL LETTER T WITH DOT ABOVE
+1e6b LATIN SMALL LETTER T WITH DOT ABOVE
+1e6c LATIN CAPITAL LETTER T WITH DOT BELOW
+1e6d LATIN SMALL LETTER T WITH DOT BELOW
+1e6e LATIN CAPITAL LETTER T WITH LINE BELOW
+1e6f LATIN SMALL LETTER T WITH LINE BELOW
+1e70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1e71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+1e72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1e73 LATIN SMALL LETTER U WITH DIAERESIS BELOW
+1e74 LATIN CAPITAL LETTER U WITH TILDE BELOW
+1e75 LATIN SMALL LETTER U WITH TILDE BELOW
+1e76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1e77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+1e78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1e79 LATIN SMALL LETTER U WITH TILDE AND ACUTE
+1e7a LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1e7b LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+1e7c LATIN CAPITAL LETTER V WITH TILDE
+1e7d LATIN SMALL LETTER V WITH TILDE
+1e7e LATIN CAPITAL LETTER V WITH DOT BELOW
+1e7f LATIN SMALL LETTER V WITH DOT BELOW
+1e80 LATIN CAPITAL LETTER W WITH GRAVE
+1e81 LATIN SMALL LETTER W WITH GRAVE
+1e82 LATIN CAPITAL LETTER W WITH ACUTE
+1e83 LATIN SMALL LETTER W WITH ACUTE
+1e84 LATIN CAPITAL LETTER W WITH DIAERESIS
+1e85 LATIN SMALL LETTER W WITH DIAERESIS
+1e86 LATIN CAPITAL LETTER W WITH DOT ABOVE
+1e87 LATIN SMALL LETTER W WITH DOT ABOVE
+1e88 LATIN CAPITAL LETTER W WITH DOT BELOW
+1e89 LATIN SMALL LETTER W WITH DOT BELOW
+1e8a LATIN CAPITAL LETTER X WITH DOT ABOVE
+1e8b LATIN SMALL LETTER X WITH DOT ABOVE
+1e8c LATIN CAPITAL LETTER X WITH DIAERESIS
+1e8d LATIN SMALL LETTER X WITH DIAERESIS
+1e8e LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1e8f LATIN SMALL LETTER Y WITH DOT ABOVE
+1e90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1e91 LATIN SMALL LETTER Z WITH CIRCUMFLEX
+1e92 LATIN CAPITAL LETTER Z WITH DOT BELOW
+1e93 LATIN SMALL LETTER Z WITH DOT BELOW
+1e94 LATIN CAPITAL LETTER Z WITH LINE BELOW
+1e95 LATIN SMALL LETTER Z WITH LINE BELOW
+1e96 LATIN SMALL LETTER H WITH LINE BELOW
+1e97 LATIN SMALL LETTER T WITH DIAERESIS
+1e98 LATIN SMALL LETTER W WITH RING ABOVE
+1e99 LATIN SMALL LETTER Y WITH RING ABOVE
+1e9a LATIN SMALL LETTER A WITH RIGHT HALF RING
+1e9b LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1ea0 LATIN CAPITAL LETTER A WITH DOT BELOW
+1ea1 LATIN SMALL LETTER A WITH DOT BELOW
+1ea2 LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1ea3 LATIN SMALL LETTER A WITH HOOK ABOVE
+1ea4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1ea5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+1ea6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1ea7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+1ea8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1ea9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1eaa LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1eab LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+1eac LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1ead LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1eae LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1eaf LATIN SMALL LETTER A WITH BREVE AND ACUTE
+1eb0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1eb1 LATIN SMALL LETTER A WITH BREVE AND GRAVE
+1eb2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1eb3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+1eb4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1eb5 LATIN SMALL LETTER A WITH BREVE AND TILDE
+1eb6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1eb7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+1eb8 LATIN CAPITAL LETTER E WITH DOT BELOW
+1eb9 LATIN SMALL LETTER E WITH DOT BELOW
+1eba LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1ebb LATIN SMALL LETTER E WITH HOOK ABOVE
+1ebc LATIN CAPITAL LETTER E WITH TILDE
+1ebd LATIN SMALL LETTER E WITH TILDE
+1ebe LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1ebf LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+1ec0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1ec1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+1ec2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1ec3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1ec4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1ec5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+1ec6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1ec7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1ec8 LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ec9 LATIN SMALL LETTER I WITH HOOK ABOVE
+1eca LATIN CAPITAL LETTER I WITH DOT BELOW
+1ecb LATIN SMALL LETTER I WITH DOT BELOW
+1ecc LATIN CAPITAL LETTER O WITH DOT BELOW
+1ecd LATIN SMALL LETTER O WITH DOT BELOW
+1ece LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ecf LATIN SMALL LETTER O WITH HOOK ABOVE
+1ed0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ed1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ed2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ed3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ed4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ed5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ed6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ed7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+1ed8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1ed9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1eda LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1edb LATIN SMALL LETTER O WITH HORN AND ACUTE
+1edc LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1edd LATIN SMALL LETTER O WITH HORN AND GRAVE
+1ede LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1edf LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+1ee0 LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1ee1 LATIN SMALL LETTER O WITH HORN AND TILDE
+1ee2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1ee3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+1ee4 LATIN CAPITAL LETTER U WITH DOT BELOW
+1ee5 LATIN SMALL LETTER U WITH DOT BELOW
+1ee6 LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1ee7 LATIN SMALL LETTER U WITH HOOK ABOVE
+1ee8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1ee9 LATIN SMALL LETTER U WITH HORN AND ACUTE
+1eea LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1eeb LATIN SMALL LETTER U WITH HORN AND GRAVE
+1eec LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1eed LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+1eee LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1eef LATIN SMALL LETTER U WITH HORN AND TILDE
+1ef0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1ef1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+1ef2 LATIN CAPITAL LETTER Y WITH GRAVE
+1ef3 LATIN SMALL LETTER Y WITH GRAVE
+1ef4 LATIN CAPITAL LETTER Y WITH DOT BELOW
+1ef5 LATIN SMALL LETTER Y WITH DOT BELOW
+1ef6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1ef7 LATIN SMALL LETTER Y WITH HOOK ABOVE
+1ef8 LATIN CAPITAL LETTER Y WITH TILDE
+1ef9 LATIN SMALL LETTER Y WITH TILDE
+1f00 GREEK SMALL LETTER ALPHA WITH PSILI
+1f01 GREEK SMALL LETTER ALPHA WITH DASIA
+1f02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+1f03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+1f04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+1f05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+1f06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1f07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1f08 GREEK CAPITAL LETTER ALPHA WITH PSILI
+1f09 GREEK CAPITAL LETTER ALPHA WITH DASIA
+1f0a GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1f0b GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1f0c GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1f0d GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1f0e GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1f0f GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1f10 GREEK SMALL LETTER EPSILON WITH PSILI
+1f11 GREEK SMALL LETTER EPSILON WITH DASIA
+1f12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+1f13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+1f14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+1f15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1f18 GREEK CAPITAL LETTER EPSILON WITH PSILI
+1f19 GREEK CAPITAL LETTER EPSILON WITH DASIA
+1f1a GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1f1b GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1f1c GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1f1d GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1f20 GREEK SMALL LETTER ETA WITH PSILI
+1f21 GREEK SMALL LETTER ETA WITH DASIA
+1f22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+1f23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+1f24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+1f25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+1f26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+1f27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+1f28 GREEK CAPITAL LETTER ETA WITH PSILI
+1f29 GREEK CAPITAL LETTER ETA WITH DASIA
+1f2a GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1f2b GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1f2c GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1f2d GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1f2e GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1f2f GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1f30 GREEK SMALL LETTER IOTA WITH PSILI
+1f31 GREEK SMALL LETTER IOTA WITH DASIA
+1f32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+1f33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+1f34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+1f35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+1f36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+1f37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+1f38 GREEK CAPITAL LETTER IOTA WITH PSILI
+1f39 GREEK CAPITAL LETTER IOTA WITH DASIA
+1f3a GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1f3b GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1f3c GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1f3d GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1f3e GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1f3f GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1f40 GREEK SMALL LETTER OMICRON WITH PSILI
+1f41 GREEK SMALL LETTER OMICRON WITH DASIA
+1f42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+1f43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+1f44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+1f45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1f48 GREEK CAPITAL LETTER OMICRON WITH PSILI
+1f49 GREEK CAPITAL LETTER OMICRON WITH DASIA
+1f4a GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1f4b GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1f4c GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1f4d GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1f50 GREEK SMALL LETTER UPSILON WITH PSILI
+1f51 GREEK SMALL LETTER UPSILON WITH DASIA
+1f52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1f53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+1f54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1f55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+1f56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1f57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1f59 GREEK CAPITAL LETTER UPSILON WITH DASIA
+1f5b GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1f5d GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1f5f GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1f60 GREEK SMALL LETTER OMEGA WITH PSILI
+1f61 GREEK SMALL LETTER OMEGA WITH DASIA
+1f62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+1f63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+1f64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+1f65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+1f66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1f67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1f68 GREEK CAPITAL LETTER OMEGA WITH PSILI
+1f69 GREEK CAPITAL LETTER OMEGA WITH DASIA
+1f6a GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1f6b GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1f6c GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1f6d GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1f6e GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1f6f GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1f70 GREEK SMALL LETTER ALPHA WITH VARIA
+1f71 GREEK SMALL LETTER ALPHA WITH OXIA
+1f72 GREEK SMALL LETTER EPSILON WITH VARIA
+1f73 GREEK SMALL LETTER EPSILON WITH OXIA
+1f74 GREEK SMALL LETTER ETA WITH VARIA
+1f75 GREEK SMALL LETTER ETA WITH OXIA
+1f76 GREEK SMALL LETTER IOTA WITH VARIA
+1f77 GREEK SMALL LETTER IOTA WITH OXIA
+1f78 GREEK SMALL LETTER OMICRON WITH VARIA
+1f79 GREEK SMALL LETTER OMICRON WITH OXIA
+1f7a GREEK SMALL LETTER UPSILON WITH VARIA
+1f7b GREEK SMALL LETTER UPSILON WITH OXIA
+1f7c GREEK SMALL LETTER OMEGA WITH VARIA
+1f7d GREEK SMALL LETTER OMEGA WITH OXIA
+1f80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1f81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1f82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1f83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1f84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1f85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1f86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1f87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1f88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1f89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1f8a GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1f8b GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1f8c GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1f8d GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1f8e GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1f8f GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1f90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1f91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1f92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1f93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1f94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1f95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1f96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1f97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1f98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1f99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1f9a GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1f9b GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1f9c GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1f9d GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1f9e GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1f9f GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1fa0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1fa1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1fa2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1fa3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1fa4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1fa5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1fa6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1fa7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1fa8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1fa9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1faa GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1fab GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1fac GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1fad GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1fae GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1faf GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1fb0 GREEK SMALL LETTER ALPHA WITH VRACHY
+1fb1 GREEK SMALL LETTER ALPHA WITH MACRON
+1fb2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1fb3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1fb4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1fb6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1fb7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1fb8 GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1fb9 GREEK CAPITAL LETTER ALPHA WITH MACRON
+1fba GREEK CAPITAL LETTER ALPHA WITH VARIA
+1fbb GREEK CAPITAL LETTER ALPHA WITH OXIA
+1fbc GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1fbd GREEK KORONIS
+1fbe GREEK PROSGEGRAMMENI
+1fbf GREEK PSILI
+1fc0 GREEK PERISPOMENI
+1fc1 GREEK DIALYTIKA AND PERISPOMENI
+1fc2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1fc3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1fc4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1fc6 GREEK SMALL LETTER ETA WITH PERISPOMENI
+1fc7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1fc8 GREEK CAPITAL LETTER EPSILON WITH VARIA
+1fc9 GREEK CAPITAL LETTER EPSILON WITH OXIA
+1fca GREEK CAPITAL LETTER ETA WITH VARIA
+1fcb GREEK CAPITAL LETTER ETA WITH OXIA
+1fcc GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1fcd GREEK PSILI AND VARIA
+1fce GREEK PSILI AND OXIA
+1fcf GREEK PSILI AND PERISPOMENI
+1fd0 GREEK SMALL LETTER IOTA WITH VRACHY
+1fd1 GREEK SMALL LETTER IOTA WITH MACRON
+1fd2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1fd3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1fd6 GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1fd7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1fd8 GREEK CAPITAL LETTER IOTA WITH VRACHY
+1fd9 GREEK CAPITAL LETTER IOTA WITH MACRON
+1fda GREEK CAPITAL LETTER IOTA WITH VARIA
+1fdb GREEK CAPITAL LETTER IOTA WITH OXIA
+1fdd GREEK DASIA AND VARIA
+1fde GREEK DASIA AND OXIA
+1fdf GREEK DASIA AND PERISPOMENI
+1fe0 GREEK SMALL LETTER UPSILON WITH VRACHY
+1fe1 GREEK SMALL LETTER UPSILON WITH MACRON
+1fe2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1fe3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1fe4 GREEK SMALL LETTER RHO WITH PSILI
+1fe5 GREEK SMALL LETTER RHO WITH DASIA
+1fe6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1fe7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1fe8 GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1fe9 GREEK CAPITAL LETTER UPSILON WITH MACRON
+1fea GREEK CAPITAL LETTER UPSILON WITH VARIA
+1feb GREEK CAPITAL LETTER UPSILON WITH OXIA
+1fec GREEK CAPITAL LETTER RHO WITH DASIA
+1fed GREEK DIALYTIKA AND VARIA
+1fee GREEK DIALYTIKA AND OXIA
+1fef GREEK VARIA
+1ff2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1ff3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1ff4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1ff6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1ff7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1ff8 GREEK CAPITAL LETTER OMICRON WITH VARIA
+1ff9 GREEK CAPITAL LETTER OMICRON WITH OXIA
+1ffa GREEK CAPITAL LETTER OMEGA WITH VARIA
+1ffb GREEK CAPITAL LETTER OMEGA WITH OXIA
+1ffc GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1ffd GREEK OXIA
+1ffe GREEK DASIA
+2000 EN QUAD
+2001 EM QUAD
+2002 EN SPACE
+2003 EM SPACE
+2004 THREE-PER-EM SPACE
+2005 FOUR-PER-EM SPACE
+2006 SIX-PER-EM SPACE
+2007 FIGURE SPACE
+2008 PUNCTUATION SPACE
+2009 THIN SPACE
+200a HAIR SPACE
+200b ZERO WIDTH SPACE
+200c ZERO WIDTH NON-JOINER
+200d ZERO WIDTH JOINER
+200e LEFT-TO-RIGHT MARK
+200f RIGHT-TO-LEFT MARK
+2010 HYPHEN
+2011 NON-BREAKING HYPHEN
+2012 FIGURE DASH
+2013 EN DASH
+2014 EM DASH
+2015 HORIZONTAL BAR
+2016 DOUBLE VERTICAL LINE
+2017 DOUBLE LOW LINE
+2018 LEFT SINGLE QUOTATION MARK
+2019 RIGHT SINGLE QUOTATION MARK
+201a SINGLE LOW-9 QUOTATION MARK
+201b SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201c LEFT DOUBLE QUOTATION MARK
+201d RIGHT DOUBLE QUOTATION MARK
+201e DOUBLE LOW-9 QUOTATION MARK
+201f DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020 DAGGER
+2021 DOUBLE DAGGER
+2022 BULLET
+2023 TRIANGULAR BULLET
+2024 ONE DOT LEADER
+2025 TWO DOT LEADER
+2026 HORIZONTAL ELLIPSIS
+2027 HYPHENATION POINT
+2028 LINE SEPARATOR
+2029 PARAGRAPH SEPARATOR
+202a LEFT-TO-RIGHT EMBEDDING
+202b RIGHT-TO-LEFT EMBEDDING
+202c POP DIRECTIONAL FORMATTING
+202d LEFT-TO-RIGHT OVERRIDE
+202e RIGHT-TO-LEFT OVERRIDE
+202f NARROW NO-BREAK SPACE
+2030 PER MILLE SIGN
+2031 PER TEN THOUSAND SIGN
+2032 PRIME
+2033 DOUBLE PRIME
+2034 TRIPLE PRIME
+2035 REVERSED PRIME
+2036 REVERSED DOUBLE PRIME
+2037 REVERSED TRIPLE PRIME
+2038 CARET
+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203a SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203b REFERENCE MARK
+203c DOUBLE EXCLAMATION MARK
+203d INTERROBANG
+203e OVERLINE
+203f UNDERTIE
+2040 CHARACTER TIE
+2041 CARET INSERTION POINT
+2042 ASTERISM
+2043 HYPHEN BULLET
+2044 FRACTION SLASH
+2045 LEFT SQUARE BRACKET WITH QUILL
+2046 RIGHT SQUARE BRACKET WITH QUILL
+2048 QUESTION EXCLAMATION MARK
+2049 EXCLAMATION QUESTION MARK
+204a TIRONIAN SIGN ET
+204b REVERSED PILCROW SIGN
+204c BLACK LEFTWARDS BULLET
+204d BLACK RIGHTWARDS BULLET
+206a INHIBIT SYMMETRIC SWAPPING
+206b ACTIVATE SYMMETRIC SWAPPING
+206c INHIBIT ARABIC FORM SHAPING
+206d ACTIVATE ARABIC FORM SHAPING
+206e NATIONAL DIGIT SHAPES
+206f NOMINAL DIGIT SHAPES
+2070 SUPERSCRIPT ZERO
+2074 SUPERSCRIPT FOUR
+2075 SUPERSCRIPT FIVE
+2076 SUPERSCRIPT SIX
+2077 SUPERSCRIPT SEVEN
+2078 SUPERSCRIPT EIGHT
+2079 SUPERSCRIPT NINE
+207a SUPERSCRIPT PLUS SIGN
+207b SUPERSCRIPT MINUS
+207c SUPERSCRIPT EQUALS SIGN
+207d SUPERSCRIPT LEFT PARENTHESIS
+207e SUPERSCRIPT RIGHT PARENTHESIS
+207f SUPERSCRIPT LATIN SMALL LETTER N
+2080 SUBSCRIPT ZERO
+2081 SUBSCRIPT ONE
+2082 SUBSCRIPT TWO
+2083 SUBSCRIPT THREE
+2084 SUBSCRIPT FOUR
+2085 SUBSCRIPT FIVE
+2086 SUBSCRIPT SIX
+2087 SUBSCRIPT SEVEN
+2088 SUBSCRIPT EIGHT
+2089 SUBSCRIPT NINE
+208a SUBSCRIPT PLUS SIGN
+208b SUBSCRIPT MINUS
+208c SUBSCRIPT EQUALS SIGN
+208d SUBSCRIPT LEFT PARENTHESIS
+208e SUBSCRIPT RIGHT PARENTHESIS
+20a0 EURO-CURRENCY SIGN
+20a1 COLON SIGN
+20a2 CRUZEIRO SIGN
+20a3 FRENCH FRANC SIGN
+20a4 LIRA SIGN
+20a5 MILL SIGN
+20a6 NAIRA SIGN
+20a7 PESETA SIGN
+20a8 RUPEE SIGN
+20a9 WON SIGN
+20aa NEW SHEQEL SIGN
+20ab DONG SIGN
+20ac EURO SIGN
+20ad KIP SIGN
+20ae TUGRIK SIGN
+20af DRACHMA SIGN
+20d0 COMBINING LEFT HARPOON ABOVE
+20d1 COMBINING RIGHT HARPOON ABOVE
+20d2 COMBINING LONG VERTICAL LINE OVERLAY
+20d3 COMBINING SHORT VERTICAL LINE OVERLAY
+20d4 COMBINING ANTICLOCKWISE ARROW ABOVE
+20d5 COMBINING CLOCKWISE ARROW ABOVE
+20d6 COMBINING LEFT ARROW ABOVE
+20d7 COMBINING RIGHT ARROW ABOVE
+20d8 COMBINING RING OVERLAY
+20d9 COMBINING CLOCKWISE RING OVERLAY
+20da COMBINING ANTICLOCKWISE RING OVERLAY
+20db COMBINING THREE DOTS ABOVE
+20dc COMBINING FOUR DOTS ABOVE
+20dd COMBINING ENCLOSING CIRCLE
+20de COMBINING ENCLOSING SQUARE
+20df COMBINING ENCLOSING DIAMOND
+20e0 COMBINING ENCLOSING CIRCLE BACKSLASH
+20e1 COMBINING LEFT RIGHT ARROW ABOVE
+20e2 COMBINING ENCLOSING SCREEN
+20e3 COMBINING ENCLOSING KEYCAP
+2100 ACCOUNT OF
+2101 ADDRESSED TO THE SUBJECT
+2102 DOUBLE-STRUCK CAPITAL C
+2103 DEGREE CELSIUS
+2104 CENTRE LINE SYMBOL
+2105 CARE OF
+2106 CADA UNA
+2107 EULER CONSTANT
+2108 SCRUPLE
+2109 DEGREE FAHRENHEIT
+210a SCRIPT SMALL G
+210b SCRIPT CAPITAL H
+210c BLACK-LETTER CAPITAL H
+210d DOUBLE-STRUCK CAPITAL H
+210e PLANCK CONSTANT
+210f PLANCK CONSTANT OVER TWO PI
+2110 SCRIPT CAPITAL I
+2111 BLACK-LETTER CAPITAL I
+2112 SCRIPT CAPITAL L
+2113 SCRIPT SMALL L
+2114 L B BAR SYMBOL
+2115 DOUBLE-STRUCK CAPITAL N
+2116 NUMERO SIGN
+2117 SOUND RECORDING COPYRIGHT
+2118 SCRIPT CAPITAL P
+2119 DOUBLE-STRUCK CAPITAL P
+211a DOUBLE-STRUCK CAPITAL Q
+211b SCRIPT CAPITAL R
+211c BLACK-LETTER CAPITAL R
+211d DOUBLE-STRUCK CAPITAL R
+211e PRESCRIPTION TAKE
+211f RESPONSE
+2120 SERVICE MARK
+2121 TELEPHONE SIGN
+2122 TRADE MARK SIGN
+2123 VERSICLE
+2124 DOUBLE-STRUCK CAPITAL Z
+2125 OUNCE SIGN
+2126 OHM SIGN
+2127 INVERTED OHM SIGN
+2128 BLACK-LETTER CAPITAL Z
+2129 TURNED GREEK SMALL LETTER IOTA
+212a KELVIN SIGN
+212b ANGSTROM SIGN
+212c SCRIPT CAPITAL B
+212d BLACK-LETTER CAPITAL C
+212e ESTIMATED SYMBOL
+212f SCRIPT SMALL E
+2130 SCRIPT CAPITAL E
+2131 SCRIPT CAPITAL F
+2132 TURNED CAPITAL F
+2133 SCRIPT CAPITAL M
+2134 SCRIPT SMALL O
+2135 ALEF SYMBOL
+2136 BET SYMBOL
+2137 GIMEL SYMBOL
+2138 DALET SYMBOL
+2139 INFORMATION SOURCE
+213a ROTATED CAPITAL Q
+2153 VULGAR FRACTION ONE THIRD
+2154 VULGAR FRACTION TWO THIRDS
+2155 VULGAR FRACTION ONE FIFTH
+2156 VULGAR FRACTION TWO FIFTHS
+2157 VULGAR FRACTION THREE FIFTHS
+2158 VULGAR FRACTION FOUR FIFTHS
+2159 VULGAR FRACTION ONE SIXTH
+215a VULGAR FRACTION FIVE SIXTHS
+215b VULGAR FRACTION ONE EIGHTH
+215c VULGAR FRACTION THREE EIGHTHS
+215d VULGAR FRACTION FIVE EIGHTHS
+215e VULGAR FRACTION SEVEN EIGHTHS
+215f FRACTION NUMERATOR ONE
+2160 ROMAN NUMERAL ONE
+2161 ROMAN NUMERAL TWO
+2162 ROMAN NUMERAL THREE
+2163 ROMAN NUMERAL FOUR
+2164 ROMAN NUMERAL FIVE
+2165 ROMAN NUMERAL SIX
+2166 ROMAN NUMERAL SEVEN
+2167 ROMAN NUMERAL EIGHT
+2168 ROMAN NUMERAL NINE
+2169 ROMAN NUMERAL TEN
+216a ROMAN NUMERAL ELEVEN
+216b ROMAN NUMERAL TWELVE
+216c ROMAN NUMERAL FIFTY
+216d ROMAN NUMERAL ONE HUNDRED
+216e ROMAN NUMERAL FIVE HUNDRED
+216f ROMAN NUMERAL ONE THOUSAND
+2170 SMALL ROMAN NUMERAL ONE
+2171 SMALL ROMAN NUMERAL TWO
+2172 SMALL ROMAN NUMERAL THREE
+2173 SMALL ROMAN NUMERAL FOUR
+2174 SMALL ROMAN NUMERAL FIVE
+2175 SMALL ROMAN NUMERAL SIX
+2176 SMALL ROMAN NUMERAL SEVEN
+2177 SMALL ROMAN NUMERAL EIGHT
+2178 SMALL ROMAN NUMERAL NINE
+2179 SMALL ROMAN NUMERAL TEN
+217a SMALL ROMAN NUMERAL ELEVEN
+217b SMALL ROMAN NUMERAL TWELVE
+217c SMALL ROMAN NUMERAL FIFTY
+217d SMALL ROMAN NUMERAL ONE HUNDRED
+217e SMALL ROMAN NUMERAL FIVE HUNDRED
+217f SMALL ROMAN NUMERAL ONE THOUSAND
+2180 ROMAN NUMERAL ONE THOUSAND C D
+2181 ROMAN NUMERAL FIVE THOUSAND
+2182 ROMAN NUMERAL TEN THOUSAND
+2183 ROMAN NUMERAL REVERSED ONE HUNDRED
+2190 LEFTWARDS ARROW
+2191 UPWARDS ARROW
+2192 RIGHTWARDS ARROW
+2193 DOWNWARDS ARROW
+2194 LEFT RIGHT ARROW
+2195 UP DOWN ARROW
+2196 NORTH WEST ARROW
+2197 NORTH EAST ARROW
+2198 SOUTH EAST ARROW
+2199 SOUTH WEST ARROW
+219a LEFTWARDS ARROW WITH STROKE
+219b RIGHTWARDS ARROW WITH STROKE
+219c LEFTWARDS WAVE ARROW
+219d RIGHTWARDS WAVE ARROW
+219e LEFTWARDS TWO HEADED ARROW
+219f UPWARDS TWO HEADED ARROW
+21a0 RIGHTWARDS TWO HEADED ARROW
+21a1 DOWNWARDS TWO HEADED ARROW
+21a2 LEFTWARDS ARROW WITH TAIL
+21a3 RIGHTWARDS ARROW WITH TAIL
+21a4 LEFTWARDS ARROW FROM BAR
+21a5 UPWARDS ARROW FROM BAR
+21a6 RIGHTWARDS ARROW FROM BAR
+21a7 DOWNWARDS ARROW FROM BAR
+21a8 UP DOWN ARROW WITH BASE
+21a9 LEFTWARDS ARROW WITH HOOK
+21aa RIGHTWARDS ARROW WITH HOOK
+21ab LEFTWARDS ARROW WITH LOOP
+21ac RIGHTWARDS ARROW WITH LOOP
+21ad LEFT RIGHT WAVE ARROW
+21ae LEFT RIGHT ARROW WITH STROKE
+21af DOWNWARDS ZIGZAG ARROW
+21b0 UPWARDS ARROW WITH TIP LEFTWARDS
+21b1 UPWARDS ARROW WITH TIP RIGHTWARDS
+21b2 DOWNWARDS ARROW WITH TIP LEFTWARDS
+21b3 DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21b4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21b5 DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21b6 ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21b7 CLOCKWISE TOP SEMICIRCLE ARROW
+21b8 NORTH WEST ARROW TO LONG BAR
+21b9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21ba ANTICLOCKWISE OPEN CIRCLE ARROW
+21bb CLOCKWISE OPEN CIRCLE ARROW
+21bc LEFTWARDS HARPOON WITH BARB UPWARDS
+21bd LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21be UPWARDS HARPOON WITH BARB RIGHTWARDS
+21bf UPWARDS HARPOON WITH BARB LEFTWARDS
+21c0 RIGHTWARDS HARPOON WITH BARB UPWARDS
+21c1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21c2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21c3 DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21c4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21c5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21c6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21c7 LEFTWARDS PAIRED ARROWS
+21c8 UPWARDS PAIRED ARROWS
+21c9 RIGHTWARDS PAIRED ARROWS
+21ca DOWNWARDS PAIRED ARROWS
+21cb LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21cc RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21cd LEFTWARDS DOUBLE ARROW WITH STROKE
+21ce LEFT RIGHT DOUBLE ARROW WITH STROKE
+21cf RIGHTWARDS DOUBLE ARROW WITH STROKE
+21d0 LEFTWARDS DOUBLE ARROW
+21d1 UPWARDS DOUBLE ARROW
+21d2 RIGHTWARDS DOUBLE ARROW
+21d3 DOWNWARDS DOUBLE ARROW
+21d4 LEFT RIGHT DOUBLE ARROW
+21d5 UP DOWN DOUBLE ARROW
+21d6 NORTH WEST DOUBLE ARROW
+21d7 NORTH EAST DOUBLE ARROW
+21d8 SOUTH EAST DOUBLE ARROW
+21d9 SOUTH WEST DOUBLE ARROW
+21da LEFTWARDS TRIPLE ARROW
+21db RIGHTWARDS TRIPLE ARROW
+21dc LEFTWARDS SQUIGGLE ARROW
+21dd RIGHTWARDS SQUIGGLE ARROW
+21de UPWARDS ARROW WITH DOUBLE STROKE
+21df DOWNWARDS ARROW WITH DOUBLE STROKE
+21e0 LEFTWARDS DASHED ARROW
+21e1 UPWARDS DASHED ARROW
+21e2 RIGHTWARDS DASHED ARROW
+21e3 DOWNWARDS DASHED ARROW
+21e4 LEFTWARDS ARROW TO BAR
+21e5 RIGHTWARDS ARROW TO BAR
+21e6 LEFTWARDS WHITE ARROW
+21e7 UPWARDS WHITE ARROW
+21e8 RIGHTWARDS WHITE ARROW
+21e9 DOWNWARDS WHITE ARROW
+21ea UPWARDS WHITE ARROW FROM BAR
+21eb UPWARDS WHITE ARROW ON PEDESTAL
+21ec UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ed UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21ee UPWARDS WHITE DOUBLE ARROW
+21ef UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21f0 RIGHTWARDS WHITE ARROW FROM WALL
+21f1 NORTH WEST ARROW TO CORNER
+21f2 SOUTH EAST ARROW TO CORNER
+21f3 UP DOWN WHITE ARROW
+2200 FOR ALL
+2201 COMPLEMENT
+2202 PARTIAL DIFFERENTIAL
+2203 THERE EXISTS
+2204 THERE DOES NOT EXIST
+2205 EMPTY SET
+2206 INCREMENT
+2207 NABLA
+2208 ELEMENT OF
+2209 NOT AN ELEMENT OF
+220a SMALL ELEMENT OF
+220b CONTAINS AS MEMBER
+220c DOES NOT CONTAIN AS MEMBER
+220d SMALL CONTAINS AS MEMBER
+220e END OF PROOF
+220f N-ARY PRODUCT
+2210 N-ARY COPRODUCT
+2211 N-ARY SUMMATION
+2212 MINUS SIGN
+2213 MINUS-OR-PLUS SIGN
+2214 DOT PLUS
+2215 DIVISION SLASH
+2216 SET MINUS
+2217 ASTERISK OPERATOR
+2218 RING OPERATOR
+2219 BULLET OPERATOR
+221a SQUARE ROOT
+221b CUBE ROOT
+221c FOURTH ROOT
+221d PROPORTIONAL TO
+221e INFINITY
+221f RIGHT ANGLE
+2220 ANGLE
+2221 MEASURED ANGLE
+2222 SPHERICAL ANGLE
+2223 DIVIDES
+2224 DOES NOT DIVIDE
+2225 PARALLEL TO
+2226 NOT PARALLEL TO
+2227 LOGICAL AND
+2228 LOGICAL OR
+2229 INTERSECTION
+222a UNION
+222b INTEGRAL
+222c DOUBLE INTEGRAL
+222d TRIPLE INTEGRAL
+222e CONTOUR INTEGRAL
+222f SURFACE INTEGRAL
+2230 VOLUME INTEGRAL
+2231 CLOCKWISE INTEGRAL
+2232 CLOCKWISE CONTOUR INTEGRAL
+2233 ANTICLOCKWISE CONTOUR INTEGRAL
+2234 THEREFORE
+2235 BECAUSE
+2236 RATIO
+2237 PROPORTION
+2238 DOT MINUS
+2239 EXCESS
+223a GEOMETRIC PROPORTION
+223b HOMOTHETIC
+223c TILDE OPERATOR
+223d REVERSED TILDE
+223e INVERTED LAZY S
+223f SINE WAVE
+2240 WREATH PRODUCT
+2241 NOT TILDE
+2242 MINUS TILDE
+2243 ASYMPTOTICALLY EQUAL TO
+2244 NOT ASYMPTOTICALLY EQUAL TO
+2245 APPROXIMATELY EQUAL TO
+2246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2248 ALMOST EQUAL TO
+2249 NOT ALMOST EQUAL TO
+224a ALMOST EQUAL OR EQUAL TO
+224b TRIPLE TILDE
+224c ALL EQUAL TO
+224d EQUIVALENT TO
+224e GEOMETRICALLY EQUIVALENT TO
+224f DIFFERENCE BETWEEN
+2250 APPROACHES THE LIMIT
+2251 GEOMETRICALLY EQUAL TO
+2252 APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253 IMAGE OF OR APPROXIMATELY EQUAL TO
+2254 COLON EQUALS
+2255 EQUALS COLON
+2256 RING IN EQUAL TO
+2257 RING EQUAL TO
+2258 CORRESPONDS TO
+2259 ESTIMATES
+225a EQUIANGULAR TO
+225b STAR EQUALS
+225c DELTA EQUAL TO
+225d EQUAL TO BY DEFINITION
+225e MEASURED BY
+225f QUESTIONED EQUAL TO
+2260 NOT EQUAL TO
+2261 IDENTICAL TO
+2262 NOT IDENTICAL TO
+2263 STRICTLY EQUIVALENT TO
+2264 LESS-THAN OR EQUAL TO
+2265 GREATER-THAN OR EQUAL TO
+2266 LESS-THAN OVER EQUAL TO
+2267 GREATER-THAN OVER EQUAL TO
+2268 LESS-THAN BUT NOT EQUAL TO
+2269 GREATER-THAN BUT NOT EQUAL TO
+226a MUCH LESS-THAN
+226b MUCH GREATER-THAN
+226c BETWEEN
+226d NOT EQUIVALENT TO
+226e NOT LESS-THAN
+226f NOT GREATER-THAN
+2270 NEITHER LESS-THAN NOR EQUAL TO
+2271 NEITHER GREATER-THAN NOR EQUAL TO
+2272 LESS-THAN OR EQUIVALENT TO
+2273 GREATER-THAN OR EQUIVALENT TO
+2274 NEITHER LESS-THAN NOR EQUIVALENT TO
+2275 NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276 LESS-THAN OR GREATER-THAN
+2277 GREATER-THAN OR LESS-THAN
+2278 NEITHER LESS-THAN NOR GREATER-THAN
+2279 NEITHER GREATER-THAN NOR LESS-THAN
+227a PRECEDES
+227b SUCCEEDS
+227c PRECEDES OR EQUAL TO
+227d SUCCEEDS OR EQUAL TO
+227e PRECEDES OR EQUIVALENT TO
+227f SUCCEEDS OR EQUIVALENT TO
+2280 DOES NOT PRECEDE
+2281 DOES NOT SUCCEED
+2282 SUBSET OF
+2283 SUPERSET OF
+2284 NOT A SUBSET OF
+2285 NOT A SUPERSET OF
+2286 SUBSET OF OR EQUAL TO
+2287 SUPERSET OF OR EQUAL TO
+2288 NEITHER A SUBSET OF NOR EQUAL TO
+2289 NEITHER A SUPERSET OF NOR EQUAL TO
+228a SUBSET OF WITH NOT EQUAL TO
+228b SUPERSET OF WITH NOT EQUAL TO
+228c MULTISET
+228d MULTISET MULTIPLICATION
+228e MULTISET UNION
+228f SQUARE IMAGE OF
+2290 SQUARE ORIGINAL OF
+2291 SQUARE IMAGE OF OR EQUAL TO
+2292 SQUARE ORIGINAL OF OR EQUAL TO
+2293 SQUARE CAP
+2294 SQUARE CUP
+2295 CIRCLED PLUS
+2296 CIRCLED MINUS
+2297 CIRCLED TIMES
+2298 CIRCLED DIVISION SLASH
+2299 CIRCLED DOT OPERATOR
+229a CIRCLED RING OPERATOR
+229b CIRCLED ASTERISK OPERATOR
+229c CIRCLED EQUALS
+229d CIRCLED DASH
+229e SQUARED PLUS
+229f SQUARED MINUS
+22a0 SQUARED TIMES
+22a1 SQUARED DOT OPERATOR
+22a2 RIGHT TACK
+22a3 LEFT TACK
+22a4 DOWN TACK
+22a5 UP TACK
+22a6 ASSERTION
+22a7 MODELS
+22a8 TRUE
+22a9 FORCES
+22aa TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22ab DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22ac DOES NOT PROVE
+22ad NOT TRUE
+22ae DOES NOT FORCE
+22af NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22b0 PRECEDES UNDER RELATION
+22b1 SUCCEEDS UNDER RELATION
+22b2 NORMAL SUBGROUP OF
+22b3 CONTAINS AS NORMAL SUBGROUP
+22b4 NORMAL SUBGROUP OF OR EQUAL TO
+22b5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22b6 ORIGINAL OF
+22b7 IMAGE OF
+22b8 MULTIMAP
+22b9 HERMITIAN CONJUGATE MATRIX
+22ba INTERCALATE
+22bb XOR
+22bc NAND
+22bd NOR
+22be RIGHT ANGLE WITH ARC
+22bf RIGHT TRIANGLE
+22c0 N-ARY LOGICAL AND
+22c1 N-ARY LOGICAL OR
+22c2 N-ARY INTERSECTION
+22c3 N-ARY UNION
+22c4 DIAMOND OPERATOR
+22c5 DOT OPERATOR
+22c6 STAR OPERATOR
+22c7 DIVISION TIMES
+22c8 BOWTIE
+22c9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22ca RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22cb LEFT SEMIDIRECT PRODUCT
+22cc RIGHT SEMIDIRECT PRODUCT
+22cd REVERSED TILDE EQUALS
+22ce CURLY LOGICAL OR
+22cf CURLY LOGICAL AND
+22d0 DOUBLE SUBSET
+22d1 DOUBLE SUPERSET
+22d2 DOUBLE INTERSECTION
+22d3 DOUBLE UNION
+22d4 PITCHFORK
+22d5 EQUAL AND PARALLEL TO
+22d6 LESS-THAN WITH DOT
+22d7 GREATER-THAN WITH DOT
+22d8 VERY MUCH LESS-THAN
+22d9 VERY MUCH GREATER-THAN
+22da LESS-THAN EQUAL TO OR GREATER-THAN
+22db GREATER-THAN EQUAL TO OR LESS-THAN
+22dc EQUAL TO OR LESS-THAN
+22dd EQUAL TO OR GREATER-THAN
+22de EQUAL TO OR PRECEDES
+22df EQUAL TO OR SUCCEEDS
+22e0 DOES NOT PRECEDE OR EQUAL
+22e1 DOES NOT SUCCEED OR EQUAL
+22e2 NOT SQUARE IMAGE OF OR EQUAL TO
+22e3 NOT SQUARE ORIGINAL OF OR EQUAL TO
+22e4 SQUARE IMAGE OF OR NOT EQUAL TO
+22e5 SQUARE ORIGINAL OF OR NOT EQUAL TO
+22e6 LESS-THAN BUT NOT EQUIVALENT TO
+22e7 GREATER-THAN BUT NOT EQUIVALENT TO
+22e8 PRECEDES BUT NOT EQUIVALENT TO
+22e9 SUCCEEDS BUT NOT EQUIVALENT TO
+22ea NOT NORMAL SUBGROUP OF
+22eb DOES NOT CONTAIN AS NORMAL SUBGROUP
+22ec NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ed DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22ee VERTICAL ELLIPSIS
+22ef MIDLINE HORIZONTAL ELLIPSIS
+22f0 UP RIGHT DIAGONAL ELLIPSIS
+22f1 DOWN RIGHT DIAGONAL ELLIPSIS
+2300 DIAMETER SIGN
+2301 ELECTRIC ARROW
+2302 HOUSE
+2303 UP ARROWHEAD
+2304 DOWN ARROWHEAD
+2305 PROJECTIVE
+2306 PERSPECTIVE
+2307 WAVY LINE
+2308 LEFT CEILING
+2309 RIGHT CEILING
+230a LEFT FLOOR
+230b RIGHT FLOOR
+230c BOTTOM RIGHT CROP
+230d BOTTOM LEFT CROP
+230e TOP RIGHT CROP
+230f TOP LEFT CROP
+2310 REVERSED NOT SIGN
+2311 SQUARE LOZENGE
+2312 ARC
+2313 SEGMENT
+2314 SECTOR
+2315 TELEPHONE RECORDER
+2316 POSITION INDICATOR
+2317 VIEWDATA SQUARE
+2318 PLACE OF INTEREST SIGN
+2319 TURNED NOT SIGN
+231a WATCH
+231b HOURGLASS
+231c TOP LEFT CORNER
+231d TOP RIGHT CORNER
+231e BOTTOM LEFT CORNER
+231f BOTTOM RIGHT CORNER
+2320 TOP HALF INTEGRAL
+2321 BOTTOM HALF INTEGRAL
+2322 FROWN
+2323 SMILE
+2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325 OPTION KEY
+2326 ERASE TO THE RIGHT
+2327 X IN A RECTANGLE BOX
+2328 KEYBOARD
+2329 LEFT-POINTING ANGLE BRACKET
+232a RIGHT-POINTING ANGLE BRACKET
+232b ERASE TO THE LEFT
+232c BENZENE RING
+232d CYLINDRICITY
+232e ALL AROUND-PROFILE
+232f SYMMETRY
+2330 TOTAL RUNOUT
+2331 DIMENSION ORIGIN
+2332 CONICAL TAPER
+2333 SLOPE
+2334 COUNTERBORE
+2335 COUNTERSINK
+2336 APL FUNCTIONAL SYMBOL I-BEAM
+2337 APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338 APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233a APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233b APL FUNCTIONAL SYMBOL QUAD JOT
+233c APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233d APL FUNCTIONAL SYMBOL CIRCLE STILE
+233e APL FUNCTIONAL SYMBOL CIRCLE JOT
+233f APL FUNCTIONAL SYMBOL SLASH BAR
+2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341 APL FUNCTIONAL SYMBOL QUAD SLASH
+2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234a APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234b APL FUNCTIONAL SYMBOL DELTA STILE
+234c APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234d APL FUNCTIONAL SYMBOL QUAD DELTA
+234e APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234f APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352 APL FUNCTIONAL SYMBOL DEL STILE
+2353 APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354 APL FUNCTIONAL SYMBOL QUAD DEL
+2355 APL FUNCTIONAL SYMBOL UP TACK JOT
+2356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235a APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235b APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235c APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235d APL FUNCTIONAL SYMBOL UP SHOE JOT
+235e APL FUNCTIONAL SYMBOL QUOTE QUAD
+235f APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360 APL FUNCTIONAL SYMBOL QUAD COLON
+2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362 APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363 APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364 APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236a APL FUNCTIONAL SYMBOL COMMA BAR
+236b APL FUNCTIONAL SYMBOL DEL TILDE
+236c APL FUNCTIONAL SYMBOL ZILDE
+236d APL FUNCTIONAL SYMBOL STILE TILDE
+236e APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236f APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370 APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372 APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373 APL FUNCTIONAL SYMBOL IOTA
+2374 APL FUNCTIONAL SYMBOL RHO
+2375 APL FUNCTIONAL SYMBOL OMEGA
+2376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237a APL FUNCTIONAL SYMBOL ALPHA
+237b NOT CHECK MARK
+237d SHOULDERED OPEN BOX
+237e BELL SYMBOL
+237f VERTICAL LINE WITH MIDDLE DOT
+2380 INSERTION SYMBOL
+2381 CONTINUOUS UNDERLINE SYMBOL
+2382 DISCONTINUOUS UNDERLINE SYMBOL
+2383 EMPHASIS SYMBOL
+2384 COMPOSITION SYMBOL
+2385 WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386 ENTER SYMBOL
+2387 ALTERNATIVE KEY SYMBOL
+2388 HELM SYMBOL
+2389 CIRCLED HORIZONTAL BAR WITH NOTCH
+238a CIRCLED TRIANGLE DOWN
+238b BROKEN CIRCLE WITH NORTHWEST ARROW
+238c UNDO SYMBOL
+238d MONOSTABLE SYMBOL
+238e HYSTERESIS SYMBOL
+238f OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392 PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393 DIRECT CURRENT SYMBOL FORM TWO
+2394 SOFTWARE-FUNCTION SYMBOL
+2395 APL FUNCTIONAL SYMBOL QUAD
+2396 DECIMAL SEPARATOR KEY SYMBOL
+2397 PREVIOUS PAGE
+2398 NEXT PAGE
+2399 PRINT SCREEN SYMBOL
+239a CLEAR SCREEN SYMBOL
+2400 SYMBOL FOR NULL
+2401 SYMBOL FOR START OF HEADING
+2402 SYMBOL FOR START OF TEXT
+2403 SYMBOL FOR END OF TEXT
+2404 SYMBOL FOR END OF TRANSMISSION
+2405 SYMBOL FOR ENQUIRY
+2406 SYMBOL FOR ACKNOWLEDGE
+2407 SYMBOL FOR BELL
+2408 SYMBOL FOR BACKSPACE
+2409 SYMBOL FOR HORIZONTAL TABULATION
+240a SYMBOL FOR LINE FEED
+240b SYMBOL FOR VERTICAL TABULATION
+240c SYMBOL FOR FORM FEED
+240d SYMBOL FOR CARRIAGE RETURN
+240e SYMBOL FOR SHIFT OUT
+240f SYMBOL FOR SHIFT IN
+2410 SYMBOL FOR DATA LINK ESCAPE
+2411 SYMBOL FOR DEVICE CONTROL ONE
+2412 SYMBOL FOR DEVICE CONTROL TWO
+2413 SYMBOL FOR DEVICE CONTROL THREE
+2414 SYMBOL FOR DEVICE CONTROL FOUR
+2415 SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416 SYMBOL FOR SYNCHRONOUS IDLE
+2417 SYMBOL FOR END OF TRANSMISSION BLOCK
+2418 SYMBOL FOR CANCEL
+2419 SYMBOL FOR END OF MEDIUM
+241a SYMBOL FOR SUBSTITUTE
+241b SYMBOL FOR ESCAPE
+241c SYMBOL FOR FILE SEPARATOR
+241d SYMBOL FOR GROUP SEPARATOR
+241e SYMBOL FOR RECORD SEPARATOR
+241f SYMBOL FOR UNIT SEPARATOR
+2420 SYMBOL FOR SPACE
+2421 SYMBOL FOR DELETE
+2422 BLANK SYMBOL
+2423 OPEN BOX
+2424 SYMBOL FOR NEWLINE
+2425 SYMBOL FOR DELETE FORM TWO
+2426 SYMBOL FOR SUBSTITUTE FORM TWO
+2440 OCR HOOK
+2441 OCR CHAIR
+2442 OCR FORK
+2443 OCR INVERTED FORK
+2444 OCR BELT BUCKLE
+2445 OCR BOW TIE
+2446 OCR BRANCH BANK IDENTIFICATION
+2447 OCR AMOUNT OF CHECK
+2448 OCR DASH
+2449 OCR CUSTOMER ACCOUNT NUMBER
+244a OCR DOUBLE BACKSLASH
+2460 CIRCLED DIGIT ONE
+2461 CIRCLED DIGIT TWO
+2462 CIRCLED DIGIT THREE
+2463 CIRCLED DIGIT FOUR
+2464 CIRCLED DIGIT FIVE
+2465 CIRCLED DIGIT SIX
+2466 CIRCLED DIGIT SEVEN
+2467 CIRCLED DIGIT EIGHT
+2468 CIRCLED DIGIT NINE
+2469 CIRCLED NUMBER TEN
+246a CIRCLED NUMBER ELEVEN
+246b CIRCLED NUMBER TWELVE
+246c CIRCLED NUMBER THIRTEEN
+246d CIRCLED NUMBER FOURTEEN
+246e CIRCLED NUMBER FIFTEEN
+246f CIRCLED NUMBER SIXTEEN
+2470 CIRCLED NUMBER SEVENTEEN
+2471 CIRCLED NUMBER EIGHTEEN
+2472 CIRCLED NUMBER NINETEEN
+2473 CIRCLED NUMBER TWENTY
+2474 PARENTHESIZED DIGIT ONE
+2475 PARENTHESIZED DIGIT TWO
+2476 PARENTHESIZED DIGIT THREE
+2477 PARENTHESIZED DIGIT FOUR
+2478 PARENTHESIZED DIGIT FIVE
+2479 PARENTHESIZED DIGIT SIX
+247a PARENTHESIZED DIGIT SEVEN
+247b PARENTHESIZED DIGIT EIGHT
+247c PARENTHESIZED DIGIT NINE
+247d PARENTHESIZED NUMBER TEN
+247e PARENTHESIZED NUMBER ELEVEN
+247f PARENTHESIZED NUMBER TWELVE
+2480 PARENTHESIZED NUMBER THIRTEEN
+2481 PARENTHESIZED NUMBER FOURTEEN
+2482 PARENTHESIZED NUMBER FIFTEEN
+2483 PARENTHESIZED NUMBER SIXTEEN
+2484 PARENTHESIZED NUMBER SEVENTEEN
+2485 PARENTHESIZED NUMBER EIGHTEEN
+2486 PARENTHESIZED NUMBER NINETEEN
+2487 PARENTHESIZED NUMBER TWENTY
+2488 DIGIT ONE FULL STOP
+2489 DIGIT TWO FULL STOP
+248a DIGIT THREE FULL STOP
+248b DIGIT FOUR FULL STOP
+248c DIGIT FIVE FULL STOP
+248d DIGIT SIX FULL STOP
+248e DIGIT SEVEN FULL STOP
+248f DIGIT EIGHT FULL STOP
+2490 DIGIT NINE FULL STOP
+2491 NUMBER TEN FULL STOP
+2492 NUMBER ELEVEN FULL STOP
+2493 NUMBER TWELVE FULL STOP
+2494 NUMBER THIRTEEN FULL STOP
+2495 NUMBER FOURTEEN FULL STOP
+2496 NUMBER FIFTEEN FULL STOP
+2497 NUMBER SIXTEEN FULL STOP
+2498 NUMBER SEVENTEEN FULL STOP
+2499 NUMBER EIGHTEEN FULL STOP
+249a NUMBER NINETEEN FULL STOP
+249b NUMBER TWENTY FULL STOP
+249c PARENTHESIZED LATIN SMALL LETTER A
+249d PARENTHESIZED LATIN SMALL LETTER B
+249e PARENTHESIZED LATIN SMALL LETTER C
+249f PARENTHESIZED LATIN SMALL LETTER D
+24a0 PARENTHESIZED LATIN SMALL LETTER E
+24a1 PARENTHESIZED LATIN SMALL LETTER F
+24a2 PARENTHESIZED LATIN SMALL LETTER G
+24a3 PARENTHESIZED LATIN SMALL LETTER H
+24a4 PARENTHESIZED LATIN SMALL LETTER I
+24a5 PARENTHESIZED LATIN SMALL LETTER J
+24a6 PARENTHESIZED LATIN SMALL LETTER K
+24a7 PARENTHESIZED LATIN SMALL LETTER L
+24a8 PARENTHESIZED LATIN SMALL LETTER M
+24a9 PARENTHESIZED LATIN SMALL LETTER N
+24aa PARENTHESIZED LATIN SMALL LETTER O
+24ab PARENTHESIZED LATIN SMALL LETTER P
+24ac PARENTHESIZED LATIN SMALL LETTER Q
+24ad PARENTHESIZED LATIN SMALL LETTER R
+24ae PARENTHESIZED LATIN SMALL LETTER S
+24af PARENTHESIZED LATIN SMALL LETTER T
+24b0 PARENTHESIZED LATIN SMALL LETTER U
+24b1 PARENTHESIZED LATIN SMALL LETTER V
+24b2 PARENTHESIZED LATIN SMALL LETTER W
+24b3 PARENTHESIZED LATIN SMALL LETTER X
+24b4 PARENTHESIZED LATIN SMALL LETTER Y
+24b5 PARENTHESIZED LATIN SMALL LETTER Z
+24b6 CIRCLED LATIN CAPITAL LETTER A
+24b7 CIRCLED LATIN CAPITAL LETTER B
+24b8 CIRCLED LATIN CAPITAL LETTER C
+24b9 CIRCLED LATIN CAPITAL LETTER D
+24ba CIRCLED LATIN CAPITAL LETTER E
+24bb CIRCLED LATIN CAPITAL LETTER F
+24bc CIRCLED LATIN CAPITAL LETTER G
+24bd CIRCLED LATIN CAPITAL LETTER H
+24be CIRCLED LATIN CAPITAL LETTER I
+24bf CIRCLED LATIN CAPITAL LETTER J
+24c0 CIRCLED LATIN CAPITAL LETTER K
+24c1 CIRCLED LATIN CAPITAL LETTER L
+24c2 CIRCLED LATIN CAPITAL LETTER M
+24c3 CIRCLED LATIN CAPITAL LETTER N
+24c4 CIRCLED LATIN CAPITAL LETTER O
+24c5 CIRCLED LATIN CAPITAL LETTER P
+24c6 CIRCLED LATIN CAPITAL LETTER Q
+24c7 CIRCLED LATIN CAPITAL LETTER R
+24c8 CIRCLED LATIN CAPITAL LETTER S
+24c9 CIRCLED LATIN CAPITAL LETTER T
+24ca CIRCLED LATIN CAPITAL LETTER U
+24cb CIRCLED LATIN CAPITAL LETTER V
+24cc CIRCLED LATIN CAPITAL LETTER W
+24cd CIRCLED LATIN CAPITAL LETTER X
+24ce CIRCLED LATIN CAPITAL LETTER Y
+24cf CIRCLED LATIN CAPITAL LETTER Z
+24d0 CIRCLED LATIN SMALL LETTER A
+24d1 CIRCLED LATIN SMALL LETTER B
+24d2 CIRCLED LATIN SMALL LETTER C
+24d3 CIRCLED LATIN SMALL LETTER D
+24d4 CIRCLED LATIN SMALL LETTER E
+24d5 CIRCLED LATIN SMALL LETTER F
+24d6 CIRCLED LATIN SMALL LETTER G
+24d7 CIRCLED LATIN SMALL LETTER H
+24d8 CIRCLED LATIN SMALL LETTER I
+24d9 CIRCLED LATIN SMALL LETTER J
+24da CIRCLED LATIN SMALL LETTER K
+24db CIRCLED LATIN SMALL LETTER L
+24dc CIRCLED LATIN SMALL LETTER M
+24dd CIRCLED LATIN SMALL LETTER N
+24de CIRCLED LATIN SMALL LETTER O
+24df CIRCLED LATIN SMALL LETTER P
+24e0 CIRCLED LATIN SMALL LETTER Q
+24e1 CIRCLED LATIN SMALL LETTER R
+24e2 CIRCLED LATIN SMALL LETTER S
+24e3 CIRCLED LATIN SMALL LETTER T
+24e4 CIRCLED LATIN SMALL LETTER U
+24e5 CIRCLED LATIN SMALL LETTER V
+24e6 CIRCLED LATIN SMALL LETTER W
+24e7 CIRCLED LATIN SMALL LETTER X
+24e8 CIRCLED LATIN SMALL LETTER Y
+24e9 CIRCLED LATIN SMALL LETTER Z
+24ea CIRCLED DIGIT ZERO
+2500 BOX DRAWINGS LIGHT HORIZONTAL
+2501 BOX DRAWINGS HEAVY HORIZONTAL
+2502 BOX DRAWINGS LIGHT VERTICAL
+2503 BOX DRAWINGS HEAVY VERTICAL
+2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250a BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250b BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250c BOX DRAWINGS LIGHT DOWN AND RIGHT
+250d BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250e BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250f BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510 BOX DRAWINGS LIGHT DOWN AND LEFT
+2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513 BOX DRAWINGS HEAVY DOWN AND LEFT
+2514 BOX DRAWINGS LIGHT UP AND RIGHT
+2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517 BOX DRAWINGS HEAVY UP AND RIGHT
+2518 BOX DRAWINGS LIGHT UP AND LEFT
+2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251a BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251b BOX DRAWINGS HEAVY UP AND LEFT
+251c BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251d BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251e BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251f BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252a BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252b BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252c BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252d BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252e BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252f BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253a BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253b BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253c BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253d BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253e BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253f BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254a BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254b BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254c BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254d BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254e BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254f BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550 BOX DRAWINGS DOUBLE HORIZONTAL
+2551 BOX DRAWINGS DOUBLE VERTICAL
+2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557 BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255a BOX DRAWINGS DOUBLE UP AND RIGHT
+255b BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255c BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255d BOX DRAWINGS DOUBLE UP AND LEFT
+255e BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255f BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256a BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256b BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256c BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256d BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256e BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256f BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573 BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574 BOX DRAWINGS LIGHT LEFT
+2575 BOX DRAWINGS LIGHT UP
+2576 BOX DRAWINGS LIGHT RIGHT
+2577 BOX DRAWINGS LIGHT DOWN
+2578 BOX DRAWINGS HEAVY LEFT
+2579 BOX DRAWINGS HEAVY UP
+257a BOX DRAWINGS HEAVY RIGHT
+257b BOX DRAWINGS HEAVY DOWN
+257c BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257d BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257e BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257f BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580 UPPER HALF BLOCK
+2581 LOWER ONE EIGHTH BLOCK
+2582 LOWER ONE QUARTER BLOCK
+2583 LOWER THREE EIGHTHS BLOCK
+2584 LOWER HALF BLOCK
+2585 LOWER FIVE EIGHTHS BLOCK
+2586 LOWER THREE QUARTERS BLOCK
+2587 LOWER SEVEN EIGHTHS BLOCK
+2588 FULL BLOCK
+2589 LEFT SEVEN EIGHTHS BLOCK
+258a LEFT THREE QUARTERS BLOCK
+258b LEFT FIVE EIGHTHS BLOCK
+258c LEFT HALF BLOCK
+258d LEFT THREE EIGHTHS BLOCK
+258e LEFT ONE QUARTER BLOCK
+258f LEFT ONE EIGHTH BLOCK
+2590 RIGHT HALF BLOCK
+2591 LIGHT SHADE
+2592 MEDIUM SHADE
+2593 DARK SHADE
+2594 UPPER ONE EIGHTH BLOCK
+2595 RIGHT ONE EIGHTH BLOCK
+25a0 BLACK SQUARE
+25a1 WHITE SQUARE
+25a2 WHITE SQUARE WITH ROUNDED CORNERS
+25a3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25a4 SQUARE WITH HORIZONTAL FILL
+25a5 SQUARE WITH VERTICAL FILL
+25a6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25a7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25a8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25a9 SQUARE WITH DIAGONAL CROSSHATCH FILL
+25aa BLACK SMALL SQUARE
+25ab WHITE SMALL SQUARE
+25ac BLACK RECTANGLE
+25ad WHITE RECTANGLE
+25ae BLACK VERTICAL RECTANGLE
+25af WHITE VERTICAL RECTANGLE
+25b0 BLACK PARALLELOGRAM
+25b1 WHITE PARALLELOGRAM
+25b2 BLACK UP-POINTING TRIANGLE
+25b3 WHITE UP-POINTING TRIANGLE
+25b4 BLACK UP-POINTING SMALL TRIANGLE
+25b5 WHITE UP-POINTING SMALL TRIANGLE
+25b6 BLACK RIGHT-POINTING TRIANGLE
+25b7 WHITE RIGHT-POINTING TRIANGLE
+25b8 BLACK RIGHT-POINTING SMALL TRIANGLE
+25b9 WHITE RIGHT-POINTING SMALL TRIANGLE
+25ba BLACK RIGHT-POINTING POINTER
+25bb WHITE RIGHT-POINTING POINTER
+25bc BLACK DOWN-POINTING TRIANGLE
+25bd WHITE DOWN-POINTING TRIANGLE
+25be BLACK DOWN-POINTING SMALL TRIANGLE
+25bf WHITE DOWN-POINTING SMALL TRIANGLE
+25c0 BLACK LEFT-POINTING TRIANGLE
+25c1 WHITE LEFT-POINTING TRIANGLE
+25c2 BLACK LEFT-POINTING SMALL TRIANGLE
+25c3 WHITE LEFT-POINTING SMALL TRIANGLE
+25c4 BLACK LEFT-POINTING POINTER
+25c5 WHITE LEFT-POINTING POINTER
+25c6 BLACK DIAMOND
+25c7 WHITE DIAMOND
+25c8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25c9 FISHEYE
+25ca LOZENGE
+25cb WHITE CIRCLE
+25cc DOTTED CIRCLE
+25cd CIRCLE WITH VERTICAL FILL
+25ce BULLSEYE
+25cf BLACK CIRCLE
+25d0 CIRCLE WITH LEFT HALF BLACK
+25d1 CIRCLE WITH RIGHT HALF BLACK
+25d2 CIRCLE WITH LOWER HALF BLACK
+25d3 CIRCLE WITH UPPER HALF BLACK
+25d4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25d5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25d6 LEFT HALF BLACK CIRCLE
+25d7 RIGHT HALF BLACK CIRCLE
+25d8 INVERSE BULLET
+25d9 INVERSE WHITE CIRCLE
+25da UPPER HALF INVERSE WHITE CIRCLE
+25db LOWER HALF INVERSE WHITE CIRCLE
+25dc UPPER LEFT QUADRANT CIRCULAR ARC
+25dd UPPER RIGHT QUADRANT CIRCULAR ARC
+25de LOWER RIGHT QUADRANT CIRCULAR ARC
+25df LOWER LEFT QUADRANT CIRCULAR ARC
+25e0 UPPER HALF CIRCLE
+25e1 LOWER HALF CIRCLE
+25e2 BLACK LOWER RIGHT TRIANGLE
+25e3 BLACK LOWER LEFT TRIANGLE
+25e4 BLACK UPPER LEFT TRIANGLE
+25e5 BLACK UPPER RIGHT TRIANGLE
+25e6 WHITE BULLET
+25e7 SQUARE WITH LEFT HALF BLACK
+25e8 SQUARE WITH RIGHT HALF BLACK
+25e9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25ea SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25eb WHITE SQUARE WITH VERTICAL BISECTING LINE
+25ec WHITE UP-POINTING TRIANGLE WITH DOT
+25ed UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25ee UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25ef LARGE CIRCLE
+25f0 WHITE SQUARE WITH UPPER LEFT QUADRANT
+25f1 WHITE SQUARE WITH LOWER LEFT QUADRANT
+25f2 WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25f3 WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25f4 WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25f5 WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25f6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25f7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+2600 BLACK SUN WITH RAYS
+2601 CLOUD
+2602 UMBRELLA
+2603 SNOWMAN
+2604 COMET
+2605 BLACK STAR
+2606 WHITE STAR
+2607 LIGHTNING
+2608 THUNDERSTORM
+2609 SUN
+260a ASCENDING NODE
+260b DESCENDING NODE
+260c CONJUNCTION
+260d OPPOSITION
+260e BLACK TELEPHONE
+260f WHITE TELEPHONE
+2610 BALLOT BOX
+2611 BALLOT BOX WITH CHECK
+2612 BALLOT BOX WITH X
+2613 SALTIRE
+2619 REVERSED ROTATED FLORAL HEART BULLET
+261a BLACK LEFT POINTING INDEX
+261b BLACK RIGHT POINTING INDEX
+261c WHITE LEFT POINTING INDEX
+261d WHITE UP POINTING INDEX
+261e WHITE RIGHT POINTING INDEX
+261f WHITE DOWN POINTING INDEX
+2620 SKULL AND CROSSBONES
+2621 CAUTION SIGN
+2622 RADIOACTIVE SIGN
+2623 BIOHAZARD SIGN
+2624 CADUCEUS
+2625 ANKH
+2626 ORTHODOX CROSS
+2627 CHI RHO
+2628 CROSS OF LORRAINE
+2629 CROSS OF JERUSALEM
+262a STAR AND CRESCENT
+262b FARSI SYMBOL
+262c ADI SHAKTI
+262d HAMMER AND SICKLE
+262e PEACE SYMBOL
+262f YIN YANG
+2630 TRIGRAM FOR HEAVEN
+2631 TRIGRAM FOR LAKE
+2632 TRIGRAM FOR FIRE
+2633 TRIGRAM FOR THUNDER
+2634 TRIGRAM FOR WIND
+2635 TRIGRAM FOR WATER
+2636 TRIGRAM FOR MOUNTAIN
+2637 TRIGRAM FOR EARTH
+2638 WHEEL OF DHARMA
+2639 WHITE FROWNING FACE
+263a WHITE SMILING FACE
+263b BLACK SMILING FACE
+263c WHITE SUN WITH RAYS
+263d FIRST QUARTER MOON
+263e LAST QUARTER MOON
+263f MERCURY
+2640 FEMALE SIGN
+2641 EARTH
+2642 MALE SIGN
+2643 JUPITER
+2644 SATURN
+2645 URANUS
+2646 NEPTUNE
+2647 PLUTO
+2648 ARIES
+2649 TAURUS
+264a GEMINI
+264b CANCER
+264c LEO
+264d VIRGO
+264e LIBRA
+264f SCORPIUS
+2650 SAGITTARIUS
+2651 CAPRICORN
+2652 AQUARIUS
+2653 PISCES
+2654 WHITE CHESS KING
+2655 WHITE CHESS QUEEN
+2656 WHITE CHESS ROOK
+2657 WHITE CHESS BISHOP
+2658 WHITE CHESS KNIGHT
+2659 WHITE CHESS PAWN
+265a BLACK CHESS KING
+265b BLACK CHESS QUEEN
+265c BLACK CHESS ROOK
+265d BLACK CHESS BISHOP
+265e BLACK CHESS KNIGHT
+265f BLACK CHESS PAWN
+2660 BLACK SPADE SUIT
+2661 WHITE HEART SUIT
+2662 WHITE DIAMOND SUIT
+2663 BLACK CLUB SUIT
+2664 WHITE SPADE SUIT
+2665 BLACK HEART SUIT
+2666 BLACK DIAMOND SUIT
+2667 WHITE CLUB SUIT
+2668 HOT SPRINGS
+2669 QUARTER NOTE
+266a EIGHTH NOTE
+266b BEAMED EIGHTH NOTES
+266c BEAMED SIXTEENTH NOTES
+266d MUSIC FLAT SIGN
+266e MUSIC NATURAL SIGN
+266f MUSIC SHARP SIGN
+2670 WEST SYRIAC CROSS
+2671 EAST SYRIAC CROSS
+2701 UPPER BLADE SCISSORS
+2702 BLACK SCISSORS
+2703 LOWER BLADE SCISSORS
+2704 WHITE SCISSORS
+2706 TELEPHONE LOCATION SIGN
+2707 TAPE DRIVE
+2708 AIRPLANE
+2709 ENVELOPE
+270c VICTORY HAND
+270d WRITING HAND
+270e LOWER RIGHT PENCIL
+270f PENCIL
+2710 UPPER RIGHT PENCIL
+2711 WHITE NIB
+2712 BLACK NIB
+2713 CHECK MARK
+2714 HEAVY CHECK MARK
+2715 MULTIPLICATION X
+2716 HEAVY MULTIPLICATION X
+2717 BALLOT X
+2718 HEAVY BALLOT X
+2719 OUTLINED GREEK CROSS
+271a HEAVY GREEK CROSS
+271b OPEN CENTRE CROSS
+271c HEAVY OPEN CENTRE CROSS
+271d LATIN CROSS
+271e SHADOWED WHITE LATIN CROSS
+271f OUTLINED LATIN CROSS
+2720 MALTESE CROSS
+2721 STAR OF DAVID
+2722 FOUR TEARDROP-SPOKED ASTERISK
+2723 FOUR BALLOON-SPOKED ASTERISK
+2724 HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725 FOUR CLUB-SPOKED ASTERISK
+2726 BLACK FOUR POINTED STAR
+2727 WHITE FOUR POINTED STAR
+2729 STRESS OUTLINED WHITE STAR
+272a CIRCLED WHITE STAR
+272b OPEN CENTRE BLACK STAR
+272c BLACK CENTRE WHITE STAR
+272d OUTLINED BLACK STAR
+272e HEAVY OUTLINED BLACK STAR
+272f PINWHEEL STAR
+2730 SHADOWED WHITE STAR
+2731 HEAVY ASTERISK
+2732 OPEN CENTRE ASTERISK
+2733 EIGHT SPOKED ASTERISK
+2734 EIGHT POINTED BLACK STAR
+2735 EIGHT POINTED PINWHEEL STAR
+2736 SIX POINTED BLACK STAR
+2737 EIGHT POINTED RECTILINEAR BLACK STAR
+2738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739 TWELVE POINTED BLACK STAR
+273a SIXTEEN POINTED ASTERISK
+273b TEARDROP-SPOKED ASTERISK
+273c OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273d HEAVY TEARDROP-SPOKED ASTERISK
+273e SIX PETALLED BLACK AND WHITE FLORETTE
+273f BLACK FLORETTE
+2740 WHITE FLORETTE
+2741 EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742 CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744 SNOWFLAKE
+2745 TIGHT TRIFOLIATE SNOWFLAKE
+2746 HEAVY CHEVRON SNOWFLAKE
+2747 SPARKLE
+2748 HEAVY SPARKLE
+2749 BALLOON-SPOKED ASTERISK
+274a EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274b HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274d SHADOWED WHITE CIRCLE
+274f LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751 LOWER RIGHT SHADOWED WHITE SQUARE
+2752 UPPER RIGHT SHADOWED WHITE SQUARE
+2756 BLACK DIAMOND MINUS WHITE X
+2758 LIGHT VERTICAL BAR
+2759 MEDIUM VERTICAL BAR
+275a HEAVY VERTICAL BAR
+275b HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275c HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275d HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275e HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761 CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762 HEAVY EXCLAMATION MARK ORNAMENT
+2763 HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764 HEAVY BLACK HEART
+2765 ROTATED HEAVY BLACK HEART BULLET
+2766 FLORAL HEART
+2767 ROTATED FLORAL HEART BULLET
+2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777 DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778 DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277a DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277b DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277c DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277d DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277e DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277f DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278a DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278b DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278c DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278d DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278e DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278f DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798 HEAVY SOUTH EAST ARROW
+2799 HEAVY RIGHTWARDS ARROW
+279a HEAVY NORTH EAST ARROW
+279b DRAFTING POINT RIGHTWARDS ARROW
+279c HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279d TRIANGLE-HEADED RIGHTWARDS ARROW
+279e HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279f DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27a0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27a1 BLACK RIGHTWARDS ARROW
+27a2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27a3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27a4 BLACK RIGHTWARDS ARROWHEAD
+27a5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27a6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27a7 SQUAT BLACK RIGHTWARDS ARROW
+27a8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27a9 RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27aa LEFT-SHADED WHITE RIGHTWARDS ARROW
+27ab BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27ac FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27ad HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27ae HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27af NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27b1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27b2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27b3 WHITE-FEATHERED RIGHTWARDS ARROW
+27b4 BLACK-FEATHERED SOUTH EAST ARROW
+27b5 BLACK-FEATHERED RIGHTWARDS ARROW
+27b6 BLACK-FEATHERED NORTH EAST ARROW
+27b7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27b8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27b9 HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27ba TEARDROP-BARBED RIGHTWARDS ARROW
+27bb HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27bc WEDGE-TAILED RIGHTWARDS ARROW
+27bd HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27be OPEN-OUTLINED RIGHTWARDS ARROW
+2800 BRAILLE PATTERN BLANK
+2801 BRAILLE PATTERN DOTS-1
+2802 BRAILLE PATTERN DOTS-2
+2803 BRAILLE PATTERN DOTS-12
+2804 BRAILLE PATTERN DOTS-3
+2805 BRAILLE PATTERN DOTS-13
+2806 BRAILLE PATTERN DOTS-23
+2807 BRAILLE PATTERN DOTS-123
+2808 BRAILLE PATTERN DOTS-4
+2809 BRAILLE PATTERN DOTS-14
+280a BRAILLE PATTERN DOTS-24
+280b BRAILLE PATTERN DOTS-124
+280c BRAILLE PATTERN DOTS-34
+280d BRAILLE PATTERN DOTS-134
+280e BRAILLE PATTERN DOTS-234
+280f BRAILLE PATTERN DOTS-1234
+2810 BRAILLE PATTERN DOTS-5
+2811 BRAILLE PATTERN DOTS-15
+2812 BRAILLE PATTERN DOTS-25
+2813 BRAILLE PATTERN DOTS-125
+2814 BRAILLE PATTERN DOTS-35
+2815 BRAILLE PATTERN DOTS-135
+2816 BRAILLE PATTERN DOTS-235
+2817 BRAILLE PATTERN DOTS-1235
+2818 BRAILLE PATTERN DOTS-45
+2819 BRAILLE PATTERN DOTS-145
+281a BRAILLE PATTERN DOTS-245
+281b BRAILLE PATTERN DOTS-1245
+281c BRAILLE PATTERN DOTS-345
+281d BRAILLE PATTERN DOTS-1345
+281e BRAILLE PATTERN DOTS-2345
+281f BRAILLE PATTERN DOTS-12345
+2820 BRAILLE PATTERN DOTS-6
+2821 BRAILLE PATTERN DOTS-16
+2822 BRAILLE PATTERN DOTS-26
+2823 BRAILLE PATTERN DOTS-126
+2824 BRAILLE PATTERN DOTS-36
+2825 BRAILLE PATTERN DOTS-136
+2826 BRAILLE PATTERN DOTS-236
+2827 BRAILLE PATTERN DOTS-1236
+2828 BRAILLE PATTERN DOTS-46
+2829 BRAILLE PATTERN DOTS-146
+282a BRAILLE PATTERN DOTS-246
+282b BRAILLE PATTERN DOTS-1246
+282c BRAILLE PATTERN DOTS-346
+282d BRAILLE PATTERN DOTS-1346
+282e BRAILLE PATTERN DOTS-2346
+282f BRAILLE PATTERN DOTS-12346
+2830 BRAILLE PATTERN DOTS-56
+2831 BRAILLE PATTERN DOTS-156
+2832 BRAILLE PATTERN DOTS-256
+2833 BRAILLE PATTERN DOTS-1256
+2834 BRAILLE PATTERN DOTS-356
+2835 BRAILLE PATTERN DOTS-1356
+2836 BRAILLE PATTERN DOTS-2356
+2837 BRAILLE PATTERN DOTS-12356
+2838 BRAILLE PATTERN DOTS-456
+2839 BRAILLE PATTERN DOTS-1456
+283a BRAILLE PATTERN DOTS-2456
+283b BRAILLE PATTERN DOTS-12456
+283c BRAILLE PATTERN DOTS-3456
+283d BRAILLE PATTERN DOTS-13456
+283e BRAILLE PATTERN DOTS-23456
+283f BRAILLE PATTERN DOTS-123456
+2840 BRAILLE PATTERN DOTS-7
+2841 BRAILLE PATTERN DOTS-17
+2842 BRAILLE PATTERN DOTS-27
+2843 BRAILLE PATTERN DOTS-127
+2844 BRAILLE PATTERN DOTS-37
+2845 BRAILLE PATTERN DOTS-137
+2846 BRAILLE PATTERN DOTS-237
+2847 BRAILLE PATTERN DOTS-1237
+2848 BRAILLE PATTERN DOTS-47
+2849 BRAILLE PATTERN DOTS-147
+284a BRAILLE PATTERN DOTS-247
+284b BRAILLE PATTERN DOTS-1247
+284c BRAILLE PATTERN DOTS-347
+284d BRAILLE PATTERN DOTS-1347
+284e BRAILLE PATTERN DOTS-2347
+284f BRAILLE PATTERN DOTS-12347
+2850 BRAILLE PATTERN DOTS-57
+2851 BRAILLE PATTERN DOTS-157
+2852 BRAILLE PATTERN DOTS-257
+2853 BRAILLE PATTERN DOTS-1257
+2854 BRAILLE PATTERN DOTS-357
+2855 BRAILLE PATTERN DOTS-1357
+2856 BRAILLE PATTERN DOTS-2357
+2857 BRAILLE PATTERN DOTS-12357
+2858 BRAILLE PATTERN DOTS-457
+2859 BRAILLE PATTERN DOTS-1457
+285a BRAILLE PATTERN DOTS-2457
+285b BRAILLE PATTERN DOTS-12457
+285c BRAILLE PATTERN DOTS-3457
+285d BRAILLE PATTERN DOTS-13457
+285e BRAILLE PATTERN DOTS-23457
+285f BRAILLE PATTERN DOTS-123457
+2860 BRAILLE PATTERN DOTS-67
+2861 BRAILLE PATTERN DOTS-167
+2862 BRAILLE PATTERN DOTS-267
+2863 BRAILLE PATTERN DOTS-1267
+2864 BRAILLE PATTERN DOTS-367
+2865 BRAILLE PATTERN DOTS-1367
+2866 BRAILLE PATTERN DOTS-2367
+2867 BRAILLE PATTERN DOTS-12367
+2868 BRAILLE PATTERN DOTS-467
+2869 BRAILLE PATTERN DOTS-1467
+286a BRAILLE PATTERN DOTS-2467
+286b BRAILLE PATTERN DOTS-12467
+286c BRAILLE PATTERN DOTS-3467
+286d BRAILLE PATTERN DOTS-13467
+286e BRAILLE PATTERN DOTS-23467
+286f BRAILLE PATTERN DOTS-123467
+2870 BRAILLE PATTERN DOTS-567
+2871 BRAILLE PATTERN DOTS-1567
+2872 BRAILLE PATTERN DOTS-2567
+2873 BRAILLE PATTERN DOTS-12567
+2874 BRAILLE PATTERN DOTS-3567
+2875 BRAILLE PATTERN DOTS-13567
+2876 BRAILLE PATTERN DOTS-23567
+2877 BRAILLE PATTERN DOTS-123567
+2878 BRAILLE PATTERN DOTS-4567
+2879 BRAILLE PATTERN DOTS-14567
+287a BRAILLE PATTERN DOTS-24567
+287b BRAILLE PATTERN DOTS-124567
+287c BRAILLE PATTERN DOTS-34567
+287d BRAILLE PATTERN DOTS-134567
+287e BRAILLE PATTERN DOTS-234567
+287f BRAILLE PATTERN DOTS-1234567
+2880 BRAILLE PATTERN DOTS-8
+2881 BRAILLE PATTERN DOTS-18
+2882 BRAILLE PATTERN DOTS-28
+2883 BRAILLE PATTERN DOTS-128
+2884 BRAILLE PATTERN DOTS-38
+2885 BRAILLE PATTERN DOTS-138
+2886 BRAILLE PATTERN DOTS-238
+2887 BRAILLE PATTERN DOTS-1238
+2888 BRAILLE PATTERN DOTS-48
+2889 BRAILLE PATTERN DOTS-148
+288a BRAILLE PATTERN DOTS-248
+288b BRAILLE PATTERN DOTS-1248
+288c BRAILLE PATTERN DOTS-348
+288d BRAILLE PATTERN DOTS-1348
+288e BRAILLE PATTERN DOTS-2348
+288f BRAILLE PATTERN DOTS-12348
+2890 BRAILLE PATTERN DOTS-58
+2891 BRAILLE PATTERN DOTS-158
+2892 BRAILLE PATTERN DOTS-258
+2893 BRAILLE PATTERN DOTS-1258
+2894 BRAILLE PATTERN DOTS-358
+2895 BRAILLE PATTERN DOTS-1358
+2896 BRAILLE PATTERN DOTS-2358
+2897 BRAILLE PATTERN DOTS-12358
+2898 BRAILLE PATTERN DOTS-458
+2899 BRAILLE PATTERN DOTS-1458
+289a BRAILLE PATTERN DOTS-2458
+289b BRAILLE PATTERN DOTS-12458
+289c BRAILLE PATTERN DOTS-3458
+289d BRAILLE PATTERN DOTS-13458
+289e BRAILLE PATTERN DOTS-23458
+289f BRAILLE PATTERN DOTS-123458
+28a0 BRAILLE PATTERN DOTS-68
+28a1 BRAILLE PATTERN DOTS-168
+28a2 BRAILLE PATTERN DOTS-268
+28a3 BRAILLE PATTERN DOTS-1268
+28a4 BRAILLE PATTERN DOTS-368
+28a5 BRAILLE PATTERN DOTS-1368
+28a6 BRAILLE PATTERN DOTS-2368
+28a7 BRAILLE PATTERN DOTS-12368
+28a8 BRAILLE PATTERN DOTS-468
+28a9 BRAILLE PATTERN DOTS-1468
+28aa BRAILLE PATTERN DOTS-2468
+28ab BRAILLE PATTERN DOTS-12468
+28ac BRAILLE PATTERN DOTS-3468
+28ad BRAILLE PATTERN DOTS-13468
+28ae BRAILLE PATTERN DOTS-23468
+28af BRAILLE PATTERN DOTS-123468
+28b0 BRAILLE PATTERN DOTS-568
+28b1 BRAILLE PATTERN DOTS-1568
+28b2 BRAILLE PATTERN DOTS-2568
+28b3 BRAILLE PATTERN DOTS-12568
+28b4 BRAILLE PATTERN DOTS-3568
+28b5 BRAILLE PATTERN DOTS-13568
+28b6 BRAILLE PATTERN DOTS-23568
+28b7 BRAILLE PATTERN DOTS-123568
+28b8 BRAILLE PATTERN DOTS-4568
+28b9 BRAILLE PATTERN DOTS-14568
+28ba BRAILLE PATTERN DOTS-24568
+28bb BRAILLE PATTERN DOTS-124568
+28bc BRAILLE PATTERN DOTS-34568
+28bd BRAILLE PATTERN DOTS-134568
+28be BRAILLE PATTERN DOTS-234568
+28bf BRAILLE PATTERN DOTS-1234568
+28c0 BRAILLE PATTERN DOTS-78
+28c1 BRAILLE PATTERN DOTS-178
+28c2 BRAILLE PATTERN DOTS-278
+28c3 BRAILLE PATTERN DOTS-1278
+28c4 BRAILLE PATTERN DOTS-378
+28c5 BRAILLE PATTERN DOTS-1378
+28c6 BRAILLE PATTERN DOTS-2378
+28c7 BRAILLE PATTERN DOTS-12378
+28c8 BRAILLE PATTERN DOTS-478
+28c9 BRAILLE PATTERN DOTS-1478
+28ca BRAILLE PATTERN DOTS-2478
+28cb BRAILLE PATTERN DOTS-12478
+28cc BRAILLE PATTERN DOTS-3478
+28cd BRAILLE PATTERN DOTS-13478
+28ce BRAILLE PATTERN DOTS-23478
+28cf BRAILLE PATTERN DOTS-123478
+28d0 BRAILLE PATTERN DOTS-578
+28d1 BRAILLE PATTERN DOTS-1578
+28d2 BRAILLE PATTERN DOTS-2578
+28d3 BRAILLE PATTERN DOTS-12578
+28d4 BRAILLE PATTERN DOTS-3578
+28d5 BRAILLE PATTERN DOTS-13578
+28d6 BRAILLE PATTERN DOTS-23578
+28d7 BRAILLE PATTERN DOTS-123578
+28d8 BRAILLE PATTERN DOTS-4578
+28d9 BRAILLE PATTERN DOTS-14578
+28da BRAILLE PATTERN DOTS-24578
+28db BRAILLE PATTERN DOTS-124578
+28dc BRAILLE PATTERN DOTS-34578
+28dd BRAILLE PATTERN DOTS-134578
+28de BRAILLE PATTERN DOTS-234578
+28df BRAILLE PATTERN DOTS-1234578
+28e0 BRAILLE PATTERN DOTS-678
+28e1 BRAILLE PATTERN DOTS-1678
+28e2 BRAILLE PATTERN DOTS-2678
+28e3 BRAILLE PATTERN DOTS-12678
+28e4 BRAILLE PATTERN DOTS-3678
+28e5 BRAILLE PATTERN DOTS-13678
+28e6 BRAILLE PATTERN DOTS-23678
+28e7 BRAILLE PATTERN DOTS-123678
+28e8 BRAILLE PATTERN DOTS-4678
+28e9 BRAILLE PATTERN DOTS-14678
+28ea BRAILLE PATTERN DOTS-24678
+28eb BRAILLE PATTERN DOTS-124678
+28ec BRAILLE PATTERN DOTS-34678
+28ed BRAILLE PATTERN DOTS-134678
+28ee BRAILLE PATTERN DOTS-234678
+28ef BRAILLE PATTERN DOTS-1234678
+28f0 BRAILLE PATTERN DOTS-5678
+28f1 BRAILLE PATTERN DOTS-15678
+28f2 BRAILLE PATTERN DOTS-25678
+28f3 BRAILLE PATTERN DOTS-125678
+28f4 BRAILLE PATTERN DOTS-35678
+28f5 BRAILLE PATTERN DOTS-135678
+28f6 BRAILLE PATTERN DOTS-235678
+28f7 BRAILLE PATTERN DOTS-1235678
+28f8 BRAILLE PATTERN DOTS-45678
+28f9 BRAILLE PATTERN DOTS-145678
+28fa BRAILLE PATTERN DOTS-245678
+28fb BRAILLE PATTERN DOTS-1245678
+28fc BRAILLE PATTERN DOTS-345678
+28fd BRAILLE PATTERN DOTS-1345678
+28fe BRAILLE PATTERN DOTS-2345678
+28ff BRAILLE PATTERN DOTS-12345678
+2e80 CJK RADICAL REPEAT
+2e81 CJK RADICAL CLIFF
+2e82 CJK RADICAL SECOND ONE
+2e83 CJK RADICAL SECOND TWO
+2e84 CJK RADICAL SECOND THREE
+2e85 CJK RADICAL PERSON
+2e86 CJK RADICAL BOX
+2e87 CJK RADICAL TABLE
+2e88 CJK RADICAL KNIFE ONE
+2e89 CJK RADICAL KNIFE TWO
+2e8a CJK RADICAL DIVINATION
+2e8b CJK RADICAL SEAL
+2e8c CJK RADICAL SMALL ONE
+2e8d CJK RADICAL SMALL TWO
+2e8e CJK RADICAL LAME ONE
+2e8f CJK RADICAL LAME TWO
+2e90 CJK RADICAL LAME THREE
+2e91 CJK RADICAL LAME FOUR
+2e92 CJK RADICAL SNAKE
+2e93 CJK RADICAL THREAD
+2e94 CJK RADICAL SNOUT ONE
+2e95 CJK RADICAL SNOUT TWO
+2e96 CJK RADICAL HEART ONE
+2e97 CJK RADICAL HEART TWO
+2e98 CJK RADICAL HAND
+2e99 CJK RADICAL RAP
+2e9b CJK RADICAL CHOKE
+2e9c CJK RADICAL SUN
+2e9d CJK RADICAL MOON
+2e9e CJK RADICAL DEATH
+2e9f CJK RADICAL MOTHER
+2ea0 CJK RADICAL CIVILIAN
+2ea1 CJK RADICAL WATER ONE
+2ea2 CJK RADICAL WATER TWO
+2ea3 CJK RADICAL FIRE
+2ea4 CJK RADICAL PAW ONE
+2ea5 CJK RADICAL PAW TWO
+2ea6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2ea7 CJK RADICAL COW
+2ea8 CJK RADICAL DOG
+2ea9 CJK RADICAL JADE
+2eaa CJK RADICAL BOLT OF CLOTH
+2eab CJK RADICAL EYE
+2eac CJK RADICAL SPIRIT ONE
+2ead CJK RADICAL SPIRIT TWO
+2eae CJK RADICAL BAMBOO
+2eaf CJK RADICAL SILK
+2eb0 CJK RADICAL C-SIMPLIFIED SILK
+2eb1 CJK RADICAL NET ONE
+2eb2 CJK RADICAL NET TWO
+2eb3 CJK RADICAL NET THREE
+2eb4 CJK RADICAL NET FOUR
+2eb5 CJK RADICAL MESH
+2eb6 CJK RADICAL SHEEP
+2eb7 CJK RADICAL RAM
+2eb8 CJK RADICAL EWE
+2eb9 CJK RADICAL OLD
+2eba CJK RADICAL BRUSH ONE
+2ebb CJK RADICAL BRUSH TWO
+2ebc CJK RADICAL MEAT
+2ebd CJK RADICAL MORTAR
+2ebe CJK RADICAL GRASS ONE
+2ebf CJK RADICAL GRASS TWO
+2ec0 CJK RADICAL GRASS THREE
+2ec1 CJK RADICAL TIGER
+2ec2 CJK RADICAL CLOTHES
+2ec3 CJK RADICAL WEST ONE
+2ec4 CJK RADICAL WEST TWO
+2ec5 CJK RADICAL C-SIMPLIFIED SEE
+2ec6 CJK RADICAL SIMPLIFIED HORN
+2ec7 CJK RADICAL HORN
+2ec8 CJK RADICAL C-SIMPLIFIED SPEECH
+2ec9 CJK RADICAL C-SIMPLIFIED SHELL
+2eca CJK RADICAL FOOT
+2ecb CJK RADICAL C-SIMPLIFIED CART
+2ecc CJK RADICAL SIMPLIFIED WALK
+2ecd CJK RADICAL WALK ONE
+2ece CJK RADICAL WALK TWO
+2ecf CJK RADICAL CITY
+2ed0 CJK RADICAL C-SIMPLIFIED GOLD
+2ed1 CJK RADICAL LONG ONE
+2ed2 CJK RADICAL LONG TWO
+2ed3 CJK RADICAL C-SIMPLIFIED LONG
+2ed4 CJK RADICAL C-SIMPLIFIED GATE
+2ed5 CJK RADICAL MOUND ONE
+2ed6 CJK RADICAL MOUND TWO
+2ed7 CJK RADICAL RAIN
+2ed8 CJK RADICAL BLUE
+2ed9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2eda CJK RADICAL C-SIMPLIFIED LEAF
+2edb CJK RADICAL C-SIMPLIFIED WIND
+2edc CJK RADICAL C-SIMPLIFIED FLY
+2edd CJK RADICAL EAT ONE
+2ede CJK RADICAL EAT TWO
+2edf CJK RADICAL EAT THREE
+2ee0 CJK RADICAL C-SIMPLIFIED EAT
+2ee1 CJK RADICAL HEAD
+2ee2 CJK RADICAL C-SIMPLIFIED HORSE
+2ee3 CJK RADICAL BONE
+2ee4 CJK RADICAL GHOST
+2ee5 CJK RADICAL C-SIMPLIFIED FISH
+2ee6 CJK RADICAL C-SIMPLIFIED BIRD
+2ee7 CJK RADICAL C-SIMPLIFIED SALT
+2ee8 CJK RADICAL SIMPLIFIED WHEAT
+2ee9 CJK RADICAL SIMPLIFIED YELLOW
+2eea CJK RADICAL C-SIMPLIFIED FROG
+2eeb CJK RADICAL J-SIMPLIFIED EVEN
+2eec CJK RADICAL C-SIMPLIFIED EVEN
+2eed CJK RADICAL J-SIMPLIFIED TOOTH
+2eee CJK RADICAL C-SIMPLIFIED TOOTH
+2eef CJK RADICAL J-SIMPLIFIED DRAGON
+2ef0 CJK RADICAL C-SIMPLIFIED DRAGON
+2ef1 CJK RADICAL TURTLE
+2ef2 CJK RADICAL J-SIMPLIFIED TURTLE
+2ef3 CJK RADICAL C-SIMPLIFIED TURTLE
+2f00 KANGXI RADICAL ONE
+2f01 KANGXI RADICAL LINE
+2f02 KANGXI RADICAL DOT
+2f03 KANGXI RADICAL SLASH
+2f04 KANGXI RADICAL SECOND
+2f05 KANGXI RADICAL HOOK
+2f06 KANGXI RADICAL TWO
+2f07 KANGXI RADICAL LID
+2f08 KANGXI RADICAL MAN
+2f09 KANGXI RADICAL LEGS
+2f0a KANGXI RADICAL ENTER
+2f0b KANGXI RADICAL EIGHT
+2f0c KANGXI RADICAL DOWN BOX
+2f0d KANGXI RADICAL COVER
+2f0e KANGXI RADICAL ICE
+2f0f KANGXI RADICAL TABLE
+2f10 KANGXI RADICAL OPEN BOX
+2f11 KANGXI RADICAL KNIFE
+2f12 KANGXI RADICAL POWER
+2f13 KANGXI RADICAL WRAP
+2f14 KANGXI RADICAL SPOON
+2f15 KANGXI RADICAL RIGHT OPEN BOX
+2f16 KANGXI RADICAL HIDING ENCLOSURE
+2f17 KANGXI RADICAL TEN
+2f18 KANGXI RADICAL DIVINATION
+2f19 KANGXI RADICAL SEAL
+2f1a KANGXI RADICAL CLIFF
+2f1b KANGXI RADICAL PRIVATE
+2f1c KANGXI RADICAL AGAIN
+2f1d KANGXI RADICAL MOUTH
+2f1e KANGXI RADICAL ENCLOSURE
+2f1f KANGXI RADICAL EARTH
+2f20 KANGXI RADICAL SCHOLAR
+2f21 KANGXI RADICAL GO
+2f22 KANGXI RADICAL GO SLOWLY
+2f23 KANGXI RADICAL EVENING
+2f24 KANGXI RADICAL BIG
+2f25 KANGXI RADICAL WOMAN
+2f26 KANGXI RADICAL CHILD
+2f27 KANGXI RADICAL ROOF
+2f28 KANGXI RADICAL INCH
+2f29 KANGXI RADICAL SMALL
+2f2a KANGXI RADICAL LAME
+2f2b KANGXI RADICAL CORPSE
+2f2c KANGXI RADICAL SPROUT
+2f2d KANGXI RADICAL MOUNTAIN
+2f2e KANGXI RADICAL RIVER
+2f2f KANGXI RADICAL WORK
+2f30 KANGXI RADICAL ONESELF
+2f31 KANGXI RADICAL TURBAN
+2f32 KANGXI RADICAL DRY
+2f33 KANGXI RADICAL SHORT THREAD
+2f34 KANGXI RADICAL DOTTED CLIFF
+2f35 KANGXI RADICAL LONG STRIDE
+2f36 KANGXI RADICAL TWO HANDS
+2f37 KANGXI RADICAL SHOOT
+2f38 KANGXI RADICAL BOW
+2f39 KANGXI RADICAL SNOUT
+2f3a KANGXI RADICAL BRISTLE
+2f3b KANGXI RADICAL STEP
+2f3c KANGXI RADICAL HEART
+2f3d KANGXI RADICAL HALBERD
+2f3e KANGXI RADICAL DOOR
+2f3f KANGXI RADICAL HAND
+2f40 KANGXI RADICAL BRANCH
+2f41 KANGXI RADICAL RAP
+2f42 KANGXI RADICAL SCRIPT
+2f43 KANGXI RADICAL DIPPER
+2f44 KANGXI RADICAL AXE
+2f45 KANGXI RADICAL SQUARE
+2f46 KANGXI RADICAL NOT
+2f47 KANGXI RADICAL SUN
+2f48 KANGXI RADICAL SAY
+2f49 KANGXI RADICAL MOON
+2f4a KANGXI RADICAL TREE
+2f4b KANGXI RADICAL LACK
+2f4c KANGXI RADICAL STOP
+2f4d KANGXI RADICAL DEATH
+2f4e KANGXI RADICAL WEAPON
+2f4f KANGXI RADICAL DO NOT
+2f50 KANGXI RADICAL COMPARE
+2f51 KANGXI RADICAL FUR
+2f52 KANGXI RADICAL CLAN
+2f53 KANGXI RADICAL STEAM
+2f54 KANGXI RADICAL WATER
+2f55 KANGXI RADICAL FIRE
+2f56 KANGXI RADICAL CLAW
+2f57 KANGXI RADICAL FATHER
+2f58 KANGXI RADICAL DOUBLE X
+2f59 KANGXI RADICAL HALF TREE TRUNK
+2f5a KANGXI RADICAL SLICE
+2f5b KANGXI RADICAL FANG
+2f5c KANGXI RADICAL COW
+2f5d KANGXI RADICAL DOG
+2f5e KANGXI RADICAL PROFOUND
+2f5f KANGXI RADICAL JADE
+2f60 KANGXI RADICAL MELON
+2f61 KANGXI RADICAL TILE
+2f62 KANGXI RADICAL SWEET
+2f63 KANGXI RADICAL LIFE
+2f64 KANGXI RADICAL USE
+2f65 KANGXI RADICAL FIELD
+2f66 KANGXI RADICAL BOLT OF CLOTH
+2f67 KANGXI RADICAL SICKNESS
+2f68 KANGXI RADICAL DOTTED TENT
+2f69 KANGXI RADICAL WHITE
+2f6a KANGXI RADICAL SKIN
+2f6b KANGXI RADICAL DISH
+2f6c KANGXI RADICAL EYE
+2f6d KANGXI RADICAL SPEAR
+2f6e KANGXI RADICAL ARROW
+2f6f KANGXI RADICAL STONE
+2f70 KANGXI RADICAL SPIRIT
+2f71 KANGXI RADICAL TRACK
+2f72 KANGXI RADICAL GRAIN
+2f73 KANGXI RADICAL CAVE
+2f74 KANGXI RADICAL STAND
+2f75 KANGXI RADICAL BAMBOO
+2f76 KANGXI RADICAL RICE
+2f77 KANGXI RADICAL SILK
+2f78 KANGXI RADICAL JAR
+2f79 KANGXI RADICAL NET
+2f7a KANGXI RADICAL SHEEP
+2f7b KANGXI RADICAL FEATHER
+2f7c KANGXI RADICAL OLD
+2f7d KANGXI RADICAL AND
+2f7e KANGXI RADICAL PLOW
+2f7f KANGXI RADICAL EAR
+2f80 KANGXI RADICAL BRUSH
+2f81 KANGXI RADICAL MEAT
+2f82 KANGXI RADICAL MINISTER
+2f83 KANGXI RADICAL SELF
+2f84 KANGXI RADICAL ARRIVE
+2f85 KANGXI RADICAL MORTAR
+2f86 KANGXI RADICAL TONGUE
+2f87 KANGXI RADICAL OPPOSE
+2f88 KANGXI RADICAL BOAT
+2f89 KANGXI RADICAL STOPPING
+2f8a KANGXI RADICAL COLOR
+2f8b KANGXI RADICAL GRASS
+2f8c KANGXI RADICAL TIGER
+2f8d KANGXI RADICAL INSECT
+2f8e KANGXI RADICAL BLOOD
+2f8f KANGXI RADICAL WALK ENCLOSURE
+2f90 KANGXI RADICAL CLOTHES
+2f91 KANGXI RADICAL WEST
+2f92 KANGXI RADICAL SEE
+2f93 KANGXI RADICAL HORN
+2f94 KANGXI RADICAL SPEECH
+2f95 KANGXI RADICAL VALLEY
+2f96 KANGXI RADICAL BEAN
+2f97 KANGXI RADICAL PIG
+2f98 KANGXI RADICAL BADGER
+2f99 KANGXI RADICAL SHELL
+2f9a KANGXI RADICAL RED
+2f9b KANGXI RADICAL RUN
+2f9c KANGXI RADICAL FOOT
+2f9d KANGXI RADICAL BODY
+2f9e KANGXI RADICAL CART
+2f9f KANGXI RADICAL BITTER
+2fa0 KANGXI RADICAL MORNING
+2fa1 KANGXI RADICAL WALK
+2fa2 KANGXI RADICAL CITY
+2fa3 KANGXI RADICAL WINE
+2fa4 KANGXI RADICAL DISTINGUISH
+2fa5 KANGXI RADICAL VILLAGE
+2fa6 KANGXI RADICAL GOLD
+2fa7 KANGXI RADICAL LONG
+2fa8 KANGXI RADICAL GATE
+2fa9 KANGXI RADICAL MOUND
+2faa KANGXI RADICAL SLAVE
+2fab KANGXI RADICAL SHORT TAILED BIRD
+2fac KANGXI RADICAL RAIN
+2fad KANGXI RADICAL BLUE
+2fae KANGXI RADICAL WRONG
+2faf KANGXI RADICAL FACE
+2fb0 KANGXI RADICAL LEATHER
+2fb1 KANGXI RADICAL TANNED LEATHER
+2fb2 KANGXI RADICAL LEEK
+2fb3 KANGXI RADICAL SOUND
+2fb4 KANGXI RADICAL LEAF
+2fb5 KANGXI RADICAL WIND
+2fb6 KANGXI RADICAL FLY
+2fb7 KANGXI RADICAL EAT
+2fb8 KANGXI RADICAL HEAD
+2fb9 KANGXI RADICAL FRAGRANT
+2fba KANGXI RADICAL HORSE
+2fbb KANGXI RADICAL BONE
+2fbc KANGXI RADICAL TALL
+2fbd KANGXI RADICAL HAIR
+2fbe KANGXI RADICAL FIGHT
+2fbf KANGXI RADICAL SACRIFICIAL WINE
+2fc0 KANGXI RADICAL CAULDRON
+2fc1 KANGXI RADICAL GHOST
+2fc2 KANGXI RADICAL FISH
+2fc3 KANGXI RADICAL BIRD
+2fc4 KANGXI RADICAL SALT
+2fc5 KANGXI RADICAL DEER
+2fc6 KANGXI RADICAL WHEAT
+2fc7 KANGXI RADICAL HEMP
+2fc8 KANGXI RADICAL YELLOW
+2fc9 KANGXI RADICAL MILLET
+2fca KANGXI RADICAL BLACK
+2fcb KANGXI RADICAL EMBROIDERY
+2fcc KANGXI RADICAL FROG
+2fcd KANGXI RADICAL TRIPOD
+2fce KANGXI RADICAL DRUM
+2fcf KANGXI RADICAL RAT
+2fd0 KANGXI RADICAL NOSE
+2fd1 KANGXI RADICAL EVEN
+2fd2 KANGXI RADICAL TOOTH
+2fd3 KANGXI RADICAL DRAGON
+2fd4 KANGXI RADICAL TURTLE
+2fd5 KANGXI RADICAL FLUTE
+2ff0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2ff1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2ff2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2ff3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2ff4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2ff5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2ff6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2ff7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2ff8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2ff9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2ffa IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2ffb IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 IDEOGRAPHIC SPACE
+3001 IDEOGRAPHIC COMMA
+3002 IDEOGRAPHIC FULL STOP
+3003 DITTO MARK
+3004 JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005 IDEOGRAPHIC ITERATION MARK
+3006 IDEOGRAPHIC CLOSING MARK
+3007 IDEOGRAPHIC NUMBER ZERO
+3008 LEFT ANGLE BRACKET
+3009 RIGHT ANGLE BRACKET
+300a LEFT DOUBLE ANGLE BRACKET
+300b RIGHT DOUBLE ANGLE BRACKET
+300c LEFT CORNER BRACKET
+300d RIGHT CORNER BRACKET
+300e LEFT WHITE CORNER BRACKET
+300f RIGHT WHITE CORNER BRACKET
+3010 LEFT BLACK LENTICULAR BRACKET
+3011 RIGHT BLACK LENTICULAR BRACKET
+3012 POSTAL MARK
+3013 GETA MARK
+3014 LEFT TORTOISE SHELL BRACKET
+3015 RIGHT TORTOISE SHELL BRACKET
+3016 LEFT WHITE LENTICULAR BRACKET
+3017 RIGHT WHITE LENTICULAR BRACKET
+3018 LEFT WHITE TORTOISE SHELL BRACKET
+3019 RIGHT WHITE TORTOISE SHELL BRACKET
+301a LEFT WHITE SQUARE BRACKET
+301b RIGHT WHITE SQUARE BRACKET
+301c WAVE DASH
+301d REVERSED DOUBLE PRIME QUOTATION MARK
+301e DOUBLE PRIME QUOTATION MARK
+301f LOW DOUBLE PRIME QUOTATION MARK
+3020 POSTAL MARK FACE
+3021 HANGZHOU NUMERAL ONE
+3022 HANGZHOU NUMERAL TWO
+3023 HANGZHOU NUMERAL THREE
+3024 HANGZHOU NUMERAL FOUR
+3025 HANGZHOU NUMERAL FIVE
+3026 HANGZHOU NUMERAL SIX
+3027 HANGZHOU NUMERAL SEVEN
+3028 HANGZHOU NUMERAL EIGHT
+3029 HANGZHOU NUMERAL NINE
+302a IDEOGRAPHIC LEVEL TONE MARK
+302b IDEOGRAPHIC RISING TONE MARK
+302c IDEOGRAPHIC DEPARTING TONE MARK
+302d IDEOGRAPHIC ENTERING TONE MARK
+302e HANGUL SINGLE DOT TONE MARK
+302f HANGUL DOUBLE DOT TONE MARK
+3030 WAVY DASH
+3031 VERTICAL KANA REPEAT MARK
+3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+3033 VERTICAL KANA REPEAT MARK UPPER HALF
+3034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+3035 VERTICAL KANA REPEAT MARK LOWER HALF
+3036 CIRCLED POSTAL MARK
+3037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+3038 HANGZHOU NUMERAL TEN
+3039 HANGZHOU NUMERAL TWENTY
+303a HANGZHOU NUMERAL THIRTY
+303e IDEOGRAPHIC VARIATION INDICATOR
+303f IDEOGRAPHIC HALF FILL SPACE
+3041 HIRAGANA LETTER SMALL A
+3042 HIRAGANA LETTER A
+3043 HIRAGANA LETTER SMALL I
+3044 HIRAGANA LETTER I
+3045 HIRAGANA LETTER SMALL U
+3046 HIRAGANA LETTER U
+3047 HIRAGANA LETTER SMALL E
+3048 HIRAGANA LETTER E
+3049 HIRAGANA LETTER SMALL O
+304a HIRAGANA LETTER O
+304b HIRAGANA LETTER KA
+304c HIRAGANA LETTER GA
+304d HIRAGANA LETTER KI
+304e HIRAGANA LETTER GI
+304f HIRAGANA LETTER KU
+3050 HIRAGANA LETTER GU
+3051 HIRAGANA LETTER KE
+3052 HIRAGANA LETTER GE
+3053 HIRAGANA LETTER KO
+3054 HIRAGANA LETTER GO
+3055 HIRAGANA LETTER SA
+3056 HIRAGANA LETTER ZA
+3057 HIRAGANA LETTER SI
+3058 HIRAGANA LETTER ZI
+3059 HIRAGANA LETTER SU
+305a HIRAGANA LETTER ZU
+305b HIRAGANA LETTER SE
+305c HIRAGANA LETTER ZE
+305d HIRAGANA LETTER SO
+305e HIRAGANA LETTER ZO
+305f HIRAGANA LETTER TA
+3060 HIRAGANA LETTER DA
+3061 HIRAGANA LETTER TI
+3062 HIRAGANA LETTER DI
+3063 HIRAGANA LETTER SMALL TU
+3064 HIRAGANA LETTER TU
+3065 HIRAGANA LETTER DU
+3066 HIRAGANA LETTER TE
+3067 HIRAGANA LETTER DE
+3068 HIRAGANA LETTER TO
+3069 HIRAGANA LETTER DO
+306a HIRAGANA LETTER NA
+306b HIRAGANA LETTER NI
+306c HIRAGANA LETTER NU
+306d HIRAGANA LETTER NE
+306e HIRAGANA LETTER NO
+306f HIRAGANA LETTER HA
+3070 HIRAGANA LETTER BA
+3071 HIRAGANA LETTER PA
+3072 HIRAGANA LETTER HI
+3073 HIRAGANA LETTER BI
+3074 HIRAGANA LETTER PI
+3075 HIRAGANA LETTER HU
+3076 HIRAGANA LETTER BU
+3077 HIRAGANA LETTER PU
+3078 HIRAGANA LETTER HE
+3079 HIRAGANA LETTER BE
+307a HIRAGANA LETTER PE
+307b HIRAGANA LETTER HO
+307c HIRAGANA LETTER BO
+307d HIRAGANA LETTER PO
+307e HIRAGANA LETTER MA
+307f HIRAGANA LETTER MI
+3080 HIRAGANA LETTER MU
+3081 HIRAGANA LETTER ME
+3082 HIRAGANA LETTER MO
+3083 HIRAGANA LETTER SMALL YA
+3084 HIRAGANA LETTER YA
+3085 HIRAGANA LETTER SMALL YU
+3086 HIRAGANA LETTER YU
+3087 HIRAGANA LETTER SMALL YO
+3088 HIRAGANA LETTER YO
+3089 HIRAGANA LETTER RA
+308a HIRAGANA LETTER RI
+308b HIRAGANA LETTER RU
+308c HIRAGANA LETTER RE
+308d HIRAGANA LETTER RO
+308e HIRAGANA LETTER SMALL WA
+308f HIRAGANA LETTER WA
+3090 HIRAGANA LETTER WI
+3091 HIRAGANA LETTER WE
+3092 HIRAGANA LETTER WO
+3093 HIRAGANA LETTER N
+3094 HIRAGANA LETTER VU
+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309b KATAKANA-HIRAGANA VOICED SOUND MARK
+309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309d HIRAGANA ITERATION MARK
+309e HIRAGANA VOICED ITERATION MARK
+30a1 KATAKANA LETTER SMALL A
+30a2 KATAKANA LETTER A
+30a3 KATAKANA LETTER SMALL I
+30a4 KATAKANA LETTER I
+30a5 KATAKANA LETTER SMALL U
+30a6 KATAKANA LETTER U
+30a7 KATAKANA LETTER SMALL E
+30a8 KATAKANA LETTER E
+30a9 KATAKANA LETTER SMALL O
+30aa KATAKANA LETTER O
+30ab KATAKANA LETTER KA
+30ac KATAKANA LETTER GA
+30ad KATAKANA LETTER KI
+30ae KATAKANA LETTER GI
+30af KATAKANA LETTER KU
+30b0 KATAKANA LETTER GU
+30b1 KATAKANA LETTER KE
+30b2 KATAKANA LETTER GE
+30b3 KATAKANA LETTER KO
+30b4 KATAKANA LETTER GO
+30b5 KATAKANA LETTER SA
+30b6 KATAKANA LETTER ZA
+30b7 KATAKANA LETTER SI
+30b8 KATAKANA LETTER ZI
+30b9 KATAKANA LETTER SU
+30ba KATAKANA LETTER ZU
+30bb KATAKANA LETTER SE
+30bc KATAKANA LETTER ZE
+30bd KATAKANA LETTER SO
+30be KATAKANA LETTER ZO
+30bf KATAKANA LETTER TA
+30c0 KATAKANA LETTER DA
+30c1 KATAKANA LETTER TI
+30c2 KATAKANA LETTER DI
+30c3 KATAKANA LETTER SMALL TU
+30c4 KATAKANA LETTER TU
+30c5 KATAKANA LETTER DU
+30c6 KATAKANA LETTER TE
+30c7 KATAKANA LETTER DE
+30c8 KATAKANA LETTER TO
+30c9 KATAKANA LETTER DO
+30ca KATAKANA LETTER NA
+30cb KATAKANA LETTER NI
+30cc KATAKANA LETTER NU
+30cd KATAKANA LETTER NE
+30ce KATAKANA LETTER NO
+30cf KATAKANA LETTER HA
+30d0 KATAKANA LETTER BA
+30d1 KATAKANA LETTER PA
+30d2 KATAKANA LETTER HI
+30d3 KATAKANA LETTER BI
+30d4 KATAKANA LETTER PI
+30d5 KATAKANA LETTER HU
+30d6 KATAKANA LETTER BU
+30d7 KATAKANA LETTER PU
+30d8 KATAKANA LETTER HE
+30d9 KATAKANA LETTER BE
+30da KATAKANA LETTER PE
+30db KATAKANA LETTER HO
+30dc KATAKANA LETTER BO
+30dd KATAKANA LETTER PO
+30de KATAKANA LETTER MA
+30df KATAKANA LETTER MI
+30e0 KATAKANA LETTER MU
+30e1 KATAKANA LETTER ME
+30e2 KATAKANA LETTER MO
+30e3 KATAKANA LETTER SMALL YA
+30e4 KATAKANA LETTER YA
+30e5 KATAKANA LETTER SMALL YU
+30e6 KATAKANA LETTER YU
+30e7 KATAKANA LETTER SMALL YO
+30e8 KATAKANA LETTER YO
+30e9 KATAKANA LETTER RA
+30ea KATAKANA LETTER RI
+30eb KATAKANA LETTER RU
+30ec KATAKANA LETTER RE
+30ed KATAKANA LETTER RO
+30ee KATAKANA LETTER SMALL WA
+30ef KATAKANA LETTER WA
+30f0 KATAKANA LETTER WI
+30f1 KATAKANA LETTER WE
+30f2 KATAKANA LETTER WO
+30f3 KATAKANA LETTER N
+30f4 KATAKANA LETTER VU
+30f5 KATAKANA LETTER SMALL KA
+30f6 KATAKANA LETTER SMALL KE
+30f7 KATAKANA LETTER VA
+30f8 KATAKANA LETTER VI
+30f9 KATAKANA LETTER VE
+30fa KATAKANA LETTER VO
+30fb KATAKANA MIDDLE DOT
+30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30fd KATAKANA ITERATION MARK
+30fe KATAKANA VOICED ITERATION MARK
+3105 BOPOMOFO LETTER B
+3106 BOPOMOFO LETTER P
+3107 BOPOMOFO LETTER M
+3108 BOPOMOFO LETTER F
+3109 BOPOMOFO LETTER D
+310a BOPOMOFO LETTER T
+310b BOPOMOFO LETTER N
+310c BOPOMOFO LETTER L
+310d BOPOMOFO LETTER G
+310e BOPOMOFO LETTER K
+310f BOPOMOFO LETTER H
+3110 BOPOMOFO LETTER J
+3111 BOPOMOFO LETTER Q
+3112 BOPOMOFO LETTER X
+3113 BOPOMOFO LETTER ZH
+3114 BOPOMOFO LETTER CH
+3115 BOPOMOFO LETTER SH
+3116 BOPOMOFO LETTER R
+3117 BOPOMOFO LETTER Z
+3118 BOPOMOFO LETTER C
+3119 BOPOMOFO LETTER S
+311a BOPOMOFO LETTER A
+311b BOPOMOFO LETTER O
+311c BOPOMOFO LETTER E
+311d BOPOMOFO LETTER EH
+311e BOPOMOFO LETTER AI
+311f BOPOMOFO LETTER EI
+3120 BOPOMOFO LETTER AU
+3121 BOPOMOFO LETTER OU
+3122 BOPOMOFO LETTER AN
+3123 BOPOMOFO LETTER EN
+3124 BOPOMOFO LETTER ANG
+3125 BOPOMOFO LETTER ENG
+3126 BOPOMOFO LETTER ER
+3127 BOPOMOFO LETTER I
+3128 BOPOMOFO LETTER U
+3129 BOPOMOFO LETTER IU
+312a BOPOMOFO LETTER V
+312b BOPOMOFO LETTER NG
+312c BOPOMOFO LETTER GN
+3131 HANGUL LETTER KIYEOK
+3132 HANGUL LETTER SSANGKIYEOK
+3133 HANGUL LETTER KIYEOK-SIOS
+3134 HANGUL LETTER NIEUN
+3135 HANGUL LETTER NIEUN-CIEUC
+3136 HANGUL LETTER NIEUN-HIEUH
+3137 HANGUL LETTER TIKEUT
+3138 HANGUL LETTER SSANGTIKEUT
+3139 HANGUL LETTER RIEUL
+313a HANGUL LETTER RIEUL-KIYEOK
+313b HANGUL LETTER RIEUL-MIEUM
+313c HANGUL LETTER RIEUL-PIEUP
+313d HANGUL LETTER RIEUL-SIOS
+313e HANGUL LETTER RIEUL-THIEUTH
+313f HANGUL LETTER RIEUL-PHIEUPH
+3140 HANGUL LETTER RIEUL-HIEUH
+3141 HANGUL LETTER MIEUM
+3142 HANGUL LETTER PIEUP
+3143 HANGUL LETTER SSANGPIEUP
+3144 HANGUL LETTER PIEUP-SIOS
+3145 HANGUL LETTER SIOS
+3146 HANGUL LETTER SSANGSIOS
+3147 HANGUL LETTER IEUNG
+3148 HANGUL LETTER CIEUC
+3149 HANGUL LETTER SSANGCIEUC
+314a HANGUL LETTER CHIEUCH
+314b HANGUL LETTER KHIEUKH
+314c HANGUL LETTER THIEUTH
+314d HANGUL LETTER PHIEUPH
+314e HANGUL LETTER HIEUH
+314f HANGUL LETTER A
+3150 HANGUL LETTER AE
+3151 HANGUL LETTER YA
+3152 HANGUL LETTER YAE
+3153 HANGUL LETTER EO
+3154 HANGUL LETTER E
+3155 HANGUL LETTER YEO
+3156 HANGUL LETTER YE
+3157 HANGUL LETTER O
+3158 HANGUL LETTER WA
+3159 HANGUL LETTER WAE
+315a HANGUL LETTER OE
+315b HANGUL LETTER YO
+315c HANGUL LETTER U
+315d HANGUL LETTER WEO
+315e HANGUL LETTER WE
+315f HANGUL LETTER WI
+3160 HANGUL LETTER YU
+3161 HANGUL LETTER EU
+3162 HANGUL LETTER YI
+3163 HANGUL LETTER I
+3164 HANGUL FILLER
+3165 HANGUL LETTER SSANGNIEUN
+3166 HANGUL LETTER NIEUN-TIKEUT
+3167 HANGUL LETTER NIEUN-SIOS
+3168 HANGUL LETTER NIEUN-PANSIOS
+3169 HANGUL LETTER RIEUL-KIYEOK-SIOS
+316a HANGUL LETTER RIEUL-TIKEUT
+316b HANGUL LETTER RIEUL-PIEUP-SIOS
+316c HANGUL LETTER RIEUL-PANSIOS
+316d HANGUL LETTER RIEUL-YEORINHIEUH
+316e HANGUL LETTER MIEUM-PIEUP
+316f HANGUL LETTER MIEUM-SIOS
+3170 HANGUL LETTER MIEUM-PANSIOS
+3171 HANGUL LETTER KAPYEOUNMIEUM
+3172 HANGUL LETTER PIEUP-KIYEOK
+3173 HANGUL LETTER PIEUP-TIKEUT
+3174 HANGUL LETTER PIEUP-SIOS-KIYEOK
+3175 HANGUL LETTER PIEUP-SIOS-TIKEUT
+3176 HANGUL LETTER PIEUP-CIEUC
+3177 HANGUL LETTER PIEUP-THIEUTH
+3178 HANGUL LETTER KAPYEOUNPIEUP
+3179 HANGUL LETTER KAPYEOUNSSANGPIEUP
+317a HANGUL LETTER SIOS-KIYEOK
+317b HANGUL LETTER SIOS-NIEUN
+317c HANGUL LETTER SIOS-TIKEUT
+317d HANGUL LETTER SIOS-PIEUP
+317e HANGUL LETTER SIOS-CIEUC
+317f HANGUL LETTER PANSIOS
+3180 HANGUL LETTER SSANGIEUNG
+3181 HANGUL LETTER YESIEUNG
+3182 HANGUL LETTER YESIEUNG-SIOS
+3183 HANGUL LETTER YESIEUNG-PANSIOS
+3184 HANGUL LETTER KAPYEOUNPHIEUPH
+3185 HANGUL LETTER SSANGHIEUH
+3186 HANGUL LETTER YEORINHIEUH
+3187 HANGUL LETTER YO-YA
+3188 HANGUL LETTER YO-YAE
+3189 HANGUL LETTER YO-I
+318a HANGUL LETTER YU-YEO
+318b HANGUL LETTER YU-YE
+318c HANGUL LETTER YU-I
+318d HANGUL LETTER ARAEA
+318e HANGUL LETTER ARAEAE
+3190 IDEOGRAPHIC ANNOTATION LINKING MARK
+3191 IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192 IDEOGRAPHIC ANNOTATION ONE MARK
+3193 IDEOGRAPHIC ANNOTATION TWO MARK
+3194 IDEOGRAPHIC ANNOTATION THREE MARK
+3195 IDEOGRAPHIC ANNOTATION FOUR MARK
+3196 IDEOGRAPHIC ANNOTATION TOP MARK
+3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK
+3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK
+3199 IDEOGRAPHIC ANNOTATION FIRST MARK
+319a IDEOGRAPHIC ANNOTATION SECOND MARK
+319b IDEOGRAPHIC ANNOTATION THIRD MARK
+319c IDEOGRAPHIC ANNOTATION FOURTH MARK
+319d IDEOGRAPHIC ANNOTATION HEAVEN MARK
+319e IDEOGRAPHIC ANNOTATION EARTH MARK
+319f IDEOGRAPHIC ANNOTATION MAN MARK
+31a0 BOPOMOFO LETTER BU
+31a1 BOPOMOFO LETTER ZI
+31a2 BOPOMOFO LETTER JI
+31a3 BOPOMOFO LETTER GU
+31a4 BOPOMOFO LETTER EE
+31a5 BOPOMOFO LETTER ENN
+31a6 BOPOMOFO LETTER OO
+31a7 BOPOMOFO LETTER ONN
+31a8 BOPOMOFO LETTER IR
+31a9 BOPOMOFO LETTER ANN
+31aa BOPOMOFO LETTER INN
+31ab BOPOMOFO LETTER UNN
+31ac BOPOMOFO LETTER IM
+31ad BOPOMOFO LETTER NGG
+31ae BOPOMOFO LETTER AINN
+31af BOPOMOFO LETTER AUNN
+31b0 BOPOMOFO LETTER AM
+31b1 BOPOMOFO LETTER OM
+31b2 BOPOMOFO LETTER ONG
+31b3 BOPOMOFO LETTER INNN
+31b4 BOPOMOFO FINAL LETTER P
+31b5 BOPOMOFO FINAL LETTER T
+31b6 BOPOMOFO FINAL LETTER K
+31b7 BOPOMOFO FINAL LETTER H
+3200 PARENTHESIZED HANGUL KIYEOK
+3201 PARENTHESIZED HANGUL NIEUN
+3202 PARENTHESIZED HANGUL TIKEUT
+3203 PARENTHESIZED HANGUL RIEUL
+3204 PARENTHESIZED HANGUL MIEUM
+3205 PARENTHESIZED HANGUL PIEUP
+3206 PARENTHESIZED HANGUL SIOS
+3207 PARENTHESIZED HANGUL IEUNG
+3208 PARENTHESIZED HANGUL CIEUC
+3209 PARENTHESIZED HANGUL CHIEUCH
+320a PARENTHESIZED HANGUL KHIEUKH
+320b PARENTHESIZED HANGUL THIEUTH
+320c PARENTHESIZED HANGUL PHIEUPH
+320d PARENTHESIZED HANGUL HIEUH
+320e PARENTHESIZED HANGUL KIYEOK A
+320f PARENTHESIZED HANGUL NIEUN A
+3210 PARENTHESIZED HANGUL TIKEUT A
+3211 PARENTHESIZED HANGUL RIEUL A
+3212 PARENTHESIZED HANGUL MIEUM A
+3213 PARENTHESIZED HANGUL PIEUP A
+3214 PARENTHESIZED HANGUL SIOS A
+3215 PARENTHESIZED HANGUL IEUNG A
+3216 PARENTHESIZED HANGUL CIEUC A
+3217 PARENTHESIZED HANGUL CHIEUCH A
+3218 PARENTHESIZED HANGUL KHIEUKH A
+3219 PARENTHESIZED HANGUL THIEUTH A
+321a PARENTHESIZED HANGUL PHIEUPH A
+321b PARENTHESIZED HANGUL HIEUH A
+321c PARENTHESIZED HANGUL CIEUC U
+3220 PARENTHESIZED IDEOGRAPH ONE
+3221 PARENTHESIZED IDEOGRAPH TWO
+3222 PARENTHESIZED IDEOGRAPH THREE
+3223 PARENTHESIZED IDEOGRAPH FOUR
+3224 PARENTHESIZED IDEOGRAPH FIVE
+3225 PARENTHESIZED IDEOGRAPH SIX
+3226 PARENTHESIZED IDEOGRAPH SEVEN
+3227 PARENTHESIZED IDEOGRAPH EIGHT
+3228 PARENTHESIZED IDEOGRAPH NINE
+3229 PARENTHESIZED IDEOGRAPH TEN
+322a PARENTHESIZED IDEOGRAPH MOON
+322b PARENTHESIZED IDEOGRAPH FIRE
+322c PARENTHESIZED IDEOGRAPH WATER
+322d PARENTHESIZED IDEOGRAPH WOOD
+322e PARENTHESIZED IDEOGRAPH METAL
+322f PARENTHESIZED IDEOGRAPH EARTH
+3230 PARENTHESIZED IDEOGRAPH SUN
+3231 PARENTHESIZED IDEOGRAPH STOCK
+3232 PARENTHESIZED IDEOGRAPH HAVE
+3233 PARENTHESIZED IDEOGRAPH SOCIETY
+3234 PARENTHESIZED IDEOGRAPH NAME
+3235 PARENTHESIZED IDEOGRAPH SPECIAL
+3236 PARENTHESIZED IDEOGRAPH FINANCIAL
+3237 PARENTHESIZED IDEOGRAPH CONGRATULATION
+3238 PARENTHESIZED IDEOGRAPH LABOR
+3239 PARENTHESIZED IDEOGRAPH REPRESENT
+323a PARENTHESIZED IDEOGRAPH CALL
+323b PARENTHESIZED IDEOGRAPH STUDY
+323c PARENTHESIZED IDEOGRAPH SUPERVISE
+323d PARENTHESIZED IDEOGRAPH ENTERPRISE
+323e PARENTHESIZED IDEOGRAPH RESOURCE
+323f PARENTHESIZED IDEOGRAPH ALLIANCE
+3240 PARENTHESIZED IDEOGRAPH FESTIVAL
+3241 PARENTHESIZED IDEOGRAPH REST
+3242 PARENTHESIZED IDEOGRAPH SELF
+3243 PARENTHESIZED IDEOGRAPH REACH
+3260 CIRCLED HANGUL KIYEOK
+3261 CIRCLED HANGUL NIEUN
+3262 CIRCLED HANGUL TIKEUT
+3263 CIRCLED HANGUL RIEUL
+3264 CIRCLED HANGUL MIEUM
+3265 CIRCLED HANGUL PIEUP
+3266 CIRCLED HANGUL SIOS
+3267 CIRCLED HANGUL IEUNG
+3268 CIRCLED HANGUL CIEUC
+3269 CIRCLED HANGUL CHIEUCH
+326a CIRCLED HANGUL KHIEUKH
+326b CIRCLED HANGUL THIEUTH
+326c CIRCLED HANGUL PHIEUPH
+326d CIRCLED HANGUL HIEUH
+326e CIRCLED HANGUL KIYEOK A
+326f CIRCLED HANGUL NIEUN A
+3270 CIRCLED HANGUL TIKEUT A
+3271 CIRCLED HANGUL RIEUL A
+3272 CIRCLED HANGUL MIEUM A
+3273 CIRCLED HANGUL PIEUP A
+3274 CIRCLED HANGUL SIOS A
+3275 CIRCLED HANGUL IEUNG A
+3276 CIRCLED HANGUL CIEUC A
+3277 CIRCLED HANGUL CHIEUCH A
+3278 CIRCLED HANGUL KHIEUKH A
+3279 CIRCLED HANGUL THIEUTH A
+327a CIRCLED HANGUL PHIEUPH A
+327b CIRCLED HANGUL HIEUH A
+327f KOREAN STANDARD SYMBOL
+3280 CIRCLED IDEOGRAPH ONE
+3281 CIRCLED IDEOGRAPH TWO
+3282 CIRCLED IDEOGRAPH THREE
+3283 CIRCLED IDEOGRAPH FOUR
+3284 CIRCLED IDEOGRAPH FIVE
+3285 CIRCLED IDEOGRAPH SIX
+3286 CIRCLED IDEOGRAPH SEVEN
+3287 CIRCLED IDEOGRAPH EIGHT
+3288 CIRCLED IDEOGRAPH NINE
+3289 CIRCLED IDEOGRAPH TEN
+328a CIRCLED IDEOGRAPH MOON
+328b CIRCLED IDEOGRAPH FIRE
+328c CIRCLED IDEOGRAPH WATER
+328d CIRCLED IDEOGRAPH WOOD
+328e CIRCLED IDEOGRAPH METAL
+328f CIRCLED IDEOGRAPH EARTH
+3290 CIRCLED IDEOGRAPH SUN
+3291 CIRCLED IDEOGRAPH STOCK
+3292 CIRCLED IDEOGRAPH HAVE
+3293 CIRCLED IDEOGRAPH SOCIETY
+3294 CIRCLED IDEOGRAPH NAME
+3295 CIRCLED IDEOGRAPH SPECIAL
+3296 CIRCLED IDEOGRAPH FINANCIAL
+3297 CIRCLED IDEOGRAPH CONGRATULATION
+3298 CIRCLED IDEOGRAPH LABOR
+3299 CIRCLED IDEOGRAPH SECRET
+329a CIRCLED IDEOGRAPH MALE
+329b CIRCLED IDEOGRAPH FEMALE
+329c CIRCLED IDEOGRAPH SUITABLE
+329d CIRCLED IDEOGRAPH EXCELLENT
+329e CIRCLED IDEOGRAPH PRINT
+329f CIRCLED IDEOGRAPH ATTENTION
+32a0 CIRCLED IDEOGRAPH ITEM
+32a1 CIRCLED IDEOGRAPH REST
+32a2 CIRCLED IDEOGRAPH COPY
+32a3 CIRCLED IDEOGRAPH CORRECT
+32a4 CIRCLED IDEOGRAPH HIGH
+32a5 CIRCLED IDEOGRAPH CENTRE
+32a6 CIRCLED IDEOGRAPH LOW
+32a7 CIRCLED IDEOGRAPH LEFT
+32a8 CIRCLED IDEOGRAPH RIGHT
+32a9 CIRCLED IDEOGRAPH MEDICINE
+32aa CIRCLED IDEOGRAPH RELIGION
+32ab CIRCLED IDEOGRAPH STUDY
+32ac CIRCLED IDEOGRAPH SUPERVISE
+32ad CIRCLED IDEOGRAPH ENTERPRISE
+32ae CIRCLED IDEOGRAPH RESOURCE
+32af CIRCLED IDEOGRAPH ALLIANCE
+32b0 CIRCLED IDEOGRAPH NIGHT
+32c0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+32c1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+32c2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+32c3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+32c4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+32c5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+32c6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+32c7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+32c8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+32c9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+32ca IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+32cb IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32d0 CIRCLED KATAKANA A
+32d1 CIRCLED KATAKANA I
+32d2 CIRCLED KATAKANA U
+32d3 CIRCLED KATAKANA E
+32d4 CIRCLED KATAKANA O
+32d5 CIRCLED KATAKANA KA
+32d6 CIRCLED KATAKANA KI
+32d7 CIRCLED KATAKANA KU
+32d8 CIRCLED KATAKANA KE
+32d9 CIRCLED KATAKANA KO
+32da CIRCLED KATAKANA SA
+32db CIRCLED KATAKANA SI
+32dc CIRCLED KATAKANA SU
+32dd CIRCLED KATAKANA SE
+32de CIRCLED KATAKANA SO
+32df CIRCLED KATAKANA TA
+32e0 CIRCLED KATAKANA TI
+32e1 CIRCLED KATAKANA TU
+32e2 CIRCLED KATAKANA TE
+32e3 CIRCLED KATAKANA TO
+32e4 CIRCLED KATAKANA NA
+32e5 CIRCLED KATAKANA NI
+32e6 CIRCLED KATAKANA NU
+32e7 CIRCLED KATAKANA NE
+32e8 CIRCLED KATAKANA NO
+32e9 CIRCLED KATAKANA HA
+32ea CIRCLED KATAKANA HI
+32eb CIRCLED KATAKANA HU
+32ec CIRCLED KATAKANA HE
+32ed CIRCLED KATAKANA HO
+32ee CIRCLED KATAKANA MA
+32ef CIRCLED KATAKANA MI
+32f0 CIRCLED KATAKANA MU
+32f1 CIRCLED KATAKANA ME
+32f2 CIRCLED KATAKANA MO
+32f3 CIRCLED KATAKANA YA
+32f4 CIRCLED KATAKANA YU
+32f5 CIRCLED KATAKANA YO
+32f6 CIRCLED KATAKANA RA
+32f7 CIRCLED KATAKANA RI
+32f8 CIRCLED KATAKANA RU
+32f9 CIRCLED KATAKANA RE
+32fa CIRCLED KATAKANA RO
+32fb CIRCLED KATAKANA WA
+32fc CIRCLED KATAKANA WI
+32fd CIRCLED KATAKANA WE
+32fe CIRCLED KATAKANA WO
+3300 SQUARE APAATO
+3301 SQUARE ARUHUA
+3302 SQUARE ANPEA
+3303 SQUARE AARU
+3304 SQUARE ININGU
+3305 SQUARE INTI
+3306 SQUARE UON
+3307 SQUARE ESUKUUDO
+3308 SQUARE EEKAA
+3309 SQUARE ONSU
+330a SQUARE OOMU
+330b SQUARE KAIRI
+330c SQUARE KARATTO
+330d SQUARE KARORII
+330e SQUARE GARON
+330f SQUARE GANMA
+3310 SQUARE GIGA
+3311 SQUARE GINII
+3312 SQUARE KYURII
+3313 SQUARE GIRUDAA
+3314 SQUARE KIRO
+3315 SQUARE KIROGURAMU
+3316 SQUARE KIROMEETORU
+3317 SQUARE KIROWATTO
+3318 SQUARE GURAMU
+3319 SQUARE GURAMUTON
+331a SQUARE KURUZEIRO
+331b SQUARE KUROONE
+331c SQUARE KEESU
+331d SQUARE KORUNA
+331e SQUARE KOOPO
+331f SQUARE SAIKURU
+3320 SQUARE SANTIIMU
+3321 SQUARE SIRINGU
+3322 SQUARE SENTI
+3323 SQUARE SENTO
+3324 SQUARE DAASU
+3325 SQUARE DESI
+3326 SQUARE DORU
+3327 SQUARE TON
+3328 SQUARE NANO
+3329 SQUARE NOTTO
+332a SQUARE HAITU
+332b SQUARE PAASENTO
+332c SQUARE PAATU
+332d SQUARE BAARERU
+332e SQUARE PIASUTORU
+332f SQUARE PIKURU
+3330 SQUARE PIKO
+3331 SQUARE BIRU
+3332 SQUARE HUARADDO
+3333 SQUARE HUIITO
+3334 SQUARE BUSSYERU
+3335 SQUARE HURAN
+3336 SQUARE HEKUTAARU
+3337 SQUARE PESO
+3338 SQUARE PENIHI
+3339 SQUARE HERUTU
+333a SQUARE PENSU
+333b SQUARE PEEZI
+333c SQUARE BEETA
+333d SQUARE POINTO
+333e SQUARE BORUTO
+333f SQUARE HON
+3340 SQUARE PONDO
+3341 SQUARE HOORU
+3342 SQUARE HOON
+3343 SQUARE MAIKURO
+3344 SQUARE MAIRU
+3345 SQUARE MAHHA
+3346 SQUARE MARUKU
+3347 SQUARE MANSYON
+3348 SQUARE MIKURON
+3349 SQUARE MIRI
+334a SQUARE MIRIBAARU
+334b SQUARE MEGA
+334c SQUARE MEGATON
+334d SQUARE MEETORU
+334e SQUARE YAADO
+334f SQUARE YAARU
+3350 SQUARE YUAN
+3351 SQUARE RITTORU
+3352 SQUARE RIRA
+3353 SQUARE RUPII
+3354 SQUARE RUUBURU
+3355 SQUARE REMU
+3356 SQUARE RENTOGEN
+3357 SQUARE WATTO
+3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+335a IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+335b IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+335c IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+335d IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+335e IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+335f IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+336a IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+336b IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+336c IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+336d IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+336e IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+336f IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+3371 SQUARE HPA
+3372 SQUARE DA
+3373 SQUARE AU
+3374 SQUARE BAR
+3375 SQUARE OV
+3376 SQUARE PC
+337b SQUARE ERA NAME HEISEI
+337c SQUARE ERA NAME SYOUWA
+337d SQUARE ERA NAME TAISYOU
+337e SQUARE ERA NAME MEIZI
+337f SQUARE CORPORATION
+3380 SQUARE PA AMPS
+3381 SQUARE NA
+3382 SQUARE MU A
+3383 SQUARE MA
+3384 SQUARE KA
+3385 SQUARE KB
+3386 SQUARE MB
+3387 SQUARE GB
+3388 SQUARE CAL
+3389 SQUARE KCAL
+338a SQUARE PF
+338b SQUARE NF
+338c SQUARE MU F
+338d SQUARE MU G
+338e SQUARE MG
+338f SQUARE KG
+3390 SQUARE HZ
+3391 SQUARE KHZ
+3392 SQUARE MHZ
+3393 SQUARE GHZ
+3394 SQUARE THZ
+3395 SQUARE MU L
+3396 SQUARE ML
+3397 SQUARE DL
+3398 SQUARE KL
+3399 SQUARE FM
+339a SQUARE NM
+339b SQUARE MU M
+339c SQUARE MM
+339d SQUARE CM
+339e SQUARE KM
+339f SQUARE MM SQUARED
+33a0 SQUARE CM SQUARED
+33a1 SQUARE M SQUARED
+33a2 SQUARE KM SQUARED
+33a3 SQUARE MM CUBED
+33a4 SQUARE CM CUBED
+33a5 SQUARE M CUBED
+33a6 SQUARE KM CUBED
+33a7 SQUARE M OVER S
+33a8 SQUARE M OVER S SQUARED
+33a9 SQUARE PA
+33aa SQUARE KPA
+33ab SQUARE MPA
+33ac SQUARE GPA
+33ad SQUARE RAD
+33ae SQUARE RAD OVER S
+33af SQUARE RAD OVER S SQUARED
+33b0 SQUARE PS
+33b1 SQUARE NS
+33b2 SQUARE MU S
+33b3 SQUARE MS
+33b4 SQUARE PV
+33b5 SQUARE NV
+33b6 SQUARE MU V
+33b7 SQUARE MV
+33b8 SQUARE KV
+33b9 SQUARE MV MEGA
+33ba SQUARE PW
+33bb SQUARE NW
+33bc SQUARE MU W
+33bd SQUARE MW
+33be SQUARE KW
+33bf SQUARE MW MEGA
+33c0 SQUARE K OHM
+33c1 SQUARE M OHM
+33c2 SQUARE AM
+33c3 SQUARE BQ
+33c4 SQUARE CC
+33c5 SQUARE CD
+33c6 SQUARE C OVER KG
+33c7 SQUARE CO
+33c8 SQUARE DB
+33c9 SQUARE GY
+33ca SQUARE HA
+33cb SQUARE HP
+33cc SQUARE IN
+33cd SQUARE KK
+33ce SQUARE KM CAPITAL
+33cf SQUARE KT
+33d0 SQUARE LM
+33d1 SQUARE LN
+33d2 SQUARE LOG
+33d3 SQUARE LX
+33d4 SQUARE MB SMALL
+33d5 SQUARE MIL
+33d6 SQUARE MOL
+33d7 SQUARE PH
+33d8 SQUARE PM
+33d9 SQUARE PPM
+33da SQUARE PR
+33db SQUARE SR
+33dc SQUARE SV
+33dd SQUARE WB
+33e0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+33e1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+33e2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+33e3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+33e4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+33e5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+33e6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+33e7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+33e8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+33e9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+33ea IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+33eb IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+33ec IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+33ed IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+33ee IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+33ef IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+33f0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+33f1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+33f2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+33f3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+33f4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+33f5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+33f6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+33f7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+33f8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+33f9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+33fa IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+33fb IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+33fc IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+33fd IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+33fe IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+3400 4db5 <CJK Ideograph Extension A, First>
+4e00 9fa5 <CJK Ideograph, First>
+a000 YI SYLLABLE IT
+a001 YI SYLLABLE IX
+a002 YI SYLLABLE I
+a003 YI SYLLABLE IP
+a004 YI SYLLABLE IET
+a005 YI SYLLABLE IEX
+a006 YI SYLLABLE IE
+a007 YI SYLLABLE IEP
+a008 YI SYLLABLE AT
+a009 YI SYLLABLE AX
+a00a YI SYLLABLE A
+a00b YI SYLLABLE AP
+a00c YI SYLLABLE UOX
+a00d YI SYLLABLE UO
+a00e YI SYLLABLE UOP
+a00f YI SYLLABLE OT
+a010 YI SYLLABLE OX
+a011 YI SYLLABLE O
+a012 YI SYLLABLE OP
+a013 YI SYLLABLE EX
+a014 YI SYLLABLE E
+a015 YI SYLLABLE WU
+a016 YI SYLLABLE BIT
+a017 YI SYLLABLE BIX
+a018 YI SYLLABLE BI
+a019 YI SYLLABLE BIP
+a01a YI SYLLABLE BIET
+a01b YI SYLLABLE BIEX
+a01c YI SYLLABLE BIE
+a01d YI SYLLABLE BIEP
+a01e YI SYLLABLE BAT
+a01f YI SYLLABLE BAX
+a020 YI SYLLABLE BA
+a021 YI SYLLABLE BAP
+a022 YI SYLLABLE BUOX
+a023 YI SYLLABLE BUO
+a024 YI SYLLABLE BUOP
+a025 YI SYLLABLE BOT
+a026 YI SYLLABLE BOX
+a027 YI SYLLABLE BO
+a028 YI SYLLABLE BOP
+a029 YI SYLLABLE BEX
+a02a YI SYLLABLE BE
+a02b YI SYLLABLE BEP
+a02c YI SYLLABLE BUT
+a02d YI SYLLABLE BUX
+a02e YI SYLLABLE BU
+a02f YI SYLLABLE BUP
+a030 YI SYLLABLE BURX
+a031 YI SYLLABLE BUR
+a032 YI SYLLABLE BYT
+a033 YI SYLLABLE BYX
+a034 YI SYLLABLE BY
+a035 YI SYLLABLE BYP
+a036 YI SYLLABLE BYRX
+a037 YI SYLLABLE BYR
+a038 YI SYLLABLE PIT
+a039 YI SYLLABLE PIX
+a03a YI SYLLABLE PI
+a03b YI SYLLABLE PIP
+a03c YI SYLLABLE PIEX
+a03d YI SYLLABLE PIE
+a03e YI SYLLABLE PIEP
+a03f YI SYLLABLE PAT
+a040 YI SYLLABLE PAX
+a041 YI SYLLABLE PA
+a042 YI SYLLABLE PAP
+a043 YI SYLLABLE PUOX
+a044 YI SYLLABLE PUO
+a045 YI SYLLABLE PUOP
+a046 YI SYLLABLE POT
+a047 YI SYLLABLE POX
+a048 YI SYLLABLE PO
+a049 YI SYLLABLE POP
+a04a YI SYLLABLE PUT
+a04b YI SYLLABLE PUX
+a04c YI SYLLABLE PU
+a04d YI SYLLABLE PUP
+a04e YI SYLLABLE PURX
+a04f YI SYLLABLE PUR
+a050 YI SYLLABLE PYT
+a051 YI SYLLABLE PYX
+a052 YI SYLLABLE PY
+a053 YI SYLLABLE PYP
+a054 YI SYLLABLE PYRX
+a055 YI SYLLABLE PYR
+a056 YI SYLLABLE BBIT
+a057 YI SYLLABLE BBIX
+a058 YI SYLLABLE BBI
+a059 YI SYLLABLE BBIP
+a05a YI SYLLABLE BBIET
+a05b YI SYLLABLE BBIEX
+a05c YI SYLLABLE BBIE
+a05d YI SYLLABLE BBIEP
+a05e YI SYLLABLE BBAT
+a05f YI SYLLABLE BBAX
+a060 YI SYLLABLE BBA
+a061 YI SYLLABLE BBAP
+a062 YI SYLLABLE BBUOX
+a063 YI SYLLABLE BBUO
+a064 YI SYLLABLE BBUOP
+a065 YI SYLLABLE BBOT
+a066 YI SYLLABLE BBOX
+a067 YI SYLLABLE BBO
+a068 YI SYLLABLE BBOP
+a069 YI SYLLABLE BBEX
+a06a YI SYLLABLE BBE
+a06b YI SYLLABLE BBEP
+a06c YI SYLLABLE BBUT
+a06d YI SYLLABLE BBUX
+a06e YI SYLLABLE BBU
+a06f YI SYLLABLE BBUP
+a070 YI SYLLABLE BBURX
+a071 YI SYLLABLE BBUR
+a072 YI SYLLABLE BBYT
+a073 YI SYLLABLE BBYX
+a074 YI SYLLABLE BBY
+a075 YI SYLLABLE BBYP
+a076 YI SYLLABLE NBIT
+a077 YI SYLLABLE NBIX
+a078 YI SYLLABLE NBI
+a079 YI SYLLABLE NBIP
+a07a YI SYLLABLE NBIEX
+a07b YI SYLLABLE NBIE
+a07c YI SYLLABLE NBIEP
+a07d YI SYLLABLE NBAT
+a07e YI SYLLABLE NBAX
+a07f YI SYLLABLE NBA
+a080 YI SYLLABLE NBAP
+a081 YI SYLLABLE NBOT
+a082 YI SYLLABLE NBOX
+a083 YI SYLLABLE NBO
+a084 YI SYLLABLE NBOP
+a085 YI SYLLABLE NBUT
+a086 YI SYLLABLE NBUX
+a087 YI SYLLABLE NBU
+a088 YI SYLLABLE NBUP
+a089 YI SYLLABLE NBURX
+a08a YI SYLLABLE NBUR
+a08b YI SYLLABLE NBYT
+a08c YI SYLLABLE NBYX
+a08d YI SYLLABLE NBY
+a08e YI SYLLABLE NBYP
+a08f YI SYLLABLE NBYRX
+a090 YI SYLLABLE NBYR
+a091 YI SYLLABLE HMIT
+a092 YI SYLLABLE HMIX
+a093 YI SYLLABLE HMI
+a094 YI SYLLABLE HMIP
+a095 YI SYLLABLE HMIEX
+a096 YI SYLLABLE HMIE
+a097 YI SYLLABLE HMIEP
+a098 YI SYLLABLE HMAT
+a099 YI SYLLABLE HMAX
+a09a YI SYLLABLE HMA
+a09b YI SYLLABLE HMAP
+a09c YI SYLLABLE HMUOX
+a09d YI SYLLABLE HMUO
+a09e YI SYLLABLE HMUOP
+a09f YI SYLLABLE HMOT
+a0a0 YI SYLLABLE HMOX
+a0a1 YI SYLLABLE HMO
+a0a2 YI SYLLABLE HMOP
+a0a3 YI SYLLABLE HMUT
+a0a4 YI SYLLABLE HMUX
+a0a5 YI SYLLABLE HMU
+a0a6 YI SYLLABLE HMUP
+a0a7 YI SYLLABLE HMURX
+a0a8 YI SYLLABLE HMUR
+a0a9 YI SYLLABLE HMYX
+a0aa YI SYLLABLE HMY
+a0ab YI SYLLABLE HMYP
+a0ac YI SYLLABLE HMYRX
+a0ad YI SYLLABLE HMYR
+a0ae YI SYLLABLE MIT
+a0af YI SYLLABLE MIX
+a0b0 YI SYLLABLE MI
+a0b1 YI SYLLABLE MIP
+a0b2 YI SYLLABLE MIEX
+a0b3 YI SYLLABLE MIE
+a0b4 YI SYLLABLE MIEP
+a0b5 YI SYLLABLE MAT
+a0b6 YI SYLLABLE MAX
+a0b7 YI SYLLABLE MA
+a0b8 YI SYLLABLE MAP
+a0b9 YI SYLLABLE MUOT
+a0ba YI SYLLABLE MUOX
+a0bb YI SYLLABLE MUO
+a0bc YI SYLLABLE MUOP
+a0bd YI SYLLABLE MOT
+a0be YI SYLLABLE MOX
+a0bf YI SYLLABLE MO
+a0c0 YI SYLLABLE MOP
+a0c1 YI SYLLABLE MEX
+a0c2 YI SYLLABLE ME
+a0c3 YI SYLLABLE MUT
+a0c4 YI SYLLABLE MUX
+a0c5 YI SYLLABLE MU
+a0c6 YI SYLLABLE MUP
+a0c7 YI SYLLABLE MURX
+a0c8 YI SYLLABLE MUR
+a0c9 YI SYLLABLE MYT
+a0ca YI SYLLABLE MYX
+a0cb YI SYLLABLE MY
+a0cc YI SYLLABLE MYP
+a0cd YI SYLLABLE FIT
+a0ce YI SYLLABLE FIX
+a0cf YI SYLLABLE FI
+a0d0 YI SYLLABLE FIP
+a0d1 YI SYLLABLE FAT
+a0d2 YI SYLLABLE FAX
+a0d3 YI SYLLABLE FA
+a0d4 YI SYLLABLE FAP
+a0d5 YI SYLLABLE FOX
+a0d6 YI SYLLABLE FO
+a0d7 YI SYLLABLE FOP
+a0d8 YI SYLLABLE FUT
+a0d9 YI SYLLABLE FUX
+a0da YI SYLLABLE FU
+a0db YI SYLLABLE FUP
+a0dc YI SYLLABLE FURX
+a0dd YI SYLLABLE FUR
+a0de YI SYLLABLE FYT
+a0df YI SYLLABLE FYX
+a0e0 YI SYLLABLE FY
+a0e1 YI SYLLABLE FYP
+a0e2 YI SYLLABLE VIT
+a0e3 YI SYLLABLE VIX
+a0e4 YI SYLLABLE VI
+a0e5 YI SYLLABLE VIP
+a0e6 YI SYLLABLE VIET
+a0e7 YI SYLLABLE VIEX
+a0e8 YI SYLLABLE VIE
+a0e9 YI SYLLABLE VIEP
+a0ea YI SYLLABLE VAT
+a0eb YI SYLLABLE VAX
+a0ec YI SYLLABLE VA
+a0ed YI SYLLABLE VAP
+a0ee YI SYLLABLE VOT
+a0ef YI SYLLABLE VOX
+a0f0 YI SYLLABLE VO
+a0f1 YI SYLLABLE VOP
+a0f2 YI SYLLABLE VEX
+a0f3 YI SYLLABLE VEP
+a0f4 YI SYLLABLE VUT
+a0f5 YI SYLLABLE VUX
+a0f6 YI SYLLABLE VU
+a0f7 YI SYLLABLE VUP
+a0f8 YI SYLLABLE VURX
+a0f9 YI SYLLABLE VUR
+a0fa YI SYLLABLE VYT
+a0fb YI SYLLABLE VYX
+a0fc YI SYLLABLE VY
+a0fd YI SYLLABLE VYP
+a0fe YI SYLLABLE VYRX
+a0ff YI SYLLABLE VYR
+a100 YI SYLLABLE DIT
+a101 YI SYLLABLE DIX
+a102 YI SYLLABLE DI
+a103 YI SYLLABLE DIP
+a104 YI SYLLABLE DIEX
+a105 YI SYLLABLE DIE
+a106 YI SYLLABLE DIEP
+a107 YI SYLLABLE DAT
+a108 YI SYLLABLE DAX
+a109 YI SYLLABLE DA
+a10a YI SYLLABLE DAP
+a10b YI SYLLABLE DUOX
+a10c YI SYLLABLE DUO
+a10d YI SYLLABLE DOT
+a10e YI SYLLABLE DOX
+a10f YI SYLLABLE DO
+a110 YI SYLLABLE DOP
+a111 YI SYLLABLE DEX
+a112 YI SYLLABLE DE
+a113 YI SYLLABLE DEP
+a114 YI SYLLABLE DUT
+a115 YI SYLLABLE DUX
+a116 YI SYLLABLE DU
+a117 YI SYLLABLE DUP
+a118 YI SYLLABLE DURX
+a119 YI SYLLABLE DUR
+a11a YI SYLLABLE TIT
+a11b YI SYLLABLE TIX
+a11c YI SYLLABLE TI
+a11d YI SYLLABLE TIP
+a11e YI SYLLABLE TIEX
+a11f YI SYLLABLE TIE
+a120 YI SYLLABLE TIEP
+a121 YI SYLLABLE TAT
+a122 YI SYLLABLE TAX
+a123 YI SYLLABLE TA
+a124 YI SYLLABLE TAP
+a125 YI SYLLABLE TUOT
+a126 YI SYLLABLE TUOX
+a127 YI SYLLABLE TUO
+a128 YI SYLLABLE TUOP
+a129 YI SYLLABLE TOT
+a12a YI SYLLABLE TOX
+a12b YI SYLLABLE TO
+a12c YI SYLLABLE TOP
+a12d YI SYLLABLE TEX
+a12e YI SYLLABLE TE
+a12f YI SYLLABLE TEP
+a130 YI SYLLABLE TUT
+a131 YI SYLLABLE TUX
+a132 YI SYLLABLE TU
+a133 YI SYLLABLE TUP
+a134 YI SYLLABLE TURX
+a135 YI SYLLABLE TUR
+a136 YI SYLLABLE DDIT
+a137 YI SYLLABLE DDIX
+a138 YI SYLLABLE DDI
+a139 YI SYLLABLE DDIP
+a13a YI SYLLABLE DDIEX
+a13b YI SYLLABLE DDIE
+a13c YI SYLLABLE DDIEP
+a13d YI SYLLABLE DDAT
+a13e YI SYLLABLE DDAX
+a13f YI SYLLABLE DDA
+a140 YI SYLLABLE DDAP
+a141 YI SYLLABLE DDUOX
+a142 YI SYLLABLE DDUO
+a143 YI SYLLABLE DDUOP
+a144 YI SYLLABLE DDOT
+a145 YI SYLLABLE DDOX
+a146 YI SYLLABLE DDO
+a147 YI SYLLABLE DDOP
+a148 YI SYLLABLE DDEX
+a149 YI SYLLABLE DDE
+a14a YI SYLLABLE DDEP
+a14b YI SYLLABLE DDUT
+a14c YI SYLLABLE DDUX
+a14d YI SYLLABLE DDU
+a14e YI SYLLABLE DDUP
+a14f YI SYLLABLE DDURX
+a150 YI SYLLABLE DDUR
+a151 YI SYLLABLE NDIT
+a152 YI SYLLABLE NDIX
+a153 YI SYLLABLE NDI
+a154 YI SYLLABLE NDIP
+a155 YI SYLLABLE NDIEX
+a156 YI SYLLABLE NDIE
+a157 YI SYLLABLE NDAT
+a158 YI SYLLABLE NDAX
+a159 YI SYLLABLE NDA
+a15a YI SYLLABLE NDAP
+a15b YI SYLLABLE NDOT
+a15c YI SYLLABLE NDOX
+a15d YI SYLLABLE NDO
+a15e YI SYLLABLE NDOP
+a15f YI SYLLABLE NDEX
+a160 YI SYLLABLE NDE
+a161 YI SYLLABLE NDEP
+a162 YI SYLLABLE NDUT
+a163 YI SYLLABLE NDUX
+a164 YI SYLLABLE NDU
+a165 YI SYLLABLE NDUP
+a166 YI SYLLABLE NDURX
+a167 YI SYLLABLE NDUR
+a168 YI SYLLABLE HNIT
+a169 YI SYLLABLE HNIX
+a16a YI SYLLABLE HNI
+a16b YI SYLLABLE HNIP
+a16c YI SYLLABLE HNIET
+a16d YI SYLLABLE HNIEX
+a16e YI SYLLABLE HNIE
+a16f YI SYLLABLE HNIEP
+a170 YI SYLLABLE HNAT
+a171 YI SYLLABLE HNAX
+a172 YI SYLLABLE HNA
+a173 YI SYLLABLE HNAP
+a174 YI SYLLABLE HNUOX
+a175 YI SYLLABLE HNUO
+a176 YI SYLLABLE HNOT
+a177 YI SYLLABLE HNOX
+a178 YI SYLLABLE HNOP
+a179 YI SYLLABLE HNEX
+a17a YI SYLLABLE HNE
+a17b YI SYLLABLE HNEP
+a17c YI SYLLABLE HNUT
+a17d YI SYLLABLE NIT
+a17e YI SYLLABLE NIX
+a17f YI SYLLABLE NI
+a180 YI SYLLABLE NIP
+a181 YI SYLLABLE NIEX
+a182 YI SYLLABLE NIE
+a183 YI SYLLABLE NIEP
+a184 YI SYLLABLE NAX
+a185 YI SYLLABLE NA
+a186 YI SYLLABLE NAP
+a187 YI SYLLABLE NUOX
+a188 YI SYLLABLE NUO
+a189 YI SYLLABLE NUOP
+a18a YI SYLLABLE NOT
+a18b YI SYLLABLE NOX
+a18c YI SYLLABLE NO
+a18d YI SYLLABLE NOP
+a18e YI SYLLABLE NEX
+a18f YI SYLLABLE NE
+a190 YI SYLLABLE NEP
+a191 YI SYLLABLE NUT
+a192 YI SYLLABLE NUX
+a193 YI SYLLABLE NU
+a194 YI SYLLABLE NUP
+a195 YI SYLLABLE NURX
+a196 YI SYLLABLE NUR
+a197 YI SYLLABLE HLIT
+a198 YI SYLLABLE HLIX
+a199 YI SYLLABLE HLI
+a19a YI SYLLABLE HLIP
+a19b YI SYLLABLE HLIEX
+a19c YI SYLLABLE HLIE
+a19d YI SYLLABLE HLIEP
+a19e YI SYLLABLE HLAT
+a19f YI SYLLABLE HLAX
+a1a0 YI SYLLABLE HLA
+a1a1 YI SYLLABLE HLAP
+a1a2 YI SYLLABLE HLUOX
+a1a3 YI SYLLABLE HLUO
+a1a4 YI SYLLABLE HLUOP
+a1a5 YI SYLLABLE HLOX
+a1a6 YI SYLLABLE HLO
+a1a7 YI SYLLABLE HLOP
+a1a8 YI SYLLABLE HLEX
+a1a9 YI SYLLABLE HLE
+a1aa YI SYLLABLE HLEP
+a1ab YI SYLLABLE HLUT
+a1ac YI SYLLABLE HLUX
+a1ad YI SYLLABLE HLU
+a1ae YI SYLLABLE HLUP
+a1af YI SYLLABLE HLURX
+a1b0 YI SYLLABLE HLUR
+a1b1 YI SYLLABLE HLYT
+a1b2 YI SYLLABLE HLYX
+a1b3 YI SYLLABLE HLY
+a1b4 YI SYLLABLE HLYP
+a1b5 YI SYLLABLE HLYRX
+a1b6 YI SYLLABLE HLYR
+a1b7 YI SYLLABLE LIT
+a1b8 YI SYLLABLE LIX
+a1b9 YI SYLLABLE LI
+a1ba YI SYLLABLE LIP
+a1bb YI SYLLABLE LIET
+a1bc YI SYLLABLE LIEX
+a1bd YI SYLLABLE LIE
+a1be YI SYLLABLE LIEP
+a1bf YI SYLLABLE LAT
+a1c0 YI SYLLABLE LAX
+a1c1 YI SYLLABLE LA
+a1c2 YI SYLLABLE LAP
+a1c3 YI SYLLABLE LUOT
+a1c4 YI SYLLABLE LUOX
+a1c5 YI SYLLABLE LUO
+a1c6 YI SYLLABLE LUOP
+a1c7 YI SYLLABLE LOT
+a1c8 YI SYLLABLE LOX
+a1c9 YI SYLLABLE LO
+a1ca YI SYLLABLE LOP
+a1cb YI SYLLABLE LEX
+a1cc YI SYLLABLE LE
+a1cd YI SYLLABLE LEP
+a1ce YI SYLLABLE LUT
+a1cf YI SYLLABLE LUX
+a1d0 YI SYLLABLE LU
+a1d1 YI SYLLABLE LUP
+a1d2 YI SYLLABLE LURX
+a1d3 YI SYLLABLE LUR
+a1d4 YI SYLLABLE LYT
+a1d5 YI SYLLABLE LYX
+a1d6 YI SYLLABLE LY
+a1d7 YI SYLLABLE LYP
+a1d8 YI SYLLABLE LYRX
+a1d9 YI SYLLABLE LYR
+a1da YI SYLLABLE GIT
+a1db YI SYLLABLE GIX
+a1dc YI SYLLABLE GI
+a1dd YI SYLLABLE GIP
+a1de YI SYLLABLE GIET
+a1df YI SYLLABLE GIEX
+a1e0 YI SYLLABLE GIE
+a1e1 YI SYLLABLE GIEP
+a1e2 YI SYLLABLE GAT
+a1e3 YI SYLLABLE GAX
+a1e4 YI SYLLABLE GA
+a1e5 YI SYLLABLE GAP
+a1e6 YI SYLLABLE GUOT
+a1e7 YI SYLLABLE GUOX
+a1e8 YI SYLLABLE GUO
+a1e9 YI SYLLABLE GUOP
+a1ea YI SYLLABLE GOT
+a1eb YI SYLLABLE GOX
+a1ec YI SYLLABLE GO
+a1ed YI SYLLABLE GOP
+a1ee YI SYLLABLE GET
+a1ef YI SYLLABLE GEX
+a1f0 YI SYLLABLE GE
+a1f1 YI SYLLABLE GEP
+a1f2 YI SYLLABLE GUT
+a1f3 YI SYLLABLE GUX
+a1f4 YI SYLLABLE GU
+a1f5 YI SYLLABLE GUP
+a1f6 YI SYLLABLE GURX
+a1f7 YI SYLLABLE GUR
+a1f8 YI SYLLABLE KIT
+a1f9 YI SYLLABLE KIX
+a1fa YI SYLLABLE KI
+a1fb YI SYLLABLE KIP
+a1fc YI SYLLABLE KIEX
+a1fd YI SYLLABLE KIE
+a1fe YI SYLLABLE KIEP
+a1ff YI SYLLABLE KAT
+a200 YI SYLLABLE KAX
+a201 YI SYLLABLE KA
+a202 YI SYLLABLE KAP
+a203 YI SYLLABLE KUOX
+a204 YI SYLLABLE KUO
+a205 YI SYLLABLE KUOP
+a206 YI SYLLABLE KOT
+a207 YI SYLLABLE KOX
+a208 YI SYLLABLE KO
+a209 YI SYLLABLE KOP
+a20a YI SYLLABLE KET
+a20b YI SYLLABLE KEX
+a20c YI SYLLABLE KE
+a20d YI SYLLABLE KEP
+a20e YI SYLLABLE KUT
+a20f YI SYLLABLE KUX
+a210 YI SYLLABLE KU
+a211 YI SYLLABLE KUP
+a212 YI SYLLABLE KURX
+a213 YI SYLLABLE KUR
+a214 YI SYLLABLE GGIT
+a215 YI SYLLABLE GGIX
+a216 YI SYLLABLE GGI
+a217 YI SYLLABLE GGIEX
+a218 YI SYLLABLE GGIE
+a219 YI SYLLABLE GGIEP
+a21a YI SYLLABLE GGAT
+a21b YI SYLLABLE GGAX
+a21c YI SYLLABLE GGA
+a21d YI SYLLABLE GGAP
+a21e YI SYLLABLE GGUOT
+a21f YI SYLLABLE GGUOX
+a220 YI SYLLABLE GGUO
+a221 YI SYLLABLE GGUOP
+a222 YI SYLLABLE GGOT
+a223 YI SYLLABLE GGOX
+a224 YI SYLLABLE GGO
+a225 YI SYLLABLE GGOP
+a226 YI SYLLABLE GGET
+a227 YI SYLLABLE GGEX
+a228 YI SYLLABLE GGE
+a229 YI SYLLABLE GGEP
+a22a YI SYLLABLE GGUT
+a22b YI SYLLABLE GGUX
+a22c YI SYLLABLE GGU
+a22d YI SYLLABLE GGUP
+a22e YI SYLLABLE GGURX
+a22f YI SYLLABLE GGUR
+a230 YI SYLLABLE MGIEX
+a231 YI SYLLABLE MGIE
+a232 YI SYLLABLE MGAT
+a233 YI SYLLABLE MGAX
+a234 YI SYLLABLE MGA
+a235 YI SYLLABLE MGAP
+a236 YI SYLLABLE MGUOX
+a237 YI SYLLABLE MGUO
+a238 YI SYLLABLE MGUOP
+a239 YI SYLLABLE MGOT
+a23a YI SYLLABLE MGOX
+a23b YI SYLLABLE MGO
+a23c YI SYLLABLE MGOP
+a23d YI SYLLABLE MGEX
+a23e YI SYLLABLE MGE
+a23f YI SYLLABLE MGEP
+a240 YI SYLLABLE MGUT
+a241 YI SYLLABLE MGUX
+a242 YI SYLLABLE MGU
+a243 YI SYLLABLE MGUP
+a244 YI SYLLABLE MGURX
+a245 YI SYLLABLE MGUR
+a246 YI SYLLABLE HXIT
+a247 YI SYLLABLE HXIX
+a248 YI SYLLABLE HXI
+a249 YI SYLLABLE HXIP
+a24a YI SYLLABLE HXIET
+a24b YI SYLLABLE HXIEX
+a24c YI SYLLABLE HXIE
+a24d YI SYLLABLE HXIEP
+a24e YI SYLLABLE HXAT
+a24f YI SYLLABLE HXAX
+a250 YI SYLLABLE HXA
+a251 YI SYLLABLE HXAP
+a252 YI SYLLABLE HXUOT
+a253 YI SYLLABLE HXUOX
+a254 YI SYLLABLE HXUO
+a255 YI SYLLABLE HXUOP
+a256 YI SYLLABLE HXOT
+a257 YI SYLLABLE HXOX
+a258 YI SYLLABLE HXO
+a259 YI SYLLABLE HXOP
+a25a YI SYLLABLE HXEX
+a25b YI SYLLABLE HXE
+a25c YI SYLLABLE HXEP
+a25d YI SYLLABLE NGIEX
+a25e YI SYLLABLE NGIE
+a25f YI SYLLABLE NGIEP
+a260 YI SYLLABLE NGAT
+a261 YI SYLLABLE NGAX
+a262 YI SYLLABLE NGA
+a263 YI SYLLABLE NGAP
+a264 YI SYLLABLE NGUOT
+a265 YI SYLLABLE NGUOX
+a266 YI SYLLABLE NGUO
+a267 YI SYLLABLE NGOT
+a268 YI SYLLABLE NGOX
+a269 YI SYLLABLE NGO
+a26a YI SYLLABLE NGOP
+a26b YI SYLLABLE NGEX
+a26c YI SYLLABLE NGE
+a26d YI SYLLABLE NGEP
+a26e YI SYLLABLE HIT
+a26f YI SYLLABLE HIEX
+a270 YI SYLLABLE HIE
+a271 YI SYLLABLE HAT
+a272 YI SYLLABLE HAX
+a273 YI SYLLABLE HA
+a274 YI SYLLABLE HAP
+a275 YI SYLLABLE HUOT
+a276 YI SYLLABLE HUOX
+a277 YI SYLLABLE HUO
+a278 YI SYLLABLE HUOP
+a279 YI SYLLABLE HOT
+a27a YI SYLLABLE HOX
+a27b YI SYLLABLE HO
+a27c YI SYLLABLE HOP
+a27d YI SYLLABLE HEX
+a27e YI SYLLABLE HE
+a27f YI SYLLABLE HEP
+a280 YI SYLLABLE WAT
+a281 YI SYLLABLE WAX
+a282 YI SYLLABLE WA
+a283 YI SYLLABLE WAP
+a284 YI SYLLABLE WUOX
+a285 YI SYLLABLE WUO
+a286 YI SYLLABLE WUOP
+a287 YI SYLLABLE WOX
+a288 YI SYLLABLE WO
+a289 YI SYLLABLE WOP
+a28a YI SYLLABLE WEX
+a28b YI SYLLABLE WE
+a28c YI SYLLABLE WEP
+a28d YI SYLLABLE ZIT
+a28e YI SYLLABLE ZIX
+a28f YI SYLLABLE ZI
+a290 YI SYLLABLE ZIP
+a291 YI SYLLABLE ZIEX
+a292 YI SYLLABLE ZIE
+a293 YI SYLLABLE ZIEP
+a294 YI SYLLABLE ZAT
+a295 YI SYLLABLE ZAX
+a296 YI SYLLABLE ZA
+a297 YI SYLLABLE ZAP
+a298 YI SYLLABLE ZUOX
+a299 YI SYLLABLE ZUO
+a29a YI SYLLABLE ZUOP
+a29b YI SYLLABLE ZOT
+a29c YI SYLLABLE ZOX
+a29d YI SYLLABLE ZO
+a29e YI SYLLABLE ZOP
+a29f YI SYLLABLE ZEX
+a2a0 YI SYLLABLE ZE
+a2a1 YI SYLLABLE ZEP
+a2a2 YI SYLLABLE ZUT
+a2a3 YI SYLLABLE ZUX
+a2a4 YI SYLLABLE ZU
+a2a5 YI SYLLABLE ZUP
+a2a6 YI SYLLABLE ZURX
+a2a7 YI SYLLABLE ZUR
+a2a8 YI SYLLABLE ZYT
+a2a9 YI SYLLABLE ZYX
+a2aa YI SYLLABLE ZY
+a2ab YI SYLLABLE ZYP
+a2ac YI SYLLABLE ZYRX
+a2ad YI SYLLABLE ZYR
+a2ae YI SYLLABLE CIT
+a2af YI SYLLABLE CIX
+a2b0 YI SYLLABLE CI
+a2b1 YI SYLLABLE CIP
+a2b2 YI SYLLABLE CIET
+a2b3 YI SYLLABLE CIEX
+a2b4 YI SYLLABLE CIE
+a2b5 YI SYLLABLE CIEP
+a2b6 YI SYLLABLE CAT
+a2b7 YI SYLLABLE CAX
+a2b8 YI SYLLABLE CA
+a2b9 YI SYLLABLE CAP
+a2ba YI SYLLABLE CUOX
+a2bb YI SYLLABLE CUO
+a2bc YI SYLLABLE CUOP
+a2bd YI SYLLABLE COT
+a2be YI SYLLABLE COX
+a2bf YI SYLLABLE CO
+a2c0 YI SYLLABLE COP
+a2c1 YI SYLLABLE CEX
+a2c2 YI SYLLABLE CE
+a2c3 YI SYLLABLE CEP
+a2c4 YI SYLLABLE CUT
+a2c5 YI SYLLABLE CUX
+a2c6 YI SYLLABLE CU
+a2c7 YI SYLLABLE CUP
+a2c8 YI SYLLABLE CURX
+a2c9 YI SYLLABLE CUR
+a2ca YI SYLLABLE CYT
+a2cb YI SYLLABLE CYX
+a2cc YI SYLLABLE CY
+a2cd YI SYLLABLE CYP
+a2ce YI SYLLABLE CYRX
+a2cf YI SYLLABLE CYR
+a2d0 YI SYLLABLE ZZIT
+a2d1 YI SYLLABLE ZZIX
+a2d2 YI SYLLABLE ZZI
+a2d3 YI SYLLABLE ZZIP
+a2d4 YI SYLLABLE ZZIET
+a2d5 YI SYLLABLE ZZIEX
+a2d6 YI SYLLABLE ZZIE
+a2d7 YI SYLLABLE ZZIEP
+a2d8 YI SYLLABLE ZZAT
+a2d9 YI SYLLABLE ZZAX
+a2da YI SYLLABLE ZZA
+a2db YI SYLLABLE ZZAP
+a2dc YI SYLLABLE ZZOX
+a2dd YI SYLLABLE ZZO
+a2de YI SYLLABLE ZZOP
+a2df YI SYLLABLE ZZEX
+a2e0 YI SYLLABLE ZZE
+a2e1 YI SYLLABLE ZZEP
+a2e2 YI SYLLABLE ZZUX
+a2e3 YI SYLLABLE ZZU
+a2e4 YI SYLLABLE ZZUP
+a2e5 YI SYLLABLE ZZURX
+a2e6 YI SYLLABLE ZZUR
+a2e7 YI SYLLABLE ZZYT
+a2e8 YI SYLLABLE ZZYX
+a2e9 YI SYLLABLE ZZY
+a2ea YI SYLLABLE ZZYP
+a2eb YI SYLLABLE ZZYRX
+a2ec YI SYLLABLE ZZYR
+a2ed YI SYLLABLE NZIT
+a2ee YI SYLLABLE NZIX
+a2ef YI SYLLABLE NZI
+a2f0 YI SYLLABLE NZIP
+a2f1 YI SYLLABLE NZIEX
+a2f2 YI SYLLABLE NZIE
+a2f3 YI SYLLABLE NZIEP
+a2f4 YI SYLLABLE NZAT
+a2f5 YI SYLLABLE NZAX
+a2f6 YI SYLLABLE NZA
+a2f7 YI SYLLABLE NZAP
+a2f8 YI SYLLABLE NZUOX
+a2f9 YI SYLLABLE NZUO
+a2fa YI SYLLABLE NZOX
+a2fb YI SYLLABLE NZOP
+a2fc YI SYLLABLE NZEX
+a2fd YI SYLLABLE NZE
+a2fe YI SYLLABLE NZUX
+a2ff YI SYLLABLE NZU
+a300 YI SYLLABLE NZUP
+a301 YI SYLLABLE NZURX
+a302 YI SYLLABLE NZUR
+a303 YI SYLLABLE NZYT
+a304 YI SYLLABLE NZYX
+a305 YI SYLLABLE NZY
+a306 YI SYLLABLE NZYP
+a307 YI SYLLABLE NZYRX
+a308 YI SYLLABLE NZYR
+a309 YI SYLLABLE SIT
+a30a YI SYLLABLE SIX
+a30b YI SYLLABLE SI
+a30c YI SYLLABLE SIP
+a30d YI SYLLABLE SIEX
+a30e YI SYLLABLE SIE
+a30f YI SYLLABLE SIEP
+a310 YI SYLLABLE SAT
+a311 YI SYLLABLE SAX
+a312 YI SYLLABLE SA
+a313 YI SYLLABLE SAP
+a314 YI SYLLABLE SUOX
+a315 YI SYLLABLE SUO
+a316 YI SYLLABLE SUOP
+a317 YI SYLLABLE SOT
+a318 YI SYLLABLE SOX
+a319 YI SYLLABLE SO
+a31a YI SYLLABLE SOP
+a31b YI SYLLABLE SEX
+a31c YI SYLLABLE SE
+a31d YI SYLLABLE SEP
+a31e YI SYLLABLE SUT
+a31f YI SYLLABLE SUX
+a320 YI SYLLABLE SU
+a321 YI SYLLABLE SUP
+a322 YI SYLLABLE SURX
+a323 YI SYLLABLE SUR
+a324 YI SYLLABLE SYT
+a325 YI SYLLABLE SYX
+a326 YI SYLLABLE SY
+a327 YI SYLLABLE SYP
+a328 YI SYLLABLE SYRX
+a329 YI SYLLABLE SYR
+a32a YI SYLLABLE SSIT
+a32b YI SYLLABLE SSIX
+a32c YI SYLLABLE SSI
+a32d YI SYLLABLE SSIP
+a32e YI SYLLABLE SSIEX
+a32f YI SYLLABLE SSIE
+a330 YI SYLLABLE SSIEP
+a331 YI SYLLABLE SSAT
+a332 YI SYLLABLE SSAX
+a333 YI SYLLABLE SSA
+a334 YI SYLLABLE SSAP
+a335 YI SYLLABLE SSOT
+a336 YI SYLLABLE SSOX
+a337 YI SYLLABLE SSO
+a338 YI SYLLABLE SSOP
+a339 YI SYLLABLE SSEX
+a33a YI SYLLABLE SSE
+a33b YI SYLLABLE SSEP
+a33c YI SYLLABLE SSUT
+a33d YI SYLLABLE SSUX
+a33e YI SYLLABLE SSU
+a33f YI SYLLABLE SSUP
+a340 YI SYLLABLE SSYT
+a341 YI SYLLABLE SSYX
+a342 YI SYLLABLE SSY
+a343 YI SYLLABLE SSYP
+a344 YI SYLLABLE SSYRX
+a345 YI SYLLABLE SSYR
+a346 YI SYLLABLE ZHAT
+a347 YI SYLLABLE ZHAX
+a348 YI SYLLABLE ZHA
+a349 YI SYLLABLE ZHAP
+a34a YI SYLLABLE ZHUOX
+a34b YI SYLLABLE ZHUO
+a34c YI SYLLABLE ZHUOP
+a34d YI SYLLABLE ZHOT
+a34e YI SYLLABLE ZHOX
+a34f YI SYLLABLE ZHO
+a350 YI SYLLABLE ZHOP
+a351 YI SYLLABLE ZHET
+a352 YI SYLLABLE ZHEX
+a353 YI SYLLABLE ZHE
+a354 YI SYLLABLE ZHEP
+a355 YI SYLLABLE ZHUT
+a356 YI SYLLABLE ZHUX
+a357 YI SYLLABLE ZHU
+a358 YI SYLLABLE ZHUP
+a359 YI SYLLABLE ZHURX
+a35a YI SYLLABLE ZHUR
+a35b YI SYLLABLE ZHYT
+a35c YI SYLLABLE ZHYX
+a35d YI SYLLABLE ZHY
+a35e YI SYLLABLE ZHYP
+a35f YI SYLLABLE ZHYRX
+a360 YI SYLLABLE ZHYR
+a361 YI SYLLABLE CHAT
+a362 YI SYLLABLE CHAX
+a363 YI SYLLABLE CHA
+a364 YI SYLLABLE CHAP
+a365 YI SYLLABLE CHUOT
+a366 YI SYLLABLE CHUOX
+a367 YI SYLLABLE CHUO
+a368 YI SYLLABLE CHUOP
+a369 YI SYLLABLE CHOT
+a36a YI SYLLABLE CHOX
+a36b YI SYLLABLE CHO
+a36c YI SYLLABLE CHOP
+a36d YI SYLLABLE CHET
+a36e YI SYLLABLE CHEX
+a36f YI SYLLABLE CHE
+a370 YI SYLLABLE CHEP
+a371 YI SYLLABLE CHUX
+a372 YI SYLLABLE CHU
+a373 YI SYLLABLE CHUP
+a374 YI SYLLABLE CHURX
+a375 YI SYLLABLE CHUR
+a376 YI SYLLABLE CHYT
+a377 YI SYLLABLE CHYX
+a378 YI SYLLABLE CHY
+a379 YI SYLLABLE CHYP
+a37a YI SYLLABLE CHYRX
+a37b YI SYLLABLE CHYR
+a37c YI SYLLABLE RRAX
+a37d YI SYLLABLE RRA
+a37e YI SYLLABLE RRUOX
+a37f YI SYLLABLE RRUO
+a380 YI SYLLABLE RROT
+a381 YI SYLLABLE RROX
+a382 YI SYLLABLE RRO
+a383 YI SYLLABLE RROP
+a384 YI SYLLABLE RRET
+a385 YI SYLLABLE RREX
+a386 YI SYLLABLE RRE
+a387 YI SYLLABLE RREP
+a388 YI SYLLABLE RRUT
+a389 YI SYLLABLE RRUX
+a38a YI SYLLABLE RRU
+a38b YI SYLLABLE RRUP
+a38c YI SYLLABLE RRURX
+a38d YI SYLLABLE RRUR
+a38e YI SYLLABLE RRYT
+a38f YI SYLLABLE RRYX
+a390 YI SYLLABLE RRY
+a391 YI SYLLABLE RRYP
+a392 YI SYLLABLE RRYRX
+a393 YI SYLLABLE RRYR
+a394 YI SYLLABLE NRAT
+a395 YI SYLLABLE NRAX
+a396 YI SYLLABLE NRA
+a397 YI SYLLABLE NRAP
+a398 YI SYLLABLE NROX
+a399 YI SYLLABLE NRO
+a39a YI SYLLABLE NROP
+a39b YI SYLLABLE NRET
+a39c YI SYLLABLE NREX
+a39d YI SYLLABLE NRE
+a39e YI SYLLABLE NREP
+a39f YI SYLLABLE NRUT
+a3a0 YI SYLLABLE NRUX
+a3a1 YI SYLLABLE NRU
+a3a2 YI SYLLABLE NRUP
+a3a3 YI SYLLABLE NRURX
+a3a4 YI SYLLABLE NRUR
+a3a5 YI SYLLABLE NRYT
+a3a6 YI SYLLABLE NRYX
+a3a7 YI SYLLABLE NRY
+a3a8 YI SYLLABLE NRYP
+a3a9 YI SYLLABLE NRYRX
+a3aa YI SYLLABLE NRYR
+a3ab YI SYLLABLE SHAT
+a3ac YI SYLLABLE SHAX
+a3ad YI SYLLABLE SHA
+a3ae YI SYLLABLE SHAP
+a3af YI SYLLABLE SHUOX
+a3b0 YI SYLLABLE SHUO
+a3b1 YI SYLLABLE SHUOP
+a3b2 YI SYLLABLE SHOT
+a3b3 YI SYLLABLE SHOX
+a3b4 YI SYLLABLE SHO
+a3b5 YI SYLLABLE SHOP
+a3b6 YI SYLLABLE SHET
+a3b7 YI SYLLABLE SHEX
+a3b8 YI SYLLABLE SHE
+a3b9 YI SYLLABLE SHEP
+a3ba YI SYLLABLE SHUT
+a3bb YI SYLLABLE SHUX
+a3bc YI SYLLABLE SHU
+a3bd YI SYLLABLE SHUP
+a3be YI SYLLABLE SHURX
+a3bf YI SYLLABLE SHUR
+a3c0 YI SYLLABLE SHYT
+a3c1 YI SYLLABLE SHYX
+a3c2 YI SYLLABLE SHY
+a3c3 YI SYLLABLE SHYP
+a3c4 YI SYLLABLE SHYRX
+a3c5 YI SYLLABLE SHYR
+a3c6 YI SYLLABLE RAT
+a3c7 YI SYLLABLE RAX
+a3c8 YI SYLLABLE RA
+a3c9 YI SYLLABLE RAP
+a3ca YI SYLLABLE RUOX
+a3cb YI SYLLABLE RUO
+a3cc YI SYLLABLE RUOP
+a3cd YI SYLLABLE ROT
+a3ce YI SYLLABLE ROX
+a3cf YI SYLLABLE RO
+a3d0 YI SYLLABLE ROP
+a3d1 YI SYLLABLE REX
+a3d2 YI SYLLABLE RE
+a3d3 YI SYLLABLE REP
+a3d4 YI SYLLABLE RUT
+a3d5 YI SYLLABLE RUX
+a3d6 YI SYLLABLE RU
+a3d7 YI SYLLABLE RUP
+a3d8 YI SYLLABLE RURX
+a3d9 YI SYLLABLE RUR
+a3da YI SYLLABLE RYT
+a3db YI SYLLABLE RYX
+a3dc YI SYLLABLE RY
+a3dd YI SYLLABLE RYP
+a3de YI SYLLABLE RYRX
+a3df YI SYLLABLE RYR
+a3e0 YI SYLLABLE JIT
+a3e1 YI SYLLABLE JIX
+a3e2 YI SYLLABLE JI
+a3e3 YI SYLLABLE JIP
+a3e4 YI SYLLABLE JIET
+a3e5 YI SYLLABLE JIEX
+a3e6 YI SYLLABLE JIE
+a3e7 YI SYLLABLE JIEP
+a3e8 YI SYLLABLE JUOT
+a3e9 YI SYLLABLE JUOX
+a3ea YI SYLLABLE JUO
+a3eb YI SYLLABLE JUOP
+a3ec YI SYLLABLE JOT
+a3ed YI SYLLABLE JOX
+a3ee YI SYLLABLE JO
+a3ef YI SYLLABLE JOP
+a3f0 YI SYLLABLE JUT
+a3f1 YI SYLLABLE JUX
+a3f2 YI SYLLABLE JU
+a3f3 YI SYLLABLE JUP
+a3f4 YI SYLLABLE JURX
+a3f5 YI SYLLABLE JUR
+a3f6 YI SYLLABLE JYT
+a3f7 YI SYLLABLE JYX
+a3f8 YI SYLLABLE JY
+a3f9 YI SYLLABLE JYP
+a3fa YI SYLLABLE JYRX
+a3fb YI SYLLABLE JYR
+a3fc YI SYLLABLE QIT
+a3fd YI SYLLABLE QIX
+a3fe YI SYLLABLE QI
+a3ff YI SYLLABLE QIP
+a400 YI SYLLABLE QIET
+a401 YI SYLLABLE QIEX
+a402 YI SYLLABLE QIE
+a403 YI SYLLABLE QIEP
+a404 YI SYLLABLE QUOT
+a405 YI SYLLABLE QUOX
+a406 YI SYLLABLE QUO
+a407 YI SYLLABLE QUOP
+a408 YI SYLLABLE QOT
+a409 YI SYLLABLE QOX
+a40a YI SYLLABLE QO
+a40b YI SYLLABLE QOP
+a40c YI SYLLABLE QUT
+a40d YI SYLLABLE QUX
+a40e YI SYLLABLE QU
+a40f YI SYLLABLE QUP
+a410 YI SYLLABLE QURX
+a411 YI SYLLABLE QUR
+a412 YI SYLLABLE QYT
+a413 YI SYLLABLE QYX
+a414 YI SYLLABLE QY
+a415 YI SYLLABLE QYP
+a416 YI SYLLABLE QYRX
+a417 YI SYLLABLE QYR
+a418 YI SYLLABLE JJIT
+a419 YI SYLLABLE JJIX
+a41a YI SYLLABLE JJI
+a41b YI SYLLABLE JJIP
+a41c YI SYLLABLE JJIET
+a41d YI SYLLABLE JJIEX
+a41e YI SYLLABLE JJIE
+a41f YI SYLLABLE JJIEP
+a420 YI SYLLABLE JJUOX
+a421 YI SYLLABLE JJUO
+a422 YI SYLLABLE JJUOP
+a423 YI SYLLABLE JJOT
+a424 YI SYLLABLE JJOX
+a425 YI SYLLABLE JJO
+a426 YI SYLLABLE JJOP
+a427 YI SYLLABLE JJUT
+a428 YI SYLLABLE JJUX
+a429 YI SYLLABLE JJU
+a42a YI SYLLABLE JJUP
+a42b YI SYLLABLE JJURX
+a42c YI SYLLABLE JJUR
+a42d YI SYLLABLE JJYT
+a42e YI SYLLABLE JJYX
+a42f YI SYLLABLE JJY
+a430 YI SYLLABLE JJYP
+a431 YI SYLLABLE NJIT
+a432 YI SYLLABLE NJIX
+a433 YI SYLLABLE NJI
+a434 YI SYLLABLE NJIP
+a435 YI SYLLABLE NJIET
+a436 YI SYLLABLE NJIEX
+a437 YI SYLLABLE NJIE
+a438 YI SYLLABLE NJIEP
+a439 YI SYLLABLE NJUOX
+a43a YI SYLLABLE NJUO
+a43b YI SYLLABLE NJOT
+a43c YI SYLLABLE NJOX
+a43d YI SYLLABLE NJO
+a43e YI SYLLABLE NJOP
+a43f YI SYLLABLE NJUX
+a440 YI SYLLABLE NJU
+a441 YI SYLLABLE NJUP
+a442 YI SYLLABLE NJURX
+a443 YI SYLLABLE NJUR
+a444 YI SYLLABLE NJYT
+a445 YI SYLLABLE NJYX
+a446 YI SYLLABLE NJY
+a447 YI SYLLABLE NJYP
+a448 YI SYLLABLE NJYRX
+a449 YI SYLLABLE NJYR
+a44a YI SYLLABLE NYIT
+a44b YI SYLLABLE NYIX
+a44c YI SYLLABLE NYI
+a44d YI SYLLABLE NYIP
+a44e YI SYLLABLE NYIET
+a44f YI SYLLABLE NYIEX
+a450 YI SYLLABLE NYIE
+a451 YI SYLLABLE NYIEP
+a452 YI SYLLABLE NYUOX
+a453 YI SYLLABLE NYUO
+a454 YI SYLLABLE NYUOP
+a455 YI SYLLABLE NYOT
+a456 YI SYLLABLE NYOX
+a457 YI SYLLABLE NYO
+a458 YI SYLLABLE NYOP
+a459 YI SYLLABLE NYUT
+a45a YI SYLLABLE NYUX
+a45b YI SYLLABLE NYU
+a45c YI SYLLABLE NYUP
+a45d YI SYLLABLE XIT
+a45e YI SYLLABLE XIX
+a45f YI SYLLABLE XI
+a460 YI SYLLABLE XIP
+a461 YI SYLLABLE XIET
+a462 YI SYLLABLE XIEX
+a463 YI SYLLABLE XIE
+a464 YI SYLLABLE XIEP
+a465 YI SYLLABLE XUOX
+a466 YI SYLLABLE XUO
+a467 YI SYLLABLE XOT
+a468 YI SYLLABLE XOX
+a469 YI SYLLABLE XO
+a46a YI SYLLABLE XOP
+a46b YI SYLLABLE XYT
+a46c YI SYLLABLE XYX
+a46d YI SYLLABLE XY
+a46e YI SYLLABLE XYP
+a46f YI SYLLABLE XYRX
+a470 YI SYLLABLE XYR
+a471 YI SYLLABLE YIT
+a472 YI SYLLABLE YIX
+a473 YI SYLLABLE YI
+a474 YI SYLLABLE YIP
+a475 YI SYLLABLE YIET
+a476 YI SYLLABLE YIEX
+a477 YI SYLLABLE YIE
+a478 YI SYLLABLE YIEP
+a479 YI SYLLABLE YUOT
+a47a YI SYLLABLE YUOX
+a47b YI SYLLABLE YUO
+a47c YI SYLLABLE YUOP
+a47d YI SYLLABLE YOT
+a47e YI SYLLABLE YOX
+a47f YI SYLLABLE YO
+a480 YI SYLLABLE YOP
+a481 YI SYLLABLE YUT
+a482 YI SYLLABLE YUX
+a483 YI SYLLABLE YU
+a484 YI SYLLABLE YUP
+a485 YI SYLLABLE YURX
+a486 YI SYLLABLE YUR
+a487 YI SYLLABLE YYT
+a488 YI SYLLABLE YYX
+a489 YI SYLLABLE YY
+a48a YI SYLLABLE YYP
+a48b YI SYLLABLE YYRX
+a48c YI SYLLABLE YYR
+a490 YI RADICAL QOT
+a491 YI RADICAL LI
+a492 YI RADICAL KIT
+a493 YI RADICAL NYIP
+a494 YI RADICAL CYP
+a495 YI RADICAL SSI
+a496 YI RADICAL GGOP
+a497 YI RADICAL GEP
+a498 YI RADICAL MI
+a499 YI RADICAL HXIT
+a49a YI RADICAL LYR
+a49b YI RADICAL BBUT
+a49c YI RADICAL MOP
+a49d YI RADICAL YO
+a49e YI RADICAL PUT
+a49f YI RADICAL HXUO
+a4a0 YI RADICAL TAT
+a4a1 YI RADICAL GA
+a4a4 YI RADICAL DDUR
+a4a5 YI RADICAL BUR
+a4a6 YI RADICAL GGUO
+a4a7 YI RADICAL NYOP
+a4a8 YI RADICAL TU
+a4a9 YI RADICAL OP
+a4aa YI RADICAL JJUT
+a4ab YI RADICAL ZOT
+a4ac YI RADICAL PYT
+a4ad YI RADICAL HMO
+a4ae YI RADICAL YIT
+a4af YI RADICAL VUR
+a4b0 YI RADICAL SHY
+a4b1 YI RADICAL VEP
+a4b2 YI RADICAL ZA
+a4b3 YI RADICAL JO
+a4b5 YI RADICAL JJY
+a4b6 YI RADICAL GOT
+a4b7 YI RADICAL JJIE
+a4b8 YI RADICAL WO
+a4b9 YI RADICAL DU
+a4ba YI RADICAL SHUR
+a4bb YI RADICAL LIE
+a4bc YI RADICAL CY
+a4bd YI RADICAL CUOP
+a4be YI RADICAL CIP
+a4bf YI RADICAL HXOP
+a4c0 YI RADICAL SHAT
+a4c2 YI RADICAL SHOP
+a4c3 YI RADICAL CHE
+a4c4 YI RADICAL ZZIET
+a4c6 YI RADICAL KE
+ac00 d7a3 <Hangul Syllable, First>
+d800 db7f <Non Private Use High Surrogate, First>
+db80 dbff <Private Use High Surrogate, First>
+dc00 dfff <Low Surrogate, First>
+e000 f8ff <Private Use, First>
+f900 CJK COMPATIBILITY IDEOGRAPH-F900
+f901 CJK COMPATIBILITY IDEOGRAPH-F901
+f902 CJK COMPATIBILITY IDEOGRAPH-F902
+f903 CJK COMPATIBILITY IDEOGRAPH-F903
+f904 CJK COMPATIBILITY IDEOGRAPH-F904
+f905 CJK COMPATIBILITY IDEOGRAPH-F905
+f906 CJK COMPATIBILITY IDEOGRAPH-F906
+f907 CJK COMPATIBILITY IDEOGRAPH-F907
+f908 CJK COMPATIBILITY IDEOGRAPH-F908
+f909 CJK COMPATIBILITY IDEOGRAPH-F909
+f90a CJK COMPATIBILITY IDEOGRAPH-F90A
+f90b CJK COMPATIBILITY IDEOGRAPH-F90B
+f90c CJK COMPATIBILITY IDEOGRAPH-F90C
+f90d CJK COMPATIBILITY IDEOGRAPH-F90D
+f90e CJK COMPATIBILITY IDEOGRAPH-F90E
+f90f CJK COMPATIBILITY IDEOGRAPH-F90F
+f910 CJK COMPATIBILITY IDEOGRAPH-F910
+f911 CJK COMPATIBILITY IDEOGRAPH-F911
+f912 CJK COMPATIBILITY IDEOGRAPH-F912
+f913 CJK COMPATIBILITY IDEOGRAPH-F913
+f914 CJK COMPATIBILITY IDEOGRAPH-F914
+f915 CJK COMPATIBILITY IDEOGRAPH-F915
+f916 CJK COMPATIBILITY IDEOGRAPH-F916
+f917 CJK COMPATIBILITY IDEOGRAPH-F917
+f918 CJK COMPATIBILITY IDEOGRAPH-F918
+f919 CJK COMPATIBILITY IDEOGRAPH-F919
+f91a CJK COMPATIBILITY IDEOGRAPH-F91A
+f91b CJK COMPATIBILITY IDEOGRAPH-F91B
+f91c CJK COMPATIBILITY IDEOGRAPH-F91C
+f91d CJK COMPATIBILITY IDEOGRAPH-F91D
+f91e CJK COMPATIBILITY IDEOGRAPH-F91E
+f91f CJK COMPATIBILITY IDEOGRAPH-F91F
+f920 CJK COMPATIBILITY IDEOGRAPH-F920
+f921 CJK COMPATIBILITY IDEOGRAPH-F921
+f922 CJK COMPATIBILITY IDEOGRAPH-F922
+f923 CJK COMPATIBILITY IDEOGRAPH-F923
+f924 CJK COMPATIBILITY IDEOGRAPH-F924
+f925 CJK COMPATIBILITY IDEOGRAPH-F925
+f926 CJK COMPATIBILITY IDEOGRAPH-F926
+f927 CJK COMPATIBILITY IDEOGRAPH-F927
+f928 CJK COMPATIBILITY IDEOGRAPH-F928
+f929 CJK COMPATIBILITY IDEOGRAPH-F929
+f92a CJK COMPATIBILITY IDEOGRAPH-F92A
+f92b CJK COMPATIBILITY IDEOGRAPH-F92B
+f92c CJK COMPATIBILITY IDEOGRAPH-F92C
+f92d CJK COMPATIBILITY IDEOGRAPH-F92D
+f92e CJK COMPATIBILITY IDEOGRAPH-F92E
+f92f CJK COMPATIBILITY IDEOGRAPH-F92F
+f930 CJK COMPATIBILITY IDEOGRAPH-F930
+f931 CJK COMPATIBILITY IDEOGRAPH-F931
+f932 CJK COMPATIBILITY IDEOGRAPH-F932
+f933 CJK COMPATIBILITY IDEOGRAPH-F933
+f934 CJK COMPATIBILITY IDEOGRAPH-F934
+f935 CJK COMPATIBILITY IDEOGRAPH-F935
+f936 CJK COMPATIBILITY IDEOGRAPH-F936
+f937 CJK COMPATIBILITY IDEOGRAPH-F937
+f938 CJK COMPATIBILITY IDEOGRAPH-F938
+f939 CJK COMPATIBILITY IDEOGRAPH-F939
+f93a CJK COMPATIBILITY IDEOGRAPH-F93A
+f93b CJK COMPATIBILITY IDEOGRAPH-F93B
+f93c CJK COMPATIBILITY IDEOGRAPH-F93C
+f93d CJK COMPATIBILITY IDEOGRAPH-F93D
+f93e CJK COMPATIBILITY IDEOGRAPH-F93E
+f93f CJK COMPATIBILITY IDEOGRAPH-F93F
+f940 CJK COMPATIBILITY IDEOGRAPH-F940
+f941 CJK COMPATIBILITY IDEOGRAPH-F941
+f942 CJK COMPATIBILITY IDEOGRAPH-F942
+f943 CJK COMPATIBILITY IDEOGRAPH-F943
+f944 CJK COMPATIBILITY IDEOGRAPH-F944
+f945 CJK COMPATIBILITY IDEOGRAPH-F945
+f946 CJK COMPATIBILITY IDEOGRAPH-F946
+f947 CJK COMPATIBILITY IDEOGRAPH-F947
+f948 CJK COMPATIBILITY IDEOGRAPH-F948
+f949 CJK COMPATIBILITY IDEOGRAPH-F949
+f94a CJK COMPATIBILITY IDEOGRAPH-F94A
+f94b CJK COMPATIBILITY IDEOGRAPH-F94B
+f94c CJK COMPATIBILITY IDEOGRAPH-F94C
+f94d CJK COMPATIBILITY IDEOGRAPH-F94D
+f94e CJK COMPATIBILITY IDEOGRAPH-F94E
+f94f CJK COMPATIBILITY IDEOGRAPH-F94F
+f950 CJK COMPATIBILITY IDEOGRAPH-F950
+f951 CJK COMPATIBILITY IDEOGRAPH-F951
+f952 CJK COMPATIBILITY IDEOGRAPH-F952
+f953 CJK COMPATIBILITY IDEOGRAPH-F953
+f954 CJK COMPATIBILITY IDEOGRAPH-F954
+f955 CJK COMPATIBILITY IDEOGRAPH-F955
+f956 CJK COMPATIBILITY IDEOGRAPH-F956
+f957 CJK COMPATIBILITY IDEOGRAPH-F957
+f958 CJK COMPATIBILITY IDEOGRAPH-F958
+f959 CJK COMPATIBILITY IDEOGRAPH-F959
+f95a CJK COMPATIBILITY IDEOGRAPH-F95A
+f95b CJK COMPATIBILITY IDEOGRAPH-F95B
+f95c CJK COMPATIBILITY IDEOGRAPH-F95C
+f95d CJK COMPATIBILITY IDEOGRAPH-F95D
+f95e CJK COMPATIBILITY IDEOGRAPH-F95E
+f95f CJK COMPATIBILITY IDEOGRAPH-F95F
+f960 CJK COMPATIBILITY IDEOGRAPH-F960
+f961 CJK COMPATIBILITY IDEOGRAPH-F961
+f962 CJK COMPATIBILITY IDEOGRAPH-F962
+f963 CJK COMPATIBILITY IDEOGRAPH-F963
+f964 CJK COMPATIBILITY IDEOGRAPH-F964
+f965 CJK COMPATIBILITY IDEOGRAPH-F965
+f966 CJK COMPATIBILITY IDEOGRAPH-F966
+f967 CJK COMPATIBILITY IDEOGRAPH-F967
+f968 CJK COMPATIBILITY IDEOGRAPH-F968
+f969 CJK COMPATIBILITY IDEOGRAPH-F969
+f96a CJK COMPATIBILITY IDEOGRAPH-F96A
+f96b CJK COMPATIBILITY IDEOGRAPH-F96B
+f96c CJK COMPATIBILITY IDEOGRAPH-F96C
+f96d CJK COMPATIBILITY IDEOGRAPH-F96D
+f96e CJK COMPATIBILITY IDEOGRAPH-F96E
+f96f CJK COMPATIBILITY IDEOGRAPH-F96F
+f970 CJK COMPATIBILITY IDEOGRAPH-F970
+f971 CJK COMPATIBILITY IDEOGRAPH-F971
+f972 CJK COMPATIBILITY IDEOGRAPH-F972
+f973 CJK COMPATIBILITY IDEOGRAPH-F973
+f974 CJK COMPATIBILITY IDEOGRAPH-F974
+f975 CJK COMPATIBILITY IDEOGRAPH-F975
+f976 CJK COMPATIBILITY IDEOGRAPH-F976
+f977 CJK COMPATIBILITY IDEOGRAPH-F977
+f978 CJK COMPATIBILITY IDEOGRAPH-F978
+f979 CJK COMPATIBILITY IDEOGRAPH-F979
+f97a CJK COMPATIBILITY IDEOGRAPH-F97A
+f97b CJK COMPATIBILITY IDEOGRAPH-F97B
+f97c CJK COMPATIBILITY IDEOGRAPH-F97C
+f97d CJK COMPATIBILITY IDEOGRAPH-F97D
+f97e CJK COMPATIBILITY IDEOGRAPH-F97E
+f97f CJK COMPATIBILITY IDEOGRAPH-F97F
+f980 CJK COMPATIBILITY IDEOGRAPH-F980
+f981 CJK COMPATIBILITY IDEOGRAPH-F981
+f982 CJK COMPATIBILITY IDEOGRAPH-F982
+f983 CJK COMPATIBILITY IDEOGRAPH-F983
+f984 CJK COMPATIBILITY IDEOGRAPH-F984
+f985 CJK COMPATIBILITY IDEOGRAPH-F985
+f986 CJK COMPATIBILITY IDEOGRAPH-F986
+f987 CJK COMPATIBILITY IDEOGRAPH-F987
+f988 CJK COMPATIBILITY IDEOGRAPH-F988
+f989 CJK COMPATIBILITY IDEOGRAPH-F989
+f98a CJK COMPATIBILITY IDEOGRAPH-F98A
+f98b CJK COMPATIBILITY IDEOGRAPH-F98B
+f98c CJK COMPATIBILITY IDEOGRAPH-F98C
+f98d CJK COMPATIBILITY IDEOGRAPH-F98D
+f98e CJK COMPATIBILITY IDEOGRAPH-F98E
+f98f CJK COMPATIBILITY IDEOGRAPH-F98F
+f990 CJK COMPATIBILITY IDEOGRAPH-F990
+f991 CJK COMPATIBILITY IDEOGRAPH-F991
+f992 CJK COMPATIBILITY IDEOGRAPH-F992
+f993 CJK COMPATIBILITY IDEOGRAPH-F993
+f994 CJK COMPATIBILITY IDEOGRAPH-F994
+f995 CJK COMPATIBILITY IDEOGRAPH-F995
+f996 CJK COMPATIBILITY IDEOGRAPH-F996
+f997 CJK COMPATIBILITY IDEOGRAPH-F997
+f998 CJK COMPATIBILITY IDEOGRAPH-F998
+f999 CJK COMPATIBILITY IDEOGRAPH-F999
+f99a CJK COMPATIBILITY IDEOGRAPH-F99A
+f99b CJK COMPATIBILITY IDEOGRAPH-F99B
+f99c CJK COMPATIBILITY IDEOGRAPH-F99C
+f99d CJK COMPATIBILITY IDEOGRAPH-F99D
+f99e CJK COMPATIBILITY IDEOGRAPH-F99E
+f99f CJK COMPATIBILITY IDEOGRAPH-F99F
+f9a0 CJK COMPATIBILITY IDEOGRAPH-F9A0
+f9a1 CJK COMPATIBILITY IDEOGRAPH-F9A1
+f9a2 CJK COMPATIBILITY IDEOGRAPH-F9A2
+f9a3 CJK COMPATIBILITY IDEOGRAPH-F9A3
+f9a4 CJK COMPATIBILITY IDEOGRAPH-F9A4
+f9a5 CJK COMPATIBILITY IDEOGRAPH-F9A5
+f9a6 CJK COMPATIBILITY IDEOGRAPH-F9A6
+f9a7 CJK COMPATIBILITY IDEOGRAPH-F9A7
+f9a8 CJK COMPATIBILITY IDEOGRAPH-F9A8
+f9a9 CJK COMPATIBILITY IDEOGRAPH-F9A9
+f9aa CJK COMPATIBILITY IDEOGRAPH-F9AA
+f9ab CJK COMPATIBILITY IDEOGRAPH-F9AB
+f9ac CJK COMPATIBILITY IDEOGRAPH-F9AC
+f9ad CJK COMPATIBILITY IDEOGRAPH-F9AD
+f9ae CJK COMPATIBILITY IDEOGRAPH-F9AE
+f9af CJK COMPATIBILITY IDEOGRAPH-F9AF
+f9b0 CJK COMPATIBILITY IDEOGRAPH-F9B0
+f9b1 CJK COMPATIBILITY IDEOGRAPH-F9B1
+f9b2 CJK COMPATIBILITY IDEOGRAPH-F9B2
+f9b3 CJK COMPATIBILITY IDEOGRAPH-F9B3
+f9b4 CJK COMPATIBILITY IDEOGRAPH-F9B4
+f9b5 CJK COMPATIBILITY IDEOGRAPH-F9B5
+f9b6 CJK COMPATIBILITY IDEOGRAPH-F9B6
+f9b7 CJK COMPATIBILITY IDEOGRAPH-F9B7
+f9b8 CJK COMPATIBILITY IDEOGRAPH-F9B8
+f9b9 CJK COMPATIBILITY IDEOGRAPH-F9B9
+f9ba CJK COMPATIBILITY IDEOGRAPH-F9BA
+f9bb CJK COMPATIBILITY IDEOGRAPH-F9BB
+f9bc CJK COMPATIBILITY IDEOGRAPH-F9BC
+f9bd CJK COMPATIBILITY IDEOGRAPH-F9BD
+f9be CJK COMPATIBILITY IDEOGRAPH-F9BE
+f9bf CJK COMPATIBILITY IDEOGRAPH-F9BF
+f9c0 CJK COMPATIBILITY IDEOGRAPH-F9C0
+f9c1 CJK COMPATIBILITY IDEOGRAPH-F9C1
+f9c2 CJK COMPATIBILITY IDEOGRAPH-F9C2
+f9c3 CJK COMPATIBILITY IDEOGRAPH-F9C3
+f9c4 CJK COMPATIBILITY IDEOGRAPH-F9C4
+f9c5 CJK COMPATIBILITY IDEOGRAPH-F9C5
+f9c6 CJK COMPATIBILITY IDEOGRAPH-F9C6
+f9c7 CJK COMPATIBILITY IDEOGRAPH-F9C7
+f9c8 CJK COMPATIBILITY IDEOGRAPH-F9C8
+f9c9 CJK COMPATIBILITY IDEOGRAPH-F9C9
+f9ca CJK COMPATIBILITY IDEOGRAPH-F9CA
+f9cb CJK COMPATIBILITY IDEOGRAPH-F9CB
+f9cc CJK COMPATIBILITY IDEOGRAPH-F9CC
+f9cd CJK COMPATIBILITY IDEOGRAPH-F9CD
+f9ce CJK COMPATIBILITY IDEOGRAPH-F9CE
+f9cf CJK COMPATIBILITY IDEOGRAPH-F9CF
+f9d0 CJK COMPATIBILITY IDEOGRAPH-F9D0
+f9d1 CJK COMPATIBILITY IDEOGRAPH-F9D1
+f9d2 CJK COMPATIBILITY IDEOGRAPH-F9D2
+f9d3 CJK COMPATIBILITY IDEOGRAPH-F9D3
+f9d4 CJK COMPATIBILITY IDEOGRAPH-F9D4
+f9d5 CJK COMPATIBILITY IDEOGRAPH-F9D5
+f9d6 CJK COMPATIBILITY IDEOGRAPH-F9D6
+f9d7 CJK COMPATIBILITY IDEOGRAPH-F9D7
+f9d8 CJK COMPATIBILITY IDEOGRAPH-F9D8
+f9d9 CJK COMPATIBILITY IDEOGRAPH-F9D9
+f9da CJK COMPATIBILITY IDEOGRAPH-F9DA
+f9db CJK COMPATIBILITY IDEOGRAPH-F9DB
+f9dc CJK COMPATIBILITY IDEOGRAPH-F9DC
+f9dd CJK COMPATIBILITY IDEOGRAPH-F9DD
+f9de CJK COMPATIBILITY IDEOGRAPH-F9DE
+f9df CJK COMPATIBILITY IDEOGRAPH-F9DF
+f9e0 CJK COMPATIBILITY IDEOGRAPH-F9E0
+f9e1 CJK COMPATIBILITY IDEOGRAPH-F9E1
+f9e2 CJK COMPATIBILITY IDEOGRAPH-F9E2
+f9e3 CJK COMPATIBILITY IDEOGRAPH-F9E3
+f9e4 CJK COMPATIBILITY IDEOGRAPH-F9E4
+f9e5 CJK COMPATIBILITY IDEOGRAPH-F9E5
+f9e6 CJK COMPATIBILITY IDEOGRAPH-F9E6
+f9e7 CJK COMPATIBILITY IDEOGRAPH-F9E7
+f9e8 CJK COMPATIBILITY IDEOGRAPH-F9E8
+f9e9 CJK COMPATIBILITY IDEOGRAPH-F9E9
+f9ea CJK COMPATIBILITY IDEOGRAPH-F9EA
+f9eb CJK COMPATIBILITY IDEOGRAPH-F9EB
+f9ec CJK COMPATIBILITY IDEOGRAPH-F9EC
+f9ed CJK COMPATIBILITY IDEOGRAPH-F9ED
+f9ee CJK COMPATIBILITY IDEOGRAPH-F9EE
+f9ef CJK COMPATIBILITY IDEOGRAPH-F9EF
+f9f0 CJK COMPATIBILITY IDEOGRAPH-F9F0
+f9f1 CJK COMPATIBILITY IDEOGRAPH-F9F1
+f9f2 CJK COMPATIBILITY IDEOGRAPH-F9F2
+f9f3 CJK COMPATIBILITY IDEOGRAPH-F9F3
+f9f4 CJK COMPATIBILITY IDEOGRAPH-F9F4
+f9f5 CJK COMPATIBILITY IDEOGRAPH-F9F5
+f9f6 CJK COMPATIBILITY IDEOGRAPH-F9F6
+f9f7 CJK COMPATIBILITY IDEOGRAPH-F9F7
+f9f8 CJK COMPATIBILITY IDEOGRAPH-F9F8
+f9f9 CJK COMPATIBILITY IDEOGRAPH-F9F9
+f9fa CJK COMPATIBILITY IDEOGRAPH-F9FA
+f9fb CJK COMPATIBILITY IDEOGRAPH-F9FB
+f9fc CJK COMPATIBILITY IDEOGRAPH-F9FC
+f9fd CJK COMPATIBILITY IDEOGRAPH-F9FD
+f9fe CJK COMPATIBILITY IDEOGRAPH-F9FE
+f9ff CJK COMPATIBILITY IDEOGRAPH-F9FF
+fa00 CJK COMPATIBILITY IDEOGRAPH-FA00
+fa01 CJK COMPATIBILITY IDEOGRAPH-FA01
+fa02 CJK COMPATIBILITY IDEOGRAPH-FA02
+fa03 CJK COMPATIBILITY IDEOGRAPH-FA03
+fa04 CJK COMPATIBILITY IDEOGRAPH-FA04
+fa05 CJK COMPATIBILITY IDEOGRAPH-FA05
+fa06 CJK COMPATIBILITY IDEOGRAPH-FA06
+fa07 CJK COMPATIBILITY IDEOGRAPH-FA07
+fa08 CJK COMPATIBILITY IDEOGRAPH-FA08
+fa09 CJK COMPATIBILITY IDEOGRAPH-FA09
+fa0a CJK COMPATIBILITY IDEOGRAPH-FA0A
+fa0b CJK COMPATIBILITY IDEOGRAPH-FA0B
+fa0c CJK COMPATIBILITY IDEOGRAPH-FA0C
+fa0d CJK COMPATIBILITY IDEOGRAPH-FA0D
+fa0e CJK COMPATIBILITY IDEOGRAPH-FA0E
+fa0f CJK COMPATIBILITY IDEOGRAPH-FA0F
+fa10 CJK COMPATIBILITY IDEOGRAPH-FA10
+fa11 CJK COMPATIBILITY IDEOGRAPH-FA11
+fa12 CJK COMPATIBILITY IDEOGRAPH-FA12
+fa13 CJK COMPATIBILITY IDEOGRAPH-FA13
+fa14 CJK COMPATIBILITY IDEOGRAPH-FA14
+fa15 CJK COMPATIBILITY IDEOGRAPH-FA15
+fa16 CJK COMPATIBILITY IDEOGRAPH-FA16
+fa17 CJK COMPATIBILITY IDEOGRAPH-FA17
+fa18 CJK COMPATIBILITY IDEOGRAPH-FA18
+fa19 CJK COMPATIBILITY IDEOGRAPH-FA19
+fa1a CJK COMPATIBILITY IDEOGRAPH-FA1A
+fa1b CJK COMPATIBILITY IDEOGRAPH-FA1B
+fa1c CJK COMPATIBILITY IDEOGRAPH-FA1C
+fa1d CJK COMPATIBILITY IDEOGRAPH-FA1D
+fa1e CJK COMPATIBILITY IDEOGRAPH-FA1E
+fa1f CJK COMPATIBILITY IDEOGRAPH-FA1F
+fa20 CJK COMPATIBILITY IDEOGRAPH-FA20
+fa21 CJK COMPATIBILITY IDEOGRAPH-FA21
+fa22 CJK COMPATIBILITY IDEOGRAPH-FA22
+fa23 CJK COMPATIBILITY IDEOGRAPH-FA23
+fa24 CJK COMPATIBILITY IDEOGRAPH-FA24
+fa25 CJK COMPATIBILITY IDEOGRAPH-FA25
+fa26 CJK COMPATIBILITY IDEOGRAPH-FA26
+fa27 CJK COMPATIBILITY IDEOGRAPH-FA27
+fa28 CJK COMPATIBILITY IDEOGRAPH-FA28
+fa29 CJK COMPATIBILITY IDEOGRAPH-FA29
+fa2a CJK COMPATIBILITY IDEOGRAPH-FA2A
+fa2b CJK COMPATIBILITY IDEOGRAPH-FA2B
+fa2c CJK COMPATIBILITY IDEOGRAPH-FA2C
+fa2d CJK COMPATIBILITY IDEOGRAPH-FA2D
+fb00 LATIN SMALL LIGATURE FF
+fb01 LATIN SMALL LIGATURE FI
+fb02 LATIN SMALL LIGATURE FL
+fb03 LATIN SMALL LIGATURE FFI
+fb04 LATIN SMALL LIGATURE FFL
+fb05 LATIN SMALL LIGATURE LONG S T
+fb06 LATIN SMALL LIGATURE ST
+fb13 ARMENIAN SMALL LIGATURE MEN NOW
+fb14 ARMENIAN SMALL LIGATURE MEN ECH
+fb15 ARMENIAN SMALL LIGATURE MEN INI
+fb16 ARMENIAN SMALL LIGATURE VEW NOW
+fb17 ARMENIAN SMALL LIGATURE MEN XEH
+fb1d HEBREW LETTER YOD WITH HIRIQ
+fb1e HEBREW POINT JUDEO-SPANISH VARIKA
+fb1f HEBREW LIGATURE YIDDISH YOD YOD PATAH
+fb20 HEBREW LETTER ALTERNATIVE AYIN
+fb21 HEBREW LETTER WIDE ALEF
+fb22 HEBREW LETTER WIDE DALET
+fb23 HEBREW LETTER WIDE HE
+fb24 HEBREW LETTER WIDE KAF
+fb25 HEBREW LETTER WIDE LAMED
+fb26 HEBREW LETTER WIDE FINAL MEM
+fb27 HEBREW LETTER WIDE RESH
+fb28 HEBREW LETTER WIDE TAV
+fb29 HEBREW LETTER ALTERNATIVE PLUS SIGN
+fb2a HEBREW LETTER SHIN WITH SHIN DOT
+fb2b HEBREW LETTER SHIN WITH SIN DOT
+fb2c HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+fb2d HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+fb2e HEBREW LETTER ALEF WITH PATAH
+fb2f HEBREW LETTER ALEF WITH QAMATS
+fb30 HEBREW LETTER ALEF WITH MAPIQ
+fb31 HEBREW LETTER BET WITH DAGESH
+fb32 HEBREW LETTER GIMEL WITH DAGESH
+fb33 HEBREW LETTER DALET WITH DAGESH
+fb34 HEBREW LETTER HE WITH MAPIQ
+fb35 HEBREW LETTER VAV WITH DAGESH
+fb36 HEBREW LETTER ZAYIN WITH DAGESH
+fb38 HEBREW LETTER TET WITH DAGESH
+fb39 HEBREW LETTER YOD WITH DAGESH
+fb3a HEBREW LETTER FINAL KAF WITH DAGESH
+fb3b HEBREW LETTER KAF WITH DAGESH
+fb3c HEBREW LETTER LAMED WITH DAGESH
+fb3e HEBREW LETTER MEM WITH DAGESH
+fb40 HEBREW LETTER NUN WITH DAGESH
+fb41 HEBREW LETTER SAMEKH WITH DAGESH
+fb43 HEBREW LETTER FINAL PE WITH DAGESH
+fb44 HEBREW LETTER PE WITH DAGESH
+fb46 HEBREW LETTER TSADI WITH DAGESH
+fb47 HEBREW LETTER QOF WITH DAGESH
+fb48 HEBREW LETTER RESH WITH DAGESH
+fb49 HEBREW LETTER SHIN WITH DAGESH
+fb4a HEBREW LETTER TAV WITH DAGESH
+fb4b HEBREW LETTER VAV WITH HOLAM
+fb4c HEBREW LETTER BET WITH RAFE
+fb4d HEBREW LETTER KAF WITH RAFE
+fb4e HEBREW LETTER PE WITH RAFE
+fb4f HEBREW LIGATURE ALEF LAMED
+fb50 ARABIC LETTER ALEF WASLA ISOLATED FORM
+fb51 ARABIC LETTER ALEF WASLA FINAL FORM
+fb52 ARABIC LETTER BEEH ISOLATED FORM
+fb53 ARABIC LETTER BEEH FINAL FORM
+fb54 ARABIC LETTER BEEH INITIAL FORM
+fb55 ARABIC LETTER BEEH MEDIAL FORM
+fb56 ARABIC LETTER PEH ISOLATED FORM
+fb57 ARABIC LETTER PEH FINAL FORM
+fb58 ARABIC LETTER PEH INITIAL FORM
+fb59 ARABIC LETTER PEH MEDIAL FORM
+fb5a ARABIC LETTER BEHEH ISOLATED FORM
+fb5b ARABIC LETTER BEHEH FINAL FORM
+fb5c ARABIC LETTER BEHEH INITIAL FORM
+fb5d ARABIC LETTER BEHEH MEDIAL FORM
+fb5e ARABIC LETTER TTEHEH ISOLATED FORM
+fb5f ARABIC LETTER TTEHEH FINAL FORM
+fb60 ARABIC LETTER TTEHEH INITIAL FORM
+fb61 ARABIC LETTER TTEHEH MEDIAL FORM
+fb62 ARABIC LETTER TEHEH ISOLATED FORM
+fb63 ARABIC LETTER TEHEH FINAL FORM
+fb64 ARABIC LETTER TEHEH INITIAL FORM
+fb65 ARABIC LETTER TEHEH MEDIAL FORM
+fb66 ARABIC LETTER TTEH ISOLATED FORM
+fb67 ARABIC LETTER TTEH FINAL FORM
+fb68 ARABIC LETTER TTEH INITIAL FORM
+fb69 ARABIC LETTER TTEH MEDIAL FORM
+fb6a ARABIC LETTER VEH ISOLATED FORM
+fb6b ARABIC LETTER VEH FINAL FORM
+fb6c ARABIC LETTER VEH INITIAL FORM
+fb6d ARABIC LETTER VEH MEDIAL FORM
+fb6e ARABIC LETTER PEHEH ISOLATED FORM
+fb6f ARABIC LETTER PEHEH FINAL FORM
+fb70 ARABIC LETTER PEHEH INITIAL FORM
+fb71 ARABIC LETTER PEHEH MEDIAL FORM
+fb72 ARABIC LETTER DYEH ISOLATED FORM
+fb73 ARABIC LETTER DYEH FINAL FORM
+fb74 ARABIC LETTER DYEH INITIAL FORM
+fb75 ARABIC LETTER DYEH MEDIAL FORM
+fb76 ARABIC LETTER NYEH ISOLATED FORM
+fb77 ARABIC LETTER NYEH FINAL FORM
+fb78 ARABIC LETTER NYEH INITIAL FORM
+fb79 ARABIC LETTER NYEH MEDIAL FORM
+fb7a ARABIC LETTER TCHEH ISOLATED FORM
+fb7b ARABIC LETTER TCHEH FINAL FORM
+fb7c ARABIC LETTER TCHEH INITIAL FORM
+fb7d ARABIC LETTER TCHEH MEDIAL FORM
+fb7e ARABIC LETTER TCHEHEH ISOLATED FORM
+fb7f ARABIC LETTER TCHEHEH FINAL FORM
+fb80 ARABIC LETTER TCHEHEH INITIAL FORM
+fb81 ARABIC LETTER TCHEHEH MEDIAL FORM
+fb82 ARABIC LETTER DDAHAL ISOLATED FORM
+fb83 ARABIC LETTER DDAHAL FINAL FORM
+fb84 ARABIC LETTER DAHAL ISOLATED FORM
+fb85 ARABIC LETTER DAHAL FINAL FORM
+fb86 ARABIC LETTER DUL ISOLATED FORM
+fb87 ARABIC LETTER DUL FINAL FORM
+fb88 ARABIC LETTER DDAL ISOLATED FORM
+fb89 ARABIC LETTER DDAL FINAL FORM
+fb8a ARABIC LETTER JEH ISOLATED FORM
+fb8b ARABIC LETTER JEH FINAL FORM
+fb8c ARABIC LETTER RREH ISOLATED FORM
+fb8d ARABIC LETTER RREH FINAL FORM
+fb8e ARABIC LETTER KEHEH ISOLATED FORM
+fb8f ARABIC LETTER KEHEH FINAL FORM
+fb90 ARABIC LETTER KEHEH INITIAL FORM
+fb91 ARABIC LETTER KEHEH MEDIAL FORM
+fb92 ARABIC LETTER GAF ISOLATED FORM
+fb93 ARABIC LETTER GAF FINAL FORM
+fb94 ARABIC LETTER GAF INITIAL FORM
+fb95 ARABIC LETTER GAF MEDIAL FORM
+fb96 ARABIC LETTER GUEH ISOLATED FORM
+fb97 ARABIC LETTER GUEH FINAL FORM
+fb98 ARABIC LETTER GUEH INITIAL FORM
+fb99 ARABIC LETTER GUEH MEDIAL FORM
+fb9a ARABIC LETTER NGOEH ISOLATED FORM
+fb9b ARABIC LETTER NGOEH FINAL FORM
+fb9c ARABIC LETTER NGOEH INITIAL FORM
+fb9d ARABIC LETTER NGOEH MEDIAL FORM
+fb9e ARABIC LETTER NOON GHUNNA ISOLATED FORM
+fb9f ARABIC LETTER NOON GHUNNA FINAL FORM
+fba0 ARABIC LETTER RNOON ISOLATED FORM
+fba1 ARABIC LETTER RNOON FINAL FORM
+fba2 ARABIC LETTER RNOON INITIAL FORM
+fba3 ARABIC LETTER RNOON MEDIAL FORM
+fba4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+fba5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+fba6 ARABIC LETTER HEH GOAL ISOLATED FORM
+fba7 ARABIC LETTER HEH GOAL FINAL FORM
+fba8 ARABIC LETTER HEH GOAL INITIAL FORM
+fba9 ARABIC LETTER HEH GOAL MEDIAL FORM
+fbaa ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+fbab ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+fbac ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+fbad ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+fbae ARABIC LETTER YEH BARREE ISOLATED FORM
+fbaf ARABIC LETTER YEH BARREE FINAL FORM
+fbb0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+fbb1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+fbd3 ARABIC LETTER NG ISOLATED FORM
+fbd4 ARABIC LETTER NG FINAL FORM
+fbd5 ARABIC LETTER NG INITIAL FORM
+fbd6 ARABIC LETTER NG MEDIAL FORM
+fbd7 ARABIC LETTER U ISOLATED FORM
+fbd8 ARABIC LETTER U FINAL FORM
+fbd9 ARABIC LETTER OE ISOLATED FORM
+fbda ARABIC LETTER OE FINAL FORM
+fbdb ARABIC LETTER YU ISOLATED FORM
+fbdc ARABIC LETTER YU FINAL FORM
+fbdd ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+fbde ARABIC LETTER VE ISOLATED FORM
+fbdf ARABIC LETTER VE FINAL FORM
+fbe0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+fbe1 ARABIC LETTER KIRGHIZ OE FINAL FORM
+fbe2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+fbe3 ARABIC LETTER KIRGHIZ YU FINAL FORM
+fbe4 ARABIC LETTER E ISOLATED FORM
+fbe5 ARABIC LETTER E FINAL FORM
+fbe6 ARABIC LETTER E INITIAL FORM
+fbe7 ARABIC LETTER E MEDIAL FORM
+fbe8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+fbe9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+fbea ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+fbeb ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+fbec ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+fbed ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+fbee ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+fbef ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+fbf0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+fbf1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+fbf2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+fbf3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+fbf4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+fbf5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+fbf6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+fbf7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+fbf8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+fbf9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+fbfa ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+fbfb ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+fbfc ARABIC LETTER FARSI YEH ISOLATED FORM
+fbfd ARABIC LETTER FARSI YEH FINAL FORM
+fbfe ARABIC LETTER FARSI YEH INITIAL FORM
+fbff ARABIC LETTER FARSI YEH MEDIAL FORM
+fc00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+fc01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+fc02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+fc03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+fc04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+fc05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+fc06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+fc07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+fc08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+fc09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+fc0a ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+fc0b ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+fc0c ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+fc0d ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+fc0e ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+fc0f ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+fc10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+fc11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+fc12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+fc13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+fc14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+fc15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+fc16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+fc17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+fc18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+fc19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+fc1a ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+fc1b ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+fc1c ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+fc1d ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+fc1e ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+fc1f ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+fc20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+fc21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+fc22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+fc23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+fc24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+fc25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+fc26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+fc27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+fc28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+fc29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+fc2a ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+fc2b ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+fc2c ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+fc2d ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+fc2e ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+fc2f ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+fc30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+fc31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+fc32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+fc33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+fc34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+fc35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+fc36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+fc37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+fc38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+fc39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+fc3a ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+fc3b ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+fc3c ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+fc3d ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+fc3e ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+fc3f ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+fc40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+fc41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+fc42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+fc43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+fc44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+fc45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+fc46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+fc47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+fc48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+fc49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+fc4a ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+fc4b ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+fc4c ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+fc4d ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+fc4e ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+fc4f ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+fc50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+fc51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+fc52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+fc53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+fc54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+fc55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+fc56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+fc57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+fc58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+fc59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+fc5a ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+fc5b ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+fc5c ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+fc5d ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+fc5e ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+fc5f ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+fc60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+fc61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+fc62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+fc63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+fc64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+fc65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+fc66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+fc67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+fc68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+fc69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+fc6a ARABIC LIGATURE BEH WITH REH FINAL FORM
+fc6b ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+fc6c ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+fc6d ARABIC LIGATURE BEH WITH NOON FINAL FORM
+fc6e ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+fc6f ARABIC LIGATURE BEH WITH YEH FINAL FORM
+fc70 ARABIC LIGATURE TEH WITH REH FINAL FORM
+fc71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+fc72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+fc73 ARABIC LIGATURE TEH WITH NOON FINAL FORM
+fc74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+fc75 ARABIC LIGATURE TEH WITH YEH FINAL FORM
+fc76 ARABIC LIGATURE THEH WITH REH FINAL FORM
+fc77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+fc78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+fc79 ARABIC LIGATURE THEH WITH NOON FINAL FORM
+fc7a ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+fc7b ARABIC LIGATURE THEH WITH YEH FINAL FORM
+fc7c ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+fc7d ARABIC LIGATURE FEH WITH YEH FINAL FORM
+fc7e ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+fc7f ARABIC LIGATURE QAF WITH YEH FINAL FORM
+fc80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+fc81 ARABIC LIGATURE KAF WITH LAM FINAL FORM
+fc82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+fc83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+fc84 ARABIC LIGATURE KAF WITH YEH FINAL FORM
+fc85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+fc86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+fc87 ARABIC LIGATURE LAM WITH YEH FINAL FORM
+fc88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+fc89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+fc8a ARABIC LIGATURE NOON WITH REH FINAL FORM
+fc8b ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+fc8c ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+fc8d ARABIC LIGATURE NOON WITH NOON FINAL FORM
+fc8e ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+fc8f ARABIC LIGATURE NOON WITH YEH FINAL FORM
+fc90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+fc91 ARABIC LIGATURE YEH WITH REH FINAL FORM
+fc92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+fc93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+fc94 ARABIC LIGATURE YEH WITH NOON FINAL FORM
+fc95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+fc96 ARABIC LIGATURE YEH WITH YEH FINAL FORM
+fc97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+fc98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+fc99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+fc9a ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+fc9b ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+fc9c ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+fc9d ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+fc9e ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+fc9f ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+fca0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+fca1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+fca2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+fca3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+fca4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+fca5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+fca6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+fca7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+fca8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+fca9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+fcaa ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+fcab ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+fcac ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+fcad ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+fcae ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+fcaf ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+fcb0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+fcb1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+fcb2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+fcb3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+fcb4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+fcb5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+fcb6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+fcb7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+fcb8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+fcb9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+fcba ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+fcbb ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+fcbc ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+fcbd ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+fcbe ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+fcbf ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+fcc0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+fcc1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+fcc2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+fcc3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+fcc4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+fcc5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+fcc6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+fcc7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+fcc8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+fcc9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+fcca ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+fccb ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+fccc ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+fccd ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+fcce ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+fccf ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+fcd0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+fcd1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+fcd2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+fcd3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+fcd4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+fcd5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+fcd6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+fcd7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+fcd8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+fcd9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+fcda ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+fcdb ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+fcdc ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+fcdd ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+fcde ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+fcdf ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+fce0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+fce1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+fce2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+fce3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+fce4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+fce5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+fce6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+fce7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+fce8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+fce9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+fcea ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+fceb ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+fcec ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+fced ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+fcee ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+fcef ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+fcf0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+fcf1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+fcf2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+fcf3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+fcf4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+fcf5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+fcf6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+fcf7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+fcf8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+fcf9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+fcfa ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+fcfb ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+fcfc ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+fcfd ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+fcfe ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+fcff ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+fd00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+fd01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+fd02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+fd03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+fd04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+fd05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+fd06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+fd07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+fd08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+fd09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+fd0a ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+fd0b ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+fd0c ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+fd0d ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+fd0e ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+fd0f ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+fd10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+fd11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+fd12 ARABIC LIGATURE TAH WITH YEH FINAL FORM
+fd13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+fd14 ARABIC LIGATURE AIN WITH YEH FINAL FORM
+fd15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+fd16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+fd17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+fd18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+fd19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+fd1a ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+fd1b ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+fd1c ARABIC LIGATURE HAH WITH YEH FINAL FORM
+fd1d ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+fd1e ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+fd1f ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+fd20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+fd21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+fd22 ARABIC LIGATURE SAD WITH YEH FINAL FORM
+fd23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+fd24 ARABIC LIGATURE DAD WITH YEH FINAL FORM
+fd25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+fd26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+fd27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+fd28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+fd29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+fd2a ARABIC LIGATURE SEEN WITH REH FINAL FORM
+fd2b ARABIC LIGATURE SAD WITH REH FINAL FORM
+fd2c ARABIC LIGATURE DAD WITH REH FINAL FORM
+fd2d ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+fd2e ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+fd2f ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+fd30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+fd31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+fd32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+fd33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+fd34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+fd35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+fd36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+fd37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+fd38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+fd39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+fd3a ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+fd3b ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+fd3c ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+fd3d ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+fd3e ORNATE LEFT PARENTHESIS
+fd3f ORNATE RIGHT PARENTHESIS
+fd50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+fd51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+fd52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+fd53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+fd54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+fd55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+fd56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+fd57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+fd58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+fd59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+fd5a ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+fd5b ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+fd5c ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+fd5d ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+fd5e ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+fd5f ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+fd60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+fd61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+fd62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+fd63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+fd64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+fd65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+fd66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+fd67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+fd68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+fd69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+fd6a ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+fd6b ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+fd6c ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+fd6d ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+fd6e ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+fd6f ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+fd70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+fd71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+fd72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+fd73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+fd74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+fd75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+fd76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+fd77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+fd78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+fd79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+fd7a ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+fd7b ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+fd7c ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+fd7d ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+fd7e ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+fd7f ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+fd80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+fd81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+fd82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+fd83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+fd84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+fd85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+fd86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+fd87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+fd88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+fd89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+fd8a ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+fd8b ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+fd8c ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+fd8d ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+fd8e ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+fd8f ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+fd92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+fd93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+fd94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+fd95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+fd96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+fd97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+fd98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+fd99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+fd9a ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+fd9b ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+fd9c ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+fd9d ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+fd9e ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+fd9f ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+fda0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+fda1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+fda2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+fda3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+fda4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+fda5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+fda6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+fda7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+fda8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+fda9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+fdaa ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+fdab ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+fdac ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+fdad ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+fdae ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+fdaf ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+fdb0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+fdb1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+fdb2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+fdb3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+fdb4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+fdb5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+fdb6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+fdb7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+fdb8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+fdb9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+fdba ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+fdbb ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+fdbc ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+fdbd ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+fdbe ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+fdbf ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+fdc0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+fdc1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+fdc2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+fdc3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+fdc4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+fdc5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+fdc6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+fdc7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+fdf0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+fdf1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+fdf2 ARABIC LIGATURE ALLAH ISOLATED FORM
+fdf3 ARABIC LIGATURE AKBAR ISOLATED FORM
+fdf4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+fdf5 ARABIC LIGATURE SALAM ISOLATED FORM
+fdf6 ARABIC LIGATURE RASOUL ISOLATED FORM
+fdf7 ARABIC LIGATURE ALAYHE ISOLATED FORM
+fdf8 ARABIC LIGATURE WASALLAM ISOLATED FORM
+fdf9 ARABIC LIGATURE SALLA ISOLATED FORM
+fdfa ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+fdfb ARABIC LIGATURE JALLAJALALOUHOU
+fe20 COMBINING LIGATURE LEFT HALF
+fe21 COMBINING LIGATURE RIGHT HALF
+fe22 COMBINING DOUBLE TILDE LEFT HALF
+fe23 COMBINING DOUBLE TILDE RIGHT HALF
+fe30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+fe31 PRESENTATION FORM FOR VERTICAL EM DASH
+fe32 PRESENTATION FORM FOR VERTICAL EN DASH
+fe33 PRESENTATION FORM FOR VERTICAL LOW LINE
+fe34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+fe35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+fe36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+fe37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+fe38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+fe39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+fe3a PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+fe3b PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+fe3c PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+fe3d PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+fe3e PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+fe3f PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+fe40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+fe41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+fe42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+fe43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+fe44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+fe49 DASHED OVERLINE
+fe4a CENTRELINE OVERLINE
+fe4b WAVY OVERLINE
+fe4c DOUBLE WAVY OVERLINE
+fe4d DASHED LOW LINE
+fe4e CENTRELINE LOW LINE
+fe4f WAVY LOW LINE
+fe50 SMALL COMMA
+fe51 SMALL IDEOGRAPHIC COMMA
+fe52 SMALL FULL STOP
+fe54 SMALL SEMICOLON
+fe55 SMALL COLON
+fe56 SMALL QUESTION MARK
+fe57 SMALL EXCLAMATION MARK
+fe58 SMALL EM DASH
+fe59 SMALL LEFT PARENTHESIS
+fe5a SMALL RIGHT PARENTHESIS
+fe5b SMALL LEFT CURLY BRACKET
+fe5c SMALL RIGHT CURLY BRACKET
+fe5d SMALL LEFT TORTOISE SHELL BRACKET
+fe5e SMALL RIGHT TORTOISE SHELL BRACKET
+fe5f SMALL NUMBER SIGN
+fe60 SMALL AMPERSAND
+fe61 SMALL ASTERISK
+fe62 SMALL PLUS SIGN
+fe63 SMALL HYPHEN-MINUS
+fe64 SMALL LESS-THAN SIGN
+fe65 SMALL GREATER-THAN SIGN
+fe66 SMALL EQUALS SIGN
+fe68 SMALL REVERSE SOLIDUS
+fe69 SMALL DOLLAR SIGN
+fe6a SMALL PERCENT SIGN
+fe6b SMALL COMMERCIAL AT
+fe70 ARABIC FATHATAN ISOLATED FORM
+fe71 ARABIC TATWEEL WITH FATHATAN ABOVE
+fe72 ARABIC DAMMATAN ISOLATED FORM
+fe74 ARABIC KASRATAN ISOLATED FORM
+fe76 ARABIC FATHA ISOLATED FORM
+fe77 ARABIC FATHA MEDIAL FORM
+fe78 ARABIC DAMMA ISOLATED FORM
+fe79 ARABIC DAMMA MEDIAL FORM
+fe7a ARABIC KASRA ISOLATED FORM
+fe7b ARABIC KASRA MEDIAL FORM
+fe7c ARABIC SHADDA ISOLATED FORM
+fe7d ARABIC SHADDA MEDIAL FORM
+fe7e ARABIC SUKUN ISOLATED FORM
+fe7f ARABIC SUKUN MEDIAL FORM
+fe80 ARABIC LETTER HAMZA ISOLATED FORM
+fe81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+fe82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+fe83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+fe84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+fe85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+fe86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+fe87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+fe88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+fe89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+fe8a ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+fe8b ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+fe8c ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+fe8d ARABIC LETTER ALEF ISOLATED FORM
+fe8e ARABIC LETTER ALEF FINAL FORM
+fe8f ARABIC LETTER BEH ISOLATED FORM
+fe90 ARABIC LETTER BEH FINAL FORM
+fe91 ARABIC LETTER BEH INITIAL FORM
+fe92 ARABIC LETTER BEH MEDIAL FORM
+fe93 ARABIC LETTER TEH MARBUTA ISOLATED FORM
+fe94 ARABIC LETTER TEH MARBUTA FINAL FORM
+fe95 ARABIC LETTER TEH ISOLATED FORM
+fe96 ARABIC LETTER TEH FINAL FORM
+fe97 ARABIC LETTER TEH INITIAL FORM
+fe98 ARABIC LETTER TEH MEDIAL FORM
+fe99 ARABIC LETTER THEH ISOLATED FORM
+fe9a ARABIC LETTER THEH FINAL FORM
+fe9b ARABIC LETTER THEH INITIAL FORM
+fe9c ARABIC LETTER THEH MEDIAL FORM
+fe9d ARABIC LETTER JEEM ISOLATED FORM
+fe9e ARABIC LETTER JEEM FINAL FORM
+fe9f ARABIC LETTER JEEM INITIAL FORM
+fea0 ARABIC LETTER JEEM MEDIAL FORM
+fea1 ARABIC LETTER HAH ISOLATED FORM
+fea2 ARABIC LETTER HAH FINAL FORM
+fea3 ARABIC LETTER HAH INITIAL FORM
+fea4 ARABIC LETTER HAH MEDIAL FORM
+fea5 ARABIC LETTER KHAH ISOLATED FORM
+fea6 ARABIC LETTER KHAH FINAL FORM
+fea7 ARABIC LETTER KHAH INITIAL FORM
+fea8 ARABIC LETTER KHAH MEDIAL FORM
+fea9 ARABIC LETTER DAL ISOLATED FORM
+feaa ARABIC LETTER DAL FINAL FORM
+feab ARABIC LETTER THAL ISOLATED FORM
+feac ARABIC LETTER THAL FINAL FORM
+fead ARABIC LETTER REH ISOLATED FORM
+feae ARABIC LETTER REH FINAL FORM
+feaf ARABIC LETTER ZAIN ISOLATED FORM
+feb0 ARABIC LETTER ZAIN FINAL FORM
+feb1 ARABIC LETTER SEEN ISOLATED FORM
+feb2 ARABIC LETTER SEEN FINAL FORM
+feb3 ARABIC LETTER SEEN INITIAL FORM
+feb4 ARABIC LETTER SEEN MEDIAL FORM
+feb5 ARABIC LETTER SHEEN ISOLATED FORM
+feb6 ARABIC LETTER SHEEN FINAL FORM
+feb7 ARABIC LETTER SHEEN INITIAL FORM
+feb8 ARABIC LETTER SHEEN MEDIAL FORM
+feb9 ARABIC LETTER SAD ISOLATED FORM
+feba ARABIC LETTER SAD FINAL FORM
+febb ARABIC LETTER SAD INITIAL FORM
+febc ARABIC LETTER SAD MEDIAL FORM
+febd ARABIC LETTER DAD ISOLATED FORM
+febe ARABIC LETTER DAD FINAL FORM
+febf ARABIC LETTER DAD INITIAL FORM
+fec0 ARABIC LETTER DAD MEDIAL FORM
+fec1 ARABIC LETTER TAH ISOLATED FORM
+fec2 ARABIC LETTER TAH FINAL FORM
+fec3 ARABIC LETTER TAH INITIAL FORM
+fec4 ARABIC LETTER TAH MEDIAL FORM
+fec5 ARABIC LETTER ZAH ISOLATED FORM
+fec6 ARABIC LETTER ZAH FINAL FORM
+fec7 ARABIC LETTER ZAH INITIAL FORM
+fec8 ARABIC LETTER ZAH MEDIAL FORM
+fec9 ARABIC LETTER AIN ISOLATED FORM
+feca ARABIC LETTER AIN FINAL FORM
+fecb ARABIC LETTER AIN INITIAL FORM
+fecc ARABIC LETTER AIN MEDIAL FORM
+fecd ARABIC LETTER GHAIN ISOLATED FORM
+fece ARABIC LETTER GHAIN FINAL FORM
+fecf ARABIC LETTER GHAIN INITIAL FORM
+fed0 ARABIC LETTER GHAIN MEDIAL FORM
+fed1 ARABIC LETTER FEH ISOLATED FORM
+fed2 ARABIC LETTER FEH FINAL FORM
+fed3 ARABIC LETTER FEH INITIAL FORM
+fed4 ARABIC LETTER FEH MEDIAL FORM
+fed5 ARABIC LETTER QAF ISOLATED FORM
+fed6 ARABIC LETTER QAF FINAL FORM
+fed7 ARABIC LETTER QAF INITIAL FORM
+fed8 ARABIC LETTER QAF MEDIAL FORM
+fed9 ARABIC LETTER KAF ISOLATED FORM
+feda ARABIC LETTER KAF FINAL FORM
+fedb ARABIC LETTER KAF INITIAL FORM
+fedc ARABIC LETTER KAF MEDIAL FORM
+fedd ARABIC LETTER LAM ISOLATED FORM
+fede ARABIC LETTER LAM FINAL FORM
+fedf ARABIC LETTER LAM INITIAL FORM
+fee0 ARABIC LETTER LAM MEDIAL FORM
+fee1 ARABIC LETTER MEEM ISOLATED FORM
+fee2 ARABIC LETTER MEEM FINAL FORM
+fee3 ARABIC LETTER MEEM INITIAL FORM
+fee4 ARABIC LETTER MEEM MEDIAL FORM
+fee5 ARABIC LETTER NOON ISOLATED FORM
+fee6 ARABIC LETTER NOON FINAL FORM
+fee7 ARABIC LETTER NOON INITIAL FORM
+fee8 ARABIC LETTER NOON MEDIAL FORM
+fee9 ARABIC LETTER HEH ISOLATED FORM
+feea ARABIC LETTER HEH FINAL FORM
+feeb ARABIC LETTER HEH INITIAL FORM
+feec ARABIC LETTER HEH MEDIAL FORM
+feed ARABIC LETTER WAW ISOLATED FORM
+feee ARABIC LETTER WAW FINAL FORM
+feef ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+fef0 ARABIC LETTER ALEF MAKSURA FINAL FORM
+fef1 ARABIC LETTER YEH ISOLATED FORM
+fef2 ARABIC LETTER YEH FINAL FORM
+fef3 ARABIC LETTER YEH INITIAL FORM
+fef4 ARABIC LETTER YEH MEDIAL FORM
+fef5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+fef6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+fef7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+fef8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+fef9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+fefa ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+fefb ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+fefc ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+feff ZERO WIDTH NO-BREAK SPACE
+ff01 FULLWIDTH EXCLAMATION MARK
+ff02 FULLWIDTH QUOTATION MARK
+ff03 FULLWIDTH NUMBER SIGN
+ff04 FULLWIDTH DOLLAR SIGN
+ff05 FULLWIDTH PERCENT SIGN
+ff06 FULLWIDTH AMPERSAND
+ff07 FULLWIDTH APOSTROPHE
+ff08 FULLWIDTH LEFT PARENTHESIS
+ff09 FULLWIDTH RIGHT PARENTHESIS
+ff0a FULLWIDTH ASTERISK
+ff0b FULLWIDTH PLUS SIGN
+ff0c FULLWIDTH COMMA
+ff0d FULLWIDTH HYPHEN-MINUS
+ff0e FULLWIDTH FULL STOP
+ff0f FULLWIDTH SOLIDUS
+ff10 FULLWIDTH DIGIT ZERO
+ff11 FULLWIDTH DIGIT ONE
+ff12 FULLWIDTH DIGIT TWO
+ff13 FULLWIDTH DIGIT THREE
+ff14 FULLWIDTH DIGIT FOUR
+ff15 FULLWIDTH DIGIT FIVE
+ff16 FULLWIDTH DIGIT SIX
+ff17 FULLWIDTH DIGIT SEVEN
+ff18 FULLWIDTH DIGIT EIGHT
+ff19 FULLWIDTH DIGIT NINE
+ff1a FULLWIDTH COLON
+ff1b FULLWIDTH SEMICOLON
+ff1c FULLWIDTH LESS-THAN SIGN
+ff1d FULLWIDTH EQUALS SIGN
+ff1e FULLWIDTH GREATER-THAN SIGN
+ff1f FULLWIDTH QUESTION MARK
+ff20 FULLWIDTH COMMERCIAL AT
+ff21 FULLWIDTH LATIN CAPITAL LETTER A
+ff22 FULLWIDTH LATIN CAPITAL LETTER B
+ff23 FULLWIDTH LATIN CAPITAL LETTER C
+ff24 FULLWIDTH LATIN CAPITAL LETTER D
+ff25 FULLWIDTH LATIN CAPITAL LETTER E
+ff26 FULLWIDTH LATIN CAPITAL LETTER F
+ff27 FULLWIDTH LATIN CAPITAL LETTER G
+ff28 FULLWIDTH LATIN CAPITAL LETTER H
+ff29 FULLWIDTH LATIN CAPITAL LETTER I
+ff2a FULLWIDTH LATIN CAPITAL LETTER J
+ff2b FULLWIDTH LATIN CAPITAL LETTER K
+ff2c FULLWIDTH LATIN CAPITAL LETTER L
+ff2d FULLWIDTH LATIN CAPITAL LETTER M
+ff2e FULLWIDTH LATIN CAPITAL LETTER N
+ff2f FULLWIDTH LATIN CAPITAL LETTER O
+ff30 FULLWIDTH LATIN CAPITAL LETTER P
+ff31 FULLWIDTH LATIN CAPITAL LETTER Q
+ff32 FULLWIDTH LATIN CAPITAL LETTER R
+ff33 FULLWIDTH LATIN CAPITAL LETTER S
+ff34 FULLWIDTH LATIN CAPITAL LETTER T
+ff35 FULLWIDTH LATIN CAPITAL LETTER U
+ff36 FULLWIDTH LATIN CAPITAL LETTER V
+ff37 FULLWIDTH LATIN CAPITAL LETTER W
+ff38 FULLWIDTH LATIN CAPITAL LETTER X
+ff39 FULLWIDTH LATIN CAPITAL LETTER Y
+ff3a FULLWIDTH LATIN CAPITAL LETTER Z
+ff3b FULLWIDTH LEFT SQUARE BRACKET
+ff3c FULLWIDTH REVERSE SOLIDUS
+ff3d FULLWIDTH RIGHT SQUARE BRACKET
+ff3e FULLWIDTH CIRCUMFLEX ACCENT
+ff3f FULLWIDTH LOW LINE
+ff40 FULLWIDTH GRAVE ACCENT
+ff41 FULLWIDTH LATIN SMALL LETTER A
+ff42 FULLWIDTH LATIN SMALL LETTER B
+ff43 FULLWIDTH LATIN SMALL LETTER C
+ff44 FULLWIDTH LATIN SMALL LETTER D
+ff45 FULLWIDTH LATIN SMALL LETTER E
+ff46 FULLWIDTH LATIN SMALL LETTER F
+ff47 FULLWIDTH LATIN SMALL LETTER G
+ff48 FULLWIDTH LATIN SMALL LETTER H
+ff49 FULLWIDTH LATIN SMALL LETTER I
+ff4a FULLWIDTH LATIN SMALL LETTER J
+ff4b FULLWIDTH LATIN SMALL LETTER K
+ff4c FULLWIDTH LATIN SMALL LETTER L
+ff4d FULLWIDTH LATIN SMALL LETTER M
+ff4e FULLWIDTH LATIN SMALL LETTER N
+ff4f FULLWIDTH LATIN SMALL LETTER O
+ff50 FULLWIDTH LATIN SMALL LETTER P
+ff51 FULLWIDTH LATIN SMALL LETTER Q
+ff52 FULLWIDTH LATIN SMALL LETTER R
+ff53 FULLWIDTH LATIN SMALL LETTER S
+ff54 FULLWIDTH LATIN SMALL LETTER T
+ff55 FULLWIDTH LATIN SMALL LETTER U
+ff56 FULLWIDTH LATIN SMALL LETTER V
+ff57 FULLWIDTH LATIN SMALL LETTER W
+ff58 FULLWIDTH LATIN SMALL LETTER X
+ff59 FULLWIDTH LATIN SMALL LETTER Y
+ff5a FULLWIDTH LATIN SMALL LETTER Z
+ff5b FULLWIDTH LEFT CURLY BRACKET
+ff5c FULLWIDTH VERTICAL LINE
+ff5d FULLWIDTH RIGHT CURLY BRACKET
+ff5e FULLWIDTH TILDE
+ff61 HALFWIDTH IDEOGRAPHIC FULL STOP
+ff62 HALFWIDTH LEFT CORNER BRACKET
+ff63 HALFWIDTH RIGHT CORNER BRACKET
+ff64 HALFWIDTH IDEOGRAPHIC COMMA
+ff65 HALFWIDTH KATAKANA MIDDLE DOT
+ff66 HALFWIDTH KATAKANA LETTER WO
+ff67 HALFWIDTH KATAKANA LETTER SMALL A
+ff68 HALFWIDTH KATAKANA LETTER SMALL I
+ff69 HALFWIDTH KATAKANA LETTER SMALL U
+ff6a HALFWIDTH KATAKANA LETTER SMALL E
+ff6b HALFWIDTH KATAKANA LETTER SMALL O
+ff6c HALFWIDTH KATAKANA LETTER SMALL YA
+ff6d HALFWIDTH KATAKANA LETTER SMALL YU
+ff6e HALFWIDTH KATAKANA LETTER SMALL YO
+ff6f HALFWIDTH KATAKANA LETTER SMALL TU
+ff70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ff71 HALFWIDTH KATAKANA LETTER A
+ff72 HALFWIDTH KATAKANA LETTER I
+ff73 HALFWIDTH KATAKANA LETTER U
+ff74 HALFWIDTH KATAKANA LETTER E
+ff75 HALFWIDTH KATAKANA LETTER O
+ff76 HALFWIDTH KATAKANA LETTER KA
+ff77 HALFWIDTH KATAKANA LETTER KI
+ff78 HALFWIDTH KATAKANA LETTER KU
+ff79 HALFWIDTH KATAKANA LETTER KE
+ff7a HALFWIDTH KATAKANA LETTER KO
+ff7b HALFWIDTH KATAKANA LETTER SA
+ff7c HALFWIDTH KATAKANA LETTER SI
+ff7d HALFWIDTH KATAKANA LETTER SU
+ff7e HALFWIDTH KATAKANA LETTER SE
+ff7f HALFWIDTH KATAKANA LETTER SO
+ff80 HALFWIDTH KATAKANA LETTER TA
+ff81 HALFWIDTH KATAKANA LETTER TI
+ff82 HALFWIDTH KATAKANA LETTER TU
+ff83 HALFWIDTH KATAKANA LETTER TE
+ff84 HALFWIDTH KATAKANA LETTER TO
+ff85 HALFWIDTH KATAKANA LETTER NA
+ff86 HALFWIDTH KATAKANA LETTER NI
+ff87 HALFWIDTH KATAKANA LETTER NU
+ff88 HALFWIDTH KATAKANA LETTER NE
+ff89 HALFWIDTH KATAKANA LETTER NO
+ff8a HALFWIDTH KATAKANA LETTER HA
+ff8b HALFWIDTH KATAKANA LETTER HI
+ff8c HALFWIDTH KATAKANA LETTER HU
+ff8d HALFWIDTH KATAKANA LETTER HE
+ff8e HALFWIDTH KATAKANA LETTER HO
+ff8f HALFWIDTH KATAKANA LETTER MA
+ff90 HALFWIDTH KATAKANA LETTER MI
+ff91 HALFWIDTH KATAKANA LETTER MU
+ff92 HALFWIDTH KATAKANA LETTER ME
+ff93 HALFWIDTH KATAKANA LETTER MO
+ff94 HALFWIDTH KATAKANA LETTER YA
+ff95 HALFWIDTH KATAKANA LETTER YU
+ff96 HALFWIDTH KATAKANA LETTER YO
+ff97 HALFWIDTH KATAKANA LETTER RA
+ff98 HALFWIDTH KATAKANA LETTER RI
+ff99 HALFWIDTH KATAKANA LETTER RU
+ff9a HALFWIDTH KATAKANA LETTER RE
+ff9b HALFWIDTH KATAKANA LETTER RO
+ff9c HALFWIDTH KATAKANA LETTER WA
+ff9d HALFWIDTH KATAKANA LETTER N
+ff9e HALFWIDTH KATAKANA VOICED SOUND MARK
+ff9f HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+ffa0 HALFWIDTH HANGUL FILLER
+ffa1 HALFWIDTH HANGUL LETTER KIYEOK
+ffa2 HALFWIDTH HANGUL LETTER SSANGKIYEOK
+ffa3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+ffa4 HALFWIDTH HANGUL LETTER NIEUN
+ffa5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+ffa6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+ffa7 HALFWIDTH HANGUL LETTER TIKEUT
+ffa8 HALFWIDTH HANGUL LETTER SSANGTIKEUT
+ffa9 HALFWIDTH HANGUL LETTER RIEUL
+ffaa HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+ffab HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+ffac HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+ffad HALFWIDTH HANGUL LETTER RIEUL-SIOS
+ffae HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+ffaf HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+ffb0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+ffb1 HALFWIDTH HANGUL LETTER MIEUM
+ffb2 HALFWIDTH HANGUL LETTER PIEUP
+ffb3 HALFWIDTH HANGUL LETTER SSANGPIEUP
+ffb4 HALFWIDTH HANGUL LETTER PIEUP-SIOS
+ffb5 HALFWIDTH HANGUL LETTER SIOS
+ffb6 HALFWIDTH HANGUL LETTER SSANGSIOS
+ffb7 HALFWIDTH HANGUL LETTER IEUNG
+ffb8 HALFWIDTH HANGUL LETTER CIEUC
+ffb9 HALFWIDTH HANGUL LETTER SSANGCIEUC
+ffba HALFWIDTH HANGUL LETTER CHIEUCH
+ffbb HALFWIDTH HANGUL LETTER KHIEUKH
+ffbc HALFWIDTH HANGUL LETTER THIEUTH
+ffbd HALFWIDTH HANGUL LETTER PHIEUPH
+ffbe HALFWIDTH HANGUL LETTER HIEUH
+ffc2 HALFWIDTH HANGUL LETTER A
+ffc3 HALFWIDTH HANGUL LETTER AE
+ffc4 HALFWIDTH HANGUL LETTER YA
+ffc5 HALFWIDTH HANGUL LETTER YAE
+ffc6 HALFWIDTH HANGUL LETTER EO
+ffc7 HALFWIDTH HANGUL LETTER E
+ffca HALFWIDTH HANGUL LETTER YEO
+ffcb HALFWIDTH HANGUL LETTER YE
+ffcc HALFWIDTH HANGUL LETTER O
+ffcd HALFWIDTH HANGUL LETTER WA
+ffce HALFWIDTH HANGUL LETTER WAE
+ffcf HALFWIDTH HANGUL LETTER OE
+ffd2 HALFWIDTH HANGUL LETTER YO
+ffd3 HALFWIDTH HANGUL LETTER U
+ffd4 HALFWIDTH HANGUL LETTER WEO
+ffd5 HALFWIDTH HANGUL LETTER WE
+ffd6 HALFWIDTH HANGUL LETTER WI
+ffd7 HALFWIDTH HANGUL LETTER YU
+ffda HALFWIDTH HANGUL LETTER EU
+ffdb HALFWIDTH HANGUL LETTER YI
+ffdc HALFWIDTH HANGUL LETTER I
+ffe0 FULLWIDTH CENT SIGN
+ffe1 FULLWIDTH POUND SIGN
+ffe2 FULLWIDTH NOT SIGN
+ffe3 FULLWIDTH MACRON
+ffe4 FULLWIDTH BROKEN BAR
+ffe5 FULLWIDTH YEN SIGN
+ffe6 FULLWIDTH WON SIGN
+ffe8 HALFWIDTH FORMS LIGHT VERTICAL
+ffe9 HALFWIDTH LEFTWARDS ARROW
+ffea HALFWIDTH UPWARDS ARROW
+ffeb HALFWIDTH RIGHTWARDS ARROW
+ffec HALFWIDTH DOWNWARDS ARROW
+ffed HALFWIDTH BLACK SQUARE
+ffee HALFWIDTH WHITE CIRCLE
+fff9 INTERLINEAR ANNOTATION ANCHOR
+fffa INTERLINEAR ANNOTATION SEPARATOR
+fffb INTERLINEAR ANNOTATION TERMINATOR
+fffc OBJECT REPLACEMENT CHARACTER
+fffd REPLACEMENT CHARACTER
+END
diff --git a/contrib/perl5/lib/unicode/Names.txt b/contrib/perl5/lib/unicode/Names.txt
new file mode 100644
index 0000000..aa3dce0
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Names.txt
@@ -0,0 +1,17271 @@
+@@@ The Unicode Standard 3.0
+@@@+ Final Draft UC3M990825.lst
+ More annotation fixes for Tibetan.
+ Annotation added for 2231..2233.
+@@ 0000 C0 Controls and Basic Latin (Basic Latin) 007F
+@ C0 controls
+@+ Alias names are those for ISO 6429.
+0000 <control>
+ = NULL
+0001 <control>
+ = START OF HEADING
+0002 <control>
+ = START OF TEXT
+0003 <control>
+ = END OF TEXT
+0004 <control>
+ = END OF TRANSMISSION
+0005 <control>
+ = ENQUIRY
+0006 <control>
+ = ACKNOWLEDGE
+0007 <control>
+ = BELL
+0008 <control>
+ = BACKSPACE
+0009 <control>
+ = HORIZONTAL TABULATION
+000A <control>
+ = LINE FEED
+000B <control>
+ = VERTICAL TABULATION
+000C <control>
+ = FORM FEED
+000D <control>
+ = CARRIAGE RETURN
+000E <control>
+ = SHIFT OUT
+000F <control>
+ = SHIFT IN
+0010 <control>
+ = DATA LINK ESCAPE
+0011 <control>
+ = DEVICE CONTROL ONE
+0012 <control>
+ = DEVICE CONTROL TWO
+0013 <control>
+ = DEVICE CONTROL THREE
+0014 <control>
+ = DEVICE CONTROL FOUR
+0015 <control>
+ = NEGATIVE ACKNOWLEDGE
+0016 <control>
+ = SYNCHRONOUS IDLE
+0017 <control>
+ = END OF TRANSMISSION BLOCK
+0018 <control>
+ = CANCEL
+0019 <control>
+ = END OF MEDIUM
+001A <control>
+ = SUBSTITUTE
+ x (replacement character - FFFD)
+001B <control>
+ = ESCAPE
+001C <control>
+ = FILE SEPARATOR
+001D <control>
+ = GROUP SEPARATOR
+001E <control>
+ = RECORD SEPARATOR
+001F <control>
+ = UNIT SEPARATOR
+@ ASCII
+0020 SPACE
+ * sometimes considered a control code
+ * other space characters: 2000-200A
+ x (no-break space - 00A0)
+ x (zero width space - 200B)
+ x (ideographic space - 3000)
+ x (zero width no-break space - FEFF)
+0021 EXCLAMATION MARK
+ = factorial
+ = bang
+ x (inverted exclamation mark - 00A1)
+ x (latin letter retroflex click - 01C3)
+ x (double exclamation mark - 203C)
+ x (interrobang - 203D)
+ x (heavy exclamation mark ornament - 2762)
+0022 QUOTATION MARK
+ = APL quote
+ * neutral (vertical), used as opening or closing quotation mark
+ * preferred characters in English for paired quotation marks are 201C & 201D
+ x (modifier letter double prime - 02BA)
+ x (combining double acute accent - 030B)
+ x (combining double vertical line above - 030E)
+ x (double prime - 2033)
+ x (ditto mark - 3003)
+0023 NUMBER SIGN
+ = pound sign, hash, crosshatch, octothorpe
+0024 DOLLAR SIGN
+ = milreis, escudo
+ * glyph may have one or two vertical bars
+ * other currency symbol characters: 20A0-20AF
+ x (currency sign - 00A4)
+0025 PERCENT SIGN
+ x (arabic percent sign - 066A)
+ x (per mille sign - 2030)
+ x (per ten thousand sign - 2031)
+0026 AMPERSAND
+0027 APOSTROPHE
+ = APOSTROPHE-QUOTE
+ * neutral (vertical) glyph having mixed usage
+ * preferred character for apostrophe is 2019
+ * preferred characters in English for paired quotation marks are 2018 & 2019
+ x (modifier letter prime - 02B9)
+ x (modifier letter apostrophe - 02BC)
+ x (modifier letter vertical line - 02C8)
+ x (combining acute accent - 0301)
+ x (prime - 2032)
+0028 LEFT PARENTHESIS
+ = OPENING PARENTHESIS
+0029 RIGHT PARENTHESIS
+ = CLOSING PARENTHESIS
+ * see discussion on semantics of paired bracketing characters
+002A ASTERISK
+ = star (on phone keypads)
+ x (arabic five pointed star - 066D)
+ x (asterisk operator - 2217)
+ x (heavy asterisk - 2731)
+002B PLUS SIGN
+002C COMMA
+ = decimal separator
+ x (arabic comma - 060C)
+ x (single low-9 quotation mark - 201A)
+ x (ideographic comma - 3001)
+002D HYPHEN-MINUS
+ = hyphen or minus sign
+ * used for either hyphen or minus sign
+ x (hyphen - 2010)
+ x (non-breaking hyphen - 2011)
+ x (figure dash - 2012)
+ x (en dash - 2013)
+ x (minus sign - 2212)
+002E FULL STOP
+ = PERIOD
+ = dot, decimal point
+ * may be rendered as a raised decimal point in old style numbers
+ x (arabic full stop - 06D4)
+ x (ideographic full stop - 3002)
+002F SOLIDUS
+ = SLASH
+ = virgule, shilling (British)
+ x (latin letter dental click - 01C0)
+ x (combining long solidus overlay - 0338)
+ x (fraction slash - 2044)
+ x (division slash - 2215)
+0030 DIGIT ZERO
+0031 DIGIT ONE
+0032 DIGIT TWO
+0033 DIGIT THREE
+0034 DIGIT FOUR
+0035 DIGIT FIVE
+0036 DIGIT SIX
+0037 DIGIT SEVEN
+0038 DIGIT EIGHT
+0039 DIGIT NINE
+003A COLON
+ x (armenian full stop - 0589)
+ x (ratio - 2236)
+003B SEMICOLON
+ x (greek question mark - 037E)
+ x (arabic semicolon - 061B)
+003C LESS-THAN SIGN
+ x (single left-pointing angle quotation mark - 2039)
+ x (left-pointing angle bracket - 2329)
+ x (left angle bracket - 3008)
+003D EQUALS SIGN
+ * other related characters: 2241-2263
+ x (not equal to - 2260)
+ x (identical to - 2261)
+003E GREATER-THAN SIGN
+ x (single right-pointing angle quotation mark - 203A)
+ x (right-pointing angle bracket - 232A)
+ x (right angle bracket - 3009)
+003F QUESTION MARK
+ x (inverted question mark - 00BF)
+ x (greek question mark - 037E)
+ x (arabic question mark - 061F)
+ x (interrobang - 203D)
+ x (question exclamation mark - 2048)
+ x (exclamation question mark - 2049)
+0040 COMMERCIAL AT
+0041 LATIN CAPITAL LETTER A
+0042 LATIN CAPITAL LETTER B
+ x (script capital b - 212C)
+0043 LATIN CAPITAL LETTER C
+ x (double-struck capital c - 2102)
+ x (black-letter capital c - 212D)
+0044 LATIN CAPITAL LETTER D
+0045 LATIN CAPITAL LETTER E
+ x (euler constant - 2107)
+ x (script capital e - 2130)
+0046 LATIN CAPITAL LETTER F
+ x (script capital f - 2131)
+ x (turned capital f - 2132)
+0047 LATIN CAPITAL LETTER G
+0048 LATIN CAPITAL LETTER H
+ x (script capital h - 210B)
+ x (black-letter capital h - 210C)
+ x (double-struck capital h - 210D)
+0049 LATIN CAPITAL LETTER I
+ * Turkish and Azerbaijani use 0131 for lowercase
+ x (latin capital letter i with dot above - 0130)
+ x (cyrillic capital letter byelorussian-ukrainian i - 0406)
+ x (cyrillic letter palochka - 04C0)
+ x (script capital i - 2110)
+ x (black-letter capital i - 2111)
+ x (roman numeral one - 2160)
+004A LATIN CAPITAL LETTER J
+004B LATIN CAPITAL LETTER K
+ x (kelvin sign - 212A)
+004C LATIN CAPITAL LETTER L
+ x (script capital l - 2112)
+004D LATIN CAPITAL LETTER M
+ x (script capital m - 2133)
+004E LATIN CAPITAL LETTER N
+ x (double-struck capital n - 2115)
+004F LATIN CAPITAL LETTER O
+0050 LATIN CAPITAL LETTER P
+ x (double-struck capital p - 2119)
+0051 LATIN CAPITAL LETTER Q
+ x (double-struck capital q - 211A)
+0052 LATIN CAPITAL LETTER R
+ x (script capital r - 211B)
+ x (black-letter capital r - 211C)
+ x (double-struck capital r - 211D)
+0053 LATIN CAPITAL LETTER S
+0054 LATIN CAPITAL LETTER T
+0055 LATIN CAPITAL LETTER U
+0056 LATIN CAPITAL LETTER V
+0057 LATIN CAPITAL LETTER W
+0058 LATIN CAPITAL LETTER X
+0059 LATIN CAPITAL LETTER Y
+005A LATIN CAPITAL LETTER Z
+ x (double-struck capital z - 2124)
+ x (black-letter capital z - 2128)
+005B LEFT SQUARE BRACKET
+ = OPENING SQUARE BRACKET
+ * other bracket characters: 3008-301B
+005C REVERSE SOLIDUS
+ = BACKSLASH
+ x (set minus - 2216)
+005D RIGHT SQUARE BRACKET
+ = CLOSING SQUARE BRACKET
+005E CIRCUMFLEX ACCENT
+ * this is a spacing character
+ x (modifier letter up arrowhead - 02C4)
+ x (modifier letter circumflex accent - 02C6)
+ x (combining circumflex accent - 0302)
+ x (up arrowhead - 2303)
+005F LOW LINE
+ = SPACING UNDERSCORE
+ * this is a spacing character
+ x (modifier letter low macron - 02CD)
+ x (combining macron below - 0331)
+ x (combining low line - 0332)
+ x (double low line - 2017)
+0060 GRAVE ACCENT
+ * this is a spacing character
+ x (modifier letter grave accent - 02CB)
+ x (combining grave accent - 0300)
+ x (reversed prime - 2035)
+0061 LATIN SMALL LETTER A
+0062 LATIN SMALL LETTER B
+0063 LATIN SMALL LETTER C
+0064 LATIN SMALL LETTER D
+0065 LATIN SMALL LETTER E
+ x (estimated symbol - 212E)
+ x (script small e - 212F)
+0066 LATIN SMALL LETTER F
+0067 LATIN SMALL LETTER G
+ x (latin small letter script g - 0261)
+ x (script small g - 210A)
+0068 LATIN SMALL LETTER H
+ x (cyrillic small letter shha - 04BB)
+ x (planck constant - 210E)
+0069 LATIN SMALL LETTER I
+ * Turkish and Azerbaijani use 0130 for uppercase
+ x (latin small letter dotless i - 0131)
+006A LATIN SMALL LETTER J
+006B LATIN SMALL LETTER K
+006C LATIN SMALL LETTER L
+ x (script small l - 2113)
+006D LATIN SMALL LETTER M
+006E LATIN SMALL LETTER N
+ x (superscript latin small letter n - 207F)
+006F LATIN SMALL LETTER O
+ x (script small o - 2134)
+0070 LATIN SMALL LETTER P
+0071 LATIN SMALL LETTER Q
+0072 LATIN SMALL LETTER R
+0073 LATIN SMALL LETTER S
+0074 LATIN SMALL LETTER T
+0075 LATIN SMALL LETTER U
+0076 LATIN SMALL LETTER V
+0077 LATIN SMALL LETTER W
+0078 LATIN SMALL LETTER X
+0079 LATIN SMALL LETTER Y
+007A LATIN SMALL LETTER Z
+ x (latin small letter z with stroke - 01B6)
+007B LEFT CURLY BRACKET
+ = OPENING CURLY BRACKET
+ = opening brace
+007C VERTICAL LINE
+ = VERTICAL BAR
+ * used in pairs to indicate absolute value
+ x (latin letter dental click - 01C0)
+ x (divides - 2223)
+ x (light vertical bar - 2758)
+007D RIGHT CURLY BRACKET
+ = CLOSING CURLY BRACKET
+ = closing brace
+007E TILDE
+ * this is a spacing character
+ x (small tilde - 02DC)
+ x (combining tilde - 0303)
+ x (tilde operator - 223C)
+ x (fullwidth tilde - FF5E)
+007F <control>
+ = DELETE
+@@ 0080 C1 Controls and Latin-1 Supplement (Latin-1 Supplement) 00FF
+@ C1 controls
+@+ Alias names are those for ISO 6429.
+0080 <control>
+0081 <control>
+0082 <control>
+ = BREAK PERMITTED HERE
+0083 <control>
+ = NO BREAK HERE
+0084 <control>
+ = INDEX
+0085 <control>
+ = NEXT LINE
+0086 <control>
+ = START OF SELECTED AREA
+0087 <control>
+ = END OF SELECTED AREA
+0088 <control>
+ = CHARACTER TABULATION SET
+0089 <control>
+ = CHARACTER TABULATION WITH JUSTIFICATION
+008A <control>
+ = LINE TABULATION SET
+008B <control>
+ = PARTIAL LINE DOWN
+008C <control>
+ = PARTIAL LINE UP
+008D <control>
+ = REVERSE LINE FEED
+008E <control>
+ = SINGLE SHIFT TWO
+008F <control>
+ = SINGLE SHIFT THREE
+0090 <control>
+ = DEVICE CONTROL STRING
+0091 <control>
+ = PRIVATE USE ONE
+0092 <control>
+ = PRIVATE USE TWO
+0093 <control>
+ = SET TRANSMIT STATE
+0094 <control>
+ = CANCEL CHARACTER
+0095 <control>
+ = MESSAGE WAITING
+0096 <control>
+ = START OF GUARDED AREA
+0097 <control>
+ = END OF GUARDED AREA
+0098 <control>
+ = START OF STRING
+0099 <control>
+009A <control>
+ = SINGLE CHARACTER INTRODUCER
+009B <control>
+ = CONTROL SEQUENCE INTRODUCER
+009C <control>
+ = STRING TERMINATOR
+009D <control>
+ = OPERATING SYSTEM COMMAND
+009E <control>
+ = PRIVACY MESSAGE
+009F <control>
+ = APPLICATION PROGRAM COMMAND
+@ ISO 8859-1 (aka Latin-1)
+00A0 NO-BREAK SPACE
+ x (space - 0020)
+ x (figure space - 2007)
+ x (narrow no-break space - 202F)
+ x (zero width no-break space - FEFF)
+ # <noBreak> 0020
+00A1 INVERTED EXCLAMATION MARK
+ * Spanish, Asturian, Galician
+ x (exclamation mark - 0021)
+00A2 CENT SIGN
+00A3 POUND SIGN
+ = pound sterling, Irish punt
+ x (lira sign - 20A4)
+00A4 CURRENCY SIGN
+ * other currency symbol characters: 20A0-20AF
+ x (dollar sign - 0024)
+00A5 YEN SIGN
+ = yuan sign
+ * glyph may have one or two crossbars
+00A6 BROKEN BAR
+ = BROKEN VERTICAL BAR
+ = parted rule (in typography)
+00A7 SECTION SIGN
+ * paragraph sign in some European usage
+00A8 DIAERESIS
+ * this is a spacing character
+ x (combining diaeresis - 0308)
+ # 0020 0308
+00A9 COPYRIGHT SIGN
+ x (sound recording copyright - 2117)
+00AA FEMININE ORDINAL INDICATOR
+ * Spanish
+ # <super> 0061
+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK *
+ = LEFT POINTING GUILLEMET
+ = chevrons (in typography)
+ * usually opening, sometimes closing
+ x (much less-than - 226A)
+ x (left double angle bracket - 300A)
+00AC NOT SIGN
+ = angled dash (in typography)
+ x (reversed not sign - 2310)
+00AD SOFT HYPHEN
+ = discretionary hyphen
+ x (mongolian todo soft hyphen - 1806)
+00AE REGISTERED SIGN
+ = REGISTERED TRADE MARK SIGN
+00AF MACRON
+ = overline, APL overbar
+ * this is a spacing character
+ x (modifier letter macron - 02C9)
+ x (combining macron - 0304)
+ x (combining overline - 0305)
+ # 0020 0304
+00B0 DEGREE SIGN
+ * this is a spacing character
+ x (ring above - 02DA)
+ x (combining ring above - 030A)
+ x (superscript zero - 2070)
+ x (ring operator - 2218)
+00B1 PLUS-MINUS SIGN
+ x (minus-or-plus sign - 2213)
+00B2 SUPERSCRIPT TWO
+ = squared
+ * other superscript digit characters: 2070-2079
+ x (superscript one - 00B9)
+ # <super> 0032
+00B3 SUPERSCRIPT THREE
+ = cubed
+ x (superscript one - 00B9)
+ # <super> 0033
+00B4 ACUTE ACCENT
+ * this is a spacing character
+ x (modifier letter prime - 02B9)
+ x (modifier letter acute accent - 02CA)
+ x (combining acute accent - 0301)
+ x (prime - 2032)
+ # 0020 0301
+00B5 MICRO SIGN
+ # 03BC greek small letter mu
+00B6 PILCROW SIGN
+ = PARAGRAPH SIGN
+ * section sign in some European usage
+ x (reversed pilcrow sign - 204B)
+ x (curved stem paragraph sign ornament - 2761)
+00B7 MIDDLE DOT
+ = midpoint (in typography)
+ = Georgian comma
+ = Greek middle dot
+ x (bullet - 2022)
+ x (one dot leader - 2024)
+ x (hyphenation point - 2027)
+ x (bullet operator - 2219)
+ x (dot operator - 22C5)
+ x (katakana middle dot - 30FB)
+00B8 CEDILLA
+ * this is a spacing character
+ * other spacing accent characters: 02D8-02DB
+ x (combining cedilla - 0327)
+ # 0020 0327
+00B9 SUPERSCRIPT ONE
+ x (superscript two - 00B2)
+ x (superscript three - 00B3)
+ # <super> 0031
+00BA MASCULINE ORDINAL INDICATOR
+ * Spanish
+ # <super> 006F
+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK *
+ = RIGHT POINTING GUILLEMET
+ * usually closing, sometimes opening
+ x (much greater-than - 226B)
+ x (right double angle bracket - 300B)
+00BC VULGAR FRACTION ONE QUARTER
+ * bar may be horizontal or slanted
+ * other fraction characters: 2153-215E
+ # 0031 2044 0034
+00BD VULGAR FRACTION ONE HALF
+ * bar may be horizontal or slanted
+ # 0031 2044 0032
+00BE VULGAR FRACTION THREE QUARTERS
+ * bar may be horizontal or slanted
+ # 0033 2044 0034
+00BF INVERTED QUESTION MARK
+ = turned question mark
+ * Spanish
+ x (question mark - 003F)
+00C0 LATIN CAPITAL LETTER A WITH GRAVE
+ : 0041 0300
+00C1 LATIN CAPITAL LETTER A WITH ACUTE
+ : 0041 0301
+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ : 0041 0302
+00C3 LATIN CAPITAL LETTER A WITH TILDE
+ : 0041 0303
+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+ : 0041 0308
+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+ x (angstrom sign - 212B)
+ : 0041 030A
+00C6 LATIN CAPITAL LETTER AE (ash) *
+ = LATIN CAPITAL LIGATURE AE
+00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+ : 0043 0327
+00C8 LATIN CAPITAL LETTER E WITH GRAVE
+ : 0045 0300
+00C9 LATIN CAPITAL LETTER E WITH ACUTE
+ : 0045 0301
+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ : 0045 0302
+00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+ : 0045 0308
+00CC LATIN CAPITAL LETTER I WITH GRAVE
+ : 0049 0300
+00CD LATIN CAPITAL LETTER I WITH ACUTE
+ : 0049 0301
+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ : 0049 0302
+00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+ : 0049 0308
+00D0 LATIN CAPITAL LETTER ETH (Icelandic)
+ x (latin small letter eth - 00F0)
+ x (latin capital letter d with stroke - 0110)
+ x (latin capital letter african d - 0189)
+00D1 LATIN CAPITAL LETTER N WITH TILDE
+ : 004E 0303
+00D2 LATIN CAPITAL LETTER O WITH GRAVE
+ : 004F 0300
+00D3 LATIN CAPITAL LETTER O WITH ACUTE
+ : 004F 0301
+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ : 004F 0302
+00D5 LATIN CAPITAL LETTER O WITH TILDE
+ : 004F 0303
+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+ : 004F 0308
+00D7 MULTIPLICATION SIGN
+ = z notation Cartesian product
+00D8 LATIN CAPITAL LETTER O WITH STROKE
+ = LATIN CAPITAL LETTER O SLASH
+ x (empty set - 2205)
+00D9 LATIN CAPITAL LETTER U WITH GRAVE
+ : 0055 0300
+00DA LATIN CAPITAL LETTER U WITH ACUTE
+ : 0055 0301
+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ : 0055 0302
+00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+ : 0055 0308
+00DD LATIN CAPITAL LETTER Y WITH ACUTE
+ : 0059 0301
+00DE LATIN CAPITAL LETTER THORN (Icelandic)
+00DF LATIN SMALL LETTER SHARP S (German)
+ = Eszett
+ * German
+ * uppercase is "SS"
+ * in origin a ligature of 017F and 0073
+ x (greek small letter beta - 03B2)
+00E0 LATIN SMALL LETTER A WITH GRAVE
+ : 0061 0300
+00E1 LATIN SMALL LETTER A WITH ACUTE
+ : 0061 0301
+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+ : 0061 0302
+00E3 LATIN SMALL LETTER A WITH TILDE
+ * Portuguese
+ : 0061 0303
+00E4 LATIN SMALL LETTER A WITH DIAERESIS
+ : 0061 0308
+00E5 LATIN SMALL LETTER A WITH RING ABOVE
+ * Danish, Norwegian, Swedish, Walloon
+ : 0061 030A
+00E6 LATIN SMALL LETTER AE (ash) *
+ = LATIN SMALL LIGATURE AE
+ = ash (from Old English æsc)
+ * Danish, Norwegian, Icelandic, Faroese, Old English, French, IPA
+ x (latin small ligature oe - 0153)
+ x (cyrillic small ligature a ie - 04D5)
+00E7 LATIN SMALL LETTER C WITH CEDILLA
+ : 0063 0327
+00E8 LATIN SMALL LETTER E WITH GRAVE
+ : 0065 0300
+00E9 LATIN SMALL LETTER E WITH ACUTE
+ : 0065 0301
+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+ : 0065 0302
+00EB LATIN SMALL LETTER E WITH DIAERESIS
+ : 0065 0308
+00EC LATIN SMALL LETTER I WITH GRAVE
+ * Italian, Malagasy
+ : 0069 0300
+00ED LATIN SMALL LETTER I WITH ACUTE
+ : 0069 0301
+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+ : 0069 0302
+00EF LATIN SMALL LETTER I WITH DIAERESIS
+ : 0069 0308
+00F0 LATIN SMALL LETTER ETH (Icelandic)
+ * Icelandic, Faroese, Old English, IPA
+ x (latin capital letter eth - 00D0)
+ x (greek small letter delta - 03B4)
+ x (partial differential - 2202)
+00F1 LATIN SMALL LETTER N WITH TILDE
+ : 006E 0303
+00F2 LATIN SMALL LETTER O WITH GRAVE
+ : 006F 0300
+00F3 LATIN SMALL LETTER O WITH ACUTE
+ : 006F 0301
+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+ : 006F 0302
+00F5 LATIN SMALL LETTER O WITH TILDE
+ * Portuguese, Estonian
+ : 006F 0303
+00F6 LATIN SMALL LETTER O WITH DIAERESIS
+ : 006F 0308
+00F7 DIVISION SIGN
+00F8 LATIN SMALL LETTER O WITH STROKE
+ = LATIN SMALL LETTER O SLASH
+ * Danish, Norwegian, Faroese, IPA
+00F9 LATIN SMALL LETTER U WITH GRAVE
+ * French, Italian
+ : 0075 0300
+00FA LATIN SMALL LETTER U WITH ACUTE
+ : 0075 0301
+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+ : 0075 0302
+00FC LATIN SMALL LETTER U WITH DIAERESIS
+ : 0075 0308
+00FD LATIN SMALL LETTER Y WITH ACUTE
+ * Czech, Slovak, Icelandic, Faroese, Welsh, Malagasy
+ : 0079 0301
+00FE LATIN SMALL LETTER THORN (Icelandic)
+ * Icelandic, Old English, phonetics
+ * Runic letter borrowed into Latin script
+ x (runic letter thurisaz thurs thorn - 16A6)
+00FF LATIN SMALL LETTER Y WITH DIAERESIS
+ * French
+ x (latin capital letter y with diaeresis - 0178)
+ : 0079 0308
+@@ 0100 Latin Extended-A 017F
+@ European Latin
+0100 LATIN CAPITAL LETTER A WITH MACRON
+ : 0041 0304
+0101 LATIN SMALL LETTER A WITH MACRON
+ * Latvian, Latin, ...
+ : 0061 0304
+0102 LATIN CAPITAL LETTER A WITH BREVE
+ : 0041 0306
+0103 LATIN SMALL LETTER A WITH BREVE
+ * Romanian, Vietnamese, Latin, ...
+ : 0061 0306
+0104 LATIN CAPITAL LETTER A WITH OGONEK
+ : 0041 0328
+0105 LATIN SMALL LETTER A WITH OGONEK
+ * Polish, Lithuanian, ...
+ : 0061 0328
+0106 LATIN CAPITAL LETTER C WITH ACUTE
+ : 0043 0301
+0107 LATIN SMALL LETTER C WITH ACUTE
+ * Polish, Croatian, ...
+ x (cyrillic small letter tshe - 045B)
+ : 0063 0301
+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ : 0043 0302
+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX
+ * Esperanto
+ : 0063 0302
+010A LATIN CAPITAL LETTER C WITH DOT ABOVE
+ : 0043 0307
+010B LATIN SMALL LETTER C WITH DOT ABOVE
+ * Maltese, Irish Gaelic (old orthography)
+ : 0063 0307
+010C LATIN CAPITAL LETTER C WITH CARON
+ : 0043 030C
+010D LATIN SMALL LETTER C WITH CARON
+ * Czech, Slovak, Slovenian, and many other languages
+ : 0063 030C
+010E LATIN CAPITAL LETTER D WITH CARON
+ * the form using caron/hacek is preferred in all contexts
+ : 0044 030C
+010F LATIN SMALL LETTER D WITH CARON
+ * Czech, Slovak
+ * the form using apostrophe is preferred in typesetting
+ : 0064 030C
+0110 LATIN CAPITAL LETTER D WITH STROKE
+ x (latin capital letter eth - 00D0)
+ x (latin small letter d with stroke - 0111)
+ x (latin capital letter african d - 0189)
+0111 LATIN SMALL LETTER D WITH STROKE
+ * Croatian, Vietnamese, Sámi
+ x (latin capital letter d with stroke - 0110)
+ x (cyrillic small letter dje - 0452)
+0112 LATIN CAPITAL LETTER E WITH MACRON
+ : 0045 0304
+0113 LATIN SMALL LETTER E WITH MACRON
+ * Latvian, Latin, ...
+ : 0065 0304
+0114 LATIN CAPITAL LETTER E WITH BREVE
+ : 0045 0306
+0115 LATIN SMALL LETTER E WITH BREVE
+ * Malay, Latin, ...
+ : 0065 0306
+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+ : 0045 0307
+0117 LATIN SMALL LETTER E WITH DOT ABOVE
+ * Lithuanian
+ : 0065 0307
+0118 LATIN CAPITAL LETTER E WITH OGONEK
+ : 0045 0328
+0119 LATIN SMALL LETTER E WITH OGONEK
+ * Polish, Lithuanian, ...
+ : 0065 0328
+011A LATIN CAPITAL LETTER E WITH CARON
+ : 0045 030C
+011B LATIN SMALL LETTER E WITH CARON
+ * Czech, ...
+ : 0065 030C
+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ : 0047 0302
+011D LATIN SMALL LETTER G WITH CIRCUMFLEX
+ * Esperanto
+ : 0067 0302
+011E LATIN CAPITAL LETTER G WITH BREVE
+ : 0047 0306
+011F LATIN SMALL LETTER G WITH BREVE
+ * Turkish, Azerbaijani
+ x (latin small letter g with caron - 01E7)
+ : 0067 0306
+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
+ : 0047 0307
+0121 LATIN SMALL LETTER G WITH DOT ABOVE
+ * Maltese, Irish Gaelic (old orthography)
+ : 0067 0307
+0122 LATIN CAPITAL LETTER G WITH CEDILLA
+ : 0047 0327
+0123 LATIN SMALL LETTER G WITH CEDILLA
+ * Latvian
+ * there are three major glyph variants
+ : 0067 0327
+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ : 0048 0302
+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX
+ * Esperanto
+ : 0068 0302
+0126 LATIN CAPITAL LETTER H WITH STROKE
+0127 LATIN SMALL LETTER H WITH STROKE
+ * Maltese, IPA, ...
+ x (cyrillic small letter tshe - 045B)
+ x (planck constant over two pi - 210F)
+0128 LATIN CAPITAL LETTER I WITH TILDE
+ : 0049 0303
+0129 LATIN SMALL LETTER I WITH TILDE
+ * Greenlandic (old orthography)
+ : 0069 0303
+012A LATIN CAPITAL LETTER I WITH MACRON
+ : 0049 0304
+012B LATIN SMALL LETTER I WITH MACRON
+ * Latvian, Latin, ...
+ : 0069 0304
+012C LATIN CAPITAL LETTER I WITH BREVE
+ : 0049 0306
+012D LATIN SMALL LETTER I WITH BREVE
+ * Latin, ...
+ : 0069 0306
+012E LATIN CAPITAL LETTER I WITH OGONEK
+ : 0049 0328
+012F LATIN SMALL LETTER I WITH OGONEK
+ * Lithuanian, ...
+ : 0069 0328
+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+ = LATIN CAPITAL LETTER I DOT
+ * Turkish, Azerbaijani
+ * lowercase is 0069
+ x (latin capital letter i - 0049)
+ : 0049 0307
+0131 LATIN SMALL LETTER DOTLESS I
+ * Turkish, Azerbaijani
+ * uppercase is 0049
+ x (latin small letter i - 0069)
+0132 LATIN CAPITAL LIGATURE IJ
+ # 0049 004A
+0133 LATIN SMALL LIGATURE IJ
+ * Dutch
+ # 0069 006A
+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ : 004A 0302
+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX
+ * Esperanto
+ : 006A 0302
+0136 LATIN CAPITAL LETTER K WITH CEDILLA
+ : 004B 0327
+0137 LATIN SMALL LETTER K WITH CEDILLA
+ * Latvian
+ : 006B 0327
+0138 LATIN SMALL LETTER KRA (Greenlandic)
+ * Greenlandic (old orthography)
+0139 LATIN CAPITAL LETTER L WITH ACUTE
+ : 004C 0301
+013A LATIN SMALL LETTER L WITH ACUTE
+ * Slovak
+ : 006C 0301
+013B LATIN CAPITAL LETTER L WITH CEDILLA
+ : 004C 0327
+013C LATIN SMALL LETTER L WITH CEDILLA
+ * Latvian
+ : 006C 0327
+013D LATIN CAPITAL LETTER L WITH CARON
+ : 004C 030C
+013E LATIN SMALL LETTER L WITH CARON
+ * Slovak
+ * the form using apostrophe is preferred in typesetting
+ : 006C 030C
+013F LATIN CAPITAL LETTER L WITH MIDDLE DOT
+ * some fonts show the middle dot inside the L, but the preferred form has the dot following the L
+ # 004C 00B7
+0140 LATIN SMALL LETTER L WITH MIDDLE DOT
+ * Catalan
+ # 006C 00B7
+0141 LATIN CAPITAL LETTER L WITH STROKE
+0142 LATIN SMALL LETTER L WITH STROKE
+ * Polish, ...
+ x (latin small letter l with bar - 019A)
+0143 LATIN CAPITAL LETTER N WITH ACUTE
+ : 004E 0301
+0144 LATIN SMALL LETTER N WITH ACUTE
+ * Polish, ...
+ : 006E 0301
+0145 LATIN CAPITAL LETTER N WITH CEDILLA
+ : 004E 0327
+0146 LATIN SMALL LETTER N WITH CEDILLA
+ * Latvian
+ : 006E 0327
+0147 LATIN CAPITAL LETTER N WITH CARON
+ : 004E 030C
+0148 LATIN SMALL LETTER N WITH CARON
+ * Czech, Slovak
+ : 006E 030C
+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ = LATIN SMALL LETTER APOSTROPHE N
+ * Afrikaans
+ * this is not actually a single letter
+ # 02BC 006E
+014A LATIN CAPITAL LETTER ENG (Sami)
+ * glyph may also have appearance of large form of the small letter
+014B LATIN SMALL LETTER ENG (Sami)
+ * Sámi, Mende, IPA, ...
+014C LATIN CAPITAL LETTER O WITH MACRON
+ : 004F 0304
+014D LATIN SMALL LETTER O WITH MACRON
+ * Latvian, Latin, ...
+ : 006F 0304
+014E LATIN CAPITAL LETTER O WITH BREVE
+ : 004F 0306
+014F LATIN SMALL LETTER O WITH BREVE
+ * Latin
+ : 006F 0306
+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ : 004F 030B
+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ * Hungarian
+ : 006F 030B
+0152 LATIN CAPITAL LIGATURE OE
+0153 LATIN SMALL LIGATURE OE
+ = LATIN SMALL LETTER O E
+ = ethel (from Old English eðel)
+ * French, IPA, Old Icelandic, Old English, ...
+ x (latin small letter ae - 00E6)
+ x (latin letter small capital oe - 0276)
+0154 LATIN CAPITAL LETTER R WITH ACUTE
+ : 0052 0301
+0155 LATIN SMALL LETTER R WITH ACUTE
+ * Slovak, ...
+ : 0072 0301
+0156 LATIN CAPITAL LETTER R WITH CEDILLA
+ : 0052 0327
+0157 LATIN SMALL LETTER R WITH CEDILLA
+ * Latvian
+ : 0072 0327
+0158 LATIN CAPITAL LETTER R WITH CARON
+ : 0052 030C
+0159 LATIN SMALL LETTER R WITH CARON
+ * Czech, ...
+ : 0072 030C
+015A LATIN CAPITAL LETTER S WITH ACUTE
+ : 0053 0301
+015B LATIN SMALL LETTER S WITH ACUTE
+ * Polish, Indic transliteration, ...
+ : 0073 0301
+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ : 0053 0302
+015D LATIN SMALL LETTER S WITH CIRCUMFLEX
+ * Esperanto
+ : 0073 0302
+015E LATIN CAPITAL LETTER S WITH CEDILLA *
+ : 0053 0327
+015F LATIN SMALL LETTER S WITH CEDILLA *
+ * Turkish, Azerbaijani, Romanian, ...
+ * this character is used in both Turkish and Romanian data
+ * a glyph variant with comma below is preferred for Romanian
+ x (latin small letter s with comma below - 0219)
+ : 0073 0327
+0160 LATIN CAPITAL LETTER S WITH CARON
+ : 0053 030C
+0161 LATIN SMALL LETTER S WITH CARON
+ * Czech, Estonian, Finnish, Slovak, and many other languages
+ : 0073 030C
+0162 LATIN CAPITAL LETTER T WITH CEDILLA *
+ : 0054 0327
+0163 LATIN SMALL LETTER T WITH CEDILLA *
+ * Romanian, Semitic transliteration, ...
+ * this character is used in Romanian data
+ * a glyph variant with comma below is preferred for Romanian
+ x (latin small letter t with comma below - 021B)
+ : 0074 0327
+0164 LATIN CAPITAL LETTER T WITH CARON
+ * the form using caron/hacek is preferred in all contexts
+ : 0054 030C
+0165 LATIN SMALL LETTER T WITH CARON
+ * Czech, Slovak
+ * the form using apostrophe is preferred in typesetting
+ : 0074 030C
+0166 LATIN CAPITAL LETTER T WITH STROKE
+0167 LATIN SMALL LETTER T WITH STROKE
+ * Sámi
+0168 LATIN CAPITAL LETTER U WITH TILDE
+ : 0055 0303
+0169 LATIN SMALL LETTER U WITH TILDE
+ * Greenlandic (old orthography)
+ : 0075 0303
+016A LATIN CAPITAL LETTER U WITH MACRON
+ : 0055 0304
+016B LATIN SMALL LETTER U WITH MACRON
+ * Latvian, Lithuanian, Latin, ...
+ : 0075 0304
+016C LATIN CAPITAL LETTER U WITH BREVE
+ : 0055 0306
+016D LATIN SMALL LETTER U WITH BREVE
+ * Latin, Esperanto, ...
+ : 0075 0306
+016E LATIN CAPITAL LETTER U WITH RING ABOVE
+ : 0055 030A
+016F LATIN SMALL LETTER U WITH RING ABOVE
+ * Czech, ...
+ : 0075 030A
+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ : 0055 030B
+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ * Hungarian
+ : 0075 030B
+0172 LATIN CAPITAL LETTER U WITH OGONEK
+ : 0055 0328
+0173 LATIN SMALL LETTER U WITH OGONEK
+ * Lithuanian
+ : 0075 0328
+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ : 0057 0302
+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX
+ * Welsh
+ : 0077 0302
+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ : 0059 0302
+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX
+ * Welsh
+ : 0079 0302
+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+ * French, Igbo
+ x (latin small letter y with diaeresis - 00FF)
+ : 0059 0308
+0179 LATIN CAPITAL LETTER Z WITH ACUTE
+ : 005A 0301
+017A LATIN SMALL LETTER Z WITH ACUTE
+ * Polish, ...
+ : 007A 0301
+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ : 005A 0307
+017C LATIN SMALL LETTER Z WITH DOT ABOVE
+ * Polish, ...
+ : 007A 0307
+017D LATIN CAPITAL LETTER Z WITH CARON
+ : 005A 030C
+017E LATIN SMALL LETTER Z WITH CARON
+ * Czech, Estonian, Finnish, Slovak, Slovenian, and many other languages
+ : 007A 030C
+017F LATIN SMALL LETTER LONG S
+ * in common use in Roman types until the 18th century
+ * in current use in Fraktur and Gaelic types
+ # 0073 latin small letter s
+@@ 0180 Latin Extended-B 024F
+@ Latin extended-B
+0180 LATIN SMALL LETTER B WITH STROKE
+ * Americanist and Indo-Europeanist usage for phonetic beta
+ * Old Saxon
+ x (greek small letter beta - 03B2)
+ x (blank symbol - 2422)
+0181 LATIN CAPITAL LETTER B WITH HOOK
+ * Zulu, Pan-Nigerian alphabet
+ x (latin small letter b with hook - 0253)
+0182 LATIN CAPITAL LETTER B WITH TOPBAR
+0183 LATIN SMALL LETTER B WITH TOPBAR
+ * Zhuang
+ * former Soviet minority language scripts
+ x (cyrillic capital letter be - 0411)
+0184 LATIN CAPITAL LETTER TONE SIX
+0185 LATIN SMALL LETTER TONE SIX
+ * Zhuang
+ * Zhuang tone three is Cyrillic ze
+ * Zhuang tone four is Cyrillic che
+ x (latin small letter tone two - 01A8)
+ x (latin small letter tone five - 01BD)
+ x (cyrillic small letter ze - 0437)
+ x (cyrillic small letter che - 0447)
+ x (cyrillic small letter soft sign - 044C)
+0186 LATIN CAPITAL LETTER OPEN O
+ * typographically a turned C
+ x (latin small letter open o - 0254)
+0187 LATIN CAPITAL LETTER C WITH HOOK
+0188 LATIN SMALL LETTER C WITH HOOK
+ * African
+0189 LATIN CAPITAL LETTER AFRICAN D *
+ * Ewe
+ x (latin capital letter eth - 00D0)
+ x (latin capital letter d with stroke - 0110)
+ x (latin small letter d with tail - 0256)
+018A LATIN CAPITAL LETTER D WITH HOOK
+ * Pan-Nigerian alphabet
+ x (latin small letter d with hook - 0257)
+018B LATIN CAPITAL LETTER D WITH TOPBAR
+018C LATIN SMALL LETTER D WITH TOPBAR
+ * former-Soviet minority language scripts
+018D LATIN SMALL LETTER TURNED DELTA
+ * archaic phonetic for labialized dental fricative
+ * recommended spellings 007A 02B7 or 007A 032B
+018E LATIN CAPITAL LETTER REVERSED E
+ = LATIN CAPITAL LETTER TURNED E
+ * Pan-Nigerian alphabet
+ * lowercase is 01DD
+018F LATIN CAPITAL LETTER SCHWA
+ * Azerbaijani, ...
+ x (latin small letter schwa - 0259)
+ x (cyrillic capital letter schwa - 04D8)
+0190 LATIN CAPITAL LETTER OPEN E
+ = LATIN CAPITAL LETTER EPSILON
+ * African
+ x (latin small letter open e - 025B)
+ x (euler constant - 2107)
+0191 LATIN CAPITAL LETTER F WITH HOOK
+ * African
+0192 LATIN SMALL LETTER F WITH HOOK
+ = LATIN SMALL LETTER SCRIPT F
+ = Florin currency symbol (Netherlands)
+ = function symbol
+ = abbreviation convention for folder
+0193 LATIN CAPITAL LETTER G WITH HOOK
+ * African
+ x (latin small letter g with hook - 0260)
+0194 LATIN CAPITAL LETTER GAMMA
+ * African
+ x (latin small letter gamma - 0263)
+0195 LATIN SMALL LETTER HV (hwair)
+ * Gothic transliteration
+ * uppercase is 01F6
+0196 LATIN CAPITAL LETTER IOTA
+ * African
+ x (latin small letter iota - 0269)
+0197 LATIN CAPITAL LETTER I WITH STROKE
+ = barred i, i bar
+ * African
+ * ISO 6438 gives lowercase as 026A, not 0268
+ x (latin letter small capital i - 026A)
+0198 LATIN CAPITAL LETTER K WITH HOOK
+0199 LATIN SMALL LETTER K WITH HOOK
+ * Hausa, Pan-Nigerian alphabet
+019A LATIN SMALL LETTER L WITH BAR
+ = barred l
+ * Americanist phonetic usage for 026C
+ x (latin small letter l with stroke - 0142)
+019B LATIN SMALL LETTER LAMBDA WITH STROKE
+ = barred lambda, lambda bar
+ * Americanist phonetic usage
+019C LATIN CAPITAL LETTER TURNED M
+ * Zhuang
+ x (latin small letter turned m - 026F)
+019D LATIN CAPITAL LETTER N WITH LEFT HOOK
+ * African
+ x (latin small letter n with left hook - 0272)
+019E LATIN SMALL LETTER N WITH LONG RIGHT LEG
+ * archaic phonetic for Japanese syllabic "n"
+ * recommended spelling 006E 0329
+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE *
+ = barred o, o bar
+ * lowercase is 0275
+ * African
+ x (cyrillic capital letter barred o - 04E8)
+01A0 LATIN CAPITAL LETTER O WITH HORN
+ : 004F 031B
+01A1 LATIN SMALL LETTER O WITH HORN
+ * Vietnamese
+ : 006F 031B
+01A2 LATIN CAPITAL LETTER OI (gha)
+01A3 LATIN SMALL LETTER OI (gha)
+ = gha
+ * Pan-Turkic Latin alphabets
+01A4 LATIN CAPITAL LETTER P WITH HOOK
+01A5 LATIN SMALL LETTER P WITH HOOK
+ * African
+01A6 LATIN LETTER YR
+ * old Norse
+ * from German Standard DIN 31624 and ISO 5246-2
+ * lowercase is 0280
+01A7 LATIN CAPITAL LETTER TONE TWO
+01A8 LATIN SMALL LETTER TONE TWO
+ * Zhuang
+ * typographically a reversed S
+ x (latin small letter tone six - 0185)
+01A9 LATIN CAPITAL LETTER ESH
+ * African
+ x (latin small letter esh - 0283)
+ x (greek capital letter sigma - 03A3)
+01AA LATIN LETTER REVERSED ESH LOOP
+ * archaic phonetic for labialized palatoalveolar or palatal fricative
+ * Twi
+ * recommended spellings 0283 02B7, 00E7 02B7, 0068 0265, etc.
+01AB LATIN SMALL LETTER T WITH PALATAL HOOK
+ * archaic phonetic for palatalized alveolar or dental stop
+ * recommended spelling 0074 02B2
+01AC LATIN CAPITAL LETTER T WITH HOOK
+01AD LATIN SMALL LETTER T WITH HOOK
+ * African
+01AE LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+ * African
+ x (latin small letter t with retroflex hook - 0288)
+01AF LATIN CAPITAL LETTER U WITH HORN
+ : 0055 031B
+01B0 LATIN SMALL LETTER U WITH HORN
+ * Vietnamese
+ : 0075 031B
+01B1 LATIN CAPITAL LETTER UPSILON
+ * African
+ * typographically based on turned capital Greek omega
+ x (latin small letter upsilon - 028A)
+ x (inverted ohm sign - 2127)
+01B2 LATIN CAPITAL LETTER V WITH HOOK
+ = LATIN CAPITAL LETTER SCRIPT V
+ * African
+ x (latin small letter v with hook - 028B)
+01B3 LATIN CAPITAL LETTER Y WITH HOOK
+01B4 LATIN SMALL LETTER Y WITH HOOK
+ * Bini, Esoko, and other Edo languages in West Africa
+01B5 LATIN CAPITAL LETTER Z WITH STROKE
+01B6 LATIN SMALL LETTER Z WITH STROKE
+ = barred z, z bar
+ * Pan-Turkic Latin orthography
+ * handwritten variant of Latin "z"
+ x (latin small letter z - 007A)
+01B7 LATIN CAPITAL LETTER EZH
+ * African, Skolt Sámi
+ * lowercase is 0292
+ x (latin capital letter yogh - 021C)
+ x (cyrillic capital letter abkhasian dze - 04E0)
+01B8 LATIN CAPITAL LETTER EZH REVERSED
+01B9 LATIN SMALL LETTER EZH REVERSED
+ * archaic phonetic for voiced pharyngeal fricative
+ * sometimes typographically rendered with a turned digit 3
+ * recommended spelling 0295
+ x (latin letter pharyngeal voiced fricative - 0295)
+ x (arabic letter ain - 0639)
+01BA LATIN SMALL LETTER EZH WITH TAIL
+ * archaic phonetic for labialized voiced palatoalveolar or palatal fricative
+ * Twi
+ * recommended spellings 0292 02B7 or 006A 02B7
+01BB LATIN LETTER TWO WITH STROKE
+ * archaic phonetic for [dz] affricate
+ * recommended spellings 0292 or 0064 007A
+01BC LATIN CAPITAL LETTER TONE FIVE
+01BD LATIN SMALL LETTER TONE FIVE
+ * Zhuang
+ x (latin small letter tone six - 0185)
+01BE LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+ * archaic phonetic for [ts] affricate
+ * recommended spelling 0074 0073
+ * letter form is actually derived from ligation of ts, rather than inverted glottal stop
+01BF LATIN LETTER WYNN
+ = wen
+ * Runic letter borrowed into Latin script
+ * replaced by "w" in modern transcriptions of Old English
+ * uppercase is 01F7
+ x (runic letter wunjo wynn w - 16B9)
+01C0 LATIN LETTER DENTAL CLICK
+ = pipe
+ * Khoisan tradition
+ * "c" in Zulu orthography
+ x (solidus - 002F)
+ x (vertical line - 007C)
+ x (latin small letter turned t - 0287)
+ x (divides - 2223)
+01C1 LATIN LETTER LATERAL CLICK
+ = double pipe
+ * Khoisan tradition
+ * "x" in Zulu orthography
+ x (latin letter inverted glottal stop - 0296)
+ x (parallel to - 2225)
+01C2 LATIN LETTER ALVEOLAR CLICK
+ = double-barred pipe
+ * Khoisan tradition
+ x (not equal to - 2260)
+01C3 LATIN LETTER RETROFLEX CLICK
+ = LATIN LETTER EXCLAMATION MARK
+ * Khoisan tradition
+ * "q" in Zulu orthography
+ x (exclamation mark - 0021)
+ x (latin letter stretched c - 0297)
+@ Croatian digraphs matching Serbian Cyrillic letters
+01C4 LATIN CAPITAL LETTER DZ WITH CARON
+ # 0044 017D
+01C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+ # 0044 017E
+01C6 LATIN SMALL LETTER DZ WITH CARON
+ x (cyrillic small letter dzhe - 045F)
+ # 0064 017E
+01C7 LATIN CAPITAL LETTER LJ
+ # 004C 004A
+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J
+ # 004C 006A
+01C9 LATIN SMALL LETTER LJ
+ x (cyrillic small letter lje - 0459)
+ # 006C 006A
+01CA LATIN CAPITAL LETTER NJ
+ # 004E 004A
+01CB LATIN CAPITAL LETTER N WITH SMALL LETTER J
+ # 004E 006A
+01CC LATIN SMALL LETTER NJ
+ x (cyrillic small letter nje - 045A)
+ # 006E 006A
+@ Pinyin diacritic-vowel combinations
+01CD LATIN CAPITAL LETTER A WITH CARON
+ : 0041 030C
+01CE LATIN SMALL LETTER A WITH CARON
+ * Pinyin third tone
+ : 0061 030C
+01CF LATIN CAPITAL LETTER I WITH CARON
+ : 0049 030C
+01D0 LATIN SMALL LETTER I WITH CARON
+ * Pinyin third tone
+ : 0069 030C
+01D1 LATIN CAPITAL LETTER O WITH CARON
+ : 004F 030C
+01D2 LATIN SMALL LETTER O WITH CARON
+ * Pinyin third tone
+ : 006F 030C
+01D3 LATIN CAPITAL LETTER U WITH CARON
+ : 0055 030C
+01D4 LATIN SMALL LETTER U WITH CARON
+ * Pinyin third tone
+ : 0075 030C
+01D5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+ : 00DC 0304
+01D6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+ * Pinyin first tone
+ : 00FC 0304
+01D7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+ : 00DC 0301
+01D8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+ * Pinyin second tone
+ : 00FC 0301
+01D9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+ : 00DC 030C
+01DA LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+ * Pinyin third tone
+ : 00FC 030C
+01DB LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+ : 00DC 0300
+01DC LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+ * Pinyin fourth tone
+ : 00FC 0300
+@ Additions
+01DD LATIN SMALL LETTER TURNED E
+ * Pan-Nigerian alphabet
+ * all other usages of schwa are 0259
+ * uppercase is 018E
+ x (latin small letter schwa - 0259)
+01DE LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+ : 00C4 0304
+01DF LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+ * Livonian, Uralicist usage
+ : 00E4 0304
+01E0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+ : 0226 0304
+01E1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+ * Uralicist usage
+ : 0227 0304
+01E2 LATIN CAPITAL LETTER AE WITH MACRON (ash) *
+ : 00C6 0304
+01E3 LATIN SMALL LETTER AE WITH MACRON (ash) *
+ * Old Norse, Old English
+ : 00E6 0304
+01E4 LATIN CAPITAL LETTER G WITH STROKE
+01E5 LATIN SMALL LETTER G WITH STROKE
+ * Skolt Sámi
+01E6 LATIN CAPITAL LETTER G WITH CARON
+ : 0047 030C
+01E7 LATIN SMALL LETTER G WITH CARON
+ * Skolt Sámi
+ x (latin small letter g with breve - 011F)
+ : 0067 030C
+01E8 LATIN CAPITAL LETTER K WITH CARON
+ : 004B 030C
+01E9 LATIN SMALL LETTER K WITH CARON
+ * Skolt Sámi
+ : 006B 030C
+01EA LATIN CAPITAL LETTER O WITH OGONEK
+ : 004F 0328
+01EB LATIN SMALL LETTER O WITH OGONEK
+ * Sámi, Iroquoian, Old Icelandic
+ : 006F 0328
+01EC LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+ : 01EA 0304
+01ED LATIN SMALL LETTER O WITH OGONEK AND MACRON
+ * Old Icelandic
+ : 01EB 0304
+01EE LATIN CAPITAL LETTER EZH WITH CARON
+ : 01B7 030C
+01EF LATIN SMALL LETTER EZH WITH CARON
+ * Skolt Sámi
+ : 0292 030C
+01F0 LATIN SMALL LETTER J WITH CARON
+ * IPA and many languages
+ : 006A 030C
+01F1 LATIN CAPITAL LETTER DZ
+ # 0044 005A
+01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+ # 0044 007A
+01F3 LATIN SMALL LETTER DZ
+ # 0064 007A
+01F4 LATIN CAPITAL LETTER G WITH ACUTE
+ : 0047 0301
+01F5 LATIN SMALL LETTER G WITH ACUTE
+ : 0067 0301
+01F6 LATIN CAPITAL LETTER HWAIR
+ * lowercase is 0195
+01F7 LATIN CAPITAL LETTER WYNN
+ = wen
+ * lowercase is 01BF
+01F8 LATIN CAPITAL LETTER N WITH GRAVE
+ : 004E 0300
+01F9 LATIN SMALL LETTER N WITH GRAVE
+ * Pinyin
+ : 006E 0300
+01FA LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+ : 00C5 0301
+01FB LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+ : 00E5 0301
+01FC LATIN CAPITAL LETTER AE WITH ACUTE (ash) *
+ : 00C6 0301
+01FD LATIN SMALL LETTER AE WITH ACUTE (ash) *
+ : 00E6 0301
+01FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+ : 00D8 0301
+01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE
+ : 00F8 0301
+@ Additions for Slovenian and Croatian
+0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+ : 0041 030F
+0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE
+ : 0061 030F
+0202 LATIN CAPITAL LETTER A WITH INVERTED BREVE
+ : 0041 0311
+0203 LATIN SMALL LETTER A WITH INVERTED BREVE
+ : 0061 0311
+0204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+ : 0045 030F
+0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE
+ : 0065 030F
+0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE
+ : 0045 0311
+0207 LATIN SMALL LETTER E WITH INVERTED BREVE
+ : 0065 0311
+0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+ : 0049 030F
+0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE
+ : 0069 030F
+020A LATIN CAPITAL LETTER I WITH INVERTED BREVE
+ : 0049 0311
+020B LATIN SMALL LETTER I WITH INVERTED BREVE
+ : 0069 0311
+020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+ : 004F 030F
+020D LATIN SMALL LETTER O WITH DOUBLE GRAVE
+ : 006F 030F
+020E LATIN CAPITAL LETTER O WITH INVERTED BREVE
+ : 004F 0311
+020F LATIN SMALL LETTER O WITH INVERTED BREVE
+ : 006F 0311
+0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+ : 0052 030F
+0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE
+ : 0072 030F
+0212 LATIN CAPITAL LETTER R WITH INVERTED BREVE
+ : 0052 0311
+0213 LATIN SMALL LETTER R WITH INVERTED BREVE
+ : 0072 0311
+0214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+ : 0055 030F
+0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE
+ : 0075 030F
+0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE
+ : 0055 0311
+0217 LATIN SMALL LETTER U WITH INVERTED BREVE
+ : 0075 0311
+@ Additions for Romanian
+0218 LATIN CAPITAL LETTER S WITH COMMA BELOW *
+ : 0053 0326
+0219 LATIN SMALL LETTER S WITH COMMA BELOW *
+ * Romanian, when distinct comma below form is required
+ x (latin small letter s with cedilla - 015F)
+ : 0073 0326
+021A LATIN CAPITAL LETTER T WITH COMMA BELOW *
+ : 0054 0326
+021B LATIN SMALL LETTER T WITH COMMA BELOW *
+ * Romanian, when distinct comma below form is required
+ x (latin small letter t with cedilla - 0163)
+ : 0074 0326
+@ Miscellaneous additions
+021C LATIN CAPITAL LETTER YOGH
+ x (latin capital letter ezh - 01B7)
+021D LATIN SMALL LETTER YOGH
+ * Middle English, Scots
+ x (latin small letter ezh - 0292)
+ x (ounce sign - 2125)
+021E LATIN CAPITAL LETTER H WITH CARON
+ : 0048 030C
+021F LATIN SMALL LETTER H WITH CARON
+ * Finnish Romany
+ : 0068 030C
+0222 LATIN CAPITAL LETTER OU
+0223 LATIN SMALL LETTER OU
+ * Algonquin, Huron
+ x (digit eight - 0038)
+0224 LATIN CAPITAL LETTER Z WITH HOOK
+0225 LATIN SMALL LETTER Z WITH HOOK
+ * Middle High German
+0226 LATIN CAPITAL LETTER A WITH DOT ABOVE
+ : 0041 0307
+0227 LATIN SMALL LETTER A WITH DOT ABOVE
+ * Uralicist usage
+ : 0061 0307
+0228 LATIN CAPITAL LETTER E WITH CEDILLA
+ : 0045 0327
+0229 LATIN SMALL LETTER E WITH CEDILLA
+ : 0065 0327
+@ Additions for Livonian
+022A LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+ : 00D6 0304
+022B LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+ * Livonian
+ : 00F6 0304
+022C LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+ : 00D5 0304
+022D LATIN SMALL LETTER O WITH TILDE AND MACRON
+ * Livonian
+ : 00F5 0304
+022E LATIN CAPITAL LETTER O WITH DOT ABOVE
+ : 004F 0307
+022F LATIN SMALL LETTER O WITH DOT ABOVE
+ * Livonian
+ : 006F 0307
+0230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+ : 022E 0304
+0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+ * Livonian
+ : 022F 0304
+0232 LATIN CAPITAL LETTER Y WITH MACRON
+ : 0059 0304
+0233 LATIN SMALL LETTER Y WITH MACRON
+ * Livonian, Cornish
+ : 0079 0304
+@@ 0250 IPA Extensions 02AF
+@ IPA extensions
+@+ IPA includes basic Latin letters and a number of Latin letters from other blocks.
+ x (latin small letter ae - 00E6)
+ x (latin small letter c with cedilla - 00E7)
+ x (latin small letter eth - 00F0)
+ x (latin small letter o with stroke - 00F8)
+ x (latin small letter h with stroke - 0127)
+ x (latin small letter eng - 014B)
+ x (latin small ligature oe - 0153)
+ x (greek small letter beta - 03B2)
+ x (greek small letter theta - 03B8)
+ x (greek small letter lamda - 03BB)
+ x (greek small letter chi - 03C7)
+0250 LATIN SMALL LETTER TURNED A
+ * low central unrounded vowel
+0251 LATIN SMALL LETTER ALPHA
+ = LATIN SMALL LETTER SCRIPT A
+ * low back unrounded vowel
+ x (greek small letter alpha - 03B1)
+0252 LATIN SMALL LETTER TURNED ALPHA
+ * low back rounded vowel
+0253 LATIN SMALL LETTER B WITH HOOK
+ * implosive bilabial stop
+ * Pan-Nigerian alphabet
+ x (latin capital letter b with hook - 0181)
+0254 LATIN SMALL LETTER OPEN O
+ * typographically a turned c
+ * lower-mid back rounded vowel
+ x (latin capital letter open o - 0186)
+0255 LATIN SMALL LETTER C WITH CURL
+ * voiceless alveolo-palatal laminal fricative
+ * used in transcription of Mandarin Chinese
+ * sound spelled with 015B in Polish
+0256 LATIN SMALL LETTER D WITH TAIL
+ = LATIN SMALL LETTER D RETROFLEX HOOK
+ * voiced retroflex stop
+ x (latin capital letter african d - 0189)
+0257 LATIN SMALL LETTER D WITH HOOK
+ * implosive dental or alveolar stop
+ * Ewe, Pan-Nigerian alphabet
+ x (latin capital letter d with hook - 018A)
+0258 LATIN SMALL LETTER REVERSED E
+ * upper-mid central unrounded vowel
+0259 LATIN SMALL LETTER SCHWA
+ * mid-central unrounded vowel
+ * variant uppercase form 018E is associated with 01DD
+ x (latin capital letter schwa - 018F)
+ x (latin small letter turned e - 01DD)
+ x (cyrillic small letter schwa - 04D9)
+025A LATIN SMALL LETTER SCHWA WITH HOOK
+ * rhotacized schwa
+025B LATIN SMALL LETTER OPEN E
+ = LATIN SMALL LETTER EPSILON
+ * lower-mid front unrounded vowel
+ x (latin capital letter open e - 0190)
+ x (greek small letter epsilon - 03B5)
+025C LATIN SMALL LETTER REVERSED OPEN E
+ * lower-mid central unrounded vowel
+025D LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+ * rhotacized lower-mid central vowel
+025E LATIN SMALL LETTER CLOSED REVERSED OPEN E
+ = LATIN SMALL LETTER CLOSED REVERSED EPSILON
+ * lower-mid central rounded vowel
+025F LATIN SMALL LETTER DOTLESS J WITH STROKE
+ * voiced palatal stop
+ * typographically a turned f, but better thought of as a form of j
+ * "gy" in Hungarian orthography
+ * also archaic phonetic for palatoalveolar affricate 02A4
+0260 LATIN SMALL LETTER G WITH HOOK
+ * implosive velar stop
+ x (latin capital letter g with hook - 0193)
+0261 LATIN SMALL LETTER SCRIPT G
+ * voiced velar stop
+ x (latin small letter g - 0067)
+0262 LATIN LETTER SMALL CAPITAL G
+ * voiced uvular stop
+0263 LATIN SMALL LETTER GAMMA
+ * voiced velar fricative
+ x (latin capital letter gamma - 0194)
+ x (greek small letter gamma - 03B3)
+0264 LATIN SMALL LETTER RAMS HORN
+ = LATIN SMALL LETTER BABY GAMMA
+ * upper-mid back unrounded vowel
+0265 LATIN SMALL LETTER TURNED H
+ * voiced rounded palatal approximant
+0266 LATIN SMALL LETTER H WITH HOOK
+ * breathy-voiced glottal fricative
+ x (modifier letter small h with hook - 02B1)
+0267 LATIN SMALL LETTER HENG WITH HOOK
+ * voiceless coarticulated velar and palatoalveolar fricative
+ * "tj" or "kj" or "sj" in some Swedish dialects
+0268 LATIN SMALL LETTER I WITH STROKE
+ = barred i, i bar
+ * high central unrounded vowel
+ * ISO 6438 gives lowercase of 0197 as 026A, not 0268
+0269 LATIN SMALL LETTER IOTA
+ * semi-high front unrounded vowel
+@+ * obsoleted by IPA in 1989
+ * preferred use is 026A LATIN LETTER SMALL CAPITAL I
+ x (latin capital letter iota - 0196)
+ x (greek small letter iota - 03B9)
+026A LATIN LETTER SMALL CAPITAL I
+ * semi-high front unrounded vowel
+ * preferred IPA alternate for 0269
+ x (latin capital letter i with stroke - 0197)
+026B LATIN SMALL LETTER L WITH MIDDLE TILDE
+ * velarized voiced alveolar lateral approximant
+026C LATIN SMALL LETTER L WITH BELT
+ * voiceless alveolar lateral fricative
+026D LATIN SMALL LETTER L WITH RETROFLEX HOOK
+ * voiced retroflex lateral
+026E LATIN SMALL LETTER LEZH
+ * voiced lateral fricative
+ * "dhl" in Zulu orthography
+026F LATIN SMALL LETTER TURNED M
+ * high back unrounded vowel
+ x (latin capital letter turned m - 019C)
+0270 LATIN SMALL LETTER TURNED M WITH LONG LEG
+ * voiced velar approximant
+0271 LATIN SMALL LETTER M WITH HOOK
+ * voiced labiodental nasal
+0272 LATIN SMALL LETTER N WITH LEFT HOOK
+ * voiced palatal nasal
+ x (latin capital letter n with left hook - 019D)
+0273 LATIN SMALL LETTER N WITH RETROFLEX HOOK
+ * voiced retroflex nasal
+0274 LATIN LETTER SMALL CAPITAL N
+ * voiced uvular nasal
+0275 LATIN SMALL LETTER BARRED O
+ = o bar
+ * rounded mid-central vowel, i.e. rounded schwa
+ * uppercase is 019F
+ x (greek small letter theta - 03B8)
+ x (cyrillic small letter fita - 0473)
+ x (cyrillic small letter barred o - 04E9)
+0276 LATIN LETTER SMALL CAPITAL OE
+ * low front rounded vowel
+ x (latin small ligature oe - 0153)
+0277 LATIN SMALL LETTER CLOSED OMEGA
+ * semi-high back rounded vowel
+@+ * obsoleted by IPA in 1989
+ * preferred use is 028A latin small letter upsilon
+0278 LATIN SMALL LETTER PHI
+ * voiceless bilabial fricative
+ x (greek small letter phi - 03C6)
+0279 LATIN SMALL LETTER TURNED R
+ * voiced alveolar approximant
+ x (modifier letter small turned r - 02B4)
+027A LATIN SMALL LETTER TURNED R WITH LONG LEG
+ * voiced lateral flap
+027B LATIN SMALL LETTER TURNED R WITH HOOK
+ * voiced retroflex approximant
+ x (modifier letter small turned r with hook - 02B5)
+027C LATIN SMALL LETTER R WITH LONG LEG
+ * voiced strident apico-alveolar trill
+@+ * obsoleted by IPA in 1989
+ * sound spelled with 0159 in Czech
+ * preferred phonetic representation for Czech is 0072 031D
+ * in current use in Gaelic types (as glyph variant of 0072)
+027D LATIN SMALL LETTER R WITH TAIL
+ * voiced retroflex flap
+027E LATIN SMALL LETTER R WITH FISHHOOK
+ * voiced alveolar flap or tap
+027F LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+ * apical dental vowel
+ * used in Sinological tradition
+ * IPA spelling - 007A 0329
+0280 LATIN LETTER SMALL CAPITAL R
+ * voiced uvular trill
+ * Germanic, Old Norse
+ * uppercase is 01A6
+0281 LATIN LETTER SMALL CAPITAL INVERTED R
+ * voiced uvular fricative or approximant
+ x (modifier letter small capital inverted r - 02B6)
+0282 LATIN SMALL LETTER S WITH HOOK
+ * voiceless retroflex fricative
+0283 LATIN SMALL LETTER ESH
+ * voiceless postalveolar fricative
+ x (latin capital letter esh - 01A9)
+ x (integral - 222B)
+0284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+ * implosive palatal stop
+ * typographically based on 025F, not on 0283
+0285 LATIN SMALL LETTER SQUAT REVERSED ESH
+ * apical retroflex vowel
+ * used in Sinological tradition
+ * IPA spelling - 0290 0329
+0286 LATIN SMALL LETTER ESH WITH CURL
+ * palatalized voiceless postalveolar fricative
+ * suggested spelling - 0283 02B2
+0287 LATIN SMALL LETTER TURNED T
+ * dental click (sound of "tsk tsk")
+ x (latin letter dental click - 01C0)
+0288 LATIN SMALL LETTER T WITH RETROFLEX HOOK
+ * voiceless retroflex stop
+ x (latin capital letter t with retroflex hook - 01AE)
+0289 LATIN SMALL LETTER U BAR
+ * high central rounded vowel
+028A LATIN SMALL LETTER UPSILON
+ * semi-high back rounded vowel
+ * preferred IPA alternate to 0277
+ x (latin capital letter upsilon - 01B1)
+ x (greek small letter upsilon - 03C5)
+028B LATIN SMALL LETTER V WITH HOOK
+ = LATIN SMALL LETTER SCRIPT V
+ * voiced labiodental approximant
+ x (latin capital letter v with hook - 01B2)
+ x (greek small letter upsilon - 03C5)
+028C LATIN SMALL LETTER TURNED V
+ = caret, wedge
+ * lower-mid back unrounded vowel
+ x (greek capital letter lamda - 039B)
+ x (caret - 2038)
+ x (logical and - 2227)
+028D LATIN SMALL LETTER TURNED W
+ * voiceless rounded labiovelar approximant
+028E LATIN SMALL LETTER TURNED Y
+ * voiced lateral approximant
+028F LATIN LETTER SMALL CAPITAL Y
+ * semi-high front rounded vowel
+0290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+ * voiced retroflex fricative
+0291 LATIN SMALL LETTER Z WITH CURL
+ * voiced alveolo-palatal laminal fricative
+ * sound spelled with 017A in Polish
+0292 LATIN SMALL LETTER EZH
+ = LATIN SMALL LETTER YOGH
+ = dram
+ * voiced postalveolar fricative
+ * uppercase is 01B7
+ * Skolt Sámi
+ x (latin small letter yogh - 021D)
+ x (cyrillic small letter abkhasian dze - 04E1)
+ x (ounce sign - 2125)
+0293 LATIN SMALL LETTER EZH WITH CURL
+ * palatalized voiced postalveolar fricative
+0294 LATIN LETTER GLOTTAL STOP
+ x (modifier letter glottal stop - 02C0)
+0295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+ = LATIN LETTER REVERSED GLOTTAL STOP
+ * voiced pharyngeal fricative
+ * ain
+ x (latin small letter ezh reversed - 01B9)
+ x (modifier letter reversed glottal stop - 02C1)
+0296 LATIN LETTER INVERTED GLOTTAL STOP
+ * lateral click
+ x (latin letter lateral click - 01C1)
+0297 LATIN LETTER STRETCHED C
+ * palatal (or alveolar) click
+ x (latin letter retroflex click - 01C3)
+ x (complement - 2201)
+0298 LATIN LETTER BILABIAL CLICK
+ = LATIN LETTER BULLSEYE
+ x (circled dot operator - 2299)
+0299 LATIN LETTER SMALL CAPITAL B
+ * bilabial trill
+029A LATIN SMALL LETTER CLOSED OPEN E
+ = LATIN SMALL LETTER CLOSED EPSILON
+ * lower-mid front rounded vowel
+ * non-IPA alternate for the preferred 0153
+029B LATIN LETTER SMALL CAPITAL G WITH HOOK
+ * voiced uvular implosive
+029C LATIN LETTER SMALL CAPITAL H
+ * voiceless epiglottal fricative
+029D LATIN SMALL LETTER J WITH CROSSED-TAIL
+ * voiced palatal fricative
+029E LATIN SMALL LETTER TURNED K
+ * proposed for velar click
+@+ * withdrawn by IPA in 1970
+029F LATIN LETTER SMALL CAPITAL L
+ * velar lateral approximant
+02A0 LATIN SMALL LETTER Q WITH HOOK
+ * voiceless uvular implosive
+02A1 LATIN LETTER GLOTTAL STOP WITH STROKE
+ * voiced epiglottal stop
+02A2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+ * voiced epiglottal fricative
+02A3 LATIN SMALL LETTER DZ DIGRAPH
+ * voiced dental affricate
+02A4 LATIN SMALL LETTER DEZH DIGRAPH
+ * voiced postalveolar affricate
+02A5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+ * voiced alveolo-palatal affricate
+02A6 LATIN SMALL LETTER TS DIGRAPH
+ * voiceless dental affricate
+02A7 LATIN SMALL LETTER TESH DIGRAPH
+ * voiceless postalveolar affricate
+02A8 LATIN SMALL LETTER TC DIGRAPH WITH CURL
+ * voiceless alveolo-palatal affricate
+@ IPA characters for disordered speech
+02A9 LATIN SMALL LETTER FENG DIGRAPH
+ * velopharyngeal fricative
+02AA LATIN SMALL LETTER LS DIGRAPH
+ * lateral alveolar fricative (lisp)
+02AB LATIN SMALL LETTER LZ DIGRAPH
+ * voiced lateral alveolar fricative
+02AC LATIN LETTER BILABIAL PERCUSSIVE
+ * audible lip smack
+02AD LATIN LETTER BIDENTAL PERCUSSIVE
+ * audible teeth gnashing
+@@ 02B0 Spacing Modifier Letters 02FF
+@ Phonetic modifiers derived from Latin letters
+02B0 MODIFIER LETTER SMALL H
+ * aspiration
+ # <super> 0068
+02B1 MODIFIER LETTER SMALL H WITH HOOK
+ * breathy voiced, murmured
+ x (latin small letter h with hook - 0266)
+ x (combining diaeresis below - 0324)
+ # <super> 0266
+02B2 MODIFIER LETTER SMALL J
+ * palatalization
+ x (combining palatalized hook below - 0321)
+ # <super> 006A
+02B3 MODIFIER LETTER SMALL R
+ # <super> 0072
+02B4 MODIFIER LETTER SMALL TURNED R
+ x (latin small letter turned r - 0279)
+ # <super> 0279
+02B5 MODIFIER LETTER SMALL TURNED R WITH HOOK
+ x (latin small letter turned r with hook - 027B)
+ # <super> 027B
+02B6 MODIFIER LETTER SMALL CAPITAL INVERTED R
+ * preceding four used for r-coloring or r-offglides
+ x (latin letter small capital inverted r - 0281)
+ # <super> 0281
+02B7 MODIFIER LETTER SMALL W
+ * labialization
+ x (combining inverted double arch below - 032B)
+ # <super> 0077
+02B8 MODIFIER LETTER SMALL Y
+ * palatalization
+ * common Americanist substitution for 02B2
+ # <super> 0079
+@ Miscellaneous phonetic modifiers
+02B9 MODIFIER LETTER PRIME
+ * primary stress, emphasis
+ * transliteration of mjagkij znak (Cyrillic soft sign: palatalization)
+ x (apostrophe - 0027)
+ x (acute accent - 00B4)
+ x (modifier letter acute accent - 02CA)
+ x (combining acute accent - 0301)
+ x (greek numeral sign - 0374)
+ x (prime - 2032)
+02BA MODIFIER LETTER DOUBLE PRIME
+ * exaggerated stress, contrastive stress
+ * transliteration of tverdyj znak (Cyrillic hard sign: no palatalization)
+ x (quotation mark - 0022)
+ x (combining double acute accent - 030B)
+ x (double prime - 2033)
+02BB MODIFIER LETTER TURNED COMMA
+ * typographical alternate for 02BD or 02BF
+ x (combining turned comma above - 0312)
+ x (left single quotation mark - 2018)
+02BC MODIFIER LETTER APOSTROPHE
+ = apostrophe
+ * glottal stop, glottalization, ejective
+ * spacing clone of Greek smooth breathing mark
+ * many languages use this as a letter of their alphabets
+ x (apostrophe - 0027)
+ x (combining comma above - 0313)
+ x (combining comma above right - 0315)
+ x (armenian apostrophe - 055A)
+ x (right single quotation mark - 2019)
+02BD MODIFIER LETTER REVERSED COMMA
+ * weak aspiration
+ * spacing clone of Greek rough breathing mark
+ x (combining reversed comma above - 0314)
+ x (armenian modifier letter left half ring - 0559)
+ x (single high-reversed-9 quotation mark - 201B)
+02BE MODIFIER LETTER RIGHT HALF RING
+ * transliteration of Arabic hamza (glottal stop)
+ x (armenian apostrophe - 055A)
+ x (arabic letter hamza - 0621)
+02BF MODIFIER LETTER LEFT HALF RING
+ * transliteration of Arabic ain (voiced pharyngeal fricative)
+ x (armenian modifier letter left half ring - 0559)
+ x (arabic letter ain - 0639)
+02C0 MODIFIER LETTER GLOTTAL STOP
+ * ejective or glottalized
+ * typographical alternate for 02BC or 02BE
+ x (latin letter glottal stop - 0294)
+ x (combining hook above - 0309)
+02C1 MODIFIER LETTER REVERSED GLOTTAL STOP
+ * typographical alternate for 02BF
+ x (latin letter pharyngeal voiced fricative - 0295)
+02C2 MODIFIER LETTER LEFT ARROWHEAD
+ * fronted articulation
+02C3 MODIFIER LETTER RIGHT ARROWHEAD
+ * backed articulation
+02C4 MODIFIER LETTER UP ARROWHEAD
+ * raised articulation
+ x (circumflex accent - 005E)
+ x (up arrowhead - 2303)
+02C5 MODIFIER LETTER DOWN ARROWHEAD
+ * lowered articulation
+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+ * rising-falling tone, falling tone, secondary stress, etc.
+ x (circumflex accent - 005E)
+ x (combining circumflex accent - 0302)
+02C7 CARON (Mandarin Chinese third tone)
+ = hacek
+ * falling-rising tone
+ * Mandarin Chinese third tone
+ x (combining caron - 030C)
+02C8 MODIFIER LETTER VERTICAL LINE
+ * primary stress, downstep
+ * precedes letter or syllable modified
+ x (apostrophe - 0027)
+ x (combining vertical line above - 030D)
+02C9 MODIFIER LETTER MACRON (Mandarin Chinese first tone)
+ * high level tone
+ * precedes or follows letter or syllable modified
+ * Mandarin Chinese first tone
+ x (macron - 00AF)
+ x (combining macron - 0304)
+02CA MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone)
+ * high-rising tone (IPA), high tone, primary stress
+ * Mandarin Chinese second tone
+ x (acute accent - 00B4)
+ x (modifier letter prime - 02B9)
+ x (combining acute accent - 0301)
+ x (greek numeral sign - 0374)
+ x (armenian emphasis mark - 055B)
+02CB MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone)
+ * high-falling tone (IPA), low tone, secondary or tertiary stress
+ * Mandarin Chinese fourth tone
+ x (grave accent - 0060)
+ x (combining grave accent - 0300)
+ x (armenian comma - 055D)
+02CC MODIFIER LETTER LOW VERTICAL LINE
+ * secondary stress
+ * precedes letter or syllable modified
+ x (combining vertical line below - 0329)
+02CD MODIFIER LETTER LOW MACRON
+ * low level tone
+ x (low line - 005F)
+ x (combining macron below - 0331)
+02CE MODIFIER LETTER LOW GRAVE ACCENT
+ * low-falling tone
+02CF MODIFIER LETTER LOW ACUTE ACCENT
+ * low-rising tone
+ x (greek lower numeral sign - 0375)
+02D0 MODIFIER LETTER TRIANGULAR COLON
+ * length mark
+ x (colon - 003A)
+02D1 MODIFIER LETTER HALF TRIANGULAR COLON
+ * half-length mark
+ x (middle dot - 00B7)
+02D2 MODIFIER LETTER CENTRED RIGHT HALF RING
+ * more rounded articulation
+02D3 MODIFIER LETTER CENTRED LEFT HALF RING
+ * less rounded articulation
+02D4 MODIFIER LETTER UP TACK
+ * vowel raising or closing
+ x (combining up tack below - 031D)
+ x (combining dot below - 0323)
+02D5 MODIFIER LETTER DOWN TACK
+ * vowel lowering or opening
+ x (combining left half ring below - 031C)
+ x (combining down tack below - 031E)
+02D6 MODIFIER LETTER PLUS SIGN
+ * advanced or fronted articulation
+ x (combining plus sign below - 031F)
+02D7 MODIFIER LETTER MINUS SIGN
+ * retracted or backed articulation
+ * glyph may have small end-serifs
+ x (combining minus sign below - 0320)
+@ Spacing clones of diacritics
+02D8 BREVE
+ x (combining breve - 0306)
+ # 0020 0306
+02D9 DOT ABOVE (Mandarin Chinese light tone)
+ * Mandarin Chinese fifth tone (light or neutral)
+ x (combining dot above - 0307)
+ # 0020 0307
+02DA RING ABOVE
+ x (degree sign - 00B0)
+ x (combining ring above - 030A)
+ # 0020 030A
+02DB OGONEK
+ x (combining ogonek - 0328)
+ # 0020 0328
+02DC SMALL TILDE
+ x (tilde - 007E)
+ x (combining tilde - 0303)
+ x (tilde operator - 223C)
+ # 0020 0303
+02DD DOUBLE ACUTE ACCENT
+ x (combining double acute accent - 030B)
+ # 0020 030B
+@ Additions based on 1989 IPA
+02DE MODIFIER LETTER RHOTIC HOOK
+ * rhotacization in vowel
+ * often ligated: 025A = 0259 + 02DE; 025D = 025C + 02DE
+02DF MODIFIER LETTER CROSS ACCENT
+ * Swedish grave accent
+02E0 MODIFIER LETTER SMALL GAMMA
+ * these modifier letters are occasionally used in transcription of affricates
+ # <super> 0263
+02E1 MODIFIER LETTER SMALL L
+ # <super> 006C
+02E2 MODIFIER LETTER SMALL S
+ # <super> 0073
+02E3 MODIFIER LETTER SMALL X
+ # <super> 0078
+02E4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+ # <super> 0295
+@ Tone letters
+02E5 MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6 MODIFIER LETTER HIGH TONE BAR
+02E7 MODIFIER LETTER MID TONE BAR
+02E8 MODIFIER LETTER LOW TONE BAR
+02E9 MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB MODIFIER LETTER YANG DEPARTING TONE MARK
+@ IPA modifiers
+02EC MODIFIER LETTER VOICING
+02ED MODIFIER LETTER UNASPIRATED
+@ Other modifier letters
+02EE MODIFIER LETTER DOUBLE APOSTROPHE
+ * Nenets
+@@ 0300 Combining Diacritical Marks 036F
+@ Ordinary diacritics
+0300 COMBINING GRAVE ACCENT (Varia)
+ = Greek varia
+ x (grave accent - 0060)
+ x (modifier letter grave accent - 02CB)
+0301 COMBINING ACUTE ACCENT (Oxia)
+ = stress mark
+ = Greek oxia, tonos
+ x (apostrophe - 0027)
+ x (acute accent - 00B4)
+ x (modifier letter prime - 02B9)
+ x (modifier letter acute accent - 02CA)
+ x (greek tonos - 0384)
+0302 COMBINING CIRCUMFLEX ACCENT
+ = hat
+ x (circumflex accent - 005E)
+ x (modifier letter circumflex accent - 02C6)
+0303 COMBINING TILDE
+ * IPA: nasalization
+ * Vietnamese tone mark
+ x (tilde - 007E)
+ x (small tilde - 02DC)
+0304 COMBINING MACRON
+ = long
+ * distinguish from the following
+ x (macron - 00AF)
+ x (modifier letter macron - 02C9)
+0305 COMBINING OVERLINE
+ = overscore, vinculum
+ * connects on left and right
+ x (macron - 00AF)
+0306 COMBINING BREVE (Vrachy)
+ = short
+ = Greek vrachy
+ x (breve - 02D8)
+0307 COMBINING DOT ABOVE
+ = derivative (Newtonian notation)
+@+ * IPA (withdrawn in 1976): palatalization
+ x (dot above - 02D9)
+0308 COMBINING DIAERESIS (Dialytika)
+ = double dot above, umlaut
+ = Greek dialytika
+ = double derivative
+ x (diaeresis - 00A8)
+0309 COMBINING HOOK ABOVE
+ = hoi
+ * kerns left or right of circumflex over vowels
+ * Vietnamese tone mark
+ x (modifier letter glottal stop - 02C0)
+030A COMBINING RING ABOVE
+ x (degree sign - 00B0)
+ x (ring above - 02DA)
+030B COMBINING DOUBLE ACUTE ACCENT
+ * Hungarian, Chuvash
+ x (quotation mark - 0022)
+ x (modifier letter double prime - 02BA)
+ x (double acute accent - 02DD)
+030C COMBINING CARON
+ = hacek, V above
+ x (caron - 02C7)
+030D COMBINING VERTICAL LINE ABOVE (Tonos)
+ * Marshallese
+ x (modifier letter vertical line - 02C8)
+030E COMBINING DOUBLE VERTICAL LINE ABOVE
+ * Marshallese
+ x (quotation mark - 0022)
+030F COMBINING DOUBLE GRAVE ACCENT
+ * Serbian and Croatian poetics
+0310 COMBINING CANDRABINDU
+ x (devanagari sign candrabindu - 0901)
+0311 COMBINING INVERTED BREVE
+0312 COMBINING TURNED COMMA ABOVE
+ = cedilla above
+ * Latvian (but not used in decomposition)
+ x (modifier letter turned comma - 02BB)
+0313 COMBINING COMMA ABOVE (Psili)
+ = Greek psili, smooth breathing mark
+ * Americanist: ejective or glottalization
+ x (modifier letter apostrophe - 02BC)
+ x (combining cyrillic psili pneumata - 0486)
+ x (armenian apostrophe - 055A)
+0314 COMBINING REVERSED COMMA ABOVE (Dasia)
+ = Greek dasia, rough breathing mark
+ x (modifier letter reversed comma - 02BD)
+ x (combining cyrillic dasia pneumata - 0485)
+ x (armenian modifier letter left half ring - 0559)
+0315 COMBINING COMMA ABOVE RIGHT
+ x (modifier letter apostrophe - 02BC)
+0316 COMBINING GRAVE ACCENT BELOW
+0317 COMBINING ACUTE ACCENT BELOW
+0318 COMBINING LEFT TACK BELOW
+0319 COMBINING RIGHT TACK BELOW
+031A COMBINING LEFT ANGLE ABOVE
+ * IPA: unreleased stop
+031B COMBINING HORN
+ * Vietnamese
+031C COMBINING LEFT HALF RING BELOW
+ * IPA: open variety of vowel
+ x (modifier letter down tack - 02D5)
+031D COMBINING UP TACK BELOW
+ * IPA: vowel raising or closing
+ x (modifier letter up tack - 02D4)
+031E COMBINING DOWN TACK BELOW
+ * IPA: vowel lowering or opening
+ x (modifier letter down tack - 02D5)
+031F COMBINING PLUS SIGN BELOW
+ * IPA: advanced or fronted articulation
+ x (modifier letter plus sign - 02D6)
+0320 COMBINING MINUS SIGN BELOW
+ * IPA: retracted or backed articulation
+ * glyph may have small end-serifs
+ x (modifier letter minus sign - 02D7)
+0321 COMBINING PALATALIZED HOOK BELOW
+ * IPA: palatalization
+ x (modifier letter small j - 02B2)
+0322 COMBINING RETROFLEX HOOK BELOW
+ * IPA: retroflexion
+0323 COMBINING DOT BELOW
+ = nang
+ * IPA: closer variety of vowel
+ * Americanist and Indo-Europeanist: retraction or retroflexion
+ * Semiticist: velarization or pharyngealization
+ * Vietnamese tone mark
+ x (modifier letter up tack - 02D4)
+0324 COMBINING DIAERESIS BELOW
+ * IPA: breathy-voice or murmur
+ x (modifier letter small h with hook - 02B1)
+0325 COMBINING RING BELOW
+ * IPA: voiceless
+ * Madurese
+0326 COMBINING COMMA BELOW
+ * Romanian, Latvian, Livonian
+0327 COMBINING CEDILLA
+ * French, Turkish, Azerbaijani
+ x (cedilla - 00B8)
+0328 COMBINING OGONEK
+ = nasal hook
+ * Americanist: nasalization
+ * Polish, Lithuanian
+ x (ogonek - 02DB)
+0329 COMBINING VERTICAL LINE BELOW
+ * IPA: syllabic
+ * Yoruba
+ x (modifier letter low vertical line - 02CC)
+032A COMBINING BRIDGE BELOW
+ * IPA: dental
+032B COMBINING INVERTED DOUBLE ARCH BELOW
+ * IPA: labialization
+ x (modifier letter small w - 02B7)
+032C COMBINING CARON BELOW
+ * IPA: voiced
+ * Hittite transcription
+032D COMBINING CIRCUMFLEX ACCENT BELOW
+ * Americanist: fronted articulation
+032E COMBINING BREVE BELOW
+032F COMBINING INVERTED BREVE BELOW
+ * Americanist: fronted articulation (variant of 032D)
+ * Indo-Europeanist: semivowel
+0330 COMBINING TILDE BELOW
+ * IPA: creaky voice
+0331 COMBINING MACRON BELOW
+ x (low line - 005F)
+ x (modifier letter low macron - 02CD)
+0332 COMBINING LOW LINE
+ = underline, underscore
+ * connects on left and right
+ x (low line - 005F)
+0333 COMBINING DOUBLE LOW LINE
+ = double underline, double underscore
+ * connects on left and right
+ x (combining equals sign below - 0347)
+ x (double low line - 2017)
+@ Overstruck diacritics
+0334 COMBINING TILDE OVERLAY
+ * IPA: velarization or pharyngealization
+0335 COMBINING SHORT STROKE OVERLAY
+0336 COMBINING LONG STROKE OVERLAY
+0337 COMBINING SHORT SOLIDUS OVERLAY
+ = short slash overlay
+0338 COMBINING LONG SOLIDUS OVERLAY
+ = long slash overlay
+@ Additions
+0339 COMBINING RIGHT HALF RING BELOW
+033A COMBINING INVERTED BRIDGE BELOW
+033B COMBINING SQUARE BELOW
+033C COMBINING SEAGULL BELOW
+033D COMBINING X ABOVE
+033E COMBINING VERTICAL TILDE
+ * Cyrillic palatalization
+ x (combining cyrillic palatalization - 0484)
+033F COMBINING DOUBLE OVERLINE
+@ Vietnamese tone marks (deprecated)
+0340 COMBINING GRAVE TONE MARK (Vietnamese)
+ * kerns left or right of circumflex over vowels
+ : 0300 combining grave accent
+0341 COMBINING ACUTE TONE MARK (Vietnamese)
+ * kerns right of circumflex over vowels
+ : 0301 combining acute accent
+@ Additions for Greek
+0342 COMBINING GREEK PERISPOMENI
+0343 COMBINING GREEK KORONIS
+ : 0313 combining comma above
+0344 COMBINING GREEK DIALYTIKA TONOS
+ * use of this character is discouraged
+ : 0308 0301
+0345 COMBINING GREEK YPOGEGRAMMENI
+ = GREEK NON-SPACING IOTA BELOW
+ = iota subscript
+ * note special casing issues
+ x (greek ypogegrammeni - 037A)
+ x (greek capital letter iota - 0399)
+@ Additions for IPA
+0346 COMBINING BRIDGE ABOVE
+ * IPA: dentolabial
+0347 COMBINING EQUALS SIGN BELOW
+ * IPA: alveolar
+0348 COMBINING DOUBLE VERTICAL LINE BELOW
+ * IPA: strong articulation
+0349 COMBINING LEFT ANGLE BELOW
+ * IPA: weak articulation
+034A COMBINING NOT TILDE ABOVE
+ * IPA: denasal
+@ IPA diacritics for disordered speech
+034B COMBINING HOMOTHETIC ABOVE
+ * IPA: nasal escape
+034C COMBINING ALMOST EQUAL TO ABOVE
+ * IPA: velopharyngeal friction
+034D COMBINING LEFT RIGHT ARROW BELOW
+ * IPA: labial spreading
+034E COMBINING UPWARDS ARROW BELOW
+ * IPA: whistled articulation
+@ Double diacritics
+0360 COMBINING DOUBLE TILDE
+0361 COMBINING DOUBLE INVERTED BREVE
+0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+ * IPA: sliding articulation
+@@ 0370 Greek and Coptic 03FF
+@ Based on ISO 8859-7
+0374 GREEK NUMERAL SIGN (Dexia keraia)
+ = dexia keraia
+ * indicates numeric use of letters
+ x (modifier letter acute accent - 02CA)
+ : 02B9 modifier letter prime
+0375 GREEK LOWER NUMERAL SIGN (Aristeri keraia)
+ = aristeri keraia
+ * indicates numeric use of letters
+ x (modifier letter low acute accent - 02CF)
+037A GREEK YPOGEGRAMMENI
+ = iota subscript
+ x (combining greek ypogegrammeni - 0345)
+ # 0020 0345
+037E GREEK QUESTION MARK (Erotimatiko)
+ = erotimatiko
+ * sentence-final punctuation
+ x (question mark - 003F)
+ : 003B semicolon
+0384 GREEK TONOS
+ x (acute accent - 00B4)
+ x (combining vertical line above - 030D)
+ # 0020 0301
+0385 GREEK DIALYTIKA TONOS
+ : 00A8 0301
+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+ : 0391 0301
+0387 GREEK ANO TELEIA
+ * functions in Greek like a semicolon
+ : 00B7 middle dot
+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+ : 0395 0301
+0389 GREEK CAPITAL LETTER ETA WITH TONOS
+ : 0397 0301
+038A GREEK CAPITAL LETTER IOTA WITH TONOS
+ : 0399 0301
+038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+ : 039F 0301
+038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+ : 03A5 0301
+038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+ : 03A9 0301
+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ : 03CA 0301
+0391 GREEK CAPITAL LETTER ALPHA
+0392 GREEK CAPITAL LETTER BETA
+0393 GREEK CAPITAL LETTER GAMMA
+ = gamma function
+0394 GREEK CAPITAL LETTER DELTA
+ x (increment - 2206)
+0395 GREEK CAPITAL LETTER EPSILON
+0396 GREEK CAPITAL LETTER ZETA
+0397 GREEK CAPITAL LETTER ETA
+0398 GREEK CAPITAL LETTER THETA
+0399 GREEK CAPITAL LETTER IOTA
+ = iota adscript
+039A GREEK CAPITAL LETTER KAPPA
+039B GREEK CAPITAL LETTER LAMDA
+039C GREEK CAPITAL LETTER MU
+039D GREEK CAPITAL LETTER NU
+039E GREEK CAPITAL LETTER XI
+039F GREEK CAPITAL LETTER OMICRON
+03A0 GREEK CAPITAL LETTER PI
+ x (n-ary product - 220F)
+03A1 GREEK CAPITAL LETTER RHO
+03A3 GREEK CAPITAL LETTER SIGMA
+ x (latin capital letter esh - 01A9)
+ x (n-ary summation - 2211)
+03A4 GREEK CAPITAL LETTER TAU
+03A5 GREEK CAPITAL LETTER UPSILON
+03A6 GREEK CAPITAL LETTER PHI
+03A7 GREEK CAPITAL LETTER CHI
+03A8 GREEK CAPITAL LETTER PSI
+03A9 GREEK CAPITAL LETTER OMEGA
+ x (ohm sign - 2126)
+ x (inverted ohm sign - 2127)
+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ : 0399 0308
+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ : 03A5 0308
+03AC GREEK SMALL LETTER ALPHA WITH TONOS
+ : 03B1 0301
+03AD GREEK SMALL LETTER EPSILON WITH TONOS
+ : 03B5 0301
+03AE GREEK SMALL LETTER ETA WITH TONOS
+ : 03B7 0301
+03AF GREEK SMALL LETTER IOTA WITH TONOS
+ : 03B9 0301
+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+ : 03CB 0301
+03B1 GREEK SMALL LETTER ALPHA
+ x (latin small letter alpha - 0251)
+ x (proportional to - 221D)
+03B2 GREEK SMALL LETTER BETA
+ x (latin small letter sharp s - 00DF)
+ x (latin small letter b with stroke - 0180)
+03B3 GREEK SMALL LETTER GAMMA
+ x (latin small letter gamma - 0263)
+03B4 GREEK SMALL LETTER DELTA
+03B5 GREEK SMALL LETTER EPSILON
+ x (latin small letter open e - 025B)
+03B6 GREEK SMALL LETTER ZETA
+03B7 GREEK SMALL LETTER ETA
+03B8 GREEK SMALL LETTER THETA
+ x (latin small letter barred o - 0275)
+ x (cyrillic small letter fita - 0473)
+03B9 GREEK SMALL LETTER IOTA
+ x (latin small letter iota - 0269)
+ x (turned greek small letter iota - 2129)
+03BA GREEK SMALL LETTER KAPPA
+03BB GREEK SMALL LETTER LAMDA
+ = lambda
+03BC GREEK SMALL LETTER MU
+ x (micro sign - 00B5)
+03BD GREEK SMALL LETTER NU
+03BE GREEK SMALL LETTER XI
+03BF GREEK SMALL LETTER OMICRON
+03C0 GREEK SMALL LETTER PI
+ * math constant 3.141592...
+03C1 GREEK SMALL LETTER RHO
+03C2 GREEK SMALL LETTER FINAL SIGMA
+03C3 GREEK SMALL LETTER SIGMA
+03C4 GREEK SMALL LETTER TAU
+03C5 GREEK SMALL LETTER UPSILON
+ x (latin small letter upsilon - 028A)
+ x (latin small letter v with hook - 028B)
+03C6 GREEK SMALL LETTER PHI
+ x (latin small letter phi - 0278)
+03C7 GREEK SMALL LETTER CHI
+03C8 GREEK SMALL LETTER PSI
+03C9 GREEK SMALL LETTER OMEGA
+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ : 03B9 0308
+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ : 03C5 0308
+03CC GREEK SMALL LETTER OMICRON WITH TONOS
+ : 03BF 0301
+03CD GREEK SMALL LETTER UPSILON WITH TONOS
+ : 03C5 0301
+03CE GREEK SMALL LETTER OMEGA WITH TONOS
+ : 03C9 0301
+@ Variant letterforms
+03D0 GREEK BETA SYMBOL
+ = GREEK SMALL LETTER CURLED BETA
+ # 03B2 greek small letter beta
+03D1 GREEK THETA SYMBOL
+ = GREEK SMALL LETTER SCRIPT THETA
+ * used as technical symbol
+ # 03B8 greek small letter theta
+03D2 GREEK UPSILON WITH HOOK SYMBOL
+ = GREEK CAPITAL LETTER UPSILON HOOK
+ # 03A5 greek capital letter upsilon
+03D3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+ = GREEK CAPITAL LETTER UPSILON HOOK TONOS
+ : 03D2 0301
+03D4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+ = GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS
+ : 03D2 0308
+03D5 GREEK PHI SYMBOL
+ = GREEK SMALL LETTER SCRIPT PHI
+ * used as technical symbol
+ # 03C6 greek small letter phi
+03D6 GREEK PI SYMBOL
+ = GREEK SMALL LETTER OMEGA PI
+ * used as technical symbol
+ * a variant of pi, looking like omega
+ # 03C0 greek small letter pi
+03D7 GREEK KAI SYMBOL
+ * used as an ampersand
+@ Archaic letters
+03DA GREEK LETTER STIGMA
+03DB GREEK SMALL LETTER STIGMA
+03DC GREEK LETTER DIGAMMA
+03DD GREEK SMALL LETTER DIGAMMA
+03DE GREEK LETTER KOPPA
+03DF GREEK SMALL LETTER KOPPA
+03E0 GREEK LETTER SAMPI
+03E1 GREEK SMALL LETTER SAMPI
+@ Coptic-unique letters
+03E2 COPTIC CAPITAL LETTER SHEI
+03E3 COPTIC SMALL LETTER SHEI
+03E4 COPTIC CAPITAL LETTER FEI
+03E5 COPTIC SMALL LETTER FEI
+03E6 COPTIC CAPITAL LETTER KHEI
+03E7 COPTIC SMALL LETTER KHEI
+03E8 COPTIC CAPITAL LETTER HORI
+03E9 COPTIC SMALL LETTER HORI
+03EA COPTIC CAPITAL LETTER GANGIA
+03EB COPTIC SMALL LETTER GANGIA
+03EC COPTIC CAPITAL LETTER SHIMA
+03ED COPTIC SMALL LETTER SHIMA
+03EE COPTIC CAPITAL LETTER DEI
+03EF COPTIC SMALL LETTER DEI
+@ Additions
+03F0 GREEK KAPPA SYMBOL
+ = GREEK SMALL LETTER SCRIPT KAPPA
+ * used as technical symbol
+ # 03BA greek small letter kappa
+03F1 GREEK RHO SYMBOL
+ = GREEK SMALL LETTER TAILED RHO
+ * used as technical symbol
+ # 03C1 greek small letter rho
+03F2 GREEK LUNATE SIGMA SYMBOL
+ = GREEK SMALL LETTER LUNATE SIGMA
+ # 03C2 greek small letter final sigma
+03F3 GREEK LETTER YOT
+@@ 0400 Cyrillic 04FF
+@ Cyrillic extensions
+0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
+ : 0415 0300
+0401 CYRILLIC CAPITAL LETTER IO
+ : 0415 0308
+0402 CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
+0403 CYRILLIC CAPITAL LETTER GJE
+ : 0413 0301
+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405 CYRILLIC CAPITAL LETTER DZE
+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ x (latin capital letter i - 0049)
+ x (cyrillic letter palochka - 04C0)
+0407 CYRILLIC CAPITAL LETTER YI (Ukrainian)
+ : 0406 0308
+0408 CYRILLIC CAPITAL LETTER JE
+0409 CYRILLIC CAPITAL LETTER LJE
+040A CYRILLIC CAPITAL LETTER NJE
+040B CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
+040C CYRILLIC CAPITAL LETTER KJE
+ : 041A 0301
+040D CYRILLIC CAPITAL LETTER I WITH GRAVE
+ : 0418 0300
+040E CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
+ : 0423 0306
+040F CYRILLIC CAPITAL LETTER DZHE
+@ Basic Russian alphabet
+0410 CYRILLIC CAPITAL LETTER A
+0411 CYRILLIC CAPITAL LETTER BE
+ x (latin small letter b with topbar - 0183)
+0412 CYRILLIC CAPITAL LETTER VE
+0413 CYRILLIC CAPITAL LETTER GHE
+0414 CYRILLIC CAPITAL LETTER DE
+0415 CYRILLIC CAPITAL LETTER IE
+0416 CYRILLIC CAPITAL LETTER ZHE
+0417 CYRILLIC CAPITAL LETTER ZE
+0418 CYRILLIC CAPITAL LETTER I
+0419 CYRILLIC CAPITAL LETTER SHORT I
+ : 0418 0306
+041A CYRILLIC CAPITAL LETTER KA
+041B CYRILLIC CAPITAL LETTER EL
+041C CYRILLIC CAPITAL LETTER EM
+041D CYRILLIC CAPITAL LETTER EN
+041E CYRILLIC CAPITAL LETTER O
+041F CYRILLIC CAPITAL LETTER PE
+0420 CYRILLIC CAPITAL LETTER ER
+0421 CYRILLIC CAPITAL LETTER ES
+0422 CYRILLIC CAPITAL LETTER TE
+0423 CYRILLIC CAPITAL LETTER U
+ x (cyrillic capital letter uk - 0478)
+ x (cyrillic small letter straight u - 04AF)
+0424 CYRILLIC CAPITAL LETTER EF
+0425 CYRILLIC CAPITAL LETTER HA
+0426 CYRILLIC CAPITAL LETTER TSE
+0427 CYRILLIC CAPITAL LETTER CHE
+0428 CYRILLIC CAPITAL LETTER SHA
+0429 CYRILLIC CAPITAL LETTER SHCHA
+042A CYRILLIC CAPITAL LETTER HARD SIGN
+042B CYRILLIC CAPITAL LETTER YERU
+042C CYRILLIC CAPITAL LETTER SOFT SIGN
+042D CYRILLIC CAPITAL LETTER E
+042E CYRILLIC CAPITAL LETTER YU
+042F CYRILLIC CAPITAL LETTER YA
+0430 CYRILLIC SMALL LETTER A
+0431 CYRILLIC SMALL LETTER BE
+0432 CYRILLIC SMALL LETTER VE
+0433 CYRILLIC SMALL LETTER GHE
+0434 CYRILLIC SMALL LETTER DE
+0435 CYRILLIC SMALL LETTER IE
+0436 CYRILLIC SMALL LETTER ZHE
+0437 CYRILLIC SMALL LETTER ZE
+0438 CYRILLIC SMALL LETTER I
+0439 CYRILLIC SMALL LETTER SHORT I
+ : 0438 0306
+043A CYRILLIC SMALL LETTER KA
+043B CYRILLIC SMALL LETTER EL
+043C CYRILLIC SMALL LETTER EM
+043D CYRILLIC SMALL LETTER EN
+043E CYRILLIC SMALL LETTER O
+043F CYRILLIC SMALL LETTER PE
+0440 CYRILLIC SMALL LETTER ER
+0441 CYRILLIC SMALL LETTER ES
+0442 CYRILLIC SMALL LETTER TE
+0443 CYRILLIC SMALL LETTER U
+0444 CYRILLIC SMALL LETTER EF
+0445 CYRILLIC SMALL LETTER HA
+0446 CYRILLIC SMALL LETTER TSE
+0447 CYRILLIC SMALL LETTER CHE
+0448 CYRILLIC SMALL LETTER SHA
+0449 CYRILLIC SMALL LETTER SHCHA
+044A CYRILLIC SMALL LETTER HARD SIGN
+044B CYRILLIC SMALL LETTER YERU
+044C CYRILLIC SMALL LETTER SOFT SIGN
+ x (latin small letter tone six - 0185)
+044D CYRILLIC SMALL LETTER E
+044E CYRILLIC SMALL LETTER YU
+044F CYRILLIC SMALL LETTER YA
+@ Cyrillic extensions
+0450 CYRILLIC SMALL LETTER IE WITH GRAVE
+ * Macedonian
+ : 0435 0300
+0451 CYRILLIC SMALL LETTER IO
+ * Russian, ...
+ : 0435 0308
+0452 CYRILLIC SMALL LETTER DJE (Serbocroatian)
+ * Serbian
+ x (latin small letter d with stroke - 0111)
+0453 CYRILLIC SMALL LETTER GJE
+ * Macedonian
+ : 0433 0301
+0454 CYRILLIC SMALL LETTER UKRAINIAN IE
+ = Old Cyrillic yest
+0455 CYRILLIC SMALL LETTER DZE
+ = Old Cyrillic zelo
+ * Macedonian
+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ = Old Cyrillic i
+0457 CYRILLIC SMALL LETTER YI (Ukrainian)
+ * Ukrainian
+ : 0456 0308
+0458 CYRILLIC SMALL LETTER JE
+ * Serbian, Azerbaijani, Altay
+0459 CYRILLIC SMALL LETTER LJE
+ * Serbian, Macedonian
+ x (latin small letter lj - 01C9)
+045A CYRILLIC SMALL LETTER NJE
+ * Serbian, Macedonian
+ x (latin small letter nj - 01CC)
+045B CYRILLIC SMALL LETTER TSHE (Serbocroatian)
+ = Old Cyrillic derv
+ * Serbian
+ x (latin small letter c with acute - 0107)
+ x (latin small letter h with stroke - 0127)
+ x (cyrillic capital letter tshe - 040B)
+ x (planck constant over two pi - 210F)
+045C CYRILLIC SMALL LETTER KJE
+ * Macedonian
+ : 043A 0301
+045D CYRILLIC SMALL LETTER I WITH GRAVE
+ * Macedonian
+ : 0438 0300
+045E CYRILLIC SMALL LETTER SHORT U (Byelorussian)
+ * Byelorussian, Uzbek
+ : 0443 0306
+045F CYRILLIC SMALL LETTER DZHE
+ * Serbian, Macedonian, Abkhasian
+ x (latin small letter dz with caron - 01C6)
+@ Historic letters
+0460 CYRILLIC CAPITAL LETTER OMEGA
+0461 CYRILLIC SMALL LETTER OMEGA
+0462 CYRILLIC CAPITAL LETTER YAT
+0463 CYRILLIC SMALL LETTER YAT
+ * Old Russian
+0464 CYRILLIC CAPITAL LETTER IOTIFIED E
+0465 CYRILLIC SMALL LETTER IOTIFIED E
+0466 CYRILLIC CAPITAL LETTER LITTLE YUS
+0467 CYRILLIC SMALL LETTER LITTLE YUS
+0468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+0469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+046A CYRILLIC CAPITAL LETTER BIG YUS
+046B CYRILLIC SMALL LETTER BIG YUS
+046C CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046D CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046E CYRILLIC CAPITAL LETTER KSI
+046F CYRILLIC SMALL LETTER KSI
+0470 CYRILLIC CAPITAL LETTER PSI
+0471 CYRILLIC SMALL LETTER PSI
+0472 CYRILLIC CAPITAL LETTER FITA
+0473 CYRILLIC SMALL LETTER FITA
+ x (latin small letter barred o - 0275)
+ x (greek small letter theta - 03B8)
+0474 CYRILLIC CAPITAL LETTER IZHITSA
+0475 CYRILLIC SMALL LETTER IZHITSA
+0476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+ : 0474 030F
+0477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+ : 0475 030F
+0478 CYRILLIC CAPITAL LETTER UK
+ * basic Old Cyrillic uk is unified with CYRILLIC LETTER U
+ x (cyrillic capital letter u - 0423)
+0479 CYRILLIC SMALL LETTER UK
+047A CYRILLIC CAPITAL LETTER ROUND OMEGA
+047B CYRILLIC SMALL LETTER ROUND OMEGA
+047C CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047D CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047E CYRILLIC CAPITAL LETTER OT
+047F CYRILLIC SMALL LETTER OT
+0480 CYRILLIC CAPITAL LETTER KOPPA
+0481 CYRILLIC SMALL LETTER KOPPA
+@ Historic miscellaneous
+0482 CYRILLIC THOUSANDS SIGN
+0483 COMBINING CYRILLIC TITLO
+0484 COMBINING CYRILLIC PALATALIZATION
+ x (combining vertical tilde - 033E)
+0485 COMBINING CYRILLIC DASIA PNEUMATA
+ x (combining reversed comma above - 0314)
+0486 COMBINING CYRILLIC PSILI PNEUMATA
+ x (combining comma above - 0313)
+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489 COMBINING CYRILLIC MILLIONS SIGN
+@ Extended Cyrillic
+048C CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048D CYRILLIC SMALL LETTER SEMISOFT SIGN
+ * Kildin Sámi
+048E CYRILLIC CAPITAL LETTER ER WITH TICK
+048F CYRILLIC SMALL LETTER ER WITH TICK
+ * Kildin Sámi
+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
+ * Old Ukrainian
+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0493 CYRILLIC SMALL LETTER GHE WITH STROKE
+ * Azerbaijani, Bashkir, ...
+ * full bar form preferred over half-barred "F"-type
+0494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+ * Abkhasian, Yakut
+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+ * Tatar, ...
+0498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0499 CYRILLIC SMALL LETTER ZE WITH DESCENDER
+ * Bashkir
+ * reversed ogonek form of the descender is preferred
+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049B CYRILLIC SMALL LETTER KA WITH DESCENDER
+ * Abkhasian, Tajik, ...
+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+ * Azerbaijani
+049E CYRILLIC CAPITAL LETTER KA WITH STROKE
+049F CYRILLIC SMALL LETTER KA WITH STROKE
+ * Abkhasian
+04A0 CYRILLIC CAPITAL LETTER BASHKIR KA
+04A1 CYRILLIC SMALL LETTER BASHKIR KA
+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER
+ * Bashkir, ...
+04A4 CYRILLIC CAPITAL LIGATURE EN GHE
+04A5 CYRILLIC SMALL LIGATURE EN GHE
+ * Altay, Mari, Yakut
+ * this is not a decomposable ligature
+04A6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (Abkhasian)
+04A7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (Abkhasian)
+ * Abkhasian
+04A8 CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04A9 CYRILLIC SMALL LETTER ABKHASIAN HA
+04AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AB CYRILLIC SMALL LETTER ES WITH DESCENDER
+ * Bashkir, Chuvash
+ * reversed ogonek form of the descender is preferred
+04AC CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AD CYRILLIC SMALL LETTER TE WITH DESCENDER
+ * Abkhasian
+04AE CYRILLIC CAPITAL LETTER STRAIGHT U
+04AF CYRILLIC SMALL LETTER STRAIGHT U
+ * stem is straight, unlike LETTER U
+ * Azerbaijani, Bashkir, ...
+ x (cyrillic capital letter u - 0423)
+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+ * Kazakh
+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER
+ * Abkhasian, Tajik, Uzbek
+04B4 CYRILLIC CAPITAL LIGATURE TE TSE (Abkhasian)
+04B5 CYRILLIC SMALL LIGATURE TE TSE (Abkhasian)
+ * Abkhasian
+ * this is not a decomposable ligature
+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER
+ * Abkhasian, Tajik
+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+ * Azerbaijani
+04BA CYRILLIC CAPITAL LETTER SHHA
+04BB CYRILLIC SMALL LETTER SHHA
+ * originally derived from Latin "h", but uppercase form 04BA is closer to an inverted che (0427)
+ * Azerbaijani, Bashkir, ...
+ x (latin small letter h - 0068)
+04BC CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BD CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BE CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04BF CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+ * ogonek form preferred
+04C0 CYRILLIC LETTER PALOCHKA
+ * aspiration sign in many Caucasian languages
+ * has no "lowercase form", i.e. is case-invariant
+ x (latin capital letter i - 0049)
+ x (cyrillic capital letter byelorussian-ukrainian i - 0406)
+04C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+ : 0416 0306
+04C2 CYRILLIC SMALL LETTER ZHE WITH BREVE
+ * Moldavian
+ : 0436 0306
+04C3 CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C4 CYRILLIC SMALL LETTER KA WITH HOOK
+ * Khanty, Chukchi
+04C7 CYRILLIC CAPITAL LETTER EN WITH HOOK
+04C8 CYRILLIC SMALL LETTER EN WITH HOOK
+ * Khanty, Chukchi, Nenets
+04CB CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04CC CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04D0 CYRILLIC CAPITAL LETTER A WITH BREVE
+ : 0410 0306
+04D1 CYRILLIC SMALL LETTER A WITH BREVE
+ : 0430 0306
+04D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+ : 0410 0308
+04D3 CYRILLIC SMALL LETTER A WITH DIAERESIS
+ : 0430 0308
+04D4 CYRILLIC CAPITAL LIGATURE A IE
+04D5 CYRILLIC SMALL LIGATURE A IE
+ * this is not a decomposable ligature
+ x (latin small letter ae - 00E6)
+04D6 CYRILLIC CAPITAL LETTER IE WITH BREVE
+ : 0415 0306
+04D7 CYRILLIC SMALL LETTER IE WITH BREVE
+ : 0435 0306
+04D8 CYRILLIC CAPITAL LETTER SCHWA
+04D9 CYRILLIC SMALL LETTER SCHWA
+ x (latin small letter schwa - 0259)
+04DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+ : 04D8 0308
+04DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+ : 04D9 0308
+04DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+ : 0416 0308
+04DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+ : 0436 0308
+04DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+ : 0417 0308
+04DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+ : 0437 0308
+04E0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E1 CYRILLIC SMALL LETTER ABKHASIAN DZE
+ x (latin small letter ezh - 0292)
+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON
+ : 0418 0304
+04E3 CYRILLIC SMALL LETTER I WITH MACRON
+ : 0438 0304
+04E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+ : 0418 0308
+04E5 CYRILLIC SMALL LETTER I WITH DIAERESIS
+ : 0438 0308
+04E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+ : 041E 0308
+04E7 CYRILLIC SMALL LETTER O WITH DIAERESIS
+ : 043E 0308
+04E8 CYRILLIC CAPITAL LETTER BARRED O
+04E9 CYRILLIC SMALL LETTER BARRED O
+ x (latin small letter barred o - 0275)
+04EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+ : 04E8 0308
+04EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+ : 04E9 0308
+04EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+ : 042D 0308
+04ED CYRILLIC SMALL LETTER E WITH DIAERESIS
+ * Kildin Sámi
+ : 044D 0308
+04EE CYRILLIC CAPITAL LETTER U WITH MACRON
+ : 0423 0304
+04EF CYRILLIC SMALL LETTER U WITH MACRON
+ : 0443 0304
+04F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+ : 0423 0308
+04F1 CYRILLIC SMALL LETTER U WITH DIAERESIS
+ : 0443 0308
+04F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+ : 0423 030B
+04F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+ : 0443 030B
+04F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+ : 0427 0308
+04F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+ : 0447 0308
+04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+ : 042B 0308
+04F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+ : 044B 0308
+@@ 0530 Armenian 058F
+@ Uppercase letters
+0531 ARMENIAN CAPITAL LETTER AYB
+0532 ARMENIAN CAPITAL LETTER BEN
+0533 ARMENIAN CAPITAL LETTER GIM
+0534 ARMENIAN CAPITAL LETTER DA
+0535 ARMENIAN CAPITAL LETTER ECH
+0536 ARMENIAN CAPITAL LETTER ZA
+0537 ARMENIAN CAPITAL LETTER EH
+0538 ARMENIAN CAPITAL LETTER ET
+0539 ARMENIAN CAPITAL LETTER TO
+053A ARMENIAN CAPITAL LETTER ZHE
+053B ARMENIAN CAPITAL LETTER INI
+053C ARMENIAN CAPITAL LETTER LIWN
+053D ARMENIAN CAPITAL LETTER XEH
+053E ARMENIAN CAPITAL LETTER CA
+053F ARMENIAN CAPITAL LETTER KEN
+0540 ARMENIAN CAPITAL LETTER HO
+0541 ARMENIAN CAPITAL LETTER JA
+0542 ARMENIAN CAPITAL LETTER GHAD
+0543 ARMENIAN CAPITAL LETTER CHEH
+0544 ARMENIAN CAPITAL LETTER MEN
+0545 ARMENIAN CAPITAL LETTER YI
+0546 ARMENIAN CAPITAL LETTER NOW
+0547 ARMENIAN CAPITAL LETTER SHA
+0548 ARMENIAN CAPITAL LETTER VO
+0549 ARMENIAN CAPITAL LETTER CHA
+054A ARMENIAN CAPITAL LETTER PEH
+054B ARMENIAN CAPITAL LETTER JHEH
+054C ARMENIAN CAPITAL LETTER RA
+054D ARMENIAN CAPITAL LETTER SEH
+054E ARMENIAN CAPITAL LETTER VEW
+054F ARMENIAN CAPITAL LETTER TIWN
+0550 ARMENIAN CAPITAL LETTER REH
+0551 ARMENIAN CAPITAL LETTER CO
+0552 ARMENIAN CAPITAL LETTER YIWN
+0553 ARMENIAN CAPITAL LETTER PIWR
+0554 ARMENIAN CAPITAL LETTER KEH
+0555 ARMENIAN CAPITAL LETTER OH
+0556 ARMENIAN CAPITAL LETTER FEH
+@ Modifier letters
+0559 ARMENIAN MODIFIER LETTER LEFT HALF RING
+ x (modifier letter reversed comma - 02BD)
+ x (modifier letter left half ring - 02BF)
+ x (combining reversed comma above - 0314)
+055A ARMENIAN APOSTROPHE
+ = ARMENIAN MODIFIER LETTER RIGHT HALF RING
+ x (modifier letter apostrophe - 02BC)
+ x (modifier letter right half ring - 02BE)
+ x (combining comma above - 0313)
+055B ARMENIAN EMPHASIS MARK
+ = shesht
+ x (modifier letter acute accent - 02CA)
+055C ARMENIAN EXCLAMATION MARK
+ = batsaganchakan nshan
+055D ARMENIAN COMMA
+ = bowt
+ x (modifier letter grave accent - 02CB)
+055E ARMENIAN QUESTION MARK
+ = hartsakan nshan
+055F ARMENIAN ABBREVIATION MARK
+ = patiw
+@ Lowercase letters
+0561 ARMENIAN SMALL LETTER AYB
+0562 ARMENIAN SMALL LETTER BEN
+0563 ARMENIAN SMALL LETTER GIM
+0564 ARMENIAN SMALL LETTER DA
+0565 ARMENIAN SMALL LETTER ECH
+0566 ARMENIAN SMALL LETTER ZA
+0567 ARMENIAN SMALL LETTER EH
+0568 ARMENIAN SMALL LETTER ET
+0569 ARMENIAN SMALL LETTER TO
+056A ARMENIAN SMALL LETTER ZHE
+056B ARMENIAN SMALL LETTER INI
+056C ARMENIAN SMALL LETTER LIWN
+056D ARMENIAN SMALL LETTER XEH
+056E ARMENIAN SMALL LETTER CA
+056F ARMENIAN SMALL LETTER KEN
+0570 ARMENIAN SMALL LETTER HO
+0571 ARMENIAN SMALL LETTER JA
+0572 ARMENIAN SMALL LETTER GHAD
+0573 ARMENIAN SMALL LETTER CHEH
+0574 ARMENIAN SMALL LETTER MEN
+0575 ARMENIAN SMALL LETTER YI
+0576 ARMENIAN SMALL LETTER NOW
+0577 ARMENIAN SMALL LETTER SHA
+0578 ARMENIAN SMALL LETTER VO
+0579 ARMENIAN SMALL LETTER CHA
+057A ARMENIAN SMALL LETTER PEH
+057B ARMENIAN SMALL LETTER JHEH
+057C ARMENIAN SMALL LETTER RA
+057D ARMENIAN SMALL LETTER SEH
+057E ARMENIAN SMALL LETTER VEW
+057F ARMENIAN SMALL LETTER TIWN
+0580 ARMENIAN SMALL LETTER REH
+0581 ARMENIAN SMALL LETTER CO
+0582 ARMENIAN SMALL LETTER YIWN
+0583 ARMENIAN SMALL LETTER PIWR
+0584 ARMENIAN SMALL LETTER KEH
+0585 ARMENIAN SMALL LETTER OH
+0586 ARMENIAN SMALL LETTER FEH
+0587 ARMENIAN SMALL LIGATURE ECH YIWN
+ # 0565 0582
+@ Punctuation
+0589 ARMENIAN FULL STOP
+ = vertsaket
+ * may also be used for Georgian
+ x (colon - 003A)
+058A ARMENIAN HYPHEN
+ = yentamna
+@@ 0590 Hebrew 05FF
+@ Cantillation marks
+0591 HEBREW ACCENT ETNAHTA
+0592 HEBREW ACCENT SEGOL
+0593 HEBREW ACCENT SHALSHELET
+0594 HEBREW ACCENT ZAQEF QATAN
+0595 HEBREW ACCENT ZAQEF GADOL
+0596 HEBREW ACCENT TIPEHA *
+ = tarha
+0597 HEBREW ACCENT REVIA
+0598 HEBREW ACCENT ZARQA *
+ = zinorit
+0599 HEBREW ACCENT PASHTA
+059A HEBREW ACCENT YETIV
+059B HEBREW ACCENT TEVIR
+059C HEBREW ACCENT GERESH
+059D HEBREW ACCENT GERESH MUQDAM
+059E HEBREW ACCENT GERSHAYIM
+059F HEBREW ACCENT QARNEY PARA
+05A0 HEBREW ACCENT TELISHA GEDOLA
+05A1 HEBREW ACCENT PAZER
+05A3 HEBREW ACCENT MUNAH
+05A4 HEBREW ACCENT MAHAPAKH
+05A5 HEBREW ACCENT MERKHA *
+ = yored
+05A6 HEBREW ACCENT MERKHA KEFULA
+05A7 HEBREW ACCENT DARGA
+05A8 HEBREW ACCENT QADMA *
+ = azla
+05A9 HEBREW ACCENT TELISHA QETANA
+05AA HEBREW ACCENT YERAH BEN YOMO *
+ = galgal
+05AB HEBREW ACCENT OLE
+05AC HEBREW ACCENT ILUY
+05AD HEBREW ACCENT DEHI
+05AE HEBREW ACCENT ZINOR
+05AF HEBREW MARK MASORA CIRCLE
+@ Points and punctuation
+05B0 HEBREW POINT SHEVA
+05B1 HEBREW POINT HATAF SEGOL
+05B2 HEBREW POINT HATAF PATAH
+05B3 HEBREW POINT HATAF QAMATS
+05B4 HEBREW POINT HIRIQ
+05B5 HEBREW POINT TSERE
+05B6 HEBREW POINT SEGOL
+05B7 HEBREW POINT PATAH
+ * furtive patah is not a distinct character
+05B8 HEBREW POINT QAMATS
+05B9 HEBREW POINT HOLAM
+05BB HEBREW POINT QUBUTS
+05BC HEBREW POINT DAGESH OR MAPIQ (or shuruq)
+ = shuruq
+ * falls within the base letter
+05BD HEBREW POINT METEG *
+ = siluq
+ * may be used as a Hebrew accent sof pasuq
+05BE HEBREW PUNCTUATION MAQAF
+05BF HEBREW POINT RAFE
+05C0 HEBREW PUNCTUATION PASEQ *
+ = legarmeh
+ * may be treated as spacing punctuation, not as a point
+05C1 HEBREW POINT SHIN DOT
+05C2 HEBREW POINT SIN DOT
+05C3 HEBREW PUNCTUATION SOF PASUQ *
+ * may be used as a Hebrew punctuation colon
+05C4 HEBREW MARK UPPER DOT
+@ Based on ISO 8859-8
+05D0 HEBREW LETTER ALEF
+ = aleph
+ x (alef symbol - 2135)
+05D1 HEBREW LETTER BET
+ x (bet symbol - 2136)
+05D2 HEBREW LETTER GIMEL
+ x (gimel symbol - 2137)
+05D3 HEBREW LETTER DALET
+ x (dalet symbol - 2138)
+05D4 HEBREW LETTER HE
+05D5 HEBREW LETTER VAV
+05D6 HEBREW LETTER ZAYIN
+05D7 HEBREW LETTER HET
+05D8 HEBREW LETTER TET
+05D9 HEBREW LETTER YOD
+05DA HEBREW LETTER FINAL KAF
+05DB HEBREW LETTER KAF
+05DC HEBREW LETTER LAMED
+05DD HEBREW LETTER FINAL MEM
+05DE HEBREW LETTER MEM
+05DF HEBREW LETTER FINAL NUN
+05E0 HEBREW LETTER NUN
+05E1 HEBREW LETTER SAMEKH
+05E2 HEBREW LETTER AYIN
+05E3 HEBREW LETTER FINAL PE
+05E4 HEBREW LETTER PE
+05E5 HEBREW LETTER FINAL TSADI
+05E6 HEBREW LETTER TSADI
+ = zade
+05E7 HEBREW LETTER QOF
+05E8 HEBREW LETTER RESH
+05E9 HEBREW LETTER SHIN
+05EA HEBREW LETTER TAV
+@ Yiddish digraphs
+05F0 HEBREW LIGATURE YIDDISH DOUBLE VAV
+ = tsvey vovn
+05F1 HEBREW LIGATURE YIDDISH VAV YOD
+05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD
+ = tsvey yudn
+@ Additional punctuation
+05F3 HEBREW PUNCTUATION GERESH
+05F4 HEBREW PUNCTUATION GERSHAYIM
+@@ 0600 Arabic 06FF
+@ Based on ISO 8859-6
+060C ARABIC COMMA
+ * also used with Thaana and Syriac in modern text
+ x (comma - 002C)
+061B ARABIC SEMICOLON
+ * also used with Thaana and Syriac in modern text
+ x (semicolon - 003B)
+061F ARABIC QUESTION MARK
+ * also used with Thaana and Syriac in modern text
+ x (question mark - 003F)
+0621 ARABIC LETTER HAMZA
+ x (modifier letter right half ring - 02BE)
+0622 ARABIC LETTER ALEF WITH MADDA ABOVE
+ : 0627 0653
+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
+ : 0627 0654
+0624 ARABIC LETTER WAW WITH HAMZA ABOVE
+ : 0648 0654
+0625 ARABIC LETTER ALEF WITH HAMZA BELOW
+ : 0627 0655
+0626 ARABIC LETTER YEH WITH HAMZA ABOVE
+ : 064A 0654
+0627 ARABIC LETTER ALEF
+0628 ARABIC LETTER BEH
+0629 ARABIC LETTER TEH MARBUTA
+062A ARABIC LETTER TEH
+062B ARABIC LETTER THEH
+062C ARABIC LETTER JEEM
+062D ARABIC LETTER HAH
+062E ARABIC LETTER KHAH
+062F ARABIC LETTER DAL
+0630 ARABIC LETTER THAL
+0631 ARABIC LETTER REH
+0632 ARABIC LETTER ZAIN
+0633 ARABIC LETTER SEEN
+0634 ARABIC LETTER SHEEN
+0635 ARABIC LETTER SAD
+0636 ARABIC LETTER DAD
+0637 ARABIC LETTER TAH
+0638 ARABIC LETTER ZAH
+0639 ARABIC LETTER AIN
+ x (latin small letter ezh reversed - 01B9)
+ x (modifier letter left half ring - 02BF)
+063A ARABIC LETTER GHAIN
+0640 ARABIC TATWEEL
+ = kashida
+ * inserted to stretch characters
+ * also used with Syriac
+0641 ARABIC LETTER FEH
+0642 ARABIC LETTER QAF
+0643 ARABIC LETTER KAF
+0644 ARABIC LETTER LAM
+0645 ARABIC LETTER MEEM
+0646 ARABIC LETTER NOON
+0647 ARABIC LETTER HEH
+0648 ARABIC LETTER WAW
+0649 ARABIC LETTER ALEF MAKSURA
+ * represents YEH-shaped letter with no dots in any positional form
+064A ARABIC LETTER YEH
+@ Points from ISO 8859-6
+064B ARABIC FATHATAN
+064C ARABIC DAMMATAN
+064D ARABIC KASRATAN
+064E ARABIC FATHA
+064F ARABIC DAMMA
+0650 ARABIC KASRA
+0651 ARABIC SHADDA
+0652 ARABIC SUKUN
+@ Combining maddah and hamza
+0653 ARABIC MADDAH ABOVE
+0654 ARABIC HAMZA ABOVE
+0655 ARABIC HAMZA BELOW
+@ Arabic-Indic digits
+0660 ARABIC-INDIC DIGIT ZERO
+0661 ARABIC-INDIC DIGIT ONE
+0662 ARABIC-INDIC DIGIT TWO
+0663 ARABIC-INDIC DIGIT THREE
+0664 ARABIC-INDIC DIGIT FOUR
+0665 ARABIC-INDIC DIGIT FIVE
+0666 ARABIC-INDIC DIGIT SIX
+0667 ARABIC-INDIC DIGIT SEVEN
+0668 ARABIC-INDIC DIGIT EIGHT
+0669 ARABIC-INDIC DIGIT NINE
+@ Punctuation
+066A ARABIC PERCENT SIGN
+ x (percent sign - 0025)
+066B ARABIC DECIMAL SEPARATOR
+066C ARABIC THOUSANDS SEPARATOR
+066D ARABIC FIVE POINTED STAR
+ x (asterisk - 002A)
+@ Point
+0670 ARABIC LETTER SUPERSCRIPT ALEF
+@ Extended Arabic letters
+0671 ARABIC LETTER ALEF WASLA
+ * Arabic
+0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+ * Baluchi, Kashmiri
+0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+ * Baluchi, Kashmiri
+0674 ARABIC LETTER HIGH HAMZA
+ * Kazakh
+ * forms digraphs
+0675 ARABIC LETTER HIGH HAMZA ALEF
+ * Kazakh
+ # 0627 0674
+0676 ARABIC LETTER HIGH HAMZA WAW
+ * Kazakh
+ # 0648 0674
+0677 ARABIC LETTER U WITH HAMZA ABOVE
+ * Kazakh
+ # 06C7 0674
+0678 ARABIC LETTER HIGH HAMZA YEH
+ * Kazakh
+ # 064A 0674
+0679 ARABIC LETTER TTEH
+ * Urdu
+067A ARABIC LETTER TTEHEH
+ * Sindhi
+067B ARABIC LETTER BEEH
+ * Sindhi
+067C ARABIC LETTER TEH WITH RING
+ * Pashto
+067D ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+ * Sindhi
+067E ARABIC LETTER PEH
+ * Persian, Urdu, ...
+067F ARABIC LETTER TEHEH
+ * Sindhi
+0680 ARABIC LETTER BEHEH
+ * Sindhi
+0681 ARABIC LETTER HAH WITH HAMZA ABOVE
+ * Pashto
+0682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+ * Pashto
+0683 ARABIC LETTER NYEH
+ * Sindhi
+0684 ARABIC LETTER DYEH
+ * Sindhi
+0685 ARABIC LETTER HAH WITH THREE DOTS ABOVE
+ * Pashto
+0686 ARABIC LETTER TCHEH
+ * Persian, Urdu, ...
+0687 ARABIC LETTER TCHEHEH
+ * Sindhi
+0688 ARABIC LETTER DDAL
+ * Urdu
+0689 ARABIC LETTER DAL WITH RING
+ * Pashto
+068A ARABIC LETTER DAL WITH DOT BELOW
+ * Sindhi
+068B ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+ * Lahnda
+068C ARABIC LETTER DAHAL
+ * Sindhi
+068D ARABIC LETTER DDAHAL
+ * Sindhi
+068E ARABIC LETTER DUL
+ * Sindhi
+068F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+ * Sindhi
+0690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+ * Urdu
+0691 ARABIC LETTER RREH
+ * Urdu
+0692 ARABIC LETTER REH WITH SMALL V
+ * Kurdish
+0693 ARABIC LETTER REH WITH RING
+ * Pashto
+0694 ARABIC LETTER REH WITH DOT BELOW
+ * Kurdish
+0695 ARABIC LETTER REH WITH SMALL V BELOW
+ * Kurdish
+0696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+ * Pashto
+0697 ARABIC LETTER REH WITH TWO DOTS ABOVE
+ * Dargwa
+0698 ARABIC LETTER JEH
+ * Persian, Urdu, ...
+0699 ARABIC LETTER REH WITH FOUR DOTS ABOVE
+ * Sindhi
+069A ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+ * Pashto
+069B ARABIC LETTER SEEN WITH THREE DOTS BELOW
+ * Uighur
+069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+ * Moroccan Arabic
+069D ARABIC LETTER SAD WITH TWO DOTS BELOW
+ * Turkic
+069E ARABIC LETTER SAD WITH THREE DOTS ABOVE
+ * Berber
+069F ARABIC LETTER TAH WITH THREE DOTS ABOVE
+ * old Hausa
+06A0 ARABIC LETTER AIN WITH THREE DOTS ABOVE
+ * old Malay
+06A1 ARABIC LETTER DOTLESS FEH
+ * Adighe
+06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW
+ * Maghrib Arabic
+06A3 ARABIC LETTER FEH WITH DOT BELOW
+ * Ingush
+06A4 ARABIC LETTER VEH
+ * Arabic for foreign words
+06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW
+ * Arabic for foreign words
+06A6 ARABIC LETTER PEHEH
+ * Sindhi
+06A7 ARABIC LETTER QAF WITH DOT ABOVE
+ * Maghrib Arabic
+06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE
+ * Tunisian Arabic
+06A9 ARABIC LETTER KEHEH
+ * Persian, Urdu, ...
+06AA ARABIC LETTER SWASH KAF
+06AB ARABIC LETTER KAF WITH RING
+ * Pashto
+06AC ARABIC LETTER KAF WITH DOT ABOVE
+ * old Malay
+06AD ARABIC LETTER NG
+ * Uighur, Kazakh, old Malay, ...
+06AE ARABIC LETTER KAF WITH THREE DOTS BELOW
+ * Berber
+06AF ARABIC LETTER GAF *
+ * Persian, Urdu, ...
+06B0 ARABIC LETTER GAF WITH RING
+ * Lahnda
+06B1 ARABIC LETTER NGOEH
+ * Sindhi
+06B2 ARABIC LETTER GAF WITH TWO DOTS BELOW
+ * Sindhi
+06B3 ARABIC LETTER GUEH
+ * Sindhi
+06B4 ARABIC LETTER GAF WITH THREE DOTS ABOVE
+ * Sindhi
+06B5 ARABIC LETTER LAM WITH SMALL V
+ * Kurdish
+06B6 ARABIC LETTER LAM WITH DOT ABOVE
+ * Kurdish
+06B7 ARABIC LETTER LAM WITH THREE DOTS ABOVE
+ * Kurdish
+06B8 ARABIC LETTER LAM WITH THREE DOTS BELOW
+06B9 ARABIC LETTER NOON WITH DOT BELOW
+06BA ARABIC LETTER NOON GHUNNA
+ * Urdu
+06BB ARABIC LETTER RNOON
+ * Sindhi
+06BC ARABIC LETTER NOON WITH RING
+ * Pashto
+06BD ARABIC LETTER NOON WITH THREE DOTS ABOVE
+ * old Malay
+06BE ARABIC LETTER HEH DOACHASHMEE
+ * Urdu
+ * forms aspirate digraphs
+06BF ARABIC LETTER TCHEH WITH DOT ABOVE
+06C0 ARABIC LETTER HEH WITH YEH ABOVE
+ = ARABIC LETTER HAMZAH ON HA
+ = izafet
+ * Persian, Urdu
+ * actually a ligature, and not an independent letter
+ : 06D5 0654
+06C1 ARABIC LETTER HEH GOAL
+ * Urdu
+06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+ * Urdu
+ * actually a ligature, and not an independent letter
+ : 06C1 0654
+06C3 ARABIC LETTER TEH MARBUTA GOAL
+ * Urdu
+06C4 ARABIC LETTER WAW WITH RING
+ * Kashmiri
+06C5 ARABIC LETTER KIRGHIZ OE
+ * Kirghiz
+06C6 ARABIC LETTER OE
+ * Uighur, Kurdish, Kazakh
+06C7 ARABIC LETTER U
+ * Kirghiz
+06C8 ARABIC LETTER YU
+ * Uighur
+06C9 ARABIC LETTER KIRGHIZ YU
+ * Kazakh, Kirghiz
+06CA ARABIC LETTER WAW WITH TWO DOTS ABOVE
+ * Kurdish
+06CB ARABIC LETTER VE
+ * Uighur, Kazakh
+06CC ARABIC LETTER FARSI YEH
+ * Arabic, Persian, Urdu, ...
+06CD ARABIC LETTER YEH WITH TAIL
+ * Pashto, Sindhi
+06CE ARABIC LETTER YEH WITH SMALL V
+ * Kurdish
+06CF ARABIC LETTER WAW WITH DOT ABOVE
+06D0 ARABIC LETTER E *
+ * Pashto, Uighur
+ * used as the letter bbeh in Sindhi
+06D1 ARABIC LETTER YEH WITH THREE DOTS BELOW
+ * old Malay
+06D2 ARABIC LETTER YEH BARREE
+ * Urdu
+06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+ * Urdu
+ * actually a ligature, and not an independent letter
+ : 06D2 0654
+@ Punctuation
+06D4 ARABIC FULL STOP
+ * Urdu
+@ Extended Arabic letter
+06D5 ARABIC LETTER AE
+ * Uighur, Kazakh, Kirghiz
+@ Koranic annotation signs
+06D6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8 ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9 ARABIC SMALL HIGH LAM ALEF
+06DA ARABIC SMALL HIGH JEEM
+06DB ARABIC SMALL HIGH THREE DOTS
+06DC ARABIC SMALL HIGH SEEN
+06DD ARABIC END OF AYAH
+06DE ARABIC START OF RUB EL HIZB
+06DF ARABIC SMALL HIGH ROUNDED ZERO
+06E0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2 ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3 ARABIC SMALL LOW SEEN
+06E4 ARABIC SMALL HIGH MADDA
+06E5 ARABIC SMALL WAW
+06E6 ARABIC SMALL YEH
+06E7 ARABIC SMALL HIGH YEH
+06E8 ARABIC SMALL HIGH NOON
+06E9 ARABIC PLACE OF SAJDAH
+06EA ARABIC EMPTY CENTRE LOW STOP
+06EB ARABIC EMPTY CENTRE HIGH STOP
+06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED ARABIC SMALL LOW MEEM
+@ Eastern Arabic-Indic digits (Persian and Urdu)
+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO
+06F1 EXTENDED ARABIC-INDIC DIGIT ONE
+06F2 EXTENDED ARABIC-INDIC DIGIT TWO
+06F3 EXTENDED ARABIC-INDIC DIGIT THREE
+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR
+ * different glyphs in Persian and Urdu
+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE
+ * Persian and Urdu share glyph different from Arabic
+06F6 EXTENDED ARABIC-INDIC DIGIT SIX
+ * Persian glyph different from Arabic
+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN
+ * Urdu glyph different from Arabic
+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT
+06F9 EXTENDED ARABIC-INDIC DIGIT NINE
+@ Extended Arabic letters
+06FA ARABIC LETTER SHEEN WITH DOT BELOW
+06FB ARABIC LETTER DAD WITH DOT BELOW
+06FC ARABIC LETTER GHAIN WITH DOT BELOW
+@ Signs for Sindhi
+06FD ARABIC SIGN SINDHI AMPERSAND
+06FE ARABIC SIGN SINDHI POSTPOSITION MEN
+@@ 0700 Syriac 074F
+@ Syriac punctuation and signs
+0700 SYRIAC END OF PARAGRAPH
+ * marks the end of a paragraph
+0701 SYRIAC SUPRALINEAR FULL STOP
+ * marks interrogations, imperatives, and pauses, especially in Biblical texts
+0702 SYRIAC SUBLINEAR FULL STOP
+ * marks subordinate clauses and minor pauses, especially in Biblical texts
+0703 SYRIAC SUPRALINEAR COLON
+ * marks expressions of wonder and has a distinct pausal value in Biblical texts
+0704 SYRIAC SUBLINEAR COLON
+ * used at the end of verses of supplications
+0705 SYRIAC HORIZONTAL COLON
+ * joins two words closely together in a context to which a rising tone is suitable
+0706 SYRIAC COLON SKEWED LEFT
+ * marks a dependent clause
+0707 SYRIAC COLON SKEWED RIGHT
+ * marks the end of a subdivision of the apodosis, or latter part of a Biblical verse
+0708 SYRIAC SUPRALINEAR COLON SKEWED LEFT
+ * marks a minor phrase division
+0709 SYRIAC SUBLINEAR COLON SKEWED RIGHT
+ * marks the end of a real or rhetorical question
+070A SYRIAC CONTRACTION
+ * a contraction mark, mostly used in East Syriac
+ * placed at the end of an incomplete word
+070B SYRIAC HARKLEAN OBELUS
+ * marks the beginning of a phrase, word, or morpheme that has a marginal note
+070C SYRIAC HARKLEAN METOBELUS
+ * marks the end of a section with a marginal note
+070D SYRIAC HARKLEAN ASTERISCUS
+ * marks the beginning of a phrase, word, or morpheme that has a marginal note
+@ Syriac format control character
+070F SYRIAC ABBREVIATION MARK
+ * marks the beginning of a Syriac abbreviation
+@ Syriac letters
+0710 SYRIAC LETTER ALAPH
+0711 SYRIAC LETTER SUPERSCRIPT ALAPH
+ * used in East Syriac texts to indicate an etymological Alaph
+0712 SYRIAC LETTER BETH
+0713 SYRIAC LETTER GAMAL
+0714 SYRIAC LETTER GAMAL GARSHUNI
+ * used in Garshuni documents
+0715 SYRIAC LETTER DALATH
+0716 SYRIAC LETTER DOTLESS DALATH RISH
+ * ambiguous form for undifferentiated early dalath/rish
+0717 SYRIAC LETTER HE
+0718 SYRIAC LETTER WAW
+0719 SYRIAC LETTER ZAIN
+071A SYRIAC LETTER HETH
+071B SYRIAC LETTER TETH
+071C SYRIAC LETTER TETH GARSHUNI
+ * used in Garshuni documents
+071D SYRIAC LETTER YUDH
+071E SYRIAC LETTER YUDH HE
+ * mostly used in East Syriac texts
+071F SYRIAC LETTER KAPH
+0720 SYRIAC LETTER LAMADH
+0721 SYRIAC LETTER MIM
+0722 SYRIAC LETTER NUN
+0723 SYRIAC LETTER SEMKATH
+0724 SYRIAC LETTER FINAL SEMKATH
+0725 SYRIAC LETTER E
+0726 SYRIAC LETTER PE
+0727 SYRIAC LETTER REVERSED PE
+ * used in Christian Palestinian Aramaic
+0728 SYRIAC LETTER SADHE
+0729 SYRIAC LETTER QAPH
+072A SYRIAC LETTER RISH
+072B SYRIAC LETTER SHIN
+072C SYRIAC LETTER TAW
+@ Syriac points (vowels)
+0730 SYRIAC PTHAHA ABOVE
+0731 SYRIAC PTHAHA BELOW
+0732 SYRIAC PTHAHA DOTTED
+0733 SYRIAC ZQAPHA ABOVE
+0734 SYRIAC ZQAPHA BELOW
+0735 SYRIAC ZQAPHA DOTTED
+0736 SYRIAC RBASA ABOVE
+0737 SYRIAC RBASA BELOW
+0738 SYRIAC DOTTED ZLAMA HORIZONTAL
+0739 SYRIAC DOTTED ZLAMA ANGULAR
+073A SYRIAC HBASA ABOVE
+073B SYRIAC HBASA BELOW
+073C SYRIAC HBASA-ESASA DOTTED
+073D SYRIAC ESASA ABOVE
+073E SYRIAC ESASA BELOW
+073F SYRIAC RWAHA
+@ Syriac marks
+0740 SYRIAC FEMININE DOT
+ * feminine marker used with the Taw feminine suffix
+0741 SYRIAC QUSHSHAYA
+ * indicates a plosive pronunciation
+0742 SYRIAC RUKKAKHA
+ * indicates an aspirated (spirantized) pronunciation
+0743 SYRIAC TWO VERTICAL DOTS ABOVE
+ * accent mark used in ancient manuscripts
+0744 SYRIAC TWO VERTICAL DOTS BELOW
+ * accent mark used in ancient manuscripts
+0745 SYRIAC THREE DOTS ABOVE
+ * diacritic used in Turoyo for letters not found in Syriac
+0746 SYRIAC THREE DOTS BELOW
+ * diacritic used in Turoyo for letters not found in Syriac
+0747 SYRIAC OBLIQUE LINE ABOVE
+ * indication of a silent letter
+0748 SYRIAC OBLIQUE LINE BELOW
+ * indication of a silent letter
+ * also used to indicate numbers multiplied by a certain constant
+0749 SYRIAC MUSIC
+ * a music mark
+ * also used in the Syrian Orthodox Anaphora book to mark the breaking of the Eucharist bread
+074A SYRIAC BARREKH
+ * a diacritic cross used in liturgical texts
+@@ 0780 Thaana 07BF
+@ Basic consonants
+0780 THAANA LETTER HAA
+0781 THAANA LETTER SHAVIYANI
+0782 THAANA LETTER NOONU
+0783 THAANA LETTER RAA
+0784 THAANA LETTER BAA
+0785 THAANA LETTER LHAVIYANI
+0786 THAANA LETTER KAAFU
+0787 THAANA LETTER ALIFU
+0788 THAANA LETTER VAAVU
+0789 THAANA LETTER MEEMU
+078A THAANA LETTER FAAFU
+078B THAANA LETTER DHAALU
+078C THAANA LETTER THAA
+078D THAANA LETTER LAAMU
+078E THAANA LETTER GAAFU
+078F THAANA LETTER GNAVIYANI
+0790 THAANA LETTER SEENU
+0791 THAANA LETTER DAVIYANI
+0792 THAANA LETTER ZAVIYANI
+0793 THAANA LETTER TAVIYANI
+0794 THAANA LETTER YAA
+0795 THAANA LETTER PAVIYANI
+0796 THAANA LETTER JAVIYANI
+0797 THAANA LETTER CHAVIYANI
+@ Extensions for Arabic
+0798 THAANA LETTER TTAA
+0799 THAANA LETTER HHAA
+079A THAANA LETTER KHAA
+079B THAANA LETTER THAALU
+079C THAANA LETTER ZAA
+079D THAANA LETTER SHEENU
+079E THAANA LETTER SAADHU
+079F THAANA LETTER DAADHU
+07A0 THAANA LETTER TO
+07A1 THAANA LETTER ZO
+07A2 THAANA LETTER AINU
+07A3 THAANA LETTER GHAINU
+07A4 THAANA LETTER QAAFU
+07A5 THAANA LETTER WAAVU
+@ Vowels
+07A6 THAANA ABAFILI
+07A7 THAANA AABAAFILI
+07A8 THAANA IBIFILI
+07A9 THAANA EEBEEFILI
+07AA THAANA UBUFILI
+07AB THAANA OOBOOFILI
+07AC THAANA EBEFILI
+07AD THAANA EYBEYFILI
+07AE THAANA OBOFILI
+07AF THAANA OABOAFILI
+07B0 THAANA SUKUN
+@@ 0900 Devanagari 097F
+@ Based on ISCII 1988
+@ Various signs
+0901 DEVANAGARI SIGN CANDRABINDU
+ = anunasika
+ x (combining candrabindu - 0310)
+0902 DEVANAGARI SIGN ANUSVARA
+ = bindu
+0903 DEVANAGARI SIGN VISARGA
+@ Independent vowels
+0905 DEVANAGARI LETTER A
+0906 DEVANAGARI LETTER AA
+0907 DEVANAGARI LETTER I
+0908 DEVANAGARI LETTER II
+0909 DEVANAGARI LETTER U
+090A DEVANAGARI LETTER UU
+090B DEVANAGARI LETTER VOCALIC R
+090C DEVANAGARI LETTER VOCALIC L
+090D DEVANAGARI LETTER CANDRA E
+090E DEVANAGARI LETTER SHORT E
+ * for transcribing Dravidian short e
+090F DEVANAGARI LETTER E
+0910 DEVANAGARI LETTER AI
+0911 DEVANAGARI LETTER CANDRA O
+0912 DEVANAGARI LETTER SHORT O
+ * for transcribing Dravidian short o
+0913 DEVANAGARI LETTER O
+0914 DEVANAGARI LETTER AU
+@ Consonants
+0915 DEVANAGARI LETTER KA
+0916 DEVANAGARI LETTER KHA
+0917 DEVANAGARI LETTER GA
+0918 DEVANAGARI LETTER GHA
+0919 DEVANAGARI LETTER NGA
+091A DEVANAGARI LETTER CA
+091B DEVANAGARI LETTER CHA
+091C DEVANAGARI LETTER JA
+091D DEVANAGARI LETTER JHA
+091E DEVANAGARI LETTER NYA
+091F DEVANAGARI LETTER TTA
+0920 DEVANAGARI LETTER TTHA
+0921 DEVANAGARI LETTER DDA
+0922 DEVANAGARI LETTER DDHA
+0923 DEVANAGARI LETTER NNA
+0924 DEVANAGARI LETTER TA
+0925 DEVANAGARI LETTER THA
+0926 DEVANAGARI LETTER DA
+0927 DEVANAGARI LETTER DHA
+0928 DEVANAGARI LETTER NA
+0929 DEVANAGARI LETTER NNNA
+ * for transcribing Dravidian alveolar n
+ : 0928 093C
+092A DEVANAGARI LETTER PA
+092B DEVANAGARI LETTER PHA
+092C DEVANAGARI LETTER BA
+092D DEVANAGARI LETTER BHA
+092E DEVANAGARI LETTER MA
+092F DEVANAGARI LETTER YA
+0930 DEVANAGARI LETTER RA
+0931 DEVANAGARI LETTER RRA
+ * for transcribing Dravidian alveolar r
+ * half form is represented as "Eyelash RA"
+ : 0930 093C
+0932 DEVANAGARI LETTER LA
+0933 DEVANAGARI LETTER LLA
+0934 DEVANAGARI LETTER LLLA
+ * for transcribing Dravidian l
+ : 0933 093C
+0935 DEVANAGARI LETTER VA
+0936 DEVANAGARI LETTER SHA
+0937 DEVANAGARI LETTER SSA
+0938 DEVANAGARI LETTER SA
+0939 DEVANAGARI LETTER HA
+@ Various signs
+093C DEVANAGARI SIGN NUKTA
+ * for extending the alphabet to new letters
+093D DEVANAGARI SIGN AVAGRAHA
+093E DEVANAGARI VOWEL SIGN AA
+@ Dependent vowel signs
+093F DEVANAGARI VOWEL SIGN I
+ * stands to the left of the consonant
+0940 DEVANAGARI VOWEL SIGN II
+0941 DEVANAGARI VOWEL SIGN U
+0942 DEVANAGARI VOWEL SIGN UU
+0943 DEVANAGARI VOWEL SIGN VOCALIC R
+0944 DEVANAGARI VOWEL SIGN VOCALIC RR
+0945 DEVANAGARI VOWEL SIGN CANDRA E
+ = candra
+0946 DEVANAGARI VOWEL SIGN SHORT E
+ * for transcribing Dravidian vowels
+0947 DEVANAGARI VOWEL SIGN E
+0948 DEVANAGARI VOWEL SIGN AI
+0949 DEVANAGARI VOWEL SIGN CANDRA O
+094A DEVANAGARI VOWEL SIGN SHORT O
+ * for transcribing Dravidian vowels
+094B DEVANAGARI VOWEL SIGN O
+094C DEVANAGARI VOWEL SIGN AU
+@ Various signs
+094D DEVANAGARI SIGN VIRAMA
+ = halant
+ * suppresses inherent vowel
+0950 DEVANAGARI OM
+0951 DEVANAGARI STRESS SIGN UDATTA
+0952 DEVANAGARI STRESS SIGN ANUDATTA
+0953 DEVANAGARI GRAVE ACCENT
+0954 DEVANAGARI ACUTE ACCENT
+@ Additional consonants
+0958 DEVANAGARI LETTER QA
+ : 0915 093C
+0959 DEVANAGARI LETTER KHHA
+ : 0916 093C
+095A DEVANAGARI LETTER GHHA
+ : 0917 093C
+095B DEVANAGARI LETTER ZA
+ : 091C 093C
+095C DEVANAGARI LETTER DDDHA
+ : 0921 093C
+095D DEVANAGARI LETTER RHA
+ : 0922 093C
+095E DEVANAGARI LETTER FA
+ : 092B 093C
+095F DEVANAGARI LETTER YYA
+ : 092F 093C
+@ Generic additions
+0960 DEVANAGARI LETTER VOCALIC RR
+0961 DEVANAGARI LETTER VOCALIC LL
+0962 DEVANAGARI VOWEL SIGN VOCALIC L
+0963 DEVANAGARI VOWEL SIGN VOCALIC LL
+0964 DEVANAGARI DANDA
+ = phrase separator
+0965 DEVANAGARI DOUBLE DANDA
+@ Digits
+0966 DEVANAGARI DIGIT ZERO
+0967 DEVANAGARI DIGIT ONE
+0968 DEVANAGARI DIGIT TWO
+0969 DEVANAGARI DIGIT THREE
+096A DEVANAGARI DIGIT FOUR
+096B DEVANAGARI DIGIT FIVE
+096C DEVANAGARI DIGIT SIX
+096D DEVANAGARI DIGIT SEVEN
+096E DEVANAGARI DIGIT EIGHT
+096F DEVANAGARI DIGIT NINE
+@ Devanagari-specific additions
+0970 DEVANAGARI ABBREVIATION SIGN
+@@ 0980 Bengali 09FF
+@ Based on ISCII 1988
+@ Various signs
+0981 BENGALI SIGN CANDRABINDU
+0982 BENGALI SIGN ANUSVARA
+0983 BENGALI SIGN VISARGA
+@ Independent vowels
+0985 BENGALI LETTER A
+0986 BENGALI LETTER AA
+0987 BENGALI LETTER I
+0988 BENGALI LETTER II
+0989 BENGALI LETTER U
+098A BENGALI LETTER UU
+098B BENGALI LETTER VOCALIC R
+098C BENGALI LETTER VOCALIC L
+098F BENGALI LETTER E
+0990 BENGALI LETTER AI
+0993 BENGALI LETTER O
+0994 BENGALI LETTER AU
+@ Consonants
+0995 BENGALI LETTER KA
+0996 BENGALI LETTER KHA
+0997 BENGALI LETTER GA
+0998 BENGALI LETTER GHA
+0999 BENGALI LETTER NGA
+099A BENGALI LETTER CA
+099B BENGALI LETTER CHA
+099C BENGALI LETTER JA
+099D BENGALI LETTER JHA
+099E BENGALI LETTER NYA
+099F BENGALI LETTER TTA
+09A0 BENGALI LETTER TTHA
+09A1 BENGALI LETTER DDA
+09A2 BENGALI LETTER DDHA
+09A3 BENGALI LETTER NNA
+09A4 BENGALI LETTER TA
+09A5 BENGALI LETTER THA
+09A6 BENGALI LETTER DA
+09A7 BENGALI LETTER DHA
+09A8 BENGALI LETTER NA
+09AA BENGALI LETTER PA
+09AB BENGALI LETTER PHA
+09AC BENGALI LETTER BA
+ = Bengali va, wa
+09AD BENGALI LETTER BHA
+09AE BENGALI LETTER MA
+09AF BENGALI LETTER YA
+09B0 BENGALI LETTER RA
+09B2 BENGALI LETTER LA
+09B6 BENGALI LETTER SHA
+09B7 BENGALI LETTER SSA
+09B8 BENGALI LETTER SA
+09B9 BENGALI LETTER HA
+@ Various signs
+09BC BENGALI SIGN NUKTA
+ * for extending the alphabet to new letters
+@ Dependent vowel signs
+09BE BENGALI VOWEL SIGN AA
+09BF BENGALI VOWEL SIGN I
+ * stands to the left of the consonant
+09C0 BENGALI VOWEL SIGN II
+09C1 BENGALI VOWEL SIGN U
+09C2 BENGALI VOWEL SIGN UU
+09C3 BENGALI VOWEL SIGN VOCALIC R
+09C4 BENGALI VOWEL SIGN VOCALIC RR
+09C7 BENGALI VOWEL SIGN E
+ * stands to the left of the consonant
+09C8 BENGALI VOWEL SIGN AI
+ * stands to the left of the consonant
+09CB BENGALI VOWEL SIGN O
+ * pieces on both sides of the consonant
+ : 09C7 09BE
+09CC BENGALI VOWEL SIGN AU
+ * pieces on both sides of the consonant
+ : 09C7 09D7
+@ Various signs
+09CD BENGALI SIGN VIRAMA
+ = halant
+09D7 BENGALI AU LENGTH MARK
+@ Additional consonants
+09DC BENGALI LETTER RRA
+ : 09A1 09BC
+09DD BENGALI LETTER RHA
+ : 09A2 09BC
+09DF BENGALI LETTER YYA
+ : 09AF 09BC
+@ Generic additions
+09E0 BENGALI LETTER VOCALIC RR
+09E1 BENGALI LETTER VOCALIC LL
+09E2 BENGALI VOWEL SIGN VOCALIC L
+09E3 BENGALI VOWEL SIGN VOCALIC LL
+@ Digits
+09E6 BENGALI DIGIT ZERO
+09E7 BENGALI DIGIT ONE
+09E8 BENGALI DIGIT TWO
+09E9 BENGALI DIGIT THREE
+09EA BENGALI DIGIT FOUR
+09EB BENGALI DIGIT FIVE
+09EC BENGALI DIGIT SIX
+09ED BENGALI DIGIT SEVEN
+09EE BENGALI DIGIT EIGHT
+09EF BENGALI DIGIT NINE
+@ Bengali-specific additions
+09F0 BENGALI LETTER RA WITH MIDDLE DIAGONAL (Assamese)
+ * Assamese
+09F1 BENGALI LETTER RA WITH LOWER DIAGONAL (Assamese)
+ = BENGALI LETTER VA WITH LOWER DIAGONAL
+ * Assamese
+09F2 BENGALI RUPEE MARK
+09F3 BENGALI RUPEE SIGN
+09F4 BENGALI CURRENCY NUMERATOR ONE
+09F5 BENGALI CURRENCY NUMERATOR TWO
+09F6 BENGALI CURRENCY NUMERATOR THREE
+09F7 BENGALI CURRENCY NUMERATOR FOUR
+09F8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9 BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA BENGALI ISSHAR
+@@ 0A00 Gurmukhi 0A7F
+@ Based on ISCII 1988
+@ Various signs
+0A02 GURMUKHI SIGN BINDI
+@ Independent vowels
+0A05 GURMUKHI LETTER A
+0A06 GURMUKHI LETTER AA
+0A07 GURMUKHI LETTER I
+0A08 GURMUKHI LETTER II
+0A09 GURMUKHI LETTER U
+0A0A GURMUKHI LETTER UU
+0A0F GURMUKHI LETTER EE
+0A10 GURMUKHI LETTER AI
+0A13 GURMUKHI LETTER OO
+0A14 GURMUKHI LETTER AU
+@ Consonants
+0A15 GURMUKHI LETTER KA
+0A16 GURMUKHI LETTER KHA
+0A17 GURMUKHI LETTER GA
+0A18 GURMUKHI LETTER GHA
+0A19 GURMUKHI LETTER NGA
+0A1A GURMUKHI LETTER CA
+0A1B GURMUKHI LETTER CHA
+0A1C GURMUKHI LETTER JA
+0A1D GURMUKHI LETTER JHA
+0A1E GURMUKHI LETTER NYA
+0A1F GURMUKHI LETTER TTA
+0A20 GURMUKHI LETTER TTHA
+0A21 GURMUKHI LETTER DDA
+0A22 GURMUKHI LETTER DDHA
+0A23 GURMUKHI LETTER NNA
+0A24 GURMUKHI LETTER TA
+0A25 GURMUKHI LETTER THA
+0A26 GURMUKHI LETTER DA
+0A27 GURMUKHI LETTER DHA
+0A28 GURMUKHI LETTER NA
+0A2A GURMUKHI LETTER PA
+0A2B GURMUKHI LETTER PHA
+0A2C GURMUKHI LETTER BA
+0A2D GURMUKHI LETTER BHA
+0A2E GURMUKHI LETTER MA
+0A2F GURMUKHI LETTER YA
+0A30 GURMUKHI LETTER RA
+0A32 GURMUKHI LETTER LA
+0A33 GURMUKHI LETTER LLA
+ : 0A32 0A3C
+0A35 GURMUKHI LETTER VA
+0A36 GURMUKHI LETTER SHA
+ : 0A38 0A3C
+0A38 GURMUKHI LETTER SA
+0A39 GURMUKHI LETTER HA
+@ Various signs
+0A3C GURMUKHI SIGN NUKTA
+ * for extending the alphabet to new letters
+@ Dependent vowel signs
+0A3E GURMUKHI VOWEL SIGN AA
+0A3F GURMUKHI VOWEL SIGN I
+ * stands to the left of the consonant
+0A40 GURMUKHI VOWEL SIGN II
+0A41 GURMUKHI VOWEL SIGN U
+0A42 GURMUKHI VOWEL SIGN UU
+0A47 GURMUKHI VOWEL SIGN EE
+0A48 GURMUKHI VOWEL SIGN AI
+0A4B GURMUKHI VOWEL SIGN OO
+0A4C GURMUKHI VOWEL SIGN AU
+0A4D GURMUKHI SIGN VIRAMA
+@ Additional consonants
+0A59 GURMUKHI LETTER KHHA
+ : 0A16 0A3C
+0A5A GURMUKHI LETTER GHHA
+ : 0A17 0A3C
+0A5B GURMUKHI LETTER ZA
+ : 0A1C 0A3C
+0A5C GURMUKHI LETTER RRA
+0A5E GURMUKHI LETTER FA
+ : 0A2B 0A3C
+@ Digits
+0A66 GURMUKHI DIGIT ZERO
+0A67 GURMUKHI DIGIT ONE
+0A68 GURMUKHI DIGIT TWO
+0A69 GURMUKHI DIGIT THREE
+0A6A GURMUKHI DIGIT FOUR
+0A6B GURMUKHI DIGIT FIVE
+0A6C GURMUKHI DIGIT SIX
+0A6D GURMUKHI DIGIT SEVEN
+0A6E GURMUKHI DIGIT EIGHT
+0A6F GURMUKHI DIGIT NINE
+@ Gurmukhi-specific additions
+0A70 GURMUKHI TIPPI
+ * nasalization
+0A71 GURMUKHI ADDAK
+ * doubles following consonant
+0A72 GURMUKHI IRI
+ * base for vowels
+0A73 GURMUKHI URA
+ * base for vowels
+0A74 GURMUKHI EK ONKAR
+ * God is One
+@@ 0A80 Gujarati 0AFF
+@ Based on ISCII 1988
+@ Various signs
+0A81 GUJARATI SIGN CANDRABINDU
+0A82 GUJARATI SIGN ANUSVARA
+0A83 GUJARATI SIGN VISARGA
+@ Independent vowels
+0A85 GUJARATI LETTER A
+0A86 GUJARATI LETTER AA
+0A87 GUJARATI LETTER I
+0A88 GUJARATI LETTER II
+0A89 GUJARATI LETTER U
+0A8A GUJARATI LETTER UU
+0A8B GUJARATI LETTER VOCALIC R
+0A8D GUJARATI VOWEL CANDRA E
+0A8F GUJARATI LETTER E
+0A90 GUJARATI LETTER AI
+0A91 GUJARATI VOWEL CANDRA O
+0A93 GUJARATI LETTER O
+0A94 GUJARATI LETTER AU
+@ Consonants
+0A95 GUJARATI LETTER KA
+0A96 GUJARATI LETTER KHA
+0A97 GUJARATI LETTER GA
+0A98 GUJARATI LETTER GHA
+0A99 GUJARATI LETTER NGA
+0A9A GUJARATI LETTER CA
+0A9B GUJARATI LETTER CHA
+0A9C GUJARATI LETTER JA
+0A9D GUJARATI LETTER JHA
+0A9E GUJARATI LETTER NYA
+0A9F GUJARATI LETTER TTA
+0AA0 GUJARATI LETTER TTHA
+0AA1 GUJARATI LETTER DDA
+0AA2 GUJARATI LETTER DDHA
+0AA3 GUJARATI LETTER NNA
+0AA4 GUJARATI LETTER TA
+0AA5 GUJARATI LETTER THA
+0AA6 GUJARATI LETTER DA
+0AA7 GUJARATI LETTER DHA
+0AA8 GUJARATI LETTER NA
+0AAA GUJARATI LETTER PA
+0AAB GUJARATI LETTER PHA
+0AAC GUJARATI LETTER BA
+0AAD GUJARATI LETTER BHA
+0AAE GUJARATI LETTER MA
+0AAF GUJARATI LETTER YA
+0AB0 GUJARATI LETTER RA
+0AB2 GUJARATI LETTER LA
+0AB3 GUJARATI LETTER LLA
+0AB5 GUJARATI LETTER VA
+0AB6 GUJARATI LETTER SHA
+0AB7 GUJARATI LETTER SSA
+0AB8 GUJARATI LETTER SA
+0AB9 GUJARATI LETTER HA
+@ Various signs
+0ABC GUJARATI SIGN NUKTA
+ * for extending the alphabet to new letters
+0ABD GUJARATI SIGN AVAGRAHA
+@ Dependent vowel signs
+0ABE GUJARATI VOWEL SIGN AA
+0ABF GUJARATI VOWEL SIGN I
+ * stands to the left of the consonant
+0AC0 GUJARATI VOWEL SIGN II
+0AC1 GUJARATI VOWEL SIGN U
+0AC2 GUJARATI VOWEL SIGN UU
+0AC3 GUJARATI VOWEL SIGN VOCALIC R
+0AC4 GUJARATI VOWEL SIGN VOCALIC RR
+0AC5 GUJARATI VOWEL SIGN CANDRA E
+0AC7 GUJARATI VOWEL SIGN E
+0AC8 GUJARATI VOWEL SIGN AI
+0AC9 GUJARATI VOWEL SIGN CANDRA O
+0ACB GUJARATI VOWEL SIGN O
+0ACC GUJARATI VOWEL SIGN AU
+@ Various signs
+0ACD GUJARATI SIGN VIRAMA
+0AD0 GUJARATI OM
+@ Generic additions
+0AE0 GUJARATI LETTER VOCALIC RR
+@ Digits
+0AE6 GUJARATI DIGIT ZERO
+0AE7 GUJARATI DIGIT ONE
+0AE8 GUJARATI DIGIT TWO
+0AE9 GUJARATI DIGIT THREE
+0AEA GUJARATI DIGIT FOUR
+0AEB GUJARATI DIGIT FIVE
+0AEC GUJARATI DIGIT SIX
+0AED GUJARATI DIGIT SEVEN
+0AEE GUJARATI DIGIT EIGHT
+0AEF GUJARATI DIGIT NINE
+@@ 0B00 Oriya 0B7F
+@ Based on ISCII 1988
+@ Various signs
+0B01 ORIYA SIGN CANDRABINDU
+0B02 ORIYA SIGN ANUSVARA
+0B03 ORIYA SIGN VISARGA
+@ Independent vowels
+0B05 ORIYA LETTER A
+0B06 ORIYA LETTER AA
+0B07 ORIYA LETTER I
+0B08 ORIYA LETTER II
+0B09 ORIYA LETTER U
+0B0A ORIYA LETTER UU
+0B0B ORIYA LETTER VOCALIC R
+0B0C ORIYA LETTER VOCALIC L
+0B0F ORIYA LETTER E
+0B10 ORIYA LETTER AI
+0B13 ORIYA LETTER O
+0B14 ORIYA LETTER AU
+@ Consonants
+0B15 ORIYA LETTER KA
+0B16 ORIYA LETTER KHA
+0B17 ORIYA LETTER GA
+0B18 ORIYA LETTER GHA
+0B19 ORIYA LETTER NGA
+0B1A ORIYA LETTER CA
+0B1B ORIYA LETTER CHA
+0B1C ORIYA LETTER JA
+0B1D ORIYA LETTER JHA
+0B1E ORIYA LETTER NYA
+0B1F ORIYA LETTER TTA
+0B20 ORIYA LETTER TTHA
+0B21 ORIYA LETTER DDA
+0B22 ORIYA LETTER DDHA
+0B23 ORIYA LETTER NNA
+0B24 ORIYA LETTER TA
+0B25 ORIYA LETTER THA
+0B26 ORIYA LETTER DA
+0B27 ORIYA LETTER DHA
+0B28 ORIYA LETTER NA
+0B2A ORIYA LETTER PA
+0B2B ORIYA LETTER PHA
+0B2C ORIYA LETTER BA
+ = Oriya va, wa
+0B2D ORIYA LETTER BHA
+0B2E ORIYA LETTER MA
+0B2F ORIYA LETTER YA
+0B30 ORIYA LETTER RA
+0B32 ORIYA LETTER LA
+0B33 ORIYA LETTER LLA
+0B35 <reserved>
+ x (oriya letter ba - 0B2C)
+0B36 ORIYA LETTER SHA
+0B37 ORIYA LETTER SSA
+0B38 ORIYA LETTER SA
+0B39 ORIYA LETTER HA
+@ Various signs
+0B3C ORIYA SIGN NUKTA
+ * for extending the alphabet to new letters
+0B3D ORIYA SIGN AVAGRAHA
+@ Dependent vowel signs
+0B3E ORIYA VOWEL SIGN AA
+0B3F ORIYA VOWEL SIGN I
+0B40 ORIYA VOWEL SIGN II
+0B41 ORIYA VOWEL SIGN U
+0B42 ORIYA VOWEL SIGN UU
+0B43 ORIYA VOWEL SIGN VOCALIC R
+0B47 ORIYA VOWEL SIGN E
+ * stands to the left of the consonant
+0B48 ORIYA VOWEL SIGN AI
+ * pieces left of and above the consonant
+ : 0B47 0B56
+0B4B ORIYA VOWEL SIGN O
+ * pieces on both sides of the consonant
+ : 0B47 0B3E
+0B4C ORIYA VOWEL SIGN AU
+ * pieces on both sides of the consonant
+ : 0B47 0B57
+@ Various signs
+0B4D ORIYA SIGN VIRAMA
+0B56 ORIYA AI LENGTH MARK
+0B57 ORIYA AU LENGTH MARK
+@ Additional consonants
+0B5C ORIYA LETTER RRA
+ : 0B21 0B3C
+0B5D ORIYA LETTER RHA
+ : 0B22 0B3C
+0B5F ORIYA LETTER YYA
+@ Generic additions
+0B60 ORIYA LETTER VOCALIC RR
+0B61 ORIYA LETTER VOCALIC LL
+@ Digits
+0B66 ORIYA DIGIT ZERO
+0B67 ORIYA DIGIT ONE
+0B68 ORIYA DIGIT TWO
+0B69 ORIYA DIGIT THREE
+0B6A ORIYA DIGIT FOUR
+0B6B ORIYA DIGIT FIVE
+0B6C ORIYA DIGIT SIX
+0B6D ORIYA DIGIT SEVEN
+0B6E ORIYA DIGIT EIGHT
+0B6F ORIYA DIGIT NINE
+@ Oriya-specific addition
+0B70 ORIYA ISSHAR
+@@ 0B80 Tamil 0BFF
+@ Based on ISCII 1988
+@ Various signs
+0B82 TAMIL SIGN ANUSVARA
+0B83 TAMIL SIGN VISARGA
+ = aytham
+@ Independent vowels
+0B85 TAMIL LETTER A
+0B86 TAMIL LETTER AA
+0B87 TAMIL LETTER I
+0B88 TAMIL LETTER II
+0B89 TAMIL LETTER U
+0B8A TAMIL LETTER UU
+0B8E TAMIL LETTER E
+0B8F TAMIL LETTER EE
+0B90 TAMIL LETTER AI
+0B92 TAMIL LETTER O
+0B93 TAMIL LETTER OO
+0B94 TAMIL LETTER AU
+ : 0B92 0BD7
+@ Consonants
+0B95 TAMIL LETTER KA
+0B99 TAMIL LETTER NGA
+0B9A TAMIL LETTER CA
+0B9C TAMIL LETTER JA
+0B9E TAMIL LETTER NYA
+0B9F TAMIL LETTER TTA
+0BA3 TAMIL LETTER NNA
+0BA4 TAMIL LETTER TA
+0BA8 TAMIL LETTER NA
+0BA9 TAMIL LETTER NNNA
+0BAA TAMIL LETTER PA
+0BAE TAMIL LETTER MA
+0BAF TAMIL LETTER YA
+0BB0 TAMIL LETTER RA
+0BB1 TAMIL LETTER RRA
+0BB2 TAMIL LETTER LA
+0BB3 TAMIL LETTER LLA
+0BB4 TAMIL LETTER LLLA
+0BB5 TAMIL LETTER VA
+0BB7 TAMIL LETTER SSA
+0BB8 TAMIL LETTER SA
+0BB9 TAMIL LETTER HA
+@ Dependent vowel signs
+0BBE TAMIL VOWEL SIGN AA
+0BBF TAMIL VOWEL SIGN I
+0BC0 TAMIL VOWEL SIGN II
+0BC1 TAMIL VOWEL SIGN U
+0BC2 TAMIL VOWEL SIGN UU
+0BC6 TAMIL VOWEL SIGN E
+ * stands to the left of the consonant
+0BC7 TAMIL VOWEL SIGN EE
+ * stands to the left of the consonant
+0BC8 TAMIL VOWEL SIGN AI
+ * stands to the left of the consonant
+0BCA TAMIL VOWEL SIGN O
+ * pieces on both sides of the consonant
+ : 0BC6 0BBE
+0BCB TAMIL VOWEL SIGN OO
+ * pieces on both sides of the consonant
+ : 0BC7 0BBE
+0BCC TAMIL VOWEL SIGN AU
+ * pieces on both sides of the consonant
+ : 0BC6 0BD7
+@ Various signs
+0BCD TAMIL SIGN VIRAMA
+0BD7 TAMIL AU LENGTH MARK
+@ Digits
+0BE6 <reserved>
+ x (digit zero - 0030)
+0BE7 TAMIL DIGIT ONE
+0BE8 TAMIL DIGIT TWO
+0BE9 TAMIL DIGIT THREE
+0BEA TAMIL DIGIT FOUR
+0BEB TAMIL DIGIT FIVE
+0BEC TAMIL DIGIT SIX
+0BED TAMIL DIGIT SEVEN
+0BEE TAMIL DIGIT EIGHT
+0BEF TAMIL DIGIT NINE
+@ Tamil-specific additions
+0BF0 TAMIL NUMBER TEN
+0BF1 TAMIL NUMBER ONE HUNDRED
+0BF2 TAMIL NUMBER ONE THOUSAND
+@@ 0C00 Telugu 0C7F
+@ Based on ISCII 1988
+@ Various signs
+0C01 TELUGU SIGN CANDRABINDU
+0C02 TELUGU SIGN ANUSVARA
+0C03 TELUGU SIGN VISARGA
+@ Independent vowels
+0C05 TELUGU LETTER A
+0C06 TELUGU LETTER AA
+0C07 TELUGU LETTER I
+0C08 TELUGU LETTER II
+0C09 TELUGU LETTER U
+0C0A TELUGU LETTER UU
+0C0B TELUGU LETTER VOCALIC R
+0C0C TELUGU LETTER VOCALIC L
+0C0E TELUGU LETTER E
+0C0F TELUGU LETTER EE
+0C10 TELUGU LETTER AI
+0C12 TELUGU LETTER O
+0C13 TELUGU LETTER OO
+0C14 TELUGU LETTER AU
+@ Consonants
+0C15 TELUGU LETTER KA
+0C16 TELUGU LETTER KHA
+0C17 TELUGU LETTER GA
+0C18 TELUGU LETTER GHA
+0C19 TELUGU LETTER NGA
+0C1A TELUGU LETTER CA
+0C1B TELUGU LETTER CHA
+0C1C TELUGU LETTER JA
+0C1D TELUGU LETTER JHA
+0C1E TELUGU LETTER NYA
+0C1F TELUGU LETTER TTA
+0C20 TELUGU LETTER TTHA
+0C21 TELUGU LETTER DDA
+0C22 TELUGU LETTER DDHA
+0C23 TELUGU LETTER NNA
+0C24 TELUGU LETTER TA
+0C25 TELUGU LETTER THA
+0C26 TELUGU LETTER DA
+0C27 TELUGU LETTER DHA
+0C28 TELUGU LETTER NA
+0C2A TELUGU LETTER PA
+0C2B TELUGU LETTER PHA
+0C2C TELUGU LETTER BA
+0C2D TELUGU LETTER BHA
+0C2E TELUGU LETTER MA
+0C2F TELUGU LETTER YA
+0C30 TELUGU LETTER RA
+0C31 TELUGU LETTER RRA
+0C32 TELUGU LETTER LA
+0C33 TELUGU LETTER LLA
+0C35 TELUGU LETTER VA
+0C36 TELUGU LETTER SHA
+0C37 TELUGU LETTER SSA
+0C38 TELUGU LETTER SA
+0C39 TELUGU LETTER HA
+@ Dependent vowel signs
+0C3E TELUGU VOWEL SIGN AA
+0C3F TELUGU VOWEL SIGN I
+0C40 TELUGU VOWEL SIGN II
+0C41 TELUGU VOWEL SIGN U
+0C42 TELUGU VOWEL SIGN UU
+0C43 TELUGU VOWEL SIGN VOCALIC R
+0C44 TELUGU VOWEL SIGN VOCALIC RR
+0C46 TELUGU VOWEL SIGN E
+0C47 TELUGU VOWEL SIGN EE
+0C48 TELUGU VOWEL SIGN AI
+ : 0C46 0C56
+0C4A TELUGU VOWEL SIGN O
+0C4B TELUGU VOWEL SIGN OO
+0C4C TELUGU VOWEL SIGN AU
+@ Various signs
+0C4D TELUGU SIGN VIRAMA
+0C55 TELUGU LENGTH MARK
+0C56 TELUGU AI LENGTH MARK
+@ Generic additions
+0C60 TELUGU LETTER VOCALIC RR
+0C61 TELUGU LETTER VOCALIC LL
+@ Digits
+0C66 TELUGU DIGIT ZERO
+0C67 TELUGU DIGIT ONE
+0C68 TELUGU DIGIT TWO
+0C69 TELUGU DIGIT THREE
+0C6A TELUGU DIGIT FOUR
+0C6B TELUGU DIGIT FIVE
+0C6C TELUGU DIGIT SIX
+0C6D TELUGU DIGIT SEVEN
+0C6E TELUGU DIGIT EIGHT
+0C6F TELUGU DIGIT NINE
+@@ 0C80 Kannada 0CFF
+@ Based on ISCII 1988
+@ Various signs
+0C82 KANNADA SIGN ANUSVARA
+0C83 KANNADA SIGN VISARGA
+@ Independent vowels
+0C85 KANNADA LETTER A
+0C86 KANNADA LETTER AA
+0C87 KANNADA LETTER I
+0C88 KANNADA LETTER II
+0C89 KANNADA LETTER U
+0C8A KANNADA LETTER UU
+0C8B KANNADA LETTER VOCALIC R
+0C8C KANNADA LETTER VOCALIC L
+0C8E KANNADA LETTER E
+0C8F KANNADA LETTER EE
+0C90 KANNADA LETTER AI
+0C92 KANNADA LETTER O
+0C93 KANNADA LETTER OO
+0C94 KANNADA LETTER AU
+@ Consonants
+0C95 KANNADA LETTER KA
+0C96 KANNADA LETTER KHA
+0C97 KANNADA LETTER GA
+0C98 KANNADA LETTER GHA
+0C99 KANNADA LETTER NGA
+0C9A KANNADA LETTER CA
+0C9B KANNADA LETTER CHA
+0C9C KANNADA LETTER JA
+0C9D KANNADA LETTER JHA
+0C9E KANNADA LETTER NYA
+0C9F KANNADA LETTER TTA
+0CA0 KANNADA LETTER TTHA
+0CA1 KANNADA LETTER DDA
+0CA2 KANNADA LETTER DDHA
+0CA3 KANNADA LETTER NNA
+0CA4 KANNADA LETTER TA
+0CA5 KANNADA LETTER THA
+0CA6 KANNADA LETTER DA
+0CA7 KANNADA LETTER DHA
+0CA8 KANNADA LETTER NA
+0CAA KANNADA LETTER PA
+0CAB KANNADA LETTER PHA
+0CAC KANNADA LETTER BA
+0CAD KANNADA LETTER BHA
+0CAE KANNADA LETTER MA
+0CAF KANNADA LETTER YA
+0CB0 KANNADA LETTER RA
+0CB1 KANNADA LETTER RRA
+0CB2 KANNADA LETTER LA
+0CB3 KANNADA LETTER LLA
+0CB5 KANNADA LETTER VA
+0CB6 KANNADA LETTER SHA
+0CB7 KANNADA LETTER SSA
+0CB8 KANNADA LETTER SA
+0CB9 KANNADA LETTER HA
+@ Dependent vowel signs
+0CBE KANNADA VOWEL SIGN AA
+0CBF KANNADA VOWEL SIGN I
+0CC0 KANNADA VOWEL SIGN II
+ : 0CBF 0CD5
+0CC1 KANNADA VOWEL SIGN U
+0CC2 KANNADA VOWEL SIGN UU
+0CC3 KANNADA VOWEL SIGN VOCALIC R
+0CC4 KANNADA VOWEL SIGN VOCALIC RR
+0CC6 KANNADA VOWEL SIGN E
+0CC7 KANNADA VOWEL SIGN EE
+ : 0CC6 0CD5
+0CC8 KANNADA VOWEL SIGN AI
+ : 0CC6 0CD6
+0CCA KANNADA VOWEL SIGN O
+ : 0CC6 0CC2
+0CCB KANNADA VOWEL SIGN OO
+ : 0CCA 0CD5
+0CCC KANNADA VOWEL SIGN AU
+@ Various signs
+0CCD KANNADA SIGN VIRAMA
+0CD5 KANNADA LENGTH MARK
+0CD6 KANNADA AI LENGTH MARK
+@ Additional consonants
+0CDE KANNADA LETTER FA
+ * obsolete historic letter
+ * name is a mistake for LLLA
+@ Generic additions
+0CE0 KANNADA LETTER VOCALIC RR
+0CE1 KANNADA LETTER VOCALIC LL
+@ Digits
+0CE6 KANNADA DIGIT ZERO
+0CE7 KANNADA DIGIT ONE
+0CE8 KANNADA DIGIT TWO
+0CE9 KANNADA DIGIT THREE
+0CEA KANNADA DIGIT FOUR
+0CEB KANNADA DIGIT FIVE
+0CEC KANNADA DIGIT SIX
+0CED KANNADA DIGIT SEVEN
+0CEE KANNADA DIGIT EIGHT
+0CEF KANNADA DIGIT NINE
+@@ 0D00 Malayalam 0D7F
+@ Based on ISCII 1988
+@ Various signs
+0D02 MALAYALAM SIGN ANUSVARA
+0D03 MALAYALAM SIGN VISARGA
+@ Independent vowels
+0D05 MALAYALAM LETTER A
+0D06 MALAYALAM LETTER AA
+0D07 MALAYALAM LETTER I
+0D08 MALAYALAM LETTER II
+0D09 MALAYALAM LETTER U
+0D0A MALAYALAM LETTER UU
+0D0B MALAYALAM LETTER VOCALIC R
+0D0C MALAYALAM LETTER VOCALIC L
+0D0E MALAYALAM LETTER E
+0D0F MALAYALAM LETTER EE
+0D10 MALAYALAM LETTER AI
+0D12 MALAYALAM LETTER O
+0D13 MALAYALAM LETTER OO
+0D14 MALAYALAM LETTER AU
+@ Consonants
+0D15 MALAYALAM LETTER KA
+0D16 MALAYALAM LETTER KHA
+0D17 MALAYALAM LETTER GA
+0D18 MALAYALAM LETTER GHA
+0D19 MALAYALAM LETTER NGA
+0D1A MALAYALAM LETTER CA
+0D1B MALAYALAM LETTER CHA
+0D1C MALAYALAM LETTER JA
+0D1D MALAYALAM LETTER JHA
+0D1E MALAYALAM LETTER NYA
+0D1F MALAYALAM LETTER TTA
+0D20 MALAYALAM LETTER TTHA
+0D21 MALAYALAM LETTER DDA
+0D22 MALAYALAM LETTER DDHA
+0D23 MALAYALAM LETTER NNA
+0D24 MALAYALAM LETTER TA
+0D25 MALAYALAM LETTER THA
+0D26 MALAYALAM LETTER DA
+0D27 MALAYALAM LETTER DHA
+0D28 MALAYALAM LETTER NA
+0D2A MALAYALAM LETTER PA
+0D2B MALAYALAM LETTER PHA
+0D2C MALAYALAM LETTER BA
+0D2D MALAYALAM LETTER BHA
+0D2E MALAYALAM LETTER MA
+0D2F MALAYALAM LETTER YA
+0D30 MALAYALAM LETTER RA
+0D31 MALAYALAM LETTER RRA
+0D32 MALAYALAM LETTER LA
+0D33 MALAYALAM LETTER LLA
+0D34 MALAYALAM LETTER LLLA
+0D35 MALAYALAM LETTER VA
+0D36 MALAYALAM LETTER SHA
+0D37 MALAYALAM LETTER SSA
+0D38 MALAYALAM LETTER SA
+0D39 MALAYALAM LETTER HA
+@ Dependent vowel signs
+0D3E MALAYALAM VOWEL SIGN AA
+0D3F MALAYALAM VOWEL SIGN I
+0D40 MALAYALAM VOWEL SIGN II
+0D41 MALAYALAM VOWEL SIGN U
+0D42 MALAYALAM VOWEL SIGN UU
+0D43 MALAYALAM VOWEL SIGN VOCALIC R
+0D46 MALAYALAM VOWEL SIGN E
+ * stands to the left of the consonant
+0D47 MALAYALAM VOWEL SIGN EE
+ * stands to the left of the consonant
+0D48 MALAYALAM VOWEL SIGN AI
+ * stands to the left of the consonant
+0D49 <reserved>
+0D4A MALAYALAM VOWEL SIGN O
+ * pieces on both sides of the consonant
+ : 0D46 0D3E
+0D4B MALAYALAM VOWEL SIGN OO
+ * pieces on both sides of the consonant
+ : 0D47 0D3E
+0D4C MALAYALAM VOWEL SIGN AU
+ * pieces on both sides of the consonant
+ : 0D46 0D57
+@ Various signs
+0D4D MALAYALAM SIGN VIRAMA
+ = vowel half-u
+0D57 MALAYALAM AU LENGTH MARK
+@ Generic additions
+0D60 MALAYALAM LETTER VOCALIC RR
+0D61 MALAYALAM LETTER VOCALIC LL
+@ Digits
+0D66 MALAYALAM DIGIT ZERO
+0D67 MALAYALAM DIGIT ONE
+0D68 MALAYALAM DIGIT TWO
+0D69 MALAYALAM DIGIT THREE
+0D6A MALAYALAM DIGIT FOUR
+0D6B MALAYALAM DIGIT FIVE
+0D6C MALAYALAM DIGIT SIX
+0D6D MALAYALAM DIGIT SEVEN
+0D6E MALAYALAM DIGIT EIGHT
+0D6F MALAYALAM DIGIT NINE
+@@ 0D80 Sinhala 0DFF
+@ Various signs
+0D82 SINHALA SIGN ANUSVARAYA
+ = anusvara
+0D83 SINHALA SIGN VISARGAYA
+ = visarga
+@ Independent vowels
+0D85 SINHALA LETTER AYANNA
+ = sinhala letter a
+0D86 SINHALA LETTER AAYANNA
+ = sinhala letter aa
+0D87 SINHALA LETTER AEYANNA
+ = sinhala letter ae
+0D88 SINHALA LETTER AEEYANNA
+ = sinhala letter aae
+0D89 SINHALA LETTER IYANNA
+ = sinhala letter i
+0D8A SINHALA LETTER IIYANNA
+ = sinhala letter ii
+0D8B SINHALA LETTER UYANNA
+ = sinhala letter u
+0D8C SINHALA LETTER UUYANNA
+ = sinhala letter uu
+0D8D SINHALA LETTER IRUYANNA
+ = sinhala letter vocalic r
+0D8E SINHALA LETTER IRUUYANNA
+ = sinhala letter vocalic rr
+0D8F SINHALA LETTER ILUYANNA
+ = sinhala letter vocalic l
+0D90 SINHALA LETTER ILUUYANNA
+ = sinhala letter vocalic ll
+0D91 SINHALA LETTER EYANNA
+ = sinhala letter e
+0D92 SINHALA LETTER EEYANNA
+ = sinhala letter ee
+0D93 SINHALA LETTER AIYANNA
+ = sinhala letter ai
+0D94 SINHALA LETTER OYANNA
+ = sinhala letter o
+0D95 SINHALA LETTER OOYANNA
+ = sinhala letter oo
+0D96 SINHALA LETTER AUYANNA
+ = sinhala letter au
+@ Consonants
+0D9A SINHALA LETTER ALPAPRAANA KAYANNA
+ = sinhala letter ka
+0D9B SINHALA LETTER MAHAAPRAANA KAYANNA
+ = sinhala letter kha
+0D9C SINHALA LETTER ALPAPRAANA GAYANNA
+ = sinhala letter ga
+0D9D SINHALA LETTER MAHAAPRAANA GAYANNA
+ = sinhala letter gha
+0D9E SINHALA LETTER KANTAJA NAASIKYAYA
+ = sinhala letter nga
+0D9F SINHALA LETTER SANYAKA GAYANNA
+ = sinhala letter nnga
+0DA0 SINHALA LETTER ALPAPRAANA CAYANNA
+ = sinhala letter ca
+0DA1 SINHALA LETTER MAHAAPRAANA CAYANNA
+ = sinhala letter cha
+0DA2 SINHALA LETTER ALPAPRAANA JAYANNA
+ = sinhala letter ja
+0DA3 SINHALA LETTER MAHAAPRAANA JAYANNA
+ = sinhala letter jha
+0DA4 SINHALA LETTER TAALUJA NAASIKYAYA
+ = sinhala letter nya
+0DA5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+ = sinhala letter jnya
+0DA6 SINHALA LETTER SANYAKA JAYANNA
+ = sinhala letter nyja
+0DA7 SINHALA LETTER ALPAPRAANA TTAYANNA
+ = sinhala letter tta
+0DA8 SINHALA LETTER MAHAAPRAANA TTAYANNA
+ = sinhala letter ttha
+0DA9 SINHALA LETTER ALPAPRAANA DDAYANNA
+ = sinhala letter dda
+0DAA SINHALA LETTER MAHAAPRAANA DDAYANNA
+ = sinhala letter ddha
+0DAB SINHALA LETTER MUURDHAJA NAYANNA
+ = sinhala letter nna
+0DAC SINHALA LETTER SANYAKA DDAYANNA
+ = sinhala letter nndda
+0DAD SINHALA LETTER ALPAPRAANA TAYANNA
+ = sinhala letter ta
+0DAE SINHALA LETTER MAHAAPRAANA TAYANNA
+ = sinhala letter tha
+0DAF SINHALA LETTER ALPAPRAANA DAYANNA
+ = sinhala letter da
+0DB0 SINHALA LETTER MAHAAPRAANA DAYANNA
+ = sinhala letter dha
+0DB1 SINHALA LETTER DANTAJA NAYANNA
+ = sinhala letter na
+0DB3 SINHALA LETTER SANYAKA DAYANNA
+ = sinhala letter nda
+0DB4 SINHALA LETTER ALPAPRAANA PAYANNA
+ = sinhala letter pa
+0DB5 SINHALA LETTER MAHAAPRAANA PAYANNA
+ = sinhala letter pha
+0DB6 SINHALA LETTER ALPAPRAANA BAYANNA
+ = sinhala letter ba
+0DB7 SINHALA LETTER MAHAAPRAANA BAYANNA
+ = sinhala letter bha
+0DB8 SINHALA LETTER MAYANNA
+ = sinhala letter ma
+0DB9 SINHALA LETTER AMBA BAYANNA
+ = sinhala letter mba
+0DBA SINHALA LETTER YAYANNA
+ = sinhala letter ya
+0DBB SINHALA LETTER RAYANNA
+ = sinhala letter ra
+0DBD SINHALA LETTER DANTAJA LAYANNA
+ = sinhala letter la
+ * dental
+0DC0 SINHALA LETTER VAYANNA
+ = sinhala letter va
+0DC1 SINHALA LETTER TAALUJA SAYANNA
+ = sinhala letter sha
+0DC2 SINHALA LETTER MUURDHAJA SAYANNA
+ = sinhala letter ssa
+ * retroflex
+0DC3 SINHALA LETTER DANTAJA SAYANNA
+ = sinhala letter sa
+ * dental
+0DC4 SINHALA LETTER HAYANNA
+ = sinhala letter ha
+0DC5 SINHALA LETTER MUURDHAJA LAYANNA
+ = sinhala letter lla
+ * retroflex
+0DC6 SINHALA LETTER FAYANNA
+ = sinhala letter fa
+@ Sign
+0DCA SINHALA SIGN AL-LAKUNA
+ = virama
+@ Dependent vowel signs
+0DCF SINHALA VOWEL SIGN AELA-PILLA
+ = sinhala vowel sign aa
+0DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA
+ = sinhala vowel sign ae
+0DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA
+ = sinhala vowel sign aae
+0DD2 SINHALA VOWEL SIGN KETTI IS-PILLA
+ = sinhala vowel sign i
+0DD3 SINHALA VOWEL SIGN DIGA IS-PILLA
+ = sinhala vowel sign ii
+0DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA
+ = sinhala vowel sign u
+0DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA
+ = sinhala vowel sign uu
+0DD8 SINHALA VOWEL SIGN GAETTA-PILLA
+ = sinhala vowel sign vocalic r
+0DD9 SINHALA VOWEL SIGN KOMBUVA
+ = sinhala vowel sign e
+0DDA SINHALA VOWEL SIGN DIGA KOMBUVA
+ = sinhala vowel sign ee
+ : 0DD9 0DCA
+0DDB SINHALA VOWEL SIGN KOMBU DEKA
+ = sinhala vowel sign ai
+0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+ = sinhala vowel sign o
+ : 0DD9 0DCF
+0DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+ = sinhala vowel sign oo
+ : 0DDC 0DCA
+0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+ = sinhala vowel sign au
+ : 0DD9 0DDF
+0DDF SINHALA VOWEL SIGN GAYANUKITTA
+ = sinhala vowel sign vocalic l
+@ Additional dependent vowel signs
+0DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+ = sinhala vowel sign vocalic rr
+0DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA
+ = sinhala vowel sign vocalic ll
+@ Punctuation
+0DF4 SINHALA PUNCTUATION KUNDDALIYA
+@@ 0E00 Thai 0E7F
+@ Based on TIS 620-2533
+@ Consonants
+0E01 THAI CHARACTER KO KAI
+0E02 THAI CHARACTER KHO KHAI
+0E03 THAI CHARACTER KHO KHUAT
+0E04 THAI CHARACTER KHO KHWAI
+0E05 THAI CHARACTER KHO KHON
+0E06 THAI CHARACTER KHO RAKHANG
+0E07 THAI CHARACTER NGO NGU
+0E08 THAI CHARACTER CHO CHAN
+0E09 THAI CHARACTER CHO CHING
+0E0A THAI CHARACTER CHO CHANG
+0E0B THAI CHARACTER SO SO
+0E0C THAI CHARACTER CHO CHOE
+0E0D THAI CHARACTER YO YING
+0E0E THAI CHARACTER DO CHADA
+0E0F THAI CHARACTER TO PATAK
+0E10 THAI CHARACTER THO THAN
+0E11 THAI CHARACTER THO NANGMONTHO
+0E12 THAI CHARACTER THO PHUTHAO
+0E13 THAI CHARACTER NO NEN
+0E14 THAI CHARACTER DO DEK
+0E15 THAI CHARACTER TO TAO
+0E16 THAI CHARACTER THO THUNG
+0E17 THAI CHARACTER THO THAHAN
+0E18 THAI CHARACTER THO THONG
+0E19 THAI CHARACTER NO NU
+0E1A THAI CHARACTER BO BAIMAI
+0E1B THAI CHARACTER PO PLA
+0E1C THAI CHARACTER PHO PHUNG
+0E1D THAI CHARACTER FO FA
+0E1E THAI CHARACTER PHO PHAN
+0E1F THAI CHARACTER FO FAN
+0E20 THAI CHARACTER PHO SAMPHAO
+0E21 THAI CHARACTER MO MA
+0E22 THAI CHARACTER YO YAK
+0E23 THAI CHARACTER RO RUA
+0E24 THAI CHARACTER RU
+ * independent vowel letter used to write Sanskrit
+0E25 THAI CHARACTER LO LING
+0E26 THAI CHARACTER LU
+ * independent vowel letter used to write Sanskrit
+0E27 THAI CHARACTER WO WAEN
+0E28 THAI CHARACTER SO SALA
+0E29 THAI CHARACTER SO RUSI
+0E2A THAI CHARACTER SO SUA
+0E2B THAI CHARACTER HO HIP
+0E2C THAI CHARACTER LO CHULA
+0E2D THAI CHARACTER O ANG
+0E2E THAI CHARACTER HO NOKHUK
+@ Sign
+0E2F THAI CHARACTER PAIYANNOI (paiyan noi)
+ * ellipsis, abbreviation
+@ Vowels
+0E30 THAI CHARACTER SARA A
+0E31 THAI CHARACTER MAI HAN-AKAT
+0E32 THAI CHARACTER SARA AA
+0E33 THAI CHARACTER SARA AM
+ # 0E4D 0E32
+0E34 THAI CHARACTER SARA I
+0E35 THAI CHARACTER SARA II
+0E36 THAI CHARACTER SARA UE
+0E37 THAI CHARACTER SARA UEE (sara uue)
+ = sara uue
+0E38 THAI CHARACTER SARA U
+0E39 THAI CHARACTER SARA UU
+0E3A THAI CHARACTER PHINTHU
+ * Pali virama
+@ Currency symbol
+0E3F THAI CURRENCY SYMBOL BAHT
+@ Vowels
+0E40 THAI CHARACTER SARA E
+0E41 THAI CHARACTER SARA AE
+0E42 THAI CHARACTER SARA O
+0E43 THAI CHARACTER SARA AI MAIMUAN (sara ai mai muan)
+0E44 THAI CHARACTER SARA AI MAIMALAI (sara ai mai malai)
+@ Signs
+0E45 THAI CHARACTER LAKKHANGYAO (lakkhang yao)
+0E46 THAI CHARACTER MAIYAMOK (mai yamok)
+ * repetition
+@ Vowel
+0E47 THAI CHARACTER MAITAIKHU (mai taikhu)
+@ Tone marks
+0E48 THAI CHARACTER MAI EK
+0E49 THAI CHARACTER MAI THO
+0E4A THAI CHARACTER MAI TRI
+0E4B THAI CHARACTER MAI CHATTAWA
+@ Signs
+0E4C THAI CHARACTER THANTHAKHAT
+ * cancellation mark
+0E4D THAI CHARACTER NIKHAHIT (nikkhahit)
+ = nikkhahit
+ * final nasal
+0E4E THAI CHARACTER YAMAKKAN
+0E4F THAI CHARACTER FONGMAN
+ * used as a bullet
+ x (khmer sign phnaek muan - 17D9)
+@ Digits
+0E50 THAI DIGIT ZERO
+0E51 THAI DIGIT ONE
+0E52 THAI DIGIT TWO
+0E53 THAI DIGIT THREE
+0E54 THAI DIGIT FOUR
+0E55 THAI DIGIT FIVE
+0E56 THAI DIGIT SIX
+0E57 THAI DIGIT SEVEN
+0E58 THAI DIGIT EIGHT
+0E59 THAI DIGIT NINE
+@ Signs
+0E5A THAI CHARACTER ANGKHANKHU
+ * used to mark end of long sections
+ * used in combination with 0E30 to mark end of a verse
+0E5B THAI CHARACTER KHOMUT
+ * used to mark end of chapter or document
+ x (khmer sign koomuut - 17DA)
+@@ 0E80 Lao 0EFF
+@ Based on TIS 620-2529
+@ Consonants
+0E81 LAO LETTER KO
+0E82 LAO LETTER KHO SUNG
+0E84 LAO LETTER KHO TAM
+0E87 LAO LETTER NGO
+0E88 LAO LETTER CO
+0E8A LAO LETTER SO TAM
+0E8D LAO LETTER NYO
+0E94 LAO LETTER DO
+0E95 LAO LETTER TO
+0E96 LAO LETTER THO SUNG
+0E97 LAO LETTER THO TAM
+0E99 LAO LETTER NO
+0E9A LAO LETTER BO
+0E9B LAO LETTER PO
+0E9C LAO LETTER PHO SUNG
+0E9D LAO LETTER FO TAM
+0E9E LAO LETTER PHO TAM
+0E9F LAO LETTER FO SUNG
+0EA1 LAO LETTER MO
+0EA2 LAO LETTER YO
+0EA3 LAO LETTER LO LING
+0EA5 LAO LETTER LO LOOT
+0EA7 LAO LETTER WO
+0EAA LAO LETTER SO SUNG
+0EAB LAO LETTER HO SUNG
+0EAD LAO LETTER O
+0EAE LAO LETTER HO TAM
+@ Sign
+0EAF LAO ELLIPSIS
+@ Vowels
+0EB0 LAO VOWEL SIGN A
+0EB1 LAO VOWEL SIGN MAI KAN
+ * vowel shortener
+0EB2 LAO VOWEL SIGN AA
+0EB3 LAO VOWEL SIGN AM
+ # 0ECD 0EB2
+0EB4 LAO VOWEL SIGN I
+0EB5 LAO VOWEL SIGN II
+0EB6 LAO VOWEL SIGN Y
+0EB7 LAO VOWEL SIGN YY
+0EB8 LAO VOWEL SIGN U
+0EB9 LAO VOWEL SIGN UU
+0EBB LAO VOWEL SIGN MAI KON
+@ Signs
+0EBC LAO SEMIVOWEL SIGN LO
+0EBD LAO SEMIVOWEL SIGN NYO
+@ Vowels
+0EC0 LAO VOWEL SIGN E
+0EC1 LAO VOWEL SIGN EI
+0EC2 LAO VOWEL SIGN O
+0EC3 LAO VOWEL SIGN AY
+0EC4 LAO VOWEL SIGN AI
+@ Sign
+0EC6 LAO KO LA
+ * repetition
+@ Tone marks
+0EC8 LAO TONE MAI EK
+0EC9 LAO TONE MAI THO
+0ECA LAO TONE MAI TI
+0ECB LAO TONE MAI CATAWA
+@ Signs
+0ECC LAO CANCELLATION MARK
+0ECD LAO NIGGAHITA
+ * final nasal
+@ Digits
+0ED0 LAO DIGIT ZERO
+0ED1 LAO DIGIT ONE
+0ED2 LAO DIGIT TWO
+0ED3 LAO DIGIT THREE
+0ED4 LAO DIGIT FOUR
+0ED5 LAO DIGIT FIVE
+0ED6 LAO DIGIT SIX
+0ED7 LAO DIGIT SEVEN
+0ED8 LAO DIGIT EIGHT
+0ED9 LAO DIGIT NINE
+@ Digraphs
+0EDC LAO HO NO
+ # 0EAB 0E99
+0EDD LAO HO MO
+ # 0EAB 0EA1
+@@ 0F00 Tibetan 0FFF
+@ Syllable
+0F00 TIBETAN SYLLABLE OM
+@ Head marks
+0F01 TIBETAN MARK GTER YIG MGO TRUNCATED A (ter yik go a thung)
+0F02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA (ter yik go wum nam chey ma)
+0F03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA (ter yik go wum ter tsek ma)
+0F04 TIBETAN MARK INITIAL YIG MGO MDUN MA (yik go dun ma)
+ * honorific; marks beginning of text or start of new folio
+ x (mongolian birga - 1800)
+0F05 TIBETAN MARK CLOSING YIG MGO SGAB MA (yik go kab ma)
+ * follows and ligates with initial yig-mgo
+0F06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA (yik go pur shey ma)
+0F07 TIBETAN MARK YIG MGO TSHEG SHAD MA (yik go tsek shey ma)
+@ Marks and signs
+0F08 TIBETAN MARK SBRUL SHAD (drul shey)
+ * separates sections of meaning equivalent to topics and sub-topics
+0F09 TIBETAN MARK BSKUR YIG MGO (kur yik go)
+ * list enumerator, used in Bhutan
+0F0A TIBETAN MARK BKA- SHOG YIG MGO (ka sho yik go)
+ * petition honorific, used in Bhutan
+0F0B TIBETAN MARK INTERSYLLABIC TSHEG (tsek)
+ * morpheme delimiter (approximate meaning)
+ * the normal tsheg; provides a break opportunity
+ * character name is a misnomer
+0F0C TIBETAN MARK DELIMITER TSHEG BSTAR (tsek tar)
+ * a non-breaking tsheg; inhibits line breaking
+ * character name is a misnomer
+ # <noBreak> 0F0B
+0F0D TIBETAN MARK SHAD (shey)
+ * marks end of a section of text (tshig-grub)
+ x (devanagari danda - 0964)
+0F0E TIBETAN MARK NYIS SHAD (nyi shey)
+ * marks end of a whole topic (don-tshan)
+ x (devanagari double danda - 0965)
+0F0F TIBETAN MARK TSHEG SHAD (tsek shey)
+0F10 TIBETAN MARK NYIS TSHEG SHAD (nyi tsek shey)
+0F11 TIBETAN MARK RIN CHEN SPUNGS SHAD (rinchen pung shey)
+ * shad which follows a tsheg-bar that starts a new line
+0F12 TIBETAN MARK RGYA GRAM SHAD (gya tram shey)
+0F13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN (dzu ta me long chen)
+0F14 TIBETAN MARK GTER TSHEG (ter tsek)
+ * used as a comma-like text delimiter
+ x (khmer sign camnuc pii kuuh - 17D6)
+@ Astrological signs
+0F15 TIBETAN LOGOTYPE SIGN CHAD RTAGS (che ta)
+0F16 TIBETAN LOGOTYPE SIGN LHAG RTAGS (hlak ta)
+0F17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS (trachen char ta)
+0F18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA (kyu pa)
+ * combines with digits
+0F19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS (dong tsu)
+ * combines with digits
+0F1A TIBETAN SIGN RDEL DKAR GCIG (deka chig)
+0F1B TIBETAN SIGN RDEL DKAR GNYIS (deka nyi)
+0F1C TIBETAN SIGN RDEL DKAR GSUM (deka sum)
+0F1D TIBETAN SIGN RDEL NAG GCIG (dena chig)
+0F1E TIBETAN SIGN RDEL NAG GNYIS (dena nyi)
+0F1F TIBETAN SIGN RDEL DKAR RDEL NAG (deka dena)
+@ Digits
+0F20 TIBETAN DIGIT ZERO
+0F21 TIBETAN DIGIT ONE
+0F22 TIBETAN DIGIT TWO
+0F23 TIBETAN DIGIT THREE
+0F24 TIBETAN DIGIT FOUR
+0F25 TIBETAN DIGIT FIVE
+0F26 TIBETAN DIGIT SIX
+0F27 TIBETAN DIGIT SEVEN
+0F28 TIBETAN DIGIT EIGHT
+0F29 TIBETAN DIGIT NINE
+@ Digits minus half
+0F2A TIBETAN DIGIT HALF ONE
+0F2B TIBETAN DIGIT HALF TWO
+0F2C TIBETAN DIGIT HALF THREE
+0F2D TIBETAN DIGIT HALF FOUR
+0F2E TIBETAN DIGIT HALF FIVE
+0F2F TIBETAN DIGIT HALF SIX
+0F30 TIBETAN DIGIT HALF SEVEN
+0F31 TIBETAN DIGIT HALF EIGHT
+0F32 TIBETAN DIGIT HALF NINE
+0F33 TIBETAN DIGIT HALF ZERO
+@ Marks and signs
+0F34 TIBETAN MARK BSDUS RTAGS (du ta)
+ * repetition
+0F35 TIBETAN MARK NGAS BZUNG NYI ZLA (nge zung nyi da)
+ * honorific, emphasis; used like underlining
+0F36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN (dzu ta shi mig chen)
+ * marks point of text insertion or annotation
+0F37 TIBETAN MARK NGAS BZUNG SGOR RTAGS (nge zung gor ta)
+ * emphasis; used like underlining
+0F38 TIBETAN MARK CHE MGO (che go)
+0F39 TIBETAN MARK TSA -PHRU (tsa tru)
+ * a lenition mark
+@ Paired punctuation
+0F3A TIBETAN MARK GUG RTAGS GYON (gug ta yun)
+0F3B TIBETAN MARK GUG RTAGS GYAS (gug ta ye)
+ * brackets
+0F3C TIBETAN MARK ANG KHANG GYON (ang kang yun)
+0F3D TIBETAN MARK ANG KHANG GYAS (ang kang ye)
+ * used for bracketing with a roof over
+@ Astrological signs
+0F3E TIBETAN SIGN YAR TSHES (yar tse)
+0F3F TIBETAN SIGN MAR TSHES (mar tse)
+ * marks which combine with digits
+@ Consonants
+0F40 TIBETAN LETTER KA
+0F41 TIBETAN LETTER KHA
+0F42 TIBETAN LETTER GA
+0F43 TIBETAN LETTER GHA
+ : 0F42 0FB7
+0F44 TIBETAN LETTER NGA
+0F45 TIBETAN LETTER CA
+0F46 TIBETAN LETTER CHA
+0F47 TIBETAN LETTER JA
+0F49 TIBETAN LETTER NYA
+0F4A TIBETAN LETTER TTA
+0F4B TIBETAN LETTER TTHA
+0F4C TIBETAN LETTER DDA
+0F4D TIBETAN LETTER DDHA
+ : 0F4C 0FB7
+0F4E TIBETAN LETTER NNA
+0F4F TIBETAN LETTER TA
+0F50 TIBETAN LETTER THA
+0F51 TIBETAN LETTER DA
+0F52 TIBETAN LETTER DHA
+ : 0F51 0FB7
+0F53 TIBETAN LETTER NA
+0F54 TIBETAN LETTER PA
+0F55 TIBETAN LETTER PHA
+0F56 TIBETAN LETTER BA
+0F57 TIBETAN LETTER BHA
+ : 0F56 0FB7
+0F58 TIBETAN LETTER MA
+0F59 TIBETAN LETTER TSA
+0F5A TIBETAN LETTER TSHA
+0F5B TIBETAN LETTER DZA
+0F5C TIBETAN LETTER DZHA
+ : 0F5B 0FB7
+0F5D TIBETAN LETTER WA
+0F5E TIBETAN LETTER ZHA
+0F5F TIBETAN LETTER ZA
+0F60 TIBETAN LETTER -A
+0F61 TIBETAN LETTER YA
+0F62 TIBETAN LETTER RA *
+ * when followed by a subjoined letter = ra mgo
+0F63 TIBETAN LETTER LA
+0F64 TIBETAN LETTER SHA
+0F65 TIBETAN LETTER SSA
+ = reversed sha
+0F66 TIBETAN LETTER SA
+0F67 TIBETAN LETTER HA
+0F68 TIBETAN LETTER A
+ * base for dependent vowels
+0F69 TIBETAN LETTER KSSA
+ : 0F40 0FB5
+0F6A TIBETAN LETTER FIXED-FORM RA *
+ * used only in transliteration and transcription
+@ Dependent vowel signs
+0F71 TIBETAN VOWEL SIGN AA
+ = a-chung
+ * common, vowel-lengthening mark
+0F72 TIBETAN VOWEL SIGN I
+0F73 TIBETAN VOWEL SIGN II
+ * use of this character is discouraged
+ : 0F71 0F72
+0F74 TIBETAN VOWEL SIGN U
+0F75 TIBETAN VOWEL SIGN UU
+ * use of this character is discouraged
+ : 0F71 0F74
+0F76 TIBETAN VOWEL SIGN VOCALIC R
+ : 0FB2 0F80
+0F77 TIBETAN VOWEL SIGN VOCALIC RR
+ * use of this character is strongly discouraged
+ # 0FB2 0F81
+0F78 TIBETAN VOWEL SIGN VOCALIC L
+ : 0FB3 0F80
+0F79 TIBETAN VOWEL SIGN VOCALIC LL
+ * use of this character is strongly discouraged
+ # 0FB3 0F81
+0F7A TIBETAN VOWEL SIGN E
+0F7B TIBETAN VOWEL SIGN EE
+0F7C TIBETAN VOWEL SIGN O
+0F7D TIBETAN VOWEL SIGN OO
+@ Vocalic modification
+0F7E TIBETAN SIGN RJES SU NGA RO (je su nga ro)
+ = anusvara
+0F7F TIBETAN SIGN RNAM BCAD (nam chey)
+ = visarga
+@ Dependent vowel signs
+0F80 TIBETAN VOWEL SIGN REVERSED I
+0F81 TIBETAN VOWEL SIGN REVERSED II
+ * use of this character is discouraged
+ : 0F71 0F80
+@ Marks and signs
+0F82 TIBETAN SIGN NYI ZLA NAA DA (nyi da na da)
+0F83 TIBETAN SIGN SNA LDAN (nan de)
+ x (devanagari sign candrabindu - 0901)
+0F84 TIBETAN MARK HALANTA
+ = srog med
+ x (devanagari sign virama - 094D)
+0F85 TIBETAN MARK PALUTA
+0F86 TIBETAN SIGN LCI RTAGS (ji ta)
+0F87 TIBETAN SIGN YANG RTAGS (yang ta)
+@ Transliteration head letters
+0F88 TIBETAN SIGN LCE TSA CAN (che tsa chen)
+0F89 TIBETAN SIGN MCHU CAN (chu chen)
+0F8A TIBETAN SIGN GRU CAN RGYINGS (tru chen ging)
+ * always followed by 0F82
+0F8B TIBETAN SIGN GRU MED RGYINGS (tru me ging)
+@ Subjoined consonants
+0F90 TIBETAN SUBJOINED LETTER KA
+0F91 TIBETAN SUBJOINED LETTER KHA
+0F92 TIBETAN SUBJOINED LETTER GA
+0F93 TIBETAN SUBJOINED LETTER GHA
+ : 0F92 0FB7
+0F94 TIBETAN SUBJOINED LETTER NGA
+0F95 TIBETAN SUBJOINED LETTER CA
+0F96 TIBETAN SUBJOINED LETTER CHA
+0F97 TIBETAN SUBJOINED LETTER JA
+0F99 TIBETAN SUBJOINED LETTER NYA
+0F9A TIBETAN SUBJOINED LETTER TTA
+0F9B TIBETAN SUBJOINED LETTER TTHA
+0F9C TIBETAN SUBJOINED LETTER DDA
+0F9D TIBETAN SUBJOINED LETTER DDHA
+ : 0F9C 0FB7
+0F9E TIBETAN SUBJOINED LETTER NNA
+0F9F TIBETAN SUBJOINED LETTER TA
+0FA0 TIBETAN SUBJOINED LETTER THA
+0FA1 TIBETAN SUBJOINED LETTER DA
+0FA2 TIBETAN SUBJOINED LETTER DHA
+ : 0FA1 0FB7
+0FA3 TIBETAN SUBJOINED LETTER NA
+0FA4 TIBETAN SUBJOINED LETTER PA
+0FA5 TIBETAN SUBJOINED LETTER PHA
+0FA6 TIBETAN SUBJOINED LETTER BA
+0FA7 TIBETAN SUBJOINED LETTER BHA
+ : 0FA6 0FB7
+0FA8 TIBETAN SUBJOINED LETTER MA
+0FA9 TIBETAN SUBJOINED LETTER TSA
+0FAA TIBETAN SUBJOINED LETTER TSHA
+0FAB TIBETAN SUBJOINED LETTER DZA
+0FAC TIBETAN SUBJOINED LETTER DZHA
+ : 0FAB 0FB7
+0FAD TIBETAN SUBJOINED LETTER WA *
+ = wa-zur, wa-btags
+0FAE TIBETAN SUBJOINED LETTER ZHA
+0FAF TIBETAN SUBJOINED LETTER ZA
+0FB0 TIBETAN SUBJOINED LETTER -A
+ = a-chung
+ * rare, only used for full-sized subjoined letter
+ x (tibetan vowel sign aa - 0F71)
+0FB1 TIBETAN SUBJOINED LETTER YA *
+ = ya-btags
+0FB2 TIBETAN SUBJOINED LETTER RA *
+ = ra-btags
+0FB3 TIBETAN SUBJOINED LETTER LA
+0FB4 TIBETAN SUBJOINED LETTER SHA
+0FB5 TIBETAN SUBJOINED LETTER SSA
+ = reversed subjoined sha
+0FB6 TIBETAN SUBJOINED LETTER SA
+0FB7 TIBETAN SUBJOINED LETTER HA
+0FB8 TIBETAN SUBJOINED LETTER A
+0FB9 TIBETAN SUBJOINED LETTER KSSA
+ : 0F90 0FB5
+@ Fixed-form subjoined consonants
+@+ These characters are used only for transliteration and transcription.
+0FBA TIBETAN SUBJOINED LETTER FIXED-FORM WA *
+0FBB TIBETAN SUBJOINED LETTER FIXED-FORM YA *
+0FBC TIBETAN SUBJOINED LETTER FIXED-FORM RA *
+@ Signs
+0FBE TIBETAN KU RU KHA (kuruka)
+ * often repeated three times; indicates a refrain
+0FBF TIBETAN KU RU KHA BZHI MIG CAN (kuruka shi mik chen)
+ * marks point of text insertion or annotation
+ x (reference mark - 203B)
+@ Cantillation signs
+0FC0 TIBETAN CANTILLATION SIGN HEAVY BEAT
+ * marks a heavy drum beat
+0FC1 TIBETAN CANTILLATION SIGN LIGHT BEAT
+ * marks a light drum beat
+0FC2 TIBETAN CANTILLATION SIGN CANG TE-U (chang tyu)
+ * symbol of a small Tibetan hand drum
+0FC3 TIBETAN CANTILLATION SIGN SBUB -CHAL (bub chey)
+ * symbol of a Tibetan cymbal
+@ Symbols
+0FC4 TIBETAN SYMBOL DRIL BU (drilbu)
+ * symbol of a Tibetan hand bell
+0FC5 TIBETAN SYMBOL RDO RJE (dorje)
+0FC6 TIBETAN SYMBOL PADMA GDAN (pema den)
+0FC7 TIBETAN SYMBOL RDO RJE RGYA GRAM (dorje gya dram)
+0FC8 TIBETAN SYMBOL PHUR PA (phurba)
+0FC9 TIBETAN SYMBOL NOR BU (norbu)
+0FCA TIBETAN SYMBOL NOR BU NYIS -KHYIL (norbu nyi khyi)
+ * the double body symbol
+ x (yin yang - 262F)
+0FCB TIBETAN SYMBOL NOR BU GSUM -KHYIL (norbu sum khyi)
+ * the tri-kaya or triple body symbol
+0FCC TIBETAN SYMBOL NOR BU BZHI -KHYIL (norbu shi khyi)
+ * the quadruple body symbol, a form of the swastika
+ x (cjk unified ideograph-534D - 534D)
+@ Astrological sign
+0FCF TIBETAN SIGN RDEL NAG GSUM
+@@ 1000 Myanmar 109F
+@ Consonants
+1000 MYANMAR LETTER KA
+1001 MYANMAR LETTER KHA
+1002 MYANMAR LETTER GA
+1003 MYANMAR LETTER GHA
+1004 MYANMAR LETTER NGA
+1005 MYANMAR LETTER CA
+1006 MYANMAR LETTER CHA
+1007 MYANMAR LETTER JA
+1008 MYANMAR LETTER JHA
+1009 MYANMAR LETTER NYA
+100A MYANMAR LETTER NNYA
+100B MYANMAR LETTER TTA
+100C MYANMAR LETTER TTHA
+100D MYANMAR LETTER DDA
+100E MYANMAR LETTER DDHA
+100F MYANMAR LETTER NNA
+1010 MYANMAR LETTER TA
+1011 MYANMAR LETTER THA
+1012 MYANMAR LETTER DA
+1013 MYANMAR LETTER DHA
+1014 MYANMAR LETTER NA
+1015 MYANMAR LETTER PA
+1016 MYANMAR LETTER PHA
+1017 MYANMAR LETTER BA
+1018 MYANMAR LETTER BHA
+1019 MYANMAR LETTER MA
+101A MYANMAR LETTER YA
+101B MYANMAR LETTER RA
+101C MYANMAR LETTER LA
+101D MYANMAR LETTER WA
+101E MYANMAR LETTER SA
+101F MYANMAR LETTER HA
+1020 MYANMAR LETTER LLA
+@ Independent vowels
+1021 MYANMAR LETTER A
+1023 MYANMAR LETTER I
+1024 MYANMAR LETTER II
+1025 MYANMAR LETTER U
+1026 MYANMAR LETTER UU
+ : 1025 102E
+1027 MYANMAR LETTER E
+1029 MYANMAR LETTER O
+102A MYANMAR LETTER AU
+@ Dependent vowel signs
+102C MYANMAR VOWEL SIGN AA
+102D MYANMAR VOWEL SIGN I
+102E MYANMAR VOWEL SIGN II
+102F MYANMAR VOWEL SIGN U
+1030 MYANMAR VOWEL SIGN UU
+1031 MYANMAR VOWEL SIGN E
+ * stands to the left of the consonant
+1032 MYANMAR VOWEL SIGN AI
+@ Various signs
+1036 MYANMAR SIGN ANUSVARA
+1037 MYANMAR SIGN DOT BELOW
+ = aukmyit
+ * a tone mark
+1038 MYANMAR SIGN VISARGA
+1039 MYANMAR SIGN VIRAMA
+ = killer (when rendered visibly)
+@ Digits
+1040 MYANMAR DIGIT ZERO
+1041 MYANMAR DIGIT ONE
+1042 MYANMAR DIGIT TWO
+1043 MYANMAR DIGIT THREE
+1044 MYANMAR DIGIT FOUR
+1045 MYANMAR DIGIT FIVE
+1046 MYANMAR DIGIT SIX
+1047 MYANMAR DIGIT SEVEN
+1048 MYANMAR DIGIT EIGHT
+1049 MYANMAR DIGIT NINE
+@ Punctuation
+104A MYANMAR SIGN LITTLE SECTION
+ x (devanagari danda - 0964)
+104B MYANMAR SIGN SECTION
+ x (devanagari double danda - 0965)
+@ Various signs
+104C MYANMAR SYMBOL LOCATIVE
+104D MYANMAR SYMBOL COMPLETED
+104E MYANMAR SYMBOL AFOREMENTIONED
+104F MYANMAR SYMBOL GENITIVE
+@ Pali and Sanskrit extensions
+1050 MYANMAR LETTER SHA
+1051 MYANMAR LETTER SSA
+1052 MYANMAR LETTER VOCALIC R
+1053 MYANMAR LETTER VOCALIC RR
+1054 MYANMAR LETTER VOCALIC L
+1055 MYANMAR LETTER VOCALIC LL
+1056 MYANMAR VOWEL SIGN VOCALIC R
+1057 MYANMAR VOWEL SIGN VOCALIC RR
+1058 MYANMAR VOWEL SIGN VOCALIC L
+1059 MYANMAR VOWEL SIGN VOCALIC LL
+@@ 10A0 Georgian 10FF
+@ Khutsuri
+@+ This is the uppercase of the old ecclesiastical alphabet. The style shown in the code charts is known as Asomtavruli.
+10A0 GEORGIAN CAPITAL LETTER AN (Khutsuri)
+10A1 GEORGIAN CAPITAL LETTER BAN (Khutsuri)
+10A2 GEORGIAN CAPITAL LETTER GAN (Khutsuri)
+10A3 GEORGIAN CAPITAL LETTER DON (Khutsuri)
+10A4 GEORGIAN CAPITAL LETTER EN (Khutsuri)
+10A5 GEORGIAN CAPITAL LETTER VIN (Khutsuri)
+10A6 GEORGIAN CAPITAL LETTER ZEN (Khutsuri)
+10A7 GEORGIAN CAPITAL LETTER TAN (Khutsuri)
+10A8 GEORGIAN CAPITAL LETTER IN (Khutsuri)
+10A9 GEORGIAN CAPITAL LETTER KAN (Khutsuri)
+10AA GEORGIAN CAPITAL LETTER LAS (Khutsuri)
+10AB GEORGIAN CAPITAL LETTER MAN (Khutsuri)
+10AC GEORGIAN CAPITAL LETTER NAR (Khutsuri)
+10AD GEORGIAN CAPITAL LETTER ON (Khutsuri)
+10AE GEORGIAN CAPITAL LETTER PAR (Khutsuri)
+10AF GEORGIAN CAPITAL LETTER ZHAR (Khutsuri)
+10B0 GEORGIAN CAPITAL LETTER RAE (Khutsuri)
+10B1 GEORGIAN CAPITAL LETTER SAN (Khutsuri)
+10B2 GEORGIAN CAPITAL LETTER TAR (Khutsuri)
+10B3 GEORGIAN CAPITAL LETTER UN (Khutsuri)
+10B4 GEORGIAN CAPITAL LETTER PHAR (Khutsuri)
+10B5 GEORGIAN CAPITAL LETTER KHAR (Khutsuri)
+10B6 GEORGIAN CAPITAL LETTER GHAN (Khutsuri)
+10B7 GEORGIAN CAPITAL LETTER QAR (Khutsuri)
+10B8 GEORGIAN CAPITAL LETTER SHIN (Khutsuri)
+10B9 GEORGIAN CAPITAL LETTER CHIN (Khutsuri)
+10BA GEORGIAN CAPITAL LETTER CAN (Khutsuri)
+10BB GEORGIAN CAPITAL LETTER JIL (Khutsuri)
+10BC GEORGIAN CAPITAL LETTER CIL (Khutsuri)
+10BD GEORGIAN CAPITAL LETTER CHAR (Khutsuri)
+10BE GEORGIAN CAPITAL LETTER XAN (Khutsuri)
+10BF GEORGIAN CAPITAL LETTER JHAN (Khutsuri)
+10C0 GEORGIAN CAPITAL LETTER HAE (Khutsuri)
+10C1 GEORGIAN CAPITAL LETTER HE (Khutsuri)
+10C2 GEORGIAN CAPITAL LETTER HIE (Khutsuri)
+10C3 GEORGIAN CAPITAL LETTER WE (Khutsuri)
+10C4 GEORGIAN CAPITAL LETTER HAR (Khutsuri)
+10C5 GEORGIAN CAPITAL LETTER HOE (Khutsuri)
+@ Mkhedruli
+@+ This is the modern secular alphabet, which is caseless.
+10D0 GEORGIAN LETTER AN
+10D1 GEORGIAN LETTER BAN
+10D2 GEORGIAN LETTER GAN
+10D3 GEORGIAN LETTER DON
+10D4 GEORGIAN LETTER EN
+10D5 GEORGIAN LETTER VIN
+10D6 GEORGIAN LETTER ZEN
+10D7 GEORGIAN LETTER TAN
+10D8 GEORGIAN LETTER IN
+10D9 GEORGIAN LETTER KAN
+10DA GEORGIAN LETTER LAS
+10DB GEORGIAN LETTER MAN
+10DC GEORGIAN LETTER NAR
+10DD GEORGIAN LETTER ON
+10DE GEORGIAN LETTER PAR
+10DF GEORGIAN LETTER ZHAR
+10E0 GEORGIAN LETTER RAE
+10E1 GEORGIAN LETTER SAN
+10E2 GEORGIAN LETTER TAR
+10E3 GEORGIAN LETTER UN
+10E4 GEORGIAN LETTER PHAR
+10E5 GEORGIAN LETTER KHAR
+10E6 GEORGIAN LETTER GHAN
+10E7 GEORGIAN LETTER QAR
+10E8 GEORGIAN LETTER SHIN
+10E9 GEORGIAN LETTER CHIN
+10EA GEORGIAN LETTER CAN
+10EB GEORGIAN LETTER JIL
+10EC GEORGIAN LETTER CIL
+10ED GEORGIAN LETTER CHAR
+10EE GEORGIAN LETTER XAN
+10EF GEORGIAN LETTER JHAN
+10F0 GEORGIAN LETTER HAE
+@ Archaic letters
+10F1 GEORGIAN LETTER HE
+10F2 GEORGIAN LETTER HIE
+10F3 GEORGIAN LETTER WE
+10F4 GEORGIAN LETTER HAR
+10F5 GEORGIAN LETTER HOE
+10F6 GEORGIAN LETTER FI
+@ Punctuation
+10FB GEORGIAN PARAGRAPH SEPARATOR
+@@ 1100 Hangul Jamo 11FF
+@ Korean combining alphabet
+@ Initial consonants
+1100 HANGUL CHOSEONG KIYEOK (g) *
+1101 HANGUL CHOSEONG SSANGKIYEOK (gg) *
+1102 HANGUL CHOSEONG NIEUN (n) *
+1103 HANGUL CHOSEONG TIKEUT (d) *
+1104 HANGUL CHOSEONG SSANGTIKEUT (dd) *
+1105 HANGUL CHOSEONG RIEUL (r) *
+1106 HANGUL CHOSEONG MIEUM (m) *
+1107 HANGUL CHOSEONG PIEUP (b) *
+1108 HANGUL CHOSEONG SSANGPIEUP (bb) *
+1109 HANGUL CHOSEONG SIOS (s) *
+110A HANGUL CHOSEONG SSANGSIOS (ss) *
+110B HANGUL CHOSEONG IEUNG
+110C HANGUL CHOSEONG CIEUC (j) *
+110D HANGUL CHOSEONG SSANGCIEUC (jj) *
+110E HANGUL CHOSEONG CHIEUCH (c) *
+110F HANGUL CHOSEONG KHIEUKH (k) *
+1110 HANGUL CHOSEONG THIEUTH (t) *
+1111 HANGUL CHOSEONG PHIEUPH (p) *
+1112 HANGUL CHOSEONG HIEUH (h) *
+1113 HANGUL CHOSEONG NIEUN-KIYEOK
+1114 HANGUL CHOSEONG SSANGNIEUN
+1115 HANGUL CHOSEONG NIEUN-TIKEUT
+1116 HANGUL CHOSEONG NIEUN-PIEUP
+1117 HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 HANGUL CHOSEONG RIEUL-NIEUN
+1119 HANGUL CHOSEONG SSANGRIEUL
+111A HANGUL CHOSEONG RIEUL-HIEUH
+111B HANGUL CHOSEONG KAPYEOUNRIEUL
+111C HANGUL CHOSEONG MIEUM-PIEUP
+111D HANGUL CHOSEONG KAPYEOUNMIEUM
+111E HANGUL CHOSEONG PIEUP-KIYEOK
+111F HANGUL CHOSEONG PIEUP-NIEUN
+1120 HANGUL CHOSEONG PIEUP-TIKEUT
+1121 HANGUL CHOSEONG PIEUP-SIOS
+1122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 HANGUL CHOSEONG PIEUP-CIEUC
+1128 HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 HANGUL CHOSEONG PIEUP-THIEUTH
+112A HANGUL CHOSEONG PIEUP-PHIEUPH
+112B HANGUL CHOSEONG KAPYEOUNPIEUP
+112C HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D HANGUL CHOSEONG SIOS-KIYEOK
+112E HANGUL CHOSEONG SIOS-NIEUN
+112F HANGUL CHOSEONG SIOS-TIKEUT
+1130 HANGUL CHOSEONG SIOS-RIEUL
+1131 HANGUL CHOSEONG SIOS-MIEUM
+1132 HANGUL CHOSEONG SIOS-PIEUP
+1133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 HANGUL CHOSEONG SIOS-IEUNG
+1136 HANGUL CHOSEONG SIOS-CIEUC
+1137 HANGUL CHOSEONG SIOS-CHIEUCH
+1138 HANGUL CHOSEONG SIOS-KHIEUKH
+1139 HANGUL CHOSEONG SIOS-THIEUTH
+113A HANGUL CHOSEONG SIOS-PHIEUPH
+113B HANGUL CHOSEONG SIOS-HIEUH
+113C HANGUL CHOSEONG CHITUEUMSIOS
+113D HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 HANGUL CHOSEONG PANSIOS
+1141 HANGUL CHOSEONG IEUNG-KIYEOK
+1142 HANGUL CHOSEONG IEUNG-TIKEUT
+1143 HANGUL CHOSEONG IEUNG-MIEUM
+1144 HANGUL CHOSEONG IEUNG-PIEUP
+1145 HANGUL CHOSEONG IEUNG-SIOS
+1146 HANGUL CHOSEONG IEUNG-PANSIOS
+1147 HANGUL CHOSEONG SSANGIEUNG
+1148 HANGUL CHOSEONG IEUNG-CIEUC
+1149 HANGUL CHOSEONG IEUNG-CHIEUCH
+114A HANGUL CHOSEONG IEUNG-THIEUTH
+114B HANGUL CHOSEONG IEUNG-PHIEUPH
+114C HANGUL CHOSEONG YESIEUNG
+114D HANGUL CHOSEONG CIEUC-IEUNG
+114E HANGUL CHOSEONG CHITUEUMCIEUC
+114F HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158 HANGUL CHOSEONG SSANGHIEUH
+1159 HANGUL CHOSEONG YEORINHIEUH
+115F HANGUL CHOSEONG FILLER
+@ Medial vowels
+1160 HANGUL JUNGSEONG FILLER
+1161 HANGUL JUNGSEONG A
+1162 HANGUL JUNGSEONG AE
+1163 HANGUL JUNGSEONG YA
+1164 HANGUL JUNGSEONG YAE
+1165 HANGUL JUNGSEONG EO
+1166 HANGUL JUNGSEONG E
+1167 HANGUL JUNGSEONG YEO
+1168 HANGUL JUNGSEONG YE
+1169 HANGUL JUNGSEONG O
+116A HANGUL JUNGSEONG WA
+116B HANGUL JUNGSEONG WAE
+116C HANGUL JUNGSEONG OE
+116D HANGUL JUNGSEONG YO
+116E HANGUL JUNGSEONG U
+116F HANGUL JUNGSEONG WEO
+1170 HANGUL JUNGSEONG WE
+1171 HANGUL JUNGSEONG WI
+1172 HANGUL JUNGSEONG YU
+1173 HANGUL JUNGSEONG EU
+1174 HANGUL JUNGSEONG YI
+1175 HANGUL JUNGSEONG I
+1176 HANGUL JUNGSEONG A-O
+1177 HANGUL JUNGSEONG A-U
+1178 HANGUL JUNGSEONG YA-O
+1179 HANGUL JUNGSEONG YA-YO
+117A HANGUL JUNGSEONG EO-O
+117B HANGUL JUNGSEONG EO-U
+117C HANGUL JUNGSEONG EO-EU
+117D HANGUL JUNGSEONG YEO-O
+117E HANGUL JUNGSEONG YEO-U
+117F HANGUL JUNGSEONG O-EO
+1180 HANGUL JUNGSEONG O-E
+1181 HANGUL JUNGSEONG O-YE
+1182 HANGUL JUNGSEONG O-O
+1183 HANGUL JUNGSEONG O-U
+1184 HANGUL JUNGSEONG YO-YA
+1185 HANGUL JUNGSEONG YO-YAE
+1186 HANGUL JUNGSEONG YO-YEO
+1187 HANGUL JUNGSEONG YO-O
+1188 HANGUL JUNGSEONG YO-I
+1189 HANGUL JUNGSEONG U-A
+118A HANGUL JUNGSEONG U-AE
+118B HANGUL JUNGSEONG U-EO-EU
+118C HANGUL JUNGSEONG U-YE
+118D HANGUL JUNGSEONG U-U
+118E HANGUL JUNGSEONG YU-A
+118F HANGUL JUNGSEONG YU-EO
+1190 HANGUL JUNGSEONG YU-E
+1191 HANGUL JUNGSEONG YU-YEO
+1192 HANGUL JUNGSEONG YU-YE
+1193 HANGUL JUNGSEONG YU-U
+1194 HANGUL JUNGSEONG YU-I
+1195 HANGUL JUNGSEONG EU-U
+1196 HANGUL JUNGSEONG EU-EU
+1197 HANGUL JUNGSEONG YI-U
+1198 HANGUL JUNGSEONG I-A
+1199 HANGUL JUNGSEONG I-YA
+119A HANGUL JUNGSEONG I-O
+119B HANGUL JUNGSEONG I-U
+119C HANGUL JUNGSEONG I-EU
+119D HANGUL JUNGSEONG I-ARAEA
+119E HANGUL JUNGSEONG ARAEA
+119F HANGUL JUNGSEONG ARAEA-EO
+11A0 HANGUL JUNGSEONG ARAEA-U
+11A1 HANGUL JUNGSEONG ARAEA-I
+11A2 HANGUL JUNGSEONG SSANGARAEA
+@ Final consonants
+11A8 HANGUL JONGSEONG KIYEOK (g) *
+11A9 HANGUL JONGSEONG SSANGKIYEOK (gg) *
+11AA HANGUL JONGSEONG KIYEOK-SIOS (gs) *
+11AB HANGUL JONGSEONG NIEUN (n) *
+11AC HANGUL JONGSEONG NIEUN-CIEUC (nj) *
+11AD HANGUL JONGSEONG NIEUN-HIEUH (nh) *
+11AE HANGUL JONGSEONG TIKEUT (d) *
+11AF HANGUL JONGSEONG RIEUL (l) *
+11B0 HANGUL JONGSEONG RIEUL-KIYEOK (lg) *
+11B1 HANGUL JONGSEONG RIEUL-MIEUM (lm) *
+11B2 HANGUL JONGSEONG RIEUL-PIEUP (lb) *
+11B3 HANGUL JONGSEONG RIEUL-SIOS (ls) *
+11B4 HANGUL JONGSEONG RIEUL-THIEUTH (lt) *
+11B5 HANGUL JONGSEONG RIEUL-PHIEUPH (lp) *
+11B6 HANGUL JONGSEONG RIEUL-HIEUH (lh) *
+11B7 HANGUL JONGSEONG MIEUM (m) *
+11B8 HANGUL JONGSEONG PIEUP (b) *
+11B9 HANGUL JONGSEONG PIEUP-SIOS (bs) *
+11BA HANGUL JONGSEONG SIOS (s) *
+11BB HANGUL JONGSEONG SSANGSIOS (ss) *
+11BC HANGUL JONGSEONG IEUNG (ng) *
+11BD HANGUL JONGSEONG CIEUC (j) *
+11BE HANGUL JONGSEONG CHIEUCH (c) *
+11BF HANGUL JONGSEONG KHIEUKH (k) *
+11C0 HANGUL JONGSEONG THIEUTH (t) *
+11C1 HANGUL JONGSEONG PHIEUPH (p) *
+11C2 HANGUL JONGSEONG HIEUH (h) *
+11C3 HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 HANGUL JONGSEONG NIEUN-SIOS
+11C8 HANGUL JONGSEONG NIEUN-PANSIOS
+11C9 HANGUL JONGSEONG NIEUN-THIEUTH
+11CA HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB HANGUL JONGSEONG TIKEUT-RIEUL
+11CC HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD HANGUL JONGSEONG RIEUL-NIEUN
+11CE HANGUL JONGSEONG RIEUL-TIKEUT
+11CF HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 HANGUL JONGSEONG SSANGRIEUL
+11D1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 HANGUL JONGSEONG RIEUL-PANSIOS
+11D8 HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA HANGUL JONGSEONG MIEUM-KIYEOK
+11DB HANGUL JONGSEONG MIEUM-RIEUL
+11DC HANGUL JONGSEONG MIEUM-PIEUP
+11DD HANGUL JONGSEONG MIEUM-SIOS
+11DE HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF HANGUL JONGSEONG MIEUM-PANSIOS
+11E0 HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 HANGUL JONGSEONG MIEUM-HIEUH
+11E2 HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 HANGUL JONGSEONG PIEUP-RIEUL
+11E4 HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 HANGUL JONGSEONG PIEUP-HIEUH
+11E6 HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 HANGUL JONGSEONG SIOS-KIYEOK
+11E8 HANGUL JONGSEONG SIOS-TIKEUT
+11E9 HANGUL JONGSEONG SIOS-RIEUL
+11EA HANGUL JONGSEONG SIOS-PIEUP
+11EB HANGUL JONGSEONG PANSIOS
+11EC HANGUL JONGSEONG IEUNG-KIYEOK
+11ED HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE HANGUL JONGSEONG SSANGIEUNG
+11EF HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0 HANGUL JONGSEONG YESIEUNG
+11F1 HANGUL JONGSEONG YESIEUNG-SIOS
+11F2 HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3 HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 HANGUL JONGSEONG HIEUH-NIEUN
+11F6 HANGUL JONGSEONG HIEUH-RIEUL
+11F7 HANGUL JONGSEONG HIEUH-MIEUM
+11F8 HANGUL JONGSEONG HIEUH-PIEUP
+11F9 HANGUL JONGSEONG YEORINHIEUH
+@@ 1200 Ethiopic 137F
+@ Syllables
+1200 ETHIOPIC SYLLABLE HA
+1201 ETHIOPIC SYLLABLE HU
+1202 ETHIOPIC SYLLABLE HI
+1203 ETHIOPIC SYLLABLE HAA
+1204 ETHIOPIC SYLLABLE HEE
+1205 ETHIOPIC SYLLABLE HE
+1206 ETHIOPIC SYLLABLE HO
+1208 ETHIOPIC SYLLABLE LA
+1209 ETHIOPIC SYLLABLE LU
+120A ETHIOPIC SYLLABLE LI
+120B ETHIOPIC SYLLABLE LAA
+120C ETHIOPIC SYLLABLE LEE
+120D ETHIOPIC SYLLABLE LE
+120E ETHIOPIC SYLLABLE LO
+120F ETHIOPIC SYLLABLE LWA
+1210 ETHIOPIC SYLLABLE HHA
+1211 ETHIOPIC SYLLABLE HHU
+1212 ETHIOPIC SYLLABLE HHI
+1213 ETHIOPIC SYLLABLE HHAA
+1214 ETHIOPIC SYLLABLE HHEE
+1215 ETHIOPIC SYLLABLE HHE
+1216 ETHIOPIC SYLLABLE HHO
+1217 ETHIOPIC SYLLABLE HHWA
+1218 ETHIOPIC SYLLABLE MA
+1219 ETHIOPIC SYLLABLE MU
+121A ETHIOPIC SYLLABLE MI
+121B ETHIOPIC SYLLABLE MAA
+121C ETHIOPIC SYLLABLE MEE
+121D ETHIOPIC SYLLABLE ME
+121E ETHIOPIC SYLLABLE MO
+121F ETHIOPIC SYLLABLE MWA
+1220 ETHIOPIC SYLLABLE SZA
+1221 ETHIOPIC SYLLABLE SZU
+1222 ETHIOPIC SYLLABLE SZI
+1223 ETHIOPIC SYLLABLE SZAA
+1224 ETHIOPIC SYLLABLE SZEE
+1225 ETHIOPIC SYLLABLE SZE
+1226 ETHIOPIC SYLLABLE SZO
+1227 ETHIOPIC SYLLABLE SZWA
+1228 ETHIOPIC SYLLABLE RA
+1229 ETHIOPIC SYLLABLE RU
+122A ETHIOPIC SYLLABLE RI
+122B ETHIOPIC SYLLABLE RAA
+122C ETHIOPIC SYLLABLE REE
+122D ETHIOPIC SYLLABLE RE
+122E ETHIOPIC SYLLABLE RO
+122F ETHIOPIC SYLLABLE RWA
+1230 ETHIOPIC SYLLABLE SA
+1231 ETHIOPIC SYLLABLE SU
+1232 ETHIOPIC SYLLABLE SI
+1233 ETHIOPIC SYLLABLE SAA
+1234 ETHIOPIC SYLLABLE SEE
+1235 ETHIOPIC SYLLABLE SE
+1236 ETHIOPIC SYLLABLE SO
+1237 ETHIOPIC SYLLABLE SWA
+1238 ETHIOPIC SYLLABLE SHA
+1239 ETHIOPIC SYLLABLE SHU
+123A ETHIOPIC SYLLABLE SHI
+123B ETHIOPIC SYLLABLE SHAA
+123C ETHIOPIC SYLLABLE SHEE
+123D ETHIOPIC SYLLABLE SHE
+123E ETHIOPIC SYLLABLE SHO
+123F ETHIOPIC SYLLABLE SHWA
+1240 ETHIOPIC SYLLABLE QA
+1241 ETHIOPIC SYLLABLE QU
+1242 ETHIOPIC SYLLABLE QI
+1243 ETHIOPIC SYLLABLE QAA
+1244 ETHIOPIC SYLLABLE QEE
+1245 ETHIOPIC SYLLABLE QE
+1246 ETHIOPIC SYLLABLE QO
+1248 ETHIOPIC SYLLABLE QWA
+124A ETHIOPIC SYLLABLE QWI
+124B ETHIOPIC SYLLABLE QWAA
+124C ETHIOPIC SYLLABLE QWEE
+124D ETHIOPIC SYLLABLE QWE
+1250 ETHIOPIC SYLLABLE QHA
+1251 ETHIOPIC SYLLABLE QHU
+1252 ETHIOPIC SYLLABLE QHI
+1253 ETHIOPIC SYLLABLE QHAA
+1254 ETHIOPIC SYLLABLE QHEE
+1255 ETHIOPIC SYLLABLE QHE
+1256 ETHIOPIC SYLLABLE QHO
+1258 ETHIOPIC SYLLABLE QHWA
+125A ETHIOPIC SYLLABLE QHWI
+125B ETHIOPIC SYLLABLE QHWAA
+125C ETHIOPIC SYLLABLE QHWEE
+125D ETHIOPIC SYLLABLE QHWE
+1260 ETHIOPIC SYLLABLE BA
+1261 ETHIOPIC SYLLABLE BU
+1262 ETHIOPIC SYLLABLE BI
+1263 ETHIOPIC SYLLABLE BAA
+1264 ETHIOPIC SYLLABLE BEE
+1265 ETHIOPIC SYLLABLE BE
+1266 ETHIOPIC SYLLABLE BO
+1267 ETHIOPIC SYLLABLE BWA
+1268 ETHIOPIC SYLLABLE VA
+1269 ETHIOPIC SYLLABLE VU
+126A ETHIOPIC SYLLABLE VI
+126B ETHIOPIC SYLLABLE VAA
+126C ETHIOPIC SYLLABLE VEE
+126D ETHIOPIC SYLLABLE VE
+126E ETHIOPIC SYLLABLE VO
+126F ETHIOPIC SYLLABLE VWA
+1270 ETHIOPIC SYLLABLE TA
+1271 ETHIOPIC SYLLABLE TU
+1272 ETHIOPIC SYLLABLE TI
+1273 ETHIOPIC SYLLABLE TAA
+1274 ETHIOPIC SYLLABLE TEE
+1275 ETHIOPIC SYLLABLE TE
+1276 ETHIOPIC SYLLABLE TO
+1277 ETHIOPIC SYLLABLE TWA
+1278 ETHIOPIC SYLLABLE CA
+1279 ETHIOPIC SYLLABLE CU
+127A ETHIOPIC SYLLABLE CI
+127B ETHIOPIC SYLLABLE CAA
+127C ETHIOPIC SYLLABLE CEE
+127D ETHIOPIC SYLLABLE CE
+127E ETHIOPIC SYLLABLE CO
+127F ETHIOPIC SYLLABLE CWA
+1280 ETHIOPIC SYLLABLE XA
+1281 ETHIOPIC SYLLABLE XU
+1282 ETHIOPIC SYLLABLE XI
+1283 ETHIOPIC SYLLABLE XAA
+1284 ETHIOPIC SYLLABLE XEE
+1285 ETHIOPIC SYLLABLE XE
+1286 ETHIOPIC SYLLABLE XO
+1288 ETHIOPIC SYLLABLE XWA
+128A ETHIOPIC SYLLABLE XWI
+128B ETHIOPIC SYLLABLE XWAA
+128C ETHIOPIC SYLLABLE XWEE
+128D ETHIOPIC SYLLABLE XWE
+1290 ETHIOPIC SYLLABLE NA
+1291 ETHIOPIC SYLLABLE NU
+1292 ETHIOPIC SYLLABLE NI
+1293 ETHIOPIC SYLLABLE NAA
+1294 ETHIOPIC SYLLABLE NEE
+1295 ETHIOPIC SYLLABLE NE
+1296 ETHIOPIC SYLLABLE NO
+1297 ETHIOPIC SYLLABLE NWA
+1298 ETHIOPIC SYLLABLE NYA
+1299 ETHIOPIC SYLLABLE NYU
+129A ETHIOPIC SYLLABLE NYI
+129B ETHIOPIC SYLLABLE NYAA
+129C ETHIOPIC SYLLABLE NYEE
+129D ETHIOPIC SYLLABLE NYE
+129E ETHIOPIC SYLLABLE NYO
+129F ETHIOPIC SYLLABLE NYWA
+12A0 ETHIOPIC SYLLABLE GLOTTAL A
+12A1 ETHIOPIC SYLLABLE GLOTTAL U
+12A2 ETHIOPIC SYLLABLE GLOTTAL I
+12A3 ETHIOPIC SYLLABLE GLOTTAL AA
+12A4 ETHIOPIC SYLLABLE GLOTTAL EE
+12A5 ETHIOPIC SYLLABLE GLOTTAL E
+12A6 ETHIOPIC SYLLABLE GLOTTAL O
+12A7 ETHIOPIC SYLLABLE GLOTTAL WA
+12A8 ETHIOPIC SYLLABLE KA
+12A9 ETHIOPIC SYLLABLE KU
+12AA ETHIOPIC SYLLABLE KI
+12AB ETHIOPIC SYLLABLE KAA
+12AC ETHIOPIC SYLLABLE KEE
+12AD ETHIOPIC SYLLABLE KE
+12AE ETHIOPIC SYLLABLE KO
+12B0 ETHIOPIC SYLLABLE KWA
+12B2 ETHIOPIC SYLLABLE KWI
+12B3 ETHIOPIC SYLLABLE KWAA
+12B4 ETHIOPIC SYLLABLE KWEE
+12B5 ETHIOPIC SYLLABLE KWE
+12B8 ETHIOPIC SYLLABLE KXA
+12B9 ETHIOPIC SYLLABLE KXU
+12BA ETHIOPIC SYLLABLE KXI
+12BB ETHIOPIC SYLLABLE KXAA
+12BC ETHIOPIC SYLLABLE KXEE
+12BD ETHIOPIC SYLLABLE KXE
+12BE ETHIOPIC SYLLABLE KXO
+12C0 ETHIOPIC SYLLABLE KXWA
+12C2 ETHIOPIC SYLLABLE KXWI
+12C3 ETHIOPIC SYLLABLE KXWAA
+12C4 ETHIOPIC SYLLABLE KXWEE
+12C5 ETHIOPIC SYLLABLE KXWE
+12C8 ETHIOPIC SYLLABLE WA
+12C9 ETHIOPIC SYLLABLE WU
+12CA ETHIOPIC SYLLABLE WI
+12CB ETHIOPIC SYLLABLE WAA
+12CC ETHIOPIC SYLLABLE WEE
+12CD ETHIOPIC SYLLABLE WE
+12CE ETHIOPIC SYLLABLE WO
+12D0 ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1 ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2 ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3 ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4 ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5 ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6 ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8 ETHIOPIC SYLLABLE ZA
+12D9 ETHIOPIC SYLLABLE ZU
+12DA ETHIOPIC SYLLABLE ZI
+12DB ETHIOPIC SYLLABLE ZAA
+12DC ETHIOPIC SYLLABLE ZEE
+12DD ETHIOPIC SYLLABLE ZE
+12DE ETHIOPIC SYLLABLE ZO
+12DF ETHIOPIC SYLLABLE ZWA
+12E0 ETHIOPIC SYLLABLE ZHA
+12E1 ETHIOPIC SYLLABLE ZHU
+12E2 ETHIOPIC SYLLABLE ZHI
+12E3 ETHIOPIC SYLLABLE ZHAA
+12E4 ETHIOPIC SYLLABLE ZHEE
+12E5 ETHIOPIC SYLLABLE ZHE
+12E6 ETHIOPIC SYLLABLE ZHO
+12E7 ETHIOPIC SYLLABLE ZHWA
+12E8 ETHIOPIC SYLLABLE YA
+12E9 ETHIOPIC SYLLABLE YU
+12EA ETHIOPIC SYLLABLE YI
+12EB ETHIOPIC SYLLABLE YAA
+12EC ETHIOPIC SYLLABLE YEE
+12ED ETHIOPIC SYLLABLE YE
+12EE ETHIOPIC SYLLABLE YO
+12F0 ETHIOPIC SYLLABLE DA
+12F1 ETHIOPIC SYLLABLE DU
+12F2 ETHIOPIC SYLLABLE DI
+12F3 ETHIOPIC SYLLABLE DAA
+12F4 ETHIOPIC SYLLABLE DEE
+12F5 ETHIOPIC SYLLABLE DE
+12F6 ETHIOPIC SYLLABLE DO
+12F7 ETHIOPIC SYLLABLE DWA
+12F8 ETHIOPIC SYLLABLE DDA
+12F9 ETHIOPIC SYLLABLE DDU
+12FA ETHIOPIC SYLLABLE DDI
+12FB ETHIOPIC SYLLABLE DDAA
+12FC ETHIOPIC SYLLABLE DDEE
+12FD ETHIOPIC SYLLABLE DDE
+12FE ETHIOPIC SYLLABLE DDO
+12FF ETHIOPIC SYLLABLE DDWA
+1300 ETHIOPIC SYLLABLE JA
+1301 ETHIOPIC SYLLABLE JU
+1302 ETHIOPIC SYLLABLE JI
+1303 ETHIOPIC SYLLABLE JAA
+1304 ETHIOPIC SYLLABLE JEE
+1305 ETHIOPIC SYLLABLE JE
+1306 ETHIOPIC SYLLABLE JO
+1307 ETHIOPIC SYLLABLE JWA
+1308 ETHIOPIC SYLLABLE GA
+1309 ETHIOPIC SYLLABLE GU
+130A ETHIOPIC SYLLABLE GI
+130B ETHIOPIC SYLLABLE GAA
+130C ETHIOPIC SYLLABLE GEE
+130D ETHIOPIC SYLLABLE GE
+130E ETHIOPIC SYLLABLE GO
+1310 ETHIOPIC SYLLABLE GWA
+1312 ETHIOPIC SYLLABLE GWI
+1313 ETHIOPIC SYLLABLE GWAA
+1314 ETHIOPIC SYLLABLE GWEE
+1315 ETHIOPIC SYLLABLE GWE
+1318 ETHIOPIC SYLLABLE GGA
+1319 ETHIOPIC SYLLABLE GGU
+131A ETHIOPIC SYLLABLE GGI
+131B ETHIOPIC SYLLABLE GGAA
+131C ETHIOPIC SYLLABLE GGEE
+131D ETHIOPIC SYLLABLE GGE
+131E ETHIOPIC SYLLABLE GGO
+1320 ETHIOPIC SYLLABLE THA
+1321 ETHIOPIC SYLLABLE THU
+1322 ETHIOPIC SYLLABLE THI
+1323 ETHIOPIC SYLLABLE THAA
+1324 ETHIOPIC SYLLABLE THEE
+1325 ETHIOPIC SYLLABLE THE
+1326 ETHIOPIC SYLLABLE THO
+1327 ETHIOPIC SYLLABLE THWA
+1328 ETHIOPIC SYLLABLE CHA
+1329 ETHIOPIC SYLLABLE CHU
+132A ETHIOPIC SYLLABLE CHI
+132B ETHIOPIC SYLLABLE CHAA
+132C ETHIOPIC SYLLABLE CHEE
+132D ETHIOPIC SYLLABLE CHE
+132E ETHIOPIC SYLLABLE CHO
+132F ETHIOPIC SYLLABLE CHWA
+1330 ETHIOPIC SYLLABLE PHA
+1331 ETHIOPIC SYLLABLE PHU
+1332 ETHIOPIC SYLLABLE PHI
+1333 ETHIOPIC SYLLABLE PHAA
+1334 ETHIOPIC SYLLABLE PHEE
+1335 ETHIOPIC SYLLABLE PHE
+1336 ETHIOPIC SYLLABLE PHO
+1337 ETHIOPIC SYLLABLE PHWA
+1338 ETHIOPIC SYLLABLE TSA
+1339 ETHIOPIC SYLLABLE TSU
+133A ETHIOPIC SYLLABLE TSI
+133B ETHIOPIC SYLLABLE TSAA
+133C ETHIOPIC SYLLABLE TSEE
+133D ETHIOPIC SYLLABLE TSE
+133E ETHIOPIC SYLLABLE TSO
+133F ETHIOPIC SYLLABLE TSWA
+1340 ETHIOPIC SYLLABLE TZA
+1341 ETHIOPIC SYLLABLE TZU
+1342 ETHIOPIC SYLLABLE TZI
+1343 ETHIOPIC SYLLABLE TZAA
+1344 ETHIOPIC SYLLABLE TZEE
+1345 ETHIOPIC SYLLABLE TZE
+1346 ETHIOPIC SYLLABLE TZO
+1348 ETHIOPIC SYLLABLE FA
+1349 ETHIOPIC SYLLABLE FU
+134A ETHIOPIC SYLLABLE FI
+134B ETHIOPIC SYLLABLE FAA
+134C ETHIOPIC SYLLABLE FEE
+134D ETHIOPIC SYLLABLE FE
+134E ETHIOPIC SYLLABLE FO
+134F ETHIOPIC SYLLABLE FWA
+1350 ETHIOPIC SYLLABLE PA
+1351 ETHIOPIC SYLLABLE PU
+1352 ETHIOPIC SYLLABLE PI
+1353 ETHIOPIC SYLLABLE PAA
+1354 ETHIOPIC SYLLABLE PEE
+1355 ETHIOPIC SYLLABLE PE
+1356 ETHIOPIC SYLLABLE PO
+1357 ETHIOPIC SYLLABLE PWA
+1358 ETHIOPIC SYLLABLE RYA
+1359 ETHIOPIC SYLLABLE MYA
+135A ETHIOPIC SYLLABLE FYA
+@ Punctuation
+1361 ETHIOPIC WORDSPACE
+1362 ETHIOPIC FULL STOP
+1363 ETHIOPIC COMMA
+1364 ETHIOPIC SEMICOLON
+1365 ETHIOPIC COLON
+1366 ETHIOPIC PREFACE COLON
+1367 ETHIOPIC QUESTION MARK
+1368 ETHIOPIC PARAGRAPH SEPARATOR
+@ Digits
+1369 ETHIOPIC DIGIT ONE
+136A ETHIOPIC DIGIT TWO
+136B ETHIOPIC DIGIT THREE
+136C ETHIOPIC DIGIT FOUR
+136D ETHIOPIC DIGIT FIVE
+136E ETHIOPIC DIGIT SIX
+136F ETHIOPIC DIGIT SEVEN
+1370 ETHIOPIC DIGIT EIGHT
+1371 ETHIOPIC DIGIT NINE
+@ Numbers
+1372 ETHIOPIC NUMBER TEN
+1373 ETHIOPIC NUMBER TWENTY
+1374 ETHIOPIC NUMBER THIRTY
+1375 ETHIOPIC NUMBER FORTY
+1376 ETHIOPIC NUMBER FIFTY
+1377 ETHIOPIC NUMBER SIXTY
+1378 ETHIOPIC NUMBER SEVENTY
+1379 ETHIOPIC NUMBER EIGHTY
+137A ETHIOPIC NUMBER NINETY
+137B ETHIOPIC NUMBER HUNDRED
+137C ETHIOPIC NUMBER TEN THOUSAND
+@@ 13A0 Cherokee 13FF
+@ Syllables
+13A0 CHEROKEE LETTER A
+13A1 CHEROKEE LETTER E
+13A2 CHEROKEE LETTER I
+13A3 CHEROKEE LETTER O
+13A4 CHEROKEE LETTER U
+13A5 CHEROKEE LETTER V
+13A6 CHEROKEE LETTER GA
+13A7 CHEROKEE LETTER KA
+13A8 CHEROKEE LETTER GE
+13A9 CHEROKEE LETTER GI
+13AA CHEROKEE LETTER GO
+13AB CHEROKEE LETTER GU
+13AC CHEROKEE LETTER GV
+13AD CHEROKEE LETTER HA
+13AE CHEROKEE LETTER HE
+13AF CHEROKEE LETTER HI
+13B0 CHEROKEE LETTER HO
+13B1 CHEROKEE LETTER HU
+13B2 CHEROKEE LETTER HV
+13B3 CHEROKEE LETTER LA
+13B4 CHEROKEE LETTER LE
+13B5 CHEROKEE LETTER LI
+13B6 CHEROKEE LETTER LO
+13B7 CHEROKEE LETTER LU
+13B8 CHEROKEE LETTER LV
+13B9 CHEROKEE LETTER MA
+13BA CHEROKEE LETTER ME
+13BB CHEROKEE LETTER MI
+13BC CHEROKEE LETTER MO
+13BD CHEROKEE LETTER MU
+13BE CHEROKEE LETTER NA
+13BF CHEROKEE LETTER HNA
+13C0 CHEROKEE LETTER NAH
+13C1 CHEROKEE LETTER NE
+13C2 CHEROKEE LETTER NI
+13C3 CHEROKEE LETTER NO
+13C4 CHEROKEE LETTER NU
+13C5 CHEROKEE LETTER NV
+13C6 CHEROKEE LETTER QUA
+13C7 CHEROKEE LETTER QUE
+13C8 CHEROKEE LETTER QUI
+13C9 CHEROKEE LETTER QUO
+13CA CHEROKEE LETTER QUU
+13CB CHEROKEE LETTER QUV
+13CC CHEROKEE LETTER SA
+13CD CHEROKEE LETTER S
+13CE CHEROKEE LETTER SE
+13CF CHEROKEE LETTER SI
+13D0 CHEROKEE LETTER SO
+13D1 CHEROKEE LETTER SU
+13D2 CHEROKEE LETTER SV
+13D3 CHEROKEE LETTER DA
+13D4 CHEROKEE LETTER TA
+13D5 CHEROKEE LETTER DE
+13D6 CHEROKEE LETTER TE
+13D7 CHEROKEE LETTER DI
+13D8 CHEROKEE LETTER TI
+13D9 CHEROKEE LETTER DO
+13DA CHEROKEE LETTER DU
+13DB CHEROKEE LETTER DV
+13DC CHEROKEE LETTER DLA
+13DD CHEROKEE LETTER TLA
+13DE CHEROKEE LETTER TLE
+13DF CHEROKEE LETTER TLI
+13E0 CHEROKEE LETTER TLO
+13E1 CHEROKEE LETTER TLU
+13E2 CHEROKEE LETTER TLV
+13E3 CHEROKEE LETTER TSA
+13E4 CHEROKEE LETTER TSE
+13E5 CHEROKEE LETTER TSI
+13E6 CHEROKEE LETTER TSO
+13E7 CHEROKEE LETTER TSU
+13E8 CHEROKEE LETTER TSV
+13E9 CHEROKEE LETTER WA
+13EA CHEROKEE LETTER WE
+13EB CHEROKEE LETTER WI
+13EC CHEROKEE LETTER WO
+13ED CHEROKEE LETTER WU
+13EE CHEROKEE LETTER WV
+13EF CHEROKEE LETTER YA
+13F0 CHEROKEE LETTER YE
+13F1 CHEROKEE LETTER YI
+13F2 CHEROKEE LETTER YO
+13F3 CHEROKEE LETTER YU
+13F4 CHEROKEE LETTER YV
+@@ 1400 Unified Canadian Aboriginal Syllabics 167F
+@ Syllables
+1401 CANADIAN SYLLABICS E
+1402 CANADIAN SYLLABICS AAI
+1403 CANADIAN SYLLABICS I
+1404 CANADIAN SYLLABICS II
+1405 CANADIAN SYLLABICS O
+1406 CANADIAN SYLLABICS OO
+1407 CANADIAN SYLLABICS Y-CREE OO
+1408 CANADIAN SYLLABICS CARRIER EE
+1409 CANADIAN SYLLABICS CARRIER I
+140A CANADIAN SYLLABICS A
+140B CANADIAN SYLLABICS AA
+140C CANADIAN SYLLABICS WE
+140D CANADIAN SYLLABICS WEST-CREE WE
+140E CANADIAN SYLLABICS WI
+140F CANADIAN SYLLABICS WEST-CREE WI
+1410 CANADIAN SYLLABICS WII
+1411 CANADIAN SYLLABICS WEST-CREE WII
+1412 CANADIAN SYLLABICS WO
+1413 CANADIAN SYLLABICS WEST-CREE WO
+1414 CANADIAN SYLLABICS WOO
+1415 CANADIAN SYLLABICS WEST-CREE WOO
+1416 CANADIAN SYLLABICS NASKAPI WOO
+1417 CANADIAN SYLLABICS WA
+1418 CANADIAN SYLLABICS WEST-CREE WA
+1419 CANADIAN SYLLABICS WAA
+141A CANADIAN SYLLABICS WEST-CREE WAA
+141B CANADIAN SYLLABICS NASKAPI WAA
+141C CANADIAN SYLLABICS AI
+141D CANADIAN SYLLABICS Y-CREE W
+141E CANADIAN SYLLABICS GLOTTAL STOP
+141F CANADIAN SYLLABICS FINAL ACUTE
+1420 CANADIAN SYLLABICS FINAL GRAVE
+1421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422 CANADIAN SYLLABICS FINAL TOP HALF RING
+1423 CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424 CANADIAN SYLLABICS FINAL RING
+1425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427 CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429 CANADIAN SYLLABICS FINAL PLUS
+142A CANADIAN SYLLABICS FINAL DOWN TACK
+142B CANADIAN SYLLABICS EN
+142C CANADIAN SYLLABICS IN
+142D CANADIAN SYLLABICS ON
+142E CANADIAN SYLLABICS AN
+142F CANADIAN SYLLABICS PE
+1430 CANADIAN SYLLABICS PAAI
+1431 CANADIAN SYLLABICS PI
+1432 CANADIAN SYLLABICS PII
+1433 CANADIAN SYLLABICS PO
+1434 CANADIAN SYLLABICS POO
+1435 CANADIAN SYLLABICS Y-CREE POO
+1436 CANADIAN SYLLABICS CARRIER HEE
+1437 CANADIAN SYLLABICS CARRIER HI
+1438 CANADIAN SYLLABICS PA
+1439 CANADIAN SYLLABICS PAA
+143A CANADIAN SYLLABICS PWE
+143B CANADIAN SYLLABICS WEST-CREE PWE
+143C CANADIAN SYLLABICS PWI
+143D CANADIAN SYLLABICS WEST-CREE PWI
+143E CANADIAN SYLLABICS PWII
+143F CANADIAN SYLLABICS WEST-CREE PWII
+1440 CANADIAN SYLLABICS PWO
+1441 CANADIAN SYLLABICS WEST-CREE PWO
+1442 CANADIAN SYLLABICS PWOO
+1443 CANADIAN SYLLABICS WEST-CREE PWOO
+1444 CANADIAN SYLLABICS PWA
+1445 CANADIAN SYLLABICS WEST-CREE PWA
+1446 CANADIAN SYLLABICS PWAA
+1447 CANADIAN SYLLABICS WEST-CREE PWAA
+1448 CANADIAN SYLLABICS Y-CREE PWAA
+1449 CANADIAN SYLLABICS P
+144A CANADIAN SYLLABICS WEST-CREE P
+144B CANADIAN SYLLABICS CARRIER H
+144C CANADIAN SYLLABICS TE
+144D CANADIAN SYLLABICS TAAI
+144E CANADIAN SYLLABICS TI
+144F CANADIAN SYLLABICS TII
+1450 CANADIAN SYLLABICS TO
+1451 CANADIAN SYLLABICS TOO
+1452 CANADIAN SYLLABICS Y-CREE TOO
+1453 CANADIAN SYLLABICS CARRIER DEE
+1454 CANADIAN SYLLABICS CARRIER DI
+1455 CANADIAN SYLLABICS TA
+1456 CANADIAN SYLLABICS TAA
+1457 CANADIAN SYLLABICS TWE
+1458 CANADIAN SYLLABICS WEST-CREE TWE
+1459 CANADIAN SYLLABICS TWI
+145A CANADIAN SYLLABICS WEST-CREE TWI
+145B CANADIAN SYLLABICS TWII
+145C CANADIAN SYLLABICS WEST-CREE TWII
+145D CANADIAN SYLLABICS TWO
+145E CANADIAN SYLLABICS WEST-CREE TWO
+145F CANADIAN SYLLABICS TWOO
+1460 CANADIAN SYLLABICS WEST-CREE TWOO
+1461 CANADIAN SYLLABICS TWA
+1462 CANADIAN SYLLABICS WEST-CREE TWA
+1463 CANADIAN SYLLABICS TWAA
+1464 CANADIAN SYLLABICS WEST-CREE TWAA
+1465 CANADIAN SYLLABICS NASKAPI TWAA
+1466 CANADIAN SYLLABICS T
+1467 CANADIAN SYLLABICS TTE
+1468 CANADIAN SYLLABICS TTI
+1469 CANADIAN SYLLABICS TTO
+146A CANADIAN SYLLABICS TTA
+146B CANADIAN SYLLABICS KE
+146C CANADIAN SYLLABICS KAAI
+146D CANADIAN SYLLABICS KI
+146E CANADIAN SYLLABICS KII
+146F CANADIAN SYLLABICS KO
+1470 CANADIAN SYLLABICS KOO
+1471 CANADIAN SYLLABICS Y-CREE KOO
+1472 CANADIAN SYLLABICS KA
+1473 CANADIAN SYLLABICS KAA
+1474 CANADIAN SYLLABICS KWE
+1475 CANADIAN SYLLABICS WEST-CREE KWE
+1476 CANADIAN SYLLABICS KWI
+1477 CANADIAN SYLLABICS WEST-CREE KWI
+1478 CANADIAN SYLLABICS KWII
+1479 CANADIAN SYLLABICS WEST-CREE KWII
+147A CANADIAN SYLLABICS KWO
+147B CANADIAN SYLLABICS WEST-CREE KWO
+147C CANADIAN SYLLABICS KWOO
+147D CANADIAN SYLLABICS WEST-CREE KWOO
+147E CANADIAN SYLLABICS KWA
+147F CANADIAN SYLLABICS WEST-CREE KWA
+1480 CANADIAN SYLLABICS KWAA
+1481 CANADIAN SYLLABICS WEST-CREE KWAA
+1482 CANADIAN SYLLABICS NASKAPI KWAA
+1483 CANADIAN SYLLABICS K
+1484 CANADIAN SYLLABICS KW
+1485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489 CANADIAN SYLLABICS CE
+148A CANADIAN SYLLABICS CAAI
+148B CANADIAN SYLLABICS CI
+148C CANADIAN SYLLABICS CII
+148D CANADIAN SYLLABICS CO
+148E CANADIAN SYLLABICS COO
+148F CANADIAN SYLLABICS Y-CREE COO
+1490 CANADIAN SYLLABICS CA
+1491 CANADIAN SYLLABICS CAA
+1492 CANADIAN SYLLABICS CWE
+1493 CANADIAN SYLLABICS WEST-CREE CWE
+1494 CANADIAN SYLLABICS CWI
+1495 CANADIAN SYLLABICS WEST-CREE CWI
+1496 CANADIAN SYLLABICS CWII
+1497 CANADIAN SYLLABICS WEST-CREE CWII
+1498 CANADIAN SYLLABICS CWO
+1499 CANADIAN SYLLABICS WEST-CREE CWO
+149A CANADIAN SYLLABICS CWOO
+149B CANADIAN SYLLABICS WEST-CREE CWOO
+149C CANADIAN SYLLABICS CWA
+149D CANADIAN SYLLABICS WEST-CREE CWA
+149E CANADIAN SYLLABICS CWAA
+149F CANADIAN SYLLABICS WEST-CREE CWAA
+14A0 CANADIAN SYLLABICS NASKAPI CWAA
+14A1 CANADIAN SYLLABICS C
+14A2 CANADIAN SYLLABICS SAYISI TH
+14A3 CANADIAN SYLLABICS ME
+14A4 CANADIAN SYLLABICS MAAI
+14A5 CANADIAN SYLLABICS MI
+14A6 CANADIAN SYLLABICS MII
+14A7 CANADIAN SYLLABICS MO
+14A8 CANADIAN SYLLABICS MOO
+14A9 CANADIAN SYLLABICS Y-CREE MOO
+14AA CANADIAN SYLLABICS MA
+14AB CANADIAN SYLLABICS MAA
+14AC CANADIAN SYLLABICS MWE
+14AD CANADIAN SYLLABICS WEST-CREE MWE
+14AE CANADIAN SYLLABICS MWI
+14AF CANADIAN SYLLABICS WEST-CREE MWI
+14B0 CANADIAN SYLLABICS MWII
+14B1 CANADIAN SYLLABICS WEST-CREE MWII
+14B2 CANADIAN SYLLABICS MWO
+14B3 CANADIAN SYLLABICS WEST-CREE MWO
+14B4 CANADIAN SYLLABICS MWOO
+14B5 CANADIAN SYLLABICS WEST-CREE MWOO
+14B6 CANADIAN SYLLABICS MWA
+14B7 CANADIAN SYLLABICS WEST-CREE MWA
+14B8 CANADIAN SYLLABICS MWAA
+14B9 CANADIAN SYLLABICS WEST-CREE MWAA
+14BA CANADIAN SYLLABICS NASKAPI MWAA
+14BB CANADIAN SYLLABICS M
+14BC CANADIAN SYLLABICS WEST-CREE M
+14BD CANADIAN SYLLABICS MH
+14BE CANADIAN SYLLABICS ATHAPASCAN M
+14BF CANADIAN SYLLABICS SAYISI M
+14C0 CANADIAN SYLLABICS NE
+14C1 CANADIAN SYLLABICS NAAI
+14C2 CANADIAN SYLLABICS NI
+14C3 CANADIAN SYLLABICS NII
+14C4 CANADIAN SYLLABICS NO
+14C5 CANADIAN SYLLABICS NOO
+14C6 CANADIAN SYLLABICS Y-CREE NOO
+14C7 CANADIAN SYLLABICS NA
+14C8 CANADIAN SYLLABICS NAA
+14C9 CANADIAN SYLLABICS NWE
+14CA CANADIAN SYLLABICS WEST-CREE NWE
+14CB CANADIAN SYLLABICS NWA
+14CC CANADIAN SYLLABICS WEST-CREE NWA
+14CD CANADIAN SYLLABICS NWAA
+14CE CANADIAN SYLLABICS WEST-CREE NWAA
+14CF CANADIAN SYLLABICS NASKAPI NWAA
+14D0 CANADIAN SYLLABICS N
+14D1 CANADIAN SYLLABICS CARRIER NG
+14D2 CANADIAN SYLLABICS NH
+14D3 CANADIAN SYLLABICS LE
+14D4 CANADIAN SYLLABICS LAAI
+14D5 CANADIAN SYLLABICS LI
+14D6 CANADIAN SYLLABICS LII
+14D7 CANADIAN SYLLABICS LO
+14D8 CANADIAN SYLLABICS LOO
+14D9 CANADIAN SYLLABICS Y-CREE LOO
+14DA CANADIAN SYLLABICS LA
+14DB CANADIAN SYLLABICS LAA
+14DC CANADIAN SYLLABICS LWE
+14DD CANADIAN SYLLABICS WEST-CREE LWE
+14DE CANADIAN SYLLABICS LWI
+14DF CANADIAN SYLLABICS WEST-CREE LWI
+14E0 CANADIAN SYLLABICS LWII
+14E1 CANADIAN SYLLABICS WEST-CREE LWII
+14E2 CANADIAN SYLLABICS LWO
+14E3 CANADIAN SYLLABICS WEST-CREE LWO
+14E4 CANADIAN SYLLABICS LWOO
+14E5 CANADIAN SYLLABICS WEST-CREE LWOO
+14E6 CANADIAN SYLLABICS LWA
+14E7 CANADIAN SYLLABICS WEST-CREE LWA
+14E8 CANADIAN SYLLABICS LWAA
+14E9 CANADIAN SYLLABICS WEST-CREE LWAA
+14EA CANADIAN SYLLABICS L
+14EB CANADIAN SYLLABICS WEST-CREE L
+14EC CANADIAN SYLLABICS MEDIAL L
+14ED CANADIAN SYLLABICS SE
+14EE CANADIAN SYLLABICS SAAI
+14EF CANADIAN SYLLABICS SI
+14F0 CANADIAN SYLLABICS SII
+14F1 CANADIAN SYLLABICS SO
+14F2 CANADIAN SYLLABICS SOO
+14F3 CANADIAN SYLLABICS Y-CREE SOO
+14F4 CANADIAN SYLLABICS SA
+14F5 CANADIAN SYLLABICS SAA
+14F6 CANADIAN SYLLABICS SWE
+14F7 CANADIAN SYLLABICS WEST-CREE SWE
+14F8 CANADIAN SYLLABICS SWI
+14F9 CANADIAN SYLLABICS WEST-CREE SWI
+14FA CANADIAN SYLLABICS SWII
+14FB CANADIAN SYLLABICS WEST-CREE SWII
+14FC CANADIAN SYLLABICS SWO
+14FD CANADIAN SYLLABICS WEST-CREE SWO
+14FE CANADIAN SYLLABICS SWOO
+14FF CANADIAN SYLLABICS WEST-CREE SWOO
+1500 CANADIAN SYLLABICS SWA
+1501 CANADIAN SYLLABICS WEST-CREE SWA
+1502 CANADIAN SYLLABICS SWAA
+1503 CANADIAN SYLLABICS WEST-CREE SWAA
+1504 CANADIAN SYLLABICS NASKAPI SWAA
+1505 CANADIAN SYLLABICS S
+1506 CANADIAN SYLLABICS ATHAPASCAN S
+1507 CANADIAN SYLLABICS SW
+1508 CANADIAN SYLLABICS BLACKFOOT S
+1509 CANADIAN SYLLABICS MOOSE-CREE SK
+150A CANADIAN SYLLABICS NASKAPI SKW
+150B CANADIAN SYLLABICS NASKAPI S-W
+150C CANADIAN SYLLABICS NASKAPI SPWA
+150D CANADIAN SYLLABICS NASKAPI STWA
+150E CANADIAN SYLLABICS NASKAPI SKWA
+150F CANADIAN SYLLABICS NASKAPI SCWA
+1510 CANADIAN SYLLABICS SHE
+1511 CANADIAN SYLLABICS SHI
+1512 CANADIAN SYLLABICS SHII
+1513 CANADIAN SYLLABICS SHO
+1514 CANADIAN SYLLABICS SHOO
+1515 CANADIAN SYLLABICS SHA
+1516 CANADIAN SYLLABICS SHAA
+1517 CANADIAN SYLLABICS SHWE
+1518 CANADIAN SYLLABICS WEST-CREE SHWE
+1519 CANADIAN SYLLABICS SHWI
+151A CANADIAN SYLLABICS WEST-CREE SHWI
+151B CANADIAN SYLLABICS SHWII
+151C CANADIAN SYLLABICS WEST-CREE SHWII
+151D CANADIAN SYLLABICS SHWO
+151E CANADIAN SYLLABICS WEST-CREE SHWO
+151F CANADIAN SYLLABICS SHWOO
+1520 CANADIAN SYLLABICS WEST-CREE SHWOO
+1521 CANADIAN SYLLABICS SHWA
+1522 CANADIAN SYLLABICS WEST-CREE SHWA
+1523 CANADIAN SYLLABICS SHWAA
+1524 CANADIAN SYLLABICS WEST-CREE SHWAA
+1525 CANADIAN SYLLABICS SH
+1526 CANADIAN SYLLABICS YE
+1527 CANADIAN SYLLABICS YAAI
+1528 CANADIAN SYLLABICS YI
+1529 CANADIAN SYLLABICS YII
+152A CANADIAN SYLLABICS YO
+152B CANADIAN SYLLABICS YOO
+152C CANADIAN SYLLABICS Y-CREE YOO
+152D CANADIAN SYLLABICS YA
+152E CANADIAN SYLLABICS YAA
+152F CANADIAN SYLLABICS YWE
+1530 CANADIAN SYLLABICS WEST-CREE YWE
+1531 CANADIAN SYLLABICS YWI
+1532 CANADIAN SYLLABICS WEST-CREE YWI
+1533 CANADIAN SYLLABICS YWII
+1534 CANADIAN SYLLABICS WEST-CREE YWII
+1535 CANADIAN SYLLABICS YWO
+1536 CANADIAN SYLLABICS WEST-CREE YWO
+1537 CANADIAN SYLLABICS YWOO
+1538 CANADIAN SYLLABICS WEST-CREE YWOO
+1539 CANADIAN SYLLABICS YWA
+153A CANADIAN SYLLABICS WEST-CREE YWA
+153B CANADIAN SYLLABICS YWAA
+153C CANADIAN SYLLABICS WEST-CREE YWAA
+153D CANADIAN SYLLABICS NASKAPI YWAA
+153E CANADIAN SYLLABICS Y
+153F CANADIAN SYLLABICS BIBLE-CREE Y
+1540 CANADIAN SYLLABICS WEST-CREE Y
+1541 CANADIAN SYLLABICS SAYISI YI
+1542 CANADIAN SYLLABICS RE
+1543 CANADIAN SYLLABICS R-CREE RE
+1544 CANADIAN SYLLABICS WEST-CREE LE
+1545 CANADIAN SYLLABICS RAAI
+1546 CANADIAN SYLLABICS RI
+1547 CANADIAN SYLLABICS RII
+1548 CANADIAN SYLLABICS RO
+1549 CANADIAN SYLLABICS ROO
+154A CANADIAN SYLLABICS WEST-CREE LO
+154B CANADIAN SYLLABICS RA
+154C CANADIAN SYLLABICS RAA
+154D CANADIAN SYLLABICS WEST-CREE LA
+154E CANADIAN SYLLABICS RWAA
+154F CANADIAN SYLLABICS WEST-CREE RWAA
+1550 CANADIAN SYLLABICS R
+1551 CANADIAN SYLLABICS WEST-CREE R
+1552 CANADIAN SYLLABICS MEDIAL R
+1553 CANADIAN SYLLABICS FE
+1554 CANADIAN SYLLABICS FAAI
+1555 CANADIAN SYLLABICS FI
+1556 CANADIAN SYLLABICS FII
+1557 CANADIAN SYLLABICS FO
+1558 CANADIAN SYLLABICS FOO
+1559 CANADIAN SYLLABICS FA
+155A CANADIAN SYLLABICS FAA
+155B CANADIAN SYLLABICS FWAA
+155C CANADIAN SYLLABICS WEST-CREE FWAA
+155D CANADIAN SYLLABICS F
+155E CANADIAN SYLLABICS THE
+155F CANADIAN SYLLABICS N-CREE THE
+1560 CANADIAN SYLLABICS THI
+1561 CANADIAN SYLLABICS N-CREE THI
+1562 CANADIAN SYLLABICS THII
+1563 CANADIAN SYLLABICS N-CREE THII
+1564 CANADIAN SYLLABICS THO
+1565 CANADIAN SYLLABICS THOO
+1566 CANADIAN SYLLABICS THA
+1567 CANADIAN SYLLABICS THAA
+1568 CANADIAN SYLLABICS THWAA
+1569 CANADIAN SYLLABICS WEST-CREE THWAA
+156A CANADIAN SYLLABICS TH
+156B CANADIAN SYLLABICS TTHE
+156C CANADIAN SYLLABICS TTHI
+156D CANADIAN SYLLABICS TTHO
+156E CANADIAN SYLLABICS TTHA
+156F CANADIAN SYLLABICS TTH
+1570 CANADIAN SYLLABICS TYE
+1571 CANADIAN SYLLABICS TYI
+1572 CANADIAN SYLLABICS TYO
+1573 CANADIAN SYLLABICS TYA
+1574 CANADIAN SYLLABICS NUNAVIK HE
+1575 CANADIAN SYLLABICS NUNAVIK HI
+1576 CANADIAN SYLLABICS NUNAVIK HII
+1577 CANADIAN SYLLABICS NUNAVIK HO
+1578 CANADIAN SYLLABICS NUNAVIK HOO
+1579 CANADIAN SYLLABICS NUNAVIK HA
+157A CANADIAN SYLLABICS NUNAVIK HAA
+157B CANADIAN SYLLABICS NUNAVIK H
+157C CANADIAN SYLLABICS NUNAVUT H
+157D CANADIAN SYLLABICS HK
+157E CANADIAN SYLLABICS QAAI
+157F CANADIAN SYLLABICS QI
+1580 CANADIAN SYLLABICS QII
+1581 CANADIAN SYLLABICS QO
+1582 CANADIAN SYLLABICS QOO
+1583 CANADIAN SYLLABICS QA
+1584 CANADIAN SYLLABICS QAA
+1585 CANADIAN SYLLABICS Q
+1586 CANADIAN SYLLABICS TLHE
+1587 CANADIAN SYLLABICS TLHI
+1588 CANADIAN SYLLABICS TLHO
+1589 CANADIAN SYLLABICS TLHA
+158A CANADIAN SYLLABICS WEST-CREE RE
+158B CANADIAN SYLLABICS WEST-CREE RI
+158C CANADIAN SYLLABICS WEST-CREE RO
+158D CANADIAN SYLLABICS WEST-CREE RA
+158E CANADIAN SYLLABICS NGAAI
+158F CANADIAN SYLLABICS NGI
+1590 CANADIAN SYLLABICS NGII
+1591 CANADIAN SYLLABICS NGO
+1592 CANADIAN SYLLABICS NGOO
+1593 CANADIAN SYLLABICS NGA
+1594 CANADIAN SYLLABICS NGAA
+1595 CANADIAN SYLLABICS NG
+1596 CANADIAN SYLLABICS NNG
+1597 CANADIAN SYLLABICS SAYISI SHE
+1598 CANADIAN SYLLABICS SAYISI SHI
+1599 CANADIAN SYLLABICS SAYISI SHO
+159A CANADIAN SYLLABICS SAYISI SHA
+159B CANADIAN SYLLABICS WOODS-CREE THE
+159C CANADIAN SYLLABICS WOODS-CREE THI
+159D CANADIAN SYLLABICS WOODS-CREE THO
+159E CANADIAN SYLLABICS WOODS-CREE THA
+159F CANADIAN SYLLABICS WOODS-CREE TH
+15A0 CANADIAN SYLLABICS LHI
+15A1 CANADIAN SYLLABICS LHII
+15A2 CANADIAN SYLLABICS LHO
+15A3 CANADIAN SYLLABICS LHOO
+15A4 CANADIAN SYLLABICS LHA
+15A5 CANADIAN SYLLABICS LHAA
+15A6 CANADIAN SYLLABICS LH
+15A7 CANADIAN SYLLABICS TH-CREE THE
+15A8 CANADIAN SYLLABICS TH-CREE THI
+15A9 CANADIAN SYLLABICS TH-CREE THII
+15AA CANADIAN SYLLABICS TH-CREE THO
+15AB CANADIAN SYLLABICS TH-CREE THOO
+15AC CANADIAN SYLLABICS TH-CREE THA
+15AD CANADIAN SYLLABICS TH-CREE THAA
+15AE CANADIAN SYLLABICS TH-CREE TH
+15AF CANADIAN SYLLABICS AIVILIK B
+15B0 CANADIAN SYLLABICS BLACKFOOT E
+15B1 CANADIAN SYLLABICS BLACKFOOT I
+15B2 CANADIAN SYLLABICS BLACKFOOT O
+15B3 CANADIAN SYLLABICS BLACKFOOT A
+15B4 CANADIAN SYLLABICS BLACKFOOT WE
+15B5 CANADIAN SYLLABICS BLACKFOOT WI
+15B6 CANADIAN SYLLABICS BLACKFOOT WO
+15B7 CANADIAN SYLLABICS BLACKFOOT WA
+15B8 CANADIAN SYLLABICS BLACKFOOT NE
+15B9 CANADIAN SYLLABICS BLACKFOOT NI
+15BA CANADIAN SYLLABICS BLACKFOOT NO
+15BB CANADIAN SYLLABICS BLACKFOOT NA
+15BC CANADIAN SYLLABICS BLACKFOOT KE
+15BD CANADIAN SYLLABICS BLACKFOOT KI
+15BE CANADIAN SYLLABICS BLACKFOOT KO
+15BF CANADIAN SYLLABICS BLACKFOOT KA
+15C0 CANADIAN SYLLABICS SAYISI HE
+15C1 CANADIAN SYLLABICS SAYISI HI
+15C2 CANADIAN SYLLABICS SAYISI HO
+15C3 CANADIAN SYLLABICS SAYISI HA
+15C4 CANADIAN SYLLABICS CARRIER GHU
+15C5 CANADIAN SYLLABICS CARRIER GHO
+15C6 CANADIAN SYLLABICS CARRIER GHE
+15C7 CANADIAN SYLLABICS CARRIER GHEE
+15C8 CANADIAN SYLLABICS CARRIER GHI
+15C9 CANADIAN SYLLABICS CARRIER GHA
+15CA CANADIAN SYLLABICS CARRIER RU
+15CB CANADIAN SYLLABICS CARRIER RO
+15CC CANADIAN SYLLABICS CARRIER RE
+15CD CANADIAN SYLLABICS CARRIER REE
+15CE CANADIAN SYLLABICS CARRIER RI
+15CF CANADIAN SYLLABICS CARRIER RA
+15D0 CANADIAN SYLLABICS CARRIER WU
+15D1 CANADIAN SYLLABICS CARRIER WO
+15D2 CANADIAN SYLLABICS CARRIER WE
+15D3 CANADIAN SYLLABICS CARRIER WEE
+15D4 CANADIAN SYLLABICS CARRIER WI
+15D5 CANADIAN SYLLABICS CARRIER WA
+15D6 CANADIAN SYLLABICS CARRIER HWU
+15D7 CANADIAN SYLLABICS CARRIER HWO
+15D8 CANADIAN SYLLABICS CARRIER HWE
+15D9 CANADIAN SYLLABICS CARRIER HWEE
+15DA CANADIAN SYLLABICS CARRIER HWI
+15DB CANADIAN SYLLABICS CARRIER HWA
+15DC CANADIAN SYLLABICS CARRIER THU
+15DD CANADIAN SYLLABICS CARRIER THO
+15DE CANADIAN SYLLABICS CARRIER THE
+15DF CANADIAN SYLLABICS CARRIER THEE
+15E0 CANADIAN SYLLABICS CARRIER THI
+15E1 CANADIAN SYLLABICS CARRIER THA
+15E2 CANADIAN SYLLABICS CARRIER TTU
+15E3 CANADIAN SYLLABICS CARRIER TTO
+15E4 CANADIAN SYLLABICS CARRIER TTE
+15E5 CANADIAN SYLLABICS CARRIER TTEE
+15E6 CANADIAN SYLLABICS CARRIER TTI
+15E7 CANADIAN SYLLABICS CARRIER TTA
+15E8 CANADIAN SYLLABICS CARRIER PU
+15E9 CANADIAN SYLLABICS CARRIER PO
+15EA CANADIAN SYLLABICS CARRIER PE
+15EB CANADIAN SYLLABICS CARRIER PEE
+15EC CANADIAN SYLLABICS CARRIER PI
+15ED CANADIAN SYLLABICS CARRIER PA
+15EE CANADIAN SYLLABICS CARRIER P
+15EF CANADIAN SYLLABICS CARRIER GU
+15F0 CANADIAN SYLLABICS CARRIER GO
+15F1 CANADIAN SYLLABICS CARRIER GE
+15F2 CANADIAN SYLLABICS CARRIER GEE
+15F3 CANADIAN SYLLABICS CARRIER GI
+15F4 CANADIAN SYLLABICS CARRIER GA
+15F5 CANADIAN SYLLABICS CARRIER KHU
+15F6 CANADIAN SYLLABICS CARRIER KHO
+15F7 CANADIAN SYLLABICS CARRIER KHE
+15F8 CANADIAN SYLLABICS CARRIER KHEE
+15F9 CANADIAN SYLLABICS CARRIER KHI
+15FA CANADIAN SYLLABICS CARRIER KHA
+15FB CANADIAN SYLLABICS CARRIER KKU
+15FC CANADIAN SYLLABICS CARRIER KKO
+15FD CANADIAN SYLLABICS CARRIER KKE
+15FE CANADIAN SYLLABICS CARRIER KKEE
+15FF CANADIAN SYLLABICS CARRIER KKI
+1600 CANADIAN SYLLABICS CARRIER KKA
+1601 CANADIAN SYLLABICS CARRIER KK
+1602 CANADIAN SYLLABICS CARRIER NU
+1603 CANADIAN SYLLABICS CARRIER NO
+1604 CANADIAN SYLLABICS CARRIER NE
+1605 CANADIAN SYLLABICS CARRIER NEE
+1606 CANADIAN SYLLABICS CARRIER NI
+1607 CANADIAN SYLLABICS CARRIER NA
+1608 CANADIAN SYLLABICS CARRIER MU
+1609 CANADIAN SYLLABICS CARRIER MO
+160A CANADIAN SYLLABICS CARRIER ME
+160B CANADIAN SYLLABICS CARRIER MEE
+160C CANADIAN SYLLABICS CARRIER MI
+160D CANADIAN SYLLABICS CARRIER MA
+160E CANADIAN SYLLABICS CARRIER YU
+160F CANADIAN SYLLABICS CARRIER YO
+1610 CANADIAN SYLLABICS CARRIER YE
+1611 CANADIAN SYLLABICS CARRIER YEE
+1612 CANADIAN SYLLABICS CARRIER YI
+1613 CANADIAN SYLLABICS CARRIER YA
+1614 CANADIAN SYLLABICS CARRIER JU
+1615 CANADIAN SYLLABICS SAYISI JU
+1616 CANADIAN SYLLABICS CARRIER JO
+1617 CANADIAN SYLLABICS CARRIER JE
+1618 CANADIAN SYLLABICS CARRIER JEE
+1619 CANADIAN SYLLABICS CARRIER JI
+161A CANADIAN SYLLABICS SAYISI JI
+161B CANADIAN SYLLABICS CARRIER JA
+161C CANADIAN SYLLABICS CARRIER JJU
+161D CANADIAN SYLLABICS CARRIER JJO
+161E CANADIAN SYLLABICS CARRIER JJE
+161F CANADIAN SYLLABICS CARRIER JJEE
+1620 CANADIAN SYLLABICS CARRIER JJI
+1621 CANADIAN SYLLABICS CARRIER JJA
+1622 CANADIAN SYLLABICS CARRIER LU
+1623 CANADIAN SYLLABICS CARRIER LO
+1624 CANADIAN SYLLABICS CARRIER LE
+1625 CANADIAN SYLLABICS CARRIER LEE
+1626 CANADIAN SYLLABICS CARRIER LI
+1627 CANADIAN SYLLABICS CARRIER LA
+1628 CANADIAN SYLLABICS CARRIER DLU
+1629 CANADIAN SYLLABICS CARRIER DLO
+162A CANADIAN SYLLABICS CARRIER DLE
+162B CANADIAN SYLLABICS CARRIER DLEE
+162C CANADIAN SYLLABICS CARRIER DLI
+162D CANADIAN SYLLABICS CARRIER DLA
+162E CANADIAN SYLLABICS CARRIER LHU
+162F CANADIAN SYLLABICS CARRIER LHO
+1630 CANADIAN SYLLABICS CARRIER LHE
+1631 CANADIAN SYLLABICS CARRIER LHEE
+1632 CANADIAN SYLLABICS CARRIER LHI
+1633 CANADIAN SYLLABICS CARRIER LHA
+1634 CANADIAN SYLLABICS CARRIER TLHU
+1635 CANADIAN SYLLABICS CARRIER TLHO
+1636 CANADIAN SYLLABICS CARRIER TLHE
+1637 CANADIAN SYLLABICS CARRIER TLHEE
+1638 CANADIAN SYLLABICS CARRIER TLHI
+1639 CANADIAN SYLLABICS CARRIER TLHA
+163A CANADIAN SYLLABICS CARRIER TLU
+163B CANADIAN SYLLABICS CARRIER TLO
+163C CANADIAN SYLLABICS CARRIER TLE
+163D CANADIAN SYLLABICS CARRIER TLEE
+163E CANADIAN SYLLABICS CARRIER TLI
+163F CANADIAN SYLLABICS CARRIER TLA
+1640 CANADIAN SYLLABICS CARRIER ZU
+1641 CANADIAN SYLLABICS CARRIER ZO
+1642 CANADIAN SYLLABICS CARRIER ZE
+1643 CANADIAN SYLLABICS CARRIER ZEE
+1644 CANADIAN SYLLABICS CARRIER ZI
+1645 CANADIAN SYLLABICS CARRIER ZA
+1646 CANADIAN SYLLABICS CARRIER Z
+1647 CANADIAN SYLLABICS CARRIER INITIAL Z
+1648 CANADIAN SYLLABICS CARRIER DZU
+1649 CANADIAN SYLLABICS CARRIER DZO
+164A CANADIAN SYLLABICS CARRIER DZE
+164B CANADIAN SYLLABICS CARRIER DZEE
+164C CANADIAN SYLLABICS CARRIER DZI
+164D CANADIAN SYLLABICS CARRIER DZA
+164E CANADIAN SYLLABICS CARRIER SU
+164F CANADIAN SYLLABICS CARRIER SO
+1650 CANADIAN SYLLABICS CARRIER SE
+1651 CANADIAN SYLLABICS CARRIER SEE
+1652 CANADIAN SYLLABICS CARRIER SI
+1653 CANADIAN SYLLABICS CARRIER SA
+1654 CANADIAN SYLLABICS CARRIER SHU
+1655 CANADIAN SYLLABICS CARRIER SHO
+1656 CANADIAN SYLLABICS CARRIER SHE
+1657 CANADIAN SYLLABICS CARRIER SHEE
+1658 CANADIAN SYLLABICS CARRIER SHI
+1659 CANADIAN SYLLABICS CARRIER SHA
+165A CANADIAN SYLLABICS CARRIER SH
+165B CANADIAN SYLLABICS CARRIER TSU
+165C CANADIAN SYLLABICS CARRIER TSO
+165D CANADIAN SYLLABICS CARRIER TSE
+165E CANADIAN SYLLABICS CARRIER TSEE
+165F CANADIAN SYLLABICS CARRIER TSI
+1660 CANADIAN SYLLABICS CARRIER TSA
+1661 CANADIAN SYLLABICS CARRIER CHU
+1662 CANADIAN SYLLABICS CARRIER CHO
+1663 CANADIAN SYLLABICS CARRIER CHE
+1664 CANADIAN SYLLABICS CARRIER CHEE
+1665 CANADIAN SYLLABICS CARRIER CHI
+1666 CANADIAN SYLLABICS CARRIER CHA
+1667 CANADIAN SYLLABICS CARRIER TTSU
+1668 CANADIAN SYLLABICS CARRIER TTSO
+1669 CANADIAN SYLLABICS CARRIER TTSE
+166A CANADIAN SYLLABICS CARRIER TTSEE
+166B CANADIAN SYLLABICS CARRIER TTSI
+166C CANADIAN SYLLABICS CARRIER TTSA
+@ Punctuation
+166D CANADIAN SYLLABICS CHI SIGN
+166E CANADIAN SYLLABICS FULL STOP
+@ Syllables
+166F CANADIAN SYLLABICS QAI
+1670 CANADIAN SYLLABICS NGAI
+1671 CANADIAN SYLLABICS NNGI
+1672 CANADIAN SYLLABICS NNGII
+1673 CANADIAN SYLLABICS NNGO
+1674 CANADIAN SYLLABICS NNGOO
+1675 CANADIAN SYLLABICS NNGA
+1676 CANADIAN SYLLABICS NNGAA
+@@ 1680 Ogham 169F
+@ Punctuation
+1680 OGHAM SPACE MARK
+ * glyph is blank in "stemless" style fonts
+@ Traditional letters
+1681 OGHAM LETTER BEITH
+1682 OGHAM LETTER LUIS
+1683 OGHAM LETTER FEARN
+1684 OGHAM LETTER SAIL
+1685 OGHAM LETTER NION
+1686 OGHAM LETTER UATH
+1687 OGHAM LETTER DAIR
+1688 OGHAM LETTER TINNE
+1689 OGHAM LETTER COLL
+168A OGHAM LETTER CEIRT
+168B OGHAM LETTER MUIN
+168C OGHAM LETTER GORT
+168D OGHAM LETTER NGEADAL
+168E OGHAM LETTER STRAIF
+168F OGHAM LETTER RUIS
+1690 OGHAM LETTER AILM
+1691 OGHAM LETTER ONN
+1692 OGHAM LETTER UR
+1693 OGHAM LETTER EADHADH
+1694 OGHAM LETTER IODHADH
+@ Forfeda (supplementary letters)
+1695 OGHAM LETTER EABHADH
+1696 OGHAM LETTER OR
+1697 OGHAM LETTER UILLEANN
+1698 OGHAM LETTER IFIN
+1699 OGHAM LETTER EAMHANCHOLL
+169A OGHAM LETTER PEITH
+@ Punctuation
+169B OGHAM FEATHER MARK
+ * marks beginning of Ogham text
+169C OGHAM REVERSED FEATHER MARK
+ * marks end of Ogham text
+@@ 16A0 Runic 16FF
+@ Letters
+16A0 RUNIC LETTER FEHU FEOH FE F
+16A1 RUNIC LETTER V
+16A2 RUNIC LETTER URUZ UR U
+16A3 RUNIC LETTER YR
+16A4 RUNIC LETTER Y
+16A5 RUNIC LETTER W
+16A6 RUNIC LETTER THURISAZ THURS THORN
+ x (latin small letter thorn - 00FE)
+16A7 RUNIC LETTER ETH
+16A8 RUNIC LETTER ANSUZ A
+16A9 RUNIC LETTER OS O
+16AA RUNIC LETTER AC A
+16AB RUNIC LETTER AESC
+16AC RUNIC LETTER LONG-BRANCH-OSS O
+16AD RUNIC LETTER SHORT-TWIG-OSS O
+16AE RUNIC LETTER O
+16AF RUNIC LETTER OE
+16B0 RUNIC LETTER ON
+16B1 RUNIC LETTER RAIDO RAD REID R
+16B2 RUNIC LETTER KAUNA
+16B3 RUNIC LETTER CEN
+16B4 RUNIC LETTER KAUN K
+16B5 RUNIC LETTER G
+16B6 RUNIC LETTER ENG
+16B7 RUNIC LETTER GEBO GYFU G
+16B8 RUNIC LETTER GAR
+16B9 RUNIC LETTER WUNJO WYNN W
+ x (latin letter wynn - 01BF)
+16BA RUNIC LETTER HAGLAZ H
+16BB RUNIC LETTER HAEGL H
+16BC RUNIC LETTER LONG-BRANCH-HAGALL H
+16BD RUNIC LETTER SHORT-TWIG-HAGALL H
+16BE RUNIC LETTER NAUDIZ NYD NAUD N
+16BF RUNIC LETTER SHORT-TWIG-NAUD N
+16C0 RUNIC LETTER DOTTED-N
+16C1 RUNIC LETTER ISAZ IS ISS I
+16C2 RUNIC LETTER E
+16C3 RUNIC LETTER JERAN J
+16C4 RUNIC LETTER GER
+16C5 RUNIC LETTER LONG-BRANCH-AR AE
+16C6 RUNIC LETTER SHORT-TWIG-AR A
+16C7 RUNIC LETTER IWAZ EOH
+16C8 RUNIC LETTER PERTHO PEORTH P
+16C9 RUNIC LETTER ALGIZ EOLHX
+16CA RUNIC LETTER SOWILO S
+16CB RUNIC LETTER SIGEL LONG-BRANCH-SOL S
+16CC RUNIC LETTER SHORT-TWIG-SOL S
+16CD RUNIC LETTER C
+16CE RUNIC LETTER Z
+16CF RUNIC LETTER TIWAZ TIR TYR T
+16D0 RUNIC LETTER SHORT-TWIG-TYR T
+16D1 RUNIC LETTER D
+16D2 RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3 RUNIC LETTER SHORT-TWIG-BJARKAN B
+16D4 RUNIC LETTER DOTTED-P
+16D5 RUNIC LETTER OPEN-P
+16D6 RUNIC LETTER EHWAZ EH E
+16D7 RUNIC LETTER MANNAZ MAN M
+16D8 RUNIC LETTER LONG-BRANCH-MADR M
+16D9 RUNIC LETTER SHORT-TWIG-MADR M
+16DA RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB RUNIC LETTER DOTTED-L
+16DC RUNIC LETTER INGWAZ
+16DD RUNIC LETTER ING
+16DE RUNIC LETTER DAGAZ DAEG D
+16DF RUNIC LETTER OTHALAN ETHEL O
+16E0 RUNIC LETTER EAR
+16E1 RUNIC LETTER IOR
+16E2 RUNIC LETTER CWEORTH
+16E3 RUNIC LETTER CALC
+16E4 RUNIC LETTER CEALC
+16E5 RUNIC LETTER STAN
+16E6 RUNIC LETTER LONG-BRANCH-YR
+16E7 RUNIC LETTER SHORT-TWIG-YR
+16E8 RUNIC LETTER ICELANDIC-YR
+16E9 RUNIC LETTER Q
+16EA RUNIC LETTER X
+@ Punctuation
+16EB RUNIC SINGLE PUNCTUATION
+16EC RUNIC MULTIPLE PUNCTUATION
+16ED RUNIC CROSS PUNCTUATION
+@ Golden number runes
+16EE RUNIC ARLAUG SYMBOL (golden number 17)
+ * golden number 17
+16EF RUNIC TVIMADUR SYMBOL (golden number 18)
+ * golden number 18
+16F0 RUNIC BELGTHOR SYMBOL (golden number 19)
+ * golden number 19
+@@ 1780 Khmer 17FF
+@ Consonants
+1780 KHMER LETTER KA
+1781 KHMER LETTER KHA
+1782 KHMER LETTER KO
+1783 KHMER LETTER KHO
+1784 KHMER LETTER NGO
+1785 KHMER LETTER CA
+1786 KHMER LETTER CHA
+1787 KHMER LETTER CO
+1788 KHMER LETTER CHO
+1789 KHMER LETTER NYO
+178A KHMER LETTER DA
+178B KHMER LETTER TTHA
+178C KHMER LETTER DO
+178D KHMER LETTER TTHO
+178E KHMER LETTER NNO
+178F KHMER LETTER TA
+1790 KHMER LETTER THA
+1791 KHMER LETTER TO
+1792 KHMER LETTER THO
+1793 KHMER LETTER NO
+1794 KHMER LETTER BA
+1795 KHMER LETTER PHA
+1796 KHMER LETTER PO
+1797 KHMER LETTER PHO
+1798 KHMER LETTER MO
+1799 KHMER LETTER YO
+179A KHMER LETTER RO
+179B KHMER LETTER LO
+179C KHMER LETTER VO
+179D KHMER LETTER SHA
+ * used only for Pali/Sanskrit transliteration
+179E KHMER LETTER SSO
+ * used only for Pali/Sanskrit transliteration
+179F KHMER LETTER SA
+17A0 KHMER LETTER HA
+17A1 KHMER LETTER LA
+17A2 KHMER LETTER QA
+ * glottal stop
+@ Independent vowels
+17A3 KHMER INDEPENDENT VOWEL QAQ
+ * used only for Pali/Sanskrit transliteration
+17A4 KHMER INDEPENDENT VOWEL QAA
+ * used only for Pali/Sanskrit transliteration
+17A5 KHMER INDEPENDENT VOWEL QI
+17A6 KHMER INDEPENDENT VOWEL QII
+17A7 KHMER INDEPENDENT VOWEL QU
+17A8 KHMER INDEPENDENT VOWEL QUK
+ * obsolete
+17A9 KHMER INDEPENDENT VOWEL QUU
+17AA KHMER INDEPENDENT VOWEL QUUV
+17AB KHMER INDEPENDENT VOWEL RY
+17AC KHMER INDEPENDENT VOWEL RYY
+17AD KHMER INDEPENDENT VOWEL LY
+17AE KHMER INDEPENDENT VOWEL LYY
+17AF KHMER INDEPENDENT VOWEL QE
+17B0 KHMER INDEPENDENT VOWEL QAI
+17B1 KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2 KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3 KHMER INDEPENDENT VOWEL QAU
+@ Inherent vowels
+@+ These are for phonetic transcription to distinguish Indic language inherent vowels from Khmer inherent vowels.
+17B4 KHMER VOWEL INHERENT AQ
+17B5 KHMER VOWEL INHERENT AA
+@ Dependent vowel signs
+17B6 KHMER VOWEL SIGN AA
+17B7 KHMER VOWEL SIGN I
+17B8 KHMER VOWEL SIGN II
+17B9 KHMER VOWEL SIGN Y
+17BA KHMER VOWEL SIGN YY
+17BB KHMER VOWEL SIGN U
+17BC KHMER VOWEL SIGN UU
+17BD KHMER VOWEL SIGN UA
+17BE KHMER VOWEL SIGN OE
+17BF KHMER VOWEL SIGN YA
+17C0 KHMER VOWEL SIGN IE
+17C1 KHMER VOWEL SIGN E
+17C2 KHMER VOWEL SIGN AE
+17C3 KHMER VOWEL SIGN AI
+17C4 KHMER VOWEL SIGN OO
+17C5 KHMER VOWEL SIGN AU
+@ Various signs
+17C6 KHMER SIGN NIKAHIT
+ = anusvara
+ * final nasalization
+ x (thai character nikhahit - 0E4D)
+ x (myanmar sign anusvara - 1036)
+17C7 KHMER SIGN REAHMUK
+ = visarga
+ x (myanmar sign visarga - 1038)
+17C8 KHMER SIGN YUUKALEAPINTU
+ * inserts a short inherent vowel with abrupt glottal stop
+@ Consonant shifters
+@+ These signs shift the base consonant between registers.
+17C9 KHMER SIGN MUUSIKATOAN
+ * change second register to first
+17CA KHMER SIGN TRIISAP
+ * change first register to second
+@ Various signs
+17CB KHMER SIGN BANTOC
+ * shortens preceding vowel
+17CC KHMER SIGN ROBAT
+ * corresponds to initial r in Indian loan words, but treated as a diacritic
+17CD KHMER SIGN TOANDAKHIAT
+ * marks character not to be pronounced
+17CE KHMER SIGN KAKABAT
+ * sign used with some exclamations
+17CF KHMER SIGN AHSDA
+ * conjoined sign used in spelling of two single-consonant words
+17D0 KHMER SIGN SAMYOK SANNYA
+ * used with 17A4 to indicate shortened inherent vowel
+17D1 KHMER SIGN VIRIAM
+ * mostly obsolete
+ * indicates the base character is part of the previous word
+17D2 KHMER SIGN COENG
+ * functions as virama
+ * shape shown is arbitrary and not rendered
+17D3 KHMER SIGN BATHAMASAT
+ * very rare sign used in historic lunar dates
+17D4 KHMER SIGN KHAN
+ * functions as full stop, ellipsis, abbreviation
+ x (thai character paiyannoi - 0E2F)
+ x (thai character angkhankhu - 0E5A)
+ x (myanmar sign little section - 104A)
+17D5 KHMER SIGN BARIYOOSAN
+ * end of section
+ x (myanmar sign section - 104B)
+17D6 KHMER SIGN CAMNUC PII KUUH
+ * functions as colon or semicolon
+ x (division sign - 00F7)
+ x (tibetan mark gter tsheg - 0F14)
+17D7 KHMER SIGN LEK TOO
+ * repetition sign
+17D8 KHMER SIGN BEYYAL
+ * et cetera
+17D9 KHMER SIGN PHNAEK MUAN
+ * a list bullet
+ x (thai character fongman - 0E4F)
+17DA KHMER SIGN KOOMUUT
+ * indicates end of book or treatise
+ x (thai character khomut - 0E5B)
+@ Currency symbol
+17DB KHMER CURRENCY SYMBOL RIEL
+@ Sign
+17DC KHMER SIGN AVAKRAHASANYA
+ * rare, shows a deleted Sanskrit vowel, like an apostrophe
+@ Digits
+17E0 KHMER DIGIT ZERO
+17E1 KHMER DIGIT ONE
+17E2 KHMER DIGIT TWO
+17E3 KHMER DIGIT THREE
+17E4 KHMER DIGIT FOUR
+17E5 KHMER DIGIT FIVE
+17E6 KHMER DIGIT SIX
+17E7 KHMER DIGIT SEVEN
+17E8 KHMER DIGIT EIGHT
+17E9 KHMER DIGIT NINE
+@@ 1800 Mongolian 18AF
+@ Punctuation
+1800 MONGOLIAN BIRGA
+ x (tibetan mark initial yig mgo mdun ma - 0F04)
+1801 MONGOLIAN ELLIPSIS
+1802 MONGOLIAN COMMA
+1803 MONGOLIAN FULL STOP
+1804 MONGOLIAN COLON
+1805 MONGOLIAN FOUR DOTS
+ * marks the end of a chapter
+1806 MONGOLIAN TODO SOFT HYPHEN
+1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808 MONGOLIAN MANCHU COMMA
+1809 MONGOLIAN MANCHU FULL STOP
+180A MONGOLIAN NIRUGU
+@ Format controls
+180B MONGOLIAN FREE VARIATION SELECTOR ONE
+180C MONGOLIAN FREE VARIATION SELECTOR TWO
+180D MONGOLIAN FREE VARIATION SELECTOR THREE
+180E MONGOLIAN VOWEL SEPARATOR
+@ Digits
+1810 MONGOLIAN DIGIT ZERO
+1811 MONGOLIAN DIGIT ONE
+1812 MONGOLIAN DIGIT TWO
+1813 MONGOLIAN DIGIT THREE
+1814 MONGOLIAN DIGIT FOUR
+1815 MONGOLIAN DIGIT FIVE
+1816 MONGOLIAN DIGIT SIX
+1817 MONGOLIAN DIGIT SEVEN
+1818 MONGOLIAN DIGIT EIGHT
+1819 MONGOLIAN DIGIT NINE
+@ Basic letters
+1820 MONGOLIAN LETTER A
+ x (cyrillic small letter a - 0430)
+1821 MONGOLIAN LETTER E
+ x (cyrillic small letter e - 044D)
+1822 MONGOLIAN LETTER I
+ x (cyrillic small letter i - 0438)
+1823 MONGOLIAN LETTER O
+ x (cyrillic small letter o - 043E)
+1824 MONGOLIAN LETTER U
+ x (cyrillic small letter u - 0443)
+1825 MONGOLIAN LETTER OE
+ x (cyrillic small letter barred o - 04E9)
+1826 MONGOLIAN LETTER UE
+ x (cyrillic small letter straight u - 04AF)
+1827 MONGOLIAN LETTER EE
+1828 MONGOLIAN LETTER NA
+ x (cyrillic small letter en - 043D)
+1829 MONGOLIAN LETTER ANG
+182A MONGOLIAN LETTER BA
+ x (cyrillic small letter be - 0431)
+182B MONGOLIAN LETTER PA
+ x (cyrillic small letter pe - 043F)
+182C MONGOLIAN LETTER QA
+ x (cyrillic small letter ha - 0445)
+182D MONGOLIAN LETTER GA
+ x (cyrillic small letter ghe - 0433)
+182E MONGOLIAN LETTER MA
+ x (cyrillic small letter em - 043C)
+182F MONGOLIAN LETTER LA
+ x (cyrillic small letter el - 043B)
+1830 MONGOLIAN LETTER SA
+ x (cyrillic small letter es - 0441)
+1831 MONGOLIAN LETTER SHA
+ x (cyrillic small letter sha - 0448)
+1832 MONGOLIAN LETTER TA
+ x (cyrillic small letter te - 0442)
+1833 MONGOLIAN LETTER DA
+ x (cyrillic small letter de - 0434)
+1834 MONGOLIAN LETTER CHA
+ x (cyrillic small letter che - 0447)
+1835 MONGOLIAN LETTER JA
+ x (cyrillic small letter zhe - 0436)
+1836 MONGOLIAN LETTER YA
+ x (cyrillic small letter short i - 0439)
+1837 MONGOLIAN LETTER RA
+ x (cyrillic small letter er - 0440)
+1838 MONGOLIAN LETTER WA
+ x (cyrillic small letter ve - 0432)
+1839 MONGOLIAN LETTER FA
+ x (cyrillic small letter ef - 0444)
+183A MONGOLIAN LETTER KA
+ x (cyrillic small letter ha - 0445)
+183B MONGOLIAN LETTER KHA
+ x (cyrillic small letter ka - 043A)
+183C MONGOLIAN LETTER TSA
+ x (cyrillic small letter tse - 0446)
+183D MONGOLIAN LETTER ZA
+ x (cyrillic small letter ze - 0437)
+183E MONGOLIAN LETTER HAA
+ x (cyrillic small letter ha - 0445)
+183F MONGOLIAN LETTER ZRA
+ x (cyrillic small letter zhe - 0436)
+1840 MONGOLIAN LETTER LHA
+1841 MONGOLIAN LETTER ZHI
+1842 MONGOLIAN LETTER CHI
+@ Todo letters
+1843 MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844 MONGOLIAN LETTER TODO E
+1845 MONGOLIAN LETTER TODO I
+1846 MONGOLIAN LETTER TODO O
+1847 MONGOLIAN LETTER TODO U
+1848 MONGOLIAN LETTER TODO OE
+1849 MONGOLIAN LETTER TODO UE
+184A MONGOLIAN LETTER TODO ANG
+184B MONGOLIAN LETTER TODO BA
+184C MONGOLIAN LETTER TODO PA
+184D MONGOLIAN LETTER TODO QA
+184E MONGOLIAN LETTER TODO GA
+184F MONGOLIAN LETTER TODO MA
+1850 MONGOLIAN LETTER TODO TA
+1851 MONGOLIAN LETTER TODO DA
+1852 MONGOLIAN LETTER TODO CHA
+1853 MONGOLIAN LETTER TODO JA
+1854 MONGOLIAN LETTER TODO TSA
+1855 MONGOLIAN LETTER TODO YA
+1856 MONGOLIAN LETTER TODO WA
+1857 MONGOLIAN LETTER TODO KA
+1858 MONGOLIAN LETTER TODO GAA
+1859 MONGOLIAN LETTER TODO HAA
+185A MONGOLIAN LETTER TODO JIA
+185B MONGOLIAN LETTER TODO NIA
+185C MONGOLIAN LETTER TODO DZA
+@ Sibe letters
+185D MONGOLIAN LETTER SIBE E
+185E MONGOLIAN LETTER SIBE I
+185F MONGOLIAN LETTER SIBE IY
+1860 MONGOLIAN LETTER SIBE UE
+1861 MONGOLIAN LETTER SIBE U
+1862 MONGOLIAN LETTER SIBE ANG
+1863 MONGOLIAN LETTER SIBE KA
+1864 MONGOLIAN LETTER SIBE GA
+1865 MONGOLIAN LETTER SIBE HA
+1866 MONGOLIAN LETTER SIBE PA
+1867 MONGOLIAN LETTER SIBE SHA
+1868 MONGOLIAN LETTER SIBE TA
+1869 MONGOLIAN LETTER SIBE DA
+186A MONGOLIAN LETTER SIBE JA
+186B MONGOLIAN LETTER SIBE FA
+186C MONGOLIAN LETTER SIBE GAA
+186D MONGOLIAN LETTER SIBE HAA
+186E MONGOLIAN LETTER SIBE TSA
+186F MONGOLIAN LETTER SIBE ZA
+1870 MONGOLIAN LETTER SIBE RAA
+1871 MONGOLIAN LETTER SIBE CHA
+1872 MONGOLIAN LETTER SIBE ZHA
+@ Manchu letters
+1873 MONGOLIAN LETTER MANCHU I
+1874 MONGOLIAN LETTER MANCHU KA
+1875 MONGOLIAN LETTER MANCHU RA
+1876 MONGOLIAN LETTER MANCHU FA
+1877 MONGOLIAN LETTER MANCHU ZHA
+@ Extensions for Sanskrit and Tibetan
+1880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882 MONGOLIAN LETTER ALI GALI DAMARU
+1883 MONGOLIAN LETTER ALI GALI UBADAMA
+1884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885 MONGOLIAN LETTER ALI GALI BALUDA
+1886 MONGOLIAN LETTER ALI GALI THREE BALUDA
+1887 MONGOLIAN LETTER ALI GALI A
+1888 MONGOLIAN LETTER ALI GALI I
+1889 MONGOLIAN LETTER ALI GALI KA
+188A MONGOLIAN LETTER ALI GALI NGA
+188B MONGOLIAN LETTER ALI GALI CA
+188C MONGOLIAN LETTER ALI GALI TTA
+188D MONGOLIAN LETTER ALI GALI TTHA
+188E MONGOLIAN LETTER ALI GALI DDA
+188F MONGOLIAN LETTER ALI GALI NNA
+1890 MONGOLIAN LETTER ALI GALI TA
+1891 MONGOLIAN LETTER ALI GALI DA
+1892 MONGOLIAN LETTER ALI GALI PA
+1893 MONGOLIAN LETTER ALI GALI PHA
+1894 MONGOLIAN LETTER ALI GALI SSA
+1895 MONGOLIAN LETTER ALI GALI ZHA
+1896 MONGOLIAN LETTER ALI GALI ZA
+1897 MONGOLIAN LETTER ALI GALI AH
+1898 MONGOLIAN LETTER TODO ALI GALI TA
+1899 MONGOLIAN LETTER TODO ALI GALI ZHA
+189A MONGOLIAN LETTER MANCHU ALI GALI GHA
+189B MONGOLIAN LETTER MANCHU ALI GALI NGA
+189C MONGOLIAN LETTER MANCHU ALI GALI CA
+189D MONGOLIAN LETTER MANCHU ALI GALI JHA
+189E MONGOLIAN LETTER MANCHU ALI GALI TTA
+189F MONGOLIAN LETTER MANCHU ALI GALI DDHA
+18A0 MONGOLIAN LETTER MANCHU ALI GALI TA
+18A1 MONGOLIAN LETTER MANCHU ALI GALI DHA
+18A2 MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A3 MONGOLIAN LETTER MANCHU ALI GALI CYA
+18A4 MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5 MONGOLIAN LETTER MANCHU ALI GALI ZA
+18A6 MONGOLIAN LETTER ALI GALI HALF U
+18A7 MONGOLIAN LETTER ALI GALI HALF YA
+18A8 MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9 MONGOLIAN LETTER ALI GALI DAGALGA
+@@ 1E00 Latin Extended Additional 1EFF
+@ Latin general use extensions
+1E00 LATIN CAPITAL LETTER A WITH RING BELOW
+ : 0041 0325
+1E01 LATIN SMALL LETTER A WITH RING BELOW
+ : 0061 0325
+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE
+ : 0042 0307
+1E03 LATIN SMALL LETTER B WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0062 0307
+1E04 LATIN CAPITAL LETTER B WITH DOT BELOW
+ : 0042 0323
+1E05 LATIN SMALL LETTER B WITH DOT BELOW
+ : 0062 0323
+1E06 LATIN CAPITAL LETTER B WITH LINE BELOW
+ : 0042 0331
+1E07 LATIN SMALL LETTER B WITH LINE BELOW
+ : 0062 0331
+1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+ : 00C7 0301
+1E09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+ : 00E7 0301
+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE
+ : 0044 0307
+1E0B LATIN SMALL LETTER D WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0064 0307
+1E0C LATIN CAPITAL LETTER D WITH DOT BELOW
+ : 0044 0323
+1E0D LATIN SMALL LETTER D WITH DOT BELOW
+ * Indic transliteration
+ : 0064 0323
+1E0E LATIN CAPITAL LETTER D WITH LINE BELOW
+ : 0044 0331
+1E0F LATIN SMALL LETTER D WITH LINE BELOW
+ : 0064 0331
+1E10 LATIN CAPITAL LETTER D WITH CEDILLA
+ : 0044 0327
+1E11 LATIN SMALL LETTER D WITH CEDILLA
+ * Livonian
+ : 0064 0327
+1E12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+ : 0044 032D
+1E13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+ : 0064 032D
+1E14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+ : 0112 0300
+1E15 LATIN SMALL LETTER E WITH MACRON AND GRAVE
+ : 0113 0300
+1E16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+ : 0112 0301
+1E17 LATIN SMALL LETTER E WITH MACRON AND ACUTE
+ : 0113 0301
+1E18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+ : 0045 032D
+1E19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+ : 0065 032D
+1E1A LATIN CAPITAL LETTER E WITH TILDE BELOW
+ : 0045 0330
+1E1B LATIN SMALL LETTER E WITH TILDE BELOW
+ : 0065 0330
+1E1C LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+ : 0228 0306
+1E1D LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+ : 0229 0306
+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE
+ : 0046 0307
+1E1F LATIN SMALL LETTER F WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0066 0307
+1E20 LATIN CAPITAL LETTER G WITH MACRON
+ : 0047 0304
+1E21 LATIN SMALL LETTER G WITH MACRON
+ : 0067 0304
+1E22 LATIN CAPITAL LETTER H WITH DOT ABOVE
+ : 0048 0307
+1E23 LATIN SMALL LETTER H WITH DOT ABOVE
+ : 0068 0307
+1E24 LATIN CAPITAL LETTER H WITH DOT BELOW
+ : 0048 0323
+1E25 LATIN SMALL LETTER H WITH DOT BELOW
+ * Indic transliteration
+ : 0068 0323
+1E26 LATIN CAPITAL LETTER H WITH DIAERESIS
+ : 0048 0308
+1E27 LATIN SMALL LETTER H WITH DIAERESIS
+ : 0068 0308
+1E28 LATIN CAPITAL LETTER H WITH CEDILLA
+ : 0048 0327
+1E29 LATIN SMALL LETTER H WITH CEDILLA
+ : 0068 0327
+1E2A LATIN CAPITAL LETTER H WITH BREVE BELOW
+ : 0048 032E
+1E2B LATIN SMALL LETTER H WITH BREVE BELOW
+ * Semitic transliteration
+ : 0068 032E
+1E2C LATIN CAPITAL LETTER I WITH TILDE BELOW
+ : 0049 0330
+1E2D LATIN SMALL LETTER I WITH TILDE BELOW
+ : 0069 0330
+1E2E LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+ : 00CF 0301
+1E2F LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+ : 00EF 0301
+1E30 LATIN CAPITAL LETTER K WITH ACUTE
+ : 004B 0301
+1E31 LATIN SMALL LETTER K WITH ACUTE
+ : 006B 0301
+1E32 LATIN CAPITAL LETTER K WITH DOT BELOW
+ : 004B 0323
+1E33 LATIN SMALL LETTER K WITH DOT BELOW
+ : 006B 0323
+1E34 LATIN CAPITAL LETTER K WITH LINE BELOW
+ : 004B 0331
+1E35 LATIN SMALL LETTER K WITH LINE BELOW
+ : 006B 0331
+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW
+ : 004C 0323
+1E37 LATIN SMALL LETTER L WITH DOT BELOW
+ * Indic transliteration
+ : 006C 0323
+1E38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+ : 1E36 0304
+1E39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+ * Indic transliteration
+ : 1E37 0304
+1E3A LATIN CAPITAL LETTER L WITH LINE BELOW
+ : 004C 0331
+1E3B LATIN SMALL LETTER L WITH LINE BELOW
+ * Indic transliteration
+ : 006C 0331
+1E3C LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+ : 004C 032D
+1E3D LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+ : 006C 032D
+1E3E LATIN CAPITAL LETTER M WITH ACUTE
+ : 004D 0301
+1E3F LATIN SMALL LETTER M WITH ACUTE
+ : 006D 0301
+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE
+ : 004D 0307
+1E41 LATIN SMALL LETTER M WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 006D 0307
+1E42 LATIN CAPITAL LETTER M WITH DOT BELOW
+ : 004D 0323
+1E43 LATIN SMALL LETTER M WITH DOT BELOW
+ * Indic transliteration
+ : 006D 0323
+1E44 LATIN CAPITAL LETTER N WITH DOT ABOVE
+ : 004E 0307
+1E45 LATIN SMALL LETTER N WITH DOT ABOVE
+ * Indic transliteration
+ : 006E 0307
+1E46 LATIN CAPITAL LETTER N WITH DOT BELOW
+ : 004E 0323
+1E47 LATIN SMALL LETTER N WITH DOT BELOW
+ * Indic transliteration
+ : 006E 0323
+1E48 LATIN CAPITAL LETTER N WITH LINE BELOW
+ : 004E 0331
+1E49 LATIN SMALL LETTER N WITH LINE BELOW
+ * Indic transliteration
+ : 006E 0331
+1E4A LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+ : 004E 032D
+1E4B LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+ : 006E 032D
+1E4C LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+ : 00D5 0301
+1E4D LATIN SMALL LETTER O WITH TILDE AND ACUTE
+ : 00F5 0301
+1E4E LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+ : 00D5 0308
+1E4F LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+ : 00F5 0308
+1E50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+ : 014C 0300
+1E51 LATIN SMALL LETTER O WITH MACRON AND GRAVE
+ : 014D 0300
+1E52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+ : 014C 0301
+1E53 LATIN SMALL LETTER O WITH MACRON AND ACUTE
+ : 014D 0301
+1E54 LATIN CAPITAL LETTER P WITH ACUTE
+ : 0050 0301
+1E55 LATIN SMALL LETTER P WITH ACUTE
+ : 0070 0301
+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE
+ : 0050 0307
+1E57 LATIN SMALL LETTER P WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0070 0307
+1E58 LATIN CAPITAL LETTER R WITH DOT ABOVE
+ : 0052 0307
+1E59 LATIN SMALL LETTER R WITH DOT ABOVE
+ : 0072 0307
+1E5A LATIN CAPITAL LETTER R WITH DOT BELOW
+ : 0052 0323
+1E5B LATIN SMALL LETTER R WITH DOT BELOW
+ * Indic transliteration
+ : 0072 0323
+1E5C LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+ : 1E5A 0304
+1E5D LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+ * Indic transliteration
+ : 1E5B 0304
+1E5E LATIN CAPITAL LETTER R WITH LINE BELOW
+ : 0052 0331
+1E5F LATIN SMALL LETTER R WITH LINE BELOW
+ * Indic transliteration
+ : 0072 0331
+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE
+ : 0053 0307
+1E61 LATIN SMALL LETTER S WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0073 0307
+1E62 LATIN CAPITAL LETTER S WITH DOT BELOW
+ : 0053 0323
+1E63 LATIN SMALL LETTER S WITH DOT BELOW
+ * Indic transliteration
+ : 0073 0323
+1E64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+ : 015A 0307
+1E65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+ : 015B 0307
+1E66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+ : 0160 0307
+1E67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+ : 0161 0307
+1E68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+ : 1E62 0307
+1E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+ : 1E63 0307
+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE
+ : 0054 0307
+1E6B LATIN SMALL LETTER T WITH DOT ABOVE
+ * Irish Gaelic (old orthography)
+ : 0074 0307
+1E6C LATIN CAPITAL LETTER T WITH DOT BELOW
+ : 0054 0323
+1E6D LATIN SMALL LETTER T WITH DOT BELOW
+ * Indic transliteration
+ : 0074 0323
+1E6E LATIN CAPITAL LETTER T WITH LINE BELOW
+ : 0054 0331
+1E6F LATIN SMALL LETTER T WITH LINE BELOW
+ * Semitic transliteration
+ : 0074 0331
+1E70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+ : 0054 032D
+1E71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+ : 0074 032D
+1E72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+ : 0055 0324
+1E73 LATIN SMALL LETTER U WITH DIAERESIS BELOW
+ : 0075 0324
+1E74 LATIN CAPITAL LETTER U WITH TILDE BELOW
+ : 0055 0330
+1E75 LATIN SMALL LETTER U WITH TILDE BELOW
+ : 0075 0330
+1E76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+ : 0055 032D
+1E77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+ : 0075 032D
+1E78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+ : 0168 0301
+1E79 LATIN SMALL LETTER U WITH TILDE AND ACUTE
+ : 0169 0301
+1E7A LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+ : 016A 0308
+1E7B LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+ : 016B 0308
+1E7C LATIN CAPITAL LETTER V WITH TILDE
+ : 0056 0303
+1E7D LATIN SMALL LETTER V WITH TILDE
+ : 0076 0303
+1E7E LATIN CAPITAL LETTER V WITH DOT BELOW
+ : 0056 0323
+1E7F LATIN SMALL LETTER V WITH DOT BELOW
+ : 0076 0323
+1E80 LATIN CAPITAL LETTER W WITH GRAVE
+ : 0057 0300
+1E81 LATIN SMALL LETTER W WITH GRAVE
+ * Welsh
+ : 0077 0300
+1E82 LATIN CAPITAL LETTER W WITH ACUTE
+ : 0057 0301
+1E83 LATIN SMALL LETTER W WITH ACUTE
+ * Welsh
+ : 0077 0301
+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS
+ : 0057 0308
+1E85 LATIN SMALL LETTER W WITH DIAERESIS
+ * Welsh
+ : 0077 0308
+1E86 LATIN CAPITAL LETTER W WITH DOT ABOVE
+ : 0057 0307
+1E87 LATIN SMALL LETTER W WITH DOT ABOVE
+ : 0077 0307
+1E88 LATIN CAPITAL LETTER W WITH DOT BELOW
+ : 0057 0323
+1E89 LATIN SMALL LETTER W WITH DOT BELOW
+ : 0077 0323
+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE
+ : 0058 0307
+1E8B LATIN SMALL LETTER X WITH DOT ABOVE
+ : 0078 0307
+1E8C LATIN CAPITAL LETTER X WITH DIAERESIS
+ : 0058 0308
+1E8D LATIN SMALL LETTER X WITH DIAERESIS
+ : 0078 0308
+1E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE
+ : 0059 0307
+1E8F LATIN SMALL LETTER Y WITH DOT ABOVE
+ : 0079 0307
+1E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+ : 005A 0302
+1E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX
+ : 007A 0302
+1E92 LATIN CAPITAL LETTER Z WITH DOT BELOW
+ : 005A 0323
+1E93 LATIN SMALL LETTER Z WITH DOT BELOW
+ * Indic transliteration
+ : 007A 0323
+1E94 LATIN CAPITAL LETTER Z WITH LINE BELOW
+ : 005A 0331
+1E95 LATIN SMALL LETTER Z WITH LINE BELOW
+ * Semitic transliteration
+ : 007A 0331
+1E96 LATIN SMALL LETTER H WITH LINE BELOW
+ * Semitic transliteration
+ : 0068 0331
+1E97 LATIN SMALL LETTER T WITH DIAERESIS
+ : 0074 0308
+1E98 LATIN SMALL LETTER W WITH RING ABOVE
+ : 0077 030A
+1E99 LATIN SMALL LETTER Y WITH RING ABOVE
+ : 0079 030A
+1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING
+ # 0061 02BE
+1E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE
+ * in current use in Gaelic types (as glyph variant of 1E61)
+ : 017F 0307
+@ Latin extensions for Vietnamese
+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW
+ : 0041 0323
+1EA1 LATIN SMALL LETTER A WITH DOT BELOW
+ : 0061 0323
+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE
+ : 0041 0309
+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE
+ : 0061 0309
+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+ : 00C2 0301
+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+ : 00E2 0301
+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+ : 00C2 0300
+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+ : 00E2 0300
+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00C2 0309
+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00E2 0309
+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+ : 00C2 0303
+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+ : 00E2 0303
+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ : 1EA0 0302
+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ : 1EA1 0302
+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+ : 0102 0301
+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE
+ : 0103 0301
+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+ : 0102 0300
+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE
+ : 0103 0300
+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+ : 0102 0309
+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+ : 0103 0309
+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+ : 0102 0303
+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE
+ : 0103 0303
+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+ : 1EA0 0306
+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+ : 1EA1 0306
+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW
+ : 0045 0323
+1EB9 LATIN SMALL LETTER E WITH DOT BELOW
+ : 0065 0323
+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE
+ : 0045 0309
+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE
+ : 0065 0309
+1EBC LATIN CAPITAL LETTER E WITH TILDE
+ : 0045 0303
+1EBD LATIN SMALL LETTER E WITH TILDE
+ : 0065 0303
+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+ : 00CA 0301
+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+ : 00EA 0301
+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+ : 00CA 0300
+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+ : 00EA 0300
+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00CA 0309
+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00EA 0309
+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+ : 00CA 0303
+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+ : 00EA 0303
+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ : 1EB8 0302
+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ : 1EB9 0302
+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE
+ : 0049 0309
+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE
+ : 0069 0309
+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW
+ : 0049 0323
+1ECB LATIN SMALL LETTER I WITH DOT BELOW
+ : 0069 0323
+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW
+ : 004F 0323
+1ECD LATIN SMALL LETTER O WITH DOT BELOW
+ : 006F 0323
+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE
+ : 004F 0309
+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE
+ : 006F 0309
+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+ : 00D4 0301
+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+ : 00F4 0301
+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+ : 00D4 0300
+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+ : 00F4 0300
+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00D4 0309
+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+ : 00F4 0309
+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+ : 00D4 0303
+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+ : 00F4 0303
+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ : 1ECC 0302
+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ : 1ECD 0302
+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+ : 01A0 0301
+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE
+ : 01A1 0301
+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+ : 01A0 0300
+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE
+ : 01A1 0300
+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+ : 01A0 0309
+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+ : 01A1 0309
+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE
+ : 01A0 0303
+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE
+ : 01A1 0303
+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+ : 01A0 0323
+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+ : 01A1 0323
+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW
+ : 0055 0323
+1EE5 LATIN SMALL LETTER U WITH DOT BELOW
+ : 0075 0323
+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE
+ : 0055 0309
+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE
+ : 0075 0309
+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+ : 01AF 0301
+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE
+ : 01B0 0301
+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+ : 01AF 0300
+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE
+ : 01B0 0300
+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+ : 01AF 0309
+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+ : 01B0 0309
+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE
+ : 01AF 0303
+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE
+ : 01B0 0303
+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+ : 01AF 0323
+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+ : 01B0 0323
+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE
+ : 0059 0300
+1EF3 LATIN SMALL LETTER Y WITH GRAVE
+ * Welsh
+ : 0079 0300
+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW
+ : 0059 0323
+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW
+ : 0079 0323
+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+ : 0059 0309
+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE
+ : 0079 0309
+1EF8 LATIN CAPITAL LETTER Y WITH TILDE
+ : 0059 0303
+1EF9 LATIN SMALL LETTER Y WITH TILDE
+ : 0079 0303
+@@ 1F00 Greek Extended 1FFF
+@ Precomposed polytonic Greek
+1F00 GREEK SMALL LETTER ALPHA WITH PSILI
+ : 03B1 0313
+1F01 GREEK SMALL LETTER ALPHA WITH DASIA
+ : 03B1 0314
+1F02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+ : 1F00 0300
+1F03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+ : 1F01 0300
+1F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+ : 1F00 0301
+1F05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+ : 1F01 0301
+1F06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ : 1F00 0342
+1F07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ : 1F01 0342
+1F08 GREEK CAPITAL LETTER ALPHA WITH PSILI
+ : 0391 0313
+1F09 GREEK CAPITAL LETTER ALPHA WITH DASIA
+ : 0391 0314
+1F0A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+ : 1F08 0300
+1F0B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+ : 1F09 0300
+1F0C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+ : 1F08 0301
+1F0D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+ : 1F09 0301
+1F0E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ : 1F08 0342
+1F0F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ : 1F09 0342
+1F10 GREEK SMALL LETTER EPSILON WITH PSILI
+ : 03B5 0313
+1F11 GREEK SMALL LETTER EPSILON WITH DASIA
+ : 03B5 0314
+1F12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+ : 1F10 0300
+1F13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+ : 1F11 0300
+1F14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+ : 1F10 0301
+1F15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+ : 1F11 0301
+1F18 GREEK CAPITAL LETTER EPSILON WITH PSILI
+ : 0395 0313
+1F19 GREEK CAPITAL LETTER EPSILON WITH DASIA
+ : 0395 0314
+1F1A GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+ : 1F18 0300
+1F1B GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+ : 1F19 0300
+1F1C GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+ : 1F18 0301
+1F1D GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+ : 1F19 0301
+1F20 GREEK SMALL LETTER ETA WITH PSILI
+ : 03B7 0313
+1F21 GREEK SMALL LETTER ETA WITH DASIA
+ : 03B7 0314
+1F22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+ : 1F20 0300
+1F23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+ : 1F21 0300
+1F24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+ : 1F20 0301
+1F25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+ : 1F21 0301
+1F26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+ : 1F20 0342
+1F27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+ : 1F21 0342
+1F28 GREEK CAPITAL LETTER ETA WITH PSILI
+ : 0397 0313
+1F29 GREEK CAPITAL LETTER ETA WITH DASIA
+ : 0397 0314
+1F2A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+ : 1F28 0300
+1F2B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+ : 1F29 0300
+1F2C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+ : 1F28 0301
+1F2D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+ : 1F29 0301
+1F2E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+ : 1F28 0342
+1F2F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+ : 1F29 0342
+1F30 GREEK SMALL LETTER IOTA WITH PSILI
+ : 03B9 0313
+1F31 GREEK SMALL LETTER IOTA WITH DASIA
+ : 03B9 0314
+1F32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+ : 1F30 0300
+1F33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+ : 1F31 0300
+1F34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+ : 1F30 0301
+1F35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+ : 1F31 0301
+1F36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+ : 1F30 0342
+1F37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+ : 1F31 0342
+1F38 GREEK CAPITAL LETTER IOTA WITH PSILI
+ : 0399 0313
+1F39 GREEK CAPITAL LETTER IOTA WITH DASIA
+ : 0399 0314
+1F3A GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+ : 1F38 0300
+1F3B GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+ : 1F39 0300
+1F3C GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+ : 1F38 0301
+1F3D GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+ : 1F39 0301
+1F3E GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+ : 1F38 0342
+1F3F GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+ : 1F39 0342
+1F40 GREEK SMALL LETTER OMICRON WITH PSILI
+ : 03BF 0313
+1F41 GREEK SMALL LETTER OMICRON WITH DASIA
+ : 03BF 0314
+1F42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+ : 1F40 0300
+1F43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+ : 1F41 0300
+1F44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+ : 1F40 0301
+1F45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+ : 1F41 0301
+1F48 GREEK CAPITAL LETTER OMICRON WITH PSILI
+ : 039F 0313
+1F49 GREEK CAPITAL LETTER OMICRON WITH DASIA
+ : 039F 0314
+1F4A GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+ : 1F48 0300
+1F4B GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+ : 1F49 0300
+1F4C GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+ : 1F48 0301
+1F4D GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+ : 1F49 0301
+1F50 GREEK SMALL LETTER UPSILON WITH PSILI
+ : 03C5 0313
+1F51 GREEK SMALL LETTER UPSILON WITH DASIA
+ : 03C5 0314
+1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+ : 1F50 0300
+1F53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+ : 1F51 0300
+1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+ : 1F50 0301
+1F55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+ : 1F51 0301
+1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+ : 1F50 0342
+1F57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+ : 1F51 0342
+1F59 GREEK CAPITAL LETTER UPSILON WITH DASIA
+ : 03A5 0314
+1F5B GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+ : 1F59 0300
+1F5D GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+ : 1F59 0301
+1F5F GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+ : 1F59 0342
+1F60 GREEK SMALL LETTER OMEGA WITH PSILI
+ : 03C9 0313
+1F61 GREEK SMALL LETTER OMEGA WITH DASIA
+ : 03C9 0314
+1F62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+ : 1F60 0300
+1F63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+ : 1F61 0300
+1F64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+ : 1F60 0301
+1F65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+ : 1F61 0301
+1F66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ : 1F60 0342
+1F67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ : 1F61 0342
+1F68 GREEK CAPITAL LETTER OMEGA WITH PSILI
+ : 03A9 0313
+1F69 GREEK CAPITAL LETTER OMEGA WITH DASIA
+ : 03A9 0314
+1F6A GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+ : 1F68 0300
+1F6B GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+ : 1F69 0300
+1F6C GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+ : 1F68 0301
+1F6D GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+ : 1F69 0301
+1F6E GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ : 1F68 0342
+1F6F GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ : 1F69 0342
+1F70 GREEK SMALL LETTER ALPHA WITH VARIA
+ : 03B1 0300
+1F71 GREEK SMALL LETTER ALPHA WITH OXIA
+ : 03AC greek small letter alpha with tonos
+1F72 GREEK SMALL LETTER EPSILON WITH VARIA
+ : 03B5 0300
+1F73 GREEK SMALL LETTER EPSILON WITH OXIA
+ : 03AD greek small letter epsilon with tonos
+1F74 GREEK SMALL LETTER ETA WITH VARIA
+ : 03B7 0300
+1F75 GREEK SMALL LETTER ETA WITH OXIA
+ : 03AE greek small letter eta with tonos
+1F76 GREEK SMALL LETTER IOTA WITH VARIA
+ : 03B9 0300
+1F77 GREEK SMALL LETTER IOTA WITH OXIA
+ : 03AF greek small letter iota with tonos
+1F78 GREEK SMALL LETTER OMICRON WITH VARIA
+ : 03BF 0300
+1F79 GREEK SMALL LETTER OMICRON WITH OXIA
+ : 03CC greek small letter omicron with tonos
+1F7A GREEK SMALL LETTER UPSILON WITH VARIA
+ : 03C5 0300
+1F7B GREEK SMALL LETTER UPSILON WITH OXIA
+ : 03CD greek small letter upsilon with tonos
+1F7C GREEK SMALL LETTER OMEGA WITH VARIA
+ : 03C9 0300
+1F7D GREEK SMALL LETTER OMEGA WITH OXIA
+ : 03CE greek small letter omega with tonos
+1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+ : 1F00 0345
+1F81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+ : 1F01 0345
+1F82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ : 1F02 0345
+1F83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ : 1F03 0345
+1F84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ : 1F04 0345
+1F85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ : 1F05 0345
+1F86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F06 0345
+1F87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F07 0345
+1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+ : 1F08 0345
+1F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+ : 1F09 0345
+1F8A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ : 1F0A 0345
+1F8B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ : 1F0B 0345
+1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ : 1F0C 0345
+1F8D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ : 1F0D 0345
+1F8E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F0E 0345
+1F8F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F0F 0345
+1F90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+ : 1F20 0345
+1F91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+ : 1F21 0345
+1F92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ : 1F22 0345
+1F93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ : 1F23 0345
+1F94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ : 1F24 0345
+1F95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ : 1F25 0345
+1F96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F26 0345
+1F97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F27 0345
+1F98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+ : 1F28 0345
+1F99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+ : 1F29 0345
+1F9A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ : 1F2A 0345
+1F9B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ : 1F2B 0345
+1F9C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ : 1F2C 0345
+1F9D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ : 1F2D 0345
+1F9E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F2E 0345
+1F9F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F2F 0345
+1FA0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+ : 1F60 0345
+1FA1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+ : 1F61 0345
+1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+ : 1F62 0345
+1FA3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+ : 1F63 0345
+1FA4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+ : 1F64 0345
+1FA5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+ : 1F65 0345
+1FA6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F66 0345
+1FA7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+ : 1F67 0345
+1FA8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+ : 1F68 0345
+1FA9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+ : 1F69 0345
+1FAA GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+ : 1F6A 0345
+1FAB GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+ : 1F6B 0345
+1FAC GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+ : 1F6C 0345
+1FAD GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+ : 1F6D 0345
+1FAE GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F6E 0345
+1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+ : 1F6F 0345
+1FB0 GREEK SMALL LETTER ALPHA WITH VRACHY
+ : 03B1 0306
+1FB1 GREEK SMALL LETTER ALPHA WITH MACRON
+ : 03B1 0304
+1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+ : 1F70 0345
+1FB3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+ : 03B1 0345
+1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+ : 03AC 0345
+1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+ : 03B1 0342
+1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+ : 1FB6 0345
+1FB8 GREEK CAPITAL LETTER ALPHA WITH VRACHY
+ : 0391 0306
+1FB9 GREEK CAPITAL LETTER ALPHA WITH MACRON
+ : 0391 0304
+1FBA GREEK CAPITAL LETTER ALPHA WITH VARIA
+ : 0391 0300
+1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA
+ : 0386 greek capital letter alpha with tonos
+1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+ : 0391 0345
+1FBD GREEK KORONIS
+ # 0020 0313
+1FBE GREEK PROSGEGRAMMENI
+ : 03B9 greek small letter iota
+1FBF GREEK PSILI
+ # 0020 0313
+1FC0 GREEK PERISPOMENI
+ # 0020 0342
+1FC1 GREEK DIALYTIKA AND PERISPOMENI
+ : 00A8 0342
+1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+ : 1F74 0345
+1FC3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+ : 03B7 0345
+1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+ : 03AE 0345
+1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI
+ : 03B7 0342
+1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+ : 1FC6 0345
+1FC8 GREEK CAPITAL LETTER EPSILON WITH VARIA
+ : 0395 0300
+1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA
+ : 0388 greek capital letter epsilon with tonos
+1FCA GREEK CAPITAL LETTER ETA WITH VARIA
+ : 0397 0300
+1FCB GREEK CAPITAL LETTER ETA WITH OXIA
+ : 0389 greek capital letter eta with tonos
+1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+ : 0397 0345
+1FCD GREEK PSILI AND VARIA
+ : 1FBF 0300
+1FCE GREEK PSILI AND OXIA
+ : 1FBF 0301
+1FCF GREEK PSILI AND PERISPOMENI
+ : 1FBF 0342
+1FD0 GREEK SMALL LETTER IOTA WITH VRACHY
+ : 03B9 0306
+1FD1 GREEK SMALL LETTER IOTA WITH MACRON
+ : 03B9 0304
+1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+ : 03CA 0300
+1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+ : 0390 greek small letter iota with dialytika and tonos
+1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI
+ : 03B9 0342
+1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+ : 03CA 0342
+1FD8 GREEK CAPITAL LETTER IOTA WITH VRACHY
+ : 0399 0306
+1FD9 GREEK CAPITAL LETTER IOTA WITH MACRON
+ : 0399 0304
+1FDA GREEK CAPITAL LETTER IOTA WITH VARIA
+ : 0399 0300
+1FDB GREEK CAPITAL LETTER IOTA WITH OXIA
+ : 038A greek capital letter iota with tonos
+1FDD GREEK DASIA AND VARIA
+ : 1FFE 0300
+1FDE GREEK DASIA AND OXIA
+ : 1FFE 0301
+1FDF GREEK DASIA AND PERISPOMENI
+ : 1FFE 0342
+1FE0 GREEK SMALL LETTER UPSILON WITH VRACHY
+ : 03C5 0306
+1FE1 GREEK SMALL LETTER UPSILON WITH MACRON
+ : 03C5 0304
+1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+ : 03CB 0300
+1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+ : 03B0 greek small letter upsilon with dialytika and tonos
+1FE4 GREEK SMALL LETTER RHO WITH PSILI
+ : 03C1 0313
+1FE5 GREEK SMALL LETTER RHO WITH DASIA
+ : 03C1 0314
+1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+ : 03C5 0342
+1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+ : 03CB 0342
+1FE8 GREEK CAPITAL LETTER UPSILON WITH VRACHY
+ : 03A5 0306
+1FE9 GREEK CAPITAL LETTER UPSILON WITH MACRON
+ : 03A5 0304
+1FEA GREEK CAPITAL LETTER UPSILON WITH VARIA
+ : 03A5 0300
+1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA
+ : 038E greek capital letter upsilon with tonos
+1FEC GREEK CAPITAL LETTER RHO WITH DASIA
+ : 03A1 0314
+1FED GREEK DIALYTIKA AND VARIA
+ : 00A8 0300
+1FEE GREEK DIALYTIKA AND OXIA
+ : 0385 greek dialytika tonos
+1FEF GREEK VARIA
+ : 0060 grave accent
+1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+ : 1F7C 0345
+1FF3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+ : 03C9 0345
+1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+ : 03CE 0345
+1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+ : 03C9 0342
+1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+ : 1FF6 0345
+1FF8 GREEK CAPITAL LETTER OMICRON WITH VARIA
+ : 039F 0300
+1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA
+ : 038C greek capital letter omicron with tonos
+1FFA GREEK CAPITAL LETTER OMEGA WITH VARIA
+ : 03A9 0300
+1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA
+ : 038F greek capital letter omega with tonos
+1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+ : 03A9 0345
+1FFD GREEK OXIA
+ : 00B4 acute accent
+1FFE GREEK DASIA
+ # 0020 0314
+@@ 2000 General Punctuation 206F
+@ Spaces
+2000 EN QUAD
+ : 2002 en space
+2001 EM QUAD
+ = mutton quad
+ : 2003 em space
+2002 EN SPACE
+ = nut
+ * half an em
+ # 0020 space
+2003 EM SPACE
+ = mutton
+ * nominally, a space equal to the type size in points
+ * may scale by the condensation factor of a font
+ # 0020 space
+2004 THREE-PER-EM SPACE
+ = thick space
+ # 0020 space
+2005 FOUR-PER-EM SPACE
+ = mid space
+ # 0020 space
+2006 SIX-PER-EM SPACE
+ * in computer typography sometimes equated to thin space
+ # 0020 space
+2007 FIGURE SPACE
+ * space equal to tabular width of a font
+ * this is equivalent to the digit width of fonts with fixed-width digits
+ # <noBreak> 0020
+2008 PUNCTUATION SPACE
+ * space equal to narrow punctuation of a font
+ # 0020 space
+2009 THIN SPACE
+ * a fifth of an em (or sometimes a sixth)
+ # 0020 space
+200A HAIR SPACE
+ * thinner than a thin space
+ * in traditional typography, the thinnest space available
+ # 0020 space
+200B ZERO WIDTH SPACE
+ * nominally zero width, but may expand in justification
+@ Formatting characters
+200C ZERO WIDTH NON-JOINER
+ = ZWNJ
+200D ZERO WIDTH JOINER
+ = ZWJ
+200E LEFT-TO-RIGHT MARK
+ = LRM
+200F RIGHT-TO-LEFT MARK
+ = RLM
+@ Dashes
+2010 HYPHEN
+ x (hyphen-minus - 002D)
+2011 NON-BREAKING HYPHEN
+ x (hyphen-minus - 002D)
+ # <noBreak> 2010
+2012 FIGURE DASH
+2013 EN DASH
+2014 EM DASH
+ * may be used in pairs to offset parenthetical text
+ x (katakana-hiragana prolonged sound mark - 30FC)
+2015 HORIZONTAL BAR
+ = QUOTATION DASH
+ * long dash introducing quoted text
+@ General punctuation
+2016 DOUBLE VERTICAL LINE
+ * used in pairs to indicate norm of a matrix
+ x (parallel to - 2225)
+2017 DOUBLE LOW LINE
+ * this is a spacing character
+ x (low line - 005F)
+ x (combining double low line - 0333)
+ # 0020 0333
+2018 LEFT SINGLE QUOTATION MARK
+ = SINGLE TURNED COMMA QUOTATION MARK
+ * this is the preferred glyph (as opposed to 201B)
+ x (apostrophe - 0027)
+ x (modifier letter turned comma - 02BB)
+ x (heavy single turned comma quotation mark ornament - 275B)
+2019 RIGHT SINGLE QUOTATION MARK
+ = SINGLE COMMA QUOTATION MARK
+ * this is the preferred character to use for apostrophe
+ x (apostrophe - 0027)
+ x (modifier letter apostrophe - 02BC)
+ x (heavy single comma quotation mark ornament - 275C)
+201A SINGLE LOW-9 QUOTATION MARK
+ = LOW SINGLE COMMA QUOTATION MARK
+ * used as opening single quotation mark in some languages
+201B SINGLE HIGH-REVERSED-9 QUOTATION MARK
+ = SINGLE REVERSED COMMA QUOTATION MARK
+ * glyph variant of 2018
+ x (modifier letter reversed comma - 02BD)
+201C LEFT DOUBLE QUOTATION MARK
+ = DOUBLE TURNED COMMA QUOTATION MARK
+ * this is the preferred glyph (as opposed to 201F)
+ x (quotation mark - 0022)
+ x (heavy double turned comma quotation mark ornament - 275D)
+ x (reversed double prime quotation mark - 301D)
+201D RIGHT DOUBLE QUOTATION MARK
+ = DOUBLE COMMA QUOTATION MARK
+ x (quotation mark - 0022)
+ x (double prime - 2033)
+ x (heavy double comma quotation mark ornament - 275E)
+ x (double prime quotation mark - 301E)
+201E DOUBLE LOW-9 QUOTATION MARK
+ = LOW DOUBLE COMMA QUOTATION MARK
+ * used as opening double quotation mark in some languages
+ x (low double prime quotation mark - 301F)
+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+ = DOUBLE REVERSED COMMA QUOTATION MARK
+ * glyph variant of 201C
+2020 DAGGER
+ = obelisk, obelus, long cross
+2021 DOUBLE DAGGER
+ = diesis, double obelisk
+2022 BULLET
+ = black small circle
+ x (middle dot - 00B7)
+ x (one dot leader - 2024)
+ x (bullet operator - 2219)
+ x (inverse bullet - 25D8)
+ x (white bullet - 25E6)
+2023 TRIANGULAR BULLET
+ x (end of proof - 220E)
+ x (black right-pointing small triangle - 25B8)
+2024 ONE DOT LEADER
+ x (middle dot - 00B7)
+ x (bullet - 2022)
+ x (bullet operator - 2219)
+ # 002E full stop
+2025 TWO DOT LEADER
+ # 002E 002E
+2026 HORIZONTAL ELLIPSIS
+ = three dot leader
+ x (vertical ellipsis - 22EE)
+ # 002E 002E 002E
+2027 HYPHENATION POINT
+@ Formatting characters
+2028 LINE SEPARATOR
+ * may be used to represent this semantic unambiguously
+2029 PARAGRAPH SEPARATOR
+ * may be used to represent this semantic unambiguously
+202A LEFT-TO-RIGHT EMBEDDING
+ = LRE
+202B RIGHT-TO-LEFT EMBEDDING
+ = RLE
+202C POP DIRECTIONAL FORMATTING
+ = PDF
+202D LEFT-TO-RIGHT OVERRIDE
+ = LRO
+202E RIGHT-TO-LEFT OVERRIDE
+ = RLO
+202F NARROW NO-BREAK SPACE
+ x (no-break space - 00A0)
+ # <noBreak> 0020
+@ General punctuation
+2030 PER MILLE SIGN
+ x (percent sign - 0025)
+2031 PER TEN THOUSAND SIGN
+ x (percent sign - 0025)
+2032 PRIME
+ = minutes, feet
+ x (apostrophe - 0027)
+ x (acute accent - 00B4)
+ x (modifier letter prime - 02B9)
+2033 DOUBLE PRIME
+ = seconds, inches
+ x (quotation mark - 0022)
+ x (modifier letter double prime - 02BA)
+ x (right double quotation mark - 201D)
+ x (ditto mark - 3003)
+ x (double prime quotation mark - 301E)
+ # 2032 2032
+2034 TRIPLE PRIME
+ # 2032 2032 2032
+2035 REVERSED PRIME
+ x (grave accent - 0060)
+2036 REVERSED DOUBLE PRIME
+ x (reversed double prime quotation mark - 301D)
+ # 2035 2035
+2037 REVERSED TRIPLE PRIME
+ # 2035 2035 2035
+2038 CARET
+ x (up arrowhead - 2303)
+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ = LEFT POINTING SINGLE GUILLEMET
+ * usually opening, sometimes closing
+ x (less-than sign - 003C)
+ x (left-pointing angle bracket - 2329)
+ x (left angle bracket - 3008)
+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ = RIGHT POINTING SINGLE GUILLEMET
+ * usually closing, sometimes opening
+ x (greater-than sign - 003E)
+ x (right-pointing angle bracket - 232A)
+ x (right angle bracket - 3009)
+203B REFERENCE MARK
+ = Japanese kome
+ = Urdu paragraph separator
+ x (tibetan ku ru kha bzhi mig can - 0FBF)
+203C DOUBLE EXCLAMATION MARK
+ x (exclamation mark - 0021)
+ # 0021 0021
+203D INTERROBANG
+ x (exclamation mark - 0021)
+ x (question mark - 003F)
+203E OVERLINE
+ = SPACING OVERSCORE
+ # 0020 0305
+203F UNDERTIE (Enotikon)
+ = Greek enotikon
+ x (smile - 2323)
+2040 CHARACTER TIE
+ x (frown - 2322)
+2041 CARET INSERTION POINT
+ * proofreader's mark: insert here
+ x (right semidirect product - 22CC)
+2042 ASTERISM
+2043 HYPHEN BULLET
+2044 FRACTION SLASH
+ = solidus (in typography)
+ * for composing arbitrary fractions
+ x (solidus - 002F)
+ x (division slash - 2215)
+2045 LEFT SQUARE BRACKET WITH QUILL
+2046 RIGHT SQUARE BRACKET WITH QUILL
+2048 QUESTION EXCLAMATION MARK
+ * designed for use in vertical text
+ # 003F 0021
+2049 EXCLAMATION QUESTION MARK
+ * designed for use in vertical text
+ # 0021 003F
+204A TIRONIAN SIGN ET
+ * Irish Gaelic, ...
+204B REVERSED PILCROW SIGN
+ x (pilcrow sign - 00B6)
+204C BLACK LEFTWARDS BULLET
+204D BLACK RIGHTWARDS BULLET
+@ Deprecated
+206A INHIBIT SYMMETRIC SWAPPING
+206B ACTIVATE SYMMETRIC SWAPPING
+206C INHIBIT ARABIC FORM SHAPING
+206D ACTIVATE ARABIC FORM SHAPING
+206E NATIONAL DIGIT SHAPES
+206F NOMINAL DIGIT SHAPES
+@@ 2070 Superscripts and Subscripts 209F
+@ Superscripts
+2070 SUPERSCRIPT ZERO
+ # <super> 0030
+2071 <reserved>
+ x (superscript one - 00B9)
+2072 <reserved>
+ x (superscript two - 00B2)
+2073 <reserved>
+ x (superscript three - 00B3)
+2074 SUPERSCRIPT FOUR
+ # <super> 0034
+2075 SUPERSCRIPT FIVE
+ # <super> 0035
+2076 SUPERSCRIPT SIX
+ # <super> 0036
+2077 SUPERSCRIPT SEVEN
+ # <super> 0037
+2078 SUPERSCRIPT EIGHT
+ # <super> 0038
+2079 SUPERSCRIPT NINE
+ # <super> 0039
+207A SUPERSCRIPT PLUS SIGN
+ # <super> 002B
+207B SUPERSCRIPT MINUS
+ # <super> 2212
+207C SUPERSCRIPT EQUALS SIGN
+ # <super> 003D
+207D SUPERSCRIPT LEFT PARENTHESIS
+ # <super> 0028
+207E SUPERSCRIPT RIGHT PARENTHESIS
+ # <super> 0029
+207F SUPERSCRIPT LATIN SMALL LETTER N
+ # <super> 006E
+@ Subscripts
+2080 SUBSCRIPT ZERO
+ # <sub> 0030
+2081 SUBSCRIPT ONE
+ # <sub> 0031
+2082 SUBSCRIPT TWO
+ # <sub> 0032
+2083 SUBSCRIPT THREE
+ # <sub> 0033
+2084 SUBSCRIPT FOUR
+ # <sub> 0034
+2085 SUBSCRIPT FIVE
+ # <sub> 0035
+2086 SUBSCRIPT SIX
+ # <sub> 0036
+2087 SUBSCRIPT SEVEN
+ # <sub> 0037
+2088 SUBSCRIPT EIGHT
+ # <sub> 0038
+2089 SUBSCRIPT NINE
+ # <sub> 0039
+208A SUBSCRIPT PLUS SIGN
+ # <sub> 002B
+208B SUBSCRIPT MINUS
+ # <sub> 2212
+208C SUBSCRIPT EQUALS SIGN
+ # <sub> 003D
+208D SUBSCRIPT LEFT PARENTHESIS
+ # <sub> 0028
+208E SUBSCRIPT RIGHT PARENTHESIS
+ # <sub> 0029
+@@ 20A0 Currency Symbols 20CF
+@ Currency symbols
+@+ A number of currency symbols are found in other blocks.
+ x (dollar sign - 0024)
+ x (cent sign - 00A2)
+ x (pound sign - 00A3)
+ x (currency sign - 00A4)
+ x (yen sign - 00A5)
+ x (bengali rupee mark - 09F2)
+ x (bengali rupee sign - 09F3)
+ x (thai currency symbol baht - 0E3F)
+ x (khmer currency symbol riel - 17DB)
+20A0 EURO-CURRENCY SIGN
+ * intended for ECU, but not widely used
+ * historical character, this is NOT the euro!
+ x (euro sign - 20AC)
+20A1 COLON SIGN
+ * Costa Rica, El Salvador
+20A2 CRUZEIRO SIGN
+ * Brazil
+20A3 FRENCH FRANC SIGN
+ * France
+20A4 LIRA SIGN
+ * Italy, Turkey
+ x (pound sign - 00A3)
+20A5 MILL SIGN
+ * USA (1/10 cent)
+20A6 NAIRA SIGN
+ * Nigeria
+20A7 PESETA SIGN
+ * Spain
+20A8 RUPEE SIGN
+ * India
+ # 0052 0073
+20A9 WON SIGN
+ * Korea
+20AA NEW SHEQEL SIGN
+ * Israel
+20AB DONG SIGN
+ * Vietnam
+20AC EURO SIGN
+ * currency sign for the European Monetary Union
+ * euro, not ECU
+ x (euro-currency sign - 20A0)
+20AD KIP SIGN
+ * Laos
+20AE TUGRIK SIGN
+ * Mongolia
+ * also transliterated as tugrug, tugric, tugrog, togrog
+20AF DRACHMA SIGN
+ * Greece
+@@ 20D0 Combining Diacritical Marks for Symbols 20FF
+@ Combining diacritical marks for symbols
+20D0 COMBINING LEFT HARPOON ABOVE
+20D1 COMBINING RIGHT HARPOON ABOVE
+ * vector
+20D2 COMBINING LONG VERTICAL LINE OVERLAY
+20D3 COMBINING SHORT VERTICAL LINE OVERLAY
+ * negation
+20D4 COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5 COMBINING CLOCKWISE ARROW ABOVE
+ * rotation
+20D6 COMBINING LEFT ARROW ABOVE
+20D7 COMBINING RIGHT ARROW ABOVE
+ * vector
+20D8 COMBINING RING OVERLAY
+20D9 COMBINING CLOCKWISE RING OVERLAY
+20DA COMBINING ANTICLOCKWISE RING OVERLAY
+20DB COMBINING THREE DOTS ABOVE
+ = third derivative
+20DC COMBINING FOUR DOTS ABOVE
+ = fourth derivative
+@ Enclosing diacritics
+20DD COMBINING ENCLOSING CIRCLE
+ = JIS composition circle
+ x (white circle - 25CB)
+ x (large circle - 25EF)
+ x (ideographic number zero - 3007)
+20DE COMBINING ENCLOSING SQUARE
+ x (white square - 25A1)
+20DF COMBINING ENCLOSING DIAMOND
+ x (white diamond - 25C7)
+20E0 COMBINING ENCLOSING CIRCLE BACKSLASH
+ * prohibition
+@ Additional diacritical mark for symbols
+20E1 COMBINING LEFT RIGHT ARROW ABOVE
+ * tensor
+@ Additional enclosing diacritics
+20E2 COMBINING ENCLOSING SCREEN
+ x (clear screen symbol - 239A)
+20E3 COMBINING ENCLOSING KEYCAP
+@@ 2100 Letterlike Symbols 214F
+@ Letterlike symbols
+2100 ACCOUNT OF
+ # 0061 002F 0063
+2101 ADDRESSED TO THE SUBJECT
+ # 0061 002F 0073
+2102 DOUBLE-STRUCK CAPITAL C
+ = the set of complex numbers
+ # <font> 0043 latin capital letter c
+2103 DEGREE CELSIUS
+ = degrees Centigrade
+ # 00B0 0043
+2104 CENTRE LINE SYMBOL
+ = clone
+2105 CARE OF
+ # 0063 002F 006F
+2106 CADA UNA
+ # 0063 002F 0075
+2107 EULER CONSTANT
+ x (latin capital letter e - 0045)
+ # 0190 latin capital letter open e
+2108 SCRUPLE
+2109 DEGREE FAHRENHEIT
+ # 00B0 0046
+210A SCRIPT SMALL G
+ = real number symbol
+ # <font> 0067 latin small letter g
+210B SCRIPT CAPITAL H
+ = Hamiltonian function
+ # <font> 0048 latin capital letter h
+210C BLACK-LETTER CAPITAL H
+ = Hilbert space
+ # <font> 0048 latin capital letter h
+210D DOUBLE-STRUCK CAPITAL H
+ # <font> 0048 latin capital letter h
+210E PLANCK CONSTANT
+ # <font> 0068 latin small letter h
+210F PLANCK CONSTANT OVER TWO PI
+ x (cyrillic small letter tshe - 045B)
+ # <font> 0127 latin small letter h with stroke
+2110 SCRIPT CAPITAL I
+ # <font> 0049 latin capital letter i
+2111 BLACK-LETTER CAPITAL I
+ = imaginary part
+ # <font> 0049 latin capital letter i
+2112 SCRIPT CAPITAL L
+ = Laplace symbol
+ # <font> 004C latin capital letter l
+2113 SCRIPT SMALL L
+ = liter (not an official SI recommendation)
+ # <font> 006C latin small letter l
+2114 L B BAR SYMBOL
+ = pounds
+2115 DOUBLE-STRUCK CAPITAL N
+ = natural number
+ # <font> 004E latin capital letter n
+2116 NUMERO SIGN
+ # 004E 006F
+2117 SOUND RECORDING COPYRIGHT
+ = published
+ = phonorecord sign
+ x (copyright sign - 00A9)
+2118 SCRIPT CAPITAL P
+ = Weierstrass elliptic function
+ * actually this has the form of a lowercase calligraphic p, despite its name
+2119 DOUBLE-STRUCK CAPITAL P
+ # <font> 0050 latin capital letter p
+211A DOUBLE-STRUCK CAPITAL Q
+ = the set of rational numbers
+ # <font> 0051 latin capital letter q
+211B SCRIPT CAPITAL R
+ = Riemann Integral
+ # <font> 0052 latin capital letter r
+211C BLACK-LETTER CAPITAL R
+ = real part
+ # <font> 0052 latin capital letter r
+211D DOUBLE-STRUCK CAPITAL R
+ = the set of real numbers
+ # <font> 0052 latin capital letter r
+211E PRESCRIPTION TAKE
+ = recipe
+ = cross ratio
+211F RESPONSE
+2120 SERVICE MARK
+ # <super> 0053 004D
+2121 TELEPHONE SIGN
+ # 0054 0045 004C
+2122 TRADE MARK SIGN
+ # <super> 0054 004D
+2123 VERSICLE
+2124 DOUBLE-STRUCK CAPITAL Z
+ = the set of integers
+ # <font> 005A latin capital letter z
+2125 OUNCE SIGN
+ x (latin small letter yogh - 021D)
+2126 OHM SIGN
+ = resistance
+ : 03A9 greek capital letter omega
+2127 INVERTED OHM SIGN
+ = MHO
+ = conductance
+ * typographically a turned greek capital letter omega
+ x (latin capital letter upsilon - 01B1)
+ x (greek capital letter omega - 03A9)
+2128 BLACK-LETTER CAPITAL Z
+ # <font> 005A latin capital letter z
+2129 TURNED GREEK SMALL LETTER IOTA
+ * unique element fulfilling a description (logic)
+ x (greek small letter iota - 03B9)
+212A KELVIN SIGN
+ : 004B latin capital letter k
+212B ANGSTROM SIGN
+ : 00C5 latin capital letter a with ring above
+212C SCRIPT CAPITAL B
+ = Bernoulli function
+ # <font> 0042 latin capital letter b
+212D BLACK-LETTER CAPITAL C
+ # <font> 0043 latin capital letter c
+212E ESTIMATED SYMBOL
+ * used in European packaging
+ x (latin small letter e - 0065)
+212F SCRIPT SMALL E
+ = error
+ # <font> 0065 latin small letter e
+2130 SCRIPT CAPITAL E
+ = EMF (Electro-Magnetic Force)
+ # <font> 0045 latin capital letter e
+2131 SCRIPT CAPITAL F
+ = Fourier transform
+ # <font> 0046 latin capital letter f
+2132 TURNED CAPITAL F
+ x (latin capital letter f - 0046)
+2133 SCRIPT CAPITAL M
+ = M-matrix (physics)
+ = German Mark (not the current Deutsche Mark)
+ # <font> 004D latin capital letter m
+2134 SCRIPT SMALL O
+ = order, of inferior order to
+ # <font> 006F latin small letter o
+@ Hebrew letterlike math symbols (left-to-right)
+2135 ALEF SYMBOL
+ = first transfinite cardinal (countable)
+ # 05D0 hebrew letter alef
+2136 BET SYMBOL
+ = second transfinite cardinal (the continuum)
+ # 05D1 hebrew letter bet
+2137 GIMEL SYMBOL
+ = third transfinite cardinal (functions of a real variable)
+ # 05D2 hebrew letter gimel
+2138 DALET SYMBOL
+ = fourth transfinite cardinal
+ # 05D3 hebrew letter dalet
+@ Additional letterlike symbols
+2139 INFORMATION SOURCE
+ * intended for use with 20DD
+ # <font> 0069 latin small letter i
+213A ROTATED CAPITAL Q
+ * a binding signature mark
+@@ 2150 Number Forms 218F
+@ Fractions
+@+ Other fraction number forms are found in the Latin-1 Supplement block.
+ x (vulgar fraction one quarter - 00BC)
+ x (vulgar fraction one half - 00BD)
+ x (vulgar fraction three quarters - 00BE)
+2153 VULGAR FRACTION ONE THIRD
+ # 0031 2044 0033
+2154 VULGAR FRACTION TWO THIRDS
+ # 0032 2044 0033
+2155 VULGAR FRACTION ONE FIFTH
+ # 0031 2044 0035
+2156 VULGAR FRACTION TWO FIFTHS
+ # 0032 2044 0035
+2157 VULGAR FRACTION THREE FIFTHS
+ # 0033 2044 0035
+2158 VULGAR FRACTION FOUR FIFTHS
+ # 0034 2044 0035
+2159 VULGAR FRACTION ONE SIXTH
+ # 0031 2044 0036
+215A VULGAR FRACTION FIVE SIXTHS
+ # 0035 2044 0036
+215B VULGAR FRACTION ONE EIGHTH
+ # 0031 2044 0038
+215C VULGAR FRACTION THREE EIGHTHS
+ # 0033 2044 0038
+215D VULGAR FRACTION FIVE EIGHTHS
+ # 0035 2044 0038
+215E VULGAR FRACTION SEVEN EIGHTHS
+ # 0037 2044 0038
+215F FRACTION NUMERATOR ONE
+ # 0031 2044
+@ Roman numerals
+2160 ROMAN NUMERAL ONE
+ # 0049 latin capital letter i
+2161 ROMAN NUMERAL TWO
+ # 0049 0049
+2162 ROMAN NUMERAL THREE
+ # 0049 0049 0049
+2163 ROMAN NUMERAL FOUR
+ # 0049 0056
+2164 ROMAN NUMERAL FIVE
+ # 0056 latin capital letter v
+2165 ROMAN NUMERAL SIX
+ # 0056 0049
+2166 ROMAN NUMERAL SEVEN
+ # 0056 0049 0049
+2167 ROMAN NUMERAL EIGHT
+ # 0056 0049 0049 0049
+2168 ROMAN NUMERAL NINE
+ # 0049 0058
+2169 ROMAN NUMERAL TEN
+ # 0058 latin capital letter x
+216A ROMAN NUMERAL ELEVEN
+ # 0058 0049
+216B ROMAN NUMERAL TWELVE
+ # 0058 0049 0049
+216C ROMAN NUMERAL FIFTY
+ # 004C latin capital letter l
+216D ROMAN NUMERAL ONE HUNDRED
+ # 0043 latin capital letter c
+216E ROMAN NUMERAL FIVE HUNDRED
+ # 0044 latin capital letter d
+216F ROMAN NUMERAL ONE THOUSAND
+ # 004D latin capital letter m
+2170 SMALL ROMAN NUMERAL ONE
+ # 0069 latin small letter i
+2171 SMALL ROMAN NUMERAL TWO
+ # 0069 0069
+2172 SMALL ROMAN NUMERAL THREE
+ # 0069 0069 0069
+2173 SMALL ROMAN NUMERAL FOUR
+ # 0069 0076
+2174 SMALL ROMAN NUMERAL FIVE
+ # 0076 latin small letter v
+2175 SMALL ROMAN NUMERAL SIX
+ # 0076 0069
+2176 SMALL ROMAN NUMERAL SEVEN
+ # 0076 0069 0069
+2177 SMALL ROMAN NUMERAL EIGHT
+ # 0076 0069 0069 0069
+2178 SMALL ROMAN NUMERAL NINE
+ # 0069 0078
+2179 SMALL ROMAN NUMERAL TEN
+ # 0078 latin small letter x
+217A SMALL ROMAN NUMERAL ELEVEN
+ # 0078 0069
+217B SMALL ROMAN NUMERAL TWELVE
+ # 0078 0069 0069
+217C SMALL ROMAN NUMERAL FIFTY
+ # 006C latin small letter l
+217D SMALL ROMAN NUMERAL ONE HUNDRED
+ # 0063 latin small letter c
+217E SMALL ROMAN NUMERAL FIVE HUNDRED
+ # 0064 latin small letter d
+217F SMALL ROMAN NUMERAL ONE THOUSAND
+ # 006D latin small letter m
+2180 ROMAN NUMERAL ONE THOUSAND C D
+2181 ROMAN NUMERAL FIVE THOUSAND
+2182 ROMAN NUMERAL TEN THOUSAND
+2183 ROMAN NUMERAL REVERSED ONE HUNDRED
+ * used in combination with C and I to form large numbers
+@@ 2190 Arrows 21FF
+@ Arrows
+2190 LEFTWARDS ARROW
+2191 UPWARDS ARROW
+ * IPA: egressive airflow
+2192 RIGHTWARDS ARROW
+ = z notation total function
+2193 DOWNWARDS ARROW
+ * IPA: ingressive airflow
+2194 LEFT RIGHT ARROW
+ = z notation relation
+2195 UP DOWN ARROW
+2196 NORTH WEST ARROW
+2197 NORTH EAST ARROW
+2198 SOUTH EAST ARROW
+2199 SOUTH WEST ARROW
+219A LEFTWARDS ARROW WITH STROKE
+ * negation of 2190
+ : 2190 0338
+219B RIGHTWARDS ARROW WITH STROKE
+ * negation of 2192
+ : 2192 0338
+219C LEFTWARDS WAVE ARROW
+219D RIGHTWARDS WAVE ARROW
+219E LEFTWARDS TWO HEADED ARROW
+219F UPWARDS TWO HEADED ARROW
+21A0 RIGHTWARDS TWO HEADED ARROW
+ = z notation total surjection
+21A1 DOWNWARDS TWO HEADED ARROW
+ = form feed
+21A2 LEFTWARDS ARROW WITH TAIL
+21A3 RIGHTWARDS ARROW WITH TAIL
+ = z notation total injection
+21A4 LEFTWARDS ARROW FROM BAR
+21A5 UPWARDS ARROW FROM BAR
+21A6 RIGHTWARDS ARROW FROM BAR
+ = z notation maplet
+21A7 DOWNWARDS ARROW FROM BAR
+ = depth symbol
+21A8 UP DOWN ARROW WITH BASE
+21A9 LEFTWARDS ARROW WITH HOOK
+21AA RIGHTWARDS ARROW WITH HOOK
+21AB LEFTWARDS ARROW WITH LOOP
+21AC RIGHTWARDS ARROW WITH LOOP
+21AD LEFT RIGHT WAVE ARROW
+21AE LEFT RIGHT ARROW WITH STROKE
+ * negation of 2194
+ : 2194 0338
+21AF DOWNWARDS ZIGZAG ARROW
+ = electrolysis
+21B0 UPWARDS ARROW WITH TIP LEFTWARDS
+21B1 UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2 DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3 DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+ = line feed
+21B5 DOWNWARDS ARROW WITH CORNER LEFTWARDS
+ = carriage return, new line
+21B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7 CLOCKWISE TOP SEMICIRCLE ARROW
+21B8 NORTH WEST ARROW TO LONG BAR
+ = home
+21B9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+ = tab with shift tab
+21BA ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB CLOCKWISE OPEN CIRCLE ARROW
+21BC LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0 RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3 DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7 LEFTWARDS PAIRED ARROWS
+21C8 UPWARDS PAIRED ARROWS
+21C9 RIGHTWARDS PAIRED ARROWS
+21CA DOWNWARDS PAIRED ARROWS
+21CB LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD LEFTWARDS DOUBLE ARROW WITH STROKE
+ * negation of 21D0
+ : 21D0 0338
+21CE LEFT RIGHT DOUBLE ARROW WITH STROKE
+ * negation of 21D4
+ : 21D4 0338
+21CF RIGHTWARDS DOUBLE ARROW WITH STROKE
+ * negation of 21D2
+ : 21D2 0338
+21D0 LEFTWARDS DOUBLE ARROW
+21D1 UPWARDS DOUBLE ARROW
+21D2 RIGHTWARDS DOUBLE ARROW
+21D3 DOWNWARDS DOUBLE ARROW
+21D4 LEFT RIGHT DOUBLE ARROW
+21D5 UP DOWN DOUBLE ARROW
+21D6 NORTH WEST DOUBLE ARROW
+21D7 NORTH EAST DOUBLE ARROW
+21D8 SOUTH EAST DOUBLE ARROW
+21D9 SOUTH WEST DOUBLE ARROW
+21DA LEFTWARDS TRIPLE ARROW
+21DB RIGHTWARDS TRIPLE ARROW
+21DC LEFTWARDS SQUIGGLE ARROW
+21DD RIGHTWARDS SQUIGGLE ARROW
+21DE UPWARDS ARROW WITH DOUBLE STROKE
+ = page up
+21DF DOWNWARDS ARROW WITH DOUBLE STROKE
+ = page down
+21E0 LEFTWARDS DASHED ARROW
+21E1 UPWARDS DASHED ARROW
+21E2 RIGHTWARDS DASHED ARROW
+21E3 DOWNWARDS DASHED ARROW
+21E4 LEFTWARDS ARROW TO BAR
+ = leftward tab
+21E5 RIGHTWARDS ARROW TO BAR
+ = rightward tab
+21E6 LEFTWARDS WHITE ARROW
+21E7 UPWARDS WHITE ARROW
+ = shift
+21E8 RIGHTWARDS WHITE ARROW
+21E9 DOWNWARDS WHITE ARROW
+21EA UPWARDS WHITE ARROW FROM BAR
+ = caps lock
+21EB UPWARDS WHITE ARROW ON PEDESTAL
+ = level 2 lock
+21EC UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+ = caps lock
+21ED UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+ = numerics lock
+21EE UPWARDS WHITE DOUBLE ARROW
+ = level 3 select
+21EF UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+ = level 3 lock
+21F0 RIGHTWARDS WHITE ARROW FROM WALL
+ = group lock
+21F1 NORTH WEST ARROW TO CORNER
+ = home
+21F2 SOUTH EAST ARROW TO CORNER
+ = end
+21F3 UP DOWN WHITE ARROW
+ = scrolling
+@@ 2200 Mathematical Operators 22FF
+@ Mathematical operators
+2200 FOR ALL
+2201 COMPLEMENT
+ x (latin letter stretched c - 0297)
+2202 PARTIAL DIFFERENTIAL
+2203 THERE EXISTS
+2204 THERE DOES NOT EXIST
+ : 2203 0338
+2205 EMPTY SET
+ = null set
+ x (latin capital letter o with stroke - 00D8)
+ x (diameter sign - 2300)
+2206 INCREMENT
+ = Laplace operator
+ = forward difference
+ x (greek capital letter delta - 0394)
+ x (white up-pointing triangle - 25B3)
+2207 NABLA
+ = Laplace operator (written with superscript 2)
+ = backward difference
+ = del
+ x (white down-pointing triangle - 25BD)
+2208 ELEMENT OF
+2209 NOT AN ELEMENT OF
+ : 2208 0338
+220A SMALL ELEMENT OF
+ * originates in math pi fonts; not the straight epsilon
+220B CONTAINS AS MEMBER
+ = such that
+220C DOES NOT CONTAIN AS MEMBER
+ : 220B 0338
+220D SMALL CONTAINS AS MEMBER
+220E END OF PROOF
+ = Q.E.D.
+ x (triangular bullet - 2023)
+ x (black vertical rectangle - 25AE)
+220F N-ARY PRODUCT
+ = product sign
+ x (greek capital letter pi - 03A0)
+2210 N-ARY COPRODUCT
+ = coproduct sign
+2211 N-ARY SUMMATION
+ = summation sign
+ x (greek capital letter sigma - 03A3)
+2212 MINUS SIGN
+ x (hyphen-minus - 002D)
+2213 MINUS-OR-PLUS SIGN
+ x (plus-minus sign - 00B1)
+2214 DOT PLUS
+2215 DIVISION SLASH
+ * generic division operator
+ x (solidus - 002F)
+ x (fraction slash - 2044)
+2216 SET MINUS
+ x (reverse solidus - 005C)
+2217 ASTERISK OPERATOR
+ x (asterisk - 002A)
+2218 RING OPERATOR
+ = composite function
+ = APL jot
+ x (degree sign - 00B0)
+ x (white bullet - 25E6)
+2219 BULLET OPERATOR
+ x (middle dot - 00B7)
+ x (bullet - 2022)
+ x (one dot leader - 2024)
+221A SQUARE ROOT
+ = radical sign
+ x (check mark - 2713)
+221B CUBE ROOT
+221C FOURTH ROOT
+221D PROPORTIONAL TO
+ x (greek small letter alpha - 03B1)
+221E INFINITY
+221F RIGHT ANGLE
+2220 ANGLE
+2221 MEASURED ANGLE
+2222 SPHERICAL ANGLE
+ = angle arc
+2223 DIVIDES
+ = such that
+ = APL stile
+ x (vertical line - 007C)
+ x (latin letter dental click - 01C0)
+2224 DOES NOT DIVIDE
+ : 2223 0338
+2225 PARALLEL TO
+ x (latin letter lateral click - 01C1)
+ x (double vertical line - 2016)
+2226 NOT PARALLEL TO
+ : 2225 0338
+2227 LOGICAL AND
+ = wedge, conjunction
+ x (n-ary logical and - 22C0)
+ x (up arrowhead - 2303)
+2228 LOGICAL OR
+ = vee, disjunction
+ x (n-ary logical or - 22C1)
+ x (down arrowhead - 2304)
+2229 INTERSECTION
+ = cap, hat
+ x (n-ary intersection - 22C2)
+222A UNION
+ = cup
+ x (n-ary union - 22C3)
+222B INTEGRAL
+ x (latin small letter esh - 0283)
+222C DOUBLE INTEGRAL
+ # 222B 222B
+222D TRIPLE INTEGRAL
+ # 222B 222B 222B
+222E CONTOUR INTEGRAL
+222F SURFACE INTEGRAL
+ # 222E 222E
+2230 VOLUME INTEGRAL
+ # 222E 222E 222E
+2231 CLOCKWISE INTEGRAL
+2232 CLOCKWISE CONTOUR INTEGRAL
+2233 ANTICLOCKWISE CONTOUR INTEGRAL
+ * clockwise or anticlockwise arrows do not reverse during layout mirroring
+2234 THEREFORE
+2235 BECAUSE
+2236 RATIO
+ x (colon - 003A)
+2237 PROPORTION
+2238 DOT MINUS
+ = symmetric difference
+2239 EXCESS
+223A GEOMETRIC PROPORTION
+223B HOMOTHETIC
+223C TILDE OPERATOR
+ = varies with (proportional to)
+ = difference between
+ = similar to
+ = not
+ = cycle
+ = APL tilde
+ x (tilde - 007E)
+ x (not sign - 00AC)
+ x (small tilde - 02DC)
+223D REVERSED TILDE (lazy S)
+ = lazy S
+ * reversed tilde and lazy S are glyph variants
+223E INVERTED LAZY S
+ = most positive
+223F SINE WAVE
+ = alternating current
+2240 WREATH PRODUCT
+2241 NOT TILDE
+ : 223C 0338
+2242 MINUS TILDE
+2243 ASYMPTOTICALLY EQUAL TO
+2244 NOT ASYMPTOTICALLY EQUAL TO
+ : 2243 0338
+2245 APPROXIMATELY EQUAL TO
+2246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+ : 2245 0338
+2248 ALMOST EQUAL TO
+ = asymptotic to
+2249 NOT ALMOST EQUAL TO
+ : 2248 0338
+224A ALMOST EQUAL OR EQUAL TO
+224B TRIPLE TILDE
+224C ALL EQUAL TO
+ * reversed tilde and lazy S are glyph variants
+224D EQUIVALENT TO
+224E GEOMETRICALLY EQUIVALENT TO
+224F DIFFERENCE BETWEEN
+2250 APPROACHES THE LIMIT
+2251 GEOMETRICALLY EQUAL TO
+2252 APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ = nearly equals
+2253 IMAGE OF OR APPROXIMATELY EQUAL TO
+2254 COLON EQUALS
+2255 EQUALS COLON
+2256 RING IN EQUAL TO
+2257 RING EQUAL TO
+ = approximately equal to
+2258 CORRESPONDS TO
+2259 ESTIMATES
+ = corresponds to
+225A EQUIANGULAR TO
+225B STAR EQUALS
+225C DELTA EQUAL TO
+ = equiangular
+ = equal to by definition
+225D EQUAL TO BY DEFINITION
+225E MEASURED BY
+225F QUESTIONED EQUAL TO
+2260 NOT EQUAL TO
+ x (equals sign - 003D)
+ x (latin letter alveolar click - 01C2)
+ : 003D 0338
+2261 IDENTICAL TO
+2262 NOT IDENTICAL TO
+ : 2261 0338
+2263 STRICTLY EQUIVALENT TO
+2264 LESS-THAN OR EQUAL TO
+2265 GREATER-THAN OR EQUAL TO
+2266 LESS-THAN OVER EQUAL TO
+2267 GREATER-THAN OVER EQUAL TO
+2268 LESS-THAN BUT NOT EQUAL TO
+2269 GREATER-THAN BUT NOT EQUAL TO
+226A MUCH LESS-THAN
+ x (left-pointing double angle quotation mark - 00AB)
+226B MUCH GREATER-THAN
+ x (right-pointing double angle quotation mark - 00BB)
+226C BETWEEN
+ = plaintiff, quantic
+226D NOT EQUIVALENT TO
+ : 224D 0338
+226E NOT LESS-THAN
+ : 003C 0338
+226F NOT GREATER-THAN
+ : 003E 0338
+2270 NEITHER LESS-THAN NOR EQUAL TO
+ : 2264 0338
+2271 NEITHER GREATER-THAN NOR EQUAL TO
+ : 2265 0338
+2272 LESS-THAN OR EQUIVALENT TO
+2273 GREATER-THAN OR EQUIVALENT TO
+2274 NEITHER LESS-THAN NOR EQUIVALENT TO
+ : 2272 0338
+2275 NEITHER GREATER-THAN NOR EQUIVALENT TO
+ : 2273 0338
+2276 LESS-THAN OR GREATER-THAN
+2277 GREATER-THAN OR LESS-THAN
+2278 NEITHER LESS-THAN NOR GREATER-THAN
+ : 2276 0338
+2279 NEITHER GREATER-THAN NOR LESS-THAN
+ : 2277 0338
+227A PRECEDES
+ = lower rank than
+ x (precedes under relation - 22B0)
+227B SUCCEEDS
+ = higher rank than
+ x (succeeds under relation - 22B1)
+227C PRECEDES OR EQUAL TO
+227D SUCCEEDS OR EQUAL TO
+227E PRECEDES OR EQUIVALENT TO
+227F SUCCEEDS OR EQUIVALENT TO
+2280 DOES NOT PRECEDE
+ : 227A 0338
+2281 DOES NOT SUCCEED
+ : 227B 0338
+2282 SUBSET OF
+ = included in set
+2283 SUPERSET OF
+ = includes in set
+2284 NOT A SUBSET OF
+ : 2282 0338
+2285 NOT A SUPERSET OF
+ : 2283 0338
+2286 SUBSET OF OR EQUAL TO
+2287 SUPERSET OF OR EQUAL TO
+2288 NEITHER A SUBSET OF NOR EQUAL TO
+ : 2286 0338
+2289 NEITHER A SUPERSET OF NOR EQUAL TO
+ : 2287 0338
+228A SUBSET OF WITH NOT EQUAL TO
+228B SUPERSET OF WITH NOT EQUAL TO
+228C MULTISET
+228D MULTISET MULTIPLICATION
+228E MULTISET UNION
+ = z notation bag addition
+228F SQUARE IMAGE OF
+2290 SQUARE ORIGINAL OF
+2291 SQUARE IMAGE OF OR EQUAL TO
+2292 SQUARE ORIGINAL OF OR EQUAL TO
+2293 SQUARE CAP
+2294 SQUARE CUP
+2295 CIRCLED PLUS
+ = direct sum
+ = vector pointing into page
+ x (earth - 2641)
+2296 CIRCLED MINUS
+ = symmetric difference
+2297 CIRCLED TIMES
+ = tensor product
+ = vector pointing into page
+2298 CIRCLED DIVISION SLASH
+2299 CIRCLED DOT OPERATOR
+ = direct product
+ = vector pointing out of page
+ x (latin letter bilabial click - 0298)
+ x (sun - 2609)
+229A CIRCLED RING OPERATOR
+ x (apl functional symbol circle jot - 233E)
+ x (bullseye - 25CE)
+229B CIRCLED ASTERISK OPERATOR
+229C CIRCLED EQUALS
+229D CIRCLED DASH
+229E SQUARED PLUS
+229F SQUARED MINUS
+22A0 SQUARED TIMES
+ x (ballot box with x - 2612)
+22A1 SQUARED DOT OPERATOR
+22A2 RIGHT TACK
+ = turnstile
+ = proves, implies, yields
+ = reducible
+22A3 LEFT TACK
+ = reverse turnstile
+ = non-theorem, does not yield
+22A4 DOWN TACK
+ = top
+ * called up tack in APL
+22A5 UP TACK
+ = orthogonal to
+ = perpendicular
+ = base
+ * called down tack in APL
+22A6 ASSERTION
+ = reduces to
+22A7 MODELS
+22A8 TRUE
+ = statement is true, valid
+ = is a tautology
+ = satisfies
+ = results in
+22A9 FORCES
+22AA TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC DOES NOT PROVE
+ : 22A2 0338
+22AD NOT TRUE
+ : 22A8 0338
+22AE DOES NOT FORCE
+ : 22A9 0338
+22AF NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+ : 22AB 0338
+22B0 PRECEDES UNDER RELATION
+ x (precedes - 227A)
+22B1 SUCCEEDS UNDER RELATION
+ x (succeeds - 227B)
+22B2 NORMAL SUBGROUP OF
+ x (white left-pointing pointer - 25C5)
+22B3 CONTAINS AS NORMAL SUBGROUP
+ x (white right-pointing pointer - 25BB)
+22B4 NORMAL SUBGROUP OF OR EQUAL TO
+22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6 ORIGINAL OF
+22B7 IMAGE OF
+22B8 MULTIMAP
+22B9 HERMITIAN CONJUGATE MATRIX
+22BA INTERCALATE
+22BB XOR
+22BC NAND
+ x (projective - 2305)
+22BD NOR
+22BE RIGHT ANGLE WITH ARC
+22BF RIGHT TRIANGLE
+22C0 N-ARY LOGICAL AND
+ x (logical and - 2227)
+22C1 N-ARY LOGICAL OR
+ x (logical or - 2228)
+22C2 N-ARY INTERSECTION
+ = z notation generalised intersection
+ x (intersection - 2229)
+22C3 N-ARY UNION
+ = z notation generalised union
+ x (union - 222A)
+22C4 DIAMOND OPERATOR
+ x (white diamond - 25C7)
+22C5 DOT OPERATOR
+ x (middle dot - 00B7)
+22C6 STAR OPERATOR
+ * APL
+ x (arabic five pointed star - 066D)
+ x (black star - 2605)
+22C7 DIVISION TIMES
+22C8 BOWTIE
+ x (ocr bow tie - 2445)
+22C9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB LEFT SEMIDIRECT PRODUCT
+22CC RIGHT SEMIDIRECT PRODUCT
+ x (caret insertion point - 2041)
+22CD REVERSED TILDE EQUALS
+22CE CURLY LOGICAL OR
+22CF CURLY LOGICAL AND
+22D0 DOUBLE SUBSET
+22D1 DOUBLE SUPERSET
+22D2 DOUBLE INTERSECTION
+22D3 DOUBLE UNION
+22D4 PITCHFORK
+ = proper intersection
+22D5 EQUAL AND PARALLEL TO
+ x (viewdata square - 2317)
+22D6 LESS-THAN WITH DOT
+22D7 GREATER-THAN WITH DOT
+22D8 VERY MUCH LESS-THAN
+22D9 VERY MUCH GREATER-THAN
+22DA LESS-THAN EQUAL TO OR GREATER-THAN
+22DB GREATER-THAN EQUAL TO OR LESS-THAN
+22DC EQUAL TO OR LESS-THAN
+22DD EQUAL TO OR GREATER-THAN
+22DE EQUAL TO OR PRECEDES
+22DF EQUAL TO OR SUCCEEDS
+22E0 DOES NOT PRECEDE OR EQUAL
+ : 227C 0338
+22E1 DOES NOT SUCCEED OR EQUAL
+ : 227D 0338
+22E2 NOT SQUARE IMAGE OF OR EQUAL TO
+ : 2291 0338
+22E3 NOT SQUARE ORIGINAL OF OR EQUAL TO
+ : 2292 0338
+22E4 SQUARE IMAGE OF OR NOT EQUAL TO
+22E5 SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6 LESS-THAN BUT NOT EQUIVALENT TO
+22E7 GREATER-THAN BUT NOT EQUIVALENT TO
+22E8 PRECEDES BUT NOT EQUIVALENT TO
+22E9 SUCCEEDS BUT NOT EQUIVALENT TO
+22EA NOT NORMAL SUBGROUP OF
+ : 22B2 0338
+22EB DOES NOT CONTAIN AS NORMAL SUBGROUP
+ : 22B3 0338
+22EC NOT NORMAL SUBGROUP OF OR EQUAL TO
+ : 22B4 0338
+22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+ : 22B5 0338
+22EE VERTICAL ELLIPSIS
+ * these four ellipses are used for matrix row/column elision
+ x (horizontal ellipsis - 2026)
+22EF MIDLINE HORIZONTAL ELLIPSIS
+22F0 UP RIGHT DIAGONAL ELLIPSIS
+22F1 DOWN RIGHT DIAGONAL ELLIPSIS
+@@ 2300 Miscellaneous Technical 23FF
+@ Miscellaneous technical
+2300 DIAMETER SIGN
+ x (empty set - 2205)
+2301 ELECTRIC ARROW
+ * from ISO 2047
+ * symbol for End of Transmission
+2302 HOUSE
+2303 UP ARROWHEAD
+ x (circumflex accent - 005E)
+ x (modifier letter up arrowhead - 02C4)
+ x (caret - 2038)
+ x (logical and - 2227)
+2304 DOWN ARROWHEAD
+ x (modifier letter down arrowhead - 02C5)
+ x (logical or - 2228)
+ x (countersink - 2335)
+2305 PROJECTIVE
+ x (nand - 22BC)
+2306 PERSPECTIVE
+2307 WAVY LINE
+ x (wavy dash - 3030)
+2308 LEFT CEILING
+ = APL upstile
+ x (left corner bracket - 300C)
+2309 RIGHT CEILING
+230A LEFT FLOOR
+ = APL downstile
+230B RIGHT FLOOR
+ x (right corner bracket - 300D)
+230C BOTTOM RIGHT CROP
+ * set of four "crop" corners, arranged facing outward
+230D BOTTOM LEFT CROP
+230E TOP RIGHT CROP
+230F TOP LEFT CROP
+2310 REVERSED NOT SIGN
+ = beginning of line
+ x (not sign - 00AC)
+2311 SQUARE LOZENGE
+2312 ARC
+ x (upper half circle - 25E0)
+2313 SEGMENT
+2314 SECTOR
+2315 TELEPHONE RECORDER
+2316 POSITION INDICATOR
+2317 VIEWDATA SQUARE
+ x (equal and parallel to - 22D5)
+2318 PLACE OF INTEREST SIGN
+ = COMMAND KEY
+2319 TURNED NOT SIGN
+ = line marker
+231A WATCH
+231B HOURGLASS
+231C TOP LEFT CORNER
+ * set of four "quine" corners, for quincuncial arrangement
+231D TOP RIGHT CORNER
+231E BOTTOM LEFT CORNER
+231F BOTTOM RIGHT CORNER
+2320 TOP HALF INTEGRAL
+2321 BOTTOM HALF INTEGRAL
+2322 FROWN
+ x (character tie - 2040)
+2323 SMILE
+ x (undertie - 203F)
+2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+ = ENTER KEY
+2325 OPTION KEY
+2326 ERASE TO THE RIGHT
+ = DELETE TO THE RIGHT KEY
+2327 X IN A RECTANGLE BOX
+ = CLEAR KEY
+2328 KEYBOARD
+2329 LEFT-POINTING ANGLE BRACKET
+ = BRA
+ = z notation left sequence bracket
+ x (less-than sign - 003C)
+ x (single left-pointing angle quotation mark - 2039)
+ : 3008 left angle bracket
+232A RIGHT-POINTING ANGLE BRACKET
+ = KET
+ = z notation right sequence bracket
+ x (greater-than sign - 003E)
+ x (single right-pointing angle quotation mark - 203A)
+ : 3009 right angle bracket
+232B ERASE TO THE LEFT
+ = DELETE TO THE LEFT KEY
+232C BENZENE RING
+232D CYLINDRICITY
+232E ALL AROUND-PROFILE
+232F SYMMETRY
+2330 TOTAL RUNOUT
+2331 DIMENSION ORIGIN
+2332 CONICAL TAPER
+2333 SLOPE
+2334 COUNTERBORE
+ x (open box - 2423)
+2335 COUNTERSINK
+ x (down arrowhead - 2304)
+@ APL
+2336 APL FUNCTIONAL SYMBOL I-BEAM
+2337 APL FUNCTIONAL SYMBOL SQUISH QUAD
+ x (apl functional symbol quad - 2395)
+ x (white vertical rectangle - 25AF)
+2338 APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B APL FUNCTIONAL SYMBOL QUAD JOT
+233C APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E APL FUNCTIONAL SYMBOL CIRCLE JOT
+ x (circled ring operator - 229A)
+233F APL FUNCTIONAL SYMBOL SLASH BAR
+2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341 APL FUNCTIONAL SYMBOL QUAD SLASH
+2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR *
+ x (up tack - 22A5)
+234B APL FUNCTIONAL SYMBOL DELTA STILE
+234C APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D APL FUNCTIONAL SYMBOL QUAD DELTA
+234E APL FUNCTIONAL SYMBOL DOWN TACK JOT *
+234F APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR *
+ x (down tack - 22A4)
+ x (postal mark - 3012)
+2352 APL FUNCTIONAL SYMBOL DEL STILE
+2353 APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354 APL FUNCTIONAL SYMBOL QUAD DEL
+2355 APL FUNCTIONAL SYMBOL UP TACK JOT *
+2356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360 APL FUNCTIONAL SYMBOL QUAD COLON
+2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS *
+2362 APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363 APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364 APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A APL FUNCTIONAL SYMBOL COMMA BAR
+236B APL FUNCTIONAL SYMBOL DEL TILDE
+236C APL FUNCTIONAL SYMBOL ZILDE
+236D APL FUNCTIONAL SYMBOL STILE TILDE
+236E APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370 APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372 APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373 APL FUNCTIONAL SYMBOL IOTA
+2374 APL FUNCTIONAL SYMBOL RHO
+2375 APL FUNCTIONAL SYMBOL OMEGA
+2376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A APL FUNCTIONAL SYMBOL ALPHA
+@ Graphics for control codes
+237B NOT CHECK MARK
+ * from ISO 2047
+ * symbol for Negative Acknowledge
+237D SHOULDERED OPEN BOX
+ * from ISO 9995-7
+ * keyboard symbol for No Break Space
+237E BELL SYMBOL
+ * from ISO 2047
+237F VERTICAL LINE WITH MIDDLE DOT
+ * from ISO 2047
+ * symbol for End of Medium
+@ Keyboard symbols from ISO 9995-7
+2380 INSERTION SYMBOL
+2381 CONTINUOUS UNDERLINE SYMBOL
+2382 DISCONTINUOUS UNDERLINE SYMBOL
+2383 EMPHASIS SYMBOL
+2384 COMPOSITION SYMBOL
+2385 WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386 ENTER SYMBOL
+2387 ALTERNATIVE KEY SYMBOL
+2388 HELM SYMBOL
+ = control
+ x (wheel of dharma - 2638)
+2389 CIRCLED HORIZONTAL BAR WITH NOTCH (pause)
+238A CIRCLED TRIANGLE DOWN (break)
+238B BROKEN CIRCLE WITH NORTHWEST ARROW (escape)
+238C UNDO SYMBOL
+@ Electrotechnical symbols from IR 181
+238D MONOSTABLE SYMBOL
+238E HYSTERESIS SYMBOL
+238F OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392 PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393 DIRECT CURRENT SYMBOL FORM TWO
+2394 SOFTWARE-FUNCTION SYMBOL
+@ APL
+2395 APL FUNCTIONAL SYMBOL QUAD
+ x (apl functional symbol squish quad - 2337)
+ x (white vertical rectangle - 25AF)
+@ Keyboard symbols from ISO 9995-7
+2396 DECIMAL SEPARATOR KEY SYMBOL
+2397 PREVIOUS PAGE
+2398 NEXT PAGE
+2399 PRINT SCREEN SYMBOL
+239A CLEAR SCREEN SYMBOL
+ x (combining enclosing screen - 20E2)
+@@ 2400 Control Pictures 243F
+@ Graphic pictures for control codes
+2400 SYMBOL FOR NULL
+2401 SYMBOL FOR START OF HEADING
+2402 SYMBOL FOR START OF TEXT
+2403 SYMBOL FOR END OF TEXT
+2404 SYMBOL FOR END OF TRANSMISSION
+2405 SYMBOL FOR ENQUIRY
+2406 SYMBOL FOR ACKNOWLEDGE
+2407 SYMBOL FOR BELL
+2408 SYMBOL FOR BACKSPACE
+2409 SYMBOL FOR HORIZONTAL TABULATION
+240A SYMBOL FOR LINE FEED
+240B SYMBOL FOR VERTICAL TABULATION
+240C SYMBOL FOR FORM FEED
+240D SYMBOL FOR CARRIAGE RETURN
+240E SYMBOL FOR SHIFT OUT
+240F SYMBOL FOR SHIFT IN
+2410 SYMBOL FOR DATA LINK ESCAPE
+2411 SYMBOL FOR DEVICE CONTROL ONE
+2412 SYMBOL FOR DEVICE CONTROL TWO
+2413 SYMBOL FOR DEVICE CONTROL THREE
+2414 SYMBOL FOR DEVICE CONTROL FOUR
+2415 SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416 SYMBOL FOR SYNCHRONOUS IDLE
+2417 SYMBOL FOR END OF TRANSMISSION BLOCK
+2418 SYMBOL FOR CANCEL
+2419 SYMBOL FOR END OF MEDIUM
+241A SYMBOL FOR SUBSTITUTE
+241B SYMBOL FOR ESCAPE
+241C SYMBOL FOR FILE SEPARATOR
+241D SYMBOL FOR GROUP SEPARATOR
+241E SYMBOL FOR RECORD SEPARATOR
+241F SYMBOL FOR UNIT SEPARATOR
+2420 SYMBOL FOR SPACE
+2421 SYMBOL FOR DELETE
+2422 BLANK SYMBOL
+ * graphic for space
+ x (latin small letter b with stroke - 0180)
+2423 OPEN BOX
+ * graphic for space
+ x (counterbore - 2334)
+2424 SYMBOL FOR NEWLINE
+2425 SYMBOL FOR DELETE FORM TWO
+ * from ISO 9995-7
+ * keyboard symbol for undoable delete
+2426 SYMBOL FOR SUBSTITUTE FORM TWO
+ * from ISO 2047
+ x (arabic question mark - 061F)
+@@ 2440 Optical Character Recognition 245F
+@ OCR
+2440 OCR HOOK
+2441 OCR CHAIR
+2442 OCR FORK
+2443 OCR INVERTED FORK
+2444 OCR BELT BUCKLE
+2445 OCR BOW TIE
+ x (bowtie - 22C8)
+2446 OCR BRANCH BANK IDENTIFICATION
+ = transit
+2447 OCR AMOUNT OF CHECK
+2448 OCR DASH
+ = on us
+2449 OCR CUSTOMER ACCOUNT NUMBER
+ = dash
+244A OCR DOUBLE BACKSLASH
+@@ 2460 Enclosed Alphanumerics 24FF
+@ Circled numbers
+2460 CIRCLED DIGIT ONE
+ # <circle> 0031
+2461 CIRCLED DIGIT TWO
+ # <circle> 0032
+2462 CIRCLED DIGIT THREE
+ # <circle> 0033
+2463 CIRCLED DIGIT FOUR
+ # <circle> 0034
+2464 CIRCLED DIGIT FIVE
+ # <circle> 0035
+2465 CIRCLED DIGIT SIX
+ # <circle> 0036
+2466 CIRCLED DIGIT SEVEN
+ # <circle> 0037
+2467 CIRCLED DIGIT EIGHT
+ # <circle> 0038
+2468 CIRCLED DIGIT NINE
+ # <circle> 0039
+2469 CIRCLED NUMBER TEN
+ # <circle> 0031 0030
+246A CIRCLED NUMBER ELEVEN
+ # <circle> 0031 0031
+246B CIRCLED NUMBER TWELVE
+ # <circle> 0031 0032
+246C CIRCLED NUMBER THIRTEEN
+ # <circle> 0031 0033
+246D CIRCLED NUMBER FOURTEEN
+ # <circle> 0031 0034
+246E CIRCLED NUMBER FIFTEEN
+ # <circle> 0031 0035
+246F CIRCLED NUMBER SIXTEEN
+ # <circle> 0031 0036
+2470 CIRCLED NUMBER SEVENTEEN
+ # <circle> 0031 0037
+2471 CIRCLED NUMBER EIGHTEEN
+ # <circle> 0031 0038
+2472 CIRCLED NUMBER NINETEEN
+ # <circle> 0031 0039
+2473 CIRCLED NUMBER TWENTY
+ # <circle> 0032 0030
+@ Parenthesized numbers
+2474 PARENTHESIZED DIGIT ONE
+ # 0028 0031 0029
+2475 PARENTHESIZED DIGIT TWO
+ # 0028 0032 0029
+2476 PARENTHESIZED DIGIT THREE
+ # 0028 0033 0029
+2477 PARENTHESIZED DIGIT FOUR
+ # 0028 0034 0029
+2478 PARENTHESIZED DIGIT FIVE
+ # 0028 0035 0029
+2479 PARENTHESIZED DIGIT SIX
+ # 0028 0036 0029
+247A PARENTHESIZED DIGIT SEVEN
+ # 0028 0037 0029
+247B PARENTHESIZED DIGIT EIGHT
+ # 0028 0038 0029
+247C PARENTHESIZED DIGIT NINE
+ # 0028 0039 0029
+247D PARENTHESIZED NUMBER TEN
+ # 0028 0031 0030 0029
+247E PARENTHESIZED NUMBER ELEVEN
+ # 0028 0031 0031 0029
+247F PARENTHESIZED NUMBER TWELVE
+ # 0028 0031 0032 0029
+2480 PARENTHESIZED NUMBER THIRTEEN
+ # 0028 0031 0033 0029
+2481 PARENTHESIZED NUMBER FOURTEEN
+ # 0028 0031 0034 0029
+2482 PARENTHESIZED NUMBER FIFTEEN
+ # 0028 0031 0035 0029
+2483 PARENTHESIZED NUMBER SIXTEEN
+ # 0028 0031 0036 0029
+2484 PARENTHESIZED NUMBER SEVENTEEN
+ # 0028 0031 0037 0029
+2485 PARENTHESIZED NUMBER EIGHTEEN
+ # 0028 0031 0038 0029
+2486 PARENTHESIZED NUMBER NINETEEN
+ # 0028 0031 0039 0029
+2487 PARENTHESIZED NUMBER TWENTY
+ # 0028 0032 0030 0029
+@ Numbers period
+2488 DIGIT ONE FULL STOP
+ # 0031 002E
+2489 DIGIT TWO FULL STOP
+ # 0032 002E
+248A DIGIT THREE FULL STOP
+ # 0033 002E
+248B DIGIT FOUR FULL STOP
+ # 0034 002E
+248C DIGIT FIVE FULL STOP
+ # 0035 002E
+248D DIGIT SIX FULL STOP
+ # 0036 002E
+248E DIGIT SEVEN FULL STOP
+ # 0037 002E
+248F DIGIT EIGHT FULL STOP
+ # 0038 002E
+2490 DIGIT NINE FULL STOP
+ # 0039 002E
+2491 NUMBER TEN FULL STOP
+ # 0031 0030 002E
+2492 NUMBER ELEVEN FULL STOP
+ # 0031 0031 002E
+2493 NUMBER TWELVE FULL STOP
+ # 0031 0032 002E
+2494 NUMBER THIRTEEN FULL STOP
+ # 0031 0033 002E
+2495 NUMBER FOURTEEN FULL STOP
+ # 0031 0034 002E
+2496 NUMBER FIFTEEN FULL STOP
+ # 0031 0035 002E
+2497 NUMBER SIXTEEN FULL STOP
+ # 0031 0036 002E
+2498 NUMBER SEVENTEEN FULL STOP
+ # 0031 0037 002E
+2499 NUMBER EIGHTEEN FULL STOP
+ # 0031 0038 002E
+249A NUMBER NINETEEN FULL STOP
+ # 0031 0039 002E
+249B NUMBER TWENTY FULL STOP
+ # 0032 0030 002E
+@ Parenthesized Latin letters
+249C PARENTHESIZED LATIN SMALL LETTER A
+ # 0028 0061 0029
+249D PARENTHESIZED LATIN SMALL LETTER B
+ # 0028 0062 0029
+249E PARENTHESIZED LATIN SMALL LETTER C
+ # 0028 0063 0029
+249F PARENTHESIZED LATIN SMALL LETTER D
+ # 0028 0064 0029
+24A0 PARENTHESIZED LATIN SMALL LETTER E
+ # 0028 0065 0029
+24A1 PARENTHESIZED LATIN SMALL LETTER F
+ # 0028 0066 0029
+24A2 PARENTHESIZED LATIN SMALL LETTER G
+ # 0028 0067 0029
+24A3 PARENTHESIZED LATIN SMALL LETTER H
+ # 0028 0068 0029
+24A4 PARENTHESIZED LATIN SMALL LETTER I
+ # 0028 0069 0029
+24A5 PARENTHESIZED LATIN SMALL LETTER J
+ # 0028 006A 0029
+24A6 PARENTHESIZED LATIN SMALL LETTER K
+ # 0028 006B 0029
+24A7 PARENTHESIZED LATIN SMALL LETTER L
+ # 0028 006C 0029
+24A8 PARENTHESIZED LATIN SMALL LETTER M
+ # 0028 006D 0029
+24A9 PARENTHESIZED LATIN SMALL LETTER N
+ # 0028 006E 0029
+24AA PARENTHESIZED LATIN SMALL LETTER O
+ # 0028 006F 0029
+24AB PARENTHESIZED LATIN SMALL LETTER P
+ # 0028 0070 0029
+24AC PARENTHESIZED LATIN SMALL LETTER Q
+ # 0028 0071 0029
+24AD PARENTHESIZED LATIN SMALL LETTER R
+ # 0028 0072 0029
+24AE PARENTHESIZED LATIN SMALL LETTER S
+ # 0028 0073 0029
+24AF PARENTHESIZED LATIN SMALL LETTER T
+ # 0028 0074 0029
+24B0 PARENTHESIZED LATIN SMALL LETTER U
+ # 0028 0075 0029
+24B1 PARENTHESIZED LATIN SMALL LETTER V
+ # 0028 0076 0029
+24B2 PARENTHESIZED LATIN SMALL LETTER W
+ # 0028 0077 0029
+24B3 PARENTHESIZED LATIN SMALL LETTER X
+ # 0028 0078 0029
+24B4 PARENTHESIZED LATIN SMALL LETTER Y
+ # 0028 0079 0029
+24B5 PARENTHESIZED LATIN SMALL LETTER Z
+ # 0028 007A 0029
+@ Circled Latin letters
+24B6 CIRCLED LATIN CAPITAL LETTER A
+ # <circle> 0041
+24B7 CIRCLED LATIN CAPITAL LETTER B
+ # <circle> 0042
+24B8 CIRCLED LATIN CAPITAL LETTER C
+ # <circle> 0043
+24B9 CIRCLED LATIN CAPITAL LETTER D
+ # <circle> 0044
+24BA CIRCLED LATIN CAPITAL LETTER E
+ # <circle> 0045
+24BB CIRCLED LATIN CAPITAL LETTER F
+ # <circle> 0046
+24BC CIRCLED LATIN CAPITAL LETTER G
+ # <circle> 0047
+24BD CIRCLED LATIN CAPITAL LETTER H
+ # <circle> 0048
+24BE CIRCLED LATIN CAPITAL LETTER I
+ # <circle> 0049
+24BF CIRCLED LATIN CAPITAL LETTER J
+ # <circle> 004A
+24C0 CIRCLED LATIN CAPITAL LETTER K
+ # <circle> 004B
+24C1 CIRCLED LATIN CAPITAL LETTER L
+ # <circle> 004C
+24C2 CIRCLED LATIN CAPITAL LETTER M
+ # <circle> 004D
+24C3 CIRCLED LATIN CAPITAL LETTER N
+ # <circle> 004E
+24C4 CIRCLED LATIN CAPITAL LETTER O
+ # <circle> 004F
+24C5 CIRCLED LATIN CAPITAL LETTER P
+ # <circle> 0050
+24C6 CIRCLED LATIN CAPITAL LETTER Q
+ # <circle> 0051
+24C7 CIRCLED LATIN CAPITAL LETTER R
+ # <circle> 0052
+24C8 CIRCLED LATIN CAPITAL LETTER S
+ # <circle> 0053
+24C9 CIRCLED LATIN CAPITAL LETTER T
+ # <circle> 0054
+24CA CIRCLED LATIN CAPITAL LETTER U
+ # <circle> 0055
+24CB CIRCLED LATIN CAPITAL LETTER V
+ # <circle> 0056
+24CC CIRCLED LATIN CAPITAL LETTER W
+ # <circle> 0057
+24CD CIRCLED LATIN CAPITAL LETTER X
+ # <circle> 0058
+24CE CIRCLED LATIN CAPITAL LETTER Y
+ # <circle> 0059
+24CF CIRCLED LATIN CAPITAL LETTER Z
+ # <circle> 005A
+24D0 CIRCLED LATIN SMALL LETTER A
+ # <circle> 0061
+24D1 CIRCLED LATIN SMALL LETTER B
+ # <circle> 0062
+24D2 CIRCLED LATIN SMALL LETTER C
+ # <circle> 0063
+24D3 CIRCLED LATIN SMALL LETTER D
+ # <circle> 0064
+24D4 CIRCLED LATIN SMALL LETTER E
+ # <circle> 0065
+24D5 CIRCLED LATIN SMALL LETTER F
+ # <circle> 0066
+24D6 CIRCLED LATIN SMALL LETTER G
+ # <circle> 0067
+24D7 CIRCLED LATIN SMALL LETTER H
+ # <circle> 0068
+24D8 CIRCLED LATIN SMALL LETTER I
+ # <circle> 0069
+24D9 CIRCLED LATIN SMALL LETTER J
+ # <circle> 006A
+24DA CIRCLED LATIN SMALL LETTER K
+ # <circle> 006B
+24DB CIRCLED LATIN SMALL LETTER L
+ # <circle> 006C
+24DC CIRCLED LATIN SMALL LETTER M
+ # <circle> 006D
+24DD CIRCLED LATIN SMALL LETTER N
+ # <circle> 006E
+24DE CIRCLED LATIN SMALL LETTER O
+ # <circle> 006F
+24DF CIRCLED LATIN SMALL LETTER P
+ # <circle> 0070
+24E0 CIRCLED LATIN SMALL LETTER Q
+ # <circle> 0071
+24E1 CIRCLED LATIN SMALL LETTER R
+ # <circle> 0072
+24E2 CIRCLED LATIN SMALL LETTER S
+ # <circle> 0073
+24E3 CIRCLED LATIN SMALL LETTER T
+ # <circle> 0074
+24E4 CIRCLED LATIN SMALL LETTER U
+ # <circle> 0075
+24E5 CIRCLED LATIN SMALL LETTER V
+ # <circle> 0076
+24E6 CIRCLED LATIN SMALL LETTER W
+ # <circle> 0077
+24E7 CIRCLED LATIN SMALL LETTER X
+ # <circle> 0078
+24E8 CIRCLED LATIN SMALL LETTER Y
+ # <circle> 0079
+24E9 CIRCLED LATIN SMALL LETTER Z
+ # <circle> 007A
+@ Additional circled numbers
+24EA CIRCLED DIGIT ZERO
+ # <circle> 0030
+@@ 2500 Box Drawing 257F
+@ Form and chart components
+2500 BOX DRAWINGS LIGHT HORIZONTAL
+ = Videotex Mosaic DG 15
+2501 BOX DRAWINGS HEAVY HORIZONTAL
+2502 BOX DRAWINGS LIGHT VERTICAL
+ = Videotex Mosaic DG 14
+2503 BOX DRAWINGS HEAVY VERTICAL
+2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C BOX DRAWINGS LIGHT DOWN AND RIGHT
+ = Videotex Mosaic DG 16
+250D BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510 BOX DRAWINGS LIGHT DOWN AND LEFT
+ = Videotex Mosaic DG 17
+2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513 BOX DRAWINGS HEAVY DOWN AND LEFT
+2514 BOX DRAWINGS LIGHT UP AND RIGHT
+ = Videotex Mosaic DG 18
+2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517 BOX DRAWINGS HEAVY UP AND RIGHT
+2518 BOX DRAWINGS LIGHT UP AND LEFT
+ = Videotex Mosaic DG 19
+2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B BOX DRAWINGS HEAVY UP AND LEFT
+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ = Videotex Mosaic DG 20
+251D BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ = Videotex Mosaic DG 03
+251E BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ = Videotex Mosaic DG 21
+2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ = Videotex Mosaic DG 04
+2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ = Videotex Mosaic DG 22
+252D BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ = Videotex Mosaic DG 02
+2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ = Videotex Mosaic DG 23
+2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ = Videotex Mosaic DG 01
+2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ = Videotex Mosaic DG 24
+253D BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ = Videotex Mosaic DG 13
+2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550 BOX DRAWINGS DOUBLE HORIZONTAL
+2551 BOX DRAWINGS DOUBLE VERTICAL
+2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557 BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A BOX DRAWINGS DOUBLE UP AND RIGHT
+255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D BOX DRAWINGS DOUBLE UP AND LEFT
+255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570 BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573 BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574 BOX DRAWINGS LIGHT LEFT
+2575 BOX DRAWINGS LIGHT UP
+2576 BOX DRAWINGS LIGHT RIGHT
+2577 BOX DRAWINGS LIGHT DOWN
+2578 BOX DRAWINGS HEAVY LEFT
+2579 BOX DRAWINGS HEAVY UP
+257A BOX DRAWINGS HEAVY RIGHT
+257B BOX DRAWINGS HEAVY DOWN
+257C BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+@@ 2580 Block Elements 259F
+@ Block elements
+2580 UPPER HALF BLOCK
+2581 LOWER ONE EIGHTH BLOCK
+2582 LOWER ONE QUARTER BLOCK
+2583 LOWER THREE EIGHTHS BLOCK
+2584 LOWER HALF BLOCK
+2585 LOWER FIVE EIGHTHS BLOCK
+2586 LOWER THREE QUARTERS BLOCK
+2587 LOWER SEVEN EIGHTHS BLOCK
+2588 FULL BLOCK
+ = solid
+ x (black square - 25A0)
+2589 LEFT SEVEN EIGHTHS BLOCK
+258A LEFT THREE QUARTERS BLOCK
+258B LEFT FIVE EIGHTHS BLOCK
+258C LEFT HALF BLOCK
+258D LEFT THREE EIGHTHS BLOCK
+258E LEFT ONE QUARTER BLOCK
+258F LEFT ONE EIGHTH BLOCK
+2590 RIGHT HALF BLOCK
+@ Shade characters
+2591 LIGHT SHADE
+ * 25%
+2592 MEDIUM SHADE
+ * 50%
+2593 DARK SHADE
+ * 75%
+@ Block elements
+2594 UPPER ONE EIGHTH BLOCK
+2595 RIGHT ONE EIGHTH BLOCK
+@@ 25A0 Geometric Shapes 25FF
+@ Geometric shapes
+25A0 BLACK SQUARE
+ x (full block - 2588)
+25A1 WHITE SQUARE
+ = quadrature
+ x (combining enclosing square - 20DE)
+ x (ballot box - 2610)
+25A2 WHITE SQUARE WITH ROUNDED CORNERS
+25A3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4 SQUARE WITH HORIZONTAL FILL
+25A5 SQUARE WITH VERTICAL FILL
+25A6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9 SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA BLACK SMALL SQUARE
+25AB WHITE SMALL SQUARE
+25AC BLACK RECTANGLE
+25AD WHITE RECTANGLE
+25AE BLACK VERTICAL RECTANGLE
+ = histogram marker
+ x (end of proof - 220E)
+25AF WHITE VERTICAL RECTANGLE
+ x (apl functional symbol squish quad - 2337)
+ x (apl functional symbol quad - 2395)
+25B0 BLACK PARALLELOGRAM
+25B1 WHITE PARALLELOGRAM
+25B2 BLACK UP-POINTING TRIANGLE
+25B3 WHITE UP-POINTING TRIANGLE
+ = trine
+ x (increment - 2206)
+25B4 BLACK UP-POINTING SMALL TRIANGLE
+25B5 WHITE UP-POINTING SMALL TRIANGLE
+25B6 BLACK RIGHT-POINTING TRIANGLE
+25B7 WHITE RIGHT-POINTING TRIANGLE
+ = z notation range restriction
+25B8 BLACK RIGHT-POINTING SMALL TRIANGLE
+ x (triangular bullet - 2023)
+25B9 WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA BLACK RIGHT-POINTING POINTER
+25BB WHITE RIGHT-POINTING POINTER
+ = forward arrow indicator
+ x (contains as normal subgroup - 22B3)
+25BC BLACK DOWN-POINTING TRIANGLE
+25BD WHITE DOWN-POINTING TRIANGLE
+ x (nabla - 2207)
+25BE BLACK DOWN-POINTING SMALL TRIANGLE
+25BF WHITE DOWN-POINTING SMALL TRIANGLE
+25C0 BLACK LEFT-POINTING TRIANGLE
+25C1 WHITE LEFT-POINTING TRIANGLE
+ = z notation domain restriction
+25C2 BLACK LEFT-POINTING SMALL TRIANGLE
+25C3 WHITE LEFT-POINTING SMALL TRIANGLE
+25C4 BLACK LEFT-POINTING POINTER
+25C5 WHITE LEFT-POINTING POINTER
+ = backward arrow indicator
+ x (normal subgroup of - 22B2)
+25C6 BLACK DIAMOND
+ x (black diamond suit - 2666)
+25C7 WHITE DIAMOND
+ x (combining enclosing diamond - 20DF)
+ x (diamond operator - 22C4)
+ x (white diamond suit - 2662)
+25C8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9 FISHEYE
+ = tainome (Japanese, a kind of bullet)
+25CA LOZENGE
+ x (white diamond suit - 2662)
+25CB WHITE CIRCLE
+ x (combining enclosing circle - 20DD)
+ x (large circle - 25EF)
+ x (ideographic number zero - 3007)
+25CC DOTTED CIRCLE
+25CD CIRCLE WITH VERTICAL FILL
+25CE BULLSEYE
+ x (circled ring operator - 229A)
+25CF BLACK CIRCLE
+25D0 CIRCLE WITH LEFT HALF BLACK
+25D1 CIRCLE WITH RIGHT HALF BLACK
+25D2 CIRCLE WITH LOWER HALF BLACK
+25D3 CIRCLE WITH UPPER HALF BLACK
+25D4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6 LEFT HALF BLACK CIRCLE
+25D7 RIGHT HALF BLACK CIRCLE
+25D8 INVERSE BULLET
+ x (bullet - 2022)
+ x (white bullet - 25E6)
+25D9 INVERSE WHITE CIRCLE
+25DA UPPER HALF INVERSE WHITE CIRCLE
+25DB LOWER HALF INVERSE WHITE CIRCLE
+25DC UPPER LEFT QUADRANT CIRCULAR ARC
+25DD UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF LOWER LEFT QUADRANT CIRCULAR ARC
+25E0 UPPER HALF CIRCLE
+ x (arc - 2312)
+25E1 LOWER HALF CIRCLE
+25E2 BLACK LOWER RIGHT TRIANGLE
+25E3 BLACK LOWER LEFT TRIANGLE
+25E4 BLACK UPPER LEFT TRIANGLE
+25E5 BLACK UPPER RIGHT TRIANGLE
+25E6 WHITE BULLET
+ x (bullet - 2022)
+ x (ring operator - 2218)
+ x (inverse bullet - 25D8)
+25E7 SQUARE WITH LEFT HALF BLACK
+25E8 SQUARE WITH RIGHT HALF BLACK
+25E9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC WHITE UP-POINTING TRIANGLE WITH DOT
+25ED UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF LARGE CIRCLE
+ x (combining enclosing circle - 20DD)
+ x (white circle - 25CB)
+ x (ideographic number zero - 3007)
+@ Control code graphics
+25F0 WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1 WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2 WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3 WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4 WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5 WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+@@ 2600 Miscellaneous Symbols 26FF
+@ Weather and astrological symbols
+2600 BLACK SUN WITH RAYS
+ = clear weather
+ x (sun - 2609)
+2601 CLOUD
+ = cloudy weather
+2602 UMBRELLA
+ = rainy weather
+2603 SNOWMAN
+ = snowy weather
+2604 COMET
+2605 BLACK STAR
+ x (star operator - 22C6)
+2606 WHITE STAR
+ x (stress outlined white star - 2729)
+2607 LIGHTNING
+2608 THUNDERSTORM
+2609 SUN
+ x (circled dot operator - 2299)
+ x (black sun with rays - 2600)
+ x (white sun with rays - 263C)
+260A ASCENDING NODE
+260B DESCENDING NODE
+260C CONJUNCTION
+260D OPPOSITION
+@ Miscellaneous symbols
+260E BLACK TELEPHONE
+260F WHITE TELEPHONE
+2610 BALLOT BOX
+ x (white square - 25A1)
+2611 BALLOT BOX WITH CHECK
+2612 BALLOT BOX WITH X
+ x (squared times - 22A0)
+2613 SALTIRE
+ = St. Andrew's Cross
+ x (ballot x - 2717)
+2619 REVERSED ROTATED FLORAL HEART BULLET
+ * a binding signature mark
+ x (rotated floral heart bullet - 2767)
+@ Pointing hand symbols
+261A BLACK LEFT POINTING INDEX
+261B BLACK RIGHT POINTING INDEX
+261C WHITE LEFT POINTING INDEX
+261D WHITE UP POINTING INDEX
+261E WHITE RIGHT POINTING INDEX
+ = fist (typographic term)
+261F WHITE DOWN POINTING INDEX
+@ Warning signs
+2620 SKULL AND CROSSBONES
+ = poison
+2621 CAUTION SIGN
+2622 RADIOACTIVE SIGN
+2623 BIOHAZARD SIGN
+@ Medical and healing symbols
+2624 CADUCEUS
+2625 ANKH
+@ Religious and political symbols
+2626 ORTHODOX CROSS
+2627 CHI RHO
+2628 CROSS OF LORRAINE
+2629 CROSS OF JERUSALEM
+262A STAR AND CRESCENT
+262B FARSI SYMBOL
+ = SYMBOL OF IRAN
+262C ADI SHAKTI
+262D HAMMER AND SICKLE
+262E PEACE SYMBOL
+262F YIN YANG
+ x (tibetan symbol nor bu nyis -khyil - 0FCA)
+@ Yijing trigram symbols
+2630 TRIGRAM FOR HEAVEN
+ = qian2
+2631 TRIGRAM FOR LAKE
+ = dui4
+2632 TRIGRAM FOR FIRE
+ = li2
+2633 TRIGRAM FOR THUNDER
+ = zhen4
+2634 TRIGRAM FOR WIND
+ = xun4
+2635 TRIGRAM FOR WATER
+ = kan3
+2636 TRIGRAM FOR MOUNTAIN
+ = gen4
+2637 TRIGRAM FOR EARTH
+ = kun1
+@ Miscellaneous symbols
+2638 WHEEL OF DHARMA
+ x (helm symbol - 2388)
+2639 WHITE FROWNING FACE
+263A WHITE SMILING FACE
+ = have a nice day!
+263B BLACK SMILING FACE
+263C WHITE SUN WITH RAYS
+ = compass
+ x (sun - 2609)
+@ Astrological symbols
+263D FIRST QUARTER MOON
+263E LAST QUARTER MOON
+263F MERCURY
+2640 FEMALE SIGN
+ = Venus
+2641 EARTH
+ x (circled plus - 2295)
+2642 MALE SIGN
+ = Mars
+2643 JUPITER
+2644 SATURN
+2645 URANUS
+2646 NEPTUNE
+2647 PLUTO
+@ Zodiacal symbols
+2648 ARIES
+2649 TAURUS
+264A GEMINI
+264B CANCER
+264C LEO
+264D VIRGO
+ = minim (alternate glyph)
+264E LIBRA
+264F SCORPIUS
+ = minim, drop
+2650 SAGITTARIUS
+2651 CAPRICORN
+2652 AQUARIUS
+2653 PISCES
+@ Chess symbols
+2654 WHITE CHESS KING
+2655 WHITE CHESS QUEEN
+2656 WHITE CHESS ROOK
+2657 WHITE CHESS BISHOP
+2658 WHITE CHESS KNIGHT
+2659 WHITE CHESS PAWN
+265A BLACK CHESS KING
+265B BLACK CHESS QUEEN
+265C BLACK CHESS ROOK
+265D BLACK CHESS BISHOP
+265E BLACK CHESS KNIGHT
+265F BLACK CHESS PAWN
+@ Playing card symbols
+2660 BLACK SPADE SUIT
+2661 WHITE HEART SUIT
+2662 WHITE DIAMOND SUIT
+ x (white diamond - 25C7)
+ x (lozenge - 25CA)
+2663 BLACK CLUB SUIT
+ = shamrock
+2664 WHITE SPADE SUIT
+2665 BLACK HEART SUIT
+ = valentine
+ x (heavy black heart - 2764)
+2666 BLACK DIAMOND SUIT
+ x (black diamond - 25C6)
+2667 WHITE CLUB SUIT
+@ Miscellaneous symbol
+2668 HOT SPRINGS
+@ Musical symbols
+2669 QUARTER NOTE
+266A EIGHTH NOTE
+266B BEAMED EIGHTH NOTES
+266C BEAMED SIXTEENTH NOTES
+266D MUSIC FLAT SIGN
+266E MUSIC NATURAL SIGN
+266F MUSIC SHARP SIGN
+ = z notation infix bag count
+@ Syriac cross symbols
+@+ These symbols are used in liturgical texts of Syriac-speaking churches.
+2670 WEST SYRIAC CROSS
+2671 EAST SYRIAC CROSS
+@@ 2700 Dingbats 27BF
+@+ ITC Zapf dingbats series 100
+@ Miscellaneous
+2701 UPPER BLADE SCISSORS
+2702 BLACK SCISSORS
+2703 LOWER BLADE SCISSORS
+2704 WHITE SCISSORS
+2705 <reserved>
+ x (black telephone - 260E)
+2706 TELEPHONE LOCATION SIGN
+2707 TAPE DRIVE
+2708 AIRPLANE
+2709 ENVELOPE
+270A <reserved>
+ x (black right pointing index - 261B)
+270B <reserved>
+ x (white right pointing index - 261E)
+270C VICTORY HAND
+270D WRITING HAND
+270E LOWER RIGHT PENCIL
+270F PENCIL
+2710 UPPER RIGHT PENCIL
+2711 WHITE NIB
+2712 BLACK NIB
+2713 CHECK MARK
+ x (square root - 221A)
+2714 HEAVY CHECK MARK
+2715 MULTIPLICATION X
+ x (multiplication sign - 00D7)
+ x (box drawings light diagonal cross - 2573)
+2716 HEAVY MULTIPLICATION X
+2717 BALLOT X
+ x (saltire - 2613)
+2718 HEAVY BALLOT X
+@ Crosses
+2719 OUTLINED GREEK CROSS
+271A HEAVY GREEK CROSS
+271B OPEN CENTRE CROSS
+271C HEAVY OPEN CENTRE CROSS
+271D LATIN CROSS
+271E SHADOWED WHITE LATIN CROSS
+271F OUTLINED LATIN CROSS
+2720 MALTESE CROSS
+@ Stars, asterisks and snowflakes
+2721 STAR OF DAVID
+2722 FOUR TEARDROP-SPOKED ASTERISK
+2723 FOUR BALLOON-SPOKED ASTERISK
+2724 HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725 FOUR CLUB-SPOKED ASTERISK
+2726 BLACK FOUR POINTED STAR
+2727 WHITE FOUR POINTED STAR
+2728 <reserved>
+ x (black star - 2605)
+2729 STRESS OUTLINED WHITE STAR
+ x (white star - 2606)
+272A CIRCLED WHITE STAR
+272B OPEN CENTRE BLACK STAR
+272C BLACK CENTRE WHITE STAR
+272D OUTLINED BLACK STAR
+272E HEAVY OUTLINED BLACK STAR
+272F PINWHEEL STAR
+2730 SHADOWED WHITE STAR
+2731 HEAVY ASTERISK
+ x (asterisk - 002A)
+2732 OPEN CENTRE ASTERISK
+2733 EIGHT SPOKED ASTERISK
+2734 EIGHT POINTED BLACK STAR
+2735 EIGHT POINTED PINWHEEL STAR
+2736 SIX POINTED BLACK STAR
+ = sextile
+2737 EIGHT POINTED RECTILINEAR BLACK STAR
+2738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739 TWELVE POINTED BLACK STAR
+273A SIXTEEN POINTED ASTERISK
+ = starburst
+273B TEARDROP-SPOKED ASTERISK
+273C OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D HEAVY TEARDROP-SPOKED ASTERISK
+273E SIX PETALLED BLACK AND WHITE FLORETTE
+273F BLACK FLORETTE
+2740 WHITE FLORETTE
+2741 EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742 CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744 SNOWFLAKE
+2745 TIGHT TRIFOLIATE SNOWFLAKE
+2746 HEAVY CHEVRON SNOWFLAKE
+2747 SPARKLE
+2748 HEAVY SPARKLE
+2749 BALLOON-SPOKED ASTERISK
+ = jack
+274A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+ = turbofan
+@ Miscellaneous
+274C <reserved>
+ x (black circle - 25CF)
+274D SHADOWED WHITE CIRCLE
+274E <reserved>
+ x (black square - 25A0)
+274F LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751 LOWER RIGHT SHADOWED WHITE SQUARE
+2752 UPPER RIGHT SHADOWED WHITE SQUARE
+2753 <reserved>
+ x (black up-pointing triangle - 25B2)
+2754 <reserved>
+ x (black down-pointing triangle - 25BC)
+2755 <reserved>
+ x (black diamond - 25C6)
+2756 BLACK DIAMOND MINUS WHITE X
+2757 <reserved>
+ x (right half black circle - 25D7)
+2758 LIGHT VERTICAL BAR
+ x (vertical line - 007C)
+2759 MEDIUM VERTICAL BAR
+275A HEAVY VERTICAL BAR
+@ Punctuation ornaments
+275B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+ x (left single quotation mark - 2018)
+275C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+ x (right single quotation mark - 2019)
+275D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+ x (left double quotation mark - 201C)
+275E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+ x (right double quotation mark - 201D)
+2761 CURVED STEM PARAGRAPH SIGN ORNAMENT
+ x (pilcrow sign - 00B6)
+2762 HEAVY EXCLAMATION MARK ORNAMENT
+ x (exclamation mark - 0021)
+2763 HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764 HEAVY BLACK HEART
+ x (black heart suit - 2665)
+2765 ROTATED HEAVY BLACK HEART BULLET
+2766 FLORAL HEART
+ = Aldus leaf
+2767 ROTATED FLORAL HEART BULLET
+ = hedera, ivy leaf
+ x (reversed rotated floral heart bullet - 2619)
+2768 <reserved>
+ x (black club suit - 2663)
+2769 <reserved>
+ x (black diamond suit - 2666)
+276A <reserved>
+ x (black heart suit - 2665)
+276B <reserved>
+ x (black spade suit - 2660)
+@ Dingbat circled digits
+276C <reserved>
+ x (circled digit one - 2460)
+276D <reserved>
+ x (circled digit two - 2461)
+276E <reserved>
+ x (circled digit three - 2462)
+276F <reserved>
+ x (circled digit four - 2463)
+2770 <reserved>
+ x (circled digit five - 2464)
+2771 <reserved>
+ x (circled digit six - 2465)
+2772 <reserved>
+ x (circled digit seven - 2466)
+2773 <reserved>
+ x (circled digit eight - 2467)
+2774 <reserved>
+ x (circled digit nine - 2468)
+2775 <reserved>
+ x (circled number ten - 2469)
+2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE
+2777 DINGBAT NEGATIVE CIRCLED DIGIT TWO
+2778 DINGBAT NEGATIVE CIRCLED DIGIT THREE
+2779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+277A DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+277B DINGBAT NEGATIVE CIRCLED DIGIT SIX
+277C DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+277D DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+277E DINGBAT NEGATIVE CIRCLED DIGIT NINE
+277F DINGBAT NEGATIVE CIRCLED NUMBER TEN
+2780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+2781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+2782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+2783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+2784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+2785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+2786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+2787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+2788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+2789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+278A DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+278B DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+278C DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+278D DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+278E DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+278F DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+2790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+2791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+2792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+2793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+@ Dingbat arrows
+2794 HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2795 <reserved>
+ x (rightwards arrow - 2192)
+2796 <reserved>
+ x (left right arrow - 2194)
+2797 <reserved>
+ x (up down arrow - 2195)
+2798 HEAVY SOUTH EAST ARROW
+2799 HEAVY RIGHTWARDS ARROW
+279A HEAVY NORTH EAST ARROW
+279B DRAFTING POINT RIGHTWARDS ARROW
+279C HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D TRIANGLE-HEADED RIGHTWARDS ARROW
+279E HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1 BLACK RIGHTWARDS ARROW
+27A2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4 BLACK RIGHTWARDS ARROWHEAD
+27A5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7 SQUAT BLACK RIGHTWARDS ARROW
+27A8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9 RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3 WHITE-FEATHERED RIGHTWARDS ARROW
+27B4 BLACK-FEATHERED SOUTH EAST ARROW
+27B5 BLACK-FEATHERED RIGHTWARDS ARROW
+27B6 BLACK-FEATHERED NORTH EAST ARROW
+27B7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9 HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA TEARDROP-BARBED RIGHTWARDS ARROW
+27BB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC WEDGE-TAILED RIGHTWARDS ARROW
+27BD HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE OPEN-OUTLINED RIGHTWARDS ARROW
+@@ 2800 Braille Patterns 28FF
+@ Braille patterns
+2800 BRAILLE PATTERN BLANK
+2801 BRAILLE PATTERN DOTS-1
+2802 BRAILLE PATTERN DOTS-2
+2803 BRAILLE PATTERN DOTS-12
+2804 BRAILLE PATTERN DOTS-3
+2805 BRAILLE PATTERN DOTS-13
+2806 BRAILLE PATTERN DOTS-23
+2807 BRAILLE PATTERN DOTS-123
+2808 BRAILLE PATTERN DOTS-4
+2809 BRAILLE PATTERN DOTS-14
+280A BRAILLE PATTERN DOTS-24
+280B BRAILLE PATTERN DOTS-124
+280C BRAILLE PATTERN DOTS-34
+280D BRAILLE PATTERN DOTS-134
+280E BRAILLE PATTERN DOTS-234
+280F BRAILLE PATTERN DOTS-1234
+2810 BRAILLE PATTERN DOTS-5
+2811 BRAILLE PATTERN DOTS-15
+2812 BRAILLE PATTERN DOTS-25
+2813 BRAILLE PATTERN DOTS-125
+2814 BRAILLE PATTERN DOTS-35
+2815 BRAILLE PATTERN DOTS-135
+2816 BRAILLE PATTERN DOTS-235
+2817 BRAILLE PATTERN DOTS-1235
+2818 BRAILLE PATTERN DOTS-45
+2819 BRAILLE PATTERN DOTS-145
+281A BRAILLE PATTERN DOTS-245
+281B BRAILLE PATTERN DOTS-1245
+281C BRAILLE PATTERN DOTS-345
+281D BRAILLE PATTERN DOTS-1345
+281E BRAILLE PATTERN DOTS-2345
+281F BRAILLE PATTERN DOTS-12345
+2820 BRAILLE PATTERN DOTS-6
+2821 BRAILLE PATTERN DOTS-16
+2822 BRAILLE PATTERN DOTS-26
+2823 BRAILLE PATTERN DOTS-126
+2824 BRAILLE PATTERN DOTS-36
+2825 BRAILLE PATTERN DOTS-136
+2826 BRAILLE PATTERN DOTS-236
+2827 BRAILLE PATTERN DOTS-1236
+2828 BRAILLE PATTERN DOTS-46
+2829 BRAILLE PATTERN DOTS-146
+282A BRAILLE PATTERN DOTS-246
+282B BRAILLE PATTERN DOTS-1246
+282C BRAILLE PATTERN DOTS-346
+282D BRAILLE PATTERN DOTS-1346
+282E BRAILLE PATTERN DOTS-2346
+282F BRAILLE PATTERN DOTS-12346
+2830 BRAILLE PATTERN DOTS-56
+2831 BRAILLE PATTERN DOTS-156
+2832 BRAILLE PATTERN DOTS-256
+2833 BRAILLE PATTERN DOTS-1256
+2834 BRAILLE PATTERN DOTS-356
+2835 BRAILLE PATTERN DOTS-1356
+2836 BRAILLE PATTERN DOTS-2356
+2837 BRAILLE PATTERN DOTS-12356
+2838 BRAILLE PATTERN DOTS-456
+2839 BRAILLE PATTERN DOTS-1456
+283A BRAILLE PATTERN DOTS-2456
+283B BRAILLE PATTERN DOTS-12456
+283C BRAILLE PATTERN DOTS-3456
+283D BRAILLE PATTERN DOTS-13456
+283E BRAILLE PATTERN DOTS-23456
+283F BRAILLE PATTERN DOTS-123456
+2840 BRAILLE PATTERN DOTS-7
+2841 BRAILLE PATTERN DOTS-17
+2842 BRAILLE PATTERN DOTS-27
+2843 BRAILLE PATTERN DOTS-127
+2844 BRAILLE PATTERN DOTS-37
+2845 BRAILLE PATTERN DOTS-137
+2846 BRAILLE PATTERN DOTS-237
+2847 BRAILLE PATTERN DOTS-1237
+2848 BRAILLE PATTERN DOTS-47
+2849 BRAILLE PATTERN DOTS-147
+284A BRAILLE PATTERN DOTS-247
+284B BRAILLE PATTERN DOTS-1247
+284C BRAILLE PATTERN DOTS-347
+284D BRAILLE PATTERN DOTS-1347
+284E BRAILLE PATTERN DOTS-2347
+284F BRAILLE PATTERN DOTS-12347
+2850 BRAILLE PATTERN DOTS-57
+2851 BRAILLE PATTERN DOTS-157
+2852 BRAILLE PATTERN DOTS-257
+2853 BRAILLE PATTERN DOTS-1257
+2854 BRAILLE PATTERN DOTS-357
+2855 BRAILLE PATTERN DOTS-1357
+2856 BRAILLE PATTERN DOTS-2357
+2857 BRAILLE PATTERN DOTS-12357
+2858 BRAILLE PATTERN DOTS-457
+2859 BRAILLE PATTERN DOTS-1457
+285A BRAILLE PATTERN DOTS-2457
+285B BRAILLE PATTERN DOTS-12457
+285C BRAILLE PATTERN DOTS-3457
+285D BRAILLE PATTERN DOTS-13457
+285E BRAILLE PATTERN DOTS-23457
+285F BRAILLE PATTERN DOTS-123457
+2860 BRAILLE PATTERN DOTS-67
+2861 BRAILLE PATTERN DOTS-167
+2862 BRAILLE PATTERN DOTS-267
+2863 BRAILLE PATTERN DOTS-1267
+2864 BRAILLE PATTERN DOTS-367
+2865 BRAILLE PATTERN DOTS-1367
+2866 BRAILLE PATTERN DOTS-2367
+2867 BRAILLE PATTERN DOTS-12367
+2868 BRAILLE PATTERN DOTS-467
+2869 BRAILLE PATTERN DOTS-1467
+286A BRAILLE PATTERN DOTS-2467
+286B BRAILLE PATTERN DOTS-12467
+286C BRAILLE PATTERN DOTS-3467
+286D BRAILLE PATTERN DOTS-13467
+286E BRAILLE PATTERN DOTS-23467
+286F BRAILLE PATTERN DOTS-123467
+2870 BRAILLE PATTERN DOTS-567
+2871 BRAILLE PATTERN DOTS-1567
+2872 BRAILLE PATTERN DOTS-2567
+2873 BRAILLE PATTERN DOTS-12567
+2874 BRAILLE PATTERN DOTS-3567
+2875 BRAILLE PATTERN DOTS-13567
+2876 BRAILLE PATTERN DOTS-23567
+2877 BRAILLE PATTERN DOTS-123567
+2878 BRAILLE PATTERN DOTS-4567
+2879 BRAILLE PATTERN DOTS-14567
+287A BRAILLE PATTERN DOTS-24567
+287B BRAILLE PATTERN DOTS-124567
+287C BRAILLE PATTERN DOTS-34567
+287D BRAILLE PATTERN DOTS-134567
+287E BRAILLE PATTERN DOTS-234567
+287F BRAILLE PATTERN DOTS-1234567
+2880 BRAILLE PATTERN DOTS-8
+2881 BRAILLE PATTERN DOTS-18
+2882 BRAILLE PATTERN DOTS-28
+2883 BRAILLE PATTERN DOTS-128
+2884 BRAILLE PATTERN DOTS-38
+2885 BRAILLE PATTERN DOTS-138
+2886 BRAILLE PATTERN DOTS-238
+2887 BRAILLE PATTERN DOTS-1238
+2888 BRAILLE PATTERN DOTS-48
+2889 BRAILLE PATTERN DOTS-148
+288A BRAILLE PATTERN DOTS-248
+288B BRAILLE PATTERN DOTS-1248
+288C BRAILLE PATTERN DOTS-348
+288D BRAILLE PATTERN DOTS-1348
+288E BRAILLE PATTERN DOTS-2348
+288F BRAILLE PATTERN DOTS-12348
+2890 BRAILLE PATTERN DOTS-58
+2891 BRAILLE PATTERN DOTS-158
+2892 BRAILLE PATTERN DOTS-258
+2893 BRAILLE PATTERN DOTS-1258
+2894 BRAILLE PATTERN DOTS-358
+2895 BRAILLE PATTERN DOTS-1358
+2896 BRAILLE PATTERN DOTS-2358
+2897 BRAILLE PATTERN DOTS-12358
+2898 BRAILLE PATTERN DOTS-458
+2899 BRAILLE PATTERN DOTS-1458
+289A BRAILLE PATTERN DOTS-2458
+289B BRAILLE PATTERN DOTS-12458
+289C BRAILLE PATTERN DOTS-3458
+289D BRAILLE PATTERN DOTS-13458
+289E BRAILLE PATTERN DOTS-23458
+289F BRAILLE PATTERN DOTS-123458
+28A0 BRAILLE PATTERN DOTS-68
+28A1 BRAILLE PATTERN DOTS-168
+28A2 BRAILLE PATTERN DOTS-268
+28A3 BRAILLE PATTERN DOTS-1268
+28A4 BRAILLE PATTERN DOTS-368
+28A5 BRAILLE PATTERN DOTS-1368
+28A6 BRAILLE PATTERN DOTS-2368
+28A7 BRAILLE PATTERN DOTS-12368
+28A8 BRAILLE PATTERN DOTS-468
+28A9 BRAILLE PATTERN DOTS-1468
+28AA BRAILLE PATTERN DOTS-2468
+28AB BRAILLE PATTERN DOTS-12468
+28AC BRAILLE PATTERN DOTS-3468
+28AD BRAILLE PATTERN DOTS-13468
+28AE BRAILLE PATTERN DOTS-23468
+28AF BRAILLE PATTERN DOTS-123468
+28B0 BRAILLE PATTERN DOTS-568
+28B1 BRAILLE PATTERN DOTS-1568
+28B2 BRAILLE PATTERN DOTS-2568
+28B3 BRAILLE PATTERN DOTS-12568
+28B4 BRAILLE PATTERN DOTS-3568
+28B5 BRAILLE PATTERN DOTS-13568
+28B6 BRAILLE PATTERN DOTS-23568
+28B7 BRAILLE PATTERN DOTS-123568
+28B8 BRAILLE PATTERN DOTS-4568
+28B9 BRAILLE PATTERN DOTS-14568
+28BA BRAILLE PATTERN DOTS-24568
+28BB BRAILLE PATTERN DOTS-124568
+28BC BRAILLE PATTERN DOTS-34568
+28BD BRAILLE PATTERN DOTS-134568
+28BE BRAILLE PATTERN DOTS-234568
+28BF BRAILLE PATTERN DOTS-1234568
+28C0 BRAILLE PATTERN DOTS-78
+28C1 BRAILLE PATTERN DOTS-178
+28C2 BRAILLE PATTERN DOTS-278
+28C3 BRAILLE PATTERN DOTS-1278
+28C4 BRAILLE PATTERN DOTS-378
+28C5 BRAILLE PATTERN DOTS-1378
+28C6 BRAILLE PATTERN DOTS-2378
+28C7 BRAILLE PATTERN DOTS-12378
+28C8 BRAILLE PATTERN DOTS-478
+28C9 BRAILLE PATTERN DOTS-1478
+28CA BRAILLE PATTERN DOTS-2478
+28CB BRAILLE PATTERN DOTS-12478
+28CC BRAILLE PATTERN DOTS-3478
+28CD BRAILLE PATTERN DOTS-13478
+28CE BRAILLE PATTERN DOTS-23478
+28CF BRAILLE PATTERN DOTS-123478
+28D0 BRAILLE PATTERN DOTS-578
+28D1 BRAILLE PATTERN DOTS-1578
+28D2 BRAILLE PATTERN DOTS-2578
+28D3 BRAILLE PATTERN DOTS-12578
+28D4 BRAILLE PATTERN DOTS-3578
+28D5 BRAILLE PATTERN DOTS-13578
+28D6 BRAILLE PATTERN DOTS-23578
+28D7 BRAILLE PATTERN DOTS-123578
+28D8 BRAILLE PATTERN DOTS-4578
+28D9 BRAILLE PATTERN DOTS-14578
+28DA BRAILLE PATTERN DOTS-24578
+28DB BRAILLE PATTERN DOTS-124578
+28DC BRAILLE PATTERN DOTS-34578
+28DD BRAILLE PATTERN DOTS-134578
+28DE BRAILLE PATTERN DOTS-234578
+28DF BRAILLE PATTERN DOTS-1234578
+28E0 BRAILLE PATTERN DOTS-678
+28E1 BRAILLE PATTERN DOTS-1678
+28E2 BRAILLE PATTERN DOTS-2678
+28E3 BRAILLE PATTERN DOTS-12678
+28E4 BRAILLE PATTERN DOTS-3678
+28E5 BRAILLE PATTERN DOTS-13678
+28E6 BRAILLE PATTERN DOTS-23678
+28E7 BRAILLE PATTERN DOTS-123678
+28E8 BRAILLE PATTERN DOTS-4678
+28E9 BRAILLE PATTERN DOTS-14678
+28EA BRAILLE PATTERN DOTS-24678
+28EB BRAILLE PATTERN DOTS-124678
+28EC BRAILLE PATTERN DOTS-34678
+28ED BRAILLE PATTERN DOTS-134678
+28EE BRAILLE PATTERN DOTS-234678
+28EF BRAILLE PATTERN DOTS-1234678
+28F0 BRAILLE PATTERN DOTS-5678
+28F1 BRAILLE PATTERN DOTS-15678
+28F2 BRAILLE PATTERN DOTS-25678
+28F3 BRAILLE PATTERN DOTS-125678
+28F4 BRAILLE PATTERN DOTS-35678
+28F5 BRAILLE PATTERN DOTS-135678
+28F6 BRAILLE PATTERN DOTS-235678
+28F7 BRAILLE PATTERN DOTS-1235678
+28F8 BRAILLE PATTERN DOTS-45678
+28F9 BRAILLE PATTERN DOTS-145678
+28FA BRAILLE PATTERN DOTS-245678
+28FB BRAILLE PATTERN DOTS-1245678
+28FC BRAILLE PATTERN DOTS-345678
+28FD BRAILLE PATTERN DOTS-1345678
+28FE BRAILLE PATTERN DOTS-2345678
+28FF BRAILLE PATTERN DOTS-12345678
+@@ 2E80 CJK Radicals Supplement 2EFF
+@ CJK radicals supplement
+2E80 CJK RADICAL REPEAT
+2E81 CJK RADICAL CLIFF
+2E82 CJK RADICAL SECOND ONE
+2E83 CJK RADICAL SECOND TWO
+2E84 CJK RADICAL SECOND THREE
+2E85 CJK RADICAL PERSON
+2E86 CJK RADICAL BOX
+2E87 CJK RADICAL TABLE
+2E88 CJK RADICAL KNIFE ONE
+2E89 CJK RADICAL KNIFE TWO
+2E8A CJK RADICAL DIVINATION
+2E8B CJK RADICAL SEAL
+2E8C CJK RADICAL SMALL ONE
+2E8D CJK RADICAL SMALL TWO
+2E8E CJK RADICAL LAME ONE
+2E8F CJK RADICAL LAME TWO
+2E90 CJK RADICAL LAME THREE
+2E91 CJK RADICAL LAME FOUR
+2E92 CJK RADICAL SNAKE
+2E93 CJK RADICAL THREAD
+2E94 CJK RADICAL SNOUT ONE
+2E95 CJK RADICAL SNOUT TWO
+2E96 CJK RADICAL HEART ONE
+2E97 CJK RADICAL HEART TWO
+2E98 CJK RADICAL HAND
+2E99 CJK RADICAL RAP
+2E9B CJK RADICAL CHOKE
+2E9C CJK RADICAL SUN
+2E9D CJK RADICAL MOON
+2E9E CJK RADICAL DEATH
+2E9F CJK RADICAL MOTHER
+ # 6BCD
+2EA0 CJK RADICAL CIVILIAN
+2EA1 CJK RADICAL WATER ONE
+2EA2 CJK RADICAL WATER TWO
+2EA3 CJK RADICAL FIRE
+2EA4 CJK RADICAL PAW ONE
+2EA5 CJK RADICAL PAW TWO
+2EA6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+2EA7 CJK RADICAL COW
+2EA8 CJK RADICAL DOG
+2EA9 CJK RADICAL JADE
+2EAA CJK RADICAL BOLT OF CLOTH
+2EAB CJK RADICAL EYE
+2EAC CJK RADICAL SPIRIT ONE
+2EAD CJK RADICAL SPIRIT TWO
+2EAE CJK RADICAL BAMBOO
+2EAF CJK RADICAL SILK
+2EB0 CJK RADICAL C-SIMPLIFIED SILK
+2EB1 CJK RADICAL NET ONE
+2EB2 CJK RADICAL NET TWO
+2EB3 CJK RADICAL NET THREE
+2EB4 CJK RADICAL NET FOUR
+2EB5 CJK RADICAL MESH
+2EB6 CJK RADICAL SHEEP
+2EB7 CJK RADICAL RAM
+2EB8 CJK RADICAL EWE
+2EB9 CJK RADICAL OLD
+2EBA CJK RADICAL BRUSH ONE
+2EBB CJK RADICAL BRUSH TWO
+2EBC CJK RADICAL MEAT
+2EBD CJK RADICAL MORTAR
+2EBE CJK RADICAL GRASS ONE
+2EBF CJK RADICAL GRASS TWO
+2EC0 CJK RADICAL GRASS THREE
+2EC1 CJK RADICAL TIGER
+2EC2 CJK RADICAL CLOTHES
+2EC3 CJK RADICAL WEST ONE
+2EC4 CJK RADICAL WEST TWO
+2EC5 CJK RADICAL C-SIMPLIFIED SEE
+2EC6 CJK RADICAL SIMPLIFIED HORN
+2EC7 CJK RADICAL HORN
+2EC8 CJK RADICAL C-SIMPLIFIED SPEECH
+2EC9 CJK RADICAL C-SIMPLIFIED SHELL
+2ECA CJK RADICAL FOOT
+2ECB CJK RADICAL C-SIMPLIFIED CART
+2ECC CJK RADICAL SIMPLIFIED WALK
+2ECD CJK RADICAL WALK ONE
+2ECE CJK RADICAL WALK TWO
+2ECF CJK RADICAL CITY
+2ED0 CJK RADICAL C-SIMPLIFIED GOLD
+2ED1 CJK RADICAL LONG ONE
+2ED2 CJK RADICAL LONG TWO
+2ED3 CJK RADICAL C-SIMPLIFIED LONG
+2ED4 CJK RADICAL C-SIMPLIFIED GATE
+2ED5 CJK RADICAL MOUND ONE
+2ED6 CJK RADICAL MOUND TWO
+2ED7 CJK RADICAL RAIN
+2ED8 CJK RADICAL BLUE
+2ED9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+2EDA CJK RADICAL C-SIMPLIFIED LEAF
+2EDB CJK RADICAL C-SIMPLIFIED WIND
+2EDC CJK RADICAL C-SIMPLIFIED FLY
+2EDD CJK RADICAL EAT ONE
+2EDE CJK RADICAL EAT TWO
+2EDF CJK RADICAL EAT THREE
+2EE0 CJK RADICAL C-SIMPLIFIED EAT
+2EE1 CJK RADICAL HEAD
+2EE2 CJK RADICAL C-SIMPLIFIED HORSE
+2EE3 CJK RADICAL BONE
+2EE4 CJK RADICAL GHOST
+2EE5 CJK RADICAL C-SIMPLIFIED FISH
+2EE6 CJK RADICAL C-SIMPLIFIED BIRD
+2EE7 CJK RADICAL C-SIMPLIFIED SALT
+2EE8 CJK RADICAL SIMPLIFIED WHEAT
+2EE9 CJK RADICAL SIMPLIFIED YELLOW
+2EEA CJK RADICAL C-SIMPLIFIED FROG
+2EEB CJK RADICAL J-SIMPLIFIED EVEN
+2EEC CJK RADICAL C-SIMPLIFIED EVEN
+2EED CJK RADICAL J-SIMPLIFIED TOOTH
+2EEE CJK RADICAL C-SIMPLIFIED TOOTH
+2EEF CJK RADICAL J-SIMPLIFIED DRAGON
+2EF0 CJK RADICAL C-SIMPLIFIED DRAGON
+2EF1 CJK RADICAL TURTLE
+2EF2 CJK RADICAL J-SIMPLIFIED TURTLE
+2EF3 CJK RADICAL C-SIMPLIFIED TURTLE
+ # 9F9F
+@@ 2F00 Kangxi Radicals 2FDF
+@ Kangxi radicals
+2F00 KANGXI RADICAL ONE
+ # 4E00
+2F01 KANGXI RADICAL LINE
+ # 4E28
+2F02 KANGXI RADICAL DOT
+ # 4E36
+2F03 KANGXI RADICAL SLASH
+ # 4E3F
+2F04 KANGXI RADICAL SECOND
+ # 4E59
+2F05 KANGXI RADICAL HOOK
+ # 4E85
+2F06 KANGXI RADICAL TWO
+ # 4E8C
+2F07 KANGXI RADICAL LID
+ # 4EA0
+2F08 KANGXI RADICAL MAN
+ # 4EBA
+2F09 KANGXI RADICAL LEGS
+ # 513F
+2F0A KANGXI RADICAL ENTER
+ # 5165
+2F0B KANGXI RADICAL EIGHT
+ # 516B
+2F0C KANGXI RADICAL DOWN BOX
+ # 5182
+2F0D KANGXI RADICAL COVER
+ # 5196
+2F0E KANGXI RADICAL ICE
+ # 51AB
+2F0F KANGXI RADICAL TABLE
+ # 51E0
+2F10 KANGXI RADICAL OPEN BOX
+ # 51F5
+2F11 KANGXI RADICAL KNIFE
+ # 5200
+2F12 KANGXI RADICAL POWER
+ # 529B
+2F13 KANGXI RADICAL WRAP
+ # 52F9
+2F14 KANGXI RADICAL SPOON
+ # 5315
+2F15 KANGXI RADICAL RIGHT OPEN BOX
+ # 531A
+2F16 KANGXI RADICAL HIDING ENCLOSURE
+ # 5338
+2F17 KANGXI RADICAL TEN
+ # 5341
+2F18 KANGXI RADICAL DIVINATION
+ # 535C
+2F19 KANGXI RADICAL SEAL
+ # 5369
+2F1A KANGXI RADICAL CLIFF
+ # 5382
+2F1B KANGXI RADICAL PRIVATE
+ # 53B6
+2F1C KANGXI RADICAL AGAIN
+ # 53C8
+2F1D KANGXI RADICAL MOUTH
+ # 53E3
+2F1E KANGXI RADICAL ENCLOSURE
+ # 56D7
+2F1F KANGXI RADICAL EARTH
+ # 571F
+2F20 KANGXI RADICAL SCHOLAR
+ # 58EB
+2F21 KANGXI RADICAL GO
+ # 5902
+2F22 KANGXI RADICAL GO SLOWLY
+ # 590A
+2F23 KANGXI RADICAL EVENING
+ # 5915
+2F24 KANGXI RADICAL BIG
+ # 5927
+2F25 KANGXI RADICAL WOMAN
+ # 5973
+2F26 KANGXI RADICAL CHILD
+ # 5B50
+2F27 KANGXI RADICAL ROOF
+ # 5B80
+2F28 KANGXI RADICAL INCH
+ # 5BF8
+2F29 KANGXI RADICAL SMALL
+ # 5C0F
+2F2A KANGXI RADICAL LAME
+ # 5C22
+2F2B KANGXI RADICAL CORPSE
+ # 5C38
+2F2C KANGXI RADICAL SPROUT
+ # 5C6E
+2F2D KANGXI RADICAL MOUNTAIN
+ # 5C71
+2F2E KANGXI RADICAL RIVER
+ # 5DDB
+2F2F KANGXI RADICAL WORK
+ # 5DE5
+2F30 KANGXI RADICAL ONESELF
+ # 5DF1
+2F31 KANGXI RADICAL TURBAN
+ # 5DFE
+2F32 KANGXI RADICAL DRY
+ # 5E72
+2F33 KANGXI RADICAL SHORT THREAD
+ # 5E7A
+2F34 KANGXI RADICAL DOTTED CLIFF
+ # 5E7F
+2F35 KANGXI RADICAL LONG STRIDE
+ # 5EF4
+2F36 KANGXI RADICAL TWO HANDS
+ # 5EFE
+2F37 KANGXI RADICAL SHOOT
+ # 5F0B
+2F38 KANGXI RADICAL BOW
+ # 5F13
+2F39 KANGXI RADICAL SNOUT
+ # 5F50
+2F3A KANGXI RADICAL BRISTLE
+ # 5F61
+2F3B KANGXI RADICAL STEP
+ # 5F73
+2F3C KANGXI RADICAL HEART
+ # 5FC3
+2F3D KANGXI RADICAL HALBERD
+ # 6208
+2F3E KANGXI RADICAL DOOR
+ # 6236
+2F3F KANGXI RADICAL HAND
+ # 624B
+2F40 KANGXI RADICAL BRANCH
+ # 652F
+2F41 KANGXI RADICAL RAP
+ # 6534
+2F42 KANGXI RADICAL SCRIPT
+ # 6587
+2F43 KANGXI RADICAL DIPPER
+ # 6597
+2F44 KANGXI RADICAL AXE
+ # 65A4
+2F45 KANGXI RADICAL SQUARE
+ # 65B9
+2F46 KANGXI RADICAL NOT
+ # 65E0
+2F47 KANGXI RADICAL SUN
+ # 65E5
+2F48 KANGXI RADICAL SAY
+ # 66F0
+2F49 KANGXI RADICAL MOON
+ # 6708
+2F4A KANGXI RADICAL TREE
+ # 6728
+2F4B KANGXI RADICAL LACK
+ # 6B20
+2F4C KANGXI RADICAL STOP
+ # 6B62
+2F4D KANGXI RADICAL DEATH
+ # 6B79
+2F4E KANGXI RADICAL WEAPON
+ # 6BB3
+2F4F KANGXI RADICAL DO NOT
+ # 6BCB
+2F50 KANGXI RADICAL COMPARE
+ # 6BD4
+2F51 KANGXI RADICAL FUR
+ # 6BDB
+2F52 KANGXI RADICAL CLAN
+ # 6C0F
+2F53 KANGXI RADICAL STEAM
+ # 6C14
+2F54 KANGXI RADICAL WATER
+ # 6C34
+2F55 KANGXI RADICAL FIRE
+ # 706B
+2F56 KANGXI RADICAL CLAW
+ # 722A
+2F57 KANGXI RADICAL FATHER
+ # 7236
+2F58 KANGXI RADICAL DOUBLE X
+ # 723B
+2F59 KANGXI RADICAL HALF TREE TRUNK
+ # 723F
+2F5A KANGXI RADICAL SLICE
+ # 7247
+2F5B KANGXI RADICAL FANG
+ # 7259
+2F5C KANGXI RADICAL COW
+ # 725B
+2F5D KANGXI RADICAL DOG
+ # 72AC
+2F5E KANGXI RADICAL PROFOUND
+ # 7384
+2F5F KANGXI RADICAL JADE
+ # 7389
+2F60 KANGXI RADICAL MELON
+ # 74DC
+2F61 KANGXI RADICAL TILE
+ # 74E6
+2F62 KANGXI RADICAL SWEET
+ # 7518
+2F63 KANGXI RADICAL LIFE
+ # 751F
+2F64 KANGXI RADICAL USE
+ # 7528
+2F65 KANGXI RADICAL FIELD
+ # 7530
+2F66 KANGXI RADICAL BOLT OF CLOTH
+ # 758B
+2F67 KANGXI RADICAL SICKNESS
+ # 7592
+2F68 KANGXI RADICAL DOTTED TENT
+ # 7676
+2F69 KANGXI RADICAL WHITE
+ # 767D
+2F6A KANGXI RADICAL SKIN
+ # 76AE
+2F6B KANGXI RADICAL DISH
+ # 76BF
+2F6C KANGXI RADICAL EYE
+ # 76EE
+2F6D KANGXI RADICAL SPEAR
+ # 77DB
+2F6E KANGXI RADICAL ARROW
+ # 77E2
+2F6F KANGXI RADICAL STONE
+ # 77F3
+2F70 KANGXI RADICAL SPIRIT
+ # 793A
+2F71 KANGXI RADICAL TRACK
+ # 79B8
+2F72 KANGXI RADICAL GRAIN
+ # 79BE
+2F73 KANGXI RADICAL CAVE
+ # 7A74
+2F74 KANGXI RADICAL STAND
+ # 7ACB
+2F75 KANGXI RADICAL BAMBOO
+ # 7AF9
+2F76 KANGXI RADICAL RICE
+ # 7C73
+2F77 KANGXI RADICAL SILK
+ # 7CF8
+2F78 KANGXI RADICAL JAR
+ # 7F36
+2F79 KANGXI RADICAL NET
+ # 7F51
+2F7A KANGXI RADICAL SHEEP
+ # 7F8A
+2F7B KANGXI RADICAL FEATHER
+ # 7FBD
+2F7C KANGXI RADICAL OLD
+ # 8001
+2F7D KANGXI RADICAL AND
+ # 800C
+2F7E KANGXI RADICAL PLOW
+ # 8012
+2F7F KANGXI RADICAL EAR
+ # 8033
+2F80 KANGXI RADICAL BRUSH
+ # 807F
+2F81 KANGXI RADICAL MEAT
+ # 8089
+2F82 KANGXI RADICAL MINISTER
+ # 81E3
+2F83 KANGXI RADICAL SELF
+ # 81EA
+2F84 KANGXI RADICAL ARRIVE
+ # 81F3
+2F85 KANGXI RADICAL MORTAR
+ # 81FC
+2F86 KANGXI RADICAL TONGUE
+ # 820C
+2F87 KANGXI RADICAL OPPOSE
+ # 821B
+2F88 KANGXI RADICAL BOAT
+ # 821F
+2F89 KANGXI RADICAL STOPPING
+ # 826E
+2F8A KANGXI RADICAL COLOR
+ # 8272
+2F8B KANGXI RADICAL GRASS
+ # 8278
+2F8C KANGXI RADICAL TIGER
+ # 864D
+2F8D KANGXI RADICAL INSECT
+ # 866B
+2F8E KANGXI RADICAL BLOOD
+ # 8840
+2F8F KANGXI RADICAL WALK ENCLOSURE
+ # 884C
+2F90 KANGXI RADICAL CLOTHES
+ # 8863
+2F91 KANGXI RADICAL WEST
+ # 897E
+2F92 KANGXI RADICAL SEE
+ # 898B
+2F93 KANGXI RADICAL HORN
+ # 89D2
+2F94 KANGXI RADICAL SPEECH
+ # 8A00
+2F95 KANGXI RADICAL VALLEY
+ # 8C37
+2F96 KANGXI RADICAL BEAN
+ # 8C46
+2F97 KANGXI RADICAL PIG
+ # 8C55
+2F98 KANGXI RADICAL BADGER
+ # 8C78
+2F99 KANGXI RADICAL SHELL
+ # 8C9D
+2F9A KANGXI RADICAL RED
+ # 8D64
+2F9B KANGXI RADICAL RUN
+ # 8D70
+2F9C KANGXI RADICAL FOOT
+ # 8DB3
+2F9D KANGXI RADICAL BODY
+ # 8EAB
+2F9E KANGXI RADICAL CART
+ # 8ECA
+2F9F KANGXI RADICAL BITTER
+ # 8F9B
+2FA0 KANGXI RADICAL MORNING
+ # 8FB0
+2FA1 KANGXI RADICAL WALK
+ # 8FB5
+2FA2 KANGXI RADICAL CITY
+ # 9091
+2FA3 KANGXI RADICAL WINE
+ # 9149
+2FA4 KANGXI RADICAL DISTINGUISH
+ # 91C6
+2FA5 KANGXI RADICAL VILLAGE
+ # 91CC
+2FA6 KANGXI RADICAL GOLD
+ # 91D1
+2FA7 KANGXI RADICAL LONG
+ # 9577
+2FA8 KANGXI RADICAL GATE
+ # 9580
+2FA9 KANGXI RADICAL MOUND
+ # 961C
+2FAA KANGXI RADICAL SLAVE
+ # 96B6
+2FAB KANGXI RADICAL SHORT TAILED BIRD
+ # 96B9
+2FAC KANGXI RADICAL RAIN
+ # 96E8
+2FAD KANGXI RADICAL BLUE
+ # 9751
+2FAE KANGXI RADICAL WRONG
+ # 975E
+2FAF KANGXI RADICAL FACE
+ # 9762
+2FB0 KANGXI RADICAL LEATHER
+ # 9769
+2FB1 KANGXI RADICAL TANNED LEATHER
+ # 97CB
+2FB2 KANGXI RADICAL LEEK
+ # 97ED
+2FB3 KANGXI RADICAL SOUND
+ # 97F3
+2FB4 KANGXI RADICAL LEAF
+ # 9801
+2FB5 KANGXI RADICAL WIND
+ # 98A8
+2FB6 KANGXI RADICAL FLY
+ # 98DB
+2FB7 KANGXI RADICAL EAT
+ # 98DF
+2FB8 KANGXI RADICAL HEAD
+ # 9996
+2FB9 KANGXI RADICAL FRAGRANT
+ # 9999
+2FBA KANGXI RADICAL HORSE
+ # 99AC
+2FBB KANGXI RADICAL BONE
+ # 9AA8
+2FBC KANGXI RADICAL TALL
+ # 9AD8
+2FBD KANGXI RADICAL HAIR
+ # 9ADF
+2FBE KANGXI RADICAL FIGHT
+ # 9B25
+2FBF KANGXI RADICAL SACRIFICIAL WINE
+ # 9B2F
+2FC0 KANGXI RADICAL CAULDRON
+ # 9B32
+2FC1 KANGXI RADICAL GHOST
+ # 9B3C
+2FC2 KANGXI RADICAL FISH
+ # 9B5A
+2FC3 KANGXI RADICAL BIRD
+ # 9CE5
+2FC4 KANGXI RADICAL SALT
+ # 9E75
+2FC5 KANGXI RADICAL DEER
+ # 9E7F
+2FC6 KANGXI RADICAL WHEAT
+ # 9EA5
+2FC7 KANGXI RADICAL HEMP
+ # 9EBB
+2FC8 KANGXI RADICAL YELLOW
+ # 9EC3
+2FC9 KANGXI RADICAL MILLET
+ # 9ECD
+2FCA KANGXI RADICAL BLACK
+ # 9ED1
+2FCB KANGXI RADICAL EMBROIDERY
+ # 9EF9
+2FCC KANGXI RADICAL FROG
+ # 9EFD
+2FCD KANGXI RADICAL TRIPOD
+ # 9F0E
+2FCE KANGXI RADICAL DRUM
+ # 9F13
+2FCF KANGXI RADICAL RAT
+ # 9F20
+2FD0 KANGXI RADICAL NOSE
+ # 9F3B
+2FD1 KANGXI RADICAL EVEN
+ # 9F4A
+2FD2 KANGXI RADICAL TOOTH
+ # 9F52
+2FD3 KANGXI RADICAL DRAGON
+ # 9F8D
+2FD4 KANGXI RADICAL TURTLE
+ # 9F9C
+2FD5 KANGXI RADICAL FLUTE
+ # 9FA0
+@@ 2FF0 Ideographic Description Characters 2FFF
+@ Ideographic description characters
+@+ These are visibly displayed graphic characters, not invisible composition controls.
+2FF0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+@@ 3000 CJK Symbols and Punctuation 303F
+@ CJK symbols and punctuation
+3000 IDEOGRAPHIC SPACE
+ x (space - 0020)
+ # <wide> 0020
+3001 IDEOGRAPHIC COMMA
+ x (comma - 002C)
+3002 IDEOGRAPHIC FULL STOP
+ x (full stop - 002E)
+3003 DITTO MARK
+ x (double prime - 2033)
+3004 JAPANESE INDUSTRIAL STANDARD SYMBOL
+3005 IDEOGRAPHIC ITERATION MARK
+3006 IDEOGRAPHIC CLOSING MARK
+3007 IDEOGRAPHIC NUMBER ZERO
+ x (combining enclosing circle - 20DD)
+ x (white circle - 25CB)
+ x (large circle - 25EF)
+3008 LEFT ANGLE BRACKET
+ x (less-than sign - 003C)
+ x (single left-pointing angle quotation mark - 2039)
+ x (left-pointing angle bracket - 2329)
+3009 RIGHT ANGLE BRACKET
+ x (greater-than sign - 003E)
+ x (single right-pointing angle quotation mark - 203A)
+ x (right-pointing angle bracket - 232A)
+300A LEFT DOUBLE ANGLE BRACKET
+ = z notation left chevron bracket
+ x (left-pointing double angle quotation mark - 00AB)
+300B RIGHT DOUBLE ANGLE BRACKET
+ = z notation right chevron bracket
+ x (right-pointing double angle quotation mark - 00BB)
+300C LEFT CORNER BRACKET
+ x (left ceiling - 2308)
+300D RIGHT CORNER BRACKET
+ * used as quotation marks
+ x (right floor - 230B)
+300E LEFT WHITE CORNER BRACKET
+300F RIGHT WHITE CORNER BRACKET
+ * used as quotation marks
+3010 LEFT BLACK LENTICULAR BRACKET
+3011 RIGHT BLACK LENTICULAR BRACKET
+3012 POSTAL MARK
+3013 GETA MARK
+ * substitute for ideograph not in font
+3014 LEFT TORTOISE SHELL BRACKET
+3015 RIGHT TORTOISE SHELL BRACKET
+3016 LEFT WHITE LENTICULAR BRACKET
+3017 RIGHT WHITE LENTICULAR BRACKET
+3018 LEFT WHITE TORTOISE SHELL BRACKET
+3019 RIGHT WHITE TORTOISE SHELL BRACKET
+301A LEFT WHITE SQUARE BRACKET
+ = z notation left bag bracket
+301B RIGHT WHITE SQUARE BRACKET
+ = z notation right bag bracket
+301C WAVE DASH
+@+ * This character was encoded to match JIS C 6226-1978 1-33 "wave dash". Subsequent revisions of the JIS standard and industry practice have settled on JIS 1-33 as being the fullwidth tilde character.
+ x (wavy dash - 3030)
+ x (fullwidth tilde - FF5E)
+301D REVERSED DOUBLE PRIME QUOTATION MARK
+ * sometimes depicted as double prime quotation mark
+ x (left double quotation mark - 201C)
+ x (reversed double prime - 2036)
+301E DOUBLE PRIME QUOTATION MARK
+ * this is a mistaken analogue to 201D; 301F is preferred
+ x (right double quotation mark - 201D)
+ x (double prime - 2033)
+301F LOW DOUBLE PRIME QUOTATION MARK
+ * may be depicted as low inverse double prime quotation mark
+3020 POSTAL MARK FACE
+@ Hangzhou-style numerals
+3021 HANGZHOU NUMERAL ONE
+3022 HANGZHOU NUMERAL TWO
+3023 HANGZHOU NUMERAL THREE
+3024 HANGZHOU NUMERAL FOUR
+3025 HANGZHOU NUMERAL FIVE
+3026 HANGZHOU NUMERAL SIX
+3027 HANGZHOU NUMERAL SEVEN
+3028 HANGZHOU NUMERAL EIGHT
+3029 HANGZHOU NUMERAL NINE
+@ Diacritics
+302A IDEOGRAPHIC LEVEL TONE MARK
+302B IDEOGRAPHIC RISING TONE MARK
+302C IDEOGRAPHIC DEPARTING TONE MARK
+302D IDEOGRAPHIC ENTERING TONE MARK
+302E HANGUL SINGLE DOT TONE MARK
+ = single dot Bangjeom
+302F HANGUL DOUBLE DOT TONE MARK
+ = double dot Bangjeom
+@ Other CJK symbols
+3030 WAVY DASH
+ x (wavy line - 2307)
+ x (wave dash - 301C)
+3031 VERTICAL KANA REPEAT MARK
+3032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK
+ * the preceding two semantic characters are preferred to the following three glyphic forms
+3033 VERTICAL KANA REPEAT MARK UPPER HALF
+3034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF
+ * the preceding two are glyphs used in conjunction with the following glyph
+3035 VERTICAL KANA REPEAT MARK LOWER HALF
+3036 CIRCLED POSTAL MARK
+ # 3012 postal mark
+3037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+@ Additional Hangzhou-style numerals
+3038 HANGZHOU NUMERAL TEN
+ # 5341
+3039 HANGZHOU NUMERAL TWENTY
+ # 5344
+303A HANGZHOU NUMERAL THIRTY
+ # 5345
+@ Special CJK indicators
+@+ These are visibly displayed graphic characters, not invisible formatting controls.
+303E IDEOGRAPHIC VARIATION INDICATOR
+ * visual indicator that the following ideograph is to be taken as a variant of the intended character
+303F IDEOGRAPHIC HALF FILL SPACE
+ * visual indicator of a screen space for half of an ideograph
+@@ 3040 Hiragana 309F
+@ Based on JIS X 0208
+3041 HIRAGANA LETTER SMALL A
+3042 HIRAGANA LETTER A
+3043 HIRAGANA LETTER SMALL I
+3044 HIRAGANA LETTER I
+3045 HIRAGANA LETTER SMALL U
+3046 HIRAGANA LETTER U
+3047 HIRAGANA LETTER SMALL E
+3048 HIRAGANA LETTER E
+3049 HIRAGANA LETTER SMALL O
+304A HIRAGANA LETTER O
+304B HIRAGANA LETTER KA
+304C HIRAGANA LETTER GA
+ : 304B 3099
+304D HIRAGANA LETTER KI
+304E HIRAGANA LETTER GI
+ : 304D 3099
+304F HIRAGANA LETTER KU
+3050 HIRAGANA LETTER GU
+ : 304F 3099
+3051 HIRAGANA LETTER KE
+3052 HIRAGANA LETTER GE
+ : 3051 3099
+3053 HIRAGANA LETTER KO
+3054 HIRAGANA LETTER GO
+ : 3053 3099
+3055 HIRAGANA LETTER SA
+3056 HIRAGANA LETTER ZA
+ : 3055 3099
+3057 HIRAGANA LETTER SI
+ = SHI
+3058 HIRAGANA LETTER ZI
+ = JI (not unique)
+ : 3057 3099
+3059 HIRAGANA LETTER SU
+305A HIRAGANA LETTER ZU
+ : 3059 3099
+305B HIRAGANA LETTER SE
+305C HIRAGANA LETTER ZE
+ : 305B 3099
+305D HIRAGANA LETTER SO
+305E HIRAGANA LETTER ZO
+ : 305D 3099
+305F HIRAGANA LETTER TA
+3060 HIRAGANA LETTER DA
+ : 305F 3099
+3061 HIRAGANA LETTER TI
+ = CHI
+3062 HIRAGANA LETTER DI
+ = JI (not unique)
+ : 3061 3099
+3063 HIRAGANA LETTER SMALL TU
+ = SMALL TSU
+3064 HIRAGANA LETTER TU
+ = TSU
+3065 HIRAGANA LETTER DU
+ = ZU (not unique)
+ : 3064 3099
+3066 HIRAGANA LETTER TE
+3067 HIRAGANA LETTER DE
+ : 3066 3099
+3068 HIRAGANA LETTER TO
+3069 HIRAGANA LETTER DO
+ : 3068 3099
+306A HIRAGANA LETTER NA
+306B HIRAGANA LETTER NI
+306C HIRAGANA LETTER NU
+306D HIRAGANA LETTER NE
+306E HIRAGANA LETTER NO
+306F HIRAGANA LETTER HA
+3070 HIRAGANA LETTER BA
+ : 306F 3099
+3071 HIRAGANA LETTER PA
+ : 306F 309A
+3072 HIRAGANA LETTER HI
+3073 HIRAGANA LETTER BI
+ : 3072 3099
+3074 HIRAGANA LETTER PI
+ : 3072 309A
+3075 HIRAGANA LETTER HU
+ = FU
+3076 HIRAGANA LETTER BU
+ : 3075 3099
+3077 HIRAGANA LETTER PU
+ : 3075 309A
+3078 HIRAGANA LETTER HE
+3079 HIRAGANA LETTER BE
+ : 3078 3099
+307A HIRAGANA LETTER PE
+ : 3078 309A
+307B HIRAGANA LETTER HO
+307C HIRAGANA LETTER BO
+ : 307B 3099
+307D HIRAGANA LETTER PO
+ : 307B 309A
+307E HIRAGANA LETTER MA
+307F HIRAGANA LETTER MI
+3080 HIRAGANA LETTER MU
+3081 HIRAGANA LETTER ME
+3082 HIRAGANA LETTER MO
+3083 HIRAGANA LETTER SMALL YA
+3084 HIRAGANA LETTER YA
+3085 HIRAGANA LETTER SMALL YU
+3086 HIRAGANA LETTER YU
+3087 HIRAGANA LETTER SMALL YO
+3088 HIRAGANA LETTER YO
+3089 HIRAGANA LETTER RA
+308A HIRAGANA LETTER RI
+308B HIRAGANA LETTER RU
+308C HIRAGANA LETTER RE
+308D HIRAGANA LETTER RO
+308E HIRAGANA LETTER SMALL WA
+308F HIRAGANA LETTER WA
+3090 HIRAGANA LETTER WI
+3091 HIRAGANA LETTER WE
+3092 HIRAGANA LETTER WO
+3093 HIRAGANA LETTER N
+3094 HIRAGANA LETTER VU
+ : 3046 3099
+@ Voicing marks
+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309B KATAKANA-HIRAGANA VOICED SOUND MARK
+ # 0020 3099
+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ # 0020 309A
+@ Iteration marks
+309D HIRAGANA ITERATION MARK
+309E HIRAGANA VOICED ITERATION MARK
+ : 309D 3099
+@@ 30A0 Katakana 30FF
+@ Based on JIS X 0208
+30A1 KATAKANA LETTER SMALL A
+30A2 KATAKANA LETTER A
+30A3 KATAKANA LETTER SMALL I
+30A4 KATAKANA LETTER I
+30A5 KATAKANA LETTER SMALL U
+30A6 KATAKANA LETTER U
+30A7 KATAKANA LETTER SMALL E
+30A8 KATAKANA LETTER E
+30A9 KATAKANA LETTER SMALL O
+30AA KATAKANA LETTER O
+30AB KATAKANA LETTER KA
+30AC KATAKANA LETTER GA
+ : 30AB 3099
+30AD KATAKANA LETTER KI
+30AE KATAKANA LETTER GI
+ : 30AD 3099
+30AF KATAKANA LETTER KU
+30B0 KATAKANA LETTER GU
+ : 30AF 3099
+30B1 KATAKANA LETTER KE
+30B2 KATAKANA LETTER GE
+ : 30B1 3099
+30B3 KATAKANA LETTER KO
+30B4 KATAKANA LETTER GO
+ : 30B3 3099
+30B5 KATAKANA LETTER SA
+30B6 KATAKANA LETTER ZA
+ : 30B5 3099
+30B7 KATAKANA LETTER SI
+ = SHI
+30B8 KATAKANA LETTER ZI
+ = JI (not unique)
+ : 30B7 3099
+30B9 KATAKANA LETTER SU
+30BA KATAKANA LETTER ZU
+ : 30B9 3099
+30BB KATAKANA LETTER SE
+30BC KATAKANA LETTER ZE
+ : 30BB 3099
+30BD KATAKANA LETTER SO
+30BE KATAKANA LETTER ZO
+ : 30BD 3099
+30BF KATAKANA LETTER TA
+30C0 KATAKANA LETTER DA
+ : 30BF 3099
+30C1 KATAKANA LETTER TI
+ = CHI
+30C2 KATAKANA LETTER DI
+ = JI (not unique)
+ : 30C1 3099
+30C3 KATAKANA LETTER SMALL TU
+ = SMALL TSU
+30C4 KATAKANA LETTER TU
+ = TSU
+30C5 KATAKANA LETTER DU
+ = ZU (not unique)
+ : 30C4 3099
+30C6 KATAKANA LETTER TE
+30C7 KATAKANA LETTER DE
+ : 30C6 3099
+30C8 KATAKANA LETTER TO
+30C9 KATAKANA LETTER DO
+ : 30C8 3099
+30CA KATAKANA LETTER NA
+30CB KATAKANA LETTER NI
+30CC KATAKANA LETTER NU
+30CD KATAKANA LETTER NE
+30CE KATAKANA LETTER NO
+30CF KATAKANA LETTER HA
+30D0 KATAKANA LETTER BA
+ : 30CF 3099
+30D1 KATAKANA LETTER PA
+ : 30CF 309A
+30D2 KATAKANA LETTER HI
+30D3 KATAKANA LETTER BI
+ : 30D2 3099
+30D4 KATAKANA LETTER PI
+ : 30D2 309A
+30D5 KATAKANA LETTER HU
+ = FU
+30D6 KATAKANA LETTER BU
+ : 30D5 3099
+30D7 KATAKANA LETTER PU
+ : 30D5 309A
+30D8 KATAKANA LETTER HE
+30D9 KATAKANA LETTER BE
+ : 30D8 3099
+30DA KATAKANA LETTER PE
+ : 30D8 309A
+30DB KATAKANA LETTER HO
+30DC KATAKANA LETTER BO
+ : 30DB 3099
+30DD KATAKANA LETTER PO
+ : 30DB 309A
+30DE KATAKANA LETTER MA
+30DF KATAKANA LETTER MI
+30E0 KATAKANA LETTER MU
+30E1 KATAKANA LETTER ME
+30E2 KATAKANA LETTER MO
+30E3 KATAKANA LETTER SMALL YA
+30E4 KATAKANA LETTER YA
+30E5 KATAKANA LETTER SMALL YU
+30E6 KATAKANA LETTER YU
+30E7 KATAKANA LETTER SMALL YO
+30E8 KATAKANA LETTER YO
+30E9 KATAKANA LETTER RA
+30EA KATAKANA LETTER RI
+30EB KATAKANA LETTER RU
+30EC KATAKANA LETTER RE
+30ED KATAKANA LETTER RO
+30EE KATAKANA LETTER SMALL WA
+30EF KATAKANA LETTER WA
+30F0 KATAKANA LETTER WI
+30F1 KATAKANA LETTER WE
+30F2 KATAKANA LETTER WO
+30F3 KATAKANA LETTER N
+30F4 KATAKANA LETTER VU
+ : 30A6 3099
+30F5 KATAKANA LETTER SMALL KA
+30F6 KATAKANA LETTER SMALL KE
+30F7 KATAKANA LETTER VA
+ : 30EF 3099
+30F8 KATAKANA LETTER VI
+ : 30F0 3099
+30F9 KATAKANA LETTER VE
+ : 30F1 3099
+30FA KATAKANA LETTER VO
+ : 30F2 3099
+@ Conjunction and length marks
+30FB KATAKANA MIDDLE DOT
+ x (middle dot - 00B7)
+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ x (em dash - 2014)
+@ Iteration marks
+30FD KATAKANA ITERATION MARK
+30FE KATAKANA VOICED ITERATION MARK
+ : 30FD 3099
+@@ 3100 Bopomofo 312F
+@+ See also the Bopomofo Extended block
+@ Based on GB 2312
+3105 BOPOMOFO LETTER B
+3106 BOPOMOFO LETTER P
+3107 BOPOMOFO LETTER M
+3108 BOPOMOFO LETTER F
+3109 BOPOMOFO LETTER D
+310A BOPOMOFO LETTER T
+310B BOPOMOFO LETTER N
+310C BOPOMOFO LETTER L
+310D BOPOMOFO LETTER G
+310E BOPOMOFO LETTER K
+310F BOPOMOFO LETTER H
+3110 BOPOMOFO LETTER J
+3111 BOPOMOFO LETTER Q
+3112 BOPOMOFO LETTER X
+3113 BOPOMOFO LETTER ZH
+3114 BOPOMOFO LETTER CH
+3115 BOPOMOFO LETTER SH
+3116 BOPOMOFO LETTER R
+3117 BOPOMOFO LETTER Z
+3118 BOPOMOFO LETTER C
+3119 BOPOMOFO LETTER S
+311A BOPOMOFO LETTER A
+311B BOPOMOFO LETTER O
+311C BOPOMOFO LETTER E
+311D BOPOMOFO LETTER EH
+311E BOPOMOFO LETTER AI
+311F BOPOMOFO LETTER EI
+3120 BOPOMOFO LETTER AU
+3121 BOPOMOFO LETTER OU
+3122 BOPOMOFO LETTER AN
+3123 BOPOMOFO LETTER EN
+3124 BOPOMOFO LETTER ANG
+3125 BOPOMOFO LETTER ENG
+3126 BOPOMOFO LETTER ER
+3127 BOPOMOFO LETTER I
+3128 BOPOMOFO LETTER U
+3129 BOPOMOFO LETTER IU
+@ Dialect (non-Mandarin) letters
+312A BOPOMOFO LETTER V
+312B BOPOMOFO LETTER NG
+312C BOPOMOFO LETTER GN
+@@ 3130 Hangul Compatibility Jamo 318F
+@ Modern letters
+3131 HANGUL LETTER KIYEOK
+ # 1100 hangul choseong kiyeok
+3132 HANGUL LETTER SSANGKIYEOK
+ # 1101 hangul choseong ssangkiyeok
+3133 HANGUL LETTER KIYEOK-SIOS
+ # 11AA hangul jongseong kiyeok-sios
+3134 HANGUL LETTER NIEUN
+ # 1102 hangul choseong nieun
+3135 HANGUL LETTER NIEUN-CIEUC
+ # 11AC hangul jongseong nieun-cieuc
+3136 HANGUL LETTER NIEUN-HIEUH
+ # 11AD hangul jongseong nieun-hieuh
+3137 HANGUL LETTER TIKEUT
+ # 1103 hangul choseong tikeut
+3138 HANGUL LETTER SSANGTIKEUT
+ # 1104 hangul choseong ssangtikeut
+3139 HANGUL LETTER RIEUL
+ # 1105 hangul choseong rieul
+313A HANGUL LETTER RIEUL-KIYEOK
+ # 11B0 hangul jongseong rieul-kiyeok
+313B HANGUL LETTER RIEUL-MIEUM
+ # 11B1 hangul jongseong rieul-mieum
+313C HANGUL LETTER RIEUL-PIEUP
+ # 11B2 hangul jongseong rieul-pieup
+313D HANGUL LETTER RIEUL-SIOS
+ # 11B3 hangul jongseong rieul-sios
+313E HANGUL LETTER RIEUL-THIEUTH
+ # 11B4 hangul jongseong rieul-thieuth
+313F HANGUL LETTER RIEUL-PHIEUPH
+ # 11B5 hangul jongseong rieul-phieuph
+3140 HANGUL LETTER RIEUL-HIEUH
+ # 111A hangul choseong rieul-hieuh
+3141 HANGUL LETTER MIEUM
+ # 1106 hangul choseong mieum
+3142 HANGUL LETTER PIEUP
+ # 1107 hangul choseong pieup
+3143 HANGUL LETTER SSANGPIEUP
+ # 1108 hangul choseong ssangpieup
+3144 HANGUL LETTER PIEUP-SIOS
+ # 1121 hangul choseong pieup-sios
+3145 HANGUL LETTER SIOS
+ # 1109 hangul choseong sios
+3146 HANGUL LETTER SSANGSIOS
+ # 110A hangul choseong ssangsios
+3147 HANGUL LETTER IEUNG
+ # 110B hangul choseong ieung
+3148 HANGUL LETTER CIEUC
+ # 110C hangul choseong cieuc
+3149 HANGUL LETTER SSANGCIEUC
+ # 110D hangul choseong ssangcieuc
+314A HANGUL LETTER CHIEUCH
+ # 110E hangul choseong chieuch
+314B HANGUL LETTER KHIEUKH
+ # 110F hangul choseong khieukh
+314C HANGUL LETTER THIEUTH
+ # 1110 hangul choseong thieuth
+314D HANGUL LETTER PHIEUPH
+ # 1111 hangul choseong phieuph
+314E HANGUL LETTER HIEUH
+ # 1112 hangul choseong hieuh
+314F HANGUL LETTER A
+ # 1161 hangul jungseong a
+3150 HANGUL LETTER AE
+ # 1162 hangul jungseong ae
+3151 HANGUL LETTER YA
+ # 1163 hangul jungseong ya
+3152 HANGUL LETTER YAE
+ # 1164 hangul jungseong yae
+3153 HANGUL LETTER EO
+ # 1165 hangul jungseong eo
+3154 HANGUL LETTER E
+ # 1166 hangul jungseong e
+3155 HANGUL LETTER YEO
+ # 1167 hangul jungseong yeo
+3156 HANGUL LETTER YE
+ # 1168 hangul jungseong ye
+3157 HANGUL LETTER O
+ # 1169 hangul jungseong o
+3158 HANGUL LETTER WA
+ # 116A hangul jungseong wa
+3159 HANGUL LETTER WAE
+ # 116B hangul jungseong wae
+315A HANGUL LETTER OE
+ # 116C hangul jungseong oe
+315B HANGUL LETTER YO
+ # 116D hangul jungseong yo
+315C HANGUL LETTER U
+ # 116E hangul jungseong u
+315D HANGUL LETTER WEO
+ # 116F hangul jungseong weo
+315E HANGUL LETTER WE
+ # 1170 hangul jungseong we
+315F HANGUL LETTER WI
+ # 1171 hangul jungseong wi
+3160 HANGUL LETTER YU
+ # 1172 hangul jungseong yu
+3161 HANGUL LETTER EU
+ # 1173 hangul jungseong eu
+3162 HANGUL LETTER YI
+ # 1174 hangul jungseong yi
+3163 HANGUL LETTER I
+ # 1175 hangul jungseong i
+@ Special character
+3164 HANGUL FILLER
+ = HANGUL CAE OM
+ # 1160 hangul jungseong filler
+@ Archaic letters
+3165 HANGUL LETTER SSANGNIEUN
+ # 1114 hangul choseong ssangnieun
+3166 HANGUL LETTER NIEUN-TIKEUT
+ # 1115 hangul choseong nieun-tikeut
+3167 HANGUL LETTER NIEUN-SIOS
+ # 11C7 hangul jongseong nieun-sios
+3168 HANGUL LETTER NIEUN-PANSIOS
+ # 11C8 hangul jongseong nieun-pansios
+3169 HANGUL LETTER RIEUL-KIYEOK-SIOS
+ # 11CC hangul jongseong rieul-kiyeok-sios
+316A HANGUL LETTER RIEUL-TIKEUT
+ # 11CE hangul jongseong rieul-tikeut
+316B HANGUL LETTER RIEUL-PIEUP-SIOS
+ # 11D3 hangul jongseong rieul-pieup-sios
+316C HANGUL LETTER RIEUL-PANSIOS
+ # 11D7 hangul jongseong rieul-pansios
+316D HANGUL LETTER RIEUL-YEORINHIEUH
+ # 11D9 hangul jongseong rieul-yeorinhieuh
+316E HANGUL LETTER MIEUM-PIEUP
+ # 111C hangul choseong mieum-pieup
+316F HANGUL LETTER MIEUM-SIOS
+ # 11DD hangul jongseong mieum-sios
+3170 HANGUL LETTER MIEUM-PANSIOS
+ # 11DF hangul jongseong mieum-pansios
+3171 HANGUL LETTER KAPYEOUNMIEUM
+ # 111D hangul choseong kapyeounmieum
+3172 HANGUL LETTER PIEUP-KIYEOK
+ # 111E hangul choseong pieup-kiyeok
+3173 HANGUL LETTER PIEUP-TIKEUT
+ # 1120 hangul choseong pieup-tikeut
+3174 HANGUL LETTER PIEUP-SIOS-KIYEOK
+ # 1122 hangul choseong pieup-sios-kiyeok
+3175 HANGUL LETTER PIEUP-SIOS-TIKEUT
+ # 1123 hangul choseong pieup-sios-tikeut
+3176 HANGUL LETTER PIEUP-CIEUC
+ # 1127 hangul choseong pieup-cieuc
+3177 HANGUL LETTER PIEUP-THIEUTH
+ # 1129 hangul choseong pieup-thieuth
+3178 HANGUL LETTER KAPYEOUNPIEUP
+ # 112B hangul choseong kapyeounpieup
+3179 HANGUL LETTER KAPYEOUNSSANGPIEUP
+ # 112C hangul choseong kapyeounssangpieup
+317A HANGUL LETTER SIOS-KIYEOK
+ # 112D hangul choseong sios-kiyeok
+317B HANGUL LETTER SIOS-NIEUN
+ # 112E hangul choseong sios-nieun
+317C HANGUL LETTER SIOS-TIKEUT
+ # 112F hangul choseong sios-tikeut
+317D HANGUL LETTER SIOS-PIEUP
+ # 1132 hangul choseong sios-pieup
+317E HANGUL LETTER SIOS-CIEUC
+ # 1136 hangul choseong sios-cieuc
+317F HANGUL LETTER PANSIOS
+ # 1140 hangul choseong pansios
+3180 HANGUL LETTER SSANGIEUNG
+ # 1147 hangul choseong ssangieung
+3181 HANGUL LETTER YESIEUNG
+ * archaic velar nasal
+ # 114C hangul choseong yesieung
+3182 HANGUL LETTER YESIEUNG-SIOS
+ # 11F1 hangul jongseong yesieung-sios
+3183 HANGUL LETTER YESIEUNG-PANSIOS
+ # 11F2 hangul jongseong yesieung-pansios
+3184 HANGUL LETTER KAPYEOUNPHIEUPH
+ # 1157 hangul choseong kapyeounphieuph
+3185 HANGUL LETTER SSANGHIEUH
+ # 1158 hangul choseong ssanghieuh
+3186 HANGUL LETTER YEORINHIEUH
+ * archaic glottal stop
+ # 1159 hangul choseong yeorinhieuh
+3187 HANGUL LETTER YO-YA
+ # 1184 hangul jungseong yo-ya
+3188 HANGUL LETTER YO-YAE
+ # 1185 hangul jungseong yo-yae
+3189 HANGUL LETTER YO-I
+ # 1188 hangul jungseong yo-i
+318A HANGUL LETTER YU-YEO
+ # 1191 hangul jungseong yu-yeo
+318B HANGUL LETTER YU-YE
+ # 1192 hangul jungseong yu-ye
+318C HANGUL LETTER YU-I
+ # 1194 hangul jungseong yu-i
+318D HANGUL LETTER ARAEA
+ # 119E hangul jungseong araea
+318E HANGUL LETTER ARAEAE
+ # 11A1 hangul jungseong araea-i
+@@ 3190 Kanbun 319F
+@ Kanbun
+3190 IDEOGRAPHIC ANNOTATION LINKING MARK (Kanbun Tateten)
+ = KANBUN TATETEN
+3191 IDEOGRAPHIC ANNOTATION REVERSE MARK (Kaeriten)
+ = KAERITEN RE
+3192 IDEOGRAPHIC ANNOTATION ONE MARK (Kaeriten)
+ # <super> 4E00
+3193 IDEOGRAPHIC ANNOTATION TWO MARK (Kaeriten)
+ # <super> 4E8C
+3194 IDEOGRAPHIC ANNOTATION THREE MARK (Kaeriten)
+ # <super> 4E09
+3195 IDEOGRAPHIC ANNOTATION FOUR MARK (Kaeriten)
+ # <super> 56DB
+3196 IDEOGRAPHIC ANNOTATION TOP MARK (Kaeriten)
+ # <super> 4E0A
+3197 IDEOGRAPHIC ANNOTATION MIDDLE MARK (Kaeriten)
+ # <super> 4E2D
+3198 IDEOGRAPHIC ANNOTATION BOTTOM MARK (Kaeriten)
+ # <super> 4E0B
+3199 IDEOGRAPHIC ANNOTATION FIRST MARK (Kaeriten)
+ # <super> 7532
+319A IDEOGRAPHIC ANNOTATION SECOND MARK (Kaeriten)
+ # <super> 4E59
+319B IDEOGRAPHIC ANNOTATION THIRD MARK (Kaeriten)
+ # <super> 4E19
+319C IDEOGRAPHIC ANNOTATION FOURTH MARK (Kaeriten)
+ # <super> 4E01
+319D IDEOGRAPHIC ANNOTATION HEAVEN MARK (Kaeriten)
+ # <super> 5929
+319E IDEOGRAPHIC ANNOTATION EARTH MARK (Kaeriten)
+ # <super> 5730
+319F IDEOGRAPHIC ANNOTATION MAN MARK (Kaeriten)
+ # <super> 4EBA
+@@ 31A0 Bopomofo Extended 31BF
+@+ See also the Bopomofo block
+@ Extended Bopomofo for Minnan and Hakka
+31A0 BOPOMOFO LETTER BU
+31A1 BOPOMOFO LETTER ZI
+31A2 BOPOMOFO LETTER JI
+31A3 BOPOMOFO LETTER GU
+31A4 BOPOMOFO LETTER EE
+31A5 BOPOMOFO LETTER ENN
+31A6 BOPOMOFO LETTER OO
+31A7 BOPOMOFO LETTER ONN
+31A8 BOPOMOFO LETTER IR
+31A9 BOPOMOFO LETTER ANN
+31AA BOPOMOFO LETTER INN
+31AB BOPOMOFO LETTER UNN
+31AC BOPOMOFO LETTER IM
+31AD BOPOMOFO LETTER NGG
+31AE BOPOMOFO LETTER AINN
+31AF BOPOMOFO LETTER AUNN
+31B0 BOPOMOFO LETTER AM
+31B1 BOPOMOFO LETTER OM
+31B2 BOPOMOFO LETTER ONG
+31B3 BOPOMOFO LETTER INNN
+31B4 BOPOMOFO FINAL LETTER P
+31B5 BOPOMOFO FINAL LETTER T
+31B6 BOPOMOFO FINAL LETTER K
+31B7 BOPOMOFO FINAL LETTER H
+@@ 3200 Enclosed CJK Letters and Months 32FF
+@ Parenthesized Hangul elements
+3200 PARENTHESIZED HANGUL KIYEOK
+ # 0028 1100 0029
+3201 PARENTHESIZED HANGUL NIEUN
+ # 0028 1102 0029
+3202 PARENTHESIZED HANGUL TIKEUT
+ # 0028 1103 0029
+3203 PARENTHESIZED HANGUL RIEUL
+ # 0028 1105 0029
+3204 PARENTHESIZED HANGUL MIEUM
+ # 0028 1106 0029
+3205 PARENTHESIZED HANGUL PIEUP
+ # 0028 1107 0029
+3206 PARENTHESIZED HANGUL SIOS
+ # 0028 1109 0029
+3207 PARENTHESIZED HANGUL IEUNG
+ # 0028 110B 0029
+3208 PARENTHESIZED HANGUL CIEUC
+ # 0028 110C 0029
+3209 PARENTHESIZED HANGUL CHIEUCH
+ # 0028 110E 0029
+320A PARENTHESIZED HANGUL KHIEUKH
+ # 0028 110F 0029
+320B PARENTHESIZED HANGUL THIEUTH
+ # 0028 1110 0029
+320C PARENTHESIZED HANGUL PHIEUPH
+ # 0028 1111 0029
+320D PARENTHESIZED HANGUL HIEUH
+ # 0028 1112 0029
+@ Parenthesized Hangul syllables
+320E PARENTHESIZED HANGUL KIYEOK A
+ # 0028 1100 1161 0029
+320F PARENTHESIZED HANGUL NIEUN A
+ # 0028 1102 1161 0029
+3210 PARENTHESIZED HANGUL TIKEUT A
+ # 0028 1103 1161 0029
+3211 PARENTHESIZED HANGUL RIEUL A
+ # 0028 1105 1161 0029
+3212 PARENTHESIZED HANGUL MIEUM A
+ # 0028 1106 1161 0029
+3213 PARENTHESIZED HANGUL PIEUP A
+ # 0028 1107 1161 0029
+3214 PARENTHESIZED HANGUL SIOS A
+ # 0028 1109 1161 0029
+3215 PARENTHESIZED HANGUL IEUNG A
+ # 0028 110B 1161 0029
+3216 PARENTHESIZED HANGUL CIEUC A
+ # 0028 110C 1161 0029
+3217 PARENTHESIZED HANGUL CHIEUCH A
+ # 0028 110E 1161 0029
+3218 PARENTHESIZED HANGUL KHIEUKH A
+ # 0028 110F 1161 0029
+3219 PARENTHESIZED HANGUL THIEUTH A
+ # 0028 1110 1161 0029
+321A PARENTHESIZED HANGUL PHIEUPH A
+ # 0028 1111 1161 0029
+321B PARENTHESIZED HANGUL HIEUH A
+ # 0028 1112 1161 0029
+321C PARENTHESIZED HANGUL CIEUC U
+ # 0028 110C 116E 0029
+@ Parenthesized ideographs
+3220 PARENTHESIZED IDEOGRAPH ONE
+ # 0028 4E00 0029
+3221 PARENTHESIZED IDEOGRAPH TWO
+ # 0028 4E8C 0029
+3222 PARENTHESIZED IDEOGRAPH THREE
+ # 0028 4E09 0029
+3223 PARENTHESIZED IDEOGRAPH FOUR
+ # 0028 56DB 0029
+3224 PARENTHESIZED IDEOGRAPH FIVE
+ # 0028 4E94 0029
+3225 PARENTHESIZED IDEOGRAPH SIX
+ # 0028 516D 0029
+3226 PARENTHESIZED IDEOGRAPH SEVEN
+ # 0028 4E03 0029
+3227 PARENTHESIZED IDEOGRAPH EIGHT
+ # 0028 516B 0029
+3228 PARENTHESIZED IDEOGRAPH NINE
+ # 0028 4E5D 0029
+3229 PARENTHESIZED IDEOGRAPH TEN
+ # 0028 5341 0029
+322A PARENTHESIZED IDEOGRAPH MOON
+ * Monday
+ # 0028 6708 0029
+322B PARENTHESIZED IDEOGRAPH FIRE
+ * Tuesday
+ # 0028 706B 0029
+322C PARENTHESIZED IDEOGRAPH WATER
+ * Wednesday
+ # 0028 6C34 0029
+322D PARENTHESIZED IDEOGRAPH WOOD
+ * Thursday
+ # 0028 6728 0029
+322E PARENTHESIZED IDEOGRAPH METAL
+ * Friday
+ # 0028 91D1 0029
+322F PARENTHESIZED IDEOGRAPH EARTH
+ * Saturday
+ # 0028 571F 0029
+3230 PARENTHESIZED IDEOGRAPH SUN
+ * Sunday
+ # 0028 65E5 0029
+3231 PARENTHESIZED IDEOGRAPH STOCK
+ * incorporated
+ # 0028 682A 0029
+3232 PARENTHESIZED IDEOGRAPH HAVE
+ * limited
+ # 0028 6709 0029
+3233 PARENTHESIZED IDEOGRAPH SOCIETY
+ * company
+ # 0028 793E 0029
+3234 PARENTHESIZED IDEOGRAPH NAME
+ # 0028 540D 0029
+3235 PARENTHESIZED IDEOGRAPH SPECIAL
+ # 0028 7279 0029
+3236 PARENTHESIZED IDEOGRAPH FINANCIAL
+ # 0028 8CA1 0029
+3237 PARENTHESIZED IDEOGRAPH CONGRATULATION
+ # 0028 795D 0029
+3238 PARENTHESIZED IDEOGRAPH LABOR
+ # 0028 52B4 0029
+3239 PARENTHESIZED IDEOGRAPH REPRESENT
+ # 0028 4EE3 0029
+323A PARENTHESIZED IDEOGRAPH CALL
+ # 0028 547C 0029
+323B PARENTHESIZED IDEOGRAPH STUDY
+ # 0028 5B66 0029
+323C PARENTHESIZED IDEOGRAPH SUPERVISE
+ # 0028 76E3 0029
+323D PARENTHESIZED IDEOGRAPH ENTERPRISE
+ # 0028 4F01 0029
+323E PARENTHESIZED IDEOGRAPH RESOURCE
+ # 0028 8CC7 0029
+323F PARENTHESIZED IDEOGRAPH ALLIANCE
+ # 0028 5354 0029
+3240 PARENTHESIZED IDEOGRAPH FESTIVAL
+ # 0028 796D 0029
+3241 PARENTHESIZED IDEOGRAPH REST
+ # 0028 4F11 0029
+3242 PARENTHESIZED IDEOGRAPH SELF
+ * from
+ # 0028 81EA 0029
+3243 PARENTHESIZED IDEOGRAPH REACH
+ * to
+ # 0028 81F3 0029
+@ Circled Hangul elements
+3260 CIRCLED HANGUL KIYEOK
+ # <circle> 1100
+3261 CIRCLED HANGUL NIEUN
+ # <circle> 1102
+3262 CIRCLED HANGUL TIKEUT
+ # <circle> 1103
+3263 CIRCLED HANGUL RIEUL
+ # <circle> 1105
+3264 CIRCLED HANGUL MIEUM
+ # <circle> 1106
+3265 CIRCLED HANGUL PIEUP
+ # <circle> 1107
+3266 CIRCLED HANGUL SIOS
+ # <circle> 1109
+3267 CIRCLED HANGUL IEUNG
+ # <circle> 110B
+3268 CIRCLED HANGUL CIEUC
+ # <circle> 110C
+3269 CIRCLED HANGUL CHIEUCH
+ # <circle> 110E
+326A CIRCLED HANGUL KHIEUKH
+ # <circle> 110F
+326B CIRCLED HANGUL THIEUTH
+ # <circle> 1110
+326C CIRCLED HANGUL PHIEUPH
+ # <circle> 1111
+326D CIRCLED HANGUL HIEUH
+ # <circle> 1112
+@ Circled Hangul syllables
+326E CIRCLED HANGUL KIYEOK A
+ # <circle> 1100 1161
+326F CIRCLED HANGUL NIEUN A
+ # <circle> 1102 1161
+3270 CIRCLED HANGUL TIKEUT A
+ # <circle> 1103 1161
+3271 CIRCLED HANGUL RIEUL A
+ # <circle> 1105 1161
+3272 CIRCLED HANGUL MIEUM A
+ # <circle> 1106 1161
+3273 CIRCLED HANGUL PIEUP A
+ # <circle> 1107 1161
+3274 CIRCLED HANGUL SIOS A
+ # <circle> 1109 1161
+3275 CIRCLED HANGUL IEUNG A
+ # <circle> 110B 1161
+3276 CIRCLED HANGUL CIEUC A
+ # <circle> 110C 1161
+3277 CIRCLED HANGUL CHIEUCH A
+ # <circle> 110E 1161
+3278 CIRCLED HANGUL KHIEUKH A
+ # <circle> 110F 1161
+3279 CIRCLED HANGUL THIEUTH A
+ # <circle> 1110 1161
+327A CIRCLED HANGUL PHIEUPH A
+ # <circle> 1111 1161
+327B CIRCLED HANGUL HIEUH A
+ # <circle> 1112 1161
+@ Symbol
+327F KOREAN STANDARD SYMBOL
+@ Circled ideographs
+3280 CIRCLED IDEOGRAPH ONE
+ = maru-iti, symbol of unification
+ # <circle> 4E00
+3281 CIRCLED IDEOGRAPH TWO
+ # <circle> 4E8C
+3282 CIRCLED IDEOGRAPH THREE
+ # <circle> 4E09
+3283 CIRCLED IDEOGRAPH FOUR
+ # <circle> 56DB
+3284 CIRCLED IDEOGRAPH FIVE
+ # <circle> 4E94
+3285 CIRCLED IDEOGRAPH SIX
+ # <circle> 516D
+3286 CIRCLED IDEOGRAPH SEVEN
+ # <circle> 4E03
+3287 CIRCLED IDEOGRAPH EIGHT
+ # <circle> 516B
+3288 CIRCLED IDEOGRAPH NINE
+ # <circle> 4E5D
+3289 CIRCLED IDEOGRAPH TEN
+ # <circle> 5341
+328A CIRCLED IDEOGRAPH MOON
+ * Monday
+ # <circle> 6708
+328B CIRCLED IDEOGRAPH FIRE
+ * Tuesday
+ # <circle> 706B
+328C CIRCLED IDEOGRAPH WATER
+ * Wednesday
+ # <circle> 6C34
+328D CIRCLED IDEOGRAPH WOOD
+ * Thursday
+ # <circle> 6728
+328E CIRCLED IDEOGRAPH METAL
+ * Friday
+ # <circle> 91D1
+328F CIRCLED IDEOGRAPH EARTH
+ * Saturday
+ # <circle> 571F
+3290 CIRCLED IDEOGRAPH SUN
+ * Sunday
+ # <circle> 65E5
+3291 CIRCLED IDEOGRAPH STOCK
+ * incorporated
+ # <circle> 682A
+3292 CIRCLED IDEOGRAPH HAVE
+ * limited
+ # <circle> 6709
+3293 CIRCLED IDEOGRAPH SOCIETY
+ * company
+ # <circle> 793E
+3294 CIRCLED IDEOGRAPH NAME
+ # <circle> 540D
+3295 CIRCLED IDEOGRAPH SPECIAL
+ # <circle> 7279
+3296 CIRCLED IDEOGRAPH FINANCIAL
+ # <circle> 8CA1
+3297 CIRCLED IDEOGRAPH CONGRATULATION
+ # <circle> 795D
+3298 CIRCLED IDEOGRAPH LABOR
+ # <circle> 52B4
+3299 CIRCLED IDEOGRAPH SECRET
+ # <circle> 79D8
+329A CIRCLED IDEOGRAPH MALE
+ # <circle> 7537
+329B CIRCLED IDEOGRAPH FEMALE
+ # <circle> 5973
+329C CIRCLED IDEOGRAPH SUITABLE
+ # <circle> 9069
+329D CIRCLED IDEOGRAPH EXCELLENT
+ # <circle> 512A
+329E CIRCLED IDEOGRAPH PRINT
+ * name seal
+ # <circle> 5370
+329F CIRCLED IDEOGRAPH ATTENTION
+ # <circle> 6CE8
+32A0 CIRCLED IDEOGRAPH ITEM
+ # <circle> 9805
+32A1 CIRCLED IDEOGRAPH REST
+ * holiday
+ # <circle> 4F11
+32A2 CIRCLED IDEOGRAPH COPY
+ # <circle> 5199
+32A3 CIRCLED IDEOGRAPH CORRECT
+ # <circle> 6B63
+32A4 CIRCLED IDEOGRAPH HIGH
+ # <circle> 4E0A
+32A5 CIRCLED IDEOGRAPH CENTRE
+ # <circle> 4E2D
+32A6 CIRCLED IDEOGRAPH LOW
+ # <circle> 4E0B
+32A7 CIRCLED IDEOGRAPH LEFT
+ # <circle> 5DE6
+32A8 CIRCLED IDEOGRAPH RIGHT
+ # <circle> 53F3
+32A9 CIRCLED IDEOGRAPH MEDICINE
+ # <circle> 533B
+32AA CIRCLED IDEOGRAPH RELIGION
+ # <circle> 5B97
+32AB CIRCLED IDEOGRAPH STUDY
+ # <circle> 5B66
+32AC CIRCLED IDEOGRAPH SUPERVISE
+ # <circle> 76E3
+32AD CIRCLED IDEOGRAPH ENTERPRISE
+ # <circle> 4F01
+32AE CIRCLED IDEOGRAPH RESOURCE
+ # <circle> 8CC7
+32AF CIRCLED IDEOGRAPH ALLIANCE
+ # <circle> 5354
+32B0 CIRCLED IDEOGRAPH NIGHT
+ # <circle> 591C
+@ Telegraph symbols for months
+32C0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
+ # 0031 6708
+32C1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
+ # 0032 6708
+32C2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
+ # 0033 6708
+32C3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
+ # 0034 6708
+32C4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
+ # 0035 6708
+32C5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
+ # 0036 6708
+32C6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
+ # 0037 6708
+32C7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
+ # 0038 6708
+32C8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
+ # 0039 6708
+32C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
+ # 0031 0030 6708
+32CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
+ # 0031 0031 6708
+32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+ # 0031 0032 6708
+@ Circled Katakana
+32D0 CIRCLED KATAKANA A
+ # <circle> 30A2
+32D1 CIRCLED KATAKANA I
+ # <circle> 30A4
+32D2 CIRCLED KATAKANA U
+ # <circle> 30A6
+32D3 CIRCLED KATAKANA E
+ # <circle> 30A8
+32D4 CIRCLED KATAKANA O
+ # <circle> 30AA
+32D5 CIRCLED KATAKANA KA
+ # <circle> 30AB
+32D6 CIRCLED KATAKANA KI
+ # <circle> 30AD
+32D7 CIRCLED KATAKANA KU
+ # <circle> 30AF
+32D8 CIRCLED KATAKANA KE
+ # <circle> 30B1
+32D9 CIRCLED KATAKANA KO
+ # <circle> 30B3
+32DA CIRCLED KATAKANA SA
+ # <circle> 30B5
+32DB CIRCLED KATAKANA SI
+ # <circle> 30B7
+32DC CIRCLED KATAKANA SU
+ # <circle> 30B9
+32DD CIRCLED KATAKANA SE
+ # <circle> 30BB
+32DE CIRCLED KATAKANA SO
+ # <circle> 30BD
+32DF CIRCLED KATAKANA TA
+ # <circle> 30BF
+32E0 CIRCLED KATAKANA TI
+ # <circle> 30C1
+32E1 CIRCLED KATAKANA TU
+ # <circle> 30C4
+32E2 CIRCLED KATAKANA TE
+ # <circle> 30C6
+32E3 CIRCLED KATAKANA TO
+ # <circle> 30C8
+32E4 CIRCLED KATAKANA NA
+ # <circle> 30CA
+32E5 CIRCLED KATAKANA NI
+ # <circle> 30CB
+32E6 CIRCLED KATAKANA NU
+ # <circle> 30CC
+32E7 CIRCLED KATAKANA NE
+ # <circle> 30CD
+32E8 CIRCLED KATAKANA NO
+ # <circle> 30CE
+32E9 CIRCLED KATAKANA HA
+ # <circle> 30CF
+32EA CIRCLED KATAKANA HI
+ # <circle> 30D2
+32EB CIRCLED KATAKANA HU
+ # <circle> 30D5
+32EC CIRCLED KATAKANA HE
+ # <circle> 30D8
+32ED CIRCLED KATAKANA HO
+ # <circle> 30DB
+32EE CIRCLED KATAKANA MA
+ # <circle> 30DE
+32EF CIRCLED KATAKANA MI
+ # <circle> 30DF
+32F0 CIRCLED KATAKANA MU
+ # <circle> 30E0
+32F1 CIRCLED KATAKANA ME
+ # <circle> 30E1
+32F2 CIRCLED KATAKANA MO
+ # <circle> 30E2
+32F3 CIRCLED KATAKANA YA
+ # <circle> 30E4
+32F4 CIRCLED KATAKANA YU
+ # <circle> 30E6
+32F5 CIRCLED KATAKANA YO
+ # <circle> 30E8
+32F6 CIRCLED KATAKANA RA
+ # <circle> 30E9
+32F7 CIRCLED KATAKANA RI
+ # <circle> 30EA
+32F8 CIRCLED KATAKANA RU
+ # <circle> 30EB
+32F9 CIRCLED KATAKANA RE
+ # <circle> 30EC
+32FA CIRCLED KATAKANA RO
+ # <circle> 30ED
+32FB CIRCLED KATAKANA WA
+ # <circle> 30EF
+32FC CIRCLED KATAKANA WI
+ # <circle> 30F0
+32FD CIRCLED KATAKANA WE
+ # <circle> 30F1
+32FE CIRCLED KATAKANA WO
+ # <circle> 30F2
+@@ 3300 CJK Compatibility 33FF
+@ Squared Katakana words
+3300 SQUARE APAATO
+ * apartment
+ # <square> 30A2 30D1 30FC 30C8
+3301 SQUARE ARUHUA
+ * alpha
+ # <square> 30A2 30EB 30D5 30A1
+3302 SQUARE ANPEA
+ * ampere
+ # <square> 30A2 30F3 30DA 30A2
+3303 SQUARE AARU
+ * are (unit of area)
+ # <square> 30A2 30FC 30EB
+3304 SQUARE ININGU
+ * inning
+ # <square> 30A4 30CB 30F3 30B0
+3305 SQUARE INTI
+ * inch
+ # <square> 30A4 30F3 30C1
+3306 SQUARE UON
+ * won (Korean currency)
+ # <square> 30A6 30A9 30F3
+3307 SQUARE ESUKUUDO
+ * escudo (Portuguese currency)
+ # <square> 30A8 30B9 30AF 30FC 30C9
+3308 SQUARE EEKAA
+ * acre
+ # <square> 30A8 30FC 30AB 30FC
+3309 SQUARE ONSU
+ * ounce
+ # <square> 30AA 30F3 30B9
+330A SQUARE OOMU
+ * ohm
+ # <square> 30AA 30FC 30E0
+330B SQUARE KAIRI
+ * kai-ri: nautical mile
+ # <square> 30AB 30A4 30EA
+330C SQUARE KARATTO
+ * carat
+ # <square> 30AB 30E9 30C3 30C8
+330D SQUARE KARORII
+ * calorie
+ # <square> 30AB 30ED 30EA 30FC
+330E SQUARE GARON
+ * gallon
+ # <square> 30AC 30ED 30F3
+330F SQUARE GANMA
+ * gamma
+ # <square> 30AC 30F3 30DE
+3310 SQUARE GIGA
+ * giga-
+ # <square> 30AE 30AC
+3311 SQUARE GINII
+ * guinea
+ # <square> 30AE 30CB 30FC
+3312 SQUARE KYURII
+ * curie
+ # <square> 30AD 30E5 30EA 30FC
+3313 SQUARE GIRUDAA
+ * guilder
+ # <square> 30AE 30EB 30C0 30FC
+3314 SQUARE KIRO
+ * kilo-
+ # <square> 30AD 30ED
+3315 SQUARE KIROGURAMU
+ * kilogram
+ # <square> 30AD 30ED 30B0 30E9 30E0
+3316 SQUARE KIROMEETORU
+ * kilometer
+ # <square> 30AD 30ED 30E1 30FC 30C8 30EB
+3317 SQUARE KIROWATTO
+ * kilowatt
+ # <square> 30AD 30ED 30EF 30C3 30C8
+3318 SQUARE GURAMU
+ * gram
+ # <square> 30B0 30E9 30E0
+3319 SQUARE GURAMUTON
+ * gram ton
+ # <square> 30B0 30E9 30E0 30C8 30F3
+331A SQUARE KURUZEIRO
+ * cruzeiro (Brazilian currency)
+ # <square> 30AF 30EB 30BC 30A4 30ED
+331B SQUARE KUROONE
+ * krone
+ # <square> 30AF 30ED 30FC 30CD
+331C SQUARE KEESU
+ * case
+ # <square> 30B1 30FC 30B9
+331D SQUARE KORUNA
+ * koruna (Czech currency)
+ # <square> 30B3 30EB 30CA
+331E SQUARE KOOPO
+ * co-op
+ # <square> 30B3 30FC 30DD
+331F SQUARE SAIKURU
+ * cycle
+ # <square> 30B5 30A4 30AF 30EB
+3320 SQUARE SANTIIMU
+ * centime
+ # <square> 30B5 30F3 30C1 30FC 30E0
+3321 SQUARE SIRINGU
+ * shilling
+ # <square> 30B7 30EA 30F3 30B0
+3322 SQUARE SENTI
+ * centi-
+ # <square> 30BB 30F3 30C1
+3323 SQUARE SENTO
+ * cent
+ # <square> 30BB 30F3 30C8
+3324 SQUARE DAASU
+ * dozen
+ # <square> 30C0 30FC 30B9
+3325 SQUARE DESI
+ * deci-
+ # <square> 30C7 30B7
+3326 SQUARE DORU
+ * dollar
+ # <square> 30C9 30EB
+3327 SQUARE TON
+ * ton
+ # <square> 30C8 30F3
+3328 SQUARE NANO
+ * nano-
+ # <square> 30CA 30CE
+3329 SQUARE NOTTO
+ * knot, nautical mile
+ # <square> 30CE 30C3 30C8
+332A SQUARE HAITU
+ * heights
+ # <square> 30CF 30A4 30C4
+332B SQUARE PAASENTO
+ * percent
+ # <square> 30D1 30FC 30BB 30F3 30C8
+332C SQUARE PAATU
+ * parts
+ # <square> 30D1 30FC 30C4
+332D SQUARE BAARERU
+ * barrel
+ # <square> 30D0 30FC 30EC 30EB
+332E SQUARE PIASUTORU
+ * piaster
+ # <square> 30D4 30A2 30B9 30C8 30EB
+332F SQUARE PIKURU
+ * picul (unit of weight)
+ # <square> 30D4 30AF 30EB
+3330 SQUARE PIKO
+ * pico-
+ # <square> 30D4 30B3
+3331 SQUARE BIRU
+ * building
+ # <square> 30D3 30EB
+3332 SQUARE HUARADDO
+ * farad
+ # <square> 30D5 30A1 30E9 30C3 30C9
+3333 SQUARE HUIITO
+ * feet
+ # <square> 30D5 30A3 30FC 30C8
+3334 SQUARE BUSSYERU
+ * bushel
+ # <square> 30D6 30C3 30B7 30A7 30EB
+3335 SQUARE HURAN
+ * franc
+ # <square> 30D5 30E9 30F3
+3336 SQUARE HEKUTAARU
+ * hectare
+ # <square> 30D8 30AF 30BF 30FC 30EB
+3337 SQUARE PESO
+ * peso
+ # <square> 30DA 30BD
+3338 SQUARE PENIHI
+ * pfennig
+ # <square> 30DA 30CB 30D2
+3339 SQUARE HERUTU
+ * hertz
+ # <square> 30D8 30EB 30C4
+333A SQUARE PENSU
+ * pence
+ # <square> 30DA 30F3 30B9
+333B SQUARE PEEZI
+ * page
+ # <square> 30DA 30FC 30B8
+333C SQUARE BEETA
+ * beta
+ # <square> 30D9 30FC 30BF
+333D SQUARE POINTO
+ * point
+ # <square> 30DD 30A4 30F3 30C8
+333E SQUARE BORUTO
+ * volt, bolt
+ # <square> 30DC 30EB 30C8
+333F SQUARE HON
+ * hon: volume
+ # <square> 30DB 30F3
+3340 SQUARE PONDO
+ * pound
+ # <square> 30DD 30F3 30C9
+3341 SQUARE HOORU
+ * hall
+ # <square> 30DB 30FC 30EB
+3342 SQUARE HOON
+ * horn
+ # <square> 30DB 30FC 30F3
+3343 SQUARE MAIKURO
+ * micro-
+ # <square> 30DE 30A4 30AF 30ED
+3344 SQUARE MAIRU
+ * mile
+ # <square> 30DE 30A4 30EB
+3345 SQUARE MAHHA
+ * mach
+ # <square> 30DE 30C3 30CF
+3346 SQUARE MARUKU
+ * mark
+ # <square> 30DE 30EB 30AF
+3347 SQUARE MANSYON
+ * mansion (i.e. better quality apartment)
+ # <square> 30DE 30F3 30B7 30E7 30F3
+3348 SQUARE MIKURON
+ * micron
+ # <square> 30DF 30AF 30ED 30F3
+3349 SQUARE MIRI
+ * milli-
+ # <square> 30DF 30EA
+334A SQUARE MIRIBAARU
+ * millibar
+ # <square> 30DF 30EA 30D0 30FC 30EB
+334B SQUARE MEGA
+ * mega-
+ # <square> 30E1 30AC
+334C SQUARE MEGATON
+ * megaton
+ # <square> 30E1 30AC 30C8 30F3
+334D SQUARE MEETORU
+ * meter
+ # <square> 30E1 30FC 30C8 30EB
+334E SQUARE YAADO
+ * yard
+ # <square> 30E4 30FC 30C9
+334F SQUARE YAARU
+ * yard
+ # <square> 30E4 30FC 30EB
+3350 SQUARE YUAN
+ * yuan (Chinese currency)
+ # <square> 30E6 30A2 30F3
+3351 SQUARE RITTORU
+ * liter
+ # <square> 30EA 30C3 30C8 30EB
+3352 SQUARE RIRA
+ * lira
+ # <square> 30EA 30E9
+3353 SQUARE RUPII
+ * rupee
+ # <square> 30EB 30D4 30FC
+3354 SQUARE RUUBURU
+ * ruble
+ # <square> 30EB 30FC 30D6 30EB
+3355 SQUARE REMU
+ * rem (unit of radiation)
+ # <square> 30EC 30E0
+3356 SQUARE RENTOGEN
+ * roentgen
+ # <square> 30EC 30F3 30C8 30B2 30F3
+3357 SQUARE WATTO
+ * watt
+ # <square> 30EF 30C3 30C8
+@ Telegraph symbols for hours
+3358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
+ # 0030 70B9
+3359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
+ # 0031 70B9
+335A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
+ # 0032 70B9
+335B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
+ # 0033 70B9
+335C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
+ # 0034 70B9
+335D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
+ # 0035 70B9
+335E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
+ # 0036 70B9
+335F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
+ # 0037 70B9
+3360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
+ # 0038 70B9
+3361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
+ # 0039 70B9
+3362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
+ # 0031 0030 70B9
+3363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
+ # 0031 0031 70B9
+3364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
+ # 0031 0032 70B9
+3365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
+ # 0031 0033 70B9
+3366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
+ # 0031 0034 70B9
+3367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
+ # 0031 0035 70B9
+3368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
+ # 0031 0036 70B9
+3369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
+ # 0031 0037 70B9
+336A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
+ # 0031 0038 70B9
+336B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
+ # 0031 0039 70B9
+336C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
+ # 0032 0030 70B9
+336D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
+ # 0032 0031 70B9
+336E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
+ # 0032 0032 70B9
+336F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
+ # 0032 0033 70B9
+3370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+ # 0032 0034 70B9
+@ Squared Latin abbreviations
+3371 SQUARE HPA
+ # <square> 0068 0050 0061
+3372 SQUARE DA
+ # <square> 0064 0061
+3373 SQUARE AU
+ # <square> 0041 0055
+3374 SQUARE BAR
+ # <square> 0062 0061 0072
+3375 SQUARE OV
+ # <square> 006F 0056
+3376 SQUARE PC
+ # <square> 0070 0063
+@ Japanese era names
+337B SQUARE ERA NAME HEISEI
+ # <square> 5E73 6210
+337C SQUARE ERA NAME SYOUWA
+ # <square> 662D 548C
+337D SQUARE ERA NAME TAISYOU
+ # <square> 5927 6B63
+337E SQUARE ERA NAME MEIZI
+ # <square> 660E 6CBB
+@ Japanese corporation
+337F SQUARE CORPORATION
+ = kabusiki-gaisya
+ * incorporated
+ # <square> 682A 5F0F 4F1A 793E
+@ Squared Latin abbreviations
+3380 SQUARE PA AMPS
+ # <square> 0070 0041
+3381 SQUARE NA
+ # <square> 006E 0041
+3382 SQUARE MU A
+ # <square> 03BC 0041
+3383 SQUARE MA
+ # <square> 006D 0041
+3384 SQUARE KA
+ # <square> 006B 0041
+3385 SQUARE KB
+ # <square> 004B 0042
+3386 SQUARE MB
+ # <square> 004D 0042
+3387 SQUARE GB
+ # <square> 0047 0042
+3388 SQUARE CAL
+ # <square> 0063 0061 006C
+3389 SQUARE KCAL
+ # <square> 006B 0063 0061 006C
+338A SQUARE PF
+ # <square> 0070 0046
+338B SQUARE NF
+ # <square> 006E 0046
+338C SQUARE MU F
+ # <square> 03BC 0046
+338D SQUARE MU G
+ # <square> 03BC 0067
+338E SQUARE MG
+ # <square> 006D 0067
+338F SQUARE KG
+ # <square> 006B 0067
+3390 SQUARE HZ
+ # <square> 0048 007A
+3391 SQUARE KHZ
+ # <square> 006B 0048 007A
+3392 SQUARE MHZ
+ # <square> 004D 0048 007A
+3393 SQUARE GHZ
+ # <square> 0047 0048 007A
+3394 SQUARE THZ
+ # <square> 0054 0048 007A
+3395 SQUARE MU L
+ # <square> 03BC 2113
+3396 SQUARE ML
+ # <square> 006D 2113
+3397 SQUARE DL
+ # <square> 0064 2113
+3398 SQUARE KL
+ # <square> 006B 2113
+3399 SQUARE FM
+ # <square> 0066 006D
+339A SQUARE NM
+ # <square> 006E 006D
+339B SQUARE MU M
+ # <square> 03BC 006D
+339C SQUARE MM
+ # <square> 006D 006D
+339D SQUARE CM
+ # <square> 0063 006D
+339E SQUARE KM
+ # <square> 006B 006D
+339F SQUARE MM SQUARED
+ # <square> 006D 006D 00B2
+33A0 SQUARE CM SQUARED
+ # <square> 0063 006D 00B2
+33A1 SQUARE M SQUARED
+ # <square> 006D 00B2
+33A2 SQUARE KM SQUARED
+ # <square> 006B 006D 00B2
+33A3 SQUARE MM CUBED
+ # <square> 006D 006D 00B3
+33A4 SQUARE CM CUBED
+ # <square> 0063 006D 00B3
+33A5 SQUARE M CUBED
+ # <square> 006D 00B3
+33A6 SQUARE KM CUBED
+ # <square> 006B 006D 00B3
+33A7 SQUARE M OVER S
+ # <square> 006D 2215 0073
+33A8 SQUARE M OVER S SQUARED
+ # <square> 006D 2215 0073 00B2
+33A9 SQUARE PA
+ # <square> 0050 0061
+33AA SQUARE KPA
+ # <square> 006B 0050 0061
+33AB SQUARE MPA
+ # <square> 004D 0050 0061
+33AC SQUARE GPA
+ # <square> 0047 0050 0061
+33AD SQUARE RAD
+ # <square> 0072 0061 0064
+33AE SQUARE RAD OVER S
+ # <square> 0072 0061 0064 2215 0073
+33AF SQUARE RAD OVER S SQUARED
+ # <square> 0072 0061 0064 2215 0073 00B2
+33B0 SQUARE PS
+ # <square> 0070 0073
+33B1 SQUARE NS
+ # <square> 006E 0073
+33B2 SQUARE MU S
+ # <square> 03BC 0073
+33B3 SQUARE MS
+ # <square> 006D 0073
+33B4 SQUARE PV
+ # <square> 0070 0056
+33B5 SQUARE NV
+ # <square> 006E 0056
+33B6 SQUARE MU V
+ # <square> 03BC 0056
+33B7 SQUARE MV
+ # <square> 006D 0056
+33B8 SQUARE KV
+ # <square> 006B 0056
+33B9 SQUARE MV MEGA
+ # <square> 004D 0056
+33BA SQUARE PW
+ # <square> 0070 0057
+33BB SQUARE NW
+ # <square> 006E 0057
+33BC SQUARE MU W
+ # <square> 03BC 0057
+33BD SQUARE MW
+ # <square> 006D 0057
+33BE SQUARE KW
+ # <square> 006B 0057
+33BF SQUARE MW MEGA
+ # <square> 004D 0057
+33C0 SQUARE K OHM
+ # <square> 006B 03A9
+33C1 SQUARE M OHM
+ # <square> 004D 03A9
+33C2 SQUARE AM
+ # <square> 0061 002E 006D 002E
+33C3 SQUARE BQ
+ # <square> 0042 0071
+33C4 SQUARE CC
+ # <square> 0063 0063
+33C5 SQUARE CD
+ # <square> 0063 0064
+33C6 SQUARE C OVER KG
+ # <square> 0043 2215 006B 0067
+33C7 SQUARE CO
+ # <square> 0043 006F 002E
+33C8 SQUARE DB
+ # <square> 0064 0042
+33C9 SQUARE GY
+ # <square> 0047 0079
+33CA SQUARE HA
+ # <square> 0068 0061
+33CB SQUARE HP
+ # <square> 0048 0050
+33CC SQUARE IN
+ # <square> 0069 006E
+33CD SQUARE KK
+ # <square> 004B 004B
+33CE SQUARE KM CAPITAL
+ # <square> 004B 004D
+33CF SQUARE KT
+ # <square> 006B 0074
+33D0 SQUARE LM
+ # <square> 006C 006D
+33D1 SQUARE LN
+ # <square> 006C 006E
+33D2 SQUARE LOG
+ # <square> 006C 006F 0067
+33D3 SQUARE LX
+ # <square> 006C 0078
+33D4 SQUARE MB SMALL
+ # <square> 006D 0062
+33D5 SQUARE MIL
+ # <square> 006D 0069 006C
+33D6 SQUARE MOL
+ # <square> 006D 006F 006C
+33D7 SQUARE PH
+ # <square> 0050 0048
+33D8 SQUARE PM
+ # <square> 0070 002E 006D 002E
+33D9 SQUARE PPM
+ # <square> 0050 0050 004D
+33DA SQUARE PR
+ # <square> 0050 0052
+33DB SQUARE SR
+ # <square> 0073 0072
+33DC SQUARE SV
+ # <square> 0053 0076
+33DD SQUARE WB
+ # <square> 0057 0062
+@ Telegraph symbols for days
+33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
+ # 0031 65E5
+33E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
+ # 0032 65E5
+33E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
+ # 0033 65E5
+33E3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
+ # 0034 65E5
+33E4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
+ # 0035 65E5
+33E5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
+ # 0036 65E5
+33E6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
+ # 0037 65E5
+33E7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
+ # 0038 65E5
+33E8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
+ # 0039 65E5
+33E9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
+ # 0031 0030 65E5
+33EA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
+ # 0031 0031 65E5
+33EB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
+ # 0031 0032 65E5
+33EC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
+ # 0031 0033 65E5
+33ED IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
+ # 0031 0034 65E5
+33EE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
+ # 0031 0035 65E5
+33EF IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
+ # 0031 0036 65E5
+33F0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
+ # 0031 0037 65E5
+33F1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
+ # 0031 0038 65E5
+33F2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
+ # 0031 0039 65E5
+33F3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
+ # 0032 0030 65E5
+33F4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
+ # 0032 0031 65E5
+33F5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
+ # 0032 0032 65E5
+33F6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
+ # 0032 0033 65E5
+33F7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
+ # 0032 0034 65E5
+33F8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
+ # 0032 0035 65E5
+33F9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
+ # 0032 0036 65E5
+33FA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
+ # 0032 0037 65E5
+33FB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
+ # 0032 0038 65E5
+33FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
+ # 0032 0039 65E5
+33FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
+ # 0033 0030 65E5
+33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+ # 0033 0031 65E5
+@@ 3400 CJK Unified Ideographs Extension A 4DB5
+@@ 4E00 CJK Unified Ideographs 9FA5
+@@ A000 Yi Syllables A48F
+@ Syllables
+A000 YI SYLLABLE IT
+A001 YI SYLLABLE IX
+A002 YI SYLLABLE I
+A003 YI SYLLABLE IP
+A004 YI SYLLABLE IET
+A005 YI SYLLABLE IEX
+A006 YI SYLLABLE IE
+A007 YI SYLLABLE IEP
+A008 YI SYLLABLE AT
+A009 YI SYLLABLE AX
+A00A YI SYLLABLE A
+A00B YI SYLLABLE AP
+A00C YI SYLLABLE UOX
+A00D YI SYLLABLE UO
+A00E YI SYLLABLE UOP
+A00F YI SYLLABLE OT
+A010 YI SYLLABLE OX
+A011 YI SYLLABLE O
+A012 YI SYLLABLE OP
+A013 YI SYLLABLE EX
+A014 YI SYLLABLE E
+A015 YI SYLLABLE WU
+A016 YI SYLLABLE BIT
+A017 YI SYLLABLE BIX
+A018 YI SYLLABLE BI
+A019 YI SYLLABLE BIP
+A01A YI SYLLABLE BIET
+A01B YI SYLLABLE BIEX
+A01C YI SYLLABLE BIE
+A01D YI SYLLABLE BIEP
+A01E YI SYLLABLE BAT
+A01F YI SYLLABLE BAX
+A020 YI SYLLABLE BA
+A021 YI SYLLABLE BAP
+A022 YI SYLLABLE BUOX
+A023 YI SYLLABLE BUO
+A024 YI SYLLABLE BUOP
+A025 YI SYLLABLE BOT
+A026 YI SYLLABLE BOX
+A027 YI SYLLABLE BO
+A028 YI SYLLABLE BOP
+A029 YI SYLLABLE BEX
+A02A YI SYLLABLE BE
+A02B YI SYLLABLE BEP
+A02C YI SYLLABLE BUT
+A02D YI SYLLABLE BUX
+A02E YI SYLLABLE BU
+A02F YI SYLLABLE BUP
+A030 YI SYLLABLE BURX
+A031 YI SYLLABLE BUR
+A032 YI SYLLABLE BYT
+A033 YI SYLLABLE BYX
+A034 YI SYLLABLE BY
+A035 YI SYLLABLE BYP
+A036 YI SYLLABLE BYRX
+A037 YI SYLLABLE BYR
+A038 YI SYLLABLE PIT
+A039 YI SYLLABLE PIX
+A03A YI SYLLABLE PI
+A03B YI SYLLABLE PIP
+A03C YI SYLLABLE PIEX
+A03D YI SYLLABLE PIE
+A03E YI SYLLABLE PIEP
+A03F YI SYLLABLE PAT
+A040 YI SYLLABLE PAX
+A041 YI SYLLABLE PA
+A042 YI SYLLABLE PAP
+A043 YI SYLLABLE PUOX
+A044 YI SYLLABLE PUO
+A045 YI SYLLABLE PUOP
+A046 YI SYLLABLE POT
+A047 YI SYLLABLE POX
+A048 YI SYLLABLE PO
+A049 YI SYLLABLE POP
+A04A YI SYLLABLE PUT
+A04B YI SYLLABLE PUX
+A04C YI SYLLABLE PU
+A04D YI SYLLABLE PUP
+A04E YI SYLLABLE PURX
+A04F YI SYLLABLE PUR
+A050 YI SYLLABLE PYT
+A051 YI SYLLABLE PYX
+A052 YI SYLLABLE PY
+A053 YI SYLLABLE PYP
+A054 YI SYLLABLE PYRX
+A055 YI SYLLABLE PYR
+A056 YI SYLLABLE BBIT
+A057 YI SYLLABLE BBIX
+A058 YI SYLLABLE BBI
+A059 YI SYLLABLE BBIP
+A05A YI SYLLABLE BBIET
+A05B YI SYLLABLE BBIEX
+A05C YI SYLLABLE BBIE
+A05D YI SYLLABLE BBIEP
+A05E YI SYLLABLE BBAT
+A05F YI SYLLABLE BBAX
+A060 YI SYLLABLE BBA
+A061 YI SYLLABLE BBAP
+A062 YI SYLLABLE BBUOX
+A063 YI SYLLABLE BBUO
+A064 YI SYLLABLE BBUOP
+A065 YI SYLLABLE BBOT
+A066 YI SYLLABLE BBOX
+A067 YI SYLLABLE BBO
+A068 YI SYLLABLE BBOP
+A069 YI SYLLABLE BBEX
+A06A YI SYLLABLE BBE
+A06B YI SYLLABLE BBEP
+A06C YI SYLLABLE BBUT
+A06D YI SYLLABLE BBUX
+A06E YI SYLLABLE BBU
+A06F YI SYLLABLE BBUP
+A070 YI SYLLABLE BBURX
+A071 YI SYLLABLE BBUR
+A072 YI SYLLABLE BBYT
+A073 YI SYLLABLE BBYX
+A074 YI SYLLABLE BBY
+A075 YI SYLLABLE BBYP
+A076 YI SYLLABLE NBIT
+A077 YI SYLLABLE NBIX
+A078 YI SYLLABLE NBI
+A079 YI SYLLABLE NBIP
+A07A YI SYLLABLE NBIEX
+A07B YI SYLLABLE NBIE
+A07C YI SYLLABLE NBIEP
+A07D YI SYLLABLE NBAT
+A07E YI SYLLABLE NBAX
+A07F YI SYLLABLE NBA
+A080 YI SYLLABLE NBAP
+A081 YI SYLLABLE NBOT
+A082 YI SYLLABLE NBOX
+A083 YI SYLLABLE NBO
+A084 YI SYLLABLE NBOP
+A085 YI SYLLABLE NBUT
+A086 YI SYLLABLE NBUX
+A087 YI SYLLABLE NBU
+A088 YI SYLLABLE NBUP
+A089 YI SYLLABLE NBURX
+A08A YI SYLLABLE NBUR
+A08B YI SYLLABLE NBYT
+A08C YI SYLLABLE NBYX
+A08D YI SYLLABLE NBY
+A08E YI SYLLABLE NBYP
+A08F YI SYLLABLE NBYRX
+A090 YI SYLLABLE NBYR
+A091 YI SYLLABLE HMIT
+A092 YI SYLLABLE HMIX
+A093 YI SYLLABLE HMI
+A094 YI SYLLABLE HMIP
+A095 YI SYLLABLE HMIEX
+A096 YI SYLLABLE HMIE
+A097 YI SYLLABLE HMIEP
+A098 YI SYLLABLE HMAT
+A099 YI SYLLABLE HMAX
+A09A YI SYLLABLE HMA
+A09B YI SYLLABLE HMAP
+A09C YI SYLLABLE HMUOX
+A09D YI SYLLABLE HMUO
+A09E YI SYLLABLE HMUOP
+A09F YI SYLLABLE HMOT
+A0A0 YI SYLLABLE HMOX
+A0A1 YI SYLLABLE HMO
+A0A2 YI SYLLABLE HMOP
+A0A3 YI SYLLABLE HMUT
+A0A4 YI SYLLABLE HMUX
+A0A5 YI SYLLABLE HMU
+A0A6 YI SYLLABLE HMUP
+A0A7 YI SYLLABLE HMURX
+A0A8 YI SYLLABLE HMUR
+A0A9 YI SYLLABLE HMYX
+A0AA YI SYLLABLE HMY
+A0AB YI SYLLABLE HMYP
+A0AC YI SYLLABLE HMYRX
+A0AD YI SYLLABLE HMYR
+A0AE YI SYLLABLE MIT
+A0AF YI SYLLABLE MIX
+A0B0 YI SYLLABLE MI
+A0B1 YI SYLLABLE MIP
+A0B2 YI SYLLABLE MIEX
+A0B3 YI SYLLABLE MIE
+A0B4 YI SYLLABLE MIEP
+A0B5 YI SYLLABLE MAT
+A0B6 YI SYLLABLE MAX
+A0B7 YI SYLLABLE MA
+A0B8 YI SYLLABLE MAP
+A0B9 YI SYLLABLE MUOT
+A0BA YI SYLLABLE MUOX
+A0BB YI SYLLABLE MUO
+A0BC YI SYLLABLE MUOP
+A0BD YI SYLLABLE MOT
+A0BE YI SYLLABLE MOX
+A0BF YI SYLLABLE MO
+A0C0 YI SYLLABLE MOP
+A0C1 YI SYLLABLE MEX
+A0C2 YI SYLLABLE ME
+A0C3 YI SYLLABLE MUT
+A0C4 YI SYLLABLE MUX
+A0C5 YI SYLLABLE MU
+A0C6 YI SYLLABLE MUP
+A0C7 YI SYLLABLE MURX
+A0C8 YI SYLLABLE MUR
+A0C9 YI SYLLABLE MYT
+A0CA YI SYLLABLE MYX
+A0CB YI SYLLABLE MY
+A0CC YI SYLLABLE MYP
+A0CD YI SYLLABLE FIT
+A0CE YI SYLLABLE FIX
+A0CF YI SYLLABLE FI
+A0D0 YI SYLLABLE FIP
+A0D1 YI SYLLABLE FAT
+A0D2 YI SYLLABLE FAX
+A0D3 YI SYLLABLE FA
+A0D4 YI SYLLABLE FAP
+A0D5 YI SYLLABLE FOX
+A0D6 YI SYLLABLE FO
+A0D7 YI SYLLABLE FOP
+A0D8 YI SYLLABLE FUT
+A0D9 YI SYLLABLE FUX
+A0DA YI SYLLABLE FU
+A0DB YI SYLLABLE FUP
+A0DC YI SYLLABLE FURX
+A0DD YI SYLLABLE FUR
+A0DE YI SYLLABLE FYT
+A0DF YI SYLLABLE FYX
+A0E0 YI SYLLABLE FY
+A0E1 YI SYLLABLE FYP
+A0E2 YI SYLLABLE VIT
+A0E3 YI SYLLABLE VIX
+A0E4 YI SYLLABLE VI
+A0E5 YI SYLLABLE VIP
+A0E6 YI SYLLABLE VIET
+A0E7 YI SYLLABLE VIEX
+A0E8 YI SYLLABLE VIE
+A0E9 YI SYLLABLE VIEP
+A0EA YI SYLLABLE VAT
+A0EB YI SYLLABLE VAX
+A0EC YI SYLLABLE VA
+A0ED YI SYLLABLE VAP
+A0EE YI SYLLABLE VOT
+A0EF YI SYLLABLE VOX
+A0F0 YI SYLLABLE VO
+A0F1 YI SYLLABLE VOP
+A0F2 YI SYLLABLE VEX
+A0F3 YI SYLLABLE VEP
+A0F4 YI SYLLABLE VUT
+A0F5 YI SYLLABLE VUX
+A0F6 YI SYLLABLE VU
+A0F7 YI SYLLABLE VUP
+A0F8 YI SYLLABLE VURX
+A0F9 YI SYLLABLE VUR
+A0FA YI SYLLABLE VYT
+A0FB YI SYLLABLE VYX
+A0FC YI SYLLABLE VY
+A0FD YI SYLLABLE VYP
+A0FE YI SYLLABLE VYRX
+A0FF YI SYLLABLE VYR
+A100 YI SYLLABLE DIT
+A101 YI SYLLABLE DIX
+A102 YI SYLLABLE DI
+A103 YI SYLLABLE DIP
+A104 YI SYLLABLE DIEX
+A105 YI SYLLABLE DIE
+A106 YI SYLLABLE DIEP
+A107 YI SYLLABLE DAT
+A108 YI SYLLABLE DAX
+A109 YI SYLLABLE DA
+A10A YI SYLLABLE DAP
+A10B YI SYLLABLE DUOX
+A10C YI SYLLABLE DUO
+A10D YI SYLLABLE DOT
+A10E YI SYLLABLE DOX
+A10F YI SYLLABLE DO
+A110 YI SYLLABLE DOP
+A111 YI SYLLABLE DEX
+A112 YI SYLLABLE DE
+A113 YI SYLLABLE DEP
+A114 YI SYLLABLE DUT
+A115 YI SYLLABLE DUX
+A116 YI SYLLABLE DU
+A117 YI SYLLABLE DUP
+A118 YI SYLLABLE DURX
+A119 YI SYLLABLE DUR
+A11A YI SYLLABLE TIT
+A11B YI SYLLABLE TIX
+A11C YI SYLLABLE TI
+A11D YI SYLLABLE TIP
+A11E YI SYLLABLE TIEX
+A11F YI SYLLABLE TIE
+A120 YI SYLLABLE TIEP
+A121 YI SYLLABLE TAT
+A122 YI SYLLABLE TAX
+A123 YI SYLLABLE TA
+A124 YI SYLLABLE TAP
+A125 YI SYLLABLE TUOT
+A126 YI SYLLABLE TUOX
+A127 YI SYLLABLE TUO
+A128 YI SYLLABLE TUOP
+A129 YI SYLLABLE TOT
+A12A YI SYLLABLE TOX
+A12B YI SYLLABLE TO
+A12C YI SYLLABLE TOP
+A12D YI SYLLABLE TEX
+A12E YI SYLLABLE TE
+A12F YI SYLLABLE TEP
+A130 YI SYLLABLE TUT
+A131 YI SYLLABLE TUX
+A132 YI SYLLABLE TU
+A133 YI SYLLABLE TUP
+A134 YI SYLLABLE TURX
+A135 YI SYLLABLE TUR
+A136 YI SYLLABLE DDIT
+A137 YI SYLLABLE DDIX
+A138 YI SYLLABLE DDI
+A139 YI SYLLABLE DDIP
+A13A YI SYLLABLE DDIEX
+A13B YI SYLLABLE DDIE
+A13C YI SYLLABLE DDIEP
+A13D YI SYLLABLE DDAT
+A13E YI SYLLABLE DDAX
+A13F YI SYLLABLE DDA
+A140 YI SYLLABLE DDAP
+A141 YI SYLLABLE DDUOX
+A142 YI SYLLABLE DDUO
+A143 YI SYLLABLE DDUOP
+A144 YI SYLLABLE DDOT
+A145 YI SYLLABLE DDOX
+A146 YI SYLLABLE DDO
+A147 YI SYLLABLE DDOP
+A148 YI SYLLABLE DDEX
+A149 YI SYLLABLE DDE
+A14A YI SYLLABLE DDEP
+A14B YI SYLLABLE DDUT
+A14C YI SYLLABLE DDUX
+A14D YI SYLLABLE DDU
+A14E YI SYLLABLE DDUP
+A14F YI SYLLABLE DDURX
+A150 YI SYLLABLE DDUR
+A151 YI SYLLABLE NDIT
+A152 YI SYLLABLE NDIX
+A153 YI SYLLABLE NDI
+A154 YI SYLLABLE NDIP
+A155 YI SYLLABLE NDIEX
+A156 YI SYLLABLE NDIE
+A157 YI SYLLABLE NDAT
+A158 YI SYLLABLE NDAX
+A159 YI SYLLABLE NDA
+A15A YI SYLLABLE NDAP
+A15B YI SYLLABLE NDOT
+A15C YI SYLLABLE NDOX
+A15D YI SYLLABLE NDO
+A15E YI SYLLABLE NDOP
+A15F YI SYLLABLE NDEX
+A160 YI SYLLABLE NDE
+A161 YI SYLLABLE NDEP
+A162 YI SYLLABLE NDUT
+A163 YI SYLLABLE NDUX
+A164 YI SYLLABLE NDU
+A165 YI SYLLABLE NDUP
+A166 YI SYLLABLE NDURX
+A167 YI SYLLABLE NDUR
+A168 YI SYLLABLE HNIT
+A169 YI SYLLABLE HNIX
+A16A YI SYLLABLE HNI
+A16B YI SYLLABLE HNIP
+A16C YI SYLLABLE HNIET
+A16D YI SYLLABLE HNIEX
+A16E YI SYLLABLE HNIE
+A16F YI SYLLABLE HNIEP
+A170 YI SYLLABLE HNAT
+A171 YI SYLLABLE HNAX
+A172 YI SYLLABLE HNA
+A173 YI SYLLABLE HNAP
+A174 YI SYLLABLE HNUOX
+A175 YI SYLLABLE HNUO
+A176 YI SYLLABLE HNOT
+A177 YI SYLLABLE HNOX
+A178 YI SYLLABLE HNOP
+A179 YI SYLLABLE HNEX
+A17A YI SYLLABLE HNE
+A17B YI SYLLABLE HNEP
+A17C YI SYLLABLE HNUT
+A17D YI SYLLABLE NIT
+A17E YI SYLLABLE NIX
+A17F YI SYLLABLE NI
+A180 YI SYLLABLE NIP
+A181 YI SYLLABLE NIEX
+A182 YI SYLLABLE NIE
+A183 YI SYLLABLE NIEP
+A184 YI SYLLABLE NAX
+A185 YI SYLLABLE NA
+A186 YI SYLLABLE NAP
+A187 YI SYLLABLE NUOX
+A188 YI SYLLABLE NUO
+A189 YI SYLLABLE NUOP
+A18A YI SYLLABLE NOT
+A18B YI SYLLABLE NOX
+A18C YI SYLLABLE NO
+A18D YI SYLLABLE NOP
+A18E YI SYLLABLE NEX
+A18F YI SYLLABLE NE
+A190 YI SYLLABLE NEP
+A191 YI SYLLABLE NUT
+A192 YI SYLLABLE NUX
+A193 YI SYLLABLE NU
+A194 YI SYLLABLE NUP
+A195 YI SYLLABLE NURX
+A196 YI SYLLABLE NUR
+A197 YI SYLLABLE HLIT
+A198 YI SYLLABLE HLIX
+A199 YI SYLLABLE HLI
+A19A YI SYLLABLE HLIP
+A19B YI SYLLABLE HLIEX
+A19C YI SYLLABLE HLIE
+A19D YI SYLLABLE HLIEP
+A19E YI SYLLABLE HLAT
+A19F YI SYLLABLE HLAX
+A1A0 YI SYLLABLE HLA
+A1A1 YI SYLLABLE HLAP
+A1A2 YI SYLLABLE HLUOX
+A1A3 YI SYLLABLE HLUO
+A1A4 YI SYLLABLE HLUOP
+A1A5 YI SYLLABLE HLOX
+A1A6 YI SYLLABLE HLO
+A1A7 YI SYLLABLE HLOP
+A1A8 YI SYLLABLE HLEX
+A1A9 YI SYLLABLE HLE
+A1AA YI SYLLABLE HLEP
+A1AB YI SYLLABLE HLUT
+A1AC YI SYLLABLE HLUX
+A1AD YI SYLLABLE HLU
+A1AE YI SYLLABLE HLUP
+A1AF YI SYLLABLE HLURX
+A1B0 YI SYLLABLE HLUR
+A1B1 YI SYLLABLE HLYT
+A1B2 YI SYLLABLE HLYX
+A1B3 YI SYLLABLE HLY
+A1B4 YI SYLLABLE HLYP
+A1B5 YI SYLLABLE HLYRX
+A1B6 YI SYLLABLE HLYR
+A1B7 YI SYLLABLE LIT
+A1B8 YI SYLLABLE LIX
+A1B9 YI SYLLABLE LI
+A1BA YI SYLLABLE LIP
+A1BB YI SYLLABLE LIET
+A1BC YI SYLLABLE LIEX
+A1BD YI SYLLABLE LIE
+A1BE YI SYLLABLE LIEP
+A1BF YI SYLLABLE LAT
+A1C0 YI SYLLABLE LAX
+A1C1 YI SYLLABLE LA
+A1C2 YI SYLLABLE LAP
+A1C3 YI SYLLABLE LUOT
+A1C4 YI SYLLABLE LUOX
+A1C5 YI SYLLABLE LUO
+A1C6 YI SYLLABLE LUOP
+A1C7 YI SYLLABLE LOT
+A1C8 YI SYLLABLE LOX
+A1C9 YI SYLLABLE LO
+A1CA YI SYLLABLE LOP
+A1CB YI SYLLABLE LEX
+A1CC YI SYLLABLE LE
+A1CD YI SYLLABLE LEP
+A1CE YI SYLLABLE LUT
+A1CF YI SYLLABLE LUX
+A1D0 YI SYLLABLE LU
+A1D1 YI SYLLABLE LUP
+A1D2 YI SYLLABLE LURX
+A1D3 YI SYLLABLE LUR
+A1D4 YI SYLLABLE LYT
+A1D5 YI SYLLABLE LYX
+A1D6 YI SYLLABLE LY
+A1D7 YI SYLLABLE LYP
+A1D8 YI SYLLABLE LYRX
+A1D9 YI SYLLABLE LYR
+A1DA YI SYLLABLE GIT
+A1DB YI SYLLABLE GIX
+A1DC YI SYLLABLE GI
+A1DD YI SYLLABLE GIP
+A1DE YI SYLLABLE GIET
+A1DF YI SYLLABLE GIEX
+A1E0 YI SYLLABLE GIE
+A1E1 YI SYLLABLE GIEP
+A1E2 YI SYLLABLE GAT
+A1E3 YI SYLLABLE GAX
+A1E4 YI SYLLABLE GA
+A1E5 YI SYLLABLE GAP
+A1E6 YI SYLLABLE GUOT
+A1E7 YI SYLLABLE GUOX
+A1E8 YI SYLLABLE GUO
+A1E9 YI SYLLABLE GUOP
+A1EA YI SYLLABLE GOT
+A1EB YI SYLLABLE GOX
+A1EC YI SYLLABLE GO
+A1ED YI SYLLABLE GOP
+A1EE YI SYLLABLE GET
+A1EF YI SYLLABLE GEX
+A1F0 YI SYLLABLE GE
+A1F1 YI SYLLABLE GEP
+A1F2 YI SYLLABLE GUT
+A1F3 YI SYLLABLE GUX
+A1F4 YI SYLLABLE GU
+A1F5 YI SYLLABLE GUP
+A1F6 YI SYLLABLE GURX
+A1F7 YI SYLLABLE GUR
+A1F8 YI SYLLABLE KIT
+A1F9 YI SYLLABLE KIX
+A1FA YI SYLLABLE KI
+A1FB YI SYLLABLE KIP
+A1FC YI SYLLABLE KIEX
+A1FD YI SYLLABLE KIE
+A1FE YI SYLLABLE KIEP
+A1FF YI SYLLABLE KAT
+A200 YI SYLLABLE KAX
+A201 YI SYLLABLE KA
+A202 YI SYLLABLE KAP
+A203 YI SYLLABLE KUOX
+A204 YI SYLLABLE KUO
+A205 YI SYLLABLE KUOP
+A206 YI SYLLABLE KOT
+A207 YI SYLLABLE KOX
+A208 YI SYLLABLE KO
+A209 YI SYLLABLE KOP
+A20A YI SYLLABLE KET
+A20B YI SYLLABLE KEX
+A20C YI SYLLABLE KE
+A20D YI SYLLABLE KEP
+A20E YI SYLLABLE KUT
+A20F YI SYLLABLE KUX
+A210 YI SYLLABLE KU
+A211 YI SYLLABLE KUP
+A212 YI SYLLABLE KURX
+A213 YI SYLLABLE KUR
+A214 YI SYLLABLE GGIT
+A215 YI SYLLABLE GGIX
+A216 YI SYLLABLE GGI
+A217 YI SYLLABLE GGIEX
+A218 YI SYLLABLE GGIE
+A219 YI SYLLABLE GGIEP
+A21A YI SYLLABLE GGAT
+A21B YI SYLLABLE GGAX
+A21C YI SYLLABLE GGA
+A21D YI SYLLABLE GGAP
+A21E YI SYLLABLE GGUOT
+A21F YI SYLLABLE GGUOX
+A220 YI SYLLABLE GGUO
+A221 YI SYLLABLE GGUOP
+A222 YI SYLLABLE GGOT
+A223 YI SYLLABLE GGOX
+A224 YI SYLLABLE GGO
+A225 YI SYLLABLE GGOP
+A226 YI SYLLABLE GGET
+A227 YI SYLLABLE GGEX
+A228 YI SYLLABLE GGE
+A229 YI SYLLABLE GGEP
+A22A YI SYLLABLE GGUT
+A22B YI SYLLABLE GGUX
+A22C YI SYLLABLE GGU
+A22D YI SYLLABLE GGUP
+A22E YI SYLLABLE GGURX
+A22F YI SYLLABLE GGUR
+A230 YI SYLLABLE MGIEX
+A231 YI SYLLABLE MGIE
+A232 YI SYLLABLE MGAT
+A233 YI SYLLABLE MGAX
+A234 YI SYLLABLE MGA
+A235 YI SYLLABLE MGAP
+A236 YI SYLLABLE MGUOX
+A237 YI SYLLABLE MGUO
+A238 YI SYLLABLE MGUOP
+A239 YI SYLLABLE MGOT
+A23A YI SYLLABLE MGOX
+A23B YI SYLLABLE MGO
+A23C YI SYLLABLE MGOP
+A23D YI SYLLABLE MGEX
+A23E YI SYLLABLE MGE
+A23F YI SYLLABLE MGEP
+A240 YI SYLLABLE MGUT
+A241 YI SYLLABLE MGUX
+A242 YI SYLLABLE MGU
+A243 YI SYLLABLE MGUP
+A244 YI SYLLABLE MGURX
+A245 YI SYLLABLE MGUR
+A246 YI SYLLABLE HXIT
+A247 YI SYLLABLE HXIX
+A248 YI SYLLABLE HXI
+A249 YI SYLLABLE HXIP
+A24A YI SYLLABLE HXIET
+A24B YI SYLLABLE HXIEX
+A24C YI SYLLABLE HXIE
+A24D YI SYLLABLE HXIEP
+A24E YI SYLLABLE HXAT
+A24F YI SYLLABLE HXAX
+A250 YI SYLLABLE HXA
+A251 YI SYLLABLE HXAP
+A252 YI SYLLABLE HXUOT
+A253 YI SYLLABLE HXUOX
+A254 YI SYLLABLE HXUO
+A255 YI SYLLABLE HXUOP
+A256 YI SYLLABLE HXOT
+A257 YI SYLLABLE HXOX
+A258 YI SYLLABLE HXO
+A259 YI SYLLABLE HXOP
+A25A YI SYLLABLE HXEX
+A25B YI SYLLABLE HXE
+A25C YI SYLLABLE HXEP
+A25D YI SYLLABLE NGIEX
+A25E YI SYLLABLE NGIE
+A25F YI SYLLABLE NGIEP
+A260 YI SYLLABLE NGAT
+A261 YI SYLLABLE NGAX
+A262 YI SYLLABLE NGA
+A263 YI SYLLABLE NGAP
+A264 YI SYLLABLE NGUOT
+A265 YI SYLLABLE NGUOX
+A266 YI SYLLABLE NGUO
+A267 YI SYLLABLE NGOT
+A268 YI SYLLABLE NGOX
+A269 YI SYLLABLE NGO
+A26A YI SYLLABLE NGOP
+A26B YI SYLLABLE NGEX
+A26C YI SYLLABLE NGE
+A26D YI SYLLABLE NGEP
+A26E YI SYLLABLE HIT
+A26F YI SYLLABLE HIEX
+A270 YI SYLLABLE HIE
+A271 YI SYLLABLE HAT
+A272 YI SYLLABLE HAX
+A273 YI SYLLABLE HA
+A274 YI SYLLABLE HAP
+A275 YI SYLLABLE HUOT
+A276 YI SYLLABLE HUOX
+A277 YI SYLLABLE HUO
+A278 YI SYLLABLE HUOP
+A279 YI SYLLABLE HOT
+A27A YI SYLLABLE HOX
+A27B YI SYLLABLE HO
+A27C YI SYLLABLE HOP
+A27D YI SYLLABLE HEX
+A27E YI SYLLABLE HE
+A27F YI SYLLABLE HEP
+A280 YI SYLLABLE WAT
+A281 YI SYLLABLE WAX
+A282 YI SYLLABLE WA
+A283 YI SYLLABLE WAP
+A284 YI SYLLABLE WUOX
+A285 YI SYLLABLE WUO
+A286 YI SYLLABLE WUOP
+A287 YI SYLLABLE WOX
+A288 YI SYLLABLE WO
+A289 YI SYLLABLE WOP
+A28A YI SYLLABLE WEX
+A28B YI SYLLABLE WE
+A28C YI SYLLABLE WEP
+A28D YI SYLLABLE ZIT
+A28E YI SYLLABLE ZIX
+A28F YI SYLLABLE ZI
+A290 YI SYLLABLE ZIP
+A291 YI SYLLABLE ZIEX
+A292 YI SYLLABLE ZIE
+A293 YI SYLLABLE ZIEP
+A294 YI SYLLABLE ZAT
+A295 YI SYLLABLE ZAX
+A296 YI SYLLABLE ZA
+A297 YI SYLLABLE ZAP
+A298 YI SYLLABLE ZUOX
+A299 YI SYLLABLE ZUO
+A29A YI SYLLABLE ZUOP
+A29B YI SYLLABLE ZOT
+A29C YI SYLLABLE ZOX
+A29D YI SYLLABLE ZO
+A29E YI SYLLABLE ZOP
+A29F YI SYLLABLE ZEX
+A2A0 YI SYLLABLE ZE
+A2A1 YI SYLLABLE ZEP
+A2A2 YI SYLLABLE ZUT
+A2A3 YI SYLLABLE ZUX
+A2A4 YI SYLLABLE ZU
+A2A5 YI SYLLABLE ZUP
+A2A6 YI SYLLABLE ZURX
+A2A7 YI SYLLABLE ZUR
+A2A8 YI SYLLABLE ZYT
+A2A9 YI SYLLABLE ZYX
+A2AA YI SYLLABLE ZY
+A2AB YI SYLLABLE ZYP
+A2AC YI SYLLABLE ZYRX
+A2AD YI SYLLABLE ZYR
+A2AE YI SYLLABLE CIT
+A2AF YI SYLLABLE CIX
+A2B0 YI SYLLABLE CI
+A2B1 YI SYLLABLE CIP
+A2B2 YI SYLLABLE CIET
+A2B3 YI SYLLABLE CIEX
+A2B4 YI SYLLABLE CIE
+A2B5 YI SYLLABLE CIEP
+A2B6 YI SYLLABLE CAT
+A2B7 YI SYLLABLE CAX
+A2B8 YI SYLLABLE CA
+A2B9 YI SYLLABLE CAP
+A2BA YI SYLLABLE CUOX
+A2BB YI SYLLABLE CUO
+A2BC YI SYLLABLE CUOP
+A2BD YI SYLLABLE COT
+A2BE YI SYLLABLE COX
+A2BF YI SYLLABLE CO
+A2C0 YI SYLLABLE COP
+A2C1 YI SYLLABLE CEX
+A2C2 YI SYLLABLE CE
+A2C3 YI SYLLABLE CEP
+A2C4 YI SYLLABLE CUT
+A2C5 YI SYLLABLE CUX
+A2C6 YI SYLLABLE CU
+A2C7 YI SYLLABLE CUP
+A2C8 YI SYLLABLE CURX
+A2C9 YI SYLLABLE CUR
+A2CA YI SYLLABLE CYT
+A2CB YI SYLLABLE CYX
+A2CC YI SYLLABLE CY
+A2CD YI SYLLABLE CYP
+A2CE YI SYLLABLE CYRX
+A2CF YI SYLLABLE CYR
+A2D0 YI SYLLABLE ZZIT
+A2D1 YI SYLLABLE ZZIX
+A2D2 YI SYLLABLE ZZI
+A2D3 YI SYLLABLE ZZIP
+A2D4 YI SYLLABLE ZZIET
+A2D5 YI SYLLABLE ZZIEX
+A2D6 YI SYLLABLE ZZIE
+A2D7 YI SYLLABLE ZZIEP
+A2D8 YI SYLLABLE ZZAT
+A2D9 YI SYLLABLE ZZAX
+A2DA YI SYLLABLE ZZA
+A2DB YI SYLLABLE ZZAP
+A2DC YI SYLLABLE ZZOX
+A2DD YI SYLLABLE ZZO
+A2DE YI SYLLABLE ZZOP
+A2DF YI SYLLABLE ZZEX
+A2E0 YI SYLLABLE ZZE
+A2E1 YI SYLLABLE ZZEP
+A2E2 YI SYLLABLE ZZUX
+A2E3 YI SYLLABLE ZZU
+A2E4 YI SYLLABLE ZZUP
+A2E5 YI SYLLABLE ZZURX
+A2E6 YI SYLLABLE ZZUR
+A2E7 YI SYLLABLE ZZYT
+A2E8 YI SYLLABLE ZZYX
+A2E9 YI SYLLABLE ZZY
+A2EA YI SYLLABLE ZZYP
+A2EB YI SYLLABLE ZZYRX
+A2EC YI SYLLABLE ZZYR
+A2ED YI SYLLABLE NZIT
+A2EE YI SYLLABLE NZIX
+A2EF YI SYLLABLE NZI
+A2F0 YI SYLLABLE NZIP
+A2F1 YI SYLLABLE NZIEX
+A2F2 YI SYLLABLE NZIE
+A2F3 YI SYLLABLE NZIEP
+A2F4 YI SYLLABLE NZAT
+A2F5 YI SYLLABLE NZAX
+A2F6 YI SYLLABLE NZA
+A2F7 YI SYLLABLE NZAP
+A2F8 YI SYLLABLE NZUOX
+A2F9 YI SYLLABLE NZUO
+A2FA YI SYLLABLE NZOX
+A2FB YI SYLLABLE NZOP
+A2FC YI SYLLABLE NZEX
+A2FD YI SYLLABLE NZE
+A2FE YI SYLLABLE NZUX
+A2FF YI SYLLABLE NZU
+A300 YI SYLLABLE NZUP
+A301 YI SYLLABLE NZURX
+A302 YI SYLLABLE NZUR
+A303 YI SYLLABLE NZYT
+A304 YI SYLLABLE NZYX
+A305 YI SYLLABLE NZY
+A306 YI SYLLABLE NZYP
+A307 YI SYLLABLE NZYRX
+A308 YI SYLLABLE NZYR
+A309 YI SYLLABLE SIT
+A30A YI SYLLABLE SIX
+A30B YI SYLLABLE SI
+A30C YI SYLLABLE SIP
+A30D YI SYLLABLE SIEX
+A30E YI SYLLABLE SIE
+A30F YI SYLLABLE SIEP
+A310 YI SYLLABLE SAT
+A311 YI SYLLABLE SAX
+A312 YI SYLLABLE SA
+A313 YI SYLLABLE SAP
+A314 YI SYLLABLE SUOX
+A315 YI SYLLABLE SUO
+A316 YI SYLLABLE SUOP
+A317 YI SYLLABLE SOT
+A318 YI SYLLABLE SOX
+A319 YI SYLLABLE SO
+A31A YI SYLLABLE SOP
+A31B YI SYLLABLE SEX
+A31C YI SYLLABLE SE
+A31D YI SYLLABLE SEP
+A31E YI SYLLABLE SUT
+A31F YI SYLLABLE SUX
+A320 YI SYLLABLE SU
+A321 YI SYLLABLE SUP
+A322 YI SYLLABLE SURX
+A323 YI SYLLABLE SUR
+A324 YI SYLLABLE SYT
+A325 YI SYLLABLE SYX
+A326 YI SYLLABLE SY
+A327 YI SYLLABLE SYP
+A328 YI SYLLABLE SYRX
+A329 YI SYLLABLE SYR
+A32A YI SYLLABLE SSIT
+A32B YI SYLLABLE SSIX
+A32C YI SYLLABLE SSI
+A32D YI SYLLABLE SSIP
+A32E YI SYLLABLE SSIEX
+A32F YI SYLLABLE SSIE
+A330 YI SYLLABLE SSIEP
+A331 YI SYLLABLE SSAT
+A332 YI SYLLABLE SSAX
+A333 YI SYLLABLE SSA
+A334 YI SYLLABLE SSAP
+A335 YI SYLLABLE SSOT
+A336 YI SYLLABLE SSOX
+A337 YI SYLLABLE SSO
+A338 YI SYLLABLE SSOP
+A339 YI SYLLABLE SSEX
+A33A YI SYLLABLE SSE
+A33B YI SYLLABLE SSEP
+A33C YI SYLLABLE SSUT
+A33D YI SYLLABLE SSUX
+A33E YI SYLLABLE SSU
+A33F YI SYLLABLE SSUP
+A340 YI SYLLABLE SSYT
+A341 YI SYLLABLE SSYX
+A342 YI SYLLABLE SSY
+A343 YI SYLLABLE SSYP
+A344 YI SYLLABLE SSYRX
+A345 YI SYLLABLE SSYR
+A346 YI SYLLABLE ZHAT
+A347 YI SYLLABLE ZHAX
+A348 YI SYLLABLE ZHA
+A349 YI SYLLABLE ZHAP
+A34A YI SYLLABLE ZHUOX
+A34B YI SYLLABLE ZHUO
+A34C YI SYLLABLE ZHUOP
+A34D YI SYLLABLE ZHOT
+A34E YI SYLLABLE ZHOX
+A34F YI SYLLABLE ZHO
+A350 YI SYLLABLE ZHOP
+A351 YI SYLLABLE ZHET
+A352 YI SYLLABLE ZHEX
+A353 YI SYLLABLE ZHE
+A354 YI SYLLABLE ZHEP
+A355 YI SYLLABLE ZHUT
+A356 YI SYLLABLE ZHUX
+A357 YI SYLLABLE ZHU
+A358 YI SYLLABLE ZHUP
+A359 YI SYLLABLE ZHURX
+A35A YI SYLLABLE ZHUR
+A35B YI SYLLABLE ZHYT
+A35C YI SYLLABLE ZHYX
+A35D YI SYLLABLE ZHY
+A35E YI SYLLABLE ZHYP
+A35F YI SYLLABLE ZHYRX
+A360 YI SYLLABLE ZHYR
+A361 YI SYLLABLE CHAT
+A362 YI SYLLABLE CHAX
+A363 YI SYLLABLE CHA
+A364 YI SYLLABLE CHAP
+A365 YI SYLLABLE CHUOT
+A366 YI SYLLABLE CHUOX
+A367 YI SYLLABLE CHUO
+A368 YI SYLLABLE CHUOP
+A369 YI SYLLABLE CHOT
+A36A YI SYLLABLE CHOX
+A36B YI SYLLABLE CHO
+A36C YI SYLLABLE CHOP
+A36D YI SYLLABLE CHET
+A36E YI SYLLABLE CHEX
+A36F YI SYLLABLE CHE
+A370 YI SYLLABLE CHEP
+A371 YI SYLLABLE CHUX
+A372 YI SYLLABLE CHU
+A373 YI SYLLABLE CHUP
+A374 YI SYLLABLE CHURX
+A375 YI SYLLABLE CHUR
+A376 YI SYLLABLE CHYT
+A377 YI SYLLABLE CHYX
+A378 YI SYLLABLE CHY
+A379 YI SYLLABLE CHYP
+A37A YI SYLLABLE CHYRX
+A37B YI SYLLABLE CHYR
+A37C YI SYLLABLE RRAX
+A37D YI SYLLABLE RRA
+A37E YI SYLLABLE RRUOX
+A37F YI SYLLABLE RRUO
+A380 YI SYLLABLE RROT
+A381 YI SYLLABLE RROX
+A382 YI SYLLABLE RRO
+A383 YI SYLLABLE RROP
+A384 YI SYLLABLE RRET
+A385 YI SYLLABLE RREX
+A386 YI SYLLABLE RRE
+A387 YI SYLLABLE RREP
+A388 YI SYLLABLE RRUT
+A389 YI SYLLABLE RRUX
+A38A YI SYLLABLE RRU
+A38B YI SYLLABLE RRUP
+A38C YI SYLLABLE RRURX
+A38D YI SYLLABLE RRUR
+A38E YI SYLLABLE RRYT
+A38F YI SYLLABLE RRYX
+A390 YI SYLLABLE RRY
+A391 YI SYLLABLE RRYP
+A392 YI SYLLABLE RRYRX
+A393 YI SYLLABLE RRYR
+A394 YI SYLLABLE NRAT
+A395 YI SYLLABLE NRAX
+A396 YI SYLLABLE NRA
+A397 YI SYLLABLE NRAP
+A398 YI SYLLABLE NROX
+A399 YI SYLLABLE NRO
+A39A YI SYLLABLE NROP
+A39B YI SYLLABLE NRET
+A39C YI SYLLABLE NREX
+A39D YI SYLLABLE NRE
+A39E YI SYLLABLE NREP
+A39F YI SYLLABLE NRUT
+A3A0 YI SYLLABLE NRUX
+A3A1 YI SYLLABLE NRU
+A3A2 YI SYLLABLE NRUP
+A3A3 YI SYLLABLE NRURX
+A3A4 YI SYLLABLE NRUR
+A3A5 YI SYLLABLE NRYT
+A3A6 YI SYLLABLE NRYX
+A3A7 YI SYLLABLE NRY
+A3A8 YI SYLLABLE NRYP
+A3A9 YI SYLLABLE NRYRX
+A3AA YI SYLLABLE NRYR
+A3AB YI SYLLABLE SHAT
+A3AC YI SYLLABLE SHAX
+A3AD YI SYLLABLE SHA
+A3AE YI SYLLABLE SHAP
+A3AF YI SYLLABLE SHUOX
+A3B0 YI SYLLABLE SHUO
+A3B1 YI SYLLABLE SHUOP
+A3B2 YI SYLLABLE SHOT
+A3B3 YI SYLLABLE SHOX
+A3B4 YI SYLLABLE SHO
+A3B5 YI SYLLABLE SHOP
+A3B6 YI SYLLABLE SHET
+A3B7 YI SYLLABLE SHEX
+A3B8 YI SYLLABLE SHE
+A3B9 YI SYLLABLE SHEP
+A3BA YI SYLLABLE SHUT
+A3BB YI SYLLABLE SHUX
+A3BC YI SYLLABLE SHU
+A3BD YI SYLLABLE SHUP
+A3BE YI SYLLABLE SHURX
+A3BF YI SYLLABLE SHUR
+A3C0 YI SYLLABLE SHYT
+A3C1 YI SYLLABLE SHYX
+A3C2 YI SYLLABLE SHY
+A3C3 YI SYLLABLE SHYP
+A3C4 YI SYLLABLE SHYRX
+A3C5 YI SYLLABLE SHYR
+A3C6 YI SYLLABLE RAT
+A3C7 YI SYLLABLE RAX
+A3C8 YI SYLLABLE RA
+A3C9 YI SYLLABLE RAP
+A3CA YI SYLLABLE RUOX
+A3CB YI SYLLABLE RUO
+A3CC YI SYLLABLE RUOP
+A3CD YI SYLLABLE ROT
+A3CE YI SYLLABLE ROX
+A3CF YI SYLLABLE RO
+A3D0 YI SYLLABLE ROP
+A3D1 YI SYLLABLE REX
+A3D2 YI SYLLABLE RE
+A3D3 YI SYLLABLE REP
+A3D4 YI SYLLABLE RUT
+A3D5 YI SYLLABLE RUX
+A3D6 YI SYLLABLE RU
+A3D7 YI SYLLABLE RUP
+A3D8 YI SYLLABLE RURX
+A3D9 YI SYLLABLE RUR
+A3DA YI SYLLABLE RYT
+A3DB YI SYLLABLE RYX
+A3DC YI SYLLABLE RY
+A3DD YI SYLLABLE RYP
+A3DE YI SYLLABLE RYRX
+A3DF YI SYLLABLE RYR
+A3E0 YI SYLLABLE JIT
+A3E1 YI SYLLABLE JIX
+A3E2 YI SYLLABLE JI
+A3E3 YI SYLLABLE JIP
+A3E4 YI SYLLABLE JIET
+A3E5 YI SYLLABLE JIEX
+A3E6 YI SYLLABLE JIE
+A3E7 YI SYLLABLE JIEP
+A3E8 YI SYLLABLE JUOT
+A3E9 YI SYLLABLE JUOX
+A3EA YI SYLLABLE JUO
+A3EB YI SYLLABLE JUOP
+A3EC YI SYLLABLE JOT
+A3ED YI SYLLABLE JOX
+A3EE YI SYLLABLE JO
+A3EF YI SYLLABLE JOP
+A3F0 YI SYLLABLE JUT
+A3F1 YI SYLLABLE JUX
+A3F2 YI SYLLABLE JU
+A3F3 YI SYLLABLE JUP
+A3F4 YI SYLLABLE JURX
+A3F5 YI SYLLABLE JUR
+A3F6 YI SYLLABLE JYT
+A3F7 YI SYLLABLE JYX
+A3F8 YI SYLLABLE JY
+A3F9 YI SYLLABLE JYP
+A3FA YI SYLLABLE JYRX
+A3FB YI SYLLABLE JYR
+A3FC YI SYLLABLE QIT
+A3FD YI SYLLABLE QIX
+A3FE YI SYLLABLE QI
+A3FF YI SYLLABLE QIP
+A400 YI SYLLABLE QIET
+A401 YI SYLLABLE QIEX
+A402 YI SYLLABLE QIE
+A403 YI SYLLABLE QIEP
+A404 YI SYLLABLE QUOT
+A405 YI SYLLABLE QUOX
+A406 YI SYLLABLE QUO
+A407 YI SYLLABLE QUOP
+A408 YI SYLLABLE QOT
+A409 YI SYLLABLE QOX
+A40A YI SYLLABLE QO
+A40B YI SYLLABLE QOP
+A40C YI SYLLABLE QUT
+A40D YI SYLLABLE QUX
+A40E YI SYLLABLE QU
+A40F YI SYLLABLE QUP
+A410 YI SYLLABLE QURX
+A411 YI SYLLABLE QUR
+A412 YI SYLLABLE QYT
+A413 YI SYLLABLE QYX
+A414 YI SYLLABLE QY
+A415 YI SYLLABLE QYP
+A416 YI SYLLABLE QYRX
+A417 YI SYLLABLE QYR
+A418 YI SYLLABLE JJIT
+A419 YI SYLLABLE JJIX
+A41A YI SYLLABLE JJI
+A41B YI SYLLABLE JJIP
+A41C YI SYLLABLE JJIET
+A41D YI SYLLABLE JJIEX
+A41E YI SYLLABLE JJIE
+A41F YI SYLLABLE JJIEP
+A420 YI SYLLABLE JJUOX
+A421 YI SYLLABLE JJUO
+A422 YI SYLLABLE JJUOP
+A423 YI SYLLABLE JJOT
+A424 YI SYLLABLE JJOX
+A425 YI SYLLABLE JJO
+A426 YI SYLLABLE JJOP
+A427 YI SYLLABLE JJUT
+A428 YI SYLLABLE JJUX
+A429 YI SYLLABLE JJU
+A42A YI SYLLABLE JJUP
+A42B YI SYLLABLE JJURX
+A42C YI SYLLABLE JJUR
+A42D YI SYLLABLE JJYT
+A42E YI SYLLABLE JJYX
+A42F YI SYLLABLE JJY
+A430 YI SYLLABLE JJYP
+A431 YI SYLLABLE NJIT
+A432 YI SYLLABLE NJIX
+A433 YI SYLLABLE NJI
+A434 YI SYLLABLE NJIP
+A435 YI SYLLABLE NJIET
+A436 YI SYLLABLE NJIEX
+A437 YI SYLLABLE NJIE
+A438 YI SYLLABLE NJIEP
+A439 YI SYLLABLE NJUOX
+A43A YI SYLLABLE NJUO
+A43B YI SYLLABLE NJOT
+A43C YI SYLLABLE NJOX
+A43D YI SYLLABLE NJO
+A43E YI SYLLABLE NJOP
+A43F YI SYLLABLE NJUX
+A440 YI SYLLABLE NJU
+A441 YI SYLLABLE NJUP
+A442 YI SYLLABLE NJURX
+A443 YI SYLLABLE NJUR
+A444 YI SYLLABLE NJYT
+A445 YI SYLLABLE NJYX
+A446 YI SYLLABLE NJY
+A447 YI SYLLABLE NJYP
+A448 YI SYLLABLE NJYRX
+A449 YI SYLLABLE NJYR
+A44A YI SYLLABLE NYIT
+A44B YI SYLLABLE NYIX
+A44C YI SYLLABLE NYI
+A44D YI SYLLABLE NYIP
+A44E YI SYLLABLE NYIET
+A44F YI SYLLABLE NYIEX
+A450 YI SYLLABLE NYIE
+A451 YI SYLLABLE NYIEP
+A452 YI SYLLABLE NYUOX
+A453 YI SYLLABLE NYUO
+A454 YI SYLLABLE NYUOP
+A455 YI SYLLABLE NYOT
+A456 YI SYLLABLE NYOX
+A457 YI SYLLABLE NYO
+A458 YI SYLLABLE NYOP
+A459 YI SYLLABLE NYUT
+A45A YI SYLLABLE NYUX
+A45B YI SYLLABLE NYU
+A45C YI SYLLABLE NYUP
+A45D YI SYLLABLE XIT
+A45E YI SYLLABLE XIX
+A45F YI SYLLABLE XI
+A460 YI SYLLABLE XIP
+A461 YI SYLLABLE XIET
+A462 YI SYLLABLE XIEX
+A463 YI SYLLABLE XIE
+A464 YI SYLLABLE XIEP
+A465 YI SYLLABLE XUOX
+A466 YI SYLLABLE XUO
+A467 YI SYLLABLE XOT
+A468 YI SYLLABLE XOX
+A469 YI SYLLABLE XO
+A46A YI SYLLABLE XOP
+A46B YI SYLLABLE XYT
+A46C YI SYLLABLE XYX
+A46D YI SYLLABLE XY
+A46E YI SYLLABLE XYP
+A46F YI SYLLABLE XYRX
+A470 YI SYLLABLE XYR
+A471 YI SYLLABLE YIT
+A472 YI SYLLABLE YIX
+A473 YI SYLLABLE YI
+A474 YI SYLLABLE YIP
+A475 YI SYLLABLE YIET
+A476 YI SYLLABLE YIEX
+A477 YI SYLLABLE YIE
+A478 YI SYLLABLE YIEP
+A479 YI SYLLABLE YUOT
+A47A YI SYLLABLE YUOX
+A47B YI SYLLABLE YUO
+A47C YI SYLLABLE YUOP
+A47D YI SYLLABLE YOT
+A47E YI SYLLABLE YOX
+A47F YI SYLLABLE YO
+A480 YI SYLLABLE YOP
+A481 YI SYLLABLE YUT
+A482 YI SYLLABLE YUX
+A483 YI SYLLABLE YU
+A484 YI SYLLABLE YUP
+A485 YI SYLLABLE YURX
+A486 YI SYLLABLE YUR
+A487 YI SYLLABLE YYT
+A488 YI SYLLABLE YYX
+A489 YI SYLLABLE YY
+A48A YI SYLLABLE YYP
+A48B YI SYLLABLE YYRX
+A48C YI SYLLABLE YYR
+@@ A490 Yi Radicals A4CF
+@ Yi radicals
+A490 YI RADICAL QOT
+A491 YI RADICAL LI
+A492 YI RADICAL KIT
+A493 YI RADICAL NYIP
+A494 YI RADICAL CYP
+A495 YI RADICAL SSI
+A496 YI RADICAL GGOP
+A497 YI RADICAL GEP
+A498 YI RADICAL MI
+A499 YI RADICAL HXIT
+A49A YI RADICAL LYR
+A49B YI RADICAL BBUT
+A49C YI RADICAL MOP
+A49D YI RADICAL YO
+A49E YI RADICAL PUT
+A49F YI RADICAL HXUO
+A4A0 YI RADICAL TAT
+A4A1 YI RADICAL GA
+A4A4 YI RADICAL DDUR
+A4A5 YI RADICAL BUR
+A4A6 YI RADICAL GGUO
+A4A7 YI RADICAL NYOP
+A4A8 YI RADICAL TU
+A4A9 YI RADICAL OP
+A4AA YI RADICAL JJUT
+A4AB YI RADICAL ZOT
+A4AC YI RADICAL PYT
+A4AD YI RADICAL HMO
+A4AE YI RADICAL YIT
+A4AF YI RADICAL VUR
+A4B0 YI RADICAL SHY
+A4B1 YI RADICAL VEP
+A4B2 YI RADICAL ZA
+A4B3 YI RADICAL JO
+A4B5 YI RADICAL JJY
+A4B6 YI RADICAL GOT
+A4B7 YI RADICAL JJIE
+A4B8 YI RADICAL WO
+A4B9 YI RADICAL DU
+A4BA YI RADICAL SHUR
+A4BB YI RADICAL LIE
+A4BC YI RADICAL CY
+A4BD YI RADICAL CUOP
+A4BE YI RADICAL CIP
+A4BF YI RADICAL HXOP
+A4C0 YI RADICAL SHAT
+A4C2 YI RADICAL SHOP
+A4C3 YI RADICAL CHE
+A4C4 YI RADICAL ZZIET
+A4C6 YI RADICAL KE
+@@ AC00 Hangul Syllables D7A3
+@@ D800 High Surrogates DB7F
+@@ DB80 High Private Use Surrogates DBFF
+@@ DC00 Low Surrogates DFFF
+@@ E000 Private Use Area F8FF
+@@ F900 CJK Compatibility Ideographs FAFF
+@ Pronunciation variants from KS C 5601-1987
+F900 CJK COMPATIBILITY IDEOGRAPH-F900
+ : 8C48
+F901 CJK COMPATIBILITY IDEOGRAPH-F901
+ : 66F4
+F902 CJK COMPATIBILITY IDEOGRAPH-F902
+ : 8ECA
+F903 CJK COMPATIBILITY IDEOGRAPH-F903
+ : 8CC8
+F904 CJK COMPATIBILITY IDEOGRAPH-F904
+ : 6ED1
+F905 CJK COMPATIBILITY IDEOGRAPH-F905
+ : 4E32
+F906 CJK COMPATIBILITY IDEOGRAPH-F906
+ : 53E5
+F907 CJK COMPATIBILITY IDEOGRAPH-F907
+ : 9F9C
+F908 CJK COMPATIBILITY IDEOGRAPH-F908
+ : 9F9C
+F909 CJK COMPATIBILITY IDEOGRAPH-F909
+ : 5951
+F90A CJK COMPATIBILITY IDEOGRAPH-F90A
+ : 91D1
+F90B CJK COMPATIBILITY IDEOGRAPH-F90B
+ : 5587
+F90C CJK COMPATIBILITY IDEOGRAPH-F90C
+ : 5948
+F90D CJK COMPATIBILITY IDEOGRAPH-F90D
+ : 61F6
+F90E CJK COMPATIBILITY IDEOGRAPH-F90E
+ : 7669
+F90F CJK COMPATIBILITY IDEOGRAPH-F90F
+ : 7F85
+F910 CJK COMPATIBILITY IDEOGRAPH-F910
+ : 863F
+F911 CJK COMPATIBILITY IDEOGRAPH-F911
+ : 87BA
+F912 CJK COMPATIBILITY IDEOGRAPH-F912
+ : 88F8
+F913 CJK COMPATIBILITY IDEOGRAPH-F913
+ : 908F
+F914 CJK COMPATIBILITY IDEOGRAPH-F914
+ : 6A02
+F915 CJK COMPATIBILITY IDEOGRAPH-F915
+ : 6D1B
+F916 CJK COMPATIBILITY IDEOGRAPH-F916
+ : 70D9
+F917 CJK COMPATIBILITY IDEOGRAPH-F917
+ : 73DE
+F918 CJK COMPATIBILITY IDEOGRAPH-F918
+ : 843D
+F919 CJK COMPATIBILITY IDEOGRAPH-F919
+ : 916A
+F91A CJK COMPATIBILITY IDEOGRAPH-F91A
+ : 99F1
+F91B CJK COMPATIBILITY IDEOGRAPH-F91B
+ : 4E82
+F91C CJK COMPATIBILITY IDEOGRAPH-F91C
+ : 5375
+F91D CJK COMPATIBILITY IDEOGRAPH-F91D
+ : 6B04
+F91E CJK COMPATIBILITY IDEOGRAPH-F91E
+ : 721B
+F91F CJK COMPATIBILITY IDEOGRAPH-F91F
+ : 862D
+F920 CJK COMPATIBILITY IDEOGRAPH-F920
+ : 9E1E
+F921 CJK COMPATIBILITY IDEOGRAPH-F921
+ : 5D50
+F922 CJK COMPATIBILITY IDEOGRAPH-F922
+ : 6FEB
+F923 CJK COMPATIBILITY IDEOGRAPH-F923
+ : 85CD
+F924 CJK COMPATIBILITY IDEOGRAPH-F924
+ : 8964
+F925 CJK COMPATIBILITY IDEOGRAPH-F925
+ : 62C9
+F926 CJK COMPATIBILITY IDEOGRAPH-F926
+ : 81D8
+F927 CJK COMPATIBILITY IDEOGRAPH-F927
+ : 881F
+F928 CJK COMPATIBILITY IDEOGRAPH-F928
+ : 5ECA
+F929 CJK COMPATIBILITY IDEOGRAPH-F929
+ : 6717
+F92A CJK COMPATIBILITY IDEOGRAPH-F92A
+ : 6D6A
+F92B CJK COMPATIBILITY IDEOGRAPH-F92B
+ : 72FC
+F92C CJK COMPATIBILITY IDEOGRAPH-F92C
+ : 90CE
+F92D CJK COMPATIBILITY IDEOGRAPH-F92D
+ : 4F86
+F92E CJK COMPATIBILITY IDEOGRAPH-F92E
+ : 51B7
+F92F CJK COMPATIBILITY IDEOGRAPH-F92F
+ : 52DE
+F930 CJK COMPATIBILITY IDEOGRAPH-F930
+ : 64C4
+F931 CJK COMPATIBILITY IDEOGRAPH-F931
+ : 6AD3
+F932 CJK COMPATIBILITY IDEOGRAPH-F932
+ : 7210
+F933 CJK COMPATIBILITY IDEOGRAPH-F933
+ : 76E7
+F934 CJK COMPATIBILITY IDEOGRAPH-F934
+ : 8001
+F935 CJK COMPATIBILITY IDEOGRAPH-F935
+ : 8606
+F936 CJK COMPATIBILITY IDEOGRAPH-F936
+ : 865C
+F937 CJK COMPATIBILITY IDEOGRAPH-F937
+ : 8DEF
+F938 CJK COMPATIBILITY IDEOGRAPH-F938
+ : 9732
+F939 CJK COMPATIBILITY IDEOGRAPH-F939
+ : 9B6F
+F93A CJK COMPATIBILITY IDEOGRAPH-F93A
+ : 9DFA
+F93B CJK COMPATIBILITY IDEOGRAPH-F93B
+ : 788C
+F93C CJK COMPATIBILITY IDEOGRAPH-F93C
+ : 797F
+F93D CJK COMPATIBILITY IDEOGRAPH-F93D
+ : 7DA0
+F93E CJK COMPATIBILITY IDEOGRAPH-F93E
+ : 83C9
+F93F CJK COMPATIBILITY IDEOGRAPH-F93F
+ : 9304
+F940 CJK COMPATIBILITY IDEOGRAPH-F940
+ : 9E7F
+F941 CJK COMPATIBILITY IDEOGRAPH-F941
+ : 8AD6
+F942 CJK COMPATIBILITY IDEOGRAPH-F942
+ : 58DF
+F943 CJK COMPATIBILITY IDEOGRAPH-F943
+ : 5F04
+F944 CJK COMPATIBILITY IDEOGRAPH-F944
+ : 7C60
+F945 CJK COMPATIBILITY IDEOGRAPH-F945
+ : 807E
+F946 CJK COMPATIBILITY IDEOGRAPH-F946
+ : 7262
+F947 CJK COMPATIBILITY IDEOGRAPH-F947
+ : 78CA
+F948 CJK COMPATIBILITY IDEOGRAPH-F948
+ : 8CC2
+F949 CJK COMPATIBILITY IDEOGRAPH-F949
+ : 96F7
+F94A CJK COMPATIBILITY IDEOGRAPH-F94A
+ : 58D8
+F94B CJK COMPATIBILITY IDEOGRAPH-F94B
+ : 5C62
+F94C CJK COMPATIBILITY IDEOGRAPH-F94C
+ : 6A13
+F94D CJK COMPATIBILITY IDEOGRAPH-F94D
+ : 6DDA
+F94E CJK COMPATIBILITY IDEOGRAPH-F94E
+ : 6F0F
+F94F CJK COMPATIBILITY IDEOGRAPH-F94F
+ : 7D2F
+F950 CJK COMPATIBILITY IDEOGRAPH-F950
+ : 7E37
+F951 CJK COMPATIBILITY IDEOGRAPH-F951
+ : 96FB
+F952 CJK COMPATIBILITY IDEOGRAPH-F952
+ : 52D2
+F953 CJK COMPATIBILITY IDEOGRAPH-F953
+ : 808B
+F954 CJK COMPATIBILITY IDEOGRAPH-F954
+ : 51DC
+F955 CJK COMPATIBILITY IDEOGRAPH-F955
+ : 51CC
+F956 CJK COMPATIBILITY IDEOGRAPH-F956
+ : 7A1C
+F957 CJK COMPATIBILITY IDEOGRAPH-F957
+ : 7DBE
+F958 CJK COMPATIBILITY IDEOGRAPH-F958
+ : 83F1
+F959 CJK COMPATIBILITY IDEOGRAPH-F959
+ : 9675
+F95A CJK COMPATIBILITY IDEOGRAPH-F95A
+ : 8B80
+F95B CJK COMPATIBILITY IDEOGRAPH-F95B
+ : 62CF
+F95C CJK COMPATIBILITY IDEOGRAPH-F95C
+ : 6A02
+F95D CJK COMPATIBILITY IDEOGRAPH-F95D
+ : 8AFE
+F95E CJK COMPATIBILITY IDEOGRAPH-F95E
+ : 4E39
+F95F CJK COMPATIBILITY IDEOGRAPH-F95F
+ : 5BE7
+F960 CJK COMPATIBILITY IDEOGRAPH-F960
+ : 6012
+F961 CJK COMPATIBILITY IDEOGRAPH-F961
+ : 7387
+F962 CJK COMPATIBILITY IDEOGRAPH-F962
+ : 7570
+F963 CJK COMPATIBILITY IDEOGRAPH-F963
+ : 5317
+F964 CJK COMPATIBILITY IDEOGRAPH-F964
+ : 78FB
+F965 CJK COMPATIBILITY IDEOGRAPH-F965
+ : 4FBF
+F966 CJK COMPATIBILITY IDEOGRAPH-F966
+ : 5FA9
+F967 CJK COMPATIBILITY IDEOGRAPH-F967
+ : 4E0D
+F968 CJK COMPATIBILITY IDEOGRAPH-F968
+ : 6CCC
+F969 CJK COMPATIBILITY IDEOGRAPH-F969
+ : 6578
+F96A CJK COMPATIBILITY IDEOGRAPH-F96A
+ : 7D22
+F96B CJK COMPATIBILITY IDEOGRAPH-F96B
+ : 53C3
+F96C CJK COMPATIBILITY IDEOGRAPH-F96C
+ : 585E
+F96D CJK COMPATIBILITY IDEOGRAPH-F96D
+ : 7701
+F96E CJK COMPATIBILITY IDEOGRAPH-F96E
+ : 8449
+F96F CJK COMPATIBILITY IDEOGRAPH-F96F
+ : 8AAA
+F970 CJK COMPATIBILITY IDEOGRAPH-F970
+ : 6BBA
+F971 CJK COMPATIBILITY IDEOGRAPH-F971
+ : 8FB0
+F972 CJK COMPATIBILITY IDEOGRAPH-F972
+ : 6C88
+F973 CJK COMPATIBILITY IDEOGRAPH-F973
+ : 62FE
+F974 CJK COMPATIBILITY IDEOGRAPH-F974
+ : 82E5
+F975 CJK COMPATIBILITY IDEOGRAPH-F975
+ : 63A0
+F976 CJK COMPATIBILITY IDEOGRAPH-F976
+ : 7565
+F977 CJK COMPATIBILITY IDEOGRAPH-F977
+ : 4EAE
+F978 CJK COMPATIBILITY IDEOGRAPH-F978
+ : 5169
+F979 CJK COMPATIBILITY IDEOGRAPH-F979
+ : 51C9
+F97A CJK COMPATIBILITY IDEOGRAPH-F97A
+ : 6881
+F97B CJK COMPATIBILITY IDEOGRAPH-F97B
+ : 7CE7
+F97C CJK COMPATIBILITY IDEOGRAPH-F97C
+ : 826F
+F97D CJK COMPATIBILITY IDEOGRAPH-F97D
+ : 8AD2
+F97E CJK COMPATIBILITY IDEOGRAPH-F97E
+ : 91CF
+F97F CJK COMPATIBILITY IDEOGRAPH-F97F
+ : 52F5
+F980 CJK COMPATIBILITY IDEOGRAPH-F980
+ : 5442
+F981 CJK COMPATIBILITY IDEOGRAPH-F981
+ : 5973
+F982 CJK COMPATIBILITY IDEOGRAPH-F982
+ : 5EEC
+F983 CJK COMPATIBILITY IDEOGRAPH-F983
+ : 65C5
+F984 CJK COMPATIBILITY IDEOGRAPH-F984
+ : 6FFE
+F985 CJK COMPATIBILITY IDEOGRAPH-F985
+ : 792A
+F986 CJK COMPATIBILITY IDEOGRAPH-F986
+ : 95AD
+F987 CJK COMPATIBILITY IDEOGRAPH-F987
+ : 9A6A
+F988 CJK COMPATIBILITY IDEOGRAPH-F988
+ : 9E97
+F989 CJK COMPATIBILITY IDEOGRAPH-F989
+ : 9ECE
+F98A CJK COMPATIBILITY IDEOGRAPH-F98A
+ : 529B
+F98B CJK COMPATIBILITY IDEOGRAPH-F98B
+ : 66C6
+F98C CJK COMPATIBILITY IDEOGRAPH-F98C
+ : 6B77
+F98D CJK COMPATIBILITY IDEOGRAPH-F98D
+ : 8F62
+F98E CJK COMPATIBILITY IDEOGRAPH-F98E
+ : 5E74
+F98F CJK COMPATIBILITY IDEOGRAPH-F98F
+ : 6190
+F990 CJK COMPATIBILITY IDEOGRAPH-F990
+ : 6200
+F991 CJK COMPATIBILITY IDEOGRAPH-F991
+ : 649A
+F992 CJK COMPATIBILITY IDEOGRAPH-F992
+ : 6F23
+F993 CJK COMPATIBILITY IDEOGRAPH-F993
+ : 7149
+F994 CJK COMPATIBILITY IDEOGRAPH-F994
+ : 7489
+F995 CJK COMPATIBILITY IDEOGRAPH-F995
+ : 79CA
+F996 CJK COMPATIBILITY IDEOGRAPH-F996
+ : 7DF4
+F997 CJK COMPATIBILITY IDEOGRAPH-F997
+ : 806F
+F998 CJK COMPATIBILITY IDEOGRAPH-F998
+ : 8F26
+F999 CJK COMPATIBILITY IDEOGRAPH-F999
+ : 84EE
+F99A CJK COMPATIBILITY IDEOGRAPH-F99A
+ : 9023
+F99B CJK COMPATIBILITY IDEOGRAPH-F99B
+ : 934A
+F99C CJK COMPATIBILITY IDEOGRAPH-F99C
+ : 5217
+F99D CJK COMPATIBILITY IDEOGRAPH-F99D
+ : 52A3
+F99E CJK COMPATIBILITY IDEOGRAPH-F99E
+ : 54BD
+F99F CJK COMPATIBILITY IDEOGRAPH-F99F
+ : 70C8
+F9A0 CJK COMPATIBILITY IDEOGRAPH-F9A0
+ : 88C2
+F9A1 CJK COMPATIBILITY IDEOGRAPH-F9A1
+ : 8AAA
+F9A2 CJK COMPATIBILITY IDEOGRAPH-F9A2
+ : 5EC9
+F9A3 CJK COMPATIBILITY IDEOGRAPH-F9A3
+ : 5FF5
+F9A4 CJK COMPATIBILITY IDEOGRAPH-F9A4
+ : 637B
+F9A5 CJK COMPATIBILITY IDEOGRAPH-F9A5
+ : 6BAE
+F9A6 CJK COMPATIBILITY IDEOGRAPH-F9A6
+ : 7C3E
+F9A7 CJK COMPATIBILITY IDEOGRAPH-F9A7
+ : 7375
+F9A8 CJK COMPATIBILITY IDEOGRAPH-F9A8
+ : 4EE4
+F9A9 CJK COMPATIBILITY IDEOGRAPH-F9A9
+ : 56F9
+F9AA CJK COMPATIBILITY IDEOGRAPH-F9AA
+ : 5BE7
+F9AB CJK COMPATIBILITY IDEOGRAPH-F9AB
+ : 5DBA
+F9AC CJK COMPATIBILITY IDEOGRAPH-F9AC
+ : 601C
+F9AD CJK COMPATIBILITY IDEOGRAPH-F9AD
+ : 73B2
+F9AE CJK COMPATIBILITY IDEOGRAPH-F9AE
+ : 7469
+F9AF CJK COMPATIBILITY IDEOGRAPH-F9AF
+ : 7F9A
+F9B0 CJK COMPATIBILITY IDEOGRAPH-F9B0
+ : 8046
+F9B1 CJK COMPATIBILITY IDEOGRAPH-F9B1
+ : 9234
+F9B2 CJK COMPATIBILITY IDEOGRAPH-F9B2
+ : 96F6
+F9B3 CJK COMPATIBILITY IDEOGRAPH-F9B3
+ : 9748
+F9B4 CJK COMPATIBILITY IDEOGRAPH-F9B4
+ : 9818
+F9B5 CJK COMPATIBILITY IDEOGRAPH-F9B5
+ : 4F8B
+F9B6 CJK COMPATIBILITY IDEOGRAPH-F9B6
+ : 79AE
+F9B7 CJK COMPATIBILITY IDEOGRAPH-F9B7
+ : 91B4
+F9B8 CJK COMPATIBILITY IDEOGRAPH-F9B8
+ : 96B8
+F9B9 CJK COMPATIBILITY IDEOGRAPH-F9B9
+ : 60E1
+F9BA CJK COMPATIBILITY IDEOGRAPH-F9BA
+ : 4E86
+F9BB CJK COMPATIBILITY IDEOGRAPH-F9BB
+ : 50DA
+F9BC CJK COMPATIBILITY IDEOGRAPH-F9BC
+ : 5BEE
+F9BD CJK COMPATIBILITY IDEOGRAPH-F9BD
+ : 5C3F
+F9BE CJK COMPATIBILITY IDEOGRAPH-F9BE
+ : 6599
+F9BF CJK COMPATIBILITY IDEOGRAPH-F9BF
+ : 6A02
+F9C0 CJK COMPATIBILITY IDEOGRAPH-F9C0
+ : 71CE
+F9C1 CJK COMPATIBILITY IDEOGRAPH-F9C1
+ : 7642
+F9C2 CJK COMPATIBILITY IDEOGRAPH-F9C2
+ : 84FC
+F9C3 CJK COMPATIBILITY IDEOGRAPH-F9C3
+ : 907C
+F9C4 CJK COMPATIBILITY IDEOGRAPH-F9C4
+ : 9F8D
+F9C5 CJK COMPATIBILITY IDEOGRAPH-F9C5
+ : 6688
+F9C6 CJK COMPATIBILITY IDEOGRAPH-F9C6
+ : 962E
+F9C7 CJK COMPATIBILITY IDEOGRAPH-F9C7
+ : 5289
+F9C8 CJK COMPATIBILITY IDEOGRAPH-F9C8
+ : 677B
+F9C9 CJK COMPATIBILITY IDEOGRAPH-F9C9
+ : 67F3
+F9CA CJK COMPATIBILITY IDEOGRAPH-F9CA
+ : 6D41
+F9CB CJK COMPATIBILITY IDEOGRAPH-F9CB
+ : 6E9C
+F9CC CJK COMPATIBILITY IDEOGRAPH-F9CC
+ : 7409
+F9CD CJK COMPATIBILITY IDEOGRAPH-F9CD
+ : 7559
+F9CE CJK COMPATIBILITY IDEOGRAPH-F9CE
+ : 786B
+F9CF CJK COMPATIBILITY IDEOGRAPH-F9CF
+ : 7D10
+F9D0 CJK COMPATIBILITY IDEOGRAPH-F9D0
+ : 985E
+F9D1 CJK COMPATIBILITY IDEOGRAPH-F9D1
+ : 516D
+F9D2 CJK COMPATIBILITY IDEOGRAPH-F9D2
+ : 622E
+F9D3 CJK COMPATIBILITY IDEOGRAPH-F9D3
+ : 9678
+F9D4 CJK COMPATIBILITY IDEOGRAPH-F9D4
+ : 502B
+F9D5 CJK COMPATIBILITY IDEOGRAPH-F9D5
+ : 5D19
+F9D6 CJK COMPATIBILITY IDEOGRAPH-F9D6
+ : 6DEA
+F9D7 CJK COMPATIBILITY IDEOGRAPH-F9D7
+ : 8F2A
+F9D8 CJK COMPATIBILITY IDEOGRAPH-F9D8
+ : 5F8B
+F9D9 CJK COMPATIBILITY IDEOGRAPH-F9D9
+ : 6144
+F9DA CJK COMPATIBILITY IDEOGRAPH-F9DA
+ : 6817
+F9DB CJK COMPATIBILITY IDEOGRAPH-F9DB
+ : 7387
+F9DC CJK COMPATIBILITY IDEOGRAPH-F9DC
+ : 9686
+F9DD CJK COMPATIBILITY IDEOGRAPH-F9DD
+ : 5229
+F9DE CJK COMPATIBILITY IDEOGRAPH-F9DE
+ : 540F
+F9DF CJK COMPATIBILITY IDEOGRAPH-F9DF
+ : 5C65
+F9E0 CJK COMPATIBILITY IDEOGRAPH-F9E0
+ : 6613
+F9E1 CJK COMPATIBILITY IDEOGRAPH-F9E1
+ : 674E
+F9E2 CJK COMPATIBILITY IDEOGRAPH-F9E2
+ : 68A8
+F9E3 CJK COMPATIBILITY IDEOGRAPH-F9E3
+ : 6CE5
+F9E4 CJK COMPATIBILITY IDEOGRAPH-F9E4
+ : 7406
+F9E5 CJK COMPATIBILITY IDEOGRAPH-F9E5
+ : 75E2
+F9E6 CJK COMPATIBILITY IDEOGRAPH-F9E6
+ : 7F79
+F9E7 CJK COMPATIBILITY IDEOGRAPH-F9E7
+ : 88CF
+F9E8 CJK COMPATIBILITY IDEOGRAPH-F9E8
+ : 88E1
+F9E9 CJK COMPATIBILITY IDEOGRAPH-F9E9
+ : 91CC
+F9EA CJK COMPATIBILITY IDEOGRAPH-F9EA
+ : 96E2
+F9EB CJK COMPATIBILITY IDEOGRAPH-F9EB
+ : 533F
+F9EC CJK COMPATIBILITY IDEOGRAPH-F9EC
+ : 6EBA
+F9ED CJK COMPATIBILITY IDEOGRAPH-F9ED
+ : 541D
+F9EE CJK COMPATIBILITY IDEOGRAPH-F9EE
+ : 71D0
+F9EF CJK COMPATIBILITY IDEOGRAPH-F9EF
+ : 7498
+F9F0 CJK COMPATIBILITY IDEOGRAPH-F9F0
+ : 85FA
+F9F1 CJK COMPATIBILITY IDEOGRAPH-F9F1
+ : 96A3
+F9F2 CJK COMPATIBILITY IDEOGRAPH-F9F2
+ : 9C57
+F9F3 CJK COMPATIBILITY IDEOGRAPH-F9F3
+ : 9E9F
+F9F4 CJK COMPATIBILITY IDEOGRAPH-F9F4
+ : 6797
+F9F5 CJK COMPATIBILITY IDEOGRAPH-F9F5
+ : 6DCB
+F9F6 CJK COMPATIBILITY IDEOGRAPH-F9F6
+ : 81E8
+F9F7 CJK COMPATIBILITY IDEOGRAPH-F9F7
+ : 7ACB
+F9F8 CJK COMPATIBILITY IDEOGRAPH-F9F8
+ : 7B20
+F9F9 CJK COMPATIBILITY IDEOGRAPH-F9F9
+ : 7C92
+F9FA CJK COMPATIBILITY IDEOGRAPH-F9FA
+ : 72C0
+F9FB CJK COMPATIBILITY IDEOGRAPH-F9FB
+ : 7099
+F9FC CJK COMPATIBILITY IDEOGRAPH-F9FC
+ : 8B58
+F9FD CJK COMPATIBILITY IDEOGRAPH-F9FD
+ : 4EC0
+F9FE CJK COMPATIBILITY IDEOGRAPH-F9FE
+ : 8336
+F9FF CJK COMPATIBILITY IDEOGRAPH-F9FF
+ : 523A
+FA00 CJK COMPATIBILITY IDEOGRAPH-FA00
+ : 5207
+FA01 CJK COMPATIBILITY IDEOGRAPH-FA01
+ : 5EA6
+FA02 CJK COMPATIBILITY IDEOGRAPH-FA02
+ : 62D3
+FA03 CJK COMPATIBILITY IDEOGRAPH-FA03
+ : 7CD6
+FA04 CJK COMPATIBILITY IDEOGRAPH-FA04
+ : 5B85
+FA05 CJK COMPATIBILITY IDEOGRAPH-FA05
+ : 6D1E
+FA06 CJK COMPATIBILITY IDEOGRAPH-FA06
+ : 66B4
+FA07 CJK COMPATIBILITY IDEOGRAPH-FA07
+ : 8F3B
+FA08 CJK COMPATIBILITY IDEOGRAPH-FA08
+ : 884C
+FA09 CJK COMPATIBILITY IDEOGRAPH-FA09
+ : 964D
+FA0A CJK COMPATIBILITY IDEOGRAPH-FA0A
+ : 898B
+FA0B CJK COMPATIBILITY IDEOGRAPH-FA0B
+ : 5ED3
+@ Duplicates from Big 5
+FA0C CJK COMPATIBILITY IDEOGRAPH-FA0C
+ : 5140
+FA0D CJK COMPATIBILITY IDEOGRAPH-FA0D
+ : 55C0
+@ The IBM 32 compatibility additions
+FA0E CJK COMPATIBILITY IDEOGRAPH-FA0E
+ * in the set of unified ideographs
+FA0F CJK COMPATIBILITY IDEOGRAPH-FA0F
+ * in the set of unified ideographs
+FA10 CJK COMPATIBILITY IDEOGRAPH-FA10
+ : 585A
+FA11 CJK COMPATIBILITY IDEOGRAPH-FA11
+ * in the set of unified ideographs
+FA12 CJK COMPATIBILITY IDEOGRAPH-FA12
+ : 6674
+FA13 CJK COMPATIBILITY IDEOGRAPH-FA13
+ * in the set of unified ideographs
+FA14 CJK COMPATIBILITY IDEOGRAPH-FA14
+ * in the set of unified ideographs
+FA15 CJK COMPATIBILITY IDEOGRAPH-FA15
+ : 51DE
+FA16 CJK COMPATIBILITY IDEOGRAPH-FA16
+ : 732A
+FA17 CJK COMPATIBILITY IDEOGRAPH-FA17
+ : 76CA
+FA18 CJK COMPATIBILITY IDEOGRAPH-FA18
+ : 793C
+FA19 CJK COMPATIBILITY IDEOGRAPH-FA19
+ : 795E
+FA1A CJK COMPATIBILITY IDEOGRAPH-FA1A
+ : 7965
+FA1B CJK COMPATIBILITY IDEOGRAPH-FA1B
+ : 798F
+FA1C CJK COMPATIBILITY IDEOGRAPH-FA1C
+ : 9756
+FA1D CJK COMPATIBILITY IDEOGRAPH-FA1D
+ : 7CBE
+FA1E CJK COMPATIBILITY IDEOGRAPH-FA1E
+ : 7FBD
+FA1F CJK COMPATIBILITY IDEOGRAPH-FA1F *
+ * in the set of unified ideographs
+FA20 CJK COMPATIBILITY IDEOGRAPH-FA20
+ : 8612
+FA21 CJK COMPATIBILITY IDEOGRAPH-FA21
+ * in the set of unified ideographs
+FA22 CJK COMPATIBILITY IDEOGRAPH-FA22
+ : 8AF8
+FA23 CJK COMPATIBILITY IDEOGRAPH-FA23 *
+ * in the set of unified ideographs
+FA24 CJK COMPATIBILITY IDEOGRAPH-FA24
+ * in the set of unified ideographs
+FA25 CJK COMPATIBILITY IDEOGRAPH-FA25
+ : 9038
+FA26 CJK COMPATIBILITY IDEOGRAPH-FA26
+ : 90FD
+FA27 CJK COMPATIBILITY IDEOGRAPH-FA27
+ * in the set of unified ideographs
+FA28 CJK COMPATIBILITY IDEOGRAPH-FA28
+ * in the set of unified ideographs
+FA29 CJK COMPATIBILITY IDEOGRAPH-FA29
+ * in the set of unified ideographs
+FA2A CJK COMPATIBILITY IDEOGRAPH-FA2A
+ : 98EF
+FA2B CJK COMPATIBILITY IDEOGRAPH-FA2B
+ : 98FC
+FA2C CJK COMPATIBILITY IDEOGRAPH-FA2C
+ : 9928
+FA2D CJK COMPATIBILITY IDEOGRAPH-FA2D
+ : 9DB4
+@@ FB00 Alphabetic Presentation Forms FB4F
+@ Latin ligatures
+@+ See the Basic Latin block starting at 0020
+FB00 LATIN SMALL LIGATURE FF
+ # 0066 0066
+FB01 LATIN SMALL LIGATURE FI
+ # 0066 0069
+FB02 LATIN SMALL LIGATURE FL
+ # 0066 006C
+FB03 LATIN SMALL LIGATURE FFI
+ # 0066 0066 0069
+FB04 LATIN SMALL LIGATURE FFL
+ # 0066 0066 006C
+FB05 LATIN SMALL LIGATURE LONG S T
+ # 017F 0074
+FB06 LATIN SMALL LIGATURE ST
+ # 0073 0074
+@ Armenian ligatures
+@+ See the Armenian block starting at 0530
+FB13 ARMENIAN SMALL LIGATURE MEN NOW
+ # 0574 0576
+FB14 ARMENIAN SMALL LIGATURE MEN ECH
+ # 0574 0565
+FB15 ARMENIAN SMALL LIGATURE MEN INI
+ # 0574 056B
+FB16 ARMENIAN SMALL LIGATURE VEW NOW
+ # 057E 0576
+FB17 ARMENIAN SMALL LIGATURE MEN XEH
+ # 0574 056D
+@ Hebrew presentation forms
+@+ See the Hebrew block starting at 0590
+FB1D HEBREW LETTER YOD WITH HIRIQ
+ : 05D9 05B4
+FB1E HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH
+ : 05F2 05B7
+FB20 HEBREW LETTER ALTERNATIVE AYIN
+ # <font> 05E2 hebrew letter ayin
+FB21 HEBREW LETTER WIDE ALEF
+ # <font> 05D0 hebrew letter alef
+FB22 HEBREW LETTER WIDE DALET
+ # <font> 05D3 hebrew letter dalet
+FB23 HEBREW LETTER WIDE HE
+ # <font> 05D4 hebrew letter he
+FB24 HEBREW LETTER WIDE KAF
+ # <font> 05DB hebrew letter kaf
+FB25 HEBREW LETTER WIDE LAMED
+ # <font> 05DC hebrew letter lamed
+FB26 HEBREW LETTER WIDE FINAL MEM
+ # <font> 05DD hebrew letter final mem
+FB27 HEBREW LETTER WIDE RESH
+ # <font> 05E8 hebrew letter resh
+FB28 HEBREW LETTER WIDE TAV
+ # <font> 05EA hebrew letter tav
+FB29 HEBREW LETTER ALTERNATIVE PLUS SIGN
+ # <font> 002B plus sign
+FB2A HEBREW LETTER SHIN WITH SHIN DOT
+ : 05E9 05C1
+FB2B HEBREW LETTER SHIN WITH SIN DOT
+ : 05E9 05C2
+FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+ : FB49 05C1
+FB2D HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+ : FB49 05C2
+FB2E HEBREW LETTER ALEF WITH PATAH
+ : 05D0 05B7
+FB2F HEBREW LETTER ALEF WITH QAMATS
+ : 05D0 05B8
+FB30 HEBREW LETTER ALEF WITH MAPIQ
+ : 05D0 05BC
+FB31 HEBREW LETTER BET WITH DAGESH
+ : 05D1 05BC
+FB32 HEBREW LETTER GIMEL WITH DAGESH
+ : 05D2 05BC
+FB33 HEBREW LETTER DALET WITH DAGESH
+ : 05D3 05BC
+FB34 HEBREW LETTER HE WITH MAPIQ
+ : 05D4 05BC
+FB35 HEBREW LETTER VAV WITH DAGESH
+ : 05D5 05BC
+FB36 HEBREW LETTER ZAYIN WITH DAGESH
+ : 05D6 05BC
+FB38 HEBREW LETTER TET WITH DAGESH
+ : 05D8 05BC
+FB39 HEBREW LETTER YOD WITH DAGESH
+ : 05D9 05BC
+FB3A HEBREW LETTER FINAL KAF WITH DAGESH
+ : 05DA 05BC
+FB3B HEBREW LETTER KAF WITH DAGESH
+ : 05DB 05BC
+FB3C HEBREW LETTER LAMED WITH DAGESH
+ : 05DC 05BC
+FB3E HEBREW LETTER MEM WITH DAGESH
+ : 05DE 05BC
+FB40 HEBREW LETTER NUN WITH DAGESH
+ : 05E0 05BC
+FB41 HEBREW LETTER SAMEKH WITH DAGESH
+ : 05E1 05BC
+FB43 HEBREW LETTER FINAL PE WITH DAGESH
+ : 05E3 05BC
+FB44 HEBREW LETTER PE WITH DAGESH
+ : 05E4 05BC
+FB46 HEBREW LETTER TSADI WITH DAGESH
+ : 05E6 05BC
+FB47 HEBREW LETTER QOF WITH DAGESH
+ : 05E7 05BC
+FB48 HEBREW LETTER RESH WITH DAGESH
+ : 05E8 05BC
+FB49 HEBREW LETTER SHIN WITH DAGESH
+ : 05E9 05BC
+FB4A HEBREW LETTER TAV WITH DAGESH
+ : 05EA 05BC
+FB4B HEBREW LETTER VAV WITH HOLAM
+ : 05D5 05B9
+FB4C HEBREW LETTER BET WITH RAFE
+ : 05D1 05BF
+FB4D HEBREW LETTER KAF WITH RAFE
+ : 05DB 05BF
+FB4E HEBREW LETTER PE WITH RAFE
+ : 05E4 05BF
+FB4F HEBREW LIGATURE ALEF LAMED
+ # 05D0 05DC
+@@ FB50 Arabic Presentation Forms-A FDFF
+@+ Preferred characters are found in the Arabic block 0600 - 06FF.
+@ Glyphs for contextual forms of letters for Persian, Urdu, Sindhi, etc.
+FB50 ARABIC LETTER ALEF WASLA ISOLATED FORM
+ # <isolated> 0671
+FB51 ARABIC LETTER ALEF WASLA FINAL FORM
+ # <final> 0671
+FB52 ARABIC LETTER BEEH ISOLATED FORM
+ # <isolated> 067B
+FB53 ARABIC LETTER BEEH FINAL FORM
+ # <final> 067B
+FB54 ARABIC LETTER BEEH INITIAL FORM
+ # <initial> 067B
+FB55 ARABIC LETTER BEEH MEDIAL FORM
+ # <medial> 067B
+FB56 ARABIC LETTER PEH ISOLATED FORM
+ # <isolated> 067E
+FB57 ARABIC LETTER PEH FINAL FORM
+ # <final> 067E
+FB58 ARABIC LETTER PEH INITIAL FORM
+ # <initial> 067E
+FB59 ARABIC LETTER PEH MEDIAL FORM
+ # <medial> 067E
+FB5A ARABIC LETTER BEHEH ISOLATED FORM
+ # <isolated> 0680
+FB5B ARABIC LETTER BEHEH FINAL FORM
+ # <final> 0680
+FB5C ARABIC LETTER BEHEH INITIAL FORM
+ # <initial> 0680
+FB5D ARABIC LETTER BEHEH MEDIAL FORM
+ # <medial> 0680
+FB5E ARABIC LETTER TTEHEH ISOLATED FORM
+ # <isolated> 067A
+FB5F ARABIC LETTER TTEHEH FINAL FORM
+ # <final> 067A
+FB60 ARABIC LETTER TTEHEH INITIAL FORM
+ # <initial> 067A
+FB61 ARABIC LETTER TTEHEH MEDIAL FORM
+ # <medial> 067A
+FB62 ARABIC LETTER TEHEH ISOLATED FORM
+ # <isolated> 067F
+FB63 ARABIC LETTER TEHEH FINAL FORM
+ # <final> 067F
+FB64 ARABIC LETTER TEHEH INITIAL FORM
+ # <initial> 067F
+FB65 ARABIC LETTER TEHEH MEDIAL FORM
+ # <medial> 067F
+FB66 ARABIC LETTER TTEH ISOLATED FORM
+ # <isolated> 0679
+FB67 ARABIC LETTER TTEH FINAL FORM
+ # <final> 0679
+FB68 ARABIC LETTER TTEH INITIAL FORM
+ # <initial> 0679
+FB69 ARABIC LETTER TTEH MEDIAL FORM
+ # <medial> 0679
+FB6A ARABIC LETTER VEH ISOLATED FORM
+ # <isolated> 06A4
+FB6B ARABIC LETTER VEH FINAL FORM
+ # <final> 06A4
+FB6C ARABIC LETTER VEH INITIAL FORM
+ # <initial> 06A4
+FB6D ARABIC LETTER VEH MEDIAL FORM
+ # <medial> 06A4
+FB6E ARABIC LETTER PEHEH ISOLATED FORM
+ # <isolated> 06A6
+FB6F ARABIC LETTER PEHEH FINAL FORM
+ # <final> 06A6
+FB70 ARABIC LETTER PEHEH INITIAL FORM
+ # <initial> 06A6
+FB71 ARABIC LETTER PEHEH MEDIAL FORM
+ # <medial> 06A6
+FB72 ARABIC LETTER DYEH ISOLATED FORM
+ # <isolated> 0684
+FB73 ARABIC LETTER DYEH FINAL FORM
+ # <final> 0684
+FB74 ARABIC LETTER DYEH INITIAL FORM
+ # <initial> 0684
+FB75 ARABIC LETTER DYEH MEDIAL FORM
+ # <medial> 0684
+FB76 ARABIC LETTER NYEH ISOLATED FORM
+ # <isolated> 0683
+FB77 ARABIC LETTER NYEH FINAL FORM
+ # <final> 0683
+FB78 ARABIC LETTER NYEH INITIAL FORM
+ # <initial> 0683
+FB79 ARABIC LETTER NYEH MEDIAL FORM
+ # <medial> 0683
+FB7A ARABIC LETTER TCHEH ISOLATED FORM
+ # <isolated> 0686
+FB7B ARABIC LETTER TCHEH FINAL FORM
+ # <final> 0686
+FB7C ARABIC LETTER TCHEH INITIAL FORM
+ # <initial> 0686
+FB7D ARABIC LETTER TCHEH MEDIAL FORM
+ # <medial> 0686
+FB7E ARABIC LETTER TCHEHEH ISOLATED FORM
+ # <isolated> 0687
+FB7F ARABIC LETTER TCHEHEH FINAL FORM
+ # <final> 0687
+FB80 ARABIC LETTER TCHEHEH INITIAL FORM
+ # <initial> 0687
+FB81 ARABIC LETTER TCHEHEH MEDIAL FORM
+ # <medial> 0687
+FB82 ARABIC LETTER DDAHAL ISOLATED FORM
+ # <isolated> 068D
+FB83 ARABIC LETTER DDAHAL FINAL FORM
+ # <final> 068D
+FB84 ARABIC LETTER DAHAL ISOLATED FORM
+ # <isolated> 068C
+FB85 ARABIC LETTER DAHAL FINAL FORM
+ # <final> 068C
+FB86 ARABIC LETTER DUL ISOLATED FORM
+ # <isolated> 068E
+FB87 ARABIC LETTER DUL FINAL FORM
+ # <final> 068E
+FB88 ARABIC LETTER DDAL ISOLATED FORM
+ # <isolated> 0688
+FB89 ARABIC LETTER DDAL FINAL FORM
+ # <final> 0688
+FB8A ARABIC LETTER JEH ISOLATED FORM
+ # <isolated> 0698
+FB8B ARABIC LETTER JEH FINAL FORM
+ # <final> 0698
+FB8C ARABIC LETTER RREH ISOLATED FORM
+ # <isolated> 0691
+FB8D ARABIC LETTER RREH FINAL FORM
+ # <final> 0691
+FB8E ARABIC LETTER KEHEH ISOLATED FORM
+ # <isolated> 06A9
+FB8F ARABIC LETTER KEHEH FINAL FORM
+ # <final> 06A9
+FB90 ARABIC LETTER KEHEH INITIAL FORM
+ # <initial> 06A9
+FB91 ARABIC LETTER KEHEH MEDIAL FORM
+ # <medial> 06A9
+FB92 ARABIC LETTER GAF ISOLATED FORM
+ # <isolated> 06AF
+FB93 ARABIC LETTER GAF FINAL FORM
+ # <final> 06AF
+FB94 ARABIC LETTER GAF INITIAL FORM
+ # <initial> 06AF
+FB95 ARABIC LETTER GAF MEDIAL FORM
+ # <medial> 06AF
+FB96 ARABIC LETTER GUEH ISOLATED FORM
+ # <isolated> 06B3
+FB97 ARABIC LETTER GUEH FINAL FORM
+ # <final> 06B3
+FB98 ARABIC LETTER GUEH INITIAL FORM
+ # <initial> 06B3
+FB99 ARABIC LETTER GUEH MEDIAL FORM
+ # <medial> 06B3
+FB9A ARABIC LETTER NGOEH ISOLATED FORM
+ # <isolated> 06B1
+FB9B ARABIC LETTER NGOEH FINAL FORM
+ # <final> 06B1
+FB9C ARABIC LETTER NGOEH INITIAL FORM
+ # <initial> 06B1
+FB9D ARABIC LETTER NGOEH MEDIAL FORM
+ # <medial> 06B1
+FB9E ARABIC LETTER NOON GHUNNA ISOLATED FORM
+ # <isolated> 06BA
+FB9F ARABIC LETTER NOON GHUNNA FINAL FORM
+ # <final> 06BA
+FBA0 ARABIC LETTER RNOON ISOLATED FORM
+ # <isolated> 06BB
+FBA1 ARABIC LETTER RNOON FINAL FORM
+ # <final> 06BB
+FBA2 ARABIC LETTER RNOON INITIAL FORM
+ # <initial> 06BB
+FBA3 ARABIC LETTER RNOON MEDIAL FORM
+ # <medial> 06BB
+FBA4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+ # <isolated> 06C0
+FBA5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+ # <final> 06C0
+FBA6 ARABIC LETTER HEH GOAL ISOLATED FORM
+ # <isolated> 06C1
+FBA7 ARABIC LETTER HEH GOAL FINAL FORM
+ # <final> 06C1
+FBA8 ARABIC LETTER HEH GOAL INITIAL FORM
+ # <initial> 06C1
+FBA9 ARABIC LETTER HEH GOAL MEDIAL FORM
+ # <medial> 06C1
+FBAA ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+ # <isolated> 06BE
+FBAB ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+ # <final> 06BE
+FBAC ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+ # <initial> 06BE
+FBAD ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+ # <medial> 06BE
+FBAE ARABIC LETTER YEH BARREE ISOLATED FORM
+ # <isolated> 06D2
+FBAF ARABIC LETTER YEH BARREE FINAL FORM
+ # <final> 06D2
+FBB0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 06D3
+FBB1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+ # <final> 06D3
+@ Glyphs for contextual forms of letters for Central Asian languages
+FBD3 ARABIC LETTER NG ISOLATED FORM
+ # <isolated> 06AD
+FBD4 ARABIC LETTER NG FINAL FORM
+ # <final> 06AD
+FBD5 ARABIC LETTER NG INITIAL FORM
+ # <initial> 06AD
+FBD6 ARABIC LETTER NG MEDIAL FORM
+ # <medial> 06AD
+FBD7 ARABIC LETTER U ISOLATED FORM
+ # <isolated> 06C7
+FBD8 ARABIC LETTER U FINAL FORM
+ # <final> 06C7
+FBD9 ARABIC LETTER OE ISOLATED FORM
+ # <isolated> 06C6
+FBDA ARABIC LETTER OE FINAL FORM
+ # <final> 06C6
+FBDB ARABIC LETTER YU ISOLATED FORM
+ # <isolated> 06C8
+FBDC ARABIC LETTER YU FINAL FORM
+ # <final> 06C8
+FBDD ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0677
+FBDE ARABIC LETTER VE ISOLATED FORM
+ # <isolated> 06CB
+FBDF ARABIC LETTER VE FINAL FORM
+ # <final> 06CB
+FBE0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+ # <isolated> 06C5
+FBE1 ARABIC LETTER KIRGHIZ OE FINAL FORM
+ # <final> 06C5
+FBE2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+ # <isolated> 06C9
+FBE3 ARABIC LETTER KIRGHIZ YU FINAL FORM
+ # <final> 06C9
+FBE4 ARABIC LETTER E ISOLATED FORM
+ # <isolated> 06D0
+FBE5 ARABIC LETTER E FINAL FORM
+ # <final> 06D0
+FBE6 ARABIC LETTER E INITIAL FORM
+ # <initial> 06D0
+FBE7 ARABIC LETTER E MEDIAL FORM
+ # <medial> 06D0
+FBE8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+ # <initial> 0649
+FBE9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+ # <medial> 0649
+@ Ligatures (two elements)
+FBEA ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+ # <isolated> 0626 0627
+FBEB ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+ # <final> 0626 0627
+FBEC ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+ # <isolated> 0626 06D5
+FBED ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+ # <final> 0626 06D5
+FBEE ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+ # <isolated> 0626 0648
+FBEF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+ # <final> 0626 0648
+FBF0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+ # <isolated> 0626 06C7
+FBF1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+ # <final> 0626 06C7
+FBF2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+ # <isolated> 0626 06C6
+FBF3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+ # <final> 0626 06C6
+FBF4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+ # <isolated> 0626 06C8
+FBF5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+ # <final> 0626 06C8
+FBF6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+ # <isolated> 0626 06D0
+FBF7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+ # <final> 0626 06D0
+FBF8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+ # <initial> 0626 06D0
+FBF9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0626 0649
+FBFA ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+ # <final> 0626 0649
+FBFB ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+ # <initial> 0626 0649
+FBFC ARABIC LETTER FARSI YEH ISOLATED FORM
+ # <isolated> 06CC
+FBFD ARABIC LETTER FARSI YEH FINAL FORM
+ # <final> 06CC
+FBFE ARABIC LETTER FARSI YEH INITIAL FORM
+ # <initial> 06CC
+FBFF ARABIC LETTER FARSI YEH MEDIAL FORM
+ # <medial> 06CC
+FC00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
+ # <isolated> 0626 062C
+FC01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
+ # <isolated> 0626 062D
+FC02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
+ # <isolated> 0626 0645
+FC03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0626 0649
+FC04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
+ # <isolated> 0626 064A
+FC05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
+ # <isolated> 0628 062C
+FC06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
+ # <isolated> 0628 062D
+FC07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
+ # <isolated> 0628 062E
+FC08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
+ # <isolated> 0628 0645
+FC09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0628 0649
+FC0A ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
+ # <isolated> 0628 064A
+FC0B ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
+ # <isolated> 062A 062C
+FC0C ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
+ # <isolated> 062A 062D
+FC0D ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
+ # <isolated> 062A 062E
+FC0E ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
+ # <isolated> 062A 0645
+FC0F ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062A 0649
+FC10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
+ # <isolated> 062A 064A
+FC11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
+ # <isolated> 062B 062C
+FC12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
+ # <isolated> 062B 0645
+FC13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062B 0649
+FC14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
+ # <isolated> 062B 064A
+FC15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
+ # <isolated> 062C 062D
+FC16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
+ # <isolated> 062C 0645
+FC17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
+ # <isolated> 062D 062C
+FC18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
+ # <isolated> 062D 0645
+FC19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
+ # <isolated> 062E 062C
+FC1A ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
+ # <isolated> 062E 062D
+FC1B ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
+ # <isolated> 062E 0645
+FC1C ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
+ # <isolated> 0633 062C
+FC1D ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
+ # <isolated> 0633 062D
+FC1E ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
+ # <isolated> 0633 062E
+FC1F ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
+ # <isolated> 0633 0645
+FC20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
+ # <isolated> 0635 062D
+FC21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
+ # <isolated> 0635 0645
+FC22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
+ # <isolated> 0636 062C
+FC23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
+ # <isolated> 0636 062D
+FC24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
+ # <isolated> 0636 062E
+FC25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
+ # <isolated> 0636 0645
+FC26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
+ # <isolated> 0637 062D
+FC27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
+ # <isolated> 0637 0645
+FC28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
+ # <isolated> 0638 0645
+FC29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
+ # <isolated> 0639 062C
+FC2A ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
+ # <isolated> 0639 0645
+FC2B ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
+ # <isolated> 063A 062C
+FC2C ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
+ # <isolated> 063A 0645
+FC2D ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
+ # <isolated> 0641 062C
+FC2E ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
+ # <isolated> 0641 062D
+FC2F ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
+ # <isolated> 0641 062E
+FC30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
+ # <isolated> 0641 0645
+FC31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0641 0649
+FC32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
+ # <isolated> 0641 064A
+FC33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
+ # <isolated> 0642 062D
+FC34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
+ # <isolated> 0642 0645
+FC35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0642 0649
+FC36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
+ # <isolated> 0642 064A
+FC37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
+ # <isolated> 0643 0627
+FC38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
+ # <isolated> 0643 062C
+FC39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
+ # <isolated> 0643 062D
+FC3A ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
+ # <isolated> 0643 062E
+FC3B ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
+ # <isolated> 0643 0644
+FC3C ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
+ # <isolated> 0643 0645
+FC3D ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0643 0649
+FC3E ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
+ # <isolated> 0643 064A
+FC3F ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
+ # <isolated> 0644 062C
+FC40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
+ # <isolated> 0644 062D
+FC41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
+ # <isolated> 0644 062E
+FC42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
+ # <isolated> 0644 0645
+FC43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0644 0649
+FC44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
+ # <isolated> 0644 064A
+FC45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
+ # <isolated> 0645 062C
+FC46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
+ # <isolated> 0645 062D
+FC47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
+ # <isolated> 0645 062E
+FC48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
+ # <isolated> 0645 0645
+FC49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0645 0649
+FC4A ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
+ # <isolated> 0645 064A
+FC4B ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
+ # <isolated> 0646 062C
+FC4C ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
+ # <isolated> 0646 062D
+FC4D ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
+ # <isolated> 0646 062E
+FC4E ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
+ # <isolated> 0646 0645
+FC4F ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0646 0649
+FC50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
+ # <isolated> 0646 064A
+FC51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
+ # <isolated> 0647 062C
+FC52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
+ # <isolated> 0647 0645
+FC53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0647 0649
+FC54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
+ # <isolated> 0647 064A
+FC55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
+ # <isolated> 064A 062C
+FC56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
+ # <isolated> 064A 062D
+FC57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
+ # <isolated> 064A 062E
+FC58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
+ # <isolated> 064A 0645
+FC59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 064A 0649
+FC5A ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
+ # <isolated> 064A 064A
+FC5B ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0630 0670
+FC5C ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0631 0670
+FC5D ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0649 0670
+FC5E ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+ # <isolated> 0020 064C 0651
+FC5F ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+ # <isolated> 0020 064D 0651
+FC60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
+ # <isolated> 0020 064E 0651
+FC61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+ # <isolated> 0020 064F 0651
+FC62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
+ # <isolated> 0020 0650 0651
+FC63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+ # <isolated> 0020 0651 0670
+FC64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
+ # <final> 0626 0631
+FC65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
+ # <final> 0626 0632
+FC66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
+ # <final> 0626 0645
+FC67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
+ # <final> 0626 0646
+FC68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+ # <final> 0626 0649
+FC69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
+ # <final> 0626 064A
+FC6A ARABIC LIGATURE BEH WITH REH FINAL FORM
+ # <final> 0628 0631
+FC6B ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
+ # <final> 0628 0632
+FC6C ARABIC LIGATURE BEH WITH MEEM FINAL FORM
+ # <final> 0628 0645
+FC6D ARABIC LIGATURE BEH WITH NOON FINAL FORM
+ # <final> 0628 0646
+FC6E ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0628 0649
+FC6F ARABIC LIGATURE BEH WITH YEH FINAL FORM
+ # <final> 0628 064A
+FC70 ARABIC LIGATURE TEH WITH REH FINAL FORM
+ # <final> 062A 0631
+FC71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
+ # <final> 062A 0632
+FC72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM
+ # <final> 062A 0645
+FC73 ARABIC LIGATURE TEH WITH NOON FINAL FORM
+ # <final> 062A 0646
+FC74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 0649
+FC75 ARABIC LIGATURE TEH WITH YEH FINAL FORM
+ # <final> 062A 064A
+FC76 ARABIC LIGATURE THEH WITH REH FINAL FORM
+ # <final> 062B 0631
+FC77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
+ # <final> 062B 0632
+FC78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM
+ # <final> 062B 0645
+FC79 ARABIC LIGATURE THEH WITH NOON FINAL FORM
+ # <final> 062B 0646
+FC7A ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062B 0649
+FC7B ARABIC LIGATURE THEH WITH YEH FINAL FORM
+ # <final> 062B 064A
+FC7C ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0641 0649
+FC7D ARABIC LIGATURE FEH WITH YEH FINAL FORM
+ # <final> 0641 064A
+FC7E ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
+ # <final> 0642 0649
+FC7F ARABIC LIGATURE QAF WITH YEH FINAL FORM
+ # <final> 0642 064A
+FC80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM
+ # <final> 0643 0627
+FC81 ARABIC LIGATURE KAF WITH LAM FINAL FORM
+ # <final> 0643 0644
+FC82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM
+ # <final> 0643 0645
+FC83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
+ # <final> 0643 0649
+FC84 ARABIC LIGATURE KAF WITH YEH FINAL FORM
+ # <final> 0643 064A
+FC85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM
+ # <final> 0644 0645
+FC86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0644 0649
+FC87 ARABIC LIGATURE LAM WITH YEH FINAL FORM
+ # <final> 0644 064A
+FC88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
+ # <final> 0645 0627
+FC89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
+ # <final> 0645 0645
+FC8A ARABIC LIGATURE NOON WITH REH FINAL FORM
+ # <final> 0646 0631
+FC8B ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
+ # <final> 0646 0632
+FC8C ARABIC LIGATURE NOON WITH MEEM FINAL FORM
+ # <final> 0646 0645
+FC8D ARABIC LIGATURE NOON WITH NOON FINAL FORM
+ # <final> 0646 0646
+FC8E ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 0649
+FC8F ARABIC LIGATURE NOON WITH YEH FINAL FORM
+ # <final> 0646 064A
+FC90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
+ # <final> 0649 0670
+FC91 ARABIC LIGATURE YEH WITH REH FINAL FORM
+ # <final> 064A 0631
+FC92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
+ # <final> 064A 0632
+FC93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM
+ # <final> 064A 0645
+FC94 ARABIC LIGATURE YEH WITH NOON FINAL FORM
+ # <final> 064A 0646
+FC95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
+ # <final> 064A 0649
+FC96 ARABIC LIGATURE YEH WITH YEH FINAL FORM
+ # <final> 064A 064A
+FC97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
+ # <initial> 0626 062C
+FC98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
+ # <initial> 0626 062D
+FC99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
+ # <initial> 0626 062E
+FC9A ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
+ # <initial> 0626 0645
+FC9B ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
+ # <initial> 0626 0647
+FC9C ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
+ # <initial> 0628 062C
+FC9D ARABIC LIGATURE BEH WITH HAH INITIAL FORM
+ # <initial> 0628 062D
+FC9E ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
+ # <initial> 0628 062E
+FC9F ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
+ # <initial> 0628 0645
+FCA0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM
+ # <initial> 0628 0647
+FCA1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
+ # <initial> 062A 062C
+FCA2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM
+ # <initial> 062A 062D
+FCA3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
+ # <initial> 062A 062E
+FCA4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
+ # <initial> 062A 0645
+FCA5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM
+ # <initial> 062A 0647
+FCA6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
+ # <initial> 062B 0645
+FCA7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
+ # <initial> 062C 062D
+FCA8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
+ # <initial> 062C 0645
+FCA9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
+ # <initial> 062D 062C
+FCAA ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
+ # <initial> 062D 0645
+FCAB ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
+ # <initial> 062E 062C
+FCAC ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
+ # <initial> 062E 0645
+FCAD ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
+ # <initial> 0633 062C
+FCAE ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
+ # <initial> 0633 062D
+FCAF ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
+ # <initial> 0633 062E
+FCB0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
+ # <initial> 0633 0645
+FCB1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM
+ # <initial> 0635 062D
+FCB2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
+ # <initial> 0635 062E
+FCB3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
+ # <initial> 0635 0645
+FCB4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
+ # <initial> 0636 062C
+FCB5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM
+ # <initial> 0636 062D
+FCB6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
+ # <initial> 0636 062E
+FCB7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
+ # <initial> 0636 0645
+FCB8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM
+ # <initial> 0637 062D
+FCB9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
+ # <initial> 0638 0645
+FCBA ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
+ # <initial> 0639 062C
+FCBB ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
+ # <initial> 0639 0645
+FCBC ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
+ # <initial> 063A 062C
+FCBD ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
+ # <initial> 063A 0645
+FCBE ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
+ # <initial> 0641 062C
+FCBF ARABIC LIGATURE FEH WITH HAH INITIAL FORM
+ # <initial> 0641 062D
+FCC0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
+ # <initial> 0641 062E
+FCC1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
+ # <initial> 0641 0645
+FCC2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM
+ # <initial> 0642 062D
+FCC3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
+ # <initial> 0642 0645
+FCC4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
+ # <initial> 0643 062C
+FCC5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM
+ # <initial> 0643 062D
+FCC6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
+ # <initial> 0643 062E
+FCC7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM
+ # <initial> 0643 0644
+FCC8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
+ # <initial> 0643 0645
+FCC9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
+ # <initial> 0644 062C
+FCCA ARABIC LIGATURE LAM WITH HAH INITIAL FORM
+ # <initial> 0644 062D
+FCCB ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
+ # <initial> 0644 062E
+FCCC ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
+ # <initial> 0644 0645
+FCCD ARABIC LIGATURE LAM WITH HEH INITIAL FORM
+ # <initial> 0644 0647
+FCCE ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
+ # <initial> 0645 062C
+FCCF ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
+ # <initial> 0645 062D
+FCD0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
+ # <initial> 0645 062E
+FCD1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
+ # <initial> 0645 0645
+FCD2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
+ # <initial> 0646 062C
+FCD3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM
+ # <initial> 0646 062D
+FCD4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
+ # <initial> 0646 062E
+FCD5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
+ # <initial> 0646 0645
+FCD6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM
+ # <initial> 0646 0647
+FCD7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
+ # <initial> 0647 062C
+FCD8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
+ # <initial> 0647 0645
+FCD9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
+ # <initial> 0647 0670
+FCDA ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
+ # <initial> 064A 062C
+FCDB ARABIC LIGATURE YEH WITH HAH INITIAL FORM
+ # <initial> 064A 062D
+FCDC ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
+ # <initial> 064A 062E
+FCDD ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
+ # <initial> 064A 0645
+FCDE ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+ # <initial> 064A 0647
+FCDF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
+ # <medial> 0626 0645
+FCE0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
+ # <medial> 0626 0647
+FCE1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
+ # <medial> 0628 0645
+FCE2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
+ # <medial> 0628 0647
+FCE3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
+ # <medial> 062A 0645
+FCE4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
+ # <medial> 062A 0647
+FCE5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
+ # <medial> 062B 0645
+FCE6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
+ # <medial> 062B 0647
+FCE7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
+ # <medial> 0633 0645
+FCE8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
+ # <medial> 0633 0647
+FCE9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
+ # <medial> 0634 0645
+FCEA ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
+ # <medial> 0634 0647
+FCEB ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
+ # <medial> 0643 0644
+FCEC ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
+ # <medial> 0643 0645
+FCED ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
+ # <medial> 0644 0645
+FCEE ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
+ # <medial> 0646 0645
+FCEF ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
+ # <medial> 0646 0647
+FCF0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
+ # <medial> 064A 0645
+FCF1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
+ # <medial> 064A 0647
+FCF2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
+ # <medial> 0640 064E 0651
+FCF3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
+ # <medial> 0640 064F 0651
+FCF4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+ # <medial> 0640 0650 0651
+FCF5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0637 0649
+FCF6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
+ # <isolated> 0637 064A
+FCF7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0639 0649
+FCF8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
+ # <isolated> 0639 064A
+FCF9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 063A 0649
+FCFA ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
+ # <isolated> 063A 064A
+FCFB ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0633 0649
+FCFC ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
+ # <isolated> 0633 064A
+FCFD ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0634 0649
+FCFE ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
+ # <isolated> 0634 064A
+FCFF ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062D 0649
+FD00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
+ # <isolated> 062D 064A
+FD01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062C 0649
+FD02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
+ # <isolated> 062C 064A
+FD03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 062E 0649
+FD04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
+ # <isolated> 062E 064A
+FD05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0635 0649
+FD06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
+ # <isolated> 0635 064A
+FD07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0636 0649
+FD08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
+ # <isolated> 0636 064A
+FD09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
+ # <isolated> 0634 062C
+FD0A ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
+ # <isolated> 0634 062D
+FD0B ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
+ # <isolated> 0634 062E
+FD0C ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
+ # <isolated> 0634 0645
+FD0D ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
+ # <isolated> 0634 0631
+FD0E ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
+ # <isolated> 0633 0631
+FD0F ARABIC LIGATURE SAD WITH REH ISOLATED FORM
+ # <isolated> 0635 0631
+FD10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+ # <isolated> 0636 0631
+FD11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0637 0649
+FD12 ARABIC LIGATURE TAH WITH YEH FINAL FORM
+ # <final> 0637 064A
+FD13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
+ # <final> 0639 0649
+FD14 ARABIC LIGATURE AIN WITH YEH FINAL FORM
+ # <final> 0639 064A
+FD15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
+ # <final> 063A 0649
+FD16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
+ # <final> 063A 064A
+FD17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
+ # <final> 0633 0649
+FD18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM
+ # <final> 0633 064A
+FD19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
+ # <final> 0634 0649
+FD1A ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
+ # <final> 0634 064A
+FD1B ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062D 0649
+FD1C ARABIC LIGATURE HAH WITH YEH FINAL FORM
+ # <final> 062D 064A
+FD1D ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062C 0649
+FD1E ARABIC LIGATURE JEEM WITH YEH FINAL FORM
+ # <final> 062C 064A
+FD1F ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062E 0649
+FD20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM
+ # <final> 062E 064A
+FD21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
+ # <final> 0635 0649
+FD22 ARABIC LIGATURE SAD WITH YEH FINAL FORM
+ # <final> 0635 064A
+FD23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
+ # <final> 0636 0649
+FD24 ARABIC LIGATURE DAD WITH YEH FINAL FORM
+ # <final> 0636 064A
+FD25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
+ # <final> 0634 062C
+FD26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
+ # <final> 0634 062D
+FD27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
+ # <final> 0634 062E
+FD28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
+ # <final> 0634 0645
+FD29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM
+ # <final> 0634 0631
+FD2A ARABIC LIGATURE SEEN WITH REH FINAL FORM
+ # <final> 0633 0631
+FD2B ARABIC LIGATURE SAD WITH REH FINAL FORM
+ # <final> 0635 0631
+FD2C ARABIC LIGATURE DAD WITH REH FINAL FORM
+ # <final> 0636 0631
+FD2D ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
+ # <initial> 0634 062C
+FD2E ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
+ # <initial> 0634 062D
+FD2F ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
+ # <initial> 0634 062E
+FD30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
+ # <initial> 0634 0645
+FD31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
+ # <initial> 0633 0647
+FD32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
+ # <initial> 0634 0647
+FD33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+ # <initial> 0637 0645
+FD34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
+ # <medial> 0633 062C
+FD35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
+ # <medial> 0633 062D
+FD36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
+ # <medial> 0633 062E
+FD37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
+ # <medial> 0634 062C
+FD38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
+ # <medial> 0634 062D
+FD39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
+ # <medial> 0634 062E
+FD3A ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
+ # <medial> 0637 0645
+FD3B ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+ # <medial> 0638 0645
+FD3C ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+ # <final> 0627 064B
+FD3D ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+ # <isolated> 0627 064B
+@ Punctuation
+FD3E ORNATE LEFT PARENTHESIS
+FD3F ORNATE RIGHT PARENTHESIS
+@ Ligatures (three elements)
+FD50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 062A 062C 0645
+FD51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+ # <final> 062A 062D 062C
+FD52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
+ # <initial> 062A 062D 062C
+FD53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 062A 062D 0645
+FD54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 062A 062E 0645
+FD55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
+ # <initial> 062A 0645 062C
+FD56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 062A 0645 062D
+FD57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+ # <initial> 062A 0645 062E
+FD58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+ # <final> 062C 0645 062D
+FD59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 062C 0645 062D
+FD5A ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
+ # <final> 062D 0645 064A
+FD5B ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062D 0645 0649
+FD5C ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
+ # <initial> 0633 062D 062C
+FD5D ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+ # <initial> 0633 062C 062D
+FD5E ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0633 062C 0649
+FD5F ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+ # <final> 0633 0645 062D
+FD60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0633 0645 062D
+FD61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+ # <initial> 0633 0645 062C
+FD62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0633 0645 0645
+FD63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0633 0645 0645
+FD64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+ # <final> 0635 062D 062D
+FD65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+ # <initial> 0635 062D 062D
+FD66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0635 0645 0645
+FD67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+ # <final> 0634 062D 0645
+FD68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0634 062D 0645
+FD69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
+ # <final> 0634 062C 064A
+FD6A ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+ # <final> 0634 0645 062E
+FD6B ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+ # <initial> 0634 0645 062E
+FD6C ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0634 0645 0645
+FD6D ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0634 0645 0645
+FD6E ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0636 062D 0649
+FD6F ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+ # <final> 0636 062E 0645
+FD70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0636 062E 0645
+FD71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+ # <final> 0637 0645 062D
+FD72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0637 0645 062D
+FD73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0637 0645 0645
+FD74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
+ # <final> 0637 0645 064A
+FD75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
+ # <final> 0639 062C 0645
+FD76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0639 0645 0645
+FD77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0639 0645 0645
+FD78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0639 0645 0649
+FD79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
+ # <final> 063A 0645 0645
+FD7A ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
+ # <final> 063A 0645 064A
+FD7B ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 063A 0645 0649
+FD7C ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+ # <final> 0641 062E 0645
+FD7D ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0641 062E 0645
+FD7E ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
+ # <final> 0642 0645 062D
+FD7F ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0642 0645 0645
+FD80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
+ # <final> 0644 062D 0645
+FD81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
+ # <final> 0644 062D 064A
+FD82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0644 062D 0649
+FD83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+ # <initial> 0644 062C 062C
+FD84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
+ # <final> 0644 062C 062C
+FD85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+ # <final> 0644 062E 0645
+FD86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0644 062E 0645
+FD87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+ # <final> 0644 0645 062D
+FD88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0644 0645 062D
+FD89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
+ # <initial> 0645 062D 062C
+FD8A ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0645 062D 0645
+FD8B ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+ # <final> 0645 062D 064A
+FD8C ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
+ # <initial> 0645 062C 062D
+FD8D ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0645 062C 0645
+FD8E ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
+ # <initial> 0645 062E 062C
+FD8F ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+ # <initial> 0645 062E 0645
+FD92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
+ # <initial> 0645 062C 062E
+FD93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
+ # <initial> 0647 0645 062C
+FD94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0647 0645 0645
+FD95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0646 062D 0645
+FD96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 062D 0649
+FD97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+ # <final> 0646 062C 0645
+FD98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0646 062C 0645
+FD99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 062C 0649
+FD9A ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
+ # <final> 0646 0645 064A
+FD9B ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 0646 0645 0649
+FD9C ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+ # <final> 064A 0645 0645
+FD9D ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 064A 0645 0645
+FD9E ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
+ # <final> 0628 062E 064A
+FD9F ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
+ # <final> 062A 062C 064A
+FDA0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 062C 0649
+FDA1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
+ # <final> 062A 062E 064A
+FDA2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 062E 0649
+FDA3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
+ # <final> 062A 0645 064A
+FDA4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062A 0645 0649
+FDA5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
+ # <final> 062C 0645 064A
+FDA6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 062C 062D 0649
+FDA7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
+ # <final> 062C 0645 0649
+FDA8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
+ # <final> 0633 062E 0649
+FDA9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
+ # <final> 0635 062D 064A
+FDAA ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
+ # <final> 0634 062D 064A
+FDAB ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
+ # <final> 0636 062D 064A
+FDAC ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
+ # <final> 0644 062C 064A
+FDAD ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
+ # <final> 0644 0645 064A
+FDAE ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
+ # <final> 064A 062D 064A
+FDAF ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
+ # <final> 064A 062C 064A
+FDB0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
+ # <final> 064A 0645 064A
+FDB1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
+ # <final> 0645 0645 064A
+FDB2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
+ # <final> 0642 0645 064A
+FDB3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+ # <final> 0646 062D 064A
+FDB4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
+ # <initial> 0642 0645 062D
+FDB5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+ # <initial> 0644 062D 0645
+FDB6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
+ # <final> 0639 0645 064A
+FDB7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+ # <final> 0643 0645 064A
+FDB8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+ # <initial> 0646 062C 062D
+FDB9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+ # <final> 0645 062E 064A
+FDBA ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0644 062C 0645
+FDBB ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
+ # <final> 0643 0645 0645
+FDBC ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
+ # <final> 0644 062C 0645
+FDBD ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
+ # <final> 0646 062C 062D
+FDBE ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
+ # <final> 062C 062D 064A
+FDBF ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
+ # <final> 062D 062C 064A
+FDC0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
+ # <final> 0645 062C 064A
+FDC1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
+ # <final> 0641 0645 064A
+FDC2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+ # <final> 0628 062D 064A
+FDC3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0643 0645 0645
+FDC4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
+ # <initial> 0639 062C 0645
+FDC5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+ # <initial> 0635 0645 0645
+FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
+ # <final> 0633 062E 064A
+FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+ # <final> 0646 062C 064A
+@ Word ligatures
+FDF0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
+ # <isolated> 0635 0644 06D2
+FDF1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
+ # <isolated> 0642 0644 06D2
+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM
+ # <isolated> 0627 0644 0644 0647
+FDF3 ARABIC LIGATURE AKBAR ISOLATED FORM
+ # <isolated> 0627 0643 0628 0631
+FDF4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM
+ # <isolated> 0645 062D 0645 062F
+FDF5 ARABIC LIGATURE SALAM ISOLATED FORM
+ # <isolated> 0635 0644 0639 0645
+FDF6 ARABIC LIGATURE RASOUL ISOLATED FORM
+ # <isolated> 0631 0633 0648 0644
+FDF7 ARABIC LIGATURE ALAYHE ISOLATED FORM
+ # <isolated> 0639 0644 064A 0647
+FDF8 ARABIC LIGATURE WASALLAM ISOLATED FORM
+ # <isolated> 0648 0633 0644 0645
+FDF9 ARABIC LIGATURE SALLA ISOLATED FORM
+ # <isolated> 0635 0644 0649
+FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
+ # <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645
+FDFB ARABIC LIGATURE JALLAJALALOUHOU
+ # <isolated> 062C 0644 0020 062C 0644 0627 0644 0647
+@@ FE20 Combining Half Marks FE2F
+@ Combining half marks
+FE20 COMBINING LIGATURE LEFT HALF
+FE21 COMBINING LIGATURE RIGHT HALF
+FE22 COMBINING DOUBLE TILDE LEFT HALF
+FE23 COMBINING DOUBLE TILDE RIGHT HALF
+@@ FE30 CJK Compatibility Forms FE4F
+@ Glyphs for vertical variants
+FE30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ # <vertical> 2025
+FE31 PRESENTATION FORM FOR VERTICAL EM DASH
+ # <vertical> 2014
+FE32 PRESENTATION FORM FOR VERTICAL EN DASH
+ # <vertical> 2013
+FE33 PRESENTATION FORM FOR VERTICAL LOW LINE
+ # <vertical> 005F
+FE34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+ # <vertical> 005F
+FE35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ # <vertical> 0028
+FE36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ # <vertical> 0029
+FE37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ # <vertical> 007B
+FE38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ # <vertical> 007D
+FE39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ # <vertical> 3014
+FE3A PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ # <vertical> 3015
+FE3B PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ # <vertical> 3010
+FE3C PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ # <vertical> 3011
+FE3D PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ # <vertical> 300A
+FE3E PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ # <vertical> 300B
+FE3F PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ # <vertical> 3008
+FE40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ # <vertical> 3009
+FE41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ # <vertical> 300C
+FE42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ # <vertical> 300D
+FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ # <vertical> 300E
+FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ # <vertical> 300F
+@ Overscores and underscores
+FE49 DASHED OVERLINE
+ # 203E overline
+FE4A CENTRELINE OVERLINE
+ # 203E overline
+FE4B WAVY OVERLINE
+ # 203E overline
+FE4C DOUBLE WAVY OVERLINE
+ # 203E overline
+FE4D DASHED LOW LINE
+ # 005F low line
+FE4E CENTRELINE LOW LINE
+ # 005F low line
+FE4F WAVY LOW LINE
+ # 005F low line
+@@ FE50 Small Form Variants FE6F
+@ Small form variants
+FE50 SMALL COMMA
+ # <small> 002C
+FE51 SMALL IDEOGRAPHIC COMMA
+ # <small> 3001
+FE52 SMALL FULL STOP
+ # <small> 002E
+FE53 <reserved>
+ x (middle dot - 00B7)
+FE54 SMALL SEMICOLON
+ # <small> 003B
+FE55 SMALL COLON
+ # <small> 003A
+FE56 SMALL QUESTION MARK
+ # <small> 003F
+FE57 SMALL EXCLAMATION MARK
+ # <small> 0021
+FE58 SMALL EM DASH
+ # <small> 2014
+FE59 SMALL LEFT PARENTHESIS
+ # <small> 0028
+FE5A SMALL RIGHT PARENTHESIS
+ # <small> 0029
+FE5B SMALL LEFT CURLY BRACKET
+ # <small> 007B
+FE5C SMALL RIGHT CURLY BRACKET
+ # <small> 007D
+FE5D SMALL LEFT TORTOISE SHELL BRACKET
+ # <small> 3014
+FE5E SMALL RIGHT TORTOISE SHELL BRACKET
+ # <small> 3015
+FE5F SMALL NUMBER SIGN
+ # <small> 0023
+FE60 SMALL AMPERSAND
+ # <small> 0026
+FE61 SMALL ASTERISK
+ # <small> 002A
+FE62 SMALL PLUS SIGN
+ # <small> 002B
+FE63 SMALL HYPHEN-MINUS
+ # <small> 002D
+FE64 SMALL LESS-THAN SIGN
+ # <small> 003C
+FE65 SMALL GREATER-THAN SIGN
+ # <small> 003E
+FE66 SMALL EQUALS SIGN
+ # <small> 003D
+FE67 <reserved>
+ x (division slash - 2215)
+FE68 SMALL REVERSE SOLIDUS
+ # <small> 005C
+FE69 SMALL DOLLAR SIGN
+ # <small> 0024
+FE6A SMALL PERCENT SIGN
+ # <small> 0025
+FE6B SMALL COMMERCIAL AT
+ # <small> 0040
+@@ FE70 Arabic Presentation Forms-B FEFF
+@ Glyphs for spacing forms of Arabic points
+FE70 ARABIC FATHATAN ISOLATED FORM
+ # <isolated> 0020 064B
+FE71 ARABIC TATWEEL WITH FATHATAN ABOVE
+ # <medial> 0640 064B
+FE72 ARABIC DAMMATAN ISOLATED FORM
+ # <isolated> 0020 064C
+FE74 ARABIC KASRATAN ISOLATED FORM
+ # <isolated> 0020 064D
+FE76 ARABIC FATHA ISOLATED FORM
+ # <isolated> 0020 064E
+FE77 ARABIC FATHA MEDIAL FORM
+ # <medial> 0640 064E
+FE78 ARABIC DAMMA ISOLATED FORM
+ # <isolated> 0020 064F
+FE79 ARABIC DAMMA MEDIAL FORM
+ # <medial> 0640 064F
+FE7A ARABIC KASRA ISOLATED FORM
+ # <isolated> 0020 0650
+FE7B ARABIC KASRA MEDIAL FORM
+ # <medial> 0640 0650
+FE7C ARABIC SHADDA ISOLATED FORM
+ # <isolated> 0020 0651
+FE7D ARABIC SHADDA MEDIAL FORM
+ # <medial> 0640 0651
+FE7E ARABIC SUKUN ISOLATED FORM
+ # <isolated> 0020 0652
+FE7F ARABIC SUKUN MEDIAL FORM
+ # <medial> 0640 0652
+@ Basic glyphs for Arabic language contextual forms
+FE80 ARABIC LETTER HAMZA ISOLATED FORM
+ # <isolated> 0621
+FE81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+ # <isolated> 0622
+FE82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+ # <final> 0622
+FE83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0623
+FE84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+ # <final> 0623
+FE85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0624
+FE86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+ # <final> 0624
+FE87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+ # <isolated> 0625
+FE88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+ # <final> 0625
+FE89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0626
+FE8A ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+ # <final> 0626
+FE8B ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+ # <initial> 0626
+FE8C ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+ # <medial> 0626
+FE8D ARABIC LETTER ALEF ISOLATED FORM
+ # <isolated> 0627
+FE8E ARABIC LETTER ALEF FINAL FORM
+ # <final> 0627
+FE8F ARABIC LETTER BEH ISOLATED FORM
+ # <isolated> 0628
+FE90 ARABIC LETTER BEH FINAL FORM
+ # <final> 0628
+FE91 ARABIC LETTER BEH INITIAL FORM
+ # <initial> 0628
+FE92 ARABIC LETTER BEH MEDIAL FORM
+ # <medial> 0628
+FE93 ARABIC LETTER TEH MARBUTA ISOLATED FORM
+ # <isolated> 0629
+FE94 ARABIC LETTER TEH MARBUTA FINAL FORM
+ # <final> 0629
+FE95 ARABIC LETTER TEH ISOLATED FORM
+ # <isolated> 062A
+FE96 ARABIC LETTER TEH FINAL FORM
+ # <final> 062A
+FE97 ARABIC LETTER TEH INITIAL FORM
+ # <initial> 062A
+FE98 ARABIC LETTER TEH MEDIAL FORM
+ # <medial> 062A
+FE99 ARABIC LETTER THEH ISOLATED FORM
+ # <isolated> 062B
+FE9A ARABIC LETTER THEH FINAL FORM
+ # <final> 062B
+FE9B ARABIC LETTER THEH INITIAL FORM
+ # <initial> 062B
+FE9C ARABIC LETTER THEH MEDIAL FORM
+ # <medial> 062B
+FE9D ARABIC LETTER JEEM ISOLATED FORM
+ # <isolated> 062C
+FE9E ARABIC LETTER JEEM FINAL FORM
+ # <final> 062C
+FE9F ARABIC LETTER JEEM INITIAL FORM
+ # <initial> 062C
+FEA0 ARABIC LETTER JEEM MEDIAL FORM
+ # <medial> 062C
+FEA1 ARABIC LETTER HAH ISOLATED FORM
+ # <isolated> 062D
+FEA2 ARABIC LETTER HAH FINAL FORM
+ # <final> 062D
+FEA3 ARABIC LETTER HAH INITIAL FORM
+ # <initial> 062D
+FEA4 ARABIC LETTER HAH MEDIAL FORM
+ # <medial> 062D
+FEA5 ARABIC LETTER KHAH ISOLATED FORM
+ # <isolated> 062E
+FEA6 ARABIC LETTER KHAH FINAL FORM
+ # <final> 062E
+FEA7 ARABIC LETTER KHAH INITIAL FORM
+ # <initial> 062E
+FEA8 ARABIC LETTER KHAH MEDIAL FORM
+ # <medial> 062E
+FEA9 ARABIC LETTER DAL ISOLATED FORM
+ # <isolated> 062F
+FEAA ARABIC LETTER DAL FINAL FORM
+ # <final> 062F
+FEAB ARABIC LETTER THAL ISOLATED FORM
+ # <isolated> 0630
+FEAC ARABIC LETTER THAL FINAL FORM
+ # <final> 0630
+FEAD ARABIC LETTER REH ISOLATED FORM
+ # <isolated> 0631
+FEAE ARABIC LETTER REH FINAL FORM
+ # <final> 0631
+FEAF ARABIC LETTER ZAIN ISOLATED FORM
+ # <isolated> 0632
+FEB0 ARABIC LETTER ZAIN FINAL FORM
+ # <final> 0632
+FEB1 ARABIC LETTER SEEN ISOLATED FORM
+ # <isolated> 0633
+FEB2 ARABIC LETTER SEEN FINAL FORM
+ # <final> 0633
+FEB3 ARABIC LETTER SEEN INITIAL FORM
+ # <initial> 0633
+FEB4 ARABIC LETTER SEEN MEDIAL FORM
+ # <medial> 0633
+FEB5 ARABIC LETTER SHEEN ISOLATED FORM
+ # <isolated> 0634
+FEB6 ARABIC LETTER SHEEN FINAL FORM
+ # <final> 0634
+FEB7 ARABIC LETTER SHEEN INITIAL FORM
+ # <initial> 0634
+FEB8 ARABIC LETTER SHEEN MEDIAL FORM
+ # <medial> 0634
+FEB9 ARABIC LETTER SAD ISOLATED FORM
+ # <isolated> 0635
+FEBA ARABIC LETTER SAD FINAL FORM
+ # <final> 0635
+FEBB ARABIC LETTER SAD INITIAL FORM
+ # <initial> 0635
+FEBC ARABIC LETTER SAD MEDIAL FORM
+ # <medial> 0635
+FEBD ARABIC LETTER DAD ISOLATED FORM
+ # <isolated> 0636
+FEBE ARABIC LETTER DAD FINAL FORM
+ # <final> 0636
+FEBF ARABIC LETTER DAD INITIAL FORM
+ # <initial> 0636
+FEC0 ARABIC LETTER DAD MEDIAL FORM
+ # <medial> 0636
+FEC1 ARABIC LETTER TAH ISOLATED FORM
+ # <isolated> 0637
+FEC2 ARABIC LETTER TAH FINAL FORM
+ # <final> 0637
+FEC3 ARABIC LETTER TAH INITIAL FORM
+ # <initial> 0637
+FEC4 ARABIC LETTER TAH MEDIAL FORM
+ # <medial> 0637
+FEC5 ARABIC LETTER ZAH ISOLATED FORM
+ # <isolated> 0638
+FEC6 ARABIC LETTER ZAH FINAL FORM
+ # <final> 0638
+FEC7 ARABIC LETTER ZAH INITIAL FORM
+ # <initial> 0638
+FEC8 ARABIC LETTER ZAH MEDIAL FORM
+ # <medial> 0638
+FEC9 ARABIC LETTER AIN ISOLATED FORM
+ # <isolated> 0639
+FECA ARABIC LETTER AIN FINAL FORM
+ # <final> 0639
+FECB ARABIC LETTER AIN INITIAL FORM
+ # <initial> 0639
+FECC ARABIC LETTER AIN MEDIAL FORM
+ # <medial> 0639
+FECD ARABIC LETTER GHAIN ISOLATED FORM
+ # <isolated> 063A
+FECE ARABIC LETTER GHAIN FINAL FORM
+ # <final> 063A
+FECF ARABIC LETTER GHAIN INITIAL FORM
+ # <initial> 063A
+FED0 ARABIC LETTER GHAIN MEDIAL FORM
+ # <medial> 063A
+FED1 ARABIC LETTER FEH ISOLATED FORM
+ # <isolated> 0641
+FED2 ARABIC LETTER FEH FINAL FORM
+ # <final> 0641
+FED3 ARABIC LETTER FEH INITIAL FORM
+ # <initial> 0641
+FED4 ARABIC LETTER FEH MEDIAL FORM
+ # <medial> 0641
+FED5 ARABIC LETTER QAF ISOLATED FORM
+ # <isolated> 0642
+FED6 ARABIC LETTER QAF FINAL FORM
+ # <final> 0642
+FED7 ARABIC LETTER QAF INITIAL FORM
+ # <initial> 0642
+FED8 ARABIC LETTER QAF MEDIAL FORM
+ # <medial> 0642
+FED9 ARABIC LETTER KAF ISOLATED FORM
+ # <isolated> 0643
+FEDA ARABIC LETTER KAF FINAL FORM
+ # <final> 0643
+FEDB ARABIC LETTER KAF INITIAL FORM
+ # <initial> 0643
+FEDC ARABIC LETTER KAF MEDIAL FORM
+ # <medial> 0643
+FEDD ARABIC LETTER LAM ISOLATED FORM
+ # <isolated> 0644
+FEDE ARABIC LETTER LAM FINAL FORM
+ # <final> 0644
+FEDF ARABIC LETTER LAM INITIAL FORM
+ # <initial> 0644
+FEE0 ARABIC LETTER LAM MEDIAL FORM
+ # <medial> 0644
+FEE1 ARABIC LETTER MEEM ISOLATED FORM
+ # <isolated> 0645
+FEE2 ARABIC LETTER MEEM FINAL FORM
+ # <final> 0645
+FEE3 ARABIC LETTER MEEM INITIAL FORM
+ # <initial> 0645
+FEE4 ARABIC LETTER MEEM MEDIAL FORM
+ # <medial> 0645
+FEE5 ARABIC LETTER NOON ISOLATED FORM
+ # <isolated> 0646
+FEE6 ARABIC LETTER NOON FINAL FORM
+ # <final> 0646
+FEE7 ARABIC LETTER NOON INITIAL FORM
+ # <initial> 0646
+FEE8 ARABIC LETTER NOON MEDIAL FORM
+ # <medial> 0646
+FEE9 ARABIC LETTER HEH ISOLATED FORM
+ # <isolated> 0647
+FEEA ARABIC LETTER HEH FINAL FORM
+ # <final> 0647
+FEEB ARABIC LETTER HEH INITIAL FORM
+ # <initial> 0647
+FEEC ARABIC LETTER HEH MEDIAL FORM
+ # <medial> 0647
+FEED ARABIC LETTER WAW ISOLATED FORM
+ # <isolated> 0648
+FEEE ARABIC LETTER WAW FINAL FORM
+ # <final> 0648
+FEEF ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+ # <isolated> 0649
+FEF0 ARABIC LETTER ALEF MAKSURA FINAL FORM
+ # <final> 0649
+FEF1 ARABIC LETTER YEH ISOLATED FORM
+ # <isolated> 064A
+FEF2 ARABIC LETTER YEH FINAL FORM
+ # <final> 064A
+FEF3 ARABIC LETTER YEH INITIAL FORM
+ # <initial> 064A
+FEF4 ARABIC LETTER YEH MEDIAL FORM
+ # <medial> 064A
+FEF5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+ # <isolated> 0644 0622
+FEF6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+ # <final> 0644 0622
+FEF7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+ # <isolated> 0644 0623
+FEF8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+ # <final> 0644 0623
+FEF9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+ # <isolated> 0644 0625
+FEFA ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+ # <final> 0644 0625
+FEFB ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ # <isolated> 0644 0627
+FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+ # <final> 0644 0627
+@ Special
+FEFF ZERO WIDTH NO-BREAK SPACE
+ = BYTE ORDER MARK (BOM)
+ * may be used to detect byte order by contrast with FFFE which is not a character
+ x (<not a character> - FFFE)
+ x (zero width space - 200B)
+@@ FF00 Halfwidth and Fullwidth Forms FFEF
+@ Fullwidth ASCII variants
+@+ See ASCII 0020 - 007E
+FF01 FULLWIDTH EXCLAMATION MARK
+ # <wide> 0021
+FF02 FULLWIDTH QUOTATION MARK
+ # <wide> 0022
+FF03 FULLWIDTH NUMBER SIGN
+ # <wide> 0023
+FF04 FULLWIDTH DOLLAR SIGN
+ # <wide> 0024
+FF05 FULLWIDTH PERCENT SIGN
+ # <wide> 0025
+FF06 FULLWIDTH AMPERSAND
+ # <wide> 0026
+FF07 FULLWIDTH APOSTROPHE
+ # <wide> 0027
+FF08 FULLWIDTH LEFT PARENTHESIS
+ # <wide> 0028
+FF09 FULLWIDTH RIGHT PARENTHESIS
+ # <wide> 0029
+FF0A FULLWIDTH ASTERISK
+ # <wide> 002A
+FF0B FULLWIDTH PLUS SIGN
+ # <wide> 002B
+FF0C FULLWIDTH COMMA
+ # <wide> 002C
+FF0D FULLWIDTH HYPHEN-MINUS
+ # <wide> 002D
+FF0E FULLWIDTH FULL STOP
+ # <wide> 002E
+FF0F FULLWIDTH SOLIDUS
+ # <wide> 002F
+FF10 FULLWIDTH DIGIT ZERO
+ # <wide> 0030
+FF11 FULLWIDTH DIGIT ONE
+ # <wide> 0031
+FF12 FULLWIDTH DIGIT TWO
+ # <wide> 0032
+FF13 FULLWIDTH DIGIT THREE
+ # <wide> 0033
+FF14 FULLWIDTH DIGIT FOUR
+ # <wide> 0034
+FF15 FULLWIDTH DIGIT FIVE
+ # <wide> 0035
+FF16 FULLWIDTH DIGIT SIX
+ # <wide> 0036
+FF17 FULLWIDTH DIGIT SEVEN
+ # <wide> 0037
+FF18 FULLWIDTH DIGIT EIGHT
+ # <wide> 0038
+FF19 FULLWIDTH DIGIT NINE
+ # <wide> 0039
+FF1A FULLWIDTH COLON
+ # <wide> 003A
+FF1B FULLWIDTH SEMICOLON
+ # <wide> 003B
+FF1C FULLWIDTH LESS-THAN SIGN
+ # <wide> 003C
+FF1D FULLWIDTH EQUALS SIGN
+ # <wide> 003D
+FF1E FULLWIDTH GREATER-THAN SIGN
+ # <wide> 003E
+FF1F FULLWIDTH QUESTION MARK
+ # <wide> 003F
+FF20 FULLWIDTH COMMERCIAL AT
+ # <wide> 0040
+FF21 FULLWIDTH LATIN CAPITAL LETTER A
+ # <wide> 0041
+FF22 FULLWIDTH LATIN CAPITAL LETTER B
+ # <wide> 0042
+FF23 FULLWIDTH LATIN CAPITAL LETTER C
+ # <wide> 0043
+FF24 FULLWIDTH LATIN CAPITAL LETTER D
+ # <wide> 0044
+FF25 FULLWIDTH LATIN CAPITAL LETTER E
+ # <wide> 0045
+FF26 FULLWIDTH LATIN CAPITAL LETTER F
+ # <wide> 0046
+FF27 FULLWIDTH LATIN CAPITAL LETTER G
+ # <wide> 0047
+FF28 FULLWIDTH LATIN CAPITAL LETTER H
+ # <wide> 0048
+FF29 FULLWIDTH LATIN CAPITAL LETTER I
+ # <wide> 0049
+FF2A FULLWIDTH LATIN CAPITAL LETTER J
+ # <wide> 004A
+FF2B FULLWIDTH LATIN CAPITAL LETTER K
+ # <wide> 004B
+FF2C FULLWIDTH LATIN CAPITAL LETTER L
+ # <wide> 004C
+FF2D FULLWIDTH LATIN CAPITAL LETTER M
+ # <wide> 004D
+FF2E FULLWIDTH LATIN CAPITAL LETTER N
+ # <wide> 004E
+FF2F FULLWIDTH LATIN CAPITAL LETTER O
+ # <wide> 004F
+FF30 FULLWIDTH LATIN CAPITAL LETTER P
+ # <wide> 0050
+FF31 FULLWIDTH LATIN CAPITAL LETTER Q
+ # <wide> 0051
+FF32 FULLWIDTH LATIN CAPITAL LETTER R
+ # <wide> 0052
+FF33 FULLWIDTH LATIN CAPITAL LETTER S
+ # <wide> 0053
+FF34 FULLWIDTH LATIN CAPITAL LETTER T
+ # <wide> 0054
+FF35 FULLWIDTH LATIN CAPITAL LETTER U
+ # <wide> 0055
+FF36 FULLWIDTH LATIN CAPITAL LETTER V
+ # <wide> 0056
+FF37 FULLWIDTH LATIN CAPITAL LETTER W
+ # <wide> 0057
+FF38 FULLWIDTH LATIN CAPITAL LETTER X
+ # <wide> 0058
+FF39 FULLWIDTH LATIN CAPITAL LETTER Y
+ # <wide> 0059
+FF3A FULLWIDTH LATIN CAPITAL LETTER Z
+ # <wide> 005A
+FF3B FULLWIDTH LEFT SQUARE BRACKET
+ # <wide> 005B
+FF3C FULLWIDTH REVERSE SOLIDUS
+ # <wide> 005C
+FF3D FULLWIDTH RIGHT SQUARE BRACKET
+ # <wide> 005D
+FF3E FULLWIDTH CIRCUMFLEX ACCENT
+ # <wide> 005E
+FF3F FULLWIDTH LOW LINE
+ # <wide> 005F
+FF40 FULLWIDTH GRAVE ACCENT
+ # <wide> 0060
+FF41 FULLWIDTH LATIN SMALL LETTER A
+ # <wide> 0061
+FF42 FULLWIDTH LATIN SMALL LETTER B
+ # <wide> 0062
+FF43 FULLWIDTH LATIN SMALL LETTER C
+ # <wide> 0063
+FF44 FULLWIDTH LATIN SMALL LETTER D
+ # <wide> 0064
+FF45 FULLWIDTH LATIN SMALL LETTER E
+ # <wide> 0065
+FF46 FULLWIDTH LATIN SMALL LETTER F
+ # <wide> 0066
+FF47 FULLWIDTH LATIN SMALL LETTER G
+ # <wide> 0067
+FF48 FULLWIDTH LATIN SMALL LETTER H
+ # <wide> 0068
+FF49 FULLWIDTH LATIN SMALL LETTER I
+ # <wide> 0069
+FF4A FULLWIDTH LATIN SMALL LETTER J
+ # <wide> 006A
+FF4B FULLWIDTH LATIN SMALL LETTER K
+ # <wide> 006B
+FF4C FULLWIDTH LATIN SMALL LETTER L
+ # <wide> 006C
+FF4D FULLWIDTH LATIN SMALL LETTER M
+ # <wide> 006D
+FF4E FULLWIDTH LATIN SMALL LETTER N
+ # <wide> 006E
+FF4F FULLWIDTH LATIN SMALL LETTER O
+ # <wide> 006F
+FF50 FULLWIDTH LATIN SMALL LETTER P
+ # <wide> 0070
+FF51 FULLWIDTH LATIN SMALL LETTER Q
+ # <wide> 0071
+FF52 FULLWIDTH LATIN SMALL LETTER R
+ # <wide> 0072
+FF53 FULLWIDTH LATIN SMALL LETTER S
+ # <wide> 0073
+FF54 FULLWIDTH LATIN SMALL LETTER T
+ # <wide> 0074
+FF55 FULLWIDTH LATIN SMALL LETTER U
+ # <wide> 0075
+FF56 FULLWIDTH LATIN SMALL LETTER V
+ # <wide> 0076
+FF57 FULLWIDTH LATIN SMALL LETTER W
+ # <wide> 0077
+FF58 FULLWIDTH LATIN SMALL LETTER X
+ # <wide> 0078
+FF59 FULLWIDTH LATIN SMALL LETTER Y
+ # <wide> 0079
+FF5A FULLWIDTH LATIN SMALL LETTER Z
+ # <wide> 007A
+FF5B FULLWIDTH LEFT CURLY BRACKET
+ # <wide> 007B
+FF5C FULLWIDTH VERTICAL LINE
+ # <wide> 007C
+FF5D FULLWIDTH RIGHT CURLY BRACKET
+ # <wide> 007D
+FF5E FULLWIDTH TILDE
+ # <wide> 007E
+@ Halfwidth CJK punctuation
+@+ See CJK punctuation 3000 - 303F
+FF61 HALFWIDTH IDEOGRAPHIC FULL STOP
+ # <narrow> 3002
+FF62 HALFWIDTH LEFT CORNER BRACKET
+ # <narrow> 300C
+FF63 HALFWIDTH RIGHT CORNER BRACKET
+ # <narrow> 300D
+FF64 HALFWIDTH IDEOGRAPHIC COMMA
+ # <narrow> 3001
+@ Halfwidth Katakana variants
+@+ See Katakana 30A0 - 30FF
+FF65 HALFWIDTH KATAKANA MIDDLE DOT
+ # <narrow> 30FB
+FF66 HALFWIDTH KATAKANA LETTER WO
+ # <narrow> 30F2
+FF67 HALFWIDTH KATAKANA LETTER SMALL A
+ # <narrow> 30A1
+FF68 HALFWIDTH KATAKANA LETTER SMALL I
+ # <narrow> 30A3
+FF69 HALFWIDTH KATAKANA LETTER SMALL U
+ # <narrow> 30A5
+FF6A HALFWIDTH KATAKANA LETTER SMALL E
+ # <narrow> 30A7
+FF6B HALFWIDTH KATAKANA LETTER SMALL O
+ # <narrow> 30A9
+FF6C HALFWIDTH KATAKANA LETTER SMALL YA
+ # <narrow> 30E3
+FF6D HALFWIDTH KATAKANA LETTER SMALL YU
+ # <narrow> 30E5
+FF6E HALFWIDTH KATAKANA LETTER SMALL YO
+ # <narrow> 30E7
+FF6F HALFWIDTH KATAKANA LETTER SMALL TU
+ # <narrow> 30C3
+FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ # <narrow> 30FC
+FF71 HALFWIDTH KATAKANA LETTER A
+ # <narrow> 30A2
+FF72 HALFWIDTH KATAKANA LETTER I
+ # <narrow> 30A4
+FF73 HALFWIDTH KATAKANA LETTER U
+ # <narrow> 30A6
+FF74 HALFWIDTH KATAKANA LETTER E
+ # <narrow> 30A8
+FF75 HALFWIDTH KATAKANA LETTER O
+ # <narrow> 30AA
+FF76 HALFWIDTH KATAKANA LETTER KA
+ # <narrow> 30AB
+FF77 HALFWIDTH KATAKANA LETTER KI
+ # <narrow> 30AD
+FF78 HALFWIDTH KATAKANA LETTER KU
+ # <narrow> 30AF
+FF79 HALFWIDTH KATAKANA LETTER KE
+ # <narrow> 30B1
+FF7A HALFWIDTH KATAKANA LETTER KO
+ # <narrow> 30B3
+FF7B HALFWIDTH KATAKANA LETTER SA
+ # <narrow> 30B5
+FF7C HALFWIDTH KATAKANA LETTER SI
+ # <narrow> 30B7
+FF7D HALFWIDTH KATAKANA LETTER SU
+ # <narrow> 30B9
+FF7E HALFWIDTH KATAKANA LETTER SE
+ # <narrow> 30BB
+FF7F HALFWIDTH KATAKANA LETTER SO
+ # <narrow> 30BD
+FF80 HALFWIDTH KATAKANA LETTER TA
+ # <narrow> 30BF
+FF81 HALFWIDTH KATAKANA LETTER TI
+ # <narrow> 30C1
+FF82 HALFWIDTH KATAKANA LETTER TU
+ # <narrow> 30C4
+FF83 HALFWIDTH KATAKANA LETTER TE
+ # <narrow> 30C6
+FF84 HALFWIDTH KATAKANA LETTER TO
+ # <narrow> 30C8
+FF85 HALFWIDTH KATAKANA LETTER NA
+ # <narrow> 30CA
+FF86 HALFWIDTH KATAKANA LETTER NI
+ # <narrow> 30CB
+FF87 HALFWIDTH KATAKANA LETTER NU
+ # <narrow> 30CC
+FF88 HALFWIDTH KATAKANA LETTER NE
+ # <narrow> 30CD
+FF89 HALFWIDTH KATAKANA LETTER NO
+ # <narrow> 30CE
+FF8A HALFWIDTH KATAKANA LETTER HA
+ # <narrow> 30CF
+FF8B HALFWIDTH KATAKANA LETTER HI
+ # <narrow> 30D2
+FF8C HALFWIDTH KATAKANA LETTER HU
+ # <narrow> 30D5
+FF8D HALFWIDTH KATAKANA LETTER HE
+ # <narrow> 30D8
+FF8E HALFWIDTH KATAKANA LETTER HO
+ # <narrow> 30DB
+FF8F HALFWIDTH KATAKANA LETTER MA
+ # <narrow> 30DE
+FF90 HALFWIDTH KATAKANA LETTER MI
+ # <narrow> 30DF
+FF91 HALFWIDTH KATAKANA LETTER MU
+ # <narrow> 30E0
+FF92 HALFWIDTH KATAKANA LETTER ME
+ # <narrow> 30E1
+FF93 HALFWIDTH KATAKANA LETTER MO
+ # <narrow> 30E2
+FF94 HALFWIDTH KATAKANA LETTER YA
+ # <narrow> 30E4
+FF95 HALFWIDTH KATAKANA LETTER YU
+ # <narrow> 30E6
+FF96 HALFWIDTH KATAKANA LETTER YO
+ # <narrow> 30E8
+FF97 HALFWIDTH KATAKANA LETTER RA
+ # <narrow> 30E9
+FF98 HALFWIDTH KATAKANA LETTER RI
+ # <narrow> 30EA
+FF99 HALFWIDTH KATAKANA LETTER RU
+ # <narrow> 30EB
+FF9A HALFWIDTH KATAKANA LETTER RE
+ # <narrow> 30EC
+FF9B HALFWIDTH KATAKANA LETTER RO
+ # <narrow> 30ED
+FF9C HALFWIDTH KATAKANA LETTER WA
+ # <narrow> 30EF
+FF9D HALFWIDTH KATAKANA LETTER N
+ # <narrow> 30F3
+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK (halfwidth katakana-hiragana voiced sound mark)
+ # <narrow> 3099
+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK (halfwidth katakana-hiragana semi-voiced sound mark)
+ # <narrow> 309A
+@ Halfwidth Hangul variants
+@+ See Hangul Compatibility Jamo 3130 - 318F
+FFA0 HALFWIDTH HANGUL FILLER
+ # <narrow> 3164
+FFA1 HALFWIDTH HANGUL LETTER KIYEOK
+ # <narrow> 3131
+FFA2 HALFWIDTH HANGUL LETTER SSANGKIYEOK
+ # <narrow> 3132
+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+ # <narrow> 3133
+FFA4 HALFWIDTH HANGUL LETTER NIEUN
+ # <narrow> 3134
+FFA5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+ # <narrow> 3135
+FFA6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+ # <narrow> 3136
+FFA7 HALFWIDTH HANGUL LETTER TIKEUT
+ # <narrow> 3137
+FFA8 HALFWIDTH HANGUL LETTER SSANGTIKEUT
+ # <narrow> 3138
+FFA9 HALFWIDTH HANGUL LETTER RIEUL
+ # <narrow> 3139
+FFAA HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+ # <narrow> 313A
+FFAB HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+ # <narrow> 313B
+FFAC HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+ # <narrow> 313C
+FFAD HALFWIDTH HANGUL LETTER RIEUL-SIOS
+ # <narrow> 313D
+FFAE HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+ # <narrow> 313E
+FFAF HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+ # <narrow> 313F
+FFB0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+ # <narrow> 3140
+FFB1 HALFWIDTH HANGUL LETTER MIEUM
+ # <narrow> 3141
+FFB2 HALFWIDTH HANGUL LETTER PIEUP
+ # <narrow> 3142
+FFB3 HALFWIDTH HANGUL LETTER SSANGPIEUP
+ # <narrow> 3143
+FFB4 HALFWIDTH HANGUL LETTER PIEUP-SIOS
+ # <narrow> 3144
+FFB5 HALFWIDTH HANGUL LETTER SIOS
+ # <narrow> 3145
+FFB6 HALFWIDTH HANGUL LETTER SSANGSIOS
+ # <narrow> 3146
+FFB7 HALFWIDTH HANGUL LETTER IEUNG
+ # <narrow> 3147
+FFB8 HALFWIDTH HANGUL LETTER CIEUC
+ # <narrow> 3148
+FFB9 HALFWIDTH HANGUL LETTER SSANGCIEUC
+ # <narrow> 3149
+FFBA HALFWIDTH HANGUL LETTER CHIEUCH
+ # <narrow> 314A
+FFBB HALFWIDTH HANGUL LETTER KHIEUKH
+ # <narrow> 314B
+FFBC HALFWIDTH HANGUL LETTER THIEUTH
+ # <narrow> 314C
+FFBD HALFWIDTH HANGUL LETTER PHIEUPH
+ # <narrow> 314D
+FFBE HALFWIDTH HANGUL LETTER HIEUH
+ # <narrow> 314E
+FFC2 HALFWIDTH HANGUL LETTER A
+ # <narrow> 314F
+FFC3 HALFWIDTH HANGUL LETTER AE
+ # <narrow> 3150
+FFC4 HALFWIDTH HANGUL LETTER YA
+ # <narrow> 3151
+FFC5 HALFWIDTH HANGUL LETTER YAE
+ # <narrow> 3152
+FFC6 HALFWIDTH HANGUL LETTER EO
+ # <narrow> 3153
+FFC7 HALFWIDTH HANGUL LETTER E
+ # <narrow> 3154
+FFCA HALFWIDTH HANGUL LETTER YEO
+ # <narrow> 3155
+FFCB HALFWIDTH HANGUL LETTER YE
+ # <narrow> 3156
+FFCC HALFWIDTH HANGUL LETTER O
+ # <narrow> 3157
+FFCD HALFWIDTH HANGUL LETTER WA
+ # <narrow> 3158
+FFCE HALFWIDTH HANGUL LETTER WAE
+ # <narrow> 3159
+FFCF HALFWIDTH HANGUL LETTER OE
+ # <narrow> 315A
+FFD2 HALFWIDTH HANGUL LETTER YO
+ # <narrow> 315B
+FFD3 HALFWIDTH HANGUL LETTER U
+ # <narrow> 315C
+FFD4 HALFWIDTH HANGUL LETTER WEO
+ # <narrow> 315D
+FFD5 HALFWIDTH HANGUL LETTER WE
+ # <narrow> 315E
+FFD6 HALFWIDTH HANGUL LETTER WI
+ # <narrow> 315F
+FFD7 HALFWIDTH HANGUL LETTER YU
+ # <narrow> 3160
+FFDA HALFWIDTH HANGUL LETTER EU
+ # <narrow> 3161
+FFDB HALFWIDTH HANGUL LETTER YI
+ # <narrow> 3162
+FFDC HALFWIDTH HANGUL LETTER I
+ # <narrow> 3163
+@ Fullwidth symbol variants
+@+ See Latin-1 00A0 - 00FF
+FFE0 FULLWIDTH CENT SIGN
+ # <wide> 00A2
+FFE1 FULLWIDTH POUND SIGN
+ # <wide> 00A3
+FFE2 FULLWIDTH NOT SIGN
+ # <wide> 00AC
+FFE3 FULLWIDTH MACRON *
+ * sometimes treated as fullwidth overline
+ x (overline - 203E)
+ # <wide> 00AF
+FFE4 FULLWIDTH BROKEN BAR
+ # <wide> 00A6
+FFE5 FULLWIDTH YEN SIGN
+ # <wide> 00A5
+FFE6 FULLWIDTH WON SIGN
+ # <wide> 20A9
+@ Halfwidth symbol variants
+FFE8 HALFWIDTH FORMS LIGHT VERTICAL
+ # <narrow> 2502
+FFE9 HALFWIDTH LEFTWARDS ARROW
+ # <narrow> 2190
+FFEA HALFWIDTH UPWARDS ARROW
+ # <narrow> 2191
+FFEB HALFWIDTH RIGHTWARDS ARROW
+ # <narrow> 2192
+FFEC HALFWIDTH DOWNWARDS ARROW
+ # <narrow> 2193
+FFED HALFWIDTH BLACK SQUARE
+ # <narrow> 25A0
+FFEE HALFWIDTH WHITE CIRCLE
+ # <narrow> 25CB
+@@ FFF0 Specials FFFF
+@ Interlinear annotation
+@+ Used internally for Japanese Ruby (furigana), etc.
+FFF9 INTERLINEAR ANNOTATION ANCHOR
+ * marks start of annotated text
+FFFA INTERLINEAR ANNOTATION SEPARATOR
+ * marks start of annotating character(s)
+FFFB INTERLINEAR ANNOTATION TERMINATOR
+ * marks end of annotation block
+@ Replacement characters
+FFFC OBJECT REPLACEMENT CHARACTER
+ * used as placeholder in text for an otherwise unspecified object
+FFFD REPLACEMENT CHARACTER
+ * used to replace an incoming character whose value is unknown or unrepresentable in Unicode
+ * compare the use of 001A as a control character to indicate the substitute function
+@ Not character codes
+FFFE <not a character>
+ * the value FFFE is guaranteed not to be a Unicode character at all
+ * may be used to detect byte order by contrast with FEFF which is a character
+ x (zero width no-break space - FEFF)
+FFFF <not a character>
+ * the value FFFF is guaranteed not to be a Unicode character at all
diff --git a/contrib/perl5/lib/unicode/NamesList.html b/contrib/perl5/lib/unicode/NamesList.html
new file mode 100644
index 0000000..0bfc5db
--- /dev/null
+++ b/contrib/perl5/lib/unicode/NamesList.html
@@ -0,0 +1,226 @@
+<html>
+
+<head>
+<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
+<title>Unicode 3.0 NamesList File Structure</title>
+</head>
+
+<body>
+
+<h3>Unicode NamesList File Format</h3>
+
+<p>Last updated: 1999-07-06</p>
+
+<h3>1.0 Introduction</h3>
+
+<p>The Unicode name list file NamesList.txt (also NamesList.lst) is a plain text file used
+to drive the layout of the character code charts in the Unicode Standard. The information
+in this file is a combination of several fields from the UnicodeData.txt and Blocks.txt files,
+together with additional annotations for many characters. This document describes the
+syntax rules for the file format, but also gives brief information on how each construct
+is rendered when laid out for the book. Some of the syntax elements were used in
+preparation of the drafts of the book and may not be present in the final, released form
+of the NamesList.txt file.</p>
+
+<p>The same input file can be used to do the draft preparation for ISO/IEC 10646 (referred
+below as ISO-style). This necessitates the presence of some information in the name list
+file that is not needed (and in fact removed during parsing) for the Unicode book.</p>
+
+<p>With access to the layout program (unibook.exe) it is a simple matter of creating
+name lists for the purpose of formatting working drafts containing proposed characters.</p>
+
+<h3>1.1 NamesList File Overview</h3>
+
+<p>The *.lst files are plain text files which in their most simple form look like this</p>
+
+<p>@@&lt;tab&gt;0020&lt;tab&gt;BASIC LATIN&lt;tab&gt;007F<br>
+; this is a file comment (ignored)<br>
+0020&lt;tab&gt;SPACE<br>
+0021&lt;tab&gt;EXCLAMATION MARK<br>
+0022&lt;tab&gt;QUOTATION MARK<br>
+. . . <br>
+007F&lt;tab&gt;DELETE</p>
+
+<p>The semicolon (as first character), @ and &lt;tab&gt; characters are used by the file
+syntax and must be provided as shown. Hexadecimal digits must be in UPPER CASE). A double
+@@ introduces a block header, with the title, and start and ending code of the block
+provided as shown.</p>
+
+<p>For an ISO-style, minimal name list, only the NAME_LINE and BLOCKHEADER and their
+constituent syntax elements are needed.</p>
+
+<p>The full syntax with all the options is provided in the following sections.</p>
+
+<h3>1.2 NamesList File Structure</h3>
+
+<p>This section gives defines the overall file structure</p>
+
+<pre><strong>NAMELIST: TITLE_PAGE* BLOCK*
+</strong>
+<strong>TITLE_PAGE: TITLE
+ | TITLE_PAGE SUBTITLE
+ | TITLE_PAGE SUBHEADER
+ | TITLE_PAGE IGNORED_LINE
+ | TITLE_PAGE EMPTY_LINE
+ | TITLE_PAGE COMMENTLINE
+ | TITLE_PAGE NOTICE
+ | TITLE_PAGE PAGEBREAK
+</strong>
+<strong>BLOCK: BLOCKHEADER
+ | BLOCK CHAR_ENTRY
+ | BLOCK SUBHEADER
+ | BLOCK NOTICE
+ | BLOCK EMPTY_LINE
+ | BLOCK IGNORED_LINE
+ | BLOCK PAGEBREAK
+
+CHAR_ENTRY: NAME_LINE | RESERVED_LINE
+ | CHAR_ENTRY ALIAS_LINE
+ | CHAR_ENTRY COMMENT_LINE
+ | CHAR_ENTRY CROSS_REF
+ | CHAR_ENTRY DECOMPOSITION
+ | CHAR_ENTRY COMPAT_MAPPING
+ | CHAR_ENTRY IGNORED_LINE
+ | CHAR_ENTRY EMPTY_LINE
+ | CHAR_ENTRY NOTICE
+</strong></pre>
+
+<p>In other words:<br>
+<br>
+Neither TITLE nor&nbsp; SUBTITLE may occur after the first BLOCKHEADER. </p>
+
+<p>Only TITLE, SUBTITLE, SUBHEADER, PAGEBREAK, COMMENT_LINE,&nbsp; and IGNORED_LINE may
+occur before the first BLOCKHEADER.</p>
+
+<p>Directly following either a NAME_LINE or a RESERVED_LINE an uninterrupted sequence of
+the following lines may occur (in any order and repeated as often as needed): ALIAS_LINE,
+CROSS_REF, DECOMPOSITION, COMPAT_MAPPING, NOTICE, EMPTY_LINE and IGNORED_LINE.</p>
+
+<p>Except for EMPTY_LINE, NOTICE and IGNORED_LINE, none of these lines may occur in any other
+place. </p>
+
+<p>Note: A NOTICE displays differently depending on whether it follows a header or title
+or is part of a CHAR_ENTRY.</p>
+
+<h3>1.3 NamesList File Elements</h3>
+
+<p>This section provides the details of the syntax for the individual elements.</p>
+
+<pre><small><strong>ELEMENT SYNTAX</strong> // How rendered</small></pre>
+
+<pre><small><strong>NAME_LINE: CHAR &lt;tab&gt; LINE
+</strong> // the CHAR and the corresponding image are echoed,
+ // followed by the name as given in LINE
+
+<strong> CHAR TAB NAME COMMENT LF
+</strong> // Names may have a comment, which is stripped off
+ // unless the file is parsed for an ISO style list
+
+<strong>RESERVED_LINE: CHAR TAB &lt;reserved&gt;
+</strong> // the CHAR is echoed followed by an icon for the
+ // reserved character and a fixed string e.g. &lt;reserved&gt;
+
+<strong>COMMMENT_LINE: &lt;tab&gt; &quot;*&quot; SP EXPAND_LINE
+</strong> // * is replaced by BULLET, output line as comment
+ <strong>&lt;tab&gt; EXPAND_LINE</strong>
+ // output line as comment
+
+<strong>ALIAS_LINE: &lt;tab&gt; &quot;=&quot; SP LINE
+</strong> // replace = by itself, output line as alias
+
+<strong>CROSS_REF: &lt;tab&gt; &quot;X&quot; SP EXPAND_LINE
+</strong> // X is replaced by a right arrow
+<strong> &lt;tab&gt; &quot;X&quot; SP &quot;(&quot; STRING SP &quot;-&quot; SP CHAR &quot;)&quot;
+</strong> // X is replaced by a right arrow
+ // the &quot;(&quot;, &quot;-&quot;, &quot;)&quot; are removed, the
+ // order of CHAR and STRING is reversed
+ // i.e. both inputs result in the same output
+
+<strong>IGNORED_LINE: &lt;tab&gt; &quot;;&quot; EXPAND_LINE
+EMPTY_LINE: LF
+</strong> // empty lines and file comments are ignored
+
+<strong>DECOMPOSITION: &lt;tab&gt; &quot;:&quot; EXPAND_LINE
+</strong> // replace ':' by EQUIV, expand line into
+ // decomposition
+
+<strong>COMPAT_MAPPING: &lt;tab&gt; &quot;#&quot; SP EXPAND_LINE
+</strong> // replace '#' by APPROX, output line as mapping
+
+<strong>NOTICE: &quot;@+&quot; &lt;tab&gt; LINE
+</strong> // skip '@+', output text as notice
+<strong> &quot;@+&quot; TAB * SP LINE
+</strong> // skip '@', output text as notice
+ // &quot;*&quot; expands to a bullet character
+ // Notices following a character code apply to the
+ // character and are indented. Notices not following
+ // a character code apply to the page/block/column
+ // and are italicized, but not indented
+
+<strong>SUBTITLE: &quot;@@@+&quot; &lt;tab&gt; LINE
+</strong> // skip &quot;@@@+&quot;, output text as subtitle
+
+<strong>SUBHEADER: &quot;@&quot; &lt;tab&gt; LINE
+</strong> // skip '@', output line as text as column header
+
+<strong>BLOCKHEADER: &quot;@@&quot; &lt;tab&gt; BLOCKSTART &lt;tab&gt; BLOCKNAME &lt;tab&gt; BLOCKEND
+</strong> // skip &quot;@@&quot;, cause a page break and optional
+ // blank page, then output one or more charts
+ // followed by the list of character names.
+ // use BLOCKSTART and BLOCKEND to define the
+ // what characters belong to a block
+ // use blockname in page and table headers
+ <strong> &quot;@@&quot; &lt;tab&gt; BLOCKSTART &lt;tab&gt; BLOCKNAME COMMENT &lt;tab&gt; BLOCKEND
+ </strong>// if a comment is present it replaces the blockname
+ // when an ISO-style namelist is laid out
+
+<strong>BLOCKSTART: CHAR</strong> // first character position in block
+<strong>BLOCKEND: CHAR</strong> // last character position in block
+<strong>PAGE_BREAK: &quot;@@&quot;</strong> // insert a (column) break
+
+<strong>TITLE: &quot;@@@&quot; &lt;tab&gt; LINE</strong>
+ // skip &quot;@@@&quot;, output line as text
+ // Title is used in page headers
+
+<strong>EXPAND_LINE: {CHAR | STRING}+ LF </strong>
+ // all instances of CHAR *) are replaced by
+ // CHAR NBSP x NBSP where x is the single Unicode
+ // character corresponding to char
+ // If character is combining, it is replaced with
+ // CHAR NBSP &lt;circ&gt; x NBSP where &lt;circ&gt; is the
+ // dotted circle</small>
+</pre>
+
+<h3><strong>1.4 NamesList File Primitives</strong></h3>
+
+<p>The following are the primitives and terminals for the NamesList syntax.</p>
+
+<pre><small><strong>LINE: STRING LF
+COMMENT: &quot;(&quot; NAME &quot;)&quot;
+ &quot;(&quot; NAME &quot;)&quot; &quot;*&quot;
+</strong>
+<strong>NAME</strong>: &lt;sequence of ASCII characters, except &quot;(&quot; or &quot;)&quot; &gt;
+<strong>STRING</strong>: &lt;sequence of Latin-1 characters&gt;
+<strong>CHAR</strong>: <strong>X X X X</strong>
+ <strong>| X X X X X X X X X</strong></small>
+<small><strong>X: &quot;0&quot;|&quot;1&quot;|&quot;2&quot;|&quot;3&quot;|&quot;4&quot;|&quot;5&quot;|&quot;6&quot;|&quot;7&quot;|&quot;8&quot;|&quot;9&quot;|&quot;A&quot;|&quot;B&quot;|&quot;C&quot;|&quot;D&quot;|&quot;E&quot;|&quot;F&quot;
+&lt;tab&gt;:</strong> &lt;sequence of one or more ASCII tab characters 0x09&gt;
+<strong>SP</strong>: &lt;ASCII 0x20&gt;
+<strong>LF</strong>: &lt;any sequence of ASCII 0x0A and 0x0D&gt;
+</small></pre>
+
+<p><strong>Notes:</strong>
+
+<ul>
+ <li>Special lookahead logic prevents a mention of a 4 digit standard, such as ISO 9999 from
+ being misinterpreted as ISO CHAR.</li>
+ <li>Use of Latin-1 is supported in unibook.exe, but not portably, unless the file is encoded as
+ UTF-16LE.</li>
+ <li>The final LF in the file must be present</li>
+ <li>A CHAR inside ' or &quot; is expanded, but only its glyph image is printed,&nbsp; the
+ code value is not echoed</li>
+ <li>Straight quotes in an EXPAND_LINE are replaced by curly quotes using English rules.
+ Apostrophes are supported, but nested quotes are not.</li>
+</ul>
+</body>
+</html>
diff --git a/contrib/perl5/lib/unicode/Number.pl b/contrib/perl5/lib/unicode/Number.pl
new file mode 100644
index 0000000..b0e054a
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Number.pl
@@ -0,0 +1,386 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0031 1
+0032 2
+0033 3
+0034 4
+0035 5
+0036 6
+0037 7
+0038 8
+0039 9
+00b2 2
+00b3 3
+00b9 1
+00bc 1/4
+00bd 1/2
+00be 3/4
+0661 1
+0662 2
+0663 3
+0664 4
+0665 5
+0666 6
+0667 7
+0668 8
+0669 9
+06f1 1
+06f2 2
+06f3 3
+06f4 4
+06f5 5
+06f6 6
+06f7 7
+06f8 8
+06f9 9
+0967 1
+0968 2
+0969 3
+096a 4
+096b 5
+096c 6
+096d 7
+096e 8
+096f 9
+09e7 1
+09e8 2
+09e9 3
+09ea 4
+09eb 5
+09ec 6
+09ed 7
+09ee 8
+09ef 9
+09f4 1
+09f5 2
+09f6 3
+09f7 4
+09f9 16
+0a67 1
+0a68 2
+0a69 3
+0a6a 4
+0a6b 5
+0a6c 6
+0a6d 7
+0a6e 8
+0a6f 9
+0ae7 1
+0ae8 2
+0ae9 3
+0aea 4
+0aeb 5
+0aec 6
+0aed 7
+0aee 8
+0aef 9
+0b67 1
+0b68 2
+0b69 3
+0b6a 4
+0b6b 5
+0b6c 6
+0b6d 7
+0b6e 8
+0b6f 9
+0be7 1
+0be8 2
+0be9 3
+0bea 4
+0beb 5
+0bec 6
+0bed 7
+0bee 8
+0bef 9
+0bf0 10
+0bf1 100
+0bf2 1000
+0c67 1
+0c68 2
+0c69 3
+0c6a 4
+0c6b 5
+0c6c 6
+0c6d 7
+0c6e 8
+0c6f 9
+0ce7 1
+0ce8 2
+0ce9 3
+0cea 4
+0ceb 5
+0cec 6
+0ced 7
+0cee 8
+0cef 9
+0d67 1
+0d68 2
+0d69 3
+0d6a 4
+0d6b 5
+0d6c 6
+0d6d 7
+0d6e 8
+0d6f 9
+0e51 1
+0e52 2
+0e53 3
+0e54 4
+0e55 5
+0e56 6
+0e57 7
+0e58 8
+0e59 9
+0ed1 1
+0ed2 2
+0ed3 3
+0ed4 4
+0ed5 5
+0ed6 6
+0ed7 7
+0ed8 8
+0ed9 9
+0f21 1
+0f22 2
+0f23 3
+0f24 4
+0f25 5
+0f26 6
+0f27 7
+0f28 8
+0f29 9
+1041 1
+1042 2
+1043 3
+1044 4
+1045 5
+1046 6
+1047 7
+1048 8
+1049 9
+1369 1
+136a 2
+136b 3
+136c 4
+136d 5
+136e 6
+136f 7
+1370 8
+1371 9
+1372 10
+1373 20
+1374 30
+1375 40
+1376 50
+1377 60
+1378 70
+1379 80
+137a 90
+137b 100
+137c 10000
+16ee 17
+16ef 18
+16f0 19
+17e1 1
+17e2 2
+17e3 3
+17e4 4
+17e5 5
+17e6 6
+17e7 7
+17e8 8
+17e9 9
+1811 1
+1812 2
+1813 3
+1814 4
+1815 5
+1816 6
+1817 7
+1818 8
+1819 9
+2074 4
+2075 5
+2076 6
+2077 7
+2078 8
+2079 9
+2081 1
+2082 2
+2083 3
+2084 4
+2085 5
+2086 6
+2087 7
+2088 8
+2089 9
+2153 1/3
+2154 2/3
+2155 1/5
+2156 2/5
+2157 3/5
+2158 4/5
+2159 1/6
+215a 5/6
+215b 1/8
+215c 3/8
+215d 5/8
+215e 7/8
+215f 2160 1
+2161 2
+2162 3
+2163 4
+2164 5
+2165 6
+2166 7
+2167 8
+2168 9
+2169 10
+216a 11
+216b 12
+216c 50
+216d 100
+216e 500
+216f 1000
+2170 1
+2171 2
+2172 3
+2173 4
+2174 5
+2175 6
+2176 7
+2177 8
+2178 9
+2179 10
+217a 11
+217b 12
+217c 50
+217d 100
+217e 500
+217f 2180 1000
+2181 5000
+2182 10000
+2460 1
+2461 2
+2462 3
+2463 4
+2464 5
+2465 6
+2466 7
+2467 8
+2468 9
+2469 10
+246a 11
+246b 12
+246c 13
+246d 14
+246e 15
+246f 16
+2470 17
+2471 18
+2472 19
+2473 20
+2474 1
+2475 2
+2476 3
+2477 4
+2478 5
+2479 6
+247a 7
+247b 8
+247c 9
+247d 10
+247e 11
+247f 12
+2480 13
+2481 14
+2482 15
+2483 16
+2484 17
+2485 18
+2486 19
+2487 20
+2488 1
+2489 2
+248a 3
+248b 4
+248c 5
+248d 6
+248e 7
+248f 8
+2490 9
+2491 10
+2492 11
+2493 12
+2494 13
+2495 14
+2496 15
+2497 16
+2498 17
+2499 18
+249a 19
+249b 20
+2776 1
+2777 2
+2778 3
+2779 4
+277a 5
+277b 6
+277c 7
+277d 8
+277e 9
+277f 10
+2780 1
+2781 2
+2782 3
+2783 4
+2784 5
+2785 6
+2786 7
+2787 8
+2788 9
+2789 10
+278a 1
+278b 2
+278c 3
+278d 4
+278e 5
+278f 6
+2790 7
+2791 8
+2792 9
+2793 10
+3021 1
+3022 2
+3023 3
+3024 4
+3025 5
+3026 6
+3027 7
+3028 8
+3029 9
+3038 10
+3039 20
+303a 30
+3280 1
+3281 2
+3282 3
+3283 4
+3284 5
+3285 6
+3286 7
+3287 8
+3288 9
+3289 10
+ff11 1
+ff12 2
+ff13 3
+ff14 4
+ff15 5
+ff16 6
+ff17 7
+ff18 8
+ff19 9
+END
diff --git a/contrib/perl5/lib/unicode/Props.txt b/contrib/perl5/lib/unicode/Props.txt
new file mode 100644
index 0000000..b3548e1
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Props.txt
@@ -0,0 +1,3640 @@
+Property dump: UnicodeData-3.0.0.txt
+
+*******************************************
+
+Property dump for: 0x10000001 (Zero-width)
+
+070F
+180B..180E (4 chars)
+200B..200F (5 chars)
+202A..202E (5 chars)
+206A..206F (6 chars)
+FEFF
+FFF9..FFFB (3 chars)
+
+*******************************************
+
+Property dump for: 0x10000002 (Space)
+
+0020
+00A0
+1680
+2000..200B (12 chars)
+202F
+3000
+
+*******************************************
+
+Property dump for: 0x10000004 (White space)
+
+0009..000D (5 chars)
+0020
+0085
+00A0
+1680
+2000..200B (12 chars)
+2028..2029 (2 chars)
+202F
+3000
+
+*******************************************
+
+Property dump for: 0x00400000 (Non-break)
+
+00A0
+0F0C
+2007
+2011
+202F
+FEFF
+
+*******************************************
+
+Property dump for: 0x10000008 (ISO Control)
+
+0000..001F (32 chars)
+007F..009F (33 chars)
+
+*******************************************
+
+Property dump for: 0x10000090 (Bidi Control)
+
+200E..200F (2 chars)
+202A..202E (5 chars)
+
+*******************************************
+
+Property dump for: 0x100000A0 (Join Control)
+
+200C..200D (2 chars)
+
+*******************************************
+
+Property dump for: 0x100000C0 (Format Control)
+
+070F
+180B..180E (4 chars)
+206A..206F (6 chars)
+FFF9..FFFB (3 chars)
+
+*******************************************
+
+Property dump for: 0x20000400 (Dash)
+
+002D
+00AD
+058A
+1806
+2010..2015 (6 chars)
+207B
+208B
+2212
+301C
+3030
+FE31..FE32 (2 chars)
+FE58
+FE63
+FF0D
+
+*******************************************
+
+Property dump for: 0x20000800 (Hyphen)
+
+002D
+00AD
+058A
+1806
+2010..2011 (2 chars)
+30FB
+FE63
+FF0D
+FF65
+
+*******************************************
+
+Property dump for: 0x20001000 (Punctuation)
+
+0021..0023 (3 chars)
+0025..002A (6 chars)
+002C..002F (4 chars)
+003A..003B (2 chars)
+003F..0040 (2 chars)
+005B..005D (3 chars)
+005F
+007B
+007D
+00A1
+00AB
+00AD
+00B7
+00BB
+00BF
+037E
+0387
+055A..055F (6 chars)
+0589..058A (2 chars)
+05BE
+05C0
+05C3
+05F3..05F4 (2 chars)
+060C
+061B
+061F
+066A..066D (4 chars)
+06D4
+0700..070D (14 chars)
+0964..0965 (2 chars)
+0970
+0DF4
+0E4F
+0E5A..0E5B (2 chars)
+0F04..0F12 (15 chars)
+0F3A..0F3D (4 chars)
+0F85
+104A..104F (6 chars)
+10FB
+1361..1368 (8 chars)
+166D..166E (2 chars)
+169B..169C (2 chars)
+16EB..16ED (3 chars)
+17D4..17DA (7 chars)
+17DC
+1800..180A (11 chars)
+2010..2027 (24 chars)
+2030..2043 (20 chars)
+2045..2046 (2 chars)
+2048..204D (6 chars)
+207D..207E (2 chars)
+208D..208E (2 chars)
+2329..232A (2 chars)
+3001..3003 (3 chars)
+3008..3011 (10 chars)
+3014..301F (12 chars)
+3030
+30FB
+FD3E..FD3F (2 chars)
+FE30..FE44 (21 chars)
+FE49..FE52 (10 chars)
+FE54..FE61 (14 chars)
+FE63
+FE68
+FE6A..FE6B (2 chars)
+FF01..FF03 (3 chars)
+FF05..FF0A (6 chars)
+FF0C..FF0F (4 chars)
+FF1A..FF1B (2 chars)
+FF1F..FF20 (2 chars)
+FF3B..FF3D (3 chars)
+FF3F
+FF5B
+FF5D
+FF61..FF65 (5 chars)
+
+*******************************************
+
+Property dump for: 0x00800000 (Delimiter)
+
+0000
+0009..000D (5 chars)
+001C..0023 (8 chars)
+0028..0029 (2 chars)
+002C
+002E..002F (2 chars)
+003A..003B (2 chars)
+003F
+005B..005D (3 chars)
+007B..007D (3 chars)
+0085
+00A0..00A1 (2 chars)
+00A6..00A7 (2 chars)
+00AB
+00B6
+00BB
+00BF
+037E
+0387
+055C..055E (3 chars)
+0589
+060C
+061B
+061F
+066B..066C (2 chars)
+06D4
+0700..0709 (10 chars)
+070B..070D (3 chars)
+0964..0965 (2 chars)
+0DF4
+0E5A..0E5B (2 chars)
+0F0B
+0F0D..0F12 (6 chars)
+0F3A..0F3D (4 chars)
+104A..104B (2 chars)
+10FB
+1361..1368 (8 chars)
+166D..166E (2 chars)
+1680
+169B..169C (2 chars)
+16EB..16ED (3 chars)
+17D4..17D6 (3 chars)
+17DA
+1802..1805 (4 chars)
+1808..1809 (2 chars)
+2000..200B (12 chars)
+2016
+2018..201F (8 chars)
+2028..2029 (2 chars)
+202F
+2039..203A (2 chars)
+203C..203D (2 chars)
+2045..2046 (2 chars)
+2048..2049 (2 chars)
+207D..207E (2 chars)
+208D..208E (2 chars)
+2329..232A (2 chars)
+3000..3002 (3 chars)
+3008..3011 (10 chars)
+3014..301B (8 chars)
+301D..301F (3 chars)
+30FB
+FD3E..FD3F (2 chars)
+FE35..FE44 (16 chars)
+FE50..FE52 (3 chars)
+FE54..FE57 (4 chars)
+FE59..FE5F (7 chars)
+FE68
+FF01..FF03 (3 chars)
+FF08..FF09 (2 chars)
+FF0C
+FF0E..FF0F (2 chars)
+FF1A..FF1B (2 chars)
+FF1F
+FF3B..FF3D (3 chars)
+FF5B..FF5D (3 chars)
+FF61..FF65 (5 chars)
+FFE4
+
+*******************************************
+
+Property dump for: 0x80000003 (Line Separator)
+
+2028
+
+*******************************************
+
+Property dump for: 0x80000004 (Paragraph Separator)
+
+2029
+
+*******************************************
+
+Property dump for: 0x20002000 (Quotation Mark)
+
+0022
+0027
+00AB
+00BB
+2018..201F (8 chars)
+2039..203A (2 chars)
+300C..300F (4 chars)
+301D..301F (3 chars)
+FE41..FE44 (4 chars)
+FF02
+FF07
+FF62..FF63 (2 chars)
+
+*******************************************
+
+Property dump for: 0x20004000 (Terminal Punctuation)
+
+0021
+002C
+002E
+003A..003B (2 chars)
+003F
+037E
+0387
+0589
+060C
+061B
+061F
+06D4
+0700..070A (11 chars)
+070C
+0964..0965 (2 chars)
+0E5A..0E5B (2 chars)
+104A..104B (2 chars)
+1361..1368 (8 chars)
+166D..166E (2 chars)
+16EB..16ED (3 chars)
+17D4..17D6 (3 chars)
+17DA
+1802..1805 (4 chars)
+1808..1809 (2 chars)
+203C..203D (2 chars)
+2048..2049 (2 chars)
+3001..3002 (2 chars)
+FE50..FE52 (3 chars)
+FE54..FE57 (4 chars)
+FF01
+FF0C
+FF0E
+FF1A..FF1B (2 chars)
+FF1F
+FF61
+FF64
+
+*******************************************
+
+Property dump for: 0x20008000 (Currency Symbol)
+
+0024
+00A2..00A5 (4 chars)
+09F2..09F3 (2 chars)
+0E3F
+17DB
+20A0..20AF (16 chars)
+FE69
+FF04
+FFE0..FFE1 (2 chars)
+FFE5..FFE6 (2 chars)
+
+*******************************************
+
+Property dump for: 0x20080000 (Math)
+
+0028..002B (4 chars)
+002D
+002F
+003C..003E (3 chars)
+005B..005E (4 chars)
+007B..007E (4 chars)
+00AC
+00B1
+00D7
+00F7
+2016
+2032..2034 (3 chars)
+2044
+207A..207E (5 chars)
+208A..208E (5 chars)
+20D0..20DC (13 chars)
+20E1
+2190..2194 (5 chars)
+219A..219B (2 chars)
+21A0
+21A3
+21A6
+21AE
+21CE..21CF (2 chars)
+21D2
+21D4
+2200..22F1 (242 chars)
+2308..230B (4 chars)
+2320..2321 (2 chars)
+2329..232A (2 chars)
+25B7
+25C1
+266F
+300A..300B (2 chars)
+301A..301B (2 chars)
+FB29
+FE35..FE38 (4 chars)
+FE59..FE5C (4 chars)
+FE61..FE66 (6 chars)
+FE68
+FF08..FF0B (4 chars)
+FF0D
+FF0F
+FF1C..FF1E (3 chars)
+FF3B..FF3E (4 chars)
+FF5B..FF5E (4 chars)
+FFE2
+FFE9..FFEC (4 chars)
+
+*******************************************
+
+Property dump for: 0x20000100 (Paired Punctuation)
+
+0028..0029 (2 chars)
+005B
+005D
+007B
+007D
+00AB
+00BB
+0F3A..0F3D (4 chars)
+169B..169C (2 chars)
+2018..201F (8 chars)
+2039..203A (2 chars)
+2045..2046 (2 chars)
+207D..207E (2 chars)
+208D..208E (2 chars)
+2329..232A (2 chars)
+3008..3011 (10 chars)
+3014..301B (8 chars)
+301D..301F (3 chars)
+FD3E..FD3F (2 chars)
+FE35..FE44 (16 chars)
+FE59..FE5E (6 chars)
+FF08..FF09 (2 chars)
+FF3B
+FF3D
+FF5B
+FF5D
+FF62..FF63 (2 chars)
+
+*******************************************
+
+Property dump for: 0x20000300 (Left of Pair)
+
+0028
+005B
+007B
+00AB
+0F3A
+0F3C
+169B
+2018
+201A..201C (3 chars)
+201E..201F (2 chars)
+2039
+2045
+207D
+208D
+2329
+3008
+300A
+300C
+300E
+3010
+3014
+3016
+3018
+301A
+301D
+FD3E
+FE35
+FE37
+FE39
+FE3B
+FE3D
+FE3F
+FE41
+FE43
+FE59
+FE5B
+FE5D
+FF08
+FF3B
+FF5B
+FF62
+
+*******************************************
+
+Property dump for: 0x20000004 (Combining)
+
+0300..034E (79 chars)
+0360..0362 (3 chars)
+0483..0486 (4 chars)
+0488..0489 (2 chars)
+0591..05A1 (17 chars)
+05A3..05B9 (23 chars)
+05BB..05BD (3 chars)
+05BF
+05C1..05C2 (2 chars)
+05C4
+064B..0655 (11 chars)
+0670
+06D6..06E4 (15 chars)
+06E7..06E8 (2 chars)
+06EA..06ED (4 chars)
+0711
+0730..074A (27 chars)
+07A6..07B0 (11 chars)
+0901..0903 (3 chars)
+093C
+093E..094D (16 chars)
+0951..0954 (4 chars)
+0962..0963 (2 chars)
+0981..0983 (3 chars)
+09BC
+09BE..09C4 (7 chars)
+09C7..09C8 (2 chars)
+09CB..09CD (3 chars)
+09D7
+09E2..09E3 (2 chars)
+0A02
+0A3C
+0A3E..0A42 (5 chars)
+0A47..0A48 (2 chars)
+0A4B..0A4D (3 chars)
+0A70..0A71 (2 chars)
+0A81..0A83 (3 chars)
+0ABC
+0ABE..0AC5 (8 chars)
+0AC7..0AC9 (3 chars)
+0ACB..0ACD (3 chars)
+0B01..0B03 (3 chars)
+0B3C
+0B3E..0B43 (6 chars)
+0B47..0B48 (2 chars)
+0B4B..0B4D (3 chars)
+0B56..0B57 (2 chars)
+0B82..0B83 (2 chars)
+0BBE..0BC2 (5 chars)
+0BC6..0BC8 (3 chars)
+0BCA..0BCD (4 chars)
+0BD7
+0C01..0C03 (3 chars)
+0C3E..0C44 (7 chars)
+0C46..0C48 (3 chars)
+0C4A..0C4D (4 chars)
+0C55..0C56 (2 chars)
+0C82..0C83 (2 chars)
+0CBE..0CC4 (7 chars)
+0CC6..0CC8 (3 chars)
+0CCA..0CCD (4 chars)
+0CD5..0CD6 (2 chars)
+0D02..0D03 (2 chars)
+0D3E..0D43 (6 chars)
+0D46..0D48 (3 chars)
+0D4A..0D4D (4 chars)
+0D57
+0D82..0D83 (2 chars)
+0DCA
+0DCF..0DD4 (6 chars)
+0DD6
+0DD8..0DDF (8 chars)
+0DF2..0DF3 (2 chars)
+0E31
+0E34..0E3A (7 chars)
+0E47..0E4E (8 chars)
+0EB1
+0EB4..0EB9 (6 chars)
+0EBB..0EBC (2 chars)
+0EC8..0ECD (6 chars)
+0F18..0F19 (2 chars)
+0F35
+0F37
+0F39
+0F3E..0F3F (2 chars)
+0F71..0F84 (20 chars)
+0F86..0F87 (2 chars)
+0F90..0F97 (8 chars)
+0F99..0FBC (36 chars)
+0FC6
+102C..1032 (7 chars)
+1036..1039 (4 chars)
+1056..1059 (4 chars)
+17B4..17D3 (32 chars)
+18A9
+20D0..20E3 (20 chars)
+302A..302F (6 chars)
+3099..309A (2 chars)
+F8F0..F8FF (16 chars)
+FB1E
+FE20..FE23 (4 chars)
+
+*******************************************
+
+Property dump for: 0x20040000 (Non-spacing)
+
+0300..034E (79 chars)
+0360..0362 (3 chars)
+0483..0486 (4 chars)
+0488..0489 (2 chars)
+0591..05A1 (17 chars)
+05A3..05B9 (23 chars)
+05BB..05BD (3 chars)
+05BF
+05C1..05C2 (2 chars)
+05C4
+064B..0655 (11 chars)
+0670
+06D6..06E4 (15 chars)
+06E7..06E8 (2 chars)
+06EA..06ED (4 chars)
+0711
+0730..074A (27 chars)
+07A6..07B0 (11 chars)
+0901..0902 (2 chars)
+093C
+0941..0948 (8 chars)
+094D
+0951..0954 (4 chars)
+0962..0963 (2 chars)
+0981
+09BC
+09C1..09C4 (4 chars)
+09CD
+09E2..09E3 (2 chars)
+0A02
+0A3C
+0A41..0A42 (2 chars)
+0A47..0A48 (2 chars)
+0A4B..0A4D (3 chars)
+0A70..0A71 (2 chars)
+0A81..0A82 (2 chars)
+0ABC
+0AC1..0AC5 (5 chars)
+0AC7..0AC8 (2 chars)
+0ACD
+0B01
+0B3C
+0B3F
+0B41..0B43 (3 chars)
+0B4D
+0B56
+0B82
+0BC0
+0BCD
+0C3E..0C40 (3 chars)
+0C46..0C48 (3 chars)
+0C4A..0C4D (4 chars)
+0C55..0C56 (2 chars)
+0CBF
+0CC6
+0CCC..0CCD (2 chars)
+0D41..0D43 (3 chars)
+0D4D
+0DCA
+0DD2..0DD4 (3 chars)
+0DD6
+0E31
+0E34..0E3A (7 chars)
+0E47..0E4E (8 chars)
+0EB1
+0EB4..0EB9 (6 chars)
+0EBB..0EBC (2 chars)
+0EC8..0ECD (6 chars)
+0F18..0F19 (2 chars)
+0F35
+0F37
+0F39
+0F71..0F7E (14 chars)
+0F80..0F84 (5 chars)
+0F86..0F87 (2 chars)
+0F90..0F97 (8 chars)
+0F99..0FBC (36 chars)
+0FC6
+102D..1030 (4 chars)
+1032
+1036..1037 (2 chars)
+1039
+1058..1059 (2 chars)
+17B7..17BD (7 chars)
+17C6
+17C9..17D3 (11 chars)
+18A9
+20D0..20E3 (20 chars)
+302A..302F (6 chars)
+3099..309A (2 chars)
+F8F0..F8FF (16 chars)
+FB1E
+FE20..FE23 (4 chars)
+
+*******************************************
+
+Property dump for: 0x20000008 (Composite)
+
+00C0..00C5 (6 chars)
+00C7..00CF (9 chars)
+00D1..00D6 (6 chars)
+00D9..00DD (5 chars)
+00E0..00E5 (6 chars)
+00E7..00EF (9 chars)
+00F1..00F6 (6 chars)
+00F9..00FD (5 chars)
+00FF..0130 (50 chars)
+0132..0137 (6 chars)
+0139..0149 (17 chars)
+014C..0151 (6 chars)
+0154..017E (43 chars)
+01A0..01A1 (2 chars)
+01AF..01B0 (2 chars)
+01C4..01DC (25 chars)
+01DE..01E3 (6 chars)
+01E6..01F5 (16 chars)
+01F8..0209 (18 chars)
+020C..021B (16 chars)
+021E..021F (2 chars)
+0226..0233 (14 chars)
+0344
+0385..0386 (2 chars)
+0388..038A (3 chars)
+038C
+038E..0390 (3 chars)
+03AA..03B0 (7 chars)
+03CA..03CE (5 chars)
+03D3..03D5 (3 chars)
+0400..0401 (2 chars)
+0403
+0407
+040C..040E (3 chars)
+0419
+0439
+0450..0451 (2 chars)
+0453
+0457
+045C..045E (3 chars)
+0476..0477 (2 chars)
+04BE..04BF (2 chars)
+04C1..04C2 (2 chars)
+04D0..04D3 (4 chars)
+04D6..04D7 (2 chars)
+04DA..04E7 (14 chars)
+04EA..04F5 (12 chars)
+04F8..04F9 (2 chars)
+0587
+0622..0626 (5 chars)
+06C0
+06C2
+06D6..06D7 (2 chars)
+0929
+0931
+0934
+0950
+0958..095F (8 chars)
+09CB..09CC (2 chars)
+09DC..09DD (2 chars)
+09DF
+0A33
+0A36
+0A59..0A5B (3 chars)
+0A5E
+0A74
+0AD0
+0B01
+0B48
+0B4B..0B4C (2 chars)
+0B5C..0B5D (2 chars)
+0B94
+0BCA..0BCC (3 chars)
+0C48
+0CC0
+0CC7..0CC8 (2 chars)
+0CCA..0CCB (2 chars)
+0D4A..0D4C (3 chars)
+0DDA
+0DDC..0DDE (3 chars)
+0E33
+0EB3
+0EDC..0EDD (2 chars)
+0F00
+0F43
+0F4D
+0F52
+0F57
+0F5C
+0F69
+0F73
+0F75..0F79 (5 chars)
+0F81
+0F93
+0F9D
+0FA2
+0FA7
+0FAC
+0FB9
+1026
+1E00..1E9B (156 chars)
+1EA0..1EF9 (90 chars)
+1F00..1F15 (22 chars)
+1F18..1F1D (6 chars)
+1F20..1F45 (38 chars)
+1F48..1F4D (6 chars)
+1F50..1F57 (8 chars)
+1F59
+1F5B
+1F5D
+1F5F..1F7D (31 chars)
+1F80..1FB4 (53 chars)
+1FB6..1FBC (7 chars)
+1FC1..1FC4 (4 chars)
+1FC6..1FD3 (14 chars)
+1FD6..1FDB (6 chars)
+1FDD..1FEE (18 chars)
+1FF2..1FF4 (3 chars)
+1FF6..1FFC (7 chars)
+203C
+2048..2049 (2 chars)
+2161..2163 (3 chars)
+2165..2168 (4 chars)
+216A..216B (2 chars)
+2171..2173 (3 chars)
+2175..2178 (4 chars)
+217A..217B (2 chars)
+2204
+2209
+220C
+2226
+222C..222D (2 chars)
+222F..2230 (2 chars)
+2247
+2249
+2260
+2262
+226D..2271 (5 chars)
+2274..2275 (2 chars)
+2278..2279 (2 chars)
+2280..2281 (2 chars)
+2284..2285 (2 chars)
+2288..2289 (2 chars)
+22AC..22AF (4 chars)
+22E0..22E3 (4 chars)
+22EA..22ED (4 chars)
+2460..24B5 (86 chars)
+24EA
+304C
+304E
+3050
+3052
+3054
+3056
+3058
+305A
+305C
+305E
+3060
+3062
+3065
+3067
+3069
+3070..3071 (2 chars)
+3073..3074 (2 chars)
+3076..3077 (2 chars)
+3079..307A (2 chars)
+307C..307D (2 chars)
+3094
+309E
+30AC
+30AE
+30B0
+30B2
+30B4
+30B6
+30B8
+30BA
+30BC
+30BE
+30C0
+30C2
+30C5
+30C7
+30C9
+30D0..30D1 (2 chars)
+30D3..30D4 (2 chars)
+30D6..30D7 (2 chars)
+30D9..30DA (2 chars)
+30DC..30DD (2 chars)
+30F4
+30FE
+3200..321C (29 chars)
+3220..3243 (36 chars)
+32C0..32CB (12 chars)
+3300..3376 (119 chars)
+337B..33DD (99 chars)
+33E0..33FE (31 chars)
+AC00..D7A3 (11172 chars)
+FB00..FB06 (7 chars)
+FB13..FB17 (5 chars)
+FB1D
+FB1F
+FB2A..FB36 (13 chars)
+FB38..FB3C (5 chars)
+FB3E
+FB40..FB41 (2 chars)
+FB43..FB44 (2 chars)
+FB46..FB4F (10 chars)
+FBEA..FBFB (18 chars)
+FC00..FD3D (318 chars)
+FD50..FD8F (64 chars)
+FD92..FDC7 (54 chars)
+FDF0..FDFB (12 chars)
+FE70..FE72 (3 chars)
+FE74
+FE76..FE7F (10 chars)
+
+*******************************************
+
+Property dump for: 0x20000080 (Hex Digit)
+
+0030..0039 (10 chars)
+0041..0046 (6 chars)
+0061..0066 (6 chars)
+FF10..FF19 (10 chars)
+FF21..FF26 (6 chars)
+FF41..FF46 (6 chars)
+
+*******************************************
+
+Property dump for: 0x20000030 (Decimal Digit)
+
+0030..0039 (10 chars)
+0660..0669 (10 chars)
+06F0..06F9 (10 chars)
+0966..096F (10 chars)
+09E6..09EF (10 chars)
+0A66..0A6F (10 chars)
+0AE6..0AEF (10 chars)
+0B66..0B6F (10 chars)
+0BE7..0BEF (9 chars)
+0C66..0C6F (10 chars)
+0CE6..0CEF (10 chars)
+0D66..0D6F (10 chars)
+0E50..0E59 (10 chars)
+0ED0..0ED9 (10 chars)
+0F20..0F29 (10 chars)
+1040..1049 (10 chars)
+1369..1371 (9 chars)
+17E0..17E9 (10 chars)
+1810..1819 (10 chars)
+FF10..FF19 (10 chars)
+
+*******************************************
+
+Property dump for: 0x20000010 (Numeric)
+
+0030..0039 (10 chars)
+00B2..00B3 (2 chars)
+00B9
+00BC..00BE (3 chars)
+0660..0669 (10 chars)
+06F0..06F9 (10 chars)
+0966..096F (10 chars)
+09E6..09EF (10 chars)
+09F4..09F9 (6 chars)
+0A66..0A6F (10 chars)
+0AE6..0AEF (10 chars)
+0B66..0B6F (10 chars)
+0BE7..0BF2 (12 chars)
+0C66..0C6F (10 chars)
+0CE6..0CEF (10 chars)
+0D66..0D6F (10 chars)
+0E50..0E59 (10 chars)
+0ED0..0ED9 (10 chars)
+0F20..0F33 (20 chars)
+1040..1049 (10 chars)
+1369..137C (20 chars)
+16EE..16F0 (3 chars)
+17E0..17E9 (10 chars)
+1810..1819 (10 chars)
+2070
+2074..2079 (6 chars)
+2080..2089 (10 chars)
+2153..2183 (49 chars)
+2460..249B (60 chars)
+24EA
+2776..2793 (30 chars)
+3007
+3021..3029 (9 chars)
+3038..303A (3 chars)
+3192..3195 (4 chars)
+3220..3229 (10 chars)
+3280..3289 (10 chars)
+FF10..FF19 (10 chars)
+
+*******************************************
+
+Property dump for: 0x20000001 (Alphabetic)
+
+0041..005A (26 chars)
+0061..007A (26 chars)
+00AA
+00B5
+00BA
+00C0..00D6 (23 chars)
+00D8..00F6 (31 chars)
+00F8..021F (296 chars)
+0222..0233 (18 chars)
+0250..02AD (94 chars)
+02B0..02B8 (9 chars)
+02BB..02C1 (7 chars)
+02E0..02E4 (5 chars)
+02EE
+0345
+037A
+0386
+0388..038A (3 chars)
+038C
+038E..03A1 (20 chars)
+03A3..03CE (44 chars)
+03D0..03D7 (8 chars)
+03DA..03F3 (26 chars)
+0400..0481 (130 chars)
+048C..04C4 (57 chars)
+04C7..04C8 (2 chars)
+04CB..04CC (2 chars)
+04D0..04F5 (38 chars)
+04F8..04F9 (2 chars)
+0531..0556 (38 chars)
+0559
+0561..0587 (39 chars)
+05D0..05EA (27 chars)
+05F0..05F2 (3 chars)
+0621..063A (26 chars)
+0641..0655 (21 chars)
+0670..06D3 (100 chars)
+06D5..06DC (8 chars)
+06E1..06E8 (8 chars)
+06ED
+06FA..06FC (3 chars)
+0710..072C (29 chars)
+0730..073F (16 chars)
+0780..07B0 (49 chars)
+0901..0903 (3 chars)
+0905..0939 (53 chars)
+093D..094C (16 chars)
+0950
+0958..0963 (12 chars)
+0981..0983 (3 chars)
+0985..098C (8 chars)
+098F..0990 (2 chars)
+0993..09A8 (22 chars)
+09AA..09B0 (7 chars)
+09B2
+09B6..09B9 (4 chars)
+09BE..09C4 (7 chars)
+09C7..09C8 (2 chars)
+09CB..09CC (2 chars)
+09D7
+09DC..09DD (2 chars)
+09DF..09E3 (5 chars)
+09F0..09F1 (2 chars)
+0A02
+0A05..0A0A (6 chars)
+0A0F..0A10 (2 chars)
+0A13..0A28 (22 chars)
+0A2A..0A30 (7 chars)
+0A32..0A33 (2 chars)
+0A35..0A36 (2 chars)
+0A38..0A39 (2 chars)
+0A3E..0A42 (5 chars)
+0A47..0A48 (2 chars)
+0A4B..0A4C (2 chars)
+0A59..0A5C (4 chars)
+0A5E
+0A70..0A74 (5 chars)
+0A81..0A83 (3 chars)
+0A85..0A8B (7 chars)
+0A8D
+0A8F..0A91 (3 chars)
+0A93..0AA8 (22 chars)
+0AAA..0AB0 (7 chars)
+0AB2..0AB3 (2 chars)
+0AB5..0AB9 (5 chars)
+0ABD..0AC5 (9 chars)
+0AC7..0AC9 (3 chars)
+0ACB..0ACC (2 chars)
+0AD0
+0AE0
+0B01..0B03 (3 chars)
+0B05..0B0C (8 chars)
+0B0F..0B10 (2 chars)
+0B13..0B28 (22 chars)
+0B2A..0B30 (7 chars)
+0B32..0B33 (2 chars)
+0B36..0B39 (4 chars)
+0B3D..0B43 (7 chars)
+0B47..0B48 (2 chars)
+0B4B..0B4C (2 chars)
+0B56..0B57 (2 chars)
+0B5C..0B5D (2 chars)
+0B5F..0B61 (3 chars)
+0B82..0B83 (2 chars)
+0B85..0B8A (6 chars)
+0B8E..0B90 (3 chars)
+0B92..0B95 (4 chars)
+0B99..0B9A (2 chars)
+0B9C
+0B9E..0B9F (2 chars)
+0BA3..0BA4 (2 chars)
+0BA8..0BAA (3 chars)
+0BAE..0BB5 (8 chars)
+0BB7..0BB9 (3 chars)
+0BBE..0BC2 (5 chars)
+0BC6..0BC8 (3 chars)
+0BCA..0BCC (3 chars)
+0BD7
+0C01..0C03 (3 chars)
+0C05..0C0C (8 chars)
+0C0E..0C10 (3 chars)
+0C12..0C28 (23 chars)
+0C2A..0C33 (10 chars)
+0C35..0C39 (5 chars)
+0C3E..0C44 (7 chars)
+0C46..0C48 (3 chars)
+0C4A..0C4C (3 chars)
+0C55..0C56 (2 chars)
+0C60..0C61 (2 chars)
+0C82..0C83 (2 chars)
+0C85..0C8C (8 chars)
+0C8E..0C90 (3 chars)
+0C92..0CA8 (23 chars)
+0CAA..0CB3 (10 chars)
+0CB5..0CB9 (5 chars)
+0CBE..0CC4 (7 chars)
+0CC6..0CC8 (3 chars)
+0CCA..0CCC (3 chars)
+0CD5..0CD6 (2 chars)
+0CDE
+0CE0..0CE1 (2 chars)
+0D02..0D03 (2 chars)
+0D05..0D0C (8 chars)
+0D0E..0D10 (3 chars)
+0D12..0D28 (23 chars)
+0D2A..0D39 (16 chars)
+0D3E..0D43 (6 chars)
+0D46..0D48 (3 chars)
+0D4A..0D4C (3 chars)
+0D57
+0D60..0D61 (2 chars)
+0D82..0D83 (2 chars)
+0D85..0D96 (18 chars)
+0D9A..0DB1 (24 chars)
+0DB3..0DBB (9 chars)
+0DBD
+0DC0..0DC6 (7 chars)
+0DCF..0DD4 (6 chars)
+0DD6
+0DD8..0DDF (8 chars)
+0DF2..0DF3 (2 chars)
+0E01..0E3A (58 chars)
+0E40..0E45 (6 chars)
+0E47
+0E4D
+0E81..0E82 (2 chars)
+0E84
+0E87..0E88 (2 chars)
+0E8A
+0E8D
+0E94..0E97 (4 chars)
+0E99..0E9F (7 chars)
+0EA1..0EA3 (3 chars)
+0EA5
+0EA7
+0EAA..0EAB (2 chars)
+0EAD..0EB9 (13 chars)
+0EBB..0EBD (3 chars)
+0EC0..0EC4 (5 chars)
+0ECD
+0EDC..0EDD (2 chars)
+0F00
+0F40..0F47 (8 chars)
+0F49..0F6A (34 chars)
+0F71..0F81 (17 chars)
+0F88..0F8B (4 chars)
+0F90..0F97 (8 chars)
+0F99..0FBC (36 chars)
+1000..1021 (34 chars)
+1023..1027 (5 chars)
+1029..102A (2 chars)
+102C..1032 (7 chars)
+1036
+1038
+1050..1059 (10 chars)
+10A0..10C5 (38 chars)
+10D0..10F6 (39 chars)
+1100..1159 (90 chars)
+115F..11A2 (68 chars)
+11A8..11F9 (82 chars)
+1200..1206 (7 chars)
+1208..1246 (63 chars)
+1248
+124A..124D (4 chars)
+1250..1256 (7 chars)
+1258
+125A..125D (4 chars)
+1260..1286 (39 chars)
+1288
+128A..128D (4 chars)
+1290..12AE (31 chars)
+12B0
+12B2..12B5 (4 chars)
+12B8..12BE (7 chars)
+12C0
+12C2..12C5 (4 chars)
+12C8..12CE (7 chars)
+12D0..12D6 (7 chars)
+12D8..12EE (23 chars)
+12F0..130E (31 chars)
+1310
+1312..1315 (4 chars)
+1318..131E (7 chars)
+1320..1346 (39 chars)
+1348..135A (19 chars)
+13A0..13F4 (85 chars)
+1401..166C (620 chars)
+166F..1676 (8 chars)
+1681..169A (26 chars)
+16A0..16EA (75 chars)
+1780..17C8 (73 chars)
+1820..1842 (35 chars)
+1844..1877 (52 chars)
+1880..18A9 (42 chars)
+1E00..1E9B (156 chars)
+1EA0..1EF9 (90 chars)
+1F00..1F15 (22 chars)
+1F18..1F1D (6 chars)
+1F20..1F45 (38 chars)
+1F48..1F4D (6 chars)
+1F50..1F57 (8 chars)
+1F59
+1F5B
+1F5D
+1F5F..1F7D (31 chars)
+1F80..1FB4 (53 chars)
+1FB6..1FBC (7 chars)
+1FBE
+1FC2..1FC4 (3 chars)
+1FC6..1FCC (7 chars)
+1FD0..1FD3 (4 chars)
+1FD6..1FDB (6 chars)
+1FE0..1FEC (13 chars)
+1FF2..1FF4 (3 chars)
+1FF6..1FFC (7 chars)
+207F
+2102
+2107
+210A..2113 (10 chars)
+2115
+2119..211D (5 chars)
+2124
+2126
+2128
+212A..212D (4 chars)
+212F..2131 (3 chars)
+2133..2139 (7 chars)
+2160..2183 (36 chars)
+3041..3094 (84 chars)
+30A1..30FA (90 chars)
+3105..312C (40 chars)
+3131..318E (94 chars)
+31A0..31B7 (24 chars)
+A000..A48C (1165 chars)
+AC00..D7A3 (11172 chars)
+FB00..FB06 (7 chars)
+FB13..FB17 (5 chars)
+FB1D
+FB1F..FB28 (10 chars)
+FB2A..FB36 (13 chars)
+FB38..FB3C (5 chars)
+FB3E
+FB40..FB41 (2 chars)
+FB43..FB44 (2 chars)
+FB46..FBB1 (108 chars)
+FBD3..FD3D (363 chars)
+FD50..FD8F (64 chars)
+FD92..FDC7 (54 chars)
+FDF0..FDFB (12 chars)
+FE70..FE72 (3 chars)
+FE74
+FE76..FEFC (135 chars)
+FF21..FF3A (26 chars)
+FF41..FF5A (26 chars)
+FF66..FF6F (10 chars)
+FF71..FF9D (45 chars)
+FFA0..FFBE (31 chars)
+FFC2..FFC7 (6 chars)
+FFCA..FFCF (6 chars)
+FFD2..FFD7 (6 chars)
+FFDA..FFDC (3 chars)
+
+*******************************************
+
+Property dump for: 0x20000002 (Ideographic)
+
+3006..3007 (2 chars)
+3021..3029 (9 chars)
+3038..303A (3 chars)
+3400..4DB5 (6582 chars)
+4E00..9FA5 (20902 chars)
+F900..FA2D (302 chars)
+
+*******************************************
+
+Property dump for: 0x20010000 (Diacritic)
+
+005E
+0060
+00A8
+00AF
+00B4
+00B7..00B8 (2 chars)
+02B0..02EE (63 chars)
+0300..034E (79 chars)
+0360..0362 (3 chars)
+0374..0375 (2 chars)
+037A
+0384..0385 (2 chars)
+0483..0486 (4 chars)
+0559
+0591..05A1 (17 chars)
+05A3..05B9 (23 chars)
+05BB..05BD (3 chars)
+05BF
+05C1..05C2 (2 chars)
+05C4
+06DF..06E0 (2 chars)
+06E5..06E6 (2 chars)
+06EA..06EC (3 chars)
+0740..074A (11 chars)
+093C
+094D
+0951..0954 (4 chars)
+09BC
+09CD
+0A3C
+0A4D
+0ABC
+0ACD
+0B3C
+0B4D
+0BCD
+0C4D
+0CCD
+0D4D
+0DCA
+0E48..0E4C (5 chars)
+0E4E
+0EC8..0ECC (5 chars)
+0F18..0F19 (2 chars)
+0F35
+0F37
+0F39
+0F3E..0F3F (2 chars)
+0F82..0F84 (3 chars)
+0F86..0F87 (2 chars)
+0FC6
+1037
+1039
+17C9..17D3 (11 chars)
+1FBD
+1FBF..1FC1 (3 chars)
+1FCD..1FCF (3 chars)
+1FDD..1FDF (3 chars)
+1FED..1FEF (3 chars)
+1FFD..1FFE (2 chars)
+302A..302F (6 chars)
+3099..309C (4 chars)
+30FC
+FB1E
+FE20..FE23 (4 chars)
+FF3E
+FF40
+FF70
+FF9E..FF9F (2 chars)
+FFE3
+
+*******************************************
+
+Property dump for: 0x20000040 (Extender)
+
+00B7
+02D0..02D1 (2 chars)
+0640
+0E46
+0EC6
+1843
+3005
+3031..3035 (5 chars)
+309D..309E (2 chars)
+30FC..30FE (3 chars)
+FF70
+
+*******************************************
+
+Property dump for: 0x20020000 (Identifier Part)
+
+0030..0039 (10 chars)
+0041..005A (26 chars)
+005F
+0061..007A (26 chars)
+00AA
+00B5
+00BA
+00C0..00D6 (23 chars)
+00D8..00F6 (31 chars)
+00F8..021F (296 chars)
+0222..0233 (18 chars)
+0250..02AD (94 chars)
+02B0..02B8 (9 chars)
+02BB..02C1 (7 chars)
+02D0..02D1 (2 chars)
+02E0..02E4 (5 chars)
+02EE
+0300..034E (79 chars)
+0360..0362 (3 chars)
+037A
+0386
+0388..038A (3 chars)
+038C
+038E..03A1 (20 chars)
+03A3..03CE (44 chars)
+03D0..03D7 (8 chars)
+03DA..03F3 (26 chars)
+0400..0481 (130 chars)
+0483..0486 (4 chars)
+048C..04C4 (57 chars)
+04C7..04C8 (2 chars)
+04CB..04CC (2 chars)
+04D0..04F5 (38 chars)
+04F8..04F9 (2 chars)
+0531..0556 (38 chars)
+0559
+0561..0587 (39 chars)
+0591..05A1 (17 chars)
+05A3..05B9 (23 chars)
+05BB..05BD (3 chars)
+05BF
+05C1..05C2 (2 chars)
+05C4
+05D0..05EA (27 chars)
+05F0..05F2 (3 chars)
+0621..063A (26 chars)
+0640..0655 (22 chars)
+0660..0669 (10 chars)
+0670..06D3 (100 chars)
+06D5..06DC (8 chars)
+06DF..06E8 (10 chars)
+06EA..06ED (4 chars)
+06F0..06FC (13 chars)
+0710..072C (29 chars)
+0730..074A (27 chars)
+0780..07B0 (49 chars)
+0901..0903 (3 chars)
+0905..0939 (53 chars)
+093C..094D (18 chars)
+0950..0954 (5 chars)
+0958..0963 (12 chars)
+0966..096F (10 chars)
+0981..0983 (3 chars)
+0985..098C (8 chars)
+098F..0990 (2 chars)
+0993..09A8 (22 chars)
+09AA..09B0 (7 chars)
+09B2
+09B6..09B9 (4 chars)
+09BC
+09BE..09C4 (7 chars)
+09C7..09C8 (2 chars)
+09CB..09CD (3 chars)
+09D7
+09DC..09DD (2 chars)
+09DF..09E3 (5 chars)
+09E6..09F1 (12 chars)
+0A02
+0A05..0A0A (6 chars)
+0A0F..0A10 (2 chars)
+0A13..0A28 (22 chars)
+0A2A..0A30 (7 chars)
+0A32..0A33 (2 chars)
+0A35..0A36 (2 chars)
+0A38..0A39 (2 chars)
+0A3C
+0A3E..0A42 (5 chars)
+0A47..0A48 (2 chars)
+0A4B..0A4D (3 chars)
+0A59..0A5C (4 chars)
+0A5E
+0A66..0A74 (15 chars)
+0A81..0A83 (3 chars)
+0A85..0A8B (7 chars)
+0A8D
+0A8F..0A91 (3 chars)
+0A93..0AA8 (22 chars)
+0AAA..0AB0 (7 chars)
+0AB2..0AB3 (2 chars)
+0AB5..0AB9 (5 chars)
+0ABC..0AC5 (10 chars)
+0AC7..0AC9 (3 chars)
+0ACB..0ACD (3 chars)
+0AD0
+0AE0
+0AE6..0AEF (10 chars)
+0B01..0B03 (3 chars)
+0B05..0B0C (8 chars)
+0B0F..0B10 (2 chars)
+0B13..0B28 (22 chars)
+0B2A..0B30 (7 chars)
+0B32..0B33 (2 chars)
+0B36..0B39 (4 chars)
+0B3C..0B43 (8 chars)
+0B47..0B48 (2 chars)
+0B4B..0B4D (3 chars)
+0B56..0B57 (2 chars)
+0B5C..0B5D (2 chars)
+0B5F..0B61 (3 chars)
+0B66..0B6F (10 chars)
+0B82..0B83 (2 chars)
+0B85..0B8A (6 chars)
+0B8E..0B90 (3 chars)
+0B92..0B95 (4 chars)
+0B99..0B9A (2 chars)
+0B9C
+0B9E..0B9F (2 chars)
+0BA3..0BA4 (2 chars)
+0BA8..0BAA (3 chars)
+0BAE..0BB5 (8 chars)
+0BB7..0BB9 (3 chars)
+0BBE..0BC2 (5 chars)
+0BC6..0BC8 (3 chars)
+0BCA..0BCD (4 chars)
+0BD7
+0BE7..0BEF (9 chars)
+0C01..0C03 (3 chars)
+0C05..0C0C (8 chars)
+0C0E..0C10 (3 chars)
+0C12..0C28 (23 chars)
+0C2A..0C33 (10 chars)
+0C35..0C39 (5 chars)
+0C3E..0C44 (7 chars)
+0C46..0C48 (3 chars)
+0C4A..0C4D (4 chars)
+0C55..0C56 (2 chars)
+0C60..0C61 (2 chars)
+0C66..0C6F (10 chars)
+0C82..0C83 (2 chars)
+0C85..0C8C (8 chars)
+0C8E..0C90 (3 chars)
+0C92..0CA8 (23 chars)
+0CAA..0CB3 (10 chars)
+0CB5..0CB9 (5 chars)
+0CBE..0CC4 (7 chars)
+0CC6..0CC8 (3 chars)
+0CCA..0CCD (4 chars)
+0CD5..0CD6 (2 chars)
+0CDE
+0CE0..0CE1 (2 chars)
+0CE6..0CEF (10 chars)
+0D02..0D03 (2 chars)
+0D05..0D0C (8 chars)
+0D0E..0D10 (3 chars)
+0D12..0D28 (23 chars)
+0D2A..0D39 (16 chars)
+0D3E..0D43 (6 chars)
+0D46..0D48 (3 chars)
+0D4A..0D4D (4 chars)
+0D57
+0D60..0D61 (2 chars)
+0D66..0D6F (10 chars)
+0D82..0D83 (2 chars)
+0D85..0D96 (18 chars)
+0D9A..0DB1 (24 chars)
+0DB3..0DBB (9 chars)
+0DBD
+0DC0..0DC6 (7 chars)
+0DCA
+0DCF..0DD4 (6 chars)
+0DD6
+0DD8..0DDF (8 chars)
+0DF2..0DF3 (2 chars)
+0E01..0E3A (58 chars)
+0E40..0E4E (15 chars)
+0E50..0E59 (10 chars)
+0E81..0E82 (2 chars)
+0E84
+0E87..0E88 (2 chars)
+0E8A
+0E8D
+0E94..0E97 (4 chars)
+0E99..0E9F (7 chars)
+0EA1..0EA3 (3 chars)
+0EA5
+0EA7
+0EAA..0EAB (2 chars)
+0EAD..0EB9 (13 chars)
+0EBB..0EBD (3 chars)
+0EC0..0EC4 (5 chars)
+0EC6
+0EC8..0ECD (6 chars)
+0ED0..0ED9 (10 chars)
+0EDC..0EDD (2 chars)
+0F00
+0F18..0F19 (2 chars)
+0F20..0F29 (10 chars)
+0F35
+0F37
+0F39
+0F3E..0F47 (10 chars)
+0F49..0F6A (34 chars)
+0F71..0F84 (20 chars)
+0F86..0F8B (6 chars)
+0F90..0F97 (8 chars)
+0F99..0FBC (36 chars)
+0FC6
+1000..1021 (34 chars)
+1023..1027 (5 chars)
+1029..102A (2 chars)
+102C..1032 (7 chars)
+1036..1039 (4 chars)
+1040..1049 (10 chars)
+1050..1059 (10 chars)
+10A0..10C5 (38 chars)
+10D0..10F6 (39 chars)
+1100..1159 (90 chars)
+115F..11A2 (68 chars)
+11A8..11F9 (82 chars)
+1200..1206 (7 chars)
+1208..1246 (63 chars)
+1248
+124A..124D (4 chars)
+1250..1256 (7 chars)
+1258
+125A..125D (4 chars)
+1260..1286 (39 chars)
+1288
+128A..128D (4 chars)
+1290..12AE (31 chars)
+12B0
+12B2..12B5 (4 chars)
+12B8..12BE (7 chars)
+12C0
+12C2..12C5 (4 chars)
+12C8..12CE (7 chars)
+12D0..12D6 (7 chars)
+12D8..12EE (23 chars)
+12F0..130E (31 chars)
+1310
+1312..1315 (4 chars)
+1318..131E (7 chars)
+1320..1346 (39 chars)
+1348..135A (19 chars)
+1369..1371 (9 chars)
+13A0..13F4 (85 chars)
+1401..166C (620 chars)
+166F..1676 (8 chars)
+1681..169A (26 chars)
+16A0..16EA (75 chars)
+1780..17D3 (84 chars)
+17E0..17E9 (10 chars)
+1810..1819 (10 chars)
+1820..1877 (88 chars)
+1880..18A9 (42 chars)
+1E00..1E9B (156 chars)
+1EA0..1EF9 (90 chars)
+1F00..1F15 (22 chars)
+1F18..1F1D (6 chars)
+1F20..1F45 (38 chars)
+1F48..1F4D (6 chars)
+1F50..1F57 (8 chars)
+1F59
+1F5B
+1F5D
+1F5F..1F7D (31 chars)
+1F80..1FB4 (53 chars)
+1FB6..1FBC (7 chars)
+1FBE
+1FC2..1FC4 (3 chars)
+1FC6..1FCC (7 chars)
+1FD0..1FD3 (4 chars)
+1FD6..1FDB (6 chars)
+1FE0..1FEC (13 chars)
+1FF2..1FF4 (3 chars)
+1FF6..1FFC (7 chars)
+203F..2040 (2 chars)
+207F
+20D0..20DC (13 chars)
+20E1
+2102
+2107
+210A..2113 (10 chars)
+2115
+2119..211D (5 chars)
+2124
+2126
+2128
+212A..212D (4 chars)
+212F..2131 (3 chars)
+2133..2139 (7 chars)
+2160..2183 (36 chars)
+3005..3007 (3 chars)
+3021..302F (15 chars)
+3031..3035 (5 chars)
+3038..303A (3 chars)
+3041..3094 (84 chars)
+3099..309A (2 chars)
+309D..309E (2 chars)
+30A1..30FE (94 chars)
+3105..312C (40 chars)
+3131..318E (94 chars)
+31A0..31B7 (24 chars)
+3400..4DB5 (6582 chars)
+4E00..9FA5 (20902 chars)
+A000..A48C (1165 chars)
+AC00..D7A3 (11172 chars)
+F900..FA2D (302 chars)
+FB00..FB06 (7 chars)
+FB13..FB17 (5 chars)
+FB1D..FB28 (12 chars)
+FB2A..FB36 (13 chars)
+FB38..FB3C (5 chars)
+FB3E
+FB40..FB41 (2 chars)
+FB43..FB44 (2 chars)
+FB46..FBB1 (108 chars)
+FBD3..FD3D (363 chars)
+FD50..FD8F (64 chars)
+FD92..FDC7 (54 chars)
+FDF0..FDFB (12 chars)
+FE20..FE23 (4 chars)
+FE33..FE34 (2 chars)
+FE4D..FE4F (3 chars)
+FE70..FE72 (3 chars)
+FE74
+FE76..FEFC (135 chars)
+FF10..FF19 (10 chars)
+FF21..FF3A (26 chars)
+FF3F
+FF41..FF5A (26 chars)
+FF65..FFBE (90 chars)
+FFC2..FFC7 (6 chars)
+FFCA..FFCF (6 chars)
+FFD2..FFD7 (6 chars)
+FFDA..FFDC (3 chars)
+
+*******************************************
+
+Property dump for: 0x10000080 (Ignorable Control)
+
+0001..0008 (8 chars)
+000E..001B (14 chars)
+007F..0084 (6 chars)
+0086..009F (26 chars)
+070F
+180B..180E (4 chars)
+200C..200F (4 chars)
+202A..202E (5 chars)
+206A..206F (6 chars)
+FEFF
+FFF9..FFFB (3 chars)
+
+*******************************************
+
+Property dump for: 0x01000000 (Bidi: Left-to-Right)
+
+0041..005A (26 chars)
+0061..007A (26 chars)
+00AA
+00B5
+00BA
+00C0..00D6 (23 chars)
+00D8..00F6 (31 chars)
+00F8..021F (296 chars)
+0222..0233 (18 chars)
+0250..02AD (94 chars)
+02B0..02B8 (9 chars)
+02BB..02C1 (7 chars)
+02D0..02D1 (2 chars)
+02E0..02E4 (5 chars)
+02EE
+037A
+0386
+0388..038A (3 chars)
+038C
+038E..03A1 (20 chars)
+03A3..03CE (44 chars)
+03D0..03D7 (8 chars)
+03DA..03F3 (26 chars)
+0400..0482 (131 chars)
+048C..04C4 (57 chars)
+04C7..04C8 (2 chars)
+04CB..04CC (2 chars)
+04D0..04F5 (38 chars)
+04F8..04F9 (2 chars)
+0531..0556 (38 chars)
+0559..055F (7 chars)
+0561..0587 (39 chars)
+0589
+0903
+0905..0939 (53 chars)
+093D..0940 (4 chars)
+0949..094C (4 chars)
+0950
+0958..0961 (10 chars)
+0964..0970 (13 chars)
+0982..0983 (2 chars)
+0985..098C (8 chars)
+098F..0990 (2 chars)
+0993..09A8 (22 chars)
+09AA..09B0 (7 chars)
+09B2
+09B6..09B9 (4 chars)
+09BE..09C0 (3 chars)
+09C7..09C8 (2 chars)
+09CB..09CC (2 chars)
+09D7
+09DC..09DD (2 chars)
+09DF..09E1 (3 chars)
+09E6..09F1 (12 chars)
+09F4..09FA (7 chars)
+0A05..0A0A (6 chars)
+0A0F..0A10 (2 chars)
+0A13..0A28 (22 chars)
+0A2A..0A30 (7 chars)
+0A32..0A33 (2 chars)
+0A35..0A36 (2 chars)
+0A38..0A39 (2 chars)
+0A3E..0A40 (3 chars)
+0A59..0A5C (4 chars)
+0A5E
+0A66..0A6F (10 chars)
+0A72..0A74 (3 chars)
+0A83
+0A85..0A8B (7 chars)
+0A8D
+0A8F..0A91 (3 chars)
+0A93..0AA8 (22 chars)
+0AAA..0AB0 (7 chars)
+0AB2..0AB3 (2 chars)
+0AB5..0AB9 (5 chars)
+0ABD..0AC0 (4 chars)
+0AC9
+0ACB..0ACC (2 chars)
+0AD0
+0AE0
+0AE6..0AEF (10 chars)
+0B02..0B03 (2 chars)
+0B05..0B0C (8 chars)
+0B0F..0B10 (2 chars)
+0B13..0B28 (22 chars)
+0B2A..0B30 (7 chars)
+0B32..0B33 (2 chars)
+0B36..0B39 (4 chars)
+0B3D..0B3E (2 chars)
+0B40
+0B47..0B48 (2 chars)
+0B4B..0B4C (2 chars)
+0B57
+0B5C..0B5D (2 chars)
+0B5F..0B61 (3 chars)
+0B66..0B70 (11 chars)
+0B83
+0B85..0B8A (6 chars)
+0B8E..0B90 (3 chars)
+0B92..0B95 (4 chars)
+0B99..0B9A (2 chars)
+0B9C
+0B9E..0B9F (2 chars)
+0BA3..0BA4 (2 chars)
+0BA8..0BAA (3 chars)
+0BAE..0BB5 (8 chars)
+0BB7..0BB9 (3 chars)
+0BBE..0BBF (2 chars)
+0BC1..0BC2 (2 chars)
+0BC6..0BC8 (3 chars)
+0BCA..0BCC (3 chars)
+0BD7
+0BE7..0BF2 (12 chars)
+0C01..0C03 (3 chars)
+0C05..0C0C (8 chars)
+0C0E..0C10 (3 chars)
+0C12..0C28 (23 chars)
+0C2A..0C33 (10 chars)
+0C35..0C39 (5 chars)
+0C41..0C44 (4 chars)
+0C60..0C61 (2 chars)
+0C66..0C6F (10 chars)
+0C82..0C83 (2 chars)
+0C85..0C8C (8 chars)
+0C8E..0C90 (3 chars)
+0C92..0CA8 (23 chars)
+0CAA..0CB3 (10 chars)
+0CB5..0CB9 (5 chars)
+0CBE
+0CC0..0CC4 (5 chars)
+0CC7..0CC8 (2 chars)
+0CCA..0CCB (2 chars)
+0CD5..0CD6 (2 chars)
+0CDE
+0CE0..0CE1 (2 chars)
+0CE6..0CEF (10 chars)
+0D02..0D03 (2 chars)
+0D05..0D0C (8 chars)
+0D0E..0D10 (3 chars)
+0D12..0D28 (23 chars)
+0D2A..0D39 (16 chars)
+0D3E..0D40 (3 chars)
+0D46..0D48 (3 chars)
+0D4A..0D4C (3 chars)
+0D57
+0D60..0D61 (2 chars)
+0D66..0D6F (10 chars)
+0D82..0D83 (2 chars)
+0D85..0D96 (18 chars)
+0D9A..0DB1 (24 chars)
+0DB3..0DBB (9 chars)
+0DBD
+0DC0..0DC6 (7 chars)
+0DCF..0DD1 (3 chars)
+0DD8..0DDF (8 chars)
+0DF2..0DF4 (3 chars)
+0E01..0E30 (48 chars)
+0E32..0E33 (2 chars)
+0E40..0E46 (7 chars)
+0E4F..0E5B (13 chars)
+0E81..0E82 (2 chars)
+0E84
+0E87..0E88 (2 chars)
+0E8A
+0E8D
+0E94..0E97 (4 chars)
+0E99..0E9F (7 chars)
+0EA1..0EA3 (3 chars)
+0EA5
+0EA7
+0EAA..0EAB (2 chars)
+0EAD..0EB0 (4 chars)
+0EB2..0EB3 (2 chars)
+0EBD
+0EC0..0EC4 (5 chars)
+0EC6
+0ED0..0ED9 (10 chars)
+0EDC..0EDD (2 chars)
+0F00..0F17 (24 chars)
+0F1A..0F34 (27 chars)
+0F36
+0F38
+0F3E..0F47 (10 chars)
+0F49..0F6A (34 chars)
+0F7F
+0F85
+0F88..0F8B (4 chars)
+0FBE..0FC5 (8 chars)
+0FC7..0FCC (6 chars)
+0FCF
+1000..1021 (34 chars)
+1023..1027 (5 chars)
+1029..102A (2 chars)
+102C
+1031
+1038
+1040..1057 (24 chars)
+10A0..10C5 (38 chars)
+10D0..10F6 (39 chars)
+10FB
+1100..1159 (90 chars)
+115F..11A2 (68 chars)
+11A8..11F9 (82 chars)
+1200..1206 (7 chars)
+1208..1246 (63 chars)
+1248
+124A..124D (4 chars)
+1250..1256 (7 chars)
+1258
+125A..125D (4 chars)
+1260..1286 (39 chars)
+1288
+128A..128D (4 chars)
+1290..12AE (31 chars)
+12B0
+12B2..12B5 (4 chars)
+12B8..12BE (7 chars)
+12C0
+12C2..12C5 (4 chars)
+12C8..12CE (7 chars)
+12D0..12D6 (7 chars)
+12D8..12EE (23 chars)
+12F0..130E (31 chars)
+1310
+1312..1315 (4 chars)
+1318..131E (7 chars)
+1320..1346 (39 chars)
+1348..135A (19 chars)
+1361..137C (28 chars)
+13A0..13F4 (85 chars)
+1401..1676 (630 chars)
+1681..169A (26 chars)
+16A0..16F0 (81 chars)
+1780..17B6 (55 chars)
+17BE..17C5 (8 chars)
+17C7..17C8 (2 chars)
+17D4..17DA (7 chars)
+17DC
+17E0..17E9 (10 chars)
+1810..1819 (10 chars)
+1820..1877 (88 chars)
+1880..18A8 (41 chars)
+1E00..1E9B (156 chars)
+1EA0..1EF9 (90 chars)
+1F00..1F15 (22 chars)
+1F18..1F1D (6 chars)
+1F20..1F45 (38 chars)
+1F48..1F4D (6 chars)
+1F50..1F57 (8 chars)
+1F59
+1F5B
+1F5D
+1F5F..1F7D (31 chars)
+1F80..1FB4 (53 chars)
+1FB6..1FBC (7 chars)
+1FBE
+1FC2..1FC4 (3 chars)
+1FC6..1FCC (7 chars)
+1FD0..1FD3 (4 chars)
+1FD6..1FDB (6 chars)
+1FE0..1FEC (13 chars)
+1FF2..1FF4 (3 chars)
+1FF6..1FFC (7 chars)
+200E
+207F
+2102
+2107
+210A..2113 (10 chars)
+2115
+2119..211D (5 chars)
+2124
+2126
+2128
+212A..212D (4 chars)
+212F..2131 (3 chars)
+2133..2139 (7 chars)
+2160..2183 (36 chars)
+2336..237A (69 chars)
+2395
+249C..24E9 (78 chars)
+3005..3007 (3 chars)
+3021..3029 (9 chars)
+3031..3035 (5 chars)
+3038..303A (3 chars)
+3041..3094 (84 chars)
+309D..309E (2 chars)
+30A1..30FA (90 chars)
+30FC..30FE (3 chars)
+3105..312C (40 chars)
+3131..318E (94 chars)
+3190..31B7 (40 chars)
+3200..321C (29 chars)
+3220..3243 (36 chars)
+3260..327B (28 chars)
+327F..32B0 (50 chars)
+32C0..32CB (12 chars)
+32D0..32FE (47 chars)
+3300..3376 (119 chars)
+337B..33DD (99 chars)
+33E0..33FE (31 chars)
+3400..4DB5 (6582 chars)
+4E00..9FA5 (20902 chars)
+A000..A48C (1165 chars)
+AC00..D7A3 (11172 chars)
+D800..F7FF (8192 chars)
+F900..FA2D (302 chars)
+FB00..FB06 (7 chars)
+FB13..FB17 (5 chars)
+FF21..FF3A (26 chars)
+FF41..FF5A (26 chars)
+FF66..FFBE (89 chars)
+FFC2..FFC7 (6 chars)
+FFCA..FFCF (6 chars)
+FFD2..FFD7 (6 chars)
+FFDA..FFDC (3 chars)
+
+*******************************************
+
+Property dump for: 0x02000000 (Bidi: (Hebrew) Right-to-Left)
+
+05BE
+05C0
+05C3
+05D0..05EA (27 chars)
+05F0..05F4 (5 chars)
+200F
+FB1D
+FB1F..FB28 (10 chars)
+FB2A..FB36 (13 chars)
+FB38..FB3C (5 chars)
+FB3E
+FB40..FB41 (2 chars)
+FB43..FB44 (2 chars)
+FB46..FB4F (10 chars)
+
+*******************************************
+
+Property dump for: 0x0B000000 (Bidi: Arabic Right-to-Left)
+
+061B
+061F
+0621..063A (26 chars)
+0640..064A (11 chars)
+066D
+0671..06D5 (101 chars)
+06E5..06E6 (2 chars)
+06FA..06FE (5 chars)
+0700..070D (14 chars)
+0710
+0712..072C (27 chars)
+0780..07A5 (38 chars)
+FB50..FBB1 (98 chars)
+FBD3..FD3D (363 chars)
+FD50..FD8F (64 chars)
+FD92..FDC7 (54 chars)
+FDF0..FDFB (12 chars)
+FE70..FE72 (3 chars)
+FE74
+FE76..FEFC (135 chars)
+
+*******************************************
+
+Property dump for: 0x03000000 (Bidi: European Digit)
+
+0030..0039 (10 chars)
+00B2..00B3 (2 chars)
+00B9
+06F0..06F9 (10 chars)
+2070
+2074..2079 (6 chars)
+2080..2089 (10 chars)
+2460..249B (60 chars)
+24EA
+FF10..FF19 (10 chars)
+
+*******************************************
+
+Property dump for: 0x04000000 (Bidi: Eur Num Separator)
+
+002F
+FF0F
+
+*******************************************
+
+Property dump for: 0x05000000 (Bidi: Eur Num Terminator)
+
+0023..0025 (3 chars)
+002B
+002D
+00A2..00A5 (4 chars)
+00B0..00B1 (2 chars)
+066A
+09F2..09F3 (2 chars)
+0E3F
+17DB
+2030..2034 (5 chars)
+207A..207B (2 chars)
+208A..208B (2 chars)
+20A0..20AF (16 chars)
+212E
+2212..2213 (2 chars)
+FB29
+FE5F
+FE62..FE63 (2 chars)
+FE69..FE6A (2 chars)
+FF03..FF05 (3 chars)
+FF0B
+FF0D
+FFE0..FFE1 (2 chars)
+FFE5..FFE6 (2 chars)
+
+*******************************************
+
+Property dump for: 0x06000000 (Bidi: Arabic Digit)
+
+0660..0669 (10 chars)
+066B..066C (2 chars)
+
+*******************************************
+
+Property dump for: 0x07000000 (Bidi: Common Separator)
+
+002C
+002E
+003A
+00A0
+060C
+FE50
+FE52
+FE55
+FF0C
+FF0E
+FF1A
+
+*******************************************
+
+Property dump for: 0x08000000 (Bidi: Block Separator)
+
+000A
+000D
+001C..001E (3 chars)
+0085
+2029
+
+*******************************************
+
+Property dump for: 0x09000000 (Bidi: Segment Separator)
+
+0009
+000B
+001F
+
+*******************************************
+
+Property dump for: 0x0A000000 (Bidi: Whitespace)
+
+000C
+0020
+1680
+2000..200A (11 chars)
+2028
+202F
+3000
+
+*******************************************
+
+Property dump for: 0x0C000000 (Bidi: Non-spacing Mark)
+
+0300..034E (79 chars)
+0360..0362 (3 chars)
+0483..0486 (4 chars)
+0488..0489 (2 chars)
+0591..05A1 (17 chars)
+05A3..05B9 (23 chars)
+05BB..05BD (3 chars)
+05BF
+05C1..05C2 (2 chars)
+05C4
+064B..0655 (11 chars)
+0670
+06D6..06E4 (15 chars)
+06E7..06E8 (2 chars)
+06EA..06ED (4 chars)
+0711
+0730..074A (27 chars)
+07A6..07B0 (11 chars)
+0901..0902 (2 chars)
+093C
+0941..0948 (8 chars)
+094D
+0951..0954 (4 chars)
+0962..0963 (2 chars)
+0981
+09BC
+09C1..09C4 (4 chars)
+09CD
+09E2..09E3 (2 chars)
+0A02
+0A3C
+0A41..0A42 (2 chars)
+0A47..0A48 (2 chars)
+0A4B..0A4D (3 chars)
+0A70..0A71 (2 chars)
+0A81..0A82 (2 chars)
+0ABC
+0AC1..0AC5 (5 chars)
+0AC7..0AC8 (2 chars)
+0ACD
+0B01
+0B3C
+0B3F
+0B41..0B43 (3 chars)
+0B4D
+0B56
+0B82
+0BC0
+0BCD
+0C3E..0C40 (3 chars)
+0C46..0C48 (3 chars)
+0C4A..0C4D (4 chars)
+0C55..0C56 (2 chars)
+0CBF
+0CC6
+0CCC..0CCD (2 chars)
+0D41..0D43 (3 chars)
+0D4D
+0DCA
+0DD2..0DD4 (3 chars)
+0DD6
+0E31
+0E34..0E3A (7 chars)
+0E47..0E4E (8 chars)
+0EB1
+0EB4..0EB9 (6 chars)
+0EBB..0EBC (2 chars)
+0EC8..0ECD (6 chars)
+0F18..0F19 (2 chars)
+0F35
+0F37
+0F39
+0F71..0F7E (14 chars)
+0F80..0F84 (5 chars)
+0F86..0F87 (2 chars)
+0F90..0F97 (8 chars)
+0F99..0FBC (36 chars)
+0FC6
+102D..1030 (4 chars)
+1032
+1036..1037 (2 chars)
+1039
+1058..1059 (2 chars)
+17B7..17BD (7 chars)
+17C6
+17C9..17D3 (11 chars)
+18A9
+20D0..20E3 (20 chars)
+302A..302F (6 chars)
+3099..309A (2 chars)
+F8F0..F8FF (16 chars)
+FB1E
+FE20..FE23 (4 chars)
+
+*******************************************
+
+Property dump for: 0x0D000000 (Bidi: Boundary Neutral)
+
+0000..0008 (9 chars)
+000E..001B (14 chars)
+007F..0084 (6 chars)
+0086..009F (26 chars)
+070F
+180B..180E (4 chars)
+200B..200D (3 chars)
+206A..206F (6 chars)
+FEFF
+FFF9..FFFB (3 chars)
+
+*******************************************
+
+Property dump for: 0x0E000000 (Bidi: PDF)
+
+202C
+
+*******************************************
+
+Property dump for: 0x0F000000 (Bidi: Embedding or Override)
+
+202A..202B (2 chars)
+202D..202E (2 chars)
+
+*******************************************
+
+Property dump for: 0x80000009 (Bidi: Other Neutral)
+
+0021..0022 (2 chars)
+0026..002A (5 chars)
+003B..0040 (6 chars)
+005B..0060 (6 chars)
+007B..007E (4 chars)
+00A1
+00A6..00A9 (4 chars)
+00AB..00AF (5 chars)
+00B4
+00B6..00B8 (3 chars)
+00BB..00BF (5 chars)
+00D7
+00F7
+02B9..02BA (2 chars)
+02C2..02CF (14 chars)
+02D2..02DF (14 chars)
+02E5..02ED (9 chars)
+0374..0375 (2 chars)
+037E
+0384..0385 (2 chars)
+0387
+058A
+06E9
+0F3A..0F3D (4 chars)
+169B..169C (2 chars)
+1800..180A (11 chars)
+1FBD
+1FBF..1FC1 (3 chars)
+1FCD..1FCF (3 chars)
+1FDD..1FDF (3 chars)
+1FED..1FEF (3 chars)
+1FFD..1FFE (2 chars)
+2010..2027 (24 chars)
+2035..2046 (18 chars)
+2048..204D (6 chars)
+207C..207E (3 chars)
+208C..208E (3 chars)
+2100..2101 (2 chars)
+2103..2106 (4 chars)
+2108..2109 (2 chars)
+2114
+2116..2118 (3 chars)
+211E..2123 (6 chars)
+2125
+2127
+2129
+2132
+213A
+2153..215F (13 chars)
+2190..21F3 (100 chars)
+2200..2211 (18 chars)
+2214..22F1 (222 chars)
+2300..2335 (54 chars)
+237B
+237D..2394 (24 chars)
+2396..239A (5 chars)
+2400..2426 (39 chars)
+2440..244A (11 chars)
+2500..2595 (150 chars)
+25A0..25F7 (88 chars)
+2600..2613 (20 chars)
+2619..2671 (89 chars)
+2701..2704 (4 chars)
+2706..2709 (4 chars)
+270C..2727 (28 chars)
+2729..274B (35 chars)
+274D
+274F..2752 (4 chars)
+2756
+2758..275E (7 chars)
+2761..2767 (7 chars)
+2776..2794 (31 chars)
+2798..27AF (24 chars)
+27B1..27BE (14 chars)
+2800..28FF (256 chars)
+2E80..2E99 (26 chars)
+2E9B..2EF3 (89 chars)
+2F00..2FD5 (214 chars)
+2FF0..2FFB (12 chars)
+3001..3004 (4 chars)
+3008..3020 (25 chars)
+3030
+3036..3037 (2 chars)
+303E..303F (2 chars)
+309B..309C (2 chars)
+30FB
+A490..A4A1 (18 chars)
+A4A4..A4B3 (16 chars)
+A4B5..A4C0 (12 chars)
+A4C2..A4C4 (3 chars)
+A4C6
+FD3E..FD3F (2 chars)
+FE30..FE44 (21 chars)
+FE49..FE4F (7 chars)
+FE51
+FE54
+FE56..FE5E (9 chars)
+FE60..FE61 (2 chars)
+FE64..FE66 (3 chars)
+FE68
+FE6B
+FF01..FF02 (2 chars)
+FF06..FF0A (5 chars)
+FF1B..FF20 (6 chars)
+FF3B..FF40 (6 chars)
+FF5B..FF5E (4 chars)
+FF61..FF65 (5 chars)
+FFE2..FFE4 (3 chars)
+FFE8..FFEE (7 chars)
+FFFC..FFFD (2 chars)
+
+*******************************************
+
+Property dump for: 0x80000005 (Private Use)
+
+E000..F8FF (6400 chars)
+
+*******************************************
+
+Property dump for: 0x80000000 (Uppercase)
+
+0041..005A (26 chars)
+00C0..00D6 (23 chars)
+00D8..00DE (7 chars)
+0100
+0102
+0104
+0106
+0108
+010A
+010C
+010E
+0110
+0112
+0114
+0116
+0118
+011A
+011C
+011E
+0120
+0122
+0124
+0126
+0128
+012A
+012C
+012E
+0130
+0132
+0134
+0136
+0139
+013B
+013D
+013F
+0141
+0143
+0145
+0147
+014A
+014C
+014E
+0150
+0152
+0154
+0156
+0158
+015A
+015C
+015E
+0160
+0162
+0164
+0166
+0168
+016A
+016C
+016E
+0170
+0172
+0174
+0176
+0178..0179 (2 chars)
+017B
+017D
+0181..0182 (2 chars)
+0184
+0186..0187 (2 chars)
+0189..018B (3 chars)
+018E..0191 (4 chars)
+0193..0194 (2 chars)
+0196..0198 (3 chars)
+019C..019D (2 chars)
+019F..01A0 (2 chars)
+01A2
+01A4
+01A6..01A7 (2 chars)
+01A9
+01AC
+01AE..01AF (2 chars)
+01B1..01B3 (3 chars)
+01B5
+01B7..01B8 (2 chars)
+01BC
+01C4
+01C7
+01CA
+01CD
+01CF
+01D1
+01D3
+01D5
+01D7
+01D9
+01DB
+01DE
+01E0
+01E2
+01E4
+01E6
+01E8
+01EA
+01EC
+01EE
+01F1
+01F4
+01F6..01F8 (3 chars)
+01FA
+01FC
+01FE
+0200
+0202
+0204
+0206
+0208
+020A
+020C
+020E
+0210
+0212
+0214
+0216
+0218
+021A
+021C
+021E
+0222
+0224
+0226
+0228
+022A
+022C
+022E
+0230
+0232
+0386
+0388..038A (3 chars)
+038C
+038E..038F (2 chars)
+0391..03A1 (17 chars)
+03A3..03AB (9 chars)
+03D2..03D4 (3 chars)
+03DA
+03DC
+03DE
+03E0
+03E2
+03E4
+03E6
+03E8
+03EA
+03EC
+03EE
+0400..042F (48 chars)
+0460
+0462
+0464
+0466
+0468
+046A
+046C
+046E
+0470
+0472
+0474
+0476
+0478
+047A
+047C
+047E
+0480
+048C
+048E
+0490
+0492
+0494
+0496
+0498
+049A
+049C
+049E
+04A0
+04A2
+04A4
+04A6
+04A8
+04AA
+04AC
+04AE
+04B0
+04B2
+04B4
+04B6
+04B8
+04BA
+04BC
+04BE
+04C0..04C1 (2 chars)
+04C3
+04C7
+04CB
+04D0
+04D2
+04D4
+04D6
+04D8
+04DA
+04DC
+04DE
+04E0
+04E2
+04E4
+04E6
+04E8
+04EA
+04EC
+04EE
+04F0
+04F2
+04F4
+04F8
+0531..0556 (38 chars)
+10A0..10C5 (38 chars)
+1E00
+1E02
+1E04
+1E06
+1E08
+1E0A
+1E0C
+1E0E
+1E10
+1E12
+1E14
+1E16
+1E18
+1E1A
+1E1C
+1E1E
+1E20
+1E22
+1E24
+1E26
+1E28
+1E2A
+1E2C
+1E2E
+1E30
+1E32
+1E34
+1E36
+1E38
+1E3A
+1E3C
+1E3E
+1E40
+1E42
+1E44
+1E46
+1E48
+1E4A
+1E4C
+1E4E
+1E50
+1E52
+1E54
+1E56
+1E58
+1E5A
+1E5C
+1E5E
+1E60
+1E62
+1E64
+1E66
+1E68
+1E6A
+1E6C
+1E6E
+1E70
+1E72
+1E74
+1E76
+1E78
+1E7A
+1E7C
+1E7E
+1E80
+1E82
+1E84
+1E86
+1E88
+1E8A
+1E8C
+1E8E
+1E90
+1E92
+1E94
+1EA0
+1EA2
+1EA4
+1EA6
+1EA8
+1EAA
+1EAC
+1EAE
+1EB0
+1EB2
+1EB4
+1EB6
+1EB8
+1EBA
+1EBC
+1EBE
+1EC0
+1EC2
+1EC4
+1EC6
+1EC8
+1ECA
+1ECC
+1ECE
+1ED0
+1ED2
+1ED4
+1ED6
+1ED8
+1EDA
+1EDC
+1EDE
+1EE0
+1EE2
+1EE4
+1EE6
+1EE8
+1EEA
+1EEC
+1EEE
+1EF0
+1EF2
+1EF4
+1EF6
+1EF8
+1F08..1F0F (8 chars)
+1F18..1F1D (6 chars)
+1F28..1F2F (8 chars)
+1F38..1F3F (8 chars)
+1F48..1F4D (6 chars)
+1F59
+1F5B
+1F5D
+1F5F
+1F68..1F6F (8 chars)
+1FB8..1FBB (4 chars)
+1FC8..1FCB (4 chars)
+1FD8..1FDB (4 chars)
+1FE8..1FEC (5 chars)
+1FF8..1FFB (4 chars)
+2102
+2107
+210B..210D (3 chars)
+2110..2112 (3 chars)
+2115
+2119..211D (5 chars)
+2124
+2126
+2128
+212A..212D (4 chars)
+2130..2131 (2 chars)
+2133
+2160..216F (16 chars)
+24B6..24CF (26 chars)
+FF21..FF3A (26 chars)
+
+*******************************************
+
+Property dump for: 0x80000001 (Lowercase)
+
+0061..007A (26 chars)
+00AA
+00B5
+00BA
+00DF..00F6 (24 chars)
+00F8..00FF (8 chars)
+0101
+0103
+0105
+0107
+0109
+010B
+010D
+010F
+0111
+0113
+0115
+0117
+0119
+011B
+011D
+011F
+0121
+0123
+0125
+0127
+0129
+012B
+012D
+012F
+0131
+0133
+0135
+0137..0138 (2 chars)
+013A
+013C
+013E
+0140
+0142
+0144
+0146
+0148..0149 (2 chars)
+014B
+014D
+014F
+0151
+0153
+0155
+0157
+0159
+015B
+015D
+015F
+0161
+0163
+0165
+0167
+0169
+016B
+016D
+016F
+0171
+0173
+0175
+0177
+017A
+017C
+017E..0180 (3 chars)
+0183
+0185
+0188
+018C..018D (2 chars)
+0192
+0195
+0199..019B (3 chars)
+019E
+01A1
+01A3
+01A5
+01A8
+01AA..01AB (2 chars)
+01AD
+01B0
+01B4
+01B6
+01B9..01BA (2 chars)
+01BD..01BF (3 chars)
+01C6
+01C9
+01CC
+01CE
+01D0
+01D2
+01D4
+01D6
+01D8
+01DA
+01DC..01DD (2 chars)
+01DF
+01E1
+01E3
+01E5
+01E7
+01E9
+01EB
+01ED
+01EF..01F0 (2 chars)
+01F3
+01F5
+01F9
+01FB
+01FD
+01FF
+0201
+0203
+0205
+0207
+0209
+020B
+020D
+020F
+0211
+0213
+0215
+0217
+0219
+021B
+021D
+021F
+0223
+0225
+0227
+0229
+022B
+022D
+022F
+0231
+0233
+0250..02AD (94 chars)
+02B0..02B8 (9 chars)
+02C0..02C1 (2 chars)
+02E0..02E4 (5 chars)
+0390
+03AC..03CE (35 chars)
+03D0..03D1 (2 chars)
+03D5..03D7 (3 chars)
+03DB
+03DD
+03DF
+03E1
+03E3
+03E5
+03E7
+03E9
+03EB
+03ED
+03EF..03F3 (5 chars)
+0430..045F (48 chars)
+0461
+0463
+0465
+0467
+0469
+046B
+046D
+046F
+0471
+0473
+0475
+0477
+0479
+047B
+047D
+047F
+0481
+048D
+048F
+0491
+0493
+0495
+0497
+0499
+049B
+049D
+049F
+04A1
+04A3
+04A5
+04A7
+04A9
+04AB
+04AD
+04AF
+04B1
+04B3
+04B5
+04B7
+04B9
+04BB
+04BD
+04BF
+04C2
+04C4
+04C8
+04CC
+04D1
+04D3
+04D5
+04D7
+04D9
+04DB
+04DD
+04DF
+04E1
+04E3
+04E5
+04E7
+04E9
+04EB
+04ED
+04EF
+04F1
+04F3
+04F5
+04F9
+0561..0587 (39 chars)
+1E01
+1E03
+1E05
+1E07
+1E09
+1E0B
+1E0D
+1E0F
+1E11
+1E13
+1E15
+1E17
+1E19
+1E1B
+1E1D
+1E1F
+1E21
+1E23
+1E25
+1E27
+1E29
+1E2B
+1E2D
+1E2F
+1E31
+1E33
+1E35
+1E37
+1E39
+1E3B
+1E3D
+1E3F
+1E41
+1E43
+1E45
+1E47
+1E49
+1E4B
+1E4D
+1E4F
+1E51
+1E53
+1E55
+1E57
+1E59
+1E5B
+1E5D
+1E5F
+1E61
+1E63
+1E65
+1E67
+1E69
+1E6B
+1E6D
+1E6F
+1E71
+1E73
+1E75
+1E77
+1E79
+1E7B
+1E7D
+1E7F
+1E81
+1E83
+1E85
+1E87
+1E89
+1E8B
+1E8D
+1E8F
+1E91
+1E93
+1E95..1E9B (7 chars)
+1EA1
+1EA3
+1EA5
+1EA7
+1EA9
+1EAB
+1EAD
+1EAF
+1EB1
+1EB3
+1EB5
+1EB7
+1EB9
+1EBB
+1EBD
+1EBF
+1EC1
+1EC3
+1EC5
+1EC7
+1EC9
+1ECB
+1ECD
+1ECF
+1ED1
+1ED3
+1ED5
+1ED7
+1ED9
+1EDB
+1EDD
+1EDF
+1EE1
+1EE3
+1EE5
+1EE7
+1EE9
+1EEB
+1EED
+1EEF
+1EF1
+1EF3
+1EF5
+1EF7
+1EF9
+1F00..1F07 (8 chars)
+1F10..1F15 (6 chars)
+1F20..1F27 (8 chars)
+1F30..1F37 (8 chars)
+1F40..1F45 (6 chars)
+1F50..1F57 (8 chars)
+1F60..1F67 (8 chars)
+1F70..1F7D (14 chars)
+1F80..1F87 (8 chars)
+1F90..1F97 (8 chars)
+1FA0..1FA7 (8 chars)
+1FB0..1FB4 (5 chars)
+1FB6..1FB7 (2 chars)
+1FBE
+1FC2..1FC4 (3 chars)
+1FC6..1FC7 (2 chars)
+1FD0..1FD3 (4 chars)
+1FD6..1FD7 (2 chars)
+1FE0..1FE7 (8 chars)
+1FF2..1FF4 (3 chars)
+1FF6..1FF7 (2 chars)
+207F
+210A
+210E..210F (2 chars)
+2113
+212F
+2134
+2139
+2170..217F (16 chars)
+24D0..24E9 (26 chars)
+FB00..FB06 (7 chars)
+FB13..FB17 (5 chars)
+FF41..FF5A (26 chars)
+
+*******************************************
+
+Property dump for: 0x80000002 (Titlecase)
+
+01C5
+01C8
+01CB
+01F2
+1F88..1F8F (8 chars)
+1F98..1F9F (8 chars)
+1FA8..1FAF (8 chars)
+1FBC
+1FCC
+1FFC
+
+*******************************************
+
+Property dump for: 0x80000006 (Low Surrogate)
+
+DC00..DFFF (1024 chars)
+
+*******************************************
+
+Property dump for: 0x80000007 (High Surrogate)
+
+D800..DB7F (896 chars)
+
+*******************************************
+
+Property dump for: 0x80000008 (Private Use High Surrogate)
+
+DB80..DBFF (128 chars)
+
+*******************************************
+
+Property dump for: 0x00000000 (Unassigned Code Value)
+
+0220..0221 (2 chars)
+0234..024F (28 chars)
+02AE..02AF (2 chars)
+02EF..02FF (17 chars)
+034F..035F (17 chars)
+0363..0373 (17 chars)
+0376..0379 (4 chars)
+037B..037D (3 chars)
+037F..0383 (5 chars)
+038B
+038D
+03A2
+03CF
+03D8..03D9 (2 chars)
+03F4..03FF (12 chars)
+0487
+048A..048B (2 chars)
+04C5..04C6 (2 chars)
+04C9..04CA (2 chars)
+04CD..04CF (3 chars)
+04F6..04F7 (2 chars)
+04FA..0530 (55 chars)
+0557..0558 (2 chars)
+0560
+0588
+058B..0590 (6 chars)
+05A2
+05BA
+05C5..05CF (11 chars)
+05EB..05EF (5 chars)
+05F5..060B (23 chars)
+060D..061A (14 chars)
+061C..061E (3 chars)
+0620
+063B..063F (5 chars)
+0656..065F (10 chars)
+066E..066F (2 chars)
+06EE..06EF (2 chars)
+06FF
+070E
+072D..072F (3 chars)
+074B..077F (53 chars)
+07B1..0900 (336 chars)
+0904
+093A..093B (2 chars)
+094E..094F (2 chars)
+0955..0957 (3 chars)
+0971..0980 (16 chars)
+0984
+098D..098E (2 chars)
+0991..0992 (2 chars)
+09A9
+09B1
+09B3..09B5 (3 chars)
+09BA..09BB (2 chars)
+09BD
+09C5..09C6 (2 chars)
+09C9..09CA (2 chars)
+09CE..09D6 (9 chars)
+09D8..09DB (4 chars)
+09DE
+09E4..09E5 (2 chars)
+09FB..0A01 (7 chars)
+0A03..0A04 (2 chars)
+0A0B..0A0E (4 chars)
+0A11..0A12 (2 chars)
+0A29
+0A31
+0A34
+0A37
+0A3A..0A3B (2 chars)
+0A3D
+0A43..0A46 (4 chars)
+0A49..0A4A (2 chars)
+0A4E..0A58 (11 chars)
+0A5D
+0A5F..0A65 (7 chars)
+0A75..0A80 (12 chars)
+0A84
+0A8C
+0A8E
+0A92
+0AA9
+0AB1
+0AB4
+0ABA..0ABB (2 chars)
+0AC6
+0ACA
+0ACE..0ACF (2 chars)
+0AD1..0ADF (15 chars)
+0AE1..0AE5 (5 chars)
+0AF0..0B00 (17 chars)
+0B04
+0B0D..0B0E (2 chars)
+0B11..0B12 (2 chars)
+0B29
+0B31
+0B34..0B35 (2 chars)
+0B3A..0B3B (2 chars)
+0B44..0B46 (3 chars)
+0B49..0B4A (2 chars)
+0B4E..0B55 (8 chars)
+0B58..0B5B (4 chars)
+0B5E
+0B62..0B65 (4 chars)
+0B71..0B81 (17 chars)
+0B84
+0B8B..0B8D (3 chars)
+0B91
+0B96..0B98 (3 chars)
+0B9B
+0B9D
+0BA0..0BA2 (3 chars)
+0BA5..0BA7 (3 chars)
+0BAB..0BAD (3 chars)
+0BB6
+0BBA..0BBD (4 chars)
+0BC3..0BC5 (3 chars)
+0BC9
+0BCE..0BD6 (9 chars)
+0BD8..0BE6 (15 chars)
+0BF3..0C00 (14 chars)
+0C04
+0C0D
+0C11
+0C29
+0C34
+0C3A..0C3D (4 chars)
+0C45
+0C49
+0C4E..0C54 (7 chars)
+0C57..0C5F (9 chars)
+0C62..0C65 (4 chars)
+0C70..0C81 (18 chars)
+0C84
+0C8D
+0C91
+0CA9
+0CB4
+0CBA..0CBD (4 chars)
+0CC5
+0CC9
+0CCE..0CD4 (7 chars)
+0CD7..0CDD (7 chars)
+0CDF
+0CE2..0CE5 (4 chars)
+0CF0..0D01 (18 chars)
+0D04
+0D0D
+0D11
+0D29
+0D3A..0D3D (4 chars)
+0D44..0D45 (2 chars)
+0D49
+0D4E..0D56 (9 chars)
+0D58..0D5F (8 chars)
+0D62..0D65 (4 chars)
+0D70..0D81 (18 chars)
+0D84
+0D97..0D99 (3 chars)
+0DB2
+0DBC
+0DBE..0DBF (2 chars)
+0DC7..0DC9 (3 chars)
+0DCB..0DCE (4 chars)
+0DD5
+0DD7
+0DE0..0DF1 (18 chars)
+0DF5..0E00 (12 chars)
+0E3B..0E3E (4 chars)
+0E5C..0E80 (37 chars)
+0E83
+0E85..0E86 (2 chars)
+0E89
+0E8B..0E8C (2 chars)
+0E8E..0E93 (6 chars)
+0E98
+0EA0
+0EA4
+0EA6
+0EA8..0EA9 (2 chars)
+0EAC
+0EBA
+0EBE..0EBF (2 chars)
+0EC5
+0EC7
+0ECE..0ECF (2 chars)
+0EDA..0EDB (2 chars)
+0EDE..0EFF (34 chars)
+0F48
+0F6B..0F70 (6 chars)
+0F8C..0F8F (4 chars)
+0F98
+0FBD
+0FCD..0FCE (2 chars)
+0FD0..0FFF (48 chars)
+1022
+1028
+102B
+1033..1035 (3 chars)
+103A..103F (6 chars)
+105A..109F (70 chars)
+10C6..10CF (10 chars)
+10F7..10FA (4 chars)
+10FC..10FF (4 chars)
+115A..115E (5 chars)
+11A3..11A7 (5 chars)
+11FA..11FF (6 chars)
+1207
+1247
+1249
+124E..124F (2 chars)
+1257
+1259
+125E..125F (2 chars)
+1287
+1289
+128E..128F (2 chars)
+12AF
+12B1
+12B6..12B7 (2 chars)
+12BF
+12C1
+12C6..12C7 (2 chars)
+12CF
+12D7
+12EF
+130F
+1311
+1316..1317 (2 chars)
+131F
+1347
+135B..1360 (6 chars)
+137D..139F (35 chars)
+13F5..1400 (12 chars)
+1677..167F (9 chars)
+169D..169F (3 chars)
+16F1..177F (143 chars)
+17DD..17DF (3 chars)
+17EA..17FF (22 chars)
+180F
+181A..181F (6 chars)
+1878..187F (8 chars)
+18AA..1DFF (1366 chars)
+1E9C..1E9F (4 chars)
+1EFA..1EFF (6 chars)
+1F16..1F17 (2 chars)
+1F1E..1F1F (2 chars)
+1F46..1F47 (2 chars)
+1F4E..1F4F (2 chars)
+1F58
+1F5A
+1F5C
+1F5E
+1F7E..1F7F (2 chars)
+1FB5
+1FC5
+1FD4..1FD5 (2 chars)
+1FDC
+1FF0..1FF1 (2 chars)
+1FF5
+1FFF
+2047
+204E..2069 (28 chars)
+2071..2073 (3 chars)
+208F..209F (17 chars)
+20B0..20CF (32 chars)
+20E4..20FF (28 chars)
+213B..2152 (24 chars)
+2184..218F (12 chars)
+21F4..21FF (12 chars)
+22F2..22FF (14 chars)
+237C
+239B..23FF (101 chars)
+2427..243F (25 chars)
+244B..245F (21 chars)
+24EB..24FF (21 chars)
+2596..259F (10 chars)
+25F8..25FF (8 chars)
+2614..2618 (5 chars)
+2672..2700 (143 chars)
+2705
+270A..270B (2 chars)
+2728
+274C
+274E
+2753..2755 (3 chars)
+2757
+275F..2760 (2 chars)
+2768..2775 (14 chars)
+2795..2797 (3 chars)
+27B0
+27BF..27FF (65 chars)
+2900..2E7F (1408 chars)
+2E9A
+2EF4..2EFF (12 chars)
+2FD6..2FEF (26 chars)
+2FFC..2FFF (4 chars)
+303B..303D (3 chars)
+3040
+3095..3098 (4 chars)
+309F..30A0 (2 chars)
+30FF..3104 (6 chars)
+312D..3130 (4 chars)
+318F
+31B8..31FF (72 chars)
+321D..321F (3 chars)
+3244..325F (28 chars)
+327C..327E (3 chars)
+32B1..32BF (15 chars)
+32CC..32CF (4 chars)
+32FF
+3377..337A (4 chars)
+33DE..33DF (2 chars)
+33FF
+4DB6..4DFF (74 chars)
+9FA6..9FFF (90 chars)
+A48D..A48F (3 chars)
+A4A2..A4A3 (2 chars)
+A4B4
+A4C1
+A4C5
+A4C7..ABFF (1849 chars)
+D7A4..D7FF (92 chars)
+FA2E..FAFF (210 chars)
+FB07..FB12 (12 chars)
+FB18..FB1C (5 chars)
+FB37
+FB3D
+FB3F
+FB42
+FB45
+FBB2..FBD2 (33 chars)
+FD40..FD4F (16 chars)
+FD90..FD91 (2 chars)
+FDC8..FDEF (40 chars)
+FDFC..FE1F (36 chars)
+FE24..FE2F (12 chars)
+FE45..FE48 (4 chars)
+FE53
+FE67
+FE6C..FE6F (4 chars)
+FE73
+FE75
+FEFD..FEFE (2 chars)
+FF00
+FF5F..FF60 (2 chars)
+FFBF..FFC1 (3 chars)
+FFC8..FFC9 (2 chars)
+FFD0..FFD1 (2 chars)
+FFD8..FFD9 (2 chars)
+FFDD..FFDF (3 chars)
+FFE7
+FFEF..FFF8 (10 chars)
+
diff --git a/contrib/perl5/lib/unicode/README.Ethiopic b/contrib/perl5/lib/unicode/README.Ethiopic
new file mode 100644
index 0000000..f8ec21f
--- /dev/null
+++ b/contrib/perl5/lib/unicode/README.Ethiopic
@@ -0,0 +1,18 @@
+[[The UnicodeData-Latest.txt file has NOT (yet) been updated for the Ethiopic
+additions. You will lose the Ethiopic *.pl files if you run 'make clean' in
+./lib/unicode. --GSAR]]
+
+This package contains extensions to the property files generated from the
+UnicodeData-Latest.txt file. The UnicodeData file comes from the Unicode
+organization's ftp site and has not been included with modifications here.
+Updates for Ethiopic script to the UnicodeData file under the Unicode 3.0
+specification is being discussed at this time with the responsible parties
+within Unicode.
+
+"MakeEthiopicSyllables.PL" will create the series Is/Y0.pl .. Is/Y13.pl
+files to match the sYllabic class of an Ethiopic character. These tests
+may be extended to other syllabaries as well.
+
+The author would appreciate comments and suggestions on this effort:
+
+ Daniel Yacob dmulholl@cs.indiana.edu
diff --git a/contrib/perl5/lib/unicode/ReadMe.txt b/contrib/perl5/lib/unicode/ReadMe.txt
new file mode 100644
index 0000000..c2c4aee
--- /dev/null
+++ b/contrib/perl5/lib/unicode/ReadMe.txt
@@ -0,0 +1,45 @@
+June 23, 1999
+
+This directory contains the initial release for Unicode 3.0.
+
+This release consists of corrections and additions to the
+Unicode Character Database, to match the publication of
+The Unicode Standard, Version 3.0.
+
+Detailed documentation of the files constituting the
+Unicode Character Database (contributory data files for
+the standard itself) can now be found in
+UnicodeCharacterDatabase.html.
+
+--------------------------------------------------------------------------
+NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+
+The files have been copied from
+
+ ftp://ftp.unicode.org/Public/3.0-Update/
+
+and most of them have been renamed to better fit 8.3 filename limitations.
+
+long name at unicode.org short name latest '#'
+------------------------ ---------- ----------
+ArabicShaping-#.txt ArabShap.txt 2
+Blocks-#.txt Blocks.txt 3
+CompositionExclusions-#.txt CompExcl.txt 1
+EastAsianWidth-#.txt EAWidth.txt 3
+Index-#.txt Index.txt 3.0.0
+Jamo-#.txt Jamo.txt 2
+LineBreak-#.txt LineBrk.txt 5
+NamesList-#.txt Names.txt 3.0.0
+NamesList-#.html NamesList.html 1
+PropList-#.txt Props.txt 3.0.0
+SpecialCasing-#.txt SpecCase.txt 2
+UnicodeData-#.txt Unicode.300 3.0.0
+UnicodeData-#.html Unicode3.html 3.0.0
+UnicodeCharacterDatabase-#.html UCD300.html 3.0.0
+
+The *.pl files are generated from these files by the 'mktables.PL' script.
+
+While the files have been renamed the links in the html files haven't.
+
+--
+jhi@iki.fi
diff --git a/contrib/perl5/lib/unicode/SpecCase.txt b/contrib/perl5/lib/unicode/SpecCase.txt
new file mode 100644
index 0000000..af002ef
--- /dev/null
+++ b/contrib/perl5/lib/unicode/SpecCase.txt
@@ -0,0 +1,219 @@
+# SpecialCasing-2.txt
+#
+# Special Casing Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It contains additional information about the casing of Unicode characters.
+# (For compatibility, the UnicodeData.txt file only contains case mappings for
+# characters where they are 1-1, and does not have locale-specific mappings.)
+# These are informative character properties.
+#
+# Send comments to mark@unicode.org
+#
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <entry> := <case_mapping> <condition_list>? (<s>* "#" <comment>)?
+#
+# <case_mapping> := <source> <sep> <lower> <sep> <title> <sep> <upper> <sep>
+#
+# <source> := <code_point>
+# <sep> := <s>* ";" <s>*
+# <lower> := <code_point_list>
+# <title> := <code_point_list>
+# <upper> := <code_point_list>
+# <code_point_list> := <code_point> (<s>+ <code_point>)*
+# <code_point> := <hex><hex><hex><hex>
+# <hex> := [0-1A-Fa-f]
+# <s> := <space>
+#
+# <condition_list> := <locale>? (<s>+ <context>)*
+# <locale> := <ISO_3166_code> ( "_" <ISO_639_code> )? ( "_" <variant> )?
+# <ISO_3166_code> := 2-letter country code,
+# as in http://www.unicode.org/unicode/onlinedat/countries.html
+# <ISO_639_code> := 2-letter code,
+# as in http://www.unicode.org/unicode/onlinedat/languages.html
+# <context> := "FINAL" | "NON_FINAL" | "MODERN" | "NON_MODERN"
+#
+# A condition list overrides the normal behavior if any of the listed conditions is true.
+# FINAL: The letter is not followed by a letter of category L* (e.g. Ll, Lt, Lu, Lm, or Lo).
+# MODERN: The mapping is only used for modern text.
+# Conditions preceded by "NON_" represent the negation of the condition
+#
+# New contexts may be added in the future.
+# Parsers of this file must be prepared to deal with that situation.
+# Additional whitespace around elements is optional. Blank lines are ignored in parsing.
+# On any line, all text following "#" is a comment, and are ignored in parsing.
+# ================================================================================
+
+# ================================================================================
+# Unconditional mappings
+# ================================================================================
+
+# The German es-zed is special--the normal mapping is to SS.
+# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>))
+
+00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S
+
+# Ligatures
+
+FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF
+FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI
+FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL
+FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI
+FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL
+FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T
+FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST
+
+0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN
+FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW
+FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH
+FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI
+FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW
+FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
+
+# No corresponding uppercase precomposed character
+
+0149; 0149; 02BC 006E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON
+1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW
+1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS
+1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE
+1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING
+1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI
+1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+
+# IMPORTANT-when capitalizing iota-subscript (0345)
+# It MUST be in normalized form--moved to the end of any sequence of combining marks.
+# This is because logically it represents a following base character!
+# E.g. <iota_subscript> (<Mn> | <Mc> | <Me>)+ => (<Mn> | <Mc> | <Me>)+ <iota_subscript>
+# It should never be the first character in a word, so in titlecasing it can be left as is.
+
+# The following cases are already in the UnicodeData file, so are only commented here.
+
+# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI
+
+# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
+# have special uppercases.
+# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase!
+
+1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+
+1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+
+# Some characters with YPOGEGRAMMENI are also have no corresponding titlecases
+
+1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+
+1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+
+# ================================================================================
+# Conditional mappings
+# ================================================================================
+
+# Special case for final form of sigma
+
+03A3; 03C2; 03A3; 03A3; FINAL; # GREEK CAPITAL LETTER SIGMA
+
+# Note: the following cases for non-final are already in the UnicodeData file.
+
+# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA
+# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA
+
+# Note: the following cases are not included, since they would normalize in lowercasing
+
+# 03C3; 03C2; 03A3; 03A3; FINAL; # GREEK SMALL LETTER SIGMA
+# 03C2; 03C3; 03A3; 03A3; NON_FINAL; # GREEK SMALL LETTER FINAL SIGMA
+
+# ================================================================================
+# Locale-sensitive mappings
+# ================================================================================
+
+# Turkish
+
+0049; 0131; 0049; 0049; TR; # LATIN CAPITAL LETTER I
+0069; 0069; 0130; 0130; TR; # LATIN SMALL LETTER I
+
+# Note: the following cases are already in the UnicodeData file.
+
+# 0131; 0131; 0049; 0049; TR; # LATIN SMALL LETTER DOTLESS I
+# 0130; 0069; 0130; 0130; TR; # LATIN CAPITAL LETTER I WITH DOT ABOVE
diff --git a/contrib/perl5/lib/unicode/To/Digit.pl b/contrib/perl5/lib/unicode/To/Digit.pl
new file mode 100644
index 0000000..a96bc1c
--- /dev/null
+++ b/contrib/perl5/lib/unicode/To/Digit.pl
@@ -0,0 +1,30 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0030 0039 0000
+00b2 00b3 0002
+00b9 0001
+0660 0669 0000
+06f0 06f9 0000
+0966 096f 0000
+09e6 09ef 0000
+0a66 0a6f 0000
+0ae6 0aef 0000
+0b66 0b6f 0000
+0be7 0bef 0001
+0c66 0c6f 0000
+0ce6 0cef 0000
+0d66 0d6f 0000
+0e50 0e59 0000
+0ed0 0ed9 0000
+0f20 0f29 0000
+1040 1049 0000
+1369 1371 0001
+17e0 17e9 0000
+1810 1819 0000
+2070 0000
+2074 2079 0004
+2080 2089 0000
+ff10 ff19 0000
+END
diff --git a/contrib/perl5/lib/unicode/To/Lower.pl b/contrib/perl5/lib/unicode/To/Lower.pl
new file mode 100644
index 0000000..a78a7e4
--- /dev/null
+++ b/contrib/perl5/lib/unicode/To/Lower.pl
@@ -0,0 +1,401 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0041 005a 0061
+00c0 00d6 00e0
+00d8 00de 00f8
+0100 0101
+0102 0103
+0104 0105
+0106 0107
+0108 0109
+010a 010b
+010c 010d
+010e 010f
+0110 0111
+0112 0113
+0114 0115
+0116 0117
+0118 0119
+011a 011b
+011c 011d
+011e 011f
+0120 0121
+0122 0123
+0124 0125
+0126 0127
+0128 0129
+012a 012b
+012c 012d
+012e 012f
+0130 0069
+0132 0133
+0134 0135
+0136 0137
+0139 013a
+013b 013c
+013d 013e
+013f 0140
+0141 0142
+0143 0144
+0145 0146
+0147 0148
+014a 014b
+014c 014d
+014e 014f
+0150 0151
+0152 0153
+0154 0155
+0156 0157
+0158 0159
+015a 015b
+015c 015d
+015e 015f
+0160 0161
+0162 0163
+0164 0165
+0166 0167
+0168 0169
+016a 016b
+016c 016d
+016e 016f
+0170 0171
+0172 0173
+0174 0175
+0176 0177
+0178 00ff
+0179 017a
+017b 017c
+017d 017e
+0181 0253
+0182 0183
+0184 0185
+0186 0254
+0187 0188
+0189 018a 0256
+018b 018c
+018e 01dd
+018f 0259
+0190 025b
+0191 0192
+0193 0260
+0194 0263
+0196 0269
+0197 0268
+0198 0199
+019c 026f
+019d 0272
+019f 0275
+01a0 01a1
+01a2 01a3
+01a4 01a5
+01a6 0280
+01a7 01a8
+01a9 0283
+01ac 01ad
+01ae 0288
+01af 01b0
+01b1 01b2 028a
+01b3 01b4
+01b5 01b6
+01b7 0292
+01b8 01b9
+01bc 01bd
+01c4 01c6
+01c5 01c6
+01c7 01c9
+01c8 01c9
+01ca 01cc
+01cb 01cc
+01cd 01ce
+01cf 01d0
+01d1 01d2
+01d3 01d4
+01d5 01d6
+01d7 01d8
+01d9 01da
+01db 01dc
+01de 01df
+01e0 01e1
+01e2 01e3
+01e4 01e5
+01e6 01e7
+01e8 01e9
+01ea 01eb
+01ec 01ed
+01ee 01ef
+01f1 01f3
+01f2 01f3
+01f4 01f5
+01f6 0195
+01f7 01bf
+01f8 01f9
+01fa 01fb
+01fc 01fd
+01fe 01ff
+0200 0201
+0202 0203
+0204 0205
+0206 0207
+0208 0209
+020a 020b
+020c 020d
+020e 020f
+0210 0211
+0212 0213
+0214 0215
+0216 0217
+0218 0219
+021a 021b
+021c 021d
+021e 021f
+0222 0223
+0224 0225
+0226 0227
+0228 0229
+022a 022b
+022c 022d
+022e 022f
+0230 0231
+0232 0233
+0386 03ac
+0388 038a 03ad
+038c 03cc
+038e 038f 03cd
+0391 03a1 03b1
+03a3 03ab 03c3
+03da 03db
+03dc 03dd
+03de 03df
+03e0 03e1
+03e2 03e3
+03e4 03e5
+03e6 03e7
+03e8 03e9
+03ea 03eb
+03ec 03ed
+03ee 03ef
+0400 040f 0450
+0410 042f 0430
+0460 0461
+0462 0463
+0464 0465
+0466 0467
+0468 0469
+046a 046b
+046c 046d
+046e 046f
+0470 0471
+0472 0473
+0474 0475
+0476 0477
+0478 0479
+047a 047b
+047c 047d
+047e 047f
+0480 0481
+048c 048d
+048e 048f
+0490 0491
+0492 0493
+0494 0495
+0496 0497
+0498 0499
+049a 049b
+049c 049d
+049e 049f
+04a0 04a1
+04a2 04a3
+04a4 04a5
+04a6 04a7
+04a8 04a9
+04aa 04ab
+04ac 04ad
+04ae 04af
+04b0 04b1
+04b2 04b3
+04b4 04b5
+04b6 04b7
+04b8 04b9
+04ba 04bb
+04bc 04bd
+04be 04bf
+04c1 04c2
+04c3 04c4
+04c7 04c8
+04cb 04cc
+04d0 04d1
+04d2 04d3
+04d4 04d5
+04d6 04d7
+04d8 04d9
+04da 04db
+04dc 04dd
+04de 04df
+04e0 04e1
+04e2 04e3
+04e4 04e5
+04e6 04e7
+04e8 04e9
+04ea 04eb
+04ec 04ed
+04ee 04ef
+04f0 04f1
+04f2 04f3
+04f4 04f5
+04f8 04f9
+0531 0556 0561
+1e00 1e01
+1e02 1e03
+1e04 1e05
+1e06 1e07
+1e08 1e09
+1e0a 1e0b
+1e0c 1e0d
+1e0e 1e0f
+1e10 1e11
+1e12 1e13
+1e14 1e15
+1e16 1e17
+1e18 1e19
+1e1a 1e1b
+1e1c 1e1d
+1e1e 1e1f
+1e20 1e21
+1e22 1e23
+1e24 1e25
+1e26 1e27
+1e28 1e29
+1e2a 1e2b
+1e2c 1e2d
+1e2e 1e2f
+1e30 1e31
+1e32 1e33
+1e34 1e35
+1e36 1e37
+1e38 1e39
+1e3a 1e3b
+1e3c 1e3d
+1e3e 1e3f
+1e40 1e41
+1e42 1e43
+1e44 1e45
+1e46 1e47
+1e48 1e49
+1e4a 1e4b
+1e4c 1e4d
+1e4e 1e4f
+1e50 1e51
+1e52 1e53
+1e54 1e55
+1e56 1e57
+1e58 1e59
+1e5a 1e5b
+1e5c 1e5d
+1e5e 1e5f
+1e60 1e61
+1e62 1e63
+1e64 1e65
+1e66 1e67
+1e68 1e69
+1e6a 1e6b
+1e6c 1e6d
+1e6e 1e6f
+1e70 1e71
+1e72 1e73
+1e74 1e75
+1e76 1e77
+1e78 1e79
+1e7a 1e7b
+1e7c 1e7d
+1e7e 1e7f
+1e80 1e81
+1e82 1e83
+1e84 1e85
+1e86 1e87
+1e88 1e89
+1e8a 1e8b
+1e8c 1e8d
+1e8e 1e8f
+1e90 1e91
+1e92 1e93
+1e94 1e95
+1ea0 1ea1
+1ea2 1ea3
+1ea4 1ea5
+1ea6 1ea7
+1ea8 1ea9
+1eaa 1eab
+1eac 1ead
+1eae 1eaf
+1eb0 1eb1
+1eb2 1eb3
+1eb4 1eb5
+1eb6 1eb7
+1eb8 1eb9
+1eba 1ebb
+1ebc 1ebd
+1ebe 1ebf
+1ec0 1ec1
+1ec2 1ec3
+1ec4 1ec5
+1ec6 1ec7
+1ec8 1ec9
+1eca 1ecb
+1ecc 1ecd
+1ece 1ecf
+1ed0 1ed1
+1ed2 1ed3
+1ed4 1ed5
+1ed6 1ed7
+1ed8 1ed9
+1eda 1edb
+1edc 1edd
+1ede 1edf
+1ee0 1ee1
+1ee2 1ee3
+1ee4 1ee5
+1ee6 1ee7
+1ee8 1ee9
+1eea 1eeb
+1eec 1eed
+1eee 1eef
+1ef0 1ef1
+1ef2 1ef3
+1ef4 1ef5
+1ef6 1ef7
+1ef8 1ef9
+1f08 1f0f 1f00
+1f18 1f1d 1f10
+1f28 1f2f 1f20
+1f38 1f3f 1f30
+1f48 1f4d 1f40
+1f59 1f51
+1f5b 1f53
+1f5d 1f55
+1f5f 1f57
+1f68 1f6f 1f60
+1f88 1f8f 1f80
+1f98 1f9f 1f90
+1fa8 1faf 1fa0
+1fb8 1fb9 1fb0
+1fba 1fbb 1f70
+1fbc 1fb3
+1fc8 1fcb 1f72
+1fcc 1fc3
+1fd8 1fd9 1fd0
+1fda 1fdb 1f76
+1fe8 1fe9 1fe0
+1fea 1feb 1f7a
+1fec 1fe5
+1ff8 1ff9 1f78
+1ffa 1ffb 1f7c
+1ffc 1ff3
+2126 03c9
+212a 006b
+212b 00e5
+2160 216f 2170
+24b6 24cf 24d0
+ff21 ff3a ff41
+END
diff --git a/contrib/perl5/lib/unicode/To/Title.pl b/contrib/perl5/lib/unicode/To/Title.pl
new file mode 100644
index 0000000..d8f5c04
--- /dev/null
+++ b/contrib/perl5/lib/unicode/To/Title.pl
@@ -0,0 +1,411 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0061 007a 0041
+00b5 039c
+00e0 00f6 00c0
+00f8 00fe 00d8
+00ff 0178
+0101 0100
+0103 0102
+0105 0104
+0107 0106
+0109 0108
+010b 010a
+010d 010c
+010f 010e
+0111 0110
+0113 0112
+0115 0114
+0117 0116
+0119 0118
+011b 011a
+011d 011c
+011f 011e
+0121 0120
+0123 0122
+0125 0124
+0127 0126
+0129 0128
+012b 012a
+012d 012c
+012f 012e
+0131 0049
+0133 0132
+0135 0134
+0137 0136
+013a 0139
+013c 013b
+013e 013d
+0140 013f
+0142 0141
+0144 0143
+0146 0145
+0148 0147
+014b 014a
+014d 014c
+014f 014e
+0151 0150
+0153 0152
+0155 0154
+0157 0156
+0159 0158
+015b 015a
+015d 015c
+015f 015e
+0161 0160
+0163 0162
+0165 0164
+0167 0166
+0169 0168
+016b 016a
+016d 016c
+016f 016e
+0171 0170
+0173 0172
+0175 0174
+0177 0176
+017a 0179
+017c 017b
+017e 017d
+017f 0053
+0183 0182
+0185 0184
+0188 0187
+018c 018b
+0192 0191
+0195 01f6
+0199 0198
+01a1 01a0
+01a3 01a2
+01a5 01a4
+01a8 01a7
+01ad 01ac
+01b0 01af
+01b4 01b3
+01b6 01b5
+01b9 01b8
+01bd 01bc
+01bf 01f7
+01c4 01c5
+01c6 01c5
+01c7 01c8
+01c9 01c8
+01ca 01cb
+01cc 01cb
+01ce 01cd
+01d0 01cf
+01d2 01d1
+01d4 01d3
+01d6 01d5
+01d8 01d7
+01da 01d9
+01dc 01db
+01dd 018e
+01df 01de
+01e1 01e0
+01e3 01e2
+01e5 01e4
+01e7 01e6
+01e9 01e8
+01eb 01ea
+01ed 01ec
+01ef 01ee
+01f1 01f2
+01f3 01f2
+01f5 01f4
+01f9 01f8
+01fb 01fa
+01fd 01fc
+01ff 01fe
+0201 0200
+0203 0202
+0205 0204
+0207 0206
+0209 0208
+020b 020a
+020d 020c
+020f 020e
+0211 0210
+0213 0212
+0215 0214
+0217 0216
+0219 0218
+021b 021a
+021d 021c
+021f 021e
+0223 0222
+0225 0224
+0227 0226
+0229 0228
+022b 022a
+022d 022c
+022f 022e
+0231 0230
+0233 0232
+0253 0181
+0254 0186
+0256 0257 0189
+0259 018f
+025b 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026f 019c
+0272 019d
+0275 019f
+0280 01a6
+0283 01a9
+0288 01ae
+028a 028b 01b1
+0292 01b7
+0345 0399
+03ac 0386
+03ad 03af 0388
+03b1 03c1 0391
+03c2 03a3
+03c3 03cb 03a3
+03cc 038c
+03cd 03ce 038e
+03d0 0392
+03d1 0398
+03d5 03a6
+03d6 03a0
+03db 03da
+03dd 03dc
+03df 03de
+03e1 03e0
+03e3 03e2
+03e5 03e4
+03e7 03e6
+03e9 03e8
+03eb 03ea
+03ed 03ec
+03ef 03ee
+03f0 039a
+03f1 03a1
+03f2 03a3
+0430 044f 0410
+0450 045f 0400
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046b 046a
+046d 046c
+046f 046e
+0471 0470
+0473 0472
+0475 0474
+0477 0476
+0479 0478
+047b 047a
+047d 047c
+047f 047e
+0481 0480
+048d 048c
+048f 048e
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049b 049a
+049d 049c
+049f 049e
+04a1 04a0
+04a3 04a2
+04a5 04a4
+04a7 04a6
+04a9 04a8
+04ab 04aa
+04ad 04ac
+04af 04ae
+04b1 04b0
+04b3 04b2
+04b5 04b4
+04b7 04b6
+04b9 04b8
+04bb 04ba
+04bd 04bc
+04bf 04be
+04c2 04c1
+04c4 04c3
+04c8 04c7
+04cc 04cb
+04d1 04d0
+04d3 04d2
+04d5 04d4
+04d7 04d6
+04d9 04d8
+04db 04da
+04dd 04dc
+04df 04de
+04e1 04e0
+04e3 04e2
+04e5 04e4
+04e7 04e6
+04e9 04e8
+04eb 04ea
+04ed 04ec
+04ef 04ee
+04f1 04f0
+04f3 04f2
+04f5 04f4
+04f9 04f8
+0561 0586 0531
+1e01 1e00
+1e03 1e02
+1e05 1e04
+1e07 1e06
+1e09 1e08
+1e0b 1e0a
+1e0d 1e0c
+1e0f 1e0e
+1e11 1e10
+1e13 1e12
+1e15 1e14
+1e17 1e16
+1e19 1e18
+1e1b 1e1a
+1e1d 1e1c
+1e1f 1e1e
+1e21 1e20
+1e23 1e22
+1e25 1e24
+1e27 1e26
+1e29 1e28
+1e2b 1e2a
+1e2d 1e2c
+1e2f 1e2e
+1e31 1e30
+1e33 1e32
+1e35 1e34
+1e37 1e36
+1e39 1e38
+1e3b 1e3a
+1e3d 1e3c
+1e3f 1e3e
+1e41 1e40
+1e43 1e42
+1e45 1e44
+1e47 1e46
+1e49 1e48
+1e4b 1e4a
+1e4d 1e4c
+1e4f 1e4e
+1e51 1e50
+1e53 1e52
+1e55 1e54
+1e57 1e56
+1e59 1e58
+1e5b 1e5a
+1e5d 1e5c
+1e5f 1e5e
+1e61 1e60
+1e63 1e62
+1e65 1e64
+1e67 1e66
+1e69 1e68
+1e6b 1e6a
+1e6d 1e6c
+1e6f 1e6e
+1e71 1e70
+1e73 1e72
+1e75 1e74
+1e77 1e76
+1e79 1e78
+1e7b 1e7a
+1e7d 1e7c
+1e7f 1e7e
+1e81 1e80
+1e83 1e82
+1e85 1e84
+1e87 1e86
+1e89 1e88
+1e8b 1e8a
+1e8d 1e8c
+1e8f 1e8e
+1e91 1e90
+1e93 1e92
+1e95 1e94
+1e9b 1e60
+1ea1 1ea0
+1ea3 1ea2
+1ea5 1ea4
+1ea7 1ea6
+1ea9 1ea8
+1eab 1eaa
+1ead 1eac
+1eaf 1eae
+1eb1 1eb0
+1eb3 1eb2
+1eb5 1eb4
+1eb7 1eb6
+1eb9 1eb8
+1ebb 1eba
+1ebd 1ebc
+1ebf 1ebe
+1ec1 1ec0
+1ec3 1ec2
+1ec5 1ec4
+1ec7 1ec6
+1ec9 1ec8
+1ecb 1eca
+1ecd 1ecc
+1ecf 1ece
+1ed1 1ed0
+1ed3 1ed2
+1ed5 1ed4
+1ed7 1ed6
+1ed9 1ed8
+1edb 1eda
+1edd 1edc
+1edf 1ede
+1ee1 1ee0
+1ee3 1ee2
+1ee5 1ee4
+1ee7 1ee6
+1ee9 1ee8
+1eeb 1eea
+1eed 1eec
+1eef 1eee
+1ef1 1ef0
+1ef3 1ef2
+1ef5 1ef4
+1ef7 1ef6
+1ef9 1ef8
+1f00 1f07 1f08
+1f10 1f15 1f18
+1f20 1f27 1f28
+1f30 1f37 1f38
+1f40 1f45 1f48
+1f51 1f59
+1f53 1f5b
+1f55 1f5d
+1f57 1f5f
+1f60 1f67 1f68
+1f70 1f71 1fba
+1f72 1f75 1fc8
+1f76 1f77 1fda
+1f78 1f79 1ff8
+1f7a 1f7b 1fea
+1f7c 1f7d 1ffa
+1f80 1f87 1f88
+1f90 1f97 1f98
+1fa0 1fa7 1fa8
+1fb0 1fb1 1fb8
+1fb3 1fbc
+1fbe 0399
+1fc3 1fcc
+1fd0 1fd1 1fd8
+1fe0 1fe1 1fe8
+1fe5 1fec
+1ff3 1ffc
+2170 217f 2160
+24d0 24e9 24b6
+ff41 ff5a ff21
+END
diff --git a/contrib/perl5/lib/unicode/To/Upper.pl b/contrib/perl5/lib/unicode/To/Upper.pl
new file mode 100644
index 0000000..1fc7637
--- /dev/null
+++ b/contrib/perl5/lib/unicode/To/Upper.pl
@@ -0,0 +1,411 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.300.
+# Any changes made here will be lost!
+return <<'END';
+0061 007a 0041
+00b5 039c
+00e0 00f6 00c0
+00f8 00fe 00d8
+00ff 0178
+0101 0100
+0103 0102
+0105 0104
+0107 0106
+0109 0108
+010b 010a
+010d 010c
+010f 010e
+0111 0110
+0113 0112
+0115 0114
+0117 0116
+0119 0118
+011b 011a
+011d 011c
+011f 011e
+0121 0120
+0123 0122
+0125 0124
+0127 0126
+0129 0128
+012b 012a
+012d 012c
+012f 012e
+0131 0049
+0133 0132
+0135 0134
+0137 0136
+013a 0139
+013c 013b
+013e 013d
+0140 013f
+0142 0141
+0144 0143
+0146 0145
+0148 0147
+014b 014a
+014d 014c
+014f 014e
+0151 0150
+0153 0152
+0155 0154
+0157 0156
+0159 0158
+015b 015a
+015d 015c
+015f 015e
+0161 0160
+0163 0162
+0165 0164
+0167 0166
+0169 0168
+016b 016a
+016d 016c
+016f 016e
+0171 0170
+0173 0172
+0175 0174
+0177 0176
+017a 0179
+017c 017b
+017e 017d
+017f 0053
+0183 0182
+0185 0184
+0188 0187
+018c 018b
+0192 0191
+0195 01f6
+0199 0198
+01a1 01a0
+01a3 01a2
+01a5 01a4
+01a8 01a7
+01ad 01ac
+01b0 01af
+01b4 01b3
+01b6 01b5
+01b9 01b8
+01bd 01bc
+01bf 01f7
+01c5 01c4
+01c6 01c4
+01c8 01c7
+01c9 01c7
+01cb 01ca
+01cc 01ca
+01ce 01cd
+01d0 01cf
+01d2 01d1
+01d4 01d3
+01d6 01d5
+01d8 01d7
+01da 01d9
+01dc 01db
+01dd 018e
+01df 01de
+01e1 01e0
+01e3 01e2
+01e5 01e4
+01e7 01e6
+01e9 01e8
+01eb 01ea
+01ed 01ec
+01ef 01ee
+01f2 01f1
+01f3 01f1
+01f5 01f4
+01f9 01f8
+01fb 01fa
+01fd 01fc
+01ff 01fe
+0201 0200
+0203 0202
+0205 0204
+0207 0206
+0209 0208
+020b 020a
+020d 020c
+020f 020e
+0211 0210
+0213 0212
+0215 0214
+0217 0216
+0219 0218
+021b 021a
+021d 021c
+021f 021e
+0223 0222
+0225 0224
+0227 0226
+0229 0228
+022b 022a
+022d 022c
+022f 022e
+0231 0230
+0233 0232
+0253 0181
+0254 0186
+0256 0257 0189
+0259 018f
+025b 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026f 019c
+0272 019d
+0275 019f
+0280 01a6
+0283 01a9
+0288 01ae
+028a 028b 01b1
+0292 01b7
+0345 0399
+03ac 0386
+03ad 03af 0388
+03b1 03c1 0391
+03c2 03a3
+03c3 03cb 03a3
+03cc 038c
+03cd 03ce 038e
+03d0 0392
+03d1 0398
+03d5 03a6
+03d6 03a0
+03db 03da
+03dd 03dc
+03df 03de
+03e1 03e0
+03e3 03e2
+03e5 03e4
+03e7 03e6
+03e9 03e8
+03eb 03ea
+03ed 03ec
+03ef 03ee
+03f0 039a
+03f1 03a1
+03f2 03a3
+0430 044f 0410
+0450 045f 0400
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046b 046a
+046d 046c
+046f 046e
+0471 0470
+0473 0472
+0475 0474
+0477 0476
+0479 0478
+047b 047a
+047d 047c
+047f 047e
+0481 0480
+048d 048c
+048f 048e
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049b 049a
+049d 049c
+049f 049e
+04a1 04a0
+04a3 04a2
+04a5 04a4
+04a7 04a6
+04a9 04a8
+04ab 04aa
+04ad 04ac
+04af 04ae
+04b1 04b0
+04b3 04b2
+04b5 04b4
+04b7 04b6
+04b9 04b8
+04bb 04ba
+04bd 04bc
+04bf 04be
+04c2 04c1
+04c4 04c3
+04c8 04c7
+04cc 04cb
+04d1 04d0
+04d3 04d2
+04d5 04d4
+04d7 04d6
+04d9 04d8
+04db 04da
+04dd 04dc
+04df 04de
+04e1 04e0
+04e3 04e2
+04e5 04e4
+04e7 04e6
+04e9 04e8
+04eb 04ea
+04ed 04ec
+04ef 04ee
+04f1 04f0
+04f3 04f2
+04f5 04f4
+04f9 04f8
+0561 0586 0531
+1e01 1e00
+1e03 1e02
+1e05 1e04
+1e07 1e06
+1e09 1e08
+1e0b 1e0a
+1e0d 1e0c
+1e0f 1e0e
+1e11 1e10
+1e13 1e12
+1e15 1e14
+1e17 1e16
+1e19 1e18
+1e1b 1e1a
+1e1d 1e1c
+1e1f 1e1e
+1e21 1e20
+1e23 1e22
+1e25 1e24
+1e27 1e26
+1e29 1e28
+1e2b 1e2a
+1e2d 1e2c
+1e2f 1e2e
+1e31 1e30
+1e33 1e32
+1e35 1e34
+1e37 1e36
+1e39 1e38
+1e3b 1e3a
+1e3d 1e3c
+1e3f 1e3e
+1e41 1e40
+1e43 1e42
+1e45 1e44
+1e47 1e46
+1e49 1e48
+1e4b 1e4a
+1e4d 1e4c
+1e4f 1e4e
+1e51 1e50
+1e53 1e52
+1e55 1e54
+1e57 1e56
+1e59 1e58
+1e5b 1e5a
+1e5d 1e5c
+1e5f 1e5e
+1e61 1e60
+1e63 1e62
+1e65 1e64
+1e67 1e66
+1e69 1e68
+1e6b 1e6a
+1e6d 1e6c
+1e6f 1e6e
+1e71 1e70
+1e73 1e72
+1e75 1e74
+1e77 1e76
+1e79 1e78
+1e7b 1e7a
+1e7d 1e7c
+1e7f 1e7e
+1e81 1e80
+1e83 1e82
+1e85 1e84
+1e87 1e86
+1e89 1e88
+1e8b 1e8a
+1e8d 1e8c
+1e8f 1e8e
+1e91 1e90
+1e93 1e92
+1e95 1e94
+1e9b 1e60
+1ea1 1ea0
+1ea3 1ea2
+1ea5 1ea4
+1ea7 1ea6
+1ea9 1ea8
+1eab 1eaa
+1ead 1eac
+1eaf 1eae
+1eb1 1eb0
+1eb3 1eb2
+1eb5 1eb4
+1eb7 1eb6
+1eb9 1eb8
+1ebb 1eba
+1ebd 1ebc
+1ebf 1ebe
+1ec1 1ec0
+1ec3 1ec2
+1ec5 1ec4
+1ec7 1ec6
+1ec9 1ec8
+1ecb 1eca
+1ecd 1ecc
+1ecf 1ece
+1ed1 1ed0
+1ed3 1ed2
+1ed5 1ed4
+1ed7 1ed6
+1ed9 1ed8
+1edb 1eda
+1edd 1edc
+1edf 1ede
+1ee1 1ee0
+1ee3 1ee2
+1ee5 1ee4
+1ee7 1ee6
+1ee9 1ee8
+1eeb 1eea
+1eed 1eec
+1eef 1eee
+1ef1 1ef0
+1ef3 1ef2
+1ef5 1ef4
+1ef7 1ef6
+1ef9 1ef8
+1f00 1f07 1f08
+1f10 1f15 1f18
+1f20 1f27 1f28
+1f30 1f37 1f38
+1f40 1f45 1f48
+1f51 1f59
+1f53 1f5b
+1f55 1f5d
+1f57 1f5f
+1f60 1f67 1f68
+1f70 1f71 1fba
+1f72 1f75 1fc8
+1f76 1f77 1fda
+1f78 1f79 1ff8
+1f7a 1f7b 1fea
+1f7c 1f7d 1ffa
+1f80 1f87 1f88
+1f90 1f97 1f98
+1fa0 1fa7 1fa8
+1fb0 1fb1 1fb8
+1fb3 1fbc
+1fbe 0399
+1fc3 1fcc
+1fd0 1fd1 1fd8
+1fe0 1fe1 1fe8
+1fe5 1fec
+1ff3 1ffc
+2170 217f 2160
+24d0 24e9 24b6
+ff41 ff5a ff21
+END
diff --git a/contrib/perl5/lib/unicode/UCD300.html b/contrib/perl5/lib/unicode/UCD300.html
new file mode 100644
index 0000000..113d311
--- /dev/null
+++ b/contrib/perl5/lib/unicode/UCD300.html
@@ -0,0 +1,345 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+
+<html>
+
+
+
+<head>
+
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+
+<meta http-equiv="Content-Language" content="en-us">
+
+<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
+
+<meta name="ProgId" content="FrontPage.Editor.Document">
+
+<link rel="stylesheet" href="http://www.unicode.org/unicode.css" type="text/css">
+
+<title>Unicode Character Database</title>
+
+</head>
+
+
+
+<body>
+
+
+
+<h1>UNICODE CHARACTER DATABASE<br>
+Version 3.0.0</h1>
+
+<table border="1" cellspacing="2" cellpadding="0" height="87" width="100%">
+
+ <tr>
+
+ <td valign="TOP" width="144">Revision</td>
+
+ <td valign="TOP">3.0.0</td>
+
+ </tr>
+
+ <tr>
+
+ <td valign="TOP" width="144">Authors</td>
+
+ <td valign="TOP">Mark Davis and Ken Whistler</td>
+
+ </tr>
+
+ <tr>
+
+ <td valign="TOP" width="144">Date</td>
+
+ <td valign="TOP">1999-09-11</td>
+
+ </tr>
+
+ <tr>
+
+ <td valign="TOP" width="144">This Version</td>
+
+ <td valign="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html</a></td>
+
+ </tr>
+
+ <tr>
+
+ <td valign="TOP" width="144">Previous Version</td>
+
+ <td valign="TOP">n/a</td>
+
+ </tr>
+
+ <tr>
+
+ <td valign="TOP" width="144">Latest Version</td>
+
+ <td valign="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html</a></td>
+
+ </tr>
+
+</table>
+
+<p align="center">Copyright © 1995-1999 Unicode, Inc. All Rights reserved.</p>
+
+<h2>Disclaimer</h2>
+
+<p>The Unicode Character Database is provided as is by Unicode, Inc. No claims
+
+are made as to fitness for any particular purpose. No warranties of any kind are
+
+expressed or implied. The recipient agrees to determine applicability of
+
+information provided. If this file has been purchased on magnetic or optical
+
+media from Unicode, Inc., the sole remedy for any claim will be exchange of
+
+defective media within 90 days of receipt.</p>
+
+<p>This disclaimer is applicable for all other data files accompanying the
+
+Unicode Character Database, some of which have been compiled by the Unicode
+
+Consortium, and some of which have been supplied by other sources.</p>
+
+<h2>Limitations on Rights to Redistribute This Data</h2>
+
+<p>Recipient is granted the right to make copies in any form for internal
+
+distribution and to freely use the information supplied in the creation of
+
+products supporting the Unicode<sup>TM</sup> Standard. The files in the Unicode
+
+Character Database can be redistributed to third parties or other organizations
+
+(whether for profit or not) as long as this notice and the disclaimer notice are
+
+retained. Information can be extracted from these files and used in
+
+documentation or programs, as long as there is an accompanying notice indicating
+
+the source.</p>
+
+<h2>Introduction</h2>
+
+<p>The Unicode Character Database is a set of files that define the Unicode
+
+character properties and internal mappings. For more information about character
+
+properties and mappings, see <i><a href="http://www.unicode.org/unicode/uni2book/u2.html">The
+
+Unicode Standard</a></i>.</p>
+
+<p>The Unicode Character Database has been updated to reflect Version 3.0 of the
+
+Unicode Standard, with many characters added to those published in Version 2.0.
+
+A number of corrections have also been made to case mappings or other errors in
+
+the database noted since the publication of Version 2.0. Normative bidirectional
+
+properties have also been modified to reflect decisions of the Unicode Technical
+
+Committee.</p>
+
+<p>For more information on versions of the Unicode Standard and how to reference
+
+them, see <a href="http://www.unicode.org/unicode/standard/versions/">http://www.unicode.org/unicode/standard/versions/</a>.</p>
+
+<h2>Conformance</h2>
+
+<p>Character properties may be either normative or informative. <i>Normative</i>
+
+means that implementations that claim conformance to the Unicode Standard (at a
+
+particular version) and which make use of a particular property or field must
+
+follow the specifications of the standard for that property or field in order to
+
+be conformant. The term <i>normative</i> when applied to a property or field of
+
+the Unicode Character Database, does <i>not</i> mean that the value of that
+
+field will never change. Corrections and extensions to the standard in the
+
+future may require minor changes to normative values, even though the Unicode
+
+Technical Committee strives to minimize such changes. An<i> informative </i>property
+
+or field is strongly recommended, but a conformant implementation is free to use
+
+or change such values as it may require while still being conformant to the
+
+standard. Particular implementations may choose to override the properties and
+
+mappings that are not normative. In that case, it is up to the implementer to
+
+establish a protocol to convey that information.</p>
+
+<h2>Files</h2>
+
+<p>The following summarizes the files in the Unicode Character Database. &nbsp;For
+
+more information about these files, see the referenced technical report or
+
+section of Unicode Standard, Version 3.0.</p>
+
+<p><b>UnicodeData.txt (Chapter 4)</b>
+
+<ul>
+
+ <li>The main file in the Unicode Character Database.</li>
+
+ <li>For detailed information on the format, see <a href="UnicodeData.html">UnicodeData.html</a>.
+
+ This file also characterizes which properties are normative and which are
+
+ informative.</li>
+
+</ul>
+
+<p><b>PropList.txt (Chapter 4)</b>
+
+<ul>
+
+ <li>Additional informative properties list: <i>Alphabetic, Ideographic,</i>
+
+ and <i>Mathematical</i>, among others.</li>
+
+</ul>
+
+<p><b>SpecialCasing.txt (Chapter 4)</b>
+
+<ul>
+
+ <li>List of informative special casing properties, including one-to-many
+
+ mappings such as SHARP S =&gt; &quot;SS&quot;, and locale-specific mappings,
+
+ such as for Turkish <i>dotless i</i>.</li>
+
+</ul>
+
+<p><b>Blocks.txt (Chapter 14)</b>
+
+<ul>
+
+ <li>List of normative block names.</li>
+
+</ul>
+
+<p><b>Jamo.txt (Chapter 4)</b>
+
+<ul>
+
+ <li>List of normative Jamo short names, used in deriving HANGUL SYLLABLE names
+
+ algorithmically.</li>
+
+</ul>
+
+<p><b>ArabicShaping.txt (Section 8.2)</b>
+
+<ul>
+
+ <li>Basic Arabic and Syriac character shaping properties, such as initial,
+
+ medial and final shapes. These properties are normative for minimal shaping
+
+ of Arabic and Syriac. </li>
+
+</ul>
+
+<p><b>NamesList.txt (Chapter 14)</b>
+
+<ul>
+
+ <li>This file duplicates some of the material in the UnicodeData file, and
+
+ adds informative annotations uses in the character charts, as printed in the
+
+ Unicode Standard. </li>
+
+ <li><b>Note: </b>The information in NamesList.txt and Index.txt files matches
+
+ the appropriate version of the book. Changes in the Unicode Character
+
+ Database since then may not be reflected in these files, since they are
+
+ primarily of archival interest.</li>
+
+</ul>
+
+<p><b>Index.txt (Chapter 14)</b>
+
+<ul>
+
+ <li>Informative index to Unicode characters, as printed in the Unicode
+
+ Standard</li>
+
+ <li><b>Note: </b>The information in NamesList.txt and Index.txt files matches
+
+ the appropriate version of the book. Changes in the Unicode Character
+
+ Database since then may not be reflected in these files, since they are
+
+ primarily of archival interest.</li>
+
+</ul>
+
+<p><b>CompositionExclusions.txt (<a href="http://www.unicode.org/unicode/reports/tr15/">UTR#15
+
+Unicode Normalization Forms</a>)</b>
+
+<ul>
+
+ <li>Normative properties for normalization.</li>
+
+</ul>
+
+<p><b>LineBreak.txt (<a href="http://www.unicode.org/unicode/reports/tr14/">UTR
+
+#14: Line Breaking Properties</a>)</b>
+
+<ul>
+
+ <li>Normative and informative properties for line breaking. To see which
+
+ properties are informative and which are normative, consult UTR#14.</li>
+
+</ul>
+
+<p><b>EastAsianWidth.txt (<a href="http://www.unicode.org/unicode/reports/tr11/">UTR
+
+#11: East Asian Character Width</a>)</b>
+
+<ul>
+
+ <li>Informative properties for determining the choice of wide vs. narrow
+
+ glyphs in East Asian contexts.</li>
+
+</ul>
+
+<p><b>diffXvY.txt</b>
+
+<ul>
+
+ <li>Mechanically-generated informative files containing accumulated
+
+ differences between successive versions of UnicodeData.txt</li>
+
+</ul>
+
+
+
+</body>
+
+
+
+</html>
+
diff --git a/contrib/perl5/lib/unicode/Unicode.300 b/contrib/perl5/lib/unicode/Unicode.300
new file mode 100644
index 0000000..6a54d3d
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Unicode.300
@@ -0,0 +1,10617 @@
+0000;<control>;Cc;0;BN;;;;;N;NULL;;;;
+0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;;
+0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;;
+0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;;
+0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;
+0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;;
+0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;;
+0007;<control>;Cc;0;BN;;;;;N;BELL;;;;
+0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;;
+0009;<control>;Cc;0;S;;;;;N;HORIZONTAL TABULATION;;;;
+000A;<control>;Cc;0;B;;;;;N;LINE FEED;;;;
+000B;<control>;Cc;0;S;;;;;N;VERTICAL TABULATION;;;;
+000C;<control>;Cc;0;WS;;;;;N;FORM FEED;;;;
+000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN;;;;
+000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;;
+000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;;
+0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;;
+0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;;
+0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;;
+0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;;
+0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;;
+0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;;
+0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;;
+0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;;
+0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;;
+0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;;
+001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;;
+001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;;
+001C;<control>;Cc;0;B;;;;;N;FILE SEPARATOR;;;;
+001D;<control>;Cc;0;B;;;;;N;GROUP SEPARATOR;;;;
+001E;<control>;Cc;0;B;;;;;N;RECORD SEPARATOR;;;;
+001F;<control>;Cc;0;S;;;;;N;UNIT SEPARATOR;;;;
+0020;SPACE;Zs;0;WS;;;;;N;;;;;
+0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
+0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
+0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
+0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
+0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
+0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
+0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
+002A;ASTERISK;Po;0;ON;;;;;N;;;;;
+002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;;
+0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
+0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
+0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
+0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
+0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
+0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
+0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
+0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
+0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
+0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
+003A;COLON;Po;0;CS;;;;;N;;;;;
+003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
+003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
+003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
+0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
+0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
+0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
+0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
+0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
+0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
+0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
+0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
+0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
+0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
+004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
+004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
+004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
+004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
+004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
+004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
+0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
+0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
+0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
+0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
+0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
+0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
+0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
+0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
+0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
+0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
+005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
+005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
+005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
+005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
+005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
+005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
+0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
+0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
+0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
+0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
+0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
+0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
+0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
+0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
+0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
+0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
+006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
+006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
+006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
+006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
+006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
+006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
+0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
+0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
+0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
+0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
+0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
+0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
+0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
+0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
+0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
+0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
+007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
+007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
+007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
+007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
+007E;TILDE;Sm;0;ON;;;;;N;;;;;
+007F;<control>;Cc;0;BN;;;;;N;DELETE;;;;
+0080;<control>;Cc;0;BN;;;;;N;;;;;
+0081;<control>;Cc;0;BN;;;;;N;;;;;
+0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
+0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
+0084;<control>;Cc;0;BN;;;;;N;INDEX;;;;
+0085;<control>;Cc;0;B;;;;;N;NEXT LINE;;;;
+0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
+0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
+0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;;
+0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;;
+008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;;
+008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE DOWN;;;;
+008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE UP;;;;
+008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;;
+008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;;
+008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;;
+0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;;
+0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
+0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;;
+0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;;
+0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;;
+0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;;
+0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;;
+0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;;
+0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;;
+0099;<control>;Cc;0;BN;;;;;N;;;;;
+009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;;
+009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;;
+009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;;
+009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;;
+009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;;
+009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;;
+00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;
+00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
+00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
+00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
+00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
+00A7;SECTION SIGN;So;0;ON;;;;;N;;;;;
+00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;;
+00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
+00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
+00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
+00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
+00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
+00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
+00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;2;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;3;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
+00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
+00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;;
+00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
+00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;1;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;;
+00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;;
+00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
+00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
+00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
+00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
+00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
+00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
+00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
+00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
+00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
+00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
+00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6;
+00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
+00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
+00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
+00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
+00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
+00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
+00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
+00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
+00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
+00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0;
+00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
+00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
+00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
+00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
+00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
+00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
+00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
+00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
+00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
+00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
+00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
+00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
+00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
+00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE;
+00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;;
+00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
+00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
+00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
+00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
+00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
+00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
+00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6
+00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
+00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
+00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
+00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
+00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
+00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
+00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
+00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
+00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
+00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0
+00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
+00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
+00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
+00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
+00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
+00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
+00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
+00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
+00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
+00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
+00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
+00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
+00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE
+00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
+0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
+0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
+0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
+0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
+0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
+0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
+0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
+0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
+0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
+0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
+010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
+010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
+010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
+010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
+010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
+010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
+0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
+0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
+0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
+0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
+0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
+0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
+0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
+0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
+0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
+0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
+011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
+011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
+011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
+011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
+011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
+011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
+0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
+0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
+0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
+0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
+0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
+0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
+0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
+0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
+0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
+0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
+012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
+012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
+012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
+012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
+012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
+012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
+0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
+0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
+0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
+0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
+0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
+0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
+0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
+0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
+0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;;
+0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
+013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
+013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
+013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
+013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
+013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
+013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
+0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F
+0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
+0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
+0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
+0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
+0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
+0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
+0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
+0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
+0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
+014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B;
+014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A
+014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
+014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
+014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
+014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
+0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
+0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
+0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
+0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
+0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
+0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
+0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
+0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
+0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
+0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
+015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
+015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
+015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
+015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
+015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F;
+015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E
+0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
+0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
+0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163;
+0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162
+0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
+0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
+0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
+0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
+0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
+0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
+016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
+016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
+016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
+016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
+016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
+016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
+0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
+0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
+0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
+0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
+0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
+0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
+0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
+0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
+0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
+0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
+017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
+017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
+017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
+017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
+017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
+017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053
+0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;;
+0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
+0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
+0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
+0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
+0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
+0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
+0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
+0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
+0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256;
+018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
+018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
+018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
+018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
+018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
+018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
+0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
+0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
+0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
+0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
+0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
+0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6
+0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
+0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
+0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
+0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
+019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;;
+019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
+019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
+019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
+019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;;;
+019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275;
+01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
+01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
+01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3;
+01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2
+01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
+01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280;
+01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
+01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
+01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
+01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
+01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
+01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
+01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
+01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
+01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
+01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
+01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
+01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
+01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
+01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
+01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
+01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
+01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
+01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
+01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
+01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
+01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
+01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
+01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
+01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
+01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
+01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
+01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
+01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
+01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
+01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;
+01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
+01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;
+01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
+01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;
+01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
+01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
+01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
+01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
+01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
+01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
+01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
+01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
+01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
+01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
+01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
+01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
+01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
+01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
+01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
+01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
+01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
+01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
+01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
+01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
+01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
+01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
+01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3;
+01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2
+01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
+01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
+01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
+01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
+01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
+01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
+01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
+01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
+01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
+01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
+01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
+01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
+01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
+01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;
+01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
+01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
+01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
+01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
+01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
+01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
+01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
+01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
+01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
+01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD;
+01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC
+01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
+01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
+0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
+0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
+0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
+0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
+0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
+0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
+0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
+0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
+0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
+0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
+020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
+020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
+020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
+020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
+020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
+020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
+0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
+0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
+0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
+0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
+0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
+0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
+0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
+0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
+0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219;
+0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218
+021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B;
+021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A
+021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
+021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
+021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
+021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
+0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
+0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
+0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
+0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
+0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
+0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
+0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
+0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
+022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
+022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
+022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
+022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
+022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
+022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
+0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
+0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
+0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
+0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;;
+0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;;
+0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
+0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
+0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
+0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
+0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
+0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
+0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
+0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
+025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
+025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
+025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;;
+025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
+025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
+025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
+0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
+0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;;
+0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
+0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
+0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
+0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;;
+0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;;
+0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
+0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
+0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
+026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
+026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;;
+026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
+026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
+026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
+0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;;
+0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
+0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
+0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
+0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
+0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
+0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
+0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
+0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
+027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
+027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
+027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;;
+027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
+027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6
+0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
+0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
+0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
+0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
+0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
+0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
+0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;;
+0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
+0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;;
+028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
+028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
+028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;;
+028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
+028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
+028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
+0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
+0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
+0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
+0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
+0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
+0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
+0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
+0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
+0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
+029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
+029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
+029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
+029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;;
+029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;;
+029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
+02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
+02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
+02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
+02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
+02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
+02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
+02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
+02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
+02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
+02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
+02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
+02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
+02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
+02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;;
+02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;;
+02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
+02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
+02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
+02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Sk;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Sk;0;ON;;;;;N;;;;;
+02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
+02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
+02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
+02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
+02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Sk;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Sk;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Sk;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Sk;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Sk;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
+02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
+02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
+02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
+02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
+02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
+02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;;
+02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;;
+02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;;
+02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;;
+02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;;
+02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
+02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
+02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
+02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;;
+02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;;
+02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;;
+02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;;
+02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;;
+02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
+02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
+02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;;
+02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
+02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;;
+0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia;;;
+0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
+0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
+0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
+0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
+0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;;
+0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
+0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;;
+0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
+030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
+030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
+030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
+030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;Tonos;;;
+030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
+030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
+0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
+0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
+0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
+0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;;
+0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;;
+0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
+0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
+0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
+0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
+0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
+031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
+031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
+031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
+031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
+031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
+031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
+0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
+0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
+0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
+0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
+0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
+0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
+0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
+0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
+0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
+0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
+032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
+032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
+032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
+032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
+032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
+032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
+0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
+0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
+0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
+0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
+0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
+0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
+0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
+0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
+0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
+0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
+033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
+033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
+033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
+033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
+033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
+033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
+0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;;
+0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;;
+0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
+0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
+0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
+0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
+0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
+034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
+034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
+034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
+034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
+0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
+0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
+0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;;
+0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;;
+037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
+037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;;
+0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;;
+0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
+0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
+0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
+0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
+0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
+038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
+038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
+038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
+038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
+0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
+0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
+0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
+0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
+0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
+0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
+0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
+0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
+0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
+0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
+039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
+039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
+039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
+039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
+039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
+039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
+03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
+03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
+03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
+03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
+03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
+03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
+03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
+03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
+03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
+03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
+03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
+03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
+03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
+03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
+03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
+03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
+03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
+03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
+03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
+03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
+03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
+03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
+03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
+03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
+03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
+03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
+03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
+03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
+03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
+03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
+03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
+03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
+03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
+03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
+03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
+03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
+03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
+03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
+03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
+03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
+03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
+03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
+03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
+03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
+03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
+03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
+03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
+03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
+03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
+03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
+03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;;
+03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
+03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
+03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
+03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
+03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
+03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
+03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
+03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
+03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
+03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
+03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
+03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
+03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
+03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
+03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
+03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
+03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
+03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
+03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
+03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
+03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
+03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
+03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
+03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03A3;;03A3
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
+0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
+0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
+0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
+0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
+0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
+0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
+0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
+0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457;
+0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
+0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
+040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
+040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B;
+040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
+040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
+040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E;
+040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
+0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
+0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
+0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
+0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
+0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
+0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
+0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
+0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
+0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
+0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
+041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
+041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
+041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
+041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
+041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
+041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
+0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
+0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
+0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
+0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
+0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
+0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
+0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
+0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
+0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
+0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
+042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
+042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
+042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
+042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
+042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
+042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
+0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
+0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
+0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
+0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
+0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
+0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
+0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
+0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
+0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
+0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
+043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
+043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
+043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
+043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
+043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
+043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
+0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
+0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
+0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
+0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
+0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
+0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
+0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
+0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
+0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
+0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
+044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
+044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
+044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
+044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
+044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
+044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
+0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
+0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
+0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402
+0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
+0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
+0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
+0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
+0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407
+0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
+0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
+045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
+045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B
+045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
+045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
+045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E
+045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
+0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
+0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
+0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
+0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
+0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
+0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
+0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
+0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
+0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
+0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
+046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
+046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
+046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
+046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
+046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
+046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
+0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
+0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
+0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
+0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
+0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
+0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
+0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
+0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
+0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
+0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
+047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
+047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
+047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
+047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
+047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
+047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
+0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
+0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
+0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
+0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
+0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
+0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
+0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
+0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
+0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
+048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
+048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
+048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
+048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
+0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
+0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
+0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
+0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
+0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
+0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
+0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
+0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
+0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
+0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
+049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
+049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
+049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
+049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
+049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
+049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
+04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
+04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
+04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
+04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
+04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
+04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
+04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7;
+04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6
+04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
+04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
+04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
+04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
+04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
+04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
+04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
+04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
+04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
+04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
+04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
+04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
+04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5;
+04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4
+04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
+04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
+04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
+04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
+04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
+04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
+04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
+04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
+04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
+04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
+04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;;
+04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
+04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
+04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
+04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
+04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
+04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
+04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
+04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
+04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
+04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
+04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
+04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
+04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
+04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
+04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
+04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
+04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
+04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
+04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
+04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
+04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
+04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
+04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
+04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
+04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
+04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
+04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
+04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
+04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
+04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
+04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
+04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
+04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
+04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
+04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
+04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
+04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
+04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
+04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
+04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
+04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
+04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
+04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
+04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
+04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
+04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
+04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
+04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
+0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
+0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
+0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
+0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
+0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
+0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
+0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
+0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
+0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
+053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
+053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
+053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
+053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
+053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
+053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
+0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
+0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
+0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
+0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
+0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
+0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
+0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
+0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
+0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
+0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
+054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
+054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
+054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
+054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
+054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
+054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
+0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
+0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
+0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
+0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
+0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
+0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
+0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
+0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
+055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
+055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
+055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
+055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
+055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
+055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
+0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
+0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
+0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
+0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
+0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
+0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
+0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
+0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
+0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
+056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
+056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
+056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
+056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
+056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
+056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
+0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
+0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
+0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
+0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
+0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
+0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
+0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
+0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
+0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
+0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
+057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
+057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
+057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
+057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
+057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
+057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
+0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
+0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
+0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
+0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
+0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
+0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
+0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
+0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;;
+0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
+058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
+0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
+0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
+0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
+0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
+0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
+0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;;
+0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
+0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;;
+0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
+059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
+059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
+059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
+059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
+059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
+059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
+05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
+05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
+05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
+05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
+05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;;
+05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
+05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
+05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;;
+05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
+05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;;
+05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
+05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
+05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
+05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
+05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
+05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
+05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
+05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
+05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
+05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
+05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
+05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
+05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
+05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
+05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
+05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
+05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;;
+05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;;
+05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;;
+05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
+05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;;
+05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
+05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
+05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;;
+05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
+05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
+05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
+05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
+05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
+05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
+05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
+05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
+05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
+05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
+05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
+05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
+05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
+05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
+05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
+05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
+05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
+05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
+05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
+05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
+05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
+05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
+05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
+05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
+05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
+05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
+05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
+05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
+05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
+05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
+0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
+0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
+0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
+0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
+0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
+0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
+0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
+0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
+0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
+062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
+062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
+062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
+062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
+062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
+062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
+0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
+0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
+0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
+0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
+0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
+0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
+0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
+0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
+0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
+063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
+0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
+0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
+0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
+0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
+0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
+0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
+0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
+0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
+0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
+064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
+064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
+064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
+064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
+064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
+064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
+0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
+0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
+0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
+0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
+0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
+0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
+0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
+0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
+0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
+0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
+0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
+0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
+0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
+0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
+066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
+066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
+066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
+066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
+0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
+0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
+0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
+0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
+0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
+0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;;
+0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;;
+0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;;
+0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;;
+0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;;
+067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;;
+067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;;
+067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;;
+067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;;
+067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;;
+067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;;
+0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;;
+0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;;
+0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;;
+0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;;
+0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;;
+0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;;
+0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;;
+0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;;
+0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;;
+0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;;
+068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;;
+068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;;
+068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;;
+068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;;
+0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;;
+0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;;
+0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;;
+0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;;
+0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;;
+0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;;
+0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;;
+0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;;
+0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;;
+069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;;
+06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;;
+06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;;
+06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;;
+06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;;
+06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;;
+06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;;
+06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;;
+06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;;
+06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;;
+06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;;
+06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;;
+06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;;
+06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;;
+06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;;
+06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;;
+06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;;
+06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;;
+06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;;
+06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;;
+06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;;
+06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;;
+06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;;
+06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;;
+06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;;
+06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;;
+06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;;
+06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;;
+06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;;
+06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;;
+06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;;
+06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;;
+06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;;
+06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;;
+06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;;
+06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;;
+06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;;
+06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;;
+06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;;
+06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;;
+06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;;
+06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;;
+06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;;
+06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;;
+06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;;
+06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;;
+06DD;ARABIC END OF AYAH;Me;0;NSM;;;;;N;;;;;
+06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;;
+06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;;
+06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;;
+06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;;
+06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;;
+06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;;
+06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;;
+06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;;
+06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;;
+06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;;
+06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;;
+06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;;
+06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;;
+06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
+06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
+06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
+06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
+06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
+06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;;
+06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;;
+06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;;
+06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;;
+06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;;
+06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;;
+06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;;
+06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
+06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
+0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
+0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;;
+0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;;
+0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;;
+0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;;
+0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;;
+070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;;
+070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;;
+070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;;
+070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;;
+070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;;
+0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;;
+0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;;
+0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;;
+0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;;
+0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;;
+0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;;
+0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;;
+0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;;
+0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;;
+0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
+071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;;
+071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;;
+071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;;
+071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;;
+071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;;
+071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;;
+0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;;
+0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;;
+0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;;
+0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;;
+0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;;
+0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;;
+0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;;
+0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;;
+0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;;
+0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;;
+072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
+072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
+072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;;
+0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;;
+0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;;
+0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;;
+073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;;
+073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;;
+073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;;
+073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;;
+0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;;
+0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;;
+0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;;
+0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;;
+0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
+0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
+074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
+0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
+0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;;
+0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;;
+0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;;
+0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;;
+0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;;
+0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;;
+078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;;
+078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;;
+078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;;
+078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;;
+078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;;
+078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;;
+0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;;
+0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;;
+0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;;
+0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;;
+0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;;
+0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;;
+0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;;
+0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;;
+0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;;
+0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;;
+079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;;
+079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;;
+079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;;
+079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;;
+079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;;
+079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;;
+07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;;
+07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;;
+07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;;
+07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;;
+07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;;
+07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;;
+07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;;
+07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;;
+07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;;
+07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;;
+07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;;
+07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;;
+07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;;
+07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;;
+07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;;
+07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;;
+07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;;
+0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
+0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
+0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
+0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;;
+0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;;
+090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;;
+090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;;
+090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;;
+090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;;
+0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;;
+0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;;
+0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;;
+0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;;
+0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;;
+0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;;
+0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;;
+0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;;
+091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;;
+091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;;
+091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;;
+091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;;
+091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;;
+091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;;
+0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;;
+0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;;
+0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;;
+0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;;
+092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;;
+092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;;
+092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;;
+092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;;
+092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;;
+092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;;
+0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;;
+0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;;
+0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;;
+0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;;
+0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;;
+0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;;
+0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;;
+093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;;
+0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;;
+094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;;
+0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;;
+0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;;
+0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;;
+0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;;
+095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;;
+095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;;
+095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;;
+095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;;
+095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;;
+095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;;
+0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;;
+0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
+0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;;
+0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;;
+0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;;
+0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;;
+0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;;
+098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;;
+098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;;
+0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;;
+0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;;
+0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;;
+0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;;
+0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;;
+0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;;
+099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;;
+099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;;
+099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;;
+099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;;
+099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;;
+099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;;
+09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;;
+09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;;
+09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;;
+09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;;
+09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;;
+09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;;
+09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;;
+09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;;
+09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;;
+09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;;
+09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;;
+09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;;
+09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;;
+09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;;
+09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;;
+09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;;
+09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;;
+09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
+09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
+09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;;
+09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;;
+09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;;
+09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;;
+09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;;
+09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;;
+09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;;
+09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;;
+09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
+09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;;
+09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;;
+09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;;
+09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;;
+09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;;
+09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
+09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
+0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
+0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;;
+0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;;
+0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;;
+0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;;
+0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;;
+0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;;
+0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;;
+0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;;
+0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;;
+0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;;
+0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;;
+0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;;
+0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;;
+0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;;
+0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;;
+0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;;
+0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;;
+0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;;
+0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;;
+0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;;
+0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;;
+0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;;
+0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;;
+0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;;
+0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;;
+0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;;
+0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;;
+0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;;
+0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;;
+0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;;
+0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;;
+0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;;
+0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;;
+0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
+0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
+0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
+0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
+0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
+0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;;
+0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;;
+0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;;
+0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;;
+0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;;
+0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;;
+0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;;
+0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;;
+0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;;
+0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;;
+0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;;
+0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;;
+0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;;
+0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;;
+0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;;
+0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;;
+0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;;
+0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;;
+0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;;
+0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;;
+0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;;
+0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;;
+0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;;
+0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;;
+0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;;
+0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;;
+0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;;
+0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;;
+0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;;
+0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;;
+0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;;
+0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;;
+0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;;
+0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;;
+0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;;
+0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;;
+0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;;
+0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;;
+0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
+0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;;
+0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;;
+0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;;
+0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;;
+0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;;
+0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;;
+0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;;
+0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;;
+0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;;
+0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;;
+0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;;
+0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;;
+0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;;
+0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;;
+0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;;
+0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;;
+0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;;
+0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;;
+0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;;
+0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;;
+0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;;
+0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;;
+0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
+0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
+0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
+0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;;
+0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;;
+0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
+0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;;
+0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;;
+0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;;
+0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;;
+0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
+0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;;
+0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;;
+0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;;
+0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;;
+0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;;
+0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;;
+0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;;
+0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;;
+0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;;
+0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;;
+0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;;
+0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;;
+0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;;
+0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;;
+0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;;
+0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;;
+0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;;
+0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;;
+0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;;
+0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;;
+0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;;
+0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;;
+0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;;
+0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;;
+0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;;
+0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;;
+0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;;
+0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;;
+0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;;
+0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;;
+0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;;
+0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;;
+0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;;
+0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;;
+0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;;
+0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
+0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
+0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;;
+0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;;
+0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;;
+0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;;
+0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;;
+0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;;
+0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;;
+0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;;
+0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;;
+0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;;
+0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;;
+0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;;
+0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;;
+0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;;
+0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;;
+0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;;
+0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;;
+0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;;
+0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;;
+0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;;
+0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;;
+0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;;
+0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;;
+0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;;
+0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;;
+0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;;
+0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;;
+0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;;
+0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;;
+0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;;
+0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;;
+0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;;
+0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;;
+0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;;
+0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;;
+0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;;
+0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
+0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
+0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
+0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;;
+0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;;
+0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;;
+0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;;
+0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;;
+0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;;
+0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;;
+0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;;
+0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;;
+0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;;
+0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;;
+0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;;
+0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;;
+0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;;
+0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;;
+0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;;
+0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;;
+0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;;
+0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;;
+0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;;
+0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;;
+0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;;
+0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;;
+0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;;
+0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;;
+0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;;
+0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;;
+0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;;
+0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;;
+0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;;
+0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;;
+0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;;
+0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;;
+0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;;
+0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;;
+0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;;
+0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;;
+0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;;
+0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;;
+0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;;
+0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;;
+0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;;
+0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;;
+0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;;
+0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;;
+0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;;
+0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
+0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
+0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
+0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
+0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
+0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
+0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;;
+0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;;
+0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
+0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
+0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
+0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
+0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
+0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;;
+0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;;
+0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;;
+0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;;
+0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;;
+0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;;
+0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;;
+0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;;
+0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;;
+0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;;
+0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;;
+0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;;
+0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;;
+0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;;
+0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;;
+0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;;
+0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;;
+0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;;
+0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;;
+0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;;
+0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;;
+0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;;
+0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;;
+0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;;
+0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;;
+0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;;
+0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;;
+0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;;
+0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;;
+0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;;
+0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;;
+0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;;
+0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;;
+0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;;
+0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;;
+0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;;
+0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;;
+0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;;
+0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;;
+0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;;
+0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;;
+0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;;
+0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;;
+0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;;
+0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;;
+0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;;
+0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
+0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
+0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
+0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;;
+0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;;
+0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;;
+0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;;
+0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;;
+0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;;
+0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;;
+0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;;
+0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;;
+0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;;
+0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;;
+0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;;
+0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;;
+0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;;
+0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;;
+0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;;
+0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;;
+0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;;
+0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;;
+0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;;
+0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;;
+0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;;
+0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;;
+0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;;
+0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;;
+0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;;
+0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;;
+0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;;
+0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;;
+0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;;
+0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;;
+0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;;
+0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;;
+0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;;
+0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;;
+0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;;
+0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;;
+0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;;
+0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;;
+0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;;
+0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;;
+0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;;
+0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;;
+0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;;
+0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;;
+0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;;
+0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;;
+0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;;
+0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;;
+0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;;
+0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;;
+0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;;
+0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;;
+0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;;
+0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;;
+0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;;
+0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;;
+0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;;
+0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;;
+0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;;
+0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;;
+0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;;
+0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;;
+0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;;
+0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;;
+0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;;
+0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;;
+0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;;
+0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;;
+0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;;
+0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;;
+0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;;
+0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;;
+0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;;
+0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;;
+0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;;
+0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;;
+0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;;
+0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;;
+0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;;
+0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;;
+0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;;
+0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;;
+0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;;
+0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;;
+0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;;
+0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;;
+0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;;
+0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;;
+0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;;
+0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;;
+0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;;
+0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;;
+0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;;
+0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;;
+0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;;
+0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;;
+0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;;
+0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;;
+0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;;
+0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;;
+0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;;
+0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;;
+0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;;
+0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;;
+0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;;
+0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;;
+0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;;
+0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;;
+0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;;
+0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;;
+0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;;
+0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;;
+0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;;
+0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;;
+0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;;
+0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;;
+0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;;
+0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;;
+0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;;
+0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;;
+0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;;
+0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;;
+0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;;
+0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;;
+0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;;
+0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;;
+0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;;
+0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;;
+0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;;
+0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;;
+0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;;
+0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;;
+0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;;
+0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;;
+0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;;
+0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;;
+0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;;
+0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;;
+0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;;
+0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;;
+0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;;
+0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;;
+0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;;
+0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;;
+0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;;
+0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;;
+0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;;
+0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;;
+0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;;
+0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;;
+0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;;
+0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;;
+0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;;
+0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;;
+0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;;
+0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;;
+0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;;
+0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;;
+0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;;
+0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;;
+0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;;
+0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;;
+0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;;
+0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;;
+0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;;
+0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;;
+0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;;
+0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;;
+0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;;
+0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;;
+0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;;
+0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;;
+0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;;
+0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;;
+0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;;
+0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;;
+0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;;
+0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;;
+0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;;
+0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;;
+0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;;
+0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;;
+0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;;
+0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;;
+0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;;
+0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;;
+0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;;
+0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;;
+0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;tsek tar;;;
+0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;;
+0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;;
+0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;;
+0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;;
+0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;;
+0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;;
+0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;;
+0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;;
+0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;;
+0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;;
+0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;;
+0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;;
+0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;;
+0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;;
+0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;;
+0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;;
+0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;;
+0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;;
+0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;;
+0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;;N;;;;;
+0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
+0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
+0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
+0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;;
+0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;;
+0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;;
+0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;;
+0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;;
+0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;;
+0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;;
+0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;;
+0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;;
+0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;;
+0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;;
+0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;;
+0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;;
+0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;;
+0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;;
+0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;;
+0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;;
+0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;;
+0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;;
+0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;;
+0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;;
+0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;;
+0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;;
+0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;;
+0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;;
+0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;;
+0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;;
+0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;;
+0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;;
+0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;;
+0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;;
+0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;;
+0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;;
+0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;;
+0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;;
+0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;;
+0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;;
+0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;;
+0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;;
+0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;;
+0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;;
+0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;;
+0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;;
+0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;;
+0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;;
+0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;;
+0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;;
+0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;;
+0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;;
+0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;;
+0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;;
+0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;;
+0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;;
+0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;;
+0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;;
+0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;;
+0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;;
+0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;;
+0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;;
+0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;;
+0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;;
+0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;;
+0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;;
+0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;;
+0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;;
+0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;;
+0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;;
+0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;;
+0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;;
+0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;;
+0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;;
+0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;;
+0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;;
+0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;;
+0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;;
+0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;;
+0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;;
+0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;;
+0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;;
+0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;;
+0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;;
+0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;;
+0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;;
+0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;;
+0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;;
+0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;;
+0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;;
+0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;;
+0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;;
+0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;;
+0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;;
+0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;;
+0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;;
+0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;;
+0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;;
+0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;;
+0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;;
+0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;;
+0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;;
+0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;;
+0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;;
+0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;;
+0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;;
+0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;;
+0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;;
+0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;;
+0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;;
+0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;;
+0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;;
+0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;;
+0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;;
+0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;;
+0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;;
+0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;;
+0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;;
+0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;;
+0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;;
+0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;;
+0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;;
+0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;;
+0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;;
+0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;;
+0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;;
+0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;;
+0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;;
+0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;;
+0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
+0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
+0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;;
+1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
+1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
+1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
+1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;;
+1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;;
+1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;;
+1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;;
+1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;;
+1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;;
+1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;;
+100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;;
+100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;;
+100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;;
+100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;;
+100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;;
+100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;;
+1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;;
+1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;;
+1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;;
+1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;;
+1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;;
+1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;;
+1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;;
+1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;;
+1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;;
+1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;;
+101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;;
+101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;;
+101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;;
+101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;;
+101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;;
+101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;;
+1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;;
+1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;;
+1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;;
+1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;;
+1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;;
+1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;;
+1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;;
+1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;;
+102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;;
+102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;;
+1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;;
+1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;;
+104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;;
+104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;;
+104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;;
+104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;;
+104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;;
+1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;;
+1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;;
+1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
+1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
+1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
+1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
+10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;;
+10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;;
+10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;;
+10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;;
+10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;;
+10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;;
+10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;;
+10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;;
+10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;;
+10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;;
+10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;;
+10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;;
+10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;;
+10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;;
+10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;;
+10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;;
+10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;;
+10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;;
+10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;;
+10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;;
+10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;;
+10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;;
+10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;;
+10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;;
+10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;;
+10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;;
+10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;;
+10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;;
+10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;;
+10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;;
+10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;;
+10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;;
+10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;;
+10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;;
+10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;;
+10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;;
+10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;;
+10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;;
+10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;;
+10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;;
+1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;;
+1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;;
+1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;;
+110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;;
+110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;;
+1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;;
+1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;;
+111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;;
+111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;;
+1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;;
+1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;;
+1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;;
+112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;;
+112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;;
+112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;;
+1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;;
+1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;;
+1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;;
+1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;;
+1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;;
+113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;;
+113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;;
+113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;;
+113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;;
+113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;;
+1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;;
+1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;;
+1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;;
+1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;;
+1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;;
+114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;;
+114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;;
+114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;;
+114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;;
+114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;;
+1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;;
+1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;;
+1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;;
+1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;;
+1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;;
+1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;;
+1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;;
+1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;;
+1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;;
+1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;;
+1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;;
+1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;;
+1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;;
+1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;;
+1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;;
+116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;;
+116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;;
+116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;;
+116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;;
+116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;;
+116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;;
+1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;;
+1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;;
+1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;;
+1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;;
+1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;;
+1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;;
+1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;;
+1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;;
+1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;;
+1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;;
+117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;;
+117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;;
+117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;;
+117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;;
+117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;;
+117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;;
+1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;;
+1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;;
+1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;;
+1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;;
+1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;;
+1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;;
+1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;;
+1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;;
+1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;;
+1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;;
+118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;;
+118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;;
+118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;;
+118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;;
+118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;;
+118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;;
+1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;;
+1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;;
+1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;;
+1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;;
+1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;;
+1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;;
+1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;;
+1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;;
+1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;;
+1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;;
+119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;;
+119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;;
+119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;;
+119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;;
+119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;;
+119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;;
+11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;;
+11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;;
+11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;;
+11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;;
+11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;;
+11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;;
+11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;;
+11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;;
+11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;;
+11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;;
+11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;;
+11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;;
+11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;;
+11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;;
+11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;;
+11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;;
+11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;;
+11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;;
+11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;;
+11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;;
+11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;;
+11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;;
+11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;;
+11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;;
+11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;;
+11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;;
+11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;;
+11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;;
+11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;;
+11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;;
+11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;;
+11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;;
+11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;;
+11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;;
+11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;;
+11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;;
+11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;;
+11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;;
+11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;;
+11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;;
+11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;;
+11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;;
+11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;;
+11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;;
+11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;;
+11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;;
+11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;;
+11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;;
+11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;;
+11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;;
+11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;;
+11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;;
+11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;;
+11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;;
+11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;;
+11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;;
+11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;;
+11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;;
+11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;;
+11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;;
+11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;;
+11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;;
+11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;;
+11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;;
+11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;;
+11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;;
+11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;;
+11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;;
+11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;;
+11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;;
+11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;;
+11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;;
+11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;;
+11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;;
+11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;;
+11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;;
+1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;;
+1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;;
+1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;;
+1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;;
+1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;;
+120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;;
+120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;;
+1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;;
+1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;;
+1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;;
+1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;;
+1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;;
+1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;;
+1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;;
+1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;;
+1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;;
+121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;;
+121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;;
+1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;;
+1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;;
+1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;;
+1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;;
+1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;;
+1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;;
+1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;;
+1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;;
+1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;;
+122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;;
+122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;;
+122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;;
+1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;;
+1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;;
+1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;;
+1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;;
+123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;;
+123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;;
+123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;;
+1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;;
+1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;;
+1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;;
+1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;;
+1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;;
+124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;;
+124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;;
+124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;;
+124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;;
+1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;;
+1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;;
+1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;;
+1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;;
+1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;;
+1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;;
+1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;;
+1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;;
+125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;;
+125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;;
+125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;;
+125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;;
+1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;;
+1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;;
+1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;;
+1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;;
+126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;;
+126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;;
+126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;;
+1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;;
+1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;;
+1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;;
+1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;;
+127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;;
+127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;;
+1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;;
+1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;;
+1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;;
+1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;;
+1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;;
+1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;;
+128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;;
+128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;;
+128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;;
+128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;;
+1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;;
+1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;;
+1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;;
+1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;;
+1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;;
+129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;;
+129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;;
+129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;;
+12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;;
+12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;;
+12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;;
+12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;;
+12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;;
+12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;;
+12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;;
+12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;;
+12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;;
+12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;;
+12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;;
+12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;;
+12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;;
+12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;;
+12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;;
+12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;;
+12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;;
+12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;;
+12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;;
+12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;;
+12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;;
+12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;;
+12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;;
+12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;;
+12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;;
+12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;;
+12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;;
+12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;;
+12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;;
+12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;;
+12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;;
+12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;;
+12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;;
+12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;;
+12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;;
+12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;;
+12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;;
+12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;;
+12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;;
+12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;;
+12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;;
+12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;;
+12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;;
+12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;;
+12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;;
+12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;;
+12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;;
+12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;;
+12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;;
+12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;;
+12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;;
+12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;;
+12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;;
+12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;;
+1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;;
+1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;;
+1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;;
+1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;;
+1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;;
+1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;;
+130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;;
+130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;;
+1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;;
+1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;;
+1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;;
+1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;;
+1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;;
+131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;;
+131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;;
+1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;;
+1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;;
+1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;;
+1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;;
+1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;;
+1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;;
+1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;;
+1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;;
+132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;;
+132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;;
+132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;;
+1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;;
+1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;;
+1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;;
+1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;;
+1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;;
+1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;;
+1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;;
+1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;;
+1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;;
+1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;;
+133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;;
+133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;;
+133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;;
+133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;;
+133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;;
+133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;;
+1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;;
+1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;;
+1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;;
+1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;;
+1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;;
+1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;;
+1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;;
+1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;;
+134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;;
+134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;;
+134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;;
+1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;;
+1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;;
+1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;;
+1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;;
+1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;;
+1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;;
+135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;;
+1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;;
+1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;;
+1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;;
+1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;;
+1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;;
+1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;;
+1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;;
+1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;;
+1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;;
+1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;;
+137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;;
+137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;;
+13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;;
+13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;;
+13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;;
+13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;;
+13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;;
+13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;;
+13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;;
+13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;;
+13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;;
+13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;;
+13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;;
+13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;;
+13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;;
+13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;;
+13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;;
+13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;;
+13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;;
+13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;;
+13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;;
+13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;;
+13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;;
+13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;;
+13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;;
+13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;;
+13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;;
+13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;;
+13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;;
+13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;;
+13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;;
+13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;;
+13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;;
+13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;;
+13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;;
+13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;;
+13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;;
+13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;;
+13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;;
+13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;;
+13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;;
+13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;;
+13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;;
+13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;;
+13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;;
+13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;;
+13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;;
+13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;;
+13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;;
+13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;;
+13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;;
+13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;;
+13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;;
+13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;;
+13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;;
+13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;;
+13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;;
+13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;;
+13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;;
+13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;;
+13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;;
+13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;;
+13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;;
+13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;;
+13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;;
+13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;;
+13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;;
+13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;;
+13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;;
+13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;;
+13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;;
+13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;;
+13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;;
+13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;;
+13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;;
+13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;;
+13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;;
+13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;;
+13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;;
+13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;;
+13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;;
+13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;;
+13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;;
+13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;;
+13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;;
+13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;;
+1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;;
+1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;;
+1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;;
+1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;;
+1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;;
+1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;;
+1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;;
+1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;;
+1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;;
+140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;;
+140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;;
+140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;;
+140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;;
+140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;;
+140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;;
+1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;;
+1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;;
+1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;;
+1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;;
+1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;;
+1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;;
+1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;;
+1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;;
+1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;;
+1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;;
+141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;;
+141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;;
+141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;;
+141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;;
+141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;;
+1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;;
+1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;;
+1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;;
+1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;;
+1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;;
+1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;;
+1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;;
+1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;;
+1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;;
+1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;;
+142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;;
+142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;;
+142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;;
+142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;;
+142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;;
+142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;;
+1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;;
+1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;;
+1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;;
+1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;;
+1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;;
+1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;;
+1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;;
+1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;;
+1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;;
+1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;;
+143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;;
+143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;;
+143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;;
+143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;;
+143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;;
+143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;;
+1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;;
+1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;;
+1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;;
+1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;;
+1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;;
+1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;;
+1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;;
+1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;;
+1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;;
+144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;;
+144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;;
+144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;;
+144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;;
+144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;;
+144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;;
+1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;;
+1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;;
+1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;;
+1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;;
+1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;;
+1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;;
+1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;;
+1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;;
+1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;;
+1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;;
+145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;;
+145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;;
+145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;;
+145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;;
+145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;;
+145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;;
+1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;;
+1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;;
+1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;;
+1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;;
+1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;;
+1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;;
+1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;;
+1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;;
+1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;;
+1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;;
+146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;;
+146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;;
+146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;;
+146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;;
+146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;;
+146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;;
+1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;;
+1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;;
+1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;;
+1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;;
+1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;;
+1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;;
+1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;;
+1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;;
+1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;;
+1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;;
+147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;;
+147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;;
+147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;;
+147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;;
+147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;;
+147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;;
+1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;;
+1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;;
+1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;;
+1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;;
+1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;;
+1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;;
+1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;;
+1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;;
+1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;;
+1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;;
+148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;;
+148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;;
+148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;;
+148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;;
+148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;;
+148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;;
+1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;;
+1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;;
+1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;;
+1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;;
+1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;;
+1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;;
+1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;;
+1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;;
+1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;;
+1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;;
+149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;;
+149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;;
+149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;;
+149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;;
+149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;;
+149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;;
+14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;;
+14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;;
+14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;;
+14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;;
+14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;;
+14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;;
+14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;;
+14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;;
+14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;;
+14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;;
+14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;;
+14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;;
+14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;;
+14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;;
+14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;;
+14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;;
+14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;;
+14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;;
+14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;;
+14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;;
+14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;;
+14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;;
+14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;;
+14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;;
+14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;;
+14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;;
+14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;;
+14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;;
+14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;;
+14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;;
+14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;;
+14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;;
+14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;;
+14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;;
+14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;;
+14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;;
+14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;;
+14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;;
+14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;;
+14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;;
+14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;;
+14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;;
+14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;;
+14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;;
+14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;;
+14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;;
+14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;;
+14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;;
+14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;;
+14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;;
+14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;;
+14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;;
+14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;;
+14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;;
+14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;;
+14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;;
+14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;;
+14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;;
+14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;;
+14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;;
+14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;;
+14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;;
+14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;;
+14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;;
+14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;;
+14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;;
+14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;;
+14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;;
+14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;;
+14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;;
+14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;;
+14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;;
+14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;;
+14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;;
+14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;;
+14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;;
+14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;;
+14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;;
+14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;;
+14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;;
+14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;;
+14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;;
+14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;;
+14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;;
+14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;;
+14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;;
+14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;;
+14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;;
+14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;;
+14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;;
+14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;;
+14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;;
+14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;;
+14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;;
+14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;;
+14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;;
+1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;;
+1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;;
+1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;;
+1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;;
+1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;;
+1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;;
+1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;;
+1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;;
+1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;;
+1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;;
+150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;;
+150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;;
+150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;;
+150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;;
+150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;;
+150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;;
+1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;;
+1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;;
+1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;;
+1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;;
+1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;;
+1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;;
+1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;;
+1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;;
+1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;;
+1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;;
+151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;;
+151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;;
+151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;;
+151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;;
+151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;;
+151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;;
+1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;;
+1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;;
+1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;;
+1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;;
+1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;;
+1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;;
+1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;;
+1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;;
+1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;;
+1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;;
+152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;;
+152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;;
+152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;;
+152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;;
+152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;;
+152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;;
+1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;;
+1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;;
+1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;;
+1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;;
+1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;;
+1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;;
+1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;;
+1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;;
+1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;;
+1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;;
+153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;;
+153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;;
+153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;;
+153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;;
+153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;;
+153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;;
+1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;;
+1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;;
+1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;;
+1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;;
+1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;;
+1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;;
+1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;;
+1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;;
+1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;;
+1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;;
+154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;;
+154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;;
+154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;;
+154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;;
+154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;;
+154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;;
+1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;;
+1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;;
+1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;;
+1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;;
+1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;;
+1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;;
+1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;;
+1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;;
+1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;;
+1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;;
+155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;;
+155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;;
+155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;;
+155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;;
+155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;;
+155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;;
+1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;;
+1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;;
+1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;;
+1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;;
+1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;;
+1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;;
+1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;;
+1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;;
+1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;;
+1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;;
+156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;;
+156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;;
+156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;;
+156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;;
+156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;;
+156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;;
+1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;;
+1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;;
+1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;;
+1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;;
+1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;;
+1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;;
+1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;;
+1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;;
+1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;;
+1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;;
+157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;;
+157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;;
+157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;;
+157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;;
+157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;;
+157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;;
+1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;;
+1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;;
+1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;;
+1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;;
+1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;;
+1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;;
+1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;;
+1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;;
+1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;;
+1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;;
+158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;;
+158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;;
+158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;;
+158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;;
+158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;;
+158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;;
+1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;;
+1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;;
+1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;;
+1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;;
+1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;;
+1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;;
+1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;;
+1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;;
+1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;;
+1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;;
+159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;;
+159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;;
+159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;;
+159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;;
+159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;;
+159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;;
+15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;;
+15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;;
+15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;;
+15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;;
+15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;;
+15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;;
+15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;;
+15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;;
+15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;;
+15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;;
+15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;;
+15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;;
+15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;;
+15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;;
+15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;;
+15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;;
+15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;;
+15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;;
+15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;;
+15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;;
+15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;;
+15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;;
+15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;;
+15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;;
+15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;;
+15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;;
+15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;;
+15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;;
+15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;;
+15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;;
+15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;;
+15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;;
+15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;;
+15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;;
+15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;;
+15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;;
+15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;;
+15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;;
+15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;;
+15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;;
+15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;;
+15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;;
+15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;;
+15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;;
+15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;;
+15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;;
+15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;;
+15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;;
+15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;;
+15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;;
+15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;;
+15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;;
+15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;;
+15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;;
+15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;;
+15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;;
+15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;;
+15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;;
+15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;;
+15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;;
+15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;;
+15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;;
+15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;;
+15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;;
+15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;;
+15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;;
+15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;;
+15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;;
+15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;;
+15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;;
+15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;;
+15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;;
+15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;;
+15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;;
+15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;;
+15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;;
+15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;;
+15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;;
+15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;;
+15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;;
+15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;;
+15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;;
+15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;;
+15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;;
+15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;;
+15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;;
+15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;;
+15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;;
+15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;;
+15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;;
+15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;;
+15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;;
+15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;;
+15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;;
+15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;;
+15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;;
+1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;;
+1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;;
+1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;;
+1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;;
+1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;;
+1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;;
+1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;;
+1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;;
+1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;;
+1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;;
+160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;;
+160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;;
+160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;;
+160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;;
+160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;;
+160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;;
+1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;;
+1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;;
+1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;;
+1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;;
+1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;;
+1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;;
+1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;;
+1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;;
+1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;;
+1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;;
+161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;;
+161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;;
+161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;;
+161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;;
+161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;;
+161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;;
+1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;;
+1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;;
+1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;;
+1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;;
+1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;;
+1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;;
+1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;;
+1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;;
+1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;;
+1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;;
+162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;;
+162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;;
+162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;;
+162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;;
+162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;;
+162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;;
+1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;;
+1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;;
+1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;;
+1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;;
+1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;;
+1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;;
+1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;;
+1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;;
+1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;;
+1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;;
+163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;;
+163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;;
+163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;;
+163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;;
+163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;;
+163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;;
+1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;;
+1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;;
+1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;;
+1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;;
+1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;;
+1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;;
+1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;;
+1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;;
+1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;;
+1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;;
+164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;;
+164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;;
+164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;;
+164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;;
+164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;;
+164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;;
+1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;;
+1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;;
+1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;;
+1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;;
+1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;;
+1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;;
+1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;;
+1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;;
+1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;;
+1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;;
+165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;;
+165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;;
+165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;;
+165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;;
+165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;;
+165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;;
+1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;;
+1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;;
+1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;;
+1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;;
+1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;;
+1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;;
+1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;;
+1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;;
+1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;;
+1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;;
+166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;;
+166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;;
+166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;;
+166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;;
+166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;;
+166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;;
+1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;;
+1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;;
+1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;;
+1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;;
+1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;;
+1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;;
+1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;;
+1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;
+1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;;
+1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;;
+1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;;
+1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;;
+1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;;
+1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;;
+1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;;
+1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;;
+1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;;
+168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;;
+168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;;
+168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;;
+168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;;
+168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;;
+168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;;
+1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;;
+1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;;
+1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;;
+1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;;
+1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;;
+1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;;
+1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;;
+1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;;
+1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;;
+1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;;
+169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;;
+169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;;
+16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;;
+16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;;
+16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;;
+16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;;
+16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;;
+16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;;
+16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;;
+16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;;
+16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;;
+16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;;
+16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;;
+16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;;
+16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;;
+16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;;
+16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;;
+16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;;
+16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;;
+16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;;
+16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;;
+16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;;
+16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;;
+16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;;
+16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;;
+16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;;
+16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;;
+16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;;
+16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;;
+16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;;
+16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;;
+16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;;
+16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;;
+16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;;
+16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;;
+16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;;
+16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;;
+16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;;
+16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;;
+16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;;
+16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;;
+16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;;
+16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;;
+16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;;
+16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;;
+16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;;
+16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;;
+16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;;
+16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;;
+16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;;
+16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;;
+16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;;
+16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;;
+16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;;
+16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;;
+16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;;
+16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;;
+16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;;
+16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;;
+16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;;
+16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;;
+16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;;
+16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;;
+16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;;
+16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;;
+16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;;
+16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;;
+16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;;
+16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;;
+16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;;
+16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;;
+16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;;
+16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;;
+16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;;
+16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;;
+16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;;
+16EE;RUNIC ARLAUG SYMBOL;No;0;L;;;;17;N;;golden number 17;;;
+16EF;RUNIC TVIMADUR SYMBOL;No;0;L;;;;18;N;;golden number 18;;;
+16F0;RUNIC BELGTHOR SYMBOL;No;0;L;;;;19;N;;golden number 19;;;
+1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;;
+1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;;
+1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;;
+1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;;
+1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;;
+1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;;
+1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;;
+1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;;
+1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;;
+1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;;
+178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;;
+178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;;
+178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;;
+178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;;
+178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;;
+178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;;
+1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;;
+1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;;
+1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;;
+1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;;
+1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;;
+1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;;
+1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;;
+1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;;
+1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;;
+1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;;
+179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;;
+179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;;
+179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;;
+179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;;
+179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;;
+179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;;
+17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
+17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
+17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;;
+17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
+17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
+17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
+17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;;
+17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;;
+17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;;
+17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;;
+17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;;
+17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;;
+17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;;
+17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;;
+17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;;
+17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
+17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
+17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Mc;0;L;;;;;N;;;;;
+17B5;KHMER VOWEL INHERENT AA;Mc;0;L;;;;;N;;;;;
+17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
+17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;;
+17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;;
+17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;;
+17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;;
+17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;;
+17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;;
+17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;;
+17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;;
+17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;;
+17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;;
+17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;;
+17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;;
+17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;;
+17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;;
+17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;;
+17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;;
+17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;;
+17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
+17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
+17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;;
+17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
+17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
+17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
+17D7;KHMER SIGN LEK TOO;Po;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;;
+17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
+17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
+17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
+17DC;KHMER SIGN AVAKRAHASANYA;Po;0;L;;;;;N;;;;;
+17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
+1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
+1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
+1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;;
+1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;;
+1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;;
+1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;;
+1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;;
+180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;;
+180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Cf;0;BN;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Cf;0;BN;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Cf;0;BN;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;;
+1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;;
+1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;;
+1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;;
+1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;;
+1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;;
+1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;;
+1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;;
+1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;;
+1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;;
+1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;;
+182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;;
+182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;;
+182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;;
+182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;;
+182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;;
+182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;;
+1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;;
+1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;;
+1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;;
+1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;;
+1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;;
+1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;;
+1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;;
+1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;;
+1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;;
+1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;;
+183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;;
+183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;;
+183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;;
+183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;;
+183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;;
+183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;;
+1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;;
+1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;;
+1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;;
+1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;;
+1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;;
+1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;;
+1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;;
+1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;;
+1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;;
+1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;;
+184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;;
+184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;;
+184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;;
+184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;;
+184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;;
+184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;;
+1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;;
+1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;;
+1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;;
+1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;;
+1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;;
+1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;;
+1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;;
+1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;;
+1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;;
+1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;;
+185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;;
+185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;;
+185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;;
+185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;;
+185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;;
+185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;;
+1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;;
+1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;;
+1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;;
+1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;;
+1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;;
+1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;;
+1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;;
+1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;;
+1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;;
+1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;;
+186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;;
+186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;;
+186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;;
+186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;;
+186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;;
+186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;;
+1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;;
+1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;;
+1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;;
+1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;;
+1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;;
+1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;;
+1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;;
+1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;;
+1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;;
+1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;;
+1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;;
+1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;;
+1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;;
+1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;;
+1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;;
+1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;;
+1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;;
+1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;;
+188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;;
+188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;;
+188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;;
+188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;;
+1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;;
+1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;;
+1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;;
+1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;;
+1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;;
+1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;;
+189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;;
+189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;;
+189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;;
+189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;;
+189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;;
+18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;;
+18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;;
+18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;;
+18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;;
+18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;;
+18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;;
+18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;;
+18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
+18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
+18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
+1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
+1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
+1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02
+1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05;
+1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04
+1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07;
+1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06
+1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09;
+1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08
+1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B;
+1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A
+1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D;
+1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C
+1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F;
+1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E
+1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11;
+1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10
+1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13;
+1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12
+1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15;
+1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14
+1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17;
+1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16
+1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19;
+1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18
+1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B;
+1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A
+1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D;
+1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C
+1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F;
+1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E
+1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21;
+1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20
+1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23;
+1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22
+1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25;
+1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24
+1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27;
+1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26
+1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29;
+1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28
+1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B;
+1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A
+1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D;
+1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C
+1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F;
+1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E
+1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31;
+1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30
+1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33;
+1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32
+1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35;
+1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34
+1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37;
+1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36
+1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39;
+1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38
+1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B;
+1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A
+1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D;
+1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C
+1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F;
+1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E
+1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41;
+1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40
+1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43;
+1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42
+1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45;
+1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44
+1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47;
+1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46
+1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49;
+1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48
+1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B;
+1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A
+1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D;
+1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C
+1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F;
+1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E
+1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51;
+1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50
+1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53;
+1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52
+1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55;
+1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54
+1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57;
+1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56
+1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59;
+1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58
+1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B;
+1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A
+1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D;
+1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C
+1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F;
+1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E
+1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61;
+1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60
+1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63;
+1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62
+1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65;
+1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64
+1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67;
+1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66
+1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69;
+1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68
+1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B;
+1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A
+1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D;
+1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C
+1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F;
+1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E
+1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71;
+1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70
+1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73;
+1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72
+1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75;
+1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74
+1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77;
+1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76
+1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79;
+1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78
+1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B;
+1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A
+1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D;
+1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C
+1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F;
+1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E
+1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81;
+1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80
+1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83;
+1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82
+1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85;
+1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84
+1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87;
+1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86
+1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89;
+1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88
+1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B;
+1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A
+1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D;
+1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C
+1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F;
+1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E
+1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91;
+1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90
+1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93;
+1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92
+1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95;
+1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94
+1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;;
+1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;;
+1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;;
+1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;;
+1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;;
+1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60
+1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1;
+1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0
+1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3;
+1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2
+1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5;
+1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4
+1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7;
+1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6
+1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9;
+1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8
+1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB;
+1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA
+1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD;
+1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC
+1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF;
+1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE
+1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1;
+1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0
+1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3;
+1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2
+1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5;
+1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4
+1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7;
+1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6
+1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9;
+1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8
+1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB;
+1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA
+1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD;
+1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC
+1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF;
+1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE
+1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1;
+1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0
+1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3;
+1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2
+1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5;
+1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4
+1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7;
+1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6
+1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9;
+1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8
+1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB;
+1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA
+1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD;
+1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC
+1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF;
+1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE
+1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1;
+1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0
+1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3;
+1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2
+1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5;
+1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4
+1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7;
+1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6
+1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9;
+1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8
+1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB;
+1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA
+1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD;
+1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC
+1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF;
+1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE
+1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1;
+1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0
+1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3;
+1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2
+1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5;
+1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4
+1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7;
+1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6
+1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9;
+1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8
+1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB;
+1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA
+1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED;
+1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC
+1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF;
+1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE
+1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1;
+1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0
+1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3;
+1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2
+1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5;
+1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4
+1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7;
+1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6
+1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9;
+1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8
+1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08
+1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09
+1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A
+1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B
+1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C
+1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D
+1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E
+1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F
+1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00;
+1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01;
+1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02;
+1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03;
+1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04;
+1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05;
+1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06;
+1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07;
+1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18
+1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19
+1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A
+1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B
+1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C
+1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D
+1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10;
+1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11;
+1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12;
+1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13;
+1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14;
+1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15;
+1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28
+1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29
+1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A
+1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B
+1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C
+1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D
+1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E
+1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F
+1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20;
+1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21;
+1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22;
+1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23;
+1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24;
+1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25;
+1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26;
+1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27;
+1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38
+1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39
+1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A
+1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B
+1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C
+1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D
+1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E
+1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F
+1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30;
+1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31;
+1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32;
+1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33;
+1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34;
+1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35;
+1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36;
+1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37;
+1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48
+1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49
+1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A
+1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B
+1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C
+1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D
+1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40;
+1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41;
+1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42;
+1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43;
+1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44;
+1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45;
+1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;;
+1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59
+1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;;
+1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B
+1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;;
+1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D
+1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;;
+1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F
+1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51;
+1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53;
+1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55;
+1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57;
+1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68
+1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69
+1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A
+1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B
+1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C
+1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D
+1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E
+1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F
+1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60;
+1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61;
+1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62;
+1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63;
+1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64;
+1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65;
+1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66;
+1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67;
+1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA
+1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB
+1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8
+1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9
+1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA
+1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB
+1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA
+1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB
+1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8
+1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9
+1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA
+1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB
+1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA
+1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB
+1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88
+1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89
+1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A
+1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B
+1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C
+1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D
+1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E
+1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F
+1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80;
+1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81;
+1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82;
+1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83;
+1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84;
+1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85;
+1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86;
+1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87;
+1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98
+1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99
+1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A
+1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B
+1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C
+1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D
+1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E
+1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F
+1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90;
+1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91;
+1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92;
+1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93;
+1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94;
+1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95;
+1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96;
+1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97;
+1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8
+1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9
+1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA
+1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB
+1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC
+1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD
+1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE
+1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF
+1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0;
+1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1;
+1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2;
+1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3;
+1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4;
+1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5;
+1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6;
+1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7;
+1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8
+1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9
+1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;;
+1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC
+1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;;
+1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;;
+1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;;
+1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0;
+1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1;
+1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70;
+1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71;
+1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3;
+1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399
+1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;;
+1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;;
+1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;;
+1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;;
+1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC
+1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;;
+1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;;
+1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;;
+1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72;
+1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73;
+1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74;
+1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75;
+1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3;
+1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;;
+1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;;
+1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;;
+1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8
+1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9
+1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;;
+1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;;
+1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;;
+1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;;
+1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0;
+1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1;
+1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76;
+1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77;
+1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;;
+1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;;
+1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;;
+1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8
+1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9
+1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;;
+1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;;
+1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;;
+1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC
+1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;;
+1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;;
+1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0;
+1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1;
+1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A;
+1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B;
+1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5;
+1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;;
+1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;;
+1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;;
+1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;;
+1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC
+1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;;
+1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;;
+1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;;
+1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78;
+1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79;
+1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C;
+1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D;
+1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3;
+1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;;
+1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;;
+2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;
+2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;
+2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;;
+200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;;
+200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;;
+200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;;
+200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;;
+2010;HYPHEN;Pd;0;ON;;;;;N;;;;;
+2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;;
+2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;;
+2013;EN DASH;Pd;0;ON;;;;;N;;;;;
+2014;EM DASH;Pd;0;ON;;;;;N;;;;;
+2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;;
+2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;;
+2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;;
+2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;;
+2020;DAGGER;Po;0;ON;;;;;N;;;;;
+2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;;
+2022;BULLET;Po;0;ON;;;;;N;;;;;
+2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;;
+2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;;
+2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;;
+2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;;
+2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;;
+2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;;
+2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;;
+202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;;
+202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;;
+202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;;
+202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;;
+202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;;
+202F;NARROW NO-BREAK SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;
+2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
+2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
+2032;PRIME;Po;0;ET;;;;;N;;;;;
+2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;;
+2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;;
+2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;;
+2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;;
+2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;;
+2038;CARET;Po;0;ON;;;;;N;;;;;
+2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;;
+203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;;
+203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;;
+203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;;
+203D;INTERROBANG;Po;0;ON;;;;;N;;;;;
+203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;;
+203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;;
+2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;;
+2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;;
+2042;ASTERISM;Po;0;ON;;;;;N;;;;;
+2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;;
+2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;;
+2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;;
+204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;;
+204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;;
+204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;;
+206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;;
+206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
+206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;0;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;4;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;5;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;6;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;7;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;8;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;9;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ET;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
+207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
+207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
+207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
+207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;0;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;1;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;2;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;3;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;4;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;5;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;6;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;7;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;8;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;9;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ET;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ET;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
+208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
+208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;;
+208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;;
+20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
+20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;;
+20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;;
+20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;;
+20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;;
+20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;;
+20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;;
+20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;;
+20A9;WON SIGN;Sc;0;ET;;;;;N;;;;;
+20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;;
+20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;;
+20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;;
+20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;;
+20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;;
+20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;;
+20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
+20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
+20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
+20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;;
+20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;;
+20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;;
+20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;;
+20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;;
+20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;;
+20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;;
+20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;;
+20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;;
+20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;;
+20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
+20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
+20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
+20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
+20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;;
+20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
+20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
+2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;;
+2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;;
+2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;;
+2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;;
+2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;;
+2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;;
+2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;;
+2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;;
+2108;SCRUPLE;So;0;ON;;;;;N;;;;;
+2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;;
+210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;;
+210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;;
+210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;;
+210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;;
+210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;;
+2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;;
+2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;;
+2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;;
+2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;;
+2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;;
+2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;;
+2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;;
+2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;;
+2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;;
+211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;;
+211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;;
+211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;;
+211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;;
+211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;;
+211F;RESPONSE;So;0;ON;;;;;N;;;;;
+2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;;
+2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;;
+2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;;
+2123;VERSICLE;So;0;ON;;;;;N;;;;;
+2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;;
+2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;;
+2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9;
+2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;;
+2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;;
+2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;;
+212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
+212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5;
+212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;;
+212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;;
+212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;;
+212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;;
+2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;;
+2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;;
+2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;;
+2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;;
+2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;;
+2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;;
+2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
+2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
+213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;;
+2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;;
+2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;;
+2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;;
+2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;;
+2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;;
+2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;;
+215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;;
+215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;;
+215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;;
+215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;;
+215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;;
+215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;;
+2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170;
+2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171;
+2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172;
+2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173;
+2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174;
+2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175;
+2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176;
+2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177;
+2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178;
+2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179;
+216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A;
+216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B;
+216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C;
+216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D;
+216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E;
+216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F;
+2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160
+2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161
+2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162
+2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163
+2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164
+2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165
+2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166
+2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167
+2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168
+2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169
+217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A
+217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B
+217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C
+217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D
+217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E
+217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F
+2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;;
+2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;;
+2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;;
+2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;;
+2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;;
+2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;;
+2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;;
+2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;;
+2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;;
+2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;;
+2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;;
+2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;;
+2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;;
+219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;;
+219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;;
+219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;;
+219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;;
+219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;;
+219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;;
+21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;;
+21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;;
+21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;;
+21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;;
+21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;;
+21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;;
+21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;;
+21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;;
+21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;;
+21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;;
+21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;;
+21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;;
+21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;;
+21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;;
+21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;;
+21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;;
+21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;;
+21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;;
+21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;;
+21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;;
+21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;;
+21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;;
+21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;;
+21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;;
+21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;;
+21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;;
+21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;;
+21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;;
+21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;;
+21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;;
+21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;;
+21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;;
+21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;;
+21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;;
+21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;;
+21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;;
+21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;;
+21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;;
+21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;;
+21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;;
+21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;;
+21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;;
+21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;;
+21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;;
+21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;;
+21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;;
+21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;;
+21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;;
+21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;;
+21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;;
+21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;;
+21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;;
+21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;;
+21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;;
+21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;;
+21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;;
+21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;;
+21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;;
+21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;;
+21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;;
+21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;;
+21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;;
+21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;;
+21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;;
+21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;;
+21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;;
+21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;;
+21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;;
+21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;;
+21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;;
+21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;;
+21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;;
+21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;;
+21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;;
+21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;;
+21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;;
+21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;;
+2200;FOR ALL;Sm;0;ON;;;;;N;;;;;
+2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;;
+2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;;
+2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;;
+2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;;
+2205;EMPTY SET;Sm;0;ON;;;;;N;;;;;
+2206;INCREMENT;Sm;0;ON;;;;;N;;;;;
+2207;NABLA;Sm;0;ON;;;;;N;;;;;
+2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;;
+220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;;
+220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;;
+220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;;
+220E;END OF PROOF;Sm;0;ON;;;;;N;;;;;
+220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;;
+2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;;
+2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;;
+2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;;
+2214;DOT PLUS;Sm;0;ON;;;;;N;;;;;
+2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2216;SET MINUS;Sm;0;ON;;;;;Y;;;;;
+2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;;
+221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;;
+221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;;
+221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;;
+221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;;
+221E;INFINITY;Sm;0;ON;;;;;N;;;;;
+221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;;
+2220;ANGLE;Sm;0;ON;;;;;Y;;;;;
+2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;;
+2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+2223;DIVIDES;Sm;0;ON;;;;;N;;;;;
+2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;;
+2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;;
+2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2229;INTERSECTION;Sm;0;ON;;;;;N;;;;;
+222A;UNION;Sm;0;ON;;;;;N;;;;;
+222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;;
+222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;;
+222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;;
+2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;;
+2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2234;THEREFORE;Sm;0;ON;;;;;N;;;;;
+2235;BECAUSE;Sm;0;ON;;;;;N;;;;;
+2236;RATIO;Sm;0;ON;;;;;N;;;;;
+2237;PROPORTION;Sm;0;ON;;;;;N;;;;;
+2238;DOT MINUS;Sm;0;ON;;;;;N;;;;;
+2239;EXCESS;Sm;0;ON;;;;;Y;;;;;
+223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;;
+223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;;
+223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;;
+223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;;
+223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;;
+2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;;
+2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;;
+2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;;
+2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;;
+2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;;
+224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;;
+224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;;
+2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;;
+2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;;
+2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;;
+2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;;
+2259;ESTIMATES;Sm;0;ON;;;;;N;;;;;
+225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;;
+225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;;
+225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;;
+225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;;
+225E;MEASURED BY;Sm;0;ON;;;;;N;;;;;
+225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;;
+2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;;
+2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;;
+2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;;
+2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;;
+2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;;
+2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;;
+2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;;
+2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;;
+2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;;
+226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;;
+226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;;
+226C;BETWEEN;Sm;0;ON;;;;;N;;;;;
+226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;;
+226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;;
+226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;;
+2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;;
+2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;;
+2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;;
+2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;;
+2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;;
+2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;;
+2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;;
+2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;;
+2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;;
+2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;;
+227A;PRECEDES;Sm;0;ON;;;;;Y;;;;;
+227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;;
+2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;;
+2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;;
+2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;;
+2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;;
+2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;;
+2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;;
+2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;;
+228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;;
+228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;;
+228C;MULTISET;Sm;0;ON;;;;;Y;;;;;
+228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;;
+228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;;
+228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;;
+2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;;
+2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;;
+2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;;
+2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;;
+2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;;
+229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;;
+229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;;
+229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;;
+229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;;
+229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;;
+22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;;
+22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;;
+22A5;UP TACK;Sm;0;ON;;;;;N;;;;;
+22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;;
+22A7;MODELS;Sm;0;ON;;;;;Y;;;;;
+22A8;TRUE;Sm;0;ON;;;;;Y;;;;;
+22A9;FORCES;Sm;0;ON;;;;;Y;;;;;
+22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;;
+22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;;
+22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;;
+22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;;
+22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;;
+22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;;
+22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;;
+22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;;
+22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;;
+22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;;
+22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;;
+22BB;XOR;Sm;0;ON;;;;;N;;;;;
+22BC;NAND;Sm;0;ON;;;;;N;;;;;
+22BD;NOR;Sm;0;ON;;;;;N;;;;;
+22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;;
+22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;;
+22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;;
+22C8;BOWTIE;Sm;0;ON;;;;;N;;;;;
+22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;;
+22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;;
+22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;;
+22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;;
+22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;;
+22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;;
+22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;;
+22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;;
+22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;;
+22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;;
+22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;;
+22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;;
+22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;;
+22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;;
+22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;;
+22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;;
+22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;;
+22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;;
+22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;;
+22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;;
+22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;;
+22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;;
+22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;;
+22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;;
+22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;;
+22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;;
+22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;;
+22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;;
+2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;;
+2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;;
+2302;HOUSE;So;0;ON;;;;;N;;;;;
+2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;;
+2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;;
+2305;PROJECTIVE;So;0;ON;;;;;N;;;;;
+2306;PERSPECTIVE;So;0;ON;;;;;N;;;;;
+2307;WAVY LINE;So;0;ON;;;;;N;;;;;
+2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;;
+2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;;
+230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;;
+230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;;
+230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;;
+230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;;
+230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;;
+2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;;
+2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;;
+2312;ARC;So;0;ON;;;;;N;;;;;
+2313;SEGMENT;So;0;ON;;;;;N;;;;;
+2314;SECTOR;So;0;ON;;;;;N;;;;;
+2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;;
+2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;;
+2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;;
+2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;;
+2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;;
+231A;WATCH;So;0;ON;;;;;N;;;;;
+231B;HOURGLASS;So;0;ON;;;;;N;;;;;
+231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;;
+231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;;
+231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;;
+231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;;
+2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2322;FROWN;So;0;ON;;;;;N;;;;;
+2323;SMILE;So;0;ON;;;;;N;;;;;
+2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;;
+2325;OPTION KEY;So;0;ON;;;;;N;;;;;
+2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;;
+2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;;
+2328;KEYBOARD;So;0;ON;;;;;N;;;;;
+2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;;
+232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;;
+232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;;
+232C;BENZENE RING;So;0;ON;;;;;N;;;;;
+232D;CYLINDRICITY;So;0;ON;;;;;N;;;;;
+232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;;
+232F;SYMMETRY;So;0;ON;;;;;N;;;;;
+2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;;
+2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;;
+2332;CONICAL TAPER;So;0;ON;;;;;N;;;;;
+2333;SLOPE;So;0;ON;;;;;N;;;;;
+2334;COUNTERBORE;So;0;ON;;;;;N;;;;;
+2335;COUNTERSINK;So;0;ON;;;;;N;;;;;
+2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;;
+2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;;
+2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;;
+2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;;
+233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;;
+233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;;
+233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;;
+233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;;
+233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;;
+233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;;
+2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;;
+2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;;
+2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;;
+2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;;
+2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;;
+2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;;
+2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;;
+2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;;
+2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;;
+2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;;
+234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;;
+234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;;
+234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;;
+234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;;
+234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;;
+234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;;
+2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;;
+2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;;
+2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;;
+2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;;
+2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;;
+2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;;
+2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;;
+2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;;
+2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;;
+2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;;
+235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;;
+235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;;
+235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;;
+235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;;
+235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;;
+235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;;
+2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;;
+2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;;
+2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;;
+2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;;
+2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;;
+2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;;
+2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;;
+2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;;
+2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;;
+2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;;
+236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;;
+236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;;
+236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;;
+236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;;
+236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;;
+236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;;
+2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;;
+2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;;
+2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;;
+2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;;
+2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;;
+2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;;
+2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;;
+2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;;
+2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;;
+2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;;
+237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;;
+237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;;
+237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;;
+237E;BELL SYMBOL;So;0;ON;;;;;N;;;;;
+237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;;
+2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;;
+2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;;
+2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;;
+2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;;
+2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;;
+2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;;
+2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2388;HELM SYMBOL;So;0;ON;;;;;N;;;;;
+2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;;
+238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;;
+238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;;
+238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;;
+238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;;
+238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;;
+238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;;
+2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;;
+2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;;
+2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;;
+2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;;
+2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;;
+2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;;
+2398;NEXT PAGE;So;0;ON;;;;;N;;;;;
+2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;;
+2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
+2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
+2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
+2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;;
+2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;;
+2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;;
+2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;;
+2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;;
+2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;;
+2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;;
+240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;;
+240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;;
+240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;;
+240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;;
+240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;;
+240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;;
+2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;;
+2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;;
+2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;;
+2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;;
+2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;;
+2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;;
+2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;;
+2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;;
+2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;;
+2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;;
+241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;;
+241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;;
+241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;;
+241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;;
+241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;;
+241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;;
+2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;;
+2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;;
+2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;;
+2423;OPEN BOX;So;0;ON;;;;;N;;;;;
+2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;;
+2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;;
+2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;;
+2440;OCR HOOK;So;0;ON;;;;;N;;;;;
+2441;OCR CHAIR;So;0;ON;;;;;N;;;;;
+2442;OCR FORK;So;0;ON;;;;;N;;;;;
+2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;;
+2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;;
+2445;OCR BOW TIE;So;0;ON;;;;;N;;;;;
+2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;;
+2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;;
+2448;OCR DASH;So;0;ON;;;;;N;;;;;
+2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;;
+244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;;
+2460;CIRCLED DIGIT ONE;No;0;EN;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;EN;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;EN;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;EN;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;EN;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;EN;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;EN;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;EN;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;EN;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;EN;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;EN;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;EN;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;EN;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;EN;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;EN;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;EN;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;EN;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;EN;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;EN;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;EN;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;EN;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;EN;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;EN;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;EN;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;EN;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;EN;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;EN;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;EN;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;EN;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;EN;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;EN;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;EN;<compat> 0028 0032 0030 0029;;;20;N;;;;;
+2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;;
+2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;;
+248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;;
+248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;;
+248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;;
+248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;;
+248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;;
+248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;;
+2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;;
+2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;;
+2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;;
+2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;;
+2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;;
+2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;;
+2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;;
+2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;;
+2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;;
+2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;;
+249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;;
+249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;;
+249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;;
+249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;;
+249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;;
+249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;;
+24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;;
+24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;;
+24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;;
+24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;;
+24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;;
+24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;;
+24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;;
+24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;;
+24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;;
+24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;;
+24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;;
+24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;;
+24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;;
+24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;;
+24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;;
+24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;;
+24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;;
+24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;;
+24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;;
+24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;;
+24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;;
+24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;;
+24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0;
+24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1;
+24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2;
+24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3;
+24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4;
+24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5;
+24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6;
+24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7;
+24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8;
+24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9;
+24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA;
+24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB;
+24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC;
+24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD;
+24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE;
+24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF;
+24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0;
+24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1;
+24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2;
+24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3;
+24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4;
+24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5;
+24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6;
+24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7;
+24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8;
+24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9;
+24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6
+24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7
+24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8
+24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9
+24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA
+24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB
+24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC
+24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD
+24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE
+24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF
+24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0
+24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1
+24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2
+24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3
+24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4
+24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5
+24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6
+24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7
+24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8
+24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9
+24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA
+24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB
+24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC
+24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD
+24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE
+24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF
+24EA;CIRCLED DIGIT ZERO;No;0;EN;<circle> 0030;;0;0;N;;;;;
+2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
+2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
+2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
+2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;;
+2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;;
+2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;;
+2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;;
+2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;;
+2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;;
+2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;;
+250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;;
+250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;;
+250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;;
+250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;;
+250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;;
+250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;;
+2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;;
+2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;;
+2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;;
+2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;;
+2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;;
+2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;;
+2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;;
+2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;;
+2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;;
+2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;;
+251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;;
+251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;;
+251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;;
+251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;;
+251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;;
+251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;;
+2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;;
+2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;;
+2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;;
+2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;;
+2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;;
+2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;;
+2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;;
+2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;;
+2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;;
+252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;;
+252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;;
+252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;;
+252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;;
+252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;;
+252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;;
+2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;;
+2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;;
+2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;;
+2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;;
+2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;;
+2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;;
+2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;;
+2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;;
+2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;;
+2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;;
+253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;;
+253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;;
+253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;;
+253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;;
+253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;;
+253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;;
+2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;;
+2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;;
+2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;;
+2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;;
+2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;;
+2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;;
+2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;;
+2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;;
+2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;;
+2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;;
+254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;;
+254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;;
+254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;;
+254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;;
+254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;;
+254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;;
+2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;;
+2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;;
+2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;;
+2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;;
+2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;;
+2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;;
+2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;;
+2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;;
+2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;;
+2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;;
+255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;;
+255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;;
+255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;;
+255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;;
+255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;;
+255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;;
+2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;;
+2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;;
+2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;;
+2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;;
+2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;;
+2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;;
+2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;;
+2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;;
+2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;;
+2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;;
+256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;;
+256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;;
+256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;;
+256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;;
+256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;;
+256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;;
+2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;;
+2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;;
+2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;;
+2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;;
+2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;;
+2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;;
+2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;;
+2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;;
+2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;;
+2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;;
+257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;;
+257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;;
+257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;;
+257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;;
+257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;;
+257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;;
+2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;;
+2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+2588;FULL BLOCK;So;0;ON;;;;;N;;;;;
+2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;;
+258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;;
+258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+2591;LIGHT SHADE;So;0;ON;;;;;N;;;;;
+2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+2593;DARK SHADE;So;0;ON;;;;;N;;;;;
+2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;;
+25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;;
+25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;;
+25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;;
+25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;;
+25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;;
+25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;;
+25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;;
+25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;;
+25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;;
+25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;;
+25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;;
+25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;;
+25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;;
+25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;;
+25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;;
+25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;;
+25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;;
+25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;;
+25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;;
+25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;;
+25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;;
+25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;;
+25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;;
+25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;;
+25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;;
+25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;;
+25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;;
+25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;;
+25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;;
+25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;;
+25C9;FISHEYE;So;0;ON;;;;;N;;;;;
+25CA;LOZENGE;So;0;ON;;;;;N;;;;;
+25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;;
+25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;;
+25CE;BULLSEYE;So;0;ON;;;;;N;;;;;
+25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;;
+25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;;
+25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;;
+25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;;
+25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;;
+25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;;
+25E6;WHITE BULLET;So;0;ON;;;;;N;;;;;
+25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;;
+25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;;
+25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;;
+25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;;
+25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;;
+25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;;
+25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;;
+2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+2601;CLOUD;So;0;ON;;;;;N;;;;;
+2602;UMBRELLA;So;0;ON;;;;;N;;;;;
+2603;SNOWMAN;So;0;ON;;;;;N;;;;;
+2604;COMET;So;0;ON;;;;;N;;;;;
+2605;BLACK STAR;So;0;ON;;;;;N;;;;;
+2606;WHITE STAR;So;0;ON;;;;;N;;;;;
+2607;LIGHTNING;So;0;ON;;;;;N;;;;;
+2608;THUNDERSTORM;So;0;ON;;;;;N;;;;;
+2609;SUN;So;0;ON;;;;;N;;;;;
+260A;ASCENDING NODE;So;0;ON;;;;;N;;;;;
+260B;DESCENDING NODE;So;0;ON;;;;;N;;;;;
+260C;CONJUNCTION;So;0;ON;;;;;N;;;;;
+260D;OPPOSITION;So;0;ON;;;;;N;;;;;
+260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;;
+260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;;
+2610;BALLOT BOX;So;0;ON;;;;;N;;;;;
+2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
+2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
+2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;;
+261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;;
+2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;;
+2621;CAUTION SIGN;So;0;ON;;;;;N;;;;;
+2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;;
+2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;;
+2624;CADUCEUS;So;0;ON;;;;;N;;;;;
+2625;ANKH;So;0;ON;;;;;N;;;;;
+2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;;
+2627;CHI RHO;So;0;ON;;;;;N;;;;;
+2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;;
+2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;;
+262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;;
+262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;;
+262C;ADI SHAKTI;So;0;ON;;;;;N;;;;;
+262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;;
+262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;;
+262F;YIN YANG;So;0;ON;;;;;N;;;;;
+2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;;
+2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;;
+2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;;
+2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;;
+2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;;
+2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;;
+2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;;
+2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;;
+2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;;
+263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;;
+263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;;
+263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;;
+263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;;
+263F;MERCURY;So;0;ON;;;;;N;;;;;
+2640;FEMALE SIGN;So;0;ON;;;;;N;;;;;
+2641;EARTH;So;0;ON;;;;;N;;;;;
+2642;MALE SIGN;So;0;ON;;;;;N;;;;;
+2643;JUPITER;So;0;ON;;;;;N;;;;;
+2644;SATURN;So;0;ON;;;;;N;;;;;
+2645;URANUS;So;0;ON;;;;;N;;;;;
+2646;NEPTUNE;So;0;ON;;;;;N;;;;;
+2647;PLUTO;So;0;ON;;;;;N;;;;;
+2648;ARIES;So;0;ON;;;;;N;;;;;
+2649;TAURUS;So;0;ON;;;;;N;;;;;
+264A;GEMINI;So;0;ON;;;;;N;;;;;
+264B;CANCER;So;0;ON;;;;;N;;;;;
+264C;LEO;So;0;ON;;;;;N;;;;;
+264D;VIRGO;So;0;ON;;;;;N;;;;;
+264E;LIBRA;So;0;ON;;;;;N;;;;;
+264F;SCORPIUS;So;0;ON;;;;;N;;;;;
+2650;SAGITTARIUS;So;0;ON;;;;;N;;;;;
+2651;CAPRICORN;So;0;ON;;;;;N;;;;;
+2652;AQUARIUS;So;0;ON;;;;;N;;;;;
+2653;PISCES;So;0;ON;;;;;N;;;;;
+2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;;
+2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;;
+2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;;
+2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;;
+2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;;
+265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;;
+265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;;
+265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;;
+265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;;
+265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;;
+265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;;
+2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;;
+2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;;
+2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;;
+2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;;
+2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;;
+2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;;
+2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;;
+2668;HOT SPRINGS;So;0;ON;;;;;N;;;;;
+2669;QUARTER NOTE;So;0;ON;;;;;N;;;;;
+266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;;
+266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;;
+266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;;
+266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;;
+266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;;
+266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;;
+2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;;
+2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
+2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
+2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;;
+2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;;
+2707;TAPE DRIVE;So;0;ON;;;;;N;;;;;
+2708;AIRPLANE;So;0;ON;;;;;N;;;;;
+2709;ENVELOPE;So;0;ON;;;;;N;;;;;
+270C;VICTORY HAND;So;0;ON;;;;;N;;;;;
+270D;WRITING HAND;So;0;ON;;;;;N;;;;;
+270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+270F;PENCIL;So;0;ON;;;;;N;;;;;
+2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;;
+2711;WHITE NIB;So;0;ON;;;;;N;;;;;
+2712;BLACK NIB;So;0;ON;;;;;N;;;;;
+2713;CHECK MARK;So;0;ON;;;;;N;;;;;
+2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;;
+2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;;
+2717;BALLOT X;So;0;ON;;;;;N;;;;;
+2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;;
+2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;;
+271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;;
+271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;;
+271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;;
+271D;LATIN CROSS;So;0;ON;;;;;N;;;;;
+271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;;
+271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;;
+2720;MALTESE CROSS;So;0;ON;;;;;N;;;;;
+2721;STAR OF DAVID;So;0;ON;;;;;N;;;;;
+2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;;
+2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;;
+272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;;
+272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;;
+272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;;
+272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;;
+272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;;
+2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;;
+2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;;
+2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;;
+2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;;
+2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;;
+273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;;
+273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;;
+273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;;
+2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;;
+2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;;
+2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;;
+2744;SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;;
+2747;SPARKLE;So;0;ON;;;;;N;;;;;
+2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;;
+2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;;
+274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;;
+274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;;
+2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;;
+2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;;
+2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;;
+275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;;
+2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;;
+2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;;
+2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;;
+2766;FLORAL HEART;So;0;ON;;;;;N;;;;;
+2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
+2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;;
+2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;;
+2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;;
+2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;;
+277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;;
+277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;;
+277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;;
+277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;;
+277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;;
+277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;;
+2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;;
+2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;;
+2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;;
+2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;;
+2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;;
+2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;;
+2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;;
+2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;;
+278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;;
+278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;;
+278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;;
+278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;;
+278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;;
+278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;;
+2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;;
+2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;;
+2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;;
+2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;;
+2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;;
+2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;;
+2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;;
+279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;;
+279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;;
+279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;;
+279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;;
+279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;;
+279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;;
+27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;;
+27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;;
+27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;;
+27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;;
+27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;;
+27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;;
+27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;;
+27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;;
+27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;;
+27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;;
+27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;;
+27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;;
+27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;;
+27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;;
+27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;;
+27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;;
+27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;;
+27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;;
+27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;;
+27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;;
+27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;;
+27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;;
+27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;;
+2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;;
+2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
+2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
+2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
+2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;;
+2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;;
+2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;;
+2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;;
+2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;;
+2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;;
+2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;;
+2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;;
+2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;;
+2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;;
+2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;;
+2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;;
+2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;;
+2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;;
+2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;;
+2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;;
+2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;;
+2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;;
+2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;;
+2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;;
+2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;;
+2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;;
+2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;;
+2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;;
+2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;;
+2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;;
+2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;;
+2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;;
+2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;;
+2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;;
+2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;;
+2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;;
+2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;;
+2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;;
+2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;;
+2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;;
+2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;;
+2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;;
+2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;;
+2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;;
+2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;;
+2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;;
+2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;;
+2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;;
+2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;;
+2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;;
+2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;;
+2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;;
+2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;;
+2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;;
+2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;;
+2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;;
+2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;;
+2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;;
+2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;;
+2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;;
+2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;;
+2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;;
+2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;;
+2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;;
+2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;;
+2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;;
+2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;;
+2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;;
+2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;;
+2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;;
+2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;;
+2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;;
+2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;;
+2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;;
+2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;;
+2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;;
+2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;;
+2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;;
+2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;;
+2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;;
+2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;;
+2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;;
+2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;;
+2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;;
+2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;;
+2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;;
+2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;;
+2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;;
+2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;;
+2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;;
+2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;;
+2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;;
+2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;;
+2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;;
+2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;;
+2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;;
+2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;;
+2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;;
+2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;;
+2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;;
+2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;;
+2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;;
+2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;;
+2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;;
+2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;;
+2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;;
+2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;;
+2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;;
+2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;;
+2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;;
+2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;;
+2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;;
+2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;;
+2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;;
+2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;;
+2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;;
+2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;;
+2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;;
+2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;;
+2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;;
+2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;;
+2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;;
+2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;;
+2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;;
+2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;;
+2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;;
+2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;;
+2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;;
+2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;;
+2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;;
+2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;;
+2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;;
+2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;;
+2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;;
+2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;;
+2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;;
+2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;;
+2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;;
+2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;;
+2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;;
+2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;;
+2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;;
+2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;;
+2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;;
+2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;;
+2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;;
+2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;;
+2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;;
+2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;;
+2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;;
+2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;;
+2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;;
+2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;;
+2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;;
+2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
+2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;;
+2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;;
+2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;;
+2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;;
+2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;;
+2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;;
+2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;;
+2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;;
+2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;;
+2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;;
+2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;;
+2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;;
+2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;;
+2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;;
+2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;;
+2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;;
+2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;;
+2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;;
+2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;;
+2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;;
+2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;;
+2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;;
+2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;;
+2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;;
+2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;;
+2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;;
+2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;;
+2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;;
+2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;;
+2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;;
+2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;;
+2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;;
+2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;;
+2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;;
+2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;;
+2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;;
+2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;;
+2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;;
+2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;;
+2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;;
+2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;;
+2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;;
+2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;;
+2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;;
+2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;;
+2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;;
+2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;;
+2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;;
+2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;;
+2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;;
+2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;;
+2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;;
+2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;;
+2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;;
+2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;;
+2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;;
+2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;;
+2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;;
+2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;;
+2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;;
+2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;;
+2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;;
+2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;;
+2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;;
+2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;;
+2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;;
+2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;;
+2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;;
+2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;;
+2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;;
+2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;;
+2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;;
+2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;;
+2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;;
+2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;;
+2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;;
+2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;;
+2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;;
+2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;;
+2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;;
+2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;;
+2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;;
+2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;;
+2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;;
+2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;;
+2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;;
+2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;;
+2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;;
+2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;;
+2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;;
+2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;;
+2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;;
+2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;;
+2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;;
+2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;;
+2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;;
+2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;;
+2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;;
+2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;;
+2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;;
+2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;;
+2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;;
+2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;;
+2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;;
+2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;;
+2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;;
+2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;;
+2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;;
+2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;;
+2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;;
+2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;;
+2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;;
+2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;;
+2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;;
+2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;;
+2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;;
+2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;;
+2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;;
+2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;;
+2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;;
+2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;;
+2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;;
+2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;;
+2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;;
+2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;;
+2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;;
+2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;;
+2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;;
+2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;;
+2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;;
+2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;;
+2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;;
+2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;;
+2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;;
+2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;;
+2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;;
+2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;;
+2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;;
+2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;;
+2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;;
+2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;;
+2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
+2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;;
+2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;;
+2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;;
+2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;;
+2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;;
+2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;;
+2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;;
+2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;;
+2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;;
+2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;;
+2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;;
+2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;;
+2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;;
+2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;;
+2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;;
+2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;;
+2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;;
+2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;;
+2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;;
+2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;;
+2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;;
+2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;;
+2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;;
+2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;;
+2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;;
+2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;;
+2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;;
+2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;;
+2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;;
+2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;;
+2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;;
+2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;;
+2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;;
+2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;;
+2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;;
+2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;;
+2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;;
+2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;;
+2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;;
+2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;;
+2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;;
+2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;;
+3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;
+3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;;
+3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;;
+3003;DITTO MARK;Po;0;ON;;;;;N;;;;;
+3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;;
+3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;;
+3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;;
+3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;;
+3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;;
+300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;;
+300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;;
+300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;;
+300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;;
+300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;;
+300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;;
+3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;;
+3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;;
+3012;POSTAL MARK;So;0;ON;;;;;N;;;;;
+3013;GETA MARK;So;0;ON;;;;;N;;;;;
+3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;;
+3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;;
+3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;;
+3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;;
+3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;;
+3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;;
+301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;;
+301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;;
+301C;WAVE DASH;Pd;0;ON;;;;;N;;;;;
+301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;;
+3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;;
+3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;;
+3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;;
+3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
+3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;;
+3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;;
+3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;;
+3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;;
+3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;;
+3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;;
+302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;;
+302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;;
+302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;;
+302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;;
+302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;;
+3030;WAVY DASH;Pd;0;ON;;;;;N;;;;;
+3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;;
+3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;;
+3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;;
+3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;;
+3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;;
+3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;;
+3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;;
+3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;;
+303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;;
+303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;;
+303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;;
+3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;;
+3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;;
+3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;;
+3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;;
+3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;;
+304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;;
+304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;;
+304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;;
+304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;;
+304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;;
+3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;;
+3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;;
+3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;;
+3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;;
+3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;;
+3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;;
+3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;;
+3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;;
+3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;;
+3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;;
+305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;;
+305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;;
+305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;;
+305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;;
+305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;;
+305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;;
+3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;;
+3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;;
+3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;;
+3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;;
+3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;;
+3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;;
+3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;;
+3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;;
+3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;;
+306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;;
+306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;;
+306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;;
+306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;;
+306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;;
+306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;;
+3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;;
+3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;;
+3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;;
+3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;;
+3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;;
+3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;;
+3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;;
+3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;;
+3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;;
+3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;;
+307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;;
+307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;;
+307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;;
+307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;;
+307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;;
+307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;;
+3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;;
+3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;;
+3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;;
+3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;;
+3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;;
+3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;;
+3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;;
+308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;;
+308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;;
+308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;;
+308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;;
+308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;;
+3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;;
+3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;;
+3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;;
+3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;;
+3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;;
+3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
+309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
+309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;;
+309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;;
+309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;;
+30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;;
+30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;;
+30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;;
+30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;;
+30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;;
+30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;;
+30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;;
+30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;;
+30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;;
+30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;;
+30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;;
+30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;;
+30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;;
+30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;;
+30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;;
+30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;;
+30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;;
+30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;;
+30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;;
+30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;;
+30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;;
+30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;;
+30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;;
+30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;;
+30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;;
+30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;;
+30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;;
+30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;;
+30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;;
+30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;;
+30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;;
+30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;;
+30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;;
+30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;;
+30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;;
+30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;;
+30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;;
+30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;;
+30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;;
+30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;;
+30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;;
+30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;;
+30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;;
+30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;;
+30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;;
+30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;;
+30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;;
+30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;;
+30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;;
+30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;;
+30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;;
+30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;;
+30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;;
+30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;;
+30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;;
+30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;;
+30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;;
+30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;;
+30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;;
+30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;;
+30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;;
+30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;;
+30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;;
+30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;;
+30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;;
+30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;;
+30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;;
+30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;;
+30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;;
+30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;;
+30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;;
+30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;;
+30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;;
+30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;;
+30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;;
+30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;;
+30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;;
+30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;;
+30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;;
+30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;;
+30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;;
+30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;;
+30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;;
+30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;;
+30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;;
+30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;;
+30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;;
+30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;;
+30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;;
+30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;;
+30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;;
+30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;;
+3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;;
+3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;;
+3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;;
+3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;;
+3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;;
+310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;;
+310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;;
+310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;;
+310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;;
+310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;;
+310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;;
+3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;;
+3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;;
+3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;;
+3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;;
+3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;;
+3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;;
+3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;;
+3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;;
+3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;;
+3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;;
+311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;;
+311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;;
+311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;;
+311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;;
+311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;;
+311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;;
+3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;;
+3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;;
+3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;;
+3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;;
+3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;;
+3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;;
+3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;;
+3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;;
+3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;;
+3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;;
+312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;;
+312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;;
+312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;;
+3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;;
+3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;;
+3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
+3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;;
+3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;;
+3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;;
+3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;;
+3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;;
+3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;;
+313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;;
+313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;;
+313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;;
+313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;;
+313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;;
+313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;;
+3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;;
+3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;;
+3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;;
+3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;;
+3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;;
+3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;;
+3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;;
+3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;;
+3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;;
+3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;;
+314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;;
+314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;;
+314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;;
+314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;;
+314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;;
+314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;;
+3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;;
+3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;;
+3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;;
+3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;;
+3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;;
+3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;;
+3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;;
+3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;;
+3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;;
+3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;;
+315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;;
+315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;;
+315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;;
+315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;;
+315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;;
+315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;;
+3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;;
+3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;;
+3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;;
+3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;;
+3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;;
+3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;;
+3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;;
+3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;;
+3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;;
+3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;;
+316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;;
+316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;;
+316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;;
+316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;;
+316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;;
+316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;;
+3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;;
+3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;;
+3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;;
+3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;;
+3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;;
+3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;;
+3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;;
+3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;;
+3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;;
+3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;;
+317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;;
+317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;;
+317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;;
+317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;;
+317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;;
+317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;;
+3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;;
+3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;;
+3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;;
+3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;;
+3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;;
+3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;;
+3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;;
+3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;;
+3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;;
+3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;;
+318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;;
+318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;;
+318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;;
+318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;;
+318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
+3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;;
+3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;;N;KAERITEN SI;Kaeriten;;;
+3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;;
+3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;;
+3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;;
+3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;Kaeriten;;;
+319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;Kaeriten;;;
+319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;Kaeriten;;;
+319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;Kaeriten;;;
+319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;Kaeriten;;;
+319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;Kaeriten;;;
+319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;;
+31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;;
+31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;;
+31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;;
+31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;;
+31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;;
+31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;;
+31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;;
+31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;;
+31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;;
+31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;;
+31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;;
+31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;;
+31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;;
+31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;;
+31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;;
+31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;;
+31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;;
+31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;;
+31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;;
+31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;;
+31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;;
+31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;;
+31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;;
+31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;;
+3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;;
+3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;;
+3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;;
+3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;;
+3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;;
+3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;;
+3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;;
+3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;;
+3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;;
+3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;;
+320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;;
+320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;;
+320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;;
+320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;;
+320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;;
+320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;;
+3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;;
+3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;;
+3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;;
+3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;;
+3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;;
+3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;;
+3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;;
+3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;;
+3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;;
+3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;;
+321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
+321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
+321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;;N;;;;;
+322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
+322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
+322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
+322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;;
+322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;;
+322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;;
+3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;;
+3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;;
+3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;;
+3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;;
+3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;;
+3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;;
+3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;;
+3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;;
+3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;;
+3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;;
+323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;;
+323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;;
+323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;;
+323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;;
+323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;;
+323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;;
+3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;;
+3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
+3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
+3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;;
+3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;;
+3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;;
+3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;;
+3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;;
+3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;;
+3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;;
+3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;;
+3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;;
+3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;;
+326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;;
+326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;;
+326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;;
+326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;;
+326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;;
+326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;;
+3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;;
+3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;;
+3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;;
+3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;;
+3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;;
+3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;;
+3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;;
+3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;;
+3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;;
+3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
+327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
+327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
+3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
+3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
+3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;;
+3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;;
+3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;;
+3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;;
+3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;;
+3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;;
+3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;;
+3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;;
+328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;;
+328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;;
+328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;;
+328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;;
+328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;;
+328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;;
+3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;;
+3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;;
+3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;;
+3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;;
+3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;;
+3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;;
+3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;;
+3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;;
+3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;;
+3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;;
+329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;;
+329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;;
+329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;;
+329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;;
+329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;;
+329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;;
+32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;;
+32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;;
+32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;;
+32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;;
+32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;;
+32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;;
+32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;;
+32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;;
+32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;;
+32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;;
+32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;;
+32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;;
+32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;;
+32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;;
+32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;;
+32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;;
+32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;;
+32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;;
+32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;;
+32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;;
+32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;;
+32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;;
+32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;;
+32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;;
+32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;;
+32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;;
+32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
+32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
+32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
+32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
+32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
+32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;;
+32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;;
+32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;;
+32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;;
+32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;;
+32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;;
+32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;;
+32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;;
+32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;;
+32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;;
+32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;;
+32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;;
+32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;;
+32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;;
+32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;;
+32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;;
+32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;;
+32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;;
+32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;;
+32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;;
+32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;;
+32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;;
+32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;;
+32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;;
+32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;;
+32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;;
+32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;;
+32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;;
+32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;;
+32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;;
+32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;;
+32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;;
+32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;;
+32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;;
+32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;;
+32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;;
+32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;;
+32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;;
+32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;;
+32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;;
+32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;;
+32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;;
+32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;;
+32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;;
+3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;;
+3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;;
+3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;;
+3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;;
+3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;;
+3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;;
+3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;;
+3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;;
+3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;;
+3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;;
+330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;;
+330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;;
+330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;;
+330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;;
+330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;;
+330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;;
+3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;;
+3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;;
+3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;;
+3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;;
+3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;;
+3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;;
+3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;;
+3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;;
+3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;;
+3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;;
+331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;;
+331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;;
+331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;;
+331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;;
+331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;;
+331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;;
+3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;;
+3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;;
+3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;;
+3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;;
+3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;;
+3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;;
+3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;;
+3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;;
+3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;;
+3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;;
+332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;;
+332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;;
+332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;;
+332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;;
+332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;;
+332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;;
+3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;;
+3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;;
+3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;;
+3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;;
+3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;;
+3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;;
+3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;;
+3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;;
+3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;;
+3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;;
+333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;;
+333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;;
+333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;;
+333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;;
+333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;;
+333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;;
+3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;;
+3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;;
+3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;;
+3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;;
+3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;;
+3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;;
+3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;;
+3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;;
+3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;;
+3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;;
+334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;;
+334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;;
+334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;;
+334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;;
+334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;;
+334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;;
+3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;;
+3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;;
+3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;;
+3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;;
+3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;;
+3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;;
+3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;;
+3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;;
+3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;;
+3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;;
+335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;;
+335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;;
+335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;;
+335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;;
+335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;;
+335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;;
+3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;;
+3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;;
+3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;;
+3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;;
+3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;;
+3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;;
+3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;;
+3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;;
+3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;;
+3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;;
+336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;;
+336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;;
+336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;;
+336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;;
+336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;;
+336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;;
+3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;;
+3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;;
+3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;;
+3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;;
+3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
+3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
+3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
+337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
+337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
+337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;;
+337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;;
+3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;;
+3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;;
+3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;;
+3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;;
+3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;;
+3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;;
+3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;;
+3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;;
+3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;;
+3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;;
+338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;;
+338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;;
+338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;;
+338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;;
+338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;;
+338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;;
+3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;;
+3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;;
+3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;;
+3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;;
+3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;;
+3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;;
+3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;;
+3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;;
+3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;;
+3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;;
+339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;;
+339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;;
+339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;;
+339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;;
+339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;;
+339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;;
+33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;;
+33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;;
+33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;;
+33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;;
+33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;;
+33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;;
+33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;;
+33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;;
+33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;;
+33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;;
+33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;;
+33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;;
+33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;;
+33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;;
+33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;;
+33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;;
+33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;;
+33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;;
+33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;;
+33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;;
+33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;;
+33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;;
+33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;;
+33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;;
+33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;;
+33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;;
+33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;;
+33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;;
+33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;;
+33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;;
+33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;;
+33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;;
+33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;;
+33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;;
+33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;;
+33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;;
+33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;;
+33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;;
+33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;;
+33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;;
+33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;;
+33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;;
+33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;;
+33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;;
+33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;;
+33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;;
+33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;;
+33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;;
+33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;;
+33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;;
+33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;;
+33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;;
+33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;;
+33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;;
+33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;;
+33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;;
+33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;;
+33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;;
+33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;;
+33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
+33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
+33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
+33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
+33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
+33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;;
+33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;;
+33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;;
+33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;;
+33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;;
+33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;;
+33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;;
+33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;;
+33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;;
+33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;;
+33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;;
+33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;;
+33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;;
+33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;;
+33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;;
+33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;;
+33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;;
+33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;;
+33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;;
+33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;;
+33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;;
+33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;;
+33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;;
+33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;;
+33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;;
+33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
+33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
+33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
+3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
+4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
+9FA5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
+A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
+A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
+A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;;
+A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;;
+A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;;
+A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;;
+A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;;
+A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;;
+A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;;
+A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;;
+A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;;
+A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;;
+A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;;
+A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;;
+A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;;
+A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;;
+A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;;
+A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;;
+A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;;
+A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;;
+A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;;
+A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;;
+A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;;
+A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;;
+A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;;
+A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;;
+A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;;
+A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;;
+A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;;
+A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;;
+A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;;
+A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;;
+A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;;
+A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;;
+A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;;
+A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;;
+A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;;
+A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;;
+A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;;
+A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;;
+A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;;
+A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;;
+A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;;
+A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;;
+A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;;
+A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;;
+A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;;
+A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;;
+A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;;
+A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;;
+A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;;
+A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;;
+A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;;
+A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;;
+A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;;
+A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;;
+A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;;
+A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;;
+A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;;
+A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;;
+A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;;
+A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;;
+A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;;
+A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;;
+A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;;
+A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;;
+A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;;
+A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;;
+A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;;
+A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;;
+A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;;
+A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;;
+A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;;
+A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;;
+A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;;
+A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;;
+A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;;
+A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;;
+A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;;
+A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;;
+A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;;
+A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;;
+A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;;
+A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;;
+A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;;
+A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;;
+A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;;
+A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;;
+A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;;
+A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;;
+A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;;
+A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;;
+A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;;
+A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;;
+A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;;
+A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;;
+A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;;
+A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;;
+A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;;
+A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;;
+A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;;
+A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;;
+A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;;
+A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;;
+A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;;
+A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;;
+A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;;
+A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;;
+A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;;
+A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;;
+A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;;
+A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;;
+A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;;
+A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;;
+A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;;
+A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;;
+A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;;
+A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;;
+A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;;
+A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;;
+A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;;
+A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;;
+A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;;
+A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;;
+A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;;
+A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;;
+A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;;
+A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;;
+A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;;
+A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;;
+A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;;
+A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;;
+A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;;
+A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;;
+A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;;
+A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;;
+A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;;
+A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;;
+A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;;
+A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;;
+A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;;
+A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;;
+A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;;
+A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;;
+A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;;
+A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;;
+A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;;
+A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;;
+A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;;
+A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;;
+A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;;
+A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;;
+A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;;
+A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;;
+A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;;
+A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;;
+A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;;
+A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;;
+A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;;
+A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;;
+A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;;
+A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;;
+A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;;
+A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;;
+A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;;
+A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;;
+A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;;
+A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;;
+A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;;
+A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;;
+A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;;
+A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;;
+A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;;
+A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;;
+A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;;
+A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;;
+A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;;
+A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;;
+A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;;
+A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;;
+A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;;
+A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;;
+A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;;
+A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;;
+A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;;
+A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;;
+A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;;
+A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;;
+A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;;
+A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;;
+A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;;
+A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;;
+A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;;
+A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;;
+A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;;
+A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;;
+A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;;
+A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;;
+A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;;
+A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;;
+A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;;
+A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;;
+A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;;
+A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;;
+A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;;
+A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;;
+A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;;
+A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;;
+A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;;
+A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;;
+A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;;
+A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;;
+A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;;
+A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;;
+A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;;
+A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;;
+A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;;
+A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;;
+A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;;
+A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;;
+A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;;
+A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;;
+A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;;
+A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;;
+A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;;
+A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;;
+A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;;
+A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;;
+A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;;
+A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;;
+A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;;
+A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;;
+A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;;
+A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;;
+A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;;
+A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;;
+A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;;
+A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;;
+A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;;
+A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;;
+A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;;
+A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;;
+A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;;
+A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;;
+A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;;
+A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;;
+A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;;
+A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;;
+A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;;
+A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;;
+A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;;
+A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;;
+A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;;
+A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;;
+A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;;
+A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;;
+A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;;
+A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;;
+A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;;
+A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;;
+A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;;
+A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;;
+A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;;
+A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;;
+A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;;
+A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;;
+A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;;
+A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;;
+A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;;
+A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;;
+A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;;
+A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;;
+A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;;
+A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;;
+A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;;
+A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;;
+A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;;
+A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;;
+A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;;
+A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;;
+A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;;
+A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;;
+A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;;
+A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;;
+A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;;
+A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;;
+A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;;
+A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;;
+A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;;
+A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;;
+A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;;
+A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;;
+A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;;
+A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;;
+A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;;
+A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;;
+A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;;
+A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;;
+A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;;
+A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;;
+A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;;
+A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;;
+A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;;
+A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;;
+A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;;
+A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;;
+A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;;
+A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;;
+A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;;
+A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;;
+A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;;
+A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;;
+A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;;
+A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;;
+A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;;
+A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;;
+A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;;
+A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;;
+A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;;
+A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;;
+A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;;
+A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;;
+A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;;
+A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;;
+A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;;
+A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;;
+A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;;
+A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;;
+A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;;
+A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;;
+A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;;
+A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;;
+A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;;
+A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;;
+A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;;
+A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;;
+A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;;
+A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;;
+A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;;
+A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;;
+A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;;
+A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;;
+A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;;
+A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;;
+A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;;
+A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;;
+A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;;
+A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;;
+A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;;
+A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;;
+A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;;
+A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;;
+A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;;
+A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;;
+A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;;
+A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;;
+A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;;
+A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;;
+A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;;
+A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;;
+A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;;
+A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;;
+A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;;
+A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;;
+A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;;
+A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;;
+A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;;
+A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;;
+A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;;
+A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;;
+A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;;
+A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;;
+A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;;
+A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;;
+A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;;
+A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;;
+A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;;
+A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;;
+A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;;
+A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;;
+A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;;
+A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;;
+A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;;
+A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;;
+A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;;
+A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;;
+A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;;
+A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;;
+A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;;
+A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;;
+A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;;
+A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;;
+A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;;
+A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;;
+A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;;
+A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;;
+A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;;
+A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;;
+A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;;
+A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;;
+A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;;
+A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;;
+A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;;
+A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;;
+A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;;
+A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;;
+A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;;
+A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;;
+A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;;
+A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;;
+A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;;
+A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;;
+A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;;
+A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;;
+A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;;
+A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;;
+A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;;
+A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;;
+A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;;
+A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;;
+A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;;
+A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;;
+A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;;
+A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;;
+A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;;
+A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;;
+A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;;
+A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;;
+A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;;
+A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;;
+A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;;
+A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;;
+A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;;
+A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;;
+A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;;
+A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;;
+A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;;
+A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;;
+A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;;
+A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;;
+A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;;
+A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;;
+A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;;
+A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;;
+A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;;
+A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;;
+A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;;
+A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;;
+A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;;
+A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;;
+A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;;
+A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;;
+A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;;
+A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;;
+A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;;
+A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;;
+A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;;
+A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;;
+A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;;
+A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;;
+A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;;
+A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;;
+A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;;
+A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;;
+A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;;
+A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;;
+A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;;
+A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;;
+A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;;
+A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;;
+A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;;
+A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;;
+A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;;
+A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;;
+A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;;
+A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;;
+A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;;
+A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;;
+A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;;
+A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;;
+A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;;
+A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;;
+A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;;
+A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;;
+A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;;
+A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;;
+A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;;
+A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;;
+A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;;
+A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;;
+A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;;
+A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;;
+A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;;
+A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;;
+A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;;
+A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;;
+A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;;
+A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;;
+A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;;
+A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;;
+A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;;
+A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;;
+A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;;
+A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;;
+A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;;
+A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;;
+A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;;
+A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;;
+A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;;
+A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;;
+A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;;
+A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;;
+A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;;
+A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;;
+A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;;
+A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;;
+A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;;
+A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;;
+A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;;
+A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;;
+A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;;
+A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;;
+A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;;
+A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;;
+A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;;
+A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;;
+A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;;
+A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;;
+A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;;
+A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;;
+A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;;
+A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;;
+A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;;
+A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;;
+A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;;
+A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;;
+A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;;
+A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;;
+A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;;
+A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;;
+A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;;
+A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;;
+A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;;
+A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;;
+A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;;
+A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;;
+A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;;
+A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;;
+A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;;
+A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;;
+A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;;
+A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;;
+A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;;
+A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;;
+A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;;
+A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;;
+A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;;
+A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;;
+A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;;
+A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;;
+A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;;
+A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;;
+A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;;
+A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;;
+A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;;
+A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;;
+A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;;
+A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;;
+A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;;
+A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;;
+A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;;
+A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;;
+A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;;
+A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;;
+A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;;
+A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;;
+A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;;
+A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;;
+A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;;
+A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;;
+A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;;
+A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;;
+A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;;
+A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;;
+A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;;
+A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;;
+A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;;
+A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;;
+A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;;
+A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;;
+A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;;
+A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;;
+A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;;
+A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;;
+A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;;
+A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;;
+A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;;
+A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;;
+A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;;
+A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;;
+A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;;
+A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;;
+A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;;
+A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;;
+A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;;
+A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;;
+A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;;
+A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;;
+A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;;
+A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;;
+A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;;
+A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;;
+A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;;
+A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;;
+A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;;
+A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;;
+A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;;
+A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;;
+A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;;
+A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;;
+A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;;
+A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;;
+A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;;
+A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;;
+A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;;
+A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;;
+A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;;
+A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;;
+A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;;
+A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;;
+A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;;
+A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;;
+A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;;
+A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;;
+A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;;
+A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;;
+A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;;
+A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;;
+A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;;
+A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;;
+A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;;
+A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;;
+A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;;
+A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;;
+A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;;
+A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;;
+A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;;
+A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;;
+A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;;
+A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;;
+A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;;
+A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;;
+A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;;
+A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;;
+A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;;
+A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;;
+A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;;
+A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;;
+A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;;
+A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;;
+A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;;
+A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;;
+A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;;
+A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;;
+A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;;
+A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;;
+A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;;
+A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;;
+A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;;
+A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;;
+A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;;
+A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;;
+A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;;
+A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;;
+A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;;
+A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;;
+A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;;
+A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;;
+A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;;
+A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;;
+A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;;
+A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;;
+A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;;
+A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;;
+A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;;
+A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;;
+A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;;
+A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;;
+A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;;
+A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;;
+A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;;
+A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;;
+A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;;
+A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;;
+A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;;
+A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;;
+A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;;
+A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;;
+A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;;
+A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;;
+A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;;
+A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;;
+A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;;
+A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;;
+A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;;
+A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;;
+A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;;
+A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;;
+A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;;
+A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;;
+A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;;
+A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;;
+A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;;
+A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;;
+A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;;
+A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;;
+A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;;
+A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;;
+A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;;
+A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;;
+A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;;
+A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;;
+A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;;
+A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;;
+A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;;
+A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;;
+A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;;
+A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;;
+A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;;
+A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;;
+A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;;
+A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;;
+A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;;
+A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;;
+A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;;
+A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;;
+A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;;
+A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;;
+A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;;
+A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;;
+A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;;
+A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;;
+A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;;
+A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;;
+A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;;
+A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;;
+A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;;
+A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;;
+A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;;
+A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;;
+A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;;
+A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;;
+A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;;
+A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;;
+A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;;
+A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;;
+A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;;
+A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;;
+A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;;
+A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;;
+A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;;
+A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;;
+A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;;
+A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;;
+A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;;
+A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;;
+A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;;
+A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;;
+A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;;
+A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;;
+A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;;
+A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;;
+A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;;
+A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;;
+A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;;
+A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;;
+A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;;
+A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;;
+A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;;
+A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;;
+A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;;
+A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;;
+A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;;
+A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;;
+A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;;
+A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;;
+A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;;
+A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;;
+A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;;
+A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;;
+A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;;
+A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;;
+A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;;
+A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;;
+A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;;
+A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;;
+A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;;
+A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;;
+A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;;
+A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;;
+A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;;
+A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;;
+A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;;
+A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;;
+A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;;
+A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;;
+A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;;
+A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;;
+A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;;
+A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;;
+A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;;
+A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;;
+A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;;
+A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;;
+A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;;
+A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;;
+A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;;
+A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;;
+A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;;
+A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;;
+A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;;
+A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;;
+A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;;
+A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;;
+A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;;
+A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;;
+A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;;
+A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;;
+A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;;
+A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;;
+A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;;
+A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;;
+A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;;
+A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;;
+A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;;
+A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;;
+A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;;
+A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;;
+A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;;
+A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;;
+A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;;
+A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;;
+A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;;
+A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;;
+A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;;
+A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;;
+A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;;
+A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;;
+A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;;
+A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;;
+A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;;
+A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;;
+A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;;
+A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;;
+A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;;
+A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;;
+A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;;
+A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;;
+A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;;
+A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;;
+A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;;
+A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;;
+A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;;
+A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;;
+A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;;
+A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;;
+A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;;
+A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;;
+A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;;
+A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;;
+A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;;
+A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;;
+A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;;
+A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;;
+A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;;
+A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;;
+A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;;
+A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;;
+A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;;
+A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;;
+A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;;
+A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;;
+A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;;
+A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;;
+A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;;
+A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;;
+A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;;
+A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;;
+A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;;
+A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;;
+A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;;
+A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;;
+A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;;
+A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;;
+A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;;
+A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;;
+A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;;
+A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;;
+A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;;
+A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;;
+A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;;
+A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;;
+A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;;
+A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;;
+A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;;
+A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;;
+A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;;
+A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;;
+A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;;
+A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;;
+A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;;
+A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;;
+A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;;
+A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;;
+A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;;
+A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;;
+A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;;
+A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;;
+A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;;
+A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;;
+A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;;
+A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;;
+A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;;
+A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;;
+A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;;
+A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;;
+A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;;
+A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;;
+A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;;
+A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;;
+A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;;
+A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;;
+A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;;
+A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;;
+A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;;
+A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;;
+A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;;
+A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;;
+A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;;
+A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;;
+A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;;
+A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;;
+A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;;
+A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;;
+A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;;
+A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;;
+A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;;
+A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;;
+A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;;
+A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;;
+A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;;
+A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;;
+A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;;
+A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;;
+A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;;
+A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;;
+A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;;
+A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;;
+A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;;
+A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;;
+A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;;
+A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;;
+A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;;
+A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;;
+A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;;
+A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;;
+A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;;
+A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;;
+A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;;
+A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;;
+A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;;
+A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;;
+A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;;
+A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;;
+A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;;
+A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;;
+A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;;
+A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;;
+A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;;
+A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;;
+A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;;
+A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;;
+A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;;
+A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;;
+A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;;
+A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;;
+A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;;
+A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;;
+A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;;
+A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;;
+A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;;
+A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;;
+A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;;
+A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;;
+A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;;
+A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;;
+A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;;
+A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;;
+A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;;
+A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;;
+A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;;
+A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;;
+A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;;
+A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;;
+A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;;
+A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;;
+A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;;
+A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;;
+A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;;
+A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;;
+A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;;
+A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;;
+A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;;
+A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;;
+A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;;
+A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;;
+A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;;
+A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;;
+A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;;
+A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;;
+A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;;
+A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;;
+A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;;
+A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;;
+A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;;
+A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;;
+A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;;
+A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;;
+A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;;
+A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;;
+A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;;
+A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;;
+A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;;
+A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;;
+A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;;
+A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;;
+A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;;
+A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;;
+A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;;
+A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;;
+A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;;
+A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;;
+A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;;
+A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;;
+A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;;
+A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;;
+A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;;
+A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;;
+A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;;
+A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;;
+A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;;
+A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;;
+A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;;
+A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;;
+A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;;
+A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;;
+A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;;
+A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;;
+A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;;
+A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;;
+A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;;
+A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;;
+A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;;
+A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;;
+A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;;
+A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;;
+A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;;
+A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;;
+A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;;
+A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;;
+A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;;
+A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;;
+A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;;
+A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;;
+A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;;
+A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;;
+A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;;
+A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;;
+A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;;
+A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;;
+A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;;
+A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;;
+A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;;
+A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;;
+A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;;
+A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;;
+A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;;
+A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;;
+A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;;
+A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;;
+A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;;
+A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;;
+A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;;
+A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;;
+A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;;
+A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;;
+A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;;
+A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;;
+A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;;
+A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;;
+A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;;
+A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;;
+A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;;
+A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;;
+A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;;
+A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;;
+A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;;
+A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;;
+A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;;
+A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;;
+A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;;
+A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;;
+A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;;
+A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;;
+A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;;
+A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;;
+A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;;
+A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;;
+A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;;
+A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;;
+A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;;
+A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;;
+A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;;
+A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;;
+A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;;
+A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;;
+A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;;
+A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;;
+A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;;
+A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;;
+A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;;
+A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;;
+A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;;
+A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;;
+A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;;
+A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;;
+A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;;
+A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;;
+A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;;
+A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;;
+A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;;
+A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;;
+A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;;
+A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;;
+A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;;
+A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;;
+A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;;
+A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;;
+A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;;
+A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;;
+A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;;
+A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;;
+A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;;
+A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;;
+A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;;
+A491;YI RADICAL LI;So;0;ON;;;;;N;;;;;
+A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;;
+A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;;
+A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;;
+A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;;
+A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;;
+A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;;
+A498;YI RADICAL MI;So;0;ON;;;;;N;;;;;
+A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;;
+A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;;
+A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;;
+A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;;
+A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;;
+A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;;
+A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;;
+A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;;
+A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;;
+A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;;
+A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;;
+A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;;
+A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;;
+A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;;
+A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;;
+A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;;
+A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;;
+A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;;
+A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;;
+A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;;
+A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;;
+A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;;
+A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;;
+A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;;
+A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;;
+A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;;
+A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;;
+A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;;
+A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;;
+A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;;
+A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;;
+A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;;
+A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;;
+A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;;
+A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;;
+A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;;
+A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;;
+A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;;
+A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;;
+A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;;
+D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;;
+D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;;
+DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;;
+E000;<Private Use, First>;Co;0;L;;;;;N;;;;;
+F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;;
+F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;;
+F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;;
+F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;;
+F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;;
+F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;;
+F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;;
+F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;;
+F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;;
+F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;;
+F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;;
+F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;;
+F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;;
+F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;;
+F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;;
+F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;;
+F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;;
+F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;;
+F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;;
+F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;;
+F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;;
+F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;;
+F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;;
+F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;;
+F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;;
+F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;;
+F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;;
+F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;;
+F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;;
+F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;;
+F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;;
+F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;;
+F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;;
+F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;;
+F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;;
+F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;;
+F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;;
+F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;;
+F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;;
+F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;;
+F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;;
+F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;;
+F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;;
+F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;;
+F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;;
+F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;;
+F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;;
+F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;;
+F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;;
+F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;;
+F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;;
+F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;;
+F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;;
+F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;;
+F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;;
+F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;;
+F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;;
+F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;;
+F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;;
+F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;;
+F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;;
+F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;;
+F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;;
+F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;;
+F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;;
+F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;;
+F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;;
+F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;;
+F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;;
+F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;;
+F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;;
+F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;;
+F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;;
+F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;;
+F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;;
+F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;;
+F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;;
+F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;;
+F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;;
+F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;;
+F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;;
+F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;;
+F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;96FB;;;;N;;;;;
+F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;;
+F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;;
+F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;;
+F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;;
+F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;;
+F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;;
+F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;;
+F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;;
+F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;;
+F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;;
+F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;;
+F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;;
+F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;;
+F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;;
+F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;;
+F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;;
+F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;;
+F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;;
+F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;;
+F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;;
+F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;;
+F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;;
+F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;;
+F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;;
+F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;;
+F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;;
+F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;;
+F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;;
+F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;;
+F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;;
+F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;;
+F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;;
+F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;;
+F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;;
+F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;;
+F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;;
+F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;;
+F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;;
+F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;;
+F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;;
+F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;;
+F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;;
+F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;;
+F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;;
+F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;;
+F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;;
+F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;;
+F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;;
+F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;;
+F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;;
+F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;;
+F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;;
+F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;;
+F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;;
+F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;;
+F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;;
+F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;;
+F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;;
+F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;;
+F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;;
+F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;;
+F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;;
+F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;;
+F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;;
+F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;;
+F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;;
+F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;;
+F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;;
+F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;;
+F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;;
+F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;;
+F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;;
+F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;;
+F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;;
+F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;;
+F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;;
+F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;;
+F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;;
+F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;;
+F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;;
+F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;;
+F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;;
+F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;;
+F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;;
+F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;;
+F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;;
+F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;;
+F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;;
+F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;;
+F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;;
+F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;;
+F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;;
+F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;;
+F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;;
+F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;;
+F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;;
+F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;;
+F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;;
+F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;;
+F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;;
+F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;;
+F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;;
+F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;;
+F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;;
+F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;;
+F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;;
+F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;;
+F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;;
+F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;;
+F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;;
+F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;;
+F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;;
+F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;;
+F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;;
+F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;;
+F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;;
+F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;;
+F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;;
+F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;;
+F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;;
+F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;;
+F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;;
+F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;;
+F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;;
+F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;;
+F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;;
+F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;;
+F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;;
+F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;;
+F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;;
+F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;;
+F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;;
+F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;;
+F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;;
+F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;;
+F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;;
+F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;;
+F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;;
+F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;;
+F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;;
+F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;;
+F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;;
+F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;;
+F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;;
+F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;;
+F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;;
+F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;;
+F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;;
+F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;;
+F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;;
+F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;;
+F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;;
+F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;;
+F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;;
+F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;;
+F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;;
+F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;;
+F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;;
+F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;;
+F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;;
+F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;;
+F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;;
+F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;;
+F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;;
+F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;;
+F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;;
+F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;;
+F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;;
+F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;;
+F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;;
+F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;;
+F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;;
+F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;;
+F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;;
+FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;;
+FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;;
+FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;;
+FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;;
+FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;;
+FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;;
+FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;;
+FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;;
+FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;;
+FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;;
+FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;;
+FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;;
+FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;;
+FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;;
+FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;;
+FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;;
+FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;;
+FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;;
+FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;;
+FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;;
+FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;;
+FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;;
+FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;;
+FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;;
+FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;;
+FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;;
+FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;;
+FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;;
+FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;;
+FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;;
+FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;;
+FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;;
+FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;;
+FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;;
+FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;;
+FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;;
+FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;;
+FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;;
+FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;;
+FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;;
+FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;;
+FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;;
+FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;;
+FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;;
+FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;;
+FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;;
+FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;;
+FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;;
+FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;;
+FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;;
+FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;;
+FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;;
+FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;;
+FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;;
+FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;;
+FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;;
+FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;;
+FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;;
+FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;;
+FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;;
+FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;;
+FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;;
+FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;;
+FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;;
+FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;;
+FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;;
+FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;;
+FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;;
+FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;;
+FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;;
+FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET;<font> 002B;;;;N;;;;;
+FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;;
+FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;;
+FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;;
+FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;;
+FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;;
+FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;;
+FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;;
+FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;;
+FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;;
+FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;;
+FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;;
+FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;;
+FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;;
+FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;;
+FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;;
+FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;;
+FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;;
+FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;;
+FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;;
+FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;;
+FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;;
+FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;;
+FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;;
+FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;;
+FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;;
+FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;;
+FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;;
+FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;;
+FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;;
+FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;;
+FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;;
+FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;;
+FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;;
+FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;;
+FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;;
+FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;;
+FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;;
+FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;;
+FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;;
+FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;;
+FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;;
+FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;;
+FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;;
+FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;;
+FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;;
+FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;;
+FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;;
+FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;;
+FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;;
+FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;;
+FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;;
+FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;;
+FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;;
+FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;;
+FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;;
+FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;;
+FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;;
+FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;;
+FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;;
+FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;;
+FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;;
+FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;;
+FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;;
+FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;;
+FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;;
+FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;;
+FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;;
+FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;;
+FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;;
+FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;;
+FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;;
+FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;;
+FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;;
+FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;;
+FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;;
+FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;;
+FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;;
+FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;;
+FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;;
+FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;;
+FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;;
+FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;;
+FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;;
+FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;;
+FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;;
+FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;;
+FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;;
+FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;;
+FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;;
+FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;;
+FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;;
+FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;;
+FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;;
+FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;;
+FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;;
+FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;;
+FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;;
+FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;;
+FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;;
+FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;;
+FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;;
+FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;;
+FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;;
+FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;;
+FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;;
+FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;;
+FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;;
+FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;;
+FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;;
+FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;;
+FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;;
+FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;;
+FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;;
+FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;;
+FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;;
+FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;;
+FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;;
+FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;;
+FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;;
+FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;;
+FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;;
+FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;;
+FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;;
+FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;;
+FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;;
+FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;;
+FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;;
+FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;;
+FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;;
+FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;;
+FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;;
+FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
+FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
+FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
+FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;;
+FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;;
+FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;;
+FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;;
+FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;;
+FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;;
+FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;;
+FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;;
+FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;;
+FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;;
+FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;;
+FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;;
+FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;;
+FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;;
+FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;;
+FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;;
+FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;;
+FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;;
+FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;;
+FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;;
+FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;;
+FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;;
+FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;;
+FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;;
+FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;;
+FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;;
+FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;;
+FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;;
+FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;;
+FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;;
+FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;;
+FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;;
+FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;;
+FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;;
+FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;;
+FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;;
+FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;;
+FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;;
+FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;;
+FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;;
+FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;;
+FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;;
+FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;;
+FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;;
+FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;;
+FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;;
+FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;;
+FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;;
+FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;;
+FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;;
+FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;;
+FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;;
+FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;;
+FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;;
+FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;;
+FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;;
+FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;;
+FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;;
+FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;;
+FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;;
+FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;;
+FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;;
+FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;;
+FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;;
+FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;;
+FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;;
+FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;;
+FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;;
+FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;;
+FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;;
+FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;;
+FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;;
+FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;;
+FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;;
+FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;;
+FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;;
+FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;;
+FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;;
+FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;;
+FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;;
+FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;;
+FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;;
+FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;;
+FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;;
+FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;;
+FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;;
+FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;;
+FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;;
+FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;;
+FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;;
+FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;;
+FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;;
+FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;;
+FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;;
+FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;;
+FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;;
+FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;;
+FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;;
+FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;;
+FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;;
+FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;;
+FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;;
+FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;;
+FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;;
+FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;;
+FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;;
+FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;;
+FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;;
+FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;;
+FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;;
+FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;;
+FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;;
+FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;;
+FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;;
+FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;;
+FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;;
+FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;;
+FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;;
+FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;;
+FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;;
+FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;;
+FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;;
+FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;;
+FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;;
+FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;;
+FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;;
+FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;;
+FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;;
+FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;;
+FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;;
+FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;;
+FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;;
+FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;;
+FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;;
+FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;;
+FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;;
+FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;;
+FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;;
+FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;;
+FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;;
+FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;;
+FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;;
+FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;;
+FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;;
+FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;;
+FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;;
+FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;;
+FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;;
+FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;;
+FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;;
+FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;;
+FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;;
+FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;;
+FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;;
+FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;;
+FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;;
+FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;;
+FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;;
+FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;;
+FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;;
+FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;;
+FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;;
+FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;;
+FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;;
+FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;;
+FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;;
+FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;;
+FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;;
+FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;;
+FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;;
+FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;;
+FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;;
+FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;;
+FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;;
+FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;;
+FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;;
+FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;;
+FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;;
+FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;;
+FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;;
+FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;;
+FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;;
+FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;;
+FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;;
+FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;;
+FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;;
+FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;;
+FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;;
+FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;;
+FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;;
+FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;;
+FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;;
+FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;;
+FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;;
+FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;;
+FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;;
+FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;;
+FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;;
+FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;;
+FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;;
+FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;;
+FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;;
+FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;;
+FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;;
+FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;;
+FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;;
+FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;;
+FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;;
+FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;;
+FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;;
+FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;;
+FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;;
+FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;;
+FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;;
+FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;;
+FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;;
+FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;;
+FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;;
+FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;;
+FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;;
+FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;;
+FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;;
+FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;;
+FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;;
+FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;;
+FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;;
+FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;;
+FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;;
+FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;;
+FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;;
+FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;;
+FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;;
+FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;;
+FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;;
+FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;;
+FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;;
+FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;;
+FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;;
+FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;;
+FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;;
+FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;;
+FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;;
+FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;;
+FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;;
+FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;;
+FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;;
+FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;;
+FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;;
+FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;;
+FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;;
+FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;;
+FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;;
+FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;;
+FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;;
+FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;;
+FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;;
+FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;;
+FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;;
+FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;;
+FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;;
+FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;;
+FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;;
+FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;;
+FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;;
+FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;;
+FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;;
+FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;;
+FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;;
+FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;;
+FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;;
+FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;;
+FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;;
+FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;;
+FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;;
+FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;;
+FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;;
+FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;;
+FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;;
+FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;;
+FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;;
+FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;;
+FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;;
+FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;;
+FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;;
+FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;;
+FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;;
+FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;;
+FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;;
+FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;;
+FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;;
+FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;;
+FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;;
+FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;;
+FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;;
+FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;;
+FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;;
+FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;;
+FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;;
+FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;;
+FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;;
+FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;;
+FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;;
+FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;;
+FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;;
+FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;;
+FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;;
+FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;;
+FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;;
+FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;;
+FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;;
+FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;;
+FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;;
+FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;;
+FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;;
+FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;;
+FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;;
+FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;;
+FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;;
+FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;;
+FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;;
+FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;;
+FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;;
+FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;;
+FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;;
+FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;;
+FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;;
+FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;;
+FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;;
+FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;;
+FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;;
+FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;;
+FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;;
+FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;;
+FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;;
+FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;;
+FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;;
+FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;;
+FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;;
+FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;;
+FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;;
+FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;;
+FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;;
+FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;;
+FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;;
+FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;;
+FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;;
+FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;;
+FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;;
+FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;;
+FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;;
+FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;;
+FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;;
+FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;;
+FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;;
+FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;;
+FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;;
+FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;;
+FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
+FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
+FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
+FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
+FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
+FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;;
+FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;;
+FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;;
+FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;;
+FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;;
+FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;;
+FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;;
+FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;;
+FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;;
+FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;;
+FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;;
+FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;;
+FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;;
+FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;;
+FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;;
+FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;;
+FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;;
+FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;;
+FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;;
+FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;;
+FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;;
+FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;;
+FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;;
+FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;;
+FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;;
+FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;;
+FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;;
+FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;;
+FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;;
+FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;;
+FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;;
+FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;;
+FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;;
+FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;;
+FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;;
+FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;;
+FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;;
+FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;;
+FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;;
+FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;;
+FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;;
+FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;;
+FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;;
+FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;;
+FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;;
+FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;;
+FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;;
+FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;;
+FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;;
+FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;;
+FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;;
+FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;;
+FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;;
+FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;;
+FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;;
+FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;;
+FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;;
+FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;;
+FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;;
+FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;;
+FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;;
+FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;;
+FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;;
+FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;;
+FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;;
+FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;;
+FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;;
+FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;;
+FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;;
+FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;;
+FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;;
+FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;;
+FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;;
+FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;;
+FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;;
+FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;;
+FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;;
+FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;;
+FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;;
+FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;;
+FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;;
+FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;;
+FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;;
+FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;;
+FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;;
+FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;;
+FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;;
+FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;;
+FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;;
+FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;;
+FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;;
+FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;;
+FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;;
+FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;;
+FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;;
+FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;;
+FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;;
+FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;;
+FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;;
+FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;;
+FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;;
+FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;;
+FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;;
+FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;;
+FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;;
+FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;;
+FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;;
+FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;;
+FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;;
+FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;;
+FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;;
+FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;;
+FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
+FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
+FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
+FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
+FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
+FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;;
+FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;;
+FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;;
+FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;;
+FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;;
+FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;;
+FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;;
+FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
+FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
+FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;;
+FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;;
+FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;;
+FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;;
+FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;;
+FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;;
+FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;;
+FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;;
+FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;;
+FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;;
+FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;;
+FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;;
+FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;;
+FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;;
+FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;;
+FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;;
+FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;;
+FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;;
+FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;;
+FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;;
+FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;;
+FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;;
+FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
+FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
+FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
+FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
+FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;;
+FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;;
+FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;;
+FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;;
+FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;;
+FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;;
+FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;;
+FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;;
+FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;;
+FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;;
+FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;;
+FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;;
+FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;N;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;N;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;N;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;;
+FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;;
+FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;;
+FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;;
+FE62;SMALL PLUS SIGN;Sm;0;ET;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ET;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;N;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;N;;;;;
+FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;;
+FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;;
+FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;;
+FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;;
+FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;;
+FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;;
+FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;;
+FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;;
+FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;;
+FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;;
+FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;;
+FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;;
+FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;;
+FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;;
+FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;;
+FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;;
+FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;;
+FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;;
+FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;;
+FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;;
+FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;;
+FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;;
+FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;;
+FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;;
+FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;;
+FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;;
+FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;;
+FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;;
+FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;;
+FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;;
+FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;;
+FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;;
+FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;;
+FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;;
+FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;;
+FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;;
+FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;;
+FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;;
+FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;;
+FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;;
+FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;;
+FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;;
+FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;;
+FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;;
+FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;;
+FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;;
+FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;;
+FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;;
+FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
+FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
+FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
+FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
+FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;;
+FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;;
+FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;;
+FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;;
+FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;;
+FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;;
+FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;;
+FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;;
+FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;;
+FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;;
+FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;;
+FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;;
+FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;;
+FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;;
+FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;;
+FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;;
+FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;;
+FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;;
+FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;;
+FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;;
+FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;;
+FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;;
+FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;;
+FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;;
+FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;;
+FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;;
+FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;;
+FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;;
+FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;;
+FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;;
+FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;;
+FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;;
+FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;;
+FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;;
+FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;;
+FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;;
+FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;;
+FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;;
+FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;;
+FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;;
+FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;;
+FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;;
+FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;;
+FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;;
+FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;;
+FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;;
+FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;;
+FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;;
+FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;;
+FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;;
+FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;;
+FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;;
+FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;;
+FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;;
+FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;;
+FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;;
+FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;;
+FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;;
+FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;;
+FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;;
+FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;;
+FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;;
+FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;;
+FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;;
+FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;;
+FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;;
+FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;;
+FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;;
+FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;;
+FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;;
+FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;;
+FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;;
+FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;;
+FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;;
+FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;;
+FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;;
+FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;;
+FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;;
+FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;;
+FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;;
+FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;;
+FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;;
+FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;;
+FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;;
+FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;;
+FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;;
+FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;;
+FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;;
+FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;;
+FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
+FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;;
+FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;;
+FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;;
+FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;;
+FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;;
+FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;;
+FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;;
+FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;N;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;N;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;ES;<wide> 002F;;;;N;FULLWIDTH SLASH;;;;
+FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;;
+FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;;
+FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;;
+FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;;
+FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;;
+FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;;
+FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;;
+FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;;
+FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;;
+FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;;
+FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;;
+FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;;
+FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;N;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;N;;;;;
+FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;;
+FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;;
+FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41;
+FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42;
+FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43;
+FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44;
+FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45;
+FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46;
+FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47;
+FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48;
+FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49;
+FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A;
+FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B;
+FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C;
+FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D;
+FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E;
+FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F;
+FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50;
+FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51;
+FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52;
+FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53;
+FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54;
+FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55;
+FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56;
+FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57;
+FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58;
+FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59;
+FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A;
+FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;N;FULLWIDTH OPENING SQUARE BRACKET;;;;
+FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;;
+FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;N;FULLWIDTH CLOSING SQUARE BRACKET;;;;
+FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;;
+FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;;
+FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;;
+FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21
+FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22
+FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23
+FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24
+FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25
+FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26
+FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27
+FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28
+FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29
+FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A
+FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B
+FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C
+FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D
+FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E
+FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F
+FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30
+FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31
+FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32
+FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33
+FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34
+FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35
+FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36
+FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37
+FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38
+FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39
+FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A
+FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;N;FULLWIDTH OPENING CURLY BRACKET;;;;
+FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;;
+FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;N;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;N;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;N;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON;<narrow> 30FB;;;;N;;;;;
+FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;;
+FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;;
+FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;;
+FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;;
+FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;;
+FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;;
+FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;;
+FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;;
+FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;;
+FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;;
+FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;;
+FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;;
+FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;;
+FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;;
+FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;;
+FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;;
+FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;;
+FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;;
+FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;;
+FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;;
+FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;;
+FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;;
+FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;;
+FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;;
+FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;;
+FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;;
+FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;;
+FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;;
+FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;;
+FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;;
+FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;;
+FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;;
+FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;;
+FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;;
+FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;;
+FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;;
+FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;;
+FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;;
+FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;;
+FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;;
+FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;;
+FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;;
+FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;;
+FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;;
+FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;;
+FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;;
+FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;;
+FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;;
+FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;;
+FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;;
+FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;;
+FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;;
+FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;;
+FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;;
+FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;;
+FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;;
+FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;;
+FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;;
+FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;;
+FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;;
+FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;;
+FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
+FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;;
+FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;;
+FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;;
+FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;;
+FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;;
+FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;;
+FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;;
+FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;;
+FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;;
+FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;;
+FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;;
+FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;;
+FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;;
+FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;;
+FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;;
+FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;;
+FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;;
+FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;;
+FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;;
+FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;;
+FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;;
+FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;;
+FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;;
+FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;;
+FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;;
+FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;;
+FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;;
+FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;;
+FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;;
+FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;;
+FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;;
+FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;;
+FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;;
+FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;;
+FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;;
+FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;;
+FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;;
+FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;;
+FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;;
+FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;;
+FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;;
+FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;;
+FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;;
+FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;;
+FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;;
+FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;;
+FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;;
+FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
+FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;;
+FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;;
+FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;;
+FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;;
+FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;;
+FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;;
+FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;;
+FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;;
+FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;;
+FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;;
+FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;;
+FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;;
+FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;;
+FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;;
+FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
diff --git a/contrib/perl5/lib/unicode/Unicode3.html b/contrib/perl5/lib/unicode/Unicode3.html
new file mode 100644
index 0000000..a08a25e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/Unicode3.html
@@ -0,0 +1,1988 @@
+<html>
+
+
+
+<head>
+
+<meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 4.0">
+
+<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
+
+<link REL="stylesheet" HREF="http://www.unicode.org/unicode.css" TYPE="text/css">
+
+<title>UnicodeData File Format</title>
+
+</head>
+
+
+
+<body>
+
+
+
+<h1>UnicodeData File Format<br>
+Version 3.0.0</h1>
+
+
+
+<table BORDER="1" CELLSPACING="2" CELLPADDING="0" HEIGHT="87" WIDTH="100%">
+
+ <tr>
+
+ <td VALIGN="TOP" width="144">Revision</td>
+
+ <td VALIGN="TOP">3.0.0</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP" width="144">Authors</td>
+
+ <td VALIGN="TOP">Mark Davis and Ken Whistler</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP" width="144">Date</td>
+
+ <td VALIGN="TOP">1999-09-12</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP" width="144">This Version</td>
+
+ <td VALIGN="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP" width="144">Previous Version</td>
+
+ <td VALIGN="TOP">n/a</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP" width="144">Latest Version</td>
+
+ <td VALIGN="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
+
+ </tr>
+
+</table>
+
+
+
+<p align="center">Copyright © 1995-1999 Unicode, Inc. All Rights reserved.<br>
+
+<i>For more information, including Disclamer and Limitations, see <a HREF="UnicodeCharacterDatabase-3.0.0.html">UnicodeCharacterDatabase-3.0.0.html</a> </i></p>
+
+
+
+<p>This document describes the format of the UnicodeData.txt file, which is one of the
+
+files in the Unicode Character Database. The document is divided into the following
+
+sections:
+
+
+
+<ul>
+
+ <li><a HREF="#Field Formats">Field Formats</a> <ul>
+
+ <li><a HREF="#General Category">General Category</a> </li>
+
+ <li><a HREF="#Bidirectional Category">Bidirectional Category</a> </li>
+
+ <li><a HREF="#Character Decomposition">Character Decomposition Mapping</a> </li>
+
+ <li><a HREF="#Canonical Combining Classes">Canonical Combining Classes</a> </li>
+
+ <li><a HREF="#Decompositions and Normalization">Decompositions and Normalization</a> </li>
+
+ <li><a HREF="#Case Mappings">Case Mappings</a> </li>
+
+ </ul>
+
+ </li>
+
+ <li><a HREF="#Property Invariants">Property Invariants</a> </li>
+
+ <li><a HREF="#Modification History">Modification History</a> </li>
+
+</ul>
+
+
+
+<p><b>Warning: </b>the information in this file does not completely describe the use and
+
+interpretation of Unicode character properties and behavior. It must be used in
+
+conjunction with the data in the other files in the Unicode Character Database, and relies
+
+on the notation and definitions supplied in <i><a href="http://www.unicode.org/unicode/standard/versions/Unicode3.0.html"> The Unicode
+Standard</a></i>. All chapter references
+
+are to Version 3.0 of the standard.</p>
+
+
+
+<h2><a NAME="Field Formats"></a>Field Formats</h2>
+
+
+
+<p>The file consists of lines containing fields terminated by semicolons. Each line
+
+represents the data for one encoded character in the Unicode Standard. Every encoded
+
+character has a data entry, with the exception of certain special ranges, as detailed
+
+below.
+
+
+
+<ul>
+
+ <li>There are six special ranges of characters that are represented only by their start and
+
+ end characters, since the properties in the file are uniform, except for code values
+
+ (which are all sequential and assigned). </li>
+
+ <li>The names of CJK ideograph characters and the names and decompositions of Hangul
+
+ syllable characters are algorithmically derivable. (See the Unicode Standard and <a
+
+ HREF="http://www.unicode.org/unicode/reports/tr15/">Unicode Technical Report #15</a> for
+
+ more information). </li>
+
+ <li>Surrogate code values and private use characters have no names. </li>
+
+ <li>The Private Use character outside of the BMP (U+F0000..U+FFFFD, U+100000..U+10FFFD) are
+
+ not listed. These correspond to surrogate pairs where the first surrogate is in the High
+
+ Surrogate Private Use section. </li>
+
+</ul>
+
+
+
+<p>The exact ranges represented by start and end characters are:
+
+
+
+<ul>
+
+ <li>CJK Ideographs Extension A (U+3400 - U+4DB5) </li>
+
+ <li>CJK Ideographs (U+4E00 - U+9FA5) </li>
+
+ <li>Hangul Syllables (U+AC00 - U+D7A3) </li>
+
+ <li>Non-Private Use High Surrogates (U+D800 - U+DB7F) </li>
+
+ <li>Private Use High Surrogates (U+DB80 - U+DBFF) </li>
+
+ <li>Low Surrogates (U+DC00 - U+DFFF) </li>
+
+ <li>The Private Use Area (U+E000 - U+F8FF) </li>
+
+</ul>
+
+
+
+<p>The following table describes the format and meaning of each field in a data entry in
+
+the UnicodeData file. Fields which contain normative information are so indicated.</p>
+
+
+
+<table BORDER="1" CELLSPACING="2" CELLPADDING="2">
+
+ <tr>
+
+ <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Field</th>
+
+ <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Name</th>
+
+ <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Status</th>
+
+ <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Explanation</th>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">0</th>
+
+ <td VALIGN="top">Code value</td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">Code value in 4-digit hexadecimal format.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">1</th>
+
+ <td VALIGN="top">Character name</td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">These names match exactly the names published in Chapter 14 of the
+
+ Unicode Standard, Version 3.0.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">2</th>
+
+ <td VALIGN="top"><a HREF="#General Category">General Category</a> </td>
+
+ <td VALIGN="top">normative / informative<br>
+
+ (see below)</td>
+
+ <td VALIGN="top">This is a useful breakdown into various &quot;character types&quot; which
+
+ can be used as a default categorization in implementations. See below for a brief
+
+ explanation.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">3</th>
+
+ <td VALIGN="top"><a HREF="#Canonical Combining Classes">Canonical Combining Classes</a> </td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">The classes used for the Canonical Ordering Algorithm in the Unicode
+
+ Standard. These classes are also printed in Chapter 4 of the Unicode Standard.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">4</th>
+
+ <td VALIGN="top"><a HREF="#Bidirectional Category">Bidirectional Category</a> </td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">See the list below for an explanation of the abbreviations used in this
+
+ field. These are the categories required by the Bidirectional Behavior Algorithm in the
+
+ Unicode Standard. These categories are summarized in Chapter 3 of the Unicode Standard.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">5</th>
+
+ <td VALIGN="top"><a HREF="#Character Decomposition">Character Decomposition
+ Mapping</a></td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">In the Unicode Standard, not all of the mappings are full (maximal)
+
+ decompositions. Recursive application of look-up for decompositions will, in all cases,
+
+ lead to a maximal decomposition. The decomposition mappings match exactly the
+
+ decomposition mappings published with the character names in the Unicode Standard.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">6</th>
+
+ <td VALIGN="top">Decimal digit value</td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">This is a numeric field. If the character has the decimal digit property,
+
+ as specified in Chapter 4 of the Unicode Standard, the value of that digit is represented
+
+ with an integer value in this field</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">7</th>
+
+ <td VALIGN="top">Digit value</td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">This is a numeric field. If the character represents a digit, not
+
+ necessarily a decimal digit, the value is here. This covers digits which do not form
+
+ decimal radix forms, such as the compatibility superscript digits</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">8</th>
+
+ <td VALIGN="top">Numeric value</td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">This is a numeric field. If the character has the numeric property, as
+
+ specified in Chapter 4 of the Unicode Standard, the value of that character is represented
+
+ with an integer or rational number in this field. This includes fractions as, e.g.,
+
+ &quot;1/5&quot; for U+2155 VULGAR FRACTION ONE FIFTH Also included are numerical values
+
+ for compatibility characters such as circled numbers.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">8</th>
+
+ <td VALIGN="top">Mirrored</td>
+
+ <td VALIGN="top">normative</td>
+
+ <td VALIGN="top">If the character has been identified as a &quot;mirrored&quot; character
+
+ in bidirectional text, this field has the value &quot;Y&quot;; otherwise &quot;N&quot;.
+
+ The list of mirrored characters is also printed in Chapter 4 of the Unicode Standard.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">10</th>
+
+ <td VALIGN="top">Unicode 1.0 Name</td>
+
+ <td VALIGN="top">informative</td>
+
+ <td VALIGN="top">This is the old name as published in Unicode 1.0. This name is only
+
+ provided when it is significantly different from the Unicode 3.0 name for the character.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">11</th>
+
+ <td VALIGN="top">10646 comment field</td>
+
+ <td VALIGN="top">informative</td>
+
+ <td VALIGN="top">This is the ISO 10646 comment field. It is in parantheses in the 10646
+
+ names list.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">12</th>
+
+ <td VALIGN="top"><a HREF="#Case Mappings">Uppercase Mapping</a></td>
+
+ <td VALIGN="top">informative</td>
+
+ <td VALIGN="top">Upper case equivalent mapping. If a character is part of an alphabet with
+
+ case distinctions, and has an upper case equivalent, then the upper case equivalent is in
+
+ this field. See the explanation below on case distinctions. These mappings are always
+
+ one-to-one, not one-to-many or many-to-one. This field is informative.</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">13</th>
+
+ <td VALIGN="top"><a HREF="#Case Mappings">Lowercase Mapping</a></td>
+
+ <td VALIGN="top">informative</td>
+
+ <td VALIGN="top">Similar to Uppercase mapping</td>
+
+ </tr>
+
+ <tr>
+
+ <th VALIGN="top">14</th>
+
+ <td VALIGN="top"><a HREF="#Case Mappings">Titlecase Mapping</a></td>
+
+ <td VALIGN="top">informative</td>
+
+ <td VALIGN="top">Similar to Uppercase mapping</td>
+
+ </tr>
+
+</table>
+
+
+
+<h3><a NAME="General Category"></a>General Category</h3>
+
+
+
+<p>The values in this field are abbreviations for the following. Some of the values are
+
+normative, and some are informative. For more information, see the Unicode Standard.</p>
+
+
+
+<p><b>Note:</b> the standard does not assign information to control characters (except for
+
+certain cases in the Bidirectional Algorithm). Implementations will generally also assign
+
+categories to certain control characters, notably CR and LF, according to platform
+
+conventions.</p>
+
+
+
+<h4>Normative Categories</h4>
+
+
+
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">
+
+ <tr>
+
+ <th><p ALIGN="LEFT">Abbr.</th>
+
+ <th><p ALIGN="LEFT">Description</th>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Lu</td>
+
+ <td>Letter, Uppercase</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Ll</td>
+
+ <td>Letter, Lowercase</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Lt</td>
+
+ <td>Letter, Titlecase</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Mn</td>
+
+ <td>Mark, Non-Spacing</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Mc</td>
+
+ <td>Mark, Spacing Combining</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Me</td>
+
+ <td>Mark, Enclosing</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Nd</td>
+
+ <td>Number, Decimal Digit</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Nl</td>
+
+ <td>Number, Letter</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">No</td>
+
+ <td>Number, Other</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Zs</td>
+
+ <td>Separator, Space</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Zl</td>
+
+ <td>Separator, Line</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Zp</td>
+
+ <td>Separator, Paragraph</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Cc</td>
+
+ <td>Other, Control</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Cf</td>
+
+ <td>Other, Format</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Cs</td>
+
+ <td>Other, Surrogate</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Co</td>
+
+ <td>Other, Private Use</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Cn</td>
+
+ <td>Other, Not Assigned (no characters in the file have this property)</td>
+
+ </tr>
+
+</table>
+
+
+
+<h4>Informative Categories</h4>
+
+
+
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">
+
+ <tr>
+
+ <th><p ALIGN="LEFT">Abbr.</th>
+
+ <th><p ALIGN="LEFT">Description</th>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Lm</td>
+
+ <td>Letter, Modifier</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Lo</td>
+
+ <td>Letter, Other</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Pc</td>
+
+ <td>Punctuation, Connector</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Pd</td>
+
+ <td>Punctuation, Dash</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Ps</td>
+
+ <td>Punctuation, Open</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Pe</td>
+
+ <td>Punctuation, Close</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Pi</td>
+
+ <td>Punctuation, Initial quote (may behave like Ps or Pe depending on usage)</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Pf</td>
+
+ <td>Punctuation, Final quote (may behave like Ps or Pe depending on usage)</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Po</td>
+
+ <td>Punctuation, Other</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Sm</td>
+
+ <td>Symbol, Math</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Sc</td>
+
+ <td>Symbol, Currency</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">Sk</td>
+
+ <td>Symbol, Modifier</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">So</td>
+
+ <td>Symbol, Other</td>
+
+ </tr>
+
+</table>
+
+
+
+<h3><a NAME="Bidirectional Category"></a>Bidirectional Category</h3>
+
+
+
+<p>Please refer to Chapter 3 for an explanation of the algorithm for Bidirectional
+
+Behavior and an explanation of the significance of these categories. An up-to-date version
+
+can be found on <a HREF="http://www.unicode.org/unicode/reports/tr9/">Unicode Technical
+
+Report #9: The Bidirectional Algorithm</a>. These values are normative.</p>
+
+
+
+<table BORDER="0" CELLPADDING="2">
+
+ <tr>
+
+ <th VALIGN="TOP" ALIGN="LEFT"><p ALIGN="LEFT">Type</th>
+
+ <th VALIGN="TOP" ALIGN="LEFT"><p ALIGN="LEFT">Description</th>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>L</b></td>
+
+ <td VALIGN="TOP">Left-to-Right</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>LRE</b></td>
+
+ <td VALIGN="TOP">Left-to-Right Embedding</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>LRO</b></td>
+
+ <td VALIGN="TOP">Left-to-Right Override</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>R</b></td>
+
+ <td VALIGN="TOP">Right-to-Left</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>AL</b></td>
+
+ <td VALIGN="TOP">Right-to-Left Arabic</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>RLE</b></td>
+
+ <td VALIGN="TOP">Right-to-Left Embedding</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>RLO</b></td>
+
+ <td VALIGN="TOP">Right-to-Left Override</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>PDF</b></td>
+
+ <td VALIGN="TOP">Pop Directional Format</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>EN</b></td>
+
+ <td VALIGN="TOP">European Number</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>ES</b></td>
+
+ <td VALIGN="TOP">European Number Separator</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>ET</b></td>
+
+ <td VALIGN="TOP">European Number Terminator</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>AN</b></td>
+
+ <td VALIGN="TOP">Arabic Number</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>CS</b></td>
+
+ <td VALIGN="TOP">Common Number Separator</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>NSM</b></td>
+
+ <td VALIGN="TOP">Non-Spacing Mark</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>BN</b></td>
+
+ <td VALIGN="TOP">Boundary Neutral</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>B</b></td>
+
+ <td VALIGN="TOP">Paragraph Separator</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>S</b></td>
+
+ <td VALIGN="TOP">Segment Separator</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>WS</b></td>
+
+ <td VALIGN="TOP">Whitespace</td>
+
+ </tr>
+
+ <tr>
+
+ <td VALIGN="TOP"><b>ON</b></td>
+
+ <td VALIGN="TOP">Other Neutrals</td>
+
+ </tr>
+
+</table>
+
+
+
+<h3><a NAME="Character Decomposition"></a>Character Decomposition Mapping</h3>
+
+
+
+<p>The decomposition is a normative property of a character. The tags supplied with
+
+certain decomposition mappings generally indicate formatting information. Where no such
+
+tag is given, the mapping is designated as canonical. Conversely, the presence of a
+
+formatting tag also indicates that the mapping is a compatibility mapping and not a
+
+canonical mapping. In the absence of other formatting information in a compatibility
+
+mapping, the tag is used to distinguish it from canonical mappings.</p>
+
+
+
+<p>In some instances a canonical mapping or a compatibility mapping may consist of a
+
+single character. For a canonical mapping, this indicates that the character is a
+
+canonical equivalent of another single character. For a compatibility mapping, this
+
+indicates that the character is a compatibility equivalent of another single character.
+
+The compatibility formatting tags used are:</p>
+
+
+
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">
+
+ <tr>
+
+ <th>Tag</th>
+
+ <th><p ALIGN="LEFT">Description</th>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;font&gt;&nbsp;&nbsp;</td>
+
+ <td>A font variant (e.g. a blackletter form).</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;noBreak&gt;&nbsp;&nbsp;</td>
+
+ <td>A no-break version of a space or hyphen.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;initial&gt;&nbsp;&nbsp;</td>
+
+ <td>An initial presentation form (Arabic).</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;medial&gt;&nbsp;&nbsp;</td>
+
+ <td>A medial presentation form (Arabic).</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;final&gt;&nbsp;&nbsp;</td>
+
+ <td>A final presentation form (Arabic).</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;isolated&gt;&nbsp;&nbsp;</td>
+
+ <td>An isolated presentation form (Arabic).</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;circle&gt;&nbsp;&nbsp;</td>
+
+ <td>An encircled form.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;super&gt;&nbsp;&nbsp;</td>
+
+ <td>A superscript form.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;sub&gt;&nbsp;&nbsp;</td>
+
+ <td>A subscript form.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;vertical&gt;&nbsp;&nbsp;</td>
+
+ <td>A vertical layout presentation form.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;wide&gt;&nbsp;&nbsp;</td>
+
+ <td>A wide (or zenkaku) compatibility character.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;narrow&gt;&nbsp;&nbsp;</td>
+
+ <td>A narrow (or hankaku) compatibility character.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;small&gt;&nbsp;&nbsp;</td>
+
+ <td>A small variant form (CNS compatibility).</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;square&gt;&nbsp;&nbsp;</td>
+
+ <td>A CJK squared font variant.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;fraction&gt;&nbsp;&nbsp;</td>
+
+ <td>A vulgar fraction form.</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="CENTER">&lt;compat&gt;&nbsp;&nbsp;</td>
+
+ <td>Otherwise unspecified compatibility character.</td>
+
+ </tr>
+
+</table>
+
+
+
+<p><b>Reminder: </b>There is a difference between decomposition and decomposition mapping.
+
+The decomposition mappings are defined in the UnicodeData, while the decomposition (also
+
+termed &quot;full decomposition&quot;) is defined in Chapter 3 to use those mappings
+<i>
+
+recursively.</i>
+
+
+
+<ul>
+
+ <li>The canonical decomposition is formed by recursively applying the canonical mappings,
+
+ then applying the canonical reordering algorithm. </li>
+
+ <li>The compatibility decomposition is formed by recursively applying the canonical <em>and</em>
+
+ compatibility mappings, then applying the canonical reordering algorithm. </li>
+
+</ul>
+
+
+
+<h3><a NAME="Canonical Combining Classes"></a>Canonical Combining Classes</h3>
+
+
+
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">
+
+ <tr>
+
+ <th><p ALIGN="LEFT">Value</th>
+
+ <th><p ALIGN="LEFT">Description</th>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">0:</td>
+
+ <td>Spacing, split, enclosing, reordrant, and Tibetan subjoined</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">1:</td>
+
+ <td>Overlays and interior</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">7:</td>
+
+ <td>Nuktas</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">8:</td>
+
+ <td>Hiragana/Katakana voicing marks</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">9:</td>
+
+ <td>Viramas</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">10:</td>
+
+ <td>Start of fixed position classes</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">199:</td>
+
+ <td>End of fixed position classes</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">200:</td>
+
+ <td>Below left attached</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">202:</td>
+
+ <td>Below attached</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">204:</td>
+
+ <td>Below right attached</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">208:</td>
+
+ <td>Left attached (reordrant around single base character)</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">210:</td>
+
+ <td>Right attached</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">212:</td>
+
+ <td>Above left attached</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">214:</td>
+
+ <td>Above attached</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">216:</td>
+
+ <td>Above right attached</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">218:</td>
+
+ <td>Below left</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">220:</td>
+
+ <td>Below</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">222:</td>
+
+ <td>Below right</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">224:</td>
+
+ <td>Left (reordrant around single base character)</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">226:</td>
+
+ <td>Right</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">228:</td>
+
+ <td>Above left</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">230:</td>
+
+ <td>Above</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">232:</td>
+
+ <td>Above right</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">233:</td>
+
+ <td>Double below</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">234:</td>
+
+ <td>Double above</td>
+
+ </tr>
+
+ <tr>
+
+ <td ALIGN="RIGHT">240:</td>
+
+ <td>Below (iota subscript)</td>
+
+ </tr>
+
+</table>
+
+
+
+<p><strong>Note: </strong>some of the combining classes in this list do not currently have
+
+members but are specified here for completeness.</p>
+
+
+
+<h3><a NAME="Decompositions and Normalization"></a>Decompositions and Normalization</h3>
+
+
+
+<p>Decomposition is specified in Chapter 3. <a href="http://www.unicode.org/unicode/reports/tr15/"><i>Unicode Technical Report #15:
+
+Normalization Forms</i></a> specifies the interaction between decomposition and normalization. The
+
+most up-to-date version is found on <a HREF="http://www.unicode.org/unicode/reports/tr15/">http://www.unicode.org/unicode/reports/tr15/</a>.
+
+That report specifies how the decompositions defined in UnicodeData.txt are used to derive
+
+normalized forms of Unicode text.</p>
+
+
+
+<p>Note that as of the 2.1.9 update of the Unicode Character Database, the decompositions
+
+in the UnicodeData.txt file can be used to recursively derive the full decomposition in
+
+canonical order, without the need to separately apply canonical reordering. However,
+
+canonical reordering of combining character sequences must still be applied in
+
+decomposition when normalizing source text which contains any combining marks.</p>
+
+
+
+<h3><a NAME="Case Mappings"></a>Case Mappings</h3>
+
+
+
+<p>The case mapping is an informative, default mapping. Case itself, on the other hand,
+
+has normative status. Thus, for example, 0041 LATIN CAPITAL LETTER A is normatively
+
+uppercase, but its lowercase mapping the 0061 LATIN SMALL LETTER A is informative. The
+
+reason for this is that case can be considered to be an inherent property of a particular
+
+character (and is usually, but not always, derivable from the presence of the terms
+
+&quot;CAPITAL&quot; or &quot;SMALL&quot; in the character name), but case mappings between
+
+characters are occasionally influenced by local conventions. For example, certain
+
+languages, such as Turkish, German, French, or Greek may have small deviations from the
+
+default mappings listed in UnicodeData.</p>
+
+
+
+<p>In addition to uppercase and lowercase, because of the inclusion of certain composite
+
+characters for compatibility, such as 01F1 LATIN CAPITAL LETTER DZ, there is a third case,
+
+called <i>titlecase</i>, which is used where the first letter of a word is to be
+
+capitalized (e.g. UPPERCASE, Titlecase, lowercase). An example of such a titlecase letter
+
+is 01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z.</p>
+
+
+
+<p>The uppercase, titlecase and lowercase fields are only included for characters that
+
+have a single corresponding character of that type. Composite characters (such as
+
+&quot;339D SQUARE CM&quot;) that do not have a single corresponding character of that type
+
+can be cased by decomposition.</p>
+
+
+
+<p>For compatibility with existing parsers, UnicodeData only contains case mappings for
+
+characters where they are one-to-one mappings; it also omits information about
+
+context-sensitive case mappings. Information about these special cases can be found in a
+
+separate data file, SpecialCasing.txt,
+
+which has been added starting with the 2.1.8 update to the Unicode data files.
+
+SpecialCasing.txt contains additional informative case mappings that are either not
+
+one-to-one or which are context-sensitive.</p>
+
+
+
+<h2><a NAME="Property Invariants"></a>Property Invariants</h2>
+
+
+
+<p>Values in UnicodeData.txt are subject to correction as errors are found; however, some
+
+characteristics of the categories themselves can be considered invariants. Applications
+
+may wish to take these invariants into account when choosing how to implement character
+
+properties. The following is a partial list of known invariants for the Unicode Character
+
+Database.</p>
+
+
+
+<h4>Database Fields</h4>
+
+
+
+<ul>
+
+ <li>The number of fields in UnicodeData.txt is fixed. </li>
+
+ <li>The order of the fields is also fixed. <ul>
+
+ <li>Any additional information about character properties to be added in the future will
+
+ appear in separate data tables, rather than being added on to the existing table or by
+
+ subdivision or reinterpretation of existing fields. </li>
+
+ </ul>
+
+ </li>
+
+</ul>
+
+
+
+<h4>General Category</h4>
+
+
+
+<ul>
+
+ <li>There will never be more than 32 General Category values. <ul>
+
+ <li>It is very unlikely that the Unicode Technical Committee will subdivide the General
+
+ Category partition any further, since that can cause implementations to misbehave. Because
+
+ the General Category is limited to 32 values, 5 bits can be used to represent the
+
+ information, and a 32-bit integer can be used as a bitmask to represent arbitrary sets of
+
+ categories. </li>
+
+ </ul>
+
+ </li>
+
+</ul>
+
+
+
+<h4>Combining Classes</h4>
+
+
+
+<ul>
+
+ <li>Combining classes are limited to the values 0 to 255. <ul>
+
+ <li>In practice, there are far fewer than 256 values used. Implementations may take
+
+ advantage of this fact for compression, since only the ordering of the non-zero values
+
+ matters for the Canonical Reordering Algorithm. It is possible for up to 256 values to be
+
+ used in the future; however, UTC decisions in the future may restrict the number of values
+
+ to 128, since this has implementation advantages. [Signed bytes can be used without
+
+ widening to ints in Java, for example.] </li>
+
+ </ul>
+
+ </li>
+
+ <li>All characters other than those of General Category M* have the combining class 0. <ul>
+
+ <li>Currently, all characters other than those of General Category Mn have the value 0.
+
+ However, some characters of General Category Me or Mc may be given non-zero values in the
+
+ future. </li>
+
+ <li>The precise values above the value 0 are not invariant--only the relative ordering is
+
+ considered normative. For example, it is not guaranteed in future versions that the class
+
+ of U+05B4 will be precisely 14. </li>
+
+ </ul>
+
+ </li>
+
+</ul>
+
+
+
+<h4>Case</h4>
+
+
+
+<ul>
+
+ <li>Characters of type Lu, Lt, or Ll are called <i>cased</i>. All characters with an Upper,
+
+ Lower, or Titlecase mapping are cased characters. <ul>
+
+ <li>However, characters with the General Categories of Lu, Ll, or Lt may not always have
+
+ case mappings, and case mappings may vary by locale. (See
+
+ ftp://ftp.unicode.org/Public/UNIDATA/SpecialCasing.txt). </li>
+
+ </ul>
+
+ </li>
+
+</ul>
+
+
+
+<h4>Canonical Decomposition</h4>
+
+
+
+<ul>
+
+ <li>Canonical mappings are always in canonical order. </li>
+
+ <li>Canonical mappings have only the first of a pair possibly further decomposing. </li>
+
+ <li>Canonical decompositions are &quot;transparent&quot; to other character data: <ul>
+
+ <li><tt>BIDI(a) = BIDI(principal(canonicalDecomposition(a))</tt> </li>
+
+ <li><tt>Category(a) = Category(principal(canonicalDecomposition(a))</tt> </li>
+
+ <li><tt>CombiningClass(a) = CombiningClass(principal(canonicalDecomposition(a))</tt><br>
+
+ where principal(a) is the first character not of type Mn, or the first character if all
+
+ characters are of type Mn. </li>
+
+ </ul>
+
+ </li>
+
+ <li>However, because there are sometimes missing case pairs, and because of some legacy
+
+ characters, it is only generally true that: <ul>
+
+ <li><tt>upper(canonicalDecomposition(a)) = canonicalDecomposition(upper(a))</tt> </li>
+
+ <li><tt>lower(canonicalDecomposition(a)) = canonicalDecomposition(lower(a))</tt> </li>
+
+ <li><tt>title(canonicalDecomposition(a)) = canonicalDecomposition(title(a))</tt> </li>
+
+ </ul>
+
+ </li>
+
+</ul>
+
+
+
+<h2><a NAME="Modification History"></a>Modification History</h2>
+
+
+
+<p>This section provides a summary of the changes between update versions of the Unicode
+
+Standard.</p>
+
+
+
+<h3><a href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 3.0.0"> Unicode 3.0.0</a></h3>
+
+
+
+<p>Modifications made for Version 3.0.0 of UnicodeData.txt include many new characters and
+
+a number of property changes. These are summarized in Appendex D of <em>The Unicode
+
+Standard, Version 3.0.</em></p>
+
+
+
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.9">Unicode 2.1.9</a> </h3>
+
+
+
+<p>Modifications made for Version 2.1.9 of UnicodeData.txt include:
+
+
+
+<ul>
+
+ <li>Corrected combining class for U+05AE HEBREW ACCENT ZINOR. </li>
+
+ <li>Corrected combining class for U+20E1 COMBINING LEFT RIGHT ARROW ABOVE </li>
+
+ <li>Corrected combining class for U+0F35 and U+0F37 to 220. </li>
+
+ <li>Corrected combining class for U+0F71 to 129. </li>
+
+ <li>Added a decomposition for U+0F0C TIBETAN MARK DELIMITER TSHEG BSTAR. </li>
+
+ <li>Added&nbsp; decompositions for several Greek symbol letters: U+03D0..U+03D2, U+03D5,
+
+ U+03D6, U+03F0..U+03F2. </li>
+
+ <li>Removed&nbsp; decompositions from the conjoining jamo block: U+1100..U+11F8. </li>
+
+ <li>Changes to decomposition mappings for some Tibetan vowels for consistency in
+
+ normalization. (U+0F71, U+0F73, U+0F77, U+0F79, U+0F81) </li>
+
+ <li>Updated the decomposition mappings for several Vietnamese characters with two diacritics
+
+ (U+1EAC, U+1EAD, U+1EB6, U+1EB7, U+1EC6, U+1EC7, U+1ED8, U+1ED9), so that the recursive
+
+ decomposition can be generated directly in canonically reordered form (not a normative
+
+ change). </li>
+
+ <li>Updated the decomposition mappings for several Arabic compatibility characters involving
+
+ shadda (U+FC5E..U+FC62, U+FCF2..U+FCF4), and two Latin characters (U+1E1C, U+1E1D), so
+
+ that the decompositions are generated directly in canonically reordered form (not a
+
+ normative change). </li>
+
+ <li>Changed BIDI category for: U+00A0 NO-BREAK SPACE, U+2007 FIGURE SPACE, U+2028 LINE
+
+ SEPARATOR. </li>
+
+ <li>Changed BIDI category for extenders of General Category Lm: U+3005, U+3021..U+3035,
+
+ U+FF9E, U+FF9F. </li>
+
+ <li>Changed General Category and BIDI category for the Greek numeral signs: U+0374, U+0375. </li>
+
+ <li>Corrected General Category for U+FFE8 HALFWIDTH FORMS LIGHT VERTICAL. </li>
+
+ <li>Added Unicode 1.0 names for many Tibetan characters (informative). </li>
+
+</ul>
+
+
+
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.8">Unicode 2.1.8</a> </h3>
+
+
+
+<p>Modifications made for Version 2.1.8 of UnicodeData.txt include:
+
+
+
+<ul>
+
+ <li>Added combining class 240 for U+0345 COMBINING GREEK YPOGEGRAMMENI so that
+
+ decompositions involving iota subscript are derivable directly in canonically reordered
+
+ form; this also has a bearing on simplification of casing of polytonic Greek. </li>
+
+ <li>Changes in decompositions related to Greek tonos. These result from the clarification
+
+ that monotonic Greek &quot;tonos&quot; should be equated with U+0301 COMBINING ACUTE,
+
+ rather than with U+030D COMBINING VERTICAL LINE ABOVE. (All Greek characters in the Greek
+
+ block involving &quot;tonos&quot;; some Greek characters in the polytonic Greek in the
+
+ 1FXX block.) </li>
+
+ <li>Changed decompositions involving dialytika tonos. (U+0390, U+03B0) </li>
+
+ <li>Changed ternary decompositions to binary. (U+0CCB, U+FB2C, U+FB2D) These changes
+
+ simplify normalization. </li>
+
+ <li>Removed canonical decomposition for Latin Candrabindu. (U+0310) </li>
+
+ <li>Corrected error in canonical decomposition for U+1FF4. </li>
+
+ <li>Added compatibility decompositions to clarify collation tables. (U+2100, U+2101, U+2105,
+
+ U+2106, U+1E9A) </li>
+
+ <li>A series of general category changes to assist the convergence of of Unicode definition
+
+ of identifier with ISO TR 10176: <ul>
+
+ <li>So &gt; Lo: U+0950, U+0AD0, U+0F00, U+0F88..U+0F8B </li>
+
+ <li>Po &gt; Lo: U+0E2F, U+0EAF, U+3006 </li>
+
+ <li>Lm &gt; Sk: U+309B, U+309C </li>
+
+ <li>Po &gt; Pc: U+30FB, U+FF65 </li>
+
+ <li>Ps/Pe &gt; Mn: U+0F3E, U+0F3F </li>
+
+ </ul>
+
+ </li>
+
+ <li>A series of bidi property changes for consistency. <ul>
+
+ <li>L &gt; ET: U+09F2, U+09F3 </li>
+
+ <li>ON &gt; L: U+3007 </li>
+
+ <li>L &gt; ON: U+0F3A..U+0F3D, U+037E, U+0387 </li>
+
+ </ul>
+
+ </li>
+
+ <li>Add case mapping: U+01A6 &lt;-&gt; U+0280 </li>
+
+ <li>Updated symmetric swapping value for guillemets: U+00AB, U+00BB, U+2039, U+203A. </li>
+
+ <li>Changes to combining class values. Most Indic fixed position class non-spacing marks
+
+ were changed to combining class 0. This fixes some inconsistencies in how canonical
+
+ reordering would apply to Indic scripts, including Tibetan. Indic interacting top/bottom
+
+ fixed position classes were merged into single (non-zero) classes as part of this change.
+
+ Tibetan subjoined consonants are changed from combining class 6 to combining class 0. Thai
+
+ pinthu (U+0E3A) moved to combining class 9. Moved two Devanagari stress marks into generic
+
+ above and below combining classes (U+0951, U+0952). </li>
+
+ <li>Corrected placement of semicolon near symmetric swapping field. (U+FA0E, etc., scattered
+
+ positions to U+FA29) </li>
+
+</ul>
+
+
+
+<h3>Version 2.1.7</h3>
+
+
+
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>
+
+
+
+<h3>Version 2.1.6</h3>
+
+
+
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>
+
+
+
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.5">Unicode 2.1.5</a> </h3>
+
+
+
+<p>Modifications made for Version 2.1.5 of UnicodeData.txt include:
+
+
+
+<ul>
+
+ <li>Changed decomposition for U+FF9E and U+FF9F so that correct collation weighting will
+
+ automatically result from the canonical equivalences. </li>
+
+ <li>Removed canonical decompositions for U+04D4, U+04D5, U+04D8, U+04D9, U+04E0, U+04E1,
+
+ U+04E8, U+04E9 (the implication being that no canonical equivalence is claimed between
+
+ these 8 characters and similar Latin letters), and updated 4 canonical decompositions for
+
+ U+04DB, U+04DC, U+04EA, U+04EB to reflect the implied difference in the base character. </li>
+
+ <li>Added Pi, and Pf categories and assigned the relevant quotation marks to those
+
+ categories, based on the Unicode Technical Corrigendum on Quotation Characters. </li>
+
+ <li>Updating of many bidi properties, following the advice of the ad hoc committee on bidi,
+
+ and to make the bidi properties of compatibility characters more consistent. </li>
+
+ <li>Changed category of several Tibetan characters: U+0F3E, U+0F3F, U+0F88..U+0F8B to make
+
+ them non-combining, reflecting the combined opinion of Tibetan experts. </li>
+
+ <li>Added case mapping for U+03F2. </li>
+
+ <li>Corrected case mapping for U+0275. </li>
+
+ <li>Added titlecase mappings for U+03D0, U+03D1, U+03D5, U+03D6, U+03F0.. U+03F2. </li>
+
+ <li>Corrected compatibility label for U+2121. </li>
+
+ <li>Add specific entries for all the CJK compatibility ideographs, U+F900..U+FA2D, so the
+
+ canonical decomposition for each (the URO character it is equivalent to) can be carried in
+
+ the database. </li>
+
+</ul>
+
+
+
+<h3>Version 2.1.4</h3>
+
+
+
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>
+
+
+
+<h3>Version 2.1.3</h3>
+
+
+
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>
+
+
+
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.2">Unicode 2.1.2</a> </h3>
+
+
+
+<p>Modifications made in updating UnicodeData.txt to Version 2.1.2 for the Unicode
+
+Standard, Version 2.1 (from Version 2.0) include:
+
+
+
+<ul>
+
+ <li>Added two characters (U+20AC and U+FFFC). </li>
+
+ <li>Amended bidi properties for U+0026, U+002E, U+0040, U+2007. </li>
+
+ <li>Corrected case mappings for U+018E, U+019F, U+01DD, U+0258, U+0275, U+03C2, U+1E9B. </li>
+
+ <li>Changed combining order class for U+0F71. </li>
+
+ <li>Corrected canonical decompositions for U+0F73, U+1FBE. </li>
+
+ <li>Changed decomposition for U+FB1F from compatibility to canonical. </li>
+
+ <li>Added compatibility decompositions for U+FBE8, U+FBE9, U+FBF9..U+FBFB. </li>
+
+ <li>Corrected compatibility decompositions for U+2469, U+246A, U+3358. </li>
+
+</ul>
+
+
+
+<h3>Version 2.1.1</h3>
+
+
+
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>
+
+
+
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.0.0">Unicode 2.0.0</a> </h3>
+
+
+
+<p>The modifications made in updating UnicodeData.txt for the Unicode
+
+Standard, Version 2.0 include:
+
+
+
+<ul>
+
+ <li>Fixed decompositions with TONOS to use correct NSM: 030D. </li>
+
+ <li>Removed old Hangul Syllables; mapping to new characters are in a separate table. </li>
+
+ <li>Marked compatibility decompositions with additional tags. </li>
+
+ <li>Changed old tag names for clarity. </li>
+
+ <li>Revision of decompositions to use first-level decomposition, instead of maximal
+
+ decomposition. </li>
+
+ <li>Correction of all known errors in decompositions from earlier versions. </li>
+
+ <li>Added control code names (as old Unicode names). </li>
+
+ <li>Added Hangul Jamo decompositions. </li>
+
+ <li>Added Number category to match properties list in book. </li>
+
+ <li>Fixed categories of Koranic Arabic marks. </li>
+
+ <li>Fixed categories of precomposed characters to match decomposition where possible. </li>
+
+ <li>Added Hebrew cantillation marks and the Tibetan script. </li>
+
+ <li>Added place holders for ranges such as CJK Ideographic Area and the Private Use Area. </li>
+
+ <li>Added categories Me, Sk, Pc, Nl, Cs, Cf, and rectified a number of mistakes in the
+
+ database. </li>
+
+</ul>
+
+</body>
+
+</html>
+
diff --git a/contrib/perl5/lib/unicode/mktables.PL b/contrib/perl5/lib/unicode/mktables.PL
new file mode 100755
index 0000000..cef6936
--- /dev/null
+++ b/contrib/perl5/lib/unicode/mktables.PL
@@ -0,0 +1,339 @@
+#!../../miniperl
+
+$UnicodeData = "Unicode.300";
+
+# Note: we try to keep filenames unique within first 8 chars. Using
+# subdirectories for the following helps.
+mkdir "In", 0777;
+mkdir "Is", 0777;
+mkdir "To", 0777;
+
+@todo = (
+# typical
+
+ ['IsWord', '$cat =~ /^L[ulo]|^Nd/ or $code eq "005F"', ''],
+ ['IsAlnum', '$cat =~ /^L[ulo]|^Nd/', ''],
+ ['IsAlpha', '$cat =~ /^L[ulo]/', ''],
+ ['IsSpace', '$cat =~ /^Z/ or $code lt "0020" and chr(hex $code) =~ /^\s/', ''],
+ ['IsDigit', '$cat =~ /^Nd$/', ''],
+ ['IsUpper', '$cat =~ /^Lu$/', ''],
+ ['IsLower', '$cat =~ /^Ll$/', ''],
+ ['IsASCII', 'hex $code <= 127', ''],
+ ['IsCntrl', '$cat =~ /^C/', ''],
+ ['IsGraph', '$cat =~ /^[^C]/ and $code ne "0020"', ''],
+ ['IsPrint', '$cat =~ /^[^C]/', ''],
+ ['IsPunct', '$cat =~ /^P/', ''],
+ ['IsXDigit', '$code =~ /^00(3[0-9]|[46][1-6])$/', ''],
+ ['ToUpper', '$up', '$up'],
+ ['ToLower', '$down', '$down'],
+ ['ToTitle', '$title', '$title'],
+ ['ToDigit', '$dec ne ""', '$dec'],
+
+# Name
+
+ ['Name', '$name', '$name'],
+
+# Category
+
+ ['Category', '$cat', '$cat'],
+
+# Normative
+
+ ['IsM', '$cat =~ /^M/', ''], # Mark
+ ['IsMn', '$cat eq "Mn"', ''], # Mark, Non-Spacing
+ ['IsMc', '$cat eq "Mc"', ''], # Mark, Combining
+
+ ['IsN', '$cat =~ /^N/', ''], # Number
+ ['IsNd', '$cat eq "Nd"', ''], # Number, Decimal Digit
+ ['IsNo', '$cat eq "No"', ''], # Number, Other
+
+ ['IsZ', '$cat =~ /^Z/', ''], # Zeparator
+ ['IsZs', '$cat eq "Zs"', ''], # Separator, Space
+ ['IsZl', '$cat eq "Zl"', ''], # Separator, Line
+ ['IsZp', '$cat eq "Zp"', ''], # Separator, Paragraph
+
+ ['IsC', '$cat =~ /^C/', ''], # Crazy
+ ['IsCc', '$cat eq "Cc"', ''], # Other, Control or Format
+ ['IsCo', '$cat eq "Co"', ''], # Other, Private Use
+ ['IsCn', '$cat eq "Cn"', ''], # Other, Not Assigned
+
+# Informative
+
+ ['IsL', '$cat =~ /^L/', ''], # Letter
+ ['IsLu', '$cat eq "Lu"', ''], # Letter, Uppercase
+ ['IsLl', '$cat eq "Ll"', ''], # Letter, Lowercase
+ ['IsLt', '$cat eq "Lt"', ''], # Letter, Titlecase
+ ['IsLm', '$cat eq "Lm"', ''], # Letter, Modifier
+ ['IsLo', '$cat eq "Lo"', ''], # Letter, Other
+
+ ['IsP', '$cat =~ /^P/', ''], # Punctuation
+ ['IsPd', '$cat eq "Pd"', ''], # Punctuation, Dash
+ ['IsPs', '$cat eq "Ps"', ''], # Punctuation, Open
+ ['IsPe', '$cat eq "Pe"', ''], # Punctuation, Close
+ ['IsPo', '$cat eq "Po"', ''], # Punctuation, Other
+
+ ['IsS', '$cat =~ /^S/', ''], # Symbol
+ ['IsSm', '$cat eq "Sm"', ''], # Symbol, Math
+ ['IsSc', '$cat eq "Sc"', ''], # Symbol, Currency
+ ['IsSo', '$cat eq "So"', ''], # Symbol, Other
+
+# Combining class
+ ['CombiningClass', '$comb', '$comb'],
+
+# BIDIRECTIONAL PROPERTIES
+
+ ['Bidirectional', '$bid', '$bid'],
+
+# Strong types:
+
+ ['IsBidiL', '$bid eq "L"', ''], # Left-Right; Most alphabetic,
+ # syllabic, and logographic
+ # characters (e.g., CJK
+ # ideographs)
+ ['IsBidiR', '$bid eq "R"', ''], # Right-Left; Arabic, Hebrew,
+ # and punctuation specific to
+ # those scripts
+
+# Weak types:
+
+ ['IsBidiEN','$bid eq "EN"', ''], # European Number
+ ['IsBidiES','$bid eq "ES"', ''], # European Number Separator
+ ['IsBidiET','$bid eq "ET"', ''], # European Number Terminator
+ ['IsBidiAN','$bid eq "AN"', ''], # Arabic Number
+ ['IsBidiCS','$bid eq "CS"', ''], # Common Number Separator
+
+# Separators:
+
+ ['IsBidiB', '$bid eq "B"', ''], # Block Separator
+ ['IsBidiS', '$bid eq "S"', ''], # Segment Separator
+
+# Neutrals:
+
+ ['IsBidiWS','$bid eq "WS"', ''], # Whitespace
+ ['IsBidiON','$bid eq "ON"', ''], # Other Neutrals ; All other
+ # characters: punctuation,
+ # symbols
+
+# Decomposition
+
+ ['Decomposition', '$decomp', '$decomp'],
+ ['IsDecoCanon', '$decomp && $decomp !~ /^</', ''],
+ ['IsDecoCompat', '$decomp =~ /^</', ''],
+ ['IsDCfont', '$decomp =~ /^<font>/', ''],
+ ['IsDCnoBreak', '$decomp =~ /^<noBreak>/', ''],
+ ['IsDCinitial', '$decomp =~ /^<initial>/', ''],
+ ['IsDCinital', '$decomp =~ /^<medial>/', ''],
+ ['IsDCfinal', '$decomp =~ /^<final>/', ''],
+ ['IsDCisolated', '$decomp =~ /^<isolated>/', ''],
+ ['IsDCcircle', '$decomp =~ /^<circle>/', ''],
+ ['IsDCsuper', '$decomp =~ /^<super>/', ''],
+ ['IsDCsub', '$decomp =~ /^<sub>/', ''],
+ ['IsDCvertical', '$decomp =~ /^<vertical>/', ''],
+ ['IsDCwide', '$decomp =~ /^<wide>/', ''],
+ ['IsDCnarrow', '$decomp =~ /^<narrow>/', ''],
+ ['IsDCsmall', '$decomp =~ /^<small>/', ''],
+ ['IsDCsquare', '$decomp =~ /^<square>/', ''],
+ ['IsDCcompat', '$decomp =~ /^<compat>/', ''],
+
+# Number
+
+ ['Number', '$num', '$num'],
+
+# Mirrored
+
+ ['IsMirrored', '$mir eq "Y"', ''],
+
+# Arabic
+
+ ['ArabLink', '1', '$link'],
+ ['ArabLnkGrp', '1', '$linkgroup'],
+
+# Jamo
+
+ ['JamoShort', '1', '$short'],
+
+# Syllables
+
+ ['IsSylV', '$syl eq "V"', ''],
+ ['IsSylU', '$syl eq "U"', ''],
+ ['IsSylI', '$syl eq "I"', ''],
+ ['IsSylA', '$syl eq "A"', ''],
+ ['IsSylE', '$syl eq "E"', ''],
+ ['IsSylC', '$syl eq "C"', ''],
+ ['IsSylO', '$syl eq "O"', ''],
+ ['IsSylWV', '$syl eq "V"', ''],
+ ['IsSylWI', '$syl eq "I"', ''],
+ ['IsSylWA', '$syl eq "A"', ''],
+ ['IsSylWE', '$syl eq "E"', ''],
+ ['IsSylWC', '$syl eq "C"', ''],
+);
+
+# This is not written for speed...
+
+foreach $file (@todo) {
+ my ($table, $wanted, $val) = @$file;
+ next if @ARGV and not grep { $_ eq $table } @ARGV;
+ print $table,"\n";
+ if ($table =~ /^(Is|In|To)(.*)/) {
+ open(OUT, ">$1/$2.pl") or die "Can't create $1/$2.pl: $!\n";
+ }
+ else {
+ open(OUT, ">$table.pl") or die "Can't create $table.pl: $!\n";
+ }
+ print OUT <<EOH;
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by $0 from e.g. $UnicodeData.
+# Any changes made here will be lost!
+EOH
+ print OUT <<"END";
+return <<'END';
+END
+ print OUT proplist($table, $wanted, $val);
+ print OUT "END\n";
+ close OUT;
+}
+
+# Must treat blocks specially.
+
+exit if @ARGV and not grep { $_ eq Block } @ARGV;
+print "Block\n";
+open(UD, 'Blocks.txt') or die "Can't open blocks.txt: $!\n";
+open(OUT, ">Block.pl") or die "Can't create $table.pl: $!\n";
+print OUT <<EOH;
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by $0 from e.g. $UnicodeData.
+# Any changes made here will be lost!
+EOH
+print OUT <<"END";
+return <<'END';
+END
+
+while (<UD>) {
+ next if /^#/;
+ next if /^$/;
+ chomp;
+ ($code, $last, $name) = split(/; */);
+ if ($name) {
+ print OUT "$code $last $name\n";
+ $name =~ s/\s+//g;
+ open(BLOCK, ">In/$name.pl");
+ print BLOCK <<EOH;
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by $0 from e.g. $UnicodeData.
+# Any changes made here will be lost!
+EOH
+ print BLOCK <<"END2";
+return <<'END';
+$code $last
+END
+END2
+ close BLOCK;
+ }
+}
+
+print OUT "END\n";
+close OUT;
+
+##################################################
+
+sub proplist {
+ my ($table, $wanted, $val) = @_;
+ my @wanted;
+ my $out;
+ my $split;
+
+ if ($table =~ /^Arab/) {
+ open(UD, "ArabShap.txt") or warn "Can't open $table: $!";
+
+ $split = '($code, $name, $link, $linkgroup) = split(/; */);';
+ }
+ elsif ($table =~ /^Jamo/) {
+ open(UD, "Jamo.txt") or warn "Can't open $table: $!";
+
+ $split = '($code, $short, $name) = split(/; */); $code =~ s/^U\+//;';
+ }
+ elsif ($table =~ /^IsSyl/) {
+ open(UD, "syllables.txt") or warn "Can't open $table: $!";
+
+ $split = '($code, $short, $syl) = split(/; */); $code =~ s/^U\+//;';
+ }
+ else {
+ open(UD, $UnicodeData) or warn "Can't open $UnicodeData: $!";
+
+ $split = '($code, $name, $cat, $comb, $bid, $decomp, $dec, $dig, $num, $mir, $uni1,
+ $comment, $up, $down, $title) = split(/;/);';
+ }
+
+ if ($table =~ /^(?:To|Is)[A-Z]/) {
+ eval <<"END";
+ while (<UD>) {
+ next if /^#/;
+ next if /^\s/;
+ chop;
+ $split
+ if ($wanted) {
+ push(\@wanted, [hex \$code, hex $val, \$name =~ /, First>\$/]);
+ }
+ }
+END
+ die $@ if $@;
+
+ while (@wanted) {
+ $beg = shift @wanted;
+ $last = $beg;
+ while (@wanted and $wanted[0]->[0] == $last->[0] + 1 and
+ (not $val or $wanted[0]->[1] == $last->[1] + 1)) {
+ $last = shift @wanted;
+ }
+ $out .= sprintf "%04x", $beg->[0];
+ if ($beg->[2]) {
+ $last = shift @wanted;
+ }
+ if ($beg == $last) {
+ $out .= "\t";
+ }
+ else {
+ $out .= sprintf "\t%04x", $last->[0];
+ }
+ $out .= sprintf "\t%04x", $beg->[1] if $val;
+ $out .= "\n";
+ }
+ }
+ else {
+ eval <<"END";
+ while (<UD>) {
+ next if /^#/;
+ next if /^\s*\$/;
+ chop;
+ $split
+ if ($wanted) {
+ push(\@wanted, [hex \$code, $val, \$name =~ /, First>\$/]);
+ }
+ }
+END
+ die $@ if $@;
+
+ while (@wanted) {
+ $beg = shift @wanted;
+ $last = $beg;
+ while (@wanted and $wanted[0]->[0] == $last->[0] + 1 and
+ ($wanted[0]->[1] eq $last->[1])) {
+ $last = shift @wanted;
+ }
+ $out .= sprintf "%04x", $beg->[0];
+ if ($beg->[2]) {
+ $last = shift @wanted;
+ }
+ if ($beg == $last) {
+ $out .= "\t";
+ }
+ else {
+ $out .= sprintf "\t%04x", $last->[0];
+ }
+ $out .= sprintf "\t%s\n", $beg->[1];
+ }
+ }
+ $out;
+}
+
+# eof
diff --git a/contrib/perl5/lib/unicode/syllables.txt b/contrib/perl5/lib/unicode/syllables.txt
new file mode 100644
index 0000000..40e946e
--- /dev/null
+++ b/contrib/perl5/lib/unicode/syllables.txt
@@ -0,0 +1,1329 @@
+################################################################################
+#
+# V: as "u" in "but" (often represented with schwa or small uppercase lambda)
+# U: as "oo" in "fool"
+# I: as "ea" in "meat"
+# A: as "a" in "father"
+# E: as "a" in "hate"
+# C: the consonant form having no vowel element
+# O: as "o" in "note"
+#
+# Vowel identifiers are assumed short, doubled identifiers are considered long
+# (following Cushitic rules). Dipthong syllables are identified with "W" as
+# per Ethiopic and Canadian syllabary character names.
+#
+#
+# WV WVV WU WUU WI WII WA WAA WAI WAAI WE WEE WC WO WOO
+#
+# V VV U UU I II A AA AI AAI E EE C O OO
+#
+################################################################################
+
+#
+# Ethiopic
+#
+1200; HA; V
+1201; HU; U
+1202; HI; I
+1203; HAA; A
+1204; HEE; E
+1205; HE; C
+1206; HO; O
+1208; LA; V
+1209; LU; U
+120A; LI; I
+120B; LAA; A
+120C; LEE; E
+120D; LE; C
+120E; LO; O
+120F; LWA; WA
+1210; HHA; V
+1211; HHU; U
+1212; HHI; I
+1213; HHAA; A
+1214; HHEE; E
+1215; HHE; C
+1216; HHO; O
+1217; HHWA; WA
+1218; MA; V
+1219; MU; U
+121A; MI; I
+121B; MAA; A
+121C; MEE; E
+121D; ME; C
+121E; MO; O
+121F; MWA; WA
+1220; SZA; V
+1221; SZU; U
+1222; SZI; I
+1223; SZAA; A
+1224; SZEE; E
+1225; SZE; C
+1226; SZO; O
+1227; SZWA; WA
+1228; RA; V
+1229; RU; U
+122A; RI; I
+122B; RAA; A
+122C; REE; E
+122D; RE; C
+122E; RO; O
+122F; RWA; WA
+1230; SA; V
+1231; SU; U
+1232; SI; I
+1233; SAA; A
+1234; SEE; E
+1235; SE; C
+1236; SO; O
+1237; SWA; WA
+1238; SHA; V
+1239; SHU; U
+123A; SHI; I
+123B; SHAA; A
+123C; SHEE; E
+123D; SHE; C
+123E; SHO; O
+123F; SHWA; WA
+1240; QA; V
+1241; QU; U
+1242; QI; I
+1243; QAA; A
+1244; QEE; E
+1245; QE; C
+1246; QO; O
+1248; QWA; WV
+124A; QWI; WI
+124B; QWAA; WA
+124C; QWEE; WE
+124D; QWE; WC
+1250; QHA; V
+1251; QHU; U
+1252; QHI; I
+1253; QHAA; A
+1254; QHEE; E
+1255; QHE; C
+1256; QHO; O
+1258; QHWA; WV
+125A; QHWI; WI
+125B; QHWAA; WA
+125C; QHWEE; WE
+125D; QHWE; WC
+1260; BA; V
+1261; BU; U
+1262; BI; I
+1263; BAA; A
+1264; BEE; E
+1265; BE; C
+1266; BO; O
+1267; BWA; WA
+1268; VA; V
+1269; VU; U
+126A; VI; I
+126B; VAA; A
+126C; VEE; E
+126D; VE; C
+126E; VO; O
+126F; VWA; WA
+1270; TA; V
+1271; TU; U
+1272; TI; I
+1273; TAA; A
+1274; TEE; E
+1275; TE; C
+1276; TO; O
+1277; TWA; WA
+1278; CA; V
+1279; CU; U
+127A; CI; I
+127B; CAA; A
+127C; CEE; E
+127D; CE; C
+127E; CO; O
+127F; CWA; WA
+1280; XA; V
+1281; XU; U
+1282; XI; I
+1283; XAA; A
+1284; XEE; E
+1285; XE; C
+1286; XO; O
+1288; XWA; WV
+128A; XWI; WI
+128B; XWAA; WA
+128C; XWEE; WE
+128D; XWE; WC
+1290; NA; V
+1291; NU; U
+1292; NI; I
+1293; NAA; A
+1294; NEE; E
+1295; NE; C
+1296; NO; O
+1297; NWA; WA
+1298; NYA; V
+1299; NYU; U
+129A; NYI; I
+129B; NYAA; A
+129C; NYEE; E
+129D; NYE; C
+129E; NYO; O
+129F; NYWA; WA
+12A0; GLOTTAL A; V
+12A1; GLOTTAL U; U
+12A2; GLOTTAL I; I
+12A3; GLOTTAL AA; A
+12A4; GLOTTAL EE; E
+12A5; GLOTTAL E; C
+12A6; GLOTTAL O; O
+12A7; GLOTTAL WA; WA
+12A8; KA; V
+12A9; KU; U
+12AA; KI; I
+12AB; KAA; A
+12AC; KEE; E
+12AD; KE; C
+12AE; KO; O
+12B0; KWA; WV
+12B2; KWI; WI
+12B3; KWAA; WA
+12B4; KWEE; WE
+12B5; KWE; WC
+12B8; KXA; V
+12B9; KXU; U
+12BA; KXI; I
+12BB; KXAA; A
+12BC; KXEE; E
+12BD; KXE; C
+12BE; KXO; O
+12C0; KXWA; WV
+12C2; KXWI; WI
+12C3; KXWAA; WA
+12C4; KXWEE; WE
+12C5; KXWE; WC
+12C8; WA; V
+12C9; WU; U
+12CA; WI; I
+12CB; WAA; A
+12CC; WEE; E
+12CD; WE; C
+12CE; WO; O
+12D0; PHARYNGEAL A; V
+12D1; PHARYNGEAL U; U
+12D2; PHARYNGEAL I; I
+12D3; PHARYNGEAL AA; A
+12D4; PHARYNGEAL EE; E
+12D5; PHARYNGEAL E; C
+12D6; PHARYNGEAL O; O
+12D8; ZA; V
+12D9; ZU; U
+12DA; ZI; I
+12DB; ZAA; A
+12DC; ZEE; E
+12DD; ZE; C
+12DE; ZO; O
+12DF; ZWA; WA
+12E0; ZHA; V
+12E1; ZHU; U
+12E2; ZHI; I
+12E3; ZHAA; A
+12E4; ZHEE; E
+12E5; ZHE; C
+12E6; ZHO; O
+12E7; ZHWA; WA
+12E8; YA; V
+12E9; YU; U
+12EA; YI; I
+12EB; YAA; A
+12EC; YEE; E
+12ED; YE; C
+12EE; YO; O
+12F0; DA; V
+12F1; DU; U
+12F2; DI; I
+12F3; DAA; A
+12F4; DEE; E
+12F5; DE; C
+12F6; DO; O
+12F7; DWA; WA
+12F8; DDA; V
+12F9; DDU; U
+12FA; DDI; I
+12FB; DDAA; A
+12FC; DDEE; E
+12FD; DDE; C
+12FE; DDO; O
+12FF; DDWA; WA
+1300; JA; V
+1301; JU; U
+1302; JI; I
+1303; JAA; A
+1304; JEE; E
+1305; JE; C
+1306; JO; O
+1307; JWA; WA
+1308; GA; V
+1309; GU; U
+130A; GI; I
+130B; GAA; A
+130C; GEE; E
+130D; GE; C
+130E; GO; O
+1310; GWA; WV
+1312; GWI; WI
+1313; GWAA; WA
+1314; GWEE; WE
+1315; GWE; WC
+1318; GGA; V
+1319; GGU; U
+131A; GGI; I
+131B; GGAA; A
+131C; GGEE; E
+131D; GGE; C
+131E; GGO; O
+1320; THA; V
+1321; THU; U
+1322; THI; I
+1323; THAA; A
+1324; THEE; E
+1325; THE; C
+1326; THO; O
+1327; THWA; WA
+1328; CHA; V
+1329; CHU; U
+132A; CHI; I
+132B; CHAA; A
+132C; CHEE; E
+132D; CHE; C
+132E; CHO; O
+132F; CHWA; WA
+1330; PHA; V
+1331; PHU; U
+1332; PHI; I
+1333; PHAA; A
+1334; PHEE; E
+1335; PHE; C
+1336; PHO; O
+1337; PHWA; WA
+1338; TSA; V
+1339; TSU; U
+133A; TSI; I
+133B; TSAA; A
+133C; TSEE; E
+133D; TSE; C
+133E; TSO; O
+133F; TSWA; WA
+1340; TZA; V
+1341; TZU; U
+1342; TZI; I
+1343; TZAA; A
+1344; TZEE; E
+1345; TZE; C
+1346; TZO; O
+1348; FA; V
+1349; FU; U
+134A; FI; I
+134B; FAA; A
+134C; FEE; E
+134D; FE; C
+134E; FO; O
+134F; FWA; WA
+1350; PA; V
+1351; PU; U
+1352; PI; I
+1353; PAA; A
+1354; PEE; E
+1355; PE; C
+1356; PO; O
+1357; PWA; WA
+#
+# Cherokee
+#
+13A0; A; A
+13A1; E; E
+13A2; I; I
+13A3; O; O
+13A4; U; U
+13A5; V; V
+13A6; GA; A
+13A7; KA; A
+13A8; GE; E
+13A9; GI; I
+13AA; GO; O
+13AB; GU; U
+13AC; GV; V
+13AD; HA; A
+13AE; HE; E
+13AF; HI; I
+13B0; HO; O
+13B1; HU; U
+13B2; HV; V
+13B3; LA; A
+13B4; LE; E
+13B5; LI; I
+13B6; LO; O
+13B7; LU; U
+13B8; LV; V
+13B9; MA; A
+13BA; ME; E
+13BB; MI; I
+13BC; MO; O
+13BD; MU; U
+13BE; NA; A
+13BF; HNA; A
+13C0; NAH; C
+13C1; NE; E
+13C2; NI; I
+13C3; NO; O
+13C4; NU; U
+13C5; NV; V
+13C6; QUA; A
+13C7; QUE; E
+13C8; QUI; I
+13C9; QUO; O
+13CA; QUU; U
+13CB; QUV; V
+13CC; SA; A
+13CD; S; C
+13CE; SE; E
+13CF; SI; I
+13D0; SO; O
+13D1; SU; U
+13D2; SV; V
+13D3; DA; A
+13D4; TA; A
+13D5; DE; E
+13D6; TE; E
+13D7; DI; I
+13D8; TI; I
+13D9; DO; O
+13DA; DU; U
+13DB; DV; V
+13DC; DLA; A
+13DD; TLA; A
+13DE; TLE; E
+13DF; TLI; I
+13E0; TLO; O
+13E1; TLU; U
+13E2; TLV; V
+13E3; TSA; A
+13E4; TSE; E
+13E5; TSI; I
+13E6; TSO; O
+13E7; TSU; U
+13E8; TSV; V
+13E9; WA; A
+13EA; WE; E
+13EB; WI; I
+13EC; WO; O
+13ED; WU; U
+13EE; WV; V
+13EF; YA; A
+13F0; YE; E
+13F1; YI; I
+13F2; YO; O
+13F3; YU; U
+13F4; YV; V
+#
+# 1400 Unified Canadian Aboriginal Syllabics 167F
+#
+1401; E; E
+1402; AAI; AAI
+1403; I; I
+1404; II; II
+1405; O; O
+1406; OO; OO
+1407; Y-CREE OO; OO
+1408; CARRIER EE; EE
+1409; CARRIER I; I
+140A; A; A
+140B; AA; AA
+140C; WE; WE
+140D; WEST-CREE WE; WE
+140E; WI; WI
+140F; WEST-CREE WI; WI
+1410; WII; WII
+1411; WEST-CREE WII; WII
+1412; WO; WO
+1413; WEST-CREE WO; WO
+1414; WOO; WOO
+1415; WEST-CREE WOO; WOO
+1416; NASKAPI WOO; WOO
+1417; WA; WA
+1418; WEST-CREE WA; WA
+1419; WAA; WAA
+141A; WEST-CREE WAA; WAA
+141B; NASKAPI WAA; WAA
+141C; AI; AI
+141D; Y-CREE W; C
+142B; EN; C
+142C; IN; C
+142D; ON; C
+142E; AN; C
+142F; PE; E
+1430; PAAI; AAI
+1431; PI; I
+1432; PII; II
+1433; PO; O
+1434; POO; OO
+1435; Y-CREE POO; OO
+1436; CARRIER HEE; EE
+1437; CARRIER HI; I
+1438; PA; A
+1439; PAA; AA
+143A; PWE; WE
+143B; WEST-CREE PWE; WE
+143C; PWI; WI
+143D; WEST-CREE PWI; WI
+143E; PWII; WII
+143F; WEST-CREE PWII; WII
+1440; PWO; WO
+1441; WEST-CREE PWO; WO
+1442; PWOO; WOO
+1443; WEST-CREE PWOO; WOO
+1444; PWA; WA
+1445; WEST-CREE PWA; WA
+1446; PWAA; WAA
+1447; WEST-CREE PWAA; WAA
+1448; Y-CREE PWAA; WAA
+1449; P; C
+144A; WEST-CREE P; C
+144B; CARRIER H; C
+144C; TE; E
+144D; TAAI; AAI
+144E; TI; I
+144F; TII; II
+1450; TO; O
+1451; TOO; OO
+1452; Y-CREE TOO; OO
+1453; CARRIER DEE; EE
+1454; CARRIER DI; I
+1455; TA; A
+1456; TAA; AA
+1457; TWE; WE
+1458; WEST-CREE TWE; WE
+1459; TWI; WI
+145A; WEST-CREE TWI; WI
+145B; TWII; WII
+145C; WEST-CREE TWII; WII
+145D; TWO; WO
+145E; WEST-CREE TWO; WO
+145F; TWOO; WOO
+1460; WEST-CREE TWOO; WOO
+1461; TWA; WA
+1462; WEST-CREE TWA; WA
+1463; TWAA; WAA
+1464; WEST-CREE TWAA; WAA
+1465; NASKAPI TWAA; WAA
+1466; T; C
+1467; TTE; E
+1468; TTI; I
+1469; TTO; O
+146A; TTA; A
+146B; KE; E
+146C; KAAI; AAI
+146D; KI; I
+146E; KII; II
+146F; KO; O
+1470; KOO; OO
+1471; Y-CREE KOO; OO
+1472; KA; A
+1473; KAA; AA
+1474; KWE; WE
+1475; WEST-CREE KWE; WE
+1476; KWI; WI
+1477; WEST-CREE KWI; WI
+1478; KWII; WII
+1479; WEST-CREE KWII; WII
+147A; KWO; WO
+147B; WEST-CREE KWO; WO
+147C; KWOO; WOO
+147D; WEST-CREE KWOO; WOO
+147E; KWA; WA
+147F; WEST-CREE KWA; WA
+1480; KWAA; WAA
+1481; WEST-CREE KWAA; WAA
+1482; NASKAPI KWAA; WAA
+1483; K; C
+1484; KW; WC
+1485; SOUTH-SLAVEY KEH; C
+1486; SOUTH-SLAVEY KIH; C
+1487; SOUTH-SLAVEY KOH; C
+1488; SOUTH-SLAVEY KAH; C
+1489; CE; E
+148A; CAAI; AAI
+148B; CI; I
+148C; CII; II
+148D; CO; O
+148E; COO; OO
+148F; Y-CREE COO; OO
+1490; CA; A
+1491; CAA; AA
+1492; CWE; WE
+1493; WEST-CREE CWE; WE
+1494; CWI; WI
+1495; WEST-CREE CWI; WI
+1496; CWII; WII
+1497; WEST-CREE CWII; WII
+1498; CWO; WO
+1499; WEST-CREE CWO; WO
+149A; CWOO; WOO
+149B; WEST-CREE CWOO; WOO
+149C; CWA; WA
+149D; WEST-CREE CWA; WA
+149E; CWAA; WAA
+149F; WEST-CREE CWAA; WAA
+14A0; NASKAPI CWAA; WAA
+14A1; C; C
+14A2; SAYISI TH;
+14A3; ME; E
+14A4; MAAI; AAI
+14A5; MI; I
+14A6; MII; II
+14A7; MO; O
+14A8; MOO; OO
+14A9; Y-CREE MOO; OO
+14AA; MA; A
+14AB; MAA; AA
+14AC; MWE; WE
+14AD; WEST-CREE MWE; WE
+14AE; MWI; WI
+14AF; WEST-CREE MWI; WI
+14B0; MWII; WII
+14B1; WEST-CREE MWII; WII
+14B2; MWO; WO
+14B3; WEST-CREE MWO; WO
+14B4; MWOO; WOO
+14B5; WEST-CREE MWOO; WOO
+14B6; MWA; WA
+14B7; WEST-CREE MWA; WA
+14B8; MWAA; WAA
+14B9; WEST-CREE MWAA; WAA
+14BA; NASKAPI MWAA; WAA
+14BB; M; C
+14BC; WEST-CREE M; C
+14BD; MH; C
+14BE; ATHAPASCAN M; C
+14BF; SAYISI M; C
+14C0; NE; E
+14C1; NAAI; AAI
+14C2; NI; I
+14C3; NII; II
+14C4; NO; O
+14C5; NOO; OO
+14C6; Y-CREE NOO; OO
+14C7; NA; A
+14C8; NAA; AA
+14C9; NWE; WE
+14CA; WEST-CREE NWE; WE
+14CB; NWA; WA
+14CC; WEST-CREE NWA; WA
+14CD; NWAA; WAA
+14CE; WEST-CREE NWAA; WAA
+14CF; NASKAPI NWAA; WAA
+14D0; N; C
+14D1; CARRIER NG; C
+14D2; NH; C
+14D3; LE; E
+14D4; LAAI; AAI
+14D5; LI; I
+14D6; LII; II
+14D7; LO; O
+14D8; LOO; OO
+14D9; Y-CREE LOO; OO
+14DA; LA; A
+14DB; LAA; AA
+14DC; LWE; WE
+14DD; WEST-CREE LWE; WE
+14DE; LWI; WI
+14DF; WEST-CREE LWI; WI
+14E0; LWII; WII
+14E1; WEST-CREE LWII; WII
+14E2; LWO; WO
+14E3; WEST-CREE LWO; WO
+14E4; LWOO; WOO
+14E5; WEST-CREE LWOO; WOO
+14E6; LWA; WA
+14E7; WEST-CREE LWA; WA
+14E8; LWAA; WAA
+14E9; WEST-CREE LWAA; WAA
+14EA; L; C
+14EB; WEST-CREE L; C
+14EC; MEDIAL L; C
+14ED; SE; E
+14EE; SAAI; AAI
+14EF; SI; I
+14F0; SII; II
+14F1; SO; O
+14F2; SOO; OO
+14F3; Y-CREE SOO; OO
+14F4; SA; A
+14F5; SAA; AA
+14F6; SWE; WE
+14F7; WEST-CREE SWE; WE
+14F8; SWI; WI
+14F9; WEST-CREE SWI; WI
+14FA; SWII; WII
+14FB; WEST-CREE SWII; WII
+14FC; SWO; WO
+14FD; WEST-CREE SWO; WO
+14FE; SWOO; WOO
+14FF; WEST-CREE SWOO; WOO
+1500; SWA; WA
+1501; WEST-CREE SWA; WA
+1502; SWAA; WAA
+1503; WEST-CREE SWAA; WAA
+1504; NASKAPI SWAA; WAA
+1505; S; C
+1506; ATHAPASCAN S; C
+1507; SW; WC
+1508; BLACKFOOT S; C
+1509; MOOSE-CREE SK;C
+150A; NASKAPI SKW; C
+150B; NASKAPI S-W; C
+150C; NASKAPI SPWA; WA
+150D; NASKAPI STWA; WA
+150E; NASKAPI SKWA; WA
+150F; NASKAPI SCWA; WA
+1510; SHE; E
+1511; SHI; I
+1512; SHII; II
+1513; SHO; O
+1514; SHOO; OO
+1515; SHA; A
+1516; SHAA; AA
+1517; SHWE; WE
+1518; WEST-CREE SHWE; WE
+1519; SHWI; WI
+151A; WEST-CREE SHWI; WI
+151B; SHWII; WII
+151C; WEST-CREE SHWII; WII
+151D; SHWO; WO
+151E; WEST-CREE SHWO; WO
+151F; SHWOO; WOO
+1520; WEST-CREE SHWOO; WOO
+1521; SHWA; WA
+1522; WEST-CREE SHWA; WA
+1523; SHWAA; WAA
+1524; WEST-CREE SHWAA; WAA
+1525; SH; C
+1526; YE; E
+1527; YAAI; AAI
+1528; YI; I
+1529; YII; II
+152A; YO; O
+152B; YOO; OO
+152C; Y-CREE YOO; OO
+152D; YA; A
+152E; YAA; AA
+152F; YWE; WE
+1530; WEST-CREE YWE; WE
+1531; YWI; WI
+1532; WEST-CREE YWI; WI
+1533; YWII; WII
+1534; WEST-CREE YWII; WII
+1535; YWO; WO
+1536; WEST-CREE YWO; WO
+1537; YWOO; WOO
+1538; WEST-CREE YWOO; WOO
+1539; YWA; WA
+153A; WEST-CREE YWA; WA
+153B; YWAA; WAA
+153C; WEST-CREE YWAA; WAA
+153D; NASKAPI YWAA; WAA
+153E; Y; C
+153F; BIBLE-CREE Y; C
+1540; WEST-CREE Y; C
+1541; SAYISI YI; I
+1542; RE; E
+1543; R-CREE RE; E
+1544; WEST-CREE LE; E
+1545; RAAI; AAI
+1546; RI; I
+1547; RII; II
+1548; RO; O
+1549; ROO; OO
+154A; WEST-CREE LO; O
+154B; RA; A
+154C; RAA; AA
+154D; WEST-CREE LA; A
+154E; RWAA; WAA
+154F; WEST-CREE RWAA; WAA
+1550; R; C
+1551; WEST-CREE R; C
+1552; MEDIAL R; C
+1553; FE; E
+1554; FAAI; AAI
+1555; FI; I
+1556; FII; II
+1557; FO; O
+1558; FOO; OO
+1559; FA; A
+155A; FAA; AA
+155B; FWAA; WAA
+155C; WEST-CREE FWAA; WAA
+155D; F; C
+155E; THE; E
+155F; N-CREE THE; E
+1560; THI; I
+1561; N-CREE THI; I
+1562; THII; II
+1563; N-CREE THII; II
+1564; THO; O
+1565; THOO; OO
+1566; THA; A
+1567; THAA; AA
+1568; THWAA; WAA
+1569; WEST-CREE THWAA; WAA
+156A; TH; C
+156B; TTHE; E
+156C; TTHI; I
+156D; TTHO; O
+156E; TTHA; A
+156F; TTH; C
+1570; TYE; E
+1571; TYI; I
+1572; TYO; O
+1573; TYA; A
+1574; NUNAVIK HE; E
+1575; NUNAVIK HI; I
+1576; NUNAVIK HII; II
+1577; NUNAVIK HO; O
+1578; NUNAVIK HOO; OO
+1579; NUNAVIK HA; A
+157A; NUNAVIK HAA; AA
+157B; NUNAVIK H; C
+157C; NUNAVUT H; C
+157D; HK; C
+157E; QAAI; AAI
+157F; QI; I
+1580; QII; II
+1581; QO; O
+1582; QOO; OO
+1583; QA; A
+1584; QAA; AA
+1585; Q; C
+1586; TLHE; E
+1587; TLHI; I
+1588; TLHO; O
+1589; TLHA; A
+158A; WEST-CREE RE; E
+158B; WEST-CREE RI; I
+158C; WEST-CREE RO; O
+158D; WEST-CREE RA; A
+158E; NGAAI; AAI
+158F; NGI; I
+1590; NGII; II
+1591; NGO; O
+1592; NGOO; OO
+1593; NGA; A
+1594; NGAA; AA
+1595; NG; C
+1596; NNG; C
+1597; SAYISI SHE; E
+1598; SAYISI SHI; I
+1599; SAYISI SHO; O
+159A; SAYISI SHA; A
+159B; WOODS-CREE THE; E
+159C; WOODS-CREE THI; I
+159D; WOODS-CREE THO; O
+159E; WOODS-CREE THA; A
+159F; WOODS-CREE TH; C
+15A0; LHI; I
+15A1; LHII; II
+15A2; LHO; O
+15A3; LHOO; OO
+15A4; LHA; A
+15A5; LHAA; AA
+15A6; LH; C
+15A7; TH-CREE THE; E
+15A8; TH-CREE THI; I
+15A9; TH-CREE THII; II
+15AA; TH-CREE THO; O
+15AB; TH-CREE THOO; OO
+15AC; TH-CREE THA; A
+15AD; TH-CREE THAA; AA
+15AE; TH-CREE TH; C
+15AF; AIVILIK B; C
+15B0; BLACKFOOT E; E
+15B1; BLACKFOOT I; I
+15B2; BLACKFOOT O; O
+15B3; BLACKFOOT A; A
+15B4; BLACKFOOT WE; E
+15B5; BLACKFOOT WI; I
+15B6; BLACKFOOT WO; O
+15B7; BLACKFOOT WA; A
+15B8; BLACKFOOT NE; E
+15B9; BLACKFOOT NI; I
+15BA; BLACKFOOT NO; O
+15BB; BLACKFOOT NA; A
+15BC; BLACKFOOT KE; E
+15BD; BLACKFOOT KI; I
+15BE; BLACKFOOT KO; O
+15BF; BLACKFOOT KA; A
+15C0; SAYISI HE; E
+15C1; SAYISI HI; I
+15C2; SAYISI HO; O
+15C3; SAYISI HA; A
+15C4; CARRIER GHU; U
+15C5; CARRIER GHO; O
+15C6; CARRIER GHE; E
+15C7; CARRIER GHEE; EE
+15C8; CARRIER GHI; I
+15C9; CARRIER GHA; A
+15CA; CARRIER RU; U
+15CB; CARRIER RO; O
+15CC; CARRIER RE; E
+15CD; CARRIER REE; EE
+15CE; CARRIER RI; I
+15CF; CARRIER RA; A
+15D0; CARRIER WU; U
+15D1; CARRIER WO; O
+15D2; CARRIER WE; E
+15D3; CARRIER WEE; EE
+15D4; CARRIER WI; I
+15D5; CARRIER WA; A
+15D6; CARRIER HWU; WU
+15D7; CARRIER HWO; WO
+15D8; CARRIER HWE; WE
+15D9; CARRIER HWEE; WEE
+15DA; CARRIER HWI; WI
+15DB; CARRIER HWA; WA
+15DC; CARRIER THU; U
+15DD; CARRIER THO; O
+15DE; CARRIER THE; E
+15DF; CARRIER THEE; EE
+15E0; CARRIER THI; I
+15E1; CARRIER THA; A
+15E2; CARRIER TTU; U
+15E3; CARRIER TTO; O
+15E4; CARRIER TTE; E
+15E5; CARRIER TTEE; EE
+15E6; CARRIER TTI; I
+15E7; CARRIER TTA; A
+15E8; CARRIER PU; U
+15E9; CARRIER PO; O
+15EA; CARRIER PE; E
+15EB; CARRIER PEE; EE
+15EC; CARRIER PI; I
+15ED; CARRIER PA; A
+15EE; CARRIER P;
+15EF; CARRIER GU; U
+15F0; CARRIER GO; O
+15F1; CARRIER GE; E
+15F2; CARRIER GEE; EE
+15F3; CARRIER GI; I
+15F4; CARRIER GA; A
+15F5; CARRIER KHU; U
+15F6; CARRIER KHO; O
+15F7; CARRIER KHE; E
+15F8; CARRIER KHEE; EE
+15F9; CARRIER KHI; I
+15FA; CARRIER KHA; A
+15FB; CARRIER KKU; U
+15FC; CARRIER KKO; O
+15FD; CARRIER KKE; E
+15FE; CARRIER KKEE; EE
+15FF; CARRIER KKI; I
+1600; CARRIER KKA; A
+1601; CARRIER KK;
+1602; CARRIER NU; U
+1603; CARRIER NO; O
+1604; CARRIER NE; E
+1605; CARRIER NEE; EE
+1606; CARRIER NI; I
+1607; CARRIER NA; A
+1608; CARRIER MU; U
+1609; CARRIER MO; O
+160A; CARRIER ME; E
+160B; CARRIER MEE; EE
+160C; CARRIER MI; I
+160D; CARRIER MA; A
+160E; CARRIER YU; U
+160F; CARRIER YO; O
+1610; CARRIER YE; E
+1611; CARRIER YEE; EE
+1612; CARRIER YI; I
+1613; CARRIER YA; A
+1614; CARRIER JU; U
+1615; SAYISI JU; U
+1616; CARRIER JO; O
+1617; CARRIER JE; E
+1618; CARRIER JEE; EE
+1619; CARRIER JI; I
+161A; SAYISI JI; I
+161B; CARRIER JA; A
+161C; CARRIER JJU; U
+161D; CARRIER JJO; O
+161E; CARRIER JJE; E
+161F; CARRIER JJEE; EE
+1620; CARRIER JJI; I
+1621; CARRIER JJA; A
+1622; CARRIER LU; U
+1623; CARRIER LO; O
+1624; CARRIER LE; E
+1625; CARRIER LEE; EE
+1626; CARRIER LI; I
+1627; CARRIER LA; A
+1628; CARRIER DLU; U
+1629; CARRIER DLO; O
+162A; CARRIER DLE; E
+162B; CARRIER DLEE; EE
+162C; CARRIER DLI; I
+162D; CARRIER DLA; A
+162E; CARRIER LHU; U
+162F; CARRIER LHO; O
+1630; CARRIER LHE; E
+1631; CARRIER LHEE; EE
+1632; CARRIER LHI; I
+1633; CARRIER LHA; A
+1634; CARRIER TLHU; U
+1635; CARRIER TLHO; O
+1636; CARRIER TLHE; E
+1637; CARRIER TLHEE; EE
+1638; CARRIER TLHI; I
+1639; CARRIER TLHA; A
+163A; CARRIER TLU; U
+163B; CARRIER TLO; O
+163C; CARRIER TLE; E
+163D; CARRIER TLEE; EE
+163E; CARRIER TLI; I
+163F; CARRIER TLA; A
+1640; CARRIER ZU; U
+1641; CARRIER ZO; O
+1642; CARRIER ZE; E
+1643; CARRIER ZEE; EE
+1644; CARRIER ZI; I
+1645; CARRIER ZA; A
+1646; CARRIER Z;
+1647; CARRIER INITIAL Z;
+1648; CARRIER DZU; U
+1649; CARRIER DZO; O
+164A; CARRIER DZE; E
+164B; CARRIER DZEE; EE
+164C; CARRIER DZI; I
+164D; CARRIER DZA; A
+164E; CARRIER SU; U
+164F; CARRIER SO; O
+1650; CARRIER SE; E
+1651; CARRIER SEE; EE
+1652; CARRIER SI; I
+1653; CARRIER SA; A
+1654; CARRIER SHU; U
+1655; CARRIER SHO; O
+1656; CARRIER SHE; E
+1657; CARRIER SHEE; EE
+1658; CARRIER SHI; I
+1659; CARRIER SHA; A
+165A; CARRIER SH;
+165B; CARRIER TSU; U
+165C; CARRIER TSO; O
+165D; CARRIER TSE; E
+165E; CARRIER TSEE; EE
+165F; CARRIER TSI; I
+1660; CARRIER TSA; A
+1661; CARRIER CHU; U
+1662; CARRIER CHO; O
+1663; CARRIER CHE; E
+1664; CARRIER CHEE; EE
+1665; CARRIER CHI; I
+1666; CARRIER CHA; A
+1667; CARRIER TTSU; U
+1668; CARRIER TTSO; O
+1669; CARRIER TTSE; E
+166A; CARRIER TTSEE; EE
+166B; CARRIER TTSI; I
+166C; CARRIER TTSA; A
+166F; QAI; AI
+1670; NGAI; AI
+1671; NNGI; I
+1672; NNGII; II
+1673; NNGO; O
+1674; NNGOO; OO
+1675; NNGA; A
+1676; NNGAA; AA
+#
+# Katakana
+#
+30A1; SMALL A; A
+30A2; A; A
+30A3; SMALL I; I
+30A4; I; I
+30A5; SMALL U; U
+30A6; U; U
+30A7; SMALL E; E
+30A8; E; E
+30A9; SMALL O; O
+30AA; O; O
+30AB; KA; A
+30AC; GA; A
+30AD; KI; I
+30AE; GI; I
+30AF; KU; U
+30B0; GU; U
+30B1; KE; E
+30B2; GE; E
+30B3; KO; O
+30B4; GO; O
+30B5; SA; A
+30B6; ZA; A
+30B7; SI; I
+30B8; ZI; I
+30B9; SU; U
+30BA; ZU; U
+30BB; SE; E
+30BC; ZE; E
+30BD; SO; O
+30BE; ZO; O
+30BF; TA; A
+30C0; DA; A
+30C1; TI; I
+30C2; DI; I
+30C3; SMALL TU; U
+30C4; TU; U
+30C5; DU; U
+30C6; TE; E
+30C7; DE; E
+30C8; TO; O
+30C9; DO; O
+30CA; NA; A
+30CB; NI; I
+30CC; NU; U
+30CD; NE; E
+30CE; NO; O
+30CF; HA; A
+30D0; BA; A
+30D1; PA; A
+30D2; HI; I
+30D3; BI; I
+30D4; PI; I
+30D5; HU; U
+30D6; BU; U
+30D7; PU; U
+30D8; HE; E
+30D9; BE; E
+30DA; PE; E
+30DB; HO; O
+30DC; BO; O
+30DD; PO; O
+30DE; MA; A
+30DF; MI; I
+30E0; MU; U
+30E1; ME; E
+30E2; MO; O
+30E3; SMALL YA; A
+30E4; YA; A
+30E5; SMALL YU; U
+30E6; YU; U
+30E7; SMALL YO; O
+30E8; YO; O
+30E9; RA; A
+30EA; RI; I
+30EB; RU; U
+30EC; RE; E
+30ED; RO; O
+30EE; SMALL WA; A
+30EF; WA; A
+30F0; WI; I
+30F1; WE; E
+30F2; WO; O
+30F3; N; C
+30F4; VU; U
+30F5; SMALL KA; A
+30F6; SMALL KE; E
+30F7; VA; A
+30F8; VI; I
+30F9; VE; E
+30FA; VO; O
+32D0; CIRCLED KATAKANA A; A
+32D1; CIRCLED KATAKANA I; I
+32D2; CIRCLED KATAKANA U; U
+32D3; CIRCLED KATAKANA E; E
+32D4; CIRCLED KATAKANA O; O
+32D5; CIRCLED KATAKANA KA; A
+32D6; CIRCLED KATAKANA KI; I
+32D7; CIRCLED KATAKANA KU; U
+32D8; CIRCLED KATAKANA KE; E
+32D9; CIRCLED KATAKANA KO; O
+32DA; CIRCLED KATAKANA SA; A
+32DB; CIRCLED KATAKANA SI; I
+32DC; CIRCLED KATAKANA SU; U
+32DD; CIRCLED KATAKANA SE; E
+32DE; CIRCLED KATAKANA SO; O
+32DF; CIRCLED KATAKANA TA; A
+32E0; CIRCLED KATAKANA TI; I
+32E1; CIRCLED KATAKANA TU; U
+32E2; CIRCLED KATAKANA TE; E
+32E3; CIRCLED KATAKANA TO; O
+32E4; CIRCLED KATAKANA NA; A
+32E5; CIRCLED KATAKANA NI; I
+32E6; CIRCLED KATAKANA NU; U
+32E7; CIRCLED KATAKANA NE; E
+32E8; CIRCLED KATAKANA NO; O
+32E9; CIRCLED KATAKANA HA; A
+32EA; CIRCLED KATAKANA HI; I
+32EB; CIRCLED KATAKANA HU; U
+32EC; CIRCLED KATAKANA HE; E
+32ED; CIRCLED KATAKANA HO; O
+32EE; CIRCLED KATAKANA MA; A
+32EF; CIRCLED KATAKANA MI; I
+32F0; CIRCLED KATAKANA MU; U
+32F1; CIRCLED KATAKANA ME; E
+32F2; CIRCLED KATAKANA MO; O
+32F3; CIRCLED KATAKANA YA; A
+32F4; CIRCLED KATAKANA YU; U
+32F5; CIRCLED KATAKANA YO; O
+32F6; CIRCLED KATAKANA RA; A
+32F7; CIRCLED KATAKANA RI; I
+32F8; CIRCLED KATAKANA RU; U
+32F9; CIRCLED KATAKANA RE; E
+32FA; CIRCLED KATAKANA RO; O
+32FB; CIRCLED KATAKANA WA; A
+32FC; CIRCLED KATAKANA WI; I
+32FD; CIRCLED KATAKANA WE; E
+32FE; CIRCLED KATAKANA WO; O
+#
+# Katakana
+#
+FF66; HALFWIDTH WO; O
+FF67; HALFWIDTH SMALL A; A
+FF68; HALFWIDTH SMALL I; I
+FF69; HALFWIDTH SMALL U; U
+FF6A; HALFWIDTH SMALL E; E
+FF6B; HALFWIDTH SMALL O; O
+FF6C; HALFWIDTH SMALL YA; A
+FF6D; HALFWIDTH SMALL YU; U
+FF6E; HALFWIDTH SMALL YO; O
+FF6F; HALFWIDTH SMALL TU; U
+FF71; HALFWIDTH A; A
+FF72; HALFWIDTH I; I
+FF73; HALFWIDTH U; U
+FF74; HALFWIDTH E; E
+FF75; HALFWIDTH O; O
+FF76; HALFWIDTH KA; A
+FF77; HALFWIDTH KI; I
+FF78; HALFWIDTH KU; U
+FF79; HALFWIDTH KE; E
+FF7A; HALFWIDTH KO; O
+FF7B; HALFWIDTH SA; A
+FF7C; HALFWIDTH SI; I
+FF7D; HALFWIDTH SU; U
+FF7E; HALFWIDTH SE; E
+FF7F; HALFWIDTH SO; O
+FF80; HALFWIDTH TA; A
+FF81; HALFWIDTH TI; I
+FF82; HALFWIDTH TU; U
+FF83; HALFWIDTH TE; E
+FF84; HALFWIDTH TO; O
+FF85; HALFWIDTH NA; A
+FF86; HALFWIDTH NI; I
+FF87; HALFWIDTH NU; U
+FF88; HALFWIDTH NE; E
+FF89; HALFWIDTH NO; O
+FF8A; HALFWIDTH HA; A
+FF8B; HALFWIDTH HI; I
+FF8C; HALFWIDTH HU; U
+FF8D; HALFWIDTH HE; E
+FF8E; HALFWIDTH HO; O
+FF8F; HALFWIDTH MA; A
+FF90; HALFWIDTH MI; I
+FF91; HALFWIDTH MU; U
+FF92; HALFWIDTH ME; E
+FF93; HALFWIDTH MO; O
+FF94; HALFWIDTH YA; A
+FF95; HALFWIDTH YU; U
+FF96; HALFWIDTH YO; O
+FF97; HALFWIDTH RA; A
+FF98; HALFWIDTH RI; I
+FF99; HALFWIDTH RU; U
+FF9A; HALFWIDTH RE; E
+FF9B; HALFWIDTH RO; O
+FF9C; HALFWIDTH WA; A
+FF9D; HALFWIDTH N; C
+#
+# Hiragana
+#
+3041; SMALL A; A
+3042; A; A
+3043; SMALL I; I
+3044; I; I
+3045; SMALL U; U
+3046; U; U
+3047; SMALL E; E
+3048; E; E
+3049; SMALL O; O
+304A; O; O
+304B; KA; A
+304C; GA; A
+304D; KI; I
+304E; GI; I
+304F; KU; U
+3050; GU; U
+3051; KE; E
+3052; GE; E
+3053; KO; O
+3054; GO; O
+3055; SA; A
+3056; ZA; A
+3057; SI; I
+3058; ZI; I
+3059; SU; U
+305A; ZU; U
+305B; SE; E
+305C; ZE; E
+305D; SO; O
+305E; ZO; O
+305F; TA; A
+3060; DA; A
+3061; TI; I
+3062; DI; I
+3063; SMALL TU; U
+3064; TU; U
+3065; DU; U
+3066; TE; E
+3067; DE; E
+3068; TO; O
+3069; DO; O
+306A; NA; A
+306B; NI; I
+306C; NU; U
+306D; NE; E
+306E; NO; O
+306F; HA; A
+3070; BA; A
+3071; PA; A
+3072; HI; I
+3073; BI; I
+3074; PI; I
+3075; HU; U
+3076; BU; U
+3077; PU; U
+3078; HE; E
+3079; BE; E
+307A; PE; E
+307B; HO; O
+307C; BO; O
+307D; PO; O
+307E; MA; A
+307F; MI; I
+3080; MU; U
+3081; ME; E
+3082; MO; O
+3083; SMALL YA; A
+3084; YA; A
+3085; SMALL YU; U
+3086; YU; U
+3087; SMALL YO; O
+3088; YO; O
+3089; RA; A
+308A; RI; I
+308B; RU; U
+308C; RE; E
+308D; RO; O
+308E; SMALL WA; A
+308F; WA; A
+3090; WI; I
+3091; WE; E
+3092; WO; O
+3093; N; N
+3094; VU; U
diff --git a/contrib/perl5/lib/utf8.pm b/contrib/perl5/lib/utf8.pm
new file mode 100644
index 0000000..17ec37b
--- /dev/null
+++ b/contrib/perl5/lib/utf8.pm
@@ -0,0 +1,77 @@
+package utf8;
+
+$utf8::hint_bits = 0x00800000;
+
+sub import {
+ $^H |= $utf8::hint_bits;
+ $enc{caller()} = $_[1] if $_[1];
+}
+
+sub unimport {
+ $^H &= ~$utf8::hint_bits;
+}
+
+sub AUTOLOAD {
+ require "utf8_heavy.pl";
+ goto &$AUTOLOAD;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+utf8 - Perl pragma to enable/disable UTF-8 in source code
+
+=head1 SYNOPSIS
+
+ use utf8;
+ no utf8;
+
+=head1 DESCRIPTION
+
+WARNING: The implementation of Unicode support in Perl is incomplete.
+See L<perlunicode> for the exact details.
+
+The C<use utf8> pragma tells the Perl parser to allow UTF-8 in the
+program text in the current lexical scope. The C<no utf8> pragma
+tells Perl to switch back to treating the source text as literal
+bytes in the current lexical scope.
+
+This pragma is primarily a compatibility device. Perl versions
+earlier than 5.6 allowed arbitrary bytes in source code, whereas
+in future we would like to standardize on the UTF-8 encoding for
+source text. Until UTF-8 becomes the default format for source
+text, this pragma should be used to recognize UTF-8 in the source.
+When UTF-8 becomes the standard source format, this pragma will
+effectively become a no-op.
+
+Enabling the C<utf8> pragma has the following effects:
+
+=over
+
+=item *
+
+Bytes in the source text that have their high-bit set will be treated
+as being part of a literal UTF-8 character. This includes most literals
+such as identifiers, string constants, constant regular expression patterns
+and package names.
+
+=item *
+
+In the absence of inputs marked as UTF-8, regular expressions within the
+scope of this pragma will default to using character semantics instead
+of byte semantics.
+
+ @bytes_or_chars = split //, $data; # may split to bytes if data
+ # $data isn't UTF-8
+ {
+ use utf8; # force char semantics
+ @chars = split //, $data; # splits characters
+ }
+
+=head1 SEE ALSO
+
+L<perlunicode>, L<bytes>
+
+=cut
diff --git a/contrib/perl5/lib/utf8_heavy.pl b/contrib/perl5/lib/utf8_heavy.pl
new file mode 100644
index 0000000..8649e9e
--- /dev/null
+++ b/contrib/perl5/lib/utf8_heavy.pl
@@ -0,0 +1,221 @@
+package utf8;
+
+my $DEBUG = 0;
+my $seq = "AAA0000";
+
+sub DESTROY {}
+
+sub croak { require Carp; Carp::croak(@_) }
+
+sub SWASHNEW {
+ my ($class, $type, $list, $minbits, $none) = @_;
+ local $^D = 0 if $^D;
+ print STDERR "SWASHNEW @_\n" if $DEBUG;
+ my $extras;
+ my $bits;
+
+ if ($type and ref ${"${class}::{$type}"} eq $class) {
+ warn qq/Found \${"${class}::{$type}"}\n/ if $DEBUG;
+ return ${"${class}::{$type}"}; # Already there...
+ }
+
+ $type ||= $seq++;
+
+ my $caller;
+ my $i = 0;
+ while (($caller = caller($i)) eq __PACKAGE__) { $i++ }
+ my $encoding = $enc{$caller} || "unicode";
+ (my $file = $type) =~ s!::!/!g;
+ $file =~ s#^(I[sn]|To)([A-Z].*)#$1/$2#;
+ $list ||= eval { $caller->$type(); }
+ || do "$file.pl"
+ || do "$encoding/$file.pl"
+ || do "$encoding/Is/${type}.pl"
+ || croak("Can't find $encoding character property definition via $caller->$type or $file.pl");
+
+ $| = 1;
+
+ if ($list) {
+ my @tmp = split(/^/m, $list);
+ my %seen;
+ no warnings;
+ $extras = join '', grep /^[^0-9a-fA-F]/, @tmp;
+ $list = join '',
+ sort { hex $a <=> hex $b }
+ grep {/^([0-9a-fA-F]+)/ and not $seen{$1}++} @tmp; # XXX doesn't do ranges right
+ }
+
+ if ($none) {
+ my $hextra = sprintf "%04x", $none + 1;
+ $list =~ s/\tXXXX$/\t$hextra/mg;
+ }
+
+ if ($minbits < 32) {
+ my $top = 0;
+ while ($list =~ /^([0-9a-fA-F]+)(?:\t([0-9a-fA-F]+)?)(?:\t([0-9a-fA-F]+))?/mg) {
+ my $min = hex $1;
+ my $max = hex(defined $2 ? $2 : $1);
+ my $val = hex(defined $3 ? $3 : "");
+ $val += $max - $min if defined $3;
+ $top = $val if $val > $top;
+ }
+ $bits =
+ $top > 0xffff ? 32 :
+ $top > 0xff ? 16 :
+ $top > 1 ? 8 : 1
+ }
+ $bits = $minbits if $bits < $minbits;
+
+ my @extras;
+ for my $x ($extras) {
+ pos $x = 0;
+ while ($x =~ /^([^0-9a-fA-F\n])(.*)/mg) {
+ my $char = $1;
+ my $name = $2;
+ # print STDERR "$1 => $2\n" if $DEBUG;
+ if ($char =~ /[-+!]/) {
+ my ($c,$t) = split(/::/, $name, 2); # bogus use of ::, really
+ my $subobj = $c->SWASHNEW($t, "", 0, 0, 0);
+ push @extras, $name => $subobj;
+ $bits = $subobj->{BITS} if $bits < $subobj->{BITS};
+ }
+ }
+ }
+
+ print STDERR "CLASS = $class, TYPE => $type, BITS => $bits, NONE => $none\nEXTRAS =>\n$extras\nLIST =>\n$list\n" if $DEBUG;
+
+ ${"${class}::{$type}"} = bless {
+ TYPE => $type,
+ BITS => $bits,
+ EXTRAS => $extras,
+ LIST => $list,
+ NONE => $none,
+ @extras,
+ } => $class;
+}
+
+# NOTE: utf8.c:swash_init() assumes entries are never modified once generated.
+
+sub SWASHGET {
+ my ($self, $start, $len) = @_;
+ local $^D = 0 if $^D;
+ my $type = $self->{TYPE};
+ my $bits = $self->{BITS};
+ my $none = $self->{NONE};
+ print STDERR "SWASHGET @_ [$type/$bits/$none]\n" if $DEBUG;
+ my $end = $start + $len;
+ my $swatch = "";
+ my $key;
+ vec($swatch, $len - 1, $bits) = 0; # Extend to correct length.
+ if ($none) {
+ for $key (0 .. $len - 1) { vec($swatch, $key, $bits) = $none }
+ }
+
+ for ($self->{LIST}) {
+ pos $_ = 0;
+ if ($bits > 1) {
+ LINE:
+ while (/^([0-9a-fA-F]+)(?:\t([0-9a-fA-F]+)?)(?:\t([0-9a-fA-F]+))?/mg) {
+ my $min = hex $1;
+ my $max = (defined $2 ? hex $2 : $min);
+ my $val = hex $3;
+ next if $max < $start;
+# print "$min $max $val\n";
+ if ($none) {
+ if ($min < $start) {
+ $val += $start - $min if $val < $none;
+ $min = $start;
+ }
+ for ($key = $min; $key <= $max; $key++) {
+ last LINE if $key >= $end;
+# print STDERR "$key => $val\n" if $DEBUG;
+ vec($swatch, $key - $start, $bits) = $val;
+ ++$val if $val < $none;
+ }
+ }
+ else {
+ if ($min < $start) {
+ $val += $start - $min;
+ $min = $start;
+ }
+ for ($key = $min; $key <= $max; $key++, $val++) {
+ last LINE if $key >= $end;
+# print STDERR "$key => $val\n" if $DEBUG;
+ vec($swatch, $key - $start, $bits) = $val;
+ }
+ }
+ }
+ }
+ else {
+ LINE:
+ while (/^([0-9a-fA-F]+)(?:\t([0-9a-fA-F]+))?/mg) {
+ my $min = hex $1;
+ my $max = (defined $2 ? hex $2 : $min);
+ next if $max < $start;
+ if ($min < $start) {
+ $min = $start;
+ }
+ for ($key = $min; $key <= $max; $key++) {
+ last LINE if $key >= $end;
+# print STDERR "$key => 1\n" if $DEBUG;
+ vec($swatch, $key - $start, 1) = 1;
+ }
+ }
+ }
+ }
+ for my $x ($self->{EXTRAS}) {
+ pos $x = 0;
+ while ($x =~ /^([-+!])(.*)/mg) {
+ my $char = $1;
+ my $name = $2;
+ print STDERR "INDIRECT $1 $2\n" if $DEBUG;
+ my $otherbits = $self->{$name}->{BITS};
+ croak("SWASHGET size mismatch") if $bits < $otherbits;
+ my $other = $self->{$name}->SWASHGET($start, $len);
+ if ($char eq '+') {
+ if ($bits == 1 and $otherbits == 1) {
+ $swatch |= $other;
+ }
+ else {
+ for ($key = 0; $key < $len; $key++) {
+ vec($swatch, $key, $bits) = vec($other, $key, $otherbits);
+ }
+ }
+ }
+ elsif ($char eq '!') {
+ if ($bits == 1 and $otherbits == 1) {
+ $swatch |= ~$other;
+ }
+ else {
+ for ($key = 0; $key < $len; $key++) {
+ if (!vec($other, $key, $otherbits)) {
+ vec($swatch, $key, $bits) = 1;
+ }
+ }
+ }
+ }
+ elsif ($char eq '-') {
+ if ($bits == 1 and $otherbits == 1) {
+ $swatch &= ~$other;
+ }
+ else {
+ for ($key = 0; $key < $len; $key++) {
+ if (vec($other, $key, $otherbits)) {
+ vec($swatch, $key, $bits) = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ if ($DEBUG) {
+ print STDERR "CELLS ";
+ for ($key = 0; $key < $len; $key++) {
+ print STDERR vec($swatch, $key, $bits), " ";
+ }
+ print STDERR "\n";
+ }
+ $swatch;
+}
+
+1;
diff --git a/contrib/perl5/lib/vars.pm b/contrib/perl5/lib/vars.pm
index 334af96..bde0b2a 100644
--- a/contrib/perl5/lib/vars.pm
+++ b/contrib/perl5/lib/vars.pm
@@ -8,13 +8,14 @@ require 5.002;
# if Carp hasn't been loaded in earlier compile time. :-(
# We'll let those bugs get found on the development track.
require Carp if $] < 5.00450;
+use warnings::register();
sub import {
my $callpack = caller;
my ($pack, @imports, $sym, $ch) = @_;
foreach $sym (@imports) {
($ch, $sym) = unpack('a1a*', $sym);
- if ($sym =~ tr/A-Za-Z_0-9//c) {
+ if ($sym =~ tr/A-Za-z_0-9//c) {
# time for a more-detailed check-up
if ($sym =~ /::/) {
require Carp;
@@ -22,9 +23,8 @@ sub import {
} elsif ($sym =~ /^\w+[[{].*[]}]$/) {
require Carp;
Carp::croak("Can't declare individual elements of hash or array");
- } elsif ($^W and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
- require Carp;
- Carp::carp("No need to declare built-in vars");
+ } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
+ warnings::warn("No need to declare built-in vars");
}
}
*{"${callpack}::$sym"} =
@@ -45,7 +45,7 @@ __END__
=head1 NAME
-vars - Perl pragma to predeclare global variable names
+vars - Perl pragma to predeclare global variable names (obsolete)
=head1 SYNOPSIS
@@ -53,6 +53,10 @@ vars - Perl pragma to predeclare global variable names
=head1 DESCRIPTION
+NOTE: The functionality provided by this pragma has been superseded
+by C<our> declarations, available in Perl v5.6.0 or later. See
+L<perlfunc/our>.
+
This will predeclare all the variables whose names are
in the list, allowing you to use them under "use strict", and
disabling any typo warnings.
diff --git a/contrib/perl5/lib/warnings.pm b/contrib/perl5/lib/warnings.pm
new file mode 100644
index 0000000..11558d5
--- /dev/null
+++ b/contrib/perl5/lib/warnings.pm
@@ -0,0 +1,318 @@
+
+# This file was created by warnings.pl
+# Any changes made here will be lost.
+#
+
+package warnings;
+
+=head1 NAME
+
+warnings - Perl pragma to control optional warnings
+
+=head1 SYNOPSIS
+
+ use warnings;
+ no warnings;
+
+ use warnings "all";
+ no warnings "all";
+
+ use warnings::register;
+ if (warnings::enabled()) {
+ warnings::warn("some warning");
+ }
+
+ if (warnings::enabled("void")) {
+ warnings::warn("void", "some warning");
+ }
+
+=head1 DESCRIPTION
+
+If no import list is supplied, all possible warnings are either enabled
+or disabled.
+
+A number of functions are provided to assist module authors.
+
+=over 4
+
+=item use warnings::register
+
+Creates a new warnings category which has the same name as the module
+where the call to the pragma is used.
+
+=item warnings::enabled([$category])
+
+Returns TRUE if the warnings category C<$category> is enabled in the
+calling module. Otherwise returns FALSE.
+
+If the parameter, C<$category>, isn't supplied, the current package name
+will be used.
+
+=item warnings::warn([$category,] $message)
+
+If the calling module has I<not> set C<$category> to "FATAL", print
+C<$message> to STDERR.
+If the calling module has set C<$category> to "FATAL", print C<$message>
+STDERR then die.
+
+If the parameter, C<$category>, isn't supplied, the current package name
+will be used.
+
+=back
+
+See L<perlmod/Pragmatic Modules> and L<perllexwarn>.
+
+=cut
+
+use Carp ;
+
+%Offsets = (
+ 'all' => 0,
+ 'chmod' => 2,
+ 'closure' => 4,
+ 'exiting' => 6,
+ 'glob' => 8,
+ 'io' => 10,
+ 'closed' => 12,
+ 'exec' => 14,
+ 'newline' => 16,
+ 'pipe' => 18,
+ 'unopened' => 20,
+ 'misc' => 22,
+ 'numeric' => 24,
+ 'once' => 26,
+ 'overflow' => 28,
+ 'pack' => 30,
+ 'portable' => 32,
+ 'recursion' => 34,
+ 'redefine' => 36,
+ 'regexp' => 38,
+ 'severe' => 40,
+ 'debugging' => 42,
+ 'inplace' => 44,
+ 'internal' => 46,
+ 'malloc' => 48,
+ 'signal' => 50,
+ 'substr' => 52,
+ 'syntax' => 54,
+ 'ambiguous' => 56,
+ 'bareword' => 58,
+ 'deprecated' => 60,
+ 'digit' => 62,
+ 'parenthesis' => 64,
+ 'precedence' => 66,
+ 'printf' => 68,
+ 'prototype' => 70,
+ 'qw' => 72,
+ 'reserved' => 74,
+ 'semicolon' => 76,
+ 'taint' => 78,
+ 'umask' => 80,
+ 'uninitialized' => 82,
+ 'unpack' => 84,
+ 'untie' => 86,
+ 'utf8' => 88,
+ 'void' => 90,
+ 'y2k' => 92,
+ );
+
+%Bits = (
+ 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x15", # [0..46]
+ 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [28]
+ 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [29]
+ 'chmod' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
+ 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
+ 'closure' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+ 'debugging' => "\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [21]
+ 'deprecated' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [30]
+ 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [31]
+ 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
+ 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
+ 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
+ 'inplace' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [22]
+ 'internal' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [23]
+ 'io' => "\x00\x54\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..10]
+ 'malloc' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [24]
+ 'misc' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
+ 'newline' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
+ 'numeric' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
+ 'once' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
+ 'overflow' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
+ 'pack' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
+ 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [32]
+ 'pipe' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
+ 'portable' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [16]
+ 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [33]
+ 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [34]
+ 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [35]
+ 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [36]
+ 'recursion' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [17]
+ 'redefine' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [18]
+ 'regexp' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [19]
+ 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [37]
+ 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [38]
+ 'severe' => "\x00\x00\x00\x00\x00\x55\x01\x00\x00\x00\x00\x00", # [20..24]
+ 'signal' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [25]
+ 'substr' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [26]
+ 'syntax' => "\x00\x00\x00\x00\x00\x00\x40\x55\x55\x15\x00\x00", # [27..38]
+ 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [39]
+ 'umask' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [40]
+ 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [41]
+ 'unopened' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
+ 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [42]
+ 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [43]
+ 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [44]
+ 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [45]
+ 'y2k' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [46]
+ );
+
+%DeadBits = (
+ 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x2a", # [0..46]
+ 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [28]
+ 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [29]
+ 'chmod' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
+ 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
+ 'closure' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
+ 'debugging' => "\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [21]
+ 'deprecated' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [30]
+ 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [31]
+ 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
+ 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
+ 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
+ 'inplace' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [22]
+ 'internal' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [23]
+ 'io' => "\x00\xa8\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..10]
+ 'malloc' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [24]
+ 'misc' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
+ 'newline' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
+ 'numeric' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
+ 'once' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
+ 'overflow' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
+ 'pack' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
+ 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [32]
+ 'pipe' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
+ 'portable' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [16]
+ 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [33]
+ 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [34]
+ 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [35]
+ 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [36]
+ 'recursion' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [17]
+ 'redefine' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [18]
+ 'regexp' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [19]
+ 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [37]
+ 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [38]
+ 'severe' => "\x00\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00", # [20..24]
+ 'signal' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [25]
+ 'substr' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [26]
+ 'syntax' => "\x00\x00\x00\x00\x00\x00\x80\xaa\xaa\x2a\x00\x00", # [27..38]
+ 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [39]
+ 'umask' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [40]
+ 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [41]
+ 'unopened' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
+ 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [42]
+ 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [43]
+ 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [44]
+ 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [45]
+ 'y2k' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [46]
+ );
+
+$NONE = "\0\0\0\0\0\0\0\0\0\0\0\0";
+$LAST_BIT = 94 ;
+$BYTES = 12 ;
+
+$All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
+
+sub bits {
+ my $mask ;
+ my $catmask ;
+ my $fatal = 0 ;
+ foreach my $word (@_) {
+ if ($word eq 'FATAL') {
+ $fatal = 1;
+ }
+ elsif ($catmask = $Bits{$word}) {
+ $mask |= $catmask ;
+ $mask |= $DeadBits{$word} if $fatal ;
+ }
+ else
+ { croak("unknown warnings category '$word'")}
+ }
+
+ return $mask ;
+}
+
+sub import {
+ shift;
+ ${^WARNING_BITS} |= bits(@_ ? @_ : 'all') ;
+}
+
+sub unimport {
+ shift;
+ my $mask = ${^WARNING_BITS} ;
+ if (vec($mask, $Offsets{'all'}, 1)) {
+ $mask = $Bits{'all'} ;
+ $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+ }
+ ${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
+}
+
+sub enabled
+{
+ croak("Usage: warnings::enabled([category])")
+ unless @_ == 1 || @_ == 0 ;
+ local $Carp::CarpLevel = 1 ;
+ my $category ;
+ my $offset ;
+ my $callers_bitmask = (caller(1))[9] ;
+ return 0 unless defined $callers_bitmask ;
+
+
+ if (@_) {
+ # check the category supplied.
+ $category = shift ;
+ $offset = $Offsets{$category};
+ croak("unknown warnings category '$category'")
+ unless defined $offset;
+ }
+ else {
+ $category = (caller(0))[0] ;
+ $offset = $Offsets{$category};
+ croak("package '$category' not registered for warnings")
+ unless defined $offset ;
+ }
+
+ return vec($callers_bitmask, $offset, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}, 1) ;
+}
+
+
+sub warn
+{
+ croak("Usage: warnings::warn([category,] 'message')")
+ unless @_ == 2 || @_ == 1 ;
+ local $Carp::CarpLevel = 1 ;
+ my $category ;
+ my $offset ;
+ my $callers_bitmask = (caller(1))[9] ;
+
+ if (@_ == 2) {
+ $category = shift ;
+ $offset = $Offsets{$category};
+ croak("unknown warnings category '$category'")
+ unless defined $offset ;
+ }
+ else {
+ $category = (caller(0))[0] ;
+ $offset = $Offsets{$category};
+ croak("package '$category' not registered for warnings")
+ unless defined $offset ;
+ }
+
+ my $message = shift ;
+ croak($message)
+ if vec($callers_bitmask, $offset+1, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+ carp($message) ;
+}
+
+1;
diff --git a/contrib/perl5/lib/warnings/register.pm b/contrib/perl5/lib/warnings/register.pm
new file mode 100644
index 0000000..da6be97
--- /dev/null
+++ b/contrib/perl5/lib/warnings/register.pm
@@ -0,0 +1,30 @@
+package warnings::register ;
+
+require warnings ;
+
+sub mkMask
+{
+ my ($bit) = @_ ;
+ my $mask = "" ;
+
+ vec($mask, $bit, 1) = 1 ;
+ return $mask ;
+}
+
+sub import
+{
+ shift ;
+ my $package = (caller(0))[0] ;
+ if (! defined $warnings::Bits{$package}) {
+ $warnings::Bits{$package} = mkMask($warnings::LAST_BIT) ;
+ vec($warnings::Bits{'all'}, $warnings::LAST_BIT, 1) = 1 ;
+ $warnings::Offsets{$package} = $warnings::LAST_BIT ++ ;
+ foreach my $k (keys %warnings::Bits) {
+ vec($warnings::Bits{$k}, $warnings::LAST_BIT, 1) = 0 ;
+ }
+ $warnings::DeadBits{$package} = mkMask($warnings::LAST_BIT);
+ vec($warnings::DeadBits{'all'}, $warnings::LAST_BIT++, 1) = 1 ;
+ }
+}
+
+1 ;
diff --git a/contrib/perl5/makeaperl.SH b/contrib/perl5/makeaperl.SH
index 16b7435..45812ba 100755
--- a/contrib/perl5/makeaperl.SH
+++ b/contrib/perl5/makeaperl.SH
@@ -1,4 +1,4 @@
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
diff --git a/contrib/perl5/makedef.pl b/contrib/perl5/makedef.pl
new file mode 100644
index 0000000..e63034b
--- /dev/null
+++ b/contrib/perl5/makedef.pl
@@ -0,0 +1,794 @@
+#
+# Create the export list for perl.
+#
+# Needed by WIN32 and OS/2 for creating perl.dll
+# and by AIX for creating libperl.a when -Dusershrplib is in effect.
+#
+# reads global.sym, pp.sym, perlvars.h, intrpvar.h, thrdvar.h, config.h
+# On OS/2 reads miniperl.map as well
+
+my $PLATFORM;
+my $CCTYPE;
+
+my %bincompat5005 =
+ (
+ Perl_call_atexit => "perl_atexit",
+ Perl_eval_sv => "perl_eval_sv",
+ Perl_eval_pv => "perl_eval_pv",
+ Perl_call_argv => "perl_call_argv",
+ Perl_call_method => "perl_call_method",
+ Perl_call_pv => "perl_call_pv",
+ Perl_call_sv => "perl_call_sv",
+ Perl_get_av => "perl_get_av",
+ Perl_get_cv => "perl_get_cv",
+ Perl_get_hv => "perl_get_hv",
+ Perl_get_sv => "perl_get_sv",
+ Perl_init_i18nl10n => "perl_init_i18nl10n",
+ Perl_init_i18nl14n => "perl_init_i18nl14n",
+ Perl_new_collate => "perl_new_collate",
+ Perl_new_ctype => "perl_new_ctype",
+ Perl_new_numeric => "perl_new_numeric",
+ Perl_require_pv => "perl_require_pv",
+ Perl_safesyscalloc => "Perl_safecalloc",
+ Perl_safesysfree => "Perl_safefree",
+ Perl_safesysmalloc => "Perl_safemalloc",
+ Perl_safesysrealloc => "Perl_saferealloc",
+ Perl_set_numeric_local => "perl_set_numeric_local",
+ Perl_set_numeric_standard => "perl_set_numeric_standard",
+ Perl_malloc => "malloc",
+ Perl_mfree => "free",
+ Perl_realloc => "realloc",
+ Perl_calloc => "calloc",
+ );
+
+my $bincompat5005 = join("|", keys %bincompat5005);
+
+while (@ARGV) {
+ my $flag = shift;
+ $define{$1} = 1 if ($flag =~ /^-D(\w+)$/);
+ $define{$1} = $2 if ($flag =~ /^-D(\w+)=(.+)$/);
+ $CCTYPE = $1 if ($flag =~ /^CCTYPE=(\w+)$/);
+ $PLATFORM = $1 if ($flag =~ /^PLATFORM=(\w+)$/);
+}
+
+my @PLATFORM = qw(aix win32 os2);
+my %PLATFORM;
+@PLATFORM{@PLATFORM} = ();
+
+defined $PLATFORM || die "PLATFORM undefined, must be one of: @PLATFORM\n";
+exists $PLATFORM{$PLATFORM} || die "PLATFORM must be one of: @PLATFORM\n";
+
+my $config_sh = "config.sh";
+my $config_h = "config.h";
+my $thrdvar_h = "thrdvar.h";
+my $intrpvar_h = "intrpvar.h";
+my $perlvars_h = "perlvars.h";
+my $global_sym = "global.sym";
+my $pp_sym = "pp.sym";
+my $globvar_sym = "globvar.sym";
+my $perlio_sym = "perlio.sym";
+
+if ($PLATFORM eq 'aix') {
+ # Nothing for now.
+}
+elsif ($PLATFORM eq 'win32') {
+ $CCTYPE = "MSVC" unless defined $CCTYPE;
+ foreach ($thrdvar_h, $intrpvar_h, $perlvars_h, $global_sym, $pp_sym, $globvar_sym) {
+ s!^!..\\!;
+ }
+}
+
+unless ($PLATFORM eq 'win32') {
+ open(CFG,$config_sh) || die "Cannot open $config_sh: $!\n";
+ while (<CFG>) {
+ if (/^(?:ccflags|optimize)='(.+)'$/) {
+ $_ = $1;
+ $define{$1} = 1 while /-D(\w+)/g;
+ }
+ if ($PLATFORM eq 'os2') {
+ $CONFIG_ARGS = $1 if /^(?:config_args)='(.+)'$/;
+ $ARCHNAME = $1 if /^(?:archname)='(.+)'$/;
+ }
+ }
+ close(CFG);
+}
+
+open(CFG,$config_h) || die "Cannot open $config_h: $!\n";
+while (<CFG>) {
+ $define{$1} = 1 if /^\s*#\s*define\s+(MYMALLOC)\b/;
+ $define{$1} = 1 if /^\s*#\s*define\s+(USE_5005THREADS)\b/;
+ $define{$1} = 1 if /^\s*#\s*define\s+(USE_ITHREADS)\b/;
+ $define{$1} = 1 if /^\s*#\s*define\s+(USE_PERLIO)\b/;
+ $define{$1} = 1 if /^\s*#\s*define\s+(MULTIPLICITY)\b/;
+ $define{$1} = 1 if /^\s*#\s*define\s+(PERL_IMPLICIT_SYS)\b/;
+ $define{$1} = 1 if /^\s*#\s*define\s+(PERL_BINCOMPAT_5005)\b/;
+}
+close(CFG);
+
+# perl.h logic duplication begins
+
+if ($define{USE_ITHREADS}) {
+ if (!$define{MULTIPLICITY} && !$define{PERL_OBJECT}) {
+ $define{MULTIPLICITY} = 1;
+ }
+}
+
+$define{PERL_IMPLICIT_CONTEXT} ||=
+ $define{USE_ITHREADS} ||
+ $define{USE_5005THREADS} ||
+ $define{MULTIPLICITY} ;
+
+if ($define{PERL_CAPI}) {
+ delete $define{PERL_OBJECT};
+ $define{MULTIPLICITY} = 1;
+ $define{PERL_IMPLICIT_CONTEXT} = 1;
+ $define{PERL_IMPLICIT_SYS} = 1;
+}
+
+if ($define{PERL_OBJECT}) {
+ $define{PERL_IMPLICIT_CONTEXT} = 1;
+ $define{PERL_IMPLICIT_SYS} = 1;
+}
+
+# perl.h logic duplication ends
+
+if ($PLATFORM eq 'win32') {
+ warn join(' ',keys %define)."\n";
+ print "LIBRARY Perl56\n";
+ print "DESCRIPTION 'Perl interpreter'\n";
+ print "EXPORTS\n";
+ if ($define{PERL_IMPLICIT_SYS}) {
+ output_symbol("perl_get_host_info");
+ output_symbol("perl_alloc_override");
+ }
+}
+elsif ($PLATFORM eq 'os2') {
+ ($v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/;
+ $v .= '-thread' if $ARCHNAME =~ /-thread/;
+ #$sum = 0;
+ #for (split //, $v) {
+ # $sum = ($sum * 33) + ord;
+ # $sum &= 0xffffff;
+ #}
+ #$sum += $sum >> 5;
+ #$sum &= 0xffff;
+ #$sum = printf '%X', $sum;
+ ($dll = $define{PERL_DLL}) =~ s/\.dll$//i;
+ # print STDERR "'$dll' <= '$define{PERL_DLL}'\n";
+ print <<"---EOP---";
+LIBRARY '$dll' INITINSTANCE TERMINSTANCE
+DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter, configured as $CONFIG_ARGS'
+STACKSIZE 32768
+CODE LOADONCALL
+DATA LOADONCALL NONSHARED MULTIPLE
+EXPORTS
+---EOP---
+}
+elsif ($PLATFORM eq 'aix') {
+ print "#!\n";
+}
+
+my %skip;
+my %export;
+
+sub skip_symbols {
+ my $list = shift;
+ foreach my $symbol (@$list) {
+ $skip{$symbol} = 1;
+ }
+}
+
+sub emit_symbols {
+ my $list = shift;
+ foreach my $symbol (@$list) {
+ my $skipsym = $symbol;
+ # XXX hack
+ if ($define{PERL_OBJECT} || $define{MULTIPLICITY}) {
+ $skipsym =~ s/^Perl_[GIT](\w+)_ptr$/PL_$1/;
+ }
+ emit_symbol($symbol) unless exists $skip{$skipsym};
+ }
+}
+
+if ($PLATFORM eq 'win32') {
+ skip_symbols [qw(
+ PL_statusvalue_vms
+ PL_archpat_auto
+ PL_cryptseen
+ PL_DBcv
+ PL_generation
+ PL_lastgotoprobe
+ PL_linestart
+ PL_modcount
+ PL_pending_ident
+ PL_sortcxix
+ PL_sublex_info
+ PL_timesbuf
+ main
+ Perl_ErrorNo
+ Perl_GetVars
+ Perl_do_exec3
+ Perl_do_ipcctl
+ Perl_do_ipcget
+ Perl_do_msgrcv
+ Perl_do_msgsnd
+ Perl_do_semop
+ Perl_do_shmio
+ Perl_dump_fds
+ Perl_init_thread_intern
+ Perl_my_bzero
+ Perl_my_htonl
+ Perl_my_ntohl
+ Perl_my_swap
+ Perl_my_chsize
+ Perl_same_dirent
+ Perl_setenv_getix
+ Perl_unlnk
+ Perl_watch
+ Perl_safexcalloc
+ Perl_safexmalloc
+ Perl_safexfree
+ Perl_safexrealloc
+ Perl_my_memcmp
+ Perl_my_memset
+ PL_cshlen
+ PL_cshname
+ PL_opsave
+ Perl_do_exec
+ Perl_getenv_len
+ Perl_my_pclose
+ Perl_my_popen
+ )];
+}
+elsif ($PLATFORM eq 'aix') {
+ skip_symbols([qw(
+ Perl_dump_fds
+ Perl_ErrorNo
+ Perl_GetVars
+ Perl_my_bcopy
+ Perl_my_bzero
+ Perl_my_chsize
+ Perl_my_htonl
+ Perl_my_memcmp
+ Perl_my_memset
+ Perl_my_ntohl
+ Perl_my_swap
+ Perl_safexcalloc
+ Perl_safexfree
+ Perl_safexmalloc
+ Perl_safexrealloc
+ Perl_same_dirent
+ Perl_unlnk
+ Perl_sys_intern_dup
+ PL_cryptseen
+ PL_opsave
+ PL_statusvalue_vms
+ PL_sys_intern
+ )]);
+}
+elsif ($PLATFORM eq 'os2') {
+ emit_symbols([qw(
+ ctermid
+ get_sysinfo
+ Perl_OS2_init
+ OS2_Perl_data
+ dlopen
+ dlsym
+ dlerror
+ dlclose
+ my_tmpfile
+ my_tmpnam
+ my_flock
+ malloc_mutex
+ threads_mutex
+ nthreads
+ nthreads_cond
+ os2_cond_wait
+ os2_stat
+ pthread_join
+ pthread_create
+ pthread_detach
+ XS_Cwd_change_drive
+ XS_Cwd_current_drive
+ XS_Cwd_extLibpath
+ XS_Cwd_extLibpath_set
+ XS_Cwd_sys_abspath
+ XS_Cwd_sys_chdir
+ XS_Cwd_sys_cwd
+ XS_Cwd_sys_is_absolute
+ XS_Cwd_sys_is_relative
+ XS_Cwd_sys_is_rooted
+ XS_DynaLoader_mod2fname
+ XS_File__Copy_syscopy
+ Perl_Register_MQ
+ Perl_Deregister_MQ
+ Perl_Serve_Messages
+ Perl_Process_Messages
+ init_PMWIN_entries
+ PMWIN_entries
+ Perl_hab_GET
+ )]);
+}
+
+unless ($define{'DEBUGGING'}) {
+ skip_symbols [qw(
+ Perl_deb
+ Perl_deb_growlevel
+ Perl_debop
+ Perl_debprofdump
+ Perl_debstack
+ Perl_debstackptrs
+ Perl_runops_debug
+ Perl_sv_peek
+ PL_block_type
+ PL_watchaddr
+ PL_watchok
+ )];
+}
+
+if ($define{'PERL_IMPLICIT_SYS'}) {
+ skip_symbols [qw(
+ Perl_getenv_len
+ Perl_my_popen
+ Perl_my_pclose
+ )];
+}
+else {
+ skip_symbols [qw(
+ PL_Mem
+ PL_MemShared
+ PL_MemParse
+ PL_Env
+ PL_StdIO
+ PL_LIO
+ PL_Dir
+ PL_Sock
+ PL_Proc
+ )];
+}
+
+unless ($define{'PERL_FLEXIBLE_EXCEPTIONS'}) {
+ skip_symbols [qw(
+ PL_protect
+ Perl_default_protect
+ Perl_vdefault_protect
+ )];
+}
+
+if ($define{'MYMALLOC'}) {
+ emit_symbols [qw(
+ Perl_dump_mstats
+ Perl_get_mstats
+ Perl_malloc
+ Perl_mfree
+ Perl_realloc
+ Perl_calloc
+ )];
+ if ($define{'USE_5005THREADS'} || $define{'USE_ITHREADS'}) {
+ emit_symbols [qw(
+ PL_malloc_mutex
+ )];
+ }
+ else {
+ skip_symbols [qw(
+ PL_malloc_mutex
+ )];
+ }
+}
+else {
+ skip_symbols [qw(
+ PL_malloc_mutex
+ Perl_dump_mstats
+ Perl_get_mstats
+ Perl_malloc
+ Perl_mfree
+ Perl_realloc
+ Perl_calloc
+ Perl_malloced_size
+ )];
+}
+
+unless ($define{'USE_5005THREADS'} || $define{'USE_ITHREADS'}) {
+ skip_symbols [qw(
+ PL_thr_key
+ )];
+}
+
+unless ($define{'USE_5005THREADS'}) {
+ skip_symbols [qw(
+ PL_sv_mutex
+ PL_strtab_mutex
+ PL_svref_mutex
+ PL_cred_mutex
+ PL_eval_mutex
+ PL_eval_cond
+ PL_eval_owner
+ PL_threads_mutex
+ PL_nthreads
+ PL_nthreads_cond
+ PL_threadnum
+ PL_threadsv_names
+ PL_thrsv
+ PL_vtbl_mutex
+ Perl_condpair_magic
+ Perl_new_struct_thread
+ Perl_per_thread_magicals
+ Perl_thread_create
+ Perl_find_threadsv
+ Perl_unlock_condpair
+ Perl_magic_mutexfree
+ )];
+}
+
+unless ($define{'USE_ITHREADS'}) {
+ skip_symbols [qw(
+ PL_ptr_table
+ PL_op_mutex
+ Perl_dirp_dup
+ Perl_cx_dup
+ Perl_si_dup
+ Perl_any_dup
+ Perl_ss_dup
+ Perl_fp_dup
+ Perl_gp_dup
+ Perl_he_dup
+ Perl_mg_dup
+ Perl_re_dup
+ Perl_sv_dup
+ Perl_sys_intern_dup
+ Perl_ptr_table_fetch
+ Perl_ptr_table_new
+ Perl_ptr_table_split
+ Perl_ptr_table_store
+ perl_clone
+ perl_clone_using
+ )];
+}
+
+unless ($define{'PERL_IMPLICIT_CONTEXT'}) {
+ skip_symbols [qw(
+ Perl_croak_nocontext
+ Perl_die_nocontext
+ Perl_deb_nocontext
+ Perl_form_nocontext
+ Perl_load_module_nocontext
+ Perl_mess_nocontext
+ Perl_warn_nocontext
+ Perl_warner_nocontext
+ Perl_newSVpvf_nocontext
+ Perl_sv_catpvf_nocontext
+ Perl_sv_setpvf_nocontext
+ Perl_sv_catpvf_mg_nocontext
+ Perl_sv_setpvf_mg_nocontext
+ )];
+}
+
+unless ($define{'PERL_IMPLICIT_SYS'}) {
+ skip_symbols [qw(
+ perl_alloc_using
+ perl_clone_using
+ )];
+}
+
+unless ($define{'FAKE_THREADS'}) {
+ skip_symbols [qw(PL_curthr)];
+}
+
+sub readvar {
+ my $file = shift;
+ my $proc = shift || sub { "PL_$_[2]" };
+ open(VARS,$file) || die "Cannot open $file: $!\n";
+ my @syms;
+ while (<VARS>) {
+ # All symbols have a Perl_ prefix because that's what embed.h
+ # sticks in front of them.
+ push(@syms, &$proc($1,$2,$3)) if (/\bPERLVAR(A?I?C?)\(([IGT])(\w+)/);
+ }
+ close(VARS);
+ return \@syms;
+}
+
+if ($define{'USE_5005THREADS'}) {
+ my $thrd = readvar($thrdvar_h);
+ skip_symbols $thrd;
+}
+
+if ($define{'PERL_GLOBAL_STRUCT'}) {
+ my $global = readvar($perlvars_h);
+ skip_symbols $global;
+ emit_symbol('Perl_GetVars');
+ emit_symbols [qw(PL_Vars PL_VarsPtr)] unless $CCTYPE eq 'GCC';
+}
+
+# functions from *.sym files
+
+my @syms = ($global_sym, $globvar_sym); # $pp_sym is not part of the API
+
+if ($define{'USE_PERLIO'}) {
+ push @syms, $perlio_sym;
+}
+
+for my $syms (@syms) {
+ open (GLOBAL, "<$syms") || die "failed to open $syms: $!\n";
+ while (<GLOBAL>) {
+ next if (!/^[A-Za-z]/);
+ # Functions have a Perl_ prefix
+ # Variables have a PL_ prefix
+ chomp($_);
+ my $symbol = ($syms =~ /var\.sym$/i ? "PL_" : "");
+ $symbol .= $_;
+ emit_symbol($symbol) unless exists $skip{$symbol};
+ }
+ close(GLOBAL);
+}
+
+# variables
+
+if ($define{'PERL_OBJECT'} || $define{'MULTIPLICITY'}) {
+ for my $f ($perlvars_h, $intrpvar_h, $thrdvar_h) {
+ my $glob = readvar($f, sub { "Perl_" . $_[1] . $_[2] . "_ptr" });
+ emit_symbols $glob;
+ }
+ # XXX AIX seems to want the perlvars.h symbols, for some reason
+ if ($PLATFORM eq 'aix') {
+ my $glob = readvar($perlvars_h);
+ emit_symbols $glob;
+ }
+}
+else {
+ unless ($define{'PERL_GLOBAL_STRUCT'}) {
+ my $glob = readvar($perlvars_h);
+ emit_symbols $glob;
+ }
+ unless ($define{'MULTIPLICITY'}) {
+ my $glob = readvar($intrpvar_h);
+ emit_symbols $glob;
+ }
+ unless ($define{'MULTIPLICITY'} || $define{'USE_5005THREADS'}) {
+ my $glob = readvar($thrdvar_h);
+ emit_symbols $glob;
+ }
+}
+
+sub try_symbol {
+ my $symbol = shift;
+
+ return if $symbol !~ /^[A-Za-z]/;
+ return if $symbol =~ /^\#/;
+ $symbol =~s/\r//g;
+ chomp($symbol);
+ return if exists $skip{$symbol};
+ emit_symbol($symbol);
+}
+
+while (<DATA>) {
+ try_symbol($_);
+}
+
+if ($PLATFORM eq 'win32') {
+ foreach my $symbol (qw(
+ boot_DynaLoader
+ Perl_init_os_extras
+ Perl_thread_create
+ Perl_win32_init
+ RunPerl
+ win32_errno
+ win32_environ
+ win32_stdin
+ win32_stdout
+ win32_stderr
+ win32_ferror
+ win32_feof
+ win32_strerror
+ win32_fprintf
+ win32_printf
+ win32_vfprintf
+ win32_vprintf
+ win32_fread
+ win32_fwrite
+ win32_fopen
+ win32_fdopen
+ win32_freopen
+ win32_fclose
+ win32_fputs
+ win32_fputc
+ win32_ungetc
+ win32_getc
+ win32_fileno
+ win32_clearerr
+ win32_fflush
+ win32_ftell
+ win32_fseek
+ win32_fgetpos
+ win32_fsetpos
+ win32_rewind
+ win32_tmpfile
+ win32_abort
+ win32_fstat
+ win32_stat
+ win32_pipe
+ win32_popen
+ win32_pclose
+ win32_rename
+ win32_setmode
+ win32_lseek
+ win32_tell
+ win32_dup
+ win32_dup2
+ win32_open
+ win32_close
+ win32_eof
+ win32_read
+ win32_write
+ win32_spawnvp
+ win32_mkdir
+ win32_rmdir
+ win32_chdir
+ win32_flock
+ win32_execv
+ win32_execvp
+ win32_htons
+ win32_ntohs
+ win32_htonl
+ win32_ntohl
+ win32_inet_addr
+ win32_inet_ntoa
+ win32_socket
+ win32_bind
+ win32_listen
+ win32_accept
+ win32_connect
+ win32_send
+ win32_sendto
+ win32_recv
+ win32_recvfrom
+ win32_shutdown
+ win32_closesocket
+ win32_ioctlsocket
+ win32_setsockopt
+ win32_getsockopt
+ win32_getpeername
+ win32_getsockname
+ win32_gethostname
+ win32_gethostbyname
+ win32_gethostbyaddr
+ win32_getprotobyname
+ win32_getprotobynumber
+ win32_getservbyname
+ win32_getservbyport
+ win32_select
+ win32_endhostent
+ win32_endnetent
+ win32_endprotoent
+ win32_endservent
+ win32_getnetent
+ win32_getnetbyname
+ win32_getnetbyaddr
+ win32_getprotoent
+ win32_getservent
+ win32_sethostent
+ win32_setnetent
+ win32_setprotoent
+ win32_setservent
+ win32_getenv
+ win32_putenv
+ win32_perror
+ win32_setbuf
+ win32_setvbuf
+ win32_flushall
+ win32_fcloseall
+ win32_fgets
+ win32_gets
+ win32_fgetc
+ win32_putc
+ win32_puts
+ win32_getchar
+ win32_putchar
+ win32_malloc
+ win32_calloc
+ win32_realloc
+ win32_free
+ win32_sleep
+ win32_times
+ win32_access
+ win32_alarm
+ win32_chmod
+ win32_open_osfhandle
+ win32_get_osfhandle
+ win32_ioctl
+ win32_link
+ win32_unlink
+ win32_utime
+ win32_uname
+ win32_wait
+ win32_waitpid
+ win32_kill
+ win32_str_os_error
+ win32_opendir
+ win32_readdir
+ win32_telldir
+ win32_seekdir
+ win32_rewinddir
+ win32_closedir
+ win32_longpath
+ win32_os_id
+ win32_getpid
+ win32_crypt
+ win32_dynaload
+ ))
+ {
+ try_symbol($symbol);
+ }
+}
+elsif ($PLATFORM eq 'os2') {
+ open MAP, 'miniperl.map' or die 'Cannot read miniperl.map';
+ /^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach <MAP>;
+ close MAP or die 'Cannot close miniperl.map';
+
+ @missing = grep { !exists $mapped{$_} and !exists $bincompat5005{$_} }
+ keys %export;
+ delete $export{$_} foreach @missing;
+}
+
+# Now all symbols should be defined because
+# next we are going to output them.
+
+foreach my $symbol (sort keys %export) {
+ output_symbol($symbol);
+}
+
+sub emit_symbol {
+ my $symbol = shift;
+ chomp($symbol);
+ $export{$symbol} = 1;
+}
+
+sub output_symbol {
+ my $symbol = shift;
+ $symbol = $bincompat5005{$symbol}
+ if $define{PERL_BINCOMPAT_5005} and $symbol =~ /^($bincompat5005)$/;
+ if ($PLATFORM eq 'win32') {
+ $symbol = "_$symbol" if $CCTYPE eq 'BORLAND';
+ print "\t$symbol\n";
+# XXX: binary compatibility between compilers is an exercise
+# in frustration :-(
+# if ($CCTYPE eq "BORLAND") {
+# # workaround Borland quirk by exporting both the straight
+# # name and a name with leading underscore. Note the
+# # alias *must* come after the symbol itself, if both
+# # are to be exported. (Linker bug?)
+# print "\t_$symbol\n";
+# print "\t$symbol = _$symbol\n";
+# }
+# elsif ($CCTYPE eq 'GCC') {
+# # Symbols have leading _ whole process is $%@"% slow
+# # so skip aliases for now
+# nprint "\t$symbol\n";
+# }
+# else {
+# # for binary coexistence, export both the symbol and
+# # alias with leading underscore
+# print "\t$symbol\n";
+# print "\t_$symbol = $symbol\n";
+# }
+ }
+ elsif ($PLATFORM eq 'os2') {
+ print qq( "$symbol"\n);
+ }
+ elsif ($PLATFORM eq 'aix') {
+ print "$symbol\n";
+ }
+}
+
+1;
+__DATA__
+# extra globals not included above.
+perl_alloc
+perl_alloc_using
+perl_clone
+perl_clone_using
+perl_construct
+perl_destruct
+perl_free
+perl_parse
+perl_run
diff --git a/contrib/perl5/makedepend.SH b/contrib/perl5/makedepend.SH
index 0f32da3..7129e08 100755
--- a/contrib/perl5/makedepend.SH
+++ b/contrib/perl5/makedepend.SH
@@ -1,5 +1,5 @@
#! /bin/sh
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
@@ -37,7 +37,7 @@ esac
export PATH || (echo "OOPS, this isn't sh. Desperation time. I will feed myself to sh."; sh \$0; kill \$\$)
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
@@ -105,7 +105,11 @@ for file in `$cat .clist`; do
if [ "$osname" = os2 ]; then
uwinfix="-e s,\\\\\\\\,/,g"
else
- uwinfix=
+ if [ "$archname" = cygwin ]; then
+ uwinfix="-e s,\\\\\\\\,/,g"
+ else
+ uwinfix=
+ fi
fi
fi
case "$file" in
@@ -126,8 +130,12 @@ for file in `$cat .clist`; do
-e 's|\\$||' \
-e p \
-e '}' ) >UU/$file.c
+ if [ "$osname" = os390 -a "$file" = perly.c ]; then
+ $echo '#endif' >>UU/$file.c
+ fi
$cppstdin $finc -I. $cppflags $cppminus <UU/$file.c |
$sed \
+ -e '1d' \
-e '/^#.*<stdin>/d' \
-e '/^#.*"-"/d' \
-e 's#\.[0-9][0-9]*\.c#'"$file.c#" \
diff --git a/contrib/perl5/makedir.SH b/contrib/perl5/makedir.SH
index 09908ed..d1650e7 100755
--- a/contrib/perl5/makedir.SH
+++ b/contrib/perl5/makedir.SH
@@ -1,4 +1,4 @@
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test ! -f config.sh; then
ln ../config.sh . || \
diff --git a/contrib/perl5/malloc.c b/contrib/perl5/malloc.c
index eca7322..57ca5a1 100644
--- a/contrib/perl5/malloc.c
+++ b/contrib/perl5/malloc.c
@@ -3,7 +3,8 @@
*/
/*
- Here are some notes on configuring Perl's malloc.
+ Here are some notes on configuring Perl's malloc. (For non-perl
+ usage see below.)
There are two macros which serve as bulk disablers of advanced
features of this malloc: NO_FANCY_MALLOC, PLAIN_MALLOC (undef by
@@ -62,6 +63,9 @@
# Which allocator to use if PERL_SBRK_VIA_MALLOC
SYSTEM_ALLOC(a) malloc(a)
+ # Minimal alignment (in bytes, should be a power of 2) of SYSTEM_ALLOC
+ SYSTEM_ALLOC_ALIGNMENT MEM_ALIGNBYTES
+
# Disable memory overwrite checking with DEBUGGING. Memory and speed
# optimization, error reporting pessimization.
NO_RCHECK undef
@@ -111,6 +115,49 @@
*/
+/*
+ If used outside of Perl environment, it may be useful to redefine
+ the following macros (listed below with defaults):
+
+ # Type of address returned by allocation functions
+ Malloc_t void *
+
+ # Type of size argument for allocation functions
+ MEM_SIZE unsigned long
+
+ # size of void*
+ PTRSIZE 4
+
+ # Maximal value in LONG
+ LONG_MAX 0x7FFFFFFF
+
+ # Unsigned integer type big enough to keep a pointer
+ UV unsigned long
+
+ # Type of pointer with 1-byte granularity
+ caddr_t char *
+
+ # Type returned by free()
+ Free_t void
+
+ # Very fatal condition reporting function (cannot call any )
+ fatalcroak(arg) write(2,arg,strlen(arg)) + exit(2)
+
+ # Fatal error reporting function
+ croak(format, arg) warn(idem) + exit(1)
+
+ # Error reporting function
+ warn(format, arg) fprintf(stderr, idem)
+
+ # Locking/unlocking for MT operation
+ MALLOC_LOCK MUTEX_LOCK(&PL_malloc_mutex)
+ MALLOC_UNLOCK MUTEX_UNLOCK(&PL_malloc_mutex)
+
+ # Locking/unlocking mutex for MT operation
+ MUTEX_LOCK(l) void
+ MUTEX_UNLOCK(l) void
+ */
+
#ifndef NO_FANCY_MALLOC
# ifndef SMALL_BUCKET_VIA_TABLE
# define SMALL_BUCKET_VIA_TABLE
@@ -167,12 +214,28 @@
* implementation, the available sizes are 2^n-4 (or 2^n-12) bytes long.
* If PACK_MALLOC is defined, small blocks are 2^n bytes long.
* This is designed for use in a program that uses vast quantities of memory,
- * but bombs when it runs out.
+ * but bombs when it runs out.
+ *
+ * Modifications Copyright Ilya Zakharevich 1996-99.
+ *
+ * Still very quick, but much more thrifty. (Std config is 10% slower
+ * than it was, and takes 67% of old heap size for typical usage.)
+ *
+ * Allocations of small blocks are now table-driven to many different
+ * buckets. Sizes of really big buckets are increased to accomodata
+ * common size=power-of-2 blocks. Running-out-of-memory is made into
+ * an exception. Deeply configurable and thread-safe.
+ *
*/
#ifdef PERL_CORE
# include "EXTERN.h"
+# define PERL_IN_MALLOC_C
# include "perl.h"
+# if defined(PERL_IMPLICIT_CONTEXT)
+# define croak Perl_croak_nocontext
+# define warn Perl_warn_nocontext
+# endif
#else
# ifdef PERL_FOR_X2P
# include "../EXTERN.h"
@@ -185,6 +248,9 @@
# ifndef Malloc_t
# define Malloc_t void *
# endif
+# ifndef PTRSIZE
+# define PTRSIZE 4
+# endif
# ifndef MEM_SIZE
# define MEM_SIZE unsigned long
# endif
@@ -206,10 +272,10 @@
# define PerlIO_stderr() stderr
# endif
# ifndef croak /* make depend */
-# define croak(mess, arg) warn((mess), (arg)); exit(1);
+# define croak(mess, arg) (warn((mess), (arg)), exit(1))
# endif
# ifndef warn
-# define warn(mess, arg) fprintf(stderr, (mess), (arg));
+# define warn(mess, arg) fprintf(stderr, (mess), (arg))
# endif
# ifdef DEBUG_m
# undef DEBUG_m
@@ -218,6 +284,30 @@
# ifdef DEBUGGING
# undef DEBUGGING
# endif
+# ifndef pTHX
+# define pTHX void
+# define pTHX_
+# define dTHX extern int Perl___notused
+# define WITH_THX(s) s
+# endif
+# ifndef PERL_GET_INTERP
+# define PERL_GET_INTERP PL_curinterp
+# endif
+# ifndef Perl_malloc
+# define Perl_malloc malloc
+# endif
+# ifndef Perl_mfree
+# define Perl_mfree free
+# endif
+# ifndef Perl_realloc
+# define Perl_realloc realloc
+# endif
+# ifndef Perl_calloc
+# define Perl_calloc calloc
+# endif
+# ifndef Perl_strdup
+# define Perl_strdup strdup
+# endif
#endif
#ifndef MUTEX_LOCK
@@ -228,22 +318,105 @@
# define MUTEX_UNLOCK(l)
#endif
+#ifndef MALLOC_LOCK
+# define MALLOC_LOCK MUTEX_LOCK(&PL_malloc_mutex)
+#endif
+
+#ifndef MALLOC_UNLOCK
+# define MALLOC_UNLOCK MUTEX_UNLOCK(&PL_malloc_mutex)
+#endif
+
+# ifndef fatalcroak /* make depend */
+# define fatalcroak(mess) (write(2, (mess), strlen(mess)), exit(2))
+# endif
+
#ifdef DEBUGGING
# undef DEBUG_m
-# define DEBUG_m(a) if (PL_debug & 128) a
+# define DEBUG_m(a) \
+ STMT_START { \
+ if (PERL_GET_INTERP) { dTHX; if (PL_debug & 128) { a; } } \
+ } STMT_END
#endif
+#ifdef PERL_IMPLICIT_CONTEXT
+# define PERL_IS_ALIVE aTHX
+#else
+# define PERL_IS_ALIVE TRUE
+#endif
+
+
+/*
+ * Layout of memory:
+ * ~~~~~~~~~~~~~~~~
+ * The memory is broken into "blocks" which occupy multiples of 2K (and
+ * generally speaking, have size "close" to a power of 2). The addresses
+ * of such *unused* blocks are kept in nextf[i] with big enough i. (nextf
+ * is an array of linked lists.) (Addresses of used blocks are not known.)
+ *
+ * Moreover, since the algorithm may try to "bite" smaller blocks out
+ * of unused bigger ones, there are also regions of "irregular" size,
+ * managed separately, by a linked list chunk_chain.
+ *
+ * The third type of storage is the sbrk()ed-but-not-yet-used space, its
+ * end and size are kept in last_sbrk_top and sbrked_remains.
+ *
+ * Growing blocks "in place":
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~
+ * The address of the block with the greatest address is kept in last_op
+ * (if not known, last_op is 0). If it is known that the memory above
+ * last_op is not continuous, or contains a chunk from chunk_chain,
+ * last_op is set to 0.
+ *
+ * The chunk with address last_op may be grown by expanding into
+ * sbrk()ed-but-not-yet-used space, or trying to sbrk() more continuous
+ * memory.
+ *
+ * Management of last_op:
+ * ~~~~~~~~~~~~~~~~~~~~~
+ *
+ * free() never changes the boundaries of blocks, so is not relevant.
+ *
+ * The only way realloc() may change the boundaries of blocks is if it
+ * grows a block "in place". However, in the case of success such a
+ * chunk is automatically last_op, and it remains last_op. In the case
+ * of failure getpages_adjacent() clears last_op.
+ *
+ * malloc() may change blocks by calling morecore() only.
+ *
+ * morecore() may create new blocks by:
+ * a) biting pieces from chunk_chain (cannot create one above last_op);
+ * b) biting a piece from an unused block (if block was last_op, this
+ * may create a chunk from chain above last_op, thus last_op is
+ * invalidated in such a case).
+ * c) biting of sbrk()ed-but-not-yet-used space. This creates
+ * a block which is last_op.
+ * d) Allocating new pages by calling getpages();
+ *
+ * getpages() creates a new block. It marks last_op at the bottom of
+ * the chunk of memory it returns.
+ *
+ * Active pages footprint:
+ * ~~~~~~~~~~~~~~~~~~~~~~
+ * Note that we do not need to traverse the lists in nextf[i], just take
+ * the first element of this list. However, we *need* to traverse the
+ * list in chunk_chain, but most the time it should be a very short one,
+ * so we do not step on a lot of pages we are not going to use.
+ *
+ * Flaws:
+ * ~~~~~
+ * get_from_bigger_buckets(): forget to increment price => Quite
+ * aggressive.
+ */
+
/* I don't much care whether these are defined in sys/types.h--LAW */
#define u_char unsigned char
#define u_int unsigned int
-
-#ifdef HAS_QUAD
-# define u_bigint UV /* Needs to eat *void. */
-#else /* needed? */
-# define u_bigint unsigned long /* Needs to eat *void. */
-#endif
-
+/*
+ * I removed the definition of u_bigint which appeared to be u_bigint = UV
+ * u_bigint was only used in TWOK_MASKED and TWOK_SHIFT
+ * where I have used PTR2UV. RMB
+ */
#define u_short unsigned short
/* 286 and atarist like big chunks, which gives too much overhead. */
@@ -268,8 +441,8 @@ union overhead {
double strut; /* alignment problems */
#endif
struct {
- u_char ovu_magic; /* magic number */
u_char ovu_index; /* bucket # */
+ u_char ovu_magic; /* magic number */
#ifdef RCHECK
u_short ovu_size; /* actual block size */
u_int ovu_rmagic; /* range magic number */
@@ -281,13 +454,6 @@ union overhead {
#define ov_rmagic ovu.ovu_rmagic
};
-#ifdef DEBUGGING
-static void botch _((char *diag, char *s));
-#endif
-static void morecore _((int bucket));
-static int findbucket _((union overhead *freep, int srchlen));
-static void add_to_chain(void *p, MEM_SIZE size, MEM_SIZE chip);
-
#define MAGIC 0xff /* magic # on accounting info */
#define RMAGIC 0x55555555 /* magic # on range info */
#define RMAGIC_C 0x55 /* magic # on range info */
@@ -349,36 +515,128 @@ static u_short buck_size[MAX_BUCKET_BY_TABLE + 1] =
#ifdef PACK_MALLOC
-/* In this case it is assumed that if we do sbrk() in 2K units, we
- * will get 2K aligned arenas (at least after some initial
- * alignment). The bucket number of the given subblock is on the start
- * of 2K arena which contains the subblock. Several following bytes
- * contain the magic numbers for the subblocks in the block.
+/* In this case there are several possible layout of arenas depending
+ * on the size. Arenas are of sizes multiple to 2K, 2K-aligned, and
+ * have a size close to a power of 2.
+ *
+ * Arenas of the size >= 4K keep one chunk only. Arenas of size 2K
+ * may keep one chunk or multiple chunks. Here are the possible
+ * layouts of arenas:
+ *
+ * # One chunk only, chunksize 2^k + SOMETHING - ALIGN, k >= 11
+ *
+ * INDEX MAGIC1 UNUSED CHUNK1
+ *
+ * # Multichunk with sanity checking and chunksize 2^k-ALIGN, k>7
+ *
+ * INDEX MAGIC1 MAGIC2 MAGIC3 UNUSED CHUNK1 CHUNK2 CHUNK3 ...
+ *
+ * # Multichunk with sanity checking and size 2^k-ALIGN, k=7
*
- * Sizes of chunks are powers of 2 for chunks in buckets <=
- * MAX_PACKED, after this they are (2^n - sizeof(union overhead)) (to
- * get alignment right).
+ * INDEX MAGIC1 MAGIC2 MAGIC3 UNUSED CHUNK1 UNUSED CHUNK2 CHUNK3 ...
+ *
+ * # Multichunk with sanity checking and size up to 80
+ *
+ * INDEX UNUSED MAGIC1 UNUSED MAGIC2 UNUSED ... CHUNK1 CHUNK2 CHUNK3 ...
+ *
+ * # No sanity check (usually up to 48=byte-long buckets)
+ * INDEX UNUSED CHUNK1 CHUNK2 ...
+ *
+ * Above INDEX and MAGIC are one-byte-long. Sizes of UNUSED are
+ * appropriate to keep algorithms simple and memory aligned. INDEX
+ * encodes the size of the chunk, while MAGICn encodes state (used,
+ * free or non-managed-by-us-so-it-indicates-a-bug) of CHUNKn. MAGIC
+ * is used for sanity checking purposes only. SOMETHING is 0 or 4K
+ * (to make size of big CHUNK accomodate allocations for powers of two
+ * better).
+ *
+ * [There is no need to alignment between chunks, since C rules ensure
+ * that structs which need 2^k alignment have sizeof which is
+ * divisible by 2^k. Thus as far as the last chunk is aligned at the
+ * end of the arena, and 2K-alignment does not contradict things,
+ * everything is going to be OK for sizes of chunks 2^n and 2^n +
+ * 2^k. Say, 80-bit buckets will be 16-bit aligned, and as far as we
+ * put allocations for requests in 65..80 range, all is fine.
+ *
+ * Note, however, that standard malloc() puts more strict
+ * requirements than the above C rules. Moreover, our algorithms of
+ * realloc() may break this idyll, but we suppose that realloc() does
+ * need not change alignment.]
+ *
+ * Is very important to make calculation of the offset of MAGICm as
+ * quick as possible, since it is done on each malloc()/free(). In
+ * fact it is so quick that it has quite little effect on the speed of
+ * doing malloc()/free(). [By default] We forego such calculations
+ * for small chunks, but only to save extra 3% of memory, not because
+ * of speed considerations.
+ *
+ * Here is the algorithm [which is the same for all the allocations
+ * schemes above], see OV_MAGIC(block,bucket). Let OFFSETm be the
+ * offset of the CHUNKm from the start of ARENA. Then offset of
+ * MAGICm is (OFFSET1 >> SHIFT) + ADDOFFSET. Here SHIFT and ADDOFFSET
+ * are numbers which depend on the size of the chunks only.
+ *
+ * Let as check some sanity conditions. Numbers OFFSETm>>SHIFT are
+ * different for all the chunks in the arena if 2^SHIFT is not greater
+ * than size of the chunks in the arena. MAGIC1 will not overwrite
+ * INDEX provided ADDOFFSET is >0 if OFFSET1 < 2^SHIFT. MAGIClast
+ * will not overwrite CHUNK1 if OFFSET1 > (OFFSETlast >> SHIFT) +
+ * ADDOFFSET.
+ *
+ * Make SHIFT the maximal possible (there is no point in making it
+ * smaller). Since OFFSETlast is 2K - CHUNKSIZE, above restrictions
+ * give restrictions on OFFSET1 and on ADDOFFSET.
+ *
+ * In particular, for chunks of size 2^k with k>=6 we can put
+ * ADDOFFSET to be from 0 to 2^k - 2^(11-k), and have
+ * OFFSET1==chunksize. For chunks of size 80 OFFSET1 of 2K%80=48 is
+ * large enough to have ADDOFFSET between 1 and 16 (similarly for 96,
+ * when ADDOFFSET should be 1). In particular, keeping MAGICs for
+ * these sizes gives no additional size penalty.
+ *
+ * However, for chunks of size 2^k with k<=5 this gives OFFSET1 >=
+ * ADDOFSET + 2^(11-k). Keeping ADDOFFSET 0 allows for 2^(11-k)-2^(11-2k)
+ * chunks per arena. This is smaller than 2^(11-k) - 1 which are
+ * needed if no MAGIC is kept. [In fact, having a negative ADDOFFSET
+ * would allow for slightly more buckets per arena for k=2,3.]
+ *
+ * Similarly, for chunks of size 3/2*2^k with k<=5 MAGICs would span
+ * the area up to 2^(11-k)+ADDOFFSET. For k=4 this give optimal
+ * ADDOFFSET as -7..0. For k=3 ADDOFFSET can go up to 4 (with tiny
+ * savings for negative ADDOFFSET). For k=5 ADDOFFSET can go -1..16
+ * (with no savings for negative values).
*
- * Consider an arena for 2^n with n>MAX_PACKED. We suppose that
- * starts of all the chunks in a 2K arena are in different
- * 2^n-byte-long chunks. If the top of the last chunk is aligned on a
- * boundary of 2K block, this means that sizeof(union
- * overhead)*"number of chunks" < 2^n, or sizeof(union overhead)*2K <
- * 4^n, or n > 6 + log2(sizeof()/2)/2, since a chunk of size 2^n -
- * overhead is used. Since this rules out n = 7 for 8 byte alignment,
- * we specialcase allocation of the first of 16 128-byte-long chunks.
+ * In particular, keeping ADDOFFSET 0 for sizes of chunks up to 2^6
+ * leads to tiny pessimizations in case of sizes 4, 8, 12, 24, and
+ * leads to no contradictions except for size=80 (or 96.)
*
- * Note that with the above assumption we automatically have enough
- * place for MAGIC at the start of 2K block. Note also that we
- * overlay union overhead over the chunk, thus the start of small chunks
- * is immediately overwritten after freeing. */
+ * However, it also makes sense to keep no magic for sizes 48 or less.
+ * This is what we do. In this case one needs ADDOFFSET>=1 also for
+ * chunksizes 12, 24, and 48, unless one gets one less chunk per
+ * arena.
+ *
+ * The algo of OV_MAGIC(block,bucket) keeps ADDOFFSET 0 until
+ * chunksize of 64, then makes it 1.
+ *
+ * This allows for an additional optimization: the above scheme leads
+ * to giant overheads for sizes 128 or more (one whole chunk needs to
+ * be sacrifised to keep INDEX). Instead we use chunks not of size
+ * 2^k, but of size 2^k-ALIGN. If we pack these chunks at the end of
+ * the arena, then the beginnings are still in different 2^k-long
+ * sections of the arena if k>=7 for ALIGN==4, and k>=8 if ALIGN=8.
+ * Thus for k>7 the above algo of calculating the offset of the magic
+ * will still give different answers for different chunks. And to
+ * avoid the overrun of MAGIC1 into INDEX, one needs ADDOFFSET of >=1.
+ * In the case k=7 we just move the first chunk an extra ALIGN
+ * backward inside the ARENA (this is done once per arena lifetime,
+ * thus is not a big overhead). */
# define MAX_PACKED_POW2 6
# define MAX_PACKED (MAX_PACKED_POW2 * BUCKETS_PER_POW2 + BUCKET_POW2_SHIFT)
# define MAX_POW2_ALGO ((1<<(MAX_PACKED_POW2 + 1)) - M_OVERHEAD)
# define TWOK_MASK ((1<<LOG_OF_MIN_ARENA) - 1)
-# define TWOK_MASKED(x) ((u_bigint)(x) & ~TWOK_MASK)
-# define TWOK_SHIFT(x) ((u_bigint)(x) & TWOK_MASK)
-# define OV_INDEXp(block) ((u_char*)(TWOK_MASKED(block)))
+# define TWOK_MASKED(x) (PTR2UV(x) & ~TWOK_MASK)
+# define TWOK_SHIFT(x) (PTR2UV(x) & TWOK_MASK)
+# define OV_INDEXp(block) (INT2PTR(u_char*,TWOK_MASKED(block)))
# define OV_INDEX(block) (*OV_INDEXp(block))
# define OV_MAGIC(block,bucket) (*(OV_INDEXp(block) + \
(TWOK_SHIFT(block)>> \
@@ -447,12 +705,18 @@ static u_short blk_shift[LOG_OF_MIN_ARENA * BUCKETS_PER_POW2] =
# endif
};
+# define NEEDED_ALIGNMENT 0x800 /* 2k boundaries */
+# define WANTED_ALIGNMENT 0x800 /* 2k boundaries */
+
#else /* !PACK_MALLOC */
# define OV_MAGIC(block,bucket) (block)->ov_magic
# define OV_INDEX(block) (block)->ov_index
# define CHUNK_SHIFT 1
# define MAX_PACKED -1
+# define NEEDED_ALIGNMENT MEM_ALIGNBYTES
+# define WANTED_ALIGNMENT 0x400 /* 1k boundaries */
+
#endif /* !PACK_MALLOC */
#define M_OVERHEAD (sizeof(union overhead) + RSLOP)
@@ -564,22 +828,31 @@ static char bucket_of[] =
# define SBRK_FAILURE_PRICE 50
#endif
+static void morecore (register int bucket);
+# if defined(DEBUGGING)
+static void botch (char *diag, char *s);
+# endif
+static void add_to_chain (void *p, MEM_SIZE size, MEM_SIZE chip);
+static void* get_from_chain (MEM_SIZE size);
+static void* get_from_bigger_buckets(int bucket, MEM_SIZE size);
+static union overhead *getpages (MEM_SIZE needed, int *nblksp, int bucket);
+static int getpages_adjacent(MEM_SIZE require);
+
#if defined(PERL_EMERGENCY_SBRK) && defined(PERL_CORE)
# ifndef BIG_SIZE
# define BIG_SIZE (1<<16) /* 64K */
# endif
-#ifdef MUTEX_INIT_CALLS_MALLOC
-# undef MUTEX_LOCK
-# define MUTEX_LOCK(m) STMT_START { if (*m) mutex_lock(*m); } STMT_END
-# undef MUTEX_UNLOCK
-# define MUTEX_UNLOCK(m) STMT_START { if (*m) mutex_unlock(*m); } STMT_END
+#ifdef I_MACH_CTHREADS
+# undef MUTEX_LOCK
+# define MUTEX_LOCK(m) STMT_START { if (*m) mutex_lock(*m); } STMT_END
+# undef MUTEX_UNLOCK
+# define MUTEX_UNLOCK(m) STMT_START { if (*m) mutex_unlock(*m); } STMT_END
#endif
static char *emergency_buffer;
static MEM_SIZE emergency_buffer_size;
-static Malloc_t emergency_sbrk(MEM_SIZE size);
static Malloc_t
emergency_sbrk(MEM_SIZE size)
@@ -588,7 +861,7 @@ emergency_sbrk(MEM_SIZE size)
if (size >= BIG_SIZE) {
/* Give the possibility to recover: */
- MUTEX_UNLOCK(&PL_malloc_mutex);
+ MALLOC_UNLOCK;
croak("Out of memory during \"large\" request for %i bytes", size);
}
@@ -599,7 +872,7 @@ emergency_sbrk(MEM_SIZE size)
emergency_buffer += rsize;
return old;
} else {
- dTHR;
+ dTHX;
/* First offense, give a possibility to recover by dieing. */
/* No malloc involved here: */
GV **gvp = (GV**)hv_fetch(PL_defstash, "^M", 2, 0);
@@ -624,7 +897,7 @@ emergency_sbrk(MEM_SIZE size)
/* Got it, now detach SvPV: */
pv = SvPV(sv, n_a);
/* Check alignment: */
- if (((UV)(pv - sizeof(union overhead))) & ((1<<LOG_OF_MIN_ARENA) - 1)) {
+ if ((PTR2UV(pv) - sizeof(union overhead)) & (NEEDED_ALIGNMENT - 1)) {
PerlIO_puts(PerlIO_stderr(),"Bad alignment of $^M!\n");
return (char *)-1; /* die die die */
}
@@ -636,25 +909,35 @@ emergency_sbrk(MEM_SIZE size)
SvCUR(sv) = SvLEN(sv) = 0;
}
do_croak:
- MUTEX_UNLOCK(&PL_malloc_mutex);
+ MALLOC_UNLOCK;
croak("Out of memory during request for %i bytes", size);
+ /* NOTREACHED */
+ return Nullch;
}
#else /* !(defined(PERL_EMERGENCY_SBRK) && defined(PERL_CORE)) */
# define emergency_sbrk(size) -1
#endif /* !(defined(PERL_EMERGENCY_SBRK) && defined(PERL_CORE)) */
+#ifndef BITS_IN_PTR
+# define BITS_IN_PTR (8*PTRSIZE)
+#endif
+
/*
* nextf[i] is the pointer to the next free block of size 2^i. The
* smallest allocatable block is 8 bytes. The overhead information
* precedes the data area returned to the user.
*/
-#define NBUCKETS (32*BUCKETS_PER_POW2 + 1)
+#define NBUCKETS (BITS_IN_PTR*BUCKETS_PER_POW2 + 1)
static union overhead *nextf[NBUCKETS];
+#if defined(PURIFY) && !defined(USE_PERL_SBRK)
+# define USE_PERL_SBRK
+#endif
+
#ifdef USE_PERL_SBRK
#define sbrk(a) Perl_sbrk(a)
-Malloc_t Perl_sbrk _((int size));
+Malloc_t Perl_sbrk (int size);
#else
#ifdef DONT_DECLARE_STD
#ifdef I_UNISTD
@@ -683,6 +966,7 @@ static u_int goodsbrk;
static void
botch(char *diag, char *s)
{
+ dTHX;
PerlIO_printf(PerlIO_stderr(), "assertion botched (%s?): %s\n", diag, s);
PerlProc_abort();
}
@@ -691,7 +975,7 @@ botch(char *diag, char *s)
#endif
Malloc_t
-malloc(register size_t nbytes)
+Perl_malloc(register size_t nbytes)
{
register union overhead *p;
register int bucket;
@@ -704,10 +988,9 @@ malloc(register size_t nbytes)
BARK_64K_LIMIT("Allocation",nbytes,nbytes);
#ifdef DEBUGGING
if ((long)nbytes < 0)
- croak("%s", "panic: malloc");
+ croak("%s", "panic: malloc");
#endif
- MUTEX_LOCK(&PL_malloc_mutex);
/*
* Convert amount of memory requested into
* closest block size stored in hash buckets
@@ -739,6 +1022,7 @@ malloc(register size_t nbytes)
while (shiftr >>= 1)
bucket += BUCKETS_PER_POW2;
}
+ MALLOC_LOCK;
/*
* If nothing in hash bucket right now,
* request more memory from the system.
@@ -746,29 +1030,44 @@ malloc(register size_t nbytes)
if (nextf[bucket] == NULL)
morecore(bucket);
if ((p = nextf[bucket]) == NULL) {
- MUTEX_UNLOCK(&PL_malloc_mutex);
+ MALLOC_UNLOCK;
#ifdef PERL_CORE
- if (!PL_nomemok) {
- PerlIO_puts(PerlIO_stderr(),"Out of memory!\n");
- my_exit(1);
+ {
+ dTHX;
+ if (!PL_nomemok) {
+ PerlIO_puts(PerlIO_stderr(),"Out of memory!\n");
+ my_exit(1);
+ }
}
-#else
- return (NULL);
#endif
+ return (NULL);
}
DEBUG_m(PerlIO_printf(Perl_debug_log,
- "0x%lx: (%05lu) malloc %ld bytes\n",
- (unsigned long)(p+1), (unsigned long)(PL_an++),
+ "0x%"UVxf": (%05lu) malloc %ld bytes\n",
+ PTR2UV(p+1), (unsigned long)(PL_an++),
(long)size));
/* remove from linked list */
#if defined(RCHECK)
- if (((UV)p) & (MEM_ALIGNBYTES - 1))
- PerlIO_printf(PerlIO_stderr(), "Corrupt malloc ptr 0x%lx at 0x%lx\n",
- (unsigned long)*((int*)p),(unsigned long)p);
+ if ((PTR2UV(p)) & (MEM_ALIGNBYTES - 1)) {
+ dTHX;
+ PerlIO_printf(PerlIO_stderr(),
+ "Unaligned pointer in the free chain 0x%"UVxf"\n",
+ PTR2UV(p));
+ }
+ if ((PTR2UV(p->ov_next)) & (MEM_ALIGNBYTES - 1)) {
+ dTHX;
+ PerlIO_printf(PerlIO_stderr(),
+ "Unaligned `next' pointer in the free "
+ "chain 0x"UVxf" at 0x%"UVxf"\n",
+ PTR2UV(p->ov_next), PTR2UV(p));
+ }
#endif
nextf[bucket] = p->ov_next;
+
+ MALLOC_UNLOCK;
+
#ifdef IGNORE_SMALL_BAD_FREE
if (bucket >= FIRST_BUCKET_WITH_CHECK)
#endif
@@ -796,7 +1095,6 @@ malloc(register size_t nbytes)
*((u_int *)((caddr_t)p + nbytes - RSLOP)) = RMAGIC;
}
#endif
- MUTEX_UNLOCK(&PL_malloc_mutex);
return ((Malloc_t)(p + CHUNK_SHIFT));
}
@@ -900,14 +1198,14 @@ get_from_bigger_buckets(int bucket, MEM_SIZE size)
}
static union overhead *
-getpages(int needed, int *nblksp, int bucket)
+getpages(MEM_SIZE needed, int *nblksp, int bucket)
{
/* Need to do (possibly expensive) system call. Try to
optimize it for rare calling. */
MEM_SIZE require = needed - sbrked_remains;
char *cp;
union overhead *ovp;
- int slack = 0;
+ MEM_SIZE slack = 0;
if (sbrk_good > 0) {
if (!last_sbrk_top && require < FIRST_SBRK)
@@ -934,11 +1232,15 @@ getpages(int needed, int *nblksp, int bucket)
/* Common case, anything is fine. */
sbrk_good++;
ovp = (union overhead *) (cp - sbrked_remains);
+ last_op = cp - sbrked_remains;
sbrked_remains = require - (needed - sbrked_remains);
} else if (cp == (char *)-1) { /* no more room! */
ovp = (union overhead *)emergency_sbrk(needed);
if (ovp == (union overhead *)-1)
return 0;
+ if (((char*)ovp) > last_op) { /* Cannot happen with current emergency_sbrk() */
+ last_op = 0;
+ }
return ovp;
} else { /* Non-continuous or first sbrk(). */
long add = sbrked_remains;
@@ -955,11 +1257,10 @@ getpages(int needed, int *nblksp, int bucket)
#if !defined(atarist) && !defined(__MINT__) /* on the atari we dont have to worry about this */
# ifndef I286 /* The sbrk(0) call on the I286 always returns the next segment */
-
- /* CHUNK_SHIFT is 1 for PACK_MALLOC, 0 otherwise. */
- if ((UV)cp & (0x7FF >> CHUNK_SHIFT)) { /* Not aligned. */
- slack = (0x800 >> CHUNK_SHIFT)
- - ((UV)cp & (0x7FF >> CHUNK_SHIFT));
+ /* WANTED_ALIGNMENT may be more than NEEDED_ALIGNMENT, but this may
+ improve performance of memory access. */
+ if (PTR2UV(cp) & (WANTED_ALIGNMENT - 1)) { /* Not aligned. */
+ slack = WANTED_ALIGNMENT - (PTR2UV(cp) & (WANTED_ALIGNMENT - 1));
add += slack;
}
# endif
@@ -981,8 +1282,8 @@ getpages(int needed, int *nblksp, int bucket)
"failed to fix bad sbrk()\n"));
#ifdef PACK_MALLOC
if (slack) {
- MUTEX_UNLOCK(&PL_malloc_mutex);
- croak("%s", "panic: Off-page sbrk");
+ MALLOC_UNLOCK;
+ fatalcroak("panic: Off-page sbrk\n");
}
#endif
if (sbrked_remains) {
@@ -1019,23 +1320,30 @@ getpages(int needed, int *nblksp, int bucket)
* and deduct from block count to reflect.
*/
+# if NEEDED_ALIGNMENT > MEM_ALIGNBYTES
+ if (PTR2UV(ovp) & (NEEDED_ALIGNMENT - 1))
+ fatalcroak("Misalignment of sbrk()\n");
+ else
+# endif
#ifndef I286 /* Again, this should always be ok on an 80286 */
- if ((UV)ovp & 7) {
- ovp = (union overhead *)(((UV)ovp + 8) & ~7);
+ if (PTR2UV(ovp) & (MEM_ALIGNBYTES - 1)) {
DEBUG_m(PerlIO_printf(Perl_debug_log,
"fixing sbrk(): %d bytes off machine alignement\n",
- (int)((UV)ovp & 7)));
+ (int)(PTR2UV(ovp) & (MEM_ALIGNBYTES - 1))));
+ ovp = INT2PTR(union overhead *,(PTR2UV(ovp) + MEM_ALIGNBYTES) &
+ (MEM_ALIGNBYTES - 1));
(*nblksp)--;
# if defined(DEBUGGING_MSTATS)
/* This is only approx. if TWO_POT_OPTIMIZE: */
- sbrk_slack += (1 << bucket);
+ sbrk_slack += (1 << (bucket >> BUCKET_POW2_SHIFT));
# endif
}
#endif
+ ; /* Finish `else' */
sbrked_remains = require - needed;
+ last_op = cp;
}
last_sbrk_top = cp + require;
- last_op = (char*) cp;
#ifdef DEBUGGING_MSTATS
goodsbrk += require;
#endif
@@ -1043,7 +1351,7 @@ getpages(int needed, int *nblksp, int bucket)
}
static int
-getpages_adjacent(int require)
+getpages_adjacent(MEM_SIZE require)
{
if (require <= sbrked_remains) {
sbrked_remains -= require;
@@ -1097,7 +1405,7 @@ morecore(register int bucket)
if (nextf[bucket])
return;
if (bucket == sizeof(MEM_SIZE)*8*BUCKETS_PER_POW2) {
- MUTEX_UNLOCK(&PL_malloc_mutex);
+ MALLOC_UNLOCK;
croak("%s", "Out of memory during ridiculously large request");
}
if (bucket > max_bucket)
@@ -1184,8 +1492,8 @@ morecore(register int bucket)
}
Free_t
-free(void *mp)
-{
+Perl_mfree(void *mp)
+{
register MEM_SIZE size;
register union overhead *ovp;
char *cp = (char*)mp;
@@ -1194,8 +1502,8 @@ free(void *mp)
#endif
DEBUG_m(PerlIO_printf(Perl_debug_log,
- "0x%lx: (%05lu) free\n",
- (unsigned long)cp, (unsigned long)(PL_an++)));
+ "0x%"UVxf": (%05lu) free\n",
+ PTR2UV(cp), (unsigned long)(PL_an++)));
if (cp == NULL)
return;
@@ -1213,20 +1521,38 @@ free(void *mp)
{
static int bad_free_warn = -1;
if (bad_free_warn == -1) {
+ dTHX;
char *pbf = PerlEnv_getenv("PERL_BADFREE");
bad_free_warn = (pbf) ? atoi(pbf) : 1;
}
if (!bad_free_warn)
return;
#ifdef RCHECK
+#ifdef PERL_CORE
+ {
+ dTHX;
+ if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
+ Perl_warner(aTHX_ WARN_MALLOC, "%s free() ignored",
+ ovp->ov_rmagic == RMAGIC - 1 ?
+ "Duplicate" : "Bad");
+ }
+#else
warn("%s free() ignored",
ovp->ov_rmagic == RMAGIC - 1 ? "Duplicate" : "Bad");
+#endif
+#else
+#ifdef PERL_CORE
+ {
+ dTHX;
+ if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
+ Perl_warner(aTHX_ WARN_MALLOC, "%s", "Bad free() ignored");
+ }
#else
warn("%s", "Bad free() ignored");
#endif
+#endif
return; /* sanity */
}
- MUTEX_LOCK(&PL_malloc_mutex);
#ifdef RCHECK
ASSERT(ovp->ov_rmagic == RMAGIC, "chunk's head overwrite");
if (OV_INDEX(ovp) <= MAX_SHORT_BUCKET) {
@@ -1247,74 +1573,90 @@ free(void *mp)
#endif
ASSERT(OV_INDEX(ovp) < NBUCKETS, "chunk's head overwrite");
size = OV_INDEX(ovp);
+
+ MALLOC_LOCK;
ovp->ov_next = nextf[size];
nextf[size] = ovp;
- MUTEX_UNLOCK(&PL_malloc_mutex);
+ MALLOC_UNLOCK;
}
-/*
- * When a program attempts "storage compaction" as mentioned in the
- * old malloc man page, it realloc's an already freed block. Usually
- * this is the last block it freed; occasionally it might be farther
- * back. We have to search all the free lists for the block in order
- * to determine its bucket: 1st we make one pass thru the lists
- * checking only the first block in each; if that fails we search
- * ``reall_srchlen'' blocks in each list for a match (the variable
- * is extern so the caller can modify it). If that fails we just copy
- * however many bytes was given to realloc() and hope it's not huge.
- */
-int reall_srchlen = 4; /* 4 should be plenty, -1 =>'s whole list */
+/* There is no need to do any locking in realloc (with an exception of
+ trying to grow in place if we are at the end of the chain).
+ If somebody calls us from a different thread with the same address,
+ we are sole anyway. */
Malloc_t
-realloc(void *mp, size_t nbytes)
-{
+Perl_realloc(void *mp, size_t nbytes)
+{
register MEM_SIZE onb;
union overhead *ovp;
char *res;
int prev_bucket;
register int bucket;
- int was_alloced = 0, incr;
+ int incr; /* 1 if does not fit, -1 if "easily" fits in a
+ smaller bucket, otherwise 0. */
char *cp = (char*)mp;
#if defined(DEBUGGING) || !defined(PERL_CORE)
MEM_SIZE size = nbytes;
if ((long)nbytes < 0)
- croak("%s", "panic: realloc");
+ croak("%s", "panic: realloc");
#endif
BARK_64K_LIMIT("Reallocation",nbytes,size);
if (!cp)
- return malloc(nbytes);
+ return Perl_malloc(nbytes);
- MUTEX_LOCK(&PL_malloc_mutex);
ovp = (union overhead *)((caddr_t)cp
- sizeof (union overhead) * CHUNK_SHIFT);
bucket = OV_INDEX(ovp);
+
#ifdef IGNORE_SMALL_BAD_FREE
- if ((bucket < FIRST_BUCKET_WITH_CHECK)
- || (OV_MAGIC(ovp, bucket) == MAGIC))
+ if ((bucket >= FIRST_BUCKET_WITH_CHECK)
+ && (OV_MAGIC(ovp, bucket) != MAGIC))
#else
- if (OV_MAGIC(ovp, bucket) == MAGIC)
+ if (OV_MAGIC(ovp, bucket) != MAGIC)
#endif
- {
- was_alloced = 1;
- } else {
- /*
- * Already free, doing "compaction".
- *
- * Search for the old block of memory on the
- * free list. First, check the most common
- * case (last element free'd), then (this failing)
- * the last ``reall_srchlen'' items free'd.
- * If all lookups fail, then assume the size of
- * the memory block being realloc'd is the
- * smallest possible.
- */
- if ((bucket = findbucket(ovp, 1)) < 0 &&
- (bucket = findbucket(ovp, reall_srchlen)) < 0)
- bucket = 0;
- }
+ {
+ static int bad_free_warn = -1;
+ if (bad_free_warn == -1) {
+ dTHX;
+ char *pbf = PerlEnv_getenv("PERL_BADFREE");
+ bad_free_warn = (pbf) ? atoi(pbf) : 1;
+ }
+ if (!bad_free_warn)
+ return Nullch;
+#ifdef RCHECK
+#ifdef PERL_CORE
+ {
+ dTHX;
+ if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
+ Perl_warner(aTHX_ WARN_MALLOC, "%srealloc() %signored",
+ (ovp->ov_rmagic == RMAGIC - 1 ? "" : "Bad "),
+ ovp->ov_rmagic == RMAGIC - 1
+ ? "of freed memory " : "");
+ }
+#else
+ warn("%srealloc() %signored",
+ (ovp->ov_rmagic == RMAGIC - 1 ? "" : "Bad "),
+ ovp->ov_rmagic == RMAGIC - 1 ? "of freed memory " : "");
+#endif
+#else
+#ifdef PERL_CORE
+ {
+ dTHX;
+ if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
+ Perl_warner(aTHX_ WARN_MALLOC, "%s",
+ "Bad realloc() ignored");
+ }
+#else
+ warn("%s", "Bad realloc() ignored");
+#endif
+#endif
+ return Nullch; /* sanity */
+ }
+
onb = BUCKET_SIZE_REAL(bucket);
/*
* avoid the copy if same size block.
@@ -1343,12 +1685,10 @@ realloc(void *mp, size_t nbytes)
incr = 0;
else incr = -1;
}
- if (!was_alloced
#ifdef STRESS_REALLOC
- || 1 /* always do it the hard way */
+ goto hard_way;
#endif
- ) goto hard_way;
- else if (incr == 0) {
+ if (incr == 0) {
inplace_label:
#ifdef RCHECK
/*
@@ -1385,10 +1725,9 @@ realloc(void *mp, size_t nbytes)
}
#endif
res = cp;
- MUTEX_UNLOCK(&PL_malloc_mutex);
DEBUG_m(PerlIO_printf(Perl_debug_log,
- "0x%lx: (%05lu) realloc %ld bytes inplace\n",
- (unsigned long)res,(unsigned long)(PL_an++),
+ "0x%"UVxf": (%05lu) realloc %ld bytes inplace\n",
+ PTR2UV(res),(unsigned long)(PL_an++),
(long)size));
} else if (incr == 1 && (cp - M_OVERHEAD == last_op)
&& (onb > (1 << LOG_OF_MIN_ARENA))) {
@@ -1406,59 +1745,40 @@ realloc(void *mp, size_t nbytes)
newarena = (1 << pow) + POW2_OPTIMIZE_SURPLUS(pow * BUCKETS_PER_POW2);
require = newarena - onb - M_OVERHEAD;
- if (getpages_adjacent(require)) {
+ MALLOC_LOCK;
+ if (cp - M_OVERHEAD == last_op /* We *still* are the last chunk */
+ && getpages_adjacent(require)) {
#ifdef DEBUGGING_MSTATS
nmalloc[bucket]--;
nmalloc[pow * BUCKETS_PER_POW2]++;
#endif
*(cp - M_OVERHEAD) = pow * BUCKETS_PER_POW2; /* Fill index. */
+ MALLOC_UNLOCK;
goto inplace_label;
- } else
+ } else {
+ MALLOC_UNLOCK;
goto hard_way;
+ }
} else {
hard_way:
- MUTEX_UNLOCK(&PL_malloc_mutex);
DEBUG_m(PerlIO_printf(Perl_debug_log,
- "0x%lx: (%05lu) realloc %ld bytes the hard way\n",
- (unsigned long)cp,(unsigned long)(PL_an++),
+ "0x%"UVxf": (%05lu) realloc %ld bytes the hard way\n",
+ PTR2UV(cp),(unsigned long)(PL_an++),
(long)size));
- if ((res = (char*)malloc(nbytes)) == NULL)
+ if ((res = (char*)Perl_malloc(nbytes)) == NULL)
return (NULL);
if (cp != res) /* common optimization */
Copy(cp, res, (MEM_SIZE)(nbytes<onb?nbytes:onb), char);
- if (was_alloced)
- free(cp);
+ Perl_mfree(cp);
}
return ((Malloc_t)res);
}
-/*
- * Search ``srchlen'' elements of each free list for a block whose
- * header starts at ``freep''. If srchlen is -1 search the whole list.
- * Return bucket number, or -1 if not found.
- */
-static int
-findbucket(union overhead *freep, int srchlen)
-{
- register union overhead *p;
- register int i, j;
-
- for (i = 0; i < NBUCKETS; i++) {
- j = 0;
- for (p = nextf[i]; p && j != srchlen; p = p->ov_next) {
- if (p == freep)
- return (i);
- j++;
- }
- }
- return (-1);
-}
-
Malloc_t
-calloc(register size_t elements, register size_t size)
+Perl_calloc(register size_t elements, register size_t size)
{
long sz = elements * size;
- Malloc_t p = malloc(sz);
+ Malloc_t p = Perl_malloc(sz);
if (p) {
memset((void*)p, 0, sz);
@@ -1466,8 +1786,48 @@ calloc(register size_t elements, register size_t size)
return p;
}
+char *
+Perl_strdup(const char *s)
+{
+ MEM_SIZE l = strlen(s);
+ char *s1 = (char *)Perl_malloc(l+1);
+
+ Copy(s, s1, (MEM_SIZE)(l+1), char);
+ return s1;
+}
+
+#ifdef PERL_CORE
+int
+Perl_putenv(char *a)
+{
+ /* Sometimes system's putenv conflicts with my_setenv() - this is system
+ malloc vs Perl's free(). */
+ dTHX;
+ char *var;
+ char *val = a;
+ MEM_SIZE l;
+ char buf[80];
+
+ while (*val && *val != '=')
+ val++;
+ if (!*val)
+ return -1;
+ l = val - a;
+ if (l < sizeof(buf))
+ var = buf;
+ else
+ var = Perl_malloc(l + 1);
+ Copy(a, var, l, char);
+ var[l + 1] = 0;
+ my_setenv(var, val+1);
+ if (var != buf)
+ Perl_mfree(var);
+ return 0;
+}
+# endif
+
MEM_SIZE
-malloced_size(void *p)
+Perl_malloced_size(void *p)
{
union overhead *ovp = (union overhead *)
((caddr_t)p - sizeof (union overhead) * CHUNK_SHIFT);
@@ -1484,13 +1844,62 @@ malloced_size(void *p)
return BUCKET_SIZE_REAL(bucket);
}
-#ifdef DEBUGGING_MSTATS
-
# ifdef BUCKETS_ROOT2
# define MIN_EVEN_REPORT 6
# else
# define MIN_EVEN_REPORT MIN_BUCKET
# endif
+
+int
+Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level)
+{
+#ifdef DEBUGGING_MSTATS
+ register int i, j;
+ register union overhead *p;
+ struct chunk_chain_s* nextchain;
+
+ buf->topbucket = buf->topbucket_ev = buf->topbucket_odd
+ = buf->totfree = buf->total = buf->total_chain = 0;
+
+ buf->minbucket = MIN_BUCKET;
+ MALLOC_LOCK;
+ for (i = MIN_BUCKET ; i < NBUCKETS; i++) {
+ for (j = 0, p = nextf[i]; p; p = p->ov_next, j++)
+ ;
+ if (i < buflen) {
+ buf->nfree[i] = j;
+ buf->ntotal[i] = nmalloc[i];
+ }
+ buf->totfree += j * BUCKET_SIZE_REAL(i);
+ buf->total += nmalloc[i] * BUCKET_SIZE_REAL(i);
+ if (nmalloc[i]) {
+ i % 2 ? (buf->topbucket_odd = i) : (buf->topbucket_ev = i);
+ buf->topbucket = i;
+ }
+ }
+ nextchain = chunk_chain;
+ while (nextchain) {
+ buf->total_chain += nextchain->size;
+ nextchain = nextchain->next;
+ }
+ buf->total_sbrk = goodsbrk + sbrk_slack;
+ buf->sbrks = sbrks;
+ buf->sbrk_good = sbrk_good;
+ buf->sbrk_slack = sbrk_slack;
+ buf->start_slack = start_slack;
+ buf->sbrked_remains = sbrked_remains;
+ MALLOC_UNLOCK;
+ if (level) {
+ for (i = MIN_BUCKET ; i < NBUCKETS; i++) {
+ if (i >= buflen)
+ break;
+ buf->bucket_mem_size[i] = BUCKET_SIZE(i);
+ buf->bucket_available_size[i] = BUCKET_SIZE_REAL(i);
+ }
+ }
+#endif /* defined DEBUGGING_MSTATS */
+ return 0; /* XXX unused */
+}
/*
* mstats - print out statistics about malloc
*
@@ -1499,112 +1908,79 @@ malloced_size(void *p)
* frees for each size category.
*/
void
-dump_mstats(char *s)
+Perl_dump_mstats(pTHX_ char *s)
{
+#ifdef DEBUGGING_MSTATS
register int i, j;
register union overhead *p;
- int topbucket=0, topbucket_ev=0, topbucket_odd=0, totfree=0, total=0;
- u_int nfree[NBUCKETS];
- int total_chain = 0;
- struct chunk_chain_s* nextchain = chunk_chain;
+ perl_mstats_t buffer;
+ unsigned long nf[NBUCKETS];
+ unsigned long nt[NBUCKETS];
+ struct chunk_chain_s* nextchain;
+
+ buffer.nfree = nf;
+ buffer.ntotal = nt;
+ get_mstats(&buffer, NBUCKETS, 0);
- for (i = MIN_BUCKET ; i < NBUCKETS; i++) {
- for (j = 0, p = nextf[i]; p; p = p->ov_next, j++)
- ;
- nfree[i] = j;
- totfree += nfree[i] * BUCKET_SIZE_REAL(i);
- total += nmalloc[i] * BUCKET_SIZE_REAL(i);
- if (nmalloc[i]) {
- i % 2 ? (topbucket_odd = i) : (topbucket_ev = i);
- topbucket = i;
- }
- }
if (s)
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"Memory allocation statistics %s (buckets %ld(%ld)..%ld(%ld)\n",
s,
(long)BUCKET_SIZE_REAL(MIN_BUCKET),
(long)BUCKET_SIZE(MIN_BUCKET),
- (long)BUCKET_SIZE_REAL(topbucket), (long)BUCKET_SIZE(topbucket));
- PerlIO_printf(PerlIO_stderr(), "%8d free:", totfree);
- for (i = MIN_EVEN_REPORT; i <= topbucket; i += BUCKETS_PER_POW2) {
- PerlIO_printf(PerlIO_stderr(),
+ (long)BUCKET_SIZE_REAL(buffer.topbucket),
+ (long)BUCKET_SIZE(buffer.topbucket));
+ PerlIO_printf(Perl_error_log, "%8ld free:", buffer.totfree);
+ for (i = MIN_EVEN_REPORT; i <= buffer.topbucket; i += BUCKETS_PER_POW2) {
+ PerlIO_printf(Perl_error_log,
((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
? " %5d"
: ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")),
- nfree[i]);
+ buffer.nfree[i]);
}
#ifdef BUCKETS_ROOT2
- PerlIO_printf(PerlIO_stderr(), "\n\t ");
- for (i = MIN_BUCKET + 1; i <= topbucket_odd; i += BUCKETS_PER_POW2) {
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log, "\n\t ");
+ for (i = MIN_BUCKET + 1; i <= buffer.topbucket_odd; i += BUCKETS_PER_POW2) {
+ PerlIO_printf(Perl_error_log,
((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
? " %5d"
: ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")),
- nfree[i]);
+ buffer.nfree[i]);
}
#endif
- PerlIO_printf(PerlIO_stderr(), "\n%8d used:", total - totfree);
- for (i = MIN_EVEN_REPORT; i <= topbucket; i += BUCKETS_PER_POW2) {
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log, "\n%8ld used:", buffer.total - buffer.totfree);
+ for (i = MIN_EVEN_REPORT; i <= buffer.topbucket; i += BUCKETS_PER_POW2) {
+ PerlIO_printf(Perl_error_log,
((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
? " %5d"
: ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")),
- nmalloc[i] - nfree[i]);
+ buffer.ntotal[i] - buffer.nfree[i]);
}
#ifdef BUCKETS_ROOT2
- PerlIO_printf(PerlIO_stderr(), "\n\t ");
- for (i = MIN_BUCKET + 1; i <= topbucket_odd; i += BUCKETS_PER_POW2) {
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log, "\n\t ");
+ for (i = MIN_BUCKET + 1; i <= buffer.topbucket_odd; i += BUCKETS_PER_POW2) {
+ PerlIO_printf(Perl_error_log,
((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
? " %5d"
: ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")),
- nmalloc[i] - nfree[i]);
+ buffer.ntotal[i] - buffer.nfree[i]);
}
#endif
- while (nextchain) {
- total_chain += nextchain->size;
- nextchain = nextchain->next;
- }
- PerlIO_printf(PerlIO_stderr(), "\nTotal sbrk(): %d/%d:%d. Odd ends: pad+heads+chain+tail: %d+%d+%d+%d.\n",
- goodsbrk + sbrk_slack, sbrks, sbrk_good, sbrk_slack,
- start_slack, total_chain, sbrked_remains);
-}
-#else
-void
-dump_mstats(char *s)
-{
+ PerlIO_printf(Perl_error_log, "\nTotal sbrk(): %ld/%ld:%ld. Odd ends: pad+heads+chain+tail: %ld+%ld+%ld+%ld.\n",
+ buffer.total_sbrk, buffer.sbrks, buffer.sbrk_good,
+ buffer.sbrk_slack, buffer.start_slack,
+ buffer.total_chain, buffer.sbrked_remains);
+#endif /* DEBUGGING_MSTATS */
}
-#endif
#endif /* lint */
-
#ifdef USE_PERL_SBRK
-# if defined(__MACHTEN_PPC__) || defined(__NeXT__)
+# if defined(__MACHTEN_PPC__) || defined(NeXT) || defined(__NeXT__) || defined(PURIFY)
# define PERL_SBRK_VIA_MALLOC
-/*
- * MachTen's malloc() returns a buffer aligned on a two-byte boundary.
- * While this is adequate, it may slow down access to longer data
- * types by forcing multiple memory accesses. It also causes
- * complaints when RCHECK is in force. So we allocate six bytes
- * more than we need to, and return an address rounded up to an
- * eight-byte boundary.
- *
- * 980701 Dominic Dunlop <domo@computer.org>
- */
-# define SYSTEM_ALLOC(a) ((void *)(((unsigned)malloc((a)+6)+6)&~7))
# endif
# ifdef PERL_SBRK_VIA_MALLOC
-# if defined(HIDEMYMALLOC) || defined(EMBEDMYMALLOC)
-# undef malloc /* Expose names that */
-# undef calloc /* HIDEMYMALLOC hides */
-# undef realloc
-# undef free
-# else
-# include "Error: -DPERL_SBRK_VIA_MALLOC needs -D(HIDE|EMBED)MYMALLOC"
-# endif
/* it may seem schizophrenic to use perl's malloc and let it call system */
/* malloc, the reason for that is only the 3.2 version of the OS that had */
@@ -1614,6 +1990,9 @@ dump_mstats(char *s)
# ifndef SYSTEM_ALLOC
# define SYSTEM_ALLOC(a) malloc(a)
# endif
+# ifndef SYSTEM_ALLOC_ALIGNMENT
+# define SYSTEM_ALLOC_ALIGNMENT MEM_ALIGNBYTES
+# endif
# endif /* PERL_SBRK_VIA_MALLOC */
@@ -1647,10 +2026,13 @@ Perl_sbrk(int size)
size = PERLSBRK_64_K;
small = 1;
}
+# if NEEDED_ALIGNMENT > SYSTEM_ALLOC_ALIGNMENT
+ size += NEEDED_ALIGNMENT - SYSTEM_ALLOC_ALIGNMENT;
+# endif
got = (IV)SYSTEM_ALLOC(size);
-#ifdef PACK_MALLOC
- got = (got + 0x7ff) & ~0x7ff;
-#endif
+# if NEEDED_ALIGNMENT > SYSTEM_ALLOC_ALIGNMENT
+ got = (got + NEEDED_ALIGNMENT - 1) & ~(NEEDED_ALIGNMENT - 1);
+# endif
if (small) {
/* Chunk is small, register the rest for future allocs. */
Perl_sbrk_oldchunk = got + reqsize;
@@ -1658,8 +2040,8 @@ Perl_sbrk(int size)
}
}
- DEBUG_m(PerlIO_printf(Perl_debug_log, "sbrk malloc size %ld (reqsize %ld), left size %ld, give addr 0x%lx\n",
- size, reqsize, Perl_sbrk_oldsize, got));
+ DEBUG_m(PerlIO_printf(Perl_debug_log, "sbrk malloc size %ld (reqsize %ld), left size %ld, give addr 0x%"UVxf"\n",
+ size, reqsize, Perl_sbrk_oldsize, PTR2UV(got)));
return (void *)got;
}
diff --git a/contrib/perl5/mg.c b/contrib/perl5/mg.c
index d69fd53..27039fa 100644
--- a/contrib/perl5/mg.c
+++ b/contrib/perl5/mg.c
@@ -1,6 +1,6 @@
/* mg.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -13,6 +13,7 @@
*/
#include "EXTERN.h"
+#define PERL_IN_MG_C
#include "perl.h"
/* XXX If this causes problems, set i_unistd=undef in the hint file. */
@@ -26,94 +27,93 @@
# endif
#endif
+static void restore_magic(pTHXo_ void *p);
+static void unwind_handler_stack(pTHXo_ void *p);
+
/*
* Use the "DESTRUCTOR" scope cleanup to reinstate magic.
*/
-#ifdef PERL_OBJECT
-
-#define VTBL this->*vtbl
-
-#else
struct magic_state {
SV* mgs_sv;
U32 mgs_flags;
+ I32 mgs_ss_ix;
};
-typedef struct magic_state MGS;
-
-static void restore_magic _((void *p));
-#define VTBL *vtbl
-
-#endif
+/* MGS is typedef'ed to struct magic_state in perl.h */
STATIC void
-save_magic(MGS *mgs, SV *sv)
+S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
{
+ dTHR;
+ MGS* mgs;
assert(SvMAGICAL(sv));
+ SAVEDESTRUCTOR_X(restore_magic, (void*)mgs_ix);
+
+ mgs = SSPTR(mgs_ix, MGS*);
mgs->mgs_sv = sv;
mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
- SAVEDESTRUCTOR(restore_magic, mgs);
+ mgs->mgs_ss_ix = PL_savestack_ix; /* points after the saved destructor */
SvMAGICAL_off(sv);
SvREADONLY_off(sv);
SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
}
-STATIC void
-restore_magic(void *p)
-{
- MGS* mgs = (MGS*)p;
- SV* sv = mgs->mgs_sv;
+/*
+=for apidoc mg_magical
- if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
- {
- if (mgs->mgs_flags)
- SvFLAGS(sv) |= mgs->mgs_flags;
- else
- mg_magical(sv);
- if (SvGMAGICAL(sv))
- SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
- }
-}
+Turns on the magical status of an SV. See C<sv_magic>.
+
+=cut
+*/
void
-mg_magical(SV *sv)
+Perl_mg_magical(pTHX_ SV *sv)
{
MAGIC* mg;
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
MGVTBL* vtbl = mg->mg_virtual;
if (vtbl) {
- if ((vtbl->svt_get != NULL) && !(mg->mg_flags & MGf_GSKIP))
+ if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
SvGMAGICAL_on(sv);
if (vtbl->svt_set)
SvSMAGICAL_on(sv);
- if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || (vtbl->svt_clear != NULL))
+ if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
SvRMAGICAL_on(sv);
}
}
}
+/*
+=for apidoc mg_get
+
+Do magic after a value is retrieved from the SV. See C<sv_magic>.
+
+=cut
+*/
+
int
-mg_get(SV *sv)
+Perl_mg_get(pTHX_ SV *sv)
{
- MGS mgs;
+ dTHR;
+ I32 mgs_ix;
MAGIC* mg;
MAGIC** mgp;
int mgp_valid = 0;
- ENTER;
- save_magic(&mgs, sv);
+ mgs_ix = SSNEW(sizeof(MGS));
+ save_magic(mgs_ix, sv);
mgp = &SvMAGIC(sv);
while ((mg = *mgp) != 0) {
MGVTBL* vtbl = mg->mg_virtual;
- if (!(mg->mg_flags & MGf_GSKIP) && vtbl && (vtbl->svt_get != NULL)) {
- (VTBL->svt_get)(sv, mg);
+ if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
+ CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
/* Ignore this magic if it's been deleted */
if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) &&
(mg->mg_flags & MGf_GSKIP))
- mgs.mgs_flags = 0;
+ (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
}
/* Advance to next magic (complicated by possible deletion) */
if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
@@ -124,37 +124,54 @@ mg_get(SV *sv)
mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
}
- LEAVE;
+ restore_magic(aTHXo_ (void*)mgs_ix);
return 0;
}
+/*
+=for apidoc mg_set
+
+Do magic after a value is assigned to the SV. See C<sv_magic>.
+
+=cut
+*/
+
int
-mg_set(SV *sv)
+Perl_mg_set(pTHX_ SV *sv)
{
- MGS mgs;
+ dTHR;
+ I32 mgs_ix;
MAGIC* mg;
MAGIC* nextmg;
- ENTER;
- save_magic(&mgs, sv);
+ mgs_ix = SSNEW(sizeof(MGS));
+ save_magic(mgs_ix, sv);
for (mg = SvMAGIC(sv); mg; mg = nextmg) {
MGVTBL* vtbl = mg->mg_virtual;
nextmg = mg->mg_moremagic; /* it may delete itself */
if (mg->mg_flags & MGf_GSKIP) {
mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
- mgs.mgs_flags = 0;
+ (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
}
- if (vtbl && (vtbl->svt_set != NULL))
- (VTBL->svt_set)(sv, mg);
+ if (vtbl && vtbl->svt_set)
+ CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
}
- LEAVE;
+ restore_magic(aTHXo_ (void*)mgs_ix);
return 0;
}
+/*
+=for apidoc mg_length
+
+Report on the SV's length. See C<sv_magic>.
+
+=cut
+*/
+
U32
-mg_length(SV *sv)
+Perl_mg_length(pTHX_ SV *sv)
{
MAGIC* mg;
char *junk;
@@ -162,14 +179,14 @@ mg_length(SV *sv)
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
MGVTBL* vtbl = mg->mg_virtual;
- if (vtbl && (vtbl->svt_len != NULL)) {
- MGS mgs;
+ if (vtbl && vtbl->svt_len) {
+ I32 mgs_ix;
- ENTER;
- save_magic(&mgs, sv);
+ mgs_ix = SSNEW(sizeof(MGS));
+ save_magic(mgs_ix, sv);
/* omit MGf_GSKIP -- not changed here */
- len = (VTBL->svt_len)(sv, mg);
- LEAVE;
+ len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
+ restore_magic(aTHXo_ (void*)mgs_ix);
return len;
}
}
@@ -179,19 +196,21 @@ mg_length(SV *sv)
}
I32
-mg_size(SV *sv)
+Perl_mg_size(pTHX_ SV *sv)
{
MAGIC* mg;
I32 len;
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
MGVTBL* vtbl = mg->mg_virtual;
- if (vtbl && (vtbl->svt_len != NULL)) {
- MGS mgs;
- ENTER;
+ if (vtbl && vtbl->svt_len) {
+ I32 mgs_ix;
+
+ mgs_ix = SSNEW(sizeof(MGS));
+ save_magic(mgs_ix, sv);
/* omit MGf_GSKIP -- not changed here */
- len = (VTBL->svt_len)(sv, mg);
- LEAVE;
+ len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
+ restore_magic(aTHXo_ (void*)mgs_ix);
return len;
}
}
@@ -203,35 +222,51 @@ mg_size(SV *sv)
case SVt_PVHV:
/* FIXME */
default:
- croak("Size magic not implemented");
+ Perl_croak(aTHX_ "Size magic not implemented");
break;
}
return 0;
}
+/*
+=for apidoc mg_clear
+
+Clear something magical that the SV represents. See C<sv_magic>.
+
+=cut
+*/
+
int
-mg_clear(SV *sv)
+Perl_mg_clear(pTHX_ SV *sv)
{
- MGS mgs;
+ I32 mgs_ix;
MAGIC* mg;
- ENTER;
- save_magic(&mgs, sv);
+ mgs_ix = SSNEW(sizeof(MGS));
+ save_magic(mgs_ix, sv);
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
MGVTBL* vtbl = mg->mg_virtual;
/* omit GSKIP -- never set here */
- if (vtbl && (vtbl->svt_clear != NULL))
- (VTBL->svt_clear)(sv, mg);
+ if (vtbl && vtbl->svt_clear)
+ CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
}
- LEAVE;
+ restore_magic(aTHXo_ (void*)mgs_ix);
return 0;
}
+/*
+=for apidoc mg_find
+
+Finds the magic pointer for type matching the SV. See C<sv_magic>.
+
+=cut
+*/
+
MAGIC*
-mg_find(SV *sv, int type)
+Perl_mg_find(pTHX_ SV *sv, int type)
{
MAGIC* mg;
for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
@@ -241,8 +276,16 @@ mg_find(SV *sv, int type)
return 0;
}
+/*
+=for apidoc mg_copy
+
+Copies the magic from one SV to another. See C<sv_magic>.
+
+=cut
+*/
+
int
-mg_copy(SV *sv, SV *nsv, char *key, I32 klen)
+Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
{
int count = 0;
MAGIC* mg;
@@ -257,16 +300,24 @@ mg_copy(SV *sv, SV *nsv, char *key, I32 klen)
return count;
}
+/*
+=for apidoc mg_free
+
+Free any magic storage used by the SV. See C<sv_magic>.
+
+=cut
+*/
+
int
-mg_free(SV *sv)
+Perl_mg_free(pTHX_ SV *sv)
{
MAGIC* mg;
MAGIC* moremagic;
for (mg = SvMAGIC(sv); mg; mg = moremagic) {
MGVTBL* vtbl = mg->mg_virtual;
moremagic = mg->mg_moremagic;
- if (vtbl && (vtbl->svt_free != NULL))
- (VTBL->svt_free)(sv, mg);
+ if (vtbl && vtbl->svt_free)
+ CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
if (mg->mg_ptr && mg->mg_type != 'g')
if (mg->mg_len >= 0)
Safefree(mg->mg_ptr);
@@ -285,26 +336,80 @@ mg_free(SV *sv)
#endif
U32
-magic_len(SV *sv, MAGIC *mg)
+Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
+{
+ dTHR;
+ register REGEXP *rx;
+
+ if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
+ if (mg->mg_obj) /* @+ */
+ return rx->nparens;
+ else /* @- */
+ return rx->lastparen;
+ }
+
+ return (U32)-1;
+}
+
+int
+Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
+{
+ dTHR;
+ register I32 paren;
+ register I32 s;
+ register I32 i;
+ register REGEXP *rx;
+ I32 t;
+
+ if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
+ paren = mg->mg_len;
+ if (paren < 0)
+ return 0;
+ if (paren <= rx->nparens &&
+ (s = rx->startp[paren]) != -1 &&
+ (t = rx->endp[paren]) != -1)
+ {
+ if (mg->mg_obj) /* @+ */
+ i = t;
+ else /* @- */
+ i = s;
+ sv_setiv(sv,i);
+ }
+ }
+ return 0;
+}
+
+U32
+Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
register I32 paren;
- register char *s;
register I32 i;
register REGEXP *rx;
- char *t;
+ I32 s1, t1;
switch (*mg->mg_ptr) {
case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case '&':
if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
+
paren = atoi(mg->mg_ptr);
getparen:
if (paren <= rx->nparens &&
- (s = rx->startp[paren]) &&
- (t = rx->endp[paren]))
+ (s1 = rx->startp[paren]) != -1 &&
+ (t1 = rx->endp[paren]) != -1)
{
- i = t - s;
+ i = t1 - s1;
+ getlen:
+ if (i > 0 && (PL_curpm->op_pmdynflags & PMdf_UTF8) && !IN_BYTE) {
+ char *s = rx->subbeg + s1;
+ char *send = rx->subbeg + t1;
+ i = 0;
+ while (s < send) {
+ s += UTF8SKIP(s);
+ i++;
+ }
+ }
if (i >= 0)
return i;
}
@@ -319,19 +424,25 @@ magic_len(SV *sv, MAGIC *mg)
return 0;
case '`':
if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
- if ((s = rx->subbeg) && rx->startp[0]) {
- i = rx->startp[0] - s;
- if (i >= 0)
- return i;
+ if (rx->startp[0] != -1) {
+ i = rx->startp[0];
+ if (i > 0) {
+ s1 = 0;
+ t1 = i;
+ goto getlen;
+ }
}
}
return 0;
case '\'':
if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
- if (rx->subend && (s = rx->endp[0])) {
- i = rx->subend - s;
- if (i >= 0)
- return i;
+ if (rx->endp[0] != -1) {
+ i = rx->sublen - rx->endp[0];
+ if (i > 0) {
+ s1 = rx->endp[0];
+ t1 = rx->sublen;
+ goto getlen;
+ }
}
}
return 0;
@@ -351,14 +462,13 @@ magic_len(SV *sv, MAGIC *mg)
}
int
-magic_get(SV *sv, MAGIC *mg)
+Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
register I32 paren;
register char *s;
register I32 i;
register REGEXP *rx;
- char *t;
switch (*mg->mg_ptr) {
case '\001': /* ^A */
@@ -367,17 +477,29 @@ magic_get(SV *sv, MAGIC *mg)
case '\003': /* ^C */
sv_setiv(sv, (IV)PL_minus_c);
break;
+
case '\004': /* ^D */
sv_setiv(sv, (IV)(PL_debug & 32767));
+#if defined(YYDEBUG) && defined(DEBUGGING)
+ PL_yydebug = (PL_debug & 1);
+#endif
break;
case '\005': /* ^E */
+#ifdef MACOS_TRADITIONAL
+ {
+ char msg[256];
+
+ sv_setnv(sv,(double)gLastMacOSErr);
+ sv_setpv(sv, gLastMacOSErr ? GetSysErrText(gLastMacOSErr, msg) : "");
+ }
+#else
#ifdef VMS
{
# include <descrip.h>
# include <starlet.h>
char msg[255];
$DESCRIPTOR(msgdsc,msg);
- sv_setnv(sv,(double) vaxc$errno);
+ sv_setnv(sv,(NV) vaxc$errno);
if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
else
@@ -386,7 +508,7 @@ magic_get(SV *sv, MAGIC *mg)
#else
#ifdef OS2
if (!(_emx_env & 0x200)) { /* Under DOS */
- sv_setnv(sv, (double)errno);
+ sv_setnv(sv, (NV)errno);
sv_setpv(sv, errno ? Strerror(errno) : "");
} else {
if (errno != errno_isOS2) {
@@ -394,36 +516,29 @@ magic_get(SV *sv, MAGIC *mg)
if (tmp) /* 2nd call to _syserrno() makes it 0 */
Perl_rc = tmp;
}
- sv_setnv(sv, (double)Perl_rc);
+ sv_setnv(sv, (NV)Perl_rc);
sv_setpv(sv, os2error(Perl_rc));
}
#else
#ifdef WIN32
{
DWORD dwErr = GetLastError();
- sv_setnv(sv, (double)dwErr);
+ sv_setnv(sv, (NV)dwErr);
if (dwErr)
{
-#ifdef PERL_OBJECT
- char *sMsg;
- DWORD dwLen;
- PerlProc_GetSysMsg(sMsg, dwLen, dwErr);
- sv_setpvn(sv, sMsg, dwLen);
- PerlProc_FreeBuf(sMsg);
-#else
- win32_str_os_error(sv, dwErr);
-#endif
+ PerlProc_GetOSError(sv, dwErr);
}
else
sv_setpv(sv, "");
SetLastError(dwErr);
}
#else
- sv_setnv(sv, (double)errno);
+ sv_setnv(sv, (NV)errno);
sv_setpv(sv, errno ? Strerror(errno) : "");
#endif
#endif
#endif
+#endif
SvNOK_on(sv); /* what a wonderful hack! */
break;
case '\006': /* ^F */
@@ -448,7 +563,7 @@ magic_get(SV *sv, MAGIC *mg)
{
dTHR;
if (PL_lex_state != LEX_NOTPARSING)
- SvOK_off(sv);
+ (void)SvOK_off(sv);
else if (PL_in_eval)
sv_setiv(sv, 1);
else
@@ -462,12 +577,31 @@ magic_get(SV *sv, MAGIC *mg)
sv_setiv(sv, (IV)PL_basetime);
#endif
break;
- case '\027': /* ^W */
- sv_setiv(sv, (IV)PL_dowarn);
+ case '\027': /* ^W & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
+ if (*(mg->mg_ptr+1) == '\0')
+ sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
+ else if (strEQ(mg->mg_ptr, "\027ARNING_BITS")) {
+ if (PL_compiling.cop_warnings == pWARN_NONE ||
+ PL_compiling.cop_warnings == pWARN_STD)
+ {
+ sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
+ }
+ else if (PL_compiling.cop_warnings == pWARN_ALL) {
+ sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
+ }
+ else {
+ sv_setsv(sv, PL_compiling.cop_warnings);
+ }
+ SvPOK_only(sv);
+ }
+ else if (strEQ(mg->mg_ptr, "\027IDE_SYSTEM_CALLS"))
+ sv_setiv(sv, (IV)PL_widesyscalls);
break;
case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case '&':
if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
+ I32 s1, t1;
+
/*
* Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
* XXX Does the new way break anything?
@@ -475,10 +609,11 @@ magic_get(SV *sv, MAGIC *mg)
paren = atoi(mg->mg_ptr);
getparen:
if (paren <= rx->nparens &&
- (s = rx->startp[paren]) &&
- (t = rx->endp[paren]))
+ (s1 = rx->startp[paren]) != -1 &&
+ (t1 = rx->endp[paren]) != -1)
{
- i = t - s;
+ i = t1 - s1;
+ s = rx->subbeg + s1;
getrx:
if (i >= 0) {
bool was_tainted;
@@ -486,7 +621,11 @@ magic_get(SV *sv, MAGIC *mg)
was_tainted = PL_tainted;
PL_tainted = FALSE;
}
- sv_setpvn(sv,s,i);
+ sv_setpvn(sv, s, i);
+ if ((PL_curpm->op_pmdynflags & PMdf_UTF8) && !IN_BYTE)
+ SvUTF8_on(sv);
+ else
+ SvUTF8_off(sv);
if (PL_tainting)
PL_tainted = (was_tainted || RX_MATCH_TAINTED(rx));
break;
@@ -505,8 +644,8 @@ magic_get(SV *sv, MAGIC *mg)
break;
case '`':
if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
- if ((s = rx->subbeg) && rx->startp[0]) {
- i = rx->startp[0] - s;
+ if ((s = rx->subbeg) && rx->startp[0] != -1) {
+ i = rx->startp[0];
goto getrx;
}
}
@@ -514,8 +653,9 @@ magic_get(SV *sv, MAGIC *mg)
break;
case '\'':
if (PL_curpm && (rx = PL_curpm->op_pmregexp)) {
- if (rx->subend && (s = rx->endp[0])) {
- i = rx->subend - s;
+ if (rx->subbeg && rx->endp[0] != -1) {
+ s = rx->subbeg + rx->endp[0];
+ i = rx->sublen - rx->endp[0];
goto getrx;
}
}
@@ -584,14 +724,15 @@ magic_get(SV *sv, MAGIC *mg)
break;
case '!':
#ifdef VMS
- sv_setnv(sv, (double)((errno == EVMSERR) ? vaxc$errno : errno));
+ sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
sv_setpv(sv, errno ? Strerror(errno) : "");
#else
{
int saveerrno = errno;
- sv_setnv(sv, (double)errno);
+ sv_setnv(sv, (NV)errno);
#ifdef OS2
- if (errno == errno_isOS2) sv_setpv(sv, os2error(Perl_rc));
+ if (errno == errno_isOS2 || errno == errno_isOS2_set)
+ sv_setpv(sv, os2error(Perl_rc));
else
#endif
sv_setpv(sv, errno ? Strerror(errno) : "");
@@ -608,26 +749,32 @@ magic_get(SV *sv, MAGIC *mg)
break;
case '(':
sv_setiv(sv, (IV)PL_gid);
- sv_setpvf(sv, "%Vd", (IV)PL_gid);
+#ifdef HAS_GETGROUPS
+ Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_gid);
+#endif
goto add_groups;
case ')':
sv_setiv(sv, (IV)PL_egid);
- sv_setpvf(sv, "%Vd", (IV)PL_egid);
+#ifdef HAS_GETGROUPS
+ Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
+#endif
add_groups:
#ifdef HAS_GETGROUPS
{
Groups_t gary[NGROUPS];
i = getgroups(NGROUPS,gary);
while (--i >= 0)
- sv_catpvf(sv, " %Vd", (IV)gary[i]);
+ Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
}
#endif
- SvIOK_on(sv); /* what a wonderful hack! */
+ (void)SvIOK_on(sv); /* what a wonderful hack! */
break;
case '*':
break;
+#ifndef MACOS_TRADITIONAL
case '0':
break;
+#endif
#ifdef USE_THREADS
case '@':
sv_setsv(sv, thr->errsv);
@@ -638,7 +785,7 @@ magic_get(SV *sv, MAGIC *mg)
}
int
-magic_getuvar(SV *sv, MAGIC *mg)
+Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
{
struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
@@ -648,7 +795,7 @@ magic_getuvar(SV *sv, MAGIC *mg)
}
int
-magic_setenv(SV *sv, MAGIC *mg)
+Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
{
register char *s;
char *ptr;
@@ -724,7 +871,7 @@ magic_setenv(SV *sv, MAGIC *mg)
}
int
-magic_clearenv(SV *sv, MAGIC *mg)
+Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
{
STRLEN n_a;
my_setenv(MgPV(mg,n_a),Nullch);
@@ -732,10 +879,10 @@ magic_clearenv(SV *sv, MAGIC *mg)
}
int
-magic_set_all_env(SV *sv, MAGIC *mg)
+Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
{
#if defined(VMS)
- die("Can't make list assignment to %%ENV on this system");
+ Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
#else
dTHR;
if (PL_localizing) {
@@ -743,7 +890,7 @@ magic_set_all_env(SV *sv, MAGIC *mg)
STRLEN n_a;
magic_clear_all_env(sv,mg);
hv_iterinit((HV*)sv);
- while (entry = hv_iternext((HV*)sv)) {
+ while ((entry = hv_iternext((HV*)sv))) {
I32 keylen;
my_setenv(hv_iterkey(entry, &keylen),
SvPV(hv_iterval((HV*)sv, entry), n_a));
@@ -754,12 +901,15 @@ magic_set_all_env(SV *sv, MAGIC *mg)
}
int
-magic_clear_all_env(SV *sv, MAGIC *mg)
+Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
{
#if defined(VMS)
- die("Can't make list assignment to %%ENV on this system");
+ Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
#else
-#ifdef WIN32
+# ifdef PERL_IMPLICIT_SYS
+ PerlEnv_clearenv();
+# else
+# ifdef WIN32
char *envv = GetEnvironmentStrings();
char *cur = envv;
STRLEN len;
@@ -775,31 +925,41 @@ magic_clear_all_env(SV *sv, MAGIC *mg)
cur += len+1;
}
FreeEnvironmentStrings(envv);
-#else
+# else
+# ifdef __CYGWIN__
+ I32 i;
+ for (i = 0; environ[i]; i++)
+ safesysfree(environ[i]);
+# else
+# ifndef PERL_USE_SAFE_PUTENV
I32 i;
if (environ == PL_origenviron)
- New(901, environ, 1, char*);
+ environ = (char**)safesysmalloc(sizeof(char*));
else
for (i = 0; environ[i]; i++)
- Safefree(environ[i]);
+ safesysfree(environ[i]);
+# endif /* PERL_USE_SAFE_PUTENV */
+# endif /* __CYGWIN__ */
+
environ[0] = Nullch;
-#endif
-#endif
+# endif /* WIN32 */
+# endif /* PERL_IMPLICIT_SYS */
+#endif /* VMS */
return 0;
}
int
-magic_getsig(SV *sv, MAGIC *mg)
+Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
{
I32 i;
STRLEN n_a;
/* Are we fetching a signal entry? */
i = whichsig(MgPV(mg,n_a));
if (i) {
- if(psig_ptr[i])
- sv_setsv(sv,psig_ptr[i]);
+ if(PL_psig_ptr[i])
+ sv_setsv(sv,PL_psig_ptr[i]);
else {
Sighandler_t sigstate = rsignal_state(i);
@@ -808,51 +968,49 @@ magic_getsig(SV *sv, MAGIC *mg)
sv_setpv(sv,"IGNORE");
else
sv_setsv(sv,&PL_sv_undef);
- psig_ptr[i] = SvREFCNT_inc(sv);
+ PL_psig_ptr[i] = SvREFCNT_inc(sv);
SvTEMP_off(sv);
}
}
return 0;
}
int
-magic_clearsig(SV *sv, MAGIC *mg)
+Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
{
I32 i;
STRLEN n_a;
/* Are we clearing a signal entry? */
i = whichsig(MgPV(mg,n_a));
if (i) {
- if(psig_ptr[i]) {
- SvREFCNT_dec(psig_ptr[i]);
- psig_ptr[i]=0;
+ if(PL_psig_ptr[i]) {
+ SvREFCNT_dec(PL_psig_ptr[i]);
+ PL_psig_ptr[i]=0;
}
- if(psig_name[i]) {
- SvREFCNT_dec(psig_name[i]);
- psig_name[i]=0;
+ if(PL_psig_name[i]) {
+ SvREFCNT_dec(PL_psig_name[i]);
+ PL_psig_name[i]=0;
}
}
return 0;
}
int
-magic_setsig(SV *sv, MAGIC *mg)
+Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
register char *s;
I32 i;
SV** svp;
- STRLEN n_a;
+ STRLEN len;
- s = MgPV(mg,n_a);
+ s = MgPV(mg,len);
if (*s == '_') {
if (strEQ(s,"__DIE__"))
svp = &PL_diehook;
else if (strEQ(s,"__WARN__"))
svp = &PL_warnhook;
- else if (strEQ(s,"__PARSE__"))
- svp = &PL_parsehook;
else
- croak("No such hook: %s", s);
+ Perl_croak(aTHX_ "No such hook: %s", s);
i = 0;
if (*svp) {
SvREFCNT_dec(*svp);
@@ -862,16 +1020,16 @@ magic_setsig(SV *sv, MAGIC *mg)
else {
i = whichsig(s); /* ...no, a brick */
if (!i) {
- if (PL_dowarn || strEQ(s,"ALARM"))
- warn("No such signal: SIG%s", s);
+ if (ckWARN(WARN_SIGNAL))
+ Perl_warner(aTHX_ WARN_SIGNAL, "No such signal: SIG%s", s);
return 0;
}
- SvREFCNT_dec(psig_name[i]);
- SvREFCNT_dec(psig_ptr[i]);
- psig_ptr[i] = SvREFCNT_inc(sv);
+ SvREFCNT_dec(PL_psig_name[i]);
+ SvREFCNT_dec(PL_psig_ptr[i]);
+ PL_psig_ptr[i] = SvREFCNT_inc(sv);
SvTEMP_off(sv); /* Make sure it doesn't go away on us */
- psig_name[i] = newSVpv(s, strlen(s));
- SvREADONLY_on(psig_name[i]);
+ PL_psig_name[i] = newSVpvn(s, len);
+ SvREADONLY_on(PL_psig_name[i]);
}
if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
if (i)
@@ -880,7 +1038,7 @@ magic_setsig(SV *sv, MAGIC *mg)
*svp = SvREFCNT_inc(sv);
return 0;
}
- s = SvPV_force(sv,n_a);
+ s = SvPV_force(sv,len);
if (strEQ(s,"IGNORE")) {
if (i)
(void)rsignal(i, SIG_IGN);
@@ -900,7 +1058,7 @@ magic_setsig(SV *sv, MAGIC *mg)
* tell whether HINT_STRICT_REFS is in force or not.
*/
if (!strchr(s,':') && !strchr(s,'\''))
- sv_setpv(sv, form("main::%s", s));
+ sv_insert(sv, 0, 0, "main::", 6);
if (i)
(void)rsignal(i, PL_sighandlerp);
else
@@ -910,26 +1068,23 @@ magic_setsig(SV *sv, MAGIC *mg)
}
int
-magic_setisa(SV *sv, MAGIC *mg)
+Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
{
PL_sub_generation++;
return 0;
}
-#ifdef OVERLOAD
-
int
-magic_setamagic(SV *sv, MAGIC *mg)
+Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
{
/* HV_badAMAGIC_on(Sv_STASH(sv)); */
PL_amagic_generation++;
return 0;
}
-#endif /* OVERLOAD */
int
-magic_getnkeys(SV *sv, MAGIC *mg)
+Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
{
HV *hv = (HV*)LvTARG(sv);
HE *entry;
@@ -941,7 +1096,7 @@ magic_getnkeys(SV *sv, MAGIC *mg)
i = HvKEYS(hv);
else {
/*SUPPRESS 560*/
- while (entry = hv_iternext(hv)) {
+ while ((entry = hv_iternext(hv))) {
i++;
}
}
@@ -952,7 +1107,7 @@ magic_getnkeys(SV *sv, MAGIC *mg)
}
int
-magic_setnkeys(SV *sv, MAGIC *mg)
+Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
{
if (LvTARG(sv)) {
hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
@@ -962,7 +1117,7 @@ magic_setnkeys(SV *sv, MAGIC *mg)
/* caller is responsible for stack switching/cleanup */
STATIC int
-magic_methcall(SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
+S_magic_methcall(pTHX_ SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
{
dSP;
@@ -972,7 +1127,7 @@ magic_methcall(SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
if (n > 1) {
if (mg->mg_ptr) {
if (mg->mg_len >= 0)
- PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
+ PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
else if (mg->mg_len == HEf_SVKEY)
PUSHs((SV*)mg->mg_ptr);
}
@@ -985,11 +1140,11 @@ magic_methcall(SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
}
PUTBACK;
- return perl_call_method(meth, flags);
+ return call_method(meth, flags);
}
STATIC int
-magic_methpack(SV *sv, MAGIC *mg, char *meth)
+S_magic_methpack(pTHX_ SV *sv, MAGIC *mg, char *meth)
{
dSP;
@@ -1008,7 +1163,7 @@ magic_methpack(SV *sv, MAGIC *mg, char *meth)
}
int
-magic_getpack(SV *sv, MAGIC *mg)
+Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
{
magic_methpack(sv,mg,"FETCH");
if (mg->mg_ptr)
@@ -1017,7 +1172,7 @@ magic_getpack(SV *sv, MAGIC *mg)
}
int
-magic_setpack(SV *sv, MAGIC *mg)
+Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
{
dSP;
ENTER;
@@ -1029,14 +1184,14 @@ magic_setpack(SV *sv, MAGIC *mg)
}
int
-magic_clearpack(SV *sv, MAGIC *mg)
+Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
{
return magic_methpack(sv,mg,"DELETE");
}
U32
-magic_sizepack(SV *sv, MAGIC *mg)
+Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
{
dSP;
U32 retval = 0;
@@ -1054,7 +1209,8 @@ magic_sizepack(SV *sv, MAGIC *mg)
return retval;
}
-int magic_wipepack(SV *sv, MAGIC *mg)
+int
+Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
{
dSP;
@@ -1063,17 +1219,17 @@ int magic_wipepack(SV *sv, MAGIC *mg)
PUSHMARK(SP);
XPUSHs(SvTIED_obj(sv, mg));
PUTBACK;
- perl_call_method("CLEAR", G_SCALAR|G_DISCARD);
+ call_method("CLEAR", G_SCALAR|G_DISCARD);
POPSTACK;
LEAVE;
return 0;
}
int
-magic_nextpack(SV *sv, MAGIC *mg, SV *key)
+Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
{
dSP;
- char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
+ const char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
ENTER;
SAVETMPS;
@@ -1085,7 +1241,7 @@ magic_nextpack(SV *sv, MAGIC *mg, SV *key)
PUSHs(key);
PUTBACK;
- if (perl_call_method(meth, G_SCALAR))
+ if (call_method(meth, G_SCALAR))
sv_setsv(key, *PL_stack_sp--);
POPSTACK;
@@ -1095,13 +1251,13 @@ magic_nextpack(SV *sv, MAGIC *mg, SV *key)
}
int
-magic_existspack(SV *sv, MAGIC *mg)
+Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
{
return magic_methpack(sv,mg,"EXISTS");
}
int
-magic_setdbline(SV *sv, MAGIC *mg)
+Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
OP *o;
@@ -1114,15 +1270,15 @@ magic_setdbline(SV *sv, MAGIC *mg)
i = SvTRUE(sv);
svp = av_fetch(GvAV(gv),
atoi(MgPV(mg,n_a)), FALSE);
- if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
+ if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp))))
o->op_private = i;
- else
- warn("Can't break at that line\n");
+ else if (ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Can't break at that line\n");
return 0;
}
int
-magic_getarylen(SV *sv, MAGIC *mg)
+Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
@@ -1130,7 +1286,7 @@ magic_getarylen(SV *sv, MAGIC *mg)
}
int
-magic_setarylen(SV *sv, MAGIC *mg)
+Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
@@ -1138,7 +1294,7 @@ magic_setarylen(SV *sv, MAGIC *mg)
}
int
-magic_getpos(SV *sv, MAGIC *mg)
+Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
{
SV* lsv = LvTARG(sv);
@@ -1146,7 +1302,10 @@ magic_getpos(SV *sv, MAGIC *mg)
mg = mg_find(lsv, 'g');
if (mg && mg->mg_len >= 0) {
dTHR;
- sv_setiv(sv, mg->mg_len + PL_curcop->cop_arybase);
+ I32 i = mg->mg_len;
+ if (DO_UTF8(lsv))
+ sv_pos_b2u(lsv, &i);
+ sv_setiv(sv, i + PL_curcop->cop_arybase);
return 0;
}
}
@@ -1155,11 +1314,13 @@ magic_getpos(SV *sv, MAGIC *mg)
}
int
-magic_setpos(SV *sv, MAGIC *mg)
+Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
{
SV* lsv = LvTARG(sv);
SSize_t pos;
STRLEN len;
+ STRLEN ulen = 0;
+ dTHR;
mg = 0;
@@ -1177,7 +1338,14 @@ magic_setpos(SV *sv, MAGIC *mg)
}
len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
- WITH_THR(pos = SvIV(sv) - PL_curcop->cop_arybase);
+ pos = SvIV(sv) - PL_curcop->cop_arybase;
+
+ if (DO_UTF8(lsv)) {
+ ulen = sv_len_utf8(lsv);
+ if (ulen)
+ len = ulen;
+ }
+
if (pos < 0) {
pos += len;
if (pos < 0)
@@ -1185,6 +1353,13 @@ magic_setpos(SV *sv, MAGIC *mg)
}
else if (pos > len)
pos = len;
+
+ if (ulen) {
+ I32 p = pos;
+ sv_pos_u2b(lsv, &p, 0);
+ pos = p;
+ }
+
mg->mg_len = pos;
mg->mg_flags &= ~MGf_MINMATCH;
@@ -1192,7 +1367,7 @@ magic_setpos(SV *sv, MAGIC *mg)
}
int
-magic_getglob(SV *sv, MAGIC *mg)
+Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
{
if (SvFAKE(sv)) { /* FAKE globs can get coerced */
SvFAKE_off(sv);
@@ -1205,7 +1380,7 @@ magic_getglob(SV *sv, MAGIC *mg)
}
int
-magic_setglob(SV *sv, MAGIC *mg)
+Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
{
register char *s;
GV* gv;
@@ -1226,7 +1401,7 @@ magic_setglob(SV *sv, MAGIC *mg)
}
int
-magic_getsubstr(SV *sv, MAGIC *mg)
+Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
{
STRLEN len;
SV *lsv = LvTARG(sv);
@@ -1243,7 +1418,7 @@ magic_getsubstr(SV *sv, MAGIC *mg)
}
int
-magic_setsubstr(SV *sv, MAGIC *mg)
+Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
{
STRLEN len;
char *tmps = SvPV(sv,len);
@@ -1252,16 +1427,16 @@ magic_setsubstr(SV *sv, MAGIC *mg)
}
int
-magic_gettaint(SV *sv, MAGIC *mg)
+Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
TAINT_IF((mg->mg_len & 1) ||
- (mg->mg_len & 2) && mg->mg_obj == sv); /* kludge */
+ ((mg->mg_len & 2) && mg->mg_obj == sv)); /* kludge */
return 0;
}
int
-magic_settaint(SV *sv, MAGIC *mg)
+Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
if (PL_localizing) {
@@ -1278,80 +1453,28 @@ magic_settaint(SV *sv, MAGIC *mg)
}
int
-magic_getvec(SV *sv, MAGIC *mg)
+Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
{
SV *lsv = LvTARG(sv);
- unsigned char *s;
- unsigned long retnum;
- STRLEN lsvlen;
- I32 len;
- I32 offset;
- I32 size;
if (!lsv) {
- SvOK_off(sv);
+ (void)SvOK_off(sv);
return 0;
}
- s = (unsigned char *) SvPV(lsv, lsvlen);
- offset = LvTARGOFF(sv);
- size = LvTARGLEN(sv);
- len = (offset + size + 7) / 8;
-
- /* Copied from pp_vec() */
-
- if (len > lsvlen) {
- if (size <= 8)
- retnum = 0;
- else {
- offset >>= 3;
- if (size == 16) {
- if (offset >= lsvlen)
- retnum = 0;
- else
- retnum = (unsigned long) s[offset] << 8;
- }
- else if (size == 32) {
- if (offset >= lsvlen)
- retnum = 0;
- else if (offset + 1 >= lsvlen)
- retnum = (unsigned long) s[offset] << 24;
- else if (offset + 2 >= lsvlen)
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16);
- else
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16) +
- (s[offset + 2] << 8);
- }
- }
- }
- else if (size < 8)
- retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
- else {
- offset >>= 3;
- if (size == 8)
- retnum = s[offset];
- else if (size == 16)
- retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
- else if (size == 32)
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16) +
- (s[offset + 2] << 8) + s[offset+3];
- }
- sv_setuv(sv, (UV)retnum);
+ sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
return 0;
}
int
-magic_setvec(SV *sv, MAGIC *mg)
+Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
{
do_vecset(sv); /* XXX slurp this routine */
return 0;
}
int
-magic_getdefelem(SV *sv, MAGIC *mg)
+Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
{
SV *targ = Nullsv;
if (LvTARGLEN(sv)) {
@@ -1391,7 +1514,7 @@ magic_getdefelem(SV *sv, MAGIC *mg)
}
int
-magic_setdefelem(SV *sv, MAGIC *mg)
+Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
{
if (LvTARGLEN(sv))
vivify_defelem(sv);
@@ -1403,7 +1526,7 @@ magic_setdefelem(SV *sv, MAGIC *mg)
}
void
-vivify_defelem(SV *sv)
+Perl_vivify_defelem(pTHX_ SV *sv)
{
dTHR; /* just for SvREFCNT_inc and SvREFCNT_dec*/
MAGIC *mg;
@@ -1413,6 +1536,7 @@ vivify_defelem(SV *sv)
return;
if (mg->mg_obj) {
SV *ahv = LvTARG(sv);
+ STRLEN n_a;
if (SvTYPE(ahv) == SVt_PVHV) {
HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
if (he)
@@ -1423,10 +1547,8 @@ vivify_defelem(SV *sv)
if (svp)
value = *svp;
}
- if (!value || value == &PL_sv_undef) {
- STRLEN n_a;
- croak(no_helem, SvPV(mg->mg_obj, n_a));
- }
+ if (!value || value == &PL_sv_undef)
+ Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
}
else {
AV* av = (AV*)LvTARG(sv);
@@ -1435,7 +1557,7 @@ vivify_defelem(SV *sv)
else {
SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
if (!svp || (value = *svp) == &PL_sv_undef)
- croak(no_aelem, (I32)LvTARGOFF(sv));
+ Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
}
}
(void)SvREFCNT_inc(value);
@@ -1448,7 +1570,28 @@ vivify_defelem(SV *sv)
}
int
-magic_setmglob(SV *sv, MAGIC *mg)
+Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
+{
+ AV *av = (AV*)mg->mg_obj;
+ SV **svp = AvARRAY(av);
+ I32 i = AvFILLp(av);
+ while (i >= 0) {
+ if (svp[i] && svp[i] != &PL_sv_undef) {
+ if (!SvWEAKREF(svp[i]))
+ Perl_croak(aTHX_ "panic: magic_killbackrefs");
+ /* XXX Should we check that it hasn't changed? */
+ SvRV(svp[i]) = 0;
+ (void)SvOK_off(svp[i]);
+ SvWEAKREF_off(svp[i]);
+ svp[i] = &PL_sv_undef;
+ }
+ i--;
+ }
+ return 0;
+}
+
+int
+Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
{
mg->mg_len = -1;
SvSCREAM_off(sv);
@@ -1456,7 +1599,7 @@ magic_setmglob(SV *sv, MAGIC *mg)
}
int
-magic_setbm(SV *sv, MAGIC *mg)
+Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
{
sv_unmagic(sv, 'B');
SvVALID_off(sv);
@@ -1464,7 +1607,7 @@ magic_setbm(SV *sv, MAGIC *mg)
}
int
-magic_setfm(SV *sv, MAGIC *mg)
+Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
{
sv_unmagic(sv, 'f');
SvCOMPILED_off(sv);
@@ -1472,7 +1615,7 @@ magic_setfm(SV *sv, MAGIC *mg)
}
int
-magic_setuvar(SV *sv, MAGIC *mg)
+Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
{
struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
@@ -1482,7 +1625,7 @@ magic_setuvar(SV *sv, MAGIC *mg)
}
int
-magic_freeregexp(SV *sv, MAGIC *mg)
+Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
{
regexp *re = (regexp *)mg->mg_obj;
ReREFCNT_dec(re);
@@ -1491,10 +1634,10 @@ magic_freeregexp(SV *sv, MAGIC *mg)
#ifdef USE_LOCALE_COLLATE
int
-magic_setcollxfrm(SV *sv, MAGIC *mg)
+Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
{
/*
- * René Descartes said "I think not."
+ * RenE<eacute> Descartes said "I think not."
* and vanished with a faint plop.
*/
if (mg->mg_ptr) {
@@ -1507,7 +1650,7 @@ magic_setcollxfrm(SV *sv, MAGIC *mg)
#endif /* USE_LOCALE_COLLATE */
int
-magic_set(SV *sv, MAGIC *mg)
+Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
register char *s;
@@ -1520,20 +1663,27 @@ magic_set(SV *sv, MAGIC *mg)
case '\003': /* ^C */
PL_minus_c = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
break;
+
case '\004': /* ^D */
PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
DEBUG_x(dump_all());
break;
case '\005': /* ^E */
-#ifdef VMS
- set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
+#ifdef MACOS_TRADITIONAL
+ gLastMacOSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
#else
-#ifdef WIN32
+# ifdef VMS
+ set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
+# else
+# ifdef WIN32
SetLastError( SvIV(sv) );
-#else
+# else
+# ifndef OS2
/* will anyone ever use this? */
SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
-#endif
+# endif
+# endif
+# endif
#endif
break;
case '\006': /* ^F */
@@ -1560,6 +1710,8 @@ magic_set(SV *sv, MAGIC *mg)
break;
case '\020': /* ^P */
PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
+ if (PL_perldb && !PL_DBsingle)
+ init_debugger();
break;
case '\024': /* ^T */
#ifdef BIG_TIME
@@ -1568,13 +1720,51 @@ magic_set(SV *sv, MAGIC *mg)
PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
#endif
break;
- case '\027': /* ^W */
- PL_dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
+ case '\027': /* ^W & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
+ if (*(mg->mg_ptr+1) == '\0') {
+ if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
+ i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
+ PL_dowarn = (PL_dowarn & ~G_WARN_ON)
+ | (i ? G_WARN_ON : G_WARN_OFF) ;
+ }
+ }
+ else if (strEQ(mg->mg_ptr, "\027ARNING_BITS")) {
+ if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
+ if (!SvPOK(sv) && PL_localizing) {
+ sv_setpvn(sv, WARN_NONEstring, WARNsize);
+ PL_compiling.cop_warnings = pWARN_NONE;
+ break;
+ }
+ if (isWARN_on(sv, WARN_ALL)) {
+ PL_compiling.cop_warnings = pWARN_ALL;
+ PL_dowarn |= G_WARN_ONCE ;
+ }
+ else {
+ STRLEN len, i;
+ int accumulate = 0 ;
+ char * ptr = (char*)SvPV(sv, len) ;
+ for (i = 0 ; i < len ; ++i)
+ accumulate += ptr[i] ;
+ if (!accumulate)
+ PL_compiling.cop_warnings = pWARN_NONE;
+ else {
+ if (specialWARN(PL_compiling.cop_warnings))
+ PL_compiling.cop_warnings = newSVsv(sv) ;
+ else
+ sv_setsv(PL_compiling.cop_warnings, sv);
+ if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
+ PL_dowarn |= G_WARN_ONCE ;
+ }
+ }
+ }
+ }
+ else if (strEQ(mg->mg_ptr, "\027IDE_SYSTEM_CALLS"))
+ PL_widesyscalls = SvTRUE(sv);
break;
case '.':
if (PL_localizing) {
if (PL_localizing == 1)
- save_sptr((SV**)&PL_last_in_gv);
+ SAVESPTR(PL_last_in_gv);
}
else if (SvOK(sv) && GvIO(PL_last_in_gv))
IoLINES(GvIOp(PL_last_in_gv)) = (long)SvIV(sv);
@@ -1628,8 +1818,10 @@ magic_set(SV *sv, MAGIC *mg)
case '\\':
if (PL_ors)
Safefree(PL_ors);
- if (SvOK(sv) || SvGMAGICAL(sv))
- PL_ors = savepv(SvPV(sv,PL_orslen));
+ if (SvOK(sv) || SvGMAGICAL(sv)) {
+ s = SvPV(sv,PL_orslen);
+ PL_ors = savepvn(s,PL_orslen);
+ }
else {
PL_ors = Nullch;
PL_orslen = 0;
@@ -1685,13 +1877,13 @@ magic_set(SV *sv, MAGIC *mg)
if (PL_uid == PL_euid) /* special case $< = $> */
(void)PerlProc_setuid(PL_uid);
else {
- PL_uid = (I32)PerlProc_getuid();
- croak("setruid() not implemented");
+ PL_uid = PerlProc_getuid();
+ Perl_croak(aTHX_ "setruid() not implemented");
}
#endif
#endif
#endif
- PL_uid = (I32)PerlProc_getuid();
+ PL_uid = PerlProc_getuid();
PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
break;
case '>':
@@ -1712,13 +1904,13 @@ magic_set(SV *sv, MAGIC *mg)
if (PL_euid == PL_uid) /* special case $> = $< */
PerlProc_setuid(PL_euid);
else {
- PL_euid = (I32)PerlProc_geteuid();
- croak("seteuid() not implemented");
+ PL_euid = PerlProc_geteuid();
+ Perl_croak(aTHX_ "seteuid() not implemented");
}
#endif
#endif
#endif
- PL_euid = (I32)PerlProc_geteuid();
+ PL_euid = PerlProc_geteuid();
PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
break;
case '(':
@@ -1739,13 +1931,13 @@ magic_set(SV *sv, MAGIC *mg)
if (PL_gid == PL_egid) /* special case $( = $) */
(void)PerlProc_setgid(PL_gid);
else {
- PL_gid = (I32)PerlProc_getgid();
- croak("setrgid() not implemented");
+ PL_gid = PerlProc_getgid();
+ Perl_croak(aTHX_ "setrgid() not implemented");
}
#endif
#endif
#endif
- PL_gid = (I32)PerlProc_getgid();
+ PL_gid = PerlProc_getgid();
PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
break;
case ')':
@@ -1754,10 +1946,9 @@ magic_set(SV *sv, MAGIC *mg)
char *p = SvPV(sv, len);
Groups_t gary[NGROUPS];
- SET_NUMERIC_STANDARD();
while (isSPACE(*p))
++p;
- PL_egid = I_V(atof(p));
+ PL_egid = Atol(p);
for (i = 0; i < NGROUPS; ++i) {
while (*p && !isSPACE(*p))
++p;
@@ -1765,7 +1956,7 @@ magic_set(SV *sv, MAGIC *mg)
++p;
if (!*p)
break;
- gary[i] = I_V(atof(p));
+ gary[i] = Atol(p);
}
if (i)
(void)setgroups(i, gary);
@@ -1789,18 +1980,19 @@ magic_set(SV *sv, MAGIC *mg)
if (PL_egid == PL_gid) /* special case $) = $( */
(void)PerlProc_setgid(PL_egid);
else {
- PL_egid = (I32)PerlProc_getegid();
- croak("setegid() not implemented");
+ PL_egid = PerlProc_getegid();
+ Perl_croak(aTHX_ "setegid() not implemented");
}
#endif
#endif
#endif
- PL_egid = (I32)PerlProc_getegid();
+ PL_egid = PerlProc_getegid();
PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
break;
case ':':
PL_chopset = SvPV_force(sv,len);
break;
+#ifndef MACOS_TRADITIONAL
case '0':
if (!PL_origalen) {
s = PL_origargv[0];
@@ -1858,6 +2050,7 @@ magic_set(SV *sv, MAGIC *mg)
PL_origargv[i] = Nullch;
}
break;
+#endif
#ifdef USE_THREADS
case '@':
sv_setsv(thr->errsv, sv);
@@ -1869,13 +2062,14 @@ magic_set(SV *sv, MAGIC *mg)
#ifdef USE_THREADS
int
-magic_mutexfree(SV *sv, MAGIC *mg)
+Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
{
dTHR;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: magic_mutexfree 0x%lx\n",
- (unsigned long)thr, (unsigned long)sv);)
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
+ PTR2UV(thr), PTR2UV(sv));)
if (MgOWNER(mg))
- croak("panic: magic_mutexfree");
+ Perl_croak(aTHX_ "panic: magic_mutexfree");
MUTEX_DESTROY(MgMUTEXP(mg));
COND_DESTROY(MgCONDP(mg));
return 0;
@@ -1883,13 +2077,13 @@ magic_mutexfree(SV *sv, MAGIC *mg)
#endif /* USE_THREADS */
I32
-whichsig(char *sig)
+Perl_whichsig(pTHX_ char *sig)
{
register char **sigv;
- for (sigv = sig_name+1; *sigv; sigv++)
+ for (sigv = PL_sig_name+1; *sigv; sigv++)
if (strEQ(sig,*sigv))
- return sig_num[sigv - sig_name];
+ return PL_sig_num[sigv - PL_sig_name];
#ifdef SIGCLD
if (strEQ(sig,"CHLD"))
return SIGCLD;
@@ -1903,22 +2097,10 @@ whichsig(char *sig)
static SV* sig_sv;
-STATIC void
-unwind_handler_stack(void *p)
-{
- dTHR;
- U32 flags = *(U32*)p;
-
- if (flags & 1)
- PL_savestack_ix -= 5; /* Unprotect save in progress. */
- /* cxstack_ix-- Not needed, die already unwound it. */
- if (flags & 64)
- SvREFCNT_dec(sig_sv);
-}
-
Signal_t
-sighandler(int sig)
+Perl_sighandler(int sig)
{
+ dTHX;
dSP;
GV *gv = Nullgv;
HV *st;
@@ -1926,7 +2108,7 @@ sighandler(int sig)
CV *cv = Nullcv;
OP *myop = PL_op;
U32 flags = 0;
- I32 o_save_i = PL_savestack_ix, type;
+ I32 o_save_i = PL_savestack_ix;
XPV *tXpv = PL_Xpv;
if (PL_savestack_ix + 15 <= PL_savestack_max)
@@ -1938,16 +2120,16 @@ sighandler(int sig)
if (PL_scopestack_ix < PL_scopestack_max - 3)
flags |= 16;
- if (!psig_ptr[sig])
- die("Signal SIG%s received, but no signal handler set.\n",
- sig_name[sig]);
+ if (!PL_psig_ptr[sig])
+ Perl_die(aTHX_ "Signal SIG%s received, but no signal handler set.\n",
+ PL_sig_name[sig]);
/* Max number of items pushed there is 3*n or 4. We cannot fix
infinity, so we fix 4 (in fact 5): */
if (flags & 1) {
PL_savestack_ix += 5; /* Protect save in progress. */
o_save_i = PL_savestack_ix;
- SAVEDESTRUCTOR(unwind_handler_stack, (void*)&flags);
+ SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
}
if (flags & 4)
PL_markstack_ptr++; /* Protect mark. */
@@ -1958,27 +2140,27 @@ sighandler(int sig)
if (flags & 16)
PL_scopestack_ix += 1;
/* sv_2cv is too complicated, try a simpler variant first: */
- if (!SvROK(psig_ptr[sig]) || !(cv = (CV*)SvRV(psig_ptr[sig]))
+ if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
|| SvTYPE(cv) != SVt_PVCV)
- cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
+ cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
if (!cv || !CvROOT(cv)) {
- if (PL_dowarn)
- warn("SIG%s handler \"%s\" not defined.\n",
- sig_name[sig], (gv ? GvENAME(gv)
+ if (ckWARN(WARN_SIGNAL))
+ Perl_warner(aTHX_ WARN_SIGNAL, "SIG%s handler \"%s\" not defined.\n",
+ PL_sig_name[sig], (gv ? GvENAME(gv)
: ((cv && CvGV(cv))
? GvENAME(CvGV(cv))
: "__ANON__")));
goto cleanup;
}
- if(psig_name[sig]) {
- sv = SvREFCNT_inc(psig_name[sig]);
+ if(PL_psig_name[sig]) {
+ sv = SvREFCNT_inc(PL_psig_name[sig]);
flags |= 64;
sig_sv = sv;
} else {
sv = sv_newmortal();
- sv_setpv(sv,sig_name[sig]);
+ sv_setpv(sv,PL_sig_name[sig]);
}
PUSHSTACKi(PERLSI_SIGNAL);
@@ -1986,7 +2168,7 @@ sighandler(int sig)
PUSHs(sv);
PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ call_sv((SV*)cv, G_DISCARD);
POPSTACK;
cleanup:
@@ -2008,3 +2190,61 @@ cleanup:
}
+#ifdef PERL_OBJECT
+#include "XSUB.h"
+#endif
+
+static void
+restore_magic(pTHXo_ void *p)
+{
+ dTHR;
+ MGS* mgs = SSPTR(PTR2IV(p), MGS*);
+ SV* sv = mgs->mgs_sv;
+
+ if (!sv)
+ return;
+
+ if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
+ {
+ if (mgs->mgs_flags)
+ SvFLAGS(sv) |= mgs->mgs_flags;
+ else
+ mg_magical(sv);
+ if (SvGMAGICAL(sv))
+ SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
+ }
+
+ mgs->mgs_sv = NULL; /* mark the MGS structure as restored */
+
+ /* If we're still on top of the stack, pop us off. (That condition
+ * will be satisfied if restore_magic was called explicitly, but *not*
+ * if it's being called via leave_scope.)
+ * The reason for doing this is that otherwise, things like sv_2cv()
+ * may leave alloc gunk on the savestack, and some code
+ * (e.g. sighandler) doesn't expect that...
+ */
+ if (PL_savestack_ix == mgs->mgs_ss_ix)
+ {
+ I32 popval = SSPOPINT;
+ assert(popval == SAVEt_DESTRUCTOR_X);
+ PL_savestack_ix -= 2;
+ popval = SSPOPINT;
+ assert(popval == SAVEt_ALLOC);
+ popval = SSPOPINT;
+ PL_savestack_ix -= popval;
+ }
+
+}
+
+static void
+unwind_handler_stack(pTHXo_ void *p)
+{
+ dTHR;
+ U32 flags = *(U32*)p;
+
+ if (flags & 1)
+ PL_savestack_ix -= 5; /* Unprotect save in progress. */
+ /* cxstack_ix-- Not needed, die already unwound it. */
+ if (flags & 64)
+ SvREFCNT_dec(sig_sv);
+}
diff --git a/contrib/perl5/mg.h b/contrib/perl5/mg.h
index ccd3acc..ad50f5a 100644
--- a/contrib/perl5/mg.h
+++ b/contrib/perl5/mg.h
@@ -1,6 +1,6 @@
/* mg.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -11,11 +11,11 @@
STRUCT_MGVTBL_DEFINITION;
#else
struct mgvtbl {
- int (CPERLscope(*svt_get)) _((SV *sv, MAGIC* mg));
- int (CPERLscope(*svt_set)) _((SV *sv, MAGIC* mg));
- U32 (CPERLscope(*svt_len)) _((SV *sv, MAGIC* mg));
- int (CPERLscope(*svt_clear)) _((SV *sv, MAGIC* mg));
- int (CPERLscope(*svt_free)) _((SV *sv, MAGIC* mg));
+ int (CPERLscope(*svt_get)) (pTHX_ SV *sv, MAGIC* mg);
+ int (CPERLscope(*svt_set)) (pTHX_ SV *sv, MAGIC* mg);
+ U32 (CPERLscope(*svt_len)) (pTHX_ SV *sv, MAGIC* mg);
+ int (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg);
+ int (CPERLscope(*svt_free)) (pTHX_ SV *sv, MAGIC* mg);
};
#endif
@@ -40,7 +40,7 @@ struct magic {
#define MgTAINTEDDIR_on(mg) (mg->mg_flags |= MGf_TAINTEDDIR)
#define MgTAINTEDDIR_off(mg) (mg->mg_flags &= ~MGf_TAINTEDDIR)
-#define MgPV(mg,lp) (((lp = (mg)->mg_len) == HEf_SVKEY) ? \
+#define MgPV(mg,lp) ((((int)(lp = (mg)->mg_len)) == HEf_SVKEY) ? \
SvPV((SV*)((mg)->mg_ptr),lp) : \
(mg)->mg_ptr)
diff --git a/contrib/perl5/minimod.pl b/contrib/perl5/minimod.pl
index 82760ee..8efbd31 100644
--- a/contrib/perl5/minimod.pl
+++ b/contrib/perl5/minimod.pl
@@ -59,7 +59,7 @@ sub writemain{
my($mname, $cname);
($mname = $pname) =~ s!/!::!g;
($cname = $pname) =~ s!/!__!g;
- print "EXTERN_C void boot_${cname} _((CV* cv));\n";
+ print "EXTERN_C void boot_${cname} (CV* cv);\n";
}
my ($tail1,$tail2) = ( $tail =~ /\A(.*\n)(\s*\}.*)\Z/s );
diff --git a/contrib/perl5/miniperlmain.c b/contrib/perl5/miniperlmain.c
index cfbe95b..d1b3e8e 100644
--- a/contrib/perl5/miniperlmain.c
+++ b/contrib/perl5/miniperlmain.c
@@ -8,9 +8,10 @@
#include "EXTERN.h"
+#define PERL_IN_MINIPERLMAIN_C
#include "perl.h"
-static void xs_init _((void));
+static void xs_init (pTHX);
static PerlInterpreter *my_perl;
#if defined (__MINT__) || defined (atarist)
@@ -26,37 +27,37 @@ main(int argc, char **argv, char **env)
#ifdef PERL_GLOBAL_STRUCT
#define PERLVAR(var,type) /**/
+#define PERLVARA(var,type) /**/
#define PERLVARI(var,type,init) PL_Vars.var = init;
#define PERLVARIC(var,type,init) PL_Vars.var = init;
#include "perlvars.h"
#undef PERLVAR
+#undef PERLVARA
#undef PERLVARI
#undef PERLVARIC
#endif
- PERL_SYS_INIT(&argc,&argv);
-
- perl_init_i18nl10n(1);
+ PERL_SYS_INIT3(&argc,&argv,&env);
if (!PL_do_undump) {
my_perl = perl_alloc();
if (!my_perl)
exit(1);
- perl_construct( my_perl );
+ perl_construct(my_perl);
PL_perl_destruct_level = 0;
}
- exitstatus = perl_parse( my_perl, xs_init, argc, argv, (char **) NULL );
+ exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
if (!exitstatus) {
- exitstatus = perl_run( my_perl );
+ exitstatus = perl_run(my_perl);
}
- perl_destruct( my_perl );
- perl_free( my_perl );
+ perl_destruct(my_perl);
+ perl_free(my_perl);
PERL_SYS_TERM();
- exit( exitstatus );
+ exit(exitstatus);
return exitstatus;
}
@@ -65,7 +66,7 @@ main(int argc, char **argv, char **env)
/* Do not delete this line--writemain depends on it */
static void
-xs_init(void)
+xs_init(pTHX)
{
- dXSUB_SYS;
+ dXSUB_SYS;
}
diff --git a/contrib/perl5/myconfig.SH b/contrib/perl5/myconfig.SH
new file mode 100755
index 0000000..7861f5e
--- /dev/null
+++ b/contrib/perl5/myconfig.SH
@@ -0,0 +1,60 @@
+case $CONFIGDOTSH in
+'')
+ if test -f config.sh; then TOP=.;
+ elif test -f ../config.sh; then TOP=..;
+ elif test -f ../../config.sh; then TOP=../..;
+ elif test -f ../../../config.sh; then TOP=../../..;
+ elif test -f ../../../../config.sh; then TOP=../../../..;
+ else
+ echo "Can't find the perl config.sh file produced by Configure";
+ exit 1
+ fi
+ . $TOP/config.sh
+ ;;
+esac
+: This forces SH files to create target in same directory as SH file.
+: This is so that make depend always knows where to find SH derivatives.
+case "$0" in
+*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
+esac
+echo "Extracting myconfig (with variable substitutions)"
+$spitshell >myconfig <<!GROK!THIS!
+$startsh
+
+# This script is designed to provide a handy summary of the configuration
+# information being used to build perl. This is especially useful if you
+# are requesting help from comp.lang.perl.misc on usenet or via mail.
+
+# Note that the text lines /^Summary of/ .. /^\s*$/ are copied into Config.pm.
+cat <<'!NO!SUBS!'
+Summary of my $package (revision $baserev version $PERL_VERSION subversion $PERL_SUBVERSION) configuration:
+ Platform:
+ osname=$osname, osvers=$osvers, archname=$archname
+ uname='$myuname'
+ config_args='$config_args'
+ hint=$hint, useposix=$useposix, d_sigaction=$d_sigaction
+ usethreads=$usethreads use5005threads=$use5005threads useithreads=$useithreads usemultiplicity=$usemultiplicity
+ useperlio=$useperlio d_sfio=$d_sfio uselargefiles=$uselargefiles
+ use64bitint=$use64bitint use64bitall=$use64bitall uselongdouble=$uselongdouble usesocks=$usesocks
+ Compiler:
+ cc='$cc', optimize='$optimize', gccversion=$gccversion
+ cppflags='$cppflags'
+ ccflags ='$ccflags'
+ stdchar='$stdchar', d_stdstdio=$d_stdstdio, usevfork=$usevfork
+ intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize
+ d_longlong=$d_longlong, longlongsize=$longlongsize, d_longdbl=$d_longdbl, longdblsize=$longdblsize
+ ivtype='$ivtype', ivsize=$ivsize, nvtype='$nvtype', nvsize=$nvsize, Off_t='$lseektype', lseeksize=$lseeksize
+ alignbytes=$alignbytes, usemymalloc=$usemymalloc, prototype=$prototype
+ Linker and Libraries:
+ ld='$ld', ldflags ='$ldflags'
+ libpth=$libpth
+ libs=$libs
+ libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl
+ Dynamic Linking:
+ dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags'
+ cccdlflags='$cccdlflags', lddlflags='$lddlflags'
+
+!NO!SUBS!
+!GROK!THIS!
+chmod 755 myconfig
+$eunicefix myconfig
diff --git a/contrib/perl5/objXSUB.h b/contrib/perl5/objXSUB.h
index 94ea6be..68c31b0 100644
--- a/contrib/perl5/objXSUB.h
+++ b/contrib/perl5/objXSUB.h
@@ -1,2065 +1,2242 @@
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
+*/
+
#ifndef __objXSUB_h__
#define __objXSUB_h__
-/* Varibles */
+/* method calls via pPerl (static functions without a "this" pointer need these) */
-#undef PL_Sv
-#define PL_Sv pPerl->PL_Sv
-#undef PL_Xpv
-#define PL_Xpv pPerl->PL_Xpv
-#undef PL_av_fetch_sv
-#define PL_av_fetch_sv pPerl->PL_av_fetch_sv
-#undef PL_bodytarget
-#define PL_bodytarget pPerl->PL_bodytarget
-#undef PL_bostr
-#define PL_bostr pPerl->PL_bostr
-#undef PL_chopset
-#define PL_chopset pPerl->PL_chopset
-#undef PL_colors
-#define PL_colors pPerl->PL_colors
-#undef PL_colorset
-#define PL_colorset pPerl->PL_colorset
-#undef PL_cred_mutex
-#define PL_cred_mutex pPerl->PL_cred_mutex
-#undef PL_curcop
-#define PL_curcop pPerl->PL_curcop
-#undef PL_curpad
-#define PL_curpad pPerl->PL_curpad
-#undef PL_curpm
-#define PL_curpm pPerl->PL_curpm
-#undef PL_curstack
-#define PL_curstack pPerl->PL_curstack
-#undef PL_curstackinfo
-#define PL_curstackinfo pPerl->PL_curstackinfo
-#undef PL_curstash
-#define PL_curstash pPerl->PL_curstash
-#undef PL_defoutgv
-#define PL_defoutgv pPerl->PL_defoutgv
-#undef PL_defstash
-#define PL_defstash pPerl->PL_defstash
-#undef PL_delaymagic
-#define PL_delaymagic pPerl->PL_delaymagic
-#undef PL_dirty
-#define PL_dirty pPerl->PL_dirty
-#undef PL_extralen
-#define PL_extralen pPerl->PL_extralen
-#undef PL_firstgv
-#define PL_firstgv pPerl->PL_firstgv
-#undef PL_formtarget
-#define PL_formtarget pPerl->PL_formtarget
-#undef PL_hv_fetch_ent_mh
-#define PL_hv_fetch_ent_mh pPerl->PL_hv_fetch_ent_mh
-#undef PL_hv_fetch_sv
-#define PL_hv_fetch_sv pPerl->PL_hv_fetch_sv
-#undef PL_in_eval
-#define PL_in_eval pPerl->PL_in_eval
-#undef PL_last_in_gv
-#define PL_last_in_gv pPerl->PL_last_in_gv
-#undef PL_lastgotoprobe
-#define PL_lastgotoprobe pPerl->PL_lastgotoprobe
-#undef PL_lastscream
-#define PL_lastscream pPerl->PL_lastscream
-#undef PL_localizing
-#define PL_localizing pPerl->PL_localizing
-#undef PL_mainstack
-#define PL_mainstack pPerl->PL_mainstack
-#undef PL_markstack
-#define PL_markstack pPerl->PL_markstack
-#undef PL_markstack_max
-#define PL_markstack_max pPerl->PL_markstack_max
-#undef PL_markstack_ptr
-#define PL_markstack_ptr pPerl->PL_markstack_ptr
-#undef PL_maxscream
-#define PL_maxscream pPerl->PL_maxscream
-#undef PL_modcount
-#define PL_modcount pPerl->PL_modcount
-#undef PL_nrs
-#define PL_nrs pPerl->PL_nrs
-#undef PL_ofs
-#define PL_ofs pPerl->PL_ofs
-#undef PL_ofslen
-#define PL_ofslen pPerl->PL_ofslen
-#undef PL_op
-#define PL_op pPerl->PL_op
-#undef PL_opsave
-#define PL_opsave pPerl->PL_opsave
-#undef PL_reg_eval_set
-#define PL_reg_eval_set pPerl->PL_reg_eval_set
-#undef PL_reg_flags
-#define PL_reg_flags pPerl->PL_reg_flags
-#undef PL_reg_start_tmp
-#define PL_reg_start_tmp pPerl->PL_reg_start_tmp
-#undef PL_reg_start_tmpl
-#define PL_reg_start_tmpl pPerl->PL_reg_start_tmpl
-#undef PL_regbol
-#define PL_regbol pPerl->PL_regbol
-#undef PL_regcc
-#define PL_regcc pPerl->PL_regcc
-#undef PL_regcode
-#define PL_regcode pPerl->PL_regcode
-#undef PL_regcomp_parse
-#define PL_regcomp_parse pPerl->PL_regcomp_parse
-#undef PL_regcomp_rx
-#define PL_regcomp_rx pPerl->PL_regcomp_rx
-#undef PL_regcompp
-#define PL_regcompp pPerl->PL_regcompp
-#undef PL_regdata
-#define PL_regdata pPerl->PL_regdata
-#undef PL_regdummy
-#define PL_regdummy pPerl->PL_regdummy
-#undef PL_regendp
-#define PL_regendp pPerl->PL_regendp
-#undef PL_regeol
-#define PL_regeol pPerl->PL_regeol
-#undef PL_regexecp
-#define PL_regexecp pPerl->PL_regexecp
-#undef PL_regflags
-#define PL_regflags pPerl->PL_regflags
-#undef PL_regindent
-#define PL_regindent pPerl->PL_regindent
-#undef PL_reginput
-#define PL_reginput pPerl->PL_reginput
-#undef PL_reginterp_cnt
-#define PL_reginterp_cnt pPerl->PL_reginterp_cnt
-#undef PL_reglastparen
-#define PL_reglastparen pPerl->PL_reglastparen
-#undef PL_regnarrate
-#define PL_regnarrate pPerl->PL_regnarrate
-#undef PL_regnaughty
-#define PL_regnaughty pPerl->PL_regnaughty
-#undef PL_regnpar
-#define PL_regnpar pPerl->PL_regnpar
-#undef PL_regprecomp
-#define PL_regprecomp pPerl->PL_regprecomp
-#undef PL_regprev
-#define PL_regprev pPerl->PL_regprev
-#undef PL_regprogram
-#define PL_regprogram pPerl->PL_regprogram
-#undef PL_regsawback
-#define PL_regsawback pPerl->PL_regsawback
-#undef PL_regseen
-#define PL_regseen pPerl->PL_regseen
-#undef PL_regsize
-#define PL_regsize pPerl->PL_regsize
-#undef PL_regstartp
-#define PL_regstartp pPerl->PL_regstartp
-#undef PL_regtill
-#define PL_regtill pPerl->PL_regtill
-#undef PL_regxend
-#define PL_regxend pPerl->PL_regxend
-#undef PL_restartop
-#define PL_restartop pPerl->PL_restartop
-#undef PL_retstack
-#define PL_retstack pPerl->PL_retstack
-#undef PL_retstack_ix
-#define PL_retstack_ix pPerl->PL_retstack_ix
-#undef PL_retstack_max
-#define PL_retstack_max pPerl->PL_retstack_max
-#undef PL_rs
-#define PL_rs pPerl->PL_rs
-#undef PL_savestack
-#define PL_savestack pPerl->PL_savestack
-#undef PL_savestack_ix
-#define PL_savestack_ix pPerl->PL_savestack_ix
-#undef PL_savestack_max
-#define PL_savestack_max pPerl->PL_savestack_max
-#undef PL_scopestack
-#define PL_scopestack pPerl->PL_scopestack
-#undef PL_scopestack_ix
-#define PL_scopestack_ix pPerl->PL_scopestack_ix
-#undef PL_scopestack_max
-#define PL_scopestack_max pPerl->PL_scopestack_max
-#undef PL_screamfirst
-#define PL_screamfirst pPerl->PL_screamfirst
-#undef PL_screamnext
-#define PL_screamnext pPerl->PL_screamnext
-#undef PL_secondgv
-#define PL_secondgv pPerl->PL_secondgv
-#undef PL_seen_evals
-#define PL_seen_evals pPerl->PL_seen_evals
-#undef PL_seen_zerolen
-#define PL_seen_zerolen pPerl->PL_seen_zerolen
-#undef PL_sortcop
-#define PL_sortcop pPerl->PL_sortcop
-#undef PL_sortcxix
-#define PL_sortcxix pPerl->PL_sortcxix
-#undef PL_sortstash
-#define PL_sortstash pPerl->PL_sortstash
-#undef PL_stack_base
-#define PL_stack_base pPerl->PL_stack_base
-#undef PL_stack_max
-#define PL_stack_max pPerl->PL_stack_max
-#undef PL_stack_sp
-#define PL_stack_sp pPerl->PL_stack_sp
-#undef PL_start_env
-#define PL_start_env pPerl->PL_start_env
-#undef PL_statbuf
-#define PL_statbuf pPerl->PL_statbuf
-#undef PL_statcache
-#define PL_statcache pPerl->PL_statcache
-#undef PL_statgv
-#define PL_statgv pPerl->PL_statgv
-#undef PL_statname
-#define PL_statname pPerl->PL_statname
-#undef PL_tainted
-#define PL_tainted pPerl->PL_tainted
-#undef PL_timesbuf
-#define PL_timesbuf pPerl->PL_timesbuf
-#undef PL_tmps_floor
-#define PL_tmps_floor pPerl->PL_tmps_floor
-#undef PL_tmps_ix
-#define PL_tmps_ix pPerl->PL_tmps_ix
-#undef PL_tmps_max
-#define PL_tmps_max pPerl->PL_tmps_max
-#undef PL_tmps_stack
-#define PL_tmps_stack pPerl->PL_tmps_stack
-#undef PL_top_env
-#define PL_top_env pPerl->PL_top_env
-#undef PL_toptarget
-#define PL_toptarget pPerl->PL_toptarget
-#undef PL_Argv
-#define PL_Argv pPerl->PL_Argv
-#undef PL_Cmd
-#define PL_Cmd pPerl->PL_Cmd
-#undef PL_DBcv
-#define PL_DBcv pPerl->PL_DBcv
-#undef PL_DBgv
-#define PL_DBgv pPerl->PL_DBgv
-#undef PL_DBline
-#define PL_DBline pPerl->PL_DBline
-#undef PL_DBsignal
-#define PL_DBsignal pPerl->PL_DBsignal
-#undef PL_DBsingle
-#define PL_DBsingle pPerl->PL_DBsingle
-#undef PL_DBsub
-#define PL_DBsub pPerl->PL_DBsub
-#undef PL_DBtrace
-#define PL_DBtrace pPerl->PL_DBtrace
-#undef PL_ampergv
-#define PL_ampergv pPerl->PL_ampergv
-#undef PL_archpat_auto
-#define PL_archpat_auto pPerl->PL_archpat_auto
-#undef PL_argvgv
-#define PL_argvgv pPerl->PL_argvgv
-#undef PL_argvoutgv
-#define PL_argvoutgv pPerl->PL_argvoutgv
-#undef PL_basetime
-#define PL_basetime pPerl->PL_basetime
-#undef PL_beginav
-#define PL_beginav pPerl->PL_beginav
-#undef PL_cddir
-#define PL_cddir pPerl->PL_cddir
-#undef PL_compcv
-#define PL_compcv pPerl->PL_compcv
-#undef PL_compiling
-#define PL_compiling pPerl->PL_compiling
-#undef PL_comppad
-#define PL_comppad pPerl->PL_comppad
-#undef PL_comppad_name
-#define PL_comppad_name pPerl->PL_comppad_name
-#undef PL_comppad_name_fill
-#define PL_comppad_name_fill pPerl->PL_comppad_name_fill
-#undef PL_comppad_name_floor
-#define PL_comppad_name_floor pPerl->PL_comppad_name_floor
-#undef PL_copline
-#define PL_copline pPerl->PL_copline
-#undef PL_curcopdb
-#define PL_curcopdb pPerl->PL_curcopdb
-#undef PL_curstname
-#define PL_curstname pPerl->PL_curstname
-#undef PL_dbargs
-#define PL_dbargs pPerl->PL_dbargs
-#undef PL_debdelim
-#define PL_debdelim pPerl->PL_debdelim
-#undef PL_debname
-#define PL_debname pPerl->PL_debname
-#undef PL_debstash
-#define PL_debstash pPerl->PL_debstash
-#undef PL_defgv
-#define PL_defgv pPerl->PL_defgv
-#undef PL_diehook
-#define PL_diehook pPerl->PL_diehook
-#undef PL_dlevel
-#define PL_dlevel pPerl->PL_dlevel
-#undef PL_dlmax
-#define PL_dlmax pPerl->PL_dlmax
-#undef PL_doextract
-#define PL_doextract pPerl->PL_doextract
-#undef PL_doswitches
-#define PL_doswitches pPerl->PL_doswitches
-#undef PL_dowarn
-#define PL_dowarn pPerl->PL_dowarn
-#undef PL_dumplvl
-#define PL_dumplvl pPerl->PL_dumplvl
-#undef PL_e_script
-#define PL_e_script pPerl->PL_e_script
-#undef PL_endav
-#define PL_endav pPerl->PL_endav
-#undef PL_envgv
-#define PL_envgv pPerl->PL_envgv
-#undef PL_errgv
-#define PL_errgv pPerl->PL_errgv
-#undef PL_eval_root
-#define PL_eval_root pPerl->PL_eval_root
-#undef PL_eval_start
-#define PL_eval_start pPerl->PL_eval_start
-#undef PL_exitlist
-#define PL_exitlist pPerl->PL_exitlist
-#undef PL_exitlistlen
-#define PL_exitlistlen pPerl->PL_exitlistlen
-#undef PL_fdpid
-#define PL_fdpid pPerl->PL_fdpid
-#undef PL_filemode
-#define PL_filemode pPerl->PL_filemode
-#undef PL_forkprocess
-#define PL_forkprocess pPerl->PL_forkprocess
-#undef PL_formfeed
-#define PL_formfeed pPerl->PL_formfeed
-#undef PL_generation
-#define PL_generation pPerl->PL_generation
-#undef PL_gensym
-#define PL_gensym pPerl->PL_gensym
-#undef PL_globalstash
-#define PL_globalstash pPerl->PL_globalstash
-#undef PL_hintgv
-#define PL_hintgv pPerl->PL_hintgv
-#undef PL_in_clean_all
-#define PL_in_clean_all pPerl->PL_in_clean_all
-#undef PL_in_clean_objs
-#define PL_in_clean_objs pPerl->PL_in_clean_objs
-#undef PL_incgv
-#define PL_incgv pPerl->PL_incgv
-#undef PL_initav
-#define PL_initav pPerl->PL_initav
-#undef PL_inplace
-#define PL_inplace pPerl->PL_inplace
-#undef PL_last_proto
-#define PL_last_proto pPerl->PL_last_proto
-#undef PL_lastfd
-#define PL_lastfd pPerl->PL_lastfd
-#undef PL_lastsize
-#define PL_lastsize pPerl->PL_lastsize
-#undef PL_lastspbase
-#define PL_lastspbase pPerl->PL_lastspbase
-#undef PL_laststatval
-#define PL_laststatval pPerl->PL_laststatval
-#undef PL_laststype
-#define PL_laststype pPerl->PL_laststype
-#undef PL_leftgv
-#define PL_leftgv pPerl->PL_leftgv
-#undef PL_lineary
-#define PL_lineary pPerl->PL_lineary
-#undef PL_linestart
-#define PL_linestart pPerl->PL_linestart
-#undef PL_localpatches
-#define PL_localpatches pPerl->PL_localpatches
-#undef PL_main_cv
-#define PL_main_cv pPerl->PL_main_cv
-#undef PL_main_root
-#define PL_main_root pPerl->PL_main_root
-#undef PL_main_start
-#define PL_main_start pPerl->PL_main_start
-#undef PL_maxsysfd
-#define PL_maxsysfd pPerl->PL_maxsysfd
-#undef PL_mess_sv
-#define PL_mess_sv pPerl->PL_mess_sv
-#undef PL_minus_F
-#define PL_minus_F pPerl->PL_minus_F
-#undef PL_minus_a
-#define PL_minus_a pPerl->PL_minus_a
-#undef PL_minus_c
-#define PL_minus_c pPerl->PL_minus_c
-#undef PL_minus_l
-#define PL_minus_l pPerl->PL_minus_l
-#undef PL_minus_n
-#define PL_minus_n pPerl->PL_minus_n
-#undef PL_minus_p
-#define PL_minus_p pPerl->PL_minus_p
-#undef PL_modglobal
-#define PL_modglobal pPerl->PL_modglobal
-#undef PL_multiline
-#define PL_multiline pPerl->PL_multiline
-#undef PL_mystrk
-#define PL_mystrk pPerl->PL_mystrk
-#undef PL_ofmt
-#define PL_ofmt pPerl->PL_ofmt
-#undef PL_oldlastpm
-#define PL_oldlastpm pPerl->PL_oldlastpm
-#undef PL_oldname
-#define PL_oldname pPerl->PL_oldname
-#undef PL_op_mask
-#define PL_op_mask pPerl->PL_op_mask
-#undef PL_origargc
-#define PL_origargc pPerl->PL_origargc
-#undef PL_origargv
-#define PL_origargv pPerl->PL_origargv
-#undef PL_origfilename
-#define PL_origfilename pPerl->PL_origfilename
-#undef PL_ors
-#define PL_ors pPerl->PL_ors
-#undef PL_orslen
-#define PL_orslen pPerl->PL_orslen
-#undef PL_parsehook
-#define PL_parsehook pPerl->PL_parsehook
-#undef PL_patchlevel
-#define PL_patchlevel pPerl->PL_patchlevel
-#undef PL_pending_ident
-#define PL_pending_ident pPerl->PL_pending_ident
-#undef PL_perl_destruct_level
-#define PL_perl_destruct_level pPerl->PL_perl_destruct_level
-#undef PL_perldb
-#define PL_perldb pPerl->PL_perldb
-#undef PL_preambleav
-#define PL_preambleav pPerl->PL_preambleav
-#undef PL_preambled
-#define PL_preambled pPerl->PL_preambled
-#undef PL_preprocess
-#define PL_preprocess pPerl->PL_preprocess
-#undef PL_profiledata
-#define PL_profiledata pPerl->PL_profiledata
-#undef PL_replgv
-#define PL_replgv pPerl->PL_replgv
-#undef PL_rightgv
-#define PL_rightgv pPerl->PL_rightgv
-#undef PL_rsfp
-#define PL_rsfp pPerl->PL_rsfp
-#undef PL_rsfp_filters
-#define PL_rsfp_filters pPerl->PL_rsfp_filters
-#undef PL_sawampersand
-#define PL_sawampersand pPerl->PL_sawampersand
-#undef PL_sawstudy
-#define PL_sawstudy pPerl->PL_sawstudy
-#undef PL_sawvec
-#define PL_sawvec pPerl->PL_sawvec
-#undef PL_siggv
-#define PL_siggv pPerl->PL_siggv
-#undef PL_splitstr
-#define PL_splitstr pPerl->PL_splitstr
-#undef PL_statusvalue
-#define PL_statusvalue pPerl->PL_statusvalue
-#undef PL_statusvalue_vms
-#define PL_statusvalue_vms pPerl->PL_statusvalue_vms
-#undef PL_stdingv
-#define PL_stdingv pPerl->PL_stdingv
-#undef PL_strchop
-#define PL_strchop pPerl->PL_strchop
-#undef PL_strtab
-#define PL_strtab pPerl->PL_strtab
-#undef PL_strtab_mutex
-#define PL_strtab_mutex pPerl->PL_strtab_mutex
-#undef PL_sub_generation
-#define PL_sub_generation pPerl->PL_sub_generation
-#undef PL_sublex_info
-#define PL_sublex_info pPerl->PL_sublex_info
-#undef PL_sv_arenaroot
-#define PL_sv_arenaroot pPerl->PL_sv_arenaroot
-#undef PL_sv_count
-#define PL_sv_count pPerl->PL_sv_count
-#undef PL_sv_objcount
-#define PL_sv_objcount pPerl->PL_sv_objcount
-#undef PL_sv_root
-#define PL_sv_root pPerl->PL_sv_root
-#undef PL_sys_intern
-#define PL_sys_intern pPerl->PL_sys_intern
-#undef PL_tainting
-#define PL_tainting pPerl->PL_tainting
-#undef PL_threadnum
-#define PL_threadnum pPerl->PL_threadnum
-#undef PL_thrsv
-#define PL_thrsv pPerl->PL_thrsv
-#undef PL_unsafe
-#define PL_unsafe pPerl->PL_unsafe
-#undef PL_warnhook
-#define PL_warnhook pPerl->PL_warnhook
-#undef PL_No
-#define PL_No pPerl->PL_No
-#undef PL_Yes
-#define PL_Yes pPerl->PL_Yes
-#undef PL_amagic_generation
-#define PL_amagic_generation pPerl->PL_amagic_generation
-#undef PL_an
-#define PL_an pPerl->PL_an
-#undef PL_bufend
-#define PL_bufend pPerl->PL_bufend
-#undef PL_bufptr
-#define PL_bufptr pPerl->PL_bufptr
-#undef PL_collation_ix
-#define PL_collation_ix pPerl->PL_collation_ix
-#undef PL_collation_name
-#define PL_collation_name pPerl->PL_collation_name
-#undef PL_collation_standard
-#define PL_collation_standard pPerl->PL_collation_standard
-#undef PL_collxfrm_base
-#define PL_collxfrm_base pPerl->PL_collxfrm_base
-#undef PL_collxfrm_mult
-#define PL_collxfrm_mult pPerl->PL_collxfrm_mult
-#undef PL_cop_seqmax
-#define PL_cop_seqmax pPerl->PL_cop_seqmax
-#undef PL_cryptseen
-#define PL_cryptseen pPerl->PL_cryptseen
-#undef PL_cshlen
-#define PL_cshlen pPerl->PL_cshlen
-#undef PL_cshname
-#define PL_cshname pPerl->PL_cshname
-#undef PL_curinterp
-#define PL_curinterp pPerl->PL_curinterp
-#undef PL_curthr
-#define PL_curthr pPerl->PL_curthr
-#undef PL_debug
-#define PL_debug pPerl->PL_debug
-#undef PL_do_undump
-#define PL_do_undump pPerl->PL_do_undump
-#undef PL_egid
-#define PL_egid pPerl->PL_egid
-#undef PL_error_count
-#define PL_error_count pPerl->PL_error_count
-#undef PL_euid
-#define PL_euid pPerl->PL_euid
-#undef PL_eval_cond
-#define PL_eval_cond pPerl->PL_eval_cond
-#undef PL_eval_mutex
-#define PL_eval_mutex pPerl->PL_eval_mutex
-#undef PL_eval_owner
-#define PL_eval_owner pPerl->PL_eval_owner
-#undef PL_evalseq
-#define PL_evalseq pPerl->PL_evalseq
-#undef PL_expect
-#define PL_expect pPerl->PL_expect
-#undef PL_gid
-#define PL_gid pPerl->PL_gid
-#undef PL_he_root
-#define PL_he_root pPerl->PL_he_root
-#undef PL_hexdigit
-#define PL_hexdigit pPerl->PL_hexdigit
-#undef PL_hints
-#define PL_hints pPerl->PL_hints
-#undef PL_in_my
-#define PL_in_my pPerl->PL_in_my
-#undef PL_in_my_stash
-#define PL_in_my_stash pPerl->PL_in_my_stash
-#undef PL_last_lop
-#define PL_last_lop pPerl->PL_last_lop
-#undef PL_last_lop_op
-#define PL_last_lop_op pPerl->PL_last_lop_op
-#undef PL_last_uni
-#define PL_last_uni pPerl->PL_last_uni
-#undef PL_lex_brackets
-#define PL_lex_brackets pPerl->PL_lex_brackets
-#undef PL_lex_brackstack
-#define PL_lex_brackstack pPerl->PL_lex_brackstack
-#undef PL_lex_casemods
-#define PL_lex_casemods pPerl->PL_lex_casemods
-#undef PL_lex_casestack
-#define PL_lex_casestack pPerl->PL_lex_casestack
-#undef PL_lex_defer
-#define PL_lex_defer pPerl->PL_lex_defer
-#undef PL_lex_dojoin
-#define PL_lex_dojoin pPerl->PL_lex_dojoin
-#undef PL_lex_expect
-#define PL_lex_expect pPerl->PL_lex_expect
-#undef PL_lex_fakebrack
-#define PL_lex_fakebrack pPerl->PL_lex_fakebrack
-#undef PL_lex_formbrack
-#define PL_lex_formbrack pPerl->PL_lex_formbrack
-#undef PL_lex_inpat
-#define PL_lex_inpat pPerl->PL_lex_inpat
-#undef PL_lex_inwhat
-#define PL_lex_inwhat pPerl->PL_lex_inwhat
-#undef PL_lex_op
-#define PL_lex_op pPerl->PL_lex_op
-#undef PL_lex_repl
-#define PL_lex_repl pPerl->PL_lex_repl
-#undef PL_lex_starts
-#define PL_lex_starts pPerl->PL_lex_starts
-#undef PL_lex_state
-#define PL_lex_state pPerl->PL_lex_state
-#undef PL_lex_stuff
-#define PL_lex_stuff pPerl->PL_lex_stuff
-#undef PL_linestr
-#define PL_linestr pPerl->PL_linestr
-#undef PL_malloc_mutex
-#define PL_malloc_mutex pPerl->PL_malloc_mutex
-#undef PL_max_intro_pending
-#define PL_max_intro_pending pPerl->PL_max_intro_pending
-#undef PL_maxo
-#define PL_maxo pPerl->PL_maxo
-#undef PL_min_intro_pending
-#define PL_min_intro_pending pPerl->PL_min_intro_pending
-#undef PL_multi_close
-#define PL_multi_close pPerl->PL_multi_close
-#undef PL_multi_end
-#define PL_multi_end pPerl->PL_multi_end
-#undef PL_multi_open
-#define PL_multi_open pPerl->PL_multi_open
-#undef PL_multi_start
-#define PL_multi_start pPerl->PL_multi_start
-#undef PL_na
-#define PL_na pPerl->PL_na
-#undef PL_nexttoke
-#define PL_nexttoke pPerl->PL_nexttoke
-#undef PL_nexttype
-#define PL_nexttype pPerl->PL_nexttype
-#undef PL_nextval
-#define PL_nextval pPerl->PL_nextval
-#undef PL_nice_chunk
-#define PL_nice_chunk pPerl->PL_nice_chunk
-#undef PL_nice_chunk_size
-#define PL_nice_chunk_size pPerl->PL_nice_chunk_size
-#undef PL_ninterps
-#define PL_ninterps pPerl->PL_ninterps
-#undef PL_nomemok
-#define PL_nomemok pPerl->PL_nomemok
-#undef PL_nthreads
-#define PL_nthreads pPerl->PL_nthreads
-#undef PL_nthreads_cond
-#define PL_nthreads_cond pPerl->PL_nthreads_cond
-#undef PL_numeric_local
-#define PL_numeric_local pPerl->PL_numeric_local
-#undef PL_numeric_name
-#define PL_numeric_name pPerl->PL_numeric_name
-#undef PL_numeric_standard
-#define PL_numeric_standard pPerl->PL_numeric_standard
-#undef PL_oldbufptr
-#define PL_oldbufptr pPerl->PL_oldbufptr
-#undef PL_oldoldbufptr
-#define PL_oldoldbufptr pPerl->PL_oldoldbufptr
-#undef PL_op_seqmax
-#define PL_op_seqmax pPerl->PL_op_seqmax
-#undef PL_origalen
-#define PL_origalen pPerl->PL_origalen
-#undef PL_origenviron
-#define PL_origenviron pPerl->PL_origenviron
-#undef PL_osname
-#define PL_osname pPerl->PL_osname
-#undef PL_pad_reset_pending
-#define PL_pad_reset_pending pPerl->PL_pad_reset_pending
-#undef PL_padix
-#define PL_padix pPerl->PL_padix
-#undef PL_padix_floor
-#define PL_padix_floor pPerl->PL_padix_floor
-#undef PL_patleave
-#define PL_patleave pPerl->PL_patleave
-#undef PL_pidstatus
-#define PL_pidstatus pPerl->PL_pidstatus
-#undef PL_runops
-#define PL_runops pPerl->PL_runops
-#undef PL_sh_path
-#define PL_sh_path pPerl->PL_sh_path
-#undef PL_sighandlerp
-#define PL_sighandlerp pPerl->PL_sighandlerp
-#undef PL_specialsv_list
-#define PL_specialsv_list pPerl->PL_specialsv_list
-#undef PL_subline
-#define PL_subline pPerl->PL_subline
-#undef PL_subname
-#define PL_subname pPerl->PL_subname
-#undef PL_sv_mutex
-#define PL_sv_mutex pPerl->PL_sv_mutex
-#undef PL_sv_no
-#define PL_sv_no pPerl->PL_sv_no
-#undef PL_sv_undef
-#define PL_sv_undef pPerl->PL_sv_undef
-#undef PL_sv_yes
-#define PL_sv_yes pPerl->PL_sv_yes
-#undef PL_svref_mutex
-#define PL_svref_mutex pPerl->PL_svref_mutex
-#undef PL_thisexpr
-#define PL_thisexpr pPerl->PL_thisexpr
-#undef PL_thr_key
-#define PL_thr_key pPerl->PL_thr_key
-#undef PL_threads_mutex
-#define PL_threads_mutex pPerl->PL_threads_mutex
-#undef PL_threadsv_names
-#define PL_threadsv_names pPerl->PL_threadsv_names
-#undef PL_tokenbuf
-#define PL_tokenbuf pPerl->PL_tokenbuf
-#undef PL_uid
-#define PL_uid pPerl->PL_uid
-#undef PL_xiv_arenaroot
-#define PL_xiv_arenaroot pPerl->PL_xiv_arenaroot
-#undef PL_xiv_root
-#define PL_xiv_root pPerl->PL_xiv_root
-#undef PL_xnv_root
-#define PL_xnv_root pPerl->PL_xnv_root
-#undef PL_xpv_root
-#define PL_xpv_root pPerl->PL_xpv_root
-#undef PL_xrv_root
-#define PL_xrv_root pPerl->PL_xrv_root
+#if defined(PERL_CORE) && defined(PERL_OBJECT)
-/* Functions */
+/* XXX soon to be eliminated, only a few things in PERLCORE need these now */
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#if defined(USE_ITHREADS)
+# if defined(PERL_IMPLICIT_SYS)
+# endif
+#endif
+#if defined(MYMALLOC)
+#endif
+#if defined(PERL_OBJECT)
+#ifndef __BORLANDC__
+#endif
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#undef Perl_amagic_call
+#define Perl_amagic_call pPerl->Perl_amagic_call
#undef amagic_call
-#define amagic_call pPerl->Perl_amagic_call
-#undef Perl_GetVars
-#define Perl_GetVars pPerl->Perl_GetVars
+#define amagic_call Perl_amagic_call
+#undef Perl_Gv_AMupdate
+#define Perl_Gv_AMupdate pPerl->Perl_Gv_AMupdate
#undef Gv_AMupdate
-#define Gv_AMupdate pPerl->Perl_Gv_AMupdate
-#undef append_elem
-#define append_elem pPerl->Perl_append_elem
-#undef append_list
-#define append_list pPerl->Perl_append_list
-#undef apply
-#define apply pPerl->Perl_apply
-#undef assertref
-#define assertref pPerl->Perl_assertref
+#define Gv_AMupdate Perl_Gv_AMupdate
+#undef Perl_avhv_delete_ent
+#define Perl_avhv_delete_ent pPerl->Perl_avhv_delete_ent
+#undef avhv_delete_ent
+#define avhv_delete_ent Perl_avhv_delete_ent
+#undef Perl_avhv_exists_ent
+#define Perl_avhv_exists_ent pPerl->Perl_avhv_exists_ent
+#undef avhv_exists_ent
+#define avhv_exists_ent Perl_avhv_exists_ent
+#undef Perl_avhv_fetch_ent
+#define Perl_avhv_fetch_ent pPerl->Perl_avhv_fetch_ent
+#undef avhv_fetch_ent
+#define avhv_fetch_ent Perl_avhv_fetch_ent
+#undef Perl_avhv_store_ent
+#define Perl_avhv_store_ent pPerl->Perl_avhv_store_ent
+#undef avhv_store_ent
+#define avhv_store_ent Perl_avhv_store_ent
+#undef Perl_avhv_iternext
+#define Perl_avhv_iternext pPerl->Perl_avhv_iternext
+#undef avhv_iternext
+#define avhv_iternext Perl_avhv_iternext
+#undef Perl_avhv_iterval
+#define Perl_avhv_iterval pPerl->Perl_avhv_iterval
+#undef avhv_iterval
+#define avhv_iterval Perl_avhv_iterval
+#undef Perl_avhv_keys
+#define Perl_avhv_keys pPerl->Perl_avhv_keys
+#undef avhv_keys
+#define avhv_keys Perl_avhv_keys
+#undef Perl_av_clear
+#define Perl_av_clear pPerl->Perl_av_clear
#undef av_clear
-#define av_clear pPerl->Perl_av_clear
+#define av_clear Perl_av_clear
+#undef Perl_av_delete
+#define Perl_av_delete pPerl->Perl_av_delete
+#undef av_delete
+#define av_delete Perl_av_delete
+#undef Perl_av_exists
+#define Perl_av_exists pPerl->Perl_av_exists
+#undef av_exists
+#define av_exists Perl_av_exists
+#undef Perl_av_extend
+#define Perl_av_extend pPerl->Perl_av_extend
#undef av_extend
-#define av_extend pPerl->Perl_av_extend
+#define av_extend Perl_av_extend
+#undef Perl_av_fake
+#define Perl_av_fake pPerl->Perl_av_fake
#undef av_fake
-#define av_fake pPerl->Perl_av_fake
+#define av_fake Perl_av_fake
+#undef Perl_av_fetch
+#define Perl_av_fetch pPerl->Perl_av_fetch
#undef av_fetch
-#define av_fetch pPerl->Perl_av_fetch
+#define av_fetch Perl_av_fetch
+#undef Perl_av_fill
+#define Perl_av_fill pPerl->Perl_av_fill
#undef av_fill
-#define av_fill pPerl->Perl_av_fill
+#define av_fill Perl_av_fill
+#undef Perl_av_len
+#define Perl_av_len pPerl->Perl_av_len
#undef av_len
-#define av_len pPerl->Perl_av_len
+#define av_len Perl_av_len
+#undef Perl_av_make
+#define Perl_av_make pPerl->Perl_av_make
#undef av_make
-#define av_make pPerl->Perl_av_make
+#define av_make Perl_av_make
+#undef Perl_av_pop
+#define Perl_av_pop pPerl->Perl_av_pop
#undef av_pop
-#define av_pop pPerl->Perl_av_pop
+#define av_pop Perl_av_pop
+#undef Perl_av_push
+#define Perl_av_push pPerl->Perl_av_push
#undef av_push
-#define av_push pPerl->Perl_av_push
+#define av_push Perl_av_push
+#undef Perl_av_reify
+#define Perl_av_reify pPerl->Perl_av_reify
#undef av_reify
-#define av_reify pPerl->Perl_av_reify
+#define av_reify Perl_av_reify
+#undef Perl_av_shift
+#define Perl_av_shift pPerl->Perl_av_shift
#undef av_shift
-#define av_shift pPerl->Perl_av_shift
+#define av_shift Perl_av_shift
+#undef Perl_av_store
+#define Perl_av_store pPerl->Perl_av_store
#undef av_store
-#define av_store pPerl->Perl_av_store
+#define av_store Perl_av_store
+#undef Perl_av_undef
+#define Perl_av_undef pPerl->Perl_av_undef
#undef av_undef
-#define av_undef pPerl->Perl_av_undef
+#define av_undef Perl_av_undef
+#undef Perl_av_unshift
+#define Perl_av_unshift pPerl->Perl_av_unshift
#undef av_unshift
-#define av_unshift pPerl->Perl_av_unshift
-#undef avhv_exists_ent
-#define avhv_exists_ent pPerl->Perl_avhv_exists_ent
-#undef avhv_fetch_ent
-#define avhv_fetch_ent pPerl->Perl_avhv_fetch_ent
-#undef avhv_iternext
-#define avhv_iternext pPerl->Perl_avhv_iternext
-#undef avhv_iterval
-#define avhv_iterval pPerl->Perl_avhv_iterval
-#undef avhv_keys
-#define avhv_keys pPerl->Perl_avhv_keys
-#undef bind_match
-#define bind_match pPerl->Perl_bind_match
-#undef block_end
-#define block_end pPerl->Perl_block_end
+#define av_unshift Perl_av_unshift
+#undef Perl_block_gimme
+#define Perl_block_gimme pPerl->Perl_block_gimme
#undef block_gimme
-#define block_gimme pPerl->Perl_block_gimme
-#undef block_start
-#define block_start pPerl->Perl_block_start
-#undef byterun
-#define byterun pPerl->Perl_byterun
+#define block_gimme Perl_block_gimme
+#undef Perl_call_list
+#define Perl_call_list pPerl->Perl_call_list
#undef call_list
-#define call_list pPerl->Perl_call_list
-#undef cando
-#define cando pPerl->Perl_cando
+#define call_list Perl_call_list
+#undef Perl_cast_ulong
+#define Perl_cast_ulong pPerl->Perl_cast_ulong
#undef cast_ulong
-#define cast_ulong pPerl->Perl_cast_ulong
-#undef checkcomma
-#define checkcomma pPerl->Perl_checkcomma
-#undef check_uni
-#define check_uni pPerl->Perl_check_uni
-#undef ck_concat
-#define ck_concat pPerl->Perl_ck_concat
-#undef ck_delete
-#define ck_delete pPerl->Perl_ck_delete
-#undef ck_eof
-#define ck_eof pPerl->Perl_ck_eof
-#undef ck_eval
-#define ck_eval pPerl->Perl_ck_eval
-#undef ck_exec
-#define ck_exec pPerl->Perl_ck_exec
-#undef ck_formline
-#define ck_formline pPerl->Perl_ck_formline
-#undef ck_ftst
-#define ck_ftst pPerl->Perl_ck_ftst
-#undef ck_fun
-#define ck_fun pPerl->Perl_ck_fun
-#undef ck_glob
-#define ck_glob pPerl->Perl_ck_glob
-#undef ck_grep
-#define ck_grep pPerl->Perl_ck_grep
-#undef ck_gvconst
-#define ck_gvconst pPerl->Perl_ck_gvconst
-#undef ck_index
-#define ck_index pPerl->Perl_ck_index
-#undef ck_lengthconst
-#define ck_lengthconst pPerl->Perl_ck_lengthconst
-#undef ck_lfun
-#define ck_lfun pPerl->Perl_ck_lfun
-#undef ck_listiob
-#define ck_listiob pPerl->Perl_ck_listiob
-#undef ck_match
-#define ck_match pPerl->Perl_ck_match
-#undef ck_null
-#define ck_null pPerl->Perl_ck_null
-#undef ck_repeat
-#define ck_repeat pPerl->Perl_ck_repeat
-#undef ck_require
-#define ck_require pPerl->Perl_ck_require
-#undef ck_retarget
-#define ck_retarget pPerl->Perl_ck_retarget
-#undef ck_rfun
-#define ck_rfun pPerl->Perl_ck_rfun
-#undef ck_rvconst
-#define ck_rvconst pPerl->Perl_ck_rvconst
-#undef ck_select
-#define ck_select pPerl->Perl_ck_select
-#undef ck_shift
-#define ck_shift pPerl->Perl_ck_shift
-#undef ck_sort
-#define ck_sort pPerl->Perl_ck_sort
-#undef ck_spair
-#define ck_spair pPerl->Perl_ck_spair
-#undef ck_split
-#define ck_split pPerl->Perl_ck_split
-#undef ck_subr
-#define ck_subr pPerl->Perl_ck_subr
-#undef ck_svconst
-#define ck_svconst pPerl->Perl_ck_svconst
-#undef ck_trunc
-#define ck_trunc pPerl->Perl_ck_trunc
+#define cast_ulong Perl_cast_ulong
+#undef Perl_cast_i32
+#define Perl_cast_i32 pPerl->Perl_cast_i32
+#undef cast_i32
+#define cast_i32 Perl_cast_i32
+#undef Perl_cast_iv
+#define Perl_cast_iv pPerl->Perl_cast_iv
+#undef cast_iv
+#define cast_iv Perl_cast_iv
+#undef Perl_cast_uv
+#define Perl_cast_uv pPerl->Perl_cast_uv
+#undef cast_uv
+#define cast_uv Perl_cast_uv
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#undef Perl_my_chsize
+#define Perl_my_chsize pPerl->Perl_my_chsize
+#undef my_chsize
+#define my_chsize Perl_my_chsize
+#endif
+#if defined(USE_THREADS)
+#undef Perl_condpair_magic
+#define Perl_condpair_magic pPerl->Perl_condpair_magic
#undef condpair_magic
-#define condpair_magic pPerl->Perl_condpair_magic
-#undef convert
-#define convert pPerl->Perl_convert
-#undef cpytill
-#define cpytill pPerl->Perl_cpytill
+#define condpair_magic Perl_condpair_magic
+#endif
+#undef Perl_croak
+#define Perl_croak pPerl->Perl_croak
#undef croak
-#define croak pPerl->Perl_croak
-#undef cv_ckproto
-#define cv_ckproto pPerl->Perl_cv_ckproto
-#undef cv_clone
-#define cv_clone pPerl->Perl_cv_clone
+#define croak Perl_croak
+#undef Perl_vcroak
+#define Perl_vcroak pPerl->Perl_vcroak
+#undef vcroak
+#define vcroak Perl_vcroak
+#if defined(PERL_IMPLICIT_CONTEXT)
+#undef Perl_croak_nocontext
+#define Perl_croak_nocontext pPerl->Perl_croak_nocontext
+#undef croak_nocontext
+#define croak_nocontext Perl_croak_nocontext
+#undef Perl_die_nocontext
+#define Perl_die_nocontext pPerl->Perl_die_nocontext
+#undef die_nocontext
+#define die_nocontext Perl_die_nocontext
+#undef Perl_deb_nocontext
+#define Perl_deb_nocontext pPerl->Perl_deb_nocontext
+#undef deb_nocontext
+#define deb_nocontext Perl_deb_nocontext
+#undef Perl_form_nocontext
+#define Perl_form_nocontext pPerl->Perl_form_nocontext
+#undef form_nocontext
+#define form_nocontext Perl_form_nocontext
+#undef Perl_load_module_nocontext
+#define Perl_load_module_nocontext pPerl->Perl_load_module_nocontext
+#undef load_module_nocontext
+#define load_module_nocontext Perl_load_module_nocontext
+#undef Perl_mess_nocontext
+#define Perl_mess_nocontext pPerl->Perl_mess_nocontext
+#undef mess_nocontext
+#define mess_nocontext Perl_mess_nocontext
+#undef Perl_warn_nocontext
+#define Perl_warn_nocontext pPerl->Perl_warn_nocontext
+#undef warn_nocontext
+#define warn_nocontext Perl_warn_nocontext
+#undef Perl_warner_nocontext
+#define Perl_warner_nocontext pPerl->Perl_warner_nocontext
+#undef warner_nocontext
+#define warner_nocontext Perl_warner_nocontext
+#undef Perl_newSVpvf_nocontext
+#define Perl_newSVpvf_nocontext pPerl->Perl_newSVpvf_nocontext
+#undef newSVpvf_nocontext
+#define newSVpvf_nocontext Perl_newSVpvf_nocontext
+#undef Perl_sv_catpvf_nocontext
+#define Perl_sv_catpvf_nocontext pPerl->Perl_sv_catpvf_nocontext
+#undef sv_catpvf_nocontext
+#define sv_catpvf_nocontext Perl_sv_catpvf_nocontext
+#undef Perl_sv_setpvf_nocontext
+#define Perl_sv_setpvf_nocontext pPerl->Perl_sv_setpvf_nocontext
+#undef sv_setpvf_nocontext
+#define sv_setpvf_nocontext Perl_sv_setpvf_nocontext
+#undef Perl_sv_catpvf_mg_nocontext
+#define Perl_sv_catpvf_mg_nocontext pPerl->Perl_sv_catpvf_mg_nocontext
+#undef sv_catpvf_mg_nocontext
+#define sv_catpvf_mg_nocontext Perl_sv_catpvf_mg_nocontext
+#undef Perl_sv_setpvf_mg_nocontext
+#define Perl_sv_setpvf_mg_nocontext pPerl->Perl_sv_setpvf_mg_nocontext
+#undef sv_setpvf_mg_nocontext
+#define sv_setpvf_mg_nocontext Perl_sv_setpvf_mg_nocontext
+#undef Perl_fprintf_nocontext
+#define Perl_fprintf_nocontext pPerl->Perl_fprintf_nocontext
+#undef fprintf_nocontext
+#define fprintf_nocontext Perl_fprintf_nocontext
+#endif
+#undef Perl_cv_const_sv
+#define Perl_cv_const_sv pPerl->Perl_cv_const_sv
#undef cv_const_sv
-#define cv_const_sv pPerl->Perl_cv_const_sv
+#define cv_const_sv Perl_cv_const_sv
+#undef Perl_cv_undef
+#define Perl_cv_undef pPerl->Perl_cv_undef
#undef cv_undef
-#define cv_undef pPerl->Perl_cv_undef
+#define cv_undef Perl_cv_undef
+#undef Perl_cx_dump
+#define Perl_cx_dump pPerl->Perl_cx_dump
#undef cx_dump
-#define cx_dump pPerl->Perl_cx_dump
-#undef cxinc
-#define cxinc pPerl->Perl_cxinc
+#define cx_dump Perl_cx_dump
+#undef Perl_filter_add
+#define Perl_filter_add pPerl->Perl_filter_add
+#undef filter_add
+#define filter_add Perl_filter_add
+#undef Perl_filter_del
+#define Perl_filter_del pPerl->Perl_filter_del
+#undef filter_del
+#define filter_del Perl_filter_del
+#undef Perl_filter_read
+#define Perl_filter_read pPerl->Perl_filter_read
+#undef filter_read
+#define filter_read Perl_filter_read
+#undef Perl_get_op_descs
+#define Perl_get_op_descs pPerl->Perl_get_op_descs
+#undef get_op_descs
+#define get_op_descs Perl_get_op_descs
+#undef Perl_get_op_names
+#define Perl_get_op_names pPerl->Perl_get_op_names
+#undef get_op_names
+#define get_op_names Perl_get_op_names
+#undef Perl_get_ppaddr
+#define Perl_get_ppaddr pPerl->Perl_get_ppaddr
+#undef get_ppaddr
+#define get_ppaddr Perl_get_ppaddr
+#undef Perl_deb
+#define Perl_deb pPerl->Perl_deb
#undef deb
-#define deb pPerl->Perl_deb
-#undef deb_growlevel
-#define deb_growlevel pPerl->Perl_deb_growlevel
+#define deb Perl_deb
+#undef Perl_vdeb
+#define Perl_vdeb pPerl->Perl_vdeb
+#undef vdeb
+#define vdeb Perl_vdeb
+#undef Perl_debprofdump
+#define Perl_debprofdump pPerl->Perl_debprofdump
#undef debprofdump
-#define debprofdump pPerl->Perl_debprofdump
+#define debprofdump Perl_debprofdump
+#undef Perl_debop
+#define Perl_debop pPerl->Perl_debop
#undef debop
-#define debop pPerl->Perl_debop
+#define debop Perl_debop
+#undef Perl_debstack
+#define Perl_debstack pPerl->Perl_debstack
#undef debstack
-#define debstack pPerl->Perl_debstack
+#define debstack Perl_debstack
+#undef Perl_debstackptrs
+#define Perl_debstackptrs pPerl->Perl_debstackptrs
#undef debstackptrs
-#define debstackptrs pPerl->Perl_debstackptrs
+#define debstackptrs Perl_debstackptrs
+#undef Perl_delimcpy
+#define Perl_delimcpy pPerl->Perl_delimcpy
#undef delimcpy
-#define delimcpy pPerl->Perl_delimcpy
-#undef deprecate
-#define deprecate pPerl->Perl_deprecate
+#define delimcpy Perl_delimcpy
+#undef Perl_die
+#define Perl_die pPerl->Perl_die
#undef die
-#define die pPerl->Perl_die
-#undef die_where
-#define die_where pPerl->Perl_die_where
-#undef dopoptoeval
-#define dopoptoeval pPerl->Perl_dopoptoeval
+#define die Perl_die
+#undef Perl_dounwind
+#define Perl_dounwind pPerl->Perl_dounwind
#undef dounwind
-#define dounwind pPerl->Perl_dounwind
-#undef do_aexec
-#define do_aexec pPerl->Perl_do_aexec
+#define dounwind Perl_dounwind
+#undef Perl_do_binmode
+#define Perl_do_binmode pPerl->Perl_do_binmode
#undef do_binmode
-#define do_binmode pPerl->Perl_do_binmode
-#undef do_chomp
-#define do_chomp pPerl->Perl_do_chomp
-#undef do_chop
-#define do_chop pPerl->Perl_do_chop
+#define do_binmode Perl_do_binmode
+#undef Perl_do_close
+#define Perl_do_close pPerl->Perl_do_close
#undef do_close
-#define do_close pPerl->Perl_do_close
-#undef do_eof
-#define do_eof pPerl->Perl_do_eof
-#undef do_exec
-#define do_exec pPerl->Perl_do_exec
-#undef do_execfree
-#define do_execfree pPerl->Perl_do_execfree
-#undef do_join
-#define do_join pPerl->Perl_do_join
-#undef do_kv
-#define do_kv pPerl->Perl_do_kv
+#define do_close Perl_do_close
+#if !defined(WIN32)
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#endif
+#undef Perl_do_open
+#define Perl_do_open pPerl->Perl_do_open
#undef do_open
-#define do_open pPerl->Perl_do_open
-#undef do_pipe
-#define do_pipe pPerl->Perl_do_pipe
-#undef do_print
-#define do_print pPerl->Perl_do_print
-#undef do_readline
-#define do_readline pPerl->Perl_do_readline
-#undef do_seek
-#define do_seek pPerl->Perl_do_seek
-#undef do_sprintf
-#define do_sprintf pPerl->Perl_do_sprintf
-#undef do_sysseek
-#define do_sysseek pPerl->Perl_do_sysseek
-#undef do_tell
-#define do_tell pPerl->Perl_do_tell
-#undef do_trans
-#define do_trans pPerl->Perl_do_trans
-#undef do_vecset
-#define do_vecset pPerl->Perl_do_vecset
-#undef do_vop
-#define do_vop pPerl->Perl_do_vop
-#undef dofile
-#define dofile pPerl->Perl_dofile
+#define do_open Perl_do_open
+#undef Perl_do_open9
+#define Perl_do_open9 pPerl->Perl_do_open9
+#undef do_open9
+#define do_open9 Perl_do_open9
+#undef Perl_dowantarray
+#define Perl_dowantarray pPerl->Perl_dowantarray
#undef dowantarray
-#define dowantarray pPerl->Perl_dowantarray
+#define dowantarray Perl_dowantarray
+#undef Perl_dump_all
+#define Perl_dump_all pPerl->Perl_dump_all
#undef dump_all
-#define dump_all pPerl->Perl_dump_all
+#define dump_all Perl_dump_all
+#undef Perl_dump_eval
+#define Perl_dump_eval pPerl->Perl_dump_eval
#undef dump_eval
-#define dump_eval pPerl->Perl_dump_eval
+#define dump_eval Perl_dump_eval
+#if defined(DUMP_FDS)
+#undef Perl_dump_fds
+#define Perl_dump_fds pPerl->Perl_dump_fds
#undef dump_fds
-#define dump_fds pPerl->Perl_dump_fds
+#define dump_fds Perl_dump_fds
+#endif
+#undef Perl_dump_form
+#define Perl_dump_form pPerl->Perl_dump_form
#undef dump_form
-#define dump_form pPerl->Perl_dump_form
-#undef dump_gv
-#define dump_gv pPerl->Perl_dump_gv
-#undef dump_mstats
-#define dump_mstats pPerl->Perl_dump_mstats
-#undef dump_op
-#define dump_op pPerl->Perl_dump_op
-#undef dump_pm
-#define dump_pm pPerl->Perl_dump_pm
+#define dump_form Perl_dump_form
+#undef Perl_gv_dump
+#define Perl_gv_dump pPerl->Perl_gv_dump
+#undef gv_dump
+#define gv_dump Perl_gv_dump
+#undef Perl_op_dump
+#define Perl_op_dump pPerl->Perl_op_dump
+#undef op_dump
+#define op_dump Perl_op_dump
+#undef Perl_pmop_dump
+#define Perl_pmop_dump pPerl->Perl_pmop_dump
+#undef pmop_dump
+#define pmop_dump Perl_pmop_dump
+#undef Perl_dump_packsubs
+#define Perl_dump_packsubs pPerl->Perl_dump_packsubs
#undef dump_packsubs
-#define dump_packsubs pPerl->Perl_dump_packsubs
+#define dump_packsubs Perl_dump_packsubs
+#undef Perl_dump_sub
+#define Perl_dump_sub pPerl->Perl_dump_sub
#undef dump_sub
-#define dump_sub pPerl->Perl_dump_sub
+#define dump_sub Perl_dump_sub
+#undef Perl_fbm_compile
+#define Perl_fbm_compile pPerl->Perl_fbm_compile
#undef fbm_compile
-#define fbm_compile pPerl->Perl_fbm_compile
+#define fbm_compile Perl_fbm_compile
+#undef Perl_fbm_instr
+#define Perl_fbm_instr pPerl->Perl_fbm_instr
#undef fbm_instr
-#define fbm_instr pPerl->Perl_fbm_instr
-#undef filter_add
-#define filter_add pPerl->Perl_filter_add
-#undef filter_del
-#define filter_del pPerl->Perl_filter_del
-#undef filter_read
-#define filter_read pPerl->Perl_filter_read
-#undef find_threadsv
-#define find_threadsv pPerl->Perl_find_threadsv
-#undef find_script
-#define find_script pPerl->Perl_find_script
-#undef force_ident
-#define force_ident pPerl->Perl_force_ident
-#undef force_list
-#define force_list pPerl->Perl_force_list
-#undef force_next
-#define force_next pPerl->Perl_force_next
-#undef force_word
-#define force_word pPerl->Perl_force_word
+#define fbm_instr Perl_fbm_instr
+#if defined(USE_THREADS)
+#endif
+#undef Perl_form
+#define Perl_form pPerl->Perl_form
#undef form
-#define form pPerl->Perl_form
-#undef fold_constants
-#define fold_constants pPerl->Perl_fold_constants
-#undef fprintf
-#define fprintf pPerl->fprintf
+#define form Perl_form
+#undef Perl_vform
+#define Perl_vform pPerl->Perl_vform
+#undef vform
+#define vform Perl_vform
+#undef Perl_free_tmps
+#define Perl_free_tmps pPerl->Perl_free_tmps
#undef free_tmps
-#define free_tmps pPerl->Perl_free_tmps
-#undef gen_constant_list
-#define gen_constant_list pPerl->Perl_gen_constant_list
-#undef get_op_descs
-#define get_op_descs pPerl->Perl_get_op_descs
-#undef get_op_names
-#define get_op_names pPerl->Perl_get_op_names
-#undef get_no_modify
-#define get_no_modify pPerl->Perl_get_no_modify
-#undef get_opargs
-#define get_opargs pPerl->Perl_get_opargs
-#undef get_specialsv_list
-#define get_specialsv_list pPerl->Perl_get_specialsv_list
-#undef get_vtbl
-#define get_vtbl pPerl->Perl_get_vtbl
+#define free_tmps Perl_free_tmps
+#if !defined(HAS_GETENV_LEN)
+#endif
+#undef Perl_gp_free
+#define Perl_gp_free pPerl->Perl_gp_free
#undef gp_free
-#define gp_free pPerl->Perl_gp_free
+#define gp_free Perl_gp_free
+#undef Perl_gp_ref
+#define Perl_gp_ref pPerl->Perl_gp_ref
#undef gp_ref
-#define gp_ref pPerl->Perl_gp_ref
+#define gp_ref Perl_gp_ref
+#undef Perl_gv_AVadd
+#define Perl_gv_AVadd pPerl->Perl_gv_AVadd
#undef gv_AVadd
-#define gv_AVadd pPerl->Perl_gv_AVadd
+#define gv_AVadd Perl_gv_AVadd
+#undef Perl_gv_HVadd
+#define Perl_gv_HVadd pPerl->Perl_gv_HVadd
#undef gv_HVadd
-#define gv_HVadd pPerl->Perl_gv_HVadd
+#define gv_HVadd Perl_gv_HVadd
+#undef Perl_gv_IOadd
+#define Perl_gv_IOadd pPerl->Perl_gv_IOadd
#undef gv_IOadd
-#define gv_IOadd pPerl->Perl_gv_IOadd
+#define gv_IOadd Perl_gv_IOadd
+#undef Perl_gv_autoload4
+#define Perl_gv_autoload4 pPerl->Perl_gv_autoload4
#undef gv_autoload4
-#define gv_autoload4 pPerl->Perl_gv_autoload4
+#define gv_autoload4 Perl_gv_autoload4
+#undef Perl_gv_check
+#define Perl_gv_check pPerl->Perl_gv_check
#undef gv_check
-#define gv_check pPerl->Perl_gv_check
+#define gv_check Perl_gv_check
+#undef Perl_gv_efullname
+#define Perl_gv_efullname pPerl->Perl_gv_efullname
#undef gv_efullname
-#define gv_efullname pPerl->Perl_gv_efullname
+#define gv_efullname Perl_gv_efullname
+#undef Perl_gv_efullname3
+#define Perl_gv_efullname3 pPerl->Perl_gv_efullname3
#undef gv_efullname3
-#define gv_efullname3 pPerl->Perl_gv_efullname3
+#define gv_efullname3 Perl_gv_efullname3
+#undef Perl_gv_fetchfile
+#define Perl_gv_fetchfile pPerl->Perl_gv_fetchfile
#undef gv_fetchfile
-#define gv_fetchfile pPerl->Perl_gv_fetchfile
+#define gv_fetchfile Perl_gv_fetchfile
+#undef Perl_gv_fetchmeth
+#define Perl_gv_fetchmeth pPerl->Perl_gv_fetchmeth
#undef gv_fetchmeth
-#define gv_fetchmeth pPerl->Perl_gv_fetchmeth
+#define gv_fetchmeth Perl_gv_fetchmeth
+#undef Perl_gv_fetchmethod
+#define Perl_gv_fetchmethod pPerl->Perl_gv_fetchmethod
#undef gv_fetchmethod
-#define gv_fetchmethod pPerl->Perl_gv_fetchmethod
+#define gv_fetchmethod Perl_gv_fetchmethod
+#undef Perl_gv_fetchmethod_autoload
+#define Perl_gv_fetchmethod_autoload pPerl->Perl_gv_fetchmethod_autoload
#undef gv_fetchmethod_autoload
-#define gv_fetchmethod_autoload pPerl->Perl_gv_fetchmethod_autoload
+#define gv_fetchmethod_autoload Perl_gv_fetchmethod_autoload
+#undef Perl_gv_fetchpv
+#define Perl_gv_fetchpv pPerl->Perl_gv_fetchpv
#undef gv_fetchpv
-#define gv_fetchpv pPerl->Perl_gv_fetchpv
+#define gv_fetchpv Perl_gv_fetchpv
+#undef Perl_gv_fullname
+#define Perl_gv_fullname pPerl->Perl_gv_fullname
#undef gv_fullname
-#define gv_fullname pPerl->Perl_gv_fullname
+#define gv_fullname Perl_gv_fullname
+#undef Perl_gv_fullname3
+#define Perl_gv_fullname3 pPerl->Perl_gv_fullname3
#undef gv_fullname3
-#define gv_fullname3 pPerl->Perl_gv_fullname3
+#define gv_fullname3 Perl_gv_fullname3
+#undef Perl_gv_init
+#define Perl_gv_init pPerl->Perl_gv_init
#undef gv_init
-#define gv_init pPerl->Perl_gv_init
+#define gv_init Perl_gv_init
+#undef Perl_gv_stashpv
+#define Perl_gv_stashpv pPerl->Perl_gv_stashpv
#undef gv_stashpv
-#define gv_stashpv pPerl->Perl_gv_stashpv
+#define gv_stashpv Perl_gv_stashpv
+#undef Perl_gv_stashpvn
+#define Perl_gv_stashpvn pPerl->Perl_gv_stashpvn
#undef gv_stashpvn
-#define gv_stashpvn pPerl->Perl_gv_stashpvn
+#define gv_stashpvn Perl_gv_stashpvn
+#undef Perl_gv_stashsv
+#define Perl_gv_stashsv pPerl->Perl_gv_stashsv
#undef gv_stashsv
-#define gv_stashsv pPerl->Perl_gv_stashsv
-#undef he_delayfree
-#define he_delayfree pPerl->Perl_he_delayfree
-#undef he_free
-#define he_free pPerl->Perl_he_free
-#undef hoistmust
-#define hoistmust pPerl->Perl_hoistmust
+#define gv_stashsv Perl_gv_stashsv
+#undef Perl_hv_clear
+#define Perl_hv_clear pPerl->Perl_hv_clear
#undef hv_clear
-#define hv_clear pPerl->Perl_hv_clear
+#define hv_clear Perl_hv_clear
+#undef Perl_hv_delayfree_ent
+#define Perl_hv_delayfree_ent pPerl->Perl_hv_delayfree_ent
#undef hv_delayfree_ent
-#define hv_delayfree_ent pPerl->Perl_hv_delayfree_ent
+#define hv_delayfree_ent Perl_hv_delayfree_ent
+#undef Perl_hv_delete
+#define Perl_hv_delete pPerl->Perl_hv_delete
#undef hv_delete
-#define hv_delete pPerl->Perl_hv_delete
+#define hv_delete Perl_hv_delete
+#undef Perl_hv_delete_ent
+#define Perl_hv_delete_ent pPerl->Perl_hv_delete_ent
#undef hv_delete_ent
-#define hv_delete_ent pPerl->Perl_hv_delete_ent
+#define hv_delete_ent Perl_hv_delete_ent
+#undef Perl_hv_exists
+#define Perl_hv_exists pPerl->Perl_hv_exists
#undef hv_exists
-#define hv_exists pPerl->Perl_hv_exists
+#define hv_exists Perl_hv_exists
+#undef Perl_hv_exists_ent
+#define Perl_hv_exists_ent pPerl->Perl_hv_exists_ent
#undef hv_exists_ent
-#define hv_exists_ent pPerl->Perl_hv_exists_ent
+#define hv_exists_ent Perl_hv_exists_ent
+#undef Perl_hv_fetch
+#define Perl_hv_fetch pPerl->Perl_hv_fetch
#undef hv_fetch
-#define hv_fetch pPerl->Perl_hv_fetch
+#define hv_fetch Perl_hv_fetch
+#undef Perl_hv_fetch_ent
+#define Perl_hv_fetch_ent pPerl->Perl_hv_fetch_ent
#undef hv_fetch_ent
-#define hv_fetch_ent pPerl->Perl_hv_fetch_ent
+#define hv_fetch_ent Perl_hv_fetch_ent
+#undef Perl_hv_free_ent
+#define Perl_hv_free_ent pPerl->Perl_hv_free_ent
#undef hv_free_ent
-#define hv_free_ent pPerl->Perl_hv_free_ent
+#define hv_free_ent Perl_hv_free_ent
+#undef Perl_hv_iterinit
+#define Perl_hv_iterinit pPerl->Perl_hv_iterinit
#undef hv_iterinit
-#define hv_iterinit pPerl->Perl_hv_iterinit
+#define hv_iterinit Perl_hv_iterinit
+#undef Perl_hv_iterkey
+#define Perl_hv_iterkey pPerl->Perl_hv_iterkey
#undef hv_iterkey
-#define hv_iterkey pPerl->Perl_hv_iterkey
+#define hv_iterkey Perl_hv_iterkey
+#undef Perl_hv_iterkeysv
+#define Perl_hv_iterkeysv pPerl->Perl_hv_iterkeysv
#undef hv_iterkeysv
-#define hv_iterkeysv pPerl->Perl_hv_iterkeysv
+#define hv_iterkeysv Perl_hv_iterkeysv
+#undef Perl_hv_iternext
+#define Perl_hv_iternext pPerl->Perl_hv_iternext
#undef hv_iternext
-#define hv_iternext pPerl->Perl_hv_iternext
+#define hv_iternext Perl_hv_iternext
+#undef Perl_hv_iternextsv
+#define Perl_hv_iternextsv pPerl->Perl_hv_iternextsv
#undef hv_iternextsv
-#define hv_iternextsv pPerl->Perl_hv_iternextsv
+#define hv_iternextsv Perl_hv_iternextsv
+#undef Perl_hv_iterval
+#define Perl_hv_iterval pPerl->Perl_hv_iterval
#undef hv_iterval
-#define hv_iterval pPerl->Perl_hv_iterval
+#define hv_iterval Perl_hv_iterval
+#undef Perl_hv_ksplit
+#define Perl_hv_ksplit pPerl->Perl_hv_ksplit
#undef hv_ksplit
-#define hv_ksplit pPerl->Perl_hv_ksplit
+#define hv_ksplit Perl_hv_ksplit
+#undef Perl_hv_magic
+#define Perl_hv_magic pPerl->Perl_hv_magic
#undef hv_magic
-#define hv_magic pPerl->Perl_hv_magic
+#define hv_magic Perl_hv_magic
+#undef Perl_hv_store
+#define Perl_hv_store pPerl->Perl_hv_store
#undef hv_store
-#define hv_store pPerl->Perl_hv_store
+#define hv_store Perl_hv_store
+#undef Perl_hv_store_ent
+#define Perl_hv_store_ent pPerl->Perl_hv_store_ent
#undef hv_store_ent
-#define hv_store_ent pPerl->Perl_hv_store_ent
+#define hv_store_ent Perl_hv_store_ent
+#undef Perl_hv_undef
+#define Perl_hv_undef pPerl->Perl_hv_undef
#undef hv_undef
-#define hv_undef pPerl->Perl_hv_undef
+#define hv_undef Perl_hv_undef
+#undef Perl_ibcmp
+#define Perl_ibcmp pPerl->Perl_ibcmp
#undef ibcmp
-#define ibcmp pPerl->Perl_ibcmp
+#define ibcmp Perl_ibcmp
+#undef Perl_ibcmp_locale
+#define Perl_ibcmp_locale pPerl->Perl_ibcmp_locale
#undef ibcmp_locale
-#define ibcmp_locale pPerl->Perl_ibcmp_locale
-#undef incpush
-#define incpush pPerl->incpush
-#undef incline
-#define incline pPerl->incline
-#undef incl_perldb
-#define incl_perldb pPerl->incl_perldb
-#undef ingroup
-#define ingroup pPerl->Perl_ingroup
+#define ibcmp_locale Perl_ibcmp_locale
+#undef Perl_init_stacks
+#define Perl_init_stacks pPerl->Perl_init_stacks
#undef init_stacks
-#define init_stacks pPerl->Perl_init_stacks
+#define init_stacks Perl_init_stacks
+#undef Perl_instr
+#define Perl_instr pPerl->Perl_instr
#undef instr
-#define instr pPerl->Perl_instr
-#undef intro_my
-#define intro_my pPerl->Perl_intro_my
-#undef intuit_method
-#define intuit_method pPerl->intuit_method
-#undef intuit_more
-#define intuit_more pPerl->Perl_intuit_more
-#undef invert
-#define invert pPerl->Perl_invert
-#undef io_close
-#define io_close pPerl->Perl_io_close
-#undef ioctl
-#define ioctl pPerl->ioctl
-#undef jmaybe
-#define jmaybe pPerl->Perl_jmaybe
-#undef keyword
-#define keyword pPerl->Perl_keyword
+#define instr Perl_instr
+#undef Perl_is_uni_alnum
+#define Perl_is_uni_alnum pPerl->Perl_is_uni_alnum
+#undef is_uni_alnum
+#define is_uni_alnum Perl_is_uni_alnum
+#undef Perl_is_uni_alnumc
+#define Perl_is_uni_alnumc pPerl->Perl_is_uni_alnumc
+#undef is_uni_alnumc
+#define is_uni_alnumc Perl_is_uni_alnumc
+#undef Perl_is_uni_idfirst
+#define Perl_is_uni_idfirst pPerl->Perl_is_uni_idfirst
+#undef is_uni_idfirst
+#define is_uni_idfirst Perl_is_uni_idfirst
+#undef Perl_is_uni_alpha
+#define Perl_is_uni_alpha pPerl->Perl_is_uni_alpha
+#undef is_uni_alpha
+#define is_uni_alpha Perl_is_uni_alpha
+#undef Perl_is_uni_ascii
+#define Perl_is_uni_ascii pPerl->Perl_is_uni_ascii
+#undef is_uni_ascii
+#define is_uni_ascii Perl_is_uni_ascii
+#undef Perl_is_uni_space
+#define Perl_is_uni_space pPerl->Perl_is_uni_space
+#undef is_uni_space
+#define is_uni_space Perl_is_uni_space
+#undef Perl_is_uni_cntrl
+#define Perl_is_uni_cntrl pPerl->Perl_is_uni_cntrl
+#undef is_uni_cntrl
+#define is_uni_cntrl Perl_is_uni_cntrl
+#undef Perl_is_uni_graph
+#define Perl_is_uni_graph pPerl->Perl_is_uni_graph
+#undef is_uni_graph
+#define is_uni_graph Perl_is_uni_graph
+#undef Perl_is_uni_digit
+#define Perl_is_uni_digit pPerl->Perl_is_uni_digit
+#undef is_uni_digit
+#define is_uni_digit Perl_is_uni_digit
+#undef Perl_is_uni_upper
+#define Perl_is_uni_upper pPerl->Perl_is_uni_upper
+#undef is_uni_upper
+#define is_uni_upper Perl_is_uni_upper
+#undef Perl_is_uni_lower
+#define Perl_is_uni_lower pPerl->Perl_is_uni_lower
+#undef is_uni_lower
+#define is_uni_lower Perl_is_uni_lower
+#undef Perl_is_uni_print
+#define Perl_is_uni_print pPerl->Perl_is_uni_print
+#undef is_uni_print
+#define is_uni_print Perl_is_uni_print
+#undef Perl_is_uni_punct
+#define Perl_is_uni_punct pPerl->Perl_is_uni_punct
+#undef is_uni_punct
+#define is_uni_punct Perl_is_uni_punct
+#undef Perl_is_uni_xdigit
+#define Perl_is_uni_xdigit pPerl->Perl_is_uni_xdigit
+#undef is_uni_xdigit
+#define is_uni_xdigit Perl_is_uni_xdigit
+#undef Perl_to_uni_upper
+#define Perl_to_uni_upper pPerl->Perl_to_uni_upper
+#undef to_uni_upper
+#define to_uni_upper Perl_to_uni_upper
+#undef Perl_to_uni_title
+#define Perl_to_uni_title pPerl->Perl_to_uni_title
+#undef to_uni_title
+#define to_uni_title Perl_to_uni_title
+#undef Perl_to_uni_lower
+#define Perl_to_uni_lower pPerl->Perl_to_uni_lower
+#undef to_uni_lower
+#define to_uni_lower Perl_to_uni_lower
+#undef Perl_is_uni_alnum_lc
+#define Perl_is_uni_alnum_lc pPerl->Perl_is_uni_alnum_lc
+#undef is_uni_alnum_lc
+#define is_uni_alnum_lc Perl_is_uni_alnum_lc
+#undef Perl_is_uni_alnumc_lc
+#define Perl_is_uni_alnumc_lc pPerl->Perl_is_uni_alnumc_lc
+#undef is_uni_alnumc_lc
+#define is_uni_alnumc_lc Perl_is_uni_alnumc_lc
+#undef Perl_is_uni_idfirst_lc
+#define Perl_is_uni_idfirst_lc pPerl->Perl_is_uni_idfirst_lc
+#undef is_uni_idfirst_lc
+#define is_uni_idfirst_lc Perl_is_uni_idfirst_lc
+#undef Perl_is_uni_alpha_lc
+#define Perl_is_uni_alpha_lc pPerl->Perl_is_uni_alpha_lc
+#undef is_uni_alpha_lc
+#define is_uni_alpha_lc Perl_is_uni_alpha_lc
+#undef Perl_is_uni_ascii_lc
+#define Perl_is_uni_ascii_lc pPerl->Perl_is_uni_ascii_lc
+#undef is_uni_ascii_lc
+#define is_uni_ascii_lc Perl_is_uni_ascii_lc
+#undef Perl_is_uni_space_lc
+#define Perl_is_uni_space_lc pPerl->Perl_is_uni_space_lc
+#undef is_uni_space_lc
+#define is_uni_space_lc Perl_is_uni_space_lc
+#undef Perl_is_uni_cntrl_lc
+#define Perl_is_uni_cntrl_lc pPerl->Perl_is_uni_cntrl_lc
+#undef is_uni_cntrl_lc
+#define is_uni_cntrl_lc Perl_is_uni_cntrl_lc
+#undef Perl_is_uni_graph_lc
+#define Perl_is_uni_graph_lc pPerl->Perl_is_uni_graph_lc
+#undef is_uni_graph_lc
+#define is_uni_graph_lc Perl_is_uni_graph_lc
+#undef Perl_is_uni_digit_lc
+#define Perl_is_uni_digit_lc pPerl->Perl_is_uni_digit_lc
+#undef is_uni_digit_lc
+#define is_uni_digit_lc Perl_is_uni_digit_lc
+#undef Perl_is_uni_upper_lc
+#define Perl_is_uni_upper_lc pPerl->Perl_is_uni_upper_lc
+#undef is_uni_upper_lc
+#define is_uni_upper_lc Perl_is_uni_upper_lc
+#undef Perl_is_uni_lower_lc
+#define Perl_is_uni_lower_lc pPerl->Perl_is_uni_lower_lc
+#undef is_uni_lower_lc
+#define is_uni_lower_lc Perl_is_uni_lower_lc
+#undef Perl_is_uni_print_lc
+#define Perl_is_uni_print_lc pPerl->Perl_is_uni_print_lc
+#undef is_uni_print_lc
+#define is_uni_print_lc Perl_is_uni_print_lc
+#undef Perl_is_uni_punct_lc
+#define Perl_is_uni_punct_lc pPerl->Perl_is_uni_punct_lc
+#undef is_uni_punct_lc
+#define is_uni_punct_lc Perl_is_uni_punct_lc
+#undef Perl_is_uni_xdigit_lc
+#define Perl_is_uni_xdigit_lc pPerl->Perl_is_uni_xdigit_lc
+#undef is_uni_xdigit_lc
+#define is_uni_xdigit_lc Perl_is_uni_xdigit_lc
+#undef Perl_to_uni_upper_lc
+#define Perl_to_uni_upper_lc pPerl->Perl_to_uni_upper_lc
+#undef to_uni_upper_lc
+#define to_uni_upper_lc Perl_to_uni_upper_lc
+#undef Perl_to_uni_title_lc
+#define Perl_to_uni_title_lc pPerl->Perl_to_uni_title_lc
+#undef to_uni_title_lc
+#define to_uni_title_lc Perl_to_uni_title_lc
+#undef Perl_to_uni_lower_lc
+#define Perl_to_uni_lower_lc pPerl->Perl_to_uni_lower_lc
+#undef to_uni_lower_lc
+#define to_uni_lower_lc Perl_to_uni_lower_lc
+#undef Perl_is_utf8_char
+#define Perl_is_utf8_char pPerl->Perl_is_utf8_char
+#undef is_utf8_char
+#define is_utf8_char Perl_is_utf8_char
+#undef Perl_is_utf8_alnum
+#define Perl_is_utf8_alnum pPerl->Perl_is_utf8_alnum
+#undef is_utf8_alnum
+#define is_utf8_alnum Perl_is_utf8_alnum
+#undef Perl_is_utf8_alnumc
+#define Perl_is_utf8_alnumc pPerl->Perl_is_utf8_alnumc
+#undef is_utf8_alnumc
+#define is_utf8_alnumc Perl_is_utf8_alnumc
+#undef Perl_is_utf8_idfirst
+#define Perl_is_utf8_idfirst pPerl->Perl_is_utf8_idfirst
+#undef is_utf8_idfirst
+#define is_utf8_idfirst Perl_is_utf8_idfirst
+#undef Perl_is_utf8_alpha
+#define Perl_is_utf8_alpha pPerl->Perl_is_utf8_alpha
+#undef is_utf8_alpha
+#define is_utf8_alpha Perl_is_utf8_alpha
+#undef Perl_is_utf8_ascii
+#define Perl_is_utf8_ascii pPerl->Perl_is_utf8_ascii
+#undef is_utf8_ascii
+#define is_utf8_ascii Perl_is_utf8_ascii
+#undef Perl_is_utf8_space
+#define Perl_is_utf8_space pPerl->Perl_is_utf8_space
+#undef is_utf8_space
+#define is_utf8_space Perl_is_utf8_space
+#undef Perl_is_utf8_cntrl
+#define Perl_is_utf8_cntrl pPerl->Perl_is_utf8_cntrl
+#undef is_utf8_cntrl
+#define is_utf8_cntrl Perl_is_utf8_cntrl
+#undef Perl_is_utf8_digit
+#define Perl_is_utf8_digit pPerl->Perl_is_utf8_digit
+#undef is_utf8_digit
+#define is_utf8_digit Perl_is_utf8_digit
+#undef Perl_is_utf8_graph
+#define Perl_is_utf8_graph pPerl->Perl_is_utf8_graph
+#undef is_utf8_graph
+#define is_utf8_graph Perl_is_utf8_graph
+#undef Perl_is_utf8_upper
+#define Perl_is_utf8_upper pPerl->Perl_is_utf8_upper
+#undef is_utf8_upper
+#define is_utf8_upper Perl_is_utf8_upper
+#undef Perl_is_utf8_lower
+#define Perl_is_utf8_lower pPerl->Perl_is_utf8_lower
+#undef is_utf8_lower
+#define is_utf8_lower Perl_is_utf8_lower
+#undef Perl_is_utf8_print
+#define Perl_is_utf8_print pPerl->Perl_is_utf8_print
+#undef is_utf8_print
+#define is_utf8_print Perl_is_utf8_print
+#undef Perl_is_utf8_punct
+#define Perl_is_utf8_punct pPerl->Perl_is_utf8_punct
+#undef is_utf8_punct
+#define is_utf8_punct Perl_is_utf8_punct
+#undef Perl_is_utf8_xdigit
+#define Perl_is_utf8_xdigit pPerl->Perl_is_utf8_xdigit
+#undef is_utf8_xdigit
+#define is_utf8_xdigit Perl_is_utf8_xdigit
+#undef Perl_is_utf8_mark
+#define Perl_is_utf8_mark pPerl->Perl_is_utf8_mark
+#undef is_utf8_mark
+#define is_utf8_mark Perl_is_utf8_mark
+#undef Perl_leave_scope
+#define Perl_leave_scope pPerl->Perl_leave_scope
#undef leave_scope
-#define leave_scope pPerl->Perl_leave_scope
-#undef lex_end
-#define lex_end pPerl->Perl_lex_end
-#undef lex_start
-#define lex_start pPerl->Perl_lex_start
-#undef linklist
-#define linklist pPerl->Perl_linklist
-#undef list
-#define list pPerl->Perl_list
-#undef listkids
-#define listkids pPerl->Perl_listkids
-#undef lop
-#define lop pPerl->lop
-#undef localize
-#define localize pPerl->Perl_localize
+#define leave_scope Perl_leave_scope
+#undef Perl_load_module
+#define Perl_load_module pPerl->Perl_load_module
+#undef load_module
+#define load_module Perl_load_module
+#undef Perl_vload_module
+#define Perl_vload_module pPerl->Perl_vload_module
+#undef vload_module
+#define vload_module Perl_vload_module
+#undef Perl_looks_like_number
+#define Perl_looks_like_number pPerl->Perl_looks_like_number
#undef looks_like_number
-#define looks_like_number pPerl->Perl_looks_like_number
-#undef magic_clear_all_env
-#define magic_clear_all_env pPerl->Perl_magic_clear_all_env
-#undef magic_clearenv
-#define magic_clearenv pPerl->Perl_magic_clearenv
-#undef magic_clearpack
-#define magic_clearpack pPerl->Perl_magic_clearpack
-#undef magic_clearsig
-#define magic_clearsig pPerl->Perl_magic_clearsig
-#undef magic_existspack
-#define magic_existspack pPerl->Perl_magic_existspack
-#undef magic_freeregexp
-#define magic_freeregexp pPerl->Perl_magic_freeregexp
-#undef magic_get
-#define magic_get pPerl->Perl_magic_get
-#undef magic_getarylen
-#define magic_getarylen pPerl->Perl_magic_getarylen
-#undef magic_getdefelem
-#define magic_getdefelem pPerl->Perl_magic_getdefelem
-#undef magic_getpack
-#define magic_getpack pPerl->Perl_magic_getpack
-#undef magic_getglob
-#define magic_getglob pPerl->Perl_magic_getglob
-#undef magic_getnkeys
-#define magic_getnkeys pPerl->Perl_magic_getnkeys
-#undef magic_getpos
-#define magic_getpos pPerl->Perl_magic_getpos
-#undef magic_getsig
-#define magic_getsig pPerl->Perl_magic_getsig
-#undef magic_getsubstr
-#define magic_getsubstr pPerl->Perl_magic_getsubstr
-#undef magic_gettaint
-#define magic_gettaint pPerl->Perl_magic_gettaint
-#undef magic_getuvar
-#define magic_getuvar pPerl->Perl_magic_getuvar
-#undef magic_getvec
-#define magic_getvec pPerl->Perl_magic_getvec
-#undef magic_len
-#define magic_len pPerl->Perl_magic_len
-#undef magic_methpack
-#define magic_methpack pPerl->magic_methpack
-#undef magic_mutexfree
-#define magic_mutexfree pPerl->Perl_magic_mutexfree
-#undef magic_nextpack
-#define magic_nextpack pPerl->Perl_magic_nextpack
-#undef magic_set
-#define magic_set pPerl->Perl_magic_set
-#undef magic_set_all_env
-#define magic_set_all_env pPerl->Perl_magic_set_all_env
-#undef magic_setamagic
-#define magic_setamagic pPerl->Perl_magic_setamagic
-#undef magic_setarylen
-#define magic_setarylen pPerl->Perl_magic_setarylen
-#undef magic_setbm
-#define magic_setbm pPerl->Perl_magic_setbm
-#undef magic_setcollxfrm
-#define magic_setcollxfrm pPerl->Perl_magic_setcollxfrm
-#undef magic_setdbline
-#define magic_setdbline pPerl->Perl_magic_setdbline
-#undef magic_setdefelem
-#define magic_setdefelem pPerl->Perl_magic_setdefelem
-#undef magic_setenv
-#define magic_setenv pPerl->Perl_magic_setenv
-#undef magic_setfm
-#define magic_setfm pPerl->Perl_magic_setfm
-#undef magic_setisa
-#define magic_setisa pPerl->Perl_magic_setisa
-#undef magic_setglob
-#define magic_setglob pPerl->Perl_magic_setglob
-#undef magic_setmglob
-#define magic_setmglob pPerl->Perl_magic_setmglob
-#undef magic_setnkeys
-#define magic_setnkeys pPerl->Perl_magic_setnkeys
-#undef magic_setpack
-#define magic_setpack pPerl->Perl_magic_setpack
-#undef magic_setpos
-#define magic_setpos pPerl->Perl_magic_setpos
-#undef magic_setsig
-#define magic_setsig pPerl->Perl_magic_setsig
-#undef magic_setsubstr
-#define magic_setsubstr pPerl->Perl_magic_setsubstr
-#undef magic_settaint
-#define magic_settaint pPerl->Perl_magic_settaint
-#undef magic_setuvar
-#define magic_setuvar pPerl->Perl_magic_setuvar
-#undef magic_setvec
-#define magic_setvec pPerl->Perl_magic_setvec
-#undef magic_sizepack
-#define magic_sizepack pPerl->Perl_magic_sizepack
-#undef magic_unchain
-#define magic_unchain pPerl->Perl_magic_unchain
-#undef magic_wipepack
-#define magic_wipepack pPerl->Perl_magic_wipepack
-#undef magicname
-#define magicname pPerl->Perl_magicname
-#undef malloced_size
-#define malloced_size pPerl->Perl_malloced_size
+#define looks_like_number Perl_looks_like_number
+#if defined(USE_THREADS)
+#endif
+#if defined(USE_LOCALE_COLLATE)
+#endif
+#undef Perl_markstack_grow
+#define Perl_markstack_grow pPerl->Perl_markstack_grow
#undef markstack_grow
-#define markstack_grow pPerl->Perl_markstack_grow
-#undef mem_collxfrm
-#define mem_collxfrm pPerl->Perl_mem_collxfrm
+#define markstack_grow Perl_markstack_grow
+#if defined(USE_LOCALE_COLLATE)
+#endif
+#undef Perl_mess
+#define Perl_mess pPerl->Perl_mess
#undef mess
-#define mess pPerl->Perl_mess
+#define mess Perl_mess
+#undef Perl_vmess
+#define Perl_vmess pPerl->Perl_vmess
+#undef vmess
+#define vmess Perl_vmess
+#undef Perl_mg_clear
+#define Perl_mg_clear pPerl->Perl_mg_clear
#undef mg_clear
-#define mg_clear pPerl->Perl_mg_clear
+#define mg_clear Perl_mg_clear
+#undef Perl_mg_copy
+#define Perl_mg_copy pPerl->Perl_mg_copy
#undef mg_copy
-#define mg_copy pPerl->Perl_mg_copy
+#define mg_copy Perl_mg_copy
+#undef Perl_mg_find
+#define Perl_mg_find pPerl->Perl_mg_find
#undef mg_find
-#define mg_find pPerl->Perl_mg_find
+#define mg_find Perl_mg_find
+#undef Perl_mg_free
+#define Perl_mg_free pPerl->Perl_mg_free
#undef mg_free
-#define mg_free pPerl->Perl_mg_free
+#define mg_free Perl_mg_free
+#undef Perl_mg_get
+#define Perl_mg_get pPerl->Perl_mg_get
#undef mg_get
-#define mg_get pPerl->Perl_mg_get
-#undef mg_magical
-#define mg_magical pPerl->Perl_mg_magical
+#define mg_get Perl_mg_get
+#undef Perl_mg_length
+#define Perl_mg_length pPerl->Perl_mg_length
#undef mg_length
-#define mg_length pPerl->Perl_mg_length
+#define mg_length Perl_mg_length
+#undef Perl_mg_magical
+#define Perl_mg_magical pPerl->Perl_mg_magical
+#undef mg_magical
+#define mg_magical Perl_mg_magical
+#undef Perl_mg_set
+#define Perl_mg_set pPerl->Perl_mg_set
#undef mg_set
-#define mg_set pPerl->Perl_mg_set
+#define mg_set Perl_mg_set
+#undef Perl_mg_size
+#define Perl_mg_size pPerl->Perl_mg_size
#undef mg_size
-#define mg_size pPerl->Perl_mg_size
-#undef missingterm
-#define missingterm pPerl->missingterm
-#undef mod
-#define mod pPerl->Perl_mod
-#undef modkids
-#define modkids pPerl->Perl_modkids
+#define mg_size Perl_mg_size
+#undef Perl_moreswitches
+#define Perl_moreswitches pPerl->Perl_moreswitches
#undef moreswitches
-#define moreswitches pPerl->Perl_moreswitches
-#undef more_sv
-#define more_sv pPerl->more_sv
-#undef more_xiv
-#define more_xiv pPerl->more_xiv
-#undef more_xnv
-#define more_xnv pPerl->more_xnv
-#undef more_xpv
-#define more_xpv pPerl->more_xpv
-#undef more_xrv
-#define more_xrv pPerl->more_xrv
-#undef my
-#define my pPerl->Perl_my
+#define moreswitches Perl_moreswitches
+#undef Perl_my_atof
+#define Perl_my_atof pPerl->Perl_my_atof
+#undef my_atof
+#define my_atof Perl_my_atof
+#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
+#undef Perl_my_bcopy
+#define Perl_my_bcopy pPerl->Perl_my_bcopy
#undef my_bcopy
-#define my_bcopy pPerl->Perl_my_bcopy
+#define my_bcopy Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+#undef Perl_my_bzero
+#define Perl_my_bzero pPerl->Perl_my_bzero
#undef my_bzero
-#define my_bzero pPerl->Perl_my_bzero
-#undef my_chsize
-#define my_chsize pPerl->Perl_my_chsize
+#define my_bzero Perl_my_bzero
+#endif
+#undef Perl_my_exit
+#define Perl_my_exit pPerl->Perl_my_exit
#undef my_exit
-#define my_exit pPerl->Perl_my_exit
+#define my_exit Perl_my_exit
+#undef Perl_my_failure_exit
+#define Perl_my_failure_exit pPerl->Perl_my_failure_exit
#undef my_failure_exit
-#define my_failure_exit pPerl->Perl_my_failure_exit
-#undef my_htonl
-#define my_htonl pPerl->Perl_my_htonl
+#define my_failure_exit Perl_my_failure_exit
+#undef Perl_my_fflush_all
+#define Perl_my_fflush_all pPerl->Perl_my_fflush_all
+#undef my_fflush_all
+#define my_fflush_all Perl_my_fflush_all
+#undef Perl_my_lstat
+#define Perl_my_lstat pPerl->Perl_my_lstat
#undef my_lstat
-#define my_lstat pPerl->Perl_my_lstat
+#define my_lstat Perl_my_lstat
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+#undef Perl_my_memcmp
+#define Perl_my_memcmp pPerl->Perl_my_memcmp
#undef my_memcmp
-#define my_memcmp pPerl->my_memcmp
-#undef my_ntohl
-#define my_ntohl pPerl->Perl_my_ntohl
+#define my_memcmp Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
+#undef Perl_my_memset
+#define Perl_my_memset pPerl->Perl_my_memset
+#undef my_memset
+#define my_memset Perl_my_memset
+#endif
+#if !defined(PERL_OBJECT)
+#undef Perl_my_pclose
+#define Perl_my_pclose pPerl->Perl_my_pclose
#undef my_pclose
-#define my_pclose pPerl->Perl_my_pclose
+#define my_pclose Perl_my_pclose
+#undef Perl_my_popen
+#define Perl_my_popen pPerl->Perl_my_popen
#undef my_popen
-#define my_popen pPerl->Perl_my_popen
+#define my_popen Perl_my_popen
+#endif
+#undef Perl_my_setenv
+#define Perl_my_setenv pPerl->Perl_my_setenv
#undef my_setenv
-#define my_setenv pPerl->Perl_my_setenv
+#define my_setenv Perl_my_setenv
+#undef Perl_my_stat
+#define Perl_my_stat pPerl->Perl_my_stat
#undef my_stat
-#define my_stat pPerl->Perl_my_stat
+#define my_stat Perl_my_stat
+#if defined(MYSWAP)
+#undef Perl_my_swap
+#define Perl_my_swap pPerl->Perl_my_swap
#undef my_swap
-#define my_swap pPerl->Perl_my_swap
-#undef my_unexec
-#define my_unexec pPerl->Perl_my_unexec
+#define my_swap Perl_my_swap
+#undef Perl_my_htonl
+#define Perl_my_htonl pPerl->Perl_my_htonl
+#undef my_htonl
+#define my_htonl Perl_my_htonl
+#undef Perl_my_ntohl
+#define Perl_my_ntohl pPerl->Perl_my_ntohl
+#undef my_ntohl
+#define my_ntohl Perl_my_ntohl
+#endif
+#undef Perl_newANONLIST
+#define Perl_newANONLIST pPerl->Perl_newANONLIST
#undef newANONLIST
-#define newANONLIST pPerl->Perl_newANONLIST
+#define newANONLIST Perl_newANONLIST
+#undef Perl_newANONHASH
+#define Perl_newANONHASH pPerl->Perl_newANONHASH
#undef newANONHASH
-#define newANONHASH pPerl->Perl_newANONHASH
+#define newANONHASH Perl_newANONHASH
+#undef Perl_newANONSUB
+#define Perl_newANONSUB pPerl->Perl_newANONSUB
#undef newANONSUB
-#define newANONSUB pPerl->Perl_newANONSUB
+#define newANONSUB Perl_newANONSUB
+#undef Perl_newASSIGNOP
+#define Perl_newASSIGNOP pPerl->Perl_newASSIGNOP
#undef newASSIGNOP
-#define newASSIGNOP pPerl->Perl_newASSIGNOP
+#define newASSIGNOP Perl_newASSIGNOP
+#undef Perl_newCONDOP
+#define Perl_newCONDOP pPerl->Perl_newCONDOP
#undef newCONDOP
-#define newCONDOP pPerl->Perl_newCONDOP
+#define newCONDOP Perl_newCONDOP
+#undef Perl_newCONSTSUB
+#define Perl_newCONSTSUB pPerl->Perl_newCONSTSUB
#undef newCONSTSUB
-#define newCONSTSUB pPerl->Perl_newCONSTSUB
+#define newCONSTSUB Perl_newCONSTSUB
+#undef Perl_newFORM
+#define Perl_newFORM pPerl->Perl_newFORM
#undef newFORM
-#define newFORM pPerl->Perl_newFORM
+#define newFORM Perl_newFORM
+#undef Perl_newFOROP
+#define Perl_newFOROP pPerl->Perl_newFOROP
#undef newFOROP
-#define newFOROP pPerl->Perl_newFOROP
+#define newFOROP Perl_newFOROP
+#undef Perl_newLOGOP
+#define Perl_newLOGOP pPerl->Perl_newLOGOP
#undef newLOGOP
-#define newLOGOP pPerl->Perl_newLOGOP
+#define newLOGOP Perl_newLOGOP
+#undef Perl_newLOOPEX
+#define Perl_newLOOPEX pPerl->Perl_newLOOPEX
#undef newLOOPEX
-#define newLOOPEX pPerl->Perl_newLOOPEX
+#define newLOOPEX Perl_newLOOPEX
+#undef Perl_newLOOPOP
+#define Perl_newLOOPOP pPerl->Perl_newLOOPOP
#undef newLOOPOP
-#define newLOOPOP pPerl->Perl_newLOOPOP
-#undef newMETHOD
-#define newMETHOD pPerl->Perl_newMETHOD
+#define newLOOPOP Perl_newLOOPOP
+#undef Perl_newNULLLIST
+#define Perl_newNULLLIST pPerl->Perl_newNULLLIST
#undef newNULLLIST
-#define newNULLLIST pPerl->Perl_newNULLLIST
+#define newNULLLIST Perl_newNULLLIST
+#undef Perl_newOP
+#define Perl_newOP pPerl->Perl_newOP
#undef newOP
-#define newOP pPerl->Perl_newOP
+#define newOP Perl_newOP
+#undef Perl_newPROG
+#define Perl_newPROG pPerl->Perl_newPROG
#undef newPROG
-#define newPROG pPerl->Perl_newPROG
+#define newPROG Perl_newPROG
+#undef Perl_newRANGE
+#define Perl_newRANGE pPerl->Perl_newRANGE
#undef newRANGE
-#define newRANGE pPerl->Perl_newRANGE
+#define newRANGE Perl_newRANGE
+#undef Perl_newSLICEOP
+#define Perl_newSLICEOP pPerl->Perl_newSLICEOP
#undef newSLICEOP
-#define newSLICEOP pPerl->Perl_newSLICEOP
+#define newSLICEOP Perl_newSLICEOP
+#undef Perl_newSTATEOP
+#define Perl_newSTATEOP pPerl->Perl_newSTATEOP
#undef newSTATEOP
-#define newSTATEOP pPerl->Perl_newSTATEOP
+#define newSTATEOP Perl_newSTATEOP
+#undef Perl_newSUB
+#define Perl_newSUB pPerl->Perl_newSUB
#undef newSUB
-#define newSUB pPerl->Perl_newSUB
+#define newSUB Perl_newSUB
+#undef Perl_newXS
+#define Perl_newXS pPerl->Perl_newXS
#undef newXS
-#define newXS pPerl->Perl_newXS
+#define newXS Perl_newXS
+#undef Perl_newAV
+#define Perl_newAV pPerl->Perl_newAV
#undef newAV
-#define newAV pPerl->Perl_newAV
+#define newAV Perl_newAV
+#undef Perl_newAVREF
+#define Perl_newAVREF pPerl->Perl_newAVREF
#undef newAVREF
-#define newAVREF pPerl->Perl_newAVREF
+#define newAVREF Perl_newAVREF
+#undef Perl_newBINOP
+#define Perl_newBINOP pPerl->Perl_newBINOP
#undef newBINOP
-#define newBINOP pPerl->Perl_newBINOP
+#define newBINOP Perl_newBINOP
+#undef Perl_newCVREF
+#define Perl_newCVREF pPerl->Perl_newCVREF
#undef newCVREF
-#define newCVREF pPerl->Perl_newCVREF
-#undef newCVOP
-#define newCVOP pPerl->Perl_newCVOP
+#define newCVREF Perl_newCVREF
+#undef Perl_newGVOP
+#define Perl_newGVOP pPerl->Perl_newGVOP
#undef newGVOP
-#define newGVOP pPerl->Perl_newGVOP
+#define newGVOP Perl_newGVOP
+#undef Perl_newGVgen
+#define Perl_newGVgen pPerl->Perl_newGVgen
#undef newGVgen
-#define newGVgen pPerl->Perl_newGVgen
+#define newGVgen Perl_newGVgen
+#undef Perl_newGVREF
+#define Perl_newGVREF pPerl->Perl_newGVREF
#undef newGVREF
-#define newGVREF pPerl->Perl_newGVREF
+#define newGVREF Perl_newGVREF
+#undef Perl_newHVREF
+#define Perl_newHVREF pPerl->Perl_newHVREF
#undef newHVREF
-#define newHVREF pPerl->Perl_newHVREF
+#define newHVREF Perl_newHVREF
+#undef Perl_newHV
+#define Perl_newHV pPerl->Perl_newHV
#undef newHV
-#define newHV pPerl->Perl_newHV
+#define newHV Perl_newHV
+#undef Perl_newHVhv
+#define Perl_newHVhv pPerl->Perl_newHVhv
#undef newHVhv
-#define newHVhv pPerl->Perl_newHVhv
+#define newHVhv Perl_newHVhv
+#undef Perl_newIO
+#define Perl_newIO pPerl->Perl_newIO
#undef newIO
-#define newIO pPerl->Perl_newIO
+#define newIO Perl_newIO
+#undef Perl_newLISTOP
+#define Perl_newLISTOP pPerl->Perl_newLISTOP
#undef newLISTOP
-#define newLISTOP pPerl->Perl_newLISTOP
+#define newLISTOP Perl_newLISTOP
+#undef Perl_newPADOP
+#define Perl_newPADOP pPerl->Perl_newPADOP
+#undef newPADOP
+#define newPADOP Perl_newPADOP
+#undef Perl_newPMOP
+#define Perl_newPMOP pPerl->Perl_newPMOP
#undef newPMOP
-#define newPMOP pPerl->Perl_newPMOP
+#define newPMOP Perl_newPMOP
+#undef Perl_newPVOP
+#define Perl_newPVOP pPerl->Perl_newPVOP
#undef newPVOP
-#define newPVOP pPerl->Perl_newPVOP
+#define newPVOP Perl_newPVOP
+#undef Perl_newRV
+#define Perl_newRV pPerl->Perl_newRV
#undef newRV
-#define newRV pPerl->Perl_newRV
-#undef newRV_noinc
+#define newRV Perl_newRV
#undef Perl_newRV_noinc
-#define newRV_noinc pPerl->Perl_newRV_noinc
+#define Perl_newRV_noinc pPerl->Perl_newRV_noinc
+#undef newRV_noinc
+#define newRV_noinc Perl_newRV_noinc
+#undef Perl_newSV
+#define Perl_newSV pPerl->Perl_newSV
#undef newSV
-#define newSV pPerl->Perl_newSV
+#define newSV Perl_newSV
+#undef Perl_newSVREF
+#define Perl_newSVREF pPerl->Perl_newSVREF
#undef newSVREF
-#define newSVREF pPerl->Perl_newSVREF
+#define newSVREF Perl_newSVREF
+#undef Perl_newSVOP
+#define Perl_newSVOP pPerl->Perl_newSVOP
#undef newSVOP
-#define newSVOP pPerl->Perl_newSVOP
+#define newSVOP Perl_newSVOP
+#undef Perl_newSViv
+#define Perl_newSViv pPerl->Perl_newSViv
#undef newSViv
-#define newSViv pPerl->Perl_newSViv
+#define newSViv Perl_newSViv
+#undef Perl_newSVuv
+#define Perl_newSVuv pPerl->Perl_newSVuv
+#undef newSVuv
+#define newSVuv Perl_newSVuv
+#undef Perl_newSVnv
+#define Perl_newSVnv pPerl->Perl_newSVnv
#undef newSVnv
-#define newSVnv pPerl->Perl_newSVnv
+#define newSVnv Perl_newSVnv
+#undef Perl_newSVpv
+#define Perl_newSVpv pPerl->Perl_newSVpv
#undef newSVpv
-#define newSVpv pPerl->Perl_newSVpv
-#undef newSVpvf
-#define newSVpvf pPerl->Perl_newSVpvf
+#define newSVpv Perl_newSVpv
+#undef Perl_newSVpvn
+#define Perl_newSVpvn pPerl->Perl_newSVpvn
#undef newSVpvn
-#define newSVpvn pPerl->Perl_newSVpvn
+#define newSVpvn Perl_newSVpvn
+#undef Perl_newSVpvf
+#define Perl_newSVpvf pPerl->Perl_newSVpvf
+#undef newSVpvf
+#define newSVpvf Perl_newSVpvf
+#undef Perl_vnewSVpvf
+#define Perl_vnewSVpvf pPerl->Perl_vnewSVpvf
+#undef vnewSVpvf
+#define vnewSVpvf Perl_vnewSVpvf
+#undef Perl_newSVrv
+#define Perl_newSVrv pPerl->Perl_newSVrv
#undef newSVrv
-#define newSVrv pPerl->Perl_newSVrv
+#define newSVrv Perl_newSVrv
+#undef Perl_newSVsv
+#define Perl_newSVsv pPerl->Perl_newSVsv
#undef newSVsv
-#define newSVsv pPerl->Perl_newSVsv
+#define newSVsv Perl_newSVsv
+#undef Perl_newUNOP
+#define Perl_newUNOP pPerl->Perl_newUNOP
#undef newUNOP
-#define newUNOP pPerl->Perl_newUNOP
+#define newUNOP Perl_newUNOP
+#undef Perl_newWHILEOP
+#define Perl_newWHILEOP pPerl->Perl_newWHILEOP
#undef newWHILEOP
-#define newWHILEOP pPerl->Perl_newWHILEOP
-#undef new_struct_thread
-#define new_struct_thread pPerl->Perl_new_struct_thread
+#define newWHILEOP Perl_newWHILEOP
+#undef Perl_new_stackinfo
+#define Perl_new_stackinfo pPerl->Perl_new_stackinfo
#undef new_stackinfo
-#define new_stackinfo pPerl->Perl_new_stackinfo
-#undef new_sv
-#define new_sv pPerl->new_sv
-#undef new_xnv
-#define new_xnv pPerl->new_xnv
-#undef new_xpv
-#define new_xpv pPerl->new_xpv
-#undef nextargv
-#define nextargv pPerl->Perl_nextargv
-#undef nextchar
-#define nextchar pPerl->nextchar
+#define new_stackinfo Perl_new_stackinfo
+#undef Perl_ninstr
+#define Perl_ninstr pPerl->Perl_ninstr
#undef ninstr
-#define ninstr pPerl->Perl_ninstr
-#undef no_fh_allowed
-#define no_fh_allowed pPerl->Perl_no_fh_allowed
-#undef no_op
-#define no_op pPerl->Perl_no_op
-#undef package
-#define package pPerl->Perl_package
-#undef pad_alloc
-#define pad_alloc pPerl->Perl_pad_alloc
-#undef pad_allocmy
-#define pad_allocmy pPerl->Perl_pad_allocmy
-#undef pad_findmy
-#define pad_findmy pPerl->Perl_pad_findmy
-#undef op_const_sv
-#define op_const_sv pPerl->Perl_op_const_sv
+#define ninstr Perl_ninstr
+#undef Perl_op_free
+#define Perl_op_free pPerl->Perl_op_free
#undef op_free
-#define op_free pPerl->Perl_op_free
-#undef oopsCV
-#define oopsCV pPerl->Perl_oopsCV
-#undef oopsAV
-#define oopsAV pPerl->Perl_oopsAV
-#undef oopsHV
-#define oopsHV pPerl->Perl_oopsHV
-#undef opendir
-#define opendir pPerl->opendir
-#undef pad_leavemy
-#define pad_leavemy pPerl->Perl_pad_leavemy
+#define op_free Perl_op_free
+#undef Perl_pad_sv
+#define Perl_pad_sv pPerl->Perl_pad_sv
#undef pad_sv
-#define pad_sv pPerl->Perl_pad_sv
-#undef pad_findlex
-#define pad_findlex pPerl->pad_findlex
-#undef pad_free
-#define pad_free pPerl->Perl_pad_free
-#undef pad_reset
-#define pad_reset pPerl->Perl_pad_reset
-#undef pad_swipe
-#define pad_swipe pPerl->Perl_pad_swipe
-#undef peep
-#define peep pPerl->Perl_peep
-#undef perl_atexit
-#define perl_atexit pPerl->perl_atexit
-#undef perl_call_argv
-#define perl_call_argv pPerl->perl_call_argv
-#undef perl_call_method
-#define perl_call_method pPerl->perl_call_method
-#undef perl_call_pv
-#define perl_call_pv pPerl->perl_call_pv
-#undef perl_call_sv
-#define perl_call_sv pPerl->perl_call_sv
-#undef perl_callargv
-#define perl_callargv pPerl->perl_callargv
-#undef perl_callpv
-#define perl_callpv pPerl->perl_callpv
-#undef perl_callsv
-#define perl_callsv pPerl->perl_callsv
-#undef perl_eval_pv
-#define perl_eval_pv pPerl->perl_eval_pv
-#undef perl_eval_sv
-#define perl_eval_sv pPerl->perl_eval_sv
-#undef perl_get_sv
-#define perl_get_sv pPerl->perl_get_sv
-#undef perl_get_av
-#define perl_get_av pPerl->perl_get_av
-#undef perl_get_hv
-#define perl_get_hv pPerl->perl_get_hv
-#undef perl_get_cv
-#define perl_get_cv pPerl->perl_get_cv
-#undef perl_init_i18nl10n
-#define perl_init_i18nl10n pPerl->perl_init_i18nl10n
-#undef perl_init_i18nl14n
-#define perl_init_i18nl14n pPerl->perl_init_i18nl14n
-#undef perl_new_collate
-#define perl_new_collate pPerl->perl_new_collate
-#undef perl_new_ctype
-#define perl_new_ctype pPerl->perl_new_ctype
-#undef perl_new_numeric
-#define perl_new_numeric pPerl->perl_new_numeric
-#undef perl_set_numeric_local
-#define perl_set_numeric_local pPerl->perl_set_numeric_local
-#undef perl_set_numeric_standard
-#define perl_set_numeric_standard pPerl->perl_set_numeric_standard
-#undef perl_require_pv
-#define perl_require_pv pPerl->perl_require_pv
-#undef pidgone
-#define pidgone pPerl->Perl_pidgone
+#define pad_sv Perl_pad_sv
+#if defined(PERL_OBJECT)
+#undef Perl_construct
+#define Perl_construct pPerl->Perl_construct
+#undef Perl_destruct
+#define Perl_destruct pPerl->Perl_destruct
+#undef Perl_free
+#define Perl_free pPerl->Perl_free
+#undef Perl_run
+#define Perl_run pPerl->Perl_run
+#undef Perl_parse
+#define Perl_parse pPerl->Perl_parse
+#endif
+#if defined(USE_THREADS)
+#undef Perl_new_struct_thread
+#define Perl_new_struct_thread pPerl->Perl_new_struct_thread
+#undef new_struct_thread
+#define new_struct_thread Perl_new_struct_thread
+#endif
+#undef Perl_call_atexit
+#define Perl_call_atexit pPerl->Perl_call_atexit
+#undef call_atexit
+#define call_atexit Perl_call_atexit
+#undef Perl_call_argv
+#define Perl_call_argv pPerl->Perl_call_argv
+#undef call_argv
+#define call_argv Perl_call_argv
+#undef Perl_call_method
+#define Perl_call_method pPerl->Perl_call_method
+#undef call_method
+#define call_method Perl_call_method
+#undef Perl_call_pv
+#define Perl_call_pv pPerl->Perl_call_pv
+#undef call_pv
+#define call_pv Perl_call_pv
+#undef Perl_call_sv
+#define Perl_call_sv pPerl->Perl_call_sv
+#undef call_sv
+#define call_sv Perl_call_sv
+#undef Perl_eval_pv
+#define Perl_eval_pv pPerl->Perl_eval_pv
+#undef eval_pv
+#define eval_pv Perl_eval_pv
+#undef Perl_eval_sv
+#define Perl_eval_sv pPerl->Perl_eval_sv
+#undef eval_sv
+#define eval_sv Perl_eval_sv
+#undef Perl_get_sv
+#define Perl_get_sv pPerl->Perl_get_sv
+#undef get_sv
+#define get_sv Perl_get_sv
+#undef Perl_get_av
+#define Perl_get_av pPerl->Perl_get_av
+#undef get_av
+#define get_av Perl_get_av
+#undef Perl_get_hv
+#define Perl_get_hv pPerl->Perl_get_hv
+#undef get_hv
+#define get_hv Perl_get_hv
+#undef Perl_get_cv
+#define Perl_get_cv pPerl->Perl_get_cv
+#undef get_cv
+#define get_cv Perl_get_cv
+#undef Perl_init_i18nl10n
+#define Perl_init_i18nl10n pPerl->Perl_init_i18nl10n
+#undef init_i18nl10n
+#define init_i18nl10n Perl_init_i18nl10n
+#undef Perl_init_i18nl14n
+#define Perl_init_i18nl14n pPerl->Perl_init_i18nl14n
+#undef init_i18nl14n
+#define init_i18nl14n Perl_init_i18nl14n
+#undef Perl_new_collate
+#define Perl_new_collate pPerl->Perl_new_collate
+#undef new_collate
+#define new_collate Perl_new_collate
+#undef Perl_new_ctype
+#define Perl_new_ctype pPerl->Perl_new_ctype
+#undef new_ctype
+#define new_ctype Perl_new_ctype
+#undef Perl_new_numeric
+#define Perl_new_numeric pPerl->Perl_new_numeric
+#undef new_numeric
+#define new_numeric Perl_new_numeric
+#undef Perl_set_numeric_local
+#define Perl_set_numeric_local pPerl->Perl_set_numeric_local
+#undef set_numeric_local
+#define set_numeric_local Perl_set_numeric_local
+#undef Perl_set_numeric_radix
+#define Perl_set_numeric_radix pPerl->Perl_set_numeric_radix
+#undef set_numeric_radix
+#define set_numeric_radix Perl_set_numeric_radix
+#undef Perl_set_numeric_standard
+#define Perl_set_numeric_standard pPerl->Perl_set_numeric_standard
+#undef set_numeric_standard
+#define set_numeric_standard Perl_set_numeric_standard
+#undef Perl_require_pv
+#define Perl_require_pv pPerl->Perl_require_pv
+#undef require_pv
+#define require_pv Perl_require_pv
+#undef Perl_pmflag
+#define Perl_pmflag pPerl->Perl_pmflag
#undef pmflag
-#define pmflag pPerl->Perl_pmflag
-#undef pmruntime
-#define pmruntime pPerl->Perl_pmruntime
-#undef pmtrans
-#define pmtrans pPerl->Perl_pmtrans
-#undef pop_return
-#define pop_return pPerl->Perl_pop_return
+#define pmflag Perl_pmflag
+#undef Perl_pop_scope
+#define Perl_pop_scope pPerl->Perl_pop_scope
#undef pop_scope
-#define pop_scope pPerl->Perl_pop_scope
-#undef prepend_elem
-#define prepend_elem pPerl->Perl_prepend_elem
-#undef push_return
-#define push_return pPerl->Perl_push_return
+#define pop_scope Perl_pop_scope
+#undef Perl_push_scope
+#define Perl_push_scope pPerl->Perl_push_scope
#undef push_scope
-#define push_scope pPerl->Perl_push_scope
-#undef pregcomp
-#define pregcomp pPerl->Perl_pregcomp
-#undef ref
-#define ref pPerl->Perl_ref
-#undef refkids
-#define refkids pPerl->Perl_refkids
-#undef regexec_flags
-#define regexec_flags pPerl->Perl_regexec_flags
+#define push_scope Perl_push_scope
+#undef Perl_regdump
+#define Perl_regdump pPerl->Perl_regdump
+#undef regdump
+#define regdump Perl_regdump
+#undef Perl_pregexec
+#define Perl_pregexec pPerl->Perl_pregexec
#undef pregexec
-#define pregexec pPerl->Perl_pregexec
+#define pregexec Perl_pregexec
+#undef Perl_pregfree
+#define Perl_pregfree pPerl->Perl_pregfree
#undef pregfree
-#define pregfree pPerl->Perl_pregfree
-#undef regdump
-#define regdump pPerl->Perl_regdump
+#define pregfree Perl_pregfree
+#undef Perl_pregcomp
+#define Perl_pregcomp pPerl->Perl_pregcomp
+#undef pregcomp
+#define pregcomp Perl_pregcomp
+#undef Perl_re_intuit_start
+#define Perl_re_intuit_start pPerl->Perl_re_intuit_start
+#undef re_intuit_start
+#define re_intuit_start Perl_re_intuit_start
+#undef Perl_re_intuit_string
+#define Perl_re_intuit_string pPerl->Perl_re_intuit_string
+#undef re_intuit_string
+#define re_intuit_string Perl_re_intuit_string
+#undef Perl_regexec_flags
+#define Perl_regexec_flags pPerl->Perl_regexec_flags
+#undef regexec_flags
+#define regexec_flags Perl_regexec_flags
+#undef Perl_regnext
+#define Perl_regnext pPerl->Perl_regnext
#undef regnext
-#define regnext pPerl->Perl_regnext
-#undef regnoderegnext
-#define regnoderegnext pPerl->regnoderegnext
-#undef regprop
-#define regprop pPerl->Perl_regprop
+#define regnext Perl_regnext
+#undef Perl_repeatcpy
+#define Perl_repeatcpy pPerl->Perl_repeatcpy
#undef repeatcpy
-#define repeatcpy pPerl->Perl_repeatcpy
+#define repeatcpy Perl_repeatcpy
+#undef Perl_rninstr
+#define Perl_rninstr pPerl->Perl_rninstr
#undef rninstr
-#define rninstr pPerl->Perl_rninstr
-#undef rsignal
-#define rsignal pPerl->Perl_rsignal
-#undef rsignal_restore
-#define rsignal_restore pPerl->Perl_rsignal_restore
-#undef rsignal_save
-#define rsignal_save pPerl->Perl_rsignal_save
-#undef rsignal_state
-#define rsignal_state pPerl->Perl_rsignal_state
-#undef run
-#define run pPerl->Perl_run
-#undef rxres_free
-#define rxres_free pPerl->Perl_rxres_free
-#undef rxres_restore
-#define rxres_restore pPerl->Perl_rxres_restore
-#undef rxres_save
-#define rxres_save pPerl->Perl_rxres_save
-#undef safefree
-#define safefree pPerl->Perl_safefree
-#undef safecalloc
-#define safecalloc pPerl->Perl_safecalloc
-#undef safemalloc
-#define safemalloc pPerl->Perl_safemalloc
-#undef saferealloc
-#define saferealloc pPerl->Perl_saferealloc
-#undef safexcalloc
-#define safexcalloc pPerl->Perl_safexcalloc
-#undef safexfree
-#define safexfree pPerl->Perl_safexfree
-#undef safexmalloc
-#define safexmalloc pPerl->Perl_safexmalloc
-#undef safexrealloc
-#define safexrealloc pPerl->Perl_safexrealloc
-#undef same_dirent
-#define same_dirent pPerl->Perl_same_dirent
+#define rninstr Perl_rninstr
+#if !defined(HAS_RENAME)
+#endif
+#undef Perl_savepv
+#define Perl_savepv pPerl->Perl_savepv
#undef savepv
-#define savepv pPerl->Perl_savepv
+#define savepv Perl_savepv
+#undef Perl_savepvn
+#define Perl_savepvn pPerl->Perl_savepvn
#undef savepvn
-#define savepvn pPerl->Perl_savepvn
+#define savepvn Perl_savepvn
+#undef Perl_savestack_grow
+#define Perl_savestack_grow pPerl->Perl_savestack_grow
#undef savestack_grow
-#define savestack_grow pPerl->Perl_savestack_grow
+#define savestack_grow Perl_savestack_grow
+#undef Perl_save_aelem
+#define Perl_save_aelem pPerl->Perl_save_aelem
#undef save_aelem
-#define save_aelem pPerl->Perl_save_aelem
+#define save_aelem Perl_save_aelem
+#undef Perl_save_alloc
+#define Perl_save_alloc pPerl->Perl_save_alloc
+#undef save_alloc
+#define save_alloc Perl_save_alloc
+#undef Perl_save_aptr
+#define Perl_save_aptr pPerl->Perl_save_aptr
#undef save_aptr
-#define save_aptr pPerl->Perl_save_aptr
+#define save_aptr Perl_save_aptr
+#undef Perl_save_ary
+#define Perl_save_ary pPerl->Perl_save_ary
#undef save_ary
-#define save_ary pPerl->Perl_save_ary
+#define save_ary Perl_save_ary
+#undef Perl_save_clearsv
+#define Perl_save_clearsv pPerl->Perl_save_clearsv
#undef save_clearsv
-#define save_clearsv pPerl->Perl_save_clearsv
+#define save_clearsv Perl_save_clearsv
+#undef Perl_save_delete
+#define Perl_save_delete pPerl->Perl_save_delete
#undef save_delete
-#define save_delete pPerl->Perl_save_delete
+#define save_delete Perl_save_delete
+#undef Perl_save_destructor
+#define Perl_save_destructor pPerl->Perl_save_destructor
#undef save_destructor
-#define save_destructor pPerl->Perl_save_destructor
+#define save_destructor Perl_save_destructor
+#undef Perl_save_destructor_x
+#define Perl_save_destructor_x pPerl->Perl_save_destructor_x
+#undef save_destructor_x
+#define save_destructor_x Perl_save_destructor_x
+#undef Perl_save_freesv
+#define Perl_save_freesv pPerl->Perl_save_freesv
#undef save_freesv
-#define save_freesv pPerl->Perl_save_freesv
-#undef save_freeop
-#define save_freeop pPerl->Perl_save_freeop
+#define save_freesv Perl_save_freesv
+#undef Perl_save_freepv
+#define Perl_save_freepv pPerl->Perl_save_freepv
#undef save_freepv
-#define save_freepv pPerl->Perl_save_freepv
+#define save_freepv Perl_save_freepv
+#undef Perl_save_generic_svref
+#define Perl_save_generic_svref pPerl->Perl_save_generic_svref
#undef save_generic_svref
-#define save_generic_svref pPerl->Perl_generic_save_svref
+#define save_generic_svref Perl_save_generic_svref
+#undef Perl_save_gp
+#define Perl_save_gp pPerl->Perl_save_gp
#undef save_gp
-#define save_gp pPerl->Perl_save_gp
+#define save_gp Perl_save_gp
+#undef Perl_save_hash
+#define Perl_save_hash pPerl->Perl_save_hash
#undef save_hash
-#define save_hash pPerl->Perl_save_hash
+#define save_hash Perl_save_hash
+#undef Perl_save_helem
+#define Perl_save_helem pPerl->Perl_save_helem
#undef save_helem
-#define save_helem pPerl->Perl_save_helem
+#define save_helem Perl_save_helem
+#undef Perl_save_hints
+#define Perl_save_hints pPerl->Perl_save_hints
#undef save_hints
-#define save_hints pPerl->Perl_save_hints
+#define save_hints Perl_save_hints
+#undef Perl_save_hptr
+#define Perl_save_hptr pPerl->Perl_save_hptr
#undef save_hptr
-#define save_hptr pPerl->Perl_save_hptr
+#define save_hptr Perl_save_hptr
+#undef Perl_save_I16
+#define Perl_save_I16 pPerl->Perl_save_I16
#undef save_I16
-#define save_I16 pPerl->Perl_save_I16
+#define save_I16 Perl_save_I16
+#undef Perl_save_I32
+#define Perl_save_I32 pPerl->Perl_save_I32
#undef save_I32
-#define save_I32 pPerl->Perl_save_I32
+#define save_I32 Perl_save_I32
+#undef Perl_save_I8
+#define Perl_save_I8 pPerl->Perl_save_I8
+#undef save_I8
+#define save_I8 Perl_save_I8
+#undef Perl_save_int
+#define Perl_save_int pPerl->Perl_save_int
#undef save_int
-#define save_int pPerl->Perl_save_int
+#define save_int Perl_save_int
+#undef Perl_save_item
+#define Perl_save_item pPerl->Perl_save_item
#undef save_item
-#define save_item pPerl->Perl_save_item
+#define save_item Perl_save_item
+#undef Perl_save_iv
+#define Perl_save_iv pPerl->Perl_save_iv
#undef save_iv
-#define save_iv pPerl->Perl_save_iv
+#define save_iv Perl_save_iv
+#undef Perl_save_list
+#define Perl_save_list pPerl->Perl_save_list
#undef save_list
-#define save_list pPerl->Perl_save_list
+#define save_list Perl_save_list
+#undef Perl_save_long
+#define Perl_save_long pPerl->Perl_save_long
#undef save_long
-#define save_long pPerl->Perl_save_long
+#define save_long Perl_save_long
+#undef Perl_save_nogv
+#define Perl_save_nogv pPerl->Perl_save_nogv
#undef save_nogv
-#define save_nogv pPerl->Perl_save_nogv
-#undef save_op
-#define save_op pPerl->Perl_save_op
+#define save_nogv Perl_save_nogv
+#undef Perl_save_scalar
+#define Perl_save_scalar pPerl->Perl_save_scalar
#undef save_scalar
-#define save_scalar pPerl->Perl_save_scalar
+#define save_scalar Perl_save_scalar
+#undef Perl_save_pptr
+#define Perl_save_pptr pPerl->Perl_save_pptr
#undef save_pptr
-#define save_pptr pPerl->Perl_save_pptr
+#define save_pptr Perl_save_pptr
+#undef Perl_save_vptr
+#define Perl_save_vptr pPerl->Perl_save_vptr
+#undef save_vptr
+#define save_vptr Perl_save_vptr
+#undef Perl_save_re_context
+#define Perl_save_re_context pPerl->Perl_save_re_context
+#undef save_re_context
+#define save_re_context Perl_save_re_context
+#undef Perl_save_sptr
+#define Perl_save_sptr pPerl->Perl_save_sptr
#undef save_sptr
-#define save_sptr pPerl->Perl_save_sptr
+#define save_sptr Perl_save_sptr
+#undef Perl_save_svref
+#define Perl_save_svref pPerl->Perl_save_svref
#undef save_svref
-#define save_svref pPerl->Perl_save_svref
+#define save_svref Perl_save_svref
+#undef Perl_save_threadsv
+#define Perl_save_threadsv pPerl->Perl_save_threadsv
#undef save_threadsv
-#define save_threadsv pPerl->Perl_save_threadsv
-#undef sawparens
-#define sawparens pPerl->Perl_sawparens
-#undef scalar
-#define scalar pPerl->Perl_scalar
-#undef scalarkids
-#define scalarkids pPerl->Perl_scalarkids
-#undef scalarseq
-#define scalarseq pPerl->Perl_scalarseq
-#undef scalarvoid
-#define scalarvoid pPerl->Perl_scalarvoid
-#undef scan_const
-#define scan_const pPerl->Perl_scan_const
-#undef scan_formline
-#define scan_formline pPerl->Perl_scan_formline
-#undef scan_ident
-#define scan_ident pPerl->Perl_scan_ident
-#undef scan_inputsymbol
-#define scan_inputsymbol pPerl->Perl_scan_inputsymbol
-#undef scan_heredoc
-#define scan_heredoc pPerl->Perl_scan_heredoc
+#define save_threadsv Perl_save_threadsv
+#undef Perl_scan_bin
+#define Perl_scan_bin pPerl->Perl_scan_bin
+#undef scan_bin
+#define scan_bin Perl_scan_bin
+#undef Perl_scan_hex
+#define Perl_scan_hex pPerl->Perl_scan_hex
#undef scan_hex
-#define scan_hex pPerl->Perl_scan_hex
+#define scan_hex Perl_scan_hex
+#undef Perl_scan_num
+#define Perl_scan_num pPerl->Perl_scan_num
#undef scan_num
-#define scan_num pPerl->Perl_scan_num
+#define scan_num Perl_scan_num
+#undef Perl_scan_oct
+#define Perl_scan_oct pPerl->Perl_scan_oct
#undef scan_oct
-#define scan_oct pPerl->Perl_scan_oct
-#undef scan_pat
-#define scan_pat pPerl->Perl_scan_pat
-#undef scan_str
-#define scan_str pPerl->Perl_scan_str
-#undef scan_subst
-#define scan_subst pPerl->Perl_scan_subst
-#undef scan_trans
-#define scan_trans pPerl->Perl_scan_trans
-#undef scope
-#define scope pPerl->Perl_scope
+#define scan_oct Perl_scan_oct
+#undef Perl_screaminstr
+#define Perl_screaminstr pPerl->Perl_screaminstr
#undef screaminstr
-#define screaminstr pPerl->Perl_screaminstr
-#undef setdefout
-#define setdefout pPerl->Perl_setdefout
-#undef setenv_getix
-#define setenv_getix pPerl->Perl_setenv_getix
-#undef share_hek
-#define share_hek pPerl->Perl_share_hek
+#define screaminstr Perl_screaminstr
+#if !defined(VMS)
+#endif
+#undef Perl_sharepvn
+#define Perl_sharepvn pPerl->Perl_sharepvn
#undef sharepvn
-#define sharepvn pPerl->Perl_sharepvn
-#undef sighandler
-#define sighandler pPerl->Perl_sighandler
-#undef skipspace
-#define skipspace pPerl->Perl_skipspace
+#define sharepvn Perl_sharepvn
+#undef Perl_stack_grow
+#define Perl_stack_grow pPerl->Perl_stack_grow
#undef stack_grow
-#define stack_grow pPerl->Perl_stack_grow
+#define stack_grow Perl_stack_grow
+#undef Perl_start_subparse
+#define Perl_start_subparse pPerl->Perl_start_subparse
#undef start_subparse
-#define start_subparse pPerl->Perl_start_subparse
-#undef sub_crush_depth
-#define sub_crush_depth pPerl->Perl_sub_crush_depth
-#undef sublex_done
-#define sublex_done pPerl->Perl_sublex_done
-#undef sublex_start
-#define sublex_start pPerl->Perl_sublex_start
+#define start_subparse Perl_start_subparse
+#undef Perl_sv_2bool
+#define Perl_sv_2bool pPerl->Perl_sv_2bool
#undef sv_2bool
-#define sv_2bool pPerl->Perl_sv_2bool
+#define sv_2bool Perl_sv_2bool
+#undef Perl_sv_2cv
+#define Perl_sv_2cv pPerl->Perl_sv_2cv
#undef sv_2cv
-#define sv_2cv pPerl->Perl_sv_2cv
+#define sv_2cv Perl_sv_2cv
+#undef Perl_sv_2io
+#define Perl_sv_2io pPerl->Perl_sv_2io
#undef sv_2io
-#define sv_2io pPerl->Perl_sv_2io
+#define sv_2io Perl_sv_2io
+#undef Perl_sv_2iv
+#define Perl_sv_2iv pPerl->Perl_sv_2iv
#undef sv_2iv
-#define sv_2iv pPerl->Perl_sv_2iv
+#define sv_2iv Perl_sv_2iv
+#undef Perl_sv_2mortal
+#define Perl_sv_2mortal pPerl->Perl_sv_2mortal
#undef sv_2mortal
-#define sv_2mortal pPerl->Perl_sv_2mortal
+#define sv_2mortal Perl_sv_2mortal
+#undef Perl_sv_2nv
+#define Perl_sv_2nv pPerl->Perl_sv_2nv
#undef sv_2nv
-#define sv_2nv pPerl->Perl_sv_2nv
+#define sv_2nv Perl_sv_2nv
+#undef Perl_sv_2pv
+#define Perl_sv_2pv pPerl->Perl_sv_2pv
#undef sv_2pv
-#define sv_2pv pPerl->Perl_sv_2pv
+#define sv_2pv Perl_sv_2pv
+#undef Perl_sv_2pvutf8
+#define Perl_sv_2pvutf8 pPerl->Perl_sv_2pvutf8
+#undef sv_2pvutf8
+#define sv_2pvutf8 Perl_sv_2pvutf8
+#undef Perl_sv_2pvbyte
+#define Perl_sv_2pvbyte pPerl->Perl_sv_2pvbyte
+#undef sv_2pvbyte
+#define sv_2pvbyte Perl_sv_2pvbyte
+#undef Perl_sv_2uv
+#define Perl_sv_2uv pPerl->Perl_sv_2uv
#undef sv_2uv
-#define sv_2uv pPerl->Perl_sv_2uv
-#undef sv_add_arena
-#define sv_add_arena pPerl->Perl_sv_add_arena
+#define sv_2uv Perl_sv_2uv
+#undef Perl_sv_iv
+#define Perl_sv_iv pPerl->Perl_sv_iv
+#undef sv_iv
+#define sv_iv Perl_sv_iv
+#undef Perl_sv_uv
+#define Perl_sv_uv pPerl->Perl_sv_uv
+#undef sv_uv
+#define sv_uv Perl_sv_uv
+#undef Perl_sv_nv
+#define Perl_sv_nv pPerl->Perl_sv_nv
+#undef sv_nv
+#define sv_nv Perl_sv_nv
+#undef Perl_sv_pvn
+#define Perl_sv_pvn pPerl->Perl_sv_pvn
+#undef sv_pvn
+#define sv_pvn Perl_sv_pvn
+#undef Perl_sv_pvutf8n
+#define Perl_sv_pvutf8n pPerl->Perl_sv_pvutf8n
+#undef sv_pvutf8n
+#define sv_pvutf8n Perl_sv_pvutf8n
+#undef Perl_sv_pvbyten
+#define Perl_sv_pvbyten pPerl->Perl_sv_pvbyten
+#undef sv_pvbyten
+#define sv_pvbyten Perl_sv_pvbyten
+#undef Perl_sv_true
+#define Perl_sv_true pPerl->Perl_sv_true
+#undef sv_true
+#define sv_true Perl_sv_true
+#undef Perl_sv_backoff
+#define Perl_sv_backoff pPerl->Perl_sv_backoff
#undef sv_backoff
-#define sv_backoff pPerl->Perl_sv_backoff
+#define sv_backoff Perl_sv_backoff
+#undef Perl_sv_bless
+#define Perl_sv_bless pPerl->Perl_sv_bless
#undef sv_bless
-#define sv_bless pPerl->Perl_sv_bless
-#undef sv_catpv
-#define sv_catpv pPerl->Perl_sv_catpv
+#define sv_bless Perl_sv_bless
+#undef Perl_sv_catpvf
+#define Perl_sv_catpvf pPerl->Perl_sv_catpvf
#undef sv_catpvf
-#define sv_catpvf pPerl->Perl_sv_catpvf
+#define sv_catpvf Perl_sv_catpvf
+#undef Perl_sv_vcatpvf
+#define Perl_sv_vcatpvf pPerl->Perl_sv_vcatpvf
+#undef sv_vcatpvf
+#define sv_vcatpvf Perl_sv_vcatpvf
+#undef Perl_sv_catpv
+#define Perl_sv_catpv pPerl->Perl_sv_catpv
+#undef sv_catpv
+#define sv_catpv Perl_sv_catpv
+#undef Perl_sv_catpvn
+#define Perl_sv_catpvn pPerl->Perl_sv_catpvn
#undef sv_catpvn
-#define sv_catpvn pPerl->Perl_sv_catpvn
+#define sv_catpvn Perl_sv_catpvn
+#undef Perl_sv_catsv
+#define Perl_sv_catsv pPerl->Perl_sv_catsv
#undef sv_catsv
-#define sv_catsv pPerl->Perl_sv_catsv
+#define sv_catsv Perl_sv_catsv
+#undef Perl_sv_chop
+#define Perl_sv_chop pPerl->Perl_sv_chop
#undef sv_chop
-#define sv_chop pPerl->Perl_sv_chop
-#undef sv_clean_all
-#define sv_clean_all pPerl->Perl_sv_clean_all
-#undef sv_clean_objs
-#define sv_clean_objs pPerl->Perl_sv_clean_objs
+#define sv_chop Perl_sv_chop
+#undef Perl_sv_clear
+#define Perl_sv_clear pPerl->Perl_sv_clear
#undef sv_clear
-#define sv_clear pPerl->Perl_sv_clear
+#define sv_clear Perl_sv_clear
+#undef Perl_sv_cmp
+#define Perl_sv_cmp pPerl->Perl_sv_cmp
#undef sv_cmp
-#define sv_cmp pPerl->Perl_sv_cmp
+#define sv_cmp Perl_sv_cmp
+#undef Perl_sv_cmp_locale
+#define Perl_sv_cmp_locale pPerl->Perl_sv_cmp_locale
#undef sv_cmp_locale
-#define sv_cmp_locale pPerl->Perl_sv_cmp_locale
+#define sv_cmp_locale Perl_sv_cmp_locale
+#if defined(USE_LOCALE_COLLATE)
+#undef Perl_sv_collxfrm
+#define Perl_sv_collxfrm pPerl->Perl_sv_collxfrm
#undef sv_collxfrm
-#define sv_collxfrm pPerl->Perl_sv_collxfrm
+#define sv_collxfrm Perl_sv_collxfrm
+#endif
+#undef Perl_sv_compile_2op
+#define Perl_sv_compile_2op pPerl->Perl_sv_compile_2op
#undef sv_compile_2op
-#define sv_compile_2op pPerl->Perl_sv_compile_2op
+#define sv_compile_2op Perl_sv_compile_2op
+#undef Perl_sv_dec
+#define Perl_sv_dec pPerl->Perl_sv_dec
#undef sv_dec
-#define sv_dec pPerl->Perl_sv_dec
-#undef sv_derived_from
-#define sv_derived_from pPerl->Perl_sv_derived_from
+#define sv_dec Perl_sv_dec
+#undef Perl_sv_dump
+#define Perl_sv_dump pPerl->Perl_sv_dump
#undef sv_dump
-#define sv_dump pPerl->Perl_sv_dump
+#define sv_dump Perl_sv_dump
+#undef Perl_sv_derived_from
+#define Perl_sv_derived_from pPerl->Perl_sv_derived_from
+#undef sv_derived_from
+#define sv_derived_from Perl_sv_derived_from
+#undef Perl_sv_eq
+#define Perl_sv_eq pPerl->Perl_sv_eq
#undef sv_eq
-#define sv_eq pPerl->Perl_sv_eq
+#define sv_eq Perl_sv_eq
+#undef Perl_sv_free
+#define Perl_sv_free pPerl->Perl_sv_free
#undef sv_free
-#define sv_free pPerl->Perl_sv_free
-#undef sv_free_arenas
-#define sv_free_arenas pPerl->Perl_sv_free_arenas
+#define sv_free Perl_sv_free
+#undef Perl_sv_gets
+#define Perl_sv_gets pPerl->Perl_sv_gets
#undef sv_gets
-#define sv_gets pPerl->Perl_sv_gets
+#define sv_gets Perl_sv_gets
+#undef Perl_sv_grow
+#define Perl_sv_grow pPerl->Perl_sv_grow
#undef sv_grow
-#define sv_grow pPerl->Perl_sv_grow
+#define sv_grow Perl_sv_grow
+#undef Perl_sv_inc
+#define Perl_sv_inc pPerl->Perl_sv_inc
#undef sv_inc
-#define sv_inc pPerl->Perl_sv_inc
+#define sv_inc Perl_sv_inc
+#undef Perl_sv_insert
+#define Perl_sv_insert pPerl->Perl_sv_insert
#undef sv_insert
-#define sv_insert pPerl->Perl_sv_insert
+#define sv_insert Perl_sv_insert
+#undef Perl_sv_isa
+#define Perl_sv_isa pPerl->Perl_sv_isa
#undef sv_isa
-#define sv_isa pPerl->Perl_sv_isa
+#define sv_isa Perl_sv_isa
+#undef Perl_sv_isobject
+#define Perl_sv_isobject pPerl->Perl_sv_isobject
#undef sv_isobject
-#define sv_isobject pPerl->Perl_sv_isobject
-#undef sv_iv
-#define sv_iv pPerl->Perl_sv_iv
+#define sv_isobject Perl_sv_isobject
+#undef Perl_sv_len
+#define Perl_sv_len pPerl->Perl_sv_len
#undef sv_len
-#define sv_len pPerl->Perl_sv_len
+#define sv_len Perl_sv_len
+#undef Perl_sv_len_utf8
+#define Perl_sv_len_utf8 pPerl->Perl_sv_len_utf8
+#undef sv_len_utf8
+#define sv_len_utf8 Perl_sv_len_utf8
+#undef Perl_sv_magic
+#define Perl_sv_magic pPerl->Perl_sv_magic
#undef sv_magic
-#define sv_magic pPerl->Perl_sv_magic
+#define sv_magic Perl_sv_magic
+#undef Perl_sv_mortalcopy
+#define Perl_sv_mortalcopy pPerl->Perl_sv_mortalcopy
#undef sv_mortalcopy
-#define sv_mortalcopy pPerl->Perl_sv_mortalcopy
+#define sv_mortalcopy Perl_sv_mortalcopy
+#undef Perl_sv_newmortal
+#define Perl_sv_newmortal pPerl->Perl_sv_newmortal
#undef sv_newmortal
-#define sv_newmortal pPerl->Perl_sv_newmortal
+#define sv_newmortal Perl_sv_newmortal
+#undef Perl_sv_newref
+#define Perl_sv_newref pPerl->Perl_sv_newref
#undef sv_newref
-#define sv_newref pPerl->Perl_sv_newref
-#undef sv_nv
-#define sv_nv pPerl->Perl_sv_nv
+#define sv_newref Perl_sv_newref
+#undef Perl_sv_peek
+#define Perl_sv_peek pPerl->Perl_sv_peek
#undef sv_peek
-#define sv_peek pPerl->Perl_sv_peek
-#undef sv_pvn
-#define sv_pvn pPerl->Perl_sv_pvn
+#define sv_peek Perl_sv_peek
+#undef Perl_sv_pos_u2b
+#define Perl_sv_pos_u2b pPerl->Perl_sv_pos_u2b
+#undef sv_pos_u2b
+#define sv_pos_u2b Perl_sv_pos_u2b
+#undef Perl_sv_pos_b2u
+#define Perl_sv_pos_b2u pPerl->Perl_sv_pos_b2u
+#undef sv_pos_b2u
+#define sv_pos_b2u Perl_sv_pos_b2u
+#undef Perl_sv_pvn_force
+#define Perl_sv_pvn_force pPerl->Perl_sv_pvn_force
#undef sv_pvn_force
-#define sv_pvn_force pPerl->Perl_sv_pvn_force
+#define sv_pvn_force Perl_sv_pvn_force
+#undef Perl_sv_pvutf8n_force
+#define Perl_sv_pvutf8n_force pPerl->Perl_sv_pvutf8n_force
+#undef sv_pvutf8n_force
+#define sv_pvutf8n_force Perl_sv_pvutf8n_force
+#undef Perl_sv_pvbyten_force
+#define Perl_sv_pvbyten_force pPerl->Perl_sv_pvbyten_force
+#undef sv_pvbyten_force
+#define sv_pvbyten_force Perl_sv_pvbyten_force
+#undef Perl_sv_reftype
+#define Perl_sv_reftype pPerl->Perl_sv_reftype
#undef sv_reftype
-#define sv_reftype pPerl->Perl_sv_reftype
+#define sv_reftype Perl_sv_reftype
+#undef Perl_sv_replace
+#define Perl_sv_replace pPerl->Perl_sv_replace
#undef sv_replace
-#define sv_replace pPerl->Perl_sv_replace
+#define sv_replace Perl_sv_replace
+#undef Perl_sv_report_used
+#define Perl_sv_report_used pPerl->Perl_sv_report_used
#undef sv_report_used
-#define sv_report_used pPerl->Perl_sv_report_used
+#define sv_report_used Perl_sv_report_used
+#undef Perl_sv_reset
+#define Perl_sv_reset pPerl->Perl_sv_reset
#undef sv_reset
-#define sv_reset pPerl->Perl_sv_reset
-#undef sv_setiv
-#define sv_setiv pPerl->Perl_sv_setiv
-#undef sv_setnv
-#define sv_setnv pPerl->Perl_sv_setnv
-#undef sv_setpv
-#define sv_setpv pPerl->Perl_sv_setpv
+#define sv_reset Perl_sv_reset
+#undef Perl_sv_setpvf
+#define Perl_sv_setpvf pPerl->Perl_sv_setpvf
#undef sv_setpvf
-#define sv_setpvf pPerl->Perl_sv_setpvf
+#define sv_setpvf Perl_sv_setpvf
+#undef Perl_sv_vsetpvf
+#define Perl_sv_vsetpvf pPerl->Perl_sv_vsetpvf
+#undef sv_vsetpvf
+#define sv_vsetpvf Perl_sv_vsetpvf
+#undef Perl_sv_setiv
+#define Perl_sv_setiv pPerl->Perl_sv_setiv
+#undef sv_setiv
+#define sv_setiv Perl_sv_setiv
+#undef Perl_sv_setpviv
+#define Perl_sv_setpviv pPerl->Perl_sv_setpviv
#undef sv_setpviv
-#define sv_setpviv pPerl->Perl_sv_setpviv
-#undef sv_setpvn
-#define sv_setpvn pPerl->Perl_sv_setpvn
+#define sv_setpviv Perl_sv_setpviv
+#undef Perl_sv_setuv
+#define Perl_sv_setuv pPerl->Perl_sv_setuv
+#undef sv_setuv
+#define sv_setuv Perl_sv_setuv
+#undef Perl_sv_setnv
+#define Perl_sv_setnv pPerl->Perl_sv_setnv
+#undef sv_setnv
+#define sv_setnv Perl_sv_setnv
+#undef Perl_sv_setref_iv
+#define Perl_sv_setref_iv pPerl->Perl_sv_setref_iv
#undef sv_setref_iv
-#define sv_setref_iv pPerl->Perl_sv_setref_iv
+#define sv_setref_iv Perl_sv_setref_iv
+#undef Perl_sv_setref_nv
+#define Perl_sv_setref_nv pPerl->Perl_sv_setref_nv
#undef sv_setref_nv
-#define sv_setref_nv pPerl->Perl_sv_setref_nv
+#define sv_setref_nv Perl_sv_setref_nv
+#undef Perl_sv_setref_pv
+#define Perl_sv_setref_pv pPerl->Perl_sv_setref_pv
#undef sv_setref_pv
-#define sv_setref_pv pPerl->Perl_sv_setref_pv
+#define sv_setref_pv Perl_sv_setref_pv
+#undef Perl_sv_setref_pvn
+#define Perl_sv_setref_pvn pPerl->Perl_sv_setref_pvn
#undef sv_setref_pvn
-#define sv_setref_pvn pPerl->Perl_sv_setref_pvn
+#define sv_setref_pvn Perl_sv_setref_pvn
+#undef Perl_sv_setpv
+#define Perl_sv_setpv pPerl->Perl_sv_setpv
+#undef sv_setpv
+#define sv_setpv Perl_sv_setpv
+#undef Perl_sv_setpvn
+#define Perl_sv_setpvn pPerl->Perl_sv_setpvn
+#undef sv_setpvn
+#define sv_setpvn Perl_sv_setpvn
+#undef Perl_sv_setsv
+#define Perl_sv_setsv pPerl->Perl_sv_setsv
#undef sv_setsv
-#define sv_setsv pPerl->Perl_sv_setsv
-#undef sv_setuv
-#define sv_setuv pPerl->Perl_sv_setuv
+#define sv_setsv Perl_sv_setsv
+#undef Perl_sv_taint
+#define Perl_sv_taint pPerl->Perl_sv_taint
#undef sv_taint
-#define sv_taint pPerl->Perl_sv_taint
+#define sv_taint Perl_sv_taint
+#undef Perl_sv_tainted
+#define Perl_sv_tainted pPerl->Perl_sv_tainted
#undef sv_tainted
-#define sv_tainted pPerl->Perl_sv_tainted
-#undef sv_true
-#define sv_true pPerl->Perl_sv_true
+#define sv_tainted Perl_sv_tainted
+#undef Perl_sv_unmagic
+#define Perl_sv_unmagic pPerl->Perl_sv_unmagic
#undef sv_unmagic
-#define sv_unmagic pPerl->Perl_sv_unmagic
+#define sv_unmagic Perl_sv_unmagic
+#undef Perl_sv_unref
+#define Perl_sv_unref pPerl->Perl_sv_unref
#undef sv_unref
-#define sv_unref pPerl->Perl_sv_unref
+#define sv_unref Perl_sv_unref
+#undef Perl_sv_untaint
+#define Perl_sv_untaint pPerl->Perl_sv_untaint
#undef sv_untaint
-#define sv_untaint pPerl->Perl_sv_untaint
+#define sv_untaint Perl_sv_untaint
+#undef Perl_sv_upgrade
+#define Perl_sv_upgrade pPerl->Perl_sv_upgrade
#undef sv_upgrade
-#define sv_upgrade pPerl->Perl_sv_upgrade
+#define sv_upgrade Perl_sv_upgrade
+#undef Perl_sv_usepvn
+#define Perl_sv_usepvn pPerl->Perl_sv_usepvn
#undef sv_usepvn
-#define sv_usepvn pPerl->Perl_sv_usepvn
-#undef sv_uv
-#define sv_uv pPerl->Perl_sv_uv
+#define sv_usepvn Perl_sv_usepvn
+#undef Perl_sv_vcatpvfn
+#define Perl_sv_vcatpvfn pPerl->Perl_sv_vcatpvfn
#undef sv_vcatpvfn
-#define sv_vcatpvfn pPerl->Perl_sv_vcatpvfn
+#define sv_vcatpvfn Perl_sv_vcatpvfn
+#undef Perl_sv_vsetpvfn
+#define Perl_sv_vsetpvfn pPerl->Perl_sv_vsetpvfn
#undef sv_vsetpvfn
-#define sv_vsetpvfn pPerl->Perl_sv_vsetpvfn
+#define sv_vsetpvfn Perl_sv_vsetpvfn
+#undef Perl_str_to_version
+#define Perl_str_to_version pPerl->Perl_str_to_version
+#undef str_to_version
+#define str_to_version Perl_str_to_version
+#undef Perl_swash_init
+#define Perl_swash_init pPerl->Perl_swash_init
+#undef swash_init
+#define swash_init Perl_swash_init
+#undef Perl_swash_fetch
+#define Perl_swash_fetch pPerl->Perl_swash_fetch
+#undef swash_fetch
+#define swash_fetch Perl_swash_fetch
+#undef Perl_taint_env
+#define Perl_taint_env pPerl->Perl_taint_env
#undef taint_env
-#define taint_env pPerl->Perl_taint_env
-#undef taint_not
-#define taint_not pPerl->Perl_taint_not
+#define taint_env Perl_taint_env
+#undef Perl_taint_proper
+#define Perl_taint_proper pPerl->Perl_taint_proper
#undef taint_proper
-#define taint_proper pPerl->Perl_taint_proper
-#undef too_few_arguments
-#define too_few_arguments pPerl->Perl_too_few_arguments
-#undef too_many_arguments
-#define too_many_arguments pPerl->Perl_too_many_arguments
+#define taint_proper Perl_taint_proper
+#undef Perl_to_utf8_lower
+#define Perl_to_utf8_lower pPerl->Perl_to_utf8_lower
+#undef to_utf8_lower
+#define to_utf8_lower Perl_to_utf8_lower
+#undef Perl_to_utf8_upper
+#define Perl_to_utf8_upper pPerl->Perl_to_utf8_upper
+#undef to_utf8_upper
+#define to_utf8_upper Perl_to_utf8_upper
+#undef Perl_to_utf8_title
+#define Perl_to_utf8_title pPerl->Perl_to_utf8_title
+#undef to_utf8_title
+#define to_utf8_title Perl_to_utf8_title
+#if defined(UNLINK_ALL_VERSIONS)
+#undef Perl_unlnk
+#define Perl_unlnk pPerl->Perl_unlnk
#undef unlnk
-#define unlnk pPerl->Perl_unlnk
+#define unlnk Perl_unlnk
+#endif
+#if defined(USE_THREADS)
+#undef Perl_unlock_condpair
+#define Perl_unlock_condpair pPerl->Perl_unlock_condpair
#undef unlock_condpair
-#define unlock_condpair pPerl->Perl_unlock_condpair
-#undef unshare_hek
-#define unshare_hek pPerl->Perl_unshare_hek
+#define unlock_condpair Perl_unlock_condpair
+#endif
+#undef Perl_unsharepvn
+#define Perl_unsharepvn pPerl->Perl_unsharepvn
#undef unsharepvn
-#define unsharepvn pPerl->Perl_unsharepvn
-#undef utilize
-#define utilize pPerl->Perl_utilize
-#undef vivify_defelem
-#define vivify_defelem pPerl->Perl_vivify_defelem
-#undef vivify_ref
-#define vivify_ref pPerl->Perl_vivify_ref
-#undef wait4pid
-#define wait4pid pPerl->Perl_wait4pid
+#define unsharepvn Perl_unsharepvn
+#undef Perl_utf16_to_utf8
+#define Perl_utf16_to_utf8 pPerl->Perl_utf16_to_utf8
+#undef utf16_to_utf8
+#define utf16_to_utf8 Perl_utf16_to_utf8
+#undef Perl_utf16_to_utf8_reversed
+#define Perl_utf16_to_utf8_reversed pPerl->Perl_utf16_to_utf8_reversed
+#undef utf16_to_utf8_reversed
+#define utf16_to_utf8_reversed Perl_utf16_to_utf8_reversed
+#undef Perl_utf8_distance
+#define Perl_utf8_distance pPerl->Perl_utf8_distance
+#undef utf8_distance
+#define utf8_distance Perl_utf8_distance
+#undef Perl_utf8_hop
+#define Perl_utf8_hop pPerl->Perl_utf8_hop
+#undef utf8_hop
+#define utf8_hop Perl_utf8_hop
+#undef Perl_utf8_to_uv
+#define Perl_utf8_to_uv pPerl->Perl_utf8_to_uv
+#undef utf8_to_uv
+#define utf8_to_uv Perl_utf8_to_uv
+#undef Perl_uv_to_utf8
+#define Perl_uv_to_utf8 pPerl->Perl_uv_to_utf8
+#undef uv_to_utf8
+#define uv_to_utf8 Perl_uv_to_utf8
+#undef Perl_warn
+#define Perl_warn pPerl->Perl_warn
#undef warn
-#define warn pPerl->Perl_warn
-#undef watch
-#define watch pPerl->Perl_watch
-#undef whichsig
-#define whichsig pPerl->Perl_whichsig
-#undef yyerror
-#define yyerror pPerl->Perl_yyerror
-#undef yylex
-#define yylex pPerl->Perl_yylex
-#undef yyparse
-#define yyparse pPerl->Perl_yyparse
-#undef yywarn
-#define yywarn pPerl->Perl_yywarn
-
-
-#undef PL_piMem
-#define PL_piMem (pPerl->PL_piMem)
-#undef PL_piENV
-#define PL_piENV (pPerl->PL_piENV)
-#undef PL_piStdIO
-#define PL_piStdIO (pPerl->PL_piStdIO)
-#undef PL_piLIO
-#define PL_piLIO (pPerl->PL_piLIO)
-#undef PL_piDir
-#define PL_piDir (pPerl->PL_piDir)
-#undef PL_piSock
-#define PL_piSock (pPerl->PL_piSock)
-#undef PL_piProc
-#define PL_piProc (pPerl->PL_piProc)
-
-#ifndef NO_XSLOCKS
-#undef closedir
-#undef opendir
-#undef stdin
-#undef stdout
-#undef stderr
-#undef feof
-#undef ferror
-#undef fgetpos
-#undef ioctl
-#undef getlogin
-#undef setjmp
-#undef getc
-#undef ungetc
-#undef fileno
-
-#define mkdir PerlDir_mkdir
-#define chdir PerlDir_chdir
-#define rmdir PerlDir_rmdir
-#define closedir PerlDir_close
-#define opendir PerlDir_open
-#define readdir PerlDir_read
-#define rewinddir PerlDir_rewind
-#define seekdir PerlDir_seek
-#define telldir PerlDir_tell
-#define putenv PerlEnv_putenv
-#define getenv PerlEnv_getenv
-#define stdin PerlIO_stdin()
-#define stdout PerlIO_stdout()
-#define stderr PerlIO_stderr()
-#define fopen PerlIO_open
-#define fclose PerlIO_close
-#define feof PerlIO_eof
-#define ferror PerlIO_error
-#define fclearerr PerlIO_clearerr
-#define getc PerlIO_getc
-#define fputc(c, f) PerlIO_putc(f,c)
-#define fputs(s, f) PerlIO_puts(f,s)
-#define fflush PerlIO_flush
-#define ungetc(c, f) PerlIO_ungetc((f),(c))
-#define fileno PerlIO_fileno
-#define fdopen PerlIO_fdopen
-#define freopen PerlIO_reopen
-#define fread(b,s,c,f) PerlIO_read((f),(b),(s*c))
-#define fwrite(b,s,c,f) PerlIO_write((f),(b),(s*c))
-#define setbuf PerlIO_setbuf
-#define setvbuf PerlIO_setvbuf
-#define setlinebuf PerlIO_setlinebuf
-#define stdoutf PerlIO_stdoutf
-#define vfprintf PerlIO_vprintf
-#define ftell PerlIO_tell
-#define fseek PerlIO_seek
-#define fgetpos PerlIO_getpos
-#define fsetpos PerlIO_setpos
-#define frewind PerlIO_rewind
-#define tmpfile PerlIO_tmpfile
-#define access PerlLIO_access
-#define chmod PerlLIO_chmod
-#define chsize PerlLIO_chsize
-#define close PerlLIO_close
-#define dup PerlLIO_dup
-#define dup2 PerlLIO_dup2
-#define flock PerlLIO_flock
-#define fstat PerlLIO_fstat
-#define ioctl PerlLIO_ioctl
-#define isatty PerlLIO_isatty
-#define lseek PerlLIO_lseek
-#define lstat PerlLIO_lstat
-#define mktemp PerlLIO_mktemp
-#define open PerlLIO_open
-#define read PerlLIO_read
-#define rename PerlLIO_rename
-#define setmode PerlLIO_setmode
-#define stat PerlLIO_stat
-#define tmpnam PerlLIO_tmpnam
-#define umask PerlLIO_umask
-#define unlink PerlLIO_unlink
-#define utime PerlLIO_utime
-#define write PerlLIO_write
-#define malloc PerlMem_malloc
-#define realloc PerlMem_realloc
-#define free PerlMem_free
-#define abort PerlProc_abort
-#define exit PerlProc_exit
-#define _exit PerlProc__exit
-#define execl PerlProc_execl
-#define execv PerlProc_execv
-#define execvp PerlProc_execvp
-#define getuid PerlProc_getuid
-#define geteuid PerlProc_geteuid
-#define getgid PerlProc_getgid
-#define getegid PerlProc_getegid
-#define getlogin PerlProc_getlogin
-#define kill PerlProc_kill
-#define killpg PerlProc_killpg
-#define pause PerlProc_pause
-#define popen PerlProc_popen
-#define pclose PerlProc_pclose
-#define pipe PerlProc_pipe
-#define setuid PerlProc_setuid
-#define setgid PerlProc_setgid
-#define sleep PerlProc_sleep
-#define times PerlProc_times
-#define wait PerlProc_wait
-#define setjmp PerlProc_setjmp
-#define longjmp PerlProc_longjmp
-#define signal PerlProc_signal
-#define htonl PerlSock_htonl
-#define htons PerlSock_htons
-#define ntohl PerlSock_ntohl
-#define ntohs PerlSock_ntohs
-#define accept PerlSock_accept
-#define bind PerlSock_bind
-#define connect PerlSock_connect
-#define endhostent PerlSock_endhostent
-#define endnetent PerlSock_endnetent
-#define endprotoent PerlSock_endprotoent
-#define endservent PerlSock_endservent
-#define gethostbyaddr PerlSock_gethostbyaddr
-#define gethostbyname PerlSock_gethostbyname
-#define gethostent PerlSock_gethostent
-#define gethostname PerlSock_gethostname
-#define getnetbyaddr PerlSock_getnetbyaddr
-#define getnetbyname PerlSock_getnetbyname
-#define getnetent PerlSock_getnetent
-#define getpeername PerlSock_getpeername
-#define getprotobyname PerlSock_getprotobyname
-#define getprotobynumber PerlSock_getprotobynumber
-#define getprotoent PerlSock_getprotoent
-#define getservbyname PerlSock_getservbyname
-#define getservbyport PerlSock_getservbyport
-#define getservent PerlSock_getservent
-#define getsockname PerlSock_getsockname
-#define getsockopt PerlSock_getsockopt
-#define inet_addr PerlSock_inet_addr
-#define inet_ntoa PerlSock_inet_ntoa
-#define listen PerlSock_listen
-#define recvfrom PerlSock_recvfrom
-#define select PerlSock_select
-#define send PerlSock_send
-#define sendto PerlSock_sendto
-#define sethostent PerlSock_sethostent
-#define setnetent PerlSock_setnetent
-#define setprotoent PerlSock_setprotoent
-#define setservent PerlSock_setservent
-#define setsockopt PerlSock_setsockopt
-#define shutdown PerlSock_shutdown
-#define socket PerlSock_socket
-#define socketpair PerlSock_socketpair
-#endif /* NO_XSLOCKS */
-
-#undef PERL_OBJECT_THIS
-#define PERL_OBJECT_THIS pPerl
-#undef PERL_OBJECT_THIS_
-#define PERL_OBJECT_THIS_ pPerl,
-
-#undef SAVEDESTRUCTOR
-#define SAVEDESTRUCTOR(f,p) \
- pPerl->Perl_save_destructor((FUNC_NAME_TO_PTR(f)),(p))
-
-#ifdef WIN32
-
-#ifndef WIN32IO_IS_STDIO
-#undef errno
-#define errno ErrorNo()
+#define warn Perl_warn
+#undef Perl_vwarn
+#define Perl_vwarn pPerl->Perl_vwarn
+#undef vwarn
+#define vwarn Perl_vwarn
+#undef Perl_warner
+#define Perl_warner pPerl->Perl_warner
+#undef warner
+#define warner Perl_warner
+#undef Perl_vwarner
+#define Perl_vwarner pPerl->Perl_vwarner
+#undef vwarner
+#define vwarner Perl_vwarner
+#if defined(USE_PURE_BISON)
+#else
+#endif
+#if defined(MYMALLOC)
+#undef Perl_dump_mstats
+#define Perl_dump_mstats pPerl->Perl_dump_mstats
+#undef dump_mstats
+#define dump_mstats Perl_dump_mstats
+#undef Perl_get_mstats
+#define Perl_get_mstats pPerl->Perl_get_mstats
+#undef get_mstats
+#define get_mstats Perl_get_mstats
+#endif
+#undef Perl_safesysmalloc
+#define Perl_safesysmalloc pPerl->Perl_safesysmalloc
+#undef safesysmalloc
+#define safesysmalloc Perl_safesysmalloc
+#undef Perl_safesyscalloc
+#define Perl_safesyscalloc pPerl->Perl_safesyscalloc
+#undef safesyscalloc
+#define safesyscalloc Perl_safesyscalloc
+#undef Perl_safesysrealloc
+#define Perl_safesysrealloc pPerl->Perl_safesysrealloc
+#undef safesysrealloc
+#define safesysrealloc Perl_safesysrealloc
+#undef Perl_safesysfree
+#define Perl_safesysfree pPerl->Perl_safesysfree
+#undef safesysfree
+#define safesysfree Perl_safesysfree
+#if defined(LEAKTEST)
+#undef Perl_safexmalloc
+#define Perl_safexmalloc pPerl->Perl_safexmalloc
+#undef safexmalloc
+#define safexmalloc Perl_safexmalloc
+#undef Perl_safexcalloc
+#define Perl_safexcalloc pPerl->Perl_safexcalloc
+#undef safexcalloc
+#define safexcalloc Perl_safexcalloc
+#undef Perl_safexrealloc
+#define Perl_safexrealloc pPerl->Perl_safexrealloc
+#undef safexrealloc
+#define safexrealloc Perl_safexrealloc
+#undef Perl_safexfree
+#define Perl_safexfree pPerl->Perl_safexfree
+#undef safexfree
+#define safexfree Perl_safexfree
+#endif
+#if defined(PERL_GLOBAL_STRUCT)
+#undef Perl_GetVars
+#define Perl_GetVars pPerl->Perl_GetVars
+#undef GetVars
+#define GetVars Perl_GetVars
+#endif
+#undef Perl_runops_standard
+#define Perl_runops_standard pPerl->Perl_runops_standard
+#undef runops_standard
+#define runops_standard Perl_runops_standard
+#undef Perl_runops_debug
+#define Perl_runops_debug pPerl->Perl_runops_debug
+#undef runops_debug
+#define runops_debug Perl_runops_debug
+#undef Perl_sv_catpvf_mg
+#define Perl_sv_catpvf_mg pPerl->Perl_sv_catpvf_mg
+#undef sv_catpvf_mg
+#define sv_catpvf_mg Perl_sv_catpvf_mg
+#undef Perl_sv_vcatpvf_mg
+#define Perl_sv_vcatpvf_mg pPerl->Perl_sv_vcatpvf_mg
+#undef sv_vcatpvf_mg
+#define sv_vcatpvf_mg Perl_sv_vcatpvf_mg
+#undef Perl_sv_catpv_mg
+#define Perl_sv_catpv_mg pPerl->Perl_sv_catpv_mg
+#undef sv_catpv_mg
+#define sv_catpv_mg Perl_sv_catpv_mg
+#undef Perl_sv_catpvn_mg
+#define Perl_sv_catpvn_mg pPerl->Perl_sv_catpvn_mg
+#undef sv_catpvn_mg
+#define sv_catpvn_mg Perl_sv_catpvn_mg
+#undef Perl_sv_catsv_mg
+#define Perl_sv_catsv_mg pPerl->Perl_sv_catsv_mg
+#undef sv_catsv_mg
+#define sv_catsv_mg Perl_sv_catsv_mg
+#undef Perl_sv_setpvf_mg
+#define Perl_sv_setpvf_mg pPerl->Perl_sv_setpvf_mg
+#undef sv_setpvf_mg
+#define sv_setpvf_mg Perl_sv_setpvf_mg
+#undef Perl_sv_vsetpvf_mg
+#define Perl_sv_vsetpvf_mg pPerl->Perl_sv_vsetpvf_mg
+#undef sv_vsetpvf_mg
+#define sv_vsetpvf_mg Perl_sv_vsetpvf_mg
+#undef Perl_sv_setiv_mg
+#define Perl_sv_setiv_mg pPerl->Perl_sv_setiv_mg
+#undef sv_setiv_mg
+#define sv_setiv_mg Perl_sv_setiv_mg
+#undef Perl_sv_setpviv_mg
+#define Perl_sv_setpviv_mg pPerl->Perl_sv_setpviv_mg
+#undef sv_setpviv_mg
+#define sv_setpviv_mg Perl_sv_setpviv_mg
+#undef Perl_sv_setuv_mg
+#define Perl_sv_setuv_mg pPerl->Perl_sv_setuv_mg
+#undef sv_setuv_mg
+#define sv_setuv_mg Perl_sv_setuv_mg
+#undef Perl_sv_setnv_mg
+#define Perl_sv_setnv_mg pPerl->Perl_sv_setnv_mg
+#undef sv_setnv_mg
+#define sv_setnv_mg Perl_sv_setnv_mg
+#undef Perl_sv_setpv_mg
+#define Perl_sv_setpv_mg pPerl->Perl_sv_setpv_mg
+#undef sv_setpv_mg
+#define sv_setpv_mg Perl_sv_setpv_mg
+#undef Perl_sv_setpvn_mg
+#define Perl_sv_setpvn_mg pPerl->Perl_sv_setpvn_mg
+#undef sv_setpvn_mg
+#define sv_setpvn_mg Perl_sv_setpvn_mg
+#undef Perl_sv_setsv_mg
+#define Perl_sv_setsv_mg pPerl->Perl_sv_setsv_mg
+#undef sv_setsv_mg
+#define sv_setsv_mg Perl_sv_setsv_mg
+#undef Perl_sv_usepvn_mg
+#define Perl_sv_usepvn_mg pPerl->Perl_sv_usepvn_mg
+#undef sv_usepvn_mg
+#define sv_usepvn_mg Perl_sv_usepvn_mg
+#undef Perl_get_vtbl
+#define Perl_get_vtbl pPerl->Perl_get_vtbl
+#undef get_vtbl
+#define get_vtbl Perl_get_vtbl
+#undef Perl_dump_indent
+#define Perl_dump_indent pPerl->Perl_dump_indent
+#undef dump_indent
+#define dump_indent Perl_dump_indent
+#undef Perl_dump_vindent
+#define Perl_dump_vindent pPerl->Perl_dump_vindent
+#undef dump_vindent
+#define dump_vindent Perl_dump_vindent
+#undef Perl_do_gv_dump
+#define Perl_do_gv_dump pPerl->Perl_do_gv_dump
+#undef do_gv_dump
+#define do_gv_dump Perl_do_gv_dump
+#undef Perl_do_gvgv_dump
+#define Perl_do_gvgv_dump pPerl->Perl_do_gvgv_dump
+#undef do_gvgv_dump
+#define do_gvgv_dump Perl_do_gvgv_dump
+#undef Perl_do_hv_dump
+#define Perl_do_hv_dump pPerl->Perl_do_hv_dump
+#undef do_hv_dump
+#define do_hv_dump Perl_do_hv_dump
+#undef Perl_do_magic_dump
+#define Perl_do_magic_dump pPerl->Perl_do_magic_dump
+#undef do_magic_dump
+#define do_magic_dump Perl_do_magic_dump
+#undef Perl_do_op_dump
+#define Perl_do_op_dump pPerl->Perl_do_op_dump
+#undef do_op_dump
+#define do_op_dump Perl_do_op_dump
+#undef Perl_do_pmop_dump
+#define Perl_do_pmop_dump pPerl->Perl_do_pmop_dump
+#undef do_pmop_dump
+#define do_pmop_dump Perl_do_pmop_dump
+#undef Perl_do_sv_dump
+#define Perl_do_sv_dump pPerl->Perl_do_sv_dump
+#undef do_sv_dump
+#define do_sv_dump Perl_do_sv_dump
+#undef Perl_magic_dump
+#define Perl_magic_dump pPerl->Perl_magic_dump
+#undef magic_dump
+#define magic_dump Perl_magic_dump
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#undef Perl_default_protect
+#define Perl_default_protect pPerl->Perl_default_protect
+#undef default_protect
+#define default_protect Perl_default_protect
+#undef Perl_vdefault_protect
+#define Perl_vdefault_protect pPerl->Perl_vdefault_protect
+#undef vdefault_protect
+#define vdefault_protect Perl_vdefault_protect
+#endif
+#undef Perl_reginitcolors
+#define Perl_reginitcolors pPerl->Perl_reginitcolors
+#undef reginitcolors
+#define reginitcolors Perl_reginitcolors
+#undef Perl_sv_2pv_nolen
+#define Perl_sv_2pv_nolen pPerl->Perl_sv_2pv_nolen
+#undef sv_2pv_nolen
+#define sv_2pv_nolen Perl_sv_2pv_nolen
+#undef Perl_sv_2pvutf8_nolen
+#define Perl_sv_2pvutf8_nolen pPerl->Perl_sv_2pvutf8_nolen
+#undef sv_2pvutf8_nolen
+#define sv_2pvutf8_nolen Perl_sv_2pvutf8_nolen
+#undef Perl_sv_2pvbyte_nolen
+#define Perl_sv_2pvbyte_nolen pPerl->Perl_sv_2pvbyte_nolen
+#undef sv_2pvbyte_nolen
+#define sv_2pvbyte_nolen Perl_sv_2pvbyte_nolen
+#undef Perl_sv_pv
+#define Perl_sv_pv pPerl->Perl_sv_pv
+#undef sv_pv
+#define sv_pv Perl_sv_pv
+#undef Perl_sv_pvutf8
+#define Perl_sv_pvutf8 pPerl->Perl_sv_pvutf8
+#undef sv_pvutf8
+#define sv_pvutf8 Perl_sv_pvutf8
+#undef Perl_sv_pvbyte
+#define Perl_sv_pvbyte pPerl->Perl_sv_pvbyte
+#undef sv_pvbyte
+#define sv_pvbyte Perl_sv_pvbyte
+#undef Perl_sv_utf8_upgrade
+#define Perl_sv_utf8_upgrade pPerl->Perl_sv_utf8_upgrade
+#undef sv_utf8_upgrade
+#define sv_utf8_upgrade Perl_sv_utf8_upgrade
+#undef Perl_sv_utf8_downgrade
+#define Perl_sv_utf8_downgrade pPerl->Perl_sv_utf8_downgrade
+#undef sv_utf8_downgrade
+#define sv_utf8_downgrade Perl_sv_utf8_downgrade
+#undef Perl_sv_utf8_encode
+#define Perl_sv_utf8_encode pPerl->Perl_sv_utf8_encode
+#undef sv_utf8_encode
+#define sv_utf8_encode Perl_sv_utf8_encode
+#undef Perl_sv_utf8_decode
+#define Perl_sv_utf8_decode pPerl->Perl_sv_utf8_decode
+#undef sv_utf8_decode
+#define sv_utf8_decode Perl_sv_utf8_decode
+#undef Perl_sv_force_normal
+#define Perl_sv_force_normal pPerl->Perl_sv_force_normal
+#undef sv_force_normal
+#define sv_force_normal Perl_sv_force_normal
+#undef Perl_tmps_grow
+#define Perl_tmps_grow pPerl->Perl_tmps_grow
+#undef tmps_grow
+#define tmps_grow Perl_tmps_grow
+#undef Perl_sv_rvweaken
+#define Perl_sv_rvweaken pPerl->Perl_sv_rvweaken
+#undef sv_rvweaken
+#define sv_rvweaken Perl_sv_rvweaken
+#undef Perl_newANONATTRSUB
+#define Perl_newANONATTRSUB pPerl->Perl_newANONATTRSUB
+#undef newANONATTRSUB
+#define newANONATTRSUB Perl_newANONATTRSUB
+#undef Perl_newATTRSUB
+#define Perl_newATTRSUB pPerl->Perl_newATTRSUB
+#undef newATTRSUB
+#define newATTRSUB Perl_newATTRSUB
+#undef Perl_newMYSUB
+#define Perl_newMYSUB pPerl->Perl_newMYSUB
+#undef newMYSUB
+#define newMYSUB Perl_newMYSUB
+#if defined(USE_ITHREADS)
+#undef Perl_cx_dup
+#define Perl_cx_dup pPerl->Perl_cx_dup
+#undef cx_dup
+#define cx_dup Perl_cx_dup
+#undef Perl_si_dup
+#define Perl_si_dup pPerl->Perl_si_dup
+#undef si_dup
+#define si_dup Perl_si_dup
+#undef Perl_ss_dup
+#define Perl_ss_dup pPerl->Perl_ss_dup
+#undef ss_dup
+#define ss_dup Perl_ss_dup
+#undef Perl_any_dup
+#define Perl_any_dup pPerl->Perl_any_dup
+#undef any_dup
+#define any_dup Perl_any_dup
+#undef Perl_he_dup
+#define Perl_he_dup pPerl->Perl_he_dup
+#undef he_dup
+#define he_dup Perl_he_dup
+#undef Perl_re_dup
+#define Perl_re_dup pPerl->Perl_re_dup
+#undef re_dup
+#define re_dup Perl_re_dup
+#undef Perl_fp_dup
+#define Perl_fp_dup pPerl->Perl_fp_dup
+#undef fp_dup
+#define fp_dup Perl_fp_dup
+#undef Perl_dirp_dup
+#define Perl_dirp_dup pPerl->Perl_dirp_dup
+#undef dirp_dup
+#define dirp_dup Perl_dirp_dup
+#undef Perl_gp_dup
+#define Perl_gp_dup pPerl->Perl_gp_dup
+#undef gp_dup
+#define gp_dup Perl_gp_dup
+#undef Perl_mg_dup
+#define Perl_mg_dup pPerl->Perl_mg_dup
+#undef mg_dup
+#define mg_dup Perl_mg_dup
+#undef Perl_sv_dup
+#define Perl_sv_dup pPerl->Perl_sv_dup
+#undef sv_dup
+#define sv_dup Perl_sv_dup
+#if defined(HAVE_INTERP_INTERN)
+#undef Perl_sys_intern_dup
+#define Perl_sys_intern_dup pPerl->Perl_sys_intern_dup
+#undef sys_intern_dup
+#define sys_intern_dup Perl_sys_intern_dup
+#endif
+#undef Perl_ptr_table_new
+#define Perl_ptr_table_new pPerl->Perl_ptr_table_new
+#undef ptr_table_new
+#define ptr_table_new Perl_ptr_table_new
+#undef Perl_ptr_table_fetch
+#define Perl_ptr_table_fetch pPerl->Perl_ptr_table_fetch
+#undef ptr_table_fetch
+#define ptr_table_fetch Perl_ptr_table_fetch
+#undef Perl_ptr_table_store
+#define Perl_ptr_table_store pPerl->Perl_ptr_table_store
+#undef ptr_table_store
+#define ptr_table_store Perl_ptr_table_store
+#undef Perl_ptr_table_split
+#define Perl_ptr_table_split pPerl->Perl_ptr_table_split
+#undef ptr_table_split
+#define ptr_table_split Perl_ptr_table_split
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+# if defined(PL_OP_SLAB_ALLOC)
+# endif
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+# if defined(IAMSUID)
+# endif
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#endif
+# if defined(USE_THREADS)
+# endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#endif
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+# endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+# if defined(DEBUGGING)
+# endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#if 0
+#endif
+# if defined(CRIPPLED_CC)
+# endif
+# if defined(PERL_CR_FILTER)
+# endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+# if defined(LEAKTEST)
+# endif
+#endif
+#if defined(PERL_OBJECT)
#endif
-#undef ErrorNo
-#define ErrorNo pPerl->ErrorNo
-#undef NtCrypt
-#define NtCrypt pPerl->NtCrypt
-#undef NtGetLib
-#define NtGetLib pPerl->NtGetLib
-#undef NtGetArchLib
-#define NtGetArchLib pPerl->NtGetArchLib
-#undef NtGetSiteLib
-#define NtGetSiteLib pPerl->NtGetSiteLib
-#undef NtGetBin
-#define NtGetBin pPerl->NtGetBin
-#undef NtGetDebugScriptStr
-#define NtGetDebugScriptStr pPerl->NtGetDebugScriptStr
-#endif /* WIN32 */
-
-#endif /* __objXSUB_h__ */
-
+#endif /* PERL_CORE && PERL_OBJECT */
+#endif /* __objXSUB_h__ */
diff --git a/contrib/perl5/op.c b/contrib/perl5/op.c
index bf944a6..1cfc6dd 100644
--- a/contrib/perl5/op.c
+++ b/contrib/perl5/op.c
@@ -1,6 +1,6 @@
/* op.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -16,14 +16,33 @@
*/
#include "EXTERN.h"
+#define PERL_IN_OP_C
#include "perl.h"
-
-#ifdef PERL_OBJECT
-#define CHECKCALL this->*check
-#else
-#define CHECKCALL *check
+#include "keywords.h"
+
+/* #define PL_OP_SLAB_ALLOC */
+
+#ifdef PL_OP_SLAB_ALLOC
+#define SLAB_SIZE 8192
+static char *PL_OpPtr = NULL;
+static int PL_OpSpace = 0;
+#define NewOp(m,var,c,type) do { if ((PL_OpSpace -= c*sizeof(type)) >= 0) \
+ var = (type *)(PL_OpPtr -= c*sizeof(type)); \
+ else \
+ var = (type *) Slab_Alloc(m,c*sizeof(type)); \
+ } while (0)
+
+STATIC void *
+S_Slab_Alloc(pTHX_ int m, size_t sz)
+{
+ Newz(m,PL_OpPtr,SLAB_SIZE,char);
+ PL_OpSpace = SLAB_SIZE - sz;
+ return PL_OpPtr += PL_OpSpace;
+}
+
+#else
+#define NewOp(m, var, c, type) Newz(m, var, c, type)
#endif
-
/*
* In the following definition, the ", Nullop" is just to make the compiler
* think the expression is of the right type: croak actually does a Siglongjmp.
@@ -31,117 +50,129 @@
#define CHECKOP(type,o) \
((PL_op_mask && PL_op_mask[type]) \
? ( op_free((OP*)o), \
- croak("%s trapped by operation mask", op_desc[type]), \
+ Perl_croak(aTHX_ "%s trapped by operation mask", PL_op_desc[type]), \
Nullop ) \
- : (CHECKCALL[type])((OP*)o))
+ : CALL_FPTR(PL_check[type])(aTHX_ (OP*)o))
#define PAD_MAX 999999999
-static bool scalar_mod_type _((OP *o, I32 type));
-#ifndef PERL_OBJECT
-static I32 list_assignment _((OP *o));
-static void bad_type _((I32 n, char *t, char *name, OP *kid));
-static OP *modkids _((OP *o, I32 type));
-static OP *no_fh_allowed _((OP *o));
-static OP *scalarboolean _((OP *o));
-static OP *too_few_arguments _((OP *o, char* name));
-static OP *too_many_arguments _((OP *o, char* name));
-static void null _((OP* o));
-static PADOFFSET pad_findlex _((char* name, PADOFFSET newoff, U32 seq,
- CV* startcv, I32 cx_ix, I32 saweval, U32 flags));
-static OP *newDEFSVOP _((void));
-static OP *new_logop _((I32 type, I32 flags, OP **firstp, OP **otherp));
-#endif
-
STATIC char*
-gv_ename(GV *gv)
+S_gv_ename(pTHX_ GV *gv)
{
- SV* tmpsv = sv_newmortal();
STRLEN n_a;
+ SV* tmpsv = sv_newmortal();
gv_efullname3(tmpsv, gv, Nullch);
return SvPV(tmpsv,n_a);
}
STATIC OP *
-no_fh_allowed(OP *o)
+S_no_fh_allowed(pTHX_ OP *o)
{
- yyerror(form("Missing comma after first argument to %s function",
- op_desc[o->op_type]));
+ yyerror(Perl_form(aTHX_ "Missing comma after first argument to %s function",
+ PL_op_desc[o->op_type]));
return o;
}
STATIC OP *
-too_few_arguments(OP *o, char *name)
+S_too_few_arguments(pTHX_ OP *o, char *name)
{
- yyerror(form("Not enough arguments for %s", name));
+ yyerror(Perl_form(aTHX_ "Not enough arguments for %s", name));
return o;
}
STATIC OP *
-too_many_arguments(OP *o, char *name)
+S_too_many_arguments(pTHX_ OP *o, char *name)
{
- yyerror(form("Too many arguments for %s", name));
+ yyerror(Perl_form(aTHX_ "Too many arguments for %s", name));
return o;
}
STATIC void
-bad_type(I32 n, char *t, char *name, OP *kid)
+S_bad_type(pTHX_ I32 n, char *t, char *name, OP *kid)
{
- yyerror(form("Type of arg %d to %s must be %s (not %s)",
- (int)n, name, t, op_desc[kid->op_type]));
+ yyerror(Perl_form(aTHX_ "Type of arg %d to %s must be %s (not %s)",
+ (int)n, name, t, PL_op_desc[kid->op_type]));
}
-void
-assertref(OP *o)
+STATIC void
+S_no_bareword_allowed(pTHX_ OP *o)
{
- int type = o->op_type;
- if (type != OP_AELEM && type != OP_HELEM && type != OP_GELEM) {
- yyerror(form("Can't use subscript on %s", op_desc[type]));
- if (type == OP_ENTERSUB || type == OP_RV2HV || type == OP_PADHV) {
- dTHR;
- SV *msg = sv_2mortal(
- newSVpvf("(Did you mean $ or @ instead of %c?)\n",
- type == OP_ENTERSUB ? '&' : '%'));
- if (PL_in_eval & 2)
- warn("%_", msg);
- else if (PL_in_eval)
- sv_catsv(GvSV(PL_errgv), msg);
- else
- PerlIO_write(PerlIO_stderr(), SvPVX(msg), SvCUR(msg));
- }
- }
+ qerror(Perl_mess(aTHX_
+ "Bareword \"%s\" not allowed while \"strict subs\" in use",
+ SvPV_nolen(cSVOPo_sv)));
}
/* "register" allocation */
PADOFFSET
-pad_allocmy(char *name)
+Perl_pad_allocmy(pTHX_ char *name)
{
dTHR;
PADOFFSET off;
SV *sv;
- if (!(isALPHA(name[1]) || name[1] == '_' && (int)strlen(name) > 2)) {
- if (!isPRINT(name[1])) {
- name[3] = '\0';
+ if (!(PL_in_my == KEY_our ||
+ isALPHA(name[1]) ||
+ (PL_hints & HINT_UTF8 && (name[1] & 0xc0) == 0xc0) ||
+ (name[1] == '_' && (int)strlen(name) > 2)))
+ {
+ if (!isPRINT(name[1]) || strchr("\t\n\r\f", name[1])) {
+ /* 1999-02-27 mjd@plover.com */
+ char *p;
+ p = strchr(name, '\0');
+ /* The next block assumes the buffer is at least 205 chars
+ long. At present, it's always at least 256 chars. */
+ if (p-name > 200) {
+ strcpy(name+200, "...");
+ p = name+199;
+ }
+ else {
+ p[1] = '\0';
+ }
+ /* Move everything else down one character */
+ for (; p-name > 2; p--)
+ *p = *(p-1);
name[2] = toCTRL(name[1]);
name[1] = '^';
}
- croak("Can't use global %s in \"my\"",name);
+ yyerror(Perl_form(aTHX_ "Can't use global %s in \"my\"",name));
}
- if (PL_dowarn && AvFILLp(PL_comppad_name) >= 0) {
+ if (ckWARN(WARN_MISC) && AvFILLp(PL_comppad_name) >= 0) {
SV **svp = AvARRAY(PL_comppad_name);
- for (off = AvFILLp(PL_comppad_name); off > PL_comppad_name_floor; off--) {
+ HV *ourstash = (PL_curstash ? PL_curstash : PL_defstash);
+ PADOFFSET top = AvFILLp(PL_comppad_name);
+ for (off = top; off > PL_comppad_name_floor; off--) {
if ((sv = svp[off])
&& sv != &PL_sv_undef
&& (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0)
+ && (PL_in_my != KEY_our
+ || ((SvFLAGS(sv) & SVpad_OUR) && GvSTASH(sv) == ourstash))
&& strEQ(name, SvPVX(sv)))
{
- warn("\"my\" variable %s masks earlier declaration in same %s",
- name, (SvIVX(sv) == PAD_MAX ? "scope" : "statement"));
+ Perl_warner(aTHX_ WARN_MISC,
+ "\"%s\" variable %s masks earlier declaration in same %s",
+ (PL_in_my == KEY_our ? "our" : "my"),
+ name,
+ (SvIVX(sv) == PAD_MAX ? "scope" : "statement"));
+ --off;
break;
}
}
+ if (PL_in_my == KEY_our) {
+ do {
+ if ((sv = svp[off])
+ && sv != &PL_sv_undef
+ && ((SvFLAGS(sv) & SVpad_OUR) && GvSTASH(sv) == ourstash)
+ && strEQ(name, SvPVX(sv)))
+ {
+ Perl_warner(aTHX_ WARN_MISC,
+ "\"our\" variable %s redeclared", name);
+ Perl_warner(aTHX_ WARN_MISC,
+ "\t(Did you mean \"local\" instead of \"our\"?)\n");
+ break;
+ }
+ } while ( off-- > 0 );
+ }
}
off = pad_alloc(OP_PADSV, SVs_PADMY);
sv = NEWSV(1102,0);
@@ -149,14 +180,20 @@ pad_allocmy(char *name)
sv_setpv(sv, name);
if (PL_in_my_stash) {
if (*name != '$')
- croak("Can't declare class for non-scalar %s in \"my\"",name);
+ yyerror(Perl_form(aTHX_ "Can't declare class for non-scalar %s in \"%s\"",
+ name, PL_in_my == KEY_our ? "our" : "my"));
SvOBJECT_on(sv);
(void)SvUPGRADE(sv, SVt_PVMG);
SvSTASH(sv) = (HV*)SvREFCNT_inc(PL_in_my_stash);
PL_sv_objcount++;
}
+ if (PL_in_my == KEY_our) {
+ (void)SvUPGRADE(sv, SVt_PVGV);
+ GvSTASH(sv) = (HV*)SvREFCNT_inc(PL_curstash ? (SV*)PL_curstash : (SV*)PL_defstash);
+ SvFLAGS(sv) |= SVpad_OUR;
+ }
av_store(PL_comppad_name, off, sv);
- SvNVX(sv) = (double)PAD_MAX;
+ SvNVX(sv) = (NV)PAD_MAX;
SvIVX(sv) = 0; /* Not yet introduced--see newSTATEOP */
if (!PL_min_intro_pending)
PL_min_intro_pending = off;
@@ -169,11 +206,36 @@ pad_allocmy(char *name)
return off;
}
+STATIC PADOFFSET
+S_pad_addlex(pTHX_ SV *proto_namesv)
+{
+ SV *namesv = NEWSV(1103,0);
+ PADOFFSET newoff = pad_alloc(OP_PADSV, SVs_PADMY);
+ sv_upgrade(namesv, SVt_PVNV);
+ sv_setpv(namesv, SvPVX(proto_namesv));
+ av_store(PL_comppad_name, newoff, namesv);
+ SvNVX(namesv) = (NV)PL_curcop->cop_seq;
+ SvIVX(namesv) = PAD_MAX; /* A ref, intro immediately */
+ SvFAKE_on(namesv); /* A ref, not a real var */
+ if (SvFLAGS(proto_namesv) & SVpad_OUR) { /* An "our" variable */
+ SvFLAGS(namesv) |= SVpad_OUR;
+ (void)SvUPGRADE(namesv, SVt_PVGV);
+ GvSTASH(namesv) = (HV*)SvREFCNT_inc((SV*)GvSTASH(proto_namesv));
+ }
+ if (SvOBJECT(proto_namesv)) { /* A typed var */
+ SvOBJECT_on(namesv);
+ (void)SvUPGRADE(namesv, SVt_PVMG);
+ SvSTASH(namesv) = (HV*)SvREFCNT_inc((SV*)SvSTASH(proto_namesv));
+ PL_sv_objcount++;
+ }
+ return newoff;
+}
+
#define FINDLEX_NOSEARCH 1 /* don't search outer contexts */
STATIC PADOFFSET
-pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 saweval,
- U32 flags)
+S_pad_findlex(pTHX_ char *name, PADOFFSET newoff, U32 seq, CV* startcv,
+ I32 cx_ix, I32 saweval, U32 flags)
{
dTHR;
CV *cv;
@@ -211,23 +273,10 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 s
}
depth = 1;
}
- oldpad = (AV*)*av_fetch(curlist, depth, FALSE);
+ oldpad = (AV*)AvARRAY(curlist)[depth];
oldsv = *av_fetch(oldpad, off, TRUE);
if (!newoff) { /* Not a mere clone operation. */
- SV *namesv = NEWSV(1103,0);
- newoff = pad_alloc(OP_PADSV, SVs_PADMY);
- sv_upgrade(namesv, SVt_PVNV);
- sv_setpv(namesv, name);
- av_store(PL_comppad_name, newoff, namesv);
- SvNVX(namesv) = (double)PL_curcop->cop_seq;
- SvIVX(namesv) = PAD_MAX; /* A ref, intro immediately */
- SvFAKE_on(namesv); /* A ref, not a real var */
- if (SvOBJECT(svp[off])) { /* A typed var */
- SvOBJECT_on(namesv);
- (void)SvUPGRADE(namesv, SVt_PVMG);
- SvSTASH(namesv) = (HV*)SvREFCNT_inc((SV*)SvSTASH(svp[off]));
- PL_sv_objcount++;
- }
+ newoff = pad_addlex(sv);
if (CvANON(PL_compcv) || SvTYPE(PL_compcv) == SVt_PVFM) {
/* "It's closures all the way down." */
CvCLONE_on(PL_compcv);
@@ -241,13 +290,28 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 s
bcv && bcv != cv && !CvCLONE(bcv);
bcv = CvOUTSIDE(bcv))
{
- if (CvANON(bcv))
+ if (CvANON(bcv)) {
+ /* install the missing pad entry in intervening
+ * nested subs and mark them cloneable.
+ * XXX fix pad_foo() to not use globals */
+ AV *ocomppad_name = PL_comppad_name;
+ AV *ocomppad = PL_comppad;
+ SV **ocurpad = PL_curpad;
+ AV *padlist = CvPADLIST(bcv);
+ PL_comppad_name = (AV*)AvARRAY(padlist)[0];
+ PL_comppad = (AV*)AvARRAY(padlist)[1];
+ PL_curpad = AvARRAY(PL_comppad);
+ pad_addlex(sv);
+ PL_comppad_name = ocomppad_name;
+ PL_comppad = ocomppad;
+ PL_curpad = ocurpad;
CvCLONE_on(bcv);
+ }
else {
- if (PL_dowarn
+ if (ckWARN(WARN_CLOSURE)
&& !CvUNIQUE(bcv) && !CvUNIQUE(cv))
{
- warn(
+ Perl_warner(aTHX_ WARN_CLOSURE,
"Variable \"%s\" may be unavailable",
name);
}
@@ -257,8 +321,9 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 s
}
}
else if (!CvUNIQUE(PL_compcv)) {
- if (PL_dowarn && !SvFAKE(sv) && !CvUNIQUE(cv))
- warn("Variable \"%s\" will not stay shared", name);
+ if (ckWARN(WARN_CLOSURE) && !SvFAKE(sv) && !CvUNIQUE(cv))
+ Perl_warner(aTHX_ WARN_CLOSURE,
+ "Variable \"%s\" will not stay shared", name);
}
}
av_store(PL_comppad, newoff, SvREFCNT_inc(oldsv));
@@ -290,11 +355,13 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 s
if (CxREALEVAL(cx))
saweval = i;
break;
+ case OP_DOFILE:
case OP_REQUIRE:
- /* require must have its own scope */
+ /* require/do must have their own scope */
return 0;
}
break;
+ case CXt_FORMAT:
case CXt_SUB:
if (!saweval)
return 0;
@@ -312,7 +379,7 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 s
}
PADOFFSET
-pad_findmy(char *name)
+Perl_pad_findmy(pTHX_ char *name)
{
dTHR;
I32 off;
@@ -345,7 +412,7 @@ pad_findmy(char *name)
seq > I_32(SvNVX(sv)))) &&
strEQ(SvPVX(sv), name))
{
- if (SvIVX(sv))
+ if (SvIVX(sv) || SvFLAGS(sv) & SVpad_OUR)
return (PADOFFSET)off;
pendoff = off; /* this pending def. will override import */
}
@@ -375,15 +442,16 @@ pad_findmy(char *name)
}
void
-pad_leavemy(I32 fill)
+Perl_pad_leavemy(pTHX_ I32 fill)
{
+ dTHR;
I32 off;
SV **svp = AvARRAY(PL_comppad_name);
SV *sv;
if (PL_min_intro_pending && fill < PL_min_intro_pending) {
for (off = PL_max_intro_pending; off >= PL_min_intro_pending; off--) {
- if ((sv = svp[off]) && sv != &PL_sv_undef)
- warn("%s never introduced", SvPVX(sv));
+ if ((sv = svp[off]) && sv != &PL_sv_undef && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "%s never introduced", SvPVX(sv));
}
}
/* "Deintroduce" my variables that are leaving with this scope. */
@@ -394,14 +462,14 @@ pad_leavemy(I32 fill)
}
PADOFFSET
-pad_alloc(I32 optype, U32 tmptype)
+Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype)
{
dTHR;
SV *sv;
I32 retval;
if (AvARRAY(PL_comppad) != PL_curpad)
- croak("panic: pad_alloc");
+ Perl_croak(aTHX_ "panic: pad_alloc");
if (PL_pad_reset_pending)
pad_reset();
if (tmptype & SVs_PADMY) {
@@ -423,7 +491,7 @@ pad_alloc(I32 optype, U32 tmptype)
(sv = names[PL_padix]) && sv != &PL_sv_undef)
continue;
sv = *av_fetch(PL_comppad, PL_padix, TRUE);
- if (!(SvFLAGS(sv) & (SVs_PADTMP|SVs_PADMY)))
+ if (!(SvFLAGS(sv) & (SVs_PADTMP|SVs_PADMY)) && !IS_PADGV(sv))
break;
}
retval = PL_padix;
@@ -431,70 +499,79 @@ pad_alloc(I32 optype, U32 tmptype)
SvFLAGS(sv) |= tmptype;
PL_curpad = AvARRAY(PL_comppad);
#ifdef USE_THREADS
- DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx alloc %ld for %s\n",
- (unsigned long) thr, (unsigned long) PL_curpad,
- (long) retval, op_name[optype]));
+ DEBUG_X(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" Pad 0x%"UVxf" alloc %ld for %s\n",
+ PTR2UV(thr), PTR2UV(PL_curpad),
+ (long) retval, PL_op_name[optype]));
#else
- DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%lx alloc %ld for %s\n",
- (unsigned long) PL_curpad,
- (long) retval, op_name[optype]));
+ DEBUG_X(PerlIO_printf(Perl_debug_log,
+ "Pad 0x%"UVxf" alloc %ld for %s\n",
+ PTR2UV(PL_curpad),
+ (long) retval, PL_op_name[optype]));
#endif /* USE_THREADS */
return (PADOFFSET)retval;
}
SV *
-pad_sv(PADOFFSET po)
+Perl_pad_sv(pTHX_ PADOFFSET po)
{
dTHR;
#ifdef USE_THREADS
- DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx sv %d\n",
- (unsigned long) thr, (unsigned long) PL_curpad, po));
+ DEBUG_X(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" Pad 0x%"UVxf" sv %"IVdf"\n",
+ PTR2UV(thr), PTR2UV(PL_curpad), (IV)po));
#else
if (!po)
- croak("panic: pad_sv po");
- DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%lx sv %d\n",
- (unsigned long) PL_curpad, po));
+ Perl_croak(aTHX_ "panic: pad_sv po");
+ DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%"UVxf" sv %"IVdf"\n",
+ PTR2UV(PL_curpad), (IV)po));
#endif /* USE_THREADS */
return PL_curpad[po]; /* eventually we'll turn this into a macro */
}
void
-pad_free(PADOFFSET po)
+Perl_pad_free(pTHX_ PADOFFSET po)
{
dTHR;
if (!PL_curpad)
return;
if (AvARRAY(PL_comppad) != PL_curpad)
- croak("panic: pad_free curpad");
+ Perl_croak(aTHX_ "panic: pad_free curpad");
if (!po)
- croak("panic: pad_free po");
+ Perl_croak(aTHX_ "panic: pad_free po");
#ifdef USE_THREADS
- DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx free %d\n",
- (unsigned long) thr, (unsigned long) PL_curpad, po));
+ DEBUG_X(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" Pad 0x%"UVxf" free %"IVdf"\n",
+ PTR2UV(thr), PTR2UV(PL_curpad), (IV)po));
#else
- DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%lx free %d\n",
- (unsigned long) PL_curpad, po));
+ DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%"UVxf" free %"IVdf"\n",
+ PTR2UV(PL_curpad), (IV)po));
#endif /* USE_THREADS */
- if (PL_curpad[po] && PL_curpad[po] != &PL_sv_undef)
+ if (PL_curpad[po] && PL_curpad[po] != &PL_sv_undef) {
SvPADTMP_off(PL_curpad[po]);
+#ifdef USE_ITHREADS
+ SvREADONLY_off(PL_curpad[po]); /* could be a freed constant */
+#endif
+ }
if ((I32)po < PL_padix)
PL_padix = po - 1;
}
void
-pad_swipe(PADOFFSET po)
+Perl_pad_swipe(pTHX_ PADOFFSET po)
{
dTHR;
if (AvARRAY(PL_comppad) != PL_curpad)
- croak("panic: pad_swipe curpad");
+ Perl_croak(aTHX_ "panic: pad_swipe curpad");
if (!po)
- croak("panic: pad_swipe po");
+ Perl_croak(aTHX_ "panic: pad_swipe po");
#ifdef USE_THREADS
- DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx swipe %d\n",
- (unsigned long) thr, (unsigned long) PL_curpad, po));
+ DEBUG_X(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" Pad 0x%"UVxf" swipe %"IVdf"\n",
+ PTR2UV(thr), PTR2UV(PL_curpad), (IV)po));
#else
- DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%lx swipe %d\n",
- (unsigned long) PL_curpad, po));
+ DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%"UVxf" swipe %"IVdf"\n",
+ PTR2UV(PL_curpad), (IV)po));
#endif /* USE_THREADS */
SvPADTMP_off(PL_curpad[po]);
PL_curpad[po] = NEWSV(1107,0);
@@ -510,20 +587,21 @@ pad_swipe(PADOFFSET po)
* We avoid doing this until we can think of a Better Way.
* GSAR 97-10-29 */
void
-pad_reset(void)
+Perl_pad_reset(pTHX)
{
#ifdef USE_BROKEN_PAD_RESET
dTHR;
register I32 po;
if (AvARRAY(PL_comppad) != PL_curpad)
- croak("panic: pad_reset curpad");
+ Perl_croak(aTHX_ "panic: pad_reset curpad");
#ifdef USE_THREADS
- DEBUG_X(PerlIO_printf(Perl_debug_log, "0x%lx Pad 0x%lx reset\n",
- (unsigned long) thr, (unsigned long) PL_curpad));
+ DEBUG_X(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" Pad 0x%"UVxf" reset\n",
+ PTR2UV(thr), PTR2UV(PL_curpad)));
#else
- DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%lx reset\n",
- (unsigned long) PL_curpad));
+ DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%"UVxf" reset\n",
+ PTR2UV(PL_curpad)));
#endif /* USE_THREADS */
if (!PL_tainting) { /* Can't mix tainted and non-tainted temporaries. */
for (po = AvMAX(PL_comppad); po > PL_padix_floor; po--) {
@@ -539,7 +617,7 @@ pad_reset(void)
#ifdef USE_THREADS
/* find_threadsv is not reentrant */
PADOFFSET
-find_threadsv(char *name)
+Perl_find_threadsv(pTHX_ const char *name)
{
dTHR;
char *p;
@@ -595,7 +673,7 @@ find_threadsv(char *name)
default:
sv_magic(sv, 0, 0, name, 1);
}
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_error_log,
"find_threadsv: new SV %p for $%s%c\n",
sv, (*name < 32) ? "^" : "",
(*name < 32) ? toCTRL(*name) : *name));
@@ -607,53 +685,104 @@ find_threadsv(char *name)
/* Destructor */
void
-op_free(OP *o)
+Perl_op_free(pTHX_ OP *o)
{
register OP *kid, *nextkid;
+ OPCODE type;
if (!o || o->op_seq == (U16)-1)
return;
+ if (o->op_private & OPpREFCOUNTED) {
+ switch (o->op_type) {
+ case OP_LEAVESUB:
+ case OP_LEAVESUBLV:
+ case OP_LEAVEEVAL:
+ case OP_LEAVE:
+ case OP_SCOPE:
+ case OP_LEAVEWRITE:
+ OP_REFCNT_LOCK;
+ if (OpREFCNT_dec(o)) {
+ OP_REFCNT_UNLOCK;
+ return;
+ }
+ OP_REFCNT_UNLOCK;
+ break;
+ default:
+ break;
+ }
+ }
+
if (o->op_flags & OPf_KIDS) {
for (kid = cUNOPo->op_first; kid; kid = nextkid) {
nextkid = kid->op_sibling; /* Get before next freeing kid */
op_free(kid);
}
}
+ type = o->op_type;
+ if (type == OP_NULL)
+ type = o->op_targ;
+
+ /* COP* is not cleared by op_clear() so that we may track line
+ * numbers etc even after null() */
+ if (type == OP_NEXTSTATE || type == OP_SETSTATE || type == OP_DBSTATE)
+ cop_free((COP*)o);
+ op_clear(o);
+
+#ifdef PL_OP_SLAB_ALLOC
+ if ((char *) o == PL_OpPtr)
+ {
+ }
+#else
+ Safefree(o);
+#endif
+}
+
+STATIC void
+S_op_clear(pTHX_ OP *o)
+{
switch (o->op_type) {
- case OP_NULL:
- o->op_targ = 0; /* Was holding old type, if any. */
- break;
- case OP_ENTEREVAL:
- o->op_targ = 0; /* Was holding hints. */
+ case OP_NULL: /* Was holding old type, if any. */
+ case OP_ENTEREVAL: /* Was holding hints. */
+#ifdef USE_THREADS
+ case OP_THREADSV: /* Was holding index into thr->threadsv AV. */
+#endif
+ o->op_targ = 0;
break;
#ifdef USE_THREADS
case OP_ENTERITER:
if (!(o->op_flags & OPf_SPECIAL))
break;
/* FALL THROUGH */
- case OP_THREADSV:
- o->op_targ = 0; /* Was holding index into thr->threadsv AV. */
- break;
#endif /* USE_THREADS */
default:
if (!(o->op_flags & OPf_REF)
- || (check[o->op_type] != FUNC_NAME_TO_PTR(ck_ftst)))
+ || (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)))
break;
/* FALL THROUGH */
case OP_GVSV:
case OP_GV:
case OP_AELEMFAST:
- SvREFCNT_dec(cGVOPo->op_gv);
- break;
- case OP_NEXTSTATE:
- case OP_DBSTATE:
- Safefree(cCOPo->cop_label);
- SvREFCNT_dec(cCOPo->cop_filegv);
+#ifdef USE_ITHREADS
+ if (cPADOPo->op_padix > 0) {
+ if (PL_curpad) {
+ GV *gv = cGVOPo_gv;
+ pad_swipe(cPADOPo->op_padix);
+ /* No GvIN_PAD_off(gv) here, because other references may still
+ * exist on the pad */
+ SvREFCNT_dec(gv);
+ }
+ cPADOPo->op_padix = 0;
+ }
+#else
+ SvREFCNT_dec(cSVOPo->op_sv);
+ cSVOPo->op_sv = Nullsv;
+#endif
break;
case OP_CONST:
SvREFCNT_dec(cSVOPo->op_sv);
+ cSVOPo->op_sv = Nullsv;
break;
case OP_GOTO:
case OP_NEXT:
@@ -663,32 +792,72 @@ op_free(OP *o)
break;
/* FALL THROUGH */
case OP_TRANS:
- Safefree(cPVOPo->op_pv);
+ if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
+ SvREFCNT_dec(cSVOPo->op_sv);
+ cSVOPo->op_sv = Nullsv;
+ }
+ else {
+ Safefree(cPVOPo->op_pv);
+ cPVOPo->op_pv = Nullch;
+ }
break;
case OP_SUBST:
op_free(cPMOPo->op_pmreplroot);
- /* FALL THROUGH */
+ goto clear_pmop;
case OP_PUSHRE:
+#ifdef USE_ITHREADS
+ if ((PADOFFSET)cPMOPo->op_pmreplroot) {
+ if (PL_curpad) {
+ GV *gv = (GV*)PL_curpad[(PADOFFSET)cPMOPo->op_pmreplroot];
+ pad_swipe((PADOFFSET)cPMOPo->op_pmreplroot);
+ /* No GvIN_PAD_off(gv) here, because other references may still
+ * exist on the pad */
+ SvREFCNT_dec(gv);
+ }
+ }
+#else
+ SvREFCNT_dec((SV*)cPMOPo->op_pmreplroot);
+#endif
+ /* FALL THROUGH */
case OP_MATCH:
case OP_QR:
+clear_pmop:
+ cPMOPo->op_pmreplroot = Nullop;
ReREFCNT_dec(cPMOPo->op_pmregexp);
+ cPMOPo->op_pmregexp = (REGEXP*)NULL;
break;
}
- if (o->op_targ > 0)
+ if (o->op_targ > 0) {
pad_free(o->op_targ);
+ o->op_targ = 0;
+ }
+}
- Safefree(o);
+STATIC void
+S_cop_free(pTHX_ COP* cop)
+{
+ Safefree(cop->cop_label);
+#ifdef USE_ITHREADS
+ Safefree(CopFILE(cop)); /* XXXXX share in a pvtable? */
+ Safefree(CopSTASHPV(cop)); /* XXXXX share in a pvtable? */
+#else
+ /* NOTE: COP.cop_stash is not refcounted */
+ SvREFCNT_dec(CopFILEGV(cop));
+#endif
+ if (! specialWARN(cop->cop_warnings))
+ SvREFCNT_dec(cop->cop_warnings);
}
STATIC void
-null(OP *o)
+S_null(pTHX_ OP *o)
{
- if (o->op_type != OP_NULL && o->op_type != OP_THREADSV && o->op_targ > 0)
- pad_free(o->op_targ);
+ if (o->op_type == OP_NULL)
+ return;
+ op_clear(o);
o->op_targ = o->op_type;
o->op_type = OP_NULL;
- o->op_ppaddr = ppaddr[OP_NULL];
+ o->op_ppaddr = PL_ppaddr[OP_NULL];
}
/* Contextualizers */
@@ -696,7 +865,7 @@ null(OP *o)
#define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
OP *
-linklist(OP *o)
+Perl_linklist(pTHX_ OP *o)
{
register OP *kid;
@@ -720,7 +889,7 @@ linklist(OP *o)
}
OP *
-scalarkids(OP *o)
+Perl_scalarkids(pTHX_ OP *o)
{
OP *kid;
if (o && o->op_flags & OPf_KIDS) {
@@ -731,30 +900,33 @@ scalarkids(OP *o)
}
STATIC OP *
-scalarboolean(OP *o)
+S_scalarboolean(pTHX_ OP *o)
{
- if (PL_dowarn &&
- o->op_type == OP_SASSIGN && cBINOPo->op_first->op_type == OP_CONST) {
+ if (o->op_type == OP_SASSIGN && cBINOPo->op_first->op_type == OP_CONST) {
dTHR;
- line_t oldline = PL_curcop->cop_line;
+ if (ckWARN(WARN_SYNTAX)) {
+ line_t oldline = CopLINE(PL_curcop);
- if (PL_copline != NOLINE)
- PL_curcop->cop_line = PL_copline;
- warn("Found = in conditional, should be ==");
- PL_curcop->cop_line = oldline;
+ if (PL_copline != NOLINE)
+ CopLINE_set(PL_curcop, PL_copline);
+ Perl_warner(aTHX_ WARN_SYNTAX, "Found = in conditional, should be ==");
+ CopLINE_set(PL_curcop, oldline);
+ }
}
return scalar(o);
}
OP *
-scalar(OP *o)
+Perl_scalar(pTHX_ OP *o)
{
OP *kid;
/* assumes no premature commitment */
if (!o || (o->op_flags & OPf_WANT) || PL_error_count
|| o->op_type == OP_RETURN)
+ {
return o;
+ }
o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
@@ -790,7 +962,7 @@ scalar(OP *o)
case OP_LEAVETRY:
kid = cLISTOPo->op_first;
scalar(kid);
- while (kid = kid->op_sibling) {
+ while ((kid = kid->op_sibling)) {
if (kid->op_sibling)
scalarvoid(kid);
else
@@ -814,23 +986,43 @@ scalar(OP *o)
}
OP *
-scalarvoid(OP *o)
+Perl_scalarvoid(pTHX_ OP *o)
{
OP *kid;
char* useless = 0;
SV* sv;
+ U8 want;
+
+ if (o->op_type == OP_NEXTSTATE
+ || o->op_type == OP_SETSTATE
+ || o->op_type == OP_DBSTATE
+ || (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
+ || o->op_targ == OP_SETSTATE
+ || o->op_targ == OP_DBSTATE)))
+ {
+ dTHR;
+ PL_curcop = (COP*)o; /* for warning below */
+ }
/* assumes no premature commitment */
- U8 want = o->op_flags & OPf_WANT;
- if (!o || (want && want != OPf_WANT_SCALAR) || PL_error_count
+ want = o->op_flags & OPf_WANT;
+ if ((want && want != OPf_WANT_SCALAR) || PL_error_count
|| o->op_type == OP_RETURN)
+ {
return o;
+ }
+ if ((o->op_private & OPpTARGET_MY)
+ && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
+ {
+ return scalar(o); /* As if inside SASSIGN */
+ }
+
o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
switch (o->op_type) {
default:
- if (!(opargs[o->op_type] & OA_FOLDCONST))
+ if (!(PL_opargs[o->op_type] & OA_FOLDCONST))
break;
/* FALL THROUGH */
case OP_REPEAT:
@@ -909,49 +1101,48 @@ scalarvoid(OP *o)
case OP_GGRGID:
case OP_GETLOGIN:
func_ops:
- if (!(o->op_private & OPpLVAL_INTRO))
- useless = op_desc[o->op_type];
+ if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))
+ useless = PL_op_desc[o->op_type];
break;
case OP_RV2GV:
case OP_RV2SV:
case OP_RV2AV:
case OP_RV2HV:
- if (!(o->op_private & OPpLVAL_INTRO) &&
+ if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)) &&
(!o->op_sibling || o->op_sibling->op_type != OP_READLINE))
useless = "a variable";
break;
- case OP_NEXTSTATE:
- case OP_DBSTATE:
- WITH_THR(PL_curcop = ((COP*)o)); /* for warning below */
- break;
-
case OP_CONST:
- sv = cSVOPo->op_sv;
- if (PL_dowarn) {
- useless = "a constant";
- if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
- useless = 0;
- else if (SvPOK(sv)) {
- if (strnEQ(SvPVX(sv), "di", 2) ||
- strnEQ(SvPVX(sv), "ds", 2) ||
- strnEQ(SvPVX(sv), "ig", 2))
- useless = 0;
+ sv = cSVOPo_sv;
+ if (cSVOPo->op_private & OPpCONST_STRICT)
+ no_bareword_allowed(o);
+ else {
+ dTHR;
+ if (ckWARN(WARN_VOID)) {
+ useless = "a constant";
+ if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
+ useless = 0;
+ else if (SvPOK(sv)) {
+ if (strnEQ(SvPVX(sv), "di", 2) ||
+ strnEQ(SvPVX(sv), "ds", 2) ||
+ strnEQ(SvPVX(sv), "ig", 2))
+ useless = 0;
+ }
}
}
- null(o); /* don't execute a constant */
- SvREFCNT_dec(sv); /* don't even remember it */
+ null(o); /* don't execute or even remember it */
break;
case OP_POSTINC:
o->op_type = OP_PREINC; /* pre-increment is faster */
- o->op_ppaddr = ppaddr[OP_PREINC];
+ o->op_ppaddr = PL_ppaddr[OP_PREINC];
break;
case OP_POSTDEC:
o->op_type = OP_PREDEC; /* pre-decrement is faster */
- o->op_ppaddr = ppaddr[OP_PREDEC];
+ o->op_ppaddr = PL_ppaddr[OP_PREDEC];
break;
case OP_OR:
@@ -962,11 +1153,11 @@ scalarvoid(OP *o)
break;
case OP_NULL:
- if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
- WITH_THR(PL_curcop = ((COP*)o)); /* for warning below */
if (o->op_flags & OPf_STACKED)
break;
/* FALL THROUGH */
+ case OP_NEXTSTATE:
+ case OP_DBSTATE:
case OP_ENTERTRY:
case OP_ENTER:
case OP_SCALAR:
@@ -996,13 +1187,16 @@ scalarvoid(OP *o)
}
break;
}
- if (useless && PL_dowarn)
- warn("Useless use of %s in void context", useless);
+ if (useless) {
+ dTHR;
+ if (ckWARN(WARN_VOID))
+ Perl_warner(aTHX_ WARN_VOID, "Useless use of %s in void context", useless);
+ }
return o;
}
OP *
-listkids(OP *o)
+Perl_listkids(pTHX_ OP *o)
{
OP *kid;
if (o && o->op_flags & OPf_KIDS) {
@@ -1013,15 +1207,23 @@ listkids(OP *o)
}
OP *
-list(OP *o)
+Perl_list(pTHX_ OP *o)
{
OP *kid;
/* assumes no premature commitment */
if (!o || (o->op_flags & OPf_WANT) || PL_error_count
|| o->op_type == OP_RETURN)
+ {
return o;
+ }
+ if ((o->op_private & OPpTARGET_MY)
+ && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
+ {
+ return o; /* As if inside SASSIGN */
+ }
+
o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
switch (o->op_type) {
@@ -1053,7 +1255,7 @@ list(OP *o)
case OP_LEAVETRY:
kid = cLISTOPo->op_first;
list(kid);
- while (kid = kid->op_sibling) {
+ while ((kid = kid->op_sibling)) {
if (kid->op_sibling)
scalarvoid(kid);
else
@@ -1080,7 +1282,7 @@ list(OP *o)
}
OP *
-scalarseq(OP *o)
+Perl_scalarseq(pTHX_ OP *o)
{
OP *kid;
@@ -1108,7 +1310,7 @@ scalarseq(OP *o)
}
STATIC OP *
-modkids(OP *o, I32 type)
+S_modkids(pTHX_ OP *o, I32 type)
{
OP *kid;
if (o && o->op_flags & OPf_KIDS) {
@@ -1119,16 +1321,21 @@ modkids(OP *o, I32 type)
}
OP *
-mod(OP *o, I32 type)
+Perl_mod(pTHX_ OP *o, I32 type)
{
dTHR;
OP *kid;
- SV *sv;
STRLEN n_a;
if (!o || PL_error_count)
return o;
+ if ((o->op_private & OPpTARGET_MY)
+ && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
+ {
+ return o;
+ }
+
switch (o->op_type) {
case OP_UNDEF:
PL_modcount++;
@@ -1137,7 +1344,7 @@ mod(OP *o, I32 type)
if (!(o->op_private & (OPpCONST_ARYBASE)))
goto nomod;
if (PL_eval_start && PL_eval_start->op_type == OP_CONST) {
- PL_compiling.cop_arybase = (I32)SvIV(((SVOP*)PL_eval_start)->op_sv);
+ PL_compiling.cop_arybase = (I32)SvIV(cSVOPx(PL_eval_start)->op_sv);
PL_eval_start = 0;
}
else if (!type) {
@@ -1147,7 +1354,7 @@ mod(OP *o, I32 type)
else if (type == OP_REFGEN)
goto nomod;
else
- croak("That use of $[ is unsupported");
+ Perl_croak(aTHX_ "That use of $[ is unsupported");
break;
case OP_STUB:
if (o->op_flags & OPf_PARENS)
@@ -1157,20 +1364,110 @@ mod(OP *o, I32 type)
if ((type == OP_UNDEF || type == OP_REFGEN) &&
!(o->op_flags & OPf_STACKED)) {
o->op_type = OP_RV2CV; /* entersub => rv2cv */
- o->op_ppaddr = ppaddr[OP_RV2CV];
+ o->op_ppaddr = PL_ppaddr[OP_RV2CV];
assert(cUNOPo->op_first->op_type == OP_NULL);
null(((LISTOP*)cUNOPo->op_first)->op_first);/* disable pushmark */
break;
}
+ else { /* lvalue subroutine call */
+ o->op_private |= OPpLVAL_INTRO;
+ if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN) {
+ /* Backward compatibility mode: */
+ o->op_private |= OPpENTERSUB_INARGS;
+ break;
+ }
+ else { /* Compile-time error message: */
+ OP *kid = cUNOPo->op_first;
+ CV *cv;
+ OP *okid;
+
+ if (kid->op_type == OP_PUSHMARK)
+ goto skip_kids;
+ if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST)
+ Perl_croak(aTHX_
+ "panic: unexpected lvalue entersub "
+ "args: type/targ %ld:%ld",
+ (long)kid->op_type,kid->op_targ);
+ kid = kLISTOP->op_first;
+ skip_kids:
+ while (kid->op_sibling)
+ kid = kid->op_sibling;
+ if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) {
+ /* Indirect call */
+ if (kid->op_type == OP_METHOD_NAMED
+ || kid->op_type == OP_METHOD)
+ {
+ UNOP *newop;
+
+ if (kid->op_sibling || kid->op_next != kid) {
+ yyerror("panic: unexpected optree near method call");
+ break;
+ }
+
+ NewOp(1101, newop, 1, UNOP);
+ newop->op_type = OP_RV2CV;
+ newop->op_ppaddr = PL_ppaddr[OP_RV2CV];
+ newop->op_first = Nullop;
+ newop->op_next = (OP*)newop;
+ kid->op_sibling = (OP*)newop;
+ newop->op_private |= OPpLVAL_INTRO;
+ break;
+ }
+
+ if (kid->op_type != OP_RV2CV)
+ Perl_croak(aTHX_
+ "panic: unexpected lvalue entersub "
+ "entry via type/targ %ld:%ld",
+ (long)kid->op_type,kid->op_targ);
+ kid->op_private |= OPpLVAL_INTRO;
+ break; /* Postpone until runtime */
+ }
+
+ okid = kid;
+ kid = kUNOP->op_first;
+ if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV)
+ kid = kUNOP->op_first;
+ if (kid->op_type == OP_NULL)
+ Perl_croak(aTHX_
+ "Unexpected constant lvalue entersub "
+ "entry via type/targ %ld:%ld",
+ (long)kid->op_type,kid->op_targ);
+ if (kid->op_type != OP_GV) {
+ /* Restore RV2CV to check lvalueness */
+ restore_2cv:
+ if (kid->op_next && kid->op_next != kid) { /* Happens? */
+ okid->op_next = kid->op_next;
+ kid->op_next = okid;
+ }
+ else
+ okid->op_next = Nullop;
+ okid->op_type = OP_RV2CV;
+ okid->op_targ = 0;
+ okid->op_ppaddr = PL_ppaddr[OP_RV2CV];
+ okid->op_private |= OPpLVAL_INTRO;
+ break;
+ }
+
+ cv = GvCV(kGVOP_gv);
+ if (!cv)
+ goto restore_2cv;
+ if (CvLVALUE(cv))
+ break;
+ }
+ }
/* FALL THROUGH */
default:
nomod:
/* grep, foreach, subcalls, refgen */
if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN)
break;
- yyerror(form("Can't modify %s in %s",
- op_desc[o->op_type],
- type ? op_desc[type] : "local"));
+ yyerror(Perl_form(aTHX_ "Can't modify %s in %s",
+ (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)
+ ? "do block"
+ : (o->op_type == OP_ENTERSUB
+ ? "non-lvalue subroutine call"
+ : PL_op_desc[o->op_type])),
+ type ? PL_op_desc[type] : "local"));
return o;
case OP_PREINC:
@@ -1206,7 +1503,7 @@ mod(OP *o, I32 type)
case OP_RV2AV:
case OP_RV2HV:
if (!type && cUNOPo->op_first->op_type != OP_GV)
- croak("Can't localize through a reference");
+ Perl_croak(aTHX_ "Can't localize through a reference");
if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
PL_modcount = 10000;
return o; /* Treat \(@foo) like ordinary list. */
@@ -1228,13 +1525,15 @@ mod(OP *o, I32 type)
break;
case OP_RV2SV:
if (!type && cUNOPo->op_first->op_type != OP_GV)
- croak("Can't localize through a reference");
+ Perl_croak(aTHX_ "Can't localize through a reference");
ref(cUNOPo->op_first, o->op_type);
/* FALL THROUGH */
case OP_GV:
case OP_AV2ARYLEN:
PL_hints |= HINT_BLOCK_SCOPE;
case OP_SASSIGN:
+ case OP_ANDASSIGN:
+ case OP_ORASSIGN:
case OP_AELEMFAST:
PL_modcount++;
break;
@@ -1250,7 +1549,7 @@ mod(OP *o, I32 type)
case OP_PADSV:
PL_modcount++;
if (!type)
- croak("Can't localize lexical variable %s",
+ Perl_croak(aTHX_ "Can't localize lexical variable %s",
SvPV(*av_fetch(PL_comppad_name, o->op_targ, 4), n_a));
break;
@@ -1298,7 +1597,9 @@ mod(OP *o, I32 type)
break;
case OP_NULL:
- if (!(o->op_flags & OPf_KIDS))
+ if (o->op_flags & OPf_SPECIAL) /* do BLOCK */
+ goto nomod;
+ else if (!(o->op_flags & OPf_KIDS))
break;
if (o->op_targ != OP_LIST) {
mod(cBINOPo->op_first, type);
@@ -1324,8 +1625,8 @@ mod(OP *o, I32 type)
return o;
}
-static bool
-scalar_mod_type(OP *o, I32 type)
+STATIC bool
+S_scalar_mod_type(pTHX_ OP *o, I32 type)
{
switch (type) {
case OP_SASSIGN:
@@ -1363,16 +1664,39 @@ scalar_mod_type(OP *o, I32 type)
case OP_READ:
case OP_SYSREAD:
case OP_RECV:
- case OP_ANDASSIGN: /* may work later */
- case OP_ORASSIGN: /* may work later */
+ case OP_ANDASSIGN:
+ case OP_ORASSIGN:
return TRUE;
default:
return FALSE;
}
}
+STATIC bool
+S_is_handle_constructor(pTHX_ OP *o, I32 argnum)
+{
+ switch (o->op_type) {
+ case OP_PIPE_OP:
+ case OP_SOCKPAIR:
+ if (argnum == 2)
+ return TRUE;
+ /* FALL THROUGH */
+ case OP_SYSOPEN:
+ case OP_OPEN:
+ case OP_SELECT: /* XXX c.f. SelectSaver.pm */
+ case OP_SOCKET:
+ case OP_OPEN_DIR:
+ case OP_ACCEPT:
+ if (argnum == 1)
+ return TRUE;
+ /* FALL THROUGH */
+ default:
+ return FALSE;
+ }
+}
+
OP *
-refkids(OP *o, I32 type)
+Perl_refkids(pTHX_ OP *o, I32 type)
{
OP *kid;
if (o && o->op_flags & OPf_KIDS) {
@@ -1383,7 +1707,7 @@ refkids(OP *o, I32 type)
}
OP *
-ref(OP *o, I32 type)
+Perl_ref(pTHX_ OP *o, I32 type)
{
OP *kid;
@@ -1392,10 +1716,10 @@ ref(OP *o, I32 type)
switch (o->op_type) {
case OP_ENTERSUB:
- if ((type == OP_DEFINED || type == OP_LOCK) &&
+ if ((type == OP_EXISTS || type == OP_DEFINED || type == OP_LOCK) &&
!(o->op_flags & OPf_STACKED)) {
o->op_type = OP_RV2CV; /* entersub => rv2cv */
- o->op_ppaddr = ppaddr[OP_RV2CV];
+ o->op_ppaddr = PL_ppaddr[OP_RV2CV];
assert(cUNOPo->op_first->op_type == OP_NULL);
null(((LISTOP*)cUNOPo->op_first)->op_first); /* disable pushmark */
o->op_flags |= OPf_SPECIAL;
@@ -1407,6 +1731,8 @@ ref(OP *o, I32 type)
ref(kid, type);
break;
case OP_RV2SV:
+ if (type == OP_DEFINED)
+ o->op_flags |= OPf_SPECIAL; /* don't create GV */
ref(cUNOPo->op_first, o->op_type);
/* FALL THROUGH */
case OP_PADSV:
@@ -1427,6 +1753,8 @@ ref(OP *o, I32 type)
o->op_flags |= OPf_REF;
/* FALL THROUGH */
case OP_RV2GV:
+ if (type == OP_DEFINED)
+ o->op_flags |= OPf_SPECIAL; /* don't create GV */
ref(cUNOPo->op_first, o->op_type);
break;
@@ -1467,8 +1795,58 @@ ref(OP *o, I32 type)
}
-OP *
-my(OP *o)
+STATIC OP *
+S_dup_attrlist(pTHX_ OP *o)
+{
+ OP *rop = Nullop;
+
+ /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
+ * where the first kid is OP_PUSHMARK and the remaining ones
+ * are OP_CONST. We need to push the OP_CONST values.
+ */
+ if (o->op_type == OP_CONST)
+ rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc(cSVOPo->op_sv));
+ else {
+ assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
+ for (o = cLISTOPo->op_first; o; o=o->op_sibling) {
+ if (o->op_type == OP_CONST)
+ rop = append_elem(OP_LIST, rop,
+ newSVOP(OP_CONST, o->op_flags,
+ SvREFCNT_inc(cSVOPo->op_sv)));
+ }
+ }
+ return rop;
+}
+
+STATIC void
+S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs)
+{
+ SV *stashsv;
+
+ /* fake up C<use attributes $pkg,$rv,@attrs> */
+ ENTER; /* need to protect against side-effects of 'use' */
+ SAVEINT(PL_expect);
+ if (stash && HvNAME(stash))
+ stashsv = newSVpv(HvNAME(stash), 0);
+ else
+ stashsv = &PL_sv_no;
+
+#define ATTRSMODULE "attributes"
+
+ Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
+ newSVpvn(ATTRSMODULE, sizeof(ATTRSMODULE)-1),
+ Nullsv,
+ prepend_elem(OP_LIST,
+ newSVOP(OP_CONST, 0, stashsv),
+ prepend_elem(OP_LIST,
+ newSVOP(OP_CONST, 0,
+ newRV(target)),
+ dup_attrlist(attrs))));
+ LEAVE;
+}
+
+STATIC OP *
+S_my_kid(pTHX_ OP *o, OP *attrs)
{
OP *kid;
I32 type;
@@ -1479,24 +1857,67 @@ my(OP *o)
type = o->op_type;
if (type == OP_LIST) {
for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
- my(kid);
+ my_kid(kid, attrs);
} else if (type == OP_UNDEF) {
return o;
+ } else if (type == OP_RV2SV || /* "our" declaration */
+ type == OP_RV2AV ||
+ type == OP_RV2HV) { /* XXX does this let anything illegal in? */
+ o->op_private |= OPpOUR_INTRO;
+ return o;
} else if (type != OP_PADSV &&
type != OP_PADAV &&
type != OP_PADHV &&
type != OP_PUSHMARK)
{
- yyerror(form("Can't declare %s in my", op_desc[o->op_type]));
+ yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
+ PL_op_desc[o->op_type],
+ PL_in_my == KEY_our ? "our" : "my"));
return o;
}
+ else if (attrs && type != OP_PUSHMARK) {
+ HV *stash;
+ SV *padsv;
+ SV **namesvp;
+
+ PL_in_my = FALSE;
+ PL_in_my_stash = Nullhv;
+
+ /* check for C<my Dog $spot> when deciding package */
+ namesvp = av_fetch(PL_comppad_name, o->op_targ, FALSE);
+ if (namesvp && *namesvp && SvOBJECT(*namesvp) && HvNAME(SvSTASH(*namesvp)))
+ stash = SvSTASH(*namesvp);
+ else
+ stash = PL_curstash;
+ padsv = PAD_SV(o->op_targ);
+ apply_attrs(stash, padsv, attrs);
+ }
o->op_flags |= OPf_MOD;
o->op_private |= OPpLVAL_INTRO;
return o;
}
OP *
-sawparens(OP *o)
+Perl_my_attrs(pTHX_ OP *o, OP *attrs)
+{
+ if (o->op_flags & OPf_PARENS)
+ list(o);
+ if (attrs)
+ SAVEFREEOP(attrs);
+ o = my_kid(o, attrs);
+ PL_in_my = FALSE;
+ PL_in_my_stash = Nullhv;
+ return o;
+}
+
+OP *
+Perl_my(pTHX_ OP *o)
+{
+ return my_kid(o, Nullop);
+}
+
+OP *
+Perl_sawparens(pTHX_ OP *o)
{
if (o)
o->op_flags |= OPf_PARENS;
@@ -1504,22 +1925,25 @@ sawparens(OP *o)
}
OP *
-bind_match(I32 type, OP *left, OP *right)
+Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
{
+ dTHR;
OP *o;
- if (PL_dowarn &&
- (left->op_type == OP_RV2AV ||
- left->op_type == OP_RV2HV ||
- left->op_type == OP_PADAV ||
- left->op_type == OP_PADHV)) {
- char *desc = op_desc[(right->op_type == OP_SUBST ||
- right->op_type == OP_TRANS)
- ? right->op_type : OP_MATCH];
- char *sample = ((left->op_type == OP_RV2AV ||
- left->op_type == OP_PADAV)
- ? "@array" : "%hash");
- warn("Applying %s to %s will act on scalar(%s)", desc, sample, sample);
+ if (ckWARN(WARN_MISC) &&
+ (left->op_type == OP_RV2AV ||
+ left->op_type == OP_RV2HV ||
+ left->op_type == OP_PADAV ||
+ left->op_type == OP_PADHV)) {
+ char *desc = PL_op_desc[(right->op_type == OP_SUBST ||
+ right->op_type == OP_TRANS)
+ ? right->op_type : OP_MATCH];
+ const char *sample = ((left->op_type == OP_RV2AV ||
+ left->op_type == OP_PADAV)
+ ? "@array" : "%hash");
+ Perl_warner(aTHX_ WARN_MISC,
+ "Applying %s to %s will act on scalar(%s)",
+ desc, sample, sample);
}
if (right->op_type == OP_MATCH ||
@@ -1542,7 +1966,7 @@ bind_match(I32 type, OP *left, OP *right)
}
OP *
-invert(OP *o)
+Perl_invert(pTHX_ OP *o)
{
if (!o)
return o;
@@ -1551,24 +1975,22 @@ invert(OP *o)
}
OP *
-scope(OP *o)
+Perl_scope(pTHX_ OP *o)
{
if (o) {
if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || PL_tainting) {
o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
o->op_type = OP_LEAVE;
- o->op_ppaddr = ppaddr[OP_LEAVE];
+ o->op_ppaddr = PL_ppaddr[OP_LEAVE];
}
else {
if (o->op_type == OP_LINESEQ) {
OP *kid;
o->op_type = OP_SCOPE;
- o->op_ppaddr = ppaddr[OP_SCOPE];
+ o->op_ppaddr = PL_ppaddr[OP_SCOPE];
kid = ((LISTOP*)o)->op_first;
- if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE){
- SvREFCNT_dec(((COP*)kid)->cop_filegv);
+ if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE)
null(kid);
- }
}
else
o = newLISTOP(OP_SCOPE, 0, o, Nullop);
@@ -1578,7 +2000,7 @@ scope(OP *o)
}
void
-save_hints(void)
+Perl_save_hints(pTHX)
{
SAVEI32(PL_hints);
SAVESPTR(GvHV(PL_hintgv));
@@ -1587,18 +2009,17 @@ save_hints(void)
}
int
-block_start(int full)
+Perl_block_start(pTHX_ int full)
{
dTHR;
int retval = PL_savestack_ix;
SAVEI32(PL_comppad_name_floor);
- if (full) {
- if ((PL_comppad_name_fill = AvFILLp(PL_comppad_name)) > 0)
- PL_comppad_name_floor = PL_comppad_name_fill;
- else
- PL_comppad_name_floor = 0;
- }
+ PL_comppad_name_floor = AvFILLp(PL_comppad_name);
+ if (full)
+ PL_comppad_name_fill = PL_comppad_name_floor;
+ if (PL_comppad_name_floor < 0)
+ PL_comppad_name_floor = 0;
SAVEI32(PL_min_intro_pending);
SAVEI32(PL_max_intro_pending);
PL_min_intro_pending = 0;
@@ -1608,17 +2029,23 @@ block_start(int full)
PL_pad_reset_pending = FALSE;
SAVEHINTS();
PL_hints &= ~HINT_BLOCK_SCOPE;
+ SAVESPTR(PL_compiling.cop_warnings);
+ if (! specialWARN(PL_compiling.cop_warnings)) {
+ PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
+ SAVEFREESV(PL_compiling.cop_warnings) ;
+ }
return retval;
}
OP*
-block_end(I32 floor, OP *seq)
+Perl_block_end(pTHX_ I32 floor, OP *seq)
{
dTHR;
int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
OP* retval = scalarseq(seq);
LEAVE_SCOPE(floor);
PL_pad_reset_pending = FALSE;
+ PL_compiling.op_private = PL_hints;
if (needblockscope)
PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
pad_leavemy(PL_comppad_name_fill);
@@ -1627,7 +2054,7 @@ block_end(I32 floor, OP *seq)
}
STATIC OP *
-newDEFSVOP(void)
+S_newDEFSVOP(pTHX)
{
#ifdef USE_THREADS
OP *o = newOP(OP_THREADSV, 0);
@@ -1639,12 +2066,18 @@ newDEFSVOP(void)
}
void
-newPROG(OP *o)
+Perl_newPROG(pTHX_ OP *o)
{
dTHR;
if (PL_in_eval) {
- PL_eval_root = newUNOP(OP_LEAVEEVAL, ((PL_in_eval & 4) ? OPf_SPECIAL : 0), o);
+ if (PL_eval_root)
+ return;
+ PL_eval_root = newUNOP(OP_LEAVEEVAL,
+ ((PL_in_eval & EVAL_KEEPERR)
+ ? OPf_SPECIAL : 0), o);
PL_eval_start = linklist(PL_eval_root);
+ PL_eval_root->op_private |= OPpREFCOUNTED;
+ OpREFCNT_set(PL_eval_root, 1);
PL_eval_root->op_next = 0;
peep(PL_eval_start);
}
@@ -1654,47 +2087,53 @@ newPROG(OP *o)
PL_main_root = scope(sawparens(scalarvoid(o)));
PL_curcop = &PL_compiling;
PL_main_start = LINKLIST(PL_main_root);
+ PL_main_root->op_private |= OPpREFCOUNTED;
+ OpREFCNT_set(PL_main_root, 1);
PL_main_root->op_next = 0;
peep(PL_main_start);
PL_compcv = 0;
/* Register with debugger */
if (PERLDB_INTER) {
- CV *cv = perl_get_cv("DB::postponed", FALSE);
+ CV *cv = get_cv("DB::postponed", FALSE);
if (cv) {
dSP;
PUSHMARK(SP);
- XPUSHs((SV*)PL_compiling.cop_filegv);
+ XPUSHs((SV*)CopFILEGV(&PL_compiling));
PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ call_sv((SV*)cv, G_DISCARD);
}
}
}
}
OP *
-localize(OP *o, I32 lex)
+Perl_localize(pTHX_ OP *o, I32 lex)
{
if (o->op_flags & OPf_PARENS)
list(o);
else {
- if (PL_dowarn && PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == ',') {
+ dTHR;
+ if (ckWARN(WARN_PARENTHESIS) && PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == ',') {
char *s;
- for (s = PL_bufptr; *s && (isALNUM(*s) || strchr("@$%, ",*s)); s++) ;
+ for (s = PL_bufptr; *s && (isALNUM(*s) || (*s & 0x80) || strchr("@$%, ",*s)); s++) ;
if (*s == ';' || *s == '=')
- warn("Parens missing around \"%s\" list", lex ? "my" : "local");
+ Perl_warner(aTHX_ WARN_PARENTHESIS,
+ "Parentheses missing around \"%s\" list",
+ lex ? (PL_in_my == KEY_our ? "our" : "my") : "local");
}
}
- PL_in_my = FALSE;
- PL_in_my_stash = Nullhv;
if (lex)
- return my(o);
+ o = my(o);
else
- return mod(o, OP_NULL); /* a bit kludgey */
+ o = mod(o, OP_NULL); /* a bit kludgey */
+ PL_in_my = FALSE;
+ PL_in_my_stash = Nullhv;
+ return o;
}
OP *
-jmaybe(OP *o)
+Perl_jmaybe(pTHX_ OP *o)
{
if (o->op_type == OP_LIST) {
OP *o2;
@@ -1710,25 +2149,35 @@ jmaybe(OP *o)
}
OP *
-fold_constants(register OP *o)
+Perl_fold_constants(pTHX_ register OP *o)
{
dTHR;
register OP *curop;
I32 type = o->op_type;
SV *sv;
- if (opargs[type] & OA_RETSCALAR)
+ if (PL_opargs[type] & OA_RETSCALAR)
scalar(o);
- if (opargs[type] & OA_TARGET)
+ if (PL_opargs[type] & OA_TARGET && !o->op_targ)
o->op_targ = pad_alloc(type, SVs_PADTMP);
- if ((opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER))
- o->op_ppaddr = ppaddr[type = ++(o->op_type)];
+ /* integerize op, unless it happens to be C<-foo>.
+ * XXX should pp_i_negate() do magic string negation instead? */
+ if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)
+ && !(type == OP_NEGATE && cUNOPo->op_first->op_type == OP_CONST
+ && (cUNOPo->op_first->op_private & OPpCONST_BARE)))
+ {
+ o->op_ppaddr = PL_ppaddr[type = ++(o->op_type)];
+ }
- if (!(opargs[type] & OA_FOLDCONST))
+ if (!(PL_opargs[type] & OA_FOLDCONST))
goto nope;
switch (type) {
+ case OP_NEGATE:
+ /* XXX might want a ck_negate() for this */
+ cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
+ break;
case OP_SPRINTF:
case OP_UCFIRST:
case OP_LCFIRST:
@@ -1748,11 +2197,13 @@ fold_constants(register OP *o)
goto nope; /* Don't try to run w/ errors */
for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
- if (curop->op_type != OP_CONST &&
- curop->op_type != OP_LIST &&
- curop->op_type != OP_SCALAR &&
- curop->op_type != OP_NULL &&
- curop->op_type != OP_PUSHMARK) {
+ if ((curop->op_type != OP_CONST ||
+ (curop->op_private & OPpCONST_BARE)) &&
+ curop->op_type != OP_LIST &&
+ curop->op_type != OP_SCALAR &&
+ curop->op_type != OP_NULL &&
+ curop->op_type != OP_PUSHMARK)
+ {
goto nope;
}
}
@@ -1760,7 +2211,7 @@ fold_constants(register OP *o)
curop = LINKLIST(o);
o->op_next = 0;
PL_op = curop;
- CALLRUNOPS();
+ CALLRUNOPS(aTHX);
sv = *(PL_stack_sp--);
if (o->op_targ && sv == PAD_SV(o->op_targ)) /* grab pad temp? */
pad_swipe(o->op_targ);
@@ -1777,7 +2228,7 @@ fold_constants(register OP *o)
type != OP_NEGATE)
{
IV iv = SvIV(sv);
- if ((double)iv == SvNV(sv)) {
+ if ((NV)iv == SvNV(sv)) {
SvREFCNT_dec(sv);
sv = newSViv(iv);
}
@@ -1788,12 +2239,16 @@ fold_constants(register OP *o)
}
nope:
- if (!(opargs[type] & OA_OTHERINT))
+ if (!(PL_opargs[type] & OA_OTHERINT))
return o;
if (!(PL_hints & HINT_INTEGER)) {
- if (type == OP_DIVIDE || !(o->op_flags & OPf_KIDS))
+ if (type == OP_MODULO
+ || type == OP_DIVIDE
+ || !(o->op_flags & OPf_KIDS))
+ {
return o;
+ }
for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
if (curop->op_type == OP_CONST) {
@@ -1801,18 +2256,18 @@ fold_constants(register OP *o)
continue;
return o;
}
- if (opargs[curop->op_type] & OA_RETINTEGER)
+ if (PL_opargs[curop->op_type] & OA_RETINTEGER)
continue;
return o;
}
- o->op_ppaddr = ppaddr[++(o->op_type)];
+ o->op_ppaddr = PL_ppaddr[++(o->op_type)];
}
return o;
}
OP *
-gen_constant_list(register OP *o)
+Perl_gen_constant_list(pTHX_ register OP *o)
{
dTHR;
register OP *curop;
@@ -1824,14 +2279,15 @@ gen_constant_list(register OP *o)
PL_op = curop = LINKLIST(o);
o->op_next = 0;
- pp_pushmark(ARGS);
- CALLRUNOPS();
+ peep(curop);
+ pp_pushmark();
+ CALLRUNOPS(aTHX);
PL_op = curop;
- pp_anonlist(ARGS);
+ pp_anonlist();
PL_tmps_floor = oldtmps_floor;
o->op_type = OP_RV2AV;
- o->op_ppaddr = ppaddr[OP_RV2AV];
+ o->op_ppaddr = PL_ppaddr[OP_RV2AV];
curop = ((UNOP*)o)->op_first;
((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc(*PL_stack_sp--));
op_free(curop);
@@ -1840,7 +2296,7 @@ gen_constant_list(register OP *o)
}
OP *
-convert(I32 type, I32 flags, OP *o)
+Perl_convert(pTHX_ I32 type, I32 flags, OP *o)
{
OP *kid;
OP *last = 0;
@@ -1850,11 +2306,11 @@ convert(I32 type, I32 flags, OP *o)
else
o->op_flags &= ~OPf_WANT;
- if (!(opargs[type] & OA_MARK))
+ if (!(PL_opargs[type] & OA_MARK))
null(cLISTOPo->op_first);
o->op_type = type;
- o->op_ppaddr = ppaddr[type];
+ o->op_ppaddr = PL_ppaddr[type];
o->op_flags |= flags;
o = CHECKOP(type, o);
@@ -1874,7 +2330,7 @@ convert(I32 type, I32 flags, OP *o)
/* List constructors */
OP *
-append_elem(I32 type, OP *first, OP *last)
+Perl_append_elem(pTHX_ I32 type, OP *first, OP *last)
{
if (!first)
return last;
@@ -1882,8 +2338,11 @@ append_elem(I32 type, OP *first, OP *last)
if (!last)
return first;
- if (first->op_type != type || type==OP_LIST && first->op_flags & OPf_PARENS)
- return newLISTOP(type, 0, first, last);
+ if (first->op_type != type
+ || (type == OP_LIST && (first->op_flags & OPf_PARENS)))
+ {
+ return newLISTOP(type, 0, first, last);
+ }
if (first->op_flags & OPf_KIDS)
((LISTOP*)first)->op_last->op_sibling = last;
@@ -1897,7 +2356,7 @@ append_elem(I32 type, OP *first, OP *last)
}
OP *
-append_list(I32 type, LISTOP *first, LISTOP *last)
+Perl_append_list(pTHX_ I32 type, LISTOP *first, LISTOP *last)
{
if (!first)
return (OP*)last;
@@ -1916,13 +2375,16 @@ append_list(I32 type, LISTOP *first, LISTOP *last)
first->op_children += last->op_children;
if (first->op_children)
first->op_flags |= OPf_KIDS;
-
- Safefree(last);
+
+#ifdef PL_OP_SLAB_ALLOC
+#else
+ Safefree(last);
+#endif
return (OP*)first;
}
OP *
-prepend_elem(I32 type, OP *first, OP *last)
+Perl_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
{
if (!first)
return last;
@@ -1953,13 +2415,13 @@ prepend_elem(I32 type, OP *first, OP *last)
/* Constructors */
OP *
-newNULLLIST(void)
+Perl_newNULLLIST(pTHX)
{
return newOP(OP_STUB, 0);
}
OP *
-force_list(OP *o)
+Perl_force_list(pTHX_ OP *o)
{
if (!o || o->op_type != OP_LIST)
o = newLISTOP(OP_LIST, 0, o, Nullop);
@@ -1968,14 +2430,14 @@ force_list(OP *o)
}
OP *
-newLISTOP(I32 type, I32 flags, OP *first, OP *last)
+Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
{
LISTOP *listop;
- Newz(1101, listop, 1, LISTOP);
+ NewOp(1101, listop, 1, LISTOP);
listop->op_type = type;
- listop->op_ppaddr = ppaddr[type];
+ listop->op_ppaddr = PL_ppaddr[type];
listop->op_children = (first != 0) + (last != 0);
listop->op_flags = flags;
@@ -2003,36 +2465,36 @@ newLISTOP(I32 type, I32 flags, OP *first, OP *last)
}
OP *
-newOP(I32 type, I32 flags)
+Perl_newOP(pTHX_ I32 type, I32 flags)
{
OP *o;
- Newz(1101, o, 1, OP);
+ NewOp(1101, o, 1, OP);
o->op_type = type;
- o->op_ppaddr = ppaddr[type];
+ o->op_ppaddr = PL_ppaddr[type];
o->op_flags = flags;
o->op_next = o;
o->op_private = 0 + (flags >> 8);
- if (opargs[type] & OA_RETSCALAR)
+ if (PL_opargs[type] & OA_RETSCALAR)
scalar(o);
- if (opargs[type] & OA_TARGET)
+ if (PL_opargs[type] & OA_TARGET)
o->op_targ = pad_alloc(type, SVs_PADTMP);
return CHECKOP(type, o);
}
OP *
-newUNOP(I32 type, I32 flags, OP *first)
+Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
{
UNOP *unop;
if (!first)
first = newOP(OP_STUB, 0);
- if (opargs[type] & OA_MARK)
+ if (PL_opargs[type] & OA_MARK)
first = force_list(first);
- Newz(1101, unop, 1, UNOP);
+ NewOp(1101, unop, 1, UNOP);
unop->op_type = type;
- unop->op_ppaddr = ppaddr[type];
+ unop->op_ppaddr = PL_ppaddr[type];
unop->op_first = first;
unop->op_flags = flags | OPf_KIDS;
unop->op_private = 1 | (flags >> 8);
@@ -2044,16 +2506,16 @@ newUNOP(I32 type, I32 flags, OP *first)
}
OP *
-newBINOP(I32 type, I32 flags, OP *first, OP *last)
+Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
{
BINOP *binop;
- Newz(1101, binop, 1, BINOP);
+ NewOp(1101, binop, 1, BINOP);
if (!first)
first = newOP(OP_NULL, 0);
binop->op_type = type;
- binop->op_ppaddr = ppaddr[type];
+ binop->op_ppaddr = PL_ppaddr[type];
binop->op_first = first;
binop->op_flags = flags | OPf_KIDS;
if (!last) {
@@ -2066,16 +2528,29 @@ newBINOP(I32 type, I32 flags, OP *first, OP *last)
}
binop = (BINOP*)CHECKOP(type, binop);
- if (binop->op_next)
+ if (binop->op_next || binop->op_type != type)
return (OP*)binop;
- binop->op_last = last = binop->op_first->op_sibling;
+ binop->op_last = binop->op_first->op_sibling;
return fold_constants((OP *)binop);
}
+static int
+utf8compare(const void *a, const void *b)
+{
+ int i;
+ for (i = 0; i < 10; i++) {
+ if ((*(U8**)a)[i] < (*(U8**)b)[i])
+ return -1;
+ if ((*(U8**)a)[i] > (*(U8**)b)[i])
+ return 1;
+ }
+ return 0;
+}
+
OP *
-pmtrans(OP *o, OP *expr, OP *repl)
+Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
{
SV *tstr = ((SVOP*)expr)->op_sv;
SV *rstr = ((SVOP*)repl)->op_sv;
@@ -2085,16 +2560,204 @@ pmtrans(OP *o, OP *expr, OP *repl)
register U8 *r = (U8*)SvPV(rstr, rlen);
register I32 i;
register I32 j;
- I32 Delete;
+ I32 del;
I32 complement;
I32 squash;
register short *tbl;
- tbl = (short*)cPVOPo->op_pv;
complement = o->op_private & OPpTRANS_COMPLEMENT;
- Delete = o->op_private & OPpTRANS_DELETE;
+ del = o->op_private & OPpTRANS_DELETE;
squash = o->op_private & OPpTRANS_SQUASH;
+ if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
+ SV* listsv = newSVpvn("# comment\n",10);
+ SV* transv = 0;
+ U8* tend = t + tlen;
+ U8* rend = r + rlen;
+ I32 ulen;
+ U32 tfirst = 1;
+ U32 tlast = 0;
+ I32 tdiff;
+ U32 rfirst = 1;
+ U32 rlast = 0;
+ I32 rdiff;
+ I32 diff;
+ I32 none = 0;
+ U32 max = 0;
+ I32 bits;
+ I32 grows = 0;
+ I32 havefinal = 0;
+ U32 final;
+ I32 from_utf = o->op_private & OPpTRANS_FROM_UTF;
+ I32 to_utf = o->op_private & OPpTRANS_TO_UTF;
+
+ if (complement) {
+ U8 tmpbuf[UTF8_MAXLEN];
+ U8** cp;
+ UV nextmin = 0;
+ New(1109, cp, tlen, U8*);
+ i = 0;
+ transv = newSVpvn("",0);
+ while (t < tend) {
+ cp[i++] = t;
+ t += UTF8SKIP(t);
+ if (*t == 0xff) {
+ t++;
+ t += UTF8SKIP(t);
+ }
+ }
+ qsort(cp, i, sizeof(U8*), utf8compare);
+ for (j = 0; j < i; j++) {
+ U8 *s = cp[j];
+ UV val = utf8_to_uv(s, &ulen);
+ s += ulen;
+ diff = val - nextmin;
+ if (diff > 0) {
+ t = uv_to_utf8(tmpbuf,nextmin);
+ sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
+ if (diff > 1) {
+ t = uv_to_utf8(tmpbuf, val - 1);
+ sv_catpvn(transv, "\377", 1);
+ sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
+ }
+ }
+ if (*s == 0xff)
+ val = utf8_to_uv(s+1, &ulen);
+ if (val >= nextmin)
+ nextmin = val + 1;
+ }
+ t = uv_to_utf8(tmpbuf,nextmin);
+ sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
+ t = uv_to_utf8(tmpbuf, 0x7fffffff);
+ sv_catpvn(transv, "\377", 1);
+ sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
+ t = (U8*)SvPVX(transv);
+ tlen = SvCUR(transv);
+ tend = t + tlen;
+ }
+ else if (!rlen && !del) {
+ r = t; rlen = tlen; rend = tend;
+ }
+ if (!squash) {
+ if (to_utf && from_utf) { /* only counting characters */
+ if (t == r || (tlen == rlen && memEQ(t, r, tlen)))
+ o->op_private |= OPpTRANS_IDENTICAL;
+ }
+ else { /* straight latin-1 translation */
+ if (tlen == 4 && memEQ(t, "\0\377\303\277", 4) &&
+ rlen == 4 && memEQ(r, "\0\377\303\277", 4))
+ o->op_private |= OPpTRANS_IDENTICAL;
+ }
+ }
+
+ while (t < tend || tfirst <= tlast) {
+ /* see if we need more "t" chars */
+ if (tfirst > tlast) {
+ tfirst = (I32)utf8_to_uv(t, &ulen);
+ t += ulen;
+ if (t < tend && *t == 0xff) { /* illegal utf8 val indicates range */
+ tlast = (I32)utf8_to_uv(++t, &ulen);
+ t += ulen;
+ }
+ else
+ tlast = tfirst;
+ }
+
+ /* now see if we need more "r" chars */
+ if (rfirst > rlast) {
+ if (r < rend) {
+ rfirst = (I32)utf8_to_uv(r, &ulen);
+ r += ulen;
+ if (r < rend && *r == 0xff) { /* illegal utf8 val indicates range */
+ rlast = (I32)utf8_to_uv(++r, &ulen);
+ r += ulen;
+ }
+ else
+ rlast = rfirst;
+ }
+ else {
+ if (!havefinal++)
+ final = rlast;
+ rfirst = rlast = 0xffffffff;
+ }
+ }
+
+ /* now see which range will peter our first, if either. */
+ tdiff = tlast - tfirst;
+ rdiff = rlast - rfirst;
+
+ if (tdiff <= rdiff)
+ diff = tdiff;
+ else
+ diff = rdiff;
+
+ if (rfirst == 0xffffffff) {
+ diff = tdiff; /* oops, pretend rdiff is infinite */
+ if (diff > 0)
+ Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\tXXXX\n",
+ (long)tfirst, (long)tlast);
+ else
+ Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\tXXXX\n", (long)tfirst);
+ }
+ else {
+ if (diff > 0)
+ Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\t%04lx\n",
+ (long)tfirst, (long)(tfirst + diff),
+ (long)rfirst);
+ else
+ Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\t%04lx\n",
+ (long)tfirst, (long)rfirst);
+
+ if (rfirst + diff > max)
+ max = rfirst + diff;
+ rfirst += diff + 1;
+ if (!grows) {
+ if (rfirst <= 0x80)
+ ;
+ else if (rfirst <= 0x800)
+ grows |= (tfirst < 0x80);
+ else if (rfirst <= 0x10000)
+ grows |= (tfirst < 0x800);
+ else if (rfirst <= 0x200000)
+ grows |= (tfirst < 0x10000);
+ else if (rfirst <= 0x4000000)
+ grows |= (tfirst < 0x200000);
+ else if (rfirst <= 0x80000000)
+ grows |= (tfirst < 0x4000000);
+ }
+ }
+ tfirst += diff + 1;
+ }
+
+ none = ++max;
+ if (del)
+ del = ++max;
+
+ if (max > 0xffff)
+ bits = 32;
+ else if (max > 0xff)
+ bits = 16;
+ else
+ bits = 8;
+
+ cSVOPo->op_sv = (SV*)swash_init("utf8", "", listsv, bits, none);
+ SvREFCNT_dec(listsv);
+ if (transv)
+ SvREFCNT_dec(transv);
+
+ if (!del && havefinal)
+ (void)hv_store((HV*)SvRV((cSVOPo->op_sv)), "FINAL", 5,
+ newSVuv((UV)final), 0);
+
+ if (grows && to_utf)
+ o->op_private |= OPpTRANS_GROWS;
+
+ op_free(expr);
+ op_free(repl);
+ return o;
+ }
+
+ tbl = (short*)cPVOPo->op_pv;
if (complement) {
Zero(tbl, 256, short);
for (i = 0; i < tlen; i++)
@@ -2102,7 +2765,7 @@ pmtrans(OP *o, OP *expr, OP *repl)
for (i = 0, j = 0; i < 256; i++) {
if (!tbl[i]) {
if (j >= rlen) {
- if (Delete)
+ if (del)
tbl[i] = -2;
else if (rlen)
tbl[i] = r[j-1];
@@ -2115,16 +2778,16 @@ pmtrans(OP *o, OP *expr, OP *repl)
}
}
else {
- if (!rlen && !Delete) {
+ if (!rlen && !del) {
r = t; rlen = tlen;
if (!squash)
- o->op_private |= OPpTRANS_COUNTONLY;
+ o->op_private |= OPpTRANS_IDENTICAL;
}
for (i = 0; i < 256; i++)
tbl[i] = -1;
for (i = 0, j = 0; i < tlen; i++,j++) {
if (j >= rlen) {
- if (Delete) {
+ if (del) {
if (tbl[t[i]] == -1)
tbl[t[i]] = -2;
continue;
@@ -2142,14 +2805,14 @@ pmtrans(OP *o, OP *expr, OP *repl)
}
OP *
-newPMOP(I32 type, I32 flags)
+Perl_newPMOP(pTHX_ I32 type, I32 flags)
{
dTHR;
PMOP *pmop;
- Newz(1101, pmop, 1, PMOP);
+ NewOp(1101, pmop, 1, PMOP);
pmop->op_type = type;
- pmop->op_ppaddr = ppaddr[type];
+ pmop->op_ppaddr = PL_ppaddr[type];
pmop->op_flags = flags;
pmop->op_private = 0 | (flags >> 8);
@@ -2169,7 +2832,7 @@ newPMOP(I32 type, I32 flags)
}
OP *
-pmruntime(OP *o, OP *expr, OP *repl)
+Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl)
{
dTHR;
PMOP *pm;
@@ -2191,20 +2854,24 @@ pmruntime(OP *o, OP *expr, OP *repl)
p = SvPV(pat, plen);
pm->op_pmflags |= PMf_SKIPWHITE;
}
- pm->op_pmregexp = CALLREGCOMP(p, p + plen, pm);
+ if ((PL_hints & HINT_UTF8) || (SvUTF8(pat) && !(PL_hints & HINT_BYTE)))
+ pm->op_pmdynflags |= PMdf_UTF8;
+ pm->op_pmregexp = CALLREGCOMP(aTHX_ p, p + plen, pm);
if (strEQ("\\s+", pm->op_pmregexp->precomp))
pm->op_pmflags |= PMf_WHITE;
op_free(expr);
}
else {
+ if (PL_hints & HINT_UTF8)
+ pm->op_pmdynflags |= PMdf_UTF8;
if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL))
expr = newUNOP((!(PL_hints & HINT_RE_EVAL)
? OP_REGCRESET
: OP_REGCMAYBE),0,expr);
- Newz(1101, rcop, 1, LOGOP);
+ NewOp(1101, rcop, 1, LOGOP);
rcop->op_type = OP_REGCOMP;
- rcop->op_ppaddr = ppaddr[OP_REGCOMP];
+ rcop->op_ppaddr = PL_ppaddr[OP_REGCOMP];
rcop->op_first = scalar(expr);
rcop->op_flags |= ((PL_hints & HINT_RE_EVAL)
? (OPf_SPECIAL | OPf_KIDS)
@@ -2230,8 +2897,8 @@ pmruntime(OP *o, OP *expr, OP *repl)
OP *curop;
if (pm->op_pmflags & PMf_EVAL) {
curop = 0;
- if (PL_curcop->cop_line < PL_multi_end)
- PL_curcop->cop_line = PL_multi_end;
+ if (CopLINE(PL_curcop) < PL_multi_end)
+ CopLINE_set(PL_curcop, PL_multi_end);
}
#ifdef USE_THREADS
else if (repl->op_type == OP_THREADSV
@@ -2246,7 +2913,7 @@ pmruntime(OP *o, OP *expr, OP *repl)
else {
OP *lastop = 0;
for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
- if (opargs[curop->op_type] & OA_DANGEROUS) {
+ if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
#ifdef USE_THREADS
if (curop->op_type == OP_THREADSV) {
repl_has_vars = 1;
@@ -2255,7 +2922,7 @@ pmruntime(OP *o, OP *expr, OP *repl)
}
#else
if (curop->op_type == OP_GV) {
- GV *gv = ((GVOP*)curop)->op_gv;
+ GV *gv = cGVOPx_gv(curop);
repl_has_vars = 1;
if (strchr("&`'123456789+", *GvENAME(gv)))
break;
@@ -2297,9 +2964,9 @@ pmruntime(OP *o, OP *expr, OP *repl)
pm->op_pmflags |= PMf_MAYBE_CONST;
pm->op_pmpermflags |= PMf_MAYBE_CONST;
}
- Newz(1101, rcop, 1, LOGOP);
+ NewOp(1101, rcop, 1, LOGOP);
rcop->op_type = OP_SUBSTCONT;
- rcop->op_ppaddr = ppaddr[OP_SUBSTCONT];
+ rcop->op_ppaddr = PL_ppaddr[OP_SUBSTCONT];
rcop->op_first = scalar(repl);
rcop->op_flags |= OPf_KIDS;
rcop->op_private = 1;
@@ -2319,59 +2986,73 @@ pmruntime(OP *o, OP *expr, OP *repl)
}
OP *
-newSVOP(I32 type, I32 flags, SV *sv)
+Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
{
SVOP *svop;
- Newz(1101, svop, 1, SVOP);
+ NewOp(1101, svop, 1, SVOP);
svop->op_type = type;
- svop->op_ppaddr = ppaddr[type];
+ svop->op_ppaddr = PL_ppaddr[type];
svop->op_sv = sv;
svop->op_next = (OP*)svop;
svop->op_flags = flags;
- if (opargs[type] & OA_RETSCALAR)
+ if (PL_opargs[type] & OA_RETSCALAR)
scalar((OP*)svop);
- if (opargs[type] & OA_TARGET)
+ if (PL_opargs[type] & OA_TARGET)
svop->op_targ = pad_alloc(type, SVs_PADTMP);
return CHECKOP(type, svop);
}
OP *
-newGVOP(I32 type, I32 flags, GV *gv)
+Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
+{
+ PADOP *padop;
+ NewOp(1101, padop, 1, PADOP);
+ padop->op_type = type;
+ padop->op_ppaddr = PL_ppaddr[type];
+ padop->op_padix = pad_alloc(type, SVs_PADTMP);
+ SvREFCNT_dec(PL_curpad[padop->op_padix]);
+ PL_curpad[padop->op_padix] = sv;
+ SvPADTMP_on(sv);
+ padop->op_next = (OP*)padop;
+ padop->op_flags = flags;
+ if (PL_opargs[type] & OA_RETSCALAR)
+ scalar((OP*)padop);
+ if (PL_opargs[type] & OA_TARGET)
+ padop->op_targ = pad_alloc(type, SVs_PADTMP);
+ return CHECKOP(type, padop);
+}
+
+OP *
+Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
{
dTHR;
- GVOP *gvop;
- Newz(1101, gvop, 1, GVOP);
- gvop->op_type = type;
- gvop->op_ppaddr = ppaddr[type];
- gvop->op_gv = (GV*)SvREFCNT_inc(gv);
- gvop->op_next = (OP*)gvop;
- gvop->op_flags = flags;
- if (opargs[type] & OA_RETSCALAR)
- scalar((OP*)gvop);
- if (opargs[type] & OA_TARGET)
- gvop->op_targ = pad_alloc(type, SVs_PADTMP);
- return CHECKOP(type, gvop);
+#ifdef USE_ITHREADS
+ GvIN_PAD_on(gv);
+ return newPADOP(type, flags, SvREFCNT_inc(gv));
+#else
+ return newSVOP(type, flags, SvREFCNT_inc(gv));
+#endif
}
OP *
-newPVOP(I32 type, I32 flags, char *pv)
+Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
{
PVOP *pvop;
- Newz(1101, pvop, 1, PVOP);
+ NewOp(1101, pvop, 1, PVOP);
pvop->op_type = type;
- pvop->op_ppaddr = ppaddr[type];
+ pvop->op_ppaddr = PL_ppaddr[type];
pvop->op_pv = pv;
pvop->op_next = (OP*)pvop;
pvop->op_flags = flags;
- if (opargs[type] & OA_RETSCALAR)
+ if (PL_opargs[type] & OA_RETSCALAR)
scalar((OP*)pvop);
- if (opargs[type] & OA_TARGET)
+ if (PL_opargs[type] & OA_TARGET)
pvop->op_targ = pad_alloc(type, SVs_PADTMP);
return CHECKOP(type, pvop);
}
void
-package(OP *o)
+Perl_package(pTHX_ OP *o)
{
dTHR;
SV *sv;
@@ -2397,63 +3078,68 @@ package(OP *o)
}
void
-utilize(int aver, I32 floor, OP *version, OP *id, OP *arg)
+Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *id, OP *arg)
{
OP *pack;
- OP *meth;
OP *rqop;
OP *imop;
OP *veop;
GV *gv;
if (id->op_type != OP_CONST)
- croak("Module name must be constant");
+ Perl_croak(aTHX_ "Module name must be constant");
veop = Nullop;
- if(version != Nullop) {
+ if (version != Nullop) {
SV *vesv = ((SVOP*)version)->op_sv;
- if (arg == Nullop && !SvNIOK(vesv)) {
+ if (arg == Nullop && !SvNIOKp(vesv)) {
arg = version;
}
else {
OP *pack;
- OP *meth;
+ SV *meth;
- if (version->op_type != OP_CONST || !SvNIOK(vesv))
- croak("Version number must be constant number");
+ if (version->op_type != OP_CONST || !SvNIOKp(vesv))
+ Perl_croak(aTHX_ "Version number must be constant number");
/* Make copy of id so we don't free it twice */
pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
/* Fake up a method call to VERSION */
- meth = newSVOP(OP_CONST, 0, newSVpv("VERSION", 7));
+ meth = newSVpvn("VERSION",7);
+ sv_upgrade(meth, SVt_PVIV);
+ (void)SvIOK_on(meth);
+ PERL_HASH(SvUVX(meth), SvPVX(meth), SvCUR(meth));
veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
append_elem(OP_LIST,
- prepend_elem(OP_LIST, pack, list(version)),
- newUNOP(OP_METHOD, 0, meth)));
+ prepend_elem(OP_LIST, pack, list(version)),
+ newSVOP(OP_METHOD_NAMED, 0, meth)));
}
}
/* Fake up an import/unimport */
if (arg && arg->op_type == OP_STUB)
imop = arg; /* no import on explicit () */
- else if(SvNIOK(((SVOP*)id)->op_sv)) {
+ else if (SvNIOKp(((SVOP*)id)->op_sv)) {
imop = Nullop; /* use 5.0; */
}
else {
+ SV *meth;
+
/* Make copy of id so we don't free it twice */
pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)id)->op_sv));
- meth = newSVOP(OP_CONST, 0,
- aver
- ? newSVpv("import", 6)
- : newSVpv("unimport", 8)
- );
+
+ /* Fake up a method call to import/unimport */
+ meth = aver ? newSVpvn("import",6) : newSVpvn("unimport", 8);;
+ sv_upgrade(meth, SVt_PVIV);
+ (void)SvIOK_on(meth);
+ PERL_HASH(SvUVX(meth), SvPVX(meth), SvCUR(meth));
imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
- append_elem(OP_LIST,
- prepend_elem(OP_LIST, pack, list(arg)),
- newUNOP(OP_METHOD, 0, meth)));
+ append_elem(OP_LIST,
+ prepend_elem(OP_LIST, pack, list(arg)),
+ newSVOP(OP_METHOD_NAMED, 0, meth)));
}
/* Fake up a require, handle override, if any */
@@ -2473,8 +3159,9 @@ utilize(int aver, I32 floor, OP *version, OP *id, OP *arg)
}
/* Fake up the BEGIN {}, which does its thing immediately. */
- newSUB(floor,
- newSVOP(OP_CONST, 0, newSVpv("BEGIN", 5)),
+ newATTRSUB(floor,
+ newSVOP(OP_CONST, 0, newSVpvn("BEGIN", 5)),
+ Nullop,
Nullop,
append_elem(OP_LINESEQ,
append_elem(OP_LINESEQ,
@@ -2482,12 +3169,65 @@ utilize(int aver, I32 floor, OP *version, OP *id, OP *arg)
newSTATEOP(0, Nullch, veop)),
newSTATEOP(0, Nullch, imop) ));
+ PL_hints |= HINT_BLOCK_SCOPE;
PL_copline = NOLINE;
PL_expect = XSTATE;
}
+void
+Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...)
+{
+ va_list args;
+ va_start(args, ver);
+ vload_module(flags, name, ver, &args);
+ va_end(args);
+}
+
+#ifdef PERL_IMPLICIT_CONTEXT
+void
+Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, ver);
+ vload_module(flags, name, ver, &args);
+ va_end(args);
+}
+#endif
+
+void
+Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
+{
+ OP *modname, *veop, *imop;
+
+ modname = newSVOP(OP_CONST, 0, name);
+ modname->op_private |= OPpCONST_BARE;
+ if (ver) {
+ veop = newSVOP(OP_CONST, 0, ver);
+ }
+ else
+ veop = Nullop;
+ if (flags & PERL_LOADMOD_NOIMPORT) {
+ imop = sawparens(newNULLLIST());
+ }
+ else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+ imop = va_arg(*args, OP*);
+ }
+ else {
+ SV *sv;
+ imop = Nullop;
+ sv = va_arg(*args, SV*);
+ while (sv) {
+ imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+ sv = va_arg(*args, SV*);
+ }
+ }
+ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
+ veop, modname, imop);
+}
+
OP *
-dofile(OP *term)
+Perl_dofile(pTHX_ OP *term)
{
OP *doop;
GV *gv;
@@ -2510,7 +3250,7 @@ dofile(OP *term)
}
OP *
-newSLICEOP(I32 flags, OP *subscript, OP *listval)
+Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
{
return newBINOP(OP_LSLICE, flags,
list(force_list(subscript)),
@@ -2518,7 +3258,7 @@ newSLICEOP(I32 flags, OP *subscript, OP *listval)
}
STATIC I32
-list_assignment(register OP *o)
+S_list_assignment(pTHX_ register OP *o)
{
if (!o)
return TRUE;
@@ -2527,8 +3267,8 @@ list_assignment(register OP *o)
o = cUNOPo->op_first;
if (o->op_type == OP_COND_EXPR) {
- I32 t = list_assignment(cCONDOPo->op_first->op_sibling);
- I32 f = list_assignment(cCONDOPo->op_first->op_sibling->op_sibling);
+ I32 t = list_assignment(cLOGOPo->op_first->op_sibling);
+ I32 f = list_assignment(cLOGOPo->op_first->op_sibling->op_sibling);
if (t && f)
return TRUE;
@@ -2552,7 +3292,7 @@ list_assignment(register OP *o)
}
OP *
-newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)
+Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
{
OP *o;
@@ -2570,6 +3310,8 @@ newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)
if (list_assignment(left)) {
dTHR;
+ OP *curop;
+
PL_modcount = 0;
PL_eval_start = right; /* Grandfathering $[ assignment here. Bletch.*/
left = mod(left, OP_AASSIGN);
@@ -2580,18 +3322,25 @@ newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)
op_free(right);
return Nullop;
}
- o = newBINOP(OP_AASSIGN, flags,
- list(force_list(right)),
- list(force_list(left)) );
+ curop = list(force_list(left));
+ o = newBINOP(OP_AASSIGN, flags, list(force_list(right)), curop);
o->op_private = 0 | (flags >> 8);
+ for (curop = ((LISTOP*)curop)->op_first;
+ curop; curop = curop->op_sibling)
+ {
+ if (curop->op_type == OP_RV2HV &&
+ ((UNOP*)curop)->op_first->op_type != OP_GV) {
+ o->op_private |= OPpASSIGN_HASH;
+ break;
+ }
+ }
if (!(left->op_private & OPpLVAL_INTRO)) {
- OP *curop;
OP *lastop = o;
PL_generation++;
for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
- if (opargs[curop->op_type] & OA_DANGEROUS) {
+ if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
if (curop->op_type == OP_GV) {
- GV *gv = ((GVOP*)curop)->op_gv;
+ GV *gv = cGVOPx_gv(curop);
if (gv == PL_defgv || SvCUR(gv) == PL_generation)
break;
SvCUR(gv) = PL_generation;
@@ -2629,7 +3378,7 @@ newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)
lastop = curop;
}
if (curop != o)
- o->op_private = OPpASSIGN_COMMON;
+ o->op_private |= OPpASSIGN_COMMON;
}
if (right && right->op_type == OP_SPLIT) {
OP* tmpop;
@@ -2643,7 +3392,13 @@ newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)
{
tmpop = ((UNOP*)left)->op_first;
if (tmpop->op_type == OP_GV && !pm->op_pmreplroot) {
- pm->op_pmreplroot = (OP*)((GVOP*)tmpop)->op_gv;
+#ifdef USE_ITHREADS
+ pm->op_pmreplroot = (OP*)cPADOPx(tmpop)->op_padix;
+ cPADOPx(tmpop)->op_padix = 0; /* steal it */
+#else
+ pm->op_pmreplroot = (OP*)cSVOPx(tmpop)->op_sv;
+ cSVOPx(tmpop)->op_sv = Nullsv; /* steal it */
+#endif
pm->op_pmflags |= PMf_ONCE;
tmpop = cUNOPo->op_first; /* to list (nulled) */
tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
@@ -2689,26 +3444,27 @@ newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)
}
OP *
-newSTATEOP(I32 flags, char *label, OP *o)
+Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
{
dTHR;
U32 seq = intro_my();
register COP *cop;
- Newz(1101, cop, 1, COP);
- if (PERLDB_LINE && PL_curcop->cop_line && PL_curstash != PL_debstash) {
+ NewOp(1101, cop, 1, COP);
+ if (PERLDB_LINE && CopLINE(PL_curcop) && PL_curstash != PL_debstash) {
cop->op_type = OP_DBSTATE;
- cop->op_ppaddr = ppaddr[ OP_DBSTATE ];
+ cop->op_ppaddr = PL_ppaddr[ OP_DBSTATE ];
}
else {
cop->op_type = OP_NEXTSTATE;
- cop->op_ppaddr = ppaddr[ OP_NEXTSTATE ];
+ cop->op_ppaddr = PL_ppaddr[ OP_NEXTSTATE ];
}
cop->op_flags = flags;
- cop->op_private = 0 | (flags >> 8);
+ cop->op_private = (PL_hints & HINT_BYTE);
#ifdef NATIVE_HINTS
cop->op_private |= NATIVE_HINTS;
#endif
+ PL_compiling.op_private = cop->op_private;
cop->op_next = (OP*)cop;
if (label) {
@@ -2717,22 +3473,30 @@ newSTATEOP(I32 flags, char *label, OP *o)
}
cop->cop_seq = seq;
cop->cop_arybase = PL_curcop->cop_arybase;
+ if (specialWARN(PL_curcop->cop_warnings))
+ cop->cop_warnings = PL_curcop->cop_warnings ;
+ else
+ cop->cop_warnings = newSVsv(PL_curcop->cop_warnings) ;
+
if (PL_copline == NOLINE)
- cop->cop_line = PL_curcop->cop_line;
+ CopLINE_set(cop, CopLINE(PL_curcop));
else {
- cop->cop_line = PL_copline;
+ CopLINE_set(cop, PL_copline);
PL_copline = NOLINE;
}
- cop->cop_filegv = (GV*)SvREFCNT_inc(PL_curcop->cop_filegv);
- cop->cop_stash = PL_curstash;
+#ifdef USE_ITHREADS
+ CopFILE_set(cop, CopFILE(PL_curcop)); /* XXXXX share in a pvtable? */
+#else
+ CopFILEGV_set(cop, (GV*)SvREFCNT_inc(CopFILEGV(PL_curcop)));
+#endif
+ CopSTASH_set(cop, PL_curstash);
if (PERLDB_LINE && PL_curstash != PL_debstash) {
- SV **svp = av_fetch(GvAV(PL_curcop->cop_filegv),(I32)cop->cop_line, FALSE);
+ SV **svp = av_fetch(CopFILEAV(PL_curcop), (I32)CopLINE(cop), FALSE);
if (svp && *svp != &PL_sv_undef && !SvIOK(*svp)) {
(void)SvIOK_on(*svp);
- SvIVX(*svp) = 1;
- SvSTASH(*svp) = (HV*)cop;
+ SvIVX(*svp) = PTR2IV(cop);
}
}
@@ -2741,7 +3505,7 @@ newSTATEOP(I32 flags, char *label, OP *o)
/* "Introduce" my variables to visible status. */
U32
-intro_my(void)
+Perl_intro_my(pTHX)
{
SV **svp;
SV *sv;
@@ -2754,7 +3518,7 @@ intro_my(void)
for (i = PL_min_intro_pending; i <= PL_max_intro_pending; i++) {
if ((sv = svp[i]) && sv != &PL_sv_undef && !SvIVX(sv)) {
SvIVX(sv) = PAD_MAX; /* Don't know scope end yet. */
- SvNVX(sv) = (double)PL_cop_seqmax;
+ SvNVX(sv) = (NV)PL_cop_seqmax;
}
}
PL_min_intro_pending = 0;
@@ -2763,13 +3527,13 @@ intro_my(void)
}
OP *
-newLOGOP(I32 type, I32 flags, OP *first, OP *other)
+Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
{
return new_logop(type, flags, &first, &other);
}
STATIC OP *
-new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
+S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
{
dTHR;
LOGOP *logop;
@@ -2797,8 +3561,8 @@ new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
}
}
if (first->op_type == OP_CONST) {
- if (PL_dowarn && (first->op_private & OPpCONST_BARE))
- warn("Probable precedence problem on %s", op_desc[type]);
+ if (ckWARN(WARN_BAREWORD) && (first->op_private & OPpCONST_BARE))
+ Perl_warner(aTHX_ WARN_BAREWORD, "Bareword found in conditional");
if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
op_free(first);
*firstp = Nullop;
@@ -2816,7 +3580,7 @@ new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
else
scalar(other);
}
- else if (PL_dowarn && (first->op_flags & OPf_KIDS)) {
+ else if (ckWARN(WARN_MISC) && (first->op_flags & OPf_KIDS)) {
OP *k1 = ((UNOP*)first)->op_first;
OP *k2 = k1->op_sibling;
OPCODE warnop = 0;
@@ -2826,24 +3590,31 @@ new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
if (k2 && k2->op_type == OP_READLINE
&& (k2->op_flags & OPf_STACKED)
&& ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
+ {
warnop = k2->op_type;
+ }
break;
case OP_SASSIGN:
if (k1->op_type == OP_READDIR
|| k1->op_type == OP_GLOB
+ || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
|| k1->op_type == OP_EACH)
- warnop = k1->op_type;
+ {
+ warnop = ((k1->op_type == OP_NULL)
+ ? k1->op_targ : k1->op_type);
+ }
break;
}
if (warnop) {
- line_t oldline = PL_curcop->cop_line;
- PL_curcop->cop_line = PL_copline;
- warn("Value of %s%s can be \"0\"; test with defined()",
- op_desc[warnop],
+ line_t oldline = CopLINE(PL_curcop);
+ CopLINE_set(PL_curcop, PL_copline);
+ Perl_warner(aTHX_ WARN_MISC,
+ "Value of %s%s can be \"0\"; test with defined()",
+ PL_op_desc[warnop],
((warnop == OP_READLINE || warnop == OP_GLOB)
? " construct" : "() operator"));
- PL_curcop->cop_line = oldline;
+ CopLINE_set(PL_curcop, oldline);
}
}
@@ -2853,10 +3624,10 @@ new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
if (type == OP_ANDASSIGN || type == OP_ORASSIGN)
other->op_private |= OPpASSIGN_BACKWARDS; /* other is an OP_SASSIGN */
- Newz(1101, logop, 1, LOGOP);
+ NewOp(1101, logop, 1, LOGOP);
logop->op_type = type;
- logop->op_ppaddr = ppaddr[type];
+ logop->op_ppaddr = PL_ppaddr[type];
logop->op_first = first;
logop->op_flags = flags | OPf_KIDS;
logop->op_other = LINKLIST(other);
@@ -2874,10 +3645,11 @@ new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
}
OP *
-newCONDOP(I32 flags, OP *first, OP *trueop, OP *falseop)
+Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
{
dTHR;
- CONDOP *condop;
+ LOGOP *logop;
+ OP *start;
OP *o;
if (!falseop)
@@ -2902,62 +3674,64 @@ newCONDOP(I32 flags, OP *first, OP *trueop, OP *falseop)
list(trueop);
scalar(falseop);
}
- Newz(1101, condop, 1, CONDOP);
+ NewOp(1101, logop, 1, LOGOP);
+ logop->op_type = OP_COND_EXPR;
+ logop->op_ppaddr = PL_ppaddr[OP_COND_EXPR];
+ logop->op_first = first;
+ logop->op_flags = flags | OPf_KIDS;
+ logop->op_private = 1 | (flags >> 8);
+ logop->op_other = LINKLIST(trueop);
+ logop->op_next = LINKLIST(falseop);
- condop->op_type = OP_COND_EXPR;
- condop->op_ppaddr = ppaddr[OP_COND_EXPR];
- condop->op_first = first;
- condop->op_flags = flags | OPf_KIDS;
- condop->op_true = LINKLIST(trueop);
- condop->op_false = LINKLIST(falseop);
- condop->op_private = 1 | (flags >> 8);
/* establish postfix order */
- condop->op_next = LINKLIST(first);
- first->op_next = (OP*)condop;
+ start = LINKLIST(first);
+ first->op_next = (OP*)logop;
first->op_sibling = trueop;
trueop->op_sibling = falseop;
- o = newUNOP(OP_NULL, 0, (OP*)condop);
+ o = newUNOP(OP_NULL, 0, (OP*)logop);
- trueop->op_next = o;
- falseop->op_next = o;
+ trueop->op_next = falseop->op_next = o;
+ o->op_next = start;
return o;
}
OP *
-newRANGE(I32 flags, OP *left, OP *right)
+Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
{
dTHR;
- CONDOP *condop;
+ LOGOP *range;
OP *flip;
OP *flop;
+ OP *leftstart;
OP *o;
- Newz(1101, condop, 1, CONDOP);
+ NewOp(1101, range, 1, LOGOP);
- condop->op_type = OP_RANGE;
- condop->op_ppaddr = ppaddr[OP_RANGE];
- condop->op_first = left;
- condop->op_flags = OPf_KIDS;
- condop->op_true = LINKLIST(left);
- condop->op_false = LINKLIST(right);
- condop->op_private = 1 | (flags >> 8);
+ range->op_type = OP_RANGE;
+ range->op_ppaddr = PL_ppaddr[OP_RANGE];
+ range->op_first = left;
+ range->op_flags = OPf_KIDS;
+ leftstart = LINKLIST(left);
+ range->op_other = LINKLIST(right);
+ range->op_private = 1 | (flags >> 8);
left->op_sibling = right;
- condop->op_next = (OP*)condop;
- flip = newUNOP(OP_FLIP, flags, (OP*)condop);
+ range->op_next = (OP*)range;
+ flip = newUNOP(OP_FLIP, flags, (OP*)range);
flop = newUNOP(OP_FLOP, 0, flip);
o = newUNOP(OP_NULL, 0, flop);
linklist(flop);
+ range->op_next = leftstart;
left->op_next = flip;
right->op_next = flop;
- condop->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
- sv_upgrade(PAD_SV(condop->op_targ), SVt_PVNV);
+ range->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
+ sv_upgrade(PAD_SV(range->op_targ), SVt_PVNV);
flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
@@ -2972,7 +3746,7 @@ newRANGE(I32 flags, OP *left, OP *right)
}
OP *
-newLOOPOP(I32 flags, I32 debuggable, OP *expr, OP *block)
+Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
{
dTHR;
OP* listop;
@@ -3001,6 +3775,7 @@ newLOOPOP(I32 flags, I32 debuggable, OP *expr, OP *block)
case OP_SASSIGN:
if (k1->op_type == OP_READDIR
|| k1->op_type == OP_GLOB
+ || (k1->op_type == OP_NULL && k1->op_targ == OP_NULL)
|| k1->op_type == OP_EACH)
expr = newUNOP(OP_DEFINED, 0, expr);
break;
@@ -3027,7 +3802,7 @@ newLOOPOP(I32 flags, I32 debuggable, OP *expr, OP *block)
}
OP *
-newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *block, OP *cont)
+Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *block, OP *cont)
{
dTHR;
OP *redo;
@@ -3035,6 +3810,7 @@ newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *b
OP *listop;
OP *o;
OP *condop;
+ U8 loopflags = 0;
if (expr && (expr->op_type == OP_READLINE || expr->op_type == OP_GLOB
|| (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB))) {
@@ -3054,6 +3830,7 @@ newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *b
case OP_SASSIGN:
if (k1->op_type == OP_READDIR
|| k1->op_type == OP_GLOB
+ || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
|| k1->op_type == OP_EACH)
expr = newUNOP(OP_DEFINED, 0, expr);
break;
@@ -3062,9 +3839,14 @@ newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *b
if (!block)
block = newOP(OP_NULL, 0);
+ else if (cont) {
+ block = scope(block);
+ }
- if (cont)
+ if (cont) {
next = LINKLIST(cont);
+ loopflags |= OPpLOOP_CONTINUE;
+ }
if (expr) {
cont = append_elem(OP_LINESEQ, cont, newOP(OP_UNSTACK, 0));
if ((line_t)whileline != NOLINE) {
@@ -3096,9 +3878,9 @@ newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *b
o = listop;
if (!loop) {
- Newz(1101,loop,1,LOOP);
+ NewOp(1101,loop,1,LOOP);
loop->op_type = OP_ENTERLOOP;
- loop->op_ppaddr = ppaddr[OP_ENTERLOOP];
+ loop->op_ppaddr = PL_ppaddr[OP_ENTERLOOP];
loop->op_private = 0;
loop->op_next = (OP*)loop;
}
@@ -3107,6 +3889,7 @@ newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *b
loop->op_redoop = redo;
loop->op_lastop = o;
+ o->op_private |= loopflags;
if (next)
loop->op_nextop = next;
@@ -3119,7 +3902,7 @@ newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *b
}
OP *
-newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont)
+Perl_newFOROP(pTHX_ I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont)
{
LOOP *loop;
OP *wop;
@@ -3129,21 +3912,23 @@ newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont
if (sv) {
if (sv->op_type == OP_RV2SV) { /* symbol table variable */
sv->op_type = OP_RV2GV;
- sv->op_ppaddr = ppaddr[OP_RV2GV];
+ sv->op_ppaddr = PL_ppaddr[OP_RV2GV];
}
else if (sv->op_type == OP_PADSV) { /* private variable */
padoff = sv->op_targ;
+ sv->op_targ = 0;
op_free(sv);
sv = Nullop;
}
else if (sv->op_type == OP_THREADSV) { /* per-thread variable */
padoff = sv->op_targ;
+ sv->op_targ = 0;
iterflags |= OPf_SPECIAL;
op_free(sv);
sv = Nullop;
}
else
- croak("Can't use %s for loop variable", op_desc[sv->op_type]);
+ Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
}
else {
#ifdef USE_THREADS
@@ -3166,7 +3951,7 @@ newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont
* treated as min/max values by 'pp_iterinit'.
*/
UNOP* flip = (UNOP*)((UNOP*)((BINOP*)expr)->op_first)->op_first;
- CONDOP* range = (CONDOP*) flip->op_first;
+ LOGOP* range = (LOGOP*) flip->op_first;
OP* left = range->op_first;
OP* right = left->op_sibling;
LISTOP* listop;
@@ -3175,8 +3960,8 @@ newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont
range->op_first = Nullop;
listop = (LISTOP*)newLISTOP(OP_LIST, 0, left, right);
- listop->op_first->op_next = range->op_true;
- left->op_next = range->op_false;
+ listop->op_first->op_next = range->op_next;
+ left->op_next = range->op_other;
right->op_next = (OP*)listop;
listop->op_next = listop->op_first;
@@ -3193,7 +3978,16 @@ newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont
loop = (LOOP*)list(convert(OP_ENTERITER, iterflags,
append_elem(OP_LIST, expr, scalar(sv))));
assert(!loop->op_next);
+#ifdef PL_OP_SLAB_ALLOC
+ {
+ LOOP *tmp;
+ NewOp(1234,tmp,1,LOOP);
+ Copy(loop,tmp,1,LOOP);
+ loop = tmp;
+ }
+#else
Renew(loop, 1, LOOP);
+#endif
loop->op_targ = padoff;
wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont);
PL_copline = forline;
@@ -3201,11 +3995,12 @@ newFOROP(I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *block,OP *cont
}
OP*
-newLOOPEX(I32 type, OP *label)
+Perl_newLOOPEX(pTHX_ I32 type, OP *label)
{
dTHR;
OP *o;
STRLEN n_a;
+
if (type != OP_GOTO || label->op_type == OP_CONST) {
/* "last()" means "last" */
if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS))
@@ -3227,7 +4022,7 @@ newLOOPEX(I32 type, OP *label)
}
void
-cv_undef(CV *cv)
+Perl_cv_undef(pTHX_ CV *cv)
{
dTHR;
#ifdef USE_THREADS
@@ -3241,14 +4036,14 @@ cv_undef(CV *cv)
if (!CvXSUB(cv) && CvROOT(cv)) {
#ifdef USE_THREADS
if (CvDEPTH(cv) || (CvOWNER(cv) && CvOWNER(cv) != thr))
- croak("Can't undef active subroutine");
+ Perl_croak(aTHX_ "Can't undef active subroutine");
#else
if (CvDEPTH(cv))
- croak("Can't undef active subroutine");
+ Perl_croak(aTHX_ "Can't undef active subroutine");
#endif /* USE_THREADS */
ENTER;
- SAVESPTR(PL_curpad);
+ SAVEVPTR(PL_curpad);
PL_curpad = 0;
if (!CvCLONED(cv))
@@ -3285,11 +4080,10 @@ cv_undef(CV *cv)
}
}
-#ifdef DEBUG_CLOSURES
STATIC void
-cv_dump(cv)
-CV* cv;
+S_cv_dump(pTHX_ CV *cv)
{
+#ifdef DEBUGGING
CV *outside = CvOUTSIDE(cv);
AV* padlist = CvPADLIST(cv);
AV* pad_name;
@@ -3298,13 +4092,14 @@ CV* cv;
SV** ppad;
I32 ix;
- PerlIO_printf(Perl_debug_log, "\tCV=0x%lx (%s), OUTSIDE=0x%lx (%s)\n",
- cv,
+ PerlIO_printf(Perl_debug_log,
+ "\tCV=0x%"UVxf" (%s), OUTSIDE=0x%"UVxf" (%s)\n",
+ PTR2UV(cv),
(CvANON(cv) ? "ANON"
: (cv == PL_main_cv) ? "MAIN"
: CvUNIQUE(cv) ? "UNIQUE"
: CvGV(cv) ? GvNAME(CvGV(cv)) : "UNDEFINED"),
- outside,
+ PTR2UV(outside),
(!outside ? "null"
: CvANON(outside) ? "ANON"
: (outside == PL_main_cv) ? "MAIN"
@@ -3321,18 +4116,19 @@ CV* cv;
for (ix = 1; ix <= AvFILLp(pad_name); ix++) {
if (SvPOK(pname[ix]))
- PerlIO_printf(Perl_debug_log, "\t%4d. 0x%lx (%s\"%s\" %ld-%ld)\n",
- ix, ppad[ix],
+ PerlIO_printf(Perl_debug_log,
+ "\t%4d. 0x%"UVxf" (%s\"%s\" %"IVdf"-%"IVdf")\n",
+ (int)ix, PTR2UV(ppad[ix]),
SvFAKE(pname[ix]) ? "FAKE " : "",
SvPVX(pname[ix]),
- (long)I_32(SvNVX(pname[ix])),
- (long)SvIVX(pname[ix]));
+ (IV)I_32(SvNVX(pname[ix])),
+ SvIVX(pname[ix]));
}
+#endif /* DEBUGGING */
}
-#endif /* DEBUG_CLOSURES */
STATIC CV *
-cv_clone2(CV *proto, CV *outside)
+S_cv_clone2(pTHX_ CV *proto, CV *outside)
{
dTHR;
AV* av;
@@ -3350,23 +4146,21 @@ cv_clone2(CV *proto, CV *outside)
assert(!CvUNIQUE(proto));
ENTER;
- SAVESPTR(PL_curpad);
- SAVESPTR(PL_comppad);
+ SAVECOMPPAD();
SAVESPTR(PL_comppad_name);
SAVESPTR(PL_compcv);
cv = PL_compcv = (CV*)NEWSV(1104,0);
sv_upgrade((SV *)cv, SvTYPE(proto));
+ CvFLAGS(cv) = CvFLAGS(proto) & ~CVf_CLONE;
CvCLONED_on(cv);
- if (CvANON(proto))
- CvANON_on(cv);
#ifdef USE_THREADS
New(666, CvMUTEXP(cv), 1, perl_mutex);
MUTEX_INIT(CvMUTEXP(cv));
CvOWNER(cv) = 0;
#endif /* USE_THREADS */
- CvFILEGV(cv) = CvFILEGV(proto);
+ CvFILE(cv) = CvFILE(proto);
CvGV(cv) = (GV*)SvREFCNT_inc(CvGV(proto));
CvSTASH(cv) = CvSTASH(proto);
CvROOT(cv) = CvROOT(proto);
@@ -3406,7 +4200,7 @@ cv_clone2(CV *proto, CV *outside)
if (!off)
PL_curpad[ix] = SvREFCNT_inc(ppad[ix]);
else if (off != ix)
- croak("panic: cv_clone: %s", name);
+ Perl_croak(aTHX_ "panic: cv_clone: %s", name);
}
else { /* our own lexical */
SV* sv;
@@ -3425,6 +4219,9 @@ cv_clone2(CV *proto, CV *outside)
PL_curpad[ix] = sv;
}
}
+ else if (IS_PADGV(ppad[ix]) || IS_PADCONST(ppad[ix])) {
+ PL_curpad[ix] = SvREFCNT_inc(ppad[ix]);
+ }
else {
SV* sv = NEWSV(0,0);
SvPADTMP_on(sv);
@@ -3464,19 +4261,21 @@ cv_clone2(CV *proto, CV *outside)
}
CV *
-cv_clone(CV *proto)
+Perl_cv_clone(pTHX_ CV *proto)
{
CV *cv;
- MUTEX_LOCK(&PL_cred_mutex); /* XXX create separate mutex */
+ LOCK_CRED_MUTEX; /* XXX create separate mutex */
cv = cv_clone2(proto, CvOUTSIDE(proto));
- MUTEX_UNLOCK(&PL_cred_mutex); /* XXX create separate mutex */
+ UNLOCK_CRED_MUTEX; /* XXX create separate mutex */
return cv;
}
void
-cv_ckproto(CV *cv, GV *gv, char *p)
+Perl_cv_ckproto(pTHX_ CV *cv, GV *gv, char *p)
{
- if ((!p != !SvPOK(cv)) || (p && strNE(p, SvPVX(cv)))) {
+ dTHR;
+
+ if (((!p != !SvPOK(cv)) || (p && strNE(p, SvPVX(cv)))) && ckWARN_d(WARN_PROTOTYPE)) {
SV* msg = sv_newmortal();
SV* name = Nullsv;
@@ -3484,20 +4283,20 @@ cv_ckproto(CV *cv, GV *gv, char *p)
gv_efullname3(name = sv_newmortal(), gv, Nullch);
sv_setpv(msg, "Prototype mismatch:");
if (name)
- sv_catpvf(msg, " sub %_", name);
+ Perl_sv_catpvf(aTHX_ msg, " sub %"SVf, name);
if (SvPOK(cv))
- sv_catpvf(msg, " (%s)", SvPVX(cv));
+ Perl_sv_catpvf(aTHX_ msg, " (%s)", SvPVX(cv));
sv_catpv(msg, " vs ");
if (p)
- sv_catpvf(msg, "(%s)", p);
+ Perl_sv_catpvf(aTHX_ msg, "(%s)", p);
else
sv_catpv(msg, "none");
- warn("%_", msg);
+ Perl_warner(aTHX_ WARN_PROTOTYPE, "%"SVf, msg);
}
}
SV *
-cv_const_sv(CV *cv)
+Perl_cv_const_sv(pTHX_ CV *cv)
{
if (!cv || !SvPOK(cv) || SvCUR(cv))
return Nullsv;
@@ -3505,20 +4304,20 @@ cv_const_sv(CV *cv)
}
SV *
-op_const_sv(OP *o, CV *cv)
+Perl_op_const_sv(pTHX_ OP *o, CV *cv)
{
SV *sv = Nullsv;
- if(!o)
+ if (!o)
return Nullsv;
- if(o->op_type == OP_LINESEQ && cLISTOPo->op_first)
+ if (o->op_type == OP_LINESEQ && cLISTOPo->op_first)
o = cLISTOPo->op_first->op_sibling;
for (; o; o = o->op_next) {
OPCODE type = o->op_type;
- if(sv && o->op_next == o)
+ if (sv && o->op_next == o)
return sv;
if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
continue;
@@ -3526,9 +4325,9 @@ op_const_sv(OP *o, CV *cv)
break;
if (sv)
return Nullsv;
- if (type == OP_CONST)
+ if (type == OP_CONST && cSVOPo->op_sv)
sv = cSVOPo->op_sv;
- else if (type == OP_PADSV && cv) {
+ else if ((type == OP_PADSV || type == OP_CONST) && cv) {
AV* padav = (AV*)(AvARRAY(CvPADLIST(cv))[1]);
sv = padav ? AvARRAY(padav)[o->op_targ] : Nullsv;
if (!sv || (!SvREADONLY(sv) && SvREFCNT(sv) > 1))
@@ -3542,28 +4341,66 @@ op_const_sv(OP *o, CV *cv)
return sv;
}
+void
+Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+{
+ if (o)
+ SAVEFREEOP(o);
+ if (proto)
+ SAVEFREEOP(proto);
+ if (attrs)
+ SAVEFREEOP(attrs);
+ if (block)
+ SAVEFREEOP(block);
+ Perl_croak(aTHX_ "\"my sub\" not yet implemented");
+}
+
+CV *
+Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
+{
+ return Perl_newATTRSUB(aTHX_ floor, o, proto, Nullop, block);
+}
+
CV *
-newSUB(I32 floor, OP *o, OP *proto, OP *block)
+Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
{
dTHR;
STRLEN n_a;
- char *name = o ? SvPVx(cSVOPo->op_sv, n_a) : Nullch;
- GV *gv = gv_fetchpv(name ? name : "__ANON__",
- GV_ADDMULTI | (block ? 0 : GV_NOINIT), SVt_PVCV);
+ char *name;
+ char *aname;
+ GV *gv;
char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, n_a) : Nullch;
register CV *cv=0;
I32 ix;
+ name = o ? SvPVx(cSVOPo->op_sv, n_a) : Nullch;
+ if (!name && PERLDB_NAMEANON && CopLINE(PL_curcop)) {
+ SV *sv = sv_newmortal();
+ Perl_sv_setpvf(aTHX_ sv, "__ANON__[%s:%"IVdf"]",
+ CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
+ aname = SvPVX(sv);
+ }
+ else
+ aname = Nullch;
+ gv = gv_fetchpv(name ? name : (aname ? aname : "__ANON__"),
+ GV_ADDMULTI | ((block || attrs) ? 0 : GV_NOINIT),
+ SVt_PVCV);
+
if (o)
SAVEFREEOP(o);
if (proto)
SAVEFREEOP(proto);
+ if (attrs)
+ SAVEFREEOP(attrs);
- if (SvTYPE(gv) != SVt_PVGV) { /* Prototype now, and had
+ if (SvTYPE(gv) != SVt_PVGV) { /* Maybe prototype now, and had at
maximum a prototype before. */
if (SvTYPE(gv) > SVt_NULL) {
- if (!SvPOK((SV*)gv) && !(SvIOK((SV*)gv) && SvIVX((SV*)gv) == -1))
- warn("Runaway prototype");
+ if (!SvPOK((SV*)gv) && !(SvIOK((SV*)gv) && SvIVX((SV*)gv) == -1)
+ && ckWARN_d(WARN_PROTOTYPE))
+ {
+ Perl_warner(aTHX_ WARN_PROTOTYPE, "Runaway prototype");
+ }
cv_ckproto((CV*)gv, NULL, ps);
}
if (ps)
@@ -3578,37 +4415,70 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
if (!name || GvCVGEN(gv))
cv = Nullcv;
- else if (cv = GvCV(gv)) {
+ else if ((cv = GvCV(gv))) {
cv_ckproto(cv, gv, ps);
/* already defined (or promised)? */
if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
SV* const_sv;
bool const_changed = TRUE;
- if (!block) {
+ if (!block && !attrs) {
/* just a "sub foo;" when &foo is already defined */
SAVEFREESV(PL_compcv);
goto done;
}
/* ahem, death to those who redefine active sort subs */
if (PL_curstackinfo->si_type == PERLSI_SORT && PL_sortcop == CvSTART(cv))
- croak("Can't redefine active sort subroutine %s", name);
- if(const_sv = cv_const_sv(cv))
+ Perl_croak(aTHX_ "Can't redefine active sort subroutine %s", name);
+ if (!block)
+ goto withattrs;
+ if ((const_sv = cv_const_sv(cv)))
const_changed = sv_cmp(const_sv, op_const_sv(block, Nullcv));
- if ((const_sv && const_changed) || PL_dowarn && !(CvGV(cv) && GvSTASH(CvGV(cv))
- && HvNAME(GvSTASH(CvGV(cv)))
- && strEQ(HvNAME(GvSTASH(CvGV(cv))),
- "autouse"))) {
- line_t oldline = PL_curcop->cop_line;
- PL_curcop->cop_line = PL_copline;
- warn(const_sv ? "Constant subroutine %s redefined"
- : "Subroutine %s redefined", name);
- PL_curcop->cop_line = oldline;
+ if ((const_sv || const_changed) && ckWARN(WARN_REDEFINE))
+ {
+ line_t oldline = CopLINE(PL_curcop);
+ CopLINE_set(PL_curcop, PL_copline);
+ Perl_warner(aTHX_ WARN_REDEFINE,
+ const_sv ? "Constant subroutine %s redefined"
+ : "Subroutine %s redefined", name);
+ CopLINE_set(PL_curcop, oldline);
}
SvREFCNT_dec(cv);
cv = Nullcv;
}
}
+ withattrs:
+ if (attrs) {
+ HV *stash;
+ SV *rcv;
+
+ /* Need to do a C<use attributes $stash_of_cv,\&cv,@attrs>
+ * before we clobber PL_compcv.
+ */
+ if (cv && !block) {
+ rcv = (SV*)cv;
+ if (CvGV(cv) && GvSTASH(CvGV(cv)) && HvNAME(GvSTASH(CvGV(cv))))
+ stash = GvSTASH(CvGV(cv));
+ else if (CvSTASH(cv) && HvNAME(CvSTASH(cv)))
+ stash = CvSTASH(cv);
+ else
+ stash = PL_curstash;
+ }
+ else {
+ /* possibly about to re-define existing subr -- ignore old cv */
+ rcv = (SV*)PL_compcv;
+ if (name && GvSTASH(gv) && HvNAME(GvSTASH(gv)))
+ stash = GvSTASH(gv);
+ else
+ stash = PL_curstash;
+ }
+ apply_attrs(stash, rcv, attrs);
+ }
if (cv) { /* must reuse cv if autoloaded */
+ if (!block) {
+ /* got here with just attrs -- work done, so bug out */
+ SAVEFREESV(PL_compcv);
+ goto done;
+ }
cv_undef(cv);
CvFLAGS(cv) = CvFLAGS(PL_compcv);
CvOUTSIDE(cv) = CvOUTSIDE(PL_compcv);
@@ -3628,7 +4498,7 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
}
}
CvGV(cv) = (GV*)SvREFCNT_inc(gv);
- CvFILEGV(cv) = PL_curcop->cop_filegv;
+ CvFILE(cv) = CopFILE(PL_curcop);
CvSTASH(cv) = PL_curstash;
#ifdef USE_THREADS
CvOWNER(cv) = 0;
@@ -3650,12 +4520,12 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
if (strEQ(s, "BEGIN")) {
char *not_safe =
"BEGIN not safe after errors--compilation aborted";
- if (PL_in_eval & 4)
- croak(not_safe);
+ if (PL_in_eval & EVAL_KEEPERR)
+ Perl_croak(aTHX_ not_safe);
else {
/* force display of errors found but not reported */
sv_catpv(ERRSV, not_safe);
- croak("%s", SvPVx(ERRSV, n_a));
+ Perl_croak(aTHX_ "%s", SvPVx(ERRSV, n_a));
}
}
}
@@ -3670,12 +4540,25 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
if (AvFILLp(PL_comppad_name) < AvFILLp(PL_comppad))
av_store(PL_comppad_name, AvFILLp(PL_comppad), Nullsv);
+ if (CvLVALUE(cv)) {
+ CvROOT(cv) = newUNOP(OP_LEAVESUBLV, 0, scalarseq(block));
+ }
+ else {
+ CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
+ }
+ CvROOT(cv)->op_private |= OPpREFCOUNTED;
+ OpREFCNT_set(CvROOT(cv), 1);
+ CvSTART(cv) = LINKLIST(CvROOT(cv));
+ CvROOT(cv)->op_next = 0;
+ peep(CvSTART(cv));
+
+ /* now that optimizer has done its work, adjust pad values */
if (CvCLONE(cv)) {
SV **namep = AvARRAY(PL_comppad_name);
for (ix = AvFILLp(PL_comppad); ix > 0; ix--) {
SV *namesv;
- if (SvIMMORTAL(PL_curpad[ix]))
+ if (SvIMMORTAL(PL_curpad[ix]) || IS_PADGV(PL_curpad[ix]) || IS_PADCONST(PL_curpad[ix]))
continue;
/*
* The only things that a clonable function needs in its
@@ -3699,76 +4582,92 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
AvFLAGS(av) = AVf_REIFY;
for (ix = AvFILLp(PL_comppad); ix > 0; ix--) {
- if (SvIMMORTAL(PL_curpad[ix]))
+ if (SvIMMORTAL(PL_curpad[ix]) || IS_PADGV(PL_curpad[ix]) || IS_PADCONST(PL_curpad[ix]))
continue;
if (!SvPADMY(PL_curpad[ix]))
SvPADTMP_on(PL_curpad[ix]);
}
}
- CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
- CvSTART(cv) = LINKLIST(CvROOT(cv));
- CvROOT(cv)->op_next = 0;
- peep(CvSTART(cv));
-
- if (name) {
+ if (name || aname) {
char *s;
+ char *tname = (name ? name : aname);
if (PERLDB_SUBLINE && PL_curstash != PL_debstash) {
SV *sv = NEWSV(0,0);
SV *tmpstr = sv_newmortal();
GV *db_postponed = gv_fetchpv("DB::postponed", GV_ADDMULTI, SVt_PVHV);
- CV *cv;
+ CV *pcv;
HV *hv;
- sv_setpvf(sv, "%_:%ld-%ld",
- GvSV(PL_curcop->cop_filegv),
- (long)PL_subline, (long)PL_curcop->cop_line);
+ Perl_sv_setpvf(aTHX_ sv, "%s:%ld-%ld",
+ CopFILE(PL_curcop),
+ (long)PL_subline, (long)CopLINE(PL_curcop));
gv_efullname3(tmpstr, gv, Nullch);
hv_store(GvHV(PL_DBsub), SvPVX(tmpstr), SvCUR(tmpstr), sv, 0);
hv = GvHVn(db_postponed);
if (HvFILL(hv) > 0 && hv_exists(hv, SvPVX(tmpstr), SvCUR(tmpstr))
- && (cv = GvCV(db_postponed))) {
+ && (pcv = GvCV(db_postponed)))
+ {
dSP;
PUSHMARK(SP);
XPUSHs(tmpstr);
PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ call_sv((SV*)pcv, G_DISCARD);
}
}
- if ((s = strrchr(name,':')))
+ if ((s = strrchr(tname,':')))
s++;
else
- s = name;
+ s = tname;
+
+ if (*s != 'B' && *s != 'E' && *s != 'C' && *s != 'I')
+ goto done;
+
if (strEQ(s, "BEGIN")) {
I32 oldscope = PL_scopestack_ix;
ENTER;
- SAVESPTR(PL_compiling.cop_filegv);
- SAVEI16(PL_compiling.cop_line);
+ SAVECOPFILE(&PL_compiling);
+ SAVECOPLINE(&PL_compiling);
save_svref(&PL_rs);
sv_setsv(PL_rs, PL_nrs);
if (!PL_beginav)
PL_beginav = newAV();
DEBUG_x( dump_sub(gv) );
- av_push(PL_beginav, (SV *)cv);
+ av_push(PL_beginav, SvREFCNT_inc(cv));
GvCV(gv) = 0;
call_list(oldscope, PL_beginav);
PL_curcop = &PL_compiling;
+ PL_compiling.op_private = PL_hints;
LEAVE;
}
else if (strEQ(s, "END") && !PL_error_count) {
if (!PL_endav)
PL_endav = newAV();
+ DEBUG_x( dump_sub(gv) );
av_unshift(PL_endav, 1);
- av_store(PL_endav, 0, (SV *)cv);
+ av_store(PL_endav, 0, SvREFCNT_inc(cv));
+ GvCV(gv) = 0;
+ }
+ else if (strEQ(s, "CHECK") && !PL_error_count) {
+ if (!PL_checkav)
+ PL_checkav = newAV();
+ DEBUG_x( dump_sub(gv) );
+ if (PL_main_start && ckWARN(WARN_VOID))
+ Perl_warner(aTHX_ WARN_VOID, "Too late to run CHECK block");
+ av_unshift(PL_checkav, 1);
+ av_store(PL_checkav, 0, SvREFCNT_inc(cv));
GvCV(gv) = 0;
}
else if (strEQ(s, "INIT") && !PL_error_count) {
if (!PL_initav)
PL_initav = newAV();
+ DEBUG_x( dump_sub(gv) );
+ if (PL_main_start && ckWARN(WARN_VOID))
+ Perl_warner(aTHX_ WARN_VOID, "Too late to run INIT block");
av_push(PL_initav, SvREFCNT_inc(cv));
GvCV(gv) = 0;
}
@@ -3781,41 +4680,65 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
}
/* XXX unsafe for threads if eval_owner isn't held */
+/*
+=for apidoc newCONSTSUB
+
+Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
+eligible for inlining at compile-time.
+
+=cut
+*/
+
void
-newCONSTSUB(HV *stash, char *name, SV *sv)
+Perl_newCONSTSUB(pTHX_ HV *stash, char *name, SV *sv)
{
dTHR;
- U32 oldhints = PL_hints;
- HV *old_cop_stash = PL_curcop->cop_stash;
- HV *old_curstash = PL_curstash;
- line_t oldline = PL_curcop->cop_line;
- PL_curcop->cop_line = PL_copline;
+ ENTER;
+ SAVECOPLINE(PL_curcop);
+ SAVEHINTS();
+
+ CopLINE_set(PL_curcop, PL_copline);
PL_hints &= ~HINT_BLOCK_SCOPE;
- if(stash)
- PL_curstash = PL_curcop->cop_stash = stash;
- newSUB(
+ if (stash) {
+ SAVESPTR(PL_curstash);
+ SAVECOPSTASH(PL_curcop);
+ PL_curstash = stash;
+#ifdef USE_ITHREADS
+ CopSTASHPV(PL_curcop) = stash ? HvNAME(stash) : Nullch;
+#else
+ CopSTASH(PL_curcop) = stash;
+#endif
+ }
+
+ newATTRSUB(
start_subparse(FALSE, 0),
newSVOP(OP_CONST, 0, newSVpv(name,0)),
newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */
+ Nullop,
newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
);
- PL_hints = oldhints;
- PL_curcop->cop_stash = old_cop_stash;
- PL_curstash = old_curstash;
- PL_curcop->cop_line = oldline;
+ LEAVE;
}
+/*
+=for apidoc U||newXS
+
+Used by C<xsubpp> to hook up XSUBs as Perl subs.
+
+=cut
+*/
+
CV *
-newXS(char *name, void (*subaddr) (CV * _CPERLproto), char *filename)
+Perl_newXS(pTHX_ char *name, XSUBADDR_t subaddr, char *filename)
{
dTHR;
GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
register CV *cv;
- if (cv = (name ? GvCV(gv) : Nullcv)) {
+ if ((cv = (name ? GvCV(gv) : Nullcv))) {
if (GvCVGEN(gv)) {
/* just a cached method */
SvREFCNT_dec(cv);
@@ -3823,14 +4746,14 @@ newXS(char *name, void (*subaddr) (CV * _CPERLproto), char *filename)
}
else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
/* already defined (or promised) */
- if (PL_dowarn && !(CvGV(cv) && GvSTASH(CvGV(cv))
+ if (ckWARN(WARN_REDEFINE) && !(CvGV(cv) && GvSTASH(CvGV(cv))
&& HvNAME(GvSTASH(CvGV(cv)))
&& strEQ(HvNAME(GvSTASH(CvGV(cv))), "autouse"))) {
- line_t oldline = PL_curcop->cop_line;
+ line_t oldline = CopLINE(PL_curcop);
if (PL_copline != NOLINE)
- PL_curcop->cop_line = PL_copline;
- warn("Subroutine %s redefined",name);
- PL_curcop->cop_line = oldline;
+ CopLINE_set(PL_curcop, PL_copline);
+ Perl_warner(aTHX_ WARN_REDEFINE, "Subroutine %s redefined",name);
+ CopLINE_set(PL_curcop, oldline);
}
SvREFCNT_dec(cv);
cv = 0;
@@ -3854,7 +4777,9 @@ newXS(char *name, void (*subaddr) (CV * _CPERLproto), char *filename)
MUTEX_INIT(CvMUTEXP(cv));
CvOWNER(cv) = 0;
#endif /* USE_THREADS */
- CvFILEGV(cv) = gv_fetchfile(filename);
+ (void)gv_fetchfile(filename);
+ CvFILE(cv) = filename; /* NOTE: not copied, as it is expected to be
+ an external constant string */
CvXSUB(cv) = subaddr;
if (name) {
@@ -3863,34 +4788,50 @@ newXS(char *name, void (*subaddr) (CV * _CPERLproto), char *filename)
s++;
else
s = name;
+
+ if (*s != 'B' && *s != 'E' && *s != 'C' && *s != 'I')
+ goto done;
+
if (strEQ(s, "BEGIN")) {
if (!PL_beginav)
PL_beginav = newAV();
- av_push(PL_beginav, (SV *)cv);
+ av_push(PL_beginav, SvREFCNT_inc(cv));
GvCV(gv) = 0;
}
else if (strEQ(s, "END")) {
if (!PL_endav)
PL_endav = newAV();
av_unshift(PL_endav, 1);
- av_store(PL_endav, 0, (SV *)cv);
+ av_store(PL_endav, 0, SvREFCNT_inc(cv));
+ GvCV(gv) = 0;
+ }
+ else if (strEQ(s, "CHECK")) {
+ if (!PL_checkav)
+ PL_checkav = newAV();
+ if (PL_main_start && ckWARN(WARN_VOID))
+ Perl_warner(aTHX_ WARN_VOID, "Too late to run CHECK block");
+ av_unshift(PL_checkav, 1);
+ av_store(PL_checkav, 0, SvREFCNT_inc(cv));
GvCV(gv) = 0;
}
else if (strEQ(s, "INIT")) {
if (!PL_initav)
PL_initav = newAV();
- av_push(PL_initav, (SV *)cv);
+ if (PL_main_start && ckWARN(WARN_VOID))
+ Perl_warner(aTHX_ WARN_VOID, "Too late to run INIT block");
+ av_push(PL_initav, SvREFCNT_inc(cv));
GvCV(gv) = 0;
}
}
else
CvANON_on(cv);
+done:
return cv;
}
void
-newFORM(I32 floor, OP *o, OP *block)
+Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
{
dTHR;
register CV *cv;
@@ -3905,20 +4846,20 @@ newFORM(I32 floor, OP *o, OP *block)
name = "STDOUT";
gv = gv_fetchpv(name,TRUE, SVt_PVFM);
GvMULTI_on(gv);
- if (cv = GvFORM(gv)) {
- if (PL_dowarn) {
- line_t oldline = PL_curcop->cop_line;
+ if ((cv = GvFORM(gv))) {
+ if (ckWARN(WARN_REDEFINE)) {
+ line_t oldline = CopLINE(PL_curcop);
- PL_curcop->cop_line = PL_copline;
- warn("Format %s redefined",name);
- PL_curcop->cop_line = oldline;
+ CopLINE_set(PL_curcop, PL_copline);
+ Perl_warner(aTHX_ WARN_REDEFINE, "Format %s redefined",name);
+ CopLINE_set(PL_curcop, oldline);
}
SvREFCNT_dec(cv);
}
cv = PL_compcv;
GvFORM(gv) = cv;
CvGV(cv) = (GV*)SvREFCNT_inc(gv);
- CvFILEGV(cv) = PL_curcop->cop_filegv;
+ CvFILE(cv) = CopFILE(PL_curcop);
for (ix = AvFILLp(PL_comppad); ix > 0; ix--) {
if (!SvPADMY(PL_curpad[ix]) && !SvIMMORTAL(PL_curpad[ix]))
@@ -3926,6 +4867,8 @@ newFORM(I32 floor, OP *o, OP *block)
}
CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
+ CvROOT(cv)->op_private |= OPpREFCOUNTED;
+ OpREFCNT_set(CvROOT(cv), 1);
CvSTART(cv) = LINKLIST(CvROOT(cv));
CvROOT(cv)->op_next = 0;
peep(CvSTART(cv));
@@ -3935,122 +4878,133 @@ newFORM(I32 floor, OP *o, OP *block)
}
OP *
-newANONLIST(OP *o)
+Perl_newANONLIST(pTHX_ OP *o)
{
return newUNOP(OP_REFGEN, 0,
mod(list(convert(OP_ANONLIST, 0, o)), OP_REFGEN));
}
OP *
-newANONHASH(OP *o)
+Perl_newANONHASH(pTHX_ OP *o)
{
return newUNOP(OP_REFGEN, 0,
mod(list(convert(OP_ANONHASH, 0, o)), OP_REFGEN));
}
OP *
-newANONSUB(I32 floor, OP *proto, OP *block)
+Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block)
+{
+ return newANONATTRSUB(floor, proto, Nullop, block);
+}
+
+OP *
+Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block)
{
return newUNOP(OP_REFGEN, 0,
- newSVOP(OP_ANONCODE, 0, (SV*)newSUB(floor, 0, proto, block)));
+ newSVOP(OP_ANONCODE, 0,
+ (SV*)newATTRSUB(floor, 0, proto, attrs, block)));
}
OP *
-oopsAV(OP *o)
+Perl_oopsAV(pTHX_ OP *o)
{
switch (o->op_type) {
case OP_PADSV:
o->op_type = OP_PADAV;
- o->op_ppaddr = ppaddr[OP_PADAV];
+ o->op_ppaddr = PL_ppaddr[OP_PADAV];
return ref(o, OP_RV2AV);
case OP_RV2SV:
o->op_type = OP_RV2AV;
- o->op_ppaddr = ppaddr[OP_RV2AV];
+ o->op_ppaddr = PL_ppaddr[OP_RV2AV];
ref(o, OP_RV2AV);
break;
default:
- warn("oops: oopsAV");
+ if (ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "oops: oopsAV");
break;
}
return o;
}
OP *
-oopsHV(OP *o)
+Perl_oopsHV(pTHX_ OP *o)
{
+ dTHR;
+
switch (o->op_type) {
case OP_PADSV:
case OP_PADAV:
o->op_type = OP_PADHV;
- o->op_ppaddr = ppaddr[OP_PADHV];
+ o->op_ppaddr = PL_ppaddr[OP_PADHV];
return ref(o, OP_RV2HV);
case OP_RV2SV:
case OP_RV2AV:
o->op_type = OP_RV2HV;
- o->op_ppaddr = ppaddr[OP_RV2HV];
+ o->op_ppaddr = PL_ppaddr[OP_RV2HV];
ref(o, OP_RV2HV);
break;
default:
- warn("oops: oopsHV");
+ if (ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "oops: oopsHV");
break;
}
return o;
}
OP *
-newAVREF(OP *o)
+Perl_newAVREF(pTHX_ OP *o)
{
if (o->op_type == OP_PADANY) {
o->op_type = OP_PADAV;
- o->op_ppaddr = ppaddr[OP_PADAV];
+ o->op_ppaddr = PL_ppaddr[OP_PADAV];
return o;
}
return newUNOP(OP_RV2AV, 0, scalar(o));
}
OP *
-newGVREF(I32 type, OP *o)
+Perl_newGVREF(pTHX_ I32 type, OP *o)
{
- if (type == OP_MAPSTART || type == OP_GREPSTART)
+ if (type == OP_MAPSTART || type == OP_GREPSTART || type == OP_SORT)
return newUNOP(OP_NULL, 0, o);
return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
}
OP *
-newHVREF(OP *o)
+Perl_newHVREF(pTHX_ OP *o)
{
if (o->op_type == OP_PADANY) {
o->op_type = OP_PADHV;
- o->op_ppaddr = ppaddr[OP_PADHV];
+ o->op_ppaddr = PL_ppaddr[OP_PADHV];
return o;
}
return newUNOP(OP_RV2HV, 0, scalar(o));
}
OP *
-oopsCV(OP *o)
+Perl_oopsCV(pTHX_ OP *o)
{
- croak("NOT IMPL LINE %d",__LINE__);
+ Perl_croak(aTHX_ "NOT IMPL LINE %d",__LINE__);
/* STUB */
return o;
}
OP *
-newCVREF(I32 flags, OP *o)
+Perl_newCVREF(pTHX_ I32 flags, OP *o)
{
return newUNOP(OP_RV2CV, flags, scalar(o));
}
OP *
-newSVREF(OP *o)
+Perl_newSVREF(pTHX_ OP *o)
{
if (o->op_type == OP_PADANY) {
o->op_type = OP_PADSV;
- o->op_ppaddr = ppaddr[OP_PADSV];
+ o->op_ppaddr = PL_ppaddr[OP_PADSV];
return o;
}
else if (o->op_type == OP_THREADSV && !(o->op_flags & OPpDONE_SVREF)) {
@@ -4063,7 +5017,7 @@ newSVREF(OP *o)
/* Check routines. */
OP *
-ck_anoncode(OP *o)
+Perl_ck_anoncode(pTHX_ OP *o)
{
PADOFFSET ix;
SV* name;
@@ -4083,14 +5037,14 @@ ck_anoncode(OP *o)
}
OP *
-ck_bitop(OP *o)
+Perl_ck_bitop(pTHX_ OP *o)
{
o->op_private = PL_hints;
return o;
}
OP *
-ck_concat(OP *o)
+Perl_ck_concat(pTHX_ OP *o)
{
if (cUNOPo->op_first->op_type == OP_CONCAT)
o->op_flags |= OPf_STACKED;
@@ -4098,7 +5052,7 @@ ck_concat(OP *o)
}
OP *
-ck_spair(OP *o)
+Perl_ck_spair(pTHX_ OP *o)
{
if (o->op_flags & OPf_KIDS) {
OP* newop;
@@ -4109,7 +5063,7 @@ ck_spair(OP *o)
newop = kUNOP->op_first->op_sibling;
if (newop &&
(newop->op_sibling ||
- !(opargs[newop->op_type] & OA_RETSCALAR) ||
+ !(PL_opargs[newop->op_type] & OA_RETSCALAR) ||
newop->op_type == OP_PADAV || newop->op_type == OP_PADHV ||
newop->op_type == OP_RV2AV || newop->op_type == OP_RV2HV)) {
@@ -4118,29 +5072,40 @@ ck_spair(OP *o)
op_free(kUNOP->op_first);
kUNOP->op_first = newop;
}
- o->op_ppaddr = ppaddr[++o->op_type];
+ o->op_ppaddr = PL_ppaddr[++o->op_type];
return ck_fun(o);
}
OP *
-ck_delete(OP *o)
+Perl_ck_delete(pTHX_ OP *o)
{
o = ck_fun(o);
o->op_private = 0;
if (o->op_flags & OPf_KIDS) {
OP *kid = cUNOPo->op_first;
- if (kid->op_type == OP_HSLICE)
+ switch (kid->op_type) {
+ case OP_ASLICE:
+ o->op_flags |= OPf_SPECIAL;
+ /* FALL THROUGH */
+ case OP_HSLICE:
o->op_private |= OPpSLICE;
- else if (kid->op_type != OP_HELEM)
- croak("%s argument is not a HASH element or slice",
- op_desc[o->op_type]);
+ break;
+ case OP_AELEM:
+ o->op_flags |= OPf_SPECIAL;
+ /* FALL THROUGH */
+ case OP_HELEM:
+ break;
+ default:
+ Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element or slice",
+ PL_op_desc[o->op_type]);
+ }
null(kid);
}
return o;
}
OP *
-ck_eof(OP *o)
+Perl_ck_eof(pTHX_ OP *o)
{
I32 type = o->op_type;
@@ -4156,7 +5121,7 @@ ck_eof(OP *o)
}
OP *
-ck_eval(OP *o)
+Perl_ck_eval(pTHX_ OP *o)
{
PL_hints |= HINT_BLOCK_SCOPE;
if (o->op_flags & OPf_KIDS) {
@@ -4173,9 +5138,9 @@ ck_eval(OP *o)
cUNOPo->op_first = 0;
op_free(o);
- Newz(1101, enter, 1, LOGOP);
+ NewOp(1101, enter, 1, LOGOP);
enter->op_type = OP_ENTERTRY;
- enter->op_ppaddr = ppaddr[OP_ENTERTRY];
+ enter->op_ppaddr = PL_ppaddr[OP_ENTERTRY];
enter->op_private = 0;
/* establish postfix order */
@@ -4183,7 +5148,7 @@ ck_eval(OP *o)
o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
o->op_type = OP_LEAVETRY;
- o->op_ppaddr = ppaddr[OP_LEAVETRY];
+ o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
enter->op_other = o;
return o;
}
@@ -4199,7 +5164,21 @@ ck_eval(OP *o)
}
OP *
-ck_exec(OP *o)
+Perl_ck_exit(pTHX_ OP *o)
+{
+#ifdef VMS
+ HV *table = GvHV(PL_hintgv);
+ if (table) {
+ SV **svp = hv_fetch(table, "vmsish_exit", 11, FALSE);
+ if (svp && *svp && SvTRUE(*svp))
+ o->op_private |= OPpEXIT_VMSISH;
+ }
+#endif
+ return ck_fun(o);
+}
+
+OP *
+Perl_ck_exec(pTHX_ OP *o)
{
OP *kid;
if (o->op_flags & OPf_STACKED) {
@@ -4214,29 +5193,41 @@ ck_exec(OP *o)
}
OP *
-ck_exists(OP *o)
+Perl_ck_exists(pTHX_ OP *o)
{
o = ck_fun(o);
if (o->op_flags & OPf_KIDS) {
OP *kid = cUNOPo->op_first;
- if (kid->op_type != OP_HELEM)
- croak("%s argument is not a HASH element", op_desc[o->op_type]);
+ if (kid->op_type == OP_ENTERSUB) {
+ (void) ref(kid, o->op_type);
+ if (kid->op_type != OP_RV2CV && !PL_error_count)
+ Perl_croak(aTHX_ "%s argument is not a subroutine name",
+ PL_op_desc[o->op_type]);
+ o->op_private |= OPpEXISTS_SUB;
+ }
+ else if (kid->op_type == OP_AELEM)
+ o->op_flags |= OPf_SPECIAL;
+ else if (kid->op_type != OP_HELEM)
+ Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element",
+ PL_op_desc[o->op_type]);
null(kid);
}
return o;
}
+#if 0
OP *
-ck_gvconst(register OP *o)
+Perl_ck_gvconst(pTHX_ register OP *o)
{
o = fold_constants(o);
if (o->op_type == OP_CONST)
o->op_type = OP_GV;
return o;
}
+#endif
OP *
-ck_rvconst(register OP *o)
+Perl_ck_rvconst(pTHX_ register OP *o)
{
dTHR;
SVOP *kid = (SVOP*)cUNOPo->op_first;
@@ -4283,11 +5274,10 @@ ck_rvconst(register OP *o)
break;
}
if (badtype)
- croak("Constant is not %s reference", badtype);
+ Perl_croak(aTHX_ "Constant is not %s reference", badtype);
return o;
}
name = SvPV(kidsv, n_a);
-
if ((PL_hints & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
char *badthing = Nullch;
switch (o->op_type) {
@@ -4302,7 +5292,7 @@ ck_rvconst(register OP *o)
break;
}
if (badthing)
- croak(
+ Perl_croak(aTHX_
"Can't use bareword (\"%s\") as %s ref while \"strict refs\" in use",
name, badthing);
}
@@ -4331,22 +5321,30 @@ ck_rvconst(register OP *o)
if (gv) {
kid->op_type = OP_GV;
SvREFCNT_dec(kid->op_sv);
+#ifdef USE_ITHREADS
+ /* XXX hack: dependence on sizeof(PADOP) <= sizeof(SVOP) */
+ kPADOP->op_padix = pad_alloc(OP_GV, SVs_PADTMP);
+ GvIN_PAD_on(gv);
+ PL_curpad[kPADOP->op_padix] = SvREFCNT_inc(gv);
+#else
kid->op_sv = SvREFCNT_inc(gv);
+#endif
+ kid->op_ppaddr = PL_ppaddr[OP_GV];
}
}
return o;
}
OP *
-ck_ftst(OP *o)
+Perl_ck_ftst(pTHX_ OP *o)
{
dTHR;
I32 type = o->op_type;
- if (o->op_flags & OPf_REF)
- return o;
-
- if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) {
+ if (o->op_flags & OPf_REF) {
+ /* nothing */
+ }
+ else if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) {
SVOP *kid = (SVOP*)cUNOPo->op_first;
if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
@@ -4354,22 +5352,29 @@ ck_ftst(OP *o)
OP *newop = newGVOP(type, OPf_REF,
gv_fetchpv(SvPVx(kid->op_sv, n_a), TRUE, SVt_PVIO));
op_free(o);
- return newop;
+ o = newop;
}
}
else {
op_free(o);
if (type == OP_FTTTY)
- return newGVOP(type, OPf_REF, gv_fetchpv("main::STDIN", TRUE,
+ o = newGVOP(type, OPf_REF, gv_fetchpv("main::STDIN", TRUE,
SVt_PVIO));
else
- return newUNOP(type, 0, newDEFSVOP());
+ o = newUNOP(type, 0, newDEFSVOP());
}
+#ifdef USE_LOCALE
+ if (type == OP_FTTEXT || type == OP_FTBINARY) {
+ o->op_private = 0;
+ if (PL_hints & HINT_LOCALE)
+ o->op_private |= OPpLOCALE;
+ }
+#endif
return o;
}
OP *
-ck_fun(OP *o)
+Perl_ck_fun(pTHX_ OP *o)
{
dTHR;
register OP *kid;
@@ -4377,7 +5382,7 @@ ck_fun(OP *o)
OP *sibl;
I32 numargs = 0;
int type = o->op_type;
- register I32 oa = opargs[type] >> OASHIFT;
+ register I32 oa = PL_opargs[type] >> OASHIFT;
if (o->op_flags & OPf_STACKED) {
if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
@@ -4391,12 +5396,12 @@ ck_fun(OP *o)
tokid = &cLISTOPo->op_first;
kid = cLISTOPo->op_first;
if (kid->op_type == OP_PUSHMARK ||
- kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK)
+ (kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK))
{
tokid = &kid->op_sibling;
kid = kid->op_sibling;
}
- if (!kid && opargs[type] & OA_DEFGV)
+ if (!kid && PL_opargs[type] & OA_DEFGV)
*tokid = kid = newDEFSVOP();
while (oa && kid) {
@@ -4404,6 +5409,12 @@ ck_fun(OP *o)
sibl = kid->op_sibling;
switch (oa & 7) {
case OA_SCALAR:
+ /* list seen where single (scalar) arg expected? */
+ if (numargs == 1 && !(oa >> 4)
+ && kid->op_type == OP_LIST && type != OP_SCALAR)
+ {
+ return too_many_arguments(o,PL_op_desc[type]);
+ }
scalar(kid);
break;
case OA_LIST:
@@ -4416,38 +5427,42 @@ ck_fun(OP *o)
break;
case OA_AVREF:
if (kid->op_type == OP_CONST &&
- (kid->op_private & OPpCONST_BARE)) {
+ (kid->op_private & OPpCONST_BARE))
+ {
char *name = SvPVx(((SVOP*)kid)->op_sv, n_a);
OP *newop = newAVREF(newGVOP(OP_GV, 0,
gv_fetchpv(name, TRUE, SVt_PVAV) ));
- if (PL_dowarn)
- warn("Array @%s missing the @ in argument %ld of %s()",
- name, (long)numargs, op_desc[type]);
+ if (ckWARN(WARN_DEPRECATED))
+ Perl_warner(aTHX_ WARN_DEPRECATED,
+ "Array @%s missing the @ in argument %"IVdf" of %s()",
+ name, (IV)numargs, PL_op_desc[type]);
op_free(kid);
kid = newop;
kid->op_sibling = sibl;
*tokid = kid;
}
else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
- bad_type(numargs, "array", op_desc[o->op_type], kid);
+ bad_type(numargs, "array", PL_op_desc[type], kid);
mod(kid, type);
break;
case OA_HVREF:
if (kid->op_type == OP_CONST &&
- (kid->op_private & OPpCONST_BARE)) {
+ (kid->op_private & OPpCONST_BARE))
+ {
char *name = SvPVx(((SVOP*)kid)->op_sv, n_a);
OP *newop = newHVREF(newGVOP(OP_GV, 0,
gv_fetchpv(name, TRUE, SVt_PVHV) ));
- if (PL_dowarn)
- warn("Hash %%%s missing the %% in argument %ld of %s()",
- name, (long)numargs, op_desc[type]);
+ if (ckWARN(WARN_DEPRECATED))
+ Perl_warner(aTHX_ WARN_DEPRECATED,
+ "Hash %%%s missing the %% in argument %"IVdf" of %s()",
+ name, (IV)numargs, PL_op_desc[type]);
op_free(kid);
kid = newop;
kid->op_sibling = sibl;
*tokid = kid;
}
else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
- bad_type(numargs, "hash", op_desc[o->op_type], kid);
+ bad_type(numargs, "hash", PL_op_desc[type], kid);
mod(kid, type);
break;
case OA_CVREF:
@@ -4464,7 +5479,8 @@ ck_fun(OP *o)
case OA_FILEREF:
if (kid->op_type != OP_GV && kid->op_type != OP_RV2GV) {
if (kid->op_type == OP_CONST &&
- (kid->op_private & OPpCONST_BARE)) {
+ (kid->op_private & OPpCONST_BARE))
+ {
OP *newop = newGVOP(OP_GV, 0,
gv_fetchpv(SvPVx(((SVOP*)kid)->op_sv, n_a), TRUE,
SVt_PVIO) );
@@ -4473,11 +5489,58 @@ ck_fun(OP *o)
}
else if (kid->op_type == OP_READLINE) {
/* neophyte patrol: open(<FH>), close(<FH>) etc. */
- bad_type(numargs, "HANDLE", op_desc[o->op_type], kid);
+ bad_type(numargs, "HANDLE", PL_op_desc[o->op_type], kid);
}
else {
+ I32 flags = OPf_SPECIAL;
+ I32 priv = 0;
+ PADOFFSET targ = 0;
+
+ /* is this op a FH constructor? */
+ if (is_handle_constructor(o,numargs)) {
+ char *name = Nullch;
+ STRLEN len;
+
+ flags = 0;
+ /* Set a flag to tell rv2gv to vivify
+ * need to "prove" flag does not mean something
+ * else already - NI-S 1999/05/07
+ */
+ priv = OPpDEREF;
+ if (kid->op_type == OP_PADSV) {
+ SV **namep = av_fetch(PL_comppad_name,
+ kid->op_targ, 4);
+ if (namep && *namep)
+ name = SvPV(*namep, len);
+ }
+ else if (kid->op_type == OP_RV2SV
+ && kUNOP->op_first->op_type == OP_GV)
+ {
+ GV *gv = cGVOPx_gv(kUNOP->op_first);
+ name = GvNAME(gv);
+ len = GvNAMELEN(gv);
+ }
+ else if (kid->op_type == OP_AELEM
+ || kid->op_type == OP_HELEM)
+ {
+ name = "__ANONIO__";
+ len = 10;
+ mod(kid,type);
+ }
+ if (name) {
+ SV *namesv;
+ targ = pad_alloc(OP_RV2GV, SVs_PADTMP);
+ namesv = PL_curpad[targ];
+ (void)SvUPGRADE(namesv, SVt_PV);
+ if (*name != '$')
+ sv_setpvn(namesv, "$", 1);
+ sv_catpvn(namesv, name, len);
+ }
+ }
kid->op_sibling = 0;
- kid = newUNOP(OP_RV2GV, 0, scalar(kid));
+ kid = newUNOP(OP_RV2GV, flags, scalar(kid));
+ kid->op_targ = targ;
+ kid->op_private |= priv;
}
kid->op_sibling = sibl;
*tokid = kid;
@@ -4494,10 +5557,10 @@ ck_fun(OP *o)
}
o->op_private |= numargs;
if (kid)
- return too_many_arguments(o,op_desc[o->op_type]);
+ return too_many_arguments(o,PL_op_desc[o->op_type]);
listkids(o);
}
- else if (opargs[type] & OA_DEFGV) {
+ else if (PL_opargs[type] & OA_DEFGV) {
op_free(o);
return newUNOP(type, 0, newDEFSVOP());
}
@@ -4506,33 +5569,42 @@ ck_fun(OP *o)
while (oa & OA_OPTIONAL)
oa >>= 4;
if (oa && oa != OA_LIST)
- return too_few_arguments(o,op_desc[o->op_type]);
+ return too_few_arguments(o,PL_op_desc[o->op_type]);
}
return o;
}
OP *
-ck_glob(OP *o)
+Perl_ck_glob(pTHX_ OP *o)
{
GV *gv;
+ o = ck_fun(o);
if ((o->op_flags & OPf_KIDS) && !cLISTOPo->op_first->op_sibling)
append_elem(OP_GLOB, o, newDEFSVOP());
if (!((gv = gv_fetchpv("glob", FALSE, SVt_PVCV)) && GvIMPORTED_CV(gv)))
gv = gv_fetchpv("CORE::GLOBAL::glob", FALSE, SVt_PVCV);
- if (gv && GvIMPORTED_CV(gv)) {
-#ifndef PERL_OBJECT
- static int glob_index;
-#endif
+#if !defined(PERL_EXTERNAL_GLOB)
+ /* XXX this can be tightened up and made more failsafe. */
+ if (!gv) {
+ ENTER;
+ Perl_load_module(aTHX_ 0, newSVpvn("File::Glob", 10), Nullsv,
+ /* null-terminated import list */
+ newSVpvn(":globally", 9), Nullsv);
+ gv = gv_fetchpv("CORE::GLOBAL::glob", FALSE, SVt_PVCV);
+ LEAVE;
+ }
+#endif /* PERL_EXTERNAL_GLOB */
+ if (gv && GvIMPORTED_CV(gv)) {
append_elem(OP_GLOB, o,
- newSVOP(OP_CONST, 0, newSViv(glob_index++)));
+ newSVOP(OP_CONST, 0, newSViv(PL_glob_index++)));
o->op_type = OP_LIST;
- o->op_ppaddr = ppaddr[OP_LIST];
+ o->op_ppaddr = PL_ppaddr[OP_LIST];
cLISTOPo->op_first->op_type = OP_PUSHMARK;
- cLISTOPo->op_first->op_ppaddr = ppaddr[OP_PUSHMARK];
+ cLISTOPo->op_first->op_ppaddr = PL_ppaddr[OP_PUSHMARK];
o = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, o,
scalar(newUNOP(OP_RV2CV, 0,
@@ -4545,18 +5617,18 @@ ck_glob(OP *o)
gv_IOadd(gv);
append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
scalarkids(o);
- return ck_fun(o);
+ return o;
}
OP *
-ck_grep(OP *o)
+Perl_ck_grep(pTHX_ OP *o)
{
LOGOP *gwop;
OP *kid;
OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
- o->op_ppaddr = ppaddr[OP_GREPSTART];
- Newz(1101, gwop, 1, LOGOP);
+ o->op_ppaddr = PL_ppaddr[OP_GREPSTART];
+ NewOp(1101, gwop, 1, LOGOP);
if (o->op_flags & OPf_STACKED) {
OP* k;
@@ -4578,11 +5650,11 @@ ck_grep(OP *o)
return o;
kid = cLISTOPo->op_first->op_sibling;
if (kid->op_type != OP_NULL)
- croak("panic: ck_grep");
+ Perl_croak(aTHX_ "panic: ck_grep");
kid = kUNOP->op_first;
gwop->op_type = type;
- gwop->op_ppaddr = ppaddr[type];
+ gwop->op_ppaddr = PL_ppaddr[type];
gwop->op_first = listkids(o);
gwop->op_flags |= OPf_KIDS;
gwop->op_private = 1;
@@ -4592,7 +5664,7 @@ ck_grep(OP *o)
kid = cLISTOPo->op_first->op_sibling;
if (!kid || !kid->op_sibling)
- return too_few_arguments(o,op_desc[o->op_type]);
+ return too_few_arguments(o,PL_op_desc[o->op_type]);
for (kid = kid->op_sibling; kid; kid = kid->op_sibling)
mod(kid, OP_GREPSTART);
@@ -4600,7 +5672,7 @@ ck_grep(OP *o)
}
OP *
-ck_index(OP *o)
+Perl_ck_index(pTHX_ OP *o)
{
if (o->op_flags & OPf_KIDS) {
OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
@@ -4613,28 +5685,59 @@ ck_index(OP *o)
}
OP *
-ck_lengthconst(OP *o)
+Perl_ck_lengthconst(pTHX_ OP *o)
{
/* XXX length optimization goes here */
return ck_fun(o);
}
OP *
-ck_lfun(OP *o)
+Perl_ck_lfun(pTHX_ OP *o)
{
OPCODE type = o->op_type;
return modkids(ck_fun(o), type);
}
OP *
-ck_rfun(OP *o)
+Perl_ck_defined(pTHX_ OP *o) /* 19990527 MJD */
+{
+ dTHR;
+ if ((o->op_flags & OPf_KIDS) && ckWARN(WARN_DEPRECATED)) {
+ switch (cUNOPo->op_first->op_type) {
+ case OP_RV2AV:
+ break; /* Globals via GV can be undef */
+ case OP_PADAV:
+ case OP_AASSIGN: /* Is this a good idea? */
+ Perl_warner(aTHX_ WARN_DEPRECATED,
+ "defined(@array) is deprecated");
+ Perl_warner(aTHX_ WARN_DEPRECATED,
+ "\t(Maybe you should just omit the defined()?)\n");
+ break;
+ case OP_RV2HV:
+ break; /* Globals via GV can be undef */
+ case OP_PADHV:
+ Perl_warner(aTHX_ WARN_DEPRECATED,
+ "defined(%%hash) is deprecated");
+ Perl_warner(aTHX_ WARN_DEPRECATED,
+ "\t(Maybe you should just omit the defined()?)\n");
+ break;
+ default:
+ /* no warning */
+ break;
+ }
+ }
+ return ck_rfun(o);
+}
+
+OP *
+Perl_ck_rfun(pTHX_ OP *o)
{
OPCODE type = o->op_type;
return refkids(ck_fun(o), type);
}
OP *
-ck_listiob(OP *o)
+Perl_ck_listiob(pTHX_ OP *o)
{
register OP *kid;
@@ -4672,7 +5775,7 @@ ck_listiob(OP *o)
}
OP *
-ck_fun_locale(OP *o)
+Perl_ck_fun_locale(pTHX_ OP *o)
{
o = ck_fun(o);
@@ -4686,7 +5789,37 @@ ck_fun_locale(OP *o)
}
OP *
-ck_scmp(OP *o)
+Perl_ck_sassign(pTHX_ OP *o)
+{
+ OP *kid = cLISTOPo->op_first;
+ /* has a disposable target? */
+ if ((PL_opargs[kid->op_type] & OA_TARGLEX)
+ && !(kid->op_flags & OPf_STACKED)
+ /* Cannot steal the second time! */
+ && !(kid->op_private & OPpTARGET_MY))
+ {
+ OP *kkid = kid->op_sibling;
+
+ /* Can just relocate the target. */
+ if (kkid && kkid->op_type == OP_PADSV
+ && !(kkid->op_private & OPpLVAL_INTRO))
+ {
+ kid->op_targ = kkid->op_targ;
+ kkid->op_targ = 0;
+ /* Now we do not need PADSV and SASSIGN. */
+ kid->op_sibling = o->op_sibling; /* NULL */
+ cLISTOPo->op_first = NULL;
+ op_free(o);
+ op_free(kkid);
+ kid->op_private |= OPpTARGET_MY; /* Used for context settings */
+ return kid;
+ }
+ }
+ return o;
+}
+
+OP *
+Perl_ck_scmp(pTHX_ OP *o)
{
o->op_private = 0;
#ifdef USE_LOCALE
@@ -4698,20 +5831,70 @@ ck_scmp(OP *o)
}
OP *
-ck_match(OP *o)
+Perl_ck_match(pTHX_ OP *o)
{
o->op_private |= OPpRUNTIME;
return o;
}
OP *
-ck_null(OP *o)
+Perl_ck_method(pTHX_ OP *o)
{
+ OP *kid = cUNOPo->op_first;
+ if (kid->op_type == OP_CONST) {
+ SV* sv = kSVOP->op_sv;
+ if (!(strchr(SvPVX(sv), ':') || strchr(SvPVX(sv), '\''))) {
+ OP *cmop;
+ (void)SvUPGRADE(sv, SVt_PVIV);
+ (void)SvIOK_on(sv);
+ PERL_HASH(SvUVX(sv), SvPVX(sv), SvCUR(sv));
+ cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
+ kSVOP->op_sv = Nullsv;
+ op_free(o);
+ return cmop;
+ }
+ }
return o;
}
OP *
-ck_repeat(OP *o)
+Perl_ck_null(pTHX_ OP *o)
+{
+ return o;
+}
+
+OP *
+Perl_ck_open(pTHX_ OP *o)
+{
+ HV *table = GvHV(PL_hintgv);
+ if (table) {
+ SV **svp;
+ I32 mode;
+ svp = hv_fetch(table, "open_IN", 7, FALSE);
+ if (svp && *svp) {
+ mode = mode_from_discipline(*svp);
+ if (mode & O_BINARY)
+ o->op_private |= OPpOPEN_IN_RAW;
+ else if (mode & O_TEXT)
+ o->op_private |= OPpOPEN_IN_CRLF;
+ }
+
+ svp = hv_fetch(table, "open_OUT", 8, FALSE);
+ if (svp && *svp) {
+ mode = mode_from_discipline(*svp);
+ if (mode & O_BINARY)
+ o->op_private |= OPpOPEN_OUT_RAW;
+ else if (mode & O_TEXT)
+ o->op_private |= OPpOPEN_OUT_CRLF;
+ }
+ }
+ if (o->op_type == OP_BACKTICK)
+ return o;
+ return ck_fun(o);
+}
+
+OP *
+Perl_ck_repeat(pTHX_ OP *o)
{
if (cBINOPo->op_first->op_flags & OPf_PARENS) {
o->op_private |= OPpREPEAT_DOLIST;
@@ -4723,7 +5906,7 @@ ck_repeat(OP *o)
}
OP *
-ck_require(OP *o)
+Perl_ck_require(pTHX_ OP *o)
{
if (o->op_flags & OPf_KIDS) { /* Shall we supply missing .pm? */
SVOP *kid = (SVOP*)cUNOPo->op_first;
@@ -4737,29 +5920,37 @@ ck_require(OP *o)
--SvCUR(kid->op_sv);
}
}
- sv_catpvn(kid->op_sv, ".pm", 3);
+ if (SvREADONLY(kid->op_sv)) {
+ SvREADONLY_off(kid->op_sv);
+ sv_catpvn(kid->op_sv, ".pm", 3);
+ SvREADONLY_on(kid->op_sv);
+ }
+ else
+ sv_catpvn(kid->op_sv, ".pm", 3);
}
}
return ck_fun(o);
}
+#if 0
OP *
-ck_retarget(OP *o)
+Perl_ck_retarget(pTHX_ OP *o)
{
- croak("NOT IMPL LINE %d",__LINE__);
+ Perl_croak(aTHX_ "NOT IMPL LINE %d",__LINE__);
/* STUB */
return o;
}
+#endif
OP *
-ck_select(OP *o)
+Perl_ck_select(pTHX_ OP *o)
{
OP* kid;
if (o->op_flags & OPf_KIDS) {
kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
if (kid && kid->op_sibling) {
o->op_type = OP_SSELECT;
- o->op_ppaddr = ppaddr[OP_SSELECT];
+ o->op_ppaddr = PL_ppaddr[OP_SSELECT];
o = ck_fun(o);
return fold_constants(o);
}
@@ -4772,7 +5963,7 @@ ck_select(OP *o)
}
OP *
-ck_shift(OP *o)
+Perl_ck_shift(pTHX_ OP *o)
{
I32 type = o->op_type;
@@ -4801,7 +5992,7 @@ ck_shift(OP *o)
}
OP *
-ck_sort(OP *o)
+Perl_ck_sort(pTHX_ OP *o)
{
o->op_private = 0;
#ifdef USE_LOCALE
@@ -4809,15 +6000,12 @@ ck_sort(OP *o)
o->op_private |= OPpLOCALE;
#endif
- if (o->op_flags & OPf_STACKED) {
+ if (o->op_type == OP_SORT && o->op_flags & OPf_STACKED)
+ simplify_sort(o);
+ if (o->op_flags & OPf_STACKED) { /* may have been cleared */
OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
OP *k;
-
- if (o->op_type == OP_SORT) {
- GvMULTI_on(gv_fetchpv("a", TRUE, SVt_PV));
- GvMULTI_on(gv_fetchpv("b", TRUE, SVt_PV));
- }
- kid = kUNOP->op_first; /* get past rv2gv */
+ kid = kUNOP->op_first; /* get past null */
if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
linklist(kid);
@@ -4833,6 +6021,12 @@ ck_sort(OP *o)
for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
if (k->op_next == kid)
k->op_next = 0;
+ /* don't descend into loops */
+ else if (k->op_type == OP_ENTERLOOP
+ || k->op_type == OP_ENTERITER)
+ {
+ k = cLOOPx(k)->op_lastop;
+ }
}
}
else
@@ -4842,7 +6036,6 @@ ck_sort(OP *o)
peep(k);
kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
- null(kid); /* wipe out rv2gv */
if (o->op_type == OP_SORT)
kid->op_next = kid;
else
@@ -4851,13 +6044,79 @@ ck_sort(OP *o)
}
else if (kid->op_type == OP_RV2SV || kid->op_type == OP_PADSV)
null(cLISTOPo->op_first->op_sibling);
- }
+ }
return o;
}
+STATIC void
+S_simplify_sort(pTHX_ OP *o)
+{
+ dTHR;
+ register OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
+ OP *k;
+ int reversed;
+ GV *gv;
+ if (!(o->op_flags & OPf_STACKED))
+ return;
+ GvMULTI_on(gv_fetchpv("a", TRUE, SVt_PV));
+ GvMULTI_on(gv_fetchpv("b", TRUE, SVt_PV));
+ kid = kUNOP->op_first; /* get past null */
+ if (kid->op_type != OP_SCOPE)
+ return;
+ kid = kLISTOP->op_last; /* get past scope */
+ switch(kid->op_type) {
+ case OP_NCMP:
+ case OP_I_NCMP:
+ case OP_SCMP:
+ break;
+ default:
+ return;
+ }
+ k = kid; /* remember this node*/
+ if (kBINOP->op_first->op_type != OP_RV2SV)
+ return;
+ kid = kBINOP->op_first; /* get past cmp */
+ if (kUNOP->op_first->op_type != OP_GV)
+ return;
+ kid = kUNOP->op_first; /* get past rv2sv */
+ gv = kGVOP_gv;
+ if (GvSTASH(gv) != PL_curstash)
+ return;
+ if (strEQ(GvNAME(gv), "a"))
+ reversed = 0;
+ else if (strEQ(GvNAME(gv), "b"))
+ reversed = 1;
+ else
+ return;
+ kid = k; /* back to cmp */
+ if (kBINOP->op_last->op_type != OP_RV2SV)
+ return;
+ kid = kBINOP->op_last; /* down to 2nd arg */
+ if (kUNOP->op_first->op_type != OP_GV)
+ return;
+ kid = kUNOP->op_first; /* get past rv2sv */
+ gv = kGVOP_gv;
+ if (GvSTASH(gv) != PL_curstash
+ || ( reversed
+ ? strNE(GvNAME(gv), "a")
+ : strNE(GvNAME(gv), "b")))
+ return;
+ o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL);
+ if (reversed)
+ o->op_private |= OPpSORT_REVERSE;
+ if (k->op_type == OP_NCMP)
+ o->op_private |= OPpSORT_NUMERIC;
+ if (k->op_type == OP_I_NCMP)
+ o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
+ kid = cLISTOPo->op_first->op_sibling;
+ cLISTOPo->op_first->op_sibling = kid->op_sibling; /* bypass old block */
+ op_free(kid); /* then delete it */
+ cLISTOPo->op_children--;
+}
+
OP *
-ck_split(OP *o)
+Perl_ck_split(pTHX_ OP *o)
{
register OP *kid;
@@ -4866,12 +6125,12 @@ ck_split(OP *o)
kid = cLISTOPo->op_first;
if (kid->op_type != OP_NULL)
- croak("panic: ck_split");
+ Perl_croak(aTHX_ "panic: ck_split");
kid = kid->op_sibling;
op_free(cLISTOPo->op_first);
cLISTOPo->op_first = kid;
if (!kid) {
- cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpv(" ", 1));
+ cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpvn(" ", 1));
cLISTOPo->op_last = kid; /* There was only one element previously */
}
@@ -4886,7 +6145,7 @@ ck_split(OP *o)
}
kid->op_type = OP_PUSHRE;
- kid->op_ppaddr = ppaddr[OP_PUSHRE];
+ kid->op_ppaddr = PL_ppaddr[OP_PUSHRE];
scalar(kid);
if (!kid->op_sibling)
@@ -4902,13 +6161,30 @@ ck_split(OP *o)
scalar(kid);
if (kid->op_sibling)
- return too_many_arguments(o,op_desc[o->op_type]);
+ return too_many_arguments(o,PL_op_desc[o->op_type]);
return o;
}
OP *
-ck_subr(OP *o)
+Perl_ck_join(pTHX_ OP *o)
+{
+ if (ckWARN(WARN_SYNTAX)) {
+ OP *kid = cLISTOPo->op_first->op_sibling;
+ if (kid && kid->op_type == OP_MATCH) {
+ char *pmstr = "STRING";
+ if (kPMOP->op_pmregexp)
+ pmstr = kPMOP->op_pmregexp->precomp;
+ Perl_warner(aTHX_ WARN_SYNTAX,
+ "/%s/ should probably be written as \"%s\"",
+ pmstr, pmstr);
+ }
+ }
+ return ck_fun(o);
+}
+
+OP *
+Perl_ck_subr(pTHX_ OP *o)
{
dTHR;
OP *prev = ((cUNOPo->op_first->op_sibling)
@@ -4922,20 +6198,33 @@ ck_subr(OP *o)
I32 arg = 0;
STRLEN n_a;
+ o->op_private |= OPpENTERSUB_HASTARG;
for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ;
if (cvop->op_type == OP_RV2CV) {
SVOP* tmpop;
o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
null(cvop); /* disable rv2cv */
tmpop = (SVOP*)((UNOP*)cvop)->op_first;
- if (tmpop->op_type == OP_GV) {
- cv = GvCVu(tmpop->op_sv);
- if (cv && SvPOK(cv) && !(o->op_private & OPpENTERSUB_AMPER)) {
- namegv = CvANON(cv) ? (GV*)tmpop->op_sv : CvGV(cv);
+ if (tmpop->op_type == OP_GV && !(o->op_private & OPpENTERSUB_AMPER)) {
+ GV *gv = cGVOPx_gv(tmpop);
+ cv = GvCVu(gv);
+ if (!cv)
+ tmpop->op_private |= OPpEARLY_CV;
+ else if (SvPOK(cv)) {
+ namegv = CvANON(cv) ? gv : CvGV(cv);
proto = SvPV((SV*)cv, n_a);
}
}
}
+ else if (cvop->op_type == OP_METHOD || cvop->op_type == OP_METHOD_NAMED) {
+ if (o2->op_type == OP_CONST)
+ o2->op_private &= ~OPpCONST_STRICT;
+ else if (o2->op_type == OP_LIST) {
+ OP *o = ((UNOP*)o2)->op_first->op_sibling;
+ if (o && o->op_type == OP_CONST)
+ o->op_private &= ~OPpCONST_STRICT;
+ }
+ }
o->op_private |= (PL_hints & HINT_STRICT_REFS);
if (PERLDB_SUB && PL_curstash != PL_debstash)
o->op_private |= OPpENTERSUB_DB;
@@ -4970,6 +6259,35 @@ ck_subr(OP *o)
arg++;
if (o2->op_type == OP_RV2GV)
goto wrapref; /* autoconvert GLOB -> GLOBref */
+ else if (o2->op_type == OP_CONST)
+ o2->op_private &= ~OPpCONST_STRICT;
+ else if (o2->op_type == OP_ENTERSUB) {
+ /* accidental subroutine, revert to bareword */
+ OP *gvop = ((UNOP*)o2)->op_first;
+ if (gvop && gvop->op_type == OP_NULL) {
+ gvop = ((UNOP*)gvop)->op_first;
+ if (gvop) {
+ for (; gvop->op_sibling; gvop = gvop->op_sibling)
+ ;
+ if (gvop &&
+ (gvop->op_private & OPpENTERSUB_NOPAREN) &&
+ (gvop = ((UNOP*)gvop)->op_first) &&
+ gvop->op_type == OP_GV)
+ {
+ GV *gv = cGVOPx_gv(gvop);
+ OP *sibling = o2->op_sibling;
+ SV *n = newSVpvn("",0);
+ op_free(o2);
+ gv_fullname3(n, gv, "");
+ if (SvCUR(n)>6 && strnEQ(SvPVX(n),"main::",6))
+ sv_chop(n, SvPVX(n)+6);
+ o2 = newSVOP(OP_CONST, 0, n);
+ prev->op_sibling = o2;
+ o2->op_sibling = sibling;
+ }
+ }
+ }
+ }
scalar(o2);
break;
case '\\':
@@ -4987,6 +6305,8 @@ ck_subr(OP *o)
case '$':
if (o2->op_type != OP_RV2SV
&& o2->op_type != OP_PADSV
+ && o2->op_type != OP_HELEM
+ && o2->op_type != OP_AELEM
&& o2->op_type != OP_THREADSV)
{
bad_type(arg, "scalar", gv_ename(namegv), o2);
@@ -5017,7 +6337,7 @@ ck_subr(OP *o)
continue;
default:
oops:
- croak("Malformed prototype for %s: %s",
+ Perl_croak(aTHX_ "Malformed prototype for %s: %s",
gv_ename(namegv), SvPV((SV*)cv, n_a));
}
}
@@ -5034,23 +6354,26 @@ ck_subr(OP *o)
}
OP *
-ck_svconst(OP *o)
+Perl_ck_svconst(pTHX_ OP *o)
{
SvREADONLY_on(cSVOPo->op_sv);
return o;
}
OP *
-ck_trunc(OP *o)
+Perl_ck_trunc(pTHX_ OP *o)
{
if (o->op_flags & OPf_KIDS) {
SVOP *kid = (SVOP*)cUNOPo->op_first;
if (kid->op_type == OP_NULL)
kid = (SVOP*)kid->op_sibling;
- if (kid &&
- kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE))
+ if (kid && kid->op_type == OP_CONST &&
+ (kid->op_private & OPpCONST_BARE))
+ {
o->op_flags |= OPf_SPECIAL;
+ kid->op_private &= ~OPpCONST_STRICT;
+ }
}
return ck_fun(o);
}
@@ -5058,16 +6381,18 @@ ck_trunc(OP *o)
/* A peephole optimizer. We visit the ops in the order they're to execute. */
void
-peep(register OP *o)
+Perl_peep(pTHX_ register OP *o)
{
dTHR;
register OP* oldop = 0;
STRLEN n_a;
+ OP *last_composite = Nullop;
+
if (!o || o->op_seq)
return;
ENTER;
SAVEOP();
- SAVESPTR(PL_curcop);
+ SAVEVPTR(PL_curcop);
for (; o; o = o->op_next) {
if (o->op_seq)
break;
@@ -5075,22 +6400,48 @@ peep(register OP *o)
PL_op_seqmax++;
PL_op = o;
switch (o->op_type) {
+ case OP_SETSTATE:
case OP_NEXTSTATE:
case OP_DBSTATE:
PL_curcop = ((COP*)o); /* for warnings */
o->op_seq = PL_op_seqmax++;
+ last_composite = Nullop;
break;
- case OP_CONCAT:
case OP_CONST:
- case OP_JOIN:
- case OP_UC:
- case OP_UCFIRST:
- case OP_LC:
- case OP_LCFIRST:
- case OP_QUOTEMETA:
- if (o->op_next && o->op_next->op_type == OP_STRINGIFY)
+ if (cSVOPo->op_private & OPpCONST_STRICT)
+ no_bareword_allowed(o);
+#ifdef USE_ITHREADS
+ /* Relocate sv to the pad for thread safety.
+ * Despite being a "constant", the SV is written to,
+ * for reference counts, sv_upgrade() etc. */
+ if (cSVOP->op_sv) {
+ PADOFFSET ix = pad_alloc(OP_CONST, SVs_PADTMP);
+ SvREFCNT_dec(PL_curpad[ix]);
+ SvPADTMP_on(cSVOPo->op_sv);
+ PL_curpad[ix] = cSVOPo->op_sv;
+ cSVOPo->op_sv = Nullsv;
+ o->op_targ = ix;
+ }
+#endif
+ o->op_seq = PL_op_seqmax++;
+ break;
+
+ case OP_CONCAT:
+ if (o->op_next && o->op_next->op_type == OP_STRINGIFY) {
+ if (o->op_next->op_private & OPpTARGET_MY) {
+ if (o->op_flags & OPf_STACKED) /* chained concats */
+ goto ignore_optimization;
+ else {
+ /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */
+ o->op_targ = o->op_next->op_targ;
+ o->op_next->op_targ = 0;
+ o->op_private |= OPpTARGET_MY;
+ }
+ }
null(o->op_next);
+ }
+ ignore_optimization:
o->op_seq = PL_op_seqmax++;
break;
case OP_STUB:
@@ -5100,8 +6451,12 @@ peep(register OP *o)
}
goto nothin;
case OP_NULL:
- if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
+ if (o->op_targ == OP_NEXTSTATE
+ || o->op_targ == OP_DBSTATE
+ || o->op_targ == OP_SETSTATE)
+ {
PL_curcop = ((COP*)o);
+ }
goto nothin;
case OP_SCALAR:
case OP_LINESEQ:
@@ -5118,10 +6473,11 @@ peep(register OP *o)
if (o->op_next->op_type == OP_RV2SV) {
if (!(o->op_next->op_private & OPpDEREF)) {
null(o->op_next);
- o->op_private |= o->op_next->op_private & OPpLVAL_INTRO;
+ o->op_private |= o->op_next->op_private & (OPpLVAL_INTRO
+ | OPpOUR_INTRO);
o->op_next = o->op_next->op_next;
o->op_type = OP_GVSV;
- o->op_ppaddr = ppaddr[OP_GVSV];
+ o->op_ppaddr = PL_ppaddr[OP_GVSV];
}
}
else if (o->op_next->op_type == OP_RV2AV) {
@@ -5136,18 +6492,31 @@ peep(register OP *o)
<= 255 &&
i >= 0)
{
- SvREFCNT_dec(((SVOP*)pop)->op_sv);
+ GV *gv;
null(o->op_next);
null(pop->op_next);
null(pop);
o->op_flags |= pop->op_next->op_flags & OPf_MOD;
o->op_next = pop->op_next->op_next;
o->op_type = OP_AELEMFAST;
- o->op_ppaddr = ppaddr[OP_AELEMFAST];
+ o->op_ppaddr = PL_ppaddr[OP_AELEMFAST];
o->op_private = (U8)i;
- GvAVn(((GVOP*)o)->op_gv);
+ gv = cGVOPo_gv;
+ GvAVn(gv);
}
}
+ else if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
+ GV *gv = cGVOPo_gv;
+ if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX(GvCV(gv))) {
+ /* XXX could check prototype here instead of just carping */
+ SV *sv = sv_newmortal();
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_PROTOTYPE,
+ "%s() called too early to check prototype",
+ SvPV_nolen(sv));
+ }
+ }
+
o->op_seq = PL_op_seqmax++;
break;
@@ -5155,18 +6524,16 @@ peep(register OP *o)
case OP_GREPWHILE:
case OP_AND:
case OP_OR:
+ case OP_ANDASSIGN:
+ case OP_ORASSIGN:
+ case OP_COND_EXPR:
+ case OP_RANGE:
o->op_seq = PL_op_seqmax++;
while (cLOGOP->op_other->op_type == OP_NULL)
cLOGOP->op_other = cLOGOP->op_other->op_next;
peep(cLOGOP->op_other);
break;
- case OP_COND_EXPR:
- o->op_seq = PL_op_seqmax++;
- peep(cCONDOP->op_true);
- peep(cCONDOP->op_false);
- break;
-
case OP_ENTERLOOP:
o->op_seq = PL_op_seqmax++;
peep(cLOOP->op_redoop);
@@ -5183,17 +6550,20 @@ peep(register OP *o)
case OP_EXEC:
o->op_seq = PL_op_seqmax++;
- if (PL_dowarn && o->op_next && o->op_next->op_type == OP_NEXTSTATE) {
+ if (ckWARN(WARN_SYNTAX) && o->op_next
+ && o->op_next->op_type == OP_NEXTSTATE) {
if (o->op_next->op_sibling &&
o->op_next->op_sibling->op_type != OP_EXIT &&
o->op_next->op_sibling->op_type != OP_WARN &&
o->op_next->op_sibling->op_type != OP_DIE) {
- line_t oldline = PL_curcop->cop_line;
-
- PL_curcop->cop_line = ((COP*)o->op_next)->cop_line;
- warn("Statement unlikely to be reached");
- warn("(Maybe you meant system() when you said exec()?)\n");
- PL_curcop->cop_line = oldline;
+ line_t oldline = CopLINE(PL_curcop);
+
+ CopLINE_set(PL_curcop, CopLINE((COP*)o->op_next));
+ Perl_warner(aTHX_ WARN_EXEC,
+ "Statement unlikely to be reached");
+ Perl_warner(aTHX_ WARN_EXEC,
+ "\t(Maybe you meant system() when you said exec()?)\n");
+ CopLINE_set(PL_curcop, oldline);
}
}
break;
@@ -5202,12 +6572,13 @@ peep(register OP *o)
UNOP *rop;
SV *lexname;
GV **fields;
- SV **svp, **indsvp;
+ SV **svp, **indsvp, *sv;
I32 ind;
char *key;
STRLEN keylen;
- if (o->op_private & (OPpDEREF_HV|OPpDEREF_AV|OPpLVAL_INTRO)
+ o->op_seq = PL_op_seqmax++;
+ if ((o->op_private & (OPpLVAL_INTRO))
|| ((BINOP*)o)->op_last->op_type != OP_CONST)
break;
rop = (UNOP*)((BINOP*)o)->op_first;
@@ -5219,25 +6590,129 @@ peep(register OP *o)
fields = (GV**)hv_fetch(SvSTASH(lexname), "FIELDS", 6, FALSE);
if (!fields || !GvHV(*fields))
break;
- svp = &((SVOP*)((BINOP*)o)->op_last)->op_sv;
+ svp = cSVOPx_svp(((BINOP*)o)->op_last);
key = SvPV(*svp, keylen);
indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE);
if (!indsvp) {
- croak("No such field \"%s\" in variable %s of type %s",
+ Perl_croak(aTHX_ "No such pseudo-hash field \"%s\" in variable %s of type %s",
key, SvPV(lexname, n_a), HvNAME(SvSTASH(lexname)));
}
ind = SvIV(*indsvp);
if (ind < 1)
- croak("Bad index while coercing array into hash");
+ Perl_croak(aTHX_ "Bad index while coercing array into hash");
rop->op_type = OP_RV2AV;
- rop->op_ppaddr = ppaddr[OP_RV2AV];
+ rop->op_ppaddr = PL_ppaddr[OP_RV2AV];
o->op_type = OP_AELEM;
- o->op_ppaddr = ppaddr[OP_AELEM];
+ o->op_ppaddr = PL_ppaddr[OP_AELEM];
+ sv = newSViv(ind);
+ if (SvREADONLY(*svp))
+ SvREADONLY_on(sv);
+ SvFLAGS(sv) |= (SvFLAGS(*svp)
+ & (SVs_PADBUSY|SVs_PADTMP|SVs_PADMY));
SvREFCNT_dec(*svp);
- *svp = newSViv(ind);
+ *svp = sv;
+ break;
+ }
+
+ case OP_HSLICE: {
+ UNOP *rop;
+ SV *lexname;
+ GV **fields;
+ SV **svp, **indsvp, *sv;
+ I32 ind;
+ char *key;
+ STRLEN keylen;
+ SVOP *first_key_op, *key_op;
+
+ o->op_seq = PL_op_seqmax++;
+ if ((o->op_private & (OPpLVAL_INTRO))
+ /* I bet there's always a pushmark... */
+ || ((LISTOP*)o)->op_first->op_sibling->op_type != OP_LIST)
+ /* hmmm, no optimization if list contains only one key. */
+ break;
+ rop = (UNOP*)((LISTOP*)o)->op_last;
+ if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
+ break;
+ lexname = *av_fetch(PL_comppad_name, rop->op_first->op_targ, TRUE);
+ if (!SvOBJECT(lexname))
+ break;
+ fields = (GV**)hv_fetch(SvSTASH(lexname), "FIELDS", 6, FALSE);
+ if (!fields || !GvHV(*fields))
+ break;
+ /* Again guessing that the pushmark can be jumped over.... */
+ first_key_op = (SVOP*)((LISTOP*)((LISTOP*)o)->op_first->op_sibling)
+ ->op_first->op_sibling;
+ /* Check that the key list contains only constants. */
+ for (key_op = first_key_op; key_op;
+ key_op = (SVOP*)key_op->op_sibling)
+ if (key_op->op_type != OP_CONST)
+ break;
+ if (key_op)
+ break;
+ rop->op_type = OP_RV2AV;
+ rop->op_ppaddr = PL_ppaddr[OP_RV2AV];
+ o->op_type = OP_ASLICE;
+ o->op_ppaddr = PL_ppaddr[OP_ASLICE];
+ for (key_op = first_key_op; key_op;
+ key_op = (SVOP*)key_op->op_sibling) {
+ svp = cSVOPx_svp(key_op);
+ key = SvPV(*svp, keylen);
+ indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE);
+ if (!indsvp) {
+ Perl_croak(aTHX_ "No such pseudo-hash field \"%s\" "
+ "in variable %s of type %s",
+ key, SvPV(lexname, n_a), HvNAME(SvSTASH(lexname)));
+ }
+ ind = SvIV(*indsvp);
+ if (ind < 1)
+ Perl_croak(aTHX_ "Bad index while coercing array into hash");
+ sv = newSViv(ind);
+ if (SvREADONLY(*svp))
+ SvREADONLY_on(sv);
+ SvFLAGS(sv) |= (SvFLAGS(*svp)
+ & (SVs_PADBUSY|SVs_PADTMP|SVs_PADMY));
+ SvREFCNT_dec(*svp);
+ *svp = sv;
+ }
break;
}
+ case OP_RV2AV:
+ case OP_RV2HV:
+ if (!(o->op_flags & OPf_WANT)
+ || (o->op_flags & OPf_WANT) == OPf_WANT_LIST)
+ {
+ last_composite = o;
+ }
+ o->op_seq = PL_op_seqmax++;
+ break;
+
+ case OP_RETURN:
+ if (o->op_next && o->op_next->op_type != OP_LEAVESUBLV) {
+ o->op_seq = PL_op_seqmax++;
+ break;
+ }
+ /* FALL THROUGH */
+
+ case OP_LEAVESUBLV:
+ if (last_composite) {
+ OP *r = last_composite;
+
+ while (r->op_sibling)
+ r = r->op_sibling;
+ if (r->op_next == o
+ || (r->op_next->op_type == OP_LIST
+ && r->op_next->op_next == o))
+ {
+ if (last_composite->op_type == OP_RV2AV)
+ yyerror("Lvalue subs returning arrays not implemented yet");
+ else
+ yyerror("Lvalue subs returning hashes not implemented yet");
+ ;
+ }
+ }
+ /* FALL THROUGH */
+
default:
o->op_seq = PL_op_seqmax++;
break;
diff --git a/contrib/perl5/op.h b/contrib/perl5/op.h
index d0b56f3..081d10c 100644
--- a/contrib/perl5/op.h
+++ b/contrib/perl5/op.h
@@ -1,6 +1,6 @@
/* op.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -38,7 +38,7 @@ typedef U32 PADOFFSET;
#define BASEOP \
OP* op_next; \
OP* op_sibling; \
- OP* (CPERLscope(*op_ppaddr))_((ARGSproto)); \
+ OP* (CPERLscope(*op_ppaddr))(pTHX); \
PADOFFSET op_targ; \
OPCODE op_type; \
U16 op_seq; \
@@ -52,6 +52,20 @@ typedef U32 PADOFFSET;
((op)->op_flags & OPf_WANT) == OPf_WANT_LIST ? G_ARRAY : \
dfl)
+/*
+=for apidoc Amn|U32|GIMME_V
+The XSUB-writer's equivalent to Perl's C<wantarray>. Returns C<G_VOID>,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or array context,
+respectively.
+
+=for apidoc Amn|U32|GIMME
+A backward-compatible version of C<GIMME_V> which can only return
+C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
+Deprecated. Use C<GIMME_V> instead.
+
+=cut
+*/
+
#define GIMME_V OP_GIMME(PL_op, block_gimme())
/* Public flags */
@@ -77,12 +91,15 @@ typedef U32 PADOFFSET;
/* On flipflop, we saw ... instead of .. */
/* On UNOPs, saw bare parens, e.g. eof(). */
/* On OP_ENTERSUB || OP_NULL, saw a "do". */
+ /* On OP_EXISTS, treat av as av, not avhv. */
/* On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
/* On OP_ENTERITER, loop var is per-thread */
+ /* On pushre, re is /\s+/ imp. by split " " */
/* old names; don't use in new code, but don't break them, either */
#define OPf_LIST OPf_WANT_LIST
#define OPf_KNOW OPf_WANT
+
#define GIMME \
(PL_op->op_flags & OPf_WANT \
? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST \
@@ -90,11 +107,18 @@ typedef U32 PADOFFSET;
: G_SCALAR) \
: dowantarray())
+/* NOTE: OP_NEXTSTATE, OP_DBSTATE, and OP_SETSTATE (i.e. COPs) carry lower
+ * bits of PL_hints in op_private */
+
/* Private for lvalues */
-#define OPpLVAL_INTRO 128 /* Lvalue must be localized */
+#define OPpLVAL_INTRO 128 /* Lvalue must be localized or lvalue sub */
+
+/* Private for OP_LEAVE, OP_LEAVESUB, OP_LEAVESUBLV and OP_LEAVEWRITE */
+#define OPpREFCOUNTED 64 /* op_targ carries a refcount */
/* Private for OP_AASSIGN */
#define OPpASSIGN_COMMON 64 /* Left & right have syms in common. */
+#define OPpASSIGN_HASH 32 /* Assigning to possible pseudohash. */
/* Private for OP_SASSIGN */
#define OPpASSIGN_BACKWARDS 64 /* Left & right switched. */
@@ -103,30 +127,52 @@ typedef U32 PADOFFSET;
#define OPpRUNTIME 64 /* Pattern coming in on the stack */
/* Private for OP_TRANS */
-#define OPpTRANS_COUNTONLY 8
-#define OPpTRANS_SQUASH 16
-#define OPpTRANS_DELETE 32
-#define OPpTRANS_COMPLEMENT 64
+#define OPpTRANS_FROM_UTF 1
+#define OPpTRANS_TO_UTF 2
+#define OPpTRANS_IDENTICAL 4
+ /* When CU or UC, means straight latin-1 to utf-8 or vice versa */
+ /* Otherwise, IDENTICAL means the right side is the same as the left */
+#define OPpTRANS_SQUASH 8
+#define OPpTRANS_DELETE 16
+#define OPpTRANS_COMPLEMENT 32
+#define OPpTRANS_GROWS 64
/* Private for OP_REPEAT */
#define OPpREPEAT_DOLIST 64 /* List replication. */
-/* Private for OP_ENTERSUB, OP_RV2?V, OP_?ELEM */
+/* Private for OP_LEAVELOOP */
+#define OPpLOOP_CONTINUE 64 /* a continue block is present */
+
+/* Private for OP_RV2?V, OP_?ELEM */
#define OPpDEREF (32|64) /* Want ref to something: */
#define OPpDEREF_AV 32 /* Want ref to AV. */
#define OPpDEREF_HV 64 /* Want ref to HV. */
#define OPpDEREF_SV (32|64) /* Want ref to SV. */
/* OP_ENTERSUB only */
#define OPpENTERSUB_DB 16 /* Debug subroutine. */
+#define OPpENTERSUB_HASTARG 32 /* Called from OP tree. */
+ /* OP_RV2CV only */
#define OPpENTERSUB_AMPER 8 /* Used & form to call. */
+#define OPpENTERSUB_NOPAREN 128 /* bare sub call (without parens) */
+#define OPpENTERSUB_INARGS 4 /* Lval used as arg to a sub. */
+ /* OP_GV only */
+#define OPpEARLY_CV 32 /* foo() called before sub foo was parsed */
/* OP_?ELEM only */
#define OPpLVAL_DEFER 16 /* Defer creation of array/hash elem */
- /* for OP_RV2?V, lower bits carry hints */
+ /* OP_RV2?V, OP_GVSV only */
+#define OPpOUR_INTRO 16 /* Defer creation of array/hash elem */
+ /* for OP_RV2?V, lower bits carry hints (currently only HINT_STRICT_REFS) */
+
+/* Private for OPs with TARGLEX */
+ /* (lower bits may carry MAXARG) */
+#define OPpTARGET_MY 16 /* Target is PADMY. */
/* Private for OP_CONST */
+#define OPpCONST_STRICT 8 /* bearword subject to strict 'subs' */
#define OPpCONST_ENTERED 16 /* Has been entered as symbol. */
#define OPpCONST_ARYBASE 32 /* Was a $[ translated to constant. */
#define OPpCONST_BARE 64 /* Was a bare word (filehandle?). */
+#define OPpCONST_WARNING 128 /* Was a $^W translated to constant. */
/* Private for OP_FLIP/FLOP */
#define OPpFLIP_LINENUM 64 /* Range arg potentially a line num. */
@@ -137,12 +183,29 @@ typedef U32 PADOFFSET;
/* Private for OP_DELETE */
#define OPpSLICE 64 /* Operating on a list of keys */
-/* Private for OP_SORT, OP_PRTF, OP_SPRINTF, string cmp'n, and case changers */
+/* Private for OP_EXISTS */
+#define OPpEXISTS_SUB 64 /* Checking for &sub, not {} or []. */
+
+/* Private for OP_SORT, OP_PRTF, OP_SPRINTF, OP_FTTEXT, OP_FTBINARY, */
+/* string comparisons, and case changers. */
#define OPpLOCALE 64 /* Use locale */
+/* Private for OP_SORT */
+#define OPpSORT_NUMERIC 1 /* Optimized away { $a <=> $b } */
+#define OPpSORT_INTEGER 2 /* Ditto while under "use integer" */
+#define OPpSORT_REVERSE 4 /* Descending sort */
/* Private for OP_THREADSV */
#define OPpDONE_SVREF 64 /* Been through newSVREF once */
+/* Private for OP_OPEN and OP_BACKTICK */
+#define OPpOPEN_IN_RAW 16 /* binmode(F,":raw") on input fh */
+#define OPpOPEN_IN_CRLF 32 /* binmode(F,":crlf") on input fh */
+#define OPpOPEN_OUT_RAW 64 /* binmode(F,":raw") on output fh */
+#define OPpOPEN_OUT_CRLF 128 /* binmode(F,":crlf") on output fh */
+
+/* Private for OP_EXIT */
+#define OPpEXIT_VMSISH 128 /* exit(0) vs. exit(1) vmsish mode*/
+
struct op {
BASEOP
};
@@ -164,13 +227,6 @@ struct logop {
OP * op_other;
};
-struct condop {
- BASEOP
- OP * op_first;
- OP * op_true;
- OP * op_false;
-};
-
struct listop {
BASEOP
OP * op_first;
@@ -194,6 +250,7 @@ struct pmop {
#define PMdf_USED 0x01 /* pm has been used once already */
#define PMdf_TAINTED 0x02 /* pm compiled from tainted pattern */
+#define PMdf_UTF8 0x04 /* pm compiled from utf8 data */
#define PMf_RETAINT 0x0001 /* taint $1 etc. if target tainted */
#define PMf_ONCE 0x0002 /* use pattern only once per reset */
@@ -220,9 +277,9 @@ struct svop {
SV * op_sv;
};
-struct gvop {
+struct padop {
BASEOP
- GV * op_gv;
+ PADOFFSET op_padix;
};
struct pvop {
@@ -240,46 +297,77 @@ struct loop {
OP * op_lastop;
};
-#define cUNOP ((UNOP*)PL_op)
-#define cBINOP ((BINOP*)PL_op)
-#define cLISTOP ((LISTOP*)PL_op)
-#define cLOGOP ((LOGOP*)PL_op)
-#define cCONDOP ((CONDOP*)PL_op)
-#define cPMOP ((PMOP*)PL_op)
-#define cSVOP ((SVOP*)PL_op)
-#define cGVOP ((GVOP*)PL_op)
-#define cPVOP ((PVOP*)PL_op)
-#define cCOP ((COP*)PL_op)
-#define cLOOP ((LOOP*)PL_op)
-
-#define cUNOPo ((UNOP*)o)
-#define cBINOPo ((BINOP*)o)
-#define cLISTOPo ((LISTOP*)o)
-#define cLOGOPo ((LOGOP*)o)
-#define cCONDOPo ((CONDOP*)o)
-#define cPMOPo ((PMOP*)o)
-#define cSVOPo ((SVOP*)o)
-#define cGVOPo ((GVOP*)o)
-#define cPVOPo ((PVOP*)o)
-#define cCVOPo ((CVOP*)o)
-#define cCOPo ((COP*)o)
-#define cLOOPo ((LOOP*)o)
-
-#define kUNOP ((UNOP*)kid)
-#define kBINOP ((BINOP*)kid)
-#define kLISTOP ((LISTOP*)kid)
-#define kLOGOP ((LOGOP*)kid)
-#define kCONDOP ((CONDOP*)kid)
-#define kPMOP ((PMOP*)kid)
-#define kSVOP ((SVOP*)kid)
-#define kGVOP ((GVOP*)kid)
-#define kPVOP ((PVOP*)kid)
-#define kCOP ((COP*)kid)
-#define kLOOP ((LOOP*)kid)
+#define cUNOPx(o) ((UNOP*)o)
+#define cBINOPx(o) ((BINOP*)o)
+#define cLISTOPx(o) ((LISTOP*)o)
+#define cLOGOPx(o) ((LOGOP*)o)
+#define cPMOPx(o) ((PMOP*)o)
+#define cSVOPx(o) ((SVOP*)o)
+#define cPADOPx(o) ((PADOP*)o)
+#define cPVOPx(o) ((PVOP*)o)
+#define cCOPx(o) ((COP*)o)
+#define cLOOPx(o) ((LOOP*)o)
+
+#define cUNOP cUNOPx(PL_op)
+#define cBINOP cBINOPx(PL_op)
+#define cLISTOP cLISTOPx(PL_op)
+#define cLOGOP cLOGOPx(PL_op)
+#define cPMOP cPMOPx(PL_op)
+#define cSVOP cSVOPx(PL_op)
+#define cPADOP cPADOPx(PL_op)
+#define cPVOP cPVOPx(PL_op)
+#define cCOP cCOPx(PL_op)
+#define cLOOP cLOOPx(PL_op)
+
+#define cUNOPo cUNOPx(o)
+#define cBINOPo cBINOPx(o)
+#define cLISTOPo cLISTOPx(o)
+#define cLOGOPo cLOGOPx(o)
+#define cPMOPo cPMOPx(o)
+#define cSVOPo cSVOPx(o)
+#define cPADOPo cPADOPx(o)
+#define cPVOPo cPVOPx(o)
+#define cCOPo cCOPx(o)
+#define cLOOPo cLOOPx(o)
+
+#define kUNOP cUNOPx(kid)
+#define kBINOP cBINOPx(kid)
+#define kLISTOP cLISTOPx(kid)
+#define kLOGOP cLOGOPx(kid)
+#define kPMOP cPMOPx(kid)
+#define kSVOP cSVOPx(kid)
+#define kPADOP cPADOPx(kid)
+#define kPVOP cPVOPx(kid)
+#define kCOP cCOPx(kid)
+#define kLOOP cLOOPx(kid)
+
+
+#ifdef USE_ITHREADS
+# define cGVOPx_gv(o) ((GV*)PL_curpad[cPADOPx(o)->op_padix])
+# define IS_PADGV(v) (v && SvTYPE(v) == SVt_PVGV && GvIN_PAD(v))
+# define IS_PADCONST(v) (v && SvREADONLY(v))
+# define cSVOPx_sv(v) (cSVOPx(v)->op_sv \
+ ? cSVOPx(v)->op_sv : PL_curpad[(v)->op_targ])
+# define cSVOPx_svp(v) (cSVOPx(v)->op_sv \
+ ? &cSVOPx(v)->op_sv : &PL_curpad[(v)->op_targ])
+#else
+# define cGVOPx_gv(o) ((GV*)cSVOPx(o)->op_sv)
+# define IS_PADGV(v) FALSE
+# define IS_PADCONST(v) FALSE
+# define cSVOPx_sv(v) (cSVOPx(v)->op_sv)
+# define cSVOPx_svp(v) (&cSVOPx(v)->op_sv)
+#endif
+
+#define cGVOP_gv cGVOPx_gv(PL_op)
+#define cGVOPo_gv cGVOPx_gv(o)
+#define kGVOP_gv cGVOPx_gv(kid)
+#define cSVOP_sv cSVOPx_sv(PL_op)
+#define cSVOPo_sv cSVOPx_sv(o)
+#define kSVOP_sv cSVOPx_sv(kid)
#define Nullop Null(OP*)
-/* Lowest byte of opargs */
+/* Lowest byte of PL_opargs */
#define OA_MARK 1
#define OA_FOLDCONST 2
#define OA_RETSCALAR 4
@@ -288,29 +376,31 @@ struct loop {
#define OA_OTHERINT 32
#define OA_DANGEROUS 64
#define OA_DEFGV 128
+#define OA_TARGLEX 256
/* The next 4 bits encode op class information */
-#define OA_CLASS_MASK (15 << 8)
-
-#define OA_BASEOP (0 << 8)
-#define OA_UNOP (1 << 8)
-#define OA_BINOP (2 << 8)
-#define OA_LOGOP (3 << 8)
-#define OA_CONDOP (4 << 8)
-#define OA_LISTOP (5 << 8)
-#define OA_PMOP (6 << 8)
-#define OA_SVOP (7 << 8)
-#define OA_GVOP (8 << 8)
-#define OA_PVOP (9 << 8)
-#define OA_LOOP (10 << 8)
-#define OA_COP (11 << 8)
-#define OA_BASEOP_OR_UNOP (12 << 8)
-#define OA_FILESTATOP (13 << 8)
-#define OA_LOOPEXOP (14 << 8)
-
-#define OASHIFT 12
-
-/* Remaining nybbles of opargs */
+#define OCSHIFT 9
+
+#define OA_CLASS_MASK (15 << OCSHIFT)
+
+#define OA_BASEOP (0 << OCSHIFT)
+#define OA_UNOP (1 << OCSHIFT)
+#define OA_BINOP (2 << OCSHIFT)
+#define OA_LOGOP (3 << OCSHIFT)
+#define OA_LISTOP (4 << OCSHIFT)
+#define OA_PMOP (5 << OCSHIFT)
+#define OA_SVOP (6 << OCSHIFT)
+#define OA_PADOP (7 << OCSHIFT)
+#define OA_PVOP_OR_SVOP (8 << OCSHIFT)
+#define OA_LOOP (9 << OCSHIFT)
+#define OA_COP (10 << OCSHIFT)
+#define OA_BASEOP_OR_UNOP (11 << OCSHIFT)
+#define OA_FILESTATOP (12 << OCSHIFT)
+#define OA_LOOPEXOP (13 << OCSHIFT)
+
+#define OASHIFT 13
+
+/* Remaining nybbles of PL_opargs */
#define OA_SCALAR 1
#define OA_LIST 2
#define OA_AVREF 3
@@ -320,3 +410,25 @@ struct loop {
#define OA_SCALARREF 7
#define OA_OPTIONAL 8
+#ifdef USE_ITHREADS
+# define OP_REFCNT_INIT MUTEX_INIT(&PL_op_mutex)
+# define OP_REFCNT_LOCK MUTEX_LOCK(&PL_op_mutex)
+# define OP_REFCNT_UNLOCK MUTEX_UNLOCK(&PL_op_mutex)
+# define OP_REFCNT_TERM MUTEX_DESTROY(&PL_op_mutex)
+# define OpREFCNT_set(o,n) ((o)->op_targ = (n))
+# define OpREFCNT_inc(o) ((o) ? (++(o)->op_targ, (o)) : Nullop)
+# define OpREFCNT_dec(o) (--(o)->op_targ)
+#else
+# define OP_REFCNT_INIT NOOP
+# define OP_REFCNT_LOCK NOOP
+# define OP_REFCNT_UNLOCK NOOP
+# define OP_REFCNT_TERM NOOP
+# define OpREFCNT_set(o,n) NOOP
+# define OpREFCNT_inc(o) (o)
+# define OpREFCNT_dec(o) 0
+#endif
+
+/* flags used by Perl_load_module() */
+#define PERL_LOADMOD_DENY 0x1
+#define PERL_LOADMOD_NOIMPORT 0x2
+#define PERL_LOADMOD_IMPORT_OPS 0x4
diff --git a/contrib/perl5/opcode.h b/contrib/perl5/opcode.h
index 81e1690..f0fcba9 100644
--- a/contrib/perl5/opcode.h
+++ b/contrib/perl5/opcode.h
@@ -1,366 +1,20 @@
-#define pp_i_preinc pp_preinc
-#define pp_i_predec pp_predec
-#define pp_i_postinc pp_postinc
-#define pp_i_postdec pp_postdec
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
-typedef enum {
- OP_NULL, /* 0 */
- OP_STUB, /* 1 */
- OP_SCALAR, /* 2 */
- OP_PUSHMARK, /* 3 */
- OP_WANTARRAY, /* 4 */
- OP_CONST, /* 5 */
- OP_GVSV, /* 6 */
- OP_GV, /* 7 */
- OP_GELEM, /* 8 */
- OP_PADSV, /* 9 */
- OP_PADAV, /* 10 */
- OP_PADHV, /* 11 */
- OP_PADANY, /* 12 */
- OP_PUSHRE, /* 13 */
- OP_RV2GV, /* 14 */
- OP_RV2SV, /* 15 */
- OP_AV2ARYLEN, /* 16 */
- OP_RV2CV, /* 17 */
- OP_ANONCODE, /* 18 */
- OP_PROTOTYPE, /* 19 */
- OP_REFGEN, /* 20 */
- OP_SREFGEN, /* 21 */
- OP_REF, /* 22 */
- OP_BLESS, /* 23 */
- OP_BACKTICK, /* 24 */
- OP_GLOB, /* 25 */
- OP_READLINE, /* 26 */
- OP_RCATLINE, /* 27 */
- OP_REGCMAYBE, /* 28 */
- OP_REGCRESET, /* 29 */
- OP_REGCOMP, /* 30 */
- OP_MATCH, /* 31 */
- OP_QR, /* 32 */
- OP_SUBST, /* 33 */
- OP_SUBSTCONT, /* 34 */
- OP_TRANS, /* 35 */
- OP_SASSIGN, /* 36 */
- OP_AASSIGN, /* 37 */
- OP_CHOP, /* 38 */
- OP_SCHOP, /* 39 */
- OP_CHOMP, /* 40 */
- OP_SCHOMP, /* 41 */
- OP_DEFINED, /* 42 */
- OP_UNDEF, /* 43 */
- OP_STUDY, /* 44 */
- OP_POS, /* 45 */
- OP_PREINC, /* 46 */
- OP_I_PREINC, /* 47 */
- OP_PREDEC, /* 48 */
- OP_I_PREDEC, /* 49 */
- OP_POSTINC, /* 50 */
- OP_I_POSTINC, /* 51 */
- OP_POSTDEC, /* 52 */
- OP_I_POSTDEC, /* 53 */
- OP_POW, /* 54 */
- OP_MULTIPLY, /* 55 */
- OP_I_MULTIPLY, /* 56 */
- OP_DIVIDE, /* 57 */
- OP_I_DIVIDE, /* 58 */
- OP_MODULO, /* 59 */
- OP_I_MODULO, /* 60 */
- OP_REPEAT, /* 61 */
- OP_ADD, /* 62 */
- OP_I_ADD, /* 63 */
- OP_SUBTRACT, /* 64 */
- OP_I_SUBTRACT, /* 65 */
- OP_CONCAT, /* 66 */
- OP_STRINGIFY, /* 67 */
- OP_LEFT_SHIFT, /* 68 */
- OP_RIGHT_SHIFT, /* 69 */
- OP_LT, /* 70 */
- OP_I_LT, /* 71 */
- OP_GT, /* 72 */
- OP_I_GT, /* 73 */
- OP_LE, /* 74 */
- OP_I_LE, /* 75 */
- OP_GE, /* 76 */
- OP_I_GE, /* 77 */
- OP_EQ, /* 78 */
- OP_I_EQ, /* 79 */
- OP_NE, /* 80 */
- OP_I_NE, /* 81 */
- OP_NCMP, /* 82 */
- OP_I_NCMP, /* 83 */
- OP_SLT, /* 84 */
- OP_SGT, /* 85 */
- OP_SLE, /* 86 */
- OP_SGE, /* 87 */
- OP_SEQ, /* 88 */
- OP_SNE, /* 89 */
- OP_SCMP, /* 90 */
- OP_BIT_AND, /* 91 */
- OP_BIT_XOR, /* 92 */
- OP_BIT_OR, /* 93 */
- OP_NEGATE, /* 94 */
- OP_I_NEGATE, /* 95 */
- OP_NOT, /* 96 */
- OP_COMPLEMENT, /* 97 */
- OP_ATAN2, /* 98 */
- OP_SIN, /* 99 */
- OP_COS, /* 100 */
- OP_RAND, /* 101 */
- OP_SRAND, /* 102 */
- OP_EXP, /* 103 */
- OP_LOG, /* 104 */
- OP_SQRT, /* 105 */
- OP_INT, /* 106 */
- OP_HEX, /* 107 */
- OP_OCT, /* 108 */
- OP_ABS, /* 109 */
- OP_LENGTH, /* 110 */
- OP_SUBSTR, /* 111 */
- OP_VEC, /* 112 */
- OP_INDEX, /* 113 */
- OP_RINDEX, /* 114 */
- OP_SPRINTF, /* 115 */
- OP_FORMLINE, /* 116 */
- OP_ORD, /* 117 */
- OP_CHR, /* 118 */
- OP_CRYPT, /* 119 */
- OP_UCFIRST, /* 120 */
- OP_LCFIRST, /* 121 */
- OP_UC, /* 122 */
- OP_LC, /* 123 */
- OP_QUOTEMETA, /* 124 */
- OP_RV2AV, /* 125 */
- OP_AELEMFAST, /* 126 */
- OP_AELEM, /* 127 */
- OP_ASLICE, /* 128 */
- OP_EACH, /* 129 */
- OP_VALUES, /* 130 */
- OP_KEYS, /* 131 */
- OP_DELETE, /* 132 */
- OP_EXISTS, /* 133 */
- OP_RV2HV, /* 134 */
- OP_HELEM, /* 135 */
- OP_HSLICE, /* 136 */
- OP_UNPACK, /* 137 */
- OP_PACK, /* 138 */
- OP_SPLIT, /* 139 */
- OP_JOIN, /* 140 */
- OP_LIST, /* 141 */
- OP_LSLICE, /* 142 */
- OP_ANONLIST, /* 143 */
- OP_ANONHASH, /* 144 */
- OP_SPLICE, /* 145 */
- OP_PUSH, /* 146 */
- OP_POP, /* 147 */
- OP_SHIFT, /* 148 */
- OP_UNSHIFT, /* 149 */
- OP_SORT, /* 150 */
- OP_REVERSE, /* 151 */
- OP_GREPSTART, /* 152 */
- OP_GREPWHILE, /* 153 */
- OP_MAPSTART, /* 154 */
- OP_MAPWHILE, /* 155 */
- OP_RANGE, /* 156 */
- OP_FLIP, /* 157 */
- OP_FLOP, /* 158 */
- OP_AND, /* 159 */
- OP_OR, /* 160 */
- OP_XOR, /* 161 */
- OP_COND_EXPR, /* 162 */
- OP_ANDASSIGN, /* 163 */
- OP_ORASSIGN, /* 164 */
- OP_METHOD, /* 165 */
- OP_ENTERSUB, /* 166 */
- OP_LEAVESUB, /* 167 */
- OP_CALLER, /* 168 */
- OP_WARN, /* 169 */
- OP_DIE, /* 170 */
- OP_RESET, /* 171 */
- OP_LINESEQ, /* 172 */
- OP_NEXTSTATE, /* 173 */
- OP_DBSTATE, /* 174 */
- OP_UNSTACK, /* 175 */
- OP_ENTER, /* 176 */
- OP_LEAVE, /* 177 */
- OP_SCOPE, /* 178 */
- OP_ENTERITER, /* 179 */
- OP_ITER, /* 180 */
- OP_ENTERLOOP, /* 181 */
- OP_LEAVELOOP, /* 182 */
- OP_RETURN, /* 183 */
- OP_LAST, /* 184 */
- OP_NEXT, /* 185 */
- OP_REDO, /* 186 */
- OP_DUMP, /* 187 */
- OP_GOTO, /* 188 */
- OP_EXIT, /* 189 */
- OP_OPEN, /* 190 */
- OP_CLOSE, /* 191 */
- OP_PIPE_OP, /* 192 */
- OP_FILENO, /* 193 */
- OP_UMASK, /* 194 */
- OP_BINMODE, /* 195 */
- OP_TIE, /* 196 */
- OP_UNTIE, /* 197 */
- OP_TIED, /* 198 */
- OP_DBMOPEN, /* 199 */
- OP_DBMCLOSE, /* 200 */
- OP_SSELECT, /* 201 */
- OP_SELECT, /* 202 */
- OP_GETC, /* 203 */
- OP_READ, /* 204 */
- OP_ENTERWRITE, /* 205 */
- OP_LEAVEWRITE, /* 206 */
- OP_PRTF, /* 207 */
- OP_PRINT, /* 208 */
- OP_SYSOPEN, /* 209 */
- OP_SYSSEEK, /* 210 */
- OP_SYSREAD, /* 211 */
- OP_SYSWRITE, /* 212 */
- OP_SEND, /* 213 */
- OP_RECV, /* 214 */
- OP_EOF, /* 215 */
- OP_TELL, /* 216 */
- OP_SEEK, /* 217 */
- OP_TRUNCATE, /* 218 */
- OP_FCNTL, /* 219 */
- OP_IOCTL, /* 220 */
- OP_FLOCK, /* 221 */
- OP_SOCKET, /* 222 */
- OP_SOCKPAIR, /* 223 */
- OP_BIND, /* 224 */
- OP_CONNECT, /* 225 */
- OP_LISTEN, /* 226 */
- OP_ACCEPT, /* 227 */
- OP_SHUTDOWN, /* 228 */
- OP_GSOCKOPT, /* 229 */
- OP_SSOCKOPT, /* 230 */
- OP_GETSOCKNAME, /* 231 */
- OP_GETPEERNAME, /* 232 */
- OP_LSTAT, /* 233 */
- OP_STAT, /* 234 */
- OP_FTRREAD, /* 235 */
- OP_FTRWRITE, /* 236 */
- OP_FTREXEC, /* 237 */
- OP_FTEREAD, /* 238 */
- OP_FTEWRITE, /* 239 */
- OP_FTEEXEC, /* 240 */
- OP_FTIS, /* 241 */
- OP_FTEOWNED, /* 242 */
- OP_FTROWNED, /* 243 */
- OP_FTZERO, /* 244 */
- OP_FTSIZE, /* 245 */
- OP_FTMTIME, /* 246 */
- OP_FTATIME, /* 247 */
- OP_FTCTIME, /* 248 */
- OP_FTSOCK, /* 249 */
- OP_FTCHR, /* 250 */
- OP_FTBLK, /* 251 */
- OP_FTFILE, /* 252 */
- OP_FTDIR, /* 253 */
- OP_FTPIPE, /* 254 */
- OP_FTLINK, /* 255 */
- OP_FTSUID, /* 256 */
- OP_FTSGID, /* 257 */
- OP_FTSVTX, /* 258 */
- OP_FTTTY, /* 259 */
- OP_FTTEXT, /* 260 */
- OP_FTBINARY, /* 261 */
- OP_CHDIR, /* 262 */
- OP_CHOWN, /* 263 */
- OP_CHROOT, /* 264 */
- OP_UNLINK, /* 265 */
- OP_CHMOD, /* 266 */
- OP_UTIME, /* 267 */
- OP_RENAME, /* 268 */
- OP_LINK, /* 269 */
- OP_SYMLINK, /* 270 */
- OP_READLINK, /* 271 */
- OP_MKDIR, /* 272 */
- OP_RMDIR, /* 273 */
- OP_OPEN_DIR, /* 274 */
- OP_READDIR, /* 275 */
- OP_TELLDIR, /* 276 */
- OP_SEEKDIR, /* 277 */
- OP_REWINDDIR, /* 278 */
- OP_CLOSEDIR, /* 279 */
- OP_FORK, /* 280 */
- OP_WAIT, /* 281 */
- OP_WAITPID, /* 282 */
- OP_SYSTEM, /* 283 */
- OP_EXEC, /* 284 */
- OP_KILL, /* 285 */
- OP_GETPPID, /* 286 */
- OP_GETPGRP, /* 287 */
- OP_SETPGRP, /* 288 */
- OP_GETPRIORITY, /* 289 */
- OP_SETPRIORITY, /* 290 */
- OP_TIME, /* 291 */
- OP_TMS, /* 292 */
- OP_LOCALTIME, /* 293 */
- OP_GMTIME, /* 294 */
- OP_ALARM, /* 295 */
- OP_SLEEP, /* 296 */
- OP_SHMGET, /* 297 */
- OP_SHMCTL, /* 298 */
- OP_SHMREAD, /* 299 */
- OP_SHMWRITE, /* 300 */
- OP_MSGGET, /* 301 */
- OP_MSGCTL, /* 302 */
- OP_MSGSND, /* 303 */
- OP_MSGRCV, /* 304 */
- OP_SEMGET, /* 305 */
- OP_SEMCTL, /* 306 */
- OP_SEMOP, /* 307 */
- OP_REQUIRE, /* 308 */
- OP_DOFILE, /* 309 */
- OP_ENTEREVAL, /* 310 */
- OP_LEAVEEVAL, /* 311 */
- OP_ENTERTRY, /* 312 */
- OP_LEAVETRY, /* 313 */
- OP_GHBYNAME, /* 314 */
- OP_GHBYADDR, /* 315 */
- OP_GHOSTENT, /* 316 */
- OP_GNBYNAME, /* 317 */
- OP_GNBYADDR, /* 318 */
- OP_GNETENT, /* 319 */
- OP_GPBYNAME, /* 320 */
- OP_GPBYNUMBER, /* 321 */
- OP_GPROTOENT, /* 322 */
- OP_GSBYNAME, /* 323 */
- OP_GSBYPORT, /* 324 */
- OP_GSERVENT, /* 325 */
- OP_SHOSTENT, /* 326 */
- OP_SNETENT, /* 327 */
- OP_SPROTOENT, /* 328 */
- OP_SSERVENT, /* 329 */
- OP_EHOSTENT, /* 330 */
- OP_ENETENT, /* 331 */
- OP_EPROTOENT, /* 332 */
- OP_ESERVENT, /* 333 */
- OP_GPWNAM, /* 334 */
- OP_GPWUID, /* 335 */
- OP_GPWENT, /* 336 */
- OP_SPWENT, /* 337 */
- OP_EPWENT, /* 338 */
- OP_GGRNAM, /* 339 */
- OP_GGRGID, /* 340 */
- OP_GGRENT, /* 341 */
- OP_SGRENT, /* 342 */
- OP_EGRENT, /* 343 */
- OP_GETLOGIN, /* 344 */
- OP_SYSCALL, /* 345 */
- OP_LOCK, /* 346 */
- OP_THREADSV, /* 347 */
- OP_max
-} opcode;
+#define Perl_pp_i_preinc Perl_pp_preinc
+#define Perl_pp_i_predec Perl_pp_predec
+#define Perl_pp_i_postinc Perl_pp_postinc
+#define Perl_pp_i_postdec Perl_pp_postdec
-#define MAXO 348
+
+START_EXTERN_C
#ifndef DOINIT
-EXT char *op_name[];
+EXT char *PL_op_name[];
#else
-EXT char *op_name[] = {
+EXT char *PL_op_name[] = {
"null",
"stub",
"scalar",
@@ -529,6 +183,7 @@ EXT char *op_name[] = {
"method",
"entersub",
"leavesub",
+ "leavesublv",
"caller",
"warn",
"die",
@@ -709,13 +364,15 @@ EXT char *op_name[] = {
"syscall",
"lock",
"threadsv",
+ "setstate",
+ "method_named",
};
#endif
#ifndef DOINIT
-EXT char *op_desc[];
+EXT char *PL_op_desc[];
#else
-EXT char *op_desc[] = {
+EXT char *PL_op_desc[] = {
"null operation",
"stub",
"scalar",
@@ -728,92 +385,92 @@ EXT char *op_desc[] = {
"private variable",
"private array",
"private hash",
- "private something",
+ "private value",
"push regexp",
"ref-to-glob cast",
- "scalar deref",
+ "scalar dereference",
"array length",
- "subroutine deref",
+ "subroutine dereference",
"anonymous subroutine",
"subroutine prototype",
"reference constructor",
- "scalar ref constructor",
+ "single ref constructor",
"reference-type operator",
"bless",
- "backticks",
+ "quoted execution (``, qx)",
"glob",
"<HANDLE>",
"append I/O operator",
- "regexp comp once",
- "regexp reset interpolation flag",
+ "regexp internal guard",
+ "regexp internal reset",
"regexp compilation",
- "pattern match",
- "pattern quote",
- "substitution",
- "substitution cont",
- "character translation",
+ "pattern match (m//)",
+ "pattern quote (qr//)",
+ "substitution (s///)",
+ "substitution iterator",
+ "transliteration (tr///)",
"scalar assignment",
"list assignment",
"chop",
"scalar chop",
- "safe chop",
- "scalar safe chop",
+ "chomp",
+ "scalar chomp",
"defined operator",
"undef operator",
"study",
"match position",
- "preincrement",
- "integer preincrement",
- "predecrement",
- "integer predecrement",
- "postincrement",
- "integer postincrement",
- "postdecrement",
- "integer postdecrement",
- "exponentiation",
- "multiplication",
- "integer multiplication",
- "division",
- "integer division",
- "modulus",
- "integer modulus",
- "repeat",
- "addition",
- "integer addition",
- "subtraction",
- "integer subtraction",
- "concatenation",
+ "preincrement (++)",
+ "integer preincrement (++)",
+ "predecrement (--)",
+ "integer predecrement (--)",
+ "postincrement (++)",
+ "integer postincrement (++)",
+ "postdecrement (--)",
+ "integer postdecrement (--)",
+ "exponentiation (**)",
+ "multiplication (*)",
+ "integer multiplication (*)",
+ "division (/)",
+ "integer division (/)",
+ "modulus (%)",
+ "integer modulus (%)",
+ "repeat (x)",
+ "addition (+)",
+ "integer addition (+)",
+ "subtraction (-)",
+ "integer subtraction (-)",
+ "concatenation (.)",
"string",
- "left bitshift",
- "right bitshift",
- "numeric lt",
- "integer lt",
- "numeric gt",
- "integer gt",
- "numeric le",
- "integer le",
- "numeric ge",
- "integer ge",
- "numeric eq",
- "integer eq",
- "numeric ne",
- "integer ne",
- "spaceship operator",
- "integer spaceship",
+ "left bitshift (<<)",
+ "right bitshift (>>)",
+ "numeric lt (<)",
+ "integer lt (<)",
+ "numeric gt (>)",
+ "integer gt (>)",
+ "numeric le (<=)",
+ "integer le (<=)",
+ "numeric ge (>=)",
+ "integer ge (>=)",
+ "numeric eq (==)",
+ "integer eq (==)",
+ "numeric ne (!=)",
+ "integer ne (!=)",
+ "numeric comparison (<=>)",
+ "integer comparison (<=>)",
"string lt",
"string gt",
"string le",
"string ge",
"string eq",
"string ne",
- "string comparison",
- "bitwise and",
- "bitwise xor",
- "bitwise or",
- "negate",
- "integer negate",
+ "string comparison (cmp)",
+ "bitwise and (&)",
+ "bitwise xor (^)",
+ "bitwise or (|)",
+ "negation (-)",
+ "integer negation (-)",
"not",
- "1's complement",
+ "1's complement (~)",
"atan2",
"sin",
"cos",
@@ -836,22 +493,22 @@ EXT char *op_desc[] = {
"ord",
"chr",
"crypt",
- "upper case first",
- "lower case first",
- "upper case",
- "lower case",
- "quote metachars",
- "array deref",
- "known array element",
+ "ucfirst",
+ "lcfirst",
+ "uc",
+ "lc",
+ "quotemeta",
+ "array dereference",
+ "constant array element",
"array element",
"array slice",
"each",
"values",
"keys",
"delete",
- "exists operator",
- "hash deref",
- "hash elem",
+ "exists",
+ "hash dereference",
+ "hash element",
"hash slice",
"unpack",
"pack",
@@ -859,8 +516,8 @@ EXT char *op_desc[] = {
"join",
"list",
"list slice",
- "anonymous list",
- "anonymous hash",
+ "anonymous list ([])",
+ "anonymous hash ({})",
"splice",
"push",
"pop",
@@ -875,19 +532,20 @@ EXT char *op_desc[] = {
"flipflop",
"range (or flip)",
"range (or flop)",
- "logical and",
- "logical or",
+ "logical and (&&)",
+ "logical or (||)",
"logical xor",
"conditional expression",
- "logical and assignment",
- "logical or assignment",
+ "logical and assignment (&&=)",
+ "logical or assignment (||=)",
"method lookup",
"subroutine entry",
"subroutine exit",
+ "lvalue subroutine exit",
"caller",
"warn",
"die",
- "reset",
+ "symbol reset",
"line sequence",
"next statement",
"debug next statement",
@@ -1025,11 +683,11 @@ EXT char *op_desc[] = {
"semctl",
"semop",
"require",
- "do 'file'",
- "eval string",
- "eval exit",
- "eval block",
- "eval block exit",
+ "do \"file\"",
+ "eval \"string\"",
+ "eval \"string\" exit",
+ "eval {block}",
+ "eval {block} exit",
"gethostbyname",
"gethostbyaddr",
"gethostent",
@@ -1063,1463 +721,1089 @@ EXT char *op_desc[] = {
"getlogin",
"syscall",
"lock",
- "per-thread variable",
+ "per-thread value",
+ "set statement info",
+ "method with known name",
};
#endif
-#ifndef PERL_OBJECT
-START_EXTERN_C
-
-OP * ck_anoncode _((OP* o));
-OP * ck_bitop _((OP* o));
-OP * ck_concat _((OP* o));
-OP * ck_delete _((OP* o));
-OP * ck_eof _((OP* o));
-OP * ck_eval _((OP* o));
-OP * ck_exec _((OP* o));
-OP * ck_exists _((OP* o));
-OP * ck_ftst _((OP* o));
-OP * ck_fun _((OP* o));
-OP * ck_fun_locale _((OP* o));
-OP * ck_glob _((OP* o));
-OP * ck_grep _((OP* o));
-OP * ck_index _((OP* o));
-OP * ck_lengthconst _((OP* o));
-OP * ck_lfun _((OP* o));
-OP * ck_listiob _((OP* o));
-OP * ck_match _((OP* o));
-OP * ck_null _((OP* o));
-OP * ck_repeat _((OP* o));
-OP * ck_require _((OP* o));
-OP * ck_rfun _((OP* o));
-OP * ck_rvconst _((OP* o));
-OP * ck_scmp _((OP* o));
-OP * ck_select _((OP* o));
-OP * ck_shift _((OP* o));
-OP * ck_sort _((OP* o));
-OP * ck_spair _((OP* o));
-OP * ck_split _((OP* o));
-OP * ck_subr _((OP* o));
-OP * ck_svconst _((OP* o));
-OP * ck_trunc _((OP* o));
+END_EXTERN_C
-OP * pp_null _((ARGSproto));
-OP * pp_stub _((ARGSproto));
-OP * pp_scalar _((ARGSproto));
-OP * pp_pushmark _((ARGSproto));
-OP * pp_wantarray _((ARGSproto));
-OP * pp_const _((ARGSproto));
-OP * pp_gvsv _((ARGSproto));
-OP * pp_gv _((ARGSproto));
-OP * pp_gelem _((ARGSproto));
-OP * pp_padsv _((ARGSproto));
-OP * pp_padav _((ARGSproto));
-OP * pp_padhv _((ARGSproto));
-OP * pp_padany _((ARGSproto));
-OP * pp_pushre _((ARGSproto));
-OP * pp_rv2gv _((ARGSproto));
-OP * pp_rv2sv _((ARGSproto));
-OP * pp_av2arylen _((ARGSproto));
-OP * pp_rv2cv _((ARGSproto));
-OP * pp_anoncode _((ARGSproto));
-OP * pp_prototype _((ARGSproto));
-OP * pp_refgen _((ARGSproto));
-OP * pp_srefgen _((ARGSproto));
-OP * pp_ref _((ARGSproto));
-OP * pp_bless _((ARGSproto));
-OP * pp_backtick _((ARGSproto));
-OP * pp_glob _((ARGSproto));
-OP * pp_readline _((ARGSproto));
-OP * pp_rcatline _((ARGSproto));
-OP * pp_regcmaybe _((ARGSproto));
-OP * pp_regcreset _((ARGSproto));
-OP * pp_regcomp _((ARGSproto));
-OP * pp_match _((ARGSproto));
-OP * pp_qr _((ARGSproto));
-OP * pp_subst _((ARGSproto));
-OP * pp_substcont _((ARGSproto));
-OP * pp_trans _((ARGSproto));
-OP * pp_sassign _((ARGSproto));
-OP * pp_aassign _((ARGSproto));
-OP * pp_chop _((ARGSproto));
-OP * pp_schop _((ARGSproto));
-OP * pp_chomp _((ARGSproto));
-OP * pp_schomp _((ARGSproto));
-OP * pp_defined _((ARGSproto));
-OP * pp_undef _((ARGSproto));
-OP * pp_study _((ARGSproto));
-OP * pp_pos _((ARGSproto));
-OP * pp_preinc _((ARGSproto));
-OP * pp_i_preinc _((ARGSproto));
-OP * pp_predec _((ARGSproto));
-OP * pp_i_predec _((ARGSproto));
-OP * pp_postinc _((ARGSproto));
-OP * pp_i_postinc _((ARGSproto));
-OP * pp_postdec _((ARGSproto));
-OP * pp_i_postdec _((ARGSproto));
-OP * pp_pow _((ARGSproto));
-OP * pp_multiply _((ARGSproto));
-OP * pp_i_multiply _((ARGSproto));
-OP * pp_divide _((ARGSproto));
-OP * pp_i_divide _((ARGSproto));
-OP * pp_modulo _((ARGSproto));
-OP * pp_i_modulo _((ARGSproto));
-OP * pp_repeat _((ARGSproto));
-OP * pp_add _((ARGSproto));
-OP * pp_i_add _((ARGSproto));
-OP * pp_subtract _((ARGSproto));
-OP * pp_i_subtract _((ARGSproto));
-OP * pp_concat _((ARGSproto));
-OP * pp_stringify _((ARGSproto));
-OP * pp_left_shift _((ARGSproto));
-OP * pp_right_shift _((ARGSproto));
-OP * pp_lt _((ARGSproto));
-OP * pp_i_lt _((ARGSproto));
-OP * pp_gt _((ARGSproto));
-OP * pp_i_gt _((ARGSproto));
-OP * pp_le _((ARGSproto));
-OP * pp_i_le _((ARGSproto));
-OP * pp_ge _((ARGSproto));
-OP * pp_i_ge _((ARGSproto));
-OP * pp_eq _((ARGSproto));
-OP * pp_i_eq _((ARGSproto));
-OP * pp_ne _((ARGSproto));
-OP * pp_i_ne _((ARGSproto));
-OP * pp_ncmp _((ARGSproto));
-OP * pp_i_ncmp _((ARGSproto));
-OP * pp_slt _((ARGSproto));
-OP * pp_sgt _((ARGSproto));
-OP * pp_sle _((ARGSproto));
-OP * pp_sge _((ARGSproto));
-OP * pp_seq _((ARGSproto));
-OP * pp_sne _((ARGSproto));
-OP * pp_scmp _((ARGSproto));
-OP * pp_bit_and _((ARGSproto));
-OP * pp_bit_xor _((ARGSproto));
-OP * pp_bit_or _((ARGSproto));
-OP * pp_negate _((ARGSproto));
-OP * pp_i_negate _((ARGSproto));
-OP * pp_not _((ARGSproto));
-OP * pp_complement _((ARGSproto));
-OP * pp_atan2 _((ARGSproto));
-OP * pp_sin _((ARGSproto));
-OP * pp_cos _((ARGSproto));
-OP * pp_rand _((ARGSproto));
-OP * pp_srand _((ARGSproto));
-OP * pp_exp _((ARGSproto));
-OP * pp_log _((ARGSproto));
-OP * pp_sqrt _((ARGSproto));
-OP * pp_int _((ARGSproto));
-OP * pp_hex _((ARGSproto));
-OP * pp_oct _((ARGSproto));
-OP * pp_abs _((ARGSproto));
-OP * pp_length _((ARGSproto));
-OP * pp_substr _((ARGSproto));
-OP * pp_vec _((ARGSproto));
-OP * pp_index _((ARGSproto));
-OP * pp_rindex _((ARGSproto));
-OP * pp_sprintf _((ARGSproto));
-OP * pp_formline _((ARGSproto));
-OP * pp_ord _((ARGSproto));
-OP * pp_chr _((ARGSproto));
-OP * pp_crypt _((ARGSproto));
-OP * pp_ucfirst _((ARGSproto));
-OP * pp_lcfirst _((ARGSproto));
-OP * pp_uc _((ARGSproto));
-OP * pp_lc _((ARGSproto));
-OP * pp_quotemeta _((ARGSproto));
-OP * pp_rv2av _((ARGSproto));
-OP * pp_aelemfast _((ARGSproto));
-OP * pp_aelem _((ARGSproto));
-OP * pp_aslice _((ARGSproto));
-OP * pp_each _((ARGSproto));
-OP * pp_values _((ARGSproto));
-OP * pp_keys _((ARGSproto));
-OP * pp_delete _((ARGSproto));
-OP * pp_exists _((ARGSproto));
-OP * pp_rv2hv _((ARGSproto));
-OP * pp_helem _((ARGSproto));
-OP * pp_hslice _((ARGSproto));
-OP * pp_unpack _((ARGSproto));
-OP * pp_pack _((ARGSproto));
-OP * pp_split _((ARGSproto));
-OP * pp_join _((ARGSproto));
-OP * pp_list _((ARGSproto));
-OP * pp_lslice _((ARGSproto));
-OP * pp_anonlist _((ARGSproto));
-OP * pp_anonhash _((ARGSproto));
-OP * pp_splice _((ARGSproto));
-OP * pp_push _((ARGSproto));
-OP * pp_pop _((ARGSproto));
-OP * pp_shift _((ARGSproto));
-OP * pp_unshift _((ARGSproto));
-OP * pp_sort _((ARGSproto));
-OP * pp_reverse _((ARGSproto));
-OP * pp_grepstart _((ARGSproto));
-OP * pp_grepwhile _((ARGSproto));
-OP * pp_mapstart _((ARGSproto));
-OP * pp_mapwhile _((ARGSproto));
-OP * pp_range _((ARGSproto));
-OP * pp_flip _((ARGSproto));
-OP * pp_flop _((ARGSproto));
-OP * pp_and _((ARGSproto));
-OP * pp_or _((ARGSproto));
-OP * pp_xor _((ARGSproto));
-OP * pp_cond_expr _((ARGSproto));
-OP * pp_andassign _((ARGSproto));
-OP * pp_orassign _((ARGSproto));
-OP * pp_method _((ARGSproto));
-OP * pp_entersub _((ARGSproto));
-OP * pp_leavesub _((ARGSproto));
-OP * pp_caller _((ARGSproto));
-OP * pp_warn _((ARGSproto));
-OP * pp_die _((ARGSproto));
-OP * pp_reset _((ARGSproto));
-OP * pp_lineseq _((ARGSproto));
-OP * pp_nextstate _((ARGSproto));
-OP * pp_dbstate _((ARGSproto));
-OP * pp_unstack _((ARGSproto));
-OP * pp_enter _((ARGSproto));
-OP * pp_leave _((ARGSproto));
-OP * pp_scope _((ARGSproto));
-OP * pp_enteriter _((ARGSproto));
-OP * pp_iter _((ARGSproto));
-OP * pp_enterloop _((ARGSproto));
-OP * pp_leaveloop _((ARGSproto));
-OP * pp_return _((ARGSproto));
-OP * pp_last _((ARGSproto));
-OP * pp_next _((ARGSproto));
-OP * pp_redo _((ARGSproto));
-OP * pp_dump _((ARGSproto));
-OP * pp_goto _((ARGSproto));
-OP * pp_exit _((ARGSproto));
-OP * pp_open _((ARGSproto));
-OP * pp_close _((ARGSproto));
-OP * pp_pipe_op _((ARGSproto));
-OP * pp_fileno _((ARGSproto));
-OP * pp_umask _((ARGSproto));
-OP * pp_binmode _((ARGSproto));
-OP * pp_tie _((ARGSproto));
-OP * pp_untie _((ARGSproto));
-OP * pp_tied _((ARGSproto));
-OP * pp_dbmopen _((ARGSproto));
-OP * pp_dbmclose _((ARGSproto));
-OP * pp_sselect _((ARGSproto));
-OP * pp_select _((ARGSproto));
-OP * pp_getc _((ARGSproto));
-OP * pp_read _((ARGSproto));
-OP * pp_enterwrite _((ARGSproto));
-OP * pp_leavewrite _((ARGSproto));
-OP * pp_prtf _((ARGSproto));
-OP * pp_print _((ARGSproto));
-OP * pp_sysopen _((ARGSproto));
-OP * pp_sysseek _((ARGSproto));
-OP * pp_sysread _((ARGSproto));
-OP * pp_syswrite _((ARGSproto));
-OP * pp_send _((ARGSproto));
-OP * pp_recv _((ARGSproto));
-OP * pp_eof _((ARGSproto));
-OP * pp_tell _((ARGSproto));
-OP * pp_seek _((ARGSproto));
-OP * pp_truncate _((ARGSproto));
-OP * pp_fcntl _((ARGSproto));
-OP * pp_ioctl _((ARGSproto));
-OP * pp_flock _((ARGSproto));
-OP * pp_socket _((ARGSproto));
-OP * pp_sockpair _((ARGSproto));
-OP * pp_bind _((ARGSproto));
-OP * pp_connect _((ARGSproto));
-OP * pp_listen _((ARGSproto));
-OP * pp_accept _((ARGSproto));
-OP * pp_shutdown _((ARGSproto));
-OP * pp_gsockopt _((ARGSproto));
-OP * pp_ssockopt _((ARGSproto));
-OP * pp_getsockname _((ARGSproto));
-OP * pp_getpeername _((ARGSproto));
-OP * pp_lstat _((ARGSproto));
-OP * pp_stat _((ARGSproto));
-OP * pp_ftrread _((ARGSproto));
-OP * pp_ftrwrite _((ARGSproto));
-OP * pp_ftrexec _((ARGSproto));
-OP * pp_fteread _((ARGSproto));
-OP * pp_ftewrite _((ARGSproto));
-OP * pp_fteexec _((ARGSproto));
-OP * pp_ftis _((ARGSproto));
-OP * pp_fteowned _((ARGSproto));
-OP * pp_ftrowned _((ARGSproto));
-OP * pp_ftzero _((ARGSproto));
-OP * pp_ftsize _((ARGSproto));
-OP * pp_ftmtime _((ARGSproto));
-OP * pp_ftatime _((ARGSproto));
-OP * pp_ftctime _((ARGSproto));
-OP * pp_ftsock _((ARGSproto));
-OP * pp_ftchr _((ARGSproto));
-OP * pp_ftblk _((ARGSproto));
-OP * pp_ftfile _((ARGSproto));
-OP * pp_ftdir _((ARGSproto));
-OP * pp_ftpipe _((ARGSproto));
-OP * pp_ftlink _((ARGSproto));
-OP * pp_ftsuid _((ARGSproto));
-OP * pp_ftsgid _((ARGSproto));
-OP * pp_ftsvtx _((ARGSproto));
-OP * pp_fttty _((ARGSproto));
-OP * pp_fttext _((ARGSproto));
-OP * pp_ftbinary _((ARGSproto));
-OP * pp_chdir _((ARGSproto));
-OP * pp_chown _((ARGSproto));
-OP * pp_chroot _((ARGSproto));
-OP * pp_unlink _((ARGSproto));
-OP * pp_chmod _((ARGSproto));
-OP * pp_utime _((ARGSproto));
-OP * pp_rename _((ARGSproto));
-OP * pp_link _((ARGSproto));
-OP * pp_symlink _((ARGSproto));
-OP * pp_readlink _((ARGSproto));
-OP * pp_mkdir _((ARGSproto));
-OP * pp_rmdir _((ARGSproto));
-OP * pp_open_dir _((ARGSproto));
-OP * pp_readdir _((ARGSproto));
-OP * pp_telldir _((ARGSproto));
-OP * pp_seekdir _((ARGSproto));
-OP * pp_rewinddir _((ARGSproto));
-OP * pp_closedir _((ARGSproto));
-OP * pp_fork _((ARGSproto));
-OP * pp_wait _((ARGSproto));
-OP * pp_waitpid _((ARGSproto));
-OP * pp_system _((ARGSproto));
-OP * pp_exec _((ARGSproto));
-OP * pp_kill _((ARGSproto));
-OP * pp_getppid _((ARGSproto));
-OP * pp_getpgrp _((ARGSproto));
-OP * pp_setpgrp _((ARGSproto));
-OP * pp_getpriority _((ARGSproto));
-OP * pp_setpriority _((ARGSproto));
-OP * pp_time _((ARGSproto));
-OP * pp_tms _((ARGSproto));
-OP * pp_localtime _((ARGSproto));
-OP * pp_gmtime _((ARGSproto));
-OP * pp_alarm _((ARGSproto));
-OP * pp_sleep _((ARGSproto));
-OP * pp_shmget _((ARGSproto));
-OP * pp_shmctl _((ARGSproto));
-OP * pp_shmread _((ARGSproto));
-OP * pp_shmwrite _((ARGSproto));
-OP * pp_msgget _((ARGSproto));
-OP * pp_msgctl _((ARGSproto));
-OP * pp_msgsnd _((ARGSproto));
-OP * pp_msgrcv _((ARGSproto));
-OP * pp_semget _((ARGSproto));
-OP * pp_semctl _((ARGSproto));
-OP * pp_semop _((ARGSproto));
-OP * pp_require _((ARGSproto));
-OP * pp_dofile _((ARGSproto));
-OP * pp_entereval _((ARGSproto));
-OP * pp_leaveeval _((ARGSproto));
-OP * pp_entertry _((ARGSproto));
-OP * pp_leavetry _((ARGSproto));
-OP * pp_ghbyname _((ARGSproto));
-OP * pp_ghbyaddr _((ARGSproto));
-OP * pp_ghostent _((ARGSproto));
-OP * pp_gnbyname _((ARGSproto));
-OP * pp_gnbyaddr _((ARGSproto));
-OP * pp_gnetent _((ARGSproto));
-OP * pp_gpbyname _((ARGSproto));
-OP * pp_gpbynumber _((ARGSproto));
-OP * pp_gprotoent _((ARGSproto));
-OP * pp_gsbyname _((ARGSproto));
-OP * pp_gsbyport _((ARGSproto));
-OP * pp_gservent _((ARGSproto));
-OP * pp_shostent _((ARGSproto));
-OP * pp_snetent _((ARGSproto));
-OP * pp_sprotoent _((ARGSproto));
-OP * pp_sservent _((ARGSproto));
-OP * pp_ehostent _((ARGSproto));
-OP * pp_enetent _((ARGSproto));
-OP * pp_eprotoent _((ARGSproto));
-OP * pp_eservent _((ARGSproto));
-OP * pp_gpwnam _((ARGSproto));
-OP * pp_gpwuid _((ARGSproto));
-OP * pp_gpwent _((ARGSproto));
-OP * pp_spwent _((ARGSproto));
-OP * pp_epwent _((ARGSproto));
-OP * pp_ggrnam _((ARGSproto));
-OP * pp_ggrgid _((ARGSproto));
-OP * pp_ggrent _((ARGSproto));
-OP * pp_sgrent _((ARGSproto));
-OP * pp_egrent _((ARGSproto));
-OP * pp_getlogin _((ARGSproto));
-OP * pp_syscall _((ARGSproto));
-OP * pp_lock _((ARGSproto));
-OP * pp_threadsv _((ARGSproto));
-END_EXTERN_C
-#endif /* PERL_OBJECT */
+START_EXTERN_C
#ifndef DOINIT
-EXT OP * (CPERLscope(*ppaddr)[])(ARGSproto);
+EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX);
#else
-#ifndef PERL_OBJECT
-EXT OP * (CPERLscope(*ppaddr)[])(ARGSproto) = {
- pp_null,
- pp_stub,
- pp_scalar,
- pp_pushmark,
- pp_wantarray,
- pp_const,
- pp_gvsv,
- pp_gv,
- pp_gelem,
- pp_padsv,
- pp_padav,
- pp_padhv,
- pp_padany,
- pp_pushre,
- pp_rv2gv,
- pp_rv2sv,
- pp_av2arylen,
- pp_rv2cv,
- pp_anoncode,
- pp_prototype,
- pp_refgen,
- pp_srefgen,
- pp_ref,
- pp_bless,
- pp_backtick,
- pp_glob,
- pp_readline,
- pp_rcatline,
- pp_regcmaybe,
- pp_regcreset,
- pp_regcomp,
- pp_match,
- pp_qr,
- pp_subst,
- pp_substcont,
- pp_trans,
- pp_sassign,
- pp_aassign,
- pp_chop,
- pp_schop,
- pp_chomp,
- pp_schomp,
- pp_defined,
- pp_undef,
- pp_study,
- pp_pos,
- pp_preinc,
- pp_i_preinc,
- pp_predec,
- pp_i_predec,
- pp_postinc,
- pp_i_postinc,
- pp_postdec,
- pp_i_postdec,
- pp_pow,
- pp_multiply,
- pp_i_multiply,
- pp_divide,
- pp_i_divide,
- pp_modulo,
- pp_i_modulo,
- pp_repeat,
- pp_add,
- pp_i_add,
- pp_subtract,
- pp_i_subtract,
- pp_concat,
- pp_stringify,
- pp_left_shift,
- pp_right_shift,
- pp_lt,
- pp_i_lt,
- pp_gt,
- pp_i_gt,
- pp_le,
- pp_i_le,
- pp_ge,
- pp_i_ge,
- pp_eq,
- pp_i_eq,
- pp_ne,
- pp_i_ne,
- pp_ncmp,
- pp_i_ncmp,
- pp_slt,
- pp_sgt,
- pp_sle,
- pp_sge,
- pp_seq,
- pp_sne,
- pp_scmp,
- pp_bit_and,
- pp_bit_xor,
- pp_bit_or,
- pp_negate,
- pp_i_negate,
- pp_not,
- pp_complement,
- pp_atan2,
- pp_sin,
- pp_cos,
- pp_rand,
- pp_srand,
- pp_exp,
- pp_log,
- pp_sqrt,
- pp_int,
- pp_hex,
- pp_oct,
- pp_abs,
- pp_length,
- pp_substr,
- pp_vec,
- pp_index,
- pp_rindex,
- pp_sprintf,
- pp_formline,
- pp_ord,
- pp_chr,
- pp_crypt,
- pp_ucfirst,
- pp_lcfirst,
- pp_uc,
- pp_lc,
- pp_quotemeta,
- pp_rv2av,
- pp_aelemfast,
- pp_aelem,
- pp_aslice,
- pp_each,
- pp_values,
- pp_keys,
- pp_delete,
- pp_exists,
- pp_rv2hv,
- pp_helem,
- pp_hslice,
- pp_unpack,
- pp_pack,
- pp_split,
- pp_join,
- pp_list,
- pp_lslice,
- pp_anonlist,
- pp_anonhash,
- pp_splice,
- pp_push,
- pp_pop,
- pp_shift,
- pp_unshift,
- pp_sort,
- pp_reverse,
- pp_grepstart,
- pp_grepwhile,
- pp_mapstart,
- pp_mapwhile,
- pp_range,
- pp_flip,
- pp_flop,
- pp_and,
- pp_or,
- pp_xor,
- pp_cond_expr,
- pp_andassign,
- pp_orassign,
- pp_method,
- pp_entersub,
- pp_leavesub,
- pp_caller,
- pp_warn,
- pp_die,
- pp_reset,
- pp_lineseq,
- pp_nextstate,
- pp_dbstate,
- pp_unstack,
- pp_enter,
- pp_leave,
- pp_scope,
- pp_enteriter,
- pp_iter,
- pp_enterloop,
- pp_leaveloop,
- pp_return,
- pp_last,
- pp_next,
- pp_redo,
- pp_dump,
- pp_goto,
- pp_exit,
- pp_open,
- pp_close,
- pp_pipe_op,
- pp_fileno,
- pp_umask,
- pp_binmode,
- pp_tie,
- pp_untie,
- pp_tied,
- pp_dbmopen,
- pp_dbmclose,
- pp_sselect,
- pp_select,
- pp_getc,
- pp_read,
- pp_enterwrite,
- pp_leavewrite,
- pp_prtf,
- pp_print,
- pp_sysopen,
- pp_sysseek,
- pp_sysread,
- pp_syswrite,
- pp_send,
- pp_recv,
- pp_eof,
- pp_tell,
- pp_seek,
- pp_truncate,
- pp_fcntl,
- pp_ioctl,
- pp_flock,
- pp_socket,
- pp_sockpair,
- pp_bind,
- pp_connect,
- pp_listen,
- pp_accept,
- pp_shutdown,
- pp_gsockopt,
- pp_ssockopt,
- pp_getsockname,
- pp_getpeername,
- pp_lstat,
- pp_stat,
- pp_ftrread,
- pp_ftrwrite,
- pp_ftrexec,
- pp_fteread,
- pp_ftewrite,
- pp_fteexec,
- pp_ftis,
- pp_fteowned,
- pp_ftrowned,
- pp_ftzero,
- pp_ftsize,
- pp_ftmtime,
- pp_ftatime,
- pp_ftctime,
- pp_ftsock,
- pp_ftchr,
- pp_ftblk,
- pp_ftfile,
- pp_ftdir,
- pp_ftpipe,
- pp_ftlink,
- pp_ftsuid,
- pp_ftsgid,
- pp_ftsvtx,
- pp_fttty,
- pp_fttext,
- pp_ftbinary,
- pp_chdir,
- pp_chown,
- pp_chroot,
- pp_unlink,
- pp_chmod,
- pp_utime,
- pp_rename,
- pp_link,
- pp_symlink,
- pp_readlink,
- pp_mkdir,
- pp_rmdir,
- pp_open_dir,
- pp_readdir,
- pp_telldir,
- pp_seekdir,
- pp_rewinddir,
- pp_closedir,
- pp_fork,
- pp_wait,
- pp_waitpid,
- pp_system,
- pp_exec,
- pp_kill,
- pp_getppid,
- pp_getpgrp,
- pp_setpgrp,
- pp_getpriority,
- pp_setpriority,
- pp_time,
- pp_tms,
- pp_localtime,
- pp_gmtime,
- pp_alarm,
- pp_sleep,
- pp_shmget,
- pp_shmctl,
- pp_shmread,
- pp_shmwrite,
- pp_msgget,
- pp_msgctl,
- pp_msgsnd,
- pp_msgrcv,
- pp_semget,
- pp_semctl,
- pp_semop,
- pp_require,
- pp_dofile,
- pp_entereval,
- pp_leaveeval,
- pp_entertry,
- pp_leavetry,
- pp_ghbyname,
- pp_ghbyaddr,
- pp_ghostent,
- pp_gnbyname,
- pp_gnbyaddr,
- pp_gnetent,
- pp_gpbyname,
- pp_gpbynumber,
- pp_gprotoent,
- pp_gsbyname,
- pp_gsbyport,
- pp_gservent,
- pp_shostent,
- pp_snetent,
- pp_sprotoent,
- pp_sservent,
- pp_ehostent,
- pp_enetent,
- pp_eprotoent,
- pp_eservent,
- pp_gpwnam,
- pp_gpwuid,
- pp_gpwent,
- pp_spwent,
- pp_epwent,
- pp_ggrnam,
- pp_ggrgid,
- pp_ggrent,
- pp_sgrent,
- pp_egrent,
- pp_getlogin,
- pp_syscall,
- pp_lock,
- pp_threadsv,
+EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX) = {
+ MEMBER_TO_FPTR(Perl_pp_null),
+ MEMBER_TO_FPTR(Perl_pp_stub),
+ MEMBER_TO_FPTR(Perl_pp_scalar),
+ MEMBER_TO_FPTR(Perl_pp_pushmark),
+ MEMBER_TO_FPTR(Perl_pp_wantarray),
+ MEMBER_TO_FPTR(Perl_pp_const),
+ MEMBER_TO_FPTR(Perl_pp_gvsv),
+ MEMBER_TO_FPTR(Perl_pp_gv),
+ MEMBER_TO_FPTR(Perl_pp_gelem),
+ MEMBER_TO_FPTR(Perl_pp_padsv),
+ MEMBER_TO_FPTR(Perl_pp_padav),
+ MEMBER_TO_FPTR(Perl_pp_padhv),
+ MEMBER_TO_FPTR(Perl_pp_padany),
+ MEMBER_TO_FPTR(Perl_pp_pushre),
+ MEMBER_TO_FPTR(Perl_pp_rv2gv),
+ MEMBER_TO_FPTR(Perl_pp_rv2sv),
+ MEMBER_TO_FPTR(Perl_pp_av2arylen),
+ MEMBER_TO_FPTR(Perl_pp_rv2cv),
+ MEMBER_TO_FPTR(Perl_pp_anoncode),
+ MEMBER_TO_FPTR(Perl_pp_prototype),
+ MEMBER_TO_FPTR(Perl_pp_refgen),
+ MEMBER_TO_FPTR(Perl_pp_srefgen),
+ MEMBER_TO_FPTR(Perl_pp_ref),
+ MEMBER_TO_FPTR(Perl_pp_bless),
+ MEMBER_TO_FPTR(Perl_pp_backtick),
+ MEMBER_TO_FPTR(Perl_pp_glob),
+ MEMBER_TO_FPTR(Perl_pp_readline),
+ MEMBER_TO_FPTR(Perl_pp_rcatline),
+ MEMBER_TO_FPTR(Perl_pp_regcmaybe),
+ MEMBER_TO_FPTR(Perl_pp_regcreset),
+ MEMBER_TO_FPTR(Perl_pp_regcomp),
+ MEMBER_TO_FPTR(Perl_pp_match),
+ MEMBER_TO_FPTR(Perl_pp_qr),
+ MEMBER_TO_FPTR(Perl_pp_subst),
+ MEMBER_TO_FPTR(Perl_pp_substcont),
+ MEMBER_TO_FPTR(Perl_pp_trans),
+ MEMBER_TO_FPTR(Perl_pp_sassign),
+ MEMBER_TO_FPTR(Perl_pp_aassign),
+ MEMBER_TO_FPTR(Perl_pp_chop),
+ MEMBER_TO_FPTR(Perl_pp_schop),
+ MEMBER_TO_FPTR(Perl_pp_chomp),
+ MEMBER_TO_FPTR(Perl_pp_schomp),
+ MEMBER_TO_FPTR(Perl_pp_defined),
+ MEMBER_TO_FPTR(Perl_pp_undef),
+ MEMBER_TO_FPTR(Perl_pp_study),
+ MEMBER_TO_FPTR(Perl_pp_pos),
+ MEMBER_TO_FPTR(Perl_pp_preinc),
+ MEMBER_TO_FPTR(Perl_pp_i_preinc),
+ MEMBER_TO_FPTR(Perl_pp_predec),
+ MEMBER_TO_FPTR(Perl_pp_i_predec),
+ MEMBER_TO_FPTR(Perl_pp_postinc),
+ MEMBER_TO_FPTR(Perl_pp_i_postinc),
+ MEMBER_TO_FPTR(Perl_pp_postdec),
+ MEMBER_TO_FPTR(Perl_pp_i_postdec),
+ MEMBER_TO_FPTR(Perl_pp_pow),
+ MEMBER_TO_FPTR(Perl_pp_multiply),
+ MEMBER_TO_FPTR(Perl_pp_i_multiply),
+ MEMBER_TO_FPTR(Perl_pp_divide),
+ MEMBER_TO_FPTR(Perl_pp_i_divide),
+ MEMBER_TO_FPTR(Perl_pp_modulo),
+ MEMBER_TO_FPTR(Perl_pp_i_modulo),
+ MEMBER_TO_FPTR(Perl_pp_repeat),
+ MEMBER_TO_FPTR(Perl_pp_add),
+ MEMBER_TO_FPTR(Perl_pp_i_add),
+ MEMBER_TO_FPTR(Perl_pp_subtract),
+ MEMBER_TO_FPTR(Perl_pp_i_subtract),
+ MEMBER_TO_FPTR(Perl_pp_concat),
+ MEMBER_TO_FPTR(Perl_pp_stringify),
+ MEMBER_TO_FPTR(Perl_pp_left_shift),
+ MEMBER_TO_FPTR(Perl_pp_right_shift),
+ MEMBER_TO_FPTR(Perl_pp_lt),
+ MEMBER_TO_FPTR(Perl_pp_i_lt),
+ MEMBER_TO_FPTR(Perl_pp_gt),
+ MEMBER_TO_FPTR(Perl_pp_i_gt),
+ MEMBER_TO_FPTR(Perl_pp_le),
+ MEMBER_TO_FPTR(Perl_pp_i_le),
+ MEMBER_TO_FPTR(Perl_pp_ge),
+ MEMBER_TO_FPTR(Perl_pp_i_ge),
+ MEMBER_TO_FPTR(Perl_pp_eq),
+ MEMBER_TO_FPTR(Perl_pp_i_eq),
+ MEMBER_TO_FPTR(Perl_pp_ne),
+ MEMBER_TO_FPTR(Perl_pp_i_ne),
+ MEMBER_TO_FPTR(Perl_pp_ncmp),
+ MEMBER_TO_FPTR(Perl_pp_i_ncmp),
+ MEMBER_TO_FPTR(Perl_pp_slt),
+ MEMBER_TO_FPTR(Perl_pp_sgt),
+ MEMBER_TO_FPTR(Perl_pp_sle),
+ MEMBER_TO_FPTR(Perl_pp_sge),
+ MEMBER_TO_FPTR(Perl_pp_seq),
+ MEMBER_TO_FPTR(Perl_pp_sne),
+ MEMBER_TO_FPTR(Perl_pp_scmp),
+ MEMBER_TO_FPTR(Perl_pp_bit_and),
+ MEMBER_TO_FPTR(Perl_pp_bit_xor),
+ MEMBER_TO_FPTR(Perl_pp_bit_or),
+ MEMBER_TO_FPTR(Perl_pp_negate),
+ MEMBER_TO_FPTR(Perl_pp_i_negate),
+ MEMBER_TO_FPTR(Perl_pp_not),
+ MEMBER_TO_FPTR(Perl_pp_complement),
+ MEMBER_TO_FPTR(Perl_pp_atan2),
+ MEMBER_TO_FPTR(Perl_pp_sin),
+ MEMBER_TO_FPTR(Perl_pp_cos),
+ MEMBER_TO_FPTR(Perl_pp_rand),
+ MEMBER_TO_FPTR(Perl_pp_srand),
+ MEMBER_TO_FPTR(Perl_pp_exp),
+ MEMBER_TO_FPTR(Perl_pp_log),
+ MEMBER_TO_FPTR(Perl_pp_sqrt),
+ MEMBER_TO_FPTR(Perl_pp_int),
+ MEMBER_TO_FPTR(Perl_pp_hex),
+ MEMBER_TO_FPTR(Perl_pp_oct),
+ MEMBER_TO_FPTR(Perl_pp_abs),
+ MEMBER_TO_FPTR(Perl_pp_length),
+ MEMBER_TO_FPTR(Perl_pp_substr),
+ MEMBER_TO_FPTR(Perl_pp_vec),
+ MEMBER_TO_FPTR(Perl_pp_index),
+ MEMBER_TO_FPTR(Perl_pp_rindex),
+ MEMBER_TO_FPTR(Perl_pp_sprintf),
+ MEMBER_TO_FPTR(Perl_pp_formline),
+ MEMBER_TO_FPTR(Perl_pp_ord),
+ MEMBER_TO_FPTR(Perl_pp_chr),
+ MEMBER_TO_FPTR(Perl_pp_crypt),
+ MEMBER_TO_FPTR(Perl_pp_ucfirst),
+ MEMBER_TO_FPTR(Perl_pp_lcfirst),
+ MEMBER_TO_FPTR(Perl_pp_uc),
+ MEMBER_TO_FPTR(Perl_pp_lc),
+ MEMBER_TO_FPTR(Perl_pp_quotemeta),
+ MEMBER_TO_FPTR(Perl_pp_rv2av),
+ MEMBER_TO_FPTR(Perl_pp_aelemfast),
+ MEMBER_TO_FPTR(Perl_pp_aelem),
+ MEMBER_TO_FPTR(Perl_pp_aslice),
+ MEMBER_TO_FPTR(Perl_pp_each),
+ MEMBER_TO_FPTR(Perl_pp_values),
+ MEMBER_TO_FPTR(Perl_pp_keys),
+ MEMBER_TO_FPTR(Perl_pp_delete),
+ MEMBER_TO_FPTR(Perl_pp_exists),
+ MEMBER_TO_FPTR(Perl_pp_rv2hv),
+ MEMBER_TO_FPTR(Perl_pp_helem),
+ MEMBER_TO_FPTR(Perl_pp_hslice),
+ MEMBER_TO_FPTR(Perl_pp_unpack),
+ MEMBER_TO_FPTR(Perl_pp_pack),
+ MEMBER_TO_FPTR(Perl_pp_split),
+ MEMBER_TO_FPTR(Perl_pp_join),
+ MEMBER_TO_FPTR(Perl_pp_list),
+ MEMBER_TO_FPTR(Perl_pp_lslice),
+ MEMBER_TO_FPTR(Perl_pp_anonlist),
+ MEMBER_TO_FPTR(Perl_pp_anonhash),
+ MEMBER_TO_FPTR(Perl_pp_splice),
+ MEMBER_TO_FPTR(Perl_pp_push),
+ MEMBER_TO_FPTR(Perl_pp_pop),
+ MEMBER_TO_FPTR(Perl_pp_shift),
+ MEMBER_TO_FPTR(Perl_pp_unshift),
+ MEMBER_TO_FPTR(Perl_pp_sort),
+ MEMBER_TO_FPTR(Perl_pp_reverse),
+ MEMBER_TO_FPTR(Perl_pp_grepstart),
+ MEMBER_TO_FPTR(Perl_pp_grepwhile),
+ MEMBER_TO_FPTR(Perl_pp_mapstart),
+ MEMBER_TO_FPTR(Perl_pp_mapwhile),
+ MEMBER_TO_FPTR(Perl_pp_range),
+ MEMBER_TO_FPTR(Perl_pp_flip),
+ MEMBER_TO_FPTR(Perl_pp_flop),
+ MEMBER_TO_FPTR(Perl_pp_and),
+ MEMBER_TO_FPTR(Perl_pp_or),
+ MEMBER_TO_FPTR(Perl_pp_xor),
+ MEMBER_TO_FPTR(Perl_pp_cond_expr),
+ MEMBER_TO_FPTR(Perl_pp_andassign),
+ MEMBER_TO_FPTR(Perl_pp_orassign),
+ MEMBER_TO_FPTR(Perl_pp_method),
+ MEMBER_TO_FPTR(Perl_pp_entersub),
+ MEMBER_TO_FPTR(Perl_pp_leavesub),
+ MEMBER_TO_FPTR(Perl_pp_leavesublv),
+ MEMBER_TO_FPTR(Perl_pp_caller),
+ MEMBER_TO_FPTR(Perl_pp_warn),
+ MEMBER_TO_FPTR(Perl_pp_die),
+ MEMBER_TO_FPTR(Perl_pp_reset),
+ MEMBER_TO_FPTR(Perl_pp_lineseq),
+ MEMBER_TO_FPTR(Perl_pp_nextstate),
+ MEMBER_TO_FPTR(Perl_pp_dbstate),
+ MEMBER_TO_FPTR(Perl_pp_unstack),
+ MEMBER_TO_FPTR(Perl_pp_enter),
+ MEMBER_TO_FPTR(Perl_pp_leave),
+ MEMBER_TO_FPTR(Perl_pp_scope),
+ MEMBER_TO_FPTR(Perl_pp_enteriter),
+ MEMBER_TO_FPTR(Perl_pp_iter),
+ MEMBER_TO_FPTR(Perl_pp_enterloop),
+ MEMBER_TO_FPTR(Perl_pp_leaveloop),
+ MEMBER_TO_FPTR(Perl_pp_return),
+ MEMBER_TO_FPTR(Perl_pp_last),
+ MEMBER_TO_FPTR(Perl_pp_next),
+ MEMBER_TO_FPTR(Perl_pp_redo),
+ MEMBER_TO_FPTR(Perl_pp_dump),
+ MEMBER_TO_FPTR(Perl_pp_goto),
+ MEMBER_TO_FPTR(Perl_pp_exit),
+ MEMBER_TO_FPTR(Perl_pp_open),
+ MEMBER_TO_FPTR(Perl_pp_close),
+ MEMBER_TO_FPTR(Perl_pp_pipe_op),
+ MEMBER_TO_FPTR(Perl_pp_fileno),
+ MEMBER_TO_FPTR(Perl_pp_umask),
+ MEMBER_TO_FPTR(Perl_pp_binmode),
+ MEMBER_TO_FPTR(Perl_pp_tie),
+ MEMBER_TO_FPTR(Perl_pp_untie),
+ MEMBER_TO_FPTR(Perl_pp_tied),
+ MEMBER_TO_FPTR(Perl_pp_dbmopen),
+ MEMBER_TO_FPTR(Perl_pp_dbmclose),
+ MEMBER_TO_FPTR(Perl_pp_sselect),
+ MEMBER_TO_FPTR(Perl_pp_select),
+ MEMBER_TO_FPTR(Perl_pp_getc),
+ MEMBER_TO_FPTR(Perl_pp_read),
+ MEMBER_TO_FPTR(Perl_pp_enterwrite),
+ MEMBER_TO_FPTR(Perl_pp_leavewrite),
+ MEMBER_TO_FPTR(Perl_pp_prtf),
+ MEMBER_TO_FPTR(Perl_pp_print),
+ MEMBER_TO_FPTR(Perl_pp_sysopen),
+ MEMBER_TO_FPTR(Perl_pp_sysseek),
+ MEMBER_TO_FPTR(Perl_pp_sysread),
+ MEMBER_TO_FPTR(Perl_pp_syswrite),
+ MEMBER_TO_FPTR(Perl_pp_send),
+ MEMBER_TO_FPTR(Perl_pp_recv),
+ MEMBER_TO_FPTR(Perl_pp_eof),
+ MEMBER_TO_FPTR(Perl_pp_tell),
+ MEMBER_TO_FPTR(Perl_pp_seek),
+ MEMBER_TO_FPTR(Perl_pp_truncate),
+ MEMBER_TO_FPTR(Perl_pp_fcntl),
+ MEMBER_TO_FPTR(Perl_pp_ioctl),
+ MEMBER_TO_FPTR(Perl_pp_flock),
+ MEMBER_TO_FPTR(Perl_pp_socket),
+ MEMBER_TO_FPTR(Perl_pp_sockpair),
+ MEMBER_TO_FPTR(Perl_pp_bind),
+ MEMBER_TO_FPTR(Perl_pp_connect),
+ MEMBER_TO_FPTR(Perl_pp_listen),
+ MEMBER_TO_FPTR(Perl_pp_accept),
+ MEMBER_TO_FPTR(Perl_pp_shutdown),
+ MEMBER_TO_FPTR(Perl_pp_gsockopt),
+ MEMBER_TO_FPTR(Perl_pp_ssockopt),
+ MEMBER_TO_FPTR(Perl_pp_getsockname),
+ MEMBER_TO_FPTR(Perl_pp_getpeername),
+ MEMBER_TO_FPTR(Perl_pp_lstat),
+ MEMBER_TO_FPTR(Perl_pp_stat),
+ MEMBER_TO_FPTR(Perl_pp_ftrread),
+ MEMBER_TO_FPTR(Perl_pp_ftrwrite),
+ MEMBER_TO_FPTR(Perl_pp_ftrexec),
+ MEMBER_TO_FPTR(Perl_pp_fteread),
+ MEMBER_TO_FPTR(Perl_pp_ftewrite),
+ MEMBER_TO_FPTR(Perl_pp_fteexec),
+ MEMBER_TO_FPTR(Perl_pp_ftis),
+ MEMBER_TO_FPTR(Perl_pp_fteowned),
+ MEMBER_TO_FPTR(Perl_pp_ftrowned),
+ MEMBER_TO_FPTR(Perl_pp_ftzero),
+ MEMBER_TO_FPTR(Perl_pp_ftsize),
+ MEMBER_TO_FPTR(Perl_pp_ftmtime),
+ MEMBER_TO_FPTR(Perl_pp_ftatime),
+ MEMBER_TO_FPTR(Perl_pp_ftctime),
+ MEMBER_TO_FPTR(Perl_pp_ftsock),
+ MEMBER_TO_FPTR(Perl_pp_ftchr),
+ MEMBER_TO_FPTR(Perl_pp_ftblk),
+ MEMBER_TO_FPTR(Perl_pp_ftfile),
+ MEMBER_TO_FPTR(Perl_pp_ftdir),
+ MEMBER_TO_FPTR(Perl_pp_ftpipe),
+ MEMBER_TO_FPTR(Perl_pp_ftlink),
+ MEMBER_TO_FPTR(Perl_pp_ftsuid),
+ MEMBER_TO_FPTR(Perl_pp_ftsgid),
+ MEMBER_TO_FPTR(Perl_pp_ftsvtx),
+ MEMBER_TO_FPTR(Perl_pp_fttty),
+ MEMBER_TO_FPTR(Perl_pp_fttext),
+ MEMBER_TO_FPTR(Perl_pp_ftbinary),
+ MEMBER_TO_FPTR(Perl_pp_chdir),
+ MEMBER_TO_FPTR(Perl_pp_chown),
+ MEMBER_TO_FPTR(Perl_pp_chroot),
+ MEMBER_TO_FPTR(Perl_pp_unlink),
+ MEMBER_TO_FPTR(Perl_pp_chmod),
+ MEMBER_TO_FPTR(Perl_pp_utime),
+ MEMBER_TO_FPTR(Perl_pp_rename),
+ MEMBER_TO_FPTR(Perl_pp_link),
+ MEMBER_TO_FPTR(Perl_pp_symlink),
+ MEMBER_TO_FPTR(Perl_pp_readlink),
+ MEMBER_TO_FPTR(Perl_pp_mkdir),
+ MEMBER_TO_FPTR(Perl_pp_rmdir),
+ MEMBER_TO_FPTR(Perl_pp_open_dir),
+ MEMBER_TO_FPTR(Perl_pp_readdir),
+ MEMBER_TO_FPTR(Perl_pp_telldir),
+ MEMBER_TO_FPTR(Perl_pp_seekdir),
+ MEMBER_TO_FPTR(Perl_pp_rewinddir),
+ MEMBER_TO_FPTR(Perl_pp_closedir),
+ MEMBER_TO_FPTR(Perl_pp_fork),
+ MEMBER_TO_FPTR(Perl_pp_wait),
+ MEMBER_TO_FPTR(Perl_pp_waitpid),
+ MEMBER_TO_FPTR(Perl_pp_system),
+ MEMBER_TO_FPTR(Perl_pp_exec),
+ MEMBER_TO_FPTR(Perl_pp_kill),
+ MEMBER_TO_FPTR(Perl_pp_getppid),
+ MEMBER_TO_FPTR(Perl_pp_getpgrp),
+ MEMBER_TO_FPTR(Perl_pp_setpgrp),
+ MEMBER_TO_FPTR(Perl_pp_getpriority),
+ MEMBER_TO_FPTR(Perl_pp_setpriority),
+ MEMBER_TO_FPTR(Perl_pp_time),
+ MEMBER_TO_FPTR(Perl_pp_tms),
+ MEMBER_TO_FPTR(Perl_pp_localtime),
+ MEMBER_TO_FPTR(Perl_pp_gmtime),
+ MEMBER_TO_FPTR(Perl_pp_alarm),
+ MEMBER_TO_FPTR(Perl_pp_sleep),
+ MEMBER_TO_FPTR(Perl_pp_shmget),
+ MEMBER_TO_FPTR(Perl_pp_shmctl),
+ MEMBER_TO_FPTR(Perl_pp_shmread),
+ MEMBER_TO_FPTR(Perl_pp_shmwrite),
+ MEMBER_TO_FPTR(Perl_pp_msgget),
+ MEMBER_TO_FPTR(Perl_pp_msgctl),
+ MEMBER_TO_FPTR(Perl_pp_msgsnd),
+ MEMBER_TO_FPTR(Perl_pp_msgrcv),
+ MEMBER_TO_FPTR(Perl_pp_semget),
+ MEMBER_TO_FPTR(Perl_pp_semctl),
+ MEMBER_TO_FPTR(Perl_pp_semop),
+ MEMBER_TO_FPTR(Perl_pp_require),
+ MEMBER_TO_FPTR(Perl_pp_dofile),
+ MEMBER_TO_FPTR(Perl_pp_entereval),
+ MEMBER_TO_FPTR(Perl_pp_leaveeval),
+ MEMBER_TO_FPTR(Perl_pp_entertry),
+ MEMBER_TO_FPTR(Perl_pp_leavetry),
+ MEMBER_TO_FPTR(Perl_pp_ghbyname),
+ MEMBER_TO_FPTR(Perl_pp_ghbyaddr),
+ MEMBER_TO_FPTR(Perl_pp_ghostent),
+ MEMBER_TO_FPTR(Perl_pp_gnbyname),
+ MEMBER_TO_FPTR(Perl_pp_gnbyaddr),
+ MEMBER_TO_FPTR(Perl_pp_gnetent),
+ MEMBER_TO_FPTR(Perl_pp_gpbyname),
+ MEMBER_TO_FPTR(Perl_pp_gpbynumber),
+ MEMBER_TO_FPTR(Perl_pp_gprotoent),
+ MEMBER_TO_FPTR(Perl_pp_gsbyname),
+ MEMBER_TO_FPTR(Perl_pp_gsbyport),
+ MEMBER_TO_FPTR(Perl_pp_gservent),
+ MEMBER_TO_FPTR(Perl_pp_shostent),
+ MEMBER_TO_FPTR(Perl_pp_snetent),
+ MEMBER_TO_FPTR(Perl_pp_sprotoent),
+ MEMBER_TO_FPTR(Perl_pp_sservent),
+ MEMBER_TO_FPTR(Perl_pp_ehostent),
+ MEMBER_TO_FPTR(Perl_pp_enetent),
+ MEMBER_TO_FPTR(Perl_pp_eprotoent),
+ MEMBER_TO_FPTR(Perl_pp_eservent),
+ MEMBER_TO_FPTR(Perl_pp_gpwnam),
+ MEMBER_TO_FPTR(Perl_pp_gpwuid),
+ MEMBER_TO_FPTR(Perl_pp_gpwent),
+ MEMBER_TO_FPTR(Perl_pp_spwent),
+ MEMBER_TO_FPTR(Perl_pp_epwent),
+ MEMBER_TO_FPTR(Perl_pp_ggrnam),
+ MEMBER_TO_FPTR(Perl_pp_ggrgid),
+ MEMBER_TO_FPTR(Perl_pp_ggrent),
+ MEMBER_TO_FPTR(Perl_pp_sgrent),
+ MEMBER_TO_FPTR(Perl_pp_egrent),
+ MEMBER_TO_FPTR(Perl_pp_getlogin),
+ MEMBER_TO_FPTR(Perl_pp_syscall),
+ MEMBER_TO_FPTR(Perl_pp_lock),
+ MEMBER_TO_FPTR(Perl_pp_threadsv),
+ MEMBER_TO_FPTR(Perl_pp_setstate),
+ MEMBER_TO_FPTR(Perl_pp_method_named),
};
-#endif /* PERL_OBJECT */
#endif
#ifndef DOINIT
-EXT OP * (CPERLscope(*check)[]) _((OP *op));
+EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op);
#else
-#ifndef PERL_OBJECT
-EXT OP * (CPERLscope(*check)[]) _((OP *op)) = {
- ck_null, /* null */
- ck_null, /* stub */
- ck_fun, /* scalar */
- ck_null, /* pushmark */
- ck_null, /* wantarray */
- ck_svconst, /* const */
- ck_null, /* gvsv */
- ck_null, /* gv */
- ck_null, /* gelem */
- ck_null, /* padsv */
- ck_null, /* padav */
- ck_null, /* padhv */
- ck_null, /* padany */
- ck_null, /* pushre */
- ck_rvconst, /* rv2gv */
- ck_rvconst, /* rv2sv */
- ck_null, /* av2arylen */
- ck_rvconst, /* rv2cv */
- ck_anoncode, /* anoncode */
- ck_null, /* prototype */
- ck_spair, /* refgen */
- ck_null, /* srefgen */
- ck_fun, /* ref */
- ck_fun, /* bless */
- ck_null, /* backtick */
- ck_glob, /* glob */
- ck_null, /* readline */
- ck_null, /* rcatline */
- ck_fun, /* regcmaybe */
- ck_fun, /* regcreset */
- ck_null, /* regcomp */
- ck_match, /* match */
- ck_match, /* qr */
- ck_null, /* subst */
- ck_null, /* substcont */
- ck_null, /* trans */
- ck_null, /* sassign */
- ck_null, /* aassign */
- ck_spair, /* chop */
- ck_null, /* schop */
- ck_spair, /* chomp */
- ck_null, /* schomp */
- ck_rfun, /* defined */
- ck_lfun, /* undef */
- ck_fun, /* study */
- ck_lfun, /* pos */
- ck_lfun, /* preinc */
- ck_lfun, /* i_preinc */
- ck_lfun, /* predec */
- ck_lfun, /* i_predec */
- ck_lfun, /* postinc */
- ck_lfun, /* i_postinc */
- ck_lfun, /* postdec */
- ck_lfun, /* i_postdec */
- ck_null, /* pow */
- ck_null, /* multiply */
- ck_null, /* i_multiply */
- ck_null, /* divide */
- ck_null, /* i_divide */
- ck_null, /* modulo */
- ck_null, /* i_modulo */
- ck_repeat, /* repeat */
- ck_null, /* add */
- ck_null, /* i_add */
- ck_null, /* subtract */
- ck_null, /* i_subtract */
- ck_concat, /* concat */
- ck_fun, /* stringify */
- ck_bitop, /* left_shift */
- ck_bitop, /* right_shift */
- ck_null, /* lt */
- ck_null, /* i_lt */
- ck_null, /* gt */
- ck_null, /* i_gt */
- ck_null, /* le */
- ck_null, /* i_le */
- ck_null, /* ge */
- ck_null, /* i_ge */
- ck_null, /* eq */
- ck_null, /* i_eq */
- ck_null, /* ne */
- ck_null, /* i_ne */
- ck_null, /* ncmp */
- ck_null, /* i_ncmp */
- ck_scmp, /* slt */
- ck_scmp, /* sgt */
- ck_scmp, /* sle */
- ck_scmp, /* sge */
- ck_null, /* seq */
- ck_null, /* sne */
- ck_scmp, /* scmp */
- ck_bitop, /* bit_and */
- ck_bitop, /* bit_xor */
- ck_bitop, /* bit_or */
- ck_null, /* negate */
- ck_null, /* i_negate */
- ck_null, /* not */
- ck_bitop, /* complement */
- ck_fun, /* atan2 */
- ck_fun, /* sin */
- ck_fun, /* cos */
- ck_fun, /* rand */
- ck_fun, /* srand */
- ck_fun, /* exp */
- ck_fun, /* log */
- ck_fun, /* sqrt */
- ck_fun, /* int */
- ck_fun, /* hex */
- ck_fun, /* oct */
- ck_fun, /* abs */
- ck_lengthconst, /* length */
- ck_fun, /* substr */
- ck_fun, /* vec */
- ck_index, /* index */
- ck_index, /* rindex */
- ck_fun_locale, /* sprintf */
- ck_fun, /* formline */
- ck_fun, /* ord */
- ck_fun, /* chr */
- ck_fun, /* crypt */
- ck_fun_locale, /* ucfirst */
- ck_fun_locale, /* lcfirst */
- ck_fun_locale, /* uc */
- ck_fun_locale, /* lc */
- ck_fun, /* quotemeta */
- ck_rvconst, /* rv2av */
- ck_null, /* aelemfast */
- ck_null, /* aelem */
- ck_null, /* aslice */
- ck_fun, /* each */
- ck_fun, /* values */
- ck_fun, /* keys */
- ck_delete, /* delete */
- ck_exists, /* exists */
- ck_rvconst, /* rv2hv */
- ck_null, /* helem */
- ck_null, /* hslice */
- ck_fun, /* unpack */
- ck_fun, /* pack */
- ck_split, /* split */
- ck_fun, /* join */
- ck_null, /* list */
- ck_null, /* lslice */
- ck_fun, /* anonlist */
- ck_fun, /* anonhash */
- ck_fun, /* splice */
- ck_fun, /* push */
- ck_shift, /* pop */
- ck_shift, /* shift */
- ck_fun, /* unshift */
- ck_sort, /* sort */
- ck_fun, /* reverse */
- ck_grep, /* grepstart */
- ck_null, /* grepwhile */
- ck_grep, /* mapstart */
- ck_null, /* mapwhile */
- ck_null, /* range */
- ck_null, /* flip */
- ck_null, /* flop */
- ck_null, /* and */
- ck_null, /* or */
- ck_null, /* xor */
- ck_null, /* cond_expr */
- ck_null, /* andassign */
- ck_null, /* orassign */
- ck_null, /* method */
- ck_subr, /* entersub */
- ck_null, /* leavesub */
- ck_fun, /* caller */
- ck_fun, /* warn */
- ck_fun, /* die */
- ck_fun, /* reset */
- ck_null, /* lineseq */
- ck_null, /* nextstate */
- ck_null, /* dbstate */
- ck_null, /* unstack */
- ck_null, /* enter */
- ck_null, /* leave */
- ck_null, /* scope */
- ck_null, /* enteriter */
- ck_null, /* iter */
- ck_null, /* enterloop */
- ck_null, /* leaveloop */
- ck_null, /* return */
- ck_null, /* last */
- ck_null, /* next */
- ck_null, /* redo */
- ck_null, /* dump */
- ck_null, /* goto */
- ck_fun, /* exit */
- ck_fun, /* open */
- ck_fun, /* close */
- ck_fun, /* pipe_op */
- ck_fun, /* fileno */
- ck_fun, /* umask */
- ck_fun, /* binmode */
- ck_fun, /* tie */
- ck_fun, /* untie */
- ck_fun, /* tied */
- ck_fun, /* dbmopen */
- ck_fun, /* dbmclose */
- ck_select, /* sselect */
- ck_select, /* select */
- ck_eof, /* getc */
- ck_fun, /* read */
- ck_fun, /* enterwrite */
- ck_null, /* leavewrite */
- ck_listiob, /* prtf */
- ck_listiob, /* print */
- ck_fun, /* sysopen */
- ck_fun, /* sysseek */
- ck_fun, /* sysread */
- ck_fun, /* syswrite */
- ck_fun, /* send */
- ck_fun, /* recv */
- ck_eof, /* eof */
- ck_fun, /* tell */
- ck_fun, /* seek */
- ck_trunc, /* truncate */
- ck_fun, /* fcntl */
- ck_fun, /* ioctl */
- ck_fun, /* flock */
- ck_fun, /* socket */
- ck_fun, /* sockpair */
- ck_fun, /* bind */
- ck_fun, /* connect */
- ck_fun, /* listen */
- ck_fun, /* accept */
- ck_fun, /* shutdown */
- ck_fun, /* gsockopt */
- ck_fun, /* ssockopt */
- ck_fun, /* getsockname */
- ck_fun, /* getpeername */
- ck_ftst, /* lstat */
- ck_ftst, /* stat */
- ck_ftst, /* ftrread */
- ck_ftst, /* ftrwrite */
- ck_ftst, /* ftrexec */
- ck_ftst, /* fteread */
- ck_ftst, /* ftewrite */
- ck_ftst, /* fteexec */
- ck_ftst, /* ftis */
- ck_ftst, /* fteowned */
- ck_ftst, /* ftrowned */
- ck_ftst, /* ftzero */
- ck_ftst, /* ftsize */
- ck_ftst, /* ftmtime */
- ck_ftst, /* ftatime */
- ck_ftst, /* ftctime */
- ck_ftst, /* ftsock */
- ck_ftst, /* ftchr */
- ck_ftst, /* ftblk */
- ck_ftst, /* ftfile */
- ck_ftst, /* ftdir */
- ck_ftst, /* ftpipe */
- ck_ftst, /* ftlink */
- ck_ftst, /* ftsuid */
- ck_ftst, /* ftsgid */
- ck_ftst, /* ftsvtx */
- ck_ftst, /* fttty */
- ck_ftst, /* fttext */
- ck_ftst, /* ftbinary */
- ck_fun, /* chdir */
- ck_fun, /* chown */
- ck_fun, /* chroot */
- ck_fun, /* unlink */
- ck_fun, /* chmod */
- ck_fun, /* utime */
- ck_fun, /* rename */
- ck_fun, /* link */
- ck_fun, /* symlink */
- ck_fun, /* readlink */
- ck_fun, /* mkdir */
- ck_fun, /* rmdir */
- ck_fun, /* open_dir */
- ck_fun, /* readdir */
- ck_fun, /* telldir */
- ck_fun, /* seekdir */
- ck_fun, /* rewinddir */
- ck_fun, /* closedir */
- ck_null, /* fork */
- ck_null, /* wait */
- ck_fun, /* waitpid */
- ck_exec, /* system */
- ck_exec, /* exec */
- ck_fun, /* kill */
- ck_null, /* getppid */
- ck_fun, /* getpgrp */
- ck_fun, /* setpgrp */
- ck_fun, /* getpriority */
- ck_fun, /* setpriority */
- ck_null, /* time */
- ck_null, /* tms */
- ck_fun, /* localtime */
- ck_fun, /* gmtime */
- ck_fun, /* alarm */
- ck_fun, /* sleep */
- ck_fun, /* shmget */
- ck_fun, /* shmctl */
- ck_fun, /* shmread */
- ck_fun, /* shmwrite */
- ck_fun, /* msgget */
- ck_fun, /* msgctl */
- ck_fun, /* msgsnd */
- ck_fun, /* msgrcv */
- ck_fun, /* semget */
- ck_fun, /* semctl */
- ck_fun, /* semop */
- ck_require, /* require */
- ck_fun, /* dofile */
- ck_eval, /* entereval */
- ck_null, /* leaveeval */
- ck_null, /* entertry */
- ck_null, /* leavetry */
- ck_fun, /* ghbyname */
- ck_fun, /* ghbyaddr */
- ck_null, /* ghostent */
- ck_fun, /* gnbyname */
- ck_fun, /* gnbyaddr */
- ck_null, /* gnetent */
- ck_fun, /* gpbyname */
- ck_fun, /* gpbynumber */
- ck_null, /* gprotoent */
- ck_fun, /* gsbyname */
- ck_fun, /* gsbyport */
- ck_null, /* gservent */
- ck_fun, /* shostent */
- ck_fun, /* snetent */
- ck_fun, /* sprotoent */
- ck_fun, /* sservent */
- ck_null, /* ehostent */
- ck_null, /* enetent */
- ck_null, /* eprotoent */
- ck_null, /* eservent */
- ck_fun, /* gpwnam */
- ck_fun, /* gpwuid */
- ck_null, /* gpwent */
- ck_null, /* spwent */
- ck_null, /* epwent */
- ck_fun, /* ggrnam */
- ck_fun, /* ggrgid */
- ck_null, /* ggrent */
- ck_null, /* sgrent */
- ck_null, /* egrent */
- ck_null, /* getlogin */
- ck_fun, /* syscall */
- ck_rfun, /* lock */
- ck_null, /* threadsv */
+EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op) = {
+ MEMBER_TO_FPTR(Perl_ck_null), /* null */
+ MEMBER_TO_FPTR(Perl_ck_null), /* stub */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* scalar */
+ MEMBER_TO_FPTR(Perl_ck_null), /* pushmark */
+ MEMBER_TO_FPTR(Perl_ck_null), /* wantarray */
+ MEMBER_TO_FPTR(Perl_ck_svconst), /* const */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gvsv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gelem */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padsv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padav */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padhv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padany */
+ MEMBER_TO_FPTR(Perl_ck_null), /* pushre */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2gv */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2sv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* av2arylen */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2cv */
+ MEMBER_TO_FPTR(Perl_ck_anoncode), /* anoncode */
+ MEMBER_TO_FPTR(Perl_ck_null), /* prototype */
+ MEMBER_TO_FPTR(Perl_ck_spair), /* refgen */
+ MEMBER_TO_FPTR(Perl_ck_null), /* srefgen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ref */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* bless */
+ MEMBER_TO_FPTR(Perl_ck_open), /* backtick */
+ MEMBER_TO_FPTR(Perl_ck_glob), /* glob */
+ MEMBER_TO_FPTR(Perl_ck_null), /* readline */
+ MEMBER_TO_FPTR(Perl_ck_null), /* rcatline */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* regcmaybe */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* regcreset */
+ MEMBER_TO_FPTR(Perl_ck_null), /* regcomp */
+ MEMBER_TO_FPTR(Perl_ck_match), /* match */
+ MEMBER_TO_FPTR(Perl_ck_match), /* qr */
+ MEMBER_TO_FPTR(Perl_ck_null), /* subst */
+ MEMBER_TO_FPTR(Perl_ck_null), /* substcont */
+ MEMBER_TO_FPTR(Perl_ck_null), /* trans */
+ MEMBER_TO_FPTR(Perl_ck_sassign), /* sassign */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aassign */
+ MEMBER_TO_FPTR(Perl_ck_spair), /* chop */
+ MEMBER_TO_FPTR(Perl_ck_null), /* schop */
+ MEMBER_TO_FPTR(Perl_ck_spair), /* chomp */
+ MEMBER_TO_FPTR(Perl_ck_null), /* schomp */
+ MEMBER_TO_FPTR(Perl_ck_defined), /* defined */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* undef */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* study */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* pos */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* preinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_preinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* predec */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_predec */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* postinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_postinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* postdec */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_postdec */
+ MEMBER_TO_FPTR(Perl_ck_null), /* pow */
+ MEMBER_TO_FPTR(Perl_ck_null), /* multiply */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_multiply */
+ MEMBER_TO_FPTR(Perl_ck_null), /* divide */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_divide */
+ MEMBER_TO_FPTR(Perl_ck_null), /* modulo */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_modulo */
+ MEMBER_TO_FPTR(Perl_ck_repeat), /* repeat */
+ MEMBER_TO_FPTR(Perl_ck_null), /* add */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_add */
+ MEMBER_TO_FPTR(Perl_ck_null), /* subtract */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_subtract */
+ MEMBER_TO_FPTR(Perl_ck_concat), /* concat */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* stringify */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* left_shift */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* right_shift */
+ MEMBER_TO_FPTR(Perl_ck_null), /* lt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_lt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_gt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* le */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_le */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ge */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_ge */
+ MEMBER_TO_FPTR(Perl_ck_null), /* eq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_eq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ne */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_ne */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ncmp */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_ncmp */
+ MEMBER_TO_FPTR(Perl_ck_scmp), /* slt */
+ MEMBER_TO_FPTR(Perl_ck_scmp), /* sgt */
+ MEMBER_TO_FPTR(Perl_ck_scmp), /* sle */
+ MEMBER_TO_FPTR(Perl_ck_scmp), /* sge */
+ MEMBER_TO_FPTR(Perl_ck_null), /* seq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* sne */
+ MEMBER_TO_FPTR(Perl_ck_scmp), /* scmp */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* bit_and */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* bit_xor */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* bit_or */
+ MEMBER_TO_FPTR(Perl_ck_null), /* negate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_negate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* not */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* complement */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* atan2 */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sin */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* cos */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rand */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* srand */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* exp */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* log */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sqrt */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* int */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* hex */
+ 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_fun), /* vec */
+ MEMBER_TO_FPTR(Perl_ck_index), /* index */
+ MEMBER_TO_FPTR(Perl_ck_index), /* rindex */
+ MEMBER_TO_FPTR(Perl_ck_fun_locale), /* sprintf */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* formline */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ord */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chr */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* crypt */
+ MEMBER_TO_FPTR(Perl_ck_fun_locale), /* ucfirst */
+ MEMBER_TO_FPTR(Perl_ck_fun_locale), /* lcfirst */
+ MEMBER_TO_FPTR(Perl_ck_fun_locale), /* uc */
+ MEMBER_TO_FPTR(Perl_ck_fun_locale), /* lc */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* quotemeta */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2av */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aelemfast */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aelem */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aslice */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* each */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* values */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* keys */
+ MEMBER_TO_FPTR(Perl_ck_delete), /* delete */
+ MEMBER_TO_FPTR(Perl_ck_exists), /* exists */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2hv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* helem */
+ MEMBER_TO_FPTR(Perl_ck_null), /* hslice */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* unpack */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* pack */
+ MEMBER_TO_FPTR(Perl_ck_split), /* split */
+ MEMBER_TO_FPTR(Perl_ck_join), /* join */
+ MEMBER_TO_FPTR(Perl_ck_null), /* list */
+ MEMBER_TO_FPTR(Perl_ck_null), /* lslice */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* anonlist */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* anonhash */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* splice */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* push */
+ MEMBER_TO_FPTR(Perl_ck_shift), /* pop */
+ MEMBER_TO_FPTR(Perl_ck_shift), /* shift */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* unshift */
+ MEMBER_TO_FPTR(Perl_ck_sort), /* sort */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* reverse */
+ MEMBER_TO_FPTR(Perl_ck_grep), /* grepstart */
+ MEMBER_TO_FPTR(Perl_ck_null), /* grepwhile */
+ MEMBER_TO_FPTR(Perl_ck_grep), /* mapstart */
+ MEMBER_TO_FPTR(Perl_ck_null), /* mapwhile */
+ MEMBER_TO_FPTR(Perl_ck_null), /* range */
+ MEMBER_TO_FPTR(Perl_ck_null), /* flip */
+ MEMBER_TO_FPTR(Perl_ck_null), /* flop */
+ MEMBER_TO_FPTR(Perl_ck_null), /* and */
+ MEMBER_TO_FPTR(Perl_ck_null), /* or */
+ MEMBER_TO_FPTR(Perl_ck_null), /* xor */
+ MEMBER_TO_FPTR(Perl_ck_null), /* cond_expr */
+ MEMBER_TO_FPTR(Perl_ck_null), /* andassign */
+ MEMBER_TO_FPTR(Perl_ck_null), /* orassign */
+ MEMBER_TO_FPTR(Perl_ck_method), /* method */
+ MEMBER_TO_FPTR(Perl_ck_subr), /* entersub */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavesub */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavesublv */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* caller */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* warn */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* die */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* reset */
+ MEMBER_TO_FPTR(Perl_ck_null), /* lineseq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* nextstate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* dbstate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* unstack */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enter */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leave */
+ MEMBER_TO_FPTR(Perl_ck_null), /* scope */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enteriter */
+ MEMBER_TO_FPTR(Perl_ck_null), /* iter */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enterloop */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leaveloop */
+ MEMBER_TO_FPTR(Perl_ck_null), /* return */
+ MEMBER_TO_FPTR(Perl_ck_null), /* last */
+ MEMBER_TO_FPTR(Perl_ck_null), /* next */
+ MEMBER_TO_FPTR(Perl_ck_null), /* redo */
+ MEMBER_TO_FPTR(Perl_ck_null), /* dump */
+ MEMBER_TO_FPTR(Perl_ck_null), /* goto */
+ MEMBER_TO_FPTR(Perl_ck_exit), /* exit */
+ MEMBER_TO_FPTR(Perl_ck_open), /* open */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* close */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* pipe_op */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* fileno */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* umask */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* binmode */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* tie */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* untie */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* tied */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* dbmopen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* dbmclose */
+ MEMBER_TO_FPTR(Perl_ck_select), /* sselect */
+ MEMBER_TO_FPTR(Perl_ck_select), /* select */
+ MEMBER_TO_FPTR(Perl_ck_eof), /* getc */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* read */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* enterwrite */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavewrite */
+ MEMBER_TO_FPTR(Perl_ck_listiob), /* prtf */
+ MEMBER_TO_FPTR(Perl_ck_listiob), /* print */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sysopen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sysseek */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sysread */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* syswrite */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* send */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* recv */
+ MEMBER_TO_FPTR(Perl_ck_eof), /* eof */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* tell */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* seek */
+ MEMBER_TO_FPTR(Perl_ck_trunc), /* truncate */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* fcntl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ioctl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* flock */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* socket */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sockpair */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* bind */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* connect */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* listen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* accept */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shutdown */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gsockopt */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ssockopt */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getsockname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getpeername */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* lstat */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* stat */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrread */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrwrite */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrexec */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fteread */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftewrite */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fteexec */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftis */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fteowned */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrowned */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftzero */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsize */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftmtime */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftatime */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftctime */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsock */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftchr */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftblk */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftfile */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftdir */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftpipe */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftlink */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsuid */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsgid */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsvtx */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fttty */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fttext */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftbinary */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chown */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chroot */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* unlink */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chmod */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* utime */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rename */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* link */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* symlink */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* readlink */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* mkdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rmdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* open_dir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* readdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* telldir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* seekdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rewinddir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* closedir */
+ MEMBER_TO_FPTR(Perl_ck_null), /* fork */
+ MEMBER_TO_FPTR(Perl_ck_null), /* wait */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* waitpid */
+ MEMBER_TO_FPTR(Perl_ck_exec), /* system */
+ MEMBER_TO_FPTR(Perl_ck_exec), /* exec */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* kill */
+ MEMBER_TO_FPTR(Perl_ck_null), /* getppid */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getpgrp */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* setpgrp */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getpriority */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* setpriority */
+ MEMBER_TO_FPTR(Perl_ck_null), /* time */
+ MEMBER_TO_FPTR(Perl_ck_null), /* tms */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* localtime */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gmtime */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* alarm */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sleep */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmget */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmctl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmread */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmwrite */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgget */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgctl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgsnd */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgrcv */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* semget */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* semctl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* semop */
+ MEMBER_TO_FPTR(Perl_ck_require), /* require */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* dofile */
+ MEMBER_TO_FPTR(Perl_ck_eval), /* entereval */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leaveeval */
+ MEMBER_TO_FPTR(Perl_ck_null), /* entertry */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavetry */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ghbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ghbyaddr */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ghostent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gnbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gnbyaddr */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gnetent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpbynumber */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gprotoent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gsbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gsbyport */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gservent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shostent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* snetent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sprotoent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sservent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ehostent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enetent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* eprotoent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* eservent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpwnam */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpwuid */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gpwent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* spwent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* epwent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ggrnam */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ggrgid */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ggrent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* sgrent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* egrent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* getlogin */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* syscall */
+ MEMBER_TO_FPTR(Perl_ck_rfun), /* lock */
+ MEMBER_TO_FPTR(Perl_ck_null), /* threadsv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* setstate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* method_named */
};
-#endif /* PERL_OBJECT */
#endif
#ifndef DOINIT
-EXT U32 opargs[];
+EXT U32 PL_opargs[];
#else
-EXT U32 opargs[] = {
+EXT U32 PL_opargs[] = {
0x00000000, /* null */
0x00000000, /* stub */
- 0x00001c04, /* scalar */
+ 0x00003604, /* scalar */
0x00000004, /* pushmark */
0x00000014, /* wantarray */
- 0x00000704, /* const */
- 0x00000844, /* gvsv */
- 0x00000844, /* gv */
- 0x00011240, /* gelem */
+ 0x00000c04, /* const */
+ 0x00000c44, /* gvsv */
+ 0x00000c44, /* gv */
+ 0x00022440, /* gelem */
0x00000044, /* padsv */
0x00000040, /* padav */
0x00000040, /* padhv */
0x00000040, /* padany */
- 0x00000640, /* pushre */
- 0x00000144, /* rv2gv */
- 0x00000144, /* rv2sv */
- 0x00000114, /* av2arylen */
- 0x00000140, /* rv2cv */
- 0x00000700, /* anoncode */
- 0x00001c04, /* prototype */
- 0x00002101, /* refgen */
- 0x00001106, /* srefgen */
- 0x00009c8c, /* ref */
- 0x00091504, /* bless */
- 0x00000c08, /* backtick */
- 0x00099508, /* glob */
- 0x00000c08, /* readline */
- 0x00000c08, /* rcatline */
- 0x00001104, /* regcmaybe */
- 0x00001104, /* regcreset */
- 0x00001304, /* regcomp */
- 0x00000640, /* match */
- 0x00000604, /* qr */
- 0x00001654, /* subst */
- 0x00000354, /* substcont */
- 0x00001914, /* trans */
+ 0x00000a40, /* pushre */
+ 0x00000244, /* rv2gv */
+ 0x00000244, /* rv2sv */
+ 0x00000214, /* av2arylen */
+ 0x00000240, /* rv2cv */
+ 0x00000c00, /* anoncode */
+ 0x00003604, /* prototype */
+ 0x00004201, /* refgen */
+ 0x00002206, /* srefgen */
+ 0x0001368c, /* ref */
+ 0x00122804, /* bless */
+ 0x00001608, /* backtick */
+ 0x00012808, /* glob */
+ 0x00001608, /* readline */
+ 0x00001608, /* rcatline */
+ 0x00002204, /* regcmaybe */
+ 0x00002204, /* regcreset */
+ 0x00002604, /* regcomp */
+ 0x00000a40, /* match */
+ 0x00000a04, /* qr */
+ 0x00002a54, /* subst */
+ 0x00000654, /* substcont */
+ 0x00003014, /* trans */
0x00000004, /* sassign */
- 0x00022208, /* aassign */
- 0x00002c0d, /* chop */
- 0x00009c8c, /* schop */
- 0x00002c0d, /* chomp */
- 0x00009c8c, /* schomp */
- 0x00009c94, /* defined */
- 0x00009c04, /* undef */
- 0x00009c84, /* study */
- 0x00009c8c, /* pos */
- 0x00001164, /* preinc */
- 0x00001154, /* i_preinc */
- 0x00001164, /* predec */
- 0x00001154, /* i_predec */
- 0x0000116c, /* postinc */
- 0x0000115c, /* i_postinc */
- 0x0000116c, /* postdec */
- 0x0000115c, /* i_postdec */
- 0x0001120e, /* pow */
- 0x0001122e, /* multiply */
- 0x0001121e, /* i_multiply */
- 0x0001122e, /* divide */
- 0x0001121e, /* i_divide */
- 0x0001123e, /* modulo */
- 0x0001121e, /* i_modulo */
- 0x00012209, /* repeat */
- 0x0001122e, /* add */
- 0x0001121e, /* i_add */
- 0x0001122e, /* subtract */
- 0x0001121e, /* i_subtract */
- 0x0001120e, /* concat */
- 0x0000150e, /* stringify */
- 0x0001120e, /* left_shift */
- 0x0001120e, /* right_shift */
- 0x00011236, /* lt */
- 0x00011216, /* i_lt */
- 0x00011236, /* gt */
- 0x00011216, /* i_gt */
- 0x00011236, /* le */
- 0x00011216, /* i_le */
- 0x00011236, /* ge */
- 0x00011216, /* i_ge */
- 0x00011236, /* eq */
- 0x00011216, /* i_eq */
- 0x00011236, /* ne */
- 0x00011216, /* i_ne */
- 0x0001123e, /* ncmp */
- 0x0001121e, /* i_ncmp */
- 0x00011216, /* slt */
- 0x00011216, /* sgt */
- 0x00011216, /* sle */
- 0x00011216, /* sge */
- 0x00011216, /* seq */
- 0x00011216, /* sne */
- 0x0001121e, /* scmp */
- 0x0001120e, /* bit_and */
- 0x0001120e, /* bit_xor */
- 0x0001120e, /* bit_or */
- 0x0000112e, /* negate */
- 0x0000111e, /* i_negate */
- 0x00001116, /* not */
- 0x0000110e, /* complement */
- 0x0001150e, /* atan2 */
- 0x00009c8e, /* sin */
- 0x00009c8e, /* cos */
- 0x00009c0c, /* rand */
- 0x00009c04, /* srand */
- 0x00009c8e, /* exp */
- 0x00009c8e, /* log */
- 0x00009c8e, /* sqrt */
- 0x00009c8e, /* int */
- 0x00009c8e, /* hex */
- 0x00009c8e, /* oct */
- 0x00009c8e, /* abs */
- 0x00009c9c, /* length */
- 0x0991150c, /* substr */
- 0x0011151c, /* vec */
- 0x0091151c, /* index */
- 0x0091151c, /* rindex */
- 0x0002150f, /* sprintf */
- 0x00021505, /* formline */
- 0x00009c9e, /* ord */
- 0x00009c8e, /* chr */
- 0x0001150e, /* crypt */
- 0x00009c8e, /* ucfirst */
- 0x00009c8e, /* lcfirst */
- 0x00009c8e, /* uc */
- 0x00009c8e, /* lc */
- 0x00009c8e, /* quotemeta */
- 0x00000148, /* rv2av */
- 0x00013804, /* aelemfast */
- 0x00013204, /* aelem */
- 0x00023501, /* aslice */
- 0x00004c08, /* each */
- 0x00004c08, /* values */
- 0x00004c08, /* keys */
- 0x00001c00, /* delete */
- 0x00001c14, /* exists */
- 0x00000148, /* rv2hv */
- 0x00014204, /* helem */
- 0x00024501, /* hslice */
- 0x00011500, /* unpack */
- 0x0002150d, /* pack */
- 0x00111508, /* split */
- 0x0002150d, /* join */
- 0x00002501, /* list */
- 0x00224200, /* lslice */
- 0x00002505, /* anonlist */
- 0x00002505, /* anonhash */
- 0x02993501, /* splice */
- 0x0002351d, /* push */
- 0x00003c04, /* pop */
- 0x00003c04, /* shift */
- 0x0002351d, /* unshift */
- 0x0002d501, /* sort */
- 0x00002509, /* reverse */
- 0x00025541, /* grepstart */
- 0x00000348, /* grepwhile */
- 0x00025541, /* mapstart */
- 0x00000348, /* mapwhile */
- 0x00011400, /* range */
- 0x00011100, /* flip */
- 0x00000100, /* flop */
- 0x00000300, /* and */
- 0x00000300, /* or */
- 0x00011306, /* xor */
- 0x00000440, /* cond_expr */
- 0x00000304, /* andassign */
- 0x00000304, /* orassign */
- 0x00000140, /* method */
- 0x00002149, /* entersub */
- 0x00000100, /* leavesub */
- 0x00009c08, /* caller */
- 0x0000251d, /* warn */
- 0x0000255d, /* die */
- 0x00009c14, /* reset */
- 0x00000500, /* lineseq */
- 0x00000b04, /* nextstate */
- 0x00000b04, /* dbstate */
+ 0x00044408, /* aassign */
+ 0x0000560d, /* chop */
+ 0x0001368c, /* schop */
+ 0x0000570d, /* chomp */
+ 0x0001378c, /* schomp */
+ 0x00013694, /* defined */
+ 0x00013604, /* undef */
+ 0x00013684, /* study */
+ 0x0001368c, /* pos */
+ 0x00002264, /* preinc */
+ 0x00002254, /* i_preinc */
+ 0x00002264, /* predec */
+ 0x00002254, /* i_predec */
+ 0x0000226c, /* postinc */
+ 0x0000235c, /* i_postinc */
+ 0x0000226c, /* postdec */
+ 0x0000235c, /* i_postdec */
+ 0x0002250e, /* pow */
+ 0x0002252e, /* multiply */
+ 0x0002251e, /* i_multiply */
+ 0x0002252e, /* divide */
+ 0x0002251e, /* i_divide */
+ 0x0002253e, /* modulo */
+ 0x0002251e, /* i_modulo */
+ 0x00024409, /* repeat */
+ 0x0002252e, /* add */
+ 0x0002251e, /* i_add */
+ 0x0002252e, /* subtract */
+ 0x0002251e, /* i_subtract */
+ 0x0002250e, /* concat */
+ 0x0000290e, /* stringify */
+ 0x0002250e, /* left_shift */
+ 0x0002250e, /* right_shift */
+ 0x00022436, /* lt */
+ 0x00022416, /* i_lt */
+ 0x00022436, /* gt */
+ 0x00022416, /* i_gt */
+ 0x00022436, /* le */
+ 0x00022416, /* i_le */
+ 0x00022436, /* ge */
+ 0x00022416, /* i_ge */
+ 0x00022436, /* eq */
+ 0x00022416, /* i_eq */
+ 0x00022436, /* ne */
+ 0x00022416, /* i_ne */
+ 0x0002243e, /* ncmp */
+ 0x0002241e, /* i_ncmp */
+ 0x00022416, /* slt */
+ 0x00022416, /* sgt */
+ 0x00022416, /* sle */
+ 0x00022416, /* sge */
+ 0x00022416, /* seq */
+ 0x00022416, /* sne */
+ 0x0002241e, /* scmp */
+ 0x0002240e, /* bit_and */
+ 0x0002240e, /* bit_xor */
+ 0x0002240e, /* bit_or */
+ 0x0000222e, /* negate */
+ 0x0000231e, /* i_negate */
+ 0x00002216, /* not */
+ 0x0000220e, /* complement */
+ 0x0002290e, /* atan2 */
+ 0x0001378e, /* sin */
+ 0x0001378e, /* cos */
+ 0x0001370c, /* rand */
+ 0x00013604, /* srand */
+ 0x0001378e, /* exp */
+ 0x0001378e, /* log */
+ 0x0001378e, /* sqrt */
+ 0x0001378e, /* int */
+ 0x0001378e, /* hex */
+ 0x0001378e, /* oct */
+ 0x0001378e, /* abs */
+ 0x0001379c, /* length */
+ 0x1322280c, /* substr */
+ 0x0022281c, /* vec */
+ 0x0122291c, /* index */
+ 0x0122291c, /* rindex */
+ 0x0004280f, /* sprintf */
+ 0x00042805, /* formline */
+ 0x0001379e, /* ord */
+ 0x0001378e, /* chr */
+ 0x0002290e, /* crypt */
+ 0x0001368e, /* ucfirst */
+ 0x0001368e, /* lcfirst */
+ 0x0001368e, /* uc */
+ 0x0001368e, /* lc */
+ 0x0001368e, /* quotemeta */
+ 0x00000248, /* rv2av */
+ 0x00026c04, /* aelemfast */
+ 0x00026404, /* aelem */
+ 0x00046801, /* aslice */
+ 0x00009600, /* each */
+ 0x00009608, /* values */
+ 0x00009608, /* keys */
+ 0x00003600, /* delete */
+ 0x00003614, /* exists */
+ 0x00000248, /* rv2hv */
+ 0x00028404, /* helem */
+ 0x00048801, /* hslice */
+ 0x00022800, /* unpack */
+ 0x0004280d, /* pack */
+ 0x00222808, /* split */
+ 0x0004280d, /* join */
+ 0x00004801, /* list */
+ 0x00448400, /* lslice */
+ 0x00004805, /* anonlist */
+ 0x00004805, /* anonhash */
+ 0x05326801, /* splice */
+ 0x0004691d, /* push */
+ 0x00007604, /* pop */
+ 0x00007604, /* shift */
+ 0x0004691d, /* unshift */
+ 0x0005a801, /* sort */
+ 0x00004809, /* reverse */
+ 0x0004a841, /* grepstart */
+ 0x00000648, /* grepwhile */
+ 0x0004a841, /* mapstart */
+ 0x00000648, /* mapwhile */
+ 0x00022600, /* range */
+ 0x00022200, /* flip */
+ 0x00000200, /* flop */
+ 0x00000600, /* and */
+ 0x00000600, /* or */
+ 0x00022406, /* xor */
+ 0x00000640, /* cond_expr */
+ 0x00000604, /* andassign */
+ 0x00000604, /* orassign */
+ 0x00000240, /* method */
+ 0x00004249, /* entersub */
+ 0x00000200, /* leavesub */
+ 0x00000200, /* leavesublv */
+ 0x00013608, /* caller */
+ 0x0000481d, /* warn */
+ 0x0000485d, /* die */
+ 0x00013614, /* reset */
+ 0x00000800, /* lineseq */
+ 0x00001404, /* nextstate */
+ 0x00001404, /* dbstate */
0x00000004, /* unstack */
0x00000000, /* enter */
- 0x00000500, /* leave */
- 0x00000500, /* scope */
- 0x00000a40, /* enteriter */
+ 0x00000800, /* leave */
+ 0x00000800, /* scope */
+ 0x00001240, /* enteriter */
0x00000000, /* iter */
- 0x00000a40, /* enterloop */
- 0x00000200, /* leaveloop */
- 0x00002541, /* return */
- 0x00000e44, /* last */
- 0x00000e44, /* next */
- 0x00000e44, /* redo */
- 0x00000e44, /* dump */
- 0x00000e44, /* goto */
- 0x00009c44, /* exit */
- 0x0009651c, /* open */
- 0x0000ec14, /* close */
- 0x00066514, /* pipe_op */
- 0x00006c1c, /* fileno */
- 0x00009c1c, /* umask */
- 0x00006c04, /* binmode */
- 0x00217555, /* tie */
- 0x00007c14, /* untie */
- 0x00007c04, /* tied */
- 0x00114514, /* dbmopen */
- 0x00004c14, /* dbmclose */
- 0x01111508, /* sselect */
- 0x0000e50c, /* select */
- 0x0000ec0c, /* getc */
- 0x0917651d, /* read */
- 0x0000ec54, /* enterwrite */
- 0x00000100, /* leavewrite */
- 0x0002e515, /* prtf */
- 0x0002e515, /* print */
- 0x09116504, /* sysopen */
- 0x00116504, /* sysseek */
- 0x0917651d, /* sysread */
- 0x0991651d, /* syswrite */
- 0x0911651d, /* send */
- 0x0117651d, /* recv */
- 0x0000ec14, /* eof */
- 0x0000ec0c, /* tell */
- 0x00116504, /* seek */
- 0x00011514, /* truncate */
- 0x0011650c, /* fcntl */
- 0x0011650c, /* ioctl */
- 0x0001651c, /* flock */
- 0x01116514, /* socket */
- 0x11166514, /* sockpair */
- 0x00016514, /* bind */
- 0x00016514, /* connect */
- 0x00016514, /* listen */
- 0x0006651c, /* accept */
- 0x0001651c, /* shutdown */
- 0x00116514, /* gsockopt */
- 0x01116514, /* ssockopt */
- 0x00006c14, /* getsockname */
- 0x00006c14, /* getpeername */
- 0x00006d80, /* lstat */
- 0x00006d80, /* stat */
- 0x00006d94, /* ftrread */
- 0x00006d94, /* ftrwrite */
- 0x00006d94, /* ftrexec */
- 0x00006d94, /* fteread */
- 0x00006d94, /* ftewrite */
- 0x00006d94, /* fteexec */
- 0x00006d94, /* ftis */
- 0x00006d94, /* fteowned */
- 0x00006d94, /* ftrowned */
- 0x00006d94, /* ftzero */
- 0x00006d9c, /* ftsize */
- 0x00006d8c, /* ftmtime */
- 0x00006d8c, /* ftatime */
- 0x00006d8c, /* ftctime */
- 0x00006d94, /* ftsock */
- 0x00006d94, /* ftchr */
- 0x00006d94, /* ftblk */
- 0x00006d94, /* ftfile */
- 0x00006d94, /* ftdir */
- 0x00006d94, /* ftpipe */
- 0x00006d94, /* ftlink */
- 0x00006d94, /* ftsuid */
- 0x00006d94, /* ftsgid */
- 0x00006d94, /* ftsvtx */
- 0x00006d14, /* fttty */
- 0x00006d94, /* fttext */
- 0x00006d94, /* ftbinary */
- 0x00009c1c, /* chdir */
- 0x0000251d, /* chown */
- 0x00009c9c, /* chroot */
- 0x0000259d, /* unlink */
- 0x0000251d, /* chmod */
- 0x0000251d, /* utime */
- 0x0001151c, /* rename */
- 0x0001151c, /* link */
- 0x0001151c, /* symlink */
- 0x00009c8c, /* readlink */
- 0x0001151c, /* mkdir */
- 0x00009c9c, /* rmdir */
- 0x00016514, /* open_dir */
- 0x00006c00, /* readdir */
- 0x00006c0c, /* telldir */
- 0x00016504, /* seekdir */
- 0x00006c04, /* rewinddir */
- 0x00006c14, /* closedir */
+ 0x00001240, /* enterloop */
+ 0x00000400, /* leaveloop */
+ 0x00004841, /* return */
+ 0x00001a44, /* last */
+ 0x00001a44, /* next */
+ 0x00001a44, /* redo */
+ 0x00001a44, /* dump */
+ 0x00001a44, /* goto */
+ 0x00013644, /* exit */
+ 0x0052c81c, /* open */
+ 0x0001d614, /* close */
+ 0x000cc814, /* pipe_op */
+ 0x0000d61c, /* fileno */
+ 0x0001361c, /* umask */
+ 0x0012c804, /* binmode */
+ 0x0042e855, /* tie */
+ 0x0000f614, /* untie */
+ 0x0000f604, /* tied */
+ 0x00228814, /* dbmopen */
+ 0x00009614, /* dbmclose */
+ 0x02222808, /* sselect */
+ 0x0001c80c, /* select */
+ 0x0001d60c, /* getc */
+ 0x122ec81d, /* read */
+ 0x0001d654, /* enterwrite */
+ 0x00000200, /* leavewrite */
+ 0x0005c815, /* prtf */
+ 0x0005c815, /* print */
+ 0x1222c804, /* sysopen */
+ 0x0022c804, /* sysseek */
+ 0x122ec81d, /* sysread */
+ 0x1322c81d, /* syswrite */
+ 0x1222c81d, /* send */
+ 0x022ec81d, /* recv */
+ 0x0001d614, /* eof */
+ 0x0001d60c, /* tell */
+ 0x0022c804, /* seek */
+ 0x00022814, /* truncate */
+ 0x0022c80c, /* fcntl */
+ 0x0022c80c, /* ioctl */
+ 0x0002c91c, /* flock */
+ 0x0222c814, /* socket */
+ 0x222cc814, /* sockpair */
+ 0x0002c814, /* bind */
+ 0x0002c814, /* connect */
+ 0x0002c814, /* listen */
+ 0x000cc81c, /* accept */
+ 0x0002c81c, /* shutdown */
+ 0x0022c814, /* gsockopt */
+ 0x0222c814, /* ssockopt */
+ 0x0000d614, /* getsockname */
+ 0x0000d614, /* getpeername */
+ 0x0000d880, /* lstat */
+ 0x0000d880, /* stat */
+ 0x0000d894, /* ftrread */
+ 0x0000d894, /* ftrwrite */
+ 0x0000d894, /* ftrexec */
+ 0x0000d894, /* fteread */
+ 0x0000d894, /* ftewrite */
+ 0x0000d894, /* fteexec */
+ 0x0000d894, /* ftis */
+ 0x0000d894, /* fteowned */
+ 0x0000d894, /* ftrowned */
+ 0x0000d894, /* ftzero */
+ 0x0000d89c, /* ftsize */
+ 0x0000d88c, /* ftmtime */
+ 0x0000d88c, /* ftatime */
+ 0x0000d88c, /* ftctime */
+ 0x0000d894, /* ftsock */
+ 0x0000d894, /* ftchr */
+ 0x0000d894, /* ftblk */
+ 0x0000d894, /* ftfile */
+ 0x0000d894, /* ftdir */
+ 0x0000d894, /* ftpipe */
+ 0x0000d894, /* ftlink */
+ 0x0000d894, /* ftsuid */
+ 0x0000d894, /* ftsgid */
+ 0x0000d894, /* ftsvtx */
+ 0x0000d814, /* fttty */
+ 0x0000d894, /* fttext */
+ 0x0000d894, /* ftbinary */
+ 0x0001371c, /* chdir */
+ 0x0000491d, /* chown */
+ 0x0001379c, /* chroot */
+ 0x0000499d, /* unlink */
+ 0x0000491d, /* chmod */
+ 0x0000491d, /* utime */
+ 0x0002291c, /* rename */
+ 0x0002291c, /* link */
+ 0x0002291c, /* symlink */
+ 0x0001368c, /* readlink */
+ 0x0012291c, /* mkdir */
+ 0x0001379c, /* rmdir */
+ 0x0002c814, /* open_dir */
+ 0x0000d600, /* readdir */
+ 0x0000d60c, /* telldir */
+ 0x0002c804, /* seekdir */
+ 0x0000d604, /* rewinddir */
+ 0x0000d614, /* closedir */
0x0000001c, /* fork */
- 0x0000001c, /* wait */
- 0x0001151c, /* waitpid */
- 0x0002951d, /* system */
- 0x0002955d, /* exec */
- 0x0000255d, /* kill */
- 0x0000001c, /* getppid */
- 0x00009c1c, /* getpgrp */
- 0x0009951c, /* setpgrp */
- 0x0001151c, /* getpriority */
- 0x0011151c, /* setpriority */
- 0x0000001c, /* time */
+ 0x0000011c, /* wait */
+ 0x0002291c, /* waitpid */
+ 0x0005291d, /* system */
+ 0x0005295d, /* exec */
+ 0x0000495d, /* kill */
+ 0x0000011c, /* getppid */
+ 0x0001371c, /* getpgrp */
+ 0x0013291c, /* setpgrp */
+ 0x0002291c, /* getpriority */
+ 0x0022291c, /* setpriority */
+ 0x0000011c, /* time */
0x00000000, /* tms */
- 0x00009c08, /* localtime */
- 0x00009c08, /* gmtime */
- 0x00009c9c, /* alarm */
- 0x00009c1c, /* sleep */
- 0x0011151d, /* shmget */
- 0x0011151d, /* shmctl */
- 0x0111151d, /* shmread */
- 0x0111151d, /* shmwrite */
- 0x0001151d, /* msgget */
- 0x0011151d, /* msgctl */
- 0x0011151d, /* msgsnd */
- 0x1111151d, /* msgrcv */
- 0x0011151d, /* semget */
- 0x0111151d, /* semctl */
- 0x0001151d, /* semop */
- 0x00009cc0, /* require */
- 0x00001140, /* dofile */
- 0x00001c40, /* entereval */
- 0x00001100, /* leaveeval */
- 0x00000300, /* entertry */
- 0x00000500, /* leavetry */
- 0x00001c00, /* ghbyname */
- 0x00011500, /* ghbyaddr */
+ 0x00013608, /* localtime */
+ 0x00013608, /* gmtime */
+ 0x0001369c, /* alarm */
+ 0x0001371c, /* sleep */
+ 0x0022281d, /* shmget */
+ 0x0022281d, /* shmctl */
+ 0x0222281d, /* shmread */
+ 0x0222281d, /* shmwrite */
+ 0x0002281d, /* msgget */
+ 0x0022281d, /* msgctl */
+ 0x0022281d, /* msgsnd */
+ 0x2222281d, /* msgrcv */
+ 0x0022281d, /* semget */
+ 0x0222281d, /* semctl */
+ 0x0002281d, /* semop */
+ 0x000136c0, /* require */
+ 0x00002240, /* dofile */
+ 0x00003640, /* entereval */
+ 0x00002200, /* leaveeval */
+ 0x00000600, /* entertry */
+ 0x00000800, /* leavetry */
+ 0x00003600, /* ghbyname */
+ 0x00022800, /* ghbyaddr */
0x00000000, /* ghostent */
- 0x00001c00, /* gnbyname */
- 0x00011500, /* gnbyaddr */
+ 0x00003600, /* gnbyname */
+ 0x00022800, /* gnbyaddr */
0x00000000, /* gnetent */
- 0x00001c00, /* gpbyname */
- 0x00001500, /* gpbynumber */
+ 0x00003600, /* gpbyname */
+ 0x00002800, /* gpbynumber */
0x00000000, /* gprotoent */
- 0x00011500, /* gsbyname */
- 0x00011500, /* gsbyport */
+ 0x00022800, /* gsbyname */
+ 0x00022800, /* gsbyport */
0x00000000, /* gservent */
- 0x00001c14, /* shostent */
- 0x00001c14, /* snetent */
- 0x00001c14, /* sprotoent */
- 0x00001c14, /* sservent */
+ 0x00003614, /* shostent */
+ 0x00003614, /* snetent */
+ 0x00003614, /* sprotoent */
+ 0x00003614, /* sservent */
0x00000014, /* ehostent */
0x00000014, /* enetent */
0x00000014, /* eprotoent */
0x00000014, /* eservent */
- 0x00001c00, /* gpwnam */
- 0x00001c00, /* gpwuid */
+ 0x00003600, /* gpwnam */
+ 0x00003600, /* gpwuid */
0x00000000, /* gpwent */
0x00000014, /* spwent */
0x00000014, /* epwent */
- 0x00001c00, /* ggrnam */
- 0x00001c00, /* ggrgid */
+ 0x00003600, /* ggrnam */
+ 0x00003600, /* ggrgid */
0x00000000, /* ggrent */
0x00000014, /* sgrent */
0x00000014, /* egrent */
0x0000000c, /* getlogin */
- 0x0002151d, /* syscall */
- 0x00001c04, /* lock */
+ 0x0004281d, /* syscall */
+ 0x00003604, /* lock */
0x00000044, /* threadsv */
+ 0x00001404, /* setstate */
+ 0x00000c40, /* method_named */
};
#endif
+
+END_EXTERN_C
diff --git a/contrib/perl5/opcode.pl b/contrib/perl5/opcode.pl
index cec51c0..eb64e8d 100755
--- a/contrib/perl5/opcode.pl
+++ b/contrib/perl5/opcode.pl
@@ -1,7 +1,8 @@
#!/usr/bin/perl
-unlink "opcode.h";
+unlink "opcode.h", "opnames.h";
open(OC, ">opcode.h") || die "Can't create opcode.h: $!\n";
+open(ON, ">opnames.h") || die "Can't create opnames.h: $!\n";
select OC;
# Read data.
@@ -29,27 +30,44 @@ while (<DATA>) {
$i = 0;
print <<"END";
-#define pp_i_preinc pp_preinc
-#define pp_i_predec pp_predec
-#define pp_i_postinc pp_postinc
-#define pp_i_postdec pp_postdec
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
-typedef enum {
+#define Perl_pp_i_preinc Perl_pp_preinc
+#define Perl_pp_i_predec Perl_pp_predec
+#define Perl_pp_i_postinc Perl_pp_postinc
+#define Perl_pp_i_postdec Perl_pp_postdec
+
+END
+
+print ON <<"END";
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
+typedef enum opcode {
END
+
for (@ops) {
- print "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n";
+ print ON "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n";
}
-print "\t", &tab(3,"OP_max"), "\n";
-print "} opcode;\n";
-print "\n#define MAXO ", scalar @ops, "\n\n";
+print ON "\t", &tab(3,"OP_max"), "\n";
+print ON "} opcode;\n";
+print ON "\n#define MAXO ", scalar @ops, "\n\n";
# Emit op names and descriptions.
print <<END;
+
+START_EXTERN_C
+
#ifndef DOINIT
-EXT char *op_name[];
+EXT char *PL_op_name[];
#else
-EXT char *op_name[] = {
+EXT char *PL_op_name[] = {
END
for (@ops) {
@@ -64,57 +82,58 @@ END
print <<END;
#ifndef DOINIT
-EXT char *op_desc[];
+EXT char *PL_op_desc[];
#else
-EXT char *op_desc[] = {
+EXT char *PL_op_desc[] = {
END
for (@ops) {
- print qq(\t"$desc{$_}",\n);
+ my($safe_desc) = $desc{$_};
+
+ # Have to escape double quotes and escape characters.
+ $safe_desc =~ s/(^|[^\\])([\\"])/$1\\$2/g;
+
+ print qq(\t"$safe_desc",\n);
}
print <<END;
};
#endif
-#ifndef PERL_OBJECT
-START_EXTERN_C
+END_EXTERN_C
END
# Emit function declarations.
-for (sort keys %ckname) {
- print "OP *\t", &tab(3,$_),"_((OP* o));\n";
-}
-
-print "\n";
-
-for (@ops) {
- print "OP *\t", &tab(3, "pp_$_"), "_((ARGSproto));\n";
-}
+#for (sort keys %ckname) {
+# print "OP *\t", &tab(3,$_),"(pTHX_ OP* o);\n";
+#}
+#
+#print "\n";
+#
+#for (@ops) {
+# print "OP *\t", &tab(3, "pp_$_"), "(pTHX);\n";
+#}
# Emit ppcode switch array.
print <<END;
-END_EXTERN_C
-#endif /* PERL_OBJECT */
+START_EXTERN_C
#ifndef DOINIT
-EXT OP * (CPERLscope(*ppaddr)[])(ARGSproto);
+EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX);
#else
-#ifndef PERL_OBJECT
-EXT OP * (CPERLscope(*ppaddr)[])(ARGSproto) = {
+EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX) = {
END
for (@ops) {
- print "\tpp_$_,\n";
+ print "\tMEMBER_TO_FPTR(Perl_pp_$_),\n";
}
print <<END;
};
-#endif /* PERL_OBJECT */
#endif
END
@@ -123,19 +142,17 @@ END
print <<END;
#ifndef DOINIT
-EXT OP * (CPERLscope(*check)[]) _((OP *op));
+EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op);
#else
-#ifndef PERL_OBJECT
-EXT OP * (CPERLscope(*check)[]) _((OP *op)) = {
+EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op) = {
END
for (@ops) {
- print "\t", &tab(3, "$check{$_},"), "/* $_ */\n";
+ print "\t", &tab(3, "MEMBER_TO_FPTR(Perl_$check{$_}),"), "\t/* $_ */\n";
}
print <<END;
};
-#endif /* PERL_OBJECT */
#endif
END
@@ -144,9 +161,9 @@ END
print <<END;
#ifndef DOINIT
-EXT U32 opargs[];
+EXT U32 PL_opargs[];
#else
-EXT U32 opargs[] = {
+EXT U32 PL_opargs[] = {
END
%argnum = (
@@ -164,17 +181,16 @@ END
'1', 1, # unop
'2', 2, # binop
'|', 3, # logop
- '?', 4, # condop
- '@', 5, # listop
- '/', 6, # pmop
- '$', 7, # svop
- '*', 8, # gvop
- '"', 9, # pvop
- '{', 10, # loop
- ';', 11, # cop
- '%', 12, # baseop_or_unop
- '-', 13, # filestatop
- '}', 14, # loopexop
+ '@', 4, # listop
+ '/', 5, # pmop
+ '$', 6, # svop_or_padop
+ '#', 7, # padop
+ '"', 8, # pvop_or_svop
+ '{', 9, # loop
+ ';', 10, # cop
+ '%', 11, # baseop_or_unop
+ '-', 12, # filestatop
+ '}', 13, # loopexop
);
for (@ops) {
@@ -184,17 +200,20 @@ for (@ops) {
$argsum |= 2 if $flags =~ /f/; # fold constants
$argsum |= 4 if $flags =~ /s/; # always produces scalar
$argsum |= 8 if $flags =~ /t/; # needs target scalar
+ $argsum |= (8|256) if $flags =~ /T/; # ... which may be lexical
$argsum |= 16 if $flags =~ /i/; # always produces integer
$argsum |= 32 if $flags =~ /I/; # has corresponding int op
$argsum |= 64 if $flags =~ /d/; # danger, unknown side effects
$argsum |= 128 if $flags =~ /u/; # defaults to $_
$flags =~ /([\W\d_])/ or die qq[Opcode "$_" has no class indicator];
- $argsum |= $opclass{$1} << 8;
- $mul = 4096; # 2 ^ OASHIFT
+ $argsum |= $opclass{$1} << 9;
+ $mul = 0x2000; # 2 ^ OASHIFT
for $arg (split(' ',$args{$_})) {
$argnum = ($arg =~ s/\?//) ? 8 : 0;
$argnum += $argnum{$arg};
+ warn "# Conflicting bit 32 for '$_'.\n"
+ if $argnum & 8 and $mul == 0x10000000;
$argsum += $argnum * $mul;
$mul <<= 4;
}
@@ -205,18 +224,52 @@ for (@ops) {
print <<END;
};
#endif
+
+END_EXTERN_C
END
close OC or die "Error closing opcode.h: $!";
+close ON or die "Error closing opnames.h: $!";
unlink "pp_proto.h";
+unlink "pp.sym";
open PP, '>pp_proto.h' or die "Error creating pp_proto.h: $!";
+open PPSYM, '>pp.sym' or die "Error creating pp.sym: $!";
+
+print PP <<"END";
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
+END
+
+print PPSYM <<"END";
+#
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by opcode.pl from its data. Any changes made here
+# will be lost!
+#
+
+END
+
+
+for (sort keys %ckname) {
+ print PP "PERL_CKDEF(Perl_$_)\n";
+ print PPSYM "Perl_$_\n";
+#OP *\t", &tab(3,$_),"(OP* o);\n";
+}
+
+print PP "\n\n";
+
for (@ops) {
next if /^i_(pre|post)(inc|dec)$/;
- print PP "PPDEF(pp_$_)\n";
+ print PP "PERL_PPDEF(Perl_pp_$_)\n";
+ print PPSYM "Perl_pp_$_\n";
}
close PP or die "Error closing pp_proto.h: $!";
+close PPSYM or die "Error closing pp.sym: $!";
###########################################################################
sub tab {
@@ -225,8 +278,67 @@ sub tab {
$t;
}
###########################################################################
+
+# Some comments about 'T' opcode classifier:
+
+# Safe to set if the ppcode uses:
+# tryAMAGICbin, tryAMAGICun, SETn, SETi, SETu, PUSHn, PUSHTARG, SETTARG,
+# SETs(TARG), XPUSHn, XPUSHu,
+
+# Unsafe to set if the ppcode uses dTARG or [X]RETPUSH[YES|NO|UNDEF]
+
+# lt and friends do SETs (including ncmp, but not scmp)
+
+# Additional mode of failure: the opcode can modify TARG before it "used"
+# all the arguments (or may call an external function which does the same).
+# If the target coincides with one of the arguments ==> kaboom.
+
+# pp.c pos substr each not OK (RETPUSHUNDEF)
+# substr vec also not OK due to LV to target (are they???)
+# ref not OK (RETPUSHNO)
+# trans not OK (dTARG; TARG = sv_newmortal();)
+# ucfirst etc not OK: TMP arg processed inplace
+# quotemeta not OK (unsafe when TARG == arg)
+# each repeat not OK too due to array context
+# pack split - unknown whether they are safe
+# sprintf: is calling do_sprintf(TARG,...) which can act on TARG
+# before other args are processed.
+
+# Suspicious wrt "additional mode of failure" (and only it):
+# schop, chop, postinc/dec, bit_and etc, negate, complement.
+
+# Also suspicious: 4-arg substr, sprintf, uc/lc (POK_only), reverse, pack.
+
+# substr/vec: doing TAINT_off()???
+
+# pp_hot.c
+# readline - unknown whether it is safe
+# match subst not OK (dTARG)
+# grepwhile not OK (not always setting)
+# join not OK (unsafe when TARG == arg)
+
+# Suspicious wrt "additional mode of failure": concat (dealt with
+# in ck_sassign()), join (same).
+
+# pp_ctl.c
+# mapwhile flip caller not OK (not always setting)
+
+# pp_sys.c
+# backtick glob warn die not OK (not always setting)
+# warn not OK (RETPUSHYES)
+# open fileno getc sysread syswrite ioctl accept shutdown
+# ftsize(etc) readlink telldir fork alarm getlogin not OK (RETPUSHUNDEF)
+# umask select not OK (XPUSHs(&PL_sv_undef);)
+# fileno getc sysread syswrite tell not OK (meth("FILENO" "GETC"))
+# sselect shm* sem* msg* syscall - unknown whether they are safe
+# gmtime not OK (list context)
+
+# Suspicious wrt "additional mode of failure": warn, die, select.
+
__END__
+# New ops always go at the very end
+
# Nothing.
null null operation ck_null 0
@@ -240,108 +352,108 @@ wantarray wantarray ck_null is0
const constant item ck_svconst s$
-gvsv scalar variable ck_null ds*
-gv glob value ck_null ds*
+gvsv scalar variable ck_null ds$
+gv glob value ck_null ds$
gelem glob elem ck_null d2 S S
padsv private variable ck_null ds0
padav private array ck_null d0
padhv private hash ck_null d0
-padany private something ck_null d0
+padany private value ck_null d0
pushre push regexp ck_null d/
# References and stuff.
rv2gv ref-to-glob cast ck_rvconst ds1
-rv2sv scalar deref ck_rvconst ds1
+rv2sv scalar dereference ck_rvconst ds1
av2arylen array length ck_null is1
-rv2cv subroutine deref ck_rvconst d1
+rv2cv subroutine dereference ck_rvconst d1
anoncode anonymous subroutine ck_anoncode $
prototype subroutine prototype ck_null s% S
refgen reference constructor ck_spair m1 L
-srefgen scalar ref constructor ck_null fs1 S
+srefgen single ref constructor ck_null fs1 S
ref reference-type operator ck_fun stu% S?
bless bless ck_fun s@ S S?
# Pushy I/O.
-backtick backticks ck_null t%
+backtick quoted execution (``, qx) ck_open t%
# glob defaults its first arg to $_
-glob glob ck_glob t@ S? S?
+glob glob ck_glob t@ S?
readline <HANDLE> ck_null t%
rcatline append I/O operator ck_null t%
# Bindable operators.
-regcmaybe regexp comp once ck_fun s1 S
-regcreset regexp reset interpolation flag ck_fun s1 S
+regcmaybe regexp internal guard ck_fun s1 S
+regcreset regexp internal reset ck_fun s1 S
regcomp regexp compilation ck_null s| S
-match pattern match ck_match d/
-qr pattern quote ck_match s/
-subst substitution ck_null dis/ S
-substcont substitution cont ck_null dis|
-trans character translation ck_null is" S
+match pattern match (m//) ck_match d/
+qr pattern quote (qr//) ck_match s/
+subst substitution (s///) ck_null dis/ S
+substcont substitution iterator ck_null dis|
+trans transliteration (tr///) ck_null is" S
# Lvalue operators.
# sassign is special-cased for op class
-sassign scalar assignment ck_null s0
+sassign scalar assignment ck_sassign s0
aassign list assignment ck_null t2 L L
chop chop ck_spair mts% L
schop scalar chop ck_null stu% S?
-chomp safe chop ck_spair mts% L
-schomp scalar safe chop ck_null stu% S?
-defined defined operator ck_rfun isu% S?
+chomp chomp ck_spair mTs% L
+schomp scalar chomp ck_null sTu% S?
+defined defined operator ck_defined isu% S?
undef undef operator ck_lfun s% S?
study study ck_fun su% S?
pos match position ck_lfun stu% S?
-preinc preincrement ck_lfun dIs1 S
-i_preinc integer preincrement ck_lfun dis1 S
-predec predecrement ck_lfun dIs1 S
-i_predec integer predecrement ck_lfun dis1 S
-postinc postincrement ck_lfun dIst1 S
-i_postinc integer postincrement ck_lfun dist1 S
-postdec postdecrement ck_lfun dIst1 S
-i_postdec integer postdecrement ck_lfun dist1 S
+preinc preincrement (++) ck_lfun dIs1 S
+i_preinc integer preincrement (++) ck_lfun dis1 S
+predec predecrement (--) ck_lfun dIs1 S
+i_predec integer predecrement (--) ck_lfun dis1 S
+postinc postincrement (++) ck_lfun dIst1 S
+i_postinc integer postincrement (++) ck_lfun disT1 S
+postdec postdecrement (--) ck_lfun dIst1 S
+i_postdec integer postdecrement (--) ck_lfun disT1 S
# Ordinary operators.
-pow exponentiation ck_null fst2 S S
-
-multiply multiplication ck_null Ifst2 S S
-i_multiply integer multiplication ck_null ifst2 S S
-divide division ck_null Ifst2 S S
-i_divide integer division ck_null ifst2 S S
-modulo modulus ck_null Iifst2 S S
-i_modulo integer modulus ck_null ifst2 S S
-repeat repeat ck_repeat mt2 L S
-
-add addition ck_null Ifst2 S S
-i_add integer addition ck_null ifst2 S S
-subtract subtraction ck_null Ifst2 S S
-i_subtract integer subtraction ck_null ifst2 S S
-concat concatenation ck_concat fst2 S S
-stringify string ck_fun fst@ S
-
-left_shift left bitshift ck_bitop fst2 S S
-right_shift right bitshift ck_bitop fst2 S S
-
-lt numeric lt ck_null Iifs2 S S
-i_lt integer lt ck_null ifs2 S S
-gt numeric gt ck_null Iifs2 S S
-i_gt integer gt ck_null ifs2 S S
-le numeric le ck_null Iifs2 S S
-i_le integer le ck_null ifs2 S S
-ge numeric ge ck_null Iifs2 S S
-i_ge integer ge ck_null ifs2 S S
-eq numeric eq ck_null Iifs2 S S
-i_eq integer eq ck_null ifs2 S S
-ne numeric ne ck_null Iifs2 S S
-i_ne integer ne ck_null ifs2 S S
-ncmp spaceship operator ck_null Iifst2 S S
-i_ncmp integer spaceship ck_null ifst2 S S
+pow exponentiation (**) ck_null fsT2 S S
+
+multiply multiplication (*) ck_null IfsT2 S S
+i_multiply integer multiplication (*) ck_null ifsT2 S S
+divide division (/) ck_null IfsT2 S S
+i_divide integer division (/) ck_null ifsT2 S S
+modulo modulus (%) ck_null IifsT2 S S
+i_modulo integer modulus (%) ck_null ifsT2 S S
+repeat repeat (x) ck_repeat mt2 L S
+
+add addition (+) ck_null IfsT2 S S
+i_add integer addition (+) ck_null ifsT2 S S
+subtract subtraction (-) ck_null IfsT2 S S
+i_subtract integer subtraction (-) ck_null ifsT2 S S
+concat concatenation (.) ck_concat fsT2 S S
+stringify string ck_fun fsT@ S
+
+left_shift left bitshift (<<) ck_bitop fsT2 S S
+right_shift right bitshift (>>) ck_bitop fsT2 S S
+
+lt numeric lt (<) ck_null Iifs2 S S
+i_lt integer lt (<) ck_null ifs2 S S
+gt numeric gt (>) ck_null Iifs2 S S
+i_gt integer gt (>) ck_null ifs2 S S
+le numeric le (<=) ck_null Iifs2 S S
+i_le integer le (<=) ck_null ifs2 S S
+ge numeric ge (>=) ck_null Iifs2 S S
+i_ge integer ge (>=) ck_null ifs2 S S
+eq numeric eq (==) ck_null Iifs2 S S
+i_eq integer eq (==) ck_null ifs2 S S
+ne numeric ne (!=) ck_null Iifs2 S S
+i_ne integer ne (!=) ck_null ifs2 S S
+ncmp numeric comparison (<=>) ck_null Iifst2 S S
+i_ncmp integer comparison (<=>) ck_null ifst2 S S
slt string lt ck_scmp ifs2 S S
sgt string gt ck_scmp ifs2 S S
@@ -349,71 +461,71 @@ sle string le ck_scmp ifs2 S S
sge string ge ck_scmp ifs2 S S
seq string eq ck_null ifs2 S S
sne string ne ck_null ifs2 S S
-scmp string comparison ck_scmp ifst2 S S
+scmp string comparison (cmp) ck_scmp ifst2 S S
-bit_and bitwise and ck_bitop fst2 S S
-bit_xor bitwise xor ck_bitop fst2 S S
-bit_or bitwise or ck_bitop fst2 S S
+bit_and bitwise and (&) ck_bitop fst2 S S
+bit_xor bitwise xor (^) ck_bitop fst2 S S
+bit_or bitwise or (|) ck_bitop fst2 S S
-negate negate ck_null Ifst1 S
-i_negate integer negate ck_null ifst1 S
+negate negation (-) ck_null Ifst1 S
+i_negate integer negation (-) ck_null ifsT1 S
not not ck_null ifs1 S
-complement 1's complement ck_bitop fst1 S
+complement 1's complement (~) ck_bitop fst1 S
# High falutin' math.
-atan2 atan2 ck_fun fst@ S S
-sin sin ck_fun fstu% S?
-cos cos ck_fun fstu% S?
-rand rand ck_fun st% S?
+atan2 atan2 ck_fun fsT@ S S
+sin sin ck_fun fsTu% S?
+cos cos ck_fun fsTu% S?
+rand rand ck_fun sT% S?
srand srand ck_fun s% S?
-exp exp ck_fun fstu% S?
-log log ck_fun fstu% S?
-sqrt sqrt ck_fun fstu% S?
+exp exp ck_fun fsTu% S?
+log log ck_fun fsTu% S?
+sqrt sqrt ck_fun fsTu% S?
# Lowbrow math.
-int int ck_fun fstu% S?
-hex hex ck_fun fstu% S?
-oct oct ck_fun fstu% S?
-abs abs ck_fun fstu% S?
+int int ck_fun fsTu% S?
+hex hex ck_fun fsTu% S?
+oct oct ck_fun fsTu% S?
+abs abs ck_fun fsTu% S?
# String stuff.
-length length ck_lengthconst istu% S?
+length length ck_lengthconst isTu% S?
substr substr ck_fun st@ S S S? S?
vec vec ck_fun ist@ S S S
-index index ck_index ist@ S S S?
-rindex rindex ck_index ist@ S S S?
+index index ck_index isT@ S S S?
+rindex rindex ck_index isT@ S S S?
sprintf sprintf ck_fun_locale mfst@ S L
formline formline ck_fun ms@ S L
-ord ord ck_fun ifstu% S?
-chr chr ck_fun fstu% S?
-crypt crypt ck_fun fst@ S S
-ucfirst upper case first ck_fun_locale fstu% S?
-lcfirst lower case first ck_fun_locale fstu% S?
-uc upper case ck_fun_locale fstu% S?
-lc lower case ck_fun_locale fstu% S?
-quotemeta quote metachars ck_fun fstu% S?
+ord ord ck_fun ifsTu% S?
+chr chr ck_fun fsTu% S?
+crypt crypt ck_fun fsT@ S S
+ucfirst ucfirst ck_fun_locale fstu% S?
+lcfirst lcfirst ck_fun_locale fstu% S?
+uc uc ck_fun_locale fstu% S?
+lc lc ck_fun_locale fstu% S?
+quotemeta quotemeta ck_fun fstu% S?
# Arrays.
-rv2av array deref ck_rvconst dt1
-aelemfast known array element ck_null s* A S
+rv2av array dereference ck_rvconst dt1
+aelemfast constant array element ck_null s$ A S
aelem array element ck_null s2 A S
aslice array slice ck_null m@ A L
# Hashes.
-each each ck_fun t% H
+each each ck_fun % H
values values ck_fun t% H
keys keys ck_fun t% H
delete delete ck_delete % S
-exists exists operator ck_exists is% S
-rv2hv hash deref ck_rvconst dt1
-helem hash elem ck_null s2@ H S
+exists exists ck_exists is% S
+rv2hv hash dereference ck_rvconst dt1
+helem hash element ck_null s2@ H S
hslice hash slice ck_null m@ H L
# Explosives and implosives.
@@ -421,20 +533,20 @@ hslice hash slice ck_null m@ H L
unpack unpack ck_fun @ S S
pack pack ck_fun mst@ S L
split split ck_split t@ S S S
-join join ck_fun mst@ S L
+join join ck_join mst@ S L
# List operators.
list list ck_null m@ L
lslice list slice ck_null 2 H L L
-anonlist anonymous list ck_fun ms@ L
-anonhash anonymous hash ck_fun ms@ L
+anonlist anonymous list ([]) ck_fun ms@ L
+anonhash anonymous hash ({}) ck_fun ms@ L
splice splice ck_fun m@ A S? S? L
-push push ck_fun imst@ A L
+push push ck_fun imsT@ A L
pop pop ck_shift s% A
shift shift ck_shift s% A
-unshift unshift ck_fun imst@ A L
+unshift unshift ck_fun imsT@ A L
sort sort ck_sort m@ C? L
reverse reverse ck_fun mt@ L
@@ -446,26 +558,27 @@ mapwhile map iterator ck_null dt|
# Range stuff.
-range flipflop ck_null ? S S
+range flipflop ck_null | S S
flip range (or flip) ck_null 1 S S
flop range (or flop) ck_null 1
# Control.
-and logical and ck_null |
-or logical or ck_null |
-xor logical xor ck_null fs| S S
-cond_expr conditional expression ck_null d?
-andassign logical and assignment ck_null s|
-orassign logical or assignment ck_null s|
+and logical and (&&) ck_null |
+or logical or (||) ck_null |
+xor logical xor ck_null fs2 S S
+cond_expr conditional expression ck_null d|
+andassign logical and assignment (&&=) ck_null s|
+orassign logical or assignment (||=) ck_null s|
-method method lookup ck_null d1
+method method lookup ck_method d1
entersub subroutine entry ck_subr dmt1 L
leavesub subroutine exit ck_null 1
+leavesublv lvalue subroutine exit ck_null 1
caller caller ck_fun t% S?
warn warn ck_fun imst@ L
die die ck_fun dimst@ L
-reset reset ck_fun is% S?
+reset symbol reset ck_fun is% S?
lineseq line sequence ck_null @
nextstate next statement ck_null s;
@@ -484,20 +597,21 @@ next next ck_null ds}
redo redo ck_null ds}
dump dump ck_null ds}
goto goto ck_null ds}
-exit exit ck_fun ds% S?
+exit exit ck_exit ds% S?
+# continued below
-#nswitch numeric switch ck_null d
-#cswitch character switch ck_null d
+#nswitch numeric switch ck_null d
+#cswitch character switch ck_null d
# I/O.
-open open ck_fun ist@ F S?
+open open ck_open ist@ F S? L
close close ck_fun is% F?
pipe_op pipe ck_fun is@ F F
fileno fileno ck_fun ist% F
umask umask ck_fun ist% S?
-binmode binmode ck_fun s% F
+binmode binmode ck_fun s@ F S?
tie tie ck_fun idms@ R S L
untie untie ck_fun is% R
@@ -532,7 +646,7 @@ truncate truncate ck_trunc is@ S S
fcntl fcntl ck_fun st@ F S S
ioctl ioctl ck_fun st@ F S S
-flock flock ck_fun ist@ F S
+flock flock ck_fun isT@ F S
# Sockets.
@@ -585,18 +699,18 @@ ftbinary -B ck_ftst isu- F
# File calls.
-chdir chdir ck_fun ist% S?
-chown chown ck_fun imst@ L
-chroot chroot ck_fun istu% S?
-unlink unlink ck_fun imstu@ L
-chmod chmod ck_fun imst@ L
-utime utime ck_fun imst@ L
-rename rename ck_fun ist@ S S
-link link ck_fun ist@ S S
-symlink symlink ck_fun ist@ S S
+chdir chdir ck_fun isT% S?
+chown chown ck_fun imsT@ L
+chroot chroot ck_fun isTu% S?
+unlink unlink ck_fun imsTu@ L
+chmod chmod ck_fun imsT@ L
+utime utime ck_fun imsT@ L
+rename rename ck_fun isT@ S S
+link link ck_fun isT@ S S
+symlink symlink ck_fun isT@ S S
readlink readlink ck_fun stu% S?
-mkdir mkdir ck_fun ist@ S S
-rmdir rmdir ck_fun istu% S?
+mkdir mkdir ck_fun isT@ S S?
+rmdir rmdir ck_fun isTu% S?
# Directory calls.
@@ -610,25 +724,29 @@ closedir closedir ck_fun is% F
# Process control.
fork fork ck_null ist0
-wait wait ck_null ist0
-waitpid waitpid ck_fun ist@ S S
-system system ck_exec imst@ S? L
-exec exec ck_exec dimst@ S? L
-kill kill ck_fun dimst@ L
-getppid getppid ck_null ist0
-getpgrp getpgrp ck_fun ist% S?
-setpgrp setpgrp ck_fun ist@ S? S?
-getpriority getpriority ck_fun ist@ S S
-setpriority setpriority ck_fun ist@ S S S
+wait wait ck_null isT0
+waitpid waitpid ck_fun isT@ S S
+system system ck_exec imsT@ S? L
+exec exec ck_exec dimsT@ S? L
+kill kill ck_fun dimsT@ L
+getppid getppid ck_null isT0
+getpgrp getpgrp ck_fun isT% S?
+setpgrp setpgrp ck_fun isT@ S? S?
+getpriority getpriority ck_fun isT@ S S
+setpriority setpriority ck_fun isT@ S S S
# Time calls.
-time time ck_null ist0
+# NOTE: MacOS patches the 'i' of time() away later when the interpreter
+# is created because in MacOS time() is already returning times > 2**31-1,
+# that is, non-integers.
+
+time time ck_null isT0
tms times ck_null 0
localtime localtime ck_fun t% S?
gmtime gmtime ck_fun t% S?
alarm alarm ck_fun istu% S?
-sleep sleep ck_fun ist% S?
+sleep sleep ck_fun isT% S?
# Shared memory.
@@ -653,12 +771,12 @@ semop semop ck_fun imst@ S S
# Eval.
require require ck_require du% S?
-dofile do 'file' ck_fun d1 S
-entereval eval string ck_eval d% S
-leaveeval eval exit ck_null 1 S
+dofile do "file" ck_fun d1 S
+entereval eval "string" ck_eval d% S
+leaveeval eval "string" exit ck_null 1 S
#evalonce eval constant string ck_null d1 S
-entertry eval block ck_null |
-leavetry eval block exit ck_null @
+entertry eval {block} ck_null |
+leavetry eval {block} exit ck_null @
# Get system info.
@@ -700,4 +818,8 @@ syscall syscall ck_fun imst@ S L
# For multi-threading
lock lock ck_rfun s% S
-threadsv per-thread variable ck_null ds0
+threadsv per-thread value ck_null ds0
+
+# Control (contd.)
+setstate set statement info ck_null s;
+method_named method with known name ck_null d$
diff --git a/contrib/perl5/opnames.h b/contrib/perl5/opnames.h
new file mode 100644
index 0000000..e9f8b4f
--- /dev/null
+++ b/contrib/perl5/opnames.h
@@ -0,0 +1,362 @@
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
+typedef enum opcode {
+ OP_NULL, /* 0 */
+ OP_STUB, /* 1 */
+ OP_SCALAR, /* 2 */
+ OP_PUSHMARK, /* 3 */
+ OP_WANTARRAY, /* 4 */
+ OP_CONST, /* 5 */
+ OP_GVSV, /* 6 */
+ OP_GV, /* 7 */
+ OP_GELEM, /* 8 */
+ OP_PADSV, /* 9 */
+ OP_PADAV, /* 10 */
+ OP_PADHV, /* 11 */
+ OP_PADANY, /* 12 */
+ OP_PUSHRE, /* 13 */
+ OP_RV2GV, /* 14 */
+ OP_RV2SV, /* 15 */
+ OP_AV2ARYLEN, /* 16 */
+ OP_RV2CV, /* 17 */
+ OP_ANONCODE, /* 18 */
+ OP_PROTOTYPE, /* 19 */
+ OP_REFGEN, /* 20 */
+ OP_SREFGEN, /* 21 */
+ OP_REF, /* 22 */
+ OP_BLESS, /* 23 */
+ OP_BACKTICK, /* 24 */
+ OP_GLOB, /* 25 */
+ OP_READLINE, /* 26 */
+ OP_RCATLINE, /* 27 */
+ OP_REGCMAYBE, /* 28 */
+ OP_REGCRESET, /* 29 */
+ OP_REGCOMP, /* 30 */
+ OP_MATCH, /* 31 */
+ OP_QR, /* 32 */
+ OP_SUBST, /* 33 */
+ OP_SUBSTCONT, /* 34 */
+ OP_TRANS, /* 35 */
+ OP_SASSIGN, /* 36 */
+ OP_AASSIGN, /* 37 */
+ OP_CHOP, /* 38 */
+ OP_SCHOP, /* 39 */
+ OP_CHOMP, /* 40 */
+ OP_SCHOMP, /* 41 */
+ OP_DEFINED, /* 42 */
+ OP_UNDEF, /* 43 */
+ OP_STUDY, /* 44 */
+ OP_POS, /* 45 */
+ OP_PREINC, /* 46 */
+ OP_I_PREINC, /* 47 */
+ OP_PREDEC, /* 48 */
+ OP_I_PREDEC, /* 49 */
+ OP_POSTINC, /* 50 */
+ OP_I_POSTINC, /* 51 */
+ OP_POSTDEC, /* 52 */
+ OP_I_POSTDEC, /* 53 */
+ OP_POW, /* 54 */
+ OP_MULTIPLY, /* 55 */
+ OP_I_MULTIPLY, /* 56 */
+ OP_DIVIDE, /* 57 */
+ OP_I_DIVIDE, /* 58 */
+ OP_MODULO, /* 59 */
+ OP_I_MODULO, /* 60 */
+ OP_REPEAT, /* 61 */
+ OP_ADD, /* 62 */
+ OP_I_ADD, /* 63 */
+ OP_SUBTRACT, /* 64 */
+ OP_I_SUBTRACT, /* 65 */
+ OP_CONCAT, /* 66 */
+ OP_STRINGIFY, /* 67 */
+ OP_LEFT_SHIFT, /* 68 */
+ OP_RIGHT_SHIFT, /* 69 */
+ OP_LT, /* 70 */
+ OP_I_LT, /* 71 */
+ OP_GT, /* 72 */
+ OP_I_GT, /* 73 */
+ OP_LE, /* 74 */
+ OP_I_LE, /* 75 */
+ OP_GE, /* 76 */
+ OP_I_GE, /* 77 */
+ OP_EQ, /* 78 */
+ OP_I_EQ, /* 79 */
+ OP_NE, /* 80 */
+ OP_I_NE, /* 81 */
+ OP_NCMP, /* 82 */
+ OP_I_NCMP, /* 83 */
+ OP_SLT, /* 84 */
+ OP_SGT, /* 85 */
+ OP_SLE, /* 86 */
+ OP_SGE, /* 87 */
+ OP_SEQ, /* 88 */
+ OP_SNE, /* 89 */
+ OP_SCMP, /* 90 */
+ OP_BIT_AND, /* 91 */
+ OP_BIT_XOR, /* 92 */
+ OP_BIT_OR, /* 93 */
+ OP_NEGATE, /* 94 */
+ OP_I_NEGATE, /* 95 */
+ OP_NOT, /* 96 */
+ OP_COMPLEMENT, /* 97 */
+ OP_ATAN2, /* 98 */
+ OP_SIN, /* 99 */
+ OP_COS, /* 100 */
+ OP_RAND, /* 101 */
+ OP_SRAND, /* 102 */
+ OP_EXP, /* 103 */
+ OP_LOG, /* 104 */
+ OP_SQRT, /* 105 */
+ OP_INT, /* 106 */
+ OP_HEX, /* 107 */
+ OP_OCT, /* 108 */
+ OP_ABS, /* 109 */
+ OP_LENGTH, /* 110 */
+ OP_SUBSTR, /* 111 */
+ OP_VEC, /* 112 */
+ OP_INDEX, /* 113 */
+ OP_RINDEX, /* 114 */
+ OP_SPRINTF, /* 115 */
+ OP_FORMLINE, /* 116 */
+ OP_ORD, /* 117 */
+ OP_CHR, /* 118 */
+ OP_CRYPT, /* 119 */
+ OP_UCFIRST, /* 120 */
+ OP_LCFIRST, /* 121 */
+ OP_UC, /* 122 */
+ OP_LC, /* 123 */
+ OP_QUOTEMETA, /* 124 */
+ OP_RV2AV, /* 125 */
+ OP_AELEMFAST, /* 126 */
+ OP_AELEM, /* 127 */
+ OP_ASLICE, /* 128 */
+ OP_EACH, /* 129 */
+ OP_VALUES, /* 130 */
+ OP_KEYS, /* 131 */
+ OP_DELETE, /* 132 */
+ OP_EXISTS, /* 133 */
+ OP_RV2HV, /* 134 */
+ OP_HELEM, /* 135 */
+ OP_HSLICE, /* 136 */
+ OP_UNPACK, /* 137 */
+ OP_PACK, /* 138 */
+ OP_SPLIT, /* 139 */
+ OP_JOIN, /* 140 */
+ OP_LIST, /* 141 */
+ OP_LSLICE, /* 142 */
+ OP_ANONLIST, /* 143 */
+ OP_ANONHASH, /* 144 */
+ OP_SPLICE, /* 145 */
+ OP_PUSH, /* 146 */
+ OP_POP, /* 147 */
+ OP_SHIFT, /* 148 */
+ OP_UNSHIFT, /* 149 */
+ OP_SORT, /* 150 */
+ OP_REVERSE, /* 151 */
+ OP_GREPSTART, /* 152 */
+ OP_GREPWHILE, /* 153 */
+ OP_MAPSTART, /* 154 */
+ OP_MAPWHILE, /* 155 */
+ OP_RANGE, /* 156 */
+ OP_FLIP, /* 157 */
+ OP_FLOP, /* 158 */
+ OP_AND, /* 159 */
+ OP_OR, /* 160 */
+ OP_XOR, /* 161 */
+ OP_COND_EXPR, /* 162 */
+ OP_ANDASSIGN, /* 163 */
+ OP_ORASSIGN, /* 164 */
+ OP_METHOD, /* 165 */
+ OP_ENTERSUB, /* 166 */
+ OP_LEAVESUB, /* 167 */
+ OP_LEAVESUBLV, /* 168 */
+ OP_CALLER, /* 169 */
+ OP_WARN, /* 170 */
+ OP_DIE, /* 171 */
+ OP_RESET, /* 172 */
+ OP_LINESEQ, /* 173 */
+ OP_NEXTSTATE, /* 174 */
+ OP_DBSTATE, /* 175 */
+ OP_UNSTACK, /* 176 */
+ OP_ENTER, /* 177 */
+ OP_LEAVE, /* 178 */
+ OP_SCOPE, /* 179 */
+ OP_ENTERITER, /* 180 */
+ OP_ITER, /* 181 */
+ OP_ENTERLOOP, /* 182 */
+ OP_LEAVELOOP, /* 183 */
+ OP_RETURN, /* 184 */
+ OP_LAST, /* 185 */
+ OP_NEXT, /* 186 */
+ OP_REDO, /* 187 */
+ OP_DUMP, /* 188 */
+ OP_GOTO, /* 189 */
+ OP_EXIT, /* 190 */
+ OP_OPEN, /* 191 */
+ OP_CLOSE, /* 192 */
+ OP_PIPE_OP, /* 193 */
+ OP_FILENO, /* 194 */
+ OP_UMASK, /* 195 */
+ OP_BINMODE, /* 196 */
+ OP_TIE, /* 197 */
+ OP_UNTIE, /* 198 */
+ OP_TIED, /* 199 */
+ OP_DBMOPEN, /* 200 */
+ OP_DBMCLOSE, /* 201 */
+ OP_SSELECT, /* 202 */
+ OP_SELECT, /* 203 */
+ OP_GETC, /* 204 */
+ OP_READ, /* 205 */
+ OP_ENTERWRITE, /* 206 */
+ OP_LEAVEWRITE, /* 207 */
+ OP_PRTF, /* 208 */
+ OP_PRINT, /* 209 */
+ OP_SYSOPEN, /* 210 */
+ OP_SYSSEEK, /* 211 */
+ OP_SYSREAD, /* 212 */
+ OP_SYSWRITE, /* 213 */
+ OP_SEND, /* 214 */
+ OP_RECV, /* 215 */
+ OP_EOF, /* 216 */
+ OP_TELL, /* 217 */
+ OP_SEEK, /* 218 */
+ OP_TRUNCATE, /* 219 */
+ OP_FCNTL, /* 220 */
+ OP_IOCTL, /* 221 */
+ OP_FLOCK, /* 222 */
+ OP_SOCKET, /* 223 */
+ OP_SOCKPAIR, /* 224 */
+ OP_BIND, /* 225 */
+ OP_CONNECT, /* 226 */
+ OP_LISTEN, /* 227 */
+ OP_ACCEPT, /* 228 */
+ OP_SHUTDOWN, /* 229 */
+ OP_GSOCKOPT, /* 230 */
+ OP_SSOCKOPT, /* 231 */
+ OP_GETSOCKNAME, /* 232 */
+ OP_GETPEERNAME, /* 233 */
+ OP_LSTAT, /* 234 */
+ OP_STAT, /* 235 */
+ OP_FTRREAD, /* 236 */
+ OP_FTRWRITE, /* 237 */
+ OP_FTREXEC, /* 238 */
+ OP_FTEREAD, /* 239 */
+ OP_FTEWRITE, /* 240 */
+ OP_FTEEXEC, /* 241 */
+ OP_FTIS, /* 242 */
+ OP_FTEOWNED, /* 243 */
+ OP_FTROWNED, /* 244 */
+ OP_FTZERO, /* 245 */
+ OP_FTSIZE, /* 246 */
+ OP_FTMTIME, /* 247 */
+ OP_FTATIME, /* 248 */
+ OP_FTCTIME, /* 249 */
+ OP_FTSOCK, /* 250 */
+ OP_FTCHR, /* 251 */
+ OP_FTBLK, /* 252 */
+ OP_FTFILE, /* 253 */
+ OP_FTDIR, /* 254 */
+ OP_FTPIPE, /* 255 */
+ OP_FTLINK, /* 256 */
+ OP_FTSUID, /* 257 */
+ OP_FTSGID, /* 258 */
+ OP_FTSVTX, /* 259 */
+ OP_FTTTY, /* 260 */
+ OP_FTTEXT, /* 261 */
+ OP_FTBINARY, /* 262 */
+ OP_CHDIR, /* 263 */
+ OP_CHOWN, /* 264 */
+ OP_CHROOT, /* 265 */
+ OP_UNLINK, /* 266 */
+ OP_CHMOD, /* 267 */
+ OP_UTIME, /* 268 */
+ OP_RENAME, /* 269 */
+ OP_LINK, /* 270 */
+ OP_SYMLINK, /* 271 */
+ OP_READLINK, /* 272 */
+ OP_MKDIR, /* 273 */
+ OP_RMDIR, /* 274 */
+ OP_OPEN_DIR, /* 275 */
+ OP_READDIR, /* 276 */
+ OP_TELLDIR, /* 277 */
+ OP_SEEKDIR, /* 278 */
+ OP_REWINDDIR, /* 279 */
+ OP_CLOSEDIR, /* 280 */
+ OP_FORK, /* 281 */
+ OP_WAIT, /* 282 */
+ OP_WAITPID, /* 283 */
+ OP_SYSTEM, /* 284 */
+ OP_EXEC, /* 285 */
+ OP_KILL, /* 286 */
+ OP_GETPPID, /* 287 */
+ OP_GETPGRP, /* 288 */
+ OP_SETPGRP, /* 289 */
+ OP_GETPRIORITY, /* 290 */
+ OP_SETPRIORITY, /* 291 */
+ OP_TIME, /* 292 */
+ OP_TMS, /* 293 */
+ OP_LOCALTIME, /* 294 */
+ OP_GMTIME, /* 295 */
+ OP_ALARM, /* 296 */
+ OP_SLEEP, /* 297 */
+ OP_SHMGET, /* 298 */
+ OP_SHMCTL, /* 299 */
+ OP_SHMREAD, /* 300 */
+ OP_SHMWRITE, /* 301 */
+ OP_MSGGET, /* 302 */
+ OP_MSGCTL, /* 303 */
+ OP_MSGSND, /* 304 */
+ OP_MSGRCV, /* 305 */
+ OP_SEMGET, /* 306 */
+ OP_SEMCTL, /* 307 */
+ OP_SEMOP, /* 308 */
+ OP_REQUIRE, /* 309 */
+ OP_DOFILE, /* 310 */
+ OP_ENTEREVAL, /* 311 */
+ OP_LEAVEEVAL, /* 312 */
+ OP_ENTERTRY, /* 313 */
+ OP_LEAVETRY, /* 314 */
+ OP_GHBYNAME, /* 315 */
+ OP_GHBYADDR, /* 316 */
+ OP_GHOSTENT, /* 317 */
+ OP_GNBYNAME, /* 318 */
+ OP_GNBYADDR, /* 319 */
+ OP_GNETENT, /* 320 */
+ OP_GPBYNAME, /* 321 */
+ OP_GPBYNUMBER, /* 322 */
+ OP_GPROTOENT, /* 323 */
+ OP_GSBYNAME, /* 324 */
+ OP_GSBYPORT, /* 325 */
+ OP_GSERVENT, /* 326 */
+ OP_SHOSTENT, /* 327 */
+ OP_SNETENT, /* 328 */
+ OP_SPROTOENT, /* 329 */
+ OP_SSERVENT, /* 330 */
+ OP_EHOSTENT, /* 331 */
+ OP_ENETENT, /* 332 */
+ OP_EPROTOENT, /* 333 */
+ OP_ESERVENT, /* 334 */
+ OP_GPWNAM, /* 335 */
+ OP_GPWUID, /* 336 */
+ OP_GPWENT, /* 337 */
+ OP_SPWENT, /* 338 */
+ OP_EPWENT, /* 339 */
+ OP_GGRNAM, /* 340 */
+ OP_GGRGID, /* 341 */
+ OP_GGRENT, /* 342 */
+ OP_SGRENT, /* 343 */
+ OP_EGRENT, /* 344 */
+ OP_GETLOGIN, /* 345 */
+ OP_SYSCALL, /* 346 */
+ OP_LOCK, /* 347 */
+ OP_THREADSV, /* 348 */
+ OP_SETSTATE, /* 349 */
+ OP_METHOD_NAMED,/* 350 */
+ OP_max
+} opcode;
+
+#define MAXO 351
+
diff --git a/contrib/perl5/patchlevel.h b/contrib/perl5/patchlevel.h
index cbf0b1d..f95db63 100644
--- a/contrib/perl5/patchlevel.h
+++ b/contrib/perl5/patchlevel.h
@@ -1,7 +1,36 @@
#ifndef __PATCHLEVEL_H_INCLUDED__
-#define PATCHLEVEL 5
-#undef SUBVERSION /* OS/390 has a SUBVERSION in a system header */
-#define SUBVERSION 3
+
+/* do not adjust the whitespace! Configure expects the numbers to be
+ * exactly on the third column */
+
+#define PERL_REVISION 5 /* age */
+#define PERL_VERSION 6 /* epoch */
+#define PERL_SUBVERSION 0 /* generation */
+
+/* The following numbers describe the earliest compatible version of
+ Perl ("compatibility" here being defined as sufficient binary/API
+ compatibility to run XS code built with the older version).
+ Normally this should not change across maintenance releases.
+
+ Note that this only refers to an out-of-the-box build. Many non-default
+ options such as usemultiplicity tend to break binary compatibility
+ more often.
+
+ This is used by Configure et al to figure out
+ PERL_INC_VERSION_LIST, which lists version libraries
+ to include in @INC. See INSTALL for how this works.
+*/
+#define PERL_API_REVISION 5 /* Adjust manually as needed. */
+#define PERL_API_VERSION 5 /* Adjust manually as needed. */
+#define PERL_API_SUBVERSION 0 /* Adjust manually as needed. */
+/*
+ XXX Note: The selection of non-default Configure options, such
+ as -Duselonglong may invalidate these settings. Currently, Configure
+ does not adequately test for this. A.D. Jan 13, 2000
+*/
+
+#define __PATCHLEVEL_H_INCLUDED__
+#endif
/*
local_patches -- list of locally applied less-than-subversion patches.
@@ -38,6 +67,7 @@
This will prevent patch from choking if someone has previously
applied different patches than you.
*/
+#if !defined(PERL_PATCHLEVEL_H_IMPLICIT) && !defined(LOCAL_PATCH_COUNT)
static char *local_patches[] = {
NULL
,NULL
@@ -47,5 +77,8 @@ static char *local_patches[] = {
# define LOCAL_PATCH_COUNT \
(sizeof(local_patches)/sizeof(local_patches[0])-2)
-# define __PATCHLEVEL_H_INCLUDED__
+/* the old terms of reference, add them only when explicitly included */
+#define PATCHLEVEL PERL_VERSION
+#undef SUBVERSION /* OS/390 has a SUBVERSION in a system header */
+#define SUBVERSION PERL_SUBVERSION
#endif
diff --git a/contrib/perl5/perl.c b/contrib/perl5/perl.c
index cc1f7ed..578fafc 100644
--- a/contrib/perl5/perl.c
+++ b/contrib/perl5/perl.c
@@ -1,6 +1,6 @@
/* perl.c
*
- * Copyright (c) 1987-1999 Larry Wall
+ * Copyright (c) 1987-2000 Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -12,8 +12,9 @@
*/
#include "EXTERN.h"
+#define PERL_IN_PERL_C
#include "perl.h"
-#include "patchlevel.h"
+#include "patchlevel.h" /* for local_patches */
/* XXX If this causes problems, set i_unistd=undef in the hint file. */
#ifdef I_UNISTD
@@ -21,15 +22,10 @@
#endif
#if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
-char *getenv _((char *)); /* Usually in <stdlib.h> */
+char *getenv (char *); /* Usually in <stdlib.h> */
#endif
-#ifdef I_FCNTL
-#include <fcntl.h>
-#endif
-#ifdef I_SYS_FILE
-#include <sys/file.h>
-#endif
+static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
#ifdef IAMSUID
#ifndef DOSUID
@@ -44,92 +40,133 @@ char *getenv _((char *)); /* Usually in <stdlib.h> */
#endif
#ifdef PERL_OBJECT
-static I32 read_e_script _((CPerlObj* pPerl, int idx, SV *buf_sv, int maxlen));
+#define perl_construct Perl_construct
+#define perl_parse Perl_parse
+#define perl_run Perl_run
+#define perl_destruct Perl_destruct
+#define perl_free Perl_free
+#endif
+
+#if defined(USE_THREADS)
+# define INIT_TLS_AND_INTERP \
+ STMT_START { \
+ if (!PL_curinterp) { \
+ PERL_SET_INTERP(my_perl); \
+ INIT_THREADS; \
+ ALLOC_THREAD_KEY; \
+ } \
+ } STMT_END
#else
-static void find_beginning _((void));
-static void forbid_setid _((char *));
-static void incpush _((char *, int));
-static void init_interp _((void));
-static void init_ids _((void));
-static void init_debugger _((void));
-static void init_lexer _((void));
-static void init_main_stash _((void));
-#ifdef USE_THREADS
-static struct perl_thread * init_main_thread _((void));
-#endif /* USE_THREADS */
-static void init_perllib _((void));
-static void init_postdump_symbols _((int, char **, char **));
-static void init_predump_symbols _((void));
-static void my_exit_jump _((void)) __attribute__((noreturn));
-static void nuke_stacks _((void));
-static void open_script _((char *, bool, SV *, int *fd));
-static void usage _((char *));
-#ifdef IAMSUID
-static int fd_on_nosuid_fs _((int));
-#endif
-static void validate_suid _((char *, char*, int));
-static I32 read_e_script _((int idx, SV *buf_sv, int maxlen));
+# if defined(USE_ITHREADS)
+# define INIT_TLS_AND_INTERP \
+ STMT_START { \
+ if (!PL_curinterp) { \
+ PERL_SET_INTERP(my_perl); \
+ INIT_THREADS; \
+ ALLOC_THREAD_KEY; \
+ PERL_SET_THX(my_perl); \
+ OP_REFCNT_INIT; \
+ } \
+ else { \
+ PERL_SET_THX(my_perl); \
+ } \
+ } STMT_END
+# else
+# define INIT_TLS_AND_INTERP \
+ STMT_START { \
+ if (!PL_curinterp) { \
+ PERL_SET_INTERP(my_perl); \
+ } \
+ PERL_SET_THX(my_perl); \
+ } STMT_END
+# endif
#endif
-#ifdef PERL_OBJECT
-CPerlObj* perl_alloc(IPerlMem* ipM, IPerlEnv* ipE, IPerlStdIO* ipStd,
- IPerlLIO* ipLIO, IPerlDir* ipD, IPerlSock* ipS, IPerlProc* ipP)
+#ifdef PERL_IMPLICIT_SYS
+PerlInterpreter *
+perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
+ struct IPerlMem* ipMP, struct IPerlEnv* ipE,
+ struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
+ struct IPerlDir* ipD, struct IPerlSock* ipS,
+ struct IPerlProc* ipP)
{
- CPerlObj* pPerl = new(ipM) CPerlObj(ipM, ipE, ipStd, ipLIO, ipD, ipS, ipP);
- if(pPerl != NULL)
- pPerl->Init();
-
- return pPerl;
+ PerlInterpreter *my_perl;
+#ifdef PERL_OBJECT
+ my_perl = (PerlInterpreter*)new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd,
+ ipLIO, ipD, ipS, ipP);
+ INIT_TLS_AND_INTERP;
+#else
+ /* New() needs interpreter, so call malloc() instead */
+ my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
+ INIT_TLS_AND_INTERP;
+ Zero(my_perl, 1, PerlInterpreter);
+ PL_Mem = ipM;
+ PL_MemShared = ipMS;
+ PL_MemParse = ipMP;
+ PL_Env = ipE;
+ PL_StdIO = ipStd;
+ PL_LIO = ipLIO;
+ PL_Dir = ipD;
+ PL_Sock = ipS;
+ PL_Proc = ipP;
+#endif
+
+ return my_perl;
}
#else
+
+/*
+=for apidoc perl_alloc
+
+Allocates a new Perl interpreter. See L<perlembed>.
+
+=cut
+*/
+
PerlInterpreter *
perl_alloc(void)
{
- PerlInterpreter *sv_interp;
+ PerlInterpreter *my_perl;
+
+ /* New() needs interpreter, so call malloc() instead */
+ my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
- PL_curinterp = 0;
- New(53, sv_interp, 1, PerlInterpreter);
- return sv_interp;
+ INIT_TLS_AND_INTERP;
+ Zero(my_perl, 1, PerlInterpreter);
+ return my_perl;
}
-#endif /* PERL_OBJECT */
+#endif /* PERL_IMPLICIT_SYS */
+
+/*
+=for apidoc perl_construct
+
+Initializes a new Perl interpreter. See L<perlembed>.
+
+=cut
+*/
void
-#ifdef PERL_OBJECT
-CPerlObj::perl_construct(void)
-#else
-perl_construct(register PerlInterpreter *sv_interp)
-#endif
+perl_construct(pTHXx)
{
#ifdef USE_THREADS
int i;
#ifndef FAKE_THREADS
- struct perl_thread *thr;
+ struct perl_thread *thr = NULL;
#endif /* FAKE_THREADS */
#endif /* USE_THREADS */
-
-#ifndef PERL_OBJECT
- if (!(PL_curinterp = sv_interp))
- return;
-#endif
#ifdef MULTIPLICITY
- ++PL_ninterps;
- Zero(sv_interp, 1, PerlInterpreter);
+ init_interp();
+ PL_perl_destruct_level = 1;
+#else
+ if (PL_perl_destruct_level > 0)
+ init_interp();
#endif
/* Init the real globals (and main thread)? */
if (!PL_linestr) {
#ifdef USE_THREADS
-
- INIT_THREADS;
-#ifdef ALLOC_THREAD_KEY
- ALLOC_THREAD_KEY;
-#else
- if (pthread_key_create(&PL_thr_key, 0))
- croak("panic: pthread_key_create");
-#endif
MUTEX_INIT(&PL_sv_mutex);
- MUTEX_INIT(&PL_cred_mutex);
/*
* Safe to use basic SV functions from now on (though
* not things like mortals or tainting yet).
@@ -138,13 +175,21 @@ perl_construct(register PerlInterpreter *sv_interp)
COND_INIT(&PL_eval_cond);
MUTEX_INIT(&PL_threads_mutex);
COND_INIT(&PL_nthreads_cond);
-#ifdef EMULATE_ATOMIC_REFCOUNTS
+# ifdef EMULATE_ATOMIC_REFCOUNTS
MUTEX_INIT(&PL_svref_mutex);
-#endif /* EMULATE_ATOMIC_REFCOUNTS */
+# endif /* EMULATE_ATOMIC_REFCOUNTS */
+ MUTEX_INIT(&PL_cred_mutex);
+
thr = init_main_thread();
#endif /* USE_THREADS */
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
+#endif
+
+ PL_curcop = &PL_compiling; /* needed by ckWARN, right away */
+
PL_linestr = NEWSV(65,79);
sv_upgrade(PL_linestr,SVt_PVIV);
@@ -170,7 +215,7 @@ perl_construct(register PerlInterpreter *sv_interp)
/* TODO: */
/* PL_sighandlerp = sighandler; */
#else
- PL_sighandlerp = sighandler;
+ PL_sighandlerp = Perl_sighandler;
#endif
PL_pidstatus = newHV();
@@ -185,36 +230,43 @@ perl_construct(register PerlInterpreter *sv_interp)
#endif
}
- PL_nrs = newSVpv("\n", 1);
+ PL_nrs = newSVpvn("\n", 1);
PL_rs = SvREFCNT_inc(PL_nrs);
- init_stacks(ARGS);
-#ifdef MULTIPLICITY
- init_interp();
- PL_perl_destruct_level = 1;
-#else
- if (PL_perl_destruct_level > 0)
- init_interp();
-#endif
+ init_stacks();
init_ids();
PL_lex_state = LEX_NOTPARSING;
- PL_start_env.je_prev = NULL;
- PL_start_env.je_ret = -1;
- PL_start_env.je_mustcatch = TRUE;
- PL_top_env = &PL_start_env;
+ JMPENV_BOOTSTRAP;
STATUS_ALL_SUCCESS;
+ init_i18nl10n(1);
SET_NUMERIC_STANDARD();
-#if defined(SUBVERSION) && SUBVERSION > 0
- sprintf(PL_patchlevel, "%7.5f", (double) 5
- + ((double) PATCHLEVEL / (double) 1000)
- + ((double) SUBVERSION / (double) 100000));
-#else
- sprintf(PL_patchlevel, "%5.3f", (double) 5 +
- ((double) PATCHLEVEL / (double) 1000));
-#endif
+
+ {
+ U8 *s;
+ PL_patchlevel = NEWSV(0,4);
+ (void)SvUPGRADE(PL_patchlevel, SVt_PVNV);
+ if (PERL_REVISION > 127 || PERL_VERSION > 127 || PERL_SUBVERSION > 127)
+ SvGROW(PL_patchlevel, UTF8_MAXLEN*3+1);
+ s = (U8*)SvPVX(PL_patchlevel);
+ s = uv_to_utf8(s, (UV)PERL_REVISION);
+ s = uv_to_utf8(s, (UV)PERL_VERSION);
+ s = uv_to_utf8(s, (UV)PERL_SUBVERSION);
+ *s = '\0';
+ SvCUR_set(PL_patchlevel, s - (U8*)SvPVX(PL_patchlevel));
+ SvPOK_on(PL_patchlevel);
+ SvNVX(PL_patchlevel) = (NV)PERL_REVISION
+ + ((NV)PERL_VERSION / (NV)1000)
+#if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
+ + ((NV)PERL_SUBVERSION / (NV)1000000)
+#endif
+ ;
+ SvNOK_on(PL_patchlevel); /* dual valued */
+ SvUTF8_on(PL_patchlevel);
+ SvREADONLY_on(PL_patchlevel);
+ }
#if defined(LOCAL_PATCH_COUNT)
PL_localpatches = local_patches; /* For possible -v */
@@ -225,20 +277,19 @@ perl_construct(register PerlInterpreter *sv_interp)
PL_fdpid = newAV(); /* for remembering popen pids by fd */
PL_modglobal = newHV(); /* pointers to per-interpreter module globals */
- DEBUG( {
- New(51,PL_debname,128,char);
- New(52,PL_debdelim,128,char);
- } )
-
ENTER;
}
+/*
+=for apidoc perl_destruct
+
+Shuts down a Perl interpreter. See L<perlembed>.
+
+=cut
+*/
+
void
-#ifdef PERL_OBJECT
-CPerlObj::perl_destruct(void)
-#else
-perl_destruct(register PerlInterpreter *sv_interp)
-#endif
+perl_destruct(pTHXx)
{
dTHR;
int destruct_level; /* 0=none, 1=full, 2=full with checks */
@@ -246,19 +297,18 @@ perl_destruct(register PerlInterpreter *sv_interp)
HV *hv;
#ifdef USE_THREADS
Thread t;
+ dTHX;
#endif /* USE_THREADS */
-#ifndef PERL_OBJECT
- if (!(PL_curinterp = sv_interp))
- return;
-#endif
+ /* wait for all pseudo-forked children to finish */
+ PERL_WAIT_FOR_CHILDREN;
#ifdef USE_THREADS
#ifndef FAKE_THREADS
/* Pass 1 on any remaining threads: detach joinables, join zombies */
retry_cleanup:
MUTEX_LOCK(&PL_threads_mutex);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"perl_destruct: waiting for %d threads...\n",
PL_nthreads - 1));
for (t = thr->next; t != thr; t = t->next) {
@@ -266,7 +316,7 @@ perl_destruct(register PerlInterpreter *sv_interp)
switch (ThrSTATE(t)) {
AV *av;
case THRf_ZOMBIE:
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"perl_destruct: joining zombie %p\n", t));
ThrSETSTATE(t, THRf_DEAD);
MUTEX_UNLOCK(&t->mutex);
@@ -280,11 +330,11 @@ perl_destruct(register PerlInterpreter *sv_interp)
MUTEX_UNLOCK(&PL_threads_mutex);
JOIN(t, &av);
SvREFCNT_dec((SV*)av);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"perl_destruct: joined zombie %p OK\n", t));
goto retry_cleanup;
case THRf_R_JOINABLE:
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"perl_destruct: detaching thread %p\n", t));
ThrSETSTATE(t, THRf_R_DETACHED);
/*
@@ -298,7 +348,7 @@ perl_destruct(register PerlInterpreter *sv_interp)
MUTEX_UNLOCK(&t->mutex);
goto retry_cleanup;
default:
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"perl_destruct: ignoring %p (state %u)\n",
t, ThrSTATE(t)));
MUTEX_UNLOCK(&t->mutex);
@@ -310,14 +360,14 @@ perl_destruct(register PerlInterpreter *sv_interp)
/* Pass 2 on remaining threads: wait for the thread count to drop to one */
while (PL_nthreads > 1)
{
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"perl_destruct: final wait for %d threads\n",
PL_nthreads - 1));
COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
}
/* At this point, we're the last thread */
MUTEX_UNLOCK(&PL_threads_mutex);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "perl_destruct: armageddon has arrived\n"));
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
MUTEX_DESTROY(&PL_threads_mutex);
COND_DESTROY(&PL_nthreads_cond);
#endif /* !defined(FAKE_THREADS) */
@@ -327,7 +377,7 @@ perl_destruct(register PerlInterpreter *sv_interp)
#ifdef DEBUGGING
{
char *s;
- if (s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL")) {
+ if ((s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"))) {
int i = atoi(s);
if (destruct_level < i)
destruct_level = i;
@@ -338,10 +388,6 @@ perl_destruct(register PerlInterpreter *sv_interp)
LEAVE;
FREETMPS;
-#ifdef MULTIPLICITY
- --PL_ninterps;
-#endif
-
/* We must account for everything. */
/* Destroy the main CV and syntax tree */
@@ -354,6 +400,7 @@ perl_destruct(register PerlInterpreter *sv_interp)
PL_main_start = Nullop;
SvREFCNT_dec(PL_main_cv);
PL_main_cv = Nullcv;
+ PL_dirty = TRUE;
if (PL_sv_objcount) {
/*
@@ -361,8 +408,6 @@ perl_destruct(register PerlInterpreter *sv_interp)
* destructors and destructees still exist. Some sv's might remain.
* Non-referenced objects are on their own.
*/
-
- PL_dirty = TRUE;
sv_clean_objs();
}
@@ -371,12 +416,10 @@ perl_destruct(register PerlInterpreter *sv_interp)
PL_warnhook = Nullsv;
SvREFCNT_dec(PL_diehook);
PL_diehook = Nullsv;
- SvREFCNT_dec(PL_parsehook);
- PL_parsehook = Nullsv;
/* call exit list functions */
while (PL_exitlistlen-- > 0)
- PL_exitlist[PL_exitlistlen].fn(PERL_OBJECT_THIS_ PL_exitlist[PL_exitlistlen].ptr);
+ PL_exitlist[PL_exitlistlen].fn(aTHXo_ PL_exitlist[PL_exitlistlen].ptr);
Safefree(PL_exitlist);
@@ -407,15 +450,14 @@ perl_destruct(register PerlInterpreter *sv_interp)
PL_minus_a = FALSE;
PL_minus_F = FALSE;
PL_doswitches = FALSE;
- PL_dowarn = FALSE;
+ PL_dowarn = G_WARN_OFF;
PL_doextract = FALSE;
PL_sawampersand = FALSE; /* must save all match strings */
- PL_sawstudy = FALSE; /* do fbm_instr on all strings */
- PL_sawvec = FALSE;
PL_unsafe = FALSE;
Safefree(PL_inplace);
PL_inplace = Nullch;
+ SvREFCNT_dec(PL_patchlevel);
if (PL_e_script) {
SvREFCNT_dec(PL_e_script);
@@ -424,10 +466,10 @@ perl_destruct(register PerlInterpreter *sv_interp)
/* magical thingies */
- Safefree(PL_ofs); /* $, */
+ Safefree(PL_ofs); /* $, */
PL_ofs = Nullch;
- Safefree(PL_ors); /* $\ */
+ Safefree(PL_ors); /* $\ */
PL_ors = Nullch;
SvREFCNT_dec(PL_rs); /* $/ */
@@ -436,7 +478,9 @@ perl_destruct(register PerlInterpreter *sv_interp)
SvREFCNT_dec(PL_nrs); /* $/ helper */
PL_nrs = Nullsv;
- PL_multiline = 0; /* $* */
+ PL_multiline = 0; /* $* */
+ Safefree(PL_osname); /* $^O */
+ PL_osname = Nullch;
SvREFCNT_dec(PL_statname);
PL_statname = Nullsv;
@@ -452,61 +496,157 @@ perl_destruct(register PerlInterpreter *sv_interp)
Safefree(PL_screamnext);
PL_screamnext = 0;
+ /* float buffer */
+ Safefree(PL_efloatbuf);
+ PL_efloatbuf = Nullch;
+ PL_efloatsize = 0;
+
/* startup and shutdown function lists */
SvREFCNT_dec(PL_beginav);
SvREFCNT_dec(PL_endav);
+ SvREFCNT_dec(PL_checkav);
SvREFCNT_dec(PL_initav);
PL_beginav = Nullav;
PL_endav = Nullav;
+ PL_checkav = Nullav;
PL_initav = Nullav;
/* shortcuts just get cleared */
PL_envgv = Nullgv;
- PL_siggv = Nullgv;
PL_incgv = Nullgv;
PL_hintgv = Nullgv;
PL_errgv = Nullgv;
PL_argvgv = Nullgv;
PL_argvoutgv = Nullgv;
PL_stdingv = Nullgv;
+ PL_stderrgv = Nullgv;
PL_last_in_gv = Nullgv;
PL_replgv = Nullgv;
+ PL_debstash = Nullhv;
/* reset so print() ends up where we expect */
setdefout(Nullgv);
+ SvREFCNT_dec(PL_argvout_stack);
+ PL_argvout_stack = Nullav;
+
+ SvREFCNT_dec(PL_modglobal);
+ PL_modglobal = Nullhv;
+ SvREFCNT_dec(PL_preambleav);
+ PL_preambleav = Nullav;
+ SvREFCNT_dec(PL_subname);
+ PL_subname = Nullsv;
+ SvREFCNT_dec(PL_linestr);
+ PL_linestr = Nullsv;
+ SvREFCNT_dec(PL_pidstatus);
+ PL_pidstatus = Nullhv;
+ SvREFCNT_dec(PL_toptarget);
+ PL_toptarget = Nullsv;
+ SvREFCNT_dec(PL_bodytarget);
+ PL_bodytarget = Nullsv;
+ PL_formtarget = Nullsv;
+
+ /* free locale stuff */
+#ifdef USE_LOCALE_COLLATE
+ Safefree(PL_collation_name);
+ PL_collation_name = Nullch;
+#endif
+
+#ifdef USE_LOCALE_NUMERIC
+ Safefree(PL_numeric_name);
+ PL_numeric_name = Nullch;
+#endif
+
+ /* clear utf8 character classes */
+ SvREFCNT_dec(PL_utf8_alnum);
+ SvREFCNT_dec(PL_utf8_alnumc);
+ SvREFCNT_dec(PL_utf8_ascii);
+ SvREFCNT_dec(PL_utf8_alpha);
+ SvREFCNT_dec(PL_utf8_space);
+ SvREFCNT_dec(PL_utf8_cntrl);
+ SvREFCNT_dec(PL_utf8_graph);
+ SvREFCNT_dec(PL_utf8_digit);
+ SvREFCNT_dec(PL_utf8_upper);
+ SvREFCNT_dec(PL_utf8_lower);
+ SvREFCNT_dec(PL_utf8_print);
+ SvREFCNT_dec(PL_utf8_punct);
+ SvREFCNT_dec(PL_utf8_xdigit);
+ SvREFCNT_dec(PL_utf8_mark);
+ SvREFCNT_dec(PL_utf8_toupper);
+ SvREFCNT_dec(PL_utf8_tolower);
+ PL_utf8_alnum = Nullsv;
+ PL_utf8_alnumc = Nullsv;
+ PL_utf8_ascii = Nullsv;
+ PL_utf8_alpha = Nullsv;
+ PL_utf8_space = Nullsv;
+ PL_utf8_cntrl = Nullsv;
+ PL_utf8_graph = Nullsv;
+ PL_utf8_digit = Nullsv;
+ PL_utf8_upper = Nullsv;
+ PL_utf8_lower = Nullsv;
+ PL_utf8_print = Nullsv;
+ PL_utf8_punct = Nullsv;
+ PL_utf8_xdigit = Nullsv;
+ PL_utf8_mark = Nullsv;
+ PL_utf8_toupper = Nullsv;
+ PL_utf8_totitle = Nullsv;
+ PL_utf8_tolower = Nullsv;
+
+ if (!specialWARN(PL_compiling.cop_warnings))
+ SvREFCNT_dec(PL_compiling.cop_warnings);
+ PL_compiling.cop_warnings = Nullsv;
+#ifndef USE_ITHREADS
+ SvREFCNT_dec(CopFILEGV(&PL_compiling));
+ CopFILEGV_set(&PL_compiling, Nullgv);
+#endif
+
/* Prepare to destruct main symbol table. */
hv = PL_defstash;
PL_defstash = 0;
SvREFCNT_dec(hv);
+ SvREFCNT_dec(PL_curstname);
+ PL_curstname = Nullsv;
+
+ /* clear queued errors */
+ SvREFCNT_dec(PL_errors);
+ PL_errors = Nullsv;
FREETMPS;
- if (destruct_level >= 2) {
+ if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
if (PL_scopestack_ix != 0)
- warn("Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
+ Perl_warner(aTHX_ WARN_INTERNAL,
+ "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
(long)PL_scopestack_ix);
if (PL_savestack_ix != 0)
- warn("Unbalanced saves: %ld more saves than restores\n",
+ Perl_warner(aTHX_ WARN_INTERNAL,
+ "Unbalanced saves: %ld more saves than restores\n",
(long)PL_savestack_ix);
if (PL_tmps_floor != -1)
- warn("Unbalanced tmps: %ld more allocs than frees\n",
+ Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced tmps: %ld more allocs than frees\n",
(long)PL_tmps_floor + 1);
if (cxstack_ix != -1)
- warn("Unbalanced context: %ld more PUSHes than POPs\n",
+ Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced context: %ld more PUSHes than POPs\n",
(long)cxstack_ix + 1);
}
/* Now absolutely destruct everything, somehow or other, loops or no. */
last_sv_count = 0;
+ SvFLAGS(PL_fdpid) |= SVTYPEMASK; /* don't clean out pid table now */
SvFLAGS(PL_strtab) |= SVTYPEMASK; /* don't clean out strtab now */
while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
last_sv_count = PL_sv_count;
sv_clean_all();
}
+ SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
+ SvFLAGS(PL_fdpid) |= SVt_PVAV;
SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
SvFLAGS(PL_strtab) |= SVt_PVHV;
-
+
+ AvREAL_off(PL_fdpid); /* no surviving entries */
+ SvREFCNT_dec(PL_fdpid); /* needed in io_close() */
+ PL_fdpid = Nullav;
+
/* Destruct the global string table. */
{
/* Yell and reset the HeVAL() slots that are still holding refcounts,
@@ -522,8 +662,9 @@ perl_destruct(register PerlInterpreter *sv_interp)
array = HvARRAY(PL_strtab);
hent = array[0];
for (;;) {
- if (hent) {
- warn("Unbalanced string table refcount: (%d) for \"%s\"",
+ if (hent && ckWARN_d(WARN_INTERNAL)) {
+ Perl_warner(aTHX_ WARN_INTERNAL,
+ "Unbalanced string table refcount: (%d) for \"%s\"",
HeVAL(hent) - Nullsv, HeKEY(hent));
HeVAL(hent) = Nullsv;
hent = HeNEXT(hent);
@@ -537,17 +678,32 @@ perl_destruct(register PerlInterpreter *sv_interp)
}
SvREFCNT_dec(PL_strtab);
- if (PL_sv_count != 0)
- warn("Scalars leaked: %ld\n", (long)PL_sv_count);
+ /* free special SVs */
+
+ SvREFCNT(&PL_sv_yes) = 0;
+ sv_clear(&PL_sv_yes);
+ SvANY(&PL_sv_yes) = NULL;
+ SvFLAGS(&PL_sv_yes) = 0;
+
+ SvREFCNT(&PL_sv_no) = 0;
+ sv_clear(&PL_sv_no);
+ SvANY(&PL_sv_no) = NULL;
+ SvFLAGS(&PL_sv_no) = 0;
+
+ SvREFCNT(&PL_sv_undef) = 0;
+ SvREADONLY_off(&PL_sv_undef);
+
+ if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL,"Scalars leaked: %ld\n", (long)PL_sv_count);
sv_free_arenas();
/* No SVs have survived, need to clean out */
- PL_linestr = NULL;
- PL_pidstatus = Nullhv;
Safefree(PL_origfilename);
- Safefree(PL_archpat_auto);
Safefree(PL_reg_start_tmp);
+ if (PL_reg_curpm)
+ Safefree(PL_reg_curpm);
+ Safefree(PL_reg_poscache);
Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
Safefree(PL_op_mask);
nuke_stacks();
@@ -557,8 +713,8 @@ perl_destruct(register PerlInterpreter *sv_interp)
#ifdef USE_THREADS
MUTEX_DESTROY(&PL_strtab_mutex);
MUTEX_DESTROY(&PL_sv_mutex);
- MUTEX_DESTROY(&PL_cred_mutex);
MUTEX_DESTROY(&PL_eval_mutex);
+ MUTEX_DESTROY(&PL_cred_mutex);
COND_DESTROY(&PL_eval_cond);
#ifdef EMULATE_ATOMIC_REFCOUNTS
MUTEX_DESTROY(&PL_svref_mutex);
@@ -570,7 +726,7 @@ perl_destruct(register PerlInterpreter *sv_interp)
Safefree(PL_thrsv);
PL_thrsv = Nullsv;
#endif /* USE_THREADS */
-
+
/* As the absolutely last thing, free the non-arena SV for mess() */
if (PL_mess_sv) {
@@ -586,7 +742,7 @@ perl_destruct(register PerlInterpreter *sv_interp)
}
}
/* we know that type >= SVt_PV */
- SvOOK_off(PL_mess_sv);
+ (void)SvOOK_off(PL_mess_sv);
Safefree(SvPVX(PL_mess_sv));
Safefree(SvANY(PL_mess_sv));
Safefree(PL_mess_sv);
@@ -594,28 +750,32 @@ perl_destruct(register PerlInterpreter *sv_interp)
}
}
+/*
+=for apidoc perl_free
+
+Releases a Perl interpreter. See L<perlembed>.
+
+=cut
+*/
+
void
-#ifdef PERL_OBJECT
-CPerlObj::perl_free(void)
-#else
-perl_free(PerlInterpreter *sv_interp)
-#endif
+perl_free(pTHXx)
{
-#ifdef PERL_OBJECT
- Safefree(this);
+#if defined(PERL_OBJECT)
+ PerlMem_free(this);
#else
- if (!(PL_curinterp = sv_interp))
- return;
- Safefree(sv_interp);
+# if defined(PERL_IMPLICIT_SYS) && defined(WIN32)
+ void *host = w32_internal_host;
+ PerlMem_free(aTHXx);
+ win32_delete_internal_host(host);
+# else
+ PerlMem_free(aTHXx);
+# endif
#endif
}
void
-#ifdef PERL_OBJECT
-CPerlObj::perl_atexit(void (*fn) (CPerlObj*,void *), void *ptr)
-#else
-perl_atexit(void (*fn) (void *), void *ptr)
-#endif
+Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
{
Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
PL_exitlist[PL_exitlistlen].fn = fn;
@@ -623,39 +783,34 @@ perl_atexit(void (*fn) (void *), void *ptr)
++PL_exitlistlen;
}
+/*
+=for apidoc perl_parse
+
+Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
+
+=cut
+*/
+
int
-#ifdef PERL_OBJECT
-CPerlObj::perl_parse(void (*xsinit) (CPerlObj*), int argc, char **argv, char **env)
-#else
-perl_parse(PerlInterpreter *sv_interp, void (*xsinit) (void), int argc, char **argv, char **env)
-#endif
+perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
{
dTHR;
- register SV *sv;
- register char *s;
- char *scriptname = NULL;
- VOL bool dosearch = FALSE;
- char *validarg = "";
I32 oldscope;
- AV* comppadlist;
- dJMPENV;
int ret;
- int fdscript = -1;
+ dJMPENV;
+#ifdef USE_THREADS
+ dTHX;
+#endif
#ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
#ifdef IAMSUID
#undef IAMSUID
- croak("suidperl is no longer needed since the kernel can now execute\n\
+ Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
setuid perl scripts securely.\n");
#endif
#endif
-#ifndef PERL_OBJECT
- if (!(PL_curinterp = sv_interp))
- return 255;
-#endif
-
-#if defined(NeXT) && defined(__DYNAMIC__)
+#if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
_dyld_lookup_and_bind
("__environ", (unsigned long *) &environ_pointer, NULL);
#endif /* environ */
@@ -689,9 +844,22 @@ setuid perl scripts securely.\n");
time(&PL_basetime);
oldscope = PL_scopestack_ix;
+ PL_dowarn = G_WARN_OFF;
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
+#else
JMPENV_PUSH(ret);
+#endif
switch (ret) {
+ case 0:
+#ifndef PERL_FLEXIBLE_EXCEPTIONS
+ parse_body(env,xsinit);
+#endif
+ if (PL_checkav)
+ call_list(oldscope, PL_checkav);
+ ret = 0;
+ break;
case 1:
STATUS_ALL_FAILURE;
/* FALL THROUGH */
@@ -701,18 +869,47 @@ setuid perl scripts securely.\n");
LEAVE;
FREETMPS;
PL_curstash = PL_defstash;
- if (PL_endav)
- call_list(oldscope, PL_endav);
- JMPENV_POP;
- return STATUS_NATIVE_EXPORT;
+ if (PL_checkav)
+ call_list(oldscope, PL_checkav);
+ ret = STATUS_NATIVE_EXPORT;
+ break;
case 3:
- JMPENV_POP;
- PerlIO_printf(PerlIO_stderr(), "panic: top_env\n");
- return 1;
+ PerlIO_printf(Perl_error_log, "panic: top_env\n");
+ ret = 1;
+ break;
}
+ JMPENV_POP;
+ return ret;
+}
+
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+STATIC void *
+S_vparse_body(pTHX_ va_list args)
+{
+ char **env = va_arg(args, char**);
+ XSINIT_t xsinit = va_arg(args, XSINIT_t);
+
+ return parse_body(env, xsinit);
+}
+#endif
+
+STATIC void *
+S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
+{
+ dTHR;
+ int argc = PL_origargc;
+ char **argv = PL_origargv;
+ char *scriptname = NULL;
+ int fdscript = -1;
+ VOL bool dosearch = FALSE;
+ char *validarg = "";
+ AV* comppadlist;
+ register SV *sv;
+ register char *s;
+ char *cddir = Nullch;
sv_setpvn(PL_linestr,"",0);
- sv = newSVpv("",0); /* first used for -I flags */
+ sv = newSVpvn("",0); /* first used for -I flags */
SAVEFREESV(sv);
init_main_stash();
@@ -728,6 +925,11 @@ setuid perl scripts securely.\n");
s = argv[0]+1;
reswitch:
switch (*s) {
+ case 'C':
+#ifdef WIN32
+ win32_argv2utf8(argc-1, argv+1);
+ /* FALL THROUGH */
+#endif
#ifndef PERL_STRICT_CR
case '\r':
#endif
@@ -749,8 +951,10 @@ setuid perl scripts securely.\n");
case 'u':
case 'U':
case 'v':
+ case 'W':
+ case 'X':
case 'w':
- if (s = moreswitches(s))
+ if ((s = moreswitches(s)))
goto reswitch;
break;
@@ -761,9 +965,9 @@ setuid perl scripts securely.\n");
case 'e':
if (PL_euid != PL_uid || PL_egid != PL_gid)
- croak("No -e allowed in setuid scripts");
+ Perl_croak(aTHX_ "No -e allowed in setuid scripts");
if (!PL_e_script) {
- PL_e_script = newSVpv("",0);
+ PL_e_script = newSVpvn("",0);
filter_add(read_e_script, NULL);
}
if (*++s)
@@ -773,7 +977,7 @@ setuid perl scripts securely.\n");
argc--,argv++;
}
else
- croak("No code specified for -e");
+ Perl_croak(aTHX_ "No code specified for -e");
sv_catpv(PL_e_script, "\n");
break;
@@ -782,18 +986,18 @@ setuid perl scripts securely.\n");
if (!*++s && (s=argv[1]) != Nullch) {
argc--,argv++;
}
- while (s && isSPACE(*s))
- ++s;
if (s && *s) {
- char *e, *p;
- for (e = s; *e && !isSPACE(*e); e++) ;
- p = savepvn(s, e-s);
- incpush(p, TRUE);
- sv_catpv(sv,"-I");
- sv_catpv(sv,p);
- sv_catpv(sv," ");
+ char *p;
+ STRLEN len = strlen(s);
+ p = savepvn(s, len);
+ incpush(p, TRUE, TRUE);
+ sv_catpvn(sv, "-I", 2);
+ sv_catpvn(sv, p, len);
+ sv_catpvn(sv, " ", 1);
Safefree(p);
- } /* XXX else croak? */
+ }
+ else
+ Perl_croak(aTHX_ "No directory specified for -I");
break;
case 'P':
forbid_setid("-P");
@@ -816,35 +1020,61 @@ setuid perl scripts securely.\n");
#else
sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
#endif
-#if defined(DEBUGGING) || defined(NO_EMBED) || defined(MULTIPLICITY)
sv_catpv(PL_Sv,"\" Compile-time options:");
# ifdef DEBUGGING
sv_catpv(PL_Sv," DEBUGGING");
# endif
-# ifdef NO_EMBED
- sv_catpv(PL_Sv," NO_EMBED");
-# endif
# ifdef MULTIPLICITY
sv_catpv(PL_Sv," MULTIPLICITY");
# endif
+# ifdef USE_THREADS
+ sv_catpv(PL_Sv," USE_THREADS");
+# endif
+# ifdef USE_ITHREADS
+ sv_catpv(PL_Sv," USE_ITHREADS");
+# endif
+# ifdef USE_64_BIT_INT
+ sv_catpv(PL_Sv," USE_64_BIT_INT");
+# endif
+# ifdef USE_64_BIT_ALL
+ sv_catpv(PL_Sv," USE_64_BIT_ALL");
+# endif
+# ifdef USE_LONG_DOUBLE
+ sv_catpv(PL_Sv," USE_LONG_DOUBLE");
+# endif
+# ifdef USE_LARGE_FILES
+ sv_catpv(PL_Sv," USE_LARGE_FILES");
+# endif
+# ifdef USE_SOCKS
+ sv_catpv(PL_Sv," USE_SOCKS");
+# endif
+# ifdef PERL_OBJECT
+ sv_catpv(PL_Sv," PERL_OBJECT");
+# endif
+# ifdef PERL_IMPLICIT_CONTEXT
+ sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
+# endif
+# ifdef PERL_IMPLICIT_SYS
+ sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
+# endif
sv_catpv(PL_Sv,"\\n\",");
-#endif
+
#if defined(LOCAL_PATCH_COUNT)
if (LOCAL_PATCH_COUNT > 0) {
int i;
sv_catpv(PL_Sv,"\" Locally applied patches:\\n\",");
for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
if (PL_localpatches[i])
- sv_catpvf(PL_Sv,"\" \\t%s\\n\",",PL_localpatches[i]);
+ Perl_sv_catpvf(aTHX_ PL_Sv,"q\" \t%s\n\",",PL_localpatches[i]);
}
}
#endif
- sv_catpvf(PL_Sv,"\" Built under %s\\n\"",OSNAME);
+ Perl_sv_catpvf(aTHX_ PL_Sv,"\" Built under %s\\n\"",OSNAME);
#ifdef __DATE__
# ifdef __TIME__
- sv_catpvf(PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
+ Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled at %s %s\\n\"",__DATE__,__TIME__);
# else
- sv_catpvf(PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
+ Perl_sv_catpvf(aTHX_ PL_Sv,",\" Compiled on %s\\n\"",__DATE__);
# endif
#endif
sv_catpv(PL_Sv, "; \
@@ -866,7 +1096,7 @@ print \" \\@INC:\\n @INC\\n\";");
PL_doextract = TRUE;
s++;
if (*s)
- PL_cddir = savepv(s);
+ cddir = s;
break;
case 0:
break;
@@ -887,25 +1117,36 @@ print \" \\@INC:\\n @INC\\n\";");
s--;
/* FALL THROUGH */
default:
- croak("Unrecognized switch: -%s (-h will show valid options)",s);
+ Perl_croak(aTHX_ "Unrecognized switch: -%s (-h will show valid options)",s);
}
}
switch_end:
- if (!PL_tainting && (s = PerlEnv_getenv("PERL5OPT"))) {
- while (s && *s) {
- while (isSPACE(*s))
- s++;
- if (*s == '-') {
- s++;
- if (isSPACE(*s))
- continue;
+ if (
+#ifndef SECURE_INTERNAL_GETENV
+ !PL_tainting &&
+#endif
+ (s = PerlEnv_getenv("PERL5OPT")))
+ {
+ while (isSPACE(*s))
+ s++;
+ if (*s == '-' && *(s+1) == 'T')
+ PL_tainting = TRUE;
+ else {
+ while (s && *s) {
+ while (isSPACE(*s))
+ s++;
+ if (*s == '-') {
+ s++;
+ if (isSPACE(*s))
+ continue;
+ }
+ if (!*s)
+ break;
+ if (!strchr("DIMUdmw", *s))
+ Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
+ s = moreswitches(s);
}
- if (!*s)
- break;
- if (!strchr("DIMUdmw", *s))
- croak("Illegal switch in PERL5OPT: -%c", *s);
- s = moreswitches(s);
}
}
@@ -929,8 +1170,27 @@ print \" \\@INC:\\n @INC\\n\";");
validate_suid(validarg, scriptname,fdscript);
- if (PL_doextract)
+#if defined(SIGCHLD) || defined(SIGCLD)
+ {
+#ifndef SIGCHLD
+# define SIGCHLD SIGCLD
+#endif
+ Sighandler_t sigstate = rsignal_state(SIGCHLD);
+ if (sigstate == SIG_IGN) {
+ if (ckWARN(WARN_SIGNAL))
+ Perl_warner(aTHX_ WARN_SIGNAL,
+ "Can't ignore signal CHLD, forcing to default");
+ (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
+ }
+ }
+#endif
+
+ if (PL_doextract) {
find_beginning();
+ if (cddir && PerlDir_chdir(cddir) < 0)
+ Perl_croak(aTHX_ "Can't chdir to %s",cddir);
+
+ }
PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
sv_upgrade((SV *)PL_compcv, SVt_PVCV);
@@ -944,7 +1204,7 @@ print \" \\@INC:\\n @INC\\n\";");
PL_min_intro_pending = 0;
PL_padix = 0;
#ifdef USE_THREADS
- av_store(PL_comppad_name, 0, newSVpv("@_", 2));
+ av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
PL_curpad[0] = (SV*)newAV();
SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
CvOWNER(PL_compcv) = 0;
@@ -959,13 +1219,20 @@ print \" \\@INC:\\n @INC\\n\";");
CvPADLIST(PL_compcv) = comppadlist;
boot_core_UNIVERSAL();
+#ifndef PERL_MICRO
+ boot_core_xsutils();
+#endif
if (xsinit)
- (*xsinit)(PERL_OBJECT_THIS); /* in case linked C routines want magical variables */
-#if defined(VMS) || defined(WIN32) || defined(DJGPP)
+ (*xsinit)(aTHXo); /* in case linked C routines want magical variables */
+#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__)
init_os_extras();
#endif
+#ifdef USE_SOCKS
+ SOCKSinit(argv[0]);
+#endif
+
init_predump_symbols();
/* init_postdump_symbols not currently designed to be called */
/* more than once (ENV isn't cleared first, for example) */
@@ -981,13 +1248,13 @@ print \" \\@INC:\\n @INC\\n\";");
PL_error_count = 0;
if (yyparse() || PL_error_count) {
if (PL_minus_c)
- croak("%s had compilation errors.\n", PL_origfilename);
+ Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
else {
- croak("Execution of %s aborted due to compilation errors.\n",
- PL_origfilename);
+ Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
+ PL_origfilename);
}
}
- PL_curcop->cop_line = 0;
+ CopLINE_set(PL_curcop, 0);
PL_curstash = PL_defstash;
PL_preprocess = FALSE;
if (PL_e_script) {
@@ -998,12 +1265,15 @@ print \" \\@INC:\\n @INC\\n\";");
/* now that script is parsed, we can modify record separator */
SvREFCNT_dec(PL_rs);
PL_rs = SvREFCNT_inc(PL_nrs);
- sv_setsv(perl_get_sv("/", TRUE), PL_rs);
+ sv_setsv(get_sv("/", TRUE), PL_rs);
if (PL_do_undump)
my_unexec();
- if (PL_dowarn)
+ if (isWARN_ONCE) {
+ SAVECOPFILE(PL_curcop);
+ SAVECOPLINE(PL_curcop);
gv_check(PL_defstash);
+ }
LEAVE;
FREETMPS;
@@ -1015,74 +1285,105 @@ print \" \\@INC:\\n @INC\\n\";");
ENTER;
PL_restartop = 0;
- JMPENV_POP;
- return 0;
+ return NULL;
}
+/*
+=for apidoc perl_run
+
+Tells a Perl interpreter to run. See L<perlembed>.
+
+=cut
+*/
+
int
-#ifdef PERL_OBJECT
-CPerlObj::perl_run(void)
-#else
-perl_run(PerlInterpreter *sv_interp)
-#endif
+perl_run(pTHXx)
{
- dSP;
+ dTHR;
I32 oldscope;
+ int ret = 0;
dJMPENV;
- int ret;
-
-#ifndef PERL_OBJECT
- if (!(PL_curinterp = sv_interp))
- return 255;
+#ifdef USE_THREADS
+ dTHX;
#endif
oldscope = PL_scopestack_ix;
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
+#else
JMPENV_PUSH(ret);
+#endif
switch (ret) {
case 1:
cxstack_ix = -1; /* start context stack again */
- break;
- case 2:
- /* my_exit() was called */
+ goto redo_body;
+ case 0: /* normal completion */
+#ifndef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ run_body(oldscope);
+#endif
+ /* FALL THROUGH */
+ case 2: /* my_exit() */
while (PL_scopestack_ix > oldscope)
LEAVE;
FREETMPS;
PL_curstash = PL_defstash;
- if (PL_endav)
+ if (PL_endav && !PL_minus_c)
call_list(oldscope, PL_endav);
#ifdef MYMALLOC
if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
dump_mstats("after execution: ");
#endif
- JMPENV_POP;
- return STATUS_NATIVE_EXPORT;
+ ret = STATUS_NATIVE_EXPORT;
+ break;
case 3:
- if (!PL_restartop) {
- PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
- FREETMPS;
- JMPENV_POP;
- return 1;
+ if (PL_restartop) {
+ POPSTACK_TO(PL_mainstack);
+ goto redo_body;
}
- POPSTACK_TO(PL_mainstack);
+ PerlIO_printf(Perl_error_log, "panic: restartop\n");
+ FREETMPS;
+ ret = 1;
break;
}
+ JMPENV_POP;
+ return ret;
+}
+
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+STATIC void *
+S_vrun_body(pTHX_ va_list args)
+{
+ I32 oldscope = va_arg(args, I32);
+
+ return run_body(oldscope);
+}
+#endif
+
+
+STATIC void *
+S_run_body(pTHX_ I32 oldscope)
+{
+ dTHR;
+
DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
PL_sawampersand ? "Enabling" : "Omitting"));
if (!PL_restartop) {
DEBUG_x(dump_all());
DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
- DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%lx\n",
- (unsigned long) thr));
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
+ PTR2UV(thr)));
if (PL_minus_c) {
- PerlIO_printf(PerlIO_stderr(), "%s syntax OK\n", PL_origfilename);
+ PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
my_exit(0);
}
if (PERLDB_SINGLE && PL_DBsingle)
- sv_setiv(PL_DBsingle, 1);
+ sv_setiv(PL_DBsingle, 1);
if (PL_initav)
call_list(oldscope, PL_initav);
}
@@ -1092,21 +1393,31 @@ perl_run(PerlInterpreter *sv_interp)
if (PL_restartop) {
PL_op = PL_restartop;
PL_restartop = 0;
- CALLRUNOPS();
+ CALLRUNOPS(aTHX);
}
else if (PL_main_start) {
CvDEPTH(PL_main_cv) = 1;
PL_op = PL_main_start;
- CALLRUNOPS();
+ CALLRUNOPS(aTHX);
}
my_exit(0);
/* NOTREACHED */
- return 0;
+ return NULL;
}
+/*
+=for apidoc p||get_sv
+
+Returns the SV of the specified Perl scalar. If C<create> is set and the
+Perl variable does not exist then it will be created. If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+=cut
+*/
+
SV*
-perl_get_sv(char *name, I32 create)
+Perl_get_sv(pTHX_ const char *name, I32 create)
{
GV *gv;
#ifdef USE_THREADS
@@ -1124,8 +1435,18 @@ perl_get_sv(char *name, I32 create)
return Nullsv;
}
+/*
+=for apidoc p||get_av
+
+Returns the AV of the specified Perl array. If C<create> is set and the
+Perl variable does not exist then it will be created. If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+=cut
+*/
+
AV*
-perl_get_av(char *name, I32 create)
+Perl_get_av(pTHX_ const char *name, I32 create)
{
GV* gv = gv_fetchpv(name, create, SVt_PVAV);
if (create)
@@ -1135,8 +1456,18 @@ perl_get_av(char *name, I32 create)
return Nullav;
}
+/*
+=for apidoc p||get_hv
+
+Returns the HV of the specified Perl hash. If C<create> is set and the
+Perl variable does not exist then it will be created. If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+=cut
+*/
+
HV*
-perl_get_hv(char *name, I32 create)
+Perl_get_hv(pTHX_ const char *name, I32 create)
{
GV* gv = gv_fetchpv(name, create, SVt_PVHV);
if (create)
@@ -1146,11 +1477,25 @@ perl_get_hv(char *name, I32 create)
return Nullhv;
}
+/*
+=for apidoc p||get_cv
+
+Returns the CV of the specified Perl subroutine. If C<create> is set and
+the Perl subroutine does not exist then it will be declared (which has the
+same effect as saying C<sub name;>). If C<create> is not set and the
+subroutine does not exist then NULL is returned.
+
+=cut
+*/
+
CV*
-perl_get_cv(char *name, I32 create)
+Perl_get_cv(pTHX_ const char *name, I32 create)
{
GV* gv = gv_fetchpv(name, create, SVt_PVCV);
/* XXX unsafe for threads if eval_owner isn't held */
+ /* XXX this is probably not what they think they're getting.
+ * It has the same effect as "sub name;", i.e. just a forward
+ * declaration! */
if (create && !GvCVu(gv))
return newSUB(start_subparse(FALSE, 0),
newSVOP(OP_CONST, 0, newSVpv(name,0)),
@@ -1163,8 +1508,16 @@ perl_get_cv(char *name, I32 create)
/* Be sure to refetch the stack pointer after calling these routines. */
+/*
+=for apidoc p||call_argv
+
+Performs a callback to the specified Perl sub. See L<perlcall>.
+
+=cut
+*/
+
I32
-perl_call_argv(char *sub_name, I32 flags, register char **argv)
+Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
/* See G_* flags in cop.h */
/* null terminated arg list */
@@ -1179,37 +1532,65 @@ perl_call_argv(char *sub_name, I32 flags, register char **argv)
}
PUTBACK;
}
- return perl_call_pv(sub_name, flags);
+ return call_pv(sub_name, flags);
}
+/*
+=for apidoc p||call_pv
+
+Performs a callback to the specified Perl sub. See L<perlcall>.
+
+=cut
+*/
+
I32
-perl_call_pv(char *sub_name, I32 flags)
+Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
/* name of the subroutine */
/* See G_* flags in cop.h */
{
- return perl_call_sv((SV*)perl_get_cv(sub_name, TRUE), flags);
+ return call_sv((SV*)get_cv(sub_name, TRUE), flags);
}
+/*
+=for apidoc p||call_method
+
+Performs a callback to the specified Perl method. The blessed object must
+be on the stack. See L<perlcall>.
+
+=cut
+*/
+
I32
-perl_call_method(char *methname, I32 flags)
+Perl_call_method(pTHX_ const char *methname, I32 flags)
/* name of the subroutine */
/* See G_* flags in cop.h */
{
dSP;
OP myop;
- if (!PL_op)
+ if (!PL_op) {
+ Zero(&myop, 1, OP);
PL_op = &myop;
+ }
XPUSHs(sv_2mortal(newSVpv(methname,0)));
PUTBACK;
- pp_method(ARGS);
- if(PL_op == &myop)
- PL_op = Nullop;
- return perl_call_sv(*PL_stack_sp--, flags);
+ pp_method();
+ if (PL_op == &myop)
+ PL_op = Nullop;
+ return call_sv(*PL_stack_sp--, flags);
}
/* May be called with any of a CV, a GV, or an SV containing the name. */
+/*
+=for apidoc p||call_sv
+
+Performs a callback to the Perl sub whose name is in the SV. See
+L<perlcall>.
+
+=cut
+*/
+
I32
-perl_call_sv(SV *sv, I32 flags)
+Perl_call_sv(pTHX_ SV *sv, I32 flags)
/* See G_* flags in cop.h */
{
@@ -1219,9 +1600,9 @@ perl_call_sv(SV *sv, I32 flags)
I32 retval;
I32 oldscope;
bool oldcatch = CATCH_GET;
- dJMPENV;
int ret;
OP* oldop = PL_op;
+ dJMPENV;
if (flags & G_DISCARD) {
ENTER;
@@ -1252,7 +1633,13 @@ perl_call_sv(SV *sv, I32 flags)
&& !(flags & G_NODEBUG))
PL_op->op_private |= OPpENTERSUB_DB;
- if (flags & G_EVAL) {
+ if (!(flags & G_EVAL)) {
+ CATCH_SET(TRUE);
+ call_body((OP*)&myop, FALSE);
+ retval = PL_stack_sp - (PL_stack_base + oldmark);
+ CATCH_SET(oldcatch);
+ }
+ else {
cLOGOP->op_other = PL_op;
PL_markstack_ptr--;
/* we're trying to emulate pp_entertry() here */
@@ -1264,21 +1651,34 @@ perl_call_sv(SV *sv, I32 flags)
SAVETMPS;
push_return(PL_op->op_next);
- PUSHBLOCK(cx, CXt_EVAL, PL_stack_sp);
+ PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
PUSHEVAL(cx, 0, 0);
PL_eval_root = PL_op; /* Only needed so that goto works right. */
- PL_in_eval = 1;
+ PL_in_eval = EVAL_INEVAL;
if (flags & G_KEEPERR)
- PL_in_eval |= 4;
+ PL_in_eval |= EVAL_KEEPERR;
else
sv_setpv(ERRSV,"");
}
PL_markstack_ptr++;
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
+ (OP*)&myop, FALSE);
+#else
JMPENV_PUSH(ret);
+#endif
switch (ret) {
case 0:
+#ifndef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ call_body((OP*)&myop, FALSE);
+#endif
+ retval = PL_stack_sp - (PL_stack_base + oldmark);
+ if (!(flags & G_KEEPERR))
+ sv_setpv(ERRSV,"");
break;
case 1:
STATUS_ALL_FAILURE;
@@ -1288,15 +1688,15 @@ perl_call_sv(SV *sv, I32 flags)
PL_curstash = PL_defstash;
FREETMPS;
JMPENV_POP;
- if (PL_statusvalue)
- croak("Callback called exit");
+ if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
+ Perl_croak(aTHX_ "Callback called exit");
my_exit_jump();
/* NOTREACHED */
case 3:
if (PL_restartop) {
PL_op = PL_restartop;
PL_restartop = 0;
- break;
+ goto redo_body;
}
PL_stack_sp = PL_stack_base + oldmark;
if (flags & G_ARRAY)
@@ -1305,22 +1705,9 @@ perl_call_sv(SV *sv, I32 flags)
retval = 1;
*++PL_stack_sp = &PL_sv_undef;
}
- goto cleanup;
+ break;
}
- }
- else
- CATCH_SET(TRUE);
-
- if (PL_op == (OP*)&myop)
- PL_op = pp_entersub(ARGS);
- if (PL_op)
- CALLRUNOPS();
- retval = PL_stack_sp - (PL_stack_base + oldmark);
- if ((flags & G_EVAL) && !(flags & G_KEEPERR))
- sv_setpv(ERRSV,"");
- cleanup:
- if (flags & G_EVAL) {
if (PL_scopestack_ix > oldscope) {
SV **newsp;
PMOP *newpm;
@@ -1336,8 +1723,6 @@ perl_call_sv(SV *sv, I32 flags)
}
JMPENV_POP;
}
- else
- CATCH_SET(oldcatch);
if (flags & G_DISCARD) {
PL_stack_sp = PL_stack_base + oldmark;
@@ -1349,10 +1734,45 @@ perl_call_sv(SV *sv, I32 flags)
return retval;
}
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+STATIC void *
+S_vcall_body(pTHX_ va_list args)
+{
+ OP *myop = va_arg(args, OP*);
+ int is_eval = va_arg(args, int);
+
+ call_body(myop, is_eval);
+ return NULL;
+}
+#endif
+
+STATIC void
+S_call_body(pTHX_ OP *myop, int is_eval)
+{
+ dTHR;
+
+ if (PL_op == myop) {
+ if (is_eval)
+ PL_op = Perl_pp_entereval(aTHX);
+ else
+ PL_op = Perl_pp_entersub(aTHX);
+ }
+ if (PL_op)
+ CALLRUNOPS(aTHX);
+}
+
/* Eval a string. The G_EVAL flag is always assumed. */
+/*
+=for apidoc p||eval_sv
+
+Tells Perl to C<eval> the string in the SV.
+
+=cut
+*/
+
I32
-perl_eval_sv(SV *sv, I32 flags)
+Perl_eval_sv(pTHX_ SV *sv, I32 flags)
/* See G_* flags in cop.h */
{
@@ -1361,9 +1781,9 @@ perl_eval_sv(SV *sv, I32 flags)
I32 oldmark = SP - PL_stack_base;
I32 retval;
I32 oldscope;
- dJMPENV;
int ret;
OP* oldop = PL_op;
+ dJMPENV;
if (flags & G_DISCARD) {
ENTER;
@@ -1387,9 +1807,22 @@ perl_eval_sv(SV *sv, I32 flags)
if (flags & G_KEEPERR)
myop.op_flags |= OPf_SPECIAL;
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
+ (OP*)&myop, TRUE);
+#else
JMPENV_PUSH(ret);
+#endif
switch (ret) {
case 0:
+#ifndef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ call_body((OP*)&myop,TRUE);
+#endif
+ retval = PL_stack_sp - (PL_stack_base + oldmark);
+ if (!(flags & G_KEEPERR))
+ sv_setpv(ERRSV,"");
break;
case 1:
STATUS_ALL_FAILURE;
@@ -1399,15 +1832,15 @@ perl_eval_sv(SV *sv, I32 flags)
PL_curstash = PL_defstash;
FREETMPS;
JMPENV_POP;
- if (PL_statusvalue)
- croak("Callback called exit");
+ if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
+ Perl_croak(aTHX_ "Callback called exit");
my_exit_jump();
/* NOTREACHED */
case 3:
if (PL_restartop) {
PL_op = PL_restartop;
PL_restartop = 0;
- break;
+ goto redo_body;
}
PL_stack_sp = PL_stack_base + oldmark;
if (flags & G_ARRAY)
@@ -1416,18 +1849,9 @@ perl_eval_sv(SV *sv, I32 flags)
retval = 1;
*++PL_stack_sp = &PL_sv_undef;
}
- goto cleanup;
+ break;
}
- if (PL_op == (OP*)&myop)
- PL_op = pp_entereval(ARGS);
- if (PL_op)
- CALLRUNOPS();
- retval = PL_stack_sp - (PL_stack_base + oldmark);
- if (!(flags & G_KEEPERR))
- sv_setpv(ERRSV,"");
-
- cleanup:
JMPENV_POP;
if (flags & G_DISCARD) {
PL_stack_sp = PL_stack_base + oldmark;
@@ -1439,14 +1863,22 @@ perl_eval_sv(SV *sv, I32 flags)
return retval;
}
+/*
+=for apidoc p||eval_pv
+
+Tells Perl to C<eval> the given string and return an SV* result.
+
+=cut
+*/
+
SV*
-perl_eval_pv(char *p, I32 croak_on_error)
+Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
{
dSP;
SV* sv = newSVpv(p, 0);
PUSHMARK(SP);
- perl_eval_sv(sv, G_SCALAR);
+ eval_sv(sv, G_SCALAR);
SvREFCNT_dec(sv);
SPAGAIN;
@@ -1455,7 +1887,7 @@ perl_eval_pv(char *p, I32 croak_on_error)
if (croak_on_error && SvTRUE(ERRSV)) {
STRLEN n_a;
- croak(SvPVx(ERRSV, n_a));
+ Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
}
return sv;
@@ -1463,8 +1895,16 @@ perl_eval_pv(char *p, I32 croak_on_error)
/* Require a module. */
+/*
+=for apidoc p||require_pv
+
+Tells Perl to C<require> a module.
+
+=cut
+*/
+
void
-perl_require_pv(char *pv)
+Perl_require_pv(pTHX_ const char *pv)
{
SV* sv;
dSP;
@@ -1474,23 +1914,22 @@ perl_require_pv(char *pv)
sv_setpv(sv, "require '");
sv_catpv(sv, pv);
sv_catpv(sv, "'");
- perl_eval_sv(sv, G_DISCARD);
+ eval_sv(sv, G_DISCARD);
SPAGAIN;
POPSTACK;
}
void
-magicname(char *sym, char *name, I32 namlen)
+Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
{
register GV *gv;
- if (gv = gv_fetchpv(sym,TRUE, SVt_PV))
+ if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
}
STATIC void
-usage(char *name) /* XXX move this out into a module ? */
-
+S_usage(pTHX_ char *name) /* XXX move this out into a module ? */
{
/* This message really ought to be max 23 lines.
* Removed -h because the user already knows that opton. Others? */
@@ -1498,26 +1937,29 @@ usage(char *name) /* XXX move this out into a module ? */
static char *usage_msg[] = {
"-0[octal] specify record separator (\\0, if no argument)",
"-a autosplit mode with -n or -p (splits $_ into @F)",
+"-C enable native wide character system interfaces",
"-c check syntax only (runs BEGIN and END blocks)",
-"-d[:debugger] run scripts under debugger",
-"-D[number/list] set debugging flags (argument is a bit mask or flags)",
-"-e 'command' one line of script. Several -e's allowed. Omit [programfile].",
-"-F/pattern/ split() pattern for autosplit (-a). The //'s are optional.",
-"-i[extension] edit <> files in place (make backup if extension supplied)",
-"-Idirectory specify @INC/#include directory (may be used more than once)",
+"-d[:debugger] run program under debugger",
+"-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
+"-e 'command' one line of program (several -e's allowed, omit programfile)",
+"-F/pattern/ split() pattern for -a switch (//'s are optional)",
+"-i[extension] edit <> files in place (makes backup if extension supplied)",
+"-Idirectory specify @INC/#include directory (several -I's allowed)",
"-l[octal] enable line ending processing, specifies line terminator",
-"-[mM][-]module.. executes `use/no module...' before executing your script.",
-"-n assume 'while (<>) { ... }' loop around your script",
-"-p assume loop like -n but print line also like sed",
-"-P run script through C preprocessor before compilation",
-"-s enable some switch parsing for switches after script name",
-"-S look for the script using PATH environment variable",
-"-T turn on tainting checks",
-"-u dump core after parsing script",
+"-[mM][-]module execute `use/no module...' before executing program",
+"-n assume 'while (<>) { ... }' loop around program",
+"-p assume loop like -n but print line also, like sed",
+"-P run program through C preprocessor before compilation",
+"-s enable rudimentary parsing for switches after programfile",
+"-S look for programfile using PATH environment variable",
+"-T enable tainting checks",
+"-u dump core after parsing program",
"-U allow unsafe operations",
-"-v print version number, patchlevel plus VERY IMPORTANT perl info",
-"-V[:variable] print perl configuration information",
-"-w TURN WARNINGS ON FOR COMPILATION OF YOUR SCRIPT. Recommended.",
+"-v print version, subversion (includes VERY IMPORTANT perl info)",
+"-V[:variable] print configuration summary (or a single Config.pm variable)",
+"-w enable many useful warnings (RECOMMENDED)",
+"-W enable all warnings",
+"-X disable all warnings",
"-x[directory] strip off text before #!perl line and perhaps cd to directory",
"\n",
NULL
@@ -1532,7 +1974,7 @@ NULL
/* This routine handles any switches that can be given during run */
char *
-moreswitches(char *s)
+Perl_moreswitches(pTHX_ char *s)
{
I32 numlen;
U32 rschar;
@@ -1541,18 +1983,22 @@ moreswitches(char *s)
case '0':
{
dTHR;
- rschar = scan_oct(s, 4, &numlen);
+ rschar = (U32)scan_oct(s, 4, &numlen);
SvREFCNT_dec(PL_nrs);
if (rschar & ~((U8)~0))
PL_nrs = &PL_sv_undef;
else if (!rschar && numlen >= 2)
- PL_nrs = newSVpv("", 0);
+ PL_nrs = newSVpvn("", 0);
else {
char ch = rschar;
- PL_nrs = newSVpv(&ch, 1);
+ PL_nrs = newSVpvn(&ch, 1);
}
return s + numlen;
}
+ case 'C':
+ PL_widesyscalls = TRUE;
+ s++;
+ return s;
case 'F':
PL_minus_F = TRUE;
PL_splitstr = savepv(s + 1);
@@ -1570,7 +2016,7 @@ moreswitches(char *s)
forbid_setid("-d");
s++;
if (*s == ':' || *s == '=') {
- my_setenv("PERL5DB", form("use Devel::%s;", ++s));
+ my_setenv("PERL5DB", Perl_form(aTHX_ "use Devel::%s;", ++s));
s += strlen(s);
}
if (!PL_perldb) {
@@ -1579,6 +2025,7 @@ moreswitches(char *s)
}
return s;
case 'D':
+ {
#ifdef DEBUGGING
forbid_setid("-D");
if (isALPHA(s[1])) {
@@ -1594,11 +2041,15 @@ moreswitches(char *s)
}
PL_debug |= 0x80000000;
#else
- warn("Recompile perl with -DDEBUGGING to use -D switch\n");
+ dTHR;
+ if (ckWARN_d(WARN_DEBUGGING))
+ Perl_warner(aTHX_ WARN_DEBUGGING,
+ "Recompile perl with -DDEBUGGING to use -D switch\n");
for (s++; isALNUM(*s); s++) ;
#endif
/*SUPPRESS 530*/
return s;
+ }
case 'h':
usage(PL_origargv[0]);
PerlProc_exit(0);
@@ -1621,14 +2072,23 @@ moreswitches(char *s)
++s;
if (*s) {
char *e, *p;
- for (e = s; *e && !isSPACE(*e); e++) ;
- p = savepvn(s, e-s);
- incpush(p, TRUE);
- Safefree(p);
- s = e;
+ p = s;
+ /* ignore trailing spaces (possibly followed by other switches) */
+ do {
+ for (e = p; *e && !isSPACE(*e); e++) ;
+ p = e;
+ while (isSPACE(*p))
+ p++;
+ } while (*p && *p != '-');
+ e = savepvn(s, e-s);
+ incpush(e, TRUE, TRUE);
+ Safefree(e);
+ s = p;
+ if (*s == '-')
+ s++;
}
else
- croak("No space allowed after -I");
+ Perl_croak(aTHX_ "No directory specified for -I");
return s;
case 'l':
PL_minus_l = TRUE;
@@ -1638,7 +2098,7 @@ moreswitches(char *s)
if (isDIGIT(*s)) {
PL_ors = savepv("\n");
PL_orslen = 1;
- *PL_ors = scan_oct(s, 3 + (*s == '0'), &numlen);
+ *PL_ors = (char)scan_oct(s, 3 + (*s == '0'), &numlen);
s += numlen;
}
else {
@@ -1671,7 +2131,7 @@ moreswitches(char *s)
sv_catpv(sv, start);
if (*(start-1) == 'm') {
if (*s != '\0')
- croak("Can't use '%c' after -mname", *s);
+ Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
sv_catpv( sv, " ()");
}
} else {
@@ -1681,12 +2141,12 @@ moreswitches(char *s)
sv_catpv(sv, "})");
}
s += strlen(s);
- if (PL_preambleav == NULL)
+ if (!PL_preambleav)
PL_preambleav = newAV();
av_push(PL_preambleav, sv);
}
else
- croak("No space allowed after -%c", *(s-1));
+ Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
return s;
case 'n':
PL_minus_n = TRUE;
@@ -1703,7 +2163,7 @@ moreswitches(char *s)
return s;
case 'T':
if (!PL_tainting)
- croak("Too late for \"-T\" option");
+ Perl_croak(aTHX_ "Too late for \"-T\" option");
s++;
return s;
case 'u':
@@ -1715,48 +2175,52 @@ moreswitches(char *s)
s++;
return s;
case 'v':
-#if defined(SUBVERSION) && SUBVERSION > 0
- printf("\nThis is perl, version 5.%03d_%02d built for %s",
- PATCHLEVEL, SUBVERSION, ARCHNAME);
-#else
- printf("\nThis is perl, version %s built for %s",
- PL_patchlevel, ARCHNAME);
-#endif
+ printf(Perl_form(aTHX_ "\nThis is perl, v%vd built for %s",
+ PL_patchlevel, ARCHNAME));
#if defined(LOCAL_PATCH_COUNT)
if (LOCAL_PATCH_COUNT > 0)
printf("\n(with %d registered patch%s, see perl -V for more detail)",
- LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
+ (int)LOCAL_PATCH_COUNT, (LOCAL_PATCH_COUNT!=1) ? "es" : "");
#endif
- printf("\n\nCopyright 1987-1999, Larry Wall\n");
+ printf("\n\nCopyright 1987-2000, Larry Wall\n");
#ifdef MSDOS
printf("\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
#endif
#ifdef DJGPP
printf("djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n");
- printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1998\n");
+ printf("djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
#endif
#ifdef OS2
printf("\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
- "Version 5 port Copyright (c) 1994-1998, Andreas Kaiser, Ilya Zakharevich\n");
+ "Version 5 port Copyright (c) 1994-1999, Andreas Kaiser, Ilya Zakharevich\n");
#endif
#ifdef atarist
printf("atariST series port, ++jrb bammi@cadence.com\n");
#endif
#ifdef __BEOS__
- printf("BeOS port Copyright Tom Spindler, 1997-1998\n");
+ printf("BeOS port Copyright Tom Spindler, 1997-1999\n");
#endif
#ifdef MPE
- printf("MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1998\n");
+ printf("MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1999\n");
#endif
#ifdef OEMVS
- printf("MVS (OS390) port by Mortice Kern Systems, 1997-1998\n");
+ printf("MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
#endif
#ifdef __VOS__
printf("Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n");
#endif
+#ifdef __OPEN_VM
+ printf("VM/ESA port by Neale Ferguson, 1998-1999\n");
+#endif
+#ifdef POSIX_BC
+ printf("BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
+#endif
#ifdef __MINT__
- printf("MiNT port by Guido Flohr, 1997\n");
+ printf("MiNT port by Guido Flohr, 1997-1999\n");
+#endif
+#ifdef EPOC
+ printf("EPOC port by Olaf Flebbe, 1999-2000\n");
#endif
#ifdef BINARY_BUILD_NOTICE
BINARY_BUILD_NOTICE;
@@ -1769,7 +2233,18 @@ this system using `man perl' or `perldoc perl'. If you have access to the\n\
Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
PerlProc_exit(0);
case 'w':
- PL_dowarn = TRUE;
+ if (! (PL_dowarn & G_WARN_ALL_MASK))
+ PL_dowarn |= G_WARN_ON;
+ s++;
+ return s;
+ case 'W':
+ PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
+ PL_compiling.cop_warnings = pWARN_ALL ;
+ s++;
+ return s;
+ case 'X':
+ PL_dowarn = G_WARN_ALL_OFF;
+ PL_compiling.cop_warnings = pWARN_NONE ;
s++;
return s;
case '*':
@@ -1794,7 +2269,7 @@ Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
return s+1;
/* FALL THROUGH */
default:
- croak("Can't emulate -%.1s on #! line",s);
+ Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
}
return Nullch;
}
@@ -1805,7 +2280,7 @@ Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
/* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
void
-my_unexec(void)
+Perl_my_unexec(pTHX)
{
#ifdef UNEXEC
SV* prog;
@@ -1833,7 +2308,7 @@ my_unexec(void)
/* initialize curinterp */
STATIC void
-init_interp(void)
+S_init_interp(pTHX)
{
#ifdef PERL_OBJECT /* XXX kludge */
@@ -1844,7 +2319,7 @@ init_interp(void)
PL_curcop = &PL_compiling;\
PL_curcopdb = NULL; \
PL_dbargs = 0; \
- PL_dlmax = 128; \
+ PL_dumpindent = 4; \
PL_laststatval = -1; \
PL_laststype = OP_STAT; \
PL_maxscream = -1; \
@@ -1853,7 +2328,6 @@ init_interp(void)
PL_tmps_floor = -1; \
PL_tmps_ix = -1; \
PL_op_mask = NULL; \
- PL_dlmax = 128; \
PL_laststatval = -1; \
PL_laststype = OP_STAT; \
PL_mess_sv = Nullsv; \
@@ -1867,22 +2341,36 @@ init_interp(void)
PL_profiledata = NULL; \
PL_rsfp = Nullfp; \
PL_rsfp_filters = Nullav; \
+ PL_dirty = FALSE; \
} STMT_END
I_REINIT;
#else
# ifdef MULTIPLICITY
# define PERLVAR(var,type)
-# define PERLVARI(var,type,init) PL_curinterp->var = init;
-# define PERLVARIC(var,type,init) PL_curinterp->var = init;
+# define PERLVARA(var,n,type)
+# if defined(PERL_IMPLICIT_CONTEXT)
+# if defined(USE_THREADS)
+# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
+# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
+# else /* !USE_THREADS */
+# define PERLVARI(var,type,init) aTHX->var = init;
+# define PERLVARIC(var,type,init) aTHX->var = init;
+# endif /* USE_THREADS */
+# else
+# define PERLVARI(var,type,init) PERL_GET_INTERP->var = init;
+# define PERLVARIC(var,type,init) PERL_GET_INTERP->var = init;
+# endif
# include "intrpvar.h"
# ifndef USE_THREADS
# include "thrdvar.h"
# endif
# undef PERLVAR
+# undef PERLVARA
# undef PERLVARI
# undef PERLVARIC
-# else
+# else
# define PERLVAR(var,type)
+# define PERLVARA(var,n,type)
# define PERLVARI(var,type,init) PL_##var = init;
# define PERLVARIC(var,type,init) PL_##var = init;
# include "intrpvar.h"
@@ -1890,6 +2378,7 @@ init_interp(void)
# include "thrdvar.h"
# endif
# undef PERLVAR
+# undef PERLVARA
# undef PERLVARI
# undef PERLVARIC
# endif
@@ -1898,7 +2387,7 @@ init_interp(void)
}
STATIC void
-init_main_stash(void)
+S_init_main_stash(pTHX)
{
dTHR;
GV *gv;
@@ -1914,7 +2403,7 @@ init_main_stash(void)
hv_ksplit(PL_strtab, 512);
PL_curstash = PL_defstash = newHV();
- PL_curstname = newSVpv("main",4);
+ PL_curstname = newSVpvn("main",4);
gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
SvREFCNT_dec(GvHV(gv));
GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
@@ -1929,22 +2418,21 @@ init_main_stash(void)
GvMULTI_on(PL_errgv);
PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
GvMULTI_on(PL_replgv);
- (void)form("%240s",""); /* Preallocate temp - for immediate signals. */
+ (void)Perl_form(aTHX_ "%240s",""); /* Preallocate temp - for immediate signals. */
sv_grow(ERRSV, 240); /* Preallocate - for immediate signals. */
sv_setpvn(ERRSV, "", 0);
PL_curstash = PL_defstash;
- PL_compiling.cop_stash = PL_defstash;
+ CopSTASH_set(&PL_compiling, PL_defstash);
PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
/* We must init $/ before switches are processed. */
- sv_setpvn(perl_get_sv("/", TRUE), "\n", 1);
+ sv_setpvn(get_sv("/", TRUE), "\n", 1);
}
STATIC void
-open_script(char *scriptname, bool dosearch, SV *sv, int *fdscript)
+S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
{
dTHR;
- register char *s;
*fdscript = -1;
@@ -1968,7 +2456,7 @@ open_script(char *scriptname, bool dosearch, SV *sv, int *fdscript)
}
}
- PL_curcop->cop_filegv = gv_fetchfile(PL_origfilename);
+ CopFILE_set(PL_curcop, PL_origfilename);
if (strEQ(PL_origfilename,"-"))
scriptname = "";
if (*fdscript >= 0) {
@@ -1980,18 +2468,18 @@ open_script(char *scriptname, bool dosearch, SV *sv, int *fdscript)
}
else if (PL_preprocess) {
char *cpp_cfg = CPPSTDIN;
- SV *cpp = newSVpv("",0);
+ SV *cpp = newSVpvn("",0);
SV *cmd = NEWSV(0,0);
if (strEQ(cpp_cfg, "cppstdin"))
- sv_catpvf(cpp, "%s/", BIN_EXP);
+ Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
sv_catpv(cpp, cpp_cfg);
- sv_catpv(sv,"-I");
+ sv_catpvn(sv, "-I", 2);
sv_catpv(sv,PRIVLIB_EXP);
#ifdef MSDOS
- sv_setpvf(cmd, "\
+ Perl_sv_setpvf(aTHX_ cmd, "\
sed %s -e \"/^[^#]/b\" \
-e \"/^#[ ]*include[ ]/b\" \
-e \"/^#[ ]*define[ ]/b\" \
@@ -2003,10 +2491,11 @@ sed %s -e \"/^[^#]/b\" \
-e \"/^#[ ]*undef[ ]/b\" \
-e \"/^#[ ]*endif/b\" \
-e \"s/^#.*//\" \
- %s | %_ -C %_ %s",
+ %s | %"SVf" -C %"SVf" %s",
(PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
#else
- sv_setpvf(cmd, "\
+# ifdef __OPEN_VM
+ Perl_sv_setpvf(aTHX_ cmd, "\
%s %s -e '/^[^#]/b' \
-e '/^#[ ]*include[ ]/b' \
-e '/^#[ ]*define[ ]/b' \
@@ -2018,7 +2507,22 @@ sed %s -e \"/^[^#]/b\" \
-e '/^#[ ]*undef[ ]/b' \
-e '/^#[ ]*endif/b' \
-e 's/^[ ]*#.*//' \
- %s | %_ -C %_ %s",
+ %s | %"SVf" %"SVf" %s",
+# else
+ Perl_sv_setpvf(aTHX_ cmd, "\
+%s %s -e '/^[^#]/b' \
+ -e '/^#[ ]*include[ ]/b' \
+ -e '/^#[ ]*define[ ]/b' \
+ -e '/^#[ ]*if[ ]/b' \
+ -e '/^#[ ]*ifdef[ ]/b' \
+ -e '/^#[ ]*ifndef[ ]/b' \
+ -e '/^#[ ]*else/b' \
+ -e '/^#[ ]*elif[ ]/b' \
+ -e '/^#[ ]*undef[ ]/b' \
+ -e '/^#[ ]*endif/b' \
+ -e 's/^[ ]*#.*//' \
+ %s | %"SVf" -C %"SVf" %s",
+# endif
#ifdef LOC_SED
LOC_SED,
#else
@@ -2044,7 +2548,7 @@ sed %s -e \"/^[^#]/b\" \
#endif
#endif
if (PerlProc_geteuid() != PL_uid)
- croak("Can't do seteuid!\n");
+ Perl_croak(aTHX_ "Can't do seteuid!\n");
}
#endif /* IAMSUID */
PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
@@ -2066,31 +2570,42 @@ sed %s -e \"/^[^#]/b\" \
#ifdef DOSUID
#ifndef IAMSUID /* in case script is not readable before setuid */
if (PL_euid &&
- PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&PL_statbuf) >= 0 &&
+ PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
PL_statbuf.st_mode & (S_ISUID|S_ISGID))
{
/* try again */
- PerlProc_execv(form("%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
- croak("Can't do setuid\n");
+ PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
+ (int)PERL_REVISION, (int)PERL_VERSION,
+ (int)PERL_SUBVERSION), PL_origargv);
+ Perl_croak(aTHX_ "Can't do setuid\n");
}
#endif
#endif
- croak("Can't open perl script \"%s\": %s\n",
- SvPVX(GvSV(PL_curcop->cop_filegv)), Strerror(errno));
+ Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
+ CopFILE(PL_curcop), Strerror(errno));
}
}
+/* Mention
+ * I_SYSSTATVFS HAS_FSTATVFS
+ * I_SYSMOUNT
+ * I_STATFS HAS_FSTATFS HAS_GETFSSTAT
+ * I_MNTENT HAS_GETMNTENT HAS_HASMNTOPT
+ * here so that metaconfig picks them up. */
+
#ifdef IAMSUID
-static int
-fd_on_nosuid_fs(int fd)
+STATIC int
+S_fd_on_nosuid_fs(pTHX_ int fd)
{
- int on_nosuid = 0;
- int check_okay = 0;
+ int check_okay = 0; /* able to do all the required sys/libcalls */
+ int on_nosuid = 0; /* the fd is on a nosuid fs */
/*
- * Preferred order: fstatvfs(), fstatfs(), getmntent().
+ * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
* fstatvfs() is UNIX98.
- * fstatfs() is BSD.
- * getmntent() is O(number-of-mounted-filesystems) and can hang.
+ * fstatfs() is 4.3 BSD.
+ * ustat()+getmnt() is pre-4.3 BSD.
+ * getmntent() is O(number-of-mounted-filesystems) and can hang on
+ * an irrelevant filesystem while trying to reach the right one.
*/
# ifdef HAS_FSTATVFS
@@ -2098,24 +2613,45 @@ fd_on_nosuid_fs(int fd)
check_okay = fstatvfs(fd, &stfs) == 0;
on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID);
# else
-# if defined(HAS_FSTATFS) && defined(HAS_STRUCT_STATFS_FLAGS)
+# ifdef PERL_MOUNT_NOSUID
+# if defined(HAS_FSTATFS) && \
+ defined(HAS_STRUCT_STATFS) && \
+ defined(HAS_STRUCT_STATFS_F_FLAGS)
struct statfs stfs;
check_okay = fstatfs(fd, &stfs) == 0;
-# undef PERL_MOUNT_NOSUID
-# if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID)
-# define PERL_MOUNT_NOSUID MNT_NOSUID
-# endif
-# if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID)
-# define PERL_MOUNT_NOSUID MS_NOSUID
-# endif
-# if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID)
-# define PERL_MOUNT_NOSUID M_NOSUID
-# endif
-# ifdef PERL_MOUNT_NOSUID
on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
-# endif
+# else
+# if defined(HAS_FSTAT) && \
+ defined(HAS_USTAT) && \
+ defined(HAS_GETMNT) && \
+ defined(HAS_STRUCT_FS_DATA) && \
+ defined(NOSTAT_ONE)
+ struct stat fdst;
+ if (fstat(fd, &fdst) == 0) {
+ struct ustat us;
+ if (ustat(fdst.st_dev, &us) == 0) {
+ struct fs_data fsd;
+ /* NOSTAT_ONE here because we're not examining fields which
+ * vary between that case and STAT_ONE. */
+ if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
+ size_t cmplen = sizeof(us.f_fname);
+ if (sizeof(fsd.fd_req.path) < cmplen)
+ cmplen = sizeof(fsd.fd_req.path);
+ if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
+ fdst.st_dev == fsd.fd_req.dev) {
+ check_okay = 1;
+ on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
+ }
+ }
+ }
+ }
+ }
+# endif /* fstat+ustat+getmnt */
+# endif /* fstatfs */
# else
-# if defined(HAS_GETMNTENT) && defined(HAS_HASMNTOPT) && defined(MNTOPT_NOSUID)
+# if defined(HAS_GETMNTENT) && \
+ defined(HAS_HASMNTOPT) && \
+ defined(MNTOPT_NOSUID)
FILE *mtab = fopen("/etc/mtab", "r");
struct mntent *entry;
struct stat stb, fsb;
@@ -2135,20 +2671,22 @@ fd_on_nosuid_fs(int fd)
}
if (mtab)
fclose(mtab);
-# endif /* mntent */
-# endif /* statfs */
+# endif /* getmntent+hasmntopt */
+# endif /* PERL_MOUNT_NOSUID: fstatfs or fstat+ustat+statfs */
# endif /* statvfs */
+
if (!check_okay)
- croak("Can't check filesystem of script \"%s\" for nosuid",
- PL_origfilename);
+ Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
return on_nosuid;
}
#endif /* IAMSUID */
STATIC void
-validate_suid(char *validarg, char *scriptname, int fdscript)
+S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
{
+#ifdef IAMSUID
int which;
+#endif
/* do we need to emulate setuid on scripts? */
@@ -2175,7 +2713,7 @@ validate_suid(char *validarg, char *scriptname, int fdscript)
char *s, *s2;
if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0) /* normal stat is insecure */
- croak("Can't stat script \"%s\"",PL_origfilename);
+ Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
I32 len;
STRLEN n_a;
@@ -2190,8 +2728,8 @@ validate_suid(char *validarg, char *scriptname, int fdscript)
* But I don't think it's too important. The manual lies when
* it says access() is useful in setuid programs.
*/
- if (PerlLIO_access(SvPVX(GvSV(PL_curcop->cop_filegv)),1)) /*double check*/
- croak("Permission denied");
+ if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
+ Perl_croak(aTHX_ "Permission denied");
#else
/* If we can swap euid and uid, then we can determine access rights
* with a simple stat of the file, and then compare device and
@@ -2210,27 +2748,27 @@ validate_suid(char *validarg, char *scriptname, int fdscript)
# endif
#endif
|| PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
- croak("Can't swap uid and euid"); /* really paranoid */
- if (PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&tmpstatbuf) < 0)
- croak("Permission denied"); /* testing full pathname here */
+ Perl_croak(aTHX_ "Can't swap uid and euid"); /* really paranoid */
+ if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
+ Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */
#if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
- croak("Permission denied");
+ Perl_croak(aTHX_ "Permission denied");
#endif
if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
tmpstatbuf.st_ino != PL_statbuf.st_ino) {
(void)PerlIO_close(PL_rsfp);
if (PL_rsfp = PerlProc_popen("/bin/mail root","w")) { /* heh, heh */
PerlIO_printf(PL_rsfp,
-"User %ld tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
-(Filename of set-id script was %s, uid %ld gid %ld.)\n\nSincerely,\nperl\n",
- (long)PL_uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
+"User %"Uid_t_f" tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
+(Filename of set-id script was %s, uid %"Uid_t_f" gid %"Gid_t_f".)\n\nSincerely,\nperl\n",
+ PL_uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
(long)PL_statbuf.st_dev, (long)PL_statbuf.st_ino,
- SvPVX(GvSV(PL_curcop->cop_filegv)),
- (long)PL_statbuf.st_uid, (long)PL_statbuf.st_gid);
+ CopFILE(PL_curcop),
+ PL_statbuf.st_uid, PL_statbuf.st_gid);
(void)PerlProc_pclose(PL_rsfp);
}
- croak("Permission denied\n");
+ Perl_croak(aTHX_ "Permission denied\n");
}
if (
#ifdef HAS_SETREUID
@@ -2241,29 +2779,29 @@ validate_suid(char *validarg, char *scriptname, int fdscript)
# endif
#endif
|| PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
- croak("Can't reswap uid and euid");
+ Perl_croak(aTHX_ "Can't reswap uid and euid");
if (!cando(S_IXUSR,FALSE,&PL_statbuf)) /* can real uid exec? */
- croak("Permission denied\n");
+ Perl_croak(aTHX_ "Permission denied\n");
}
#endif /* HAS_SETREUID */
#endif /* IAMSUID */
if (!S_ISREG(PL_statbuf.st_mode))
- croak("Permission denied");
+ Perl_croak(aTHX_ "Permission denied");
if (PL_statbuf.st_mode & S_IWOTH)
- croak("Setuid/gid script is writable by world");
+ Perl_croak(aTHX_ "Setuid/gid script is writable by world");
PL_doswitches = FALSE; /* -s is insecure in suid */
- PL_curcop->cop_line++;
+ CopLINE_inc(PL_curcop);
if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
- croak("No #! line");
+ Perl_croak(aTHX_ "No #! line");
s = SvPV(PL_linestr,n_a)+2;
if (*s == ' ') s++;
while (!isSPACE(*s)) s++;
for (s2 = s; (s2 > SvPV(PL_linestr,n_a)+2 &&
(isDIGIT(s2[-1]) || strchr("._-", s2[-1]))); s2--) ;
if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4)) /* sanity check */
- croak("Not a perl script");
+ Perl_croak(aTHX_ "Not a perl script");
while (*s == ' ' || *s == '\t') s++;
/*
* #! arg must be what we saw above. They can invoke it by
@@ -2273,13 +2811,13 @@ validate_suid(char *validarg, char *scriptname, int fdscript)
len = strlen(validarg);
if (strEQ(validarg," PHOOEY ") ||
strnNE(s,validarg,len) || !isSPACE(s[len]))
- croak("Args must match #! line");
+ Perl_croak(aTHX_ "Args must match #! line");
#ifndef IAMSUID
if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
PL_euid == PL_statbuf.st_uid)
if (!PL_do_undump)
- croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
+ Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
#endif /* IAMSUID */
@@ -2287,9 +2825,11 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
(void)PerlIO_close(PL_rsfp);
#ifndef IAMSUID
/* try again */
- PerlProc_execv(form("%s/sperl%s", BIN_EXP, PL_patchlevel), PL_origargv);
+ PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
+ (int)PERL_REVISION, (int)PERL_VERSION,
+ (int)PERL_SUBVERSION), PL_origargv);
#endif
- croak("Can't do setuid\n");
+ Perl_croak(aTHX_ "Can't do setuid\n");
}
if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
@@ -2307,7 +2847,7 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
#endif
#endif
if (PerlProc_getegid() != PL_statbuf.st_gid)
- croak("Can't do setegid!\n");
+ Perl_croak(aTHX_ "Can't do setegid!\n");
}
if (PL_statbuf.st_mode & S_ISUID) {
if (PL_statbuf.st_uid != PL_euid)
@@ -2325,7 +2865,7 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
#endif
#endif
if (PerlProc_geteuid() != PL_statbuf.st_uid)
- croak("Can't do seteuid!\n");
+ Perl_croak(aTHX_ "Can't do seteuid!\n");
}
else if (PL_uid) { /* oops, mustn't run as root */
#ifdef HAS_SETEUID
@@ -2342,19 +2882,19 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
#endif
#endif
if (PerlProc_geteuid() != PL_uid)
- croak("Can't do seteuid!\n");
+ Perl_croak(aTHX_ "Can't do seteuid!\n");
}
init_ids();
if (!cando(S_IXUSR,TRUE,&PL_statbuf))
- croak("Permission denied\n"); /* they can't do this */
+ Perl_croak(aTHX_ "Permission denied\n"); /* they can't do this */
}
#ifdef IAMSUID
else if (PL_preprocess)
- croak("-P not allowed for setuid/setgid script\n");
+ Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
else if (fdscript >= 0)
- croak("fd script not allowed in suidperl\n");
+ Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
else
- croak("Script is not setuid/setgid in suidperl\n");
+ Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
/* We absolutely must clear out any saved ids here, so we */
/* exec the real perl, substituting fd script for scriptname. */
@@ -2363,14 +2903,16 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0); /* just in case rewind didn't */
for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
if (!PL_origargv[which])
- croak("Permission denied");
- PL_origargv[which] = savepv(form("/dev/fd/%d/%s",
+ Perl_croak(aTHX_ "Permission denied");
+ PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
PerlIO_fileno(PL_rsfp), PL_origargv[which]));
#if defined(HAS_FCNTL) && defined(F_SETFD)
fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0); /* ensure no close-on-exec */
#endif
- PerlProc_execv(form("%s/perl%s", BIN_EXP, PL_patchlevel), PL_origargv);/* try again */
- croak("Can't do setuid\n");
+ PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
+ (int)PERL_REVISION, (int)PERL_VERSION,
+ (int)PERL_SUBVERSION), PL_origargv);/* try again */
+ Perl_croak(aTHX_ "Can't do setuid\n");
#endif /* IAMSUID */
#else /* !DOSUID */
if (PL_euid != PL_uid || PL_egid != PL_gid) { /* (suidperl doesn't exist, in fact) */
@@ -2382,7 +2924,7 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
(PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
)
if (!PL_do_undump)
- croak("YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
+ Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
#endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
/* not set-id, must be wrapped */
@@ -2391,7 +2933,7 @@ FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
}
STATIC void
-find_beginning(void)
+S_find_beginning(pTHX)
{
register char *s, *s2;
@@ -2400,7 +2942,7 @@ find_beginning(void)
forbid_setid("-x");
while (PL_doextract) {
if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
- croak("No Perl script found in input\n");
+ Perl_croak(aTHX_ "No Perl script found in input\n");
if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
PerlIO_ungetc(PL_rsfp, '\n'); /* to keep line count right */
PL_doextract = FALSE;
@@ -2411,22 +2953,21 @@ find_beginning(void)
while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
if (strnEQ(s2-4,"perl",4))
/*SUPPRESS 530*/
- while (s = moreswitches(s)) ;
+ while ((s = moreswitches(s)))
+ ;
}
- if (PL_cddir && PerlDir_chdir(PL_cddir) < 0)
- croak("Can't chdir to %s",PL_cddir);
}
}
}
STATIC void
-init_ids(void)
+S_init_ids(pTHX)
{
- PL_uid = (int)PerlProc_getuid();
- PL_euid = (int)PerlProc_geteuid();
- PL_gid = (int)PerlProc_getgid();
- PL_egid = (int)PerlProc_getegid();
+ PL_uid = PerlProc_getuid();
+ PL_euid = PerlProc_geteuid();
+ PL_gid = PerlProc_getgid();
+ PL_egid = PerlProc_getegid();
#ifdef VMS
PL_uid |= PL_gid << 16;
PL_euid |= PL_egid << 16;
@@ -2435,31 +2976,34 @@ init_ids(void)
}
STATIC void
-forbid_setid(char *s)
+S_forbid_setid(pTHX_ char *s)
{
if (PL_euid != PL_uid)
- croak("No %s allowed while running setuid", s);
+ Perl_croak(aTHX_ "No %s allowed while running setuid", s);
if (PL_egid != PL_gid)
- croak("No %s allowed while running setgid", s);
+ Perl_croak(aTHX_ "No %s allowed while running setgid", s);
}
-STATIC void
-init_debugger(void)
+void
+Perl_init_debugger(pTHX)
{
dTHR;
+ HV *ostash = PL_curstash;
+
PL_curstash = PL_debstash;
PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
AvREAL_off(PL_dbargs);
PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
+ sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
sv_setiv(PL_DBsingle, 0);
PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
sv_setiv(PL_DBtrace, 0);
PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
sv_setiv(PL_DBsignal, 0);
- PL_curstash = PL_defstash;
+ PL_curstash = ostash;
}
#ifndef STRESS_REALLOC
@@ -2469,7 +3013,7 @@ init_debugger(void)
#endif
void
-init_stacks(ARGSproto)
+Perl_init_stacks(pTHX)
{
/* start with 128-item stack and 8K cxstack */
PL_curstackinfo = new_stackinfo(REASONABLE(128),
@@ -2491,7 +3035,7 @@ init_stacks(ARGSproto)
PL_markstack_ptr = PL_markstack;
PL_markstack_max = PL_markstack + REASONABLE(32);
- SET_MARKBASE;
+ SET_MARK_OFFSET;
New(54,PL_scopestack,REASONABLE(32),I32);
PL_scopestack_ix = 0;
@@ -2509,7 +3053,7 @@ init_stacks(ARGSproto)
#undef REASONABLE
STATIC void
-nuke_stacks(void)
+S_nuke_stacks(pTHX)
{
dTHR;
while (PL_curstackinfo->si_next)
@@ -2526,10 +3070,6 @@ nuke_stacks(void)
Safefree(PL_scopestack);
Safefree(PL_savestack);
Safefree(PL_retstack);
- DEBUG( {
- Safefree(PL_debname);
- Safefree(PL_debdelim);
- } )
}
#ifndef PERL_OBJECT
@@ -2537,7 +3077,7 @@ static PerlIO *tmpfp; /* moved outside init_lexer() because of UNICOS bug */
#endif
STATIC void
-init_lexer(void)
+S_init_lexer(pTHX)
{
#ifdef PERL_OBJECT
PerlIO *tmpfp;
@@ -2546,38 +3086,41 @@ init_lexer(void)
PL_rsfp = Nullfp;
lex_start(PL_linestr);
PL_rsfp = tmpfp;
- PL_subname = newSVpv("main",4);
+ PL_subname = newSVpvn("main",4);
}
STATIC void
-init_predump_symbols(void)
+S_init_predump_symbols(pTHX)
{
dTHR;
GV *tmpgv;
- GV *othergv;
+ IO *io;
- sv_setpvn(perl_get_sv("\"", TRUE), " ", 1);
+ sv_setpvn(get_sv("\"", TRUE), " ", 1);
PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
GvMULTI_on(PL_stdingv);
- IoIFP(GvIOp(PL_stdingv)) = PerlIO_stdin();
+ io = GvIOp(PL_stdingv);
+ IoIFP(io) = PerlIO_stdin();
tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
GvMULTI_on(tmpgv);
- GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_stdingv));
+ GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
GvMULTI_on(tmpgv);
- IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
+ io = GvIOp(tmpgv);
+ IoOFP(io) = IoIFP(io) = PerlIO_stdout();
setdefout(tmpgv);
tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
GvMULTI_on(tmpgv);
- GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_defoutgv));
+ GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
- othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
- GvMULTI_on(othergv);
- IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
+ PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
+ GvMULTI_on(PL_stderrgv);
+ io = GvIOp(PL_stderrgv);
+ IoOFP(io) = IoIFP(io) = PerlIO_stderr();
tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
GvMULTI_on(tmpgv);
- GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
+ GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
PL_statname = NEWSV(66,0); /* last filename we did stat on */
@@ -2586,7 +3129,7 @@ init_predump_symbols(void)
}
STATIC void
-init_postdump_symbols(register int argc, register char **argv, register char **env)
+S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
{
dTHR;
char *s;
@@ -2598,11 +3141,11 @@ init_postdump_symbols(register int argc, register char **argv, register char **e
for (; argc > 0 && **argv == '-'; argc--,argv++) {
if (!argv[0][1])
break;
- if (argv[0][1] == '-') {
+ if (argv[0][1] == '-' && !argv[0][2]) {
argc--,argv++;
break;
}
- if (s = strchr(argv[0], '=')) {
+ if ((s = strchr(argv[0], '='))) {
*s++ = '\0';
sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
}
@@ -2619,26 +3162,33 @@ init_postdump_symbols(register int argc, register char **argv, register char **e
PL_formtarget = PL_bodytarget;
TAINT;
- if (tmpgv = gv_fetchpv("0",TRUE, SVt_PV)) {
+ if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
sv_setpv(GvSV(tmpgv),PL_origfilename);
magicname("0", "0", 1);
}
- if (tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))
+ if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV)))
+#ifdef OS2
+ sv_setpv(GvSV(tmpgv), os2_execname());
+#else
sv_setpv(GvSV(tmpgv),PL_origargv[0]);
- if (PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV)) {
+#endif
+ if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
GvMULTI_on(PL_argvgv);
(void)gv_AVadd(PL_argvgv);
av_clear(GvAVn(PL_argvgv));
for (; argc > 0; argc--,argv++) {
- av_push(GvAVn(PL_argvgv),newSVpv(argv[0],0));
+ SV *sv = newSVpv(argv[0],0);
+ av_push(GvAVn(PL_argvgv),sv);
+ if (PL_widesyscalls)
+ sv_utf8_upgrade(sv);
}
}
- if (PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV)) {
+ if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
HV *hv;
GvMULTI_on(PL_envgv);
hv = GvHVn(PL_envgv);
hv_magic(hv, PL_envgv, 'E');
-#ifndef VMS /* VMS doesn't have environ array */
+#if !defined( VMS) && !defined(EPOC) /* VMS doesn't have environ array */
/* Note that if the supplied env parameter is actually a copy
of the global environ then it may now point to free'd memory
if the environment has been modified since. To avoid this
@@ -2669,21 +3219,21 @@ init_postdump_symbols(register int argc, register char **argv, register char **e
#endif
}
TAINT_NOT;
- if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
- sv_setiv(GvSV(tmpgv), (IV)getpid());
+ if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV)))
+ sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
}
STATIC void
-init_perllib(void)
+S_init_perllib(pTHX)
{
char *s;
if (!PL_tainting) {
#ifndef VMS
s = PerlEnv_getenv("PERL5LIB");
if (s)
- incpush(s, TRUE);
+ incpush(s, TRUE, TRUE);
else
- incpush(PerlEnv_getenv("PERLLIB"), FALSE);
+ incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE);
#else /* VMS */
/* Treat PERL5?LIB as a possible search list logical name -- the
* "natural" VMS idiom for a Unix path string. We allow each
@@ -2692,43 +3242,73 @@ init_perllib(void)
char buf[256];
int idx = 0;
if (my_trnlnm("PERL5LIB",buf,0))
- do { incpush(buf,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
+ do { incpush(buf,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
else
- while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE);
+ while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE);
#endif /* VMS */
}
/* Use the ~-expanded versions of APPLLIB (undocumented),
- ARCHLIB PRIVLIB SITEARCH and SITELIB
+ ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
*/
#ifdef APPLLIB_EXP
- incpush(APPLLIB_EXP, TRUE);
+ incpush(APPLLIB_EXP, TRUE, TRUE);
#endif
#ifdef ARCHLIB_EXP
- incpush(ARCHLIB_EXP, FALSE);
+ incpush(ARCHLIB_EXP, FALSE, FALSE);
#endif
#ifndef PRIVLIB_EXP
-#define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
+# define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
#endif
#if defined(WIN32)
- incpush(PRIVLIB_EXP, TRUE);
+ incpush(PRIVLIB_EXP, TRUE, FALSE);
#else
- incpush(PRIVLIB_EXP, FALSE);
+ incpush(PRIVLIB_EXP, FALSE, FALSE);
#endif
#ifdef SITEARCH_EXP
- incpush(SITEARCH_EXP, FALSE);
+ /* sitearch is always relative to sitelib on Windows for
+ * DLL-based path intuition to work correctly */
+# if !defined(WIN32)
+ incpush(SITEARCH_EXP, FALSE, FALSE);
+# endif
#endif
+
#ifdef SITELIB_EXP
-#if defined(WIN32)
- incpush(SITELIB_EXP, TRUE);
-#else
- incpush(SITELIB_EXP, FALSE);
+# if defined(WIN32)
+ incpush(SITELIB_EXP, TRUE, FALSE); /* this picks up sitearch as well */
+# else
+ incpush(SITELIB_EXP, FALSE, FALSE);
+# endif
#endif
+
+#ifdef SITELIB_STEM /* Search for version-specific dirs below here */
+ incpush(SITELIB_STEM, FALSE, TRUE);
+#endif
+
+#ifdef PERL_VENDORARCH_EXP
+ /* vendorarch is always relative to vendorlib on Windows for
+ * DLL-based path intuition to work correctly */
+# if !defined(WIN32)
+ incpush(PERL_VENDORARCH_EXP, FALSE, FALSE);
+# endif
+#endif
+
+#ifdef PERL_VENDORLIB_EXP
+# if defined(WIN32)
+ incpush(PERL_VENDORLIB_EXP, TRUE, FALSE); /* this picks up vendorarch as well */
+# else
+ incpush(PERL_VENDORLIB_EXP, FALSE, FALSE);
+# endif
+#endif
+
+#ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
+ incpush(PERL_VENDORLIB_STEM, FALSE, TRUE);
#endif
+
if (!PL_tainting)
- incpush(".", FALSE);
+ incpush(".", FALSE, FALSE);
}
#if defined(DOSISH)
@@ -2745,26 +3325,15 @@ init_perllib(void)
#endif
STATIC void
-incpush(char *p, int addsubdirs)
+S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers)
{
SV *subdir = Nullsv;
- if (!p)
+ if (!p || !*p)
return;
- if (addsubdirs) {
+ if (addsubdirs || addoldvers) {
subdir = sv_newmortal();
- if (!PL_archpat_auto) {
- STRLEN len = (sizeof(ARCHNAME) + strlen(PL_patchlevel)
- + sizeof("//auto"));
- New(55, PL_archpat_auto, len, char);
- sprintf(PL_archpat_auto, "/%s/%s/auto", ARCHNAME, PL_patchlevel);
-#ifdef VMS
- for (len = sizeof(ARCHNAME) + 2;
- PL_archpat_auto[len] != '\0' && PL_archpat_auto[len] != '/'; len++)
- if (PL_archpat_auto[len] == '.') PL_archpat_auto[len] = '_';
-#endif
- }
}
/* Break at all separators */
@@ -2775,7 +3344,7 @@ incpush(char *p, int addsubdirs)
/* skip any consecutive separators */
while ( *p == PERLLIB_SEP ) {
/* Uncomment the next line for PATH semantics */
- /* av_push(GvAVn(PL_incgv), newSVpv(".", 1)); */
+ /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
p++;
}
@@ -2793,7 +3362,12 @@ incpush(char *p, int addsubdirs)
* BEFORE pushing libdir onto @INC we may first push version- and
* archname-specific sub-directories.
*/
- if (addsubdirs) {
+ if (addsubdirs || addoldvers) {
+#ifdef PERL_INC_VERSION_LIST
+ /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
+ const char *incverlist[] = { PERL_INC_VERSION_LIST };
+ const char **incver;
+#endif
struct stat tmpstatbuf;
#ifdef VMS
char *unix;
@@ -2805,25 +3379,46 @@ incpush(char *p, int addsubdirs)
sv_usepvn(libdir,unix,len);
}
else
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"Failed to unixify @INC element \"%s\"\n",
SvPV(libdir,len));
#endif
- /* .../archname/version if -d .../archname/version/auto */
- sv_setsv(subdir, libdir);
- sv_catpv(subdir, PL_archpat_auto);
- if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
- S_ISDIR(tmpstatbuf.st_mode))
- av_push(GvAVn(PL_incgv),
- newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
-
- /* .../archname if -d .../archname/auto */
- sv_insert(subdir, SvCUR(libdir) + sizeof(ARCHNAME),
- strlen(PL_patchlevel) + 1, "", 0);
- if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
- S_ISDIR(tmpstatbuf.st_mode))
- av_push(GvAVn(PL_incgv),
- newSVpv(SvPVX(subdir), SvCUR(subdir) - sizeof "auto"));
+ if (addsubdirs) {
+ /* .../version/archname if -d .../version/archname */
+ Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/"PERL_FS_VER_FMT"/%s",
+ libdir,
+ (int)PERL_REVISION, (int)PERL_VERSION,
+ (int)PERL_SUBVERSION, ARCHNAME);
+ if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
+ S_ISDIR(tmpstatbuf.st_mode))
+ av_push(GvAVn(PL_incgv), newSVsv(subdir));
+
+ /* .../version if -d .../version */
+ Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/"PERL_FS_VER_FMT, libdir,
+ (int)PERL_REVISION, (int)PERL_VERSION,
+ (int)PERL_SUBVERSION);
+ if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
+ S_ISDIR(tmpstatbuf.st_mode))
+ av_push(GvAVn(PL_incgv), newSVsv(subdir));
+
+ /* .../archname if -d .../archname */
+ Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/%s", libdir, ARCHNAME);
+ if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
+ S_ISDIR(tmpstatbuf.st_mode))
+ av_push(GvAVn(PL_incgv), newSVsv(subdir));
+ }
+
+#ifdef PERL_INC_VERSION_LIST
+ if (addoldvers) {
+ for (incver = incverlist; *incver; incver++) {
+ /* .../xxx if -d .../xxx */
+ Perl_sv_setpvf(aTHX_ subdir, "%"SVf"/%s", libdir, *incver);
+ if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
+ S_ISDIR(tmpstatbuf.st_mode))
+ av_push(GvAVn(PL_incgv), newSVsv(subdir));
+ }
+ }
+#endif
}
/* finally push this lib directory on the end of @INC */
@@ -2833,18 +3428,20 @@ incpush(char *p, int addsubdirs)
#ifdef USE_THREADS
STATIC struct perl_thread *
-init_main_thread()
+S_init_main_thread(pTHX)
{
+#if !defined(PERL_IMPLICIT_CONTEXT)
struct perl_thread *thr;
+#endif
XPV *xpv;
Newz(53, thr, 1, struct perl_thread);
PL_curcop = &PL_compiling;
+ thr->interp = PERL_GET_INTERP;
thr->cvcache = newHV();
thr->threadsv = newAV();
/* thr->threadsvp is set when find_threadsv is called */
thr->specific = newAV();
- thr->errhv = newHV();
thr->flags = THRf_R_JOINABLE;
MUTEX_INIT(&thr->mutex);
/* Handcraft thrsv similarly to mess_sv */
@@ -2859,6 +3456,7 @@ init_main_thread()
*SvEND(PL_thrsv) = '\0'; /* in the trailing_nul field */
thr->oursv = PL_thrsv;
PL_chopset = " \n-";
+ PL_dumpindent = 4;
MUTEX_LOCK(&PL_threads_mutex);
PL_nthreads++;
@@ -2868,7 +3466,7 @@ init_main_thread()
MUTEX_UNLOCK(&PL_threads_mutex);
#ifdef HAVE_THREAD_INTERN
- init_thread_intern(thr);
+ Perl_init_thread_intern(thr);
#endif
#ifdef SET_THREAD_SELF
@@ -2876,7 +3474,7 @@ init_main_thread()
#else
thr->self = pthread_self();
#endif /* SET_THREAD_SELF */
- SET_THR(thr);
+ PERL_SET_THX(thr);
/*
* These must come after the SET_THR because sv_setpvn does
@@ -2889,12 +3487,15 @@ init_main_thread()
sv_upgrade(PL_bodytarget, SVt_PVFM);
sv_setpvn(PL_bodytarget, "", 0);
PL_formtarget = PL_bodytarget;
- thr->errsv = newSVpv("", 0);
+ thr->errsv = newSVpvn("", 0);
(void) find_threadsv("@"); /* Ensure $@ is initialised early */
PL_maxscream = -1;
- PL_regcompp = FUNC_NAME_TO_PTR(pregcomp);
- PL_regexecp = FUNC_NAME_TO_PTR(regexec_flags);
+ PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
+ PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
+ PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
+ PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
+ PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
PL_regindent = 0;
PL_reginterp_cnt = 0;
@@ -2903,38 +3504,47 @@ init_main_thread()
#endif /* USE_THREADS */
void
-call_list(I32 oldscope, AV *paramList)
+Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
{
dTHR;
- line_t oldline = PL_curcop->cop_line;
+ SV *atsv;
+ line_t oldline = CopLINE(PL_curcop);
+ CV *cv;
STRLEN len;
- dJMPENV;
int ret;
+ dJMPENV;
while (AvFILL(paramList) >= 0) {
- CV *cv = (CV*)av_shift(paramList);
-
+ cv = (CV*)av_shift(paramList);
SAVEFREESV(cv);
-
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
+#else
JMPENV_PUSH(ret);
+#endif
switch (ret) {
- case 0: {
- SV* atsv = ERRSV;
- PUSHMARK(PL_stack_sp);
- perl_call_sv((SV*)cv, G_EVAL|G_DISCARD);
- (void)SvPV(atsv, len);
- if (len) {
- JMPENV_POP;
- PL_curcop = &PL_compiling;
- PL_curcop->cop_line = oldline;
- if (paramList == PL_beginav)
- sv_catpv(atsv, "BEGIN failed--compilation aborted");
- else
- sv_catpv(atsv, "END failed--cleanup aborted");
- while (PL_scopestack_ix > oldscope)
- LEAVE;
- croak("%s", SvPVX(atsv));
- }
+ case 0:
+#ifndef PERL_FLEXIBLE_EXCEPTIONS
+ call_list_body(cv);
+#endif
+ atsv = ERRSV;
+ (void)SvPV(atsv, len);
+ if (len) {
+ STRLEN n_a;
+ PL_curcop = &PL_compiling;
+ CopLINE_set(PL_curcop, oldline);
+ if (paramList == PL_beginav)
+ sv_catpv(atsv, "BEGIN failed--compilation aborted");
+ else
+ Perl_sv_catpvf(aTHX_ atsv,
+ "%s failed--call queue aborted",
+ paramList == PL_checkav ? "CHECK"
+ : paramList == PL_initav ? "INIT"
+ : "END");
+ while (PL_scopestack_ix > oldscope)
+ LEAVE;
+ JMPENV_POP;
+ Perl_croak(aTHX_ "%s", SvPVx(atsv, n_a));
}
break;
case 1:
@@ -2946,36 +3556,53 @@ call_list(I32 oldscope, AV *paramList)
LEAVE;
FREETMPS;
PL_curstash = PL_defstash;
- if (PL_endav)
- call_list(oldscope, PL_endav);
- JMPENV_POP;
PL_curcop = &PL_compiling;
- PL_curcop->cop_line = oldline;
- if (PL_statusvalue) {
+ CopLINE_set(PL_curcop, oldline);
+ JMPENV_POP;
+ if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
if (paramList == PL_beginav)
- croak("BEGIN failed--compilation aborted");
+ Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
else
- croak("END failed--cleanup aborted");
+ Perl_croak(aTHX_ "%s failed--call queue aborted",
+ paramList == PL_checkav ? "CHECK"
+ : paramList == PL_initav ? "INIT"
+ : "END");
}
my_exit_jump();
/* NOTREACHED */
case 3:
- if (!PL_restartop) {
- PerlIO_printf(PerlIO_stderr(), "panic: restartop\n");
- FREETMPS;
- break;
+ if (PL_restartop) {
+ PL_curcop = &PL_compiling;
+ CopLINE_set(PL_curcop, oldline);
+ JMPENV_JUMP(3);
}
- JMPENV_POP;
- PL_curcop = &PL_compiling;
- PL_curcop->cop_line = oldline;
- JMPENV_JUMP(3);
+ PerlIO_printf(Perl_error_log, "panic: restartop\n");
+ FREETMPS;
+ break;
}
JMPENV_POP;
}
}
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+STATIC void *
+S_vcall_list_body(pTHX_ va_list args)
+{
+ CV *cv = va_arg(args, CV*);
+ return call_list_body(cv);
+}
+#endif
+
+STATIC void *
+S_call_list_body(pTHX_ CV *cv)
+{
+ PUSHMARK(PL_stack_sp);
+ call_sv((SV*)cv, G_EVAL|G_DISCARD);
+ return NULL;
+}
+
void
-my_exit(U32 status)
+Perl_my_exit(pTHX_ U32 status)
{
dTHR;
@@ -2996,7 +3623,7 @@ my_exit(U32 status)
}
void
-my_failure_exit(void)
+Perl_my_failure_exit(pTHX)
{
#ifdef VMS
if (vaxc$errno & 1) {
@@ -3025,9 +3652,9 @@ my_failure_exit(void)
}
STATIC void
-my_exit_jump(void)
+S_my_exit_jump(pTHX)
{
- dSP;
+ dTHR;
register PERL_CONTEXT *cx;
I32 gimme;
SV **newsp;
@@ -3049,17 +3676,11 @@ my_exit_jump(void)
}
#ifdef PERL_OBJECT
-#define NO_XSLOCKS
-#endif /* PERL_OBJECT */
-
#include "XSUB.h"
+#endif
static I32
-#ifdef PERL_OBJECT
-read_e_script(CPerlObj *pPerl, int idx, SV *buf_sv, int maxlen)
-#else
-read_e_script(int idx, SV *buf_sv, int maxlen)
-#endif
+read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen)
{
char *p, *nl;
p = SvPVX(PL_e_script);
@@ -3073,5 +3694,3 @@ read_e_script(int idx, SV *buf_sv, int maxlen)
sv_chop(PL_e_script, nl);
return 1;
}
-
-
diff --git a/contrib/perl5/perl.h b/contrib/perl5/perl.h
index cab0bbc..2f30218 100644
--- a/contrib/perl5/perl.h
+++ b/contrib/perl5/perl.h
@@ -1,6 +1,6 @@
/* perl.h
*
- * Copyright (c) 1987-1999, Larry Wall
+ * Copyright (c) 1987-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -8,7 +8,6 @@
*/
#ifndef H_PERL
#define H_PERL 1
-#define OVERLOAD
#ifdef PERL_FOR_X2P
/*
@@ -16,14 +15,68 @@
* Above symbol is defined via -D in 'x2p/Makefile.SH'
* Decouple x2p stuff from some of perls more extreme eccentricities.
*/
-#undef EMBED
-#undef NO_EMBED
-#define NO_EMBED
#undef MULTIPLICITY
#undef USE_STDIO
#define USE_STDIO
#endif /* PERL_FOR_X2P */
+#define VOIDUSED 1
+#include "config.h"
+
+#if defined(USE_ITHREADS) && defined(USE_5005THREADS)
+# include "error: USE_ITHREADS and USE_5005THREADS are incompatible"
+#endif
+
+/* XXX This next guard can disappear if the sources are revised
+ to use USE_5005THREADS throughout. -- A.D 1/6/2000
+*/
+#if defined(USE_ITHREADS) && defined(USE_THREADS)
+# include "error: USE_ITHREADS and USE_THREADS are incompatible"
+#endif
+
+/* See L<perlguts/"The Perl API"> for detailed notes on
+ * PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */
+
+#ifdef USE_ITHREADS
+# if !defined(MULTIPLICITY) && !defined(PERL_OBJECT)
+# define MULTIPLICITY
+# endif
+#endif
+
+#ifdef USE_THREADS
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+#endif
+
+#if defined(MULTIPLICITY)
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+#endif
+
+#ifdef PERL_CAPI
+# undef PERL_OBJECT
+# ifndef MULTIPLICITY
+# define MULTIPLICITY
+# endif
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+# ifndef PERL_IMPLICIT_SYS
+# define PERL_IMPLICIT_SYS
+# endif
+#endif
+
+#ifdef PERL_OBJECT
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+# ifndef PERL_IMPLICIT_SYS
+# define PERL_IMPLICIT_SYS
+# endif
+#endif
+
#ifdef PERL_OBJECT
/* PERL_OBJECT explained - DickH and DougL @ ActiveState.com
@@ -47,8 +100,8 @@ the perl interpreter.
| Perl Host |
+-----------+
^
- |
- v
+ |
+ v
+-----------+ +-----------+
| Perl Core |<->| Extension |
+-----------+ +-----------+ ...
@@ -61,9 +114,9 @@ PERL CORE
variables or functions needed are made member functions
3. all writable static variables are made member variables
4. all global variables and functions are defined as:
- #define var CPerlObj::Perl_var
+ #define var CPerlObj::PL_var
#define func CPerlObj::Perl_func
- * these are in objpp.h
+ * these are in embed.h
This necessitated renaming some local variables and functions that
had the same name as a global variable or function. This was
probably a _good_ thing anyway.
@@ -73,7 +126,7 @@ EXTENSIONS
1. Access to global variables and perl functions is through a
pointer to the PERL_OBJECT. This pointer type is CPerlObj*. This is
made transparent to extension developers by the following macros:
- #define var pPerl->Perl_var
+ #define var pPerl->PL_var
#define func pPerl->Perl_func
* these are done in objXSUB.h
This requires that the extension be compiled as C++, which means
@@ -102,41 +155,102 @@ functions are now member functions of the PERL_OBJECT.
class CPerlObj;
#define STATIC
-#define CPERLscope(x) CPerlObj::x
-#define CPERLproto CPerlObj *
-#define _CPERLproto ,CPERLproto
-#define CPERLarg CPerlObj *pPerl
-#define CPERLarg_ CPERLarg,
-#define _CPERLarg ,CPERLarg
-#define PERL_OBJECT_THIS this
-#define _PERL_OBJECT_THIS ,this
-#define PERL_OBJECT_THIS_ this,
-#define CALLRUNOPS (this->*PL_runops)
-#define CALLREGCOMP (this->*PL_regcompp)
-#define CALLREGEXEC (this->*PL_regexecp)
+#define CPERLscope(x) CPerlObj::x
+#define CALL_FPTR(fptr) (aTHXo->*fptr)
+
+#define pTHXo CPerlObj *pPerl
+#define pTHXo_ pTHXo,
+#define aTHXo this
+#define aTHXo_ this,
+#define PERL_OBJECT_THIS aTHXo
+#define PERL_OBJECT_THIS_ aTHXo_
+#define dTHXoa(a) pTHXo = a
+#define dTHXo dTHXoa(PERL_GET_THX)
+
+#define pTHXx void
+#define pTHXx_
+#define aTHXx
+#define aTHXx_
#else /* !PERL_OBJECT */
+#ifdef PERL_IMPLICIT_CONTEXT
+# ifdef USE_THREADS
+struct perl_thread;
+# define pTHX register struct perl_thread *thr
+# define aTHX thr
+# define dTHR dNOOP
+# else
+# ifndef MULTIPLICITY
+# define MULTIPLICITY
+# endif
+# define pTHX register PerlInterpreter *my_perl
+# define aTHX my_perl
+# endif
+# define dTHXa(a) pTHX = a
+# define dTHX dTHXa(PERL_GET_THX)
+# define pTHX_ pTHX,
+# define aTHX_ aTHX,
+# define pTHX_1 2
+# define pTHX_2 3
+# define pTHX_3 4
+# define pTHX_4 5
+#endif
+
#define STATIC static
#define CPERLscope(x) x
-#define CPERLproto
-#define _CPERLproto
#define CPERLarg void
#define CPERLarg_
#define _CPERLarg
#define PERL_OBJECT_THIS
#define _PERL_OBJECT_THIS
#define PERL_OBJECT_THIS_
-#define CALLRUNOPS PL_runops
-#define CALLREGCOMP (*PL_regcompp)
-#define CALLREGEXEC (*PL_regexecp)
+#define CALL_FPTR(fptr) (*fptr)
#endif /* PERL_OBJECT */
-#define VOIDUSED 1
-#include "config.h"
+#define CALLRUNOPS CALL_FPTR(PL_runops)
+#define CALLREGCOMP CALL_FPTR(PL_regcompp)
+#define CALLREGEXEC CALL_FPTR(PL_regexecp)
+#define CALLREG_INTUIT_START CALL_FPTR(PL_regint_start)
+#define CALLREG_INTUIT_STRING CALL_FPTR(PL_regint_string)
+#define CALLREGFREE CALL_FPTR(PL_regfree)
-#include "embed.h"
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+# define CALLPROTECT CALL_FPTR(PL_protect)
+#endif
+
+#define NOOP (void)0
+#define dNOOP extern int Perl___notused
+
+#ifndef pTHX
+# define pTHX void
+# define pTHX_
+# define aTHX
+# define aTHX_
+# define dTHXa(a) dNOOP
+# define dTHX dNOOP
+# define pTHX_1 1
+# define pTHX_2 2
+# define pTHX_3 3
+# define pTHX_4 4
+#endif
+
+#ifndef pTHXo
+# define pTHXo pTHX
+# define pTHXo_ pTHX_
+# define aTHXo aTHX
+# define aTHXo_ aTHX_
+# define dTHXo dTHX
+#endif
+
+#ifndef pTHXx
+# define pTHXx register PerlInterpreter *my_perl
+# define pTHXx_ pTHXx,
+# define aTHXx my_perl
+# define aTHXx_ aTHXx,
+# define dTHXx dTHX
+#endif
#undef START_EXTERN_C
#undef END_EXTERN_C
@@ -148,18 +262,14 @@ class CPerlObj;
#else
# define START_EXTERN_C
# define END_EXTERN_C
-# define EXTERN_C
+# define EXTERN_C extern
#endif
#ifdef OP_IN_REGISTER
# ifdef __GNUC__
# define stringify_immed(s) #s
# define stringify(s) stringify_immed(s)
-#ifdef EMBED
register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
-#else
-register struct op *op asm(stringify(OP_IN_REGISTER));
-#endif
# endif
#endif
@@ -186,8 +296,7 @@ register struct op *op asm(stringify(OP_IN_REGISTER));
# endif
#endif
-#define NOOP (void)0
-
+#define WITH_THX(s) STMT_START { dTHX; s; } STMT_END
#define WITH_THR(s) STMT_START { dTHR; s; } STMT_END
/*
@@ -228,11 +337,11 @@ register struct op *op asm(stringify(OP_IN_REGISTER));
#define DOSISH 1
#endif
-#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
+#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus) || defined( EPOC)
# define STANDARD_C 1
#endif
-#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX)
+#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX) || defined( EPOC) || defined(__QNX__)
# define DONT_DECLARE_STD 1
#endif
@@ -302,6 +411,14 @@ register struct op *op asm(stringify(OP_IN_REGISTER));
# endif
#endif
+/* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that
+ pthread.h must be included before all other header files.
+*/
+#if (defined(USE_THREADS) || defined(USE_ITHREADS)) \
+ && defined(PTHREAD_H_FIRST) && defined(I_PTHREAD)
+# include <pthread.h>
+#endif
+
#ifndef _TYPES_ /* If types.h defines this it's easy. */
# ifndef major /* Does everyone's types.h define this? */
# include <sys/types.h>
@@ -322,15 +439,17 @@ register struct op *op asm(stringify(OP_IN_REGISTER));
# endif
#endif
-#include "iperlsys.h"
-
#ifdef USE_NEXT_CTYPE
-#if NX_CURRENT_COMPILER_RELEASE >= 400
-#include <objc/NXCType.h>
-#else /* NX_CURRENT_COMPILER_RELEASE < 400 */
-#include <appkit/NXCType.h>
-#endif /* NX_CURRENT_COMPILER_RELEASE >= 400 */
+#if NX_CURRENT_COMPILER_RELEASE >= 500
+# include <bsd/ctypes.h>
+#else
+# if NX_CURRENT_COMPILER_RELEASE >= 400
+# include <objc/NXCType.h>
+# else /* NX_CURRENT_COMPILER_RELEASE < 400 */
+# include <appkit/NXCType.h>
+# endif /* NX_CURRENT_COMPILER_RELEASE >= 400 */
+#endif /* NX_CURRENT_COMPILER_RELEASE >= 500 */
#else /* !USE_NEXT_CTYPE */
#include <ctype.h>
@@ -373,54 +492,15 @@ register struct op *op asm(stringify(OP_IN_REGISTER));
# include <stdlib.h>
#endif
-#define MEM_SIZE Size_t
-
-/* This comes after <stdlib.h> so we don't try to change the standard
- * library prototypes; we'll use our own in proto.h instead. */
-
-#ifdef MYMALLOC
-
-# ifdef HIDEMYMALLOC
-# define malloc Mymalloc
-# define calloc Mycalloc
-# define realloc Myrealloc
-# define free Myfree
-Malloc_t Mymalloc _((MEM_SIZE nbytes));
-Malloc_t Mycalloc _((MEM_SIZE elements, MEM_SIZE size));
-Malloc_t Myrealloc _((Malloc_t where, MEM_SIZE nbytes));
-Free_t Myfree _((Malloc_t where));
-# endif
-# ifdef EMBEDMYMALLOC
-# define malloc Perl_malloc
-# define calloc Perl_calloc
-# define realloc Perl_realloc
-/* VMS' external symbols are case-insensitive, and there's already a */
-/* perl_free in perl.h */
-#ifdef VMS
-# define free Perl_myfree
-#else
-# define free Perl_free
+#ifdef PERL_MICRO /* Last chance to export Perl_my_swap */
+# define MYSWAP
#endif
-Malloc_t Perl_malloc _((MEM_SIZE nbytes));
-Malloc_t Perl_calloc _((MEM_SIZE elements, MEM_SIZE size));
-Malloc_t Perl_realloc _((Malloc_t where, MEM_SIZE nbytes));
-#ifdef VMS
-Free_t Perl_myfree _((Malloc_t where));
-#else
-Free_t Perl_free _((Malloc_t where));
-#endif
-# endif
-# undef safemalloc
-# undef safecalloc
-# undef saferealloc
-# undef safefree
-# define safemalloc malloc
-# define safecalloc calloc
-# define saferealloc realloc
-# define safefree free
+#if !defined(PERL_FOR_X2P) && !defined(WIN32)
+# include "embed.h"
+#endif
-#endif /* MYMALLOC */
+#define MEM_SIZE Size_t
#if defined(STANDARD_C) && defined(I_STDDEF)
# include <stddef.h>
@@ -435,6 +515,51 @@ Free_t Perl_free _((Malloc_t where));
# include <strings.h>
#endif
+/* This comes after <stdlib.h> so we don't try to change the standard
+ * library prototypes; we'll use our own in proto.h instead. */
+
+#ifdef MYMALLOC
+# ifdef PERL_POLLUTE_MALLOC
+# ifndef PERL_EXTMALLOC_DEF
+# define Perl_malloc malloc
+# define Perl_calloc calloc
+# define Perl_realloc realloc
+# define Perl_mfree free
+# endif
+# else
+# define EMBEDMYMALLOC /* for compatibility */
+# endif
+Malloc_t Perl_malloc (MEM_SIZE nbytes);
+Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size);
+Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes);
+/* 'mfree' rather than 'free', since there is already a 'perl_free'
+ * that causes clashes with case-insensitive linkers */
+Free_t Perl_mfree (Malloc_t where);
+
+typedef struct perl_mstats perl_mstats_t;
+
+struct perl_mstats {
+ unsigned long *nfree;
+ unsigned long *ntotal;
+ long topbucket, topbucket_ev, topbucket_odd, totfree, total, total_chain;
+ long total_sbrk, sbrks, sbrk_good, sbrk_slack, start_slack, sbrked_remains;
+ long minbucket;
+ /* Level 1 info */
+ unsigned long *bucket_mem_size;
+ unsigned long *bucket_available_size;
+};
+
+# define safemalloc Perl_malloc
+# define safecalloc Perl_calloc
+# define saferealloc Perl_realloc
+# define safefree Perl_mfree
+#else /* MYMALLOC */
+# define safemalloc safesysmalloc
+# define safecalloc safesyscalloc
+# define saferealloc safesysrealloc
+# define safefree safesysfree
+#endif /* MYMALLOC */
+
#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
#define strchr index
#define strrchr rindex
@@ -447,7 +572,7 @@ Free_t Perl_free _((Malloc_t where));
#ifdef HAS_MEMCPY
# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
# ifndef memcpy
- extern char * memcpy _((char*, char*, int));
+ extern char * memcpy (char*, char*, int);
# endif
# endif
#else
@@ -463,7 +588,7 @@ Free_t Perl_free _((Malloc_t where));
#ifdef HAS_MEMSET
# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
# ifndef memset
- extern char *memset _((char*, int, int));
+ extern char *memset (char*, int, int);
# endif
# endif
#else
@@ -489,7 +614,7 @@ Free_t Perl_free _((Malloc_t where));
#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
# ifndef memcmp
- extern int memcmp _((char*, char*, int));
+ extern int memcmp (char*, char*, int);
# endif
# endif
# ifdef BUGGY_MSC
@@ -513,6 +638,12 @@ Free_t Perl_free _((Malloc_t where));
# endif
#endif
+#ifndef memchr
+# ifndef HAS_MEMCHR
+# define memchr(s,c,n) ninstr((char*)(s), ((char*)(s)) + n, &(c), &(c) + 1)
+# endif
+#endif
+
#ifndef HAS_BCMP
# ifndef bcmp
# define bcmp(s1,s2,l) memcmp(s1,s2,l)
@@ -596,26 +727,30 @@ Free_t Perl_free _((Malloc_t where));
#ifdef USE_THREADS
# define ERRSV (thr->errsv)
-# define ERRHV (thr->errhv)
# define DEFSV THREADSV(0)
# define SAVE_DEFSV save_threadsv(0)
#else
# define ERRSV GvSV(PL_errgv)
-# define ERRHV GvHV(PL_errgv)
# define DEFSV GvSV(PL_defgv)
# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
#endif /* USE_THREADS */
+#define ERRHV GvHV(PL_errgv) /* XXX unused, here for compatibility */
+
#ifndef errno
- extern int errno; /* ANSI allows errno to be an lvalue expr */
+ extern int errno; /* ANSI allows errno to be an lvalue expr.
+ * For example in multithreaded environments
+ * something like this might happen:
+ * extern int *_errno(void);
+ * #define errno (*_errno()) */
#endif
#ifdef HAS_STRERROR
# ifdef VMS
- char *strerror _((int,...));
+ char *strerror (int,...);
# else
#ifndef DONT_DECLARE_STD
- char *strerror _((int));
+ char *strerror (int);
#endif
# endif
# ifndef Strerror
@@ -658,7 +793,8 @@ Free_t Perl_free _((Malloc_t where));
/* Configure already sets Direntry_t */
#if defined(I_DIRENT)
# include <dirent.h>
-# if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */
+ /* NeXT needs dirent + sys/dir.h */
+# if defined(I_SYS_DIR) && (defined(NeXT) || defined(__NeXT__))
# include <sys/dir.h>
# endif
#else
@@ -688,6 +824,10 @@ Free_t Perl_free _((Malloc_t where));
* in the face of half-implementations.)
*/
+#ifdef I_SYSMODE
+#include <sys/mode.h>
+#endif
+
#ifndef S_IFMT
# ifdef _S_IFMT
# define S_IFMT _S_IFMT
@@ -766,12 +906,30 @@ Free_t Perl_free _((Malloc_t where));
# define S_IWUSR 0200
# define S_IXUSR 0100
# endif
-# define S_IRGRP (S_IRUSR>>3)
-# define S_IWGRP (S_IWUSR>>3)
-# define S_IXGRP (S_IXUSR>>3)
-# define S_IROTH (S_IRUSR>>6)
-# define S_IWOTH (S_IWUSR>>6)
-# define S_IXOTH (S_IXUSR>>6)
+#endif
+
+#ifndef S_IRGRP
+# ifdef S_IRUSR
+# define S_IRGRP (S_IRUSR>>3)
+# define S_IWGRP (S_IWUSR>>3)
+# define S_IXGRP (S_IXUSR>>3)
+# else
+# define S_IRGRP 0040
+# define S_IWGRP 0020
+# define S_IXGRP 0010
+# endif
+#endif
+
+#ifndef S_IROTH
+# ifdef S_IRUSR
+# define S_IROTH (S_IRUSR>>6)
+# define S_IWOTH (S_IWUSR>>6)
+# define S_IXOTH (S_IXUSR>>6)
+# else
+# define S_IROTH 0040
+# define S_IWOTH 0020
+# define S_IXOTH 0010
+# endif
#endif
#ifndef S_ISUID
@@ -782,6 +940,30 @@ Free_t Perl_free _((Malloc_t where));
# define S_ISGID 02000
#endif
+#ifndef S_IRWXU
+# define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
+#endif
+
+#ifndef S_IRWXG
+# define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
+#endif
+
+#ifndef S_IRWXO
+# define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
+#endif
+
+#ifndef S_IREAD
+# define S_IREAD S_IRUSR
+#endif
+
+#ifndef S_IWRITE
+# define S_IWRITE S_IWUSR
+#endif
+
+#ifndef S_IEXEC
+# define S_IEXEC S_IXUSR
+#endif
+
#ifdef ff_next
# undef ff_next
#endif
@@ -794,55 +976,219 @@ Free_t Perl_free _((Malloc_t where));
#undef UV
#endif
-/* XXX QUAD stuff is not currently supported on most systems.
- Specifically, perl internals don't support long long. Among
- the many problems is that some compilers support long long,
- but the underlying library functions (such as sprintf) don't.
- Some things do work (such as quad pack/unpack on convex);
- also some systems use long long for the fpos_t typedef. That
- seems to work too.
-
+/*
The IV type is supposed to be long enough to hold any integral
value or a pointer.
--Andy Dougherty August 1996
*/
-#ifdef cray
-# define Quad_t int
+typedef IVTYPE IV;
+typedef UVTYPE UV;
+
+#if defined(USE_64_BIT_INT) && defined(HAS_QUAD)
+# if QUADKIND == QUAD_IS_INT64_T && defined(INT64_MAX)
+# define IV_MAX INT64_MAX
+# define IV_MIN INT64_MIN
+# define UV_MAX UINT64_MAX
+# ifndef UINT64_MIN
+# define UINT64_MIN 0
+# endif
+# define UV_MIN UINT64_MIN
+# else
+# define IV_MAX PERL_QUAD_MAX
+# define IV_MIN PERL_QUAD_MIN
+# define UV_MAX PERL_UQUAD_MAX
+# define UV_MIN PERL_UQUAD_MIN
+# endif
+# define IV_IS_QUAD
+# define UV_IS_QUAD
#else
-# ifdef convex
-# define Quad_t long long
-# else
-# if LONGSIZE == 8
-# define Quad_t long
-# endif
-# endif
+# if defined(INT32_MAX) && IVSIZE == 4
+# define IV_MAX INT32_MAX
+# define IV_MIN INT32_MIN
+# ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */
+# define UV_MAX UINT32_MAX
+# else
+# define UV_MAX 4294967295U
+# endif
+# ifndef UINT32_MIN
+# define UINT32_MIN 0
+# endif
+# define UV_MIN UINT32_MIN
+# else
+# define IV_MAX PERL_LONG_MAX
+# define IV_MIN PERL_LONG_MIN
+# define UV_MAX PERL_ULONG_MAX
+# define UV_MIN PERL_ULONG_MIN
+# endif
+# if IVSIZE == 8
+# define IV_IS_QUAD
+# define UV_IS_QUAD
+# ifndef HAS_QUAD
+# define HAS_QUAD
+# endif
+# else
+# undef IV_IS_QUAD
+# undef UV_IS_QUAD
+# undef HAS_QUAD
+# endif
#endif
-/* XXX Experimental set-up for long long. Just add -DUSE_LONG_LONG
- to your ccflags. --Andy Dougherty 4/1998
+#define IV_DIG (BIT_DIGITS(IVSIZE * 8))
+#define UV_DIG (BIT_DIGITS(UVSIZE * 8))
+
+/*
+ * The macros INT2PTR and NUM2PTR are (despite their names)
+ * bi-directional: they will convert int/float to or from pointers.
+ * However the conversion to int/float are named explicitly:
+ * PTR2IV, PTR2UV, PTR2NV.
+ *
+ * For int conversions we do not need two casts if pointers are
+ * the same size as IV and UV. Otherwise we need an explicit
+ * cast (PTRV) to avoid compiler warnings.
+ */
+#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+# define PTRV UV
+# define INT2PTR(any,d) (any)(d)
+#else
+# if PTRSIZE == LONGSIZE
+# define PTRV unsigned long
+# else
+# define PTRV unsigned
+# endif
+# define INT2PTR(any,d) (any)(PTRV)(d)
+#endif
+#define NUM2PTR(any,d) (any)(PTRV)(d)
+#define PTR2IV(p) INT2PTR(IV,p)
+#define PTR2UV(p) INT2PTR(UV,p)
+#define PTR2NV(p) NUM2PTR(NV,p)
+
+#ifdef USE_LONG_DOUBLE
+# if !(defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE))
+# undef USE_LONG_DOUBLE /* Ouch! */
+# endif
+#endif
+
+#ifdef OVR_DBL_DIG
+/* Use an overridden DBL_DIG */
+# ifdef DBL_DIG
+# undef DBL_DIG
+# endif
+# define DBL_DIG OVR_DBL_DIG
+#else
+/* The following is all to get DBL_DIG, in order to pick a nice
+ default value for printing floating point numbers in Gconvert.
+ (see config.h)
*/
-#ifdef USE_LONG_LONG
-# if defined(HAS_LONG_LONG) && LONGLONGSIZE == 8
-# define Quad_t long long
+#ifdef I_LIMITS
+#include <limits.h>
+#endif
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#ifndef HAS_DBL_DIG
+#define DBL_DIG 15 /* A guess that works lots of places */
+#endif
+#endif
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#ifndef HAS_DBL_DIG
+#define DBL_DIG 15 /* A guess that works lots of places */
+#endif
+
+#ifdef OVR_LDBL_DIG
+/* Use an overridden LDBL_DIG */
+# ifdef LDBL_DIG
+# undef LDBL_DIG
+# endif
+# define LDBL_DIG OVR_LDBL_DIG
+#else
+/* The following is all to get LDBL_DIG, in order to pick a nice
+ default value for printing floating point numbers in Gconvert.
+ (see config.h)
+*/
+# ifdef I_LIMITS
+# include <limits.h>
+# endif
+# ifdef I_FLOAT
+# include <float.h>
+# endif
+# ifndef HAS_LDBL_DIG
+# if LONG_DOUBLESIZE == 10
+# define LDBL_DIG 18 /* assume IEEE */
+# else
+# if LONG_DOUBLESIZE == 12
+# define LDBL_DIG 18 /* gcc? */
+# else
+# if LONG_DOUBLESIZE == 16
+# define LDBL_DIG 33 /* assume IEEE */
+# else
+# if LONG_DOUBLESIZE == DOUBLESIZE
+# define LDBL_DIG DBL_DIG /* bummer */
+# endif
+# endif
+# endif
# endif
+# endif
#endif
-#ifdef Quad_t
-# define HAS_QUAD
- typedef Quad_t IV;
- typedef unsigned Quad_t UV;
-# define IV_MAX PERL_QUAD_MAX
-# define IV_MIN PERL_QUAD_MIN
-# define UV_MAX PERL_UQUAD_MAX
-# define UV_MIN PERL_UQUAD_MIN
+typedef NVTYPE NV;
+
+#ifdef I_IEEEFP
+# include <ieeefp.h>
+#endif
+
+#ifdef USE_LONG_DOUBLE
+# ifdef I_SUNMATH
+# include <sunmath.h>
+# endif
+# define NV_DIG LDBL_DIG
+# ifdef HAS_SQRTL
+ /* libsunmath doesn't have modfl and frexpl as of mid-March 2000 */
+ /* XXX Configure probe for modfl and frexpl needed XXX */
+# if defined(__sun) && defined(__svr4)
+# define Perl_modf(x,y) ((long double)modf((double)(x),(double*)(y)))
+# define Perl_frexp(x) ((long double)frexp((double)(x)))
+# else
+# define Perl_modf modfl
+# define Perl_frexp frexpl
+# endif
+# define Perl_cos cosl
+# define Perl_sin sinl
+# define Perl_sqrt sqrtl
+# define Perl_exp expl
+# define Perl_log logl
+# define Perl_atan2 atan2l
+# define Perl_pow powl
+# define Perl_floor floorl
+# define Perl_fmod fmodl
+# endif
#else
- typedef long IV;
- typedef unsigned long UV;
-# define IV_MAX PERL_LONG_MAX
-# define IV_MIN PERL_LONG_MIN
-# define UV_MAX PERL_ULONG_MAX
-# define UV_MIN PERL_ULONG_MIN
+# define NV_DIG DBL_DIG
+# define Perl_modf modf
+# define Perl_frexp frexp
+# define Perl_cos cos
+# define Perl_sin sin
+# define Perl_sqrt sqrt
+# define Perl_exp exp
+# define Perl_log log
+# define Perl_atan2 atan2
+# define Perl_pow pow
+# define Perl_floor floor
+# define Perl_fmod fmod
+#endif
+
+#if !defined(Perl_atof) && defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+# if !defined(Perl_atof) && defined(HAS_STRTOLD)
+# define Perl_atof(s) strtold(s, (char**)NULL)
+# endif
+# if !defined(Perl_atof) && defined(HAS_ATOLF)
+# define Perl_atof atolf
+# endif
+#endif
+#if !defined(Perl_atof)
+# define Perl_atof atof /* we assume atof being available anywhere */
#endif
/* Previously these definitions used hardcoded figures.
@@ -1014,7 +1360,7 @@ Free_t Perl_free _((Malloc_t where));
# endif
#endif
-#ifdef HAS_QUAD
+#ifdef UV_IS_QUAD
# ifdef UQUAD_MAX
# define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
@@ -1046,18 +1392,13 @@ typedef struct unop UNOP;
typedef struct binop BINOP;
typedef struct listop LISTOP;
typedef struct logop LOGOP;
-typedef struct condop CONDOP;
typedef struct pmop PMOP;
typedef struct svop SVOP;
-typedef struct gvop GVOP;
+typedef struct padop PADOP;
typedef struct pvop PVOP;
typedef struct loop LOOP;
-typedef struct Outrec Outrec;
typedef struct interpreter PerlInterpreter;
-#ifndef __BORLANDC__
-typedef struct ff FF; /* XXX not defined anywhere, should go? */
-#endif
typedef struct sv SV;
typedef struct av AV;
typedef struct hv HV;
@@ -1086,18 +1427,118 @@ typedef struct xpvfm XPVFM;
typedef struct xpvio XPVIO;
typedef struct mgvtbl MGVTBL;
typedef union any ANY;
+typedef struct ptr_tbl_ent PTR_TBL_ENT_t;
+typedef struct ptr_tbl PTR_TBL_t;
#include "handy.h"
-#ifdef PERL_OBJECT
-typedef I32 (*filter_t) _((CPerlObj*, int, SV *, int));
-#else
-typedef I32 (*filter_t) _((int, SV *, int));
+#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_RAWIO)
+# if LSEEKSIZE == 8 && !defined(USE_64_BIT_RAWIO)
+# define USE_64_BIT_RAWIO /* implicit */
+# endif
#endif
-#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
-#define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx])
-#define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters))
+/* Notice the use of HAS_FSEEKO: now we are obligated to always use
+ * fseeko/ftello if possible. Don't go #defining ftell to ftello yourself,
+ * however, because operating systems like to do that themself. */
+#ifndef FSEEKSIZE
+# ifdef HAS_FSEEKO
+# define FSEEKSIZE LSEEKSIZE
+# else
+# define FSEEKSIZE LONGSIZE
+# endif
+#endif
+
+#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_STDIO)
+# if FSEEKSIZE == 8 && !defined(USE_64_BIT_STDIO)
+# define USE_64_BIT_STDIO /* implicit */
+# endif
+#endif
+
+#ifdef USE_64_BIT_RAWIO
+# ifdef HAS_OFF64_T
+# undef Off_t
+# define Off_t off64_t
+# undef LSEEKSIZE
+# define LSEEKSIZE 8
+# endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below. Some 64-bit environments,
+ * however, do not. Therefore we have to explicitly mix and match. */
+# if defined(USE_OPEN64)
+# define open open64
+# endif
+# if defined(USE_LSEEK64)
+# define lseek lseek64
+# else
+# if defined(USE_LLSEEK)
+# define lseek llseek
+# endif
+# endif
+# if defined(USE_STAT64)
+# define stat stat64
+# endif
+# if defined(USE_FSTAT64)
+# define fstat fstat64
+# endif
+# if defined(USE_LSTAT64)
+# define lstat lstat64
+# endif
+# if defined(USE_FLOCK64)
+# define flock flock64
+# endif
+# if defined(USE_LOCKF64)
+# define lockf lockf64
+# endif
+# if defined(USE_FCNTL64)
+# define fcntl fcntl64
+# endif
+# if defined(USE_TRUNCATE64)
+# define truncate truncate64
+# endif
+# if defined(USE_FTRUNCATE64)
+# define ftruncate ftruncate64
+# endif
+#endif
+
+#ifdef USE_64_BIT_STDIO
+# ifdef HAS_FPOS64_T
+# undef Fpos_t
+# define Fpos_t fpos64_t
+# endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below. Some 64-bit environments,
+ * however, do not. */
+# if defined(USE_FOPEN64)
+# define fopen fopen64
+# endif
+# if defined(USE_FSEEK64)
+# define fseek fseek64 /* don't do fseeko here, see perlio.c */
+# endif
+# if defined(USE_FTELL64)
+# define ftell ftell64 /* don't do ftello here, see perlio.c */
+# endif
+# if defined(USE_FSETPOS64)
+# define fsetpos fsetpos64
+# endif
+# if defined(USE_FGETPOS64)
+# define fgetpos fgetpos64
+# endif
+# if defined(USE_TMPFILE64)
+# define tmpfile tmpfile64
+# endif
+# if defined(USE_FREOPEN64)
+# define freopen freopen64
+# endif
+#endif
+
+#if defined(OS2)
+# include "iperlsys.h"
+#endif
+
+#if defined(__OPEN_VM)
+# include "vmesa/vmesaish.h"
+#endif
#ifdef DOSISH
# if defined(OS2)
@@ -1118,15 +1559,45 @@ typedef I32 (*filter_t) _((int, SV *, int));
# if defined(__VOS__)
# include "vosish.h"
# else
-# include "unixish.h"
+# if defined(EPOC)
+# include "epocish.h"
+# else
+# if defined(MACOS_TRADITIONAL)
+# include "macos/macish.h"
+# else
+# include "unixish.h"
+# endif
+# endif
# endif
# endif
# endif
# endif
#endif
-#ifndef FUNC_NAME_TO_PTR
-#define FUNC_NAME_TO_PTR(name) name
+#ifndef PERL_SYS_INIT3
+# define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
+#endif
+
+#ifndef MAXPATHLEN
+# ifdef PATH_MAX
+# ifdef _POSIX_PATH_MAX
+# if PATH_MAX > _POSIX_PATH_MAX
+/* MAXPATHLEN is supposed to include the final null character,
+ * as opposed to PATH_MAX and _POSIX_PATH_MAX. */
+# define MAXPATHLEN (PATH_MAX+1)
+# else
+# define MAXPATHLEN (_POSIX_PATH_MAX+1)
+# endif
+# else
+# define MAXPATHLEN (PATH_MAX+1)
+# endif
+# else
+# ifdef _POSIX_PATH_MAX
+# define MAXPATHLEN (_POSIX_PATH_MAX+1)
+# else
+# define MAXPATHLEN 1024 /* Err on the large side. */
+# endif
+# endif
#endif
/*
@@ -1136,11 +1607,12 @@ typedef I32 (*filter_t) _((int, SV *, int));
* May make sense to have threads after "*ish.h" anyway
*/
-#ifdef USE_THREADS
+#if defined(USE_THREADS) || defined(USE_ITHREADS)
+# if defined(USE_THREADS)
/* pending resolution of licensing issues, we avoid the erstwhile
* atomic.h everywhere */
# define EMULATE_ATOMIC_REFCOUNTS
-
+# endif
# ifdef FAKE_THREADS
# include "fakethr.h"
# else
@@ -1152,7 +1624,7 @@ typedef I32 (*filter_t) _((int, SV *, int));
# else
# ifdef I_MACH_CTHREADS
# include <mach/cthreads.h>
-# ifdef NeXT
+# if (defined(NeXT) || defined(__NeXT__)) && defined(PERL_POLLUTE_MALLOC)
# define MUTEX_INIT_CALLS_MALLOC
# endif
typedef cthread_t perl_os_thread;
@@ -1160,7 +1632,9 @@ typedef mutex_t perl_mutex;
typedef condition_t perl_cond;
typedef void * perl_key;
# else /* Posix threads */
-# include <pthread.h>
+# ifdef I_PTHREAD
+# include <pthread.h>
+# endif
typedef pthread_t perl_os_thread;
typedef pthread_mutex_t perl_mutex;
typedef pthread_cond_t perl_cond;
@@ -1169,14 +1643,16 @@ typedef pthread_key_t perl_key;
# endif /* OS2 */
# endif /* WIN32 */
# endif /* FAKE_THREADS */
-#endif /* USE_THREADS */
+#endif /* USE_THREADS || USE_ITHREADS */
+#ifdef WIN32
+# include "win32.h"
+#endif
-
#ifdef VMS
# define STATUS_NATIVE PL_statusvalue_vms
# define STATUS_NATIVE_EXPORT \
- ((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms)
+ (((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms) | (VMSISH_HUSHED ? 0x10000000 : 0))
# define STATUS_NATIVE_SET(n) \
STMT_START { \
PL_statusvalue_vms = (n); \
@@ -1222,6 +1698,70 @@ typedef pthread_key_t perl_key;
# define STATUS_ALL_FAILURE (PL_statusvalue = 1)
#endif
+/* flags in PL_exit_flags for nature of exit() */
+#define PERL_EXIT_EXPECTED 0x01
+
+#ifndef MEMBER_TO_FPTR
+# define MEMBER_TO_FPTR(name) name
+#endif
+
+/* format to use for version numbers in file/directory names */
+/* XXX move to Configure? */
+#ifndef PERL_FS_VER_FMT
+# define PERL_FS_VER_FMT "%d.%d.%d"
+#endif
+
+/* This defines a way to flush all output buffers. This may be a
+ * performance issue, so we allow people to disable it.
+ */
+#ifndef PERL_FLUSHALL_FOR_CHILD
+# if defined(FFLUSH_NULL) || defined(USE_SFIO)
+# define PERL_FLUSHALL_FOR_CHILD PerlIO_flush((PerlIO*)NULL)
+# else
+# ifdef FFLUSH_ALL
+# define PERL_FLUSHALL_FOR_CHILD my_fflush_all()
+# else
+# define PERL_FLUSHALL_FOR_CHILD NOOP
+# endif
+# endif
+#endif
+
+#ifndef PERL_WAIT_FOR_CHILDREN
+# define PERL_WAIT_FOR_CHILDREN NOOP
+#endif
+
+/* the traditional thread-unsafe notion of "current interpreter". */
+#ifndef PERL_SET_INTERP
+# define PERL_SET_INTERP(i) (PL_curinterp = (PerlInterpreter*)(i))
+#endif
+
+#ifndef PERL_GET_INTERP
+# define PERL_GET_INTERP (PL_curinterp)
+#endif
+
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_GET_THX)
+# ifdef USE_THREADS
+# define PERL_GET_THX ((struct perl_thread *)PERL_GET_CONTEXT)
+# else
+# ifdef MULTIPLICITY
+# define PERL_GET_THX ((PerlInterpreter *)PERL_GET_CONTEXT)
+# else
+# ifdef PERL_OBJECT
+# define PERL_GET_THX ((CPerlObj *)PERL_GET_CONTEXT)
+# endif
+# endif
+# endif
+# define PERL_SET_THX(t) PERL_SET_CONTEXT(t)
+#endif
+
+#ifndef SVf
+# ifdef CHECK_FORMAT
+# define SVf "p"
+# else
+# define SVf "_"
+# 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.
@@ -1242,6 +1782,18 @@ typedef pthread_key_t perl_key;
# endif
#endif
+#if defined(__CYGWIN__)
+/* USEMYBINMODE
+ * This symbol, if defined, indicates that the program should
+ * use the routine my_binmode(FILE *fp, char iotype, int mode) to insure
+ * that a file is in "binary" mode -- that is, that no translation
+ * of bytes occurs on read or write operations.
+ */
+# define USEMYBINMODE / **/
+# define my_binmode(fp, iotype, mode) \
+ (PerlLIO_setmode(PerlIO_fileno(fp), mode) != -1 ? TRUE : FALSE)
+#endif
+
#ifdef UNION_ANY_DEFINITION
UNION_ANY_DEFINITION;
#else
@@ -1250,36 +1802,41 @@ union any {
I32 any_i32;
IV any_iv;
long any_long;
- void (CPERLscope(*any_dptr)) _((void*));
+ void (*any_dptr) (void*);
+ void (*any_dxptr) (pTHXo_ void*);
};
#endif
#ifdef USE_THREADS
#define ARGSproto struct perl_thread *thr
#else
-#define ARGSproto void
+#define ARGSproto
#endif /* USE_THREADS */
-/* Work around some cygwin32 problems with importing global symbols */
-#if defined(CYGWIN32) && defined(DLLIMPORT)
-# include "cw32imp.h"
-#endif
+typedef I32 (*filter_t) (pTHXo_ int, SV *, int);
+#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
+#define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx])
+#define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters))
+
+#if !defined(OS2)
+# include "iperlsys.h"
+#endif
#include "regexp.h"
#include "sv.h"
#include "util.h"
#include "form.h"
#include "gv.h"
#include "cv.h"
-#include "opcode.h"
+#include "opnames.h"
#include "op.h"
#include "cop.h"
#include "av.h"
#include "hv.h"
#include "mg.h"
#include "scope.h"
-#include "bytecode.h"
-#include "byterun.h"
+#include "warnings.h"
+#include "utf8.h"
/* Current curly descriptor */
typedef struct curcur CURCUR;
@@ -1300,40 +1857,28 @@ struct _sublex_info {
I32 super_state; /* lexer state to save */
I32 sub_inwhat; /* "lex_inwhat" to use */
OP *sub_op; /* "lex_op" to use */
+ char *super_bufptr; /* PL_bufptr that was */
+ char *super_bufend; /* PL_bufend that was */
};
-#ifdef PERL_OBJECT
-struct magic_state {
- SV* mgs_sv;
- U32 mgs_flags;
-};
-typedef struct magic_state MGS;
-
-typedef struct {
- I32 len_min;
- I32 len_delta;
- I32 pos_min;
- I32 pos_delta;
- SV *last_found;
- I32 last_end; /* min value, <0 unless valid. */
- I32 last_start_min;
- I32 last_start_max;
- SV **longest; /* Either &l_fixed, or &l_float. */
- SV *longest_fixed;
- I32 offset_fixed;
- SV *longest_float;
- I32 offset_float_min;
- I32 offset_float_max;
- I32 flags;
-} scan_data_t;
+typedef struct magic_state MGS; /* struct magic_state defined in mg.c */
+
+struct scan_data_t; /* Used in S_* functions in regcomp.c */
+struct regnode_charclass_class; /* Used in S_* functions in regcomp.c */
typedef I32 CHECKPOINT;
-#endif /* PERL_OBJECT */
-/* work around some libPW problems */
-#ifdef DOINIT
-EXT char Error[1];
-#endif
+struct ptr_tbl_ent {
+ struct ptr_tbl_ent* next;
+ void* oldval;
+ void* newval;
+};
+
+struct ptr_tbl {
+ struct ptr_tbl_ent** tbl_ary;
+ UV tbl_max;
+ UV tbl_items;
+};
#if defined(iAPX286) || defined(M_I286) || defined(I80286)
# define I286
@@ -1398,10 +1943,9 @@ EXT char Error[1];
#define U_I(what) ((unsigned int)(what))
#define U_L(what) ((U32)(what))
#else
-EXTERN_C U32 cast_ulong _((double));
-#define U_S(what) ((U16)cast_ulong((double)(what)))
-#define U_I(what) ((unsigned int)cast_ulong((double)(what)))
-#define U_L(what) (cast_ulong((double)(what)))
+#define U_S(what) ((U16)cast_ulong((NV)(what)))
+#define U_I(what) ((unsigned int)cast_ulong((NV)(what)))
+#define U_L(what) (cast_ulong((NV)(what)))
#endif
#ifdef CASTI32
@@ -1409,41 +1953,43 @@ EXTERN_C U32 cast_ulong _((double));
#define I_V(what) ((IV)(what))
#define U_V(what) ((UV)(what))
#else
-START_EXTERN_C
-I32 cast_i32 _((double));
-IV cast_iv _((double));
-UV cast_uv _((double));
-END_EXTERN_C
-#define I_32(what) (cast_i32((double)(what)))
-#define I_V(what) (cast_iv((double)(what)))
-#define U_V(what) (cast_uv((double)(what)))
+#define I_32(what) (cast_i32((NV)(what)))
+#define I_V(what) (cast_iv((NV)(what)))
+#define U_V(what) (cast_uv((NV)(what)))
#endif
-struct Outrec {
- I32 o_lines;
- char *o_str;
- U32 o_len;
-};
+/* These do not care about the fractional part, only about the range. */
+#define NV_WITHIN_IV(nv) (I_V(nv) >= IV_MIN && I_V(nv) <= IV_MAX)
+#define NV_WITHIN_UV(nv) ((nv)>=0.0 && U_V(nv) >= UV_MIN && U_V(nv) <= UV_MAX)
+
+/* Used with UV/IV arguments: */
+ /* XXXX: need to speed it up */
+#define CLUMP_2UV(iv) ((iv) < 0 ? 0 : (UV)(iv))
+#define CLUMP_2IV(uv) ((uv) > (UV)IV_MAX ? IV_MAX : (IV)(uv))
#ifndef MAXSYSFD
# define MAXSYSFD 2
#endif
-#ifndef TMPPATH
-# define TMPPATH "/tmp/perl-eXXXXXX"
-#endif
-
#ifndef __cplusplus
-Uid_t getuid _((void));
-Uid_t geteuid _((void));
-Gid_t getgid _((void));
-Gid_t getegid _((void));
+Uid_t getuid (void);
+Uid_t geteuid (void);
+Gid_t getgid (void);
+Gid_t getegid (void);
#endif
-#ifdef DEBUGGING
#ifndef Perl_debug_log
-#define Perl_debug_log PerlIO_stderr()
+# define Perl_debug_log PerlIO_stderr()
#endif
+
+#ifndef Perl_error_log
+# define Perl_error_log (PL_stderrgv \
+ && IoOFP(GvIOp(PL_stderrgv)) \
+ ? IoOFP(GvIOp(PL_stderrgv)) \
+ : PerlIO_stderr())
+#endif
+
+#ifdef DEBUGGING
#undef YYDEBUG
#define YYDEBUG 1
#define DEB(a) a
@@ -1455,7 +2001,14 @@ Gid_t getegid _((void));
#define DEBUG_o(a) if (PL_debug & 16) a
#define DEBUG_c(a) if (PL_debug & 32) a
#define DEBUG_P(a) if (PL_debug & 64) a
-#define DEBUG_m(a) if (PL_curinterp && PL_debug & 128) a
+# if defined(PERL_OBJECT)
+# define DEBUG_m(a) if (PL_debug & 128) a
+# else
+# define DEBUG_m(a) \
+ STMT_START { \
+ if (PERL_GET_INTERP) { dTHX; if (PL_debug & 128) { a; } } \
+ } STMT_END
+# endif
#define DEBUG_f(a) if (PL_debug & 256) a
#define DEBUG_r(a) if (PL_debug & 512) a
#define DEBUG_x(a) if (PL_debug & 1024) a
@@ -1495,29 +2048,31 @@ Gid_t getegid _((void));
#ifndef assert /* <assert.h> might have been included somehow */
#define assert(what) DEB( { \
if (!(what)) { \
- croak("Assertion failed: file \"%s\", line %d", \
+ Perl_croak(aTHX_ "Assertion failed: file \"%s\", line %d", \
__FILE__, __LINE__); \
- PerlProc_exit(1); \
+ PerlProc_exit(1); \
}})
#endif
struct ufuncs {
- I32 (*uf_val)_((IV, SV*));
- I32 (*uf_set)_((IV, SV*));
+ I32 (*uf_val)(IV, SV*);
+ I32 (*uf_set)(IV, SV*);
IV uf_index;
};
/* Fix these up for __STDC__ */
#ifndef DONT_DECLARE_STD
-char *mktemp _((char*));
-double atof _((const char*));
+char *mktemp (char*);
+#ifndef atof
+double atof (const char*);
+#endif
#endif
#ifndef STANDARD_C
/* All of these are in stdlib.h or time.h for ANSI C */
Time_t time();
struct tm *gmtime(), *localtime();
-#ifdef OEMVS
+#if defined(OEMVS) || defined(__OPEN_VM)
char *(strchr)(), *(strrchr)();
char *(strcpy)(), *(strcat)();
#else
@@ -1531,40 +2086,42 @@ char *strcpy(), *strcat();
# include <math.h>
#else
START_EXTERN_C
- double exp _((double));
- double log _((double));
- double log10 _((double));
- double sqrt _((double));
- double frexp _((double,int*));
- double ldexp _((double,int));
- double modf _((double,double*));
- double sin _((double));
- double cos _((double));
- double atan2 _((double,double));
- double pow _((double,double));
+ double exp (double);
+ double log (double);
+ double log10 (double);
+ double sqrt (double);
+ double frexp (double,int*);
+ double ldexp (double,int);
+ double modf (double,double*);
+ double sin (double);
+ double cos (double);
+ double atan2 (double,double);
+ double pow (double,double);
END_EXTERN_C
#endif
#ifndef __cplusplus
-# ifdef __NeXT__ /* or whatever catches all NeXTs */
+# if defined(NeXT) || defined(__NeXT__) /* or whatever catches all NeXTs */
char *crypt (); /* Maybe more hosts will need the unprototyped version */
# else
-# if !defined(WIN32) || !defined(HAVE_DES_FCRYPT)
-char *crypt _((const char*, const char*));
-# endif /* !WIN32 && !HAVE_CRYPT_SOURCE */
-# endif /* !__NeXT__ */
+# if !defined(WIN32)
+char *crypt (const char*, const char*);
+# endif /* !WIN32 */
+# endif /* !NeXT && !__NeXT__ */
# ifndef DONT_DECLARE_STD
# ifndef getenv
-char *getenv _((const char*));
+char *getenv (const char*);
# endif /* !getenv */
-Off_t lseek _((int,Off_t,int));
+# if !defined(EPOC) && !(defined(__hpux) && defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) && !defined(HAS_LSEEK_PROTO)
+Off_t lseek (int,Off_t,int);
+# endif
# endif /* !DONT_DECLARE_STD */
-char *getlogin _((void));
+char *getlogin (void);
#endif /* !__cplusplus */
#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
#define UNLINK unlnk
-I32 unlnk _((char*));
+I32 unlnk (char*);
#else
#define UNLINK PerlLIO_unlink
#endif
@@ -1582,7 +2139,7 @@ I32 unlnk _((char*));
# endif
#endif
-typedef Signal_t (*Sighandler_t) _((int));
+/* Sighandler_t defined in iperlsys.h */
#ifdef HAS_SIGACTION
typedef struct sigaction Sigsave_t;
@@ -1599,10 +2156,10 @@ typedef Sighandler_t Sigsave_t;
# define register
# endif
# define PAD_SV(po) pad_sv(po)
-# define RUNOPS_DEFAULT runops_debug
+# define RUNOPS_DEFAULT Perl_runops_debug
#else
# define PAD_SV(po) PL_curpad[po]
-# define RUNOPS_DEFAULT runops_standard
+# define RUNOPS_DEFAULT Perl_runops_standard
#endif
#ifdef MYMALLOC
@@ -1628,95 +2185,90 @@ typedef Sighandler_t Sigsave_t;
#endif
-/*
- * These need prototyping here because <proto.h> isn't
- * included until after runops is initialised.
- */
-
-#ifndef PERL_OBJECT
-typedef int runops_proc_t _((void));
-int runops_standard _((void));
-#ifdef DEBUGGING
-int runops_debug _((void));
-#endif
-#endif /* PERL_OBJECT */
+typedef int (CPERLscope(*runops_proc_t)) (pTHX);
+typedef OP* (CPERLscope(*PPADDR_t)[]) (pTHX);
/* _ (for $_) must be first in the following list (DEFSV requires it) */
#define THREADSV_NAMES "_123456789&`'+/.,\\\";^-%=|~:\001\005!@"
-/* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
-#if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
-#if !defined(DONT_DECLARE_STD) \
- || (defined(__svr4__) && defined(__GNUC__) && defined(sun)) \
- || defined(__sgi) || defined(__DGUX)
-extern char ** environ; /* environment variables supplied via exec */
-#endif
-#else
-# if defined(NeXT) && defined(__DYNAMIC__)
-
-# include <mach-o/dyld.h>
+/* NeXT has problems with crt0.o globals */
+#if defined(__DYNAMIC__) && \
+ (defined(NeXT) || defined(__NeXT__) || defined(__APPLE__))
+# if defined(NeXT) || defined(__NeXT)
+# include <mach-o/dyld.h>
+# define environ (*environ_pointer)
EXT char *** environ_pointer;
-# define environ (*environ_pointer)
+# else
+# if defined(__APPLE__)
+# include <crt_externs.h> /* for the env array */
+# define environ (*_NSGetEnviron())
+# endif
# endif
-#endif /* environ processing */
-
+#else
+ /* VMS and some other platforms don't use the environ array */
+# if !defined(VMS)
+# if !defined(DONT_DECLARE_STD) || \
+ (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
+ defined(__sgi) || \
+ defined(__DGUX) || defined(EPOC)
+extern char ** environ; /* environment variables supplied via exec */
+# endif
+# endif
+#endif
-/* for tmp use in stupid debuggers */
-EXT int * di;
-EXT short * ds;
-EXT char * dc;
+START_EXTERN_C
/* handy constants */
-EXTCONST char warn_uninit[]
- INIT("Use of uninitialized value");
-EXTCONST char warn_nosemi[]
+EXTCONST char PL_warn_uninit[]
+ INIT("Use of uninitialized value%s%s");
+EXTCONST char PL_warn_nosemi[]
INIT("Semicolon seems to be missing");
-EXTCONST char warn_reserved[]
+EXTCONST char PL_warn_reserved[]
INIT("Unquoted string \"%s\" may clash with future reserved word");
-EXTCONST char warn_nl[]
+EXTCONST char PL_warn_nl[]
INIT("Unsuccessful %s on filename containing newline");
-EXTCONST char no_wrongref[]
+EXTCONST char PL_no_wrongref[]
INIT("Can't use %s ref as %s ref");
-EXTCONST char no_symref[]
+EXTCONST char PL_no_symref[]
INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
-EXTCONST char no_usym[]
+EXTCONST char PL_no_usym[]
INIT("Can't use an undefined value as %s reference");
-EXTCONST char no_aelem[]
+EXTCONST char PL_no_aelem[]
INIT("Modification of non-creatable array value attempted, subscript %d");
-EXTCONST char no_helem[]
+EXTCONST char PL_no_helem[]
INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
-EXTCONST char no_modify[]
+EXTCONST char PL_no_modify[]
INIT("Modification of a read-only value attempted");
-EXTCONST char no_mem[]
+EXTCONST char PL_no_mem[]
INIT("Out of memory!\n");
-EXTCONST char no_security[]
+EXTCONST char PL_no_security[]
INIT("Insecure dependency in %s%s");
-EXTCONST char no_sock_func[]
+EXTCONST char PL_no_sock_func[]
INIT("Unsupported socket function \"%s\" called");
-EXTCONST char no_dir_func[]
+EXTCONST char PL_no_dir_func[]
INIT("Unsupported directory function \"%s\" called");
-EXTCONST char no_func[]
+EXTCONST char PL_no_func[]
INIT("The %s function is unimplemented");
-EXTCONST char no_myglob[]
+EXTCONST char PL_no_myglob[]
INIT("\"my\" variable %s can't be in a package");
+EXTCONST char PL_uuemap[65]
+ INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
+
+
#ifdef DOINIT
-EXT char *sig_name[] = { SIG_NAME };
-EXT int sig_num[] = { SIG_NUM };
-EXT SV * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
-EXT SV * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
+EXT char *PL_sig_name[] = { SIG_NAME };
+EXT int PL_sig_num[] = { SIG_NUM };
#else
-EXT char *sig_name[];
-EXT int sig_num[];
-EXT SV * psig_ptr[];
-EXT SV * psig_name[];
+EXT char *PL_sig_name[];
+EXT int PL_sig_num[];
#endif
/* fast case folding tables */
#ifdef DOINIT
#ifdef EBCDIC
-EXT unsigned char fold[] = { /* fast EBCDIC case folding table */
+EXT unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
@@ -1751,7 +2303,7 @@ EXT unsigned char fold[] = { /* fast EBCDIC case folding table */
248, 249, 250, 251, 252, 253, 254, 255
};
#else /* ascii rather than ebcdic */
-EXTCONST unsigned char fold[] = {
+EXTCONST unsigned char PL_fold[] = {
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
@@ -1787,11 +2339,11 @@ EXTCONST unsigned char fold[] = {
};
#endif /* !EBCDIC */
#else
-EXTCONST unsigned char fold[];
+EXTCONST unsigned char PL_fold[];
#endif
#ifdef DOINIT
-EXT unsigned char fold_locale[] = {
+EXT unsigned char PL_fold_locale[] = {
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
@@ -1826,12 +2378,12 @@ EXT unsigned char fold_locale[] = {
248, 249, 250, 251, 252, 253, 254, 255
};
#else
-EXT unsigned char fold_locale[];
+EXT unsigned char PL_fold_locale[];
#endif
#ifdef DOINIT
#ifdef EBCDIC
-EXT unsigned char freq[] = {/* EBCDIC frequencies for mixed English/C */
+EXT unsigned char PL_freq[] = {/* EBCDIC frequencies for mixed English/C */
1, 2, 84, 151, 154, 155, 156, 157,
165, 246, 250, 3, 158, 7, 18, 29,
40, 51, 62, 73, 85, 96, 107, 118,
@@ -1866,7 +2418,7 @@ EXT unsigned char freq[] = {/* EBCDIC frequencies for mixed English/C */
191, 183, 141, 142, 143, 144, 145, 146
};
#else /* ascii rather than ebcdic */
-EXTCONST unsigned char freq[] = { /* letter frequencies for mixed English/C */
+EXTCONST unsigned char PL_freq[] = { /* letter frequencies for mixed English/C */
1, 2, 84, 151, 154, 155, 156, 157,
165, 246, 250, 3, 158, 7, 18, 29,
40, 51, 62, 73, 85, 96, 107, 118,
@@ -1902,12 +2454,12 @@ EXTCONST unsigned char freq[] = { /* letter frequencies for mixed English/C */
};
#endif
#else
-EXTCONST unsigned char freq[];
+EXTCONST unsigned char PL_freq[];
#endif
#ifdef DEBUGGING
#ifdef DOINIT
-EXTCONST char* block_type[] = {
+EXTCONST char* PL_block_type[] = {
"NULL",
"SUB",
"EVAL",
@@ -1916,10 +2468,12 @@ EXTCONST char* block_type[] = {
"BLOCK",
};
#else
-EXTCONST char* block_type[];
+EXTCONST char* PL_block_type[];
#endif
#endif
+END_EXTERN_C
+
/*****************************************************************************/
/* This lexer/parser stuff is currently global since yacc is hard to reenter */
/*****************************************************************************/
@@ -1935,6 +2489,8 @@ typedef enum {
XREF,
XSTATE,
XBLOCK,
+ XATTRBLOCK,
+ XATTRTERM,
XTERMBLOCK
} expectation;
@@ -1964,18 +2520,24 @@ enum { /* pass one of these to get_vtbl */
want_vtbl_regexp,
want_vtbl_collxfrm,
want_vtbl_amagic,
- want_vtbl_amagicelem
+ want_vtbl_amagicelem,
#ifdef USE_THREADS
- ,
- want_vtbl_mutex
+ want_vtbl_mutex,
#endif
+ want_vtbl_regdata,
+ want_vtbl_regdatum,
+ want_vtbl_backref
};
-
/* Note: the lowest 8 bits are reserved for
stuffing into op->op_private */
+#define HINT_PRIVATE_MASK 0x000000ff
#define HINT_INTEGER 0x00000001
#define HINT_STRICT_REFS 0x00000002
+/* #define HINT_notused4 0x00000004 */
+#define HINT_BYTE 0x00000008
+/* #define HINT_notused10 0x00000010 */
+ /* Note: 20,40,80 used for NATIVE_HINTS */
#define HINT_BLOCK_SCOPE 0x00000100
#define HINT_STRICT_SUBS 0x00000200
@@ -1992,78 +2554,70 @@ enum { /* pass one of these to get_vtbl */
#define HINT_RE_TAINT 0x00100000
#define HINT_RE_EVAL 0x00200000
+#define HINT_FILETEST_ACCESS 0x00400000
+#define HINT_UTF8 0x00800000
+
/* Various states of an input record separator SV (rs, nrs) */
#define RsSNARF(sv) (! SvOK(sv))
-#define RsSIMPLE(sv) (SvOK(sv) && SvCUR(sv))
-#define RsPARA(sv) (SvOK(sv) && ! SvCUR(sv))
+#define RsSIMPLE(sv) (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv)))
+#define RsPARA(sv) (SvPOK(sv) && ! SvCUR(sv))
#define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0))
/* Enable variables which are pointers to functions */
-#ifdef PERL_OBJECT
-typedef regexp*(CPerlObj::*regcomp_t) _((char* exp, char* xend, PMOP* pm));
-typedef I32 (CPerlObj::*regexec_t) _((regexp* prog, char* stringarg,
- char* strend, char* strbeg,
- I32 minend, SV* screamer, void* data,
- U32 flags));
-#else
-typedef regexp*(*regcomp_t) _((char* exp, char* xend, PMOP* pm));
-typedef I32 (*regexec_t) _((regexp* prog, char* stringarg, char* strend, char*
- strbeg, I32 minend, SV* screamer, void* data,
- U32 flags));
-
-#endif
+typedef regexp*(CPERLscope(*regcomp_t)) (pTHX_ char* exp, char* xend, PMOP* pm);
+typedef I32 (CPERLscope(*regexec_t)) (pTHX_ regexp* prog, char* stringarg,
+ char* strend, char* strbeg, I32 minend,
+ SV* screamer, void* data, U32 flags);
+typedef char* (CPERLscope(*re_intuit_start_t)) (pTHX_ regexp *prog, SV *sv,
+ char *strpos, char *strend,
+ U32 flags,
+ struct re_scream_pos_data_s *d);
+typedef SV* (CPERLscope(*re_intuit_string_t)) (pTHX_ regexp *prog);
+typedef void (CPERLscope(*regfree_t)) (pTHX_ struct regexp* r);
+
+#ifdef USE_PURE_BISON
+int Perl_yylex(pTHX_ YYSTYPE *lvalp, int *lcharp);
+#endif
+
+typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*);
+typedef void (*DESTRUCTORFUNC_t) (pTHXo_ void*);
+typedef void (*SVFUNC_t) (pTHXo_ SV*);
+typedef I32 (*SVCOMPARE_t) (pTHXo_ SV*, SV*);
+typedef void (*XSINIT_t) (pTHXo);
+typedef void (*ATEXIT_t) (pTHXo_ void*);
+typedef void (*XSUBADDR_t) (pTHXo_ CV *);
/* Set up PERLVAR macros for populating structs */
#define PERLVAR(var,type) type var;
+#define PERLVARA(var,n,type) type var[n];
#define PERLVARI(var,type,init) type var;
#define PERLVARIC(var,type,init) type var;
/* Interpreter exitlist entry */
typedef struct exitlistentry {
-#ifdef PERL_OBJECT
- void (*fn) _((CPerlObj*, void*));
-#else
- void (*fn) _((void*));
-#endif
+ void (*fn) (pTHXo_ void*);
void *ptr;
} PerlExitListEntry;
-#ifdef PERL_OBJECT
-extern "C" CPerlObj* perl_alloc _((IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*));
-
-typedef int (CPerlObj::*runops_proc_t) _((void));
-#undef EXT
-#define EXT
-#undef EXTCONST
-#define EXTCONST
-#undef INIT
-#define INIT(x)
-
-class CPerlObj {
-public:
- CPerlObj(IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
- void Init(void);
- void* operator new(size_t nSize, IPerlMem *pvtbl);
-#endif /* PERL_OBJECT */
-
#ifdef PERL_GLOBAL_STRUCT
struct perl_vars {
-#include "perlvars.h"
+# include "perlvars.h"
};
-#ifdef PERL_CORE
+# ifdef PERL_CORE
EXT struct perl_vars PL_Vars;
EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
-#else /* PERL_CORE */
-#if !defined(__GNUC__) || !defined(WIN32)
+# else /* PERL_CORE */
+# if !defined(__GNUC__) || !defined(WIN32)
EXT
-#endif /* WIN32 */
+# endif /* WIN32 */
struct perl_vars *PL_VarsPtr;
-#define PL_Vars (*((PL_VarsPtr) ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars())))
-#endif /* PERL_CORE */
+# define PL_Vars (*((PL_VarsPtr) \
+ ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars(aTHX))))
+# endif /* PERL_CORE */
#endif /* PERL_GLOBAL_STRUCT */
-#ifdef MULTIPLICITY
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT)
/* If we have multiple interpreters define a struct
holding variables which must be per-interpreter
If we don't have threads anything that would have
@@ -2071,17 +2625,22 @@ struct perl_vars *PL_VarsPtr;
*/
struct interpreter {
-#ifndef USE_THREADS
-#include "thrdvar.h"
-#endif
-#include "intrpvar.h"
+# ifndef USE_THREADS
+# include "thrdvar.h"
+# endif
+# include "intrpvar.h"
+/*
+ * The following is a buffer where new variables must
+ * be defined to maintain binary compatibility with PERL_OBJECT
+ */
+PERLVARA(object_compatibility,30, char)
};
#else
struct interpreter {
char broiled;
};
-#endif
+#endif /* MULTIPLICITY || PERL_OBJECT */
#ifdef USE_THREADS
/* If we have threads define a struct with all the variables
@@ -2101,24 +2660,51 @@ typedef void *Thread;
/* Done with PERLVAR macros for now ... */
#undef PERLVAR
+#undef PERLVARA
#undef PERLVARI
#undef PERLVARIC
#include "thread.h"
#include "pp.h"
+
+#ifndef PERL_CALLCONV
+# define PERL_CALLCONV
+#endif
+
+#ifndef NEXT30_NO_ATTRIBUTE
+# ifndef HASATTRIBUTE /* disable GNU-cc attribute checking? */
+# ifdef __attribute__ /* Avoid possible redefinition errors */
+# undef __attribute__
+# endif
+# define __attribute__(attr)
+# endif
+#endif
+
+#ifdef PERL_OBJECT
+# define PERL_DECL_PROT
+#endif
+
+#undef PERL_CKDEF
+#undef PERL_PPDEF
+#define PERL_CKDEF(s) OP *s (pTHX_ OP *o);
+#define PERL_PPDEF(s) OP *s (pTHX);
+
#include "proto.h"
-#ifdef EMBED
-#define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
-#define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
-#else
-#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
-#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
+#ifdef PERL_OBJECT
+# undef PERL_DECL_PROT
+#endif
+
+#ifndef PERL_OBJECT
+/* this has structure inits, so it cannot be included before here */
+# include "opcode.h"
#endif
/* The following must follow proto.h as #defines mess up syntax */
-#include "embedvar.h"
+#if !defined(PERL_FOR_X2P)
+# include "embedvar.h"
+#endif
/* Now include all the 'global' variables
* If we don't have threads or multiple interpreters
@@ -2126,226 +2712,219 @@ typedef void *Thread;
*/
#define PERLVAR(var,type) EXT type PL_##var;
+#define PERLVARA(var,n,type) EXT type PL_##var[n];
#define PERLVARI(var,type,init) EXT type PL_##var INIT(init);
#define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
-#ifndef PERL_GLOBAL_STRUCT
-#include "perlvars.h"
-#endif
-
-#ifndef MULTIPLICITY
-
+#if !defined(MULTIPLICITY) && !defined(PERL_OBJECT)
+START_EXTERN_C
# include "intrpvar.h"
# ifndef USE_THREADS
# include "thrdvar.h"
# endif
-
+END_EXTERN_C
#endif
#ifdef PERL_OBJECT
-/* from perly.c */
-#undef yydebug
-#undef yynerrs
-#undef yyerrflag
-#undef yychar
-#undef yyssp
-#undef yyvsp
-#undef yyval
-#undef yylval
-#define yydebug PL_yydebug
-#define yynerrs PL_yynerrs
-#define yyerrflag PL_yyerrflag
-#define yychar PL_yychar
-#define yyssp PL_yyssp
-#define yyvsp PL_yyvsp
-#define yyval PL_yyval
-#define yylval PL_yylval
-PERLVAR(yydebug, int)
-PERLVAR(yynerrs, int)
-PERLVAR(yyerrflag, int)
-PERLVAR(yychar, int)
-PERLVAR(yyssp, short*)
-PERLVAR(yyvsp, YYSTYPE*)
-PERLVAR(yyval, YYSTYPE)
-PERLVAR(yylval, YYSTYPE)
-
-#define efloatbuf PL_efloatbuf
-#define efloatsize PL_efloatsize
-PERLVAR(efloatbuf, char *)
-PERLVAR(efloatsize, STRLEN)
-
-#define glob_index PL_glob_index
-#define srand_called PL_srand_called
-#define uudmap PL_uudmap
-#define bitcount PL_bitcount
-#define filter_debug PL_filter_debug
-PERLVAR(glob_index, int)
-PERLVAR(srand_called, bool)
-PERLVAR(uudmap[256], char)
-PERLVAR(bitcount, char*)
-PERLVAR(filter_debug, int)
-PERLVAR(super_bufptr, char*) /* PL_bufptr that was */
-PERLVAR(super_bufend, char*) /* PL_bufend that was */
+# include "embed.h"
-/*
- * The following is a buffer where new variables must
- * be defined to maintain binary compatibility with PERL_OBJECT
- * for 5.005
- */
-PERLVAR(object_compatibility[30], char)
-};
+# ifdef DOINIT
+# include "INTERN.h"
+# else
+# include "EXTERN.h"
+# endif
+
+/* this has structure inits, so it cannot be included before here */
+# include "opcode.h"
-#include "objpp.h"
-#ifdef DOINIT
-#include "INTERN.h"
#else
-#include "EXTERN.h"
-#endif
+# if defined(WIN32)
+# include "embed.h"
+# endif
#endif /* PERL_OBJECT */
+#ifndef PERL_GLOBAL_STRUCT
+START_EXTERN_C
+
+# include "perlvars.h"
+
+END_EXTERN_C
+#endif
#undef PERLVAR
+#undef PERLVARA
#undef PERLVARI
#undef PERLVARIC
-#if defined(HASATTRIBUTE) && defined(WIN32)
-/*
- * This provides a layer of functions and macros to ensure extensions will
- * get to use the same RTL functions as the core.
- * It has to go here or #define of printf messes up __attribute__
- * stuff in proto.h
- */
-#ifndef PERL_OBJECT
-# include <win32iop.h>
-#endif /* PERL_OBJECT */
-#endif /* WIN32 */
+START_EXTERN_C
#ifdef DOINIT
-EXT MGVTBL vtbl_sv = {magic_get,
- magic_set,
- magic_len,
+EXT MGVTBL PL_vtbl_sv = {MEMBER_TO_FPTR(Perl_magic_get),
+ MEMBER_TO_FPTR(Perl_magic_set),
+ MEMBER_TO_FPTR(Perl_magic_len),
0, 0};
-EXT MGVTBL vtbl_env = {0, magic_set_all_env,
- 0, magic_clear_all_env,
+EXT MGVTBL PL_vtbl_env = {0, MEMBER_TO_FPTR(Perl_magic_set_all_env),
+ 0, MEMBER_TO_FPTR(Perl_magic_clear_all_env),
0};
-EXT MGVTBL vtbl_envelem = {0, magic_setenv,
- 0, magic_clearenv,
+EXT MGVTBL PL_vtbl_envelem = {0, MEMBER_TO_FPTR(Perl_magic_setenv),
+ 0, MEMBER_TO_FPTR(Perl_magic_clearenv),
0};
-EXT MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
-EXT MGVTBL vtbl_sigelem = {magic_getsig,
- magic_setsig,
- 0, magic_clearsig,
+EXT MGVTBL PL_vtbl_sig = {0, 0, 0, 0, 0};
+EXT MGVTBL PL_vtbl_sigelem = {MEMBER_TO_FPTR(Perl_magic_getsig),
+ MEMBER_TO_FPTR(Perl_magic_setsig),
+ 0, MEMBER_TO_FPTR(Perl_magic_clearsig),
0};
-EXT MGVTBL vtbl_pack = {0, 0, magic_sizepack, magic_wipepack,
+EXT MGVTBL PL_vtbl_pack = {0, 0, MEMBER_TO_FPTR(Perl_magic_sizepack), MEMBER_TO_FPTR(Perl_magic_wipepack),
0};
-EXT MGVTBL vtbl_packelem = {magic_getpack,
- magic_setpack,
- 0, magic_clearpack,
+EXT MGVTBL PL_vtbl_packelem = {MEMBER_TO_FPTR(Perl_magic_getpack),
+ MEMBER_TO_FPTR(Perl_magic_setpack),
+ 0, MEMBER_TO_FPTR(Perl_magic_clearpack),
0};
-EXT MGVTBL vtbl_dbline = {0, magic_setdbline,
+EXT MGVTBL PL_vtbl_dbline = {0, MEMBER_TO_FPTR(Perl_magic_setdbline),
0, 0, 0};
-EXT MGVTBL vtbl_isa = {0, magic_setisa,
- 0, magic_setisa,
+EXT MGVTBL PL_vtbl_isa = {0, MEMBER_TO_FPTR(Perl_magic_setisa),
+ 0, MEMBER_TO_FPTR(Perl_magic_setisa),
0};
-EXT MGVTBL vtbl_isaelem = {0, magic_setisa,
+EXT MGVTBL PL_vtbl_isaelem = {0, MEMBER_TO_FPTR(Perl_magic_setisa),
0, 0, 0};
-EXT MGVTBL vtbl_arylen = {magic_getarylen,
- magic_setarylen,
+EXT MGVTBL PL_vtbl_arylen = {MEMBER_TO_FPTR(Perl_magic_getarylen),
+ MEMBER_TO_FPTR(Perl_magic_setarylen),
0, 0, 0};
-EXT MGVTBL vtbl_glob = {magic_getglob,
- magic_setglob,
+EXT MGVTBL PL_vtbl_glob = {MEMBER_TO_FPTR(Perl_magic_getglob),
+ MEMBER_TO_FPTR(Perl_magic_setglob),
0, 0, 0};
-EXT MGVTBL vtbl_mglob = {0, magic_setmglob,
+EXT MGVTBL PL_vtbl_mglob = {0, MEMBER_TO_FPTR(Perl_magic_setmglob),
0, 0, 0};
-EXT MGVTBL vtbl_nkeys = {magic_getnkeys,
- magic_setnkeys,
+EXT MGVTBL PL_vtbl_nkeys = {MEMBER_TO_FPTR(Perl_magic_getnkeys),
+ MEMBER_TO_FPTR(Perl_magic_setnkeys),
0, 0, 0};
-EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
+EXT MGVTBL PL_vtbl_taint = {MEMBER_TO_FPTR(Perl_magic_gettaint),MEMBER_TO_FPTR(Perl_magic_settaint),
0, 0, 0};
-EXT MGVTBL vtbl_substr = {magic_getsubstr, magic_setsubstr,
+EXT MGVTBL PL_vtbl_substr = {MEMBER_TO_FPTR(Perl_magic_getsubstr), MEMBER_TO_FPTR(Perl_magic_setsubstr),
0, 0, 0};
-EXT MGVTBL vtbl_vec = {magic_getvec,
- magic_setvec,
+EXT MGVTBL PL_vtbl_vec = {MEMBER_TO_FPTR(Perl_magic_getvec),
+ MEMBER_TO_FPTR(Perl_magic_setvec),
0, 0, 0};
-EXT MGVTBL vtbl_pos = {magic_getpos,
- magic_setpos,
+EXT MGVTBL PL_vtbl_pos = {MEMBER_TO_FPTR(Perl_magic_getpos),
+ MEMBER_TO_FPTR(Perl_magic_setpos),
0, 0, 0};
-EXT MGVTBL vtbl_bm = {0, magic_setbm,
+EXT MGVTBL PL_vtbl_bm = {0, MEMBER_TO_FPTR(Perl_magic_setbm),
0, 0, 0};
-EXT MGVTBL vtbl_fm = {0, magic_setfm,
+EXT MGVTBL PL_vtbl_fm = {0, MEMBER_TO_FPTR(Perl_magic_setfm),
0, 0, 0};
-EXT MGVTBL vtbl_uvar = {magic_getuvar,
- magic_setuvar,
+EXT MGVTBL PL_vtbl_uvar = {MEMBER_TO_FPTR(Perl_magic_getuvar),
+ MEMBER_TO_FPTR(Perl_magic_setuvar),
0, 0, 0};
#ifdef USE_THREADS
-EXT MGVTBL vtbl_mutex = {0, 0, 0, 0, magic_mutexfree};
+EXT MGVTBL PL_vtbl_mutex = {0, 0, 0, 0, MEMBER_TO_FPTR(Perl_magic_mutexfree)};
#endif /* USE_THREADS */
-EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
+EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem),MEMBER_TO_FPTR(Perl_magic_setdefelem),
0, 0, 0};
-EXT MGVTBL vtbl_regexp = {0,0,0,0, magic_freeregexp};
+EXT MGVTBL PL_vtbl_regexp = {0,0,0,0, MEMBER_TO_FPTR(Perl_magic_freeregexp)};
+EXT MGVTBL PL_vtbl_regdata = {0, 0, MEMBER_TO_FPTR(Perl_magic_regdata_cnt), 0, 0};
+EXT MGVTBL PL_vtbl_regdatum = {MEMBER_TO_FPTR(Perl_magic_regdatum_get), 0, 0, 0, 0};
#ifdef USE_LOCALE_COLLATE
-EXT MGVTBL vtbl_collxfrm = {0,
- magic_setcollxfrm,
+EXT MGVTBL PL_vtbl_collxfrm = {0,
+ MEMBER_TO_FPTR(Perl_magic_setcollxfrm),
0, 0, 0};
#endif
-#ifdef OVERLOAD
-EXT MGVTBL vtbl_amagic = {0, magic_setamagic,
- 0, 0, magic_setamagic};
-EXT MGVTBL vtbl_amagicelem = {0, magic_setamagic,
- 0, 0, magic_setamagic};
-#endif /* OVERLOAD */
+EXT MGVTBL PL_vtbl_amagic = {0, MEMBER_TO_FPTR(Perl_magic_setamagic),
+ 0, 0, MEMBER_TO_FPTR(Perl_magic_setamagic)};
+EXT MGVTBL PL_vtbl_amagicelem = {0, MEMBER_TO_FPTR(Perl_magic_setamagic),
+ 0, 0, MEMBER_TO_FPTR(Perl_magic_setamagic)};
+
+EXT MGVTBL PL_vtbl_backref = {0, 0,
+ 0, 0, MEMBER_TO_FPTR(Perl_magic_killbackrefs)};
#else /* !DOINIT */
-EXT MGVTBL vtbl_sv;
-EXT MGVTBL vtbl_env;
-EXT MGVTBL vtbl_envelem;
-EXT MGVTBL vtbl_sig;
-EXT MGVTBL vtbl_sigelem;
-EXT MGVTBL vtbl_pack;
-EXT MGVTBL vtbl_packelem;
-EXT MGVTBL vtbl_dbline;
-EXT MGVTBL vtbl_isa;
-EXT MGVTBL vtbl_isaelem;
-EXT MGVTBL vtbl_arylen;
-EXT MGVTBL vtbl_glob;
-EXT MGVTBL vtbl_mglob;
-EXT MGVTBL vtbl_nkeys;
-EXT MGVTBL vtbl_taint;
-EXT MGVTBL vtbl_substr;
-EXT MGVTBL vtbl_vec;
-EXT MGVTBL vtbl_pos;
-EXT MGVTBL vtbl_bm;
-EXT MGVTBL vtbl_fm;
-EXT MGVTBL vtbl_uvar;
+EXT MGVTBL PL_vtbl_sv;
+EXT MGVTBL PL_vtbl_env;
+EXT MGVTBL PL_vtbl_envelem;
+EXT MGVTBL PL_vtbl_sig;
+EXT MGVTBL PL_vtbl_sigelem;
+EXT MGVTBL PL_vtbl_pack;
+EXT MGVTBL PL_vtbl_packelem;
+EXT MGVTBL PL_vtbl_dbline;
+EXT MGVTBL PL_vtbl_isa;
+EXT MGVTBL PL_vtbl_isaelem;
+EXT MGVTBL PL_vtbl_arylen;
+EXT MGVTBL PL_vtbl_glob;
+EXT MGVTBL PL_vtbl_mglob;
+EXT MGVTBL PL_vtbl_nkeys;
+EXT MGVTBL PL_vtbl_taint;
+EXT MGVTBL PL_vtbl_substr;
+EXT MGVTBL PL_vtbl_vec;
+EXT MGVTBL PL_vtbl_pos;
+EXT MGVTBL PL_vtbl_bm;
+EXT MGVTBL PL_vtbl_fm;
+EXT MGVTBL PL_vtbl_uvar;
#ifdef USE_THREADS
-EXT MGVTBL vtbl_mutex;
+EXT MGVTBL PL_vtbl_mutex;
#endif /* USE_THREADS */
-EXT MGVTBL vtbl_defelem;
-EXT MGVTBL vtbl_regexp;
+EXT MGVTBL PL_vtbl_defelem;
+EXT MGVTBL PL_vtbl_regexp;
+EXT MGVTBL PL_vtbl_regdata;
+EXT MGVTBL PL_vtbl_regdatum;
#ifdef USE_LOCALE_COLLATE
-EXT MGVTBL vtbl_collxfrm;
+EXT MGVTBL PL_vtbl_collxfrm;
#endif
-#ifdef OVERLOAD
-EXT MGVTBL vtbl_amagic;
-EXT MGVTBL vtbl_amagicelem;
-#endif /* OVERLOAD */
+EXT MGVTBL PL_vtbl_amagic;
+EXT MGVTBL PL_vtbl_amagicelem;
+
+EXT MGVTBL PL_vtbl_backref;
#endif /* !DOINIT */
-#ifdef OVERLOAD
+enum {
+ fallback_amg, abs_amg,
+ bool__amg, nomethod_amg,
+ string_amg, numer_amg,
+ add_amg, add_ass_amg,
+ subtr_amg, subtr_ass_amg,
+ mult_amg, mult_ass_amg,
+ div_amg, div_ass_amg,
+ modulo_amg, modulo_ass_amg,
+ pow_amg, pow_ass_amg,
+ lshift_amg, lshift_ass_amg,
+ rshift_amg, rshift_ass_amg,
+ band_amg, band_ass_amg,
+ bor_amg, bor_ass_amg,
+ bxor_amg, bxor_ass_amg,
+ lt_amg, le_amg,
+ gt_amg, ge_amg,
+ eq_amg, ne_amg,
+ ncmp_amg, scmp_amg,
+ slt_amg, sle_amg,
+ sgt_amg, sge_amg,
+ seq_amg, sne_amg,
+ not_amg, compl_amg,
+ inc_amg, dec_amg,
+ atan2_amg, cos_amg,
+ sin_amg, exp_amg,
+ log_amg, sqrt_amg,
+ repeat_amg, repeat_ass_amg,
+ concat_amg, concat_ass_amg,
+ copy_amg, neg_amg,
+ to_sv_amg, to_av_amg,
+ to_hv_amg, to_gv_amg,
+ to_cv_amg, iter_amg,
+ max_amg_code
+ /* Do not leave a trailing comma here. C9X allows it, C89 doesn't. */
+};
+
+#define NofAMmeth max_amg_code
-#define NofAMmeth 58
#ifdef DOINIT
-EXTCONST char * AMG_names[NofAMmeth] = {
+EXTCONST char * PL_AMG_names[NofAMmeth] = {
"fallback", "abs", /* "fallback" should be the first. */
"bool", "nomethod",
"\"\"", "0+",
@@ -2374,12 +2953,17 @@ EXTCONST char * AMG_names[NofAMmeth] = {
"log", "sqrt",
"x", "x=",
".", ".=",
- "=", "neg"
+ "=", "neg",
+ "${}", "@{}",
+ "%{}", "*{}",
+ "&{}", "<>",
};
#else
-EXTCONST char * AMG_names[NofAMmeth];
+EXTCONST char * PL_AMG_names[NofAMmeth];
#endif /* def INITAMAGIC */
+END_EXTERN_C
+
struct am_table {
long was_ok_sub;
long was_ok_am;
@@ -2404,37 +2988,6 @@ typedef struct am_table_short AMTS;
#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
-enum {
- fallback_amg, abs_amg,
- bool__amg, nomethod_amg,
- string_amg, numer_amg,
- add_amg, add_ass_amg,
- subtr_amg, subtr_ass_amg,
- mult_amg, mult_ass_amg,
- div_amg, div_ass_amg,
- modulo_amg, modulo_ass_amg,
- pow_amg, pow_ass_amg,
- lshift_amg, lshift_ass_amg,
- rshift_amg, rshift_ass_amg,
- band_amg, band_ass_amg,
- bor_amg, bor_ass_amg,
- bxor_amg, bxor_ass_amg,
- lt_amg, le_amg,
- gt_amg, ge_amg,
- eq_amg, ne_amg,
- ncmp_amg, scmp_amg,
- slt_amg, sle_amg,
- sgt_amg, sge_amg,
- seq_amg, sne_amg,
- not_amg, compl_amg,
- inc_amg, dec_amg,
- atan2_amg, cos_amg,
- sin_amg, exp_amg,
- log_amg, sqrt_amg,
- repeat_amg, repeat_ass_amg,
- concat_amg, concat_ass_amg,
- copy_amg, neg_amg
-};
/*
* some compilers like to redefine cos et alia as faster
@@ -2467,18 +3020,22 @@ enum {
# endif
#endif /* _FASTMATH */
-#endif /* OVERLOAD */
-
-#define PERLDB_ALL 0x3f /* No _NONAME, _GOTO */
-#define PERLDBf_SUB 0x01 /* Debug sub enter/exit. */
-#define PERLDBf_LINE 0x02 /* Keep line #. */
-#define PERLDBf_NOOPT 0x04 /* Switch off optimizations. */
-#define PERLDBf_INTER 0x08 /* Preserve more data for
- later inspections. */
-#define PERLDBf_SUBLINE 0x10 /* Keep subr source lines. */
-#define PERLDBf_SINGLE 0x20 /* Start with single-step on. */
-#define PERLDBf_NONAME 0x40 /* For _SUB: no name of the subr. */
-#define PERLDBf_GOTO 0x80 /* Report goto: call DB::goto. */
+#define PERLDB_ALL (PERLDBf_SUB | PERLDBf_LINE | \
+ PERLDBf_NOOPT | PERLDBf_INTER | \
+ PERLDBf_SUBLINE| PERLDBf_SINGLE| \
+ PERLDBf_NAMEEVAL| PERLDBf_NAMEANON)
+ /* No _NONAME, _GOTO */
+#define PERLDBf_SUB 0x01 /* Debug sub enter/exit */
+#define PERLDBf_LINE 0x02 /* Keep line # */
+#define PERLDBf_NOOPT 0x04 /* Switch off optimizations */
+#define PERLDBf_INTER 0x08 /* Preserve more data for
+ later inspections */
+#define PERLDBf_SUBLINE 0x10 /* Keep subr source lines */
+#define PERLDBf_SINGLE 0x20 /* Start with single-step on */
+#define PERLDBf_NONAME 0x40 /* For _SUB: no name of the subr */
+#define PERLDBf_GOTO 0x80 /* Report goto: call DB::goto */
+#define PERLDBf_NAMEEVAL 0x100 /* Informative names for evals */
+#define PERLDBf_NAMEANON 0x200 /* Informative names for anon subs */
#define PERLDB_SUB (PL_perldb && (PL_perldb & PERLDBf_SUB))
#define PERLDB_LINE (PL_perldb && (PL_perldb & PERLDBf_LINE))
@@ -2488,42 +3045,144 @@ enum {
#define PERLDB_SINGLE (PL_perldb && (PL_perldb & PERLDBf_SINGLE))
#define PERLDB_SUB_NN (PL_perldb && (PL_perldb & (PERLDBf_NONAME)))
#define PERLDB_GOTO (PL_perldb && (PL_perldb & PERLDBf_GOTO))
+#define PERLDB_NAMEEVAL (PL_perldb && (PL_perldb & PERLDBf_NAMEEVAL))
+#define PERLDB_NAMEANON (PL_perldb && (PL_perldb & PERLDBf_NAMEANON))
#ifdef USE_LOCALE_NUMERIC
#define SET_NUMERIC_STANDARD() \
STMT_START { \
- if (! PL_numeric_standard) \
- perl_set_numeric_standard(); \
+ if (! PL_numeric_standard) \
+ set_numeric_standard(); \
} STMT_END
#define SET_NUMERIC_LOCAL() \
STMT_START { \
if (! PL_numeric_local) \
- perl_set_numeric_local(); \
+ set_numeric_local(); \
} STMT_END
+#define IS_NUMERIC_RADIX(c) \
+ ((PL_hints & HINT_LOCALE) && \
+ PL_numeric_radix && (c) == PL_numeric_radix)
+
+#define RESTORE_NUMERIC_LOCAL() if ((PL_hints & HINT_LOCALE) && PL_numeric_standard) SET_NUMERIC_LOCAL()
+#define RESTORE_NUMERIC_STANDARD() if ((PL_hints & HINT_LOCALE) && PL_numeric_local) SET_NUMERIC_STANDARD()
+#define Atof my_atof
+
#else /* !USE_LOCALE_NUMERIC */
-#define SET_NUMERIC_STANDARD() /**/
-#define SET_NUMERIC_LOCAL() /**/
+#define SET_NUMERIC_STANDARD() /**/
+#define SET_NUMERIC_LOCAL() /**/
+#define IS_NUMERIC_RADIX(c) (0)
+#define RESTORE_NUMERIC_LOCAL() /**/
+#define RESTORE_NUMERIC_STANDARD() /**/
+#define Atof Perl_atof
#endif /* !USE_LOCALE_NUMERIC */
+#if !defined(Strtol) && defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+# ifdef __hpux
+# define strtoll __strtoll /* secret handshake */
+# endif
+# if !defined(Strtol) && defined(HAS_STRTOLL)
+# define Strtol strtoll
+# endif
+/* is there atoq() anywhere? */
+#endif
+#if !defined(Strtol) && defined(HAS_STRTOL)
+# define Strtol strtol
+#endif
+#ifndef Atol
+/* It would be more fashionable to use Strtol() to define atol()
+ * (as is done for Atoul(), see below) but for backward compatibility
+ * we just assume atol(). */
+# if defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG && defined(HAS_ATOLL)
+# define Atol atoll
+# else
+# define Atol atol
+# endif
+#endif
+
+#if !defined(Strtoul) && defined(USE_64_BIT_INT) && defined(UV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+# ifdef __hpux
+# define strtoull __strtoull /* secret handshake */
+# endif
+# if !defined(Strtoul) && defined(HAS_STRTOULL)
+# define Strtoul strtoull
+# endif
+# if !defined(Strtoul) && defined(HAS_STRTOUQ)
+# define Strtoul strtouq
+# endif
+/* is there atouq() anywhere? */
+#endif
+#if !defined(Strtoul) && defined(HAS_STRTOUL)
+# define Strtoul strtoul
+#endif
+#ifndef Atoul
+# define Atoul(s) Strtoul(s, (char **)NULL, 10)
+#endif
+
#if !defined(PERLIO_IS_STDIO) && defined(HASATTRIBUTE)
/*
* Now we have __attribute__ out of the way
* Remap printf
*/
+#undef printf
#define printf PerlIO_stdoutf
#endif
+/* if these never got defined, they need defaults */
+#ifndef PERL_SET_CONTEXT
+# define PERL_SET_CONTEXT(i) PERL_SET_INTERP(i)
+#endif
+
+#ifndef PERL_GET_CONTEXT
+# define PERL_GET_CONTEXT PERL_GET_INTERP
+#endif
+
+#ifndef PERL_GET_THX
+# define PERL_GET_THX ((void*)NULL)
+#endif
+
+#ifndef PERL_SET_THX
+# define PERL_SET_THX(t) NOOP
+#endif
+
#ifndef PERL_SCRIPT_MODE
#define PERL_SCRIPT_MODE "r"
#endif
/*
+ * Some operating systems are stingy with stack allocation,
+ * so perl may have to guard against stack overflow.
+ */
+#ifndef PERL_STACK_OVERFLOW_CHECK
+#define PERL_STACK_OVERFLOW_CHECK() NOOP
+#endif
+
+/*
+ * Some nonpreemptive operating systems find it convenient to
+ * check for asynchronous conditions after each op execution.
+ * Keep this check simple, or it may slow down execution
+ * massively.
+ */
+#ifndef PERL_ASYNC_CHECK
+#define PERL_ASYNC_CHECK() NOOP
+#endif
+
+/*
+ * On some operating systems, a memory allocation may succeed,
+ * but put the process too close to the system's comfort limit.
+ * In this case, PERL_ALLOC_CHECK frees the pointer and sets
+ * it to NULL.
+ */
+#ifndef PERL_ALLOC_CHECK
+#define PERL_ALLOC_CHECK(p) NOOP
+#endif
+
+/*
* nice_chunk and nice_chunk size need to be set
* and queried under the protection of sv_mutex
*/
@@ -2544,21 +3203,55 @@ enum {
# include <sys/sem.h>
# ifndef HAS_UNION_SEMUN /* Provide the union semun. */
union semun {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
};
# endif
# ifdef USE_SEMCTL_SEMUN
+# ifdef IRIX32_SEMUN_BROKEN_BY_GCC
+ union gccbug_semun {
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
+ char __dummy[5];
+ };
+# define semun gccbug_semun
+# endif
# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
# else
# ifdef USE_SEMCTL_SEMID_DS
-# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
+# ifdef EXTRA_F_IN_SEMUN_BUF
+# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buff)
+# else
+# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
+# endif
# endif
# endif
-# ifndef Semctl /* Place our bets on the semun horse. */
-# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
-# endif
+#endif
+
+#ifdef I_FCNTL
+# include <fcntl.h>
+#endif
+
+#ifdef I_SYS_FILE
+# include <sys/file.h>
+#endif
+
+#ifndef O_RDONLY
+/* Assume UNIX defaults */
+# define O_RDONLY 0000
+# define O_WRONLY 0001
+# define O_RDWR 0002
+# define O_CREAT 0100
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+#ifndef O_TEXT
+# define O_TEXT 0
#endif
#ifdef IAMSUID
@@ -2572,7 +3265,63 @@ enum {
#ifdef I_MNTENT
# include <mntent.h> /* for getmntent() */
#endif
+#ifdef I_SYS_STATFS
+# include <sys/statfs.h> /* for some statfs() */
+#endif
+#ifdef I_SYS_VFS
+# ifdef __sgi
+# define sv IRIX_sv /* kludge: IRIX has an sv of its own */
+# endif
+# include <sys/vfs.h> /* for some statfs() */
+# ifdef __sgi
+# undef IRIX_sv
+# endif
+#endif
+#ifdef I_USTAT
+# include <ustat.h> /* for ustat() */
+#endif
+
+#if !defined(PERL_MOUNT_NOSUID) && defined(MOUNT_NOSUID)
+# define PERL_MOUNT_NOSUID MOUNT_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID)
+# define PERL_MOUNT_NOSUID MNT_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID)
+# define PERL_MOUNT_NOSUID MS_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID)
+# define PERL_MOUNT_NOSUID M_NOSUID
+#endif
#endif /* IAMSUID */
+/* and finally... */
+#define PERL_PATCHLEVEL_H_IMPLICIT
+#include "patchlevel.h"
+#undef PERL_PATCHLEVEL_H_IMPLICIT
+
+/* Mention
+
+ NV_PRESERVES_UV
+
+ HAS_ICONV
+ I_ICONV
+
+ HAS_MKSTEMP
+ HAS_MKSTEMPS
+ HAS_MKDTEMP
+
+ HAS_GETCWD
+
+ HAS_MMAP
+ HAS_MPROTECT
+ HAS_MSYNC
+ HAS_MADVISE
+ HAS_MUNMAP
+ I_SYSMMAN
+ Mmap_t
+
+ so that Configure picks them up. */
+
#endif /* Include guard */
diff --git a/contrib/perl5/perlapi.c b/contrib/perl5/perlapi.c
new file mode 100644
index 0000000..787c2f2
--- /dev/null
+++ b/contrib/perl5/perlapi.c
@@ -0,0 +1,4004 @@
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "perlapi.h"
+
+#if defined(PERL_OBJECT) || defined (MULTIPLICITY)
+
+/* accessor functions for Perl variables (provides binary compatibility) */
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+#if defined(PERL_OBJECT)
+#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHXo) \
+ { return &(aTHXo->interp.v); }
+#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHXo) \
+ { return &(aTHXo->interp.v); }
+#else /* MULTIPLICITY */
+#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
+ { return &(aTHX->v); }
+#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
+ { return &(aTHX->v); }
+#endif
+
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHXo) \
+ { return &(PL_##v); }
+#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHXo) \
+ { return &(PL_##v); }
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+#if defined(PERL_OBJECT)
+
+/* C-API layer for PERL_OBJECT */
+
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#if defined(USE_ITHREADS)
+# if defined(PERL_IMPLICIT_SYS)
+# endif
+#endif
+#if defined(MYMALLOC)
+#endif
+#if defined(PERL_OBJECT)
+#ifndef __BORLANDC__
+#endif
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+
+#undef Perl_amagic_call
+SV*
+Perl_amagic_call(pTHXo_ SV* left, SV* right, int method, int dir)
+{
+ return ((CPerlObj*)pPerl)->Perl_amagic_call(left, right, method, dir);
+}
+
+#undef Perl_Gv_AMupdate
+bool
+Perl_Gv_AMupdate(pTHXo_ HV* stash)
+{
+ return ((CPerlObj*)pPerl)->Perl_Gv_AMupdate(stash);
+}
+
+#undef Perl_avhv_delete_ent
+SV*
+Perl_avhv_delete_ent(pTHXo_ AV *ar, SV* keysv, I32 flags, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_avhv_delete_ent(ar, keysv, flags, hash);
+}
+
+#undef Perl_avhv_exists_ent
+bool
+Perl_avhv_exists_ent(pTHXo_ AV *ar, SV* keysv, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_avhv_exists_ent(ar, keysv, hash);
+}
+
+#undef Perl_avhv_fetch_ent
+SV**
+Perl_avhv_fetch_ent(pTHXo_ AV *ar, SV* keysv, I32 lval, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_avhv_fetch_ent(ar, keysv, lval, hash);
+}
+
+#undef Perl_avhv_store_ent
+SV**
+Perl_avhv_store_ent(pTHXo_ AV *ar, SV* keysv, SV* val, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_avhv_store_ent(ar, keysv, val, hash);
+}
+
+#undef Perl_avhv_iternext
+HE*
+Perl_avhv_iternext(pTHXo_ AV *ar)
+{
+ return ((CPerlObj*)pPerl)->Perl_avhv_iternext(ar);
+}
+
+#undef Perl_avhv_iterval
+SV*
+Perl_avhv_iterval(pTHXo_ AV *ar, HE* entry)
+{
+ return ((CPerlObj*)pPerl)->Perl_avhv_iterval(ar, entry);
+}
+
+#undef Perl_avhv_keys
+HV*
+Perl_avhv_keys(pTHXo_ AV *ar)
+{
+ return ((CPerlObj*)pPerl)->Perl_avhv_keys(ar);
+}
+
+#undef Perl_av_clear
+void
+Perl_av_clear(pTHXo_ AV* ar)
+{
+ ((CPerlObj*)pPerl)->Perl_av_clear(ar);
+}
+
+#undef Perl_av_delete
+SV*
+Perl_av_delete(pTHXo_ AV* ar, I32 key, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_delete(ar, key, flags);
+}
+
+#undef Perl_av_exists
+bool
+Perl_av_exists(pTHXo_ AV* ar, I32 key)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_exists(ar, key);
+}
+
+#undef Perl_av_extend
+void
+Perl_av_extend(pTHXo_ AV* ar, I32 key)
+{
+ ((CPerlObj*)pPerl)->Perl_av_extend(ar, key);
+}
+
+#undef Perl_av_fake
+AV*
+Perl_av_fake(pTHXo_ I32 size, SV** svp)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_fake(size, svp);
+}
+
+#undef Perl_av_fetch
+SV**
+Perl_av_fetch(pTHXo_ AV* ar, I32 key, I32 lval)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_fetch(ar, key, lval);
+}
+
+#undef Perl_av_fill
+void
+Perl_av_fill(pTHXo_ AV* ar, I32 fill)
+{
+ ((CPerlObj*)pPerl)->Perl_av_fill(ar, fill);
+}
+
+#undef Perl_av_len
+I32
+Perl_av_len(pTHXo_ AV* ar)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_len(ar);
+}
+
+#undef Perl_av_make
+AV*
+Perl_av_make(pTHXo_ I32 size, SV** svp)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_make(size, svp);
+}
+
+#undef Perl_av_pop
+SV*
+Perl_av_pop(pTHXo_ AV* ar)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_pop(ar);
+}
+
+#undef Perl_av_push
+void
+Perl_av_push(pTHXo_ AV* ar, SV* val)
+{
+ ((CPerlObj*)pPerl)->Perl_av_push(ar, val);
+}
+
+#undef Perl_av_reify
+void
+Perl_av_reify(pTHXo_ AV* ar)
+{
+ ((CPerlObj*)pPerl)->Perl_av_reify(ar);
+}
+
+#undef Perl_av_shift
+SV*
+Perl_av_shift(pTHXo_ AV* ar)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_shift(ar);
+}
+
+#undef Perl_av_store
+SV**
+Perl_av_store(pTHXo_ AV* ar, I32 key, SV* val)
+{
+ return ((CPerlObj*)pPerl)->Perl_av_store(ar, key, val);
+}
+
+#undef Perl_av_undef
+void
+Perl_av_undef(pTHXo_ AV* ar)
+{
+ ((CPerlObj*)pPerl)->Perl_av_undef(ar);
+}
+
+#undef Perl_av_unshift
+void
+Perl_av_unshift(pTHXo_ AV* ar, I32 num)
+{
+ ((CPerlObj*)pPerl)->Perl_av_unshift(ar, num);
+}
+
+#undef Perl_block_gimme
+I32
+Perl_block_gimme(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_block_gimme();
+}
+
+#undef Perl_call_list
+void
+Perl_call_list(pTHXo_ I32 oldscope, AV* av_list)
+{
+ ((CPerlObj*)pPerl)->Perl_call_list(oldscope, av_list);
+}
+
+#undef Perl_cast_ulong
+U32
+Perl_cast_ulong(pTHXo_ NV f)
+{
+ return ((CPerlObj*)pPerl)->Perl_cast_ulong(f);
+}
+
+#undef Perl_cast_i32
+I32
+Perl_cast_i32(pTHXo_ NV f)
+{
+ return ((CPerlObj*)pPerl)->Perl_cast_i32(f);
+}
+
+#undef Perl_cast_iv
+IV
+Perl_cast_iv(pTHXo_ NV f)
+{
+ return ((CPerlObj*)pPerl)->Perl_cast_iv(f);
+}
+
+#undef Perl_cast_uv
+UV
+Perl_cast_uv(pTHXo_ NV f)
+{
+ return ((CPerlObj*)pPerl)->Perl_cast_uv(f);
+}
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+
+#undef Perl_my_chsize
+I32
+Perl_my_chsize(pTHXo_ int fd, Off_t length)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_chsize(fd, length);
+}
+#endif
+#if defined(USE_THREADS)
+
+#undef Perl_condpair_magic
+MAGIC*
+Perl_condpair_magic(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_condpair_magic(sv);
+}
+#endif
+
+#undef Perl_croak
+void
+Perl_croak(pTHXo_ const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vcroak(pat, &args);
+ va_end(args);
+}
+
+#undef Perl_vcroak
+void
+Perl_vcroak(pTHXo_ const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_vcroak(pat, args);
+}
+#if defined(PERL_IMPLICIT_CONTEXT)
+
+#undef Perl_croak_nocontext
+void
+Perl_croak_nocontext(const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vcroak(pat, &args);
+ va_end(args);
+}
+
+#undef Perl_die_nocontext
+OP*
+Perl_die_nocontext(const char* pat, ...)
+{
+ dTHXo;
+ OP* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vdie(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_deb_nocontext
+void
+Perl_deb_nocontext(const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vdeb(pat, &args);
+ va_end(args);
+}
+
+#undef Perl_form_nocontext
+char*
+Perl_form_nocontext(const char* pat, ...)
+{
+ dTHXo;
+ char* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vform(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_load_module_nocontext
+void
+Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, ver);
+ ((CPerlObj*)pPerl)->Perl_vload_module(flags, name, ver, &args);
+ va_end(args);
+}
+
+#undef Perl_mess_nocontext
+SV*
+Perl_mess_nocontext(const char* pat, ...)
+{
+ dTHXo;
+ SV* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vmess(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_warn_nocontext
+void
+Perl_warn_nocontext(const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vwarn(pat, &args);
+ va_end(args);
+}
+
+#undef Perl_warner_nocontext
+void
+Perl_warner_nocontext(U32 err, const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vwarner(err, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_newSVpvf_nocontext
+SV*
+Perl_newSVpvf_nocontext(const char* pat, ...)
+{
+ dTHXo;
+ SV* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vnewSVpvf(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_sv_catpvf_nocontext
+void
+Perl_sv_catpvf_nocontext(SV* sv, const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vcatpvf(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_sv_setpvf_nocontext
+void
+Perl_sv_setpvf_nocontext(SV* sv, const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vsetpvf(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_sv_catpvf_mg_nocontext
+void
+Perl_sv_catpvf_mg_nocontext(SV* sv, const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vcatpvf_mg(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_sv_setpvf_mg_nocontext
+void
+Perl_sv_setpvf_mg_nocontext(SV* sv, const char* pat, ...)
+{
+ dTHXo;
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vsetpvf_mg(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_fprintf_nocontext
+#endif
+
+#undef Perl_cv_const_sv
+SV*
+Perl_cv_const_sv(pTHXo_ CV* cv)
+{
+ return ((CPerlObj*)pPerl)->Perl_cv_const_sv(cv);
+}
+
+#undef Perl_cv_undef
+void
+Perl_cv_undef(pTHXo_ CV* cv)
+{
+ ((CPerlObj*)pPerl)->Perl_cv_undef(cv);
+}
+
+#undef Perl_cx_dump
+void
+Perl_cx_dump(pTHXo_ PERL_CONTEXT* cs)
+{
+ ((CPerlObj*)pPerl)->Perl_cx_dump(cs);
+}
+
+#undef Perl_filter_add
+SV*
+Perl_filter_add(pTHXo_ filter_t funcp, SV* datasv)
+{
+ return ((CPerlObj*)pPerl)->Perl_filter_add(funcp, datasv);
+}
+
+#undef Perl_filter_del
+void
+Perl_filter_del(pTHXo_ filter_t funcp)
+{
+ ((CPerlObj*)pPerl)->Perl_filter_del(funcp);
+}
+
+#undef Perl_filter_read
+I32
+Perl_filter_read(pTHXo_ int idx, SV* buffer, int maxlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_filter_read(idx, buffer, maxlen);
+}
+
+#undef Perl_get_op_descs
+char**
+Perl_get_op_descs(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_op_descs();
+}
+
+#undef Perl_get_op_names
+char**
+Perl_get_op_names(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_op_names();
+}
+
+#undef Perl_get_ppaddr
+PPADDR_t*
+Perl_get_ppaddr(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_ppaddr();
+}
+
+#undef Perl_deb
+void
+Perl_deb(pTHXo_ const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vdeb(pat, &args);
+ va_end(args);
+}
+
+#undef Perl_vdeb
+void
+Perl_vdeb(pTHXo_ const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_vdeb(pat, args);
+}
+
+#undef Perl_debprofdump
+void
+Perl_debprofdump(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_debprofdump();
+}
+
+#undef Perl_debop
+I32
+Perl_debop(pTHXo_ OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_debop(o);
+}
+
+#undef Perl_debstack
+I32
+Perl_debstack(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_debstack();
+}
+
+#undef Perl_debstackptrs
+I32
+Perl_debstackptrs(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_debstackptrs();
+}
+
+#undef Perl_delimcpy
+char*
+Perl_delimcpy(pTHXo_ char* to, char* toend, char* from, char* fromend, int delim, I32* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_delimcpy(to, toend, from, fromend, delim, retlen);
+}
+
+#undef Perl_die
+OP*
+Perl_die(pTHXo_ const char* pat, ...)
+{
+ OP* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vdie(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_dounwind
+void
+Perl_dounwind(pTHXo_ I32 cxix)
+{
+ ((CPerlObj*)pPerl)->Perl_dounwind(cxix);
+}
+
+#undef Perl_do_binmode
+int
+Perl_do_binmode(pTHXo_ PerlIO *fp, int iotype, int flag)
+{
+ return ((CPerlObj*)pPerl)->Perl_do_binmode(fp, iotype, flag);
+}
+
+#undef Perl_do_close
+bool
+Perl_do_close(pTHXo_ GV* gv, bool not_implicit)
+{
+ return ((CPerlObj*)pPerl)->Perl_do_close(gv, not_implicit);
+}
+#if !defined(WIN32)
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#endif
+
+#undef Perl_do_open
+bool
+Perl_do_open(pTHXo_ GV* gv, char* name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO* supplied_fp)
+{
+ return ((CPerlObj*)pPerl)->Perl_do_open(gv, name, len, as_raw, rawmode, rawperm, supplied_fp);
+}
+
+#undef Perl_do_open9
+bool
+Perl_do_open9(pTHXo_ GV *gv, char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num)
+{
+ return ((CPerlObj*)pPerl)->Perl_do_open9(gv, name, len, as_raw, rawmode, rawperm, supplied_fp, svs, num);
+}
+
+#undef Perl_dowantarray
+I32
+Perl_dowantarray(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_dowantarray();
+}
+
+#undef Perl_dump_all
+void
+Perl_dump_all(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_all();
+}
+
+#undef Perl_dump_eval
+void
+Perl_dump_eval(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_eval();
+}
+#if defined(DUMP_FDS)
+
+#undef Perl_dump_fds
+void
+Perl_dump_fds(pTHXo_ char* s)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_fds(s);
+}
+#endif
+
+#undef Perl_dump_form
+void
+Perl_dump_form(pTHXo_ GV* gv)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_form(gv);
+}
+
+#undef Perl_gv_dump
+void
+Perl_gv_dump(pTHXo_ GV* gv)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_dump(gv);
+}
+
+#undef Perl_op_dump
+void
+Perl_op_dump(pTHXo_ OP* arg)
+{
+ ((CPerlObj*)pPerl)->Perl_op_dump(arg);
+}
+
+#undef Perl_pmop_dump
+void
+Perl_pmop_dump(pTHXo_ PMOP* pm)
+{
+ ((CPerlObj*)pPerl)->Perl_pmop_dump(pm);
+}
+
+#undef Perl_dump_packsubs
+void
+Perl_dump_packsubs(pTHXo_ HV* stash)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_packsubs(stash);
+}
+
+#undef Perl_dump_sub
+void
+Perl_dump_sub(pTHXo_ GV* gv)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_sub(gv);
+}
+
+#undef Perl_fbm_compile
+void
+Perl_fbm_compile(pTHXo_ SV* sv, U32 flags)
+{
+ ((CPerlObj*)pPerl)->Perl_fbm_compile(sv, flags);
+}
+
+#undef Perl_fbm_instr
+char*
+Perl_fbm_instr(pTHXo_ unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_fbm_instr(big, bigend, littlesv, flags);
+}
+#if defined(USE_THREADS)
+#endif
+
+#undef Perl_form
+char*
+Perl_form(pTHXo_ const char* pat, ...)
+{
+ char* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vform(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_vform
+char*
+Perl_vform(pTHXo_ const char* pat, va_list* args)
+{
+ return ((CPerlObj*)pPerl)->Perl_vform(pat, args);
+}
+
+#undef Perl_free_tmps
+void
+Perl_free_tmps(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_free_tmps();
+}
+#if !defined(HAS_GETENV_LEN)
+#endif
+
+#undef Perl_gp_free
+void
+Perl_gp_free(pTHXo_ GV* gv)
+{
+ ((CPerlObj*)pPerl)->Perl_gp_free(gv);
+}
+
+#undef Perl_gp_ref
+GP*
+Perl_gp_ref(pTHXo_ GP* gp)
+{
+ return ((CPerlObj*)pPerl)->Perl_gp_ref(gp);
+}
+
+#undef Perl_gv_AVadd
+GV*
+Perl_gv_AVadd(pTHXo_ GV* gv)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_AVadd(gv);
+}
+
+#undef Perl_gv_HVadd
+GV*
+Perl_gv_HVadd(pTHXo_ GV* gv)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_HVadd(gv);
+}
+
+#undef Perl_gv_IOadd
+GV*
+Perl_gv_IOadd(pTHXo_ GV* gv)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_IOadd(gv);
+}
+
+#undef Perl_gv_autoload4
+GV*
+Perl_gv_autoload4(pTHXo_ HV* stash, const char* name, STRLEN len, I32 method)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_autoload4(stash, name, len, method);
+}
+
+#undef Perl_gv_check
+void
+Perl_gv_check(pTHXo_ HV* stash)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_check(stash);
+}
+
+#undef Perl_gv_efullname
+void
+Perl_gv_efullname(pTHXo_ SV* sv, GV* gv)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_efullname(sv, gv);
+}
+
+#undef Perl_gv_efullname3
+void
+Perl_gv_efullname3(pTHXo_ SV* sv, GV* gv, const char* prefix)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_efullname3(sv, gv, prefix);
+}
+
+#undef Perl_gv_fetchfile
+GV*
+Perl_gv_fetchfile(pTHXo_ const char* name)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_fetchfile(name);
+}
+
+#undef Perl_gv_fetchmeth
+GV*
+Perl_gv_fetchmeth(pTHXo_ HV* stash, const char* name, STRLEN len, I32 level)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_fetchmeth(stash, name, len, level);
+}
+
+#undef Perl_gv_fetchmethod
+GV*
+Perl_gv_fetchmethod(pTHXo_ HV* stash, const char* name)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_fetchmethod(stash, name);
+}
+
+#undef Perl_gv_fetchmethod_autoload
+GV*
+Perl_gv_fetchmethod_autoload(pTHXo_ HV* stash, const char* name, I32 autoload)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_fetchmethod_autoload(stash, name, autoload);
+}
+
+#undef Perl_gv_fetchpv
+GV*
+Perl_gv_fetchpv(pTHXo_ const char* name, I32 add, I32 sv_type)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_fetchpv(name, add, sv_type);
+}
+
+#undef Perl_gv_fullname
+void
+Perl_gv_fullname(pTHXo_ SV* sv, GV* gv)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_fullname(sv, gv);
+}
+
+#undef Perl_gv_fullname3
+void
+Perl_gv_fullname3(pTHXo_ SV* sv, GV* gv, const char* prefix)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_fullname3(sv, gv, prefix);
+}
+
+#undef Perl_gv_init
+void
+Perl_gv_init(pTHXo_ GV* gv, HV* stash, const char* name, STRLEN len, int multi)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_init(gv, stash, name, len, multi);
+}
+
+#undef Perl_gv_stashpv
+HV*
+Perl_gv_stashpv(pTHXo_ const char* name, I32 create)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_stashpv(name, create);
+}
+
+#undef Perl_gv_stashpvn
+HV*
+Perl_gv_stashpvn(pTHXo_ const char* name, U32 namelen, I32 create)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_stashpvn(name, namelen, create);
+}
+
+#undef Perl_gv_stashsv
+HV*
+Perl_gv_stashsv(pTHXo_ SV* sv, I32 create)
+{
+ return ((CPerlObj*)pPerl)->Perl_gv_stashsv(sv, create);
+}
+
+#undef Perl_hv_clear
+void
+Perl_hv_clear(pTHXo_ HV* tb)
+{
+ ((CPerlObj*)pPerl)->Perl_hv_clear(tb);
+}
+
+#undef Perl_hv_delayfree_ent
+void
+Perl_hv_delayfree_ent(pTHXo_ HV* hv, HE* entry)
+{
+ ((CPerlObj*)pPerl)->Perl_hv_delayfree_ent(hv, entry);
+}
+
+#undef Perl_hv_delete
+SV*
+Perl_hv_delete(pTHXo_ HV* tb, const char* key, U32 klen, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_delete(tb, key, klen, flags);
+}
+
+#undef Perl_hv_delete_ent
+SV*
+Perl_hv_delete_ent(pTHXo_ HV* tb, SV* key, I32 flags, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_delete_ent(tb, key, flags, hash);
+}
+
+#undef Perl_hv_exists
+bool
+Perl_hv_exists(pTHXo_ HV* tb, const char* key, U32 klen)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_exists(tb, key, klen);
+}
+
+#undef Perl_hv_exists_ent
+bool
+Perl_hv_exists_ent(pTHXo_ HV* tb, SV* key, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_exists_ent(tb, key, hash);
+}
+
+#undef Perl_hv_fetch
+SV**
+Perl_hv_fetch(pTHXo_ HV* tb, const char* key, U32 klen, I32 lval)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_fetch(tb, key, klen, lval);
+}
+
+#undef Perl_hv_fetch_ent
+HE*
+Perl_hv_fetch_ent(pTHXo_ HV* tb, SV* key, I32 lval, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_fetch_ent(tb, key, lval, hash);
+}
+
+#undef Perl_hv_free_ent
+void
+Perl_hv_free_ent(pTHXo_ HV* hv, HE* entry)
+{
+ ((CPerlObj*)pPerl)->Perl_hv_free_ent(hv, entry);
+}
+
+#undef Perl_hv_iterinit
+I32
+Perl_hv_iterinit(pTHXo_ HV* tb)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_iterinit(tb);
+}
+
+#undef Perl_hv_iterkey
+char*
+Perl_hv_iterkey(pTHXo_ HE* entry, I32* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_iterkey(entry, retlen);
+}
+
+#undef Perl_hv_iterkeysv
+SV*
+Perl_hv_iterkeysv(pTHXo_ HE* entry)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_iterkeysv(entry);
+}
+
+#undef Perl_hv_iternext
+HE*
+Perl_hv_iternext(pTHXo_ HV* tb)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_iternext(tb);
+}
+
+#undef Perl_hv_iternextsv
+SV*
+Perl_hv_iternextsv(pTHXo_ HV* hv, char** key, I32* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_iternextsv(hv, key, retlen);
+}
+
+#undef Perl_hv_iterval
+SV*
+Perl_hv_iterval(pTHXo_ HV* tb, HE* entry)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_iterval(tb, entry);
+}
+
+#undef Perl_hv_ksplit
+void
+Perl_hv_ksplit(pTHXo_ HV* hv, IV newmax)
+{
+ ((CPerlObj*)pPerl)->Perl_hv_ksplit(hv, newmax);
+}
+
+#undef Perl_hv_magic
+void
+Perl_hv_magic(pTHXo_ HV* hv, GV* gv, int how)
+{
+ ((CPerlObj*)pPerl)->Perl_hv_magic(hv, gv, how);
+}
+
+#undef Perl_hv_store
+SV**
+Perl_hv_store(pTHXo_ HV* tb, const char* key, U32 klen, SV* val, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_store(tb, key, klen, val, hash);
+}
+
+#undef Perl_hv_store_ent
+HE*
+Perl_hv_store_ent(pTHXo_ HV* tb, SV* key, SV* val, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_hv_store_ent(tb, key, val, hash);
+}
+
+#undef Perl_hv_undef
+void
+Perl_hv_undef(pTHXo_ HV* tb)
+{
+ ((CPerlObj*)pPerl)->Perl_hv_undef(tb);
+}
+
+#undef Perl_ibcmp
+I32
+Perl_ibcmp(pTHXo_ const char* a, const char* b, I32 len)
+{
+ return ((CPerlObj*)pPerl)->Perl_ibcmp(a, b, len);
+}
+
+#undef Perl_ibcmp_locale
+I32
+Perl_ibcmp_locale(pTHXo_ const char* a, const char* b, I32 len)
+{
+ return ((CPerlObj*)pPerl)->Perl_ibcmp_locale(a, b, len);
+}
+
+#undef Perl_init_stacks
+void
+Perl_init_stacks(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_init_stacks();
+}
+
+#undef Perl_instr
+char*
+Perl_instr(pTHXo_ const char* big, const char* little)
+{
+ return ((CPerlObj*)pPerl)->Perl_instr(big, little);
+}
+
+#undef Perl_is_uni_alnum
+bool
+Perl_is_uni_alnum(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_alnum(c);
+}
+
+#undef Perl_is_uni_alnumc
+bool
+Perl_is_uni_alnumc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_alnumc(c);
+}
+
+#undef Perl_is_uni_idfirst
+bool
+Perl_is_uni_idfirst(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_idfirst(c);
+}
+
+#undef Perl_is_uni_alpha
+bool
+Perl_is_uni_alpha(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_alpha(c);
+}
+
+#undef Perl_is_uni_ascii
+bool
+Perl_is_uni_ascii(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_ascii(c);
+}
+
+#undef Perl_is_uni_space
+bool
+Perl_is_uni_space(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_space(c);
+}
+
+#undef Perl_is_uni_cntrl
+bool
+Perl_is_uni_cntrl(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_cntrl(c);
+}
+
+#undef Perl_is_uni_graph
+bool
+Perl_is_uni_graph(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_graph(c);
+}
+
+#undef Perl_is_uni_digit
+bool
+Perl_is_uni_digit(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_digit(c);
+}
+
+#undef Perl_is_uni_upper
+bool
+Perl_is_uni_upper(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_upper(c);
+}
+
+#undef Perl_is_uni_lower
+bool
+Perl_is_uni_lower(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_lower(c);
+}
+
+#undef Perl_is_uni_print
+bool
+Perl_is_uni_print(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_print(c);
+}
+
+#undef Perl_is_uni_punct
+bool
+Perl_is_uni_punct(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_punct(c);
+}
+
+#undef Perl_is_uni_xdigit
+bool
+Perl_is_uni_xdigit(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_xdigit(c);
+}
+
+#undef Perl_to_uni_upper
+U32
+Perl_to_uni_upper(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_uni_upper(c);
+}
+
+#undef Perl_to_uni_title
+U32
+Perl_to_uni_title(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_uni_title(c);
+}
+
+#undef Perl_to_uni_lower
+U32
+Perl_to_uni_lower(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_uni_lower(c);
+}
+
+#undef Perl_is_uni_alnum_lc
+bool
+Perl_is_uni_alnum_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_alnum_lc(c);
+}
+
+#undef Perl_is_uni_alnumc_lc
+bool
+Perl_is_uni_alnumc_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_alnumc_lc(c);
+}
+
+#undef Perl_is_uni_idfirst_lc
+bool
+Perl_is_uni_idfirst_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_idfirst_lc(c);
+}
+
+#undef Perl_is_uni_alpha_lc
+bool
+Perl_is_uni_alpha_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_alpha_lc(c);
+}
+
+#undef Perl_is_uni_ascii_lc
+bool
+Perl_is_uni_ascii_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_ascii_lc(c);
+}
+
+#undef Perl_is_uni_space_lc
+bool
+Perl_is_uni_space_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_space_lc(c);
+}
+
+#undef Perl_is_uni_cntrl_lc
+bool
+Perl_is_uni_cntrl_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_cntrl_lc(c);
+}
+
+#undef Perl_is_uni_graph_lc
+bool
+Perl_is_uni_graph_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_graph_lc(c);
+}
+
+#undef Perl_is_uni_digit_lc
+bool
+Perl_is_uni_digit_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_digit_lc(c);
+}
+
+#undef Perl_is_uni_upper_lc
+bool
+Perl_is_uni_upper_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_upper_lc(c);
+}
+
+#undef Perl_is_uni_lower_lc
+bool
+Perl_is_uni_lower_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_lower_lc(c);
+}
+
+#undef Perl_is_uni_print_lc
+bool
+Perl_is_uni_print_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_print_lc(c);
+}
+
+#undef Perl_is_uni_punct_lc
+bool
+Perl_is_uni_punct_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_punct_lc(c);
+}
+
+#undef Perl_is_uni_xdigit_lc
+bool
+Perl_is_uni_xdigit_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_uni_xdigit_lc(c);
+}
+
+#undef Perl_to_uni_upper_lc
+U32
+Perl_to_uni_upper_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_uni_upper_lc(c);
+}
+
+#undef Perl_to_uni_title_lc
+U32
+Perl_to_uni_title_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_uni_title_lc(c);
+}
+
+#undef Perl_to_uni_lower_lc
+U32
+Perl_to_uni_lower_lc(pTHXo_ U32 c)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_uni_lower_lc(c);
+}
+
+#undef Perl_is_utf8_char
+int
+Perl_is_utf8_char(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_char(p);
+}
+
+#undef Perl_is_utf8_alnum
+bool
+Perl_is_utf8_alnum(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_alnum(p);
+}
+
+#undef Perl_is_utf8_alnumc
+bool
+Perl_is_utf8_alnumc(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_alnumc(p);
+}
+
+#undef Perl_is_utf8_idfirst
+bool
+Perl_is_utf8_idfirst(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_idfirst(p);
+}
+
+#undef Perl_is_utf8_alpha
+bool
+Perl_is_utf8_alpha(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_alpha(p);
+}
+
+#undef Perl_is_utf8_ascii
+bool
+Perl_is_utf8_ascii(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_ascii(p);
+}
+
+#undef Perl_is_utf8_space
+bool
+Perl_is_utf8_space(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_space(p);
+}
+
+#undef Perl_is_utf8_cntrl
+bool
+Perl_is_utf8_cntrl(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_cntrl(p);
+}
+
+#undef Perl_is_utf8_digit
+bool
+Perl_is_utf8_digit(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_digit(p);
+}
+
+#undef Perl_is_utf8_graph
+bool
+Perl_is_utf8_graph(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_graph(p);
+}
+
+#undef Perl_is_utf8_upper
+bool
+Perl_is_utf8_upper(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_upper(p);
+}
+
+#undef Perl_is_utf8_lower
+bool
+Perl_is_utf8_lower(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_lower(p);
+}
+
+#undef Perl_is_utf8_print
+bool
+Perl_is_utf8_print(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_print(p);
+}
+
+#undef Perl_is_utf8_punct
+bool
+Perl_is_utf8_punct(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_punct(p);
+}
+
+#undef Perl_is_utf8_xdigit
+bool
+Perl_is_utf8_xdigit(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_xdigit(p);
+}
+
+#undef Perl_is_utf8_mark
+bool
+Perl_is_utf8_mark(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_mark(p);
+}
+
+#undef Perl_leave_scope
+void
+Perl_leave_scope(pTHXo_ I32 base)
+{
+ ((CPerlObj*)pPerl)->Perl_leave_scope(base);
+}
+
+#undef Perl_load_module
+void
+Perl_load_module(pTHXo_ U32 flags, SV* name, SV* ver, ...)
+{
+ va_list args;
+ va_start(args, ver);
+ ((CPerlObj*)pPerl)->Perl_vload_module(flags, name, ver, &args);
+ va_end(args);
+}
+
+#undef Perl_vload_module
+void
+Perl_vload_module(pTHXo_ U32 flags, SV* name, SV* ver, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_vload_module(flags, name, ver, args);
+}
+
+#undef Perl_looks_like_number
+I32
+Perl_looks_like_number(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_looks_like_number(sv);
+}
+#if defined(USE_THREADS)
+#endif
+#if defined(USE_LOCALE_COLLATE)
+#endif
+
+#undef Perl_markstack_grow
+void
+Perl_markstack_grow(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_markstack_grow();
+}
+#if defined(USE_LOCALE_COLLATE)
+#endif
+
+#undef Perl_mess
+SV*
+Perl_mess(pTHXo_ const char* pat, ...)
+{
+ SV* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vmess(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_vmess
+SV*
+Perl_vmess(pTHXo_ const char* pat, va_list* args)
+{
+ return ((CPerlObj*)pPerl)->Perl_vmess(pat, args);
+}
+
+#undef Perl_mg_clear
+int
+Perl_mg_clear(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_clear(sv);
+}
+
+#undef Perl_mg_copy
+int
+Perl_mg_copy(pTHXo_ SV* sv, SV* nsv, const char* key, I32 klen)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_copy(sv, nsv, key, klen);
+}
+
+#undef Perl_mg_find
+MAGIC*
+Perl_mg_find(pTHXo_ SV* sv, int type)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_find(sv, type);
+}
+
+#undef Perl_mg_free
+int
+Perl_mg_free(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_free(sv);
+}
+
+#undef Perl_mg_get
+int
+Perl_mg_get(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_get(sv);
+}
+
+#undef Perl_mg_length
+U32
+Perl_mg_length(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_length(sv);
+}
+
+#undef Perl_mg_magical
+void
+Perl_mg_magical(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_mg_magical(sv);
+}
+
+#undef Perl_mg_set
+int
+Perl_mg_set(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_set(sv);
+}
+
+#undef Perl_mg_size
+I32
+Perl_mg_size(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_size(sv);
+}
+
+#undef Perl_moreswitches
+char*
+Perl_moreswitches(pTHXo_ char* s)
+{
+ return ((CPerlObj*)pPerl)->Perl_moreswitches(s);
+}
+
+#undef Perl_my_atof
+NV
+Perl_my_atof(pTHXo_ const char *s)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_atof(s);
+}
+#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
+
+#undef Perl_my_bcopy
+char*
+Perl_my_bcopy(const char* from, char* to, I32 len)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_my_bcopy(from, to, len);
+}
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+
+#undef Perl_my_bzero
+char*
+Perl_my_bzero(char* loc, I32 len)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_my_bzero(loc, len);
+}
+#endif
+
+#undef Perl_my_exit
+void
+Perl_my_exit(pTHXo_ U32 status)
+{
+ ((CPerlObj*)pPerl)->Perl_my_exit(status);
+}
+
+#undef Perl_my_failure_exit
+void
+Perl_my_failure_exit(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_my_failure_exit();
+}
+
+#undef Perl_my_fflush_all
+I32
+Perl_my_fflush_all(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_fflush_all();
+}
+
+#undef Perl_my_lstat
+I32
+Perl_my_lstat(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_lstat();
+}
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+
+#undef Perl_my_memcmp
+I32
+Perl_my_memcmp(const char* s1, const char* s2, I32 len)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_my_memcmp(s1, s2, len);
+}
+#endif
+#if !defined(HAS_MEMSET)
+
+#undef Perl_my_memset
+void*
+Perl_my_memset(char* loc, I32 ch, I32 len)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_my_memset(loc, ch, len);
+}
+#endif
+#if !defined(PERL_OBJECT)
+
+#undef Perl_my_pclose
+I32
+Perl_my_pclose(pTHXo_ PerlIO* ptr)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_pclose(ptr);
+}
+
+#undef Perl_my_popen
+PerlIO*
+Perl_my_popen(pTHXo_ char* cmd, char* mode)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_popen(cmd, mode);
+}
+#endif
+
+#undef Perl_my_setenv
+void
+Perl_my_setenv(pTHXo_ char* nam, char* val)
+{
+ ((CPerlObj*)pPerl)->Perl_my_setenv(nam, val);
+}
+
+#undef Perl_my_stat
+I32
+Perl_my_stat(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_stat();
+}
+#if defined(MYSWAP)
+
+#undef Perl_my_swap
+short
+Perl_my_swap(pTHXo_ short s)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_swap(s);
+}
+
+#undef Perl_my_htonl
+long
+Perl_my_htonl(pTHXo_ long l)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_htonl(l);
+}
+
+#undef Perl_my_ntohl
+long
+Perl_my_ntohl(pTHXo_ long l)
+{
+ return ((CPerlObj*)pPerl)->Perl_my_ntohl(l);
+}
+#endif
+
+#undef Perl_newANONLIST
+OP*
+Perl_newANONLIST(pTHXo_ OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newANONLIST(o);
+}
+
+#undef Perl_newANONHASH
+OP*
+Perl_newANONHASH(pTHXo_ OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newANONHASH(o);
+}
+
+#undef Perl_newANONSUB
+OP*
+Perl_newANONSUB(pTHXo_ I32 floor, OP* proto, OP* block)
+{
+ return ((CPerlObj*)pPerl)->Perl_newANONSUB(floor, proto, block);
+}
+
+#undef Perl_newASSIGNOP
+OP*
+Perl_newASSIGNOP(pTHXo_ I32 flags, OP* left, I32 optype, OP* right)
+{
+ return ((CPerlObj*)pPerl)->Perl_newASSIGNOP(flags, left, optype, right);
+}
+
+#undef Perl_newCONDOP
+OP*
+Perl_newCONDOP(pTHXo_ I32 flags, OP* expr, OP* trueop, OP* falseop)
+{
+ return ((CPerlObj*)pPerl)->Perl_newCONDOP(flags, expr, trueop, falseop);
+}
+
+#undef Perl_newCONSTSUB
+void
+Perl_newCONSTSUB(pTHXo_ HV* stash, char* name, SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_newCONSTSUB(stash, name, sv);
+}
+
+#undef Perl_newFORM
+void
+Perl_newFORM(pTHXo_ I32 floor, OP* o, OP* block)
+{
+ ((CPerlObj*)pPerl)->Perl_newFORM(floor, o, block);
+}
+
+#undef Perl_newFOROP
+OP*
+Perl_newFOROP(pTHXo_ I32 flags, char* label, line_t forline, OP* sclr, OP* expr, OP*block, OP*cont)
+{
+ return ((CPerlObj*)pPerl)->Perl_newFOROP(flags, label, forline, sclr, expr, block, cont);
+}
+
+#undef Perl_newLOGOP
+OP*
+Perl_newLOGOP(pTHXo_ I32 optype, I32 flags, OP* left, OP* right)
+{
+ return ((CPerlObj*)pPerl)->Perl_newLOGOP(optype, flags, left, right);
+}
+
+#undef Perl_newLOOPEX
+OP*
+Perl_newLOOPEX(pTHXo_ I32 type, OP* label)
+{
+ return ((CPerlObj*)pPerl)->Perl_newLOOPEX(type, label);
+}
+
+#undef Perl_newLOOPOP
+OP*
+Perl_newLOOPOP(pTHXo_ I32 flags, I32 debuggable, OP* expr, OP* block)
+{
+ return ((CPerlObj*)pPerl)->Perl_newLOOPOP(flags, debuggable, expr, block);
+}
+
+#undef Perl_newNULLLIST
+OP*
+Perl_newNULLLIST(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_newNULLLIST();
+}
+
+#undef Perl_newOP
+OP*
+Perl_newOP(pTHXo_ I32 optype, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_newOP(optype, flags);
+}
+
+#undef Perl_newPROG
+void
+Perl_newPROG(pTHXo_ OP* o)
+{
+ ((CPerlObj*)pPerl)->Perl_newPROG(o);
+}
+
+#undef Perl_newRANGE
+OP*
+Perl_newRANGE(pTHXo_ I32 flags, OP* left, OP* right)
+{
+ return ((CPerlObj*)pPerl)->Perl_newRANGE(flags, left, right);
+}
+
+#undef Perl_newSLICEOP
+OP*
+Perl_newSLICEOP(pTHXo_ I32 flags, OP* subscript, OP* listop)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSLICEOP(flags, subscript, listop);
+}
+
+#undef Perl_newSTATEOP
+OP*
+Perl_newSTATEOP(pTHXo_ I32 flags, char* label, OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSTATEOP(flags, label, o);
+}
+
+#undef Perl_newSUB
+CV*
+Perl_newSUB(pTHXo_ I32 floor, OP* o, OP* proto, OP* block)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSUB(floor, o, proto, block);
+}
+
+#undef Perl_newXS
+CV*
+Perl_newXS(pTHXo_ char* name, XSUBADDR_t f, char* filename)
+{
+ return ((CPerlObj*)pPerl)->Perl_newXS(name, f, filename);
+}
+
+#undef Perl_newAV
+AV*
+Perl_newAV(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_newAV();
+}
+
+#undef Perl_newAVREF
+OP*
+Perl_newAVREF(pTHXo_ OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newAVREF(o);
+}
+
+#undef Perl_newBINOP
+OP*
+Perl_newBINOP(pTHXo_ I32 type, I32 flags, OP* first, OP* last)
+{
+ return ((CPerlObj*)pPerl)->Perl_newBINOP(type, flags, first, last);
+}
+
+#undef Perl_newCVREF
+OP*
+Perl_newCVREF(pTHXo_ I32 flags, OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newCVREF(flags, o);
+}
+
+#undef Perl_newGVOP
+OP*
+Perl_newGVOP(pTHXo_ I32 type, I32 flags, GV* gv)
+{
+ return ((CPerlObj*)pPerl)->Perl_newGVOP(type, flags, gv);
+}
+
+#undef Perl_newGVgen
+GV*
+Perl_newGVgen(pTHXo_ char* pack)
+{
+ return ((CPerlObj*)pPerl)->Perl_newGVgen(pack);
+}
+
+#undef Perl_newGVREF
+OP*
+Perl_newGVREF(pTHXo_ I32 type, OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newGVREF(type, o);
+}
+
+#undef Perl_newHVREF
+OP*
+Perl_newHVREF(pTHXo_ OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newHVREF(o);
+}
+
+#undef Perl_newHV
+HV*
+Perl_newHV(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_newHV();
+}
+
+#undef Perl_newHVhv
+HV*
+Perl_newHVhv(pTHXo_ HV* hv)
+{
+ return ((CPerlObj*)pPerl)->Perl_newHVhv(hv);
+}
+
+#undef Perl_newIO
+IO*
+Perl_newIO(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_newIO();
+}
+
+#undef Perl_newLISTOP
+OP*
+Perl_newLISTOP(pTHXo_ I32 type, I32 flags, OP* first, OP* last)
+{
+ return ((CPerlObj*)pPerl)->Perl_newLISTOP(type, flags, first, last);
+}
+
+#undef Perl_newPADOP
+OP*
+Perl_newPADOP(pTHXo_ I32 type, I32 flags, SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_newPADOP(type, flags, sv);
+}
+
+#undef Perl_newPMOP
+OP*
+Perl_newPMOP(pTHXo_ I32 type, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_newPMOP(type, flags);
+}
+
+#undef Perl_newPVOP
+OP*
+Perl_newPVOP(pTHXo_ I32 type, I32 flags, char* pv)
+{
+ return ((CPerlObj*)pPerl)->Perl_newPVOP(type, flags, pv);
+}
+
+#undef Perl_newRV
+SV*
+Perl_newRV(pTHXo_ SV* pref)
+{
+ return ((CPerlObj*)pPerl)->Perl_newRV(pref);
+}
+
+#undef Perl_newRV_noinc
+SV*
+Perl_newRV_noinc(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_newRV_noinc(sv);
+}
+
+#undef Perl_newSV
+SV*
+Perl_newSV(pTHXo_ STRLEN len)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSV(len);
+}
+
+#undef Perl_newSVREF
+OP*
+Perl_newSVREF(pTHXo_ OP* o)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVREF(o);
+}
+
+#undef Perl_newSVOP
+OP*
+Perl_newSVOP(pTHXo_ I32 type, I32 flags, SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVOP(type, flags, sv);
+}
+
+#undef Perl_newSViv
+SV*
+Perl_newSViv(pTHXo_ IV i)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSViv(i);
+}
+
+#undef Perl_newSVuv
+SV*
+Perl_newSVuv(pTHXo_ UV u)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVuv(u);
+}
+
+#undef Perl_newSVnv
+SV*
+Perl_newSVnv(pTHXo_ NV n)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVnv(n);
+}
+
+#undef Perl_newSVpv
+SV*
+Perl_newSVpv(pTHXo_ const char* s, STRLEN len)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVpv(s, len);
+}
+
+#undef Perl_newSVpvn
+SV*
+Perl_newSVpvn(pTHXo_ const char* s, STRLEN len)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVpvn(s, len);
+}
+
+#undef Perl_newSVpvf
+SV*
+Perl_newSVpvf(pTHXo_ const char* pat, ...)
+{
+ SV* retval;
+ va_list args;
+ va_start(args, pat);
+ retval = ((CPerlObj*)pPerl)->Perl_vnewSVpvf(pat, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_vnewSVpvf
+SV*
+Perl_vnewSVpvf(pTHXo_ const char* pat, va_list* args)
+{
+ return ((CPerlObj*)pPerl)->Perl_vnewSVpvf(pat, args);
+}
+
+#undef Perl_newSVrv
+SV*
+Perl_newSVrv(pTHXo_ SV* rv, const char* classname)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVrv(rv, classname);
+}
+
+#undef Perl_newSVsv
+SV*
+Perl_newSVsv(pTHXo_ SV* old)
+{
+ return ((CPerlObj*)pPerl)->Perl_newSVsv(old);
+}
+
+#undef Perl_newUNOP
+OP*
+Perl_newUNOP(pTHXo_ I32 type, I32 flags, OP* first)
+{
+ return ((CPerlObj*)pPerl)->Perl_newUNOP(type, flags, first);
+}
+
+#undef Perl_newWHILEOP
+OP*
+Perl_newWHILEOP(pTHXo_ I32 flags, I32 debuggable, LOOP* loop, I32 whileline, OP* expr, OP* block, OP* cont)
+{
+ return ((CPerlObj*)pPerl)->Perl_newWHILEOP(flags, debuggable, loop, whileline, expr, block, cont);
+}
+
+#undef Perl_new_stackinfo
+PERL_SI*
+Perl_new_stackinfo(pTHXo_ I32 stitems, I32 cxitems)
+{
+ return ((CPerlObj*)pPerl)->Perl_new_stackinfo(stitems, cxitems);
+}
+
+#undef Perl_ninstr
+char*
+Perl_ninstr(pTHXo_ const char* big, const char* bigend, const char* little, const char* lend)
+{
+ return ((CPerlObj*)pPerl)->Perl_ninstr(big, bigend, little, lend);
+}
+
+#undef Perl_op_free
+void
+Perl_op_free(pTHXo_ OP* arg)
+{
+ ((CPerlObj*)pPerl)->Perl_op_free(arg);
+}
+
+#undef Perl_pad_sv
+SV*
+Perl_pad_sv(pTHXo_ PADOFFSET po)
+{
+ return ((CPerlObj*)pPerl)->Perl_pad_sv(po);
+}
+#if defined(PERL_OBJECT)
+
+#undef Perl_construct
+void
+Perl_construct(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_construct();
+}
+
+#undef Perl_destruct
+void
+Perl_destruct(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_destruct();
+}
+
+#undef Perl_free
+void
+Perl_free(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_free();
+}
+
+#undef Perl_run
+int
+Perl_run(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_run();
+}
+
+#undef Perl_parse
+int
+Perl_parse(pTHXo_ XSINIT_t xsinit, int argc, char** argv, char** env)
+{
+ return ((CPerlObj*)pPerl)->Perl_parse(xsinit, argc, argv, env);
+}
+#endif
+#if defined(USE_THREADS)
+
+#undef Perl_new_struct_thread
+struct perl_thread*
+Perl_new_struct_thread(pTHXo_ struct perl_thread *t)
+{
+ return ((CPerlObj*)pPerl)->Perl_new_struct_thread(t);
+}
+#endif
+
+#undef Perl_call_atexit
+void
+Perl_call_atexit(pTHXo_ ATEXIT_t fn, void *ptr)
+{
+ ((CPerlObj*)pPerl)->Perl_call_atexit(fn, ptr);
+}
+
+#undef Perl_call_argv
+I32
+Perl_call_argv(pTHXo_ const char* sub_name, I32 flags, char** argv)
+{
+ return ((CPerlObj*)pPerl)->Perl_call_argv(sub_name, flags, argv);
+}
+
+#undef Perl_call_method
+I32
+Perl_call_method(pTHXo_ const char* methname, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_call_method(methname, flags);
+}
+
+#undef Perl_call_pv
+I32
+Perl_call_pv(pTHXo_ const char* sub_name, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_call_pv(sub_name, flags);
+}
+
+#undef Perl_call_sv
+I32
+Perl_call_sv(pTHXo_ SV* sv, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_call_sv(sv, flags);
+}
+
+#undef Perl_eval_pv
+SV*
+Perl_eval_pv(pTHXo_ const char* p, I32 croak_on_error)
+{
+ return ((CPerlObj*)pPerl)->Perl_eval_pv(p, croak_on_error);
+}
+
+#undef Perl_eval_sv
+I32
+Perl_eval_sv(pTHXo_ SV* sv, I32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_eval_sv(sv, flags);
+}
+
+#undef Perl_get_sv
+SV*
+Perl_get_sv(pTHXo_ const char* name, I32 create)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_sv(name, create);
+}
+
+#undef Perl_get_av
+AV*
+Perl_get_av(pTHXo_ const char* name, I32 create)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_av(name, create);
+}
+
+#undef Perl_get_hv
+HV*
+Perl_get_hv(pTHXo_ const char* name, I32 create)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_hv(name, create);
+}
+
+#undef Perl_get_cv
+CV*
+Perl_get_cv(pTHXo_ const char* name, I32 create)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_cv(name, create);
+}
+
+#undef Perl_init_i18nl10n
+int
+Perl_init_i18nl10n(pTHXo_ int printwarn)
+{
+ return ((CPerlObj*)pPerl)->Perl_init_i18nl10n(printwarn);
+}
+
+#undef Perl_init_i18nl14n
+int
+Perl_init_i18nl14n(pTHXo_ int printwarn)
+{
+ return ((CPerlObj*)pPerl)->Perl_init_i18nl14n(printwarn);
+}
+
+#undef Perl_new_collate
+void
+Perl_new_collate(pTHXo_ const char* newcoll)
+{
+ ((CPerlObj*)pPerl)->Perl_new_collate(newcoll);
+}
+
+#undef Perl_new_ctype
+void
+Perl_new_ctype(pTHXo_ const char* newctype)
+{
+ ((CPerlObj*)pPerl)->Perl_new_ctype(newctype);
+}
+
+#undef Perl_new_numeric
+void
+Perl_new_numeric(pTHXo_ const char* newcoll)
+{
+ ((CPerlObj*)pPerl)->Perl_new_numeric(newcoll);
+}
+
+#undef Perl_set_numeric_local
+void
+Perl_set_numeric_local(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_set_numeric_local();
+}
+
+#undef Perl_set_numeric_radix
+void
+Perl_set_numeric_radix(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_set_numeric_radix();
+}
+
+#undef Perl_set_numeric_standard
+void
+Perl_set_numeric_standard(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_set_numeric_standard();
+}
+
+#undef Perl_require_pv
+void
+Perl_require_pv(pTHXo_ const char* pv)
+{
+ ((CPerlObj*)pPerl)->Perl_require_pv(pv);
+}
+
+#undef Perl_pmflag
+void
+Perl_pmflag(pTHXo_ U16* pmfl, int ch)
+{
+ ((CPerlObj*)pPerl)->Perl_pmflag(pmfl, ch);
+}
+
+#undef Perl_pop_scope
+void
+Perl_pop_scope(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_pop_scope();
+}
+
+#undef Perl_push_scope
+void
+Perl_push_scope(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_push_scope();
+}
+
+#undef Perl_regdump
+void
+Perl_regdump(pTHXo_ regexp* r)
+{
+ ((CPerlObj*)pPerl)->Perl_regdump(r);
+}
+
+#undef Perl_pregexec
+I32
+Perl_pregexec(pTHXo_ regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave)
+{
+ return ((CPerlObj*)pPerl)->Perl_pregexec(prog, stringarg, strend, strbeg, minend, screamer, nosave);
+}
+
+#undef Perl_pregfree
+void
+Perl_pregfree(pTHXo_ struct regexp* r)
+{
+ ((CPerlObj*)pPerl)->Perl_pregfree(r);
+}
+
+#undef Perl_pregcomp
+regexp*
+Perl_pregcomp(pTHXo_ char* exp, char* xend, PMOP* pm)
+{
+ return ((CPerlObj*)pPerl)->Perl_pregcomp(exp, xend, pm);
+}
+
+#undef Perl_re_intuit_start
+char*
+Perl_re_intuit_start(pTHXo_ regexp* prog, SV* sv, char* strpos, char* strend, U32 flags, struct re_scream_pos_data_s *data)
+{
+ return ((CPerlObj*)pPerl)->Perl_re_intuit_start(prog, sv, strpos, strend, flags, data);
+}
+
+#undef Perl_re_intuit_string
+SV*
+Perl_re_intuit_string(pTHXo_ regexp* prog)
+{
+ return ((CPerlObj*)pPerl)->Perl_re_intuit_string(prog);
+}
+
+#undef Perl_regexec_flags
+I32
+Perl_regexec_flags(pTHXo_ regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, void* data, U32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_regexec_flags(prog, stringarg, strend, strbeg, minend, screamer, data, flags);
+}
+
+#undef Perl_regnext
+regnode*
+Perl_regnext(pTHXo_ regnode* p)
+{
+ return ((CPerlObj*)pPerl)->Perl_regnext(p);
+}
+
+#undef Perl_repeatcpy
+void
+Perl_repeatcpy(pTHXo_ char* to, const char* from, I32 len, I32 count)
+{
+ ((CPerlObj*)pPerl)->Perl_repeatcpy(to, from, len, count);
+}
+
+#undef Perl_rninstr
+char*
+Perl_rninstr(pTHXo_ const char* big, const char* bigend, const char* little, const char* lend)
+{
+ return ((CPerlObj*)pPerl)->Perl_rninstr(big, bigend, little, lend);
+}
+#if !defined(HAS_RENAME)
+#endif
+
+#undef Perl_savepv
+char*
+Perl_savepv(pTHXo_ const char* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_savepv(sv);
+}
+
+#undef Perl_savepvn
+char*
+Perl_savepvn(pTHXo_ const char* sv, I32 len)
+{
+ return ((CPerlObj*)pPerl)->Perl_savepvn(sv, len);
+}
+
+#undef Perl_savestack_grow
+void
+Perl_savestack_grow(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_savestack_grow();
+}
+
+#undef Perl_save_aelem
+void
+Perl_save_aelem(pTHXo_ AV* av, I32 idx, SV **sptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_aelem(av, idx, sptr);
+}
+
+#undef Perl_save_alloc
+I32
+Perl_save_alloc(pTHXo_ I32 size, I32 pad)
+{
+ return ((CPerlObj*)pPerl)->Perl_save_alloc(size, pad);
+}
+
+#undef Perl_save_aptr
+void
+Perl_save_aptr(pTHXo_ AV** aptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_aptr(aptr);
+}
+
+#undef Perl_save_ary
+AV*
+Perl_save_ary(pTHXo_ GV* gv)
+{
+ return ((CPerlObj*)pPerl)->Perl_save_ary(gv);
+}
+
+#undef Perl_save_clearsv
+void
+Perl_save_clearsv(pTHXo_ SV** svp)
+{
+ ((CPerlObj*)pPerl)->Perl_save_clearsv(svp);
+}
+
+#undef Perl_save_delete
+void
+Perl_save_delete(pTHXo_ HV* hv, char* key, I32 klen)
+{
+ ((CPerlObj*)pPerl)->Perl_save_delete(hv, key, klen);
+}
+
+#undef Perl_save_destructor
+void
+Perl_save_destructor(pTHXo_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
+{
+ ((CPerlObj*)pPerl)->Perl_save_destructor(f, p);
+}
+
+#undef Perl_save_destructor_x
+void
+Perl_save_destructor_x(pTHXo_ DESTRUCTORFUNC_t f, void* p)
+{
+ ((CPerlObj*)pPerl)->Perl_save_destructor_x(f, p);
+}
+
+#undef Perl_save_freesv
+void
+Perl_save_freesv(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_save_freesv(sv);
+}
+
+#undef Perl_save_freepv
+void
+Perl_save_freepv(pTHXo_ char* pv)
+{
+ ((CPerlObj*)pPerl)->Perl_save_freepv(pv);
+}
+
+#undef Perl_save_generic_svref
+void
+Perl_save_generic_svref(pTHXo_ SV** sptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_generic_svref(sptr);
+}
+
+#undef Perl_save_gp
+void
+Perl_save_gp(pTHXo_ GV* gv, I32 empty)
+{
+ ((CPerlObj*)pPerl)->Perl_save_gp(gv, empty);
+}
+
+#undef Perl_save_hash
+HV*
+Perl_save_hash(pTHXo_ GV* gv)
+{
+ return ((CPerlObj*)pPerl)->Perl_save_hash(gv);
+}
+
+#undef Perl_save_helem
+void
+Perl_save_helem(pTHXo_ HV* hv, SV *key, SV **sptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_helem(hv, key, sptr);
+}
+
+#undef Perl_save_hints
+void
+Perl_save_hints(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_save_hints();
+}
+
+#undef Perl_save_hptr
+void
+Perl_save_hptr(pTHXo_ HV** hptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_hptr(hptr);
+}
+
+#undef Perl_save_I16
+void
+Perl_save_I16(pTHXo_ I16* intp)
+{
+ ((CPerlObj*)pPerl)->Perl_save_I16(intp);
+}
+
+#undef Perl_save_I32
+void
+Perl_save_I32(pTHXo_ I32* intp)
+{
+ ((CPerlObj*)pPerl)->Perl_save_I32(intp);
+}
+
+#undef Perl_save_I8
+void
+Perl_save_I8(pTHXo_ I8* bytep)
+{
+ ((CPerlObj*)pPerl)->Perl_save_I8(bytep);
+}
+
+#undef Perl_save_int
+void
+Perl_save_int(pTHXo_ int* intp)
+{
+ ((CPerlObj*)pPerl)->Perl_save_int(intp);
+}
+
+#undef Perl_save_item
+void
+Perl_save_item(pTHXo_ SV* item)
+{
+ ((CPerlObj*)pPerl)->Perl_save_item(item);
+}
+
+#undef Perl_save_iv
+void
+Perl_save_iv(pTHXo_ IV* iv)
+{
+ ((CPerlObj*)pPerl)->Perl_save_iv(iv);
+}
+
+#undef Perl_save_list
+void
+Perl_save_list(pTHXo_ SV** sarg, I32 maxsarg)
+{
+ ((CPerlObj*)pPerl)->Perl_save_list(sarg, maxsarg);
+}
+
+#undef Perl_save_long
+void
+Perl_save_long(pTHXo_ long* longp)
+{
+ ((CPerlObj*)pPerl)->Perl_save_long(longp);
+}
+
+#undef Perl_save_nogv
+void
+Perl_save_nogv(pTHXo_ GV* gv)
+{
+ ((CPerlObj*)pPerl)->Perl_save_nogv(gv);
+}
+
+#undef Perl_save_scalar
+SV*
+Perl_save_scalar(pTHXo_ GV* gv)
+{
+ return ((CPerlObj*)pPerl)->Perl_save_scalar(gv);
+}
+
+#undef Perl_save_pptr
+void
+Perl_save_pptr(pTHXo_ char** pptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_pptr(pptr);
+}
+
+#undef Perl_save_vptr
+void
+Perl_save_vptr(pTHXo_ void* pptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_vptr(pptr);
+}
+
+#undef Perl_save_re_context
+void
+Perl_save_re_context(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_save_re_context();
+}
+
+#undef Perl_save_sptr
+void
+Perl_save_sptr(pTHXo_ SV** sptr)
+{
+ ((CPerlObj*)pPerl)->Perl_save_sptr(sptr);
+}
+
+#undef Perl_save_svref
+SV*
+Perl_save_svref(pTHXo_ SV** sptr)
+{
+ return ((CPerlObj*)pPerl)->Perl_save_svref(sptr);
+}
+
+#undef Perl_save_threadsv
+SV**
+Perl_save_threadsv(pTHXo_ PADOFFSET i)
+{
+ return ((CPerlObj*)pPerl)->Perl_save_threadsv(i);
+}
+
+#undef Perl_scan_bin
+NV
+Perl_scan_bin(pTHXo_ char* start, I32 len, I32* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_scan_bin(start, len, retlen);
+}
+
+#undef Perl_scan_hex
+NV
+Perl_scan_hex(pTHXo_ char* start, I32 len, I32* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_scan_hex(start, len, retlen);
+}
+
+#undef Perl_scan_num
+char*
+Perl_scan_num(pTHXo_ char* s)
+{
+ return ((CPerlObj*)pPerl)->Perl_scan_num(s);
+}
+
+#undef Perl_scan_oct
+NV
+Perl_scan_oct(pTHXo_ char* start, I32 len, I32* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_scan_oct(start, len, retlen);
+}
+
+#undef Perl_screaminstr
+char*
+Perl_screaminstr(pTHXo_ SV* bigsv, SV* littlesv, I32 start_shift, I32 end_shift, I32 *state, I32 last)
+{
+ return ((CPerlObj*)pPerl)->Perl_screaminstr(bigsv, littlesv, start_shift, end_shift, state, last);
+}
+#if !defined(VMS)
+#endif
+
+#undef Perl_sharepvn
+char*
+Perl_sharepvn(pTHXo_ const char* sv, I32 len, U32 hash)
+{
+ return ((CPerlObj*)pPerl)->Perl_sharepvn(sv, len, hash);
+}
+
+#undef Perl_stack_grow
+SV**
+Perl_stack_grow(pTHXo_ SV** sp, SV**p, int n)
+{
+ return ((CPerlObj*)pPerl)->Perl_stack_grow(sp, p, n);
+}
+
+#undef Perl_start_subparse
+I32
+Perl_start_subparse(pTHXo_ I32 is_format, U32 flags)
+{
+ return ((CPerlObj*)pPerl)->Perl_start_subparse(is_format, flags);
+}
+
+#undef Perl_sv_2bool
+bool
+Perl_sv_2bool(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2bool(sv);
+}
+
+#undef Perl_sv_2cv
+CV*
+Perl_sv_2cv(pTHXo_ SV* sv, HV** st, GV** gvp, I32 lref)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2cv(sv, st, gvp, lref);
+}
+
+#undef Perl_sv_2io
+IO*
+Perl_sv_2io(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2io(sv);
+}
+
+#undef Perl_sv_2iv
+IV
+Perl_sv_2iv(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2iv(sv);
+}
+
+#undef Perl_sv_2mortal
+SV*
+Perl_sv_2mortal(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2mortal(sv);
+}
+
+#undef Perl_sv_2nv
+NV
+Perl_sv_2nv(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2nv(sv);
+}
+
+#undef Perl_sv_2pv
+char*
+Perl_sv_2pv(pTHXo_ SV* sv, STRLEN* lp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2pv(sv, lp);
+}
+
+#undef Perl_sv_2pvutf8
+char*
+Perl_sv_2pvutf8(pTHXo_ SV* sv, STRLEN* lp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2pvutf8(sv, lp);
+}
+
+#undef Perl_sv_2pvbyte
+char*
+Perl_sv_2pvbyte(pTHXo_ SV* sv, STRLEN* lp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2pvbyte(sv, lp);
+}
+
+#undef Perl_sv_2uv
+UV
+Perl_sv_2uv(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2uv(sv);
+}
+
+#undef Perl_sv_iv
+IV
+Perl_sv_iv(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_iv(sv);
+}
+
+#undef Perl_sv_uv
+UV
+Perl_sv_uv(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_uv(sv);
+}
+
+#undef Perl_sv_nv
+NV
+Perl_sv_nv(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_nv(sv);
+}
+
+#undef Perl_sv_pvn
+char*
+Perl_sv_pvn(pTHXo_ SV *sv, STRLEN *len)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvn(sv, len);
+}
+
+#undef Perl_sv_pvutf8n
+char*
+Perl_sv_pvutf8n(pTHXo_ SV *sv, STRLEN *len)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvutf8n(sv, len);
+}
+
+#undef Perl_sv_pvbyten
+char*
+Perl_sv_pvbyten(pTHXo_ SV *sv, STRLEN *len)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvbyten(sv, len);
+}
+
+#undef Perl_sv_true
+I32
+Perl_sv_true(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_true(sv);
+}
+
+#undef Perl_sv_backoff
+int
+Perl_sv_backoff(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_backoff(sv);
+}
+
+#undef Perl_sv_bless
+SV*
+Perl_sv_bless(pTHXo_ SV* sv, HV* stash)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_bless(sv, stash);
+}
+
+#undef Perl_sv_catpvf
+void
+Perl_sv_catpvf(pTHXo_ SV* sv, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vcatpvf(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_sv_vcatpvf
+void
+Perl_sv_vcatpvf(pTHXo_ SV* sv, const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_vcatpvf(sv, pat, args);
+}
+
+#undef Perl_sv_catpv
+void
+Perl_sv_catpv(pTHXo_ SV* sv, const char* ptr)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_catpv(sv, ptr);
+}
+
+#undef Perl_sv_catpvn
+void
+Perl_sv_catpvn(pTHXo_ SV* sv, const char* ptr, STRLEN len)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_catpvn(sv, ptr, len);
+}
+
+#undef Perl_sv_catsv
+void
+Perl_sv_catsv(pTHXo_ SV* dsv, SV* ssv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_catsv(dsv, ssv);
+}
+
+#undef Perl_sv_chop
+void
+Perl_sv_chop(pTHXo_ SV* sv, char* ptr)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_chop(sv, ptr);
+}
+
+#undef Perl_sv_clear
+void
+Perl_sv_clear(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_clear(sv);
+}
+
+#undef Perl_sv_cmp
+I32
+Perl_sv_cmp(pTHXo_ SV* sv1, SV* sv2)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_cmp(sv1, sv2);
+}
+
+#undef Perl_sv_cmp_locale
+I32
+Perl_sv_cmp_locale(pTHXo_ SV* sv1, SV* sv2)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_cmp_locale(sv1, sv2);
+}
+#if defined(USE_LOCALE_COLLATE)
+
+#undef Perl_sv_collxfrm
+char*
+Perl_sv_collxfrm(pTHXo_ SV* sv, STRLEN* nxp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_collxfrm(sv, nxp);
+}
+#endif
+
+#undef Perl_sv_compile_2op
+OP*
+Perl_sv_compile_2op(pTHXo_ SV* sv, OP** startp, char* code, AV** avp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_compile_2op(sv, startp, code, avp);
+}
+
+#undef Perl_sv_dec
+void
+Perl_sv_dec(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_dec(sv);
+}
+
+#undef Perl_sv_dump
+void
+Perl_sv_dump(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_dump(sv);
+}
+
+#undef Perl_sv_derived_from
+bool
+Perl_sv_derived_from(pTHXo_ SV* sv, const char* name)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_derived_from(sv, name);
+}
+
+#undef Perl_sv_eq
+I32
+Perl_sv_eq(pTHXo_ SV* sv1, SV* sv2)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_eq(sv1, sv2);
+}
+
+#undef Perl_sv_free
+void
+Perl_sv_free(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_free(sv);
+}
+
+#undef Perl_sv_gets
+char*
+Perl_sv_gets(pTHXo_ SV* sv, PerlIO* fp, I32 append)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_gets(sv, fp, append);
+}
+
+#undef Perl_sv_grow
+char*
+Perl_sv_grow(pTHXo_ SV* sv, STRLEN newlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_grow(sv, newlen);
+}
+
+#undef Perl_sv_inc
+void
+Perl_sv_inc(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_inc(sv);
+}
+
+#undef Perl_sv_insert
+void
+Perl_sv_insert(pTHXo_ SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_insert(bigsv, offset, len, little, littlelen);
+}
+
+#undef Perl_sv_isa
+int
+Perl_sv_isa(pTHXo_ SV* sv, const char* name)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_isa(sv, name);
+}
+
+#undef Perl_sv_isobject
+int
+Perl_sv_isobject(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_isobject(sv);
+}
+
+#undef Perl_sv_len
+STRLEN
+Perl_sv_len(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_len(sv);
+}
+
+#undef Perl_sv_len_utf8
+STRLEN
+Perl_sv_len_utf8(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_len_utf8(sv);
+}
+
+#undef Perl_sv_magic
+void
+Perl_sv_magic(pTHXo_ SV* sv, SV* obj, int how, const char* name, I32 namlen)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_magic(sv, obj, how, name, namlen);
+}
+
+#undef Perl_sv_mortalcopy
+SV*
+Perl_sv_mortalcopy(pTHXo_ SV* oldsv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_mortalcopy(oldsv);
+}
+
+#undef Perl_sv_newmortal
+SV*
+Perl_sv_newmortal(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_newmortal();
+}
+
+#undef Perl_sv_newref
+SV*
+Perl_sv_newref(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_newref(sv);
+}
+
+#undef Perl_sv_peek
+char*
+Perl_sv_peek(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_peek(sv);
+}
+
+#undef Perl_sv_pos_u2b
+void
+Perl_sv_pos_u2b(pTHXo_ SV* sv, I32* offsetp, I32* lenp)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_pos_u2b(sv, offsetp, lenp);
+}
+
+#undef Perl_sv_pos_b2u
+void
+Perl_sv_pos_b2u(pTHXo_ SV* sv, I32* offsetp)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_pos_b2u(sv, offsetp);
+}
+
+#undef Perl_sv_pvn_force
+char*
+Perl_sv_pvn_force(pTHXo_ SV* sv, STRLEN* lp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvn_force(sv, lp);
+}
+
+#undef Perl_sv_pvutf8n_force
+char*
+Perl_sv_pvutf8n_force(pTHXo_ SV* sv, STRLEN* lp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvutf8n_force(sv, lp);
+}
+
+#undef Perl_sv_pvbyten_force
+char*
+Perl_sv_pvbyten_force(pTHXo_ SV* sv, STRLEN* lp)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvbyten_force(sv, lp);
+}
+
+#undef Perl_sv_reftype
+char*
+Perl_sv_reftype(pTHXo_ SV* sv, int ob)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_reftype(sv, ob);
+}
+
+#undef Perl_sv_replace
+void
+Perl_sv_replace(pTHXo_ SV* sv, SV* nsv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_replace(sv, nsv);
+}
+
+#undef Perl_sv_report_used
+void
+Perl_sv_report_used(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_report_used();
+}
+
+#undef Perl_sv_reset
+void
+Perl_sv_reset(pTHXo_ char* s, HV* stash)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_reset(s, stash);
+}
+
+#undef Perl_sv_setpvf
+void
+Perl_sv_setpvf(pTHXo_ SV* sv, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vsetpvf(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_sv_vsetpvf
+void
+Perl_sv_vsetpvf(pTHXo_ SV* sv, const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_vsetpvf(sv, pat, args);
+}
+
+#undef Perl_sv_setiv
+void
+Perl_sv_setiv(pTHXo_ SV* sv, IV num)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setiv(sv, num);
+}
+
+#undef Perl_sv_setpviv
+void
+Perl_sv_setpviv(pTHXo_ SV* sv, IV num)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setpviv(sv, num);
+}
+
+#undef Perl_sv_setuv
+void
+Perl_sv_setuv(pTHXo_ SV* sv, UV num)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setuv(sv, num);
+}
+
+#undef Perl_sv_setnv
+void
+Perl_sv_setnv(pTHXo_ SV* sv, NV num)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setnv(sv, num);
+}
+
+#undef Perl_sv_setref_iv
+SV*
+Perl_sv_setref_iv(pTHXo_ SV* rv, const char* classname, IV iv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_setref_iv(rv, classname, iv);
+}
+
+#undef Perl_sv_setref_nv
+SV*
+Perl_sv_setref_nv(pTHXo_ SV* rv, const char* classname, NV nv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_setref_nv(rv, classname, nv);
+}
+
+#undef Perl_sv_setref_pv
+SV*
+Perl_sv_setref_pv(pTHXo_ SV* rv, const char* classname, void* pv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_setref_pv(rv, classname, pv);
+}
+
+#undef Perl_sv_setref_pvn
+SV*
+Perl_sv_setref_pvn(pTHXo_ SV* rv, const char* classname, char* pv, STRLEN n)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_setref_pvn(rv, classname, pv, n);
+}
+
+#undef Perl_sv_setpv
+void
+Perl_sv_setpv(pTHXo_ SV* sv, const char* ptr)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setpv(sv, ptr);
+}
+
+#undef Perl_sv_setpvn
+void
+Perl_sv_setpvn(pTHXo_ SV* sv, const char* ptr, STRLEN len)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setpvn(sv, ptr, len);
+}
+
+#undef Perl_sv_setsv
+void
+Perl_sv_setsv(pTHXo_ SV* dsv, SV* ssv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setsv(dsv, ssv);
+}
+
+#undef Perl_sv_taint
+void
+Perl_sv_taint(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_taint(sv);
+}
+
+#undef Perl_sv_tainted
+bool
+Perl_sv_tainted(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_tainted(sv);
+}
+
+#undef Perl_sv_unmagic
+int
+Perl_sv_unmagic(pTHXo_ SV* sv, int type)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_unmagic(sv, type);
+}
+
+#undef Perl_sv_unref
+void
+Perl_sv_unref(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_unref(sv);
+}
+
+#undef Perl_sv_untaint
+void
+Perl_sv_untaint(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_untaint(sv);
+}
+
+#undef Perl_sv_upgrade
+bool
+Perl_sv_upgrade(pTHXo_ SV* sv, U32 mt)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_upgrade(sv, mt);
+}
+
+#undef Perl_sv_usepvn
+void
+Perl_sv_usepvn(pTHXo_ SV* sv, char* ptr, STRLEN len)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_usepvn(sv, ptr, len);
+}
+
+#undef Perl_sv_vcatpvfn
+void
+Perl_sv_vcatpvfn(pTHXo_ SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
+}
+
+#undef Perl_sv_vsetpvfn
+void
+Perl_sv_vsetpvfn(pTHXo_ SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_vsetpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
+}
+
+#undef Perl_str_to_version
+NV
+Perl_str_to_version(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_str_to_version(sv);
+}
+
+#undef Perl_swash_init
+SV*
+Perl_swash_init(pTHXo_ char* pkg, char* name, SV* listsv, I32 minbits, I32 none)
+{
+ return ((CPerlObj*)pPerl)->Perl_swash_init(pkg, name, listsv, minbits, none);
+}
+
+#undef Perl_swash_fetch
+UV
+Perl_swash_fetch(pTHXo_ SV *sv, U8 *ptr)
+{
+ return ((CPerlObj*)pPerl)->Perl_swash_fetch(sv, ptr);
+}
+
+#undef Perl_taint_env
+void
+Perl_taint_env(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_taint_env();
+}
+
+#undef Perl_taint_proper
+void
+Perl_taint_proper(pTHXo_ const char* f, const char* s)
+{
+ ((CPerlObj*)pPerl)->Perl_taint_proper(f, s);
+}
+
+#undef Perl_to_utf8_lower
+UV
+Perl_to_utf8_lower(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_utf8_lower(p);
+}
+
+#undef Perl_to_utf8_upper
+UV
+Perl_to_utf8_upper(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_utf8_upper(p);
+}
+
+#undef Perl_to_utf8_title
+UV
+Perl_to_utf8_title(pTHXo_ U8 *p)
+{
+ return ((CPerlObj*)pPerl)->Perl_to_utf8_title(p);
+}
+#if defined(UNLINK_ALL_VERSIONS)
+
+#undef Perl_unlnk
+I32
+Perl_unlnk(pTHXo_ char* f)
+{
+ return ((CPerlObj*)pPerl)->Perl_unlnk(f);
+}
+#endif
+#if defined(USE_THREADS)
+
+#undef Perl_unlock_condpair
+void
+Perl_unlock_condpair(pTHXo_ void* svv)
+{
+ ((CPerlObj*)pPerl)->Perl_unlock_condpair(svv);
+}
+#endif
+
+#undef Perl_unsharepvn
+void
+Perl_unsharepvn(pTHXo_ const char* sv, I32 len, U32 hash)
+{
+ ((CPerlObj*)pPerl)->Perl_unsharepvn(sv, len, hash);
+}
+
+#undef Perl_utf16_to_utf8
+U8*
+Perl_utf16_to_utf8(pTHXo_ U16* p, U8 *d, I32 bytelen)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf16_to_utf8(p, d, bytelen);
+}
+
+#undef Perl_utf16_to_utf8_reversed
+U8*
+Perl_utf16_to_utf8_reversed(pTHXo_ U16* p, U8 *d, I32 bytelen)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf16_to_utf8_reversed(p, d, bytelen);
+}
+
+#undef Perl_utf8_distance
+I32
+Perl_utf8_distance(pTHXo_ U8 *a, U8 *b)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf8_distance(a, b);
+}
+
+#undef Perl_utf8_hop
+U8*
+Perl_utf8_hop(pTHXo_ U8 *s, I32 off)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf8_hop(s, off);
+}
+
+#undef Perl_utf8_to_uv
+UV
+Perl_utf8_to_uv(pTHXo_ U8 *s, I32* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf8_to_uv(s, retlen);
+}
+
+#undef Perl_uv_to_utf8
+U8*
+Perl_uv_to_utf8(pTHXo_ U8 *d, UV uv)
+{
+ return ((CPerlObj*)pPerl)->Perl_uv_to_utf8(d, uv);
+}
+
+#undef Perl_warn
+void
+Perl_warn(pTHXo_ const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vwarn(pat, &args);
+ va_end(args);
+}
+
+#undef Perl_vwarn
+void
+Perl_vwarn(pTHXo_ const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_vwarn(pat, args);
+}
+
+#undef Perl_warner
+void
+Perl_warner(pTHXo_ U32 err, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_vwarner(err, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_vwarner
+void
+Perl_vwarner(pTHXo_ U32 err, const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_vwarner(err, pat, args);
+}
+#if defined(USE_PURE_BISON)
+#else
+#endif
+#if defined(MYMALLOC)
+
+#undef Perl_dump_mstats
+void
+Perl_dump_mstats(pTHXo_ char* s)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_mstats(s);
+}
+
+#undef Perl_get_mstats
+int
+Perl_get_mstats(pTHXo_ perl_mstats_t *buf, int buflen, int level)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_mstats(buf, buflen, level);
+}
+#endif
+
+#undef Perl_safesysmalloc
+Malloc_t
+Perl_safesysmalloc(MEM_SIZE nbytes)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_safesysmalloc(nbytes);
+}
+
+#undef Perl_safesyscalloc
+Malloc_t
+Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_safesyscalloc(elements, size);
+}
+
+#undef Perl_safesysrealloc
+Malloc_t
+Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_safesysrealloc(where, nbytes);
+}
+
+#undef Perl_safesysfree
+Free_t
+Perl_safesysfree(Malloc_t where)
+{
+ dTHXo;
+ ((CPerlObj*)pPerl)->Perl_safesysfree(where);
+}
+#if defined(LEAKTEST)
+
+#undef Perl_safexmalloc
+Malloc_t
+Perl_safexmalloc(I32 x, MEM_SIZE size)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_safexmalloc(x, size);
+}
+
+#undef Perl_safexcalloc
+Malloc_t
+Perl_safexcalloc(I32 x, MEM_SIZE elements, MEM_SIZE size)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_safexcalloc(x, elements, size);
+}
+
+#undef Perl_safexrealloc
+Malloc_t
+Perl_safexrealloc(Malloc_t where, MEM_SIZE size)
+{
+ dTHXo;
+ return ((CPerlObj*)pPerl)->Perl_safexrealloc(where, size);
+}
+
+#undef Perl_safexfree
+void
+Perl_safexfree(Malloc_t where)
+{
+ dTHXo;
+ ((CPerlObj*)pPerl)->Perl_safexfree(where);
+}
+#endif
+#if defined(PERL_GLOBAL_STRUCT)
+
+#undef Perl_GetVars
+struct perl_vars *
+Perl_GetVars(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_GetVars();
+}
+#endif
+
+#undef Perl_runops_standard
+int
+Perl_runops_standard(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_runops_standard();
+}
+
+#undef Perl_runops_debug
+int
+Perl_runops_debug(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_runops_debug();
+}
+
+#undef Perl_sv_catpvf_mg
+void
+Perl_sv_catpvf_mg(pTHXo_ SV *sv, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vcatpvf_mg(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_sv_vcatpvf_mg
+void
+Perl_sv_vcatpvf_mg(pTHXo_ SV* sv, const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_vcatpvf_mg(sv, pat, args);
+}
+
+#undef Perl_sv_catpv_mg
+void
+Perl_sv_catpv_mg(pTHXo_ SV *sv, const char *ptr)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_catpv_mg(sv, ptr);
+}
+
+#undef Perl_sv_catpvn_mg
+void
+Perl_sv_catpvn_mg(pTHXo_ SV *sv, const char *ptr, STRLEN len)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_catpvn_mg(sv, ptr, len);
+}
+
+#undef Perl_sv_catsv_mg
+void
+Perl_sv_catsv_mg(pTHXo_ SV *dstr, SV *sstr)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_catsv_mg(dstr, sstr);
+}
+
+#undef Perl_sv_setpvf_mg
+void
+Perl_sv_setpvf_mg(pTHXo_ SV *sv, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_sv_vsetpvf_mg(sv, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_sv_vsetpvf_mg
+void
+Perl_sv_vsetpvf_mg(pTHXo_ SV* sv, const char* pat, va_list* args)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_vsetpvf_mg(sv, pat, args);
+}
+
+#undef Perl_sv_setiv_mg
+void
+Perl_sv_setiv_mg(pTHXo_ SV *sv, IV i)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setiv_mg(sv, i);
+}
+
+#undef Perl_sv_setpviv_mg
+void
+Perl_sv_setpviv_mg(pTHXo_ SV *sv, IV iv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setpviv_mg(sv, iv);
+}
+
+#undef Perl_sv_setuv_mg
+void
+Perl_sv_setuv_mg(pTHXo_ SV *sv, UV u)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setuv_mg(sv, u);
+}
+
+#undef Perl_sv_setnv_mg
+void
+Perl_sv_setnv_mg(pTHXo_ SV *sv, NV num)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setnv_mg(sv, num);
+}
+
+#undef Perl_sv_setpv_mg
+void
+Perl_sv_setpv_mg(pTHXo_ SV *sv, const char *ptr)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setpv_mg(sv, ptr);
+}
+
+#undef Perl_sv_setpvn_mg
+void
+Perl_sv_setpvn_mg(pTHXo_ SV *sv, const char *ptr, STRLEN len)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setpvn_mg(sv, ptr, len);
+}
+
+#undef Perl_sv_setsv_mg
+void
+Perl_sv_setsv_mg(pTHXo_ SV *dstr, SV *sstr)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_setsv_mg(dstr, sstr);
+}
+
+#undef Perl_sv_usepvn_mg
+void
+Perl_sv_usepvn_mg(pTHXo_ SV *sv, char *ptr, STRLEN len)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_usepvn_mg(sv, ptr, len);
+}
+
+#undef Perl_get_vtbl
+MGVTBL*
+Perl_get_vtbl(pTHXo_ int vtbl_id)
+{
+ return ((CPerlObj*)pPerl)->Perl_get_vtbl(vtbl_id);
+}
+
+#undef Perl_dump_indent
+void
+Perl_dump_indent(pTHXo_ I32 level, PerlIO *file, const char* pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ ((CPerlObj*)pPerl)->Perl_dump_vindent(level, file, pat, &args);
+ va_end(args);
+}
+
+#undef Perl_dump_vindent
+void
+Perl_dump_vindent(pTHXo_ I32 level, PerlIO *file, const char* pat, va_list *args)
+{
+ ((CPerlObj*)pPerl)->Perl_dump_vindent(level, file, pat, args);
+}
+
+#undef Perl_do_gv_dump
+void
+Perl_do_gv_dump(pTHXo_ I32 level, PerlIO *file, char *name, GV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_do_gv_dump(level, file, name, sv);
+}
+
+#undef Perl_do_gvgv_dump
+void
+Perl_do_gvgv_dump(pTHXo_ I32 level, PerlIO *file, char *name, GV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_do_gvgv_dump(level, file, name, sv);
+}
+
+#undef Perl_do_hv_dump
+void
+Perl_do_hv_dump(pTHXo_ I32 level, PerlIO *file, char *name, HV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_do_hv_dump(level, file, name, sv);
+}
+
+#undef Perl_do_magic_dump
+void
+Perl_do_magic_dump(pTHXo_ I32 level, PerlIO *file, MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
+{
+ ((CPerlObj*)pPerl)->Perl_do_magic_dump(level, file, mg, nest, maxnest, dumpops, pvlim);
+}
+
+#undef Perl_do_op_dump
+void
+Perl_do_op_dump(pTHXo_ I32 level, PerlIO *file, OP *o)
+{
+ ((CPerlObj*)pPerl)->Perl_do_op_dump(level, file, o);
+}
+
+#undef Perl_do_pmop_dump
+void
+Perl_do_pmop_dump(pTHXo_ I32 level, PerlIO *file, PMOP *pm)
+{
+ ((CPerlObj*)pPerl)->Perl_do_pmop_dump(level, file, pm);
+}
+
+#undef Perl_do_sv_dump
+void
+Perl_do_sv_dump(pTHXo_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
+{
+ ((CPerlObj*)pPerl)->Perl_do_sv_dump(level, file, sv, nest, maxnest, dumpops, pvlim);
+}
+
+#undef Perl_magic_dump
+void
+Perl_magic_dump(pTHXo_ MAGIC *mg)
+{
+ ((CPerlObj*)pPerl)->Perl_magic_dump(mg);
+}
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+
+#undef Perl_default_protect
+void*
+Perl_default_protect(pTHXo_ volatile JMPENV *je, int *excpt, protect_body_t body, ...)
+{
+ void* retval;
+ va_list args;
+ va_start(args, body);
+ retval = ((CPerlObj*)pPerl)->Perl_vdefault_protect(je, excpt, body, &args);
+ va_end(args);
+ return retval;
+
+}
+
+#undef Perl_vdefault_protect
+void*
+Perl_vdefault_protect(pTHXo_ volatile JMPENV *je, int *excpt, protect_body_t body, va_list *args)
+{
+ return ((CPerlObj*)pPerl)->Perl_vdefault_protect(je, excpt, body, args);
+}
+#endif
+
+#undef Perl_reginitcolors
+void
+Perl_reginitcolors(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_reginitcolors();
+}
+
+#undef Perl_sv_2pv_nolen
+char*
+Perl_sv_2pv_nolen(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2pv_nolen(sv);
+}
+
+#undef Perl_sv_2pvutf8_nolen
+char*
+Perl_sv_2pvutf8_nolen(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2pvutf8_nolen(sv);
+}
+
+#undef Perl_sv_2pvbyte_nolen
+char*
+Perl_sv_2pvbyte_nolen(pTHXo_ SV* sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_2pvbyte_nolen(sv);
+}
+
+#undef Perl_sv_pv
+char*
+Perl_sv_pv(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pv(sv);
+}
+
+#undef Perl_sv_pvutf8
+char*
+Perl_sv_pvutf8(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvutf8(sv);
+}
+
+#undef Perl_sv_pvbyte
+char*
+Perl_sv_pvbyte(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_pvbyte(sv);
+}
+
+#undef Perl_sv_utf8_upgrade
+void
+Perl_sv_utf8_upgrade(pTHXo_ SV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_utf8_upgrade(sv);
+}
+
+#undef Perl_sv_utf8_downgrade
+bool
+Perl_sv_utf8_downgrade(pTHXo_ SV *sv, bool fail_ok)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_utf8_downgrade(sv, fail_ok);
+}
+
+#undef Perl_sv_utf8_encode
+void
+Perl_sv_utf8_encode(pTHXo_ SV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_utf8_encode(sv);
+}
+
+#undef Perl_sv_utf8_decode
+bool
+Perl_sv_utf8_decode(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_utf8_decode(sv);
+}
+
+#undef Perl_sv_force_normal
+void
+Perl_sv_force_normal(pTHXo_ SV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_force_normal(sv);
+}
+
+#undef Perl_tmps_grow
+void
+Perl_tmps_grow(pTHXo_ I32 n)
+{
+ ((CPerlObj*)pPerl)->Perl_tmps_grow(n);
+}
+
+#undef Perl_sv_rvweaken
+SV*
+Perl_sv_rvweaken(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_rvweaken(sv);
+}
+
+#undef Perl_newANONATTRSUB
+OP*
+Perl_newANONATTRSUB(pTHXo_ I32 floor, OP *proto, OP *attrs, OP *block)
+{
+ return ((CPerlObj*)pPerl)->Perl_newANONATTRSUB(floor, proto, attrs, block);
+}
+
+#undef Perl_newATTRSUB
+CV*
+Perl_newATTRSUB(pTHXo_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+{
+ return ((CPerlObj*)pPerl)->Perl_newATTRSUB(floor, o, proto, attrs, block);
+}
+
+#undef Perl_newMYSUB
+void
+Perl_newMYSUB(pTHXo_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+{
+ ((CPerlObj*)pPerl)->Perl_newMYSUB(floor, o, proto, attrs, block);
+}
+#if defined(USE_ITHREADS)
+
+#undef Perl_cx_dup
+PERL_CONTEXT*
+Perl_cx_dup(pTHXo_ PERL_CONTEXT* cx, I32 ix, I32 max)
+{
+ return ((CPerlObj*)pPerl)->Perl_cx_dup(cx, ix, max);
+}
+
+#undef Perl_si_dup
+PERL_SI*
+Perl_si_dup(pTHXo_ PERL_SI* si)
+{
+ return ((CPerlObj*)pPerl)->Perl_si_dup(si);
+}
+
+#undef Perl_ss_dup
+ANY*
+Perl_ss_dup(pTHXo_ PerlInterpreter* proto_perl)
+{
+ return ((CPerlObj*)pPerl)->Perl_ss_dup(proto_perl);
+}
+
+#undef Perl_any_dup
+void*
+Perl_any_dup(pTHXo_ void* v, PerlInterpreter* proto_perl)
+{
+ return ((CPerlObj*)pPerl)->Perl_any_dup(v, proto_perl);
+}
+
+#undef Perl_he_dup
+HE*
+Perl_he_dup(pTHXo_ HE* e, bool shared)
+{
+ return ((CPerlObj*)pPerl)->Perl_he_dup(e, shared);
+}
+
+#undef Perl_re_dup
+REGEXP*
+Perl_re_dup(pTHXo_ REGEXP* r)
+{
+ return ((CPerlObj*)pPerl)->Perl_re_dup(r);
+}
+
+#undef Perl_fp_dup
+PerlIO*
+Perl_fp_dup(pTHXo_ PerlIO* fp, char type)
+{
+ return ((CPerlObj*)pPerl)->Perl_fp_dup(fp, type);
+}
+
+#undef Perl_dirp_dup
+DIR*
+Perl_dirp_dup(pTHXo_ DIR* dp)
+{
+ return ((CPerlObj*)pPerl)->Perl_dirp_dup(dp);
+}
+
+#undef Perl_gp_dup
+GP*
+Perl_gp_dup(pTHXo_ GP* gp)
+{
+ return ((CPerlObj*)pPerl)->Perl_gp_dup(gp);
+}
+
+#undef Perl_mg_dup
+MAGIC*
+Perl_mg_dup(pTHXo_ MAGIC* mg)
+{
+ return ((CPerlObj*)pPerl)->Perl_mg_dup(mg);
+}
+
+#undef Perl_sv_dup
+SV*
+Perl_sv_dup(pTHXo_ SV* sstr)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_dup(sstr);
+}
+#if defined(HAVE_INTERP_INTERN)
+
+#undef Perl_sys_intern_dup
+void
+Perl_sys_intern_dup(pTHXo_ struct interp_intern* src, struct interp_intern* dst)
+{
+ ((CPerlObj*)pPerl)->Perl_sys_intern_dup(src, dst);
+}
+#endif
+
+#undef Perl_ptr_table_new
+PTR_TBL_t*
+Perl_ptr_table_new(pTHXo)
+{
+ return ((CPerlObj*)pPerl)->Perl_ptr_table_new();
+}
+
+#undef Perl_ptr_table_fetch
+void*
+Perl_ptr_table_fetch(pTHXo_ PTR_TBL_t *tbl, void *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_ptr_table_fetch(tbl, sv);
+}
+
+#undef Perl_ptr_table_store
+void
+Perl_ptr_table_store(pTHXo_ PTR_TBL_t *tbl, void *oldsv, void *newsv)
+{
+ ((CPerlObj*)pPerl)->Perl_ptr_table_store(tbl, oldsv, newsv);
+}
+
+#undef Perl_ptr_table_split
+void
+Perl_ptr_table_split(pTHXo_ PTR_TBL_t *tbl)
+{
+ ((CPerlObj*)pPerl)->Perl_ptr_table_split(tbl);
+}
+#endif
+#if defined(PERL_OBJECT)
+#else
+#endif
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+# if defined(PL_OP_SLAB_ALLOC)
+# endif
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+# if defined(IAMSUID)
+# endif
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#endif
+# if defined(USE_THREADS)
+# endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+#endif
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+# endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+# if defined(DEBUGGING)
+# endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#if 0
+#endif
+# if defined(CRIPPLED_CC)
+# endif
+# if defined(PERL_CR_FILTER)
+# endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+# if defined(LEAKTEST)
+# endif
+#endif
+#if defined(PERL_OBJECT)
+#endif
+
+#undef Perl_fprintf_nocontext
+int
+Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
+{
+ dTHXo;
+ va_list(arglist);
+ va_start(arglist, format);
+ return (*PL_StdIO->pVprintf)(PL_StdIO, stream, format, arglist);
+}
+
+END_EXTERN_C
+
+#endif /* PERL_OBJECT */
+#endif /* PERL_OBJECT || MULTIPLICITY */
diff --git a/contrib/perl5/perlapi.h b/contrib/perl5/perlapi.h
new file mode 100644
index 0000000..5e5ac28
--- /dev/null
+++ b/contrib/perl5/perlapi.h
@@ -0,0 +1,892 @@
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
+ perlvars.h and thrdvar.h. Any changes made here will be lost!
+*/
+
+/* declare accessor functions for Perl variables */
+#ifndef __perlapi_h__
+#define __perlapi_h__
+
+#if defined(PERL_OBJECT) || defined (MULTIPLICITY)
+
+#if defined(PERL_OBJECT)
+# undef aTHXo
+# define aTHXo pPerl
+# undef aTHXo_
+# define aTHXo_ aTHXo,
+#endif /* PERL_OBJECT */
+
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHXo);
+#define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
+ EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHXo);
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+END_EXTERN_C
+
+#if defined(PERL_CORE)
+
+/* accessor functions for Perl variables (provide binary compatibility) */
+
+/* these need to be mentioned here, or most linkers won't put them in
+ the perl executable */
+
+#ifndef PERL_NO_FORCE_LINK
+
+START_EXTERN_C
+
+#ifndef DOINIT
+EXT void *PL_force_link_funcs[];
+#else
+EXT void *PL_force_link_funcs[] = {
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t) (void*)Perl_##v##_ptr,
+#define PERLVARA(v,n,t) PERLVAR(v,t)
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v,t)
+
+#include "thrdvar.h"
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+};
+#endif /* DOINIT */
+
+START_EXTERN_C
+
+#endif /* PERL_NO_FORCE_LINK */
+
+#else /* !PERL_CORE */
+
+#undef PL_Argv
+#define PL_Argv (*Perl_IArgv_ptr(aTHXo))
+#undef PL_Cmd
+#define PL_Cmd (*Perl_ICmd_ptr(aTHXo))
+#undef PL_DBcv
+#define PL_DBcv (*Perl_IDBcv_ptr(aTHXo))
+#undef PL_DBgv
+#define PL_DBgv (*Perl_IDBgv_ptr(aTHXo))
+#undef PL_DBline
+#define PL_DBline (*Perl_IDBline_ptr(aTHXo))
+#undef PL_DBsignal
+#define PL_DBsignal (*Perl_IDBsignal_ptr(aTHXo))
+#undef PL_DBsingle
+#define PL_DBsingle (*Perl_IDBsingle_ptr(aTHXo))
+#undef PL_DBsub
+#define PL_DBsub (*Perl_IDBsub_ptr(aTHXo))
+#undef PL_DBtrace
+#define PL_DBtrace (*Perl_IDBtrace_ptr(aTHXo))
+#undef PL_Dir
+#define PL_Dir (*Perl_IDir_ptr(aTHXo))
+#undef PL_Env
+#define PL_Env (*Perl_IEnv_ptr(aTHXo))
+#undef PL_LIO
+#define PL_LIO (*Perl_ILIO_ptr(aTHXo))
+#undef PL_Mem
+#define PL_Mem (*Perl_IMem_ptr(aTHXo))
+#undef PL_MemParse
+#define PL_MemParse (*Perl_IMemParse_ptr(aTHXo))
+#undef PL_MemShared
+#define PL_MemShared (*Perl_IMemShared_ptr(aTHXo))
+#undef PL_Proc
+#define PL_Proc (*Perl_IProc_ptr(aTHXo))
+#undef PL_Sock
+#define PL_Sock (*Perl_ISock_ptr(aTHXo))
+#undef PL_StdIO
+#define PL_StdIO (*Perl_IStdIO_ptr(aTHXo))
+#undef PL_amagic_generation
+#define PL_amagic_generation (*Perl_Iamagic_generation_ptr(aTHXo))
+#undef PL_an
+#define PL_an (*Perl_Ian_ptr(aTHXo))
+#undef PL_argvgv
+#define PL_argvgv (*Perl_Iargvgv_ptr(aTHXo))
+#undef PL_argvout_stack
+#define PL_argvout_stack (*Perl_Iargvout_stack_ptr(aTHXo))
+#undef PL_argvoutgv
+#define PL_argvoutgv (*Perl_Iargvoutgv_ptr(aTHXo))
+#undef PL_basetime
+#define PL_basetime (*Perl_Ibasetime_ptr(aTHXo))
+#undef PL_beginav
+#define PL_beginav (*Perl_Ibeginav_ptr(aTHXo))
+#undef PL_bitcount
+#define PL_bitcount (*Perl_Ibitcount_ptr(aTHXo))
+#undef PL_bufend
+#define PL_bufend (*Perl_Ibufend_ptr(aTHXo))
+#undef PL_bufptr
+#define PL_bufptr (*Perl_Ibufptr_ptr(aTHXo))
+#undef PL_checkav
+#define PL_checkav (*Perl_Icheckav_ptr(aTHXo))
+#undef PL_collation_ix
+#define PL_collation_ix (*Perl_Icollation_ix_ptr(aTHXo))
+#undef PL_collation_name
+#define PL_collation_name (*Perl_Icollation_name_ptr(aTHXo))
+#undef PL_collation_standard
+#define PL_collation_standard (*Perl_Icollation_standard_ptr(aTHXo))
+#undef PL_collxfrm_base
+#define PL_collxfrm_base (*Perl_Icollxfrm_base_ptr(aTHXo))
+#undef PL_collxfrm_mult
+#define PL_collxfrm_mult (*Perl_Icollxfrm_mult_ptr(aTHXo))
+#undef PL_compcv
+#define PL_compcv (*Perl_Icompcv_ptr(aTHXo))
+#undef PL_compiling
+#define PL_compiling (*Perl_Icompiling_ptr(aTHXo))
+#undef PL_comppad
+#define PL_comppad (*Perl_Icomppad_ptr(aTHXo))
+#undef PL_comppad_name
+#define PL_comppad_name (*Perl_Icomppad_name_ptr(aTHXo))
+#undef PL_comppad_name_fill
+#define PL_comppad_name_fill (*Perl_Icomppad_name_fill_ptr(aTHXo))
+#undef PL_comppad_name_floor
+#define PL_comppad_name_floor (*Perl_Icomppad_name_floor_ptr(aTHXo))
+#undef PL_cop_seqmax
+#define PL_cop_seqmax (*Perl_Icop_seqmax_ptr(aTHXo))
+#undef PL_copline
+#define PL_copline (*Perl_Icopline_ptr(aTHXo))
+#undef PL_cred_mutex
+#define PL_cred_mutex (*Perl_Icred_mutex_ptr(aTHXo))
+#undef PL_cryptseen
+#define PL_cryptseen (*Perl_Icryptseen_ptr(aTHXo))
+#undef PL_cshlen
+#define PL_cshlen (*Perl_Icshlen_ptr(aTHXo))
+#undef PL_cshname
+#define PL_cshname (*Perl_Icshname_ptr(aTHXo))
+#undef PL_curcopdb
+#define PL_curcopdb (*Perl_Icurcopdb_ptr(aTHXo))
+#undef PL_curstname
+#define PL_curstname (*Perl_Icurstname_ptr(aTHXo))
+#undef PL_curthr
+#define PL_curthr (*Perl_Icurthr_ptr(aTHXo))
+#undef PL_dbargs
+#define PL_dbargs (*Perl_Idbargs_ptr(aTHXo))
+#undef PL_debstash
+#define PL_debstash (*Perl_Idebstash_ptr(aTHXo))
+#undef PL_debug
+#define PL_debug (*Perl_Idebug_ptr(aTHXo))
+#undef PL_defgv
+#define PL_defgv (*Perl_Idefgv_ptr(aTHXo))
+#undef PL_diehook
+#define PL_diehook (*Perl_Idiehook_ptr(aTHXo))
+#undef PL_doextract
+#define PL_doextract (*Perl_Idoextract_ptr(aTHXo))
+#undef PL_doswitches
+#define PL_doswitches (*Perl_Idoswitches_ptr(aTHXo))
+#undef PL_dowarn
+#define PL_dowarn (*Perl_Idowarn_ptr(aTHXo))
+#undef PL_e_script
+#define PL_e_script (*Perl_Ie_script_ptr(aTHXo))
+#undef PL_egid
+#define PL_egid (*Perl_Iegid_ptr(aTHXo))
+#undef PL_endav
+#define PL_endav (*Perl_Iendav_ptr(aTHXo))
+#undef PL_envgv
+#define PL_envgv (*Perl_Ienvgv_ptr(aTHXo))
+#undef PL_errgv
+#define PL_errgv (*Perl_Ierrgv_ptr(aTHXo))
+#undef PL_error_count
+#define PL_error_count (*Perl_Ierror_count_ptr(aTHXo))
+#undef PL_euid
+#define PL_euid (*Perl_Ieuid_ptr(aTHXo))
+#undef PL_eval_cond
+#define PL_eval_cond (*Perl_Ieval_cond_ptr(aTHXo))
+#undef PL_eval_mutex
+#define PL_eval_mutex (*Perl_Ieval_mutex_ptr(aTHXo))
+#undef PL_eval_owner
+#define PL_eval_owner (*Perl_Ieval_owner_ptr(aTHXo))
+#undef PL_eval_root
+#define PL_eval_root (*Perl_Ieval_root_ptr(aTHXo))
+#undef PL_eval_start
+#define PL_eval_start (*Perl_Ieval_start_ptr(aTHXo))
+#undef PL_evalseq
+#define PL_evalseq (*Perl_Ievalseq_ptr(aTHXo))
+#undef PL_exit_flags
+#define PL_exit_flags (*Perl_Iexit_flags_ptr(aTHXo))
+#undef PL_exitlist
+#define PL_exitlist (*Perl_Iexitlist_ptr(aTHXo))
+#undef PL_exitlistlen
+#define PL_exitlistlen (*Perl_Iexitlistlen_ptr(aTHXo))
+#undef PL_expect
+#define PL_expect (*Perl_Iexpect_ptr(aTHXo))
+#undef PL_fdpid
+#define PL_fdpid (*Perl_Ifdpid_ptr(aTHXo))
+#undef PL_filemode
+#define PL_filemode (*Perl_Ifilemode_ptr(aTHXo))
+#undef PL_forkprocess
+#define PL_forkprocess (*Perl_Iforkprocess_ptr(aTHXo))
+#undef PL_formfeed
+#define PL_formfeed (*Perl_Iformfeed_ptr(aTHXo))
+#undef PL_generation
+#define PL_generation (*Perl_Igeneration_ptr(aTHXo))
+#undef PL_gensym
+#define PL_gensym (*Perl_Igensym_ptr(aTHXo))
+#undef PL_gid
+#define PL_gid (*Perl_Igid_ptr(aTHXo))
+#undef PL_glob_index
+#define PL_glob_index (*Perl_Iglob_index_ptr(aTHXo))
+#undef PL_globalstash
+#define PL_globalstash (*Perl_Iglobalstash_ptr(aTHXo))
+#undef PL_he_root
+#define PL_he_root (*Perl_Ihe_root_ptr(aTHXo))
+#undef PL_hintgv
+#define PL_hintgv (*Perl_Ihintgv_ptr(aTHXo))
+#undef PL_hints
+#define PL_hints (*Perl_Ihints_ptr(aTHXo))
+#undef PL_in_clean_all
+#define PL_in_clean_all (*Perl_Iin_clean_all_ptr(aTHXo))
+#undef PL_in_clean_objs
+#define PL_in_clean_objs (*Perl_Iin_clean_objs_ptr(aTHXo))
+#undef PL_in_my
+#define PL_in_my (*Perl_Iin_my_ptr(aTHXo))
+#undef PL_in_my_stash
+#define PL_in_my_stash (*Perl_Iin_my_stash_ptr(aTHXo))
+#undef PL_incgv
+#define PL_incgv (*Perl_Iincgv_ptr(aTHXo))
+#undef PL_initav
+#define PL_initav (*Perl_Iinitav_ptr(aTHXo))
+#undef PL_inplace
+#define PL_inplace (*Perl_Iinplace_ptr(aTHXo))
+#undef PL_last_lop
+#define PL_last_lop (*Perl_Ilast_lop_ptr(aTHXo))
+#undef PL_last_lop_op
+#define PL_last_lop_op (*Perl_Ilast_lop_op_ptr(aTHXo))
+#undef PL_last_swash_hv
+#define PL_last_swash_hv (*Perl_Ilast_swash_hv_ptr(aTHXo))
+#undef PL_last_swash_key
+#define PL_last_swash_key (*Perl_Ilast_swash_key_ptr(aTHXo))
+#undef PL_last_swash_klen
+#define PL_last_swash_klen (*Perl_Ilast_swash_klen_ptr(aTHXo))
+#undef PL_last_swash_slen
+#define PL_last_swash_slen (*Perl_Ilast_swash_slen_ptr(aTHXo))
+#undef PL_last_swash_tmps
+#define PL_last_swash_tmps (*Perl_Ilast_swash_tmps_ptr(aTHXo))
+#undef PL_last_uni
+#define PL_last_uni (*Perl_Ilast_uni_ptr(aTHXo))
+#undef PL_lastfd
+#define PL_lastfd (*Perl_Ilastfd_ptr(aTHXo))
+#undef PL_laststatval
+#define PL_laststatval (*Perl_Ilaststatval_ptr(aTHXo))
+#undef PL_laststype
+#define PL_laststype (*Perl_Ilaststype_ptr(aTHXo))
+#undef PL_lex_brackets
+#define PL_lex_brackets (*Perl_Ilex_brackets_ptr(aTHXo))
+#undef PL_lex_brackstack
+#define PL_lex_brackstack (*Perl_Ilex_brackstack_ptr(aTHXo))
+#undef PL_lex_casemods
+#define PL_lex_casemods (*Perl_Ilex_casemods_ptr(aTHXo))
+#undef PL_lex_casestack
+#define PL_lex_casestack (*Perl_Ilex_casestack_ptr(aTHXo))
+#undef PL_lex_defer
+#define PL_lex_defer (*Perl_Ilex_defer_ptr(aTHXo))
+#undef PL_lex_dojoin
+#define PL_lex_dojoin (*Perl_Ilex_dojoin_ptr(aTHXo))
+#undef PL_lex_expect
+#define PL_lex_expect (*Perl_Ilex_expect_ptr(aTHXo))
+#undef PL_lex_formbrack
+#define PL_lex_formbrack (*Perl_Ilex_formbrack_ptr(aTHXo))
+#undef PL_lex_inpat
+#define PL_lex_inpat (*Perl_Ilex_inpat_ptr(aTHXo))
+#undef PL_lex_inwhat
+#define PL_lex_inwhat (*Perl_Ilex_inwhat_ptr(aTHXo))
+#undef PL_lex_op
+#define PL_lex_op (*Perl_Ilex_op_ptr(aTHXo))
+#undef PL_lex_repl
+#define PL_lex_repl (*Perl_Ilex_repl_ptr(aTHXo))
+#undef PL_lex_starts
+#define PL_lex_starts (*Perl_Ilex_starts_ptr(aTHXo))
+#undef PL_lex_state
+#define PL_lex_state (*Perl_Ilex_state_ptr(aTHXo))
+#undef PL_lex_stuff
+#define PL_lex_stuff (*Perl_Ilex_stuff_ptr(aTHXo))
+#undef PL_lineary
+#define PL_lineary (*Perl_Ilineary_ptr(aTHXo))
+#undef PL_linestart
+#define PL_linestart (*Perl_Ilinestart_ptr(aTHXo))
+#undef PL_linestr
+#define PL_linestr (*Perl_Ilinestr_ptr(aTHXo))
+#undef PL_localpatches
+#define PL_localpatches (*Perl_Ilocalpatches_ptr(aTHXo))
+#undef PL_main_cv
+#define PL_main_cv (*Perl_Imain_cv_ptr(aTHXo))
+#undef PL_main_root
+#define PL_main_root (*Perl_Imain_root_ptr(aTHXo))
+#undef PL_main_start
+#define PL_main_start (*Perl_Imain_start_ptr(aTHXo))
+#undef PL_max_intro_pending
+#define PL_max_intro_pending (*Perl_Imax_intro_pending_ptr(aTHXo))
+#undef PL_maxo
+#define PL_maxo (*Perl_Imaxo_ptr(aTHXo))
+#undef PL_maxsysfd
+#define PL_maxsysfd (*Perl_Imaxsysfd_ptr(aTHXo))
+#undef PL_mess_sv
+#define PL_mess_sv (*Perl_Imess_sv_ptr(aTHXo))
+#undef PL_min_intro_pending
+#define PL_min_intro_pending (*Perl_Imin_intro_pending_ptr(aTHXo))
+#undef PL_minus_F
+#define PL_minus_F (*Perl_Iminus_F_ptr(aTHXo))
+#undef PL_minus_a
+#define PL_minus_a (*Perl_Iminus_a_ptr(aTHXo))
+#undef PL_minus_c
+#define PL_minus_c (*Perl_Iminus_c_ptr(aTHXo))
+#undef PL_minus_l
+#define PL_minus_l (*Perl_Iminus_l_ptr(aTHXo))
+#undef PL_minus_n
+#define PL_minus_n (*Perl_Iminus_n_ptr(aTHXo))
+#undef PL_minus_p
+#define PL_minus_p (*Perl_Iminus_p_ptr(aTHXo))
+#undef PL_modglobal
+#define PL_modglobal (*Perl_Imodglobal_ptr(aTHXo))
+#undef PL_multi_close
+#define PL_multi_close (*Perl_Imulti_close_ptr(aTHXo))
+#undef PL_multi_end
+#define PL_multi_end (*Perl_Imulti_end_ptr(aTHXo))
+#undef PL_multi_open
+#define PL_multi_open (*Perl_Imulti_open_ptr(aTHXo))
+#undef PL_multi_start
+#define PL_multi_start (*Perl_Imulti_start_ptr(aTHXo))
+#undef PL_multiline
+#define PL_multiline (*Perl_Imultiline_ptr(aTHXo))
+#undef PL_nexttoke
+#define PL_nexttoke (*Perl_Inexttoke_ptr(aTHXo))
+#undef PL_nexttype
+#define PL_nexttype (*Perl_Inexttype_ptr(aTHXo))
+#undef PL_nextval
+#define PL_nextval (*Perl_Inextval_ptr(aTHXo))
+#undef PL_nice_chunk
+#define PL_nice_chunk (*Perl_Inice_chunk_ptr(aTHXo))
+#undef PL_nice_chunk_size
+#define PL_nice_chunk_size (*Perl_Inice_chunk_size_ptr(aTHXo))
+#undef PL_nomemok
+#define PL_nomemok (*Perl_Inomemok_ptr(aTHXo))
+#undef PL_nthreads
+#define PL_nthreads (*Perl_Inthreads_ptr(aTHXo))
+#undef PL_nthreads_cond
+#define PL_nthreads_cond (*Perl_Inthreads_cond_ptr(aTHXo))
+#undef PL_numeric_local
+#define PL_numeric_local (*Perl_Inumeric_local_ptr(aTHXo))
+#undef PL_numeric_name
+#define PL_numeric_name (*Perl_Inumeric_name_ptr(aTHXo))
+#undef PL_numeric_radix
+#define PL_numeric_radix (*Perl_Inumeric_radix_ptr(aTHXo))
+#undef PL_numeric_standard
+#define PL_numeric_standard (*Perl_Inumeric_standard_ptr(aTHXo))
+#undef PL_ofmt
+#define PL_ofmt (*Perl_Iofmt_ptr(aTHXo))
+#undef PL_oldbufptr
+#define PL_oldbufptr (*Perl_Ioldbufptr_ptr(aTHXo))
+#undef PL_oldname
+#define PL_oldname (*Perl_Ioldname_ptr(aTHXo))
+#undef PL_oldoldbufptr
+#define PL_oldoldbufptr (*Perl_Ioldoldbufptr_ptr(aTHXo))
+#undef PL_op_mask
+#define PL_op_mask (*Perl_Iop_mask_ptr(aTHXo))
+#undef PL_op_seqmax
+#define PL_op_seqmax (*Perl_Iop_seqmax_ptr(aTHXo))
+#undef PL_origalen
+#define PL_origalen (*Perl_Iorigalen_ptr(aTHXo))
+#undef PL_origargc
+#define PL_origargc (*Perl_Iorigargc_ptr(aTHXo))
+#undef PL_origargv
+#define PL_origargv (*Perl_Iorigargv_ptr(aTHXo))
+#undef PL_origenviron
+#define PL_origenviron (*Perl_Iorigenviron_ptr(aTHXo))
+#undef PL_origfilename
+#define PL_origfilename (*Perl_Iorigfilename_ptr(aTHXo))
+#undef PL_ors
+#define PL_ors (*Perl_Iors_ptr(aTHXo))
+#undef PL_orslen
+#define PL_orslen (*Perl_Iorslen_ptr(aTHXo))
+#undef PL_osname
+#define PL_osname (*Perl_Iosname_ptr(aTHXo))
+#undef PL_pad_reset_pending
+#define PL_pad_reset_pending (*Perl_Ipad_reset_pending_ptr(aTHXo))
+#undef PL_padix
+#define PL_padix (*Perl_Ipadix_ptr(aTHXo))
+#undef PL_padix_floor
+#define PL_padix_floor (*Perl_Ipadix_floor_ptr(aTHXo))
+#undef PL_patchlevel
+#define PL_patchlevel (*Perl_Ipatchlevel_ptr(aTHXo))
+#undef PL_pending_ident
+#define PL_pending_ident (*Perl_Ipending_ident_ptr(aTHXo))
+#undef PL_perl_destruct_level
+#define PL_perl_destruct_level (*Perl_Iperl_destruct_level_ptr(aTHXo))
+#undef PL_perldb
+#define PL_perldb (*Perl_Iperldb_ptr(aTHXo))
+#undef PL_pidstatus
+#define PL_pidstatus (*Perl_Ipidstatus_ptr(aTHXo))
+#undef PL_preambleav
+#define PL_preambleav (*Perl_Ipreambleav_ptr(aTHXo))
+#undef PL_preambled
+#define PL_preambled (*Perl_Ipreambled_ptr(aTHXo))
+#undef PL_preprocess
+#define PL_preprocess (*Perl_Ipreprocess_ptr(aTHXo))
+#undef PL_profiledata
+#define PL_profiledata (*Perl_Iprofiledata_ptr(aTHXo))
+#undef PL_psig_name
+#define PL_psig_name (*Perl_Ipsig_name_ptr(aTHXo))
+#undef PL_psig_ptr
+#define PL_psig_ptr (*Perl_Ipsig_ptr_ptr(aTHXo))
+#undef PL_ptr_table
+#define PL_ptr_table (*Perl_Iptr_table_ptr(aTHXo))
+#undef PL_replgv
+#define PL_replgv (*Perl_Ireplgv_ptr(aTHXo))
+#undef PL_rsfp
+#define PL_rsfp (*Perl_Irsfp_ptr(aTHXo))
+#undef PL_rsfp_filters
+#define PL_rsfp_filters (*Perl_Irsfp_filters_ptr(aTHXo))
+#undef PL_runops
+#define PL_runops (*Perl_Irunops_ptr(aTHXo))
+#undef PL_sawampersand
+#define PL_sawampersand (*Perl_Isawampersand_ptr(aTHXo))
+#undef PL_sh_path
+#define PL_sh_path (*Perl_Ish_path_ptr(aTHXo))
+#undef PL_sighandlerp
+#define PL_sighandlerp (*Perl_Isighandlerp_ptr(aTHXo))
+#undef PL_splitstr
+#define PL_splitstr (*Perl_Isplitstr_ptr(aTHXo))
+#undef PL_srand_called
+#define PL_srand_called (*Perl_Isrand_called_ptr(aTHXo))
+#undef PL_statusvalue
+#define PL_statusvalue (*Perl_Istatusvalue_ptr(aTHXo))
+#undef PL_statusvalue_vms
+#define PL_statusvalue_vms (*Perl_Istatusvalue_vms_ptr(aTHXo))
+#undef PL_stderrgv
+#define PL_stderrgv (*Perl_Istderrgv_ptr(aTHXo))
+#undef PL_stdingv
+#define PL_stdingv (*Perl_Istdingv_ptr(aTHXo))
+#undef PL_strtab
+#define PL_strtab (*Perl_Istrtab_ptr(aTHXo))
+#undef PL_strtab_mutex
+#define PL_strtab_mutex (*Perl_Istrtab_mutex_ptr(aTHXo))
+#undef PL_sub_generation
+#define PL_sub_generation (*Perl_Isub_generation_ptr(aTHXo))
+#undef PL_sublex_info
+#define PL_sublex_info (*Perl_Isublex_info_ptr(aTHXo))
+#undef PL_subline
+#define PL_subline (*Perl_Isubline_ptr(aTHXo))
+#undef PL_subname
+#define PL_subname (*Perl_Isubname_ptr(aTHXo))
+#undef PL_sv_arenaroot
+#define PL_sv_arenaroot (*Perl_Isv_arenaroot_ptr(aTHXo))
+#undef PL_sv_count
+#define PL_sv_count (*Perl_Isv_count_ptr(aTHXo))
+#undef PL_sv_mutex
+#define PL_sv_mutex (*Perl_Isv_mutex_ptr(aTHXo))
+#undef PL_sv_no
+#define PL_sv_no (*Perl_Isv_no_ptr(aTHXo))
+#undef PL_sv_objcount
+#define PL_sv_objcount (*Perl_Isv_objcount_ptr(aTHXo))
+#undef PL_sv_root
+#define PL_sv_root (*Perl_Isv_root_ptr(aTHXo))
+#undef PL_sv_undef
+#define PL_sv_undef (*Perl_Isv_undef_ptr(aTHXo))
+#undef PL_sv_yes
+#define PL_sv_yes (*Perl_Isv_yes_ptr(aTHXo))
+#undef PL_svref_mutex
+#define PL_svref_mutex (*Perl_Isvref_mutex_ptr(aTHXo))
+#undef PL_sys_intern
+#define PL_sys_intern (*Perl_Isys_intern_ptr(aTHXo))
+#undef PL_tainting
+#define PL_tainting (*Perl_Itainting_ptr(aTHXo))
+#undef PL_threadnum
+#define PL_threadnum (*Perl_Ithreadnum_ptr(aTHXo))
+#undef PL_threads_mutex
+#define PL_threads_mutex (*Perl_Ithreads_mutex_ptr(aTHXo))
+#undef PL_threadsv_names
+#define PL_threadsv_names (*Perl_Ithreadsv_names_ptr(aTHXo))
+#undef PL_thrsv
+#define PL_thrsv (*Perl_Ithrsv_ptr(aTHXo))
+#undef PL_tokenbuf
+#define PL_tokenbuf (*Perl_Itokenbuf_ptr(aTHXo))
+#undef PL_uid
+#define PL_uid (*Perl_Iuid_ptr(aTHXo))
+#undef PL_unsafe
+#define PL_unsafe (*Perl_Iunsafe_ptr(aTHXo))
+#undef PL_utf8_alnum
+#define PL_utf8_alnum (*Perl_Iutf8_alnum_ptr(aTHXo))
+#undef PL_utf8_alnumc
+#define PL_utf8_alnumc (*Perl_Iutf8_alnumc_ptr(aTHXo))
+#undef PL_utf8_alpha
+#define PL_utf8_alpha (*Perl_Iutf8_alpha_ptr(aTHXo))
+#undef PL_utf8_ascii
+#define PL_utf8_ascii (*Perl_Iutf8_ascii_ptr(aTHXo))
+#undef PL_utf8_cntrl
+#define PL_utf8_cntrl (*Perl_Iutf8_cntrl_ptr(aTHXo))
+#undef PL_utf8_digit
+#define PL_utf8_digit (*Perl_Iutf8_digit_ptr(aTHXo))
+#undef PL_utf8_graph
+#define PL_utf8_graph (*Perl_Iutf8_graph_ptr(aTHXo))
+#undef PL_utf8_lower
+#define PL_utf8_lower (*Perl_Iutf8_lower_ptr(aTHXo))
+#undef PL_utf8_mark
+#define PL_utf8_mark (*Perl_Iutf8_mark_ptr(aTHXo))
+#undef PL_utf8_print
+#define PL_utf8_print (*Perl_Iutf8_print_ptr(aTHXo))
+#undef PL_utf8_punct
+#define PL_utf8_punct (*Perl_Iutf8_punct_ptr(aTHXo))
+#undef PL_utf8_space
+#define PL_utf8_space (*Perl_Iutf8_space_ptr(aTHXo))
+#undef PL_utf8_tolower
+#define PL_utf8_tolower (*Perl_Iutf8_tolower_ptr(aTHXo))
+#undef PL_utf8_totitle
+#define PL_utf8_totitle (*Perl_Iutf8_totitle_ptr(aTHXo))
+#undef PL_utf8_toupper
+#define PL_utf8_toupper (*Perl_Iutf8_toupper_ptr(aTHXo))
+#undef PL_utf8_upper
+#define PL_utf8_upper (*Perl_Iutf8_upper_ptr(aTHXo))
+#undef PL_utf8_xdigit
+#define PL_utf8_xdigit (*Perl_Iutf8_xdigit_ptr(aTHXo))
+#undef PL_uudmap
+#define PL_uudmap (*Perl_Iuudmap_ptr(aTHXo))
+#undef PL_warnhook
+#define PL_warnhook (*Perl_Iwarnhook_ptr(aTHXo))
+#undef PL_widesyscalls
+#define PL_widesyscalls (*Perl_Iwidesyscalls_ptr(aTHXo))
+#undef PL_xiv_arenaroot
+#define PL_xiv_arenaroot (*Perl_Ixiv_arenaroot_ptr(aTHXo))
+#undef PL_xiv_root
+#define PL_xiv_root (*Perl_Ixiv_root_ptr(aTHXo))
+#undef PL_xnv_root
+#define PL_xnv_root (*Perl_Ixnv_root_ptr(aTHXo))
+#undef PL_xpv_root
+#define PL_xpv_root (*Perl_Ixpv_root_ptr(aTHXo))
+#undef PL_xpvav_root
+#define PL_xpvav_root (*Perl_Ixpvav_root_ptr(aTHXo))
+#undef PL_xpvbm_root
+#define PL_xpvbm_root (*Perl_Ixpvbm_root_ptr(aTHXo))
+#undef PL_xpvcv_root
+#define PL_xpvcv_root (*Perl_Ixpvcv_root_ptr(aTHXo))
+#undef PL_xpvhv_root
+#define PL_xpvhv_root (*Perl_Ixpvhv_root_ptr(aTHXo))
+#undef PL_xpviv_root
+#define PL_xpviv_root (*Perl_Ixpviv_root_ptr(aTHXo))
+#undef PL_xpvlv_root
+#define PL_xpvlv_root (*Perl_Ixpvlv_root_ptr(aTHXo))
+#undef PL_xpvmg_root
+#define PL_xpvmg_root (*Perl_Ixpvmg_root_ptr(aTHXo))
+#undef PL_xpvnv_root
+#define PL_xpvnv_root (*Perl_Ixpvnv_root_ptr(aTHXo))
+#undef PL_xrv_root
+#define PL_xrv_root (*Perl_Ixrv_root_ptr(aTHXo))
+#undef PL_yychar
+#define PL_yychar (*Perl_Iyychar_ptr(aTHXo))
+#undef PL_yydebug
+#define PL_yydebug (*Perl_Iyydebug_ptr(aTHXo))
+#undef PL_yyerrflag
+#define PL_yyerrflag (*Perl_Iyyerrflag_ptr(aTHXo))
+#undef PL_yylval
+#define PL_yylval (*Perl_Iyylval_ptr(aTHXo))
+#undef PL_yynerrs
+#define PL_yynerrs (*Perl_Iyynerrs_ptr(aTHXo))
+#undef PL_yyval
+#define PL_yyval (*Perl_Iyyval_ptr(aTHXo))
+#undef PL_Sv
+#define PL_Sv (*Perl_TSv_ptr(aTHXo))
+#undef PL_Xpv
+#define PL_Xpv (*Perl_TXpv_ptr(aTHXo))
+#undef PL_av_fetch_sv
+#define PL_av_fetch_sv (*Perl_Tav_fetch_sv_ptr(aTHXo))
+#undef PL_bodytarget
+#define PL_bodytarget (*Perl_Tbodytarget_ptr(aTHXo))
+#undef PL_bostr
+#define PL_bostr (*Perl_Tbostr_ptr(aTHXo))
+#undef PL_chopset
+#define PL_chopset (*Perl_Tchopset_ptr(aTHXo))
+#undef PL_colors
+#define PL_colors (*Perl_Tcolors_ptr(aTHXo))
+#undef PL_colorset
+#define PL_colorset (*Perl_Tcolorset_ptr(aTHXo))
+#undef PL_curcop
+#define PL_curcop (*Perl_Tcurcop_ptr(aTHXo))
+#undef PL_curpad
+#define PL_curpad (*Perl_Tcurpad_ptr(aTHXo))
+#undef PL_curpm
+#define PL_curpm (*Perl_Tcurpm_ptr(aTHXo))
+#undef PL_curstack
+#define PL_curstack (*Perl_Tcurstack_ptr(aTHXo))
+#undef PL_curstackinfo
+#define PL_curstackinfo (*Perl_Tcurstackinfo_ptr(aTHXo))
+#undef PL_curstash
+#define PL_curstash (*Perl_Tcurstash_ptr(aTHXo))
+#undef PL_defoutgv
+#define PL_defoutgv (*Perl_Tdefoutgv_ptr(aTHXo))
+#undef PL_defstash
+#define PL_defstash (*Perl_Tdefstash_ptr(aTHXo))
+#undef PL_delaymagic
+#define PL_delaymagic (*Perl_Tdelaymagic_ptr(aTHXo))
+#undef PL_dirty
+#define PL_dirty (*Perl_Tdirty_ptr(aTHXo))
+#undef PL_dumpindent
+#define PL_dumpindent (*Perl_Tdumpindent_ptr(aTHXo))
+#undef PL_efloatbuf
+#define PL_efloatbuf (*Perl_Tefloatbuf_ptr(aTHXo))
+#undef PL_efloatsize
+#define PL_efloatsize (*Perl_Tefloatsize_ptr(aTHXo))
+#undef PL_errors
+#define PL_errors (*Perl_Terrors_ptr(aTHXo))
+#undef PL_extralen
+#define PL_extralen (*Perl_Textralen_ptr(aTHXo))
+#undef PL_firstgv
+#define PL_firstgv (*Perl_Tfirstgv_ptr(aTHXo))
+#undef PL_formtarget
+#define PL_formtarget (*Perl_Tformtarget_ptr(aTHXo))
+#undef PL_hv_fetch_ent_mh
+#define PL_hv_fetch_ent_mh (*Perl_Thv_fetch_ent_mh_ptr(aTHXo))
+#undef PL_hv_fetch_sv
+#define PL_hv_fetch_sv (*Perl_Thv_fetch_sv_ptr(aTHXo))
+#undef PL_in_eval
+#define PL_in_eval (*Perl_Tin_eval_ptr(aTHXo))
+#undef PL_last_in_gv
+#define PL_last_in_gv (*Perl_Tlast_in_gv_ptr(aTHXo))
+#undef PL_lastgotoprobe
+#define PL_lastgotoprobe (*Perl_Tlastgotoprobe_ptr(aTHXo))
+#undef PL_lastscream
+#define PL_lastscream (*Perl_Tlastscream_ptr(aTHXo))
+#undef PL_localizing
+#define PL_localizing (*Perl_Tlocalizing_ptr(aTHXo))
+#undef PL_mainstack
+#define PL_mainstack (*Perl_Tmainstack_ptr(aTHXo))
+#undef PL_markstack
+#define PL_markstack (*Perl_Tmarkstack_ptr(aTHXo))
+#undef PL_markstack_max
+#define PL_markstack_max (*Perl_Tmarkstack_max_ptr(aTHXo))
+#undef PL_markstack_ptr
+#define PL_markstack_ptr (*Perl_Tmarkstack_ptr_ptr(aTHXo))
+#undef PL_maxscream
+#define PL_maxscream (*Perl_Tmaxscream_ptr(aTHXo))
+#undef PL_modcount
+#define PL_modcount (*Perl_Tmodcount_ptr(aTHXo))
+#undef PL_na
+#define PL_na (*Perl_Tna_ptr(aTHXo))
+#undef PL_nrs
+#define PL_nrs (*Perl_Tnrs_ptr(aTHXo))
+#undef PL_ofs
+#define PL_ofs (*Perl_Tofs_ptr(aTHXo))
+#undef PL_ofslen
+#define PL_ofslen (*Perl_Tofslen_ptr(aTHXo))
+#undef PL_op
+#define PL_op (*Perl_Top_ptr(aTHXo))
+#undef PL_opsave
+#define PL_opsave (*Perl_Topsave_ptr(aTHXo))
+#undef PL_protect
+#define PL_protect (*Perl_Tprotect_ptr(aTHXo))
+#undef PL_reg_call_cc
+#define PL_reg_call_cc (*Perl_Treg_call_cc_ptr(aTHXo))
+#undef PL_reg_curpm
+#define PL_reg_curpm (*Perl_Treg_curpm_ptr(aTHXo))
+#undef PL_reg_eval_set
+#define PL_reg_eval_set (*Perl_Treg_eval_set_ptr(aTHXo))
+#undef PL_reg_flags
+#define PL_reg_flags (*Perl_Treg_flags_ptr(aTHXo))
+#undef PL_reg_ganch
+#define PL_reg_ganch (*Perl_Treg_ganch_ptr(aTHXo))
+#undef PL_reg_leftiter
+#define PL_reg_leftiter (*Perl_Treg_leftiter_ptr(aTHXo))
+#undef PL_reg_magic
+#define PL_reg_magic (*Perl_Treg_magic_ptr(aTHXo))
+#undef PL_reg_maxiter
+#define PL_reg_maxiter (*Perl_Treg_maxiter_ptr(aTHXo))
+#undef PL_reg_oldcurpm
+#define PL_reg_oldcurpm (*Perl_Treg_oldcurpm_ptr(aTHXo))
+#undef PL_reg_oldpos
+#define PL_reg_oldpos (*Perl_Treg_oldpos_ptr(aTHXo))
+#undef PL_reg_oldsaved
+#define PL_reg_oldsaved (*Perl_Treg_oldsaved_ptr(aTHXo))
+#undef PL_reg_oldsavedlen
+#define PL_reg_oldsavedlen (*Perl_Treg_oldsavedlen_ptr(aTHXo))
+#undef PL_reg_poscache
+#define PL_reg_poscache (*Perl_Treg_poscache_ptr(aTHXo))
+#undef PL_reg_poscache_size
+#define PL_reg_poscache_size (*Perl_Treg_poscache_size_ptr(aTHXo))
+#undef PL_reg_re
+#define PL_reg_re (*Perl_Treg_re_ptr(aTHXo))
+#undef PL_reg_start_tmp
+#define PL_reg_start_tmp (*Perl_Treg_start_tmp_ptr(aTHXo))
+#undef PL_reg_start_tmpl
+#define PL_reg_start_tmpl (*Perl_Treg_start_tmpl_ptr(aTHXo))
+#undef PL_reg_starttry
+#define PL_reg_starttry (*Perl_Treg_starttry_ptr(aTHXo))
+#undef PL_reg_sv
+#define PL_reg_sv (*Perl_Treg_sv_ptr(aTHXo))
+#undef PL_reg_whilem_seen
+#define PL_reg_whilem_seen (*Perl_Treg_whilem_seen_ptr(aTHXo))
+#undef PL_regbol
+#define PL_regbol (*Perl_Tregbol_ptr(aTHXo))
+#undef PL_regcc
+#define PL_regcc (*Perl_Tregcc_ptr(aTHXo))
+#undef PL_regcode
+#define PL_regcode (*Perl_Tregcode_ptr(aTHXo))
+#undef PL_regcomp_parse
+#define PL_regcomp_parse (*Perl_Tregcomp_parse_ptr(aTHXo))
+#undef PL_regcomp_rx
+#define PL_regcomp_rx (*Perl_Tregcomp_rx_ptr(aTHXo))
+#undef PL_regcompp
+#define PL_regcompp (*Perl_Tregcompp_ptr(aTHXo))
+#undef PL_regdata
+#define PL_regdata (*Perl_Tregdata_ptr(aTHXo))
+#undef PL_regdummy
+#define PL_regdummy (*Perl_Tregdummy_ptr(aTHXo))
+#undef PL_regendp
+#define PL_regendp (*Perl_Tregendp_ptr(aTHXo))
+#undef PL_regeol
+#define PL_regeol (*Perl_Tregeol_ptr(aTHXo))
+#undef PL_regexecp
+#define PL_regexecp (*Perl_Tregexecp_ptr(aTHXo))
+#undef PL_regflags
+#define PL_regflags (*Perl_Tregflags_ptr(aTHXo))
+#undef PL_regfree
+#define PL_regfree (*Perl_Tregfree_ptr(aTHXo))
+#undef PL_regindent
+#define PL_regindent (*Perl_Tregindent_ptr(aTHXo))
+#undef PL_reginput
+#define PL_reginput (*Perl_Treginput_ptr(aTHXo))
+#undef PL_regint_start
+#define PL_regint_start (*Perl_Tregint_start_ptr(aTHXo))
+#undef PL_regint_string
+#define PL_regint_string (*Perl_Tregint_string_ptr(aTHXo))
+#undef PL_reginterp_cnt
+#define PL_reginterp_cnt (*Perl_Treginterp_cnt_ptr(aTHXo))
+#undef PL_reglastparen
+#define PL_reglastparen (*Perl_Treglastparen_ptr(aTHXo))
+#undef PL_regnarrate
+#define PL_regnarrate (*Perl_Tregnarrate_ptr(aTHXo))
+#undef PL_regnaughty
+#define PL_regnaughty (*Perl_Tregnaughty_ptr(aTHXo))
+#undef PL_regnpar
+#define PL_regnpar (*Perl_Tregnpar_ptr(aTHXo))
+#undef PL_regprecomp
+#define PL_regprecomp (*Perl_Tregprecomp_ptr(aTHXo))
+#undef PL_regprev
+#define PL_regprev (*Perl_Tregprev_ptr(aTHXo))
+#undef PL_regprogram
+#define PL_regprogram (*Perl_Tregprogram_ptr(aTHXo))
+#undef PL_regsawback
+#define PL_regsawback (*Perl_Tregsawback_ptr(aTHXo))
+#undef PL_regseen
+#define PL_regseen (*Perl_Tregseen_ptr(aTHXo))
+#undef PL_regsize
+#define PL_regsize (*Perl_Tregsize_ptr(aTHXo))
+#undef PL_regstartp
+#define PL_regstartp (*Perl_Tregstartp_ptr(aTHXo))
+#undef PL_regtill
+#define PL_regtill (*Perl_Tregtill_ptr(aTHXo))
+#undef PL_regxend
+#define PL_regxend (*Perl_Tregxend_ptr(aTHXo))
+#undef PL_restartop
+#define PL_restartop (*Perl_Trestartop_ptr(aTHXo))
+#undef PL_retstack
+#define PL_retstack (*Perl_Tretstack_ptr(aTHXo))
+#undef PL_retstack_ix
+#define PL_retstack_ix (*Perl_Tretstack_ix_ptr(aTHXo))
+#undef PL_retstack_max
+#define PL_retstack_max (*Perl_Tretstack_max_ptr(aTHXo))
+#undef PL_rs
+#define PL_rs (*Perl_Trs_ptr(aTHXo))
+#undef PL_savestack
+#define PL_savestack (*Perl_Tsavestack_ptr(aTHXo))
+#undef PL_savestack_ix
+#define PL_savestack_ix (*Perl_Tsavestack_ix_ptr(aTHXo))
+#undef PL_savestack_max
+#define PL_savestack_max (*Perl_Tsavestack_max_ptr(aTHXo))
+#undef PL_scopestack
+#define PL_scopestack (*Perl_Tscopestack_ptr(aTHXo))
+#undef PL_scopestack_ix
+#define PL_scopestack_ix (*Perl_Tscopestack_ix_ptr(aTHXo))
+#undef PL_scopestack_max
+#define PL_scopestack_max (*Perl_Tscopestack_max_ptr(aTHXo))
+#undef PL_screamfirst
+#define PL_screamfirst (*Perl_Tscreamfirst_ptr(aTHXo))
+#undef PL_screamnext
+#define PL_screamnext (*Perl_Tscreamnext_ptr(aTHXo))
+#undef PL_secondgv
+#define PL_secondgv (*Perl_Tsecondgv_ptr(aTHXo))
+#undef PL_seen_evals
+#define PL_seen_evals (*Perl_Tseen_evals_ptr(aTHXo))
+#undef PL_seen_zerolen
+#define PL_seen_zerolen (*Perl_Tseen_zerolen_ptr(aTHXo))
+#undef PL_sortcop
+#define PL_sortcop (*Perl_Tsortcop_ptr(aTHXo))
+#undef PL_sortcxix
+#define PL_sortcxix (*Perl_Tsortcxix_ptr(aTHXo))
+#undef PL_sortstash
+#define PL_sortstash (*Perl_Tsortstash_ptr(aTHXo))
+#undef PL_stack_base
+#define PL_stack_base (*Perl_Tstack_base_ptr(aTHXo))
+#undef PL_stack_max
+#define PL_stack_max (*Perl_Tstack_max_ptr(aTHXo))
+#undef PL_stack_sp
+#define PL_stack_sp (*Perl_Tstack_sp_ptr(aTHXo))
+#undef PL_start_env
+#define PL_start_env (*Perl_Tstart_env_ptr(aTHXo))
+#undef PL_statbuf
+#define PL_statbuf (*Perl_Tstatbuf_ptr(aTHXo))
+#undef PL_statcache
+#define PL_statcache (*Perl_Tstatcache_ptr(aTHXo))
+#undef PL_statgv
+#define PL_statgv (*Perl_Tstatgv_ptr(aTHXo))
+#undef PL_statname
+#define PL_statname (*Perl_Tstatname_ptr(aTHXo))
+#undef PL_tainted
+#define PL_tainted (*Perl_Ttainted_ptr(aTHXo))
+#undef PL_timesbuf
+#define PL_timesbuf (*Perl_Ttimesbuf_ptr(aTHXo))
+#undef PL_tmps_floor
+#define PL_tmps_floor (*Perl_Ttmps_floor_ptr(aTHXo))
+#undef PL_tmps_ix
+#define PL_tmps_ix (*Perl_Ttmps_ix_ptr(aTHXo))
+#undef PL_tmps_max
+#define PL_tmps_max (*Perl_Ttmps_max_ptr(aTHXo))
+#undef PL_tmps_stack
+#define PL_tmps_stack (*Perl_Ttmps_stack_ptr(aTHXo))
+#undef PL_top_env
+#define PL_top_env (*Perl_Ttop_env_ptr(aTHXo))
+#undef PL_toptarget
+#define PL_toptarget (*Perl_Ttoptarget_ptr(aTHXo))
+#undef PL_watchaddr
+#define PL_watchaddr (*Perl_Twatchaddr_ptr(aTHXo))
+#undef PL_watchok
+#define PL_watchok (*Perl_Twatchok_ptr(aTHXo))
+#undef PL_No
+#define PL_No (*Perl_GNo_ptr(NULL))
+#undef PL_Yes
+#define PL_Yes (*Perl_GYes_ptr(NULL))
+#undef PL_curinterp
+#define PL_curinterp (*Perl_Gcurinterp_ptr(NULL))
+#undef PL_do_undump
+#define PL_do_undump (*Perl_Gdo_undump_ptr(NULL))
+#undef PL_hexdigit
+#define PL_hexdigit (*Perl_Ghexdigit_ptr(NULL))
+#undef PL_malloc_mutex
+#define PL_malloc_mutex (*Perl_Gmalloc_mutex_ptr(NULL))
+#undef PL_op_mutex
+#define PL_op_mutex (*Perl_Gop_mutex_ptr(NULL))
+#undef PL_patleave
+#define PL_patleave (*Perl_Gpatleave_ptr(NULL))
+#undef PL_thr_key
+#define PL_thr_key (*Perl_Gthr_key_ptr(NULL))
+
+#endif /* !PERL_CORE */
+#endif /* PERL_OBJECT || MULTIPLICITY */
+
+#endif /* __perlapi_h__ */
+
diff --git a/contrib/perl5/perlio.c b/contrib/perl5/perlio.c
index f18f5a3..6945a75 100644
--- a/contrib/perl5/perlio.c
+++ b/contrib/perl5/perlio.c
@@ -1,12 +1,13 @@
/* perlio.c
*
- * Copyright (c) 1996, Nick Ing-Simmons
+ * Copyright (c) 1996-2000, Nick Ing-Simmons
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*
*/
+
#define VOIDUSED 1
#include "config.h"
@@ -21,8 +22,11 @@
*/
#include "EXTERN.h"
+#define PERL_IN_PERLIO_C
#include "perl.h"
+#if !defined(PERL_IMPLICIT_SYS)
+
#ifdef PERLIO_IS_STDIO
void
@@ -140,12 +144,13 @@ PerlIO_canset_cnt(PerlIO *f)
void
PerlIO_set_cnt(PerlIO *f, int cnt)
{
- if (cnt < -1)
- warn("Setting cnt to %d\n",cnt);
+ dTHX;
+ if (cnt < -1 && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Setting cnt to %d\n",cnt);
#if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
FILE_cnt(f) = cnt;
#else
- croak("Cannot set 'cnt' of FILE * on this system");
+ Perl_croak(aTHX_ "Cannot set 'cnt' of FILE * on this system");
#endif
}
@@ -153,23 +158,24 @@ PerlIO_set_cnt(PerlIO *f, int cnt)
void
PerlIO_set_ptrcnt(PerlIO *f, STDCHAR *ptr, int cnt)
{
+ dTHX;
#ifdef FILE_bufsiz
STDCHAR *e = FILE_base(f) + FILE_bufsiz(f);
int ec = e - ptr;
- if (ptr > e + 1)
- warn("Setting ptr %p > end+1 %p\n", ptr, e + 1);
- if (cnt != ec)
- warn("Setting cnt to %d, ptr implies %d\n",cnt,ec);
+ if (ptr > e + 1 && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Setting ptr %p > end+1 %p\n", ptr, e + 1);
+ if (cnt != ec && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Setting cnt to %d, ptr implies %d\n",cnt,ec);
#endif
#if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE)
- FILE_ptr(f) = ptr;
+ FILE_ptr(f) = ptr;
#else
- croak("Cannot set 'ptr' of FILE * on this system");
+ Perl_croak(aTHX_ "Cannot set 'ptr' of FILE * on this system");
#endif
#if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
- FILE_cnt(f) = cnt;
+ FILE_cnt(f) = cnt;
#else
- croak("Cannot set 'cnt' of FILE * on this system");
+ Perl_croak(aTHX_ "Cannot set 'cnt' of FILE * on this system");
#endif
}
@@ -180,7 +186,8 @@ PerlIO_get_cnt(PerlIO *f)
#ifdef FILE_cnt
return FILE_cnt(f);
#else
- croak("Cannot get 'cnt' of FILE * on this system");
+ dTHX;
+ Perl_croak(aTHX_ "Cannot get 'cnt' of FILE * on this system");
return -1;
#endif
}
@@ -192,7 +199,8 @@ PerlIO_get_bufsiz(PerlIO *f)
#ifdef FILE_bufsiz
return FILE_bufsiz(f);
#else
- croak("Cannot get 'bufsiz' of FILE * on this system");
+ dTHX;
+ Perl_croak(aTHX_ "Cannot get 'bufsiz' of FILE * on this system");
return -1;
#endif
}
@@ -204,7 +212,8 @@ PerlIO_get_ptr(PerlIO *f)
#ifdef FILE_ptr
return FILE_ptr(f);
#else
- croak("Cannot get 'ptr' of FILE * on this system");
+ dTHX;
+ Perl_croak(aTHX_ "Cannot get 'ptr' of FILE * on this system");
return NULL;
#endif
}
@@ -216,7 +225,8 @@ PerlIO_get_base(PerlIO *f)
#ifdef FILE_base
return FILE_base(f);
#else
- croak("Cannot get 'base' of FILE * on this system");
+ dTHX;
+ Perl_croak(aTHX_ "Cannot get 'base' of FILE * on this system");
return NULL;
#endif
}
@@ -281,7 +291,8 @@ PerlIO_getname(PerlIO *f, char *buf)
#ifdef VMS
return fgetname(f,buf);
#else
- croak("Don't know how to get file name");
+ dTHX;
+ Perl_croak(aTHX_ "Don't know how to get file name");
return NULL;
#endif
}
@@ -371,19 +382,26 @@ PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
return vfprintf(f,fmt,ap);
}
-
#undef PerlIO_tell
Off_t
PerlIO_tell(PerlIO *f)
{
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FTELLO) && !defined(USE_FTELL64)
+ return ftello(f);
+#else
return ftell(f);
+#endif
}
#undef PerlIO_seek
int
PerlIO_seek(PerlIO *f, Off_t offset, int whence)
{
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FSEEKO) && !defined(USE_FSEEK64)
+ return fseeko(f,offset,whence);
+#else
return fseek(f,offset,whence);
+#endif
}
#undef PerlIO_rewind
@@ -477,7 +495,11 @@ PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
int
PerlIO_setpos(PerlIO *f, const Fpos_t *pos)
{
+#if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
+ return fsetpos64(f, pos);
+#else
return fsetpos(f, pos);
+#endif
}
#endif
#endif
@@ -496,7 +518,11 @@ PerlIO_getpos(PerlIO *f, Fpos_t *pos)
int
PerlIO_getpos(PerlIO *f, Fpos_t *pos)
{
+#if defined(USE_64_BIT_STDIO) && defined(USE_FSETPOS64)
+ return fgetpos64(f, pos);
+#else
return fgetpos(f, pos);
+#endif
}
#endif
#endif
@@ -528,7 +554,8 @@ PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
{
if (strlen(s) >= (STRLEN)n)
{
- PerlIO_puts(PerlIO_stderr(),"panic: sprintf overflow - memory corrupted!\n");
+ dTHX;
+ PerlIO_puts(Perl_error_log,"panic: sprintf overflow - memory corrupted!\n");
my_exit(1);
}
}
@@ -549,3 +576,5 @@ PerlIO_sprintf(char *s, int n, const char *fmt,...)
}
#endif
+#endif /* !PERL_IMPLICIT_SYS */
+
diff --git a/contrib/perl5/perlsdio.h b/contrib/perl5/perlsdio.h
index efc52e1..7afda68 100644
--- a/contrib/perl5/perlsdio.h
+++ b/contrib/perl5/perlsdio.h
@@ -55,12 +55,18 @@
#define PerlIO_clearerr(f) clearerr(f)
#define PerlIO_flush(f) Fflush(f)
#define PerlIO_tell(f) ftell(f)
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FTELLO) && !defined(USE_FTELL64)
+#define ftell ftello
+#endif
#if defined(VMS) && !defined(__DECC)
/* Old VAXC RTL doesn't reset EOF on seek; Perl folk seem to expect this */
# define PerlIO_seek(f,o,w) (((f) && (*f) && ((*f)->_flag &= ~_IOEOF)),fseek(f,o,w))
#else
# define PerlIO_seek(f,o,w) fseek(f,o,w)
#endif
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FSEEKO) && !defined(USE_FSEEK64)
+#define fseek fseeko
+#endif
#ifdef HAS_FGETPOS
#define PerlIO_getpos(f,p) fgetpos(f,p)
#endif
diff --git a/contrib/perl5/perlsfio.h b/contrib/perl5/perlsfio.h
index 8c9387f..c4ed5c7 100644
--- a/contrib/perl5/perlsfio.h
+++ b/contrib/perl5/perlsfio.h
@@ -18,6 +18,7 @@ extern int _stdprintf _ARG_((const char*, ...));
#define PerlIO_write(f,buf,count) sfwrite(f,buf,count)
#define PerlIO_open(path,mode) sfopen(NULL,path,mode)
#define PerlIO_fdopen(fd,mode) _stdopen(fd,mode)
+#define PerlIO_reopen(path,mode,f) sfopen(f,path,mode)
#define PerlIO_close(f) sfclose(f)
#define PerlIO_puts(f,s) sfputr(f,s,-1)
#define PerlIO_putc(f,c) sfputc(f,c)
@@ -34,10 +35,10 @@ extern int _stdprintf _ARG_((const char*, ...));
#define PerlIO_rewind(f) (void) sfseek((f),0L,0)
#define PerlIO_tmpfile() sftmp(0)
-#define PerlIO_importFILE(f,fl) croak("Import from FILE * unimplemeted")
-#define PerlIO_exportFILE(f,fl) croak("Export to FILE * unimplemeted")
+#define PerlIO_importFILE(f,fl) Perl_croak(aTHX_ "Import from FILE * unimplemeted")
+#define PerlIO_exportFILE(f,fl) Perl_croak(aTHX_ "Export to FILE * unimplemeted")
#define PerlIO_findFILE(f) NULL
-#define PerlIO_releaseFILE(p,f) croak("Release of FILE * unimplemeted")
+#define PerlIO_releaseFILE(p,f) Perl_croak(aTHX_ "Release of FILE * unimplemeted")
#define PerlIO_setlinebuf(f) sfset(f,SF_LINE,1)
diff --git a/contrib/perl5/perlvars.h b/contrib/perl5/perlvars.h
index ffb3fe6..bd07adc 100644
--- a/contrib/perl5/perlvars.h
+++ b/contrib/perl5/perlvars.h
@@ -10,165 +10,17 @@
* and how they're initialized.
*
* The 'G' prefix is only needed for vars that need appropriate #defines
- * generated when built with or without EMBED. It is also used to generate
- * the appropriate export list for win32.
- *
- * Avoid build-specific #ifdefs here, like DEBUGGING. That way,
- * we can keep binary compatibility of the curinterp structure */
-
+ * generated in embed*.h. Such symbols are also used to generate
+ * the appropriate export list for win32. */
/* global state */
PERLVAR(Gcurinterp, PerlInterpreter *)
- /* currently running interpreter */
-#ifdef USE_THREADS
-PERLVAR(Gthr_key, perl_key) /* For per-thread struct perl_thread* */
-PERLVAR(Gsv_mutex, perl_mutex) /* Mutex for allocating SVs in sv.c */
-PERLVAR(Gmalloc_mutex, perl_mutex) /* Mutex for malloc */
-PERLVAR(Geval_mutex, perl_mutex) /* Mutex for doeval */
-PERLVAR(Geval_cond, perl_cond) /* Condition variable for doeval */
-PERLVAR(Geval_owner, struct perl_thread *)
- /* Owner thread for doeval */
-PERLVAR(Gnthreads, int) /* Number of threads currently */
-PERLVAR(Gthreads_mutex, perl_mutex) /* Mutex for nthreads and thread list */
-PERLVAR(Gnthreads_cond, perl_cond) /* Condition variable for nthreads */
-PERLVAR(Gsvref_mutex, perl_mutex) /* Mutex for SvREFCNT_{inc,dec} */
-PERLVARI(Gthreadsv_names,char *, THREADSV_NAMES)
-#ifdef FAKE_THREADS
-PERLVAR(Gcurthr, struct perl_thread *)
- /* Currently executing (fake) thread */
+ /* currently running interpreter
+ * (initial parent interpreter under
+ * useithreads) */
+#if defined(USE_THREADS) || defined(USE_ITHREADS)
+PERLVAR(Gthr_key, perl_key) /* key to retrieve per-thread struct */
#endif
-#endif /* USE_THREADS */
-
-PERLVAR(Gninterps, int) /* number of active interpreters */
-
-PERLVAR(Guid, int) /* current real user id */
-PERLVAR(Geuid, int) /* current effective user id */
-PERLVAR(Ggid, int) /* current real group id */
-PERLVAR(Gegid, int) /* current effective group id */
-PERLVAR(Gnomemok, bool) /* let malloc context handle nomem */
-PERLVAR(Gan, U32) /* malloc sequence number */
-PERLVAR(Gcop_seqmax, U32) /* statement sequence number */
-PERLVAR(Gop_seqmax, U16) /* op sequence number */
-PERLVAR(Gevalseq, U32) /* eval sequence number */
-PERLVAR(Gorigenviron, char **)
-PERLVAR(Gorigalen, U32)
-PERLVAR(Gpidstatus, HV *) /* pid-to-status mappings for waitpid */
-PERLVARI(Gmaxo, int, MAXO) /* maximum number of ops */
-PERLVAR(Gosname, char *) /* operating system */
-PERLVARI(Gsh_path, char *, SH_PATH)/* full path of shell */
-PERLVAR(Gsighandlerp, Sighandler_t)
-
-PERLVAR(Gxiv_arenaroot, XPV*) /* list of allocated xiv areas */
-PERLVAR(Gxiv_root, IV *) /* free xiv list--shared by interpreters */
-PERLVAR(Gxnv_root, double *) /* free xnv list--shared by interpreters */
-PERLVAR(Gxrv_root, XRV *) /* free xrv list--shared by interpreters */
-PERLVAR(Gxpv_root, XPV *) /* free xpv list--shared by interpreters */
-PERLVAR(Ghe_root, HE *) /* free he list--shared by interpreters */
-PERLVAR(Gnice_chunk, char *) /* a nice chunk of memory to reuse */
-PERLVAR(Gnice_chunk_size, U32) /* how nice the chunk of memory is */
-
-#ifdef PERL_OBJECT
-PERLVARI(Grunops, runops_proc_t, FUNC_NAME_TO_PTR(RUNOPS_DEFAULT))
-#else
-PERLVARI(Grunops, runops_proc_t *, RUNOPS_DEFAULT)
-#endif
-
-PERLVAR(Gtokenbuf[256], char)
-PERLVAR(Gna, STRLEN) /* for use in SvPV when length is
- Not Applicable */
-
-PERLVAR(Gsv_undef, SV)
-PERLVAR(Gsv_no, SV)
-PERLVAR(Gsv_yes, SV)
-#ifdef CSH
-PERLVARI(Gcshname, char *, CSH)
-PERLVAR(Gcshlen, I32)
-#endif
-
-PERLVAR(Glex_state, U32) /* next token is determined */
-PERLVAR(Glex_defer, U32) /* state after determined token */
-PERLVAR(Glex_expect, expectation) /* expect after determined token */
-PERLVAR(Glex_brackets, I32) /* bracket count */
-PERLVAR(Glex_formbrack, I32) /* bracket count at outer format level */
-PERLVAR(Glex_fakebrack, I32) /* outer bracket is mere delimiter */
-PERLVAR(Glex_casemods, I32) /* casemod count */
-PERLVAR(Glex_dojoin, I32) /* doing an array interpolation */
-PERLVAR(Glex_starts, I32) /* how many interps done on level */
-PERLVAR(Glex_stuff, SV *) /* runtime pattern from m// or s/// */
-PERLVAR(Glex_repl, SV *) /* runtime replacement from s/// */
-PERLVAR(Glex_op, OP *) /* extra info to pass back on op */
-PERLVAR(Glex_inpat, OP *) /* in pattern $) and $| are special */
-PERLVAR(Glex_inwhat, I32) /* what kind of quoting are we in */
-PERLVAR(Glex_brackstack,char *) /* what kind of brackets to pop */
-PERLVAR(Glex_casestack, char *) /* what kind of case mods in effect */
-
-/* What we know when we're in LEX_KNOWNEXT state. */
-PERLVAR(Gnextval[5], YYSTYPE) /* value of next token, if any */
-PERLVAR(Gnexttype[5], I32) /* type of next token */
-PERLVAR(Gnexttoke, I32)
-
-PERLVAR(Glinestr, SV *)
-PERLVAR(Gbufptr, char *)
-PERLVAR(Goldbufptr, char *)
-PERLVAR(Goldoldbufptr, char *)
-PERLVAR(Gbufend, char *)
-PERLVARI(Gexpect,expectation, XSTATE) /* how to interpret ambiguous tokens */
-
-PERLVAR(Gmulti_start, I32) /* 1st line of multi-line string */
-PERLVAR(Gmulti_end, I32) /* last line of multi-line string */
-PERLVAR(Gmulti_open, I32) /* delimiter of said string */
-PERLVAR(Gmulti_close, I32) /* delimiter of said string */
-
-PERLVAR(Gerror_count, I32) /* how many errors so far, max 10 */
-PERLVAR(Gsubline, I32) /* line this subroutine began on */
-PERLVAR(Gsubname, SV *) /* name of current subroutine */
-
-PERLVAR(Gmin_intro_pending, I32) /* start of vars to introduce */
-PERLVAR(Gmax_intro_pending, I32) /* end of vars to introduce */
-PERLVAR(Gpadix, I32) /* max used index in current "register" pad */
-PERLVAR(Gpadix_floor, I32) /* how low may inner block reset padix */
-PERLVAR(Gpad_reset_pending, I32) /* reset pad on next attempted alloc */
-
-PERLVAR(Gthisexpr, I32) /* name id for nothing_in_common() */
-PERLVAR(Glast_uni, char *) /* position of last named-unary op */
-PERLVAR(Glast_lop, char *) /* position of last list operator */
-PERLVAR(Glast_lop_op, OPCODE) /* last list operator */
-PERLVAR(Gin_my, bool) /* we're compiling a "my" declaration */
-PERLVAR(Gin_my_stash, HV *) /* declared class of this "my" declaration */
-#ifdef FCRYPT
-PERLVAR(Gcryptseen, I32) /* has fast crypt() been initialized? */
-#endif
-
-PERLVAR(Ghints, U32) /* pragma-tic compile-time flags */
-
-PERLVAR(Gdo_undump, bool) /* -u or dump seen? */
-PERLVAR(Gdebug, VOL U32) /* flags given to -D switch */
-
-
-#ifdef OVERLOAD
-
-PERLVAR(Gamagic_generation, long)
-
-#endif
-
-#ifdef USE_LOCALE_COLLATE
-PERLVAR(Gcollation_ix, U32) /* Collation generation index */
-PERLVAR(Gcollation_name,char *) /* Name of current collation */
-PERLVARI(Gcollation_standard, bool, TRUE)
- /* Assume simple collation */
-PERLVAR(Gcollxfrm_base, Size_t) /* Basic overhead in *xfrm() */
-PERLVARI(Gcollxfrm_mult,Size_t, 2) /* Expansion factor in *xfrm() */
-#endif /* USE_LOCALE_COLLATE */
-
-#ifdef USE_LOCALE_NUMERIC
-
-PERLVAR(Gnumeric_name, char *) /* Name of current numeric locale */
-PERLVARI(Gnumeric_standard, bool, TRUE)
- /* Assume simple numerics */
-PERLVARI(Gnumeric_local, bool, TRUE)
- /* Assume local numerics */
-
-#endif /* !USE_LOCALE_NUMERIC */
/* constants (these are not literals to facilitate pointer comparisons) */
PERLVARIC(GYes, char *, "1")
@@ -176,8 +28,13 @@ PERLVARIC(GNo, char *, "")
PERLVARIC(Ghexdigit, char *, "0123456789abcdef0123456789ABCDEF")
PERLVARIC(Gpatleave, char *, "\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}")
-PERLVAR(Gspecialsv_list[4],SV *) /* from byterun.h */
+/* XXX does anyone even use this? */
+PERLVARI(Gdo_undump, bool, FALSE) /* -u or dump seen? */
+
+#if defined(MYMALLOC) && (defined(USE_THREADS) || defined(USE_ITHREADS))
+PERLVAR(Gmalloc_mutex, perl_mutex) /* Mutex for malloc */
+#endif
-#ifdef USE_THREADS
-PERLVAR(Gcred_mutex, perl_mutex) /* altered credentials in effect */
+#if defined(USE_ITHREADS)
+PERLVAR(Gop_mutex, perl_mutex) /* Mutex for op refcounting */
#endif
diff --git a/contrib/perl5/perly.c b/contrib/perl5/perly.c
index f1c7691..36b51c0 100644
--- a/contrib/perl5/perly.c
+++ b/contrib/perl5/perly.c
@@ -4,1068 +4,1132 @@ static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/91";
#define YYBYACC 1
#line 16 "perly.y"
#include "EXTERN.h"
+#define PERL_IN_PERLY_C
#include "perl.h"
-#ifdef PERL_OBJECT
-static void
-Dep(CPerlObj *pPerl)
-{
- pPerl->deprecate("\"do\" to call subroutines");
-}
-#define dep() Dep(this)
-#else
-static void
-dep(void)
-{
- deprecate("\"do\" to call subroutines");
-}
+#define dep() deprecate("\"do\" to call subroutines")
+
+/* stuff included here to make perly_c.diff apply better */
+
+#define yydebug PL_yydebug
+#define yynerrs PL_yynerrs
+#define yyerrflag PL_yyerrflag
+#define yychar PL_yychar
+#define yyval PL_yyval
+#define yylval PL_yylval
+
+struct ysv {
+ short* yyss;
+ YYSTYPE* yyvs;
+ int oldyydebug;
+ int oldyynerrs;
+ int oldyyerrflag;
+ int oldyychar;
+ YYSTYPE oldyyval;
+ YYSTYPE oldyylval;
+};
+
+static void yydestruct(pTHXo_ void *ptr);
+
+#line 49 "perly.y"
+#if 0 /* get this from perly.h instead */
+#line 52 "perly.y"
+typedef union {
+ I32 ival;
+ char *pval;
+ OP *opval;
+ GV *gvval;
+} YYSTYPE;
+#line 60 "perly.y"
+#endif /* 0 */
+
+#ifdef USE_PURE_BISON
+#define YYLEX_PARAM (&yychar)
#endif
-#line 30 "perly.y"
+#line 51 "perly.c"
#define YYERRCODE 256
-short yylhs[] = { -1,
- 45, 0, 9, 7, 10, 8, 11, 11, 11, 12,
- 12, 12, 12, 24, 24, 24, 24, 24, 24, 24,
- 15, 15, 15, 14, 14, 42, 42, 13, 13, 13,
- 13, 13, 13, 13, 26, 26, 27, 27, 28, 29,
- 30, 31, 32, 44, 44, 1, 1, 1, 1, 3,
- 38, 38, 46, 4, 5, 6, 39, 40, 40, 41,
- 41, 47, 47, 49, 48, 16, 16, 16, 25, 25,
- 25, 36, 36, 36, 36, 36, 36, 36, 50, 36,
- 37, 37, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+static short yylhs[] = { -1,
+ 50, 0, 8, 6, 9, 7, 10, 10, 10, 11,
+ 11, 11, 11, 24, 24, 24, 24, 24, 24, 24,
+ 14, 14, 14, 13, 13, 42, 42, 12, 12, 12,
+ 12, 12, 12, 12, 26, 26, 27, 27, 28, 29,
+ 30, 31, 32, 49, 49, 1, 1, 1, 1, 1,
+ 2, 38, 38, 46, 51, 3, 4, 5, 39, 40,
+ 40, 44, 44, 44, 45, 45, 41, 41, 52, 52,
+ 54, 53, 15, 15, 15, 25, 25, 25, 36, 36,
+ 36, 36, 36, 36, 36, 36, 55, 36, 37, 37,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 33, 33,
- 34, 34, 34, 2, 2, 43, 23, 18, 19, 20,
- 21, 22, 35, 35, 35, 35,
+ 17, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 47, 47, 48, 48, 48, 48, 48, 33, 33, 34,
+ 34, 34, 43, 23, 18, 19, 20, 21, 22, 35,
+ 35, 35, 35,
};
-short yylen[] = { 2,
+static short yylen[] = { 2,
0, 2, 4, 0, 4, 0, 0, 2, 2, 2,
1, 2, 3, 1, 1, 3, 3, 3, 3, 3,
0, 2, 6, 7, 7, 0, 2, 8, 8, 10,
9, 8, 11, 3, 0, 1, 0, 1, 1, 1,
- 1, 1, 1, 0, 1, 1, 1, 1, 1, 4,
- 1, 0, 5, 0, 0, 0, 1, 0, 1, 1,
- 1, 3, 2, 0, 7, 3, 3, 1, 2, 3,
- 1, 3, 5, 6, 3, 5, 2, 4, 0, 5,
- 1, 1, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 5, 3, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 3, 2, 3, 2,
- 4, 3, 4, 1, 5, 1, 4, 5, 4, 1,
- 1, 1, 5, 6, 5, 6, 5, 4, 5, 1,
- 1, 3, 4, 3, 2, 2, 4, 5, 4, 5,
- 4, 5, 1, 2, 2, 1, 2, 2, 2, 1,
- 3, 1, 3, 4, 4, 6, 1, 1, 0, 1,
- 0, 1, 2, 1, 1, 1, 2, 2, 2, 2,
- 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+ 4, 1, 0, 6, 6, 0, 0, 0, 1, 0,
+ 1, 0, 2, 1, 2, 1, 1, 1, 3, 2,
+ 0, 7, 3, 3, 1, 2, 3, 1, 3, 5,
+ 6, 3, 3, 5, 2, 4, 0, 5, 1, 1,
+ 5, 4, 5, 4, 5, 6, 5, 4, 5, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 5, 3, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 1, 2, 3, 2, 3, 2,
+ 4, 3, 5, 1, 1, 1, 1, 1, 1, 6,
+ 5, 4, 5, 1, 1, 3, 4, 3, 2, 2,
+ 4, 5, 4, 5, 1, 2, 2, 1, 2, 2,
+ 2, 1, 3, 1, 3, 4, 4, 6, 1, 1,
+ 3, 2, 3, 2, 1, 1, 1, 0, 1, 0,
+ 1, 2, 1, 2, 2, 2, 2, 2, 2, 1,
+ 1, 1, 1,
};
-short yydefred[] = { 1,
- 0, 7, 0, 45, 56, 54, 0, 54, 8, 46,
- 9, 11, 0, 47, 48, 49, 0, 0, 0, 63,
- 64, 14, 4, 157, 0, 0, 130, 0, 152, 0,
- 55, 55, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 164, 165, 0,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 10, 0, 0,
- 0, 0, 120, 122, 0, 0, 0, 0, 158, 51,
- 0, 57, 0, 62, 0, 7, 173, 176, 175, 174,
- 0, 0, 0, 0, 0, 0, 4, 4, 4, 4,
- 4, 4, 0, 0, 0, 0, 0, 147, 0, 0,
- 0, 0, 77, 0, 171, 0, 136, 0, 0, 0,
- 0, 0, 167, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 110, 0, 168, 169, 170, 172, 0,
- 0, 34, 0, 0, 0, 0, 0, 0, 0, 0,
+static short yydefred[] = { 1,
+ 0, 7, 0, 45, 58, 56, 0, 56, 56, 8,
+ 46, 9, 11, 48, 0, 47, 49, 50, 0, 0,
+ 0, 70, 71, 0, 14, 4, 169, 0, 0, 144,
+ 0, 164, 0, 57, 57, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 102, 103, 0, 0, 0, 0,
- 0, 0, 0, 0, 13, 0, 50, 59, 0, 0,
- 0, 75, 0, 0, 79, 0, 0, 0, 0, 0,
- 0, 0, 4, 151, 153, 0, 0, 0, 0, 0,
- 0, 0, 112, 0, 134, 0, 0, 109, 27, 0,
- 0, 19, 0, 0, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 81, 0, 0, 82, 0, 0, 0,
- 0, 0, 0, 0, 132, 0, 0, 61, 60, 53,
- 0, 3, 0, 155, 0, 0, 113, 0, 42, 0,
- 43, 0, 0, 0, 0, 166, 0, 0, 36, 41,
- 0, 0, 0, 154, 163, 78, 0, 137, 0, 139,
- 0, 111, 0, 0, 0, 0, 0, 141, 0, 0,
- 0, 119, 0, 117, 0, 128, 0, 133, 0, 76,
- 0, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 73, 138, 140, 127, 0, 125, 0, 0, 142, 118,
- 0, 123, 129, 115, 65, 156, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 126, 124, 74, 7, 28,
- 29, 0, 0, 24, 25, 0, 32, 0, 0, 0,
- 22, 0, 0, 0, 31, 5, 0, 30, 0, 0,
- 33, 0, 23,
+ 0, 12, 0, 0, 0, 0, 0, 0, 0, 10,
+ 0, 0, 0, 0, 0, 136, 138, 0, 0, 0,
+ 0, 170, 125, 52, 0, 59, 0, 69, 0, 0,
+ 7, 190, 193, 192, 191, 0, 0, 0, 0, 0,
+ 0, 4, 4, 4, 4, 4, 4, 0, 0, 0,
+ 0, 0, 159, 0, 0, 0, 0, 85, 0, 188,
+ 0, 150, 0, 0, 0, 0, 0, 0, 0, 175,
+ 177, 176, 0, 184, 0, 0, 0, 0, 0, 0,
+ 0, 0, 130, 0, 0, 0, 185, 186, 187, 189,
+ 0, 34, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 121, 122, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 13, 0, 51, 61, 0,
+ 0, 0, 0, 83, 0, 0, 87, 0, 0, 0,
+ 0, 0, 0, 0, 4, 163, 165, 0, 0, 0,
+ 0, 0, 0, 0, 132, 0, 148, 174, 0, 0,
+ 171, 0, 0, 129, 27, 0, 0, 19, 0, 0,
+ 0, 0, 73, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 89, 0,
+ 0, 90, 0, 0, 101, 0, 0, 0, 0, 0,
+ 0, 0, 146, 0, 0, 0, 0, 0, 0, 3,
+ 0, 0, 167, 0, 0, 0, 42, 0, 43, 0,
+ 0, 0, 0, 183, 0, 0, 36, 41, 0, 0,
+ 0, 166, 182, 86, 0, 151, 0, 153, 0, 131,
+ 173, 65, 0, 0, 0, 0, 98, 0, 0, 0,
+ 0, 100, 94, 0, 92, 0, 142, 0, 147, 63,
+ 68, 67, 55, 0, 54, 84, 0, 88, 133, 0,
+ 0, 0, 0, 0, 0, 0, 0, 80, 152, 154,
+ 141, 0, 0, 0, 99, 93, 0, 97, 95, 143,
+ 91, 72, 168, 6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 140, 96, 81, 7, 28, 29, 0, 0,
+ 24, 25, 0, 32, 0, 0, 0, 22, 0, 0,
+ 0, 31, 5, 0, 30, 0, 0, 33, 0, 23,
};
-short yydgoto[] = { 1,
- 9, 66, 10, 18, 95, 17, 86, 339, 89, 328,
- 3, 11, 12, 68, 344, 263, 70, 71, 72, 73,
- 74, 75, 76, 269, 78, 270, 259, 261, 264, 272,
- 260, 262, 113, 198, 91, 79, 238, 81, 83, 179,
- 250, 142, 267, 13, 2, 14, 15, 16, 85, 256,
+static short yydgoto[] = { 1,
+ 10, 11, 20, 100, 19, 91, 366, 94, 355, 3,
+ 12, 13, 70, 371, 281, 72, 73, 74, 75, 76,
+ 77, 78, 79, 287, 81, 288, 277, 279, 282, 290,
+ 278, 280, 118, 210, 96, 82, 253, 85, 87, 190,
+ 323, 152, 285, 267, 221, 14, 83, 133, 15, 2,
+ 16, 17, 18, 89, 274,
};
-short yysindex[] = { 0,
- 0, 0, -66, 0, 0, 0, -48, 0, 0, 0,
- 0, 0, 645, 0, 0, 0, -232, -227, -27, 0,
- 0, 0, 0, 0, -23, -23, 0, -6, 0, 2099,
- 0, 0, 13, 20, 24, 25, -34, 2099, 27, 28,
- 29, 1021, 965, -23, 1084, 1348, -217, 0, 0, -23,
- 2099, 2099, 2099, 2099, 2099, 2099, 1404, 0, 2099, 2099,
- 1460, -23, -23, -23, -23, 2099, -206, 0, 335, 3814,
- -73, -68, 0, 0, -47, 40, 32, 61, 0, 0,
- -39, 0, -157, 0, -145, 0, 0, 0, 0, 0,
- 2099, 73, 2099, 825, -39, -157, 0, 0, 0, 0,
- 0, 0, 75, 3814, 78, 1519, 965, 0, 825, 0,
- -73, 61, 0, 2099, 0, 77, 0, 825, -16, -9,
- -51, 2099, 0, 61, 87, 87, 87, -86, -86, 33,
- -40, 87, 87, 0, -81, 0, 0, 0, 0, 825,
- -39, 0, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
- 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099,
- 2099, 2099, 2099, 2099, 0, 0, 30, 2099, 2099, 2099,
- 2099, 2099, 2099, 1694, 0, 2099, 0, 0, -49, -118,
- 189, 0, 2099, 353, 0, -39, 2099, 2099, 2099, 2099,
- 104, 1753, 0, 0, 0, -24, 8, 85, 2099, 61,
- 1809, 1865, 0, 23, 0, 2099, 54, 0, 0, -269,
- -269, 0, -269, -269, -269, -151, 0, -43, 1121, 825,
- 673, 50, 363, 3814, 1233, 2459, 3640, 2309, 266, -82,
- 87, 87, 2099, 0, 1928, 2099, 0, 111, 51, 12,
- 76, 14, 90, 39, 0, -22, 3814, 0, 0, 0,
- 2099, 0, 121, 0, 2099, 2099, 0, -269, 0, 124,
- 0, 125, -269, 126, 130, 0, 112, 335, 0, 0,
- 131, 136, 2099, 0, 0, 0, -14, 0, 1, 0,
- 4, 0, 133, 2099, 55, 2099, 49, 0, 6, 197,
- 2099, 0, 89, 0, 94, 0, 100, 0, 144, 0,
- 1175, 0, 92, 92, 92, 92, 2099, 92, 2099, 171,
- 0, 0, 0, 0, 202, 0, 3900, 108, 0, 0,
- 188, 0, 0, 0, 0, 0, 0, -206, -206, -238,
- -238, 199, -206, 211, 92, 0, 0, 0, 0, 0,
- 0, 92, 241, 0, 0, 92, 0, 1753, -206, 326,
- 0, 2099, -206, 256, 0, 0, 259, 0, 92, 92,
- 0, -238, 0,
+static short yysindex[] = { 0,
+ 0, 0, -199, 0, 0, 0, -53, 0, 0, 0,
+ 0, 0, 0, 0, 646, 0, 0, 0, -217, -207,
+ 44, 0, 0, -207, 0, 0, 0, -32, -32, 0,
+ 66, 0, 2177, 0, 0, 69, 83, 93, 110, -35,
+ 2177, 119, 121, 136, 1013, 973, -32, 1077, 1344, -146,
+ 2177, 68, -32, 2177, 2177, 2177, 2177, 2177, 2177, 1384,
+ 1424, 0, 2177, 2177, -32, -32, -32, -32, -152, 0,
+ 470, 845, -13, -65, -63, 0, 0, 55, 137, 122,
+ 138, 0, 0, 0, 60, 0, -70, 0, -66, -70,
+ 0, 0, 0, 0, 0, 2177, 146, 2177, 1085, 60,
+ -70, 0, 0, 0, 0, 0, 0, 152, 845, 153,
+ 1464, 973, 0, 1085, 0, -65, 138, 0, 2177, 0,
+ 160, 0, 1085, 2, 76, -52, 2177, 1085, 1524, 0,
+ 0, 0, -96, 0, 138, -181, -181, -181, -112, -112,
+ 123, -38, 0, -74, -181, -181, 0, 0, 0, 0,
+ 60, 0, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2177, 2177, 0, 0, -16, 2177, 1731, 2177, 2177,
+ 2177, 2177, 2177, 2177, 1791, 0, 2177, 0, 0, -88,
+ -34, -88, 339, 0, 2177, 287, 0, -88, 2177, 2177,
+ 2177, 2177, 173, 1850, 0, 0, 0, -33, 46, 180,
+ 2177, 138, 1910, 2025, 0, 97, 0, 0, -31, -29,
+ 0, 2177, 133, 0, 0, -237, -237, 0, -237, -237,
+ -237, -69, 0, 1614, 1085, 684, 167, 107, 845, 3800,
+ 1125, 405, 1164, 778, -228, -181, -181, 2177, 0, 2117,
+ 2177, 0, 197, -48, 0, -9, -72, -45, -7, -42,
+ 56, -36, 0, -4, 845, -10, -47, 2177, -47, 0,
+ 216, 2177, 0, 2177, 60, -237, 0, 219, 0, 230,
+ -237, 233, 237, 0, 242, 470, 0, 0, 246, 225,
+ 2177, 0, 0, 0, 13, 0, 18, 0, 29, 0,
+ 0, 0, 61, 2177, 2177, 54, 0, 32, 63, 2177,
+ 165, 0, 0, 174, 0, 178, 0, 191, 0, 0,
+ 0, 0, 0, 261, 0, 0, 350, 0, 0, 182,
+ 182, 182, 182, 2177, 182, 2177, 281, 0, 0, 0,
+ 0, 102, 1237, 202, 0, 0, 294, 0, 0, 0,
+ 0, 0, 0, 0, -152, -152, -130, -130, 297, -152,
+ 290, 182, 0, 0, 0, 0, 0, 0, 182, 318,
+ 0, 0, 182, 0, 1850, -152, 407, 0, 2177, -152,
+ 324, 0, 0, 326, 0, 182, 182, 0, -130, 0,
};
-short yyrindex[] = { 0,
- 0, 0, 249, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 184, 0, 0, 0,
+static short yyrindex[] = { 0,
+ 0, 0, 243, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 236, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2228, 426, 0,
- 0, 2833, 2876, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 59, 0, -10, 2038,
- 2952, 2995, 0, 0, 2274, 2140, 0, 200, 0, 0,
- 0, 0, -44, 0, 0, 0, 0, 0, 0, 0,
- 2421, 0, 0, 105, 0, 198, 0, 0, 0, 0,
- 0, 0, 0, 3753, 0, 0, 319, 0, 3505, 525,
- 586, 2510, 0, 0, 0, 2185, 0, 3541, 2952, 0,
- 0, 2421, 0, 2553, 3112, 3150, 3188, -37, 3069, 2597,
- 0, 3231, 3269, 0, 0, 0, 0, 0, 0, 3584,
+ 36, 451, 0, 0, 2208, 2271, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 115, 0,
+ -12, 939, 2325, 2385, 2463, 0, 0, 2510, 2561, 0,
+ 1220, 0, 0, 0, 0, 0, -44, 0, 0, -44,
+ 0, 0, 0, 0, 0, 2271, 0, 0, 3846, 0,
+ -105, 0, 0, 0, 0, 0, 0, 0, 2612, 0,
+ 0, 327, 0, 3883, 522, 583, 3032, 0, 0, 0,
+ 2621, 0, 3893, 2385, 0, 0, 2271, 3930, 0, 0,
+ 0, 0, 2667, 0, 3092, 3374, 3418, 3458, 3219, 3331,
+ 2746, 0, 0, 0, 3496, 3567, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 2673, 0, 0, 0, 0,
- 909, 0, 319, 0, 0, 0, 320, 0, 0, 0,
- 0, 306, 0, 0, 0, 0, 325, 0, 0, 2789,
- 0, 0, 0, 0, 0, 0, 2716, 0, 0, -5,
- 22, 0, 68, 69, 70, 702, 0, 0, 3741, 1296,
- 1560, 3386, 3424, 3796, 0, 3703, 3660, 3622, 1616, 3467,
- 3305, 3348, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 3809, 0, 0, 0,
- 309, 0, 0, 0, 0, 2421, 0, 79, 0, 0,
- 0, 0, 330, 0, 0, 0, 0, 84, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2797, 0, 0, -23,
+ 0, -23, 913, 0, 327, 0, 0, 247, 336, 0,
+ 0, 0, 0, 333, 0, 0, 0, 0, 352, 0,
+ 0, 3138, 0, 0, 0, 0, 0, 0, 0, 2857,
+ 0, 0, 2903, 0, 0, -8, -2, 0, 7, 33,
+ 42, 2255, 0, -28, 3968, 1822, 3732, 3769, 3023, 0,
+ 4119, 4082, 4021, 4005, 1044, 3610, 3694, 0, 0, 0,
+ 0, 0, 2949, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3657, -21, 0, 345, 0, 0,
+ 0, 0, 0, 2271, 0, 71, 0, 0, 0, 0,
+ 364, 0, 0, 0, 0, 86, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 319, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 317, 0,
- 0, 0, 0, 0, 0, 0, 1982, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 59, 59, 154,
- 154, 0, 59, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 340, 59, 909,
- 0, 0, 59, 0, 0, 0, 0, 0, 0, 0,
- 0, 154, 0,
-};
-short yygindex[] = { 0,
- 0, 0, 0, 374, 351, 0, -12, 0, 946, 413,
- -83, 0, 0, 0, -311, -13, 4007, 2893, 0, 0,
- 0, 0, 0, 372, -8, 0, 0, 246, -131, 43,
- 86, 208, -45, -169, 987, 0, 0, 0, 0, 308,
- 0, -271, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-#define YYTABLESIZE 4293
-short yytable[] = { 69,
- 207, 62, 181, 104, 168, 102, 104, 204, 168, 248,
- 20, 208, 62, 253, 58, 285, 274, 170, 298, 345,
- 104, 104, 172, 202, 80, 104, 311, 148, 149, 82,
- 15, 84, 121, 93, 112, 18, 150, 342, 343, 122,
- 150, 312, 124, 131, 313, 182, 319, 135, 15, 169,
- 363, 275, 97, 18, 171, 104, 340, 341, 26, 98,
- 271, 347, 39, 99, 100, 62, 105, 106, 107, 235,
- 293, 141, 295, 23, 170, 173, 205, 355, 58, 174,
- 39, 358, 112, 23, 187, 188, 189, 190, 191, 192,
- 175, 26, 196, 197, 26, 26, 26, 297, 26, 23,
- 26, 26, 178, 26, 176, 200, 169, 318, 16, 17,
- 20, 180, 183, 112, 193, 203, 201, 26, 194, 38,
- 236, 321, 26, 206, 40, 276, 16, 17, 20, 210,
- 211, 213, 214, 215, 216, 217, 218, 38, 251, 62,
- 168, 310, 15, 292, 284, 149, 149, 282, 149, 26,
- 291, 307, 233, 21, 239, 240, 241, 242, 243, 244,
- 246, 300, 149, 149, 303, 304, 305, 149, 294, 197,
- 306, 308, 150, 258, 211, 332, 211, 168, 268, 316,
- 273, 26, 296, 26, 26, 277, 21, 279, 281, 21,
- 21, 21, 283, 21, 309, 21, 21, 149, 21, 4,
- 5, 6, 325, 7, 8, 299, 154, 155, 19, 150,
- 302, 335, 21, 322, 327, 148, 149, 21, 323, 287,
- 357, 289, 290, 163, 324, 314, 164, 167, 338, 165,
- 166, 167, 337, 87, 104, 104, 104, 104, 88, 346,
- 68, 104, 112, 104, 21, 148, 149, 112, 2, 104,
- 104, 104, 104, 148, 149, 350, 148, 149, 68, 104,
- 104, 101, 104, 104, 104, 104, 104, 104, 104, 348,
- 315, 104, 148, 149, 148, 149, 21, 197, 21, 21,
- 352, 44, 148, 149, 44, 44, 44, 234, 44, 320,
- 44, 44, 68, 44, 336, 258, 359, 148, 149, 360,
- 148, 149, 148, 149, 148, 149, 52, 44, 148, 149,
- 148, 149, 44, 252, 26, 26, 26, 26, 26, 26,
- 58, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 69, 148, 149, 26, 26, 44,
- 26, 26, 26, 26, 26, 148, 149, 148, 149, 26,
- 26, 26, 26, 26, 26, 163, 168, 26, 164, 161,
- 37, 165, 166, 167, 35, 162, 26, 159, 26, 26,
- 40, 44, 148, 149, 44, 37, 149, 149, 149, 149,
- 35, 21, 96, 149, 77, 149, 148, 149, 150, 212,
- 354, 149, 149, 254, 334, 164, 255, 265, 165, 166,
- 167, 149, 149, 186, 149, 149, 149, 149, 149, 21,
- 21, 21, 21, 21, 21, 157, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 148,
- 149, 0, 21, 21, 0, 21, 21, 21, 21, 21,
- 0, 0, 0, 168, 21, 21, 21, 21, 21, 21,
- 356, 0, 21, 168, 4, 5, 6, 0, 7, 8,
- 0, 21, 0, 21, 21, 0, 150, 0, 0, 150,
- 0, 68, 68, 68, 68, 150, 0, 0, 68, 0,
- 0, 0, 0, 150, 150, 150, 0, 0, 150, 0,
- 0, 0, 0, 148, 149, 0, 68, 68, 148, 149,
- 0, 0, 0, 0, 44, 44, 44, 44, 44, 44,
- 0, 44, 44, 44, 0, 0, 150, 44, 150, 0,
- 44, 44, 44, 44, 0, 0, 0, 44, 44, 0,
- 44, 44, 44, 44, 44, 0, 0, 0, 0, 44,
- 44, 44, 44, 44, 44, 0, 0, 44, 150, 0,
- 0, 0, 152, 153, 154, 155, 44, 173, 44, 44,
- 173, 173, 173, 0, 173, 157, 173, 173, 157, 173,
- 162, 163, 0, 0, 164, 0, 0, 165, 166, 167,
- 0, 0, 157, 157, 0, 0, 0, 157, 173, 0,
- 0, 4, 5, 6, 0, 7, 8, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 143, 144, 145, 146,
- 0, 0, 0, 147, 0, 157, 0, 157, 174, 0,
- 0, 174, 174, 174, 0, 174, 114, 174, 174, 114,
- 174, 148, 149, 151, 0, 0, 0, 0, 0, 152,
- 153, 154, 155, 114, 114, 0, 0, 157, 114, 174,
- 173, 154, 156, 158, 159, 160, 161, 162, 163, 0,
- 0, 164, 0, 0, 165, 166, 167, 0, 163, 0,
- 0, 164, 0, 0, 165, 166, 167, 52, 114, 0,
- 62, 64, 50, 0, 57, 0, 65, 60, 0, 59,
- 0, 0, 0, 0, 0, 0, 0, 150, 150, 150,
- 150, 0, 0, 58, 150, 0, 150, 0, 63, 0,
- 0, 174, 150, 150, 150, 150, 329, 330, 331, 0,
- 333, 0, 150, 150, 0, 150, 150, 150, 150, 150,
- 150, 150, 0, 0, 150, 61, 0, 150, 150, 150,
- 0, 0, 67, 0, 0, 67, 0, 349, 0, 0,
- 0, 0, 0, 0, 351, 0, 0, 0, 353, 0,
- 67, 0, 0, 168, 0, 0, 0, 23, 0, 0,
- 53, 361, 362, 0, 0, 0, 0, 0, 0, 0,
- 0, 173, 173, 173, 173, 173, 0, 173, 173, 173,
- 0, 0, 0, 173, 67, 150, 157, 157, 157, 157,
- 0, 0, 0, 157, 173, 157, 173, 173, 173, 173,
- 173, 157, 157, 157, 157, 173, 173, 173, 173, 173,
- 173, 157, 157, 173, 157, 157, 157, 157, 157, 157,
- 157, 0, 173, 157, 173, 173, 157, 157, 157, 0,
- 0, 0, 174, 174, 174, 174, 174, 0, 174, 174,
- 174, 0, 0, 0, 174, 0, 0, 114, 114, 114,
- 114, 0, 0, 0, 114, 174, 114, 174, 174, 174,
- 174, 174, 114, 114, 114, 114, 174, 174, 174, 174,
- 174, 174, 114, 114, 174, 114, 114, 114, 114, 114,
- 114, 114, 0, 174, 114, 174, 174, 114, 114, 114,
- 22, 24, 25, 26, 27, 28, 0, 29, 30, 31,
- 0, 0, 0, 32, 0, 168, 33, 34, 35, 36,
- 0, 0, 0, 37, 38, 0, 39, 40, 41, 42,
- 43, 0, 0, 0, 0, 44, 45, 46, 47, 48,
- 49, 44, 0, 51, 44, 44, 44, 150, 44, 0,
- 44, 44, 54, 44, 55, 56, 0, 0, 67, 152,
- 0, 154, 155, 0, 0, 0, 0, 44, 0, 0,
- 0, 0, 44, 67, 67, 67, 67, 162, 163, 0,
- 67, 164, 0, 0, 165, 166, 167, 108, 0, 0,
- 117, 0, 0, 0, 0, 0, 0, 52, 67, 44,
- 62, 64, 50, 0, 57, 0, 65, 60, 0, 59,
- 0, 0, 92, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 177, 0, 63, 114,
- 115, 44, 0, 0, 44, 0, 123, 0, 0, 0,
- 185, 0, 0, 0, 0, 0, 0, 0, 136, 137,
- 138, 139, 0, 52, 0, 61, 62, 64, 50, 0,
- 57, 0, 65, 60, 0, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 327,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 209, 23, 0, 0,
- 53, 0, 0, 199, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 61, 0, 154, 155, 0, 52, 0, 0, 62,
- 64, 50, 0, 57, 249, 65, 60, 0, 59, 162,
- 163, 257, 0, 164, 0, 0, 165, 166, 167, 0,
- 0, 0, 0, 23, 0, 0, 53, 63, 0, 0,
+ 0, 0, 0, 0, 0, 355, 0, 0, 0, 0,
+ 0, 0, 2972, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 115, 115, 175, 175, 0, 115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 44, 44, 44, 44, 44, 44,
- 0, 44, 44, 44, 61, 0, 0, 44, 0, 0,
- 44, 44, 44, 44, 0, 0, 0, 44, 44, 0,
- 44, 44, 44, 44, 44, 0, 0, 0, 0, 44,
- 44, 44, 44, 44, 44, 0, 23, 44, 0, 53,
- 0, 168, 0, 0, 0, 326, 44, 0, 44, 44,
- 0, 110, 25, 26, 27, 28, 88, 29, 30, 31,
- 0, 0, 0, 32, 0, 0, 0, 157, 0, 0,
- 0, 0, 0, 150, 38, 0, 39, 40, 41, 42,
- 43, 0, 0, 0, 0, 44, 45, 46, 47, 48,
- 49, 0, 0, 51, 0, 168, 0, 0, 0, 0,
- 0, 0, 54, 0, 55, 56, 0, 24, 25, 26,
- 27, 28, 0, 29, 30, 31, 0, 0, 0, 32,
- 286, 0, 0, 0, 0, 157, 0, 150, 0, 0,
- 38, 0, 39, 40, 41, 42, 43, 0, 0, 0,
- 0, 44, 45, 46, 47, 48, 49, 0, 0, 51,
- 0, 0, 0, 168, 0, 0, 0, 0, 54, 0,
- 55, 56, 0, 0, 0, 0, 88, 0, 0, 88,
- 116, 25, 26, 27, 28, 0, 29, 30, 31, 0,
- 0, 0, 32, 88, 88, 150, 0, 0, 88, 0,
- 0, 0, 0, 38, 0, 39, 40, 41, 42, 43,
- 0, 0, 0, 0, 44, 45, 46, 47, 48, 49,
- 52, 0, 51, 62, 64, 50, 0, 57, 88, 65,
- 60, 54, 59, 55, 56, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 120, 152, 153, 154,
- 155, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 158, 159, 160, 161, 162, 163, 0, 0, 164,
- 0, 0, 165, 166, 167, 0, 52, 0, 61, 62,
- 64, 50, 0, 57, 130, 65, 60, 0, 59, 0,
- 0, 0, 0, 0, 0, 151, 0, 0, 0, 0,
- 0, 152, 153, 154, 155, 0, 0, 63, 0, 0,
- 0, 0, 0, 53, 156, 158, 159, 160, 161, 162,
- 163, 0, 0, 164, 0, 0, 165, 166, 167, 0,
- 0, 0, 52, 0, 61, 62, 64, 50, 0, 57,
- 0, 65, 60, 0, 59, 0, 0, 0, 0, 0,
- 0, 0, 0, 151, 0, 0, 0, 0, 0, 152,
- 153, 154, 155, 63, 0, 0, 0, 0, 0, 53,
- 0, 0, 156, 158, 159, 160, 161, 162, 163, 0,
- 0, 164, 0, 0, 165, 166, 167, 0, 0, 0,
- 61, 52, 134, 0, 62, 64, 50, 0, 57, 195,
- 65, 60, 0, 59, 0, 0, 0, 88, 88, 88,
- 88, 0, 0, 0, 88, 0, 88, 0, 0, 0,
- 0, 0, 63, 88, 0, 53, 0, 0, 0, 0,
- 0, 0, 88, 88, 0, 88, 88, 88, 88, 88,
- 89, 0, 0, 89, 24, 25, 26, 27, 28, 61,
- 29, 30, 31, 0, 0, 0, 32, 89, 89, 0,
- 0, 0, 89, 0, 0, 0, 0, 38, 0, 39,
- 40, 41, 42, 43, 0, 0, 0, 0, 44, 45,
- 46, 47, 48, 49, 53, 0, 51, 0, 0, 0,
- 0, 0, 89, 0, 0, 54, 90, 55, 56, 90,
- 24, 25, 26, 27, 28, 0, 29, 30, 31, 0,
- 0, 0, 32, 90, 90, 0, 0, 0, 90, 0,
- 0, 0, 0, 38, 0, 39, 40, 41, 42, 43,
- 0, 0, 0, 0, 44, 45, 46, 47, 48, 49,
- 0, 0, 51, 0, 0, 0, 0, 0, 90, 0,
- 0, 54, 0, 55, 56, 0, 24, 25, 26, 27,
- 28, 0, 29, 30, 31, 0, 52, 0, 32, 62,
- 64, 50, 0, 57, 245, 65, 60, 0, 59, 38,
- 0, 39, 40, 41, 42, 43, 0, 0, 0, 0,
- 44, 45, 46, 47, 48, 49, 0, 63, 51, 0,
- 0, 0, 0, 0, 0, 0, 0, 54, 0, 55,
- 56, 0, 0, 0, 0, 24, 25, 26, 27, 28,
- 0, 29, 30, 31, 61, 52, 0, 32, 62, 64,
- 50, 0, 57, 0, 65, 60, 0, 59, 38, 0,
- 39, 40, 41, 42, 43, 0, 0, 0, 0, 44,
- 45, 46, 47, 48, 49, 0, 63, 51, 0, 53,
- 0, 0, 0, 0, 0, 0, 54, 0, 55, 56,
- 0, 89, 89, 89, 89, 0, 0, 0, 89, 0,
- 89, 52, 0, 61, 62, 64, 50, 0, 57, 278,
- 65, 60, 0, 59, 0, 0, 89, 89, 0, 89,
- 89, 89, 89, 89, 0, 0, 0, 0, 0, 0,
- 0, 0, 63, 0, 0, 0, 0, 0, 53, 0,
- 0, 0, 0, 0, 0, 0, 0, 90, 90, 90,
- 90, 0, 0, 0, 90, 0, 90, 52, 0, 61,
- 62, 64, 50, 0, 57, 280, 65, 60, 0, 59,
- 0, 0, 90, 90, 0, 90, 90, 90, 90, 90,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,
- 0, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 374, 115, 913, 0, 0, 115,
+ 0, 0, 0, 0, 0, 0, 0, 0, 175, 0,
+};
+static short yygindex[] = { 0,
+ 0, 0, 164, 383, 0, 14, 0, 37, 655, -89,
+ 0, 0, 0, -336, -15, 3415, 0, 2211, 368, 369,
+ 0, 0, 0, 410, 916, 0, 0, 273, -163, 62,
+ 94, 249, -71, -186, 634, 0, 0, 0, 428, -46,
+ 184, 118, 0, -149, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+};
+#define YYTABLESIZE 4423
+static short yytable[] = { 71,
+ 65, 193, 223, 65, 107, 22, 216, 292, 271, 301,
+ 311, 321, 111, 314, 60, 111, 316, 60, 224, 65,
+ 313, 372, 318, 250, 194, 181, 178, 183, 15, 111,
+ 111, 312, 18, 126, 111, 62, 319, 64, 39, 84,
+ 289, 214, 269, 192, 142, 144, 15, 16, 275, 86,
+ 18, 69, 390, 338, 198, 217, 39, 180, 339, 182,
+ 163, 164, 158, 159, 111, 16, 4, 5, 6, 340,
+ 7, 8, 345, 17, 251, 26, 155, 179, 60, 155,
+ 172, 113, 20, 173, 122, 315, 174, 175, 176, 293,
+ 26, 17, 181, 155, 155, 208, 209, 9, 155, 62,
+ 20, 64, 88, 65, 67, 98, 248, 129, 102, 177,
+ 127, 38, 344, 219, 26, 199, 200, 201, 202, 203,
+ 204, 188, 103, 347, 180, 151, 40, 337, 155, 38,
+ 173, 66, 104, 174, 175, 176, 197, 226, 227, 229,
+ 230, 231, 232, 233, 15, 369, 370, 26, 317, 105,
+ 26, 26, 26, 341, 26, 346, 26, 26, 110, 26,
+ 111, 254, 256, 257, 258, 259, 260, 261, 262, 264,
+ 359, 23, 24, 26, 21, 112, 185, 184, 26, 209,
+ 186, 187, 26, 276, 227, 195, 227, 225, 286, 189,
+ 191, 205, 60, 206, 363, 295, 324, 297, 299, 213,
+ 215, 220, 328, 21, 176, 26, 303, 21, 65, 266,
+ 21, 21, 21, 222, 21, 384, 21, 21, 291, 21,
+ 294, 300, 268, 304, 92, 158, 159, 158, 159, 93,
+ 302, 159, 306, 21, 308, 309, 310, 26, 21, 26,
+ 26, 249, 2, 111, 111, 111, 111, 158, 159, 320,
+ 111, 158, 159, 60, 158, 159, 326, 158, 159, 330,
+ 106, 158, 159, 158, 159, 21, 158, 159, 158, 159,
+ 331, 111, 111, 332, 111, 44, 377, 333, 44, 44,
+ 44, 334, 44, 336, 44, 44, 335, 44, 342, 348,
+ 158, 159, 158, 159, 209, 158, 159, 21, 349, 21,
+ 21, 44, 350, 322, 354, 322, 44, 155, 155, 155,
+ 155, 329, 158, 159, 155, 351, 155, 158, 159, 352,
+ 276, 362, 155, 155, 155, 155, 364, 273, 158, 159,
+ 272, 158, 159, 44, 365, 155, 155, 373, 155, 155,
+ 155, 155, 155, 155, 155, 158, 159, 155, 375, 166,
+ 155, 155, 155, 158, 159, 158, 159, 379, 53, 71,
+ 158, 159, 158, 159, 386, 44, 387, 180, 44, 62,
+ 26, 26, 26, 26, 26, 26, 37, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 353, 35, 181, 26, 26, 163, 26, 26, 26, 26,
+ 26, 158, 159, 178, 40, 26, 26, 26, 26, 26,
+ 26, 26, 166, 37, 35, 172, 26, 101, 173, 131,
+ 132, 174, 175, 176, 80, 26, 228, 26, 26, 361,
+ 21, 21, 21, 21, 21, 21, 381, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 283, 90, 325, 21, 21, 0, 21, 21, 21, 21,
+ 21, 0, 0, 270, 0, 21, 21, 21, 21, 21,
+ 21, 21, 367, 368, 0, 172, 21, 374, 173, 0,
+ 0, 174, 175, 176, 0, 21, 0, 21, 21, 0,
+ 0, 162, 0, 382, 162, 0, 0, 385, 44, 44,
+ 44, 44, 44, 44, 0, 44, 44, 44, 162, 162,
+ 0, 44, 0, 162, 44, 44, 44, 44, 0, 0,
+ 0, 44, 44, 0, 44, 44, 44, 44, 44, 0,
+ 0, 383, 0, 44, 44, 44, 44, 44, 44, 0,
+ 0, 0, 0, 162, 44, 0, 0, 0, 0, 0,
+ 0, 0, 0, 44, 190, 44, 44, 190, 190, 190,
+ 0, 190, 169, 190, 190, 169, 190, 160, 0, 0,
+ 0, 0, 0, 161, 162, 163, 164, 0, 0, 169,
+ 169, 0, 0, 0, 169, 190, 0, 0, 0, 165,
+ 167, 168, 169, 170, 171, 172, 0, 0, 173, 0,
+ 0, 174, 175, 176, 4, 5, 6, 0, 7, 8,
+ 0, 0, 190, 0, 169, 191, 0, 0, 191, 191,
+ 191, 0, 191, 134, 191, 191, 134, 191, 0, 0,
+ 160, 0, 0, 0, 0, 9, 161, 162, 163, 164,
+ 134, 134, 0, 0, 0, 134, 191, 190, 0, 0,
+ 0, 0, 165, 167, 168, 169, 170, 171, 172, 0,
+ 0, 173, 97, 0, 174, 175, 176, 0, 0, 0,
+ 0, 0, 4, 5, 6, 134, 7, 8, 55, 119,
+ 120, 65, 67, 53, 0, 60, 134, 68, 64, 0,
+ 63, 161, 162, 163, 164, 0, 0, 0, 147, 148,
+ 149, 150, 0, 9, 62, 0, 0, 0, 191, 66,
+ 169, 170, 171, 172, 0, 0, 173, 0, 0, 174,
+ 175, 176, 162, 162, 162, 162, 0, 0, 0, 162,
+ 0, 162, 0, 0, 0, 0, 61, 162, 162, 162,
+ 162, 153, 154, 155, 156, 211, 0, 0, 157, 0,
+ 162, 162, 0, 162, 162, 162, 162, 162, 162, 162,
+ 0, 0, 162, 0, 0, 162, 162, 162, 26, 158,
+ 159, 56, 0, 0, 0, 0, 0, 0, 190, 190,
+ 190, 190, 190, 0, 190, 190, 190, 0, 0, 0,
+ 190, 0, 0, 169, 169, 169, 169, 0, 0, 0,
+ 169, 190, 169, 190, 190, 190, 190, 190, 169, 169,
+ 169, 169, 190, 190, 190, 190, 190, 190, 0, 0,
+ 0, 169, 169, 190, 169, 169, 169, 169, 169, 169,
+ 169, 0, 190, 169, 190, 190, 169, 169, 169, 191,
+ 191, 191, 191, 191, 0, 191, 191, 191, 0, 0,
+ 0, 191, 0, 0, 134, 134, 134, 134, 0, 0,
+ 0, 134, 191, 134, 191, 191, 191, 191, 191, 134,
+ 134, 134, 134, 191, 191, 191, 191, 191, 191, 0,
+ 0, 0, 134, 134, 191, 134, 134, 134, 134, 134,
+ 134, 134, 0, 191, 134, 191, 191, 134, 134, 134,
+ 0, 25, 27, 28, 29, 30, 31, 166, 32, 33,
+ 34, 0, 0, 0, 35, 0, 0, 36, 37, 38,
+ 39, 0, 0, 0, 40, 41, 0, 42, 43, 44,
+ 45, 46, 0, 0, 0, 0, 47, 48, 49, 50,
+ 51, 52, 0, 0, 0, 44, 0, 54, 44, 44,
+ 44, 0, 44, 0, 44, 44, 57, 44, 58, 59,
+ 0, 117, 0, 0, 0, 0, 0, 0, 0, 135,
+ 161, 44, 163, 164, 0, 0, 44, 0, 0, 78,
+ 0, 0, 78, 0, 0, 356, 357, 358, 0, 360,
+ 0, 171, 172, 0, 0, 173, 78, 78, 174, 175,
+ 176, 0, 0, 44, 0, 55, 0, 0, 65, 67,
+ 53, 117, 60, 0, 68, 64, 376, 63, 0, 0,
+ 0, 0, 0, 378, 0, 0, 0, 380, 0, 0,
+ 0, 78, 0, 0, 212, 44, 66, 0, 44, 0,
+ 388, 389, 117, 0, 0, 55, 0, 0, 65, 67,
+ 53, 0, 60, 0, 68, 64, 0, 63, 0, 0,
+ 0, 0, 0, 61, 161, 162, 163, 164, 0, 0,
+ 0, 0, 0, 0, 0, 0, 66, 0, 0, 0,
+ 0, 0, 0, 0, 106, 171, 172, 106, 0, 173,
+ 0, 0, 174, 175, 176, 26, 0, 0, 56, 0,
+ 0, 106, 106, 61, 0, 0, 106, 0, 0, 55,
+ 0, 0, 65, 67, 53, 0, 60, 0, 68, 64,
+ 0, 63, 0, 0, 0, 160, 0, 0, 0, 0,
+ 0, 161, 162, 163, 164, 26, 106, 0, 56, 0,
+ 66, 0, 0, 0, 0, 0, 0, 165, 167, 168,
+ 169, 170, 171, 172, 0, 0, 173, 0, 0, 174,
+ 175, 176, 0, 0, 0, 0, 0, 61, 44, 44,
+ 44, 44, 44, 44, 0, 44, 44, 44, 0, 0,
+ 0, 44, 0, 117, 44, 44, 44, 44, 0, 117,
+ 0, 44, 44, 0, 44, 44, 44, 44, 44, 26,
+ 0, 0, 56, 44, 44, 44, 44, 44, 44, 0,
+ 78, 78, 78, 78, 44, 0, 0, 78, 0, 0,
+ 0, 0, 0, 44, 0, 44, 44, 0, 0, 115,
+ 28, 29, 30, 31, 93, 32, 33, 34, 78, 78,
+ 0, 35, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 41, 0, 42, 43, 44, 45, 46, 0,
+ 75, 0, 0, 47, 48, 49, 50, 51, 52, 27,
+ 28, 29, 30, 31, 54, 32, 33, 34, 75, 0,
+ 0, 35, 0, 57, 0, 58, 59, 0, 0, 0,
+ 0, 0, 41, 0, 42, 43, 44, 45, 46, 166,
+ 0, 0, 0, 47, 48, 49, 50, 51, 52, 0,
+ 0, 0, 75, 0, 54, 106, 106, 106, 106, 0,
+ 0, 0, 106, 57, 106, 58, 59, 0, 0, 0,
+ 106, 106, 0, 121, 28, 29, 30, 31, 0, 32,
+ 33, 34, 0, 106, 106, 35, 106, 106, 106, 106,
+ 106, 106, 0, 0, 0, 0, 41, 0, 42, 43,
+ 44, 45, 46, 0, 0, 0, 0, 47, 48, 49,
+ 50, 51, 52, 163, 164, 0, 55, 0, 54, 65,
+ 67, 53, 0, 60, 0, 68, 64, 57, 63, 58,
+ 59, 0, 171, 172, 0, 0, 173, 0, 0, 174,
+ 175, 176, 125, 0, 0, 0, 0, 66, 0, 0,
+ 0, 161, 162, 163, 164, 0, 55, 0, 0, 65,
+ 67, 53, 0, 60, 141, 68, 64, 0, 63, 168,
+ 169, 170, 171, 172, 61, 0, 173, 0, 0, 174,
+ 175, 176, 0, 0, 0, 0, 0, 66, 0, 0,
+ 161, 162, 163, 164, 0, 0, 55, 0, 0, 65,
+ 67, 53, 0, 60, 0, 68, 64, 0, 63, 56,
+ 170, 171, 172, 0, 61, 173, 0, 0, 174, 175,
+ 176, 0, 0, 0, 0, 0, 0, 66, 0, 0,
+ 0, 75, 75, 75, 75, 0, 55, 0, 75, 65,
+ 67, 53, 0, 60, 207, 68, 64, 0, 63, 56,
+ 0, 0, 0, 0, 61, 0, 143, 160, 0, 75,
+ 75, 0, 0, 161, 162, 163, 164, 66, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24, 25, 26, 27, 28, 61, 29, 30, 31, 0,
- 52, 0, 32, 62, 64, 50, 0, 57, 288, 65,
- 60, 0, 59, 38, 0, 39, 40, 41, 42, 43,
- 0, 0, 0, 0, 44, 45, 46, 47, 48, 49,
- 53, 63, 51, 0, 0, 0, 0, 0, 0, 0,
- 0, 54, 0, 55, 56, 0, 0, 0, 22, 24,
- 25, 26, 27, 28, 0, 29, 30, 31, 61, 0,
- 0, 32, 95, 0, 0, 95, 0, 0, 0, 0,
- 0, 0, 38, 0, 39, 40, 41, 42, 43, 95,
- 95, 0, 0, 44, 45, 46, 47, 48, 49, 0,
- 0, 51, 0, 53, 0, 0, 0, 0, 0, 0,
- 54, 0, 55, 56, 0, 24, 25, 26, 27, 28,
- 0, 29, 30, 31, 95, 0, 0, 32, 71, 0,
- 0, 71, 0, 0, 0, 0, 0, 0, 38, 0,
- 39, 40, 41, 42, 43, 71, 71, 0, 0, 44,
- 45, 46, 47, 48, 49, 0, 0, 51, 0, 0,
- 0, 0, 0, 0, 0, 0, 54, 0, 55, 56,
- 0, 24, 25, 26, 27, 28, 0, 29, 30, 31,
- 71, 52, 0, 32, 62, 64, 50, 0, 57, 0,
- 65, 60, 0, 59, 38, 0, 39, 40, 41, 42,
- 43, 0, 0, 0, 0, 44, 45, 46, 47, 48,
- 49, 0, 63, 51, 0, 0, 0, 0, 0, 0,
- 0, 0, 54, 0, 55, 56, 0, 0, 0, 0,
- 131, 0, 0, 131, 24, 25, 26, 27, 28, 61,
- 29, 30, 31, 0, 0, 0, 32, 131, 131, 0,
- 0, 0, 131, 0, 0, 0, 0, 38, 0, 39,
- 40, 41, 42, 43, 0, 0, 0, 0, 44, 45,
- 46, 47, 48, 49, 53, 157, 51, 0, 157, 0,
- 131, 0, 131, 0, 0, 54, 0, 55, 56, 0,
- 0, 0, 157, 157, 0, 0, 0, 157, 0, 0,
- 0, 0, 0, 95, 95, 95, 95, 0, 0, 0,
- 95, 0, 131, 0, 0, 0, 0, 0, 143, 0,
- 0, 143, 0, 0, 0, 157, 0, 157, 95, 95,
- 0, 95, 0, 0, 0, 143, 143, 0, 0, 0,
- 143, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 157, 0, 71,
- 71, 71, 71, 0, 116, 0, 71, 116, 0, 0,
- 143, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 116, 116, 0, 71, 71, 116, 0, 0, 0,
+ 167, 168, 169, 170, 171, 172, 0, 0, 173, 56,
+ 0, 174, 175, 176, 61, 0, 55, 0, 0, 65,
+ 67, 53, 0, 60, 218, 68, 64, 0, 63, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 143, 0, 0, 0, 0, 24, 25, 26, 27, 28,
- 0, 29, 30, 31, 116, 0, 116, 32, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 38, 0,
- 39, 40, 41, 42, 43, 0, 0, 0, 0, 44,
- 45, 46, 47, 48, 49, 0, 0, 51, 0, 168,
- 0, 0, 0, 0, 0, 0, 54, 0, 55, 56,
- 0, 131, 131, 131, 131, 0, 0, 0, 131, 0,
- 131, 0, 0, 0, 0, 0, 131, 131, 131, 131,
- 0, 150, 0, 0, 0, 0, 131, 131, 0, 131,
- 131, 131, 131, 131, 131, 131, 0, 0, 131, 0,
- 0, 131, 131, 131, 0, 0, 157, 157, 157, 157,
- 0, 159, 0, 157, 159, 157, 0, 0, 0, 0,
- 0, 157, 157, 157, 157, 0, 0, 0, 159, 159,
- 0, 157, 157, 159, 157, 157, 157, 157, 157, 157,
- 157, 0, 0, 157, 0, 0, 157, 157, 157, 143,
- 143, 143, 143, 0, 0, 0, 143, 0, 143, 0,
- 0, 0, 0, 159, 143, 143, 143, 143, 0, 0,
- 0, 0, 0, 0, 143, 143, 0, 143, 143, 143,
- 143, 143, 143, 143, 0, 0, 143, 0, 0, 143,
- 143, 143, 0, 159, 0, 116, 116, 116, 116, 168,
- 160, 0, 116, 0, 116, 0, 0, 0, 0, 0,
- 116, 116, 116, 116, 0, 0, 0, 160, 160, 0,
- 116, 116, 160, 116, 116, 116, 116, 116, 116, 116,
- 0, 150, 116, 0, 0, 116, 116, 116, 0, 0,
- 0, 0, 0, 145, 0, 152, 153, 154, 155, 0,
- 160, 0, 160, 0, 0, 0, 0, 0, 0, 0,
- 145, 145, 161, 162, 163, 145, 0, 164, 0, 0,
- 165, 166, 167, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 160, 0, 0, 0, 0, 108, 0, 0,
- 108, 0, 0, 145, 0, 145, 0, 0, 0, 0,
- 0, 0, 0, 0, 108, 108, 0, 0, 0, 108,
+ 0, 0, 0, 0, 0, 0, 0, 66, 0, 56,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 145, 0, 0, 0, 0,
+ 27, 28, 29, 30, 31, 0, 32, 33, 34, 0,
+ 0, 0, 35, 0, 61, 0, 0, 0, 0, 0,
+ 0, 0, 0, 41, 0, 42, 43, 44, 45, 46,
+ 0, 0, 0, 0, 47, 48, 49, 50, 51, 52,
+ 27, 28, 29, 30, 31, 54, 32, 33, 34, 56,
+ 0, 0, 35, 0, 57, 0, 58, 59, 0, 0,
+ 0, 0, 0, 41, 0, 42, 43, 44, 45, 46,
+ 0, 0, 0, 0, 47, 48, 49, 50, 51, 52,
+ 27, 28, 29, 30, 31, 54, 32, 33, 34, 0,
+ 0, 0, 35, 0, 57, 0, 58, 59, 0, 0,
+ 0, 0, 0, 41, 0, 42, 43, 44, 45, 46,
+ 0, 0, 0, 0, 47, 48, 49, 50, 51, 52,
+ 27, 28, 29, 30, 31, 54, 32, 33, 34, 0,
+ 0, 0, 35, 0, 57, 0, 58, 59, 0, 0,
+ 0, 0, 0, 41, 0, 42, 43, 44, 45, 46,
+ 0, 0, 0, 0, 47, 48, 49, 50, 51, 52,
+ 0, 0, 0, 55, 0, 54, 65, 67, 53, 0,
+ 60, 255, 68, 64, 57, 63, 58, 59, 0, 0,
+ 27, 28, 29, 30, 31, 0, 32, 33, 34, 0,
+ 0, 0, 35, 0, 66, 0, 0, 0, 0, 0,
+ 0, 0, 0, 41, 0, 42, 43, 44, 45, 46,
+ 0, 0, 0, 0, 47, 48, 49, 50, 51, 52,
+ 0, 61, 0, 55, 0, 54, 65, 67, 53, 0,
+ 60, 263, 68, 64, 57, 63, 58, 59, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 0, 56, 0, 0, 0,
+ 0, 0, 108, 0, 0, 108, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 108,
- 0, 0, 159, 159, 159, 159, 0, 0, 0, 159,
- 0, 159, 0, 0, 0, 0, 0, 159, 159, 159,
- 159, 0, 0, 69, 0, 0, 69, 159, 159, 108,
- 159, 159, 159, 159, 159, 159, 159, 0, 0, 159,
- 69, 69, 159, 159, 159, 69, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 152, 153, 154, 155, 0,
- 0, 0, 0, 0, 0, 0, 107, 0, 0, 107,
- 159, 160, 161, 162, 163, 69, 0, 164, 0, 0,
- 165, 166, 167, 107, 107, 0, 0, 0, 107, 0,
- 0, 160, 160, 160, 160, 0, 0, 0, 160, 0,
- 160, 0, 0, 0, 0, 69, 160, 160, 160, 160,
- 0, 0, 0, 0, 0, 0, 160, 160, 107, 160,
- 160, 160, 160, 160, 160, 160, 0, 0, 160, 0,
- 0, 160, 160, 160, 145, 145, 145, 145, 0, 72,
- 0, 145, 0, 145, 0, 0, 0, 0, 107, 145,
- 145, 145, 145, 0, 0, 0, 72, 72, 0, 145,
- 145, 72, 145, 145, 145, 145, 145, 145, 145, 0,
- 0, 145, 0, 0, 145, 145, 145, 0, 108, 108,
- 108, 108, 0, 146, 0, 108, 146, 108, 0, 72,
- 0, 72, 0, 108, 108, 108, 108, 0, 0, 0,
- 146, 146, 0, 108, 108, 146, 108, 108, 108, 108,
- 108, 108, 108, 0, 0, 108, 0, 0, 108, 108,
- 108, 72, 0, 0, 0, 0, 159, 90, 90, 159,
- 0, 0, 0, 0, 0, 146, 0, 0, 0, 103,
- 0, 0, 0, 159, 159, 111, 90, 119, 159, 0,
- 0, 0, 90, 0, 69, 69, 69, 69, 0, 0,
- 0, 69, 0, 69, 90, 90, 90, 90, 0, 69,
- 69, 69, 69, 0, 0, 0, 0, 0, 159, 69,
- 69, 0, 69, 69, 69, 69, 69, 69, 69, 0,
- 0, 69, 0, 0, 69, 69, 69, 107, 107, 107,
- 107, 0, 114, 0, 107, 114, 107, 0, 0, 111,
- 0, 0, 107, 107, 107, 107, 0, 0, 0, 114,
- 114, 0, 107, 107, 114, 107, 107, 107, 107, 107,
- 107, 107, 0, 0, 107, 0, 0, 107, 107, 107,
- 0, 0, 0, 0, 0, 121, 0, 0, 121, 0,
- 0, 0, 0, 0, 114, 0, 0, 0, 0, 0,
- 0, 0, 121, 121, 0, 0, 0, 121, 0, 237,
- 72, 72, 72, 72, 0, 0, 0, 72, 0, 72,
- 0, 0, 0, 0, 0, 72, 72, 72, 72, 0,
- 0, 0, 0, 266, 0, 72, 72, 121, 72, 72,
- 72, 72, 72, 72, 72, 0, 0, 72, 0, 0,
- 72, 72, 72, 0, 146, 146, 146, 146, 0, 105,
- 0, 146, 105, 146, 0, 0, 0, 0, 0, 146,
- 146, 146, 146, 0, 0, 0, 105, 105, 0, 146,
- 146, 105, 146, 146, 146, 146, 146, 146, 146, 0,
- 0, 146, 0, 0, 146, 146, 146, 159, 159, 159,
- 159, 0, 99, 0, 159, 99, 159, 0, 0, 0,
- 0, 105, 159, 159, 159, 159, 0, 0, 0, 99,
- 99, 0, 159, 159, 99, 159, 159, 159, 159, 159,
- 159, 159, 0, 0, 159, 0, 0, 159, 159, 159,
- 100, 0, 0, 100, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 99, 0, 0, 100, 100, 0,
- 0, 0, 100, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 114, 114, 114, 114, 0, 101, 0,
- 114, 101, 114, 0, 0, 0, 0, 0, 114, 114,
- 114, 114, 100, 0, 0, 101, 101, 0, 114, 114,
- 101, 114, 114, 114, 114, 114, 114, 114, 0, 0,
- 114, 0, 0, 114, 114, 114, 121, 121, 121, 121,
- 0, 97, 0, 121, 97, 121, 0, 0, 0, 0,
- 101, 121, 121, 121, 121, 0, 0, 0, 97, 97,
- 0, 121, 121, 97, 121, 121, 121, 121, 121, 121,
- 121, 0, 0, 121, 0, 0, 121, 121, 121, 98,
- 0, 0, 98, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 97, 0, 0, 98, 98, 0, 0,
- 0, 98, 0, 0, 0, 0, 0, 0, 0, 0,
- 105, 105, 105, 105, 0, 96, 0, 105, 96, 105,
- 0, 0, 0, 0, 0, 105, 105, 105, 105, 0,
- 0, 98, 96, 96, 0, 105, 105, 96, 105, 105,
- 105, 105, 105, 105, 105, 0, 0, 105, 0, 0,
- 0, 0, 0, 99, 99, 99, 99, 0, 84, 0,
- 99, 84, 99, 0, 0, 0, 0, 96, 99, 99,
- 99, 99, 0, 0, 0, 84, 84, 0, 99, 99,
- 84, 99, 99, 99, 99, 99, 99, 99, 0, 0,
- 0, 100, 100, 100, 100, 0, 85, 0, 100, 85,
- 100, 0, 0, 0, 0, 0, 100, 100, 100, 100,
- 84, 0, 0, 85, 85, 0, 100, 100, 85, 100,
- 100, 100, 100, 100, 100, 100, 0, 0, 0, 101,
- 101, 101, 101, 0, 86, 0, 101, 86, 101, 0,
- 0, 0, 0, 0, 101, 101, 101, 101, 85, 0,
- 0, 86, 86, 0, 101, 101, 86, 101, 101, 101,
- 101, 101, 101, 101, 0, 0, 0, 0, 0, 0,
- 0, 0, 97, 97, 97, 97, 0, 87, 0, 97,
- 87, 97, 0, 0, 0, 0, 86, 97, 97, 97,
- 97, 0, 0, 0, 87, 87, 0, 97, 97, 87,
- 97, 97, 97, 97, 97, 97, 97, 0, 0, 0,
- 98, 98, 98, 98, 0, 148, 0, 98, 148, 98,
- 0, 0, 0, 0, 0, 98, 98, 98, 98, 87,
- 0, 0, 148, 148, 0, 98, 98, 148, 98, 98,
- 98, 98, 98, 98, 98, 0, 96, 96, 96, 96,
- 0, 135, 0, 96, 135, 96, 0, 0, 0, 0,
- 0, 96, 96, 96, 96, 0, 0, 148, 135, 135,
- 0, 96, 96, 135, 96, 96, 96, 96, 96, 96,
- 96, 0, 0, 0, 0, 0, 0, 0, 0, 84,
- 84, 84, 84, 0, 106, 0, 84, 106, 84, 0,
- 0, 0, 0, 135, 84, 84, 84, 84, 0, 0,
- 0, 106, 106, 0, 84, 84, 106, 84, 84, 84,
- 84, 84, 84, 84, 0, 0, 0, 85, 85, 85,
- 85, 0, 91, 0, 85, 91, 85, 0, 0, 0,
- 0, 0, 85, 85, 85, 85, 106, 0, 0, 91,
- 91, 0, 85, 85, 91, 85, 85, 85, 85, 85,
- 85, 0, 0, 0, 0, 86, 86, 86, 86, 0,
- 93, 0, 86, 93, 86, 0, 0, 0, 0, 0,
- 86, 86, 0, 86, 91, 0, 0, 93, 93, 0,
- 86, 86, 93, 86, 86, 86, 86, 86, 86, 0,
- 168, 0, 0, 0, 0, 0, 0, 0, 87, 87,
- 87, 87, 0, 94, 0, 87, 94, 87, 0, 0,
- 0, 0, 93, 87, 87, 0, 0, 0, 0, 0,
- 94, 94, 150, 87, 87, 94, 87, 87, 87, 87,
- 87, 87, 0, 0, 0, 0, 148, 148, 148, 148,
- 0, 92, 0, 148, 92, 148, 0, 0, 0, 0,
- 0, 148, 148, 144, 0, 94, 144, 0, 92, 92,
- 0, 148, 148, 92, 148, 148, 148, 148, 148, 0,
- 144, 144, 135, 135, 135, 135, 0, 0, 0, 135,
- 0, 135, 0, 0, 0, 0, 0, 135, 135, 0,
- 0, 0, 0, 92, 0, 0, 83, 135, 135, 83,
- 135, 135, 135, 135, 135, 144, 0, 0, 0, 70,
- 0, 0, 70, 83, 83, 106, 106, 106, 106, 0,
- 0, 0, 106, 0, 106, 0, 70, 70, 0, 0,
- 106, 106, 0, 0, 0, 0, 157, 0, 0, 0,
- 106, 106, 0, 106, 106, 106, 106, 106, 83, 0,
- 0, 0, 0, 91, 91, 91, 91, 0, 0, 0,
- 91, 70, 91, 0, 168, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 91, 91,
- 0, 91, 91, 91, 91, 0, 152, 153, 154, 155,
- 0, 93, 93, 93, 93, 0, 150, 0, 93, 0,
- 93, 0, 160, 161, 162, 163, 0, 0, 164, 0,
- 0, 165, 166, 167, 0, 0, 93, 93, 0, 93,
- 93, 93, 157, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 94, 94, 94, 94, 0, 0,
- 0, 94, 0, 94, 0, 0, 0, 0, 0, 0,
- 168, 0, 0, 0, 0, 0, 0, 0, 0, 94,
- 94, 0, 94, 94, 0, 0, 0, 0, 0, 0,
- 0, 0, 92, 92, 92, 92, 0, 0, 0, 92,
- 0, 0, 150, 0, 144, 144, 144, 144, 0, 0,
- 0, 144, 0, 0, 0, 0, 94, 92, 92, 0,
- 92, 0, 0, 0, 104, 0, 0, 0, 109, 144,
- 144, 118, 0, 0, 0, 0, 0, 0, 125, 126,
- 127, 128, 129, 0, 0, 132, 133, 83, 83, 83,
- 83, 0, 140, 0, 83, 0, 0, 0, 0, 0,
- 70, 70, 70, 70, 0, 0, 0, 70, 0, 0,
- 0, 0, 83, 83, 151, 0, 0, 0, 0, 184,
- 152, 153, 154, 155, 0, 70, 70, 0, 0, 0,
- 0, 0, 0, 156, 158, 159, 160, 161, 162, 163,
- 0, 0, 164, 0, 0, 165, 166, 167, 0, 0,
+ 108, 61, 55, 0, 108, 65, 67, 53, 0, 60,
+ 0, 68, 64, 0, 63, 0, 0, 0, 0, 0,
+ 161, 162, 163, 164, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 66, 108, 0, 56, 167, 168, 169,
+ 170, 171, 172, 0, 0, 173, 0, 0, 174, 175,
+ 176, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61, 0, 55, 0, 0, 65, 67, 53, 0, 60,
+ 296, 68, 64, 0, 63, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 66, 0, 56, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 27, 28, 29,
+ 30, 31, 0, 32, 33, 34, 0, 0, 0, 35,
+ 61, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 41, 0, 42, 43, 44, 45, 46, 0, 0, 0,
+ 0, 47, 48, 49, 50, 51, 52, 0, 0, 0,
+ 0, 0, 54, 0, 0, 56, 0, 0, 0, 0,
+ 0, 57, 0, 58, 59, 0, 0, 27, 28, 29,
+ 30, 31, 0, 32, 33, 34, 0, 55, 0, 35,
+ 65, 67, 53, 0, 60, 298, 68, 64, 0, 63,
+ 41, 0, 42, 43, 44, 45, 46, 0, 0, 0,
+ 0, 47, 48, 49, 50, 51, 52, 0, 66, 0,
+ 0, 0, 54, 108, 108, 108, 108, 0, 0, 0,
+ 108, 57, 108, 58, 59, 25, 27, 28, 29, 30,
+ 31, 0, 32, 33, 34, 61, 0, 0, 35, 0,
+ 0, 108, 108, 0, 108, 108, 108, 108, 108, 41,
+ 0, 42, 43, 44, 45, 46, 0, 0, 0, 0,
+ 47, 48, 49, 50, 51, 52, 0, 0, 0, 55,
+ 56, 54, 65, 67, 53, 0, 60, 307, 68, 64,
+ 57, 63, 58, 59, 0, 0, 27, 28, 29, 30,
+ 31, 0, 32, 33, 34, 0, 0, 0, 35, 0,
+ 66, 0, 0, 0, 0, 0, 0, 0, 0, 41,
+ 0, 42, 43, 44, 45, 46, 0, 0, 0, 0,
+ 47, 48, 49, 50, 51, 52, 0, 61, 0, 55,
+ 0, 54, 65, 67, 53, 0, 60, 0, 68, 64,
+ 57, 63, 58, 59, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 95, 95,
+ 66, 0, 56, 0, 0, 0, 0, 0, 158, 0,
+ 108, 158, 0, 0, 0, 0, 116, 95, 124, 0,
+ 0, 0, 130, 95, 0, 158, 158, 61, 0, 0,
+ 158, 0, 0, 0, 0, 95, 95, 95, 95, 0,
+ 0, 27, 28, 29, 30, 31, 0, 32, 33, 34,
+ 0, 0, 0, 35, 0, 74, 0, 0, 74, 0,
+ 158, 0, 56, 0, 41, 0, 42, 43, 44, 45,
+ 46, 178, 0, 74, 178, 47, 48, 49, 50, 51,
+ 52, 0, 116, 0, 0, 0, 54, 0, 178, 178,
+ 0, 0, 0, 178, 0, 57, 0, 58, 59, 0,
+ 0, 0, 0, 0, 0, 0, 0, 74, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 178, 0, 139, 0, 0, 139, 0,
+ 0, 0, 0, 27, 28, 29, 30, 31, 0, 32,
+ 33, 34, 139, 139, 0, 35, 252, 139, 0, 0,
+ 0, 0, 0, 0, 0, 0, 41, 0, 42, 43,
+ 44, 45, 46, 0, 0, 0, 0, 47, 48, 49,
+ 50, 51, 52, 284, 0, 0, 0, 139, 54, 0,
+ 0, 0, 0, 0, 0, 134, 0, 57, 134, 58,
+ 59, 0, 0, 27, 28, 29, 30, 31, 0, 32,
+ 33, 34, 134, 134, 0, 35, 0, 134, 0, 0,
+ 0, 0, 0, 0, 0, 0, 41, 0, 42, 43,
+ 44, 45, 46, 0, 0, 0, 0, 47, 48, 49,
+ 50, 51, 52, 0, 0, 0, 0, 134, 54, 158,
+ 158, 158, 158, 0, 0, 0, 158, 57, 158, 58,
+ 59, 0, 0, 0, 158, 158, 158, 158, 0, 0,
+ 0, 0, 0, 137, 0, 0, 137, 158, 158, 0,
+ 158, 158, 158, 158, 158, 158, 158, 0, 0, 158,
+ 137, 137, 158, 158, 158, 137, 74, 74, 74, 74,
+ 0, 0, 0, 74, 0, 0, 0, 0, 0, 0,
+ 0, 0, 178, 178, 178, 178, 0, 0, 0, 178,
+ 135, 178, 0, 135, 74, 137, 0, 178, 178, 178,
+ 178, 0, 0, 0, 0, 0, 0, 135, 135, 0,
+ 178, 178, 135, 178, 178, 178, 178, 178, 178, 178,
+ 0, 0, 178, 0, 0, 178, 178, 178, 0, 0,
+ 0, 0, 0, 0, 0, 0, 139, 139, 139, 139,
+ 0, 145, 135, 139, 145, 139, 0, 0, 0, 0,
+ 0, 139, 139, 139, 139, 0, 0, 0, 145, 145,
+ 0, 0, 0, 145, 139, 139, 0, 139, 139, 139,
+ 139, 139, 139, 139, 0, 0, 139, 0, 0, 139,
+ 139, 139, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 156, 145, 0, 156, 134, 134, 134, 134,
+ 0, 169, 0, 134, 169, 134, 0, 0, 0, 156,
+ 156, 134, 134, 134, 134, 0, 0, 0, 169, 169,
+ 0, 0, 0, 169, 134, 134, 0, 134, 134, 134,
+ 134, 134, 134, 134, 0, 0, 134, 0, 0, 134,
+ 134, 134, 0, 0, 156, 0, 0, 172, 0, 0,
+ 172, 0, 0, 169, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 172, 172, 0, 0, 0, 172,
+ 0, 0, 0, 0, 137, 137, 137, 137, 0, 0,
+ 0, 137, 0, 137, 0, 0, 0, 0, 0, 137,
+ 137, 137, 137, 0, 0, 0, 0, 0, 0, 172,
+ 0, 0, 137, 137, 0, 137, 137, 137, 137, 137,
+ 137, 137, 0, 0, 137, 0, 0, 137, 137, 137,
+ 0, 135, 135, 135, 135, 0, 128, 0, 135, 128,
+ 135, 0, 0, 0, 0, 0, 135, 135, 135, 135,
+ 0, 0, 0, 128, 128, 0, 0, 0, 128, 135,
+ 135, 0, 135, 135, 135, 135, 135, 135, 135, 0,
+ 0, 135, 0, 0, 135, 135, 135, 0, 0, 0,
+ 0, 0, 145, 145, 145, 145, 0, 76, 128, 145,
+ 76, 145, 0, 0, 0, 0, 0, 145, 145, 145,
+ 145, 0, 0, 0, 76, 76, 0, 0, 0, 76,
+ 145, 145, 0, 145, 145, 145, 145, 145, 145, 145,
+ 0, 0, 145, 0, 0, 145, 145, 145, 0, 0,
+ 0, 0, 0, 156, 156, 156, 156, 0, 0, 76,
+ 156, 0, 169, 169, 169, 169, 0, 66, 0, 169,
+ 66, 169, 0, 0, 0, 0, 0, 169, 169, 169,
+ 169, 156, 156, 0, 66, 66, 0, 0, 0, 66,
+ 169, 169, 0, 169, 169, 169, 169, 169, 169, 169,
+ 0, 0, 169, 0, 0, 169, 169, 169, 172, 172,
+ 172, 172, 0, 127, 0, 172, 127, 172, 0, 66,
+ 0, 0, 0, 172, 172, 172, 172, 0, 0, 0,
+ 127, 127, 0, 0, 0, 127, 172, 172, 0, 172,
+ 172, 172, 172, 172, 172, 172, 0, 0, 172, 0,
+ 0, 172, 172, 172, 0, 0, 0, 0, 0, 82,
+ 0, 0, 82, 0, 0, 127, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 82, 82, 0, 0,
+ 0, 82, 114, 0, 0, 114, 0, 128, 128, 128,
+ 128, 0, 0, 0, 128, 0, 128, 0, 0, 114,
+ 114, 0, 128, 128, 128, 128, 0, 0, 0, 0,
+ 0, 82, 0, 0, 0, 128, 128, 0, 128, 128,
+ 128, 128, 128, 128, 128, 0, 0, 128, 0, 0,
+ 128, 128, 128, 102, 114, 0, 102, 0, 76, 76,
+ 76, 76, 179, 0, 0, 76, 0, 76, 0, 0,
+ 102, 102, 0, 76, 76, 76, 76, 0, 0, 179,
+ 179, 0, 0, 0, 179, 0, 76, 76, 0, 76,
+ 76, 76, 76, 76, 76, 76, 0, 0, 76, 0,
+ 0, 76, 76, 76, 0, 102, 0, 0, 0, 0,
+ 0, 0, 0, 0, 179, 0, 0, 0, 66, 66,
+ 66, 66, 157, 0, 0, 66, 0, 66, 0, 0,
+ 0, 0, 0, 66, 66, 66, 66, 0, 0, 157,
+ 157, 0, 0, 0, 157, 0, 66, 66, 0, 66,
+ 66, 66, 66, 66, 66, 66, 0, 0, 66, 0,
+ 0, 66, 66, 66, 127, 127, 127, 127, 79, 0,
+ 0, 127, 0, 127, 157, 0, 0, 0, 0, 127,
+ 127, 127, 127, 0, 0, 79, 79, 0, 0, 0,
+ 79, 0, 127, 127, 0, 127, 127, 127, 127, 127,
+ 127, 127, 0, 0, 127, 0, 0, 127, 127, 127,
+ 82, 82, 82, 82, 0, 0, 0, 82, 0, 82,
+ 79, 0, 0, 0, 0, 82, 82, 82, 82, 0,
+ 0, 0, 0, 114, 114, 114, 114, 0, 82, 82,
+ 114, 82, 82, 82, 82, 82, 82, 82, 0, 123,
+ 82, 0, 123, 82, 82, 82, 0, 0, 0, 0,
+ 0, 114, 114, 0, 114, 0, 123, 123, 0, 0,
+ 0, 123, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 102, 102, 102, 102, 0, 0,
+ 0, 102, 0, 179, 179, 179, 179, 0, 0, 0,
+ 179, 123, 179, 0, 0, 0, 0, 0, 179, 179,
+ 179, 179, 102, 102, 0, 0, 0, 0, 0, 0,
+ 0, 179, 179, 0, 179, 179, 179, 179, 179, 179,
+ 179, 0, 0, 179, 0, 0, 179, 179, 179, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 219, 220, 221,
- 222, 223, 224, 225, 226, 227, 228, 229, 230, 231,
- 232, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 151, 0, 247, 0, 0, 0, 152, 153, 154, 155,
+ 0, 0, 0, 157, 157, 157, 157, 0, 0, 0,
+ 157, 124, 157, 0, 124, 0, 0, 0, 157, 157,
+ 157, 157, 0, 0, 0, 0, 0, 0, 124, 124,
+ 0, 157, 157, 124, 157, 157, 157, 157, 157, 157,
+ 157, 0, 0, 157, 0, 0, 157, 157, 157, 79,
+ 79, 79, 79, 0, 118, 0, 79, 118, 79, 0,
+ 0, 0, 0, 124, 79, 79, 79, 79, 0, 0,
+ 0, 118, 118, 0, 0, 0, 118, 79, 79, 0,
+ 79, 79, 79, 79, 79, 79, 79, 99, 0, 79,
+ 0, 0, 79, 79, 79, 109, 0, 0, 119, 114,
+ 0, 119, 123, 0, 0, 128, 118, 0, 0, 136,
+ 137, 138, 139, 140, 0, 119, 119, 145, 146, 0,
+ 119, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 123, 123, 123, 123, 0, 0, 0, 123, 120, 123,
+ 0, 120, 0, 0, 0, 123, 123, 123, 123, 0,
+ 119, 0, 196, 0, 0, 120, 120, 0, 123, 123,
+ 120, 123, 123, 123, 123, 123, 123, 123, 0, 0,
+ 123, 0, 0, 0, 0, 0, 116, 0, 0, 116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 158, 159, 160, 161, 162, 163, 0, 0, 164, 0,
- 0, 165, 166, 167, 0, 0, 0, 0, 0, 0,
+ 120, 0, 0, 116, 116, 0, 0, 0, 116, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247, 116, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 265, 124, 124, 124, 124, 0, 117, 0, 124,
+ 117, 124, 0, 0, 0, 0, 0, 124, 124, 124,
+ 124, 0, 0, 0, 117, 117, 0, 0, 0, 117,
+ 124, 124, 0, 124, 124, 124, 124, 124, 124, 124,
+ 0, 0, 124, 0, 0, 118, 118, 118, 118, 0,
+ 115, 0, 118, 115, 118, 0, 0, 0, 0, 117,
+ 118, 118, 118, 118, 0, 0, 0, 115, 115, 0,
+ 0, 0, 115, 118, 118, 0, 118, 118, 118, 118,
+ 118, 118, 118, 0, 0, 0, 327, 0, 0, 119,
+ 119, 119, 119, 0, 0, 0, 119, 77, 119, 0,
+ 77, 0, 115, 0, 119, 119, 119, 119, 0, 0,
+ 0, 0, 0, 0, 77, 77, 0, 119, 119, 343,
+ 119, 119, 119, 119, 119, 119, 119, 0, 0, 120,
+ 120, 120, 120, 0, 103, 0, 120, 103, 120, 0,
+ 0, 0, 0, 0, 120, 120, 120, 120, 0, 77,
+ 0, 103, 103, 0, 0, 0, 103, 120, 120, 0,
+ 120, 120, 120, 120, 120, 120, 120, 116, 116, 116,
+ 116, 0, 104, 0, 116, 104, 116, 0, 0, 0,
+ 0, 0, 116, 116, 116, 116, 103, 0, 0, 104,
+ 104, 0, 0, 0, 104, 116, 116, 0, 116, 116,
+ 116, 116, 116, 116, 116, 0, 0, 0, 0, 105,
+ 0, 0, 105, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 104, 0, 105, 105, 0, 0,
+ 0, 105, 0, 0, 0, 0, 0, 0, 117, 117,
+ 117, 117, 0, 0, 0, 117, 0, 117, 0, 0,
+ 0, 0, 0, 117, 117, 117, 117, 305, 0, 0,
+ 0, 105, 166, 0, 0, 0, 117, 117, 0, 117,
+ 117, 117, 117, 117, 117, 117, 0, 0, 0, 0,
+ 0, 115, 115, 115, 115, 0, 161, 0, 115, 161,
+ 115, 0, 0, 0, 0, 0, 115, 115, 115, 115,
+ 0, 0, 0, 161, 161, 0, 0, 0, 161, 115,
+ 115, 0, 115, 115, 115, 115, 115, 115, 115, 0,
+ 0, 0, 0, 160, 0, 0, 160, 0, 77, 77,
+ 77, 77, 0, 149, 0, 77, 149, 0, 161, 0,
+ 160, 160, 0, 0, 0, 160, 0, 0, 0, 0,
+ 149, 149, 0, 0, 0, 149, 77, 77, 0, 0,
+ 0, 0, 0, 0, 0, 103, 103, 103, 103, 0,
+ 126, 0, 103, 126, 103, 160, 0, 0, 0, 0,
+ 103, 103, 103, 103, 0, 149, 0, 126, 126, 0,
+ 0, 0, 126, 103, 103, 0, 103, 103, 103, 103,
+ 103, 103, 103, 104, 104, 104, 104, 0, 107, 0,
+ 104, 107, 104, 0, 0, 0, 0, 0, 104, 104,
+ 104, 104, 126, 0, 0, 107, 107, 0, 0, 0,
+ 107, 104, 104, 0, 104, 104, 104, 104, 104, 104,
+ 105, 105, 105, 105, 0, 109, 0, 105, 109, 105,
+ 0, 0, 0, 0, 0, 105, 105, 0, 105, 0,
+ 107, 110, 109, 109, 110, 0, 0, 109, 105, 105,
+ 0, 105, 105, 105, 105, 105, 105, 0, 110, 110,
+ 160, 0, 0, 110, 0, 0, 161, 162, 163, 164,
+ 0, 0, 0, 0, 0, 0, 0, 109, 0, 0,
+ 0, 0, 165, 167, 168, 169, 170, 171, 172, 0,
+ 0, 173, 0, 110, 174, 175, 176, 161, 161, 161,
+ 161, 0, 112, 0, 161, 112, 161, 0, 0, 0,
+ 0, 0, 161, 161, 0, 0, 0, 0, 0, 112,
+ 112, 0, 0, 0, 112, 161, 161, 0, 161, 161,
+ 161, 161, 161, 0, 160, 160, 160, 160, 0, 113,
+ 0, 160, 113, 160, 149, 149, 149, 149, 0, 160,
+ 160, 149, 0, 149, 112, 0, 113, 113, 0, 149,
+ 149, 113, 160, 160, 0, 160, 160, 160, 160, 160,
+ 0, 0, 149, 149, 0, 149, 149, 149, 149, 149,
+ 0, 126, 126, 126, 126, 0, 0, 0, 126, 0,
+ 126, 113, 0, 0, 0, 0, 126, 126, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 126,
+ 126, 0, 126, 126, 126, 126, 126, 0, 0, 107,
+ 107, 107, 107, 0, 0, 0, 107, 0, 107, 0,
+ 0, 0, 0, 0, 0, 107, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 107, 107, 0,
+ 107, 107, 107, 107, 107, 0, 109, 109, 109, 109,
+ 0, 0, 0, 109, 0, 109, 0, 0, 0, 0,
+ 0, 0, 110, 110, 110, 110, 0, 0, 0, 110,
+ 0, 110, 0, 0, 109, 109, 0, 109, 109, 109,
+ 109, 109, 0, 0, 0, 0, 0, 0, 0, 0,
+ 110, 110, 0, 110, 110, 110, 110, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 301, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 112, 112, 112, 112, 0, 0, 0,
+ 112, 0, 112, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 112, 112, 0, 112, 112, 112, 0, 0, 0,
+ 113, 113, 113, 113, 0, 0, 0, 113, 0, 113,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 317,
+ 0, 0, 0, 0, 0, 0, 0, 0, 113, 113,
+ 0, 113, 113,
};
-short yycheck[] = { 13,
- 41, 36, 86, 41, 91, 40, 44, 59, 91, 59,
- 59, 93, 36, 183, 59, 59, 41, 91, 41, 331,
- 58, 59, 91, 40, 257, 63, 41, 297, 298, 257,
- 41, 59, 46, 40, 43, 41, 123, 276, 277, 257,
- 123, 41, 51, 57, 41, 91, 41, 61, 59, 123,
- 362, 44, 40, 59, 123, 93, 328, 329, 0, 40,
- 192, 333, 41, 40, 40, 36, 40, 40, 40, 40,
- 59, 278, 59, 123, 91, 123, 122, 349, 123, 40,
- 59, 353, 91, 123, 97, 98, 99, 100, 101, 102,
- 59, 33, 106, 107, 36, 37, 38, 59, 40, 123,
- 42, 43, 260, 45, 44, 114, 123, 59, 41, 41,
- 41, 257, 40, 122, 40, 125, 40, 59, 41, 41,
- 91, 291, 64, 91, 41, 41, 59, 59, 59, 143,
- 144, 145, 146, 147, 148, 149, 150, 59, 257, 36,
- 91, 273, 59, 93, 91, 41, 298, 125, 44, 91,
- 40, 40, 123, 0, 168, 169, 170, 171, 172, 173,
- 174, 41, 58, 59, 41, 41, 41, 63, 93, 183,
- 41, 41, 123, 187, 188, 307, 190, 91, 192, 125,
- 193, 123, 93, 125, 126, 199, 33, 201, 202, 36,
- 37, 38, 206, 40, 59, 42, 43, 93, 45, 266,
- 267, 268, 59, 270, 271, 251, 289, 290, 257, 123,
- 256, 41, 59, 125, 123, 297, 298, 64, 125, 233,
- 352, 235, 236, 306, 125, 93, 309, 314, 41, 312,
- 313, 314, 125, 257, 272, 273, 274, 275, 262, 41,
- 41, 279, 251, 281, 91, 297, 298, 256, 0, 287,
- 288, 289, 290, 297, 298, 339, 297, 298, 59, 297,
- 298, 296, 300, 301, 302, 303, 304, 305, 306, 59,
- 284, 309, 297, 298, 297, 298, 123, 291, 125, 126,
- 40, 33, 297, 298, 36, 37, 38, 258, 40, 93,
- 42, 43, 93, 45, 93, 309, 41, 297, 298, 41,
- 297, 298, 297, 298, 297, 298, 123, 59, 297, 298,
- 297, 298, 64, 125, 256, 257, 258, 259, 260, 261,
- 123, 263, 264, 265, 266, 267, 268, 269, 270, 271,
- 272, 273, 274, 275, 348, 297, 298, 279, 280, 91,
- 282, 283, 284, 285, 286, 297, 298, 297, 298, 291,
- 292, 293, 294, 295, 296, 306, 91, 299, 309, 41,
- 41, 312, 313, 314, 59, 41, 308, 59, 310, 311,
- 41, 123, 297, 298, 126, 59, 272, 273, 274, 275,
- 41, 8, 32, 279, 13, 281, 297, 298, 123, 144,
- 348, 287, 288, 41, 309, 309, 44, 190, 312, 313,
- 314, 297, 298, 96, 300, 301, 302, 303, 304, 256,
- 257, 258, 259, 260, 261, 63, 263, 264, 265, 266,
- 267, 268, 269, 270, 271, 272, 273, 274, 275, 297,
- 298, -1, 279, 280, -1, 282, 283, 284, 285, 286,
- -1, -1, -1, 91, 291, 292, 293, 294, 295, 296,
- 125, -1, 299, 91, 266, 267, 268, -1, 270, 271,
- -1, 308, -1, 310, 311, -1, 41, -1, -1, 44,
- -1, 272, 273, 274, 275, 123, -1, -1, 279, -1,
- -1, -1, -1, 58, 59, 123, -1, -1, 63, -1,
- -1, -1, -1, 297, 298, -1, 297, 298, 297, 298,
- -1, -1, -1, -1, 256, 257, 258, 259, 260, 261,
- -1, 263, 264, 265, -1, -1, 91, 269, 93, -1,
- 272, 273, 274, 275, -1, -1, -1, 279, 280, -1,
- 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
- 292, 293, 294, 295, 296, -1, -1, 299, 123, -1,
- -1, -1, 287, 288, 289, 290, 308, 33, 310, 311,
- 36, 37, 38, -1, 40, 41, 42, 43, 44, 45,
- 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
- -1, -1, 58, 59, -1, -1, -1, 63, 64, -1,
- -1, 266, 267, 268, -1, 270, 271, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 272, 273, 274, 275,
- -1, -1, -1, 279, -1, 91, -1, 93, 33, -1,
- -1, 36, 37, 38, -1, 40, 41, 42, 43, 44,
- 45, 297, 298, 281, -1, -1, -1, -1, -1, 287,
- 288, 289, 290, 58, 59, -1, -1, 123, 63, 64,
- 126, 289, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, -1, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, 33, 93, -1,
- 36, 37, 38, -1, 40, -1, 42, 43, -1, 45,
- -1, -1, -1, -1, -1, -1, -1, 272, 273, 274,
- 275, -1, -1, 59, 279, -1, 281, -1, 64, -1,
- -1, 126, 287, 288, 289, 290, 304, 305, 306, -1,
- 308, -1, 297, 298, -1, 300, 301, 302, 303, 304,
- 305, 306, -1, -1, 309, 91, -1, 312, 313, 314,
- -1, -1, 41, -1, -1, 44, -1, 335, -1, -1,
- -1, -1, -1, -1, 342, -1, -1, -1, 346, -1,
- 59, -1, -1, 91, -1, -1, -1, 123, -1, -1,
- 126, 359, 360, -1, -1, -1, -1, -1, -1, -1,
- -1, 257, 258, 259, 260, 261, -1, 263, 264, 265,
- -1, -1, -1, 269, 93, 123, 272, 273, 274, 275,
- -1, -1, -1, 279, 280, 281, 282, 283, 284, 285,
- 286, 287, 288, 289, 290, 291, 292, 293, 294, 295,
- 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
- 306, -1, 308, 309, 310, 311, 312, 313, 314, -1,
- -1, -1, 257, 258, 259, 260, 261, -1, 263, 264,
+static short yycheck[] = { 15,
+ 36, 91, 41, 36, 40, 59, 59, 41, 195, 41,
+ 59, 59, 41, 59, 59, 44, 59, 123, 93, 36,
+ 93, 358, 59, 40, 96, 91, 40, 91, 41, 58,
+ 59, 41, 41, 49, 63, 59, 41, 59, 41, 257,
+ 204, 40, 192, 90, 60, 61, 59, 41, 198, 257,
+ 59, 15, 389, 41, 101, 127, 59, 123, 41, 123,
+ 289, 290, 300, 301, 93, 59, 266, 267, 268, 41,
+ 270, 271, 41, 41, 91, 123, 41, 91, 123, 44,
+ 309, 45, 41, 312, 48, 93, 315, 316, 317, 44,
+ 123, 59, 91, 58, 59, 111, 112, 297, 63, 123,
+ 59, 123, 59, 36, 37, 40, 123, 40, 40, 123,
+ 257, 41, 59, 129, 0, 102, 103, 104, 105, 106,
+ 107, 85, 40, 310, 123, 278, 41, 291, 93, 59,
+ 312, 64, 40, 315, 316, 317, 100, 153, 154, 155,
+ 156, 157, 158, 159, 59, 276, 277, 33, 93, 40,
+ 36, 37, 38, 93, 40, 93, 42, 43, 40, 45,
+ 40, 177, 178, 179, 180, 181, 182, 183, 184, 185,
+ 334, 8, 9, 59, 0, 40, 40, 123, 64, 195,
+ 59, 44, 123, 199, 200, 40, 202, 151, 204, 260,
+ 257, 40, 298, 41, 93, 211, 268, 213, 214, 40,
+ 125, 298, 274, 257, 317, 91, 222, 33, 36, 298,
+ 36, 37, 38, 91, 40, 379, 42, 43, 205, 45,
+ 41, 125, 257, 91, 257, 300, 301, 300, 301, 262,
+ 260, 301, 248, 59, 250, 251, 40, 123, 64, 125,
+ 126, 258, 0, 272, 273, 274, 275, 300, 301, 260,
+ 279, 300, 301, 298, 300, 301, 41, 300, 301, 41,
+ 296, 300, 301, 300, 301, 91, 300, 301, 300, 301,
+ 41, 300, 301, 41, 303, 33, 366, 41, 36, 37,
+ 38, 40, 40, 59, 42, 43, 41, 45, 304, 125,
+ 300, 301, 300, 301, 310, 300, 301, 123, 125, 125,
+ 126, 59, 125, 267, 123, 269, 64, 272, 273, 274,
+ 275, 275, 300, 301, 279, 125, 281, 300, 301, 59,
+ 336, 41, 287, 288, 289, 290, 125, 41, 300, 301,
+ 44, 300, 301, 91, 41, 300, 301, 41, 303, 304,
+ 305, 306, 307, 308, 309, 300, 301, 312, 59, 63,
+ 315, 316, 317, 300, 301, 300, 301, 40, 123, 375,
+ 300, 301, 300, 301, 41, 123, 41, 41, 126, 123,
+ 256, 257, 258, 259, 260, 261, 41, 263, 264, 265,
+ 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
+ 41, 59, 41, 279, 280, 289, 282, 283, 284, 285,
+ 286, 300, 301, 59, 41, 291, 292, 293, 294, 295,
+ 296, 297, 63, 59, 41, 309, 302, 35, 312, 52,
+ 52, 315, 316, 317, 15, 311, 154, 313, 314, 336,
+ 256, 257, 258, 259, 260, 261, 375, 263, 264, 265,
+ 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
+ 202, 24, 269, 279, 280, -1, 282, 283, 284, 285,
+ 286, -1, -1, 125, -1, 291, 292, 293, 294, 295,
+ 296, 297, 355, 356, -1, 309, 302, 360, 312, -1,
+ -1, 315, 316, 317, -1, 311, -1, 313, 314, -1,
+ -1, 41, -1, 376, 44, -1, -1, 380, 256, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, 58, 59,
+ -1, 269, -1, 63, 272, 273, 274, 275, -1, -1,
+ -1, 279, 280, -1, 282, 283, 284, 285, 286, -1,
+ -1, 125, -1, 291, 292, 293, 294, 295, 296, -1,
+ -1, -1, -1, 93, 302, -1, -1, -1, -1, -1,
+ -1, -1, -1, 311, 33, 313, 314, 36, 37, 38,
+ -1, 40, 41, 42, 43, 44, 45, 281, -1, -1,
+ -1, -1, -1, 287, 288, 289, 290, -1, -1, 58,
+ 59, -1, -1, -1, 63, 64, -1, -1, -1, 303,
+ 304, 305, 306, 307, 308, 309, -1, -1, 312, -1,
+ -1, 315, 316, 317, 266, 267, 268, -1, 270, 271,
+ -1, -1, 91, -1, 93, 33, -1, -1, 36, 37,
+ 38, -1, 40, 41, 42, 43, 44, 45, -1, -1,
+ 281, -1, -1, -1, -1, 297, 287, 288, 289, 290,
+ 58, 59, -1, -1, -1, 63, 64, 126, -1, -1,
+ -1, -1, 303, 304, 305, 306, 307, 308, 309, -1,
+ -1, 312, 29, -1, 315, 316, 317, -1, -1, -1,
+ -1, -1, 266, 267, 268, 93, 270, 271, 33, 46,
+ 47, 36, 37, 38, -1, 40, 53, 42, 43, -1,
+ 45, 287, 288, 289, 290, -1, -1, -1, 65, 66,
+ 67, 68, -1, 297, 59, -1, -1, -1, 126, 64,
+ 306, 307, 308, 309, -1, -1, 312, -1, -1, 315,
+ 316, 317, 272, 273, 274, 275, -1, -1, -1, 279,
+ -1, 281, -1, -1, -1, -1, 91, 287, 288, 289,
+ 290, 272, 273, 274, 275, 112, -1, -1, 279, -1,
+ 300, 301, -1, 303, 304, 305, 306, 307, 308, 309,
+ -1, -1, 312, -1, -1, 315, 316, 317, 123, 300,
+ 301, 126, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, -1, 263, 264, 265, -1, -1, -1,
+ 269, -1, -1, 272, 273, 274, 275, -1, -1, -1,
+ 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
+ 289, 290, 291, 292, 293, 294, 295, 296, -1, -1,
+ -1, 300, 301, 302, 303, 304, 305, 306, 307, 308,
+ 309, -1, 311, 312, 313, 314, 315, 316, 317, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, -1, -1,
+ -1, 269, -1, -1, 272, 273, 274, 275, -1, -1,
+ -1, 279, 280, 281, 282, 283, 284, 285, 286, 287,
+ 288, 289, 290, 291, 292, 293, 294, 295, 296, -1,
+ -1, -1, 300, 301, 302, 303, 304, 305, 306, 307,
+ 308, 309, -1, 311, 312, 313, 314, 315, 316, 317,
+ -1, 256, 257, 258, 259, 260, 261, 63, 263, 264,
265, -1, -1, -1, 269, -1, -1, 272, 273, 274,
- 275, -1, -1, -1, 279, 280, 281, 282, 283, 284,
- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
- 305, 306, -1, 308, 309, 310, 311, 312, 313, 314,
- 256, 257, 258, 259, 260, 261, -1, 263, 264, 265,
- -1, -1, -1, 269, -1, 91, 272, 273, 274, 275,
- -1, -1, -1, 279, 280, -1, 282, 283, 284, 285,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, 295,
- 296, 33, -1, 299, 36, 37, 38, 123, 40, -1,
- 42, 43, 308, 45, 310, 311, -1, -1, 13, 287,
- -1, 289, 290, -1, -1, -1, -1, 59, -1, -1,
- -1, -1, 64, 272, 273, 274, 275, 305, 306, -1,
- 279, 309, -1, -1, 312, 313, 314, 42, -1, -1,
- 45, -1, -1, -1, -1, -1, -1, 33, 297, 91,
- 36, 37, 38, -1, 40, -1, 42, 43, -1, 45,
- -1, -1, 26, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 81, -1, 64, 43,
- 44, 123, -1, -1, 126, -1, 50, -1, -1, -1,
- 95, -1, -1, -1, -1, -1, -1, -1, 62, 63,
- 64, 65, -1, 33, -1, 91, 36, 37, 38, -1,
- 40, -1, 42, 43, -1, 45, -1, -1, -1, -1,
+ 275, -1, -1, -1, 279, 280, -1, 282, 283, 284,
+ 285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
+ 295, 296, -1, -1, -1, 33, -1, 302, 36, 37,
+ 38, -1, 40, -1, 42, 43, 311, 45, 313, 314,
+ -1, 46, -1, -1, -1, -1, -1, -1, -1, 54,
+ 287, 59, 289, 290, -1, -1, 64, -1, -1, 41,
+ -1, -1, 44, -1, -1, 331, 332, 333, -1, 335,
+ -1, 308, 309, -1, -1, 312, 58, 59, 315, 316,
+ 317, -1, -1, 91, -1, 33, -1, -1, 36, 37,
+ 38, 96, 40, -1, 42, 43, 362, 45, -1, -1,
+ -1, -1, -1, 369, -1, -1, -1, 373, -1, -1,
+ -1, 93, -1, -1, 119, 123, 64, -1, 126, -1,
+ 386, 387, 127, -1, -1, 33, -1, -1, 36, 37,
+ 38, -1, 40, -1, 42, 43, -1, 45, -1, -1,
+ -1, -1, -1, 91, 287, 288, 289, 290, -1, -1,
+ -1, -1, -1, -1, -1, -1, 64, -1, -1, -1,
+ -1, -1, -1, -1, 41, 308, 309, 44, -1, 312,
+ -1, -1, 315, 316, 317, 123, -1, -1, 126, -1,
+ -1, 58, 59, 91, -1, -1, 63, -1, -1, 33,
+ -1, -1, 36, 37, 38, -1, 40, -1, 42, 43,
+ -1, 45, -1, -1, -1, 281, -1, -1, -1, -1,
+ -1, 287, 288, 289, 290, 123, 93, -1, 126, -1,
+ 64, -1, -1, -1, -1, -1, -1, 303, 304, 305,
+ 306, 307, 308, 309, -1, -1, 312, -1, -1, 315,
+ 316, 317, -1, -1, -1, -1, -1, 91, 256, 257,
+ 258, 259, 260, 261, -1, 263, 264, 265, -1, -1,
+ -1, 269, -1, 268, 272, 273, 274, 275, -1, 274,
+ -1, 279, 280, -1, 282, 283, 284, 285, 286, 123,
+ -1, -1, 126, 291, 292, 293, 294, 295, 296, -1,
+ 272, 273, 274, 275, 302, -1, -1, 279, -1, -1,
+ -1, -1, -1, 311, -1, 313, 314, -1, -1, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265, 300, 301,
+ -1, 269, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 280, -1, 282, 283, 284, 285, 286, -1,
+ 41, -1, -1, 291, 292, 293, 294, 295, 296, 257,
+ 258, 259, 260, 261, 302, 263, 264, 265, 59, -1,
+ -1, 269, -1, 311, -1, 313, 314, -1, -1, -1,
+ -1, -1, 280, -1, 282, 283, 284, 285, 286, 63,
+ -1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
+ -1, -1, 93, -1, 302, 272, 273, 274, 275, -1,
+ -1, -1, 279, 311, 281, 313, 314, -1, -1, -1,
+ 287, 288, -1, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, -1, 300, 301, 269, 303, 304, 305, 306,
+ 307, 308, -1, -1, -1, -1, 280, -1, 282, 283,
+ 284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
+ 294, 295, 296, 289, 290, -1, 33, -1, 302, 36,
+ 37, 38, -1, 40, -1, 42, 43, 311, 45, 313,
+ 314, -1, 308, 309, -1, -1, 312, -1, -1, 315,
+ 316, 317, 59, -1, -1, -1, -1, 64, -1, -1,
+ -1, 287, 288, 289, 290, -1, 33, -1, -1, 36,
+ 37, 38, -1, 40, 41, 42, 43, -1, 45, 305,
+ 306, 307, 308, 309, 91, -1, 312, -1, -1, 315,
+ 316, 317, -1, -1, -1, -1, -1, 64, -1, -1,
+ 287, 288, 289, 290, -1, -1, 33, -1, -1, 36,
+ 37, 38, -1, 40, -1, 42, 43, -1, 45, 126,
+ 307, 308, 309, -1, 91, 312, -1, -1, 315, 316,
+ 317, -1, -1, -1, -1, -1, -1, 64, -1, -1,
+ -1, 272, 273, 274, 275, -1, 33, -1, 279, 36,
+ 37, 38, -1, 40, 41, 42, 43, -1, 45, 126,
+ -1, -1, -1, -1, 91, -1, 93, 281, -1, 300,
+ 301, -1, -1, 287, 288, 289, 290, 64, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 64, -1, 141, 123, -1, -1,
- 126, -1, -1, 107, -1, -1, -1, -1, -1, -1,
+ 304, 305, 306, 307, 308, 309, -1, -1, 312, 126,
+ -1, 315, 316, 317, 91, -1, 33, -1, -1, 36,
+ 37, 38, -1, 40, 41, 42, 43, -1, 45, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 91, -1, 289, 290, -1, 33, -1, -1, 36,
- 37, 38, -1, 40, 179, 42, 43, -1, 45, 305,
- 306, 186, -1, 309, -1, -1, 312, 313, 314, -1,
- -1, -1, -1, 123, -1, -1, 126, 64, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 64, -1, 126,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 256, 257, 258, 259, 260, 261,
- -1, 263, 264, 265, 91, -1, -1, 269, -1, -1,
- 272, 273, 274, 275, -1, -1, -1, 279, 280, -1,
- 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
- 292, 293, 294, 295, 296, -1, 123, 299, -1, 126,
- -1, 91, -1, -1, -1, 41, 308, -1, 310, 311,
- -1, 257, 258, 259, 260, 261, 262, 263, 264, 265,
- -1, -1, -1, 269, -1, -1, -1, 63, -1, -1,
- -1, -1, -1, 123, 280, -1, 282, 283, 284, 285,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, 295,
- 296, -1, -1, 299, -1, 91, -1, -1, -1, -1,
- -1, -1, 308, -1, 310, 311, -1, 257, 258, 259,
- 260, 261, -1, 263, 264, 265, -1, -1, -1, 269,
- 58, -1, -1, -1, -1, 63, -1, 123, -1, -1,
- 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 295, 296, -1, -1, 299,
- -1, -1, -1, 91, -1, -1, -1, -1, 308, -1,
- 310, 311, -1, -1, -1, -1, 41, -1, -1, 44,
257, 258, 259, 260, 261, -1, 263, 264, 265, -1,
- -1, -1, 269, 58, 59, 123, -1, -1, 63, -1,
+ -1, -1, 269, -1, 91, -1, -1, -1, -1, -1,
-1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
-1, -1, -1, -1, 291, 292, 293, 294, 295, 296,
- 33, -1, 299, 36, 37, 38, -1, 40, 93, 42,
- 43, 308, 45, 310, 311, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 59, 287, 288, 289,
- 290, 64, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 301, 302, 303, 304, 305, 306, -1, -1, 309,
- -1, -1, 312, 313, 314, -1, 33, -1, 91, 36,
- 37, 38, -1, 40, 41, 42, 43, -1, 45, -1,
- -1, -1, -1, -1, -1, 281, -1, -1, -1, -1,
- -1, 287, 288, 289, 290, -1, -1, 64, -1, -1,
- -1, -1, -1, 126, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, -1,
- -1, -1, 33, -1, 91, 36, 37, 38, -1, 40,
- -1, 42, 43, -1, 45, -1, -1, -1, -1, -1,
- -1, -1, -1, 281, -1, -1, -1, -1, -1, 287,
- 288, 289, 290, 64, -1, -1, -1, -1, -1, 126,
- -1, -1, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, -1, -1, -1,
- 91, 33, 93, -1, 36, 37, 38, -1, 40, 41,
- 42, 43, -1, 45, -1, -1, -1, 272, 273, 274,
- 275, -1, -1, -1, 279, -1, 281, -1, -1, -1,
- -1, -1, 64, 288, -1, 126, -1, -1, -1, -1,
- -1, -1, 297, 298, -1, 300, 301, 302, 303, 304,
- 41, -1, -1, 44, 257, 258, 259, 260, 261, 91,
- 263, 264, 265, -1, -1, -1, 269, 58, 59, -1,
- -1, -1, 63, -1, -1, -1, -1, 280, -1, 282,
- 283, 284, 285, 286, -1, -1, -1, -1, 291, 292,
- 293, 294, 295, 296, 126, -1, 299, -1, -1, -1,
- -1, -1, 93, -1, -1, 308, 41, 310, 311, 44,
+ 257, 258, 259, 260, 261, 302, 263, 264, 265, 126,
+ -1, -1, 269, -1, 311, -1, 313, 314, -1, -1,
+ -1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
+ -1, -1, -1, -1, 291, 292, 293, 294, 295, 296,
+ 257, 258, 259, 260, 261, 302, 263, 264, 265, -1,
+ -1, -1, 269, -1, 311, -1, 313, 314, -1, -1,
+ -1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
+ -1, -1, -1, -1, 291, 292, 293, 294, 295, 296,
+ 257, 258, 259, 260, 261, 302, 263, 264, 265, -1,
+ -1, -1, 269, -1, 311, -1, 313, 314, -1, -1,
+ -1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
+ -1, -1, -1, -1, 291, 292, 293, 294, 295, 296,
+ -1, -1, -1, 33, -1, 302, 36, 37, 38, -1,
+ 40, 41, 42, 43, 311, 45, 313, 314, -1, -1,
257, 258, 259, 260, 261, -1, 263, 264, 265, -1,
- -1, -1, 269, 58, 59, -1, -1, -1, 63, -1,
+ -1, -1, 269, -1, 64, -1, -1, -1, -1, -1,
-1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
-1, -1, -1, -1, 291, 292, 293, 294, 295, 296,
- -1, -1, 299, -1, -1, -1, -1, -1, 93, -1,
- -1, 308, -1, 310, 311, -1, 257, 258, 259, 260,
- 261, -1, 263, 264, 265, -1, 33, -1, 269, 36,
- 37, 38, -1, 40, 41, 42, 43, -1, 45, 280,
- -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, 295, 296, -1, 64, 299, -1,
- -1, -1, -1, -1, -1, -1, -1, 308, -1, 310,
- 311, -1, -1, -1, -1, 257, 258, 259, 260, 261,
- -1, 263, 264, 265, 91, 33, -1, 269, 36, 37,
- 38, -1, 40, -1, 42, 43, -1, 45, 280, -1,
- 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
- 292, 293, 294, 295, 296, -1, 64, 299, -1, 126,
- -1, -1, -1, -1, -1, -1, 308, -1, 310, 311,
- -1, 272, 273, 274, 275, -1, -1, -1, 279, -1,
- 281, 33, -1, 91, 36, 37, 38, -1, 40, 41,
- 42, 43, -1, 45, -1, -1, 297, 298, -1, 300,
- 301, 302, 303, 304, -1, -1, -1, -1, -1, -1,
- -1, -1, 64, -1, -1, -1, -1, -1, 126, -1,
- -1, -1, -1, -1, -1, -1, -1, 272, 273, 274,
- 275, -1, -1, -1, 279, -1, 281, 33, -1, 91,
- 36, 37, 38, -1, 40, 41, 42, 43, -1, 45,
- -1, -1, 297, 298, -1, 300, 301, 302, 303, 304,
- -1, -1, -1, -1, -1, -1, -1, -1, 64, -1,
- -1, -1, -1, -1, 126, -1, -1, -1, -1, -1,
+ -1, 91, -1, 33, -1, 302, 36, 37, 38, -1,
+ 40, 41, 42, 43, 311, 45, 313, 314, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 257, 258, 259, 260, 261, 91, 263, 264, 265, -1,
- 33, -1, 269, 36, 37, 38, -1, 40, 41, 42,
- 43, -1, 45, 280, -1, 282, 283, 284, 285, 286,
- -1, -1, -1, -1, 291, 292, 293, 294, 295, 296,
- 126, 64, 299, -1, -1, -1, -1, -1, -1, -1,
- -1, 308, -1, 310, 311, -1, -1, -1, 256, 257,
- 258, 259, 260, 261, -1, 263, 264, 265, 91, -1,
- -1, 269, 41, -1, -1, 44, -1, -1, -1, -1,
- -1, -1, 280, -1, 282, 283, 284, 285, 286, 58,
- 59, -1, -1, 291, 292, 293, 294, 295, 296, -1,
- -1, 299, -1, 126, -1, -1, -1, -1, -1, -1,
- 308, -1, 310, 311, -1, 257, 258, 259, 260, 261,
- -1, 263, 264, 265, 93, -1, -1, 269, 41, -1,
- -1, 44, -1, -1, -1, -1, -1, -1, 280, -1,
- 282, 283, 284, 285, 286, 58, 59, -1, -1, 291,
- 292, 293, 294, 295, 296, -1, -1, 299, -1, -1,
- -1, -1, -1, -1, -1, -1, 308, -1, 310, 311,
+ -1, -1, -1, -1, 64, -1, 126, -1, -1, -1,
+ -1, -1, 41, -1, -1, 44, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 58,
+ 59, 91, 33, -1, 63, 36, 37, 38, -1, 40,
+ -1, 42, 43, -1, 45, -1, -1, -1, -1, -1,
+ 287, 288, 289, 290, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 64, 93, -1, 126, 304, 305, 306,
+ 307, 308, 309, -1, -1, 312, -1, -1, 315, 316,
+ 317, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 91, -1, 33, -1, -1, 36, 37, 38, -1, 40,
+ 41, 42, 43, -1, 45, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 64, -1, 126, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 257, 258, 259,
+ 260, 261, -1, 263, 264, 265, -1, -1, -1, 269,
+ 91, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
+ -1, 291, 292, 293, 294, 295, 296, -1, -1, -1,
+ -1, -1, 302, -1, -1, 126, -1, -1, -1, -1,
+ -1, 311, -1, 313, 314, -1, -1, 257, 258, 259,
+ 260, 261, -1, 263, 264, 265, -1, 33, -1, 269,
+ 36, 37, 38, -1, 40, 41, 42, 43, -1, 45,
+ 280, -1, 282, 283, 284, 285, 286, -1, -1, -1,
+ -1, 291, 292, 293, 294, 295, 296, -1, 64, -1,
+ -1, -1, 302, 272, 273, 274, 275, -1, -1, -1,
+ 279, 311, 281, 313, 314, 256, 257, 258, 259, 260,
+ 261, -1, 263, 264, 265, 91, -1, -1, 269, -1,
+ -1, 300, 301, -1, 303, 304, 305, 306, 307, 280,
+ -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
+ 291, 292, 293, 294, 295, 296, -1, -1, -1, 33,
+ 126, 302, 36, 37, 38, -1, 40, 41, 42, 43,
+ 311, 45, 313, 314, -1, -1, 257, 258, 259, 260,
+ 261, -1, 263, 264, 265, -1, -1, -1, 269, -1,
+ 64, -1, -1, -1, -1, -1, -1, -1, -1, 280,
+ -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
+ 291, 292, 293, 294, 295, 296, -1, 91, -1, 33,
+ -1, 302, 36, 37, 38, -1, 40, -1, 42, 43,
+ 311, 45, 313, 314, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 28, 29,
+ 64, -1, 126, -1, -1, -1, -1, -1, 41, -1,
+ 40, 44, -1, -1, -1, -1, 46, 47, 48, -1,
+ -1, -1, 52, 53, -1, 58, 59, 91, -1, -1,
+ 63, -1, -1, -1, -1, 65, 66, 67, 68, -1,
-1, 257, 258, 259, 260, 261, -1, 263, 264, 265,
- 93, 33, -1, 269, 36, 37, 38, -1, 40, -1,
- 42, 43, -1, 45, 280, -1, 282, 283, 284, 285,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, 295,
- 296, -1, 64, 299, -1, -1, -1, -1, -1, -1,
- -1, -1, 308, -1, 310, 311, -1, -1, -1, -1,
- 41, -1, -1, 44, 257, 258, 259, 260, 261, 91,
- 263, 264, 265, -1, -1, -1, 269, 58, 59, -1,
- -1, -1, 63, -1, -1, -1, -1, 280, -1, 282,
- 283, 284, 285, 286, -1, -1, -1, -1, 291, 292,
- 293, 294, 295, 296, 126, 41, 299, -1, 44, -1,
- 91, -1, 93, -1, -1, 308, -1, 310, 311, -1,
- -1, -1, 58, 59, -1, -1, -1, 63, -1, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
- 279, -1, 123, -1, -1, -1, -1, -1, 41, -1,
- -1, 44, -1, -1, -1, 91, -1, 93, 297, 298,
- -1, 300, -1, -1, -1, 58, 59, -1, -1, -1,
- 63, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 123, -1, 272,
- 273, 274, 275, -1, 41, -1, 279, 44, -1, -1,
- 93, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 58, 59, -1, 297, 298, 63, -1, -1, -1,
+ -1, -1, -1, 269, -1, 41, -1, -1, 44, -1,
+ 93, -1, 126, -1, 280, -1, 282, 283, 284, 285,
+ 286, 41, -1, 59, 44, 291, 292, 293, 294, 295,
+ 296, -1, 112, -1, -1, -1, 302, -1, 58, 59,
+ -1, -1, -1, 63, -1, 311, -1, 313, 314, -1,
+ -1, -1, -1, -1, -1, -1, -1, 93, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 123, -1, -1, -1, -1, 257, 258, 259, 260, 261,
- -1, 263, 264, 265, 91, -1, 93, 269, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 280, -1,
- 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
- 292, 293, 294, 295, 296, -1, -1, 299, -1, 91,
- -1, -1, -1, -1, -1, -1, 308, -1, 310, 311,
- -1, 272, 273, 274, 275, -1, -1, -1, 279, -1,
- 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- -1, 123, -1, -1, -1, -1, 297, 298, -1, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, -1, -1, 272, 273, 274, 275,
- -1, 41, -1, 279, 44, 281, -1, -1, -1, -1,
+ -1, -1, -1, 93, -1, 41, -1, -1, 44, -1,
+ -1, -1, -1, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 58, 59, -1, 269, 176, 63, -1, -1,
+ -1, -1, -1, -1, -1, -1, 280, -1, 282, 283,
+ 284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
+ 294, 295, 296, 203, -1, -1, -1, 93, 302, -1,
+ -1, -1, -1, -1, -1, 41, -1, 311, 44, 313,
+ 314, -1, -1, 257, 258, 259, 260, 261, -1, 263,
+ 264, 265, 58, 59, -1, 269, -1, 63, -1, -1,
+ -1, -1, -1, -1, -1, -1, 280, -1, 282, 283,
+ 284, 285, 286, -1, -1, -1, -1, 291, 292, 293,
+ 294, 295, 296, -1, -1, -1, -1, 93, 302, 272,
+ 273, 274, 275, -1, -1, -1, 279, 311, 281, 313,
+ 314, -1, -1, -1, 287, 288, 289, 290, -1, -1,
+ -1, -1, -1, 41, -1, -1, 44, 300, 301, -1,
+ 303, 304, 305, 306, 307, 308, 309, -1, -1, 312,
+ 58, 59, 315, 316, 317, 63, 272, 273, 274, 275,
+ -1, -1, -1, 279, -1, -1, -1, -1, -1, -1,
+ -1, -1, 272, 273, 274, 275, -1, -1, -1, 279,
+ 41, 281, -1, 44, 300, 93, -1, 287, 288, 289,
+ 290, -1, -1, -1, -1, -1, -1, 58, 59, -1,
+ 300, 301, 63, 303, 304, 305, 306, 307, 308, 309,
+ -1, -1, 312, -1, -1, 315, 316, 317, -1, -1,
+ -1, -1, -1, -1, -1, -1, 272, 273, 274, 275,
+ -1, 41, 93, 279, 44, 281, -1, -1, -1, -1,
-1, 287, 288, 289, 290, -1, -1, -1, 58, 59,
- -1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, 272,
- 273, 274, 275, -1, -1, -1, 279, -1, 281, -1,
- -1, -1, -1, 93, 287, 288, 289, 290, -1, -1,
- -1, -1, -1, -1, 297, 298, -1, 300, 301, 302,
- 303, 304, 305, 306, -1, -1, 309, -1, -1, 312,
- 313, 314, -1, 123, -1, 272, 273, 274, 275, 91,
- 41, -1, 279, -1, 281, -1, -1, -1, -1, -1,
- 287, 288, 289, 290, -1, -1, -1, 58, 59, -1,
- 297, 298, 63, 300, 301, 302, 303, 304, 305, 306,
- -1, 123, 309, -1, -1, 312, 313, 314, -1, -1,
- -1, -1, -1, 41, -1, 287, 288, 289, 290, -1,
- 91, -1, 93, -1, -1, -1, -1, -1, -1, -1,
- 58, 59, 304, 305, 306, 63, -1, 309, -1, -1,
- 312, 313, 314, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 123, -1, -1, -1, -1, 41, -1, -1,
- 44, -1, -1, 91, -1, 93, -1, -1, -1, -1,
+ -1, -1, -1, 63, 300, 301, -1, 303, 304, 305,
+ 306, 307, 308, 309, -1, -1, 312, -1, -1, 315,
+ 316, 317, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 41, 93, -1, 44, 272, 273, 274, 275,
+ -1, 41, -1, 279, 44, 281, -1, -1, -1, 58,
+ 59, 287, 288, 289, 290, -1, -1, -1, 58, 59,
+ -1, -1, -1, 63, 300, 301, -1, 303, 304, 305,
+ 306, 307, 308, 309, -1, -1, 312, -1, -1, 315,
+ 316, 317, -1, -1, 93, -1, -1, 41, -1, -1,
+ 44, -1, -1, 93, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 58, 59, -1, -1, -1, 63,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 123, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 93,
- -1, -1, 272, 273, 274, 275, -1, -1, -1, 279,
- -1, 281, -1, -1, -1, -1, -1, 287, 288, 289,
- 290, -1, -1, 41, -1, -1, 44, 297, 298, 123,
- 300, 301, 302, 303, 304, 305, 306, -1, -1, 309,
- 58, 59, 312, 313, 314, 63, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
- -1, -1, -1, -1, -1, -1, 41, -1, -1, 44,
- 302, 303, 304, 305, 306, 93, -1, 309, -1, -1,
- 312, 313, 314, 58, 59, -1, -1, -1, 63, -1,
- -1, 272, 273, 274, 275, -1, -1, -1, 279, -1,
- 281, -1, -1, -1, -1, 123, 287, 288, 289, 290,
- -1, -1, -1, -1, -1, -1, 297, 298, 93, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, 272, 273, 274, 275, -1, 41,
- -1, 279, -1, 281, -1, -1, -1, -1, 123, 287,
- 288, 289, 290, -1, -1, -1, 58, 59, -1, 297,
- 298, 63, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, -1, 272, 273,
- 274, 275, -1, 41, -1, 279, 44, 281, -1, 91,
- -1, 93, -1, 287, 288, 289, 290, -1, -1, -1,
- 58, 59, -1, 297, 298, 63, 300, 301, 302, 303,
- 304, 305, 306, -1, -1, 309, -1, -1, 312, 313,
- 314, 123, -1, -1, -1, -1, 41, 25, 26, 44,
- -1, -1, -1, -1, -1, 93, -1, -1, -1, 37,
- -1, -1, -1, 58, 59, 43, 44, 45, 63, -1,
- -1, -1, 50, -1, 272, 273, 274, 275, -1, -1,
- -1, 279, -1, 281, 62, 63, 64, 65, -1, 287,
- 288, 289, 290, -1, -1, -1, -1, -1, 93, 297,
- 298, -1, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, 272, 273, 274,
- 275, -1, 41, -1, 279, 44, 281, -1, -1, 107,
- -1, -1, 287, 288, 289, 290, -1, -1, -1, 58,
- 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
- 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
- -1, -1, -1, -1, -1, 41, -1, -1, 44, -1,
- -1, -1, -1, -1, 93, -1, -1, -1, -1, -1,
- -1, -1, 58, 59, -1, -1, -1, 63, -1, 167,
+ -1, -1, -1, -1, 272, 273, 274, 275, -1, -1,
+ -1, 279, -1, 281, -1, -1, -1, -1, -1, 287,
+ 288, 289, 290, -1, -1, -1, -1, -1, -1, 93,
+ -1, -1, 300, 301, -1, 303, 304, 305, 306, 307,
+ 308, 309, -1, -1, 312, -1, -1, 315, 316, 317,
+ -1, 272, 273, 274, 275, -1, 41, -1, 279, 44,
+ 281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
+ -1, -1, -1, 58, 59, -1, -1, -1, 63, 300,
+ 301, -1, 303, 304, 305, 306, 307, 308, 309, -1,
+ -1, 312, -1, -1, 315, 316, 317, -1, -1, -1,
+ -1, -1, 272, 273, 274, 275, -1, 41, 93, 279,
+ 44, 281, -1, -1, -1, -1, -1, 287, 288, 289,
+ 290, -1, -1, -1, 58, 59, -1, -1, -1, 63,
+ 300, 301, -1, 303, 304, 305, 306, 307, 308, 309,
+ -1, -1, 312, -1, -1, 315, 316, 317, -1, -1,
+ -1, -1, -1, 272, 273, 274, 275, -1, -1, 93,
+ 279, -1, 272, 273, 274, 275, -1, 41, -1, 279,
+ 44, 281, -1, -1, -1, -1, -1, 287, 288, 289,
+ 290, 300, 301, -1, 58, 59, -1, -1, -1, 63,
+ 300, 301, -1, 303, 304, 305, 306, 307, 308, 309,
+ -1, -1, 312, -1, -1, 315, 316, 317, 272, 273,
+ 274, 275, -1, 41, -1, 279, 44, 281, -1, 93,
+ -1, -1, -1, 287, 288, 289, 290, -1, -1, -1,
+ 58, 59, -1, -1, -1, 63, 300, 301, -1, 303,
+ 304, 305, 306, 307, 308, 309, -1, -1, 312, -1,
+ -1, 315, 316, 317, -1, -1, -1, -1, -1, 41,
+ -1, -1, 44, -1, -1, 93, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 58, 59, -1, -1,
+ -1, 63, 41, -1, -1, 44, -1, 272, 273, 274,
+ 275, -1, -1, -1, 279, -1, 281, -1, -1, 58,
+ 59, -1, 287, 288, 289, 290, -1, -1, -1, -1,
+ -1, 93, -1, -1, -1, 300, 301, -1, 303, 304,
+ 305, 306, 307, 308, 309, -1, -1, 312, -1, -1,
+ 315, 316, 317, 41, 93, -1, 44, -1, 272, 273,
+ 274, 275, 41, -1, -1, 279, -1, 281, -1, -1,
+ 58, 59, -1, 287, 288, 289, 290, -1, -1, 58,
+ 59, -1, -1, -1, 63, -1, 300, 301, -1, 303,
+ 304, 305, 306, 307, 308, 309, -1, -1, 312, -1,
+ -1, 315, 316, 317, -1, 93, -1, -1, -1, -1,
+ -1, -1, -1, -1, 93, -1, -1, -1, 272, 273,
+ 274, 275, 41, -1, -1, 279, -1, 281, -1, -1,
+ -1, -1, -1, 287, 288, 289, 290, -1, -1, 58,
+ 59, -1, -1, -1, 63, -1, 300, 301, -1, 303,
+ 304, 305, 306, 307, 308, 309, -1, -1, 312, -1,
+ -1, 315, 316, 317, 272, 273, 274, 275, 41, -1,
+ -1, 279, -1, 281, 93, -1, -1, -1, -1, 287,
+ 288, 289, 290, -1, -1, 58, 59, -1, -1, -1,
+ 63, -1, 300, 301, -1, 303, 304, 305, 306, 307,
+ 308, 309, -1, -1, 312, -1, -1, 315, 316, 317,
272, 273, 274, 275, -1, -1, -1, 279, -1, 281,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
- -1, -1, -1, 191, -1, 297, 298, 93, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- 312, 313, 314, -1, 272, 273, 274, 275, -1, 41,
- -1, 279, 44, 281, -1, -1, -1, -1, -1, 287,
- 288, 289, 290, -1, -1, -1, 58, 59, -1, 297,
- 298, 63, 300, 301, 302, 303, 304, 305, 306, -1,
- -1, 309, -1, -1, 312, 313, 314, 272, 273, 274,
+ 93, -1, -1, -1, -1, 287, 288, 289, 290, -1,
+ -1, -1, -1, 272, 273, 274, 275, -1, 300, 301,
+ 279, 303, 304, 305, 306, 307, 308, 309, -1, 41,
+ 312, -1, 44, 315, 316, 317, -1, -1, -1, -1,
+ -1, 300, 301, -1, 303, -1, 58, 59, -1, -1,
+ -1, 63, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 272, 273, 274, 275, -1, -1,
+ -1, 279, -1, 272, 273, 274, 275, -1, -1, -1,
+ 279, 93, 281, -1, -1, -1, -1, -1, 287, 288,
+ 289, 290, 300, 301, -1, -1, -1, -1, -1, -1,
+ -1, 300, 301, -1, 303, 304, 305, 306, 307, 308,
+ 309, -1, -1, 312, -1, -1, 315, 316, 317, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
+ 279, 41, 281, -1, 44, -1, -1, -1, 287, 288,
+ 289, 290, -1, -1, -1, -1, -1, -1, 58, 59,
+ -1, 300, 301, 63, 303, 304, 305, 306, 307, 308,
+ 309, -1, -1, 312, -1, -1, 315, 316, 317, 272,
+ 273, 274, 275, -1, 41, -1, 279, 44, 281, -1,
+ -1, -1, -1, 93, 287, 288, 289, 290, -1, -1,
+ -1, 58, 59, -1, -1, -1, 63, 300, 301, -1,
+ 303, 304, 305, 306, 307, 308, 309, 33, -1, 312,
+ -1, -1, 315, 316, 317, 41, -1, -1, 41, 45,
+ -1, 44, 48, -1, -1, 51, 93, -1, -1, 55,
+ 56, 57, 58, 59, -1, 58, 59, 63, 64, -1,
+ 63, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 272, 273, 274, 275, -1, -1, -1, 279, 41, 281,
+ -1, 44, -1, -1, -1, 287, 288, 289, 290, -1,
+ 93, -1, 98, -1, -1, 58, 59, -1, 300, 301,
+ 63, 303, 304, 305, 306, 307, 308, 309, -1, -1,
+ 312, -1, -1, -1, -1, -1, 41, -1, -1, 44,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 93, -1, -1, 58, 59, -1, -1, -1, 63, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 160, 161, 162, 163, 164, 165,
+ 166, 167, 168, 169, 170, 171, 172, 173, 93, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 187, 272, 273, 274, 275, -1, 41, -1, 279,
+ 44, 281, -1, -1, -1, -1, -1, 287, 288, 289,
+ 290, -1, -1, -1, 58, 59, -1, -1, -1, 63,
+ 300, 301, -1, 303, 304, 305, 306, 307, 308, 309,
+ -1, -1, 312, -1, -1, 272, 273, 274, 275, -1,
+ 41, -1, 279, 44, 281, -1, -1, -1, -1, 93,
+ 287, 288, 289, 290, -1, -1, -1, 58, 59, -1,
+ -1, -1, 63, 300, 301, -1, 303, 304, 305, 306,
+ 307, 308, 309, -1, -1, -1, 272, -1, -1, 272,
+ 273, 274, 275, -1, -1, -1, 279, 41, 281, -1,
+ 44, -1, 93, -1, 287, 288, 289, 290, -1, -1,
+ -1, -1, -1, -1, 58, 59, -1, 300, 301, 305,
+ 303, 304, 305, 306, 307, 308, 309, -1, -1, 272,
+ 273, 274, 275, -1, 41, -1, 279, 44, 281, -1,
+ -1, -1, -1, -1, 287, 288, 289, 290, -1, 93,
+ -1, 58, 59, -1, -1, -1, 63, 300, 301, -1,
+ 303, 304, 305, 306, 307, 308, 309, 272, 273, 274,
275, -1, 41, -1, 279, 44, 281, -1, -1, -1,
- -1, 93, 287, 288, 289, 290, -1, -1, -1, 58,
- 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
- 305, 306, -1, -1, 309, -1, -1, 312, 313, 314,
- 41, -1, -1, 44, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 93, -1, -1, 58, 59, -1,
- -1, -1, 63, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, 41, -1,
- 279, 44, 281, -1, -1, -1, -1, -1, 287, 288,
- 289, 290, 93, -1, -1, 58, 59, -1, 297, 298,
- 63, 300, 301, 302, 303, 304, 305, 306, -1, -1,
- 309, -1, -1, 312, 313, 314, 272, 273, 274, 275,
- -1, 41, -1, 279, 44, 281, -1, -1, -1, -1,
- 93, 287, 288, 289, 290, -1, -1, -1, 58, 59,
- -1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, 309, -1, -1, 312, 313, 314, 41,
+ -1, -1, 287, 288, 289, 290, 93, -1, -1, 58,
+ 59, -1, -1, -1, 63, 300, 301, -1, 303, 304,
+ 305, 306, 307, 308, 309, -1, -1, -1, -1, 41,
-1, -1, 44, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 93, -1, -1, 58, 59, -1, -1,
- -1, 63, -1, -1, -1, -1, -1, -1, -1, -1,
- 272, 273, 274, 275, -1, 41, -1, 279, 44, 281,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, -1,
- -1, 93, 58, 59, -1, 297, 298, 63, 300, 301,
- 302, 303, 304, 305, 306, -1, -1, 309, -1, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, 41, -1,
- 279, 44, 281, -1, -1, -1, -1, 93, 287, 288,
- 289, 290, -1, -1, -1, 58, 59, -1, 297, 298,
- 63, 300, 301, 302, 303, 304, 305, 306, -1, -1,
+ -1, -1, -1, -1, 93, -1, 58, 59, -1, -1,
+ -1, 63, -1, -1, -1, -1, -1, -1, 272, 273,
+ 274, 275, -1, -1, -1, 279, -1, 281, -1, -1,
+ -1, -1, -1, 287, 288, 289, 290, 58, -1, -1,
+ -1, 93, 63, -1, -1, -1, 300, 301, -1, 303,
+ 304, 305, 306, 307, 308, 309, -1, -1, -1, -1,
-1, 272, 273, 274, 275, -1, 41, -1, 279, 44,
281, -1, -1, -1, -1, -1, 287, 288, 289, 290,
- 93, -1, -1, 58, 59, -1, 297, 298, 63, 300,
- 301, 302, 303, 304, 305, 306, -1, -1, -1, 272,
- 273, 274, 275, -1, 41, -1, 279, 44, 281, -1,
- -1, -1, -1, -1, 287, 288, 289, 290, 93, -1,
- -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
- 303, 304, 305, 306, -1, -1, -1, -1, -1, -1,
- -1, -1, 272, 273, 274, 275, -1, 41, -1, 279,
- 44, 281, -1, -1, -1, -1, 93, 287, 288, 289,
- 290, -1, -1, -1, 58, 59, -1, 297, 298, 63,
- 300, 301, 302, 303, 304, 305, 306, -1, -1, -1,
+ -1, -1, -1, 58, 59, -1, -1, -1, 63, 300,
+ 301, -1, 303, 304, 305, 306, 307, 308, 309, -1,
+ -1, -1, -1, 41, -1, -1, 44, -1, 272, 273,
+ 274, 275, -1, 41, -1, 279, 44, -1, 93, -1,
+ 58, 59, -1, -1, -1, 63, -1, -1, -1, -1,
+ 58, 59, -1, -1, -1, 63, 300, 301, -1, -1,
+ -1, -1, -1, -1, -1, 272, 273, 274, 275, -1,
+ 41, -1, 279, 44, 281, 93, -1, -1, -1, -1,
+ 287, 288, 289, 290, -1, 93, -1, 58, 59, -1,
+ -1, -1, 63, 300, 301, -1, 303, 304, 305, 306,
+ 307, 308, 309, 272, 273, 274, 275, -1, 41, -1,
+ 279, 44, 281, -1, -1, -1, -1, -1, 287, 288,
+ 289, 290, 93, -1, -1, 58, 59, -1, -1, -1,
+ 63, 300, 301, -1, 303, 304, 305, 306, 307, 308,
272, 273, 274, 275, -1, 41, -1, 279, 44, 281,
- -1, -1, -1, -1, -1, 287, 288, 289, 290, 93,
- -1, -1, 58, 59, -1, 297, 298, 63, 300, 301,
- 302, 303, 304, 305, 306, -1, 272, 273, 274, 275,
- -1, 41, -1, 279, 44, 281, -1, -1, -1, -1,
- -1, 287, 288, 289, 290, -1, -1, 93, 58, 59,
- -1, 297, 298, 63, 300, 301, 302, 303, 304, 305,
- 306, -1, -1, -1, -1, -1, -1, -1, -1, 272,
- 273, 274, 275, -1, 41, -1, 279, 44, 281, -1,
- -1, -1, -1, 93, 287, 288, 289, 290, -1, -1,
- -1, 58, 59, -1, 297, 298, 63, 300, 301, 302,
- 303, 304, 305, 306, -1, -1, -1, 272, 273, 274,
+ -1, -1, -1, -1, -1, 287, 288, -1, 290, -1,
+ 93, 41, 58, 59, 44, -1, -1, 63, 300, 301,
+ -1, 303, 304, 305, 306, 307, 308, -1, 58, 59,
+ 281, -1, -1, 63, -1, -1, 287, 288, 289, 290,
+ -1, -1, -1, -1, -1, -1, -1, 93, -1, -1,
+ -1, -1, 303, 304, 305, 306, 307, 308, 309, -1,
+ -1, 312, -1, 93, 315, 316, 317, 272, 273, 274,
275, -1, 41, -1, 279, 44, 281, -1, -1, -1,
- -1, -1, 287, 288, 289, 290, 93, -1, -1, 58,
- 59, -1, 297, 298, 63, 300, 301, 302, 303, 304,
- 305, -1, -1, -1, -1, 272, 273, 274, 275, -1,
- 41, -1, 279, 44, 281, -1, -1, -1, -1, -1,
- 287, 288, -1, 290, 93, -1, -1, 58, 59, -1,
- 297, 298, 63, 300, 301, 302, 303, 304, 305, -1,
- 91, -1, -1, -1, -1, -1, -1, -1, 272, 273,
- 274, 275, -1, 41, -1, 279, 44, 281, -1, -1,
- -1, -1, 93, 287, 288, -1, -1, -1, -1, -1,
- 58, 59, 123, 297, 298, 63, 300, 301, 302, 303,
- 304, 305, -1, -1, -1, -1, 272, 273, 274, 275,
- -1, 41, -1, 279, 44, 281, -1, -1, -1, -1,
- -1, 287, 288, 41, -1, 93, 44, -1, 58, 59,
- -1, 297, 298, 63, 300, 301, 302, 303, 304, -1,
- 58, 59, 272, 273, 274, 275, -1, -1, -1, 279,
- -1, 281, -1, -1, -1, -1, -1, 287, 288, -1,
- -1, -1, -1, 93, -1, -1, 41, 297, 298, 44,
- 300, 301, 302, 303, 304, 93, -1, -1, -1, 41,
- -1, -1, 44, 58, 59, 272, 273, 274, 275, -1,
- -1, -1, 279, -1, 281, -1, 58, 59, -1, -1,
- 287, 288, -1, -1, -1, -1, 63, -1, -1, -1,
- 297, 298, -1, 300, 301, 302, 303, 304, 93, -1,
- -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
- 279, 93, 281, -1, 91, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 297, 298,
- -1, 300, 301, 302, 303, -1, 287, 288, 289, 290,
- -1, 272, 273, 274, 275, -1, 123, -1, 279, -1,
- 281, -1, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, -1, -1, 297, 298, -1, 300,
- 301, 302, 63, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 272, 273, 274, 275, -1, -1,
- -1, 279, -1, 281, -1, -1, -1, -1, -1, -1,
- 91, -1, -1, -1, -1, -1, -1, -1, -1, 297,
- 298, -1, 300, 301, -1, -1, -1, -1, -1, -1,
+ -1, -1, 287, 288, -1, -1, -1, -1, -1, 58,
+ 59, -1, -1, -1, 63, 300, 301, -1, 303, 304,
+ 305, 306, 307, -1, 272, 273, 274, 275, -1, 41,
+ -1, 279, 44, 281, 272, 273, 274, 275, -1, 287,
+ 288, 279, -1, 281, 93, -1, 58, 59, -1, 287,
+ 288, 63, 300, 301, -1, 303, 304, 305, 306, 307,
+ -1, -1, 300, 301, -1, 303, 304, 305, 306, 307,
+ -1, 272, 273, 274, 275, -1, -1, -1, 279, -1,
+ 281, 93, -1, -1, -1, -1, 287, 288, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 300,
+ 301, -1, 303, 304, 305, 306, 307, -1, -1, 272,
+ 273, 274, 275, -1, -1, -1, 279, -1, 281, -1,
+ -1, -1, -1, -1, -1, 288, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 300, 301, -1,
+ 303, 304, 305, 306, 307, -1, 272, 273, 274, 275,
+ -1, -1, -1, 279, -1, 281, -1, -1, -1, -1,
-1, -1, 272, 273, 274, 275, -1, -1, -1, 279,
- -1, -1, 123, -1, 272, 273, 274, 275, -1, -1,
- -1, 279, -1, -1, -1, -1, 30, 297, 298, -1,
- 300, -1, -1, -1, 38, -1, -1, -1, 42, 297,
- 298, 45, -1, -1, -1, -1, -1, -1, 52, 53,
- 54, 55, 56, -1, -1, 59, 60, 272, 273, 274,
- 275, -1, 66, -1, 279, -1, -1, -1, -1, -1,
- 272, 273, 274, 275, -1, -1, -1, 279, -1, -1,
- -1, -1, 297, 298, 281, -1, -1, -1, -1, 93,
- 287, 288, 289, 290, -1, 297, 298, -1, -1, -1,
- -1, -1, -1, 300, 301, 302, 303, 304, 305, 306,
- -1, -1, 309, -1, -1, 312, 313, 314, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 151, 152, 153,
- 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
- 164, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 281, -1, 176, -1, -1, -1, 287, 288, 289, 290,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 301, 302, 303, 304, 305, 306, -1, -1, 309, -1,
- -1, 312, 313, 314, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 281, -1, -1, 300, 301, -1, 303, 304, 305,
+ 306, 307, -1, -1, -1, -1, -1, -1, -1, -1,
+ 300, 301, -1, 303, 304, 305, 306, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 272, 273, 274, 275, -1, -1, -1,
+ 279, -1, 281, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 255, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 300, 301, -1, 303, 304, 305, -1, -1, -1,
+ 272, 273, 274, 275, -1, -1, -1, 279, -1, 281,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 286,
+ -1, -1, -1, -1, -1, -1, -1, -1, 300, 301,
+ -1, 303, 304,
};
#define YYFINAL 1
#ifndef YYDEBUG
#define YYDEBUG 0
#endif
-#define YYMAXTOKEN 314
+#define YYMAXTOKEN 317
#if YYDEBUG
-char *yyname[] = {
+static char *yyname[] = {
"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
"'!'",0,0,"'$'","'%'","'&'",0,"'('","')'","'*'","'+'","','","'-'",0,0,0,0,0,0,0,
0,0,0,0,0,"':'","';'",0,0,0,"'?'","'@'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -1078,11 +1142,11 @@ char *yyname[] = {
"ANONSUB","PACKAGE","USE","WHILE","UNTIL","IF","UNLESS","ELSE","ELSIF",
"CONTINUE","FOR","LOOPEX","DOTDOT","FUNC0","FUNC1","FUNC","UNIOP","LSTOP",
"RELOP","EQOP","MULOP","ADDOP","DOLSHARP","DO","HASHBRACK","NOAMP","LOCAL","MY",
-"OROP","ANDOP","NOTOP","ASSIGNOP","OROR","ANDAND","BITOROP","BITANDOP",
-"SHIFTOP","MATCHOP","UMINUS","REFGEN","POWOP","PREINC","PREDEC","POSTINC",
-"POSTDEC","ARROW",
+"MYSUB","COLONATTR","PREC_LOW","OROP","ANDOP","NOTOP","ASSIGNOP","OROR",
+"ANDAND","BITOROP","BITANDOP","SHIFTOP","MATCHOP","UMINUS","REFGEN","POWOP",
+"PREINC","PREDEC","POSTINC","POSTDEC","ARROW",
};
-char *yyrule[] = {
+static char *yyrule[] = {
"$accept : prog",
"$$1 :",
"prog : $$1 lineseq",
@@ -1131,18 +1195,25 @@ char *yyrule[] = {
"label : LABEL",
"decl : format",
"decl : subrout",
+"decl : mysubrout",
"decl : package",
"decl : use",
"format : FORMAT startformsub formname block",
"formname : WORD",
"formname :",
-"subrout : SUB startsub subname proto subbody",
+"mysubrout : MYSUB startsub subname proto subattrlist subbody",
+"subrout : SUB startsub subname proto subattrlist subbody",
"startsub :",
"startanonsub :",
"startformsub :",
"subname : WORD",
"proto :",
"proto : THING",
+"subattrlist :",
+"subattrlist : COLONATTR THING",
+"subattrlist : COLONATTR",
+"myattrlist : COLONATTR THING",
+"myattrlist : COLONATTR",
"subbody : block",
"subbody : ';'",
"package : PACKAGE WORD ';'",
@@ -1158,6 +1229,7 @@ char *yyrule[] = {
"listop : LSTOP indirob argexpr",
"listop : FUNC '(' indirob expr ')'",
"listop : term ARROW method '(' listexprcom ')'",
+"listop : term ARROW method",
"listop : METHOD indirob listexpr",
"listop : FUNCMETH indirob '(' listexprcom ')'",
"listop : LSTOP listexpr",
@@ -1166,6 +1238,17 @@ char *yyrule[] = {
"listop : LSTOPSUB startanonsub block $$3 listexpr",
"method : METHOD",
"method : scalar",
+"subscripted : star '{' expr ';' '}'",
+"subscripted : scalar '[' expr ']'",
+"subscripted : term ARROW '[' expr ']'",
+"subscripted : subscripted '[' expr ']'",
+"subscripted : scalar '{' expr ';' '}'",
+"subscripted : term ARROW '{' expr ';' '}'",
+"subscripted : subscripted '{' expr ';' '}'",
+"subscripted : term ARROW '(' ')'",
+"subscripted : term ARROW '(' expr ')'",
+"subscripted : subscripted '(' expr ')'",
+"subscripted : subscripted '(' ')'",
"term : term ASSIGNOP term",
"term : term POWOP term",
"term : term MULOP term",
@@ -1189,26 +1272,21 @@ char *yyrule[] = {
"term : term POSTDEC",
"term : PREINC term",
"term : PREDEC term",
-"term : local term",
+"term : myattrterm",
+"term : LOCAL term",
"term : '(' expr ')'",
"term : '(' ')'",
"term : '[' expr ']'",
"term : '[' ']'",
"term : HASHBRACK expr ';' '}'",
"term : HASHBRACK ';' '}'",
-"term : ANONSUB startanonsub proto block",
+"term : ANONSUB startanonsub proto subattrlist block",
"term : scalar",
-"term : star '{' expr ';' '}'",
"term : star",
-"term : scalar '[' expr ']'",
-"term : term ARROW '[' expr ']'",
-"term : term '[' expr ']'",
"term : hsh",
"term : ary",
"term : arylen",
-"term : scalar '{' expr ';' '}'",
-"term : term ARROW '{' expr ';' '}'",
-"term : term '{' expr ';' '}'",
+"term : subscripted",
"term : '(' expr ')' '[' expr ']'",
"term : '(' ')' '[' expr ']'",
"term : ary '[' expr ']'",
@@ -1224,8 +1302,6 @@ char *yyrule[] = {
"term : DO WORD '(' expr ')'",
"term : DO scalar '(' ')'",
"term : DO scalar '(' expr ')'",
-"term : term ARROW '(' ')'",
-"term : term ARROW '(' expr ')'",
"term : LOOPEX",
"term : LOOPEX term",
"term : NOTOP argexpr",
@@ -1242,13 +1318,18 @@ char *yyrule[] = {
"term : PMFUNC '(' term ',' term ')'",
"term : WORD",
"term : listop",
+"myattrterm : MY myterm myattrlist",
+"myattrterm : MY myterm",
+"myterm : '(' expr ')'",
+"myterm : '(' ')'",
+"myterm : scalar",
+"myterm : hsh",
+"myterm : ary",
"listexpr :",
"listexpr : argexpr",
"listexprcom :",
"listexprcom : expr",
"listexprcom : expr ','",
-"local : LOCAL",
-"local : MY",
"my_scalar : scalar",
"amper : '&' indirob",
"scalar : '$' indirob",
@@ -1276,51 +1357,22 @@ char *yyrule[] = {
#define YYMAXDEPTH 500
#endif
#endif
-#ifndef PERL_OBJECT
-int yydebug;
-int yynerrs;
-int yyerrflag;
-int yychar;
-short *yyssp;
-YYSTYPE *yyvsp;
-YYSTYPE yyval;
-YYSTYPE yylval;
-#endif
-#line 643 "perly.y"
+#line 726 "perly.y"
/* PROGRAM */
-#line 1353 "perly.c"
-#define YYABORT goto yyabort
-#define YYACCEPT goto yyaccept
-#define YYERROR goto yyerrlab
-struct ysv {
- short* yyss;
- YYSTYPE* yyvs;
- int oldyydebug;
- int oldyynerrs;
- int oldyyerrflag;
- int oldyychar;
- YYSTYPE oldyyval;
- YYSTYPE oldyylval;
-};
+/* more stuff added to make perly_c.diff easier to apply */
-void
-yydestruct(void *ptr)
-{
- struct ysv* ysave = (struct ysv*)ptr;
- if (ysave->yyss) Safefree(ysave->yyss);
- if (ysave->yyvs) Safefree(ysave->yyvs);
- yydebug = ysave->oldyydebug;
- yynerrs = ysave->oldyynerrs;
- yyerrflag = ysave->oldyyerrflag;
- yychar = ysave->oldyychar;
- yyval = ysave->oldyyval;
- yylval = ysave->oldyylval;
- Safefree(ysave);
-}
+#ifdef yyparse
+#undef yyparse
+#endif
+#define yyparse() Perl_yyparse(pTHX)
+#line 1371 "perly.c"
+#define YYABORT goto yyabort
+#define YYACCEPT goto yyaccept
+#define YYERROR goto yyerrlab
int
-yyparse(void)
+yyparse()
{
register int yym, yyn, yystate;
register short *yyssp;
@@ -1331,21 +1383,18 @@ yyparse(void)
int retval = 0;
#if YYDEBUG
register char *yys;
-#ifndef __cplusplus
- extern char *getenv();
-#endif
#endif
struct ysv *ysave;
New(73, ysave, 1, struct ysv);
- SAVEDESTRUCTOR(yydestruct, ysave);
+ SAVEDESTRUCTOR_X(yydestruct, ysave);
ysave->oldyydebug = yydebug;
ysave->oldyynerrs = yynerrs;
ysave->oldyyerrflag = yyerrflag;
ysave->oldyychar = yychar;
ysave->oldyyval = yyval;
ysave->oldyylval = yylval;
-
+
#if YYDEBUG
if (yys = getenv("YYDEBUG"))
{
@@ -1406,10 +1455,8 @@ yyloop:
int yyps_index = (yyssp - yyss);
int yypv_index = (yyvsp - yyvs);
yystacksize += YYSTACKSIZE;
- ysave->yyvs = yyvs =
- (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
- ysave->yyss = yyss =
- (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+ ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+ ysave->yyss = Renew(yyss, yystacksize, short);
if (!yyvs || !yyss)
goto yyoverflow;
yyssp = yyss + yyps_index;
@@ -1450,8 +1497,8 @@ yyinrecovery:
#if YYDEBUG
if (yydebug)
PerlIO_printf(Perl_debug_log,
- "yydebug: state %d, error recovery shifting to state %d\n",
- *yyssp, yytable[yyn]);
+ "yydebug: state %d, error recovery shifting to state %d\n",
+ *yyssp, yytable[yyn]);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -1462,10 +1509,8 @@ yyinrecovery:
int yyps_index = (yyssp - yyss);
int yypv_index = (yyvsp - yyvs);
yystacksize += YYSTACKSIZE;
- ysave->yyvs = yyvs = (YYSTYPE*)PerlMem_realloc((char*)yyvs,
- yystacksize * sizeof(YYSTYPE));
- ysave->yyss = yyss = (short*)PerlMem_realloc((char*)yyss,
- yystacksize * sizeof(short));
+ ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+ ysave->yyss = Renew(yyss, yystacksize, short);
if (!yyvs || !yyss)
goto yyoverflow;
yyssp = yyss + yyps_index;
@@ -1479,9 +1524,8 @@ yyinrecovery:
{
#if YYDEBUG
if (yydebug)
- PerlIO_printf(Perl_debug_log,
- "yydebug: error recovery discarding state %d\n",
- *yyssp);
+ PerlIO_printf(Perl_debug_log, "yydebug: error recovery discarding state %d\n",
+ *yyssp);
#endif
if (yyssp <= yyss) goto yyabort;
--yyssp;
@@ -1498,9 +1542,8 @@ yyinrecovery:
yys = 0;
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
- PerlIO_printf(Perl_debug_log,
- "yydebug: state %d, error recovery discards token %d (%s)\n",
- yystate, yychar, yys);
+ PerlIO_printf(Perl_debug_log, "yydebug: state %d, error recovery discards token %d (%s)\n",
+ yystate, yychar, yys);
}
#endif
yychar = (-1);
@@ -1517,7 +1560,7 @@ yyreduce:
switch (yyn)
{
case 1:
-#line 94 "perly.y"
+#line 125 "perly.y"
{
#if defined(YYDEBUG) && defined(DEBUGGING)
yydebug = (PL_debug & 1);
@@ -1526,50 +1569,50 @@ case 1:
}
break;
case 2:
-#line 101 "perly.y"
+#line 132 "perly.y"
{ newPROG(yyvsp[0].opval); }
break;
case 3:
-#line 105 "perly.y"
+#line 136 "perly.y"
{ if (PL_copline > (line_t)yyvsp[-3].ival)
PL_copline = yyvsp[-3].ival;
yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
break;
case 4:
-#line 111 "perly.y"
+#line 142 "perly.y"
{ yyval.ival = block_start(TRUE); }
break;
case 5:
-#line 115 "perly.y"
+#line 146 "perly.y"
{ if (PL_copline > (line_t)yyvsp[-3].ival)
PL_copline = yyvsp[-3].ival;
yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); }
break;
case 6:
-#line 121 "perly.y"
+#line 152 "perly.y"
{ yyval.ival = block_start(FALSE); }
break;
case 7:
-#line 125 "perly.y"
+#line 156 "perly.y"
{ yyval.opval = Nullop; }
break;
case 8:
-#line 127 "perly.y"
+#line 158 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
case 9:
-#line 129 "perly.y"
+#line 160 "perly.y"
{ yyval.opval = append_list(OP_LINESEQ,
(LISTOP*)yyvsp[-1].opval, (LISTOP*)yyvsp[0].opval);
PL_pad_reset_pending = TRUE;
if (yyvsp[-1].opval && yyvsp[0].opval) PL_hints |= HINT_BLOCK_SCOPE; }
break;
case 10:
-#line 136 "perly.y"
+#line 167 "perly.y"
{ yyval.opval = newSTATEOP(0, yyvsp[-1].pval, yyvsp[0].opval); }
break;
case 12:
-#line 139 "perly.y"
+#line 170 "perly.y"
{ if (yyvsp[-1].pval != Nullch) {
yyval.opval = newSTATEOP(0, yyvsp[-1].pval, newOP(OP_NULL, 0));
}
@@ -1580,76 +1623,75 @@ case 12:
PL_expect = XSTATE; }
break;
case 13:
-#line 148 "perly.y"
+#line 179 "perly.y"
{ yyval.opval = newSTATEOP(0, yyvsp[-2].pval, yyvsp[-1].opval);
PL_expect = XSTATE; }
break;
case 14:
-#line 153 "perly.y"
+#line 184 "perly.y"
{ yyval.opval = Nullop; }
break;
case 15:
-#line 155 "perly.y"
+#line 186 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
case 16:
-#line 157 "perly.y"
+#line 188 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[0].opval, yyvsp[-2].opval); }
break;
case 17:
-#line 159 "perly.y"
+#line 190 "perly.y"
{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[0].opval, yyvsp[-2].opval); }
break;
case 18:
-#line 161 "perly.y"
+#line 192 "perly.y"
{ yyval.opval = newLOOPOP(OPf_PARENS, 1, scalar(yyvsp[0].opval), yyvsp[-2].opval); }
break;
case 19:
-#line 163 "perly.y"
+#line 194 "perly.y"
{ yyval.opval = newLOOPOP(OPf_PARENS, 1, yyvsp[0].opval, yyvsp[-2].opval);}
break;
case 20:
-#line 165 "perly.y"
+#line 196 "perly.y"
{ yyval.opval = newFOROP(0, Nullch, yyvsp[-1].ival,
Nullop, yyvsp[0].opval, yyvsp[-2].opval, Nullop); }
break;
case 21:
-#line 170 "perly.y"
+#line 201 "perly.y"
{ yyval.opval = Nullop; }
break;
case 22:
-#line 172 "perly.y"
-{ yyval.opval = scope(yyvsp[0].opval); }
+#line 203 "perly.y"
+{ (yyvsp[0].opval)->op_flags |= OPf_PARENS; yyval.opval = scope(yyvsp[0].opval); }
break;
case 23:
-#line 174 "perly.y"
+#line 205 "perly.y"
{ PL_copline = yyvsp[-5].ival;
- yyval.opval = newSTATEOP(0, Nullch,
- newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval));
+ yyval.opval = newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval);
PL_hints |= HINT_BLOCK_SCOPE; }
break;
case 24:
-#line 181 "perly.y"
+#line 211 "perly.y"
{ PL_copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
break;
case 25:
-#line 185 "perly.y"
+#line 215 "perly.y"
{ PL_copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); }
break;
case 26:
-#line 191 "perly.y"
+#line 221 "perly.y"
{ yyval.opval = Nullop; }
break;
case 27:
-#line 193 "perly.y"
+#line 223 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
case 28:
-#line 197 "perly.y"
+#line 227 "perly.y"
{ PL_copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newSTATEOP(0, yyvsp[-7].pval,
@@ -1657,7 +1699,7 @@ case 28:
yyvsp[-6].ival, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
break;
case 29:
-#line 203 "perly.y"
+#line 233 "perly.y"
{ PL_copline = yyvsp[-6].ival;
yyval.opval = block_end(yyvsp[-4].ival,
newSTATEOP(0, yyvsp[-7].pval,
@@ -1665,23 +1707,23 @@ case 29:
yyvsp[-6].ival, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); }
break;
case 30:
-#line 209 "perly.y"
+#line 239 "perly.y"
{ yyval.opval = block_end(yyvsp[-6].ival,
newFOROP(0, yyvsp[-9].pval, yyvsp[-8].ival, yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 31:
-#line 212 "perly.y"
+#line 242 "perly.y"
{ yyval.opval = block_end(yyvsp[-4].ival,
newFOROP(0, yyvsp[-8].pval, yyvsp[-7].ival, mod(yyvsp[-6].opval, OP_ENTERLOOP),
yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 32:
-#line 216 "perly.y"
+#line 246 "perly.y"
{ yyval.opval = block_end(yyvsp[-4].ival,
newFOROP(0, yyvsp[-7].pval, yyvsp[-6].ival, Nullop, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 33:
-#line 220 "perly.y"
+#line 250 "perly.y"
{ OP *forop = append_elem(OP_LINESEQ,
scalar(yyvsp[-6].opval),
newWHILEOP(0, 1, (LOOP*)Nullop,
@@ -1691,395 +1733,459 @@ case 33:
yyval.opval = block_end(yyvsp[-7].ival, newSTATEOP(0, yyvsp[-10].pval, forop)); }
break;
case 34:
-#line 228 "perly.y"
+#line 258 "perly.y"
{ yyval.opval = newSTATEOP(0, yyvsp[-2].pval,
newWHILEOP(0, 1, (LOOP*)Nullop,
NOLINE, Nullop, yyvsp[-1].opval, yyvsp[0].opval)); }
break;
case 35:
-#line 234 "perly.y"
+#line 264 "perly.y"
{ yyval.opval = Nullop; }
break;
case 37:
-#line 239 "perly.y"
+#line 269 "perly.y"
{ (void)scan_num("1"); yyval.opval = yylval.opval; }
break;
case 39:
-#line 244 "perly.y"
+#line 274 "perly.y"
{ yyval.opval = invert(scalar(yyvsp[0].opval)); }
break;
case 40:
-#line 248 "perly.y"
+#line 278 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 41:
-#line 252 "perly.y"
+#line 282 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 42:
-#line 256 "perly.y"
+#line 286 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 43:
-#line 260 "perly.y"
+#line 290 "perly.y"
{ yyval.opval = yyvsp[0].opval; intro_my(); }
break;
case 44:
-#line 264 "perly.y"
+#line 294 "perly.y"
{ yyval.pval = Nullch; }
break;
case 46:
-#line 269 "perly.y"
+#line 299 "perly.y"
{ yyval.ival = 0; }
break;
case 47:
-#line 271 "perly.y"
+#line 301 "perly.y"
{ yyval.ival = 0; }
break;
case 48:
-#line 273 "perly.y"
+#line 303 "perly.y"
{ yyval.ival = 0; }
break;
case 49:
-#line 275 "perly.y"
+#line 305 "perly.y"
{ yyval.ival = 0; }
break;
case 50:
-#line 279 "perly.y"
-{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
+#line 307 "perly.y"
+{ yyval.ival = 0; }
break;
case 51:
-#line 282 "perly.y"
-{ yyval.opval = yyvsp[0].opval; }
+#line 311 "perly.y"
+{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
break;
case 52:
-#line 283 "perly.y"
-{ yyval.opval = Nullop; }
+#line 314 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
break;
case 53:
-#line 287 "perly.y"
-{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
+#line 315 "perly.y"
+{ yyval.opval = Nullop; }
break;
case 54:
-#line 291 "perly.y"
-{ yyval.ival = start_subparse(FALSE, 0); }
+#line 319 "perly.y"
+{ newMYSUB(yyvsp[-4].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
break;
case 55:
-#line 295 "perly.y"
-{ yyval.ival = start_subparse(FALSE, CVf_ANON); }
+#line 323 "perly.y"
+{ newATTRSUB(yyvsp[-4].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
break;
case 56:
-#line 299 "perly.y"
-{ yyval.ival = start_subparse(TRUE, 0); }
+#line 327 "perly.y"
+{ yyval.ival = start_subparse(FALSE, 0); }
break;
case 57:
-#line 302 "perly.y"
-{ STRLEN n_a; char *name = SvPV(((SVOP*)yyvsp[0].opval)->op_sv, n_a);
+#line 331 "perly.y"
+{ yyval.ival = start_subparse(FALSE, CVf_ANON); }
+break;
+case 58:
+#line 335 "perly.y"
+{ yyval.ival = start_subparse(TRUE, 0); }
+break;
+case 59:
+#line 338 "perly.y"
+{ STRLEN n_a; char *name = SvPV(((SVOP*)yyvsp[0].opval)->op_sv,n_a);
if (strEQ(name, "BEGIN") || strEQ(name, "END")
- || strEQ(name, "INIT"))
+ || strEQ(name, "INIT") || strEQ(name, "CHECK"))
CvSPECIAL_on(PL_compcv);
yyval.opval = yyvsp[0].opval; }
break;
-case 58:
-#line 310 "perly.y"
+case 60:
+#line 346 "perly.y"
{ yyval.opval = Nullop; }
break;
-case 60:
-#line 314 "perly.y"
+case 62:
+#line 351 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 63:
+#line 353 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 61:
-#line 315 "perly.y"
+case 64:
+#line 355 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 65:
+#line 359 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 66:
+#line 361 "perly.y"
+{ yyval.opval = Nullop; }
+break;
+case 67:
+#line 364 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 68:
+#line 365 "perly.y"
{ yyval.opval = Nullop; PL_expect = XSTATE; }
break;
-case 62:
-#line 319 "perly.y"
+case 69:
+#line 369 "perly.y"
{ package(yyvsp[-1].opval); }
break;
-case 63:
-#line 321 "perly.y"
+case 70:
+#line 371 "perly.y"
{ package(Nullop); }
break;
-case 64:
-#line 325 "perly.y"
+case 71:
+#line 375 "perly.y"
{ CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
break;
-case 65:
-#line 327 "perly.y"
+case 72:
+#line 377 "perly.y"
{ utilize(yyvsp[-6].ival, yyvsp[-5].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); }
break;
-case 66:
-#line 331 "perly.y"
+case 73:
+#line 381 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 67:
-#line 333 "perly.y"
+case 74:
+#line 383 "perly.y"
{ yyval.opval = newLOGOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 69:
-#line 338 "perly.y"
+case 76:
+#line 388 "perly.y"
{ yyval.opval = yyvsp[-1].opval; }
break;
-case 70:
-#line 340 "perly.y"
+case 77:
+#line 390 "perly.y"
{ yyval.opval = append_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 72:
-#line 345 "perly.y"
+case 79:
+#line 395 "perly.y"
{ yyval.opval = convert(yyvsp[-2].ival, OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(yyvsp[-2].ival,yyvsp[-1].opval), yyvsp[0].opval) ); }
break;
-case 73:
-#line 348 "perly.y"
+case 80:
+#line 398 "perly.y"
{ yyval.opval = convert(yyvsp[-4].ival, OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(yyvsp[-4].ival,yyvsp[-2].opval), yyvsp[-1].opval) ); }
break;
-case 74:
-#line 351 "perly.y"
+case 81:
+#line 401 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, scalar(yyvsp[-5].opval), yyvsp[-1].opval),
newUNOP(OP_METHOD, 0, yyvsp[-3].opval))); }
break;
-case 75:
-#line 356 "perly.y"
+case 82:
+#line 406 "perly.y"
+{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, scalar(yyvsp[-2].opval),
+ newUNOP(OP_METHOD, 0, yyvsp[0].opval))); }
+break;
+case 83:
+#line 410 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, yyvsp[-1].opval, yyvsp[0].opval),
newUNOP(OP_METHOD, 0, yyvsp[-2].opval))); }
break;
-case 76:
-#line 361 "perly.y"
+case 84:
+#line 415 "perly.y"
{ yyval.opval = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, yyvsp[-3].opval, yyvsp[-1].opval),
newUNOP(OP_METHOD, 0, yyvsp[-4].opval))); }
break;
-case 77:
-#line 366 "perly.y"
+case 85:
+#line 420 "perly.y"
{ yyval.opval = convert(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 78:
-#line 368 "perly.y"
+case 86:
+#line 422 "perly.y"
{ yyval.opval = convert(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
break;
-case 79:
-#line 370 "perly.y"
-{ yyvsp[0].opval = newANONSUB(yyvsp[-1].ival, 0, yyvsp[0].opval); }
+case 87:
+#line 424 "perly.y"
+{ yyvsp[0].opval = newANONATTRSUB(yyvsp[-1].ival, 0, Nullop, yyvsp[0].opval); }
break;
-case 80:
-#line 372 "perly.y"
+case 88:
+#line 426 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval), yyvsp[-4].opval)); }
break;
-case 83:
-#line 382 "perly.y"
+case 91:
+#line 436 "perly.y"
+{ yyval.opval = newBINOP(OP_GELEM, 0, yyvsp[-4].opval, scalar(yyvsp[-2].opval)); }
+break;
+case 92:
+#line 438 "perly.y"
+{ yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); }
+break;
+case 93:
+#line 440 "perly.y"
+{ yyval.opval = newBINOP(OP_AELEM, 0,
+ ref(newAVREF(yyvsp[-4].opval),OP_RV2AV),
+ scalar(yyvsp[-1].opval));}
+break;
+case 94:
+#line 444 "perly.y"
+{ yyval.opval = newBINOP(OP_AELEM, 0,
+ ref(newAVREF(yyvsp[-3].opval),OP_RV2AV),
+ scalar(yyvsp[-1].opval));}
+break;
+case 95:
+#line 448 "perly.y"
+{ yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval));
+ PL_expect = XOPERATOR; }
+break;
+case 96:
+#line 451 "perly.y"
+{ yyval.opval = newBINOP(OP_HELEM, 0,
+ ref(newHVREF(yyvsp[-5].opval),OP_RV2HV),
+ jmaybe(yyvsp[-2].opval));
+ PL_expect = XOPERATOR; }
+break;
+case 97:
+#line 456 "perly.y"
+{ yyval.opval = newBINOP(OP_HELEM, 0,
+ ref(newHVREF(yyvsp[-4].opval),OP_RV2HV),
+ jmaybe(yyvsp[-2].opval));
+ PL_expect = XOPERATOR; }
+break;
+case 98:
+#line 461 "perly.y"
+{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ newCVREF(0, scalar(yyvsp[-3].opval))); }
+break;
+case 99:
+#line 464 "perly.y"
+{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, yyvsp[-1].opval,
+ newCVREF(0, scalar(yyvsp[-4].opval)))); }
+break;
+case 100:
+#line 469 "perly.y"
+{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, yyvsp[-1].opval,
+ newCVREF(0, scalar(yyvsp[-3].opval)))); }
+break;
+case 101:
+#line 473 "perly.y"
+{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ newCVREF(0, scalar(yyvsp[-2].opval))); }
+break;
+case 102:
+#line 479 "perly.y"
{ yyval.opval = newASSIGNOP(OPf_STACKED, yyvsp[-2].opval, yyvsp[-1].ival, yyvsp[0].opval); }
break;
-case 84:
-#line 384 "perly.y"
+case 103:
+#line 481 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 85:
-#line 386 "perly.y"
+case 104:
+#line 483 "perly.y"
{ if (yyvsp[-1].ival != OP_REPEAT)
scalar(yyvsp[-2].opval);
yyval.opval = newBINOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, scalar(yyvsp[0].opval)); }
break;
-case 86:
-#line 390 "perly.y"
+case 105:
+#line 487 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 87:
-#line 392 "perly.y"
+case 106:
+#line 489 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 88:
-#line 394 "perly.y"
+case 107:
+#line 491 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 89:
-#line 396 "perly.y"
+case 108:
+#line 493 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 90:
-#line 398 "perly.y"
+case 109:
+#line 495 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 91:
-#line 400 "perly.y"
+case 110:
+#line 497 "perly.y"
{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); }
break;
-case 92:
-#line 402 "perly.y"
+case 111:
+#line 499 "perly.y"
{ yyval.opval = newRANGE(yyvsp[-1].ival, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval));}
break;
-case 93:
-#line 404 "perly.y"
+case 112:
+#line 501 "perly.y"
{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 94:
-#line 406 "perly.y"
+case 113:
+#line 503 "perly.y"
{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 95:
-#line 408 "perly.y"
+case 114:
+#line 505 "perly.y"
{ yyval.opval = newCONDOP(0, yyvsp[-4].opval, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 96:
-#line 410 "perly.y"
+case 115:
+#line 507 "perly.y"
{ yyval.opval = bind_match(yyvsp[-1].ival, yyvsp[-2].opval, yyvsp[0].opval); }
break;
-case 97:
-#line 413 "perly.y"
+case 116:
+#line 510 "perly.y"
{ yyval.opval = newUNOP(OP_NEGATE, 0, scalar(yyvsp[0].opval)); }
break;
-case 98:
-#line 415 "perly.y"
+case 117:
+#line 512 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 99:
-#line 417 "perly.y"
+case 118:
+#line 514 "perly.y"
{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
break;
-case 100:
-#line 419 "perly.y"
+case 119:
+#line 516 "perly.y"
{ yyval.opval = newUNOP(OP_COMPLEMENT, 0, scalar(yyvsp[0].opval));}
break;
-case 101:
-#line 421 "perly.y"
+case 120:
+#line 518 "perly.y"
{ yyval.opval = newUNOP(OP_REFGEN, 0, mod(yyvsp[0].opval,OP_REFGEN)); }
break;
-case 102:
-#line 423 "perly.y"
+case 121:
+#line 520 "perly.y"
{ yyval.opval = newUNOP(OP_POSTINC, 0,
mod(scalar(yyvsp[-1].opval), OP_POSTINC)); }
break;
-case 103:
-#line 426 "perly.y"
+case 122:
+#line 523 "perly.y"
{ yyval.opval = newUNOP(OP_POSTDEC, 0,
mod(scalar(yyvsp[-1].opval), OP_POSTDEC)); }
break;
-case 104:
-#line 429 "perly.y"
+case 123:
+#line 526 "perly.y"
{ yyval.opval = newUNOP(OP_PREINC, 0,
mod(scalar(yyvsp[0].opval), OP_PREINC)); }
break;
-case 105:
-#line 432 "perly.y"
+case 124:
+#line 529 "perly.y"
{ yyval.opval = newUNOP(OP_PREDEC, 0,
mod(scalar(yyvsp[0].opval), OP_PREDEC)); }
break;
-case 106:
-#line 435 "perly.y"
+case 125:
+#line 532 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 126:
+#line 534 "perly.y"
{ yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); }
break;
-case 107:
-#line 437 "perly.y"
+case 127:
+#line 536 "perly.y"
{ yyval.opval = sawparens(yyvsp[-1].opval); }
break;
-case 108:
-#line 439 "perly.y"
+case 128:
+#line 538 "perly.y"
{ yyval.opval = sawparens(newNULLLIST()); }
break;
-case 109:
-#line 441 "perly.y"
+case 129:
+#line 540 "perly.y"
{ yyval.opval = newANONLIST(yyvsp[-1].opval); }
break;
-case 110:
-#line 443 "perly.y"
+case 130:
+#line 542 "perly.y"
{ yyval.opval = newANONLIST(Nullop); }
break;
-case 111:
-#line 445 "perly.y"
+case 131:
+#line 544 "perly.y"
{ yyval.opval = newANONHASH(yyvsp[-2].opval); }
break;
-case 112:
-#line 447 "perly.y"
+case 132:
+#line 546 "perly.y"
{ yyval.opval = newANONHASH(Nullop); }
break;
-case 113:
-#line 449 "perly.y"
-{ yyval.opval = newANONSUB(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); }
+case 133:
+#line 548 "perly.y"
+{ yyval.opval = newANONATTRSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); }
break;
-case 114:
-#line 451 "perly.y"
+case 134:
+#line 550 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 115:
-#line 453 "perly.y"
-{ yyval.opval = newBINOP(OP_GELEM, 0, yyvsp[-4].opval, scalar(yyvsp[-2].opval)); }
-break;
-case 116:
-#line 455 "perly.y"
+case 135:
+#line 552 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 117:
-#line 457 "perly.y"
-{ yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); }
-break;
-case 118:
-#line 459 "perly.y"
-{ yyval.opval = newBINOP(OP_AELEM, 0,
- ref(newAVREF(yyvsp[-4].opval),OP_RV2AV),
- scalar(yyvsp[-1].opval));}
-break;
-case 119:
-#line 463 "perly.y"
-{ assertref(yyvsp[-3].opval); yyval.opval = newBINOP(OP_AELEM, 0,
- ref(newAVREF(yyvsp[-3].opval),OP_RV2AV),
- scalar(yyvsp[-1].opval));}
-break;
-case 120:
-#line 467 "perly.y"
+case 136:
+#line 554 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 121:
-#line 469 "perly.y"
+case 137:
+#line 556 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 122:
-#line 471 "perly.y"
+case 138:
+#line 558 "perly.y"
{ yyval.opval = newUNOP(OP_AV2ARYLEN, 0, ref(yyvsp[0].opval, OP_AV2ARYLEN));}
break;
-case 123:
-#line 473 "perly.y"
-{ yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval));
- PL_expect = XOPERATOR; }
-break;
-case 124:
-#line 476 "perly.y"
-{ yyval.opval = newBINOP(OP_HELEM, 0,
- ref(newHVREF(yyvsp[-5].opval),OP_RV2HV),
- jmaybe(yyvsp[-2].opval));
- PL_expect = XOPERATOR; }
-break;
-case 125:
-#line 481 "perly.y"
-{ assertref(yyvsp[-4].opval); yyval.opval = newBINOP(OP_HELEM, 0,
- ref(newHVREF(yyvsp[-4].opval),OP_RV2HV),
- jmaybe(yyvsp[-2].opval));
- PL_expect = XOPERATOR; }
+case 139:
+#line 560 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
break;
-case 126:
-#line 486 "perly.y"
+case 140:
+#line 562 "perly.y"
{ yyval.opval = newSLICEOP(0, yyvsp[-1].opval, yyvsp[-4].opval); }
break;
-case 127:
-#line 488 "perly.y"
+case 141:
+#line 564 "perly.y"
{ yyval.opval = newSLICEOP(0, yyvsp[-1].opval, Nullop); }
break;
-case 128:
-#line 490 "perly.y"
+case 142:
+#line 566 "perly.y"
{ yyval.opval = prepend_elem(OP_ASLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_ASLICE, 0,
list(yyvsp[-1].opval),
ref(yyvsp[-3].opval, OP_ASLICE))); }
break;
-case 129:
-#line 496 "perly.y"
+case 143:
+#line 572 "perly.y"
{ yyval.opval = prepend_elem(OP_HSLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_HSLICE, 0,
@@ -2087,38 +2193,38 @@ case 129:
ref(oopsHV(yyvsp[-4].opval), OP_HSLICE)));
PL_expect = XOPERATOR; }
break;
-case 130:
-#line 503 "perly.y"
+case 144:
+#line 579 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 131:
-#line 505 "perly.y"
+case 145:
+#line 581 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, 0, scalar(yyvsp[0].opval)); }
break;
-case 132:
-#line 507 "perly.y"
+case 146:
+#line 583 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar(yyvsp[-2].opval)); }
break;
-case 133:
-#line 509 "perly.y"
+case 147:
+#line 585 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[-1].opval, scalar(yyvsp[-3].opval))); }
break;
-case 134:
-#line 512 "perly.y"
+case 148:
+#line 588 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
break;
-case 135:
-#line 515 "perly.y"
+case 149:
+#line 591 "perly.y"
{ yyval.opval = dofile(yyvsp[0].opval); }
break;
-case 136:
-#line 517 "perly.y"
+case 150:
+#line 593 "perly.y"
{ yyval.opval = newUNOP(OP_NULL, OPf_SPECIAL, scope(yyvsp[0].opval)); }
break;
-case 137:
-#line 519 "perly.y"
+case 151:
+#line 595 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
@@ -2127,8 +2233,8 @@ case 137:
scalar(yyvsp[-2].opval)
)),Nullop)); dep();}
break;
-case 138:
-#line 527 "perly.y"
+case 152:
+#line 603 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
append_elem(OP_LIST,
@@ -2138,162 +2244,171 @@ case 138:
scalar(yyvsp[-3].opval)
)))); dep();}
break;
-case 139:
-#line 536 "perly.y"
+case 153:
+#line 612 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
scalar(newCVREF(0,scalar(yyvsp[-2].opval))), Nullop)); dep();}
break;
-case 140:
-#line 540 "perly.y"
+case 154:
+#line 616 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
yyvsp[-1].opval,
scalar(newCVREF(0,scalar(yyvsp[-3].opval))))); dep();}
break;
-case 141:
-#line 545 "perly.y"
-{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
- newCVREF(0, scalar(yyvsp[-3].opval))); }
-break;
-case 142:
-#line 548 "perly.y"
-{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
- append_elem(OP_LIST, yyvsp[-1].opval,
- newCVREF(0, scalar(yyvsp[-4].opval)))); }
-break;
-case 143:
-#line 552 "perly.y"
+case 155:
+#line 621 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, OPf_SPECIAL);
PL_hints |= HINT_BLOCK_SCOPE; }
break;
-case 144:
-#line 555 "perly.y"
+case 156:
+#line 624 "perly.y"
{ yyval.opval = newLOOPEX(yyvsp[-1].ival,yyvsp[0].opval); }
break;
-case 145:
-#line 557 "perly.y"
+case 157:
+#line 626 "perly.y"
{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); }
break;
-case 146:
-#line 559 "perly.y"
+case 158:
+#line 628 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, 0); }
break;
-case 147:
-#line 561 "perly.y"
+case 159:
+#line 630 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 148:
-#line 563 "perly.y"
+case 160:
+#line 632 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); }
break;
-case 149:
-#line 565 "perly.y"
+case 161:
+#line 634 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); }
break;
-case 150:
-#line 568 "perly.y"
+case 162:
+#line 637 "perly.y"
{ yyval.opval = newOP(yyvsp[0].ival, 0); }
break;
-case 151:
-#line 570 "perly.y"
+case 163:
+#line 639 "perly.y"
{ yyval.opval = newOP(yyvsp[-2].ival, 0); }
break;
-case 152:
-#line 572 "perly.y"
+case 164:
+#line 641 "perly.y"
{ yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED,
scalar(yyvsp[0].opval)); }
break;
-case 153:
-#line 575 "perly.y"
+case 165:
+#line 644 "perly.y"
{ yyval.opval = newOP(yyvsp[-2].ival, OPf_SPECIAL); }
break;
-case 154:
-#line 577 "perly.y"
+case 166:
+#line 646 "perly.y"
{ yyval.opval = newUNOP(yyvsp[-3].ival, 0, yyvsp[-1].opval); }
break;
-case 155:
-#line 579 "perly.y"
+case 167:
+#line 648 "perly.y"
{ yyval.opval = pmruntime(yyvsp[-3].opval, yyvsp[-1].opval, Nullop); }
break;
-case 156:
-#line 581 "perly.y"
+case 168:
+#line 650 "perly.y"
{ yyval.opval = pmruntime(yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval); }
break;
-case 159:
-#line 587 "perly.y"
-{ yyval.opval = Nullop; }
+case 171:
+#line 656 "perly.y"
+{ yyval.opval = my_attrs(yyvsp[-1].opval,yyvsp[0].opval); }
break;
-case 160:
-#line 589 "perly.y"
+case 172:
+#line 658 "perly.y"
+{ yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); }
+break;
+case 173:
+#line 662 "perly.y"
+{ yyval.opval = sawparens(yyvsp[-1].opval); }
+break;
+case 174:
+#line 664 "perly.y"
+{ yyval.opval = sawparens(newNULLLIST()); }
+break;
+case 175:
+#line 666 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 161:
-#line 593 "perly.y"
+case 176:
+#line 668 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 177:
+#line 670 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
+break;
+case 178:
+#line 674 "perly.y"
{ yyval.opval = Nullop; }
break;
-case 162:
-#line 595 "perly.y"
+case 179:
+#line 676 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-case 163:
-#line 597 "perly.y"
-{ yyval.opval = yyvsp[-1].opval; }
+case 180:
+#line 680 "perly.y"
+{ yyval.opval = Nullop; }
break;
-case 164:
-#line 600 "perly.y"
-{ yyval.ival = 0; }
+case 181:
+#line 682 "perly.y"
+{ yyval.opval = yyvsp[0].opval; }
break;
-case 165:
-#line 601 "perly.y"
-{ yyval.ival = 1; }
+case 182:
+#line 684 "perly.y"
+{ yyval.opval = yyvsp[-1].opval; }
break;
-case 166:
-#line 605 "perly.y"
+case 183:
+#line 688 "perly.y"
{ PL_in_my = 0; yyval.opval = my(yyvsp[0].opval); }
break;
-case 167:
-#line 609 "perly.y"
+case 184:
+#line 692 "perly.y"
{ yyval.opval = newCVREF(yyvsp[-1].ival,yyvsp[0].opval); }
break;
-case 168:
-#line 613 "perly.y"
+case 185:
+#line 696 "perly.y"
{ yyval.opval = newSVREF(yyvsp[0].opval); }
break;
-case 169:
-#line 617 "perly.y"
+case 186:
+#line 700 "perly.y"
{ yyval.opval = newAVREF(yyvsp[0].opval); }
break;
-case 170:
-#line 621 "perly.y"
+case 187:
+#line 704 "perly.y"
{ yyval.opval = newHVREF(yyvsp[0].opval); }
break;
-case 171:
-#line 625 "perly.y"
+case 188:
+#line 708 "perly.y"
{ yyval.opval = newAVREF(yyvsp[0].opval); }
break;
-case 172:
-#line 629 "perly.y"
+case 189:
+#line 712 "perly.y"
{ yyval.opval = newGVREF(0,yyvsp[0].opval); }
break;
-case 173:
-#line 633 "perly.y"
+case 190:
+#line 716 "perly.y"
{ yyval.opval = scalar(yyvsp[0].opval); }
break;
-case 174:
-#line 635 "perly.y"
+case 191:
+#line 718 "perly.y"
{ yyval.opval = scalar(yyvsp[0].opval); }
break;
-case 175:
-#line 637 "perly.y"
+case 192:
+#line 720 "perly.y"
{ yyval.opval = scope(yyvsp[0].opval); }
break;
-case 176:
-#line 640 "perly.y"
+case 193:
+#line 723 "perly.y"
{ yyval.opval = yyvsp[0].opval; }
break;
-#line 2270 "perly.c"
+#line 2412 "perly.c"
}
yyssp -= yym;
yystate = *yyssp;
@@ -2304,8 +2419,8 @@ break;
#if YYDEBUG
if (yydebug)
PerlIO_printf(Perl_debug_log,
- "yydebug: after reduction, shifting from state 0 to state %d\n",
- YYFINAL);
+ "yydebug: after reduction, shifting from state 0 to state %d\n",
+ YYFINAL);
#endif
yystate = YYFINAL;
*++yyssp = YYFINAL;
@@ -2335,8 +2450,8 @@ break;
#if YYDEBUG
if (yydebug)
PerlIO_printf(Perl_debug_log,
- "yydebug: after reduction, shifting from state %d to state %d\n",
- *yyssp, yystate);
+ "yydebug: after reduction, shifting from state %d to state %d\n",
+ *yyssp, yystate);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -2347,10 +2462,8 @@ break;
int yyps_index = (yyssp - yyss);
int yypv_index = (yyvsp - yyvs);
yystacksize += YYSTACKSIZE;
- ysave->yyvs = yyvs =
- (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
- ysave->yyss = yyss =
- (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+ ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+ ysave->yyss = Renew(yyss, yystacksize, short);
if (!yyvs || !yyss)
goto yyoverflow;
yyssp = yyss + yyps_index;
@@ -2366,3 +2479,22 @@ yyabort:
yyaccept:
return retval;
}
+
+#ifdef PERL_OBJECT
+#include "XSUB.h"
+#endif
+
+static void
+yydestruct(pTHXo_ void *ptr)
+{
+ struct ysv* ysave = (struct ysv*)ptr;
+ if (ysave->yyss) Safefree(ysave->yyss);
+ if (ysave->yyvs) Safefree(ysave->yyvs);
+ yydebug = ysave->oldyydebug;
+ yynerrs = ysave->oldyynerrs;
+ yyerrflag = ysave->oldyyerrflag;
+ yychar = ysave->oldyychar;
+ yyval = ysave->oldyyval;
+ yylval = ysave->oldyylval;
+ Safefree(ysave);
+}
diff --git a/contrib/perl5/perly.fixer b/contrib/perl5/perly.fixer
index afe1a38..daa558e 100755
--- a/contrib/perl5/perly.fixer
+++ b/contrib/perl5/perly.fixer
@@ -21,15 +21,34 @@ tmp=/tmp/f$$
if grep 'yaccpar 1.8 (Berkeley)' $input >/dev/null 2>&1; then
cp $input $output
+ # Don't expect the diff to do everything -- do some by hand
if test -f perly_c.diff; then
patch -F3 $output <perly_c.diff
+ sed -e '/^[ ]*printf("yydebug:/s/printf(/PerlIO_printf(Perl_debug_log, /' \
+ -e '/^#line /s/"y[.]tab[.]c"/"perly.c"/' \
+ -e '/\[\] *= *[{]/s/^/static /' \
+ -e '/^static static/s/^static //' \
+ -e '/^#define.WORD/,/^#define.ARROW/d' \
+ -e '/^int.yydebug/,/^#define.yystacksize/d' \
+ < $output > $tmp && mv -f $tmp $output || exit 1
rm -rf $input
+ echo "If you need to debug perly.c, you need to fix up the #line"
+ echo "directives yourself."
fi
exit
elif grep 'yaccpar 1.9 (Berkeley)' $input >/dev/null 2>&1; then
if test -f perly.c.dif9; then
patch -F3 $output <perly.c.dif9
+ sed -e '/^[ ]*printf("yydebug:/s/printf(/PerlIO_printf(Perl_debug_log, /' \
+ -e '/^#line /s/"y[.]tab[.]c"/"perly.c"/' \
+ -e '/\[\] *= *[{]/s/^/static /' \
+ -e '/^static static/s/^static //' \
+ -e '/^#define.WORD/,/^#define.ARROW/d' \
+ -e '/^int.yydebug/,/^#define.yystacksize/d' \
+ < $output > $tmp && mv -f $tmp $output || exit 1
rm -rf $input
+ echo "If you need to debug perly.c, you need to fix up the #line"
+ echo "directives yourself."
exit 0
else
echo "Diffs from byacc-1.9 are not available."
@@ -90,7 +109,7 @@ case "$plan" in
# Also added are out of memory checks (makes porting the generated
# code easier) For most systems, it can't hurt. -- TD
"bsd43")
- echo "Attempting to path perly.c to allow dynamic yacc stack allocation"
+ echo "Attempting to patch perly.c to allow dynamic yacc stack allocation"
echo "Assuming bsd4.3 yaccpar"
cat >$tmp <<'END'
/YYSTYPE[ ]*yyv\[ *YYMAXDEPTH *\];/c\
@@ -145,7 +164,7 @@ END
#######################################################
"isc") # Interactive Systems 2.2 version
- echo "Attempting to path perly.c to allow dynamic yacc stack allocation"
+ echo "Attempting to patch perly.c to allow dynamic yacc stack allocation"
echo "Assuming Interactive SysVr3 2.2 yaccpar"
# Easier to simply put whole script here than to modify the
# bsd script with sed.
diff --git a/contrib/perl5/perly.h b/contrib/perl5/perly.h
index c1f7806..15dfa0c 100644
--- a/contrib/perl5/perly.h
+++ b/contrib/perl5/perly.h
@@ -1,3 +1,4 @@
+#ifdef PERL_CORE
#define WORD 257
#define METHOD 258
#define FUNCMETH 259
@@ -38,28 +39,32 @@
#define NOAMP 294
#define LOCAL 295
#define MY 296
-#define OROP 297
-#define ANDOP 298
-#define NOTOP 299
-#define ASSIGNOP 300
-#define OROR 301
-#define ANDAND 302
-#define BITOROP 303
-#define BITANDOP 304
-#define SHIFTOP 305
-#define MATCHOP 306
-#define UMINUS 307
-#define REFGEN 308
-#define POWOP 309
-#define PREINC 310
-#define PREDEC 311
-#define POSTINC 312
-#define POSTDEC 313
-#define ARROW 314
+#define MYSUB 297
+#define COLONATTR 298
+#define PREC_LOW 299
+#define OROP 300
+#define ANDOP 301
+#define NOTOP 302
+#define ASSIGNOP 303
+#define OROR 304
+#define ANDAND 305
+#define BITOROP 306
+#define BITANDOP 307
+#define SHIFTOP 308
+#define MATCHOP 309
+#define UMINUS 310
+#define REFGEN 311
+#define POWOP 312
+#define PREINC 313
+#define PREDEC 314
+#define POSTINC 315
+#define POSTDEC 316
+#define ARROW 317
+#endif /* PERL_CORE */
+
typedef union {
I32 ival;
char *pval;
OP *opval;
GV *gvval;
} YYSTYPE;
-extern YYSTYPE yylval;
diff --git a/contrib/perl5/perly.y b/contrib/perl5/perly.y
index 41c6acd..5170b36 100644
--- a/contrib/perl5/perly.y
+++ b/contrib/perl5/perly.y
@@ -1,6 +1,6 @@
/* perly.y
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -14,20 +14,39 @@
%{
#include "EXTERN.h"
+#define PERL_IN_PERLY_C
#include "perl.h"
-static void
-dep(void)
-{
- deprecate("\"do\" to call subroutines");
-}
+#define dep() deprecate("\"do\" to call subroutines")
+
+/* stuff included here to make perly_c.diff apply better */
+
+#define yydebug PL_yydebug
+#define yynerrs PL_yynerrs
+#define yyerrflag PL_yyerrflag
+#define yychar PL_yychar
+#define yyval PL_yyval
+#define yylval PL_yylval
+
+struct ysv {
+ short* yyss;
+ YYSTYPE* yyvs;
+ int oldyydebug;
+ int oldyynerrs;
+ int oldyyerrflag;
+ int oldyychar;
+ YYSTYPE oldyyval;
+ YYSTYPE oldyylval;
+};
+
+static void yydestruct(pTHXo_ void *ptr);
%}
%start prog
%{
-#ifndef OEMVS
+#if 0 /* get this from perly.h instead */
%}
%union {
@@ -38,10 +57,15 @@ dep(void)
}
%{
-#endif /* OEMVS */
+#endif /* 0 */
+
+#ifdef USE_PURE_BISON
+#define YYLEX_PARAM (&yychar)
+#endif
+
%}
-%token <ival> '{' ')'
+%token <ival> '{'
%token <opval> WORD METHOD FUNCMETH THING PMFUNC PRIVATEREF
%token <opval> FUNC0SUB UNIOPSUB LSTOPSUB
@@ -52,17 +76,22 @@ dep(void)
%token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
%token <ival> RELOP EQOP MULOP ADDOP
%token <ival> DOLSHARP DO HASHBRACK NOAMP
-%token LOCAL MY
+%token <ival> LOCAL MY MYSUB
+%token COLONATTR
-%type <ival> prog decl local format startsub startanonsub startformsub
+%type <ival> prog decl format startsub startanonsub startformsub
%type <ival> remember mremember '&'
%type <opval> block mblock lineseq line loop cond else
-%type <opval> expr term scalar ary hsh arylen star amper sideff
+%type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
%type <opval> argexpr nexpr texpr iexpr mexpr mnexpr mtexpr miexpr
%type <opval> listexpr listexprcom indirob listop method
%type <opval> formname subname proto subbody cont my_scalar
+%type <opval> subattrlist myattrlist mysubrout myattrterm myterm
%type <pval> label
+%nonassoc PREC_LOW
+%nonassoc LOOPEX
+
%left <ival> OROP
%left ANDOP
%right NOTOP
@@ -86,7 +115,9 @@ dep(void)
%right <ival> POWOP
%nonassoc PREINC PREDEC POSTINC POSTDEC
%left ARROW
+%nonassoc <ival> ')'
%left '('
+%left '[' '{'
%% /* RULES */
@@ -169,11 +200,10 @@ sideff : error
else : /* NULL */
{ $$ = Nullop; }
| ELSE mblock
- { $$ = scope($2); }
+ { ($2)->op_flags |= OPf_PARENS; $$ = scope($2); }
| ELSIF '(' mexpr ')' mblock else
{ PL_copline = $1;
- $$ = newSTATEOP(0, Nullch,
- newCONDOP(0, $3, scope($5), $6));
+ $$ = newCONDOP(0, $3, scope($5), $6);
PL_hints |= HINT_BLOCK_SCOPE; }
;
@@ -269,6 +299,8 @@ decl : format
{ $$ = 0; }
| subrout
{ $$ = 0; }
+ | mysubrout
+ { $$ = 0; }
| package
{ $$ = 0; }
| use
@@ -283,8 +315,12 @@ formname: WORD { $$ = $1; }
| /* NULL */ { $$ = Nullop; }
;
-subrout : SUB startsub subname proto subbody
- { newSUB($2, $3, $4, $5); }
+mysubrout: MYSUB startsub subname proto subattrlist subbody
+ { newMYSUB($2, $3, $4, $5, $6); }
+ ;
+
+subrout : SUB startsub subname proto subattrlist subbody
+ { newATTRSUB($2, $3, $4, $5, $6); }
;
startsub: /* NULL */ /* start a regular subroutine scope */
@@ -299,9 +335,9 @@ startformsub: /* NULL */ /* start a format subroutine scope */
{ $$ = start_subparse(TRUE, 0); }
;
-subname : WORD { STRLEN n_a; char *name = SvPV(((SVOP*)$1)->op_sv, n_a);
+subname : WORD { STRLEN n_a; char *name = SvPV(((SVOP*)$1)->op_sv,n_a);
if (strEQ(name, "BEGIN") || strEQ(name, "END")
- || strEQ(name, "INIT"))
+ || strEQ(name, "INIT") || strEQ(name, "CHECK"))
CvSPECIAL_on(PL_compcv);
$$ = $1; }
;
@@ -311,6 +347,20 @@ proto : /* NULL */
| THING
;
+subattrlist: /* NULL */
+ { $$ = Nullop; }
+ | COLONATTR THING
+ { $$ = $2; }
+ | COLONATTR
+ { $$ = Nullop; }
+ ;
+
+myattrlist: COLONATTR THING
+ { $$ = $2; }
+ | COLONATTR
+ { $$ = Nullop; }
+ ;
+
subbody : block { $$ = $1; }
| ';' { $$ = Nullop; PL_expect = XSTATE; }
;
@@ -331,14 +381,14 @@ expr : expr ANDOP expr
{ $$ = newLOGOP(OP_AND, 0, $1, $3); }
| expr OROP expr
{ $$ = newLOGOP($2, 0, $1, $3); }
- | argexpr
+ | argexpr %prec PREC_LOW
;
argexpr : argexpr ','
{ $$ = $1; }
| argexpr ',' term
{ $$ = append_elem(OP_LIST, $1, $3); }
- | term
+ | term %prec PREC_LOW
;
listop : LSTOP indirob argexpr
@@ -352,6 +402,10 @@ listop : LSTOP indirob argexpr
append_elem(OP_LIST,
prepend_elem(OP_LIST, scalar($1), $5),
newUNOP(OP_METHOD, 0, $3))); }
+ | term ARROW method
+ { $$ = convert(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, scalar($1),
+ newUNOP(OP_METHOD, 0, $3))); }
| METHOD indirob listexpr
{ $$ = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
@@ -367,7 +421,7 @@ listop : LSTOP indirob argexpr
| FUNC '(' listexprcom ')'
{ $$ = convert($1, 0, $3); }
| LSTOPSUB startanonsub block
- { $3 = newANONSUB($2, 0, $3); }
+ { $3 = newANONATTRSUB($2, 0, Nullop, $3); }
listexpr %prec LSTOP
{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
@@ -378,6 +432,49 @@ method : METHOD
| scalar
;
+subscripted: star '{' expr ';' '}'
+ { $$ = newBINOP(OP_GELEM, 0, $1, scalar($3)); }
+ | scalar '[' expr ']'
+ { $$ = newBINOP(OP_AELEM, 0, oopsAV($1), scalar($3)); }
+ | term ARROW '[' expr ']'
+ { $$ = newBINOP(OP_AELEM, 0,
+ ref(newAVREF($1),OP_RV2AV),
+ scalar($4));}
+ | subscripted '[' expr ']'
+ { $$ = newBINOP(OP_AELEM, 0,
+ ref(newAVREF($1),OP_RV2AV),
+ scalar($3));}
+ | scalar '{' expr ';' '}'
+ { $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3));
+ PL_expect = XOPERATOR; }
+ | term ARROW '{' expr ';' '}'
+ { $$ = newBINOP(OP_HELEM, 0,
+ ref(newHVREF($1),OP_RV2HV),
+ jmaybe($4));
+ PL_expect = XOPERATOR; }
+ | subscripted '{' expr ';' '}'
+ { $$ = newBINOP(OP_HELEM, 0,
+ ref(newHVREF($1),OP_RV2HV),
+ jmaybe($3));
+ PL_expect = XOPERATOR; }
+ | term ARROW '(' ')'
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ newCVREF(0, scalar($1))); }
+ | term ARROW '(' expr ')'
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, $4,
+ newCVREF(0, scalar($1)))); }
+
+ | subscripted '(' expr ')'
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, $3,
+ newCVREF(0, scalar($1)))); }
+ | subscripted '(' ')'
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ newCVREF(0, scalar($1))); }
+
+
+
term : term ASSIGNOP term
{ $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
| term POWOP term
@@ -431,68 +528,47 @@ term : term ASSIGNOP term
| PREDEC term
{ $$ = newUNOP(OP_PREDEC, 0,
mod(scalar($2), OP_PREDEC)); }
- | local term %prec UNIOP
+ | myattrterm %prec UNIOP
+ { $$ = $1; }
+ | LOCAL term %prec UNIOP
{ $$ = localize($2,$1); }
| '(' expr ')'
{ $$ = sawparens($2); }
| '(' ')'
{ $$ = sawparens(newNULLLIST()); }
- | '[' expr ']' %prec '('
+ | '[' expr ']'
{ $$ = newANONLIST($2); }
- | '[' ']' %prec '('
+ | '[' ']'
{ $$ = newANONLIST(Nullop); }
| HASHBRACK expr ';' '}' %prec '('
{ $$ = newANONHASH($2); }
| HASHBRACK ';' '}' %prec '('
{ $$ = newANONHASH(Nullop); }
- | ANONSUB startanonsub proto block %prec '('
- { $$ = newANONSUB($2, $3, $4); }
+ | ANONSUB startanonsub proto subattrlist block %prec '('
+ { $$ = newANONATTRSUB($2, $3, $4, $5); }
| scalar %prec '('
{ $$ = $1; }
- | star '{' expr ';' '}'
- { $$ = newBINOP(OP_GELEM, 0, $1, scalar($3)); }
| star %prec '('
{ $$ = $1; }
- | scalar '[' expr ']' %prec '('
- { $$ = newBINOP(OP_AELEM, 0, oopsAV($1), scalar($3)); }
- | term ARROW '[' expr ']' %prec '('
- { $$ = newBINOP(OP_AELEM, 0,
- ref(newAVREF($1),OP_RV2AV),
- scalar($4));}
- | term '[' expr ']' %prec '('
- { assertref($1); $$ = newBINOP(OP_AELEM, 0,
- ref(newAVREF($1),OP_RV2AV),
- scalar($3));}
| hsh %prec '('
{ $$ = $1; }
| ary %prec '('
{ $$ = $1; }
| arylen %prec '('
{ $$ = newUNOP(OP_AV2ARYLEN, 0, ref($1, OP_AV2ARYLEN));}
- | scalar '{' expr ';' '}' %prec '('
- { $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3));
- PL_expect = XOPERATOR; }
- | term ARROW '{' expr ';' '}' %prec '('
- { $$ = newBINOP(OP_HELEM, 0,
- ref(newHVREF($1),OP_RV2HV),
- jmaybe($4));
- PL_expect = XOPERATOR; }
- | term '{' expr ';' '}' %prec '('
- { assertref($1); $$ = newBINOP(OP_HELEM, 0,
- ref(newHVREF($1),OP_RV2HV),
- jmaybe($3));
- PL_expect = XOPERATOR; }
- | '(' expr ')' '[' expr ']' %prec '('
+ | subscripted
+ { $$ = $1; }
+ | '(' expr ')' '[' expr ']'
{ $$ = newSLICEOP(0, $5, $2); }
- | '(' ')' '[' expr ']' %prec '('
+ | '(' ')' '[' expr ']'
{ $$ = newSLICEOP(0, $4, Nullop); }
- | ary '[' expr ']' %prec '('
+ | ary '[' expr ']'
{ $$ = prepend_elem(OP_ASLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_ASLICE, 0,
list($3),
ref($1, OP_ASLICE))); }
- | ary '{' expr ';' '}' %prec '('
+ | ary '{' expr ';' '}'
{ $$ = prepend_elem(OP_HSLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_HSLICE, 0,
@@ -541,13 +617,6 @@ term : term ASSIGNOP term
prepend_elem(OP_LIST,
$4,
scalar(newCVREF(0,scalar($2))))); dep();}
- | term ARROW '(' ')' %prec '('
- { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
- newCVREF(0, scalar($1))); }
- | term ARROW '(' expr ')' %prec '('
- { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
- append_elem(OP_LIST, $4,
- newCVREF(0, scalar($1)))); }
| LOOPEX
{ $$ = newOP($1, OPf_SPECIAL);
PL_hints |= HINT_BLOCK_SCOPE; }
@@ -583,9 +652,27 @@ term : term ASSIGNOP term
| listop
;
-listexpr: /* NULL */
+myattrterm: MY myterm myattrlist
+ { $$ = my_attrs($2,$3); }
+ | MY myterm
+ { $$ = localize($2,$1); }
+ ;
+
+myterm : '(' expr ')'
+ { $$ = sawparens($2); }
+ | '(' ')'
+ { $$ = sawparens(newNULLLIST()); }
+ | scalar %prec '('
+ { $$ = $1; }
+ | hsh %prec '('
+ { $$ = $1; }
+ | ary %prec '('
+ { $$ = $1; }
+ ;
+
+listexpr: /* NULL */ %prec PREC_LOW
{ $$ = Nullop; }
- | argexpr
+ | argexpr %prec PREC_LOW
{ $$ = $1; }
;
@@ -597,10 +684,6 @@ listexprcom: /* NULL */
{ $$ = $1; }
;
-local : LOCAL { $$ = 0; }
- | MY { $$ = 1; }
- ;
-
my_scalar: scalar
{ PL_in_my = 0; $$ = my($1); }
;
@@ -631,7 +714,7 @@ star : '*' indirob
indirob : WORD
{ $$ = scalar($1); }
- | scalar
+ | scalar %prec PREC_LOW
{ $$ = scalar($1); }
| block
{ $$ = scope($1); }
@@ -641,3 +724,11 @@ indirob : WORD
;
%% /* PROGRAM */
+
+/* more stuff added to make perly_c.diff easier to apply */
+
+#ifdef yyparse
+#undef yyparse
+#endif
+#define yyparse() Perl_yyparse(pTHX)
+
diff --git a/contrib/perl5/perly_c.diff b/contrib/perl5/perly_c.diff
index 5107901..0b73880 100644
--- a/contrib/perl5/perly_c.diff
+++ b/contrib/perl5/perly_c.diff
@@ -1,178 +1,19 @@
-*** perly.c.old Wed Jan 06 20:03:41 1999
---- perly.c Wed Jan 06 18:51:20 1999
+*** y.tab.c.orig Thu Aug 26 22:31:26 1999
+--- y.tab.c Thu Aug 26 22:32:22 1999
***************
-*** 7,86 ****
- #include "perl.h"
-
- static void
- dep(void)
- {
- deprecate("\"do\" to call subroutines");
- }
-
- #line 30 "perly.y"
-- #ifndef OEMVS
-- #line 33 "perly.y"
-- typedef union {
-- I32 ival;
-- char *pval;
-- OP *opval;
-- GV *gvval;
-- } YYSTYPE;
-- #line 41 "perly.y"
-- #endif /* OEMVS */
-- #line 27 "y.tab.c"
-- #define WORD 257
-- #define METHOD 258
-- #define FUNCMETH 259
-- #define THING 260
-- #define PMFUNC 261
-- #define PRIVATEREF 262
-- #define FUNC0SUB 263
-- #define UNIOPSUB 264
-- #define LSTOPSUB 265
-- #define LABEL 266
-- #define FORMAT 267
-- #define SUB 268
-- #define ANONSUB 269
-- #define PACKAGE 270
-- #define USE 271
-- #define WHILE 272
-- #define UNTIL 273
-- #define IF 274
-- #define UNLESS 275
-- #define ELSE 276
-- #define ELSIF 277
-- #define CONTINUE 278
-- #define FOR 279
-- #define LOOPEX 280
-- #define DOTDOT 281
-- #define FUNC0 282
-- #define FUNC1 283
-- #define FUNC 284
-- #define UNIOP 285
-- #define LSTOP 286
-- #define RELOP 287
-- #define EQOP 288
-- #define MULOP 289
-- #define ADDOP 290
-- #define DOLSHARP 291
-- #define DO 292
-- #define HASHBRACK 293
-- #define NOAMP 294
-- #define LOCAL 295
-- #define MY 296
-- #define OROP 297
-- #define ANDOP 298
-- #define NOTOP 299
-- #define ASSIGNOP 300
-- #define OROR 301
-- #define ANDAND 302
-- #define BITOROP 303
-- #define BITANDOP 304
-- #define SHIFTOP 305
-- #define MATCHOP 306
-- #define UMINUS 307
-- #define REFGEN 308
-- #define POWOP 309
-- #define PREINC 310
-- #define PREDEC 311
-- #define POSTINC 312
-- #define POSTDEC 313
-- #define ARROW 314
- #define YYERRCODE 256
- short yylhs[] = { -1,
---- 7,26 ----
- #include "perl.h"
-
-+ #ifdef PERL_OBJECT
- static void
-+ Dep(CPerlObj *pPerl)
-+ {
-+ pPerl->deprecate("\"do\" to call subroutines");
-+ }
-+ #define dep() Dep(this)
-+ #else
-+ static void
- dep(void)
- {
- deprecate("\"do\" to call subroutines");
- }
-+ #endif
-
- #line 30 "perly.y"
- #define YYERRCODE 256
- short yylhs[] = { -1,
-***************
-*** 1337,1340 ****
---- 1277,1281 ----
- #endif
- #endif
-+ #ifndef PERL_OBJECT
- int yydebug;
- int yynerrs;
-***************
-*** 1345,1365 ****
- YYSTYPE yyval;
- YYSTYPE yylval;
-! short yyss[YYSTACKSIZE];
-! YYSTYPE yyvs[YYSTACKSIZE];
-! #define yystacksize YYSTACKSIZE
- #line 643 "perly.y"
- /* PROGRAM */
-! #line 1353 "y.tab.c"
- #define YYABORT goto yyabort
- #define YYACCEPT goto yyaccept
- #define YYERROR goto yyerrlab
- int
-! yyparse()
+*** 1447,1456 ****
+ yyparse()
{
register int yym, yyn, yystate;
#if YYDEBUG
register char *yys;
- extern char *getenv();
+! extern char *getenv();
if (yys = getenv("YYDEBUG"))
{
---- 1286,1351 ----
- YYSTYPE yyval;
- YYSTYPE yylval;
-! #endif
- #line 643 "perly.y"
- /* PROGRAM */
-! #line 1353 "perly.c"
- #define YYABORT goto yyabort
- #define YYACCEPT goto yyaccept
- #define YYERROR goto yyerrlab
-+
-+ struct ysv {
-+ short* yyss;
-+ YYSTYPE* yyvs;
-+ int oldyydebug;
-+ int oldyynerrs;
-+ int oldyyerrflag;
-+ int oldyychar;
-+ YYSTYPE oldyyval;
-+ YYSTYPE oldyylval;
-+ };
-+
-+ void
-+ yydestruct(void *ptr)
-+ {
-+ struct ysv* ysave = (struct ysv*)ptr;
-+ if (ysave->yyss) Safefree(ysave->yyss);
-+ if (ysave->yyvs) Safefree(ysave->yyvs);
-+ yydebug = ysave->oldyydebug;
-+ yynerrs = ysave->oldyynerrs;
-+ yyerrflag = ysave->oldyyerrflag;
-+ yychar = ysave->oldyychar;
-+ yyval = ysave->oldyyval;
-+ yylval = ysave->oldyylval;
-+ Safefree(ysave);
-+ }
-+
- int
-! yyparse(void)
+ yyn = *yys;
+--- 1447,1473 ----
+ yyparse()
{
register int yym, yyn, yystate;
+ register short *yyssp;
@@ -183,27 +24,26 @@
+ int retval = 0;
#if YYDEBUG
register char *yys;
-+ #ifndef __cplusplus
- extern char *getenv();
-+ #endif
-+ #endif
-+
+! #endif
+
+ struct ysv *ysave;
+ New(73, ysave, 1, struct ysv);
-+ SAVEDESTRUCTOR(yydestruct, ysave);
++ SAVEDESTRUCTOR_X(yydestruct, ysave);
+ ysave->oldyydebug = yydebug;
+ ysave->oldyynerrs = yynerrs;
+ ysave->oldyyerrflag = yyerrflag;
+ ysave->oldyychar = yychar;
+ ysave->oldyyval = yyval;
+ ysave->oldyylval = yylval;
-
++
+ #if YYDEBUG
if (yys = getenv("YYDEBUG"))
{
+ yyn = *yys;
***************
-*** 1374,1377 ****
---- 1360,1373 ----
+*** 1463,1468 ****
+--- 1480,1495 ----
+ yyerrflag = 0;
yychar = (-1);
+ /*
@@ -218,36 +58,17 @@
+
yyssp = yyss;
yyvsp = yyvs;
+ *yyssp = yystate = 0;
***************
-*** 1389,1393 ****
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
-! printf("yydebug: state %d, reading %d (%s)\n", yystate,
- yychar, yys);
- }
---- 1385,1389 ----
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
-! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", yystate,
- yychar, yys);
- }
-***************
-*** 1399,1408 ****
- #if YYDEBUG
- if (yydebug)
-! printf("yydebug: state %d, shifting to state %d\n",
- yystate, yytable[yyn]);
+*** 1493,1499 ****
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
---- 1395,1418 ----
- #if YYDEBUG
- if (yydebug)
-! PerlIO_printf(Perl_debug_log, "yydebug: state %d, shifting to state %d\n",
- yystate, yytable[yyn]);
+ *++yyvsp = yylval;
+--- 1520,1538 ----
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -258,34 +79,25 @@
! int yyps_index = (yyssp - yyss);
! int yypv_index = (yyvsp - yyvs);
! yystacksize += YYSTACKSIZE;
-! ysave->yyvs = yyvs =
-! (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-! ysave->yyss = yyss =
-! (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+! ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+! ysave->yyss = Renew(yyss, yystacksize, short);
! if (!yyvs || !yyss)
! goto yyoverflow;
! yyssp = yyss + yyps_index;
! yyvsp = yyvs + yypv_index;
}
*++yyssp = yystate = yytable[yyn];
+ *++yyvsp = yylval;
***************
-*** 1440,1449 ****
- #if YYDEBUG
- if (yydebug)
-! printf("yydebug: state %d, error recovery shifting\
-! to state %d\n", *yyssp, yytable[yyn]);
+*** 1534,1540 ****
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
---- 1450,1474 ----
- #if YYDEBUG
- if (yydebug)
-! PerlIO_printf(Perl_debug_log,
-! "yydebug: state %d, error recovery shifting to state %d\n",
-! *yyssp, yytable[yyn]);
+ *++yyvsp = yylval;
+--- 1573,1591 ----
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -296,121 +108,33 @@
! int yyps_index = (yyssp - yyss);
! int yypv_index = (yyvsp - yyvs);
! yystacksize += YYSTACKSIZE;
-! ysave->yyvs = yyvs = (YYSTYPE*)PerlMem_realloc((char*)yyvs,
-! yystacksize * sizeof(YYSTYPE));
-! ysave->yyss = yyss = (short*)PerlMem_realloc((char*)yyss,
-! yystacksize * sizeof(short));
+! ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+! ysave->yyss = Renew(yyss, yystacksize, short);
! if (!yyvs || !yyss)
! goto yyoverflow;
! yyssp = yyss + yyps_index;
! yyvsp = yyvs + yypv_index;
}
*++yyssp = yystate = yytable[yyn];
+ *++yyvsp = yylval;
***************
-*** 1455,1460 ****
- #if YYDEBUG
- if (yydebug)
-! printf("yydebug: error recovery discarding state %d\n",
-! *yyssp);
- #endif
- if (yyssp <= yyss) goto yyabort;
---- 1480,1486 ----
- #if YYDEBUG
- if (yydebug)
-! PerlIO_printf(Perl_debug_log,
-! "yydebug: error recovery discarding state %d\n",
-! *yyssp);
- #endif
- if (yyssp <= yyss) goto yyabort;
-***************
-*** 1473,1478 ****
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
-! printf("yydebug: state %d, error recovery discards token %d (%s)\n",
-! yystate, yychar, yys);
- }
- #endif
---- 1499,1505 ----
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
-! PerlIO_printf(Perl_debug_log,
-! "yydebug: state %d, error recovery discards token %d (%s)\n",
-! yystate, yychar, yys);
- }
- #endif
-***************
-*** 1483,1487 ****
- #if YYDEBUG
- if (yydebug)
-! printf("yydebug: state %d, reducing by rule %d (%s)\n",
- yystate, yyn, yyrule[yyn]);
- #endif
---- 1510,1514 ----
- #if YYDEBUG
- if (yydebug)
-! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reducing by rule %d (%s)\n",
- yystate, yyn, yyrule[yyn]);
- #endif
-***************
-*** 2267,2271 ****
- { yyval.opval = yyvsp[0].opval; }
- break;
-! #line 2270 "y.tab.c"
- }
- yyssp -= yym;
---- 2294,2298 ----
- { yyval.opval = yyvsp[0].opval; }
- break;
-! #line 2270 "perly.c"
- }
- yyssp -= yym;
-***************
-*** 2277,2282 ****
- #if YYDEBUG
- if (yydebug)
-! printf("yydebug: after reduction, shifting from state 0 to\
-! state %d\n", YYFINAL);
- #endif
- yystate = YYFINAL;
---- 2304,2310 ----
- #if YYDEBUG
- if (yydebug)
-! PerlIO_printf(Perl_debug_log,
-! "yydebug: after reduction, shifting from state 0 to state %d\n",
-! YYFINAL);
- #endif
- yystate = YYFINAL;
-***************
-*** 2292,2296 ****
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
-! printf("yydebug: state %d, reading %d (%s)\n",
- YYFINAL, yychar, yys);
- }
---- 2320,2324 ----
- if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
- if (!yys) yys = "illegal-symbol";
-! PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n",
- YYFINAL, yychar, yys);
- }
-***************
-*** 2307,2316 ****
- #if YYDEBUG
- if (yydebug)
-! printf("yydebug: after reduction, shifting from state %d \
-! to state %d\n", *yyssp, yystate);
+*** 2473,2487 ****
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! goto yyoverflow;
}
*++yyssp = yystate;
---- 2335,2359 ----
- #if YYDEBUG
- if (yydebug)
-! PerlIO_printf(Perl_debug_log,
-! "yydebug: after reduction, shifting from state %d to state %d\n",
-! *yyssp, yystate);
+ *++yyvsp = yyval;
+ goto yyloop;
+ yyoverflow:
+! yyerror("yacc stack overflow");
+ yyabort:
+! return (1);
+ yyaccept:
+! return (0);
+ }
+--- 2524,2569 ----
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -421,27 +145,15 @@
! int yyps_index = (yyssp - yyss);
! int yypv_index = (yyvsp - yyvs);
! yystacksize += YYSTACKSIZE;
-! ysave->yyvs = yyvs =
-! (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-! ysave->yyss = yyss =
-! (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
+! ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE);
+! ysave->yyss = Renew(yyss, yystacksize, short);
! if (!yyvs || !yyss)
! goto yyoverflow;
! yyssp = yyss + yyps_index;
! yyvsp = yyvs + yypv_index;
}
*++yyssp = yystate;
-***************
-*** 2318,2325 ****
- goto yyloop;
- yyoverflow:
-! yyerror("yacc stack overflow");
- yyabort:
-! return (1);
- yyaccept:
-! return (0);
- }
---- 2361,2368 ----
+ *++yyvsp = yyval;
goto yyloop;
yyoverflow:
! yyerror("Out of memory for yacc stack");
@@ -449,4 +161,23 @@
! retval = 1;
yyaccept:
! return retval;
+! }
+!
+! #ifdef PERL_OBJECT
+! #include "XSUB.h"
+! #endif
+!
+! static void
+! yydestruct(pTHXo_ void *ptr)
+! {
+! struct ysv* ysave = (struct ysv*)ptr;
+! if (ysave->yyss) Safefree(ysave->yyss);
+! if (ysave->yyvs) Safefree(ysave->yyvs);
+! yydebug = ysave->oldyydebug;
+! yynerrs = ysave->oldyynerrs;
+! yyerrflag = ysave->oldyyerrflag;
+! yychar = ysave->oldyychar;
+! yyval = ysave->oldyyval;
+! yylval = ysave->oldyylval;
+! Safefree(ysave);
}
diff --git a/contrib/perl5/pod/Makefile b/contrib/perl5/pod/Makefile
index eb3fcfe..bd2e148 100644
--- a/contrib/perl5/pod/Makefile
+++ b/contrib/perl5/pod/Makefile
@@ -1,4 +1,5 @@
-CONVERTERS = pod2html pod2latex pod2man pod2text checkpods
+CONVERTERS = pod2html pod2latex pod2man pod2text checkpods \
+ pod2usage podchecker podselect
HTMLROOT = / # Change this to fix cross-references in HTML
POD2HTML = pod2html \
@@ -17,6 +18,7 @@ POD = \
perl.pod \
perldelta.pod \
perl5004delta.pod \
+ perl5005delta.pod \
perldata.pod \
perlsyn.pod \
perlop.pod \
@@ -29,19 +31,25 @@ POD = \
perlmod.pod \
perlmodlib.pod \
perlmodinstall.pod \
+ perlfork.pod \
perlform.pod \
perllocale.pod \
perlref.pod \
perlreftut.pod \
perldsc.pod \
perllol.pod \
+ perlboot.pod \
perltoot.pod \
+ perltootc.pod \
perlobj.pod \
perltie.pod \
perlbot.pod \
perlipc.pod \
perlthrtut.pod \
+ perldbmfilter.pod \
+ perldebguts.pod \
perldebug.pod \
+ perlnumber.pod \
perldiag.pod \
perlsec.pod \
perltrap.pod \
@@ -55,6 +63,11 @@ POD = \
perlxstut.pod \
perlguts.pod \
perlcall.pod \
+ perlcompile.pod \
+ perltodo.pod \
+ perlapi.pod \
+ perlintern.pod \
+ perlhack.pod \
perlhist.pod \
perlfaq.pod \
perlfaq1.pod \
@@ -72,6 +85,7 @@ MAN = \
perl.man \
perldelta.man \
perl5004delta.man \
+ perl5005delta.man \
perldata.man \
perlsyn.man \
perlop.man \
@@ -84,19 +98,25 @@ MAN = \
perlmod.man \
perlmodlib.man \
perlmodinstall.man \
+ perlfork.man \
perlform.man \
perllocale.man \
perlref.man \
perlreftut.man \
perldsc.man \
perllol.man \
+ perlboot.man \
perltoot.man \
+ perltootc.man \
perlobj.man \
perltie.man \
perlbot.man \
perlipc.man \
perlthrtut.man \
+ perldbmfilter.man \
+ perldebguts.man \
perldebug.man \
+ perlnumber.man \
perldiag.man \
perlsec.man \
perltrap.man \
@@ -110,6 +130,11 @@ MAN = \
perlxstut.man \
perlguts.man \
perlcall.man \
+ perlcompile.man \
+ perltodo.man \
+ perlapi.man \
+ perlintern.man \
+ perlhack.man \
perlhist.man \
perlfaq.man \
perlfaq1.man \
@@ -127,6 +152,7 @@ HTML = \
perl.html \
perldelta.html \
perl5004delta.html \
+ perl5005delta.html \
perldata.html \
perlsyn.html \
perlop.html \
@@ -139,19 +165,25 @@ HTML = \
perlmod.html \
perlmodlib.html \
perlmodinstall.html \
+ perlfork.html \
perlform.html \
perllocale.html \
perlref.html \
perlreftut.html \
perldsc.html \
perllol.html \
+ perlboot.html \
perltoot.html \
+ perltootc.html \
perlobj.html \
perltie.html \
perlbot.html \
perlipc.html \
perlthrtut.html \
+ perldbmfilter.html \
+ perldebguts.html \
perldebug.html \
+ perlnumber.html \
perldiag.html \
perlsec.html \
perltrap.html \
@@ -165,6 +197,11 @@ HTML = \
perlxstut.html \
perlguts.html \
perlcall.html \
+ perlcompile.html \
+ perltodo.html \
+ perlapi.html \
+ perlintern.html \
+ perlhack.html \
perlhist.html \
perlfaq.html \
perlfaq1.html \
@@ -182,6 +219,7 @@ TEX = \
perl.tex \
perldelta.tex \
perl5004delta.tex \
+ perl5005delta.tex \
perldata.tex \
perlsyn.tex \
perlop.tex \
@@ -194,20 +232,25 @@ TEX = \
perlmod.tex \
perlmodlib.tex \
perlmodinstall.tex \
+ perlfork.tex \
perlform.tex \
perllocale.tex \
perlref.tex \
perlreftut.tex \
- perlopentut.tex \
perldsc.tex \
perllol.tex \
+ perlboot.tex \
perltoot.tex \
+ perltootc.tex \
perlobj.tex \
perltie.tex \
perlbot.tex \
perlipc.tex \
perlthrtut.tex \
+ perldbmfilter.tex \
+ perldebguts.tex \
perldebug.tex \
+ perlnumber.tex \
perldiag.tex \
perlsec.tex \
perltrap.tex \
@@ -221,6 +264,11 @@ TEX = \
perlxstut.tex \
perlguts.tex \
perlcall.tex \
+ perlcompile.tex \
+ perltodo.tex \
+ perlapi.tex \
+ perlintern.tex \
+ perlhack.tex \
perlhist.tex \
perlfaq.tex \
perlfaq1.tex \
@@ -301,6 +349,15 @@ pod2text: pod2text.PL ../lib/Config.pm
checkpods: checkpods.PL ../lib/Config.pm
$(PERL) -I ../lib checkpods.PL
+pod2usage: pod2usage.PL ../lib/Config.pm
+ $(PERL) -I ../lib pod2usage.PL
+
+podchecker: podchecker.PL ../lib/Config.pm
+ $(PERL) -I ../lib podchecker.PL
+
+podselect: podselect.PL ../lib/Config.pm
+ $(PERL) -I ../lib podselect.PL
+
compile: all
$(REALPERL) -I../lib ../utils/perlcc -regex 's/$$/.exe/' pod2latex pod2man pod2text checkpods -prog -verbose dcf -log ../compilelog;
diff --git a/contrib/perl5/pod/Win32.pod b/contrib/perl5/pod/Win32.pod
new file mode 100644
index 0000000..44ed3d1
--- /dev/null
+++ b/contrib/perl5/pod/Win32.pod
@@ -0,0 +1,284 @@
+=head1 NAME
+
+Win32 - Interfaces to some Win32 API Functions
+
+=head1 DESCRIPTION
+
+Perl on Win32 contains several functions to access Win32 APIs. Some
+are included in Perl itself (on Win32) and some are only available
+after explicitly requesting the Win32 module with:
+
+ use Win32;
+
+The builtin functions are marked as [CORE] and the other ones
+as [EXT] in the following alphabetical listing. The C<Win32> module
+is not part of the Perl source distribution; it is distributed in
+the libwin32 bundle of Win32::* modules on CPAN. The module is
+already preinstalled in binary distributions like ActivePerl.
+
+=head2 Alphabetical Listing of Win32 Functions
+
+=over
+
+=item Win32::AbortSystemShutdown(MACHINE)
+
+[EXT] Aborts a system shutdown (started by the
+InitiateSystemShutdown function) on the specified MACHINE.
+
+=item Win32::BuildNumber()
+
+[CORE] Returns the ActivePerl build number. This function is
+only available in the ActivePerl binary distribution.
+
+=item Win32::CopyFile(FROM, TO, OVERWRITE)
+
+[CORE] The Win32::CopyFile() function copies an existing file to a new
+file. All file information like creation time and file attributes will
+be copied to the new file. However it will B<not> copy the security
+information. If the destination file already exists it will only be
+overwritten when the OVERWRITE parameter is true. But even this will
+not overwrite a read-only file; you have to unlink() it first
+yourself.
+
+=item Win32::DomainName()
+
+[CORE] Returns the name of the Microsoft Network domain that the
+owner of the current perl process is logged into.
+
+=item Win32::ExpandEnvironmentStrings(STRING)
+
+[EXT] Takes STRING and replaces all referenced environment variable
+names with their defined values. References to environment variables
+take the form C<%VariableName%>. Case is ignored when looking up the
+VariableName in the environment. If the variable is not found then the
+original C<%VariableName%> text is retained. Has the same effect
+as the following:
+
+ $string =~ s/%([^%]*)%/$ENV{$1} || "%$1%"/eg
+
+=item Win32::FormatMessage(ERRORCODE)
+
+[CORE] Converts the supplied Win32 error number (e.g. returned by
+Win32::GetLastError()) to a descriptive string. Analogous to the
+perror() standard-C library function. Note that C<$^E> used
+in a string context has much the same effect.
+
+ C:\> perl -e "$^E = 26; print $^E;"
+ The specified disk or diskette cannot be accessed
+
+=item Win32::FsType()
+
+[CORE] Returns the name of the filesystem of the currently active
+drive (like 'FAT' or 'NTFS'). In list context it returns three values:
+(FSTYPE, FLAGS, MAXCOMPLEN). FSTYPE is the filesystem type as
+before. FLAGS is a combination of values of the following table:
+
+ 0x00000001 supports case-sensitive filenames
+ 0x00000002 preserves the case of filenames
+ 0x00000004 supports Unicode in filenames
+ 0x00000008 preserves and enforces ACLs
+ 0x00000010 supports file-based compression
+ 0x00000020 supports disk quotas
+ 0x00000040 supports sparse files
+ 0x00000080 supports reparse points
+ 0x00000100 supports remote storage
+ 0x00008000 is a compressed volume (e.g. DoubleSpace)
+ 0x00010000 supports object identifiers
+ 0x00020000 supports the Encrypted File System (EFS)
+
+MAXCOMPLEN is the maximum length of a filename component (the part
+between two backslashes) on this file system.
+
+=item Win32::FreeLibrary(HANDLE)
+
+[EXT] Unloads a previously loaded dynamic-link library. The HANDLE is
+no longer valid after this call. See L<LoadLibrary|Win32::LoadLibrary(LIBNAME)>
+for information on dynamically loading a library.
+
+=item Win32::GetArchName()
+
+[EXT] Use of this function is deprecated. It is equivalent with
+$ENV{PROCESSOR_ARCHITECTURE}. This might not work on Win9X.
+
+=item Win32::GetChipName()
+
+[EXT] Returns the processor type: 386, 486 or 586 for Intel processors,
+21064 for the Alpha chip.
+
+=item Win32::GetCwd()
+
+[CORE] Returns the current active drive and directory. This function
+does not return a UNC path, since the functionality required for such
+a feature is not available under Windows 95.
+
+=item Win32::GetFullPathName(FILENAME)
+
+[CORE] GetFullPathName combines the FILENAME with the current drive
+and directory name and returns a fully qualified (aka, absolute)
+path name. In list context it returns two elements: (PATH, FILE) where
+PATH is the complete pathname component (including trailing backslash)
+and FILE is just the filename part. Note that no attempt is made to
+convert 8.3 components in the supplied FILENAME to longnames or
+vice-versa. Compare with Win32::GetShortPathName and
+Win32::GetLongPathName.
+
+This function has been added for Perl 5.6.
+
+=item Win32::GetLastError()
+
+[CORE] Returns the last error value generated by a call to a Win32 API
+function. Note that C<$^E> used in a numeric context amounts to the
+same value.
+
+=item Win32::GetLongPathName(PATHNAME)
+
+[CORE] Returns a representaion of PATHNAME composed of longname
+components (if any). The result may not necessarily be longer
+than PATHNAME. No attempt is made to convert PATHNAME to the
+absolute path. Compare with Win32::GetShortPathName and
+Win32::GetFullPathName.
+
+This function has been added for Perl 5.6.
+
+=item Win32::GetNextAvailDrive()
+
+[CORE] Returns a string in the form of "<d>:" where <d> is the first
+available drive letter.
+
+=item Win32::GetOSVersion()
+
+[CORE] Returns the array (STRING, MAJOR, MINOR, BUILD, ID), where
+the elements are, respectively: An arbitrary descriptive string, the
+major version number of the operating system, the minor version
+number, the build number, and a digit indicating the actual operating
+system. For ID, the values are 0 for Win32s, 1 for Windows 9X and 2
+for Windows NT. In scalar context it returns just the ID.
+
+=item Win32::GetShortPathName(PATHNAME)
+
+[CORE] Returns a representation of PATHNAME composed only of
+short (8.3) path components. The result may not necessarily be
+shorter than PATHNAME. Compare with Win32::GetFullPathName and
+Win32::GetLongPathName.
+
+=item Win32::GetProcAddress(INSTANCE, PROCNAME)
+
+[EXT] Returns the address of a function inside a loaded library. The
+information about what you can do with this address has been lost in
+the mist of time. Use the Win32::API module instead of this deprecated
+function.
+
+=item Win32::GetTickCount()
+
+[CORE] Returns the number of milliseconds elapsed since the last
+system boot. Resolution is limited to system timer ticks (about 10ms
+on WinNT and 55ms on Win9X).
+
+=item Win32::InitiateSystemShutdown(MACHINE, MESSAGE, TIMEOUT, FORCECLOSE, REBOOT)
+
+[EXT] Shutsdown the specified MACHINE, notifying users with the
+supplied MESSAGE, within the specified TIMEOUT interval. Forces
+closing of all documents without prompting the user if FORCECLOSE is
+true, and reboots the machine if REBOOT is true. This function works
+only on WinNT.
+
+=item Win32::IsWinNT()
+
+[CORE] Returns non zero if the Win32 subsystem is Windows NT.
+
+=item Win32::IsWin95()
+
+[CORE] Returns non zero if the Win32 subsystem is Windows 95.
+
+=item Win32::LoadLibrary(LIBNAME)
+
+[EXT] Loads a dynamic link library into memory and returns its module
+handle. This handle can be used with Win32::GetProcAddress and
+Win32::FreeLibrary. This function is deprecated. Use the Win32::API
+module instead.
+
+=item Win32::LoginName()
+
+[CORE] Returns the username of the owner of the current perl process.
+
+=item Win32::LookupAccountName(SYSTEM, ACCOUNT, DOMAIN, SID, SIDTYPE)
+
+[EXT] Looks up ACCOUNT on SYSTEM and returns the domain name the SID and
+the SID type.
+
+=item Win32::LookupAccountSID(SYSTEM, SID, ACCOUNT, DOMAIN, SIDTYPE)
+
+[EXT] Looks up SID on SYSTEM and returns the account name, domain name,
+and the SID type.
+
+=item Win32::MsgBox(MESSAGE [, FLAGS [, TITLE]])
+
+[EXT] Create a dialogbox containing MESSAGE. FLAGS specifies the
+required icon and buttons according to the following table:
+
+ 0 = OK
+ 1 = OK and Cancel
+ 2 = Abort, Retry, and Ignore
+ 3 = Yes, No and Cancel
+ 4 = Yes and No
+ 5 = Retry and Cancel
+
+ MB_ICONSTOP "X" in a red circle
+ MB_ICONQUESTION question mark in a bubble
+ MB_ICONEXCLAMATION exclamation mark in a yellow triangle
+ MB_ICONINFORMATION "i" in a bubble
+
+TITLE specifies an optional window title. The default is "Perl".
+
+The function returns the menu id of the selected push button:
+
+ 0 Error
+
+ 1 OK
+ 2 Cancel
+ 3 Abort
+ 4 Retry
+ 5 Ignore
+ 6 Yes
+ 7 No
+
+=item Win32::NodeName()
+
+[CORE] Returns the Microsoft Network node-name of the current machine.
+
+=item Win32::RegisterServer(LIBRARYNAME)
+
+[EXT] Loads the DLL LIBRARYNAME and calls the function DllRegisterServer.
+
+=item Win32::SetCwd(NEWDIRECTORY)
+
+[CORE] Sets the current active drive and directory. This function does not
+work with UNC paths, since the functionality required to required for
+such a feature is not available under Windows 95.
+
+=item Win32::SetLastError(ERROR)
+
+[CORE] Sets the value of the last error encountered to ERROR. This is
+that value that will be returned by the Win32::GetLastError()
+function. This functions has been added for Perl 5.6.
+
+=item Win32::Sleep(TIME)
+
+[CORE] Pauses for TIME milliseconds. The timeslices are made available
+to other processes and threads.
+
+=item Win32::Spawn(COMMAND, ARGS, PID)
+
+[CORE] Spawns a new process using the supplied COMMAND, passing in
+arguments in the string ARGS. The pid of the new process is stored in
+PID. This function is deprecated. Please use the Win32::Process module
+instead.
+
+=item Win32::UnregisterServer(LIBRARYNAME)
+
+[EXT] Loads the DLL LIBRARYNAME and calls the function
+DllUnregisterServer.
+
+=back
+
+=cut
diff --git a/contrib/perl5/pod/buildtoc b/contrib/perl5/pod/buildtoc
index a4b9d5a..21fee31 100644
--- a/contrib/perl5/pod/buildtoc
+++ b/contrib/perl5/pod/buildtoc
@@ -6,13 +6,15 @@ sub output ($);
@pods = qw(
perl perlfaq perlfaq1 perlfaq2 perlfaq3 perlfaq4 perlfaq5
- perlfaq6 perlfaq7 perlfaq8 perlfaq9 perldelta perldata perlopentut
- perlsyn perlop perlre perlreftut perlrun perlfunc perlvar perlsub
- perlmod perlmodlib perlmodinstall perlform perllocale perlref perldsc
- perllol perltoot perlobj perltie perlthrtut perlbot perlipc perldebug
+ perlfaq6 perlfaq7 perlfaq8 perlfaq9 perldelta perldata
+ perlsyn perlop perlre perlrun perlfunc perlvar perlsub
+ perlmod perlmodlib perlmodinstall perlfork perlform perllocale
+ perlref perlreftut perldsc
+ perllol perlboot perltoot perltootc perlobj perltie perlbot perlipc
+ perldbmfilter perldebug perlnumber perldebguts
perldiag perlsec perltrap perlport perlstyle perlpod perlbook
- perlembed perlapio perlxs perlxstut perlguts perlcall
- perlhist
+ perlembed perlapio perlxs perlxstut perlguts perlcall perlcompile
+ perlapi perlintern perlhist
);
for (@pods) { s/$/.pod/ }
@@ -112,6 +114,8 @@ podset( @modules[ sort { $modname[$a] cmp $modname[$b] } 0 .. $#modules ] );
Here should be listed all the extra programs' documentation, but they
don't all have manual pages yet:
+ =over
+
=item a2p
=item s2p
@@ -130,6 +134,7 @@ podset( @modules[ sort { $modname[$a] cmp $modname[$b] } 0 .. $#modules ] );
=item wrapsuid
+ =back
=head1 AUTHOR
@@ -148,8 +153,7 @@ sub podset {
while(<>) {
if (s/^=head1 (NAME)\s*/=head2 /) {
$pod = path2modname($ARGV);
- unitem();
- unhead2();
+ unhead1();
output "\n \n\n=head2 ";
$_ = <>;
if ( /^\s*$pod\b/ ) {
@@ -162,7 +166,9 @@ sub podset {
next;
}
if (s/^=head1 (.*)/=item $1/) {
- unitem(); unhead2();
+ unhead2();
+ output "=over\n\n" unless $inhead1;
+ $inhead1 = 1;
output $_; nl(); next;
}
if (s/^=head2 (.*)/=item $1/) {
@@ -170,7 +176,6 @@ sub podset {
output "=over\n\n" unless $inhead2;
$inhead2 = 1;
output $_; nl(); next;
-
}
if (s/^=item ([^=].*)\n/$1/) {
next if $pod eq 'perldiag';
@@ -186,6 +191,10 @@ sub podset {
s/^-X\b/-I<X>/;
output $_; next;
}
+ if (s/^=cut\s*\n//) {
+ unhead1();
+ next;
+ }
}
}
@@ -198,12 +207,20 @@ sub path2modname {
return $_;
}
+sub unhead1 {
+ unhead2();
+ if ($inhead1) {
+ output "\n\n=back\n\n";
+ }
+ $inhead1 = 0;
+}
+
sub unhead2 {
+ unitem();
if ($inhead2) {
output "\n\n=back\n\n";
}
$inhead2 = 0;
- $initem = 0;
}
sub unitem {
diff --git a/contrib/perl5/pod/perl.pod b/contrib/perl5/pod/perl.pod
index 6e218cd..59ca0e0 100644
--- a/contrib/perl5/pod/perl.pod
+++ b/contrib/perl5/pod/perl.pod
@@ -4,22 +4,20 @@ perl - Practical Extraction and Report Language
=head1 SYNOPSIS
-B<perl> S<[ B<-sTuU> ]>
- S<[ B<-hv> ] [ B<-V>[:I<configvar>] ]>
- S<[ B<-cw> ] [ B<-d>[:I<debugger>] ] [ B<-D>[I<number/list>] ]>
- S<[ B<-pna> ] [ B<-F>I<pattern> ] [ B<-l>[I<octal>] ] [ B<-0>[I<octal>] ]>
- S<[ B<-I>I<dir> ] [ B<-m>[B<->]I<module> ] [ B<-M>[B<->]I<'module...'> ]>
- S<[ B<-P> ]>
- S<[ B<-S> ]>
- S<[ B<-x>[I<dir>] ]>
- S<[ B<-i>[I<extension>] ]>
- S<[ B<-e> I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
-
-For ease of access, the Perl manual has been split up into a number
-of sections:
+B<perl> S<[ B<-sTuU> ]> S<[ B<-hv> ] [ B<-V>[:I<configvar>] ]>
+ S<[ B<-cw> ] [ B<-d>[:I<debugger>] ] [ B<-D>[I<number/list>] ]>
+ S<[ B<-pna> ] [ B<-F>I<pattern> ] [ B<-l>[I<octal>] ] [ B<-0>[I<octal>] ]>
+ S<[ B<-I>I<dir> ] [ B<-m>[B<->]I<module> ] [ B<-M>[B<->]I<'module...'> ]>
+ S<[ B<-P> ]> S<[ B<-S> ]> S<[ B<-x>[I<dir>] ]>
+ S<[ B<-i>[I<extension>] ]> S<[ B<-e> I<'command'> ]
+ [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
+
+For ease of access, the Perl manual has been split up into several
+sections:
perl Perl overview (this section)
perldelta Perl changes since previous version
+ perl5005delta Perl changes in version 5.005
perl5004delta Perl changes in version 5.004
perlfaq Perl frequently asked questions
perltoc Perl documentation table of contents
@@ -37,21 +35,30 @@ of sections:
perlmodlib Perl modules: how to write and use
perlmodinstall Perl modules: how to install from CPAN
perlform Perl formats
+ perlunicode Perl unicode support
perllocale Perl locale support
- perlref Perl references
perlreftut Perl references short introduction
+ perlref Perl references, the rest of the story
perldsc Perl data structures intro
- perllol Perl data structures: lists of lists
- perltoot Perl OO tutorial
+ perllol Perl data structures: arrays of arrays
+ perlboot Perl OO tutorial for beginners
+ perltoot Perl OO tutorial, part 1
+ perltootc Perl OO tutorial, part 2
perlobj Perl objects
perltie Perl objects hidden behind simple variables
perlbot Perl OO tricks and examples
perlipc Perl interprocess communication
+ perlfork Perl fork() information
perlthrtut Perl threads tutorial
+ perllexwarn Perl warnings and their control
+ perlfilter Perl source filters
+ perldbmfilter Perl DBM filters
+ perlcompile Perl compiler suite intro
perldebug Perl debugging
perldiag Perl diagnostic messages
+ perlnumber Perl number semantics
perlsec Perl security
perltrap Perl traps for the unwary
perlport Perl portability guide
@@ -62,18 +69,33 @@ of sections:
perlembed Perl ways to embed perl in your C or C++ application
perlapio Perl internal IO abstraction interface
+ perldebguts Perl debugging guts and tips
perlxs Perl XS application programming interface
perlxstut Perl XS tutorial
perlguts Perl internal functions for those doing extensions
perlcall Perl calling conventions from C
+ perlapi Perl API listing (autogenerated)
+ perlintern Perl internal functions (autogenerated)
+ perltodo Perl things to do
+ perlhack Perl hackers guide
perlhist Perl history records
+ perlamiga Perl notes for Amiga
+ perlcygwin Perl notes for Cygwin
+ perldos Perl notes for DOS
+ perlhpux Perl notes for HP-UX
+ perlmachten Perl notes for Power MachTen
+ perlos2 Perl notes for OS/2
+ perlos390 Perl notes for OS/390
+ perlvms Perl notes for VMS
+ perlwin32 Perl notes for Windows
+
(If you're intending to read these straight through for the first time,
the suggested order will tend to reduce the number of forward references.)
-By default, all of the above manpages are installed in the
-F</usr/local/man/> directory.
+By default, the manpages listed above are installed in the
+F</usr/local/man/> directory.
Extensive additional documentation for Perl modules is available. The
default configuration for perl will place this additional documentation
@@ -116,17 +138,17 @@ Perl combines (in the author's opinion, anyway) some of the best
features of C, B<sed>, B<awk>, and B<sh>, so people familiar with
those languages should have little difficulty with it. (Language
historians will also note some vestiges of B<csh>, Pascal, and even
-BASIC-PLUS.) Expression syntax corresponds quite closely to C
+BASIC-PLUS.) Expression syntax corresponds closely to C
expression syntax. Unlike most Unix utilities, Perl does not
arbitrarily limit the size of your data--if you've got the memory,
Perl can slurp in your whole file as a single string. Recursion is of
unlimited depth. And the tables used by hashes (sometimes called
"associative arrays") grow as necessary to prevent degraded
performance. Perl can use sophisticated pattern matching techniques to
-scan large amounts of data very quickly. Although optimized for
+scan large amounts of data quickly. Although optimized for
scanning text, Perl can also deal with binary data, and can make dbm
files look like hashes. Setuid Perl scripts are safer than C programs
-through a dataflow tracing mechanism which prevents many stupid
+through a dataflow tracing mechanism that prevents many stupid
security holes.
If you have a problem that would ordinarily use B<sed> or B<awk> or
@@ -137,107 +159,63 @@ scripts into Perl scripts.
But wait, there's more...
-Perl version 5 is nearly a complete rewrite, and provides
-the following additional benefits:
-
-=over 5
+Begun in 1993 (see L<perlhist>), Perl version 5 is nearly a complete
+rewrite that provides the following additional benefits:
-=item * Many usability enhancements
+=over
-It is now possible to write much more readable Perl code (even within
-regular expressions). Formerly cryptic variable names can be replaced
-by mnemonic identifiers. Error messages are more informative, and the
-optional warnings will catch many of the mistakes a novice might make.
-This cannot be stressed enough. Whenever you get mysterious behavior,
-try the B<-w> switch!!! Whenever you don't get mysterious behavior,
-try using B<-w> anyway.
+=item * modularity and reusability using innumerable modules
-=item * Simplified grammar
+Described in L<perlmod>, L<perlmodlib>, and L<perlmodinstall>.
-The new yacc grammar is one half the size of the old one. Many of the
-arbitrary grammar rules have been regularized. The number of reserved
-words has been cut by 2/3. Despite this, nearly all old Perl scripts
-will continue to work unchanged.
+=item * embeddable and extensible
-=item * Lexical scoping
+Described in L<perlembed>, L<perlxstut>, L<perlxs>, L<perlcall>,
+L<perlguts>, and L<xsubpp>.
-Perl variables may now be declared within a lexical scope, like "auto"
-variables in C. Not only is this more efficient, but it contributes
-to better privacy for "programming in the large". Anonymous
-subroutines exhibit deep binding of lexical variables (closures).
+=item * roll-your-own magic variables (including multiple simultaneous DBM implementations)
-=item * Arbitrarily nested data structures
+Described in L<perltie> and L<AnyDBM_File>.
-Any scalar value, including any array element, may now contain a
-reference to any other variable or subroutine. You can easily create
-anonymous variables and subroutines. Perl manages your reference
-counts for you.
+=item * subroutines can now be overridden, autoloaded, and prototyped
-=item * Modularity and reusability
+Described in L<perlsub>.
-The Perl library is now defined in terms of modules which can be easily
-shared among various packages. A package may choose to import all or a
-portion of a module's published interface. Pragmas (that is, compiler
-directives) are defined and used by the same mechanism.
+=item * arbitrarily nested data structures and anonymous functions
-=item * Object-oriented programming
+Described in L<perlreftut>, L<perlref>, L<perldsc>, and L<perllol>.
-A package can function as a class. Dynamic multiple inheritance and
-virtual methods are supported in a straightforward manner and with very
-little new syntax. Filehandles may now be treated as objects.
+=item * object-oriented programming
-=item * Embeddable and Extensible
+Described in L<perlobj>, L<perltoot>, and L<perlbot>.
-Perl may now be embedded easily in your C or C++ application, and can
-either call or be called by your routines through a documented
-interface. The XS preprocessor is provided to make it easy to glue
-your C or C++ routines into Perl. Dynamic loading of modules is
-supported, and Perl itself can be made into a dynamic library.
+=item * compilability into C code or Perl bytecode
-=item * POSIX compliant
+Described in L<B> and L<B::Bytecode>.
-A major new module is the POSIX module, which provides access to all
-available POSIX routines and definitions, via object classes where
-appropriate.
+=item * support for light-weight processes (threads)
-=item * Package constructors and destructors
+Described in L<perlthrtut> and L<Thread>.
-The new BEGIN and END blocks provide means to capture control as
-a package is being compiled, and after the program exits. As a
-degenerate case they work just like awk's BEGIN and END when you
-use the B<-p> or B<-n> switches.
+=item * support for internationalization, localization, and Unicode
-=item * Multiple simultaneous DBM implementations
+Described in L<perllocale> and L<utf8>.
-A Perl program may now access DBM, NDBM, SDBM, GDBM, and Berkeley DB
-files from the same script simultaneously. In fact, the old dbmopen
-interface has been generalized to allow any variable to be tied
-to an object class which defines its access methods.
+=item * lexical scoping
-=item * Subroutine definitions may now be autoloaded
+Described in L<perlsub>.
-In fact, the AUTOLOAD mechanism also allows you to define any arbitrary
-semantics for undefined subroutine calls. It's not for just autoloading.
+=item * regular expression enhancements
-=item * Regular expression enhancements
+Described in L<perlre>, with additional examples in L<perlop>.
-You can now specify nongreedy quantifiers. You can now do grouping
-without creating a backreference. You can now write regular expressions
-with embedded whitespace and comments for readability. A consistent
-extensibility mechanism has been added that is upwardly compatible with
-all old regular expressions.
+=item * enhanced debugger and interactive Perl environment, with integrated editor support
-=item * Innumerable Unbundled Modules
+Described in L<perldebug>.
-The Comprehensive Perl Archive Network described in L<perlmodlib>
-contains hundreds of plug-and-play modules full of reusable code.
-See F<http://www.perl.com/CPAN> for a site near you.
+=item * POSIX 1003.1 compliant library
-=item * Compilability
-
-While not yet in full production mode, a working perl-to-C compiler
-does exist. It can generate portable byte code, simple C, or
-optimized C code.
+Described in L<POSIX>.
=back
@@ -245,76 +223,9 @@ Okay, that's I<definitely> enough hype.
=head1 AVAILABILITY
-Perl is available for the vast majority of operating system platforms,
-including most Unix-like platforms. The following situation is as of
-February 1999 and Perl 5.005_03.
-
-The following platforms are able to build Perl from the standard
-source code distribution available at
-F<http://www.perl.com/CPAN/src/index.html>
-
- AIX Linux SCO ODT/OSR
- A/UX MachTen Solaris
- BeOS MPE/iX SunOS
- BSD/OS NetBSD SVR4
- DG/UX NextSTEP Tru64 UNIX 3)
- DomainOS OpenBSD Ultrix
- DOS DJGPP 1) OpenSTEP UNICOS
- DYNIX/ptx OS/2 VMS
- FreeBSD OS390 2) VOS
- HP-UX PowerMAX Windows 3.1 1)
- Hurd QNX Windows 95 1) 4)
- IRIX Windows 98 1) 4)
- Windows NT 1) 4)
-
- 1) in DOS mode either the DOS or OS/2 ports can be used
- 2) formerly known as MVS
- 3) formerly known as Digital UNIX and before that DEC OSF/1
- 4) compilers: Borland, Cygwin32, Mingw32 EGCS/GCC, VC++
-
-The following platforms have been known to build Perl from the source
-but for the Perl release 5.005_03 we haven't been able to verify them,
-either because the hardware/software platforms are rather rare or
-because we don't have an active champion on these platforms, or both.
-
- 3b1 FPS Plan 9
- AmigaOS GENIX PowerUX
- ConvexOS Greenhills RISC/os
- CX/UX ISC Stellar
- DC/OSx MachTen 68k SVR2
- DDE SMES MiNT TI1500
- DOS EMX MPC TitanOS
- Dynix NEWS-OS UNICOS/mk
- EP/IX Opus Unisys Dynix
- ESIX Unixware
-
-The following platforms are planned to be supported in the standard
-source code distribution of the Perl release 5.006 but are not
-supported in the Perl release 5.005_03:
-
- BS2000
- Netware
- Rhapsody
- VM/ESA
-
-The following platforms have their own source code distributions and
-binaries available via F<http://www.perl.com/CPAN/ports/index.html>.
-
- Perl release
-
- AS/400 5.003
- MacOS 5.004
- Netware 5.003_07
- Tandem Guardian 5.004
-
-The following platforms have only binaries available via
-F<http://www.perl.com/CPAN/ports/index.html>.
-
- Perl release
-
- Acorn RISCOS 5.005_02
- AOS 5.002
- LynxOS 5.004_02
+Perl is available for most operating systems, including virtually
+all Unix-like platforms. See L<perlport/"Supported Platforms">
+for a listing.
=head1 ENVIRONMENT
@@ -322,12 +233,12 @@ See L<perlrun>.
=head1 AUTHOR
-Larry Wall <F<larry@wall.org>>, with the help of oodles of other folks.
+Larry Wall <larry@wall.org>, with the help of oodles of other folks.
-If your Perl success stories and testimonials may be of help to others
-who wish to advocate the use of Perl in their applications,
-or if you wish to simply express your gratitude to Larry and the
-Perl developers, please write to <F<perl-thanks@perl.org>>.
+If your Perl success stories and testimonials may be of help to others
+who wish to advocate the use of Perl in their applications,
+or if you wish to simply express your gratitude to Larry and the
+Perl developers, please write to perl-thanks@perl.org .
=head1 FILES
@@ -336,12 +247,15 @@ Perl developers, please write to <F<perl-thanks@perl.org>>.
=head1 SEE ALSO
a2p awk to perl translator
-
s2p sed to perl translator
+ http://www.perl.com/ the Perl Home Page
+ http://www.perl.com/CPAN the Comprehensive Perl Archive
+
=head1 DIAGNOSTICS
-The B<-w> switch produces some lovely diagnostics.
+The C<use warnings> pragma (and the B<-w> switch) produces some
+lovely diagnostics.
See L<perldiag> for explanations of all Perl's diagnostics. The C<use
diagnostics> pragma automatically turns Perl's normally terse warnings
@@ -349,7 +263,7 @@ and errors into these longer forms.
Compilation errors will tell you the line number of the error, with an
indication of the next token or token type that was to be examined.
-(In the case of a script passed to Perl via B<-e> switches, each
+(In a script passed to Perl via B<-e> switches, each
B<-e> is counted as one line.)
Setuid scripts have additional constraints that can produce error
@@ -378,10 +292,10 @@ so they are limited to a maximum of 65535 (higher numbers usually being
affected by wraparound).
You may mail your bug reports (be sure to include full configuration
-information as output by the myconfig program in the perl source tree,
-or by C<perl -V>) to <F<perlbug@perl.com>>.
-If you've succeeded in compiling perl, the perlbug script in the utils/
-subdirectory can be used to help mail in a bug report.
+information as output by the myconfig program in the perl source
+tree, or by C<perl -V>) to perlbug@perl.com . If you've succeeded
+in compiling perl, the B<perlbug> script in the F<utils/> subdirectory
+can be used to help mail in a bug report.
Perl actually stands for Pathologically Eclectic Rubbish Lister, but
don't tell anyone I said that.
diff --git a/contrib/perl5/pod/perl5004delta.pod b/contrib/perl5/pod/perl5004delta.pod
index 323830b..85a8f96 100644
--- a/contrib/perl5/pod/perl5004delta.pod
+++ b/contrib/perl5/pod/perl5004delta.pod
@@ -79,7 +79,7 @@ your scripts.
Before Perl 5.004, C<AUTOLOAD> functions were looked up as methods
(using the C<@ISA> hierarchy), even when the function to be autoloaded
was called as a plain function (e.g. C<Foo::bar()>), not a method
-(e.g. C<Foo-E<gt>bar()> or C<$obj-E<gt>bar()>).
+(e.g. C<< Foo->bar() >> or C<< $obj->bar() >>).
Perl 5.005 will use method lookup only for methods' C<AUTOLOAD>s.
However, there is a significant base of existing code that may be using
@@ -266,11 +266,11 @@ A subroutine reference may now be suffixed with an arrow and a
(possibly empty) parameter list. This syntax denotes a call of the
referenced subroutine, with the given parameters (if any).
-This new syntax follows the pattern of S<C<$hashref-E<gt>{FOO}>> and
-S<C<$aryref-E<gt>[$foo]>>: You may now write S<C<&$subref($foo)>> as
-S<C<$subref-E<gt>($foo)>>. All of these arrow terms may be chained;
-thus, S<C<&{$table-E<gt>{FOO}}($bar)>> may now be written
-S<C<$table-E<gt>{FOO}-E<gt>($bar)>>.
+This new syntax follows the pattern of S<C<< $hashref->{FOO} >>> and
+S<C<< $aryref->[$foo] >>>: You may now write S<C<&$subref($foo)>> as
+S<C<< $subref->($foo) >>>. All these arrow terms may be chained;
+thus, S<C<< &{$table->{FOO}}($bar) >>> may now be written
+S<C<< $table->{FOO}->($bar) >>>.
=back
@@ -758,7 +758,7 @@ details on how to get started with building this port.
There is also support for building perl under the Cygwin32 environment.
Cygwin32 is a set of GNU tools that make it possible to compile and run
-many UNIX programs under Windows NT by providing a mostly UNIX-like
+many Unix programs under Windows NT by providing a mostly Unix-like
interface for compilation and execution. See F<README.cygwin32> in the
perl distribution for more details on this port and how to obtain the
Cygwin32 toolkit.
@@ -936,7 +936,7 @@ requested with the ":flock" tag (e.g. C<use Fcntl ':flock'>).
=head2 IO
-The IO module provides a simple mechanism to load all of the IO modules at one
+The IO module provides a simple mechanism to load all the IO modules at one
go. Currently this includes:
IO::Handle
@@ -1290,7 +1290,7 @@ likely to eliminate these arbitrary limitations.
(F) A carriage return character was found in the input. This is an
error, and not a warning, because carriage return characters can break
-multi-line strings, including here documents (e.g., C<print E<lt>E<lt>EOF;>).
+multi-line strings, including here documents (e.g., C<print <<EOF;>).
=item Illegal switch in PERL5OPT: %s
@@ -1312,7 +1312,7 @@ architecture. On a 32-bit architecture the largest octal literal is
=item internal error: glob failed
(P) Something went wrong with the external program(s) used for C<glob>
-and C<E<lt>*.cE<gt>>. This may mean that your csh (C shell) is
+and C<< <*.c> >>. This may mean that your csh (C shell) is
broken. If so, you should change all of the csh-related variables in
config.sh: If you have tcsh, make the variables refer to it as if it
were csh (e.g. C<full_csh='/usr/bin/tcsh'>); otherwise, make them all
diff --git a/contrib/perl5/pod/perl5005delta.pod b/contrib/perl5/pod/perl5005delta.pod
new file mode 100644
index 0000000..b133c0d
--- /dev/null
+++ b/contrib/perl5/pod/perl5005delta.pod
@@ -0,0 +1,989 @@
+=head1 NAME
+
+perldelta - what's new for perl5.005
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.004 release and this one.
+
+=head1 About the new versioning system
+
+Perl is now developed on two tracks: a maintenance track that makes
+small, safe updates to released production versions with emphasis on
+compatibility; and a development track that pursues more aggressive
+evolution. Maintenance releases (which should be considered production
+quality) have subversion numbers that run from C<1> to C<49>, and
+development releases (which should be considered "alpha" quality) run
+from C<50> to C<99>.
+
+Perl 5.005 is the combined product of the new dual-track development
+scheme.
+
+=head1 Incompatible Changes
+
+=head2 WARNING: This version is not binary compatible with Perl 5.004.
+
+Starting with Perl 5.004_50 there were many deep and far-reaching changes
+to the language internals. If you have dynamically loaded extensions
+that you built under perl 5.003 or 5.004, you can continue to use them
+with 5.004, but you will need to rebuild and reinstall those extensions
+to use them 5.005. See F<INSTALL> for detailed instructions on how to
+upgrade.
+
+=head2 Default installation structure has changed
+
+The new Configure defaults are designed to allow a smooth upgrade from
+5.004 to 5.005, but you should read F<INSTALL> for a detailed
+discussion of the changes in order to adapt them to your system.
+
+=head2 Perl Source Compatibility
+
+When none of the experimental features are enabled, there should be
+very few user-visible Perl source compatibility issues.
+
+If threads are enabled, then some caveats apply. C<@_> and C<$_> become
+lexical variables. The effect of this should be largely transparent to
+the user, but there are some boundary conditions under which user will
+need to be aware of the issues. For example, C<local(@_)> results in
+a "Can't localize lexical variable @_ ..." message. This may be enabled
+in a future version.
+
+Some new keywords have been introduced. These are generally expected to
+have very little impact on compatibility. See L<New C<INIT> keyword>,
+L<New C<lock> keyword>, and L<New C<qr//> operator>.
+
+Certain barewords are now reserved. Use of these will provoke a warning
+if you have asked for them with the C<-w> switch.
+See L<C<our> is now a reserved word>.
+
+=head2 C Source Compatibility
+
+There have been a large number of changes in the internals to support
+the new features in this release.
+
+=over 4
+
+=item Core sources now require ANSI C compiler
+
+An ANSI C compiler is now B<required> to build perl. See F<INSTALL>.
+
+=item All Perl global variables must now be referenced with an explicit prefix
+
+All Perl global variables that are visible for use by extensions now
+have a C<PL_> prefix. New extensions should C<not> refer to perl globals
+by their unqualified names. To preserve sanity, we provide limited
+backward compatibility for globals that are being widely used like
+C<sv_undef> and C<na> (which should now be written as C<PL_sv_undef>,
+C<PL_na> etc.)
+
+If you find that your XS extension does not compile anymore because a
+perl global is not visible, try adding a C<PL_> prefix to the global
+and rebuild.
+
+It is strongly recommended that all functions in the Perl API that don't
+begin with C<perl> be referenced with a C<Perl_> prefix. The bare function
+names without the C<Perl_> prefix are supported with macros, but this
+support may cease in a future release.
+
+See L<perlguts/"API LISTING">.
+
+=item Enabling threads has source compatibility issues
+
+Perl built with threading enabled requires extensions to use the new
+C<dTHR> macro to initialize the handle to access per-thread data.
+If you see a compiler error that talks about the variable C<thr> not
+being declared (when building a module that has XS code), you need
+to add C<dTHR;> at the beginning of the block that elicited the error.
+
+The API function C<perl_get_sv("@",FALSE)> should be used instead of
+directly accessing perl globals as C<GvSV(errgv)>. The API call is
+backward compatible with existing perls and provides source compatibility
+with threading is enabled.
+
+See L<"C Source Compatibility"> for more information.
+
+=back
+
+=head2 Binary Compatibility
+
+This version is NOT binary compatible with older versions. All extensions
+will need to be recompiled. Further binaries built with threads enabled
+are incompatible with binaries built without. This should largely be
+transparent to the user, as all binary incompatible configurations have
+their own unique architecture name, and extension binaries get installed at
+unique locations. This allows coexistence of several configurations in
+the same directory hierarchy. See F<INSTALL>.
+
+=head2 Security fixes may affect compatibility
+
+A few taint leaks and taint omissions have been corrected. This may lead
+to "failure" of scripts that used to work with older versions. Compiling
+with -DINCOMPLETE_TAINTS provides a perl with minimal amounts of changes
+to the tainting behavior. But note that the resulting perl will have
+known insecurities.
+
+Oneliners with the C<-e> switch do not create temporary files anymore.
+
+=head2 Relaxed new mandatory warnings introduced in 5.004
+
+Many new warnings that were introduced in 5.004 have been made
+optional. Some of these warnings are still present, but perl's new
+features make them less often a problem. See L<New Diagnostics>.
+
+=head2 Licensing
+
+Perl has a new Social Contract for contributors. See F<Porting/Contract>.
+
+The license included in much of the Perl documentation has changed.
+Most of the Perl documentation was previously under the implicit GNU
+General Public License or the Artistic License (at the user's choice).
+Now much of the documentation unambiguously states the terms under which
+it may be distributed. Those terms are in general much less restrictive
+than the GNU GPL. See L<perl> and the individual perl man pages listed
+therein.
+
+=head1 Core Changes
+
+
+=head2 Threads
+
+WARNING: Threading is considered an B<experimental> feature. Details of the
+implementation may change without notice. There are known limitations
+and some bugs. These are expected to be fixed in future versions.
+
+See F<README.threads>.
+
+=head2 Compiler
+
+WARNING: The Compiler and related tools are considered B<experimental>.
+Features may change without notice, and there are known limitations
+and bugs. Since the compiler is fully external to perl, the default
+configuration will build and install it.
+
+The Compiler produces three different types of transformations of a
+perl program. The C backend generates C code that captures perl's state
+just before execution begins. It eliminates the compile-time overheads
+of the regular perl interpreter, but the run-time performance remains
+comparatively the same. The CC backend generates optimized C code
+equivalent to the code path at run-time. The CC backend has greater
+potential for big optimizations, but only a few optimizations are
+implemented currently. The Bytecode backend generates a platform
+independent bytecode representation of the interpreter's state
+just before execution. Thus, the Bytecode back end also eliminates
+much of the compilation overhead of the interpreter.
+
+The compiler comes with several valuable utilities.
+
+C<B::Lint> is an experimental module to detect and warn about suspicious
+code, especially the cases that the C<-w> switch does not detect.
+
+C<B::Deparse> can be used to demystify perl code, and understand
+how perl optimizes certain constructs.
+
+C<B::Xref> generates cross reference reports of all definition and use
+of variables, subroutines and formats in a program.
+
+C<B::Showlex> show the lexical variables used by a subroutine or file
+at a glance.
+
+C<perlcc> is a simple frontend for compiling perl.
+
+See C<ext/B/README>, L<B>, and the respective compiler modules.
+
+=head2 Regular Expressions
+
+Perl's regular expression engine has been seriously overhauled, and
+many new constructs are supported. Several bugs have been fixed.
+
+Here is an itemized summary:
+
+=over 4
+
+=item Many new and improved optimizations
+
+Changes in the RE engine:
+
+ Unneeded nodes removed;
+ Substrings merged together;
+ New types of nodes to process (SUBEXPR)* and similar expressions
+ quickly, used if the SUBEXPR has no side effects and matches
+ strings of the same length;
+ Better optimizations by lookup for constant substrings;
+ Better search for constants substrings anchored by $ ;
+
+Changes in Perl code using RE engine:
+
+ More optimizations to s/longer/short/;
+ study() was not working;
+ /blah/ may be optimized to an analogue of index() if $& $` $' not seen;
+ Unneeded copying of matched-against string removed;
+ Only matched part of the string is copying if $` $' were not seen;
+
+=item Many bug fixes
+
+Note that only the major bug fixes are listed here. See F<Changes> for others.
+
+ Backtracking might not restore start of $3.
+ No feedback if max count for * or + on "complex" subexpression
+ was reached, similarly (but at compile time) for {3,34567}
+ Primitive restrictions on max count introduced to decrease a
+ possibility of a segfault;
+ (ZERO-LENGTH)* could segfault;
+ (ZERO-LENGTH)* was prohibited;
+ Long REs were not allowed;
+ /RE/g could skip matches at the same position after a
+ zero-length match;
+
+=item New regular expression constructs
+
+The following new syntax elements are supported:
+
+ (?<=RE)
+ (?<!RE)
+ (?{ CODE })
+ (?i-x)
+ (?i:RE)
+ (?(COND)YES_RE|NO_RE)
+ (?>RE)
+ \z
+
+=item New operator for precompiled regular expressions
+
+See L<New C<qr//> operator>.
+
+=item Other improvements
+
+ Better debugging output (possibly with colors),
+ even from non-debugging Perl;
+ RE engine code now looks like C, not like assembler;
+ Behaviour of RE modifiable by `use re' directive;
+ Improved documentation;
+ Test suite significantly extended;
+ Syntax [:^upper:] etc., reserved inside character classes;
+
+=item Incompatible changes
+
+ (?i) localized inside enclosing group;
+ $( is not interpolated into RE any more;
+ /RE/g may match at the same position (with non-zero length)
+ after a zero-length match (bug fix).
+
+=back
+
+See L<perlre> and L<perlop>.
+
+=head2 Improved malloc()
+
+See banner at the beginning of C<malloc.c> for details.
+
+=head2 Quicksort is internally implemented
+
+Perl now contains its own highly optimized qsort() routine. The new qsort()
+is resistant to inconsistent comparison functions, so Perl's C<sort()> will
+not provoke coredumps any more when given poorly written sort subroutines.
+(Some C library C<qsort()>s that were being used before used to have this
+problem.) In our testing, the new C<qsort()> required the minimal number
+of pair-wise compares on average, among all known C<qsort()> implementations.
+
+See C<perlfunc/sort>.
+
+=head2 Reliable signals
+
+Perl's signal handling is susceptible to random crashes, because signals
+arrive asynchronously, and the Perl runtime is not reentrant at arbitrary
+times.
+
+However, one experimental implementation of reliable signals is available
+when threads are enabled. See C<Thread::Signal>. Also see F<INSTALL> for
+how to build a Perl capable of threads.
+
+=head2 Reliable stack pointers
+
+The internals now reallocate the perl stack only at predictable times.
+In particular, magic calls never trigger reallocations of the stack,
+because all reentrancy of the runtime is handled using a "stack of stacks".
+This should improve reliability of cached stack pointers in the internals
+and in XSUBs.
+
+=head2 More generous treatment of carriage returns
+
+Perl used to complain if it encountered literal carriage returns in
+scripts. Now they are mostly treated like whitespace within program text.
+Inside string literals and here documents, literal carriage returns are
+ignored if they occur paired with linefeeds, or get interpreted as whitespace
+if they stand alone. This behavior means that literal carriage returns
+in files should be avoided. You can get the older, more compatible (but
+less generous) behavior by defining the preprocessor symbol
+C<PERL_STRICT_CR> when building perl. Of course, all this has nothing
+whatever to do with how escapes like C<\r> are handled within strings.
+
+Note that this doesn't somehow magically allow you to keep all text files
+in DOS format. The generous treatment only applies to files that perl
+itself parses. If your C compiler doesn't allow carriage returns in
+files, you may still be unable to build modules that need a C compiler.
+
+=head2 Memory leaks
+
+C<substr>, C<pos> and C<vec> don't leak memory anymore when used in lvalue
+context. Many small leaks that impacted applications that embed multiple
+interpreters have been fixed.
+
+=head2 Better support for multiple interpreters
+
+The build-time option C<-DMULTIPLICITY> has had many of the details
+reworked. Some previously global variables that should have been
+per-interpreter now are. With care, this allows interpreters to call
+each other. See the C<PerlInterp> extension on CPAN.
+
+=head2 Behavior of local() on array and hash elements is now well-defined
+
+See L<perlsub/"Temporary Values via local()">.
+
+=head2 C<%!> is transparently tied to the L<Errno> module
+
+See L<perlvar>, and L<Errno>.
+
+=head2 Pseudo-hashes are supported
+
+See L<perlref>.
+
+=head2 C<EXPR foreach EXPR> is supported
+
+See L<perlsyn>.
+
+=head2 Keywords can be globally overridden
+
+See L<perlsub>.
+
+=head2 C<$^E> is meaningful on Win32
+
+See L<perlvar>.
+
+=head2 C<foreach (1..1000000)> optimized
+
+C<foreach (1..1000000)> is now optimized into a counting loop. It does
+not try to allocate a 1000000-size list anymore.
+
+=head2 C<Foo::> can be used as implicitly quoted package name
+
+Barewords caused unintuitive behavior when a subroutine with the same
+name as a package happened to be defined. Thus, C<new Foo @args>,
+use the result of the call to C<Foo()> instead of C<Foo> being treated
+as a literal. The recommended way to write barewords in the indirect
+object slot is C<new Foo:: @args>. Note that the method C<new()> is
+called with a first argument of C<Foo>, not C<Foo::> when you do that.
+
+=head2 C<exists $Foo::{Bar::}> tests existence of a package
+
+It was impossible to test for the existence of a package without
+actually creating it before. Now C<exists $Foo::{Bar::}> can be
+used to test if the C<Foo::Bar> namespace has been created.
+
+=head2 Better locale support
+
+See L<perllocale>.
+
+=head2 Experimental support for 64-bit platforms
+
+Perl5 has always had 64-bit support on systems with 64-bit longs.
+Starting with 5.005, the beginnings of experimental support for systems
+with 32-bit long and 64-bit 'long long' integers has been added.
+If you add -DUSE_LONG_LONG to your ccflags in config.sh (or manually
+define it in perl.h) then perl will be built with 'long long' support.
+There will be many compiler warnings, and the resultant perl may not
+work on all systems. There are many other issues related to
+third-party extensions and libraries. This option exists to allow
+people to work on those issues.
+
+=head2 prototype() returns useful results on builtins
+
+See L<perlfunc/prototype>.
+
+=head2 Extended support for exception handling
+
+C<die()> now accepts a reference value, and C<$@> gets set to that
+value in exception traps. This makes it possible to propagate
+exception objects. This is an undocumented B<experimental> feature.
+
+=head2 Re-blessing in DESTROY() supported for chaining DESTROY() methods
+
+See L<perlobj/Destructors>.
+
+=head2 All C<printf> format conversions are handled internally
+
+See L<perlfunc/printf>.
+
+=head2 New C<INIT> keyword
+
+C<INIT> subs are like C<BEGIN> and C<END>, but they get run just before
+the perl runtime begins execution. e.g., the Perl Compiler makes use of
+C<INIT> blocks to initialize and resolve pointers to XSUBs.
+
+=head2 New C<lock> keyword
+
+The C<lock> keyword is the fundamental synchronization primitive
+in threaded perl. When threads are not enabled, it is currently a noop.
+
+To minimize impact on source compatibility this keyword is "weak", i.e., any
+user-defined subroutine of the same name overrides it, unless a C<use Thread>
+has been seen.
+
+=head2 New C<qr//> operator
+
+The C<qr//> operator, which is syntactically similar to the other quote-like
+operators, is used to create precompiled regular expressions. This compiled
+form can now be explicitly passed around in variables, and interpolated in
+other regular expressions. See L<perlop>.
+
+=head2 C<our> is now a reserved word
+
+Calling a subroutine with the name C<our> will now provoke a warning when
+using the C<-w> switch.
+
+=head2 Tied arrays are now fully supported
+
+See L<Tie::Array>.
+
+=head2 Tied handles support is better
+
+Several missing hooks have been added. There is also a new base class for
+TIEARRAY implementations. See L<Tie::Array>.
+
+=head2 4th argument to substr
+
+substr() can now both return and replace in one operation. The optional
+4th argument is the replacement string. See L<perlfunc/substr>.
+
+=head2 Negative LENGTH argument to splice
+
+splice() with a negative LENGTH argument now work similar to what the
+LENGTH did for substr(). Previously a negative LENGTH was treated as
+0. See L<perlfunc/splice>.
+
+=head2 Magic lvalues are now more magical
+
+When you say something like C<substr($x, 5) = "hi">, the scalar returned
+by substr() is special, in that any modifications to it affect $x.
+(This is called a 'magic lvalue' because an 'lvalue' is something on
+the left side of an assignment.) Normally, this is exactly what you
+would expect to happen, but Perl uses the same magic if you use substr(),
+pos(), or vec() in a context where they might be modified, like taking
+a reference with C<\> or as an argument to a sub that modifies C<@_>.
+In previous versions, this 'magic' only went one way, but now changes
+to the scalar the magic refers to ($x in the above example) affect the
+magic lvalue too. For instance, this code now acts differently:
+
+ $x = "hello";
+ sub printit {
+ $x = "g'bye";
+ print $_[0], "\n";
+ }
+ printit(substr($x, 0, 5));
+
+In previous versions, this would print "hello", but it now prints "g'bye".
+
+=head2 <> now reads in records
+
+If C<$/> is a reference to an integer, or a scalar that holds an integer,
+<> will read in records instead of lines. For more info, see
+L<perlvar/$/>.
+
+=head1 Supported Platforms
+
+Configure has many incremental improvements. Site-wide policy for building
+perl can now be made persistent, via Policy.sh. Configure also records
+the command-line arguments used in F<config.sh>.
+
+=head2 New Platforms
+
+BeOS is now supported. See F<README.beos>.
+
+DOS is now supported under the DJGPP tools. See F<README.dos> (installed
+as L<perldos> on some systems).
+
+MiNT is now supported. See F<README.mint>.
+
+MPE/iX is now supported. See F<README.mpeix>.
+
+MVS (aka OS390, aka Open Edition) is now supported. See F<README.os390>
+(installed as L<perlos390> on some systems).
+
+Stratus VOS is now supported. See F<README.vos>.
+
+=head2 Changes in existing support
+
+Win32 support has been vastly enhanced. Support for Perl Object, a C++
+encapsulation of Perl. GCC and EGCS are now supported on Win32.
+See F<README.win32>, aka L<perlwin32>.
+
+VMS configuration system has been rewritten. See F<README.vms> (installed
+as L<README_vms> on some systems).
+
+The hints files for most Unix platforms have seen incremental improvements.
+
+=head1 Modules and Pragmata
+
+=head2 New Modules
+
+=over
+
+=item B
+
+Perl compiler and tools. See L<B>.
+
+=item Data::Dumper
+
+A module to pretty print Perl data. See L<Data::Dumper>.
+
+=item Dumpvalue
+
+A module to dump perl values to the screen. See L<Dumpvalue>.
+
+=item Errno
+
+A module to look up errors more conveniently. See L<Errno>.
+
+=item File::Spec
+
+A portable API for file operations.
+
+=item ExtUtils::Installed
+
+Query and manage installed modules.
+
+=item ExtUtils::Packlist
+
+Manipulate .packlist files.
+
+=item Fatal
+
+Make functions/builtins succeed or die.
+
+=item IPC::SysV
+
+Constants and other support infrastructure for System V IPC operations
+in perl.
+
+=item Test
+
+A framework for writing testsuites.
+
+=item Tie::Array
+
+Base class for tied arrays.
+
+=item Tie::Handle
+
+Base class for tied handles.
+
+=item Thread
+
+Perl thread creation, manipulation, and support.
+
+=item attrs
+
+Set subroutine attributes.
+
+=item fields
+
+Compile-time class fields.
+
+=item re
+
+Various pragmata to control behavior of regular expressions.
+
+=back
+
+=head2 Changes in existing modules
+
+=over
+
+=item Benchmark
+
+You can now run tests for I<x> seconds instead of guessing the right
+number of tests to run.
+
+=item Carp
+
+Carp has a new function cluck(). cluck() warns, like carp(), but also adds
+a stack backtrace to the error message, like confess().
+
+=item CGI
+
+CGI has been updated to version 2.42.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large (more than 4G) file access (the 64-bit support is not yet
+working, though, so no need to get overly excited), Free/Net/OpenBSD
+locking behaviour flags F_FLOCK, F_POSIX, Linux F_SHLCK, and
+O_ACCMODE: the mask of O_RDONLY, O_WRONLY, and O_RDWR.
+
+=item Math::Complex
+
+The accessors methods Re, Im, arg, abs, rho, theta, methods can
+($z->Re()) now also act as mutators ($z->Re(3)).
+
+=item Math::Trig
+
+A little bit of radial trigonometry (cylindrical and spherical) added,
+for example the great circle distance.
+
+=item POSIX
+
+POSIX now has its own platform-specific hints files.
+
+=item DB_File
+
+DB_File supports version 2.x of Berkeley DB. See C<ext/DB_File/Changes>.
+
+=item MakeMaker
+
+MakeMaker now supports writing empty makefiles, provides a way to
+specify that site umask() policy should be honored. There is also
+better support for manipulation of .packlist files, and getting
+information about installed modules.
+
+Extensions that have both architecture-dependent and
+architecture-independent files are now always installed completely in
+the architecture-dependent locations. Previously, the shareable parts
+were shared both across architectures and across perl versions and were
+therefore liable to be overwritten with newer versions that might have
+subtle incompatibilities.
+
+=item CPAN
+
+See <perlmodinstall> and L<CPAN>.
+
+=item Cwd
+
+Cwd::cwd is faster on most platforms.
+
+=item Benchmark
+
+Keeps better time.
+
+=back
+
+=head1 Utility Changes
+
+C<h2ph> and related utilities have been vastly overhauled.
+
+C<perlcc>, a new experimental front end for the compiler is available.
+
+The crude GNU C<configure> emulator is now called C<configure.gnu> to
+avoid trampling on C<Configure> under case-insensitive filesystems.
+
+C<perldoc> used to be rather slow. The slower features are now optional.
+In particular, case-insensitive searches need the C<-i> switch, and
+recursive searches need C<-r>. You can set these switches in the
+C<PERLDOC> environment variable to get the old behavior.
+
+=head1 Documentation Changes
+
+Config.pm now has a glossary of variables.
+
+F<Porting/patching.pod> has detailed instructions on how to create and
+submit patches for perl.
+
+L<perlport> specifies guidelines on how to write portably.
+
+L<perlmodinstall> describes how to fetch and install modules from C<CPAN>
+sites.
+
+Some more Perl traps are documented now. See L<perltrap>.
+
+L<perlopentut> gives a tutorial on using open().
+
+L<perlreftut> gives a tutorial on references.
+
+L<perlthrtut> gives a tutorial on threads.
+
+=head1 New Diagnostics
+
+=over
+
+=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
+
+(W) A subroutine you have declared has the same name as a Perl keyword,
+and you have used the name without qualification for calling one or the
+other. Perl decided to call the builtin because the subroutine is
+not imported.
+
+To force interpretation as a subroutine call, either put an ampersand
+before the subroutine name, or qualify the name with its package.
+Alternatively, you can import the subroutine (or pretend that it's
+imported with the C<use subs> pragma).
+
+To silently interpret it as the Perl operator, use the C<CORE::> prefix
+on the operator (e.g. C<CORE::log($x)>) or by declaring the subroutine
+to be an object method (see L<attrs>).
+
+=item Bad index while coercing array into hash
+
+(F) The index looked up in the hash found as the 0'th element of a
+pseudo-hash is not legal. Index values must be at 1 or greater.
+See L<perlref>.
+
+=item Bareword "%s" refers to nonexistent package
+
+(W) You used a qualified bareword of the form C<Foo::>, but
+the compiler saw no other uses of that namespace before that point.
+Perhaps you need to predeclare a package?
+
+=item Can't call method "%s" on an undefined value
+
+(F) You used the syntax of a method call, but the slot filled by the
+object reference or package name contains an undefined value.
+Something like this will reproduce the error:
+
+ $BADREF = 42;
+ process $BADREF 1,2,3;
+ $BADREF->process(1,2,3);
+
+=item Can't check filesystem of script "%s" for nosuid
+
+(P) For some reason you can't check the filesystem of the script for nosuid.
+
+=item Can't coerce array into hash
+
+(F) You used an array where a hash was expected, but the array has no
+information on how to map from keys to array indices. You can do that
+only with arrays that have a hash reference at index 0.
+
+=item Can't goto subroutine from an eval-string
+
+(F) The "goto subroutine" call can't be used to jump out of an eval "string".
+(You can use it to jump out of an eval {BLOCK}, but you probably don't want to.)
+
+=item Can't localize pseudo-hash element
+
+(F) You said something like C<< local $ar->{'key'} >>, where $ar is
+a reference to a pseudo-hash. That hasn't been implemented yet, but
+you can get a similar effect by localizing the corresponding array
+element directly -- C<< local $ar->[$ar->[0]{'key'}] >>.
+
+=item Can't use %%! because Errno.pm is not available
+
+(F) The first time the %! hash is used, perl automatically loads the
+Errno.pm module. The Errno module is expected to tie the %! hash to
+provide symbolic names for C<$!> errno values.
+
+=item Cannot find an opnumber for "%s"
+
+(F) A string of a form C<CORE::word> was given to prototype(), but
+there is no builtin with the name C<word>.
+
+=item Character class syntax [. .] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[." and ending with ".]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[." and ".\]".
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Character class syntax [= =] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax
+beginning with "[=" and ending with "=]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[=" and "=\]".
+
+=item %s: Eval-group in insecure regular expression
+
+(F) Perl detected tainted data when trying to compile a regular expression
+that contains the C<(?{ ... })> zero-width assertion, which is unsafe.
+See L<perlre/(?{ code })>, and L<perlsec>.
+
+=item %s: Eval-group not allowed, use re 'eval'
+
+(F) A regular expression contained the C<(?{ ... })> zero-width assertion,
+but that construct is only allowed when the C<use re 'eval'> pragma is
+in effect. See L<perlre/(?{ code })>.
+
+=item %s: Eval-group not allowed at run time
+
+(F) Perl tried to compile a regular expression containing the C<(?{ ... })>
+zero-width assertion at run time, as it would when the pattern contains
+interpolated values. Since that is a security risk, it is not allowed.
+If you insist, you may still do this by explicitly building the pattern
+from an interpolated string at run time and using that in an eval().
+See L<perlre/(?{ code })>.
+
+=item Explicit blessing to '' (assuming package main)
+
+(W) You are blessing a reference to a zero length string. This has
+the effect of blessing the reference into the package main. This is
+usually not what you want. Consider providing a default target
+package, e.g. bless($ref, $p || 'MyPackage');
+
+=item Illegal hex digit ignored
+
+(W) You may have tried to use a character other than 0 - 9 or A - F in a
+hexadecimal number. Interpretation of the hexadecimal number stopped
+before the illegal character.
+
+=item No such array field
+
+(F) You tried to access an array as a hash, but the field name used is
+not defined. The hash at index 0 should map all valid field names to
+array indices for that to work.
+
+=item No such field "%s" in variable %s of type %s
+
+(F) You tried to access a field of a typed variable where the type
+does not know about the field name. The field names are looked up in
+the %FIELDS hash in the type package at compile time. The %FIELDS hash
+is usually set up with the 'fields' pragma.
+
+=item Out of memory during ridiculously large request
+
+(F) You can't allocate more than 2^31+"small amount" bytes. This error
+is most likely to be caused by a typo in the Perl program. e.g., C<$arr[time]>
+instead of C<$arr[$time]>.
+
+=item Range iterator outside integer range
+
+(F) One (or both) of the numeric arguments to the range operator ".."
+are outside the range which can be represented by integers internally.
+One possible workaround is to force Perl to use magical string
+increment by prepending "0" to your numbers.
+
+=item Recursive inheritance detected while looking for method '%s' in package '%s'
+
+(F) More than 100 levels of inheritance were encountered while invoking a
+method. Probably indicates an unintended loop in your inheritance hierarchy.
+
+=item Reference found where even-sized list expected
+
+(W) You gave a single reference where Perl was expecting a list with
+an even number of elements (for assignment to a hash). This
+usually means that you used the anon hash constructor when you meant
+to use parens. In any case, a hash requires key/value B<pairs>.
+
+ %hash = { one => 1, two => 2, }; # WRONG
+ %hash = [ qw/ an anon array / ]; # WRONG
+ %hash = ( one => 1, two => 2, ); # right
+ %hash = qw( one 1 two 2 ); # also fine
+
+=item Undefined value assigned to typeglob
+
+(W) An undefined value was assigned to a typeglob, a la C<*foo = undef>.
+This does nothing. It's possible that you really mean C<undef *foo>.
+
+=item Use of reserved word "%s" is deprecated
+
+(D) The indicated bareword is a reserved word. Future versions of perl
+may use it as a keyword, so you're better off either explicitly quoting
+the word in a manner appropriate for its context of use, or using a
+different name altogether. The warning can be suppressed for subroutine
+names by either adding a C<&> prefix, or using a package qualifier,
+e.g. C<&our()>, or C<Foo::our()>.
+
+=item perl: warning: Setting locale failed.
+
+(S) The whole warning message will look something like:
+
+ perl: warning: Setting locale failed.
+ perl: warning: Please check that your locale settings:
+ LC_ALL = "En_US",
+ LANG = (unset)
+ are supported and installed on your system.
+ perl: warning: Falling back to the standard locale ("C").
+
+Exactly what were the failed locale settings varies. In the above the
+settings were that the LC_ALL was "En_US" and the LANG had no value.
+This error means that Perl detected that you and/or your system
+administrator have set up the so-called variable system but Perl could
+not use those settings. This was not dead serious, fortunately: there
+is a "default locale" called "C" that Perl can and will use, the
+script will be run. Before you really fix the problem, however, you
+will get the same error message each time you run Perl. How to really
+fix the problem can be found in L<perllocale/"LOCALE PROBLEMS">.
+
+=back
+
+
+=head1 Obsolete Diagnostics
+
+=over
+
+=item Can't mktemp()
+
+(F) The mktemp() routine failed for some reason while trying to process
+a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item Can't write to temp file for B<-e>: %s
+
+(F) The write routine failed for some reason while trying to process
+a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item Cannot open temporary file
+
+(F) The create routine failed for some reason while trying to process
+a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+
+Removed because B<-e> doesn't use temporary files any more.
+
+=item regexp too big
+
+(F) The current implementation of regular expressions uses shorts as
+address offsets within a string. Unfortunately this means that if
+the regular expression compiles to longer than 32767, it'll blow up.
+Usually when you want a regular expression this big, there is a better
+way to do it with multiple statements. See L<perlre>.
+
+=back
+
+=head1 Configuration Changes
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl. This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head1 BUGS
+
+If you find what you think is a bug, you might check the headers of
+recently posted articles in the comp.lang.perl.misc newsgroup.
+There may also be information at http://www.perl.com/perl/, the Perl
+Home Page.
+
+If you believe you have an unreported bug, please run the B<perlbug>
+program included with your release. Make sure you trim your bug down
+to a tiny but sufficient test case. Your bug report, along with the
+output of C<perl -V>, will be sent off to <F<perlbug@perl.com>> to be
+analysed by the Perl porting team.
+
+=head1 SEE ALSO
+
+The F<Changes> file for exhaustive details on what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=head1 HISTORY
+
+Written by Gurusamy Sarathy <F<gsar@activestate.com>>, with many contributions
+from The Perl Porters.
+
+Send omissions or corrections to <F<perlbug@perl.com>>.
+
+=cut
diff --git a/contrib/perl5/pod/perlapi.pod b/contrib/perl5/pod/perlapi.pod
new file mode 100644
index 0000000..e0ae4cf
--- /dev/null
+++ b/contrib/perl5/pod/perlapi.pod
@@ -0,0 +1,2232 @@
+=head1 NAME
+
+perlapi - autogenerated documentation for the perl public API
+
+=head1 DESCRIPTION
+
+This file contains the documentation of the perl public API generated by
+embed.pl, specifically a listing of functions, macros, flags, and variables
+that may be used by extension writers. The interfaces of any functions that
+are not listed here are subject to change without notice. For this reason,
+blindly using functions listed in proto.h is to be avoided when writing
+extensions.
+
+Note that all Perl API global variables must be referenced with the C<PL_>
+prefix. Some macros are provided for compatibility with the older,
+unadorned names, but this support may be disabled in a future release.
+
+The listing is alphabetical, case insensitive.
+
+=over 8
+
+=item AvFILL
+
+Same as C<av_len()>. Deprecated, use C<av_len()> instead.
+
+ int AvFILL(AV* av)
+
+=item av_clear
+
+Clears an array, making it empty. Does not free the memory used by the
+array itself.
+
+ void av_clear(AV* ar)
+
+=item av_extend
+
+Pre-extend an array. The C<key> is the index to which the array should be
+extended.
+
+ void av_extend(AV* ar, I32 key)
+
+=item av_fetch
+
+Returns the SV at the specified index in the array. The C<key> is the
+index. If C<lval> is set then the fetch will be part of a store. Check
+that the return value is non-null before dereferencing it to a C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays.
+
+ SV** av_fetch(AV* ar, I32 key, I32 lval)
+
+=item av_len
+
+Returns the highest index in the array. Returns -1 if the array is
+empty.
+
+ I32 av_len(AV* ar)
+
+=item av_make
+
+Creates a new AV and populates it with a list of SVs. The SVs are copied
+into the array, so they may be freed after the call to av_make. The new AV
+will have a reference count of 1.
+
+ AV* av_make(I32 size, SV** svp)
+
+=item av_pop
+
+Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
+is empty.
+
+ SV* av_pop(AV* ar)
+
+=item av_push
+
+Pushes an SV onto the end of the array. The array will grow automatically
+to accommodate the addition.
+
+ void av_push(AV* ar, SV* val)
+
+=item av_shift
+
+Shifts an SV off the beginning of the array.
+
+ SV* av_shift(AV* ar)
+
+=item av_store
+
+Stores an SV in an array. The array index is specified as C<key>. The
+return value will be NULL if the operation failed or if the value did not
+need to be actually stored within the array (as in the case of tied
+arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
+that the caller is responsible for suitably incrementing the reference
+count of C<val> before the call, and decrementing it if the function
+returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
+more information on how to use this function on tied arrays.
+
+ SV** av_store(AV* ar, I32 key, SV* val)
+
+=item av_undef
+
+Undefines the array. Frees the memory used by the array itself.
+
+ void av_undef(AV* ar)
+
+=item av_unshift
+
+Unshift the given number of C<undef> values onto the beginning of the
+array. The array will grow automatically to accommodate the addition. You
+must then use C<av_store> to assign values to these new elements.
+
+ void av_unshift(AV* ar, I32 num)
+
+=item call_argv
+
+Performs a callback to the specified Perl sub. See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_argv(const char* sub_name, I32 flags, char** argv)
+
+=item call_method
+
+Performs a callback to the specified Perl method. The blessed object must
+be on the stack. See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_method(const char* methname, I32 flags)
+
+=item call_pv
+
+Performs a callback to the specified Perl sub. See L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_pv(const char* sub_name, I32 flags)
+
+=item call_sv
+
+Performs a callback to the Perl sub whose name is in the SV. See
+L<perlcall>.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 call_sv(SV* sv, I32 flags)
+
+=item CLASS
+
+Variable which is setup by C<xsubpp> to indicate the
+class name for a C++ XS constructor. This is always a C<char*>. See C<THIS>.
+
+ char* CLASS
+
+=item Copy
+
+The XSUB-writer's interface to the C C<memcpy> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. May fail on overlapping copies. See also C<Move>.
+
+ void Copy(void* src, void* dest, int nitems, type)
+
+=item croak
+
+This is the XSUB-writer's interface to Perl's C<die> function. Use this
+function the same way you use the C C<printf> function. See
+C<warn>.
+
+ void croak(const char* pat, ...)
+
+=item CvSTASH
+
+Returns the stash of the CV.
+
+ HV* CvSTASH(CV* cv)
+
+=item dMARK
+
+Declare a stack marker variable, C<mark>, for the XSUB. See C<MARK> and
+C<dORIGMARK>.
+
+ dMARK;
+
+=item dORIGMARK
+
+Saves the original stack mark for the XSUB. See C<ORIGMARK>.
+
+ dORIGMARK;
+
+=item dSP
+
+Declares a local copy of perl's stack pointer for the XSUB, available via
+the C<SP> macro. See C<SP>.
+
+ dSP;
+
+=item dXSARGS
+
+Sets up stack and mark pointers for an XSUB, calling dSP and dMARK. This
+is usually handled automatically by C<xsubpp>. Declares the C<items>
+variable to indicate the number of items on the stack.
+
+ dXSARGS;
+
+=item dXSI32
+
+Sets up the C<ix> variable for an XSUB which has aliases. This is usually
+handled automatically by C<xsubpp>.
+
+ dXSI32;
+
+=item ENTER
+
+Opening bracket on a callback. See C<LEAVE> and L<perlcall>.
+
+ ENTER;
+
+=item eval_pv
+
+Tells Perl to C<eval> the given string and return an SV* result.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ SV* eval_pv(const char* p, I32 croak_on_error)
+
+=item eval_sv
+
+Tells Perl to C<eval> the string in the SV.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ I32 eval_sv(SV* sv, I32 flags)
+
+=item EXTEND
+
+Used to extend the argument stack for an XSUB's return values. Once
+used, guarrantees that there is room for at least C<nitems> to be pushed
+onto the stack.
+
+ void EXTEND(SP, int nitems)
+
+=item fbm_compile
+
+Analyses the string in order to make fast searches on it using fbm_instr()
+-- the Boyer-Moore algorithm.
+
+ void fbm_compile(SV* sv, U32 flags)
+
+=item fbm_instr
+
+Returns the location of the SV in the string delimited by C<str> and
+C<strend>. It returns C<Nullch> if the string can't be found. The C<sv>
+does not have to be fbm_compiled, but the search will not be as fast
+then.
+
+ char* fbm_instr(unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags)
+
+=item FREETMPS
+
+Closing bracket for temporaries on a callback. See C<SAVETMPS> and
+L<perlcall>.
+
+ FREETMPS;
+
+=item get_av
+
+Returns the AV of the specified Perl array. If C<create> is set and the
+Perl variable does not exist then it will be created. If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ AV* get_av(const char* name, I32 create)
+
+=item get_cv
+
+Returns the CV of the specified Perl subroutine. If C<create> is set and
+the Perl subroutine does not exist then it will be declared (which has the
+same effect as saying C<sub name;>). If C<create> is not set and the
+subroutine does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ CV* get_cv(const char* name, I32 create)
+
+=item get_hv
+
+Returns the HV of the specified Perl hash. If C<create> is set and the
+Perl variable does not exist then it will be created. If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ HV* get_hv(const char* name, I32 create)
+
+=item get_sv
+
+Returns the SV of the specified Perl scalar. If C<create> is set and the
+Perl variable does not exist then it will be created. If C<create> is not
+set and the variable does not exist then NULL is returned.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ SV* get_sv(const char* name, I32 create)
+
+=item GIMME
+
+A backward-compatible version of C<GIMME_V> which can only return
+C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
+Deprecated. Use C<GIMME_V> instead.
+
+ U32 GIMME
+
+=item GIMME_V
+
+The XSUB-writer's equivalent to Perl's C<wantarray>. Returns C<G_VOID>,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or array context,
+respectively.
+
+ U32 GIMME_V
+
+=item GvSV
+
+Return the SV from the GV.
+
+ SV* GvSV(GV* gv)
+
+=item gv_fetchmeth
+
+Returns the glob with the given C<name> and a defined subroutine or
+C<NULL>. The glob lives in the given C<stash>, or in the stashes
+accessible via @ISA and @UNIVERSAL.
+
+The argument C<level> should be either 0 or -1. If C<level==0>, as a
+side-effect creates a glob with the given C<name> in the given C<stash>
+which in the case of success contains an alias for the subroutine, and sets
+up caching info for this glob. Similarly for all the searched stashes.
+
+This function grants C<"SUPER"> token as a postfix of the stash name. The
+GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
+visible to Perl code. So when calling C<call_sv>, you should not use
+the GV directly; instead, you should use the method's CV, which can be
+obtained from the GV with the C<GvCV> macro.
+
+ GV* gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level)
+
+=item gv_fetchmethod
+
+See L<gv_fetchmethod_autoload>.
+
+ GV* gv_fetchmethod(HV* stash, const char* name)
+
+=item gv_fetchmethod_autoload
+
+Returns the glob which contains the subroutine to call to invoke the method
+on the C<stash>. In fact in the presence of autoloading this may be the
+glob for "AUTOLOAD". In this case the corresponding variable $AUTOLOAD is
+already setup.
+
+The third parameter of C<gv_fetchmethod_autoload> determines whether
+AUTOLOAD lookup is performed if the given method is not present: non-zero
+means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
+Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
+with a non-zero C<autoload> parameter.
+
+These functions grant C<"SUPER"> token as a prefix of the method name. Note
+that if you want to keep the returned glob for a long time, you need to
+check for it being "AUTOLOAD", since at the later time the call may load a
+different subroutine due to $AUTOLOAD changing its value. Use the glob
+created via a side effect to do this.
+
+These functions have the same side-effects and as C<gv_fetchmeth> with
+C<level==0>. C<name> should be writable if contains C<':'> or C<'
+''>. The warning against passing the GV returned by C<gv_fetchmeth> to
+C<call_sv> apply equally to these functions.
+
+ GV* gv_fetchmethod_autoload(HV* stash, const char* name, I32 autoload)
+
+=item gv_stashpv
+
+Returns a pointer to the stash for a specified package. C<name> should
+be a valid UTF-8 string. If C<create> is set then the package will be
+created if it does not already exist. If C<create> is not set and the
+package does not exist then NULL is returned.
+
+ HV* gv_stashpv(const char* name, I32 create)
+
+=item gv_stashsv
+
+Returns a pointer to the stash for a specified package, which must be a
+valid UTF-8 string. See C<gv_stashpv>.
+
+ HV* gv_stashsv(SV* sv, I32 create)
+
+=item G_ARRAY
+
+Used to indicate array context. See C<GIMME_V>, C<GIMME> and
+L<perlcall>.
+
+=item G_DISCARD
+
+Indicates that arguments returned from a callback should be discarded. See
+L<perlcall>.
+
+=item G_EVAL
+
+Used to force a Perl C<eval> wrapper around a callback. See
+L<perlcall>.
+
+=item G_NOARGS
+
+Indicates that no arguments are being sent to a callback. See
+L<perlcall>.
+
+=item G_SCALAR
+
+Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
+L<perlcall>.
+
+=item G_VOID
+
+Used to indicate void context. See C<GIMME_V> and L<perlcall>.
+
+=item HEf_SVKEY
+
+This flag, used in the length slot of hash entries and magic structures,
+specifies the structure contains a C<SV*> pointer where a C<char*> pointer
+is to be expected. (For information only--not to be used).
+
+=item HeHASH
+
+Returns the computed hash stored in the hash entry.
+
+ U32 HeHASH(HE* he)
+
+=item HeKEY
+
+Returns the actual pointer stored in the key slot of the hash entry. The
+pointer may be either C<char*> or C<SV*>, depending on the value of
+C<HeKLEN()>. Can be assigned to. The C<HePV()> or C<HeSVKEY()> macros are
+usually preferable for finding the value of a key.
+
+ void* HeKEY(HE* he)
+
+=item HeKLEN
+
+If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
+holds an C<SV*> key. Otherwise, holds the actual length of the key. Can
+be assigned to. The C<HePV()> macro is usually preferable for finding key
+lengths.
+
+ STRLEN HeKLEN(HE* he)
+
+=item HePV
+
+Returns the key slot of the hash entry as a C<char*> value, doing any
+necessary dereferencing of possibly C<SV*> keys. The length of the string
+is placed in C<len> (this is a macro, so do I<not> use C<&len>). If you do
+not care about what the length of the key is, you may use the global
+variable C<PL_na>, though this is rather less efficient than using a local
+variable. Remember though, that hash keys in perl are free to contain
+embedded nulls, so using C<strlen()> or similar is not a good way to find
+the length of hash keys. This is very similar to the C<SvPV()> macro
+described elsewhere in this document.
+
+ char* HePV(HE* he, STRLEN len)
+
+=item HeSVKEY
+
+Returns the key as an C<SV*>, or C<Nullsv> if the hash entry does not
+contain an C<SV*> key.
+
+ SV* HeSVKEY(HE* he)
+
+=item HeSVKEY_force
+
+Returns the key as an C<SV*>. Will create and return a temporary mortal
+C<SV*> if the hash entry contains only a C<char*> key.
+
+ SV* HeSVKEY_force(HE* he)
+
+=item HeSVKEY_set
+
+Sets the key to a given C<SV*>, taking care to set the appropriate flags to
+indicate the presence of an C<SV*> key, and returns the same
+C<SV*>.
+
+ SV* HeSVKEY_set(HE* he, SV* sv)
+
+=item HeVAL
+
+Returns the value slot (type C<SV*>) stored in the hash entry.
+
+ SV* HeVAL(HE* he)
+
+=item HvNAME
+
+Returns the package name of a stash. See C<SvSTASH>, C<CvSTASH>.
+
+ char* HvNAME(HV* stash)
+
+=item hv_clear
+
+Clears a hash, making it empty.
+
+ void hv_clear(HV* tb)
+
+=item hv_delete
+
+Deletes a key/value pair in the hash. The value SV is removed from the
+hash and returned to the caller. The C<klen> is the length of the key.
+The C<flags> value will normally be zero; if set to G_DISCARD then NULL
+will be returned.
+
+ SV* hv_delete(HV* tb, const char* key, U32 klen, I32 flags)
+
+=item hv_delete_ent
+
+Deletes a key/value pair in the hash. The value SV is removed from the
+hash and returned to the caller. The C<flags> value will normally be zero;
+if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
+precomputed hash value, or 0 to ask for it to be computed.
+
+ SV* hv_delete_ent(HV* tb, SV* key, I32 flags, U32 hash)
+
+=item hv_exists
+
+Returns a boolean indicating whether the specified hash key exists. The
+C<klen> is the length of the key.
+
+ bool hv_exists(HV* tb, const char* key, U32 klen)
+
+=item hv_exists_ent
+
+Returns a boolean indicating whether the specified hash key exists. C<hash>
+can be a valid precomputed hash value, or 0 to ask for it to be
+computed.
+
+ bool hv_exists_ent(HV* tb, SV* key, U32 hash)
+
+=item hv_fetch
+
+Returns the SV which corresponds to the specified key in the hash. The
+C<klen> is the length of the key. If C<lval> is set then the fetch will be
+part of a store. Check that the return value is non-null before
+dereferencing it to a C<SV*>.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ SV** hv_fetch(HV* tb, const char* key, U32 klen, I32 lval)
+
+=item hv_fetch_ent
+
+Returns the hash entry which corresponds to the specified key in the hash.
+C<hash> must be a valid precomputed hash number for the given C<key>, or 0
+if you want the function to compute it. IF C<lval> is set then the fetch
+will be part of a store. Make sure the return value is non-null before
+accessing it. The return value when C<tb> is a tied hash is a pointer to a
+static location, so be sure to make a copy of the structure if you need to
+store it somewhere.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ HE* hv_fetch_ent(HV* tb, SV* key, I32 lval, U32 hash)
+
+=item hv_iterinit
+
+Prepares a starting point to traverse a hash table. Returns the number of
+keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
+currently only meaningful for hashes without tie magic.
+
+NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
+hash buckets that happen to be in use. If you still need that esoteric
+value, you can get it through the macro C<HvFILL(tb)>.
+
+ I32 hv_iterinit(HV* tb)
+
+=item hv_iterkey
+
+Returns the key from the current position of the hash iterator. See
+C<hv_iterinit>.
+
+ char* hv_iterkey(HE* entry, I32* retlen)
+
+=item hv_iterkeysv
+
+Returns the key as an C<SV*> from the current position of the hash
+iterator. The return value will always be a mortal copy of the key. Also
+see C<hv_iterinit>.
+
+ SV* hv_iterkeysv(HE* entry)
+
+=item hv_iternext
+
+Returns entries from a hash iterator. See C<hv_iterinit>.
+
+ HE* hv_iternext(HV* tb)
+
+=item hv_iternextsv
+
+Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
+operation.
+
+ SV* hv_iternextsv(HV* hv, char** key, I32* retlen)
+
+=item hv_iterval
+
+Returns the value from the current position of the hash iterator. See
+C<hv_iterkey>.
+
+ SV* hv_iterval(HV* tb, HE* entry)
+
+=item hv_magic
+
+Adds magic to a hash. See C<sv_magic>.
+
+ void hv_magic(HV* hv, GV* gv, int how)
+
+=item hv_store
+
+Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
+the length of the key. The C<hash> parameter is the precomputed hash
+value; if it is zero then Perl will compute it. The return value will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes). Otherwise it can
+be dereferenced to get the original C<SV*>. Note that the caller is
+responsible for suitably incrementing the reference count of C<val> before
+the call, and decrementing it if the function returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ SV** hv_store(HV* tb, const char* key, U32 klen, SV* val, U32 hash)
+
+=item hv_store_ent
+
+Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
+parameter is the precomputed hash value; if it is zero then Perl will
+compute it. The return value is the new hash entry so created. It will be
+NULL if the operation failed or if the value did not need to be actually
+stored within the hash (as in the case of tied hashes). Otherwise the
+contents of the return value can be accessed using the C<He???> macros
+described here. Note that the caller is responsible for suitably
+incrementing the reference count of C<val> before the call, and
+decrementing it if the function returned NULL.
+
+See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
+information on how to use this function on tied hashes.
+
+ HE* hv_store_ent(HV* tb, SV* key, SV* val, U32 hash)
+
+=item hv_undef
+
+Undefines the hash.
+
+ void hv_undef(HV* tb)
+
+=item isALNUM
+
+Returns a boolean indicating whether the C C<char> is an ascii alphanumeric
+character or digit.
+
+ bool isALNUM(char ch)
+
+=item isALPHA
+
+Returns a boolean indicating whether the C C<char> is an ascii alphabetic
+character.
+
+ bool isALPHA(char ch)
+
+=item isDIGIT
+
+Returns a boolean indicating whether the C C<char> is an ascii
+digit.
+
+ bool isDIGIT(char ch)
+
+=item isLOWER
+
+Returns a boolean indicating whether the C C<char> is a lowercase
+character.
+
+ bool isLOWER(char ch)
+
+=item isSPACE
+
+Returns a boolean indicating whether the C C<char> is whitespace.
+
+ bool isSPACE(char ch)
+
+=item isUPPER
+
+Returns a boolean indicating whether the C C<char> is an uppercase
+character.
+
+ bool isUPPER(char ch)
+
+=item items
+
+Variable which is setup by C<xsubpp> to indicate the number of
+items on the stack. See L<perlxs/"Variable-length Parameter Lists">.
+
+ I32 items
+
+=item ix
+
+Variable which is setup by C<xsubpp> to indicate which of an
+XSUB's aliases was used to invoke it. See L<perlxs/"The ALIAS: Keyword">.
+
+ I32 ix
+
+=item LEAVE
+
+Closing bracket on a callback. See C<ENTER> and L<perlcall>.
+
+ LEAVE;
+
+=item looks_like_number
+
+Test if an the content of an SV looks like a number (or is a
+number).
+
+ I32 looks_like_number(SV* sv)
+
+=item MARK
+
+Stack marker variable for the XSUB. See C<dMARK>.
+
+=item mg_clear
+
+Clear something magical that the SV represents. See C<sv_magic>.
+
+ int mg_clear(SV* sv)
+
+=item mg_copy
+
+Copies the magic from one SV to another. See C<sv_magic>.
+
+ int mg_copy(SV* sv, SV* nsv, const char* key, I32 klen)
+
+=item mg_find
+
+Finds the magic pointer for type matching the SV. See C<sv_magic>.
+
+ MAGIC* mg_find(SV* sv, int type)
+
+=item mg_free
+
+Free any magic storage used by the SV. See C<sv_magic>.
+
+ int mg_free(SV* sv)
+
+=item mg_get
+
+Do magic after a value is retrieved from the SV. See C<sv_magic>.
+
+ int mg_get(SV* sv)
+
+=item mg_length
+
+Report on the SV's length. See C<sv_magic>.
+
+ U32 mg_length(SV* sv)
+
+=item mg_magical
+
+Turns on the magical status of an SV. See C<sv_magic>.
+
+ void mg_magical(SV* sv)
+
+=item mg_set
+
+Do magic after a value is assigned to the SV. See C<sv_magic>.
+
+ int mg_set(SV* sv)
+
+=item Move
+
+The XSUB-writer's interface to the C C<memmove> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. Can do overlapping moves. See also C<Copy>.
+
+ void Move(void* src, void* dest, int nitems, type)
+
+=item New
+
+The XSUB-writer's interface to the C C<malloc> function.
+
+ void New(int id, void* ptr, int nitems, type)
+
+=item newAV
+
+Creates a new AV. The reference count is set to 1.
+
+ AV* newAV()
+
+=item Newc
+
+The XSUB-writer's interface to the C C<malloc> function, with
+cast.
+
+ void Newc(int id, void* ptr, int nitems, type, cast)
+
+=item newCONSTSUB
+
+Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
+eligible for inlining at compile-time.
+
+ void newCONSTSUB(HV* stash, char* name, SV* sv)
+
+=item newHV
+
+Creates a new HV. The reference count is set to 1.
+
+ HV* newHV()
+
+=item newRV_inc
+
+Creates an RV wrapper for an SV. The reference count for the original SV is
+incremented.
+
+ SV* newRV_inc(SV* sv)
+
+=item newRV_noinc
+
+Creates an RV wrapper for an SV. The reference count for the original
+SV is B<not> incremented.
+
+ SV* newRV_noinc(SV *sv)
+
+=item NEWSV
+
+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.
+C<id> is an integer id between 0 and 1299 (used to identify leaks).
+
+ SV* NEWSV(int id, STRLEN len)
+
+=item newSViv
+
+Creates a new SV and copies an integer into it. The reference count for the
+SV is set to 1.
+
+ SV* newSViv(IV i)
+
+=item newSVnv
+
+Creates a new SV and copies a floating point value into it.
+The reference count for the SV is set to 1.
+
+ SV* newSVnv(NV n)
+
+=item newSVpv
+
+Creates a new SV and copies a string into it. The reference count for the
+SV is set to 1. If C<len> is zero, Perl will compute the length using
+strlen(). For efficiency, consider using C<newSVpvn> instead.
+
+ SV* newSVpv(const char* s, STRLEN len)
+
+=item newSVpvf
+
+Creates a new SV an initialize it with the string formatted like
+C<sprintf>.
+
+ SV* newSVpvf(const char* pat, ...)
+
+=item newSVpvn
+
+Creates a new SV and copies a string into it. The reference count for the
+SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
+string. You are responsible for ensuring that the source string is at least
+C<len> bytes long.
+
+ SV* newSVpvn(const char* s, STRLEN len)
+
+=item newSVrv
+
+Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
+it will be upgraded to one. If C<classname> is non-null then the new SV will
+be blessed in the specified package. The new SV is returned and its
+reference count is 1.
+
+ SV* newSVrv(SV* rv, const char* classname)
+
+=item newSVsv
+
+Creates a new SV which is an exact duplicate of the original SV.
+
+ SV* newSVsv(SV* old)
+
+=item newSVuv
+
+Creates a new SV and copies an unsigned integer into it.
+The reference count for the SV is set to 1.
+
+ SV* newSVuv(UV u)
+
+=item newXS
+
+Used by C<xsubpp> to hook up XSUBs as Perl subs.
+
+=item newXSproto
+
+Used by C<xsubpp> to hook up XSUBs as Perl subs. Adds Perl prototypes to
+the subs.
+
+=item Newz
+
+The XSUB-writer's interface to the C C<malloc> function. The allocated
+memory is zeroed with C<memzero>.
+
+ void Newz(int id, void* ptr, int nitems, type)
+
+=item Nullav
+
+Null AV pointer.
+
+=item Nullch
+
+Null character pointer.
+
+=item Nullcv
+
+Null CV pointer.
+
+=item Nullhv
+
+Null HV pointer.
+
+=item Nullsv
+
+Null SV pointer.
+
+=item ORIGMARK
+
+The original stack mark for the XSUB. See C<dORIGMARK>.
+
+=item perl_alloc
+
+Allocates a new Perl interpreter. See L<perlembed>.
+
+ PerlInterpreter* perl_alloc()
+
+=item perl_construct
+
+Initializes a new Perl interpreter. See L<perlembed>.
+
+ void perl_construct(PerlInterpreter* interp)
+
+=item perl_destruct
+
+Shuts down a Perl interpreter. See L<perlembed>.
+
+ void perl_destruct(PerlInterpreter* interp)
+
+=item perl_free
+
+Releases a Perl interpreter. See L<perlembed>.
+
+ void perl_free(PerlInterpreter* interp)
+
+=item perl_parse
+
+Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
+
+ int perl_parse(PerlInterpreter* interp, XSINIT_t xsinit, int argc, char** argv, char** env)
+
+=item perl_run
+
+Tells a Perl interpreter to run. See L<perlembed>.
+
+ int perl_run(PerlInterpreter* interp)
+
+=item PL_DBsingle
+
+When Perl is run in debugging mode, with the B<-d> switch, this SV is a
+boolean which indicates whether subs are being single-stepped.
+Single-stepping is automatically turned on after every step. This is the C
+variable which corresponds to Perl's $DB::single variable. See
+C<PL_DBsub>.
+
+ SV * PL_DBsingle
+
+=item PL_DBsub
+
+When Perl is run in debugging mode, with the B<-d> switch, this GV contains
+the SV which holds the name of the sub being debugged. This is the C
+variable which corresponds to Perl's $DB::sub variable. See
+C<PL_DBsingle>.
+
+ GV * PL_DBsub
+
+=item PL_DBtrace
+
+Trace variable used when Perl is run in debugging mode, with the B<-d>
+switch. This is the C variable which corresponds to Perl's $DB::trace
+variable. See C<PL_DBsingle>.
+
+ SV * PL_DBtrace
+
+=item PL_dowarn
+
+The C variable which corresponds to Perl's $^W warning variable.
+
+ bool PL_dowarn
+
+=item PL_modglobal
+
+C<PL_modglobal> is a general purpose, interpreter global HV for use by
+extensions that need to keep information on a per-interpreter basis.
+In a pinch, it can also be used as a symbol table for extensions
+to share data among each other. It is a good idea to use keys
+prefixed by the package name of the extension that owns the data.
+
+ HV* PL_modglobal
+
+=item PL_na
+
+A convenience variable which is typically used with C<SvPV> when one
+doesn't care about the length of the string. It is usually more efficient
+to either declare a local variable and use that instead or to use the
+C<SvPV_nolen> macro.
+
+ STRLEN PL_na
+
+=item PL_sv_no
+
+This is the C<false> SV. See C<PL_sv_yes>. Always refer to this as
+C<&PL_sv_no>.
+
+ SV PL_sv_no
+
+=item PL_sv_undef
+
+This is the C<undef> SV. Always refer to this as C<&PL_sv_undef>.
+
+ SV PL_sv_undef
+
+=item PL_sv_yes
+
+This is the C<true> SV. See C<PL_sv_no>. Always refer to this as
+C<&PL_sv_yes>.
+
+ SV PL_sv_yes
+
+=item POPi
+
+Pops an integer off the stack.
+
+ IV POPi
+
+=item POPl
+
+Pops a long off the stack.
+
+ long POPl
+
+=item POPn
+
+Pops a double off the stack.
+
+ NV POPn
+
+=item POPp
+
+Pops a string off the stack.
+
+ char* POPp
+
+=item POPs
+
+Pops an SV off the stack.
+
+ SV* POPs
+
+=item PUSHi
+
+Push an integer onto the stack. The stack must have room for this element.
+Handles 'set' magic. See C<XPUSHi>.
+
+ void PUSHi(IV iv)
+
+=item PUSHMARK
+
+Opening bracket for arguments on a callback. See C<PUTBACK> and
+L<perlcall>.
+
+ PUSHMARK;
+
+=item PUSHn
+
+Push a double onto the stack. The stack must have room for this element.
+Handles 'set' magic. See C<XPUSHn>.
+
+ void PUSHn(NV nv)
+
+=item PUSHp
+
+Push a string onto the stack. The stack must have room for this element.
+The C<len> indicates the length of the string. Handles 'set' magic. See
+C<XPUSHp>.
+
+ void PUSHp(char* str, STRLEN len)
+
+=item PUSHs
+
+Push an SV onto the stack. The stack must have room for this element.
+Does not handle 'set' magic. See C<XPUSHs>.
+
+ void PUSHs(SV* sv)
+
+=item PUSHu
+
+Push an unsigned integer onto the stack. The stack must have room for this
+element. See C<XPUSHu>.
+
+ void PUSHu(UV uv)
+
+=item PUTBACK
+
+Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
+See C<PUSHMARK> and L<perlcall> for other uses.
+
+ PUTBACK;
+
+=item Renew
+
+The XSUB-writer's interface to the C C<realloc> function.
+
+ void Renew(void* ptr, int nitems, type)
+
+=item Renewc
+
+The XSUB-writer's interface to the C C<realloc> function, with
+cast.
+
+ void Renewc(void* ptr, int nitems, type, cast)
+
+=item require_pv
+
+Tells Perl to C<require> a module.
+
+NOTE: the perl_ form of this function is deprecated.
+
+ void require_pv(const char* pv)
+
+=item RETVAL
+
+Variable which is setup by C<xsubpp> to hold the return value for an
+XSUB. This is always the proper type for the XSUB. See
+L<perlxs/"The RETVAL Variable">.
+
+ (whatever) RETVAL
+
+=item Safefree
+
+The XSUB-writer's interface to the C C<free> function.
+
+ void Safefree(void* src, void* dest, int nitems, type)
+
+=item savepv
+
+Copy a string to a safe spot. This does not use an SV.
+
+ char* savepv(const char* sv)
+
+=item savepvn
+
+Copy a string to a safe spot. The C<len> indicates number of bytes to
+copy. This does not use an SV.
+
+ char* savepvn(const char* sv, I32 len)
+
+=item SAVETMPS
+
+Opening bracket for temporaries on a callback. See C<FREETMPS> and
+L<perlcall>.
+
+ SAVETMPS;
+
+=item SP
+
+Stack pointer. This is usually handled by C<xsubpp>. See C<dSP> and
+C<SPAGAIN>.
+
+=item SPAGAIN
+
+Refetch the stack pointer. Used after a callback. See L<perlcall>.
+
+ SPAGAIN;
+
+=item ST
+
+Used to access elements on the XSUB's stack.
+
+ SV* ST(int ix)
+
+=item strEQ
+
+Test two strings to see if they are equal. Returns true or false.
+
+ bool strEQ(char* s1, char* s2)
+
+=item strGE
+
+Test two strings to see if the first, C<s1>, is greater than or equal to
+the second, C<s2>. Returns true or false.
+
+ bool strGE(char* s1, char* s2)
+
+=item strGT
+
+Test two strings to see if the first, C<s1>, is greater than the second,
+C<s2>. Returns true or false.
+
+ bool strGT(char* s1, char* s2)
+
+=item strLE
+
+Test two strings to see if the first, C<s1>, is less than or equal to the
+second, C<s2>. Returns true or false.
+
+ bool strLE(char* s1, char* s2)
+
+=item strLT
+
+Test two strings to see if the first, C<s1>, is less than the second,
+C<s2>. Returns true or false.
+
+ bool strLT(char* s1, char* s2)
+
+=item strNE
+
+Test two strings to see if they are different. Returns true or
+false.
+
+ bool strNE(char* s1, char* s2)
+
+=item strnEQ
+
+Test two strings to see if they are equal. The C<len> parameter indicates
+the number of bytes to compare. Returns true or false. (A wrapper for
+C<strncmp>).
+
+ bool strnEQ(char* s1, char* s2, STRLEN len)
+
+=item strnNE
+
+Test two strings to see if they are different. The C<len> parameter
+indicates the number of bytes to compare. Returns true or false. (A
+wrapper for C<strncmp>).
+
+ bool strnNE(char* s1, char* s2, STRLEN len)
+
+=item StructCopy
+
+This is an architecture-independant macro to copy one structure to another.
+
+ void StructCopy(type src, type dest, type)
+
+=item SvCUR
+
+Returns the length of the string which is in the SV. See C<SvLEN>.
+
+ STRLEN SvCUR(SV* sv)
+
+=item SvCUR_set
+
+Set the length of the string which is in the SV. See C<SvCUR>.
+
+ void SvCUR_set(SV* sv, STRLEN len)
+
+=item SvEND
+
+Returns a pointer to the last character in the string which is in the SV.
+See C<SvCUR>. Access the character as *(SvEND(sv)).
+
+ char* SvEND(SV* sv)
+
+=item SvGETMAGIC
+
+Invokes C<mg_get> on an SV if it has 'get' magic. This macro evaluates its
+argument more than once.
+
+ void SvGETMAGIC(SV* sv)
+
+=item SvGROW
+
+Expands the character buffer in the SV so that it has room for the
+indicated number of bytes (remember to reserve space for an extra trailing
+NUL character). Calls C<sv_grow> to perform the expansion if necessary.
+Returns a pointer to the character buffer.
+
+ void SvGROW(SV* sv, STRLEN len)
+
+=item SvIOK
+
+Returns a boolean indicating whether the SV contains an integer.
+
+ bool SvIOK(SV* sv)
+
+=item SvIOKp
+
+Returns a boolean indicating whether the SV contains an integer. Checks
+the B<private> setting. Use C<SvIOK>.
+
+ bool SvIOKp(SV* sv)
+
+=item SvIOK_off
+
+Unsets the IV status of an SV.
+
+ void SvIOK_off(SV* sv)
+
+=item SvIOK_on
+
+Tells an SV that it is an integer.
+
+ void SvIOK_on(SV* sv)
+
+=item SvIOK_only
+
+Tells an SV that it is an integer and disables all other OK bits.
+
+ void SvIOK_only(SV* sv)
+
+=item SvIV
+
+Coerces the given SV to an integer and returns it.
+
+ IV SvIV(SV* sv)
+
+=item SvIVX
+
+Returns the integer which is stored in the SV, assuming SvIOK is
+true.
+
+ IV SvIVX(SV* sv)
+
+=item SvLEN
+
+Returns the size of the string buffer in the SV. See C<SvCUR>.
+
+ STRLEN SvLEN(SV* sv)
+
+=item SvNIOK
+
+Returns a boolean indicating whether the SV contains a number, integer or
+double.
+
+ bool SvNIOK(SV* sv)
+
+=item SvNIOKp
+
+Returns a boolean indicating whether the SV contains a number, integer or
+double. Checks the B<private> setting. Use C<SvNIOK>.
+
+ bool SvNIOKp(SV* sv)
+
+=item SvNIOK_off
+
+Unsets the NV/IV status of an SV.
+
+ void SvNIOK_off(SV* sv)
+
+=item SvNOK
+
+Returns a boolean indicating whether the SV contains a double.
+
+ bool SvNOK(SV* sv)
+
+=item SvNOKp
+
+Returns a boolean indicating whether the SV contains a double. Checks the
+B<private> setting. Use C<SvNOK>.
+
+ bool SvNOKp(SV* sv)
+
+=item SvNOK_off
+
+Unsets the NV status of an SV.
+
+ void SvNOK_off(SV* sv)
+
+=item SvNOK_on
+
+Tells an SV that it is a double.
+
+ void SvNOK_on(SV* sv)
+
+=item SvNOK_only
+
+Tells an SV that it is a double and disables all other OK bits.
+
+ void SvNOK_only(SV* sv)
+
+=item SvNV
+
+Coerce the given SV to a double and return it.
+
+ NV SvNV(SV* sv)
+
+=item SvNVX
+
+Returns the double which is stored in the SV, assuming SvNOK is
+true.
+
+ NV SvNVX(SV* sv)
+
+=item SvOK
+
+Returns a boolean indicating whether the value is an SV.
+
+ bool SvOK(SV* sv)
+
+=item SvOOK
+
+Returns a boolean indicating whether the SvIVX is a valid offset value for
+the SvPVX. This hack is used internally to speed up removal of characters
+from the beginning of a SvPV. When SvOOK is true, then the start of the
+allocated string buffer is really (SvPVX - SvIVX).
+
+ bool SvOOK(SV* sv)
+
+=item SvPOK
+
+Returns a boolean indicating whether the SV contains a character
+string.
+
+ bool SvPOK(SV* sv)
+
+=item SvPOKp
+
+Returns a boolean indicating whether the SV contains a character string.
+Checks the B<private> setting. Use C<SvPOK>.
+
+ bool SvPOKp(SV* sv)
+
+=item SvPOK_off
+
+Unsets the PV status of an SV.
+
+ void SvPOK_off(SV* sv)
+
+=item SvPOK_on
+
+Tells an SV that it is a string.
+
+ void SvPOK_on(SV* sv)
+
+=item SvPOK_only
+
+Tells an SV that it is a string and disables all other OK bits.
+
+ void SvPOK_only(SV* sv)
+
+=item SvPV
+
+Returns a pointer to the string in the SV, or a stringified form of the SV
+if the SV does not contain a string. Handles 'get' magic.
+
+ char* SvPV(SV* sv, STRLEN len)
+
+=item SvPVX
+
+Returns a pointer to the string in the SV. The SV must contain a
+string.
+
+ char* SvPVX(SV* sv)
+
+=item SvPV_force
+
+Like <SvPV> but will force the SV into becoming a string (SvPOK). You want
+force if you are going to update the SvPVX directly.
+
+ char* SvPV_force(SV* sv, STRLEN len)
+
+=item SvPV_nolen
+
+Returns a pointer to the string in the SV, or a stringified form of the SV
+if the SV does not contain a string. Handles 'get' magic.
+
+ char* SvPV_nolen(SV* sv)
+
+=item SvREFCNT
+
+Returns the value of the object's reference count.
+
+ U32 SvREFCNT(SV* sv)
+
+=item SvREFCNT_dec
+
+Decrements the reference count of the given SV.
+
+ void SvREFCNT_dec(SV* sv)
+
+=item SvREFCNT_inc
+
+Increments the reference count of the given SV.
+
+ SV* SvREFCNT_inc(SV* sv)
+
+=item SvROK
+
+Tests if the SV is an RV.
+
+ bool SvROK(SV* sv)
+
+=item SvROK_off
+
+Unsets the RV status of an SV.
+
+ void SvROK_off(SV* sv)
+
+=item SvROK_on
+
+Tells an SV that it is an RV.
+
+ void SvROK_on(SV* sv)
+
+=item SvRV
+
+Dereferences an RV to return the SV.
+
+ SV* SvRV(SV* sv)
+
+=item SvSETMAGIC
+
+Invokes C<mg_set> on an SV if it has 'set' magic. This macro evaluates its
+argument more than once.
+
+ void SvSETMAGIC(SV* sv)
+
+=item SvSetSV
+
+Calls C<sv_setsv> if dsv is not the same as ssv. May evaluate arguments
+more than once.
+
+ void SvSetSV(SV* dsb, SV* ssv)
+
+=item SvSetSV_nosteal
+
+Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
+ssv. May evaluate arguments more than once.
+
+ void SvSetSV_nosteal(SV* dsv, SV* ssv)
+
+=item SvSTASH
+
+Returns the stash of the SV.
+
+ HV* SvSTASH(SV* sv)
+
+=item SvTAINT
+
+Taints an SV if tainting is enabled
+
+ void SvTAINT(SV* sv)
+
+=item SvTAINTED
+
+Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
+not.
+
+ bool SvTAINTED(SV* sv)
+
+=item SvTAINTED_off
+
+Untaints an SV. Be I<very> careful with this routine, as it short-circuits
+some of Perl's fundamental security features. XS module authors should not
+use this function unless they fully understand all the implications of
+unconditionally untainting the value. Untainting should be done in the
+standard perl fashion, via a carefully crafted regexp, rather than directly
+untainting variables.
+
+ void SvTAINTED_off(SV* sv)
+
+=item SvTAINTED_on
+
+Marks an SV as tainted.
+
+ void SvTAINTED_on(SV* sv)
+
+=item SvTRUE
+
+Returns a boolean indicating whether Perl would evaluate the SV as true or
+false, defined or undefined. Does not handle 'get' magic.
+
+ bool SvTRUE(SV* sv)
+
+=item SvTYPE
+
+Returns the type of the SV. See C<svtype>.
+
+ svtype SvTYPE(SV* sv)
+
+=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.
+
+=item SVt_IV
+
+Integer type flag for scalars. See C<svtype>.
+
+=item SVt_NV
+
+Double type flag for scalars. See C<svtype>.
+
+=item SVt_PV
+
+Pointer type flag for scalars. See C<svtype>.
+
+=item SVt_PVAV
+
+Type flag for arrays. See C<svtype>.
+
+=item SVt_PVCV
+
+Type flag for code refs. See C<svtype>.
+
+=item SVt_PVHV
+
+Type flag for hashes. See C<svtype>.
+
+=item SVt_PVMG
+
+Type flag for blessed scalars. See C<svtype>.
+
+=item SvUPGRADE
+
+Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to
+perform the upgrade if necessary. See C<svtype>.
+
+ void SvUPGRADE(SV* sv, svtype type)
+
+=item SvUV
+
+Coerces the given SV to an unsigned integer and returns it.
+
+ UV SvUV(SV* sv)
+
+=item SvUVX
+
+Returns the unsigned integer which is stored in the SV, assuming SvIOK is
+true.
+
+ UV SvUVX(SV* sv)
+
+=item sv_2mortal
+
+Marks an SV as mortal. The SV will be destroyed when the current context
+ends.
+
+ SV* sv_2mortal(SV* sv)
+
+=item sv_bless
+
+Blesses an SV into a specified package. The SV must be an RV. The package
+must be designated by its stash (see C<gv_stashpv()>). The reference count
+of the SV is unaffected.
+
+ SV* sv_bless(SV* sv, HV* stash)
+
+=item sv_catpv
+
+Concatenates the string onto the end of the string which is in the SV.
+Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
+
+ void sv_catpv(SV* sv, const char* ptr)
+
+=item sv_catpvf
+
+Processes its arguments like C<sprintf> and appends the formatted output
+to an SV. Handles 'get' magic, but not 'set' magic. C<SvSETMAGIC()> must
+typically be called after calling this function to handle 'set' magic.
+
+ void sv_catpvf(SV* sv, const char* pat, ...)
+
+=item sv_catpvf_mg
+
+Like C<sv_catpvf>, but also handles 'set' magic.
+
+ void sv_catpvf_mg(SV *sv, const char* pat, ...)
+
+=item sv_catpvn
+
+Concatenates the string onto the end of the string which is in the SV. The
+C<len> indicates number of bytes to copy. Handles 'get' magic, but not
+'set' magic. See C<sv_catpvn_mg>.
+
+ void sv_catpvn(SV* sv, const char* ptr, STRLEN len)
+
+=item sv_catpvn_mg
+
+Like C<sv_catpvn>, but also handles 'set' magic.
+
+ void sv_catpvn_mg(SV *sv, const char *ptr, STRLEN len)
+
+=item sv_catpv_mg
+
+Like C<sv_catpv>, but also handles 'set' magic.
+
+ void sv_catpv_mg(SV *sv, const char *ptr)
+
+=item sv_catsv
+
+Concatenates the string from SV C<ssv> onto the end of the string in SV
+C<dsv>. Handles 'get' magic, but not 'set' magic. See C<sv_catsv_mg>.
+
+ void sv_catsv(SV* dsv, SV* ssv)
+
+=item sv_catsv_mg
+
+Like C<sv_catsv>, but also handles 'set' magic.
+
+ void sv_catsv_mg(SV *dstr, SV *sstr)
+
+=item sv_chop
+
+Efficient removal of characters from the beginning of the string buffer.
+SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
+the string buffer. The C<ptr> becomes the first character of the adjusted
+string.
+
+ void sv_chop(SV* sv, char* ptr)
+
+=item sv_cmp
+
+Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
+string in C<sv1> is less than, equal to, or greater than the string in
+C<sv2>.
+
+ I32 sv_cmp(SV* sv1, SV* sv2)
+
+=item sv_dec
+
+Auto-decrement of the value in the SV.
+
+ void sv_dec(SV* sv)
+
+=item sv_derived_from
+
+Returns a boolean indicating whether the SV is derived from the specified
+class. This is the function that implements C<UNIVERSAL::isa>. It works
+for class names as well as for objects.
+
+ bool sv_derived_from(SV* sv, const char* name)
+
+=item sv_eq
+
+Returns a boolean indicating whether the strings in the two SVs are
+identical.
+
+ I32 sv_eq(SV* sv1, SV* sv2)
+
+=item sv_grow
+
+Expands the character buffer in the SV. This will use C<sv_unref> and will
+upgrade the SV to C<SVt_PV>. Returns a pointer to the character buffer.
+Use C<SvGROW>.
+
+ char* sv_grow(SV* sv, STRLEN newlen)
+
+=item sv_inc
+
+Auto-increment of the value in the SV.
+
+ void sv_inc(SV* sv)
+
+=item sv_insert
+
+Inserts a string at the specified offset/length within the SV. Similar to
+the Perl substr() function.
+
+ void sv_insert(SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen)
+
+=item sv_isa
+
+Returns a boolean indicating whether the SV is blessed into the specified
+class. This does not check for subtypes; use C<sv_derived_from> to verify
+an inheritance relationship.
+
+ int sv_isa(SV* sv, const char* name)
+
+=item sv_isobject
+
+Returns a boolean indicating whether the SV is an RV pointing to a blessed
+object. If the SV is not an RV, or if the object is not blessed, then this
+will return false.
+
+ int sv_isobject(SV* sv)
+
+=item sv_len
+
+Returns the length of the string in the SV. See also C<SvCUR>.
+
+ STRLEN sv_len(SV* sv)
+
+=item sv_magic
+
+Adds magic to an SV.
+
+ void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen)
+
+=item sv_mortalcopy
+
+Creates a new SV which is a copy of the original SV. The new SV is marked
+as mortal.
+
+ SV* sv_mortalcopy(SV* oldsv)
+
+=item sv_newmortal
+
+Creates a new SV which is mortal. The reference count of the SV is set to 1.
+
+ SV* sv_newmortal()
+
+=item sv_setiv
+
+Copies an integer into the given SV. Does not handle 'set' magic. See
+C<sv_setiv_mg>.
+
+ void sv_setiv(SV* sv, IV num)
+
+=item sv_setiv_mg
+
+Like C<sv_setiv>, but also handles 'set' magic.
+
+ void sv_setiv_mg(SV *sv, IV i)
+
+=item sv_setnv
+
+Copies a double into the given SV. Does not handle 'set' magic. See
+C<sv_setnv_mg>.
+
+ void sv_setnv(SV* sv, NV num)
+
+=item sv_setnv_mg
+
+Like C<sv_setnv>, but also handles 'set' magic.
+
+ void sv_setnv_mg(SV *sv, NV num)
+
+=item sv_setpv
+
+Copies a string into an SV. The string must be null-terminated. Does not
+handle 'set' magic. See C<sv_setpv_mg>.
+
+ void sv_setpv(SV* sv, const char* ptr)
+
+=item sv_setpvf
+
+Processes its arguments like C<sprintf> and sets an SV to the formatted
+output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
+
+ void sv_setpvf(SV* sv, const char* pat, ...)
+
+=item sv_setpvf_mg
+
+Like C<sv_setpvf>, but also handles 'set' magic.
+
+ void sv_setpvf_mg(SV *sv, const char* pat, ...)
+
+=item sv_setpviv
+
+Copies an integer into the given SV, also updating its string value.
+Does not handle 'set' magic. See C<sv_setpviv_mg>.
+
+ void sv_setpviv(SV* sv, IV num)
+
+=item sv_setpviv_mg
+
+Like C<sv_setpviv>, but also handles 'set' magic.
+
+ void sv_setpviv_mg(SV *sv, IV iv)
+
+=item sv_setpvn
+
+Copies a string into an SV. The C<len> parameter indicates the number of
+bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
+
+ void sv_setpvn(SV* sv, const char* ptr, STRLEN len)
+
+=item sv_setpvn_mg
+
+Like C<sv_setpvn>, but also handles 'set' magic.
+
+ void sv_setpvn_mg(SV *sv, const char *ptr, STRLEN len)
+
+=item sv_setpv_mg
+
+Like C<sv_setpv>, but also handles 'set' magic.
+
+ void sv_setpv_mg(SV *sv, const char *ptr)
+
+=item sv_setref_iv
+
+Copies an integer into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
+will be returned and will have a reference count of 1.
+
+ SV* sv_setref_iv(SV* rv, const char* classname, IV iv)
+
+=item sv_setref_nv
+
+Copies a double into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
+will be returned and will have a reference count of 1.
+
+ SV* sv_setref_nv(SV* rv, const char* classname, NV nv)
+
+=item sv_setref_pv
+
+Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
+into the SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
+will be returned and will have a reference count of 1.
+
+Do not use with other Perl types such as HV, AV, SV, CV, because those
+objects will become corrupted by the pointer copy process.
+
+Note that C<sv_setref_pvn> copies the string while this copies the pointer.
+
+ SV* sv_setref_pv(SV* rv, const char* classname, void* pv)
+
+=item sv_setref_pvn
+
+Copies a string into a new SV, optionally blessing the SV. The length of the
+string must be specified with C<n>. The C<rv> argument will be upgraded to
+an RV. That RV will be modified to point to the new SV. The C<classname>
+argument indicates the package for the blessing. Set C<classname> to
+C<Nullch> to avoid the blessing. The new SV will be returned and will have
+a reference count of 1.
+
+Note that C<sv_setref_pv> copies the pointer while this copies the string.
+
+ SV* sv_setref_pvn(SV* rv, const char* classname, char* pv, STRLEN n)
+
+=item sv_setsv
+
+Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
+The source SV may be destroyed if it is mortal. Does not handle 'set'
+magic. See the macro forms C<SvSetSV>, C<SvSetSV_nosteal> and
+C<sv_setsv_mg>.
+
+ void sv_setsv(SV* dsv, SV* ssv)
+
+=item sv_setsv_mg
+
+Like C<sv_setsv>, but also handles 'set' magic.
+
+ void sv_setsv_mg(SV *dstr, SV *sstr)
+
+=item sv_setuv
+
+Copies an unsigned integer into the given SV. Does not handle 'set' magic.
+See C<sv_setuv_mg>.
+
+ void sv_setuv(SV* sv, UV num)
+
+=item sv_setuv_mg
+
+Like C<sv_setuv>, but also handles 'set' magic.
+
+ void sv_setuv_mg(SV *sv, UV u)
+
+=item sv_unref
+
+Unsets the RV status of the SV, and decrements the reference count of
+whatever was being referenced by the RV. This can almost be thought of
+as a reversal of C<newSVrv>. See C<SvROK_off>.
+
+ void sv_unref(SV* sv)
+
+=item sv_upgrade
+
+Upgrade an SV to a more complex form. Use C<SvUPGRADE>. See
+C<svtype>.
+
+ bool sv_upgrade(SV* sv, U32 mt)
+
+=item sv_usepvn
+
+Tells an SV to use C<ptr> to find its string value. Normally the string is
+stored inside the SV but sv_usepvn allows the SV to use an outside string.
+The C<ptr> should point to memory that was allocated by C<malloc>. The
+string length, C<len>, must be supplied. This function will realloc the
+memory pointed to by C<ptr>, so that pointer should not be freed or used by
+the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
+See C<sv_usepvn_mg>.
+
+ void sv_usepvn(SV* sv, char* ptr, STRLEN len)
+
+=item sv_usepvn_mg
+
+Like C<sv_usepvn>, but also handles 'set' magic.
+
+ void sv_usepvn_mg(SV *sv, char *ptr, STRLEN len)
+
+=item sv_vcatpvfn
+
+Processes its arguments like C<vsprintf> and appends the formatted output
+to an SV. Uses an array of SVs if the C style variable argument list is
+missing (NULL). When running with taint checks enabled, indicates via
+C<maybe_tainted> if results are untrustworthy (often due to the use of
+locales).
+
+ void sv_vcatpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+
+=item sv_vsetpvfn
+
+Works like C<vcatpvfn> but copies the text into the SV instead of
+appending it.
+
+ void sv_vsetpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+
+=item THIS
+
+Variable which is setup by C<xsubpp> to designate the object in a C++
+XSUB. This is always the proper type for the C++ object. See C<CLASS> and
+L<perlxs/"Using XS With C++">.
+
+ (whatever) THIS
+
+=item toLOWER
+
+Converts the specified character to lowercase.
+
+ char toLOWER(char ch)
+
+=item toUPPER
+
+Converts the specified character to uppercase.
+
+ char toUPPER(char ch)
+
+=item warn
+
+This is the XSUB-writer's interface to Perl's C<warn> function. Use this
+function the same way you use the C C<printf> function. See
+C<croak>.
+
+ void warn(const char* pat, ...)
+
+=item XPUSHi
+
+Push an integer onto the stack, extending the stack if necessary. Handles
+'set' magic. See C<PUSHi>.
+
+ void XPUSHi(IV iv)
+
+=item XPUSHn
+
+Push a double onto the stack, extending the stack if necessary. Handles
+'set' magic. See C<PUSHn>.
+
+ void XPUSHn(NV nv)
+
+=item XPUSHp
+
+Push a string onto the stack, extending the stack if necessary. The C<len>
+indicates the length of the string. Handles 'set' magic. See
+C<PUSHp>.
+
+ void XPUSHp(char* str, STRLEN len)
+
+=item XPUSHs
+
+Push an SV onto the stack, extending the stack if necessary. Does not
+handle 'set' magic. See C<PUSHs>.
+
+ void XPUSHs(SV* sv)
+
+=item XPUSHu
+
+Push an unsigned integer onto the stack, extending the stack if necessary.
+See C<PUSHu>.
+
+ void XPUSHu(UV uv)
+
+=item XS
+
+Macro to declare an XSUB and its C parameter list. This is handled by
+C<xsubpp>.
+
+=item XSRETURN
+
+Return from XSUB, indicating number of items on the stack. This is usually
+handled by C<xsubpp>.
+
+ void XSRETURN(int nitems)
+
+=item XSRETURN_EMPTY
+
+Return an empty list from an XSUB immediately.
+
+ XSRETURN_EMPTY;
+
+=item XSRETURN_IV
+
+Return an integer from an XSUB immediately. Uses C<XST_mIV>.
+
+ void XSRETURN_IV(IV iv)
+
+=item XSRETURN_NO
+
+Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
+
+ XSRETURN_NO;
+
+=item XSRETURN_NV
+
+Return an double from an XSUB immediately. Uses C<XST_mNV>.
+
+ void XSRETURN_NV(NV nv)
+
+=item XSRETURN_PV
+
+Return a copy of a string from an XSUB immediately. Uses C<XST_mPV>.
+
+ void XSRETURN_PV(char* str)
+
+=item XSRETURN_UNDEF
+
+Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
+
+ XSRETURN_UNDEF;
+
+=item XSRETURN_YES
+
+Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
+
+ XSRETURN_YES;
+
+=item XST_mIV
+
+Place an integer into the specified position C<pos> on the stack. The
+value is stored in a new mortal SV.
+
+ void XST_mIV(int pos, IV iv)
+
+=item XST_mNO
+
+Place C<&PL_sv_no> into the specified position C<pos> on the
+stack.
+
+ void XST_mNO(int pos)
+
+=item XST_mNV
+
+Place a double into the specified position C<pos> on the stack. The value
+is stored in a new mortal SV.
+
+ void XST_mNV(int pos, NV nv)
+
+=item XST_mPV
+
+Place a copy of a string into the specified position C<pos> on the stack.
+The value is stored in a new mortal SV.
+
+ void XST_mPV(int pos, char* str)
+
+=item XST_mUNDEF
+
+Place C<&PL_sv_undef> into the specified position C<pos> on the
+stack.
+
+ void XST_mUNDEF(int pos)
+
+=item XST_mYES
+
+Place C<&PL_sv_yes> into the specified position C<pos> on the
+stack.
+
+ void XST_mYES(int pos)
+
+=item XS_VERSION
+
+The version identifier for an XS module. This is usually
+handled automatically by C<ExtUtils::MakeMaker>. See C<XS_VERSION_BOOTCHECK>.
+
+=item XS_VERSION_BOOTCHECK
+
+Macro to verify that a PM module's $VERSION variable matches the XS
+module's C<XS_VERSION> variable. This is usually handled automatically by
+C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
+
+ XS_VERSION_BOOTCHECK;
+
+=item Zero
+
+The XSUB-writer's interface to the C C<memzero> function. The C<dest> is the
+destination, C<nitems> is the number of items, and C<type> is the type.
+
+ void Zero(void* dest, int nitems, type)
+
+=back
+
+=head1 AUTHORS
+
+Until May 1997, this document was maintained by Jeff Okamoto
+<okamoto@corp.hp.com>. It is now maintained as part of Perl itself.
+
+With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
+Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
+Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
+Stephen McCamant, and Gurusamy Sarathy.
+
+API Listing originally by Dean Roehrich <roehrich@cray.com>.
+
+Updated to be autogenerated from comments in the source by Benjamin Stuhl.
+
+=head1 SEE ALSO
+
+perlguts(1), perlxs(1), perlxstut(1), perlintern(1)
+
diff --git a/contrib/perl5/pod/perlbook.pod b/contrib/perl5/pod/perlbook.pod
index 76763cd..3a693dd 100644
--- a/contrib/perl5/pod/perlbook.pod
+++ b/contrib/perl5/pod/perlbook.pod
@@ -13,4 +13,4 @@ If you're web-connected, you can even mosey on over to http://www.ora.com/
for an online order form.
Other Perl books from various publishers and authors
-can be found listed in L<perlfaq3>.
+can be found listed in L<perlfaq2>.
diff --git a/contrib/perl5/pod/perlboot.pod b/contrib/perl5/pod/perlboot.pod
new file mode 100644
index 0000000..b549f45
--- /dev/null
+++ b/contrib/perl5/pod/perlboot.pod
@@ -0,0 +1,811 @@
+=head1 NAME
+
+perlboot - Beginner's Object-Oriented Tutorial
+
+=head1 DESCRIPTION
+
+If you're not familiar with objects from other languages, some of the
+other Perl object documentation may be a little daunting, such as
+L<perlobj>, a basic reference in using objects, and L<perltoot>, which
+introduces readers to the peculiarities of Perl's object system in a
+tutorial way.
+
+So, let's take a different approach, presuming no prior object
+experience. It helps if you know about subroutines (L<perlsub>),
+references (L<perlref> et. seq.), and packages (L<perlmod>), so become
+familiar with those first if you haven't already.
+
+=head2 If we could talk to the animals...
+
+Let's let the animals talk for a moment:
+
+ sub Cow::speak {
+ print "a Cow goes moooo!\n";
+ }
+ sub Horse::speak {
+ print "a Horse goes neigh!\n";
+ }
+ sub Sheep::speak {
+ print "a Sheep goes baaaah!\n"
+ }
+
+ Cow::speak;
+ Horse::speak;
+ Sheep::speak;
+
+This results in:
+
+ a Cow goes moooo!
+ a Horse goes neigh!
+ a Sheep goes baaaah!
+
+Nothing spectacular here. Simple subroutines, albeit from separate
+packages, and called using the full package name. So let's create
+an entire pasture:
+
+ # Cow::speak, Horse::speak, Sheep::speak as before
+ @pasture = qw(Cow Cow Horse Sheep Sheep);
+ foreach $animal (@pasture) {
+ &{$animal."::speak"};
+ }
+
+This results in:
+
+ a Cow goes moooo!
+ a Cow goes moooo!
+ a Horse goes neigh!
+ a Sheep goes baaaah!
+ a Sheep goes baaaah!
+
+Wow. That symbolic coderef de-referencing there is pretty nasty.
+We're counting on C<no strict subs> mode, certainly not recommended
+for larger programs. And why was that necessary? Because the name of
+the package seems to be inseparable from the name of the subroutine we
+want to invoke within that package.
+
+Or is it?
+
+=head2 Introducing the method invocation arrow
+
+For now, let's say that C<< Class->method >> invokes subroutine
+C<method> in package C<Class>. (Here, "Class" is used in its
+"category" meaning, not its "scholastic" meaning.) That's not
+completely accurate, but we'll do this one step at a time. Now let's
+use it like so:
+
+ # Cow::speak, Horse::speak, Sheep::speak as before
+ Cow->speak;
+ Horse->speak;
+ Sheep->speak;
+
+And once again, this results in:
+
+ a Cow goes moooo!
+ a Horse goes neigh!
+ a Sheep goes baaaah!
+
+That's not fun yet. Same number of characters, all constant, no
+variables. But yet, the parts are separable now. Watch:
+
+ $a = "Cow";
+ $a->speak; # invokes Cow->speak
+
+Ahh! Now that the package name has been parted from the subroutine
+name, we can use a variable package name. And this time, we've got
+something that works even when C<use strict refs> is enabled.
+
+=head2 Invoking a barnyard
+
+Let's take that new arrow invocation and put it back in the barnyard
+example:
+
+ sub Cow::speak {
+ print "a Cow goes moooo!\n";
+ }
+ sub Horse::speak {
+ print "a Horse goes neigh!\n";
+ }
+ sub Sheep::speak {
+ print "a Sheep goes baaaah!\n"
+ }
+
+ @pasture = qw(Cow Cow Horse Sheep Sheep);
+ foreach $animal (@pasture) {
+ $animal->speak;
+ }
+
+There! Now we have the animals all talking, and safely at that,
+without the use of symbolic coderefs.
+
+But look at all that common code. Each of the C<speak> routines has a
+similar structure: a C<print> operator and a string that contains
+common text, except for two of the words. It'd be nice if we could
+factor out the commonality, in case we decide later to change it all
+to C<says> instead of C<goes>.
+
+And we actually have a way of doing that without much fuss, but we
+have to hear a bit more about what the method invocation arrow is
+actually doing for us.
+
+=head2 The extra parameter of method invocation
+
+The invocation of:
+
+ Class->method(@args)
+
+attempts to invoke subroutine C<Class::method> as:
+
+ Class::method("Class", @args);
+
+(If the subroutine can't be found, "inheritance" kicks in, but we'll
+get to that later.) This means that we get the class name as the
+first parameter (the only parameter, if no arguments are given). So
+we can rewrite the C<Sheep> speaking subroutine as:
+
+ sub Sheep::speak {
+ my $class = shift;
+ print "a $class goes baaaah!\n";
+ }
+
+And the other two animals come out similarly:
+
+ sub Cow::speak {
+ my $class = shift;
+ print "a $class goes moooo!\n";
+ }
+ sub Horse::speak {
+ my $class = shift;
+ print "a $class goes neigh!\n";
+ }
+
+In each case, C<$class> will get the value appropriate for that
+subroutine. But once again, we have a lot of similar structure. Can
+we factor that out even further? Yes, by calling another method in
+the same class.
+
+=head2 Calling a second method to simplify things
+
+Let's call out from C<speak> to a helper method called C<sound>.
+This method provides the constant text for the sound itself.
+
+ { package Cow;
+ sub sound { "moooo" }
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n"
+ }
+ }
+
+Now, when we call C<< Cow->speak >>, we get a C<$class> of C<Cow> in
+C<speak>. This in turn selects the C<< Cow->sound >> method, which
+returns C<moooo>. But how different would this be for the C<Horse>?
+
+ { package Horse;
+ sub sound { "neigh" }
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n"
+ }
+ }
+
+Only the name of the package and the specific sound change. So can we
+somehow share the definition for C<speak> between the Cow and the
+Horse? Yes, with inheritance!
+
+=head2 Inheriting the windpipes
+
+We'll define a common subroutine package called C<Animal>, with the
+definition for C<speak>:
+
+ { package Animal;
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n"
+ }
+ }
+
+Then, for each animal, we say it "inherits" from C<Animal>, along
+with the animal-specific sound:
+
+ { package Cow;
+ @ISA = qw(Animal);
+ sub sound { "moooo" }
+ }
+
+Note the added C<@ISA> array. We'll get to that in a minute.
+
+But what happens when we invoke C<< Cow->speak >> now?
+
+First, Perl constructs the argument list. In this case, it's just
+C<Cow>. Then Perl looks for C<Cow::speak>. But that's not there, so
+Perl checks for the inheritance array C<@Cow::ISA>. It's there,
+and contains the single name C<Animal>.
+
+Perl next checks for C<speak> inside C<Animal> instead, as in
+C<Animal::speak>. And that's found, so Perl invokes that subroutine
+with the already frozen argument list.
+
+Inside the C<Animal::speak> subroutine, C<$class> becomes C<Cow> (the
+first argument). So when we get to the step of invoking
+C<< $class->sound >>, it'll be looking for C<< Cow->sound >>, which
+gets it on the first try without looking at C<@ISA>. Success!
+
+=head2 A few notes about @ISA
+
+This magical C<@ISA> variable (pronounced "is a" not "ice-uh"), has
+declared that C<Cow> "is a" C<Animal>. Note that it's an array,
+not a simple single value, because on rare occasions, it makes sense
+to have more than one parent class searched for the missing methods.
+
+If C<Animal> also had an C<@ISA>, then we'd check there too. The
+search is recursive, depth-first, left-to-right in each C<@ISA>.
+Typically, each C<@ISA> has only one element (multiple elements means
+multiple inheritance and multiple headaches), so we get a nice tree of
+inheritance.
+
+When we turn on C<use strict>, we'll get complaints on C<@ISA>, since
+it's not a variable containing an explicit package name, nor is it a
+lexical ("my") variable. We can't make it a lexical variable though
+(it has to belong to the package to be found by the inheritance mechanism),
+so there's a couple of straightforward ways to handle that.
+
+The easiest is to just spell the package name out:
+
+ @Cow::ISA = qw(Animal);
+
+Or allow it as an implicitly named package variable:
+
+ package Cow;
+ use vars qw(@ISA);
+ @ISA = qw(Animal);
+
+If you're bringing in the class from outside, via an object-oriented
+module, you change:
+
+ package Cow;
+ use Animal;
+ use vars qw(@ISA);
+ @ISA = qw(Animal);
+
+into just:
+
+ package Cow;
+ use base qw(Animal);
+
+And that's pretty darn compact.
+
+=head2 Overriding the methods
+
+Let's add a mouse, which can barely be heard:
+
+ # Animal package from before
+ { package Mouse;
+ @ISA = qw(Animal);
+ sub sound { "squeak" }
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+ Mouse->speak;
+
+which results in:
+
+ a Mouse goes squeak!
+ [but you can barely hear it!]
+
+Here, C<Mouse> has its own speaking routine, so C<< Mouse->speak >>
+doesn't immediately invoke C<< Animal->speak >>. This is known as
+"overriding". In fact, we didn't even need to say that a C<Mouse> was
+an C<Animal> at all, since all of the methods needed for C<speak> are
+completely defined with C<Mouse>.
+
+But we've now duplicated some of the code from C<< Animal->speak >>,
+and this can once again be a maintenance headache. So, can we avoid
+that? Can we say somehow that a C<Mouse> does everything any other
+C<Animal> does, but add in the extra comment? Sure!
+
+First, we can invoke the C<Animal::speak> method directly:
+
+ # Animal package from before
+ { package Mouse;
+ @ISA = qw(Animal);
+ sub sound { "squeak" }
+ sub speak {
+ my $class = shift;
+ Animal::speak($class);
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+Note that we have to include the C<$class> parameter (almost surely
+the value of C<"Mouse">) as the first parameter to C<Animal::speak>,
+since we've stopped using the method arrow. Why did we stop? Well,
+if we invoke C<< Animal->speak >> there, the first parameter to the
+method will be C<"Animal"> not C<"Mouse">, and when time comes for it
+to call for the C<sound>, it won't have the right class to come back
+to this package.
+
+Invoking C<Animal::speak> directly is a mess, however. What if
+C<Animal::speak> didn't exist before, and was being inherited from a
+class mentioned in C<@Animal::ISA>? Because we are no longer using
+the method arrow, we get one and only one chance to hit the right
+subroutine.
+
+Also note that the C<Animal> classname is now hardwired into the
+subroutine selection. This is a mess if someone maintains the code,
+changing C<@ISA> for <Mouse> and didn't notice C<Animal> there in
+C<speak>. So, this is probably not the right way to go.
+
+=head2 Starting the search from a different place
+
+A better solution is to tell Perl to search from a higher place
+in the inheritance chain:
+
+ # same Animal as before
+ { package Mouse;
+ # same @ISA, &sound as before
+ sub speak {
+ my $class = shift;
+ $class->Animal::speak;
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+Ahh. This works. Using this syntax, we start with C<Animal> to find
+C<speak>, and use all of C<Animal>'s inheritance chain if not found
+immediately. And yet the first parameter will be C<$class>, so the
+found C<speak> method will get C<Mouse> as its first entry, and
+eventually work its way back to C<Mouse::sound> for the details.
+
+But this isn't the best solution. We still have to keep the C<@ISA>
+and the initial search package coordinated. Worse, if C<Mouse> had
+multiple entries in C<@ISA>, we wouldn't necessarily know which one
+had actually defined C<speak>. So, is there an even better way?
+
+=head2 The SUPER way of doing things
+
+By changing the C<Animal> class to the C<SUPER> class in that
+invocation, we get a search of all of our super classes (classes
+listed in C<@ISA>) automatically:
+
+ # same Animal as before
+ { package Mouse;
+ # same @ISA, &sound as before
+ sub speak {
+ my $class = shift;
+ $class->SUPER::speak;
+ print "[but you can barely hear it!]\n";
+ }
+ }
+
+So, C<SUPER::speak> means look in the current package's C<@ISA> for
+C<speak>, invoking the first one found.
+
+=head2 Where we're at so far...
+
+So far, we've seen the method arrow syntax:
+
+ Class->method(@args);
+
+or the equivalent:
+
+ $a = "Class";
+ $a->method(@args);
+
+which constructs an argument list of:
+
+ ("Class", @args)
+
+and attempts to invoke
+
+ Class::method("Class", @Args);
+
+However, if C<Class::method> is not found, then C<@Class::ISA> is examined
+(recursively) to locate a package that does indeed contain C<method>,
+and that subroutine is invoked instead.
+
+Using this simple syntax, we have class methods, (multiple)
+inheritance, overriding, and extending. Using just what we've seen so
+far, we've been able to factor out common code, and provide a nice way
+to reuse implementations with variations. This is at the core of what
+objects provide, but objects also provide instance data, which we
+haven't even begun to cover.
+
+=head2 A horse is a horse, of course of course -- or is it?
+
+Let's start with the code for the C<Animal> class
+and the C<Horse> class:
+
+ { package Animal;
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n"
+ }
+ }
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ }
+
+This lets us invoke C<< Horse->speak >> to ripple upward to
+C<Animal::speak>, calling back to C<Horse::sound> to get the specific
+sound, and the output of:
+
+ a Horse goes neigh!
+
+But all of our Horse objects would have to be absolutely identical.
+If I add a subroutine, all horses automatically share it. That's
+great for making horses the same, but how do we capture the
+distinctions about an individual horse? For example, suppose I want
+to give my first horse a name. There's got to be a way to keep its
+name separate from the other horses.
+
+We can do that by drawing a new distinction, called an "instance".
+An "instance" is generally created by a class. In Perl, any reference
+can be an instance, so let's start with the simplest reference
+that can hold a horse's name: a scalar reference.
+
+ my $name = "Mr. Ed";
+ my $talking = \$name;
+
+So now C<$talking> is a reference to what will be the instance-specific
+data (the name). The final step in turning this into a real instance
+is with a special operator called C<bless>:
+
+ bless $talking, Horse;
+
+This operator stores information about the package named C<Horse> into
+the thing pointed at by the reference. At this point, we say
+C<$talking> is an instance of C<Horse>. That is, it's a specific
+horse. The reference is otherwise unchanged, and can still be used
+with traditional dereferencing operators.
+
+=head2 Invoking an instance method
+
+The method arrow can be used on instances, as well as names of
+packages (classes). So, let's get the sound that C<$talking> makes:
+
+ my $noise = $talking->sound;
+
+To invoke C<sound>, Perl first notes that C<$talking> is a blessed
+reference (and thus an instance). It then constructs an argument
+list, in this case from just C<($talking)>. (Later we'll see that
+arguments will take their place following the instance variable,
+just like with classes.)
+
+Now for the fun part: Perl takes the class in which the instance was
+blessed, in this case C<Horse>, and uses that to locate the subroutine
+to invoke the method. In this case, C<Horse::sound> is found directly
+(without using inheritance), yielding the final subroutine invocation:
+
+ Horse::sound($talking)
+
+Note that the first parameter here is still the instance, not the name
+of the class as before. We'll get C<neigh> as the return value, and
+that'll end up as the C<$noise> variable above.
+
+If Horse::sound had not been found, we'd be wandering up the
+C<@Horse::ISA> list to try to find the method in one of the
+superclasses, just as for a class method. The only difference between
+a class method and an instance method is whether the first parameter
+is an instance (a blessed reference) or a class name (a string).
+
+=head2 Accessing the instance data
+
+Because we get the instance as the first parameter, we can now access
+the instance-specific data. In this case, let's add a way to get at
+the name:
+
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ sub name {
+ my $self = shift;
+ $$self;
+ }
+ }
+
+Now we call for the name:
+
+ print $talking->name, " says ", $talking->sound, "\n";
+
+Inside C<Horse::name>, the C<@_> array contains just C<$talking>,
+which the C<shift> stores into C<$self>. (It's traditional to shift
+the first parameter off into a variable named C<$self> for instance
+methods, so stay with that unless you have strong reasons otherwise.)
+Then, C<$self> gets de-referenced as a scalar ref, yielding C<Mr. Ed>,
+and we're done with that. The result is:
+
+ Mr. Ed says neigh.
+
+=head2 How to build a horse
+
+Of course, if we constructed all of our horses by hand, we'd most
+likely make mistakes from time to time. We're also violating one of
+the properties of object-oriented programming, in that the "inside
+guts" of a Horse are visible. That's good if you're a veterinarian,
+but not if you just like to own horses. So, let's let the Horse class
+build a new horse:
+
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ sub name {
+ my $self = shift;
+ $$self;
+ }
+ sub named {
+ my $class = shift;
+ my $name = shift;
+ bless \$name, $class;
+ }
+ }
+
+Now with the new C<named> method, we can build a horse:
+
+ my $talking = Horse->named("Mr. Ed");
+
+Notice we're back to a class method, so the two arguments to
+C<Horse::named> are C<Horse> and C<Mr. Ed>. The C<bless> operator
+not only blesses C<$name>, it also returns the reference to C<$name>,
+so that's fine as a return value. And that's how to build a horse.
+
+We've called the constructor C<named> here, so that it quickly denotes
+the constructor's argument as the name for this particular C<Horse>.
+You can use different constructors with different names for different
+ways of "giving birth" to the object (like maybe recording its
+pedigree or date of birth). However, you'll find that most people
+coming to Perl from more limited languages use a single constructor
+named C<new>, with various ways of interpreting the arguments to
+C<new>. Either style is fine, as long as you document your particular
+way of giving birth to an object. (And you I<were> going to do that,
+right?)
+
+=head2 Inheriting the constructor
+
+But was there anything specific to C<Horse> in that method? No. Therefore,
+it's also the same recipe for building anything else that inherited from
+C<Animal>, so let's put it there:
+
+ { package Animal;
+ sub speak {
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n"
+ }
+ sub name {
+ my $self = shift;
+ $$self;
+ }
+ sub named {
+ my $class = shift;
+ my $name = shift;
+ bless \$name, $class;
+ }
+ }
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ }
+
+Ahh, but what happens if we invoke C<speak> on an instance?
+
+ my $talking = Horse->named("Mr. Ed");
+ $talking->speak;
+
+We get a debugging value:
+
+ a Horse=SCALAR(0xaca42ac) goes neigh!
+
+Why? Because the C<Animal::speak> routine is expecting a classname as
+its first parameter, not an instance. When the instance is passed in,
+we'll end up using a blessed scalar reference as a string, and that
+shows up as we saw it just now.
+
+=head2 Making a method work with either classes or instances
+
+All we need is for a method to detect if it is being called on a class
+or called on an instance. The most straightforward way is with the
+C<ref> operator. This returns a string (the classname) when used on a
+blessed reference, and C<undef> when used on a string (like a
+classname). Let's modify the C<name> method first to notice the change:
+
+ sub name {
+ my $either = shift;
+ ref $either
+ ? $$either # it's an instance, return name
+ : "an unnamed $either"; # it's a class, return generic
+ }
+
+Here, the C<?:> operator comes in handy to select either the
+dereference or a derived string. Now we can use this with either an
+instance or a class. Note that I've changed the first parameter
+holder to C<$either> to show that this is intended:
+
+ my $talking = Horse->named("Mr. Ed");
+ print Horse->name, "\n"; # prints "an unnamed Horse\n"
+ print $talking->name, "\n"; # prints "Mr Ed.\n"
+
+and now we'll fix C<speak> to use this:
+
+ sub speak {
+ my $either = shift;
+ print $either->name, " goes ", $either->sound, "\n";
+ }
+
+And since C<sound> already worked with either a class or an instance,
+we're done!
+
+=head2 Adding parameters to a method
+
+Let's train our animals to eat:
+
+ { package Animal;
+ sub named {
+ my $class = shift;
+ my $name = shift;
+ bless \$name, $class;
+ }
+ sub name {
+ my $either = shift;
+ ref $either
+ ? $$either # it's an instance, return name
+ : "an unnamed $either"; # it's a class, return generic
+ }
+ sub speak {
+ my $either = shift;
+ print $either->name, " goes ", $either->sound, "\n";
+ }
+ sub eat {
+ my $either = shift;
+ my $food = shift;
+ print $either->name, " eats $food.\n";
+ }
+ }
+ { package Horse;
+ @ISA = qw(Animal);
+ sub sound { "neigh" }
+ }
+ { package Sheep;
+ @ISA = qw(Animal);
+ sub sound { "baaaah" }
+ }
+
+And now try it out:
+
+ my $talking = Horse->named("Mr. Ed");
+ $talking->eat("hay");
+ Sheep->eat("grass");
+
+which prints:
+
+ Mr. Ed eats hay.
+ an unnamed Sheep eats grass.
+
+An instance method with parameters gets invoked with the instance,
+and then the list of parameters. So that first invocation is like:
+
+ Animal::eat($talking, "hay");
+
+=head2 More interesting instances
+
+What if an instance needs more data? Most interesting instances are
+made of many items, each of which can in turn be a reference or even
+another object. The easiest way to store these is often in a hash.
+The keys of the hash serve as the names of parts of the object (often
+called "instance variables" or "member variables"), and the
+corresponding values are, well, the values.
+
+But how do we turn the horse into a hash? Recall that an object was
+any blessed reference. We can just as easily make it a blessed hash
+reference as a blessed scalar reference, as long as everything that
+looks at the reference is changed accordingly.
+
+Let's make a sheep that has a name and a color:
+
+ my $bad = bless { Name => "Evil", Color => "black" }, Sheep;
+
+so C<< $bad->{Name} >> has C<Evil>, and C<< $bad->{Color} >> has
+C<black>. But we want to make C<< $bad->name >> access the name, and
+that's now messed up because it's expecting a scalar reference. Not
+to worry, because that's pretty easy to fix up:
+
+ ## in Animal
+ sub name {
+ my $either = shift;
+ ref $either ?
+ $either->{Name} :
+ "an unnamed $either";
+ }
+
+And of course C<named> still builds a scalar sheep, so let's fix that
+as well:
+
+ ## in Animal
+ sub named {
+ my $class = shift;
+ my $name = shift;
+ my $self = { Name => $name, Color => $class->default_color };
+ bless $self, $class;
+ }
+
+What's this C<default_color>? Well, if C<named> has only the name,
+we still need to set a color, so we'll have a class-specific initial color.
+For a sheep, we might define it as white:
+
+ ## in Sheep
+ sub default_color { "white" }
+
+And then to keep from having to define one for each additional class,
+we'll define a "backstop" method that serves as the "default default",
+directly in C<Animal>:
+
+ ## in Animal
+ sub default_color { "brown" }
+
+Now, because C<name> and C<named> were the only methods that
+referenced the "structure" of the object, the rest of the methods can
+remain the same, so C<speak> still works as before.
+
+=head2 A horse of a different color
+
+But having all our horses be brown would be boring. So let's add a
+method or two to get and set the color.
+
+ ## in Animal
+ sub color {
+ $_[0]->{Color}
+ }
+ sub set_color {
+ $_[0]->{Color} = $_[1];
+ }
+
+Note the alternate way of accessing the arguments: C<$_[0]> is used
+in-place, rather than with a C<shift>. (This saves us a bit of time
+for something that may be invoked frequently.) And now we can fix
+that color for Mr. Ed:
+
+ my $talking = Horse->named("Mr. Ed");
+ $talking->set_color("black-and-white");
+ print $talking->name, " is colored ", $talking->color, "\n";
+
+which results in:
+
+ Mr. Ed is colored black-and-white
+
+=head2 Summary
+
+So, now we have class methods, constructors, instance methods,
+instance data, and even accessors. But that's still just the
+beginning of what Perl has to offer. We haven't even begun to talk
+about accessors that double as getters and setters, destructors,
+indirect object notation, subclasses that add instance data, per-class
+data, overloading, "isa" and "can" tests, C<UNIVERSAL> class, and so
+on. That's for the rest of the Perl documentation to cover.
+Hopefully, this gets you started, though.
+
+=head1 SEE ALSO
+
+For more information, see L<perlobj> (for all the gritty details about
+Perl objects, now that you've seen the basics), L<perltoot> (the
+tutorial for those who already know objects), L<perlbot> (for some
+more tricks), and books such as Damian Conway's excellent I<Object
+Oriented Perl>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1999, 2000 by Randal L. Schwartz and Stonehenge
+Consulting Services, Inc. Permission is hereby granted to distribute
+this document intact with the Perl distribution, and in accordance
+with the licenses of the Perl distribution; derived documents must
+include this copyright notice intact.
+
+Portions of this text have been derived from Perl Training materials
+originally appearing in the I<Packages, References, Objects, and
+Modules> course taught by instructors for Stonehenge Consulting
+Services, Inc. and used with permission.
+
+Portions of this text have been derived from materials originally
+appearing in I<Linux Magazine> and used with permission.
diff --git a/contrib/perl5/pod/perlcall.pod b/contrib/perl5/pod/perlcall.pod
index 2b83780..148b24b 100644
--- a/contrib/perl5/pod/perlcall.pod
+++ b/contrib/perl5/pod/perlcall.pod
@@ -45,7 +45,7 @@ Before you launch yourself head first into the rest of this document,
it would be a good idea to have read the following two documents -
L<perlxs> and L<perlguts>.
-=head1 THE PERL_CALL FUNCTIONS
+=head1 THE CALL_ FUNCTIONS
Although this stuff is easier to explain using examples, you first need
be aware of a few important definitions.
@@ -53,17 +53,17 @@ be aware of a few important definitions.
Perl has a number of C functions that allow you to call Perl
subroutines. They are
- I32 perl_call_sv(SV* sv, I32 flags) ;
- I32 perl_call_pv(char *subname, I32 flags) ;
- I32 perl_call_method(char *methname, I32 flags) ;
- I32 perl_call_argv(char *subname, I32 flags, register char **argv) ;
+ I32 call_sv(SV* sv, I32 flags) ;
+ I32 call_pv(char *subname, I32 flags) ;
+ I32 call_method(char *methname, I32 flags) ;
+ I32 call_argv(char *subname, I32 flags, register char **argv) ;
-The key function is I<perl_call_sv>. All the other functions are
+The key function is I<call_sv>. All the other functions are
fairly simple wrappers which make it easier to call Perl subroutines in
-special cases. At the end of the day they will all call I<perl_call_sv>
+special cases. At the end of the day they will all call I<call_sv>
to invoke the Perl subroutine.
-All the I<perl_call_*> functions have a C<flags> parameter which is
+All the I<call_*> functions have a C<flags> parameter which is
used to pass a bit mask of options to Perl. This bit mask operates
identically for each of the functions. The settings available in the
bit mask are discussed in L<FLAG VALUES>.
@@ -72,40 +72,40 @@ Each of the functions will now be discussed in turn.
=over 5
-=item perl_call_sv
+=item call_sv
-I<perl_call_sv> takes two parameters, the first, C<sv>, is an SV*.
+I<call_sv> takes two parameters, the first, C<sv>, is an SV*.
This allows you to specify the Perl subroutine to be called either as a
C string (which has first been converted to an SV) or a reference to a
-subroutine. The section, I<Using perl_call_sv>, shows how you can make
-use of I<perl_call_sv>.
+subroutine. The section, I<Using call_sv>, shows how you can make
+use of I<call_sv>.
-=item perl_call_pv
+=item call_pv
-The function, I<perl_call_pv>, is similar to I<perl_call_sv> except it
+The function, I<call_pv>, is similar to I<call_sv> except it
expects its first parameter to be a C char* which identifies the Perl
-subroutine you want to call, e.g., C<perl_call_pv("fred", 0)>. If the
+subroutine you want to call, e.g., C<call_pv("fred", 0)>. If the
subroutine you want to call is in another package, just include the
package name in the string, e.g., C<"pkg::fred">.
-=item perl_call_method
+=item call_method
-The function I<perl_call_method> is used to call a method from a Perl
+The function I<call_method> is used to call a method from a Perl
class. The parameter C<methname> corresponds to the name of the method
to be called. Note that the class that the method belongs to is passed
on the Perl stack rather than in the parameter list. This class can be
either the name of the class (for a static method) or a reference to an
object (for a virtual method). See L<perlobj> for more information on
-static and virtual methods and L<Using perl_call_method> for an example
-of using I<perl_call_method>.
+static and virtual methods and L<Using call_method> for an example
+of using I<call_method>.
-=item perl_call_argv
+=item call_argv
-I<perl_call_argv> calls the Perl subroutine specified by the C string
+I<call_argv> calls the Perl subroutine specified by the C string
stored in the C<subname> parameter. It also takes the usual C<flags>
parameter. The final parameter, C<argv>, consists of a NULL terminated
list of C strings to be passed as parameters to the Perl subroutine.
-See I<Using perl_call_argv>.
+See I<Using call_argv>.
=back
@@ -116,12 +116,12 @@ subroutine are stored on the Perl stack.
As a general rule you should I<always> check the return value from
these functions. Even if you are expecting only a particular number of
values to be returned from the Perl subroutine, there is nothing to
-stop someone from doing something unexpected - don't say you haven't
+stop someone from doing something unexpected--don't say you haven't
been warned.
=head1 FLAG VALUES
-The C<flags> parameter in all the I<perl_call_*> functions is a bit mask
+The C<flags> parameter in all the I<call_*> functions is a bit mask
which can consist of any combination of the symbols defined below,
OR'ed together.
@@ -146,7 +146,7 @@ It ensures that nothing is actually returned from the subroutine.
=back
-The value returned by the I<perl_call_*> function indicates how many
+The value returned by the I<call_*> function indicates how many
items have been returned by the Perl subroutine - in this case it will
be 0.
@@ -154,7 +154,7 @@ be 0.
=head2 G_SCALAR
Calls the Perl subroutine in a scalar context. This is the default
-context flag setting for all the I<perl_call_*> functions.
+context flag setting for all the I<call_*> functions.
This flag has 2 effects:
@@ -174,7 +174,7 @@ returned.
=back
-The value returned by the I<perl_call_*> function indicates how many
+The value returned by the I<call_*> function indicates how many
items have been returned by the Perl subroutine - in this case it will
be either 0 or 1.
@@ -187,7 +187,7 @@ many items the Perl subroutine returns, only the last one will be
accessible from the stack - think of the case where only one value is
returned as being a list with only one element. Any other items that
were returned will not exist by the time control returns from the
-I<perl_call_*> function. The section I<Returning a list in a scalar
+I<call_*> function. The section I<Returning a list in a scalar
context> shows an example of this behavior.
@@ -208,11 +208,11 @@ array context (if it executes I<wantarray> the result will be true).
=item 2.
It ensures that all items returned from the subroutine will be
-accessible when control returns from the I<perl_call_*> function.
+accessible when control returns from the I<call_*> function.
=back
-The value returned by the I<perl_call_*> function indicates how many
+The value returned by the I<call_*> function indicates how many
items have been returned by the Perl subroutine.
If 0, then you have specified the G_DISCARD flag.
@@ -225,7 +225,7 @@ Perl stack.
=head2 G_DISCARD
-By default, the I<perl_call_*> functions place the items returned from
+By default, the I<call_*> functions place the items returned from
by the Perl subroutine on the stack. If you are not interested in
these items, then setting this flag will make Perl get rid of them
automatically for you. Note that it is still possible to indicate a
@@ -241,7 +241,7 @@ can ignore the problem and let Perl deal with it for you.
=head2 G_NOARGS
-Whenever a Perl subroutine is called using one of the I<perl_call_*>
+Whenever a Perl subroutine is called using one of the I<call_*>
functions, it is assumed by default that parameters are to be passed to
the subroutine. If you are not passing any parameters to the Perl
subroutine, you can save a bit of time by setting this flag. It has
@@ -255,7 +255,7 @@ has been called to think that you have passed it parameters.
In fact, what can happen is that the Perl subroutine you have called
can access the C<@_> array from a previous Perl subroutine. This will
-occur when the code that is executing the I<perl_call_*> function has
+occur when the code that is executing the I<call_*> function has
itself been called from another Perl subroutine. The code below
illustrates this
@@ -284,10 +284,10 @@ process will terminate immediately. If you want to trap this
type of event, specify the G_EVAL flag. It will put an I<eval { }>
around the subroutine call.
-Whenever control returns from the I<perl_call_*> function you need to
+Whenever control returns from the I<call_*> function you need to
check the C<$@> variable as you would in a normal Perl script.
-The value returned from the I<perl_call_*> function is dependent on
+The value returned from the I<call_*> function is dependent on
what other flags have been specified and whether an error has
occurred. Here are all the different cases that can occur:
@@ -295,7 +295,7 @@ occurred. Here are all the different cases that can occur:
=item *
-If the I<perl_call_*> function returns normally, then the value
+If the I<call_*> function returns normally, then the value
returned is as specified in the previous sections.
=item *
@@ -338,7 +338,7 @@ such situations, you will not want to clear C<$@> at all, but simply to
append any new errors to any existing value of C<$@>.
The G_KEEPERR flag is meant to be used in conjunction with G_EVAL in
-I<perl_call_*> functions that are used to implement such code. This flag
+I<call_*> functions that are used to implement such code. This flag
has no effect when G_EVAL is not used.
When G_KEEPERR is used, any errors in the called code will be prefixed
@@ -365,7 +365,7 @@ section I<Using GIMME_V>.
=head1 KNOWN PROBLEMS
This section outlines all known problems that exist in the
-I<perl_call_*> functions.
+I<call_*> functions.
=over 5
@@ -378,12 +378,12 @@ flags will not work as described in the section I<FLAG VALUES>.
Specifically, if the two flags are used when calling a subroutine and
that subroutine does not call I<die>, the value returned by
-I<perl_call_*> will be wrong.
+I<call_*> will be wrong.
=item 2.
-In Perl 5.000 and 5.001 there is a problem with using I<perl_call_*> if
+In Perl 5.000 and 5.001 there is a problem with using I<call_*> if
the Perl sub you are calling attempts to trap a I<die>.
The symptom of this problem is that the called Perl sub will continue
@@ -405,7 +405,7 @@ via this XSUB
Call_fred()
CODE:
PUSHMARK(SP) ;
- perl_call_pv("fred", G_DISCARD|G_NOARGS) ;
+ call_pv("fred", G_DISCARD|G_NOARGS) ;
fprintf(stderr, "back in Call_fred\n") ;
When C<Call_fred> is executed it will print
@@ -416,13 +416,13 @@ As control never returns to C<Call_fred>, the C<"back in Call_fred">
string will not get printed.
To work around this problem, you can either upgrade to Perl 5.002 or
-higher, or use the G_EVAL flag with I<perl_call_*> as shown below
+higher, or use the G_EVAL flag with I<call_*> as shown below
void
Call_fred()
CODE:
PUSHMARK(SP) ;
- perl_call_pv("fred", G_EVAL|G_DISCARD|G_NOARGS) ;
+ call_pv("fred", G_EVAL|G_DISCARD|G_NOARGS) ;
fprintf(stderr, "back in Call_fred\n") ;
=back
@@ -439,11 +439,11 @@ to Perl internals. We hope this should make the code less vulnerable
to any changes made to Perl in the future.
Another point worth noting is that in the first series of examples I
-have made use of only the I<perl_call_pv> function. This has been done
+have made use of only the I<call_pv> function. This has been done
to keep the code simpler and ease you into the topic. Wherever
-possible, if the choice is between using I<perl_call_pv> and
-I<perl_call_sv>, you should always try to use I<perl_call_sv>. See
-I<Using perl_call_sv> for details.
+possible, if the choice is between using I<call_pv> and
+I<call_sv>, you should always try to use I<call_sv>. See
+I<Using call_sv> for details.
=head2 No Parameters, Nothing returned
@@ -463,7 +463,7 @@ and here is a C function to call it
dSP ;
PUSHMARK(SP) ;
- perl_call_pv("PrintUID", G_DISCARD|G_NOARGS) ;
+ call_pv("PrintUID", G_DISCARD|G_NOARGS) ;
}
Simple, eh.
@@ -487,27 +487,27 @@ specified.
We aren't interested in anything returned from I<PrintUID>, so
G_DISCARD is specified. Even if I<PrintUID> was changed to
return some value(s), having specified G_DISCARD will mean that they
-will be wiped by the time control returns from I<perl_call_pv>.
+will be wiped by the time control returns from I<call_pv>.
=item 4.
-As I<perl_call_pv> is being used, the Perl subroutine is specified as a
+As I<call_pv> is being used, the Perl subroutine is specified as a
C string. In this case the subroutine name has been 'hard-wired' into the
code.
=item 5.
Because we specified G_DISCARD, it is not necessary to check the value
-returned from I<perl_call_pv>. It will always be 0.
+returned from I<call_pv>. It will always be 0.
=back
=head2 Passing Parameters
Now let's make a slightly more complex example. This time we want to
-call a Perl subroutine, C<LeftString>, which will take 2 parameters - a
-string (C<$s>) and an integer (C<$n>). The subroutine will simply
-print the first C<$n> characters of the string.
+call a Perl subroutine, C<LeftString>, which will take 2 parameters--a
+string ($s) and an integer ($n). The subroutine will simply
+print the first $n characters of the string.
So the Perl subroutine would look like this
@@ -534,7 +534,7 @@ The C function required to call I<LeftString> would look like this.
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK ;
- perl_call_pv("LeftString", G_DISCARD);
+ call_pv("LeftString", G_DISCARD);
FREETMPS ;
LEAVE ;
@@ -555,7 +555,7 @@ as C<SP>.
=item 2.
If you are going to put something onto the Perl stack, you need to know
-where to put it. This is the purpose of the macro C<dSP> - it declares
+where to put it. This is the purpose of the macro C<dSP>--it declares
and initializes a I<local> copy of the Perl stack pointer.
All the other macros which will be used in this example require you to
@@ -563,7 +563,7 @@ have used this macro.
The exception to this rule is if you are calling a Perl subroutine
directly from an XSUB function. In this case it is not necessary to
-use the C<dSP> macro explicitly - it will be declared for you
+use the C<dSP> macro explicitly--it will be declared for you
automatically.
=item 3.
@@ -578,12 +578,12 @@ The C<PUSHMARK> macro tells Perl to make a mental note of the current
stack pointer. Even if you aren't passing any parameters (like the
example shown in the section I<No Parameters, Nothing returned>) you
must still call the C<PUSHMARK> macro before you can call any of the
-I<perl_call_*> functions - Perl still needs to know that there are no
+I<call_*> functions--Perl still needs to know that there are no
parameters.
The C<PUTBACK> macro sets the global copy of the stack pointer to be
-the same as our local copy. If we didn't do this I<perl_call_pv>
-wouldn't know where the two parameters we pushed were - remember that
+the same as our local copy. If we didn't do this I<call_pv>
+wouldn't know where the two parameters we pushed were--remember that
up to now all the stack pointer manipulation we have done is with our
local copy, I<not> the global copy.
@@ -634,7 +634,7 @@ an alternative to using these macros.
=item 7.
-Finally, I<LeftString> can now be called via the I<perl_call_pv>
+Finally, I<LeftString> can now be called via the I<call_pv>
function.
=back
@@ -672,7 +672,7 @@ function required to call it is now a bit more complex.
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK ;
- count = perl_call_pv("Adder", G_SCALAR);
+ count = call_pv("Adder", G_SCALAR);
SPAGAIN ;
@@ -694,23 +694,23 @@ Points to note this time are
The only flag specified this time was G_SCALAR. That means the C<@_>
array will be created and that the value returned by I<Adder> will
-still exist after the call to I<perl_call_pv>.
+still exist after the call to I<call_pv>.
=item 2.
The purpose of the macro C<SPAGAIN> is to refresh the local copy of the
stack pointer. This is necessary because it is possible that the memory
allocated to the Perl stack has been reallocated whilst in the
-I<perl_call_pv> call.
+I<call_pv> call.
If you are making use of the Perl stack pointer in your code you must
always refresh the local copy using SPAGAIN whenever you make use
-of the I<perl_call_*> functions or any other Perl internal function.
+of the I<call_*> functions or any other Perl internal function.
=item 3.
Although only a single value was expected to be returned from I<Adder>,
-it is still good practice to check the return code from I<perl_call_pv>
+it is still good practice to check the return code from I<call_pv>
anyway.
Expecting a single value is not quite the same as knowing that there
@@ -776,7 +776,7 @@ and this is the C function
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK ;
- count = perl_call_pv("AddSubtract", G_ARRAY);
+ count = call_pv("AddSubtract", G_ARRAY);
SPAGAIN ;
@@ -839,7 +839,7 @@ context, like this
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK ;
- count = perl_call_pv("AddSubtract", G_SCALAR);
+ count = call_pv("AddSubtract", G_SCALAR);
SPAGAIN ;
@@ -907,7 +907,7 @@ and here is a C function to call it.
XPUSHs(svb);
PUTBACK ;
- count = perl_call_pv("Inc", G_DISCARD);
+ count = call_pv("Inc", G_DISCARD);
if (count != 0)
croak ("call_Inc: expected 0 values from 'Inc', got %d\n",
@@ -921,12 +921,12 @@ and here is a C function to call it.
}
To be able to access the two parameters that were pushed onto the stack
-after they return from I<perl_call_pv> it is necessary to make a note
-of their addresses - thus the two variables C<sva> and C<svb>.
+after they return from I<call_pv> it is necessary to make a note
+of their addresses--thus the two variables C<sva> and C<svb>.
The reason this is necessary is that the area of the Perl stack which
held them will very likely have been overwritten by something else by
-the time control returns from I<perl_call_pv>.
+the time control returns from I<call_pv>.
@@ -964,7 +964,7 @@ and some C to call it
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK ;
- count = perl_call_pv("Subtract", G_EVAL|G_SCALAR);
+ count = call_pv("Subtract", G_EVAL|G_SCALAR);
SPAGAIN ;
@@ -1031,7 +1031,7 @@ refers to the C equivalent of C<$@>.
Note that the stack is popped using C<POPs> in the block where
C<SvTRUE(ERRSV)> is true. This is necessary because whenever a
-I<perl_call_*> function invoked with G_EVAL|G_SCALAR returns an error,
+I<call_*> function invoked with G_EVAL|G_SCALAR returns an error,
the top of the stack holds the value I<undef>. Because we want the
program to continue after detecting this error, it is essential that
the stack is tidied up by removing the I<undef>.
@@ -1061,18 +1061,18 @@ version of the call_Subtract example above inside a destructor:
This example will fail to recognize that an error occurred inside the
C<eval {}>. Here's why: the call_Subtract code got executed while perl
was cleaning up temporaries when exiting the eval block, and because
-call_Subtract is implemented with I<perl_call_pv> using the G_EVAL
+call_Subtract is implemented with I<call_pv> using the G_EVAL
flag, it promptly reset C<$@>. This results in the failure of the
outermost test for C<$@>, and thereby the failure of the error trap.
-Appending the G_KEEPERR flag, so that the I<perl_call_pv> call in
+Appending the G_KEEPERR flag, so that the I<call_pv> call in
call_Subtract reads:
- count = perl_call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);
+ count = call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);
will preserve the error and restore reliable error handling.
-=head2 Using perl_call_sv
+=head2 Using call_sv
In all the previous examples I have 'hard-wired' the name of the Perl
subroutine to be called from C. Most of the time though, it is more
@@ -1095,23 +1095,23 @@ Here is a snippet of XSUB which defines I<CallSubPV>.
char * name
CODE:
PUSHMARK(SP) ;
- perl_call_pv(name, G_DISCARD|G_NOARGS) ;
+ call_pv(name, G_DISCARD|G_NOARGS) ;
That is fine as far as it goes. The thing is, the Perl subroutine
can be specified as only a string. For Perl 4 this was adequate,
but Perl 5 allows references to subroutines and anonymous subroutines.
-This is where I<perl_call_sv> is useful.
+This is where I<call_sv> is useful.
The code below for I<CallSubSV> is identical to I<CallSubPV> except
that the C<name> parameter is now defined as an SV* and we use
-I<perl_call_sv> instead of I<perl_call_pv>.
+I<call_sv> instead of I<call_pv>.
void
CallSubSV(name)
SV * name
CODE:
PUSHMARK(SP) ;
- perl_call_sv(name, G_DISCARD|G_NOARGS) ;
+ call_sv(name, G_DISCARD|G_NOARGS) ;
Because we are using an SV to call I<fred> the following can all be used
@@ -1121,7 +1121,7 @@ Because we are using an SV to call I<fred> the following can all be used
CallSubSV($ref) ;
CallSubSV( sub { print "Hello there\n" } ) ;
-As you can see, I<perl_call_sv> gives you much greater flexibility in
+As you can see, I<call_sv> gives you much greater flexibility in
how you can specify the Perl subroutine.
You should note that if it is necessary to store the SV (C<name> in the
@@ -1141,7 +1141,7 @@ pointer to the SV. Say the code above had been like this
CallSavedSub1()
CODE:
PUSHMARK(SP) ;
- perl_call_sv(rememberSub, G_DISCARD|G_NOARGS) ;
+ call_sv(rememberSub, G_DISCARD|G_NOARGS) ;
The reason this is wrong is that by the time you come to use the
pointer C<rememberSub> in C<CallSavedSub1>, it may or may not still refer
@@ -1175,11 +1175,11 @@ the version of Perl you are using)
Not a CODE reference at ...
Undefined subroutine &main::47 called ...
-The variable C<$ref> may have referred to the subroutine C<fred>
+The variable $ref may have referred to the subroutine C<fred>
whenever the call to C<SaveSub1> was made but by the time
C<CallSavedSub1> gets called it now holds the number C<47>. Because we
saved only a pointer to the original SV in C<SaveSub1>, any changes to
-C<$ref> will be tracked by the pointer C<rememberSub>. This means that
+$ref will be tracked by the pointer C<rememberSub>. This means that
whenever C<CallSavedSub1> gets called, it will attempt to execute the
code which is referenced by the SV* C<rememberSub>. In this case
though, it now refers to the integer C<47>, so expect Perl to complain
@@ -1217,7 +1217,7 @@ SV. The code below shows C<SaveSub2> modified to do that
CallSavedSub2()
CODE:
PUSHMARK(SP) ;
- perl_call_sv(keepSub, G_DISCARD|G_NOARGS) ;
+ call_sv(keepSub, G_DISCARD|G_NOARGS) ;
To avoid creating a new SV every time C<SaveSub2> is called,
the function first checks to see if it has been called before. If not,
@@ -1227,7 +1227,7 @@ operation using C<newSVsv>. Thereafter, whenever C<SaveSub2> is called
the existing SV, C<keepSub>, is overwritten with the new value using
C<SvSetSV>.
-=head2 Using perl_call_argv
+=head2 Using call_argv
Here is a Perl subroutine which prints whatever parameters are passed
to it.
@@ -1239,7 +1239,7 @@ to it.
foreach (@list) { print "$_\n" }
}
-and here is an example of I<perl_call_argv> which will call
+and here is an example of I<call_argv> which will call
I<PrintList>.
static char * words[] = {"alpha", "beta", "gamma", "delta", NULL} ;
@@ -1249,13 +1249,13 @@ I<PrintList>.
{
dSP ;
- perl_call_argv("PrintList", G_DISCARD, words) ;
+ call_argv("PrintList", G_DISCARD, words) ;
}
Note that it is not necessary to call C<PUSHMARK> in this instance.
-This is because I<perl_call_argv> will do it for you.
+This is because I<call_argv> will do it for you.
-=head2 Using perl_call_method
+=head2 Using call_method
Consider the following Perl code
@@ -1330,7 +1330,7 @@ the C<PrintID> and C<Display> methods from C.
XPUSHs(sv_2mortal(newSViv(index))) ;
PUTBACK;
- perl_call_method(method, G_DISCARD) ;
+ call_method(method, G_DISCARD) ;
void
call_PrintID(class, method)
@@ -1341,7 +1341,7 @@ the C<PrintID> and C<Display> methods from C.
XPUSHs(sv_2mortal(newSVpv(class, 0))) ;
PUTBACK;
- perl_call_method(method, G_DISCARD) ;
+ call_method(method, G_DISCARD) ;
So the methods C<PrintID> and C<Display> can be invoked like this
@@ -1351,8 +1351,8 @@ So the methods C<PrintID> and C<Display> can be invoked like this
call_PrintID('Mine', 'PrintID') ;
The only thing to note is that in both the static and virtual methods,
-the method name is not passed via the stack - it is used as the first
-parameter to I<perl_call_method>.
+the method name is not passed via the stack--it is used as the first
+parameter to I<call_method>.
=head2 Using GIMME_V
@@ -1385,14 +1385,14 @@ The output from that will be
=head2 Using Perl to dispose of temporaries
In the examples given to date, any temporaries created in the callback
-(i.e., parameters passed on the stack to the I<perl_call_*> function or
+(i.e., parameters passed on the stack to the I<call_*> function or
values returned via the stack) have been freed by one of these methods
=over 5
=item *
-specifying the G_DISCARD flag with I<perl_call_*>.
+specifying the G_DISCARD flag with I<call_*>.
=item *
@@ -1440,11 +1440,11 @@ situation
...
error occurs
...
- external library --> perl_call --> perl
+ external library --> call_* --> perl
|
- perl <-- XSUB <-- external library <-- perl_call <----+
+ perl <-- XSUB <-- external library <-- call_* <----+
-After processing of the error using I<perl_call_*> is completed,
+After processing of the error using I<call_*> is completed,
control reverts back to Perl more or less immediately.
In the diagram, the further right you go the more deeply nested the
@@ -1457,22 +1457,22 @@ will be more like this
perl --> XSUB --> event handler
...
- event handler --> perl_call --> perl
+ event handler --> call_* --> perl
|
- event handler <-- perl_call <----+
+ event handler <-- call_* <----+
...
- event handler --> perl_call --> perl
+ event handler --> call_* --> perl
|
- event handler <-- perl_call <----+
+ event handler <-- call_* <----+
...
- event handler --> perl_call --> perl
+ event handler --> call_* --> perl
|
- event handler <-- perl_call <----+
+ event handler <-- call_* <----+
In this case the flow of control can consist of only the repeated
sequence
- event handler --> perl_call --> perl
+ event handler --> call_* --> perl
for practically the complete duration of the program. This means that
control may I<never> drop back to the surrounding scope in Perl at the
@@ -1485,9 +1485,9 @@ enclosing scope at some stage. In the event driven scenario that may
never happen. This means that as time goes on, your program will
create more and more temporaries, none of which will ever be freed. As
each of these temporaries consumes some memory your program will
-eventually consume all the available memory in your system - kapow!
+eventually consume all the available memory in your system--kapow!
-So here is the bottom line - if you are sure that control will revert
+So here is the bottom line--if you are sure that control will revert
back to the enclosing Perl scope fairly quickly after the end of your
callback, then it isn't absolutely necessary to dispose explicitly of
any temporaries you may have created. Mind you, if you are at all
@@ -1532,7 +1532,7 @@ Now change that to call a Perl subroutine instead
PUSHMARK(SP) ;
/* Call the Perl sub to process the callback */
- perl_call_sv(callback, G_DISCARD) ;
+ call_sv(callback, G_DISCARD) ;
}
@@ -1579,7 +1579,7 @@ require is a means of storing the mapping between the opened file and
the Perl subroutine we want to be called for that file.
Say the i/o library has a function C<asynch_read> which associates a C
-function C<ProcessRead> with a file handle C<fh> - this assumes that it
+function C<ProcessRead> with a file handle C<fh>--this assumes that it
has also provided some routine to open the file and so obtain the file
handle.
@@ -1638,7 +1638,7 @@ and C<asynch_read_if> could look like this
PUTBACK ;
/* Call the Perl sub */
- perl_call_sv(*sv, G_DISCARD) ;
+ call_sv(*sv, G_DISCARD) ;
}
For completeness, here is C<asynch_close>. This shows how to remove
@@ -1721,7 +1721,7 @@ series of C functions to act as the interface to Perl, thus
PUTBACK ;
/* Call the Perl sub */
- perl_call_sv(Map[index].PerlSub, G_DISCARD) ;
+ call_sv(Map[index].PerlSub, G_DISCARD) ;
}
static void
@@ -1875,7 +1875,7 @@ of values> recoded to use C<ST> instead of C<POP*>.
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK ;
- count = perl_call_pv("AddSubtract", G_ARRAY);
+ count = call_pv("AddSubtract", G_ARRAY);
SPAGAIN ;
SP -= count ;
@@ -1924,22 +1924,22 @@ refers to the last.
=head2 Creating and calling an anonymous subroutine in C
-As we've already shown, C<perl_call_sv> can be used to invoke an
+As we've already shown, C<call_sv> can be used to invoke an
anonymous subroutine. However, our example showed a Perl script
invoking an XSUB to perform this operation. Let's see how it can be
done inside our C code:
...
- SV *cvrv = perl_eval_pv("sub { print 'You will not find me cluttering any namespace!' }", TRUE);
+ SV *cvrv = eval_pv("sub { print 'You will not find me cluttering any namespace!' }", TRUE);
...
- perl_call_sv(cvrv, G_VOID|G_NOARGS);
+ call_sv(cvrv, G_VOID|G_NOARGS);
-C<perl_eval_pv> is used to compile the anonymous subroutine, which
-will be the return value as well (read more about C<perl_eval_pv> in
-L<perlguts/perl_eval_pv>). Once this code reference is in hand, it
+C<eval_pv> is used to compile the anonymous subroutine, which
+will be the return value as well (read more about C<eval_pv> in
+L<perlapi/eval_pv>). Once this code reference is in hand, it
can be mixed in with all the previous examples we've shown.
=head1 SEE ALSO
@@ -1948,7 +1948,7 @@ L<perlxs>, L<perlguts>, L<perlembed>
=head1 AUTHOR
-Paul Marquess <F<pmarquess@bfsec.bt.co.uk>>
+Paul Marquess
Special thanks to the following people who assisted in the creation of
the document.
diff --git a/contrib/perl5/pod/perlcompile.pod b/contrib/perl5/pod/perlcompile.pod
new file mode 100644
index 0000000..697cb80
--- /dev/null
+++ b/contrib/perl5/pod/perlcompile.pod
@@ -0,0 +1,444 @@
+=head1 NAME
+
+perlcompile - Introduction to the Perl Compiler-Translator
+
+=head1 DESCRIPTION
+
+Perl has always had a compiler: your source is compiled into an
+internal form (a parse tree) which is then optimized before being
+run. Since version 5.005, Perl has shipped with a module
+capable of inspecting the optimized parse tree (C<B>), and this has
+been used to write many useful utilities, including a module that lets
+you turn your Perl into C source code that can be compiled into an
+native executable.
+
+The C<B> module provides access to the parse tree, and other modules
+("back ends") do things with the tree. Some write it out as
+bytecode, C source code, or a semi-human-readable text. Another
+traverses the parse tree to build a cross-reference of which
+subroutines, formats, and variables are used where. Another checks
+your code for dubious constructs. Yet another back end dumps the
+parse tree back out as Perl source, acting as a source code beautifier
+or deobfuscator.
+
+Because its original purpose was to be a way to produce C code
+corresponding to a Perl program, and in turn a native executable, the
+C<B> module and its associated back ends are known as "the
+compiler", even though they don't really compile anything.
+Different parts of the compiler are more accurately a "translator",
+or an "inspector", but people want Perl to have a "compiler
+option" not an "inspector gadget". What can you do?
+
+This document covers the use of the Perl compiler: which modules
+it comprises, how to use the most important of the back end modules,
+what problems there are, and how to work around them.
+
+=head2 Layout
+
+The compiler back ends are in the C<B::> hierarchy, and the front-end
+(the module that you, the user of the compiler, will sometimes
+interact with) is the O module. Some back ends (e.g., C<B::C>) have
+programs (e.g., I<perlcc>) to hide the modules' complexity.
+
+Here are the important back ends to know about, with their status
+expressed as a number from 0 (outline for later implementation) to
+10 (if there's a bug in it, we're very surprised):
+
+=over 4
+
+=item B::Bytecode
+
+Stores the parse tree in a machine-independent format, suitable
+for later reloading through the ByteLoader module. Status: 5 (some
+things work, some things don't, some things are untested).
+
+=item B::C
+
+Creates a C source file containing code to rebuild the parse tree
+and resume the interpreter. Status: 6 (many things work adequately,
+including programs using Tk).
+
+=item B::CC
+
+Creates a C source file corresponding to the run time code path in
+the parse tree. This is the closest to a Perl-to-C translator there
+is, but the code it generates is almost incomprehensible because it
+translates the parse tree into a giant switch structure that
+manipulates Perl structures. Eventual goal is to reduce (given
+sufficient type information in the Perl program) some of the
+Perl data structure manipulations into manipulations of C-level
+ints, floats, etc. Status: 5 (some things work, including
+uncomplicated Tk examples).
+
+=item B::Lint
+
+Complains if it finds dubious constructs in your source code. Status:
+6 (it works adequately, but only has a very limited number of areas
+that it checks).
+
+=item B::Deparse
+
+Recreates the Perl source, making an attempt to format it coherently.
+Status: 8 (it works nicely, but a few obscure things are missing).
+
+=item B::Xref
+
+Reports on the declaration and use of subroutines and variables.
+Status: 8 (it works nicely, but still has a few lingering bugs).
+
+=back
+
+=head1 Using The Back Ends
+
+The following sections describe how to use the various compiler back
+ends. They're presented roughly in order of maturity, so that the
+most stable and proven back ends are described first, and the most
+experimental and incomplete back ends are described last.
+
+The O module automatically enabled the B<-c> flag to Perl, which
+prevents Perl from executing your code once it has been compiled.
+This is why all the back ends print:
+
+ myperlprogram syntax OK
+
+before producing any other output.
+
+=head2 The Cross Referencing Back End
+
+The cross referencing back end (B::Xref) produces a report on your program,
+breaking down declarations and uses of subroutines and variables (and
+formats) by file and subroutine. For instance, here's part of the
+report from the I<pod2man> program that comes with Perl:
+
+ Subroutine clear_noremap
+ Package (lexical)
+ $ready_to_print i1069, 1079
+ Package main
+ $& 1086
+ $. 1086
+ $0 1086
+ $1 1087
+ $2 1085, 1085
+ $3 1085, 1085
+ $ARGV 1086
+ %HTML_Escapes 1085, 1085
+
+This shows the variables used in the subroutine C<clear_noremap>. The
+variable C<$ready_to_print> is a my() (lexical) variable,
+B<i>ntroduced (first declared with my()) on line 1069, and used on
+line 1079. The variable C<$&> from the main package is used on 1086,
+and so on.
+
+A line number may be prefixed by a single letter:
+
+=over 4
+
+=item i
+
+Lexical variable introduced (declared with my()) for the first time.
+
+=item &
+
+Subroutine or method call.
+
+=item s
+
+Subroutine defined.
+
+=item r
+
+Format defined.
+
+=back
+
+The most useful option the cross referencer has is to save the report
+to a separate file. For instance, to save the report on
+I<myperlprogram> to the file I<report>:
+
+ $ perl -MO=Xref,-oreport myperlprogram
+
+=head2 The Decompiling Back End
+
+The Deparse back end turns your Perl source back into Perl source. It
+can reformat along the way, making it useful as a de-obfuscator. The
+most basic way to use it is:
+
+ $ perl -MO=Deparse myperlprogram
+
+You'll notice immediately that Perl has no idea of how to paragraph
+your code. You'll have to separate chunks of code from each other
+with newlines by hand. However, watch what it will do with
+one-liners:
+
+ $ perl -MO=Deparse -e '$op=shift||die "usage: $0
+ code [...]";chomp(@ARGV=<>)unless@ARGV; for(@ARGV){$was=$_;eval$op;
+ die$@ if$@; rename$was,$_ unless$was eq $_}'
+ -e syntax OK
+ $op = shift @ARGV || die("usage: $0 code [...]");
+ chomp(@ARGV = <ARGV>) unless @ARGV;
+ foreach $_ (@ARGV) {
+ $was = $_;
+ eval $op;
+ die $@ if $@;
+ rename $was, $_ unless $was eq $_;
+ }
+
+(this is the I<rename> program that comes in the I<eg/> directory
+of the Perl source distribution).
+
+The decompiler has several options for the code it generates. For
+instance, you can set the size of each indent from 4 (as above) to
+2 with:
+
+ $ perl -MO=Deparse,-si2 myperlprogram
+
+The B<-p> option adds parentheses where normally they are omitted:
+
+ $ perl -MO=Deparse -e 'print "Hello, world\n"'
+ -e syntax OK
+ print "Hello, world\n";
+ $ perl -MO=Deparse,-p -e 'print "Hello, world\n"'
+ -e syntax OK
+ print("Hello, world\n");
+
+See L<B::Deparse> for more information on the formatting options.
+
+=head2 The Lint Back End
+
+The lint back end (B::Lint) inspects programs for poor style. One
+programmer's bad style is another programmer's useful tool, so options
+let you select what is complained about.
+
+To run the style checker across your source code:
+
+ $ perl -MO=Lint myperlprogram
+
+To disable context checks and undefined subroutines:
+
+ $ perl -MO=Lint,-context,-undefined-subs myperlprogram
+
+See L<B::Lint> for information on the options.
+
+=head2 The Simple C Back End
+
+This module saves the internal compiled state of your Perl program
+to a C source file, which can be turned into a native executable
+for that particular platform using a C compiler. The resulting
+program links against the Perl interpreter library, so it
+will not save you disk space (unless you build Perl with a shared
+library) or program size. It may, however, save you startup time.
+
+The C<perlcc> tool generates such executables by default.
+
+ perlcc myperlprogram.pl
+
+=head2 The Bytecode Back End
+
+This back end is only useful if you also have a way to load and
+execute the bytecode that it produces. The ByteLoader module provides
+this functionality.
+
+To turn a Perl program into executable byte code, you can use C<perlcc>
+with the C<-b> switch:
+
+ perlcc -b myperlprogram.pl
+
+The byte code is machine independent, so once you have a compiled
+module or program, it is as portable as Perl source (assuming that
+the user of the module or program has a modern-enough Perl interpreter
+to decode the byte code).
+
+See B<B::Bytecode> for information on options to control the
+optimization and nature of the code generated by the Bytecode module.
+
+=head2 The Optimized C Back End
+
+The optimized C back end will turn your Perl program's run time
+code-path into an equivalent (but optimized) C program that manipulates
+the Perl data structures directly. The program will still link against
+the Perl interpreter library, to allow for eval(), C<s///e>,
+C<require>, etc.
+
+The C<perlcc> tool generates such executables when using the -opt
+switch. To compile a Perl program (ending in C<.pl>
+or C<.p>):
+
+ perlcc -opt myperlprogram.pl
+
+To produce a shared library from a Perl module (ending in C<.pm>):
+
+ perlcc -opt Myperlmodule.pm
+
+For more information, see L<perlcc> and L<B::CC>.
+
+=over 4
+
+=item B
+
+This module is the introspective ("reflective" in Java terms)
+module, which allows a Perl program to inspect its innards. The
+back end modules all use this module to gain access to the compiled
+parse tree. You, the user of a back end module, will not need to
+interact with B.
+
+=item O
+
+This module is the front-end to the compiler's back ends. Normally
+called something like this:
+
+ $ perl -MO=Deparse myperlprogram
+
+This is like saying C<use O 'Deparse'> in your Perl program.
+
+=item B::Asmdata
+
+This module is used by the B::Assembler module, which is in turn used
+by the B::Bytecode module, which stores a parse-tree as
+bytecode for later loading. It's not a back end itself, but rather a
+component of a back end.
+
+=item B::Assembler
+
+This module turns a parse-tree into data suitable for storing
+and later decoding back into a parse-tree. It's not a back end
+itself, but rather a component of a back end. It's used by the
+I<assemble> program that produces bytecode.
+
+=item B::Bblock
+
+This module is used by the B::CC back end. It walks "basic blocks".
+A basic block is a series of operations which is known to execute from
+start to finish, with no possiblity of branching or halting.
+
+=item B::Bytecode
+
+This module is a back end that generates bytecode from a
+program's parse tree. This bytecode is written to a file, from where
+it can later be reconstructed back into a parse tree. The goal is to
+do the expensive program compilation once, save the interpreter's
+state into a file, and then restore the state from the file when the
+program is to be executed. See L</"The Bytecode Back End">
+for details about usage.
+
+=item B::C
+
+This module writes out C code corresponding to the parse tree and
+other interpreter internal structures. You compile the corresponding
+C file, and get an executable file that will restore the internal
+structures and the Perl interpreter will begin running the
+program. See L</"The Simple C Back End"> for details about usage.
+
+=item B::CC
+
+This module writes out C code corresponding to your program's
+operations. Unlike the B::C module, which merely stores the
+interpreter and its state in a C program, the B::CC module makes a
+C program that does not involve the interpreter. As a consequence,
+programs translated into C by B::CC can execute faster than normal
+interpreted programs. See L</"The Optimized C Back End"> for
+details about usage.
+
+=item B::Debug
+
+This module dumps the Perl parse tree in verbose detail to STDOUT.
+It's useful for people who are writing their own back end, or who
+are learning about the Perl internals. It's not useful to the
+average programmer.
+
+=item B::Deparse
+
+This module produces Perl source code from the compiled parse tree.
+It is useful in debugging and deconstructing other people's code,
+also as a pretty-printer for your own source. See
+L</"The Decompiling Back End"> for details about usage.
+
+=item B::Disassembler
+
+This module turns bytecode back into a parse tree. It's not a back
+end itself, but rather a component of a back end. It's used by the
+I<disassemble> program that comes with the bytecode.
+
+=item B::Lint
+
+This module inspects the compiled form of your source code for things
+which, while some people frown on them, aren't necessarily bad enough
+to justify a warning. For instance, use of an array in scalar context
+without explicitly saying C<scalar(@array)> is something that Lint
+can identify. See L</"The Lint Back End"> for details about usage.
+
+=item B::Showlex
+
+This module prints out the my() variables used in a function or a
+file. To gt a list of the my() variables used in the subroutine
+mysub() defined in the file myperlprogram:
+
+ $ perl -MO=Showlex,mysub myperlprogram
+
+To gt a list of the my() variables used in the file myperlprogram:
+
+ $ perl -MO=Showlex myperlprogram
+
+[BROKEN]
+
+=item B::Stackobj
+
+This module is used by the B::CC module. It's not a back end itself,
+but rather a component of a back end.
+
+=item B::Stash
+
+This module is used by the L<perlcc> program, which compiles a module
+into an executable. B::Stash prints the symbol tables in use by a
+program, and is used to prevent B::CC from producing C code for the
+B::* and O modules. It's not a back end itself, but rather a
+component of a back end.
+
+=item B::Terse
+
+This module prints the contents of the parse tree, but without as much
+information as B::Debug. For comparison, C<print "Hello, world.">
+produced 96 lines of output from B::Debug, but only 6 from B::Terse.
+
+This module is useful for people who are writing their own back end,
+or who are learning about the Perl internals. It's not useful to the
+average programmer.
+
+=item B::Xref
+
+This module prints a report on where the variables, subroutines, and
+formats are defined and used within a program and the modules it
+loads. See L</"The Cross Referencing Back End"> for details about
+usage.
+
+=back
+
+=head1 KNOWN PROBLEMS
+
+The simple C backend currently only saves typeglobs with alphanumeric
+names.
+
+The optimized C backend outputs code for more modules than it should
+(e.g., DirHandle). It also has little hope of properly handling
+C<goto LABEL> outside the running subroutine (C<goto &sub> is ok).
+C<goto LABEL> currently does not work at all in this backend.
+It also creates a huge initialization function that gives
+C compilers headaches. Splitting the initialization function gives
+better results. Other problems include: unsigned math does not
+work correctly; some opcodes are handled incorrectly by default
+opcode handling mechanism.
+
+BEGIN{} blocks are executed while compiling your code. Any external
+state that is initialized in BEGIN{}, such as opening files, initiating
+database connections etc., do not behave properly. To work around
+this, Perl has an INIT{} block that corresponds to code being executed
+before your program begins running but after your program has finished
+being compiled. Execution order: BEGIN{}, (possible save of state
+through compiler back-end), INIT{}, program runs, END{}.
+
+=head1 AUTHOR
+
+This document was originally written by Nathan Torkington, and is now
+maintained by the perl5-porters mailing list
+I<perl5-porters@perl.org>.
+
+=cut
diff --git a/contrib/perl5/pod/perldata.pod b/contrib/perl5/pod/perldata.pod
index 9e41c2c..ac444fa 100644
--- a/contrib/perl5/pod/perldata.pod
+++ b/contrib/perl5/pod/perldata.pod
@@ -6,78 +6,84 @@ perldata - Perl data types
=head2 Variable names
-Perl has three data structures: scalars, arrays of scalars, and
-associative arrays of scalars, known as "hashes". Normal arrays are
-indexed by number, starting with 0. (Negative subscripts count from
-the end.) Hash arrays are indexed by string.
+Perl has three built-in data types: scalars, arrays of scalars, and
+associative arrays of scalars, known as "hashes". Normal arrays
+are ordered lists of scalars indexed by number, starting with 0 and with
+negative subscripts counting from the end. Hashes are unordered
+collections of scalar values indexed by their associated string key.
-Values are usually referred to by name (or through a named reference).
+Values are usually referred to by name, or through a named reference.
The first character of the name tells you to what sort of data
structure it refers. The rest of the name tells you the particular
-value to which it refers. Most often, it consists of a single
-I<identifier>, that is, a string beginning with a letter or underscore,
-and containing letters, underscores, and digits. In some cases, it
-may be a chain of identifiers, separated by C<::> (or by C<'>, but
-that's deprecated); all but the last are interpreted as names of
-packages, to locate the namespace in which to look
-up the final identifier (see L<perlmod/Packages> for details).
-It's possible to substitute for a simple identifier an expression
-that produces a reference to the value at runtime; this is
-described in more detail below, and in L<perlref>.
-
-There are also special variables whose names don't follow these
-rules, so that they don't accidentally collide with one of your
-normal variables. Strings that match parenthesized parts of a
-regular expression are saved under names containing only digits after
-the C<$> (see L<perlop> and L<perlre>). In addition, several special
-variables that provide windows into the inner working of Perl have names
-containing punctuation characters (see L<perlvar>).
-
-Scalar values are always named with '$', even when referring to a scalar
-that is part of an array. It works like the English word "the". Thus
-we have:
+value to which it refers. Usually this name is a single I<identifier>,
+that is, a string beginning with a letter or underscore, and
+containing letters, underscores, and digits. In some cases, it may
+be a chain of identifiers, separated by C<::> (or by the slightly
+archaic C<'>); all but the last are interpreted as names of packages,
+to locate the namespace in which to look up the final identifier
+(see L<perlmod/Packages> for details). It's possible to substitute
+for a simple identifier, an expression that produces a reference
+to the value at runtime. This is described in more detail below
+and in L<perlref>.
+
+Perl also has its own built-in variables whose names don't follow
+these rules. They have strange names so they don't accidentally
+collide with one of your normal variables. Strings that match
+parenthesized parts of a regular expression are saved under names
+containing only digits after the C<$> (see L<perlop> and L<perlre>).
+In addition, several special variables that provide windows into
+the inner working of Perl have names containing punctuation characters
+and control characters. These are documented in L<perlvar>.
+
+Scalar values are always named with '$', even when referring to a
+scalar that is part of an array or a hash. The '$' symbol works
+semantically like the English word "the" in that it indicates a
+single value is expected.
$days # the simple scalar value "days"
$days[28] # the 29th element of array @days
$days{'Feb'} # the 'Feb' value from hash %days
$#days # the last index of array @days
-but entire arrays or array slices are denoted by '@', which works much like
-the word "these" or "those":
+Entire arrays (and slices of arrays and hashes) are denoted by '@',
+which works much like the word "these" or "those" does in English,
+in that it indicates multiple values are expected.
@days # ($days[0], $days[1],... $days[n])
- @days[3,4,5] # same as @days[3..5]
+ @days[3,4,5] # same as ($days[3],$days[4],$days[5])
@days{'a','c'} # same as ($days{'a'},$days{'c'})
-and entire hashes are denoted by '%':
+Entire hashes are denoted by '%':
%days # (key1, val1, key2, val2 ...)
-In addition, subroutines are named with an initial '&', though this is
-optional when it's otherwise unambiguous (just as "do" is often
-redundant in English). Symbol table entries can be named with an
-initial '*', but you don't really care about that yet.
-
-Every variable type has its own namespace. You can, without fear of
-conflict, use the same name for a scalar variable, an array, or a hash
-(or, for that matter, a filehandle, a subroutine name, or a label).
-This means that $foo and @foo are two different variables. It also
-means that C<$foo[1]> is a part of @foo, not a part of $foo. This may
-seem a bit weird, but that's okay, because it is weird.
-
-Because variable and array references always start with '$', '@', or '%',
-the "reserved" words aren't in fact reserved with respect to variable
-names. (They ARE reserved with respect to labels and filehandles,
-however, which don't have an initial special character. You can't have
-a filehandle named "log", for instance. Hint: you could say
-C<open(LOG,'logfile')> rather than C<open(log,'logfile')>. Using uppercase
-filehandles also improves readability and protects you from conflict
-with future reserved words.) Case I<IS> significant--"FOO", "Foo", and
-"foo" are all different names. Names that start with a letter or
-underscore may also contain digits and underscores.
+In addition, subroutines are named with an initial '&', though this
+is optional when unambiguous, just as the word "do" is often redundant
+in English. Symbol table entries can be named with an initial '*',
+but you don't really care about that yet (if ever :-).
+
+Every variable type has its own namespace, as do several
+non-variable identifiers. This means that you can, without fear
+of conflict, use the same name for a scalar variable, an array, or
+a hash--or, for that matter, for a filehandle, a directory handle, a
+subroutine name, a format name, or a label. This means that $foo
+and @foo are two different variables. It also means that C<$foo[1]>
+is a part of @foo, not a part of $foo. This may seem a bit weird,
+but that's okay, because it is weird.
+
+Because variable references always start with '$', '@', or '%', the
+"reserved" words aren't in fact reserved with respect to variable
+names. They I<are> reserved with respect to labels and filehandles,
+however, which don't have an initial special character. You can't
+have a filehandle named "log", for instance. Hint: you could say
+C<open(LOG,'logfile')> rather than C<open(log,'logfile')>. Using
+uppercase filehandles also improves readability and protects you
+from conflict with future reserved words. Case I<is> significant--"FOO",
+"Foo", and "foo" are all different names. Names that start with a
+letter or underscore may also contain digits and underscores.
It is possible to replace such an alphanumeric name with an expression
-that returns a reference to an object of that type. For a description
+that returns a reference to the appropriate type. For a description
of this, see L<perlref>.
Names that start with a digit may contain only more digits. Names
@@ -90,89 +96,108 @@ current process id.)
The interpretation of operations and values in Perl sometimes depends
on the requirements of the context around the operation or value.
-There are two major contexts: scalar and list. Certain operations
+There are two major contexts: list and scalar. Certain operations
return list values in contexts wanting a list, and scalar values
-otherwise. (If this is true of an operation it will be mentioned in
-the documentation for that operation.) In other words, Perl overloads
+otherwise. If this is true of an operation it will be mentioned in
+the documentation for that operation. In other words, Perl overloads
certain operations based on whether the expected return value is
-singular or plural. (Some words in English work this way, like "fish"
-and "sheep".)
+singular or plural. Some words in English work this way, like "fish"
+and "sheep".
In a reciprocal fashion, an operation provides either a scalar or a
list context to each of its arguments. For example, if you say
int( <STDIN> )
-the integer operation provides a scalar context for the E<lt>STDINE<gt>
+the integer operation provides scalar context for the <>
operator, which responds by reading one line from STDIN and passing it
back to the integer operation, which will then find the integer value
of that line and return that. If, on the other hand, you say
sort( <STDIN> )
-then the sort operation provides a list context for E<lt>STDINE<gt>, which
+then the sort operation provides list context for <>, which
will proceed to read every line available up to the end of file, and
pass that list of lines back to the sort routine, which will then
sort those lines and return them as a list to whatever the context
of the sort was.
-Assignment is a little bit special in that it uses its left argument to
-determine the context for the right argument. Assignment to a scalar
-evaluates the righthand side in a scalar context, while assignment to
-an array or array slice evaluates the righthand side in a list
-context. Assignment to a list also evaluates the righthand side in a
-list context.
-
-User defined subroutines may choose to care whether they are being
-called in a scalar or list context, but most subroutines do not
-need to care, because scalars are automatically interpolated into
-lists. See L<perlfunc/wantarray>.
+Assignment is a little bit special in that it uses its left argument
+to determine the context for the right argument. Assignment to a
+scalar evaluates the right-hand side in scalar context, while
+assignment to an array or hash evaluates the righthand side in list
+context. Assignment to a list (or slice, which is just a list
+anyway) also evaluates the righthand side in list context.
+
+When you use the C<use warnings> pragma or Perl's B<-w> command-line
+option, you may see warnings
+about useless uses of constants or functions in "void context".
+Void context just means the value has been discarded, such as a
+statement containing only C<"fred";> or C<getpwuid(0);>. It still
+counts as scalar context for functions that care whether or not
+they're being called in list context.
+
+User-defined subroutines may choose to care whether they are being
+called in a void, scalar, or list context. Most subroutines do not
+need to bother, though. That's because both scalars and lists are
+automatically interpolated into lists. See L<perlfunc/wantarray>
+for how you would dynamically discern your function's calling
+context.
=head2 Scalar values
-All data in Perl is a scalar or an array of scalars or a hash of scalars.
-Scalar variables may contain various kinds of singular data, such as
-numbers, strings, and references. In general, conversion from one form to
-another is transparent. (A scalar may not contain multiple values, but
-may contain a reference to an array or hash containing multiple values.)
-Because of the automatic conversion of scalars, operations, and functions
-that return scalars don't need to care (and, in fact, can't care) whether
-the context is looking for a string or a number.
-
-Scalars aren't necessarily one thing or another. There's no place to
-declare a scalar variable to be of type "string", or of type "number", or
-type "filehandle", or anything else. Perl is a contextually polymorphic
-language whose scalars can be strings, numbers, or references (which
-includes objects). While strings and numbers are considered pretty
-much the same thing for nearly all purposes, references are strongly-typed
-uncastable pointers with builtin reference-counting and destructor
-invocation.
+All data in Perl is a scalar, an array of scalars, or a hash of
+scalars. A scalar may contain one single value in any of three
+different flavors: a number, a string, or a reference. In general,
+conversion from one form to another is transparent. Although a
+scalar may not directly hold multiple values, it may contain a
+reference to an array or hash which in turn contains multiple values.
+
+Scalars aren't necessarily one thing or another. There's no place
+to declare a scalar variable to be of type "string", type "number",
+type "reference", or anything else. Because of the automatic
+conversion of scalars, operations that return scalars don't need
+to care (and in fact, cannot care) whether their caller is looking
+for a string, a number, or a reference. Perl is a contextually
+polymorphic language whose scalars can be strings, numbers, or
+references (which includes objects). Although strings and numbers
+are considered pretty much the same thing for nearly all purposes,
+references are strongly-typed, uncastable pointers with builtin
+reference-counting and destructor invocation.
A scalar value is interpreted as TRUE in the Boolean sense if it is not
the null string or the number 0 (or its string equivalent, "0"). The
-Boolean context is just a special kind of scalar context.
-
-There are actually two varieties of null scalars: defined and
-undefined. Undefined null scalars are returned when there is no real
-value for something, such as when there was an error, or at end of
-file, or when you refer to an uninitialized variable or element of an
-array. An undefined null scalar may become defined the first time you
-use it as if it were defined, but prior to that you can use the
-defined() operator to determine whether the value is defined or not.
-
-To find out whether a given string is a valid nonzero number, it's usually
-enough to test it against both numeric 0 and also lexical "0" (although
-this will cause B<-w> noises). That's because strings that aren't
-numbers count as 0, just as they do in B<awk>:
+Boolean context is just a special kind of scalar context where no
+conversion to a string or a number is ever performed.
+
+There are actually two varieties of null strings (sometimes referred
+to as "empty" strings), a defined one and an undefined one. The
+defined version is just a string of length zero, such as C<"">.
+The undefined version is the value that indicates that there is
+no real value for something, such as when there was an error, or
+at end of file, or when you refer to an uninitialized variable or
+element of an array or hash. Although in early versions of Perl,
+an undefined scalar could become defined when first used in a
+place expecting a defined value, this no longer happens except for
+rare cases of autovivification as explained in L<perlref>. You can
+use the defined() operator to determine whether a scalar value is
+defined (this has no meaning on arrays or hashes), and the undef()
+operator to produce an undefined value.
+
+To find out whether a given string is a valid non-zero number, it's
+sometimes enough to test it against both numeric 0 and also lexical
+"0" (although this will cause B<-w> noises). That's because strings
+that aren't numbers count as 0, just as they do in B<awk>:
if ($str == 0 && $str ne "0") {
warn "That doesn't look like a number";
}
-That's usually preferable because otherwise you won't treat IEEE notations
-like C<NaN> or C<Infinity> properly. At other times you might prefer to
-use the POSIX::strtod function or a regular expression to check whether
-data is numeric. See L<perlre> for details on regular expressions.
+That method may be best because otherwise you won't treat IEEE
+notations like C<NaN> or C<Infinity> properly. At other times, you
+might prefer to determine whether string data can be used numerically
+by calling the POSIX::strtod() function or by inspecting your string
+with a regular expression (as documented in L<perlre>).
warn "has nondigits" if /\D/;
warn "not a natural number" unless /^\d+$/; # rejects -3
@@ -183,27 +208,30 @@ data is numeric. See L<perlre> for details on regular expressions.
warn "not a C float"
unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
-The length of an array is a scalar value. You may find the length of
-array @days by evaluating C<$#days>, as in B<csh>. (Actually, it's not
-the length of the array, it's the subscript of the last element, because
-there is (ordinarily) a 0th element.) Assigning to C<$#days> changes the
-length of the array. Shortening an array by this method destroys
-intervening values. Lengthening an array that was previously shortened
-I<NO LONGER> recovers the values that were in those elements. (It used to
-in Perl 4, but we had to break this to make sure destructors were
-called when expected.) You can also gain some miniscule measure of efficiency by
-pre-extending an array that is going to get big. (You can also extend
-an array by assigning to an element that is off the end of the array.)
-You can truncate an array down to nothing by assigning the null list ()
-to it. The following are equivalent:
+The length of an array is a scalar value. You may find the length
+of array @days by evaluating C<$#days>, as in B<csh>. Technically
+speaking, this isn't the length of the array; it's the subscript
+of the last element, since there is ordinarily a 0th element.
+Assigning to C<$#days> actually changes the length of the array.
+Shortening an array this way destroys intervening values. Lengthening
+an array that was previously shortened does not recover values
+that were in those elements. (It used to do so in Perl 4, but we
+had to break this to make sure destructors were called when expected.)
+
+You can also gain some miniscule measure of efficiency by pre-extending
+an array that is going to get big. You can also extend an array
+by assigning to an element that is off the end of the array. You
+can truncate an array down to nothing by assigning the null list
+() to it. The following are equivalent:
@whatever = ();
$#whatever = -1;
-If you evaluate a named array in a scalar context, it returns the length of
-the array. (Note that this is not true of lists, which return the
-last value, like the C comma operator, nor of built-in functions, which return
-whatever they feel like returning.) The following is always true:
+If you evaluate an array in scalar context, it returns the length
+of the array. (Note that this is not true of lists, which return
+the last value, like the C comma operator, nor of built-in functions,
+which return whatever they feel like returning.) The following is
+always true:
scalar(@whatever) == $#whatever - $[ + 1;
@@ -214,21 +242,21 @@ So in general you can assume that
scalar(@whatever) == $#whatever + 1;
-Some programmers choose to use an explicit conversion so nothing's
-left to doubt:
+Some programmers choose to use an explicit conversion so as to
+leave nothing to doubt:
$element_count = scalar(@whatever);
-If you evaluate a hash in a scalar context, it returns a value that is
-true if and only if the hash contains any key/value pairs. (If there
-are any key/value pairs, the value returned is a string consisting of
-the number of used buckets and the number of allocated buckets, separated
-by a slash. This is pretty much useful only to find out whether Perl's
-(compiled in) hashing algorithm is performing poorly on your data set.
-For example, you stick 10,000 things in a hash, but evaluating %HASH in
-scalar context reveals "1/16", which means only one out of sixteen buckets
-has been touched, and presumably contains all 10,000 of your items. This
-isn't supposed to happen.)
+If you evaluate a hash in scalar context, it returns false if the
+hash is empty. If there are any key/value pairs, it returns true;
+more precisely, the value returned is a string consisting of the
+number of used buckets and the number of allocated buckets, separated
+by a slash. This is pretty much useful only to find out whether
+Perl's internal hashing algorithm is performing poorly on your data
+set. For example, you stick 10,000 things in a hash, but evaluating
+%HASH in scalar context reveals C<"1/16">, which means only one out
+of sixteen buckets has been touched, and presumably contains all
+10,000 of your items. This isn't supposed to happen.
You can preallocate space for a hash by assigning to the keys() function.
This rounds up the allocated bucked to the next power of two:
@@ -237,35 +265,36 @@ This rounds up the allocated bucked to the next power of two:
=head2 Scalar value constructors
-Numeric literals are specified in any of the customary floating point or
+Numeric literals are specified in any of the following floating point or
integer formats:
12345
12345.67
- .23E-10
- 0xffff # hex
- 0377 # octal
- 4_294_967_296 # underline for legibility
+ .23E-10 # a very small number
+ 4_294_967_296 # underline for legibility
+ 0xff # hex
+ 0377 # octal
+ 0b011011 # binary
String literals are usually delimited by either single or double
-quotes. They work much like shell quotes: double-quoted string
-literals are subject to backslash and variable substitution;
-single-quoted strings are not (except for "C<\'>" and "C<\\>").
-The usual Unix backslash rules apply for making characters such as
-newline, tab, etc., as well as some more exotic forms. See
-L<perlop/"Quote and Quotelike Operators"> for a list.
-
-Octal or hex representations in string literals (e.g. '0xffff') are not
-automatically converted to their integer representation. The hex() and
-oct() functions make these conversions for you. See L<perlfunc/hex> and
-L<perlfunc/oct> for more details.
+quotes. They work much like quotes in the standard Unix shells:
+double-quoted string literals are subject to backslash and variable
+substitution; single-quoted strings are not (except for C<\'> and
+C<\\>). The usual C-style backslash rules apply for making
+characters such as newline, tab, etc., as well as some more exotic
+forms. See L<perlop/"Quote and Quote-like Operators"> for a list.
+
+Hexadecimal, octal, or binary, representations in string literals
+(e.g. '0xff') are not automatically converted to their integer
+representation. The hex() and oct() functions make these conversions
+for you. See L<perlfunc/hex> and L<perlfunc/oct> for more details.
You can also embed newlines directly in your strings, i.e., they can end
on a different line than they begin. This is nice, but if you forget
your trailing quote, the error will not be reported until Perl finds
another line containing the quote character, which may be much further
on in the script. Variable substitution inside strings is limited to
-scalar variables, arrays, and array slices. (In other words,
+scalar variables, arrays, and array or hash slices. (In other words,
names beginning with $ or @, followed by an optional bracketed
expression as a subscript.) The following code segment prints out "The
price is $Z<>100."
@@ -273,47 +302,78 @@ price is $Z<>100."
$Price = '$100'; # not interpreted
print "The price is $Price.\n"; # interpreted
-As in some shells, you can put curly brackets around the name to
-delimit it from following alphanumerics. In fact, an identifier
-within such curlies is forced to be a string, as is any single
-identifier within a hash subscript. Our earlier example,
-
- $days{'Feb'}
-
-can be written as
-
- $days{Feb}
-
-and the quotes will be assumed automatically. But anything more complicated
-in the subscript will be interpreted as an expression.
-
-Note that a
-single-quoted string must be separated from a preceding word by a
-space, because single quote is a valid (though deprecated) character in
-a variable name (see L<perlmod/Packages>).
-
-Three special literals are __FILE__, __LINE__, and __PACKAGE__, which
+As in some shells, you can enclose the variable name in braces to
+disambiguate it from following alphanumerics. You must also do
+this when interpolating a variable into a string to separate the
+variable name from a following double-colon or an apostrophe, since
+these would be otherwise treated as a package separator:
+
+ $who = "Larry";
+ print PASSWD "${who}::0:0:Superuser:/:/bin/perl\n";
+ print "We use ${who}speak when ${who}'s here.\n";
+
+Without the braces, Perl would have looked for a $whospeak, a
+C<$who::0>, and a C<$who's> variable. The last two would be the
+$0 and the $s variables in the (presumably) non-existent package
+C<who>.
+
+In fact, an identifier within such curlies is forced to be a string,
+as is any simple identifier within a hash subscript. Neither need
+quoting. Our earlier example, C<$days{'Feb'}> can be written as
+C<$days{Feb}> and the quotes will be assumed automatically. But
+anything more complicated in the subscript will be interpreted as
+an expression.
+
+A literal of the form C<v1.20.300.4000> is parsed as a string composed
+of characters with the specified ordinals. This provides an alternative,
+more readable way to construct strings, rather than use the somewhat less
+readable interpolation form C<"\x{1}\x{14}\x{12c}\x{fa0}">. This is useful
+for representing Unicode strings, and for comparing version "numbers"
+using the string comparison operators, C<cmp>, C<gt>, C<lt> etc.
+If there are two or more dots in the literal, the leading C<v> may be
+omitted.
+
+ print v9786; # prints UTF-8 encoded SMILEY, "\x{263a}"
+ print v102.111.111; # prints "foo"
+ print 102.111.111; # same
+
+Such literals are accepted by both C<require> and C<use> for
+doing a version check. The C<$^V> special variable also contains the
+running Perl interpreter's version in this form. See L<perlvar/$^V>.
+
+The special literals __FILE__, __LINE__, and __PACKAGE__
represent the current filename, line number, and package name at that
point in your program. They may be used only as separate tokens; they
will not be interpolated into strings. If there is no current package
-(due to an empty C<package;> directive), __PACKAGE__ is the undefined value.
-
-The tokens __END__ and __DATA__ may be used to indicate the logical end
-of the script before the actual end of file. Any following text is
-ignored, but may be read via a DATA filehandle: main::DATA for __END__,
-or PACKNAME::DATA (where PACKNAME is the current package) for __DATA__.
-The two control characters ^D and ^Z are synonyms for __END__ (or
-__DATA__ in a module). See L<SelfLoader> for more description of
-__DATA__, and an example of its use. Note that you cannot read from the
-DATA filehandle in a BEGIN block: the BEGIN block is executed as soon as
-it is seen (during compilation), at which point the corresponding
+(due to an empty C<package;> directive), __PACKAGE__ is the undefined
+value.
+
+The two control characters ^D and ^Z, and the tokens __END__ and __DATA__
+may be used to indicate the logical end of the script before the actual
+end of file. Any following text is ignored.
+
+Text after __DATA__ but may be read via the filehandle C<PACKNAME::DATA>,
+where C<PACKNAME> is the package that was current when the __DATA__
+token was encountered. The filehandle is left open pointing to the
+contents after __DATA__. It is the program's responsibility to
+C<close DATA> when it is done reading from it. For compatibility with
+older scripts written before __DATA__ was introduced, __END__ behaves
+like __DATA__ in the toplevel script (but not in files loaded with
+C<require> or C<do>) and leaves the remaining contents of the
+file accessible via C<main::DATA>.
+
+See L<SelfLoader> for more description of __DATA__, and
+an example of its use. Note that you cannot read from the DATA
+filehandle in a BEGIN block: the BEGIN block is executed as soon
+as it is seen (during compilation), at which point the corresponding
__DATA__ (or __END__) token has not yet been seen.
A word that has no other interpretation in the grammar will
be treated as if it were a quoted string. These are known as
"barewords". As with filehandles and labels, a bareword that consists
entirely of lowercase letters risks conflict with future reserved
-words, and if you use the B<-w> switch, Perl will warn you about any
+words, and if you use the C<use warnings> pragma or the B<-w> switch,
+Perl will warn you about any
such words. Some people may wish to outlaw barewords entirely. If you
say
@@ -324,34 +384,34 @@ produces a compile-time error instead. The restriction lasts to the
end of the enclosing block. An inner block may countermand this
by saying C<no strict 'subs'>.
-Array variables are interpolated into double-quoted strings by joining all
-the elements of the array with the delimiter specified in the C<$">
-variable (C<$LIST_SEPARATOR> in English), space by default. The following
-are equivalent:
+Arrays and slices are interpolated into double-quoted strings
+by joining the elements with the delimiter specified in the C<$">
+variable (C<$LIST_SEPARATOR> in English), space by default. The
+following are equivalent:
- $temp = join($",@ARGV);
+ $temp = join($", @ARGV);
system "echo $temp";
system "echo @ARGV";
Within search patterns (which also undergo double-quotish substitution)
-there is a bad ambiguity: Is C</$foo[bar]/> to be interpreted as
+there is an unfortunate ambiguity: Is C</$foo[bar]/> to be interpreted as
C</${foo}[bar]/> (where C<[bar]> is a character class for the regular
expression) or as C</${foo[bar]}/> (where C<[bar]> is the subscript to array
@foo)? If @foo doesn't otherwise exist, then it's obviously a
character class. If @foo exists, Perl takes a good guess about C<[bar]>,
and is almost always right. If it does guess wrong, or if you're just
plain paranoid, you can force the correct interpretation with curly
-brackets as above.
+braces as above.
-A line-oriented form of quoting is based on the shell "here-doc"
-syntax. Following a C<E<lt>E<lt>> you specify a string to terminate
+A line-oriented form of quoting is based on the shell "here-document"
+syntax. Following a C<< << >> you specify a string to terminate
the quoted material, and all lines following the current line down to
the terminating string are the value of the item. The terminating
string may be either an identifier (a word), or some quoted text. If
quoted, the type of quotes you use determines the treatment of the
text, just as in regular quoting. An unquoted identifier works like
-double quotes. There must be no space between the C<E<lt>E<lt>> and
+double quotes. There must be no space between the C<< << >> and
the identifier. (If you put a space it will be treated as a null
identifier, which is valid, and matches the first empty line.) The
terminating string must appear by itself (unquoted and with no
@@ -392,6 +452,14 @@ try to do this:
ABC
+ 20;
+If you want your here-docs to be indented with the
+rest of the code, you'll need to remove leading whitespace
+from each line manually:
+
+ ($quote = <<'FINIS') =~ s/^\s+//gm;
+ The Road goes ever on and on,
+ down from the door where it began.
+ FINIS
=head2 List value constructors
@@ -400,19 +468,19 @@ List values are denoted by separating individual values by commas
(LIST)
-In a context not requiring a list value, the value of the list
-literal is the value of the final element, as with the C comma operator.
-For example,
+In a context not requiring a list value, the value of what appears
+to be a list literal is simply the value of the final element, as
+with the C comma operator. For example,
@foo = ('cc', '-E', $bar);
-assigns the entire list value to array foo, but
+assigns the entire list value to array @foo, but
$foo = ('cc', '-E', $bar);
-assigns the value of variable bar to variable foo. Note that the value
-of an actual array in a scalar context is the length of the array; the
-following assigns the value 3 to $foo:
+assigns the value of variable $bar to the scalar variable $foo.
+Note that the value of an actual array in scalar context is the
+length of the array; the following assigns the value 3 to $foo:
@foo = ('cc', '-E', $bar);
$foo = @foo; # $foo gets 3
@@ -426,8 +494,19 @@ list literal, so that you can say:
3,
);
+To use a here-document to assign an array, one line per element,
+you might use an approach like this:
+
+ @sauces = <<End_Lines =~ m/(\S.*\S)/g;
+ normal tomato
+ spicy tomato
+ green chile
+ pesto
+ white wine
+ End_Lines
+
LISTs do automatic interpolation of sublists. That is, when a LIST is
-evaluated, each element of the list is evaluated in a list context, and
+evaluated, each element of the list is evaluated in list context, and
the resulting list value is interpolated into LIST just as if each
individual element were a member of LIST. Thus arrays and hashes lose their
identity in a LIST--the list
@@ -436,7 +515,7 @@ identity in a LIST--the list
contains all the elements of @foo followed by all the elements of @bar,
followed by all the elements returned by the subroutine named SomeSub
-called in a list context, followed by the key/value pairs of %glarch.
+called in list context, followed by the key/value pairs of %glarch.
To make a list reference that does I<NOT> interpolate, see L<perlref>.
The null list is represented by (). Interpolating it in a list
@@ -459,25 +538,26 @@ put the list in parentheses to avoid ambiguity. For example:
# A "reverse comma operator".
return (pop(@foo),pop(@foo))[0];
-You may assign to C<undef> in a list. This is useful for throwing
-away some of the return values of a function:
-
- ($dev, $ino, undef, undef, $uid, $gid) = stat($file);
-
-Lists may be assigned to if and only if each element of the list
-is legal to assign to:
+Lists may be assigned to only when each element of the list
+is itself legal to assign to:
($a, $b, $c) = (1, 2, 3);
($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00);
-List assignment in a scalar context returns the number of elements
+An exception to this is that you may assign to C<undef> in a list.
+This is useful for throwing away some of the return values of a
+function:
+
+ ($dev, $ino, undef, undef, $uid, $gid) = stat($file);
+
+List assignment in scalar context returns the number of elements
produced by the expression on the right side of the assignment:
$x = (($foo,$bar) = (3,2,1)); # set $x to 3, not 2
$x = (($foo,$bar) = f()); # set $x to f()'s return count
-This is very handy when you want to do a list assignment in a Boolean
+This is handy when you want to do a list assignment in a Boolean
context, because most list functions return a null list when finished,
which when assigned produces a 0, which is interpreted as FALSE.
@@ -487,24 +567,24 @@ The final element may be an array or a hash:
my($a, $b, %rest) = @_;
You can actually put an array or hash anywhere in the list, but the first one
-in the list will soak up all the values, and anything after it will get
-a null value. This may be useful in a local() or my().
+in the list will soak up all the values, and anything after it will become
+undefined. This may be useful in a my() or local().
-A hash literal contains pairs of values to be interpreted
-as a key and a value:
+A hash can be initialized using a literal list holding pairs of
+items to be interpreted as a key and a value:
# same as map assignment above
%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);
-While literal lists and named arrays are usually interchangeable, that's
+While literal lists and named arrays are often interchangeable, that's
not the case for hashes. Just because you can subscript a list value like
a normal array does not mean that you can subscript a list value as a
hash. Likewise, hashes included as parts of other lists (including
parameters lists and return lists from functions) always flatten out into
key/value pairs. That's why it's good to use references sometimes.
-It is often more readable to use the C<=E<gt>> operator between key/value
-pairs. The C<=E<gt>> operator is mostly just a more visually distinctive
+It is often more readable to use the C<< => >> operator between key/value
+pairs. The C<< => >> operator is mostly just a more visually distinctive
synonym for a comma, but it also arranges for its left-hand operand to be
interpreted as a string--if it's a bareword that would be a legal identifier.
This makes it nice for initializing hashes:
@@ -537,6 +617,82 @@ Note that just because a hash is initialized in that order doesn't
mean that it comes out in that order. See L<perlfunc/sort> for examples
of how to arrange for an output ordering.
+=head2 Slices
+
+A common way to access an array or a hash is one scalar element at a
+time. You can also subscript a list to get a single element from it.
+
+ $whoami = $ENV{"USER"}; # one element from the hash
+ $parent = $ISA[0]; # one element from the array
+ $dir = (getpwnam("daemon"))[7]; # likewise, but with list
+
+A slice accesses several elements of a list, an array, or a hash
+simultaneously using a list of subscripts. It's more convenient
+than writing out the individual elements as a list of separate
+scalar values.
+
+ ($him, $her) = @folks[0,-1]; # array slice
+ @them = @folks[0 .. 3]; # array slice
+ ($who, $home) = @ENV{"USER", "HOME"}; # hash slice
+ ($uid, $dir) = (getpwnam("daemon"))[2,7]; # list slice
+
+Since you can assign to a list of variables, you can also assign to
+an array or hash slice.
+
+ @days[3..5] = qw/Wed Thu Fri/;
+ @colors{'red','blue','green'}
+ = (0xff0000, 0x0000ff, 0x00ff00);
+ @folks[0, -1] = @folks[-1, 0];
+
+The previous assignments are exactly equivalent to
+
+ ($days[3], $days[4], $days[5]) = qw/Wed Thu Fri/;
+ ($colors{'red'}, $colors{'blue'}, $colors{'green'})
+ = (0xff0000, 0x0000ff, 0x00ff00);
+ ($folks[0], $folks[-1]) = ($folks[0], $folks[-1]);
+
+Since changing a slice changes the original array or hash that it's
+slicing, a C<foreach> construct will alter some--or even all--of the
+values of the array or hash.
+
+ foreach (@array[ 4 .. 10 ]) { s/peter/paul/ }
+
+ foreach (@hash{keys %hash}) {
+ s/^\s+//; # trim leading whitespace
+ s/\s+$//; # trim trailing whitespace
+ s/(\w+)/\u\L$1/g; # "titlecase" words
+ }
+
+A slice of an empty list is still an empty list. Thus:
+
+ @a = ()[1,0]; # @a has no elements
+ @b = (@a)[0,1]; # @b has no elements
+ @c = (0,1)[2,3]; # @c has no elements
+
+But:
+
+ @a = (1)[1,0]; # @a has two elements
+ @b = (1,undef)[1,0,2]; # @b has three elements
+
+This makes it easy to write loops that terminate when a null list
+is returned:
+
+ while ( ($home, $user) = (getpwent)[7,0]) {
+ printf "%-8s %s\n", $user, $home;
+ }
+
+As noted earlier in this document, the scalar sense of list assignment
+is the number of elements on the right-hand side of the assignment.
+The null list contains no elements, so when the password file is
+exhausted, the result is 0, not 2.
+
+If you're confused about why you use an '@' there on a hash slice
+instead of a '%', think of it like this. The type of bracket (square
+or curly) governs whether it's an array or a hash being looked at.
+On the other hand, the leading symbol ('$' or '@') on the array or
+hash indicates whether you are getting back a singular value (a
+scalar) or a plural one (a list).
+
=head2 Typeglobs and Filehandles
Perl uses an internal type called a I<typeglob> to hold an entire
@@ -562,7 +718,7 @@ make @Here::blue an alias for @There::green, or %Here::blue an alias for
of this. Strange though this may seem, this is the basis for the whole
module import/export system.
-Another use for typeglobs is to to pass filehandles into a function or
+Another use for typeglobs is to pass filehandles into a function or
to create new filehandles. If you need to use a typeglob to save away
a filehandle, do it this way:
@@ -581,23 +737,50 @@ For example:
sub newopen {
my $path = shift;
- local *FH; # not my!
+ local *FH; # not my!
open (FH, $path) or return undef;
return *FH;
}
$fh = newopen('/etc/passwd');
-Now that we have the *foo{THING} notation, typeglobs aren't used as much
+Now that we have the C<*foo{THING}> notation, typeglobs aren't used as much
for filehandle manipulations, although they're still needed to pass brand
new file and directory handles into or out of functions. That's because
-*HANDLE{IO} only works if HANDLE has already been used as a handle.
-In other words, *FH can be used to create new symbol table entries,
-but *foo{THING} cannot.
+C<*HANDLE{IO}> only works if HANDLE has already been used as a handle.
+In other words, C<*FH> must be used to create new symbol table entries;
+C<*foo{THING}> cannot. When in doubt, use C<*FH>.
+
+All functions that are capable of creating filehandles (open(),
+opendir(), pipe(), socketpair(), sysopen(), socket(), and accept())
+automatically create an anonymous filehandle if the handle passed to
+them is an uninitialized scalar variable. This allows the constructs
+such as C<open(my $fh, ...)> and C<open(local $fh,...)> to be used to
+create filehandles that will conveniently be closed automatically when
+the scope ends, provided there are no other references to them. This
+largely eliminates the need for typeglobs when opening filehandles
+that must be passed around, as in the following example:
+
+ sub myopen {
+ open my $fh, "@_"
+ or die "Can't open '@_': $!";
+ return $fh;
+ }
+
+ {
+ my $f = myopen("</etc/motd");
+ print <$f>;
+ # $f implicitly closed here
+ }
+
+Another way to create anonymous filehandles is with the Symbol
+module or with the IO::Handle module and its ilk. These modules
+have the advantage of not hiding different types of the same name
+during the local(). See the bottom of L<perlfunc/open()> for an
+example.
-Another way to create anonymous filehandles is with the IO::Handle
-module and its ilk. These modules have the advantage of not hiding
-different types of the same name during the local(). See the bottom of
-L<perlfunc/open()> for an example.
+=head1 SEE ALSO
-See L<perlref>, L<perlsub>, and L<perlmod/"Symbol Tables"> for more
-discussion on typeglobs and the *foo{THING} syntax.
+See L<perlvar> for a description of Perl's built-in variables and
+a discussion of legal variable names. See L<perlref>, L<perlsub>,
+and L<perlmod/"Symbol Tables"> for more discussion on typeglobs and
+the C<*foo{THING}> syntax.
diff --git a/contrib/perl5/pod/perldbmfilter.pod b/contrib/perl5/pod/perldbmfilter.pod
new file mode 100644
index 0000000..3350596
--- /dev/null
+++ b/contrib/perl5/pod/perldbmfilter.pod
@@ -0,0 +1,168 @@
+=head1 NAME
+
+perldbmfilter - Perl DBM Filters
+
+=head1 SYNOPSIS
+
+ $db = tie %hash, 'DBM', ...
+
+ $old_filter = $db->filter_store_key ( sub { ... } ) ;
+ $old_filter = $db->filter_store_value( sub { ... } ) ;
+ $old_filter = $db->filter_fetch_key ( sub { ... } ) ;
+ $old_filter = $db->filter_fetch_value( sub { ... } ) ;
+
+=head1 DESCRIPTION
+
+The four C<filter_*> methods shown above are available in all the DBM
+modules that ship with Perl, namely DB_File, GDBM_File, NDBM_File,
+ODBM_File and SDBM_File.
+
+Each of the methods work identically, and are used to install (or
+uninstall) a single DBM Filter. The only difference between them is the
+place that the filter is installed.
+
+To summarise:
+
+=over 5
+
+=item B<filter_store_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a key to a DBM database.
+
+=item B<filter_store_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you write a value to a DBM database.
+
+
+=item B<filter_fetch_key>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a key from a DBM database.
+
+=item B<filter_fetch_value>
+
+If a filter has been installed with this method, it will be invoked
+every time you read a value from a DBM database.
+
+=back
+
+You can use any combination of the methods from none to all four.
+
+All filter methods return the existing filter, if present, or C<undef>
+in not.
+
+To delete a filter pass C<undef> to it.
+
+=head2 The Filter
+
+When each filter is called by Perl, a local copy of C<$_> will contain
+the key or value to be filtered. Filtering is achieved by modifying
+the contents of C<$_>. The return code from the filter is ignored.
+
+=head2 An Example -- the NULL termination problem.
+
+DBM Filters are useful for a class of problems where you I<always>
+want to make the same transformation to all keys, all values or both.
+
+For example, consider the following scenario. You have a DBM database
+that you need to share with a third-party C application. The C application
+assumes that I<all> keys and values are NULL terminated. Unfortunately
+when Perl writes to DBM databases it doesn't use NULL termination, so
+your Perl application will have to manage NULL termination itself. When
+you write to the database you will have to use something like this:
+
+ $hash{"$key\0"} = "$value\0" ;
+
+Similarly the NULL needs to be taken into account when you are considering
+the length of existing keys/values.
+
+It would be much better if you could ignore the NULL terminations issue
+in the main application code and have a mechanism that automatically
+added the terminating NULL to all keys and values whenever you write to
+the database and have them removed when you read from the database. As I'm
+sure you have already guessed, this is a problem that DBM Filters can
+fix very easily.
+
+ use strict ;
+ use warnings ;
+ use SDBM_File ;
+ use Fcntl ;
+
+ my %hash ;
+ my $filename = "/tmp/filt" ;
+ unlink $filename ;
+
+ my $db = tie(%hash, 'SDBM_File', $filename, O_RDWR|O_CREAT, 0640)
+ or die "Cannot open $filename: $!\n" ;
+
+ # Install DBM Filters
+ $db->filter_fetch_key ( sub { s/\0$// } ) ;
+ $db->filter_store_key ( sub { $_ .= "\0" } ) ;
+ $db->filter_fetch_value(
+ sub { no warnings 'uninitialized' ;s/\0$// } ) ;
+ $db->filter_store_value( sub { $_ .= "\0" } ) ;
+
+ $hash{"abc"} = "def" ;
+ my $a = $hash{"ABC"} ;
+ # ...
+ undef $db ;
+ untie %hash ;
+
+The code above uses SDBM_File, but it will work with any of the DBM
+modules.
+
+Hopefully the contents of each of the filters should be
+self-explanatory. Both "fetch" filters remove the terminating NULL,
+and both "store" filters add a terminating NULL.
+
+
+=head2 Another Example -- Key is a C int.
+
+Here is another real-life example. By default, whenever Perl writes to
+a DBM database it always writes the key and value as strings. So when
+you use this:
+
+ $hash{12345} = "soemthing" ;
+
+the key 12345 will get stored in the DBM database as the 5 byte string
+"12345". If you actually want the key to be stored in the DBM database
+as a C int, you will have to use C<pack> when writing, and C<unpack>
+when reading.
+
+Here is a DBM Filter that does it:
+
+ use strict ;
+ use warnings ;
+ use DB_File ;
+ my %hash ;
+ my $filename = "/tmp/filt" ;
+ unlink $filename ;
+
+
+ my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH
+ or die "Cannot open $filename: $!\n" ;
+
+ $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ;
+ $db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ;
+ $hash{123} = "def" ;
+ # ...
+ undef $db ;
+ untie %hash ;
+
+The code above uses DB_File, but again it will work with any of the
+DBM modules.
+
+This time only two filters have been used -- we only need to manipulate
+the contents of the key, so it wasn't necessary to install any value
+filters.
+
+=head1 SEE ALSO
+
+L<DB_File>, L<GDBM_File>, L<NDBM_File>, L<ODBM_File> and L<SDBM_File>.
+
+=head1 AUTHOR
+
+Paul Marquess
+
diff --git a/contrib/perl5/pod/perldebguts.pod b/contrib/perl5/pod/perldebguts.pod
new file mode 100644
index 0000000..b74f3ef
--- /dev/null
+++ b/contrib/perl5/pod/perldebguts.pod
@@ -0,0 +1,923 @@
+=head1 NAME
+
+perldebguts - Guts of Perl debugging
+
+=head1 DESCRIPTION
+
+This is not the perldebug(1) manpage, which tells you how to use
+the debugger. This manpage describes low-level details ranging
+between difficult and impossible for anyone who isn't incredibly
+intimate with Perl's guts to understand. Caveat lector.
+
+=head1 Debugger Internals
+
+Perl has special debugging hooks at compile-time and run-time used
+to create debugging environments. These hooks are not to be confused
+with the I<perl -Dxxx> command described in L<perlrun>, which are
+usable only if a special Perl built per the instructions the
+F<INSTALL> podpage in the Perl source tree.
+
+For example, whenever you call Perl's built-in C<caller> function
+from the package DB, the arguments that the corresponding stack
+frame was called with are copied to the the @DB::args array. The
+general mechanisms is enabled by calling Perl with the B<-d> switch, the
+following additional features are enabled (cf. L<perlvar/$^P>):
+
+=over
+
+=item *
+
+Perl inserts the contents of C<$ENV{PERL5DB}> (or C<BEGIN {require
+'perl5db.pl'}> if not present) before the first line of your program.
+
+=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
+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)>.
+
+=item *
+
+The 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.
+
+The same holds 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)>.
+
+=item *
+
+The 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)>.
+
+=item *
+
+After each C<require>d file is compiled, but before it is executed,
+C<DB::postponed(*{"_<$filename"})> is called if the subroutine
+C<DB::postponed> exists. Here, the $filename is the expanded name of
+the C<require>d file, as found in the values of %INC.
+
+=item *
+
+After each subroutine C<subname> is compiled, the existence of
+C<$DB::postponed{subname}> is checked. If this key exists,
+C<DB::postponed(subname)> is called if the C<DB::postponed> subroutine
+also exists.
+
+=item *
+
+A hash C<%DB::sub> is maintained, whose keys are subroutine names
+and whose values have the form C<filename:startline-endline>.
+C<filename> has the form C<(eval 34)> for subroutines defined inside
+C<eval>s, or C<(re_eval 19)> for those within regex code assertions.
+
+=item *
+
+When the execution of your program reaches a point that can hold a
+breakpoint, the C<DB::DB()> subroutine is called any of the variables
+$DB::trace, $DB::single, or $DB::signal is true. These variables
+are not C<local>izable. This feature is disabled when executing
+inside C<DB::DB()>, including functions called from it
+unless C<< $^D & (1<<30) >> is true.
+
+=item *
+
+When execution of the program reaches a subroutine call, a call to
+C<&DB::sub>(I<args>) is made instead, with C<$DB::sub> holding the
+name of the called subroutine. This doesn't happen if the subroutine
+was compiled in the C<DB> package.)
+
+=back
+
+Note that if C<&DB::sub> needs external data for it to work, no
+subroutine call is possible until this is done. For the standard
+debugger, the C<$DB::deep> variable (how many levels of recursion
+deep into the debugger you can go before a mandatory break) gives
+an example of such a dependency.
+
+=head2 Writing Your Own Debugger
+
+The minimal working debugger consists of one line
+
+ sub DB::DB {}
+
+which is quite handy as contents of C<PERL5DB> environment
+variable:
+
+ $ PERL5DB="sub DB::DB {}" perl -d your-script
+
+Another brief debugger, slightly more useful, could be created
+with only the line:
+
+ sub DB::DB {print ++$i; scalar <STDIN>}
+
+This debugger would print the sequential number of encountered
+statement, and would wait for you to hit a newline before continuing.
+
+The following debugger is quite functional:
+
+ {
+ package DB;
+ sub DB {}
+ sub sub {print ++$i, " $sub\n"; &$sub}
+ }
+
+It prints the sequential number of subroutine call and the name of the
+called subroutine. Note that C<&DB::sub> should be compiled into the
+package C<DB>.
+
+At the start, the debugger reads your rc file (F<./.perldb> or
+F<~/.perldb> under Unix), which can set important options. This file may
+define a subroutine C<&afterinit> to be executed after the debugger is
+initialized.
+
+After the rc file is read, the debugger reads the PERLDB_OPTS
+environment variable and parses this as the remainder of a C<O ...>
+line as one might enter at the debugger prompt.
+
+The debugger also maintains magical internal variables, such as
+C<@DB::dbline>, C<%DB::dbline>, which are aliases for
+C<@{"::_<current_file"}> C<%{"::_<current_file"}>. Here C<current_file>
+is the currently selected file, either explicitly chosen with the
+debugger's C<f> command, or implicitly by flow of execution.
+
+Some functions are provided to simplify customization. See
+L<perldebug/"Options"> for description of options parsed by
+C<DB::parse_options(string)>. The function C<DB::dump_trace(skip[,
+count])> skips the specified number of frames and returns a list
+containing information about the calling frames (all of them, if
+C<count> is missing). Each entry is reference to a a hash with
+keys C<context> (either C<.>, C<$>, or C<@>), C<sub> (subroutine
+name, or info about C<eval>), C<args> (C<undef> or a reference to
+an array), C<file>, and C<line>.
+
+The function C<DB::print_trace(FH, skip[, count[, short]])> prints
+formatted info about caller frames. The last two functions may be
+convenient as arguments to C<< < >>, C<< << >> commands.
+
+Note that any variables and functions that are not documented in
+this manpages (or in L<perldebug>) are considered for internal
+use only, and as such are subject to change without notice.
+
+=head1 Frame Listing Output Examples
+
+The C<frame> option can be used to control the output of frame
+information. For example, contrast this expression trace:
+
+ $ perl -de 42
+ Stack dump during die enabled outside of evals.
+
+ Loading DB routines from perl5db.pl patch level 0.94
+ Emacs support available.
+
+ Enter h or `h h' for help.
+
+ main::(-e:1): 0
+ DB<1> sub foo { 14 }
+
+ DB<2> sub bar { 3 }
+
+ DB<3> t print foo() * bar()
+ main::((eval 172):3): print foo() + bar();
+ main::foo((eval 168):2):
+ main::bar((eval 170):2):
+ 42
+
+with this one, once the C<O>ption C<frame=2> has been set:
+
+ DB<4> O f=2
+ frame = '2'
+ DB<5> t print foo() * bar()
+ 3: foo() * bar()
+ entering main::foo
+ 2: sub foo { 14 };
+ exited main::foo
+ entering main::bar
+ 2: sub bar { 3 };
+ exited main::bar
+ 42
+
+By way of demonstration, we present below a laborious listing
+resulting from setting your C<PERLDB_OPTS> environment variable to
+the value C<f=n N>, and running I<perl -d -V> from the command line.
+Examples use various values of C<n> are shown to give you a feel
+for the difference between settings. Long those it may be, this
+is not a complete listing, but only excerpts.
+
+=over 4
+
+=item 1
+
+ entering main::BEGIN
+ entering Config::BEGIN
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ Package lib/Config.pm.
+ entering Config::TIEHASH
+ entering Exporter::import
+ entering Exporter::export
+ entering Config::myconfig
+ entering Config::FETCH
+ entering Config::FETCH
+ entering Config::FETCH
+ entering Config::FETCH
+
+=item 2
+
+ entering main::BEGIN
+ entering Config::BEGIN
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ exited Config::BEGIN
+ Package lib/Config.pm.
+ entering Config::TIEHASH
+ exited Config::TIEHASH
+ entering Exporter::import
+ entering Exporter::export
+ exited Exporter::export
+ exited Exporter::import
+ exited main::BEGIN
+ entering Config::myconfig
+ entering Config::FETCH
+ exited Config::FETCH
+ entering Config::FETCH
+ exited Config::FETCH
+ entering Config::FETCH
+
+=item 4
+
+ in $=main::BEGIN() from /dev/null:0
+ in $=Config::BEGIN() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:644
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from li
+ in @=Config::myconfig() from /dev/null:0
+ in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'osname') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'osvers') from lib/Config.pm:574
+
+=item 6
+
+ in $=main::BEGIN() from /dev/null:0
+ in $=Config::BEGIN() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ out $=Config::BEGIN() from lib/Config.pm:0
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:644
+ out $=Config::TIEHASH('Config') from lib/Config.pm:644
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
+ out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
+ out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ out $=main::BEGIN() from /dev/null:0
+ in @=Config::myconfig() from /dev/null:0
+ in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+ out $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+ out $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+ out $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574
+ in $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574
+
+=item 14
+
+ in $=main::BEGIN() from /dev/null:0
+ in $=Config::BEGIN() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ Package lib/Carp.pm.
+ out $=Config::BEGIN() from lib/Config.pm:0
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:644
+ out $=Config::TIEHASH('Config') from lib/Config.pm:644
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
+ out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
+ out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ out $=main::BEGIN() from /dev/null:0
+ in @=Config::myconfig() from /dev/null:0
+ in $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
+ out $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
+ in $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
+ out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
+
+=item 30
+
+ in $=CODE(0x15eca4)() from /dev/null:0
+ in $=CODE(0x182528)() from lib/Config.pm:2
+ Package lib/Exporter.pm.
+ out $=CODE(0x182528)() from lib/Config.pm:0
+ scalar context return from CODE(0x182528): undef
+ Package lib/Config.pm.
+ in $=Config::TIEHASH('Config') from lib/Config.pm:628
+ out $=Config::TIEHASH('Config') from lib/Config.pm:628
+ scalar context return from Config::TIEHASH: empty hash
+ in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+ out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
+ scalar context return from Exporter::export: ''
+ out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
+ scalar context return from Exporter::import: ''
+
+=back
+
+In all cases shown above, the line indentation shows the call tree.
+If bit 2 of C<frame> is set, a line is printed on exit from a
+subroutine as well. If bit 4 is set, the arguments are printed
+along with the caller info. If bit 8 is set, the arguments are
+printed even if they are tied or references. If bit 16 is set, the
+return value is printed, too.
+
+When a package is compiled, a line like this
+
+ Package lib/Carp.pm.
+
+is printed with proper indentation.
+
+=head1 Debugging regular expressions
+
+There are two ways to enable debugging output for regular expressions.
+
+If your perl is compiled with C<-DDEBUGGING>, you may use the
+B<-Dr> flag on the command line.
+
+Otherwise, one can C<use re 'debug'>, which has effects at
+compile time and run time. It is not lexically scoped.
+
+=head2 Compile-time output
+
+The debugging output at compile time looks like this:
+
+ compiling RE `[bc]d(ef*g)+h[ij]k$'
+ size 43 first at 1
+ 1: ANYOF(11)
+ 11: EXACT <d>(13)
+ 13: CURLYX {1,32767}(27)
+ 15: OPEN1(17)
+ 17: EXACT <e>(19)
+ 19: STAR(22)
+ 20: EXACT <f>(0)
+ 22: EXACT <g>(24)
+ 24: CLOSE1(26)
+ 26: WHILEM(0)
+ 27: NOTHING(28)
+ 28: EXACT <h>(30)
+ 30: ANYOF(40)
+ 40: EXACT <k>(42)
+ 42: EOL(43)
+ 43: END(0)
+ anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating)
+ stclass `ANYOF' minlen 7
+
+The first line shows the pre-compiled form of the regex. The second
+shows the size of the compiled form (in arbitrary units, usually
+4-byte words) and the label I<id> of the first node that does a
+match.
+
+The last line (split into two lines above) contains optimizer
+information. In the example shown, the optimizer found that the match
+should contain a substring C<de> at offset 1, plus substring C<gh>
+at some offset between 3 and infinity. Moreover, when checking for
+these substrings (to abandon impossible matches quickly), Perl will check
+for the substring C<gh> before checking for the substring C<de>. The
+optimizer may also use the knowledge that the match starts (at the
+C<first> I<id>) with a character class, and the match cannot be
+shorter than 7 chars.
+
+The fields of interest which may appear in the last line are
+
+=over
+
+=item C<anchored> I<STRING> C<at> I<POS>
+
+=item C<floating> I<STRING> C<at> I<POS1..POS2>
+
+See above.
+
+=item C<matching floating/anchored>
+
+Which substring to check first.
+
+=item C<minlen>
+
+The minimal length of the match.
+
+=item C<stclass> I<TYPE>
+
+Type of first matching node.
+
+=item C<noscan>
+
+Don't scan for the found substrings.
+
+=item C<isall>
+
+Means that the optimizer info is all that the regular
+expression contains, and thus one does not need to enter the regex engine at
+all.
+
+=item C<GPOS>
+
+Set if the pattern contains C<\G>.
+
+=item C<plus>
+
+Set if the pattern starts with a repeated char (as in C<x+y>).
+
+=item C<implicit>
+
+Set if the pattern starts with C<.*>.
+
+=item C<with eval>
+
+Set if the pattern contain eval-groups, such as C<(?{ code })> and
+C<(??{ code })>.
+
+=item C<anchored(TYPE)>
+
+If the pattern may match only at a handful of places, (with C<TYPE>
+being C<BOL>, C<MBOL>, or C<GPOS>. See the table below.
+
+=back
+
+If a substring is known to match at end-of-line only, it may be
+followed by C<$>, as in C<floating `k'$>.
+
+The optimizer-specific info is used to avoid entering (a slow) regex
+engine on strings that will not definitely match. If C<isall> flag
+is set, a call to the regex engine may be avoided even when the optimizer
+found an appropriate place for the match.
+
+The rest of the output contains the list of I<nodes> of the compiled
+form of the regex. Each line has format
+
+C< >I<id>: I<TYPE> I<OPTIONAL-INFO> (I<next-id>)
+
+=head2 Types of nodes
+
+Here are the possible types, with short descriptions:
+
+ # TYPE arg-description [num-args] [longjump-len] DESCRIPTION
+
+ # Exit points
+ END no End of program.
+ SUCCEED no Return from a subroutine, basically.
+
+ # Anchors:
+ BOL no Match "" at beginning of line.
+ MBOL no Same, assuming multiline.
+ SBOL no Same, assuming singleline.
+ EOS no Match "" at end of string.
+ EOL no Match "" at end of line.
+ MEOL no Same, assuming multiline.
+ SEOL no Same, assuming singleline.
+ BOUND no Match "" at any word boundary
+ BOUNDL no Match "" at any word boundary
+ NBOUND no Match "" at any word non-boundary
+ NBOUNDL no Match "" at any word non-boundary
+ GPOS no Matches where last m//g left off.
+
+ # [Special] alternatives
+ ANY no Match any one character (except newline).
+ SANY no Match any one character.
+ ANYOF sv Match character in (or not in) this class.
+ ALNUM no Match any alphanumeric character
+ ALNUML no Match any alphanumeric char in locale
+ NALNUM no Match any non-alphanumeric character
+ NALNUML no Match any non-alphanumeric char in locale
+ SPACE no Match any whitespace character
+ SPACEL no Match any whitespace char in locale
+ NSPACE no Match any non-whitespace character
+ NSPACEL no Match any non-whitespace char in locale
+ DIGIT no Match any numeric character
+ NDIGIT no Match any non-numeric character
+
+ # BRANCH The set of branches constituting a single choice are hooked
+ # together with their "next" pointers, since precedence prevents
+ # anything being concatenated to any individual branch. The
+ # "next" pointer of the last BRANCH in a choice points to the
+ # thing following the whole choice. This is also where the
+ # final "next" pointer of each individual branch points; each
+ # branch starts with the operand node of a BRANCH node.
+ #
+ BRANCH node Match this alternative, or the next...
+
+ # BACK Normal "next" pointers all implicitly point forward; BACK
+ # exists to make loop structures possible.
+ # not used
+ BACK no Match "", "next" ptr points backward.
+
+ # Literals
+ EXACT sv Match this string (preceded by length).
+ EXACTF sv Match this string, folded (prec. by length).
+ EXACTFL sv Match this string, folded in locale (w/len).
+
+ # Do nothing
+ NOTHING no Match empty string.
+ # A variant of above which delimits a group, thus stops optimizations
+ TAIL no Match empty string. Can jump here from outside.
+
+ # STAR,PLUS '?', and complex '*' and '+', are implemented as circular
+ # BRANCH structures using BACK. Simple cases (one character
+ # per match) are implemented with STAR and PLUS for speed
+ # and to minimize recursive plunges.
+ #
+ STAR node Match this (simple) thing 0 or more times.
+ PLUS node Match this (simple) thing 1 or more times.
+
+ CURLY sv 2 Match this simple thing {n,m} times.
+ CURLYN no 2 Match next-after-this simple thing
+ # {n,m} times, set parens.
+ CURLYM no 2 Match this medium-complex thing {n,m} times.
+ CURLYX sv 2 Match this complex thing {n,m} times.
+
+ # This terminator creates a loop structure for CURLYX
+ WHILEM no Do curly processing and see if rest matches.
+
+ # OPEN,CLOSE,GROUPP ...are numbered at compile time.
+ OPEN num 1 Mark this point in input as start of #n.
+ CLOSE num 1 Analogous to OPEN.
+
+ REF num 1 Match some already matched string
+ REFF num 1 Match already matched string, folded
+ REFFL num 1 Match already matched string, folded in loc.
+
+ # grouping assertions
+ IFMATCH off 1 2 Succeeds if the following matches.
+ UNLESSM off 1 2 Fails if the following matches.
+ SUSPEND off 1 1 "Independent" sub-regex.
+ IFTHEN off 1 1 Switch, should be preceded by switcher .
+ GROUPP num 1 Whether the group matched.
+
+ # Support for long regex
+ LONGJMP off 1 1 Jump far away.
+ BRANCHJ off 1 1 BRANCH with long offset.
+
+ # The heavy worker
+ EVAL evl 1 Execute some Perl code.
+
+ # Modifiers
+ MINMOD no Next operator is not greedy.
+ LOGICAL no Next opcode should set the flag only.
+
+ # This is not used yet
+ RENUM off 1 1 Group with independently numbered parens.
+
+ # This is not really a node, but an optimized away piece of a "long" node.
+ # To simplify debugging output, we mark it as if it were a node
+ OPTIMIZED off Placeholder for dump.
+
+=head2 Run-time output
+
+First of all, when doing a match, one may get no run-time output even
+if debugging is enabled. This means that the regex engine was never
+entered and that all of the job was therefore done by the optimizer.
+
+If the regex engine was entered, the output may look like this:
+
+ Matching `[bc]d(ef*g)+h[ij]k$' against `abcdefg__gh__'
+ Setting an EVAL scope, savestack=3
+ 2 <ab> <cdefg__gh_> | 1: ANYOF
+ 3 <abc> <defg__gh_> | 11: EXACT <d>
+ 4 <abcd> <efg__gh_> | 13: CURLYX {1,32767}
+ 4 <abcd> <efg__gh_> | 26: WHILEM
+ 0 out of 1..32767 cc=effff31c
+ 4 <abcd> <efg__gh_> | 15: OPEN1
+ 4 <abcd> <efg__gh_> | 17: EXACT <e>
+ 5 <abcde> <fg__gh_> | 19: STAR
+ EXACT <f> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 6 <bcdef> <g__gh__> | 22: EXACT <g>
+ 7 <bcdefg> <__gh__> | 24: CLOSE1
+ 7 <bcdefg> <__gh__> | 26: WHILEM
+ 1 out of 1..32767 cc=effff31c
+ Setting an EVAL scope, savestack=12
+ 7 <bcdefg> <__gh__> | 15: OPEN1
+ 7 <bcdefg> <__gh__> | 17: EXACT <e>
+ restoring \1 to 4(4)..7
+ failed, try continuation...
+ 7 <bcdefg> <__gh__> | 27: NOTHING
+ 7 <bcdefg> <__gh__> | 28: EXACT <h>
+ failed...
+ failed...
+
+The most significant information in the output is about the particular I<node>
+of the compiled regex that is currently being tested against the target string.
+The format of these lines is
+
+C< >I<STRING-OFFSET> <I<PRE-STRING>> <I<POST-STRING>> |I<ID>: I<TYPE>
+
+The I<TYPE> info is indented with respect to the backtracking level.
+Other incidental information appears interspersed within.
+
+=head1 Debugging Perl memory usage
+
+Perl is a profligate wastrel when it comes to memory use. There
+is a saying that to estimate memory usage of Perl, assume a reasonable
+algorithm for memory allocation, multiply that estimate by 10, and
+while you still may miss the mark, at least you won't be quite so
+astonished. This is not absolutely true, but may prvide a good
+grasp of what happens.
+
+Assume that an integer cannot take less than 20 bytes of memory, a
+float cannot take less than 24 bytes, a string cannot take less
+than 32 bytes (all these examples assume 32-bit architectures, the
+result are quite a bit worse on 64-bit architectures). If a variable
+is accessed in two of three different ways (which require an integer,
+a float, or a string), the memory footprint may increase yet another
+20 bytes. A sloppy malloc(3) implementation can make inflate these
+numbers dramatically.
+
+On the opposite end of the scale, a declaration like
+
+ sub foo;
+
+may take up to 500 bytes of memory, depending on which release of Perl
+you're running.
+
+Anecdotal estimates of source-to-compiled code bloat suggest an
+eightfold increase. This means that the compiled form of reasonable
+(normally commented, properly indented etc.) code will take
+about eight times more space in memory than the code took
+on disk.
+
+There are two Perl-specific ways to analyze memory usage:
+$ENV{PERL_DEBUG_MSTATS} and B<-DL> command-line switch. The first
+is available only if Perl is compiled with Perl's malloc(); the
+second only if Perl was built with C<-DDEBUGGING>. See the
+instructions for how to do this in the F<INSTALL> podpage at
+the top level of the Perl source tree.
+
+=head2 Using C<$ENV{PERL_DEBUG_MSTATS}>
+
+If your perl is using Perl's malloc() and was compiled with the
+necessary switches (this is the default), then it will print memory
+usage statistics after compiling your code hwen C<< $ENV{PERL_DEBUG_MSTATS}
+> 1 >>, and before termination of the program when C<<
+$ENV{PERL_DEBUG_MSTATS} >= 1 >>. The report format is similar to
+the following example:
+
+ $ PERL_DEBUG_MSTATS=2 perl -e "require Carp"
+ Memory allocation statistics after compilation: (buckets 4(4)..8188(8192)
+ 14216 free: 130 117 28 7 9 0 2 2 1 0 0
+ 437 61 36 0 5
+ 60924 used: 125 137 161 55 7 8 6 16 2 0 1
+ 74 109 304 84 20
+ Total sbrk(): 77824/21:119. Odd ends: pad+heads+chain+tail: 0+636+0+2048.
+ Memory allocation statistics after execution: (buckets 4(4)..8188(8192)
+ 30888 free: 245 78 85 13 6 2 1 3 2 0 1
+ 315 162 39 42 11
+ 175816 used: 265 176 1112 111 26 22 11 27 2 1 1
+ 196 178 1066 798 39
+ Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144.
+
+It is possible to ask for such a statistic at arbitrary points in
+your execution using the mstats() function out of the standard
+Devel::Peek module.
+
+Here is some explanation of that format:
+
+=over
+
+=item C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>
+
+Perl's malloc() uses bucketed allocations. Every request is rounded
+up to the closest bucket size available, and a bucket is taken from
+the pool of buckets of that size.
+
+The line above describes the limits of buckets currently in use.
+Each bucket has two sizes: memory footprint and the maximal size
+of user data that can fit into this bucket. Suppose in the above
+example that the smallest bucket were size 4. The biggest bucket
+would have usable size 8188, and the memory footprint would be 8192.
+
+In a Perl built for debugging, some buckets may have negative usable
+size. This means that these buckets cannot (and will not) be used.
+For larger buckets, the memory footprint may be one page greater
+than a power of 2. If so, case the corresponding power of two is
+printed in the C<APPROX> field above.
+
+=item Free/Used
+
+The 1 or 2 rows of numbers following that correspond to the number
+of buckets of each size between C<SMALLEST> and C<GREATEST>. In
+the first row, the sizes (memory footprints) of buckets are powers
+of two--or possibly one page greater. In the second row, if present,
+the memory footprints of the buckets are between the memory footprints
+of two buckets "above".
+
+For example, suppose under the pervious example, the memory footprints
+were
+
+ free: 8 16 32 64 128 256 512 1024 2048 4096 8192
+ 4 12 24 48 80
+
+With non-C<DEBUGGING> perl, the buckets starting from C<128> have
+a 4-byte overhead, and thus a 8192-long bucket may take up to
+8188-byte allocations.
+
+=item C<Total sbrk(): SBRKed/SBRKs:CONTINUOUS>
+
+The first two fields give the total amount of memory perl sbrk(2)ed
+(ess-broken? :-) and number of sbrk(2)s used. The third number is
+what perl thinks about continuity of returned chunks. So long as
+this number is positive, malloc() will assume that it is probable
+that sbrk(2) will provide continuous memory.
+
+Memory allocated by external libraries is not counted.
+
+=item C<pad: 0>
+
+The amount of sbrk(2)ed memory needed to keep buckets aligned.
+
+=item C<heads: 2192>
+
+Although memory overhead of bigger buckets is kept inside the bucket, for
+smaller buckets, it is kept in separate areas. This field gives the
+total size of these areas.
+
+=item C<chain: 0>
+
+malloc() may want to subdivide a bigger bucket into smaller buckets.
+If only a part of the deceased bucket is left unsubdivided, the rest
+is kept as an element of a linked list. This field gives the total
+size of these chunks.
+
+=item C<tail: 6144>
+
+To minimize the number of sbrk(2)s, malloc() asks for more memory. This
+field gives the size of the yet unused part, which is sbrk(2)ed, but
+never touched.
+
+=back
+
+=head2 Example of using B<-DL> switch
+
+Below we show how to analyse memory usage by
+
+ do 'lib/auto/POSIX/autosplit.ix';
+
+The file in question contains a header and 146 lines similar to
+
+ sub getcwd;
+
+B<WARNING>: The discussion below supposes 32-bit architecture. In
+newer releases of Perl, memory usage of the constructs discussed
+here is greatly improved, but the story discussed below is a real-life
+story. This story is mercilessly terse, and assumes rather more than cursory
+knowledge of Perl internals. Type space to continue, `q' to quit.
+(Actually, you just want to skip to the next section.)
+
+Here is the itemized list of Perl allocations performed during parsing
+of this file:
+
+ !!! "after" at test.pl line 3.
+ Id subtot 4 8 12 16 20 24 28 32 36 40 48 56 64 72 80 80+
+ 0 02 13752 . . . . 294 . . . . . . . . . . 4
+ 0 54 5545 . . 8 124 16 . . . 1 1 . . . . . 3
+ 5 05 32 . . . . . . . 1 . . . . . . . .
+ 6 02 7152 . . . . . . . . . . 149 . . . . .
+ 7 02 3600 . . . . . 150 . . . . . . . . . .
+ 7 03 64 . -1 . 1 . . 2 . . . . . . . . .
+ 7 04 7056 . . . . . . . . . . . . . . . 7
+ 7 17 38404 . . . . . . . 1 . . 442 149 . . 147 .
+ 9 03 2078 17 249 32 . . . . 2 . . . . . . . .
+
+
+To see this list, insert two C<warn('!...')> statements around the call:
+
+ warn('!');
+ do 'lib/auto/POSIX/autosplit.ix';
+ warn('!!! "after"');
+
+and run it with PErl's B<-DL> option. The first warn() will print
+memory allocation info before parsing the file and will memorize
+the statistics at this point (we ignore what it prints). The second
+warn() prints increments with respect to these memorized data. This
+is the printout shown above.
+
+Different I<Id>s on the left correspond to different subsystems of
+the perl interpreter. They are just the first argument given to
+the perl memory allocation API named New(). To find what C<9 03>
+means, just B<grep> the perl source for C<903>. You'll find it in
+F<util.c>, function savepvn(). (I know, you wonder why we told you
+to B<grep> and then gave away the answer. That's because grepping
+the source is good for the soul.) This function is used to store
+a copy of an existing chunk of memory. Using a C debugger, one can
+see that the function was called either directly from gv_init() or
+via sv_magic(), and that gv_init() is called from gv_fetchpv()--which
+was itself called from newSUB(). Please stop to catch your breath now.
+
+B<NOTE>: To reach this point in the debugger and skip the calls to
+savepvn() during the compilation of the main program, you should
+set a C breakpoint
+in Perl_warn(), continue until this point is reached, and I<then> set
+a C breakpoint in Perl_savepvn(). Note that you may need to skip a
+handful of Perl_savepvn() calls that do not correspond to mass production
+of CVs (there are more C<903> allocations than 146 similar lines of
+F<lib/auto/POSIX/autosplit.ix>). Note also that C<Perl_> prefixes are
+added by macroization code in perl header files to avoid conflicts
+with external libraries.
+
+Anyway, we see that C<903> ids correspond to creation of globs, twice
+per glob - for glob name, and glob stringification magic.
+
+Here are explanations for other I<Id>s above:
+
+=over
+
+=item C<717>
+
+CReates bigger C<XPV*> structures. In the case above, it
+creates 3 C<AV>s per subroutine, one for a list of lexical variable
+names, one for a scratchpad (which contains lexical variables and
+C<targets>), and one for the array of scratchpads needed for
+recursion.
+
+It also creates a C<GV> and a C<CV> per subroutine, all called from
+start_subparse().
+
+=item C<002>
+
+Creates a C array corresponding to the C<AV> of scratchpads and the
+scratchpad itself. The first fake entry of this scratchpad is
+created though the subroutine itself is not defined yet.
+
+It also creates C arrays to keep data for the stash. This is one HV,
+but it grows; thus, there are 4 big allocations: the big chunks are not
+freed, but are kept as additional arenas for C<SV> allocations.
+
+=item C<054>
+
+Creates a C<HEK> for the name of the glob for the subroutine. This
+name is a key in a I<stash>.
+
+Big allocations with this I<Id> correspond to allocations of new
+arenas to keep C<HE>.
+
+=item C<602>
+
+Creates a C<GP> for the glob for the subroutine.
+
+=item C<702>
+
+Creates the C<MAGIC> for the glob for the subroutine.
+
+=item C<704>
+
+Creates I<arenas> which keep SVs.
+
+=back
+
+=head2 B<-DL> details
+
+If Perl is run with B<-DL> option, then warn()s that start with `!'
+behave specially. They print a list of I<categories> of memory
+allocations, and statistics of allocations of different sizes for
+these categories.
+
+If warn() string starts with
+
+=over
+
+=item C<!!!>
+
+print changed categories only, print the differences in counts of allocations.
+
+=item C<!!>
+
+print grown categories only; print the absolute values of counts, and totals.
+
+=item C<!>
+
+print nonempty categories, print the absolute values of counts and totals.
+
+=back
+
+=head2 Limitations of B<-DL> statistics
+
+If an extension or external library does not use the Perl API to
+allocate memory, such allocations are not counted.
+
+=head1 SEE ALSO
+
+L<perldebug>,
+L<perlguts>,
+L<perlrun>
+L<re>,
+and
+L<Devel::Dprof>.
diff --git a/contrib/perl5/pod/perldebug.pod b/contrib/perl5/pod/perldebug.pod
index 760d517..c8ef60f 100644
--- a/contrib/perl5/pod/perldebug.pod
+++ b/contrib/perl5/pod/perldebug.pod
@@ -8,15 +8,6 @@ First of all, have you tried using the B<-w> switch?
=head1 The Perl Debugger
-"As soon as we started programming, we found to our
-surprise that it wasn't as easy to get programs right
-as we had thought. Debugging had to be discovered.
-I can remember the exact instant when I realized that
-a large part of my life from then on was going to be
-spent in finding mistakes in my own programs."
-
-I< --Maurice Wilkes, 1949>
-
If you invoke Perl with the B<-d> switch, your script runs under the
Perl source debugger. This works like an interactive Perl
environment, prompting for debugger commands that let you examine
@@ -25,14 +16,14 @@ variables, etc. This is so convenient that you often fire up
the debugger all by itself just to test out Perl constructs
interactively to see what they do. For example:
- perl -d -e 42
+ $ perl -d -e 42
-In Perl, the debugger is not a separate program as it usually is in the
+In Perl, the debugger is not a separate program the way it usually is in the
typical compiled environment. Instead, the B<-d> flag tells the compiler
to insert source information into the parse trees it's about to hand off
to the interpreter. That means your code must first compile correctly
for the debugger to work on it. Then when the interpreter starts up, it
-preloads a Perl library file containing the debugger itself.
+preloads a special Perl library file containing the debugger.
The program will halt I<right before> the first run-time executable
statement (but see below regarding compile-time statements) and ask you
@@ -41,12 +32,15 @@ the debugger halts and shows you a line of code, it always displays the
line it's I<about> to execute, rather than the one it has just executed.
Any command not recognized by the debugger is directly executed
-(C<eval>'d) as Perl code in the current package. (The debugger uses the
-DB package for its own state information.)
+(C<eval>'d) as Perl code in the current package. (The debugger
+uses the DB package for keeping its own state information.)
-Leading white space before a command would cause the debugger to think
-it's I<NOT> a debugger command but for Perl, so be careful not to do
-that.
+For any text entered at the debugger prompt, leading and trailing whitespace
+is first stripped before further processing. If a debugger command
+coincides with some function in your own program, merely precede the
+function with something that doesn't look like a debugger command, such
+as a leading C<;> or perhaps a C<+>, or by wrapping it with parentheses
+or braces.
=head2 Debugger Commands
@@ -64,8 +58,8 @@ argument of C<h h> produces a more compact help listing, designed to fit
together on one screen.
If the output of the C<h> command (or any command, for that matter) scrolls
-past your screen, either precede the command with a leading pipe symbol so
-it's run through your pager, as in
+past your screen, precede the command with a leading pipe symbol so
+that it's run through your pager, as in
DB> |h
@@ -74,7 +68,7 @@ You may change the pager which is used via C<O pager=...> command.
=item p expr
Same as C<print {$DB::OUT} expr> in the current package. In particular,
-because this is just Perl's own B<print> function, this means that nested
+because this is just Perl's own C<print> function, this means that nested
data structures and objects are not dumped, unlike with the C<x> command.
The C<DB::OUT> filehandle is opened to F</dev/tty>, regardless of
@@ -84,26 +78,25 @@ where STDOUT may be redirected to.
Evaluates its expression in list context and dumps out the result
in a pretty-printed fashion. Nested data structures are printed out
-recursively, unlike the C<print> function.
+recursively, unlike the real C<print> function in Perl.
+See L<Dumpvalue> if you'd like to do this yourself.
-The details of printout are governed by multiple C<O>ptions.
+The output format is governed by multiple options described under
+L<"Options">.
=item V [pkg [vars]]
-Display all (or some) variables in package (defaulting to the C<main>
-package) using a data pretty-printer (hashes show their keys and values so
-you see what's what, control characters are made printable, etc.). Make
-sure you don't put the type specifier (like C<$>) there, just the symbol
-names, like this:
+Display all (or some) variables in package (defaulting to C<main>)
+using a data pretty-printer (hashes show their keys and values so
+you see what's what, control characters are made printable, etc.).
+Make sure you don't put the type specifier (like C<$>) there, just
+the symbol names, like this:
V DB filename line
-Use C<~pattern> and C<!pattern> for positive and negative regexps.
-
-Nested data structures are printed out in a legible fashion, unlike
-the C<print> function.
+Use C<~pattern> and C<!pattern> for positive and negative regexes.
-The details of printout are governed by multiple C<O>ptions.
+This is similar to calling the C<x> command on each applicable var.
=item X [vars]
@@ -115,18 +108,23 @@ Produce a stack backtrace. See below for details on its output.
=item s [expr]
-Single step. Executes until it reaches the beginning of another
+Single step. Executes until the beginning of another
statement, descending into subroutine calls. If an expression is
supplied that includes function calls, it too will be single-stepped.
=item n [expr]
-Next. Executes over subroutine calls, until it reaches the beginning
+Next. Executes over subroutine calls, until the beginning
of the next statement. If an expression is supplied that includes
function calls, those functions will be executed with stops before
each statement.
-=item E<lt>CRE<gt>
+=item r
+
+Continue until the return from the current subroutine.
+Dump the return value if the C<PrintRet> option is set (default).
+
+=item <CR>
Repeat last C<n> or C<s> command.
@@ -153,7 +151,8 @@ List a single line.
=item l subname
-List first window of lines from subroutine.
+List first window of lines from subroutine. I<subname> may
+be a variable that contains a code reference.
=item -
@@ -165,18 +164,24 @@ List window (a few lines) around the current line.
=item .
-Return debugger pointer to the last-executed line and
-print it out.
+Return the internal debugger pointer to the line last
+executed, and print out that line.
=item f filename
-Switch to viewing a different file or eval statement. If C<filename>
-is not a full filename as found in values of %INC, it is considered as
-a regexp.
+Switch to viewing a different file or C<eval> statement. If I<filename>
+is not a full pathname found in the values of %INC, it is considered
+a regex.
+
+C<eval>ed strings (when accessible) are considered to be filenames:
+C<f (eval 7)> and C<f eval 7\b> access the body of the 7th C<eval>ed string
+(in the order of execution). The bodies of the currently executed C<eval>
+and of C<eval>ed strings that define subroutines are saved and thus
+accessible.
=item /pattern/
-Search forwards for pattern; final / is optional.
+Search forwards for pattern (a Perl regex); final / is optional.
=item ?pattern?
@@ -186,58 +191,27 @@ Search backwards for pattern; final ? is optional.
List all breakpoints and actions.
-=item S [[!]pattern]
+=item S [[!]regex]
-List subroutine names [not] matching pattern.
+List subroutine names [not] matching the regex.
=item t
-Toggle trace mode (see also C<AutoTrace> C<O>ption).
+Toggle trace mode (see also the C<AutoTrace> option).
=item t expr
-Trace through execution of expr. For example:
-
- $ perl -de 42
- Stack dump during die enabled outside of evals.
-
- Loading DB routines from perl5db.pl patch level 0.94
- Emacs support available.
-
- Enter h or `h h' for help.
-
- main::(-e:1): 0
- DB<1> sub foo { 14 }
-
- DB<2> sub bar { 3 }
-
- DB<3> t print foo() * bar()
- main::((eval 172):3): print foo() + bar();
- main::foo((eval 168):2):
- main::bar((eval 170):2):
- 42
-
-or, with the C<O>ption C<frame=2> set,
-
- DB<4> O f=2
- frame = '2'
- DB<5> t print foo() * bar()
- 3: foo() * bar()
- entering main::foo
- 2: sub foo { 14 };
- exited main::foo
- entering main::bar
- 2: sub bar { 3 };
- exited main::bar
- 42
+Trace through execution of C<expr>.
+See L<perldebguts/"Frame Listing Output Examples"> for examples.
=item b [line] [condition]
-Set a breakpoint. If line is omitted, sets a breakpoint on the line
-that is about to be executed. If a condition is specified, it's
-evaluated each time the statement is reached and a breakpoint is taken
-only if the condition is true. Breakpoints may be set on only lines
-that begin an executable statement. Conditions don't use B<if>:
+Set a breakpoint before the given line. If I<line> is omitted, set a
+breakpoint on the line about to be executed. If a condition
+is specified, it's evaluated each time the statement is reached: a
+breakpoint is taken only if the condition is true. Breakpoints may
+only be set on lines that begin an executable statement. Conditions
+don't use C<if>:
b 237 $x > 30
b 237 ++$count237 < 11
@@ -245,26 +219,28 @@ that begin an executable statement. Conditions don't use B<if>:
=item b subname [condition]
-Set a breakpoint at the first line of the named subroutine.
+Set a breakpoint before the first line of the named subroutine. I<subname> may
+be a variable containing a code reference (in this case I<condition>
+is not supported).
=item b postpone subname [condition]
-Set breakpoint at first line of subroutine after it is compiled.
+Set a breakpoint at first line of subroutine after it is compiled.
=item b load filename
-Set breakpoint at the first executed line of the file. Filename should
-be a full name as found in values of %INC.
+Set a breakpoint before the first executed line of the I<filename>,
+which should be a full pathname found amongst the %INC values.
=item b compile subname
-Sets breakpoint at the first statement executed after the subroutine
-is compiled.
+Sets a breakpoint before the first statement executed after the specified
+subroutine is compiled.
=item d [line]
-Delete a breakpoint at the specified line. If line is omitted, deletes
-the breakpoint on the line that is about to be executed.
+Delete a breakpoint from the specified I<line>. If I<line> is omitted, deletes
+the breakpoint from the line about to be executed.
=item D
@@ -272,7 +248,8 @@ Delete all installed breakpoints.
=item a [line] command
-Set an action to be done before the line is executed.
+Set an action to be done before the line is executed. If I<line> is
+omitted, set an action on the line about to be executed.
The sequence of steps taken by the debugger is
1. check for a breakpoint at this line
@@ -286,35 +263,224 @@ For example, this will print out $foo every time line
a 53 print "DB FOUND $foo\n"
+=item a [line]
+
+Delete an action from the specified line. If I<line> is omitted, delete
+the action on the line that is about to be executed.
+
=item A
Delete all installed actions.
-=item W [expr]
+=item W expr
-Add a global watch-expression.
+Add a global watch-expression. We hope you know what one of these
+is, because they're supposed to be obvious. B<WARNING>: It is far
+too easy to destroy your watch expressions by accidentally omitting
+the I<expr>.
=item W
Delete all watch-expressions.
-=item O [opt[=val]] [opt"val"] [opt?]...
+=item O booloption ...
+
+Set each listed Boolean option to the value C<1>.
+
+=item O anyoption? ...
+
+Print out the value of one or more options.
+
+=item O option=value ...
+
+Set the value of one or more options. If the value has internal
+whitespace, it should be quoted. For example, you could set C<O
+pager="less -MQeicsNfr"> to call B<less> with those specific options.
+You may use either single or double quotes, but if you do, you must
+escape any embedded instances of same sort of quote you began with,
+as well as any escaping any escapes that immediately precede that
+quote but which are not meant to escape the quote itself. In other
+words, you follow single-quoting rules irrespective of the quote;
+eg: C<O option='this isn\'t bad'> or C<O option="She said, \"Isn't
+it?\"">.
+
+For historical reasons, the C<=value> is optional, but defaults to
+1 only where it is safe to do so--that is, mostly for Boolean
+options. It is always better to assign a specific value using C<=>.
+The C<option> can be abbreviated, but for clarity probably should
+not be. Several options can be set together. See L<"Options"> for
+a list of these.
+
+=item < ?
+
+List out all pre-prompt Perl command actions.
+
+=item < [ command ]
+
+Set an action (Perl command) to happen before every debugger prompt.
+A multi-line command may be entered by backslashing the newlines.
+B<WARNING> If C<command> is missing, all actions are wiped out!
+
+=item << command
+
+Add an action (Perl command) to happen before every debugger prompt.
+A multi-line command may be entered by backwhacking the newlines.
+
+=item > ?
+
+List out post-prompt Perl command actions.
+
+=item > command
+
+Set an action (Perl command) to happen after the prompt when you've
+just given a command to return to executing the script. A multi-line
+command may be entered by backslashing the newlines (we bet you
+couldn't've guessed this by now). B<WARNING> If C<command> is
+missing, all actions are wiped out!
+
+=item >> command
+
+Adds an action (Perl command) to happen after the prompt when you've
+just given a command to return to executing the script. A multi-line
+command may be entered by slackbashing the newlines.
+
+=item { ?
+
+List out pre-prompt debugger commands.
+
+=item { [ command ]
+
+Set an action (debugger command) to happen before every debugger prompt.
+A multi-line command may be entered in the customary fashion.
+B<WARNING> If C<command> is missing, all actions are wiped out!
+
+Because this command is in some senses new, a warning is issued if
+you appear to have accidentally entered a block instead. If that's
+what you mean to do, write it as with C<;{ ... }> or even
+C<do { ... }>.
+
+=item {{ command
+
+Add an action (debugger command) to happen before every debugger prompt.
+A multi-line command may be entered, if you can guess how: see above.
+
+=item ! number
+
+Redo a previous command (defaults to the previous command).
+
+=item ! -number
+
+Redo number'th previous command.
+
+=item ! pattern
+
+Redo last command that started with pattern.
+See C<O recallCommand>, too.
+
+=item !! cmd
+
+Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT) See
+C<O shellBang>, also. Note that the user's current shell (well,
+their C<$ENV{SHELL}> variable) will be used, which can interfere
+with proper interpretation of exit status or signal and coredump
+information.
+
+=item H -number
+
+Display last n commands. Only commands longer than one character are
+listed. If I<number> is omitted, list them all.
+
+=item q or ^D
+
+Quit. ("quit" doesn't work for this, unless you've made an alias)
+This is the only supported way to exit the debugger, though typing
+C<exit> twice might work.
+
+Set the C<inhibit_exit> option to 0 if you want to be able to step
+off the end the script. You may also need to set $finished to 0
+if you want to step through global destruction.
+
+=item R
+
+Restart the debugger by C<exec()>ing a new session. We try to maintain
+your history across this, but internal settings and command-line options
+may be lost.
-Set or query values of options. val defaults to 1. opt can
-be abbreviated. Several options can be listed.
+The following setting are currently preserved: history, breakpoints,
+actions, debugger options, and the Perl command-line
+options B<-w>, B<-I>, and B<-e>.
+
+=item |dbcmd
+
+Run the debugger command, piping DB::OUT into your current pager.
+
+=item ||dbcmd
+
+Same as C<|dbcmd> but DB::OUT is temporarily C<select>ed as well.
+
+=item = [alias value]
+
+Define a command alias, like
+
+ = quit q
+
+or list current aliases.
+
+=item command
+
+Execute command as a Perl statement. A trailing semicolon will be
+supplied. If the Perl statement would otherwise be confused for a
+Perl debugger, use a leading semicolon, too.
+
+=item m expr
+
+List which methods may be called on the result of the evaluated
+expression. The expression may evaluated to a reference to a
+blessed object, or to a package name.
+
+=item man [manpage]
+
+Despite its name, this calls your system's default documentation
+viewer on the given page, or on the viewer itself if I<manpage> is
+omitted. If that viewer is B<man>, the current C<Config> information
+is used to invoke B<man> using the proper MANPATH or S<B<-M>
+I<manpath>> option. Failed lookups of the form C<XXX> that match
+known manpages of the form I<perlXXX> will be retried. This lets
+you type C<man debug> or C<man op> from the debugger.
+
+On systems traditionally bereft of a usable B<man> command, the
+debugger invokes B<perldoc>. Occasionally this determination is
+incorrect due to recalcitrant vendors or rather more felicitously,
+to enterprising users. If you fall into either category, just
+manually set the $DB::doccmd variable to whatever viewer to view
+the Perl documentation on your system. This may be set in an rc
+file, or through direct assignment. We're still waiting for a
+working example of something along the lines of:
+
+ $DB::doccmd = 'netscape -remote http://something.here/';
+
+=back
+
+=head2 Configurable Options
+
+The debugger has numerous options settable using the C<O> command,
+either interactively or from the environment or an rc file.
=over 12
=item C<recallCommand>, C<ShellBang>
The characters used to recall command or spawn shell. By
-default, these are both set to C<!>.
+default, both are set to C<!>, which is unfortunate.
=item C<pager>
-Program to use for output of pager-piped commands (those
-beginning with a C<|> character.) By default,
-C<$ENV{PAGER}> will be used.
+Program to use for output of pager-piped commands (those beginning
+with a C<|> character.) By default, C<$ENV{PAGER}> will be used.
+Because the debugger uses your current terminal characteristics
+for bold and underlining, if the chosen pager does not pass escape
+sequences through unchanged, the output of some debugger commands
+will not be readable when sent through the pager.
=item C<tkRunning>
@@ -322,14 +488,23 @@ Run Tk while prompting (with ReadLine).
=item C<signalLevel>, C<warnLevel>, C<dieLevel>
-Level of verbosity. By default the debugger is in a sane verbose mode,
-thus it will print backtraces on all the warnings and die-messages
-which are going to be printed out, and will print a message when
-interesting uncaught signals arrive.
-
-To disable this behaviour, set these values to 0. If C<dieLevel> is 2,
-then the messages which will be caught by surrounding C<eval> are also
-printed.
+Level of verbosity. By default, the debugger leaves your exceptions
+and warnings alone, because altering them can break correctly running
+programs. It will attempt to print a message when uncaught INT, BUS, or
+SEGV signals arrive. (But see the mention of signals in L<BUGS> below.)
+
+To disable this default safe mode, set these values to something higher
+than 0. At a level of 1, you get backtraces upon receiving any kind
+of warning (this is often annoying) or exception (this is
+often valuable). Unfortunately, the debugger cannot discern fatal
+exceptions from non-fatal ones. If C<dieLevel> is even 1, then your
+non-fatal exceptions are also traced and unceremoniously altered if they
+came from C<eval'd> strings or from any kind of C<eval> within modules
+you're attempting to load. If C<dieLevel> is 2, the debugger doesn't
+care where they came from: It usurps your exception handler and prints
+out a trace, then modifies all exceptions with its own embellishments.
+This may perhaps be useful for some tracing purposes, but tends to hopelessly
+destroy any program that takes its exception handling seriously.
=item C<AutoTrace>
@@ -339,7 +514,10 @@ C<PERLDB_OPTS>).
=item C<LineInfo>
File or pipe to print line number info to. If it is a pipe (say,
-C<|visual_perl_db>), then a short, "emacs like" message is used.
+C<|visual_perl_db>), then a short message is used. This is the
+mechanism used to interact with a slave editor or visual debugger,
+such as the special C<vi> or C<emacs> hooks, or the C<ddd> graphical
+debugger.
=item C<inhibit_exit>
@@ -347,29 +525,32 @@ If 0, allows I<stepping off> the end of the script.
=item C<PrintRet>
-affects printing of return value after C<r> command.
+Print return value after C<r> command if set (default).
=item C<ornaments>
-affects screen appearance of the command line (see L<Term::ReadLine>).
+Affects screen appearance of the command line (see L<Term::ReadLine>).
+There is currently no way to disable these, which can render
+some output illegible on some displays, or with some pagers.
+This is considered a bug.
=item C<frame>
-affects printing messages on entry and exit from subroutines. If
+Affects the printing of messages upon entry and exit from subroutines. If
C<frame & 2> is false, messages are printed on entry only. (Printing
-on exit may be useful if inter(di)spersed with other messages.)
+on exit might be useful if interspersed with other messages.)
-If C<frame & 4>, arguments to functions are printed as well as the
-context and caller info. If C<frame & 8>, overloaded C<stringify> and
-C<tie>d C<FETCH> are enabled on the printed arguments. If C<frame &
-16>, the return value from the subroutine is printed as well.
+If C<frame & 4>, arguments to functions are printed, plus context
+and caller info. If C<frame & 8>, overloaded C<stringify> and
+C<tie>d C<FETCH> is enabled on the printed arguments. If C<frame
+& 16>, the return value from the subroutine is printed.
The length at which the argument list is truncated is governed by the
next option:
=item C<maxTraceLen>
-length at which the argument list is truncated when C<frame> option's
+Length to truncate the argument list when the C<frame> option's
bit 4 is set.
=back
@@ -385,7 +566,7 @@ Print only first N elements ('' for all).
=item C<compactDump>, C<veryCompact>
-Change style of array and hash dump. If C<compactDump>, short array
+Change the style of array and hash output. If C<compactDump>, short array
may be printed on one line.
=item C<globPrint>
@@ -406,29 +587,30 @@ Dump contents of "reused" addresses.
=item C<quote>, C<HighBit>, C<undefPrint>
-Change style of string dump. Default value of C<quote> is C<auto>, one
-can enable either double-quotish dump, or single-quotish by setting it
-to C<"> or C<'>. By default, characters with high bit set are printed
-I<as is>.
+Change the style of string dump. The default value for C<quote>
+is C<auto>; one can enable double-quotish or single-quotish format
+by setting it to C<"> or C<'>, respectively. By default, characters
+with their high bit set are printed verbatim.
=item C<UsageOnly>
-I<very> rudimentally per-package memory usage dump. Calculates total
-size of strings in variables in the package.
+Rudimentary per-package memory usage dump. Calculates total
+size of strings found in variables in the package. This does not
+include lexicals in a module's file scope, or lost in closures.
=back
-During startup options are initialized from C<$ENV{PERLDB_OPTS}>.
-You can put additional initialization options C<TTY>, C<noTTY>,
+During startup, options are initialized from C<$ENV{PERLDB_OPTS}>.
+You may place the initialization options C<TTY>, C<noTTY>,
C<ReadLine>, and C<NonStop> there.
-Example rc file:
+If your rc file contains:
- &parse_options("NonStop=1 LineInfo=db.out AutoTrace");
+ parse_options("NonStop=1 LineInfo=db.out AutoTrace");
-The script will run without human intervention, putting trace information
-into the file I<db.out>. (If you interrupt it, you would better reset
-C<LineInfo> to something "interactive"!)
+then your script will run without human intervention, putting trace
+information into the file I<db.out>. (If you interrupt it, you'd
+better reset C<LineInfo> to F</dev/tty> if you expect to see anything.)
=over 12
@@ -438,173 +620,65 @@ The TTY to use for debugging I/O.
=item C<noTTY>
-If set, goes in C<NonStop> mode, and would not connect to a TTY. If
-interrupt (or if control goes to debugger via explicit setting of
-$DB::signal or $DB::single from the Perl script), connects to a TTY
-specified by the C<TTY> option at startup, or to a TTY found at
-runtime using C<Term::Rendezvous> module of your choice.
+If set, the debugger goes into C<NonStop> mode and will not connect to a TTY. If
+interrupted (or if control goes to the debugger via explicit setting of
+$DB::signal or $DB::single from the Perl script), it connects to a TTY
+specified in the C<TTY> option at startup, or to a tty found at
+runtime using the C<Term::Rendezvous> module of your choice.
-This module should implement a method C<new> which returns an object
-with two methods: C<IN> and C<OUT>, returning two filehandles to use
-for debugging input and output correspondingly. Method C<new> may
-inspect an argument which is a value of C<$ENV{PERLDB_NOTTY}> at
-startup, or is C<"/tmp/perldbtty$$"> otherwise.
+This module should implement a method named C<new> that returns an object
+with two methods: C<IN> and C<OUT>. These should return filehandles to use
+for debugging input and output correspondingly. The C<new> method should
+inspect an argument containing the value of C<$ENV{PERLDB_NOTTY}> at
+startup, or C<"/tmp/perldbtty$$"> otherwise. This file is not
+inspected for proper ownership, so security hazards are theoretically
+possible.
=item C<ReadLine>
-If false, readline support in debugger is disabled, so you can debug
-ReadLine applications.
+If false, readline support in the debugger is disabled in order
+to debug applications that themselves use ReadLine.
=item C<NonStop>
-If set, debugger goes into noninteractive mode until interrupted, or
+If set, the debugger goes into non-interactive mode until interrupted, or
programmatically by setting $DB::signal or $DB::single.
=back
Here's an example of using the C<$ENV{PERLDB_OPTS}> variable:
- $ PERLDB_OPTS="N f=2" perl -d myprogram
+ $ PERLDB_OPTS="NonStop frame=2" perl -d myprogram
-will run the script C<myprogram> without human intervention, printing
-out the call tree with entry and exit points. Note that C<N f=2> is
-equivalent to C<NonStop=1 frame=2>. Note also that at the moment when
-this documentation was written all the options to the debugger could
-be uniquely abbreviated by the first letter (with exception of
-C<Dump*> options).
+That will run the script B<myprogram> without human intervention,
+printing out the call tree with entry and exit points. Note that
+C<NonStop=1 frame=2> is equivalent to C<N f=2>, and that originally,
+options could be uniquely abbreviated by the first letter (modulo
+the C<Dump*> options). It is nevertheless recommended that you
+always spell them out in full for legibility and future compatibility.
-Other examples may include
+Other examples include
- $ PERLDB_OPTS="N f A L=listing" perl -d myprogram
+ $ PERLDB_OPTS="NonStop frame=2" perl -d myprogram
-- runs script noninteractively, printing info on each entry into a
-subroutine and each executed line into the file F<listing>. (If you
-interrupt it, you would better reset C<LineInfo> to something
+which runs script non-interactively, printing info on each entry
+into a subroutine and each executed line into the file named F<listing>.
+(If you interrupt it, you would better reset C<LineInfo> to something
"interactive"!)
+Other examples include (using standard shell syntax to show environment
+variable settings):
- $ env "PERLDB_OPTS=R=0 TTY=/dev/ttyc" perl -d myprogram
+ $ ( PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out"
+ perl -d myprogram )
-may be useful for debugging a program which uses C<Term::ReadLine>
-itself. Do not forget detach shell from the TTY in the window which
-corresponds to F</dev/ttyc>, say, by issuing a command like
+which may be useful for debugging a program that uses C<Term::ReadLine>
+itself. Do not forget to detach your shell from the TTY in the window that
+corresponds to F</dev/ttyXX>, say, by issuing a command like
$ sleep 1000000
-See L<"Debugger Internals"> below for more details.
-
-=item E<lt> [ command ]
-
-Set an action (Perl command) to happen before every debugger prompt.
-A multi-line command may be entered by backslashing the newlines. If
-C<command> is missing, resets the list of actions.
-
-=item E<lt>E<lt> command
-
-Add an action (Perl command) to happen before every debugger prompt.
-A multi-line command may be entered by backslashing the newlines.
-
-=item E<gt> command
-
-Set an action (Perl command) to happen after the prompt when you've
-just given a command to return to executing the script. A multi-line
-command may be entered by backslashing the newlines. If C<command> is
-missing, resets the list of actions.
-
-=item E<gt>E<gt> command
-
-Adds an action (Perl command) to happen after the prompt when you've
-just given a command to return to executing the script. A multi-line
-command may be entered by backslashing the newlines.
-
-=item { [ command ]
-
-Set an action (debugger command) to happen before every debugger prompt.
-A multi-line command may be entered by backslashing the newlines. If
-C<command> is missing, resets the list of actions.
-
-=item {{ command
-
-Add an action (debugger command) to happen before every debugger prompt.
-A multi-line command may be entered by backslashing the newlines.
-
-=item ! number
-
-Redo a previous command (default previous command).
-
-=item ! -number
-
-Redo number'th-to-last command.
-
-=item ! pattern
-
-Redo last command that started with pattern.
-See C<O recallCommand>, too.
-
-=item !! cmd
-
-Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)
-See C<O shellBang> too.
-
-=item H -number
-
-Display last n commands. Only commands longer than one character are
-listed. If number is omitted, lists them all.
-
-=item q or ^D
-
-Quit. ("quit" doesn't work for this.) This is the only supported way
-to exit the debugger, though typing C<exit> twice may do it too.
-
-Set an C<O>ption C<inhibit_exit> to 0 if you want to be able to I<step
-off> the end the script. You may also need to set C<$finished> to 0 at
-some moment if you want to step through global destruction.
-
-=item R
-
-Restart the debugger by B<exec>ing a new session. It tries to maintain
-your history across this, but internal settings and command line options
-may be lost.
-
-Currently the following setting are preserved: history, breakpoints,
-actions, debugger C<O>ptions, and the following command line
-options: B<-w>, B<-I>, and B<-e>.
-
-=item |dbcmd
-
-Run debugger command, piping DB::OUT to current pager.
-
-=item ||dbcmd
-
-Same as C<|dbcmd> but DB::OUT is temporarily B<select>ed as well.
-Often used with commands that would otherwise produce long
-output, such as
-
- |V main
-
-=item = [alias value]
-
-Define a command alias, like
-
- = quit q
-
-or list current aliases.
-
-=item command
-
-Execute command as a Perl statement. A missing semicolon will be
-supplied.
-
-=item m expr
-
-The expression is evaluated, and the methods which may be applied to
-the result are listed.
-
-=item m package
-
-The methods which may be applied to objects in the C<package> are listed.
-
-=back
+See L<perldebguts/"Debugger Internals"> for details.
=head2 Debugger input/output
@@ -620,19 +694,20 @@ or even
DB<<17>>
-where that number is the command number, which you'd use to access with
-the builtin B<csh>-like history mechanism, e.g., C<!17> would repeat
-command number 17. The number of angle brackets indicates the depth of
-the debugger. You could get more than one set of brackets, for example, if
-you'd already at a breakpoint and then printed out the result of a
-function call that itself also has a breakpoint, or you step into an
-expression via C<s/n/t expression> command.
+where that number is the command number, and which you'd use to
+access with the built-in B<csh>-like history mechanism. For example,
+C<!17> would repeat command number 17. The depth of the angle
+brackets indicates the nesting depth of the debugger. You could
+get more than one set of brackets, for example, if you'd already
+at a breakpoint and then printed the result of a function call that
+itself has a breakpoint, or you step into an expression via C<s/n/t
+expression> command.
=item Multiline commands
If you want to enter a multi-line command, such as a subroutine
-definition with several statements, or a format, you may escape the
-newline that would normally end the debugger command with a backslash.
+definition with several statements or a format, escape the newline
+that would normally end the debugger command with a backslash.
Here's an example:
DB<1> for (1..4) { \
@@ -655,24 +730,26 @@ look like:
@ = Ambulation::legs(1, 2, 3, 4) called from file `camel_flea' line 7
$ = main::pests('bactrian', 4) called from file `camel_flea' line 4
-The left-hand character up there tells whether the function was called
-in a scalar or list context (we bet you can tell which is which). What
-that says is that you were in the function C<main::infested> when you ran
-the stack dump, and that it was called in a scalar context from line 10
-of the file I<Ambulation.pm>, but without any arguments at all, meaning
-it was called as C<&infested>. The next stack frame shows that the
-function C<Ambulation::legs> was called in a list context from the
-I<camel_flea> file with four arguments. The last stack frame shows that
-C<main::pests> was called in a scalar context, also from I<camel_flea>,
-but from line 4.
+The left-hand character up there indicates the context in which the
+function was called, with C<$> and C<@> meaning scalar or list
+contexts respectively, and C<.> meaning void context (which is
+actually a sort of scalar context). The display above says
+that you were in the function C<main::infested> when you ran the
+stack dump, and that it was called in scalar context from line
+10 of the file I<Ambulation.pm>, but without any arguments at all,
+meaning it was called as C<&infested>. The next stack frame shows
+that the function C<Ambulation::legs> was called in list context
+from the I<camel_flea> file with four arguments. The last stack
+frame shows that C<main::pests> was called in scalar context,
+also from I<camel_flea>, but from line 4.
-Note that if you execute C<T> command from inside an active C<use>
-statement, the backtrace will contain both C<require>
-frame and an C<eval>) frame.
+If you execute the C<T> command from inside an active C<use>
+statement, the backtrace will contain both a C<require> frame and
+an C<eval>) frame.
-=item Listing
+=item Line Listing Format
-Listing given via different flavors of C<l> command looks like this:
+This shows the sorts of output the C<l> command can produce:
DB<<13>> l
101: @i{@i} = ();
@@ -686,976 +763,185 @@ Listing given via different flavors of C<l> command looks like this:
109:a if ($extra-- > 0) {
110: %isa = ($pack,1);
-Note that the breakable lines are marked with C<:>, lines with
-breakpoints are marked by C<b>, with actions by C<a>, and the
-next executed line is marked by C<==E<gt>>.
+Breakable lines are marked with C<:>. Lines with breakpoints are
+marked by C<b> and those with actions by C<a>. The line that's
+about to be executed is marked by C<< ==> >>.
=item Frame listing
-When C<frame> option is set, debugger would print entered (and
-optionally exited) subroutines in different styles.
-
-What follows is the start of the listing of
-
- env "PERLDB_OPTS=f=n N" perl -d -V
-
-for different values of C<n>:
-
-=over 4
-
-=item 1
-
- entering main::BEGIN
- entering Config::BEGIN
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- Package lib/Config.pm.
- entering Config::TIEHASH
- entering Exporter::import
- entering Exporter::export
- entering Config::myconfig
- entering Config::FETCH
- entering Config::FETCH
- entering Config::FETCH
- entering Config::FETCH
-
-=item 2
-
- entering main::BEGIN
- entering Config::BEGIN
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- exited Config::BEGIN
- Package lib/Config.pm.
- entering Config::TIEHASH
- exited Config::TIEHASH
- entering Exporter::import
- entering Exporter::export
- exited Exporter::export
- exited Exporter::import
- exited main::BEGIN
- entering Config::myconfig
- entering Config::FETCH
- exited Config::FETCH
- entering Config::FETCH
- exited Config::FETCH
- entering Config::FETCH
-
-=item 4
-
- in $=main::BEGIN() from /dev/nul:0
- in $=Config::BEGIN() from lib/Config.pm:2
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:644
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from li
- in @=Config::myconfig() from /dev/nul:0
- in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'PATCHLEVEL') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'SUBVERSION') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'osname') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'osvers') from lib/Config.pm:574
-
-=item 6
-
- in $=main::BEGIN() from /dev/nul:0
- in $=Config::BEGIN() from lib/Config.pm:2
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- out $=Config::BEGIN() from lib/Config.pm:0
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:644
- out $=Config::TIEHASH('Config') from lib/Config.pm:644
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
- out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
- out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- out $=main::BEGIN() from /dev/nul:0
- in @=Config::myconfig() from /dev/nul:0
- in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
- out $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
- out $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'PATCHLEVEL') from lib/Config.pm:574
- out $=Config::FETCH(ref(Config), 'PATCHLEVEL') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'SUBVERSION') from lib/Config.pm:574
-
-=item 14
-
- in $=main::BEGIN() from /dev/nul:0
- in $=Config::BEGIN() from lib/Config.pm:2
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- out $=Config::BEGIN() from lib/Config.pm:0
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:644
- out $=Config::TIEHASH('Config') from lib/Config.pm:644
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
- out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
- out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- out $=main::BEGIN() from /dev/nul:0
- in @=Config::myconfig() from /dev/nul:0
- in $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
- out $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
- in $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
- out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
-
-=item 30
-
- in $=CODE(0x15eca4)() from /dev/null:0
- in $=CODE(0x182528)() from lib/Config.pm:2
- Package lib/Exporter.pm.
- out $=CODE(0x182528)() from lib/Config.pm:0
- scalar context return from CODE(0x182528): undef
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:628
- out $=Config::TIEHASH('Config') from lib/Config.pm:628
- scalar context return from Config::TIEHASH: empty hash
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
- out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
- scalar context return from Exporter::export: ''
- out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
- scalar context return from Exporter::import: ''
-
-
-=back
-
-In all the cases indentation of lines shows the call tree, if bit 2 of
-C<frame> is set, then a line is printed on exit from a subroutine as
-well, if bit 4 is set, then the arguments are printed as well as the
-caller info, if bit 8 is set, the arguments are printed even if they
-are tied or references, if bit 16 is set, the return value is printed
-as well.
-
-When a package is compiled, a line like this
-
- Package lib/Carp.pm.
-
-is printed with proper indentation.
+When the C<frame> option is set, the debugger would print entered (and
+optionally exited) subroutines in different styles. See L<perldebguts>
+for incredibly long examples of these.
=back
=head2 Debugging compile-time statements
-If you have any compile-time executable statements (code within a BEGIN
-block or a C<use> statement), these will C<NOT> be stopped by debugger,
-although C<require>s will (and compile-time statements can be traced
-with C<AutoTrace> option set in C<PERLDB_OPTS>). From your own Perl
-code, however, you can
+If you have compile-time executable statements (such as code within
+BEGIN and CHECK blocks or C<use> statements), these will I<not> be
+stopped by debugger, although C<require>s and INIT blocks will, and
+compile-time statements can be traced with C<AutoTrace> option set
+in C<PERLDB_OPTS>). From your own Perl code, however, you can
transfer control back to the debugger using the following statement,
which is harmless if the debugger is not running:
$DB::single = 1;
-If you set C<$DB::single> to the value 2, it's equivalent to having
+If you set C<$DB::single> to 2, it's equivalent to having
just typed the C<n> command, whereas a value of 1 means the C<s>
command. The C<$DB::trace> variable should be set to 1 to simulate
having typed the C<t> command.
-Another way to debug compile-time code is to start debugger, set a
-breakpoint on I<load> of some module thusly
+Another way to debug compile-time code is to start the debugger, set a
+breakpoint on the I<load> of some module:
DB<7> b load f:/perllib/lib/Carp.pm
Will stop on load of `f:/perllib/lib/Carp.pm'.
-and restart debugger by C<R> command (if possible). One can use C<b
+and then restart the debugger using the C<R> command (if possible). One can use C<b
compile subname> for the same purpose.
=head2 Debugger Customization
-Most probably you do not want to modify the debugger, it contains enough
-hooks to satisfy most needs. You may change the behaviour of debugger
-from the debugger itself, using C<O>ptions, from the command line via
-C<PERLDB_OPTS> environment variable, and from I<customization files>.
+The debugger probably contains enough configuration hooks that you
+won't ever have to modify it yourself. You may change the behaviour
+of debugger from within the debugger using its C<O> command, from
+the command line via the C<PERLDB_OPTS> environment variable, and
+from customization files.
-You can do some customization by setting up a F<.perldb> file which
+You can do some customization by setting up a F<.perldb> file, which
contains initialization code. For instance, you could make aliases
like these (the last one is one people expect to be there):
$DB::alias{'len'} = 's/^len(.*)/p length($1)/';
$DB::alias{'stop'} = 's/^stop (at|in)/b/';
$DB::alias{'ps'} = 's/^ps\b/p scalar /';
- $DB::alias{'quit'} = 's/^quit(\s*)/exit\$/';
+ $DB::alias{'quit'} = 's/^quit(\s*)/exit/';
-One changes options from F<.perldb> file via calls like this one;
+You can change options from F<.perldb> by using calls like this one;
parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2");
-(the code is executed in the package C<DB>). Note that F<.perldb> is
+The code is executed in the package C<DB>. Note that F<.perldb> is
processed before processing C<PERLDB_OPTS>. If F<.perldb> defines the
-subroutine C<afterinit>, it is called after all the debugger
+subroutine C<afterinit>, that function is called after debugger
initialization ends. F<.perldb> may be contained in the current
-directory, or in the C<LOGDIR>/C<HOME> directory.
+directory, or in the home directory. Because this file is sourced
+in by Perl and may contain arbitrary commands, for security reasons,
+it must be owned by the superuser or the current user, and writable
+by no one but its owner.
-If you want to modify the debugger, copy F<perl5db.pl> from the Perl
-library to another name and modify it as necessary. You'll also want
-to set your C<PERL5DB> environment variable to say something like this:
+If you want to modify the debugger, copy F<perl5db.pl> from the
+Perl library to another name and hack it to your heart's content.
+You'll then want to set your C<PERL5DB> environment variable to say
+something like this:
BEGIN { require "myperl5db.pl" }
-As the last resort, one can use C<PERL5DB> to customize debugger by
-directly setting internal variables or calling debugger functions.
+As a last resort, you could also use C<PERL5DB> to customize the debugger
+by directly setting internal variables or calling debugger functions.
+
+Note that any variables and functions that are not documented in
+this document (or in L<perldebguts>) are considered for internal
+use only, and as such are subject to change without notice.
=head2 Readline Support
-As shipped, the only command line history supplied is a simplistic one
+As shipped, the only command-line history supplied is a simplistic one
that checks for leading exclamation points. However, if you install
the Term::ReadKey and Term::ReadLine modules from CPAN, you will
have full editing capabilities much like GNU I<readline>(3) provides.
Look for these in the F<modules/by-module/Term> directory on CPAN.
+These do not support normal B<vi> command-line editing, however.
-A rudimentary command line completion is also available.
+A rudimentary command-line completion is also available.
Unfortunately, the names of lexical variables are not available for
completion.
=head2 Editor Support for Debugging
-If you have GNU B<emacs> installed on your system, it can interact with
-the Perl debugger to provide an integrated software development
-environment reminiscent of its interactions with C debuggers.
-
-Perl is also delivered with a start file for making B<emacs> act like a
-syntax-directed editor that understands (some of) Perl's syntax. Look in
-the I<emacs> directory of the Perl source distribution.
-
-(Historically, a similar setup for interacting with B<vi> and the
-X11 window system had also been available, but at the time of this
-writing, no debugger support for B<vi> currently exists.)
-
-=head2 The Perl Profiler
-
-If you wish to supply an alternative debugger for Perl to run, just
-invoke your script with a colon and a package argument given to the B<-d>
-flag. One of the most popular alternative debuggers for Perl is
-B<DProf>, the Perl profiler. As of this writing, B<DProf> is not
-included with the standard Perl distribution, but it is expected to
-be included soon, for certain values of "soon".
-
-Meanwhile, you can fetch the Devel::Dprof module from CPAN. Assuming
-it's properly installed on your system, to profile your Perl program in
-the file F<mycode.pl>, just type:
-
- perl -d:DProf mycode.pl
-
-When the script terminates the profiler will dump the profile information
-to a file called F<tmon.out>. A tool like B<dprofpp> (also supplied with
-the Devel::DProf package) can be used to interpret the information which is
-in that profile.
-
-=head2 Debugger support in perl
-
-When you call the B<caller> function (see L<perlfunc/caller>) from the
-package DB, Perl sets the array @DB::args to contain the arguments the
-corresponding stack frame was called with.
-
-If perl is run with B<-d> option, the following additional features
-are enabled (cf. L<perlvar/$^P>):
-
-=over
-
-=item *
-
-Perl inserts the contents of C<$ENV{PERL5DB}> (or C<BEGIN {require
-'perl5db.pl'}> if not present) before the first line of the
-application.
-
-=item *
-
-The array C<@{"_E<lt>$filename"}> is the line-by-line contents of
-$filename for all the compiled files. Same for C<eval>ed strings which
-contain subroutines, or which are currently executed. The C<$filename>
-for C<eval>ed strings looks like C<(eval 34)>.
-
-=item *
-
-The hash C<%{"_E<lt>$filename"}> contains breakpoints and action (it is
-keyed by line number), and individual entries are settable (as opposed
-to the whole hash). Only true/false is important to Perl, though the
-values used by F<perl5db.pl> have the form
-C<"$break_condition\0$action">. Values are magical in numeric context:
-they are zeros if the line is not breakable.
-
-Same for evaluated strings which contain subroutines, or which are
-currently executed. The $filename for C<eval>ed strings looks like
-C<(eval 34)>.
-
-=item *
-
-The scalar C<${"_E<lt>$filename"}> contains C<"_E<lt>$filename">. Same for
-evaluated strings which contain subroutines, or which are currently
-executed. The $filename for C<eval>ed strings looks like C<(eval
-34)>.
-
-=item *
-
-After each C<require>d file is compiled, but before it is executed,
-C<DB::postponed(*{"_E<lt>$filename"})> is called (if subroutine
-C<DB::postponed> exists). Here the $filename is the expanded name of
-the C<require>d file (as found in values of %INC).
-
-=item *
-
-After each subroutine C<subname> is compiled existence of
-C<$DB::postponed{subname}> is checked. If this key exists,
-C<DB::postponed(subname)> is called (if subroutine C<DB::postponed>
-exists).
-
-=item *
-
-A hash C<%DB::sub> is maintained, with keys being subroutine names,
-values having the form C<filename:startline-endline>. C<filename> has
-the form C<(eval 31)> for subroutines defined inside C<eval>s.
-
-=item *
-
-When execution of the application reaches a place that can have
-a breakpoint, a call to C<DB::DB()> is performed if any one of
-variables $DB::trace, $DB::single, or $DB::signal is true. (Note that
-these variables are not C<local>izable.) This feature is disabled when
-the control is inside C<DB::DB()> or functions called from it (unless
-C<$^D & (1E<lt>E<lt>30)>).
-
-=item *
-
-When execution of the application reaches a subroutine call, a call
-to C<&DB::sub>(I<args>) is performed instead, with C<$DB::sub> being
-the name of the called subroutine. (Unless the subroutine is compiled
-in the package C<DB>.)
-
-=back
-
-Note that if C<&DB::sub> needs some external data to be setup for it
-to work, no subroutine call is possible until this is done. For the
-standard debugger C<$DB::deep> (how many levels of recursion deep into
-the debugger you can go before a mandatory break) gives an example of
-such a dependency.
-
-The minimal working debugger consists of one line
-
- sub DB::DB {}
-
-which is quite handy as contents of C<PERL5DB> environment
-variable:
-
- env "PERL5DB=sub DB::DB {}" perl -d your-script
-
-Another (a little bit more useful) minimal debugger can be created
-with the only line being
-
- sub DB::DB {print ++$i; scalar <STDIN>}
-
-This debugger would print the sequential number of encountered
-statement, and would wait for your C<CR> to continue.
-
-The following debugger is quite functional:
-
- {
- package DB;
- sub DB {}
- sub sub {print ++$i, " $sub\n"; &$sub}
- }
-
-It prints the sequential number of subroutine call and the name of the
-called subroutine. Note that C<&DB::sub> should be compiled into the
-package C<DB>.
-
-=head2 Debugger Internals
-
-At the start, the debugger reads your rc file (F<./.perldb> or
-F<~/.perldb> under Unix), which can set important options. This file may
-define a subroutine C<&afterinit> to be executed after the debugger is
-initialized.
-
-After the rc file is read, the debugger reads environment variable
-PERLDB_OPTS and parses it as a rest of C<O ...> line in debugger prompt.
-
-It also maintains magical internal variables, such as C<@DB::dbline>,
-C<%DB::dbline>, which are aliases for C<@{"::_<current_file"}>
-C<%{"::_<current_file"}>. Here C<current_file> is the currently
-selected (with the debugger's C<f> command, or by flow of execution)
-file.
-
-Some functions are provided to simplify customization. See L<"Debugger
-Customization"> for description of C<DB::parse_options(string)>. The
-function C<DB::dump_trace(skip[, count])> skips the specified number
-of frames, and returns a list containing info about the caller
-frames (all if C<count> is missing). Each entry is a hash with keys
-C<context> (C<$> or C<@>), C<sub> (subroutine name, or info about
-eval), C<args> (C<undef> or a reference to an array), C<file>, and
-C<line>.
-
-The function C<DB::print_trace(FH, skip[, count[, short]])> prints
-formatted info about caller frames. The last two functions may be
-convenient as arguments to C<E<lt>>, C<E<lt>E<lt>> commands.
-
-=head2 Other resources
-
-You did try the B<-w> switch, didn't you?
-
-=head2 BUGS
-
-You cannot get the stack frame information or otherwise debug functions
-that were not compiled by Perl, such as C or C++ extensions.
-
-If you alter your @_ arguments in a subroutine (such as with B<shift>
-or B<pop>, the stack backtrace will not show the original values.
-
-=head1 Debugging Perl memory usage
-
-Perl is I<very> frivolous with memory. There is a saying that to
-estimate memory usage of Perl, assume a reasonable algorithm of
-allocation, and multiply your estimates by 10. This is not absolutely
-true, but may give you a good grasp of what happens.
-
-Say, an integer cannot take less than 20 bytes of memory, a float
-cannot take less than 24 bytes, a string cannot take less than 32
-bytes (all these examples assume 32-bit architectures, the result are
-much worse on 64-bit architectures). If a variable is accessed in two
-of three different ways (which require an integer, a float, or a
-string), the memory footprint may increase by another 20 bytes. A
-sloppy malloc() implementation will make these numbers yet more.
-
-On the opposite end of the scale, a declaration like
-
- sub foo;
-
-may take (on some versions of perl) up to 500 bytes of memory.
-
-Off-the-cuff anecdotal estimates of a code bloat give a factor around
-8. This means that the compiled form of reasonable (commented
-indented etc.) code will take approximately 8 times more than the
-disk space the code takes.
-
-There are two Perl-specific ways to analyze the memory usage:
-$ENV{PERL_DEBUG_MSTATS} and B<-DL> switch. First one is available
-only if perl is compiled with Perl's malloc(), the second one only if
-Perl compiled with C<-DDEBUGGING> (as with giving C<-D optimise=-g>
-option to F<Configure>).
-
-=head2 Using C<$ENV{PERL_DEBUG_MSTATS}>
-
-If your perl is using Perl's malloc(), and compiled with correct
-switches (this is the default), then it will print memory usage
-statistics after compiling your code (if C<$ENV{PERL_DEBUG_MSTATS}> >
-1), and before termination of the script (if
-C<$ENV{PERL_DEBUG_MSTATS}> >= 1). The report format is similar to one
-in the following example:
-
- env PERL_DEBUG_MSTATS=2 perl -e "require Carp"
- Memory allocation statistics after compilation: (buckets 4(4)..8188(8192)
- 14216 free: 130 117 28 7 9 0 2 2 1 0 0
- 437 61 36 0 5
- 60924 used: 125 137 161 55 7 8 6 16 2 0 1
- 74 109 304 84 20
- Total sbrk(): 77824/21:119. Odd ends: pad+heads+chain+tail: 0+636+0+2048.
- Memory allocation statistics after execution: (buckets 4(4)..8188(8192)
- 30888 free: 245 78 85 13 6 2 1 3 2 0 1
- 315 162 39 42 11
- 175816 used: 265 176 1112 111 26 22 11 27 2 1 1
- 196 178 1066 798 39
- Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144.
-
-It is possible to ask for such a statistic at arbitrary moment by
-using Devel::Peek::mstats() (module Devel::Peek is available on CPAN).
-
-Here is the explanation of different parts of the format:
-
-=over
-
-=item C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>
-
-Perl's malloc() uses bucketed allocations. Every request is rounded
-up to the closest bucket size available, and a bucket of these size is
-taken from the pool of the buckets of this size.
-
-The above line describes limits of buckets currently in use. Each
-bucket has two sizes: memory footprint, and the maximal size of user
-data which may be put into this bucket. Say, in the above example the
-smallest bucket is both sizes 4. The biggest bucket has usable size
-8188, and the memory footprint 8192.
+If you have the FSF's version of B<emacs> installed on your system,
+it can interact with the Perl debugger to provide an integrated
+software development environment reminiscent of its interactions
+with C debuggers.
-With debugging Perl some buckets may have negative usable size. This
-means that these buckets cannot (and will not) be used. For greater
-buckets the memory footprint may be one page greater than a power of
-2. In such a case the corresponding power of two is printed instead
-in the C<APPROX> field above.
+Perl comes with a start file for making B<emacs> act like a
+syntax-directed editor that understands (some of) Perl's syntax.
+Look in the I<emacs> directory of the Perl source distribution.
-=item Free/Used
+A similar setup by Tom Christiansen for interacting with any
+vendor-shipped B<vi> and the X11 window system is also available.
+This works similarly to the integrated multiwindow support that
+B<emacs> provides, where the debugger drives the editor. At the
+time of this writing, however, that tool's eventual location in the
+Perl distribution was uncertain.
-The following 1 or 2 rows of numbers correspond to the number of
-buckets of each size between C<SMALLEST> and C<GREATEST>. In the
-first row the sizes (memory footprints) of buckets are powers of two
-(or possibly one page greater). In the second row (if present) the
-memory footprints of the buckets are between memory footprints of two
-buckets "above".
+Users of B<vi> should also look into B<vim> and B<gvim>, the mousey
+and windy version, for coloring of Perl keywords.
-Say, with the above example the memory footprints are (with current
-algorithm)
+Note that only perl can truly parse Perl, so all such CASE tools
+fall somewhat short of the mark, especially if you don't program
+your Perl as a C programmer might.
- free: 8 16 32 64 128 256 512 1024 2048 4096 8192
- 4 12 24 48 80
-
-With non-C<DEBUGGING> perl the buckets starting from C<128>-long ones
-have 4-byte overhead, thus 8192-long bucket may take up to
-8188-byte-long allocations.
-
-=item C<Total sbrk(): SBRKed/SBRKs:CONTINUOUS>
-
-The first two fields give the total amount of memory perl sbrk()ed,
-and number of sbrk()s used. The third number is what perl thinks
-about continuity of returned chunks. As far as this number is
-positive, malloc() will assume that it is probable that sbrk() will
-provide continuous memory.
-
-The amounts sbrk()ed by external libraries is not counted.
-
-=item C<pad: 0>
-
-The amount of sbrk()ed memory needed to keep buckets aligned.
-
-=item C<heads: 2192>
-
-While memory overhead of bigger buckets is kept inside the bucket, for
-smaller buckets it is kept in separate areas. This field gives the
-total size of these areas.
-
-=item C<chain: 0>
-
-malloc() may want to subdivide a bigger bucket into smaller buckets.
-If only a part of the deceased-bucket is left non-subdivided, the rest
-is kept as an element of a linked list. This field gives the total
-size of these chunks.
-
-=item C<tail: 6144>
-
-To minimize amount of sbrk()s malloc() asks for more memory. This
-field gives the size of the yet-unused part, which is sbrk()ed, but
-never touched.
-
-=back
-
-=head2 Example of using B<-DL> switch
-
-Below we show how to analyse memory usage by
-
- do 'lib/auto/POSIX/autosplit.ix';
-
-The file in question contains a header and 146 lines similar to
-
- sub getcwd ;
-
-B<Note:> I<the discussion below supposes 32-bit architecture. In the
-newer versions of perl the memory usage of the constructs discussed
-here is much improved, but the story discussed below is a real-life
-story. This story is very terse, and assumes more than cursory
-knowledge of Perl internals.>
-
-Here is the itemized list of Perl allocations performed during parsing
-of this file:
-
- !!! "after" at test.pl line 3.
- Id subtot 4 8 12 16 20 24 28 32 36 40 48 56 64 72 80 80+
- 0 02 13752 . . . . 294 . . . . . . . . . . 4
- 0 54 5545 . . 8 124 16 . . . 1 1 . . . . . 3
- 5 05 32 . . . . . . . 1 . . . . . . . .
- 6 02 7152 . . . . . . . . . . 149 . . . . .
- 7 02 3600 . . . . . 150 . . . . . . . . . .
- 7 03 64 . -1 . 1 . . 2 . . . . . . . . .
- 7 04 7056 . . . . . . . . . . . . . . . 7
- 7 17 38404 . . . . . . . 1 . . 442 149 . . 147 .
- 9 03 2078 17 249 32 . . . . 2 . . . . . . . .
-
-
-To see this list insert two C<warn('!...')> statements around the call:
-
- warn('!');
- do 'lib/auto/POSIX/autosplit.ix';
- warn('!!! "after"');
-
-and run it with B<-DL> option. The first warn() will print memory
-allocation info before the parsing of the file, and will memorize the
-statistics at this point (we ignore what it prints). The second warn()
-will print increments w.r.t. this memorized statistics. This is the
-above printout.
-
-Different I<Id>s on the left correspond to different subsystems of
-perl interpreter, they are just first argument given to perl memory
-allocation API New(). To find what C<9 03> means C<grep> the perl
-source for C<903>. You will see that it is F<util.c>, function
-savepvn(). This function is used to store a copy of existing chunk of
-memory. Using C debugger, one can see that it is called either
-directly from gv_init(), or via sv_magic(), and gv_init() is called
-from gv_fetchpv() - which is called from newSUB().
-
-B<Note:> to reach this place in debugger and skip all the calls to
-savepvn during the compilation of the main script, set a C breakpoint
-in Perl_warn(), C<continue> this point is reached, I<then> set
-breakpoint in Perl_savepvn(). Note that you may need to skip a
-handful of Perl_savepvn() which do not correspond to mass production
-of CVs (there are more C<903> allocations than 146 similar lines of
-F<lib/auto/POSIX/autosplit.ix>). Note also that C<Perl_> prefixes are
-added by macroization code in perl header files to avoid conflicts
-with external libraries.
-
-Anyway, we see that C<903> ids correspond to creation of globs, twice
-per glob - for glob name, and glob stringification magic.
-
-Here are explanations for other I<Id>s above:
-
-=over
-
-=item C<717>
-
-is for creation of bigger C<XPV*> structures. In the above case it
-creates 3 C<AV> per subroutine, one for a list of lexical variable
-names, one for a scratchpad (which contains lexical variables and
-C<targets>), and one for the array of scratchpads needed for
-recursion.
-
-It also creates a C<GV> and a C<CV> per subroutine (all called from
-start_subparse()).
-
-=item C<002>
-
-Creates C array corresponding to the C<AV> of scratchpads, and the
-scratchpad itself (the first fake entry of this scratchpad is created
-though the subroutine itself is not defined yet).
-
-It also creates C arrays to keep data for the stash (this is one HV,
-but it grows, thus there are 4 big allocations: the big chunks are not
-freed, but are kept as additional arenas for C<SV> allocations).
-
-=item C<054>
-
-creates a C<HEK> for the name of the glob for the subroutine (this
-name is a key in a I<stash>).
-
-Big allocations with this I<Id> correspond to allocations of new
-arenas to keep C<HE>.
-
-=item C<602>
-
-creates a C<GP> for the glob for the subroutine.
-
-=item C<702>
-
-creates the C<MAGIC> for the glob for the subroutine.
-
-=item C<704>
-
-creates I<arenas> which keep SVs.
-
-=back
-
-=head2 B<-DL> details
-
-If Perl is run with B<-DL> option, then warn()s which start with `!'
-behave specially. They print a list of I<categories> of memory
-allocations, and statistics of allocations of different sizes for
-these categories.
-
-If warn() string starts with
-
-=over
-
-=item C<!!!>
-
-print changed categories only, print the differences in counts of allocations;
-
-=item C<!!>
-
-print grown categories only; print the absolute values of counts, and totals;
-
-=item C<!>
-
-print nonempty categories, print the absolute values of counts and totals.
+=head2 The Perl Profiler
-=back
+If you wish to supply an alternative debugger for Perl to run, just
+invoke your script with a colon and a package argument given to the
+B<-d> flag. The most popular alternative debuggers for Perl is the
+Perl profiler. Devel::DProf is now included with the standard Perl
+distribution. To profile your Perl program in the file F<mycode.pl>,
+just type:
-=head2 Limitations of B<-DL> statistic
+ $ perl -d:DProf mycode.pl
-If an extension or an external library does not use Perl API to
-allocate memory, these allocations are not counted.
+When the script terminates the profiler will dump the profile
+information to a file called F<tmon.out>. A tool like B<dprofpp>,
+also supplied with the standard Perl distribution, can be used to
+interpret the information in that profile.
=head1 Debugging regular expressions
-There are two ways to enable debugging output for regular expressions.
-
-If your perl is compiled with C<-DDEBUGGING>, you may use the
-B<-Dr> flag on the command line.
-
-Otherwise, one can C<use re 'debug'>, which has effects both at
-compile time, and at run time (and is I<not> lexically scoped).
-
-=head2 Compile-time output
-
-The debugging output for the compile time looks like this:
-
- compiling RE `[bc]d(ef*g)+h[ij]k$'
- size 43 first at 1
- 1: ANYOF(11)
- 11: EXACT <d>(13)
- 13: CURLYX {1,32767}(27)
- 15: OPEN1(17)
- 17: EXACT <e>(19)
- 19: STAR(22)
- 20: EXACT <f>(0)
- 22: EXACT <g>(24)
- 24: CLOSE1(26)
- 26: WHILEM(0)
- 27: NOTHING(28)
- 28: EXACT <h>(30)
- 30: ANYOF(40)
- 40: EXACT <k>(42)
- 42: EOL(43)
- 43: END(0)
- anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating)
- stclass `ANYOF' minlen 7
+C<use re 'debug'> enables you to see the gory details of how the
+Perl regular expression engine works. In order to understand this
+typically voluminous output, one must not only have some idea about
+about how regular expression matching works in general, but also
+know how Perl's regular expressions are internally compiled into
+an automaton. These matters are explored in some detail in
+L<perldebguts/"Debugging regular expressions">.
-The first line shows the pre-compiled form of the regexp, and the
-second shows the size of the compiled form (in arbitrary units,
-usually 4-byte words) and the label I<id> of the first node which
-does a match.
+=head1 Debugging memory usage
-The last line (split into two lines in the above) contains the optimizer
-info. In the example shown, the optimizer found that the match
-should contain a substring C<de> at the offset 1, and substring C<gh>
-at some offset between 3 and infinity. Moreover, when checking for
-these substrings (to abandon impossible matches quickly) it will check
-for the substring C<gh> before checking for the substring C<de>. The
-optimizer may also use the knowledge that the match starts (at the
-C<first> I<id>) with a character class, and the match cannot be
-shorter than 7 chars.
+Perl contains internal support for reporting its own memory usage,
+but this is a fairly advanced concept that requires some understanding
+of how memory allocation works.
+See L<perldebguts/"Debugging Perl memory usage"> for the details.
-The fields of interest which may appear in the last line are
+=head1 SEE ALSO
-=over
-
-=item C<anchored> I<STRING> C<at> I<POS>
-
-=item C<floating> I<STRING> C<at> I<POS1..POS2>
-
-see above;
-
-=item C<matching floating/anchored>
-
-which substring to check first;
-
-=item C<minlen>
-
-the minimal length of the match;
-
-=item C<stclass> I<TYPE>
-
-The type of the first matching node.
-
-=item C<noscan>
-
-which advises to not scan for the found substrings;
-
-=item C<isall>
-
-which says that the optimizer info is in fact all that the regular
-expression contains (thus one does not need to enter the RE engine at
-all);
-
-=item C<GPOS>
-
-if the pattern contains C<\G>;
-
-=item C<plus>
-
-if the pattern starts with a repeated char (as in C<x+y>);
-
-=item C<implicit>
-
-if the pattern starts with C<.*>;
+You did try the B<-w> switch, didn't you?
-=item C<with eval>
+L<perldebguts>,
+L<re>,
+L<DB>,
+L<Devel::Dprof>,
+L<dprofpp>,
+L<Dumpvalue>,
+and
+L<perlrun>.
-if the pattern contain eval-groups (see L<perlre/(?{ code })>);
+=head1 BUGS
-=item C<anchored(TYPE)>
+You cannot get stack frame information or in any fashion debug functions
+that were not compiled by Perl, such as those from C or C++ extensions.
-if the pattern may
-match only at a handful of places (with C<TYPE> being
-C<BOL>, C<MBOL>, or C<GPOS>, see the table below).
+If you alter your @_ arguments in a subroutine (such as with C<shift>
+or C<pop>, the stack backtrace will not show the original values.
-=back
+The debugger does not currently work in conjunction with the B<-W>
+command-line switch, because it itself is not free of warnings.
-If a substring is known to match at end-of-line only, it may be
-followed by C<$>, as in C<floating `k'$>.
-
-The optimizer-specific info is used to avoid entering (a slow) RE
-engine on strings which will definitely not match. If C<isall> flag
-is set, a call to the RE engine may be avoided even when optimizer
-found an appropriate place for the match.
-
-The rest of the output contains the list of I<nodes> of the compiled
-form of the RE. Each line has format
-
-C< >I<id>: I<TYPE> I<OPTIONAL-INFO> (I<next-id>)
-
-=head2 Types of nodes
-
-Here is the list of possible types with short descriptions:
-
- # TYPE arg-description [num-args] [longjump-len] DESCRIPTION
-
- # Exit points
- END no End of program.
- SUCCEED no Return from a subroutine, basically.
-
- # Anchors:
- BOL no Match "" at beginning of line.
- MBOL no Same, assuming multiline.
- SBOL no Same, assuming singleline.
- EOS no Match "" at end of string.
- EOL no Match "" at end of line.
- MEOL no Same, assuming multiline.
- SEOL no Same, assuming singleline.
- BOUND no Match "" at any word boundary
- BOUNDL no Match "" at any word boundary
- NBOUND no Match "" at any word non-boundary
- NBOUNDL no Match "" at any word non-boundary
- GPOS no Matches where last m//g left off.
-
- # [Special] alternatives
- ANY no Match any one character (except newline).
- SANY no Match any one character.
- ANYOF sv Match character in (or not in) this class.
- ALNUM no Match any alphanumeric character
- ALNUML no Match any alphanumeric char in locale
- NALNUM no Match any non-alphanumeric character
- NALNUML no Match any non-alphanumeric char in locale
- SPACE no Match any whitespace character
- SPACEL no Match any whitespace char in locale
- NSPACE no Match any non-whitespace character
- NSPACEL no Match any non-whitespace char in locale
- DIGIT no Match any numeric character
- NDIGIT no Match any non-numeric character
-
- # BRANCH The set of branches constituting a single choice are hooked
- # together with their "next" pointers, since precedence prevents
- # anything being concatenated to any individual branch. The
- # "next" pointer of the last BRANCH in a choice points to the
- # thing following the whole choice. This is also where the
- # final "next" pointer of each individual branch points; each
- # branch starts with the operand node of a BRANCH node.
- #
- BRANCH node Match this alternative, or the next...
-
- # BACK Normal "next" pointers all implicitly point forward; BACK
- # exists to make loop structures possible.
- # not used
- BACK no Match "", "next" ptr points backward.
-
- # Literals
- EXACT sv Match this string (preceded by length).
- EXACTF sv Match this string, folded (prec. by length).
- EXACTFL sv Match this string, folded in locale (w/len).
-
- # Do nothing
- NOTHING no Match empty string.
- # A variant of above which delimits a group, thus stops optimizations
- TAIL no Match empty string. Can jump here from outside.
-
- # STAR,PLUS '?', and complex '*' and '+', are implemented as circular
- # BRANCH structures using BACK. Simple cases (one character
- # per match) are implemented with STAR and PLUS for speed
- # and to minimize recursive plunges.
- #
- STAR node Match this (simple) thing 0 or more times.
- PLUS node Match this (simple) thing 1 or more times.
-
- CURLY sv 2 Match this simple thing {n,m} times.
- CURLYN no 2 Match next-after-this simple thing
- # {n,m} times, set parenths.
- CURLYM no 2 Match this medium-complex thing {n,m} times.
- CURLYX sv 2 Match this complex thing {n,m} times.
-
- # This terminator creates a loop structure for CURLYX
- WHILEM no Do curly processing and see if rest matches.
-
- # OPEN,CLOSE,GROUPP ...are numbered at compile time.
- OPEN num 1 Mark this point in input as start of #n.
- CLOSE num 1 Analogous to OPEN.
-
- REF num 1 Match some already matched string
- REFF num 1 Match already matched string, folded
- REFFL num 1 Match already matched string, folded in loc.
-
- # grouping assertions
- IFMATCH off 1 2 Succeeds if the following matches.
- UNLESSM off 1 2 Fails if the following matches.
- SUSPEND off 1 1 "Independent" sub-RE.
- IFTHEN off 1 1 Switch, should be preceeded by switcher .
- GROUPP num 1 Whether the group matched.
-
- # Support for long RE
- LONGJMP off 1 1 Jump far away.
- BRANCHJ off 1 1 BRANCH with long offset.
-
- # The heavy worker
- EVAL evl 1 Execute some Perl code.
-
- # Modifiers
- MINMOD no Next operator is not greedy.
- LOGICAL no Next opcode should set the flag only.
-
- # This is not used yet
- RENUM off 1 1 Group with independently numbered parens.
-
- # This is not really a node, but an optimized away piece of a "long" node.
- # To simplify debugging output, we mark it as if it were a node
- OPTIMIZED off Placeholder for dump.
-
-=head2 Run-time output
-
-First of all, when doing a match, one may get no run-time output even
-if debugging is enabled. this means that the RE engine was never
-entered, all of the job was done by the optimizer.
-
-If RE engine was entered, the output may look like this:
-
- Matching `[bc]d(ef*g)+h[ij]k$' against `abcdefg__gh__'
- Setting an EVAL scope, savestack=3
- 2 <ab> <cdefg__gh_> | 1: ANYOF
- 3 <abc> <defg__gh_> | 11: EXACT <d>
- 4 <abcd> <efg__gh_> | 13: CURLYX {1,32767}
- 4 <abcd> <efg__gh_> | 26: WHILEM
- 0 out of 1..32767 cc=effff31c
- 4 <abcd> <efg__gh_> | 15: OPEN1
- 4 <abcd> <efg__gh_> | 17: EXACT <e>
- 5 <abcde> <fg__gh_> | 19: STAR
- EXACT <f> can match 1 times out of 32767...
- Setting an EVAL scope, savestack=3
- 6 <bcdef> <g__gh__> | 22: EXACT <g>
- 7 <bcdefg> <__gh__> | 24: CLOSE1
- 7 <bcdefg> <__gh__> | 26: WHILEM
- 1 out of 1..32767 cc=effff31c
- Setting an EVAL scope, savestack=12
- 7 <bcdefg> <__gh__> | 15: OPEN1
- 7 <bcdefg> <__gh__> | 17: EXACT <e>
- restoring \1 to 4(4)..7
- failed, try continuation...
- 7 <bcdefg> <__gh__> | 27: NOTHING
- 7 <bcdefg> <__gh__> | 28: EXACT <h>
- failed...
- failed...
-
-The most significant information in the output is about the particular I<node>
-of the compiled RE which is currently being tested against the target string.
-The format of these lines is
-
-C< >I<STRING-OFFSET> <I<PRE-STRING>> <I<POST-STRING>> |I<ID>: I<TYPE>
-
-The I<TYPE> info is indented with respect to the backtracking level.
-Other incidental information appears interspersed within.
-
-=cut
+If you're in a slow syscall (like C<wait>ing, C<accept>ing, or C<read>ing
+from your keyboard or a socket) and haven't set up your own C<$SIG{INT}>
+handler, then you won't be able to CTRL-C your way back to the debugger,
+because the debugger's own C<$SIG{INT}> handler doesn't understand that
+it needs to raise an exception to longjmp(3) out of slow syscalls.
diff --git a/contrib/perl5/pod/perldelta.pod b/contrib/perl5/pod/perldelta.pod
index a0af1e1..4a1a142 100644
--- a/contrib/perl5/pod/perldelta.pod
+++ b/contrib/perl5/pod/perldelta.pod
@@ -1,983 +1,2916 @@
=head1 NAME
-perldelta - what's new for perl5.005
+perldelta - what's new for perl v5.6.0
=head1 DESCRIPTION
-This document describes differences between the 5.004 release and this one.
+This document describes differences between the 5.005 release and this one.
-=head1 About the new versioning system
+=head1 Core Enhancements
+
+=head2 Interpreter cloning, threads, and concurrency
+
+Perl 5.005_63 introduces the beginnings of support for running multiple
+interpreters concurrently in different threads. In conjunction with
+the perl_clone() API call, which can be used to selectively duplicate
+the state of any given interpreter, it is possible to compile a
+piece of code once in an interpreter, clone that interpreter
+one or more times, and run all the resulting interpreters in distinct
+threads.
+
+On the Windows platform, this feature is used to emulate fork() at the
+interpreter level. See L<perlfork> for details about that.
+
+This feature is still in evolution. It is eventually meant to be used
+to selectively clone a subroutine and data reachable from that
+subroutine in a separate interpreter and run the cloned subroutine
+in a separate thread. Since there is no shared data between the
+interpreters, little or no locking will be needed (unless parts of
+the symbol table are explicitly shared). This is obviously intended
+to be an easy-to-use replacement for the existing threads support.
+
+Support for cloning interpreters and interpreter concurrency can be
+enabled using the -Dusethreads Configure option (see win32/Makefile for
+how to enable it on Windows.) The resulting perl executable will be
+functionally identical to one that was built with -Dmultiplicity, but
+the perl_clone() API call will only be available in the former.
+
+-Dusethreads enables the cpp macro USE_ITHREADS by default, which in turn
+enables Perl source code changes that provide a clear separation between
+the op tree and the data it operates with. The former is immutable, and
+can therefore be shared between an interpreter and all of its clones,
+while the latter is considered local to each interpreter, and is therefore
+copied for each clone.
+
+Note that building Perl with the -Dusemultiplicity Configure option
+is adequate if you wish to run multiple B<independent> interpreters
+concurrently in different threads. -Dusethreads only provides the
+additional functionality of the perl_clone() API call and other
+support for running B<cloned> interpreters concurrently.
+
+ NOTE: This is an experimental feature. Implementation details are
+ subject to change.
+
+=head2 Lexically scoped warning categories
+
+You can now control the granularity of warnings emitted by perl at a finer
+level using the C<use warnings> pragma. L<warnings> and L<perllexwarn>
+have copious documentation on this feature.
+
+=head2 Unicode and UTF-8 support
+
+Perl now uses UTF-8 as its internal representation for character
+strings. The C<utf8> and C<bytes> pragmas are used to control this support
+in the current lexical scope. See L<perlunicode>, L<utf8> and L<bytes> for
+more information.
+
+This feature is expected to evolve quickly to support some form of I/O
+disciplines that can be used to specify the kind of input and output data
+(bytes or characters). Until that happens, additional modules from CPAN
+will be needed to complete the toolkit for dealing with Unicode.
+
+ NOTE: This should be considered an experimental feature. Implementation
+ details are subject to change.
+
+=head2 Support for interpolating named characters
+
+The new C<\N> escape interpolates named characters within strings.
+For example, C<"Hi! \N{WHITE SMILING FACE}"> evaluates to a string
+with a unicode smiley face at the end.
+
+=head2 "our" declarations
+
+An "our" declaration introduces a value that can be best understood
+as a lexically scoped symbolic alias to a global variable in the
+package that was current where the variable was declared. This is
+mostly useful as an alternative to the C<vars> pragma, but also provides
+the opportunity to introduce typing and other attributes for such
+variables. See L<perlfunc/our>.
+
+=head2 Support for strings represented as a vector of ordinals
+
+Literals of the form C<v1.2.3.4> are now parsed as a string composed
+of characters with the specified ordinals. This is an alternative, more
+readable way to construct (possibly unicode) strings instead of
+interpolating characters, as in C<"\x{1}\x{2}\x{3}\x{4}">. The leading
+C<v> may be omitted if there are more than two ordinals, so C<1.2.3> is
+parsed the same as C<v1.2.3>.
+
+Strings written in this form are also useful to represent version "numbers".
+It is easy to compare such version "numbers" (which are really just plain
+strings) using any of the usual string comparison operators C<eq>, C<ne>,
+C<lt>, C<gt>, etc., or perform bitwise string operations on them using C<|>,
+C<&>, etc.
+
+In conjunction with the new C<$^V> magic variable (which contains
+the perl version as a string), such literals can be used as a readable way
+to check if you're running a particular version of Perl:
+
+ # this will parse in older versions of Perl also
+ if ($^V and $^V gt v5.6.0) {
+ # new features supported
+ }
-Perl is now developed on two tracks: a maintenance track that makes
-small, safe updates to released production versions with emphasis on
-compatibility; and a development track that pursues more aggressive
-evolution. Maintenance releases (which should be considered production
-quality) have subversion numbers that run from C<1> to C<49>, and
-development releases (which should be considered "alpha" quality) run
-from C<50> to C<99>.
+C<require> and C<use> also have some special magic to support such literals.
+They will be interpreted as a version rather than as a module name:
-Perl 5.005 is the combined product of the new dual-track development
-scheme.
+ require v5.6.0; # croak if $^V lt v5.6.0
+ use v5.6.0; # same, but croaks at compile-time
-=head1 Incompatible Changes
+Alternatively, the C<v> may be omitted if there is more than one dot:
+
+ require 5.6.0;
+ use 5.6.0;
+
+Also, C<sprintf> and C<printf> support the Perl-specific format flag C<%v>
+to print ordinals of characters in arbitrary strings:
+
+ printf "v%vd", $^V; # prints current version, such as "v5.5.650"
+ printf "%*vX", ":", $addr; # formats IPv6 address
+ printf "%*vb", " ", $bits; # displays bitstring
+
+See L<perldata/"Scalar value constructors"> for additional information.
+
+=head2 Improved Perl version numbering system
+
+Beginning with Perl version 5.6.0, the version number convention has been
+changed to a "dotted integer" scheme that is more commonly found in open
+source projects.
+
+Maintenance versions of v5.6.0 will be released as v5.6.1, v5.6.2 etc.
+The next development series following v5.6.0 will be numbered v5.7.x,
+beginning with v5.7.0, and the next major production release following
+v5.6.0 will be v5.8.0.
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value). (This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.)
+
+The v1.2.3 syntax is also now legal in Perl.
+See L<Support for strings represented as a vector of ordinals> for more on that.
-=head2 WARNING: This version is not binary compatible with Perl 5.004.
+To cope with the new versioning system's use of at least three significant
+digits for each version component, the method used for incrementing the
+subversion number has also changed slightly. We assume that versions older
+than v5.6.0 have been incrementing the subversion component in multiples of
+10. Versions after v5.6.0 will increment them by 1. Thus, using the new
+notation, 5.005_03 is the "same" as v5.5.30, and the first maintenance
+version following v5.6.0 will be v5.6.1 (which should be read as being
+equivalent to a floating point value of 5.006_001 in the older format,
+stored in C<$]>).
-Starting with Perl 5.004_50 there were many deep and far-reaching changes
-to the language internals. If you have dynamically loaded extensions
-that you built under perl 5.003 or 5.004, you can continue to use them
-with 5.004, but you will need to rebuild and reinstall those extensions
-to use them 5.005. See L<INSTALL> for detailed instructions on how to
-upgrade.
+=head2 New syntax for declaring subroutine attributes
-=head2 Default installation structure has changed
+Formerly, if you wanted to mark a subroutine as being a method call or
+as requiring an automatic lock() when it is entered, you had to declare
+that with a C<use attrs> pragma in the body of the subroutine.
+That can now be accomplished with declaration syntax, like this:
-The new Configure defaults are designed to allow a smooth upgrade from
-5.004 to 5.005, but you should read L<INSTALL> for a detailed
-discussion of the changes in order to adapt them to your system.
+ sub mymethod : locked method ;
+ ...
+ sub mymethod : locked method {
+ ...
+ }
+
+ sub othermethod :locked :method ;
+ ...
+ sub othermethod :locked :method {
+ ...
+ }
+
+
+(Note how only the first C<:> is mandatory, and whitespace surrounding
+the C<:> is optional.)
+
+F<AutoSplit.pm> and F<SelfLoader.pm> have been updated to keep the attributes
+with the stubs they provide. See L<attributes>.
-=head2 Perl Source Compatibility
+=head2 File and directory handles can be autovivified
+
+Similar to how constructs such as C<< $x->[0] >> autovivify a reference,
+handle constructors (open(), opendir(), pipe(), socketpair(), sysopen(),
+socket(), and accept()) now autovivify a file or directory handle
+if the handle passed to them is an uninitialized scalar variable. This
+allows the constructs such as C<open(my $fh, ...)> and C<open(local $fh,...)>
+to be used to create filehandles that will conveniently be closed
+automatically when the scope ends, provided there are no other references
+to them. This largely eliminates the need for typeglobs when opening
+filehandles that must be passed around, as in the following example:
+
+ sub myopen {
+ open my $fh, "@_"
+ or die "Can't open '@_': $!";
+ return $fh;
+ }
+
+ {
+ my $f = myopen("</etc/motd");
+ print <$f>;
+ # $f implicitly closed here
+ }
-When none of the experimental features are enabled, there should be
-very few user-visible Perl source compatibility issues.
+=head2 open() with more than two arguments
-If threads are enabled, then some caveats apply. C<@_> and C<$_> become
-lexical variables. The effect of this should be largely transparent to
-the user, but there are some boundary conditions under which user will
-need to be aware of the issues. For example, C<local(@_)> results in
-a "Can't localize lexical variable @_ ..." message. This may be enabled
-in a future version.
+If open() is passed three arguments instead of two, the second argument
+is used as the mode and the third argument is taken to be the file name.
+This is primarily useful for protecting against unintended magic behavior
+of the traditional two-argument form. See L<perlfunc/open>.
-Some new keywords have been introduced. These are generally expected to
-have very little impact on compatibility. See L<New C<INIT> keyword>,
-L<New C<lock> keyword>, and L<New C<qr//> operator>.
+=head2 64-bit support
-Certain barewords are now reserved. Use of these will provoke a warning
-if you have asked for them with the C<-w> switch.
-See L<C<our> is now a reserved word>.
+Any platform that has 64-bit integers either
-=head2 C Source Compatibility
+ (1) natively as longs or ints
+ (2) via special compiler flags
+ (3) using long long or int64_t
-There have been a large number of changes in the internals to support
-the new features in this release.
+is able to use "quads" (64-bit integers) as follows:
=over 4
-=item Core sources now require ANSI C compiler
+=item *
-An ANSI C compiler is now B<required> to build perl. See F<INSTALL>.
+constants (decimal, hexadecimal, octal, binary) in the code
-=item All Perl global variables must now be referenced with an explicit prefix
+=item *
-All Perl global variables that are visible for use by extensions now
-have a C<PL_> prefix. New extensions should C<not> refer to perl globals
-by their unqualified names. To preserve sanity, we provide limited
-backward compatibility for globals that are being widely used like
-C<sv_undef> and C<na> (which should now be written as C<PL_sv_undef>,
-C<PL_na> etc.)
+arguments to oct() and hex()
-If you find that your XS extension does not compile anymore because a
-perl global is not visible, try adding a C<PL_> prefix to the global
-and rebuild.
+=item *
-It is strongly recommended that all functions in the Perl API that don't
-begin with C<perl> be referenced with a C<Perl_> prefix. The bare function
-names without the C<Perl_> prefix are supported with macros, but this
-support may cease in a future release.
+arguments to print(), printf() and sprintf() (flag prefixes ll, L, q)
-See L<perlguts/"API LISTING">.
+=item *
-=item Enabling threads has source compatibility issues
+printed as such
-Perl built with threading enabled requires extensions to use the new
-C<dTHR> macro to initialize the handle to access per-thread data.
-If you see a compiler error that talks about the variable C<thr> not
-being declared (when building a module that has XS code), you need
-to add C<dTHR;> at the beginning of the block that elicited the error.
+=item *
-The API function C<perl_get_sv("@",FALSE)> should be used instead of
-directly accessing perl globals as C<GvSV(errgv)>. The API call is
-backward compatible with existing perls and provides source compatibility
-with threading is enabled.
+pack() and unpack() "q" and "Q" formats
-See L<"C Source Compatibility"> for more information.
+=item *
+
+in basic arithmetics: + - * / % (NOTE: operating close to the limits
+of the integer values may produce surprising results)
+
+=item *
+
+in bit arithmetics: & | ^ ~ << >> (NOTE: these used to be forced
+to be 32 bits wide but now operate on the full native width.)
+
+=item *
+
+vec()
=back
-=head2 Binary Compatibility
+Note that unless you have the case (a) you will have to configure
+and compile Perl using the -Duse64bitint Configure flag.
-This version is NOT binary compatible with older versions. All extensions
-will need to be recompiled. Further binaries built with threads enabled
-are incompatible with binaries built without. This should largely be
-transparent to the user, as all binary incompatible configurations have
-their own unique architecture name, and extension binaries get installed at
-unique locations. This allows coexistence of several configurations in
-the same directory hierarchy. See F<INSTALL>.
+ NOTE: The Configure flags -Duselonglong and -Duse64bits have been
+ deprecated. Use -Duse64bitint instead.
-=head2 Security fixes may affect compatibility
+There are actually two modes of 64-bitness: the first one is achieved
+using Configure -Duse64bitint and the second one using Configure
+-Duse64bitall. The difference is that the first one is minimal and
+the second one maximal. The first works in more places than the second.
-A few taint leaks and taint omissions have been corrected. This may lead
-to "failure" of scripts that used to work with older versions. Compiling
-with -DINCOMPLETE_TAINTS provides a perl with minimal amounts of changes
-to the tainting behavior. But note that the resulting perl will have
-known insecurities.
+The C<use64bitint> does only as much as is required to get 64-bit
+integers into Perl (this may mean, for example, using "long longs")
+while your memory may still be limited to 2 gigabytes (because your
+pointers could still be 32-bit). Note that the name C<64bitint> does
+not imply that your C compiler will be using 64-bit C<int>s (it might,
+but it doesn't have to): the C<use64bitint> means that you will be
+able to have 64 bits wide scalar values.
-Oneliners with the C<-e> switch do not create temporary files anymore.
+The C<use64bitall> goes all the way by attempting to switch also
+integers (if it can), longs (and pointers) to being 64-bit. This may
+create an even more binary incompatible Perl than -Duse64bitint: the
+resulting executable may not run at all in a 32-bit box, or you may
+have to reboot/reconfigure/rebuild your operating system to be 64-bit
+aware.
-=head2 Relaxed new mandatory warnings introduced in 5.004
+Natively 64-bit systems like Alpha and Cray need neither -Duse64bitint
+nor -Duse64bitall.
-Many new warnings that were introduced in 5.004 have been made
-optional. Some of these warnings are still present, but perl's new
-features make them less often a problem. See L<New Diagnostics>.
+Last but not least: note that due to Perl's habit of always using
+floating point numbers, the quads are still not true integers.
+When quads overflow their limits (0...18_446_744_073_709_551_615 unsigned,
+-9_223_372_036_854_775_808...9_223_372_036_854_775_807 signed), they
+are silently promoted to floating point numbers, after which they will
+start losing precision (in their lower digits).
-=head2 Licensing
+ NOTE: 64-bit support is still experimental on most platforms.
+ Existing support only covers the LP64 data model. In particular, the
+ LLP64 data model is not yet supported. 64-bit libraries and system
+ APIs on many platforms have not stabilized--your mileage may vary.
-Perl has a new Social Contract for contributors. See F<Porting/Contract>.
+=head2 Large file support
-The license included in much of the Perl documentation has changed.
-Most of the Perl documentation was previously under the implicit GNU
-General Public License or the Artistic License (at the user's choice).
-Now much of the documentation unambigously states the terms under which
-it may be distributed. Those terms are in general much less restrictive
-than the GNU GPL. See L<perl> and the individual perl man pages listed
-therein.
+If you have filesystems that support "large files" (files larger than
+2 gigabytes), you may now also be able to create and access them from
+Perl.
-=head1 Core Changes
+ NOTE: The default action is to enable large file support, if
+ available on the platform.
+If the large file support is on, and you have a Fcntl constant
+O_LARGEFILE, the O_LARGEFILE is automatically added to the flags
+of sysopen().
-=head2 Threads
+Beware that unless your filesystem also supports "sparse files" seeking
+to umpteen petabytes may be inadvisable.
-WARNING: Threading is considered an B<experimental> feature. Details of the
-implementation may change without notice. There are known limitations
-and some bugs. These are expected to be fixed in future versions.
+Note that in addition to requiring a proper file system to do large
+files you may also need to adjust your per-process (or your
+per-system, or per-process-group, or per-user-group) maximum filesize
+limits before running Perl scripts that try to handle large files,
+especially if you intend to write such files.
-See L<README.threads>.
+Finally, in addition to your process/process group maximum filesize
+limits, you may have quota limits on your filesystems that stop you
+(your user id or your user group id) from using large files.
-Mach cthreads (NEXTSTEP, OPENSTEP, Rhapsody) are now supported by
-the Thread extension.
+Adjusting your process/user/group/file system/operating system limits
+is outside the scope of Perl core language. For process limits, you
+may try increasing the limits using your shell's limits/limit/ulimit
+command before running Perl. The BSD::Resource extension (not
+included with the standard Perl distribution) may also be of use, it
+offers the getrlimit/setrlimit interface that can be used to adjust
+process resource usage limits, including the maximum filesize limit.
-=head2 Compiler
+=head2 Long doubles
-WARNING: The Compiler and related tools are considered B<experimental>.
-Features may change without notice, and there are known limitations
-and bugs. Since the compiler is fully external to perl, the default
-configuration will build and install it.
+In some systems you may be able to use long doubles to enhance the
+range and precision of your double precision floating point numbers
+(that is, Perl's numbers). Use Configure -Duselongdouble to enable
+this support (if it is available).
-The Compiler produces three different types of transformations of a
-perl program. The C backend generates C code that captures perl's state
-just before execution begins. It eliminates the compile-time overheads
-of the regular perl interpreter, but the run-time performance remains
-comparatively the same. The CC backend generates optimized C code
-equivalent to the code path at run-time. The CC backend has greater
-potential for big optimizations, but only a few optimizations are
-implemented currently. The Bytecode backend generates a platform
-independent bytecode representation of the interpreter's state
-just before execution. Thus, the Bytecode back end also eliminates
-much of the compilation overhead of the interpreter.
+=head2 "more bits"
-The compiler comes with several valuable utilities.
+You can "Configure -Dusemorebits" to turn on both the 64-bit support
+and the long double support.
-C<B::Lint> is an experimental module to detect and warn about suspicious
-code, especially the cases that the C<-w> switch does not detect.
+=head2 Enhanced support for sort() subroutines
-C<B::Deparse> can be used to demystify perl code, and understand
-how perl optimizes certain constructs.
+Perl subroutines with a prototype of C<($$)>, and XSUBs in general, can
+now be used as sort subroutines. In either case, the two elements to
+be compared are passed as normal parameters in @_. See L<perlfunc/sort>.
-C<B::Xref> generates cross reference reports of all definition and use
-of variables, subroutines and formats in a program.
+For unprototyped sort subroutines, the historical behavior of passing
+the elements to be compared as the global variables $a and $b remains
+unchanged.
-C<B::Showlex> show the lexical variables used by a subroutine or file
-at a glance.
+=head2 C<sort $coderef @foo> allowed
-C<perlcc> is a simple frontend for compiling perl.
+sort() did not accept a subroutine reference as the comparison
+function in earlier versions. This is now permitted.
-See C<ext/B/README>, L<B>, and the respective compiler modules.
+=head2 File globbing implemented internally
-=head2 Regular Expressions
+Perl now uses the File::Glob implementation of the glob() operator
+automatically. This avoids using an external csh process and the
+problems associated with it.
-Perl's regular expression engine has been seriously overhauled, and
-many new constructs are supported. Several bugs have been fixed.
+ NOTE: This is currently an experimental feature. Interfaces and
+ implementation are subject to change.
-Here is an itemized summary:
+=item Support for CHECK blocks
-=over 4
+In addition to C<BEGIN>, C<INIT>, C<END>, C<DESTROY> and C<AUTOLOAD>,
+subroutines named C<CHECK> are now special. These are queued up during
+compilation and behave similar to END blocks, except they are called at
+the end of compilation rather than at the end of execution. They cannot
+be called directly.
-=item Many new and improved optimizations
+=head2 POSIX character class syntax [: :] supported
-Changes in the RE engine:
+For example to match alphabetic characters use /[[:alpha:]]/.
+See L<perlre> for details.
- Unneeded nodes removed;
- Substrings merged together;
- New types of nodes to process (SUBEXPR)* and similar expressions
- quickly, used if the SUBEXPR has no side effects and matches
- strings of the same length;
- Better optimizations by lookup for constant substrings;
- Better search for constants substrings anchored by $ ;
+=item Better pseudo-random number generator
-Changes in Perl code using RE engine:
+In 5.005_0x and earlier, perl's rand() function used the C library
+rand(3) function. As of 5.005_52, Configure tests for drand48(),
+random(), and rand() (in that order) and picks the first one it finds.
- More optimizations to s/longer/short/;
- study() was not working;
- /blah/ may be optimized to an analogue of index() if $& $` $' not seen;
- Unneeded copying of matched-against string removed;
- Only matched part of the string is copying if $` $' were not seen;
+These changes should result in better random numbers from rand().
-=item Many bug fixes
+=head2 Improved C<qw//> operator
-Note that only the major bug fixes are listed here. See F<Changes> for others.
+The C<qw//> operator is now evaluated at compile time into a true list
+instead of being replaced with a run time call to C<split()>. This
+removes the confusing misbehaviour of C<qw//> in scalar context, which
+had inherited that behaviour from split().
- Backtracking might not restore start of $3.
- No feedback if max count for * or + on "complex" subexpression
- was reached, similarly (but at compile time) for {3,34567}
- Primitive restrictions on max count introduced to decrease a
- possibility of a segfault;
- (ZERO-LENGTH)* could segfault;
- (ZERO-LENGTH)* was prohibited;
- Long REs were not allowed;
- /RE/g could skip matches at the same position after a
- zero-length match;
+Thus:
-=item New regular expression constructs
+ $foo = ($bar) = qw(a b c); print "$foo|$bar\n";
-The following new syntax elements are supported:
+now correctly prints "3|a", instead of "2|a".
- (?<=RE)
- (?<!RE)
- (?{ CODE })
- (?i-x)
- (?i:RE)
- (?(COND)YES_RE|NO_RE)
- (?>RE)
- \z
+=item Better worst-case behavior of hashes
-=item New operator for precompiled regular expressions
+Small changes in the hashing algorithm have been implemented in
+order to improve the distribution of lower order bits in the
+hashed value. This is expected to yield better performance on
+keys that are repeated sequences.
-See L<New C<qr//> operator>.
+=head2 pack() format 'Z' supported
-=item Other improvements
+The new format type 'Z' is useful for packing and unpacking null-terminated
+strings. See L<perlfunc/"pack">.
- Better debugging output (possibly with colors),
- even from non-debugging Perl;
- RE engine code now looks like C, not like assembler;
- Behaviour of RE modifiable by `use re' directive;
- Improved documentation;
- Test suite significantly extended;
- Syntax [:^upper:] etc., reserved inside character classes;
+=head2 pack() format modifier '!' supported
-=item Incompatible changes
+The new format type modifier '!' is useful for packing and unpacking
+native shorts, ints, and longs. See L<perlfunc/"pack">.
- (?i) localized inside enclosing group;
- $( is not interpolated into RE any more;
- /RE/g may match at the same position (with non-zero length)
- after a zero-length match (bug fix).
+=head2 pack() and unpack() support counted strings
-=back
+The template character '/' can be used to specify a counted string
+type to be packed or unpacked. See L<perlfunc/"pack">.
-See L<perlre> and L<perlop>.
+=head2 Comments in pack() templates
-=head2 Improved malloc()
+The '#' character in a template introduces a comment up to
+end of the line. This facilitates documentation of pack()
+templates.
-See banner at the beginning of C<malloc.c> for details.
+=head2 Weak references
-=head2 Quicksort is internally implemented
+In previous versions of Perl, you couldn't cache objects so as
+to allow them to be deleted if the last reference from outside
+the cache is deleted. The reference in the cache would hold a
+reference count on the object and the objects would never be
+destroyed.
-Perl now contains its own highly optimized qsort() routine. The new qsort()
-is resistant to inconsistent comparison functions, so Perl's C<sort()> will
-not provoke coredumps any more when given poorly written sort subroutines.
-(Some C library C<qsort()>s that were being used before used to have this
-problem.) In our testing, the new C<qsort()> required the minimal number
-of pair-wise compares on average, among all known C<qsort()> implementations.
+Another familiar problem is with circular references. When an
+object references itself, its reference count would never go
+down to zero, and it would not get destroyed until the program
+is about to exit.
-See C<perlfunc/sort>.
+Weak references solve this by allowing you to "weaken" any
+reference, that is, make it not count towards the reference count.
+When the last non-weak reference to an object is deleted, the object
+is destroyed and all the weak references to the object are
+automatically undef-ed.
-=head2 Reliable signals
+To use this feature, you need the WeakRef package from CPAN, which
+contains additional documentation.
-Perl's signal handling is susceptible to random crashes, because signals
-arrive asynchronously, and the Perl runtime is not reentrant at arbitrary
-times.
+ NOTE: This is an experimental feature. Details are subject to change.
-However, one experimental implementation of reliable signals is available
-when threads are enabled. See C<Thread::Signal>. Also see F<INSTALL> for
-how to build a Perl capable of threads.
+=head2 Binary numbers supported
-=head2 Reliable stack pointers
+Binary numbers are now supported as literals, in s?printf formats, and
+C<oct()>:
-The internals now reallocate the perl stack only at predictable times.
-In particular, magic calls never trigger reallocations of the stack,
-because all reentrancy of the runtime is handled using a "stack of stacks".
-This should improve reliability of cached stack pointers in the internals
-and in XSUBs.
+ $answer = 0b101010;
+ printf "The answer is: %b\n", oct("0b101010");
-=head2 More generous treatment of carriage returns
+=head2 Lvalue subroutines
-Perl used to complain if it encountered literal carriage returns in
-scripts. Now they are mostly treated like whitespace within program text.
-Inside string literals and here documents, literal carriage returns are
-ignored if they occur paired with linefeeds, or get interpreted as whitespace
-if they stand alone. This behavior means that literal carriage returns
-in files should be avoided. You can get the older, more compatible (but
-less generous) behavior by defining the preprocessor symbol
-C<PERL_STRICT_CR> when building perl. Of course, all this has nothing
-whatever to do with how escapes like C<\r> are handled within strings.
+Subroutines can now return modifiable lvalues.
+See L<perlsub/"Lvalue subroutines">.
-Note that this doesn't somehow magically allow you to keep all text files
-in DOS format. The generous treatment only applies to files that perl
-itself parses. If your C compiler doesn't allow carriage returns in
-files, you may still be unable to build modules that need a C compiler.
+ NOTE: This is an experimental feature. Details are subject to change.
-=head2 Memory leaks
+=head2 Some arrows may be omitted in calls through references
-C<substr>, C<pos> and C<vec> don't leak memory anymore when used in lvalue
-context. Many small leaks that impacted applications that embed multiple
-interpreters have been fixed.
+Perl now allows the arrow to be omitted in many constructs
+involving subroutine calls through references. For example,
+C<< $foo[10]->('foo') >> may now be written C<$foo[10]('foo')>.
+This is rather similar to how the arrow may be omitted from
+C<< $foo[10]->{'foo'} >>. Note however, that the arrow is still
+required for C<< foo(10)->('bar') >>.
-=head2 Better support for multiple interpreters
+=head2 Boolean assignment operators are legal lvalues
-The build-time option C<-DMULTIPLICITY> has had many of the details
-reworked. Some previously global variables that should have been
-per-interpreter now are. With care, this allows interpreters to call
-each other. See the C<PerlInterp> extension on CPAN.
+Constructs such as C<($a ||= 2) += 1> are now allowed.
-=head2 Behavior of local() on array and hash elements is now well-defined
+=head2 exists() is supported on subroutine names
-See L<perlsub/"Temporary Values via local()">.
+The exists() builtin now works on subroutine names. A subroutine
+is considered to exist if it has been declared (even if implicitly).
+See L<perlfunc/exists> for examples.
-=head2 C<%!> is transparently tied to the L<Errno> module
+=head2 exists() and delete() are supported on array elements
-See L<perlvar>, and L<Errno>.
+The exists() and delete() builtins now work on simple arrays as well.
+The behavior is similar to that on hash elements.
-=head2 Pseudo-hashes are supported
+exists() can be used to check whether an array element has been
+initialized. This avoids autovivifying array elements that don't exist.
+If the array is tied, the EXISTS() method in the corresponding tied
+package will be invoked.
-See L<perlref>.
+delete() may be used to remove an element from the array and return
+it. The array element at that position returns to its unintialized
+state, so that testing for the same element with exists() will return
+false. If the element happens to be the one at the end, the size of
+the array also shrinks up to the highest element that tests true for
+exists(), or 0 if none such is found. If the array is tied, the DELETE()
+method in the corresponding tied package will be invoked.
-=head2 C<EXPR foreach EXPR> is supported
+See L<perlfunc/exists> and L<perlfunc/delete> for examples.
-See L<perlsyn>.
+=head2 Pseudo-hashes work better
-=head2 Keywords can be globally overridden
+Dereferencing some types of reference values in a pseudo-hash,
+such as C<< $ph->{foo}[1] >>, was accidentally disallowed. This has
+been corrected.
-See L<perlsub>.
+When applied to a pseudo-hash element, exists() now reports whether
+the specified value exists, not merely if the key is valid.
-=head2 C<$^E> is meaningful on Win32
+delete() now works on pseudo-hashes. When given a pseudo-hash element
+or slice it deletes the values corresponding to the keys (but not the keys
+themselves). See L<perlref/"Pseudo-hashes: Using an array as a hash">.
-See L<perlvar>.
+Pseudo-hash slices with constant keys are now optimized to array lookups
+at compile-time.
-=head2 C<foreach (1..1000000)> optimized
+List assignments to pseudo-hash slices are now supported.
-C<foreach (1..1000000)> is now optimized into a counting loop. It does
-not try to allocate a 1000000-size list anymore.
+The C<fields> pragma now provides ways to create pseudo-hashes, via
+fields::new() and fields::phash(). See L<fields>.
-=head2 C<Foo::> can be used as implicitly quoted package name
+ NOTE: The pseudo-hash data type continues to be experimental.
+ Limiting oneself to the interface elements provided by the
+ fields pragma will provide protection from any future changes.
-Barewords caused unintuitive behavior when a subroutine with the same
-name as a package happened to be defined. Thus, C<new Foo @args>,
-use the result of the call to C<Foo()> instead of C<Foo> being treated
-as a literal. The recommended way to write barewords in the indirect
-object slot is C<new Foo:: @args>. Note that the method C<new()> is
-called with a first argument of C<Foo>, not C<Foo::> when you do that.
+=head2 Automatic flushing of output buffers
-=head2 C<exists $Foo::{Bar::}> tests existence of a package
+fork(), exec(), system(), qx//, and pipe open()s now flush buffers
+of all files opened for output when the operation was attempted. This
+mostly eliminates confusing buffering mishaps suffered by users unaware
+of how Perl internally handles I/O.
-It was impossible to test for the existence of a package without
-actually creating it before. Now C<exists $Foo::{Bar::}> can be
-used to test if the C<Foo::Bar> namespace has been created.
+This is not supported on some platforms like Solaris where a suitably
+correct implementation of fflush(NULL) isn't available.
-=head2 Better locale support
+=head2 Better diagnostics on meaningless filehandle operations
-See L<perllocale>.
+Constructs such as C<< open(<FH>) >> and C<< close(<FH>) >>
+are compile time errors. Attempting to read from filehandles that
+were opened only for writing will now produce warnings (just as
+writing to read-only filehandles does).
-=head2 Experimental support for 64-bit platforms
+=head2 Where possible, buffered data discarded from duped input filehandle
-Perl5 has always had 64-bit support on systems with 64-bit longs.
-Starting with 5.005, the beginnings of experimental support for systems
-with 32-bit long and 64-bit 'long long' integers has been added.
-If you add -DUSE_LONG_LONG to your ccflags in config.sh (or manually
-define it in perl.h) then perl will be built with 'long long' support.
-There will be many compiler warnings, and the resultant perl may not
-work on all systems. There are many other issues related to
-third-party extensions and libraries. This option exists to allow
-people to work on those issues.
+C<< open(NEW, "<&OLD") >> now attempts to discard any data that
+was previously read and buffered in C<OLD> before duping the handle.
+On platforms where doing this is allowed, the next read operation
+on C<NEW> will return the same data as the corresponding operation
+on C<OLD>. Formerly, it would have returned the data from the start
+of the following disk block instead.
-=head2 prototype() returns useful results on builtins
+=head2 eof() has the same old magic as <>
-See L<perlfunc/prototype>.
+C<eof()> would return true if no attempt to read from C<< <> >> had
+yet been made. C<eof()> has been changed to have a little magic of its
+own, it now opens the C<< <> >> files.
-=head2 Extended support for exception handling
+=head2 binmode() can be used to set :crlf and :raw modes
-C<die()> now accepts a reference value, and C<$@> gets set to that
-value in exception traps. This makes it possible to propagate
-exception objects. This is an undocumented B<experimental> feature.
+binmode() now accepts a second argument that specifies a discipline
+for the handle in question. The two pseudo-disciplines ":raw" and
+":crlf" are currently supported on DOS-derivative platforms.
+See L<perlfunc/"binmode"> and L<open>.
-=head2 Re-blessing in DESTROY() supported for chaining DESTROY() methods
+=head2 C<-T> filetest recognizes UTF-8 encoded files as "text"
-See L<perlobj/Destructors>.
+The algorithm used for the C<-T> filetest has been enhanced to
+correctly identify UTF-8 content as "text".
-=head2 All C<printf> format conversions are handled internally
+=head2 system(), backticks and pipe open now reflect exec() failure
-See L<perlfunc/printf>.
+On Unix and similar platforms, system(), qx() and open(FOO, "cmd |")
+etc., are implemented via fork() and exec(). When the underlying
+exec() fails, earlier versions did not report the error properly,
+since the exec() happened to be in a different process.
-=head2 New C<INIT> keyword
+The child process now communicates with the parent about the
+error in launching the external command, which allows these
+constructs to return with their usual error value and set $!.
-C<INIT> subs are like C<BEGIN> and C<END>, but they get run just before
-the perl runtime begins execution. e.g., the Perl Compiler makes use of
-C<INIT> blocks to initialize and resolve pointers to XSUBs.
+=head2 Improved diagnostics
-=head2 New C<lock> keyword
+Line numbers are no longer suppressed (under most likely circumstances)
+during the global destruction phase.
-The C<lock> keyword is the fundamental synchronization primitive
-in threaded perl. When threads are not enabled, it is currently a noop.
+Diagnostics emitted from code running in threads other than the main
+thread are now accompanied by the thread ID.
-To minimize impact on source compatibility this keyword is "weak", i.e., any
-user-defined subroutine of the same name overrides it, unless a C<use Thread>
-has been seen.
+Embedded null characters in diagnostics now actually show up. They
+used to truncate the message in prior versions.
-=head2 New C<qr//> operator
+$foo::a and $foo::b are now exempt from "possible typo" warnings only
+if sort() is encountered in package C<foo>.
-The C<qr//> operator, which is syntactically similar to the other quote-like
-operators, is used to create precompiled regular expressions. This compiled
-form can now be explicitly passed around in variables, and interpolated in
-other regular expressions. See L<perlop>.
+Unrecognized alphabetic escapes encountered when parsing quote
+constructs now generate a warning, since they may take on new
+semantics in later versions of Perl.
-=head2 C<our> is now a reserved word
+Many diagnostics now report the internal operation in which the warning
+was provoked, like so:
-Calling a subroutine with the name C<our> will now provoke a warning when
-using the C<-w> switch.
+ Use of uninitialized value in concatenation (.) at (eval 1) line 1.
+ Use of uninitialized value in print at (eval 1) line 1.
-=head2 Tied arrays are now fully supported
+Diagnostics that occur within eval may also report the file and line
+number where the eval is located, in addition to the eval sequence
+number and the line number within the evaluated text itself. For
+example:
-See L<Tie::Array>.
+ Not enough arguments for scalar at (eval 4)[newlib/perl5db.pl:1411] line 2, at EOF
-=head2 Tied handles support is better
+=head2 Diagnostics follow STDERR
-Several missing hooks have been added. There is also a new base class for
-TIEARRAY implementations. See L<Tie::Array>.
+Diagnostic output now goes to whichever file the C<STDERR> handle
+is pointing at, instead of always going to the underlying C runtime
+library's C<stderr>.
-=head2 4th argument to substr
+=item More consistent close-on-exec behavior
-substr() can now both return and replace in one operation. The optional
-4th argument is the replacement string. See L<perlfunc/substr>.
+On systems that support a close-on-exec flag on filehandles, the
+flag is now set for any handles created by pipe(), socketpair(),
+socket(), and accept(), if that is warranted by the value of $^F
+that may be in effect. Earlier versions neglected to set the flag
+for handles created with these operators. See L<perlfunc/pipe>,
+L<perlfunc/socketpair>, L<perlfunc/socket>, L<perlfunc/accept>,
+and L<perlvar/$^F>.
-=head2 Negative LENGTH argument to splice
+=head2 syswrite() ease-of-use
-splice() with a negative LENGTH argument now work similar to what the
-LENGTH did for substr(). Previously a negative LENGTH was treated as
-0. See L<perlfunc/splice>.
+The length argument of C<syswrite()> has become optional.
-=head2 Magic lvalues are now more magical
+=head2 Better syntax checks on parenthesized unary operators
-When you say something like C<substr($x, 5) = "hi">, the scalar returned
-by substr() is special, in that any modifications to it affect $x.
-(This is called a 'magic lvalue' because an 'lvalue' is something on
-the left side of an assignment.) Normally, this is exactly what you
-would expect to happen, but Perl uses the same magic if you use substr(),
-pos(), or vec() in a context where they might be modified, like taking
-a reference with C<\> or as an argument to a sub that modifies C<@_>.
-In previous versions, this 'magic' only went one way, but now changes
-to the scalar the magic refers to ($x in the above example) affect the
-magic lvalue too. For instance, this code now acts differently:
+Expressions such as:
- $x = "hello";
- sub printit {
- $x = "g'bye";
- print $_[0], "\n";
- }
- printit(substr($x, 0, 5));
+ print defined(&foo,&bar,&baz);
+ print uc("foo","bar","baz");
+ undef($foo,&bar);
-In previous versions, this would print "hello", but it now prints "g'bye".
+used to be accidentally allowed in earlier versions, and produced
+unpredictable behaviour. Some produced ancillary warnings
+when used in this way; others silently did the wrong thing.
-=head2 E<lt>E<gt> now reads in records
+The parenthesized forms of most unary operators that expect a single
+argument now ensure that they are not called with more than one
+argument, making the cases shown above syntax errors. The usual
+behaviour of:
-If C<$/> is a referenence to an integer, or a scalar that holds an integer,
-E<lt>E<gt> will read in records instead of lines. For more info, see
-L<perlvar/$/>.
+ print defined &foo, &bar, &baz;
+ print uc "foo", "bar", "baz";
+ undef $foo, &bar;
-=head2 pack() format 'Z' supported
+remains unchanged. See L<perlop>.
-The new format type 'Z' is useful for packing and unpacking null-terminated
-strings. See L<perlfunc/"pack">.
+=head2 Bit operators support full native integer width
-=head1 Significant bug fixes
+The bit operators (& | ^ ~ << >>) now operate on the full native
+integral width (the exact size of which is available in $Config{ivsize}).
+For example, if your platform is either natively 64-bit or if Perl
+has been configured to use 64-bit integers, these operations apply
+to 8 bytes (as opposed to 4 bytes on 32-bit platforms).
+For portability, be sure to mask off the excess bits in the result of
+unary C<~>, e.g., C<~$x & 0xffffffff>.
-=head2 E<lt>HANDLEE<gt> on empty files
+=head2 Improved security features
-With C<$/> set to C<undef>, slurping an empty file returns a string of
-zero length (instead of C<undef>, as it used to) for the first time the
-HANDLE is read. Subsequent reads yield C<undef>.
+More potentially unsafe operations taint their results for improved
+security.
-This means that the following will append "foo" to an empty file (it used
-to not do anything before):
+The C<passwd> and C<shell> fields returned by the getpwent(), getpwnam(),
+and getpwuid() are now tainted, because the user can affect their own
+encrypted password and login shell.
- perl -0777 -pi -e 's/^/foo/' empty_file
+The variable modified by shmread(), and messages returned by msgrcv()
+(and its object-oriented interface IPC::SysV::Msg::rcv) are also tainted,
+because other untrusted processes can modify messages and shared memory
+segments for their own nefarious purposes.
-Note that the behavior of:
+=item More functional bareword prototype (*)
- perl -pi -e 's/^/foo/' empty_file
+Bareword prototypes have been rationalized to enable them to be used
+to override builtins that accept barewords and interpret them in
+a special way, such as C<require> or C<do>.
-is unchanged (it continues to leave the file empty).
+Arguments prototyped as C<*> will now be visible within the subroutine
+as either a simple scalar or as a reference to a typeglob.
+See L<perlsub/Prototypes>.
-=head1 Supported Platforms
+=head2 C<require> and C<do> may be overridden
-Configure has many incremental improvements. Site-wide policy for building
-perl can now be made persistent, via Policy.sh. Configure also records
-the command-line arguments used in F<config.sh>.
+C<require> and C<do 'file'> operations may be overridden locally
+by importing subroutines of the same name into the current package
+(or globally by importing them into the CORE::GLOBAL:: namespace).
+Overriding C<require> will also affect C<use>, provided the override
+is visible at compile-time.
+See L<perlsub/"Overriding Built-in Functions">.
-=head2 New Platforms
+=head2 $^X variables may now have names longer than one character
-BeOS is now supported. See L<README.beos>.
+Formerly, $^X was synonymous with ${"\cX"}, but $^XY was a syntax
+error. Now variable names that begin with a control character may be
+arbitrarily long. However, for compatibility reasons, these variables
+I<must> be written with explicit braces, as C<${^XY}> for example.
+C<${^XYZ}> is synonymous with ${"\cXYZ"}. Variable names with more
+than one control character, such as C<${^XY^Z}>, are illegal.
-DOS is now supported under the DJGPP tools. See L<README.dos>.
+The old syntax has not changed. As before, `^X' may be either a
+literal control-X character or the two-character sequence `caret' plus
+`X'. When braces are omitted, the variable name stops after the
+control character. Thus C<"$^XYZ"> continues to be synonymous with
+C<$^X . "YZ"> as before.
-GNU/Hurd is now supported.
+As before, lexical variables may not have names beginning with control
+characters. As before, variables whose names begin with a control
+character are always forced to be in package `main'. All such variables
+are reserved for future extensions, except those that begin with
+C<^_>, which may be used by user programs and are guaranteed not to
+acquire special meaning in any future version of Perl.
-MiNT is now supported. See L<README.mint>.
+=head2 New variable $^C reflects C<-c> switch
-MPE/iX is now supported. See L<README.mpeix>.
+C<$^C> has a boolean value that reflects whether perl is being run
+in compile-only mode (i.e. via the C<-c> switch). Since
+BEGIN blocks are executed under such conditions, this variable
+enables perl code to determine whether actions that make sense
+only during normal running are warranted. See L<perlvar>.
-MVS (aka OS390, aka Open Edition) is now supported. See L<README.os390>.
+=head2 New variable $^V contains Perl version as a string
-Stratus VOS is now supported. See L<README.vos>.
+C<$^V> contains the Perl version number as a string composed of
+characters whose ordinals match the version numbers, i.e. v5.6.0.
+This may be used in string comparisons.
-=head2 Changes in existing support
+See C<Support for strings represented as a vector of ordinals> for an
+example.
-Win32 support has been vastly enhanced. Support for Perl Object, a C++
-encapsulation of Perl. GCC and EGCS are now supported on Win32.
-See F<README.win32>, aka L<perlwin32>.
+=head2 Optional Y2K warnings
-VMS configuration system has been rewritten. See L<README.vms>.
+If Perl is built with the cpp macro C<PERL_Y2KWARN> defined,
+it emits optional warnings when concatenating the number 19
+with another number.
-The hints files for most Unix platforms have seen incremental improvements.
+This behavior must be specifically enabled when running Configure.
+See F<INSTALL> and F<README.Y2K>.
=head1 Modules and Pragmata
-=head2 New Modules
+=head2 Modules
-=over
+=over 4
+
+=item attributes
+
+While used internally by Perl as a pragma, this module also
+provides a way to fetch subroutine and variable attributes.
+See L<attributes>.
=item B
-Perl compiler and tools. See L<B>.
+The Perl Compiler suite has been extensively reworked for this
+release. More of the standard Perl testsuite passes when run
+under the Compiler, but there is still a significant way to
+go to achieve production quality compiled executables.
+
+ NOTE: The Compiler suite remains highly experimental. The
+ generated code may not be correct, even it manages to execute
+ without errors.
+
+=item Benchmark
+
+Overall, Benchmark results exhibit lower average error and better timing
+accuracy.
+
+You can now run tests for I<n> seconds instead of guessing the right
+number of tests to run: e.g., timethese(-5, ...) will run each
+code for at least 5 CPU seconds. Zero as the "number of repetitions"
+means "for at least 3 CPU seconds". The output format has also
+changed. For example:
+
+ use Benchmark;$x=3;timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}})
+
+will now output something like this:
+
+ Benchmark: running a, b, each for at least 5 CPU seconds...
+ a: 5 wallclock secs ( 5.77 usr + 0.00 sys = 5.77 CPU) @ 200551.91/s (n=1156516)
+ b: 4 wallclock secs ( 5.00 usr + 0.02 sys = 5.02 CPU) @ 159605.18/s (n=800686)
+
+New features: "each for at least N CPU seconds...", "wallclock secs",
+and the "@ operations/CPU second (n=operations)".
+
+timethese() now returns a reference to a hash of Benchmark objects containing
+the test results, keyed on the names of the tests.
+
+timethis() now returns the iterations field in the Benchmark result object
+instead of 0.
+
+timethese(), timethis(), and the new cmpthese() (see below) can also take
+a format specifier of 'none' to suppress output.
+
+A new function countit() is just like timeit() except that it takes a
+TIME instead of a COUNT.
+
+A new function cmpthese() prints a chart comparing the results of each test
+returned from a timethese() call. For each possible pair of tests, the
+percentage speed difference (iters/sec or seconds/iter) is shown.
+
+For other details, see L<Benchmark>.
+
+=item ByteLoader
+
+The ByteLoader is a dedicated extension to generate and run
+Perl bytecode. See L<ByteLoader>.
+
+=item constant
+
+References can now be used.
+
+The new version also allows a leading underscore in constant names, but
+disallows a double leading underscore (as in "__LINE__"). Some other names
+are disallowed or warned against, including BEGIN, END, etc. Some names
+which were forced into main:: used to fail silently in some cases; now they're
+fatal (outside of main::) and an optional warning (inside of main::).
+The ability to detect whether a constant had been set with a given name has
+been added.
+
+See L<constant>.
+
+=item charnames
+
+This pragma implements the C<\N> string escape. See L<charnames>.
=item Data::Dumper
-A module to pretty print Perl data. See L<Data::Dumper>.
+A C<Maxdepth> setting can be specified to avoid venturing
+too deeply into deep data structures. See L<Data::Dumper>.
+
+The XSUB implementation of Dump() is now automatically called if the
+C<Useqq> setting is not in use.
+
+Dumping C<qr//> objects works correctly.
+
+=item DB
+
+C<DB> is an experimental module that exposes a clean abstraction
+to Perl's debugging API.
+
+=item DB_File
+
+DB_File can now be built with Berkeley DB versions 1, 2 or 3.
+See C<ext/DB_File/Changes>.
+
+=item Devel::DProf
+
+Devel::DProf, a Perl source code profiler has been added. See
+L<Devel::DProf> and L<dprofpp>.
+
+=item Devel::Peek
+
+The Devel::Peek module provides access to the internal representation
+of Perl variables and data. It is a data debugging tool for the XS programmer.
=item Dumpvalue
-A module to dump perl values to the screen. See L<Dumpvalue>.
+The Dumpvalue module provides screen dumps of Perl data.
+
+=item DynaLoader
-=item Errno
+DynaLoader now supports a dl_unload_file() function on platforms that
+support unloading shared objects using dlclose().
-A module to look up errors more conveniently. See L<Errno>.
+Perl can also optionally arrange to unload all extension shared objects
+loaded by Perl. To enable this, build Perl with the Configure option
+C<-Accflags=-DDL_UNLOAD_ALL_AT_EXIT>. (This maybe useful if you are
+using Apache with mod_perl.)
+
+=item English
+
+$PERL_VERSION now stands for C<$^V> (a string value) rather than for C<$]>
+(a numeric value).
+
+=item Env
+
+Env now supports accessing environment variables like PATH as array
+variables.
+
+=item Fcntl
+
+More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
+large file (more than 4GB) access (NOTE: the O_LARGEFILE is
+automatically added to sysopen() flags if large file support has been
+configured, as is the default), Free/Net/OpenBSD locking behaviour
+flags F_FLOCK, F_POSIX, Linux F_SHLCK, and O_ACCMODE: the combined
+mask of O_RDONLY, O_WRONLY, and O_RDWR. The seek()/sysseek()
+constants SEEK_SET, SEEK_CUR, and SEEK_END are available via the
+C<:seek> tag. The chmod()/stat() S_IF* constants and S_IS* functions
+are available via the C<:mode> tag.
+
+=item File::Compare
+
+A compare_text() function has been added, which allows custom
+comparison functions. See L<File::Compare>.
+
+=item File::Find
+
+File::Find now works correctly when the wanted() function is either
+autoloaded or is a symbolic reference.
+
+A bug that caused File::Find to lose track of the working directory
+when pruning top-level directories has been fixed.
+
+File::Find now also supports several other options to control its
+behavior. It can follow symbolic links if the C<follow> option is
+specified. Enabling the C<no_chdir> option will make File::Find skip
+changing the current directory when walking directories. The C<untaint>
+flag can be useful when running with taint checks enabled.
+
+See L<File::Find>.
+
+=item File::Glob
+
+This extension implements BSD-style file globbing. By default,
+it will also be used for the internal implementation of the glob()
+operator. See L<File::Glob>.
=item File::Spec
-A portable API for file operations.
+New methods have been added to the File::Spec module: devnull() returns
+the name of the null device (/dev/null on Unix) and tmpdir() the name of
+the temp directory (normally /tmp on Unix). There are now also methods
+to convert between absolute and relative filenames: abs2rel() and
+rel2abs(). For compatibility with operating systems that specify volume
+names in file paths, the splitpath(), splitdir(), and catdir() methods
+have been added.
-=item ExtUtils::Installed
+=item File::Spec::Functions
-Query and manage installed modules.
+The new File::Spec::Functions modules provides a function interface
+to the File::Spec module. Allows shorthand
-=item ExtUtils::Packlist
+ $fullname = catfile($dir1, $dir2, $file);
-Manipulate .packlist files.
+instead of
-=item Fatal
+ $fullname = File::Spec->catfile($dir1, $dir2, $file);
-Make functions/builtins succeed or die.
+=item Getopt::Long
-=item IPC::SysV
+Getopt::Long licensing has changed to allow the Perl Artistic License
+as well as the GPL. It used to be GPL only, which got in the way of
+non-GPL applications that wanted to use Getopt::Long.
-Constants and other support infrastructure for System V IPC operations
-in perl.
+Getopt::Long encourages the use of Pod::Usage to produce help
+messages. For example:
-=item Test
+ use Getopt::Long;
+ use Pod::Usage;
+ my $man = 0;
+ my $help = 0;
+ GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+ pod2usage(1) if $help;
+ pod2usage(-exitstatus => 0, -verbose => 2) if $man;
-A framework for writing testsuites.
+ __END__
-=item Tie::Array
+ =head1 NAME
-Base class for tied arrays.
+ sample - Using GetOpt::Long and Pod::Usage
-=item Tie::Handle
+ =head1 SYNOPSIS
-Base class for tied handles.
+ sample [options] [file ...]
-=item Thread
+ Options:
+ -help brief help message
+ -man full documentation
-Perl thread creation, manipulation, and support.
+ =head1 OPTIONS
-=item attrs
+ =over 8
-Set subroutine attributes.
+ =item B<-help>
-=item fields
+ Print a brief help message and exits.
-Compile-time class fields.
+ =item B<-man>
-=item re
+ Prints the manual page and exits.
-Various pragmata to control behavior of regular expressions.
+ =back
-=back
+ =head1 DESCRIPTION
-=head2 Changes in existing modules
+ B<This program> will read the given input file(s) and do someting
+ useful with the contents thereof.
-=over
+ =cut
-=item Benchmark
+See L<Pod::Usage> for details.
-You can now run tests for I<n> seconds instead of guessing the right
-number of tests to run: e.g. timethese(-5, ...) will run each of the
-codes for at least 5 CPU seconds. Zero as the "number of repetitions"
-means "for at least 3 CPU seconds". The output format has also
-changed. For example:
+A bug that prevented the non-option call-back <> from being
+specified as the first argument has been fixed.
-use Benchmark;$x=3;timethese(-5,{a=>sub{$x*$x},b=>sub{$x**2}})
+To specify the characters < and > as option starters, use ><. Note,
+however, that changing option starters is strongly deprecated.
-will now output something like this:
+=item IO
-Benchmark: running a, b, each for at least 5 CPU seconds...
- a: 5 wallclock secs ( 5.77 usr + 0.00 sys = 5.77 CPU) @ 200551.91/s (n=1156516)
- b: 4 wallclock secs ( 5.00 usr + 0.02 sys = 5.02 CPU) @ 159605.18/s (n=800686)
+write() and syswrite() will now accept a single-argument
+form of the call, for consistency with Perl's syswrite().
-New features: "each for at least N CPU seconds...", "wallclock secs",
-and the "@ operations/CPU second (n=operations)".
+You can now create a TCP-based IO::Socket::INET without forcing
+a connect attempt. This allows you to configure its options
+(like making it non-blocking) and then call connect() manually.
-=item Carp
+A bug that prevented the IO::Socket::protocol() accessor
+from ever returning the correct value has been corrected.
-Carp has a new function cluck(). cluck() warns, like carp(), but also adds
-a stack backtrace to the error message, like confess().
+IO::Socket::connect now uses non-blocking IO instead of alarm()
+to do connect timeouts.
-=item CGI
+IO::Socket::accept now uses select() instead of alarm() for doing
+timeouts.
-CGI has been updated to version 2.42.
+IO::Socket::INET->new now sets $! correctly on failure. $@ is
+still set for backwards compatability.
-=item Fcntl
+=item JPL
-More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
-large (more than 4G) file access (the 64-bit support is not yet
-working, though, so no need to get overly excited), Free/Net/OpenBSD
-locking behaviour flags F_FLOCK, F_POSIX, Linux F_SHLCK, and
-O_ACCMODE: the mask of O_RDONLY, O_WRONLY, and O_RDWR.
+Java Perl Lingo is now distributed with Perl. See jpl/README
+for more information.
+
+=item lib
+
+C<use lib> now weeds out any trailing duplicate entries.
+C<no lib> removes all named entries.
+
+=item Math::BigInt
+
+The bitwise operations C<<< << >>>, C<<< >> >>>, C<&>, C<|>,
+and C<~> are now supported on bigints.
=item Math::Complex
-The accessor methods Re, Im, arg, abs, rho, and theta, can now also
+The accessor methods Re, Im, arg, abs, rho, and theta can now also
act as mutators (accessor $z->Re(), mutator $z->Re(3)).
+The class method C<display_format> and the corresponding object method
+C<display_format>, in addition to accepting just one argument, now can
+also accept a parameter hash. Recognized keys of a parameter hash are
+C<"style">, which corresponds to the old one parameter case, and two
+new parameters: C<"format">, which is a printf()-style format string
+(defaults usually to C<"%.15g">, you can revert to the default by
+setting the format string to C<undef>) used for both parts of a
+complex number, and C<"polar_pretty_print"> (defaults to true),
+which controls whether an attempt is made to try to recognize small
+multiples and rationals of pi (2pi, pi/2) at the argument (angle) of a
+polar complex number.
+
+The potentially disruptive change is that in list context both methods
+now I<return the parameter hash>, instead of only the value of the
+C<"style"> parameter.
+
=item Math::Trig
-A little bit of radial trigonometry (cylindrical and spherical) added:
-radial coordinate conversions and the great circle distance.
+A little bit of radial trigonometry (cylindrical and spherical),
+radial coordinate conversions, and the great circle distance were added.
-=item POSIX
+=item Pod::Parser, Pod::InputObjects
-POSIX now has its own platform-specific hints files.
+Pod::Parser is a base class for parsing and selecting sections of
+pod documentation from an input stream. This module takes care of
+identifying pod paragraphs and commands in the input and hands off the
+parsed paragraphs and commands to user-defined methods which are free
+to interpret or translate them as they see fit.
-=item DB_File
+Pod::InputObjects defines some input objects needed by Pod::Parser, and
+for advanced users of Pod::Parser that need more about a command besides
+its name and text.
-DB_File supports version 2.x of Berkeley DB. See C<ext/DB_File/Changes>.
+As of release 5.6.0 of Perl, Pod::Parser is now the officially sanctioned
+"base parser code" recommended for use by all pod2xxx translators.
+Pod::Text (pod2text) and Pod::Man (pod2man) have already been converted
+to use Pod::Parser and efforts to convert Pod::HTML (pod2html) are already
+underway. For any questions or comments about pod parsing and translating
+issues and utilities, please use the pod-people@perl.org mailing list.
-=item MakeMaker
+For further information, please see L<Pod::Parser> and L<Pod::InputObjects>.
-MakeMaker now supports writing empty makefiles, provides a way to
-specify that site umask() policy should be honored. There is also
-better support for manipulation of .packlist files, and getting
-information about installed modules.
+=item Pod::Checker, podchecker
-Extensions that have both architecture-dependent and
-architecture-independent files are now always installed completely in
-the architecture-dependent locations. Previously, the shareable parts
-were shared both across architectures and across perl versions and were
-therefore liable to be overwritten with newer versions that might have
-subtle incompatibilities.
+This utility checks pod files for correct syntax, according to
+L<perlpod>. Obvious errors are flagged as such, while warnings are
+printed for mistakes that can be handled gracefully. The checklist is
+not complete yet. See L<Pod::Checker>.
-=item CPAN
+=item Pod::ParseUtils, Pod::Find
-See <perlmodinstall> and L<CPAN>.
+These modules provide a set of gizmos that are useful mainly for pod
+translators. L<Pod::Find|Pod::Find> traverses directory structures and
+returns found pod files, along with their canonical names (like
+C<File::Spec::Unix>). L<Pod::ParseUtils|Pod::ParseUtils> contains
+B<Pod::List> (useful for storing pod list information), B<Pod::Hyperlink>
+(for parsing the contents of C<LE<lt>E<gt>> sequences) and B<Pod::Cache>
+(for caching information about pod files, e.g., link nodes).
-=item Cwd
+=item Pod::Select, podselect
-Cwd::cwd is faster on most platforms.
+Pod::Select is a subclass of Pod::Parser which provides a function
+named "podselect()" to filter out user-specified sections of raw pod
+documentation from an input stream. podselect is a script that provides
+access to Pod::Select from other scripts to be used as a filter.
+See L<Pod::Select>.
-=item Benchmark
+=item Pod::Usage, pod2usage
+
+Pod::Usage provides the function "pod2usage()" to print usage messages for
+a Perl script based on its embedded pod documentation. The pod2usage()
+function is generally useful to all script authors since it lets them
+write and maintain a single source (the pods) for documentation, thus
+removing the need to create and maintain redundant usage message text
+consisting of information already in the pods.
+
+There is also a pod2usage script which can be used from other kinds of
+scripts to print usage messages from pods (even for non-Perl scripts
+with pods embedded in comments).
+
+For details and examples, please see L<Pod::Usage>.
+
+=item Pod::Text and Pod::Man
+
+Pod::Text has been rewritten to use Pod::Parser. While pod2text() is
+still available for backwards compatibility, the module now has a new
+preferred interface. See L<Pod::Text> for the details. The new Pod::Text
+module is easily subclassed for tweaks to the output, and two such
+subclasses (Pod::Text::Termcap for man-page-style bold and underlining
+using termcap information, and Pod::Text::Color for markup with ANSI color
+sequences) are now standard.
+
+pod2man has been turned into a module, Pod::Man, which also uses
+Pod::Parser. In the process, several outstanding bugs related to quotes
+in section headers, quoting of code escapes, and nested lists have been
+fixed. pod2man is now a wrapper script around this module.
+
+=item SDBM_File
+
+An EXISTS method has been added to this module (and sdbm_exists() has
+been added to the underlying sdbm library), so one can now call exists
+on an SDBM_File tied hash and get the correct result, rather than a
+runtime error.
+
+A bug that may have caused data loss when more than one disk block
+happens to be read from the database in a single FETCH() has been
+fixed.
+
+=item Sys::Syslog
-Keeps better time.
+Sys::Syslog now uses XSUBs to access facilities from syslog.h so it
+no longer requires syslog.ph to exist.
+
+=item Sys::Hostname
+
+Sys::Hostname now uses XSUBs to call the C library's gethostname() or
+uname() if they exist.
+
+=item Term::ANSIColor
+
+Term::ANSIColor is a very simple module to provide easy and readable
+access to the ANSI color and highlighting escape sequences, supported by
+most ANSI terminal emulators. It is now included standard.
+
+=item Time::Local
+
+The timelocal() and timegm() functions used to silently return bogus
+results when the date fell outside the machine's integer range. They
+now consistently croak() if the date falls in an unsupported range.
+
+=item Win32
+
+The error return value in list context has been changed for all functions
+that return a list of values. Previously these functions returned a list
+with a single element C<undef> if an error occurred. Now these functions
+return the empty list in these situations. This applies to the following
+functions:
+
+ Win32::FsType
+ Win32::GetOSVersion
+
+The remaining functions are unchanged and continue to return C<undef> on
+error even in list context.
+
+The Win32::SetLastError(ERROR) function has been added as a complement
+to the Win32::GetLastError() function.
+
+The new Win32::GetFullPathName(FILENAME) returns the full absolute
+pathname for FILENAME in scalar context. In list context it returns
+a two-element list containing the fully qualified directory name and
+the filename. See L<Win32>.
+
+=item XSLoader
+
+The XSLoader extension is a simpler alternative to DynaLoader.
+See L<XSLoader>.
+
+=item DBM Filters
+
+A new feature called "DBM Filters" has been added to all the
+DBM modules--DB_File, GDBM_File, NDBM_File, ODBM_File, and SDBM_File.
+DBM Filters add four new methods to each DBM module:
+
+ filter_store_key
+ filter_store_value
+ filter_fetch_key
+ filter_fetch_value
+
+These can be used to filter key-value pairs before the pairs are
+written to the database or just after they are read from the database.
+See L<perldbmfilter> for further information.
=back
+=head2 Pragmata
+
+C<use attrs> is now obsolete, and is only provided for
+backward-compatibility. It's been replaced by the C<sub : attributes>
+syntax. See L<perlsub/"Subroutine Attributes"> and L<attributes>.
+
+Lexical warnings pragma, C<use warnings;>, to control optional warnings.
+See L<perllexwarn>.
+
+C<use filetest> to control the behaviour of filetests (C<-r> C<-w>
+...). Currently only one subpragma implemented, "use filetest
+'access';", that uses access(2) or equivalent to check permissions
+instead of using stat(2) as usual. This matters in filesystems
+where there are ACLs (access control lists): the stat(2) might lie,
+but access(2) knows better.
+
+The C<open> pragma can be used to specify default disciplines for
+handle constructors (e.g. open()) and for qx//. The two
+pseudo-disciplines C<:raw> and C<:crlf> are currently supported on
+DOS-derivative platforms (i.e. where binmode is not a no-op).
+See also L</"binmode() can be used to set :crlf and :raw modes">.
+
=head1 Utility Changes
-C<h2ph> and related utilities have been vastly overhauled.
+=head2 dprofpp
-C<perlcc>, a new experimental front end for the compiler is available.
+C<dprofpp> is used to display profile data generated using C<Devel::DProf>.
+See L<dprofpp>.
-The crude GNU C<configure> emulator is now called C<configure.gnu> to
-avoid trampling on C<Configure> under case-insensitive filesystems.
+=head2 find2perl
-C<perldoc> used to be rather slow. The slower features are now optional.
-In particular, case-insensitive searches need the C<-i> switch, and
-recursive searches need C<-r>. You can set these switches in the
-C<PERLDOC> environment variable to get the old behavior.
+The C<find2perl> utility now uses the enhanced features of the File::Find
+module. The -depth and -follow options are supported. Pod documentation
+is also included in the script.
-=head1 Documentation Changes
+=head2 h2xs
-Config.pm now has a glossary of variables.
+The C<h2xs> tool can now work in conjunction with C<C::Scan> (available
+from CPAN) to automatically parse real-life header files. The C<-M>,
+C<-a>, C<-k>, and C<-o> options are new.
-F<Porting/patching.pod> has detailed instructions on how to create and
-submit patches for perl.
+=head2 perlcc
-L<perlport> specifies guidelines on how to write portably.
+C<perlcc> now supports the C and Bytecode backends. By default,
+it generates output from the simple C backend rather than the
+optimized C backend.
-L<perlmodinstall> describes how to fetch and install modules from C<CPAN>
-sites.
+Support for non-Unix platforms has been improved.
-Some more Perl traps are documented now. See L<perltrap>.
+=head2 perldoc
-L<perlopentut> gives a tutorial on using open().
+C<perldoc> has been reworked to avoid possible security holes.
+It will not by default let itself be run as the superuser, but you
+may still use the B<-U> switch to try to make it drop privileges
+first.
-L<perlreftut> gives a tutorial on references.
+=head2 The Perl Debugger
-L<perlthrtut> gives a tutorial on threads.
+Many bug fixes and enhancements were added to F<perl5db.pl>, the
+Perl debugger. The help documentation was rearranged. New commands
+include C<< < ? >>, C<< > ? >>, and C<< { ? >> to list out current
+actions, C<man I<docpage>> to run your doc viewer on some perl
+docset, and support for quoted options. The help information was
+rearranged, and should be viewable once again if you're using B<less>
+as your pager. A serious security hole was plugged--you should
+immediately remove all older versions of the Perl debugger as
+installed in previous releases, all the way back to perl3, from
+your system to avoid being bitten by this.
-=head1 New Diagnostics
+=head1 Improved Documentation
-=over
+Many of the platform-specific README files are now part of the perl
+installation. See L<perl> for the complete list.
+
+=over 4
+
+=item perlapi.pod
+
+The official list of public Perl API functions.
+
+=item perlboot.pod
+
+A tutorial for beginners on object-oriented Perl.
+
+=item perlcompile.pod
+
+An introduction to using the Perl Compiler suite.
+
+=item perldbmfilter.pod
+
+A howto document on using the DBM filter facility.
+
+=item perldebug.pod
+
+All material unrelated to running the Perl debugger, plus all
+low-level guts-like details that risked crushing the casual user
+of the debugger, have been relocated from the old manpage to the
+next entry below.
+
+=item perldebguts.pod
+
+This new manpage contains excessively low-level material not related
+to the Perl debugger, but slightly related to debugging Perl itself.
+It also contains some arcane internal details of how the debugging
+process works that may only be of interest to developers of Perl
+debuggers.
+
+=item perlfork.pod
+
+Notes on the fork() emulation currently available for the Windows platform.
+
+=item perlfilter.pod
+
+An introduction to writing Perl source filters.
+
+=item perlhack.pod
-=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
+Some guidelines for hacking the Perl source code.
-(W) A subroutine you have declared has the same name as a Perl keyword,
-and you have used the name without qualification for calling one or the
-other. Perl decided to call the builtin because the subroutine is
-not imported.
+=item perlintern.pod
-To force interpretation as a subroutine call, either put an ampersand
-before the subroutine name, or qualify the name with its package.
-Alternatively, you can import the subroutine (or pretend that it's
-imported with the C<use subs> pragma).
+A list of internal functions in the Perl source code.
+(List is currently empty.)
-To silently interpret it as the Perl operator, use the C<CORE::> prefix
-on the operator (e.g. C<CORE::log($x)>) or by declaring the subroutine
-to be an object method (see L<attrs>).
+=item perllexwarn.pod
-=item Bad index while coercing array into hash
+Introduction and reference information about lexically scoped
+warning categories.
-(F) The index looked up in the hash found as the 0'th element of a
-pseudo-hash is not legal. Index values must be at 1 or greater.
-See L<perlref>.
+=item perlnumber.pod
-=item Bareword "%s" refers to nonexistent package
+Detailed information about numbers as they are represented in Perl.
-(W) You used a qualified bareword of the form C<Foo::>, but
-the compiler saw no other uses of that namespace before that point.
-Perhaps you need to predeclare a package?
+=item perlopentut.pod
-=item Can't call method "%s" on an undefined value
+A tutorial on using open() effectively.
-(F) You used the syntax of a method call, but the slot filled by the
-object reference or package name contains an undefined value.
-Something like this will reproduce the error:
+=item perlreftut.pod
+
+A tutorial that introduces the essentials of references.
+
+=item perltootc.pod
+
+A tutorial on managing class data for object modules.
+
+=item perltodo.pod
+
+Discussion of the most often wanted features that may someday be
+supported in Perl.
+
+=item perlunicode.pod
+
+An introduction to Unicode support features in Perl.
+
+=back
+
+=head1 Performance enhancements
+
+=head2 Simple sort() using { $a <=> $b } and the like are optimized
+
+Many common sort() operations using a simple inlined block are now
+optimized for faster performance.
+
+=head2 Optimized assignments to lexical variables
+
+Certain operations in the RHS of assignment statements have been
+optimized to directly set the lexical variable on the LHS,
+eliminating redundant copying overheads.
+
+=head2 Faster subroutine calls
+
+Minor changes in how subroutine calls are handled internally
+provide marginal improvements in performance.
+
+=item delete(), each(), values() and hash iteration are faster
+
+The hash values returned by delete(), each(), values() and hashes in a
+list context are the actual values in the hash, instead of copies.
+This results in significantly better performance, because it eliminates
+needless copying in most situations.
+
+=head1 Installation and Configuration Improvements
+
+=head2 -Dusethreads means something different
+
+The -Dusethreads flag now enables the experimental interpreter-based thread
+support by default. To get the flavor of experimental threads that was in
+5.005 instead, you need to run Configure with "-Dusethreads -Duse5005threads".
+
+As of v5.6.0, interpreter-threads support is still lacking a way to
+create new threads from Perl (i.e., C<use Thread;> will not work with
+interpreter threads). C<use Thread;> continues to be available when you
+specify the -Duse5005threads option to Configure, bugs and all.
+
+ NOTE: Support for threads continues to be an experimental feature.
+ Interfaces and implementation are subject to sudden and drastic changes.
+
+=head2 New Configure flags
+
+The following new flags may be enabled on the Configure command line
+by running Configure with C<-Dflag>.
+
+ usemultiplicity
+ usethreads useithreads (new interpreter threads: no Perl API yet)
+ usethreads use5005threads (threads as they were in 5.005)
+
+ use64bitint (equal to now deprecated 'use64bits')
+ use64bitall
+
+ uselongdouble
+ usemorebits
+ uselargefiles
+ usesocks (only SOCKS v5 supported)
+
+=head2 Threadedness and 64-bitness now more daring
+
+The Configure options enabling the use of threads and the use of
+64-bitness are now more daring in the sense that they no more have an
+explicit list of operating systems of known threads/64-bit
+capabilities. In other words: if your operating system has the
+necessary APIs and datatypes, you should be able just to go ahead and
+use them, for threads by Configure -Dusethreads, and for 64 bits
+either explicitly by Configure -Duse64bitint or implicitly if your
+system has 64-bit wide datatypes. See also L<"64-bit support">.
+
+=head2 Long Doubles
+
+Some platforms have "long doubles", floating point numbers of even
+larger range than ordinary "doubles". To enable using long doubles for
+Perl's scalars, use -Duselongdouble.
+
+=head2 -Dusemorebits
+
+You can enable both -Duse64bitint and -Duselongdouble with -Dusemorebits.
+See also L<"64-bit support">.
+
+=head2 -Duselargefiles
+
+Some platforms support system APIs that are capable of handling large files
+(typically, files larger than two gigabytes). Perl will try to use these
+APIs if you ask for -Duselargefiles.
+
+See L<"Large file support"> for more information.
+
+=head2 installusrbinperl
+
+You can use "Configure -Uinstallusrbinperl" which causes installperl
+to skip installing perl also as /usr/bin/perl. This is useful if you
+prefer not to modify /usr/bin for some reason or another but harmful
+because many scripts assume to find Perl in /usr/bin/perl.
+
+=head2 SOCKS support
+
+You can use "Configure -Dusesocks" which causes Perl to probe
+for the SOCKS proxy protocol library (v5, not v4). For more information
+on SOCKS, see:
+
+ http://www.socks.nec.com/
+
+=head2 C<-A> flag
+
+You can "post-edit" the Configure variables using the Configure C<-A>
+switch. The editing happens immediately after the platform specific
+hints files have been processed but before the actual configuration
+process starts. Run C<Configure -h> to find out the full C<-A> syntax.
+
+=head2 Enhanced Installation Directories
+
+The installation structure has been enriched to improve the support
+for maintaining multiple versions of perl, to provide locations for
+vendor-supplied modules, scripts, and manpages, and to ease maintenance
+of locally-added modules, scripts, and manpages. See the section on
+Installation Directories in the INSTALL file for complete details.
+For most users building and installing from source, the defaults should
+be fine.
+
+If you previously used C<Configure -Dsitelib> or C<-Dsitearch> to set
+special values for library directories, you might wish to consider using
+the new C<-Dsiteprefix> setting instead. Also, if you wish to re-use a
+config.sh file from an earlier version of perl, you should be sure to
+check that Configure makes sensible choices for the new directories.
+See INSTALL for complete details.
+
+=head1 Platform specific changes
+
+=head2 Supported platforms
+
+=over 4
+
+=item *
+
+VM/ESA is now supported.
+
+=item *
+
+Siemens BS2000 is now supported under the POSIX Shell.
+
+=item *
+
+The Mach CThreads (NEXTSTEP, OPENSTEP) are now supported by the Thread
+extension.
+
+=item *
+
+GNU/Hurd is now supported.
+
+=item *
+
+Rhapsody/Darwin is now supported.
+
+=item *
+
+EPOC is is now supported (on Psion 5).
+
+=item *
+
+The cygwin port (formerly cygwin32) has been greatly improved.
+
+=back
+
+=head2 DOS
+
+=over 4
+
+=item *
+
+Perl now works with djgpp 2.02 (and 2.03 alpha).
+
+=item *
+
+Environment variable names are not converted to uppercase any more.
+
+=item *
+
+Incorrect exit codes from backticks have been fixed.
+
+=item *
+
+This port continues to use its own builtin globbing (not File::Glob).
+
+=back
+
+=head2 OS390 (OpenEdition MVS)
+
+Support for this EBCDIC platform has not been renewed in this release.
+There are difficulties in reconciling Perl's standardization on UTF-8
+as its internal representation for characters with the EBCDIC character
+set, because the two are incompatible.
+
+It is unclear whether future versions will renew support for this
+platform, but the possibility exists.
+
+=head2 VMS
+
+Numerous revisions and extensions to configuration, build, testing, and
+installation process to accomodate core changes and VMS-specific options.
+
+Expand %ENV-handling code to allow runtime mapping to logical names,
+CLI symbols, and CRTL environ array.
+
+Extension of subprocess invocation code to accept filespecs as command
+"verbs".
+
+Add to Perl command line processing the ability to use default file types and
+to recognize Unix-style C<2E<gt>&1>.
+
+Expansion of File::Spec::VMS routines, and integration into ExtUtils::MM_VMS.
+
+Extension of ExtUtils::MM_VMS to handle complex extensions more flexibly.
+
+Barewords at start of Unix-syntax paths may be treated as text rather than
+only as logical names.
+
+Optional secure translation of several logical names used internally by Perl.
+
+Miscellaneous bugfixing and porting of new core code to VMS.
+
+Thanks are gladly extended to the many people who have contributed VMS
+patches, testing, and ideas.
+
+=head2 Win32
+
+Perl can now emulate fork() internally, using multiple interpreters running
+in different concurrent threads. This support must be enabled at build
+time. See L<perlfork> for detailed information.
+
+When given a pathname that consists only of a drivename, such as C<A:>,
+opendir() and stat() now use the current working directory for the drive
+rather than the drive root.
+
+The builtin XSUB functions in the Win32:: namespace are documented. See
+L<Win32>.
+
+$^X now contains the full path name of the running executable.
+
+A Win32::GetLongPathName() function is provided to complement
+Win32::GetFullPathName() and Win32::GetShortPathName(). See L<Win32>.
+
+POSIX::uname() is supported.
+
+system(1,...) now returns true process IDs rather than process
+handles. kill() accepts any real process id, rather than strictly
+return values from system(1,...).
+
+For better compatibility with Unix, C<kill(0, $pid)> can now be used to
+test whether a process exists.
+
+The C<Shell> module is supported.
+
+Better support for building Perl under command.com in Windows 95
+has been added.
+
+Scripts are read in binary mode by default to allow ByteLoader (and
+the filter mechanism in general) to work properly. For compatibility,
+the DATA filehandle will be set to text mode if a carriage return is
+detected at the end of the line containing the __END__ or __DATA__
+token; if not, the DATA filehandle will be left open in binary mode.
+Earlier versions always opened the DATA filehandle in text mode.
+
+The glob() operator is implemented via the C<File::Glob> extension,
+which supports glob syntax of the C shell. This increases the flexibility
+of the glob() operator, but there may be compatibility issues for
+programs that relied on the older globbing syntax. If you want to
+preserve compatibility with the older syntax, you might want to run
+perl with C<-MFile::DosGlob>. For details and compatibility information,
+see L<File::Glob>.
+
+=head1 Significant bug fixes
+
+=head2 <HANDLE> on empty files
+
+With C<$/> set to C<undef>, "slurping" an empty file returns a string of
+zero length (instead of C<undef>, as it used to) the first time the
+HANDLE is read after C<$/> is set to C<undef>. Further reads yield
+C<undef>.
+
+This means that the following will append "foo" to an empty file (it used
+to do nothing):
+
+ perl -0777 -pi -e 's/^/foo/' empty_file
+
+The behaviour of:
+
+ perl -pi -e 's/^/foo/' empty_file
+
+is unchanged (it continues to leave the file empty).
+
+=head2 C<eval '...'> improvements
+
+Line numbers (as reflected by caller() and most diagnostics) within
+C<eval '...'> were often incorrect where here documents were involved.
+This has been corrected.
+
+Lexical lookups for variables appearing in C<eval '...'> within
+functions that were themselves called within an C<eval '...'> were
+searching the wrong place for lexicals. The lexical search now
+correctly ends at the subroutine's block boundary.
+
+The use of C<return> within C<eval {...}> caused $@ not to be reset
+correctly when no exception occurred within the eval. This has
+been fixed.
+
+Parsing of here documents used to be flawed when they appeared as
+the replacement expression in C<eval 's/.../.../e'>. This has
+been fixed.
+
+=head2 All compilation errors are true errors
+
+Some "errors" encountered at compile time were by neccessity
+generated as warnings followed by eventual termination of the
+program. This enabled more such errors to be reported in a
+single run, rather than causing a hard stop at the first error
+that was encountered.
+
+The mechanism for reporting such errors has been reimplemented
+to queue compile-time errors and report them at the end of the
+compilation as true errors rather than as warnings. This fixes
+cases where error messages leaked through in the form of warnings
+when code was compiled at run time using C<eval STRING>, and
+also allows such errors to be reliably trapped using C<eval "...">.
+
+=head2 Implicitly closed filehandles are safer
+
+Sometimes implicitly closed filehandles (as when they are localized,
+and Perl automatically closes them on exiting the scope) could
+inadvertently set $? or $!. This has been corrected.
+
+
+=head2 Behavior of list slices is more consistent
+
+When taking a slice of a literal list (as opposed to a slice of
+an array or hash), Perl used to return an empty list if the
+result happened to be composed of all undef values.
+
+The new behavior is to produce an empty list if (and only if)
+the original list was empty. Consider the following example:
+
+ @a = (1,undef,undef,2)[2,1,2];
+
+The old behavior would have resulted in @a having no elements.
+The new behavior ensures it has three undefined elements.
+
+Note in particular that the behavior of slices of the following
+cases remains unchanged:
+
+ @a = ()[1,2];
+ @a = (getpwent)[7,0];
+ @a = (anything_returning_empty_list())[2,1,2];
+ @a = @b[2,1,2];
+ @a = @c{'a','b','c'};
+
+See L<perldata>.
+
+=head2 C<(\$)> prototype and C<$foo{a}>
+
+A scalar reference prototype now correctly allows a hash or
+array element in that slot.
+
+=head2 C<goto &sub> and AUTOLOAD
+
+The C<goto &sub> construct works correctly when C<&sub> happens
+to be autoloaded.
+
+=head2 C<-bareword> allowed under C<use integer>
+
+The autoquoting of barewords preceded by C<-> did not work
+in prior versions when the C<integer> pragma was enabled.
+This has been fixed.
+
+=head2 Failures in DESTROY()
+
+When code in a destructor threw an exception, it went unnoticed
+in earlier versions of Perl, unless someone happened to be
+looking in $@ just after the point the destructor happened to
+run. Such failures are now visible as warnings when warnings are
+enabled.
+
+=head2 Locale bugs fixed
+
+printf() and sprintf() previously reset the numeric locale
+back to the default "C" locale. This has been fixed.
+
+Numbers formatted according to the local numeric locale
+(such as using a decimal comma instead of a decimal dot) caused
+"isn't numeric" warnings, even while the operations accessing
+those numbers produced correct results. These warnings have been
+discontinued.
+
+=head2 Memory leaks
+
+The C<eval 'return sub {...}'> construct could sometimes leak
+memory. This has been fixed.
+
+Operations that aren't filehandle constructors used to leak memory
+when used on invalid filehandles. This has been fixed.
+
+Constructs that modified C<@_> could fail to deallocate values
+in C<@_> and thus leak memory. This has been corrected.
+
+=head2 Spurious subroutine stubs after failed subroutine calls
+
+Perl could sometimes create empty subroutine stubs when a
+subroutine was not found in the package. Such cases stopped
+later method lookups from progressing into base packages.
+This has been corrected.
+
+=head2 Taint failures under C<-U>
+
+When running in unsafe mode, taint violations could sometimes
+cause silent failures. This has been fixed.
+
+=head2 END blocks and the C<-c> switch
+
+Prior versions used to run BEGIN B<and> END blocks when Perl was
+run in compile-only mode. Since this is typically not the expected
+behavior, END blocks are not executed anymore when the C<-c> switch
+is used.
+
+See L<CHECK blocks> for how to run things when the compile phase ends.
+
+=head2 Potential to leak DATA filehandles
+
+Using the C<__DATA__> token creates an implicit filehandle to
+the file that contains the token. It is the program's
+responsibility to close it when it is done reading from it.
+
+This caveat is now better explained in the documentation.
+See L<perldata>.
+
+=head1 New or Changed Diagnostics
+
+=over 4
- $BADREF = 42;
- process $BADREF 1,2,3;
- $BADREF->process(1,2,3);
+=item "%s" variable %s masks earlier declaration in same %s
-=item Can't check filesystem of script "%s" for nosuid
+(W misc) A "my" or "our" variable has been redeclared in the current scope or statement,
+effectively eliminating all access to the previous instance. This is almost
+always a typographical error. Note that the earlier variable will still exist
+until the end of the scope or until all closure referents to it are
+destroyed.
+
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented. Don't try that
+yet.
+
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before in the
+current lexical scope.
+
+=item '!' allowed only after types %s
+
+(F) The '!' is allowed in pack() and unpack() only after certain types.
+See L<perlfunc/pack>.
+
+=item / cannot take a count
+
+(F) You had an unpack template indicating a counted-length string,
+but you have also specified an explicit size for the string.
+See L<perlfunc/pack>.
+
+=item / must be followed by a, A or Z
+
+(F) You had an unpack template indicating a counted-length string,
+which must be followed by one of the letters a, A or Z
+to indicate what sort of string is to be unpacked.
+See L<perlfunc/pack>.
+
+=item / must be followed by a*, A* or Z*
+
+(F) You had a pack template indicating a counted-length string,
+Currently the only things that can have their length counted are a*, A* or Z*.
+See L<perlfunc/pack>.
+
+=item / must follow a numeric type
+
+(F) You had an unpack template that contained a '#',
+but this did not follow some numeric unpack specification.
+See L<perlfunc/pack>.
+
+=item /%s/: Unrecognized escape \\%c passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl. This combination appears in an interpolated variable or a
+C<'>-delimited regular expression. The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl inside character classes. The character was understood literally.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>. Perl will treat the true
+or false result of matching the pattern against $_ as the string,
+which is probably not what you had in mind.
+
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the parser saw a
+definition or declaration for it, and Perl could not check that the call
+conforms to the prototype. You need to either add an early prototype
+declaration for the subroutine in question, or move the subroutine
+definition ahead of the call to get proper prototype checking. Alternatively,
+if you are certain that you're calling the function correctly, you may put
+an ampersand before the name to avoid the warning. See L<perlsub>.
+
+=item %s argument is not a HASH or ARRAY element
+
+(F) The argument to exists() must be a hash or array element, such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+
+=item %s argument is not a HASH or ARRAY element or slice
+
+(F) The argument to delete() must be either a hash or array element, such as:
+
+ $foo{$bar}
+ $ref->{"susie"}[12]
+
+or a hash or array slice, such as:
+
+ @foo[$bar, $baz, $xyzzy]
+ @{$ref->[12]}{"susie", "queue"}
+
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call. C<exists &sub()> will generate this error.
+
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a package-specific handler.
+That name might have a meaning to Perl itself some day, even though it
+doesn't yet. Perhaps you should use a mixed-case attribute name, instead.
+See L<attributes>.
+
+=item (in cleanup) %s
+
+(W misc) This prefix usually indicates that a DESTROY() method raised
+the indicated exception. Since destructors are usually called by
+the system at arbitrary points during execution, and often a vast
+number of times, the warning is issued only once for any number
+of failures that would otherwise result in the same message being
+repeated.
+
+Failure of user callbacks dispatched using the C<G_KEEPERR> flag
+could also result in this warning. See L<perlcall/G_KEEPERR>.
+
+=item <> should be quotes
+
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task. You may be joining the wrong thread, or you may
+need to move the join() to some other thread.
+
+=item Bad evalled substitution pattern
+
+(F) You've used the /e switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
+=item Bad realloc() ignored
+
+(S) An internal routine called realloc() on something that had never been
+malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 1.
+
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+ open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted
+as a bareword:
+
+ use constant TYPO => 1;
+ if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS. While Perl was preparing to iterate over
+%ENV, it encountered a logical name or symbol definition which was too long,
+so it was truncated to the string shown.
+
+=item Can't check filesystem of script "%s"
(P) For some reason you can't check the filesystem of the script for nosuid.
-=item Can't coerce array into hash
+=item Can't declare class for non-scalar %s in "%s"
-(F) You used an array where a hash was expected, but the array has no
-information on how to map from keys to array indices. You can do that
-only with arrays that have a hash reference at index 0.
+(S) Currently, only scalar variables can declared with a specific class
+qualifier in a "my" or "our" declaration. The semantics may be extended
+for other types of variables in future.
-=item Can't goto subroutine from an eval-string
+=item Can't declare %s in "%s"
-(F) The "goto subroutine" call can't be used to jump out of an eval "string".
-(You can use it to jump out of an eval {BLOCK}, but you probably don't want to.)
+(F) Only scalar, array, and hash variables may be declared as "my" or
+"our" variables. They must have ordinary identifiers as names.
-=item Can't localize pseudo-hash element
+=item Can't ignore signal CHLD, forcing to default
-(F) You said something like C<local $ar-E<gt>{'key'}>, where $ar is
-a reference to a pseudo-hash. That hasn't been implemented yet, but
-you can get a similar effect by localizing the corresponding array
-element directly -- C<local $ar-E<gt>[$ar-E<gt>[0]{'key'}]>.
+(W signal) Perl has detected that it is being run with the SIGCHLD signal
+(sometimes known as SIGCLD) disabled. Since disabling this signal
+will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value.
+This situation typically indicates that the parent program under
+which Perl may be running (e.g., cron) is being very careless.
-=item Can't use %%! because Errno.pm is not available
+=item Can't modify non-lvalue subroutine call
-(F) The first time the %! hash is used, perl automatically loads the
-Errno.pm module. The Errno module is expected to tie the %! hash to
-provide symbolic names for C<$!> errno values.
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
-=item Cannot find an opnumber for "%s"
+=item Can't read CRTL environ
-(F) A string of a form C<CORE::word> was given to prototype(), but
-there is no builtin with the name C<word>.
+(S) A warning peculiar to VMS. Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing. You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not searched.
-=item Character class syntax [. .] is reserved for future extensions
+=item Can't remove %s: %s, skipping file
-(W) Within regular expression character classes ([]) the syntax beginning
-with "[." and ending with ".]" is reserved for future extensions.
-If you need to represent those character sequences inside a regular
-expression character class, just quote the square brackets with the
-backslash: "\[." and ".\]".
+(S) You requested an inplace edit without creating a backup file. Perl
+was unable to remove the original file to replace it with the modified
+file. The file was left unmodified.
-=item Character class syntax [: :] is reserved for future extensions
+=item Can't return %s from lvalue subroutine
-(W) Within regular expression character classes ([]) the syntax beginning
-with "[:" and ending with ":]" is reserved for future extensions.
-If you need to represent those character sequences inside a regular
-expression character class, just quote the square brackets with the
-backslash: "\[:" and ":\]".
+(F) Perl detected an attempt to return illegal lvalues (such
+as temporary or readonly values) from a subroutine used as an lvalue.
+This is not allowed.
-=item Character class syntax [= =] is reserved for future extensions
+=item Can't weaken a nonreference
-(W) Within regular expression character classes ([]) the syntax
-beginning with "[=" and ending with "=]" is reserved for future extensions.
-If you need to represent those character sequences inside a regular
-expression character class, just quote the square brackets with the
-backslash: "\[=" and "=\]".
+(F) You attempted to weaken something that was not a reference. Only
+references can be weakened.
+
+=item Character class [:%s:] unknown
+
+(F) The class in the character class [: :] syntax is unknown.
+See L<perlre>.
+
+=item Character class syntax [%s] belongs inside character classes
+
+(W unsafe) The character class constructs [: :], [= =], and [. .] go
+I<inside> character classes, the [] are part of the construct,
+for example: /[012[:alpha:]345]/. Note that [= =] and [. .]
+are not currently implemented; they are simply placeholders for
+future extensions.
+
+=item Constant is not %s reference
+
+(F) A constant value (perhaps declared using the C<use constant> pragma)
+is being dereferenced, but it amounts to the wrong type of reference. The
+message indicates the type of reference that was expected. This usually
+indicates a syntax error in dereferencing the constant value.
+See L<perlsub/"Constant Functions"> and L<constant>.
+
+=item constant(%s): %s
+
+(F) The parser found inconsistencies either while attempting to define an
+overloaded constant, or when trying to find the character name specified
+in the C<\N{...}> escape. Perhaps you forgot to load the corresponding
+C<overload> or C<charnames> pragma? See L<charnames> and L<overload>.
+
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
+=item defined(@array) is deprecated
+
+(D) defined() is not usually useful on arrays because it checks for an
+undefined I<scalar> value. If you want to see if the array is empty,
+just use C<if (@array) { # not empty }> for example.
+
+=item defined(%hash) is deprecated
+
+(D) defined() is not usually useful on hashes because it checks for an
+undefined I<scalar> value. If you want to see if the hash is empty,
+just use C<if (%hash) { # not empty }> for example.
+
+=item Did not produce a valid header
+
+See Server error.
+
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global variable.
+You have declared it again in the same lexical scope, which seems superfluous.
+
+=item Document contains no data
+
+See Server error.
+
+=item entering effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item false [] range "%s" in regexp
+
+(W regexp) A character class range must start and end at a literal character, not
+another character class like C<\d> or C<[:alpha:]>. The "-" in your false
+range is interpreted as a literal "-". Consider quoting the "-", "\-".
+See L<perlre>.
+
+=item Filehandle %s opened only for output
+
+(W io) You tried to read from a filehandle opened only for writing. If you
+intended it to be a read/write filehandle, you needed to open it with
+"+<" or "+>" or "+>>" instead of with "<" or nothing. If
+you intended only to read from the file, use "<". See
+L<perlfunc/open>.
+
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed some
+time before now. Check your logic flow. flock() operates on filehandles.
+Are you attempting to call flock() on a dirhandle by the same name?
+
+=item Global symbol "%s" requires explicit package name
+
+(F) You've said "use strict vars", which indicates that all variables
+must either be lexically scoped (using "my"), declared beforehand using
+"our", or explicitly qualified to say which package the global variable
+is in (using "::").
+
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
+=item Ill-formed CRTL environ value "%s"
+
+(W internal) A warning peculiar to VMS. Perl tried to read the CRTL's internal
+environ array, and encountered an element without the C<=> delimiter
+used to spearate keys from values. The element is ignored.
+
+=item Ill-formed message in prime_env_iter: |%s|
+
+(W internal) A warning peculiar to VMS. Perl tried to read a logical name
+or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the
+line was ignored.
+
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a binary number.
+Interpretation of the binary number stopped before the offending digit.
+
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
+=item Integer overflow in %s number
+
+(W overflow) The hexadecimal, octal or binary number you have specified either
+as a literal or as an argument to hex() or oct() is too big for your
+architecture, and has been converted to a floating point number. On a
+32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively. Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
+
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item invalid [] range "%s" in regexp
+
+The offending range is now explicitly displayed.
+
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list. If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon. See L<attributes>.
+
+=item Invalid separator character %s in subroutine attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of a subroutine attribute list. If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon.
+
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
+
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context.
+See L<perlsub/"Lvalue subroutines">.
+
+=item Method %s not permitted
+
+See Server error.
+
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or C<open(FH, "command |")>
+construction, but the command was missing or blank.
+
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that they
+have a name with which they can be found.
+
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our" declarations,
+because that doesn't make much sense under existing semantics. Such
+syntax is reserved for future extensions.
+
+=item No space allowed after -%c
+
+(F) The argument to the indicated command line switch must follow immediately
+after the switch, without intervening spaces.
+
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS. Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC. If it's not, define the logical name F<SYS$TIMEZONE_DIFFERENTIAL>
+to translate to the number of seconds which need to be added to UTC to
+get local time.
+
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1 (4294967295)
+and therefore non-portable between systems. See L<perlport> for more
+on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
+=item Parentheses missing around "%s" list
+
+(W parenthesis) You said something like
+
+ my $foo, $bar = @_;
+
+when you meant
+
+ my ($foo, $bar) = @_;
+
+Remember that "my", "our", and "local" bind tighter than comma.
+
+=item Possible Y2K bug: %s
+
+(W y2k) You are concatenating the number 19 with another number, which
+could be a potential Year 2000 problem.
+
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(W deprecated) You have written somehing like this:
+
+ sub doit
+ {
+ use attrs qw(locked);
+ }
+
+You should use the new declaration syntax instead.
+
+ sub doit : locked
+ {
+ ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
+
+=item Premature end of script headers
+
+See Server error.
+
+=item Repeat count in pack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/pack>.
+
+=item Repeat count in unpack overflows
-=item %s: Eval-group in insecure regular expression
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/unpack>.
-(F) Perl detected tainted data when trying to compile a regular expression
-that contains the C<(?{ ... })> zero-width assertion, which is unsafe.
-See L<perlre/(?{ code })>, and L<perlsec>.
+=item realloc() of freed memory ignored
-=item %s: Eval-group not allowed, use re 'eval'
+(S) An internal routine called realloc() on something that had already
+been freed.
-(F) A regular expression contained the C<(?{ ... })> zero-width assertion,
-but that construct is only allowed when the C<use re 'eval'> pragma is
-in effect. See L<perlre/(?{ code })>.
+=item Reference is already weak
-=item %s: Eval-group not allowed at run time
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
-(F) Perl tried to compile a regular expression containing the C<(?{ ... })>
-zero-width assertion at run time, as it would when the pattern contains
-interpolated values. Since that is a security risk, it is not allowed.
-If you insist, you may still do this by explicitly building the pattern
-from an interpolated string at run time and using that in an eval().
-See L<perlre/(?{ code })>.
+=item setpgrp can't take arguments
-=item Explicit blessing to '' (assuming package main)
+(F) Your system has the setpgrp() from BSD 4.2, which takes no arguments,
+unlike POSIX setpgid(), which takes a process ID and process group ID.
-(W) You are blessing a reference to a zero length string. This has
-the effect of blessing the reference into the package main. This is
-usually not what you want. Consider providing a default target
-package, e.g. bless($ref, $p || 'MyPackage');
+=item Strange *+?{} on zero-length expression
-=item Illegal hex digit ignored
+(W regexp) You applied a regular expression quantifier in a place where it
+makes no sense, such as on a zero-width assertion.
+Try putting the quantifier inside the assertion instead. For example,
+the way to match "abc" provided that it is followed by three
+repetitions of "xyz" is C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
-(W) You may have tried to use a character other than 0 - 9 or A - F in a
-hexadecimal number. Interpretation of the hexadecimal number stopped
-before the illegal character.
+=item switching effective %s is not implemented
-=item No such array field
+(F) While under the C<use filetest> pragma, we cannot switch the
+real and effective uids or gids.
-(F) You tried to access an array as a hash, but the field name used is
-not defined. The hash at index 0 should map all valid field names to
-array indices for that to work.
+=item This Perl can't reset CRTL environ elements (%s)
-=item No such field "%s" in variable %s of type %s
+=item This Perl can't set CRTL environ elements (%s=%s)
-(F) You tried to access a field of a typed variable where the type
-does not know about the field name. The field names are looked up in
-the %FIELDS hash in the type package at compile time. The %FIELDS hash
-is usually set up with the 'fields' pragma.
+(W internal) Warnings peculiar to VMS. You tried to change or delete an element
+of the CRTL's internal environ array, but your copy of Perl wasn't
+built with a CRTL that contained the setenv() function. You'll need to
+rebuild Perl with a CRTL that does, or redefine F<PERL_ENV_TABLES> (see
+L<perlvms>) so that the environ array isn't the target of the change to
+%ENV which produced the warning.
-=item Out of memory during ridiculously large request
+=item Too late to run %s block
-(F) You can't allocate more than 2^31+"small amount" bytes. This error
-is most likely to be caused by a typo in the Perl program. e.g., C<$arr[time]>
-instead of C<$arr[$time]>.
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed. Perhaps you are
+loading a file with C<require> or C<do> when you should be using
+C<use> instead. Or perhaps you should put the C<require> or C<do>
+inside a BEGIN block.
-=item Range iterator outside integer range
+=item Unknown open() mode '%s'
-(F) One (or both) of the numeric arguments to the range operator ".."
-are outside the range which can be represented by integers internally.
-One possible workaround is to force Perl to use magical string
-increment by prepending "0" to your numbers.
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->.
-=item Recursive inheritance detected while looking for method '%s' in package '%s'
+=item Unknown process %x sent message to prime_env_iter: %s
-(F) More than 100 levels of inheritance were encountered while invoking a
-method. Probably indicates an unintended loop in your inheritance hierarchy.
+(P) An error peculiar to VMS. Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected. Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
-=item Reference found where even-sized list expected
+=item Unrecognized escape \\%c passed through
-(W) You gave a single reference where Perl was expecting a list with
-an even number of elements (for assignment to a hash). This
-usually means that you used the anon hash constructor when you meant
-to use parens. In any case, a hash requires key/value B<pairs>.
+(W misc) You used a backslash-character combination which is not recognized
+by Perl. The character was understood literally.
- %hash = { one => 1, two => 2, }; # WRONG
- %hash = [ qw/ an anon array / ]; # WRONG
- %hash = ( one => 1, two => 2, ); # right
- %hash = qw( one 1 two 2 ); # also fine
+=item Unterminated attribute parameter in attribute list
-=item Undefined value assigned to typeglob
+(F) The lexer saw an opening (left) parenthesis character while parsing an
+attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance. See L<attributes>.
-(W) An undefined value was assigned to a typeglob, a la C<*foo = undef>.
-This does nothing. It's possible that you really mean C<undef *foo>.
+=item Unterminated attribute list
-=item Use of reserved word "%s" is deprecated
+(F) The lexer found something other than a simple identifier at the start
+of an attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous attribute
+too soon. See L<attributes>.
-(D) The indicated bareword is a reserved word. Future versions of perl
-may use it as a keyword, so you're better off either explicitly quoting
-the word in a manner appropriate for its context of use, or using a
-different name altogether. The warning can be suppressed for subroutine
-names by either adding a C<&> prefix, or using a package qualifier,
-e.g. C<&our()>, or C<Foo::our()>.
+=item Unterminated attribute parameter in subroutine attribute list
-=item perl: warning: Setting locale failed.
+(F) The lexer saw an opening (left) parenthesis character while parsing a
+subroutine attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance.
-(S) The whole warning message will look something like:
+=item Unterminated subroutine attribute list
- perl: warning: Setting locale failed.
- perl: warning: Please check that your locale settings:
- LC_ALL = "En_US",
- LANG = (unset)
- are supported and installed on your system.
- perl: warning: Falling back to the standard locale ("C").
+(F) The lexer found something other than a simple identifier at the start
+of a subroutine attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous attribute
+too soon.
-Exactly what were the failed locale settings varies. In the above the
-settings were that the LC_ALL was "En_US" and the LANG had no value.
-This error means that Perl detected that you and/or your system
-administrator have set up the so-called variable system but Perl could
-not use those settings. This was not dead serious, fortunately: there
-is a "default locale" called "C" that Perl can and will use, the
-script will be run. Before you really fix the problem, however, you
-will get the same error message each time you run Perl. How to really
-fix the problem can be found in L<perllocale/"LOCALE PROBLEMS">.
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS. Perl tried to read the value of an %ENV
+element from a CLI symbol table, and found a resultant string longer
+than 1024 characters. The return value has been truncated to 1024
+characters.
+
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
=back
+=head1 New tests
-=head1 Obsolete Diagnostics
+=over 4
+
+=item lib/attrs
+
+Compatibility tests for C<sub : attrs> vs the older C<use attrs>.
+
+=item lib/env
+
+Tests for new environment scalar capability (e.g., C<use Env qw($BAR);>).
+
+=item lib/env-array
+
+Tests for new environment array capability (e.g., C<use Env qw(@PATH);>).
+
+=item lib/io_const
+
+IO constants (SEEK_*, _IO*).
+
+=item lib/io_dir
+
+Directory-related IO methods (new, read, close, rewind, tied delete).
+
+=item lib/io_multihomed
+
+INET sockets with multi-homed hosts.
+
+=item lib/io_poll
+
+IO poll().
+
+=item lib/io_unix
+
+UNIX sockets.
+
+=item op/attrs
+
+Regression tests for C<my ($x,@y,%z) : attrs> and <sub : attrs>.
+
+=item op/filetest
+
+File test operators.
+
+=item op/lex_assign
+
+Verify operations that access pad objects (lexicals and temporaries).
+
+=item op/exists_sub
+
+Verify C<exists &sub> operations.
+
+=back
+
+=head1 Incompatible Changes
+
+=head2 Perl Source Incompatibilities
+
+Beware that any new warnings that have been added or old ones
+that have been enhanced are B<not> considered incompatible changes.
+
+Since all new warnings must be explicitly requested via the C<-w>
+switch or the C<warnings> pragma, it is ultimately the programmer's
+responsibility to ensure that warnings are enabled judiciously.
+
+=over 4
+
+=item CHECK is a new keyword
+
+All subroutine definitions named CHECK are now special. See
+C</"Support for CHECK blocks"> for more information.
+
+=item Treatment of list slices of undef has changed
+
+There is a potential incompatibility in the behavior of list slices
+that are comprised entirely of undefined values.
+See L</"Behavior of list slices is more consistent">.
+
+=head2 Format of $English::PERL_VERSION is different
+
+The English module now sets $PERL_VERSION to $^V (a string value) rather
+than C<$]> (a numeric value). This is a potential incompatibility.
+Send us a report via perlbug if you are affected by this.
+
+See L</"Improved Perl version numbering system"> for the reasons for
+this change.
+
+=item Literals of the form C<1.2.3> parse differently
+
+Previously, numeric literals with more than one dot in them were
+interpreted as a floating point number concatenated with one or more
+numbers. Such "numbers" are now parsed as strings composed of the
+specified ordinals.
+
+For example, C<print 97.98.99> used to output C<97.9899> in earlier
+versions, but now prints C<abc>.
+
+See L</"Support for strings represented as a vector of ordinals">.
+
+=item Possibly changed pseudo-random number generator
+
+Perl programs that depend on reproducing a specific set of pseudo-random
+numbers may now produce different output due to improvements made to the
+rand() builtin. You can use C<sh Configure -Drandfunc=rand> to obtain
+the old behavior.
+
+See L</"Better pseudo-random number generator">.
+
+=item Hashing function for hash keys has changed
+
+Even though Perl hashes are not order preserving, the apparently
+random order encountered when iterating on the contents of a hash
+is actually determined by the hashing algorithm used. Improvements
+in the algorithm may yield a random order that is B<different> from
+that of previous versions, especially when iterating on hashes.
+
+See L</"Better worst-case behavior of hashes"> for additional
+information.
+
+=item C<undef> fails on read only values
+
+Using the C<undef> operator on a readonly value (such as $1) has
+the same effect as assigning C<undef> to the readonly value--it
+throws an exception.
+
+=item Close-on-exec bit may be set on pipe and socket handles
+
+Pipe and socket handles are also now subject to the close-on-exec
+behavior determined by the special variable $^F.
+
+See L</"More consistent close-on-exec behavior">.
+
+=item Writing C<"$$1"> to mean C<"${$}1"> is unsupported
+
+Perl 5.004 deprecated the interpretation of C<$$1> and
+similar within interpolated strings to mean C<$$ . "1">,
+but still allowed it.
+
+In Perl 5.6.0 and later, C<"$$1"> always means C<"${$1}">.
+
+=item delete(), values() and C<\(%h)> operate on aliases to values, not copies
+
+delete(), each(), values() and hashes in a list context return the actual
+values in the hash, instead of copies (as they used to in earlier
+versions). Typical idioms for using these constructs copy the
+returned values, but this can make a significant difference when
+creating references to the returned values. Keys in the hash are still
+returned as copies when iterating on a hash.
+
+See also L</"delete(), each(), values() and hash iteration are faster">.
+
+=item vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS
+
+vec() generates a run-time error if the BITS argument is not
+a valid power-of-two integer.
+
+=item Text of some diagnostic output has changed
+
+Most references to internal Perl operations in diagnostics
+have been changed to be more descriptive. This may be an
+issue for programs that may incorrectly rely on the exact
+text of diagnostics for proper functioning.
+
+=item C<%@> has been removed
+
+The undocumented special variable C<%@> that used to accumulate
+"background" errors (such as those that happen in DESTROY())
+has been removed, because it could potentially result in memory
+leaks.
+
+=item Parenthesized not() behaves like a list operator
+
+The C<not> operator now falls under the "if it looks like a function,
+it behaves like a function" rule.
+
+As a result, the parenthesized form can be used with C<grep> and C<map>.
+The following construct used to be a syntax error before, but it works
+as expected now:
+
+ grep not($_), @things;
+
+On the other hand, using C<not> with a literal list slice may not
+work. The following previously allowed construct:
+
+ print not (1,2,3)[0];
+
+needs to be written with additional parentheses now:
+
+ print not((1,2,3)[0]);
+
+The behavior remains unaffected when C<not> is not followed by parentheses.
+
+=item Semantics of bareword prototype C<(*)> have changed
+
+The semantics of the bareword prototype C<*> have changed. Perl 5.005
+always coerced simple scalar arguments to a typeglob, which wasn't useful
+in situations where the subroutine must distinguish between a simple
+scalar and a typeglob. The new behavior is to not coerce bareword
+arguments to a typeglob. The value will always be visible as either
+a simple scalar or as a reference to a typeglob.
+
+See L</"More functional bareword prototype (*)">.
+
+=head2 Semantics of bit operators may have changed on 64-bit platforms
+
+If your platform is either natively 64-bit or if Perl has been
+configured to used 64-bit integers, i.e., $Config{ivsize} is 8,
+there may be a potential incompatibility in the behavior of bitwise
+numeric operators (& | ^ ~ << >>). These operators used to strictly
+operate on the lower 32 bits of integers in previous versions, but now
+operate over the entire native integral width. In particular, note
+that unary C<~> will produce different results on platforms that have
+different $Config{ivsize}. For portability, be sure to mask off
+the excess bits in the result of unary C<~>, e.g., C<~$x & 0xffffffff>.
+
+See L</"Bit operators support full native integer width">.
+
+=head2 More builtins taint their results
+
+As described in L</"Improved security features">, there may be more
+sources of taint in a Perl program.
+
+To avoid these new tainting behaviors, you can build Perl with the
+Configure option C<-Accflags=-DINCOMPLETE_TAINTS>. Beware that the
+ensuing perl binary may be insecure.
+
+=back
+
+=head2 C Source Incompatibilities
+
+=over 4
+
+=item C<PERL_POLLUTE>
+
+Release 5.005 grandfathered old global symbol names by providing preprocessor
+macros for extension source compatibility. As of release 5.6.0, these
+preprocessor definitions are not available by default. You need to explicitly
+compile perl with C<-DPERL_POLLUTE> to get these definitions. For
+extensions still using the old symbols, this option can be
+specified via MakeMaker:
+
+ perl Makefile.PL POLLUTE=1
+
+=item C<PERL_IMPLICIT_CONTEXT>
+
+This new build option provides a set of macros for all API functions
+such that an implicit interpreter/thread context argument is passed to
+every API function. As a result of this, something like C<sv_setsv(foo,bar)>
+amounts to a macro invocation that actually translates to something like
+C<Perl_sv_setsv(my_perl,foo,bar)>. While this is generally expected
+to not have any significant source compatibility issues, the difference
+between a macro and a real function call will need to be considered.
+
+This means that there B<is> a source compatibility issue as a result of
+this if your extensions attempt to use pointers to any of the Perl API
+functions.
+
+Note that the above issue is not relevant to the default build of
+Perl, whose interfaces continue to match those of prior versions
+(but subject to the other options described here).
+
+See L<perlguts/"The Perl API"> for detailed information on the
+ramifications of building Perl with this option.
+
+ NOTE: PERL_IMPLICIT_CONTEXT is automatically enabled whenever Perl is built
+ with one of -Dusethreads, -Dusemultiplicity, or both. It is not
+ intended to be enabled by users at this time.
+
+=item C<PERL_POLLUTE_MALLOC>
+
+Enabling Perl's malloc in release 5.005 and earlier caused the namespace of
+the system's malloc family of functions to be usurped by the Perl versions,
+since by default they used the same names. Besides causing problems on
+platforms that do not allow these functions to be cleanly replaced, this
+also meant that the system versions could not be called in programs that
+used Perl's malloc. Previous versions of Perl have allowed this behaviour
+to be suppressed with the HIDEMYMALLOC and EMBEDMYMALLOC preprocessor
+definitions.
+
+As of release 5.6.0, Perl's malloc family of functions have default names
+distinct from the system versions. You need to explicitly compile perl with
+C<-DPERL_POLLUTE_MALLOC> to get the older behaviour. HIDEMYMALLOC
+and EMBEDMYMALLOC have no effect, since the behaviour they enabled is now
+the default.
+
+Note that these functions do B<not> constitute Perl's memory allocation API.
+See L<perlguts/"Memory Allocation"> for further information about that.
+
+=back
+
+=head2 Compatible C Source API Changes
=over
-=item Can't mktemp()
+=item C<PATCHLEVEL> is now C<PERL_VERSION>
+
+The cpp macros C<PERL_REVISION>, C<PERL_VERSION>, and C<PERL_SUBVERSION>
+are now available by default from perl.h, and reflect the base revision,
+patchlevel, and subversion respectively. C<PERL_REVISION> had no
+prior equivalent, while C<PERL_VERSION> and C<PERL_SUBVERSION> were
+previously available as C<PATCHLEVEL> and C<SUBVERSION>.
+
+The new names cause less pollution of the B<cpp> namespace and reflect what
+the numbers have come to stand for in common practice. For compatibility,
+the old names are still supported when F<patchlevel.h> is explicitly
+included (as required before), so there is no source incompatibility
+from the change.
+
+=back
+
+=head2 Binary Incompatibilities
+
+In general, the default build of this release is expected to be binary
+compatible for extensions built with the 5.005 release or its maintenance
+versions. However, specific platforms may have broken binary compatibility
+due to changes in the defaults used in hints files. Therefore, please be
+sure to always check the platform-specific README files for any notes to
+the contrary.
+
+The usethreads or usemultiplicity builds are B<not> binary compatible
+with the corresponding builds in 5.005.
+
+On platforms that require an explicit list of exports (AIX, OS/2 and Windows,
+among others), purely internal symbols such as parser functions and the
+run time opcodes are not exported by default. Perl 5.005 used to export
+all functions irrespective of whether they were considered part of the
+public API or not.
+
+For the full list of public API functions, see L<perlapi>.
+
+=head1 Known Problems
+
+=head2 Thread test failures
+
+The subtests 19 and 20 of lib/thr5005.t test are known to fail due to
+fundamental problems in the 5.005 threading implementation. These are
+not new failures--Perl 5.005_0x has the same bugs, but didn't have these
+tests.
+
+=head2 EBCDIC platforms not supported
+
+In earlier releases of Perl, EBCDIC environments like OS390 (also
+known as Open Edition MVS) and VM-ESA were supported. Due to changes
+required by the UTF-8 (Unicode) support, the EBCDIC platforms are not
+supported in Perl 5.6.0.
+
+=head2 In 64-bit HP-UX the lib/io_multihomed test may hang
+
+The lib/io_multihomed test may hang in HP-UX if Perl has been
+configured to be 64-bit. Because other 64-bit platforms do not
+hang in this test, HP-UX is suspect. All other tests pass
+in 64-bit HP-UX. The test attempts to create and connect to
+"multihomed" sockets (sockets which have multiple IP addresses).
+
+=head2 NEXTSTEP 3.3 POSIX test failure
+
+In NEXTSTEP 3.3p2 the implementation of the strftime(3) in the
+operating system libraries is buggy: the %j format numbers the days of
+a month starting from zero, which, while being logical to programmers,
+will cause the subtests 19 to 27 of the lib/posix test may fail.
+
+=head2 Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with gcc
-(F) The mktemp() routine failed for some reason while trying to process
-a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+If compiled with gcc 2.95 the lib/sdbm test will fail (dump core).
+The cure is to use the vendor cc, it comes with the operating system
+and produces good code.
-Removed because B<-e> doesn't use temporary files any more.
+=head2 UNICOS/mk CC failures during Configure run
-=item Can't write to temp file for B<-e>: %s
+In UNICOS/mk the following errors may appear during the Configure run:
-(F) The write routine failed for some reason while trying to process
-a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+ Guessing which symbols your C compiler and preprocessor define...
+ CC-20 cc: ERROR File = try.c, Line = 3
+ ...
+ bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
+ ...
+ 4 errors detected in the compilation of "try.c".
-Removed because B<-e> doesn't use temporary files any more.
+The culprit is the broken awk of UNICOS/mk. The effect is fortunately
+rather mild: Perl itself is not adversely affected by the error, only
+the h2ph utility coming with Perl, and that is rather rarely needed
+these days.
-=item Cannot open temporary file
+=head2 Arrow operator and arrays
-(F) The create routine failed for some reason while trying to process
-a B<-e> switch. Maybe your /tmp partition is full, or clobbered.
+When the left argument to the arrow operator C<< -> >> is an array, or
+the C<scalar> operator operating on an array, the result of the
+operation must be considered erroneous. For example:
-Removed because B<-e> doesn't use temporary files any more.
+ @x->[2]
+ scalar(@x)->[2]
+
+These expressions will get run-time errors in some future release of
+Perl.
+
+=head2 Windows 2000
+
+Windows 2000 is known to fail test 22 in lib/open3.t (cause unknown at
+this time). That test passes under Windows NT.
+
+=head2 Experimental features
+
+As discussed above, many features are still experimental. Interfaces and
+implementation of these features are subject to change, and in extreme cases,
+even subject to removal in some future release of Perl. These features
+include the following:
+
+=over 4
+
+=item Threads
+
+=item Unicode
+
+=item 64-bit support
+
+=item Lvalue subroutines
+
+=item Weak references
+
+=item The pseudo-hash data type
+
+=item The Compiler suite
+
+=item Internal implementation of file globbing
+
+=item The DB module
+
+=item The regular expression constructs C<(?{ code })> and C<(??{ code })>
+
+=back
+
+=head1 Obsolete Diagnostics
+
+=over 4
+
+=item Character class syntax [: :] is reserved for future extensions
+
+(W) Within regular expression character classes ([]) the syntax beginning
+with "[:" and ending with ":]" is reserved for future extensions.
+If you need to represent those character sequences inside a regular
+expression character class, just quote the square brackets with the
+backslash: "\[:" and ":\]".
+
+=item Ill-formed logical name |%s| in prime_env_iter
+
+(W) A warning peculiar to VMS. A logical name was encountered when preparing
+to iterate over %ENV which violates the syntactic rules governing logical
+names. Because it cannot be translated normally, it is skipped, and will not
+appear in %ENV. This may be a benign occurrence, as some software packages
+might directly modify logical name tables and introduce nonstandard names,
+or it may indicate that a logical name table has been corrupted.
+
+=item Probable precedence problem on %s
+
+(W) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+ open FOO || die;
=item regexp too big
@@ -987,26 +2920,31 @@ the regular expression compiles to longer than 32767, it'll blow up.
Usually when you want a regular expression this big, there is a better
way to do it with multiple statements. See L<perlre>.
-=back
+=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
-=head1 Configuration Changes
+(D) Perl versions before 5.004 misinterpreted any type marker followed
+by "$" and a digit. For example, "$$0" was incorrectly taken to mean
+"${$}0" instead of "${$0}". This bug is (mostly) fixed in Perl 5.004.
-You can use "Configure -Uinstallusrbinperl" which causes installperl
-to skip installing perl also as /usr/bin/perl. This is useful if you
-prefer not to modify /usr/bin for some reason or another but harmful
-because many scripts assume to find Perl in /usr/bin/perl.
+However, the developers of Perl 5.004 could not fix this bug completely,
+because at least two widely-used modules depend on the old meaning of
+"$$0" in a string. So Perl 5.004 still interprets "$$<digit>" in the
+old (broken) way inside strings; but it generates this message as a
+warning. And in Perl 5.005, this special treatment will cease.
+
+=back
-=head1 BUGS
+=head1 Reporting Bugs
-If you find what you think is a bug, you might check the headers of
-recently posted articles in the comp.lang.perl.misc newsgroup.
+If you find what you think is a bug, you might check the
+articles recently posted to the comp.lang.perl.misc newsgroup.
There may also be information at http://www.perl.com/perl/, the Perl
Home Page.
If you believe you have an unreported bug, please run the B<perlbug>
-program included with your release. Make sure you trim your bug down
+program included with your release. Be sure to trim your bug down
to a tiny but sufficient test case. Your bug report, along with the
-output of C<perl -V>, will be sent off to <F<perlbug@perl.com>> to be
+output of C<perl -V>, will be sent off to perlbug@perl.com to be
analysed by the Perl porting team.
=head1 SEE ALSO
@@ -1021,8 +2959,8 @@ The F<Artistic> and F<Copying> files for copyright information.
=head1 HISTORY
-Written by Gurusamy Sarathy <F<gsar@umich.edu>>, with many contributions
-from The Perl Porters.
+Written by Gurusamy Sarathy <F<gsar@activestate.com>>, with many
+contributions from The Perl Porters.
Send omissions or corrections to <F<perlbug@perl.com>>.
diff --git a/contrib/perl5/pod/perldiag.pod b/contrib/perl5/pod/perldiag.pod
index fe31991..9ed7552 100644
--- a/contrib/perl5/pod/perldiag.pod
+++ b/contrib/perl5/pod/perldiag.pod
@@ -9,79 +9,167 @@ desperation):
(W) A warning (optional).
(D) A deprecation (optional).
- (S) A severe warning (mandatory).
+ (S) A severe warning (default).
(F) A fatal error (trappable).
(P) An internal error you should never see (trappable).
(X) A very fatal error (nontrappable).
(A) An alien error message (not generated by Perl).
-Optional warnings are enabled by using the B<-w> switch. Warnings may
-be captured by setting C<$SIG{__WARN__}> to a reference to a routine that
-will be called on each warning instead of printing it. See L<perlvar>.
+The majority of messages from the first three classifications above (W,
+D & S) can be controlled using the C<warnings> pragma.
+
+If a message can be controlled by the C<warnings> pragma, its warning
+category is included with the classification letter in the description
+below.
+
+Optional warnings are enabled by using the C<warnings> pragma or the B<-w>
+and B<-W> switches. Warnings may be captured by setting C<$SIG{__WARN__}>
+to a reference to a routine that will be called on each warning instead
+of printing it. See L<perlvar>.
+
+Default warnings are always enabled unless they are explicitly disabled
+with the C<warnings> pragma or the B<-X> switch.
+
Trappable errors may be trapped using the eval operator. See
-L<perlfunc/eval>.
+L<perlfunc/eval>. In almost all cases, warnings may be selectively
+disabled or promoted to fatal errors using the C<warnings> pragma.
+See L<warnings>.
Some of these messages are generic. Spots that vary are denoted with a %s,
just as in a printf format. Note that some messages start with a %s!
-The symbols C<"%(-?@> sort before the letters, while C<[> and C<\> sort after.
+Since the messages are listed in alphabetical order, the symbols
+C<"%(-?@> sort before the letters, while C<[> and C<\> sort after.
=over 4
-=item "my" variable %s can't be in a package
+=item "%s" variable %s masks earlier declaration in same %s
-(F) Lexically scoped variables aren't in a package, so it doesn't make sense
-to try to declare one with a package qualifier on the front. Use local()
-if you want to localize a package variable.
-
-=item "my" variable %s masks earlier declaration in same %s
-
-(W) A lexical variable has been redeclared in the current scope or statement,
+(W misc) A "my" or "our" variable has been redeclared in the current scope or statement,
effectively eliminating all access to the previous instance. This is almost
always a typographical error. Note that the earlier variable will still exist
until the end of the scope or until all closure referents to it are
destroyed.
+=item "my sub" not yet implemented
+
+(F) Lexically scoped subroutines are not yet implemented. Don't try that
+yet.
+
+=item "my" variable %s can't be in a package
+
+(F) Lexically scoped variables aren't in a package, so it doesn't make sense
+to try to declare one with a package qualifier on the front. Use local()
+if you want to localize a package variable.
+
=item "no" not allowed in expression
(F) The "no" keyword is recognized and executed at compile time, and returns
no useful value. See L<perlmod>.
+=item "our" variable %s redeclared
+
+(W misc) You seem to have already declared the same global once before in the
+current lexical scope.
+
=item "use" not allowed in expression
(F) The "use" keyword is recognized and executed at compile time, and returns
no useful value. See L<perlmod>.
+=item '!' allowed only after types %s
+
+(F) The '!' is allowed in pack() and unpack() only after certain types.
+See L<perlfunc/pack>.
+
+=item / cannot take a count
+
+(F) You had an unpack template indicating a counted-length string,
+but you have also specified an explicit size for the string.
+See L<perlfunc/pack>.
+
+=item / must be followed by a, A or Z
+
+(F) You had an unpack template indicating a counted-length string,
+which must be followed by one of the letters a, A or Z
+to indicate what sort of string is to be unpacked.
+See L<perlfunc/pack>.
+
+=item / must be followed by a*, A* or Z*
+
+(F) You had a pack template indicating a counted-length string,
+Currently the only things that can have their length counted are a*, A* or Z*.
+See L<perlfunc/pack>.
+
+=item / must follow a numeric type
+
+(F) You had an unpack template that contained a '#',
+but this did not follow some numeric unpack specification.
+See L<perlfunc/pack>.
+
=item % may only be used in unpack
(F) You can't pack a string by supplying a checksum, because the
checksumming process loses information, and you can't go the other
way. See L<perlfunc/unpack>.
+=item /%s/: Unrecognized escape \\%c passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl. This combination appears in an interpolated variable or a
+C<'>-delimited regular expression. The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W regexp) You used a backslash-character combination which is not recognized
+by Perl inside character classes. The character was understood literally.
+
+=item /%s/ should probably be written as "%s"
+
+(W syntax) You have used a pattern where Perl expected to find a string,
+as in the first argument to C<join>. Perl will treat the true
+or false result of matching the pattern against $_ as the string,
+which is probably not what you had in mind.
+
=item %s (...) interpreted as function
-(W) You've run afoul of the rule that says that any list operator followed
+(W syntax) You've run afoul of the rule that says that any list operator followed
by parentheses turns into a function, with all the list operators arguments
found inside the parentheses. See L<perlop/Terms and List Operators (Leftward)>.
-=item %s argument is not a HASH element
+=item %s() called too early to check prototype
+
+(W prototype) You've called a function that has a prototype before the parser saw a
+definition or declaration for it, and Perl could not check that the call
+conforms to the prototype. You need to either add an early prototype
+declaration for the subroutine in question, or move the subroutine
+definition ahead of the call to get proper prototype checking. Alternatively,
+if you are certain that you're calling the function correctly, you may put
+an ampersand before the name to avoid the warning. See L<perlsub>.
+
+=item %s argument is not a HASH or ARRAY element
-(F) The argument to exists() must be a hash element, such as
+(F) The argument to exists() must be a hash or array element, such as:
$foo{$bar}
- $ref->[12]->{"susie"}
+ $ref->{"susie"}[12]
-=item %s argument is not a HASH element or slice
+=item %s argument is not a HASH or ARRAY element or slice
-(F) The argument to delete() must be either a hash element, such as
+(F) The argument to delete() must be either a hash or array element, such as:
$foo{$bar}
- $ref->[12]->{"susie"}
+ $ref->{"susie"}[12]
-or a hash slice, such as
+or a hash or array slice, such as:
- @foo{$bar, $baz, $xyzzy}
+ @foo[$bar, $baz, $xyzzy]
@{$ref->[12]}{"susie", "queue"}
+=item %s argument is not a subroutine name
+
+(F) The argument to exists() for C<exists &sub> must be a subroutine
+name, and not a subroutine call. C<exists &sub()> will generate this error.
+
=item %s did not return a true value
(F) A required (or used) file must return a true value to indicate that
@@ -107,14 +195,21 @@ Further error messages would likely be uninformative.
=item %s matches null string many times
-(W) The pattern you've specified would be an infinite loop if the
+(W regexp) The pattern you've specified would be an infinite loop if the
regular expression engine didn't specifically check for that. See L<perlre>.
=item %s never introduced
-(S) The symbol in question was declared but somehow went out of scope
+(S internal) The symbol in question was declared but somehow went out of scope
before it could possibly have been used.
+=item %s package attribute may clash with future reserved word: %s
+
+(W reserved) A lowercase attribute name was used that had a package-specific handler.
+That name might have a meaning to Perl itself some day, even though it
+doesn't yet. Perhaps you should use a mixed-case attribute name, instead.
+See L<attributes>.
+
=item %s syntax OK
(F) The final summary message when a C<perl -c> succeeds.
@@ -143,9 +238,9 @@ Perl yourself.
instead of Perl. Check the #! line, or manually feed your script
into Perl yourself.
-=item (in cleanup) %s
+=item (in cleanup) %s
-(W) This prefix usually indicates that a DESTROY() method raised
+(W misc) This prefix usually indicates that a DESTROY() method raised
the indicated exception. Since destructors are usually called by
the system at arbitrary points during execution, and often a vast
number of times, the warning is issued only once for any number
@@ -155,7 +250,7 @@ repeated.
Failure of user callbacks dispatched using the C<G_KEEPERR> flag
could also result in this warning. See L<perlcall/G_KEEPERR>.
-=item (Missing semicolon on previous line?)
+=item (Missing semicolon on previous line?)
(S) This is an educated guess made in conjunction with the message "%s
found where operator expected". Don't automatically put a semicolon on
@@ -191,9 +286,14 @@ if you meant it literally. See L<perlre>.
(F) You had a pack template that specified an absolute position outside
the string being unpacked. See L<perlfunc/pack>.
-=item accept() on closed fd
+=item <> should be quotes
-(W) You tried to do an accept on a closed socket. Did you forget to check
+(F) You wrote C<< require <file> >> when you should have written
+C<require 'file'>.
+
+=item accept() on closed socket %s
+
+(W closed) You tried to do an accept on a closed socket. Did you forget to check
the return value of your socket() call? See L<perlfunc/accept>.
=item Allocation too large: %lx
@@ -202,7 +302,7 @@ the return value of your socket() call? See L<perlfunc/accept>.
=item Applying %s to %s will act on scalar(%s)
-(W) The pattern match (//), substitution (s///), and transliteration (tr///)
+(W misc) The pattern match (//), substitution (s///), and transliteration (tr///)
operators work on scalar values. If you apply one of them to an array
or a hash, it will convert the array or hash to a scalar value -- the
length of an array, or the population info of a hash -- and then work on
@@ -215,13 +315,13 @@ L<perlfunc/grep> and L<perlfunc/map> for alternatives.
=item Ambiguous use of %s resolved as %s
-(W)(S) You said something that may not be interpreted the way
+(W ambiguous)(S) You said something that may not be interpreted the way
you thought. Normally it's pretty easy to disambiguate it by supplying
a missing quote, operator, parenthesis pair or declaration.
=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
-(W) A subroutine you have declared has the same name as a Perl keyword,
+(W ambiguous) A subroutine you have declared has the same name as a Perl keyword,
and you have used the name without qualification for calling one or the
other. Perl decided to call the builtin because the subroutine is
not imported.
@@ -233,7 +333,8 @@ imported with the C<use subs> pragma).
To silently interpret it as the Perl operator, use the C<CORE::> prefix
on the operator (e.g. C<CORE::log($x)>) or by declaring the subroutine
-to be an object method (see L<attrs>).
+to be an object method (see L<perlsub/"Subroutine Attributes">
+or L<attributes>).
=item Args must match #! line
@@ -244,13 +345,13 @@ for example, turn C<-w -U> into C<-wU>.
=item Argument "%s" isn't numeric%s
-(W) The indicated string was fed as an argument to an operator that
+(W numeric) The indicated string was fed as an argument to an operator that
expected a numeric value instead. If you're fortunate the message
will identify which operator was so unfortunate.
=item Array @%s missing the @ in argument %d of %s()
-(D) Really old Perl let you omit the @ on array names in some spots. This
+(D deprecated) Really old Perl let you omit the @ on array names in some spots. This
is now heavily deprecated.
=item assertion botched: %s
@@ -269,20 +370,20 @@ know which context to supply to the right side.
=item Attempt to free non-arena SV: 0x%lx
-(P) All SV objects are supposed to be allocated from arenas that will
+(P internal) All SV objects are supposed to be allocated from arenas that will
be garbage collected on exit. An SV was discovered to be outside any
of those arenas.
=item Attempt to free nonexistent shared string
-(P) Perl maintains a reference counted internal table of strings to
+(P internal) Perl maintains a reference counted internal table of strings to
optimize the storage and access of hash keys and other strings. This
indicates someone tried to decrement the reference count of a string
that can no longer be found in the table.
=item Attempt to free temp prematurely
-(W) Mortalized values are supposed to be freed by the free_tmps()
+(W debugging) Mortalized values are supposed to be freed by the free_tmps()
routine. This indicates that something else is freeing the SV before
the free_tmps() routine gets a chance, which means that the free_tmps()
routine will be freeing an unreferenced scalar when it does try to free
@@ -290,20 +391,26 @@ it.
=item Attempt to free unreferenced glob pointers
-(P) The reference counts got screwed up on symbol aliases.
+(P internal) The reference counts got screwed up on symbol aliases.
=item Attempt to free unreferenced scalar
-(W) Perl went to decrement the reference count of a scalar to see if it
+(W internal) Perl went to decrement the reference count of a scalar to see if it
would go to 0, and discovered that it had already gone to 0 earlier,
and should have been freed, and in fact, probably was freed. This
could indicate that SvREFCNT_dec() was called too many times, or that
SvREFCNT_inc() was called too few times, or that the SV was mortalized
when it shouldn't have been, or that memory has been corrupted.
+=item Attempt to join self
+
+(F) You tried to join a thread from within itself, which is an
+impossible task. You may be joining the wrong thread, or you may
+need to move the join() to some other thread.
+
=item Attempt to pack pointer to temporary value
-(W) You tried to pass a temporary value (like the result of a
+(W pack) You tried to pass a temporary value (like the result of a
function, or a computed expression) to the "p" pack() template. This
means the result contains a pointer to a location that could become
invalid anytime, even before the end of the current statement. Use
@@ -312,7 +419,7 @@ avoid this warning.
=item Attempt to use reference as lvalue in substr
-(W) You supplied a reference as the first argument to substr() used
+(W substr) You supplied a reference as the first argument to substr() used
as an lvalue, which is pretty strange. Perhaps you forgot to
dereference it first. See L<perlfunc/substr>.
@@ -323,6 +430,12 @@ shmctl(). In C parlance, the correct sizes are, respectively,
S<sizeof(struct msqid_ds *)>, S<sizeof(struct semid_ds *)>, and
S<sizeof(struct shmid_ds *)>.
+=item Bad evalled substitution pattern
+
+(F) You've used the /e switch to evaluate the replacement for a
+substitution, but perl found a syntax error in the code to evaluate,
+most likely an unexpected right brace '}'.
+
=item Bad filehandle: %s
(F) A symbol was passed to something wanting a filehandle, but the symbol
@@ -331,7 +444,7 @@ did it in another package.
=item Bad free() ignored
-(S) An internal routine called free() on something that had never been
+(S malloc) An internal routine called free() on something that had never been
malloc()ed in the first place. Mandatory, but can be disabled by
setting environment variable C<PERL_BADFREE> to 1.
@@ -364,6 +477,12 @@ is not the same as
$var = 'myvar';
$sym = "mypack::$var";
+=item Bad realloc() ignored
+
+(S malloc) An internal routine called realloc() on something that had never been
+malloc()ed in the first place. Mandatory, but can be disabled by
+setting environment variable C<PERL_BADFREE> to 1.
+
=item Bad symbol for array
(P) An internal request asked to add an array entry to something that
@@ -393,10 +512,26 @@ Perhaps you need to predeclare a subroutine?
=item Bareword "%s" refers to nonexistent package
-(W) You used a qualified bareword of the form C<Foo::>, but
+(W bareword) You used a qualified bareword of the form C<Foo::>, but
the compiler saw no other uses of that namespace before that point.
Perhaps you need to predeclare a package?
+=item Bareword found in conditional
+
+(W bareword) The compiler found a bareword where it expected a conditional,
+which often indicates that an || or && was parsed as part of the
+last argument of the previous construct, for example:
+
+ open FOO || die;
+
+It may also indicate a misspelled constant that has been interpreted
+as a bareword:
+
+ use constant TYPO => 1;
+ if (TYOP) { print "foo" }
+
+The C<strict> pragma is useful in avoiding such errors.
+
=item BEGIN failed--compilation aborted
(F) An untrapped exception was raised while executing a BEGIN subroutine.
@@ -410,21 +545,37 @@ already occurred. Since the intended environment for the C<BEGIN {}>
could not be guaranteed (due to the errors), and since subsequent code
likely depends on its correct operation, Perl just gave up.
-=item bind() on closed fd
+=item Binary number > 0b11111111111111111111111111111111 non-portable
+
+(W portable) The binary number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
-(W) You tried to do a bind on a closed socket. Did you forget to check
+=item bind() on closed socket %s
+
+(W closed) You tried to do a bind on a closed socket. Did you forget to check
the return value of your socket() call? See L<perlfunc/bind>.
+=item Bit vector size > 32 non-portable
+
+(W portable) Using bit vector sizes larger than 32 is non-portable.
+
=item Bizarre copy of %s in %s
(P) Perl detected an attempt to copy an internal value that is not copiable.
+=item Buffer overflow in prime_env_iter: %s
+
+(W internal) A warning peculiar to VMS. While Perl was preparing to iterate over
+%ENV, it encountered a logical name or symbol definition which was too long,
+so it was truncated to the string shown.
+
=item Callback called exit
-(F) A subroutine invoked from an external package via perl_call_sv()
+(F) A subroutine invoked from an external package via call_sv()
exited by calling exit.
-=item Can't "goto" outside a block
+=item Can't "goto" out of a pseudo block
(F) A "goto" statement was executed to jump out of what might look
like a block, except that it isn't a proper block. This usually
@@ -436,30 +587,40 @@ is a no-no. See L<perlfunc/goto>.
(F) A "goto" statement was executed to jump into the middle of a
foreach loop. You can't get there from here. See L<perlfunc/goto>.
-=item Can't "last" outside a block
+=item Can't "last" outside a loop block
(F) A "last" statement was executed to break out of the current block,
except that there's this itty bitty problem called there isn't a
current block. Note that an "if" or "else" block doesn't count as a
-"loopish" block, as doesn't a block given to sort(). You can usually double
-the curlies to get the same effect though, because the inner curlies
-will be considered a block that loops once. See L<perlfunc/last>.
+"loopish" block, as doesn't a block given to sort(), map() or grep().
+You can usually double the curlies to get the same effect though,
+because the inner curlies will be considered a block that loops once.
+See L<perlfunc/last>.
-=item Can't "next" outside a block
+=item Can't "next" outside a loop block
(F) A "next" statement was executed to reiterate the current block, but
there isn't a current block. Note that an "if" or "else" block doesn't
-count as a "loopish" block, as doesn't a block given to sort(). You can
-usually double the curlies to get the same effect though, because the inner
-curlies will be considered a block that loops once. See L<perlfunc/next>.
+count as a "loopish" block, as doesn't a block given to sort(), map()
+or grep(). You can usually double the curlies to get the same effect
+though, because the inner curlies will be considered a block that
+loops once. See L<perlfunc/next>.
-=item Can't "redo" outside a block
+=item Can't read CRTL environ
+
+(S) A warning peculiar to VMS. Perl tried to read an element of %ENV
+from the CRTL's internal environment array and discovered the array was
+missing. You need to figure out where your CRTL misplaced its environ
+or define F<PERL_ENV_TABLES> (see L<perlvms>) so that environ is not searched.
+
+=item Can't "redo" outside a loop block
(F) A "redo" statement was executed to restart the current block, but
there isn't a current block. Note that an "if" or "else" block doesn't
-count as a "loopish" block, as doesn't a block given to sort(). You can
-usually double the curlies to get the same effect though, because the inner
-curlies will be considered a block that loops once. See L<perlfunc/redo>.
+count as a "loopish" block, as doesn't a block given to sort(), map()
+or grep(). You can usually double the curlies to get the same effect
+though, because the inner curlies will be considered a block that
+loops once. See L<perlfunc/redo>.
=item Can't bless non-reference value
@@ -468,7 +629,7 @@ encapsulation of objects. See L<perlobj>.
=item Can't break at that line
-(S) A warning intended to only be printed while running within the debugger, indicating
+(S internal) A warning intended to only be printed while running within the debugger, indicating
the line number specified wasn't the location of a statement that could
be stopped at.
@@ -551,14 +712,20 @@ only with arrays that have a hash reference at index 0.
(P) An error peculiar to VMS. The process is suffering from exhausted quotas
or other plumbing problems.
-=item Can't declare %s in my
+=item Can't declare class for non-scalar %s in "%s"
+
+(S) Currently, only scalar variables can declared with a specific class
+qualifier in a "my" or "our" declaration. The semantics may be extended
+for other types of variables in future.
+
+=item Can't declare %s in "%s"
-(F) Only scalar, array, and hash variables may be declared as lexical variables.
-They must have ordinary identifiers as names.
+(F) Only scalar, array, and hash variables may be declared as "my" or
+"our" variables. They must have ordinary identifiers as names.
=item Can't do inplace edit on %s: %s
-(S) The creation of the new file failed for the indicated reason.
+(S inplace) The creation of the new file failed for the indicated reason.
=item Can't do inplace edit without backup
@@ -566,13 +733,15 @@ They must have ordinary identifiers as names.
from a deleted (but still opened) file. You have to say C<-i.bak>, or some
such.
-=item Can't do inplace edit: %s E<gt> 14 characters
+=item Can't do inplace edit: %s would not be unique
-(S) There isn't enough room in the filename to make a backup name for the file.
+(S inplace) Your filesystem does not support filenames longer than 14
+characters and Perl was unable to create a unique filename during
+inplace editing with the B<-i> switch. The file was ignored.
=item Can't do inplace edit: %s is not a regular file
-(S) You tried to use the B<-i> switch on a special file, such as a file in
+(S inplace) You tried to use the B<-i> switch on a special file, such as a file in
/dev, or a FIFO. The file was ignored.
=item Can't do setegid!
@@ -598,7 +767,7 @@ your sysadmin why he and/or she removed it.
(F) This machine doesn't have either waitpid() or wait4(), so only waitpid()
without flags is emulated.
-=item Can't do {n,m} with n E<gt> m
+=item Can't do {n,m} with n > m
(F) Minima must be less than or equal to maxima. If you really want
your regexp to match something 0 times, just put {0}. See L<perlre>.
@@ -610,7 +779,7 @@ For example, it'd be kind of silly to put a B<-x> on the #! line.
=item Can't exec "%s": %s
-(W) An system(), exec(), or piped open call could not execute the named
+(W exec) An system(), exec(), or piped open call could not execute the named
program for the indicated reason. Typical reasons include: the permissions
were wrong on the file, the file wasn't found in C<$ENV{PATH}>, the
executable in question was compiled for another architecture, or the
@@ -699,6 +868,15 @@ L<perlfunc/goto>.
(F) The "goto subroutine" call can't be used to jump out of an eval "string".
(You can use it to jump out of an eval {BLOCK}, but you probably don't want to.)
+=item Can't ignore signal CHLD, forcing to default
+
+(W signal) Perl has detected that it is being run with the SIGCHLD signal
+(sometimes known as SIGCLD) disabled. Since disabling this signal
+will interfere with proper determination of exit status of child
+processes, Perl has reset the signal to its default value.
+This situation typically indicates that the parent program under
+which Perl may be running (e.g. cron) is being very careless.
+
=item Can't localize through a reference
(F) You said something like C<local $$ref>, which Perl can't currently
@@ -715,10 +893,10 @@ package name.
=item Can't localize pseudo-hash element
-(F) You said something like C<local $ar-E<gt>{'key'}>, where $ar is
+(F) You said something like C<< local $ar->{'key'} >>, where $ar is
a reference to a pseudo-hash. That hasn't been implemented yet, but
you can get a similar effect by localizing the corresponding array
-element directly -- C<local $ar-E<gt>[$ar-E<gt>[0]{'key'}]>.
+element directly -- C<< local $ar->[$ar->[0]{'key'}] >>.
=item Can't locate auto/%s.al in @INC
@@ -727,13 +905,15 @@ but there is no function to autoload. Most probable causes are a misprint
in a function/method name or a failure to C<AutoSplit> the file, say, by
doing C<make install>.
-=item Can't locate %s in @INC
+=item Can't locate %s
-(F) You said to do (or require, or use) a file that couldn't be found
-in any of the libraries mentioned in @INC. Perhaps you need to set the
-PERL5LIB or PERL5OPT environment variable to say where the extra library
-is, or maybe the script needs to add the library name to @INC. Or maybe
-you just misspelled the name of the file. See L<perlfunc/require>.
+(F) You said to C<do> (or C<require>, or C<use>) a file that couldn't be
+found. Perl looks for the file in all the locations mentioned in @INC,
+unless the file name included the full path to the file. Perhaps you need
+to set the PERL5LIB or PERL5OPT environment variable to say where the extra
+library is, or maybe the script needs to add the library name to @INC. Or
+maybe you just misspelled the name of the file. See L<perlfunc/require>
+and L<lib>.
=item Can't locate object method "%s" via package "%s"
@@ -743,7 +923,7 @@ method, nor does any of its base classes. See L<perlobj>.
=item Can't locate package %s for @%s::ISA
-(W) The @ISA array contained the name of another package that doesn't seem
+(W syntax) The @ISA array contained the name of another package that doesn't seem
to exist.
=item Can't make list assignment to \%ENV on this system
@@ -755,6 +935,11 @@ to exist.
(F) You aren't allowed to assign to the item indicated, or otherwise try to
change it, such as with an auto-increment.
+=item Can't modify non-lvalue subroutine call
+
+(F) Subroutines meant to be used in lvalue context should be declared as
+such, see L<perlsub/"Lvalue subroutines">.
+
=item Can't modify nonexistent substring
(P) The internal routine that does assignment to a substr() was handed
@@ -767,7 +952,7 @@ buffer.
=item Can't open %s: %s
-(S) The implicit opening of a file through use of the C<E<lt>E<gt>>
+(S inplace) The implicit opening of a file through use of the C<< <> >>
filehandle, either implicitly under the C<-n> or C<-p> command-line
switches, or explicitly, failed for the indicated reason. Usually this
is because you don't have read permission for a file which you named
@@ -775,26 +960,26 @@ on the command line.
=item Can't open bidirectional pipe
-(W) You tried to say C<open(CMD, "|cmd|")>, which is not supported. You can
+(W pipe) You tried to say C<open(CMD, "|cmd|")>, which is not supported. You can
try any of several modules in the Perl library to do this, such as
-IPC::Open2. Alternately, direct the pipe's output to a file using "E<gt>",
+IPC::Open2. Alternately, direct the pipe's output to a file using ">",
and then read it in under a different file handle.
=item Can't open error file %s as stderr
(F) An error peculiar to VMS. Perl does its own command line redirection, and
-couldn't open the file specified after '2E<gt>' or '2E<gt>E<gt>' on the
+couldn't open the file specified after '2>' or '2>>' on the
command line for writing.
=item Can't open input file %s as stdin
(F) An error peculiar to VMS. Perl does its own command line redirection, and
-couldn't open the file specified after 'E<lt>' on the command line for reading.
+couldn't open the file specified after '<' on the command line for reading.
=item Can't open output file %s as stdout
(F) An error peculiar to VMS. Perl does its own command line redirection, and
-couldn't open the file specified after 'E<gt>' or 'E<gt>E<gt>' on the command
+couldn't open the file specified after '>' or '>>' on the command
line for writing.
=item Can't open output pipe (name: %s)
@@ -813,10 +998,16 @@ pointers into them. You tried to redefine one such sort subroutine when it
was currently active, which is not allowed. If you really want to do
this, you should write C<sort { &func } @x> instead of C<sort func @x>.
+=item Can't remove %s: %s, skipping file
+
+(S inplace) You requested an inplace edit without creating a backup file. Perl
+was unable to remove the original file to replace it with the modified
+file. The file was left unmodified.
+
=item Can't rename %s to %s: %s, skipping file
-(S) The rename done by the B<-i> switch failed for some reason, probably because
-you don't have write permission to the directory.
+(S inplace) The rename done by the B<-i> switch failed for some reason,
+probably because you don't have write permission to the directory.
=item Can't reopen input pipe (name: %s) in binary mode
@@ -833,6 +1024,12 @@ of suidperl.
(F) The return statement was executed in mainline code, that is, where
there was no subroutine call to return out of. See L<perlsub>.
+=item Can't return %s from lvalue subroutine
+
+(F) Perl detected an attempt to return illegal lvalues (such
+as temporary or readonly values) from a subroutine used as an lvalue.
+This is not allowed.
+
=item Can't stat script "%s"
(P) For some reason you can't fstat() the script even though you have
@@ -889,7 +1086,7 @@ provide symbolic names for C<$!> errno values.
=item Can't use "my %s" in sort comparison
(F) The global variables $a and $b are reserved for sort comparisons.
-You mentioned $a or $b in the same line as the E<lt>=E<gt> or cmp operator,
+You mentioned $a or $b in the same line as the <=> or cmp operator,
and the variable had earlier been declared as a lexical variable.
Either qualify the sort variable with the package name, or rename the
lexical variable.
@@ -904,15 +1101,15 @@ lexical variable.
reference of the type needed. You can use the ref() function to
test the type of the reference, if need be.
-=item Can't use \1 to mean $1 in expression
+=item Can't use \%c to mean $%c in expression
-(W) In an ordinary expression, backslash is a unary operator that creates
+(W syntax) In an ordinary expression, backslash is a unary operator that creates
a reference to its argument. The use of backslash to indicate a backreference
to a matched substring is valid only as part of a regular expression pattern.
Trying to do this in ordinary Perl code produces a value that prints
out looking like SCALAR(0xdecaf). Use the $1 form instead.
-=item Can't use bareword ("%s") as %s ref while \"strict refs\" in use
+=item Can't use bareword ("%s") as %s ref while "strict refs" in use
(F) Only hard references are allowed by "strict refs". Symbolic references
are disallowed. See L<perlref>.
@@ -941,59 +1138,69 @@ weren't.
subscript. But to the left of the brackets was an expression that
didn't look like an array reference, or anything else subscriptable.
+=item Can't weaken a nonreference
+
+(F) You attempted to weaken something that was not a reference. Only
+references can be weakened.
+
=item Can't x= to read-only value
(F) You tried to repeat a constant value (often the undefined value) with
an assignment operator, which implies modifying the value itself.
Perhaps you need to copy the value to a temporary, and repeat that.
-=item Cannot find an opnumber for "%s"
+=item Can't find an opnumber for "%s"
(F) A string of a form C<CORE::word> was given to prototype(), but
there is no builtin with the name C<word>.
-=item Cannot resolve method `%s' overloading `%s' in package `%s'
+=item Can't resolve method `%s' overloading `%s' in package `%s'
(F|P) Error resolving overloading specified by a method name (as
opposed to a subroutine reference): no such method callable via the
package. If method name is C<???>, this is an internal error.
+=item Character class [:%s:] unknown
+
+(F) The class in the character class [: :] syntax is unknown.
+See L<perlre>.
+
+=item Character class syntax [%s] belongs inside character classes
+
+(W unsafe) The character class constructs [: :], [= =], and [. .] go
+I<inside> character classes, the [] are part of the construct,
+for example: /[012[:alpha:]345]/. Note that [= =] and [. .]
+are not currently implemented; they are simply placeholders for
+future extensions.
+
=item Character class syntax [. .] is reserved for future extensions
-(W) Within regular expression character classes ([]) the syntax beginning
+(W regexp) Within regular expression character classes ([]) the syntax beginning
with "[." and ending with ".]" is reserved for future extensions.
If you need to represent those character sequences inside a regular
expression character class, just quote the square brackets with the
backslash: "\[." and ".\]".
-=item Character class syntax [: :] is reserved for future extensions
-
-(W) Within regular expression character classes ([]) the syntax beginning
-with "[:" and ending with ":]" is reserved for future extensions.
-If you need to represent those character sequences inside a regular
-expression character class, just quote the square brackets with the
-backslash: "\[:" and ":\]".
-
=item Character class syntax [= =] is reserved for future extensions
-(W) Within regular expression character classes ([]) the syntax
+(W regexp) Within regular expression character classes ([]) the syntax
beginning with "[=" and ending with "=]" is reserved for future extensions.
If you need to represent those character sequences inside a regular
expression character class, just quote the square brackets with the
backslash: "\[=" and "=\]".
-=item chmod: mode argument is missing initial 0
+=item chmod() mode argument is missing initial 0
-(W) A novice will sometimes say
+(W chmod) A novice will sometimes say
chmod 777, $filename
not realizing that 777 will be interpreted as a decimal number, equivalent
to 01411. Octal constants are introduced with a leading 0 in Perl, as in C.
-=item Close on unopened file E<lt>%sE<gt>
+=item Close on unopened file <%s>
-(W) You tried to close a filehandle that was never opened.
+(W unopened) You tried to close a filehandle that was never opened.
=item Compilation failed in require
@@ -1003,7 +1210,7 @@ were severe enough to halt compilation immediately.
=item Complex regular subexpression recursion limit (%d) exceeded
-(W) The regular expression engine uses recursion in complex situations
+(W regexp) The regular expression engine uses recursion in complex situations
where back-tracking is required. Recursion depth is limited to 32766,
or perhaps less in architectures where the stack cannot grow
arbitrarily. ("Simple" and "medium" situations are handled without
@@ -1013,9 +1220,9 @@ than in the regular expression engine; or rewriting the regular
expression so that it is simpler or backtracks less. (See L<perlbook>
for information on I<Mastering Regular Expressions>.)
-=item connect() on closed fd
+=item connect() on closed socket %s
-(W) You tried to do a connect on a closed socket. Did you forget to check
+(W closed) You tried to do a connect on a closed socket. Did you forget to check
the return value of your socket() call? See L<perlfunc/connect>.
=item Constant is not %s reference
@@ -1028,20 +1235,31 @@ See L<perlsub/"Constant Functions"> and L<constant>.
=item Constant subroutine %s redefined
-(S) You redefined a subroutine which had previously been eligible for
+(S|W redefine) You redefined a subroutine which had previously been eligible for
inlining. See L<perlsub/"Constant Functions"> for commentary and
workarounds.
=item Constant subroutine %s undefined
-(S) You undefined a subroutine which had previously been eligible for
+(W misc) You undefined a subroutine which had previously been eligible for
inlining. See L<perlsub/"Constant Functions"> for commentary and
workarounds.
+=item constant(%s): %s
+
+(F) The parser found inconsistencies either while attempting to define an
+overloaded constant, or when trying to find the character name specified
+in the C<\N{...}> escape. Perhaps you forgot to load the corresponding
+C<overload> or C<charnames> pragma? See L<charnames> and L<overload>.
+
=item Copy method did not return a reference
(F) The method which overloads "=" is buggy. See L<overload/Copy Constructor>.
+=item CORE::%s is not a keyword
+
+(F) The CORE:: namespace is reserved for Perl keywords.
+
=item Corrupt malloc ptr 0x%lx at 0x%lx
(P) The malloc package that comes with Perl had an internal failure.
@@ -1058,22 +1276,43 @@ a valid magic number.
=item Deep recursion on subroutine "%s"
-(W) This subroutine has called itself (directly or indirectly) 100
+(W recursion) This subroutine has called itself (directly or indirectly) 100
times more than it has returned. This probably indicates an infinite
recursion, unless you're writing strange benchmark programs, in which
case it indicates something else.
+=item defined(@array) is deprecated
+
+(D deprecated) defined() is not usually useful on arrays because it checks for an
+undefined I<scalar> value. If you want to see if the array is empty,
+just use C<if (@array) { # not empty }> for example.
+
+=item defined(%hash) is deprecated
+
+(D deprecated) defined() is not usually useful on hashes because it checks for an
+undefined I<scalar> value. If you want to see if the hash is empty,
+just use C<if (%hash) { # not empty }> for example.
+
=item Delimiter for here document is too long
-(F) In a here document construct like C<E<lt>E<lt>FOO>, the label
+(F) In a here document construct like C<<<FOO>, the label
C<FOO> is too long for Perl to handle. You have to be seriously
twisted to write code that triggers this error.
-=item Did you mean &%s instead?
+=item Did not produce a valid header
+
+See Server error.
+
+=item (Did you mean &%s instead?)
(W) You probably referred to an imported subroutine &FOO as $FOO or some such.
-=item Did you mean $ or @ instead of %?
+=item (Did you mean "local" instead of "our"?)
+
+(W misc) Remember that "our" does not localize the declared global variable.
+You have declared it again in the same lexical scope, which seems superfluous.
+
+=item (Did you mean $ or @ instead of %?)
(W) You probably said %hash{$key} when you meant $hash{$key} or @hash{@keys}.
On the other hand, maybe you just meant %hash and got carried away.
@@ -1083,7 +1322,7 @@ On the other hand, maybe you just meant %hash and got carried away.
(F) You passed die() an empty string (the equivalent of C<die "">) or
you called it with no args and both C<$@> and C<$_> were empty.
-=item Do you need to predeclare %s?
+=item (Do you need to predeclare %s?)
(S) This is an educated guess made in conjunction with the message "%s
found where operator expected". It often means a subroutine or module
@@ -1095,6 +1334,10 @@ to define the subroutine or package before the current location. You
can use an empty "sub foo;" or "package FOO;" to enter a "forward"
declaration.
+=item Document contains no data
+
+See Server error.
+
=item Don't know how to handle magic of type '%s'
(P) The internal handling of magical variables has been cursed.
@@ -1105,7 +1348,7 @@ declaration.
=item Duplicate free() ignored
-(S) An internal routine called free() on something that had already
+(S malloc) An internal routine called free() on something that had already
been freed.
=item elseif should be elsif
@@ -1115,10 +1358,16 @@ ugly. Your code will be interpreted as an attempt to call a method
named "elseif" for the class returned by the following block. This is
unlikely to be what you want.
-=item END failed--cleanup aborted
+=item %s failed--call queue aborted
+
+(F) An untrapped exception was raised while executing a CHECK, INIT, or
+END subroutine. Processing of the remainder of the queue of such
+routines has been prematurely ended.
+
+=item entering effective %s failed
-(F) An untrapped exception was raised while executing an END subroutine.
-The interpreter is immediately exited.
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
=item Error converting file specification %s
@@ -1162,32 +1411,44 @@ variable and glob that.
=item Exiting eval via %s
-(W) You are exiting an eval by unconventional means, such as
+(W exiting) You are exiting an eval by unconventional means, such as
+a goto, or a loop control statement.
+
+=item Exiting format via %s
+
+(W exiting) You are exiting an eval by unconventional means, such as
a goto, or a loop control statement.
=item Exiting pseudo-block via %s
-(W) You are exiting a rather special block construct (like a sort block or
+(W exiting) You are exiting a rather special block construct (like a sort block or
subroutine) by unconventional means, such as a goto, or a loop control
statement. See L<perlfunc/sort>.
=item Exiting subroutine via %s
-(W) You are exiting a subroutine by unconventional means, such as
+(W exiting) You are exiting a subroutine by unconventional means, such as
a goto, or a loop control statement.
=item Exiting substitution via %s
-(W) You are exiting a substitution by unconventional means, such as
+(W exiting) You are exiting a substitution by unconventional means, such as
a return, a goto, or a loop control statement.
=item Explicit blessing to '' (assuming package main)
-(W) You are blessing a reference to a zero length string. This has
+(W misc) You are blessing a reference to a zero length string. This has
the effect of blessing the reference into the package main. This is
usually not what you want. Consider providing a default target
package, e.g. bless($ref, $p || 'MyPackage');
+=item false [] range "%s" in regexp
+
+(W regexp) A character class range must start and end at a literal character, not
+another character class like C<\d> or C<[:alpha:]>. The "-" in your false
+range is interpreted as a literal "-". Consider quoting the "-", "\-".
+See L<perlre>.
+
=item Fatal VMS error at %s, line %d
(P) An error peculiar to VMS. Something untoward happened in a VMS system
@@ -1202,24 +1463,24 @@ PDP-11 or something?
=item Filehandle %s never opened
-(W) An I/O operation was attempted on a filehandle that was never initialized.
+(W unopened) An I/O operation was attempted on a filehandle that was never initialized.
You need to do an open() or a socket() call, or call a constructor from
the FileHandle package.
-=item Filehandle %s opened for only input
+=item Filehandle %s opened only for input
-(W) You tried to write on a read-only filehandle. If you
+(W io) You tried to write on a read-only filehandle. If you
intended it to be a read-write filehandle, you needed to open it with
-"+E<lt>" or "+E<gt>" or "+E<gt>E<gt>" instead of with "E<lt>" or nothing. If
-you intended only to write the file, use "E<gt>" or "E<gt>E<gt>". See
+"+<" or "+>" or "+>>" instead of with "<" or nothing. If
+you intended only to write the file, use ">" or ">>". See
L<perlfunc/open>.
-=item Filehandle opened for only input
+=item Filehandle %s opened only for output
-(W) You tried to write on a read-only filehandle. If you
-intended it to be a read-write filehandle, you needed to open it with
-"+E<lt>" or "+E<gt>" or "+E<gt>E<gt>" instead of with "E<lt>" or nothing. If
-you intended only to write the file, use "E<gt>" or "E<gt>E<gt>". See
+(W io) You tried to read from a filehandle opened only for writing. If you
+intended it to be a read/write filehandle, you needed to open it with
+"+<" or "+>" or "+>>" instead of with "<" or nothing. If
+you intended only to read from the file, use "<". See
L<perlfunc/open>.
=item Final $ should be \$ or $name
@@ -1236,12 +1497,18 @@ a literal "at" sign, or was meant to introduce a variable name
that happens to be missing. So you have to put either the backslash or
the name.
+=item flock() on closed filehandle %s
+
+(W closed) The filehandle you're attempting to flock() got itself closed some
+time before now. Check your logic flow. flock() operates on filehandles.
+Are you attempting to call flock() on a dirhandle by the same name?
+
=item Format %s redefined
-(W) You redefined a format. To suppress this warning, say
+(W redefine) You redefined a format. To suppress this warning, say
{
- local $^W = 0;
+ no warnings;
eval "format NAME =...";
}
@@ -1252,7 +1519,7 @@ to the end of your file without finding such a line.
=item Found = in conditional, should be ==
-(W) You said
+(W syntax) You said
if ($foo = 123)
@@ -1272,9 +1539,9 @@ when you meant
because if it did, it'd feel morally obligated to return every hostname
on the Internet.
-=item get{sock,peer}name() on closed fd
+=item get%sname() on closed socket %s
-(W) You tried to get a socket or peer socket name on a closed socket.
+(W closed) You tried to get a socket or peer socket name on a closed socket.
Did you forget to check the return value of your socket() call?
=item getpwnam returned invalid UIC %#o for user "%s"
@@ -1282,6 +1549,20 @@ Did you forget to check the return value of your socket() call?
(S) A warning peculiar to VMS. The call to C<sys$getuai> underlying the
C<getpwnam> operator returned an invalid UIC.
+=item glob failed (%s)
+
+(W glob) Something went wrong with the external program(s) used for C<glob>
+and C<< <*.c> >>. Usually, this means that you supplied a C<glob>
+pattern that caused the external program to fail and exit with a nonzero
+status. If the message indicates that the abnormal exit resulted in a
+coredump, this may also mean that your csh (C shell) is broken. If so,
+you should change all of the csh-related variables in config.sh: If you
+have tcsh, make the variables refer to it as if it were csh (e.g.
+C<full_csh='/usr/bin/tcsh'>); otherwise, make them all empty (except that
+C<d_csh> should be C<'undef'>) so that Perl will think csh is missing.
+In either case, after editing config.sh, run C<./Configure -S> and
+rebuild Perl.
+
=item Glob not terminated
(F) The lexer saw a left angle bracket in a place where it was expecting
@@ -1292,8 +1573,9 @@ the line, and you really meant a "less than".
=item Global symbol "%s" requires explicit package name
(F) You've said "use strict vars", which indicates that all variables
-must either be lexically scoped (using "my"), or explicitly qualified to
-say which package the global variable is in (using "::").
+must either be lexically scoped (using "my"), declared beforehand using
+"our", or explicitly qualified to say which package the global variable
+is in (using "::").
=item goto must have label
@@ -1302,15 +1584,21 @@ unspecified destination. See L<perlfunc/goto>.
=item Had to create %s unexpectedly
-(S) A routine asked for a symbol from a symbol table that ought to have
+(S internal) A routine asked for a symbol from a symbol table that ought to have
existed already, but for some reason it didn't, and had to be created on
an emergency basis to prevent a core dump.
=item Hash %%s missing the % in argument %d of %s()
-(D) Really old Perl let you omit the % on hash names in some spots. This
+(D deprecated) Really old Perl let you omit the % on hash names in some spots. This
is now heavily deprecated.
+=item Hexadecimal number > 0xffffffff non-portable
+
+(W portable) The hexadecimal number you specified is larger than 2**32-1
+(4294967295) and therefore non-portable between systems. See
+L<perlport> for more on portability concerns.
+
=item Identifier too long
(F) Perl limits identifiers (names for variables, functions, etc.) to
@@ -1318,33 +1606,26 @@ about 250 characters for simple names, and somewhat more for compound
names (like C<$A::B>). You've exceeded Perl's limits. Future
versions of Perl are likely to eliminate these arbitrary limitations.
-=item Ill-formed logical name |%s| in prime_env_iter
+=item Ill-formed CRTL environ value "%s"
-(W) A warning peculiar to VMS. A logical name was encountered when preparing
-to iterate over %ENV which violates the syntactic rules governing logical
-names. Because it cannot be translated normally, it is skipped, and will not
-appear in %ENV. This may be a benign occurrence, as some software packages
-might directly modify logical name tables and introduce nonstandard names,
-or it may indicate that a logical name table has been corrupted.
+(W internal) A warning peculiar to VMS. Perl tried to read the CRTL's internal
+environ array, and encountered an element without the C<=> delimiter
+used to spearate keys from values. The element is ignored.
-=item Illegal character %s (carriage return)
-
-(F) A carriage return character was found in the input. This is an
-error, and not a warning, because carriage return characters can break
-multi-line strings, including here documents (e.g., C<print E<lt>E<lt>EOF;>).
+=item Ill-formed message in prime_env_iter: |%s|
-Under Unix, this error is usually caused by executing Perl code --
-either the main program, a module, or an eval'd string -- that was
-transferred over a network connection from a non-Unix system without
-properly converting the text file format.
+(W internal) A warning peculiar to VMS. Perl tried to read a logical name
+or CLI symbol definition when preparing to iterate over %ENV, and
+didn't see the expected delimiter between key and value, so the
+line was ignored.
-Under systems that use something other than '\n' to delimit lines of
-text, this error can also be caused by reading Perl code from a file
-handle that is in binary mode (as set by the C<binmode> operator).
+=item Illegal character %s (carriage return)
-In either case, the Perl code in question will probably need to be
-converted with something like C<s/\x0D\x0A?/\n/g> before it can be
-executed.
+(F) Perl normally treats carriage returns in the program text as it
+would any other whitespace, which means you should never see this
+error when Perl was built using standard options. For some reason,
+your version of Perl appears to have been built without this support.
+Talk to your Perl administrator.
=item Illegal division by zero
@@ -1356,21 +1637,35 @@ logic, or you need to put a conditional in to guard against meaningless input.
(F) You tried to divide a number by 0 to get the remainder. Most numbers
don't take to this kindly.
-=item Illegal octal digit
+=item Illegal binary digit %s
+
+(F) You used a digit other than 0 or 1 in a binary number.
+
+=item Illegal octal digit %s
(F) You used an 8 or 9 in a octal number.
-=item Illegal octal digit ignored
+=item Illegal binary digit %s ignored
+
+(W digit) You may have tried to use a digit other than 0 or 1 in a binary number.
+Interpretation of the binary number stopped before the offending digit.
+
+=item Illegal octal digit %s ignored
-(W) You may have tried to use an 8 or 9 in a octal number. Interpretation
+(W digit) You may have tried to use an 8 or 9 in a octal number. Interpretation
of the octal number stopped before the 8 or 9.
-=item Illegal hex digit ignored
+=item Illegal hexadecimal digit %s ignored
-(W) You may have tried to use a character other than 0 - 9 or A - F in a
-hexadecimal number. Interpretation of the hexadecimal number stopped
+(W digit) You may have tried to use a character other than 0 - 9 or A - F, a - f
+in a hexadecimal number. Interpretation of the hexadecimal number stopped
before the illegal character.
+=item Illegal number of bits in vec
+
+(F) The number of bits in vec() (the third argument) must be a power of
+two from 1 to 32 (or 64, if your platform supports that).
+
=item Illegal switch in PERL5OPT: %s
(X) The PERL5OPT environment variable may only be used to set the
@@ -1410,17 +1705,17 @@ C<$ENV{ENV}> or C<$ENV{BASH_ENV}> are derived from data supplied (or
potentially supplied) by the user. The script must set the path to a
known value, using trustworthy data. See L<perlsec>.
-=item Integer overflow in hex number
-
-(S) The literal hex number you have specified is too big for your
-architecture. On a 32-bit architecture the largest hex literal is
-0xFFFFFFFF.
-
-=item Integer overflow in octal number
+=item Integer overflow in %s number
-(S) The literal octal number you have specified is too big for your
-architecture. On a 32-bit architecture the largest octal literal is
-037777777777.
+(W overflow) The hexadecimal, octal or binary number you have specified either
+as a literal or as an argument to hex() or oct() is too big for your
+architecture, and has been converted to a floating point number. On a
+32-bit architecture the largest hexadecimal, octal or binary number
+representable without overflow is 0xFFFFFFFF, 037777777777, or
+0b11111111111111111111111111111111 respectively. Note that Perl
+transparently promotes all numbers to a floating point representation
+internally--subject to loss of precision errors in subsequent
+operations.
=item Internal inconsistency in tracking vforks
@@ -1436,44 +1731,47 @@ and execute the specified command.
(P) Something went badly wrong in the regular expression parser.
-=item glob failed (%s)
-
-(W) Something went wrong with the external program(s) used for C<glob>
-and C<E<lt>*.cE<gt>>. Usually, this means that you supplied a C<glob>
-pattern that caused the external program to fail and exit with a nonzero
-status. If the message indicates that the abnormal exit resulted in a
-coredump, this may also mean that your csh (C shell) is broken. If so,
-you should change all of the csh-related variables in config.sh: If you
-have tcsh, make the variables refer to it as if it were csh (e.g.
-C<full_csh='/usr/bin/tcsh'>); otherwise, make them all empty (except that
-C<d_csh> should be C<'undef'>) so that Perl will think csh is missing.
-In either case, after editing config.sh, run C<./Configure -S> and
-rebuild Perl.
-
=item internal urp in regexp at /%s/
(P) Something went badly awry in the regular expression parser.
-=item invalid [] range in regexp
+=item Invalid %s attribute: %s
+
+The indicated attribute for a subroutine or variable was not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item Invalid %s attributes: %s
+
+The indicated attributes for a subroutine or variable were not recognized
+by Perl or by a user-supplied handler. See L<attributes>.
+
+=item invalid [] range "%s" in regexp
(F) The range specified in a character class had a minimum character
greater than the maximum character. See L<perlre>.
=item Invalid conversion in %s: "%s"
-(W) Perl does not understand the given format conversion.
+(W printf) Perl does not understand the given format conversion.
See L<perlfunc/sprintf>.
+=item Invalid separator character %s in attribute list
+
+(F) Something other than a colon or whitespace was seen between the
+elements of an attribute list. If the previous attribute
+had a parenthesised parameter list, perhaps that list was terminated
+too soon. See L<attributes>.
+
=item Invalid type in pack: '%s'
(F) The given character is not a valid pack type. See L<perlfunc/pack>.
-(W) The given character is not a valid pack type but used to be silently
+(W pack) The given character is not a valid pack type but used to be silently
ignored.
=item Invalid type in unpack: '%s'
(F) The given character is not a valid unpack type. See L<perlfunc/unpack>.
-(W) The given character is not a valid unpack type but used to be silently
+(W unpack) The given character is not a valid unpack type but used to be silently
ignored.
=item ioctl is not implemented
@@ -1503,16 +1801,31 @@ L<perlfunc/last>.
that name, not even if you count where you were called from. See
L<perlfunc/last>.
-=item listen() on closed fd
+=item leaving effective %s failed
+
+(F) While under the C<use filetest> pragma, switching the real and
+effective uids or gids failed.
-(W) You tried to do a listen on a closed socket. Did you forget to check
+=item listen() on closed socket %s
+
+(W closed) You tried to do a listen on a closed socket. Did you forget to check
the return value of your socket() call? See L<perlfunc/listen>.
+=item Lvalue subs returning %s not implemented yet
+
+(F) Due to limitations in the current implementation, array and hash
+values cannot be returned in subroutines used in lvalue context.
+See L<perlsub/"Lvalue subroutines">.
+
=item Method for operation %s not found in package %s during blessing
(F) An attempt was made to specify an entry in an overloading table that
doesn't resolve to a valid subroutine. See L<overload>.
+=item Method %s not permitted
+
+See Server error.
+
=item Might be a runaway multi-line %s string starting on line %d
(S) An advisory indicating that the previous error may have been caused
@@ -1521,7 +1834,7 @@ ended earlier on the current line.
=item Misplaced _ in number
-(W) An underline in a decimal constant wasn't on a 3-digit boundary.
+(W syntax) An underline in a decimal constant wasn't on a 3-digit boundary.
=item Missing $ on loop variable
@@ -1529,21 +1842,31 @@ ended earlier on the current line.
mentioned with the $ in Perl, unlike in the shells, where it can vary from
one line to the next.
+=item Missing %sbrace%s on \N{}
+
+(F) Wrong syntax of character name literal C<\N{charname}> within
+double-quotish context.
+
=item Missing comma after first argument to %s function
(F) While certain functions allow you to specify a filehandle or an
"indirect object" before the argument list, this ain't one of them.
-=item Missing operator before %s?
+=item Missing command in piped open
+
+(W pipe) You used the C<open(FH, "| command")> or C<open(FH, "command |")>
+construction, but the command was missing or blank.
+
+=item (Missing operator before %s?)
(S) This is an educated guess made in conjunction with the message "%s
found where operator expected". Often the missing operator is a comma.
-=item Missing right bracket
+=item Missing right curly or square bracket
-(F) The lexer counted more opening curly brackets (braces) than closing ones.
-As a general rule, you'll find it's missing near the place you were last
-editing.
+(F) The lexer counted more opening curly or square brackets than
+closing ones. As a general rule, you'll find it's missing near the place
+you were last editing.
=item Modification of a read-only value attempted
@@ -1577,15 +1900,20 @@ be created for some peculiar reason.
=item Multidimensional syntax %s not supported
-(W) Multidimensional arrays aren't written like C<$foo[1,2,3]>. They're written
+(W syntax) Multidimensional arrays aren't written like C<$foo[1,2,3]>. They're written
like C<$foo[1][2][3]>, as in C.
+=item Missing name in "my sub"
+
+(F) The reserved syntax for lexically scoped subroutines requires that they
+have a name with which they can be found.
+
=item Name "%s::%s" used only once: possible typo
-(W) Typographical errors often show up as unique variable names.
+(W once) Typographical errors often show up as unique variable names.
If you had a good reason for having a unique name, then just mention
-it again somehow to suppress the message. The C<use vars> pragma is
-provided for just this purpose.
+it again somehow to suppress the message. The C<our> declaration is
+provided for this purpose.
=item Negative length
@@ -1616,6 +1944,11 @@ See L<perlsec>.
(F) A setuid script can't be specified by the user.
+=item No %s specified for -%c
+
+(F) The indicated command line switch needs a mandatory argument, but
+you haven't specified one.
+
=item No comma allowed after %s
(F) A list operator that has a filehandle or "indirect object" is not
@@ -1661,30 +1994,36 @@ but for some reason the perl5db.pl file (or some facsimile thereof)
didn't define a DB::sub routine to be called at the beginning of each
ordinary subroutine call.
-=item No error file after 2E<gt> or 2E<gt>E<gt> on command line
+=item No error file after 2> or 2>> on command line
(F) An error peculiar to VMS. Perl handles its own command line redirection,
-and found a '2E<gt>' or a '2E<gt>E<gt>' on the command line, but can't find
+and found a '2>' or a '2>>' on the command line, but can't find
the name of the file to which to write data destined for stderr.
-=item No input file after E<lt> on command line
+=item No input file after < on command line
(F) An error peculiar to VMS. Perl handles its own command line redirection,
-and found a 'E<lt>' on the command line, but can't find the name of the file
+and found a '<' on the command line, but can't find the name of the file
from which to read data for stdin.
-=item No output file after E<gt> on command line
+=item No output file after > on command line
(F) An error peculiar to VMS. Perl handles its own command line redirection,
-and found a lone 'E<gt>' at the end of the command line, so it doesn't know
+and found a lone '>' at the end of the command line, so it doesn't know
where you wanted to redirect stdout.
-=item No output file after E<gt> or E<gt>E<gt> on command line
+=item No output file after > or >> on command line
(F) An error peculiar to VMS. Perl handles its own command line redirection,
-and found a 'E<gt>' or a 'E<gt>E<gt>' on the command line, but can't find the
+and found a '>' or a '>>' on the command line, but can't find the
name of the file to which to write data destined for stdout.
+=item No package name allowed for variable %s in "our"
+
+(F) Fully qualified variable names are not allowed in "our" declarations,
+because that doesn't make much sense under existing semantics. Such
+syntax is reserved for future extensions.
+
=item No Perl script found in input
(F) You called C<perl -x>, but no line was found in the file beginning
@@ -1700,18 +2039,18 @@ your system.
(F) Configure didn't find anything resembling the setreuid() call for
your system.
-=item No space allowed after B<-I>
+=item No space allowed after -%c
-(F) The argument to B<-I> must follow the B<-I> immediately with no
-intervening space.
+(F) The argument to the indicated command line switch must follow immediately
+after the switch, without intervening spaces.
-=item No such array field
+=item No such pseudo-hash field "%s"
(F) You tried to access an array as a hash, but the field name used is
not defined. The hash at index 0 should map all valid field names to
array indices for that to work.
-=item No such field "%s" in variable %s of type %s
+=item No such pseudo-hash field "%s" in variable %s of type %s
(F) You tried to access a field of a typed variable where the type
does not know about the field name. The field names are looked up in
@@ -1726,9 +2065,17 @@ an attempt to close an unopened filehandle.
=item No such signal: SIG%s
-(W) You specified a signal name as a subscript to %SIG that was not recognized.
+(W signal) You specified a signal name as a subscript to %SIG that was not recognized.
Say C<kill -l> in your shell to see the valid signal names on your system.
+=item no UTC offset information; assuming local time is UTC
+
+(S) A warning peculiar to VMS. Perl was unable to find the local
+timezone offset, so it's assuming that local system time is equivalent
+to UTC. If it's not, define the logical name F<SYS$TIMEZONE_DIFFERENTIAL>
+to translate to the number of seconds which need to be added to UTC to
+get local time.
+
=item Not a CODE reference
(F) Perl was trying to evaluate a reference to a code value (that is, a
@@ -1790,7 +2137,7 @@ function to find out what kind of ref it really was. See L<perlref>.
=item Not enough format arguments
-(W) A format specified more picture fields than the next line supplied.
+(W syntax) A format specified more picture fields than the next line supplied.
See L<perlform>.
=item Null filename used
@@ -1806,7 +2153,7 @@ supplied it an uninitialized value. See L<perlform>.
=item NULL OP IN RUN
-(P) Some internal routine called run() with a null opcode pointer.
+(P debugging) Some internal routine called run() with a null opcode pointer.
=item Null realloc
@@ -1827,9 +2174,23 @@ about 250 characters. You've exceeded that length. Future versions of
Perl are likely to eliminate this arbitrary limitation. In the meantime,
try using scientific notation (e.g. "1e6" instead of "1_000_000").
+=item Octal number > 037777777777 non-portable
+
+(W portable) The octal number you specified is larger than 2**32-1 (4294967295)
+and therefore non-portable between systems. See L<perlport> for more
+on portability concerns.
+
+See also L<perlport> for writing portable code.
+
+=item Octal number in vector unsupported
+
+(F) Numbers with a leading C<0> are not currently allowed in vectors. The
+octal number interpretation of such numbers may be supported in a future
+version.
+
=item Odd number of elements in hash assignment
-(S) You specified an odd number of elements to initialize a hash, which
+(W misc) You specified an odd number of elements to initialize a hash, which
is odd, because hashes come in key/value pairs.
=item Offset outside string
@@ -1841,11 +2202,11 @@ will extend the buffer and zero pad the new area.
=item oops: oopsAV
-(S) An internal warning that the grammar is screwed up.
+(S internal) An internal warning that the grammar is screwed up.
=item oops: oopsHV
-(S) An internal warning that the grammar is screwed up.
+(S internal) An internal warning that the grammar is screwed up.
=item Operation `%s': no method found, %s
@@ -1857,12 +2218,18 @@ true. See L<overload>.
=item Operator or semicolon missing before %s
-(S) You used a variable or subroutine call where the parser was
+(S ambiguous) You used a variable or subroutine call where the parser was
expecting an operator. The parser has assumed you really meant
to use an operator, but this is highly likely to be incorrect.
For example, if you say "*foo *foo" it will be interpreted as
if you said "*foo * 'foo'".
+=item Out of memory!
+
+(X) The malloc() function returned 0, indicating there was insufficient
+remaining memory (or virtual memory) to satisfy the request. Perl
+has no option but to exit immediately.
+
=item Out of memory for yacc stack
(F) The yacc parser wanted to grow its stack so it could continue parsing,
@@ -1894,7 +2261,7 @@ instead of C<$arr[$time]>.
=item page overflow
-(W) A single call to write() produced more lines than can fit on a page.
+(W io) A single call to write() produced more lines than can fit on a page.
See L<perlform>.
=item panic: ck_grep
@@ -1910,6 +2277,11 @@ See L<perlform>.
(P) The savestack was requested to restore more localized values than there
are in the savestack.
+=item panic: del_backref
+
+(P) Failed an internal consistency check while trying to reset a weak
+reference.
+
=item panic: die %s
(P) We popped the context stack to an eval context, and then discovered
@@ -1948,6 +2320,10 @@ and then discovered it wasn't a context we know how to do a goto in.
(P) The lexer got into a bad state parsing a string with brackets.
+=item panic: kid popen errno read
+
+(F) forked child returned an incomprehensible message about its errno.
+
=item panic: last
(P) We popped the context stack to a block context, and then discovered
@@ -1966,6 +2342,11 @@ invalid enum on the top of it.
(P) Something requested a negative number of bytes of malloc.
+=item panic: magic_killbackrefs
+
+(P) Failed an internal consistency check while trying to reset all weak
+references to an object.
+
=item panic: mapstart
(P) The compiler is screwed up with respect to the map() function.
@@ -2041,9 +2422,13 @@ was string.
(P) The lexer got into a bad state while processing a case modifier.
+=item panic: %s
+
+(P) An internal error.
+
=item Parentheses missing around "%s" list
-(W) You said something like
+(W parenthesis) You said something like
my $foo, $bar = @_;
@@ -2051,7 +2436,7 @@ when you meant
my ($foo, $bar) = @_;
-Remember that "my" and "local" bind closer than comma.
+Remember that "my", "our", and "local" bind tighter than comma.
=item Perl %3.3f required--this is only version %s, stopped
@@ -2063,20 +2448,25 @@ anyway? See L<perlfunc/require>.
(F) The setuid emulator in suidperl decided you were up to no good.
-=item pid %d not a child
+=item pid %x not a child
-(W) A warning peculiar to VMS. Waitpid() was asked to wait for a process which
+(W exec) A warning peculiar to VMS. Waitpid() was asked to wait for a process which
isn't a subprocess of the current process. While this is fine from VMS'
perspective, it's probably not what you intended.
=item POSIX getpgrp can't take an argument
-(F) Your C compiler uses POSIX getpgrp(), which takes no argument, unlike
+(F) Your system has POSIX getpgrp(), which takes no argument, unlike
the BSD version, which takes a pid.
+=item Possible Y2K bug: %s
+
+(W y2k) You are concatenating the number 19 with another number, which
+could be a potential Year 2000 problem.
+
=item Possible attempt to put comments in qw() list
-(W) qw() lists contain items separated by whitespace; as with literal
+(W qw) qw() lists contain items separated by whitespace; as with literal
strings, comment characters are not ignored, but are instead treated
as literal data. (You may have used different delimiters than the
parentheses shown here; braces are also frequently used.)
@@ -2105,7 +2495,7 @@ old-fashioned way, with quotes and commas:
=item Possible attempt to separate words with commas
-(W) qw() lists contain items separated by whitespace; therefore commas
+(W qw) qw() lists contain items separated by whitespace; therefore commas
aren't needed to separate the items. (You may have used different
delimiters than the parentheses shown here; braces are also frequently
used.)
@@ -2126,9 +2516,27 @@ Perl guesses a reasonable buffer size, but puts a sentinel byte at the
end of the buffer just in case. This sentinel byte got clobbered, and
Perl assumes that memory is now corrupted. See L<perlfunc/ioctl>.
+=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
+
+(W deprecated) You have written somehing like this:
+
+ sub doit
+ {
+ use attrs qw(locked);
+ }
+
+You should use the new declaration syntax instead.
+
+ sub doit : locked
+ {
+ ...
+
+The C<use attrs> pragma is now obsolete, and is only provided for
+backward-compatibility. See L<perlsub/"Subroutine Attributes">.
+
=item Precedence problem: open %s should be open(%s)
-(S) The old irregular construct
+(S precedence) The old irregular construct
open FOO || die;
@@ -2141,27 +2549,23 @@ and list operators. (The old open was a little of both.) You must
put parentheses around the filehandle, or use the new "or" operator
instead of "||".
-=item print on closed filehandle %s
+=item Premature end of script headers
-(W) The filehandle you're printing on got itself closed sometime before now.
-Check your logic flow.
+See Server error.
-=item printf on closed filehandle %s
+=item print() on closed filehandle %s
-(W) The filehandle you're writing to got itself closed sometime before now.
+(W closed) The filehandle you're printing on got itself closed sometime before now.
Check your logic flow.
-=item Probable precedence problem on %s
-
-(W) The compiler found a bareword where it expected a conditional,
-which often indicates that an || or && was parsed as part of the
-last argument of the previous construct, for example:
+=item printf() on closed filehandle %s
- open FOO || die;
+(W closed) The filehandle you're writing to got itself closed sometime before now.
+Check your logic flow.
=item Prototype mismatch: %s vs %s
-(S) The subroutine being declared or defined had previously been declared
+(S unsafe) The subroutine being declared or defined had previously been declared
or defined with a different function prototype.
=item Range iterator outside integer range
@@ -2171,18 +2575,23 @@ are outside the range which can be represented by integers internally.
One possible workaround is to force Perl to use magical string
increment by prepending "0" to your numbers.
-=item Read on closed filehandle E<lt>%sE<gt>
+=item readline() on closed filehandle %s
-(W) The filehandle you're reading from got itself closed sometime before now.
+(W closed) The filehandle you're reading from got itself closed sometime before now.
Check your logic flow.
+=item realloc() of freed memory ignored
+
+(S malloc) An internal routine called realloc() on something that had already
+been freed.
+
=item Reallocation too large: %lx
(F) You can't allocate more than 64K on an MS-DOS machine.
=item Recompile perl with B<-D>DEBUGGING to use B<-D> switch
-(F) You can't use the B<-D> option unless the code to produce the
+(F debugging) You can't use the B<-D> option unless the code to produce the
desired output is compiled into Perl, which entails some overhead,
which is why it's currently left out of your copy.
@@ -2198,7 +2607,7 @@ method. Probably indicates an unintended loop in your inheritance hierarchy.
=item Reference found where even-sized list expected
-(W) You gave a single reference where Perl was expecting a list with
+(W misc) You gave a single reference where Perl was expecting a list with
an even number of elements (for assignment to a hash). This
usually means that you used the anon hash constructor when you meant
to use parens. In any case, a hash requires key/value B<pairs>.
@@ -2208,9 +2617,14 @@ to use parens. In any case, a hash requires key/value B<pairs>.
%hash = ( one => 1, two => 2, ); # right
%hash = qw( one 1 two 2 ); # also fine
+=item Reference is already weak
+
+(W misc) You have attempted to weaken a reference that is already weak.
+Doing so has no effect.
+
=item Reference miscount in sv_replace()
-(W) The internal sv_replace() function was handed a new SV with a
+(W internal) The internal sv_replace() function was handed a new SV with a
reference count of other than 1.
=item regexp *+ operand could be empty
@@ -2227,17 +2641,19 @@ expression compiler gave it.
(P) A "can't happen" error, because safemalloc() should have caught it earlier.
-=item regexp too big
+=item Repeat count in pack overflows
-(F) The current implementation of regular expressions uses shorts as
-address offsets within a string. Unfortunately this means that if
-the regular expression compiles to longer than 32767, it'll blow up.
-Usually when you want a regular expression this big, there is a better
-way to do it with multiple statements. See L<perlre>.
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/pack>.
+
+=item Repeat count in unpack overflows
+
+(F) You can't specify a repeat count so large that it overflows
+your signed integers. See L<perlfunc/unpack>.
=item Reversed %s= operator
-(W) You wrote your assignment operator backwards. The = must always
+(W syntax) You wrote your assignment operator backwards. The = must always
comes last, to avoid ambiguity with subsequent unary operators.
=item Runaway format
@@ -2250,7 +2666,7 @@ shifting or popping (for array variables). See L<perlform>.
=item Scalar value @%s[%s] better written as $%s[%s]
-(W) You've used an array slice (indicated by @) to select a single element of
+(W syntax) You've used an array slice (indicated by @) to select a single element of
an array. Generally it's better to ask for a scalar value (indicated by $).
The difference is that C<$foo[&bar]> always behaves like a scalar, both when
assigning to it and when evaluating its argument, while C<@foo[&bar]> behaves
@@ -2264,7 +2680,7 @@ L<perlref>.
=item Scalar value @%s{%s} better written as $%s{%s}
-(W) You've used a hash slice (indicated by @) to select a single element of
+(W syntax) You've used a hash slice (indicated by @) to select a single element of
a hash. Generally it's better to ask for a scalar value (indicated by $).
The difference is that C<$foo{&bar}> always behaves like a scalar, both when
assigning to it and when evaluating its argument, while C<@foo{&bar}> behaves
@@ -2289,7 +2705,7 @@ Missing the leading C<$> from a variable C<$m> may cause this error.
=item %sseek() on unopened file
-(W) You tried to use the seek() or sysseek() function on a filehandle that
+(W unopened) You tried to use the seek() or sysseek() function on a filehandle that
was either never opened or has since been closed.
=item select not implemented
@@ -2302,17 +2718,17 @@ was either never opened or has since been closed.
=item semi-panic: attempt to dup freed string
-(S) The internal newSVsv() routine was called to duplicate a scalar
+(S internal) The internal newSVsv() routine was called to duplicate a scalar
that had previously been marked as free.
=item Semicolon seems to be missing
-(W) A nearby syntax error was probably caused by a missing semicolon,
+(W semicolon) A nearby syntax error was probably caused by a missing semicolon,
or possibly some other missing operator, such as a comma.
-=item Send on closed socket
+=item send() on closed socket %s
-(W) The filehandle you're sending to got itself closed sometime before now.
+(W closed) The socket you're sending to got itself closed sometime before now.
Check your logic flow.
=item Sequence (? incomplete
@@ -2337,7 +2753,12 @@ See L<perlre>.
=item Server error
-Also known as "500 Server error".
+This is the error message generally seen in a browser window when trying
+to run a CGI program (including SSI) over the web. The actual error
+text varies widely from server to server. The most frequently-seen
+variants are "500 Server error", "Method (something) not permitted",
+"Document contains no data", "Premature end of script headers", and
+"Did not produce a valid header".
B<This is a CGI error, not a Perl error>.
@@ -2364,10 +2785,15 @@ think so.
=item seteuid() not implemented
-(F) You tried to assign to C<$E<gt>>, and your operating system doesn't support
+(F) You tried to assign to C<< $> >>, and your operating system doesn't support
the seteuid() system call (or equivalent), or at least Configure didn't
think so.
+=item setpgrp can't take arguments
+
+(F) Your system has the setpgrp() from BSD 4.2, which takes no arguments,
+unlike POSIX setpgid(), which takes a process ID and process group ID.
+
=item setrgid() not implemented
(F) You tried to assign to C<$(>, and your operating system doesn't support
@@ -2376,7 +2802,7 @@ think so.
=item setruid() not implemented
-(F) You tried to assign to C<$E<lt>>, and your operating system doesn't support
+(F) You tried to assign to C<$<>, and your operating system doesn't support
the setruid() system call (or equivalent), or at least Configure didn't
think so.
@@ -2389,13 +2815,13 @@ because the world might have written on it already.
(F) You don't have System V shared memory IPC on your system.
-=item shutdown() on closed fd
+=item shutdown() on closed socket %s
-(W) You tried to do a shutdown on a closed socket. Seems a bit superfluous.
+(W closed) You tried to do a shutdown on a closed socket. Seems a bit superfluous.
=item SIG%s handler "%s" not defined
-(W) The signal handler named in %SIG doesn't, in fact, exist. Perhaps you
+(W signal) The signal handler named in %SIG doesn't, in fact, exist. Perhaps you
put it into the wrong package?
=item sort is now a reserved word
@@ -2406,7 +2832,7 @@ But before sort was a keyword, people sometimes used it as a filehandle.
=item Sort subroutine didn't return a numeric value
(F) A sort comparison routine must return a number. You probably blew
-it by not using C<E<lt>=E<gt>> or C<cmp>, or by not using them correctly.
+it by not using C<< <=> >> or C<cmp>, or by not using them correctly.
See L<perlfunc/sort>.
=item Sort subroutine didn't return single value
@@ -2420,14 +2846,14 @@ or less than one element. See L<perlfunc/sort>.
more times than there are characters of input, which is what happened.)
See L<perlfunc/split>.
-=item Stat on unopened file E<lt>%sE<gt>
+=item Stat on unopened file <%s>
-(W) You tried to use the stat() function (or an equivalent file test)
+(W unopened) You tried to use the stat() function (or an equivalent file test)
on a filehandle that was either never opened or has since been closed.
=item Statement unlikely to be reached
-(W) You did an exec() with some statement after it other than a die().
+(W exec) You did an exec() with some statement after it other than a die().
This is almost always an error, because exec() never returns unless
there was a failure. You probably wanted to use system() instead,
which does return. To suppress this warning, put the exec() in a block
@@ -2435,7 +2861,7 @@ by itself.
=item Strange *+?{} on zero-length expression
-(W) You applied a regular expression quantifier in a place where it
+(W regexp) You applied a regular expression quantifier in a place where it
makes no sense, such as on a zero-width assertion.
Try putting the quantifier inside the assertion instead. For example,
the way to match "abc" provided that it is followed by three
@@ -2449,10 +2875,10 @@ may break this.
=item Subroutine %s redefined
-(W) You redefined a subroutine. To suppress this warning, say
+(W redefine) You redefined a subroutine. To suppress this warning, say
{
- local $^W = 0;
+ no warnings;
eval "sub name { ... }";
}
@@ -2477,10 +2903,10 @@ Missing the leading C<$> from variable C<$s> may cause this error.
=item substr outside of string
-(S),(W) You tried to reference a substr() that pointed outside of a
+(W substr),(F) You tried to reference a substr() that pointed outside of a
string. That is, the absolute value of the offset was larger than the
length of the string. See L<perlfunc/substr>. This warning is
-mandatory if substr is used in an lvalue context (as the left hand side
+fatal if substr is used in an lvalue context (as the left hand side
of an assignment or as a subroutine argument for example).
=item suidperl is no longer needed since %s
@@ -2488,6 +2914,11 @@ of an assignment or as a subroutine argument for example).
(F) Your Perl was compiled with B<-D>SETUID_SCRIPTS_ARE_SECURE_NOW, but a
version of the setuid emulator somehow got run anyway.
+=item switching effective %s is not implemented
+
+(F) While under the C<use filetest> pragma, we cannot switch the
+real and effective uids or gids.
+
=item syntax error
(F) Probably means you had a syntax error. Common reasons include:
@@ -2522,9 +2953,9 @@ into Perl yourself.
machine. In some machines the functionality can exist but be
unconfigured. Consult your system support.
-=item Syswrite on closed filehandle
+=item syswrite() on closed filehandle %s
-(W) The filehandle you're writing to got itself closed sometime before now.
+(W closed) The filehandle you're writing to got itself closed sometime before now.
Check your logic flow.
=item Target of goto is too deeply nested
@@ -2534,12 +2965,12 @@ nested for Perl to reach. Perl is doing you a favor by refusing.
=item tell() on unopened file
-(W) You tried to use the tell() function on a filehandle that was either
+(W unopened) You tried to use the tell() function on a filehandle that was either
never opened or has since been closed.
-=item Test on unopened file E<lt>%sE<gt>
+=item Test on unopened file <%s>
-(W) You tried to invoke a file test operator on a filehandle that isn't
+(W unopened) You tried to invoke a file test operator on a filehandle that isn't
open. Check your logic. See also L<perlfunc/-X>.
=item That use of $[ is unsupported
@@ -2576,6 +3007,17 @@ will deny it.
if the last stat that wrote to the stat buffer already went past
the symlink to get to the real file. Use an actual filename instead.
+=item This Perl can't reset CRTL environ elements (%s)
+
+=item This Perl can't set CRTL environ elements (%s=%s)
+
+(W internal) Warnings peculiar to VMS. You tried to change or delete an element
+of the CRTL's internal environ array, but your copy of Perl wasn't
+built with a CRTL that contained the setenv() function. You'll need to
+rebuild Perl with a CRTL that does, or redefine F<PERL_ENV_TABLES> (see
+L<perlvms>) so that the environ array isn't the target of the change to
+%ENV which produced the warning.
+
=item times not implemented
(F) Your version of the C library apparently doesn't do times(). I suspect
@@ -2608,6 +3050,14 @@ B<-T> option must appear on the command line: C<perl -T scriptname>.
B<-M> or B<-m> option. This is an error because B<-M> and B<-m> options
are not intended for use inside scripts. Use the C<use> pragma instead.
+=item Too late to run %s block
+
+(W void) A CHECK or INIT block is being defined during run time proper,
+when the opportunity to run them has already passed. Perhaps you are
+loading a file with C<require> or C<do> when you should be using
+C<use> instead. Or perhaps you should put the C<require> or C<do>
+inside a BEGIN block.
+
=item Too many ('s
=item Too many )'s
@@ -2654,7 +3104,7 @@ certain type. Arrays must be @NAME or C<@{EXPR}>. Hashes must be
=item umask: argument is missing initial 0
-(W) A umask of 222 is incorrect. It should be 0222, because octal
+(W umask) A umask of 222 is incorrect. It should be 0222, because octal
literals always start with 0 in Perl, as in C.
=item umask not implemented
@@ -2668,22 +3118,22 @@ to use it to restrict permissions for yourself (EXPR & 0700).
=item Unbalanced context: %d more PUSHes than POPs
-(W) The exit code detected an internal inconsistency in how many execution
+(W internal) The exit code detected an internal inconsistency in how many execution
contexts were entered and left.
=item Unbalanced saves: %d more saves than restores
-(W) The exit code detected an internal inconsistency in how many
+(W internal) The exit code detected an internal inconsistency in how many
values were temporarily localized.
=item Unbalanced scopes: %d more ENTERs than LEAVEs
-(W) The exit code detected an internal inconsistency in how many blocks
+(W internal) The exit code detected an internal inconsistency in how many blocks
were entered and left.
=item Unbalanced tmps: %d more allocs than frees
-(W) The exit code detected an internal inconsistency in how many mortal
+(W internal) The exit code detected an internal inconsistency in how many mortal
scalars were allocated and freed.
=item Undefined format "%s" called
@@ -2718,7 +3168,7 @@ another package? See L<perlform>.
=item Undefined value assigned to typeglob
-(W) An undefined value was assigned to a typeglob, a la C<*foo = undef>.
+(W misc) An undefined value was assigned to a typeglob, a la C<*foo = undef>.
This does nothing. It's possible that you really mean C<undef *foo>.
=item unexec of %s into %s failed!
@@ -2730,18 +3180,31 @@ representative, who probably put it there in the first place.
(F) There are no byte-swapping functions for a machine with this byte order.
+=item Unknown open() mode '%s'
+
+(F) The second argument of 3-argument open() is not among the list
+of valid modes: C<< < >>, C<< > >>, C<<< >> >>>, C<< +< >>,
+C<< +> >>, C<<< +>> >>>, C<-|>, C<|->.
+
+=item Unknown process %x sent message to prime_env_iter: %s
+
+(P) An error peculiar to VMS. Perl was reading values for %ENV before
+iterating over it, and someone else stuck a message in the stream of
+data Perl expected. Someone's very confused, or perhaps trying to
+subvert Perl's population of %ENV for nefarious purposes.
+
=item unmatched () in regexp
(F) Unbackslashed parentheses must always be balanced in regular
expressions. If you're a vi user, the % key is valuable for finding
the matching parenthesis. See L<perlre>.
-=item Unmatched right bracket
+=item Unmatched right %s bracket
-(F) The lexer counted more closing curly brackets (braces) than opening
-ones, so you're probably missing an opening bracket. As a general
-rule, you'll find the missing one (so to speak) near the place you were
-last editing.
+(F) The lexer counted more closing curly or square brackets than
+opening ones, so you're probably missing a matching opening bracket.
+As a general rule, you'll find the missing one (so to speak) near the
+place you were last editing.
=item unmatched [] in regexp
@@ -2751,7 +3214,7 @@ See L<perlre>.
=item Unquoted string "%s" may clash with future reserved word
-(W) You used a bareword that might someday be claimed as a reserved word.
+(W reserved) You used a bareword that might someday be claimed as a reserved word.
It's best to put such a word in quotes, or capitalize it somehow, or insert
an underbar into it. You might also declare it as a subroutine.
@@ -2761,6 +3224,11 @@ an underbar into it. You might also declare it as a subroutine.
in your Perl script (or eval). Perhaps you tried to run a compressed
script, a binary program, or a directory as a Perl program.
+=item Unrecognized escape \\%c passed through
+
+(W misc) You used a backslash-character combination which is not recognized
+by Perl.
+
=item Unrecognized signal name "%s"
(F) You specified a signal name to the kill() function that was not recognized.
@@ -2774,7 +3242,7 @@ supplying the bad switch on your behalf.)
=item Unsuccessful %s on filename containing newline
-(W) A file operation was attempted on a filename, and that operation
+(W newline) A file operation was attempted on a filename, and that operation
failed, PROBABLY because the filename contained a newline, PROBABLY
because you forgot to chop() or chomp() it off. See L<perlfunc/chomp>.
@@ -2800,33 +3268,35 @@ At least, Configure doesn't think so.
(F) Your machine doesn't support the Berkeley socket mechanism, or at
least that's what Configure thought.
-=item Unterminated E<lt>E<gt> operator
+=item Unterminated <> operator
(F) The lexer saw a left angle bracket in a place where it was expecting
a term, so it's looking for the corresponding right angle bracket, and not
finding it. Chances are you left some needed parentheses out earlier in
the line, and you really meant a "less than".
-=item Use of "$$<digit>" to mean "${$}<digit>" is deprecated
+=item Unterminated attribute parameter in attribute list
-(D) Perl versions before 5.004 misinterpreted any type marker followed
-by "$" and a digit. For example, "$$0" was incorrectly taken to mean
-"${$}0" instead of "${$0}". This bug is (mostly) fixed in Perl 5.004.
+(F) The lexer saw an opening (left) parenthesis character while parsing an
+attribute list, but the matching closing (right) parenthesis
+character was not found. You may need to add (or remove) a backslash
+character to get your parentheses to balance. See L<attributes>.
-However, the developers of Perl 5.004 could not fix this bug completely,
-because at least two widely-used modules depend on the old meaning of
-"$$0" in a string. So Perl 5.004 still interprets "$$<digit>" in the
-old (broken) way inside strings; but it generates this message as a
-warning. And in Perl 5.005, this special treatment will cease.
+=item Unterminated attribute list
+
+(F) The lexer found something other than a simple identifier at the start
+of an attribute, and it wasn't a semicolon or the start of a
+block. Perhaps you terminated the parameter list of the previous attribute
+too soon. See L<attributes>.
=item Use of $# is deprecated
-(D) This was an ill-advised attempt to emulate a poorly defined B<awk> feature.
+(D deprecated) This was an ill-advised attempt to emulate a poorly defined B<awk> feature.
Use an explicit printf() or sprintf() instead.
=item Use of $* is deprecated
-(D) This variable magically turned on multi-line pattern matching, both for
+(D deprecated) This variable magically turned on multi-line pattern matching, both for
you and for any luckless subroutine that you happen to call. You should
use the new C<//m> and C<//s> modifiers now to do that without the dangerous
action-at-a-distance effects of C<$*>.
@@ -2836,23 +3306,23 @@ action-at-a-distance effects of C<$*>.
(F) You attempted to use a feature of printf that is accessible from
only C. This usually means there's a better way to do it in Perl.
-=item Use of bare E<lt>E<lt> to mean E<lt>E<lt>"" is deprecated
+=item Use of bare << to mean <<"" is deprecated
-(D) You are now encouraged to use the explicitly quoted form if you
+(D deprecated) You are now encouraged to use the explicitly quoted form if you
wish to use an empty line as the terminator of the here-document.
=item Use of implicit split to @_ is deprecated
-(D) It makes a lot of work for the compiler when you clobber a
+(D deprecated) It makes a lot of work for the compiler when you clobber a
subroutine's argument list, so it's better if you assign the results of
a split() explicitly to an array (or list).
=item Use of inherited AUTOLOAD for non-method %s() is deprecated
-(D) As an (ahem) accidental feature, C<AUTOLOAD> subroutines are looked
-up as methods (using the C<@ISA> hierarchy) even when the subroutines to
-be autoloaded were called as plain functions (e.g. C<Foo::bar()>), not
-as methods (e.g. C<Foo-E<gt>bar()> or C<$obj-E<gt>bar()>).
+(D deprecated) As an (ahem) accidental feature, C<AUTOLOAD> subroutines are
+looked up as methods (using the C<@ISA> hierarchy) even when the subroutines
+to be autoloaded were called as plain functions (e.g. C<Foo::bar()>),
+not as methods (e.g. C<< Foo->bar() >> or C<< $obj->bar() >>).
This bug will be rectified in Perl 5.005, which will use method lookup
only for methods' C<AUTOLOAD>s. However, there is a significant base
@@ -2871,7 +3341,7 @@ C<use AutoLoader 'AUTOLOAD';>.
=item Use of reserved word "%s" is deprecated
-(D) The indicated bareword is a reserved word. Future versions of perl
+(D deprecated) The indicated bareword is a reserved word. Future versions of perl
may use it as a keyword, so you're better off either explicitly quoting
the word in a manner appropriate for its context of use, or using a
different name altogether. The warning can be suppressed for subroutine
@@ -2880,15 +3350,15 @@ e.g. C<&our()>, or C<Foo::our()>.
=item Use of %s is deprecated
-(D) The construct indicated is no longer recommended for use, generally
+(D deprecated) The construct indicated is no longer recommended for use, generally
because there's a better way to do it, and also because the old way has
bad side effects.
-=item Use of uninitialized value
+=item Use of uninitialized value%s
-(W) An undefined value was used as if it were already defined. It was
+(W uninitialized) An undefined value was used as if it were already defined. It was
interpreted as a "" or a 0, but maybe it was a mistake. To suppress this
-warning assign an initial value to your variables.
+warning assign a defined value to your variables.
=item Useless use of "re" pragma
@@ -2896,7 +3366,7 @@ warning assign an initial value to your variables.
=item Useless use of %s in void context
-(W) You did something without a side effect in a context that does nothing
+(W void) You did something without a side effect in a context that does nothing
with the return value, such as a statement that doesn't return a value
from a block, or the left side of a scalar comma operator. Very often
this points not to stupidity on your part, but a failure of Perl to parse
@@ -2927,17 +3397,24 @@ L<perlref> for more on this.
=item untie attempted while %d inner references still exist
-(W) A copy of the object returned from C<tie> (or C<tied>) was still
+(W untie) A copy of the object returned from C<tie> (or C<tied>) was still
valid when C<untie> was called.
=item Value of %s can be "0"; test with defined()
-(W) In a conditional expression, you used <HANDLE>, <*> (glob), C<each()>,
+(W misc) In a conditional expression, you used <HANDLE>, <*> (glob), C<each()>,
or C<readdir()> as a boolean value. Each of these constructs can return a
value of "0"; that would make the conditional expression false, which is
probably not what you intended. When using these constructs in conditional
expressions, test their values with the C<defined> operator.
+=item Value of CLI symbol "%s" too long
+
+(W misc) A warning peculiar to VMS. Perl tried to read the value of an %ENV
+element from a CLI symbol table, and found a resultant string longer
+than 1024 characters. The return value has been truncated to 1024
+characters.
+
=item Variable "%s" is not imported%s
(F) While "use strict" in effect, you referred to a global variable
@@ -2948,7 +3425,7 @@ on the front of your variable.
=item Variable "%s" may be unavailable
-(W) An inner (nested) I<anonymous> subroutine is inside a I<named>
+(W closure) An inner (nested) I<anonymous> subroutine is inside a I<named>
subroutine, and outside that is another subroutine; and the anonymous
(innermost) subroutine is referencing a lexical variable defined in
the outermost subroutine. For example:
@@ -2970,7 +3447,7 @@ subroutine in between interferes with this feature.
=item Variable "%s" will not stay shared
-(W) An inner (nested) I<named> subroutine is referencing a lexical
+(W closure) An inner (nested) I<named> subroutine is referencing a lexical
variable defined in an outer subroutine.
When the inner subroutine is called, it will probably see the value of
@@ -2996,6 +3473,12 @@ variables.
of Perl. Check the #! line, or manually feed your script into
Perl yourself.
+=item Version number must be a constant number
+
+(P) The attempt to translate a C<use Module n.n LIST> statement into
+its equivalent C<BEGIN> block found an internal inconsistency with
+the version number.
+
=item perl: warning: Setting locale failed.
(S) The whole warning message will look something like:
@@ -3029,7 +3512,7 @@ close(). This usually indicates your file system ran out of disk space.
=item Warning: Use of "%s" without parentheses is ambiguous
-(S) You wrote a unary operator followed by something that looks like a
+(S ambiguous) You wrote a unary operator followed by something that looks like a
binary operator that could also have been interpreted as a term or
unary operator. For instance, if you know that the rand function
has a default argument of 1.0, and you write
@@ -3046,9 +3529,9 @@ but in actual fact, you got
So put in parentheses to say what you really mean.
-=item Write on closed filehandle
+=item write() on closed filehandle %s
-(W) The filehandle you're writing to got itself closed sometime before now.
+(W closed) The filehandle you're writing to got itself closed sometime before now.
Check your logic flow.
=item X outside of string
@@ -3084,32 +3567,32 @@ the eg directory to put a setuid C wrapper around your script.
=item You need to quote "%s"
-(W) You assigned a bareword as a signal handler name. Unfortunately, you
+(W syntax) You assigned a bareword as a signal handler name. Unfortunately, you
already have a subroutine of that name declared, which means that Perl 5
will try to call the subroutine when the assignment is executed, which is
probably not what you want. (If it IS what you want, put an & in front.)
-=item [gs]etsockopt() on closed fd
+=item %cetsockopt() on closed socket %s
-(W) You tried to get or set a socket option on a closed socket.
+(W closed) You tried to get or set a socket option on a closed socket.
Did you forget to check the return value of your socket() call?
-See L<perlfunc/getsockopt>.
+See L<perlfunc/getsockopt> and L<perlfunc/setsockopt>.
=item \1 better written as $1
-(W) Outside of patterns, backreferences live on as variables. The use
+(W syntax) Outside of patterns, backreferences live on as variables. The use
of backslashes is grandfathered on the right-hand side of a
substitution, but stylistically it's better to use the variable form
because other Perl programmers will expect it, and it works better
if there are more than 9 backreferences.
-=item '|' and 'E<lt>' may not both be specified on command line
+=item '|' and '<' may not both be specified on command line
(F) An error peculiar to VMS. Perl does its own command line redirection, and
found that STDIN was a pipe, and that you also tried to redirect STDIN using
-'E<lt>'. Only one STDIN stream to a customer, please.
+'<'. Only one STDIN stream to a customer, please.
-=item '|' and 'E<gt>' may not both be specified on command line
+=item '|' and '>' may not both be specified on command line
(F) An error peculiar to VMS. Perl does its own command line redirection, and
thinks you tried to redirect stdout both to a file and into a pipe to another
@@ -3159,3 +3642,4 @@ in F<README.os2>.
=back
+=cut
diff --git a/contrib/perl5/pod/perldsc.pod b/contrib/perl5/pod/perldsc.pod
index ef3ae75..5ab97e1 100644
--- a/contrib/perl5/pod/perldsc.pod
+++ b/contrib/perl5/pod/perldsc.pod
@@ -8,8 +8,8 @@ The single feature most sorely lacking in the Perl programming language
prior to its 5.0 release was complex data structures. Even without direct
language support, some valiant programmers did manage to emulate them, but
it was hard work and not for the faint of heart. You could occasionally
-get away with the C<$m{$LoL,$b}> notation borrowed from I<awk> in which the
-keys are actually more like a single concatenated string C<"$LoL$b">, but
+get away with the C<$m{$AoA,$b}> notation borrowed from B<awk> in which the
+keys are actually more like a single concatenated string C<"$AoA$b">, but
traversal and sorting were difficult. More desperate programmers even
hacked Perl's internal symbol table directly, a strategy that proved hard
to develop and maintain--to put it mildly.
@@ -21,7 +21,7 @@ with three dimensions!
for $x (1 .. 10) {
for $y (1 .. 10) {
for $z (1 .. 10) {
- $LoL[$x][$y][$z] =
+ $AoA[$x][$y][$z] =
$x ** $y + $z;
}
}
@@ -30,7 +30,7 @@ with three dimensions!
Alas, however simple this may appear, underneath it's a much more
elaborate construct than meets the eye!
-How do you print it out? Why can't you say just C<print @LoL>? How do
+How do you print it out? Why can't you say just C<print @AoA>? How do
you sort it? How can you pass it to a function or get one of these back
from a function? Is is an object? Can you save it to disk to read
back later? How do you access whole rows or columns of that matrix? Do
@@ -93,8 +93,8 @@ level. It's just that you can I<use> it as though it were a
two-dimensional one. This is actually the way almost all C
multidimensional arrays work as well.
- $list[7][12] # array of arrays
- $list[7]{string} # array of hashes
+ $array[7][12] # array of arrays
+ $array[7]{string} # array of hashes
$hash{string}[7] # hash of arrays
$hash{string}{'another string'} # hash of hashes
@@ -102,10 +102,10 @@ Now, because the top level contains only references, if you try to print
out your array in with a simple print() function, you'll get something
that doesn't look very nice, like this:
- @LoL = ( [2, 3], [4, 5, 7], [0] );
- print $LoL[1][2];
+ @AoA = ( [2, 3], [4, 5, 7], [0] );
+ print $AoA[1][2];
7
- print @LoL;
+ print @AoA;
ARRAY(0x83c38)ARRAY(0x8b194)ARRAY(0x8b1d0)
@@ -124,25 +124,25 @@ repeatedly. Here's the case where you just get the count instead
of a nested array:
for $i (1..10) {
- @list = somefunc($i);
- $LoL[$i] = @list; # WRONG!
+ @array = somefunc($i);
+ $AoA[$i] = @array; # WRONG!
}
-That's just the simple case of assigning a list to a scalar and getting
+That's just the simple case of assigning an array to a scalar and getting
its element count. If that's what you really and truly want, then you
might do well to consider being a tad more explicit about it, like this:
for $i (1..10) {
- @list = somefunc($i);
- $counts[$i] = scalar @list;
+ @array = somefunc($i);
+ $counts[$i] = scalar @array;
}
Here's the case of taking a reference to the same memory location
again and again:
for $i (1..10) {
- @list = somefunc($i);
- $LoL[$i] = \@list; # WRONG!
+ @array = somefunc($i);
+ $AoA[$i] = \@array; # WRONG!
}
So, what's the big problem with that? It looks right, doesn't it?
@@ -150,8 +150,8 @@ After all, I just told you that you need an array of references, so by
golly, you've made me one!
Unfortunately, while this is true, it's still broken. All the references
-in @LoL refer to the I<very same place>, and they will therefore all hold
-whatever was last in @list! It's similar to the problem demonstrated in
+in @AoA refer to the I<very same place>, and they will therefore all hold
+whatever was last in @array! It's similar to the problem demonstrated in
the following C program:
#include <pwd.h>
@@ -176,40 +176,40 @@ hash constructor C<{}> instead. Here's the right way to do the preceding
broken code fragments:
for $i (1..10) {
- @list = somefunc($i);
- $LoL[$i] = [ @list ];
+ @array = somefunc($i);
+ $AoA[$i] = [ @array ];
}
The square brackets make a reference to a new array with a I<copy>
-of what's in @list at the time of the assignment. This is what
+of what's in @array at the time of the assignment. This is what
you want.
Note that this will produce something similar, but it's
much harder to read:
for $i (1..10) {
- @list = 0 .. $i;
- @{$LoL[$i]} = @list;
+ @array = 0 .. $i;
+ @{$AoA[$i]} = @array;
}
Is it the same? Well, maybe so--and maybe not. The subtle difference
is that when you assign something in square brackets, you know for sure
it's always a brand new reference with a new I<copy> of the data.
-Something else could be going on in this new case with the C<@{$LoL[$i]}}>
+Something else could be going on in this new case with the C<@{$AoA[$i]}}>
dereference on the left-hand-side of the assignment. It all depends on
-whether C<$LoL[$i]> had been undefined to start with, or whether it
-already contained a reference. If you had already populated @LoL with
+whether C<$AoA[$i]> had been undefined to start with, or whether it
+already contained a reference. If you had already populated @AoA with
references, as in
- $LoL[3] = \@another_list;
+ $AoA[3] = \@another_array;
Then the assignment with the indirection on the left-hand-side would
use the existing reference that was already there:
- @{$LoL[3]} = @list;
+ @{$AoA[3]} = @array;
Of course, this I<would> have the "interesting" effect of clobbering
-@another_list. (Have you ever noticed how when a programmer says
+@another_array. (Have you ever noticed how when a programmer says
something is "interesting", that rather than meaning "intriguing",
they're disturbingly more apt to mean that it's "annoying",
"difficult", or both? :-)
@@ -222,8 +222,8 @@ Surprisingly, the following dangerous-looking construct will
actually work out fine:
for $i (1..10) {
- my @list = somefunc($i);
- $LoL[$i] = \@list;
+ my @array = somefunc($i);
+ $AoA[$i] = \@array;
}
That's because my() is more of a run-time statement than it is a
@@ -242,18 +242,18 @@ do the right thing behind the scenes.
In summary:
- $LoL[$i] = [ @list ]; # usually best
- $LoL[$i] = \@list; # perilous; just how my() was that list?
- @{ $LoL[$i] } = @list; # way too tricky for most programmers
+ $AoA[$i] = [ @array ]; # usually best
+ $AoA[$i] = \@array; # perilous; just how my() was that array?
+ @{ $AoA[$i] } = @array; # way too tricky for most programmers
=head1 CAVEAT ON PRECEDENCE
-Speaking of things like C<@{$LoL[$i]}>, the following are actually the
+Speaking of things like C<@{$AoA[$i]}>, the following are actually the
same thing:
- $listref->[2][2] # clear
- $$listref[2][2] # confusing
+ $aref->[2][2] # clear
+ $$aref[2][2] # confusing
That's because Perl's precedence rules on its five prefix dereferencers
(which look like someone swearing: C<$ @ * % &>) make them bind more
@@ -263,11 +263,11 @@ accustomed to using C<*a[i]> to mean what's pointed to by the I<i'th>
element of C<a>. That is, they first take the subscript, and only then
dereference the thing at that subscript. That's fine in C, but this isn't C.
-The seemingly equivalent construct in Perl, C<$$listref[$i]> first does
-the deref of C<$listref>, making it take $listref as a reference to an
+The seemingly equivalent construct in Perl, C<$$aref[$i]> first does
+the deref of $aref, making it take $aref as a reference to an
array, and then dereference that, and finally tell you the I<i'th> value
-of the array pointed to by $LoL. If you wanted the C notion, you'd have to
-write C<${$LoL[$i]}> to force the C<$LoL[$i]> to get evaluated first
+of the array pointed to by $AoA. If you wanted the C notion, you'd have to
+write C<${$AoA[$i]}> to force the C<$AoA[$i]> to get evaluated first
before the leading C<$> dereferencer.
=head1 WHY YOU SHOULD ALWAYS C<use strict>
@@ -283,19 +283,19 @@ This way, you'll be forced to declare all your variables with my() and
also disallow accidental "symbolic dereferencing". Therefore if you'd done
this:
- my $listref = [
+ my $aref = [
[ "fred", "barney", "pebbles", "bambam", "dino", ],
[ "homer", "bart", "marge", "maggie", ],
[ "george", "jane", "elroy", "judy", ],
];
- print $listref[2][2];
+ print $aref[2][2];
The compiler would immediately flag that as an error I<at compile time>,
-because you were accidentally accessing C<@listref>, an undeclared
+because you were accidentally accessing C<@aref>, an undeclared
variable, and it would thereby remind you to write instead:
- print $listref->[2][2]
+ print $aref->[2][2]
=head1 DEBUGGING
@@ -303,10 +303,10 @@ Before version 5.002, the standard Perl debugger didn't do a very nice job of
printing out complex data structures. With 5.002 or above, the
debugger includes several new features, including command line editing as
well as the C<x> command to dump out complex data structures. For
-example, given the assignment to $LoL above, here's the debugger output:
+example, given the assignment to $AoA above, here's the debugger output:
- DB<1> x $LoL
- $LoL = ARRAY(0x13b5a0)
+ DB<1> x $AoA
+ $AoA = ARRAY(0x13b5a0)
0 ARRAY(0x1f0a24)
0 'fred'
1 'barney'
@@ -330,79 +330,79 @@ Presented with little comment (these will get their own manpages someday)
here are short code examples illustrating access of various
types of data structures.
-=head1 LISTS OF LISTS
+=head1 ARRAYS OF ARRAYS
-=head2 Declaration of a LIST OF LISTS
+=head2 Declaration of a ARRAY OF ARRAYS
- @LoL = (
+ @AoA = (
[ "fred", "barney" ],
[ "george", "jane", "elroy" ],
[ "homer", "marge", "bart" ],
);
-=head2 Generation of a LIST OF LISTS
+=head2 Generation of a ARRAY OF ARRAYS
# reading from file
while ( <> ) {
- push @LoL, [ split ];
+ push @AoA, [ split ];
}
# calling a function
for $i ( 1 .. 10 ) {
- $LoL[$i] = [ somefunc($i) ];
+ $AoA[$i] = [ somefunc($i) ];
}
# using temp vars
for $i ( 1 .. 10 ) {
@tmp = somefunc($i);
- $LoL[$i] = [ @tmp ];
+ $AoA[$i] = [ @tmp ];
}
# add to an existing row
- push @{ $LoL[0] }, "wilma", "betty";
+ push @{ $AoA[0] }, "wilma", "betty";
-=head2 Access and Printing of a LIST OF LISTS
+=head2 Access and Printing of a ARRAY OF ARRAYS
# one element
- $LoL[0][0] = "Fred";
+ $AoA[0][0] = "Fred";
# another element
- $LoL[1][1] =~ s/(\w)/\u$1/;
+ $AoA[1][1] =~ s/(\w)/\u$1/;
# print the whole thing with refs
- for $aref ( @LoL ) {
+ for $aref ( @AoA ) {
print "\t [ @$aref ],\n";
}
# print the whole thing with indices
- for $i ( 0 .. $#LoL ) {
- print "\t [ @{$LoL[$i]} ],\n";
+ for $i ( 0 .. $#AoA ) {
+ print "\t [ @{$AoA[$i]} ],\n";
}
# print the whole thing one at a time
- for $i ( 0 .. $#LoL ) {
- for $j ( 0 .. $#{ $LoL[$i] } ) {
- print "elt $i $j is $LoL[$i][$j]\n";
+ for $i ( 0 .. $#AoA ) {
+ for $j ( 0 .. $#{ $AoA[$i] } ) {
+ print "elt $i $j is $AoA[$i][$j]\n";
}
}
-=head1 HASHES OF LISTS
+=head1 HASHES OF ARRAYS
-=head2 Declaration of a HASH OF LISTS
+=head2 Declaration of a HASH OF ARRAYS
- %HoL = (
+ %HoA = (
flintstones => [ "fred", "barney" ],
jetsons => [ "george", "jane", "elroy" ],
simpsons => [ "homer", "marge", "bart" ],
);
-=head2 Generation of a HASH OF LISTS
+=head2 Generation of a HASH OF ARRAYS
# reading from file
# flintstones: fred barney wilma dino
while ( <> ) {
next unless s/^(.*?):\s*//;
- $HoL{$1} = [ split ];
+ $HoA{$1} = [ split ];
}
# reading from file; more temps
@@ -410,65 +410,65 @@ types of data structures.
while ( $line = <> ) {
($who, $rest) = split /:\s*/, $line, 2;
@fields = split ' ', $rest;
- $HoL{$who} = [ @fields ];
+ $HoA{$who} = [ @fields ];
}
# calling a function that returns a list
for $group ( "simpsons", "jetsons", "flintstones" ) {
- $HoL{$group} = [ get_family($group) ];
+ $HoA{$group} = [ get_family($group) ];
}
# likewise, but using temps
for $group ( "simpsons", "jetsons", "flintstones" ) {
@members = get_family($group);
- $HoL{$group} = [ @members ];
+ $HoA{$group} = [ @members ];
}
# append new members to an existing family
- push @{ $HoL{"flintstones"} }, "wilma", "betty";
+ push @{ $HoA{"flintstones"} }, "wilma", "betty";
-=head2 Access and Printing of a HASH OF LISTS
+=head2 Access and Printing of a HASH OF ARRAYS
# one element
- $HoL{flintstones}[0] = "Fred";
+ $HoA{flintstones}[0] = "Fred";
# another element
- $HoL{simpsons}[1] =~ s/(\w)/\u$1/;
+ $HoA{simpsons}[1] =~ s/(\w)/\u$1/;
# print the whole thing
- foreach $family ( keys %HoL ) {
- print "$family: @{ $HoL{$family} }\n"
+ foreach $family ( keys %HoA ) {
+ print "$family: @{ $HoA{$family} }\n"
}
# print the whole thing with indices
- foreach $family ( keys %HoL ) {
+ foreach $family ( keys %HoA ) {
print "family: ";
- foreach $i ( 0 .. $#{ $HoL{$family} } ) {
- print " $i = $HoL{$family}[$i]";
+ foreach $i ( 0 .. $#{ $HoA{$family} } ) {
+ print " $i = $HoA{$family}[$i]";
}
print "\n";
}
# print the whole thing sorted by number of members
- foreach $family ( sort { @{$HoL{$b}} <=> @{$HoL{$a}} } keys %HoL ) {
- print "$family: @{ $HoL{$family} }\n"
+ foreach $family ( sort { @{$HoA{$b}} <=> @{$HoA{$a}} } keys %HoA ) {
+ print "$family: @{ $HoA{$family} }\n"
}
# print the whole thing sorted by number of members and name
foreach $family ( sort {
- @{$HoL{$b}} <=> @{$HoL{$a}}
+ @{$HoA{$b}} <=> @{$HoA{$a}}
||
$a cmp $b
- } keys %HoL )
+ } keys %HoA )
{
- print "$family: ", join(", ", sort @{ $HoL{$family} }), "\n";
+ print "$family: ", join(", ", sort @{ $HoA{$family} }), "\n";
}
-=head1 LISTS OF HASHES
+=head1 ARRAYS OF HASHES
-=head2 Declaration of a LIST OF HASHES
+=head2 Declaration of a ARRAY OF HASHES
- @LoH = (
+ @AoH = (
{
Lead => "fred",
Friend => "barney",
@@ -485,7 +485,7 @@ types of data structures.
}
);
-=head2 Generation of a LIST OF HASHES
+=head2 Generation of a ARRAY OF HASHES
# reading from file
# format: LEAD=fred FRIEND=barney
@@ -495,7 +495,7 @@ types of data structures.
($key, $value) = split /=/, $field;
$rec->{$key} = $value;
}
- push @LoH, $rec;
+ push @AoH, $rec;
}
@@ -503,34 +503,34 @@ types of data structures.
# format: LEAD=fred FRIEND=barney
# no temp
while ( <> ) {
- push @LoH, { split /[\s+=]/ };
+ push @AoH, { split /[\s+=]/ };
}
- # calling a function that returns a key,value list, like
+ # calling a function that returns a key/value pair list, like
# "lead","fred","daughter","pebbles"
while ( %fields = getnextpairset() ) {
- push @LoH, { %fields };
+ push @AoH, { %fields };
}
# likewise, but using no temp vars
while (<>) {
- push @LoH, { parsepairs($_) };
+ push @AoH, { parsepairs($_) };
}
# add key/value to an element
- $LoH[0]{pet} = "dino";
- $LoH[2]{pet} = "santa's little helper";
+ $AoH[0]{pet} = "dino";
+ $AoH[2]{pet} = "santa's little helper";
-=head2 Access and Printing of a LIST OF HASHES
+=head2 Access and Printing of a ARRAY OF HASHES
# one element
- $LoH[0]{lead} = "fred";
+ $AoH[0]{lead} = "fred";
# another element
- $LoH[1]{lead} =~ s/(\w)/\u$1/;
+ $AoH[1]{lead} =~ s/(\w)/\u$1/;
# print the whole thing with refs
- for $href ( @LoH ) {
+ for $href ( @AoH ) {
print "{ ";
for $role ( keys %$href ) {
print "$role=$href->{$role} ";
@@ -539,18 +539,18 @@ types of data structures.
}
# print the whole thing with indices
- for $i ( 0 .. $#LoH ) {
+ for $i ( 0 .. $#AoH ) {
print "$i is { ";
- for $role ( keys %{ $LoH[$i] } ) {
- print "$role=$LoH[$i]{$role} ";
+ for $role ( keys %{ $AoH[$i] } ) {
+ print "$role=$AoH[$i]{$role} ";
}
print "}\n";
}
# print the whole thing one at a time
- for $i ( 0 .. $#LoH ) {
- for $role ( keys %{ $LoH[$i] } ) {
- print "elt $i $role is $LoH[$i]{$role}\n";
+ for $i ( 0 .. $#AoH ) {
+ for $role ( keys %{ $AoH[$i] } ) {
+ print "elt $i $role is $AoH[$i]{$role}\n";
}
}
@@ -767,9 +767,9 @@ many different sorts:
###########################################################
# now, you might want to make interesting extra fields that
# include pointers back into the same data structure so if
- # change one piece, it changes everywhere, like for examples
- # if you wanted a {kids} field that was an array reference
- # to a list of the kids' records without having duplicate
+ # change one piece, it changes everywhere, like for example
+ # if you wanted a {kids} field that was a reference
+ # to an array of the kids' records without having duplicate
# records and thus update problems.
###########################################################
foreach $family (keys %TV) {
@@ -784,7 +784,7 @@ many different sorts:
$rec->{kids} = [ @kids ];
}
- # you copied the list, but the list itself contains pointers
+ # you copied the array, but the array itself contains pointers
# to uncopied objects. this means that if you make bart get
# older via
diff --git a/contrib/perl5/pod/perlembed.pod b/contrib/perl5/pod/perlembed.pod
index 03c5507..c4df676 100644
--- a/contrib/perl5/pod/perlembed.pod
+++ b/contrib/perl5/pod/perlembed.pod
@@ -12,7 +12,7 @@ Do you want to:
=item B<Use C from Perl?>
-Read L<perlxstut>, L<perlxs>, L<h2xs>, and L<perlguts>.
+Read L<perlxstut>, L<perlxs>, L<h2xs>, L<perlguts>, and L<perlapi>.
=item B<Use a Unix program from Perl?>
@@ -200,9 +200,9 @@ calling I<perl_run>.
=head2 Calling a Perl subroutine from your C program
-To call individual Perl subroutines, you can use any of the B<perl_call_*>
+To call individual Perl subroutines, you can use any of the B<call_*>
functions documented in L<perlcall>.
-In this example we'll use C<perl_call_argv>.
+In this example we'll use C<call_argv>.
That's shown below, in a program I'll call I<showtime.c>.
@@ -221,7 +221,7 @@ That's shown below, in a program I'll call I<showtime.c>.
/*** skipping perl_run() ***/
- perl_call_argv("showtime", G_DISCARD | G_NOARGS, args);
+ call_argv("showtime", G_DISCARD | G_NOARGS, args);
perl_destruct(my_perl);
perl_free(my_perl);
@@ -257,7 +257,7 @@ and package C<END {}> blocks.
If you want to pass arguments to the Perl subroutine, you can add
strings to the C<NULL>-terminated C<args> list passed to
-I<perl_call_argv>. For other data types, or to examine return values,
+I<call_argv>. For other data types, or to examine return values,
you'll need to manipulate the Perl stack. That's demonstrated in the
last section of this document: L<Fiddling with the Perl stack from
your C program>.
@@ -265,7 +265,7 @@ your C program>.
=head2 Evaluating a Perl statement from your C program
Perl provides two API functions to evaluate pieces of Perl code.
-These are L<perlguts/perl_eval_sv> and L<perlguts/perl_eval_pv>.
+These are L<perlapi/eval_sv> and L<perlapi/eval_pv>.
Arguably, these are the only routines you'll ever need to execute
snippets of Perl code from within your C program. Your code can be as
@@ -273,44 +273,44 @@ long as you wish; it can contain multiple statements; it can employ
L<perlfunc/use>, L<perlfunc/require>, and L<perlfunc/do> to
include external Perl files.
-I<perl_eval_pv> lets us evaluate individual Perl strings, and then
+I<eval_pv> lets us evaluate individual Perl strings, and then
extract variables for coercion into C types. The following program,
I<string.c>, executes three Perl strings, extracting an C<int> from
the first, a C<float> from the second, and a C<char *> from the third.
#include <EXTERN.h>
#include <perl.h>
-
+
static PerlInterpreter *my_perl;
-
+
main (int argc, char **argv, char **env)
{
STRLEN n_a;
char *embedding[] = { "", "-e", "0" };
-
+
my_perl = perl_alloc();
perl_construct( my_perl );
-
+
perl_parse(my_perl, NULL, 3, embedding, NULL);
perl_run(my_perl);
-
+
/** Treat $a as an integer **/
- perl_eval_pv("$a = 3; $a **= 2", TRUE);
- printf("a = %d\n", SvIV(perl_get_sv("a", FALSE)));
-
+ eval_pv("$a = 3; $a **= 2", TRUE);
+ printf("a = %d\n", SvIV(get_sv("a", FALSE)));
+
/** Treat $a as a float **/
- perl_eval_pv("$a = 3.14; $a **= 2", TRUE);
- printf("a = %f\n", SvNV(perl_get_sv("a", FALSE)));
-
+ eval_pv("$a = 3.14; $a **= 2", TRUE);
+ printf("a = %f\n", SvNV(get_sv("a", FALSE)));
+
/** Treat $a as a string **/
- perl_eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE);
- printf("a = %s\n", SvPV(perl_get_sv("a", FALSE), n_a));
-
+ eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE);
+ printf("a = %s\n", SvPV(get_sv("a", FALSE), n_a));
+
perl_destruct(my_perl);
perl_free(my_perl);
}
-All of those strange functions with I<sv> in their names help convert Perl scalars to C types. They're described in L<perlguts>.
+All of those strange functions with I<sv> in their names help convert Perl scalars to C types. They're described in L<perlguts> and L<perlapi>.
If you compile and run I<string.c>, you'll see the results of using
I<SvIV()> to create an C<int>, I<SvNV()> to create a C<float>, and
@@ -323,11 +323,11 @@ I<SvPV()> to create a string:
In the example above, we've created a global variable to temporarily
store the computed value of our eval'd expression. It is also
possible and in most cases a better strategy to fetch the return value
-from I<perl_eval_pv()> instead. Example:
+from I<eval_pv()> instead. Example:
...
STRLEN n_a;
- SV *val = perl_eval_pv("reverse 'rekcaH lreP rehtonA tsuJ'", TRUE);
+ SV *val = eval_pv("reverse 'rekcaH lreP rehtonA tsuJ'", TRUE);
printf("%s\n", SvPV(val,n_a));
...
@@ -336,7 +336,7 @@ variables and we've simplified our code as well.
=head2 Performing Perl pattern matches and substitutions from your C program
-The I<perl_eval_sv()> function lets us evaluate strings of Perl code, so we can
+The I<eval_sv()> function lets us evaluate strings of Perl code, so we can
define some functions that use it to "specialize" in matches and
substitutions: I<match()>, I<substitute()>, and I<matches()>.
@@ -364,51 +364,51 @@ been wrapped here):
#include <EXTERN.h>
#include <perl.h>
-
- /** my_perl_eval_sv(code, error_check)
- ** kinda like perl_eval_sv(),
+
+ /** my_eval_sv(code, error_check)
+ ** kinda like eval_sv(),
** but we pop the return value off the stack
**/
- SV* my_perl_eval_sv(SV *sv, I32 croak_on_error)
+ SV* my_eval_sv(SV *sv, I32 croak_on_error)
{
dSP;
SV* retval;
STRLEN n_a;
-
+
PUSHMARK(SP);
- perl_eval_sv(sv, G_SCALAR);
-
+ eval_sv(sv, G_SCALAR);
+
SPAGAIN;
retval = POPs;
PUTBACK;
-
+
if (croak_on_error && SvTRUE(ERRSV))
croak(SvPVx(ERRSV, n_a));
-
+
return retval;
}
-
+
/** match(string, pattern)
**
** Used for matches in a scalar context.
**
** Returns 1 if the match was successful; 0 otherwise.
**/
-
+
I32 match(SV *string, char *pattern)
{
SV *command = NEWSV(1099, 0), *retval;
STRLEN n_a;
-
+
sv_setpvf(command, "my $string = '%s'; $string =~ %s",
SvPV(string,n_a), pattern);
-
- retval = my_perl_eval_sv(command, TRUE);
+
+ retval = my_eval_sv(command, TRUE);
SvREFCNT_dec(command);
-
+
return SvIV(retval);
}
-
+
/** substitute(string, pattern)
**
** Used for =~ operations that modify their left-hand side (s/// and tr///)
@@ -416,22 +416,22 @@ been wrapped here):
** Returns the number of successful matches, and
** modifies the input string if there were any.
**/
-
+
I32 substitute(SV **string, char *pattern)
{
SV *command = NEWSV(1099, 0), *retval;
STRLEN n_a;
-
+
sv_setpvf(command, "$string = '%s'; ($string =~ %s)",
SvPV(*string,n_a), pattern);
-
- retval = my_perl_eval_sv(command, TRUE);
+
+ retval = my_eval_sv(command, TRUE);
SvREFCNT_dec(command);
-
- *string = perl_get_sv("string", FALSE);
+
+ *string = get_sv("string", FALSE);
return SvIV(retval);
}
-
+
/** matches(string, pattern, matches)
**
** Used for matches in an array context.
@@ -439,25 +439,25 @@ been wrapped here):
** Returns the number of matches,
** and fills in **matches with the matching substrings
**/
-
+
I32 matches(SV *string, char *pattern, AV **match_list)
{
SV *command = NEWSV(1099, 0);
I32 num_matches;
STRLEN n_a;
-
+
sv_setpvf(command, "my $string = '%s'; @array = ($string =~ %s)",
SvPV(string,n_a), pattern);
-
- my_perl_eval_sv(command, TRUE);
+
+ my_eval_sv(command, TRUE);
SvREFCNT_dec(command);
-
- *match_list = perl_get_av("array", FALSE);
+
+ *match_list = get_av("array", FALSE);
num_matches = av_len(*match_list) + 1; /** assume $[ is 0 **/
-
+
return num_matches;
}
-
+
main (int argc, char **argv, char **env)
{
PerlInterpreter *my_perl = perl_alloc();
@@ -466,30 +466,30 @@ been wrapped here):
I32 num_matches, i;
SV *text = NEWSV(1099,0);
STRLEN n_a;
-
+
perl_construct(my_perl);
perl_parse(my_perl, NULL, 3, embedding, NULL);
-
+
sv_setpv(text, "When he is at a convenience store and the bill comes to some amount like 76 cents, Maynard is aware that there is something he *should* do, something that will enable him to get back a quarter, but he has no idea *what*. He fumbles through his red squeezey changepurse and gives the boy three extra pennies with his dollar, hoping that he might luck into the correct amount. The boy gives him back two of his own pennies and then the big shiny quarter that is his prize. -RICHH");
-
+
if (match(text, "m/quarter/")) /** Does text contain 'quarter'? **/
printf("match: Text contains the word 'quarter'.\n\n");
else
printf("match: Text doesn't contain the word 'quarter'.\n\n");
-
+
if (match(text, "m/eighth/")) /** Does text contain 'eighth'? **/
printf("match: Text contains the word 'eighth'.\n\n");
else
printf("match: Text doesn't contain the word 'eighth'.\n\n");
-
+
/** Match all occurrences of /wi../ **/
num_matches = matches(text, "m/(wi..)/g", &match_list);
printf("matches: m/(wi..)/g found %d matches...\n", num_matches);
-
+
for (i = 0; i < num_matches; i++)
printf("match: %s\n", SvPV(*av_fetch(match_list, i, FALSE),n_a));
printf("\n");
-
+
/** Remove all vowels from text **/
num_matches = substitute(&text, "s/[aeiou]//gi");
if (num_matches) {
@@ -497,12 +497,12 @@ been wrapped here):
num_matches);
printf("Now text is: %s\n\n", SvPV(text,n_a));
}
-
+
/** Attempt a substitution **/
if (!substitute(&text, "s/Perl/C/")) {
printf("substitute: s/Perl/C...No substitution made.\n\n");
}
-
+
SvREFCNT_dec(text);
PL_perl_destruct_level = 1;
perl_destruct(my_perl);
@@ -539,7 +539,7 @@ results--the return value of your Perl subroutine--off the stack.
First you'll need to know how to convert between C types and Perl
types, with newSViv() and sv_setnv() and newAV() and all their
-friends. They're described in L<perlguts>.
+friends. They're described in L<perlguts> and L<perlapi>.
Then you'll need to know how to manipulate the Perl stack. That's
described in L<perlcall>.
@@ -576,7 +576,7 @@ deep breath...
XPUSHs(sv_2mortal(newSViv(a))); /* push the base onto the stack */
XPUSHs(sv_2mortal(newSViv(b))); /* push the exponent onto stack */
PUTBACK; /* make local stack pointer global */
- perl_call_pv("expo", G_SCALAR); /* call the function */
+ call_pv("expo", G_SCALAR); /* call the function */
SPAGAIN; /* refresh stack pointer */
/* pop the return value from stack */
printf ("%d to the %dth power is %d.\n", a, b, POPi);
@@ -638,7 +638,7 @@ the filename into a guaranteed-unique package name, and then compile
the code into that package using L<perlfunc/eval>. In the example
below, each file will only be compiled once. Or, the application
might choose to clean out the symbol table associated with the file
-after it's no longer needed. Using L<perlcall/perl_call_argv>, We'll
+after it's no longer needed. Using L<perlapi/call_argv>, We'll
call the subroutine C<Embed::Persistent::eval_file> which lives in the
file C<persistent.pl> and pass the filename and boolean cleanup/cache
flag as arguments.
@@ -656,7 +656,7 @@ with L<perlfunc/my> whenever possible.
#persistent.pl
use strict;
- use vars '%Cache';
+ our %Cache;
use Symbol qw(delete_package);
sub valid_package_name {
@@ -750,7 +750,7 @@ with L<perlfunc/my> whenever possible.
/* call the subroutine, passing it the filename as an argument */
args[0] = filename;
- perl_call_argv("Embed::Persistent::eval_file",
+ call_argv("Embed::Persistent::eval_file",
G_DISCARD | G_EVAL, args);
/* check $@ */
@@ -901,10 +901,10 @@ to see how Perl does this:
# define EXTERN_C extern
#endif
- static void xs_init _((void));
+ static void xs_init (void);
- EXTERN_C void boot_DynaLoader _((CV* cv));
- EXTERN_C void boot_Socket _((CV* cv));
+ EXTERN_C void boot_DynaLoader (CV* cv);
+ EXTERN_C void boot_Socket (CV* cv);
EXTERN_C void
@@ -953,7 +953,7 @@ B<ExtUtils::Embed> can also automate writing the I<xs_init> glue code.
% cc -c interp.c `perl -MExtUtils::Embed -e ccopts`
% cc -o interp perlxsi.o interp.o `perl -MExtUtils::Embed -e ldopts`
-Consult L<perlxs> and L<perlguts> for more details.
+Consult L<perlxs>, L<perlguts>, and L<perlapi> for more details.
=head1 Embedding Perl under Win32
diff --git a/contrib/perl5/pod/perlfaq.pod b/contrib/perl5/pod/perlfaq.pod
index cb35493..fa6943f 100644
--- a/contrib/perl5/pod/perlfaq.pod
+++ b/contrib/perl5/pod/perlfaq.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq - frequently asked questions about Perl ($Date: 1999/01/08 05:54:52 $)
+perlfaq - frequently asked questions about Perl ($Date: 1999/05/23 20:38:02 $)
=head1 DESCRIPTION
@@ -199,6 +199,8 @@ miscellaneous data issues.
=item * How do I find the week-of-the-year/day-of-the-year?
+=item * How do I find the current century or millennium?
+
=item * How can I compare two dates and find the difference?
=item * How can I take a string and turn it into epoch seconds?
@@ -248,13 +250,13 @@ miscellaneous data issues.
=item * What's wrong with always quoting "$vars"?
-=item * Why don't my E<lt>E<lt>HERE documents work?
+=item * Why don't my <<HERE documents work?
=item * What is the difference between a list and an array?
=item * What is the difference between $array[1] and @array[1]?
-=item * How can I extract just the unique elements of an array?
+=item * How can I remove duplicate elements from a list or array?
=item * How can I tell whether a list or array contains a certain element?
@@ -359,11 +361,11 @@ I/O and the "f" issues: filehandles, flushing, formats and footers.
=item * How come when I open a file read-write it wipes it out?
-=item * Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
+=item * Why do I sometimes get an "Argument list too long" when I use <*>?
=item * Is there a leak/bug in glob()?
-=item * How can I open a file with a leading "E<gt>" or trailing blanks?
+=item * How can I open a file with a leading ">" or trailing blanks?
=item * How can I reliably rename a file?
@@ -381,6 +383,8 @@ I/O and the "f" issues: filehandles, flushing, formats and footers.
=item * How do I print to more than one file at once?
+=item * How can I read in an entire file all at once?
+
=item * How can I read in a file by paragraphs?
=item * How can I read a single character from a file? From the keyboard?
@@ -426,7 +430,7 @@ Pattern matching and regular expressions.
=item * How can I match a locale-smart version of C</[a-zA-Z]/>?
-=item * How can I quote a variable to use in a regexp?
+=item * How can I quote a variable to use in a regex?
=item * What is C</o> really for?
@@ -434,7 +438,7 @@ Pattern matching and regular expressions.
=item * Can I use Perl regular expressions to match balanced text?
-=item * What does it mean that regexps are greedy? How can I get around it?
+=item * What does it mean that regexes are greedy? How can I get around it?
=item * How do I process each word on each line?
@@ -450,7 +454,7 @@ Pattern matching and regular expressions.
=item * What good is C<\G> in a regular expression?
-=item * Are Perl regexps DFAs or NFAs? Are they POSIX compliant?
+=item * Are Perl regexes DFAs or NFAs? Are they POSIX compliant?
=item * What's wrong with using grep or map in a void context?
@@ -470,7 +474,7 @@ other sections.
=item * Can I get a BNF/yacc/RE for the Perl language?
-=item * What are all these $@%* punctuation signs, and how do I know when to use them?
+=item * What are all these $@%&* punctuation signs, and how do I know when to use them?
=item * Do I always/never have to quote my strings or use semicolons and commas?
@@ -494,7 +498,7 @@ other sections.
=item * What is variable suicide and how can I prevent it?
-=item * How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regexp}?
+=item * How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?
=item * How do I create a static variable?
@@ -504,7 +508,7 @@ other sections.
=item * What's the difference between deep and shallow binding?
-=item * Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+=item * Why doesn't "my($foo) = <FILE>;" work right?
=item * How do I redefine a builtin function, operator, or method?
@@ -522,6 +526,8 @@ other sections.
=item * How do I clear a package?
+=item * How can I use a variable as a variable name?
+
=back
@@ -620,7 +626,7 @@ Interprocess communication (IPC), control over the user-interface
=item * How do I open a file without blocking?
-=item * How do I install a CPAN module?
+=item * How do I install a module from CPAN?
=item * What's the difference between require and use?
@@ -758,6 +764,15 @@ in respect of this information or its use.
=over 4
+=item 23/May/99
+
+Extensive updates from the net in preparation for 5.6 release.
+
+=item 13/April/99
+
+More minor touch-ups. Added new question at the end
+of perlfaq7 on variable names within variables.
+
=item 7/January/99
Small touchups here and there. Added all questions in this
@@ -816,4 +831,3 @@ This is the initial release of version 3 of the FAQ; consequently there
have been no changes since its initial release.
=back
-
diff --git a/contrib/perl5/pod/perlfaq1.pod b/contrib/perl5/pod/perlfaq1.pod
index d4cac42..af4d7cb 100644
--- a/contrib/perl5/pod/perlfaq1.pod
+++ b/contrib/perl5/pod/perlfaq1.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq1 - General Questions About Perl ($Revision: 1.20 $, $Date: 1999/01/08 04:22:09 $)
+perlfaq1 - General Questions About Perl ($Revision: 1.23 $, $Date: 1999/05/23 16:08:30 $)
=head1 DESCRIPTION
@@ -36,8 +36,8 @@ In particular, the core development team (known as the Perl Porters)
are a rag-tag band of highly altruistic individuals committed
to producing better software for free than you could hope to
purchase for money. You may snoop on pending developments via
-nntp://news.perl.com/perl.porters-gw/ and the Deja News archive at
-http://www.dejanews.com/ using the perl.porters-gw newsgroup, or you can
+news://news.perl.com/perl.porters-gw/ and the Deja archive at
+http://www.deja.com/ using the perl.porters-gw newsgroup, or you can
subscribe to the mailing list by sending perl5-porters-request@perl.org
a subscription request.
@@ -56,13 +56,13 @@ You should definitely use version 5. Version 4 is old, limited, and
no longer maintained; its last patch (4.036) was in 1992, long ago and
far away. Sure, it's stable, but so is anything that's dead; in fact,
perl4 had been called a dead, flea-bitten camel carcass. The most recent
-production release is 5.005_02 (although 5.004_04 is still supported).
-The most cutting-edge development release is 5.005_54. Further references
+production release is 5.005_03 (although 5.004_05 is still supported).
+The most cutting-edge development release is 5.005_57. Further references
to the Perl language in this document refer to the production release
-unless otherwise specified. There may be one or more official bug
-fixes for 5.005_02 by the time you read this, and also perhaps some
-experimental versions on the way to the next release. All releases
-prior to 5.004 were subject to buffer overruns, a grave security issue.
+unless otherwise specified. There may be one or more official bug fixes
+by the time you read this, and also perhaps some experimental versions
+on the way to the next release. All releases prior to 5.004 were subject
+to buffer overruns, a grave security issue.
=head2 What are perl4 and perl5?
@@ -96,7 +96,7 @@ found in release 5. Written in nominally portable C++, Topaz hopes to
maintain 100% source-compatibility with previous releases of Perl but to
run significantly faster and smaller. The Topaz team hopes to provide
an XS compatibility interface to allow most XS modules to work unchanged,
-albeit perhaps without the efficiency that the new interface uowld allow.
+albeit perhaps without the efficiency that the new interface would allow.
New features in Topaz are as yet undetermined, and will be addressed
once compatibility and performance goals are met.
@@ -125,8 +125,8 @@ and the rare new keyword).
No, Perl is easy to start learning -- and easy to keep learning. It looks
like most programming languages you're likely to have experience
-with, so if you've ever written an C program, an awk script, a shell
-script, or even BASIC program, you're already part way there.
+with, so if you've ever written a C program, an awk script, a shell
+script, or even a BASIC program, you're already part way there.
Most tasks only require a small subset of the Perl language. One of
the guiding mottos for Perl development is "there's more than one way
@@ -213,8 +213,8 @@ signify the language proper and "perl" the implementation of it,
i.e. the current interpreter. Hence Tom's quip that "Nothing but perl
can parse Perl." You may or may not choose to follow this usage. For
example, parallelism means "awk and perl" and "Python and Perl" look
-ok, while "awk and Perl" and "Python and perl" do not. But never
-write "PERL", because perl isn't really an acronym, aprocryphal
+OK, while "awk and Perl" and "Python and perl" do not. But never
+write "PERL", because perl isn't really an acronym, apocryphal
folklore and post-facto expansions notwithstanding.
=head2 Is it a Perl program or a Perl script?
@@ -223,7 +223,7 @@ Larry doesn't really care. He says (half in jest) that "a script is
what you give the actors. A program is what you give the audience."
Originally, a script was a canned sequence of normally interactive
-commands, that is, a chat script. Something like a uucp or ppp chat
+commands, that is, a chat script. Something like a UUCP or PPP chat
script or an expect script fits the bill nicely, as do configuration
scripts run by a program at its start up, such F<.cshrc> or F<.ircrc>,
for example. Chat scripts were just drivers for existing programs,
@@ -247,7 +247,7 @@ a definitive answer here.
Now that "script" and "scripting" are terms that have been seized by
unscrupulous or unknowing marketeers for their own nefarious purposes,
they have begun to take on strange and often pejorative meanings,
-like "non serious" or "not real programming". Consequently, some perl
+like "non serious" or "not real programming". Consequently, some Perl
programmers prefer to avoid them altogether.
=head2 What is a JAPH?
@@ -269,7 +269,7 @@ Newer examples can be found by perusing Larry's postings:
=head2 How can I convince my sysadmin/supervisor/employees to use version (5/5.005/Perl instead of some other language)?
If your manager or employees are wary of unsupported software, or
-software which doesn't officially ship with your Operating System, you
+software which doesn't officially ship with your operating system, you
might try to appeal to their self-interest. If programmers can be
more productive using and utilizing Perl constructs, functionality,
simplicity, and power, then the typical manager/supervisor/employee
@@ -295,31 +295,30 @@ by the Perl Development Team. Another big sell for Perl5 is the large
number of modules and extensions which greatly reduce development time
for any given task. Also mention that the difference between version
4 and version 5 of Perl is like the difference between awk and C++.
-(Well, ok, maybe not quite that distinct, but you get the idea.) If you
+(Well, OK, maybe not quite that distinct, but you get the idea.) If you
want support and a reasonable guarantee that what you're developing
will continue to work in the future, then you have to run the supported
version. That probably means running the 5.005 release, although 5.004
isn't that bad. Several important bugs were fixed from the 5.000 through
5.003 versions, though, so try upgrading past them if possible.
-Of particular note is the massive bughunt for buffer overflow
+Of particular note is the massive bug hunt for buffer overflow
problems that went into the 5.004 release. All releases prior to
that, including perl4, are considered insecure and should be upgraded
as soon as possible.
=head1 AUTHOR AND COPYRIGHT
-Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997, 1998, 1999 Tom Christiansen and Nathan Torkington.
All rights reserved.
When included as an integrated part of the Standard Distribution
-of Perl or of its documentation (printed or otherwise), this work is
+of Perl or of its documentation (printed or otherwise), this works is
covered under Perl's Artistic Licence. For separate distributions of
all or part of this FAQ outside of that, see L<perlfaq>.
-Irrespective of its distribution, all code examples here are public
+Irrespective of its distribution, all code examples here are in the public
domain. You are permitted and encouraged to use this code and any
derivatives thereof in your own programs for fun or for profit as you
see fit. A simple comment in the code giving credit to the FAQ would
be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq2.pod b/contrib/perl5/pod/perlfaq2.pod
index 32970af..af9178d 100644
--- a/contrib/perl5/pod/perlfaq2.pod
+++ b/contrib/perl5/pod/perlfaq2.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.30 $, $Date: 1998/12/29 19:43:32 $)
+perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.32 $, $Date: 1999/10/14 18:46:09 $)
=head1 DESCRIPTION
@@ -17,7 +17,7 @@ in standard Internet format (a gzipped archive in POSIX tar format).
Perl builds and runs on a bewildering number of platforms. Virtually
all known and current Unix derivatives are supported (Perl's native
-platform), as are proprietary systems like VMS, DOS, OS/2, Windows,
+platform), as are other systems like VMS, DOS, OS/2, Windows,
QNX, BeOS, and the Amiga. There are also the beginnings of support
for MPE/iX.
@@ -42,12 +42,15 @@ get free compilers for, not for Unix systems.
Some URLs that might help you are:
http://language.perl.com/info/software.html
- http://www.perl.com/latest/
+ http://www.perl.com/pub/language/info/software.html#binary
http://www.perl.com/CPAN/ports/
-If you want information on proprietary systems. A simple installation
-guide for MS-DOS is available at http://www.cs.ruu.nl/~piet/perl5dos.html
-and similarly for Windows 3.1 at http://www.cs.ruu.nl/~piet/perlwin3.html .
+Someone looking for a Perl for Win16 might look to Laszlo Molnar's djgpp
+port in http://www.perl.com/CPAN/ports/msdos/ , which comes with clear
+installation instructions. A simple installation guide for MS-DOS using
+Ilya Zakharevich's OS/2 port is available at
+http://www.cs.ruu.nl/%7Epiet/perl5dos.html
+and similarly for Windows 3.1 at http://www.cs.ruu.nl/%7Epiet/perlwin3.html .
=head2 I don't have a C compiler on my system. How can I compile perl?
@@ -72,7 +75,7 @@ the hard-coded @INC which perl is looking for.
If this command lists any paths which don't exist on your system, then you
may need to move the appropriate libraries to these locations, or create
-symlinks, aliases, or shortcuts appropriately. @INC is also printed as
+symbolic links, aliases, or shortcuts appropriately. @INC is also printed as
part of the output of
% perl -V
@@ -109,7 +112,7 @@ ftp://ftp.funet.fi/pub/languages/perl/CPAN/misc/japh .
Considering that there are hundreds of existing modules in the
archive, one probably exists to do nearly anything you can think of.
-Current categories under CPAN/modules/by-category/ include perl core
+Current categories under CPAN/modules/by-category/ include Perl core
modules; development support; operating system interfaces; networking,
devices, and interprocess communication; data type utilities; database
interfaces; user interfaces; interfaces to other languages; filenames,
@@ -125,13 +128,13 @@ Certainly not. Larry expects that he'll be certified before Perl is.
=head2 Where can I get information on Perl?
-The complete Perl documentation is available with the perl distribution.
-If you have perl installed locally, you probably have the documentation
+The complete Perl documentation is available with the Perl distribution.
+If you have Perl installed locally, you probably have the documentation
installed as well: type C<man perl> if you're on a system resembling Unix.
This will lead you to other important man pages, including how to set your
$MANPATH. If you're not on a Unix system, access to the documentation
will be different; for example, it might be only in HTML format. But all
-proper perl installations have fully-accessible documentation.
+proper Perl installations have fully-accessible documentation.
You might also try C<perldoc perl> in case your system doesn't
have a proper man command, or it's been misinstalled. If that doesn't
@@ -155,7 +158,7 @@ assistance:
http://language.perl.com/info/documentation.html
http://reference.perl.com/query.cgi?tutorials
-=head2 What are the Perl newsgroups on USENET? Where do I post questions?
+=head2 What are the Perl newsgroups on Usenet? Where do I post questions?
The now defunct comp.lang.perl newsgroup has been superseded by the
following groups:
@@ -168,7 +171,7 @@ following groups:
comp.infosystems.www.authoring.cgi Writing CGI scripts for the Web.
-There is also USENET gateway to the mailing list used by the crack
+There is also Usenet gateway to the mailing list used by the crack
Perl development team (perl5-porters) at
news://news.perl.com/perl.porters-gw/ .
@@ -180,14 +183,15 @@ to alt.sources, please make sure it follows their posting standards,
including setting the Followup-To header line to NOT include alt.sources;
see their FAQ (http://www.faqs.org/faqs/alt-sources-intro/) for details.
-If you're just looking for software, first use Alta Vista, Deja News, and
+If you're just looking for software, first use AltaVista
+(http://www.altavista.com), Deja (http://www.deja.com), and
search CPAN. This is faster and more productive than just posting
a request.
=head2 Perl Books
A number of books on Perl and/or CGI programming are available. A few of
-these are good, some are ok, but many aren't worth your money. Tom
+these are good, some are OK, but many aren't worth your money. Tom
Christiansen maintains a list of these books, some with extensive
reviews, at http://www.perl.com/perl/critiques/index.html.
@@ -252,10 +256,13 @@ a star may be ordered from O'Reilly.
by Larry Wall, Tom Christiansen, and Randal L. Schwartz
*Perl 5 Desktop Reference
- By Johan Vromans
+ by Johan Vromans
+
+ *Perl in a Nutshell
+ by Ellen Siever, Stephan Spainhour, and Nathan Patwardhan
=item Tutorials
-
+
*Learning Perl [2nd edition]
by Randal L. Schwartz and Tom Christiansen
with foreword by Larry Wall
@@ -296,6 +303,9 @@ a star may be ordered from O'Reilly.
How to Set up and Maintain a World Wide Web Site [2nd edition]
by Lincoln Stein
+ *Learning Perl/Tk
+ by Nancy Walsh
+
=back
=head2 Perl in Magazines
@@ -320,38 +330,34 @@ http://www.stonehenge.com/merlyn/WebTechniques/.
To get the best (and possibly cheapest) performance, pick a site from
the list below and use it to grab the complete list of mirror sites.
->From there you can find the quickest site for you. Remember, the
+From there you can find the quickest site for you. Remember, the
following list is I<not> the complete list of CPAN mirrors.
http://www.perl.com/CPAN-local
http://www.perl.com/CPAN (redirects to an ftp mirror)
- http://www.perl.org/CPAN
+ ftp://cpan.valueclick.com/pub/CPAN/
ftp://ftp.funet.fi/pub/languages/perl/CPAN/
http://www.cs.ruu.nl/pub/PERL/CPAN/
ftp://ftp.cs.colorado.edu/pub/perl/CPAN/
-=head2 What mailing lists are there for perl?
+=head2 What mailing lists are there for Perl?
-Most of the major modules (tk, CGI, libwww-perl) have their own
+Most of the major modules (Tk, CGI, libwww-perl) have their own
mailing lists. Consult the documentation that came with the module for
-subscription information. The Perl Institute attempts to maintain a
+subscription information. The Perl Mongers attempt to maintain a
list of mailing lists at:
- http://www.perl.org/maillist.html
+ http://www.perl.org/support/online_support.html#mail
=head2 Archives of comp.lang.perl.misc
-Have you tried Deja News or Alta Vista? Those are the
+Have you tried Deja or AltaVista? Those are the
best archives. Just look up "*perl*" as a newsgroup.
- http://www.dejanews.com/dnquery.xp?QRY=&DBS=2&ST=PS&defaultOp=AND&LNG=ALL&format=terse&showsort=date&maxhits=25&subjects=&groups=*perl*&authors=&fromdate=&todate=
+ http://www.deja.com/dnquery.xp?QRY=&DBS=2&ST=PS&defaultOp=AND&LNG=ALL&format=terse&showsort=date&maxhits=25&subjects=&groups=*perl*&authors=&fromdate=&todate=
You'll probably want to trim that down a bit, though.
-ftp.cis.ufl.edu:/pub/perl/comp.lang.perl.*/monthly has an almost
-complete collection dating back to 12/89 (missing 08/91 through
-12/93). They are kept as one large file for each month.
-
You'll probably want more a sophisticated query and retrieval mechanism
than a file listing, preferably one that allows you to retrieve
articles using a fast-access indices, keyed on at least author, date,
@@ -364,7 +370,7 @@ let perlfaq-suggestions@perl.com know.
=head2 Where can I buy a commercial version of Perl?
-In a real sense, Perl already I<is> commercial software: It has a licence
+In a real sense, Perl already I<is> commercial software: It has a license
that you can grab and carefully read to your manager. It is distributed
in releases and comes in well-defined packages. There is a very large
user community and an extensive literature. The comp.lang.perl.*
@@ -377,45 +383,42 @@ better for everyone.
However, these answers may not suffice for managers who require a
purchase order from a company whom they can sue should anything go awry.
Or maybe they need very serious hand-holding and contractual obligations.
-Shrink-wrapped CDs with perl on them are available from several sources if
-that will help. For example, many perl books carry a perl distribution
-on them, as do the O'Reily Perl Resource Kits (in both the Unix flavor
+Shrink-wrapped CDs with Perl on them are available from several sources if
+that will help. For example, many Perl books carry a Perl distribution
+on them, as do the O'Reilly Perl Resource Kits (in both the Unix flavor
and in the proprietary Microsoft flavor); the free Unix distributions
also all come with Perl.
-Or you can purchase a real support contract. Although Cygnus historically
-provided this service, they no longer sell support contracts for Perl.
-Instead, the Paul Ingram Group will be taking up the slack through The
-Perl Clinic. The following is a commercial from them:
-
-"Do you need professional support for Perl and/or Oraperl? Do you need
-a support contract with defined levels of service? Do you want to pay
-only for what you need?
-
-"The Paul Ingram Group has provided quality software development and
-support services to some of the world's largest corporations for ten
-years. We are now offering the same quality support services for Perl
-at The Perl Clinic. This service is led by Tim Bunce, an active perl
-porter since 1994 and well known as the author and maintainer of the
-DBI, DBD::Oracle, and Oraperl modules and author/co-maintainer of The
-Perl 5 Module List. We also offer Oracle users support for Perl5
-Oraperl and related modules (which Oracle is planning to ship as part
-of Oracle Web Server 3). 20% of the profit from our Perl support work
-will be donated to The Perl Institute."
-
-For more information, contact The Perl Clinic:
-
- Tel: +44 1483 424424
- Fax: +44 1483 419419
- Web: http://www.perl.co.uk/
- Email: perl-support-info@perl.co.uk or Tim.Bunce@ig.co.uk
+Or you can purchase commercial incidence based support through the Perl
+Clinic. The following is a commercial from them:
+
+"The Perl Clinic is a commercial Perl support service operated by
+ActiveState Tool Corp. and The Ingram Group. The operators have many
+years of in-depth experience with Perl applications and Perl internals
+on a wide range of platforms.
+
+"Through our group of highly experienced and well-trained support engineers,
+we will put our best effort into understanding your problem, providing an
+explanation of the situation, and a recommendation on how to proceed."
+
+Contact The Perl Clinic at:
+
+ www.PerlClinic.com
+
+ North America Pacific Standard Time (GMT-8)
+ Tel: 1 604 606-4611 hours 8am-6pm
+ Fax: 1 604 606-4640
+
+ Europe (GMT)
+ Tel: 00 44 1483 862814
+ Fax: 00 44 1483 862801
See also www.perl.com for updates on tutorials, training, and support.
=head2 Where do I send bug reports?
If you are reporting a bug in the perl interpreter or the modules
-shipped with perl, use the I<perlbug> program in the perl distribution or
+shipped with Perl, use the I<perlbug> program in the Perl distribution or
mail your report to perlbug@perl.com .
If you are posting a bug with a non-standard port (see the answer to
@@ -426,13 +429,13 @@ bugs.
Read the perlbug(1) man page (perl5.004 or later) for more information.
-=head2 What is perl.com?
+=head2 What is perl.com? Perl Mongers? pm.org? perl.org?
The perl.com domain is owned by Tom Christiansen, who created it as a
public service long before perl.org came about. Despite the name, it's a
pretty non-commercial site meant to be a clearinghouse for information
about all things Perlian, accepting no paid advertisements, bouncy
-happy gifs, or silly java applets on its pages. The Perl Home Page at
+happy GIFs, or silly Java applets on its pages. The Perl Home Page at
http://www.perl.com/ is currently hosted on a T3 line courtesy of Songline
Systems, a software-oriented subsidiary of O'Reilly and Associates.
Other starting points include
@@ -441,19 +444,36 @@ Other starting points include
http://conference.perl.com/
http://reference.perl.com/
+Perl Mongers is an advocacy organization for the Perl language. For
+details, see the Perl Mongers web site at http://www.perlmongers.org/.
+
+Perl Mongers uses the pm.org domain for services related to Perl user
+groups. See the Perl user group web site at http://www.pm.org/ for more
+information about joining, starting, or requesting services for a Perl
+user group.
+
+Perl Mongers also maintains the perl.org domain to provide general
+support services to the Perl community, including the hosting of mailing
+lists, web sites, and other services. The web site
+http://www.perl.org/ is a general advocacy site for the Perl language,
+and there are many other sub-domains for special topics, such as
+
+ http://history.perl.org/
+ http://bugs.perl.org/
+ http://www.news.perl.org/
+
=head1 AUTHOR AND COPYRIGHT
Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
All rights reserved.
When included as an integrated part of the Standard Distribution
-of Perl or of its documentation (printed or otherwise), this work is
-covered under Perl's Artistic Licence. For separate distributions of
+of Perl or of its documentation (printed or otherwise), this works is
+covered under Perl's Artistic License. For separate distributions of
all or part of this FAQ outside of that, see L<perlfaq>.
-Irrespective of its distribution, all code examples here are public
+Irrespective of its distribution, all code examples here are in the public
domain. You are permitted and encouraged to use this code and any
derivatives thereof in your own programs for fun or for profit as you
see fit. A simple comment in the code giving credit to the FAQ would
be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq3.pod b/contrib/perl5/pod/perlfaq3.pod
index a811c3c..b05b736 100644
--- a/contrib/perl5/pod/perlfaq3.pod
+++ b/contrib/perl5/pod/perlfaq3.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq3 - Programming Tools ($Revision: 1.33 $, $Date: 1998/12/29 20:12:12 $)
+perlfaq3 - Programming Tools ($Revision: 1.38 $, $Date: 1999/05/23 16:08:30 $)
=head1 DESCRIPTION
@@ -19,13 +19,13 @@ Have you read the appropriate man pages? Here's a brief index:
Objects perlref, perlmod, perlobj, perltie
Data Structures perlref, perllol, perldsc
Modules perlmod, perlmodlib, perlsub
- Regexps perlre, perlfunc, perlop, perllocale
+ Regexes perlre, perlfunc, perlop, perllocale
Moving to perl5 perltrap, perl
Linking w/C perlxstut, perlxs, perlcall, perlguts, perlembed
Various http://www.perl.com/CPAN/doc/FMTEYEWTK/index.html
(not a man-page but still useful)
-L<perltoc> provides a crude table of contents for the perl man page set.
+A crude table of contents for the Perl man page set is found in L<perltoc>.
=head2 How can I use Perl interactively?
@@ -41,19 +41,20 @@ operations typically found in symbolic debuggers.
=head2 Is there a Perl shell?
-In general, no. The Shell.pm module (distributed with perl) makes
-perl try commands which aren't part of the Perl language as shell
+In general, no. The Shell.pm module (distributed with Perl) makes
+Perl try commands which aren't part of the Perl language as shell
commands. perlsh from the source distribution is simplistic and
uninteresting, but may still be what you want.
=head2 How do I debug my Perl programs?
-Have you used C<-w>? It enables warnings for dubious practices.
+Have you tried C<use warnings> or used C<-w>? They enable warnings
+for dubious practices.
Have you tried C<use strict>? It prevents you from using symbolic
references, makes you predeclare any subroutines that you call as bare
words, and (probably most importantly) forces you to predeclare your
-variables with C<my> or C<use vars>.
+variables with C<my> or C<our> or C<use vars>.
Did you check the returns of each and every system call? The operating
system (and thus Perl) tells you whether they worked or not, and if not
@@ -130,7 +131,7 @@ can provide significant assistance. Tom swears by the following
settings in vi and its clones:
set ai sw=4
- map ^O {^M}^[O^T
+ map! ^O {^M}^[O^T
Now put that in your F<.exrc> file (replacing the caret characters
with control characters) and away you go. In insert mode, ^T is
@@ -144,34 +145,45 @@ to a laser printer, you can take a stab at this using
http://www.perl.com/CPAN/doc/misc/tips/working.vgrind.entry, but the
results are not particularly satisfying for sophisticated code.
-The a2ps at http://www.infres.enst.fr/~demaille/a2ps/ does lots of things
+The a2ps at http://www.infres.enst.fr/%7Edemaille/a2ps/ does lots of things
related to generating nicely printed output of documents.
-=head2 Is there a etags/ctags for perl?
+=head2 Is there a ctags for Perl?
-With respect to the source code for the Perl interpreter, yes.
-There has been support for etags in the source for a long time.
-Ctags was introduced in v5.005_54 (and probably 5.005_03).
-After building perl, type 'make etags' or 'make ctags' and both
-sets of tag files will be built.
-
-Now, if you're looking to build a tag file for perl code, then there's
-a simple one at
+There's a simple one at
http://www.perl.com/CPAN/authors/id/TOMC/scripts/ptags.gz which may do
the trick. And if not, it's easy to hack into what you want.
=head2 Is there an IDE or Windows Perl Editor?
-If you're on Unix, you already have an IDE -- Unix itself.
-You just have to learn the toolbox. If you're not, then you
-probably don't have a toolbox, so may need something else.
-
-PerlBuilder (XXX URL to follow) is an integrated development
-environment for Windows that supports Perl development. Perl programs
-are just plain text, though, so you could download emacs for Windows
-(XXX) or vim for win32 (http://www.cs.vu.nl/~tmgil/vi.html). If
-you're transferring Windows files to Unix, be sure to transfer in
-ASCII mode so the ends of lines are appropriately converted.
+If you're on Unix, you already have an IDE -- Unix itself. This powerful
+IDE derives from its interoperability, flexibility, and configurability.
+If you really want to get a feel for Unix-qua-IDE, the best thing to do
+is to find some high-powered programmer whose native language is Unix.
+Find someone who has been at this for many years, and just sit back
+and watch them at work. They have created their own IDE, one that
+suits their own tastes and aptitudes. Quietly observe them edit files,
+move them around, compile them, debug them, test them, etc. The entire
+development *is* integrated, like a top-of-the-line German sports car:
+functional, powerful, and elegant. You will be absolutely astonished
+at the speed and ease exhibited by the native speaker of Unix in his
+home territory. The art and skill of a virtuoso can only be seen to be
+believed. That is the path to mastery -- all these cobbled little IDEs
+are expensive toys designed to sell a flashy demo using cheap tricks,
+and being optimized for immediate but shallow understanding rather than
+enduring use, are but a dim palimpsest of real tools.
+
+In short, you just have to learn the toolbox. However, if you're not
+on Unix, then your vendor probably didn't bother to provide you with
+a proper toolbox on the so-called complete system that you forked out
+your hard-earned cash on.
+
+PerlBuilder (XXX URL to follow) is an integrated development environment
+for Windows that supports Perl development. Perl programs are just plain
+text, though, so you could download emacs for Windows (???) or a vi clone
+(vim) which runs on for win32 (http://www.cs.vu.nl/%7Etmgil/vi.html).
+If you're transferring Windows files to Unix, be sure to transfer in
+ASCII mode so the ends of lines are appropriately mangled.
=head2 Where can I get Perl macros for vi?
@@ -184,15 +196,15 @@ with an embedded Perl interpreter -- see http://www.perl.com/CPAN/src/misc.
=head2 Where can I get perl-mode for emacs?
Since Emacs version 19 patchlevel 22 or so, there have been both a
-perl-mode.el and support for the perl debugger built in. These should
+perl-mode.el and support for the Perl debugger built in. These should
come with the standard Emacs 19 distribution.
-In the perl source directory, you'll find a directory called "emacs",
+In the Perl source directory, you'll find a directory called "emacs",
which contains a cperl-mode that color-codes keywords, provides
context-sensitive help, and other nifty things.
Note that the perl-mode of emacs will have fits with C<"main'foo">
-(single quote), and mess up the indentation and hilighting. You
+(single quote), and mess up the indentation and highlighting. You
are probably using C<"main::foo"> in new Perl code anyway, so this
shouldn't be an issue.
@@ -212,11 +224,11 @@ to the Athena Widget set. Both are available from CPAN. See the
directory http://www.perl.com/CPAN/modules/by-category/08_User_Interfaces/
Invaluable for Perl/Tk programming are: the Perl/Tk FAQ at
-http://w4.lns.cornell.edu/~pvhp/ptk/ptkTOC.html , the Perl/Tk Reference
+http://w4.lns.cornell.edu/%7Epvhp/ptk/ptkTOC.html , the Perl/Tk Reference
Guide available at
http://www.perl.com/CPAN-local/authors/Stephen_O_Lidie/ , and the
online manpages at
-http://www-users.cs.umn.edu/~amundson/perl/perltk/toc.html .
+http://www-users.cs.umn.edu/%7Eamundson/perl/perltk/toc.html .
=head2 How can I generate simple menus without using CGI or Tk?
@@ -261,9 +273,9 @@ it. See the F<INSTALL> file in the source distribution for more
information.
Unsubstantiated reports allege that Perl interpreters that use sfio
-outperform those that don't (for IO intensive applications). To try
+outperform those that don't (for I/O intensive applications). To try
this, see the F<INSTALL> file in the source distribution, especially
-the ``Selecting File IO mechanisms'' section.
+the ``Selecting File I/O mechanisms'' section.
The undump program was an old attempt to speed up your Perl program
by storing the already-compiled form to disk. This is no longer
@@ -358,21 +370,21 @@ anything a module written in C can. For more on mod_perl, see
http://perl.apache.org/
With the FCGI module (from CPAN) and the mod_fastcgi
-module (available from http://www.fastcgi.com/) each of your perl
-scripts becomes a permanent CGI daemon process.
+module (available from http://www.fastcgi.com/) each of your Perl
+programs becomes a permanent CGI daemon process.
Both of these solutions can have far-reaching effects on your system
-and on the way you write your CGI scripts, so investigate them with
+and on the way you write your CGI programs, so investigate them with
care.
See http://www.perl.com/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/ .
A non-free, commercial product, ``The Velocity Engine for Perl'',
-(http://www.binevolve.com/ or
+(http://www.binevolve.com/ or http://www.binevolve.com/velocigen/) might
also be worth looking at. It will allow you to increase the performance
-of your perl scripts, upto 25 times faster than normal CGI perl by
-running in persistent perl mode, or 4 to 5 times faster without any
-modification to your existing CGI scripts. Fully functional evaluation
+of your Perl programs, up to 25 times faster than normal CGI Perl by
+running in persistent Perl mode, or 4 to 5 times faster without any
+modification to your existing CGI programs. Fully functional evaluation
copies are available from the web site.
=head2 How can I hide the source for my Perl program?
@@ -404,12 +416,12 @@ your code, but none can definitively conceal it (this is true of every
language, not just Perl).
If you're concerned about people profiting from your code, then the
-bottom line is that nothing but a restrictive licence will give you
+bottom line is that nothing but a restrictive license will give you
legal security. License your software and pepper it with threatening
statements like ``This is unpublished proprietary software of XYZ Corp.
Your access to it does not give you permission to use it blah blah
blah.'' We are not lawyers, of course, so you should see a lawyer if
-you want to be sure your licence's wording will stand up in court.
+you want to be sure your license's wording will stand up in court.
=head2 How can I compile my Perl program into byte code or C?
@@ -434,8 +446,8 @@ just as big as the original perl executable, and then some. That's
because as currently written, all programs are prepared for a full
eval() statement. You can tremendously reduce this cost by building a
shared I<libperl.so> library and linking against that. See the
-F<INSTALL> podfile in the perl source distribution for details. If
-you link your main perl binary with this, it will make it miniscule.
+F<INSTALL> podfile in the Perl source distribution for details. If
+you link your main perl binary with this, it will make it minuscule.
For example, on one author's system, F</usr/bin/perl> is only 11k in
size!
@@ -454,7 +466,7 @@ Perl install anyway.
You can't. Not yet, anyway. You can integrate Java and Perl with the
Perl Resource Kit from O'Reilly and Associates. See
http://www.oreilly.com/catalog/prkunix/ for more information.
-The Java interface will be supported in the core 5.006 release
+The Java interface will be supported in the core 5.6 release
of Perl.
=head2 How can I get C<#!perl> to work on [MS-DOS,NT,...]?
@@ -470,23 +482,22 @@ F<INSTALL> file in the source distribution for more information).
The Win95/NT installation, when using the ActiveState port of Perl,
will modify the Registry to associate the C<.pl> extension with the
-perl interpreter. If you install another port (Gurusamy Sarathy's is
-the recommended Win95/NT port), or (eventually) build your own
-Win95/NT Perl using a Windows port of gcc (e.g., with cygwin32 or
-mingw32), then you'll have to modify the Registry yourself. In
-addition to associating C<.pl> with the interpreter, NT people can
-use: C<SET PATHEXT=%PATHEXT%;.PL> to let them run the program
-C<install-linux.pl> merely by typing C<install-linux>.
+perl interpreter. If you install another port, perhaps even building
+your own Win95/NT Perl from the standard sources by using a Windows port
+of gcc (e.g., with cygwin or mingw32), then you'll have to modify
+the Registry yourself. In addition to associating C<.pl> with the
+interpreter, NT people can use: C<SET PATHEXT=%PATHEXT%;.PL> to let them
+run the program C<install-linux.pl> merely by typing C<install-linux>.
-Macintosh perl scripts will have the appropriate Creator and
-Type, so that double-clicking them will invoke the perl application.
+Macintosh Perl programs will have the appropriate Creator and
+Type, so that double-clicking them will invoke the Perl application.
I<IMPORTANT!>: Whatever you do, PLEASE don't get frustrated, and just
throw the perl interpreter into your cgi-bin directory, in order to
-get your scripts working for a web server. This is an EXTREMELY big
+get your programs working for a web server. This is an EXTREMELY big
security risk. Take the time to figure out how to do it correctly.
-=head2 Can I write useful perl programs on the command line?
+=head2 Can I write useful Perl programs on the command line?
Yes. Read L<perlrun> for more information. Some examples follow.
(These assume standard Unix shell quoting rules.)
@@ -510,9 +521,9 @@ Yes. Read L<perlrun> for more information. Some examples follow.
echo $PATH | perl -nl -072 -e '
s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'
-Ok, the last one was actually an obfuscated perl entry. :-)
+OK, the last one was actually an Obfuscated Perl Contest entry. :-)
-=head2 Why don't perl one-liners work on my DOS/Mac/VMS system?
+=head2 Why don't Perl one-liners work on my DOS/Mac/VMS system?
The problem is usually that the command interpreters on those systems
have rather different ideas about quoting than the Unix shells under
@@ -570,7 +581,7 @@ when it runs fine on the command line'', see these sources:
http://www.boutell.com/faq/
CGI FAQ
- http://www.webthing.com/tutorials/cgifaq.html
+ http://www.webthing.com/tutorials/cgifaq.html
HTTP Spec
http://www.w3.org/pub/WWW/Protocols/HTTP/
@@ -585,11 +596,10 @@ when it runs fine on the command line'', see these sources:
CGI Security FAQ
http://www.go2net.com/people/paulp/cgi-security/safe-cgi.txt
-Also take a look at L<perlfaq9>
=head2 Where can I learn about object-oriented Perl programming?
-L<perltoot> is a good place to start, and you can use L<perlobj> and
+A good place to start is L<perltoot>, and you can use L<perlobj> and
L<perlbot> for reference. Perltoot didn't come out until the 5.004
release, but you can get a copy (in pod, html, or postscript) from
http://www.perl.com/CPAN/doc/FMTEYEWTK/ .
@@ -608,15 +618,15 @@ my C program, what am I doing wrong?
Download the ExtUtils::Embed kit from CPAN and run `make test'. If
the tests pass, read the pods again and again and again. If they
-fail, see L<perlbug> and send a bugreport with the output of
+fail, see L<perlbug> and send a bug report with the output of
C<make test TEST_VERBOSE=1> along with C<perl -V>.
=head2 When I tried to run my script, I got this message. What does it
mean?
-L<perldiag> has a complete list of perl's error messages and warnings,
-with explanatory text. You can also use the splain program (distributed
-with perl) to explain the error messages:
+A complete list of Perl's error messages and warnings with explanatory
+text can be found in L<perldiag>. You can also use the splain program
+(distributed with Perl) to explain the error messages:
perl program 2>diag.out
splain [-v] [-p] diag.out
@@ -631,7 +641,7 @@ or
=head2 What's MakeMaker?
-This module (part of the standard perl distribution) is designed to
+This module (part of the standard Perl distribution) is designed to
write a Makefile for an extension module from a Makefile.PL. For more
information, see L<ExtUtils::MakeMaker>.
@@ -641,13 +651,12 @@ Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
All rights reserved.
When included as an integrated part of the Standard Distribution
-of Perl or of its documentation (printed or otherwise), this work is
-covered under Perl's Artistic Licence. For separate distributions of
+of Perl or of its documentation (printed or otherwise), this works is
+covered under Perl's Artistic License. For separate distributions of
all or part of this FAQ outside of that, see L<perlfaq>.
-Irrespective of its distribution, all code examples here are public
+Irrespective of its distribution, all code examples here are in the public
domain. You are permitted and encouraged to use this code and any
derivatives thereof in your own programs for fun or for profit as you
see fit. A simple comment in the code giving credit to the FAQ would
be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq4.pod b/contrib/perl5/pod/perlfaq4.pod
index 92aee2c..e997a8f 100644
--- a/contrib/perl5/pod/perlfaq4.pod
+++ b/contrib/perl5/pod/perlfaq4.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq4 - Data Manipulation ($Revision: 1.40 $, $Date: 1999/01/08 04:26:39 $)
+perlfaq4 - Data Manipulation ($Revision: 1.49 $, $Date: 1999/05/23 20:37:49 $)
=head1 DESCRIPTION
@@ -31,7 +31,7 @@ representation is converted back to decimal. These decimal numbers
are displayed in either the format you specify with printf(), or the
current output format for numbers (see L<perlvar/"$#"> if you use
print. C<$#> has a different default value in Perl5 than it did in
-Perl4. Changing C<$#> yourself is deprecated.
+Perl4. Changing C<$#> yourself is deprecated.)
This affects B<all> computer languages that represent decimal
floating-point numbers in binary, not just Perl. Perl provides
@@ -67,7 +67,7 @@ route.
printf("%.3f", 3.1415926535); # prints 3.142
-The POSIX module (part of the standard perl distribution) implements
+The POSIX module (part of the standard Perl distribution) implements
ceil(), floor(), and a number of other mathematical and trigonometric
functions.
@@ -76,7 +76,7 @@ functions.
$floor = floor(3.5); # 3
In 5.000 to 5.003 Perls, trigonometry was done in the Math::Complex
-module. With 5.004, the Math::Trig module (part of the standard perl
+module. With 5.004, the Math::Trig module (part of the standard Perl
distribution) implements the trigonometric functions. Internally it
uses the Math::Complex module and some functions can break out from
the real axis into the complex plane, for example the inverse sine of
@@ -104,14 +104,21 @@ are not guaranteed.
=head2 How do I convert bits into ints?
To turn a string of 1s and 0s like C<10110110> into a scalar containing
-its binary value, use the pack() function (documented in
-L<perlfunc/"pack">):
+its binary value, use the pack() and unpack() functions (documented in
+L<perlfunc/"pack"> and L<perlfunc/"unpack">):
- $decimal = pack('B8', '10110110');
+ $decimal = unpack('c', pack('B8', '10110110'));
+
+This packs the string C<10110110> into an eight bit binary structure.
+This is then unpacked as a character, which returns its ordinal value.
+
+This does the same thing:
+
+ $decimal = ord(pack('B8', '10110110'));
Here's an example of going the other way:
- $binary_string = join('', unpack('B*', "\x29"));
+ $binary_string = unpack('B*', "\x29");
=head2 Why doesn't & work the way I want it to?
@@ -176,6 +183,15 @@ ranges. Instead use:
push(@results, some_func($i));
}
+This situation has been fixed in Perl5.005. Use of C<..> in a C<for>
+loop will iterate over the range, without creating the entire range.
+
+ for my $i (5 .. 500_005) {
+ push(@results, some_func($i));
+ }
+
+will not create a list of 500,000 integers.
+
=head2 How can I output Roman numerals?
Get the http://www.perl.com/CPAN/modules/by-module/Roman module.
@@ -228,12 +244,34 @@ American businesses often consider the first week with a Monday
in it to be Work Week #1, despite ISO 8601, which considers
WW1 to be the first week with a Thursday in it.
+=head2 How do I find the current century or millennium?
+
+Use the following simple functions:
+
+ sub get_century {
+ return int((((localtime(shift || time))[5] + 1999))/100);
+ }
+ sub get_millennium {
+ return 1+int((((localtime(shift || time))[5] + 1899))/1000);
+ }
+
+On some systems, you'll find that the POSIX module's strftime() function
+has been extended in a non-standard way to use a C<%C> format, which they
+sometimes claim is the "century". It isn't, because on most such systems,
+this is only the first two digits of the four-digit year, and thus cannot
+be used to reliably determine the current century or millennium.
+
=head2 How can I compare two dates and find the difference?
If you're storing your dates as epoch seconds then simply subtract one
from the other. If you've got a structured date (distinct year, day,
-month, hour, minute, seconds values) then use one of the Date::Manip
-and Date::Calc modules from CPAN.
+month, hour, minute, seconds values), then for reasons of accessibility,
+simplicity, and efficiency, merely use either timelocal or timegm (from
+the Time::Local module in the standard distribution) to reduce structured
+dates to epoch seconds. However, if you don't know the precise format of
+your dates, then you should probably use either of the Date::Manip and
+Date::Calc modules from CPAN before you go hacking up your own parsing
+routine to handle arbitrary date formats.
=head2 How can I take a string and turn it into epoch seconds?
@@ -244,23 +282,81 @@ and Date::Manip modules from CPAN.
=head2 How can I find the Julian Day?
-Neither Date::Manip nor Date::Calc deal with Julian days. Instead,
-there is an example of Julian date calculation that should help you in
-Time::JulianDay (part of the Time-modules bundle) which can be found at
-http://www.perl.com/CPAN/modules/by-module/Time/.
-
+Use the Time::JulianDay module (part of the Time-modules bundle
+available from CPAN.)
+
+Before you immerse yourself too deeply in this, be sure to verify that it
+is the I<Julian> Day you really want. Are they really just interested in
+a way of getting serial days so that they can do date arithmetic? If you
+are interested in performing date arithmetic, this can be done using
+either Date::Manip or Date::Calc, without converting to Julian Day first.
+
+There is too much confusion on this issue to cover in this FAQ, but the
+term is applied (correctly) to a calendar now supplanted by the Gregorian
+Calendar, with the Julian Calendar failing to adjust properly for leap
+years on centennial years (among other annoyances). The term is also used
+(incorrectly) to mean: [1] days in the Gregorian Calendar; and [2] days
+since a particular starting time or `epoch', usually 1970 in the Unix
+world and 1980 in the MS-DOS/Windows world. If you find that it is not
+the first meaning that you really want, then check out the Date::Manip
+and Date::Calc modules. (Thanks to David Cassell for most of this text.)
=head2 How do I find yesterday's date?
The C<time()> function returns the current time in seconds since the
-epoch. Take one day off that:
+epoch. Take twenty-four hours off that:
$yesterday = time() - ( 24 * 60 * 60 );
Then you can pass this to C<localtime()> and get the individual year,
month, day, hour, minute, seconds values.
-=head2 Does Perl have a year 2000 problem? Is Perl Y2K compliant?
+Note very carefully that the code above assumes that your days are
+twenty-four hours each. For most people, there are two days a year
+when they aren't: the switch to and from summer time throws this off.
+A solution to this issue is offered by Russ Allbery.
+
+ sub yesterday {
+ my $now = defined $_[0] ? $_[0] : time;
+ my $then = $now - 60 * 60 * 24;
+ my $ndst = (localtime $now)[8] > 0;
+ my $tdst = (localtime $then)[8] > 0;
+ $then - ($tdst - $ndst) * 60 * 60;
+ }
+ # Should give you "this time yesterday" in seconds since epoch relative to
+ # the first argument or the current time if no argument is given and
+ # suitable for passing to localtime or whatever else you need to do with
+ # it. $ndst is whether we're currently in daylight savings time; $tdst is
+ # whether the point 24 hours ago was in daylight savings time. If $tdst
+ # and $ndst are the same, a boundary wasn't crossed, and the correction
+ # will subtract 0. If $tdst is 1 and $ndst is 0, subtract an hour more
+ # from yesterday's time since we gained an extra hour while going off
+ # daylight savings time. If $tdst is 0 and $ndst is 1, subtract a
+ # negative hour (add an hour) to yesterday's time since we lost an hour.
+ #
+ # All of this is because during those days when one switches off or onto
+ # DST, a "day" isn't 24 hours long; it's either 23 or 25.
+ #
+ # The explicit settings of $ndst and $tdst are necessary because localtime
+ # only says it returns the system tm struct, and the system tm struct at
+ # least on Solaris doesn't guarantee any particular positive value (like,
+ # say, 1) for isdst, just a positive value. And that value can
+ # potentially be negative, if DST information isn't available (this sub
+ # just treats those cases like no DST).
+ #
+ # Note that between 2am and 3am on the day after the time zone switches
+ # off daylight savings time, the exact hour of "yesterday" corresponding
+ # to the current hour is not clearly defined. Note also that if used
+ # between 2am and 3am the day after the change to daylight savings time,
+ # the result will be between 3am and 4am of the previous day; it's
+ # arguable whether this is correct.
+ #
+ # This sub does not attempt to deal with leap seconds (most things don't).
+ #
+ # Copyright relinquished 1999 by Russ Allbery <rra@stanford.edu>
+ # This code is in the public domain
+
+=head2 Does Perl have a Year 2000 problem? Is Perl Y2K compliant?
Short answer: No, Perl does not have a Year 2000 problem. Yes, Perl is
Y2K compliant (whatever that means). The programmers you've hired to
@@ -271,7 +367,7 @@ Perl is just as Y2K compliant as your pencil--no more, and no less.
Can you use your pencil to write a non-Y2K-compliant memo? Of course
you can. Is that the pencil's fault? Of course it isn't.
-The date and time functions supplied with perl (gmtime and localtime)
+The date and time functions supplied with Perl (gmtime and localtime)
supply adequate information to determine the year well beyond 2000
(2038 is when trouble strikes for 32-bit machines). The year returned
by these functions when used in an array context is the year minus 1900.
@@ -312,7 +408,11 @@ This won't expand C<"\n"> or C<"\t"> or any other special escapes.
To turn C<"abbcccd"> into C<"abccd">:
- s/(.)\1/$1/g;
+ s/(.)\1/$1/g; # add /s to include newlines
+
+Here's a solution that turns "abbcccd" to "abcd":
+
+ y///cs; # y == tr, but shorter :-)
=head2 How do I expand function calls in a string?
@@ -344,16 +444,14 @@ nested patterns, nor can they. For that you'll have to write a
parser.
If you are serious about writing a parser, there are a number of
-modules or oddities that will make your life a lot easier. There is
-the CPAN module Parse::RecDescent, the standard module Text::Balanced,
-the byacc program, the CPAN module Parse::Yapp, and Mark-Jason
-Dominus's excellent I<py> tool at http://www.plover.com/~mjd/perl/py/
-.
+modules or oddities that will make your life a lot easier. There are
+the CPAN modules Parse::RecDescent, Parse::Yapp, and Text::Balanced;
+and the byacc program.
One simple destructive, inside-out approach that you might try is to
pull out the smallest nesting parts one at a time:
- while (s//BEGIN((?:(?!BEGIN)(?!END).)*)END/gs) {
+ while (s/BEGIN((?:(?!BEGIN)(?!END).)*)END//gs) {
# do something with $1
}
@@ -365,7 +463,7 @@ really does work:
# $_ contains the string to parse
# BEGIN and END are the opening and closing markers for the
# nested text.
-
+
@( = ('(','');
@) = (')','');
($re=$_)=~s/((BEGIN)|(END)|.)/$)[!$3]\Q$1\E$([!$2]/gs;
@@ -385,7 +483,7 @@ You can do it yourself:
1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
-Or you can just use the Text::Tabs module (part of the standard perl
+Or you can just use the Text::Tabs module (part of the standard Perl
distribution).
use Text::Tabs;
@@ -393,7 +491,7 @@ distribution).
=head2 How do I reformat a paragraph?
-Use Text::Wrap (part of the standard perl distribution):
+Use Text::Wrap (part of the standard Perl distribution):
use Text::Wrap;
print wrap("\t", ' ', @paragraphs);
@@ -422,24 +520,25 @@ likely prefer:
You have to keep track of N yourself. For example, let's say you want
to change the fifth occurrence of C<"whoever"> or C<"whomever"> into
-C<"whosoever"> or C<"whomsoever">, case insensitively.
+C<"whosoever"> or C<"whomsoever">, case insensitively. These
+all assume that $_ contains the string to be altered.
$count = 0;
s{((whom?)ever)}{
++$count == 5 # is it the 5th?
? "${2}soever" # yes, swap
: $1 # renege and leave it there
- }igex;
+ }ige;
In the more general case, you can use the C</g> modifier in a C<while>
loop, keeping count of matches.
$WANT = 3;
$count = 0;
+ $_ = "One fish two fish red fish blue fish";
while (/(\w+)\s+fish\b/gi) {
if (++$count == $WANT) {
print "The third fish is a $1 one.\n";
- # Warning: don't `last' out of this loop
}
}
@@ -456,7 +555,7 @@ C<tr///> function like so:
$string = "ThisXlineXhasXsomeXx'sXinXit";
$count = ($string =~ tr/X//);
- print "There are $count X charcters in the string";
+ print "There are $count X characters in the string";
This is fine if you are just looking for a single character. However,
if you are trying to count multiple character substrings within a
@@ -475,8 +574,8 @@ To make the first letter of each word upper case:
$line =~ s/\b(\w)/\U$1/g;
This has the strange effect of turning "C<don't do it>" into "C<Don'T
-Do It>". Sometimes you might want this, instead (Suggested by Brian
-Foy):
+Do It>". Sometimes you might want this, instead (Suggested by brian d.
+foy):
$string =~ s/ (
(^\w) #at the beginning of the line
@@ -499,7 +598,7 @@ characters by placing a C<use locale> pragma in your program.
See L<perllocale> for endless details on locales.
This is sometimes referred to as putting something into "title
-case", but that's not quite accurate. Consdier the proper
+case", but that's not quite accurate. Consider the proper
capitalization of the movie I<Dr. Strangelove or: How I Learned to
Stop Worrying and Love the Bomb>, for example.
@@ -532,7 +631,7 @@ quotation-mark-delimited field, escape them with backslashes (eg,
C<"like \"this\"">. Unescaping them is a task addressed earlier in
this section.
-Alternatively, the Text::ParseWords module (part of the standard perl
+Alternatively, the Text::ParseWords module (part of the standard Perl
distribution) lets you say:
use Text::ParseWords;
@@ -546,8 +645,8 @@ Although the simplest approach would seem to be:
$string =~ s/^\s*(.*?)\s*$/$1/;
-This is unnecessarily slow, destructive, and fails with embedded newlines.
-It is much better faster to do this in two steps:
+Not only is this unnecessarily slow and destructive, it also fails with
+embedded newlines. It is much faster to do this operation in two steps:
$string =~ s/^\s+//;
$string =~ s/\s+$//;
@@ -562,7 +661,7 @@ Or more nicely written as:
This idiom takes advantage of the C<foreach> loop's aliasing
behavior to factor out common code. You can do this
on several strings at once, or arrays, or even the
-values of a hash if you use a slide:
+values of a hash if you use a slice:
# trim whitespace in the scalar, the array,
# and all the values in the hash
@@ -573,41 +672,48 @@ values of a hash if you use a slide:
=head2 How do I pad a string with blanks or pad a number with zeroes?
-(This answer contributed by Uri Guttman)
+(This answer contributed by Uri Guttman, with kibitzing from
+Bart Lateur.)
In the following examples, C<$pad_len> is the length to which you wish
-to pad the string, C<$text> or C<$num> contains the string to be
-padded, and C<$pad_char> contains the padding character. You can use a
-single character string constant instead of the C<$pad_char> variable
-if you know what it is in advance.
+to pad the string, C<$text> or C<$num> contains the string to be padded,
+and C<$pad_char> contains the padding character. You can use a single
+character string constant instead of the C<$pad_char> variable if you
+know what it is in advance. And in the same way you can use an integer in
+place of C<$pad_len> if you know the pad length in advance.
-The simplest method use the C<sprintf> function. It can pad on the
-left or right with blanks and on the left with zeroes.
+The simplest method uses the C<sprintf> function. It can pad on the left
+or right with blanks and on the left with zeroes and it will not
+truncate the result. The C<pack> function can only pad strings on the
+right with blanks and it will truncate the result to a maximum length of
+C<$pad_len>.
- # Left padding with blank:
- $padded = sprintf( "%${pad_len}s", $text ) ;
+ # Left padding a string with blanks (no truncation):
+ $padded = sprintf("%${pad_len}s", $text);
- # Right padding with blank:
- $padded = sprintf( "%${pad_len}s", $text ) ;
+ # Right padding a string with blanks (no truncation):
+ $padded = sprintf("%-${pad_len}s", $text);
- # Left padding with 0:
- $padded = sprintf( "%0${pad_len}d", $num ) ;
+ # Left padding a number with 0 (no truncation):
+ $padded = sprintf("%0${pad_len}d", $num);
-If you need to pad with a character other than blank or zero you can use
-one of the following methods.
+ # Right padding a string with blanks using pack (will truncate):
+ $padded = pack("A$pad_len",$text);
-These methods generate a pad string with the C<x> operator and
-concatenate that with the original text.
+If you need to pad with a character other than blank or zero you can use
+one of the following methods. They all generate a pad string with the
+C<x> operator and combine that with C<$text>. These methods do
+not truncate C<$text>.
-Left and right padding with any character:
+Left and right padding with any character, creating a new string:
- $padded = $pad_char x ( $pad_len - length( $text ) ) . $text ;
- $padded = $text . $pad_char x ( $pad_len - length( $text ) ) ;
+ $padded = $pad_char x ( $pad_len - length( $text ) ) . $text;
+ $padded = $text . $pad_char x ( $pad_len - length( $text ) );
-Or you can left or right pad $text directly:
+Left and right padding with any character, modifying C<$text> directly:
- $text .= $pad_char x ( $pad_len - length( $text ) ) ;
- substr( $text, 0, 0 ) = $pad_char x ( $pad_len - length( $text ) ) ;
+ substr( $text, 0, 0 ) = $pad_char x ( $pad_len - length( $text ) );
+ $text .= $pad_char x ( $pad_len - length( $text ) );
=head2 How do I extract selected columns from a string?
@@ -633,7 +739,14 @@ you can use this kind of thing:
=head2 How do I find the soundex value of a string?
-Use the standard Text::Soundex module distributed with perl.
+Use the standard Text::Soundex module distributed with Perl.
+But before you do so, you may want to determine whether `soundex' is in
+fact what you think it is. Knuth's soundex algorithm compresses words
+into a small space, and so it does not necessarily distinguish between
+two words which you might want to appear separately. For example, the
+last names `Knuth' and `Kant' are both mapped to the soundex code K530.
+If Text::Soundex does not do what you are looking for, you might want
+to consider the String::Approx module available at CPAN.
=head2 How can I expand variables in text strings?
@@ -706,7 +819,7 @@ Stringification also destroys arrays.
print "@lines"; # WRONG - extra blanks
print @lines; # right
-=head2 Why don't my E<lt>E<lt>HERE documents work?
+=head2 Why don't my <<HERE documents work?
Check for these three things:
@@ -767,7 +880,7 @@ This works with leading special strings, dynamically determined:
@@@ runops() {
@@@ SAVEI32(runlevel);
@@@ runlevel++;
- @@@ while ( op = (*op->op_ppaddr)() ) ;
+ @@@ while ( op = (*op->op_ppaddr)() );
@@@ TAINT_NOT;
@@@ return 0;
@@@ }
@@ -805,9 +918,9 @@ When you say
$scalar = (2, 5, 7, 9);
-you're using the comma operator in scalar context, so it evaluates the
-left hand side, then evaluates and returns the left hand side. This
-causes the last value to be returned: 9.
+you're using the comma operator in scalar context, so it uses the scalar
+comma operator. There never was a list there at all! This causes the
+last value to be returned: 9.
=head2 What is the difference between $array[1] and @array[1]?
@@ -825,9 +938,10 @@ with
@bad[0] = `same program that outputs several lines`;
-The B<-w> flag will warn you about these matters.
+The C<use warnings> pragma and the B<-w> flag will warn you about these
+matters.
-=head2 How can I extract just the unique elements of an array?
+=head2 How can I remove duplicate elements from a list or array?
There are several possible ways, depending on whether the array is
ordered and whether you wish to preserve the ordering.
@@ -843,7 +957,7 @@ ordered and whether you wish to preserve the ordering.
This is nice in that it doesn't use much extra memory, simulating
uniq(1)'s behavior of removing only adjacent duplicates. It's less
nice in that it won't work with false values like undef, 0, or "";
-"0 but true" is ok, though.
+"0 but true" is OK, though.
=item b) If you don't know whether @in is sorted:
@@ -864,7 +978,7 @@ nice in that it won't work with false values like undef, 0, or "";
undef @ary;
@ary[@in] = @in;
- @out = @ary;
+ @out = grep {defined} @ary;
=back
@@ -893,7 +1007,8 @@ array. This kind of an array will take up less space:
@primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31);
undef @is_tiny_prime;
- for (@primes) { $is_tiny_prime[$_] = 1; }
+ for (@primes) { $is_tiny_prime[$_] = 1 }
+ # or simply @istiny_prime[@primes] = (1) x @primes;
Now you check whether $is_tiny_prime[$some_number].
@@ -916,7 +1031,7 @@ or worse yet
These are slow (checks every element even if the first matches),
inefficient (same reason), and potentially buggy (what if there are
-regexp characters in $whatever?). If you're only testing once, then
+regex characters in $whatever?). If you're only testing once, then
use:
$is_there = 0;
@@ -941,6 +1056,9 @@ each element is unique in a given array:
push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
}
+Note that this is the I<symmetric difference>, that is, all elements in
+either A or in B, but not in both. Think of it as an xor operation.
+
=head2 How do I test whether two arrays or hashes are equal?
The following code works for single-level arrays. It uses a stringwise
@@ -951,7 +1069,7 @@ strings. Modify if you have other needs.
sub compare_arrays {
my ($first, $second) = @_;
- local $^W = 0; # silence spurious -w undef complaints
+ no warnings; # silence spurious -w undef complaints
return 0 unless @$first == @$second;
for (my $i = 0; $i < @$first; $i++) {
return 0 if $first->[$i] ne $second->[$i];
@@ -1008,7 +1126,7 @@ Now C<$found_index> has what you want.
In general, you usually don't need a linked list in Perl, since with
regular arrays, you can push and pop or shift and unshift at either end,
or you can use splice to add and/or remove arbitrary number of elements at
-arbitrary points. Both pop and shift are both O(1) operations on perl's
+arbitrary points. Both pop and shift are both O(1) operations on Perl's
dynamic arrays. In the absence of shifts and pops, push in general
needs to reallocate on the order every log(N) times, and unshift will
need to copy pointers each time.
@@ -1078,7 +1196,7 @@ Use this:
fisher_yates_shuffle( \@array ); # permutes @array in place
-You've probably seen shuffling algorithms that works using splice,
+You've probably seen shuffling algorithms that work using splice,
randomly picking another element to swap the current element with:
srand;
@@ -1163,7 +1281,7 @@ Supply a comparison function to sort() (described in L<perlfunc/sort>):
@list = sort { $a <=> $b } @list;
The default sort function is cmp, string comparison, which would
-sort C<(1, 2, 10)> into C<(1, 10, 2)>. C<E<lt>=E<gt>>, used above, is
+sort C<(1, 2, 10)> into C<(1, 10, 2)>. C<< <=> >>, used above, is
the numerical comparison operator.
If you have a complicated function needed to pull out the part you
@@ -1185,7 +1303,7 @@ that's come to be known as the Schwartzian Transform:
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
- map { [ $_, uc((/\d+\s*(\S+)/ )[0] ] } @data;
+ map { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @data;
If you need to sort on several fields, the following paradigm is useful.
@@ -1311,7 +1429,19 @@ sorting the keys as shown in an earlier question.
=head2 What happens if I add or remove keys from a hash while iterating over it?
-Don't do that.
+Don't do that. :-)
+
+[lwall] In Perl 4, you were not allowed to modify a hash at all while
+iterating over it. In Perl 5 you can delete from it, but you still
+can't add to it, because that might cause a doubling of the hash table,
+in which half the entries get copied up to the new top half of the
+table, at which point you've totally bamboozled the iterator code.
+Even if the table doesn't double, there's no telling whether your new
+entry will be inserted before or after the current iterator position.
+
+Either treasure up your changes and make them after the iterator finishes,
+or use keys to fetch all the old keys at once, and iterate over the list
+of keys.
=head2 How do I look up a hash element by value?
@@ -1327,8 +1457,13 @@ to use:
$by_value{$value} = $key;
}
-If your hash could have repeated values, the methods above will only
-find one of the associated keys. This may or may not worry you.
+If your hash could have repeated values, the methods above will only find
+one of the associated keys. This may or may not worry you. If it does
+worry you, you can always reverse the hash into a hash of arrays instead:
+
+ while (($key, $value) = each %by_key) {
+ push @{$key_list_by_value{$value}}, $key;
+ }
=head2 How can I know how many entries are in a hash?
@@ -1337,8 +1472,9 @@ take the scalar sense of the keys() function:
$num_keys = scalar keys %hash;
-In void context it just resets the iterator, which is faster
-for tied hashes.
+In void context, the keys() function just resets the iterator, which is
+faster for tied hashes than would be iterating through the whole
+hash, one key-value pair at a time.
=head2 How do I sort a hash (optionally by value instead of key)?
@@ -1396,7 +1532,7 @@ And these conditions hold
$ary{'d'} is false
defined $ary{'d'} is true
defined $ary{'a'} is true
- exists $ary{'a'} is true (perl5 only)
+ exists $ary{'a'} is true (Perl5 only)
grep ($_ eq 'a', keys %ary) is true
If you now say
@@ -1420,7 +1556,7 @@ and these conditions now hold; changes in caps:
$ary{'d'} is false
defined $ary{'d'} is true
defined $ary{'a'} is FALSE
- exists $ary{'a'} is true (perl5 only)
+ exists $ary{'a'} is true (Perl5 only)
grep ($_ eq 'a', keys %ary) is true
Notice the last two: you have an undef value, but a defined key!
@@ -1444,7 +1580,7 @@ and these conditions now hold; changes in caps:
$ary{'d'} is false
defined $ary{'d'} is true
defined $ary{'a'} is false
- exists $ary{'a'} is FALSE (perl5 only)
+ exists $ary{'a'} is FALSE (Perl5 only)
grep ($_ eq 'a', keys %ary) is FALSE
See, the whole entry is gone!
@@ -1467,8 +1603,8 @@ re-enter it, the hash iterator has been reset.
=head2 How can I get the unique keys from two hashes?
-First you extract the keys from the hashes into arrays, and then solve
-the uniquifying the array problem described above. For example:
+First you extract the keys from the hashes into lists, then solve
+the "removing duplicates" problem described above. For example:
%seen = ();
for $element (keys(%foo), keys(%bar)) {
@@ -1520,7 +1656,7 @@ whether you store something there or not. That's because functions
get scalars passed in by reference. If somefunc() modifies C<$_[0]>,
it has to be ready to write it back into the caller's version.
-This has been fixed as of perl5.004.
+This has been fixed as of Perl5.004.
Normally, merely accessing a key's value for a nonexistent key does
I<not> cause that key to be forever there. This is different than
@@ -1547,7 +1683,7 @@ in L<perltoot>.
=head2 How can I use a reference as a hash key?
You can't do this directly, but you could use the standard Tie::Refhash
-module distributed with perl.
+module distributed with Perl.
=head1 Data: Misc
@@ -1560,9 +1696,11 @@ this works fine (assuming the files are found):
print "Your kernel is GNU-zip enabled!\n";
}
-On some legacy systems, however, you have to play tedious games with
-"text" versus "binary" files. See L<perlfunc/"binmode">, or the upcoming
-L<perlopentut> manpage.
+On less elegant (read: Byzantine) systems, however, you have
+to play tedious games with "text" versus "binary" files. See
+L<perlfunc/"binmode"> or L<perlopentut>. Most of these ancient-thinking
+systems are curses out of Microsoft, who seem to be committed to putting
+the backward into backward compatibility.
If you're concerned about 8-bit ASCII data, then see L<perllocale>.
@@ -1604,13 +1742,12 @@ if you just want to say, ``Is this a float?''
}
}
- sub is_numeric { defined &getnum }
+ sub is_numeric { defined getnum($_[0]) }
-Or you could check out String::Scanf which can be found at
-http://www.perl.com/CPAN/modules/by-module/String/.
-The POSIX module (part of the standard Perl distribution) provides
-the C<strtol> and C<strtod> for converting strings to double
-and longs, respectively.
+Or you could check out the String::Scanf module on CPAN instead. The
+POSIX module (part of the standard Perl distribution) provides the
+C<strtol> and C<strtod> for converting strings to double and longs,
+respectively.
=head2 How do I keep persistent data across program calls?
@@ -1663,7 +1800,7 @@ All rights reserved.
When included as part of the Standard Version of Perl, or as part of
its complete documentation whether printed or otherwise, this work
-may be distributed only under the terms of Perl's Artistic Licence.
+may be distributed only under the terms of Perl's Artistic License.
Any distribution of this file or derivatives thereof I<outside>
of that package require that special arrangements be made with
copyright holder.
@@ -1673,4 +1810,3 @@ are hereby placed into the public domain. You are permitted and
encouraged to use this code in your own programs for fun
or for profit as you see fit. A simple comment in the code giving
credit would be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq5.pod b/contrib/perl5/pod/perlfaq5.pod
index 99c25b7..6ae7755 100644
--- a/contrib/perl5/pod/perlfaq5.pod
+++ b/contrib/perl5/pod/perlfaq5.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq5 - Files and Formats ($Revision: 1.34 $, $Date: 1999/01/08 05:46:13 $)
+perlfaq5 - Files and Formats ($Revision: 1.38 $, $Date: 1999/05/23 16:08:30 $)
=head1 DESCRIPTION
@@ -69,7 +69,7 @@ or even this:
Note the bizarrely hardcoded carriage return and newline in their octal
equivalents. This is the ONLY way (currently) to assure a proper flush
-on all platforms, including Macintosh. That the way things work in
+on all platforms, including Macintosh. That's the way things work in
network programming: you really should specify the exact bit pattern
on the network line terminator. In practice, C<"\n\n"> often works,
but this is not portable.
@@ -347,7 +347,7 @@ Then use any of those as you would a normal filehandle. Anywhere that
Perl is expecting a filehandle, an indirect filehandle may be used
instead. An indirect filehandle is just a scalar variable that contains
a filehandle. Functions like C<print>, C<open>, C<seek>, or
-the C<E<lt>FHE<gt>> diamond operator will accept either a read filehandle
+the C<< <FH> >> diamond operator will accept either a read filehandle
or a scalar variable containing one:
($ifh, $ofh, $efh) = (*STDIN, *STDOUT, *STDERR);
@@ -407,7 +407,7 @@ calls doesn't work for the diamond operator. That's because it's a
real operator, not just a function with a comma-less argument. Assuming
you've been storing typeglobs in your structure as we did above, you
can use the built-in function named C<readline> to reads a record just
-as C<E<lt>E<gt>> does. Given the initialization shown above for @fd, this
+as C<< <> >> does. Given the initialization shown above for @fd, this
would work, but only because readline() require a typeglob. It doesn't
work with objects or strings, which might be a bug we haven't fixed yet.
@@ -463,7 +463,7 @@ whatever:
=head2 How can I translate tildes (~) in a filename?
-Use the E<lt>E<gt> (glob()) operator, documented in L<perlfunc>. This
+Use the <> (glob()) operator, documented in L<perlfunc>. This
requires that you have a shell installed that groks tildes, meaning
csh or tcsh or (some versions of) ksh, and thus may have portability
problems. The Glob::KGlob module (available from CPAN) gives more
@@ -491,8 +491,12 @@ I<then> gives you read-write access:
open(FH, "+> /path/name"); # WRONG (almost always)
Whoops. You should instead use this, which will fail if the file
-doesn't exist. Using "E<gt>" always clobbers or creates.
-Using "E<lt>" never does either. The "+" doesn't change this.
+doesn't exist.
+
+ open(FH, "+< /path/name"); # open for update
+
+Using ">" always clobbers or creates. Using "<" never does
+either. The "+" doesn't change this.
Here are examples of many kinds of file opens. Those using sysopen()
all assume
@@ -550,19 +554,20 @@ be an atomic operation over NFS. That is, two processes might both
successful create or unlink the same file! Therefore O_EXCL
isn't so exclusive as you might wish.
-See also the new L<perlopentut> if you have it (new for 5.006).
+See also the new L<perlopentut> if you have it (new for 5.6).
-=head2 Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
+=head2 Why do I sometimes get an "Argument list too long" when I use <*>?
-The C<E<lt>E<gt>> operator performs a globbing operation (see above).
-By default glob() forks csh(1) to do the actual glob expansion, but
+The C<< <> >> operator performs a globbing operation (see above).
+In Perl versions earlier than v5.6.0, the internal glob() operator forks
+csh(1) to do the actual glob expansion, but
csh can't handle more than 127 items and so gives the error message
C<Argument list too long>. People who installed tcsh as csh won't
have this problem, but their users may be surprised by it.
-To get around this, either do the glob yourself with readdir() and
-patterns, or use a module like Glob::KGlob, one that doesn't use the
-shell to do globbing. This is expected to be fixed soon.
+To get around this, either upgrade to Perl v5.6.0 or later, do the glob
+yourself with readdir() and patterns, or use a module like Glob::KGlob,
+one that doesn't use the shell to do globbing.
=head2 Is there a leak/bug in glob()?
@@ -571,7 +576,7 @@ use the glob() function or its angle-bracket alias in a scalar
context, you may cause a leak and/or unpredictable behavior. It's
best therefore to use glob() only in list context.
-=head2 How can I open a file with a leading "E<gt>" or trailing blanks?
+=head2 How can I open a file with a leading ">" or trailing blanks?
Normally perl ignores trailing blanks in filenames, and interprets
certain leading characters (or a trailing "|") to mean something
@@ -602,14 +607,18 @@ It would be a lot clearer to use sysopen(), though:
or die "can't open $badpath: $!";
For more information, see also the new L<perlopentut> if you have it
-(new for 5.006).
+(new for 5.6).
=head2 How can I reliably rename a file?
-Well, usually you just use Perl's rename() function. But that may
-not work everywhere, in particular, renaming files across file systems.
-If your operating system supports a mv(1) program or its moral equivalent,
-this works:
+Well, usually you just use Perl's rename() function. But that may not
+work everywhere, in particular, renaming files across file systems.
+Some sub-Unix systems have broken ports that corrupt the semantics of
+rename() -- for example, WinNT does this right, but Win95 and Win98
+are broken. (The last two parts are not surprising, but the first is. :-)
+
+If your operating system supports a proper mv(1) program or its moral
+equivalent, this works:
rename($old, $new) or system("mv", $old, $new);
@@ -643,14 +652,28 @@ filehandle be open for writing (or appending, or read/writing).
=item 3
-Some versions of flock() can't lock files over a network (e.g. on NFS
-file systems), so you'd need to force the use of fcntl(2) when you
-build Perl. See the flock entry of L<perlfunc>, and the F<INSTALL>
-file in the source distribution for information on building Perl to do
-this.
+Some versions of flock() can't lock files over a network (e.g. on NFS file
+systems), so you'd need to force the use of fcntl(2) when you build Perl.
+But even this is dubious at best. See the flock entry of L<perlfunc>,
+and the F<INSTALL> file in the source distribution for information on
+building Perl to do this.
+
+Two potentially non-obvious but traditional flock semantics are that
+it waits indefinitely until the lock is granted, and that its locks
+I<merely advisory>. Such discretionary locks are more flexible, but
+offer fewer guarantees. This means that files locked with flock() may
+be modified by programs that do not also use flock(). Cars that stop
+for red lights get on well with each other, but not with cars that don't
+stop for red lights. See the perlport manpage, your port's specific
+documentation, or your system-specific local manpages for details. It's
+best to assume traditional behavior if you're writing portable programs.
+(But if you're not, you should as always feel perfectly free to write
+for your own system's idiosyncrasies (sometimes called "features").
+Slavish adherence to portability concerns shouldn't get in the way of
+your getting your job done.)
For more information on file locking, see also L<perlopentut/"File
-Locking"> if you have it (new for 5.006).
+Locking"> if you have it (new for 5.6).
=back
@@ -797,6 +820,58 @@ at http://www.perl.com/CPAN/authors/id/TOMC/scripts/tct.gz, which is
written in Perl and offers much greater functionality
than the stock version.
+=head2 How can I read in an entire file all at once?
+
+The customary Perl approach for processing all the lines in a file is to
+do so one line at a time:
+
+ open (INPUT, $file) || die "can't open $file: $!";
+ while (<INPUT>) {
+ chomp;
+ # do something with $_
+ }
+ close(INPUT) || die "can't close $file: $!";
+
+This is tremendously more efficient than reading the entire file into
+memory as an array of lines and then processing it one element at a time,
+which is often -- if not almost always -- the wrong approach. Whenever
+you see someone do this:
+
+ @lines = <INPUT>;
+
+You should think long and hard about why you need everything loaded
+at once. It's just not a scalable solution. You might also find it
+more fun to use the the standard DB_File module's $DB_RECNO bindings,
+which allow you to tie an array to a file so that accessing an element
+the array actually accesses the corresponding line in the file.
+
+On very rare occasion, you may have an algorithm that demands that
+the entire file be in memory at once as one scalar. The simplest solution
+to that is:
+
+ $var = `cat $file`;
+
+Being in scalar context, you get the whole thing. In list context,
+you'd get a list of all the lines:
+
+ @lines = `cat $file`;
+
+This tiny but expedient solution is neat, clean, and portable to
+all systems on which decent tools have been installed. For those
+who prefer not to use the toolbox, you can of course read the file
+manually, although this makes for more complicated code.
+
+ {
+ local(*INPUT, $/);
+ open (INPUT, $file) || die "can't open $file: $!";
+ $var = <INPUT>;
+ }
+
+That temporarily undefs your record separator, and will automatically
+close the file at block exit. If the file is already open, just use this:
+
+ $var = do { local $/; <INPUT> };
+
=head2 How can I read in a file by paragraphs?
Use the C<$/> variable (see L<perlvar> for details). You can either
@@ -1025,7 +1100,7 @@ Or even with a literal numeric descriptor:
$fd = $ENV{MHCONTEXTFD};
open(MHCONTEXT, "<&=$fd"); # like fdopen(3S)
-Note that "E<lt>&STDIN" makes a copy, but "E<lt>&=STDIN" make
+Note that "<&STDIN" makes a copy, but "<&=STDIN" make
an alias. That means if you close an aliased handle, all
aliases become inaccessible. This is not true with
a copied one.
@@ -1043,6 +1118,14 @@ to, you may be able to do this:
$rc = syscall(&SYS_close, $fd + 0); # must force numeric
die "can't sysclose $fd: $!" unless $rc == -1;
+Or just use the fdopen(3S) feature of open():
+
+ {
+ local *F;
+ open F, "<&=$fd" or die "Cannot reopen fd=$fd: $!";
+ close F;
+ }
+
=head2 Why can't I use "C:\temp\foo" in DOS paths? What doesn't `C:\temp\foo.exe` work?
Whoops! You just put a tab and a formfeed into that filename!
@@ -1121,13 +1204,12 @@ Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
All rights reserved.
When included as an integrated part of the Standard Distribution
-of Perl or of its documentation (printed or otherwise), this work is
-covered under Perl's Artistic Licence. For separate distributions of
+of Perl or of its documentation (printed or otherwise), this works is
+covered under Perl's Artistic License. For separate distributions of
all or part of this FAQ outside of that, see L<perlfaq>.
-Irrespective of its distribution, all code examples here are public
+Irrespective of its distribution, all code examples here are in the public
domain. You are permitted and encouraged to use this code and any
derivatives thereof in your own programs for fun or for profit as you
see fit. A simple comment in the code giving credit to the FAQ would
be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq6.pod b/contrib/perl5/pod/perlfaq6.pod
index 234570d..bf007ee 100644
--- a/contrib/perl5/pod/perlfaq6.pod
+++ b/contrib/perl5/pod/perlfaq6.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq6 - Regexps ($Revision: 1.25 $, $Date: 1999/01/08 04:50:47 $)
+perlfaq6 - Regexes ($Revision: 1.27 $, $Date: 1999/05/23 16:08:30 $)
=head1 DESCRIPTION
@@ -18,7 +18,7 @@ understandable.
=over 4
-=item Comments Outside the Regexp
+=item Comments Outside the Regex
Describe what you're doing and how you're doing it, using normal Perl
comments.
@@ -27,9 +27,9 @@ comments.
# number of characters on the rest of the line
s/^(\w+)(.*)/ lc($1) . ":" . length($2) /meg;
-=item Comments Inside the Regexp
+=item Comments Inside the Regex
-The C</x> modifier causes whitespace to be ignored in a regexp pattern
+The C</x> modifier causes whitespace to be ignored in a regex pattern
(except in a character class), and also allows you to use normal
comments there, too. As you can imagine, whitespace and comments help
a lot.
@@ -177,11 +177,46 @@ appear within a certain time.
=head2 How do I substitute case insensitively on the LHS, but preserving case on the RHS?
-It depends on what you mean by "preserving case". The following
-script makes the substitution have the same case, letter by letter, as
-the original. If the substitution has more characters than the string
-being substituted, the case of the last character is used for the rest
-of the substitution.
+Here's a lovely Perlish solution by Larry Rosler. It exploits
+properties of bitwise xor on ASCII strings.
+
+ $_= "this is a TEsT case";
+
+ $old = 'test';
+ $new = 'success';
+
+ s{(\Q$old\E}
+ { uc $new | (uc $1 ^ $1) .
+ (uc(substr $1, -1) ^ substr $1, -1) x
+ (length($new) - length $1)
+ }egi;
+
+ print;
+
+And here it is as a subroutine, modelled after the above:
+
+ sub preserve_case($$) {
+ my ($old, $new) = @_;
+ my $mask = uc $old ^ $old;
+
+ uc $new | $mask .
+ substr($mask, -1) x (length($new) - length($old))
+ }
+
+ $a = "this is a TEsT case";
+ $a =~ s/(test)/preserve_case($1, "success")/egi;
+ print "$a\n";
+
+This prints:
+
+ this is a SUcCESS case
+
+Just to show that C programmers can write C in any programming language,
+if you prefer a more C-like solution, the following script makes the
+substitution have the same case, letter by letter, as the original.
+(It also happens to run about 240% slower than the Perlish solution runs.)
+If the substitution has more characters than the string being substituted,
+the case of the last character is used for the rest of the substitution.
# Original by Nathan Torkington, massaged by Jeffrey Friedl
#
@@ -214,14 +249,6 @@ of the substitution.
return $new;
}
- $a = "this is a TEsT case";
- $a =~ s/(test)/preserve_case($1, "success")/gie;
- print "$a\n";
-
-This prints:
-
- this is a SUcCESS case
-
=head2 How can I make C<\w> match national character sets?
See L<perllocale>.
@@ -232,41 +259,41 @@ One alphabetic character would be C</[^\W\d_]/>, no matter what locale
you're in. Non-alphabetics would be C</[\W\d_]/> (assuming you don't
consider an underscore a letter).
-=head2 How can I quote a variable to use in a regexp?
+=head2 How can I quote a variable to use in a regex?
The Perl parser will expand $variable and @variable references in
regular expressions unless the delimiter is a single quote. Remember,
too, that the right-hand side of a C<s///> substitution is considered
a double-quoted string (see L<perlop> for more details). Remember
-also that any regexp special characters will be acted on unless you
+also that any regex special characters will be acted on unless you
precede the substitution with \Q. Here's an example:
$string = "to die?";
$lhs = "die?";
- $rhs = "sleep no more";
+ $rhs = "sleep, no more";
$string =~ s/\Q$lhs/$rhs/;
# $string is now "to sleep no more"
-Without the \Q, the regexp would also spuriously match "di".
+Without the \Q, the regex would also spuriously match "di".
=head2 What is C</o> really for?
Using a variable in a regular expression match forces a re-evaluation
(and perhaps recompilation) each time through. The C</o> modifier
-locks in the regexp the first time it's used. This always happens in a
+locks in the regex the first time it's used. This always happens in a
constant regular expression, and in fact, the pattern was compiled
into the internal format at the same time your entire program was.
Use of C</o> is irrelevant unless variable interpolation is used in
-the pattern, and if so, the regexp engine will neither know nor care
+the pattern, and if so, the regex engine will neither know nor care
whether the variables change after the pattern is evaluated the I<very
first> time.
C</o> is often used to gain an extra measure of efficiency by not
performing subsequent evaluations when you know it won't matter
(because you know the variables won't change), or more rarely, when
-you don't want the regexp to notice if they do.
+you don't want the regex to notice if they do.
For example, here's a "paragrep" program:
@@ -286,23 +313,66 @@ For example, this one-liner
will work in many but not all cases. You see, it's too simple-minded for
certain kinds of C programs, in particular, those with what appear to be
comments in quoted strings. For that, you'd need something like this,
-created by Jeffrey Friedl:
+created by Jeffrey Friedl and later modified by Fred Curtis.
$/ = undef;
$_ = <>;
- s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|\n+|.[^/"'\\]*)#$2#g;
+ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs
print;
This could, of course, be more legibly written with the C</x> modifier, adding
-whitespace and comments.
+whitespace and comments. Here it is expanded, courtesy of Fred Curtis.
+
+ s{
+ /\* ## Start of /* ... */ comment
+ [^*]*\*+ ## Non-* followed by 1-or-more *'s
+ (
+ [^/*][^*]*\*+
+ )* ## 0-or-more things which don't start with /
+ ## but do end with '*'
+ / ## End of /* ... */ comment
+
+ | ## OR various things which aren't comments:
+
+ (
+ " ## Start of " ... " string
+ (
+ \\. ## Escaped char
+ | ## OR
+ [^"\\] ## Non "\
+ )*
+ " ## End of " ... " string
+
+ | ## OR
+
+ ' ## Start of ' ... ' string
+ (
+ \\. ## Escaped char
+ | ## OR
+ [^'\\] ## Non '\
+ )*
+ ' ## End of ' ... ' string
+
+ | ## OR
+
+ . ## Anything other char
+ [^/"'\\]* ## Chars which doesn't start a comment, string or escape
+ )
+ }{$2}gxs;
+
+A slight modification also removes C++ comments:
+
+ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs;
=head2 Can I use Perl regular expressions to match balanced text?
Although Perl regular expressions are more powerful than "mathematical"
regular expressions, because they feature conveniences like backreferences
-(C<\1> and its ilk), they still aren't powerful enough. You still need
-to use non-regexp techniques to parse balanced text, such as the text
-enclosed between matching parentheses or braces, for example.
+(C<\1> and its ilk), they still aren't powerful enough -- with
+the possible exception of bizarre and experimental features in the
+development-track releases of Perl. You still need to use non-regex
+techniques to parse balanced text, such as the text enclosed between
+matching parentheses or braces, for example.
An elaborate subroutine (for 7-bit ASCII only) to pull out balanced
and possibly nested single chars, like C<`> and C<'>, C<{> and C<}>,
@@ -312,9 +382,9 @@ http://www.perl.com/CPAN/authors/id/TOMC/scripts/pull_quotes.gz .
The C::Scan module from CPAN contains such subs for internal usage,
but they are undocumented.
-=head2 What does it mean that regexps are greedy? How can I get around it?
+=head2 What does it mean that regexes are greedy? How can I get around it?
-Most people mean that greedy regexps match as much as they can.
+Most people mean that greedy regexes match as much as they can.
Technically speaking, it's actually the quantifiers (C<?>, C<*>, C<+>,
C<{}>) that are greedy rather than the whole pattern; Perl prefers local
greed and immediate gratification to overall greed. To get non-greedy
@@ -422,7 +492,7 @@ characters. Neither is correct. C<\b> is the place between a C<\w>
character and a C<\W> character (that is, C<\b> is the edge of a
"word"). It's a zero-width assertion, just like C<^>, C<$>, and all
the other anchors, so it doesn't consume any characters. L<perlre>
-describes the behaviour of all the regexp metacharacters.
+describes the behavior of all the regex metacharacters.
Here are examples of the incorrect application of C<\b>, with fixes:
@@ -446,8 +516,8 @@ not "this" or "island".
Because once Perl sees that you need one of these variables anywhere in
the program, it has to provide them on each and every pattern match.
The same mechanism that handles these provides for the use of $1, $2,
-etc., so you pay the same price for each regexp that contains capturing
-parentheses. But if you never use $&, etc., in your script, then regexps
+etc., so you pay the same price for each regex that contains capturing
+parentheses. But if you never use $&, etc., in your script, then regexes
I<without> capturing parentheses won't be penalized. So avoid $&, $',
and $` if you can, but if you can't, once you've used them at all, use
them at will because you've already paid the price. Remember that some
@@ -463,8 +533,8 @@ pos() point. A failed match resets the position of C<\G> unless the
C</c> modifier is in effect.
For example, suppose you had a line of text quoted in standard mail
-and Usenet notation, (that is, with leading C<E<gt>> characters), and
-you want change each leading C<E<gt>> into a corresponding C<:>. You
+and Usenet notation, (that is, with leading C<< > >> characters), and
+you want change each leading C<< > >> into a corresponding C<:>. You
could do so in this way:
s/^(>+)/':' x length($1)/gem;
@@ -515,7 +585,7 @@ Of course, that could have been written as
But then you lose the vertical alignment of the regular expressions.
-=head2 Are Perl regexps DFAs or NFAs? Are they POSIX compliant?
+=head2 Are Perl regexes DFAs or NFAs? Are they POSIX compliant?
While it's true that Perl's regular expressions resemble the DFAs
(deterministic finite automata) of the egrep(1) program, they are in
@@ -620,7 +690,7 @@ All rights reserved.
When included as part of the Standard Version of Perl, or as part of
its complete documentation whether printed or otherwise, this work
-may be distributed only under the terms of Perl's Artistic Licence.
+may be distributed only under the terms of Perl's Artistic License.
Any distribution of this file or derivatives thereof I<outside>
of that package require that special arrangements be made with
copyright holder.
@@ -630,4 +700,3 @@ are hereby placed into the public domain. You are permitted and
encouraged to use this code in your own programs for fun
or for profit as you see fit. A simple comment in the code giving
credit would be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq7.pod b/contrib/perl5/pod/perlfaq7.pod
index a4ea872..1ca7893 100644
--- a/contrib/perl5/pod/perlfaq7.pod
+++ b/contrib/perl5/pod/perlfaq7.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq7 - Perl Language Issues ($Revision: 1.24 $, $Date: 1999/01/08 05:32:11 $)
+perlfaq7 - Perl Language Issues ($Revision: 1.28 $, $Date: 1999/05/23 20:36:18 $)
=head1 DESCRIPTION
@@ -18,31 +18,29 @@ In the words of Chaim Frenkel: "Perl's grammar can not be reduced to BNF.
The work of parsing perl is distributed between yacc, the lexer, smoke
and mirrors."
-=head2 What are all these $@%* punctuation signs, and how do I know when to use them?
+=head2 What are all these $@%&* punctuation signs, and how do I know when to use them?
They are type specifiers, as detailed in L<perldata>:
$ for scalar values (number, string or reference)
@ for arrays
% for hashes (associative arrays)
+ & for subroutines (aka functions, procedures, methods)
* for all types of that symbol name. In version 4 you used them like
pointers, but in modern perls you can just use references.
-While there are a few places where you don't actually need these type
-specifiers, you should always use them.
-
A couple of others that you're likely to encounter that aren't
really type specifiers are:
<> are used for inputting a record from a filehandle.
\ takes a reference to something.
-Note that E<lt>FILEE<gt> is I<neither> the type specifier for files
-nor the name of the handle. It is the C<E<lt>E<gt>> operator applied
+Note that <FILE> is I<neither> the type specifier for files
+nor the name of the handle. It is the C<< <> >> operator applied
to the handle FILE. It reads one line (well, record - see
L<perlvar/$/>) from the handle FILE in scalar context, or I<all> lines
in list context. When performing open, close, or any other operation
-besides C<E<lt>E<gt>> on files, or even talking about the handle, do
+besides C<< <> >> on files, or even talking about the handle, do
I<not> use the brackets. These are correct: C<eof(FH)>, C<seek(FH, 0,
2)> and "copying from STDIN to FILE".
@@ -51,7 +49,7 @@ I<not> use the brackets. These are correct: C<eof(FH)>, C<seek(FH, 0,
Normally, a bareword doesn't need to be quoted, but in most cases
probably should be (and must be under C<use strict>). But a hash key
consisting of a simple word (that isn't the name of a defined
-subroutine) and the left-hand operand to the C<=E<gt>> operator both
+subroutine) and the left-hand operand to the C<< => >> operator both
count as though they were quoted:
This is like this
@@ -86,8 +84,17 @@ Another way is to use undef as an element on the left-hand-side:
=head2 How do I temporarily block warnings?
-The C<$^W> variable (documented in L<perlvar>) controls
-runtime warnings for a block:
+If you are running Perl 5.6.0 or better, the C<use warnings> pragma
+allows fine control of what warning are produced.
+See L<perllexwarn> for more details.
+
+ {
+ no warnings; # temporarily turn off warnings
+ $a = $b + $c; # I know these might be undef
+ }
+
+If you have an older version of Perl, the C<$^W> variable (documented
+in L<perlvar>) controls runtime warnings for a block:
{
local $^W = 0; # temporarily turn off warnings
@@ -97,10 +104,6 @@ runtime warnings for a block:
Note that like all the punctuation variables, you cannot currently
use my() on C<$^W>, only local().
-A new C<use warnings> pragma is in the works to provide finer control
-over all this. The curious should check the perl5-porters mailing list
-archives for details.
-
=head2 What's an extension?
A way of calling compiled C code from Perl. Reading L<perlxstut>
@@ -170,17 +173,18 @@ own module. Make sure to change the names appropriately.
package Some::Module; # assumes Some/Module.pm
use strict;
+ use warnings;
BEGIN {
use Exporter ();
- use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
## set the version for version checking; uncomment to use
## $VERSION = 1.00;
# if using RCS/CVS, this next line may be preferred,
# but beware two-digit versions.
- $VERSION = do{my@r=q$Revision: 1.24 $=~/\d+/g;sprintf '%d.'.'%02d'x$#r,@r};
+ $VERSION = do{my@r=q$Revision: 1.28 $=~/\d+/g;sprintf '%d.'.'%02d'x$#r,@r};
@ISA = qw(Exporter);
@EXPORT = qw(&func1 &func2 &func3);
@@ -190,10 +194,11 @@ own module. Make sure to change the names appropriately.
# as well as any optionally exported functions
@EXPORT_OK = qw($Var1 %Hashit);
}
- use vars @EXPORT_OK;
+ our @EXPORT_OK;
# non-exported package globals go here
- use vars qw( @more $stuff );
+ our @more;
+ our $stuff;
# initialize package globals, first exported ones
$Var1 = '';
@@ -308,10 +313,10 @@ you want to pass in a bit of code into a function:
my $line;
timeout( 30, sub { $line = <STDIN> } );
-If the code to execute had been passed in as a string, C<'$line =
-E<lt>STDINE<gt>'>, there would have been no way for the hypothetical
-timeout() function to access the lexical variable $line back in its
-caller's scope.
+If the code to execute had been passed in as a string,
+C<< '$line = <STDIN>' >>, there would have been no way for the
+hypothetical timeout() function to access the lexical variable
+$line back in its caller's scope.
=head2 What is variable suicide and how can I prevent it?
@@ -330,12 +335,13 @@ harder. Take this code:
print "Finally $f\n";
The $f that has "bar" added to it three times should be a new C<$f>
-(C<my $f> should create a new local variable each time through the
-loop). It isn't, however. This is a bug, and will be fixed.
+(C<my $f> should create a new local variable each time through the loop).
+It isn't, however. This was a bug, now fixed in the latest releases
+(tested against 5.004_05, 5.005_03, and 5.005_56).
-=head2 How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regexp}?
+=head2 How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?
-With the exception of regexps, you need to pass references to these
+With the exception of regexes, you need to pass references to these
objects. See L<perlsub/"Pass by Reference"> for this particular
question, and L<perlref> for information on references.
@@ -391,28 +397,42 @@ If you're planning on generating new filehandles, you could do this:
$fh = openit('< /etc/motd');
print <$fh>;
-=item Passing Regexps
+=item Passing Regexes
+
+To pass regexes around, you'll need to be using a release of Perl
+sufficiently recent as to support the C<qr//> construct, pass around
+strings and use an exception-trapping eval, or else be very, very clever.
+
+Here's an example of how to pass in a string to be regex compared
+using C<qr//>:
+
+ sub compare($$) {
+ my ($val1, $regex) = @_;
+ my $retval = $val1 =~ /$regex/;
+ return $retval;
+ }
+ $match = compare("old McDonald", qr/d.*D/i);
-To pass regexps around, you'll need to either use one of the highly
-experimental regular expression modules from CPAN (Nick Ing-Simmons's
-Regexp or Ilya Zakharevich's Devel::Regexp), pass around strings
-and use an exception-trapping eval, or else be very, very clever.
-Here's an example of how to pass in a string to be regexp compared:
+Notice how C<qr//> allows flags at the end. That pattern was compiled
+at compile time, although it was executed later. The nifty C<qr//>
+notation wasn't introduced until the 5.005 release. Before that, you
+had to approach this problem much less intuitively. For example, here
+it is again if you don't have C<qr//>:
sub compare($$) {
- my ($val1, $regexp) = @_;
- my $retval = eval { $val =~ /$regexp/ };
+ my ($val1, $regex) = @_;
+ my $retval = eval { $val1 =~ /$regex/ };
die if $@;
return $retval;
}
- $match = compare("old McDonald", q/d.*D/);
+ $match = compare("old McDonald", q/($?i)d.*D/);
Make sure you never say something like this:
- return eval "\$val =~ /$regexp/"; # WRONG
+ return eval "\$val =~ /$regex/"; # WRONG
-or someone can sneak shell escapes into the regexp due to the double
+or someone can sneak shell escapes into the regex due to the double
interpolation of the eval and the double-quoted string. For example:
$pattern_of_evil = 'danger ${ system("rm -rf * &") } danger';
@@ -567,10 +587,10 @@ However, dynamic variables (aka global, local, or package variables)
are effectively shallowly bound. Consider this just one more reason
not to use them. See the answer to L<"What's a closure?">.
-=head2 Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+=head2 Why doesn't "my($foo) = <FILE>;" work right?
C<my()> and C<local()> give list context to the right hand side
-of C<=>. The E<lt>FHE<gt> read operation, like so many of Perl's
+of C<=>. The <FH> read operation, like so many of Perl's
functions and operators, can tell which context it was called in and
behaves appropriately. In general, the scalar() function can help.
This function does nothing to the data itself (contrary to popular myth)
@@ -597,7 +617,7 @@ Why do you want to do that? :-)
If you want to override a predefined function, such as open(),
then you'll have to import the new definition from a different
-module. See L<perlsub/"Overriding Builtin Functions">. There's
+module. See L<perlsub/"Overriding Built-in Functions">. There's
also an example in L<perltoot/"Class::Template">.
If you want to overload a Perl operator, such as C<+> or C<**>,
@@ -630,7 +650,7 @@ where they don't belong.
This is explained in more depth in the L<perlsyn>. Briefly, there's
no official case statement, because of the variety of tests possible
in Perl (numeric comparison, string comparison, glob comparison,
-regexp matching, overloaded comparisons, ...). Larry couldn't decide
+regex matching, overloaded comparisons, ...). Larry couldn't decide
how best to do this, so he left it out, even though it's been on the
wish list since perl1.
@@ -752,7 +772,7 @@ before Perl has seen that such a package exists. It's wisest to make
sure your packages are all defined before you start using them, which
will be taken care of if you use the C<use> statement instead of
C<require>. If not, make sure to use arrow notation (eg,
-C<Guru-E<gt>find("Samy")>) instead. Object notation is explained in
+C<< Guru->find("Samy") >>) instead. Object notation is explained in
L<perlobj>.
Make sure to read about creating modules in L<perlmod> and
@@ -826,6 +846,106 @@ Use this code, provided by Mark-Jason Dominus:
Or, if you're using a recent release of Perl, you can
just use the Symbol::delete_package() function instead.
+=head2 How can I use a variable as a variable name?
+
+Beginners often think they want to have a variable contain the name
+of a variable.
+
+ $fred = 23;
+ $varname = "fred";
+ ++$$varname; # $fred now 24
+
+This works I<sometimes>, but it is a very bad idea for two reasons.
+
+The first reason is that they I<only work on global variables>.
+That means above that if $fred is a lexical variable created with my(),
+that the code won't work at all: you'll accidentally access the global
+and skip right over the private lexical altogether. Global variables
+are bad because they can easily collide accidentally and in general make
+for non-scalable and confusing code.
+
+Symbolic references are forbidden under the C<use strict> pragma.
+They are not true references and consequently are not reference counted
+or garbage collected.
+
+The other reason why using a variable to hold the name of another
+variable a bad idea is that the question often stems from a lack of
+understanding of Perl data structures, particularly hashes. By using
+symbolic references, you are just using the package's symbol-table hash
+(like C<%main::>) instead of a user-defined hash. The solution is to
+use your own hash or a real reference instead.
+
+ $fred = 23;
+ $varname = "fred";
+ $USER_VARS{$varname}++; # not $$varname++
+
+There we're using the %USER_VARS hash instead of symbolic references.
+Sometimes this comes up in reading strings from the user with variable
+references and wanting to expand them to the values of your perl
+program's variables. This is also a bad idea because it conflates the
+program-addressable namespace and the user-addressable one. Instead of
+reading a string and expanding it to the actual contents of your program's
+own variables:
+
+ $str = 'this has a $fred and $barney in it';
+ $str =~ s/(\$\w+)/$1/eeg; # need double eval
+
+Instead, it would be better to keep a hash around like %USER_VARS and have
+variable references actually refer to entries in that hash:
+
+ $str =~ s/\$(\w+)/$USER_VARS{$1}/g; # no /e here at all
+
+That's faster, cleaner, and safer than the previous approach. Of course,
+you don't need to use a dollar sign. You could use your own scheme to
+make it less confusing, like bracketed percent symbols, etc.
+
+ $str = 'this has a %fred% and %barney% in it';
+ $str =~ s/%(\w+)%/$USER_VARS{$1}/g; # no /e here at all
+
+Another reason that folks sometimes think they want a variable to contain
+the name of a variable is because they don't know how to build proper
+data structures using hashes. For example, let's say they wanted two
+hashes in their program: %fred and %barney, and to use another scalar
+variable to refer to those by name.
+
+ $name = "fred";
+ $$name{WIFE} = "wilma"; # set %fred
+
+ $name = "barney";
+ $$name{WIFE} = "betty"; # set %barney
+
+This is still a symbolic reference, and is still saddled with the
+problems enumerated above. It would be far better to write:
+
+ $folks{"fred"}{WIFE} = "wilma";
+ $folks{"barney"}{WIFE} = "betty";
+
+And just use a multilevel hash to start with.
+
+The only times that you absolutely I<must> use symbolic references are
+when you really must refer to the symbol table. This may be because it's
+something that can't take a real reference to, such as a format name.
+Doing so may also be important for method calls, since these always go
+through the symbol table for resolution.
+
+In those cases, you would turn off C<strict 'refs'> temporarily so you
+can play around with the symbol table. For example:
+
+ @colors = qw(red blue green yellow orange purple violet);
+ for my $name (@colors) {
+ no strict 'refs'; # renege for the block
+ *$name = sub { "<FONT COLOR='$name'>@_</FONT>" };
+ }
+
+All those functions (red(), blue(), green(), etc.) appear to be separate,
+but the real code in the closure actually was compiled only once.
+
+So, sometimes you might want to use symbolic references to directly
+manipulate the symbol table. This doesn't matter for formats, handles, and
+subroutines, because they are always global -- you can't use my() on them.
+But for scalars, arrays, and hashes -- and usually for subroutines --
+you probably want to use hard references only.
+
=head1 AUTHOR AND COPYRIGHT
Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
@@ -833,7 +953,7 @@ All rights reserved.
When included as part of the Standard Version of Perl, or as part of
its complete documentation whether printed or otherwise, this work
-may be distributed only under the terms of Perl's Artistic Licence.
+may be distributed only under the terms of Perl's Artistic License.
Any distribution of this file or derivatives thereof I<outside>
of that package require that special arrangements be made with
copyright holder.
@@ -843,4 +963,3 @@ are hereby placed into the public domain. You are permitted and
encouraged to use this code in your own programs for fun
or for profit as you see fit. A simple comment in the code giving
credit would be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq8.pod b/contrib/perl5/pod/perlfaq8.pod
index 9ef41af..ed22ba0 100644
--- a/contrib/perl5/pod/perlfaq8.pod
+++ b/contrib/perl5/pod/perlfaq8.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq8 - System Interaction ($Revision: 1.36 $, $Date: 1999/01/08 05:36:34 $)
+perlfaq8 - System Interaction ($Revision: 1.39 $, $Date: 1999/05/23 18:37:57 $)
=head1 DESCRIPTION
@@ -15,8 +15,9 @@ contain more detailed information on the vagaries of your perl.
=head2 How do I find out which operating system I'm running under?
-The $^O variable ($OSNAME if you use English) contains the operating
-system that your perl binary was built for.
+The $^O variable ($OSNAME if you use English) contains an indication of
+the name of the operating system (not its release number) that your perl
+binary was built for.
=head2 How come exec() doesn't return?
@@ -74,7 +75,7 @@ Or like this:
=head2 How do I read just one key without waiting for a return key?
Controlling input buffering is a remarkably system-dependent matter.
-If most systems, you can just use the B<stty> command as shown in
+On many systems, you can just use the B<stty> command as shown in
L<perlfunc/getc>, but as you see, that's already getting you into
portability snags.
@@ -167,7 +168,7 @@ not to block:
=head2 How do I clear the screen?
-If you only have to so infrequently, use C<system>:
+If you only have do so infrequently, use C<system>:
system("clear");
@@ -409,7 +410,7 @@ For example:
}
However, because syscalls restart by default, you'll find that if
-you're in a "slow" call, such as E<lt>FHE<gt>, read(), connect(), or
+you're in a "slow" call, such as <FH>, read(), connect(), or
wait(), that the only way to terminate them is by "longjumping" out;
that is, by raising an exception. See the time-out handler for a
blocking flock() in L<perlipc/"Signals"> or chapter 6 of the Camel.
@@ -421,7 +422,7 @@ properly, the getpw*() functions described in L<perlfunc> should in
theory provide (read-only) access to entries in the shadow password
file. To change the file, make a new shadow password file (the format
varies from system to system - see L<passwd(5)> for specifics) and use
-pwd_mkdb(8) to install it (see L<pwd_mkdb(5)> for more details).
+pwd_mkdb(8) to install it (see L<pwd_mkdb(8)> for more details).
=head2 How do I set the time and date?
@@ -461,7 +462,7 @@ something like this:
$done = $start = pack($TIMEVAL_T, ());
- syscall( &SYS_gettimeofday, $start, 0) != -1
+ syscall(&SYS_gettimeofday, $start, 0) != -1
or die "gettimeofday: $!";
##########################
@@ -699,7 +700,7 @@ case the fork()/exec() description still applies.
Strictly speaking, nothing. Stylistically speaking, it's not a good
way to write maintainable code because backticks have a (potentially
-humungous) return value, and you're ignoring it. It's may also not be very
+humongous) return value, and you're ignoring it. It's may also not be very
efficient, because you have to read in all the lines of output, allocate
memory for them, and then throw it away. Too often people are lulled
to writing:
@@ -725,7 +726,7 @@ In most cases, this could and probably should be written as
system("cat /etc/termcap") == 0
or die "cat program failed!";
-Which will get the output quickly (as its generated, instead of only
+Which will get the output quickly (as it is generated, instead of only
at the end) and also check the return value.
system() also provides direct control over whether shell wildcard
@@ -751,8 +752,14 @@ You have to do this:
}
Just as with system(), no shell escapes happen when you exec() a list.
+Further examples of this can be found in L<perlipc/"Safe Pipe Opens">.
-There are more examples of this L<perlipc/"Safe Pipe Opens">.
+Note that if you're stuck on Microsoft, no solution to this vexing issue
+is even possible. Even if Perl were to emulate fork(), you'd still
+be hosed, because Microsoft gives no argc/argv-style API. Their API
+always reparses from a single string, which is fundamentally wrong,
+but you're not likely to get the Gods of Redmond to acknowledge this
+and fix it for you.
=head2 Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
@@ -928,7 +935,7 @@ the current process group of your controlling terminal as follows:
=head2 How do I timeout a slow event?
Use the alarm() function, probably in conjunction with a signal
-handler, as documented L<perlipc/"Signals"> and chapter 6 of the
+handler, as documented in L<perlipc/"Signals"> and chapter 6 of the
Camel. You may instead use the more flexible Sys::AlarmCall module
available from CPAN.
@@ -945,10 +952,9 @@ in L<perlfunc/fork>.
=head2 How do I use an SQL database?
There are a number of excellent interfaces to SQL databases. See the
-DBD::* modules available from
-http://www.perl.com/CPAN/modules/dbperl/DBD .
+DBD::* modules available from http://www.perl.com/CPAN/modules/DBD .
A lot of information on this can be found at
-http://www.hermetica.com/technologia/perl/DBI/index.html .
+http://www.symbolstone.org/technology/perl/DBI/
=head2 How do I make a system() exit on control-C?
@@ -970,12 +976,15 @@ sysopen():
sysopen(FH, "/tmp/somefile", O_WRONLY|O_NDELAY|O_CREAT, 0644)
or die "can't open /tmp/somefile: $!":
-=head2 How do I install a CPAN module?
-The easiest way is to have the CPAN module do it for you. This module
-comes with perl version 5.004 and later. To manually install the CPAN
-module, or any well-behaved CPAN module for that matter, follow these
-steps:
+
+
+=head2 How do I install a module from CPAN?
+
+The easiest way is to have a module also named CPAN do it for you.
+This module comes with perl version 5.004 and later. To manually install
+the CPAN module, or any well-behaved CPAN module for that matter, follow
+these steps:
=over 4
@@ -1085,7 +1094,7 @@ All rights reserved.
When included as part of the Standard Version of Perl, or as part of
its complete documentation whether printed or otherwise, this work
-may be distributed only under the terms of Perl's Artistic Licence.
+may be distributed only under the terms of Perl's Artistic License.
Any distribution of this file or derivatives thereof I<outside>
of that package require that special arrangements be made with
copyright holder.
@@ -1095,4 +1104,3 @@ are hereby placed into the public domain. You are permitted and
encouraged to use this code in your own programs for fun
or for profit as you see fit. A simple comment in the code giving
credit would be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfaq9.pod b/contrib/perl5/pod/perlfaq9.pod
index 6536064..16a803c 100644
--- a/contrib/perl5/pod/perlfaq9.pod
+++ b/contrib/perl5/pod/perlfaq9.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlfaq9 - Networking ($Revision: 1.24 $, $Date: 1999/01/08 05:39:48 $)
+perlfaq9 - Networking ($Revision: 1.26 $, $Date: 1999/05/23 16:08:30 $)
=head1 DESCRIPTION
@@ -76,11 +76,13 @@ stamp prepended.
=head2 How do I remove HTML from a string?
-The most correct way (albeit not the fastest) is to use HTML::Parse
-from CPAN (part of the HTML-Tree package on CPAN).
+The most correct way (albeit not the fastest) is to use HTML::Parser
+from CPAN. Another mostly correct
+way is to use HTML::FormatText which not only removes HTML but also
+attempts to do a little simple formatting of the resulting plain text.
Many folks attempt a simple-minded regular expression approach, like
-C<s/E<lt>.*?E<gt>//g>, but that fails in many cases because the tags
+C<< s/<.*?>//g >>, but that fails in many cases because the tags
may continue over line breaks, they may contain quoted angle-brackets,
or HTML comment may be present. Plus folks forget to convert
entities, like C<&lt;> for example.
@@ -100,7 +102,7 @@ a solution:
<IMG SRC = "foo.gif" ALT = "A > B">
- <IMG SRC = "foo.gif"
+ <IMG SRC = "foo.gif"
ALT = "A > B">
<!-- <A comment> -->
@@ -131,12 +133,11 @@ A quick but imperfect approach is
}gsix;
This version does not adjust relative URLs, understand alternate
-bases, deal with HTML comments, deal with HREF and NAME attributes in
-the same tag, or accept URLs themselves as arguments. It also runs
-about 100x faster than a more "complete" solution using the LWP suite
-of modules, such as the
-http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/xurl.gz
-program.
+bases, deal with HTML comments, deal with HREF and NAME attributes
+in the same tag, understand extra qualifiers like TARGET, or accept
+URLs themselves as arguments. It also runs about 100x faster than a
+more "complete" solution using the LWP suite of modules, such as the
+http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/xurl.gz program.
=head2 How do I download a file from the user's machine? How do I open a file on another machine?
@@ -147,7 +148,7 @@ the same as the startform() method.
=head2 How do I make a pop-up menu in HTML?
-Use the B<E<lt>SELECTE<gt>> and B<E<lt>OPTIONE<gt>> tags. The CGI.pm
+Use the B<< <SELECT> >> and B<< <OPTION> >> tags. The CGI.pm
module (available from CPAN) supports this widget, as well as many
others, including some that it cleverly synthesizes on its own.
@@ -159,8 +160,9 @@ on your system, is this:
$html_code = `lynx -source $url`;
$text_data = `lynx -dump $url`;
-The libwww-perl (LWP) modules from CPAN provide a more powerful way to
-do this. They work through proxies, and don't require lynx:
+The libwww-perl (LWP) modules from CPAN provide a more powerful way
+to do this. They don't require lynx, but like lynx, can still work
+through proxies:
# simplest version
use LWP::Simple;
@@ -168,12 +170,12 @@ do this. They work through proxies, and don't require lynx:
# or print HTML from a URL
use LWP::Simple;
- getprint "http://www.sn.no/libwww-perl/";
+ getprint "http://www.linpro.no/lwp/";
# or print ASCII from HTML from a URL
# also need HTML-Tree package from CPAN
use LWP::Simple;
- use HTML::Parse;
+ use HTML::Parser;
use HTML::FormatText;
my ($html, $ascii);
$html = get("http://www.perl.com/");
@@ -213,11 +215,11 @@ Here's an example of decoding:
$string =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge;
Encoding is a bit harder, because you can't just blindly change
-all the non-alphanumeric characters (C<\W>) into their hex escapes.
+all the non-alphanumunder character (C<\W>) into their hex escapes.
It's important that characters with special meaning like C</> and C<?>
I<not> be translated. Probably the easiest way to get this right is
to avoid reinventing the wheel and just use the URI::Escape module,
-which is part of the libwww-perl package (LWP) available from CPAN.
+available from CPAN.
=head2 How do I redirect to another page?
@@ -236,9 +238,21 @@ because of "optimizations" that servers do.
print "Location: $url\n\n";
exit;
-To be correct to the spec, each of those C<"\n">
-should really each be C<"\015\012">, but unless you're
-stuck on MacOS, you probably won't notice.
+To target a particular frame in a frameset, include the "Window-target:"
+in the header.
+
+ print <<EOF;
+ Location: http://www.domain.com/newpage
+ Window-target: <FrameName>
+
+ EOF
+
+To be correct to the spec, each of those virtual newlines should really be
+physical C<"\015\012"> sequences by the time you hit the client browser.
+Except for NPH scripts, though, that local newline should get translated
+by your server into standard form, so you shouldn't have a problem
+here, even if you are stuck on MacOS. Everybody else probably won't
+even notice.
=head2 How do I put a password on my web pages?
@@ -329,7 +343,7 @@ RFC-822 (the mail header standard) compliant, and addresses that aren't
deliverable which are compliant.
Many are tempted to try to eliminate many frequently-invalid
-mail addresses with a simple regexp, such as
+mail addresses with a simple regex, such as
C</^[\w.-]+\@([\w.-]\.)+\w+$/>. It's a very bad idea. However,
this also throws out many valid ones, and says nothing about
potential deliverability, so is not suggested. Instead, see
@@ -382,12 +396,12 @@ format after minor transliterations:
=head2 How do I return the user's mail address?
-On systems that support getpwuid, the $E<lt> variable and the
+On systems that support getpwuid, the $< variable and the
Sys::Hostname module (which is part of the standard perl distribution),
you can probably try using something like this:
use Sys::Hostname;
- $address = sprintf('%s@%s', getpwuid($<), hostname);
+ $address = sprintf('%s@%s', scalar getpwuid($<), hostname);
Company policies on mail address can mean that this generates addresses
that the company's mail system will not accept, so you should ask for
@@ -423,7 +437,12 @@ the message into the queue. This last option means your message won't
be immediately delivered, so leave it out if you want immediate
delivery.
-Or use the CPAN module Mail::Mailer:
+Alternate, less convenient approaches include calling mail (sometimes
+called mailx) directly or simply opening up port 25 have having an
+intimate conversation between just you and the remote SMTP daemon,
+probably sendmail.
+
+Or you might be able use the CPAN module Mail::Mailer:
use Mail::Mailer;
@@ -438,34 +457,17 @@ Or use the CPAN module Mail::Mailer:
The Mail::Internet module uses Net::SMTP which is less Unix-centric than
Mail::Mailer, but less reliable. Avoid raw SMTP commands. There
-are many reasons to use a mail transport agent like sendmail. These
+are many reasons to use a mail transport agent like sendmail. These
include queueing, MX records, and security.
=head2 How do I read mail?
-Use the Mail::Folder module from CPAN (part of the MailFolder package) or
-the Mail::Internet module from CPAN (also part of the MailTools package).
-
- # sending mail
- use Mail::Internet;
- use Mail::Header;
- # say which mail host to use
- $ENV{SMTPHOSTS} = 'mail.frii.com';
- # create headers
- $header = new Mail::Header;
- $header->add('From', 'gnat@frii.com');
- $header->add('Subject', 'Testing');
- $header->add('To', 'gnat@frii.com');
- # create body
- $body = 'This is a test, ignore';
- # create mail object
- $mail = new Mail::Internet(undef, Header => $header, Body => \[$body]);
- # send it
- $mail->smtpsend or die;
-
-Often a module is overkill, though. Here's a mail sorter.
-
- #!/usr/bin/perl
+While you could use the Mail::Folder module from CPAN (part of the
+MailFolder package) or the Mail::Internet module from CPAN (also part
+of the MailTools package), often a module is overkill, though. Here's a
+mail sorter.
+
+ #!/usr/bin/perl
# bysub1 - simple sort by subject
my(@msgs, @sub);
my $msgno = -1;
@@ -476,12 +478,12 @@ Often a module is overkill, though. Here's a mail sorter.
$sub[++$msgno] = lc($1) || '';
}
$msgs[$msgno] .= $_;
- }
+ }
for my $i (sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msgs)) {
print $msgs[$i];
}
-Or more succinctly,
+Or more succinctly,
#!/usr/bin/perl -n00
# bysub2 - awkish sort-by-subject
@@ -541,7 +543,7 @@ All rights reserved.
When included as part of the Standard Version of Perl, or as part of
its complete documentation whether printed or otherwise, this work
-may be distributed only under the terms of Perl's Artistic Licence.
+may be distributed only under the terms of Perl's Artistic License.
Any distribution of this file or derivatives thereof I<outside>
of that package require that special arrangements be made with
copyright holder.
@@ -551,4 +553,3 @@ are hereby placed into the public domain. You are permitted and
encouraged to use this code in your own programs for fun
or for profit as you see fit. A simple comment in the code giving
credit would be courteous but is not required.
-
diff --git a/contrib/perl5/pod/perlfilter.pod b/contrib/perl5/pod/perlfilter.pod
new file mode 100644
index 0000000..c3c8315
--- /dev/null
+++ b/contrib/perl5/pod/perlfilter.pod
@@ -0,0 +1,570 @@
+=head1 NAME
+
+perlfilter - Source Filters
+
+
+=head1 DESCRIPTION
+
+This article is about a little-known feature of Perl called
+I<source filters>. Source filters alter the program text of a module
+before Perl sees it, much as a C preprocessor alters the source text of
+a C program before the compiler sees it. This article tells you more
+about what source filters are, how they work, and how to write your
+own.
+
+The original purpose of source filters was to let you encrypt your
+program source to prevent casual piracy. This isn't all they can do, as
+you'll soon learn. But first, the basics.
+
+=head1 CONCEPTS
+
+Before the Perl interpreter can execute a Perl script, it must first
+read it from a file into memory for parsing and compilation. If that
+script itself includes other scripts with a C<use> or C<require>
+statement, then each of those scripts will have to be read from their
+respective files as well.
+
+Now think of each logical connection between the Perl parser and an
+individual file as a I<source stream>. A source stream is created when
+the Perl parser opens a file, it continues to exist as the source code
+is read into memory, and it is destroyed when Perl is finished parsing
+the file. If the parser encounters a C<require> or C<use> statement in
+a source stream, a new and distinct stream is created just for that
+file.
+
+The diagram below represents a single source stream, with the flow of
+source from a Perl script file on the left into the Perl parser on the
+right. This is how Perl normally operates.
+
+ file -------> parser
+
+There are two important points to remember:
+
+=over 5
+
+=item 1.
+
+Although there can be any number of source streams in existence at any
+given time, only one will be active.
+
+=item 2.
+
+Every source stream is associated with only one file.
+
+=back
+
+A source filter is a special kind of Perl module that intercepts and
+modifies a source stream before it reaches the parser. A source filter
+changes our diagram like this:
+
+ file ----> filter ----> parser
+
+If that doesn't make much sense, consider the analogy of a command
+pipeline. Say you have a shell script stored in the compressed file
+I<trial.gz>. The simple pipeline command below runs the script without
+needing to create a temporary file to hold the uncompressed file.
+
+ gunzip -c trial.gz | sh
+
+In this case, the data flow from the pipeline can be represented as follows:
+
+ trial.gz ----> gunzip ----> sh
+
+With source filters, you can store the text of your script compressed and use a source filter to uncompress it for Perl's parser:
+
+ compressed gunzip
+ Perl program ---> source filter ---> parser
+
+=head1 USING FILTERS
+
+So how do you use a source filter in a Perl script? Above, I said that
+a source filter is just a special kind of module. Like all Perl
+modules, a source filter is invoked with a use statement.
+
+Say you want to pass your Perl source through the C preprocessor before
+execution. You could use the existing C<-P> command line option to do
+this, but as it happens, the source filters distribution comes with a C
+preprocessor filter module called Filter::cpp. Let's use that instead.
+
+Below is an example program, C<cpp_test>, which makes use of this filter.
+Line numbers have been added to allow specific lines to be referenced
+easily.
+
+ 1: use Filter::cpp ;
+ 2: #define TRUE 1
+ 3: $a = TRUE ;
+ 4: print "a = $a\n" ;
+
+When you execute this script, Perl creates a source stream for the
+file. Before the parser processes any of the lines from the file, the
+source stream looks like this:
+
+ cpp_test ---------> parser
+
+Line 1, C<use Filter::cpp>, includes and installs the C<cpp> filter
+module. All source filters work this way. The use statement is compiled
+and executed at compile time, before any more of the file is read, and
+it attaches the cpp filter to the source stream behind the scenes. Now
+the data flow looks like this:
+
+ cpp_test ----> cpp filter ----> parser
+
+As the parser reads the second and subsequent lines from the source
+stream, it feeds those lines through the C<cpp> source filter before
+processing them. The C<cpp> filter simply passes each line through the
+real C preprocessor. The output from the C preprocessor is then
+inserted back into the source stream by the filter.
+
+ .-> cpp --.
+ | |
+ | |
+ | <-'
+ cpp_test ----> cpp filter ----> parser
+
+The parser then sees the following code:
+
+ use Filter::cpp ;
+ $a = 1 ;
+ print "a = $a\n" ;
+
+Let's consider what happens when the filtered code includes another
+module with use:
+
+ 1: use Filter::cpp ;
+ 2: #define TRUE 1
+ 3: use Fred ;
+ 4: $a = TRUE ;
+ 5: print "a = $a\n" ;
+
+The C<cpp> filter does not apply to the text of the Fred module, only
+to the text of the file that used it (C<cpp_test>). Although the use
+statement on line 3 will pass through the cpp filter, the module that
+gets included (C<Fred>) will not. The source streams look like this
+after line 3 has been parsed and before line 4 is parsed:
+
+ cpp_test ---> cpp filter ---> parser (INACTIVE)
+
+ Fred.pm ----> parser
+
+As you can see, a new stream has been created for reading the source
+from C<Fred.pm>. This stream will remain active until all of C<Fred.pm>
+has been parsed. The source stream for C<cpp_test> will still exist,
+but is inactive. Once the parser has finished reading Fred.pm, the
+source stream associated with it will be destroyed. The source stream
+for C<cpp_test> then becomes active again and the parser reads line 4
+and subsequent lines from C<cpp_test>.
+
+You can use more than one source filter on a single file. Similarly,
+you can reuse the same filter in as many files as you like.
+
+For example, if you have a uuencoded and compressed source file, it is
+possible to stack a uudecode filter and an uncompression filter like
+this:
+
+ use Filter::uudecode ; use Filter::uncompress ;
+ M'XL(".H<US4''V9I;F%L')Q;>7/;1I;_>_I3=&E=%:F*I"T?22Q/
+ M6]9*<IQCO*XFT"0[PL%%'Y+IG?WN^ZYN-$'J.[.JE$,20/?K=_[>
+ ...
+
+Once the first line has been processed, the flow will look like this:
+
+ file ---> uudecode ---> uncompress ---> parser
+ filter filter
+
+Data flows through filters in the same order they appear in the source
+file. The uudecode filter appeared before the uncompress filter, so the
+source file will be uudecoded before it's uncompressed.
+
+=head1 WRITING A SOURCE FILTER
+
+There are three ways to write your own source filter. You can write it
+in C, use an external program as a filter, or write the filter in Perl.
+I won't cover the first two in any great detail, so I'll get them out
+of the way first. Writing the filter in Perl is most convenient, so
+I'll devote the most space to it.
+
+=head1 WRITING A SOURCE FILTER IN C
+
+The first of the three available techniques is to write the filter
+completely in C. The external module you create interfaces directly
+with the source filter hooks provided by Perl.
+
+The advantage of this technique is that you have complete control over
+the implementation of your filter. The big disadvantage is the
+increased complexity required to write the filter - not only do you
+need to understand the source filter hooks, but you also need a
+reasonable knowledge of Perl guts. One of the few times it is worth
+going to this trouble is when writing a source scrambler. The
+C<decrypt> filter (which unscrambles the source before Perl parses it)
+included with the source filter distribution is an example of a C
+source filter (see Decryption Filters, below).
+
+
+=over 5
+
+=item B<Decryption Filters>
+
+All decryption filters work on the principle of "security through
+obscurity." Regardless of how well you write a decryption filter and
+how strong your encryption algorithm, anyone determined enough can
+retrieve the original source code. The reason is quite simple - once
+the decryption filter has decrypted the source back to its original
+form, fragments of it will be stored in the computer's memory as Perl
+parses it. The source might only be in memory for a short period of
+time, but anyone possessing a debugger, skill, and lots of patience can
+eventually reconstruct your program.
+
+That said, there are a number of steps that can be taken to make life
+difficult for the potential cracker. The most important: Write your
+decryption filter in C and statically link the decryption module into
+the Perl binary. For further tips to make life difficult for the
+potential cracker, see the file I<decrypt.pm> in the source filters
+module.
+
+=back
+
+=head1 CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE
+
+An alternative to writing the filter in C is to create a separate
+executable in the language of your choice. The separate executable
+reads from standard input, does whatever processing is necessary, and
+writes the filtered data to standard output. C<Filter:cpp> is an
+example of a source filter implemented as a separate executable - the
+executable is the C preprocessor bundled with your C compiler.
+
+The source filter distribution includes two modules that simplify this
+task: C<Filter::exec> and C<Filter::sh>. Both allow you to run any
+external executable. Both use a coprocess to control the flow of data
+into and out of the external executable. (For details on coprocesses,
+see Stephens, W.R. "Advanced Programming in the UNIX Environment."
+Addison-Wesley, ISBN 0-210-56317-7, pages 441-445.) The difference
+between them is that C<Filter::exec> spawns the external command
+directly, while C<Filter::sh> spawns a shell to execute the external
+command. (Unix uses the Bourne shell; NT uses the cmd shell.) Spawning
+a shell allows you to make use of the shell metacharacters and
+redirection facilities.
+
+Here is an example script that uses C<Filter::sh>:
+
+ use Filter::sh 'tr XYZ PQR' ;
+ $a = 1 ;
+ print "XYZ a = $a\n" ;
+
+The output you'll get when the script is executed:
+
+ PQR a = 1
+
+Writing a source filter as a separate executable works fine, but a
+small performance penalty is incurred. For example, if you execute the
+small example above, a separate subprocess will be created to run the
+Unix C<tr> command. Each use of the filter requires its own subprocess.
+If creating subprocesses is expensive on your system, you might want to
+consider one of the other options for creating source filters.
+
+=head1 WRITING A SOURCE FILTER IN PERL
+
+The easiest and most portable option available for creating your own
+source filter is to write it completely in Perl. To distinguish this
+from the previous two techniques, I'll call it a Perl source filter.
+
+To help understand how to write a Perl source filter we need an example
+to study. Here is a complete source filter that performs rot13
+decoding. (Rot13 is a very simple encryption scheme used in Usenet
+postings to hide the contents of offensive posts. It moves every letter
+forward thirteen places, so that A becomes N, B becomes O, and Z
+becomes M.)
+
+
+ package Rot13 ;
+
+ use Filter::Util::Call ;
+
+ sub import {
+ my ($type) = @_ ;
+ my ($ref) = [] ;
+ filter_add(bless $ref) ;
+ }
+
+ sub filter {
+ my ($self) = @_ ;
+ my ($status) ;
+
+ tr/n-za-mN-ZA-M/a-zA-Z/
+ if ($status = filter_read()) > 0 ;
+ $status ;
+ }
+
+ 1;
+
+All Perl source filters are implemented as Perl classes and have the
+same basic structure as the example above.
+
+First, we include the C<Filter::Util::Call> module, which exports a
+number of functions into your filter's namespace. The filter shown
+above uses two of these functions, C<filter_add()> and
+C<filter_read()>.
+
+Next, we create the filter object and associate it with the source
+stream by defining the C<import> function. If you know Perl well
+enough, you know that C<import> is called automatically every time a
+module is included with a use statement. This makes C<import> the ideal
+place to both create and install a filter object.
+
+In the example filter, the object (C<$ref>) is blessed just like any
+other Perl object. Our example uses an anonymous array, but this isn't
+a requirement. Because this example doesn't need to store any context
+information, we could have used a scalar or hash reference just as
+well. The next section demonstrates context data.
+
+The association between the filter object and the source stream is made
+with the C<filter_add()> function. This takes a filter object as a
+parameter (C<$ref> in this case) and installs it in the source stream.
+
+Finally, there is the code that actually does the filtering. For this
+type of Perl source filter, all the filtering is done in a method
+called C<filter()>. (It is also possible to write a Perl source filter
+using a closure. See the C<Filter::Util::Call> manual page for more
+details.) It's called every time the Perl parser needs another line of
+source to process. The C<filter()> method, in turn, reads lines from
+the source stream using the C<filter_read()> function.
+
+If a line was available from the source stream, C<filter_read()>
+returns a status value greater than zero and appends the line to C<$_>.
+A status value of zero indicates end-of-file, less than zero means an
+error. The filter function itself is expected to return its status in
+the same way, and put the filtered line it wants written to the source
+stream in C<$_>. The use of C<$_> accounts for the brevity of most Perl
+source filters.
+
+In order to make use of the rot13 filter we need some way of encoding
+the source file in rot13 format. The script below, C<mkrot13>, does
+just that.
+
+ die "usage mkrot13 filename\n" unless @ARGV ;
+ my $in = $ARGV[0] ;
+ my $out = "$in.tmp" ;
+ open(IN, "<$in") or die "Cannot open file $in: $!\n";
+ open(OUT, ">$out") or die "Cannot open file $out: $!\n";
+
+ print OUT "use Rot13;\n" ;
+ while (<IN>) {
+ tr/a-zA-Z/n-za-mN-ZA-M/ ;
+ print OUT ;
+ }
+
+ close IN;
+ close OUT;
+ unlink $in;
+ rename $out, $in;
+
+If we encrypt this with C<mkrot13>:
+
+ print " hello fred \n" ;
+
+the result will be this:
+
+ use Rot13;
+ cevag "uryyb serq\a" ;
+
+Running it produces this output:
+
+ hello fred
+
+=head1 USING CONTEXT: THE DEBUG FILTER
+
+The rot13 example was a trivial example. Here's another demonstration
+that shows off a few more features.
+
+Say you wanted to include a lot of debugging code in your Perl script
+during development, but you didn't want it available in the released
+product. Source filters offer a solution. In order to keep the example
+simple, let's say you wanted the debugging output to be controlled by
+an environment variable, C<DEBUG>. Debugging code is enabled if the
+variable exists, otherwise it is disabled.
+
+Two special marker lines will bracket debugging code, like this:
+
+ ## DEBUG_BEGIN
+ if ($year > 1999) {
+ warn "Debug: millennium bug in year $year\n" ;
+ }
+ ## DEBUG_END
+
+When the C<DEBUG> environment variable exists, the filter ensures that
+Perl parses only the code between the C<DEBUG_BEGIN> and C<DEBUG_END>
+markers. That means that when C<DEBUG> does exist, the code above
+should be passed through the filter unchanged. The marker lines can
+also be passed through as-is, because the Perl parser will see them as
+comment lines. When C<DEBUG> isn't set, we need a way to disable the
+debug code. A simple way to achieve that is to convert the lines
+between the two markers into comments:
+
+ ## DEBUG_BEGIN
+ #if ($year > 1999) {
+ # warn "Debug: millennium bug in year $year\n" ;
+ #}
+ ## DEBUG_END
+
+Here is the complete Debug filter:
+
+ package Debug;
+
+ use strict;
+ use warnings;
+ use Filter::Util::Call ;
+
+ use constant TRUE => 1 ;
+ use constant FALSE => 0 ;
+
+ sub import {
+ my ($type) = @_ ;
+ my (%context) = (
+ Enabled => defined $ENV{DEBUG},
+ InTraceBlock => FALSE,
+ Filename => (caller)[1],
+ LineNo => 0,
+ LastBegin => 0,
+ ) ;
+ filter_add(bless \%context) ;
+ }
+
+ sub Die {
+ my ($self) = shift ;
+ my ($message) = shift ;
+ my ($line_no) = shift || $self->{LastBegin} ;
+ die "$message at $self->{Filename} line $line_no.\n"
+ }
+
+ sub filter {
+ my ($self) = @_ ;
+ my ($status) ;
+ $status = filter_read() ;
+ ++ $self->{LineNo} ;
+
+ # deal with EOF/error first
+ if ($status <= 0) {
+ $self->Die("DEBUG_BEGIN has no DEBUG_END")
+ if $self->{InTraceBlock} ;
+ return $status ;
+ }
+
+ if ($self->{InTraceBlock}) {
+ if (/^\s*##\s*DEBUG_BEGIN/ ) {
+ $self->Die("Nested DEBUG_BEGIN", $self->{LineNo})
+ } elsif (/^\s*##\s*DEBUG_END/) {
+ $self->{InTraceBlock} = FALSE ;
+ }
+
+ # comment out the debug lines when the filter is disabled
+ s/^/#/ if ! $self->{Enabled} ;
+ } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) {
+ $self->{InTraceBlock} = TRUE ;
+ $self->{LastBegin} = $self->{LineNo} ;
+ } elsif ( /^\s*##\s*DEBUG_END/ ) {
+ $self->Die("DEBUG_END has no DEBUG_BEGIN", $self->{LineNo});
+ }
+ return $status ;
+ }
+
+ 1 ;
+
+The big difference between this filter and the previous example is the
+use of context data in the filter object. The filter object is based on
+a hash reference, and is used to keep various pieces of context
+information between calls to the filter function. All but two of the
+hash fields are used for error reporting. The first of those two,
+Enabled, is used by the filter to determine whether the debugging code
+should be given to the Perl parser. The second, InTraceBlock, is true
+when the filter has encountered a C<DEBUG_BEGIN> line, but has not yet
+encountered the following C<DEBUG_END> line.
+
+If you ignore all the error checking that most of the code does, the
+essence of the filter is as follows:
+
+ sub filter {
+ my ($self) = @_ ;
+ my ($status) ;
+ $status = filter_read() ;
+
+ # deal with EOF/error first
+ return $status if $status <= 0 ;
+ if ($self->{InTraceBlock}) {
+ if (/^\s*##\s*DEBUG_END/) {
+ $self->{InTraceBlock} = FALSE
+ }
+
+ # comment out debug lines when the filter is disabled
+ s/^/#/ if ! $self->{Enabled} ;
+ } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) {
+ $self->{InTraceBlock} = TRUE ;
+ }
+ return $status ;
+ }
+
+Be warned: just as the C-preprocessor doesn't know C, the Debug filter
+doesn't know Perl. It can be fooled quite easily:
+
+ print <<EOM;
+ ##DEBUG_BEGIN
+ EOM
+
+Such things aside, you can see that a lot can be achieved with a modest
+amount of code.
+
+=head1 CONCLUSION
+
+You now have better understanding of what a source filter is, and you
+might even have a possible use for them. If you feel like playing with
+source filters but need a bit of inspiration, here are some extra
+features you could add to the Debug filter.
+
+First, an easy one. Rather than having debugging code that is
+all-or-nothing, it would be much more useful to be able to control
+which specific blocks of debugging code get included. Try extending the
+syntax for debug blocks to allow each to be identified. The contents of
+the C<DEBUG> environment variable can then be used to control which
+blocks get included.
+
+Once you can identify individual blocks, try allowing them to be
+nested. That isn't difficult either.
+
+Here is a interesting idea that doesn't involve the Debug filter.
+Currently Perl subroutines have fairly limited support for formal
+parameter lists. You can specify the number of parameters and their
+type, but you still have to manually take them out of the C<@_> array
+yourself. Write a source filter that allows you to have a named
+parameter list. Such a filter would turn this:
+
+ sub MySub ($first, $second, @rest) { ... }
+
+into this:
+
+ sub MySub($$@) {
+ my ($first) = shift ;
+ my ($second) = shift ;
+ my (@rest) = @_ ;
+ ...
+ }
+
+Finally, if you feel like a real challenge, have a go at writing a
+full-blown Perl macro preprocessor as a source filter. Borrow the
+useful features from the C preprocessor and any other macro processors
+you know. The tricky bit will be choosing how much knowledge of Perl's
+syntax you want your filter to have.
+
+=head1 REQUIREMENTS
+
+The Source Filters distribution is available on CPAN, in
+
+ CPAN/modules/by-module/Filter
+
+=head1 AUTHOR
+
+Paul Marquess E<lt>Paul.Marquess@btinternet.comE<gt>
+
+=head1 Copyrights
+
+This article originally appeared in The Perl Journal #11, and is
+copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and
+The Perl Journal. This document may be distributed under the same terms
+as Perl itself.
diff --git a/contrib/perl5/pod/perlfork.pod b/contrib/perl5/pod/perlfork.pod
new file mode 100644
index 0000000..d930e93
--- /dev/null
+++ b/contrib/perl5/pod/perlfork.pod
@@ -0,0 +1,301 @@
+=head1 NAME
+
+perlfork - Perl's fork() emulation
+
+=head1 SYNOPSIS
+
+Perl provides a fork() keyword that corresponds to the Unix system call
+of the same name. On most Unix-like platforms where the fork() system
+call is available, Perl's fork() simply calls it.
+
+On some platforms such as Windows where the fork() system call is not
+available, Perl can be built to emulate fork() at the interpreter level.
+While the emulation is designed to be as compatible as possible with the
+real fork() at the the level of the Perl program, there are certain
+important differences that stem from the fact that all the pseudo child
+"processes" created this way live in the same real process as far as the
+operating system is concerned.
+
+This document provides a general overview of the capabilities and
+limitations of the fork() emulation. Note that the issues discussed here
+are not applicable to platforms where a real fork() is available and Perl
+has been configured to use it.
+
+=head1 DESCRIPTION
+
+The fork() emulation is implemented at the level of the Perl interpreter.
+What this means in general is that running fork() will actually clone the
+running interpreter and all its state, and run the cloned interpreter in
+a separate thread, beginning execution in the new thread just after the
+point where the fork() was called in the parent. We will refer to the
+thread that implements this child "process" as the pseudo-process.
+
+To the Perl program that called fork(), all this is designed to be
+transparent. The parent returns from the fork() with a pseudo-process
+ID that can be subsequently used in any process manipulation functions;
+the child returns from the fork() with a value of C<0> to signify that
+it is the child pseudo-process.
+
+=head2 Behavior of other Perl features in forked pseudo-processes
+
+Most Perl features behave in a natural way within pseudo-processes.
+
+=over 8
+
+=item $$ or $PROCESS_ID
+
+This special variable is correctly set to the pseudo-process ID.
+It can be used to identify pseudo-processes within a particular
+session. Note that this value is subject to recycling if any
+pseudo-processes are launched after others have been wait()-ed on.
+
+=item %ENV
+
+Each pseudo-process maintains its own virtual enviroment. Modifications
+to %ENV affect the virtual environment, and are only visible within that
+pseudo-process, and in any processes (or pseudo-processes) launched from
+it.
+
+=item chdir() and all other builtins that accept filenames
+
+Each pseudo-process maintains its own virtual idea of the current directory.
+Modifications to the current directory using chdir() are only visible within
+that pseudo-process, and in any processes (or pseudo-processes) launched from
+it. All file and directory accesses from the pseudo-process will correctly
+map the virtual working directory to the real working directory appropriately.
+
+=item wait() and waitpid()
+
+wait() and waitpid() can be passed a pseudo-process ID returned by fork().
+These calls will properly wait for the termination of the pseudo-process
+and return its status.
+
+=item kill()
+
+kill() can be used to terminate a pseudo-process by passing it the ID returned
+by fork(). This should not be used except under dire circumstances, because
+the operating system may not guarantee integrity of the process resources
+when a running thread is terminated. Note that using kill() on a
+pseudo-process() may typically cause memory leaks, because the thread that
+implements the pseudo-process does not get a chance to clean up its resources.
+
+=item exec()
+
+Calling exec() within a pseudo-process actually spawns the requested
+executable in a separate process and waits for it to complete before
+exiting with the same exit status as that process. This means that the
+process ID reported within the running executable will be different from
+what the earlier Perl fork() might have returned. Similarly, any process
+manipulation functions applied to the ID returned by fork() will affect the
+waiting pseudo-process that called exec(), not the real process it is
+waiting for after the exec().
+
+=item exit()
+
+exit() always exits just the executing pseudo-process, after automatically
+wait()-ing for any outstanding child pseudo-processes. Note that this means
+that the process as a whole will not exit unless all running pseudo-processes
+have exited.
+
+=item Open handles to files, directories and network sockets
+
+All open handles are dup()-ed in pseudo-processes, so that closing
+any handles in one process does not affect the others. See below for
+some limitations.
+
+=back
+
+=head2 Resource limits
+
+In the eyes of the operating system, pseudo-processes created via the fork()
+emulation are simply threads in the same process. This means that any
+process-level limits imposed by the operating system apply to all
+pseudo-processes taken together. This includes any limits imposed by the
+operating system on the number of open file, directory and socket handles,
+limits on disk space usage, limits on memory size, limits on CPU utilization
+etc.
+
+=head2 Killing the parent process
+
+If the parent process is killed (either using Perl's kill() builtin, or
+using some external means) all the pseudo-processes are killed as well,
+and the whole process exits.
+
+=head2 Lifetime of the parent process and pseudo-processes
+
+During the normal course of events, the parent process and every
+pseudo-process started by it will wait for their respective pseudo-children
+to complete before they exit. This means that the parent and every
+pseudo-child created by it that is also a pseudo-parent will only exit
+after their pseudo-children have exited.
+
+A way to mark a pseudo-processes as running detached from their parent (so
+that the parent would not have to wait() for them if it doesn't want to)
+will be provided in future.
+
+=head2 CAVEATS AND LIMITATIONS
+
+=over 8
+
+=item BEGIN blocks
+
+The fork() emulation will not work entirely correctly when called from
+within a BEGIN block. The forked copy will run the contents of the
+BEGIN block, but will not continue parsing the source stream after the
+BEGIN block. For example, consider the following code:
+
+ BEGIN {
+ fork and exit; # fork child and exit the parent
+ print "inner\n";
+ }
+ print "outer\n";
+
+This will print:
+
+ inner
+
+rather than the expected:
+
+ inner
+ outer
+
+This limitation arises from fundamental technical difficulties in
+cloning and restarting the stacks used by the Perl parser in the
+middle of a parse.
+
+=item Open filehandles
+
+Any filehandles open at the time of the fork() will be dup()-ed. Thus,
+the files can be closed independently in the parent and child, but beware
+that the dup()-ed handles will still share the same seek pointer. Changing
+the seek position in the parent will change it in the child and vice-versa.
+One can avoid this by opening files that need distinct seek pointers
+separately in the child.
+
+=item Forking pipe open() not yet implemented
+
+The C<open(FOO, "|-")> and C<open(BAR, "-|")> constructs are not yet
+implemented. This limitation can be easily worked around in new code
+by creating a pipe explicitly. The following example shows how to
+write to a forked child:
+
+ # simulate open(FOO, "|-")
+ sub pipe_to_fork ($) {
+ my $parent = shift;
+ pipe my $child, $parent or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ if ($pid) {
+ close $child;
+ }
+ else {
+ close $parent;
+ open(STDIN, "<&=" . fileno($child)) or die;
+ }
+ $pid;
+ }
+
+ if (pipe_to_fork('FOO')) {
+ # parent
+ print FOO "pipe_to_fork\n";
+ close FOO;
+ }
+ else {
+ # child
+ while (<STDIN>) { print; }
+ close STDIN;
+ exit(0);
+ }
+
+And this one reads from the child:
+
+ # simulate open(FOO, "-|")
+ sub pipe_from_fork ($) {
+ my $parent = shift;
+ pipe $parent, my $child or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ if ($pid) {
+ close $child;
+ }
+ else {
+ close $parent;
+ open(STDOUT, ">&=" . fileno($child)) or die;
+ }
+ $pid;
+ }
+
+ if (pipe_from_fork('BAR')) {
+ # parent
+ while (<BAR>) { print; }
+ close BAR;
+ }
+ else {
+ # child
+ print "pipe_from_fork\n";
+ close STDOUT;
+ exit(0);
+ }
+
+Forking pipe open() constructs will be supported in future.
+
+=item Global state maintained by XSUBs
+
+External subroutines (XSUBs) that maintain their own global state may
+not work correctly. Such XSUBs will either need to maintain locks to
+protect simultaneous access to global data from different pseudo-processes,
+or maintain all their state on the Perl symbol table, which is copied
+naturally when fork() is called. A callback mechanism that provides
+extensions an opportunity to clone their state will be provided in the
+near future.
+
+=item Interpreter embedded in larger application
+
+The fork() emulation may not behave as expected when it is executed in an
+application which embeds a Perl interpreter and calls Perl APIs that can
+evaluate bits of Perl code. This stems from the fact that the emulation
+only has knowledge about the Perl interpreter's own data structures and
+knows nothing about the containing application's state. For example, any
+state carried on the application's own call stack is out of reach.
+
+=item Thread-safety of extensions
+
+Since the fork() emulation runs code in multiple threads, extensions
+calling into non-thread-safe libraries may not work reliably when
+calling fork(). As Perl's threading support gradually becomes more
+widely adopted even on platforms with a native fork(), such extensions
+are expected to be fixed for thread-safety.
+
+=back
+
+=head1 BUGS
+
+=over 8
+
+=item *
+
+Having pseudo-process IDs be negative integers breaks down for the integer
+C<-1> because the wait() and waitpid() functions treat this number as
+being special. The tacit assumption in the current implementation is that
+the system never allocates a thread ID of C<1> for user threads. A better
+representation for pseudo-process IDs will be implemented in future.
+
+=item *
+
+This document may be incomplete in some respects.
+
+=back
+
+=head1 AUTHOR
+
+Support for concurrent interpreters and the fork() emulation was implemented
+by ActiveState, with funding from Microsoft Corporation.
+
+This document is authored and maintained by Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>.
+
+=head1 SEE ALSO
+
+L<perlfunc/"fork">, L<perlipc>
+
+=cut
diff --git a/contrib/perl5/pod/perlfunc.pod b/contrib/perl5/pod/perlfunc.pod
index 5fb7863..5396fd1 100644
--- a/contrib/perl5/pod/perlfunc.pod
+++ b/contrib/perl5/pod/perlfunc.pod
@@ -30,7 +30,7 @@ Elements of the LIST should be separated by commas.
Any function in the list below may be used either with or without
parentheses around its arguments. (The syntax descriptions omit the
parentheses.) If you use the parentheses, the simple (but occasionally
-surprising) rule is this: It I<LOOKS> like a function, therefore it I<IS> a
+surprising) rule is this: It I<looks> like a function, therefore it I<is> a
function, and precedence doesn't matter. Otherwise it's a list
operator or unary operator, and precedence does matter. And whitespace
between the function and left parenthesis doesn't count--so you need to
@@ -80,8 +80,8 @@ In general, functions in Perl that serve as wrappers for system calls
of the same name (like chown(2), fork(2), closedir(2), etc.) all return
true when they succeed and C<undef> otherwise, as is usually mentioned
in the descriptions below. This is different from the C interfaces,
-which return C<-1> on failure. Exceptions to this rule are C<wait()>,
-C<waitpid()>, and C<syscall()>. System calls also set the special C<$!>
+which return C<-1> on failure. Exceptions to this rule are C<wait>,
+C<waitpid>, and C<syscall>. System calls also set the special C<$!>
variable on failure. Other functions do not, except accidentally.
=head2 Perl Functions by Category
@@ -255,7 +255,7 @@ A file test, where X is one of the letters listed below. This unary
operator takes one argument, either a filename or a filehandle, and
tests the associated file to see if something is true about it. If the
argument is omitted, tests C<$_>, except for C<-t>, which tests STDIN.
-Unless otherwise documented, it returns C<1> for TRUE and C<''> for FALSE, or
+Unless otherwise documented, it returns C<1> for true and C<''> for false, or
the undefined value if the file doesn't exist. Despite the funny
names, precedence is the same as any other named unary operator, and
the argument may be parenthesized like any other unary operator. The
@@ -290,8 +290,8 @@ X<-S>X<-b>X<-c>X<-t>X<-u>X<-g>X<-k>X<-T>X<-B>X<-M>X<-A>X<-C>
-g File has setgid bit set.
-k File has sticky bit set.
- -T File is a text file.
- -B File is a binary file (opposite of -T).
+ -T File is an ASCII text file.
+ -B File is a "binary" file (opposite of -T).
-M Age of file in days when script started.
-A Same for access time.
@@ -319,22 +319,32 @@ if any execute bit is set in the mode. Scripts run by the superuser
may thus need to do a stat() to determine the actual mode of the file,
or temporarily set their effective uid to something else.
+If you are using ACLs, there is a pragma called C<filetest> that may
+produce more accurate results than the bare stat() mode bits.
+When under the C<use filetest 'access'> the above-mentioned filetests
+will test whether the permission can (not) be granted using the
+access() family of system calls. Also note that the C<-x> and C<-X> may
+under this pragma return true even if there are no execute permission
+bits set (nor any extra execute permission ACLs). This strangeness is
+due to the underlying system calls' definitions. Read the
+documentation for the C<filetest> pragma for more information.
+
Note that C<-s/a/b/> does not do a negated substitution. Saying
C<-exp($foo)> still works as expected, however--only single letters
following a minus are interpreted as file tests.
The C<-T> and C<-B> switches work as follows. The first block or so of the
file is examined for odd characters such as strange control codes or
-characters with the high bit set. If too many strange characters (E<gt>30%)
+characters with the high bit set. If too many strange characters (>30%)
are found, it's a C<-B> file, otherwise it's a C<-T> file. Also, any file
containing null in the first block is considered a binary file. If C<-T>
or C<-B> is used on a filehandle, the current stdio buffer is examined
-rather than the first block. Both C<-T> and C<-B> return TRUE on a null
+rather than the first block. Both C<-T> and C<-B> return true on a null
file, or a file at EOF when testing a filehandle. Because you have to
read a file to do the C<-T> test, on most occasions you want to use a C<-f>
against the file first, as in C<next unless -f $file && -T $file>.
-If any of the file tests (or either the C<stat()> or C<lstat()> operators) are given
+If any of the file tests (or either the C<stat> or C<lstat> operators) are given
the special filehandle consisting of a solitary underline, then the stat
structure of the previous file test (or stat operator) is used, saving
a system call. (This doesn't work with C<-t>, and you need to remember
@@ -363,9 +373,13 @@ If VALUE is omitted, uses C<$_>.
=item accept NEWSOCKET,GENERICSOCKET
Accepts an incoming socket connect, just as the accept(2) system call
-does. Returns the packed address if it succeeded, FALSE otherwise.
+does. Returns the packed address if it succeeded, false otherwise.
See the example in L<perlipc/"Sockets: Client/Server Communication">.
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor, as determined by the
+value of $^F. See L<perlvar/$^F>.
+
=item alarm SECONDS
=item alarm
@@ -381,18 +395,18 @@ starting a new one. The returned value is the amount of time remaining
on the previous timer.
For delays of finer granularity than one second, you may use Perl's
-four-arugment version of select() leaving the first three arguments
-undefined, or you might be able to use the C<syscall()> interface to
+four-argument version of select() leaving the first three arguments
+undefined, or you might be able to use the C<syscall> interface to
access setitimer(2) if your system supports it. The Time::HiRes module
from CPAN may also prove useful.
-It is usually a mistake to intermix C<alarm()>
-and C<sleep()> calls.
+It is usually a mistake to intermix C<alarm> and C<sleep> calls.
+(C<sleep> may be internally implemented in your system with C<alarm>)
-If you want to use C<alarm()> to time out a system call you need to use an
-C<eval()>/C<die()> pair. You can't rely on the alarm causing the system call to
+If you want to use C<alarm> to time out a system call you need to use an
+C<eval>/C<die> pair. You can't rely on the alarm causing the system call to
fail with C<$!> set to C<EINTR> because Perl sets up signal handlers to
-restart system calls on some systems. Using C<eval()>/C<die()> always works,
+restart system calls on some systems. Using C<eval>/C<die> always works,
modulo the caveats given in L<perlipc/"Signals">.
eval {
@@ -413,7 +427,7 @@ modulo the caveats given in L<perlipc/"Signals">.
Returns the arctangent of Y/X in the range -PI to PI.
-For the tangent operation, you may use the C<POSIX::tan()>
+For the tangent operation, you may use the C<Math::Trig::tan>
function, or use the familiar relation:
sub tan { sin($_[0]) / cos($_[0]) }
@@ -421,29 +435,67 @@ function, or use the familiar relation:
=item bind SOCKET,NAME
Binds a network address to a socket, just as the bind system call
-does. Returns TRUE if it succeeded, FALSE otherwise. NAME should be a
+does. Returns true if it succeeded, false otherwise. NAME should be a
packed address of the appropriate type for the socket. See the examples in
L<perlipc/"Sockets: Client/Server Communication">.
+=item binmode FILEHANDLE, DISCIPLINE
+
=item binmode FILEHANDLE
-Arranges for the file to be read or written in "binary" mode in operating
-systems that distinguish between binary and text files. Files that
-are not in binary mode have CR LF sequences translated to LF on input
-and LF translated to CR LF on output. Binmode has no effect under
-many sytems, but in MS-DOS and similarly archaic systems, it may be
-imperative--otherwise your MS-DOS-damaged C library may mangle your file.
-The key distinction between systems that need C<binmode()> and those
-that don't is their text file formats. Systems like Unix, MacOS, and
-Plan9 that delimit lines with a single character, and that encode that
-character in C as C<"\n">, do not need C<binmode()>. The rest may need it.
-If FILEHANDLE is an expression, the value is taken as the name of the
-filehandle.
-
-If the system does care about it, using it when you shouldn't is just as
-perilous as failing to use it when you should. Fortunately for most of
-us, you can't go wrong using binmode() on systems that don't care about
-it, though.
+Arranges for FILEHANDLE to be read or written in "binary" or "text" mode
+on systems where the run-time libraries distinguish between binary and
+text files. If FILEHANDLE is an expression, the value is taken as the
+name of the filehandle. DISCIPLINE can be either of C<":raw"> for
+binary mode or C<":crlf"> for "text" mode. If the DISCIPLINE is
+omitted, it defaults to C<":raw">.
+
+binmode() should be called after open() but before any I/O is done on
+the filehandle.
+
+On many systems binmode() currently has no effect, but in future, it
+will be extended to support user-defined input and output disciplines.
+On some systems binmode() is necessary when you're not working with a
+text file. For the sake of portability it is a good idea to always use
+it when appropriate, and to never use it when it isn't appropriate.
+
+In other words: Regardless of platform, use binmode() on binary
+files, and do not use binmode() on text files.
+
+The C<open> pragma can be used to establish default disciplines.
+See L<open>.
+
+The operating system, device drivers, C libraries, and Perl run-time
+system all work together to let the programmer treat a single
+character (C<\n>) as the line terminator, irrespective of the external
+representation. On many operating systems, the native text file
+representation matches the internal representation, but on some
+platforms the external representation of C<\n> is made up of more than
+one character.
+
+Mac OS and all variants of Unix use a single character to end each line
+in the external representation of text (even though that single
+character is not necessarily the same across these platforms).
+Consequently binmode() has no effect on these operating systems. In
+other systems like VMS, MS-DOS and the various flavors of MS-Windows
+your program sees a C<\n> as a simple C<\cJ>, but what's stored in text
+files are the two characters C<\cM\cJ>. That means that, if you don't
+use binmode() on these systems, C<\cM\cJ> sequences on disk will be
+converted to C<\n> on input, and any C<\n> in your program will be
+converted back to C<\cM\cJ> on output. This is what you want for text
+files, but it can be disastrous for binary files.
+
+Another consequence of using binmode() (on some systems) is that
+special end-of-file markers will be seen as part of the data stream.
+For systems from the Microsoft family this means that if your binary
+data contains C<\cZ>, the I/O subsystem will ragard it as the end of
+the file, unless you use binmode().
+
+binmode() is not only important for readline() and print() operations,
+but also when using read(), seek(), sysread(), syswrite() and tell()
+(see L<perlport> for more details). See the C<$/> and C<$\> variables
+in L<perlvar> for how to manually set your input and output
+line-termination sequences.
=item bless REF,CLASSNAME
@@ -451,7 +503,7 @@ it, though.
This function tells the thingy referenced by REF that it is now an object
in the CLASSNAME package. If CLASSNAME is omitted, the current package
-is used. Because a C<bless()> is often the last thing in a constructor.
+is used. Because a C<bless> is often the last thing in a constructor,
it returns the reference for convenience. Always use the two-argument
version if the function doing the blessing might be inherited by a
derived class. See L<perltoot> and L<perlobj> for more about the blessing
@@ -471,7 +523,7 @@ See L<perlmod/"Perl Modules">.
Returns the context of the current subroutine call. In scalar context,
returns the caller's package name if there is a caller, that is, if
-we're in a subroutine or C<eval()> or C<require()>, and the undefined value
+we're in a subroutine or C<eval> or C<require>, and the undefined value
otherwise. In list context, returns
($package, $filename, $line) = caller;
@@ -480,33 +532,37 @@ With EXPR, it returns some extra information that the debugger uses to
print a stack trace. The value of EXPR indicates how many call frames
to go back before the current one.
- ($package, $filename, $line, $subroutine,
- $hasargs, $wantarray, $evaltext, $is_require) = caller($i);
+ ($package, $filename, $line, $subroutine, $hasargs,
+ $wantarray, $evaltext, $is_require, $hints, $bitmask) = caller($i);
-Here C<$subroutine> may be C<"(eval)"> if the frame is not a subroutine
-call, but an C<eval()>. In such a case additional elements C<$evaltext> and
+Here $subroutine may be C<(eval)> if the frame is not a subroutine
+call, but an C<eval>. In such a case additional elements $evaltext and
C<$is_require> are set: C<$is_require> is true if the frame is created by a
-C<require> or C<use> statement, C<$evaltext> contains the text of the
+C<require> or C<use> statement, $evaltext contains the text of the
C<eval EXPR> statement. In particular, for a C<eval BLOCK> statement,
-C<$filename> is C<"(eval)">, but C<$evaltext> is undefined. (Note also that
+$filename is C<(eval)>, but $evaltext is undefined. (Note also that
each C<use> statement creates a C<require> frame inside an C<eval EXPR>)
-frame.
+frame. C<$hints> and C<$bitmask> contain pragmatic hints that the caller
+was compiled with. The C<$hints> and C<$bitmask> values are subject to
+change between versions of Perl, and are not meant for external use.
Furthermore, when called from within the DB package, caller returns more
detailed information: it sets the list variable C<@DB::args> to be the
arguments with which the subroutine was invoked.
Be aware that the optimizer might have optimized call frames away before
-C<caller()> had a chance to get the information. That means that C<caller(N)>
+C<caller> had a chance to get the information. That means that C<caller(N)>
might not return information about the call frame you expect it do, for
-C<N E<gt> 1>. In particular, C<@DB::args> might have information from the
-previous time C<caller()> was called.
+C<< N > 1 >>. In particular, C<@DB::args> might have information from the
+previous time C<caller> was called.
=item chdir EXPR
Changes the working directory to EXPR, if possible. If EXPR is omitted,
-changes to the user's home directory. Returns TRUE upon success,
-FALSE otherwise. See the example under C<die()>.
+changes to the directory specified by C<$ENV{HOME}>, if set; if not,
+changes to the directory specified by C<$ENV{LOGDIR}>. If neither is
+set, C<chdir> does nothing. It returns true upon success, false
+otherwise. See the example under C<die>.
=item chmod LIST
@@ -523,6 +579,14 @@ successfully changed. See also L</oct>, if all you have is a string.
$mode = '0644'; chmod oct($mode), 'foo'; # this is better
$mode = 0644; chmod $mode, 'foo'; # this is best
+You can also import the symbolic C<S_I*> constants from the Fcntl
+module:
+
+ use Fcntl ':mode';
+
+ chmod S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, @executables;
+ # This is identical to the chmod 0755 of the above example.
+
=item chomp VARIABLE
=item chomp LIST
@@ -536,6 +600,9 @@ number of characters removed from all its arguments. It's often used to
remove the newline from the end of an input record when you're worried
that the final record may be missing its newline. When in paragraph
mode (C<$/ = "">), it removes all trailing newlines from the string.
+When in slurp mode (C<$/ = undef>) or fixed-length record mode (C<$/> is
+a reference to an integer or the like, see L<perlvar>) chomp() won't
+remove anything.
If VARIABLE is omitted, it chomps C<$_>. Example:
while (<>) {
@@ -576,16 +643,18 @@ You can actually chop anything that's an lvalue, including an assignment:
chop($answer = <STDIN>);
If you chop a list, each element is chopped. Only the value of the
-last C<chop()> is returned.
+last C<chop> is returned.
-Note that C<chop()> returns the last character. To return all but the last
+Note that C<chop> returns the last character. To return all but the last
character, use C<substr($string, 0, -1)>.
=item chown LIST
Changes the owner (and group) of a list of files. The first two
-elements of the list must be the I<NUMERICAL> uid and gid, in that order.
-Returns the number of files successfully changed.
+elements of the list must be the I<numeric> uid and gid, in that
+order. A value of -1 in either position is interpreted by most
+systems to leave that value unchanged. Returns the number of files
+successfully changed.
$cnt = chown $uid, $gid, 'foo', 'bar';
chown $uid, $gid, @filenames;
@@ -593,9 +662,9 @@ Returns the number of files successfully changed.
Here's an example that looks up nonnumeric uids in the passwd file:
print "User: ";
- chop($user = <STDIN>);
+ chomp($user = <STDIN>);
print "Files: ";
- chop($pattern = <STDIN>);
+ chomp($pattern = <STDIN>);
($login,$pass,$uid,$gid) = getpwnam($user)
or die "$user not in passwd file";
@@ -607,13 +676,20 @@ On most systems, you are not allowed to change the ownership of the
file unless you're the superuser, although you should be able to change
the group to any of your secondary groups. On insecure systems, these
restrictions may be relaxed, but this is not a portable assumption.
+On POSIX systems, you can detect this condition this way:
+
+ use POSIX qw(sysconf _PC_CHOWN_RESTRICTED);
+ $can_chown_giveaway = not sysconf(_PC_CHOWN_RESTRICTED);
=item chr NUMBER
=item chr
Returns the character represented by that NUMBER in the character set.
-For example, C<chr(65)> is C<"A"> in ASCII. For the reverse, use L</ord>.
+For example, C<chr(65)> is C<"A"> in either ASCII or Unicode, and
+chr(0x263a) is a Unicode smiley face (but only within the scope of
+a C<use utf8>). For the reverse, use L</ord>.
+See L<utf8> for more about Unicode.
If NUMBER is omitted, uses C<$_>.
@@ -623,33 +699,38 @@ If NUMBER is omitted, uses C<$_>.
This function works like the system call by the same name: it makes the
named directory the new root directory for all further pathnames that
-begin with a C<"/"> by your process and all its children. (It doesn't
+begin with a C</> by your process and all its children. (It doesn't
change your current working directory, which is unaffected.) For security
reasons, this call is restricted to the superuser. If FILENAME is
-omitted, does a C<chroot()> to C<$_>.
+omitted, does a C<chroot> to C<$_>.
=item close FILEHANDLE
=item close
-Closes the file or pipe associated with the file handle, returning TRUE
+Closes the file or pipe associated with the file handle, returning true
only if stdio successfully flushes buffers and closes the system file
-descriptor. Closes the currently selected filehandle if the argument
+descriptor. Closes the currently selected filehandle if the argument
is omitted.
You don't have to close FILEHANDLE if you are immediately going to do
-another C<open()> on it, because C<open()> will close it for you. (See
-C<open()>.) However, an explicit C<close()> on an input file resets the line
-counter (C<$.>), while the implicit close done by C<open()> does not.
+another C<open> on it, because C<open> will close it for you. (See
+C<open>.) However, an explicit C<close> on an input file resets the line
+counter (C<$.>), while the implicit close done by C<open> does not.
-If the file handle came from a piped open C<close()> will additionally
-return FALSE if one of the other system calls involved fails or if the
+If the file handle came from a piped open C<close> will additionally
+return false if one of the other system calls involved fails or if the
program exits with non-zero status. (If the only problem was that the
program exited non-zero C<$!> will be set to C<0>.) Closing a pipe
also waits for the process executing on the pipe to complete, in case you
want to look at the output of the pipe afterwards, and
implicitly puts the exit status value of that command into C<$?>.
+Prematurely closing the read end of a pipe (i.e. before the process
+writing to it at the other end has closed it) will result in a
+SIGPIPE being delivered to the writer. If the other end can't
+handle that, be sure to read all the data before closing the pipe.
+
Example:
open(OUTPUT, '|sort >foo') # pipe to sort
@@ -666,7 +747,7 @@ filehandle, usually the real filehandle name.
=item closedir DIRHANDLE
-Closes a directory opened by C<opendir()> and returns the success of that
+Closes a directory opened by C<opendir> and returns the success of that
system call.
DIRHANDLE may be an expression whose value can be used as an indirect
@@ -675,7 +756,7 @@ dirhandle, usually the real dirhandle name.
=item connect SOCKET,NAME
Attempts to connect to a remote socket, just as the connect system call
-does. Returns TRUE if it succeeded, FALSE otherwise. NAME should be a
+does. Returns true if it succeeded, false otherwise. NAME should be a
packed address of the appropriate type for the socket. See the examples in
L<perlipc/"Sockets: Client/Server Communication">.
@@ -690,8 +771,8 @@ continued via the C<next> statement (which is similar to the C C<continue>
statement).
C<last>, C<next>, or C<redo> may appear within a C<continue>
-block. C<last> and C<redo> will behave as if they had been executed within
-the main block. So will C<next>, but since it will execute a C<continue>
+block. C<last> and C<redo> will behave as if they had been executed within
+the main block. So will C<next>, but since it will execute a C<continue>
block, it may be more entertaining.
while (EXPR) {
@@ -705,7 +786,7 @@ block, it may be more entertaining.
### last always comes here
Omitting the C<continue> section is semantically equivalent to using an
-empty one, logically enough. In that case, C<next> goes directly back
+empty one, logically enough. In that case, C<next> goes directly back
to check the condition at the top of the loop.
=item cos EXPR
@@ -713,7 +794,7 @@ to check the condition at the top of the loop.
Returns the cosine of EXPR (expressed in radians). If EXPR is omitted,
takes cosine of C<$_>.
-For the inverse cosine operation, you may use the C<POSIX::acos()>
+For the inverse cosine operation, you may use the C<Math::Trig::acos()>
function, or use this relation:
sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
@@ -726,14 +807,14 @@ extirpated as a potential munition). This can prove useful for checking
the password file for lousy passwords, amongst other things. Only the
guys wearing white hats should do this.
-Note that C<crypt()> is intended to be a one-way function, much like breaking
+Note that C<crypt> is intended to be a one-way function, much like breaking
eggs to make an omelette. There is no (known) corresponding decrypt
function. As a result, this function isn't all that useful for
cryptography. (For that, see your nearby CPAN mirror.)
When verifying an existing encrypted string you should use the encrypted
text as the salt (like C<crypt($plain, $crypted) eq $crypted>). This
-allows your code to work with the standard C<crypt()> and with more
+allows your code to work with the standard C<crypt> and with more
exotic implementations. When choosing a new salt create a random two
character string whose characters come from the set C<[./0-9A-Za-z]>
(like C<join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]>).
@@ -758,34 +839,40 @@ their own password:
Of course, typing in your own password to whoever asks you
for it is unwise.
+The L<crypt> function is unsuitable for encrypting large quantities
+of data, not least of all because you can't get the information
+back. Look at the F<by-module/Crypt> and F<by-module/PGP> directories
+on your favorite CPAN mirror for a slew of potentially useful
+modules.
+
=item dbmclose HASH
-[This function has been largely superseded by the C<untie()> function.]
+[This function has been largely superseded by the C<untie> function.]
Breaks the binding between a DBM file and a hash.
-=item dbmopen HASH,DBNAME,MODE
+=item dbmopen HASH,DBNAME,MASK
-[This function has been largely superseded by the C<tie()> function.]
+[This function has been largely superseded by the C<tie> function.]
This binds a dbm(3), ndbm(3), sdbm(3), gdbm(3), or Berkeley DB file to a
-hash. HASH is the name of the hash. (Unlike normal C<open()>, the first
-argument is I<NOT> a filehandle, even though it looks like one). DBNAME
+hash. HASH is the name of the hash. (Unlike normal C<open>, the first
+argument is I<not> a filehandle, even though it looks like one). DBNAME
is the name of the database (without the F<.dir> or F<.pag> extension if
any). If the database does not exist, it is created with protection
-specified by MODE (as modified by the C<umask()>). If your system supports
-only the older DBM functions, you may perform only one C<dbmopen()> in your
+specified by MASK (as modified by the C<umask>). If your system supports
+only the older DBM functions, you may perform only one C<dbmopen> in your
program. In older versions of Perl, if your system had neither DBM nor
-ndbm, calling C<dbmopen()> produced a fatal error; it now falls back to
+ndbm, calling C<dbmopen> produced a fatal error; it now falls back to
sdbm(3).
If you don't have write access to the DBM file, you can only read hash
variables, not set them. If you want to test whether you can write,
-either use file tests or try setting a dummy hash entry inside an C<eval()>,
+either use file tests or try setting a dummy hash entry inside an C<eval>,
which will trap the error.
-Note that functions such as C<keys()> and C<values()> may return huge lists
-when used on large DBM files. You may prefer to use the C<each()>
+Note that functions such as C<keys> and C<values> may return huge lists
+when used on large DBM files. You may prefer to use the C<each>
function to iterate over large DBM files. Example:
# print out history file offsets
@@ -820,14 +907,21 @@ conditions. This function allows you to distinguish C<undef> from
other values. (A simple Boolean test will not distinguish among
C<undef>, zero, the empty string, and C<"0">, which are all equally
false.) Note that since C<undef> is a valid scalar, its presence
-doesn't I<necessarily> indicate an exceptional condition: C<pop()>
+doesn't I<necessarily> indicate an exceptional condition: C<pop>
returns C<undef> when its argument is an empty array, I<or> when the
element to return happens to be C<undef>.
-You may also use C<defined()> to check whether a subroutine exists, by
-saying C<defined &func> without parentheses. On the other hand, use
-of C<defined()> upon aggregates (hashes and arrays) is not guaranteed to
-produce intuitive results, and should probably be avoided.
+You may also use C<defined(&func)> to check whether subroutine C<&func>
+has ever been defined. The return value is unaffected by any forward
+declarations of C<&foo>.
+
+Use of C<defined> on aggregates (hashes and arrays) is deprecated. It
+used to report whether memory for that aggregate has ever been
+allocated. This behavior may disappear in future versions of Perl.
+You should instead use a simple test for size:
+
+ if (@an_array) { print "has array elements\n" }
+ if (%a_hash) { print "has hash members\n" }
When used on a hash element, it tells you whether the value is defined,
not whether the key exists in the hash. Use L</exists> for the latter
@@ -842,7 +936,7 @@ Examples:
sub foo { defined &$bar ? &$bar(@_) : die "No bar"; }
$debugging = 0 unless defined $debugging;
-Note: Many folks tend to overuse C<defined()>, and then are surprised to
+Note: Many folks tend to overuse C<defined>, and then are surprised to
discover that the number C<0> and C<""> (the zero-length string) are, in fact,
defined values. For example, if you say
@@ -853,69 +947,75 @@ matched "nothing". But it didn't really match nothing--rather, it
matched something that happened to be zero characters long. This is all
very above-board and honest. When a function returns an undefined value,
it's an admission that it couldn't give you an honest answer. So you
-should use C<defined()> only when you're questioning the integrity of what
+should use C<defined> only when you're questioning the integrity of what
you're trying to do. At other times, a simple comparison to C<0> or C<""> is
what you want.
-Currently, using C<defined()> on an entire array or hash reports whether
-memory for that aggregate has ever been allocated. So an array you set
-to the empty list appears undefined initially, and one that once was full
-and that you then set to the empty list still appears defined. You
-should instead use a simple test for size:
-
- if (@an_array) { print "has array elements\n" }
- if (%a_hash) { print "has hash members\n" }
-
-Using C<undef()> on these, however, does clear their memory and then report
-them as not defined anymore, but you shouldn't do that unless you don't
-plan to use them again, because it saves time when you load them up
-again to have memory already ready to be filled. The normal way to
-free up space used by an aggregate is to assign the empty list.
-
-This counterintuitive behavior of C<defined()> on aggregates may be
-changed, fixed, or broken in a future release of Perl.
-
See also L</undef>, L</exists>, L</ref>.
=item delete EXPR
-Deletes the specified key(s) and their associated values from a hash.
-For each key, returns the deleted value associated with that key, or
-the undefined value if there was no such key. Deleting from C<$ENV{}>
-modifies the environment. Deleting from a hash tied to a DBM file
-deletes the entry from the DBM file. (But deleting from a C<tie()>d hash
-doesn't necessarily return anything.)
+Given an expression that specifies a hash element, array element, hash slice,
+or array slice, deletes the specified element(s) from the hash or array.
+In the case of an array, if the array elements happen to be at the end,
+the size of the array will shrink to the highest element that tests
+true for exists() (or 0 if no such element exists).
+
+Returns each element so deleted or the undefined value if there was no such
+element. Deleting from C<$ENV{}> modifies the environment. Deleting from
+a hash tied to a DBM file deletes the entry from the DBM file. Deleting
+from a C<tie>d hash or array may not necessarily return anything.
-The following deletes all the values of a hash:
+Deleting an array element effectively returns that position of the array
+to its initial, uninitialized state. Subsequently testing for the same
+element with exists() will return false. Note that deleting array
+elements in the middle of an array will not shift the index of the ones
+after them down--use splice() for that. See L</exists>.
+
+The following (inefficiently) deletes all the values of %HASH and @ARRAY:
foreach $key (keys %HASH) {
delete $HASH{$key};
}
-And so does this:
+ foreach $index (0 .. $#ARRAY) {
+ delete $ARRAY[$index];
+ }
- delete @HASH{keys %HASH}
+And so do these:
+
+ delete @HASH{keys %HASH};
+
+ delete @ARRAY[0 .. $#ARRAY];
But both of these are slower than just assigning the empty list
-or undefining it:
+or undefining %HASH or @ARRAY:
- %hash = (); # completely empty %hash
- undef %hash; # forget %hash every existed
+ %HASH = (); # completely empty %HASH
+ undef %HASH; # forget %HASH ever existed
+
+ @ARRAY = (); # completely empty @ARRAY
+ undef @ARRAY; # forget @ARRAY ever existed
Note that the EXPR can be arbitrarily complicated as long as the final
-operation is a hash element lookup or hash slice:
+operation is a hash element, array element, hash slice, or array slice
+lookup:
delete $ref->[$x][$y]{$key};
delete @{$ref->[$x][$y]}{$key1, $key2, @morekeys};
+ delete $ref->[$x][$y][$index];
+ delete @{$ref->[$x][$y]}[$index1, $index2, @moreindices];
+
=item die LIST
-Outside an C<eval()>, prints the value of LIST to C<STDERR> and exits with
-the current value of C<$!> (errno). If C<$!> is C<0>, exits with the value of
-C<($? E<gt>E<gt> 8)> (backtick `command` status). If C<($? E<gt>E<gt> 8)>
-is C<0>, exits with C<255>. Inside an C<eval(),> the error message is stuffed into
-C<$@> and the C<eval()> is terminated with the undefined value. This makes
-C<die()> the way to raise an exception.
+Outside an C<eval>, prints the value of LIST to C<STDERR> and
+exits with the current value of C<$!> (errno). If C<$!> is C<0>,
+exits with the value of C<<< ($? >> 8) >>> (backtick `command`
+status). If C<<< ($? >> 8) >>> is C<0>, exits with C<255>. Inside
+an C<eval(),> the error message is stuffed into C<$@> and the
+C<eval> is terminated with the undefined value. This makes
+C<die> the way to raise an exception.
Equivalent examples:
@@ -969,25 +1069,26 @@ regular expressions. Here's an example:
}
}
-Since perl will stringify uncaught exception messages before displaying
+Because perl will stringify uncaught exception messages before displaying
them, you may want to overload stringification operations on such custom
exception objects. See L<overload> for details about that.
-You can arrange for a callback to be run just before the C<die()> does
-its deed, by setting the C<$SIG{__DIE__}> hook. The associated handler
-will be called with the error text and can change the error message, if
-it sees fit, by calling C<die()> again. See L<perlvar/$SIG{expr}> for details on
-setting C<%SIG> entries, and L<"eval BLOCK"> for some examples.
-
-Note that the C<$SIG{__DIE__}> hook is currently called even inside
-eval()ed blocks/strings! If one wants the hook to do nothing in such
-situations, put
+You can arrange for a callback to be run just before the C<die>
+does its deed, by setting the C<$SIG{__DIE__}> hook. The associated
+handler will be called with the error text and can change the error
+message, if it sees fit, by calling C<die> again. See
+L<perlvar/$SIG{expr}> for details on setting C<%SIG> entries, and
+L<"eval BLOCK"> for some examples. Although this feature was meant
+to be run only right before your program was to exit, this is not
+currently the case--the C<$SIG{__DIE__}> hook is currently called
+even inside eval()ed blocks/strings! If one wants the hook to do
+nothing in such situations, put
die @_ if $^S;
-as the first line of the handler (see L<perlvar/$^S>). Because this
-promotes action at a distance, this counterintuitive behavior may be fixed
-in a future release.
+as the first line of the handler (see L<perlvar/$^S>). Because
+this promotes strange action at a distance, this counterintuitive
+behavior may be fixed in a future release.
=item do BLOCK
@@ -1031,7 +1132,7 @@ successfully compiled, C<do> returns the value of the last expression
evaluated.
Note that inclusion of library modules is better done with the
-C<use()> and C<require()> operators, which also do automatic error checking
+C<use> and C<require> operators, which also do automatic error checking
and raise an exception if there's a problem.
You might like to use C<do> to read in a program configuration
@@ -1052,60 +1153,49 @@ file. Manual error checking can be done this way:
=item dump
-This causes an immediate core dump. Primarily this is so that you can
-use the B<undump> program to turn your core dump into an executable binary
-after having initialized all your variables at the beginning of the
-program. When the new binary is executed it will begin by executing a
-C<goto LABEL> (with all the restrictions that C<goto> suffers). Think of
-it as a goto with an intervening core dump and reincarnation. If C<LABEL>
-is omitted, restarts the program from the top. WARNING: Any files
-opened at the time of the dump will NOT be open any more when the
-program is reincarnated, with possible resulting confusion on the part
-of Perl. See also B<-u> option in L<perlrun>.
-
-Example:
-
- #!/usr/bin/perl
- require 'getopt.pl';
- require 'stat.pl';
- %days = (
- 'Sun' => 1,
- 'Mon' => 2,
- 'Tue' => 3,
- 'Wed' => 4,
- 'Thu' => 5,
- 'Fri' => 6,
- 'Sat' => 7,
- );
-
- dump QUICKSTART if $ARGV[0] eq '-d';
-
- QUICKSTART:
- Getopt('f');
-
-This operator is largely obsolete, partly because it's very hard to
-convert a core file into an executable, and because the real perl-to-C
-compiler has superseded it.
+This function causes an immediate core dump. See also the B<-u>
+command-line switch in L<perlrun>, which does the same thing.
+Primarily this is so that you can use the B<undump> program (not
+supplied) to turn your core dump into an executable binary after
+having initialized all your variables at the beginning of the
+program. When the new binary is executed it will begin by executing
+a C<goto LABEL> (with all the restrictions that C<goto> suffers).
+Think of it as a goto with an intervening core dump and reincarnation.
+If C<LABEL> is omitted, restarts the program from the top.
+
+B<WARNING>: Any files opened at the time of the dump will I<not>
+be open any more when the program is reincarnated, with possible
+resulting confusion on the part of Perl.
+
+This function is now largely obsolete, partly because it's very
+hard to convert a core file into an executable, and because the
+real compiler backends for generating portable bytecode and compilable
+C code have superseded it.
+
+If you're looking to use L<dump> to speed up your program, consider
+generating bytecode or native C code as described in L<perlcc>. If
+you're just trying to accelerate a CGI script, consider using the
+C<mod_perl> extension to B<Apache>, or the CPAN module, Fast::CGI.
+You might also consider autoloading or selfloading, which at least
+make your program I<appear> to run faster.
=item each HASH
When called in list context, returns a 2-element list consisting of the
key and value for the next element of a hash, so that you can iterate over
it. When called in scalar context, returns the key for only the "next"
-element in the hash. (Note: Keys may be C<"0"> or C<"">, which are logically
-false; you may wish to avoid constructs like C<while ($k = each %foo) {}>
-for this reason.)
+element in the hash.
Entries are returned in an apparently random order. The actual random
order is subject to change in future versions of perl, but it is guaranteed
-to be in the same order as either the C<keys()> or C<values()> function
+to be in the same order as either the C<keys> or C<values> function
would produce on the same (unmodified) hash.
When the hash is entirely read, a null array is returned in list context
-(which when assigned produces a FALSE (C<0>) value), and C<undef> in
-scalar context. The next call to C<each()> after that will start iterating
-again. There is a single iterator for each hash, shared by all C<each()>,
-C<keys()>, and C<values()> function calls in the program; it can be reset by
+(which when assigned produces a false (C<0>) value), and C<undef> in
+scalar context. The next call to C<each> after that will start iterating
+again. There is a single iterator for each hash, shared by all C<each>,
+C<keys>, and C<values> function calls in the program; it can be reset by
reading all the elements from the hash, or by evaluating C<keys HASH> or
C<values HASH>. If you add or delete elements of a hash while you're
iterating over it, you may get entries skipped or duplicated, so don't.
@@ -1117,7 +1207,7 @@ only in a different order:
print "$key=$value\n";
}
-See also C<keys()>, C<values()> and C<sort()>.
+See also C<keys>, C<values> and C<sort>.
=item eof FILEHANDLE
@@ -1128,17 +1218,22 @@ See also C<keys()>, C<values()> and C<sort()>.
Returns 1 if the next read on FILEHANDLE will return end of file, or if
FILEHANDLE is not open. FILEHANDLE may be an expression whose value
gives the real filehandle. (Note that this function actually
-reads a character and then C<ungetc()>s it, so isn't very useful in an
+reads a character and then C<ungetc>s it, so isn't very useful in an
interactive context.) Do not read from a terminal file (or call
-C<eof(FILEHANDLE)> on it) after end-of-file is reached. Filetypes such
+C<eof(FILEHANDLE)> on it) after end-of-file is reached. File types such
as terminals may lose the end-of-file condition if you do.
-An C<eof> without an argument uses the last file read as argument.
-Using C<eof()> with empty parentheses is very different. It indicates
-the pseudo file formed of the files listed on the command line, i.e.,
-C<eof()> is reasonable to use inside a C<while (E<lt>E<gt>)> loop to
-detect the end of only the last file. Use C<eof(ARGV)> or eof without the
-parentheses to test I<EACH> file in a while (E<lt>E<gt>) loop. Examples:
+An C<eof> without an argument uses the last file read. Using C<eof()>
+with empty parentheses is very different. It refers to the pseudo file
+formed from the files listed on the command line and accessed via the
+C<< <> >> operator. Since C<< <> >> isn't explicitly opened,
+as a normal filehandle is, an C<eof()> before C<< <> >> has been
+used will cause C<@ARGV> to be examined to determine if input is
+available.
+
+In a C<< while (<>) >> loop, C<eof> or C<eof(ARGV)> can be used to
+detect the end of each file, C<eof()> will only detect the end of the
+last file. Examples:
# reset line numbering on each input file
while (<>) {
@@ -1159,8 +1254,8 @@ parentheses to test I<EACH> file in a while (E<lt>E<gt>) loop. Examples:
}
Practical hint: you almost never need to use C<eof> in Perl, because the
-input operators return false values when they run out of data, or if there
-was an error.
+input operators typically return C<undef> when they run out of data, or if
+there was an error.
=item eval EXPR
@@ -1191,16 +1286,16 @@ as with subroutines. The expression providing the return value is evaluated
in void, scalar, or list context, depending on the context of the eval itself.
See L</wantarray> for more on how the evaluation context can be determined.
-If there is a syntax error or runtime error, or a C<die()> statement is
-executed, an undefined value is returned by C<eval()>, and C<$@> is set to the
+If there is a syntax error or runtime error, or a C<die> statement is
+executed, an undefined value is returned by C<eval>, and C<$@> is set to the
error message. If there was no error, C<$@> is guaranteed to be a null
-string. Beware that using C<eval()> neither silences perl from printing
+string. Beware that using C<eval> neither silences perl from printing
warnings to STDERR, nor does it stuff the text of warning messages into C<$@>.
To do either of those, you have to use the C<$SIG{__WARN__}> facility. See
L</warn> and L<perlvar>.
-Note that, because C<eval()> traps otherwise-fatal errors, it is useful for
-determining whether a particular feature (such as C<socket()> or C<symlink()>)
+Note that, because C<eval> traps otherwise-fatal errors, it is useful for
+determining whether a particular feature (such as C<socket> or C<symlink>)
is implemented. It is also Perl's exception trapping mechanism, where
the die operator is used to raise exceptions.
@@ -1232,7 +1327,7 @@ as shown in this example:
warn $@ if $@;
This is especially significant, given that C<__DIE__> hooks can call
-C<die()> again, which has the effect of changing their error messages:
+C<die> again, which has the effect of changing their error messages:
# __DIE__ hooks may modify error messages
{
@@ -1242,10 +1337,10 @@ C<die()> again, which has the effect of changing their error messages:
print $@ if $@; # prints "bar lives here"
}
-Because this promotes action at a distance, this counterintuive behavior
+Because this promotes action at a distance, this counterintuitive behavior
may be fixed in a future release.
-With an C<eval()>, you should be especially careful to remember what's
+With an C<eval>, you should be especially careful to remember what's
being looked at when:
eval $x; # CASE 1
@@ -1258,13 +1353,13 @@ being looked at when:
$$x++; # CASE 6
Cases 1 and 2 above behave identically: they run the code contained in
-the variable C<$x>. (Although case 2 has misleading double quotes making
+the variable $x. (Although case 2 has misleading double quotes making
the reader wonder what else might be happening (nothing is).) Cases 3
and 4 likewise behave in the same way: they run the code C<'$x'>, which
-does nothing but return the value of C<$x>. (Case 4 is preferred for
+does nothing but return the value of $x. (Case 4 is preferred for
purely visual reasons, but it also has the advantage of compiling at
compile-time instead of at run-time.) Case 5 is a place where
-normally you I<WOULD> like to use double quotes, except that in this
+normally you I<would> like to use double quotes, except that in this
particular situation, you can just use symbolic references instead, as
in case 6.
@@ -1275,15 +1370,15 @@ C<next>, C<last>, or C<redo> cannot be used to leave or restart the block.
=item exec PROGRAM LIST
-The C<exec()> function executes a system command I<AND NEVER RETURNS> -
-use C<system()> instead of C<exec()> if you want it to return. It fails and
-returns FALSE only if the command does not exist I<and> it is executed
+The C<exec> function executes a system command I<and never returns>--
+use C<system> instead of C<exec> if you want it to return. It fails and
+returns false only if the command does not exist I<and> it is executed
directly instead of via your system's command shell (see below).
-Since it's a common mistake to use C<exec()> instead of C<system()>, Perl
-warns you if there is a following statement which isn't C<die()>, C<warn()>,
-or C<exit()> (if C<-w> is set - but you always do that). If you
-I<really> want to follow an C<exec()> with some other statement, you
+Since it's a common mistake to use C<exec> instead of C<system>, Perl
+warns you if there is a following statement which isn't C<die>, C<warn>,
+or C<exit> (if C<-w> is set - but you always do that). If you
+I<really> want to follow an C<exec> with some other statement, you
can use one of these styles to avoid the warning:
exec ('foo') or print STDERR "couldn't exec foo: $!";
@@ -1296,9 +1391,8 @@ the argument is checked for shell metacharacters, and if there are any,
the entire argument is passed to the system's command shell for parsing
(this is C</bin/sh -c> on Unix platforms, but varies on other platforms).
If there are no shell metacharacters in the argument, it is split into
-words and passed directly to C<execvp()>, which is more efficient. Note:
-C<exec()> and C<system()> do not flush your output buffer, so you may need to
-set C<$|> to avoid lost output. Examples:
+words and passed directly to C<execvp>, which is more efficient.
+Examples:
exec '/bin/echo', 'Your arguments are: ', @ARGV;
exec "sort $outfile | uniq";
@@ -1321,10 +1415,11 @@ When the arguments get executed via the system shell, results will
be subject to its quirks and capabilities. See L<perlop/"`STRING`">
for details.
-Using an indirect object with C<exec()> or C<system()> is also more secure.
-This usage forces interpretation of the arguments as a multivalued list,
-even if the list had just one argument. That way you're safe from the
-shell expanding wildcards or splitting up words with whitespace in them.
+Using an indirect object with C<exec> or C<system> is also more
+secure. This usage (which also works fine with system()) forces
+interpretation of the arguments as a multivalued list, even if the
+list had just one argument. That way you're safe from the shell
+expanding wildcards or splitting up words with whitespace in them.
@args = ( "echo surprise" );
@@ -1337,32 +1432,57 @@ program, passing it C<"surprise"> an argument. The second version
didn't--it tried to run a program literally called I<"echo surprise">,
didn't find it, and set C<$?> to a non-zero value indicating failure.
-Note that C<exec()> will not call your C<END> blocks, nor will it call
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before the exec, but this may not be supported on some platforms
+(see L<perlport>). To be safe, you may need to set C<$|> ($AUTOFLUSH
+in English) or call the C<autoflush()> method of C<IO::Handle> on any
+open handles in order to avoid lost output.
+
+Note that C<exec> will not call your C<END> blocks, nor will it call
any C<DESTROY> methods in your objects.
=item exists EXPR
-Returns TRUE if the specified hash key exists in its hash array, even
-if the corresponding value is undefined.
+Given an expression that specifies a hash element or array element,
+returns true if the specified element in the hash or array has ever
+been initialized, even if the corresponding value is undefined. The
+element is not autovivified if it doesn't exist.
- print "Exists\n" if exists $array{$key};
- print "Defined\n" if defined $array{$key};
- print "True\n" if $array{$key};
+ print "Exists\n" if exists $hash{$key};
+ print "Defined\n" if defined $hash{$key};
+ print "True\n" if $hash{$key};
-A hash element can be TRUE only if it's defined, and defined if
+ print "Exists\n" if exists $array[$index];
+ print "Defined\n" if defined $array[$index];
+ print "True\n" if $array[$index];
+
+A hash or array element can be true only if it's defined, and defined if
it exists, but the reverse doesn't necessarily hold true.
+Given an expression that specifies the name of a subroutine,
+returns true if the specified subroutine has ever been declared, even
+if it is undefined. Mentioning a subroutine name for exists or defined
+does not count as declaring it.
+
+ print "Exists\n" if exists &subroutine;
+ print "Defined\n" if defined &subroutine;
+
Note that the EXPR can be arbitrarily complicated as long as the final
-operation is a hash key lookup:
+operation is a hash or array key lookup or subroutine name:
if (exists $ref->{A}->{B}->{$key}) { }
if (exists $hash{A}{B}{$key}) { }
-Although the last element will not spring into existence just because
-its existence was tested, intervening ones will. Thus C<$ref-E<gt>{"A"}>
-and C<$ref-E<gt>{"A"}-E<gt>{"B"}> will spring into existence due to the
-existence test for a $key element. This happens anywhere the arrow
-operator is used, including even
+ if (exists $ref->{A}->{B}->[$ix]) { }
+ if (exists $hash{A}{B}[$ix]) { }
+
+ if (exists &{$ref->{A}{B}{$key}}) { }
+
+Although the deepest nested array or hash will not spring into existence
+just because its existence was tested, any intervening ones will.
+Thus C<< $ref->{"A"} >> and C<< $ref->{"A"}->{"B"} >> will spring
+into existence due to the existence test for the $key element above.
+This happens anywhere the arrow operator is used, including even:
undef $ref;
if (exists $ref->{"Some key"}) { }
@@ -1372,6 +1492,15 @@ This surprising autovivification in what does not at first--or even
second--glance appear to be an lvalue context may be fixed in a future
release.
+See L<perlref/"Pseudo-hashes: Using an array as a hash"> for specifics
+on how exists() acts when used on a pseudo-hash.
+
+Use of a subroutine call, rather than a subroutine name, as an argument
+to exists() is an error.
+
+ exists &sub; # OK
+ exists &sub(); # Error
+
=item exit EXPR
Evaluates EXPR and exits immediately with that value. Example:
@@ -1379,23 +1508,23 @@ Evaluates EXPR and exits immediately with that value. Example:
$ans = <STDIN>;
exit 0 if $ans =~ /^[Xx]/;
-See also C<die()>. If EXPR is omitted, exits with C<0> status. The only
+See also C<die>. If EXPR is omitted, exits with C<0> status. The only
universally recognized values for EXPR are C<0> for success and C<1>
for error; other values are subject to interpretation depending on the
environment in which the Perl program is running. For example, exiting
69 (EX_UNAVAILABLE) from a I<sendmail> incoming-mail filter will cause
the mailer to return the item undelivered, but that's not true everywhere.
-Don't use C<exit()> to abort a subroutine if there's any chance that
-someone might want to trap whatever error happened. Use C<die()> instead,
-which can be trapped by an C<eval()>.
+Don't use C<exit> to abort a subroutine if there's any chance that
+someone might want to trap whatever error happened. Use C<die> instead,
+which can be trapped by an C<eval>.
-The exit() function does not always exit immediately. It calls any
+The exit() function does not always exit immediately. It calls any
defined C<END> routines first, but these C<END> routines may not
-themselves abort the exit. Likewise any object destructors that need to
+themselves abort the exit. Likewise any object destructors that need to
be called are called before the real exit. If this is a problem, you
can call C<POSIX:_exit($status)> to avoid END and destructor processing.
-See L<perlsub> for details.
+See L<perlmod> for details.
=item exp EXPR
@@ -1411,20 +1540,20 @@ Implements the fcntl(2) function. You'll probably have to say
use Fcntl;
first to get the correct constant definitions. Argument processing and
-value return works just like C<ioctl()> below.
+value return works just like C<ioctl> below.
For example:
use Fcntl;
fcntl($filehandle, F_GETFL, $packed_return_buffer)
or die "can't fcntl F_GETFL: $!";
-You don't have to check for C<defined()> on the return from C<fnctl()>.
-Like C<ioctl()>, it maps a C<0> return from the system call into "C<0>
-but true" in Perl. This string is true in boolean context and C<0>
+You don't have to check for C<defined> on the return from C<fnctl>.
+Like C<ioctl>, it maps a C<0> return from the system call into
+C<"0 but true"> in Perl. This string is true in boolean context and C<0>
in numeric context. It is also exempt from the normal B<-w> warnings
on improper numeric conversions.
-Note that C<fcntl()> will produce a fatal error if used on a machine that
+Note that C<fcntl> will produce a fatal error if used on a machine that
doesn't implement fcntl(2). See the Fcntl module or your fcntl(2)
manpage to learn what functions are available on your system.
@@ -1432,7 +1561,7 @@ manpage to learn what functions are available on your system.
Returns the file descriptor for a filehandle, or undefined if the
filehandle is not open. This is mainly useful for constructing
-bitmaps for C<select()> and low-level POSIX tty-handling operations.
+bitmaps for C<select> and low-level POSIX tty-handling operations.
If FILEHANDLE is an expression, the value is taken as an indirect
filehandle, generally its name.
@@ -1445,17 +1574,17 @@ same underlying descriptor:
=item flock FILEHANDLE,OPERATION
-Calls flock(2), or an emulation of it, on FILEHANDLE. Returns TRUE
-for success, FALSE on failure. Produces a fatal error if used on a
+Calls flock(2), or an emulation of it, on FILEHANDLE. Returns true
+for success, false on failure. Produces a fatal error if used on a
machine that doesn't implement flock(2), fcntl(2) locking, or lockf(3).
-C<flock()> is Perl's portable file locking interface, although it locks
+C<flock> is Perl's portable file locking interface, although it locks
only entire files, not records.
Two potentially non-obvious but traditional C<flock> semantics are
that it waits indefinitely until the lock is granted, and that its locks
B<merely advisory>. Such discretionary locks are more flexible, but offer
-fewer guarantees. This means that files locked with C<flock()> may be
-modified by programs that do not also use C<flock()>. See L<perlport>,
+fewer guarantees. This means that files locked with C<flock> may be
+modified by programs that do not also use C<flock>. See L<perlport>,
your port's specific documentation, or your system-specific local manpages
for details. It's best to assume traditional behavior if you're writing
portable programs. (But if you're not, you should as always feel perfectly
@@ -1465,11 +1594,11 @@ in the way of your getting your job done.)
OPERATION is one of LOCK_SH, LOCK_EX, or LOCK_UN, possibly combined with
LOCK_NB. These constants are traditionally valued 1, 2, 8 and 4, but
-you can use the symbolic names if import them from the Fcntl module,
+you can use the symbolic names if you import them from the Fcntl module,
either individually, or as a group using the ':flock' tag. LOCK_SH
requests a shared lock, LOCK_EX requests an exclusive lock, and LOCK_UN
-releases a previously requested lock. If LOCK_NB is added to LOCK_SH or
-LOCK_EX then C<flock()> will return immediately rather than blocking
+releases a previously requested lock. If LOCK_NB is bitwise-or'ed with
+LOCK_SH or LOCK_EX then C<flock> will return immediately rather than blocking
waiting for the lock (check the return status to see if you got it).
To avoid the possibility of miscoordination, Perl now flushes FILEHANDLE
@@ -1481,8 +1610,8 @@ are the semantics that lockf(3) implements. Most if not all systems
implement lockf(3) in terms of fcntl(2) locking, though, so the
differing semantics shouldn't bite too many people.
-Note also that some versions of C<flock()> cannot lock things over the
-network; you would need to use the more system-specific C<fcntl()> for
+Note also that some versions of C<flock> cannot lock things over the
+network; you would need to use the more system-specific C<fcntl> for
that. If you like you can force Perl to ignore your system's flock(2)
function, and so provide its own fcntl(2)-based emulation, by passing
the switch C<-Ud_flock> to the F<Configure> program when you configure
@@ -1527,11 +1656,13 @@ fork(), great care has gone into making it extremely efficient (for
example, using copy-on-write technology on data pages), making it the
dominant paradigm for multitasking over the last few decades.
-Note: unflushed buffers remain unflushed in both processes, which means
-you may need to set C<$|> ($AUTOFLUSH in English) or call the C<autoflush()>
-method of C<IO::Handle> to avoid duplicate output.
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before forking the child process, but this may not be supported
+on some platforms (see L<perlport>). To be safe, you may need to set
+C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method of
+C<IO::Handle> on any open handles in order to avoid duplicate output.
-If you C<fork()> without ever waiting on your children, you will
+If you C<fork> without ever waiting on your children, you will
accumulate zombies. On some systems, you can avoid this by setting
C<$SIG{CHLD}> to C<"IGNORE">. See also L<perlipc> for more examples of
forking and reaping moribund children.
@@ -1539,12 +1670,12 @@ forking and reaping moribund children.
Note that if your forked child inherits system file descriptors like
STDIN and STDOUT that are actually connected by a pipe or socket, even
if you exit, then the remote server (such as, say, a CGI script or a
-backgrounded job launced from a remote shell) won't think you're done.
+backgrounded job launched from a remote shell) won't think you're done.
You should reopen those to F</dev/null> if it's any issue.
=item format
-Declare a picture format for use by the C<write()> function. For
+Declare a picture format for use by the C<write> function. For
example:
format Something =
@@ -1565,18 +1696,18 @@ This is an internal function used by C<format>s, though you may call it,
too. It formats (see L<perlform>) a list of values according to the
contents of PICTURE, placing the output into the format output
accumulator, C<$^A> (or C<$ACCUMULATOR> in English).
-Eventually, when a C<write()> is done, the contents of
+Eventually, when a C<write> is done, the contents of
C<$^A> are written to some filehandle, but you could also read C<$^A>
yourself and then set C<$^A> back to C<"">. Note that a format typically
-does one C<formline()> per line of form, but the C<formline()> function itself
+does one C<formline> per line of form, but the C<formline> function itself
doesn't care how many newlines are embedded in the PICTURE. This means
that the C<~> and C<~~> tokens will treat the entire PICTURE as a single line.
You may therefore need to use multiple formlines to implement a single
record format, just like the format compiler.
-Be careful if you put double quotes around the picture, because an "C<@>"
+Be careful if you put double quotes around the picture, because an C<@>
character may be taken to mean the beginning of an array name.
-C<formline()> always returns TRUE. See L<perlform> for other examples.
+C<formline> always returns true. See L<perlform> for other examples.
=item getc FILEHANDLE
@@ -1609,7 +1740,7 @@ something more like:
Determination of whether $BSD_STYLE should be set
is left as an exercise to the reader.
-The C<POSIX::getattr()> function can do this more portably on
+The C<POSIX::getattr> function can do this more portably on
systems purporting POSIX compliance. See also the C<Term::ReadKey>
module from your nearest CPAN site; details on CPAN can be found on
L<perlmodlib/CPAN>.
@@ -1618,12 +1749,12 @@ L<perlmodlib/CPAN>.
Implements the C library function of the same name, which on most
systems returns the current login from F</etc/utmp>, if any. If null,
-use C<getpwuid()>.
+use C<getpwuid>.
$login = getlogin || getpwuid($<) || "Kilroy";
-Do not consider C<getlogin()> for authentication: it is not as
-secure as C<getpwuid()>.
+Do not consider C<getlogin> for authentication: it is not as
+secure as C<getpwuid>.
=item getpeername SOCKET
@@ -1631,7 +1762,7 @@ Returns the packed sockaddr address of other end of the SOCKET connection.
use Socket;
$hersockaddr = getpeername(SOCK);
- ($port, $iaddr) = unpack_sockaddr_in($hersockaddr);
+ ($port, $iaddr) = sockaddr_in($hersockaddr);
$herhostname = gethostbyaddr($iaddr, AF_INET);
$herstraddr = inet_ntoa($iaddr);
@@ -1641,7 +1772,7 @@ Returns the current process group for the specified PID. Use
a PID of C<0> to get the current process group for the
current process. Will raise an exception if used on a machine that
doesn't implement getpgrp(2). If PID is omitted, returns process
-group of current process. Note that the POSIX version of C<getpgrp()>
+group of current process. Note that the POSIX version of C<getpgrp>
does not accept a PID argument, so only C<PID==0> is truly portable.
=item getppid
@@ -1728,6 +1859,14 @@ various get routines are as follows:
(If the entry doesn't exist you get a null list.)
+The exact meaning of the $gcos field varies but it usually contains
+the real name of the user (as opposed to the login name) and other
+information pertaining to the user. Beware, however, that in many
+system users are able to change this information and therefore it
+cannot be trusted and therefore the $gcos is is tainted (see
+L<perlsec>). The $passwd and $shell, user's encrypted password and
+login shell, are also tainted, because of the same reason.
+
In scalar context, you get the name, unless the function was a
lookup by name, in which case you get the other thing, whatever it is.
(If the entry doesn't exist you get the undefined value.) For example:
@@ -1740,28 +1879,27 @@ lookup by name, in which case you get the other thing, whatever it is.
$name = getgrent();
#etc.
-In I<getpw*()> the fields C<$quota>, C<$comment>, and C<$expire> are
-special cases in the sense that in many systems they are unsupported.
-If the C<$quota> is unsupported, it is an empty scalar. If it is
-supported, it usually encodes the disk quota. If the C<$comment>
-field is unsupported, it is an empty scalar. If it is supported it
-usually encodes some administrative comment about the user. In some
-systems the $quota field may be C<$change> or C<$age>, fields that have
-to do with password aging. In some systems the C<$comment> field may
-be C<$class>. The C<$expire> field, if present, encodes the expiration
-period of the account or the password. For the availability and the
-exact meaning of these fields in your system, please consult your
-getpwnam(3) documentation and your F<pwd.h> file. You can also find
-out from within Perl what your C<$quota> and C<$comment> fields mean
-and whether you have the C<$expire> field by using the C<Config> module
-and the values C<d_pwquota>, C<d_pwage>, C<d_pwchange>, C<d_pwcomment>,
-and C<d_pwexpire>. Shadow password files are only supported if your
-vendor has implemented them in the intuitive fashion that calling the
-regular C library routines gets the shadow versions if you're running
-under privilege. Those that incorrectly implement a separate library
-call are not supported.
-
-The C<$members> value returned by I<getgr*()> is a space separated list of
+In I<getpw*()> the fields $quota, $comment, and $expire are special
+cases in the sense that in many systems they are unsupported. If the
+$quota is unsupported, it is an empty scalar. If it is supported, it
+usually encodes the disk quota. If the $comment field is unsupported,
+it is an empty scalar. If it is supported it usually encodes some
+administrative comment about the user. In some systems the $quota
+field may be $change or $age, fields that have to do with password
+aging. In some systems the $comment field may be $class. The $expire
+field, if present, encodes the expiration period of the account or the
+password. For the availability and the exact meaning of these fields
+in your system, please consult your getpwnam(3) documentation and your
+F<pwd.h> file. You can also find out from within Perl what your
+$quota and $comment fields mean and whether you have the $expire field
+by using the C<Config> module and the values C<d_pwquota>, C<d_pwage>,
+C<d_pwchange>, C<d_pwcomment>, and C<d_pwexpire>. Shadow password
+files are only supported if your vendor has implemented them in the
+intuitive fashion that calling the regular C library routines gets the
+shadow versions if you're running under privilege. Those that
+incorrectly implement a separate library call are not supported.
+
+The $members value returned by I<getgr*()> is a space separated list of
the login names of the members of the group.
For the I<gethost*()> functions, if the C<h_errno> variable is supported in
@@ -1780,29 +1918,36 @@ The Socket library makes this slightly easier:
$name = gethostbyaddr($iaddr, AF_INET);
# or going the other way
- $straddr = inet_ntoa($iaddr");
+ $straddr = inet_ntoa($iaddr);
-If you get tired of remembering which element of the return list contains
-which return value, by-name interfaces are also provided in modules:
-C<File::stat>, C<Net::hostent>, C<Net::netent>, C<Net::protoent>, C<Net::servent>,
-C<Time::gmtime>, C<Time::localtime>, and C<User::grent>. These override the
-normal built-in, replacing them with versions that return objects with
-the appropriate names for each field. For example:
+If you get tired of remembering which element of the return list
+contains which return value, by-name interfaces are provided
+in standard modules: C<File::stat>, C<Net::hostent>, C<Net::netent>,
+C<Net::protoent>, C<Net::servent>, C<Time::gmtime>, C<Time::localtime>,
+and C<User::grent>. These override the normal built-ins, supplying
+versions that return objects with the appropriate names
+for each field. For example:
use File::stat;
use User::pwent;
$is_his = (stat($filename)->uid == pwent($whoever)->uid);
Even though it looks like they're the same method calls (uid),
-they aren't, because a C<File::stat> object is different from a C<User::pwent> object.
+they aren't, because a C<File::stat> object is different from
+a C<User::pwent> object.
=item getsockname SOCKET
-Returns the packed sockaddr address of this end of the SOCKET connection.
+Returns the packed sockaddr address of this end of the SOCKET connection,
+in case you don't know the address because you have several different
+IPs that the connection might have come in on.
use Socket;
$mysockaddr = getsockname(SOCK);
- ($port, $myaddr) = unpack_sockaddr_in($mysockaddr);
+ ($port, $myaddr) = sockaddr_in($mysockaddr);
+ printf "Connect to %s [%s]\n",
+ scalar gethostbyaddr($myaddr, AF_INET),
+ inet_ntoa($myaddr);
=item getsockopt SOCKET,LEVEL,OPTNAME
@@ -1814,35 +1959,51 @@ Returns the socket option requested, or undef if there is an error.
Returns the value of EXPR with filename expansions such as the
standard Unix shell F</bin/csh> would do. This is the internal function
-implementing the C<E<lt>*.cE<gt>> operator, but you can use it directly.
-If EXPR is omitted, C<$_> is used. The C<E<lt>*.cE<gt>> operator is
+implementing the C<< <*.c> >> operator, but you can use it directly.
+If EXPR is omitted, C<$_> is used. The C<< <*.c> >> operator is
discussed in more detail in L<perlop/"I/O Operators">.
+Beginning with v5.6.0, this operator is implemented using the standard
+C<File::Glob> extension. See L<File::Glob> for details.
+
=item gmtime EXPR
-Converts a time as returned by the time function to a 9-element array
+Converts a time as returned by the time function to a 8-element list
with the time localized for the standard Greenwich time zone.
Typically used as follows:
- # 0 1 2 3 4 5 6 7 8
- ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+ # 0 1 2 3 4 5 6 7
+ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) =
gmtime(time);
-All array elements are numeric, and come straight out of a struct tm.
-In particular this means that C<$mon> has the range C<0..11> and C<$wday>
-has the range C<0..6> with sunday as day C<0>. Also, C<$year> is the
-number of years since 1900, that is, C<$year> is C<123> in year 2023,
-I<not> simply the last two digits of the year. If you assume it is,
-then you create non-Y2K-compliant programs--and you wouldn't want to do
-that, would you?
+All list elements are numeric, and come straight out of the C `struct
+tm'. $sec, $min, and $hour are the seconds, minutes, and hours of the
+specified time. $mday is the day of the month, and $mon is the month
+itself, in the range C<0..11> with 0 indicating January and 11
+indicating December. $year is the number of years since 1900. That
+is, $year is C<123> in year 2023. $wday is the day of the week, with
+0 indicating Sunday and 3 indicating Wednesday. $yday is the day of
+the year, in the range C<1..365> (or C<1..366> in leap years.)
+
+Note that the $year element is I<not> simply the last two digits of
+the year. If you assume it is, then you create non-Y2K-compliant
+programs--and you wouldn't want to do that, would you?
+
+The proper way to get a complete 4-digit year is simply:
+
+ $year += 1900;
+
+And to get the last two digits of the year (e.g., '01' in 2001) do:
+
+ $year = sprintf("%02d", $year % 100);
-If EXPR is omitted, does C<gmtime(time())>.
+If EXPR is omitted, C<gmtime()> uses the current time (C<gmtime(time)>).
-In scalar context, returns the ctime(3) value:
+In scalar context, C<gmtime()> returns the ctime(3) value:
$now_string = gmtime; # e.g., "Thu Oct 13 04:54:34 1994"
-Also see the C<timegm()> function provided by the C<Time::Local> module,
+Also see the C<timegm> function provided by the C<Time::Local> module,
and the strftime(3) function available via the POSIX module.
This scalar value is B<not> locale dependent (see L<perllocale>), but
@@ -1869,10 +2030,10 @@ The C<goto-LABEL> form finds the statement labeled with LABEL and resumes
execution there. It may not be used to go into any construct that
requires initialization, such as a subroutine or a C<foreach> loop. It
also can't be used to go into a construct that is optimized away,
-or to get out of a block or subroutine given to C<sort()>.
+or to get out of a block or subroutine given to C<sort>.
It can be used to go almost anywhere else within the dynamic scope,
including out of subroutines, but it's usually better to use some other
-construct such as C<last> or C<die()>. The author of Perl has never felt the
+construct such as C<last> or C<die>. The author of Perl has never felt the
need to use this form of C<goto> (in Perl, that is--C is another matter).
The C<goto-EXPR> form expects a label name, whose scope will be resolved
@@ -1881,13 +2042,20 @@ necessarily recommended if you're optimizing for maintainability:
goto ("FOO", "BAR", "GLARCH")[$i];
-The C<goto-&NAME> form is highly magical, and substitutes a call to the
-named subroutine for the currently running subroutine. This is used by
-C<AUTOLOAD> subroutines that wish to load another subroutine and then
-pretend that the other subroutine had been called in the first place
-(except that any modifications to C<@_> in the current subroutine are
-propagated to the other subroutine.) After the C<goto>, not even C<caller()>
-will be able to tell that this routine was called first.
+The C<goto-&NAME> form is quite different from the other forms of C<goto>.
+In fact, it isn't a goto in the normal sense at all, and doesn't have
+the stigma associated with other gotos. Instead, it
+substitutes a call to the named subroutine for the currently running
+subroutine. This is used by C<AUTOLOAD> subroutines that wish to load
+another subroutine and then pretend that the other subroutine had been
+called in the first place (except that any modifications to C<@_>
+in the current subroutine are propagated to the other subroutine.)
+After the C<goto>, not even C<caller> will be able to tell that this
+routine was called first.
+
+NAME needn't be the name of a subroutine; it can be a scalar variable
+containing a code reference, or a block which evaluates to a code
+reference.
=item grep BLOCK LIST
@@ -1898,8 +2066,8 @@ relatives. In particular, it is not limited to using regular expressions.
Evaluates the BLOCK or EXPR for each element of LIST (locally setting
C<$_> to each element) and returns the list value consisting of those
-elements for which the expression evaluated to TRUE. In scalar
-context, returns the number of times the expression was TRUE.
+elements for which the expression evaluated to true. In scalar
+context, returns the number of times the expression was true.
@foo = grep(!/^#/, @bar); # weed out comments
@@ -1912,11 +2080,11 @@ be used to modify the elements of the array. While this is useful and
supported, it can cause bizarre results if the LIST is not a named array.
Similarly, grep returns aliases into the original list, much as a for
loop's index variable aliases the list elements. That is, modifying an
-element of a list returned by grep (for example, in a C<foreach>, C<map()>
-or another C<grep()>) actually modifies the element in the original list.
+element of a list returned by grep (for example, in a C<foreach>, C<map>
+or another C<grep>) actually modifies the element in the original list.
This is usually something to be avoided when writing clear code.
-See also L</map> for an array composed of the results of the BLOCK or EXPR.
+See also L</map> for a list composed of the results of the BLOCK or EXPR.
=item hex EXPR
@@ -1929,11 +2097,14 @@ L</oct>.) If EXPR is omitted, uses C<$_>.
print hex '0xAf'; # prints '175'
print hex 'aF'; # same
+Hex strings may only represent integers. Strings that would cause
+integer overflow trigger a warning.
+
=item import
-There is no builtin C<import()> function. It is just an ordinary
+There is no builtin C<import> function. It is just an ordinary
method (subroutine) defined (or inherited) by modules that wish to export
-names to another module. The C<use()> function calls the C<import()> method
+names to another module. The C<use> function calls the C<import> method
for the package used. See also L</use()>, L<perlmod>, and L<Exporter>.
=item index STR,SUBSTR,POSITION
@@ -1958,7 +2129,7 @@ towards C<0>, and two because machine representations of floating point
numbers can sometimes produce counterintuitive results. For example,
C<int(-6.725/0.025)> produces -268 rather than the correct -269; that's
because it's really more like -268.99999999999994315658 instead. Usually,
-the C<sprintf()>, C<printf()>, or the C<POSIX::floor> and C<POSIX::ceil>
+the C<sprintf>, C<printf>, or the C<POSIX::floor> and C<POSIX::ceil>
functions will serve you better than will int().
=item ioctl FILEHANDLE,FUNCTION,SCALAR
@@ -1969,37 +2140,25 @@ Implements the ioctl(2) function. You'll probably first have to say
to get the correct function definitions. If F<ioctl.ph> doesn't
exist or doesn't have the correct definitions you'll have to roll your
-own, based on your C header files such as F<E<lt>sys/ioctl.hE<gt>>.
+own, based on your C header files such as F<< <sys/ioctl.h> >>.
(There is a Perl script called B<h2ph> that comes with the Perl kit that
may help you in this, but it's nontrivial.) SCALAR will be read and/or
written depending on the FUNCTION--a pointer to the string value of SCALAR
-will be passed as the third argument of the actual C<ioctl()> call. (If SCALAR
+will be passed as the third argument of the actual C<ioctl> call. (If SCALAR
has no string value but does have a numeric value, that value will be
passed rather than a pointer to the string value. To guarantee this to be
-TRUE, add a C<0> to the scalar before using it.) The C<pack()> and C<unpack()>
-functions are useful for manipulating the values of structures used by
-C<ioctl()>. The following example sets the erase character to DEL.
-
- require 'ioctl.ph';
- $getp = &TIOCGETP;
- die "NO TIOCGETP" if $@ || !$getp;
- $sgttyb_t = "ccccs"; # 4 chars and a short
- if (ioctl(STDIN,$getp,$sgttyb)) {
- @ary = unpack($sgttyb_t,$sgttyb);
- $ary[2] = 127;
- $sgttyb = pack($sgttyb_t,@ary);
- ioctl(STDIN,&TIOCSETP,$sgttyb)
- || die "Can't ioctl: $!";
- }
+true, add a C<0> to the scalar before using it.) The C<pack> and C<unpack>
+functions may be needed to manipulate the values of structures used by
+C<ioctl>.
-The return value of C<ioctl()> (and C<fcntl()>) is as follows:
+The return value of C<ioctl> (and C<fcntl>) is as follows:
if OS returns: then Perl returns:
-1 undefined value
0 string "0 but true"
anything else that number
-Thus Perl returns TRUE on success and FALSE on failure, yet you can
+Thus Perl returns true on success and false on failure, yet you can
still easily determine the actual value returned by the operating
system:
@@ -2009,6 +2168,18 @@ system:
The special string "C<0> but true" is exempt from B<-w> complaints
about improper numeric conversions.
+Here's an example of setting a filehandle named C<REMOTE> to be
+non-blocking at the system level. You'll have to negotiate C<$|>
+on your own, though.
+
+ use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
+
+ $flags = fcntl(REMOTE, F_GETFL, 0)
+ or die "Can't get flags for the socket: $!\n";
+
+ $flags = fcntl(REMOTE, F_SETFL, $flags | O_NONBLOCK)
+ or die "Can't set flags for the socket: $!\n";
+
=item join EXPR,LIST
Joins the separate strings of LIST into a single string with fields
@@ -2016,15 +2187,16 @@ separated by the value of EXPR, and returns that new string. Example:
$rec = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);
-See L</split>.
+Beware that unlike C<split>, C<join> doesn't take a pattern as its
+first argument. Compare L</split>.
=item keys HASH
-Returns a list consisting of all the keys of the named hash. (In a
+Returns a list consisting of all the keys of the named hash. (In
scalar context, returns the number of keys.) The keys are returned in
an apparently random order. The actual random order is subject to
change in future versions of perl, but it is guaranteed to be the same
-order as either the C<values()> or C<each()> function produces (given
+order as either the C<values> or C<each> function produces (given
that the hash has not been modified). As a side effect, it resets
HASH's iterator.
@@ -2032,7 +2204,7 @@ Here is yet another way to print your environment:
@keys = keys %ENV;
@values = values %ENV;
- while ($#keys >= 0) {
+ while (@keys) {
print pop(@keys), '=', pop(@values), "\n";
}
@@ -2042,14 +2214,14 @@ or how about sorted by key:
print $key, '=', $ENV{$key}, "\n";
}
-To sort a hash by value, you'll need to use a C<sort()> function.
+To sort a hash by value, you'll need to use a C<sort> function.
Here's a descending numeric sort of a hash by its values:
foreach $key (sort { $hash{$b} <=> $hash{$a} } keys %hash) {
printf "%4d %s\n", $hash{$key}, $key;
}
-As an lvalue C<keys()> allows you to increase the number of hash buckets
+As an lvalue C<keys> allows you to increase the number of hash buckets
allocated for the given hash. This can gain you a measure of efficiency if
you know the hash is going to get big. (This is similar to pre-extending
an array by assigning a larger number to $#array.) If you say
@@ -2061,21 +2233,26 @@ in fact, since it rounds up to the next power of two. These
buckets will be retained even if you do C<%hash = ()>, use C<undef
%hash> if you want to free the storage while C<%hash> is still in scope.
You can't shrink the number of buckets allocated for the hash using
-C<keys()> in this way (but you needn't worry about doing this by accident,
+C<keys> in this way (but you needn't worry about doing this by accident,
as trying has no effect).
-See also C<each()>, C<values()> and C<sort()>.
+See also C<each>, C<values> and C<sort>.
-=item kill LIST
+=item kill SIGNAL, LIST
-Sends a signal to a list of processes. The first element of
-the list must be the signal to send. Returns the number of
-processes successfully signaled.
+Sends a signal to a list of processes. Returns the number of
+processes successfully signaled (which is not necessarily the
+same as the number actually killed).
$cnt = kill 1, $child1, $child2;
kill 9, @goners;
-Unlike in the shell, in Perl if the I<SIGNAL> is negative, it kills
+If SIGNAL is zero, no signal is sent to the process. This is a
+useful way to check that the process is alive and hasn't changed
+its UID. See L<perlport> for notes on the portability of this
+construct.
+
+Unlike in the shell, if SIGNAL is negative, it kills
process groups instead of processes. (On System V, a negative I<PROCESS>
number will also kill process groups, but that's not portable.) That
means you usually want to use positive not negative signals. You may also
@@ -2099,6 +2276,10 @@ C<last> cannot be used to exit a block which returns a value such as
C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
a grep() or map() operation.
+Note that a block by itself is semantically identical to a loop
+that executes once. Thus C<last> can be used to effect an early
+exit out of such a block.
+
See also L</continue> for an illustration of how C<last>, C<next>, and
C<redo> work.
@@ -2108,7 +2289,8 @@ C<redo> work.
Returns an lowercased version of EXPR. This is the internal function
implementing the C<\L> escape in double-quoted strings.
-Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>.
+Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>
+and L<utf8>.
If EXPR is omitted, uses C<$_>.
@@ -2133,17 +2315,17 @@ For that, use C<scalar @array> and C<scalar keys %hash> respectively.
=item link OLDFILE,NEWFILE
-Creates a new filename linked to the old filename. Returns TRUE for
-success, FALSE otherwise.
+Creates a new filename linked to the old filename. Returns true for
+success, false otherwise.
=item listen SOCKET,QUEUESIZE
-Does the same thing that the listen system call does. Returns TRUE if
-it succeeded, FALSE otherwise. See the example in L<perlipc/"Sockets: Client/Server Communication">.
+Does the same thing that the listen system call does. Returns true if
+it succeeded, false otherwise. See the example in L<perlipc/"Sockets: Client/Server Communication">.
=item local EXPR
-You really probably want to be using C<my()> instead, because C<local()> isn't
+You really probably want to be using C<my> instead, because C<local> isn't
what most people think of as "local". See L<perlsub/"Private Variables
via my()"> for details.
@@ -2154,7 +2336,7 @@ for details, including issues with tied arrays and hashes.
=item localtime EXPR
-Converts a time as returned by the time function to a 9-element array
+Converts a time as returned by the time function to a 9-element list
with the time analyzed for the local time zone. Typically used as
follows:
@@ -2162,26 +2344,43 @@ follows:
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
-All array elements are numeric, and come straight out of a struct tm.
-In particular this means that C<$mon> has the range C<0..11> and C<$wday>
-has the range C<0..6> with sunday as day C<0>. Also, C<$year> is the
-number of years since 1900, that is, C<$year> is C<123> in year 2023,
-and I<not> simply the last two digits of the year. If you assume it is,
-then you create non-Y2K-compliant programs--and you wouldn't want to do
-that, would you?
+All list elements are numeric, and come straight out of the C `struct
+tm'. $sec, $min, and $hour are the seconds, minutes, and hours of the
+specified time. $mday is the day of the month, and $mon is the month
+itself, in the range C<0..11> with 0 indicating January and 11
+indicating December. $year is the number of years since 1900. That
+is, $year is C<123> in year 2023. $wday is the day of the week, with
+0 indicating Sunday and 3 indicating Wednesday. $yday is the day of
+the year, in the range C<1..365> (or C<1..366> in leap years.) $isdst
+is true if the specified time occurs during daylight savings time,
+false otherwise.
+
+Note that the $year element is I<not> simply the last two digits of
+the year. If you assume it is, then you create non-Y2K-compliant
+programs--and you wouldn't want to do that, would you?
+
+The proper way to get a complete 4-digit year is simply:
+
+ $year += 1900;
-If EXPR is omitted, uses the current time (C<localtime(time)>).
+And to get the last two digits of the year (e.g., '01' in 2001) do:
-In scalar context, returns the ctime(3) value:
+ $year = sprintf("%02d", $year % 100);
+
+If EXPR is omitted, C<localtime()> uses the current time (C<localtime(time)>).
+
+In scalar context, C<localtime()> returns the ctime(3) value:
$now_string = localtime; # e.g., "Thu Oct 13 04:54:34 1994"
This scalar value is B<not> locale dependent, see L<perllocale>, but
-instead a Perl builtin. Also see the C<Time::Local> module, and the
-strftime(3) and mktime(3) function available via the POSIX module. To
-get somewhat similar but locale dependent date strings, set up your
-locale environment variables appropriately (please see L<perllocale>)
-and try for example:
+instead a Perl builtin. Also see the C<Time::Local> module
+(to convert the second, minutes, hours, ... back to seconds since the
+stroke of midnight the 1st of January 1970, the value returned by
+time()), and the strftime(3) and mktime(3) functions available via the
+POSIX module. To get somewhat similar but locale dependent date
+strings, set up your locale environment variables appropriately
+(please see L<perllocale>) and try for example:
use POSIX qw(strftime);
$now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
@@ -2189,13 +2388,24 @@ and try for example:
Note that the C<%a> and C<%b>, the short forms of the day of the week
and the month of the year, may not necessarily be three characters wide.
+=item lock
+
+ lock I<THING>
+
+This function places an advisory lock on a variable, subroutine,
+or referenced object contained in I<THING> until the lock goes out
+of scope. This is a built-in function only if your version of Perl
+was built with threading enabled, and if you've said C<use Threads>.
+Otherwise a user-defined function by this name will be called. See
+L<Thread>.
+
=item log EXPR
=item log
Returns the natural logarithm (base I<e>) of EXPR. If EXPR is omitted,
returns log of C<$_>. To get the log of another base, use basic algebra:
-The base-N log of a number is is equal to the natural log of that number
+The base-N log of a number is equal to the natural log of that number
divided by the natural log of N. For example:
sub log10 {
@@ -2211,10 +2421,10 @@ See also L</exp> for the inverse operation.
=item lstat
-Does the same thing as the C<stat()> function (including setting the
+Does the same thing as the C<stat> function (including setting the
special C<_> filehandle) but stats a symbolic link instead of the file
the symbolic link points to. If symbolic links are unimplemented on
-your system, a normal C<stat()> is done.
+your system, a normal C<stat> is done.
If EXPR is omitted, stats C<$_>.
@@ -2226,12 +2436,12 @@ The match operator. See L<perlop>.
=item map EXPR,LIST
-Evaluates the BLOCK or EXPR for each element of LIST (locally setting C<$_> to each
-element) and returns the list value composed of the results of each such
-evaluation. Evaluates BLOCK or EXPR in a list context, so each element of LIST
-may produce zero, one, or more elements in the returned value.
-
-In scalar context, returns the total number of elements so generated.
+Evaluates the BLOCK or EXPR for each element of LIST (locally setting
+C<$_> to each element) and returns the list value composed of the
+results of each such evaluation. In scalar context, returns the
+total number of elements so generated. Evaluates BLOCK or EXPR in
+list context, so each element of LIST may produce zero, one, or
+more elements in the returned value.
@chars = map(chr, @nums);
@@ -2253,18 +2463,21 @@ Using a regular C<foreach> loop for this purpose would be clearer in
most cases. See also L</grep> for an array composed of those items of
the original list for which the BLOCK or EXPR evaluates to true.
-=item mkdir FILENAME,MODE
+=item mkdir FILENAME,MASK
+
+=item mkdir FILENAME
Creates the directory specified by FILENAME, with permissions
-specified by MODE (as modified by C<umask>). If it succeeds it
-returns TRUE, otherwise it returns FALSE and sets C<$!> (errno).
+specified by MASK (as modified by C<umask>). If it succeeds it
+returns true, otherwise it returns false and sets C<$!> (errno).
+If omitted, MASK defaults to 0777.
-In general, it is better to create directories with permissive MODEs,
+In general, it is better to create directories with permissive MASK,
and let the user modify that with their C<umask>, than it is to supply
-a restrictive MODE and give the user no way to be more permissive.
+a restrictive MASK and give the user no way to be more permissive.
The exceptions to this rule are when the file or directory should be
kept private (mail files, for instance). The perlfunc(1) entry on
-C<umask> discusses the choice of MODE in more detail.
+C<umask> discusses the choice of MASK in more detail.
=item msgctl ID,CMD,ARG
@@ -2274,37 +2487,42 @@ Calls the System V IPC function msgctl(2). You'll probably have to say
first to get the correct constant definitions. If CMD is C<IPC_STAT>,
then ARG must be a variable which will hold the returned C<msqid_ds>
-structure. Returns like C<ioctl()>: the undefined value for error, "C<0> but
-true" for zero, or the actual return value otherwise. See also
-C<IPC::SysV> and C<IPC::Semaphore::Msg> documentation.
+structure. Returns like C<ioctl>: the undefined value for error,
+C<"0 but true"> for zero, or the actual return value otherwise. See also
+C<IPC::SysV> and C<IPC::Semaphore> documentation.
=item msgget KEY,FLAGS
Calls the System V IPC function msgget(2). Returns the message queue
id, or the undefined value if there is an error. See also C<IPC::SysV>
-and C<IPC::SysV::Msg> documentation.
-
-=item msgsnd ID,MSG,FLAGS
-
-Calls the System V IPC function msgsnd to send the message MSG to the
-message queue ID. MSG must begin with the long integer message type,
-which may be created with C<pack("l", $type)>. Returns TRUE if
-successful, or FALSE if there is an error. See also C<IPC::SysV>
-and C<IPC::SysV::Msg> documentation.
+and C<IPC::Msg> documentation.
=item msgrcv ID,VAR,SIZE,TYPE,FLAGS
Calls the System V IPC function msgrcv to receive a message from
message queue ID into variable VAR with a maximum message size of
-SIZE. Note that if a message is received, the message type will be
-the first thing in VAR, and the maximum length of VAR is SIZE plus the
-size of the message type. Returns TRUE if successful, or FALSE if
-there is an error. See also C<IPC::SysV> and C<IPC::SysV::Msg> documentation.
+SIZE. Note that when a message is received, the message type as a
+native long integer will be the first thing in VAR, followed by the
+actual message. This packing may be opened with C<unpack("l! a*")>.
+Taints the variable. Returns true if successful, or false if there is
+an error. See also C<IPC::SysV> and C<IPC::SysV::Msg> documentation.
+
+=item msgsnd ID,MSG,FLAGS
+
+Calls the System V IPC function msgsnd to send the message MSG to the
+message queue ID. MSG must begin with the native long integer message
+type, and be followed by the length of the actual message, and finally
+the message itself. This kind of packing can be achieved with
+C<pack("l! a*", $type, $message)>. Returns true if successful,
+or false if there is an error. See also C<IPC::SysV>
+and C<IPC::SysV::Msg> documentation.
=item my EXPR
-A C<my()> declares the listed variables to be local (lexically) to the
-enclosing block, file, or C<eval()>. If
+=item my EXPR : ATTRIBUTES
+
+A C<my> declares the listed variables to be local (lexically) to the
+enclosing block, file, or C<eval>. If
more than one value is listed, the list must be placed in parentheses. See
L<perlsub/"Private Variables via my()"> for details.
@@ -2328,6 +2546,9 @@ C<next> cannot be used to exit a block which returns a value such as
C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
a grep() or map() operation.
+Note that a block by itself is semantically identical to a loop
+that executes once. Thus C<next> will exit such a block early.
+
See also L</continue> for an illustration of how C<last>, C<next>, and
C<redo> work.
@@ -2347,10 +2568,18 @@ hex in the standard Perl or C notation:
$val = oct($val) if $val =~ /^0/;
-If EXPR is omitted, uses C<$_>. This function is commonly used when
-a string such as C<644> needs to be converted into a file mode, for
-example. (Although perl will automatically convert strings into
-numbers as needed, this automatic conversion assumes base 10.)
+If EXPR is omitted, uses C<$_>. To go the other way (produce a number
+in octal), use sprintf() or printf():
+
+ $perms = (stat("filename"))[2] & 07777;
+ $oct_perms = sprintf "%lo", $perms;
+
+The oct() function is commonly used when a string such as C<644> needs
+to be converted into a file mode, for example. (Although perl will
+automatically convert strings into numbers as needed, this automatic
+conversion assumes base 10.)
+
+=item open FILEHANDLE,MODE,LIST
=item open FILEHANDLE,EXPR
@@ -2358,56 +2587,75 @@ numbers as needed, this automatic conversion assumes base 10.)
Opens the file whose filename is given by EXPR, and associates it with
FILEHANDLE. If FILEHANDLE is an expression, its value is used as the
-name of the real filehandle wanted. If EXPR is omitted, the scalar
+name of the real filehandle wanted. (This is considered a symbolic
+reference, so C<use strict 'refs'> should I<not> be in effect.)
+
+If EXPR is omitted, the scalar
variable of the same name as the FILEHANDLE contains the filename.
-(Note that lexical variables--those declared with C<my()>--will not work
-for this purpose; so if you're using C<my()>, specify EXPR in your call
+(Note that lexical variables--those declared with C<my>--will not work
+for this purpose; so if you're using C<my>, specify EXPR in your call
to open.) See L<perlopentut> for a kinder, gentler explanation of opening
files.
-If the filename begins with C<'E<lt>'> or nothing, the file is opened for input.
-If the filename begins with C<'E<gt>'>, the file is truncated and opened for
-output, being created if necessary. If the filename begins with C<'E<gt>E<gt>'>,
+If MODE is C<< '<' >> or nothing, the file is opened for input.
+If MODE is C<< '>' >>, the file is truncated and opened for
+output, being created if necessary. If MODE is C<<< '>>' >>>,
the file is opened for appending, again being created if necessary.
-You can put a C<'+'> in front of the C<'E<gt>'> or C<'E<lt>'> to indicate that
-you want both read and write access to the file; thus C<'+E<lt>'> is almost
-always preferred for read/write updates--the C<'+E<gt>'> mode would clobber the
+You can put a C<'+'> in front of the C<< '>' >> or C<< '<' >> to indicate that
+you want both read and write access to the file; thus C<< '+<' >> is almost
+always preferred for read/write updates--the C<< '+>' >> mode would clobber the
file first. You can't usually use either read-write mode for updating
textfiles, since they have variable length records. See the B<-i>
switch in L<perlrun> for a better approach. The file is created with
permissions of C<0666> modified by the process' C<umask> value.
-The prefix and the filename may be separated with spaces.
-These various prefixes correspond to the fopen(3) modes of C<'r'>, C<'r+'>, C<'w'>,
-C<'w+'>, C<'a'>, and C<'a+'>.
+These various prefixes correspond to the fopen(3) modes of C<'r'>, C<'r+'>,
+C<'w'>, C<'w+'>, C<'a'>, and C<'a+'>.
+
+In the 2-arguments (and 1-argument) form of the call the mode and
+filename should be concatenated (in this order), possibly separated by
+spaces. It is possible to omit the mode if the mode is C<< '<' >>.
If the filename begins with C<'|'>, the filename is interpreted as a
command to which output is to be piped, and if the filename ends with a
C<'|'>, the filename is interpreted as a command which pipes output to
us. See L<perlipc/"Using open() for IPC">
-for more examples of this. (You are not allowed to C<open()> to a command
+for more examples of this. (You are not allowed to C<open> to a command
+that pipes both in I<and> out, but see L<IPC::Open2>, L<IPC::Open3>,
+and L<perlipc/"Bidirectional Communication with Another Process">
+for alternatives.)
+
+If MODE is C<'|-'>, the filename is interpreted as a
+command to which output is to be piped, and if MODE is
+C<'-|'>, the filename is interpreted as a command which pipes output to
+us. In the 2-arguments (and 1-argument) form one should replace dash
+(C<'-'>) with the command. See L<perlipc/"Using open() for IPC">
+for more examples of this. (You are not allowed to C<open> to a command
that pipes both in I<and> out, but see L<IPC::Open2>, L<IPC::Open3>,
and L<perlipc/"Bidirectional Communication"> for alternatives.)
-Opening C<'-'> opens STDIN and opening C<'E<gt>-'> opens STDOUT. Open returns
-nonzero upon success, the undefined value otherwise. If the C<open()>
+In the 2-arguments (and 1-argument) form opening C<'-'> opens STDIN
+and opening C<< '>-' >> opens STDOUT.
+
+Open returns
+nonzero upon success, the undefined value otherwise. If the C<open>
involved a pipe, the return value happens to be the pid of the
subprocess.
If you're unfortunate enough to be running Perl on a system that
distinguishes between text files and binary files (modern operating
systems don't care), then you should check out L</binmode> for tips for
-dealing with this. The key distinction between systems that need C<binmode()>
+dealing with this. The key distinction between systems that need C<binmode>
and those that don't is their text file formats. Systems like Unix, MacOS, and
Plan9, which delimit lines with a single character, and which encode that
-character in C as C<"\n">, do not need C<binmode()>. The rest need it.
+character in C as C<"\n">, do not need C<binmode>. The rest need it.
When opening a file, it's usually a bad idea to continue normal execution
-if the request failed, so C<open()> is frequently used in connection with
-C<die()>. Even if C<die()> won't do what you want (say, in a CGI script,
+if the request failed, so C<open> is frequently used in connection with
+C<die>. Even if C<die> won't do what you want (say, in a CGI script,
where you want to make a nicely formatted error message (but there are
modules that can help with that problem)) you should always check
-the return value from opening a file. The infrequent exception is when
+the return value from opening a file. The infrequent exception is when
working with an unopened filehandle is actually what you want to do.
Examples:
@@ -2416,16 +2664,22 @@ Examples:
open ARTICLE or die "Can't find article $ARTICLE: $!\n";
while (<ARTICLE>) {...
- open(LOG, '>>/usr/spool/news/twitlog'); # (log is reserved)
+ open(LOG, '>>/usr/spool/news/twitlog'); # (log is reserved)
# if the open fails, output is discarded
- open(DBASE, '+<dbase.mine') # open for update
+ open(DBASE, '+<', 'dbase.mine') # open for update
+ or die "Can't open 'dbase.mine' for update: $!";
+
+ open(DBASE, '+<dbase.mine') # ditto
or die "Can't open 'dbase.mine' for update: $!";
- open(ARTICLE, "caesar <$article |") # decrypt article
+ open(ARTICLE, '-|', "caesar <$article") # decrypt article
+ or die "Can't start caesar: $!";
+
+ open(ARTICLE, "caesar <$article |") # ditto
or die "Can't start caesar: $!";
- open(EXTRACT, "|sort >/tmp/Tmp$$") # $$ is our process id
+ open(EXTRACT, "|sort >/tmp/Tmp$$") # $$ is our process id
or die "Can't start sort: $!";
# process argument list of files along with any includes
@@ -2453,13 +2707,15 @@ Examples:
}
You may also, in the Bourne shell tradition, specify an EXPR beginning
-with C<'E<gt>&'>, in which case the rest of the string is interpreted as the
+with C<< '>&' >>, in which case the rest of the string is interpreted as the
name of a filehandle (or file descriptor, if numeric) to be
-duped and opened. You may use C<&> after C<E<gt>>, C<E<gt>E<gt>>, C<E<lt>>, C<+E<gt>>,
-C<+E<gt>E<gt>>, and C<+E<lt>>. The
+duped and opened. You may use C<&> after C<< > >>, C<<< >> >>>,
+C<< < >>, C<< +> >>, C<<< +>> >>>, and C<< +< >>. The
mode you specify should match the mode of the original filehandle.
(Duping a filehandle does not take into account any existing contents of
-stdio buffers.)
+stdio buffers.) Duping file handles is not yet supported for 3-argument
+open().
+
Here is a script that saves, redirects, and restores STDOUT and
STDERR:
@@ -2467,8 +2723,8 @@ STDERR:
open(OLDOUT, ">&STDOUT");
open(OLDERR, ">&STDERR");
- open(STDOUT, ">foo.out") || die "Can't redirect stdout";
- open(STDERR, ">&STDOUT") || die "Can't dup stdout";
+ open(STDOUT, '>', "foo.out") || die "Can't redirect stdout";
+ open(STDERR, ">&STDOUT") || die "Can't dup stdout";
select(STDERR); $| = 1; # make unbuffered
select(STDOUT); $| = 1; # make unbuffered
@@ -2485,13 +2741,20 @@ STDERR:
print STDOUT "stdout 2\n";
print STDERR "stderr 2\n";
-If you specify C<'E<lt>&=N'>, where C<N> is a number, then Perl will do an
-equivalent of C's C<fdopen()> of that file descriptor; this is more
+If you specify C<< '<&=N' >>, where C<N> is a number, then Perl will do an
+equivalent of C's C<fdopen> of that file descriptor; this is more
parsimonious of file descriptors. For example:
open(FILEHANDLE, "<&=$fd")
-If you open a pipe on the command C<'-'>, i.e., either C<'|-'> or C<'-|'>, then
+Note that this feature depends on the fdopen() C library function.
+On many UNIX systems, fdopen() is known to fail when file descriptors
+exceed a certain value, typically 255. If you need more file
+descriptors than that, consider rebuilding Perl to use the C<sfio>
+library.
+
+If you open a pipe on the command C<'-'>, i.e., either C<'|-'> or C<'-|'>
+with 2-arguments (or 1-argument) form of open(), then
there is an implicit fork done, and the return value of open is the pid
of the child within the parent process, and C<0> within the child
process. (Use C<defined($pid)> to determine whether the open was successful.)
@@ -2502,26 +2765,33 @@ the new STDOUT or STDIN. Typically this is used like the normal
piped open when you want to exercise more control over just how the
pipe command gets executed, such as when you are running setuid, and
don't want to have to scan shell commands for metacharacters.
-The following pairs are more or less equivalent:
+The following triples are more or less equivalent:
open(FOO, "|tr '[a-z]' '[A-Z]'");
- open(FOO, "|-") || exec 'tr', '[a-z]', '[A-Z]';
+ open(FOO, '|-', "tr '[a-z]' '[A-Z]'");
+ open(FOO, '|-') || exec 'tr', '[a-z]', '[A-Z]';
open(FOO, "cat -n '$file'|");
- open(FOO, "-|") || exec 'cat', '-n', $file;
+ open(FOO, '-|', "cat -n '$file'");
+ open(FOO, '-|') || exec 'cat', '-n', $file;
See L<perlipc/"Safe Pipe Opens"> for more examples of this.
-NOTE: On any operation that may do a fork, any unflushed buffers remain
-unflushed in both processes, which means you may need to set C<$|> to
-avoid duplicate output. On systems that support a close-on-exec flag on
-files, the flag will be set for the newly opened file descriptor as
-determined by the value of $^F. See L<perlvar/$^F>.
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before any operation that may do a fork, but this may not be
+supported on some platforms (see L<perlport>). To be safe, you may need
+to set C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method
+of C<IO::Handle> on any open handles.
+
+On systems that support a
+close-on-exec flag on files, the flag will be set for the newly opened
+file descriptor as determined by the value of $^F. See L<perlvar/$^F>.
Closing any piped filehandle causes the parent process to wait for the
child to finish, and returns the status value in C<$?>.
-The filename passed to open will have leading and trailing
+The filename passed to 2-argument (or 1-argument) form of open()
+will have leading and trailing
whitespace deleted, and the normal redirection characters
honored. This property, known as "magic open",
can often be used to good effect. A user could specify a filename of
@@ -2530,14 +2800,32 @@ F<"rsh cat file |">, or you could change certain filenames as needed:
$filename =~ s/(.*\.gz)\s*$/gzip -dc < $1|/;
open(FH, $filename) or die "Can't open $filename: $!";
-However, to open a file with arbitrary weird characters in it, it's
-necessary to protect any leading and trailing whitespace:
+Use 3-argument form to open a file with arbitrary weird characters in it,
+
+ open(FOO, '<', $file);
+
+otherwise it's necessary to protect any leading and trailing whitespace:
$file =~ s#^(\s)#./$1#;
open(FOO, "< $file\0");
-If you want a "real" C C<open()> (see L<open(2)> on your system), then you
-should use the C<sysopen()> function, which involves no such magic. This is
+(this may not work on some bizzare filesystems). One should
+conscientiously choose between the the I<magic> and 3-arguments form
+of open():
+
+ open IN, $ARGV[0];
+
+will allow the user to specify an argument of the form C<"rsh cat file |">,
+but will not work on a filename which happens to have a trailing space, while
+
+ open IN, '<', $ARGV[0];
+
+will have exactly the opposite restrictions.
+
+If you want a "real" C C<open> (see L<open(2)> on your system), then you
+should use the C<sysopen> function, which involves no such magic (but
+may use subtly different filemodes than Perl open(), which is mapped
+to C fopen()). This is
another way to protect your filenames from interpretation. For example:
use IO::Handle;
@@ -2570,21 +2858,67 @@ See L</seek> for some details about mixing reading and writing.
=item opendir DIRHANDLE,EXPR
-Opens a directory named EXPR for processing by C<readdir()>, C<telldir()>,
-C<seekdir()>, C<rewinddir()>, and C<closedir()>. Returns TRUE if successful.
+Opens a directory named EXPR for processing by C<readdir>, C<telldir>,
+C<seekdir>, C<rewinddir>, and C<closedir>. Returns true if successful.
DIRHANDLEs have their own namespace separate from FILEHANDLEs.
=item ord EXPR
=item ord
-Returns the numeric ascii value of the first character of EXPR. If
+Returns the numeric (ASCII or Unicode) value of the first character of EXPR. If
EXPR is omitted, uses C<$_>. For the reverse, see L</chr>.
+See L<utf8> for more about Unicode.
+
+=item our EXPR
+
+An C<our> declares the listed variables to be valid globals within
+the enclosing block, file, or C<eval>. That is, it has the same
+scoping rules as a "my" declaration, but does not create a local
+variable. If more than one value is listed, the list must be placed
+in parentheses. The C<our> declaration has no semantic effect unless
+"use strict vars" is in effect, in which case it lets you use the
+declared global variable without qualifying it with a package name.
+(But only within the lexical scope of the C<our> declaration. In this
+it differs from "use vars", which is package scoped.)
+
+An C<our> declaration declares a global variable that will be visible
+across its entire lexical scope, even across package boundaries. The
+package in which the variable is entered is determined at the point
+of the declaration, not at the point of use. This means the following
+behavior holds:
+
+ package Foo;
+ our $bar; # declares $Foo::bar for rest of lexical scope
+ $bar = 20;
+
+ package Bar;
+ print $bar; # prints 20
+
+Multiple C<our> declarations in the same lexical scope are allowed
+if they are in different packages. If they happened to be in the same
+package, Perl will emit warnings if you have asked for them.
+
+ use warnings;
+ package Foo;
+ our $bar; # declares $Foo::bar for rest of lexical scope
+ $bar = 20;
+
+ package Bar;
+ our $bar = 30; # declares $Bar::bar for rest of lexical scope
+ print $bar; # prints 30
+
+ our $bar; # emits warning
=item pack TEMPLATE,LIST
-Takes an array or list of values and packs it into a binary structure,
-returning the string containing the structure. The TEMPLATE is a
+Takes a LIST of values and converts it into a string using the rules
+given by the TEMPLATE. The resulting string is the concatenation of
+the converted values. Typically, each converted value looks
+like its machine-level representation. For example, on 32-bit machines
+a converted integer may be represented by a sequence of 4 bytes.
+
+The TEMPLATE is a
sequence of characters that give the order and type of values, as
follows:
@@ -2592,22 +2926,23 @@ follows:
A An ascii string, will be space padded.
Z A null terminated (asciz) string, will be null padded.
- b A bit string (ascending bit order, like vec()).
- B A bit string (descending bit order).
+ b A bit string (ascending bit order inside each byte, like vec()).
+ B A bit string (descending bit order inside each byte).
h A hex string (low nybble first).
H A hex string (high nybble first).
c A signed char value.
- C An unsigned char value.
+ C An unsigned char value. Only does bytes. See U for Unicode.
s A signed short value.
S An unsigned short value.
(This 'short' is _exactly_ 16 bits, which may differ from
- what a local C compiler calls 'short'.)
+ what a local C compiler calls 'short'. If you want
+ native-length shorts, use the '!' suffix.)
i A signed integer value.
I An unsigned integer value.
- (This 'integer' is _at least_ 32 bits wide. Its exact
+ (This 'integer' is _at_least_ 32 bits wide. Its exact
size depends on what a local C compiler calls 'int',
and may even be larger than the 'long' described in
the next item.)
@@ -2615,19 +2950,20 @@ follows:
l A signed long value.
L An unsigned long value.
(This 'long' is _exactly_ 32 bits, which may differ from
- what a local C compiler calls 'long'.)
+ what a local C compiler calls 'long'. If you want
+ native-length longs, use the '!' suffix.)
- n A short in "network" (big-endian) order.
- N A long in "network" (big-endian) order.
- v A short in "VAX" (little-endian) order.
- V A long in "VAX" (little-endian) order.
+ n An unsigned short in "network" (big-endian) order.
+ N An unsigned long in "network" (big-endian) order.
+ v An unsigned short in "VAX" (little-endian) order.
+ V An unsigned long in "VAX" (little-endian) order.
(These 'shorts' and 'longs' are _exactly_ 16 bits and
_exactly_ 32 bits, respectively.)
q A signed quad (64-bit) value.
Q An unsigned quad value.
- (Available only if your system supports 64-bit integer values
- _and_ if Perl has been compiled to support those.
+ (Quads are available only if your system supports 64-bit
+ integer values _and_ if Perl has been compiled to support those.
Causes a fatal error otherwise.)
f A single-precision float in the native format.
@@ -2637,6 +2973,8 @@ follows:
P A pointer to a structure (fixed-length string).
u A uuencoded string.
+ U A Unicode character number. Encodes to UTF-8 internally.
+ Works even if C<use utf8> is not in effect.
w A BER compressed integer. Its bytes represent an unsigned
integer in base 128, most significant digit first, with as
@@ -2654,61 +2992,175 @@ The following rules apply:
=item *
Each letter may optionally be followed by a number giving a repeat
-count. With all types except C<"a">, C<"A">, C<"Z">, C<"b">, C<"B">, C<"h">,
-C<"H">, and C<"P"> the pack function will gobble up that many values from
+count. With all types except C<a>, C<A>, C<Z>, C<b>, C<B>, C<h>,
+C<H>, and C<P> the pack function will gobble up that many values from
the LIST. A C<*> for the repeat count means to use however many items are
-left.
+left, except for C<@>, C<x>, C<X>, where it is equivalent
+to C<0>, and C<u>, where it is equivalent to 1 (or 45, what is the
+same).
+
+When used with C<Z>, C<*> results in the addition of a trailing null
+byte (so the packed result will be one longer than the byte C<length>
+of the item).
+
+The repeat count for C<u> is interpreted as the maximal number of bytes
+to encode per line of output, with 0 and 1 replaced by 45.
=item *
-The C<"a">, C<"A">, and C<"Z"> types gobble just one value, but pack it as a
+The C<a>, C<A>, and C<Z> types gobble just one value, but pack it as a
string of length count, padding with nulls or spaces as necessary. When
-unpacking, C<"A"> strips trailing spaces and nulls, C<"Z"> strips everything
-after the first null, and C<"a"> returns data verbatim.
+unpacking, C<A> strips trailing spaces and nulls, C<Z> strips everything
+after the first null, and C<a> returns data verbatim. When packing,
+C<a>, and C<Z> are equivalent.
+
+If the value-to-pack is too long, it is truncated. If too long and an
+explicit count is provided, C<Z> packs only C<$count-1> bytes, followed
+by a null byte. Thus C<Z> always packs a trailing null byte under
+all circumstances.
=item *
-Likewise, the C<"b"> and C<"B"> fields pack a string that many bits long.
+Likewise, the C<b> and C<B> fields pack a string that many bits long.
+Each byte of the input field of pack() generates 1 bit of the result.
+Each result bit is based on the least-significant bit of the corresponding
+input byte, i.e., on C<ord($byte)%2>. In particular, bytes C<"0"> and
+C<"1"> generate bits 0 and 1, as do bytes C<"\0"> and C<"\1">.
+
+Starting from the beginning of the input string of pack(), each 8-tuple
+of bytes is converted to 1 byte of output. With format C<b>
+the first byte of the 8-tuple determines the least-significant bit of a
+byte, and with format C<B> it determines the most-significant bit of
+a byte.
+
+If the length of the input string is not exactly divisible by 8, the
+remainder is packed as if the input string were padded by null bytes
+at the end. Similarly, during unpack()ing the "extra" bits are ignored.
+
+If the input string of pack() is longer than needed, extra bytes are ignored.
+A C<*> for the repeat count of pack() means to use all the bytes of
+the input field. On unpack()ing the bits are converted to a string
+of C<"0">s and C<"1">s.
=item *
-The C<"h"> and C<"H"> fields pack a string that many nybbles long.
+The C<h> and C<H> fields pack a string that many nybbles (4-bit groups,
+representable as hexadecimal digits, 0-9a-f) long.
+
+Each byte of the input field of pack() generates 4 bits of the result.
+For non-alphabetical bytes the result is based on the 4 least-significant
+bits of the input byte, i.e., on C<ord($byte)%16>. In particular,
+bytes C<"0"> and C<"1"> generate nybbles 0 and 1, as do bytes
+C<"\0"> and C<"\1">. For bytes C<"a".."f"> and C<"A".."F"> the result
+is compatible with the usual hexadecimal digits, so that C<"a"> and
+C<"A"> both generate the nybble C<0xa==10>. The result for bytes
+C<"g".."z"> and C<"G".."Z"> is not well-defined.
+
+Starting from the beginning of the input string of pack(), each pair
+of bytes is converted to 1 byte of output. With format C<h> the
+first byte of the pair determines the least-significant nybble of the
+output byte, and with format C<H> it determines the most-significant
+nybble.
+
+If the length of the input string is not even, it behaves as if padded
+by a null byte at the end. Similarly, during unpack()ing the "extra"
+nybbles are ignored.
+
+If the input string of pack() is longer than needed, extra bytes are ignored.
+A C<*> for the repeat count of pack() means to use all the bytes of
+the input field. On unpack()ing the bits are converted to a string
+of hexadecimal digits.
=item *
-The C<"p"> type packs a pointer to a null-terminated string. You are
+The C<p> type packs a pointer to a null-terminated string. You are
responsible for ensuring the string is not a temporary value (which can
potentially get deallocated before you get around to using the packed result).
-The C<"P"> type packs a pointer to a structure of the size indicated by the
-length. A NULL pointer is created if the corresponding value for C<"p"> or
-C<"P"> is C<undef>.
+The C<P> type packs a pointer to a structure of the size indicated by the
+length. A NULL pointer is created if the corresponding value for C<p> or
+C<P> is C<undef>, similarly for unpack().
+
+=item *
+
+The C</> template character allows packing and unpacking of strings where
+the packed structure contains a byte count followed by the string itself.
+You write I<length-item>C</>I<string-item>.
+
+The I<length-item> can be any C<pack> template letter,
+and describes how the length value is packed.
+The ones likely to be of most use are integer-packing ones like
+C<n> (for Java strings), C<w> (for ASN.1 or SNMP)
+and C<N> (for Sun XDR).
+
+The I<string-item> must, at present, be C<"A*">, C<"a*"> or C<"Z*">.
+For C<unpack> the length of the string is obtained from the I<length-item>,
+but if you put in the '*' it will be ignored.
+
+ unpack 'C/a', "\04Gurusamy"; gives 'Guru'
+ unpack 'a3/A* A*', '007 Bond J '; gives (' Bond','J')
+ pack 'n/a* w/a*','hello,','world'; gives "\000\006hello,\005world"
+
+The I<length-item> is not returned explicitly from C<unpack>.
+
+Adding a count to the I<length-item> letter is unlikely to do anything
+useful, unless that letter is C<A>, C<a> or C<Z>. Packing with a
+I<length-item> of C<a> or C<Z> may introduce C<"\000"> characters,
+which Perl does not regard as legal in numeric strings.
+
+=item *
+
+The integer types C<s>, C<S>, C<l>, and C<L> may be
+immediately followed by a C<!> suffix to signify native shorts or
+longs--as you can see from above for example a bare C<l> does mean
+exactly 32 bits, the native C<long> (as seen by the local C compiler)
+may be larger. This is an issue mainly in 64-bit platforms. You can
+see whether using C<!> makes any difference by
+
+ print length(pack("s")), " ", length(pack("s!")), "\n";
+ print length(pack("l")), " ", length(pack("l!")), "\n";
+
+C<i!> and C<I!> also work but only because of completeness;
+they are identical to C<i> and C<I>.
+
+The actual sizes (in bytes) of native shorts, ints, longs, and long
+longs on the platform where Perl was built are also available via
+L<Config>:
+
+ use Config;
+ print $Config{shortsize}, "\n";
+ print $Config{intsize}, "\n";
+ print $Config{longsize}, "\n";
+ print $Config{longlongsize}, "\n";
+
+(The C<$Config{longlongsize}> will be undefine if your system does
+not support long longs.)
=item *
-The integer formats C<"s">, C<"S">, C<"i">, C<"I">, C<"l">, and C<"L">
+The integer formats C<s>, C<S>, C<i>, C<I>, C<l>, and C<L>
are inherently non-portable between processors and operating systems
because they obey the native byteorder and endianness. For example a
-4-byte integer 0x87654321 (2271560481 decimal) be ordered natively
+4-byte integer 0x12345678 (305419896 decimal) be ordered natively
(arranged in and handled by the CPU registers) into bytes as
-
+
0x12 0x34 0x56 0x78 # little-endian
0x78 0x56 0x34 0x12 # big-endian
-
-Basically, the Intel, Alpha, and VAX CPUs and little-endian, while
+
+Basically, the Intel, Alpha, and VAX CPUs are little-endian, while
everybody else, for example Motorola m68k/88k, PPC, Sparc, HP PA,
Power, and Cray are big-endian. MIPS can be either: Digital used it
-in little-endian mode, SGI uses it in big-endian mode.
+in little-endian mode; SGI uses it in big-endian mode.
-The names `big-endian' and `little-endian' are joking references to
+The names `big-endian' and `little-endian' are comic references to
the classic "Gulliver's Travels" (via the paper "On Holy Wars and a
Plea for Peace" by Danny Cohen, USC/ISI IEN 137, April 1, 1980) and
-the egg-eating habits of the lilliputs.
-
-Some systems may even have weird byte orders such as
-
+the egg-eating habits of the Lilliputians.
+
+Some systems may have even weirder byte orders such as
+
0x56 0x78 0x12 0x34
0x34 0x12 0x78 0x56
-
+
You can see your system's preference with
print join(" ", map { sprintf "%#02x", $_ }
@@ -2723,8 +3175,9 @@ via L<Config>:
Byteorders C<'1234'> and C<'12345678'> are little-endian, C<'4321'>
and C<'87654321'> are big-endian.
-If you want portable packed integers use the formats C<"n">, C<"N">,
-C<"v">, and C<"V">, their byte endianness and size is known.
+If you want portable packed integers use the formats C<n>, C<N>,
+C<v>, and C<V>, their byte endianness and size is known.
+See also L<perlport>.
=item *
@@ -2734,12 +3187,30 @@ standard "network" representation, no facility for interchange has been
made. This means that packed floating point data written on one machine
may not be readable on another - even if both use IEEE floating point
arithmetic (as the endian-ness of the memory representation is not part
-of the IEEE spec).
+of the IEEE spec). See also L<perlport>.
Note that Perl uses doubles internally for all numeric calculation, and
converting from double into float and thence back to double again will
lose precision (i.e., C<unpack("f", pack("f", $foo)>) will not in general
-equal C<$foo>).
+equal $foo).
+
+=item *
+
+You must yourself do any alignment or padding by inserting for example
+enough C<'x'>es while packing. There is no way to pack() and unpack()
+could know where the bytes are going to or coming from. Therefore
+C<pack> (and C<unpack>) handle their output and input as flat
+sequences of bytes.
+
+=item *
+
+A comment in a TEMPLATE starts with C<#> and goes to the end of line.
+
+=item *
+
+If TEMPLATE requires more arguments to pack() than actually given, pack()
+assumes additional C<""> arguments. If TEMPLATE requires less arguments
+to pack() than actually given, extra arguments are ignored.
=back
@@ -2749,10 +3220,17 @@ Examples:
# foo eq "ABCD"
$foo = pack("C4",65,66,67,68);
# same thing
+ $foo = pack("U4",0x24b6,0x24b7,0x24b8,0x24b9);
+ # same thing with Unicode circled letters
$foo = pack("ccxxcc",65,66,67,68);
# foo eq "AB\0\0CD"
+ # note: the above examples featuring "C" and "c" are true
+ # only on ASCII and ASCII-derived systems such as ISO Latin 1
+ # and UTF-8. In EBCDIC the first example would be
+ # $foo = pack("CCCC",193,194,195,196);
+
$foo = pack("s2",1,2);
# "\1\0\2\0" on little-endian
# "\0\1\0\2" on big-endian
@@ -2780,6 +3258,12 @@ Examples:
unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
+ $foo = pack('sx2l', 12, 34);
+ # short 12, two zero bytes padding, long 34
+ $bar = pack('s@4l', 12, 34);
+ # short 12, zero fill to position 4, long 34
+ # $foo eq $bar
+
The same template may generally also be used in unpack().
=item package
@@ -2788,11 +3272,11 @@ The same template may generally also be used in unpack().
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, file, or eval (the same as the C<my()> operator).
+of the enclosing block, file, or eval (the same as the C<my> operator).
All further unqualified dynamic identifiers will be in this namespace.
A package statement affects only dynamic variables--including those
-you've used C<local()> on--but I<not> lexical variables, which are created
-with C<my()>. Typically it would be the first declaration in a file to
+you've used C<local> on--but I<not> lexical variables, which are created
+with C<my>. Typically it would be the first declaration in a file to
be included by the C<require> or C<use> operator. You can switch into a
package in more than one place; it merely influences which symbol table
is used by the compiler for the rest of that block. You can refer to
@@ -2829,13 +3313,14 @@ See L<perlvar/$^F>.
=item pop
Pops and returns the last value of the array, shortening the array by
-one element. Has a similar effect to
+one element. Has an effect similar to
- $tmp = $ARRAY[$#ARRAY--];
+ $ARRAY[$#ARRAY--]
-If there are no elements in the array, returns the undefined value.
-If ARRAY is omitted, pops the C<@ARGV> array in the main program, and
-the C<@_> array in subroutines, just like C<shift()>.
+If there are no elements in the array, returns the undefined value
+(although this may happen at other times as well). If ARRAY is
+omitted, pops the C<@ARGV> array in the main program, and the C<@_>
+array in subroutines, just like C<shift>.
=item pos SCALAR
@@ -2853,22 +3338,26 @@ L<perlop>.
=item print
-Prints a string or a comma-separated list of strings. Returns TRUE
-if successful. FILEHANDLE may be a scalar variable name, in which case
-the variable contains the name of or a reference to the filehandle, thus
-introducing one level of indirection. (NOTE: If FILEHANDLE is a variable
-and the next token is a term, it may be misinterpreted as an operator
+Prints a string or a list of strings. Returns true if successful.
+FILEHANDLE may be a scalar variable name, in which case the variable
+contains the name of or a reference to the filehandle, thus introducing
+one level of indirection. (NOTE: If FILEHANDLE is a variable and
+the next token is a term, it may be misinterpreted as an operator
unless you interpose a C<+> or put parentheses around the arguments.)
-If FILEHANDLE is omitted, prints by default to standard output (or to the
-last selected output channel--see L</select>). If LIST is also omitted,
-prints C<$_> to the currently selected output channel. To set the default
-output channel to something other than STDOUT use the select operation.
-Note that, because print takes a LIST, anything in the LIST is evaluated
-in list context, and any subroutine that you call will have one or
-more of its expressions evaluated in list context. Also be careful
-not to follow the print keyword with a left parenthesis unless you want
-the corresponding right parenthesis to terminate the arguments to the
-print--interpose a C<+> or put parentheses around all the arguments.
+If FILEHANDLE is omitted, prints by default to standard output (or
+to the last selected output channel--see L</select>). If LIST is
+also omitted, prints C<$_> to the currently selected output channel.
+To set the default output channel to something other than STDOUT
+use the select operation. The current value of C<$,> (if any) is
+printed between each LIST item. The current value of C<$\> (if
+any) is printed after the entire LIST has been printed. Because
+print takes a LIST, anything in the LIST is evaluated in list
+context, and any subroutine that you call will have one or more of
+its expressions evaluated in list context. Also be careful not to
+follow the print keyword with a left parenthesis unless you want
+the corresponding right parenthesis to terminate the arguments to
+the print--interpose a C<+> or put parentheses around all the
+arguments.
Note that if you're storing FILEHANDLES in an array or other expression,
you will have to use a block returning its value instead:
@@ -2882,12 +3371,12 @@ you will have to use a block returning its value instead:
Equivalent to C<print FILEHANDLE sprintf(FORMAT, LIST)>, except that C<$\>
(the output record separator) is not appended. The first argument
-of the list will be interpreted as the C<printf()> format. If C<use locale> is
+of the list will be interpreted as the C<printf> format. If C<use locale> is
in effect, the character used for the decimal point in formatted real numbers
is affected by the LC_NUMERIC locale. See L<perllocale>.
-Don't fall into the trap of using a C<printf()> when a simple
-C<print()> would do. The C<print()> is more efficient and less
+Don't fall into the trap of using a C<printf> when a simple
+C<print> would do. The C<print> is more efficient and less
error prone.
=item prototype FUNCTION
@@ -2899,7 +3388,7 @@ the function whose prototype you want to retrieve.
If FUNCTION is a string starting with C<CORE::>, the rest is taken as a
name for Perl builtin. If the builtin is not I<overridable> (such as
C<qw//>) or its arguments cannot be expressed by a prototype (such as
-C<system()>) returns C<undef> because the builtin does not really behave
+C<system>) returns C<undef> because the builtin does not really behave
like a Perl function. Otherwise, the string describing the equivalent
prototype is returned.
@@ -2946,8 +3435,8 @@ If EXPR is omitted, uses C<$_>.
Returns a random fractional number greater than or equal to C<0> and less
than the value of EXPR. (EXPR should be positive.) If EXPR is
-omitted, the value C<1> is used. Automatically calls C<srand()> unless
-C<srand()> has already been called. See also C<srand()>.
+omitted, the value C<1> is used. Automatically calls C<srand> unless
+C<srand> has already been called. See also C<srand>.
(Note: If your rand function consistently returns numbers that are too
large or too small, then your version of Perl was probably compiled
@@ -2963,18 +3452,18 @@ C<0> at end of file, or undef if there was an error. SCALAR will be grown
or shrunk to the length actually read. An OFFSET may be specified to
place the read data at some other place than the beginning of the
string. This call is actually implemented in terms of stdio's fread(3)
-call. To get a true read(2) system call, see C<sysread()>.
+call. To get a true read(2) system call, see C<sysread>.
=item readdir DIRHANDLE
-Returns the next directory entry for a directory opened by C<opendir()>.
+Returns the next directory entry for a directory opened by C<opendir>.
If used in list context, returns all the rest of the entries in the
directory. If there are no more entries, returns an undefined value in
scalar context or a null list in list context.
-If you're planning to filetest the return values out of a C<readdir()>, you'd
+If you're planning to filetest the return values out of a C<readdir>, you'd
better prepend the directory in question. Otherwise, because we didn't
-C<chdir()> there, it would have been testing the wrong file.
+C<chdir> there, it would have been testing the wrong file.
opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
@@ -2993,8 +3482,8 @@ When C<$/> is set to C<undef>, when readline() is in scalar
context (i.e. file slurp mode), and when an empty file is read, it
returns C<''> the first time, followed by C<undef> subsequently.
-This is the internal function implementing the C<E<lt>EXPRE<gt>>
-operator, but you can use it directly. The C<E<lt>EXPRE<gt>>
+This is the internal function implementing the C<< <EXPR> >>
+operator, but you can use it directly. The C<< <EXPR> >>
operator is discussed in more detail in L<perlop/"I/O Operators">.
$line = <STDIN>;
@@ -3023,12 +3512,13 @@ operator is discussed in more detail in L<perlop/"I/O Operators">.
=item recv SOCKET,SCALAR,LENGTH,FLAGS
Receives a message on a socket. Attempts to receive LENGTH bytes of
-data into variable SCALAR from the specified SOCKET filehandle.
-Actually does a C C<recvfrom()>, so that it can return the address of the
-sender. Returns the undefined value if there's an error. SCALAR will
-be grown or shrunk to the length actually read. Takes the same flags
-as the system call of the same name.
-See L<perlipc/"UDP: Message Passing"> for examples.
+data into variable SCALAR from the specified SOCKET filehandle. SCALAR
+will be grown or shrunk to the length actually read. Takes the same
+flags as the system call of the same name. Returns the address of the
+sender if SOCKET's protocol supports this; returns an empty string
+otherwise. If there's an error, returns the undefined value. This call
+is actually implemented in terms of recvfrom(2) system call. See
+L<perlipc/"UDP: Message Passing"> for examples.
=item redo LABEL
@@ -3061,6 +3551,10 @@ C<redo> cannot be used to retry a block which returns a value such as
C<eval {}>, C<sub {}> or C<do {}>, and should not be used to exit
a grep() or map() operation.
+Note that a block by itself is semantically identical to a loop
+that executes once. Thus C<redo> inside such a block will effectively
+turn it into a looping construct.
+
See also L</continue> for an illustration of how C<last>, C<next>, and
C<redo> work.
@@ -3068,20 +3562,21 @@ C<redo> work.
=item ref
-Returns a TRUE value if EXPR is a reference, FALSE otherwise. If EXPR
+Returns a true value if EXPR is a reference, false otherwise. If EXPR
is not specified, C<$_> will be used. The value returned depends on the
type of thing the reference is a reference to.
Builtin types include:
- REF
SCALAR
ARRAY
HASH
CODE
+ REF
GLOB
+ LVALUE
If the referenced object has been blessed into a package, then that package
-name is returned instead. You can think of C<ref()> as a C<typeof()> operator.
+name is returned instead. You can think of C<ref> as a C<typeof> operator.
if (ref($r) eq "HASH") {
print "r is a reference to a hash.\n";
@@ -3097,7 +3592,9 @@ See also L<perlref>.
=item rename OLDNAME,NEWNAME
-Changes the name of a file. Returns C<1> for success, C<0> otherwise.
+Changes the name of a file; an existing file NEWNAME will be
+clobbered. Returns true for success, false otherwise.
+
Behavior of this function varies wildly depending on your system
implementation. For example, it will usually not work across file system
boundaries, even though the system I<mv> command sometimes compensates
@@ -3105,17 +3602,29 @@ for this. Other restrictions include whether it works on directories,
open files, or pre-existing files. Check L<perlport> and either the
rename(2) manpage or equivalent system documentation for details.
+=item require VERSION
+
=item require EXPR
=item require
Demands some semantics specified by EXPR, or by C<$_> if EXPR is not
-supplied. If EXPR is numeric, demands that the current version of Perl
-(C<$]> or $PERL_VERSION) be equal or greater than EXPR.
+supplied.
+
+If a VERSION is specified as a literal of the form v5.6.1,
+demands that the current version of Perl (C<$^V> or $PERL_VERSION) be
+at least as recent as that version, at run time. (For compatibility
+with older versions of Perl, a numeric argument will also be interpreted
+as VERSION.) Compare with L</use>, which can do a similar check at
+compile time.
+
+ require v5.6.1; # run time version check
+ require 5.6.1; # ditto
+ require 5.005_03; # float version allowed for compatibility
Otherwise, demands that a library file be included if it hasn't already
been included. The file is included via the do-FILE mechanism, which is
-essentially just a variety of C<eval()>. Has semantics similar to the following
+essentially just a variety of C<eval>. Has semantics similar to the following
subroutine:
sub require {
@@ -3126,23 +3635,24 @@ subroutine:
foreach $prefix (@INC) {
$realfilename = "$prefix/$filename";
if (-f $realfilename) {
+ $INC{$filename} = $realfilename;
$result = do $realfilename;
last ITER;
}
}
die "Can't find $filename in \@INC";
}
+ delete $INC{$filename} if $@ || !$result;
die $@ if $@;
die "$filename did not return true value" unless $result;
- $INC{$filename} = $realfilename;
return $result;
}
Note that the file will not be included twice under the same specified
-name. The file must return TRUE as the last statement to indicate
+name. The file must return true as the last statement to indicate
successful execution of any initialization code, so it's customary to
-end such a file with "C<1;>" unless you're sure it'll return TRUE
-otherwise. But it's better just to put the "C<1;>", in case you add more
+end such a file with C<1;> unless you're sure it'll return true
+otherwise. But it's better just to put the C<1;>, in case you add more
statements.
If EXPR is a bareword, the require assumes a "F<.pm>" extension and
@@ -3165,7 +3675,7 @@ But if you try this:
require "Foo::Bar"; # not a bareword because of the ""
The require function will look for the "F<Foo::Bar>" file in the @INC array and
-will complain about not finding "F<Foo::Bar>" there. In this case you can do:
+will complain about not finding "F<Foo::Bar>" there. In this case you can do:
eval "require $class";
@@ -3198,10 +3708,10 @@ See L</my>.
=item return
-Returns from a subroutine, C<eval()>, or C<do FILE> with the value
+Returns from a subroutine, C<eval>, or C<do FILE> with the value
given in EXPR. Evaluation of EXPR may be in list, scalar, or void
context, depending on how the return value will be used, and the context
-may vary from one execution to the next (see C<wantarray()>). If no EXPR
+may vary from one execution to the next (see C<wantarray>). If no EXPR
is given, returns an empty list in list context, the undefined value in
scalar context, and (of course) nothing at all in a void context.
@@ -3232,7 +3742,7 @@ on a large hash, such as from a DBM file.
=item rewinddir DIRHANDLE
Sets the current position to the beginning of the directory for the
-C<readdir()> routine on DIRHANDLE.
+C<readdir> routine on DIRHANDLE.
=item rindex STR,SUBSTR,POSITION
@@ -3247,7 +3757,7 @@ last occurrence at or before that position.
=item rmdir
Deletes the directory specified by FILENAME if that directory is empty. If it
-succeeds it returns TRUE, otherwise it returns FALSE and sets C<$!> (errno). If
+succeeds it returns true, otherwise it returns false and sets C<$!> (errno). If
FILENAME is omitted, uses C<$_>.
=item s///
@@ -3267,7 +3777,7 @@ needed. If you really wanted to do so, however, you could use
the construction C<@{[ (some expression) ]}>, but usually a simple
C<(some expression)> suffices.
-Since C<scalar> is a unary operator, if you accidentally use for EXPR a
+Because C<scalar> is unary operator, if you accidentally use for EXPR a
parenthesized list, this behaves as a scalar comma expression, evaluating
all but the last element in void context and returning the final element
evaluated in scalar context. This is seldom what you want.
@@ -3285,17 +3795,18 @@ See L<perlop> for more details on unary operators and the comma operator.
=item seek FILEHANDLE,POSITION,WHENCE
-Sets FILEHANDLE's position, just like the C<fseek()> call of C<stdio()>.
+Sets FILEHANDLE's position, just like the C<fseek> call of C<stdio>.
FILEHANDLE may be an expression whose value gives the name of the
filehandle. The values for WHENCE are C<0> to set the new position to
-POSITION, C<1> to set it to the current position plus POSITION, and C<2> to
-set it to EOF plus POSITION (typically negative). For WHENCE you may
-use the constants C<SEEK_SET>, C<SEEK_CUR>, and C<SEEK_END> from either the
-C<IO::Seekable> or the POSIX module. Returns C<1> upon success, C<0> otherwise.
+POSITION, C<1> to set it to the current position plus POSITION, and
+C<2> to set it to EOF plus POSITION (typically negative). For WHENCE
+you may use the constants C<SEEK_SET>, C<SEEK_CUR>, and C<SEEK_END>
+(start of the file, current position, end of the file) from the Fcntl
+module. Returns C<1> upon success, C<0> otherwise.
-If you want to position file for C<sysread()> or C<syswrite()>, don't use
-C<seek()> -- buffering makes its effect on the file's system position
-unpredictable and non-portable. Use C<sysseek()> instead.
+If you want to position file for C<sysread> or C<syswrite>, don't use
+C<seek>--buffering makes its effect on the file's system position
+unpredictable and non-portable. Use C<sysseek> instead.
Due to the rules and rigors of ANSI C, on some systems you have to do a
seek whenever you switch between reading and writing. Amongst other
@@ -3306,9 +3817,9 @@ A WHENCE of C<1> (C<SEEK_CUR>) is useful for not moving the file position:
This is also useful for applications emulating C<tail -f>. Once you hit
EOF on your read, and then sleep for a while, you might have to stick in a
-seek() to reset things. The C<seek()> doesn't change the current position,
+seek() to reset things. The C<seek> doesn't change the current position,
but it I<does> clear the end-of-file condition on the handle, so that the
-next C<E<lt>FILEE<gt>> makes Perl try again to read something. We hope.
+next C<< <FILE> >> makes Perl try again to read something. We hope.
If that doesn't work (some stdios are particularly cantankerous), then
you may need something more like this:
@@ -3324,8 +3835,8 @@ you may need something more like this:
=item seekdir DIRHANDLE,POS
-Sets the current position for the C<readdir()> routine on DIRHANDLE. POS
-must be a value returned by C<telldir()>. Has the same caveats about
+Sets the current position for the C<readdir> routine on DIRHANDLE. POS
+must be a value returned by C<telldir>. Has the same caveats about
possible directory compaction as the corresponding system library
routine.
@@ -3335,7 +3846,7 @@ routine.
Returns the currently selected filehandle. Sets the current default
filehandle for output, if FILEHANDLE is supplied. This has two
-effects: first, a C<write()> or a C<print()> without a filehandle will
+effects: first, a C<write> or a C<print> without a filehandle will
default to this FILEHANDLE. Second, references to variables related to
output will refer to this output channel. For example, if you have to
set the top of form format for more than one output channel, you might
@@ -3360,7 +3871,7 @@ methods, preferring to write the last example as:
=item select RBITS,WBITS,EBITS,TIMEOUT
This calls the select(2) system call with the bit masks specified, which
-can be constructed using C<fileno()> and C<vec()>, along these lines:
+can be constructed using C<fileno> and C<vec>, along these lines:
$rin = $win = $ein = '';
vec($rin,fileno(STDIN),1) = 1;
@@ -3389,33 +3900,35 @@ or to block until something becomes ready just do this
$nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);
-Most systems do not bother to return anything useful in C<$timeleft>, so
-calling select() in scalar context just returns C<$nfound>.
+Most systems do not bother to return anything useful in $timeleft, so
+calling select() in scalar context just returns $nfound.
Any of the bit masks can also be undef. The timeout, if specified, is
in seconds, which may be fractional. Note: not all implementations are
-capable of returning theC<$timeleft>. If not, they always return
-C<$timeleft> equal to the supplied C<$timeout>.
+capable of returning the$timeleft. If not, they always return
+$timeleft equal to the supplied $timeout.
You can effect a sleep of 250 milliseconds this way:
select(undef, undef, undef, 0.25);
-B<WARNING>: One should not attempt to mix buffered I/O (like C<read()>
-or E<lt>FHE<gt>) with C<select()>, except as permitted by POSIX, and even
-then only on POSIX systems. You have to use C<sysread()> instead.
+B<WARNING>: One should not attempt to mix buffered I/O (like C<read>
+or <FH>) with C<select>, except as permitted by POSIX, and even
+then only on POSIX systems. You have to use C<sysread> instead.
=item semctl ID,SEMNUM,CMD,ARG
-Calls the System V IPC function C<semctl()>. You'll probably have to say
+Calls the System V IPC function C<semctl>. You'll probably have to say
use IPC::SysV;
first to get the correct constant definitions. If CMD is IPC_STAT or
GETALL, then ARG must be a variable which will hold the returned
-semid_ds structure or semaphore value array. Returns like C<ioctl()>: the
-undefined value for error, "C<0> but true" for zero, or the actual return
-value otherwise. See also C<IPC::SysV> and C<IPC::Semaphore> documentation.
+semid_ds structure or semaphore value array. Returns like C<ioctl>:
+the undefined value for error, "C<0 but true>" for zero, or the actual
+return value otherwise. The ARG must consist of a vector of native
+short integers, which may may be created with C<pack("s!",(0)x$nsem)>.
+See also C<IPC::SysV> and C<IPC::Semaphore> documentation.
=item semget KEY,NSEMS,FLAGS
@@ -3429,9 +3942,9 @@ Calls the System V IPC function semop to perform semaphore operations
such as signaling and waiting. OPSTRING must be a packed array of
semop structures. Each semop structure can be generated with
C<pack("sss", $semnum, $semop, $semflag)>. The number of semaphore
-operations is implied by the length of OPSTRING. Returns TRUE if
-successful, or FALSE if there is an error. As an example, the
-following code waits on semaphore C<$semnum> of semaphore id C<$semid>:
+operations is implied by the length of OPSTRING. Returns true if
+successful, or false if there is an error. As an example, the
+following code waits on semaphore $semnum of semaphore id $semid:
$semop = pack("sss", $semnum, -1, 0);
die "Semaphore trouble: $!\n" unless semop($semid, $semop);
@@ -3445,7 +3958,7 @@ and C<IPC::SysV::Semaphore> documentation.
Sends a message on a socket. Takes the same flags as the system call
of the same name. On unconnected sockets you must specify a
-destination to send TO, in which case it does a C C<sendto()>. Returns
+destination to send TO, in which case it does a C C<sendto>. Returns
the number of characters sent, or the undefined value if there is an
error. The C system call sendmsg(2) is currently unimplemented.
See L<perlipc/"UDP: Message Passing"> for examples.
@@ -3454,9 +3967,10 @@ See L<perlipc/"UDP: Message Passing"> for examples.
Sets the current process group for the specified PID, C<0> for the current
process. Will produce a fatal error if used on a machine that doesn't
-implement setpgrp(2). If the arguments are omitted, it defaults to
-C<0,0>. Note that the POSIX version of C<setpgrp()> does not accept any
-arguments, so only C<setpgrp(0,0)> is portable. See also C<POSIX::setsid()>.
+implement POSIX setpgid(2) or BSD setpgrp(2). If the arguments are omitted,
+it defaults to C<0,0>. Note that the BSD 4.2 version of C<setpgrp> does not
+accept any arguments, so only C<setpgrp(0,0)> is portable. See also
+C<POSIX::setsid()>.
=item setpriority WHICH,WHO,PRIORITY
@@ -3479,9 +3993,11 @@ array by 1 and moving everything down. If there are no elements in the
array, returns the undefined value. If ARRAY is omitted, shifts the
C<@_> array within the lexical scope of subroutines and formats, and the
C<@ARGV> array at file scopes or within the lexical scopes established by
-the C<eval ''>, C<BEGIN {}>, C<END {}>, and C<INIT {}> constructs.
-See also C<unshift()>, C<push()>, and C<pop()>. C<Shift()> and C<unshift()> do the
-same thing to the left end of an array that C<pop()> and C<push()> do to the
+the C<eval ''>, C<BEGIN {}>, C<INIT {}>, C<CHECK {}>, and C<END {}>
+constructs.
+
+See also C<unshift>, C<push>, and C<pop>. C<Shift()> and C<unshift> do the
+same thing to the left end of an array that C<pop> and C<push> do to the
right end.
=item shmctl ID,CMD,ARG
@@ -3511,9 +4027,9 @@ position POS for size SIZE by attaching to it, copying in/out, and
detaching from it. When reading, VAR must be a variable that will
hold the data read. When writing, if STRING is too long, only SIZE
bytes are used; if STRING is too short, nulls are written to fill out
-SIZE bytes. Return TRUE if successful, or FALSE if there is an error.
-See also C<IPC::SysV> documentation and the C<IPC::Shareable> module
-from CPAN.
+SIZE bytes. Return true if successful, or false if there is an error.
+shmread() taints the variable. See also C<IPC::SysV> documentation and
+the C<IPC::Shareable> module from CPAN.
=item shutdown SOCKET,HOW
@@ -3527,7 +4043,7 @@ has the same interpretation as in the system call of the same name.
This is useful with sockets when you want to tell the other
side you're done writing but not done reading, or vice versa.
It's also a more insistent form of close because it also
-disables the filedescriptor in any forked copies in other
+disables the file descriptor in any forked copies in other
processes.
=item sin EXPR
@@ -3537,7 +4053,7 @@ processes.
Returns the sine of EXPR (expressed in radians). If EXPR is omitted,
returns sine of C<$_>.
-For the inverse sine operation, you may use the C<POSIX::asin()>
+For the inverse sine operation, you may use the C<Math::Trig::asin>
function, or use this relation:
sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
@@ -3549,8 +4065,8 @@ function, or use this relation:
Causes the script to sleep for EXPR seconds, or forever if no EXPR.
May be interrupted if the process receives a signal such as C<SIGALRM>.
Returns the number of seconds actually slept. You probably cannot
-mix C<alarm()> and C<sleep()> calls, because C<sleep()> is often implemented
-using C<alarm()>.
+mix C<alarm> and C<sleep> calls, because C<sleep> is often implemented
+using C<alarm>.
On some older systems, it may sleep up to a full second less than what
you requested, depending on how it counts seconds. Most modern systems
@@ -3559,26 +4075,36 @@ however, because your process might not be scheduled right away in a
busy multitasking system.
For delays of finer granularity than one second, you may use Perl's
-C<syscall()> interface to access setitimer(2) if your system supports it,
-or else see L</select> above.
+C<syscall> interface to access setitimer(2) if your system supports
+it, or else see L</select> above. The Time::HiRes module from CPAN
+may also help.
-See also the POSIX module's C<sigpause()> function.
+See also the POSIX module's C<sigpause> function.
=item socket SOCKET,DOMAIN,TYPE,PROTOCOL
Opens a socket of the specified kind and attaches it to filehandle
-SOCKET. DOMAIN, TYPE, and PROTOCOL are specified the same as for the
-system call of the same name. You should "C<use Socket;>" first to get
-the proper definitions imported. See the examples in L<perlipc/"Sockets: Client/Server Communication">.
+SOCKET. DOMAIN, TYPE, and PROTOCOL are specified the same as for
+the system call of the same name. You should C<use Socket> first
+to get the proper definitions imported. See the examples in
+L<perlipc/"Sockets: Client/Server Communication">.
+
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptor, as determined by the
+value of $^F. See L<perlvar/$^F>.
=item socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL
Creates an unnamed pair of sockets in the specified domain, of the
specified type. DOMAIN, TYPE, and PROTOCOL are specified the same as
for the system call of the same name. If unimplemented, yields a fatal
-error. Returns TRUE if successful.
+error. Returns true if successful.
-Some systems defined C<pipe()> in terms of C<socketpair()>, in which a call
+On systems that support a close-on-exec flag on files, the flag will
+be set for the newly opened file descriptors, as determined by the value
+of $^F. See L<perlvar/$^F>.
+
+Some systems defined C<pipe> in terms of C<socketpair>, in which a call
to C<pipe(Rdr, Wtr)> is essentially:
use Socket;
@@ -3595,25 +4121,29 @@ See L<perlipc> for an example of socketpair use.
=item sort LIST
Sorts the LIST and returns the sorted list value. If SUBNAME or BLOCK
-is omitted, C<sort()>s in standard string comparison order. If SUBNAME is
+is omitted, C<sort>s in standard string comparison order. If SUBNAME is
specified, it gives the name of a subroutine that returns an integer
less than, equal to, or greater than C<0>, depending on how the elements
-of the array are to be ordered. (The C<E<lt>=E<gt>> and C<cmp>
+of the list are to be ordered. (The C<< <=> >> and C<cmp>
operators are extremely useful in such routines.) SUBNAME may be a
scalar variable name (unsubscripted), in which case the value provides
the name of (or a reference to) the actual subroutine to use. In place
of a SUBNAME, you can provide a BLOCK as an anonymous, in-line sort
subroutine.
-In the interests of efficiency the normal calling code for subroutines is
-bypassed, with the following effects: the subroutine may not be a
-recursive subroutine, and the two elements to be compared are passed into
-the subroutine not via C<@_> but as the package global variables C<$a> and
-C<$b> (see example below). They are passed by reference, so don't
-modify C<$a> and C<$b>. And don't try to declare them as lexicals either.
+If the subroutine's prototype is C<($$)>, the elements to be compared
+are passed by reference in C<@_>, as for a normal subroutine. This is
+slower than unprototyped subroutines, where the elements to be
+compared are passed into the subroutine
+as the package global variables $a and $b (see example below). Note that
+in the latter case, it is usually counter-productive to declare $a and
+$b as lexicals.
+
+In either case, the subroutine may not be recursive. The values to be
+compared are always passed by reference, so don't modify them.
You also cannot exit out of the sort block or subroutine using any of the
-loop control operators described in L<perlsyn> or with C<goto()>.
+loop control operators described in L<perlsyn> or with C<goto>.
When C<use locale> is in effect, C<sort LIST> sorts LIST according to the
current collation locale. See L<perllocale>.
@@ -3638,19 +4168,19 @@ Examples:
# sort numerically descending
@articles = sort {$b <=> $a} @files;
+ # this sorts the %age hash by value instead of key
+ # using an in-line function
+ @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
+
# sort using explicit subroutine name
sub byage {
$age{$a} <=> $age{$b}; # presuming numeric
}
@sortedclass = sort byage @class;
- # this sorts the %age hash by value instead of key
- # using an in-line function
- @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
-
- sub backwards { $b cmp $a; }
- @harry = ('dog','cat','x','Cain','Abel');
- @george = ('gone','chased','yz','Punished','Axed');
+ sub backwards { $b cmp $a }
+ @harry = qw(dog cat x Cain Abel);
+ @george = qw(gone chased yz Punished Axed);
print sort @harry;
# prints AbelCaincatdogx
print sort backwards @harry;
@@ -3684,15 +4214,23 @@ Examples:
} 0..$#old
];
- # same thing using a Schwartzian Transform (no temps)
+ # same thing, but without any temps
@new = map { $_->[0] }
- sort { $b->[1] <=> $a->[1]
- ||
- $a->[2] cmp $b->[2]
- } map { [$_, /=(\d+)/, uc($_)] } @old;
+ sort { $b->[1] <=> $a->[1]
+ ||
+ $a->[2] cmp $b->[2]
+ } map { [$_, /=(\d+)/, uc($_)] } @old;
+
+ # using a prototype allows you to use any comparison subroutine
+ # as a sort subroutine (including other package's subroutines)
+ package other;
+ sub backwards ($$) { $_[1] cmp $_[0]; } # $a and $b are not set here
-If you're using strict, you I<MUST NOT> declare C<$a>
-and C<$b> as lexicals. They are package globals. That means
+ package main;
+ @new = sort other::backwards @old;
+
+If you're using strict, you I<must not> declare $a
+and $b as lexicals. They are package globals. That means
if you're in the C<main> package, it's
@articles = sort {$main::b <=> $main::a} @files;
@@ -3716,14 +4254,18 @@ well-defined.
=item splice ARRAY,OFFSET
+=item splice ARRAY
+
Removes the elements designated by OFFSET and LENGTH from an array, and
replaces them with the elements of LIST, if any. In list context,
returns the elements removed from the array. In scalar context,
returns the last element removed, or C<undef> if no elements are
removed. The array grows or shrinks as necessary.
-If OFFSET is negative then it start that far from the end of the array.
+If OFFSET is negative then it starts that far from the end of the array.
If LENGTH is omitted, removes everything from OFFSET onward.
-If LENGTH is negative, leave that many elements off the end of the array.
+If LENGTH is negative, leaves that many elements off the end of the array.
+If both OFFSET and LENGTH are omitted, removes everything.
+
The following equivalences hold (assuming C<$[ == 0>):
push(@a,$x,$y) splice(@a,@a,0,$x,$y)
@@ -3753,7 +4295,7 @@ Example, assuming array lengths are passed before arrays:
=item split
-Splits a string into an array of strings, and returns it. By default,
+Splits a string into a list of strings and returns that list. By default,
empty leading fields are preserved, and empty trailing ones are deleted.
If not in list context, returns the number of fields found and splits into
@@ -3770,7 +4312,7 @@ that the delimiter may be longer than one character.)
If LIMIT is specified and positive, splits into no more than that
many fields (though it may split into fewer). If LIMIT is unspecified
or zero, trailing null fields are stripped (which potential users
-of C<pop()> would do well to remember). If LIMIT is negative, it is
+of C<pop> would do well to remember). If LIMIT is negative, it is
treated as if an arbitrarily large LIMIT had been specified.
A pattern matching the null string (not to be confused with
@@ -3792,7 +4334,7 @@ unnecessary work. For the list above LIMIT would have been 4 by
default. In time critical applications it behooves you not to split
into more fields than you really need.
-If the PATTERN contains parentheses, additional array elements are
+If the PATTERN contains parentheses, additional list elements are
created from each matching substring in the delimiter.
split(/([,-])/, "1-10,20", 3);
@@ -3801,7 +4343,7 @@ produces the list value
(1, '-', 10, ',', 20)
-If you had the entire header of a normal Unix email message in C<$header>,
+If you had the entire header of a normal Unix email message in $header,
you could split it up into fields and their values this way:
$header =~ s/\n\s+/ /g; # fix continuation lines
@@ -3812,11 +4354,11 @@ patterns that vary at runtime. (To do runtime compilation only once,
use C</$variable/o>.)
As a special case, specifying a PATTERN of space (C<' '>) will split on
-white space just as C<split()> with no arguments does. Thus, C<split(' ')> can
+white space just as C<split> with no arguments does. Thus, C<split(' ')> can
be used to emulate B<awk>'s default behavior, whereas C<split(/ /)>
will give you as many null initial fields as there are leading spaces.
-A C<split()> on C</\s+/> is like a C<split(' ')> except that any leading
-whitespace produces a null first field. A C<split()> with no arguments
+A C<split> on C</\s+/> is like a C<split(' ')> except that any leading
+whitespace produces a null first field. A C<split> with no arguments
really does a C<split(' ', $_)> internally.
Example:
@@ -3828,22 +4370,22 @@ Example:
#...
}
-(Note that C<$shell> above will still have a newline on it. See L</chop>,
+(Note that $shell above will still have a newline on it. See L</chop>,
L</chomp>, and L</join>.)
=item sprintf FORMAT, LIST
-Returns a string formatted by the usual C<printf()> conventions of the
-C library function C<sprintf()>. See L<sprintf(3)> or L<printf(3)>
+Returns a string formatted by the usual C<printf> conventions of the
+C library function C<sprintf>. See L<sprintf(3)> or L<printf(3)>
on your system for an explanation of the general principles.
-Perl does its own C<sprintf()> formatting -- it emulates the C
-function C<sprintf()>, but it doesn't use it (except for floating-point
+Perl does its own C<sprintf> formatting--it emulates the C
+function C<sprintf>, but it doesn't use it (except for floating-point
numbers, and even then only the standard modifiers are allowed). As a
-result, any non-standard extensions in your local C<sprintf()> are not
+result, any non-standard extensions in your local C<sprintf> are not
available from Perl.
-Perl's C<sprintf()> permits the following universally-known conversions:
+Perl's C<sprintf> permits the following universally-known conversions:
%% a percent sign
%c a character with the given number
@@ -3861,6 +4403,7 @@ In addition, Perl permits the following widely-supported conversions:
%X like %x, but using upper-case letters
%E like %e, but using an upper-case "E"
%G like %g, but with an upper-case "E" (if applicable)
+ %b an unsigned integer, in binary
%p a pointer (outputs the Perl value's address in hexadecimal)
%n special: *stores* the number of characters output so far
into the next variable in the parameter list
@@ -3888,21 +4431,71 @@ and the conversion letter:
for integer
l interpret integer as C type "long" or "unsigned long"
h interpret integer as C type "short" or "unsigned short"
+ If no flags, interpret integer as C type "int" or "unsigned"
-There is also one Perl-specific flag:
+There are also two Perl-specific flags:
V interpret integer as Perl's standard integer type
+ v interpret string as a vector of integers, output as
+ numbers separated either by dots, or by an arbitrary
+ string received from the argument list when the flag
+ is preceded by C<*>
-Where a number would appear in the flags, an asterisk ("C<*>") may be
+Where a number would appear in the flags, an asterisk (C<*>) may be
used instead, in which case Perl uses the next item in the parameter
list as the given number (that is, as the field width or precision).
-If a field width obtained through "C<*>" is negative, it has the same
-effect as the "C<->" flag: left-justification.
+If a field width obtained through C<*> is negative, it has the same
+effect as the C<-> flag: left-justification.
+
+The C<v> flag is useful for displaying ordinal values of characters
+in arbitrary strings:
+
+ printf "version is v%vd\n", $^V; # Perl's version
+ printf "address is %*vX\n", ":", $addr; # IPv6 address
+ printf "bits are %*vb\n", " ", $bits; # random bitstring
If C<use locale> is in effect, the character used for the decimal
point in formatted real numbers is affected by the LC_NUMERIC locale.
See L<perllocale>.
+If Perl understands "quads" (64-bit integers) (this requires
+either that the platform natively support quads or that Perl
+be specifically compiled to support quads), the characters
+
+ d u o x X b i D U O
+
+print quads, and they may optionally be preceded by
+
+ ll L q
+
+For example
+
+ %lld %16LX %qo
+
+You can find out whether your Perl supports quads via L<Config>:
+
+ use Config;
+ ($Config{use64bitint} eq 'define' || $Config{longsize} == 8) &&
+ print "quads\n";
+
+If Perl understands "long doubles" (this requires that the platform
+support long doubles), the flags
+
+ e f g E F G
+
+may optionally be preceded by
+
+ ll L
+
+For example
+
+ %llf %Lg
+
+You can find out whether your Perl supports long doubles via L<Config>:
+
+ use Config;
+ $Config{d_longdbl} eq 'define' && print "long doubles\n";
+
=item sqrt EXPR
=item sqrt
@@ -3918,19 +4511,19 @@ loaded the standard Math::Complex module.
=item srand
-Sets the random number seed for the C<rand()> operator. If EXPR is
+Sets the random number seed for the C<rand> operator. If EXPR is
omitted, uses a semi-random value supplied by the kernel (if it supports
the F</dev/urandom> device) or based on the current time and process
ID, among other things. In versions of Perl prior to 5.004 the default
-seed was just the current C<time()>. This isn't a particularly good seed,
+seed was just the current C<time>. This isn't a particularly good seed,
so many old programs supply their own seed value (often C<time ^ $$> or
-C<time ^ ($$ + ($$ E<lt>E<lt> 15))>), but that isn't necessary any more.
+C<time ^ ($$ + ($$ << 15))>), but that isn't necessary any more.
-In fact, it's usually not necessary to call C<srand()> at all, because if
+In fact, it's usually not necessary to call C<srand> at all, because if
it is not called explicitly, it is called implicitly at the first use of
-the C<rand()> operator. However, this was not the case in version of Perl
+the C<rand> operator. However, this was not the case in version of Perl
before 5.004, so if your script will run under older Perl versions, it
-should call C<srand()>.
+should call C<srand>.
Note that you need something much more random than the default seed for
cryptographic purposes. Checksumming the compressed output of one or more
@@ -3942,11 +4535,11 @@ example:
If you're particularly concerned with this, see the C<Math::TrulyRandom>
module in CPAN.
-Do I<not> call C<srand()> multiple times in your program unless you know
+Do I<not> call C<srand> multiple times in your program unless you know
exactly what you're doing and why you're doing it. The point of the
-function is to "seed" the C<rand()> function so that C<rand()> can produce
+function is to "seed" the C<rand> function so that C<rand> can produce
a different sequence each time you run your program. Just do it once at the
-top of your program, or you I<won't> get random numbers out of C<rand()>!
+top of your program, or you I<won't> get random numbers out of C<rand>!
Frequently called programs (like CGI scripts) that simply use
@@ -3984,9 +4577,9 @@ meaning of the fields:
5 gid numeric group ID of file's owner
6 rdev the device identifier (special files only)
7 size total size of file, in bytes
- 8 atime last access time since the epoch
- 9 mtime last modify time since the epoch
- 10 ctime inode change time (NOT creation time!) since the epoch
+ 8 atime last access time in seconds since the epoch
+ 9 mtime last modify time in seconds since the epoch
+ 10 ctime inode change time (NOT creation time!) in seconds since the epoch
11 blksize preferred block size for file system I/O
12 blocks actual number of blocks allocated
@@ -4000,7 +4593,8 @@ last stat or filetest are returned. Example:
print "$file is executable NFS file\n";
}
-(This works on machines only for which the device number is negative under NFS.)
+(This works on machines only for which the device number is negative
+under NFS.)
Because the mode contains both the file type and its permissions, you
should mask off the file type portion and (s)printf using a C<"%o">
@@ -4009,8 +4603,7 @@ if you want to see the real permissions.
$mode = (stat($filename))[2];
printf "Permissions are %04o\n", $mode & 07777;
-
-In scalar context, C<stat()> returns a boolean value indicating success
+In scalar context, C<stat> returns a boolean value indicating success
or failure, and, if successful, sets the information associated with
the special filehandle C<_>.
@@ -4022,6 +4615,66 @@ The File::stat module provides a convenient, by-name access mechanism:
$filename, $sb->size, $sb->mode & 07777,
scalar localtime $sb->mtime;
+You can import symbolic mode constants (C<S_IF*>) and functions
+(C<S_IS*>) from the Fcntl module:
+
+ use Fcntl ':mode';
+
+ $mode = (stat($filename))[2];
+
+ $user_rwx = ($mode & S_IRWXU) >> 6;
+ $group_read = ($mode & S_IRGRP) >> 3;
+ $other_execute = $mode & S_IXOTH;
+
+ printf "Permissions are %04o\n", S_ISMODE($mode), "\n";
+
+ $is_setuid = $mode & S_ISUID;
+ $is_setgid = S_ISDIR($mode);
+
+You could write the last two using the C<-u> and C<-d> operators.
+The commonly available S_IF* constants are
+
+ # Permissions: read, write, execute, for user, group, others.
+
+ S_IRWXU S_IRUSR S_IWUSR S_IXUSR
+ S_IRWXG S_IRGRP S_IWGRP S_IXGRP
+ S_IRWXO S_IROTH S_IWOTH S_IXOTH
+
+ # Setuid/Setgid/Stickiness.
+
+ S_ISUID S_ISGID S_ISVTX S_ISTXT
+
+ # File types. Not necessarily all are available on your system.
+
+ S_IFREG S_IFDIR S_IFLNK S_IFBLK S_ISCHR S_IFIFO S_IFSOCK S_IFWHT S_ENFMT
+
+ # The following are compatibility aliases for S_IRUSR, S_IWUSR, S_IXUSR.
+
+ S_IREAD S_IWRITE S_IEXEC
+
+and the S_IF* functions are
+
+ S_IFMODE($mode) the part of $mode containg the permission bits
+ and the setuid/setgid/sticky bits
+
+ S_IFMT($mode) the part of $mode containing the file type
+ which can be bit-anded with e.g. S_IFREG
+ or with the following functions
+
+ # The operators -f, -d, -l, -b, -c, -p, and -s.
+
+ S_ISREG($mode) S_ISDIR($mode) S_ISLNK($mode)
+ S_ISBLK($mode) S_ISCHR($mode) S_ISFIFO($mode) S_ISSOCK($mode)
+
+ # No direct -X operator counterpart, but for the first one
+ # the -g operator is often equivalent. The ENFMT stands for
+ # record flocking enforcement, a platform-dependent feature.
+
+ S_ISENFMT($mode) S_ISWHT($mode)
+
+See your native chmod(2) and stat(2) documentation for more details
+about the S_* constants.
+
=item study SCALAR
=item study
@@ -4030,12 +4683,12 @@ Takes extra time to study SCALAR (C<$_> if unspecified) in anticipation of
doing many pattern matches on the string before it is next modified.
This may or may not save time, depending on the nature and number of
patterns you are searching on, and on the distribution of character
-frequencies in the string to be searched -- you probably want to compare
+frequencies in the string to be searched--you probably want to compare
run times with and without it to see which runs faster. Those loops
which scan for many short constant strings (including the constant
parts of more complex patterns) will benefit most. You may have only
-one C<study()> active at a time -- if you study a different scalar the first
-is "unstudied". (The way C<study()> works is this: a linked list of every
+one C<study> active at a time--if you study a different scalar the first
+is "unstudied". (The way C<study> works is this: a linked list of every
character in the string to be searched is made, so we know, for
example, where all the C<'k'> characters are. From each search string,
the rarest character is selected, based on some static frequency tables
@@ -4054,14 +4707,14 @@ before any line containing a certain pattern:
print;
}
-In searching for C</\bfoo\b/>, only those locations in C<$_> that contain C<"f">
-will be looked at, because C<"f"> is rarer than C<"o">. In general, this is
+In searching for C</\bfoo\b/>, only those locations in C<$_> that contain C<f>
+will be looked at, because C<f> is rarer than C<o>. In general, this is
a big win except in pathological cases. The only question is whether
it saves you more time than it took to build the linked list in the
first place.
Note that if you have to look for strings that you don't know till
-runtime, you can build an entire loop as a string and C<eval()> that to
+runtime, you can build an entire loop as a string and C<eval> that to
avoid recompiling all your patterns all the time. Together with
undefining C<$/> to input entire files as one record, this can be very
fast, often faster than specialized programs like fgrep(1). The following
@@ -4088,33 +4741,42 @@ out the names of those files that contain a match:
=item sub NAME BLOCK
This is subroutine definition, not a real function I<per se>. With just a
-NAME (and possibly prototypes), it's just a forward declaration. Without
-a NAME, it's an anonymous function declaration, and does actually return a
-value: the CODE ref of the closure you just created. See L<perlsub> and
-L<perlref> for details.
+NAME (and possibly prototypes or attributes), it's just a forward declaration.
+Without a NAME, it's an anonymous function declaration, and does actually
+return a value: the CODE ref of the closure you just created. See L<perlsub>
+and L<perlref> for details.
-=item substr EXPR,OFFSET,LEN,REPLACEMENT
+=item substr EXPR,OFFSET,LENGTH,REPLACEMENT
-=item substr EXPR,OFFSET,LEN
+=item substr EXPR,OFFSET,LENGTH
=item substr EXPR,OFFSET
Extracts a substring out of EXPR and returns it. First character is at
offset C<0>, or whatever you've set C<$[> to (but don't do that).
If OFFSET is negative (or more precisely, less than C<$[>), starts
-that far from the end of the string. If LEN is omitted, returns
-everything to the end of the string. If LEN is negative, leaves that
+that far from the end of the string. If LENGTH is omitted, returns
+everything to the end of the string. If LENGTH is negative, leaves that
many characters off the end of the string.
-If you specify a substring that is partly outside the string, the part
-within the string is returned. If the substring is totally outside
-the string a warning is produced.
-
You can use the substr() function as an lvalue, in which case EXPR
-must itself be an lvalue. If you assign something shorter than LEN,
-the string will shrink, and if you assign something longer than LEN,
+must itself be an lvalue. If you assign something shorter than LENGTH,
+the string will shrink, and if you assign something longer than LENGTH,
the string will grow to accommodate it. To keep the string the same
-length you may need to pad or chop your value using C<sprintf()>.
+length you may need to pad or chop your value using C<sprintf>.
+
+If OFFSET and LENGTH specify a substring that is partly outside the
+string, only the part within the string is returned. If the substring
+is beyond either end of the string, substr() returns the undefined
+value and produces a warning. When used as an lvalue, specifying a
+substring that is entirely outside the string is a fatal error.
+Here's an example showing the behavior for boundary cases:
+
+ my $name = 'fred';
+ substr($name, 4) = 'dy'; # $name is now 'freddy'
+ my $null = substr $name, 6, 2; # returns '' (no warning)
+ my $oops = substr $name, 7; # returns undef, with warning
+ substr($name, 7) = 'gap'; # fatal error
An alternative to using substr() as an lvalue is to specify the
replacement string as the 4th argument. This allows you to replace
@@ -4139,12 +4801,12 @@ as follows: if a given argument is numeric, the argument is passed as
an int. If not, the pointer to the string value is passed. You are
responsible to make sure a string is pre-extended long enough to
receive any result that might be written into a string. You can't use a
-string literal (or other read-only string) as an argument to C<syscall()>
+string literal (or other read-only string) as an argument to C<syscall>
because Perl has to assume that any string pointer might be written
through. If your
integer arguments are not literals and have never been interpreted in a
numeric context, you may need to add C<0> to them to force them to look
-like numbers. This emulates the C<syswrite()> function (or vice versa):
+like numbers. This emulates the C<syswrite> function (or vice versa):
require 'syscall.ph'; # may need to run h2ph
$s = "hi there\n";
@@ -4154,7 +4816,7 @@ Note that Perl supports passing of up to only 14 arguments to your system call,
which in practice should usually suffice.
Syscall returns whatever value returned by the system call it calls.
-If the system call fails, C<syscall()> returns C<-1> and sets C<$!> (errno).
+If the system call fails, C<syscall> returns C<-1> and sets C<$!> (errno).
Note that some system calls can legitimately return C<-1>. The proper
way to handle such calls is to assign C<$!=0;> before the call and
check the value of C<$!> if syscall returns C<-1>.
@@ -4162,7 +4824,7 @@ check the value of C<$!> if syscall returns C<-1>.
There's a problem with C<syscall(&SYS_pipe)>: it returns the file
number of the read end of the pipe it creates. There is no way
to retrieve the file number of the other end. You can avoid this
-problem by using C<pipe()> instead.
+problem by using C<pipe> instead.
=item sysopen FILEHANDLE,FILENAME,MODE
@@ -4171,29 +4833,50 @@ problem by using C<pipe()> instead.
Opens the file whose filename is given by FILENAME, and associates it
with FILEHANDLE. If FILEHANDLE is an expression, its value is used as
the name of the real filehandle wanted. This function calls the
-underlying operating system's C<open()> function with the parameters
+underlying operating system's C<open> function with the parameters
FILENAME, MODE, PERMS.
The possible values and flag bits of the MODE parameter are
system-dependent; they are available via the standard module C<Fcntl>.
+See the documentation of your operating system's C<open> to see which
+values and flag bits are available. You may combine several flags
+using the C<|>-operator.
+
+Some of the most common values are C<O_RDONLY> for opening the file in
+read-only mode, C<O_WRONLY> for opening the file in write-only mode,
+and C<O_RDWR> for opening the file in read-write mode, and.
+
For historical reasons, some values work on almost every system
supported by perl: zero means read-only, one means write-only, and two
means read/write. We know that these values do I<not> work under
OS/390 & VM/ESA Unix and on the Macintosh; you probably don't want to
use them in new code.
-If the file named by FILENAME does not exist and the C<open()> call creates
+If the file named by FILENAME does not exist and the C<open> call creates
it (typically because MODE includes the C<O_CREAT> flag), then the value of
PERMS specifies the permissions of the newly created file. If you omit
-the PERMS argument to C<sysopen()>, Perl uses the octal value C<0666>.
+the PERMS argument to C<sysopen>, Perl uses the octal value C<0666>.
These permission values need to be in octal, and are modified by your
process's current C<umask>.
-You should seldom if ever use C<0644> as argument to C<sysopen()>, because
+In many systems the C<O_EXCL> flag is available for opening files in
+exclusive mode. This is B<not> locking: exclusiveness means here that
+if the file already exists, sysopen() fails. The C<O_EXCL> wins
+C<O_TRUNC>.
+
+Sometimes you may want to truncate an already-existing file: C<O_TRUNC>.
+
+You should seldom if ever use C<0644> as argument to C<sysopen>, because
that takes away the user's option to have a more permissive umask.
Better to omit it. See the perlfunc(1) entry on C<umask> for more
on this.
+Note that C<sysopen> depends on the fdopen() C library function.
+On many UNIX systems, fdopen() is known to fail when file descriptors
+exceed a certain value, typically 255. If you need more file
+descriptors than that, consider rebuilding Perl to use the C<sfio>
+library, or perhaps using the POSIX::open() function.
+
See L<perlopentut> for a kinder, gentler explanation of opening files.
=item sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
@@ -4202,8 +4885,8 @@ See L<perlopentut> for a kinder, gentler explanation of opening files.
Attempts to read LENGTH bytes of data into variable SCALAR from the
specified FILEHANDLE, using the system call read(2). It bypasses stdio,
-so mixing this with other kinds of reads, C<print()>, C<write()>,
-C<seek()>, C<tell()>, or C<eof()> can cause confusion because stdio
+so mixing this with other kinds of reads, C<print>, C<write>,
+C<seek>, C<tell>, or C<eof> can cause confusion because stdio
usually buffers data. Returns the number of bytes actually read, C<0>
at end of file, or undef if there was an error. SCALAR will be grown or
shrunk so that the last byte actually read is the last byte of the
@@ -4223,47 +4906,56 @@ for a return value for 0 to decide whether you're done.
=item sysseek FILEHANDLE,POSITION,WHENCE
Sets FILEHANDLE's system position using the system call lseek(2). It
-bypasses stdio, so mixing this with reads (other than C<sysread()>),
-C<print()>, C<write()>, C<seek()>, C<tell()>, or C<eof()> may cause
-confusion. FILEHANDLE may be an expression whose value gives the name
-of the filehandle. The values for WHENCE are C<0> to set the new
-position to POSITION, C<1> to set the it to the current position plus
-POSITION, and C<2> to set it to EOF plus POSITION (typically negative).
-For WHENCE, you may use the constants C<SEEK_SET>, C<SEEK_CUR>, and
-C<SEEK_END> from either the C<IO::Seekable> or the POSIX module.
+bypasses stdio, so mixing this with reads (other than C<sysread>),
+C<print>, C<write>, C<seek>, C<tell>, or C<eof> may cause confusion.
+FILEHANDLE may be an expression whose value gives the name of the
+filehandle. The values for WHENCE are C<0> to set the new position to
+POSITION, C<1> to set the it to the current position plus POSITION,
+and C<2> to set it to EOF plus POSITION (typically negative). For
+WHENCE, you may also use the constants C<SEEK_SET>, C<SEEK_CUR>, and
+C<SEEK_END> (start of the file, current position, end of the file)
+from the Fcntl module.
Returns the new position, or the undefined value on failure. A position
-of zero is returned as the string "C<0> but true"; thus C<sysseek()> returns
-TRUE on success and FALSE on failure, yet you can still easily determine
+of zero is returned as the string C<"0 but true">; thus C<sysseek> returns
+true on success and false on failure, yet you can still easily determine
the new position.
=item system LIST
=item system PROGRAM LIST
-Does exactly the same thing as "C<exec LIST>", except that a fork is done
-first, and the parent process waits for the child process to complete.
-Note that argument processing varies depending on the number of
-arguments. If there is more than one argument in LIST, or if LIST is
-an array with more than one value, starts the program given by the
-first element of the list with arguments given by the rest of the list.
-If there is only one scalar argument, the argument is
-checked for shell metacharacters, and if there are any, the entire
-argument is passed to the system's command shell for parsing (this is
-C</bin/sh -c> on Unix platforms, but varies on other platforms). If
-there are no shell metacharacters in the argument, it is split into
-words and passed directly to C<execvp()>, which is more efficient.
+Does exactly the same thing as C<exec LIST>, except that a fork is
+done first, and the parent process waits for the child process to
+complete. Note that argument processing varies depending on the
+number of arguments. If there is more than one argument in LIST,
+or if LIST is an array with more than one value, starts the program
+given by the first element of the list with arguments given by the
+rest of the list. If there is only one scalar argument, the argument
+is checked for shell metacharacters, and if there are any, the
+entire argument is passed to the system's command shell for parsing
+(this is C</bin/sh -c> on Unix platforms, but varies on other
+platforms). If there are no shell metacharacters in the argument,
+it is split into words and passed directly to C<execvp>, which is
+more efficient.
+
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before any operation that may do a fork, but this may not be
+supported on some platforms (see L<perlport>). To be safe, you may need
+to set C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method
+of C<IO::Handle> on any open handles.
The return value is the exit status of the program as
-returned by the C<wait()> call. To get the actual exit value divide by
-256. See also L</exec>. This is I<NOT> what you want to use to capture
+returned by the C<wait> call. To get the actual exit value divide by
+256. See also L</exec>. This is I<not> what you want to use to capture
the output from a command, for that you should use merely backticks or
-C<qx//>, as described in L<perlop/"`STRING`">.
+C<qx//>, as described in L<perlop/"`STRING`">. Return value of -1
+indicates a failure to start the program (inspect $! for the reason).
-Like C<exec()>, C<system()> allows you to lie to a program about its name if
-you use the "C<system PROGRAM LIST>" syntax. Again, see L</exec>.
+Like C<exec>, C<system> allows you to lie to a program about its name if
+you use the C<system PROGRAM LIST> syntax. Again, see L</exec>.
-Because C<system()> and backticks block C<SIGINT> and C<SIGQUIT>, killing the
+Because C<system> and backticks block C<SIGINT> and C<SIGQUIT>, killing the
program they're running doesn't actually interrupt your program.
@args = ("command", "arg1", "arg2");
@@ -4288,14 +4980,14 @@ See L<perlop/"`STRING`"> and L</exec> for details.
=item syswrite FILEHANDLE,SCALAR
Attempts to write LENGTH bytes of data from variable SCALAR to the
-specified FILEHANDLE, using the system call write(2). If LENGTH is
-not specified, writes whole SCALAR. It bypasses
-stdio, so mixing this with reads (other than C<sysread())>, C<print()>,
-C<write()>, C<seek()>, C<tell()>, or C<eof()> may cause confusion
-because stdio usually buffers data. Returns the number of bytes
-actually written, or C<undef> if there was an error. If the LENGTH is
-greater than the available data in the SCALAR after the OFFSET, only as
-much data as is available will be written.
+specified FILEHANDLE, using the system call write(2). If LENGTH
+is not specified, writes whole SCALAR. It bypasses stdio, so mixing
+this with reads (other than C<sysread())>, C<print>, C<write>,
+C<seek>, C<tell>, or C<eof> may cause confusion because stdio
+usually buffers data. Returns the number of bytes actually written,
+or C<undef> if there was an error. If the LENGTH is greater than
+the available data in the SCALAR after the OFFSET, only as much
+data as is available will be written.
An OFFSET may be specified to write the data from some part of the
string other than the beginning. A negative OFFSET specifies writing
@@ -4310,12 +5002,12 @@ Returns the current position for FILEHANDLE. FILEHANDLE may be an
expression whose value gives the name of the actual filehandle. If
FILEHANDLE is omitted, assumes the file last read.
-There is no C<systell()> function. Use C<sysseek(FH, 0, 1)> for that.
+There is no C<systell> function. Use C<sysseek(FH, 0, 1)> for that.
=item telldir DIRHANDLE
-Returns the current position of the C<readdir()> routines on DIRHANDLE.
-Value may be given to C<seekdir()> to access a particular location in a
+Returns the current position of the C<readdir> routines on DIRHANDLE.
+Value may be given to C<seekdir> to access a particular location in a
directory. Has the same caveats about possible directory compaction as
the corresponding system library routine.
@@ -4324,16 +5016,16 @@ the corresponding system library routine.
This function binds a variable to a package class that will provide the
implementation for the variable. VARIABLE is the name of the variable
to be enchanted. CLASSNAME is the name of a class implementing objects
-of correct type. Any additional arguments are passed to the "C<new()>"
+of correct type. Any additional arguments are passed to the C<new>
method of the class (meaning C<TIESCALAR>, C<TIEHANDLE>, C<TIEARRAY>,
or C<TIEHASH>). Typically these are arguments such as might be passed
-to the C<dbm_open()> function of C. The object returned by the "C<new()>"
-method is also returned by the C<tie()> function, which would be useful
+to the C<dbm_open()> function of C. The object returned by the C<new>
+method is also returned by the C<tie> function, which would be useful
if you want to access other methods in CLASSNAME.
-Note that functions such as C<keys()> and C<values()> may return huge lists
+Note that functions such as C<keys> and C<values> may return huge lists
when used on large objects, like DBM files. You may prefer to use the
-C<each()> function to iterate over such. Example:
+C<each> function to iterate over such. Example:
# print out history file offsets
use NDBM_File;
@@ -4393,16 +5085,16 @@ A class implementing a scalar should have the following methods:
Not all methods indicated above need be implemented. See L<perltie>,
L<Tie::Hash>, L<Tie::Array>, L<Tie::Scalar>, and L<Tie::Handle>.
-Unlike C<dbmopen()>, the C<tie()> function will not use or require a module
+Unlike C<dbmopen>, the C<tie> function will not use or require a module
for you--you need to do that explicitly yourself. See L<DB_File>
-or the F<Config> module for interesting C<tie()> implementations.
+or the F<Config> module for interesting C<tie> implementations.
For further details see L<perltie>, L<"tied VARIABLE">.
=item tied VARIABLE
Returns a reference to the object underlying VARIABLE (the same value
-that was originally returned by the C<tie()> call that bound the variable
+that was originally returned by the C<tie> call that bound the variable
to a package.) Returns the undefined value if VARIABLE isn't tied to a
package.
@@ -4411,7 +5103,12 @@ package.
Returns the number of non-leap seconds since whatever time the system
considers to be the epoch (that's 00:00:00, January 1, 1904 for MacOS,
and 00:00:00 UTC, January 1, 1970 for most other systems).
-Suitable for feeding to C<gmtime()> and C<localtime()>.
+Suitable for feeding to C<gmtime> and C<localtime>.
+
+For measuring time in better granularity than one second,
+you may use either the Time::HiRes module from CPAN, or
+if you have gettimeofday(2), you may be able to use the
+C<syscall> interface of Perl, see L<perlfaq8> for details.
=item times
@@ -4422,7 +5119,7 @@ seconds, for this process and the children of this process.
=item tr///
-The transliteration operator. Same as C<y///>. See L<perlop>.
+The transliteration operator. Same as C<y///>. See L<perlop>.
=item truncate FILEHANDLE,LENGTH
@@ -4430,7 +5127,7 @@ The transliteration operator. Same as C<y///>. See L<perlop>.
Truncates the file opened on FILEHANDLE, or named by EXPR, to the
specified length. Produces a fatal error if truncate isn't implemented
-on your system. Returns TRUE if successful, the undefined value
+on your system. Returns true if successful, the undefined value
otherwise.
=item uc EXPR
@@ -4440,7 +5137,8 @@ otherwise.
Returns an uppercased version of EXPR. This is the internal function
implementing the C<\U> escape in double-quoted strings.
Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>.
-(It does not attempt to do titlecase mapping on initial letters. See C<ucfirst()> for that.)
+Under Unicode (C<use utf8>) it uses the standard Unicode uppercase mappings. (It
+does not attempt to do titlecase mapping on initial letters. See C<ucfirst> for that.)
If EXPR is omitted, uses C<$_>.
@@ -4448,9 +5146,11 @@ If EXPR is omitted, uses C<$_>.
=item ucfirst
-Returns the value of EXPR with the first character in uppercase. This is
+Returns the value of EXPR with the first character
+in uppercase (titlecase in Unicode). This is
the internal function implementing the C<\u> escape in double-quoted strings.
-Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>.
+Respects current LC_CTYPE locale if C<use locale> in force. See L<perllocale>
+and L<utf8>.
If EXPR is omitted, uses C<$_>.
@@ -4470,12 +5170,12 @@ even if you tell C<sysopen> to create a file with permissions C<0777>,
if your umask is C<0022> then the file will actually be created with
permissions C<0755>. If your C<umask> were C<0027> (group can't
write; others can't read, write, or execute), then passing
-C<sysopen()> C<0666> would create a file with mode C<0640> (C<0666 &~
+C<sysopen> C<0666> would create a file with mode C<0640> (C<0666 &~
027> is C<0640>).
Here's some advice: supply a creation mode of C<0666> for regular
-files (in C<sysopen()>) and one of C<0777> for directories (in
-C<mkdir()>) and executable files. This gives users the freedom of
+files (in C<sysopen>) and one of C<0777> for directories (in
+C<mkdir>) and executable files. This gives users the freedom of
choice: if they want protected files, they might choose process umasks
of C<022>, C<027>, or even the particularly antisocial mask of C<077>.
Programs should rarely if ever make policy decisions better left to
@@ -4496,8 +5196,8 @@ string of octal digits. See also L</oct>, if all you have is a string.
=item undef
Undefines the value of EXPR, which must be an lvalue. Use only on a
-scalar value, an array (using "C<@>"), a hash (using "C<%>"), a subroutine
-(using "C<&>"), or a typeglob (using "<*>"). (Saying C<undef $hash{$key}>
+scalar value, an array (using C<@>), a hash (using C<%>), a subroutine
+(using C<&>), or a typeglob (using <*>). (Saying C<undef $hash{$key}>
will probably not do what you expect on most predefined variables or
DBM list values, so don't do that; see L<delete>.) Always returns the
undefined value. You can omit the EXPR, in which case nothing is
@@ -4528,19 +5228,25 @@ deleted.
unlink @goners;
unlink <*.bak>;
-Note: C<unlink()> will not delete directories unless you are superuser and
+Note: C<unlink> will not delete directories unless you are superuser and
the B<-U> flag is supplied to Perl. Even if these conditions are
met, be warned that unlinking a directory can inflict damage on your
-filesystem. Use C<rmdir()> instead.
+filesystem. Use C<rmdir> instead.
If LIST is omitted, uses C<$_>.
=item unpack TEMPLATE,EXPR
-C<Unpack()> does the reverse of C<pack()>: it takes a string representing a
-structure and expands it out into a list value, returning the array
-value. (In scalar context, it returns merely the first value
-produced.) The TEMPLATE has the same format as in the C<pack()> function.
+C<unpack> does the reverse of C<pack>: it takes a string
+and expands it out into a list of values.
+(In scalar context, it returns merely the first value produced.)
+
+The string is broken into chunks described by the TEMPLATE. Each chunk
+is converted separately to a value. Typically, either the string is a result
+of C<pack>, or the bytes of the string represent a C structure of some
+kind.
+
+The TEMPLATE has the same format as in the C<pack> function.
Here's a subroutine that does substring:
sub substr {
@@ -4552,44 +5258,60 @@ and then there's
sub ordinal { unpack("c",$_[0]); } # same as ord()
-In addition, you may prefix a field with a %E<lt>numberE<gt> to indicate that
-you want a E<lt>numberE<gt>-bit checksum of the items instead of the items
-themselves. Default is a 16-bit checksum. For example, the following
+In addition to fields allowed in pack(), you may prefix a field with
+a %<number> to indicate that
+you want a <number>-bit checksum of the items instead of the items
+themselves. Default is a 16-bit checksum. Checksum is calculated by
+summing numeric values of expanded values (for string fields the sum of
+C<ord($char)> is taken, for bit fields the sum of zeroes and ones).
+
+For example, the following
computes the same number as the System V sum program:
- while (<>) {
- $checksum += unpack("%32C*", $_);
- }
- $checksum %= 65535;
+ $checksum = do {
+ local $/; # slurp!
+ unpack("%32C*",<>) % 65535;
+ };
The following efficiently counts the number of set bits in a bit vector:
$setbits = unpack("%32b*", $selectmask);
-See L</pack> for more examples.
+The C<p> and C<P> formats should be used with care. Since Perl
+has no way of checking whether the value passed to C<unpack()>
+corresponds to a valid memory location, passing a pointer value that's
+not known to be valid is likely to have disastrous consequences.
+
+If the repeat count of a field is larger than what the remainder of
+the input string allows, repeat count is decreased. If the input string
+is longer than one described by the TEMPLATE, the rest is ignored.
+
+See L</pack> for more examples and notes.
=item untie VARIABLE
-Breaks the binding between a variable and a package. (See C<tie()>.)
+Breaks the binding between a variable and a package. (See C<tie>.)
=item unshift ARRAY,LIST
-Does the opposite of a C<shift()>. Or the opposite of a C<push()>,
+Does the opposite of a C<shift>. Or the opposite of a C<push>,
depending on how you look at it. Prepends list to the front of the
array, and returns the new number of elements in the array.
unshift(ARGV, '-e') unless $ARGV[0] =~ /^-/;
Note the LIST is prepended whole, not one element at a time, so the
-prepended elements stay in the same order. Use C<reverse()> to do the
+prepended elements stay in the same order. Use C<reverse> to do the
reverse.
+=item use Module VERSION LIST
+
+=item use Module VERSION
+
=item use Module LIST
=item use Module
-=item use Module VERSION LIST
-
=item use VERSION
Imports some semantics into the current package from the named module,
@@ -4600,24 +5322,32 @@ package. It is exactly equivalent to
except that Module I<must> be a bareword.
-If the first argument to C<use> is a number, it is treated as a version
-number instead of a module name. If the version of the Perl interpreter
-is less than VERSION, then an error message is printed and Perl exits
-immediately. This is often useful if you need to check the current
-Perl version before C<use>ing library modules that have changed in
-incompatible ways from older versions of Perl. (We try not to do
-this more than we have to.)
+VERSION, which can be specified as a literal of the form v5.6.1, demands
+that the current version of Perl (C<$^V> or $PERL_VERSION) be at least
+as recent as that version. (For compatibility with older versions of Perl,
+a numeric literal will also be interpreted as VERSION.) If the version
+of the running Perl interpreter is less than VERSION, then an error
+message is printed and Perl exits immediately without attempting to
+parse the rest of the file. Compare with L</require>, which can do a
+similar check at run time.
-The C<BEGIN> forces the C<require> and C<import()> to happen at compile time. The
+ use v5.6.1; # compile time version check
+ use 5.6.1; # ditto
+ use 5.005_03; # float version allowed for compatibility
+
+This is often useful if you need to check the current Perl version before
+C<use>ing library modules that have changed in incompatible ways from
+older versions of Perl. (We try not to do this more than we have to.)
+
+The C<BEGIN> forces the C<require> and C<import> to happen at compile time. The
C<require> makes sure the module is loaded into memory if it hasn't been
-yet. The C<import()> is not a builtin--it's just an ordinary static method
-call into the "C<Module>" package to tell the module to import the list of
+yet. The C<import> is not a builtin--it's just an ordinary static method
+call into the C<Module> package to tell the module to import the list of
features back into the current package. The module can implement its
-C<import()> method any way it likes, though most modules just choose to
-derive their C<import()> method via inheritance from the C<Exporter> class that
-is defined in the C<Exporter> module. See L<Exporter>. If no C<import()>
-method can be found then the error is currently silently ignored. This
-may change to a fatal error in a future version.
+C<import> method any way it likes, though most modules just choose to
+derive their C<import> method via inheritance from the C<Exporter> class that
+is defined in the C<Exporter> module. See L<Exporter>. If no C<import>
+method can be found then the call is skipped.
If you don't want your namespace altered, explicitly supply an empty list:
@@ -4630,31 +5360,36 @@ That is exactly equivalent to
If the VERSION argument is present between Module and LIST, then the
C<use> will call the VERSION method in class Module with the given
version as an argument. The default VERSION method, inherited from
-the Universal class, croaks if the given version is larger than the
-value of the variable C<$Module::VERSION>. (Note that there is not a
-comma after VERSION!)
+the UNIVERSAL class, croaks if the given version is larger than the
+value of the variable C<$Module::VERSION>.
+
+Again, there is a distinction between omitting LIST (C<import> called
+with no arguments) and an explicit empty LIST C<()> (C<import> not
+called). Note that there is no comma after VERSION!
Because this is a wide-open interface, pragmas (compiler directives)
are also implemented this way. Currently implemented pragmas are:
use integer;
use diagnostics;
- use sigtrap qw(SEGV BUS);
- use strict qw(subs vars refs);
- use subs qw(afunc blurfl);
+ use sigtrap qw(SEGV BUS);
+ use strict qw(subs vars refs);
+ use subs qw(afunc blurfl);
+ use warnings qw(all);
-Some of these these pseudo-modules import semantics into the current
+Some of these pseudo-modules import semantics into the current
block scope (like C<strict> or C<integer>, unlike ordinary modules,
which import symbols into the current package (which are effective
through the end of the file).
-There's a corresponding "C<no>" command that unimports meanings imported
-by C<use>, i.e., it calls C<unimport Module LIST> instead of C<import()>.
+There's a corresponding C<no> command that unimports meanings imported
+by C<use>, i.e., it calls C<unimport Module LIST> instead of C<import>.
no integer;
no strict 'refs';
+ no warnings;
-If no C<unimport()> method can be found the call fails with a fatal error.
+If no C<unimport> method can be found the call fails with a fatal error.
See L<perlmod> for a list of standard modules and pragmas.
@@ -4663,8 +5398,8 @@ See L<perlmod> for a list of standard modules and pragmas.
Changes the access and modification times on each file of a list of
files. The first two elements of the list must be the NUMERICAL access
and modification times, in that order. Returns the number of files
-successfully changed. The inode modification time of each file is set
-to the current time. This code has the same effect as the "C<touch>"
+successfully changed. The inode change time of each file is set
+to the current time. This code has the same effect as the C<touch>
command if the files already exist:
#!/usr/bin/perl
@@ -4677,7 +5412,7 @@ Returns a list consisting of all the values of the named hash. (In a
scalar context, returns the number of values.) The values are
returned in an apparently random order. The actual random order is
subject to change in future versions of perl, but it is guaranteed to
-be the same order as either the C<keys()> or C<each()> function would
+be the same order as either the C<keys> or C<each> function would
produce on the same (unmodified) hash.
Note that you cannot modify the values of a hash this way, because the
@@ -4688,29 +5423,55 @@ since it's lvaluable in a way that values() is not.
for (@hash{keys %hash}) { s/foo/bar/g } # ok
As a side effect, calling values() resets the HASH's internal iterator.
-See also C<keys()>, C<each()>, and C<sort()>.
+See also C<keys>, C<each>, and C<sort>.
=item vec EXPR,OFFSET,BITS
-Treats the string in EXPR as a vector of unsigned integers, and
-returns the value of the bit field specified by OFFSET. BITS specifies
-the number of bits that are reserved for each entry in the bit
-vector. This must be a power of two from 1 to 32. C<vec()> may also be
-assigned to, in which case parentheses are needed to give the expression
-the correct precedence as in
+Treats the string in EXPR as a bit vector made up of elements of
+width BITS, and returns the value of the element specified by OFFSET
+as an unsigned integer. BITS therefore specifies the number of bits
+that are reserved for each element in the bit vector. This must
+be a power of two from 1 to 32 (or 64, if your platform supports
+that).
+
+If BITS is 8, "elements" coincide with bytes of the input string.
+
+If BITS is 16 or more, bytes of the input string are grouped into chunks
+of size BITS/8, and each group is converted to a number as with
+pack()/unpack() with big-endian formats C<n>/C<N> (and analoguously
+for BITS==64). See L<"pack"> for details.
+
+If bits is 4 or less, the string is broken into bytes, then the bits
+of each byte are broken into 8/BITS groups. Bits of a byte are
+numbered in a little-endian-ish way, as in C<0x01>, C<0x02>,
+C<0x04>, C<0x08>, C<0x10>, C<0x20>, C<0x40>, C<0x80>. For example,
+breaking the single input byte C<chr(0x36)> into two groups gives a list
+C<(0x6, 0x3)>; breaking it into 4 groups gives C<(0x2, 0x1, 0x3, 0x0)>.
+
+C<vec> may also be assigned to, in which case parentheses are needed
+to give the expression the correct precedence as in
vec($image, $max_x * $x + $y, 8) = 3;
-Vectors created with C<vec()> can also be manipulated with the logical
-operators C<|>, C<&>, and C<^>, which will assume a bit vector operation is
-desired when both operands are strings. See L<perlop/"Bitwise String Operators">.
+If the selected element is off the end of the string, the value 0 is
+returned. If an element off the end of the string is written to,
+Perl will first extend the string with sufficiently many zero bytes.
+
+Strings created with C<vec> can also be manipulated with the logical
+operators C<|>, C<&>, C<^>, and C<~>. These operators will assume a bit
+vector operation is desired when both operands are strings.
+See L<perlop/"Bitwise String Operators">.
The following code will build up an ASCII string saying C<'PerlPerlPerl'>.
-The comments show the string after each step. Note that this code works
+The comments show the string after each step. Note that this code works
in the same way on big-endian or little-endian machines.
my $foo = '';
vec($foo, 0, 32) = 0x5065726C; # 'Perl'
+
+ # $foo eq "Perl" eq "\x50\x65\x72\x6C", 32 bits
+ print vec($foo, 0, 8); # prints 80 == 0x50 == ord('P')
+
vec($foo, 2, 16) = 0x5065; # 'PerlPe'
vec($foo, 3, 16) = 0x726C; # 'PerlPerl'
vec($foo, 8, 8) = 0x50; # 'PerlPerlP'
@@ -4723,18 +5484,183 @@ in the same way on big-endian or little-endian machines.
vec($foo, 94, 1) = 1; # 'PerlPerlPerl'
# 'l' is "\x6c"
-To transform a bit vector into a string or array of 0's and 1's, use these:
+To transform a bit vector into a string or list of 0's and 1's, use these:
$bits = unpack("b*", $vector);
@bits = split(//, unpack("b*", $vector));
If you know the exact length in bits, it can be used in place of the C<*>.
+Here is an example to illustrate how the bits actually fall in place:
+
+ #!/usr/bin/perl -wl
+
+ print <<'EOT';
+ 0 1 2 3
+ unpack("V",$_) 01234567890123456789012345678901
+ ------------------------------------------------------------------
+ EOT
+
+ for $w (0..3) {
+ $width = 2**$w;
+ for ($shift=0; $shift < $width; ++$shift) {
+ for ($off=0; $off < 32/$width; ++$off) {
+ $str = pack("B*", "0"x32);
+ $bits = (1<<$shift);
+ vec($str, $off, $width) = $bits;
+ $res = unpack("b*",$str);
+ $val = unpack("V", $str);
+ write;
+ }
+ }
+ }
+
+ format STDOUT =
+ vec($_,@#,@#) = @<< == @######### @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ $off, $width, $bits, $val, $res
+ .
+ __END__
+
+Regardless of the machine architecture on which it is run, the above
+example should print the following table:
+
+ 0 1 2 3
+ unpack("V",$_) 01234567890123456789012345678901
+ ------------------------------------------------------------------
+ vec($_, 0, 1) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 1) = 1 == 2 01000000000000000000000000000000
+ vec($_, 2, 1) = 1 == 4 00100000000000000000000000000000
+ vec($_, 3, 1) = 1 == 8 00010000000000000000000000000000
+ vec($_, 4, 1) = 1 == 16 00001000000000000000000000000000
+ vec($_, 5, 1) = 1 == 32 00000100000000000000000000000000
+ vec($_, 6, 1) = 1 == 64 00000010000000000000000000000000
+ vec($_, 7, 1) = 1 == 128 00000001000000000000000000000000
+ vec($_, 8, 1) = 1 == 256 00000000100000000000000000000000
+ vec($_, 9, 1) = 1 == 512 00000000010000000000000000000000
+ vec($_,10, 1) = 1 == 1024 00000000001000000000000000000000
+ vec($_,11, 1) = 1 == 2048 00000000000100000000000000000000
+ vec($_,12, 1) = 1 == 4096 00000000000010000000000000000000
+ vec($_,13, 1) = 1 == 8192 00000000000001000000000000000000
+ vec($_,14, 1) = 1 == 16384 00000000000000100000000000000000
+ vec($_,15, 1) = 1 == 32768 00000000000000010000000000000000
+ vec($_,16, 1) = 1 == 65536 00000000000000001000000000000000
+ vec($_,17, 1) = 1 == 131072 00000000000000000100000000000000
+ vec($_,18, 1) = 1 == 262144 00000000000000000010000000000000
+ vec($_,19, 1) = 1 == 524288 00000000000000000001000000000000
+ vec($_,20, 1) = 1 == 1048576 00000000000000000000100000000000
+ vec($_,21, 1) = 1 == 2097152 00000000000000000000010000000000
+ vec($_,22, 1) = 1 == 4194304 00000000000000000000001000000000
+ vec($_,23, 1) = 1 == 8388608 00000000000000000000000100000000
+ vec($_,24, 1) = 1 == 16777216 00000000000000000000000010000000
+ vec($_,25, 1) = 1 == 33554432 00000000000000000000000001000000
+ vec($_,26, 1) = 1 == 67108864 00000000000000000000000000100000
+ vec($_,27, 1) = 1 == 134217728 00000000000000000000000000010000
+ vec($_,28, 1) = 1 == 268435456 00000000000000000000000000001000
+ vec($_,29, 1) = 1 == 536870912 00000000000000000000000000000100
+ vec($_,30, 1) = 1 == 1073741824 00000000000000000000000000000010
+ vec($_,31, 1) = 1 == 2147483648 00000000000000000000000000000001
+ vec($_, 0, 2) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 2) = 1 == 4 00100000000000000000000000000000
+ vec($_, 2, 2) = 1 == 16 00001000000000000000000000000000
+ vec($_, 3, 2) = 1 == 64 00000010000000000000000000000000
+ vec($_, 4, 2) = 1 == 256 00000000100000000000000000000000
+ vec($_, 5, 2) = 1 == 1024 00000000001000000000000000000000
+ vec($_, 6, 2) = 1 == 4096 00000000000010000000000000000000
+ vec($_, 7, 2) = 1 == 16384 00000000000000100000000000000000
+ vec($_, 8, 2) = 1 == 65536 00000000000000001000000000000000
+ vec($_, 9, 2) = 1 == 262144 00000000000000000010000000000000
+ vec($_,10, 2) = 1 == 1048576 00000000000000000000100000000000
+ vec($_,11, 2) = 1 == 4194304 00000000000000000000001000000000
+ vec($_,12, 2) = 1 == 16777216 00000000000000000000000010000000
+ vec($_,13, 2) = 1 == 67108864 00000000000000000000000000100000
+ vec($_,14, 2) = 1 == 268435456 00000000000000000000000000001000
+ vec($_,15, 2) = 1 == 1073741824 00000000000000000000000000000010
+ vec($_, 0, 2) = 2 == 2 01000000000000000000000000000000
+ vec($_, 1, 2) = 2 == 8 00010000000000000000000000000000
+ vec($_, 2, 2) = 2 == 32 00000100000000000000000000000000
+ vec($_, 3, 2) = 2 == 128 00000001000000000000000000000000
+ vec($_, 4, 2) = 2 == 512 00000000010000000000000000000000
+ vec($_, 5, 2) = 2 == 2048 00000000000100000000000000000000
+ vec($_, 6, 2) = 2 == 8192 00000000000001000000000000000000
+ vec($_, 7, 2) = 2 == 32768 00000000000000010000000000000000
+ vec($_, 8, 2) = 2 == 131072 00000000000000000100000000000000
+ vec($_, 9, 2) = 2 == 524288 00000000000000000001000000000000
+ vec($_,10, 2) = 2 == 2097152 00000000000000000000010000000000
+ vec($_,11, 2) = 2 == 8388608 00000000000000000000000100000000
+ vec($_,12, 2) = 2 == 33554432 00000000000000000000000001000000
+ vec($_,13, 2) = 2 == 134217728 00000000000000000000000000010000
+ vec($_,14, 2) = 2 == 536870912 00000000000000000000000000000100
+ vec($_,15, 2) = 2 == 2147483648 00000000000000000000000000000001
+ vec($_, 0, 4) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 4) = 1 == 16 00001000000000000000000000000000
+ vec($_, 2, 4) = 1 == 256 00000000100000000000000000000000
+ vec($_, 3, 4) = 1 == 4096 00000000000010000000000000000000
+ vec($_, 4, 4) = 1 == 65536 00000000000000001000000000000000
+ vec($_, 5, 4) = 1 == 1048576 00000000000000000000100000000000
+ vec($_, 6, 4) = 1 == 16777216 00000000000000000000000010000000
+ vec($_, 7, 4) = 1 == 268435456 00000000000000000000000000001000
+ vec($_, 0, 4) = 2 == 2 01000000000000000000000000000000
+ vec($_, 1, 4) = 2 == 32 00000100000000000000000000000000
+ vec($_, 2, 4) = 2 == 512 00000000010000000000000000000000
+ vec($_, 3, 4) = 2 == 8192 00000000000001000000000000000000
+ vec($_, 4, 4) = 2 == 131072 00000000000000000100000000000000
+ vec($_, 5, 4) = 2 == 2097152 00000000000000000000010000000000
+ vec($_, 6, 4) = 2 == 33554432 00000000000000000000000001000000
+ vec($_, 7, 4) = 2 == 536870912 00000000000000000000000000000100
+ vec($_, 0, 4) = 4 == 4 00100000000000000000000000000000
+ vec($_, 1, 4) = 4 == 64 00000010000000000000000000000000
+ vec($_, 2, 4) = 4 == 1024 00000000001000000000000000000000
+ vec($_, 3, 4) = 4 == 16384 00000000000000100000000000000000
+ vec($_, 4, 4) = 4 == 262144 00000000000000000010000000000000
+ vec($_, 5, 4) = 4 == 4194304 00000000000000000000001000000000
+ vec($_, 6, 4) = 4 == 67108864 00000000000000000000000000100000
+ vec($_, 7, 4) = 4 == 1073741824 00000000000000000000000000000010
+ vec($_, 0, 4) = 8 == 8 00010000000000000000000000000000
+ vec($_, 1, 4) = 8 == 128 00000001000000000000000000000000
+ vec($_, 2, 4) = 8 == 2048 00000000000100000000000000000000
+ vec($_, 3, 4) = 8 == 32768 00000000000000010000000000000000
+ vec($_, 4, 4) = 8 == 524288 00000000000000000001000000000000
+ vec($_, 5, 4) = 8 == 8388608 00000000000000000000000100000000
+ vec($_, 6, 4) = 8 == 134217728 00000000000000000000000000010000
+ vec($_, 7, 4) = 8 == 2147483648 00000000000000000000000000000001
+ vec($_, 0, 8) = 1 == 1 10000000000000000000000000000000
+ vec($_, 1, 8) = 1 == 256 00000000100000000000000000000000
+ vec($_, 2, 8) = 1 == 65536 00000000000000001000000000000000
+ vec($_, 3, 8) = 1 == 16777216 00000000000000000000000010000000
+ vec($_, 0, 8) = 2 == 2 01000000000000000000000000000000
+ vec($_, 1, 8) = 2 == 512 00000000010000000000000000000000
+ vec($_, 2, 8) = 2 == 131072 00000000000000000100000000000000
+ vec($_, 3, 8) = 2 == 33554432 00000000000000000000000001000000
+ vec($_, 0, 8) = 4 == 4 00100000000000000000000000000000
+ vec($_, 1, 8) = 4 == 1024 00000000001000000000000000000000
+ vec($_, 2, 8) = 4 == 262144 00000000000000000010000000000000
+ vec($_, 3, 8) = 4 == 67108864 00000000000000000000000000100000
+ vec($_, 0, 8) = 8 == 8 00010000000000000000000000000000
+ vec($_, 1, 8) = 8 == 2048 00000000000100000000000000000000
+ vec($_, 2, 8) = 8 == 524288 00000000000000000001000000000000
+ vec($_, 3, 8) = 8 == 134217728 00000000000000000000000000010000
+ vec($_, 0, 8) = 16 == 16 00001000000000000000000000000000
+ vec($_, 1, 8) = 16 == 4096 00000000000010000000000000000000
+ vec($_, 2, 8) = 16 == 1048576 00000000000000000000100000000000
+ vec($_, 3, 8) = 16 == 268435456 00000000000000000000000000001000
+ vec($_, 0, 8) = 32 == 32 00000100000000000000000000000000
+ vec($_, 1, 8) = 32 == 8192 00000000000001000000000000000000
+ vec($_, 2, 8) = 32 == 2097152 00000000000000000000010000000000
+ vec($_, 3, 8) = 32 == 536870912 00000000000000000000000000000100
+ vec($_, 0, 8) = 64 == 64 00000010000000000000000000000000
+ vec($_, 1, 8) = 64 == 16384 00000000000000100000000000000000
+ vec($_, 2, 8) = 64 == 4194304 00000000000000000000001000000000
+ vec($_, 3, 8) = 64 == 1073741824 00000000000000000000000000000010
+ vec($_, 0, 8) = 128 == 128 00000001000000000000000000000000
+ vec($_, 1, 8) = 128 == 32768 00000000000000010000000000000000
+ vec($_, 2, 8) = 128 == 8388608 00000000000000000000000100000000
+ vec($_, 3, 8) = 128 == 2147483648 00000000000000000000000000000001
+
=item wait
Behaves like the wait(2) system call on your system: it waits for a child
process to terminate and returns the pid of the deceased process, or
-C<-1> if there are no child processes. The status is rketurned in C<$?>.
+C<-1> if there are no child processes. The status is returned in C<$?>.
Note that a return value of C<-1> could mean that child processes are
being automatically reaped, as described in L<perlipc>.
@@ -4764,8 +5690,8 @@ and for other examples.
=item wantarray
-Returns TRUE if the context of the currently executing subroutine is
-looking for a list value. Returns FALSE if the context is looking
+Returns true if the context of the currently executing subroutine is
+looking for a list value. Returns false if the context is looking
for a scalar. Returns the undefined value if the context is looking
for no value (void context).
@@ -4773,30 +5699,32 @@ for no value (void context).
my @a = complex_calculation();
return wantarray ? @a : "@a";
+This function should have been named wantlist() instead.
+
=item warn LIST
-Produces a message on STDERR just like C<die()>, but doesn't exit or throw
+Produces a message on STDERR just like C<die>, but doesn't exit or throw
an exception.
If LIST is empty and C<$@> already contains a value (typically from a
previous eval) that value is used after appending C<"\t...caught">
-to C<$@>. This is useful for staying almost, but not entirely similar to
-C<die()>.
+to C<$@>. This is useful for staying almost, but not entirely similar to
+C<die>.
If C<$@> is empty then the string C<"Warning: Something's wrong"> is used.
No message is printed if there is a C<$SIG{__WARN__}> handler
installed. It is the handler's responsibility to deal with the message
-as it sees fit (like, for instance, converting it into a C<die()>). Most
+as it sees fit (like, for instance, converting it into a C<die>). Most
handlers must therefore make arrangements to actually display the
-warnings that they are not prepared to deal with, by calling C<warn()>
+warnings that they are not prepared to deal with, by calling C<warn>
again in the handler. Note that this is quite safe and will not
produce an endless loop, since C<__WARN__> hooks are not called from
inside one.
You will find this behavior is slightly different from that of
C<$SIG{__DIE__}> handlers (which don't suppress the error text, but can
-instead call C<die()> again to change it).
+instead call C<die> again to change it).
Using a C<__WARN__> handler provides a powerful way to silence all
warnings (even the so-called mandatory ones). An example:
@@ -4825,7 +5753,7 @@ carp() and cluck() functions.
Writes a formatted record (possibly multi-line) to the specified FILEHANDLE,
using the format associated with that file. By default the format for
a file is the one having the same name as the filehandle, but the
-format for the current output channel (see the C<select()> function) may be set
+format for the current output channel (see the C<select> function) may be set
explicitly by assigning the name of the format to the C<$~> variable.
Top of form processing is handled automatically: if there is
@@ -4840,11 +5768,11 @@ variable C<$->, which can be set to C<0> to force a new page.
If FILEHANDLE is unspecified, output goes to the current default output
channel, which starts out as STDOUT but may be changed by the
-C<select()> operator. If the FILEHANDLE is an EXPR, then the expression
+C<select> operator. If the FILEHANDLE is an EXPR, then the expression
is evaluated and the resulting string is used to look up the name of
the FILEHANDLE at run time. For more on formats, see L<perlform>.
-Note that write is I<NOT> the opposite of C<read()>. Unfortunately.
+Note that write is I<not> the opposite of C<read>. Unfortunately.
=item y///
diff --git a/contrib/perl5/pod/perlguts.pod b/contrib/perl5/pod/perlguts.pod
index 90bb716..2900b44 100644
--- a/contrib/perl5/pod/perlguts.pod
+++ b/contrib/perl5/pod/perlguts.pod
@@ -1,12 +1,13 @@
=head1 NAME
-perlguts - Perl's Internal Functions
+perlguts - Introduction to the Perl API
=head1 DESCRIPTION
-This document attempts to describe some of the internal functions of the
-Perl executable. It is far from complete and probably contains many errors.
-Please refer any questions or comments to the author below.
+This document attempts to describe how to use the Perl API, as well as containing
+some info on the basic workings of the Perl core. It is far from complete
+and probably contains many errors. Please refer any questions or
+comments to the author below.
=head1 Variables
@@ -22,11 +23,13 @@ Each typedef has specific routines that manipulate the various data types.
=head2 What is an "IV"?
-Perl uses a special typedef IV which is a simple integer type that is
+Perl uses a special typedef IV which is a simple signed integer type that is
guaranteed to be large enough to hold a pointer (as well as an integer).
+Additionally, there is the UV, which is simply an unsigned IV.
Perl also uses two special typedefs, I32 and I16, which will always be at
-least 32-bits and 16-bits long, respectively.
+least 32-bits and 16-bits long, respectively. (Again, there are U32 and U16,
+as well.)
=head2 Working with SVs
@@ -38,8 +41,8 @@ The six routines are:
SV* newSViv(IV);
SV* newSVnv(double);
- SV* newSVpv(char*, int);
- SV* newSVpvn(char*, int);
+ SV* newSVpv(const char*, int);
+ SV* newSVpvn(const char*, int);
SV* newSVpvf(const char*, ...);
SV* newSVsv(SV*);
@@ -87,27 +90,31 @@ in an SV to a C function or system call.
To access the actual value that an SV points to, you can use the macros:
SvIV(SV*)
+ SvUV(SV*)
SvNV(SV*)
SvPV(SV*, STRLEN len)
+ SvPV_nolen(SV*)
-which will automatically coerce the actual scalar type into an IV, double,
+which will automatically coerce the actual scalar type into an IV, UV, double,
or string.
In the C<SvPV> macro, the length of the string returned is placed into the
-variable C<len> (this is a macro, so you do I<not> use C<&len>). If you do not
-care what the length of the data is, use the global variable C<PL_na> or a
-local variable of type C<STRLEN>. However using C<PL_na> can be quite
-inefficient because C<PL_na> must be accessed in thread-local storage in
-threaded Perl. In any case, remember that Perl allows arbitrary strings of
-data that may both contain NULs and might not be terminated by a NUL.
+variable C<len> (this is a macro, so you do I<not> use C<&len>). If you do
+not care what the length of the data is, use the C<SvPV_nolen> macro.
+Historically the C<SvPV> macro with the global variable C<PL_na> has been
+used in this case. But that can be quite inefficient because C<PL_na> must
+be accessed in thread-local storage in threaded Perl. In any case, remember
+that Perl allows arbitrary strings of data that may both contain NULs and
+might not be terminated by a NUL.
Also remember that C doesn't allow you to safely say C<foo(SvPV(s, len),
len);>. It might work with your compiler, but it won't work for everyone.
Break this sort of statement up into separate assignments:
+ SV *s;
STRLEN len;
char * ptr;
- ptr = SvPV(len);
+ ptr = SvPV(s, len);
foo(ptr, len);
If you want to know if the scalar value is TRUE, you can use:
@@ -148,8 +155,8 @@ But note that these last three macros are valid only if C<SvPOK()> is true.
If you want to append something to the end of string stored in an C<SV*>,
you can use the following functions:
- void sv_catpv(SV*, char*);
- void sv_catpvn(SV*, char*, STRLEN);
+ void sv_catpv(SV*, const char*);
+ void sv_catpvn(SV*, const char*, STRLEN);
void sv_catpvf(SV*, const char*, ...);
void sv_catpvfn(SV*, const char*, STRLEN, va_list *, SV **, I32, bool);
void sv_catsv(SV*, SV*);
@@ -169,7 +176,7 @@ have "magic". See L<Magic Virtual Tables> later in this document.
If you know the name of a scalar variable, you can get a pointer to its SV
by using the following:
- SV* perl_get_sv("package::varname", FALSE);
+ SV* get_sv("package::varname", FALSE);
This returns NULL if the variable does not exist.
@@ -280,7 +287,7 @@ then nothing is done.
If you know the name of an array variable, you can get a pointer to its AV
by using the following:
- AV* perl_get_av("package::varname", FALSE);
+ AV* get_av("package::varname", FALSE);
This returns NULL if the variable does not exist.
@@ -295,8 +302,8 @@ To create an HV, you use the following routine:
Once the HV has been created, the following operations are possible on HVs:
- SV** hv_store(HV*, char* key, U32 klen, SV* val, U32 hash);
- SV** hv_fetch(HV*, char* key, U32 klen, I32 lval);
+ SV** hv_store(HV*, const char* key, U32 klen, SV* val, U32 hash);
+ SV** hv_fetch(HV*, const char* key, U32 klen, I32 lval);
The C<klen> parameter is the length of the key being passed in (Note that
you cannot pass 0 in as a value of C<klen> to tell Perl to measure the
@@ -314,8 +321,8 @@ not NULL before dereferencing it.
These two functions check if a hash table entry exists, and deletes it.
- bool hv_exists(HV*, char* key, U32 klen);
- SV* hv_delete(HV*, char* key, U32 klen, I32 flags);
+ bool hv_exists(HV*, const char* key, U32 klen);
+ SV* hv_delete(HV*, const char* key, U32 klen, I32 flags);
If C<flags> does not include the C<G_DISCARD> flag then C<hv_delete> will
create and return a mortal copy of the deleted value.
@@ -355,7 +362,7 @@ specified below.
If you know the name of a hash variable, you can get a pointer to its HV
by using the following:
- HV* perl_get_hv("package::varname", FALSE);
+ HV* get_hv("package::varname", FALSE);
This returns NULL if the variable does not exist.
@@ -364,6 +371,10 @@ The hash algorithm is defined in the C<PERL_HASH(hash, key, klen)> macro:
hash = 0;
while (klen--)
hash = (hash * 33) + *key++;
+ hash = hash + (hash >> 5); /* after 5.6 */
+
+The last step was added in version 5.6 to improve distribution of
+lower bits in the resulting hash value.
See L<Understanding the Magic of Tied Hashes and Arrays> for more
information on how to use the hash access functions on tied hashes.
@@ -374,10 +385,10 @@ Beginning with version 5.004, the following functions are also supported:
HE* hv_fetch_ent (HV* tb, SV* key, I32 lval, U32 hash);
HE* hv_store_ent (HV* tb, SV* key, SV* val, U32 hash);
-
+
bool hv_exists_ent (HV* tb, SV* key, U32 hash);
SV* hv_delete_ent (HV* tb, SV* key, I32 flags, U32 hash);
-
+
SV* hv_iterkeysv (HE* entry);
Note that these functions take C<SV*> keys, which simplifies writing
@@ -387,14 +398,13 @@ you to stringify the keys (unlike the previous set of functions).
They also return and accept whole hash entries (C<HE*>), making their
use more efficient (since the hash number for a particular string
-doesn't have to be recomputed every time). See L<API LISTING> later in
-this document for detailed descriptions.
+doesn't have to be recomputed every time). See L<perlapi> for detailed
+descriptions.
The following macros must always be used to access the contents of hash
entries. Note that the arguments to these macros must be simple
variables, since they may get evaluated more than once. See
-L<API LISTING> later in this document for detailed descriptions of these
-macros.
+L<perlapi> for detailed descriptions of these macros.
HePV(HE* he, STRLEN len)
HeVAL(HE* he)
@@ -481,28 +491,28 @@ Upgrades rv to reference if not already one. Creates new SV for rv to
point to. If C<classname> is non-null, the SV is blessed into the specified
class. SV is returned.
- SV* newSVrv(SV* rv, char* classname);
+ SV* newSVrv(SV* rv, const char* classname);
Copies integer or double into an SV whose reference is C<rv>. SV is blessed
if C<classname> is non-null.
- SV* sv_setref_iv(SV* rv, char* classname, IV iv);
- SV* sv_setref_nv(SV* rv, char* classname, NV iv);
+ SV* sv_setref_iv(SV* rv, const char* classname, IV iv);
+ SV* sv_setref_nv(SV* rv, const char* classname, NV iv);
Copies the pointer value (I<the address, not the string!>) into an SV whose
reference is rv. SV is blessed if C<classname> is non-null.
- SV* sv_setref_pv(SV* rv, char* classname, PV iv);
+ SV* sv_setref_pv(SV* rv, const char* classname, PV iv);
Copies string into an SV whose reference is C<rv>. Set length to 0 to let
Perl calculate the string length. SV is blessed if C<classname> is non-null.
- SV* sv_setref_pvn(SV* rv, char* classname, PV iv, STRLEN length);
+ SV* sv_setref_pvn(SV* rv, const char* classname, PV iv, STRLEN length);
Tests whether the SV is blessed into the specified class. It does not
check inheritance relationships.
- int sv_isa(SV* sv, char* name);
+ int sv_isa(SV* sv, const char* name);
Tests whether the SV is a reference to a blessed object.
@@ -512,7 +522,7 @@ Tests whether the SV is derived from the specified class. SV can be either
a reference to a blessed object or a string containing a class name. This
is the function implementing the C<UNIVERSAL::isa> functionality.
- bool sv_derived_from(SV* sv, char* name);
+ bool sv_derived_from(SV* sv, const char* name);
To check if you've got an object derived from a specific class you have
to write:
@@ -524,9 +534,9 @@ to write:
To create a new Perl variable with an undef value which can be accessed from
your Perl script, use the following routines, depending on the variable type.
- SV* perl_get_sv("package::varname", TRUE);
- AV* perl_get_av("package::varname", TRUE);
- HV* perl_get_hv("package::varname", TRUE);
+ SV* get_sv("package::varname", TRUE);
+ AV* get_av("package::varname", TRUE);
+ HV* get_hv("package::varname", TRUE);
Notice the use of TRUE as the second parameter. The new variable can now
be set, using the routines appropriate to the data type.
@@ -635,7 +645,7 @@ in the stash "Baz::" in "Bar::"'s stash.
To get the stash pointer for a particular package, use the function:
- HV* gv_stashpv(char* name, I32 create)
+ HV* gv_stashpv(const char* name, I32 create)
HV* gv_stashsv(SV*, I32 create)
The first function takes a literal string, the second uses the string stored
@@ -699,7 +709,7 @@ following code:
extern int dberror;
extern char *dberror_list;
- SV* sv = perl_get_sv("dberror", TRUE);
+ SV* sv = get_sv("dberror", TRUE);
sv_setiv(sv, (IV) dberror);
sv_setpv(sv, dberror_list[dberror]);
SvIOK_on(sv);
@@ -733,7 +743,7 @@ Note this is current as of patchlevel 0, and could change at any time.
Perl adds magic to an SV using the sv_magic function:
- void sv_magic(SV* sv, SV* obj, int how, char* name, I32 namlen);
+ void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen);
The C<sv> argument is a pointer to the SV that is to acquire a new magical
feature.
@@ -810,6 +820,8 @@ to an C<mg_type> of '\0') contains:
Thus, when an SV is determined to be magical and of type '\0', if a get
operation is being performed, the routine C<magic_get> is called. All
the various routines for the various magical types begin with C<magic_>.
+NOTE: the magic routines are not considered part of the Perl API, and may
+not be exported by the Perl library.
The current kinds of Magic Virtual Tables are:
@@ -899,7 +911,7 @@ calling these functions, or by using one of the C<sv_set*_mg()> or
C<sv_cat*_mg()> functions. Similarly, generic C code must call the
C<SvGETMAGIC()> macro to invoke any 'get' magic if they use an SV
obtained from external sources in functions that don't handle magic.
-L<API LISTING> later in this document identifies such functions.
+See L<perlapi> for a description of these functions.
For example, calls to the C<sv_cat*()> functions typically need to be
followed by C<SvSETMAGIC()>, but they don't need a prior C<SvGETMAGIC()>
since their implementation handles 'get' magic.
@@ -912,7 +924,7 @@ This routine returns a pointer to the C<MAGIC> structure stored in the SV.
If the SV does not have that magical feature, C<NULL> is returned. Also,
if the SV is not of type SVt_PVMG, Perl may core dump.
- int mg_copy(SV* sv, SV* nsv, char* key, STRLEN klen);
+ int mg_copy(SV* sv, SV* nsv, const char* key, STRLEN klen);
This routine checks to see what types of magic C<sv> has. If the mg_type
field is an uppercase letter, then the mg_obj is copied to C<nsv>, but
@@ -1092,10 +1104,15 @@ this:
SAVEDELETE(PL_defstash, savepv(tmpbuf), strlen(tmpbuf));
-=item C<SAVEDESTRUCTOR(f,p)>
+=item C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)>
At the end of I<pseudo-block> the function C<f> is called with the
-only argument (of type C<void*>) C<p>.
+only argument C<p>.
+
+=item C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>
+
+At the end of I<pseudo-block> the function C<f> is called with the
+implicit context argument (if any), and C<p>.
=item C<SAVESTACK_POS()>
@@ -1206,12 +1223,12 @@ For more information, consult L<perlxs> and L<perlxstut>.
There are four routines that can be used to call a Perl subroutine from
within a C program. These four are:
- I32 perl_call_sv(SV*, I32);
- I32 perl_call_pv(char*, I32);
- I32 perl_call_method(char*, I32);
- I32 perl_call_argv(char*, I32, register char**);
+ I32 call_sv(SV*, I32);
+ I32 call_pv(const char*, I32);
+ I32 call_method(const char*, I32);
+ I32 call_argv(const char*, I32, register char**);
-The routine most often used is C<perl_call_sv>. The C<SV*> argument
+The routine most often used is C<call_sv>. The C<SV*> argument
contains either the name of the Perl subroutine to be called, or a
reference to the subroutine. The second argument consists of flags
that control the context in which the subroutine is called, whether
@@ -1221,7 +1238,11 @@ trapped, and how to treat return values.
All four routines return the number of arguments that the subroutine returned
on the Perl stack.
-When using any of these routines (except C<perl_call_argv>), the programmer
+These routines used to be called C<perl_call_sv> etc., before Perl v5.6.0,
+but those names are now deprecated; macros of the same name are provided for
+compatibility.
+
+When using any of these routines (except C<call_argv>), the programmer
must manipulate the Perl stack. These include the following macros and
functions:
@@ -1500,2093 +1521,272 @@ additional complications for conditionals). These optimizations are
done in the subroutine peep(). Optimizations performed at this stage
are subject to the same restrictions as in the pass 2.
-=head1 API LISTING
-
-This is a listing of functions, macros, flags, and variables that may be
-useful to extension writers or that may be found while reading other
-extensions.
-
-Note that all Perl API global variables must be referenced with the C<PL_>
-prefix. Some macros are provided for compatibility with the older,
-unadorned names, but this support will be removed in a future release.
-
-It is strongly recommended that all Perl API functions that don't begin
-with C<perl> be referenced with an explicit C<Perl_> prefix.
-
-The sort order of the listing is case insensitive, with any
-occurrences of '_' ignored for the purpose of sorting.
-
-=over 8
-
-=item av_clear
-
-Clears an array, making it empty. Does not free the memory used by the
-array itself.
-
- void av_clear (AV* ar)
-
-=item av_extend
-
-Pre-extend an array. The C<key> is the index to which the array should be
-extended.
-
- void av_extend (AV* ar, I32 key)
-
-=item av_fetch
-
-Returns the SV at the specified index in the array. The C<key> is the
-index. If C<lval> is set then the fetch will be part of a store. Check
-that the return value is non-null before dereferencing it to a C<SV*>.
-
-See L<Understanding the Magic of Tied Hashes and Arrays> for more
-information on how to use this function on tied arrays.
-
- SV** av_fetch (AV* ar, I32 key, I32 lval)
-
-=item AvFILL
-
-Same as C<av_len()>. Deprecated, use C<av_len()> instead.
-
-=item av_len
-
-Returns the highest index in the array. Returns -1 if the array is empty.
-
- I32 av_len (AV* ar)
-
-=item av_make
-
-Creates a new AV and populates it with a list of SVs. The SVs are copied
-into the array, so they may be freed after the call to av_make. The new AV
-will have a reference count of 1.
-
- AV* av_make (I32 size, SV** svp)
-
-=item av_pop
-
-Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array is
-empty.
-
- SV* av_pop (AV* ar)
-
-=item av_push
-
-Pushes an SV onto the end of the array. The array will grow automatically
-to accommodate the addition.
-
- void av_push (AV* ar, SV* val)
-
-=item av_shift
-
-Shifts an SV off the beginning of the array.
-
- SV* av_shift (AV* ar)
-
-=item av_store
-
-Stores an SV in an array. The array index is specified as C<key>. The
-return value will be NULL if the operation failed or if the value did not
-need to be actually stored within the array (as in the case of tied arrays).
-Otherwise it can be dereferenced to get the original C<SV*>. Note that the
-caller is responsible for suitably incrementing the reference count of C<val>
-before the call, and decrementing it if the function returned NULL.
-
-See L<Understanding the Magic of Tied Hashes and Arrays> for more
-information on how to use this function on tied arrays.
-
- SV** av_store (AV* ar, I32 key, SV* val)
-
-=item av_undef
-
-Undefines the array. Frees the memory used by the array itself.
-
- void av_undef (AV* ar)
-
-=item av_unshift
-
-Unshift the given number of C<undef> values onto the beginning of the
-array. The array will grow automatically to accommodate the addition.
-You must then use C<av_store> to assign values to these new elements.
-
- void av_unshift (AV* ar, I32 num)
-
-=item CLASS
-
-Variable which is setup by C<xsubpp> to indicate the class name for a C++ XS
-constructor. This is always a C<char*>. See C<THIS> and
-L<perlxs/"Using XS With C++">.
-
-=item Copy
-
-The XSUB-writer's interface to the C C<memcpy> function. The C<s> is the
-source, C<d> is the destination, C<n> is the number of items, and C<t> is
-the type. May fail on overlapping copies. See also C<Move>.
-
- void Copy( s, d, n, t )
-
-=item croak
-
-This is the XSUB-writer's interface to Perl's C<die> function. Use this
-function the same way you use the C C<printf> function. See C<warn>.
-
-=item CvSTASH
-
-Returns the stash of the CV.
-
- HV* CvSTASH( SV* sv )
-
-=item PL_DBsingle
-
-When Perl is run in debugging mode, with the B<-d> switch, this SV is a
-boolean which indicates whether subs are being single-stepped.
-Single-stepping is automatically turned on after every step. This is the C
-variable which corresponds to Perl's $DB::single variable. See C<PL_DBsub>.
-
-=item PL_DBsub
-
-When Perl is run in debugging mode, with the B<-d> switch, this GV contains
-the SV which holds the name of the sub being debugged. This is the C
-variable which corresponds to Perl's $DB::sub variable. See C<PL_DBsingle>.
-The sub name can be found by
-
- SvPV( GvSV( PL_DBsub ), len )
-
-=item PL_DBtrace
-
-Trace variable used when Perl is run in debugging mode, with the B<-d>
-switch. This is the C variable which corresponds to Perl's $DB::trace
-variable. See C<PL_DBsingle>.
-
-=item dMARK
-
-Declare a stack marker variable, C<mark>, for the XSUB. See C<MARK> and
-C<dORIGMARK>.
-
-=item dORIGMARK
-
-Saves the original stack mark for the XSUB. See C<ORIGMARK>.
-
-=item PL_dowarn
-
-The C variable which corresponds to Perl's $^W warning variable.
-
-=item dSP
-
-Declares a local copy of perl's stack pointer for the XSUB, available via
-the C<SP> macro. See C<SP>.
-
-=item dXSARGS
-
-Sets up stack and mark pointers for an XSUB, calling dSP and dMARK. This is
-usually handled automatically by C<xsubpp>. Declares the C<items> variable
-to indicate the number of items on the stack.
-
-=item dXSI32
-
-Sets up the C<ix> variable for an XSUB which has aliases. This is usually
-handled automatically by C<xsubpp>.
-
-=item do_binmode
-
-Switches filehandle to binmode. C<iotype> is what C<IoTYPE(io)> would
-contain.
-
- do_binmode(fp, iotype, TRUE);
-
-=item ENTER
-
-Opening bracket on a callback. See C<LEAVE> and L<perlcall>.
-
- ENTER;
-
-=item EXTEND
-
-Used to extend the argument stack for an XSUB's return values.
-
- EXTEND( sp, int x )
-
-=item fbm_compile
-
-Analyses the string in order to make fast searches on it using fbm_instr() --
-the Boyer-Moore algorithm.
-
- void fbm_compile(SV* sv, U32 flags)
-
-=item fbm_instr
-
-Returns the location of the SV in the string delimited by C<str> and
-C<strend>. It returns C<Nullch> if the string can't be found. The
-C<sv> does not have to be fbm_compiled, but the search will not be as
-fast then.
-
- char* fbm_instr(char *str, char *strend, SV *sv, U32 flags)
-
-=item FREETMPS
-
-Closing bracket for temporaries on a callback. See C<SAVETMPS> and
-L<perlcall>.
-
- FREETMPS;
-
-=item G_ARRAY
-
-Used to indicate array context. See C<GIMME_V>, C<GIMME> and L<perlcall>.
-
-=item G_DISCARD
-
-Indicates that arguments returned from a callback should be discarded. See
-L<perlcall>.
-
-=item G_EVAL
-
-Used to force a Perl C<eval> wrapper around a callback. See L<perlcall>.
-
-=item GIMME
-
-A backward-compatible version of C<GIMME_V> which can only return
-C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
-
-=item GIMME_V
-
-The XSUB-writer's equivalent to Perl's C<wantarray>. Returns
-C<G_VOID>, C<G_SCALAR> or C<G_ARRAY> for void, scalar or array
-context, respectively.
-
-=item G_NOARGS
-
-Indicates that no arguments are being sent to a callback. See L<perlcall>.
-
-=item G_SCALAR
-
-Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and L<perlcall>.
-
-=item gv_fetchmeth
-
-Returns the glob with the given C<name> and a defined subroutine or
-C<NULL>. The glob lives in the given C<stash>, or in the stashes
-accessible via @ISA and @UNIVERSAL.
-
-The argument C<level> should be either 0 or -1. If C<level==0>, as a
-side-effect creates a glob with the given C<name> in the given
-C<stash> which in the case of success contains an alias for the
-subroutine, and sets up caching info for this glob. Similarly for all
-the searched stashes.
-
-This function grants C<"SUPER"> token as a postfix of the stash name.
-
-The GV returned from C<gv_fetchmeth> may be a method cache entry,
-which is not visible to Perl code. So when calling C<perl_call_sv>,
-you should not use the GV directly; instead, you should use the
-method's CV, which can be obtained from the GV with the C<GvCV> macro.
-
- GV* gv_fetchmeth (HV* stash, char* name, STRLEN len, I32 level)
-
-=item gv_fetchmethod
-
-=item gv_fetchmethod_autoload
-
-Returns the glob which contains the subroutine to call to invoke the
-method on the C<stash>. In fact in the presence of autoloading this may
-be the glob for "AUTOLOAD". In this case the corresponding variable
-$AUTOLOAD is already setup.
-
-The third parameter of C<gv_fetchmethod_autoload> determines whether AUTOLOAD
-lookup is performed if the given method is not present: non-zero means
-yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD. Calling
-C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload> with a
-non-zero C<autoload> parameter.
-
-These functions grant C<"SUPER"> token as a prefix of the method name.
-
-Note that if you want to keep the returned glob for a long time, you
-need to check for it being "AUTOLOAD", since at the later time the call
-may load a different subroutine due to $AUTOLOAD changing its value.
-Use the glob created via a side effect to do this.
-
-These functions have the same side-effects and as C<gv_fetchmeth> with
-C<level==0>. C<name> should be writable if contains C<':'> or C<'\''>.
-The warning against passing the GV returned by C<gv_fetchmeth> to
-C<perl_call_sv> apply equally to these functions.
-
- GV* gv_fetchmethod (HV* stash, char* name)
- GV* gv_fetchmethod_autoload (HV* stash, char* name, I32 autoload)
-
-=item G_VOID
-
-Used to indicate void context. See C<GIMME_V> and L<perlcall>.
-
-=item gv_stashpv
-
-Returns a pointer to the stash for a specified package. If C<create> is set
-then the package will be created if it does not already exist. If C<create>
-is not set and the package does not exist then NULL is returned.
-
- HV* gv_stashpv (char* name, I32 create)
-
-=item gv_stashsv
-
-Returns a pointer to the stash for a specified package. See C<gv_stashpv>.
-
- HV* gv_stashsv (SV* sv, I32 create)
-
-=item GvSV
-
-Return the SV from the GV.
-
-=item HEf_SVKEY
-
-This flag, used in the length slot of hash entries and magic
-structures, specifies the structure contains a C<SV*> pointer where a
-C<char*> pointer is to be expected. (For information only--not to be used).
-
-=item HeHASH
-
-Returns the computed hash stored in the hash entry.
-
- U32 HeHASH(HE* he)
-
-=item HeKEY
-
-Returns the actual pointer stored in the key slot of the hash entry.
-The pointer may be either C<char*> or C<SV*>, depending on the value of
-C<HeKLEN()>. Can be assigned to. The C<HePV()> or C<HeSVKEY()> macros
-are usually preferable for finding the value of a key.
-
- char* HeKEY(HE* he)
-
-=item HeKLEN
-
-If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
-holds an C<SV*> key. Otherwise, holds the actual length of the key.
-Can be assigned to. The C<HePV()> macro is usually preferable for finding
-key lengths.
-
- int HeKLEN(HE* he)
-
-=item HePV
-
-Returns the key slot of the hash entry as a C<char*> value, doing any
-necessary dereferencing of possibly C<SV*> keys. The length of
-the string is placed in C<len> (this is a macro, so do I<not> use
-C<&len>). If you do not care about what the length of the key is,
-you may use the global variable C<PL_na>, though this is rather less
-efficient than using a local variable. Remember though, that hash
-keys in perl are free to contain embedded nulls, so using C<strlen()>
-or similar is not a good way to find the length of hash keys.
-This is very similar to the C<SvPV()> macro described elsewhere in
-this document.
-
- char* HePV(HE* he, STRLEN len)
-
-=item HeSVKEY
-
-Returns the key as an C<SV*>, or C<Nullsv> if the hash entry
-does not contain an C<SV*> key.
-
- HeSVKEY(HE* he)
-
-=item HeSVKEY_force
-
-Returns the key as an C<SV*>. Will create and return a temporary
-mortal C<SV*> if the hash entry contains only a C<char*> key.
-
- HeSVKEY_force(HE* he)
-
-=item HeSVKEY_set
-
-Sets the key to a given C<SV*>, taking care to set the appropriate flags
-to indicate the presence of an C<SV*> key, and returns the same C<SV*>.
-
- HeSVKEY_set(HE* he, SV* sv)
-
-=item HeVAL
-
-Returns the value slot (type C<SV*>) stored in the hash entry.
-
- HeVAL(HE* he)
-
-=item hv_clear
-
-Clears a hash, making it empty.
-
- void hv_clear (HV* tb)
-
-=item hv_delete
-
-Deletes a key/value pair in the hash. The value SV is removed from the hash
-and returned to the caller. The C<klen> is the length of the key. The
-C<flags> value will normally be zero; if set to G_DISCARD then NULL will be
-returned.
-
- SV* hv_delete (HV* tb, char* key, U32 klen, I32 flags)
-
-=item hv_delete_ent
-
-Deletes a key/value pair in the hash. The value SV is removed from the hash
-and returned to the caller. The C<flags> value will normally be zero; if set
-to G_DISCARD then NULL will be returned. C<hash> can be a valid precomputed
-hash value, or 0 to ask for it to be computed.
-
- SV* hv_delete_ent (HV* tb, SV* key, I32 flags, U32 hash)
-
-=item hv_exists
-
-Returns a boolean indicating whether the specified hash key exists. The
-C<klen> is the length of the key.
-
- bool hv_exists (HV* tb, char* key, U32 klen)
-
-=item hv_exists_ent
-
-Returns a boolean indicating whether the specified hash key exists. C<hash>
-can be a valid precomputed hash value, or 0 to ask for it to be computed.
-
- bool hv_exists_ent (HV* tb, SV* key, U32 hash)
-
-=item hv_fetch
-
-Returns the SV which corresponds to the specified key in the hash. The
-C<klen> is the length of the key. If C<lval> is set then the fetch will be
-part of a store. Check that the return value is non-null before
-dereferencing it to a C<SV*>.
-
-See L<Understanding the Magic of Tied Hashes and Arrays> for more
-information on how to use this function on tied hashes.
-
- SV** hv_fetch (HV* tb, char* key, U32 klen, I32 lval)
-
-=item hv_fetch_ent
-
-Returns the hash entry which corresponds to the specified key in the hash.
-C<hash> must be a valid precomputed hash number for the given C<key>, or
-0 if you want the function to compute it. IF C<lval> is set then the
-fetch will be part of a store. Make sure the return value is non-null
-before accessing it. The return value when C<tb> is a tied hash
-is a pointer to a static location, so be sure to make a copy of the
-structure if you need to store it somewhere.
-
-See L<Understanding the Magic of Tied Hashes and Arrays> for more
-information on how to use this function on tied hashes.
-
- HE* hv_fetch_ent (HV* tb, SV* key, I32 lval, U32 hash)
-
-=item hv_iterinit
-
-Prepares a starting point to traverse a hash table.
-
- I32 hv_iterinit (HV* tb)
-
-Returns the number of keys in the hash (i.e. the same as C<HvKEYS(tb)>).
-The return value is currently only meaningful for hashes without tie
-magic.
-
-NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number
-of hash buckets that happen to be in use. If you still need that
-esoteric value, you can get it through the macro C<HvFILL(tb)>.
-
-=item hv_iterkey
-
-Returns the key from the current position of the hash iterator. See
-C<hv_iterinit>.
-
- char* hv_iterkey (HE* entry, I32* retlen)
-
-=item hv_iterkeysv
-
-Returns the key as an C<SV*> from the current position of the hash
-iterator. The return value will always be a mortal copy of the
-key. Also see C<hv_iterinit>.
-
- SV* hv_iterkeysv (HE* entry)
-
-=item hv_iternext
-
-Returns entries from a hash iterator. See C<hv_iterinit>.
-
- HE* hv_iternext (HV* tb)
-
-=item hv_iternextsv
-
-Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
-operation.
-
- SV* hv_iternextsv (HV* hv, char** key, I32* retlen)
-
-=item hv_iterval
-
-Returns the value from the current position of the hash iterator. See
-C<hv_iterkey>.
-
- SV* hv_iterval (HV* tb, HE* entry)
-
-=item hv_magic
-
-Adds magic to a hash. See C<sv_magic>.
-
- void hv_magic (HV* hv, GV* gv, int how)
-
-=item HvNAME
-
-Returns the package name of a stash. See C<SvSTASH>, C<CvSTASH>.
-
- char* HvNAME (HV* stash)
-
-=item hv_store
-
-Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
-the length of the key. The C<hash> parameter is the precomputed hash
-value; if it is zero then Perl will compute it. The return value will be
-NULL if the operation failed or if the value did not need to be actually
-stored within the hash (as in the case of tied hashes). Otherwise it can
-be dereferenced to get the original C<SV*>. Note that the caller is
-responsible for suitably incrementing the reference count of C<val>
-before the call, and decrementing it if the function returned NULL.
-
-See L<Understanding the Magic of Tied Hashes and Arrays> for more
-information on how to use this function on tied hashes.
-
- SV** hv_store (HV* tb, char* key, U32 klen, SV* val, U32 hash)
-
-=item hv_store_ent
-
-Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
-parameter is the precomputed hash value; if it is zero then Perl will
-compute it. The return value is the new hash entry so created. It will be
-NULL if the operation failed or if the value did not need to be actually
-stored within the hash (as in the case of tied hashes). Otherwise the
-contents of the return value can be accessed using the C<He???> macros
-described here. Note that the caller is responsible for suitably
-incrementing the reference count of C<val> before the call, and decrementing
-it if the function returned NULL.
-
-See L<Understanding the Magic of Tied Hashes and Arrays> for more
-information on how to use this function on tied hashes.
-
- HE* hv_store_ent (HV* tb, SV* key, SV* val, U32 hash)
-
-=item hv_undef
-
-Undefines the hash.
-
- void hv_undef (HV* tb)
-
-=item isALNUM
-
-Returns a boolean indicating whether the C C<char> is an ascii alphanumeric
-character or digit.
-
- int isALNUM (char c)
-
-=item isALPHA
-
-Returns a boolean indicating whether the C C<char> is an ascii alphabetic
-character.
-
- int isALPHA (char c)
-
-=item isDIGIT
-
-Returns a boolean indicating whether the C C<char> is an ascii digit.
-
- int isDIGIT (char c)
-
-=item isLOWER
-
-Returns a boolean indicating whether the C C<char> is a lowercase character.
-
- int isLOWER (char c)
-
-=item isSPACE
-
-Returns a boolean indicating whether the C C<char> is whitespace.
-
- int isSPACE (char c)
-
-=item isUPPER
-
-Returns a boolean indicating whether the C C<char> is an uppercase character.
-
- int isUPPER (char c)
-
-=item items
-
-Variable which is setup by C<xsubpp> to indicate the number of items on the
-stack. See L<perlxs/"Variable-length Parameter Lists">.
-
-=item ix
-
-Variable which is setup by C<xsubpp> to indicate which of an XSUB's aliases
-was used to invoke it. See L<perlxs/"The ALIAS: Keyword">.
-
-=item LEAVE
-
-Closing bracket on a callback. See C<ENTER> and L<perlcall>.
-
- LEAVE;
-
-=item looks_like_number
-
-Test if an the content of an SV looks like a number (or is a number).
-
- int looks_like_number(SV*)
-
-
-=item MARK
-
-Stack marker variable for the XSUB. See C<dMARK>.
-
-=item mg_clear
-
-Clear something magical that the SV represents. See C<sv_magic>.
-
- int mg_clear (SV* sv)
-
-=item mg_copy
-
-Copies the magic from one SV to another. See C<sv_magic>.
-
- int mg_copy (SV *, SV *, char *, STRLEN)
-
-=item mg_find
-
-Finds the magic pointer for type matching the SV. See C<sv_magic>.
-
- MAGIC* mg_find (SV* sv, int type)
-
-=item mg_free
-
-Free any magic storage used by the SV. See C<sv_magic>.
-
- int mg_free (SV* sv)
-
-=item mg_get
-
-Do magic after a value is retrieved from the SV. See C<sv_magic>.
-
- int mg_get (SV* sv)
-
-=item mg_len
-
-Report on the SV's length. See C<sv_magic>.
-
- U32 mg_len (SV* sv)
-
-=item mg_magical
-
-Turns on the magical status of an SV. See C<sv_magic>.
-
- void mg_magical (SV* sv)
-
-=item mg_set
-
-Do magic after a value is assigned to the SV. See C<sv_magic>.
-
- int mg_set (SV* sv)
-
-=item modglobal
-
-C<modglobal> is a general purpose, interpreter global HV for use by
-extensions that need to keep information on a per-interpreter basis.
-In a pinch, it can also be used as a symbol table for extensions
-to share data among each other. It is a good idea to use keys
-prefixed by the package name of the extension that owns the data.
-
-=item Move
-
-The XSUB-writer's interface to the C C<memmove> function. The C<s> is the
-source, C<d> is the destination, C<n> is the number of items, and C<t> is
-the type. Can do overlapping moves. See also C<Copy>.
-
- void Move( s, d, n, t )
-
-=item PL_na
-
-A convenience variable which is typically used with C<SvPV> when one doesn't
-care about the length of the string. It is usually more efficient to
-declare a local variable and use that instead.
-
-=item New
-
-The XSUB-writer's interface to the C C<malloc> function.
-
- void* New( x, void *ptr, int size, type )
-
-=item newAV
-
-Creates a new AV. The reference count is set to 1.
-
- AV* newAV (void)
-
-=item Newc
-
-The XSUB-writer's interface to the C C<malloc> function, with cast.
-
- void* Newc( x, void *ptr, int size, type, cast )
-
-=item newCONSTSUB
-
-Creates a constant sub equivalent to Perl C<sub FOO () { 123 }>
-which is eligible for inlining at compile-time.
-
- void newCONSTSUB(HV* stash, char* name, SV* sv)
-
-=item newHV
-
-Creates a new HV. The reference count is set to 1.
-
- HV* newHV (void)
-
-=item newRV_inc
-
-Creates an RV wrapper for an SV. The reference count for the original SV is
-incremented.
-
- SV* newRV_inc (SV* ref)
-
-For historical reasons, "newRV" is a synonym for "newRV_inc".
-
-=item newRV_noinc
-
-Creates an RV wrapper for an SV. The reference count for the original
-SV is B<not> incremented.
-
- SV* newRV_noinc (SV* ref)
-
-=item NEWSV
-
-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. C<id> is an integer id between 0 and 1299 (used to identify
-leaks).
-
- SV* NEWSV (int id, STRLEN len)
-
-=item newSViv
-
-Creates a new SV and copies an integer into it. The reference count for the
-SV is set to 1.
-
- SV* newSViv (IV i)
-
-=item newSVnv
-
-Creates a new SV and copies a double into it. The reference count for the
-SV is set to 1.
-
- SV* newSVnv (NV i)
-
-=item newSVpv
-
-Creates a new SV and copies a string into it. The reference count for the
-SV is set to 1. If C<len> is zero then Perl will compute the length.
-
- SV* newSVpv (char* s, STRLEN len)
-
-=item newSVpvf
-
-Creates a new SV an initialize it with the string formatted like
-C<sprintf>.
-
- SV* newSVpvf(const char* pat, ...);
-
-=item newSVpvn
-
-Creates a new SV and copies a string into it. The reference count for the
-SV is set to 1. If C<len> is zero then Perl will create a zero length
-string.
-
- SV* newSVpvn (char* s, STRLEN len)
-
-=item newSVrv
-
-Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
-it will be upgraded to one. If C<classname> is non-null then the new SV will
-be blessed in the specified package. The new SV is returned and its
-reference count is 1.
-
- SV* newSVrv (SV* rv, char* classname)
-
-=item newSVsv
-
-Creates a new SV which is an exact duplicate of the original SV.
-
- SV* newSVsv (SV* old)
-
-=item newXS
-
-Used by C<xsubpp> to hook up XSUBs as Perl subs.
-
-=item newXSproto
-
-Used by C<xsubpp> to hook up XSUBs as Perl subs. Adds Perl prototypes to
-the subs.
-
-=item Newz
-
-The XSUB-writer's interface to the C C<malloc> function. The allocated
-memory is zeroed with C<memzero>.
-
- void* Newz( x, void *ptr, int size, type )
-
-=item Nullav
-
-Null AV pointer.
-
-=item Nullch
-
-Null character pointer.
-
-=item Nullcv
-
-Null CV pointer.
-
-=item Nullhv
-
-Null HV pointer.
-
-=item Nullsv
-
-Null SV pointer.
-
-=item ORIGMARK
-
-The original stack mark for the XSUB. See C<dORIGMARK>.
-
-=item perl_alloc
-
-Allocates a new Perl interpreter. See L<perlembed>.
-
-=item perl_call_argv
-
-Performs a callback to the specified Perl sub. See L<perlcall>.
-
- I32 perl_call_argv (char* subname, I32 flags, char** argv)
-
-=item perl_call_method
-
-Performs a callback to the specified Perl method. The blessed object must
-be on the stack. See L<perlcall>.
-
- I32 perl_call_method (char* methname, I32 flags)
-
-=item perl_call_pv
-
-Performs a callback to the specified Perl sub. See L<perlcall>.
-
- I32 perl_call_pv (char* subname, I32 flags)
-
-=item perl_call_sv
-
-Performs a callback to the Perl sub whose name is in the SV. See
-L<perlcall>.
-
- I32 perl_call_sv (SV* sv, I32 flags)
-
-=item perl_construct
-
-Initializes a new Perl interpreter. See L<perlembed>.
-
-=item perl_destruct
-
-Shuts down a Perl interpreter. See L<perlembed>.
-
-=item perl_eval_sv
-
-Tells Perl to C<eval> the string in the SV.
-
- I32 perl_eval_sv (SV* sv, I32 flags)
-
-=item perl_eval_pv
-
-Tells Perl to C<eval> the given string and return an SV* result.
-
- SV* perl_eval_pv (char* p, I32 croak_on_error)
-
-=item perl_free
-
-Releases a Perl interpreter. See L<perlembed>.
-
-=item perl_get_av
-
-Returns the AV of the specified Perl array. If C<create> is set and the
-Perl variable does not exist then it will be created. If C<create> is not
-set and the variable does not exist then NULL is returned.
-
- AV* perl_get_av (char* name, I32 create)
-
-=item perl_get_cv
-
-Returns the CV of the specified Perl sub. If C<create> is set and the Perl
-variable does not exist then it will be created. If C<create> is not
-set and the variable does not exist then NULL is returned.
-
- CV* perl_get_cv (char* name, I32 create)
-
-=item perl_get_hv
-
-Returns the HV of the specified Perl hash. If C<create> is set and the Perl
-variable does not exist then it will be created. If C<create> is not
-set and the variable does not exist then NULL is returned.
-
- HV* perl_get_hv (char* name, I32 create)
-
-=item perl_get_sv
-
-Returns the SV of the specified Perl scalar. If C<create> is set and the
-Perl variable does not exist then it will be created. If C<create> is not
-set and the variable does not exist then NULL is returned.
-
- SV* perl_get_sv (char* name, I32 create)
-
-=item perl_parse
-
-Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
-
-=item perl_require_pv
-
-Tells Perl to C<require> a module.
-
- void perl_require_pv (char* pv)
-
-=item perl_run
-
-Tells a Perl interpreter to run. See L<perlembed>.
-
-=item POPi
-
-Pops an integer off the stack.
-
- int POPi()
-
-=item POPl
-
-Pops a long off the stack.
-
- long POPl()
-
-=item POPp
-
-Pops a string off the stack.
-
- char* POPp()
-
-=item POPn
-
-Pops a double off the stack.
-
- double POPn()
-
-=item POPs
-
-Pops an SV off the stack.
-
- SV* POPs()
-
-=item PUSHMARK
-
-Opening bracket for arguments on a callback. See C<PUTBACK> and L<perlcall>.
-
- PUSHMARK(p)
-
-=item PUSHi
-
-Push an integer onto the stack. The stack must have room for this element.
-Handles 'set' magic. See C<XPUSHi>.
-
- void PUSHi(int d)
-
-=item PUSHn
-
-Push a double onto the stack. The stack must have room for this element.
-Handles 'set' magic. See C<XPUSHn>.
-
- void PUSHn(double d)
-
-=item PUSHp
-
-Push a string onto the stack. The stack must have room for this element.
-The C<len> indicates the length of the string. Handles 'set' magic. See
-C<XPUSHp>.
-
- void PUSHp(char *c, int len )
-
-=item PUSHs
-
-Push an SV onto the stack. The stack must have room for this element. Does
-not handle 'set' magic. See C<XPUSHs>.
-
- void PUSHs(sv)
-
-=item PUSHu
-
-Push an unsigned integer onto the stack. The stack must have room for
-this element. See C<XPUSHu>.
-
- void PUSHu(unsigned int d)
-
-
-=item PUTBACK
-
-Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
-See C<PUSHMARK> and L<perlcall> for other uses.
-
- PUTBACK;
-
-=item Renew
-
-The XSUB-writer's interface to the C C<realloc> function.
+=head1 How multiple interpreters and concurrency are supported
+
+WARNING: This information is subject to radical changes prior to
+the Perl 5.6 release. Use with caution.
+
+=head2 Background and PERL_IMPLICIT_CONTEXT
+
+The Perl interpreter can be regarded as a closed box: it has an API
+for feeding it code or otherwise making it do things, but it also has
+functions for its own use. This smells a lot like an object, and
+there are ways for you to build Perl so that you can have multiple
+interpreters, with one interpreter represented either as a C++ object,
+a C structure, or inside a thread. The thread, the C structure, or
+the C++ object will contain all the context, the state of that
+interpreter.
+
+Three macros control the major Perl build flavors: MULTIPLICITY,
+USE_THREADS and PERL_OBJECT. The MULTIPLICITY build has a C structure
+that packages all the interpreter state, there is a similar thread-specific
+data structure under USE_THREADS, and the PERL_OBJECT build has a C++
+class to maintain interpreter state. In all three cases,
+PERL_IMPLICIT_CONTEXT is also normally defined, and enables the
+support for passing in a "hidden" first argument that represents all three
+data structures.
+
+All this obviously requires a way for the Perl internal functions to be
+C++ methods, subroutines taking some kind of structure as the first
+argument, or subroutines taking nothing as the first argument. To
+enable these three very different ways of building the interpreter,
+the Perl source (as it does in so many other situations) makes heavy
+use of macros and subroutine naming conventions.
+
+First problem: deciding which functions will be public API functions and
+which will be private. All functions whose names begin C<S_> are private
+(think "S" for "secret" or "static"). All other functions begin with
+"Perl_", but just because a function begins with "Perl_" does not mean it is
+part of the API. The easiest way to be B<sure> a function is part of the API
+is to find its entry in L<perlapi>. If it exists in L<perlapi>, it's part
+of the API. If it doesn't, and you think it should be (i.e., you need it fo
+r your extension), send mail via L<perlbug> explaining why you think it
+should be.
+
+(L<perlapi> itself is generated by embed.pl, a Perl script that generates
+significant portions of the Perl source code. It has a list of almost
+all the functions defined by the Perl interpreter along with their calling
+characteristics and some flags. Functions that are part of the public API
+are marked with an 'A' in its flags.)
+
+Second problem: there must be a syntax so that the same subroutine
+declarations and calls can pass a structure as their first argument,
+or pass nothing. To solve this, the subroutines are named and
+declared in a particular way. Here's a typical start of a static
+function used within the Perl guts:
+
+ STATIC void
+ S_incline(pTHX_ char *s)
+
+STATIC becomes "static" in C, and is #define'd to nothing in C++.
+
+A public function (i.e. part of the internal API, but not necessarily
+sanctioned for use in extensions) begins like this:
+
+ void
+ Perl_sv_setsv(pTHX_ SV* dsv, SV* ssv)
+
+C<pTHX_> is one of a number of macros (in perl.h) that hide the
+details of the interpreter's context. THX stands for "thread", "this",
+or "thingy", as the case may be. (And no, George Lucas is not involved. :-)
+The first character could be 'p' for a B<p>rototype, 'a' for B<a>rgument,
+or 'd' for B<d>eclaration.
+
+When Perl is built without PERL_IMPLICIT_CONTEXT, there is no first
+argument containing the interpreter's context. The trailing underscore
+in the pTHX_ macro indicates that the macro expansion needs a comma
+after the context argument because other arguments follow it. If
+PERL_IMPLICIT_CONTEXT is not defined, pTHX_ will be ignored, and the
+subroutine is not prototyped to take the extra argument. The form of the
+macro without the trailing underscore is used when there are no additional
+explicit arguments.
+
+When a core function calls another, it must pass the context. This
+is normally hidden via macros. Consider C<sv_setsv>. It expands
+something like this:
+
+ ifdef PERL_IMPLICIT_CONTEXT
+ define sv_setsv(a,b) Perl_sv_setsv(aTHX_ a, b)
+ /* can't do this for vararg functions, see below */
+ else
+ define sv_setsv Perl_sv_setsv
+ endif
+
+This works well, and means that XS authors can gleefully write:
+
+ sv_setsv(foo, bar);
+
+and still have it work under all the modes Perl could have been
+compiled with.
+
+Under PERL_OBJECT in the core, that will translate to either:
+
+ CPerlObj::Perl_sv_setsv(foo,bar); # in CPerlObj functions,
+ # C++ takes care of 'this'
+ or
+
+ pPerl->Perl_sv_setsv(foo,bar); # in truly static functions,
+ # see objXSUB.h
+
+Under PERL_OBJECT in extensions (aka PERL_CAPI), or under
+MULTIPLICITY/USE_THREADS w/ PERL_IMPLICIT_CONTEXT in both core
+and extensions, it will be:
+
+ Perl_sv_setsv(aTHX_ foo, bar); # the canonical Perl "API"
+ # for all build flavors
+
+This doesn't work so cleanly for varargs functions, though, as macros
+imply that the number of arguments is known in advance. Instead we
+either need to spell them out fully, passing C<aTHX_> as the first
+argument (the Perl core tends to do this with functions like
+Perl_warner), or use a context-free version.
+
+The context-free version of Perl_warner is called
+Perl_warner_nocontext, and does not take the extra argument. Instead
+it does dTHX; to get the context from thread-local storage. We
+C<#define warner Perl_warner_nocontext> so that extensions get source
+compatibility at the expense of performance. (Passing an arg is
+cheaper than grabbing it from thread-local storage.)
+
+You can ignore [pad]THX[xo] when browsing the Perl headers/sources.
+Those are strictly for use within the core. Extensions and embedders
+need only be aware of [pad]THX.
- void* Renew( void *ptr, int size, type )
+=head2 How do I use all this in extensions?
+
+When Perl is built with PERL_IMPLICIT_CONTEXT, extensions that call
+any functions in the Perl API will need to pass the initial context
+argument somehow. The kicker is that you will need to write it in
+such a way that the extension still compiles when Perl hasn't been
+built with PERL_IMPLICIT_CONTEXT enabled.
-=item Renewc
+There are three ways to do this. First, the easy but inefficient way,
+which is also the default, in order to maintain source compatibility
+with extensions: whenever XSUB.h is #included, it redefines the aTHX
+and aTHX_ macros to call a function that will return the context.
+Thus, something like:
-The XSUB-writer's interface to the C C<realloc> function, with cast.
+ sv_setsv(asv, bsv);
- void* Renewc( void *ptr, int size, type, cast )
+in your extesion will translate to this when PERL_IMPLICIT_CONTEXT is
+in effect:
-=item RETVAL
+ Perl_sv_setsv(Perl_get_context(), asv, bsv);
-Variable which is setup by C<xsubpp> to hold the return value for an XSUB.
-This is always the proper type for the XSUB.
-See L<perlxs/"The RETVAL Variable">.
+or to this otherwise:
-=item safefree
+ Perl_sv_setsv(asv, bsv);
-The XSUB-writer's interface to the C C<free> function.
+You have to do nothing new in your extension to get this; since
+the Perl library provides Perl_get_context(), it will all just
+work.
+
+The second, more efficient way is to use the following template for
+your Foo.xs:
-=item safemalloc
+ #define PERL_NO_GET_CONTEXT /* we want efficiency */
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
-The XSUB-writer's interface to the C C<malloc> function.
+ static my_private_function(int arg1, int arg2);
-=item saferealloc
+ static SV *
+ my_private_function(int arg1, int arg2)
+ {
+ dTHX; /* fetch context */
+ ... call many Perl API functions ...
+ }
-The XSUB-writer's interface to the C C<realloc> function.
+ [... etc ...]
-=item savepv
+ MODULE = Foo PACKAGE = Foo
-Copy a string to a safe spot. This does not use an SV.
+ /* typical XSUB */
- char* savepv (char* sv)
+ void
+ my_xsub(arg)
+ int arg
+ CODE:
+ my_private_function(arg, 10);
-=item savepvn
+Note that the only two changes from the normal way of writing an
+extension is the addition of a C<#define PERL_NO_GET_CONTEXT> before
+including the Perl headers, followed by a C<dTHX;> declaration at
+the start of every function that will call the Perl API. (You'll
+know which functions need this, because the C compiler will complain
+that there's an undeclared identifier in those functions.) No changes
+are needed for the XSUBs themselves, because the XS() macro is
+correctly defined to pass in the implicit context if needed.
-Copy a string to a safe spot. The C<len> indicates number of bytes to
-copy. This does not use an SV.
+The third, even more efficient way is to ape how it is done within
+the Perl guts:
- char* savepvn (char* sv, I32 len)
-=item SAVETMPS
+ #define PERL_NO_GET_CONTEXT /* we want efficiency */
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
-Opening bracket for temporaries on a callback. See C<FREETMPS> and
-L<perlcall>.
+ /* pTHX_ only needed for functions that call Perl API */
+ static my_private_function(pTHX_ int arg1, int arg2);
- SAVETMPS;
+ static SV *
+ my_private_function(pTHX_ int arg1, int arg2)
+ {
+ /* dTHX; not needed here, because THX is an argument */
+ ... call Perl API functions ...
+ }
-=item SP
+ [... etc ...]
-Stack pointer. This is usually handled by C<xsubpp>. See C<dSP> and
-C<SPAGAIN>.
+ MODULE = Foo PACKAGE = Foo
-=item SPAGAIN
+ /* typical XSUB */
-Refetch the stack pointer. Used after a callback. See L<perlcall>.
+ void
+ my_xsub(arg)
+ int arg
+ CODE:
+ my_private_function(aTHX_ arg, 10);
- SPAGAIN;
+This implementation never has to fetch the context using a function
+call, since it is always passed as an extra argument. Depending on
+your needs for simplicity or efficiency, you may mix the previous
+two approaches freely.
-=item ST
+Never add a comma after C<pTHX> yourself--always use the form of the
+macro with the underscore for functions that take explicit arguments,
+or the form without the argument for functions with no explicit arguments.
-Used to access elements on the XSUB's stack.
+=head2 Future Plans and PERL_IMPLICIT_SYS
- SV* ST(int x)
+Just as PERL_IMPLICIT_CONTEXT provides a way to bundle up everything
+that the interpreter knows about itself and pass it around, so too are
+there plans to allow the interpreter to bundle up everything it knows
+about the environment it's running on. This is enabled with the
+PERL_IMPLICIT_SYS macro. Currently it only works with PERL_OBJECT,
+but is mostly there for MULTIPLICITY and USE_THREADS (see inside
+iperlsys.h).
-=item strEQ
-
-Test two strings to see if they are equal. Returns true or false.
-
- int strEQ( char *s1, char *s2 )
-
-=item strGE
-
-Test two strings to see if the first, C<s1>, is greater than or equal to the
-second, C<s2>. Returns true or false.
-
- int strGE( char *s1, char *s2 )
-
-=item strGT
-
-Test two strings to see if the first, C<s1>, is greater than the second,
-C<s2>. Returns true or false.
-
- int strGT( char *s1, char *s2 )
-
-=item strLE
-
-Test two strings to see if the first, C<s1>, is less than or equal to the
-second, C<s2>. Returns true or false.
-
- int strLE( char *s1, char *s2 )
-
-=item strLT
-
-Test two strings to see if the first, C<s1>, is less than the second,
-C<s2>. Returns true or false.
-
- int strLT( char *s1, char *s2 )
-
-=item strNE
-
-Test two strings to see if they are different. Returns true or false.
-
- int strNE( char *s1, char *s2 )
-
-=item strnEQ
-
-Test two strings to see if they are equal. The C<len> parameter indicates
-the number of bytes to compare. Returns true or false.
-
- int strnEQ( char *s1, char *s2 )
-
-=item strnNE
-
-Test two strings to see if they are different. The C<len> parameter
-indicates the number of bytes to compare. Returns true or false.
-
- int strnNE( char *s1, char *s2, int len )
-
-=item sv_2mortal
-
-Marks an SV as mortal. The SV will be destroyed when the current context
-ends.
-
- SV* sv_2mortal (SV* sv)
-
-=item sv_bless
-
-Blesses an SV into a specified package. The SV must be an RV. The package
-must be designated by its stash (see C<gv_stashpv()>). The reference count
-of the SV is unaffected.
-
- SV* sv_bless (SV* sv, HV* stash)
-
-=item sv_catpv
-
-Concatenates the string onto the end of the string which is in the SV.
-Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
-
- void sv_catpv (SV* sv, char* ptr)
-
-=item sv_catpv_mg
-
-Like C<sv_catpv>, but also handles 'set' magic.
-
- void sv_catpv_mg (SV* sv, const char* ptr)
-
-=item sv_catpvn
-
-Concatenates the string onto the end of the string which is in the SV. The
-C<len> indicates number of bytes to copy. Handles 'get' magic, but not
-'set' magic. See C<sv_catpvn_mg>.
-
- void sv_catpvn (SV* sv, char* ptr, STRLEN len)
-
-=item sv_catpvn_mg
-
-Like C<sv_catpvn>, but also handles 'set' magic.
-
- void sv_catpvn_mg (SV* sv, char* ptr, STRLEN len)
-
-=item sv_catpvf
-
-Processes its arguments like C<sprintf> and appends the formatted output
-to an SV. Handles 'get' magic, but not 'set' magic. C<SvSETMAGIC()> must
-typically be called after calling this function to handle 'set' magic.
-
- void sv_catpvf (SV* sv, const char* pat, ...)
-
-=item sv_catpvf_mg
-
-Like C<sv_catpvf>, but also handles 'set' magic.
-
- void sv_catpvf_mg (SV* sv, const char* pat, ...)
-
-=item sv_catsv
-
-Concatenates the string from SV C<ssv> onto the end of the string in SV
-C<dsv>. Handles 'get' magic, but not 'set' magic. See C<sv_catsv_mg>.
-
- void sv_catsv (SV* dsv, SV* ssv)
-
-=item sv_catsv_mg
-
-Like C<sv_catsv>, but also handles 'set' magic.
-
- void sv_catsv_mg (SV* dsv, SV* ssv)
-
-=item sv_chop
-
-Efficient removal of characters from the beginning of the string
-buffer. SvPOK(sv) must be true and the C<ptr> must be a pointer to
-somewhere inside the string buffer. The C<ptr> becomes the first
-character of the adjusted string.
-
- void sv_chop(SV* sv, char *ptr)
-
-
-=item sv_cmp
-
-Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
-string in C<sv1> is less than, equal to, or greater than the string in
-C<sv2>.
-
- I32 sv_cmp (SV* sv1, SV* sv2)
-
-=item SvCUR
-
-Returns the length of the string which is in the SV. See C<SvLEN>.
-
- int SvCUR (SV* sv)
-
-=item SvCUR_set
-
-Set the length of the string which is in the SV. See C<SvCUR>.
-
- void SvCUR_set (SV* sv, int val)
-
-=item sv_dec
-
-Auto-decrement of the value in the SV.
-
- void sv_dec (SV* sv)
-
-=item sv_derived_from
-
-Returns a boolean indicating whether the SV is derived from the specified
-class. This is the function that implements C<UNIVERSAL::isa>. It works
-for class names as well as for objects.
-
- bool sv_derived_from _((SV* sv, char* name));
-
-=item SvEND
-
-Returns a pointer to the last character in the string which is in the SV.
-See C<SvCUR>. Access the character as
-
- char* SvEND(sv)
-
-=item sv_eq
-
-Returns a boolean indicating whether the strings in the two SVs are
-identical.
-
- I32 sv_eq (SV* sv1, SV* sv2)
-
-=item SvGETMAGIC
-
-Invokes C<mg_get> on an SV if it has 'get' magic. This macro evaluates
-its argument more than once.
-
- void SvGETMAGIC(SV *sv)
-
-=item SvGROW
-
-Expands the character buffer in the SV so that it has room for the
-indicated number of bytes (remember to reserve space for an extra
-trailing NUL character). Calls C<sv_grow> to perform the expansion if
-necessary. Returns a pointer to the character buffer.
-
- char* SvGROW(SV* sv, STRLEN len)
-
-=item sv_grow
-
-Expands the character buffer in the SV. This will use C<sv_unref> and will
-upgrade the SV to C<SVt_PV>. Returns a pointer to the character buffer.
-Use C<SvGROW>.
-
-=item sv_inc
-
-Auto-increment of the value in the SV.
-
- void sv_inc (SV* sv)
-
-=item sv_insert
-
-Inserts a string at the specified offset/length within the SV.
-Similar to the Perl substr() function.
-
- void sv_insert(SV *sv, STRLEN offset, STRLEN len,
- char *str, STRLEN strlen)
-
-=item SvIOK
-
-Returns a boolean indicating whether the SV contains an integer.
-
- int SvIOK (SV* SV)
-
-=item SvIOK_off
-
-Unsets the IV status of an SV.
-
- void SvIOK_off (SV* sv)
-
-=item SvIOK_on
-
-Tells an SV that it is an integer.
-
- void SvIOK_on (SV* sv)
-
-=item SvIOK_only
-
-Tells an SV that it is an integer and disables all other OK bits.
-
- void SvIOK_only (SV* sv)
-
-=item SvIOKp
-
-Returns a boolean indicating whether the SV contains an integer. Checks the
-B<private> setting. Use C<SvIOK>.
-
- int SvIOKp (SV* SV)
-
-=item sv_isa
-
-Returns a boolean indicating whether the SV is blessed into the specified
-class. This does not check for subtypes; use C<sv_derived_from> to verify
-an inheritance relationship.
-
- int sv_isa (SV* sv, char* name)
-
-=item sv_isobject
-
-Returns a boolean indicating whether the SV is an RV pointing to a blessed
-object. If the SV is not an RV, or if the object is not blessed, then this
-will return false.
-
- int sv_isobject (SV* sv)
-
-=item SvIV
-
-Coerces the given SV to an integer and returns it.
-
- int SvIV (SV* sv)
-
-=item SvIVX
-
-Returns the integer which is stored in the SV, assuming SvIOK is true.
-
- int SvIVX (SV* sv)
-
-=item SvLEN
-
-Returns the size of the string buffer in the SV. See C<SvCUR>.
-
- int SvLEN (SV* sv)
-
-=item sv_len
-
-Returns the length of the string in the SV. Use C<SvCUR>.
-
- STRLEN sv_len (SV* sv)
-
-=item sv_magic
-
-Adds magic to an SV.
-
- void sv_magic (SV* sv, SV* obj, int how, char* name, I32 namlen)
-
-=item sv_mortalcopy
-
-Creates a new SV which is a copy of the original SV. The new SV is marked
-as mortal.
-
- SV* sv_mortalcopy (SV* oldsv)
-
-=item sv_newmortal
-
-Creates a new SV which is mortal. The reference count of the SV is set to 1.
-
- SV* sv_newmortal (void)
-
-=item SvNIOK
-
-Returns a boolean indicating whether the SV contains a number, integer or
-double.
-
- int SvNIOK (SV* SV)
-
-=item SvNIOK_off
-
-Unsets the NV/IV status of an SV.
-
- void SvNIOK_off (SV* sv)
-
-=item SvNIOKp
-
-Returns a boolean indicating whether the SV contains a number, integer or
-double. Checks the B<private> setting. Use C<SvNIOK>.
-
- int SvNIOKp (SV* SV)
-
-=item PL_sv_no
-
-This is the C<false> SV. See C<PL_sv_yes>. Always refer to this as C<&PL_sv_no>.
-
-=item SvNOK
-
-Returns a boolean indicating whether the SV contains a double.
-
- int SvNOK (SV* SV)
-
-=item SvNOK_off
-
-Unsets the NV status of an SV.
-
- void SvNOK_off (SV* sv)
-
-=item SvNOK_on
-
-Tells an SV that it is a double.
-
- void SvNOK_on (SV* sv)
-
-=item SvNOK_only
-
-Tells an SV that it is a double and disables all other OK bits.
-
- void SvNOK_only (SV* sv)
-
-=item SvNOKp
-
-Returns a boolean indicating whether the SV contains a double. Checks the
-B<private> setting. Use C<SvNOK>.
-
- int SvNOKp (SV* SV)
-
-=item SvNV
-
-Coerce the given SV to a double and return it.
-
- double SvNV (SV* sv)
-
-=item SvNVX
-
-Returns the double which is stored in the SV, assuming SvNOK is true.
-
- double SvNVX (SV* sv)
-
-=item SvOK
-
-Returns a boolean indicating whether the value is an SV.
-
- int SvOK (SV* sv)
-
-=item SvOOK
-
-Returns a boolean indicating whether the SvIVX is a valid offset value
-for the SvPVX. This hack is used internally to speed up removal of
-characters from the beginning of a SvPV. When SvOOK is true, then the
-start of the allocated string buffer is really (SvPVX - SvIVX).
-
- int SvOOK(SV* sv)
-
-=item SvPOK
-
-Returns a boolean indicating whether the SV contains a character string.
-
- int SvPOK (SV* SV)
-
-=item SvPOK_off
-
-Unsets the PV status of an SV.
-
- void SvPOK_off (SV* sv)
-
-=item SvPOK_on
-
-Tells an SV that it is a string.
-
- void SvPOK_on (SV* sv)
-
-=item SvPOK_only
-
-Tells an SV that it is a string and disables all other OK bits.
-
- void SvPOK_only (SV* sv)
-
-=item SvPOKp
-
-Returns a boolean indicating whether the SV contains a character string.
-Checks the B<private> setting. Use C<SvPOK>.
-
- int SvPOKp (SV* SV)
-
-=item SvPV
-
-Returns a pointer to the string in the SV, or a stringified form of the SV
-if the SV does not contain a string. Handles 'get' magic.
-
- char* SvPV (SV* sv, STRLEN len)
-
-=item SvPV_force
-
-Like <SvPV> but will force the SV into becoming a string (SvPOK). You
-want force if you are going to update the SvPVX directly.
-
- char* SvPV_force(SV* sv, STRLEN len)
-
-=item SvPVX
-
-Returns a pointer to the string in the SV. The SV must contain a string.
-
- char* SvPVX (SV* sv)
-
-=item SvREFCNT
-
-Returns the value of the object's reference count.
-
- int SvREFCNT (SV* sv)
-
-=item SvREFCNT_dec
-
-Decrements the reference count of the given SV.
-
- void SvREFCNT_dec (SV* sv)
-
-=item SvREFCNT_inc
-
-Increments the reference count of the given SV.
-
- void SvREFCNT_inc (SV* sv)
-
-=item SvROK
-
-Tests if the SV is an RV.
-
- int SvROK (SV* sv)
-
-=item SvROK_off
-
-Unsets the RV status of an SV.
-
- void SvROK_off (SV* sv)
-
-=item SvROK_on
-
-Tells an SV that it is an RV.
-
- void SvROK_on (SV* sv)
-
-=item SvRV
-
-Dereferences an RV to return the SV.
-
- SV* SvRV (SV* sv)
-
-=item SvSETMAGIC
-
-Invokes C<mg_set> on an SV if it has 'set' magic. This macro evaluates
-its argument more than once.
-
- void SvSETMAGIC( SV *sv )
-
-=item sv_setiv
-
-Copies an integer into the given SV. Does not handle 'set' magic.
-See C<sv_setiv_mg>.
-
- void sv_setiv (SV* sv, IV num)
-
-=item sv_setiv_mg
-
-Like C<sv_setiv>, but also handles 'set' magic.
-
- void sv_setiv_mg (SV* sv, IV num)
-
-=item sv_setnv
-
-Copies a double into the given SV. Does not handle 'set' magic.
-See C<sv_setnv_mg>.
-
- void sv_setnv (SV* sv, double num)
-
-=item sv_setnv_mg
-
-Like C<sv_setnv>, but also handles 'set' magic.
-
- void sv_setnv_mg (SV* sv, double num)
-
-=item sv_setpv
-
-Copies a string into an SV. The string must be null-terminated.
-Does not handle 'set' magic. See C<sv_setpv_mg>.
-
- void sv_setpv (SV* sv, const char* ptr)
-
-=item sv_setpv_mg
-
-Like C<sv_setpv>, but also handles 'set' magic.
-
- void sv_setpv_mg (SV* sv, const char* ptr)
-
-=item sv_setpviv
-
-Copies an integer into the given SV, also updating its string value.
-Does not handle 'set' magic. See C<sv_setpviv_mg>.
-
- void sv_setpviv (SV* sv, IV num)
-
-=item sv_setpviv_mg
-
-Like C<sv_setpviv>, but also handles 'set' magic.
-
- void sv_setpviv_mg (SV* sv, IV num)
-
-=item sv_setpvn
-
-Copies a string into an SV. The C<len> parameter indicates the number of
-bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
-
- void sv_setpvn (SV* sv, const char* ptr, STRLEN len)
-
-=item sv_setpvn_mg
-
-Like C<sv_setpvn>, but also handles 'set' magic.
-
- void sv_setpvn_mg (SV* sv, const char* ptr, STRLEN len)
-
-=item sv_setpvf
-
-Processes its arguments like C<sprintf> and sets an SV to the formatted
-output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
-
- void sv_setpvf (SV* sv, const char* pat, ...)
-
-=item sv_setpvf_mg
-
-Like C<sv_setpvf>, but also handles 'set' magic.
-
- void sv_setpvf_mg (SV* sv, const char* pat, ...)
-
-=item sv_setref_iv
-
-Copies an integer into a new SV, optionally blessing the SV. The C<rv>
-argument will be upgraded to an RV. That RV will be modified to point to
-the new SV. The C<classname> argument indicates the package for the
-blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
-will be returned and will have a reference count of 1.
-
- SV* sv_setref_iv (SV *rv, char *classname, IV iv)
-
-=item sv_setref_nv
-
-Copies a double into a new SV, optionally blessing the SV. The C<rv>
-argument will be upgraded to an RV. That RV will be modified to point to
-the new SV. The C<classname> argument indicates the package for the
-blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
-will be returned and will have a reference count of 1.
-
- SV* sv_setref_nv (SV *rv, char *classname, double nv)
-
-=item sv_setref_pv
-
-Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
-argument will be upgraded to an RV. That RV will be modified to point to
-the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
-into the SV. The C<classname> argument indicates the package for the
-blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
-will be returned and will have a reference count of 1.
-
- SV* sv_setref_pv (SV *rv, char *classname, void* pv)
-
-Do not use with integral Perl types such as HV, AV, SV, CV, because those
-objects will become corrupted by the pointer copy process.
-
-Note that C<sv_setref_pvn> copies the string while this copies the pointer.
-
-=item sv_setref_pvn
-
-Copies a string into a new SV, optionally blessing the SV. The length of the
-string must be specified with C<n>. The C<rv> argument will be upgraded to
-an RV. That RV will be modified to point to the new SV. The C<classname>
-argument indicates the package for the blessing. Set C<classname> to
-C<Nullch> to avoid the blessing. The new SV will be returned and will have
-a reference count of 1.
-
- SV* sv_setref_pvn (SV *rv, char *classname, char* pv, I32 n)
-
-Note that C<sv_setref_pv> copies the pointer while this copies the string.
-
-=item SvSetSV
-
-Calls C<sv_setsv> if dsv is not the same as ssv. May evaluate arguments
-more than once.
-
- void SvSetSV (SV* dsv, SV* ssv)
-
-=item SvSetSV_nosteal
-
-Calls a non-destructive version of C<sv_setsv> if dsv is not the same as ssv.
-May evaluate arguments more than once.
-
- void SvSetSV_nosteal (SV* dsv, SV* ssv)
-
-=item sv_setsv
-
-Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
-The source SV may be destroyed if it is mortal. Does not handle 'set' magic.
-See the macro forms C<SvSetSV>, C<SvSetSV_nosteal> and C<sv_setsv_mg>.
-
- void sv_setsv (SV* dsv, SV* ssv)
-
-=item sv_setsv_mg
-
-Like C<sv_setsv>, but also handles 'set' magic.
-
- void sv_setsv_mg (SV* dsv, SV* ssv)
-
-=item sv_setuv
-
-Copies an unsigned integer into the given SV. Does not handle 'set' magic.
-See C<sv_setuv_mg>.
-
- void sv_setuv (SV* sv, UV num)
-
-=item sv_setuv_mg
-
-Like C<sv_setuv>, but also handles 'set' magic.
-
- void sv_setuv_mg (SV* sv, UV num)
-
-=item SvSTASH
-
-Returns the stash of the SV.
-
- HV* SvSTASH (SV* sv)
-
-=item SvTAINT
-
-Taints an SV if tainting is enabled
-
- void SvTAINT (SV* sv)
-
-=item SvTAINTED
-
-Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if not.
-
- int SvTAINTED (SV* sv)
-
-=item SvTAINTED_off
-
-Untaints an SV. Be I<very> careful with this routine, as it short-circuits
-some of Perl's fundamental security features. XS module authors should
-not use this function unless they fully understand all the implications
-of unconditionally untainting the value. Untainting should be done in
-the standard perl fashion, via a carefully crafted regexp, rather than
-directly untainting variables.
-
- void SvTAINTED_off (SV* sv)
-
-=item SvTAINTED_on
-
-Marks an SV as tainted.
-
- void SvTAINTED_on (SV* sv)
-
-=item SVt_IV
-
-Integer type flag for scalars. See C<svtype>.
-
-=item SVt_PV
-
-Pointer type flag for scalars. See C<svtype>.
-
-=item SVt_PVAV
-
-Type flag for arrays. See C<svtype>.
-
-=item SVt_PVCV
-
-Type flag for code refs. See C<svtype>.
-
-=item SVt_PVHV
-
-Type flag for hashes. See C<svtype>.
-
-=item SVt_PVMG
-
-Type flag for blessed scalars. See C<svtype>.
-
-=item SVt_NV
-
-Double type flag for scalars. See C<svtype>.
-
-=item SvTRUE
-
-Returns a boolean indicating whether Perl would evaluate the SV as true or
-false, defined or undefined. Does not handle 'get' magic.
-
- int SvTRUE (SV* sv)
-
-=item SvTYPE
-
-Returns the type of the SV. See C<svtype>.
-
- svtype SvTYPE (SV* sv)
-
-=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.
-
-=item PL_sv_undef
-
-This is the C<undef> SV. Always refer to this as C<&PL_sv_undef>.
-
-=item sv_unref
-
-Unsets the RV status of the SV, and decrements the reference count of
-whatever was being referenced by the RV. This can almost be thought of
-as a reversal of C<newSVrv>. See C<SvROK_off>.
-
- void sv_unref (SV* sv)
-
-=item SvUPGRADE
-
-Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to perform
-the upgrade if necessary. See C<svtype>.
-
- bool SvUPGRADE (SV* sv, svtype mt)
-
-=item sv_upgrade
-
-Upgrade an SV to a more complex form. Use C<SvUPGRADE>. See C<svtype>.
-
-=item sv_usepvn
-
-Tells an SV to use C<ptr> to find its string value. Normally the string is
-stored inside the SV but sv_usepvn allows the SV to use an outside string.
-The C<ptr> should point to memory that was allocated by C<malloc>. The
-string length, C<len>, must be supplied. This function will realloc the
-memory pointed to by C<ptr>, so that pointer should not be freed or used by
-the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
-See C<sv_usepvn_mg>.
-
- void sv_usepvn (SV* sv, char* ptr, STRLEN len)
-
-=item sv_usepvn_mg
-
-Like C<sv_usepvn>, but also handles 'set' magic.
-
- void sv_usepvn_mg (SV* sv, char* ptr, STRLEN len)
-
-=item sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale)
-
-Processes its arguments like C<vsprintf> and appends the formatted output
-to an SV. Uses an array of SVs if the C style variable argument list is
-missing (NULL). Indicates if locale information has been used for formatting.
-
- void sv_catpvfn _((SV* sv, const char* pat, STRLEN patlen,
- va_list *args, SV **svargs, I32 svmax,
- bool *used_locale));
-
-=item sv_vsetpvfn(sv, pat, patlen, args, svargs, svmax, used_locale)
-
-Works like C<vcatpvfn> but copies the text into the SV instead of
-appending it.
-
- void sv_setpvfn _((SV* sv, const char* pat, STRLEN patlen,
- va_list *args, SV **svargs, I32 svmax,
- bool *used_locale));
-
-=item SvUV
-
-Coerces the given SV to an unsigned integer and returns it.
-
- UV SvUV(SV* sv)
-
-=item SvUVX
-
-Returns the unsigned integer which is stored in the SV, assuming SvIOK is true.
-
- UV SvUVX(SV* sv)
-
-=item PL_sv_yes
-
-This is the C<true> SV. See C<PL_sv_no>. Always refer to this as C<&PL_sv_yes>.
-
-=item THIS
-
-Variable which is setup by C<xsubpp> to designate the object in a C++ XSUB.
-This is always the proper type for the C++ object. See C<CLASS> and
-L<perlxs/"Using XS With C++">.
-
-=item toLOWER
-
-Converts the specified character to lowercase.
-
- int toLOWER (char c)
-
-=item toUPPER
-
-Converts the specified character to uppercase.
-
- int toUPPER (char c)
-
-=item warn
-
-This is the XSUB-writer's interface to Perl's C<warn> function. Use this
-function the same way you use the C C<printf> function. See C<croak()>.
-
-=item XPUSHi
-
-Push an integer onto the stack, extending the stack if necessary. Handles
-'set' magic. See C<PUSHi>.
-
- XPUSHi(int d)
-
-=item XPUSHn
-
-Push a double onto the stack, extending the stack if necessary. Handles 'set'
-magic. See C<PUSHn>.
-
- XPUSHn(double d)
-
-=item XPUSHp
-
-Push a string onto the stack, extending the stack if necessary. The C<len>
-indicates the length of the string. Handles 'set' magic. See C<PUSHp>.
-
- XPUSHp(char *c, int len)
-
-=item XPUSHs
-
-Push an SV onto the stack, extending the stack if necessary. Does not
-handle 'set' magic. See C<PUSHs>.
-
- XPUSHs(sv)
-
-=item XPUSHu
-
-Push an unsigned integer onto the stack, extending the stack if
-necessary. See C<PUSHu>.
-
-=item XS
-
-Macro to declare an XSUB and its C parameter list. This is handled by
-C<xsubpp>.
-
-=item XSRETURN
-
-Return from XSUB, indicating number of items on the stack. This is usually
-handled by C<xsubpp>.
-
- XSRETURN(int x)
-
-=item XSRETURN_EMPTY
-
-Return an empty list from an XSUB immediately.
-
- XSRETURN_EMPTY;
-
-=item XSRETURN_IV
-
-Return an integer from an XSUB immediately. Uses C<XST_mIV>.
-
- XSRETURN_IV(IV v)
-
-=item XSRETURN_NO
-
-Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
-
- XSRETURN_NO;
-
-=item XSRETURN_NV
-
-Return an double from an XSUB immediately. Uses C<XST_mNV>.
-
- XSRETURN_NV(NV v)
-
-=item XSRETURN_PV
-
-Return a copy of a string from an XSUB immediately. Uses C<XST_mPV>.
-
- XSRETURN_PV(char *v)
-
-=item XSRETURN_UNDEF
-
-Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
-
- XSRETURN_UNDEF;
-
-=item XSRETURN_YES
-
-Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
-
- XSRETURN_YES;
-
-=item XST_mIV
-
-Place an integer into the specified position C<i> on the stack. The value is
-stored in a new mortal SV.
-
- XST_mIV( int i, IV v )
-
-=item XST_mNV
-
-Place a double into the specified position C<i> on the stack. The value is
-stored in a new mortal SV.
-
- XST_mNV( int i, NV v )
-
-=item XST_mNO
-
-Place C<&PL_sv_no> into the specified position C<i> on the stack.
-
- XST_mNO( int i )
-
-=item XST_mPV
-
-Place a copy of a string into the specified position C<i> on the stack. The
-value is stored in a new mortal SV.
-
- XST_mPV( int i, char *v )
-
-=item XST_mUNDEF
-
-Place C<&PL_sv_undef> into the specified position C<i> on the stack.
-
- XST_mUNDEF( int i )
-
-=item XST_mYES
-
-Place C<&PL_sv_yes> into the specified position C<i> on the stack.
-
- XST_mYES( int i )
-
-=item XS_VERSION
-
-The version identifier for an XS module. This is usually handled
-automatically by C<ExtUtils::MakeMaker>. See C<XS_VERSION_BOOTCHECK>.
-
-=item XS_VERSION_BOOTCHECK
-
-Macro to verify that a PM module's $VERSION variable matches the XS module's
-C<XS_VERSION> variable. This is usually handled automatically by
-C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
-
-=item Zero
-
-The XSUB-writer's interface to the C C<memzero> function. The C<d> is the
-destination, C<n> is the number of items, and C<t> is the type.
-
- void Zero( d, n, t )
-
-=back
+This allows the ability to provide an extra pointer (called the "host"
+environment) for all the system calls. This makes it possible for
+all the system stuff to maintain their own state, broken down into
+seven C structures. These are thin wrappers around the usual system
+calls (see win32/perllib.c) for the default perl executable, but for a
+more ambitious host (like the one that would do fork() emulation) all
+the extra work needed to pretend that different interpreters are
+actually different "processes", would be done here.
+
+The Perl engine/interpreter and the host are orthogonal entities.
+There could be one or more interpreters in a process, and one or
+more "hosts", with free association between them.
=head1 AUTHORS
Until May 1997, this document was maintained by Jeff Okamoto
-<okamoto@corp.hp.com>. It is now maintained as part of Perl itself.
+<okamoto@corp.hp.com>. It is now maintained as part of Perl itself
+by the Perl 5 Porters <perl5-porters@perl.org>.
With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
@@ -3594,3 +1794,10 @@ Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
Stephen McCamant, and Gurusamy Sarathy.
API Listing originally by Dean Roehrich <roehrich@cray.com>.
+
+Modifications to autogenerate the API listing (L<perlapi>) by Benjamin
+Stuhl.
+
+=head1 SEE ALSO
+
+perlapi(1), perlintern(1), perlxs(1), perlembed(1)
diff --git a/contrib/perl5/pod/perlhack.pod b/contrib/perl5/pod/perlhack.pod
new file mode 100644
index 0000000..c640870
--- /dev/null
+++ b/contrib/perl5/pod/perlhack.pod
@@ -0,0 +1,292 @@
+=head1 NAME
+
+perlhack - How to hack at the Perl internals
+
+=head1 DESCRIPTION
+
+This document attempts to explain how Perl development takes place,
+and ends with some suggestions for people wanting to become bona fide
+porters.
+
+The perl5-porters mailing list is where the Perl standard distribution
+is maintained and developed. The list can get anywhere from 10 to 150
+messages a day, depending on the heatedness of the debate. Most days
+there are two or three patches, extensions, features, or bugs being
+discussed at a time.
+
+A searchable archive of the list is at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+
+The list is also archived under the usenet group name
+C<perl.porters-gw> at:
+
+ http://www.deja.com/
+
+List subscribers (the porters themselves) come in several flavours.
+Some are quiet curious lurkers, who rarely pitch in and instead watch
+the ongoing development to ensure they're forewarned of new changes or
+features in Perl. Some are representatives of vendors, who are there
+to make sure that Perl continues to compile and work on their
+platforms. Some patch any reported bug that they know how to fix,
+some are actively patching their pet area (threads, Win32, the regexp
+engine), while others seem to do nothing but complain. In other
+words, it's your usual mix of technical people.
+
+Over this group of porters presides Larry Wall. He has the final word
+in what does and does not change in the Perl language. Various
+releases of Perl are shepherded by a ``pumpking'', a porter
+responsible for gathering patches, deciding on a patch-by-patch
+feature-by-feature basis what will and will not go into the release.
+For instance, Gurusamy Sarathy is the pumpking for the 5.6 release of
+Perl.
+
+In addition, various people are pumpkings for different things. For
+instance, Andy Dougherty and Jarkko Hietaniemi share the I<Configure>
+pumpkin, and Tom Christiansen is the documentation pumpking.
+
+Larry sees Perl development along the lines of the US government:
+there's the Legislature (the porters), the Executive branch (the
+pumpkings), and the Supreme Court (Larry). The legislature can
+discuss and submit patches to the executive branch all they like, but
+the executive branch is free to veto them. Rarely, the Supreme Court
+will side with the executive branch over the legislature, or the
+legislature over the executive branch. Mostly, however, the
+legislature and the executive branch are supposed to get along and
+work out their differences without impeachment or court cases.
+
+You might sometimes see reference to Rule 1 and Rule 2. Larry's power
+as Supreme Court is expressed in The Rules:
+
+=over 4
+
+=item 1
+
+Larry is always by definition right about how Perl should behave.
+This means he has final veto power on the core functionality.
+
+=item 2
+
+Larry is allowed to change his mind about any matter at a later date,
+regardless of whether he previously invoked Rule 1.
+
+=back
+
+Got that? Larry is always right, even when he was wrong. It's rare
+to see either Rule exercised, but they are often alluded to.
+
+New features and extensions to the language are contentious, because
+the criteria used by the pumpkings, Larry, and other porters to decide
+which features should be implemented and incorporated are not codified
+in a few small design goals as with some other languages. Instead,
+the heuristics are flexible and often difficult to fathom. Here is
+one person's list, roughly in decreasing order of importance, of
+heuristics that new features have to be weighed against:
+
+=over 4
+
+=item Does concept match the general goals of Perl?
+
+These haven't been written anywhere in stone, but one approximation
+is:
+
+ 1. Keep it fast, simple, and useful.
+ 2. Keep features/concepts as orthogonal as possible.
+ 3. No arbitrary limits (platforms, data sizes, cultures).
+ 4. Keep it open and exciting to use/patch/advocate Perl everywhere.
+ 5. Either assimilate new technologies, or build bridges to them.
+
+=item Where is the implementation?
+
+All the talk in the world is useless without an implementation. In
+almost every case, the person or people who argue for a new feature
+will be expected to be the ones who implement it. Porters capable
+of coding new features have their own agendas, and are not available
+to implement your (possibly good) idea.
+
+=item Backwards compatibility
+
+It's a cardinal sin to break existing Perl programs. New warnings are
+contentious--some say that a program that emits warnings is not
+broken, while others say it is. Adding keywords has the potential to
+break programs, changing the meaning of existing token sequences or
+functions might break programs.
+
+=item Could it be a module instead?
+
+Perl 5 has extension mechanisms, modules and XS, specifically to avoid
+the need to keep changing the Perl interpreter. You can write modules
+that export functions, you can give those functions prototypes so they
+can be called like built-in functions, you can even write XS code to
+mess with the runtime data structures of the Perl interpreter if you
+want to implement really complicated things. If it can be done in a
+module instead of in the core, it's highly unlikely to be added.
+
+=item Is the feature generic enough?
+
+Is this something that only the submitter wants added to the language,
+or would it be broadly useful? Sometimes, instead of adding a feature
+with a tight focus, the porters might decide to wait until someone
+implements the more generalized feature. For instance, instead of
+implementing a ``delayed evaluation'' feature, the porters are waiting
+for a macro system that would permit delayed evaluation and much more.
+
+=item Does it potentially introduce new bugs?
+
+Radical rewrites of large chunks of the Perl interpreter have the
+potential to introduce new bugs. The smaller and more localized the
+change, the better.
+
+=item Does it preclude other desirable features?
+
+A patch is likely to be rejected if it closes off future avenues of
+development. For instance, a patch that placed a true and final
+interpretation on prototypes is likely to be rejected because there
+are still options for the future of prototypes that haven't been
+addressed.
+
+=item Is the implementation robust?
+
+Good patches (tight code, complete, correct) stand more chance of
+going in. Sloppy or incorrect patches might be placed on the back
+burner until the pumpking has time to fix, or might be discarded
+altogether without further notice.
+
+=item Is the implementation generic enough to be portable?
+
+The worst patches make use of a system-specific features. It's highly
+unlikely that nonportable additions to the Perl language will be
+accepted.
+
+=item Is there enough documentation?
+
+Patches without documentation are probably ill-thought out or
+incomplete. Nothing can be added without documentation, so submitting
+a patch for the appropriate manpages as well as the source code is
+always a good idea. If appropriate, patches should add to the test
+suite as well.
+
+=item Is there another way to do it?
+
+Larry said ``Although the Perl Slogan is I<There's More Than One Way
+to Do It>, I hesitate to make 10 ways to do something''. This is a
+tricky heuristic to navigate, though--one man's essential addition is
+another man's pointless cruft.
+
+=item Does it create too much work?
+
+Work for the pumpking, work for Perl programmers, work for module
+authors, ... Perl is supposed to be easy.
+
+=item Patches speak louder than words
+
+Working code is always preferred to pie-in-the-sky ideas. A patch to
+add a feature stands a much higher chance of making it to the language
+than does a random feature request, no matter how fervently argued the
+request might be. This ties into ``Will it be useful?'', as the fact
+that someone took the time to make the patch demonstrates a strong
+desire for the feature.
+
+=back
+
+If you're on the list, you might hear the word ``core'' bandied
+around. It refers to the standard distribution. ``Hacking on the
+core'' means you're changing the C source code to the Perl
+interpreter. ``A core module'' is one that ships with Perl.
+
+The source code to the Perl interpreter, in its different versions, is
+kept in a repository managed by a revision control system (which is
+currently the Perforce program, see http://perforce.com/). The
+pumpkings and a few others have access to the repository to check in
+changes. Periodically the pumpking for the development version of Perl
+will release a new version, so the rest of the porters can see what's
+changed. The current state of the main trunk of repository, and patches
+that describe the individual changes that have happened since the last
+public release are available at this location:
+
+ ftp://ftp.linux.activestate.com/pub/staff/gsar/APC/
+
+Selective parts are also visible via the rsync protocol. To get all
+the individual changes to the mainline since the last development
+release, use the following command:
+
+ rsync -avuz rsync://ftp.linux.activestate.com/perl-diffs perl-diffs
+
+Use this to get the latest source tree in full:
+
+ rsync -avuz rsync://ftp.linux.activestate.com/perl-current perl-current
+
+Needless to say, the source code in perl-current is usually in a perpetual
+state of evolution. You should expect it to be very buggy. Do B<not> use
+it for any purpose other than testing and development.
+
+Always submit patches to I<perl5-porters@perl.org>. This lets other
+porters review your patch, which catches a surprising number of errors
+in patches. Either use the diff program (available in source code
+form from I<ftp://ftp.gnu.org/pub/gnu/>), or use Johan Vromans'
+I<makepatch> (available from I<CPAN/authors/id/JV/>). Unified diffs
+are preferred, but context diffs are accepted. Do not send RCS-style
+diffs or diffs without context lines. More information is given in
+the I<Porting/patching.pod> file in the Perl source distribution.
+Please patch against the latest B<development> version (e.g., if
+you're fixing a bug in the 5.005 track, patch against the latest
+5.005_5x version). Only patches that survive the heat of the
+development branch get applied to maintenance versions.
+
+Your patch should update the documentation and test suite.
+
+To report a bug in Perl, use the program I<perlbug> which comes with
+Perl (if you can't get Perl to work, send mail to the address
+I<perlbug@perl.com> or I<perlbug@perl.org>). Reporting bugs through
+I<perlbug> feeds into the automated bug-tracking system, access to
+which is provided through the web at I<http://bugs.perl.org/>. It
+often pays to check the archives of the perl5-porters mailing list to
+see whether the bug you're reporting has been reported before, and if
+so whether it was considered a bug. See above for the location of
+the searchable archives.
+
+The CPAN testers (I<http://testers.cpan.org/>) are a group of
+volunteers who test CPAN modules on a variety of platforms. Perl Labs
+(I<http://labs.perl.org/>) automatically tests Perl source releases on
+platforms and gives feedback to the CPAN testers mailing list. Both
+efforts welcome volunteers.
+
+To become an active and patching Perl porter, you'll need to learn how
+Perl works on the inside. Chip Salzenberg, a pumpking, has written
+articles on Perl internals for The Perl Journal
+(I<http://www.tpj.com/>) which explain how various parts of the Perl
+interpreter work. The C<perlguts> manpage explains the internal data
+structures. And, of course, the C source code (sometimes sparsely
+commented, sometimes commented well) is a great place to start (begin
+with C<perl.c> and see where it goes from there). A lot of the style
+of the Perl source is explained in the I<Porting/pumpkin.pod> file in
+the source distribution.
+
+It is essential that you be comfortable using a good debugger
+(e.g. gdb, dbx) before you can patch perl. Stepping through perl
+as it executes a script is perhaps the best (if sometimes tedious)
+way to gain a precise understanding of the overall architecture of
+the language.
+
+If you build a version of the Perl interpreter with C<-DDEBUGGING>,
+Perl's B<-D> command line flag will cause copious debugging information
+to be emitted (see the C<perlrun> manpage). If you build a version of
+Perl with compiler debugging information (e.g. with the C compiler's
+C<-g> option instead of C<-O>) then you can step through the execution
+of the interpreter with your favourite C symbolic debugger, setting
+breakpoints on particular functions.
+
+It's a good idea to read and lurk for a while before chipping in.
+That way you'll get to see the dynamic of the conversations, learn the
+personalities of the players, and hopefully be better prepared to make
+a useful contribution when do you speak up.
+
+If after all this you still think you want to join the perl5-porters
+mailing list, send mail to I<perl5-porters-subscribe@perl.org>. To
+unsubscribe, send mail to I<perl5-porters-unsubscribe@perl.org>.
+
+=head1 AUTHOR
+
+This document was written by Nathan Torkington, and is maintained by
+the perl5-porters mailing list.
+
diff --git a/contrib/perl5/pod/perlhist.pod b/contrib/perl5/pod/perlhist.pod
index 5828ea4..4311ee2 100644
--- a/contrib/perl5/pod/perlhist.pod
+++ b/contrib/perl5/pod/perlhist.pod
@@ -4,10 +4,12 @@
perlhist - the Perl history records
+=for RCS
+
=begin RCS
#
-# $Id: perlhist.pod,v 1.57 1999/01/26 17:38:07 jhi Exp $
+# $Id: perlhist.pod,v 1.2 2000/01/24 11:44:47 jhi Exp $
#
=end RCS
@@ -117,16 +119,16 @@ the strings?).
5.000alpha4 1993-???-??
5.000alpha5 1993-???-??
5.000alpha6 1994-Mar-18
- 5.003alpha7 1994-Mar-25
+ 5.000alpha7 1994-Mar-25
Andy 5.000alpha8 1994-Apr-04
Larry 5.000alpha9 1994-May-05 ext appears.
- 5.000alpha10 1994-???-??
- 5.000alpha11 1994-???-??
+ 5.000alpha10 1994-Jun-11
+ 5.000alpha11 1994-Jul-01
Andy 5.000a11a 1994-Jul-07 To fit 14.
5.000a11b 1994-Jul-14
5.000a11c 1994-Jul-19
5.000a11d 1994-Jul-22
- Larry 5.000alpha12 1994-???-??
+ Larry 5.000alpha12 1994-Aug-04
Andy 5.000a12a 1994-Aug-08
5.000a12b 1994-Aug-15
5.000a12c 1994-Aug-22
@@ -135,8 +137,8 @@ the strings?).
5.000a12f 1994-Aug-24
5.000a12g 1994-Aug-24
5.000a12h 1994-Aug-24
- Larry 5.000beta1 1994-???-??
- Andy 5.000b1a 1994-???-??
+ Larry 5.000beta1 1994-Aug-30
+ Andy 5.000b1a 1994-Sep-06
Larry 5.000beta2 1994-Sep-14 Core slushified.
Andy 5.000b2a 1994-Sep-14
5.000b2b 1994-Sep-17
@@ -150,8 +152,9 @@ the strings?).
5.000b3f 1994-Sep-30
5.000b3g 1994-Oct-04
Andy 5.000b3h 1994-Oct-07
+ Larry? 5.000gamma 1994-Oct-13?
- Larry 5.000 1994-Oct-18
+ Larry 5.000 1994-Oct-17
Andy 5.000a 1994-Dec-19
5.000b 1995-Jan-18
@@ -165,8 +168,9 @@ the strings?).
5.000j 1995-Feb-07
5.000k 1995-Feb-11
5.000l 1995-Feb-21
- 5.000m 1995-???-??
+ 5.000m 1995-Feb-28
5.000n 1995-Mar-07
+ 5.000o 1995-Mar-13?
Larry 5.001 1995-Mar-13
@@ -185,7 +189,7 @@ the strings?).
5.001m 1995-Jul-02 Very stable.
5.001n 1995-Oct-31 Very unstable.
5.002beta1 1995-Nov-21
- 5.002b1a 1995-Nov-??
+ 5.002b1a 1995-Dec-04
5.002b1b 1995-Dec-04
5.002b1c 1995-Dec-04
5.002b1d 1995-Dec-04
@@ -270,7 +274,8 @@ the strings?).
5.004_04-MT6 1998-Oct-09
5.004_04-MT7 1998-Nov-22
5.004_04-MT8 1998-Dec-03
- 5.004_04-MT9 1999-***-**
+ Chip 5.004_04-MT9 1999-Apr-26
+ 5.004_05 1999-Apr-29
Malcolm 5.004_50 1997-Sep-09 The 5.005 development track.
5.004_51 1997-Oct-02
@@ -310,16 +315,31 @@ the strings?).
5.005_03-MT3 1999-Jan-17
5.005_03-MT4 1999-Jan-26
5.005_03-MT5 1999-Jan-28
- 5.005_03-MT6 1999-Mar-04
5.005_03 1999-Mar-28
+ Chip 5.005_04 2000-***-**
- Sarathy 5.005_50 1998-Jul-26 The 5.006 development track.
+ Sarathy 5.005_50 1998-Jul-26 The 5.6 development track.
5.005_51 1998-Aug-10
5.005_52 1998-Sep-25
5.005_53 1998-Oct-31
5.005_54 1998-Nov-30
5.005_55 1999-Feb-16
5.005_56 1999-Mar-01
+ 5.005_57 1999-May-25
+ 5.005_58 1999-Jul-27
+ 5.005_59 1999-Aug-02
+ 5.005_60 1999-Aug-02
+ 5.005_61 1999-Aug-20
+ 5.005_62 1999-Oct-15
+ 5.005_63 1999-Dec-09
+ 5.5.640 2000-Feb-02
+ 5.5.650 2000-Feb-08 beta1
+ 5.5.660 2000-Feb-22 beta2
+ 5.5.670 2000-Feb-29 beta3
+ 5.6.0-RC1 2000-Mar-09 release candidate 1
+ 5.6.0-RC2 2000-Mar-14 release candidate 2
+ 5.6.0-RC3 2000-Mar-21 release candidate 3
+ 5.6.0 2000-Mar-22
=head2 SELECTED RELEASE SIZES
@@ -352,6 +372,7 @@ explained below.
5.004 1351 60 1230 136 408 51 355 161 1587 55
5.004_01 1356 60 1258 138 410 51 358 161 1587 55
5.004_04 1375 60 1294 139 413 51 394 162 1629 55
+ 5.004_05 1463 60 1435 150 394 50 445 175 1855 59
5.004_51 1401 61 1260 140 413 53 358 162 1594 56
5.004_53 1422 62 1295 141 438 70 394 162 1637 56
5.004_56 1501 66 1301 140 447 74 408 165 1648 57
@@ -363,6 +384,10 @@ explained below.
5.004_73 1874 76 1467 152 762 102 506 196 1883 61
5.004_75 1877 76 1467 152 770 103 508 196 1896 62
5.005 1896 76 1469 152 795 103 509 197 1945 63
+ 5.005_03 1936 77 1541 153 813 104 551 201 2176 72
+ 5.005_50 1969 78 1842 301 795 103 514 198 1948 63
+ 5.005_53 1999 79 1885 303 806 104 602 224 2002 67
+ 5.005_56 2086 79 1970 307 866 113 672 238 2221 75
The "core"..."doc" mean the following files from the Perl source code
distribution. The glob notation ** means recursively, (.) means
@@ -439,25 +464,28 @@ the Perl source distribution for somewhat more selected releases.
======================================================================
- 5.004_70 5.004_73 5.004_75 5.005
-
- beos 1 1 1 1 1 1 1 1
- Configure 256 1 256 1 264 1 264 1
- cygwin32 24 5 24 5 24 5 24 5
- djgpp 14 5 14 5 14 5 14 5
- eg 86 65 86 65 86 65 86 65
- emacs 262 2 262 2 262 2 262 2
- h2pl 12 12 12 12 12 12 12 12
- hints 157 74 157 74 159 74 160 74
- mpeix - - - - 5 3 5 3
- os2 129 44 139 44 142 44 143 44
- plan9 82 15 82 15 82 15 82 15
- Porting 241 9 253 9 259 10 264 12
- qnx 1 2 1 2 1 2 1 2
- utils 160 9 160 9 160 9 160 9
- vms 570 34 572 34 573 34 575 34
- win32 577 41 585 41 585 41 587 41
- x2p 281 19 281 19 281 19 281 19
+ 5.004_70 5.004_73 5.004_75 5.005 5.005_03
+
+ apollo - - - - - - - - 0 1
+ beos 1 1 1 1 1 1 1 1 1 1
+ Configure 256 1 256 1 264 1 264 1 270 1
+ cygwin32 24 5 24 5 24 5 24 5 24 5
+ djgpp 14 5 14 5 14 5 14 5 15 5
+ eg 86 65 86 65 86 65 86 65 86 65
+ emacs 262 2 262 2 262 2 262 2 274 2
+ h2pl 12 12 12 12 12 12 12 12 12 12
+ hints 157 74 157 74 159 74 160 74 179 77
+ mint - - - - - - - - 4 7
+ mpeix - - - - 5 3 5 3 5 3
+ os2 129 44 139 44 142 44 143 44 148 44
+ plan9 82 15 82 15 82 15 82 15 82 15
+ Porting 241 9 253 9 259 10 264 12 272 13
+ qnx 1 2 1 2 1 2 1 2 1 2
+ utils 160 9 160 9 160 9 160 9 164 9
+ vms 570 34 572 34 573 34 575 34 583 34
+ vos - - - - - - - - 156 10
+ win32 577 41 585 41 585 41 587 41 600 42
+ x2p 281 19 281 19 281 19 281 19 281 19
=head2 SELECTED PATCH SIZES
@@ -531,7 +559,7 @@ Jarkko Hietaniemi <F<jhi@iki.fi>>.
Thanks to the collective memory of the Perlfolk. In addition to the
Keepers of the Pumpkin also Alan Champion, Andreas König, John
-Macdonald, Matthias Neeracher, Michael Peppler, Randal Schwartz, and
-Paul D. Smith sent corrections and additions.
+Macdonald, Matthias Neeracher, Jeff Okamoto, Michael Peppler,
+Randal Schwartz, and Paul D. Smith sent corrections and additions.
=cut
diff --git a/contrib/perl5/pod/perlintern.pod b/contrib/perl5/pod/perlintern.pod
new file mode 100644
index 0000000..58eeac6
--- /dev/null
+++ b/contrib/perl5/pod/perlintern.pod
@@ -0,0 +1,26 @@
+=head1 NAME
+
+perlintern - autogenerated documentation of purely B<internal>
+ Perl functions
+
+=head1 DESCRIPTION
+
+This file is the autogenerated documentation of functions in the
+Perl intrepreter that are documented using Perl's internal documentation
+format but are not marked as part of the Perl API. In other words,
+B<they are not for use in extensions>!
+
+=over 8
+
+=back
+
+=head1 AUTHORS
+
+The autodocumentation system was orignally added to the Perl core by
+Benjamin Stuhl. Documentation is by whoever was kind enough to
+document their functions.
+
+=head1 SEE ALSO
+
+perlguts(1), perlapi(1)
+
diff --git a/contrib/perl5/pod/perlipc.pod b/contrib/perl5/pod/perlipc.pod
index 2f99d10..8760257 100644
--- a/contrib/perl5/pod/perlipc.pod
+++ b/contrib/perl5/pod/perlipc.pod
@@ -58,7 +58,7 @@ You may also choose to assign the strings C<'IGNORE'> or C<'DEFAULT'> as
the handler, in which case Perl will try to discard the signal or do the
default thing.
-On most UNIX platforms, the C<CHLD> (sometimes also known as C<CLD>) signal
+On most Unix platforms, the C<CHLD> (sometimes also known as C<CLD>) signal
has special behavior with respect to a value of C<'IGNORE'>.
Setting C<$SIG{CHLD}> to C<'IGNORE'> on such a platform has the effect of
not creating zombie processes when the parent process fails to C<wait()>
@@ -126,7 +126,7 @@ or even the more elaborate:
use POSIX ":sys_wait_h";
sub REAPER {
my $child;
- while ($child = waitpid(-1,WNOHANG)) {
+ while (($child = waitpid(-1,WNOHANG)) > 0) {
$Kid_Status{$child} = $?;
}
$SIG{CHLD} = \&REAPER; # still loathe sysV
@@ -152,6 +152,10 @@ Here's an example:
};
if ($@ and $@ !~ /alarm clock restart/) { die }
+If the operation being timed out is system() or qx(), this technique
+is liable to generate zombies. If this matters to you, you'll
+need to do your own fork() and exec(), and kill the errant child process.
+
For more complex signal handling, you might see the standard POSIX
module. Lamentably, this is almost entirely undocumented, but
the F<t/lib/posix.t> file from the Perl source distribution has some
@@ -276,7 +280,7 @@ same effect as opening a pipe for reading:
While this is true on the surface, it's much more efficient to process the
file one line or record at a time because then you don't have to read the
-whole thing into memory at once. It also gives you finer control of the
+whole thing into memory at once. It also gives you finer control of the
whole process, letting you to kill off the child process early if you'd
like.
@@ -307,8 +311,7 @@ To catch it, you could use this:
Both the main process and any child processes it forks share the same
STDIN, STDOUT, and STDERR filehandles. If both processes try to access
-them at once, strange things can happen. You'll certainly want to any
-stdio flush output buffers before forking. You may also want to close
+them at once, strange things can happen. You may also want to close
or reopen the filehandles for the child. You can get around this by
opening your pipe with open(), but on some systems this means that the
child process cannot outlive the parent.
@@ -450,8 +453,8 @@ doesn't actually work:
open(PROG_FOR_READING_AND_WRITING, "| some program |")
-and if you forget to use the B<-w> flag, then you'll miss out
-entirely on the diagnostic message:
+and if you forget to use the C<use warnings> pragma or the B<-w> flag,
+then you'll miss out entirely on the diagnostic message:
Can't do bidirectional pipe at -e line 1.
@@ -473,7 +476,6 @@ Here's an example of using open2():
use FileHandle;
use IPC::Open2;
$pid = open2(*Reader, *Writer, "cat -u -n" );
- Writer->autoflush(); # default here, actually
print Writer "stuff\n";
$got = <Reader>;
@@ -1022,7 +1024,7 @@ something to the server before fetching the server's response.
The web server handing the "http" service, which is assumed to be at
its standard port, number 80. If your the web server you're trying to
connect to is at a different port (like 1080 or 8080), you should specify
-as the named-parameter pair, C<PeerPort =E<gt> 8080>. The C<autoflush>
+as the named-parameter pair, C<< PeerPort => 8080 >>. The C<autoflush>
method is used on the socket because otherwise the system would buffer
up the output we sent it. (If you're on a Mac, you'll also need to
change every C<"\n"> in your code that sends data over the network to
@@ -1140,7 +1142,7 @@ well.
As always, setting up a server is little bit more involved than running a client.
The model is that the server creates a special kind of socket that
does nothing but listen on a particular port for incoming connections.
-It does this by calling the C<IO::Socket::INET-E<gt>new()> method with
+It does this by calling the C<< IO::Socket::INET->new() >> method with
slightly different arguments than the client did.
=over
@@ -1159,7 +1161,7 @@ server. (Under Unix, ports under 1024 are restricted to the
superuser.) In our sample, we'll use port 9000, but you can use
any port that's not currently in use on your system. If you try
to use one already in used, you'll get an "Address already in use"
-message. Under Unix, the C<netstat -a> command will show
+message. Under Unix, the C<netstat -a> command will show
which services current have servers.
=item Listen
@@ -1303,16 +1305,16 @@ you weren't wanting it to.
Here's a small example showing shared memory usage.
- use IPC::SysV qw(IPC_PRIVATE IPC_RMID S_IRWXU S_IRWXG S_IRWXO);
+ use IPC::SysV qw(IPC_PRIVATE IPC_RMID S_IRWXU);
$size = 2000;
- $key = shmget(IPC_PRIVATE, $size, S_IRWXU|S_IRWXG|S_IRWXO) || die "$!";
- print "shm key $key\n";
+ $id = shmget(IPC_PRIVATE, $size, S_IRWXU) || die "$!";
+ print "shm key $id\n";
$message = "Message #1";
- shmwrite($key, $message, 0, 60) || die "$!";
+ shmwrite($id, $message, 0, 60) || die "$!";
print "wrote: '$message'\n";
- shmread($key, $buff, 0, 60) || die "$!";
+ shmread($id, $buff, 0, 60) || die "$!";
print "read : '$buff'\n";
# the buffer of shmread is zero-character end-padded.
@@ -1320,16 +1322,16 @@ Here's a small example showing shared memory usage.
print "un" unless $buff eq $message;
print "swell\n";
- print "deleting shm $key\n";
- shmctl($key, IPC_RMID, 0) || die "$!";
+ print "deleting shm $id\n";
+ shmctl($id, IPC_RMID, 0) || die "$!";
Here's an example of a semaphore:
use IPC::SysV qw(IPC_CREAT);
$IPC_KEY = 1234;
- $key = semget($IPC_KEY, 10, 0666 | IPC_CREAT ) || die "$!";
- print "shm key $key\n";
+ $id = semget($IPC_KEY, 10, 0666 | IPC_CREAT ) || die "$!";
+ print "shm key $id\n";
Put this code in a separate file to be run in more than one process.
Call the file F<take>:
@@ -1337,8 +1339,8 @@ Call the file F<take>:
# create a semaphore
$IPC_KEY = 1234;
- $key = semget($IPC_KEY, 0 , 0 );
- die if !defined($key);
+ $id = semget($IPC_KEY, 0 , 0 );
+ die if !defined($id);
$semnum = 0;
$semflag = 0;
@@ -1346,14 +1348,14 @@ Call the file F<take>:
# 'take' semaphore
# wait for semaphore to be zero
$semop = 0;
- $opstring1 = pack("sss", $semnum, $semop, $semflag);
+ $opstring1 = pack("s!s!s!", $semnum, $semop, $semflag);
# Increment the semaphore count
$semop = 1;
- $opstring2 = pack("sss", $semnum, $semop, $semflag);
+ $opstring2 = pack("s!s!s!", $semnum, $semop, $semflag);
$opstring = $opstring1 . $opstring2;
- semop($key,$opstring) || die "$!";
+ semop($id,$opstring) || die "$!";
Put this code in a separate file to be run in more than one process.
Call this file F<give>:
@@ -1363,22 +1365,53 @@ Call this file F<give>:
# that the second process continues
$IPC_KEY = 1234;
- $key = semget($IPC_KEY, 0, 0);
- die if !defined($key);
+ $id = semget($IPC_KEY, 0, 0);
+ die if !defined($id);
$semnum = 0;
$semflag = 0;
# Decrement the semaphore count
$semop = -1;
- $opstring = pack("sss", $semnum, $semop, $semflag);
+ $opstring = pack("s!s!s!", $semnum, $semop, $semflag);
- semop($key,$opstring) || die "$!";
+ semop($id,$opstring) || die "$!";
The SysV IPC code above was written long ago, and it's definitely
clunky looking. For a more modern look, see the IPC::SysV module
which is included with Perl starting from Perl 5.005.
+A small example demonstrating SysV message queues:
+
+ use IPC::SysV qw(IPC_PRIVATE IPC_RMID IPC_CREAT S_IRWXU);
+
+ my $id = msgget(IPC_PRIVATE, IPC_CREAT | S_IRWXU);
+
+ my $sent = "message";
+ my $type = 1234;
+ my $rcvd;
+ my $type_rcvd;
+
+ if (defined $id) {
+ if (msgsnd($id, pack("l! a*", $type_sent, $sent), 0)) {
+ if (msgrcv($id, $rcvd, 60, 0, 0)) {
+ ($type_rcvd, $rcvd) = unpack("l! a*", $rcvd);
+ if ($rcvd eq $sent) {
+ print "okay\n";
+ } else {
+ print "not okay\n";
+ }
+ } else {
+ die "# msgrcv failed\n";
+ }
+ } else {
+ die "# msgsnd failed\n";
+ }
+ msgctl($id, IPC_RMID, 0) || die "# msgctl failed: $!\n";
+ } else {
+ die "# msgget failed\n";
+ }
+
=head1 NOTES
Most of these routines quietly but politely return C<undef> when they
diff --git a/contrib/perl5/pod/perllexwarn.pod b/contrib/perl5/pod/perllexwarn.pod
new file mode 100644
index 0000000..cee1687
--- /dev/null
+++ b/contrib/perl5/pod/perllexwarn.pod
@@ -0,0 +1,433 @@
+=head1 NAME
+
+perllexwarn - Perl Lexical Warnings
+
+=head1 DESCRIPTION
+
+The C<use warnings> pragma is a replacement for both the command line
+flag B<-w> and the equivalent Perl variable, C<$^W>.
+
+The pragma works just like the existing "strict" pragma.
+This means that the scope of the warning pragma is limited to the
+enclosing block. It also means that that the pragma setting will not
+leak across files (via C<use>, C<require> or C<do>). This allows
+authors to independently define the degree of warning checks that will
+be applied to their module.
+
+By default, optional warnings are disabled, so any legacy code that
+doesn't attempt to control the warnings will work unchanged.
+
+All warnings are enabled in a block by either of these:
+
+ use warnings ;
+ use warnings 'all' ;
+
+Similarly all warnings are disabled in a block by either of these:
+
+ no warnings ;
+ no warnings 'all' ;
+
+For example, consider the code below:
+
+ use warnings ;
+ my $a ;
+ my $b ;
+ {
+ no warnings ;
+ $b = 2 if $a EQ 3 ;
+ }
+ $b = 1 if $a NE 3 ;
+
+The code in the enclosing block has warnings enabled, but the inner
+block has them disabled. In this case that means that the use of the C<EQ>
+operator won't trip a C<"Use of EQ is deprecated"> warning, but the use of
+C<NE> will produce a C<"Use of NE is deprecated"> warning.
+
+=head2 Default Warnings and Optional Warnings
+
+Before the introduction of lexical warnings, Perl had two classes of
+warnings: mandatory and optional.
+
+As its name suggests, if your code tripped a mandatory warning, you
+would get a warning whether you wanted it or not.
+For example, the code below would always produce an C<"isn't numeric">
+warning about the "2:".
+
+ my $a = "2:" + 3;
+
+With the introduction of lexical warnings, mandatory warnings now become
+I<default> warnings. The difference is that although the previously
+mandatory warnings are still enabled by default, they can then be
+subsequently enabled or disabled with the lexical warning pragma. For
+example, in the code below, an C<"isn't numeric"> warning will only
+be reported for the C<$a> variable.
+
+ my $a = "2:" + 3;
+ no warnings ;
+ my $b = "2:" + 3;
+
+Note that neither the B<-w> flag or the C<$^W> can be used to
+disable/enable default warnings. They are still mandatory in this case.
+
+=head2 What's wrong with B<-w> and C<$^W>
+
+Although very useful, the big problem with using B<-w> on the command
+line to enable warnings is that it is all or nothing. Take the typical
+scenario when you are writing a Perl program. Parts of the code you
+will write yourself, but it's very likely that you will make use of
+pre-written Perl modules. If you use the B<-w> flag in this case, you
+end up enabling warnings in pieces of code that you haven't written.
+
+Similarly, using C<$^W> to either disable or enable blocks of code is
+fundamentally flawed. For a start, say you want to disable warnings in
+a block of code. You might expect this to be enough to do the trick:
+
+ {
+ local ($^W) = 0 ;
+ my $a =+ 2 ;
+ my $b ; chop $b ;
+ }
+
+When this code is run with the B<-w> flag, a warning will be produced
+for the C<$a> line -- C<"Reversed += operator">.
+
+The problem is that Perl has both compile-time and run-time warnings. To
+disable compile-time warnings you need to rewrite the code like this:
+
+ {
+ BEGIN { $^W = 0 }
+ my $a =+ 2 ;
+ my $b ; chop $b ;
+ }
+
+The other big problem with C<$^W> is that way you can inadvertently
+change the warning setting in unexpected places in your code. For example,
+when the code below is run (without the B<-w> flag), the second call
+to C<doit> will trip a C<"Use of uninitialized value"> warning, whereas
+the first will not.
+
+ sub doit
+ {
+ my $b ; chop $b ;
+ }
+
+ doit() ;
+
+ {
+ local ($^W) = 1 ;
+ doit()
+ }
+
+This is a side-effect of C<$^W> being dynamically scoped.
+
+Lexical warnings get around these limitations by allowing finer control
+over where warnings can or can't be tripped.
+
+=head2 Controlling Warnings from the Command Line
+
+There are three Command Line flags that can be used to control when
+warnings are (or aren't) produced:
+
+=over 5
+
+=item B<-w>
+
+This is the existing flag. If the lexical warnings pragma is B<not>
+used in any of you code, or any of the modules that you use, this flag
+will enable warnings everywhere. See L<Backward Compatibility> for
+details of how this flag interacts with lexical warnings.
+
+=item B<-W>
+
+If the B<-W> flag is used on the command line, it will enable all warnings
+throughout the program regardless of whether warnings were disabled
+locally using C<no warnings> or C<$^W =0>. This includes all files that get
+included via C<use>, C<require> or C<do>.
+Think of it as the Perl equivalent of the "lint" command.
+
+=item B<-X>
+
+Does the exact opposite to the B<-W> flag, i.e. it disables all warnings.
+
+=back
+
+=head2 Backward Compatibility
+
+If you are used with working with a version of Perl prior to the
+introduction of lexically scoped warnings, or have code that uses both
+lexical warnings and C<$^W>, this section will describe how they interact.
+
+How Lexical Warnings interact with B<-w>/C<$^W>:
+
+=over 5
+
+=item 1.
+
+If none of the three command line flags (B<-w>, B<-W> or B<-X>) that
+control warnings is used and neither C<$^W> or the C<warnings> pragma
+are used, then default warnings will be enabled and optional warnings
+disabled.
+This means that legacy code that doesn't attempt to control the warnings
+will work unchanged.
+
+=item 2.
+
+The B<-w> flag just sets the global C<$^W> variable as in 5.005 -- this
+means that any legacy code that currently relies on manipulating C<$^W>
+to control warning behavior will still work as is.
+
+=item 3.
+
+Apart from now being a boolean, the C<$^W> variable operates in exactly
+the same horrible uncontrolled global way, except that it cannot
+disable/enable default warnings.
+
+=item 4.
+
+If a piece of code is under the control of the C<warnings> pragma,
+both the C<$^W> variable and the B<-w> flag will be ignored for the
+scope of the lexical warning.
+
+=item 5.
+
+The only way to override a lexical warnings setting is with the B<-W>
+or B<-X> command line flags.
+
+=back
+
+The combined effect of 3 & 4 is that it will will allow code which uses
+the C<warnings> pragma to control the warning behavior of $^W-type
+code (using a C<local $^W=0>) if it really wants to, but not vice-versa.
+
+=head2 Category Hierarchy
+
+A hierarchy of "categories" have been defined to allow groups of warnings
+to be enabled/disabled in isolation.
+
+The current hierarchy is:
+
+ all -+
+ |
+ +- chmod
+ |
+ +- closure
+ |
+ +- exiting
+ |
+ +- glob
+ |
+ +- io -----------+
+ | |
+ | +- closed
+ | |
+ | +- exec
+ | |
+ | +- newline
+ | |
+ | +- pipe
+ | |
+ | +- unopened
+ |
+ +- misc
+ |
+ +- numeric
+ |
+ +- once
+ |
+ +- overflow
+ |
+ +- pack
+ |
+ +- portable
+ |
+ +- recursion
+ |
+ +- redefine
+ |
+ +- regexp
+ |
+ +- severe -------+
+ | |
+ | +- debugging
+ | |
+ | +- inplace
+ | |
+ | +- internal
+ | |
+ | +- malloc
+ |
+ +- signal
+ |
+ +- substr
+ |
+ +- syntax -------+
+ | |
+ | +- ambiguous
+ | |
+ | +- bareword
+ | |
+ | +- deprecated
+ | |
+ | +- digit
+ | |
+ | +- parenthesis
+ | |
+ | +- precedence
+ | |
+ | +- printf
+ | |
+ | +- prototype
+ | |
+ | +- qw
+ | |
+ | +- reserved
+ | |
+ | +- semicolon
+ |
+ +- taint
+ |
+ +- umask
+ |
+ +- uninitialized
+ |
+ +- unpack
+ |
+ +- untie
+ |
+ +- utf8
+ |
+ +- void
+ |
+ +- y2k
+
+Just like the "strict" pragma any of these categories can be combined
+
+ use warnings qw(void redefine) ;
+ no warnings qw(io syntax untie) ;
+
+Also like the "strict" pragma, if there is more than one instance of the
+C<warnings> pragma in a given scope the cumulative effect is additive.
+
+ use warnings qw(void) ; # only "void" warnings enabled
+ ...
+ use warnings qw(io) ; # only "void" & "io" warnings enabled
+ ...
+ no warnings qw(void) ; # only "io" warnings enabled
+
+To determine which category a specific warning has been assigned to see
+L<perldiag>.
+
+=head2 Fatal Warnings
+
+The presence of the word "FATAL" in the category list will escalate any
+warnings detected from the categories specified in the lexical scope
+into fatal errors. In the code below, there are 3 places where a
+deprecated warning will be detected, the middle one will produce a
+fatal error.
+
+
+ use warnings ;
+
+ $a = 1 if $a EQ $b ;
+
+ {
+ use warnings FATAL => qw(deprecated) ;
+ $a = 1 if $a EQ $b ;
+ }
+
+ $a = 1 if $a EQ $b ;
+
+=head2 Reporting Warnings from a Module
+
+The C<warnings> pragma provides a number of functions that are useful for
+module authors. These are used when you want to report a module-specific
+warning when the calling module has enabled warnings via the C<warnings>
+pragma.
+
+Consider the module C<MyMod::Abc> below.
+
+ package MyMod::Abc;
+
+ use warnings::register;
+
+ sub open {
+ my $path = shift ;
+ if (warnings::enabled() && $path !~ m#^/#) {
+ warnings::warn("changing relative path to /tmp/");
+ $path = "/tmp/$path" ;
+ }
+ }
+
+ 1 ;
+
+The call to C<warnings::register> will create a new warnings category
+called "MyMod::abc", i.e. the new category name matches the module
+name. The C<open> function in the module will display a warning message
+if it gets given a relative path as a parameter. This warnings will only
+be displayed if the code that uses C<MyMod::Abc> has actually enabled
+them with the C<warnings> pragma like below.
+
+ use MyMod::Abc;
+ use warnings 'MyMod::Abc';
+ ...
+ abc::open("../fred.txt");
+
+It is also possible to test whether the pre-defined warnings categories are
+set in the calling module with the C<warnings::enabled> function. Consider
+this snippet of code:
+
+ package MyMod::Abc;
+
+ sub open {
+ if (warnings::enabled("deprecated")) {
+ warnings::warn("deprecated",
+ "open is deprecated, use new instead") ;
+ }
+ new(@_) ;
+ }
+
+ sub new
+ ...
+ 1 ;
+
+The function C<open> has been deprecated, so code has been included to
+display a warning message whenever the calling module has (at least) the
+"deprecated" warnings category enabled. Something like this, say.
+
+ use warnings 'deprecated';
+ use MyMod::Abc;
+ ...
+ MyMod::Abc::open($filename) ;
+
+The C<warnings::warn> function should be used to actually display the
+warnings message. This is because they can make use of the feature that
+allows warnings to be escalated into fatal errors. So in this case
+
+ use MyMod::Abc;
+ use warnings FATAL => 'MyMod::Abc';
+ ...
+ MyMod::Abc::open('../fred.txt');
+
+the C<warnings::warn> function will detect this and die after
+displaying the warning message.
+
+=head1 TODO
+
+ perl5db.pl
+ The debugger saves and restores C<$^W> at runtime. I haven't checked
+ whether the debugger will still work with the lexical warnings
+ patch applied.
+
+ diagnostics.pm
+ I *think* I've got diagnostics to work with the lexical warnings
+ patch, but there were design decisions made in diagnostics to work
+ around the limitations of C<$^W>. Now that those limitations are gone,
+ the module should be revisited.
+
+=head1 SEE ALSO
+
+L<warnings>, L<perldiag>.
+
+=head1 AUTHOR
+
+Paul Marquess
diff --git a/contrib/perl5/pod/perllocale.pod b/contrib/perl5/pod/perllocale.pod
index 08b50e0..be37385 100644
--- a/contrib/perl5/pod/perllocale.pod
+++ b/contrib/perl5/pod/perllocale.pod
@@ -309,7 +309,7 @@ discussed above. We decided to try that instead of the above faulty
locale "En_US"--and in Cshish shells (B<csh>, B<tcsh>)
setenv LC_ALL en_US.ISO8859-1
-
+
If you do not know what shell you have, consult your local
helpdesk or the equivalent.
@@ -332,9 +332,9 @@ Second, if using the listed commands you see something B<exactly>
(prefix matches do not count and case usually counts) like "En_US"
without the quotes, then you should be okay because you are using a
locale name that should be installed and available in your system.
-In this case, see L<Permanently fixing system locale configuration>.
+In this case, see L<Permanently fixing your system's locale configuration>.
-=head2 Permanently fixing your locale configuration
+=head2 Permanently fixing your system's locale configuration
This is when you see something like:
@@ -608,8 +608,12 @@ obeys the current C<LC_TIME> locale.
The remaining locale category, C<LC_MESSAGES> (possibly supplemented
by others in particular implementations) is not currently used by
-Perl--except possibly to affect the behavior of library functions called
-by extensions outside the standard Perl distribution.
+Perl--except possibly to affect the behavior of library functions
+called by extensions outside the standard Perl distribution and by the
+operating system and its utilities. Note especially that the string
+value of C<$!> and the error messages given by external utilities may
+be changed by C<LC_MESSAGES>. If you want to have portable error
+codes, use C<%!>. See L<Errno>.
=head1 SECURITY
@@ -637,11 +641,12 @@ case-mapping table is in effect.
=item *
-If the decimal point character in the C<LC_NUMERIC> locale is
-surreptitiously changed from a dot to a comma, C<sprintf("%g",
-0.123456e3)> produces a string result of "123,456". Many people would
-interpret this as one hundred and twenty-three thousand, four hundred
-and fifty-six.
+Some systems are broken in that they allow the "C" locale to be
+overridden by users. If the decimal point character in the
+C<LC_NUMERIC> category of the "C" locale is surreptitiously changed
+from a dot to a comma, C<sprintf("%g", 0.123456e3)> produces a
+string result of "123,456". Many people would interpret this as
+one hundred and twenty-three thousand, four hundred and fifty-six.
=item *
@@ -710,10 +715,6 @@ if modified as a result of a substitution based on a regular
expression match involving C<\w>, C<\W>, C<\s>, or C<\S>; or of
case-mapping with C<\l>, C<\L>,C<\u> or C<\U>.
-=item B<In-memory formatting function> (sprintf()):
-
-Result is tainted if C<use locale> is in effect.
-
=item B<Output formatting functions> (printf() and write()):
Success/failure result is never tainted.
diff --git a/contrib/perl5/pod/perllol.pod b/contrib/perl5/pod/perllol.pod
index 56f08c2..f015a20 100644
--- a/contrib/perl5/pod/perllol.pod
+++ b/contrib/perl5/pod/perllol.pod
@@ -1,62 +1,62 @@
=head1 NAME
-perlLoL - Manipulating Lists of Lists in Perl
+perllol - Manipulating Arrays of Arrays in Perl
=head1 DESCRIPTION
-=head1 Declaration and Access of Lists of Lists
+=head1 Declaration and Access of Arrays of Arrays
-The simplest thing to build is a list of lists (sometimes called an array
-of arrays). It's reasonably easy to understand, and almost everything
-that applies here will also be applicable later on with the fancier data
-structures.
+The simplest thing to build an array of arrays (sometimes imprecisely
+called a list of lists). It's reasonably easy to understand, and
+almost everything that applies here will also be applicable later
+on with the fancier data structures.
-A list of lists, or an array of an array if you would, is just a regular
-old array @LoL that you can get at with two subscripts, like C<$LoL[3][2]>. Here's
-a declaration of the array:
+An array of an array is just a regular old array @AoA that you can
+get at with two subscripts, like C<$AoA[3][2]>. Here's a declaration
+of the array:
- # assign to our array a list of list references
- @LoL = (
+ # assign to our array, an array of array references
+ @AoA = (
[ "fred", "barney" ],
[ "george", "jane", "elroy" ],
[ "homer", "marge", "bart" ],
);
- print $LoL[2][2];
+ print $AoA[2][2];
bart
Now you should be very careful that the outer bracket type
is a round one, that is, a parenthesis. That's because you're assigning to
-an @list, so you need parentheses. If you wanted there I<not> to be an @LoL,
+an @array, so you need parentheses. If you wanted there I<not> to be an @AoA,
but rather just a reference to it, you could do something more like this:
- # assign a reference to list of list references
- $ref_to_LoL = [
+ # assign a reference to array of array references
+ $ref_to_AoA = [
[ "fred", "barney", "pebbles", "bambam", "dino", ],
[ "homer", "bart", "marge", "maggie", ],
[ "george", "jane", "elroy", "judy", ],
];
- print $ref_to_LoL->[2][2];
+ print $ref_to_AoA->[2][2];
Notice that the outer bracket type has changed, and so our access syntax
has also changed. That's because unlike C, in perl you can't freely
-interchange arrays and references thereto. $ref_to_LoL is a reference to an
-array, whereas @LoL is an array proper. Likewise, C<$LoL[2]> is not an
+interchange arrays and references thereto. $ref_to_AoA is a reference to an
+array, whereas @AoA is an array proper. Likewise, C<$AoA[2]> is not an
array, but an array ref. So how come you can write these:
- $LoL[2][2]
- $ref_to_LoL->[2][2]
+ $AoA[2][2]
+ $ref_to_AoA->[2][2]
instead of having to write these:
- $LoL[2]->[2]
- $ref_to_LoL->[2]->[2]
+ $AoA[2]->[2]
+ $ref_to_AoA->[2]->[2]
Well, that's because the rule is that on adjacent brackets only (whether
square or curly), you are free to omit the pointer dereferencing arrow.
But you cannot do so for the very first one if it's a scalar containing
-a reference, which means that $ref_to_LoL always needs it.
+a reference, which means that $ref_to_AoA always needs it.
=head1 Growing Your Own
@@ -67,81 +67,81 @@ it up entirely from scratch?
First, let's look at reading it in from a file. This is something like
adding a row at a time. We'll assume that there's a flat file in which
each line is a row and each word an element. If you're trying to develop an
-@LoL list containing all these, here's the right way to do that:
+@AoA array containing all these, here's the right way to do that:
while (<>) {
@tmp = split;
- push @LoL, [ @tmp ];
+ push @AoA, [ @tmp ];
}
You might also have loaded that from a function:
for $i ( 1 .. 10 ) {
- $LoL[$i] = [ somefunc($i) ];
+ $AoA[$i] = [ somefunc($i) ];
}
Or you might have had a temporary variable sitting around with the
-list in it.
+array in it.
for $i ( 1 .. 10 ) {
@tmp = somefunc($i);
- $LoL[$i] = [ @tmp ];
+ $AoA[$i] = [ @tmp ];
}
-It's very important that you make sure to use the C<[]> list reference
+It's very important that you make sure to use the C<[]> array reference
constructor. That's because this will be very wrong:
- $LoL[$i] = @tmp;
+ $AoA[$i] = @tmp;
-You see, assigning a named list like that to a scalar just counts the
+You see, assigning a named array like that to a scalar just counts the
number of elements in @tmp, which probably isn't what you want.
If you are running under C<use strict>, you'll have to add some
declarations to make it happy:
use strict;
- my(@LoL, @tmp);
+ my(@AoA, @tmp);
while (<>) {
@tmp = split;
- push @LoL, [ @tmp ];
+ push @AoA, [ @tmp ];
}
Of course, you don't need the temporary array to have a name at all:
while (<>) {
- push @LoL, [ split ];
+ push @AoA, [ split ];
}
You also don't have to use push(). You could just make a direct assignment
if you knew where you wanted to put it:
- my (@LoL, $i, $line);
+ my (@AoA, $i, $line);
for $i ( 0 .. 10 ) {
$line = <>;
- $LoL[$i] = [ split ' ', $line ];
+ $AoA[$i] = [ split ' ', $line ];
}
or even just
- my (@LoL, $i);
+ my (@AoA, $i);
for $i ( 0 .. 10 ) {
- $LoL[$i] = [ split ' ', <> ];
+ $AoA[$i] = [ split ' ', <> ];
}
-You should in general be leery of using potential list functions
-in a scalar context without explicitly stating such.
-This would be clearer to the casual reader:
+You should in general be leery of using functions that could
+potentially return lists in scalar context without explicitly stating
+such. This would be clearer to the casual reader:
- my (@LoL, $i);
+ my (@AoA, $i);
for $i ( 0 .. 10 ) {
- $LoL[$i] = [ split ' ', scalar(<>) ];
+ $AoA[$i] = [ split ' ', scalar(<>) ];
}
-If you wanted to have a $ref_to_LoL variable as a reference to an array,
+If you wanted to have a $ref_to_AoA variable as a reference to an array,
you'd have to do something like this:
while (<>) {
- push @$ref_to_LoL, [ split ];
+ push @$ref_to_AoA, [ split ];
}
Now you can add new rows. What about adding new columns? If you're
@@ -149,12 +149,12 @@ dealing with just matrices, it's often easiest to use simple assignment:
for $x (1 .. 10) {
for $y (1 .. 10) {
- $LoL[$x][$y] = func($x, $y);
+ $AoA[$x][$y] = func($x, $y);
}
}
for $x ( 3, 7, 9 ) {
- $LoL[$x][20] += func2($x);
+ $AoA[$x][20] += func2($x);
}
It doesn't matter whether those elements are already
@@ -165,11 +165,11 @@ If you wanted just to append to a row, you'd have
to do something a bit funnier looking:
# add new columns to an existing row
- push @{ $LoL[0] }, "wilma", "betty";
+ push @{ $AoA[0] }, "wilma", "betty";
Notice that I I<couldn't> say just:
- push $LoL[0], "wilma", "betty"; # WRONG!
+ push $AoA[0], "wilma", "betty"; # WRONG!
In fact, that wouldn't even compile. How come? Because the argument
to push() must be a real array, not just a reference to such.
@@ -180,12 +180,12 @@ Now it's time to print your data structure out. How
are you going to do that? Well, if you want only one
of the elements, it's trivial:
- print $LoL[0][0];
+ print $AoA[0][0];
If you want to print the whole thing, though, you can't
say
- print @LoL; # WRONG
+ print @AoA; # WRONG
because you'll get just references listed, and perl will never
automatically dereference things for you. Instead, you have to
@@ -193,41 +193,41 @@ roll yourself a loop or two. This prints the whole structure,
using the shell-style for() construct to loop across the outer
set of subscripts.
- for $aref ( @LoL ) {
+ for $aref ( @AoA ) {
print "\t [ @$aref ],\n";
}
If you wanted to keep track of subscripts, you might do this:
- for $i ( 0 .. $#LoL ) {
- print "\t elt $i is [ @{$LoL[$i]} ],\n";
+ for $i ( 0 .. $#AoA ) {
+ print "\t elt $i is [ @{$AoA[$i]} ],\n";
}
or maybe even this. Notice the inner loop.
- for $i ( 0 .. $#LoL ) {
- for $j ( 0 .. $#{$LoL[$i]} ) {
- print "elt $i $j is $LoL[$i][$j]\n";
+ for $i ( 0 .. $#AoA ) {
+ for $j ( 0 .. $#{$AoA[$i]} ) {
+ print "elt $i $j is $AoA[$i][$j]\n";
}
}
As you can see, it's getting a bit complicated. That's why
sometimes is easier to take a temporary on your way through:
- for $i ( 0 .. $#LoL ) {
- $aref = $LoL[$i];
+ for $i ( 0 .. $#AoA ) {
+ $aref = $AoA[$i];
for $j ( 0 .. $#{$aref} ) {
- print "elt $i $j is $LoL[$i][$j]\n";
+ print "elt $i $j is $AoA[$i][$j]\n";
}
}
Hmm... that's still a bit ugly. How about this:
- for $i ( 0 .. $#LoL ) {
- $aref = $LoL[$i];
+ for $i ( 0 .. $#AoA ) {
+ $aref = $AoA[$i];
$n = @$aref - 1;
for $j ( 0 .. $n ) {
- print "elt $i $j is $LoL[$i][$j]\n";
+ print "elt $i $j is $AoA[$i][$j]\n";
}
}
@@ -240,49 +240,49 @@ pointer arrow for dereferencing, no such convenience exists for slices.
(Remember, of course, that you can always write a loop to do a slice
operation.)
-Here's how to do one operation using a loop. We'll assume an @LoL
+Here's how to do one operation using a loop. We'll assume an @AoA
variable as before.
@part = ();
$x = 4;
for ($y = 7; $y < 13; $y++) {
- push @part, $LoL[$x][$y];
+ push @part, $AoA[$x][$y];
}
That same loop could be replaced with a slice operation:
- @part = @{ $LoL[4] } [ 7..12 ];
+ @part = @{ $AoA[4] } [ 7..12 ];
but as you might well imagine, this is pretty rough on the reader.
Ah, but what if you wanted a I<two-dimensional slice>, such as having
$x run from 4..8 and $y run from 7 to 12? Hmm... here's the simple way:
- @newLoL = ();
+ @newAoA = ();
for ($startx = $x = 4; $x <= 8; $x++) {
for ($starty = $y = 7; $y <= 12; $y++) {
- $newLoL[$x - $startx][$y - $starty] = $LoL[$x][$y];
+ $newAoA[$x - $startx][$y - $starty] = $AoA[$x][$y];
}
}
We can reduce some of the looping through slices
for ($x = 4; $x <= 8; $x++) {
- push @newLoL, [ @{ $LoL[$x] } [ 7..12 ] ];
+ push @newAoA, [ @{ $AoA[$x] } [ 7..12 ] ];
}
If you were into Schwartzian Transforms, you would probably
have selected map for that
- @newLoL = map { [ @{ $LoL[$_] } [ 7..12 ] ] } 4 .. 8;
+ @newAoA = map { [ @{ $AoA[$_] } [ 7..12 ] ] } 4 .. 8;
Although if your manager accused of seeking job security (or rapid
insecurity) through inscrutable code, it would be hard to argue. :-)
If I were you, I'd put that in a function:
- @newLoL = splice_2D( \@LoL, 4 => 8, 7 => 12 );
+ @newAoA = splice_2D( \@AoA, 4 => 8, 7 => 12 );
sub splice_2D {
- my $lrr = shift; # ref to list of list refs!
+ my $lrr = shift; # ref to array of array refs!
my ($x_lo, $x_hi,
$y_lo, $y_hi) = @_;
diff --git a/contrib/perl5/pod/perlmod.pod b/contrib/perl5/pod/perlmod.pod
index 48ebf23..63324a4 100644
--- a/contrib/perl5/pod/perlmod.pod
+++ b/contrib/perl5/pod/perlmod.pod
@@ -6,25 +6,27 @@ perlmod - Perl modules (packages and symbol tables)
=head2 Packages
-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 (although some identifiers default
-to the main package instead of the current one). 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>, C<sub>, or end of file, whichever comes first (the same scope
-as the my() and local() operators). All further unqualified dynamic
-identifiers will be in this namespace. A package statement only affects
-dynamic variables--including those you've used local() on--but
-I<not> lexical variables created with my(). Typically it would be
-the first declaration in a file to be included by the C<require> or
-C<use> operator. You can switch into a package in more than one place;
-it merely influences which symbol table is used by the compiler for the
-rest of that block. You can refer to variables and filehandles in other
-packages by prefixing the identifier with the package name and a double
-colon: C<$Package::Variable>. If the package name is null, the C<main>
-package is assumed. That is, C<$::sail> is equivalent to C<$main::sail>.
+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
+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>,
+or file, whichever comes first (the same scope as the my() and
+local() operators). Unqualified dynamic identifiers will be in
+this namespace, except for those few identifiers that if unqualified,
+default to the main package instead of the current one as described
+below. A package statement affects only dynamic variables--including
+those you've used local() on--but I<not> lexical variables created
+with my(). Typically it would be the first declaration in a file
+included by the C<do>, C<require>, or C<use> operators. You can
+switch into a package in more than one place; it merely influences
+which symbol table is used by the compiler for the rest of that
+block. You can refer to variables and filehandles in other packages
+by prefixing the identifier with the package name and a double
+colon: C<$Package::Variable>. If the package name is null, the
+C<main> package is assumed. That is, C<$::sail> is equivalent to
+C<$main::sail>.
The old package delimiter was a single quote, but double colon is now the
preferred delimiter, in part because it's more readable to humans, and
@@ -37,35 +39,38 @@ C<"This is $owner's house">, you'll be accessing C<$owner::s>; that is,
the $s variable in package C<owner>, which is probably not what you meant.
Use braces to disambiguate, as in C<"This is ${owner}'s house">.
-Packages may be nested inside other packages: C<$OUTER::INNER::var>. This
-implies nothing about the order of name lookups, however. All symbols
+Packages may themselves contain package separators, as in
+C<$OUTER::INNER::var>. This implies nothing about the order of
+name lookups, however. There are no relative packages: all symbols
are either local to the current package, or must be fully qualified
from the outer package name down. For instance, there is nowhere
-within package C<OUTER> that C<$INNER::var> refers to C<$OUTER::INNER::var>.
-It would treat package C<INNER> as a totally separate global package.
-
-Only identifiers starting with letters (or underscore) are stored in a
-package's symbol table. All other symbols are kept in package C<main>,
-including all of the punctuation variables like $_. In addition, when
-unqualified, the identifiers STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV,
-INC, and SIG are forced to be in package C<main>, even when used for other
-purposes than their builtin one. Note also that, if you have a package
-called C<m>, C<s>, or C<y>, then you can't use the qualified form of an
-identifier because it will be interpreted instead as a pattern match,
-a substitution, or a transliteration.
-
-(Variables beginning with underscore used to be forced into package
+within package C<OUTER> that C<$INNER::var> refers to
+C<$OUTER::INNER::var>. It would treat package C<INNER> as a totally
+separate global package.
+
+Only identifiers starting with letters (or underscore) are stored
+in a package's symbol table. All other symbols are kept in package
+C<main>, including all punctuation variables, like $_. In addition,
+when unqualified, the identifiers STDIN, STDOUT, STDERR, ARGV,
+ARGVOUT, ENV, INC, and SIG are forced to be in package C<main>,
+even when used for other purposes than their built-in one. If you
+have a package called C<m>, C<s>, or C<y>, then you can't use the
+qualified form of an identifier because it would be instead interpreted
+as a pattern match, a substitution, or a transliteration.
+
+Variables beginning with underscore used to be forced into package
main, but we decided it was more useful for package writers to be able
to use leading underscore to indicate private variables and method names.
-$_ is still global though.)
+$_ is still global though. See also L<perlvar/"Technical Note on the
+Syntax of Variable Names">.
-Eval()ed strings are compiled in the package in which the eval() was
+C<eval>ed strings are compiled in the package in which the eval() was
compiled. (Assignments to C<$SIG{}>, however, assume the signal
handler specified is in the C<main> package. Qualify the signal handler
name if you wish to have a signal handler in a package.) For an
example, examine F<perldb.pl> in the Perl library. It initially switches
to the C<DB> package so that the debugger doesn't interfere with variables
-in the script you are trying to debug. At various points, however, it
+in the program you are trying to debug. At various points, however, it
temporarily switches back to the C<main> package to evaluate various
expressions in the context of the C<main> package (or wherever you came
from). See L<perldebug>.
@@ -92,8 +97,8 @@ table lookups at compile time:
local $main::{foo} = $main::{bar};
You can use this to print out all the variables in a package, for
-instance. The standard F<dumpvar.pl> library and the CPAN module
-Devel::Symdump make use of this.
+instance. The standard but antequated F<dumpvar.pl> library and
+the CPAN module Devel::Symdump make use of this.
Assignment to a typeglob performs an aliasing operation, i.e.,
@@ -102,7 +107,7 @@ Assignment to a typeglob performs an aliasing operation, i.e.,
causes variables, subroutines, formats, and file and directory handles
accessible via the identifier C<richard> also to be accessible via the
identifier C<dick>. If you want to alias only a particular variable or
-subroutine, you can assign a reference instead:
+subroutine, assign a reference instead:
*dick = \$richard;
@@ -130,7 +135,7 @@ is a somewhat tricky way of passing around references cheaply
when you won't want to have to remember to dereference variables
explicitly.
-Another use of symbol tables is for making "constant" scalars.
+Another use of symbol tables is for making "constant" scalars.
*PI = \3.14159265358979;
@@ -157,14 +162,59 @@ This prints
You gave me main::foo
You gave me bar::baz
-The *foo{THING} notation can also be used to obtain references to the
+The C<*foo{THING}> notation can also be used to obtain references to the
individual elements of *foo, see L<perlref>.
+Subroutine definitions (and declarations, for that matter) need
+not necessarily be situated in the package whose symbol table they
+occupy. You can define a subroutine outside its package by
+explicitly qualifying the name of the subroutine:
+
+ package main;
+ sub Some_package::foo { ... } # &foo defined in Some_package
+
+This is just a shorthand for a typeglob assignment at compile time:
+
+ BEGIN { *Some_package::foo = sub { ... } }
+
+and is I<not> the same as writing:
+
+ {
+ package Some_package;
+ sub foo { ... }
+ }
+
+In the first two versions, the body of the subroutine is
+lexically in the main package, I<not> in Some_package. So
+something like this:
+
+ package main;
+
+ $Some_package::name = "fred";
+ $main::name = "barney";
+
+ sub Some_package::foo {
+ print "in ", __PACKAGE__, ": \$name is '$name'\n";
+ }
+
+ Some_package::foo();
+
+prints:
+
+ in main: $name is 'barney'
+
+rather than:
+
+ in Some_package: $name is 'fred'
+
+This also has implications for the use of the SUPER:: qualifier
+(see L<perlobj>).
+
=head2 Package Constructors and Destructors
-There are two special subroutine definitions that function as package
-constructors and destructors. These are the C<BEGIN> and C<END>
-routines. The C<sub> is optional for these routines.
+Four special subroutines act as package constructors and destructors.
+These are the C<BEGIN>, C<CHECK>, C<INIT>, and C<END> routines. The
+C<sub> is optional for these routines.
A C<BEGIN> subroutine is executed as soon as possible, that is, the moment
it is completely defined, even before the rest of the containing file
@@ -175,55 +225,69 @@ files in time to be visible to the rest of the file. Once a C<BEGIN>
has run, it is immediately undefined and any code it used is returned to
Perl's memory pool. This means you can't ever explicitly call a C<BEGIN>.
-An C<END> subroutine is executed as late as possible, that is, when
-the interpreter is being exited, even if it is exiting as a result of
-a die() function. (But not if it's polymorphing into another program
-via C<exec>, or being blown out of the water by a signal--you have to
-trap that yourself (if you can).) You may have multiple C<END> blocks
-within a file--they will execute in reverse order of definition; that is:
-last in, first out (LIFO).
-
-Inside an C<END> subroutine, C<$?> contains the value that the script is
+An C<END> subroutine is executed as late as possible, that is, after
+perl has finished running the program and just before the interpreter
+is being exited, even if it is exiting as a result of a die() function.
+(But not if it's polymorphing into another program via C<exec>, or
+being blown out of the water by a signal--you have to trap that yourself
+(if you can).) You may have multiple C<END> blocks within a file--they
+will execute in reverse order of definition; that is: last in, first
+out (LIFO). C<END> blocks are not executed when you run perl with the
+C<-c> switch.
+
+Inside an C<END> subroutine, C<$?> contains the value that the program is
going to pass to C<exit()>. You can modify C<$?> to change the exit
-value of the script. Beware of changing C<$?> by accident (e.g. by
+value of the program. Beware of changing C<$?> by accident (e.g. by
running something via C<system>).
-Note that when you use the B<-n> and B<-p> switches to Perl, C<BEGIN> and
+Similar to C<BEGIN> blocks, C<INIT> blocks are run just before the
+Perl runtime begins execution, in "first in, first out" (FIFO) order.
+For example, the code generators documented in L<perlcc> make use of
+C<INIT> blocks to initialize and resolve pointers to XSUBs.
+
+Similar to C<END> blocks, C<CHECK> blocks are run just after the
+Perl compile phase ends and before the run time begins, in
+LIFO order. C<CHECK> blocks are again useful in the Perl compiler
+suite to save the compiled state of the program.
+
+When you use the B<-n> and B<-p> switches to Perl, C<BEGIN> and
C<END> work just as they do in B<awk>, as a degenerate case. As currently
implemented (and subject to change, since its inconvenient at best),
-both C<BEGIN> I<and> C<END> blocks are run when you use the B<-c> switch
+both C<BEGIN> and<END> blocks are run when you use the B<-c> switch
for a compile-only syntax check, although your main code is not.
=head2 Perl Classes
-There is no special class syntax in Perl, but a package may function
+There is no special class syntax in Perl, but a package may act
as a class if it provides subroutines to act as methods. Such a
package may also derive some of its methods from another class (package)
-by listing the other package name in its global @ISA array (which
+by listing the other package name(s) in its global @ISA array (which
must be a package global, not a lexical).
For more on this, see L<perltoot> and L<perlobj>.
=head2 Perl Modules
-A module is just a package that is defined in a library file of
-the same name, and is designed to be reusable. It may do this by
-providing a mechanism for exporting some of its symbols into the symbol
-table of any package using it. Or it may function as a class
-definition and make its semantics available implicitly through method
-calls on the class and its objects, without explicit exportation of any
-symbols. Or it can do a little of both.
+A module is just a set of related function in a library file a Perl
+package with the same name as the file. It is specifically designed
+to be reusable by other modules or programs. It may do this by
+providing a mechanism for exporting some of its symbols into the
+symbol table of any package using it. Or it may function as a class
+definition and make its semantics available implicitly through
+method calls on the class and its objects, without explicitly
+exportating anything. Or it can do a little of both.
-For example, to start a normal module called Some::Module, create
-a file called Some/Module.pm and start with this template:
+For example, to start a traditional, non-OO module called Some::Module,
+create a file called F<Some/Module.pm> and start with this template:
package Some::Module; # assumes Some/Module.pm
use strict;
+ use warnings;
BEGIN {
use Exporter ();
- use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
# set the version for version checking
$VERSION = 1.00;
@@ -238,10 +302,11 @@ a file called Some/Module.pm and start with this template:
# as well as any optionally exported functions
@EXPORT_OK = qw($Var1 %Hashit &func3);
}
- use vars @EXPORT_OK;
+ our @EXPORT_OK;
# non-exported package globals go here
- use vars qw(@more $stuff);
+ our @more;
+ our $stuff;
# initialize package globals, first exported ones
$Var1 = '';
@@ -275,10 +340,13 @@ a file called Some/Module.pm and start with this template:
END { } # module clean-up code here (global destructor)
-Then go on to declare and use your variables in functions
-without any qualifications.
-See L<Exporter> and the L<perlmodlib> for details on
-mechanics and style issues in module creation.
+ ## YOUR CODE GOES HERE
+
+ 1; # don't forget to return a true value from the file
+
+Then go on to declare and use your variables in functions without
+any qualifications. See L<Exporter> and the L<perlmodlib> for
+details on mechanics and style issues in module creation.
Perl modules are included into your program by saying
@@ -304,12 +372,13 @@ is exactly equivalent to
BEGIN { require Module; }
-All Perl module files have the extension F<.pm>. C<use> assumes this so
-that you don't have to spell out "F<Module.pm>" in quotes. This also
-helps to differentiate new modules from old F<.pl> and F<.ph> files.
-Module names are also capitalized unless they're functioning as pragmas,
-"Pragmas" are in effect compiler directives, and are sometimes called
-"pragmatic modules" (or even "pragmata" if you're a classicist).
+All Perl module files have the extension F<.pm>. The C<use> operator
+assumes this so you don't have to spell out "F<Module.pm>" in quotes.
+This also helps to differentiate new modules from old F<.pl> and
+F<.ph> files. Module names are also capitalized unless they're
+functioning as pragmas; pragmas are in effect compiler directives,
+and are sometimes called "pragmatic modules" (or even "pragmata"
+if you're a classicist).
The two statements:
@@ -319,18 +388,19 @@ The two statements:
differ from each other in two ways. In the first case, any double
colons in the module name, such as C<Some::Module>, are translated
into your system's directory separator, usually "/". The second
-case does not, and would have to be specified literally. The other difference
-is that seeing the first C<require> clues in the compiler that uses of
-indirect object notation involving "SomeModule", as in C<$ob = purge SomeModule>,
-are method calls, not function calls. (Yes, this really can make a difference.)
-
-Because the C<use> statement implies a C<BEGIN> block, the importation
-of semantics happens at the moment the C<use> statement is compiled,
+case does not, and would have to be specified literally. The other
+difference is that seeing the first C<require> clues in the compiler
+that uses of indirect object notation involving "SomeModule", as
+in C<$ob = purge SomeModule>, are method calls, not function calls.
+(Yes, this really can make a difference.)
+
+Because the C<use> statement implies a C<BEGIN> block, the importing
+of semantics happens as soon as the C<use> statement is compiled,
before the rest of the file is compiled. This is how it is able
to function as a pragma mechanism, and also how modules are able to
-declare subroutines that are then visible as list operators for
+declare subroutines that are then visible as list or unary operators for
the rest of the current file. This will not work if you use C<require>
-instead of C<use>. With require you can get into this problem:
+instead of C<use>. With C<require> you can get into this problem:
require Cwd; # make Cwd:: accessible
$here = Cwd::getcwd();
@@ -354,22 +424,22 @@ filenames on some systems. Therefore, if a module's name is, say,
C<Text::Soundex>, then its definition is actually found in the library
file F<Text/Soundex.pm>.
-Perl modules always have a F<.pm> file, but there may also be dynamically
-linked executables or autoloaded subroutine definitions associated with
-the module. If so, these will be entirely transparent to the user of
-the module. It is the responsibility of the F<.pm> file to load (or
-arrange to autoload) any additional functionality. The POSIX module
-happens to do both dynamic loading and autoloading, but the user can
-say just C<use POSIX> to get it all.
-
-For more information on writing extension modules, see L<perlxstut>
-and L<perlguts>.
+Perl modules always have a F<.pm> file, but there may also be
+dynamically linked executables (often ending in F<.so>) or autoloaded
+subroutine definitions (often ending in F<.al> associated with the
+module. If so, these will be entirely transparent to the user of
+the module. It is the responsibility of the F<.pm> file to load
+(or arrange to autoload) any additional functionality. For example,
+although the POSIX module happens to do both dynamic loading and
+autoloading, but the user can say just C<use POSIX> to get it all.
=head1 SEE ALSO
See L<perlmodlib> for general style issues related to building Perl
-modules and classes as well as descriptions of the standard library and
-CPAN, L<Exporter> for how Perl's standard import/export mechanism works,
-L<perltoot> for an in-depth tutorial on creating classes, L<perlobj>
-for a hard-core reference document on objects, and L<perlsub> for an
-explanation of functions and scoping.
+modules and classes, as well as descriptions of the standard library
+and CPAN, L<Exporter> for how Perl's standard import/export mechanism
+works, L<perltoot> and L<perltootc> for an in-depth tutorial on
+creating classes, L<perlobj> for a hard-core reference document on
+objects, L<perlsub> for an explanation of functions and scoping,
+and L<perlxstut> and L<perlguts> for more information on writing
+extension modules.
diff --git a/contrib/perl5/pod/perlmodinstall.pod b/contrib/perl5/pod/perlmodinstall.pod
index b6176f0..19ffac9 100644
--- a/contrib/perl5/pod/perlmodinstall.pod
+++ b/contrib/perl5/pod/perlmodinstall.pod
@@ -5,21 +5,23 @@ perlmodinstall - Installing CPAN Modules
=head1 DESCRIPTION
You can think of a module as the fundamental unit of reusable Perl
-code; see L<perlmod> for details. Whenever anyone creates a chunk of
-Perl code that they think will be useful to the world, they register
-as a Perl developer at http://www.perl.com/CPAN/modules/04pause.html
-so that they can then upload their code to the CPAN. The CPAN is the
-Comprehensive Perl Archive Network and can be accessed at
-http://www.perl.com/CPAN/.
+code; See L<perlmod> for details. Whenever anyone creates a chunk
+of Perl code that they think will be useful to the world, they
+register as a Perl developer at
+http://www.perl.com/CPAN/modules/04pause.html so that they can then
+upload their code to CPAN. CPAN is the Comprehensive Perl Archive
+Network and can be accessed at http://www.perl.com/CPAN/, or searched
+via http://cpan.perl.com/ and
+http://theory.uwinnipeg.ca/mod_perl/cpan-search.pl .
This documentation is for people who want to download CPAN modules
and install them on their own computer.
=head2 PREAMBLE
-You have a file ending in .tar.gz (or, less often, .zip). You know
-there's a tasty module inside. There are four steps you must now
-take:
+You have a file ending in F<.tar.gz> (or, less often, F<.zip>).
+You know there's a tasty module inside. You must now take four
+steps:
=over 5
@@ -44,8 +46,8 @@ say C<perl Makefile.PL>, you can substitute C<perl
Makefile.PL PREFIX=/my/perl_directory> to install the modules
into C</my/perl_directory>. Then you can use the modules
from your Perl programs with C<use lib
-"/my/perl_directory/lib/site_perl";> or sometimes just C<use
-"/my/perl_directory";>.
+"/my/perl_directory/lib/site_perl"> or sometimes just C<use
+"/my/perl_directory">.
=over 4
@@ -54,7 +56,8 @@ from your Perl programs with C<use lib
B<If you're on Unix,>
You can use Andreas Koenig's CPAN module
-( http://www.perl.com/CPAN/modules/by-module/CPAN )
+(which comes standard with Perl, or can itself be downloaded
+from http://www.perl.com/CPAN/modules/by-module/CPAN)
to automate the following steps, from DECOMPRESS through INSTALL.
A. DECOMPRESS
@@ -85,12 +88,17 @@ While still in that directory, type:
make install
-Make sure you have the appropriate permissions to install the module
+Make sure you have appropriate permissions to install the module
in your Perl 5 library directory. Often, you'll need to be root.
+Perl maintains a record of all module installations. To look at
+this list, simply type:
+
+ perldoc perllocal
+
That's all you need to do on Unix systems with dynamic linking.
-Most Unix systems have dynamic linking -- if yours doesn't, or if for
-another reason you have a statically-linked perl, B<and> the
+Most Unix systems have dynamic linking--if yours doesn't, or if for
+another reason you have a statically-linked perl, I<and> the
module requires compilation, you'll need to build a new Perl binary
that includes the module. Again, you'll probably need to be root.
@@ -100,7 +108,7 @@ B<If you're running Windows 95 or NT with the ActiveState port of Perl>
A. DECOMPRESS
-You can use the shareware Winzip ( http://www.winzip.com ) to
+You can use the shareware B<Winzip> program ( http://www.winzip.com ) to
decompress and unpack modules.
B. UNPACK
@@ -112,7 +120,7 @@ If you used WinZip, this was already done for you.
Does the module require compilation (i.e. does it have files
that end in .xs, .c, .h, .y, .cc, .cxx, or .C)? If it does, you're on
your own. You can try compiling it yourself if you have a C compiler.
-If you're successful, consider uploading the resulting binary to the
+If you're successful, consider uploading the resulting binary to
CPAN for others to use. If it doesn't, go to INSTALL.
D. INSTALL
@@ -129,17 +137,16 @@ B<If you're running Windows 95 or NT with the core Windows distribution of Perl,
A. DECOMPRESS
When you download the module, make sure it ends in either
-C<.tar.gz> or C<.zip>. Windows browsers sometimes
+F<.tar.gz> or F<.zip>. Windows browsers sometimes
download C<.tar.gz> files as C<_tar.tar>, because
early versions of Windows prohibited more than one dot in a filename.
-You can use the shareware WinZip ( http://www.winzip.com ) to
+You can use the shareware B<WinZip> program ( http://www.winzip.com ) to
decompress and unpack modules.
Or, you can use InfoZip's C<unzip> utility (
-http://www.cdrom.com/pub/infozip/Info-Zip.html ) to uncompress
-C<.zip> files; type C<unzip yourmodule.zip> in
-your shell.
+http://www.cdrom.com/pub/infozip/ ) to uncompress C<.zip> files; type
+C<unzip yourmodule.zip> in your shell.
Or, if you have a working C<tar> and C<gzip>, you can
type
@@ -151,7 +158,7 @@ UNPACK your module as well.
B. UNPACK
-All of the methods in DECOMPRESS will have done this for you.
+The methods in DECOMPRESS will have done this for you.
C. BUILD
@@ -185,20 +192,19 @@ Specificly the "Commpress & Translate" listing
( http://hyperarchive.lcs.mit.edu/HyperArchive/Abstracts/cmp/HyperArchive.html ).
-You can either use the shareware StuffIt Expander
-( http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/stuffit-expander-401.hqx )
+You can either use the shareware B<StuffIt Expander> program
+( http://www.aladdinsys.com/expander/ )
in combination with I<DropStuff with Expander Enhancer>
-( http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/drop-stuff-with-ee-40.hqx )
-or the freeware MacGzip (
+( http://www.aladdinsys.com/dropstuff/ )
+or the freeware B<MacGzip> program (
http://persephone.cps.unizar.es/general/gente/spd/gzip/gzip.html ).
B. UNPACK
If you're using DropStuff or Stuffit, you can just extract the tar
-archive. Otherwise, you can use the freeware I<suntar>
-( http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/suntar-221.hqx )
-or I<Tar> ( http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/tar-40b.hqx ).
+archive. Otherwise, you can use the freeware B<suntar> or I<Tar> (
+http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/ ).
C. BUILD
@@ -208,9 +214,9 @@ Does the module require compilation?
Overview: You need MPW and a combination of new and old CodeWarrior
compilers for MPW and libraries. Makefiles created for building under
-MPW use the Metrowerks compilers. It's most likely possible to build
+MPW use Metrowerks compilers. It's most likely possible to build
without other compilers, but it has not been done successfully, to our
-knowledge. Read the documentation in MacPerl: Power and Ease (
+knowledge. Read the documentation in I<MacPerl: Power and Ease> (
http://www.ptf.com/macperl/ ) on porting/building extensions, or find
an existing precompiled binary, or hire someone to build it for you.
@@ -226,9 +232,10 @@ Make sure the newlines for the modules are in Mac format, not Unix format.
If they are not then you might have decompressed them incorrectly. Check
your decompression and unpacking utilities settings to make sure they are
translating text files properly.
-As a last resort, you can use the perl one-liner:
- perl -i.bak -pe 's/(?:\015)?\012/\015/g' filenames
+As a last resort, you can use the perl one-liner:
+
+ perl -i.bak -pe 's/(?:\015)?\012/\015/g' <filenames>
on the source files.
@@ -275,7 +282,7 @@ Go into the newly-created directory and type:
make
make test
-You will need the packages mentioned in C<Readme.dos>
+You will need the packages mentioned in F<README.dos>
in the Perl distribution.
D. INSTALL
@@ -283,8 +290,8 @@ in the Perl distribution.
While still in that directory, type:
make install
-
-You will need the packages mentioned in Readme.dos in the Perl distribution.
+
+You will need the packages mentioned in F<README.dos> in the Perl distribution.
=item *
@@ -298,8 +305,8 @@ the instructions for Unix.
B<If you're on VMS,>
-When downloading from CPAN, save your file with a C<.tgz>
-extension instead of C<.tar.gz>. All other periods in the
+When downloading from CPAN, save your file with a F<.tgz>
+extension instead of F<.tar.gz>. All other periods in the
filename should be replaced with underscores. For example,
C<Your-Module-1.33.tar.gz> should be downloaded as
C<Your-Module-1_33.tgz>.
@@ -315,8 +322,8 @@ or, for zipped modules, type
unzip Your-Module.zip
Executables for gzip, zip, and VMStar ( Alphas:
-http://www.openvms.digital.com/cd/000TOOLS/ALPHA/ and Vaxen:
-http://www.openvms.digital.com/cd/000TOOLS/VAX/ ).
+http://www.openvms.digital.com/freeware/000TOOLS/ALPHA/ and Vaxen:
+http://www.openvms.digital.com/freeware/000TOOLS/VAX/ ).
gzip and tar
are also available at ftp://ftp.digital.com/pub/VMS.
@@ -361,7 +368,7 @@ Substitute C<mmk> for C<mms> above if you're using MMK.
B<If you're on MVS>,
-Introduce the .tar.gz file into an HFS as binary; don't translate from
+Introduce the F<.tar.gz> file into an HFS as binary; don't translate from
ASCII to EBCDIC.
A. DECOMPRESS
diff --git a/contrib/perl5/pod/perlmodlib.pod b/contrib/perl5/pod/perlmodlib.pod
index d6c6b32..b42a2d8 100644
--- a/contrib/perl5/pod/perlmodlib.pod
+++ b/contrib/perl5/pod/perlmodlib.pod
@@ -6,102 +6,141 @@ perlmodlib - constructing new Perl modules and finding existing ones
=head1 THE PERL MODULE LIBRARY
-A number of modules are included the Perl distribution. These are
-described below, and all end in F<.pm>. You may also discover files in
-the library directory that end in either F<.pl> or F<.ph>. These are old
-libraries supplied so that old programs that use them still run. The
-F<.pl> files will all eventually be converted into standard modules, and
-the F<.ph> files made by B<h2ph> will probably end up as extension modules
-made by B<h2xs>. (Some F<.ph> values may already be available through the
-POSIX module.) The B<pl2pm> file in the distribution may help in your
-conversion, but it's just a mechanical process and therefore far from
-bulletproof.
+Many modules are included the Perl distribution. These are described
+below, and all end in F<.pm>. You may discover compiled library
+file (usually ending in F<.so>) or small pieces of modules to be
+autoloaded (ending in F<.al>); these were automatically generated
+by the installation process. You may also discover files in the
+library directory that end in either F<.pl> or F<.ph>. These are
+old libraries supplied so that old programs that use them still
+run. The F<.pl> files will all eventually be converted into standard
+modules, and the F<.ph> files made by B<h2ph> will probably end up
+as extension modules made by B<h2xs>. (Some F<.ph> values may
+already be available through the POSIX, Errno, or Fcntl modules.)
+The B<pl2pm> file in the distribution may help in your conversion,
+but it's just a mechanical process and therefore far from bulletproof.
=head2 Pragmatic Modules
-They work somewhat like pragmas in that they tend to affect the compilation of
-your program, and thus will usually work well only when used within a
-C<use>, or C<no>. Most of these are lexically scoped, so an inner BLOCK
-may countermand any of these by saying:
+They work somewhat like compiler directives (pragmata) in that they
+tend to affect the compilation of your program, and thus will usually
+work well only when used within a C<use>, or C<no>. Most of these
+are lexically scoped, so an inner BLOCK may countermand them
+by saying:
no integer;
no strict 'refs';
+ no warnings;
which lasts until the end of that BLOCK.
-Unlike the pragmas that effect the C<$^H> hints variable, the C<use
-vars> and C<use subs> declarations are not BLOCK-scoped. They allow
-you to predeclare a variables or subroutines within a particular
-I<file> rather than just a block. Such declarations are effective
-for the entire file for which they were declared. You cannot rescind
-them with C<no vars> or C<no subs>.
+Some pragmas are lexically scoped--typically those that affect the
+C<$^H> hints variable. Others affect the current package instead,
+like C<use vars> and C<use subs>, which allow you to predeclare a
+variables or subroutines within a particular I<file> rather than
+just a block. Such declarations are effective for the entire file
+for which they were declared. You cannot rescind them with C<no
+vars> or C<no subs>.
The following pragmas are defined (and have their own documentation).
=over 12
-=item use autouse MODULE => qw(sub1 sub2 sub3)
+=item attributes
-Defers C<require MODULE> until someone calls one of the specified
-subroutines (which must be exported by MODULE). This pragma should be
-used with caution, and only when necessary.
+Get/set subroutine or variable attributes
+
+=item attrs
+
+Set/get attributes of a subroutine (deprecated)
+
+=item autouse
+
+Postpone load of modules until a function is used
+
+=item base
+
+Establish IS-A relationship with base class at compile time
=item blib
-manipulate @INC at compile time to use MakeMaker's uninstalled version
-of a package
+Use MakeMaker's uninstalled version of a package
+
+=item caller
+
+Inherit pragmatic attributes from caller's context
+
+=item charnames
+
+Define character names for C<\N{named}> string literal escape.
+
+=item constant
+
+Declare constants
=item diagnostics
-force verbose warning diagnostics
+Force verbose warning diagnostics
+
+=item fields
+
+Declare a class's attribute fields at compile-time
+
+=item filetest
+
+Control the filetest operators like C<-r>, C<-w> for AFS, etc.
=item integer
-compute arithmetic in integer instead of double
+Compute arithmetic in integer instead of double
=item less
-request less of something from the compiler
+Request less of something from the compiler (unimplemented)
=item lib
-manipulate @INC at compile time
+Manipulate @INC at compile time
=item locale
-use or ignore current locale for builtin operations (see L<perllocale>)
+Use or avoid POSIX locales for built-in operations
=item ops
-restrict named opcodes when compiling or running Perl code
+Restrict unsafe operations when compiling
=item overload
-overload basic Perl operations
+Overload Perl operations
=item re
-alter behaviour of regular expressions
+Alter regular expression behavior
=item sigtrap
-enable simple signal handling
+Enable simple signal handling
=item strict
-restrict unsafe constructs
+Restrict unsafe constructs
=item subs
-predeclare sub names
+Predeclare subroutine names
-=item vmsish
+=item utf8
-adopt certain VMS-specific behaviors
+Turn on UTF-8 and Unicode support
=item vars
-predeclare global variable names
+Predeclare global variable names (obsoleted by our())
+
+=item warnings
+
+Control optional warnings
=back
@@ -115,211 +154,399 @@ Exporter module. See their own documentation for details.
=item AnyDBM_File
-provide framework for multiple DBMs
+Provide framework for multiple DBM libraries
=item AutoLoader
-load functions only on demand
+Load subroutines only on demand
=item AutoSplit
-split a package for autoloading
+Split a package for autoloading
+
+=item B
+
+Guts of the Perl code generator (aka compiler)
+
+=item B::Asmdata
+
+Autogenerated data about Perl ops, used to generate bytecode
+
+=item B::Assembler
+
+Assemble Perl bytecode
+
+=item B::Bblock
+
+Walk basic blocks
+
+=item B::Bytecode
+
+Perl compiler's bytecode backend
+
+=item B::C
+
+Perl compiler's C backend
+
+=item B::CC
+
+Perl compiler's optimized C translation backend
+
+=item B::Debug
+
+Walk Perl syntax tree, printing debug info about ops
+
+=item B::Deparse
+
+Perl compiler backend to produce Perl code
+
+=item B::Disassembler
+
+Disassemble Perl bytecode
+
+=item B::Lint
+
+Module to catch dubious constructs
+
+=item B::Showlex
+
+Show lexical variables used in functions or files
+
+=item B::Stackobj
+
+Helper module for CC backend
+
+B::Stash -- XXX NFI XXX
+
+=item B::Terse
+
+Walk Perl syntax tree, printing terse info about ops
+
+=item B::Xref
+
+Generates cross reference reports for Perl programs
=item Benchmark
-benchmark running times of code
+Benchmark running times of code
+
+=item ByteLoader
+
+Load byte-compiled Perl code
+
+=item CGI
+
+Simple Common Gateway Interface class
+
+=item CGI::Apache
+
+Make things work with CGI.pm against Perl-Apache API
+
+=item CGI::Carp
+
+CGI routines for writing to the HTTPD (or other) error log
+
+=item CGI::Cookie
+
+Interface to Netscape Cookies
+
+=item CGI::Fast
+
+CGI Interface for Fast CGI
+
+=item CGI::Pretty
+
+Module to produce nicely formatted HTML code
+
+=item CGI::Push
+
+Simple Interface to Server Push
+
+=item CGI::Switch
+
+Try more than one constructors and return the first object available
=item CPAN
-interface to Comprehensive Perl Archive Network
+Query, download, and build Perl modules from CPAN sites
=item CPAN::FirstTime
-create a CPAN configuration file
+Utility for CPAN::Config file initialization
=item CPAN::Nox
-run CPAN while avoiding compiled extensions
+Wrapper around CPAN.pm without using any XS module
=item Carp
-warn of errors (from perspective of caller)
+Act like warn/die from perspective of caller
+
+=item Carp::Heavy
+
+Carp guts
=item Class::Struct
-declare struct-like datatypes
+Declare struct-like datatypes as Perl classes
=item Config
-access Perl configuration information
+Access Perl configuration information
=item Cwd
-get pathname of current working directory
+Get pathname of current working directory
+
+=item DB
+
+Programmatic interface to the Perl debugging API (experimental)
=item DB_File
-access to Berkeley DB
+Perl5 access to Berkeley DB version 1.x
+
+=item Data::Dumper
+
+Serialize Perl data structures
+
+=item Devel::DProf
+
+A Perl execution profiler
+
+=item Devel::Peek
+
+A data debugging tool for the XS programmer
=item Devel::SelfStubber
-generate stubs for a SelfLoading module
+Generate stubs for a SelfLoading module
=item DirHandle
-supply object methods for directory handles
+Supply object methods for directory handles
+
+=item Dumpvalue
+
+Provide screen dump of Perl data
=item DynaLoader
-dynamically load C libraries into Perl code
+Dynamically load C libraries into Perl code
=item English
-use nice English (or awk) names for ugly punctuation variables
+Use English (or awk) names for ugly punctuation variables
=item Env
-import environment variables
+Access environment variables as regular ones
+
+=item Errno
+
+Load the libc errno.h defines
=item Exporter
-implements default import method for modules
+Implement default import method for modules
+
+=item Exporter::Heavy
+
+Exporter guts
+
+=item ExtUtils::Command
+
+Utilities to replace common Unix commands in Makefiles etc.
=item ExtUtils::Embed
-utilities for embedding Perl in C/C++ applications
+Utilities for embedding Perl in C/C++ programs
=item ExtUtils::Install
-install files from here to there
+Install files from here to there
+
+=item ExtUtils::Installed
+
+Inventory management of installed modules
=item ExtUtils::Liblist
-determine libraries to use and how to use them
+Determine libraries to use and how to use them
+
+=item ExtUtils::MM_Cygwin
+
+Methods to override Unix behavior in ExtUtils::MakeMaker
=item ExtUtils::MM_OS2
-methods to override Unix behaviour in ExtUtils::MakeMaker
+Methods to override Unix behavior in ExtUtils::MakeMaker
=item ExtUtils::MM_Unix
-methods used by ExtUtils::MakeMaker
+Methods used by ExtUtils::MakeMaker
=item ExtUtils::MM_VMS
-methods to override Unix behaviour in ExtUtils::MakeMaker
+Methods to override Unix behavior in ExtUtils::MakeMaker
+
+=item ExtUtils::MM_Win32
+
+Methods to override Unix behavior in ExtUtils::MakeMaker
=item ExtUtils::MakeMaker
-create an extension Makefile
+Create an extension Makefile
=item ExtUtils::Manifest
-utilities to write and check a MANIFEST file
+Utilities to write and check a MANIFEST file
+
+ExtUtils::Miniperl, writemain - Write the C code for perlmain.c
=item ExtUtils::Mkbootstrap
-make a bootstrap file for use by DynaLoader
+Make a bootstrap file for use by DynaLoader
=item ExtUtils::Mksymlists
-write linker options files for dynamic extension
+Write linker options files for dynamic extension
+
+=item ExtUtils::Packlist
+
+Manage .packlist files
=item ExtUtils::testlib
-add blib/* directories to @INC
+Add blib/* directories to @INC
=item Fatal
-make errors in builtins or Perl functions fatal
+Replace functions with equivalents which succeed or die
=item Fcntl
-load the C Fcntl.h defines
+Load the libc fcntl.h defines
=item File::Basename
-split a pathname into pieces
+Split a pathname into pieces
=item File::CheckTree
-run many filetest checks on a tree
+Run many filetest checks on a tree
=item File::Compare
-compare files or filehandles
+Compare files or filehandles
=item File::Copy
-copy files or filehandles
+Copy files or filehandles
+
+=item File::DosGlob
+
+DOS-like globbing and then some
=item File::Find
-traverse a file tree
+Traverse a file tree
+
+=item File::Glob
+
+Perl extension for BSD filename globbing
=item File::Path
-create or remove a series of directories
+Create or remove a series of directories
=item File::Spec
-portably perform operations on file names
+Portably perform operations on file names
=item File::Spec::Functions
-function call interface to File::Spec module
+Portably perform operations on file names
+
+=item File::Spec::Mac
+
+File::Spec for MacOS
+
+=item File::Spec::OS2
+
+Methods for OS/2 file specs
+
+=item File::Spec::Unix
+
+Methods used by File::Spec
+
+=item File::Spec::VMS
+
+Methods for VMS file specs
+
+=item File::Spec::Win32
+
+Methods for Win32 file specs
=item File::stat
-by-name interface to Perl's builtin stat() functions
+By-name interface to Perl's built-in stat() functions
=item FileCache
-keep more files open than the system permits
+Keep more files open than the system permits
=item FileHandle
-supply object methods for filehandles
+Supply object methods for filehandles
=item FindBin
-locate directory of original Perl script
+Locate installation directory of running Perl program
=item GDBM_File
-access to the gdbm library
+Access to the gdbm library
=item Getopt::Long
-extended processing of command line options
+Extended processing of command line options
=item Getopt::Std
-process single-character switches with switch clustering
+Process single-character switches with switch clustering
=item I18N::Collate
-compare 8-bit scalar data according to the current locale
+Compare 8-bit scalar data according to current locale
=item IO
-load various IO modules
+Front-end to load various IO modules
+
+=item IO::Dir
+
+Supply object methods for directory handles
=item IO::File
-supply object methods for filehandles
+Supply object methods for filehandles
=item IO::Handle
-supply object methods for I/O handles
+Supply object methods for I/O handles
=item IO::Pipe
-supply object methods for pipes
+Supply object methods for pipes
+
+=item IO::Poll
+
+Object interface to system poll call
=item IO::Seekable
-supply seek based methods for I/O objects
+Supply seek based methods for I/O objects
=item IO::Select
@@ -327,219 +554,297 @@ OO interface to the select system call
=item IO::Socket
-object interface to socket communications
+Object interface to socket communications
+
+=item IO::Socket::INET
+
+Object interface for AF_INET domain sockets
+
+=item IO::Socket::UNIX
+
+Object interface for AF_UNIX domain sockets
+
+=item IPC::Msg
+
+SysV Msg IPC object class
=item IPC::Open2
-open a process for both reading and writing
+Open a process for both reading and writing
=item IPC::Open3
-open a process for reading, writing, and error handling
+Open a process for reading, writing, and error handling
+
+=item IPC::Semaphore
+
+SysV Semaphore IPC object class
+
+=item IPC::SysV
+
+SysV IPC constants
=item Math::BigFloat
-arbitrary length float math package
+Arbitrary length float math package
=item Math::BigInt
-arbitrary size integer math package
+Arbitrary size integer math package
=item Math::Complex
-complex numbers and associated mathematical functions
+Complex numbers and associated mathematical functions
=item Math::Trig
-simple interface to parts of Math::Complex for those who
-need trigonometric functions only for real numbers
-
-=item NDBM_File
-
-tied access to ndbm files
+Trigonometric functions
=item Net::Ping
-Hello, anybody home?
+Check a remote host for reachability
=item Net::hostent
-by-name interface to Perl's builtin gethost*() functions
+By-name interface to Perl's built-in gethost*() functions
=item Net::netent
-by-name interface to Perl's builtin getnet*() functions
+By-name interface to Perl's built-in getnet*() functions
=item Net::protoent
-by-name interface to Perl's builtin getproto*() functions
+By-name interface to Perl's built-in getproto*() functions
=item Net::servent
-by-name interface to Perl's builtin getserv*() functions
+By-name interface to Perl's built-in getserv*() functions
+
+=item O
+
+Generic interface to Perl Compiler backends
=item Opcode
-disable named opcodes when compiling or running Perl code
+Disable named opcodes when compiling Perl code
+
+=item POSIX
+
+Perl interface to IEEE Std 1003.1
+
+=item Pod::Checker
+
+Check pod documents for syntax errors
+
+=item Pod::Html
+
+Module to convert pod files to HTML
+
+=item Pod::InputObjects
+
+Manage POD objects
+
+=item Pod::Man
+
+Convert POD data to formatted *roff input
+
+=item Pod::Parser
+
+Base class for creating POD filters and translators
+
+=item Pod::Select
+
+Extract selected sections of POD from input
=item Pod::Text
-convert POD data to formatted ASCII text
+Convert POD data to formatted ASCII text
-=item POSIX
+=item Pod::Text::Color
+
+Convert POD data to formatted color ASCII text
+
+=item Pod::Usage
-interface to IEEE Standard 1003.1
+Print a usage message from embedded pod documentation
=item SDBM_File
-tied access to sdbm files
+Tied access to sdbm files
=item Safe
-compile and execute code in restricted compartments
+Compile and execute code in restricted compartments
=item Search::Dict
-search for key in dictionary file
+Search for key in dictionary file
=item SelectSaver
-save and restore selected file handle
+Save and restore selected file handle
=item SelfLoader
-load functions only on demand
+Load functions only on demand
=item Shell
-run shell commands transparently within Perl
+Run shell commands transparently within Perl
=item Socket
-load the C socket.h defines and structure manipulators
+Load the libc socket.h defines and structure manipulators
=item Symbol
-manipulate Perl symbols and their names
+Manipulate Perl symbols and their names
=item Sys::Hostname
-try every conceivable way to get hostname
+Try every conceivable way to get hostname
=item Sys::Syslog
-interface to the Unix syslog(3) calls
+Interface to the libc syslog(3) calls
=item Term::Cap
-termcap interface
+Termcap interface
=item Term::Complete
-word completion module
+Word completion module
=item Term::ReadLine
-interface to various C<readline> packages
+Interface to various `readline' packages.
+
+=item Test
+
+Provides a simple framework for writing test scripts
=item Test::Harness
-run Perl standard test scripts with statistics
+Run Perl standard test scripts with statistics
=item Text::Abbrev
-create an abbreviation table from a list
+Create an abbreviation table from a list
=item Text::ParseWords
-parse text into an array of tokens
+Parse text into a list of tokens or array of arrays
=item Text::Soundex
-implementation of the Soundex Algorithm as described by Knuth
+Implementation of the Soundex Algorithm as described by Knuth
-=item Text::Tabs
-
-expand and unexpand tabs per the Unix expand(1) and unexpand(1)
+Text::Tabs -- expand and unexpand tabs per expand(1) and unexpand(1)
=item Text::Wrap
-line wrapping to form simple paragraphs
+Line wrapping to form simple paragraphs
+
+=item Tie::Array
+
+Base class for tied arrays
+
+=item Tie::Handle
+
+Base class definitions for tied handles
=item Tie::Hash
-base class definitions for tied hashes
+Base class definitions for tied hashes
=item Tie::RefHash
-base class definitions for tied hashes with references as keys
+Use references as hash keys
=item Tie::Scalar
-base class definitions for tied scalars
+Base class definitions for tied scalars
=item Tie::SubstrHash
-fixed-table-size, fixed-key-length hashing
+Fixed-table-size, fixed-key-length hashing
=item Time::Local
-efficiently compute time from local and GMT time
+Efficiently compute time from local and GMT time
=item Time::gmtime
-by-name interface to Perl's builtin gmtime() function
+By-name interface to Perl's built-in gmtime() function
=item Time::localtime
-by-name interface to Perl's builtin localtime() function
+By-name interface to Perl's built-in localtime() function
=item Time::tm
-internal object used by Time::gmtime and Time::localtime
+Internal object used by Time::gmtime and Time::localtime
=item UNIVERSAL
-base class for ALL classes (blessed references)
+Base class for ALL classes (blessed references)
=item User::grent
-by-name interface to Perl's builtin getgr*() functions
+By-name interface to Perl's built-in getgr*() functions
=item User::pwent
-by-name interface to Perl's builtin getpw*() functions
+By-name interface to Perl's built-in getpw*() functions
=back
-To find out I<all> the modules installed on your system, including
-those without documentation or outside the standard release, do this:
+To find out I<all> modules installed on your system, including
+those without documentation or outside the standard release,
+just do this:
% find `perl -e 'print "@INC"'` -name '*.pm' -print
-They should all have their own documentation installed and accessible via
-your system man(1) command. If that fails, try the I<perldoc> program.
+To get a log of all module distributions which have been installed
+since perl was installed, just do:
+
+ % perldoc perllocal
+
+Modules should all have their own documentation installed and accessible
+via your system man(1) command, or via the C<perldoc> program. If you do
+not have a B<find>
+program, you can use the Perl B<find2perl> program instead, which
+generates Perl code as output you can run through perl. If you
+have a B<man> program but it doesn't find your modules, you'll have
+to fix your manpath. See L<perl> for details.
=head2 Extension Modules
-Extension modules are written in C (or a mix of Perl and C) and may be
-statically linked or in general are
-dynamically loaded into Perl if and when you need them. Supported
-extension modules include the Socket, Fcntl, and POSIX modules.
+Extension modules are written in C (or a mix of Perl and C). They
+are usually dynamically loaded into Perl if and when you need them,
+but may also be be linked in statically. Supported extension modules
+include Socket, Fcntl, and POSIX.
Many popular C extension modules do not come bundled (at least, not
-completely) due to their sizes, volatility, or simply lack of time for
-adequate testing and configuration across the multitude of platforms on
-which Perl was beta-tested. You are encouraged to look for them in
-archie(1L), the Perl FAQ or Meta-FAQ, the WWW page, and even with their
-authors before randomly posting asking for their present condition and
-disposition.
+completely) due to their sizes, volatility, or simply lack of time
+for adequate testing and configuration across the multitude of
+platforms on which Perl was beta-tested. You are encouraged to
+look for them on CPAN (described below), or using web search engines
+like Alta Vista or Deja News.
=head1 CPAN
-CPAN stands for the Comprehensive Perl Archive Network. This is a globally
-replicated collection of all known Perl materials, including hundreds
-of unbundled modules. Here are the major categories of modules:
+CPAN stands for Comprehensive Perl Archive Network; it's a globally
+replicated trove of Perl materials, including documentation, style
+guides, tricks and trap, alternate ports to non-Unix systems and
+occasional binary distributions for these. Search engines for
+CPAN can be found at http://cpan.perl.com/ and at
+http://theory.uwinnipeg.ca/mod_perl/cpan-search.pl .
+
+Most importantly, CPAN includes around a thousand unbundled modules,
+some of which require a C compiler to build. Major categories of
+modules are:
=over
@@ -608,146 +913,175 @@ Miscellaneous Modules
=back
-The registered CPAN sites as of this writing include the following.
+Registered CPAN sites as of this writing include the following.
You should try to choose one close to you:
=over
-=item *
-Africa
+=item Africa
- South Africa ftp://ftp.is.co.za/programming/perl/CPAN/
+ South Africa ftp://ftp.is.co.za/programming/perl/CPAN/
+ ftp://ftp.saix.net/pub/CPAN/
+ ftp://ftp.sun.ac.za/CPAN/
ftp://ftpza.co.za/pub/mirrors/cpan/
-=item *
-Asia
- Armenia ftp://sunsite.aua.am/pub/CPAN/
- China ftp://freesoft.cei.gov.cn/pub/languages/perl/CPAN/
- Hong Kong ftp://ftp.hkstar.com/pub/CPAN/
- Israel ftp://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
- Japan ftp://ftp.dti.ad.jp/pub/lang/CPAN/
+=item Asia
+
+ China ftp://freesoft.cei.gov.cn/pub/languages/perl/CPAN/
+ Hong Kong ftp://ftp.pacific.net.hk/pub/mirror/CPAN/
+ Indonesia ftp://malone.piksi.itb.ac.id/pub/CPAN/
+ Israel ftp://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+ Japan ftp://ftp.dti.ad.jp/pub/lang/CPAN/
ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/
ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/
ftp://ftp.meisei-u.ac.jp/pub/CPAN/
+ ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
ftp://mirror.nucba.ac.jp/mirror/Perl/
- Singapore ftp://ftp.nus.edu.sg/pub/unix/perl/CPAN/
- South Korea ftp://ftp.bora.net/pub/CPAN/
+ Saudi-Arabia ftp://ftp.isu.net.sa/pub/CPAN/
+ Singapore ftp://ftp.nus.edu.sg/pub/unix/perl/CPAN/
+ South Korea ftp://ftp.bora.net/pub/CPAN/
+ ftp://ftp.kornet.net/pub/CPAN/
ftp://ftp.nuri.net/pub/CPAN/
- Taiwan ftp://ftp.wownet.net/pub2/PERL/
+ Taiwan ftp://coda.nctu.edu.tw/computer-languages/perl/CPAN/
+ ftp://ftp.ee.ncku.edu.tw/pub3/perl/CPAN/
ftp://ftp1.sinica.edu.tw/pub1/perl/CPAN/
- Thailand ftp://ftp.cs.riubon.ac.th/pub/mirrors/CPAN/
- ftp://ftp.nectec.or.th/pub/mirrors/CPAN/
+ Thailand ftp://ftp.nectec.or.th/pub/mirrors/CPAN/
-=item *
-Australasia
- Australia ftp://cpan.topend.com.au/pub/CPAN/
- ftp://ftp.labyrinth.net.au/pub/perl/CPAN/
+=item Australasia
+
+ Australia ftp://cpan.topend.com.au/pub/CPAN/
+ ftp://ftp.labyrinth.net.au/pub/perl-CPAN/
ftp://ftp.sage-au.org.au/pub/compilers/perl/CPAN/
ftp://mirror.aarnet.edu.au/pub/perl/CPAN/
- New Zealand ftp://ftp.auckland.ac.nz/pub/perl/CPAN/
+ New Zealand ftp://ftp.auckland.ac.nz/pub/perl/CPAN/
ftp://sunsite.net.nz/pub/languages/perl/CPAN/
-=item *
-Central America
- Costa Rica ftp://ftp.ucr.ac.cr/pub/Unix/CPAN/
+=item Central America
-=item *
-Europe
+ Costa Rica ftp://ftp.ucr.ac.cr/pub/Unix/CPAN/
+
+
+=item Europe
- Austria ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/
- Belgium ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/
- Bulgaria ftp://ftp.ntrl.net/pub/mirrors/CPAN/
- Croatia ftp://ftp.linux.hr/pub/CPAN/
- Czech Republic ftp://ftp.fi.muni.cz/pub/perl/
+ Austria ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/
+ Belgium ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/
+ Bulgaria ftp://ftp.ntrl.net/pub/mirrors/CPAN/
+ Croatia ftp://ftp.linux.hr/pub/CPAN/
+ Czech Republic ftp://ftp.fi.muni.cz/pub/perl/
ftp://sunsite.mff.cuni.cz/Languages/Perl/CPAN/
- Denmark ftp://sunsite.auc.dk/pub/languages/perl/CPAN/
- Estonia ftp://ftp.ut.ee/pub/languages/perl/CPAN/
- Finland ftp://ftp.funet.fi/pub/languages/perl/CPAN/
- France ftp://ftp.lip6.fr/pub/perl/CPAN/
+ Denmark ftp://sunsite.auc.dk/pub/languages/perl/CPAN/
+ Estonia ftp://ftp.ut.ee/pub/languages/perl/CPAN/
+ Finland ftp://ftp.funet.fi/pub/languages/perl/CPAN/
+ France ftp://ftp.grolier.fr/pub/perl/CPAN/
+ ftp://ftp.lip6.fr/pub/perl/CPAN/
ftp://ftp.oleane.net/pub/mirrors/CPAN/
ftp://ftp.pasteur.fr/pub/computing/CPAN/
- Germany ftp://ftp.archive.de.uu.net/pub/CPAN/
+ ftp://ftp.uvsq.fr/pub/perl/CPAN/
+ German ftp://ftp.gigabell.net/pub/CPAN/
+ Germany ftp://ftp.archive.de.uu.net/pub/CPAN/
+ ftp://ftp.freenet.de/pub/ftp.cpan.org/pub/
+ ftp://ftp.gmd.de/packages/CPAN/
+ ftp://ftp.gwdg.de/pub/languages/perl/CPAN/
+ ftp://ftp.leo.org/pub/comp/general/programming/languages/script/perl/CPAN/
+ ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/
+ ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/
+ ftp://ftp.uni-erlangen.de/pub/source/CPAN/
+ ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/
+ Germany ftp://ftp.archive.de.uu.net/pub/CPAN/
+ ftp://ftp.freenet.de/pub/ftp.cpan.org/pub/
ftp://ftp.gmd.de/packages/CPAN/
ftp://ftp.gwdg.de/pub/languages/perl/CPAN/
- ftp://ftp.leo.org/pub/comp/programming/languages/script/perl/CPAN/
+ ftp://ftp.leo.org/pub/comp/general/programming/languages/script/perl/CPAN/
ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/
ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/
ftp://ftp.uni-erlangen.de/pub/source/CPAN/
ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/
- Greece ftp://ftp.ntua.gr/pub/lang/perl/
- Hungary ftp://ftp.kfki.hu/pub/packages/perl/CPAN/
- Ireland ftp://sunsite.compapp.dcu.ie/pub/perl/
- Italy ftp://cis.uniRoma2.it/CPAN/
+ Greece ftp://ftp.ntua.gr/pub/lang/perl/
+ Hungary ftp://ftp.kfki.hu/pub/packages/perl/CPAN/
+ Iceland ftp://ftp.gm.is/pub/CPAN/
+ Ireland ftp://cpan.indigo.ie/pub/CPAN/
+ ftp://sunsite.compapp.dcu.ie/pub/perl/
+ Italy ftp://cis.uniRoma2.it/CPAN/
ftp://ftp.flashnet.it/pub/CPAN/
+ ftp://ftp.unina.it/pub/Other/CPAN/
ftp://ftp.unipi.it/pub/mirror/perl/CPAN/
- Netherlands ftp://ftp.cs.uu.nl/mirror/CPAN/
+ Netherlands ftp://ftp.cs.uu.nl/mirror/CPAN/
ftp://ftp.nluug.nl/pub/languages/perl/CPAN/
- Norway ftp://ftp.uit.no/pub/languages/perl/cpan/
+ Norway ftp://ftp.uit.no/pub/languages/perl/cpan/
ftp://sunsite.uio.no/pub/languages/perl/CPAN/
- Poland ftp://ftp.man.szczecin.pl/pub/perl/CPAN/
- ftp://ftp.man.torun.pl/pub/doc/CPAN/
+ Poland ftp://ftp.man.torun.pl/pub/CPAN/
ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/
ftp://sunsite.icm.edu.pl/pub/CPAN/
- Portugal ftp://ftp.ci.uminho.pt/pub/mirrors/cpan/
+ Portugal ftp://ftp.ci.uminho.pt/pub/mirrors/cpan/
+ ftp://ftp.ist.utl.pt/pub/CPAN/
ftp://ftp.ua.pt/pub/CPAN/
- Romania ftp://ftp.dntis.ro/pub/mirrors/perl-cpan/
- ftp://ftp.dnttm.ro/pub/CPAN/
- Russia ftp://cpan.npi.msu.su/CPAN/
+ Romania ftp://ftp.dnttm.ro/pub/CPAN/
+ Russia ftp://ftp.chg.ru/pub/lang/perl/CPAN/
ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/
- Slovakia ftp://ftp.entry.sk/pub/languages/perl/CPAN/
- Slovenia ftp://ftp.arnes.si/software/perl/CPAN/
- Spain ftp://ftp.etse.urv.es/pub/perl/
+ Slovakia ftp://ftp.entry.sk/pub/languages/perl/CPAN/
+ Slovenia ftp://ftp.arnes.si/software/perl/CPAN/
+ Spain ftp://ftp.etse.urv.es/pub/perl/
ftp://ftp.rediris.es/mirror/CPAN/
- Sweden ftp://ftp.sunet.se/pub/lang/perl/CPAN/
- Switzerland ftp://sunsite.cnlab-switch.ch/mirror/CPAN/
- Turkey ftp://sunsite.bilkent.edu.tr/pub/languages/CPAN/
- United Kingdom ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/
+ Sweden ftp://ftp.sunet.se/pub/lang/perl/CPAN/
+ Switzerland ftp://sunsite.cnlab-switch.ch/mirror/CPAN/
+ Turkey ftp://sunsite.bilkent.edu.tr/pub/languages/CPAN/
+ United Kingdom ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/
ftp://ftp.flirble.org/pub/languages/perl/CPAN/
+ ftp://ftp.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN/
ftp://ftp.plig.org/pub/CPAN/
ftp://sunsite.doc.ic.ac.uk/packages/CPAN/
- ftp://unix.hensa.ac.uk/mirrors/perl-CPAN/
-=item *
-North America
-
- Alberta ftp://sunsite.ualberta.ca/pub/Mirror/CPAN/
- California ftp://ftp.cdrom.com/pub/perl/CPAN/
- ftp://ftp.digital.com/pub/plan/perl/CPAN/
- Colorado ftp://ftp.cs.colorado.edu/pub/perl/CPAN/
- Florida ftp://ftp.cise.ufl.edu/pub/perl/CPAN/
- Illinois ftp://uiarchive.uiuc.edu/pub/lang/perl/CPAN/
- Indiana ftp://csociety-ftp.ecn.purdue.edu/pub/CPAN/
+
+=item North America
+
+ Alberta ftp://sunsite.ualberta.ca/pub/Mirror/CPAN/
+ California ftp://cpan.nas.nasa.gov/pub/perl/CPAN/
+ ftp://cpan.valueclick.com/CPAN/
+ ftp://ftp.cdrom.com/pub/perl/CPAN/
+ http://download.sourceforge.net/mirrors/CPAN/
+ Colorado ftp://ftp.cs.colorado.edu/pub/perl/CPAN/
+ Florida ftp://ftp.cise.ufl.edu/pub/perl/CPAN/
+ Georgia ftp://ftp.twoguys.org/CPAN/
+ Illinois ftp://uiarchive.uiuc.edu/pub/lang/perl/CPAN/
+ Indiana ftp://csociety-ftp.ecn.purdue.edu/pub/CPAN/
ftp://ftp.uwsg.indiana.edu/pub/perl/CPAN/
- Manitoba ftp://theory.uwinnipeg.ca/pub/CPAN/
- Massachusetts ftp://ftp.ccs.neu.edu/net/mirrors/ftp.funet.fi/pub/languages/perl/CPAN/
+ Kentucky ftp://ftp.uky.edu/CPAN/
+ Manitoba ftp://theoryx5.uwinnipeg.ca/pub/CPAN/
+ Massachusetts ftp://ftp.ccs.neu.edu/net/mirrors/ftp.funet.fi/pub/languages/perl/CPAN/
ftp://ftp.iguide.com/pub/mirrors/packages/perl/CPAN/
- Mexico D.F. ftp://ftp.msg.com.mx/pub/CPAN/
- New York ftp://ftp.rge.com/pub/languages/perl/
- North Carolina ftp://ftp.duke.edu/pub/perl/
- Oklahoma ftp://ftp.ou.edu/mirrors/CPAN/
- Ontario ftp://ftp.crc.ca/pub/packages/perl/CPAN/
- Oregon ftp://ftp.orst.edu/pub/packages/CPAN/
- Pennsylvania ftp://ftp.epix.net/pub/languages/perl/
- Texas ftp://ftp.sedl.org/pub/mirrors/CPAN/
- Utah ftp://mirror.xmission.com/CPAN/
- Virginia ftp://ftp.perl.org/pub/perl/CPAN/
+ Mexico ftp://ftp.msg.com.mx/pub/CPAN/
+ New York ftp://ftp.deao.net/pub/CPAN/
+ ftp://ftp.rge.com/pub/languages/perl/
+ North Carolina ftp://ftp.duke.edu/pub/perl/
+ Nova Scotia ftp://cpan.chebucto.ns.ca/pub/CPAN/
+ Oklahoma ftp://ftp.ou.edu/mirrors/CPAN/
+ Ontario ftp://ftp.crc.ca/pub/packages/lang/perl/CPAN/
+ Oregon ftp://ftp.orst.edu/pub/packages/CPAN/
+ Pennsylvania ftp://ftp.epix.net/pub/languages/perl/
+ Tennessee ftp://ftp.sunsite.utk.edu/pub/CPAN/
+ Texas ftp://ftp.sedl.org/pub/mirrors/CPAN/
+ ftp://jhcloos.com/pub/mirror/CPAN/
+ Utah ftp://mirror.xmission.com/CPAN/
+ Virginia ftp://ftp.perl.org/pub/perl/CPAN/
ftp://ruff.cs.jmu.edu/pub/CPAN/
- Washington ftp://ftp.spu.edu/pub/CPAN/
+ Washington ftp://ftp-mirror.internap.com/pub/CPAN/
+ ftp://ftp.llarian.net/pub/CPAN/
+ ftp://ftp.spu.edu/pub/CPAN/
-=item *
-South America
- Brazil ftp://cpan.if.usp.br/pub/mirror/CPAN/
- Chile ftp://ftp.ing.puc.cl/pub/unix/perl/CPAN/
- ftp://sunsite.dcc.uchile.cl/pub/Lang/perl/CPAN/
+=item South America
+
+ Brazil ftp://cpan.if.usp.br/pub/mirror/CPAN/
+ ftp://ftp.matrix.com.br/pub/perl/
+ Chile ftp://sunsite.dcc.uchile.cl/pub/Lang/PERL/
=back
For an up-to-date listing of CPAN sites,
-see F<http://www.perl.com/perl/CPAN> or F<ftp://ftp.perl.com/perl/>.
+see http://www.perl.com/perl/CPAN/SITES or ftp://www.perl.com/CPAN/SITES .
=head1 Modules: Creation, Use, and Abuse
@@ -791,6 +1125,10 @@ scheme as the original author.
=item Try to design the new module to be easy to extend and reuse.
+Try to C<use warnings;> (or C<use warnings qw(...);>).
+Remember that you can add C<no warnings qw(...);> to individual blocks
+of code that need less warnings.
+
Use blessed references. Use the two argument form of bless to bless
into the class name given as the first parameter of the constructor,
e.g.,:
@@ -815,12 +1153,12 @@ appropriate. Split large methods into smaller more flexible ones.
Inherit methods from other modules if appropriate.
Avoid class name tests like: C<die "Invalid" unless ref $ref eq 'FOO'>.
-Generally you can delete the "C<eq 'FOO'>" part with no harm at all.
+Generally you can delete the C<eq 'FOO'> part with no harm at all.
Let the objects look after themselves! Generally, avoid hard-wired
class names as far as possible.
-Avoid C<$r-E<gt>Class::func()> where using C<@ISA=qw(... Class ...)> and
-C<$r-E<gt>func()> would work (see L<perlbot> for more details).
+Avoid C<< $r->Class::func() >> where using C<@ISA=qw(... Class ...)> and
+C<< $r->func() >> would work (see L<perlbot> for more details).
Use autosplit so little used or newly added functions won't be a
burden to programs that don't use them. Add test functions to
@@ -829,7 +1167,7 @@ the module after __END__ either using AutoSplit or by saying:
eval join('',<main::DATA>) || die $@ unless caller();
Does your module pass the 'empty subclass' test? If you say
-"C<@SUBCLASS::ISA = qw(YOURCLASS);>" your applications should be able
+C<@SUBCLASS::ISA = qw(YOURCLASS);> your applications should be able
to use SUBCLASS in exactly the same way as YOURCLASS. For example,
does your application still work if you change: C<$obj = new YOURCLASS;>
into: C<$obj = new SUBCLASS;> ?
@@ -838,11 +1176,18 @@ Avoid keeping any state information in your packages. It makes it
difficult for multiple other packages to use yours. Keep state
information in objects.
-Always use B<-w>. Try to C<use strict;> (or C<use strict qw(...);>).
+Always use B<-w>.
+
+Try to C<use strict;> (or C<use strict qw(...);>).
Remember that you can add C<no strict qw(...);> to individual blocks
-of code that need less strictness. Always use B<-w>. Always use B<-w>!
+of code that need less strictness.
+
+Always use B<-w>.
+
Follow the guidelines in the perlstyle(1) manual.
+Always use B<-w>.
+
=item Some simple style guidelines
The perlstyle manual supplied with Perl has many helpful points.
@@ -870,7 +1215,7 @@ or nature of a variable. For example:
$no_caps_here function scope my() or local() variables
Function and method names seem to work best as all lowercase.
-e.g., C<$obj-E<gt>as_string()>.
+e.g., C<< $obj->as_string() >>.
You can use a leading underscore to indicate that a variable or
function should not be used outside the package that defined it.
@@ -886,7 +1231,7 @@ export try to use @EXPORT_OK in preference to @EXPORT and avoid
short or common names to reduce the risk of name clashes.
Generally anything not exported is still accessible from outside the
-module using the ModuleName::item_name (or C<$blessed_ref-E<gt>method>)
+module using the ModuleName::item_name (or C<< $blessed_ref->method >>)
syntax. By convention you can use a leading underscore on names to
indicate informally that they are 'internal' and not for public use.
@@ -1012,7 +1357,7 @@ should store your module's version number in a non-my package
variable called $VERSION. This should be a floating point
number with at least two digits after the decimal (i.e., hundredths,
e.g, C<$VERSION = "0.01">). Don't use a "1.3.2" style version.
-See Exporter.pm in Perl5.001m or later for details.
+See L<Exporter> for details.
It may be handy to add a function or method to retrieve the number.
Use the number in announcements and archive file names when
@@ -1026,7 +1371,7 @@ module (or the module itself if small) to the comp.lang.perl.announce
Usenet newsgroup. This will at least ensure very wide once-off
distribution.
-If possible you should place the module into a major ftp archive and
+If possible, register the module with CPAN. You should
include details of its location in your announcement.
Some notes about ftp archives: Please use a long descriptive file
@@ -1040,16 +1385,17 @@ location.
FTP Archives for Perl Modules:
-Follow the instructions and links on
+Follow the instructions and links on:
- http://franz.ww.tu-berlin.de/modulelist
+ http://www.perl.com/CPAN/modules/00modlist.long.html
+ http://www.perl.com/CPAN/modules/04pause.html
or upload to one of these sites:
- ftp://franz.ww.tu-berlin.de/incoming
- ftp://ftp.cis.ufl.edu/incoming
+ https://pause.kbx.de/pause/
+ http://pause.perl.org/pause/
-and notify <F<upload@franz.ww.tu-berlin.de>>.
+and notify <modules@perl.org>.
By using the WWW interface you can ask the Upload Server to mirror
your modules from your ftp or WWW site into your own directory on
@@ -1061,7 +1407,7 @@ Please remember to send me an updated entry for the Module list!
Always strive to remain compatible with previous released versions.
Otherwise try to add a mechanism to revert to the
-old behaviour if people rely on it. Document incompatible changes.
+old behavior if people rely on it. Document incompatible changes.
=back
@@ -1087,8 +1433,8 @@ it worth it unless you plan to make other changes at the same time?
=item Make the most of the opportunity.
If you are going to convert the script to a module you can use the
-opportunity to redesign the interface. The 'Guidelines for Module
-Creation' above include many of the issues you should consider.
+opportunity to redesign the interface. The guidelines for module
+creation above include many of the issues you should consider.
=item The pl2pm utility will get you started.
diff --git a/contrib/perl5/pod/perlnumber.pod b/contrib/perl5/pod/perlnumber.pod
new file mode 100644
index 0000000..c83e0532
--- /dev/null
+++ b/contrib/perl5/pod/perlnumber.pod
@@ -0,0 +1,185 @@
+=head1 NAME
+
+perlnumber - semantics of numbers and numeric operations in Perl
+
+=head1 SYNOPSIS
+
+ $n = 1234; # decimal integer
+ $n = 0b1110011; # binary integer
+ $n = 01234; # octal integer
+ $n = 0x1234; # hexadecimal integer
+ $n = 12.34e-56; # exponential notation
+ $n = "-12.34e56"; # number specified as a string
+ $n = "1234"; # number specified as a string
+ $n = v49.50.51.52; # number specified as a string, which in
+ # turn is specified in terms of numbers :-)
+
+=head1 DESCRIPTION
+
+This document describes how Perl internally handles numeric values.
+
+Perl's operator overloading facility is completely ignored here. Operator
+overloading allows user-defined behaviors for numbers, such as operations
+over arbitrarily large integers, floating points numbers with arbitrary
+precision, operations over "exotic" numbers such as modular arithmetic or
+p-adic arithmetic, and so on. See L<overload> for details.
+
+=head1 Storing numbers
+
+Perl can internally represent numbers in 3 different ways: as native
+integers, as native floating point numbers, and as decimal strings.
+Decimal strings may have an exponential notation part, as in C<"12.34e-56">.
+I<Native> here means "a format supported by the C compiler which was used
+to build perl".
+
+The term "native" does not mean quite as much when we talk about native
+integers, as it does when native floating point numbers are involved.
+The only implication of the term "native" on integers is that the limits for
+the maximal and the minimal supported true integral quantities are close to
+powers of 2. However, "native" floats have a most fundamental
+restriction: they may represent only those numbers which have a relatively
+"short" representation when converted to a binary fraction. For example,
+0.9 cannot be respresented by a native float, since the binary fraction
+for 0.9 is infinite:
+
+ binary0.1110011001100...
+
+with the sequence C<1100> repeating again and again. In addition to this
+limitation, the exponent of the binary number is also restricted when it
+is represented as a floating point number. On typical hardware, floating
+point values can store numbers with up to 53 binary digits, and with binary
+exponents between -1024 and 1024. In decimal representation this is close
+to 16 decimal digits and decimal exponents in the range of -304..304.
+The upshot of all this is that Perl cannot store a number like
+12345678901234567 as a floating point number on such architectures without
+loss of information.
+
+Similarly, decimal strings can represent only those numbers which have a
+finite decimal expansion. Being strings, and thus of arbitrary length, there
+is no practical limit for the exponent or number of decimal digits for these
+numbers. (But realize that what we are discussing the rules for just the
+I<storage> of these numbers. The fact that you can store such "large" numbers
+does not mean that that the I<operations> over these numbers will use all
+of the significant digits.
+See L<"Numeric operators and numeric conversions"> for details.)
+
+In fact numbers stored in the native integer format may be stored either
+in the signed native form, or in the unsigned native form. Thus the limits
+for Perl numbers stored as native integers would typically be -2**31..2**32-1,
+with appropriate modifications in the case of 64-bit integers. Again, this
+does not mean that Perl can do operations only over integers in this range:
+it is possible to store many more integers in floating point format.
+
+Summing up, Perl numeric values can store only those numbers which have
+a finite decimal expansion or a "short" binary expansion.
+
+=head1 Numeric operators and numeric conversions
+
+As mentioned earlier, Perl can store a number in any one of three formats,
+but most operators typically understand only one of those formats. When
+a numeric value is passed as an argument to such an operator, it will be
+converted to the format understood by the operator.
+
+Six such conversions are possible:
+
+ native integer --> native floating point (*)
+ native integer --> decimal string
+ native floating_point --> native integer (*)
+ native floating_point --> decimal string (*)
+ decimal string --> native integer
+ decimal string --> native floating point (*)
+
+These conversions are governed by the following general rules:
+
+=over
+
+=item *
+
+If the source number can be represented in the target form, that
+representation is used.
+
+=item *
+
+If the source number is outside of the limits representable in the target form,
+a representation of the closest limit is used. (I<Loss of information>)
+
+=item *
+
+If the source number is between two numbers representable in the target form,
+a representation of one of these numbers is used. (I<Loss of information>)
+
+=item *
+
+In C<< native floating point --> native integer >> conversions the magnitude
+of the result is less than or equal to the magnitude of the source.
+(I<"Rounding to zero".>)
+
+=item *
+
+If the C<< decimal string --> native integer >> conversion cannot be done
+without loss of information, the result is compatible with the conversion
+sequence C<< decimal_string --> native_floating_point --> native_integer >>.
+In particular, rounding is strongly biased to 0, though a number like
+C<"0.99999999999999999999"> has a chance of being rounded to 1.
+
+=back
+
+B<RESTRICTION>: The conversions marked with C<(*)> above involve steps
+performed by the C compiler. In particular, bugs/features of the compiler
+used may lead to breakage of some of the above rules.
+
+=head1 Flavors of Perl numeric operations
+
+Perl operations which take a numeric argument treat that argument in one
+of four different ways: they may force it to one of the integer/floating/
+string formats, or they may behave differently depending on the format of
+the operand. Forcing a numeric value to a particular format does not
+change the number stored in the value.
+
+All the operators which need an argument in the integer format treat the
+argument as in modular arithmetic, e.g., C<mod 2**32> on a 32-bit
+architecture. C<sprintf "%u", -1> therefore provides the same result as
+C<sprintf "%u", ~0>.
+
+=over
+
+=item Arithmetic operators except, C<no integer>
+
+force the argument into the floating point format.
+
+=item Arithmetic operators except, C<use integer>
+
+=item Bitwise operators, C<no integer>
+
+force the argument into the integer format if it is not a string.
+
+=item Bitwise operators, C<use integer>
+
+force the argument into the integer format
+
+=item Operators which expect an integer
+
+force the argument into the integer format. This is applicable
+to the third and fourth arguments of C<sysread>, for example.
+
+=item Operators which expect a string
+
+force the argument into the string format. For example, this is
+applicable to C<printf "%s", $value>.
+
+=back
+
+Though forcing an argument into a particular form does not change the
+stored number, Perl remembers the result of such conversions. In
+particular, though the first such conversion may be time-consuming,
+repeated operations will not need to redo the conversion.
+
+=head1 AUTHOR
+
+Ilya Zakharevich C<ilya@math.ohio-state.edu>
+
+Editorial adjustments by Gurusamy Sarathy <gsar@ActiveState.com>
+
+=head1 SEE ALSO
+
+L<overload>
diff --git a/contrib/perl5/pod/perlobj.pod b/contrib/perl5/pod/perlobj.pod
index a997ae0..4e45aff 100644
--- a/contrib/perl5/pod/perlobj.pod
+++ b/contrib/perl5/pod/perlobj.pod
@@ -4,10 +4,10 @@ perlobj - Perl objects
=head1 DESCRIPTION
-First of all, you need to understand what references are in Perl.
+First you need to understand what references are in Perl.
See L<perlref> for that. Second, if you still find the following
reference work too complicated, a tutorial on object-oriented programming
-in Perl can be found in L<perltoot>.
+in Perl can be found in L<perltoot> and L<perltootc>.
If you're still with us, then
here are three very simple definitions that you should find reassuring.
@@ -50,7 +50,7 @@ a construct this way, too:
package Critter;
sub spawn { bless {} }
-In fact, this might even be preferable, because the C++ programmers won't
+This might even be preferable, because the C++ programmers won't
be tricked into thinking that C<new> works in Perl as it does in C++.
It doesn't. We recommend that you name your constructors whatever
makes sense in the context of the problem you're solving. For example,
@@ -73,7 +73,7 @@ have been returned directly, like this:
return $self;
}
-In fact, you often see such a thing in more complicated constructors
+You often see such a thing in more complicated constructors
that wish to call methods in the class as part of the construction:
sub new {
@@ -96,8 +96,8 @@ so that your constructors may be inherited:
return $self;
}
-Or if you expect people to call not just C<CLASS-E<gt>new()> but also
-C<$obj-E<gt>new()>, then use something like this. The initialize()
+Or if you expect people to call not just C<< CLASS->new() >> but also
+C<< $obj->new() >>, then use something like this. The initialize()
method used will be of whatever $class we blessed the
object into:
@@ -115,12 +115,13 @@ reference as an ordinary reference. Outside the class package,
the reference is generally treated as an opaque value that may
be accessed only through the class's methods.
-A constructor may re-bless a referenced object currently belonging to
-another class, but then the new class is responsible for all cleanup
-later. The previous blessing is forgotten, as an object may belong
-to only one class at a time. (Although of course it's free to
-inherit methods from many classes.) If you find yourself having to
-do this, the parent class is probably misbehaving, though.
+Although a constructor can in theory re-bless a referenced object
+currently belonging to another class, this is almost certainly going
+to get you into trouble. The new class is responsible for all
+cleanup later. The previous blessing is forgotten, as an object
+may belong to only one class at a time. (Although of course it's
+free to inherit methods from many classes.) If you find yourself
+having to do this, the parent class is probably misbehaving, though.
A clarification: Perl objects are blessed. References are not. Objects
know which package they belong to. References do not. The bless()
@@ -154,7 +155,7 @@ last base class. Several commonly used methods are automatically
supplied in the UNIVERSAL class; see L<"Default UNIVERSAL methods"> for
more details.
-If a missing method is found in one of the base classes, it is cached
+If a missing method is found in a base class, it is cached
in the current class for efficiency. Changing @ISA or defining new
subroutines invalidates the cache and causes Perl to do the lookup again.
@@ -186,16 +187,16 @@ is to prepend your fieldname in the hash with the package name.
Unlike say C++, Perl doesn't provide any special syntax for method
definition. (It does provide a little syntax for method invocation
though. More on that later.) A method expects its first argument
-to be the object (reference) or package (string) it is being invoked on. There are just two
-types of methods, which we'll call class and instance.
-(Sometimes you'll hear these called static and virtual, in honor of
-the two C++ method types they most closely resemble.)
+to be the object (reference) or package (string) it is being invoked
+on. There are two ways of calling methods, which we'll call class
+methods and instance methods.
A class method expects a class name as the first argument. It
-provides functionality for the class as a whole, not for any individual
-object belonging to the class. Constructors are typically class
-methods. Many class methods simply ignore their first argument, because
-they already know what package they're in, and don't care what package
+provides functionality for the class as a whole, not for any
+individual object belonging to the class. Constructors are often
+class methods, but see L<perltoot> and L<perltootc> for alternatives.
+Many class methods simply ignore their first argument, because they
+already know what package they're in and don't care what package
they were invoked via. (These aren't necessarily the same, because
class methods follow the inheritance tree just like ordinary instance
methods.) Another typical use for class methods is to look up an
@@ -238,7 +239,7 @@ indirect object slot:
display {find Critter "Fred"} 'Height', 'Weight';
-For C++ fans, there's also a syntax using -E<gt> notation that does exactly
+For C++ fans, there's also a syntax using -> notation that does exactly
the same thing. The parentheses are required if there are any arguments.
$fred = Critter->find("Fred");
@@ -284,13 +285,13 @@ For more reasons why the indirect object syntax is ambiguous, see
L<"WARNING"> below.
There are times when you wish to specify which class's method to use.
-In this case, you can call your method as an ordinary subroutine
+Here you can call your method as an ordinary subroutine
call, being sure to pass the requisite first argument explicitly:
$fred = MyCritter::find("Critter", "Fred");
MyCritter::display($fred, 'Height', 'Weight');
-Note however, that this does not do any inheritance. If you wish
+Unlike method calls, function calls don't consider inheritance. If you wish
merely to specify that Perl should I<START> looking for a method in a
particular package, use an ordinary method call, but qualify the method
name with the package like this:
@@ -310,10 +311,59 @@ class.
Sometimes you want to call a method when you don't know the method name
ahead of time. You can use the arrow form, replacing the method name
-with a simple scalar variable containing the method name:
+with a simple scalar variable containing the method name or a
+reference to the function.
$method = $fast ? "findfirst" : "findbest";
- $fred->$method(@args);
+ $fred->$method(@args); # call by name
+
+ if ($coderef = $fred->can($parent . "::findbest")) {
+ $self->$coderef(@args); # call by coderef
+ }
+
+=head2 WARNING
+
+While indirect object syntax may well be appealing to English speakers and
+to C++ programmers, be not seduced! It suffers from two grave problems.
+
+The first problem is that an indirect object is limited to a name,
+a scalar variable, or a block, because it would have to do too much
+lookahead otherwise, just like any other postfix dereference in the
+language. (These are the same quirky rules as are used for the filehandle
+slot in functions like C<print> and C<printf>.) This can lead to horribly
+confusing precedence problems, as in these next two lines:
+
+ move $obj->{FIELD}; # probably wrong!
+ move $ary[$i]; # probably wrong!
+
+Those actually parse as the very surprising:
+
+ $obj->move->{FIELD}; # Well, lookee here
+ $ary->move([$i]); # Didn't expect this one, eh?
+
+Rather than what you might have expected:
+
+ $obj->{FIELD}->move(); # You should be so lucky.
+ $ary[$i]->move; # Yeah, sure.
+
+The left side of ``->'' is not so limited, because it's an infix operator,
+not a postfix operator.
+
+As if that weren't bad enough, think about this: Perl must guess I<at
+compile time> whether C<name> and C<move> above are functions or methods.
+Usually Perl gets it right, but when it doesn't it, you get a function
+call compiled as a method, or vice versa. This can introduce subtle
+bugs that are hard to unravel. For example, calling a method C<new>
+in indirect notation--as C++ programmers are so wont to do--can
+be miscompiled into a subroutine call if there's already a C<new>
+function in scope. You'd end up calling the current package's C<new>
+as a subroutine, rather than the desired class's method. The compiler
+tries to cheat by remembering bareword C<require>s, but the grief if it
+messes up just isn't worth the years of debugging it would likely take
+you to track such subtle bugs down.
+
+The infix arrow notation using ``C<< -> >>'' doesn't suffer from either
+of these disturbing ambiguities, so we recommend you use it exclusively.
=head2 Default UNIVERSAL methods
@@ -361,7 +411,7 @@ C<isa> uses a very similar method and cache-ing strategy. This may cause
strange effects if the Perl code dynamically changes @ISA in any package.
You may add other methods to the UNIVERSAL class via Perl or XS code.
-You do not need to C<use UNIVERSAL> in order to make these methods
+You do not need to C<use UNIVERSAL> to make these methods
available to your program. This is necessary only if you wish to
have C<isa> available as a plain subroutine in the current package.
@@ -386,55 +436,11 @@ object destruction, or for ensuring that destructors in the base classes
of your choosing get called. Explicitly calling DESTROY is also possible,
but is usually never needed.
-Do not confuse the foregoing with how objects I<CONTAINED> in the current
+Do not confuse the previous discussion with how objects I<CONTAINED> in the current
one are destroyed. Such objects will be freed and destroyed automatically
when the current object is freed, provided no other references to them exist
elsewhere.
-=head2 WARNING
-
-While indirect object syntax may well be appealing to English speakers and
-to C++ programmers, be not seduced! It suffers from two grave problems.
-
-The first problem is that an indirect object is limited to a name,
-a scalar variable, or a block, because it would have to do too much
-lookahead otherwise, just like any other postfix dereference in the
-language. (These are the same quirky rules as are used for the filehandle
-slot in functions like C<print> and C<printf>.) This can lead to horribly
-confusing precedence problems, as in these next two lines:
-
- move $obj->{FIELD}; # probably wrong!
- move $ary[$i]; # probably wrong!
-
-Those actually parse as the very surprising:
-
- $obj->move->{FIELD}; # Well, lookee here
- $ary->move->[$i]; # Didn't expect this one, eh?
-
-Rather than what you might have expected:
-
- $obj->{FIELD}->move(); # You should be so lucky.
- $ary[$i]->move; # Yeah, sure.
-
-The left side of ``-E<gt>'' is not so limited, because it's an infix operator,
-not a postfix operator.
-
-As if that weren't bad enough, think about this: Perl must guess I<at
-compile time> whether C<name> and C<move> above are functions or methods.
-Usually Perl gets it right, but when it doesn't it, you get a function
-call compiled as a method, or vice versa. This can introduce subtle
-bugs that are hard to unravel. For example, calling a method C<new>
-in indirect notation--as C++ programmers are so wont to do--can
-be miscompiled into a subroutine call if there's already a C<new>
-function in scope. You'd end up calling the current package's C<new>
-as a subroutine, rather than the desired class's method. The compiler
-tries to cheat by remembering bareword C<require>s, but the grief if it
-messes up just isn't worth the years of debugging it would likely take
-you to to track such subtle bugs down.
-
-The infix arrow notation using ``C<-E<gt>>'' doesn't suffer from either
-of these disturbing ambiguities, so we recommend you use it exclusively.
-
=head2 Summary
That's about all there is to it. Now you need just to go off and buy a
@@ -443,8 +449,8 @@ with it for the next six months or so.
=head2 Two-Phased Garbage Collection
-For most purposes, Perl uses a fast and simple reference-based
-garbage collection system. For this reason, there's an extra
+For most purposes, Perl uses a fast and simple, reference-based
+garbage collection system. That means there's an extra
dereference going on at some level, so if you haven't built
your Perl executable using your C compiler's C<-O> flag, performance
will suffer. If you I<have> built Perl with C<cc -O>, then this
@@ -529,8 +535,8 @@ When run as F</tmp/test>, the following output is produced:
Notice that "global destruction" bit there? That's the thread
garbage collector reaching the unreachable.
-Objects are always destructed, even when regular refs aren't and in fact
-are destructed in a separate pass before ordinary refs just to try to
+Objects are always destructed, even when regular refs aren't. Objects
+are destructed in a separate pass before ordinary refs just to
prevent object destructors from using refs that have been themselves
destructed. Plain refs are only garbage-collected if the destruct level
is greater than 0. You can test the higher levels of global destruction
@@ -547,8 +553,8 @@ breaks the circularities in the self-referential structure.
=head1 SEE ALSO
-A kinder, gentler tutorial on object-oriented programming in Perl can
-be found in L<perltoot>.
-You should also check out L<perlbot> for other object tricks, traps, and tips,
-as well as L<perlmodlib> for some style guides on constructing both modules
+A kinder, gentler tutorial on object-oriented programming in Perl
+can be found in L<perltoot> and L<perltootc>. You should also check
+out L<perlbot> for other object tricks, traps, and tips, as well
+as L<perlmodlib> for some style guides on constructing both modules
and classes.
diff --git a/contrib/perl5/pod/perlop.pod b/contrib/perl5/pod/perlop.pod
index 9f6d965..ce6fb66 100644
--- a/contrib/perl5/pod/perlop.pod
+++ b/contrib/perl5/pod/perlop.pod
@@ -5,11 +5,11 @@ perlop - Perl operators and precedence
=head1 SYNOPSIS
Perl operators have the following associativity and precedence,
-listed from highest precedence to lowest. Note that all operators
-borrowed from C keep the same precedence relationship with each other,
-even where C's precedence is slightly screwy. (This makes learning
-Perl easier for C folks.) With very few exceptions, these all
-operate on scalar values only, not array values.
+listed from highest precedence to lowest. Operators borrowed from
+C keep the same precedence relationship with each other, even where
+C's precedence is slightly screwy. (This makes learning Perl easier
+for C folks.) With very few exceptions, these all operate on scalar
+values only, not array values.
left terms and list operators (leftward)
left ->
@@ -64,11 +64,11 @@ For example, in
@ary = (1, 3, sort 4, 2);
print @ary; # prints 1324
-the commas on the right of the sort are evaluated before the sort, but
-the commas on the left are evaluated after. In other words, list
-operators tend to gobble up all the arguments that follow them, and
+the commas on the right of the sort are evaluated before the sort,
+but the commas on the left are evaluated after. In other words,
+list operators tend to gobble up all arguments that follow, and
then act like a simple TERM with regard to the preceding expression.
-Note that you have to be careful with parentheses:
+Be careful with parentheses:
# These evaluate exit before doing the print:
print($foo, exit); # Obviously not what you want.
@@ -95,16 +95,18 @@ as well as L<"I/O Operators">.
=head2 The Arrow Operator
-Just as in C and C++, "C<-E<gt>>" is an infix dereference operator. If the
-right side is either a C<[...]> or C<{...}> subscript, then the left side
-must be either a hard or symbolic reference to an array or hash (or
-a location capable of holding a hard reference, if it's an lvalue (assignable)).
-See L<perlref>.
+"C<< -> >>" is an infix dereference operator, just as it is in C
+and C++. If the right side is either a C<[...]>, C<{...}>, or a
+C<(...)> subscript, then the left side must be either a hard or
+symbolic reference to an array, a hash, or a subroutine respectively.
+(Or technically speaking, a location capable of holding a hard
+reference, if it's an array or hash reference being used for
+assignment.) See L<perlreftut> and L<perlref>.
-Otherwise, the right side is a method name or a simple scalar variable
-containing the method name, and the left side must either be an object
-(a blessed reference) or a class name (that is, a package name).
-See L<perlobj>.
+Otherwise, the right side is a method name or a simple scalar
+variable containing either the method name or a subroutine reference,
+and the left side must be either an object (a blessed reference)
+or a class name (that is, a package name). See L<perlobj>.
=head2 Auto-increment and Auto-decrement
@@ -129,7 +131,7 @@ The auto-decrement operator is not magical.
=head2 Exponentiation
-Binary "**" is the exponentiation operator. Note that it binds even more
+Binary "**" is the exponentiation operator. It binds even more
tightly than unary minus, so -2**4 is -(2**4), not (-2)**4. (This is
implemented using C's pow(3) function, which actually works on doubles
internally.)
@@ -146,19 +148,22 @@ starts with a plus or minus, a string starting with the opposite sign
is returned. One effect of these rules is that C<-bareword> is equivalent
to C<"-bareword">.
-Unary "~" performs bitwise negation, i.e., 1's complement. For example,
-C<0666 &~ 027> is 0640. (See also L<Integer Arithmetic> and L<Bitwise
-String Operators>.)
+Unary "~" performs bitwise negation, i.e., 1's complement. For
+example, C<0666 & ~027> is 0640. (See also L<Integer Arithmetic> and
+L<Bitwise String Operators>.) Note that the width of the result is
+platform-dependent: ~0 is 32 bits wide on a 32-bit platform, but 64
+bits wide on a 64-bit platform, so if you are expecting a certain bit
+width, remember use the & operator to mask off the excess bits.
Unary "+" has no effect whatsoever, even on strings. It is useful
syntactically for separating a function name from a parenthesized expression
that would otherwise be interpreted as the complete list of function
arguments. (See examples above under L<Terms and List Operators (Leftward)>.)
-Unary "\" creates a reference to whatever follows it. See L<perlref>.
-Do not confuse this behavior with the behavior of backslash within a
-string, although both forms do convey the notion of protecting the next
-thing from interpretation.
+Unary "\" creates a reference to whatever follows it. See L<perlreftut>
+and L<perlref>. Do not confuse this behavior with the behavior of
+backslash within a string, although both forms do convey the notion
+of protecting the next thing from interpolation.
=head2 Binding Operators
@@ -167,10 +172,13 @@ search or modify the string $_ by default. This operator makes that kind
of operation work on some other string. The right argument is a search
pattern, substitution, or transliteration. The left argument is what is
supposed to be searched, substituted, or transliterated instead of the default
-$_. The return value indicates the success of the operation. (If the
-right argument is an expression rather than a search pattern,
+$_. When used in scalar context, the return value generally indicates the
+success of the operation. Behavior in list context depends on the particular
+operator. See L</"Regexp Quote-Like Operators"> for details.
+
+If the right argument is an expression rather than a search pattern,
substitution, or transliteration, it is interpreted as a search pattern at run
-time. This can be is less efficient than an explicit search, because the
+time. This can be less efficient than an explicit search, because the
pattern must be compiled every time the expression is evaluated.
Binary "!~" is just like "=~" except the return value is negated in
@@ -193,10 +201,11 @@ to the modulus operator as implemented by your C compiler. This
operator is not as well defined for negative operands, but it will
execute faster.
-Binary "x" is the repetition operator. In scalar context, it
-returns a string consisting of the left operand repeated the number of
-times specified by the right operand. In list context, if the left
-operand is a list in parentheses, it repeats the list.
+Binary "x" is the repetition operator. In scalar context or if the left
+operand is not enclosed in parentheses, it returns a string consisting
+of the left operand repeated the number of times specified by the right
+operand. In list context, if the left operand is enclosed in
+parentheses, it repeats the list.
print '-' x 80; # print row of dashes
@@ -256,16 +265,16 @@ See also L<"Terms and List Operators (Leftward)">.
=head2 Relational Operators
-Binary "E<lt>" returns true if the left argument is numerically less than
+Binary "<" returns true if the left argument is numerically less than
the right argument.
-Binary "E<gt>" returns true if the left argument is numerically greater
+Binary ">" returns true if the left argument is numerically greater
than the right argument.
-Binary "E<lt>=" returns true if the left argument is numerically less than
+Binary "<=" returns true if the left argument is numerically less than
or equal to the right argument.
-Binary "E<gt>=" returns true if the left argument is numerically greater
+Binary ">=" returns true if the left argument is numerically greater
than or equal to the right argument.
Binary "lt" returns true if the left argument is stringwise less than
@@ -288,7 +297,7 @@ the right argument.
Binary "!=" returns true if the left argument is numerically not equal
to the right argument.
-Binary "E<lt>=E<gt>" returns -1, 0, or 1 depending on whether the left
+Binary "<=>" returns -1, 0, or 1 depending on whether the left
argument is numerically less than, equal to, or greater than the right
argument.
@@ -359,18 +368,20 @@ With the C-style operators that would have been written like this:
unlink("alpha", "beta", "gamma")
|| (gripe(), next LINE);
-Use "or" for assignment is unlikely to do what you want; see below.
+Using "or" for assignment is unlikely to do what you want; see below.
=head2 Range Operators
Binary ".." is the range operator, which is really two different
operators depending on the context. In list context, it returns an
-array of values counting (by ones) from the left value to the right
-value. This is useful for writing C<foreach (1..10)> loops and for
-doing slice operations on arrays. In the current implementation, no
-temporary array is created when the range operator is used as the
-expression in C<foreach> loops, but older versions of Perl might burn
-a lot of memory when you write something like this:
+array of values counting (up by ones) from the left value to the right
+value. If the left value is greater than the right value then it
+returns the empty array. The range operator is useful for writing
+C<foreach (1..10)> loops and for doing slice operations on arrays. In
+the current implementation, no temporary array is created when the
+range operator is used as the expression in C<foreach> loops, but older
+versions of Perl might burn a lot of memory when you write something
+like this:
for (1 .. 1_000_000) {
# code
@@ -382,23 +393,26 @@ of B<sed>, B<awk>, and various editors. Each ".." operator maintains its
own boolean state. It is false as long as its left operand is false.
Once the left operand is true, the range operator stays true until the
right operand is true, I<AFTER> which the range operator becomes false
-again. (It doesn't become false till the next time the range operator is
+again. It doesn't become false till the next time the range operator is
evaluated. It can test the right operand and become false on the same
evaluation it became true (as in B<awk>), but it still returns true once.
-If you don't want it to test the right operand till the next evaluation
-(as in B<sed>), use three dots ("...") instead of two.) The right
-operand is not evaluated while the operator is in the "false" state, and
-the left operand is not evaluated while the operator is in the "true"
-state. The precedence is a little lower than || and &&. The value
-returned is either the empty string for false, or a sequence number
-(beginning with 1) for true. The sequence number is reset for each range
-encountered. The final sequence number in a range has the string "E0"
-appended to it, which doesn't affect its numeric value, but gives you
-something to search for if you want to exclude the endpoint. You can
-exclude the beginning point by waiting for the sequence number to be
-greater than 1. If either operand of scalar ".." is a constant expression,
-that operand is implicitly compared to the C<$.> variable, the current
-line number. Examples:
+If you don't want it to test the right operand till the next
+evaluation, as in B<sed>, just use three dots ("...") instead of
+two. In all other regards, "..." behaves just like ".." does.
+
+The right operand is not evaluated while the operator is in the
+"false" state, and the left operand is not evaluated while the
+operator is in the "true" state. The precedence is a little lower
+than || and &&. The value returned is either the empty string for
+false, or a sequence number (beginning with 1) for true. The
+sequence number is reset for each range encountered. The final
+sequence number in a range has the string "E0" appended to it, which
+doesn't affect its numeric value, but gives you something to search
+for if you want to exclude the endpoint. You can exclude the
+beginning point by waiting for the sequence number to be greater
+than 1. If either operand of scalar ".." is a constant expression,
+that operand is implicitly compared to the C<$.> variable, the
+current line number. Examples:
As a scalar operator:
@@ -427,7 +441,7 @@ can say
@alphabet = ('A' .. 'Z');
-to get all the letters of the alphabet, or
+to get all normal letters of the alphabet, or
$hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15];
@@ -462,8 +476,6 @@ legal lvalues (meaning that you can assign to them):
($a_or_b ? $a : $b) = $c;
-This is not necessarily guaranteed to contribute to the readability of your program.
-
Because this operator produces an assignable result, using assignments
without parentheses will get you in trouble. For example, this:
@@ -477,6 +489,10 @@ Rather than this:
($a % 2) ? ($a += 10) : ($a += 2)
+That should probably be written more simply as:
+
+ $a += ($a % 2) ? 10 : 2;
+
=head2 Assignment Operators
"=" is the ordinary assignment operator.
@@ -498,13 +514,13 @@ The following are recognized:
.= %= ^=
x=
-Note that while these are grouped by family, they all have the precedence
+Although these are grouped by family, they all have the precedence
of assignment.
-Unlike in C, the assignment operator produces a valid lvalue. Modifying
-an assignment is equivalent to doing the assignment and then modifying
-the variable that was assigned to. This is useful for modifying
-a copy of something, like this:
+Unlike in C, the scalar assignment operator produces a valid lvalue.
+Modifying an assignment is equivalent to doing the assignment and
+then modifying the variable that was assigned to. This is useful
+for modifying a copy of something, like this:
($tmp = $global) =~ tr [A-Z] [a-z];
@@ -517,6 +533,11 @@ is equivalent to
$a += 2;
$a *= 3;
+Similarly, a list assignment in list context produces the list of
+lvalues assigned to, and a list assignment in scalar context returns
+the number of elements produced by the expression on the right hand
+side of the assignment.
+
=head2 Comma Operator
Binary "," is the comma operator. In scalar context it evaluates
@@ -526,7 +547,7 @@ argument and returns that value. This is just like C's comma operator.
In list context, it's just the list argument separator, and inserts
both its arguments into the list.
-The =E<gt> digraph is mostly just a synonym for the comma operator. It's useful for
+The => digraph is mostly just a synonym for the comma operator. It's useful for
documenting arguments that come in pairs. As of release 5.001, it also forces
any word to the left of it to be interpreted as a string.
@@ -571,14 +592,14 @@ probably avoid using this for assignment, only for control flow.
($a = $b) or $c; # really means this
$a = $b || $c; # better written this way
-However, when it's a list context assignment and you're trying to use
+However, when it's a list-context assignment and you're trying to use
"||" for control flow, you probably need "or" so that the assignment
takes higher precedence.
@info = stat($file) || die; # oops, scalar sense of stat!
@info = stat($file) or die; # better, now @info gets its due
-Then again, you could always use parentheses.
+Then again, you could always use parentheses.
Binary "xor" returns the exclusive-OR of the two surrounding expressions.
It cannot short circuit, of course.
@@ -600,7 +621,7 @@ operators are typed: $, @, %, and &.)
=item (TYPE)
-Type casting operator.
+Type-casting operator.
=back
@@ -611,9 +632,7 @@ function as operators, providing various kinds of interpolating and
pattern matching capabilities. Perl provides customary quote characters
for these behaviors, but also provides a way for you to choose your
quote character for any of them. In the following table, a C<{}> represents
-any pair of delimiters you choose. Non-bracketing delimiters use
-the same character fore and aft, but the 4 sorts of brackets
-(round, angle, square, curly) will all nest.
+any pair of delimiters you choose.
Customary Generic Meaning Interpolates
'' q{} Literal no
@@ -625,18 +644,35 @@ the same character fore and aft, but the 4 sorts of brackets
s{}{} Substitution yes (unless '' is delimiter)
tr{}{} Transliteration no (but see below)
-Note that there can be whitespace between the operator and the quoting
+Non-bracketing delimiters use the same character fore and aft, but the four
+sorts of brackets (round, angle, square, curly) will all nest, which means
+that
+
+ q{foo{bar}baz}
+
+is the same as
+
+ 'foo{bar}baz'
+
+Note, however, that this does not always work for quoting Perl code:
+
+ $s = q{ if($a eq "}") ... }; # WRONG
+
+is a syntax error. The C<Text::Balanced> module on CPAN is able to do this
+properly.
+
+There can be whitespace between the operator and the quoting
characters, except when C<#> is being used as the quoting character.
-C<q#foo#> is parsed as being the string C<foo>, while C<q #foo#> is the
-operator C<q> followed by a comment. Its argument will be taken from the
-next line. This allows you to write:
+C<q#foo#> is parsed as the string C<foo>, while C<q #foo#> is the
+operator C<q> followed by a comment. Its argument will be taken
+from the next line. This allows you to write:
s {foo} # Replace foo
{bar} # with bar.
-For constructs that do interpolation, variables beginning with "C<$>"
-or "C<@>" are interpolated, as are the following sequences. Within
-a transliteration, the first ten of these sequences may be used.
+For constructs that do interpolate, variables beginning with "C<$>"
+or "C<@>" are interpolated, as are the following escape sequences. Within
+a transliteration, the first eleven of these sequences may be used.
\t tab (HT, TAB)
\n newline (NL)
@@ -647,7 +683,9 @@ a transliteration, the first ten of these sequences may be used.
\e escape (ESC)
\033 octal char (ESC)
\x1b hex char (ESC)
- \c[ control char
+ \x{263a} wide hex char (SMILEY)
+ \c[ control char (ESC)
+ \N{name} named char
\l lowercase next char
\u uppercase next char
@@ -657,11 +695,12 @@ a transliteration, the first ten of these sequences may be used.
\Q quote non-word characters till \E
If C<use locale> is in effect, the case map used by C<\l>, C<\L>, C<\u>
-and C<\U> is taken from the current locale. See L<perllocale>.
+and C<\U> is taken from the current locale. See L<perllocale>. For
+documentation of C<\N{name}>, see L<charnames>.
All systems use the virtual C<"\n"> to represent a line terminator,
called a "newline". There is no such thing as an unvarying, physical
-newline character. It is an illusion that the operating system,
+newline character. It is only an illusion that the operating system,
device drivers, C libraries, and Perl all conspire to preserve. Not all
systems read C<"\r"> as ASCII CR and C<"\n"> as ASCII LF. For example,
on a Mac, these are reversed, and on systems without line terminator,
@@ -684,28 +723,17 @@ interpolated, so that regular expressions may be incorporated into the
pattern from the variables. If this is not what you want, use C<\Q> to
interpolate a variable literally.
-Apart from the above, there are no multiple levels of interpolation. In
-particular, contrary to the expectations of shell programmers, back-quotes
-do I<NOT> interpolate within double quotes, nor do single quotes impede
-evaluation of variables when used within double quotes.
+Apart from the behavior described above, Perl does not expand
+multiple levels of interpolation. In particular, contrary to the
+expectations of shell programmers, back-quotes do I<NOT> interpolate
+within double quotes, nor do single quotes impede evaluation of
+variables when used within double quotes.
=head2 Regexp Quote-Like Operators
Here are the quote-like operators that apply to pattern
matching and related activities.
-Most of this section is related to use of regular expressions from Perl.
-Such a use may be considered from two points of view: Perl handles a
-a string and a "pattern" to RE (regular expression) engine to match,
-RE engine finds (or does not find) the match, and Perl uses the findings
-of RE engine for its operation, possibly asking the engine for other matches.
-
-RE engine has no idea what Perl is going to do with what it finds,
-similarly, the rest of Perl has no idea what a particular regular expression
-means to RE engine. This creates a clean separation, and in this section
-we discuss matching from Perl point of view only. The other point of
-view may be found in L<perlre>.
-
=over 8
=item ?PATTERN?
@@ -724,21 +752,22 @@ patterns local to the current package are reset.
reset if eof; # clear ?? status for next file
}
-This usage is vaguely deprecated, and may be removed in some future
-version of Perl.
+This usage is vaguely depreciated, which means it just might possibly
+be removed in some distant future version of Perl, perhaps somewhere
+around the year 2168.
=item m/PATTERN/cgimosx
=item /PATTERN/cgimosx
Searches a string for a pattern match, and in scalar context returns
-true (1) or false (''). If no string is specified via the C<=~> or
-C<!~> operator, the $_ string is searched. (The string specified with
-C<=~> need not be an lvalue--it may be the result of an expression
-evaluation, but remember the C<=~> binds rather tightly.) See also
-L<perlre>.
-See L<perllocale> for discussion of additional considerations that apply
-when C<use locale> is in effect.
+true if it succeeds, false if it fails. If no string is specified
+via the C<=~> or C<!~> operator, the $_ string is searched. (The
+string specified with C<=~> need not be an lvalue--it may be the
+result of an expression evaluation, but remember the C<=~> binds
+rather tightly.) See also L<perlre>. See L<perllocale> for
+discussion of additional considerations that apply when C<use locale>
+is in effect.
Options are:
@@ -752,11 +781,10 @@ Options are:
If "/" is the delimiter then the initial C<m> is optional. With the C<m>
you can use any pair of non-alphanumeric, non-whitespace characters
-as delimiters. This is particularly useful for matching Unix path names
-that contain "/", to avoid LTS (leaning toothpick syndrome). If "?" is
+as delimiters. This is particularly useful for matching path names
+that contain "/", to avoid LTS (leaning toothpick syndrome). If "?" is
the delimiter, then the match-only-once rule of C<?PATTERN?> applies.
-If "'" is the delimiter, no variable interpolation is performed on the
-PATTERN.
+If "'" is the delimiter, no interpolation is performed on the PATTERN.
PATTERN may contain variables, which will be interpolated (and the
pattern recompiled) every time the pattern search is evaluated, except
@@ -767,12 +795,12 @@ the trailing delimiter. This avoids expensive run-time recompilations,
and is useful when the value you are interpolating won't change over
the life of the script. However, mentioning C</o> constitutes a promise
that you won't change the variables in the pattern. If you change them,
-Perl won't even notice.
+Perl won't even notice. See also L<"qr//">.
If the PATTERN evaluates to the empty string, the last
I<successfully> matched regular expression is used instead.
-If the C</g> option is not used, C<m//> in a list context returns a
+If the C</g> option is not used, C<m//> in list context returns a
list consisting of the subexpressions matched by the parentheses in the
pattern, i.e., (C<$1>, C<$2>, C<$3>...). (Note that here C<$1> etc. are
also set, and that this differs from Perl 4's behavior.) When there are
@@ -802,15 +830,16 @@ remainder of the line, and assigns those three fields to $F1, $F2, and
$Etc. The conditional is true if any variables were assigned, i.e., if
the pattern matched.
-The C</g> modifier specifies global pattern matching--that is, matching
-as many times as possible within the string. How it behaves depends on
-the context. In list context, it returns a list of all the
-substrings matched by all the parentheses in the regular expression.
-If there are no parentheses, it returns a list of all the matched
-strings, as if there were parentheses around the whole pattern.
+The C</g> modifier specifies global pattern matching--that is,
+matching as many times as possible within the string. How it behaves
+depends on the context. In list context, it returns a list of the
+substrings matched by any capturing parentheses in the regular
+expression. If there are no parentheses, it returns a list of all
+the matched strings, as if there were parentheses around the whole
+pattern.
In scalar context, each execution of C<m//g> finds the next match,
-returning TRUE if it matches, and FALSE if there is no further match.
+returning true if it matches, and false if there is no further match.
The position after the last match can be read or set using the pos()
function; see L<perlfunc/pos>. A failed match normally resets the
search position to the beginning of the string, but you can avoid that
@@ -820,8 +849,8 @@ string also resets the search position.
You can intermix C<m//g> matches with C<m/\G.../g>, where C<\G> is a
zero-width assertion that matches the exact position where the previous
C<m//g>, if any, left off. The C<\G> assertion is not supported without
-the C</g> modifier; currently, without C</g>, C<\G> behaves just like
-C<\A>, but that's accidental and may change in the future.
+the C</g> modifier. (Currently, without C</g>, C<\G> behaves just like
+C<\A>, but that's accidental and may change in the future.)
Examples:
@@ -829,12 +858,10 @@ Examples:
($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
# scalar context
- {
- local $/ = "";
- while (defined($paragraph = <>)) {
- while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
- $sentences++;
- }
+ $/ = ""; $* = 1; # $* deprecated in modern perls
+ while (defined($paragraph = <>)) {
+ while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
+ $sentences++;
}
}
print "$sentences\n";
@@ -890,7 +917,7 @@ Here is the output (split into several lines):
=item C<'STRING'>
-A single-quoted, literal string. A backslash represents a backslash
+A single-quoted, literal string. A backslash represents a backslash
unless followed by the delimiter or another backslash, in which case
the delimiter or backslash is interpolated.
@@ -906,15 +933,16 @@ A double-quoted, interpolated string.
$_ .= qq
(*** The previous line contains the naughty word "$1".\n)
- if /(tcl|rexx|python)/; # :-)
+ if /\b(tcl|java|python)\b/i; # :-)
$baz = "\n"; # a one-character string
-=item qr/PATTERN/imosx
+=item qr/STRING/imosx
-Quote-as-a-regular-expression operator. I<STRING> is interpolated the
-same way as I<PATTERN> in C<m/PATTERN/>. If "'" is used as the
-delimiter, no variable interpolation is done. Returns a Perl value
-which may be used instead of the corresponding C</STRING/imosx> expression.
+This operators quotes--and compiles--its I<STRING> as a regular
+expression. I<STRING> is interpolated the same way as I<PATTERN>
+in C<m/PATTERN/>. If "'" is used as the delimiter, no interpolation
+is done. Returns a Perl value which may be used instead of the
+corresponding C</STRING/imosx> expression.
For example,
@@ -933,7 +961,7 @@ The result may be used as a subpattern in a match:
$string =~ /$re/; # or this way
Since Perl may compile the pattern at the moment of execution of qr()
-operator, using qr() may have speed advantages in I<some> situations,
+operator, using qr() may have speed advantages in some situations,
notably if the result of qr() is used standalone:
sub match {
@@ -941,18 +969,18 @@ notably if the result of qr() is used standalone:
my @compiled = map qr/$_/i, @$patterns;
grep {
my $success = 0;
- foreach my $pat @compiled {
+ foreach my $pat (@compiled) {
$success = 1, last if /$pat/;
}
$success;
} @_;
}
-Precompilation of the pattern into an internal representation at the
-moment of qr() avoids a need to recompile the pattern every time a
-match C</$pat/> is attempted. (Note that Perl has many other
-internal optimizations, but none would be triggered in the above
-example if we did not use qr() operator.)
+Precompilation of the pattern into an internal representation at
+the moment of qr() avoids a need to recompile the pattern every
+time a match C</$pat/> is attempted. (Perl has many other internal
+optimizations, but none would be triggered in the above example if
+we did not use qr() operator.)
Options are:
@@ -1009,7 +1037,7 @@ double-quote interpolation, passing it on to the shell instead:
$perl_info = qx(ps $$); # that's Perl's $$
$shell_info = qx'ps $$'; # that's the new shell's $$
-Note that how the string gets evaluated is entirely subject to the command
+How that string gets evaluated is entirely subject to the command
interpreter on your system. On most platforms, you will have to protect
shell metacharacters if you want them treated literally. This is in
practice difficult to do, as it's unclear how to escape which characters.
@@ -1023,6 +1051,12 @@ multiple commands in a single line by separating them with the command
separator character, if your shell supports that (e.g. C<;> on many Unix
shells; C<&> on the Windows NT C<cmd> shell).
+Beginning with v5.6.0, Perl will attempt to flush all files opened for
+output before starting the child process, but this may not be supported
+on some platforms (see L<perlport>). To be safe, you may need to set
+C<$|> ($AUTOFLUSH in English) or call the C<autoflush()> method of
+C<IO::Handle> on any open handles.
+
Beware that some command shells may place restrictions on the length
of the command line. You must ensure your strings don't exceed this
limit after any necessary interpolations. See the platform-specific
@@ -1041,29 +1075,30 @@ See L<"I/O Operators"> for more discussion.
=item qw/STRING/
-Returns a list of the words extracted out of STRING, using embedded
-whitespace as the word delimiters. It is exactly equivalent to
+Evaluates to a list of the words extracted out of STRING, using embedded
+whitespace as the word delimiters. It can be understood as being roughly
+equivalent to:
split(' ', q/STRING/);
-This equivalency means that if used in scalar context, you'll get split's
-(unfortunate) scalar context behavior, complete with mysterious warnings.
-However do not rely on this as in a future release it could be changed to
-be exactly equivalent to the list
+the difference being that it generates a real list at compile time. So
+this expression:
- ('foo', 'bar', 'baz')
+ qw(foo bar baz)
-Which in a scalar context would result in C<'baz'>.
+is semantically equivalent to the list:
+
+ 'foo', 'bar', 'baz'
Some frequently seen examples:
use POSIX qw( setlocale localeconv )
@EXPORT = qw( foo bar baz );
-A common mistake is to try to separate the words with comma or to put
-comments into a multi-line C<qw>-string. For this reason the C<-w>
-switch produce warnings if the STRING contains the "," or the "#"
-character.
+A common mistake is to try to separate the words with comma or to
+put comments into a multi-line C<qw>-string. For this reason, the
+C<use warnings> pragma and the B<-w> switch (that is, the C<$^W> variable)
+produces warnings if the STRING contains the "," or the "#" character.
=item s/PATTERN/REPLACEMENT/egimosx
@@ -1076,7 +1111,7 @@ variable is searched and modified. (The string specified with C<=~> must
be scalar variable, an array element, a hash element, or an assignment
to one of those, i.e., an lvalue.)
-If the delimiter chosen is a single quote, no variable interpolation is
+If the delimiter chosen is a single quote, no interpolation is
done on either the PATTERN or the REPLACEMENT. Otherwise, if the
PATTERN contains a $ that looks like a variable rather than an
end-of-string test, the variable will be interpolated into the pattern
@@ -1104,10 +1139,11 @@ Perl 4, Perl 5 treats backticks as normal delimiters; the replacement
text is not evaluated as a command. If the
PATTERN is delimited by bracketing quotes, the REPLACEMENT has its own
pair of quotes, which may or may not be bracketing quotes, e.g.,
-C<s(foo)(bar)> or C<sE<lt>fooE<gt>/bar/>. A C</e> will cause the
-replacement portion to be interpreted as a full-fledged Perl expression
-and eval()ed right then and there. It is, however, syntax checked at
-compile-time.
+C<s(foo)(bar)> or C<< s<foo>/bar/ >>. A C</e> will cause the
+replacement portion to be treated as a full-fledged Perl expression
+and evaluated right then and there. It is, however, syntax checked at
+compile-time. A second C<e> modifier will cause the replacement portion
+to be C<eval>ed before being run as a Perl expression.
Examples:
@@ -1134,8 +1170,12 @@ Examples:
# symbolic dereferencing
s/\$(\w+)/${$1}/g;
- # /e's can even nest; this will expand
- # any embedded scalar variable (including lexicals) in $_
+ # Add one to the value of any numbers in the string
+ s/(\d+)/1 + $1/eg;
+
+ # This will expand any embedded scalar variable
+ # (including lexicals) in $_ : First $1 is interpolated
+ # to the variable name, and then evaluated
s/(\$\w+)/$1/eeg;
# Delete (most) C comments.
@@ -1155,23 +1195,21 @@ Examples:
s/([^ ]*) *([^ ]*)/$2 $1/; # reverse 1st two fields
Note the use of $ instead of \ in the last example. Unlike
-B<sed>, we use the \E<lt>I<digit>E<gt> form in only the left hand side.
-Anywhere else it's $E<lt>I<digit>E<gt>.
+B<sed>, we use the \<I<digit>> form in only the left hand side.
+Anywhere else it's $<I<digit>>.
Occasionally, you can't use just a C</g> to get all the changes
-to occur. Here are two common cases:
+to occur that you might want. Here are two common cases:
# put commas in the right places in an integer
- 1 while s/(.*\d)(\d\d\d)/$1,$2/g; # perl4
- 1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/g; # perl5
+ 1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/g;
# expand tabs to 8-column spacing
1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e;
+=item tr/SEARCHLIST/REPLACEMENTLIST/cdsUC
-=item tr/SEARCHLIST/REPLACEMENTLIST/cds
-
-=item y/SEARCHLIST/REPLACEMENTLIST/cds
+=item y/SEARCHLIST/REPLACEMENTLIST/cdsUC
Transliterates all occurrences of the characters found in the search list
with the corresponding character in the replacement list. It returns
@@ -1199,15 +1237,17 @@ Options:
c Complement the SEARCHLIST.
d Delete found but unreplaced characters.
s Squash duplicate replaced characters.
-
-If the C</c> modifier is specified, the SEARCHLIST character set is
-complemented. If the C</d> modifier is specified, any characters specified
-by SEARCHLIST not found in REPLACEMENTLIST are deleted. (Note
-that this is slightly more flexible than the behavior of some B<tr>
-programs, which delete anything they find in the SEARCHLIST, period.)
-If the C</s> modifier is specified, sequences of characters that were
-transliterated to the same character are squashed down to a single instance of the
-character.
+ U Translate to/from UTF-8.
+ C Translate to/from 8-bit char (octet).
+
+If the C</c> modifier is specified, the SEARCHLIST character set
+is complemented. If the C</d> modifier is specified, any characters
+specified by SEARCHLIST not found in REPLACEMENTLIST are deleted.
+(Note that this is slightly more flexible than the behavior of some
+B<tr> programs, which delete anything they find in the SEARCHLIST,
+period.) If the C</s> modifier is specified, sequences of characters
+that were transliterated to the same character are squashed down
+to a single instance of the character.
If the C</d> modifier is used, the REPLACEMENTLIST is always interpreted
exactly as specified. Otherwise, if the REPLACEMENTLIST is shorter
@@ -1216,6 +1256,10 @@ enough. If the REPLACEMENTLIST is empty, the SEARCHLIST is replicated.
This latter is useful for counting characters in a class or for
squashing character sequences in a class.
+The first C</U> or C</C> modifier applies to the left side of the translation.
+The second one applies to the right side. If present, these modifiers override
+the current utf8 state.
+
Examples:
$ARGV[1] =~ tr/A-Z/a-z/; # canonicalize to lower case
@@ -1235,16 +1279,20 @@ Examples:
tr [\200-\377]
[\000-\177]; # delete 8th bit
-If multiple transliterations are given for a character, only the first one is used:
+ tr/\0-\xFF//CU; # change Latin-1 to Unicode
+ tr/\0-\x{FF}//UC; # change Unicode to Latin-1
+
+If multiple transliterations are given for a character, only the
+first one is used:
tr/AAA/XYZ/
will transliterate any A to X.
-Note that because the transliteration table is built at compile time, neither
+Because the transliteration table is built at compile time, neither
the SEARCHLIST nor the REPLACEMENTLIST are subjected to double quote
-interpolation. That means that if you want to use variables, you must use
-an eval():
+interpolation. That means that if you want to use variables, you
+must use an eval():
eval "tr/$oldlist/$newlist/";
die $@ if $@;
@@ -1255,52 +1303,52 @@ an eval():
=head2 Gory details of parsing quoted constructs
-When presented with something which may have several different
-interpretations, Perl uses the principle B<DWIM> (expanded to Do What I Mean
-- not what I wrote) to pick up the most probable interpretation of the
-source. This strategy is so successful that Perl users usually do not
-suspect ambivalence of what they write. However, time to time Perl's ideas
-differ from what the author meant.
-
-The target of this section is to clarify the Perl's way of interpreting
-quoted constructs. The most frequent reason one may have to want to know the
-details discussed in this section is hairy regular expressions. However, the
-first steps of parsing are the same for all Perl quoting operators, so here
-they are discussed together.
-
-The most important detail of Perl parsing rules is the first one
-discussed below; when processing a quoted construct, Perl I<first>
-finds the end of the construct, then it interprets the contents of the
-construct. If you understand this rule, you may skip the rest of this
-section on the first reading. The other rules would
-contradict user's expectations much less frequently than the first one.
-
-Some of the passes discussed below are performed concurrently, but as
-far as results are the same, we consider them one-by-one. For different
-quoting constructs Perl performs different number of passes, from
-one to five, but they are always performed in the same order.
+When presented with something that might have several different
+interpretations, Perl uses the B<DWIM> (that's "Do What I Mean")
+principle to pick the most probable interpretation. This strategy
+is so successful that Perl programmers often do not suspect the
+ambivalence of what they write. But from time to time, Perl's
+notions differ substantially from what the author honestly meant.
+
+This section hopes to clarify how Perl handles quoted constructs.
+Although the most common reason to learn this is to unravel labyrinthine
+regular expressions, because the initial steps of parsing are the
+same for all quoting operators, they are all discussed together.
+
+The most important Perl parsing rule is the first one discussed
+below: when processing a quoted construct, Perl first finds the end
+of that construct, then interprets its contents. If you understand
+this rule, you may skip the rest of this section on the first
+reading. The other rules are likely to contradict the user's
+expectations much less frequently than this first one.
+
+Some passes discussed below are performed concurrently, but because
+their results are the same, we consider them individually. For different
+quoting constructs, Perl performs different numbers of passes, from
+one to five, but these passes are always performed in the same order.
=over
=item Finding the end
-First pass is finding the end of the quoted construct, be it
-a multichar delimiter
-C<"\nEOF\n"> of C<<<EOF> construct, C</> which terminates C<qq/> construct,
-C<]> which terminates C<qq[> construct, or C<E<gt>> which terminates a
-fileglob started with C<<>.
+The first pass is finding the end of the quoted construct, whether
+it be a multicharacter delimiter C<"\nEOF\n"> in the C<<<EOF>
+construct, a C</> that terminates a C<qq//> construct, a C<]> which
+terminates C<qq[]> construct, or a C<< > >> which terminates a
+fileglob started with C<< < >>.
-When searching for one-char non-matching delimiter, such as C</>, combinations
-C<\\> and C<\/> are skipped. When searching for one-char matching delimiter,
-such as C<]>, combinations C<\\>, C<\]> and C<\[> are skipped, and
-nested C<[>, C<]> are skipped as well. When searching for multichar delimiter
-no skipping is performed.
+When searching for single-character non-pairing delimiters, such
+as C</>, combinations of C<\\> and C<\/> are skipped. However,
+when searching for single-character pairing delimiter like C<[>,
+combinations of C<\\>, C<\]>, and C<\[> are all skipped, and nested
+C<[>, C<]> are skipped as well. When searching for multicharacter
+delimiters, nothing is skipped.
-For constructs with 3-part delimiters (C<s///> etc.) the search is
-repeated once more.
+For constructs with three-part delimiters (C<s///>, C<y///>, and
+C<tr///>), the search is repeated once more.
-During this search no attention is paid to the semantic of the construct,
-thus:
+During this search no attention is paid to the semantics of the construct.
+Thus:
"$hash{"$foo/$bar"}"
@@ -1310,30 +1358,28 @@ or:
bar # NOT a comment, this slash / terminated m//!
/x
-do not form legal quoted expressions, the quoted part ends on the first C<">
-and C</>, and the rest happens to be a syntax error. Note that since the slash
-which terminated C<m//> was followed by a C<SPACE>, the above is not C<m//x>,
-but rather C<m//> with no 'x' switch. So the embedded C<#> is interpreted
-as a literal C<#>.
+do not form legal quoted expressions. The quoted part ends on the
+first C<"> and C</>, and the rest happens to be a syntax error.
+Because the slash that terminated C<m//> was followed by a C<SPACE>,
+the example above is not C<m//x>, but rather C<m//> with no C</x>
+modifier. So the embedded C<#> is interpreted as a literal C<#>.
=item Removal of backslashes before delimiters
-During the second pass the text between the starting delimiter and
-the ending delimiter is copied to a safe location, and the C<\> is
-removed from combinations consisting of C<\> and delimiter(s) (both starting
-and ending delimiter if they differ).
-
-The removal does not happen for multi-char delimiters.
-
-Note that the combination C<\\> is left as it was!
+During the second pass, text between the starting and ending
+delimiters is copied to a safe location, and the C<\> is removed
+from combinations consisting of C<\> and delimiter--or delimiters,
+meaning both starting and ending delimiters will should these differ.
+This removal does not happen for multi-character delimiters.
+Note that the combination C<\\> is left intact, just as it was.
-Starting from this step no information about the delimiter(s) is used in the
-parsing.
+Starting from this step no information about the delimiters is
+used in parsing.
=item Interpolation
-Next step is interpolation in the obtained delimiter-independent text.
-There are four different cases.
+The next step is interpolation in the text obtained, which is now
+delimiter-independent. There are four different cases.
=over
@@ -1345,46 +1391,42 @@ No interpolation is performed.
The only interpolation is removal of C<\> from pairs C<\\>.
-=item C<"">, C<``>, C<qq//>, C<qx//>, C<<file*globE<gt>>
-
-C<\Q>, C<\U>, C<\u>, C<\L>, C<\l> (possibly paired with C<\E>) are converted
-to corresponding Perl constructs, thus C<"$foo\Qbaz$bar"> is converted to :
-
- $foo . (quotemeta("baz" . $bar));
+=item C<"">, C<``>, C<qq//>, C<qx//>, C<< <file*glob> >>
-Other combinations of C<\> with following chars are substituted with
-appropriate expansions.
+C<\Q>, C<\U>, C<\u>, C<\L>, C<\l> (possibly paired with C<\E>) are
+converted to corresponding Perl constructs. Thus, C<"$foo\Qbaz$bar">
+is converted to C<$foo . (quotemeta("baz" . $bar))> internally.
+The other combinations are replaced with appropriate expansions.
-Let it be stressed that I<whatever is between C<\Q> and C<\E>> is interpolated
-in the usual way. Say, C<"\Q\\E"> has no C<\E> inside: it has C<\Q>, C<\\>,
-and C<E>, thus the result is the same as for C<"\\\\E">. Generally speaking,
-having backslashes between C<\Q> and C<\E> may lead to counterintuitive
-results. So, C<"\Q\t\E"> is converted to:
-
- quotemeta("\t")
-
-which is the same as C<"\\\t"> (since TAB is not alphanumerical). Note also
-that:
+Let it be stressed that I<whatever falls between C<\Q> and C<\E>>
+is interpolated in the usual way. Something like C<"\Q\\E"> has
+no C<\E> inside. instead, it has C<\Q>, C<\\>, and C<E>, so the
+result is the same as for C<"\\\\E">. As a general rule, backslashes
+between C<\Q> and C<\E> may lead to counterintuitive results. So,
+C<"\Q\t\E"> is converted to C<quotemeta("\t")>, which is the same
+as C<"\\\t"> (since TAB is not alphanumeric). Note also that:
$str = '\t';
return "\Q$str";
may be closer to the conjectural I<intention> of the writer of C<"\Q\t\E">.
-Interpolated scalars and arrays are internally converted to the C<join> and
-C<.> Perl operations, thus C<"$foo >>> '@arr'"> becomes:
+Interpolated scalars and arrays are converted internally to the C<join> and
+C<.> catentation operations. Thus, C<"$foo XXX '@arr'"> becomes:
- $foo . " >>> '" . (join $", @arr) . "'";
+ $foo . " XXX '" . (join $", @arr) . "'";
-All the operations in the above are performed simultaneously left-to-right.
+All operations above are performed simultaneously, left to right.
-Since the result of "\Q STRING \E" has all the metacharacters quoted
-there is no way to insert a literal C<$> or C<@> inside a C<\Q\E> pair: if
-protected by C<\> C<$> will be quoted to became "\\\$", if not, it is
-interpreted as starting an interpolated scalar.
+Because the result of C<"\Q STRING \E"> has all metacharacters
+quoted, there is no way to insert a literal C<$> or C<@> inside a
+C<\Q\E> pair. If protected by C<\>, C<$> will be quoted to became
+C<"\\\$">; if not, it is interpreted as the start of an interpolated
+scalar.
-Note also that the interpolating code needs to make a decision on where the
-interpolated scalar ends. For instance, whether C<"a $b -E<gt> {c}"> means:
+Note also that the interpolation code needs to make a decision on
+where the interpolated scalar ends. For instance, whether
+C<< "a $b -> {c}" >> really means:
"a " . $b . " -> {c}";
@@ -1392,99 +1434,108 @@ or:
"a " . $b -> {c};
-I<Most of the time> the decision is to take the longest possible text which
-does not include spaces between components and contains matching
-braces/brackets. Since the outcome may be determined by I<voting> based
-on heuristic estimators, the result I<is not strictly predictable>, but
-is usually correct for the ambiguous cases.
+Most of the time, the longest possible text that does not include
+spaces between components and which contains matching braces or
+brackets. because the outcome may be determined by voting based
+on heuristic estimators, the result is not strictly predictable.
+Fortunately, it's usually correct for ambiguous cases.
=item C<?RE?>, C</RE/>, C<m/RE/>, C<s/RE/foo/>,
-Processing of C<\Q>, C<\U>, C<\u>, C<\L>, C<\l> and interpolation happens
-(almost) as with C<qq//> constructs, but I<the substitution of C<\> followed by
-RE-special chars (including C<\>) is not performed>! Moreover,
-inside C<(?{BLOCK})>, C<(?# comment )>, and C<#>-comment of
-C<//x>-regular expressions no processing is performed at all.
-This is the first step where presence of the C<//x> switch is relevant.
-
-Interpolation has several quirks: C<$|>, C<$(> and C<$)> are not interpolated, and
-constructs C<$var[SOMETHING]> are I<voted> (by several different estimators)
-to be an array element or C<$var> followed by a RE alternative. This is
-the place where the notation C<${arr[$bar]}> comes handy: C</${arr[0-9]}/>
-is interpreted as an array element C<-9>, not as a regular expression from
-variable C<$arr> followed by a digit, which is the interpretation of
-C</$arr[0-9]/>. Since voting among different estimators may be performed,
-the result I<is not predictable>.
-
-It is on this step that C<\1> is converted to C<$1> in the replacement
-text of C<s///>.
-
-Note that absence of processing of C<\\> creates specific restrictions on the
-post-processed text: if the delimiter is C</>, one cannot get the combination
-C<\/> into the result of this step: C</> will finish the regular expression,
-C<\/> will be stripped to C</> on the previous step, and C<\\/> will be left
-as is. Since C</> is equivalent to C<\/> inside a regular expression, this
-does not matter unless the delimiter is a special character for the RE engine,
-as in C<s*foo*bar*>, C<m[foo]>, or C<?foo?>, or an alphanumeric char, as in:
+Processing of C<\Q>, C<\U>, C<\u>, C<\L>, C<\l>, and interpolation
+happens (almost) as with C<qq//> constructs, but the substitution
+of C<\> followed by RE-special chars (including C<\>) is not
+performed. Moreover, inside C<(?{BLOCK})>, C<(?# comment )>, and
+a C<#>-comment in a C<//x>-regular expression, no processing is
+performed whatsoever. This is the first step at which the presence
+of the C<//x> modifier is relevant.
+
+Interpolation has several quirks: C<$|>, C<$(>, and C<$)> are not
+interpolated, and constructs C<$var[SOMETHING]> are voted (by several
+different estimators) to be either an array element or C<$var>
+followed by an RE alternative. This is where the notation
+C<${arr[$bar]}> comes handy: C</${arr[0-9]}/> is interpreted as
+array element C<-9>, not as a regular expression from the variable
+C<$arr> followed by a digit, which would be the interpretation of
+C</$arr[0-9]/>. Since voting among different estimators may occur,
+the result is not predictable.
+
+It is at this step that C<\1> is begrudgingly converted to C<$1> in
+the replacement text of C<s///> to correct the incorrigible
+I<sed> hackers who haven't picked up the saner idiom yet. A warning
+is emitted if the C<use warnings> pragma or the B<-w> command-line flag
+(that is, the C<$^W> variable) was set.
+
+The lack of processing of C<\\> creates specific restrictions on
+the post-processed text. If the delimiter is C</>, one cannot get
+the combination C<\/> into the result of this step. C</> will
+finish the regular expression, C<\/> will be stripped to C</> on
+the previous step, and C<\\/> will be left as is. Because C</> is
+equivalent to C<\/> inside a regular expression, this does not
+matter unless the delimiter happens to be character special to the
+RE engine, such as in C<s*foo*bar*>, C<m[foo]>, or C<?foo?>; or an
+alphanumeric char, as in:
m m ^ a \s* b mmx;
-In the above RE, which is intentionally obfuscated for illustration, the
+In the RE above, which is intentionally obfuscated for illustration, the
delimiter is C<m>, the modifier is C<mx>, and after backslash-removal the
-RE is the same as for C<m/ ^ a s* b /mx>).
+RE is the same as for C<m/ ^ a s* b /mx>). There's more than one
+reason you're encouraged to restrict your delimiters to non-alphanumeric,
+non-whitespace choices.
=back
-This step is the last one for all the constructs except regular expressions,
+This step is the last one for all constructs except regular expressions,
which are processed further.
=item Interpolation of regular expressions
-All the previous steps were performed during the compilation of Perl code,
-this one happens in run time (though it may be optimized to be calculated
-at compile time if appropriate). After all the preprocessing performed
-above (and possibly after evaluation if catenation, joining, up/down-casing
-and C<quotemeta()>ing are involved) the resulting I<string> is passed to RE
-engine for compilation.
-
-Whatever happens in the RE engine is better be discussed in L<perlre>,
-but for the sake of continuity let us do it here.
-
-This is another step where presence of the C<//x> switch is relevant.
-The RE engine scans the string left-to-right, and converts it to a finite
-automaton.
-
-Backslashed chars are either substituted by corresponding literal
-strings (as with C<\{>), or generate special nodes of the finite automaton
-(as with C<\b>). Characters which are special to the RE engine (such as
-C<|>) generate corresponding nodes or groups of nodes. C<(?#...)>
-comments are ignored. All the rest is either converted to literal strings
-to match, or is ignored (as is whitespace and C<#>-style comments if
-C<//x> is present).
-
-Note that the parsing of the construct C<[...]> is performed using
-rather different rules than for the rest of the regular expression.
-The terminator of this construct is found using the same rules as for
-finding a terminator of a C<{}>-delimited construct, the only exception
-being that C<]> immediately following C<[> is considered as if preceded
-by a backslash. Similarly, the terminator of C<(?{...})> is found using
-the same rules as for finding a terminator of a C<{}>-delimited construct.
-
-It is possible to inspect both the string given to RE engine, and the
-resulting finite automaton. See arguments C<debug>/C<debugcolor>
-of C<use L<re>> directive, and/or B<-Dr> option of Perl in
-L<perlrun/Switches>.
+Previous steps were performed during the compilation of Perl code,
+but this one happens at run time--although it may be optimized to
+be calculated at compile time if appropriate. After preprocessing
+described above, and possibly after evaluation if catenation,
+joining, casing translation, or metaquoting are involved, the
+resulting I<string> is passed to the RE engine for compilation.
+
+Whatever happens in the RE engine might be better discussed in L<perlre>,
+but for the sake of continuity, we shall do so here.
+
+This is another step where the presence of the C<//x> modifier is
+relevant. The RE engine scans the string from left to right and
+converts it to a finite automaton.
+
+Backslashed characters are either replaced with corresponding
+literal strings (as with C<\{>), or else they generate special nodes
+in the finite automaton (as with C<\b>). Characters special to the
+RE engine (such as C<|>) generate corresponding nodes or groups of
+nodes. C<(?#...)> comments are ignored. All the rest is either
+converted to literal strings to match, or else is ignored (as is
+whitespace and C<#>-style comments if C<//x> is present).
+
+Parsing of the bracketed character class construct, C<[...]>, is
+rather different than the rule used for the rest of the pattern.
+The terminator of this construct is found using the same rules as
+for finding the terminator of a C<{}>-delimited construct, the only
+exception being that C<]> immediately following C<[> is treated as
+though preceded by a backslash. Similarly, the terminator of
+C<(?{...})> is found using the same rules as for finding the
+terminator of a C<{}>-delimited construct.
+
+It is possible to inspect both the string given to RE engine and the
+resulting finite automaton. See the arguments C<debug>/C<debugcolor>
+in the C<use L<re>> pragma, as well as Perl's B<-Dr> command-line
+switch documented in L<perlrun/"Command Switches">.
=item Optimization of regular expressions
This step is listed for completeness only. Since it does not change
semantics, details of this step are not documented and are subject
-to change. This step is performed over the finite automaton generated
-during the previous pass.
+to change without notice. This step is performed over the finite
+automaton that was generated during the previous pass.
-However, in older versions of Perl C<L<split>> used to silently
-optimize C</^/> to mean C</^/m>. This behaviour, though present
-in current versions of Perl, may be deprecated in future.
+It is at this stage that C<split()> silently optimizes C</^/> to
+mean C</^/m>.
=back
@@ -1493,39 +1544,40 @@ in current versions of Perl, may be deprecated in future.
There are several I/O operators you should know about.
A string enclosed by backticks (grave accents) first undergoes
-variable substitution just like a double quoted string. It is then
-interpreted as a command, and the output of that command is the value
-of the pseudo-literal, like in a shell. In scalar context, a single
-string consisting of all the output is returned. In list context,
-a list of values is returned, one for each line of output. (You can
-set C<$/> to use a different line terminator.) The command is executed
+double-quote interpolation. It is then interpreted as an external
+command, and the output of that command is the value of the
+pseudo-literal, j
+string consisting of all output is returned. In list context, a
+list of values is returned, one per line of output. (You can set
+C<$/> to use a different line terminator.) The command is executed
each time the pseudo-literal is evaluated. The status value of the
command is returned in C<$?> (see L<perlvar> for the interpretation
of C<$?>). Unlike in B<csh>, no translation is done on the return
data--newlines remain newlines. Unlike in any of the shells, single
quotes do not hide variable names in the command from interpretation.
-To pass a $ through to the shell you need to hide it with a backslash.
-The generalized form of backticks is C<qx//>. (Because backticks
-always undergo shell expansion as well, see L<perlsec> for
-security concerns.)
-
-In a scalar context, evaluating a filehandle in angle brackets yields the
-next line from that file (newline, if any, included), or C<undef> at
-end-of-file. When C<$/> is set to C<undef> (i.e. file slurp mode),
-and the file is empty, it returns C<''> the first time, followed by
-C<undef> subsequently.
-
-Ordinarily you must assign the returned value to a variable, but there is one
-situation where an automatic assignment happens. I<If and ONLY if> the
-input symbol is the only thing inside the conditional of a C<while> or
-C<for(;;)> loop, the value is automatically assigned to the variable
-C<$_>. In these loop constructs, the assigned value (whether assignment
-is automatic or explicit) is then tested to see if it is defined.
-The defined test avoids problems where line has a string value
-that would be treated as false by perl e.g. "" or "0" with no trailing
-newline. (This may seem like an odd thing to you, but you'll use the
-construct in almost every Perl script you write.) Anyway, the following
-lines are equivalent to each other:
+To pass a literal dollar-sign through to the shell you need to hide
+it with a backslash. The generalized form of backticks is C<qx//>.
+(Because backticks always undergo shell expansion as well, see
+L<perlsec> for security concerns.)
+
+In scalar context, evaluating a filehandle in angle brackets yields
+the next line from that file (the newline, if any, included), or
+C<undef> at end-of-file or on error. When C<$/> is set to C<undef>
+(sometimes known as file-slurp mode) and the file is empty, it
+returns C<''> the first time, followed by C<undef> subsequently.
+
+Ordinarily you must assign the returned value to a variable, but
+there is one situation where an automatic assignment happens. If
+and only if the input symbol is the only thing inside the conditional
+of a C<while> statement (even if disguised as a C<for(;;)> loop),
+the value is automatically assigned to the global variable $_,
+destroying whatever was there previously. (This may seem like an
+odd thing to you, but you'll use the construct in almost every Perl
+script you write.) The $_ variables is not implicitly localized.
+You'll have to put a C<local $_;> before the loop if you want that
+to happen.
+
+The following lines are equivalent:
while (defined($_ = <STDIN>)) { print; }
while ($_ = <STDIN>) { print; }
@@ -1535,37 +1587,44 @@ lines are equivalent to each other:
print while ($_ = <STDIN>);
print while <STDIN>;
-and this also behaves similarly, but avoids the use of $_ :
+This also behaves similarly, but avoids $_ :
while (my $line = <STDIN>) { print $line }
-If you really mean such values to terminate the loop they should be
-tested for explicitly:
+In these loop constructs, the assigned value (whether assignment
+is automatic or explicit) is then tested to see whether it is
+defined. The defined test avoids problems where line has a string
+value that would be treated as false by Perl, for example a "" or
+a "0" with no trailing newline. If you really mean for such values
+to terminate the loop, they should be tested for explicitly:
while (($_ = <STDIN>) ne '0') { ... }
while (<STDIN>) { last unless $_; ... }
-In other boolean contexts, C<E<lt>I<filehandle>E<gt>> without explicit C<defined>
-test or comparison will solicit a warning if C<-w> is in effect.
+In other boolean contexts, C<< <I<filehandle>> >> without an
+explicit C<defined> test or comparison elicit a warning if the
+C<use warnings> pragma or the B<-w>
+command-line switch (the C<$^W> variable) is in effect.
The filehandles STDIN, STDOUT, and STDERR are predefined. (The
-filehandles C<stdin>, C<stdout>, and C<stderr> will also work except in
-packages, where they would be interpreted as local identifiers rather
-than global.) Additional filehandles may be created with the open()
-function. See L<perlfunc/open> for details on this.
-
-If a E<lt>FILEHANDLEE<gt> is used in a context that is looking for a list, a
-list consisting of all the input lines is returned, one line per list
-element. It's easy to make a I<LARGE> data space this way, so use with
-care.
-
-E<lt>FILEHANDLEE<gt> may also be spelt readline(FILEHANDLE). See
-L<perlfunc/readline>.
-
-The null filehandle E<lt>E<gt> is special and can be used to emulate the
-behavior of B<sed> and B<awk>. Input from E<lt>E<gt> comes either from
+filehandles C<stdin>, C<stdout>, and C<stderr> will also work except
+in packages, where they would be interpreted as local identifiers
+rather than global.) Additional filehandles may be created with
+the open() function, amongst others. See L<perlopentut> and
+L<perlfunc/open> for details on this.
+
+If a <FILEHANDLE> is used in a context that is looking for
+a list, a list comprising all input lines is returned, one line per
+list element. It's easy to grow to a rather large data space this
+way, so use with care.
+
+<FILEHANDLE> may also be spelled C<readline(*FILEHANDLE)>.
+See L<perlfunc/readline>.
+
+The null filehandle <> is special: it can be used to emulate the
+behavior of B<sed> and B<awk>. Input from <> comes either from
standard input, or from each file listed on the command line. Here's
-how it works: the first time E<lt>E<gt> is evaluated, the @ARGV array is
+how it works: the first time <> is evaluated, the @ARGV array is
checked, and if it is empty, C<$ARGV[0]> is set to "-", which when opened
gives you standard input. The @ARGV array is then processed as a list
of filenames. The loop
@@ -1584,16 +1643,17 @@ is equivalent to the following Perl-like pseudo code:
}
}
-except that it isn't so cumbersome to say, and will actually work. It
-really does shift array @ARGV and put the current filename into variable
-$ARGV. It also uses filehandle I<ARGV> internally--E<lt>E<gt> is just a
-synonym for E<lt>ARGVE<gt>, which is magical. (The pseudo code above
-doesn't work because it treats E<lt>ARGVE<gt> as non-magical.)
+except that it isn't so cumbersome to say, and will actually work.
+It really does shift the @ARGV array and put the current filename
+into the $ARGV variable. It also uses filehandle I<ARGV>
+internally--<> is just a synonym for <ARGV>, which
+is magical. (The pseudo code above doesn't work because it treats
+<ARGV> as non-magical.)
-You can modify @ARGV before the first E<lt>E<gt> as long as the array ends up
+You can modify @ARGV before the first <> as long as the array ends up
containing the list of filenames you really want. Line numbers (C<$.>)
-continue as if the input were one big happy file. (But see example
-under C<eof> for how to reset line numbers on each file.)
+continue as though the input were one big happy file. See the example
+in L<perlfunc/eof> for how to reset line numbers on each file.
If you want to set @ARGV to your own list of files, go right ahead.
This sets @ARGV to all plain text files if no @ARGV was given:
@@ -1620,13 +1680,14 @@ Getopts modules or put a loop on the front like this:
# ... # code for each line
}
-The E<lt>E<gt> symbol will return C<undef> for end-of-file only once.
-If you call it again after this it will assume you are processing another
-@ARGV list, and if you haven't set @ARGV, will input from STDIN.
+The <> symbol will return C<undef> for end-of-file only once.
+If you call it again after this, it will assume you are processing another
+@ARGV list, and if you haven't set @ARGV, will read input from STDIN.
-If the string inside the angle brackets is a reference to a scalar
-variable (e.g., E<lt>$fooE<gt>), then that variable contains the name of the
-filehandle to input from, or its typeglob, or a reference to the same. For example:
+If angle brackets contain is a simple scalar variable (e.g.,
+<$foo>), then that variable contains the name of the
+filehandle to input from, or its typeglob, or a reference to the
+same. For example:
$fh = \*STDIN;
$line = <$fh>;
@@ -1635,25 +1696,25 @@ If what's within the angle brackets is neither a filehandle nor a simple
scalar variable containing a filehandle name, typeglob, or typeglob
reference, it is interpreted as a filename pattern to be globbed, and
either a list of filenames or the next filename in the list is returned,
-depending on context. This distinction is determined on syntactic
-grounds alone. That means C<E<lt>$xE<gt>> is always a readline from
-an indirect handle, but C<E<lt>$hash{key}E<gt>> is always a glob.
+depending on context. This distinction is determined on syntactic
+grounds alone. That means C<< <$x> >> is always a readline() from
+an indirect handle, but C<< <$hash{key}> >> is always a glob().
That's because $x is a simple scalar variable, but C<$hash{key}> is
not--it's a hash element.
One level of double-quote interpretation is done first, but you can't
-say C<E<lt>$fooE<gt>> because that's an indirect filehandle as explained
+say C<< <$foo> >> because that's an indirect filehandle as explained
in the previous paragraph. (In older versions of Perl, programmers
would insert curly brackets to force interpretation as a filename glob:
-C<E<lt>${foo}E<gt>>. These days, it's considered cleaner to call the
+C<< <${foo}> >>. These days, it's considered cleaner to call the
internal function directly as C<glob($foo)>, which is probably the right
-way to have done it in the first place.) Example:
+way to have done it in the first place.) For example:
while (<*.c>) {
chmod 0644, $_;
}
-is equivalent to
+is roughly equivalent to:
open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
while (<FOO>) {
@@ -1661,27 +1722,22 @@ is equivalent to
chmod 0644, $_;
}
-In fact, it's currently implemented that way. (Which means it will not
-work on filenames with spaces in them unless you have csh(1) on your
-machine.) Of course, the shortest way to do the above is:
+except that the globbing is actually done internally using the standard
+C<File::Glob> extension. Of course, the shortest way to do the above is:
chmod 0644, <*.c>;
-Because globbing invokes a shell, it's often faster to call readdir() yourself
-and do your own grep() on the filenames. Furthermore, due to its current
-implementation of using a shell, the glob() routine may get "Arg list too
-long" errors (unless you've installed tcsh(1L) as F</bin/csh>).
-
-A glob evaluates its (embedded) argument only when it is starting a new
-list. All values must be read before it will start over. In a list
-context this isn't important, because you automatically get them all
-anyway. In scalar context, however, the operator returns the next value
-each time it is called, or a C<undef> value if you've just run out. As
-for filehandles an automatic C<defined> is generated when the glob
-occurs in the test part of a C<while> or C<for> - because legal glob returns
-(e.g. a file called F<0>) would otherwise terminate the loop.
-Again, C<undef> is returned only once. So if you're expecting a single value
-from a glob, it is much better to say
+A (file)glob evaluates its (embedded) argument only when it is
+starting a new list. All values must be read before it will start
+over. In list context, this isn't important because you automatically
+get them all anyway. However, in scalar context the operator returns
+the next value each time it's called, or C
+run out. As with filehandle reads, an automatic C<defined> is
+generated when the glob occurs in the test part of a C<while>,
+because legal glob returns (e.g. a file called F<0>) would otherwise
+terminate the loop. Again, C<undef> is returned only once. So if
+you're expecting a single value from a glob, it is much better to
+say
($file) = <blurch*>;
@@ -1690,7 +1746,7 @@ than
$file = <blurch*>;
because the latter will alternate between returning a filename and
-returning FALSE.
+returning false.
It you're trying to do variable interpolation, it's definitely better
to use the glob() function, because the older notation can cause people
@@ -1702,10 +1758,10 @@ to become confused with the indirect filehandle notation.
=head2 Constant Folding
Like C, Perl does a certain amount of expression evaluation at
-compile time, whenever it determines that all arguments to an
+compile time whenever it determines that all arguments to an
operator are static and have no side effects. In particular, string
concatenation happens at compile time between literals that don't do
-variable substitution. Backslash interpretation also happens at
+variable substitution. Backslash interpolation also happens at
compile time. You can say
'Now is the time for all' . "\n" .
@@ -1718,20 +1774,20 @@ you say
if (-s $file > 5 + 100 * 2**16) { }
}
-the compiler will precompute the number that
-expression represents so that the interpreter
-won't have to.
+the compiler will precompute the number which that expression
+represents so that the interpreter won't have to.
=head2 Bitwise String Operators
Bitstrings of any size may be manipulated by the bitwise operators
(C<~ | & ^>).
-If the operands to a binary bitwise op are strings of different sizes,
-B<|> and B<^> ops will act as if the shorter operand had additional
-zero bits on the right, while the B<&> op will act as if the longer
-operand were truncated to the length of the shorter. Note that the
-granularity for such extension or truncation is one or more I<bytes>.
+If the operands to a binary bitwise op are strings of different
+sizes, B<|> and B<^> ops act as though the shorter operand had
+additional zero bits on the right, while the B<&> op acts as though
+the longer operand were truncated to the length of the shorter.
+The granularity for such extension or truncation is one or more
+bytes.
# ASCII-based examples
print "j p \n" ^ " a h"; # prints "JAPH\n"
@@ -1739,9 +1795,9 @@ granularity for such extension or truncation is one or more I<bytes>.
print "japh\nJunk" & '_____'; # prints "JAPH\n";
print 'p N$' ^ " E<H\n"; # prints "Perl\n";
-If you are intending to manipulate bitstrings, you should be certain that
+If you are intending to manipulate bitstrings, be certain that
you're supplying bitstrings: If an operand is a number, that will imply
-a B<numeric> bitwise operation. You may explicitly show which type of
+a B<numeric> bitwise operation. You may explicitly show which type of
operation you intend by using C<""> or C<0+>, as in the examples below.
$foo = 150 | 105 ; # yields 255 (0x96 | 0x69 is 0xFF)
@@ -1757,33 +1813,39 @@ in a bit vector.
=head2 Integer Arithmetic
-By default Perl assumes that it must do most of its arithmetic in
+By default, Perl assumes that it must do most of its arithmetic in
floating point. But by saying
use integer;
you may tell the compiler that it's okay to use integer operations
-from here to the end of the enclosing BLOCK. An inner BLOCK may
-countermand this by saying
+(if it feels like it) from here to the end of the enclosing BLOCK.
+An inner BLOCK may countermand this by saying
no integer;
-which lasts until the end of that BLOCK.
-
-The bitwise operators ("&", "|", "^", "~", "<<", and ">>") always
-produce integral results. (But see also L<Bitwise String Operators>.)
-However, C<use integer> still has meaning
-for them. By default, their results are interpreted as unsigned
-integers. However, if C<use integer> is in effect, their results are
-interpreted as signed integers. For example, C<~0> usually evaluates
-to a large integral value. However, C<use integer; ~0> is -1 on twos-complement machines.
+which lasts until the end of that BLOCK. Note that this doesn't
+mean everything is only an integer, merely that Perl may use integer
+operations if it is so inclined. For example, even under C<use
+integer>, if you take the C<sqrt(2)>, you'll still get C<1.4142135623731>
+or so.
+
+Used on numbers, the bitwise operators ("&", "|", "^", "~", "<<",
+and ">>") always produce integral results. (But see also L<Bitwise
+String Operators>.) However, C<use integer> still has meaning for
+them. By default, their results are interpreted as unsigned integers, but
+if C<use integer> is in effect, their results are interpreted
+as signed integers. For example, C<~0> usually evaluates to a large
+integral value. However, C<use integer; ~0> is C<-1> on twos-complement
+machines.
=head2 Floating-point Arithmetic
While C<use integer> provides integer-only arithmetic, there is no
-similar ways to provide rounding or truncation at a certain number of
-decimal places. For rounding to a certain number of digits, sprintf()
-or printf() is usually the easiest route.
+analogous mechanism to provide automatic rounding or truncation to a
+certain number of decimal places. For rounding to a certain number
+of digits, sprintf() or printf() is usually the easiest route.
+See L<perlfaq4>.
Floating-point numbers are only approximations to what a mathematician
would call real numbers. There are infinitely more reals than floats,
@@ -1807,10 +1869,10 @@ this topic.
}
The POSIX module (part of the standard perl distribution) implements
-ceil(), floor(), and a number of other mathematical and trigonometric
-functions. The Math::Complex module (part of the standard perl
-distribution) defines a number of mathematical functions that can also
-work on real numbers. Math::Complex not as efficient as POSIX, but
+ceil(), floor(), and other mathematical and trigonometric functions.
+The Math::Complex module (part of the standard perl distribution)
+defines mathematical functions that work on both the reals and the
+imaginary numbers. Math::Complex not as efficient as POSIX, but
POSIX can't work with complex numbers.
Rounding in financial applications can have serious implications, and
@@ -1822,13 +1884,19 @@ need yourself.
=head2 Bigger Numbers
The standard Math::BigInt and Math::BigFloat modules provide
-variable precision arithmetic and overloaded operators.
-At the cost of some space and considerable speed, they
-avoid the normal pitfalls associated with limited-precision
-representations.
+variable-precision arithmetic and overloaded operators, although
+they're currently pretty slow. At the cost of some space and
+considerable speed, they avoid the normal pitfalls associated with
+limited-precision representations.
use Math::BigInt;
$x = Math::BigInt->new('123456789123456789');
print $x * $x;
# prints +15241578780673678515622620750190521
+
+The non-standard modules SSLeay::BN and Math::Pari provide
+equivalent functionality (and much more) with a substantial
+performance savings.
+
+=cut
diff --git a/contrib/perl5/pod/perlopentut.pod b/contrib/perl5/pod/perlopentut.pod
index 6e6091a..9cb9f67 100644
--- a/contrib/perl5/pod/perlopentut.pod
+++ b/contrib/perl5/pod/perlopentut.pod
@@ -73,7 +73,7 @@ from a different file, and forget to trim it before opening:
This is not a bug, but a feature. Because C<open> mimics the shell in
its style of using redirection arrows to specify how to open the file, it
also does so with respect to extra white space around the filename itself
-as well. For accessing files with naughty names, see L</"Dispelling
+as well. For accessing files with naughty names, see L<"Dispelling
the Dweomer">.
=head2 Pipe Opens
@@ -84,7 +84,7 @@ C<popen> function. But in the shell, you just use a different redirection
character. That's also the case for Perl. The C<open> call
remains the same--just its argument differs.
-If the leading character is a pipe symbol, C<open) starts up a new
+If the leading character is a pipe symbol, C<open> starts up a new
command and open a write-only filehandle leading into that command.
This lets you write into that handle and have what you write show up on
that command's standard input. For example:
@@ -123,9 +123,9 @@ special way. If you open minus for reading, it really means to access
the standard input. If you open minus for writing, it really means to
access the standard output.
-If minus can be used as the default input or default output? What happens
+If minus can be used as the default input or default output, what happens
if you open a pipe into or out of minus? What's the default command it
-would run? The same script as you're current running! This is actually
+would run? The same script as you're currently running! This is actually
a stealth C<fork> hidden inside an C<open> call. See L<perlipc/"Safe Pipe
Opens"> for details.
@@ -175,7 +175,7 @@ L<perlfaq5> for more details.
One of the most common uses for C<open> is one you never
even notice. When you process the ARGV filehandle using
-C<E<lt>ARGVE<gt>>, Perl actually does an implicit open
+C<< <ARGV> >>, Perl actually does an implicit open
on each file in @ARGV. Thus a program called like this:
$ myprogram file1 file2 file3
@@ -189,7 +189,7 @@ using a construct no more complex than:
If @ARGV is empty when the loop first begins, Perl pretends you've opened
up minus, that is, the standard input. In fact, $ARGV, the currently
-open file during C<E<lt>ARGVE<gt>> processing, is even set to "-"
+open file during C<< <ARGV> >> processing, is even set to "-"
in these circumstances.
You are welcome to pre-process your @ARGV before starting the loop to
@@ -239,7 +239,7 @@ Here's an example:
or die "can't open $pwdinfo: $!";
This sort of thing also comes into play in filter processing. Because
-C<E<lt>ARGVE<gt>> processing employs the normal, shell-style Perl C<open>,
+C<< <ARGV> >> processing employs the normal, shell-style Perl C<open>,
it respects all the special things we've already seen:
$ myprogram f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
@@ -264,7 +264,7 @@ you can fetch URLs before processing them:
@ARGV = map { m#^\w+://# ? "GET $_ |" : $_ } @ARGV;
-It's not for nothing that this is called magic C<E<lt>ARGVE<gt>>.
+It's not for nothing that this is called magic C<< <ARGV> >>.
Pretty nifty, eh?
=head1 Open E<agrave> la C
@@ -303,11 +303,13 @@ from the Fcntl module, which supplies the following standard flags:
O_TRUNC Truncate the file
O_NONBLOCK Non-blocking access
-Less common flags that are sometimes available on some operating systems
-include C<O_BINARY>, C<O_TEXT>, C<O_SHLOCK>, C<O_EXLOCK>, C<O_DEFER>,
-C<O_SYNC>, C<O_ASYNC>, C<O_DSYNC>, C<O_RSYNC>, C<O_NOCTTY>, C<O_NDELAY>
-and C<O_LARGEFILE>. Consult your open(2) manpage or its local equivalent
-for details.
+Less common flags that are sometimes available on some operating
+systems include C<O_BINARY>, C<O_TEXT>, C<O_SHLOCK>, C<O_EXLOCK>,
+C<O_DEFER>, C<O_SYNC>, C<O_ASYNC>, C<O_DSYNC>, C<O_RSYNC>,
+C<O_NOCTTY>, C<O_NDELAY> and C<O_LARGEFILE>. Consult your open(2)
+manpage or its local equivalent for details. (Note: starting from
+Perl release 5.6 the O_LARGEFILE flag, if available, is automatically
+added to the sysopen() flags because large files are the the default.)
Here's how to use C<sysopen> to emulate the simple C<open> calls we had
before. We'll omit the C<|| die $!> checks for clarity, but make sure
@@ -391,7 +393,7 @@ folders, cookie files, and internal temporary files.
Sometimes you already have a filehandle open, and want to make another
handle that's a duplicate of the first one. In the shell, we place an
ampersand in front of a file descriptor number when doing redirections.
-For example, C<2E<gt>&1> makes descriptor 2 (that's STDERR in Perl)
+For example, C<< 2>&1 >> makes descriptor 2 (that's STDERR in Perl)
be redirected into descriptor 1 (which is usually Perl's STDOUT).
The same is essentially true in Perl: a filename that begins with an
ampersand is treated instead as a file descriptor if a number, or as a
@@ -442,8 +444,8 @@ these days. Here's an example of that:
$fd = $ENV{"MHCONTEXTFD"};
open(MHCONTEXT, "<&=$fd") or die "couldn't fdopen $fd: $!";
-If you're using magic C<E<lt>ARGVE<gt>>, you could even pass in as a
-command line argument in @ARGV something like C<"E<lt>&=$MHCONTEXTFD">,
+If you're using magic C<< <ARGV> >>, you could even pass in as a
+command line argument in @ARGV something like C<"<&=$MHCONTEXTFD">,
but we've never seen anyone actually do this.
=head2 Dispelling the Dweomer
@@ -472,7 +474,7 @@ The only vaguely popular system that doesn't work this way is the
proprietary Macintosh system, which uses a colon where the rest of us
use a slash. Maybe C<sysopen> isn't such a bad idea after all.
-If you want to use C<E<lt>ARGVE<gt>> processing in a totally boring
+If you want to use C<< <ARGV> >> processing in a totally boring
and non-magical way, you could do this first:
# "Sam sat on the ground and put his head in his hands.
@@ -494,7 +496,7 @@ to mean standard input, per the standard convention.
You've probably noticed how Perl's C<warn> and C<die> functions can
produce messages like:
- Some warning at scriptname line 29, <FH> chunk 7.
+ Some warning at scriptname line 29, <FH> line 7.
That's because you opened a filehandle FH, and had read in seven records
from it. But what was the name of the file, not the handle?
@@ -510,7 +512,7 @@ temporarily, then all you have to do is this:
Since you're using the pathname of the file as its handle,
you'll get warnings more like
- Some warning at scriptname line 29, </etc/motd> chunk 7.
+ Some warning at scriptname line 29, </etc/motd> line 7.
=head2 Single Argument Open
@@ -694,7 +696,7 @@ the doctor ordered. There's no filehandle interface, but
it's still easy to get the contents of a document:
use LWP::Simple;
- $doc = get('http://www.sn.no/libwww-perl/');
+ $doc = get('http://www.linpro.no/lwp/');
=head2 Binary Files
diff --git a/contrib/perl5/pod/perlpod.pod b/contrib/perl5/pod/perlpod.pod
index 7fa8290..6c0c534 100644
--- a/contrib/perl5/pod/perlpod.pod
+++ b/contrib/perl5/pod/perlpod.pod
@@ -11,7 +11,6 @@ L<verbatim|/"Verbatim Paragraph">,
L<command|/"Command Paragraph">, and
L<ordinary text|/"Ordinary Block of Text">.
-
=head2 Verbatim Paragraph
A verbatim paragraph, distinguished by being indented (that is,
@@ -20,7 +19,6 @@ with tabs assumed to be on 8-column boundaries. There are no
special formatting escapes, so you can't italicize or anything
like that. A \ means \, and nothing else.
-
=head2 Command Paragraph
All command paragraphs start with "=", followed by an
@@ -75,7 +73,6 @@ or use "=item 1.", "=item 2.", etc., to produce numbered lists, or use
or numbers. If you start with bullets or numbers, stick with them, as many
formatters use the first "=item" type to decide how to format the list.
-
=item =for
=item =begin
@@ -149,20 +146,19 @@ Some examples of lists include:
=back
-
=back
-
=head2 Ordinary Block of Text
It will be filled, and maybe even
justified. Certain interior sequences are recognized both
here and in commands:
- I<text> italicize text, used for emphasis or variables
- B<text> embolden text, used for switches and programs
- S<text> text contains non-breaking spaces
- C<code> literal code
+ I<text> Italicize text, used for emphasis or variables
+ B<text> Embolden text, used for switches and programs
+ S<text> Text contains non-breaking spaces
+ C<code> Render code in a typewriter font, or give some other
+ indication that this represents program text
L<name> A link (cross reference) to name
L<name> manual page
L<name/ident> item in manual page
@@ -178,7 +174,7 @@ here and in commands:
L<text|name/"sec">
L<text|"sec">
L<text|/"sec">
-
+
F<file> Used for filenames
X<index> An index entry
Z<> A zero-width character
@@ -193,6 +189,40 @@ here and in commands:
E<html> Some non-numeric HTML entity, such
as E<Agrave>
+Most of the time, you will only need a single set of angle brackets to
+delimit the beginning and end of interior sequences. However, sometimes
+you will want to put a right angle bracket (or greater-than sign '>')
+inside of a sequence. This is particularly common when using a sequence
+to provide a different font-type for a snippet of code. As with all
+things in Perl, there is more than one way to do it. One way is to
+simply escape the closing bracket using an C<E> sequence:
+
+ C<$a E<lt>=E<gt> $b>
+
+This will produce: "C<$a E<lt>=E<gt> $b>"
+
+A more readable, and perhaps more "plain" way is to use an alternate set of
+delimiters that doesn't require a ">" to be escaped. As of perl5.5.660,
+doubled angle brackets ("<<" and ">>") may be used I<if and only if there
+is whitespace immediately following the opening delimiter and immediately
+preceding the closing delimiter!> For example, the following will do the
+trick:
+
+ C<< $a <=> $b >>
+
+In fact, you can use as many repeated angle-brackets as you like so
+long as you have the same number of them in the opening and closing
+delimiters, and make sure that whitespace immediately follows the last
+'<' of the opening delimiter, and immediately precedes the first '>' of
+the closing delimiter. So the following will also work:
+
+ C<<< $a <=> $b >>>
+ C<<<< $a <=> $b >>>>
+
+This is currently supported by pod2text (Pod::Text), pod2man (Pod::Man),
+and any other pod2xxx and Pod::Xxxx translator that uses Pod::Parser
+1.093 or later.
+
=head2 The Intent
@@ -223,7 +253,6 @@ TeX, and other markup languages, as used for online documentation.
Translators exist for B<pod2man> (that's for nroff(1) and troff(1)),
B<pod2text>, B<pod2html>, B<pod2latex>, and B<pod2fm>.
-
=head2 Embedding Pods in Perl Modules
You can embed pod documentation in your Perl scripts. Start your
@@ -236,7 +265,6 @@ directive.
__END__
-
=head1 NAME
modern - I am a modern module
@@ -244,7 +272,6 @@ directive.
If you had not had that empty line there, then the translators wouldn't
have seen it.
-
=head2 Common Pod Pitfalls
=over 4
@@ -263,16 +290,15 @@ B<pod2man> for details). Thus, you shouldn't write things like C<the
LE<lt>fooE<gt> manpage>, if you want the translated document to read
sensibly.
-If you don need or want total control of the text used for a
-link in the output use the form LE<lt>show this text|fooE<gt>
-instead.
+If you need total control of the text used for a link in the output
+use the form LE<lt>show this text|fooE<gt> instead.
=item *
-The script F<pod/checkpods.PL> in the Perl source distribution
-provides skeletal checking for lines that look empty but aren't
-B<only>, but is there as a placeholder until someone writes
-Pod::Checker. The best way to check your pod is to pass it through
+The B<podchecker> command is provided to check pod syntax
+for errors and warnings. For example, it checks for completely
+blank lines in pod segments and for unknown escape sequences.
+It is still advised to pass it through
one or more translators and proofread the result, or print out the
result and proofread that. Some of the problems found may be bugs in
the translators, which you may or may not wish to work around.
@@ -281,7 +307,8 @@ the translators, which you may or may not wish to work around.
=head1 SEE ALSO
-L<pod2man> and L<perlsyn/"PODs: Embedded Documentation">
+L<pod2man>, L<perlsyn/"PODs: Embedded Documentation">,
+L<podchecker>
=head1 AUTHOR
diff --git a/contrib/perl5/pod/perlport.pod b/contrib/perl5/pod/perlport.pod
index c1a5483..6892b6a 100644
--- a/contrib/perl5/pod/perlport.pod
+++ b/contrib/perl5/pod/perlport.pod
@@ -2,33 +2,33 @@
perlport - Writing portable Perl
-
=head1 DESCRIPTION
-Perl runs on a variety of operating systems. While most of them share
-a lot in common, they also have their own very particular and unique
-features.
+Perl runs on numerous operating systems. While most of them share
+much in common, they also have their own unique features.
This document is meant to help you to find out what constitutes portable
-Perl code, so that once you have made your decision to write portably,
+Perl code. That way once you make a decision to write portably,
you know where the lines are drawn, and you can stay within them.
-There is a tradeoff between taking full advantage of B<a> particular type
-of computer, and taking advantage of a full B<range> of them. Naturally,
-as you make your range bigger (and thus more diverse), the common
-denominators drop, and you are left with fewer areas of common ground in
-which you can operate to accomplish a particular task. Thus, when you
-begin attacking a problem, it is important to consider which part of the
-tradeoff curve you want to operate under. Specifically, whether it is
-important to you that the task that you are coding needs the full
-generality of being portable, or if it is sufficient to just get the job
-done. This is the hardest choice to be made. The rest is easy, because
-Perl provides lots of choices, whichever way you want to approach your
+There is a tradeoff between taking full advantage of one particular
+type of computer and taking advantage of a full range of them.
+Naturally, as you broaden your range and become more diverse, the
+common factors drop, and you are left with an increasingly smaller
+area of common ground in which you can operate to accomplish a
+particular task. Thus, when you begin attacking a problem, it is
+important to consider under which part of the tradeoff curve you
+want to operate. Specifically, you must decide whether it is
+important that the task that you are coding have the full generality
+of being portable, or whether to just get the job done right now.
+This is the hardest choice to be made. The rest is easy, because
+Perl provides many choices, whichever way you want to approach your
problem.
Looking at it another way, writing portable code is usually about
-willfully limiting your available choices. Naturally, it takes discipline
-to do that.
+willfully limiting your available choices. Naturally, it takes
+discipline and sacrifice to do that. The product of portability
+and convenience may be a constant. You have been warned.
Be aware of two important points:
@@ -36,24 +36,24 @@ Be aware of two important points:
=item Not all Perl programs have to be portable
-There is no reason why you should not use Perl as a language to glue Unix
+There is no reason you should not use Perl as a language to glue Unix
tools together, or to prototype a Macintosh application, or to manage the
Windows registry. If it makes no sense to aim for portability for one
reason or another in a given program, then don't bother.
-=item The vast majority of Perl B<is> portable
+=item Nearly all of Perl already I<is> portable
Don't be fooled into thinking that it is hard to create portable Perl
code. It isn't. Perl tries its level-best to bridge the gaps between
what's available on different platforms, and all the means available to
use those features. Thus almost all Perl code runs on any machine
-without modification. But there I<are> some significant issues in
+without modification. But there are some significant issues in
writing portable code, and this document is entirely about those issues.
=back
-Here's the general rule: When you approach a task that is commonly done
-using a whole range of platforms, think in terms of writing portable
+Here's the general rule: When you approach a task commonly done
+using a whole range of platforms, think about writing portable
code. That way, you don't sacrifice much by way of the implementation
choices you can avail yourself of, and at the same time you can give
your users lots of platform choices. On the other hand, when you have to
@@ -61,24 +61,21 @@ take advantage of some unique feature of a particular platform, as is
often the case with systems programming (whether for Unix, Windows,
S<Mac OS>, VMS, etc.), consider writing platform-specific code.
-When the code will run on only two or three operating systems, then you
-may only need to consider the differences of those particular systems.
-The important thing is to decide where the code will run, and to be
+When the code will run on only two or three operating systems, you
+may need to consider only the differences of those particular systems.
+The important thing is to decide where the code will run and to be
deliberate in your decision.
The material below is separated into three main sections: main issues of
portability (L<"ISSUES">, platform-specific issues (L<"PLATFORMS">, and
-builtin perl functions that behave differently on various ports
+built-in perl functions that behave differently on various ports
(L<"FUNCTION IMPLEMENTATIONS">.
This information should not be considered complete; it includes possibly
transient information about idiosyncrasies of some of the ports, almost
-all of which are in a state of constant evolution. Thus this material
+all of which are in a state of constant evolution. Thus, this material
should be considered a perpetual work in progress
-(E<lt>IMG SRC="yellow_sign.gif" ALT="Under Construction"E<gt>).
-
-
-
+(<IMG SRC="yellow_sign.gif" ALT="Under Construction">).
=head1 ISSUES
@@ -86,24 +83,24 @@ should be considered a perpetual work in progress
In most operating systems, lines in files are terminated by newlines.
Just what is used as a newline may vary from OS to OS. Unix
-traditionally uses C<\012>, one kind of Windows I/O uses C<\015\012>,
+traditionally uses C<\012>, one type of DOSish I/O uses C<\015\012>,
and S<Mac OS> uses C<\015>.
-Perl uses C<\n> to represent the "logical" newline, where what
-is logical may depend on the platform in use. In MacPerl, C<\n>
-always means C<\015>. In DOSish perls, C<\n> usually means C<\012>, but
-when accessing a file in "text" mode, STDIO translates it to (or from)
-C<\015\012>.
-
-Due to the "text" mode translation, DOSish perls have limitations
-of using C<seek> and C<tell> when a file is being accessed in "text"
-mode. Specifically, if you stick to C<seek>-ing to locations you got
-from C<tell> (and no others), you are usually free to use C<seek> and
-C<tell> even in "text" mode. In general, using C<seek> or C<tell> or
-other file operations that count bytes instead of characters, without
-considering the length of C<\n>, may be non-portable. If you use
-C<binmode> on a file, however, you can usually use C<seek> and C<tell>
-with arbitrary values quite safely.
+Perl uses C<\n> to represent the "logical" newline, where what is
+logical may depend on the platform in use. In MacPerl, C<\n> always
+means C<\015>. In DOSish perls, C<\n> usually means C<\012>, but
+when accessing a file in "text" mode, STDIO translates it to (or
+from) C<\015\012>, depending on whether you're reading or writing.
+Unix does the same thing on ttys in canonical mode. C<\015\012>
+is commonly referred to as CRLF.
+
+Because of the "text" mode translation, DOSish perls have limitations
+in using C<seek> and C<tell> on a file accessed in "text" mode.
+Stick to C<seek>-ing to locations you got from C<tell> (and no
+others), and you are usually free to use C<seek> and C<tell> even
+in "text" mode. Using C<seek> or C<tell> or other file operations
+may be non-portable. If you use C<binmode> on a file, however, you
+can usually C<seek> and C<tell> with arbitrary values in safety.
A common misconception in socket programming is that C<\n> eq C<\012>
everywhere. When using protocols such as common Internet protocols,
@@ -113,28 +110,23 @@ the logical C<\n> and C<\r> (carriage return) are not reliable.
print SOCKET "Hi there, client!\r\n"; # WRONG
print SOCKET "Hi there, client!\015\012"; # RIGHT
-[NOTE: this does not necessarily apply to communications that are
-filtered by another program or module before sending to the socket; the
-the most popular EBCDIC webserver, for instance, accepts C<\r\n>,
-which translates those characters, along with all other
-characters in text streams, from EBCDIC to ASCII.]
-
However, using C<\015\012> (or C<\cM\cJ>, or C<\x0D\x0A>) can be tedious
and unsightly, as well as confusing to those maintaining the code. As
-such, the C<Socket> module supplies the Right Thing for those who want it.
+such, the Socket module supplies the Right Thing for those who want it.
use Socket qw(:DEFAULT :crlf);
print SOCKET "Hi there, client!$CRLF" # RIGHT
-When reading I<from> a socket, remember that the default input record
-separator (C<$/>) is C<\n>, but code like this should recognize C<$/> as
-C<\012> or C<\015\012>:
+When reading from a socket, remember that the default input record
+separator C<$/> is C<\n>, but robust socket code will recognize as
+either C<\012> or C<\015\012> as end of line:
while (<SOCKET>) {
# ...
}
-Better:
+Because both CRLF and LF end in LF, the input record separator can
+be set to LF and any CR stripped later. Better to write:
use Socket qw(:DEFAULT :crlf);
local($/) = LF; # not needed if $/ is already \012
@@ -144,67 +136,103 @@ Better:
# s/\015?\012/\n/; # same thing
}
-And this example is actually better than the previous one even for Unix
-platforms, because now any C<\015>'s (C<\cM>'s) are stripped out
+This example is preferred over the previous one--even for Unix
+platforms--because now any C<\015>'s (C<\cM>'s) are stripped out
(and there was much rejoicing).
-An important thing to remember is that functions that return data
-should translate newlines when appropriate. Often one line of code
-will suffice:
+Similarly, functions that return text data--such as a function that
+fetches a web page--should sometimes translate newlines before
+returning the data, if they've not yet been translated to the local
+newline representation. A single line of code will often suffice:
+
+ $data =~ s/\015?\012/\n/g;
+ return $data;
+
+Some of this may be confusing. Here's a handy reference to the ASCII CR
+and LF characters. You can print it out and stick it in your wallet.
+
+ LF == \012 == \x0A == \cJ == ASCII 10
+ CR == \015 == \x0D == \cM == ASCII 13
- $data =~ s/\015?\012/\n/g;
- return $data;
+ | Unix | DOS | Mac |
+ ---------------------------
+ \n | LF | LF | CR |
+ \r | CR | CR | LF |
+ \n * | LF | CRLF | CR |
+ \r * | CR | CR | LF |
+ ---------------------------
+ * text-mode STDIO
+The Unix column assumes that you are not accessing a serial line
+(like a tty) in canonical mode. If you are, then CR on input becomes
+"\n", and "\n" on output becomes CRLF.
+
+These are just the most common definitions of C<\n> and C<\r> in Perl.
+There may well be others.
=head2 Numbers endianness and Width
Different CPUs store integers and floating point numbers in different
orders (called I<endianness>) and widths (32-bit and 64-bit being the
-most common). This affects your programs if they attempt to transfer
-numbers in binary format from a CPU architecture to another over some
-channel: either 'live' via network connections or storing the numbers
-to secondary storage such as a disk file.
+most common today). This affects your programs when they attempt to transfer
+numbers in binary format from one CPU architecture to another,
+usually either "live" via network connection, or by storing the
+numbers to secondary storage such as a disk file or tape.
-Conflicting storage orders make utter mess out of the numbers: if a
-little-endian host (Intel, Alpha) stores 0x12345678 (305419896 in
+Conflicting storage orders make utter mess out of the numbers. If a
+little-endian host (Intel, VAX) stores 0x12345678 (305419896 in
decimal), a big-endian host (Motorola, MIPS, Sparc, PA) reads it as
0x78563412 (2018915346 in decimal). To avoid this problem in network
-(socket) connections use the C<pack()> and C<unpack()> formats C<"n">
-and C<"N">, the "network" orders, they are guaranteed to be portable.
+(socket) connections use the C<pack> and C<unpack> formats C<n>
+and C<N>, the "network" orders. These are guaranteed to be portable.
+
+You can explore the endianness of your platform by unpacking a
+data structure packed in native format such as:
+
+ print unpack("h*", pack("s2", 1, 2)), "\n";
+ # '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode
+ # '00100020' on e.g. Motorola 68040
+
+If you need to distinguish between endian architectures you could use
+either of the variables set like so:
-Different widths can cause truncation even between platforms of equal
-endianness: the platform of shorter width loses the upper parts of the
+ $is_big_endian = unpack("h*", pack("s", 1)) =~ /01/;
+ $is_litte_endian = unpack("h*", pack("s", 1)) =~ /^1/;
+
+Differing widths can cause truncation even between platforms of equal
+endianness. The platform of shorter width loses the upper parts of the
number. There is no good solution for this problem except to avoid
transferring or storing raw binary numbers.
-One can circumnavigate both these problems in two ways: either
+One can circumnavigate both these problems in two ways. Either
transfer and store numbers always in text format, instead of raw
-binary, or consider using modules like C<Data::Dumper> (included in
-the standard distribution as of Perl 5.005) and C<Storable>.
+binary, or else consider using modules like Data::Dumper (included in
+the standard distribution as of Perl 5.005) and Storable. Keeping
+all data as text significantly simplifies matters.
=head2 Files and Filesystems
Most platforms these days structure files in a hierarchical fashion.
-So, it is reasonably safe to assume that any platform supports the
-notion of a "path" to uniquely identify a file on the system. Just
-how that path is actually written, differs.
+So, it is reasonably safe to assume that all platforms support the
+notion of a "path" to uniquely identify a file on the system. How
+that path is really written, though, differs considerably.
-While they are similar, file path specifications differ between Unix,
-Windows, S<Mac OS>, OS/2, VMS, VOS, S<RISC OS> and probably others.
-Unix, for example, is one of the few OSes that has the idea of a single
-root directory.
+Atlhough similar, file path specifications differ between Unix,
+Windows, S<Mac OS>, OS/2, VMS, VOS, S<RISC OS>, and probably others.
+Unix, for example, is one of the few OSes that has the elegant idea
+of a single root directory.
-VMS, Windows, and OS/2 can work similarly to Unix with C</> as path
-separator, or in their own idiosyncratic ways (such as having several
-root directories and various "unrooted" device files such NIL: and
-LPT:).
+DOS, OS/2, VMS, VOS, and Windows can work similarly to Unix with C</>
+as path separator, or in their own idiosyncratic ways (such as having
+several root directories and various "unrooted" device files such NIL:
+and LPT:).
S<Mac OS> uses C<:> as a path separator instead of C</>.
-The filesystem may support neither hard links (C<link()>) nor
-symbolic links (C<symlink()>, C<readlink()>, C<lstat()>).
+The filesystem may support neither hard links (C<link>) nor
+symbolic links (C<symlink>, C<readlink>, C<lstat>).
-The filesystem may not support neither access timestamp nor change
+The filesystem may support neither access timestamp nor change
timestamp (meaning that about the only portable timestamp is the
modification timestamp), or one second granularity of any timestamps
(e.g. the FAT filesystem limits the time granularity to two seconds).
@@ -213,84 +241,91 @@ VOS perl can emulate Unix filenames with C</> as path separator. The
native pathname characters greater-than, less-than, number-sign, and
percent-sign are always accepted.
-C<RISC OS> perl can emulate Unix filenames with C</> as path
+S<RISC OS> perl can emulate Unix filenames with C</> as path
separator, or go native and use C<.> for path separator and C<:> to
-signal filing systems and disc names.
+signal filesystems and disk names.
-As with the newline problem above, there are modules that can help. The
-C<File::Spec> modules provide methods to do the Right Thing on whatever
-platform happens to be running the program.
+If all this is intimidating, have no (well, maybe only a little)
+fear. There are modules that can help. The File::Spec modules
+provide methods to do the Right Thing on whatever platform happens
+to be running the program.
- use File::Spec;
- chdir(File::Spec->updir()); # go up one directory
- $file = File::Spec->catfile(
- File::Spec->curdir(), 'temp', 'file.txt'
- );
+ use File::Spec::Functions;
+ chdir(updir()); # go up one directory
+ $file = catfile(curdir(), 'temp', 'file.txt');
# on Unix and Win32, './temp/file.txt'
# on Mac OS, ':temp:file.txt'
+ # on VMS, '[.temp]file.txt'
-File::Spec is available in the standard distribution, as of version
-5.004_05.
+File::Spec is available in the standard distribution as of version
+5.004_05. File::Spec::Functions is only in File::Spec 0.7 and later,
+and some versions of perl come with version 0.6. If File::Spec
+is not updated to 0.7 or later, you must use the object-oriented
+interface from File::Spec (or upgrade File::Spec).
-In general, production code should not have file paths hardcoded; making
-them user supplied or from a configuration file is better, keeping in mind
-that file path syntax varies on different machines.
+In general, production code should not have file paths hardcoded.
+Making them user-supplied or read from a configuration file is
+better, keeping in mind that file path syntax varies on different
+machines.
This is especially noticeable in scripts like Makefiles and test suites,
which often assume C</> as a path separator for subdirectories.
-Also of use is C<File::Basename>, from the standard distribution, which
+Also of use is File::Basename from the standard distribution, which
splits a pathname into pieces (base filename, full path to directory,
and file suffix).
-Even when on a single platform (if you can call UNIX a single platform),
-remember not to count on the existence or the contents of
+Even when on a single platform (if you can call Unix a single platform),
+remember not to count on the existence or the contents of particular
system-specific files or directories, like F</etc/passwd>,
-F</etc/sendmail.conf>, F</etc/resolv.conf>, or even F</tmp/>. For
-example, F</etc/passwd> may exist but it may not contain the encrypted
-passwords because the system is using some form of enhanced security --
-or it may not contain all the accounts because the system is using NIS.
+F</etc/sendmail.conf>, F</etc/resolv.conf>, or even F</tmp/>. For
+example, F</etc/passwd> may exist but not contain the encrypted
+passwords, because the system is using some form of enhanced security.
+Or it may not contain all the accounts, because the system is using NIS.
If code does need to rely on such a file, include a description of the
-file and its format in the code's documentation, and make it easy for
+file and its format in the code's documentation, then make it easy for
the user to override the default location of the file.
-Don't assume a text file will end with a newline.
+Don't assume a text file will end with a newline. They should,
+but people forget.
Do not have two files of the same name with different case, like
F<test.pl> and F<Test.pl>, as many platforms have case-insensitive
filenames. Also, try not to have non-word characters (except for C<.>)
in the names, and keep them to the 8.3 convention, for maximum
-portability.
+portability, onerous a burden though this may appear.
-Likewise, if using C<AutoSplit>, try to keep the split functions to
-8.3 naming and case-insensitive conventions; or, at the very least,
+Likewise, when using the AutoSplit module, try to keep your functions to
+8.3 naming and case-insensitive conventions; or, at the least,
make it so the resulting files have a unique (case-insensitively)
first 8 characters.
-There certainly can be whitespace in filenames. Many systems (DOS,
-VMS) cannot have more than one C<"."> in their filenames.
-
-Don't assume C<E<gt>> won't be the first character of a filename.
-Always use C<E<lt>> explicitly to open a file for reading.
+Whitespace in filenames is tolerated on most systems, but not all.
+Many systems (DOS, VMS) cannot have more than one C<.> in their filenames.
- open(FILE, "<$existing_file") or die $!;
+Don't assume C<< > >> won't be the first character of a filename.
+Always use C<< < >> explicitly to open a file for reading,
+unless you want the user to be able to specify a pipe open.
-Actually, though, if filenames might use strange characters, it is
-safest to open it with C<sysopen> instead of C<open>, which is magic.
+ open(FILE, "< $existing_file") or die $!;
+If filenames might use strange characters, it is safest to open it
+with C<sysopen> instead of C<open>. C<open> is magic and can
+translate characters like C<< > >>, C<< < >>, and C<|>, which may
+be the wrong thing to do. (Sometimes, though, it's the right thing.)
=head2 System Interaction
-Not all platforms provide for the notion of a command line, necessarily.
-These are usually platforms that rely on a Graphical User Interface (GUI)
-for user interaction. So a program requiring command lines might not work
-everywhere. But this is probably for the user of the program to deal
-with.
+Not all platforms provide a command line. These are usually platforms
+that rely primarily on a Graphical User Interface (GUI) for user
+interaction. A program requiring a command line interface might
+not work everywhere. This is probably for the user of the program
+to deal with, so don't stay up late worrying about it.
-Some platforms can't delete or rename files that are being held open by
-the system. Remember to C<close> files when you are done with them.
-Don't C<unlink> or C<rename> an open file. Don't C<tie> to or C<open> a
-file that is already tied to or opened; C<untie> or C<close> first.
+Some platforms can't delete or rename files held open by the system.
+Remember to C<close> files when you are done with them. Don't
+C<unlink> or C<rename> an open file. Don't C<tie> or C<open> a
+file already tied or opened; C<untie> or C<close> it first.
Don't open the same file more than once at a time for writing, as some
operating systems put mandatory locks on such files.
@@ -299,7 +334,7 @@ Don't count on a specific environment variable existing in C<%ENV>.
Don't count on C<%ENV> entries being case-sensitive, or even
case-preserving.
-Don't count on signals.
+Don't count on signals or C<%SIG> for anything.
Don't count on filename globbing. Use C<opendir>, C<readdir>, and
C<closedir> instead.
@@ -309,115 +344,123 @@ directories.
Don't count on specific values of C<$!>.
-
=head2 Interprocess Communication (IPC)
-In general, don't directly access the system in code that is meant to be
-portable. That means, no C<system>, C<exec>, C<fork>, C<pipe>, C<``>,
-C<qx//>, C<open> with a C<|>, nor any of the other things that makes being
-a Unix perl hacker worth being.
+In general, don't directly access the system in code meant to be
+portable. That means, no C<system>, C<exec>, C<fork>, C<pipe>,
+C<``>, C<qx//>, C<open> with a C<|>, nor any of the other things
+that makes being a perl hacker worth being.
Commands that launch external processes are generally supported on
-most platforms (though many of them do not support any type of forking),
-but the problem with using them arises from what you invoke with them.
-External tools are often named differently on different platforms, often
-not available in the same location, often accept different arguments,
-often behave differently, and often represent their results in a
-platform-dependent way. Thus you should seldom depend on them to produce
-consistent results.
+most platforms (though many of them do not support any type of
+forking). The problem with using them arises from what you invoke
+them on. External tools are often named differently on different
+platforms, may not be available in the same location, migth accept
+different arguments, can behave differently, and often present their
+results in a platform-dependent way. Thus, you should seldom depend
+on them to produce consistent results. (Then again, if you're calling
+I<netstat -a>, you probably don't expect it to run on both Unix and CP/M.)
-One especially common bit of Perl code is opening a pipe to sendmail:
+One especially common bit of Perl code is opening a pipe to B<sendmail>:
- open(MAIL, '|/usr/lib/sendmail -t') or die $!;
+ open(MAIL, '|/usr/lib/sendmail -t')
+ or die "cannot fork sendmail: $!";
This is fine for systems programming when sendmail is known to be
available. But it is not fine for many non-Unix systems, and even
some Unix systems that may not have sendmail installed. If a portable
-solution is needed, see the C<Mail::Send> and C<Mail::Mailer> modules
-in the C<MailTools> distribution. C<Mail::Mailer> provides several
-mailing methods, including mail, sendmail, and direct SMTP
-(via C<Net::SMTP>) if a mail transfer agent is not available.
+solution is needed, see the various distributions on CPAN that deal
+with it. Mail::Mailer and Mail::Send in the MailTools distribution are
+commonly used, and provide several mailing methods, including mail,
+sendmail, and direct SMTP (via Net::SMTP) if a mail transfer agent is
+not available. Mail::Sendmail is a standalone module that provides
+simple, platform-independent mailing.
+
+The Unix System V IPC (C<msg*(), sem*(), shm*()>) is not available
+even on all Unix platforms.
The rule of thumb for portable code is: Do it all in portable Perl, or
use a module (that may internally implement it with platform-specific
code, but expose a common interface).
-The UNIX System V IPC (C<msg*(), sem*(), shm*()>) is not available
-even in all UNIX platforms.
-
-
=head2 External Subroutines (XS)
-XS code, in general, can be made to work with any platform; but dependent
+XS code can usually be made to work with any platform, but dependent
libraries, header files, etc., might not be readily available or
portable, or the XS code itself might be platform-specific, just as Perl
code might be. If the libraries and headers are portable, then it is
normally reasonable to make sure the XS code is portable, too.
-There is a different kind of portability issue with writing XS
-code: availability of a C compiler on the end-user's system. C brings
-with it its own portability issues, and writing XS code will expose you to
-some of those. Writing purely in perl is a comparatively easier way to
+A different type of portability issue arises when writing XS code:
+availability of a C compiler on the end-user's system. C brings
+with it its own portability issues, and writing XS code will expose
+you to some of those. Writing purely in Perl is an easier way to
achieve portability.
-
=head2 Standard Modules
In general, the standard modules work across platforms. Notable
-exceptions are C<CPAN.pm> (which currently makes connections to external
+exceptions are the CPAN module (which currently makes connections to external
programs that may not be available), platform-specific modules (like
-C<ExtUtils::MM_VMS>), and DBM modules.
+ExtUtils::MM_VMS), and DBM modules.
-There is no one DBM module that is available on all platforms.
-C<SDBM_File> and the others are generally available on all Unix and DOSish
-ports, but not in MacPerl, where only C<NBDM_File> and C<DB_File> are
+There is no one DBM module available on all platforms.
+SDBM_File and the others are generally available on all Unix and DOSish
+ports, but not in MacPerl, where only NBDM_File and DB_File are
available.
The good news is that at least some DBM module should be available, and
-C<AnyDBM_File> will use whichever module it can find. Of course, then
-the code needs to be fairly strict, dropping to the lowest common
-denominator (e.g., not exceeding 1K for each record).
-
+AnyDBM_File will use whichever module it can find. Of course, then
+the code needs to be fairly strict, dropping to the greatest common
+factor (e.g., not exceeding 1K for each record), so that it will
+work with any DBM module. See L<AnyDBM_File> for more details.
=head2 Time and Date
The system's notion of time of day and calendar date is controlled in
-widely different ways. Don't assume the timezone is stored in C<$ENV{TZ}>,
+widely different ways. Don't assume the timezone is stored in C<$ENV{TZ}>,
and even if it is, don't assume that you can control the timezone through
that variable.
Don't assume that the epoch starts at 00:00:00, January 1, 1970,
-because that is OS-specific. Better to store a date in an unambiguous
-representation. The ISO 8601 standard defines YYYY-MM-DD as the date
-format. A text representation (like C<1 Jan 1970>) can be easily
-converted into an OS-specific value using a module like
-C<Date::Parse>. An array of values, such as those returned by
+because that is OS- and implementation-specific. It is better to store a date
+in an unambiguous representation. The ISO-8601 standard defines
+"YYYY-MM-DD" as the date format. A text representation (like "1987-12-18")
+can be easily converted into an OS-specific value using a module like
+Date::Parse. An array of values, such as those returned by
C<localtime>, can be converted to an OS-specific representation using
-C<Time::Local>.
+Time::Local.
+When calculating specific times, such as for tests in time or date modules,
+it may be appropriate to calculate an offset for the epoch.
+
+ require Time::Local;
+ $offset = Time::Local::timegm(0, 0, 0, 1, 0, 70);
+
+The value for C<$offset> in Unix will be C<0>, but in Mac OS will be
+some large number. C<$offset> can then be added to a Unix time value
+to get what should be the proper value on any system.
=head2 Character sets and character encoding
-Assume very little about character sets. Do not assume anything about
-the numerical values (C<ord()>, C<chr()>) of characters. Do not
+Assume little about character sets. Assume nothing about
+numerical values (C<ord>, C<chr>) of characters. Do not
assume that the alphabetic characters are encoded contiguously (in
-numerical sense). Do not assume anything about the ordering of the
+the numeric sense). Do not assume anything about the ordering of the
characters. The lowercase letters may come before or after the
-uppercase letters, the lowercase and uppercase may be interlaced so
-that both 'a' and 'A' come before the 'b', the accented and other
+uppercase letters; the lowercase and uppercase may be interlaced so
+that both `a' and `A' come before `b'; the accented and other
international characters may be interlaced so that E<auml> comes
-before the 'b'.
-
+before `b'.
=head2 Internationalisation
-If you may assume POSIX (a rather large assumption, that in practice
-means UNIX), you may read more about the POSIX locale system from
-L<perllocale>. The locale system at least attempts to make things a
-little bit more portable, or at least more convenient and
-native-friendly for non-English users. The system affects character
-sets and encoding, and date and time formatting, among other things.
-
+If you may assume POSIX (a rather large assumption), you may read
+more about the POSIX locale system from L<perllocale>. The locale
+system at least attempts to make things a little bit more portable,
+or at least more convenient and native-friendly for non-English
+users. The system affects character sets and encoding, and date
+and time formatting--amongst other things.
=head2 System Resources
@@ -434,31 +477,40 @@ of avoiding wasteful constructs such as:
while (<FILE>) {$file .= $_} # sometimes bad
$file = join('', <FILE>); # better
-The last two may appear unintuitive to most people. The first of those
-two constructs repeatedly grows a string, while the second allocates a
-large chunk of memory in one go. On some systems, the latter is more
-efficient that the former.
-
+The last two constructs may appear unintuitive to most people. The
+first repeatedly grows a string, whereas the second allocates a
+large chunk of memory in one go. On some systems, the second is
+more efficient that the first.
=head2 Security
-Most multi-user platforms provide basic levels of security that is usually
-felt at the file-system level. Other platforms usually don't
-(unfortunately). Thus the notion of user id, or "home" directory, or even
-the state of being logged-in, may be unrecognizable on many platforms. If
-you write programs that are security conscious, it is usually best to know
-what type of system you will be operating under, and write code explicitly
-for that platform (or class of platforms).
-
+Most multi-user platforms provide basic levels of security, usually
+implemented at the filesystem level. Some, however, do
+not--unfortunately. Thus the notion of user id, or "home" directory,
+or even the state of being logged-in, may be unrecognizable on many
+platforms. If you write programs that are security-conscious, it
+is usually best to know what type of system you will be running
+under so that you can write code explicitly for that platform (or
+class of platforms).
=head2 Style
For those times when it is necessary to have platform-specific code,
consider keeping the platform-specific code in one place, making porting
-to other platforms easier. Use the C<Config> module and the special
+to other platforms easier. Use the Config module and the special
variable C<$^O> to differentiate platforms, as described in
L<"PLATFORMS">.
+Be careful in the tests you supply with your module or programs.
+Module code may be fully portable, but its tests might not be. This
+often happens when tests spawn off other processes or call external
+programs to aid in the testing, or when (as noted above) the tests
+assume certain things about the filesystem and paths. Be careful
+not to depend on a specific output style for errors, such as when
+checking C<$!> after an system call. Some platforms expect a certain
+output format, and perl on those platforms may have been adjusted
+accordingly. Most specifically, don't anchor a regex when testing
+an error value.
=head1 CPAN Testers
@@ -469,58 +521,80 @@ this platform), or UNKNOWN (unknown), along with any relevant notations.
The purpose of the testing is twofold: one, to help developers fix any
problems in their code that crop up because of lack of testing on other
-platforms; two, to provide users with information about whether or not
+platforms; two, to provide users with information about whether
a given module works on a given platform.
=over 4
=item Mailing list: cpan-testers@perl.org
-=item Testing results: C<http://www.connect.net/gbarr/cpan-test/>
+=item Testing results: http://testers.cpan.org/
=back
-
=head1 PLATFORMS
As of version 5.002, Perl is built with a C<$^O> variable that
indicates the operating system it was built on. This was implemented
-to help speed up code that would otherwise have to C<use Config;> and
-use the value of C<$Config{'osname'}>. Of course, to get
+to help speed up code that would otherwise have to C<use Config>
+and use the value of C<$Config{osname}>. Of course, to get more
detailed information about the system, looking into C<%Config> is
certainly recommended.
+C<%Config> cannot always be trusted, however, because it was built
+at compile time. If perl was built in one place, then transferred
+elsewhere, some values may be wrong. The values may even have been
+edited after the fact.
+
=head2 Unix
Perl works on a bewildering variety of Unix and Unix-like platforms (see
e.g. most of the files in the F<hints/> directory in the source code kit).
On most of these systems, the value of C<$^O> (hence C<$Config{'osname'}>,
-too) is determined by lowercasing and stripping punctuation from the first
-field of the string returned by typing C<uname -a> (or a similar command)
-at the shell prompt. Here, for example, are a few of the more popular
-Unix flavors:
-
- uname $^O $Config{'archname'}
- -------------------------------------------
- AIX aix aix
- FreeBSD freebsd freebsd-i386
- Linux linux i386-linux
- HP-UX hpux PA-RISC1.1
- IRIX irix irix
- OSF1 dec_osf alpha-dec_osf
- SunOS solaris sun4-solaris
- SunOS solaris i86pc-solaris
- SunOS4 sunos sun4-sunos
-
-Note that because the C<$Config{'archname'}> may depend on the hardware
-architecture it may vary quite a lot, much more than the C<$^O>.
+too) is determined either by lowercasing and stripping punctuation from the
+first field of the string returned by typing C<uname -a> (or a similar command)
+at the shell prompt or by testing the file system for the presence of
+uniquely named files such as a kernel or header file. Here, for example,
+are a few of the more popular Unix flavors:
+
+ uname $^O $Config{'archname'}
+ --------------------------------------------
+ AIX aix aix
+ BSD/OS bsdos i386-bsdos
+ dgux dgux AViiON-dgux
+ DYNIX/ptx dynixptx i386-dynixptx
+ FreeBSD freebsd freebsd-i386
+ Linux linux arm-linux
+ Linux linux i386-linux
+ Linux linux i586-linux
+ Linux linux ppc-linux
+ HP-UX hpux PA-RISC1.1
+ IRIX irix irix
+ Mac OS X rhapsody rhapsody
+ MachTen PPC machten powerpc-machten
+ NeXT 3 next next-fat
+ NeXT 4 next OPENSTEP-Mach
+ openbsd openbsd i386-openbsd
+ OSF1 dec_osf alpha-dec_osf
+ reliantunix-n svr4 RM400-svr4
+ SCO_SV sco_sv i386-sco_sv
+ SINIX-N svr4 RM400-svr4
+ sn4609 unicos CRAY_C90-unicos
+ sn6521 unicosmk t3e-unicosmk
+ sn9617 unicos CRAY_J90-unicos
+ SunOS solaris sun4-solaris
+ SunOS solaris i86pc-solaris
+ SunOS4 sunos sun4-sunos
+
+Because the value of C<$Config{archname}> may depend on the
+hardware architecture, it can vary more than the value of C<$^O>.
=head2 DOS and Derivatives
-Perl has long been ported to PC style microcomputers running under
+Perl has long been ported to Intel-style microcomputers running under
systems like PC-DOS, MS-DOS, OS/2, and most Windows platforms you can
bring yourself to mention (except for Windows CE, if you count that).
-Users familiar with I<COMMAND.COM> and/or I<CMD.EXE> style shells should
+Users familiar with I<COMMAND.COM> or I<CMD.EXE> style shells should
be aware that each of these file specifications may have subtle
differences:
@@ -529,35 +603,39 @@ differences:
$filespec2 = 'c:\foo\bar\file.txt';
$filespec3 = 'c:\\foo\\bar\\file.txt';
-System calls accept either C</> or C<\> as the path separator. However,
-many command-line utilities of DOS vintage treat C</> as the option
-prefix, so they may get confused by filenames containing C</>. Aside
-from calling any external programs, C</> will work just fine, and
-probably better, as it is more consistent with popular usage, and avoids
-the problem of remembering what to backwhack and what not to.
+System calls accept either C</> or C<\> as the path separator.
+However, many command-line utilities of DOS vintage treat C</> as
+the option prefix, so may get confused by filenames containing C</>.
+Aside from calling any external programs, C</> will work just fine,
+and probably better, as it is more consistent with popular usage,
+and avoids the problem of remembering what to backwhack and what
+not to.
-The DOS FAT filesystem can only accommodate "8.3" style filenames. Under
-the "case insensitive, but case preserving" HPFS (OS/2) and NTFS (NT)
+The DOS FAT filesystem can accommodate only "8.3" style filenames. Under
+the "case-insensitive, but case-preserving" HPFS (OS/2) and NTFS (NT)
filesystems you may have to be careful about case returned with functions
like C<readdir> or used with functions like C<open> or C<opendir>.
-DOS also treats several filenames as special, such as AUX, PRN, NUL, CON,
-COM1, LPT1, LPT2 etc. Unfortunately these filenames won't even work
-if you include an explicit directory prefix, in some cases. It is best
-to avoid such filenames, if you want your code to be portable to DOS
-and its derivatives.
+DOS also treats several filenames as special, such as AUX, PRN,
+NUL, CON, COM1, LPT1, LPT2, etc. Unfortunately, sometimes these
+filenames won't even work if you include an explicit directory
+prefix. It is best to avoid such filenames, if you want your code
+to be portable to DOS and its derivatives. It's hard to know what
+these all are, unfortunately.
Users of these operating systems may also wish to make use of
-scripts such as I<pl2bat.bat> or I<pl2cmd> as appropriate to
+scripts such as I<pl2bat.bat> or I<pl2cmd> to
put wrappers around your scripts.
Newline (C<\n>) is translated as C<\015\012> by STDIO when reading from
-and writing to files. C<binmode(FILEHANDLE)> will keep C<\n> translated
-as C<\012> for that filehandle. Since it is a noop on other systems,
-C<binmode> should be used for cross-platform code that deals with binary
-data.
-
-The C<$^O> variable and the C<$Config{'archname'}> values for various
+and writing to files (see L<"Newlines">). C<binmode(FILEHANDLE)>
+will keep C<\n> translated as C<\012> for that filehandle. Since it is a
+no-op on other systems, C<binmode> should be used for cross-platform code
+that deals with binary data. That's assuming you realize in advance
+that your data is in binary. General-purpose programs should
+often assume nothing about their data.
+
+The C<$^O> variable and the C<$Config{archname}> values for various
DOSish perls are as follows:
OS $^O $Config{'archname'}
@@ -566,34 +644,61 @@ DOSish perls are as follows:
PC-DOS dos
OS/2 os2
Windows 95 MSWin32 MSWin32-x86
+ Windows 98 MSWin32 MSWin32-x86
Windows NT MSWin32 MSWin32-x86
- Windows NT MSWin32 MSWin32-alpha
+ Windows NT MSWin32 MSWin32-ALPHA
Windows NT MSWin32 MSWin32-ppc
+ Cygwin cygwin
Also see:
=over 4
-=item The djgpp environment for DOS, C<http://www.delorie.com/djgpp/>
+=item *
-=item The EMX environment for DOS, OS/2, etc. C<emx@iaehv.nl>,
-C<http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/index.html> or
-C<ftp://hobbes.nmsu.edu/pub/os2/dev/emx>
+The djgpp environment for DOS, http://www.delorie.com/djgpp/
+and L<perldos>.
-=item Build instructions for Win32, L<perlwin32>.
+=item *
-=item The ActiveState Pages, C<http://www.activestate.com/>
+The EMX environment for DOS, OS/2, etc. emx@iaehv.nl,
+http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/index.html or
+ftp://hobbes.nmsu.edu/pub/os2/dev/emx. Also L<perlos2>.
-=back
+=item *
+Build instructions for Win32 in L<perlwin32>, or under the Cygnus environment
+in L<perlcygwin>.
+
+=item *
+
+The C<Win32::*> modules in L<Win32>.
+
+=item *
+
+The ActiveState Pages, http://www.activestate.com/
+
+=item *
+
+The Cygwin environment for Win32; F<README.cygwin> (installed
+as L<perlcygwin>), http://sourceware.cygnus.com/cygwin/
+
+=item *
+
+The U/WIN environment for Win32,
+<http://www.research.att.com/sw/tools/uwin/
+
+=item Build instructions for OS/2, L<perlos2>
+
+
+=back
=head2 S<Mac OS>
Any module requiring XS compilation is right out for most people, because
MacPerl is built using non-free (and non-cheap!) compilers. Some XS
modules that can work with MacPerl are built and distributed in binary
-form on CPAN. See I<MacPerl: Power and Ease> and L<"CPAN Testers">
-for more details.
+form on CPAN.
Directories are specified as:
@@ -604,12 +709,12 @@ Directories are specified as:
:file for relative pathnames
file for relative pathnames
-Files in a directory are stored in alphabetical order. Filenames are
-limited to 31 characters, and may include any character except C<:>,
-which is reserved as a path separator.
+Files are stored in the directory in alphabetical order. Filenames are
+limited to 31 characters, and may include any character except for
+null and C<:>, which is reserved as the path separator.
Instead of C<flock>, see C<FSpSetFLock> and C<FSpRstFLock> in the
-C<Mac::Files> module, or C<chmod(0444, ...)> and C<chmod(0666, ...)>.
+Mac::Files module, or C<chmod(0444, ...)> and C<chmod(0666, ...)>.
In the MacPerl application, you can't run a program from the command line;
programs that expect C<@ARGV> to be populated can be edited with something
@@ -620,13 +725,13 @@ line arguments.
@ARGV = split /\s+/, MacPerl::Ask('Arguments?');
}
-A MacPerl script saved as a droplet will populate C<@ARGV> with the full
+A MacPerl script saved as a "droplet" will populate C<@ARGV> with the full
pathnames of the files dropped onto the script.
-Mac users can use programs on a kind of command line under MPW (Macintosh
-Programmer's Workshop, a free development environment from Apple).
-MacPerl was first introduced as an MPW tool, and MPW can be used like a
-shell:
+Mac users can run programs under a type of command line interface
+under MPW (Macintosh Programmer's Workshop, a free development
+environment from Apple). MacPerl was first introduced as an MPW
+tool, and MPW can be used like a shell:
perl myscript.plx some arguments
@@ -644,25 +749,37 @@ the application or MPW tool version is running, check:
$is_ppc = $MacPerl::Architecture eq 'MacPPC';
$is_68k = $MacPerl::Architecture eq 'Mac68K';
-S<Mac OS X>, to be based on NeXT's OpenStep OS, will (in theory) be able
-to run MacPerl natively, but Unix perl will also run natively under the
-built-in Unix environment.
+S<Mac OS X> and S<Mac OS X Server>, based on NeXT's OpenStep OS, will
+(in theory) be able to run MacPerl natively, under the "Classic"
+environment. The new "Cocoa" environment (formerly called the "Yellow Box")
+may run a slightly modified version of MacPerl, using the Carbon interfaces.
+
+S<Mac OS X Server> and its Open Source version, Darwin, both run Unix
+perl natively (with a few patches). Full support for these
+is slated for perl 5.6.
Also see:
=over 4
-=item The MacPerl Pages, C<http://www.ptf.com/macperl/>.
+=item *
-=item The MacPerl mailing list, C<mac-perl-request@iis.ee.ethz.ch>.
+The MacPerl Pages, http://www.macperl.com/ .
-=back
+=item *
+
+The MacPerl mailing lists, http://www.macperl.org/ .
+
+=item *
+MacPerl Module Porters, http://pudge.net/mmp/ .
+
+=back
=head2 VMS
-Perl on VMS is discussed in F<vms/perlvms.pod> in the perl distribution.
-Note that perl on VMS can accept either VMS- or Unix-style file
+Perl on VMS is discussed in L<perlvms> in the perl distribution.
+Perl on VMS can accept either VMS- or Unix-style file
specifications as in either of the following:
$ perl -ne "print if /perl_setup/i" SYS$LOGIN:LOGIN.COM
@@ -680,7 +797,7 @@ For example:
$ perl -e "print ""Hello, world.\n"""
Hello, world.
-There are a number of ways to wrap your perl scripts in DCL .COM files if
+There are several ways to wrap your perl scripts in DCL F<.COM> files, if
you are so inclined. For example:
$ write sys$output "Hello from DCL!"
@@ -696,16 +813,16 @@ you are so inclined. For example:
$ endif
Do take care with C<$ ASSIGN/nolog/user SYS$COMMAND: SYS$INPUT> if your
-perl-in-DCL script expects to do things like C<$read = E<lt>STDINE<gt>;>.
+perl-in-DCL script expects to do things like C<< $read = <STDIN>; >>.
Filenames are in the format "name.extension;version". The maximum
length for filenames is 39 characters, and the maximum length for
extensions is also 39 characters. Version is a number from 1 to
32767. Valid characters are C</[A-Z0-9$_-]/>.
-VMS' RMS filesystem is case insensitive and does not preserve case.
+VMS's RMS filesystem is case-insensitive and does not preserve case.
C<readdir> returns lowercased filenames, but specifying a file for
-opening remains case insensitive. Files without extensions have a
+opening remains case-insensitive. Files without extensions have a
trailing period on them, so doing a C<readdir> with a file named F<A.;5>
will return F<a.> (though that file could be opened with
C<open(FH, 'A')>).
@@ -717,15 +834,15 @@ C<PERL_ROOT:[LIB.2.3.4.5.6.7.8.9]> is not. F<Makefile.PL> authors might
have to take this into account, but at least they can refer to the former
as C</PERL_ROOT/lib/2/3/4/5/6/7/8/>.
-The C<VMS::Filespec> module, which gets installed as part of the build
+The VMS::Filespec module, which gets installed as part of the build
process on VMS, is a pure Perl module that can easily be installed on
non-VMS platforms and can be helpful for conversions to and from RMS
native formats.
-What C<\n> represents depends on the type of file that is open. It could
-be C<\015>, C<\012>, C<\015\012>, or nothing. Reading from a file
-translates newlines to C<\012>, unless C<binmode> was executed on that
-handle, just like DOSish perls.
+What C<\n> represents depends on the type of file opened. It could
+be C<\015>, C<\012>, C<\015\012>, or nothing. The VMS::Stdio module
+provides access to the special fopen() requirements of files with unusual
+attributes on VMS.
TCP/IP stacks are optional on VMS, so socket routines might not be
implemented. UDP sockets may not be supported.
@@ -736,31 +853,43 @@ you can examine the content of the C<@INC> array like so:
if (grep(/VMS_AXP/, @INC)) {
print "I'm on Alpha!\n";
+
} elsif (grep(/VMS_VAX/, @INC)) {
print "I'm on VAX!\n";
+
} else {
print "I'm not so sure about where $^O is...\n";
}
+On VMS, perl determines the UTC offset from the C<SYS$TIMEZONE_DIFFERENTIAL>
+logical name. Although the VMS epoch began at 17-NOV-1858 00:00:00.00,
+calls to C<localtime> are adjusted to count offsets from
+01-JAN-1970 00:00:00.00, just like Unix.
+
Also see:
=over 4
-=item L<perlvms.pod>
+=item *
-=item vmsperl list, C<vmsperl-request@newman.upenn.edu>
+F<README.vms> (installed as L<README_vms>), L<perlvms>
-Put words C<SUBSCRIBE VMSPERL> in message body.
+=item *
-=item vmsperl on the web, C<http://www.sidhe.org/vmsperl/index.html>
+vmsperl list, majordomo@perl.org
-=back
+(Put the words C<subscribe vmsperl> in message body.)
+
+=item *
+
+vmsperl on the web, http://www.sidhe.org/vmsperl/index.html
+=back
=head2 VOS
Perl on VOS is discussed in F<README.vos> in the perl distribution.
-Note that perl on VOS can accept either VOS- or Unix-style file
+Perl on VOS can accept either VOS- or Unix-style file
specifications as in either of the following:
$ perl -ne "print if /perl_setup/i" >system>notices
@@ -770,11 +899,12 @@ or even a mixture of both as in:
$ perl -ne "print if /perl_setup/i" >system/notices
-Note that even though VOS allows the slash character to appear in object
+Even though VOS allows the slash character to appear in object
names, because the VOS port of Perl interprets it as a pathname
delimiting character, VOS files, directories, or links whose names
contain a slash character cannot be processed. Such files must be
-renamed before they can be processed by Perl.
+renamed before they can be processed by Perl. Note that VOS limits
+file names to 32 or fewer characters.
The following C functions are unimplemented on VOS, and any attempt by
Perl to use them will result in a fatal error message and an immediate
@@ -785,9 +915,9 @@ ftp.stratus.com.
The value of C<$^O> on VOS is "VOS". To determine the architecture that
you are running on without resorting to loading all of C<%Config> you
-can examine the content of the C<@INC> array like so:
+can examine the content of the @INC array like so:
- if (grep(/VOS/, @INC)) {
+ if ($^O =~ /VOS/) {
print "I'm on a Stratus box!\n";
} else {
print "I'm not on a Stratus box!\n";
@@ -796,40 +926,50 @@ can examine the content of the C<@INC> array like so:
if (grep(/860/, @INC)) {
print "This box is a Stratus XA/R!\n";
+
} elsif (grep(/7100/, @INC)) {
- print "This box is a Stratus HP 7100 or 8000!\n";
+ print "This box is a Stratus HP 7100 or 8xxx!\n";
+
} elsif (grep(/8000/, @INC)) {
- print "This box is a Stratus HP 8000!\n";
+ print "This box is a Stratus HP 8xxx!\n";
+
} else {
- print "This box is a Stratus 68K...\n";
+ print "This box is a Stratus 68K!\n";
}
Also see:
=over 4
-=item L<README.vos>
+=item *
-=item VOS mailing list
+F<README.vos>
+
+=item *
+
+The VOS mailing list.
There is no specific mailing list for Perl on VOS. You can post
comments to the comp.sys.stratus newsgroup, or subscribe to the general
Stratus mailing list. Send a letter with "Subscribe Info-Stratus" in
the message body to majordomo@list.stratagy.com.
-=item VOS Perl on the web at C<http://ftp.stratus.com/pub/vos/vos.html>
+=item *
-=back
+VOS Perl on the web at http://ftp.stratus.com/pub/vos/vos.html
+=back
=head2 EBCDIC Platforms
Recent versions of Perl have been ported to platforms such as OS/400 on
-AS/400 minicomputers as well as OS/390 & VM/ESA for IBM Mainframes. Such
-computers use EBCDIC character sets internally (usually Character Code
-Set ID 00819 for OS/400 and IBM-1047 for OS/390 & VM/ESA). Note that on
-the mainframe perl currently works under the "Unix system services
-for OS/390" (formerly known as OpenEdition) and VM/ESA OpenEdition.
+AS/400 minicomputers as well as OS/390, VM/ESA, and BS2000 for S/390
+Mainframes. Such computers use EBCDIC character sets internally (usually
+Character Code Set ID 0037 for OS/400 and either 1047 or POSIX-BC for S/390
+systems). On the mainframe perl currently works under the "Unix system
+services for OS/390" (formerly known as OpenEdition), VM/ESA OpenEdition, or
+the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater).
+See L<perlos390> for details.
As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix
sub-systems do not support the C<#!> shebang trick for script invocation.
@@ -843,22 +983,42 @@ similar to the following simple script:
print "Hello from perl!\n";
+OS/390 will support the C<#!> shebang trick in release 2.8 and beyond.
+Calls to C<system> and backticks can use POSIX shell syntax on all
+S/390 systems.
+
+On the AS/400, if PERL5 is in your library list, you may need
+to wrap your perl scripts in a CL procedure to invoke them like so:
+
+ BEGIN
+ CALL PGM(PERL5/PERL) PARM('/QOpenSys/hello.pl')
+ ENDPGM
+
+This will invoke the perl script F<hello.pl> in the root of the
+QOpenSys file system. On the AS/400 calls to C<system> or backticks
+must use CL syntax.
+
On these platforms, bear in mind that the EBCDIC character set may have
an effect on what happens with some perl functions (such as C<chr>,
C<pack>, C<print>, C<printf>, C<ord>, C<sort>, C<sprintf>, C<unpack>), as
well as bit-fiddling with ASCII constants using operators like C<^>, C<&>
and C<|>, not to mention dealing with socket interfaces to ASCII computers
-(see L<Newlines>).
+(see L<"Newlines">).
-Fortunately, most web servers for the mainframe will correctly translate
-the C<\n> in the following statement to its ASCII equivalent (note that
-C<\r> is the same under both Unix and OS/390 & VM/ESA):
+Fortunately, most web servers for the mainframe will correctly
+translate the C<\n> in the following statement to its ASCII equivalent
+(C<\r> is the same under both Unix and OS/390 & VM/ESA):
print "Content-type: text/html\r\n\r\n";
-The value of C<$^O> on OS/390 is "os390".
+The values of C<$^O> on some of these platforms includes:
-The value of C<$^O> on VM/ESA is "vmesa".
+ uname $^O $Config{'archname'}
+ --------------------------------------------
+ OS/390 os390 os390
+ OS400 os400 os400
+ POSIX-BC posix-bc BS2000-posix-bc
+ VM/ESA vmesa vmesa
Some simple tricks for determining if you are running on an EBCDIC
platform could include any of the following (perhaps all):
@@ -869,7 +1029,7 @@ platform could include any of the following (perhaps all):
if (chr(169) eq 'z') { print "EBCDIC may be spoken here!\n"; }
-Note that one thing you may not want to rely on is the EBCDIC encoding
+One thing you may not want to rely on is the EBCDIC encoding
of punctuation characters since these may differ from code page to code
page (and once your module or script is rumoured to work with EBCDIC,
folks will want it to work with all EBCDIC character sets).
@@ -878,33 +1038,42 @@ Also see:
=over 4
-=item perl-mvs list
+=item *
+
+*
+
+L<perlos390>, F<README.os390>, F<README.posix-bc>, F<README.vmesa>
+
+=item *
The perl-mvs@perl.org list is for discussion of porting issues as well as
general usage issues for all EBCDIC Perls. Send a message body of
"subscribe perl-mvs" to majordomo@perl.org.
-=item AS/400 Perl information at C<http://as400.rochester.ibm.com/>
+=item *
-=back
+AS/400 Perl information at
+ttp://as400.rochester.ibm.com/
+as well as on CPAN in the F<ports/> directory.
+=back
=head2 Acorn RISC OS
-As Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like
-Unix and Unix filename emulation is turned on by default, it is quite
-likely that most simple scripts will work "out of the box". The native
-filing system is modular, and individual filing systems are free to be
+Because Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like
+Unix, and because Unix filename emulation is turned on by default,
+most simple scripts will probably work "out of the box". The native
+filesystem is modular, and individual filesystems are free to be
case-sensitive or insensitive, and are usually case-preserving. Some
-native filing systems have name length limits which file and directory
-names are silently truncated to fit - scripts should be aware that the
-standard disc filing system currently has a name length limit of B<10>
-characters, with up to 77 items in a directory, but other filing systems
+native filesystems have name length limits, which file and directory
+names are silently truncated to fit. Scripts should be aware that the
+standard filesystem currently has a name length limit of B<10>
+characters, with up to 77 items in a directory, but other filesystems
may not impose such limitations.
Native filenames are of the form
- Filesystem#Special_Field::DiscName.$.Directory.Directory.File
+ Filesystem#Special_Field::DiskName.$.Directory.Directory.File
where
@@ -919,27 +1088,27 @@ where
The default filename translation is roughly C<tr|/.|./|;>
-Note that C<"ADFS::HardDisc.$.File" ne 'ADFS::HardDisc.$.File'> and that
+Note that C<"ADFS::HardDisk.$.File" ne 'ADFS::HardDisk.$.File'> and that
the second stage of C<$> interpolation in regular expressions will fall
foul of the C<$.> if scripts are not careful.
Logical paths specified by system variables containing comma-separated
-search lists are also allowed, hence C<System:Modules> is a valid
+search lists are also allowed; hence C<System:Modules> is a valid
filename, and the filesystem will prefix C<Modules> with each section of
-C<System$Path> until a name is made that points to an object on disc.
-Writing to a new file C<System:Modules> would only be allowed if
+C<System$Path> until a name is made that points to an object on disk.
+Writing to a new file C<System:Modules> would be allowed only if
C<System$Path> contains a single item list. The filesystem will also
expand system variables in filenames if enclosed in angle brackets, so
-C<E<lt>System$DirE<gt>.Modules> would look for the file
+C<< <System$Dir>.Modules >> would look for the file
S<C<$ENV{'System$Dir'} . 'Modules'>>. The obvious implication of this is
-that B<fully qualified filenames can start with C<E<lt>E<gt>>> and should
+that B<fully qualified filenames can start with C<< <> >>> and should
be protected when C<open> is used for input.
Because C<.> was in use as a directory separator and filenames could not
be assumed to be unique after 10 characters, Acorn implemented the C
compiler to strip the trailing C<.c> C<.h> C<.s> and C<.o> suffix from
filenames specified in source code and store the respective files in
-subdirectories named after the suffix. Hence files are translated:
+subdirectories named after the suffix. Hence files are translated:
foo.h h.foo
C:foo.h C:h.foo (logical path variable)
@@ -949,100 +1118,120 @@ subdirectories named after the suffix. Hence files are translated:
11charname_.c c.11charname (assuming filesystem truncates at 10)
The Unix emulation library's translation of filenames to native assumes
-that this sort of translation is required, and allows a user defined list
-of known suffixes which it will transpose in this fashion. This may
-appear transparent, but consider that with these rules C<foo/bar/baz.h>
+that this sort of translation is required, and it allows a user-defined list
+of known suffixes that it will transpose in this fashion. This may
+seem transparent, but consider that with these rules C<foo/bar/baz.h>
and C<foo/bar/h/baz> both map to C<foo.bar.h.baz>, and that C<readdir> and
C<glob> cannot and do not attempt to emulate the reverse mapping. Other
-C<.>s in filenames are translated to C</>.
+C<.>'s in filenames are translated to C</>.
-As implied above the environment accessed through C<%ENV> is global, and
+As implied above, the environment accessed through C<%ENV> is global, and
the convention is that program specific environment variables are of the
-form C<Program$Name>. Each filing system maintains a current directory,
-and the current filing system's current directory is the B<global> current
-directory. Consequently, sociable scripts don't change the current
-directory but rely on full pathnames, and scripts (and Makefiles) cannot
+form C<Program$Name>. Each filesystem maintains a current directory,
+and the current filesystem's current directory is the B<global> current
+directory. Consequently, sociable programs don't change the current
+directory but rely on full pathnames, and programs (and Makefiles) cannot
assume that they can spawn a child process which can change the current
directory without affecting its parent (and everyone else for that
matter).
-As native operating system filehandles are global and currently are
-allocated down from 255, with 0 being a reserved value the Unix emulation
+Because native operating system filehandles are global and are currently
+allocated down from 255, with 0 being a reserved value, the Unix emulation
library emulates Unix filehandles. Consequently, you can't rely on
passing C<STDIN>, C<STDOUT>, or C<STDERR> to your children.
The desire of users to express filenames of the form
-C<E<lt>Foo$DirE<gt>.Bar> on the command line unquoted causes problems,
+C<< <Foo$Dir>.Bar >> on the command line unquoted causes problems,
too: C<``> command output capture has to perform a guessing game. It
-assumes that a string C<E<lt>[^E<lt>E<gt>]+\$[^E<lt>E<gt>]E<gt>> is a
+assumes that a string C<< <[^<>]+\$[^<>]> >> is a
reference to an environment variable, whereas anything else involving
-C<E<lt>> or C<E<gt>> is redirection, and generally manages to be 99%
+C<< < >> or C<< > >> is redirection, and generally manages to be 99%
right. Of course, the problem remains that scripts cannot rely on any
Unix tools being available, or that any tools found have Unix-like command
line arguments.
-Extensions and XS are, in theory, buildable by anyone using free tools.
-In practice, many don't, as users of the Acorn platform are used to binary
-distribution. MakeMaker does run, but no available make currently copes
-with MakeMaker's makefiles; even if/when this is fixed, the lack of a
-Unix-like shell can cause problems with makefile rules, especially lines
-of the form C<cd sdbm && make all>, and anything using quoting.
+Extensions and XS are, in theory, buildable by anyone using free
+tools. In practice, many don't, as users of the Acorn platform are
+used to binary distributions. MakeMaker does run, but no available
+make currently copes with MakeMaker's makefiles; even if and when
+this should be fixed, the lack of a Unix-like shell will cause
+problems with makefile rules, especially lines of the form C<cd
+sdbm && make all>, and anything using quoting.
"S<RISC OS>" is the proper name for the operating system, but the value
in C<$^O> is "riscos" (because we don't like shouting).
-Also see:
+=head2 Other perls
+
+Perl has been ported to many platforms that do not fit into any of
+the categories listed above. Some, such as AmigaOS, Atari MiNT,
+BeOS, HP MPE/iX, QNX, Plan 9, and VOS, have been well-integrated
+into the standard Perl source code kit. You may need to see the
+F<ports/> directory on CPAN for information, and possibly binaries,
+for the likes of: aos, Atari ST, lynxos, riscos, Novell Netware,
+Tandem Guardian, I<etc.> (Yes, we know that some of these OSes may
+fall under the Unix category, but we are not a standards body.)
+
+Some approximate operating system names and their C<$^O> values
+in the "OTHER" category include:
+
+ OS $^O $Config{'archname'}
+ ------------------------------------------
+ Amiga DOS amigaos m68k-amigos
+ MPE/iX mpeix PA-RISC1.1
+
+See also:
=over 4
-=item perl list
+=item *
-=back
+Amiga, F<README.amiga> (installed as L<perlamiga>).
+=item *
-=head2 Other perls
+Atari, F<README.mint> and Guido Flohr's web page
+http://stud.uni-sb.de/~gufl0000/
-Perl has been ported to a variety of platforms that do not fit into any of
-the above categories. Some, such as AmigaOS, BeOS, QNX, and Plan 9, have
-been well-integrated into the standard Perl source code kit. You may need
-to see the F<ports/> directory on CPAN for information, and possibly
-binaries, for the likes of: aos, atari, lynxos, riscos, Tandem Guardian,
-vos, I<etc.> (yes we know that some of these OSes may fall under the Unix
-category, but we are not a standards body.)
+=item *
-See also:
+Be OS, F<README.beos>
-=over 4
+=item *
-=item Atari, Guido Flohr's page C<http://stud.uni-sb.de/~gufl0000/>
+HP 300 MPE/iX, F<README.mpeix> and Mark Bixby's web page
+http://www.cccd.edu/~markb/perlix.html
-=item HP 300 MPE/iX C<http://www.cccd.edu/~markb/perlix.html>
+=item *
-=item Novell Netware
+A free perl5-based PERL.NLM for Novell Netware is available in
+precompiled binary and source code form from http://www.novell.com/
+as well as from CPAN.
-A free perl5-based PERL.NLM for Novell Netware is available from
-C<http://www.novell.com/>
+=item
-=back
+Plan 9, F<README.plan9>
+=back
=head1 FUNCTION IMPLEMENTATIONS
-Listed below are functions unimplemented or implemented differently on
-various platforms. Following each description will be, in parentheses, a
-list of platforms that the description applies to.
+Listed below are functions that are either completely unimplemented
+or else have been implemented differently on various platforms.
+Following each description will be, in parentheses, a list of
+platforms that the description applies to.
-The list may very well be incomplete, or wrong in some places. When in
-doubt, consult the platform-specific README files in the Perl source
-distribution, and other documentation resources for a given port.
+The list may well be incomplete, or even wrong in some places. When
+in doubt, consult the platform-specific README files in the Perl
+source distribution, and any other documentation resources accompanying
+a given port.
Be aware, moreover, that even among Unix-ish systems there are variations.
-For many functions, you can also query C<%Config>, exported by default
-from C<Config.pm>. For example, to check if the platform has the C<lstat>
-call, check C<$Config{'d_lstat'}>. See L<Config.pm> for a full
-description of available variables.
-
+For many functions, you can also query C<%Config>, exported by
+default from the Config module. For example, to check whether the
+platform has the C<lstat> call, check C<$Config{d_lstat}>. See
+L<Config> for a full description of available variables.
=head2 Alphabetical Listing of Perl Functions
@@ -1054,19 +1243,19 @@ description of available variables.
=item -X
-C<-r>, C<-w>, and C<-x> have only a very limited meaning; directories
+C<-r>, C<-w>, and C<-x> have a limited meaning only; directories
and applications are executable, and there are no uid/gid
-considerations. C<-o> is not supported. (S<Mac OS>)
+considerations. C<-o> is not supported. (S<Mac OS>)
-C<-r>, C<-w>, C<-x>, and C<-o> tell whether or not file is accessible,
-which may not reflect UIC-based file protections. (VMS)
+C<-r>, C<-w>, C<-x>, and C<-o> tell whether the file is accessible,
+which may not reflect UIC-based file protections. (VMS)
C<-s> returns the size of the data fork, not the total size of data fork
plus resource fork. (S<Mac OS>).
C<-s> by name on an open file will return the space reserved on disk,
rather than the current extent. C<-s> on an open filehandle returns the
-current size. (S<RISC OS>)
+current size. (S<RISC OS>)
C<-R>, C<-W>, C<-X>, C<-O> are indistinguishable from C<-r>, C<-w>,
C<-x>, C<-o>. (S<Mac OS>, Win32, VMS, S<RISC OS>)
@@ -1082,17 +1271,23 @@ C<-d> is true if passed a device spec without an explicit directory.
C<-T> and C<-B> are implemented, but might misclassify Mac text files
with foreign characters; this is the case will all platforms, but may
-affect S<Mac OS> often. (S<Mac OS>)
+affect S<Mac OS> often. (S<Mac OS>)
C<-x> (or C<-X>) determine if a file ends in one of the executable
-suffixes. C<-S> is meaningless. (Win32)
+suffixes. C<-S> is meaningless. (Win32)
C<-x> (or C<-X>) determine if a file has an executable file type.
(S<RISC OS>)
+=item alarm SECONDS
+
+=item alarm
+
+Not implemented. (Win32)
+
=item binmode FILEHANDLE
-Meaningless. (S<Mac OS>, S<RISC OS>)
+Meaningless. (S<Mac OS>, S<RISC OS>)
Reopens file and restores pointer; if function fails, underlying
filehandle may be closed, or pointer may be in a different position.
@@ -1103,7 +1298,7 @@ the filehandle may be flushed. (Win32)
=item chmod LIST
-Only limited meaning. Disabling/enabling write permission is mapped to
+Only limited meaning. Disabling/enabling write permission is mapped to
locking/unlocking the file. (S<Mac OS>)
Only good for changing "owner" read-write access, "group", and "other"
@@ -1154,6 +1349,9 @@ Not implemented. (S<Mac OS>)
Implemented via Spawn. (VM/ESA)
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
+
=item fcntl FILEHANDLE,FUNCTION,SCALAR
Not implemented. (Win32, VMS)
@@ -1166,7 +1364,12 @@ Available only on Windows NT (not on Windows 95). (Win32)
=item fork
-Not implemented. (S<Mac OS>, Win32, AmigaOS, S<RISC OS>, VOS, VM/ESA)
+Not implemented. (S<Mac OS>, AmigaOS, S<RISC OS>, VOS, VM/ESA)
+
+Emulated using multiple interpreters. See L<perlfork>. (Win32)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
=item getlogin
@@ -1270,11 +1473,11 @@ Not implemented. (Plan9, Win32, S<RISC OS>)
=item endpwent
-Not implemented. (S<Mac OS>, Win32, VM/ESA)
+Not implemented. (S<Mac OS>, MPE/iX, VM/ESA, Win32)
=item endgrent
-Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VM/ESA)
+Not implemented. (S<Mac OS>, MPE/iX, S<RISC OS>, VM/ESA, VMS, Win32)
=item endhostent
@@ -1303,14 +1506,8 @@ Not implemented. (S<Mac OS>, Plan9)
Globbing built-in, but only C<*> and C<?> metacharacters are supported.
(S<Mac OS>)
-Features depend on external perlglob.exe or perlglob.bat. May be
-overridden with something like File::DosGlob, which is recommended.
-(Win32)
-
-Globbing built-in, but only C<*> and C<?> metacharacters are supported.
-Globbing relies on operating system calls, which may return filenames
-in any order. As most filesystems are case-insensitive, even "sorted"
-filenames will not be in case-sensitive order. (S<RISC OS>)
+This operator is implemented via the File::Glob extension on most
+platforms. See L<File::Glob> for portability information.
=item ioctl FILEHANDLE,FUNCTION,SCALAR
@@ -1321,21 +1518,28 @@ in the Winsock API does. (Win32)
Available only for socket handles. (S<RISC OS>)
-=item kill LIST
+=item kill SIGNAL, LIST
Not implemented, hence not useful for taint checking. (S<Mac OS>,
S<RISC OS>)
-Available only for process handles returned by the C<system(1, ...)>
-method of spawning a process. (Win32)
+C<kill()> doesn't have the semantics of C<raise()>, i.e. it doesn't send
+a signal to the identified process like it does on Unix platforms.
+Instead C<kill($sig, $pid)> terminates the process identified by $pid,
+and makes it exit immediately with exit status $sig. As in Unix, if
+$sig is 0 and the specified process exists, it returns true without
+actually terminating it. (Win32)
=item link OLDFILE,NEWFILE
-Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+Not implemented. (S<Mac OS>, MPE/iX, VMS, S<RISC OS>)
Link count not updated because hard links are not quite that hard
(They are sort of half-way between hard and soft links). (AmigaOS)
+Hard links are implemented on Win32 (Windows NT and Windows 2000)
+under NTFS only.
+
=item lstat FILEHANDLE
=item lstat EXPR
@@ -1344,7 +1548,7 @@ Link count not updated because hard links are not quite that hard
Not implemented. (VMS, S<RISC OS>)
-Return values may be bogus. (Win32)
+Return values (especially for device and inode) may be bogus. (Win32)
=item msgctl ID,CMD,ARG
@@ -1360,11 +1564,14 @@ Not implemented. (S<Mac OS>, Win32, VMS, Plan9, S<RISC OS>, VOS)
=item open FILEHANDLE
-The C<|> variants are only supported if ToolServer is installed.
+The C<|> variants are supported only if ToolServer is installed.
(S<Mac OS>)
open to C<|-> and C<-|> are unsupported. (S<Mac OS>, Win32, S<RISC OS>)
+Opening a process does not automatically flush output handles on some
+platforms. (SunOS, Solaris, HP-UX)
+
=item pipe READHANDLE,WRITEHANDLE
Not implemented. (S<Mac OS>)
@@ -1383,6 +1590,8 @@ Only implemented on sockets. (Win32)
Only reliable on sockets. (S<RISC OS>)
+Note that the C<socket FILEHANDLE> form is generally portable.
+
=item semctl ID,SEMNUM,CMD,ARG
=item semget KEY,NSEMS,FLAGS
@@ -1391,6 +1600,10 @@ Only reliable on sockets. (S<RISC OS>)
Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+=item setgrent
+
+Not implemented. (MPE/iX, Win32)
+
=item setpgrp PID,PGRP
Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
@@ -1399,6 +1612,10 @@ Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
+=item setpwent
+
+Not implemented. (MPE/iX, Win32)
+
=item setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL
Not implemented. (S<Mac OS>, Plan9)
@@ -1453,14 +1670,17 @@ OS>, OS/390, VM/ESA)
Only implemented if ToolServer is installed. (S<Mac OS>)
As an optimization, may not call the command shell specified in
-C<$ENV{PERL5SHELL}>. C<system(1, @args)> spawns an external
+C<$ENV{PERL5SHELL}>. C<system(1, @args)> spawns an external
process and immediately returns its process designator, without
waiting for it to terminate. Return value may be used subsequently
-in C<wait> or C<waitpid>. (Win32)
+in C<wait> or C<waitpid>. Failure to spawn() a subprocess is indicated
+by setting $? to "255 << 8". C<$?> is set in a way compatible with
+Unix (i.e. the exitstatus of the subprocess is obtained by "$? >> 8",
+as described in the documentation). (Win32)
There is no shell to process metacharacters, and the native standard is
to pass a command line terminated by "\n" "\r" or "\0" to the spawned
-program. Redirection such as C<E<gt> foo> is performed (if at all) by
+program. Redirection such as C<< > foo >> is performed (if at all) by
the run time library of the spawned program. C<system> I<list> will call
the Unix emulation library's C<exec> emulation, which attempts to provide
emulation of the stdin, stdout, stderr in force in the parent, providing
@@ -1471,15 +1691,19 @@ of a child Unix program will exists. Mileage B<will> vary. (S<RISC OS>)
Far from being POSIX compliant. Because there may be no underlying
/bin/sh tries to work around the problem by forking and execing the
first token in its argument string. Handles basic redirection
-("E<lt>" or "E<gt>") on its own behalf. (MiNT)
+("<" or ">") on its own behalf. (MiNT)
+
+Does not automatically flush output handles on some platforms.
+(SunOS, Solaris, HP-UX)
=item times
Only the first entry returned is nonzero. (S<Mac OS>)
-"cumulative" times will be bogus. On anything other than Windows NT,
-"system" time will be bogus, and "user" time is actually the time
-returned by the clock() function in the C runtime library. (Win32)
+"cumulative" times will be bogus. On anything other than Windows NT
+or Windows 2000, "system" time will be bogus, and "user" time is
+actually the time returned by the clock() function in the C runtime
+library. (Win32)
Not useful. (S<RISC OS>)
@@ -1502,8 +1726,8 @@ should not be held open elsewhere. (Win32)
Returns undef where unavailable, as of version 5.005.
-C<umask()> works but the correct permissions are only set when the file
-is finally close()d. (AmigaOS)
+C<umask> works but the correct permissions are set only when the file
+is finally closed. (AmigaOS)
=item utime LIST
@@ -1532,7 +1756,45 @@ Not useful. (S<RISC OS>)
=over 4
-=item v1.39, 11 February, 1999
+=item v1.47, 22 March 2000
+
+Various cleanups from Tom Christiansen, including migration of
+long platform listings from L<perl>.
+
+=item v1.46, 12 February 2000
+
+Updates for VOS and MPE/iX. (Peter Prymmer) Other small changes.
+
+=item v1.45, 20 December 1999
+
+Small changes from 5.005_63 distribution, more changes to EBCDIC info.
+
+=item v1.44, 19 July 1999
+
+A bunch of updates from Peter Prymmer for C<$^O> values,
+endianness, File::Spec, VMS, BS2000, OS/400.
+
+=item v1.43, 24 May 1999
+
+Added a lot of cleaning up from Tom Christiansen.
+
+=item v1.42, 22 May 1999
+
+Added notes about tests, sprintf/printf, and epoch offsets.
+
+=item v1.41, 19 May 1999
+
+Lots more little changes to formatting and content.
+
+Added a bunch of C<$^O> and related values
+for various platforms; fixed mail and web addresses, and added
+and changed miscellaneous notes. (Peter Prymmer)
+
+=item v1.40, 11 April 1999
+
+Miscellaneous changes.
+
+=item v1.39, 11 February 1999
Changes from Jarkko and EMX URL fixes Michael Schwern. Additional
note about newlines added.
@@ -1574,40 +1836,195 @@ First public release with perl5.005.
=back
+=head1 Supported Platforms
+
+As of early March 2000 (the Perl release 5.6.0), the following
+platforms are able to build Perl from the standard source code
+distribution available at http://www.perl.com/CPAN/src/index.html
+
+ AIX
+ DOS DJGPP 1)
+ FreeBSD
+ HP-UX
+ IRIX
+ Linux
+ LynxOS
+ MachTen
+ MPE/iX
+ NetBSD
+ OpenBSD
+ OS/2
+ QNX
+ Rhapsody/Darwin 2)
+ SCO SV
+ SINIX
+ Solaris
+ SVR4
+ Tru64 UNIX 3)
+ UNICOS
+ UNICOS/mk
+ Unixware
+ VMS
+ VOS
+ Windows 3.1 1)
+ Windows 95 1) 4)
+ Windows 98 1) 4)
+ Windows NT 1) 4)
+
+ 1) in DOS mode either the DOS or OS/2 ports can be used
+ 2) new in 5.6.0: the BSD/NeXT-based UNIX of Mac OS X
+ 3) formerly known as Digital UNIX and before that DEC OSF/1
+ 4) compilers: Borland, Cygwin, Mingw32 EGCS/GCC, VC++
+
+The following platforms worked for the previous major release
+(5.005_03 being the latest maintenance release of that, as of early
+March 2000), but be did not manage to test these in time for the 5.6.0
+release of Perl. There is a very good chance that these will work
+just fine with 5.6.0.
+
+ A/UX
+ BeOS
+ BSD/OS
+ DG/UX
+ DYNIX/ptx
+ DomainOS
+ Hurd
+ NextSTEP
+ OpenSTEP
+ PowerMAX
+ SCO ODT/OSR
+ SunOS
+ Ultrix
+
+The following platform worked for the previous major release (5.005_03
+being the latest maintenance release of that, as of early March 2000).
+However, standardization on UTF-8 as the internal string representation
+in 5.6.0 has introduced incompatibilities in this EBCDIC platform.
+Support for this platform may be enabled in a future release:
+
+ OS390 1)
+
+ 1) Previously known as MVS, or OpenEdition MVS.
+
+Strongly related to the OS390 platform by also being EBCDIC-based
+mainframe platforms are the following platforms:
+
+ BS2000
+ VM/ESA
+
+These are also not expected to work under 5.6.0 for the same reasons
+as OS390. Contact the mailing list perl-mvs@perl.org for more details.
+
+MacOS (Classic, pre-X) is almost 5.6.0-ready; building from the source
+does work with 5.6.0, but additional MacOS specific source code is needed
+for a complete port. Contact the mailing list macperl-porters@macperl.org
+for more information.
+
+The following platforms have been known to build Perl from source in
+the past, but we haven't been able to verify their status for the
+current release, either because the hardware/software platforms are
+rare or because we don't have an active champion on these
+platforms--or both:
+
+ 3b1
+ AmigaOS
+ ConvexOS
+ CX/UX
+ DC/OSx
+ DDE SMES
+ DOS EMX
+ Dynix
+ EP/IX
+ ESIX
+ FPS
+ GENIX
+ Greenhills
+ ISC
+ MachTen 68k
+ MiNT
+ MPC
+ NEWS-OS
+ Opus
+ Plan 9
+ PowerUX
+ RISC/os
+ Stellar
+ SVR2
+ TI1500
+ TitanOS
+ Unisys Dynix
+ Unixware
+
+Support for the following platform is planned for a future Perl release:
+
+ Netware
+
+The following platforms have their own source code distributions and
+binaries available via http://www.perl.com/CPAN/ports/index.html:
+
+ Perl release
+
+ AS/400 5.003
+ Netware 5.003_07
+ Tandem Guardian 5.004
+
+The following platforms have only binaries available via
+http://www.perl.com/CPAN/ports/index.html :
+
+ Perl release
+
+ Acorn RISCOS 5.005_02
+ AOS 5.002
+ LynxOS 5.004_02
+
+Although we do suggest that you always build your own Perl from
+the source code, both for maximal configurability and for security,
+in case you are in a hurry you can check
+http://www.perl.com/CPAN/ports/index.html for binary distributions.
+
+=head1 SEE ALSO
+
+L<perlamiga>, L<perlcygwin>, L<perldos>, L<perlhpux>, L<perlos2>,
+L<perlos390>, L<perlwin32>, L<perlvms>, and L<Win32>.
+
=head1 AUTHORS / CONTRIBUTORS
-Abigail E<lt>abigail@fnx.comE<gt>,
-Charles Bailey E<lt>bailey@newman.upenn.eduE<gt>,
-Graham Barr E<lt>gbarr@pobox.comE<gt>,
-Tom Christiansen E<lt>tchrist@perl.comE<gt>,
-Nicholas Clark E<lt>Nicholas.Clark@liverpool.ac.ukE<gt>,
-Andy Dougherty E<lt>doughera@lafcol.lafayette.eduE<gt>,
-Dominic Dunlop E<lt>domo@vo.luE<gt>,
-Neale Ferguson E<lt>neale@mailbox.tabnsw.com.auE<gt>
-Paul Green E<lt>Paul_Green@stratus.comE<gt>,
-M.J.T. Guy E<lt>mjtg@cus.cam.ac.ukE<gt>,
-Jarkko Hietaniemi E<lt>jhi@iki.fi<gt>,
-Luther Huffman E<lt>lutherh@stratcom.comE<gt>,
-Nick Ing-Simmons E<lt>nick@ni-s.u-net.comE<gt>,
-Andreas J. KE<ouml>nig E<lt>koenig@kulturbox.deE<gt>,
-Markus Laker E<lt>mlaker@contax.co.ukE<gt>,
-Andrew M. Langmead E<lt>aml@world.std.comE<gt>,
-Paul Moore E<lt>Paul.Moore@uk.origin-it.comE<gt>,
-Chris Nandor E<lt>pudge@pobox.comE<gt>,
-Matthias Neeracher E<lt>neeri@iis.ee.ethz.chE<gt>,
-Gary Ng E<lt>71564.1743@CompuServe.COME<gt>,
-Tom Phoenix E<lt>rootbeer@teleport.comE<gt>,
-Peter Prymmer E<lt>pvhp@forte.comE<gt>,
-Hugo van der Sanden E<lt>hv@crypt0.demon.co.ukE<gt>,
-Gurusamy Sarathy E<lt>gsar@umich.eduE<gt>,
-Paul J. Schinder E<lt>schinder@pobox.comE<gt>,
-Michael G Schwern E<lt>schwern@pobox.comE<gt>,
-Dan Sugalski E<lt>sugalskd@ous.eduE<gt>,
-Nathan Torkington E<lt>gnat@frii.comE<gt>.
+Abigail <abigail@fnx.com>,
+Charles Bailey <bailey@newman.upenn.edu>,
+Graham Barr <gbarr@pobox.com>,
+Tom Christiansen <tchrist@perl.com>,
+Nicholas Clark <Nicholas.Clark@liverpool.ac.uk>,
+Thomas Dorner <Thomas.Dorner@start.de>,
+Andy Dougherty <doughera@lafcol.lafayette.edu>,
+Dominic Dunlop <domo@vo.lu>,
+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>,
+Luther Huffman <lutherh@stratcom.com>,
+Nick Ing-Simmons <nick@ni-s.u-net.com>,
+Andreas J. KE<ouml>nig <koenig@kulturbox.de>,
+Markus Laker <mlaker@contax.co.uk>,
+Andrew M. Langmead <aml@world.std.com>,
+Larry Moore <ljmoore@freespace.net>,
+Paul Moore <Paul.Moore@uk.origin-it.com>,
+Chris Nandor <pudge@pobox.com>,
+Matthias Neeracher <neeri@iis.ee.ethz.ch>,
+Gary Ng <71564.1743@CompuServe.COM>,
+Tom Phoenix <rootbeer@teleport.com>,
+AndrE<eacute> Pirard <A.Pirard@ulg.ac.be>,
+Peter Prymmer <pvhp@forte.com>,
+Hugo van der Sanden <hv@crypt0.demon.co.uk>,
+Gurusamy Sarathy <gsar@activestate.com>,
+Paul J. Schinder <schinder@pobox.com>,
+Michael G Schwern <schwern@pobox.com>,
+Dan Sugalski <sugalskd@ous.edu>,
+Nathan Torkington <gnat@frii.com>.
This document is maintained by Chris Nandor
-E<lt>pudge@pobox.comE<gt>.
+<pudge@pobox.com>.
=head1 VERSION
-Version 1.39, last modified 11 February 1999
+Version 1.47, last modified 22 March 2000
diff --git a/contrib/perl5/pod/perlre.pod b/contrib/perl5/pod/perlre.pod
index d4c1dee..e1f30a3 100644
--- a/contrib/perl5/pod/perlre.pod
+++ b/contrib/perl5/pod/perlre.pod
@@ -6,13 +6,13 @@ perlre - Perl regular expressions
This page describes the syntax of regular expressions in Perl. For a
description of how to I<use> regular expressions in matching
-operations, plus various examples of the same, see discussion
+operations, plus various examples of the same, see discussions
of C<m//>, C<s///>, C<qr//> and C<??> in L<perlop/"Regexp Quote-Like Operators">.
-The matching operations can have various modifiers. The modifiers
+Matching operations can have various modifiers. Modifiers
that relate to the interpretation of the regular expression inside
-are listed below. For the modifiers that alter the way a regular expression
-is used by Perl, see L<perlop/"Regexp Quote-Like Operators"> and
+are listed below. Modifiers that alter the way a regular expression
+is used by Perl are detailed in L<perlop/"Regexp Quote-Like Operators"> and
L<perlop/"Gory details of parsing quoted constructs">.
=over 4
@@ -27,20 +27,21 @@ locale. See L<perllocale>.
=item m
Treat string as multiple lines. That is, change "^" and "$" from matching
-at only the very start or end of the string to the start or end of any
-line anywhere within the string,
+the start or end of the string to matching the start or end of any
+line anywhere within the string.
=item s
Treat string as single line. That is, change "." to match any character
-whatsoever, even a newline, which it normally would not match.
+whatsoever, even a newline, which normally it would not match.
-The C</s> and C</m> modifiers both override the C<$*> setting. That is, no matter
-what C<$*> contains, C</s> without C</m> will force "^" to match only at the
-beginning of the string and "$" to match only at the end (or just before a
-newline at the end) of the string. Together, as /ms, they let the "." match
-any character whatsoever, while yet allowing "^" and "$" to match,
-respectively, just after and just before newlines within the string.
+The C</s> and C</m> modifiers both override the C<$*> setting. That
+is, no matter what C<$*> contains, C</s> without C</m> will force
+"^" to match only at the beginning of the string and "$" to match
+only at the end (or just before a newline at the end) of the string.
+Together, as /ms, they let the "." match any character whatsoever,
+while yet allowing "^" and "$" to match, respectively, just after
+and just before newlines within the string.
=item x
@@ -49,9 +50,9 @@ Extend your pattern's legibility by permitting whitespace and comments.
=back
These are usually written as "the C</x> modifier", even though the delimiter
-in question might not actually be a slash. In fact, any of these
+in question might not really be a slash. Any of these
modifiers may also be embedded within the regular expression itself using
-the new C<(?...)> construct. See below.
+the C<(?...)> construct. See below.
The C</x> modifier itself needs a little more explanation. It tells
the regular expression parser to ignore whitespace that is neither
@@ -59,7 +60,7 @@ backslashed nor within a character class. You can use this to break up
your regular expression into (slightly) more readable parts. The C<#>
character is also treated as a metacharacter introducing a comment,
just as in ordinary Perl code. This also means that if you want real
-whitespace or C<#> characters in the pattern (outside of a character
+whitespace or C<#> characters in the pattern (outside a character
class, where they are unaffected by C</x>), that you'll either have to
escape them or encode them using octal or hex escapes. Taken together,
these features go a long way towards making Perl's regular expressions
@@ -70,11 +71,11 @@ in L<perlop>.
=head2 Regular Expressions
-The patterns used in pattern matching are regular expressions such as
-those supplied in the Version 8 regex routines. (In fact, the
-routines are derived (distantly) from Henry Spencer's freely
-redistributable reimplementation of the V8 routines.)
-See L<Version 8 Regular Expressions> for details.
+The patterns used in Perl pattern matching derive from supplied in
+the Version 8 regex routines. (The routines are derived
+(distantly) from Henry Spencer's freely redistributable reimplementation
+of the V8 routines.) See L<Version 8 Regular Expressions> for
+details.
In particular the following metacharacters have their standard I<egrep>-ish
meanings:
@@ -87,9 +88,9 @@ meanings:
() Grouping
[] Character class
-By default, the "^" character is guaranteed to match at only the
-beginning of the string, the "$" character at only the end (or before the
-newline at the end) and Perl does certain optimizations with the
+By default, the "^" character is guaranteed to match only the
+beginning of the string, the "$" character only the end (or before the
+newline at the end), and Perl does certain optimizations with the
assumption that the string contains only one line. Embedded newlines
will not be matched by "^" or "$". You may, however, wish to treat a
string as a multi-line buffer, such that the "^" will match after any
@@ -98,7 +99,7 @@ cost of a little more overhead, you can do this by using the /m modifier
on the pattern match operator. (Older programs did this by setting C<$*>,
but this practice is now deprecated.)
-To facilitate multi-line substitutions, the "." character never matches a
+To simplify multi-line substitutions, the "." character never matches a
newline unless you use the C</s> modifier, which in effect tells Perl to pretend
the string is a single line--even if it isn't. The C</s> modifier also
overrides the setting of C<$*>, in case you have some (badly behaved) older
@@ -120,7 +121,7 @@ to integral values less than a preset limit defined when perl is built.
This is usually 32766 on the most common platforms. The actual limit can
be seen in the error message generated by code such as this:
- $_ **= $_ , / {$_} / for 2 .. 42;
+ $_ **= $_ , / {$_} / for 2 .. 42;
By default, a quantified subpattern is "greedy", that is, it will match as
many times as possible (given a particular starting location) while still
@@ -146,7 +147,9 @@ also work:
\e escape (think troff) (ESC)
\033 octal char (think of a PDP-11)
\x1B hex char
+ \x{263a} wide hex char (Unicode SMILEY)
\c[ control char
+ \N{name} named char
\l lowercase next char (think vi)
\u uppercase next char (think vi)
\L lowercase till \E (think vi)
@@ -155,7 +158,8 @@ also work:
\Q quote (disable) pattern metacharacters till \E
If C<use locale> is in effect, the case map used by C<\l>, C<\L>, C<\u>
-and C<\U> is taken from the current locale. See L<perllocale>.
+and C<\U> is taken from the current locale. See L<perllocale>. For
+documentation of C<\N{name}>, see L<charnames>.
You cannot include a literal C<$> or C<@> within a C<\Q> sequence.
An unescaped C<$> or C<@> interpolates the corresponding variable,
@@ -170,13 +174,114 @@ In addition, Perl defines the following:
\S Match a non-whitespace character
\d Match a digit character
\D Match a non-digit character
+ \pP Match P, named property. Use \p{Prop} for longer names.
+ \PP Match non-P
+ \X Match eXtended Unicode "combining character sequence",
+ equivalent to C<(?:\PM\pM*)>
+ \C Match a single C char (octet) even under utf8.
+
+A C<\w> matches a single alphanumeric character, not a whole word.
+Use C<\w+> to match a string of Perl-identifier characters (which isn't
+the same as matching an English word). If C<use locale> is in effect, the
+list of alphabetic characters generated by C<\w> is taken from the
+current locale. See L<perllocale>. You may use C<\w>, C<\W>, C<\s>, C<\S>,
+C<\d>, and C<\D> within character classes, but if you try to use them
+as endpoints of a range, that's not a range, the "-" is understood literally.
+See L<utf8> for details about C<\pP>, C<\PP>, and C<\X>.
+
+The POSIX character class syntax
+
+ [:class:]
+
+is also available. The available classes and their backslash
+equivalents (if available) are as follows:
+
+ alpha
+ alnum
+ ascii
+ cntrl
+ digit \d
+ graph
+ lower
+ print
+ punct
+ space \s
+ upper
+ word \w
+ xdigit
+
+For example use C<[:upper:]> to match all the uppercase characters.
+Note that the C<[]> are part of the C<[::]> construct, not part of the whole
+character class. For example:
+
+ [01[:alpha:]%]
+
+matches one, zero, any alphabetic character, and the percentage sign.
+
+If the C<utf8> pragma is used, the following equivalences to Unicode
+\p{} constructs hold:
+
+ alpha IsAlpha
+ alnum IsAlnum
+ ascii IsASCII
+ cntrl IsCntrl
+ digit IsDigit
+ graph IsGraph
+ lower IsLower
+ print IsPrint
+ punct IsPunct
+ space IsSpace
+ upper IsUpper
+ word IsWord
+ xdigit IsXDigit
+
+For example C<[:lower:]> and C<\p{IsLower}> are equivalent.
+
+If the C<utf8> pragma is not used but the C<locale> pragma is, the
+classes correlate with the isalpha(3) interface (except for `word',
+which is a Perl extension, mirroring C<\w>).
+
+The assumedly non-obviously named classes are:
-A C<\w> matches a single alphanumeric character, not a whole
-word. To match a word you'd need to say C<\w+>. If C<use locale> is in
-effect, the list of alphabetic characters generated by C<\w> is taken
-from the current locale. See L<perllocale>. You may use C<\w>, C<\W>,
-C<\s>, C<\S>, C<\d>, and C<\D> within character classes (though not as
-either end of a range).
+=over 4
+
+=item cntrl
+
+Any control character. Usually characters that don't produce output as
+such but instead control the terminal somehow: for example newline and
+backspace are control characters. All characters with ord() less than
+32 are most often classified as control characters.
+
+=item graph
+
+Any alphanumeric or punctuation character.
+
+=item print
+
+Any alphanumeric or punctuation character or space.
+
+=item punct
+
+Any punctuation character.
+
+=item xdigit
+
+Any hexadecimal digit. Though this may feel silly (/0-9a-f/i would
+work just fine) it is included for completeness.
+
+=back
+
+You can negate the [::] character classes by prefixing the class name
+with a '^'. This is a Perl extension. For example:
+
+ POSIX trad. Perl utf8 Perl
+
+ [:^digit:] \D \P{IsDigit}
+ [:^space:] \S \P{IsSpace}
+ [:^word:] \W \P{IsWord}
+
+The POSIX character classes [.cc.] and [=cc=] are recognized but
+B<not> supported and trying to use them will cause an error.
Perl defines the following zero-width assertions:
@@ -185,101 +290,163 @@ Perl defines the following zero-width assertions:
\A Match only at beginning of string
\Z Match only at end of string, or before newline at the end
\z Match only at end of string
- \G Match only where previous m//g left off (works only with /g)
-
-A word boundary (C<\b>) is defined as a spot between two characters that
-has a C<\w> on one side of it and a C<\W> on the other side of it (in
-either order), counting the imaginary characters off the beginning and
-end of the string as matching a C<\W>. (Within character classes C<\b>
-represents backspace rather than a word boundary.) The C<\A> and C<\Z> are
-just like "^" and "$", except that they won't match multiple times when the
-C</m> modifier is used, while "^" and "$" will match at every internal line
-boundary. To match the actual end of the string, not ignoring newline,
-you can use C<\z>. The C<\G> assertion can be used to chain global
-matches (using C<m//g>), as described in
-L<perlop/"Regexp Quote-Like Operators">.
-
-It is also useful when writing C<lex>-like scanners, when you have several
-patterns that you want to match against consequent substrings of your
-string, see the previous reference.
-The actual location where C<\G> will match can also be influenced
-by using C<pos()> as an lvalue. See L<perlfunc/pos>.
-
-When the bracketing construct C<( ... )> is used, \E<lt>digitE<gt> matches the
-digit'th substring. Outside of the pattern, always use "$" instead of "\"
-in front of the digit. (While the \E<lt>digitE<gt> notation can on rare occasion work
-outside the current pattern, this should not be relied upon. See the
-WARNING below.) The scope of $E<lt>digitE<gt> (and C<$`>, C<$&>, and C<$'>)
-extends to the end of the enclosing BLOCK or eval string, or to the next
-successful pattern match, whichever comes first. If you want to use
-parentheses to delimit a subpattern (e.g., a set of alternatives) without
-saving it as a subpattern, follow the ( with a ?:.
-
-You may have as many parentheses as you wish. If you have more
-than 9 substrings, the variables $10, $11, ... refer to the
-corresponding substring. Within the pattern, \10, \11, etc. refer back
-to substrings if there have been at least that many left parentheses before
-the backreference. Otherwise (for backward compatibility) \10 is the
-same as \010, a backspace, and \11 the same as \011, a tab. And so
-on. (\1 through \9 are always backreferences.)
-
-C<$+> returns whatever the last bracket match matched. C<$&> returns the
-entire matched string. (C<$0> used to return the same thing, but not any
-more.) C<$`> returns everything before the matched string. C<$'> returns
-everything after the matched string. Examples:
+ \G Match only at pos() (e.g. at the end-of-match position
+ of prior m//g)
+
+A word boundary (C<\b>) is a spot between two characters
+that has a C<\w> on one side of it and a C<\W> on the other side
+of it (in either order), counting the imaginary characters off the
+beginning and end of the string as matching a C<\W>. (Within
+character classes C<\b> represents backspace rather than a word
+boundary, just as it normally does in any double-quoted string.)
+The C<\A> and C<\Z> are just like "^" and "$", except that they
+won't match multiple times when the C</m> modifier is used, while
+"^" and "$" will match at every internal line boundary. To match
+the actual end of the string and not ignore an optional trailing
+newline, use C<\z>.
+
+The C<\G> assertion can be used to chain global matches (using
+C<m//g>), as described in L<perlop/"Regexp Quote-Like Operators">.
+It is also useful when writing C<lex>-like scanners, when you have
+several patterns that you want to match against consequent substrings
+of your string, see the previous reference. The actual location
+where C<\G> will match can also be influenced by using C<pos()> as
+an lvalue. See L<perlfunc/pos>.
+
+The bracketing construct C<( ... )> creates capture buffers. To
+refer to the digit'th buffer use \<digit> within the
+match. Outside the match use "$" instead of "\". (The
+\<digit> notation works in certain circumstances outside
+the match. See the warning below about \1 vs $1 for details.)
+Referring back to another part of the match is called a
+I<backreference>.
+
+There is no limit to the number of captured substrings that you may
+use. However Perl also uses \10, \11, etc. as aliases for \010,
+\011, etc. (Recall that 0 means octal, so \011 is the 9'th ASCII
+character, a tab.) Perl resolves this ambiguity by interpreting
+\10 as a backreference only if at least 10 left parentheses have
+opened before it. Likewise \11 is a backreference only if at least
+11 left parentheses have opened before it. And so on. \1 through
+\9 are always interpreted as backreferences."
+
+Examples:
s/^([^ ]*) *([^ ]*)/$2 $1/; # swap first two words
- if (/Time: (..):(..):(..)/) {
+ if (/(.)\1/) { # find first doubled char
+ print "'$1' is the first doubled character\n";
+ }
+
+ if (/Time: (..):(..):(..)/) { # parse out values
$hours = $1;
$minutes = $2;
$seconds = $3;
}
-Once perl sees that you need one of C<$&>, C<$`> or C<$'> anywhere in
-the program, it has to provide them on each and every pattern match.
-This can slow your program down. The same mechanism that handles
-these provides for the use of $1, $2, etc., so you pay the same price
-for each pattern that contains capturing parentheses. But if you never
-use $&, etc., in your script, then patterns I<without> capturing
-parentheses won't be penalized. So avoid $&, $', and $` if you can,
-but if you can't (and some algorithms really appreciate them), once
-you've used them once, use them at will, because you've already paid
-the price. As of 5.005, $& is not so costly as the other two.
-
-Backslashed metacharacters in Perl are
-alphanumeric, such as C<\b>, C<\w>, C<\n>. Unlike some other regular
-expression languages, there are no backslashed symbols that aren't
-alphanumeric. So anything that looks like \\, \(, \), \E<lt>, \E<gt>,
-\{, or \} is always interpreted as a literal character, not a
-metacharacter. This was once used in a common idiom to disable or
-quote the special meanings of regular expression metacharacters in a
-string that you want to use for a pattern. Simply quote all
-non-alphanumeric characters:
+Several special variables also refer back to portions of the previous
+match. C<$+> returns whatever the last bracket match matched.
+C<$&> returns the entire matched string. (At one point C<$0> did
+also, but now it returns the name of the program.) C<$`> returns
+everything before the matched string. And C<$'> returns everything
+after the matched string.
+
+The numbered variables ($1, $2, $3, etc.) and the related punctuation
+set (C<<$+>, C<$&>, C<$`>, and C<$'>) are all dynamically scoped
+until the end of the enclosing block or until the next successful
+match, whichever comes first. (See L<perlsyn/"Compound Statements">.)
+
+B<WARNING>: Once Perl sees that you need one of C<$&>, C<$`>, or
+C<$'> anywhere in the program, it has to provide them for every
+pattern match. This may substantially slow your program. Perl
+uses the same mechanism to produce $1, $2, etc, so you also pay a
+price for each pattern that contains capturing parentheses. (To
+avoid this cost while retaining the grouping behaviour, use the
+extended regular expression C<(?: ... )> instead.) But if you never
+use C<$&>, C<$`> or C<$'>, then patterns I<without> capturing
+parentheses will not be penalized. So avoid C<$&>, C<$'>, and C<$`>
+if you can, but if you can't (and some algorithms really appreciate
+them), once you've used them once, use them at will, because you've
+already paid the price. As of 5.005, C<$&> is not so costly as the
+other two.
+
+Backslashed metacharacters in Perl are alphanumeric, such as C<\b>,
+C<\w>, C<\n>. Unlike some other regular expression languages, there
+are no backslashed symbols that aren't alphanumeric. So anything
+that looks like \\, \(, \), \<, \>, \{, or \} is always
+interpreted as a literal character, not a metacharacter. This was
+once used in a common idiom to disable or quote the special meanings
+of regular expression metacharacters in a string that you want to
+use for a pattern. Simply quote all non-alphanumeric characters:
$pattern =~ s/(\W)/\\$1/g;
-Now it is much more common to see either the quotemeta() function or
-the C<\Q> escape sequence used to disable all metacharacters' special
+Today it is more common to use the quotemeta() function or the C<\Q>
+metaquoting escape sequence to disable all metacharacters' special
meanings like this:
/$unquoted\Q$quoted\E$unquoted/
-Perl defines a consistent extension syntax for regular expressions.
-The syntax is a pair of parentheses with a question mark as the first
-thing within the parentheses (this was a syntax error in older
-versions of Perl). The character after the question mark gives the
-function of the extension. Several extensions are already supported:
+Beware that if you put literal backslashes (those not inside
+interpolated variables) between C<\Q> and C<\E>, double-quotish
+backslash interpolation may lead to confusing results. If you
+I<need> to use literal backslashes within C<\Q...\E>,
+consult L<perlop/"Gory details of parsing quoted constructs">.
+
+=head2 Extended Patterns
+
+Perl also defines a consistent extension syntax for features not
+found in standard tools like B<awk> and B<lex>. The syntax is a
+pair of parentheses with a question mark as the first thing within
+the parentheses. The character after the question mark indicates
+the extension.
+
+The stability of these extensions varies widely. Some have been
+part of the core language for many years. Others are experimental
+and may change without warning or be completely removed. Check
+the documentation on an individual feature to verify its current
+status.
+
+A question mark was chosen for this and for the minimal-matching
+construct because 1) question marks are rare in older regular
+expressions, and 2) whenever you see one, you should stop and
+"question" exactly what is going on. That's psychology...
=over 10
=item C<(?#text)>
-A comment. The text is ignored. If the C</x> switch is used to enable
-whitespace formatting, a simple C<#> will suffice. Note that perl closes
+A comment. The text is ignored. If the C</x> modifier enables
+whitespace formatting, a simple C<#> will suffice. Note that Perl closes
the comment as soon as it sees a C<)>, so there is no way to put a literal
C<)> in the comment.
+=item C<(?imsx-imsx)>
+
+One or more embedded pattern-match modifiers. This is particularly
+useful for dynamic patterns, such as those read in from a configuration
+file, read in as an argument, are specified in a table somewhere,
+etc. Consider the case that some of which want to be case sensitive
+and some do not. The case insensitive ones need to include merely
+C<(?i)> at the front of the pattern. For example:
+
+ $pattern = "foobar";
+ if ( /$pattern/i ) { }
+
+ # more flexible:
+
+ $pattern = "(?i)foobar";
+ if ( /$pattern/ ) { }
+
+Letters after a C<-> turn those modifiers off. These modifiers are
+localized inside an enclosing group (if any). For example,
+
+ ( (?i) blah ) \s+ \1
+
+will match a repeated (I<including the case>!) word C<blah> in any
+case, assuming C<x> modifier, and no C<i> modifier outside this
+group.
+
=item C<(?:pattern)>
=item C<(?imsx-imsx:pattern)>
@@ -293,28 +460,29 @@ is like
@fields = split(/\b(a|b|c)\b/)
-but doesn't spit out extra fields.
+but doesn't spit out extra fields. It's also cheaper not to capture
+characters if you don't need to.
-The letters between C<?> and C<:> act as flags modifiers, see
-L<C<(?imsx-imsx)>>. In particular,
+Any letters between C<?> and C<:> act as flags modifiers as with
+C<(?imsx-imsx)>. For example,
/(?s-i:more.*than).*million/i
-is equivalent to more verbose
+is equivalent to the more verbose
/(?:(?s-i)more.*than).*million/i
=item C<(?=pattern)>
-A zero-width positive lookahead assertion. For example, C</\w+(?=\t)/>
+A zero-width positive look-ahead assertion. For example, C</\w+(?=\t)/>
matches a word followed by a tab, without including the tab in C<$&>.
=item C<(?!pattern)>
-A zero-width negative lookahead assertion. For example C</foo(?!bar)/>
+A zero-width negative look-ahead assertion. For example C</foo(?!bar)/>
matches any occurrence of "foo" that isn't followed by "bar". Note
-however that lookahead and lookbehind are NOT the same thing. You cannot
-use this for lookbehind.
+however that look-ahead and look-behind are NOT the same thing. You cannot
+use this for look-behind.
If you are looking for a "bar" that isn't preceded by a "foo", C</(?!foo)bar/>
will not do what you want. That's because the C<(?!foo)> is just saying that
@@ -326,29 +494,32 @@ Sometimes it's still easier just to say:
if (/bar/ && $` !~ /foo$/)
-For lookbehind see below.
+For look-behind see below.
-=item C<(?E<lt>=pattern)>
+=item C<(?<=pattern)>
-A zero-width positive lookbehind assertion. For example, C</(?E<lt>=\t)\w+/>
-matches a word following a tab, without including the tab in C<$&>.
-Works only for fixed-width lookbehind.
+A zero-width positive look-behind assertion. For example, C</(?<=\t)\w+/>
+matches a word that follows a tab, without including the tab in C<$&>.
+Works only for fixed-width look-behind.
=item C<(?<!pattern)>
-A zero-width negative lookbehind assertion. For example C</(?<!bar)foo/>
-matches any occurrence of "foo" that isn't following "bar".
-Works only for fixed-width lookbehind.
+A zero-width negative look-behind assertion. For example C</(?<!bar)foo/>
+matches any occurrence of "foo" that does not follow "bar". Works
+only for fixed-width look-behind.
=item C<(?{ code })>
-Experimental "evaluate any Perl code" zero-width assertion. Always
-succeeds. C<code> is not interpolated. Currently the rules to
-determine where the C<code> ends are somewhat convoluted.
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+
+This zero-width assertion evaluate any embedded Perl code. It
+always succeeds, and its C<code> is not interpolated. Currently,
+the rules to determine where the C<code> ends are somewhat convoluted.
-The C<code> is properly scoped in the following sense: if the assertion
-is backtracked (compare L<"Backtracking">), all the changes introduced after
-C<local>isation are undone, so
+The C<code> is properly scoped in the following sense: If the assertion
+is backtracked (compare L<"Backtracking">), all changes introduced after
+C<local>ization are undone, so that
$_ = 'a' x 8;
m<
@@ -364,117 +535,173 @@ C<local>isation are undone, so
# location.
>x;
-will set C<$res = 4>. Note that after the match $cnt returns to the globally
-introduced value 0, since the scopes which restrict C<local> statements
+will set C<$res = 4>. Note that after the match, $cnt returns to the globally
+introduced value, because the scopes that restrict C<local> operators
are unwound.
-This assertion may be used as L<C<(?(condition)yes-pattern|no-pattern)>>
-switch. If I<not> used in this way, the result of evaluation of C<code>
-is put into variable $^R. This happens immediately, so $^R can be used from
-other C<(?{ code })> assertions inside the same regular expression.
+This assertion may be used as a C<(?(condition)yes-pattern|no-pattern)>
+switch. If I<not> used in this way, the result of evaluation of
+C<code> is put into the special variable C<$^R>. This happens
+immediately, so C<$^R> can be used from other C<(?{ code })> assertions
+inside the same regular expression.
-The above assignment to $^R is properly localized, thus the old value of $^R
-is restored if the assertion is backtracked (compare L<"Backtracking">).
+The assignment to C<$^R> above is properly localized, so the old
+value of C<$^R> is restored if the assertion is backtracked; compare
+L<"Backtracking">.
-Due to security concerns, this construction is not allowed if the regular
-expression involves run-time interpolation of variables, unless
-C<use re 'eval'> pragma is used (see L<re>), or the variables contain
-results of qr() operator (see L<perlop/"qr/STRING/imosx">).
+For reasons of security, this construct is forbidden if the regular
+expression involves run-time interpolation of variables, unless the
+perilous C<use re 'eval'> pragma has been used (see L<re>), or the
+variables contain results of C<qr//> operator (see
+L<perlop/"qr/STRING/imosx">).
-This restriction is due to the wide-spread (questionable) practice of
-using the construct
+This restriction is because of the wide-spread and remarkably convenient
+custom of using run-time determined strings as patterns. For example:
$re = <>;
chomp $re;
$string =~ /$re/;
-without tainting. While this code is frowned upon from security point
-of view, when C<(?{})> was introduced, it was considered bad to add
-I<new> security holes to existing scripts.
-
-B<NOTE:> Use of the above insecure snippet without also enabling taint mode
-is to be severely frowned upon. C<use re 'eval'> does not disable tainting
-checks, thus to allow $re in the above snippet to contain C<(?{})>
-I<with tainting enabled>, one needs both C<use re 'eval'> and untaint
-the $re.
-
-=item C<(?E<gt>pattern)>
-
-An "independent" subexpression. Matches the substring that a
-I<standalone> C<pattern> would match if anchored at the given position,
-B<and only this substring>.
-
-Say, C<^(?E<gt>a*)ab> will never match, since C<(?E<gt>a*)> (anchored
-at the beginning of string, as above) will match I<all> characters
-C<a> at the beginning of string, leaving no C<a> for C<ab> to match.
-In contrast, C<a*ab> will match the same as C<a+b>, since the match of
-the subgroup C<a*> is influenced by the following group C<ab> (see
-L<"Backtracking">). In particular, C<a*> inside C<a*ab> will match
-fewer characters than a standalone C<a*>, since this makes the tail match.
-
-An effect similar to C<(?E<gt>pattern)> may be achieved by
-
- (?=(pattern))\1
-
-since the lookahead is in I<"logical"> context, thus matches the same
-substring as a standalone C<a+>. The following C<\1> eats the matched
-string, thus making a zero-length assertion into an analogue of
-C<(?E<gt>...)>. (The difference between these two constructs is that the
-second one uses a catching group, thus shifting ordinals of
-backreferences in the rest of a regular expression.)
-
-This construct is useful for optimizations of "eternal"
-matches, because it will not backtrack (see L<"Backtracking">).
+Before Perl knew how to execute interpolated code within a pattern,
+this operation was completely safe from a security point of view,
+although it could raise an exception from an illegal pattern. If
+you turn on the C<use re 'eval'>, though, it is no longer secure,
+so you should only do so if you are also using taint checking.
+Better yet, use the carefully constrained evaluation within a Safe
+module. See L<perlsec> for details about both these mechanisms.
+
+=item C<(??{ code })>
+
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+A simplified version of the syntax may be introduced for commonly
+used idioms.
+
+This is a "postponed" regular subexpression. The C<code> is evaluated
+at run time, at the moment this subexpression may match. The result
+of evaluation is considered as a regular expression and matched as
+if it were inserted instead of this construct.
+
+The C<code> is not interpolated. As before, the rules to determine
+where the C<code> ends are currently somewhat convoluted.
+
+The following pattern matches a parenthesized group:
+
+ $re = qr{
+ \(
+ (?:
+ (?> [^()]+ ) # Non-parens without backtracking
+ |
+ (??{ $re }) # Group with matching parens
+ )*
+ \)
+ }x;
+
+=item C<< (?>pattern) >>
+
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+
+An "independent" subexpression, one which matches the substring
+that a I<standalone> C<pattern> would match if anchored at the given
+position, and it matches I<nothing other than this substring>. This
+construct is useful for optimizations of what would otherwise be
+"eternal" matches, because it will not backtrack (see L<"Backtracking">).
+It may also be useful in places where the "grab all you can, and do not
+give anything back" semantic is desirable.
+
+For example: C<< ^(?>a*)ab >> will never match, since C<< (?>a*) >>
+(anchored at the beginning of string, as above) will match I<all>
+characters C<a> at the beginning of string, leaving no C<a> for
+C<ab> to match. In contrast, C<a*ab> will match the same as C<a+b>,
+since the match of the subgroup C<a*> is influenced by the following
+group C<ab> (see L<"Backtracking">). In particular, C<a*> inside
+C<a*ab> will match fewer characters than a standalone C<a*>, since
+this makes the tail match.
+
+An effect similar to C<< (?>pattern) >> may be achieved by writing
+C<(?=(pattern))\1>. This matches the same substring as a standalone
+C<a+>, and the following C<\1> eats the matched string; it therefore
+makes a zero-length assertion into an analogue of C<< (?>...) >>.
+(The difference between these two constructs is that the second one
+uses a capturing group, thus shifting ordinals of backreferences
+in the rest of a regular expression.)
+
+Consider this pattern:
m{ \(
(
- [^()]+
+ [^()]+ # x+
|
\( [^()]* \)
)+
\)
}x
-That will efficiently match a nonempty group with matching
-two-or-less-level-deep parentheses. However, if there is no such group,
-it will take virtually forever on a long string. That's because there are
-so many different ways to split a long string into several substrings.
-This is what C<(.+)+> is doing, and C<(.+)+> is similar to a subpattern
-of the above pattern. Consider that the above pattern detects no-match
-on C<((()aaaaaaaaaaaaaaaaaa> in several seconds, but that each extra
-letter doubles this time. This exponential performance will make it
-appear that your program has hung.
-
-However, a tiny modification of this pattern
+That will efficiently match a nonempty group with matching parentheses
+two levels deep or less. However, if there is no such group, it
+will take virtually forever on a long string. That's because there
+are so many different ways to split a long string into several
+substrings. This is what C<(.+)+> is doing, and C<(.+)+> is similar
+to a subpattern of the above pattern. Consider how the pattern
+above detects no-match on C<((()aaaaaaaaaaaaaaaaaa> in several
+seconds, but that each extra letter doubles this time. This
+exponential performance will make it appear that your program has
+hung. However, a tiny change to this pattern
m{ \(
(
- (?> [^()]+ )
+ (?> [^()]+ ) # change x+ above to (?> x+ )
|
\( [^()]* \)
)+
\)
}x
-which uses C<(?E<gt>...)> matches exactly when the one above does (verifying
+which uses C<< (?>...) >> matches exactly when the one above does (verifying
this yourself would be a productive exercise), but finishes in a fourth
the time when used on a similar string with 1000000 C<a>s. Be aware,
however, that this pattern currently triggers a warning message under
-B<-w> saying it C<"matches the null string many times">):
+the C<use warnings> pragma or B<-w> switch saying it
+C<"matches the null string many times">):
-On simple groups, such as the pattern C<(?E<gt> [^()]+ )>, a comparable
-effect may be achieved by negative lookahead, as in C<[^()]+ (?! [^()] )>.
+On simple groups, such as the pattern C<< (?> [^()]+ ) >>, a comparable
+effect may be achieved by negative look-ahead, as in C<[^()]+ (?! [^()] )>.
This was only 4 times slower on a string with 1000000 C<a>s.
+The "grab all you can, and do not give anything back" semantic is desirable
+in many situations where on the first sight a simple C<()*> looks like
+the correct solution. Suppose we parse text with comments being delimited
+by C<#> followed by some optional (horizontal) whitespace. Contrary to
+its appearence, C<#[ \t]*> I<is not> the correct subexpression to match
+the comment delimiter, because it may "give up" some whitespace if
+the remainder of the pattern can be made to match that way. The correct
+answer is either one of these:
+
+ (?>#[ \t]*)
+ #[ \t]*(?![ \t])
+
+For example, to grab non-empty comments into $1, one should use either
+one of these:
+
+ / (?> \# [ \t]* ) ( .+ ) /x;
+ / \# [ \t]* ( [^ \t] .* ) /x;
+
+Which one you pick depends on which of these expressions better reflects
+the above specification of comments.
+
=item C<(?(condition)yes-pattern|no-pattern)>
=item C<(?(condition)yes-pattern)>
+B<WARNING>: This extended regular expression feature is considered
+highly experimental, and may be changed or deleted without notice.
+
Conditional expression. C<(condition)> should be either an integer in
parentheses (which is valid if the corresponding pair of parentheses
-matched), or lookahead/lookbehind/evaluate zero-width assertion.
+matched), or look-ahead/look-behind/evaluate zero-width assertion.
-Say,
+For example:
m{ ( \( )?
[^()]+
@@ -484,45 +711,20 @@ Say,
matches a chunk of non-parentheses, possibly included in parentheses
themselves.
-=item C<(?imsx-imsx)>
-
-One or more embedded pattern-match modifiers. This is particularly
-useful for patterns that are specified in a table somewhere, some of
-which want to be case sensitive, and some of which don't. The case
-insensitive ones need to include merely C<(?i)> at the front of the
-pattern. For example:
-
- $pattern = "foobar";
- if ( /$pattern/i ) { }
-
- # more flexible:
-
- $pattern = "(?i)foobar";
- if ( /$pattern/ ) { }
-
-Letters after C<-> switch modifiers off.
-
-These modifiers are localized inside an enclosing group (if any). Say,
-
- ( (?i) blah ) \s+ \1
-
-(assuming C<x> modifier, and no C<i> modifier outside of this group)
-will match a repeated (I<including the case>!) word C<blah> in any
-case.
-
=back
-A question mark was chosen for this and for the new minimal-matching
-construct because 1) question mark is pretty rare in older regular
-expressions, and 2) whenever you see one, you should stop and "question"
-exactly what is going on. That's psychology...
-
=head2 Backtracking
+NOTE: This section presents an abstract approximation of regular
+expression behavior. For a more rigorous (and complicated) view of
+the rules involved in selecting a match among possible alternatives,
+see L<Combining pieces together>.
+
A fundamental feature of regular expression matching involves the
notion called I<backtracking>, which is currently used (when needed)
by all regular expression quantifiers, namely C<*>, C<*?>, C<+>,
-C<+?>, C<{n,m}>, and C<{n,m}?>.
+C<+?>, C<{n,m}>, and C<{n,m}?>. Backtracking is often optimized
+internally, but the general principle outlined here is valid.
For a regular expression to match, the I<entire> regular expression must
match, not just part of it. So if the beginning of a pattern containing a
@@ -561,7 +763,7 @@ Which perhaps unexpectedly yields:
got <d is under the bar in the >
That's because C<.*> was greedy, so you get everything between the
-I<first> "foo" and the I<last> "bar". In this case, it's more effective
+I<first> "foo" and the I<last> "bar". Here it's more effective
to use minimal matching to make sure you get the text between a "foo"
and the first "bar" thereafter.
@@ -624,7 +826,7 @@ definition might succeed against a particular string. And if there are
multiple ways it might succeed, you need to understand backtracking to
know which variety of success you will achieve.
-When using lookahead assertions and negations, this can all get even
+When using look-ahead assertions and negations, this can all get even
tricker. Imagine you'd like to find a sequence of non-digits not
followed by "123". You might try to write that as
@@ -660,8 +862,9 @@ that you've asked "Is it true that at the start of $x, following 0 or more
non-digits, you have something that's not 123?" If the pattern matcher had
let C<\D*> expand to "ABC", this would have caused the whole pattern to
fail.
+
The search engine will initially match C<\D*> with "ABC". Then it will
-try to match C<(?!123> with "123", which of course fails. But because
+try to match C<(?!123> with "123", which fails. But because
a quantifier (C<\D*>) has been used in the regular expression, the
search engine can backtrack and retry the match differently
in the hope of matching the complete regular expression.
@@ -669,13 +872,13 @@ in the hope of matching the complete regular expression.
The pattern really, I<really> wants to succeed, so it uses the
standard pattern back-off-and-retry and lets C<\D*> expand to just "AB" this
time. Now there's indeed something following "AB" that is not
-"123". It's in fact "C123", which suffices.
+"123". It's "C123", which suffices.
-We can deal with this by using both an assertion and a negation. We'll
-say that the first part in $1 must be followed by a digit, and in fact, it
-must also be followed by something that's not "123". Remember that the
-lookaheads are zero-width expressions--they only look, but don't consume
-any of the string in their match. So rewriting this way produces what
+We can deal with this by using both an assertion and a negation.
+We'll say that the first part in $1 must be followed both by a digit
+and by something that's not "123". Remember that the look-aheads
+are zero-width expressions--they only look, but don't consume any
+of the string in their match. So rewriting this way produces what
you'd expect; that is, case 5 will fail, but case 6 succeeds:
print "5: got $1\n" if $x =~ /^(\D*)(?=\d)(?!123)/ ;
@@ -684,7 +887,7 @@ you'd expect; that is, case 5 will fail, but case 6 succeeds:
6: got ABC
In other words, the two zero-width assertions next to each other work as though
-they're ANDed together, just as you'd use any builtin assertions: C</^$/>
+they're ANDed together, just as you'd use any built-in assertions: C</^$/>
matches only if you're at the beginning of the line AND the end of the
line simultaneously. The deeper underlying truth is that juxtaposition in
regular expressions always means AND, except when you write an explicit OR
@@ -692,23 +895,25 @@ using the vertical bar. C</ab/> means match "a" AND (then) match "b",
although the attempted matches are made at different positions because "a"
is not a zero-width assertion, but a one-width assertion.
-One warning: particularly complicated regular expressions can take
-exponential time to solve due to the immense number of possible ways they
-can use backtracking to try match. For example this will take a very long
-time to run
+B<WARNING>: particularly complicated regular expressions can take
+exponential time to solve because of the immense number of possible
+ways they can use backtracking to try match. For example, without
+internal optimizations done by the regular expression engine, this will
+take a painfully long time to run:
- /((a{0,5}){0,5}){0,5}/
+ 'aaaaaaaaaaaa' =~ /((a{0,5}){0,5}){0,5}[c]/
-And if you used C<*>'s instead of limiting it to 0 through 5 matches, then
-it would take literally forever--or until you ran out of stack space.
+And if you used C<*>'s instead of limiting it to 0 through 5 matches,
+then it would take forever--or until you ran out of stack space.
-A powerful tool for optimizing such beasts is "independent" groups,
-which do not backtrace (see L<C<(?E<gt>pattern)>>). Note also that
-zero-length lookahead/lookbehind assertions will not backtrace to make
-the tail match, since they are in "logical" context: only the fact
-whether they match or not is considered relevant. For an example
-where side-effects of a lookahead I<might> have influenced the
-following match, see L<C<(?E<gt>pattern)>>.
+A powerful tool for optimizing such beasts is what is known as an
+"independent group",
+which does not backtrack (see L<C<< (?>pattern) >>>). Note also that
+zero-length look-ahead/look-behind assertions will not backtrack to make
+the tail match, since they are in "logical" context: only
+whether they match is considered relevant. For an example
+where side-effects of look-ahead I<might> have influenced the
+following match, see L<C<< (?>pattern) >>>.
=head2 Version 8 Regular Expressions
@@ -726,13 +931,18 @@ would match "blurfl" in the target string.
You can specify a character class, by enclosing a list of characters
in C<[]>, which will match any one character from the list. If the
first character after the "[" is "^", the class matches any character not
-in the list. Within a list, the "-" character is used to specify a
+in the list. Within a list, the "-" character specifies a
range, so that C<a-z> represents all characters between "a" and "z",
-inclusive. If you want "-" itself to be a member of a class, put it
-at the start or end of the list, or escape it with a backslash. (The
+inclusive. If you want either "-" or "]" itself to be a member of a
+class, put it at the start of the list (possibly after a "^"), or
+escape it with a backslash. "-" is also taken literally when it is
+at the end of the list, just before the closing "]". (The
following all specify the same class of three characters: C<[-az]>,
C<[az-]>, and C<[a\-z]>. All are different from C<[a-z]>, which
specifies a class containing twenty-six characters.)
+Also, if you try to use the character classes C<\w>, C<\W>, C<\s>,
+C<\S>, C<\d>, or C<\D> as endpoints of a range, that's not a range,
+the "-" is understood literally.
Note also that the whole range idea is rather unportable between
character sets--and even within character sets they may cause results
@@ -756,8 +966,8 @@ or "foe" in the target string (as would C<f(e|i|o)e>). The
first alternative includes everything from the last pattern delimiter
("(", "[", or the beginning of the pattern) up to the first "|", and
the last alternative contains everything from the last "|" to the next
-pattern delimiter. For this reason, it's common practice to include
-alternatives in parentheses, to minimize confusion about where they
+pattern delimiter. That's why it's common practice to include
+alternatives in parentheses: to minimize confusion about where they
start and end.
Alternatives are tried from left to right, so the first
@@ -771,18 +981,18 @@ important when you are capturing matched text using parentheses.)
Also remember that "|" is interpreted as a literal within square brackets,
so if you write C<[fee|fie|foe]> you're really only matching C<[feio|]>.
-Within a pattern, you may designate subpatterns for later reference by
-enclosing them in parentheses, and you may refer back to the I<n>th
-subpattern later in the pattern using the metacharacter \I<n>.
-Subpatterns are numbered based on the left to right order of their
-opening parenthesis. A backreference matches whatever
-actually matched the subpattern in the string being examined, not the
-rules for that subpattern. Therefore, C<(0|0x)\d*\s\1\d*> will
-match "0x1234 0x4321", but not "0x1234 01234", because subpattern 1
-actually matched "0x", even though the rule C<0|0x> could
-potentially match the leading 0 in the second number.
+Within a pattern, you may designate subpatterns for later reference
+by enclosing them in parentheses, and you may refer back to the
+I<n>th subpattern later in the pattern using the metacharacter
+\I<n>. Subpatterns are numbered based on the left to right order
+of their opening parenthesis. A backreference matches whatever
+actually matched the subpattern in the string being examined, not
+the rules for that subpattern. Therefore, C<(0|0x)\d*\s\1\d*> will
+match "0x1234 0x4321", but not "0x1234 01234", because subpattern
+1 matched "0x", even though the rule C<0|0x> could potentially match
+the leading 0 in the second number.
-=head2 WARNING on \1 vs $1
+=head2 Warning on \1 vs $1
Some people get too used to writing things like:
@@ -803,13 +1013,13 @@ Or if you try to do
s/(\d+)/\1000/;
You can't disambiguate that by saying C<\{1}000>, whereas you can fix it with
-C<${1}000>. Basically, the operation of interpolation should not be confused
+C<${1}000>. The operation of interpolation should not be confused
with the operation of matching a backreference. Certainly they mean two
different things on the I<left> side of the C<s///>.
=head2 Repeated patterns matching zero-length substring
-WARNING: Difficult material (and prose) ahead. This section needs a rewrite.
+B<WARNING>: Difficult material (and prose) ahead. This section needs a rewrite.
Regular expressions provide a terse and powerful programming language. As
with most other power tools, power comes together with the ability
@@ -822,7 +1032,7 @@ loops using regular expressions, with something as innocuous as:
The C<o?> can match at the beginning of C<'foo'>, and since the position
in the string is not moved by the match, C<o?> would match again and again
-due to the C<*> modifier. Another common way to create a similar cycle
+because of the C<*> modifier. Another common way to create a similar cycle
is with the looping modifier C<//g>:
@matches = ( 'foo' =~ m{ o? }xg );
@@ -834,19 +1044,20 @@ or
or the loop implied by split().
However, long experience has shown that many programming tasks may
-be significantly simplified by using repeated subexpressions which
-may match zero-length substrings, with a simple example being:
+be significantly simplified by using repeated subexpressions that
+may match zero-length substrings. Here's a simple example being:
@chars = split //, $string; # // is not magic in split
($whitewashed = $string) =~ s/()/ /g; # parens avoid magic s// /
-Thus Perl allows the C</()/> construct, which I<forcefully breaks
+Thus Perl allows such constructs, by I<forcefully breaking
the infinite loop>. The rules for this are different for lower-level
loops given by the greedy modifiers C<*+{}>, and for higher-level
ones like the C</g> modifier or split() operator.
-The lower-level loops are I<interrupted> when it is detected that a
-repeated expression did match a zero-length substring, thus
+The lower-level loops are I<interrupted> (that is, the loop is
+broken) when Perl detects that a repeated expression matched a
+zero-length substring. Thus
m{ (?: NON_ZERO_LENGTH | ZERO_LENGTH )* }x;
@@ -864,7 +1075,7 @@ This prohibition interacts with backtracking (see L<"Backtracking">),
and so the I<second best> match is chosen if the I<best> match is of
zero length.
-Say,
+For example:
$_ = 'bar';
s/\w??/<$&>/g;
@@ -877,8 +1088,111 @@ alternate with one-character-long matches.
Similarly, for repeated C<m/()/g> the second-best match is the match at the
position one notch further in the string.
-The additional state of being I<matched with zero-length> is associated to
+The additional state of being I<matched with zero-length> is associated with
the matched string, and is reset by each assignment to pos().
+Zero-length matches at the end of the previous match are ignored
+during C<split>.
+
+=head2 Combining pieces together
+
+Each of the elementary pieces of regular expressions which were described
+before (such as C<ab> or C<\Z>) could match at most one substring
+at the given position of the input string. However, in a typical regular
+expression these elementary pieces are combined into more complicated
+patterns using combining operators C<ST>, C<S|T>, C<S*> etc
+(in these examples C<S> and C<T> are regular subexpressions).
+
+Such combinations can include alternatives, leading to a problem of choice:
+if we match a regular expression C<a|ab> against C<"abc">, will it match
+substring C<"a"> or C<"ab">? One way to describe which substring is
+actually matched is the concept of backtracking (see L<"Backtracking">).
+However, this description is too low-level and makes you think
+in terms of a particular implementation.
+
+Another description starts with notions of "better"/"worse". All the
+substrings which may be matched by the given regular expression can be
+sorted from the "best" match to the "worst" match, and it is the "best"
+match which is chosen. This substitutes the question of "what is chosen?"
+by the question of "which matches are better, and which are worse?".
+
+Again, for elementary pieces there is no such question, since at most
+one match at a given position is possible. This section describes the
+notion of better/worse for combining operators. In the description
+below C<S> and C<T> are regular subexpressions.
+
+=over
+
+=item C<ST>
+
+Consider two possible matches, C<AB> and C<A'B'>, C<A> and C<A'> are
+substrings which can be matched by C<S>, C<B> and C<B'> are substrings
+which can be matched by C<T>.
+
+If C<A> is better match for C<S> than C<A'>, C<AB> is a better
+match than C<A'B'>.
+
+If C<A> and C<A'> coincide: C<AB> is a better match than C<AB'> if
+C<B> is better match for C<T> than C<B'>.
+
+=item C<S|T>
+
+When C<S> can match, it is a better match than when only C<T> can match.
+
+Ordering of two matches for C<S> is the same as for C<S>. Similar for
+two matches for C<T>.
+
+=item C<S{REPEAT_COUNT}>
+
+Matches as C<SSS...S> (repeated as many times as necessary).
+
+=item C<S{min,max}>
+
+Matches as C<S{max}|S{max-1}|...|S{min+1}|S{min}>.
+
+=item C<S{min,max}?>
+
+Matches as C<S{min}|S{min+1}|...|S{max-1}|S{max}>.
+
+=item C<S?>, C<S*>, C<S+>
+
+Same as C<S{0,1}>, C<S{0,BIG_NUMBER}>, C<S{1,BIG_NUMBER}> respectively.
+
+=item C<S??>, C<S*?>, C<S+?>
+
+Same as C<S{0,1}?>, C<S{0,BIG_NUMBER}?>, C<S{1,BIG_NUMBER}?> respectively.
+
+=item C<< (?>S) >>
+
+Matches the best match for C<S> and only that.
+
+=item C<(?=S)>, C<(?<=S)>
+
+Only the best match for C<S> is considered. (This is important only if
+C<S> has capturing parentheses, and backreferences are used somewhere
+else in the whole regular expression.)
+
+=item C<(?!S)>, C<(?<!S)>
+
+For this grouping operator there is no need to describe the ordering, since
+only whether or not C<S> can match is important.
+
+=item C<(??{ EXPR })>
+
+The ordering is the same as for the regular expression which is
+the result of EXPR.
+
+=item C<(?(condition)yes-pattern|no-pattern)>
+
+Recall that which of C<yes-pattern> or C<no-pattern> actually matches is
+already determined. The ordering of the matches is the same as for the
+chosen subexpression.
+
+=back
+
+The above recipes describe the ordering of matches I<at a given position>.
+One more rule is needed to understand how a match is determined for the
+whole regular expression: a match at an earlier position is always better
+than a match at a later position.
=head2 Creating custom RE engines
@@ -927,14 +1241,26 @@ part of this regular expression needs to be converted explicitly
$re = customre::convert $re;
/\Y|$re\Y|/;
-=head2 SEE ALSO
+=head1 BUGS
+
+This document varies from difficult to understand to completely
+and utterly opaque. The wandering prose riddled with jargon is
+hard to fathom in several places.
+
+This document needs a rewrite that separates the tutorial content
+from the reference content.
+
+=head1 SEE ALSO
L<perlop/"Regexp Quote-Like Operators">.
L<perlop/"Gory details of parsing quoted constructs">.
+L<perlfaq6>.
+
L<perlfunc/pos>.
L<perllocale>.
-I<Mastering Regular Expressions> (see L<perlbook>) by Jeffrey Friedl.
+I<Mastering Regular Expressions> by Jeffrey Friedl, published
+by O'Reilly and Associates.
diff --git a/contrib/perl5/pod/perlref.pod b/contrib/perl5/pod/perlref.pod
index 596ff72..2727e95 100644
--- a/contrib/perl5/pod/perlref.pod
+++ b/contrib/perl5/pod/perlref.pod
@@ -21,7 +21,7 @@ hashes of arrays, arrays of hashes of functions, and so on.
Hard references are smart--they keep track of reference counts for you,
automatically freeing the thing referred to when its reference count goes
-to zero. (Note: the reference counts for values in self-referential or
+to zero. (Reference counts for values in self-referential or
cyclic data structures may not go to zero without a little help; see
L<perlobj/"Two-Phased Garbage Collection"> for a detailed explanation.)
If that thing happens to be an object, the object is destructed. See
@@ -31,7 +31,7 @@ have been officially "blessed" into a class package.)
Symbolic references are names of variables or other objects, just as a
symbolic link in a Unix filesystem contains merely the name of a file.
-The C<*glob> notation is a kind of symbolic reference. (Symbolic
+The C<*glob> notation is something of a of symbolic reference. (Symbolic
references are sometimes called "soft references", but please don't call
them that; references are confusing enough without useless synonyms.)
@@ -56,8 +56,8 @@ References can be created in several ways.
=item 1.
By using the backslash operator on a variable, subroutine, or value.
-(This works much like the & (address-of) operator in C.) Note
-that this typically creates I<ANOTHER> reference to a variable, because
+(This works much like the & (address-of) operator in C.)
+This typically creates I<another> reference to a variable, because
there's already a reference to the variable in the symbol table. But
the symbol table reference might go away, and you'll still have the
reference that the backslash returned. Here are some examples:
@@ -84,10 +84,10 @@ brackets:
Here we've created a reference to an anonymous array of three elements
whose final element is itself a reference to another anonymous array of three
elements. (The multidimensional syntax described later can be used to
-access this. For example, after the above, C<$arrayref-E<gt>[2][1]> would have
+access this. For example, after the above, C<< $arrayref->[2][1] >> would have
the value "b".)
-Note that taking a reference to an enumerated list is not the same
+Taking a reference to an enumerated list is not the same
as using square brackets--instead it's the same as creating
a list of references!
@@ -136,7 +136,7 @@ On the other hand, if you want the other meaning, you can do this:
sub showem { {; @_ } } # ok
sub showem { { return @_ } } # ok
-Note how the leading C<+{> and C<{;> always serve to disambiguate
+The leading C<+{> and C<{;> always serve to disambiguate
the expression to mean either the HASH reference, or the BLOCK.
=item 4.
@@ -146,18 +146,18 @@ C<sub> without a subname:
$coderef = sub { print "Boink!\n" };
-Note the presence of the semicolon. Except for the fact that the code
-inside isn't executed immediately, a C<sub {}> is not so much a
+Note the semicolon. Except for the code
+inside not being immediately executed, a C<sub {}> is not so much a
declaration as it is an operator, like C<do{}> or C<eval{}>. (However, no
matter how many times you execute that particular line (unless you're in an
-C<eval("...")>), C<$coderef> will still have a reference to the I<SAME>
+C<eval("...")>), $coderef will still have a reference to the I<same>
anonymous subroutine.)
Anonymous subroutines act as closures with respect to my() variables,
-that is, variables visible lexically within the current scope. Closure
+that is, variables lexically visible within the current scope. Closure
is a notion out of the Lisp world that says if you define an anonymous
function in a particular lexical context, it pretends to run in that
-context even when it's called outside of the context.
+context even when it's called outside the context.
In human terms, it's a funny way of passing arguments to a subroutine when
you define it as well as when you call it. It's useful for setting up
@@ -165,11 +165,9 @@ little bits of code to run later, such as callbacks. You can even
do object-oriented stuff with it, though Perl already provides a different
mechanism to do that--see L<perlobj>.
-You can also think of closure as a way to write a subroutine template without
-using eval. (In fact, in version 5.000, eval was the I<only> way to get
-closures. You may wish to use "require 5.001" if you use closures.)
-
-Here's a small example of how closures works:
+You might also think of closure as a way to write a subroutine
+template without using eval(). Here's a small example of how
+closures work:
sub newprint {
my $x = shift;
@@ -188,10 +186,10 @@ This prints
Howdy, world!
Greetings, earthlings!
-Note particularly that $x continues to refer to the value passed into
-newprint() I<despite> the fact that the "my $x" has seemingly gone out of
-scope by the time the anonymous subroutine runs. That's what closure
-is all about.
+Note particularly that $x continues to refer to the value passed
+into newprint() I<despite> "my $x" having gone out of scope by the
+time the anonymous subroutine runs. That's what a closure is all
+about.
This applies only to lexical variables, by the way. Dynamic variables
continue to work as they have always worked. Closure is not something
@@ -200,7 +198,7 @@ that most Perl programmers need trouble themselves about to begin with.
=item 5.
References are often returned by special subroutines called constructors.
-Perl objects are just references to a special kind of object that happens to know
+Perl objects are just references to a special type of object that happens to know
which package it's associated with. Constructors are just special
subroutines that know how to create that association. They do so by
starting with an ordinary reference, and it remains an ordinary reference
@@ -241,35 +239,37 @@ known as foo).
$ioref = *STDIN{IO};
$globref = *foo{GLOB};
-All of these are self-explanatory except for *foo{IO}. It returns the
-IO handle, used for file handles (L<perlfunc/open>), sockets
-(L<perlfunc/socket> and L<perlfunc/socketpair>), and directory handles
-(L<perlfunc/opendir>). For compatibility with previous versions of
-Perl, *foo{FILEHANDLE} is a synonym for *foo{IO}.
+All of these are self-explanatory except for C<*foo{IO}>. It returns
+the IO handle, used for file handles (L<perlfunc/open>), sockets
+(L<perlfunc/socket> and L<perlfunc/socketpair>), and directory
+handles (L<perlfunc/opendir>). For compatibility with previous
+versions of Perl, C<*foo{FILEHANDLE}> is a synonym for C<*foo{IO}>.
-*foo{THING} returns undef if that particular THING hasn't been used yet,
-except in the case of scalars. *foo{SCALAR} returns a reference to an
+C<*foo{THING}> returns undef if that particular THING hasn't been used yet,
+except in the case of scalars. C<*foo{SCALAR}> returns a reference to an
anonymous scalar if $foo hasn't been used yet. This might change in a
future release.
-*foo{IO} is an alternative to the \*HANDLE mechanism given in
+C<*foo{IO}> is an alternative to the C<*HANDLE> mechanism given in
L<perldata/"Typeglobs and Filehandles"> for passing filehandles
into or out of subroutines, or storing into larger data structures.
Its disadvantage is that it won't create a new filehandle for you.
-Its advantage is that you have no risk of clobbering more than you want
-to with a typeglob assignment, although if you assign to a scalar instead
-of a typeglob, you're ok.
+Its advantage is that you have less risk of clobbering more than
+you want to with a typeglob assignment. (It still conflates file
+and directory handles, though.) However, if you assign the incoming
+value to a scalar instead of a typeglob as we do in the examples
+below, there's no risk of that happening.
- splutter(*STDOUT);
- splutter(*STDOUT{IO});
+ splutter(*STDOUT); # pass the whole glob
+ splutter(*STDOUT{IO}); # pass both file and dir handles
sub splutter {
my $fh = shift;
print $fh "her um well a hmmm\n";
}
- $rec = get_rec(*STDIN);
- $rec = get_rec(*STDIN{IO});
+ $rec = get_rec(*STDIN); # pass the whole glob
+ $rec = get_rec(*STDIN{IO}); # pass both file and dir handles
sub get_rec {
my $fh = shift;
@@ -299,9 +299,9 @@ a simple scalar variable containing a reference of the correct type:
&$coderef(1,2,3);
print $globref "output\n";
-It's important to understand that we are specifically I<NOT> dereferencing
+It's important to understand that we are specifically I<not> dereferencing
C<$arrayref[0]> or C<$hashref{"KEY"}> there. The dereference of the
-scalar variable happens I<BEFORE> it does any key lookups. Anything more
+scalar variable happens I<before> it does any key lookups. Anything more
complicated than a simple scalar variable must use methods 2 or 3 below.
However, a "simple scalar" includes an identifier that itself uses method
1 recursively. Therefore, the following prints "howdy".
@@ -334,7 +334,7 @@ people often make the mistake of viewing the dereferencing symbols as
proper operators, and wonder about their precedence. If they were,
though, you could use parentheses instead of braces. That's not the case.
Consider the difference below; case 0 is a short-hand version of case 1,
-I<NOT> case 2:
+I<not> case 2:
$$hashref{"KEY"} = "VALUE"; # CASE 0
${$hashref}{"KEY"} = "VALUE"; # CASE 1
@@ -356,8 +356,8 @@ syntactic sugar, the examples for method 2 may be written:
$coderef->(1,2,3); # Subroutine call
The left side of the arrow can be any expression returning a reference,
-including a previous dereference. Note that C<$array[$x]> is I<NOT> the
-same thing as C<$array-E<gt>[$x]> here:
+including a previous dereference. Note that C<$array[$x]> is I<not> the
+same thing as C<< $array->[$x] >> here:
$array[$x]->{"foo"}->[0] = "January";
@@ -365,11 +365,11 @@ This is one of the cases we mentioned earlier in which references could
spring into existence when in an lvalue context. Before this
statement, C<$array[$x]> may have been undefined. If so, it's
automatically defined with a hash reference so that we can look up
-C<{"foo"}> in it. Likewise C<$array[$x]-E<gt>{"foo"}> will automatically get
+C<{"foo"}> in it. Likewise C<< $array[$x]->{"foo"} >> will automatically get
defined with an array reference so that we can look up C<[0]> in it.
This process is called I<autovivification>.
-One more thing here. The arrow is optional I<BETWEEN> brackets
+One more thing here. The arrow is optional I<between> brackets
subscripts, so you can shrink the above down to
$array[$x]{"foo"}[0] = "January";
@@ -394,14 +394,27 @@ civility though.
=back
-The ref() operator may be used to determine what type of thing the
-reference is pointing to. See L<perlfunc>.
+Using a string or number as a reference produces a symbolic reference,
+as explained above. Using a reference as a number produces an
+integer representing its storage location in memory. The only
+useful thing to be done with this is to compare two references
+numerically to see whether they refer to the same location.
+
+ if ($ref1 == $ref2) { # cheap numeric compare of references
+ print "refs 1 and 2 refer to the same thing\n";
+ }
+
+Using a reference as a string produces both its referent's type,
+including any package blessing as described in L<perlobj>, as well
+as the numeric address expressed in hex. The ref() operator returns
+just the type of thing the reference is pointing to, without the
+address. See L<perlfunc/ref> for details and examples of its use.
The bless() operator may be used to associate the object a reference
points to with a package functioning as an object class. See L<perlobj>.
A typeglob may be dereferenced the same way a reference can, because
-the dereference syntax always indicates the kind of reference desired.
+the dereference syntax always indicates the type of reference desired.
So C<${*foo}> and C<${\$foo}> both indicate the same scalar variable.
Here's a trick for interpolating a subroutine call into a string:
@@ -421,9 +434,9 @@ chicanery is also useful for arbitrary expressions:
We said that references spring into existence as necessary if they are
undefined, but we didn't say what happens if a value used as a
-reference is already defined, but I<ISN'T> a hard reference. If you
-use it as a reference in this case, it'll be treated as a symbolic
-reference. That is, the value of the scalar is taken to be the I<NAME>
+reference is already defined, but I<isn't> a hard reference. If you
+use it as a reference, it'll be treated as a symbolic
+reference. That is, the value of the scalar is taken to be the I<name>
of a variable, rather than a direct link to a (possibly) anonymous
value.
@@ -439,7 +452,7 @@ People frequently expect it to work like this. So it does.
$pack = "THAT";
${"${pack}::$name"} = 5; # Sets $THAT::foo without eval
-This is very powerful, and slightly dangerous, in that it's possible
+This is powerful, and slightly dangerous, in that it's possible
to intend (with the utmost sincerity) to use a hard reference, and
accidentally use a symbolic reference instead. To protect against
that, you can say
@@ -474,7 +487,7 @@ always have within a string. That is,
$push = "pop on ";
print "${push}over";
-has always meant to print "pop on over", despite the fact that push is
+has always meant to print "pop on over", even though push is
a reserved word. This has been generalized to work the same outside
of quotes, so that
@@ -485,7 +498,7 @@ and even
print ${ push } . "over";
will have the same effect. (This would have been a syntax error in
-Perl 5.000, though Perl 4 allowed it in the spaceless form.) Note that this
+Perl 5.000, though Perl 4 allowed it in the spaceless form.) This
construct is I<not> considered to be a symbolic reference when you're
using strict refs:
@@ -515,16 +528,17 @@ makes it more than a bareword:
$array{ +shift }
$array{ shift @_ }
-The B<-w> switch will warn you if it interprets a reserved word as a string.
+The C<use warnings> pragma or the B<-w> switch will warn you if it
+interprets a reserved word as a string.
But it will no longer warn you about using lowercase words, because the
string is effectively quoted.
=head2 Pseudo-hashes: Using an array as a hash
-WARNING: This section describes an experimental feature. Details may
+B<WARNING>: This section describes an experimental feature. Details may
change without notice in future versions.
-Beginning with release 5.005 of Perl you can use an array reference
+Beginning with release 5.005 of Perl, you may use an array reference
in some contexts that would normally require a hash reference. This
allows you to access array elements using symbolic names, as if they
were fields in a structure.
@@ -533,23 +547,58 @@ For this to work, the array must contain extra information. The first
element of the array has to be a hash reference that maps field names
to array indices. Here is an example:
- $struct = [{foo => 1, bar => 2}, "FOO", "BAR"];
+ $struct = [{foo => 1, bar => 2}, "FOO", "BAR"];
- $struct->{foo}; # same as $struct->[1], i.e. "FOO"
- $struct->{bar}; # same as $struct->[2], i.e. "BAR"
+ $struct->{foo}; # same as $struct->[1], i.e. "FOO"
+ $struct->{bar}; # same as $struct->[2], i.e. "BAR"
- keys %$struct; # will return ("foo", "bar") in some order
- values %$struct; # will return ("FOO", "BAR") in same some order
+ keys %$struct; # will return ("foo", "bar") in some order
+ values %$struct; # will return ("FOO", "BAR") in same some order
- while (my($k,$v) = each %$struct) {
+ while (my($k,$v) = each %$struct) {
print "$k => $v\n";
- }
+ }
+
+Perl will raise an exception if you try to access nonexistent fields.
+To avoid inconsistencies, always use the fields::phash() function
+provided by the C<fields> pragma.
+
+ use fields;
+ $pseudohash = fields::phash(foo => "FOO", bar => "BAR");
+
+For better performance, Perl can also do the translation from field
+names to array indices at compile time for typed object references.
+See L<fields>.
+
+There are two ways to check for the existence of a key in a
+pseudo-hash. The first is to use exists(). This checks to see if the
+given field has ever been set. It acts this way to match the behavior
+of a regular hash. For instance:
+
+ use fields;
+ $phash = fields::phash([qw(foo bar pants)], ['FOO']);
+ $phash->{pants} = undef;
+
+ print exists $phash->{foo}; # true, 'foo' was set in the declaration
+ print exists $phash->{bar}; # false, 'bar' has not been used.
+ print exists $phash->{pants}; # true, your 'pants' have been touched
+
+The second is to use exists() on the hash reference sitting in the
+first array element. This checks to see if the given key is a valid
+field in the pseudo-hash.
+
+ print exists $phash->[0]{bar}; # true, 'bar' is a valid field
+ print exists $phash->[0]{shoes};# false, 'shoes' can't be used
-Perl will raise an exception if you try to delete keys from a pseudo-hash
-or try to access nonexistent fields. For better performance, Perl can also
-do the translation from field names to array indices at compile time for
-typed object references. See L<fields>.
+delete() on a pseudo-hash element only deletes the value corresponding
+to the key, not the key itself. To delete the key, you'll have to
+explicitly delete it from the first hash element.
+ print delete $phash->{foo}; # prints $phash->[1], "FOO"
+ print exists $phash->{foo}; # false
+ print exists $phash->[0]{foo}; # true, key still exists
+ print delete $phash->[0]{foo}; # now key is gone
+ print $phash->{foo}; # runtime exception
=head2 Function Templates
@@ -564,7 +613,7 @@ that generated HTML font changes for the various colors:
print "Be ", red("careful"), "with that ", green("light");
-The red() and green() functions would be very similar. To create these,
+The red() and green() functions would be similar. To create these,
we'll assign a closure to a typeglob of the name of the function we're
trying to build.
@@ -598,7 +647,7 @@ above--only works with closures, not general subroutines. In the general
case, then, named subroutines do not nest properly, although anonymous
ones do. If you are accustomed to using nested subroutines in other
programming languages with their own private variables, you'll have to
-work at it a bit in Perl. The intuitive coding of this kind of thing
+work at it a bit in Perl. The intuitive coding of this type of thing
incurs mysterious warnings about ``will not stay shared''. For example,
this won't work:
@@ -646,7 +695,7 @@ The standard Tie::RefHash module provides a convenient workaround to this.
=head1 SEE ALSO
Besides the obvious documents, source code can be instructive.
-Some rather pathological examples of the use of references can be found
+Some pathological examples of the use of references can be found
in the F<t/op/ref.t> regression test in the Perl source directory.
See also L<perldsc> and L<perllol> for how to use references to create
diff --git a/contrib/perl5/pod/perlreftut.pod b/contrib/perl5/pod/perlreftut.pod
index 09bea59..c8593fb 100644
--- a/contrib/perl5/pod/perlreftut.pod
+++ b/contrib/perl5/pod/perlreftut.pod
@@ -184,26 +184,26 @@ Using a hash reference is I<exactly> the same:
B<Use Rule 2>
-C<${$aref}[3]> is too hard to read, so you can write C<$aref-E<gt>[3]>
+C<${$aref}[3]> is too hard to read, so you can write C<< $aref->[3] >>
instead.
C<${$href}{red}> is too hard to read, so you can write
-C<$href-E<gt>{red}> instead.
+C<< $href->{red} >> instead.
Most often, when you have an array or a hash, you want to get or set a
single element from it. C<${$aref}[3]> and C<${$href}{'red'}> have
too much punctuation, and Perl lets you abbreviate.
-If C<$aref> holds a reference to an array, then C<$aref-E<gt>[3]> is
+If C<$aref> holds a reference to an array, then C<< $aref->[3] >> is
the fourth element of the array. Don't confuse this with C<$aref[3]>,
which is the fourth element of a totally different array, one
deceptively named C<@aref>. C<$aref> and C<@aref> are unrelated the
same way that C<$item> and C<@item> are.
-Similarly, C<$href-E<gt>{'red'}> is part of the hash referred to by
+Similarly, C<< $href->{'red'} >> is part of the hash referred to by
the scalar variable C<$href>, perhaps even one with no name.
C<$href{'red'}> is part of the deceptively named C<%href> hash. It's
-easy to forget to leave out the C<-E<gt>>, and if you do, you'll get
+easy to forget to leave out the C<< -> >>, and if you do, you'll get
bizarre results when your program gets array and hash elements out of
totally unexpected hashes and arrays that weren't the ones you wanted
to use.
@@ -228,10 +228,10 @@ another array.
C<$a[1]> is one of these references. It refers to an array, the array
containing C<(4, 5, 6)>, and because it is a reference to an array,
-B<USE RULE 2> says that we can write C<$a[1]-E<gt>[2]> to get the
-third element from that array. C<$a[1]-E<gt>[2]> is the 6.
-Similarly, C<$a[0]-E<gt>[1]> is the 2. What we have here is like a
-two-dimensional array; you can write C<$a[ROW]-E<gt>[COLUMN]> to get
+B<USE RULE 2> says that we can write C<< $a[1]->[2] >> to get the
+third element from that array. C<< $a[1]->[2] >> is the 6.
+Similarly, C<< $a[0]->[1] >> is the 2. What we have here is like a
+two-dimensional array; you can write C<< $a[ROW]->[COLUMN] >> to get
or set the element in any row and any column of the array.
The notation still looks a little cumbersome, so there's one more
@@ -241,8 +241,8 @@ abbreviation:
In between two B<subscripts>, the arrow is optional.
-Instead of C<$a[1]-E<gt>[2]>, we can write C<$a[1][2]>; it means the
-same thing. Instead of C<$a[0]-E<gt>[1]>, we can write C<$a[0][1]>;
+Instead of C<< $a[1]->[2] >>, we can write C<$a[1][2]>; it means the
+same thing. Instead of C<< $a[0]->[1] >>, we can write C<$a[0][1]>;
it means the same thing.
Now it really looks like two-dimensional arrays!
diff --git a/contrib/perl5/pod/perlrun.pod b/contrib/perl5/pod/perlrun.pod
index 7cb9aed..f1e2c9a 100644
--- a/contrib/perl5/pod/perlrun.pod
+++ b/contrib/perl5/pod/perlrun.pod
@@ -4,7 +4,7 @@ perlrun - how to execute the Perl interpreter
=head1 SYNOPSIS
-B<perl> S<[ B<-sTuU> ]>
+B<perl> S<[ B<-CsTuUWX> ]>
S<[ B<-hv> ] [ B<-V>[:I<configvar>] ]>
S<[ B<-cw> ] [ B<-d>[:I<debugger>] ] [ B<-D>[I<number/list>] ]>
S<[ B<-pna> ] [ B<-F>I<pattern> ] [ B<-l>[I<octal>] ] [ B<-0>[I<octal>] ]>
@@ -17,7 +17,11 @@ B<perl> S<[ B<-sTuU> ]>
=head1 DESCRIPTION
-Upon startup, Perl looks for your script in one of the following
+The normal way to run a Perl program is by making it directly
+executable, or else by passing the name of the source file as an
+argument on the command line. (An interactive Perl environment
+is also possible--see L<perldebug> for details on how to do that.)
+Upon startup, Perl looks for your program in one of the following
places:
=over 4
@@ -35,61 +39,71 @@ way. See L<Location of Perl>.)
=item 3.
Passed in implicitly via standard input. This works only if there are
-no filename arguments--to pass arguments to a STDIN script you
-must explicitly specify a "-" for the script name.
+no filename arguments--to pass arguments to a STDIN-read program you
+must explicitly specify a "-" for the program name.
=back
With methods 2 and 3, Perl starts parsing the input file from the
beginning, unless you've specified a B<-x> switch, in which case it
scans for the first line starting with #! and containing the word
-"perl", and starts there instead. This is useful for running a script
+"perl", and starts there instead. This is useful for running a program
embedded in a larger message. (In this case you would indicate the end
-of the script using the C<__END__> token.)
+of the program using the C<__END__> token.)
The #! line is always examined for switches as the line is being
parsed. Thus, if you're on a machine that allows only one argument
with the #! line, or worse, doesn't even recognize the #! line, you
still can get consistent switch behavior regardless of how Perl was
-invoked, even if B<-x> was used to find the beginning of the script.
-
-Because many operating systems silently chop off kernel interpretation of
-the #! line after 32 characters, some switches may be passed in on the
-command line, and some may not; you could even get a "-" without its
-letter, if you're not careful. You probably want to make sure that all
-your switches fall either before or after that 32 character boundary.
-Most switches don't actually care if they're processed redundantly, but
-getting a - instead of a complete switch could cause Perl to try to
-execute standard input instead of your script. And a partial B<-I> switch
+invoked, even if B<-x> was used to find the beginning of the program.
+
+Because historically some operating systems silently chopped off
+kernel interpretation of the #! line after 32 characters, some
+switches may be passed in on the command line, and some may not;
+you could even get a "-" without its letter, if you're not careful.
+You probably want to make sure that all your switches fall either
+before or after that 32-character boundary. Most switches don't
+actually care if they're processed redundantly, but getting a "-"
+instead of a complete switch could cause Perl to try to execute
+standard input instead of your program. And a partial B<-I> switch
could also cause odd results.
-Some switches do care if they are processed twice, for instance combinations
-of B<-l> and B<-0>. Either put all the switches after the 32 character
-boundary (if applicable), or replace the use of B<-0>I<digits> by
-C<BEGIN{ $/ = "\0digits"; }>.
+Some switches do care if they are processed twice, for instance
+combinations of B<-l> and B<-0>. Either put all the switches after
+the 32-character boundary (if applicable), or replace the use of
+B<-0>I<digits> by C<BEGIN{ $/ = "\0digits"; }>.
Parsing of the #! switches starts wherever "perl" is mentioned in the line.
The sequences "-*" and "- " are specifically ignored so that you could,
if you were so inclined, say
#!/bin/sh -- # -*- perl -*- -p
- eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
+ eval 'exec perl -wS $0 ${1+"$@"}'
if $running_under_some_shell;
-to let Perl see the B<-p> switch.
+to let Perl see the B<-p> switch.
+
+A similar trick involves the B<env> program, if you have it.
+
+ #!/usr/bin/env perl
+
+The examples above use a relative path to the perl interpreter,
+getting whatever version is first in the user's path. If you want
+a specific version of Perl, say, perl5.005_57, you should place
+that directly in the #! line's path.
If the #! line does not contain the word "perl", the program named after
the #! is executed instead of the Perl interpreter. This is slightly
bizarre, but it helps people on machines that don't do #!, because they
-can tell a program that their SHELL is /usr/bin/perl, and Perl will then
+can tell a program that their SHELL is F</usr/bin/perl>, and Perl will then
dispatch the program to the correct interpreter for them.
-After locating your script, Perl compiles the entire script to an
+After locating your program, Perl compiles the entire program to an
internal form. If there are any compilation errors, execution of the
-script is not attempted. (This is unlike the typical shell script,
+program is not attempted. (This is unlike the typical shell script,
which might run part-way through before finding a syntax error.)
-If the script is syntactically correct, it is executed. If the script
+If the program is syntactically correct, it is executed. If the program
runs off the end without hitting an exit() or die() operator, an implicit
C<exit(0)> is provided to indicate successful completion.
@@ -105,28 +119,27 @@ Put
extproc perl -S -your_switches
-as the first line in C<*.cmd> file (C<-S> due to a bug in cmd.exe's
+as the first line in C<*.cmd> file (B<-S> due to a bug in cmd.exe's
`extproc' handling).
=item MS-DOS
-Create a batch file to run your script, and codify it in
+Create a batch file to run your program, and codify it in
C<ALTERNATIVE_SHEBANG> (see the F<dosish.h> file in the source
distribution for more information).
=item Win95/NT
-The Win95/NT installation, when using the Activeware port of Perl,
+The Win95/NT installation, when using the ActiveState installer for Perl,
will modify the Registry to associate the F<.pl> extension with the perl
-interpreter. If you install another port of Perl, including the one
-in the Win32 directory of the Perl distribution, then you'll have to
-modify the Registry yourself. Note that this means you can no
-longer tell the difference between an executable Perl program
-and a Perl library file.
+interpreter. If you install Perl by other means (including building from
+the sources), you may have to modify the Registry yourself. Note that
+this means you can no longer tell the difference between an executable
+Perl program and a Perl library file.
=item Macintosh
-Macintosh perl scripts will have the appropriate Creator and
+A Macintosh perl program will have the appropriate Creator and
Type, so that double-clicking them will invoke the perl application.
=item VMS
@@ -136,10 +149,10 @@ Put
$ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' !
$ exit++ + ++$status != 0 and $exit = $status = undef;
-at the top of your script, where C<-mysw> are any command line switches you
-want to pass to Perl. You can now invoke the script directly, by saying
-C<perl script>, or as a DCL procedure, by saying C<@script> (or implicitly
-via F<DCL$PATH> by just using the name of the script).
+at the top of your program, where B<-mysw> are any command line switches you
+want to pass to Perl. You can now invoke the program directly, by saying
+C<perl program>, or as a DCL procedure, by saying C<@program> (or implicitly
+via F<DCL$PATH> by just using the name of the program).
This incantation is a bit much to remember, but Perl will display it for
you if you say C<perl "-V:startperl">.
@@ -150,10 +163,10 @@ Command-interpreters on non-Unix systems have rather different ideas
on quoting than Unix shells. You'll need to learn the special
characters in your command-interpreter (C<*>, C<\> and C<"> are
common) and how to protect whitespace and these characters to run
-one-liners (see C<-e> below).
+one-liners (see B<-e> below).
On some systems, you may have to change single-quotes to double ones,
-which you must I<NOT> do on Unix or Plan9 systems. You might also
+which you must I<not> do on Unix or Plan9 systems. You might also
have to change a single % to a %%.
For example:
@@ -171,13 +184,13 @@ For example:
# VMS
perl -e "print ""Hello world\n"""
-The problem is that none of this is reliable: it depends on the command
-and it is entirely possible neither works. If 4DOS was the command shell, this would
-probably work better:
+The problem is that none of this is reliable: it depends on the
+command and it is entirely possible neither works. If B<4DOS> were
+the command shell, this would probably work better:
perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""
-CMD.EXE in Windows NT slipped a lot of standard Unix functionality in
+B<CMD.EXE> in Windows NT slipped a lot of standard Unix functionality in
when nobody was looking, but just try to find documentation for its
quoting rules.
@@ -191,22 +204,30 @@ There is no general solution to all of this. It's just a mess.
=head2 Location of Perl
It may seem obvious to say, but Perl is useful only when users can
-easily find it. When possible, it's good for both B</usr/bin/perl> and
-B</usr/local/bin/perl> to be symlinks to the actual binary. If that
-can't be done, system administrators are strongly encouraged to put
-(symlinks to) perl and its accompanying utilities, such as perldoc, into
-a directory typically found along a user's PATH, or in another obvious
-and convenient place.
+easily find it. When possible, it's good for both F</usr/bin/perl>
+and F</usr/local/bin/perl> to be symlinks to the actual binary. If
+that can't be done, system administrators are strongly encouraged
+to put (symlinks to) perl and its accompanying utilities into a
+directory typically found along a user's PATH, or in some other
+obvious and convenient place.
+
+In this documentation, C<#!/usr/bin/perl> on the first line of the program
+will stand in for whatever method works on your system. You are
+advised to use a specific path if you care about a specific version.
+
+ #!/usr/local/bin/perl5.00554
-In this documentation, C<#!/usr/bin/perl> on the first line of the script
-will stand in for whatever method works on your system.
+or if you just want to be running at least version, place a statement
+like this at the top of your program:
-=head2 Switches
+ use 5.005_54;
-A single-character switch may be combined with the following switch, if
-any.
+=head2 Command Switches
- #!/usr/bin/perl -spi.bak # same as -s -p -i.bak
+As with all standard commands, a single-character switch may be
+clustered with the following switch, if any.
+
+ #!/usr/bin/perl -spi.orig # same as -s -p -i.orig
Switches include:
@@ -220,7 +241,7 @@ precede or follow the digits. For example, if you have a version of
B<find> which can print filenames terminated by the null character, you
can say this:
- find . -name '*.bak' -print0 | perl -n0e unlink
+ find . -name '*.orig' -print0 | perl -n0e unlink
The special value 00 will cause Perl to slurp files in paragraph mode.
The value 0777 will cause Perl to slurp files whole because there is no
@@ -243,28 +264,37 @@ is equivalent to
An alternate delimiter may be specified using B<-F>.
+=item B<-C>
+
+enables Perl to use the native wide character APIs on the target system.
+The magic variable C<${^WIDE_SYSTEM_CALLS}> reflects the state of
+this switch. See L<perlvar/"${^WIDE_SYSTEM_CALLS}">.
+
+This feature is currently only implemented on the Win32 platform.
+
=item B<-c>
-causes Perl to check the syntax of the script and then exit without
-executing it. Actually, it I<will> execute C<BEGIN>, C<END>, and C<use> blocks,
-because these are considered as occurring outside the execution of
-your program.
+causes Perl to check the syntax of the program and then exit without
+executing it. Actually, it I<will> execute C<BEGIN>, C<CHECK>, and
+C<use> blocks, because these are considered as occurring outside the
+execution of your program. C<INIT> and C<END> blocks, however, will
+be skipped.
=item B<-d>
-runs the script under the Perl debugger. See L<perldebug>.
+runs the program under the Perl debugger. See L<perldebug>.
=item B<-d:>I<foo>
-runs the script under the control of a debugging or tracing module
-installed as Devel::foo. E.g., B<-d:DProf> executes the script using the
-Devel::DProf profiler. See L<perldebug>.
+runs the program under the control of a debugging, profiling, or
+tracing module installed as Devel::foo. E.g., B<-d:DProf> executes
+the program using the Devel::DProf profiler. See L<perldebug>.
=item B<-D>I<letters>
=item B<-D>I<number>
-sets debugging flags. To watch how it executes your script, use
+sets debugging flags. To watch how it executes your program, use
B<-Dtls>. (This works only if debugging is compiled into your
Perl.) Another nice value is B<-Dx>, which lists your compiled
syntax tree. And B<-Dr> displays compiled regular expressions. As an
@@ -283,24 +313,35 @@ equivalent to B<-Dtls>):
512 r Regular expression parsing and execution
1024 x Syntax tree dump
2048 u Tainting checks
- 4096 L Memory leaks (needs C<-DLEAKTEST> when compiling Perl)
+ 4096 L Memory leaks (needs -DLEAKTEST when compiling Perl)
8192 H Hash dump -- usurps values()
16384 X Scratchpad allocation
32768 D Cleaning up
65536 S Thread synchronization
-All these flags require C<-DDEBUGGING> when you compile the Perl
-executable. This flag is automatically set if you include C<-g>
+All these flags require B<-DDEBUGGING> when you compile the Perl
+executable. See the F<INSTALL> file in the Perl source distribution
+for how to do this. This flag is automatically set if you include B<-g>
option when C<Configure> asks you about optimizer/debugger flags.
+If you're just trying to get a print out of each line of Perl code
+as it executes, the way that C<sh -x> provides for shell scripts,
+you can't use Perl's B<-D> switch. Instead do this
+
+ # Bourne shell syntax
+ $ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
+
+ # csh syntax
+ % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)
+
+See L<perldebug> for details and variations.
+
=item B<-e> I<commandline>
-may be used to enter one line of script.
-If B<-e> is given, Perl
-will not look for a script filename in the argument list.
-Multiple B<-e> commands may
-be given to build up a multi-line script.
-Make sure to use semicolons where you would in a normal program.
+may be used to enter one line of program. If B<-e> is given, Perl
+will not look for a filename in the argument list. Multiple B<-e>
+commands may be given to build up a multi-line script. Make sure
+to use semicolons where you would in a normal program.
=item B<-F>I<pattern>
@@ -324,47 +365,46 @@ rules:
If no extension is supplied, no backup is made and the current file is
overwritten.
-If the extension doesn't contain a C<*> then it is appended to the end
-of the current filename as a suffix.
-
-If the extension does contain one or more C<*> characters, then each C<*>
-is replaced with the current filename. In perl terms you could think of
-this as:
+If the extension doesn't contain a C<*>, then it is appended to the
+end of the current filename as a suffix. If the extension does
+contain one or more C<*> characters, then each C<*> is replaced
+with the current filename. In Perl terms, you could think of this
+as:
($backup = $extension) =~ s/\*/$file_name/g;
This allows you to add a prefix to the backup file, instead of (or in
addition to) a suffix:
- $ perl -pi'bak_*' -e 's/bar/baz/' fileA # backup to 'bak_fileA'
+ $ perl -pi 'orig_*' -e 's/bar/baz/' fileA # backup to 'orig_fileA'
Or even to place backup copies of the original files into another
directory (provided the directory already exists):
- $ perl -pi'old/*.bak' -e 's/bar/baz/' fileA # backup to 'old/fileA.bak'
+ $ perl -pi 'old/*.orig' -e 's/bar/baz/' fileA # backup to 'old/fileA.orig'
These sets of one-liners are equivalent:
$ perl -pi -e 's/bar/baz/' fileA # overwrite current file
- $ perl -pi'*' -e 's/bar/baz/' fileA # overwrite current file
+ $ perl -pi '*' -e 's/bar/baz/' fileA # overwrite current file
- $ perl -pi'.bak' -e 's/bar/baz/' fileA # backup to 'fileA.bak'
- $ perl -pi'*.bak' -e 's/bar/baz/' fileA # backup to 'fileA.bak'
+ $ perl -pi '.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'
+ $ perl -pi '*.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'
From the shell, saying
- $ perl -p -i.bak -e "s/foo/bar/; ... "
+ $ perl -p -i.orig -e "s/foo/bar/; ... "
-is the same as using the script:
+is the same as using the program:
- #!/usr/bin/perl -pi.bak
+ #!/usr/bin/perl -pi.orig
s/foo/bar/;
which is equivalent to
#!/usr/bin/perl
- $extension = '.bak';
- while (<>) {
+ $extension = '.orig';
+ LINE: while (<>) {
if ($ARGV ne $oldargv) {
if ($extension !~ /\*/) {
$backup = $ARGV . $extension;
@@ -392,9 +432,9 @@ output filehandle after the loop.
As shown above, Perl creates the backup file whether or not any output
is actually changed. So this is just a fancy way to copy files:
- $ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3...
- or
- $ perl -p -i'.bak' -e 1 file1 file2 file3...
+ $ perl -p -i '/some/file/path/*' -e 1 file1 file2 file3...
+or
+ $ perl -p -i '.orig' -e 1 file1 file2 file3...
You can use C<eof> without parentheses to locate the end of each input
file, in case you want to append to each file, or reset line numbering
@@ -404,15 +444,19 @@ If, for a given file, Perl is unable to create the backup file as
specified in the extension then it will skip that file and continue on
with the next one (if it exists).
-For a discussion of issues surrounding file permissions and C<-i>, see
-L<perlfaq5/Why does Perl let me delete read-only files? Why does -i clobber protected files? Isn't this a bug in Perl?>.
+For a discussion of issues surrounding file permissions and B<-i>,
+see L<perlfaq5/Why does Perl let me delete read-only files? Why
+does -i clobber protected files? Isn't this a bug in Perl?>.
You cannot use B<-i> to create directories or to strip extensions from
files.
-Perl does not expand C<~>, so don't do that.
+Perl does not expand C<~> in filenames, which is good, since some
+folks use it for their backup files:
-Finally, note that the B<-i> switch does not impede execution when no
+ $ perl -pi~ -e 's/foo/bar/' file1 file2 file3...
+
+Finally, the B<-i> switch does not impede execution when no
files are given on the command line. In this case, no backup is made
(the original file cannot, of course, be determined) and processing
proceeds from STDIN to STDOUT as might be expected.
@@ -426,13 +470,13 @@ searches /usr/include and /usr/lib/perl.
=item B<-l>[I<octnum>]
-enables automatic line-ending processing. It has two effects: first,
-it automatically chomps "C<$/>" (the input record separator) when used
-with B<-n> or B<-p>, and second, it assigns "C<$\>"
-(the output record separator) to have the value of I<octnum> so that
-any print statements will have that separator added back on. If
-I<octnum> is omitted, sets "C<$\>" to the current value of "C<$/>". For
-instance, to trim lines to 80 columns:
+enables automatic line-ending processing. It has two separate
+effects. First, it automatically chomps C<$/> (the input record
+separator) when used with B<-n> or B<-p>. Second, it assigns C<$\>
+(the output record separator) to have the value of I<octnum> so
+that any print statements will have that separator added back on.
+If I<octnum> is omitted, sets C<$\> to the current value of
+C<$/>. For instance, to trim lines to 80 columns:
perl -lpe 'substr($_, 80) = ""'
@@ -452,55 +496,59 @@ This sets C<$\> to newline and then sets C<$/> to the null character.
=item B<-[mM]>[B<->]I<module=arg[,arg]...>
-C<-m>I<module> executes C<use> I<module> C<();> before executing your
-script.
+B<-m>I<module> executes C<use> I<module> C<();> before executing your
+program.
-C<-M>I<module> executes C<use> I<module> C<;> before executing your
-script. You can use quotes to add extra code after the module name,
-e.g., C<-M'module qw(foo bar)'>.
+B<-M>I<module> executes C<use> I<module> C<;> before executing your
+program. You can use quotes to add extra code after the module name,
+e.g., C<'-Mmodule qw(foo bar)'>.
-If the first character after the C<-M> or C<-m> is a dash (C<->)
+If the first character after the B<-M> or B<-m> is a dash (C<->)
then the 'use' is replaced with 'no'.
A little builtin syntactic sugar means you can also say
-C<-mmodule=foo,bar> or C<-Mmodule=foo,bar> as a shortcut for
-C<-M'module qw(foo bar)'>. This avoids the need to use quotes when
-importing symbols. The actual code generated by C<-Mmodule=foo,bar> is
+B<-mmodule=foo,bar> or B<-Mmodule=foo,bar> as a shortcut for
+C<'-Mmodule qw(foo bar)'>. This avoids the need to use quotes when
+importing symbols. The actual code generated by B<-Mmodule=foo,bar> is
C<use module split(/,/,q{foo,bar})>. Note that the C<=> form
-removes the distinction between C<-m> and C<-M>.
+removes the distinction between B<-m> and B<-M>.
=item B<-n>
-causes Perl to assume the following loop around your script, which
+causes Perl to assume the following loop around your program, which
makes it iterate over filename arguments somewhat like B<sed -n> or
B<awk>:
+ LINE:
while (<>) {
- ... # your script goes here
+ ... # your program goes here
}
Note that the lines are not printed by default. See B<-p> to have
lines printed. If a file named by an argument cannot be opened for
-some reason, Perl warns you about it, and moves on to the next file.
+some reason, Perl warns you about it and moves on to the next file.
Here is an efficient way to delete all files older than a week:
- find . -mtime +7 -print | perl -nle 'unlink;'
+ find . -mtime +7 -print | perl -nle unlink
-This is faster than using the C<-exec> switch of B<find> because you don't
-have to start a process on every filename found.
+This is faster than using the B<-exec> switch of B<find> because you don't
+have to start a process on every filename found. It does suffer from
+the bug of mishandling newlines in pathnames, which you can fix if
+you
C<BEGIN> and C<END> blocks may be used to capture control before or after
-the implicit loop, just as in B<awk>.
+the implicit program loop, just as in B<awk>.
=item B<-p>
-causes Perl to assume the following loop around your script, which
+causes Perl to assume the following loop around your program, which
makes it iterate over filename arguments somewhat like B<sed>:
+ LINE:
while (<>) {
- ... # your script goes here
+ ... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
@@ -512,30 +560,32 @@ treated as fatal. To suppress printing use the B<-n> switch. A B<-p>
overrides a B<-n> switch.
C<BEGIN> and C<END> blocks may be used to capture control before or after
-the implicit loop, just as in awk.
+the implicit loop, just as in B<awk>.
=item B<-P>
-causes your script to be run through the C preprocessor before
-compilation by Perl. (Because both comments and cpp directives begin
+causes your program to be run through the C preprocessor before
+compilation by Perl. (Because both comments and B<cpp> directives begin
with the # character, you should avoid starting comments with any words
recognized by the C preprocessor such as "if", "else", or "define".)
=item B<-s>
-enables some rudimentary switch parsing for switches on the command
-line after the script name but before any filename arguments (or before
+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
-corresponding variable in the Perl script. The following script
-prints "true" if and only if the script is invoked with a B<-xyz> switch.
+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>.
#!/usr/bin/perl -s
- if ($xyz) { print "true\n"; }
+ if ($xyz) { print "$xyz\n" }
=item B<-S>
makes Perl use the PATH environment variable to search for the
-script (unless the name of the script contains directory separators).
+program (unless the name of the program contains directory separators).
+
On some platforms, this also makes Perl append suffixes to the
filename while searching for it. For example, on Win32 platforms,
the ".bat" and ".cmd" suffixes are appended if a lookup for the
@@ -543,16 +593,6 @@ original name fails, and if the name does not already end in one
of those suffixes. If your Perl was compiled with DEBUGGING turned
on, using the -Dp switch to Perl shows how the search progresses.
-If the filename supplied contains directory separators (i.e. it is an
-absolute or relative pathname), and if the file is not found,
-platforms that append file extensions will do so and try to look
-for the file with those extensions added, one by one.
-
-On DOS-like platforms, if the script does not contain directory
-separators, it will first be searched for in the current directory
-before being searched for on the PATH. On Unix platforms, the
-script will be searched for strictly on the PATH.
-
Typically this is used to emulate #! startup on platforms that
don't support #!. This example works on many platforms that
have a shell compatible with Bourne shell:
@@ -561,94 +601,130 @@ have a shell compatible with Bourne shell:
eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
if $running_under_some_shell;
-The system ignores the first line and feeds the script to /bin/sh,
-which proceeds to try to execute the Perl script as a shell script.
+The system ignores the first line and feeds the program to F</bin/sh>,
+which proceeds to try to execute the Perl program as a shell script.
The shell executes the second line as a normal shell command, and thus
starts up the Perl interpreter. On some systems $0 doesn't always
contain the full pathname, so the B<-S> tells Perl to search for the
-script if necessary. After Perl locates the script, it parses the
+program if necessary. After Perl locates the program, it parses the
lines and ignores them because the variable $running_under_some_shell
-is never true. If the script will be interpreted by csh, you will need
+is never true. If the program will be interpreted by csh, you will need
to replace C<${1+"$@"}> with C<$*>, even though that doesn't understand
embedded spaces (and such) in the argument list. To start up sh rather
than csh, some systems may have to replace the #! line with a line
containing just a colon, which will be politely ignored by Perl. Other
systems can't control that, and need a totally devious construct that
-will work under any of csh, sh, or Perl, such as the following:
+will work under any of B<csh>, B<sh>, or Perl, such as the following:
- eval '(exit $?0)' && eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
+ eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}'
& eval 'exec /usr/bin/perl -wS $0 $argv:q'
if $running_under_some_shell;
+If the filename supplied contains directory separators (i.e., is an
+absolute or relative pathname), and if that file is not found,
+platforms that append file extensions will do so and try to look
+for the file with those extensions added, one by one.
+
+On DOS-like platforms, if the program does not contain directory
+separators, it will first be searched for in the current directory
+before being searched for on the PATH. On Unix platforms, the
+program will be searched for strictly on the PATH.
+
=item B<-T>
forces "taint" checks to be turned on so you can test them. Ordinarily
-these checks are done only when running setuid or setgid. It's a good
-idea to turn them on explicitly for programs run on another's behalf,
-such as CGI programs. See L<perlsec>. Note that (for security reasons)
-this option must be seen by Perl quite early; usually this means it must
-appear early on the command line or in the #! line (for systems which
-support that).
+these checks are done only when running setuid or setgid. It's a
+good idea to turn them on explicitly for programs that run on behalf
+of someone else whom you might not necessarily trust, such as CGI
+programs or any internet servers you might write in Perl. See
+L<perlsec> for details. For security reasons, this option must be
+seen by Perl quite early; usually this means it must appear early
+on the command line or in the #! line for systems which support
+that construct.
=item B<-u>
-causes Perl to dump core after compiling your script. You can then
-in theory take this core dump and turn it into an executable file by using the
-B<undump> program (not supplied). This speeds startup at the expense of
-some disk space (which you can minimize by stripping the executable).
-(Still, a "hello world" executable comes out to about 200K on my
-machine.) If you want to execute a portion of your script before dumping,
-use the dump() operator instead. Note: availability of B<undump> is
-platform specific and may not be available for a specific port of
-Perl. It has been superseded by the new perl-to-C compiler, which is more
-portable, even though it's still only considered beta.
+This obsolete switch causes Perl to dump core after compiling your
+program. You can then in theory take this core dump and turn it
+into an executable file by using the B<undump> program (not supplied).
+This speeds startup at the expense of some disk space (which you
+can minimize by stripping the executable). (Still, a "hello world"
+executable comes out to about 200K on my machine.) If you want to
+execute a portion of your program before dumping, use the dump()
+operator instead. Note: availability of B<undump> is platform
+specific and may not be available for a specific port of Perl.
+
+This switch has been superseded in favor of the new Perl code
+generator backends to the compiler. See L<B> and L<B::Bytecode>
+for details.
=item B<-U>
allows Perl to do unsafe operations. Currently the only "unsafe"
operations are the unlinking of directories while running as superuser,
and running setuid programs with fatal taint checks turned into
-warnings. Note that the B<-w> switch (or the C<$^W> variable) must
-be used along with this option to actually B<generate> the
+warnings. Note that the B<-w> switch (or the C<$^W> variable) must
+be used along with this option to actually I<generate> the
taint-check warnings.
=item B<-v>
-prints the version and patchlevel of your Perl executable.
+prints the version and patchlevel of your perl executable.
=item B<-V>
prints summary of the major perl configuration values and the current
-value of @INC.
+values of @INC.
=item B<-V:>I<name>
Prints to STDOUT the value of the named configuration variable.
+For example,
+
+ $ perl -V:man.dir
+
+will provide strong clues about what your MANPATH variable should
+be set to in order to access the Perl documentation.
=item B<-w>
-prints warnings about variable names that are mentioned only once, and
-scalar variables that are used before being set. Also warns about
-redefined subroutines, and references to undefined filehandles or
-filehandles opened read-only that you are attempting to write on. Also
-warns you if you use values as a number that doesn't look like numbers,
-using an array as though it were a scalar, if your subroutines recurse
-more than 100 deep, and innumerable other things.
+prints warnings about dubious constructs, such as variable names
+that are mentioned only once and scalar variables that are used
+before being set, redefined subroutines, references to undefined
+filehandles or filehandles opened read-only that you are attempting
+to write on, values used as a number that doesn't look like numbers,
+using an array as though it were a scalar, if your subroutines
+recurse more than 100 deep, and innumerable other things.
+
+This switch really just enables the internal C<^$W> variable. You
+can disable or promote into fatal errors specific warnings using
+C<__WARN__> hooks, as described in L<perlvar> and L<perlfunc/warn>.
+See also L<perldiag> and L<perltrap>. A new, fine-grained warning
+facility is also available if you want to manipulate entire classes
+of warnings; see L<warnings> or L<perllexwarn>.
-You can disable specific warnings using C<__WARN__> hooks, as described
-in L<perlvar> and L<perlfunc/warn>. See also L<perldiag> and L<perltrap>.
+=item B<-W>
+
+Enables all warnings regardless of C<no warnings> or C<$^W>.
+See L<perllexwarn>.
+
+=item B<-X>
+
+Disables all warnings regardless of C<use warnings> or C<$^W>.
+See L<perllexwarn>.
=item B<-x> I<directory>
-tells Perl that the script is embedded in a message. Leading
-garbage will be discarded until the first line that starts with #! and
-contains the string "perl". Any meaningful switches on that line will
-be applied. If a directory name is specified, Perl will switch to
-that directory before running the script. The B<-x> switch controls
-only the disposal of leading garbage. The script must be
-terminated with C<__END__> if there is trailing garbage to be ignored (the
-script can process any or all of the trailing garbage via the DATA
-filehandle if desired).
+tells Perl that the program is embedded in a larger chunk of unrelated
+ASCII text, such as in a mail message. Leading garbage will be
+discarded until the first line that starts with #! and contains the
+string "perl". Any meaningful switches on that line will be applied.
+If a directory name is specified, Perl will switch to that directory
+before running the program. The B<-x> switch controls only the
+disposal of leading garbage. The program must be terminated with
+C<__END__> if there is trailing garbage to be ignored (the program
+can process any or all of the trailing garbage via the DATA filehandle
+if desired).
=back
@@ -666,17 +742,20 @@ Used if chdir has no argument and HOME is not set.
=item PATH
-Used in executing subprocesses, and in finding the script if B<-S> is
+Used in executing subprocesses, and in finding the program if B<-S> is
used.
=item PERL5LIB
A colon-separated list of directories in which to look for Perl library
files before looking in the standard library and the current
-directory. If PERL5LIB is not defined, PERLLIB is used. When running
-taint checks (because the script was running setuid or setgid, or the
-B<-T> switch was used), neither variable is used. The script should
-instead say
+directory. Any architecture-specific directories under the specified
+locations are automatically included if they exist. If PERL5LIB is not
+defined, PERLLIB is used.
+
+When running taint checks (either because the program was running setuid
+or setgid, or the B<-T> switch was used), neither variable is used.
+The program should instead say:
use lib "/my/directory";
@@ -684,7 +763,7 @@ instead say
Command-line options (switches). Switches in this variable are taken
as if they were on every Perl command line. Only the B<-[DIMUdmw]>
-switches are allowed. When running taint checks (because the script
+switches are allowed. When running taint checks (because the program
was running setuid or setgid, or the B<-T> switch was used), this
variable is ignored. If PERL5OPT begins with B<-T>, tainting will be
enabled, and any subsequent options ignored.
@@ -701,12 +780,12 @@ The command used to load the debugger code. The default is:
BEGIN { require 'perl5db.pl' }
-=item PERL5SHELL (specific to WIN32 port)
+=item PERL5SHELL (specific to the Win32 port)
May be set to an alternative shell that perl must use internally for
executing "backtick" commands or system(). Default is C<cmd.exe /x/c>
on WindowsNT and C<command.com /c> on Windows95. The value is considered
-to be space delimited. Precede any character that needs to be protected
+to be space-separated. Precede any character that needs to be protected
(like a space or backslash) with a backslash.
Note that Perl doesn't use COMSPEC for this purpose because
@@ -736,12 +815,11 @@ Perl also has environment variables that control how Perl handles data
specific to particular natural languages. See L<perllocale>.
Apart from these, Perl uses no other environment variables, except
-to make them available to the script being executed, and to child
-processes. However, scripts running setuid would do well to execute
+to make them available to the program being executed, and to child
+processes. However, programs running setuid would do well to execute
the following lines before doing anything else, just to keep people
honest:
- $ENV{PATH} = '/bin:/usr/bin'; # or whatever you need
+ $ENV{PATH} = '/bin:/usr/bin'; # or whatever you need
$ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
-
diff --git a/contrib/perl5/pod/perlsec.pod b/contrib/perl5/pod/perlsec.pod
index 0b22acd..4185e84 100644
--- a/contrib/perl5/pod/perlsec.pod
+++ b/contrib/perl5/pod/perlsec.pod
@@ -32,17 +32,19 @@ program more secure than the corresponding C program.
You may not use data derived from outside your program to affect
something else outside your program--at least, not by accident. All
command line arguments, environment variables, locale information (see
-L<perllocale>), results of certain system calls (readdir, readlink,
-the gecos field of getpw* calls), and all file input are marked as
-"tainted". Tainted data may not be used directly or indirectly in any
-command that invokes a sub-shell, nor in any command that modifies
-files, directories, or processes. (B<Important exception>: If you pass
-a list of arguments to either C<system> or C<exec>, the elements of
-that list are B<NOT> checked for taintedness.) Any variable set
-to a value derived from tainted data will itself be tainted,
-even if it is logically impossible for the tainted data
-to alter the variable. Because taintedness is associated with each
-scalar value, some elements of an array can be tainted and others not.
+L<perllocale>), results of certain system calls (readdir(),
+readlink(), the variable of shmread(), the messages returned by
+msgrcv(), the password, gcos and shell fields returned by the
+getpwxxx() calls), and all file input are marked as "tainted".
+Tainted data may not be used directly or indirectly in any command
+that invokes a sub-shell, nor in any command that modifies files,
+directories, or processes. (B<Important exception>: If you pass a list
+of arguments to either C<system> or C<exec>, the elements of that list
+are B<NOT> checked for taintedness.) Any variable set to a value
+derived from tainted data will itself be tainted, even if it is
+logically impossible for the tainted data to alter the variable.
+Because taintedness is associated with each scalar value, some
+elements of an array can be tainted and others not.
For example:
@@ -84,8 +86,8 @@ For example:
exec "echo", $arg; # Secure (doesn't use the shell)
exec "sh", '-c', $arg; # Considered secure, alas!
- @files = <*.c>; # Always insecure (uses csh)
- @files = glob('*.c'); # Always insecure (uses csh)
+ @files = <*.c>; # insecure (uses readdir() or similar)
+ @files = glob('*.c'); # insecure (uses readdir() or similar)
If you try to do something insecure, you will get a fatal error saying
something like "Insecure dependency" or "Insecure $ENV{PATH}". Note that you
@@ -139,7 +141,7 @@ metacharacters, nor are dot, dash, or at going to mean something special
to the shell. Use of C</.+/> would have been insecure in theory because
it lets everything through, but Perl doesn't check for that. The lesson
is that when untainting, you must be exceedingly careful with your patterns.
-Laundering data using regular expression is the I<ONLY> mechanism for
+Laundering data using regular expression is the I<only> mechanism for
untainting dirty data, unless you use the strategy detailed below to fork
a child of lesser privilege.
diff --git a/contrib/perl5/pod/perlstyle.pod b/contrib/perl5/pod/perlstyle.pod
index 04aab98..bfe5b76 100644
--- a/contrib/perl5/pod/perlstyle.pod
+++ b/contrib/perl5/pod/perlstyle.pod
@@ -10,7 +10,8 @@ make your programs easier to read, understand, and maintain.
The most important thing is to run your programs under the B<-w>
flag at all times. You may turn it off explicitly for particular
-portions of code via the C<$^W> variable if you must. You should
+portions of code via the C<use warnings> pragma or the C<$^W> variable
+if you must. You should
also always run under C<use strict> or know the reason why not.
The C<use sigtrap> and even C<use diagnostics> pragmas may also prove
useful.
@@ -260,7 +261,8 @@ Line up your transliterations when it makes sense:
Think about reusability. Why waste brainpower on a one-shot when you
might want to do something like it again? Consider generalizing your
code. Consider writing a module or object class. Consider making your
-code run cleanly with C<use strict> and B<-w> in effect. Consider giving away
+code run cleanly with C<use strict> and C<use warnings> (or B<-w>) in effect
+Consider giving away
your code. Consider changing your whole world view. Consider... oh,
never mind.
diff --git a/contrib/perl5/pod/perlsub.pod b/contrib/perl5/pod/perlsub.pod
index bfab0fe..46d1a2a 100644
--- a/contrib/perl5/pod/perlsub.pod
+++ b/contrib/perl5/pod/perlsub.pod
@@ -6,35 +6,42 @@ perlsub - Perl subroutines
To declare subroutines:
- sub NAME; # A "forward" declaration.
- sub NAME(PROTO); # ditto, but with prototypes
+ sub NAME; # A "forward" declaration.
+ sub NAME(PROTO); # ditto, but with prototypes
+ sub NAME : ATTRS; # with attributes
+ sub NAME(PROTO) : ATTRS; # with attributes and prototypes
- sub NAME BLOCK # A declaration and a definition.
- sub NAME(PROTO) BLOCK # ditto, but with prototypes
+ sub NAME BLOCK # A declaration and a definition.
+ sub NAME(PROTO) BLOCK # ditto, but with prototypes
+ sub NAME : ATTRS BLOCK # with attributes
+ sub NAME(PROTO) : ATTRS BLOCK # with prototypes and attributes
To define an anonymous subroutine at runtime:
- $subref = sub BLOCK; # no proto
- $subref = sub (PROTO) BLOCK; # with proto
+ $subref = sub BLOCK; # no proto
+ $subref = sub (PROTO) BLOCK; # with proto
+ $subref = sub : ATTRS BLOCK; # with attributes
+ $subref = sub (PROTO) : ATTRS BLOCK; # with proto and attributes
To import subroutines:
- use PACKAGE qw(NAME1 NAME2 NAME3);
+ use MODULE qw(NAME1 NAME2 NAME3);
To call subroutines:
NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
+ &NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.
=head1 DESCRIPTION
-Like many languages, Perl provides for user-defined subroutines. These
-may be located anywhere in the main program, loaded in from other files
-via the C<do>, C<require>, or C<use> keywords, or even generated on the
-fly using C<eval> or anonymous subroutines (closures). You can even call
-a function indirectly using a variable containing its name or a CODE reference
-to it.
+Like many languages, Perl provides for user-defined subroutines.
+These may be located anywhere in the main program, loaded in from
+other files via the C<do>, C<require>, or C<use> keywords, or
+generated on the fly using C<eval> or anonymous subroutines (closures).
+You can even call a function indirectly using a variable containing
+its name or a CODE reference.
The Perl model for function call and return values is simple: all
functions are passed as parameters one single flat list of scalars, and
@@ -44,37 +51,38 @@ collapse, losing their identities--but you may always use
pass-by-reference instead to avoid this. Both call and return lists may
contain as many or as few scalar elements as you'd like. (Often a
function without an explicit return statement is called a subroutine, but
-there's really no difference from the language's perspective.)
-
-Any arguments passed to the routine come in as the array C<@_>. Thus if you
-called a function with two arguments, those would be stored in C<$_[0]>
-and C<$_[1]>. The array C<@_> is a local array, but its elements are
-aliases for the actual scalar parameters. In particular, if an element
-C<$_[0]> is updated, the corresponding argument is updated (or an error
-occurs if it is not updatable). If an argument is an array or hash
-element which did not exist when the function was called, that element is
-created only when (and if) it is modified or if a reference to it is
-taken. (Some earlier versions of Perl created the element whether or not
-it was assigned to.) Note that assigning to the whole array C<@_> removes
-the aliasing, and does not update any arguments.
-
-The return value of the subroutine is the value of the last expression
-evaluated. Alternatively, a C<return> statement may be used to exit the
+there's really no difference from Perl's perspective.)
+
+Any arguments passed in show up in the array C<@_>. Therefore, if
+you called a function with two arguments, those would be stored in
+C<$_[0]> and C<$_[1]>. The array C<@_> is a local array, but its
+elements are aliases for the actual scalar parameters. In particular,
+if an element C<$_[0]> is updated, the corresponding argument is
+updated (or an error occurs if it is not updatable). If an argument
+is an array or hash element which did not exist when the function
+was called, that element is created only when (and if) it is modified
+or a reference to it is taken. (Some earlier versions of Perl
+created the element whether or not the element was assigned to.)
+Assigning to the whole array C<@_> removes that aliasing, and does
+not update any arguments.
+
+The return value of a subroutine is the value of the last expression
+evaluated. More explicitly, a C<return> statement may be used to exit the
subroutine, optionally specifying the returned value, which will be
evaluated in the appropriate context (list, scalar, or void) depending
on the context of the subroutine call. If you specify no return value,
-the subroutine will return an empty list in a list context, an undefined
-value in a scalar context, or nothing in a void context. If you return
-one or more arrays and/or hashes, these will be flattened together into
-one large indistinguishable list.
-
-Perl does not have named formal parameters, but in practice all you do is
-assign to a C<my()> list of these. Any variables you use in the function
-that aren't declared private are global variables. For the gory details
-on creating private variables, see
-L<"Private Variables via my()"> and L<"Temporary Values via local()">.
-To create protected environments for a set of functions in a separate
-package (and probably a separate file), see L<perlmod/"Packages">.
+the subroutine returns an empty list in list context, the undefined
+value in scalar context, or nothing in void context. If you return
+one or more aggregates (arrays and hashes), these will be flattened
+together into one large indistinguishable list.
+
+Perl does not have named formal parameters. In practice all you
+do is assign to a C<my()> list of these. Variables that aren't
+declared to be private are global variables. For gory details
+on creating private variables, see L<"Private Variables via my()">
+and L<"Temporary Values via local()">. To create protected
+environments for a set of functions in a separate package (and
+probably a separate file), see L<perlmod/"Packages">.
Example:
@@ -93,7 +101,7 @@ Example:
# that start with whitespace
sub get_line {
- $thisline = $lookahead; # GLOBAL VARIABLES!!
+ $thisline = $lookahead; # global variables!
LINE: while (defined($lookahead = <STDIN>)) {
if ($lookahead =~ /^[ \t]/) {
$thisline .= $lookahead;
@@ -102,24 +110,25 @@ Example:
last LINE;
}
}
- $thisline;
+ return $thisline;
}
$lookahead = <STDIN>; # get first line
- while ($_ = get_line()) {
+ while (defined($line = get_line())) {
...
}
-Use array assignment to a local list to name your formal arguments:
+Assigning to a list of private variables to name your arguments:
sub maybeset {
my($key, $value) = @_;
$Foo{$key} = $value unless $Foo{$key};
}
-This also has the effect of turning call-by-reference into call-by-value,
-because the assignment copies the values. Otherwise a function is free to
-do in-place modifications of C<@_> and change its caller's values.
+Because the assignment copies the values, this also has the effect
+of turning call-by-reference into call-by-value. Otherwise a
+function is free to do in-place modifications of C<@_> and change
+its caller's values.
upcase_in($v1, $v2); # this changes $v1 and $v2
sub upcase_in {
@@ -136,7 +145,7 @@ It would be much safer if the C<upcase_in()> function
were written to return a copy of its parameters instead
of changing them in place:
- ($v3, $v4) = upcase($v1, $v2); # this doesn't
+ ($v3, $v4) = upcase($v1, $v2); # this doesn't change $v1 and $v2
sub upcase {
return unless defined wantarray; # void context, do nothing
my @parms = @_;
@@ -144,12 +153,12 @@ of changing them in place:
return wantarray ? @parms : $parms[0];
}
-Notice how this (unprototyped) function doesn't care whether it was passed
-real scalars or arrays. Perl will see everything as one big long flat C<@_>
-parameter list. This is one of the ways where Perl's simple
-argument-passing style shines. The C<upcase()> function would work perfectly
-well without changing the C<upcase()> definition even if we fed it things
-like this:
+Notice how this (unprototyped) function doesn't care whether it was
+passed real scalars or arrays. Perl sees all arugments as one big,
+long, flat parameter list in C<@_>. This is one area where
+Perl's simple argument-passing style shines. The C<upcase()>
+function would work perfectly well without changing the C<upcase()>
+definition even if we fed it things like this:
@newlist = upcase(@list1, @list2);
@newlist = upcase( split /:/, $var );
@@ -158,24 +167,26 @@ Do not, however, be tempted to do this:
(@a, @b) = upcase(@list1, @list2);
-Because like its flat incoming parameter list, the return list is also
-flat. So all you have managed to do here is stored everything in C<@a> and
-made C<@b> an empty list. See L<Pass by Reference> for alternatives.
-
-A subroutine may be called using the "C<&>" prefix. The "C<&>" is optional
-in modern Perls, and so are the parentheses if the subroutine has been
-predeclared. (Note, however, that the "C<&>" is I<NOT> optional when
-you're just naming the subroutine, such as when it's used as an
-argument to C<defined()> or C<undef()>. Nor is it optional when you want to
-do an indirect subroutine call with a subroutine name or reference
-using the C<&$subref()> or C<&{$subref}()> constructs. See L<perlref>
-for more on that.)
-
-Subroutines may be called recursively. If a subroutine is called using
-the "C<&>" form, the argument list is optional, and if omitted, no C<@_> array is
-set up for the subroutine: the C<@_> array at the time of the call is
-visible to subroutine instead. This is an efficiency mechanism that
-new users may wish to avoid.
+Like the flattened incoming parameter list, the return list is also
+flattened on return. So all you have managed to do here is stored
+everything in C<@a> and made C<@b> an empty list. See L<Pass by
+Reference> for alternatives.
+
+A subroutine may be called using an explicit C<&> prefix. The
+C<&> is optional in modern Perl, as are parentheses if the
+subroutine has been predeclared. The C<&> is I<not> optional
+when just naming the subroutine, such as when it's used as
+an argument to defined() or undef(). Nor is it optional when you
+want to do an indirect subroutine call with a subroutine name or
+reference using the C<&$subref()> or C<&{$subref}()> constructs,
+although the C<< $subref->() >> notation solves that problem.
+See L<perlref> for more about all that.
+
+Subroutines may be called recursively. If a subroutine is called
+using the C<&> form, the argument list is optional, and if omitted,
+no C<@_> array is set up for the subroutine: the C<@_> array at the
+time of the call is visible to subroutine instead. This is an
+efficiency mechanism that new users may wish to avoid.
&foo(1,2,3); # pass three arguments
foo(1,2,3); # the same
@@ -186,18 +197,18 @@ new users may wish to avoid.
&foo; # foo() get current args, like foo(@_) !!
foo; # like foo() IFF sub foo predeclared, else "foo"
-Not only does the "C<&>" form make the argument list optional, but it also
-disables any prototype checking on the arguments you do provide. This
+Not only does the C<&> form make the argument list optional, it also
+disables any prototype checking on arguments you do provide. This
is partly for historical reasons, and partly for having a convenient way
-to cheat if you know what you're doing. See the section on Prototypes below.
+to cheat if you know what you're doing. See L<Prototypes> below.
-Function whose names are in all upper case are reserved to the Perl core,
-just as are modules whose names are in all lower case. A function in
-all capitals is a loosely-held convention meaning it will be called
-indirectly by the run-time system itself. Functions that do special,
-pre-defined things are C<BEGIN>, C<END>, C<AUTOLOAD>, and C<DESTROY>--plus all the
-functions mentioned in L<perltie>. The 5.005 release adds C<INIT>
-to this list.
+Functions whose names are in all upper case are reserved to the Perl
+core, as are modules whose names are in all lower case. A
+function in all capitals is a loosely-held convention meaning it
+will be called indirectly by the run-time system itself, usually
+due to a triggered event. Functions that do special, pre-defined
+things include C<BEGIN>, C<CHECK>, C<INIT>, C<END>, C<AUTOLOAD>, and
+C<DESTROY>--plus all functions mentioned in L<perltie>.
=head2 Private Variables via my()
@@ -207,37 +218,44 @@ Synopsis:
my (@wid, %get); # declare list of variables local
my $foo = "flurp"; # declare $foo lexical, and init it
my @oof = @bar; # declare @oof lexical, and init it
-
-A "C<my>" declares the listed variables to be confined (lexically) to the
-enclosing block, conditional (C<if/unless/elsif/else>), loop
-(C<for/foreach/while/until/continue>), subroutine, C<eval>, or
-C<do/require/use>'d file. If more than one value is listed, the list
-must be placed in parentheses. All listed elements must be legal lvalues.
-Only alphanumeric identifiers may be lexically scoped--magical
-builtins like C<$/> must currently be C<local>ize with "C<local>" instead.
-
-Unlike dynamic variables created by the "C<local>" operator, lexical
-variables declared with "C<my>" are totally hidden from the outside world,
-including any called subroutines (even if it's the same subroutine called
-from itself or elsewhere--every call gets its own copy).
-
-This doesn't mean that a C<my()> variable declared in a statically
-I<enclosing> lexical scope would be invisible. Only the dynamic scopes
-are cut off. For example, the C<bumpx()> function below has access to the
-lexical C<$x> variable because both the my and the sub occurred at the same
-scope, presumably the file scope.
+ my $x : Foo = $y; # similar, with an attribute applied
+
+B<WARNING>: The use of attribute lists on C<my> declarations is
+experimental. This feature should not be relied upon. It may
+change or disappear in future releases of Perl. See L<attributes>.
+
+The C<my> operator declares the listed variables to be lexically
+confined to the enclosing block, conditional (C<if/unless/elsif/else>),
+loop (C<for/foreach/while/until/continue>), subroutine, C<eval>,
+or C<do/require/use>'d file. If more than one value is listed, the
+list must be placed in parentheses. All listed elements must be
+legal lvalues. Only alphanumeric identifiers may be lexically
+scoped--magical built-ins like C<$/> must currently be C<local>ize
+with C<local> instead.
+
+Unlike dynamic variables created by the C<local> operator, lexical
+variables declared with C<my> are totally hidden from the outside
+world, including any called subroutines. This is true if it's the
+same subroutine called from itself or elsewhere--every call gets
+its own copy.
+
+This doesn't mean that a C<my> variable declared in a statically
+enclosing lexical scope would be invisible. Only dynamic scopes
+are cut off. For example, the C<bumpx()> function below has access
+to the lexical $x variable because both the C<my> and the C<sub>
+occurred at the same scope, presumably file scope.
my $x = 10;
sub bumpx { $x++ }
-(An C<eval()>, however, can see the lexical variables of the scope it is
-being evaluated in so long as the names aren't hidden by declarations within
-the C<eval()> itself. See L<perlref>.)
+An C<eval()>, however, can see lexical variables of the scope it is
+being evaluated in, so long as the names aren't hidden by declarations within
+the C<eval()> itself. See L<perlref>.
-The parameter list to C<my()> may be assigned to if desired, which allows you
+The parameter list to my() may be assigned to if desired, which allows you
to initialize your variables. (If no initializer is given for a
particular variable, it is created with the undefined value.) Commonly
-this is used to name the parameters to a subroutine. Examples:
+this is used to name input parameters to a subroutine. Examples:
$arg = "fred"; # "global" variable
$n = cube_root(27);
@@ -250,8 +268,8 @@ this is used to name the parameters to a subroutine. Examples:
return $arg;
}
-The "C<my>" is simply a modifier on something you might assign to. So when
-you do assign to the variables in its argument list, the "C<my>" doesn't
+The C<my> is simply a modifier on something you might assign to. So when
+you do assign to variables in its argument list, C<my> doesn't
change whether those variables are viewed as a scalar or an array. So
my ($foo) = <STDIN>; # WRONG?
@@ -275,24 +293,24 @@ the current statement. Thus,
my $x = $x;
-can be used to initialize the new $x with the value of the old C<$x>, and
+can be used to initialize a new $x with the value of the old $x, and
the expression
my $x = 123 and $x == 123
-is false unless the old C<$x> happened to have the value C<123>.
+is false unless the old $x happened to have the value C<123>.
Lexical scopes of control structures are not bounded precisely by the
braces that delimit their controlled blocks; control expressions are
-part of the scope, too. Thus in the loop
+part of that scope, too. Thus in the loop
- while (defined(my $line = <>)) {
+ while (my $line = <>) {
$line = lc $line;
} continue {
print $line;
}
-the scope of C<$line> extends from its declaration throughout the rest of
+the scope of $line extends from its declaration throughout the rest of
the loop construct (including the C<continue> clause), but not beyond
it. Similarly, in the conditional
@@ -305,44 +323,48 @@ it. Similarly, in the conditional
die "'$answer' is neither 'yes' nor 'no'";
}
-the scope of C<$answer> extends from its declaration throughout the rest
-of the conditional (including C<elsif> and C<else> clauses, if any),
+the scope of $answer extends from its declaration through the rest
+of that conditional, including any C<elsif> and C<else> clauses,
but not beyond it.
-(None of the foregoing applies to C<if/unless> or C<while/until>
+None of the foregoing text applies to C<if/unless> or C<while/until>
modifiers appended to simple statements. Such modifiers are not
-control structures and have no effect on scoping.)
+control structures and have no effect on scoping.
The C<foreach> loop defaults to scoping its index variable dynamically
-(in the manner of C<local>; see below). However, if the index
-variable is prefixed with the keyword "C<my>", then it is lexically
-scoped instead. Thus in the loop
+in the manner of C<local>. However, if the index variable is
+prefixed with the keyword C<my>, or if there is already a lexical
+by that name in scope, then a new lexical is created instead. Thus
+in the loop
for my $i (1, 2, 3) {
some_function();
}
-the scope of C<$i> extends to the end of the loop, but not beyond it, and
-so the value of C<$i> is unavailable in C<some_function()>.
+the scope of $i extends to the end of the loop, but not beyond it,
+rendering the value of $i inaccessible within C<some_function()>.
Some users may wish to encourage the use of lexically scoped variables.
-As an aid to catching implicit references to package variables,
-if you say
+As an aid to catching implicit uses to package variables,
+which are always global, if you say
use strict 'vars';
-then any variable reference from there to the end of the enclosing
-block must either refer to a lexical variable, or must be fully
-qualified with the package name. A compilation error results
-otherwise. An inner block may countermand this with S<"C<no strict 'vars'>">.
-
-A C<my()> has both a compile-time and a run-time effect. At compile time,
-the compiler takes notice of it; the principle usefulness of this is to
-quiet S<"C<use strict 'vars'>">. The actual initialization is delayed until
-run time, so it gets executed appropriately; every time through a loop,
-for example.
-
-Variables declared with "C<my>" are not part of any package and are therefore
+then any variable mentioned from there to the end of the enclosing
+block must either refer to a lexical variable, be predeclared via
+C<our> or C<use vars>, or else must be fully qualified with the package name.
+A compilation error results otherwise. An inner block may countermand
+this with C<no strict 'vars'>.
+
+A C<my> has both a compile-time and a run-time effect. At compile
+time, the compiler takes notice of it. The principle usefulness
+of this is to quiet C<use strict 'vars'>, but it is also essential
+for generation of closures as detailed in L<perlref>. Actual
+initialization is delayed until run time, though, so it gets executed
+at the appropriate time, such as each time through a loop, for
+example.
+
+Variables declared with C<my> are not part of any package and are therefore
never fully qualified with the package name. In particular, you're not
allowed to try to make a package variable (or other global) lexical:
@@ -360,13 +382,14 @@ lexical of the same name is also visible:
That will print out C<20> and C<10>.
-You may declare "C<my>" variables at the outermost scope of a file to hide
-any such identifiers totally from the outside world. This is similar
-to C's static variables at the file level. To do this with a subroutine
-requires the use of a closure (anonymous function with lexical access).
-If a block (such as an C<eval()>, function, or C<package>) wants to create
-a private subroutine that cannot be called from outside that block,
-it can declare a lexical variable containing an anonymous sub reference:
+You may declare C<my> variables at the outermost scope of a file
+to hide any such identifiers from the world outside that file. This
+is similar in spirit to C's static variables when they are used at
+the file level. To do this with a subroutine requires the use of
+a closure (an anonymous function that accesses enclosing lexicals).
+If you want to create a private subroutine that cannot be called
+from outside that block, it can declare a lexical variable containing
+an anonymous sub reference:
my $secret_version = '1.001-beta';
my $secret_sub = sub { print $secret_version };
@@ -375,11 +398,13 @@ it can declare a lexical variable containing an anonymous sub reference:
As long as the reference is never returned by any function within the
module, no outside module can see the subroutine, because its name is not in
any package's symbol table. Remember that it's not I<REALLY> called
-C<$some_pack::secret_version> or anything; it's just C<$secret_version>,
+C<$some_pack::secret_version> or anything; it's just $secret_version,
unqualified and unqualifiable.
-This does not work with object methods, however; all object methods have
-to be in the symbol table of some package to be found.
+This does not work with object methods, however; all object methods
+have to be in the symbol table of some package to be found. See
+L<perlref/"Function Templates"> for something of a work-around to
+this.
=head2 Persistent Private Variables
@@ -415,7 +440,7 @@ and put the static variable outside the function but in the block.
If this function is being sourced in from a separate file
via C<require> or C<use>, then this is probably just fine. If it's
-all in the main program, you'll need to arrange for the C<my()>
+all in the main program, you'll need to arrange for the C<my>
to be executed early, either by putting the whole block above
your main program, or more likely, placing merely a C<BEGIN>
sub around it to make sure it gets executed before your program
@@ -428,20 +453,21 @@ starts to run:
}
}
-See L<perlmod/"Package Constructors and Destructors"> about the C<BEGIN> function.
+See L<perlmod/"Package Constructors and Destructors"> about the
+special triggered functions, C<BEGIN>, C<CHECK>, C<INIT> and C<END>.
-If declared at the outermost scope, the file scope, then lexicals work
-someone like C's file statics. They are available to all functions in
-that same file declared below them, but are inaccessible from outside of
-the file. This is sometimes used in modules to create private variables
-for the whole module.
+If declared at the outermost scope (the file scope), then lexicals
+work somewhat like C's file statics. They are available to all
+functions in that same file declared below them, but are inaccessible
+from outside that file. This strategy is sometimes used in modules
+to create private variables that the whole module can see.
=head2 Temporary Values via local()
-B<NOTE>: In general, you should be using "C<my>" instead of "C<local>", because
+B<WARNING>: In general, you should be using C<my> instead of C<local>, because
it's faster and safer. Exceptions to this include the global punctuation
variables, filehandles and formats, and direct manipulation of the Perl
-symbol table itself. Format variables often use "C<local>" though, as do
+symbol table itself. Format variables often use C<local> though, as do
other variables whose current value must be visible to called
subroutines.
@@ -458,14 +484,14 @@ Synopsis:
local *merlyn = 'randal'; # SAME THING: promote 'randal' to *randal
local *merlyn = \$randal; # just alias $merlyn, not @merlyn etc
-A C<local()> modifies its listed variables to be "local" to the enclosing
-block, C<eval>, or C<do FILE>--and to I<any subroutine called from within that block>.
-A C<local()> just gives temporary values to global (meaning package)
-variables. It does B<not> create a local variable. This is known as
-dynamic scoping. Lexical scoping is done with "C<my>", which works more
-like C's auto declarations.
+A C<local> modifies its listed variables to be "local" to the
+enclosing block, C<eval>, or C<do FILE>--and to I<any subroutine
+called from within that block>. A C<local> just gives temporary
+values to global (meaning package) variables. It does I<not> create
+a local variable. This is known as dynamic scoping. Lexical scoping
+is done with C<my>, which works more like C's auto declarations.
-If more than one variable is given to C<local()>, they must be placed in
+If more than one variable is given to C<local>, they must be placed in
parentheses. All listed elements must be legal lvalues. This operator works
by saving the current values of those variables in its argument list on a
hidden stack and restoring them upon exiting the block, subroutine, or
@@ -490,7 +516,7 @@ subroutine. Examples:
}
# old %digits restored here
-Because C<local()> is a run-time command, it gets executed every time
+Because C<local> is a run-time operator, it gets executed each time
through a loop. In releases of Perl previous to 5.0, this used more stack
storage each time until the loop was exited. Perl now reclaims the space
each time through, but it's still more efficient to declare your variables
@@ -581,34 +607,54 @@ Perl will print
This is a test only a test.
The array has 6 elements: 0, 1, 2, undef, undef, 5
-Note also that when you C<local>ize a member of a composite type that
-B<does not exist previously>, the value is treated as though it were
-in an lvalue context, i.e., it is first created and then C<local>ized.
-The consequence of this is that the hash or array is in fact permanently
-modified. For instance, if you say
+The behavior of local() on non-existent members of composite
+types is subject to change in future.
+
+=head2 Lvalue subroutines
- %hash = ( 'This' => 'is', 'a' => 'test' );
- @ary = ( 0..5 );
- {
- local($ary[8]) = 0;
- local($hash{'b'}) = 'whatever';
+B<WARNING>: Lvalue subroutines are still experimental and the implementation
+may change in future versions of Perl.
+
+It is possible to return a modifiable value from a subroutine.
+To do this, you have to declare the subroutine to return an lvalue.
+
+ my $val;
+ sub canmod : lvalue {
+ $val;
+ }
+ sub nomod {
+ $val;
}
- printf "%%hash has now %d keys, \@ary %d elements.\n",
- scalar(keys(%hash)), scalar(@ary);
-Perl will print
+ canmod() = 5; # assigns to $val
+ nomod() = 5; # ERROR
- %hash has now 3 keys, @ary 9 elements.
+The scalar/list context for the subroutine and for the right-hand
+side of assignment is determined as if the subroutine call is replaced
+by a scalar. For example, consider:
-The above behavior of local() on non-existent members of composite
-types is subject to change in future.
+ data(2,3) = get_data(3,4);
+
+Both subroutines here are called in a scalar context, while in:
+
+ (data(2,3)) = get_data(3,4);
+
+and in:
+
+ (data(2),data(3)) = get_data(3,4);
+
+all the subroutines are called in a list context.
+
+The current implementation does not allow arrays and hashes to be
+returned from lvalue subroutines directly. You may return a
+reference instead. This restriction may be lifted in future.
=head2 Passing Symbol Table Entries (typeglobs)
-[Note: The mechanism described in this section was originally the only
-way to simulate pass-by-reference in older versions of Perl. While it
-still works fine in modern versions, the new reference mechanism is
-generally easier to work with. See below.]
+B<WARNING>: The mechanism described in this section was originally
+the only way to simulate pass-by-reference in older versions of
+Perl. While it still works fine in modern versions, the new reference
+mechanism is generally easier to work with. See below.
Sometimes you don't want to pass the value of an array to a subroutine
but rather the name of it, so that the subroutine can modify the global
@@ -621,7 +667,7 @@ funny prefix characters on variables and subroutines and such.
When evaluated, the typeglob produces a scalar value that represents
all the objects of that name, including any filehandle, format, or
subroutine. When assigned to, it causes the name mentioned to refer to
-whatever "C<*>" value was assigned to it. Example:
+whatever C<*> value was assigned to it. Example:
sub doubleary {
local(*someary) = @_;
@@ -632,7 +678,7 @@ whatever "C<*>" value was assigned to it. Example:
doubleary(*foo);
doubleary(*bar);
-Note that scalars are already passed by reference, so you can modify
+Scalars are already passed by reference, so you can modify
scalar arguments without using this mechanism by referring explicitly
to C<$_[0]> etc. You can modify all the elements of an array by passing
all the elements as scalars, but you have to use the C<*> mechanism (or
@@ -647,13 +693,13 @@ L<perldata/"Typeglobs and Filehandles">.
=head2 When to Still Use local()
-Despite the existence of C<my()>, there are still three places where the
-C<local()> operator still shines. In fact, in these three places, you
+Despite the existence of C<my>, there are still three places where the
+C<local> operator still shines. In fact, in these three places, you
I<must> use C<local> instead of C<my>.
=over
-=item 1. You need to give a global variable a temporary value, especially C<$_>.
+=item 1. You need to give a global variable a temporary value, especially $_.
The global variables, like C<@ARGV> or the punctuation variables, must be
C<local>ized with C<local()>. This block reads in F</etc/motd>, and splits
@@ -667,13 +713,13 @@ in C<@Fields>.
@Fields = split /^\s*=+\s*$/;
}
-It particular, it's important to C<local>ize C<$_> in any routine that assigns
+It particular, it's important to C<local>ize $_ in any routine that assigns
to it. Look out for implicit assignments in C<while> conditionals.
=item 2. You need to create a local file or directory handle or a local function.
-A function that needs a filehandle of its own must use C<local()> uses
-C<local()> on complete typeglob. This can be used to create new symbol
+A function that needs a filehandle of its own must use
+C<local()> on a complete typeglob. This can be used to create new symbol
table entries:
sub ioqueue {
@@ -724,9 +770,9 @@ you're going to have to use an explicit pass-by-reference. Before you
do that, you need to understand references as detailed in L<perlref>.
This section may not make much sense to you otherwise.
-Here are a few simple examples. First, let's pass in several
-arrays to a function and have it C<pop> all of then, return a new
-list of all their former last elements:
+Here are a few simple examples. First, let's pass in several arrays
+to a function and have it C<pop> all of then, returning a new list
+of all their former last elements:
@tailings = popmany ( \@a, \@b, \@c, \@d );
@@ -765,9 +811,10 @@ Where people get into trouble is here:
or
(%a, %b) = func(%c, %d);
-That syntax simply won't work. It sets just C<@a> or C<%a> and clears the C<@b> or
-C<%b>. Plus the function didn't get passed into two separate arrays or
-hashes: it got one long list in C<@_>, as always.
+That syntax simply won't work. It sets just C<@a> or C<%a> and
+clears the C<@b> or C<%b>. Plus the function didn't get passed
+into two separate arrays or hashes: it got one long list in C<@_>,
+as always.
If you can arrange for everyone to deal with this through references, it's
cleaner code, although not so nice to look at. Here's a function that
@@ -799,12 +846,13 @@ It turns out that you can actually do this also:
}
Here we're using the typeglobs to do symbol table aliasing. It's
-a tad subtle, though, and also won't work if you're using C<my()>
-variables, because only globals (well, and C<local()>s) are in the symbol table.
+a tad subtle, though, and also won't work if you're using C<my>
+variables, because only globals (even in disguise as C<local>s)
+are in the symbol table.
If you're passing around filehandles, you could usually just use the bare
-typeglob, like C<*STDOUT>, but typeglobs references would be better because
-they'll still work properly under S<C<use strict 'refs'>>. For example:
+typeglob, like C<*STDOUT>, but typeglobs references work, too.
+For example:
splutter(\*STDOUT);
sub splutter {
@@ -818,45 +866,41 @@ they'll still work properly under S<C<use strict 'refs'>>. For example:
return scalar <$fh>;
}
-Another way to do this is using C<*HANDLE{IO}>, see L<perlref> for usage
-and caveats.
-
-If you're planning on generating new filehandles, you could do this:
+If you're planning on generating new filehandles, you could do this.
+Notice to pass back just the bare *FH, not its reference.
sub openit {
- my $name = shift;
+ my $path = shift;
local *FH;
return open (FH, $path) ? *FH : undef;
}
-Although that will actually produce a small memory leak. See the bottom
-of L<perlfunc/open()> for a somewhat cleaner way using the C<IO::Handle>
-package.
-
=head2 Prototypes
-As of the 5.002 release of perl, if you declare
+Perl supports a very limited kind of compile-time argument checking
+using function prototyping. If you declare
sub mypush (\@@)
-then C<mypush()> takes arguments exactly like C<push()> does. The declaration
-of the function to be called must be visible at compile time. The prototype
-affects only the interpretation of new-style calls to the function, where
-new-style is defined as not using the C<&> character. In other words,
-if you call it like a builtin function, then it behaves like a builtin
-function. If you call it like an old-fashioned subroutine, then it
-behaves like an old-fashioned subroutine. It naturally falls out from
-this rule that prototypes have no influence on subroutine references
-like C<\&foo> or on indirect subroutine calls like C<&{$subref}> or
-C<$subref-E<gt>()>.
+then C<mypush()> takes arguments exactly like C<push()> does. The
+function declaration must be visible at compile time. The prototype
+affects only interpretation of new-style calls to the function,
+where new-style is defined as not using the C<&> character. In
+other words, if you call it like a built-in function, then it behaves
+like a built-in function. If you call it like an old-fashioned
+subroutine, then it behaves like an old-fashioned subroutine. It
+naturally falls out from this rule that prototypes have no influence
+on subroutine references like C<\&foo> or on indirect subroutine
+calls like C<&{$subref}> or C<< $subref->() >>.
Method calls are not influenced by prototypes either, because the
-function to be called is indeterminate at compile time, because it depends
-on inheritance.
+function to be called is indeterminate at compile time, since
+the exact code called depends on inheritance.
-Because the intent is primarily to let you define subroutines that work
-like builtin commands, here are the prototypes for some other functions
-that parse almost exactly like the corresponding builtins.
+Because the intent of this feature is primarily to let you define
+subroutines that work like built-in functions, here are prototypes
+for some other functions that parse almost exactly like the
+corresponding built-in.
Declared as Called as
@@ -877,35 +921,45 @@ that parse almost exactly like the corresponding builtins.
Any backslashed prototype character represents an actual argument
that absolutely must start with that character. The value passed
-to the subroutine (as part of C<@_>) will be a reference to the
-actual argument given in the subroutine call, obtained by applying
-C<\> to that argument.
+as part of C<@_> will be a reference to the actual argument given
+in the subroutine call, obtained by applying C<\> to that argument.
Unbackslashed prototype characters have special meanings. Any
-unbackslashed C<@> or C<%> eats all the rest of the arguments, and forces
+unbackslashed C<@> or C<%> eats all remaining arguments, and forces
list context. An argument represented by C<$> forces scalar context. An
C<&> requires an anonymous subroutine, which, if passed as the first
-argument, does not require the "C<sub>" keyword or a subsequent comma. A
-C<*> allows the subroutine to accept a bareword, constant, scalar expression,
+argument, does not require the C<sub> keyword or a subsequent comma.
+
+A C<*> allows the subroutine to accept a bareword, constant, scalar expression,
typeglob, or a reference to a typeglob in that slot. The value will be
available to the subroutine either as a simple scalar, or (in the latter
-two cases) as a reference to the typeglob.
+two cases) as a reference to the typeglob. If you wish to always convert
+such arguments to a typeglob reference, use Symbol::qualify_to_ref() as
+follows:
+
+ use Symbol 'qualify_to_ref';
+
+ sub foo (*) {
+ my $fh = qualify_to_ref(shift, caller);
+ ...
+ }
A semicolon separates mandatory arguments from optional arguments.
-(It is redundant before C<@> or C<%>.)
+It is redundant before C<@> or C<%>, which gobble up everything else.
-Note how the last three examples above are treated specially by the parser.
-C<mygrep()> is parsed as a true list operator, C<myrand()> is parsed as a
-true unary operator with unary precedence the same as C<rand()>, and
-C<mytime()> is truly without arguments, just like C<time()>. That is, if you
-say
+Note how the last three examples in the table above are treated
+specially by the parser. C<mygrep()> is parsed as a true list
+operator, C<myrand()> is parsed as a true unary operator with unary
+precedence the same as C<rand()>, and C<mytime()> is truly without
+arguments, just like C<time()>. That is, if you say
mytime +2;
you'll get C<mytime() + 2>, not C<mytime(2)>, which is how it would be parsed
-without the prototype.
+without a prototype.
-The interesting thing about C<&> is that you can generate new syntax with it:
+The interesting thing about C<&> is that you can generate new syntax with it,
+provided it's in the initial position:
sub try (&@) {
my($try,$catch) = @_;
@@ -924,12 +978,12 @@ The interesting thing about C<&> is that you can generate new syntax with it:
};
That prints C<"unphooey">. (Yes, there are still unresolved
-issues having to do with the visibility of C<@_>. I'm ignoring that
+issues having to do with visibility of C<@_>. I'm ignoring that
question for the moment. (But note that if we make C<@_> lexically
scoped, those anonymous subroutines can act like closures... (Gee,
is this sounding a little Lispish? (Never mind.))))
-And here's a reimplementation of C<grep>:
+And here's a reimplementation of the Perl C<grep> operator:
sub mygrep (&@) {
my $code = shift;
@@ -965,12 +1019,12 @@ returning a list:
func(@foo);
func( split /:/ );
-Then you've just supplied an automatic C<scalar()> in front of their
+Then you've just supplied an automatic C<scalar> in front of their
argument, which can be more than a bit surprising. The old C<@foo>
which used to hold one thing doesn't get passed in. Instead,
-the C<func()> now gets passed in C<1>, that is, the number of elements
-in C<@foo>. And the C<split()> gets called in a scalar context and
-starts scribbling on your C<@_> parameter list.
+C<func()> now gets passed in a C<1>; that is, the number of elements
+in C<@foo>. And the C<split> gets called in scalar context so it
+starts scribbling on your C<@_> parameter list. Ouch!
This is all very powerful, of course, and should be used only in moderation
to make the world a better place.
@@ -978,12 +1032,11 @@ to make the world a better place.
=head2 Constant Functions
Functions with a prototype of C<()> are potential candidates for
-inlining. If the result after optimization and constant folding is
-either a constant or a lexically-scoped scalar which has no other
+inlining. If the result after optimization and constant folding
+is either a constant or a lexically-scoped scalar which has no other
references, then it will be used in place of function calls made
-without C<&> or C<do>. Calls made using C<&> or C<do> are never
-inlined. (See F<constant.pm> for an easy way to declare most
-constants.)
+without C<&>. Calls made using C<&> are never inlined. (See
+F<constant.pm> for an easy way to declare most constants.)
The following functions would all be inlined:
@@ -1019,55 +1072,57 @@ a mandatory warning. (You can use this warning to tell whether or not a
particular subroutine is considered constant.) The warning is
considered severe enough not to be optional because previously compiled
invocations of the function will still be using the old value of the
-function. If you need to be able to redefine the subroutine you need to
+function. If you need to be able to redefine the subroutine, you need to
ensure that it isn't inlined, either by dropping the C<()> prototype
-(which changes the calling semantics, so beware) or by thwarting the
+(which changes calling semantics, so beware) or by thwarting the
inlining mechanism in some other way, such as
sub not_inlined () {
23 if $];
}
-=head2 Overriding Builtin Functions
+=head2 Overriding Built-in Functions
-Many builtin functions may be overridden, though this should be tried
+Many built-in functions may be overridden, though this should be tried
only occasionally and for good reason. Typically this might be
-done by a package attempting to emulate missing builtin functionality
+done by a package attempting to emulate missing built-in functionality
on a non-Unix system.
Overriding may be done only by importing the name from a
module--ordinary predeclaration isn't good enough. However, the
-C<subs> pragma (compiler directive) lets you, in effect, predeclare subs
-via the import syntax, and these names may then override the builtin ones:
+C<use subs> pragma lets you, in effect, predeclare subs
+via the import syntax, and these names may then override built-in ones:
use subs 'chdir', 'chroot', 'chmod', 'chown';
chdir $somewhere;
sub chdir { ... }
-To unambiguously refer to the builtin form, one may precede the
-builtin name with the special package qualifier C<CORE::>. For example,
-saying C<CORE::open()> will always refer to the builtin C<open()>, even
+To unambiguously refer to the built-in form, precede the
+built-in name with the special package qualifier C<CORE::>. For example,
+saying C<CORE::open()> always refers to the built-in C<open()>, even
if the current package has imported some other subroutine called
-C<&open()> from elsewhere.
+C<&open()> from elsewhere. Even though it looks like a regular
+function call, it isn't: you can't take a reference to it, such as
+the incorrect C<\&CORE::open> might appear to produce.
-Library modules should not in general export builtin names like "C<open>"
-or "C<chdir>" as part of their default C<@EXPORT> list, because these may
+Library modules should not in general export built-in names like C<open>
+or C<chdir> as part of their default C<@EXPORT> list, because these may
sneak into someone else's namespace and change the semantics unexpectedly.
-Instead, if the module adds the name to the C<@EXPORT_OK> list, then it's
+Instead, if the module adds that name to C<@EXPORT_OK>, then it's
possible for a user to import the name explicitly, but not implicitly.
That is, they could say
use Module 'open';
-and it would import the C<open> override, but if they said
+and it would import the C<open> override. But if they said
use Module;
-they would get the default imports without the overrides.
+they would get the default imports without overrides.
-The foregoing mechanism for overriding builtins is restricted, quite
+The foregoing mechanism for overriding built-in is restricted, quite
deliberately, to the package that requests the import. There is a second
-method that is sometimes applicable when you wish to override a builtin
+method that is sometimes applicable when you wish to override a built-in
everywhere, without regard to namespace boundaries. This is achieved by
importing a sub into the special namespace C<CORE::GLOBAL::>. Here is an
example that quite brazenly replaces the C<glob> operator with something
@@ -1089,9 +1144,12 @@ that understands regular expressions.
sub glob {
my $pat = shift;
my @got;
- local(*D);
- if (opendir D, '.') { @got = grep /$pat/, readdir D; closedir D; }
- @got;
+ local *D;
+ if (opendir D, '.') {
+ @got = grep /$pat/, readdir D;
+ closedir D;
+ }
+ return @got;
}
1;
@@ -1102,44 +1160,45 @@ And here's how it could be (ab)used:
use REGlob 'glob'; # override glob() in Foo:: only
print for <^[a-z_]+\.pm\$>; # show all pragmatic modules
-Note that the initial comment shows a contrived, even dangerous example.
+The initial comment shows a contrived, even dangerous example.
By overriding C<glob> globally, you would be forcing the new (and
-subversive) behavior for the C<glob> operator for B<every> namespace,
+subversive) behavior for the C<glob> operator for I<every> namespace,
without the complete cognizance or cooperation of the modules that own
those namespaces. Naturally, this should be done with extreme caution--if
it must be done at all.
The C<REGlob> example above does not implement all the support needed to
-cleanly override perl's C<glob> operator. The builtin C<glob> has
+cleanly override perl's C<glob> operator. The built-in C<glob> has
different behaviors depending on whether it appears in a scalar or list
-context, but our C<REGlob> doesn't. Indeed, many perl builtins have such
+context, but our C<REGlob> doesn't. Indeed, many perl built-in have such
context sensitive behaviors, and these must be adequately supported by
a properly written override. For a fully functional example of overriding
C<glob>, study the implementation of C<File::DosGlob> in the standard
library.
-
=head2 Autoloading
-If you call a subroutine that is undefined, you would ordinarily get an
-immediate fatal error complaining that the subroutine doesn't exist.
-(Likewise for subroutines being used as methods, when the method
-doesn't exist in any base class of the class package.) If,
-however, there is an C<AUTOLOAD> subroutine defined in the package or
-packages that were searched for the original subroutine, then that
-C<AUTOLOAD> subroutine is called with the arguments that would have been
-passed to the original subroutine. The fully qualified name of the
-original subroutine magically appears in the C<$AUTOLOAD> variable in the
-same package as the C<AUTOLOAD> routine. The name is not passed as an
-ordinary argument because, er, well, just because, that's why...
-
-Most C<AUTOLOAD> routines will load in a definition for the subroutine in
-question using eval, and then execute that subroutine using a special
-form of "goto" that erases the stack frame of the C<AUTOLOAD> routine
-without a trace. (See the standard C<AutoLoader> module, for example.)
-But an C<AUTOLOAD> routine can also just emulate the routine and never
-define it. For example, let's pretend that a function that wasn't defined
-should just call C<system()> with those arguments. All you'd do is this:
+If you call a subroutine that is undefined, you would ordinarily
+get an immediate, fatal error complaining that the subroutine doesn't
+exist. (Likewise for subroutines being used as methods, when the
+method doesn't exist in any base class of the class's package.)
+However, if an C<AUTOLOAD> subroutine is defined in the package or
+packages used to locate the original subroutine, then that
+C<AUTOLOAD> subroutine is called with the arguments that would have
+been passed to the original subroutine. The fully qualified name
+of the original subroutine magically appears in the global $AUTOLOAD
+variable of the same package as the C<AUTOLOAD> routine. The name
+is not passed as an ordinary argument because, er, well, just
+because, that's why...
+
+Many C<AUTOLOAD> routines load in a definition for the requested
+subroutine using eval(), then execute that subroutine using a special
+form of goto() that erases the stack frame of the C<AUTOLOAD> routine
+without a trace. (See the source to the standard module documented
+in L<AutoLoader>, for example.) But an C<AUTOLOAD> routine can
+also just emulate the routine and never define it. For example,
+let's pretend that a function that wasn't defined should just invoke
+C<system> with those arguments. All you'd do is:
sub AUTOLOAD {
my $program = $AUTOLOAD;
@@ -1150,8 +1209,8 @@ should just call C<system()> with those arguments. All you'd do is this:
who('am', 'i');
ls('-l');
-In fact, if you predeclare the functions you want to call that way, you don't
-even need the parentheses:
+In fact, if you predeclare functions you want to call that way, you don't
+even need parentheses:
use subs qw(date who ls);
date;
@@ -1159,16 +1218,59 @@ even need the parentheses:
ls -l;
A more complete example of this is the standard Shell module, which
-can treat undefined subroutine calls as calls to Unix programs.
+can treat undefined subroutine calls as calls to external programs.
-Mechanisms are available for modules writers to help split the modules
-up into autoloadable files. See the standard AutoLoader module
+Mechanisms are available to help modules writers split their modules
+into autoloadable files. See the standard AutoLoader module
described in L<AutoLoader> and in L<AutoSplit>, the standard
SelfLoader modules in L<SelfLoader>, and the document on adding C
-functions to perl code in L<perlxs>.
+functions to Perl code in L<perlxs>.
+
+=head2 Subroutine Attributes
+
+A subroutine declaration or definition may have a list of attributes
+associated with it. If such an attribute list is present, it is
+broken up at space or colon boundaries and treated as though a
+C<use attributes> had been seen. See L<attributes> for details
+about what attributes are currently supported.
+Unlike the limitation with the obsolescent C<use attrs>, the
+C<sub : ATTRLIST> syntax works to associate the attributes with
+a pre-declaration, and not just with a subroutine definition.
+
+The attributes must be valid as simple identifier names (without any
+punctuation other than the '_' character). They may have a parameter
+list appended, which is only checked for whether its parentheses ('(',')')
+nest properly.
+
+Examples of valid syntax (even though the attributes are unknown):
+
+ sub fnord (&\%) : switch(10,foo(7,3)) : expensive ;
+ sub plugh () : Ugly('\(") :Bad ;
+ sub xyzzy : _5x5 { ... }
+
+Examples of invalid syntax:
+
+ sub fnord : switch(10,foo() ; # ()-string not balanced
+ sub snoid : Ugly('(') ; # ()-string not balanced
+ sub xyzzy : 5x5 ; # "5x5" not a valid identifier
+ sub plugh : Y2::north ; # "Y2::north" not a simple identifier
+ sub snurt : foo + bar ; # "+" not a colon or space
+
+The attribute list is passed as a list of constant strings to the code
+which associates them with the subroutine. In particular, the second example
+of valid syntax above currently looks like this in terms of how it's
+parsed and invoked:
+
+ use attributes __PACKAGE__, \&plugh, q[Ugly('\(")], 'Bad';
+
+For further details on attribute lists and their manipulation,
+see L<attributes>.
=head1 SEE ALSO
-See L<perlref> for more about references and closures. See L<perlxs> if
-you'd like to learn about calling C subroutines from perl. See L<perlmod>
-to learn about bundling up your functions in separate files.
+See L<perlref/"Function Templates"> for more about references and closures.
+See L<perlxs> if you'd like to learn about calling C subroutines from Perl.
+See L<perlembed> if you'd like to learn about calling PErl subroutines from C.
+See L<perlmod> to learn about bundling up your functions in separate files.
+See L<perlmodlib> to learn what library modules come standard on your system.
+See L<perltoot> to learn how to make object method calls.
diff --git a/contrib/perl5/pod/perlsyn.pod b/contrib/perl5/pod/perlsyn.pod
index a3bc5ab..724ba12 100644
--- a/contrib/perl5/pod/perlsyn.pod
+++ b/contrib/perl5/pod/perlsyn.pod
@@ -5,21 +5,14 @@ perlsyn - Perl syntax
=head1 DESCRIPTION
A Perl script consists of a sequence of declarations and statements.
-The only things that need to be declared in Perl are report formats
-and subroutines. See the sections below for more information on those
-declarations. All uninitialized user-created objects are assumed to
-start with a C<null> or C<0> value until they are defined by some explicit
-operation such as assignment. (Though you can get warnings about the
-use of undefined values if you like.) The sequence of statements is
-executed just once, unlike in B<sed> and B<awk> scripts, where the
-sequence of statements is executed for each input line. While this means
-that you must explicitly loop over the lines of your input file (or
-files), it also means you have much more control over which files and
-which lines you look at. (Actually, I'm lying--it is possible to do an
-implicit loop with either the B<-n> or B<-p> switch. It's just not the
-mandatory default like it is in B<sed> and B<awk>.)
-
-=head2 Declarations
+The sequence of statements is executed just once, unlike in B<sed>
+and B<awk> scripts, where the sequence of statements is executed
+for each input line. While this means that you must explicitly
+loop over the lines of your input file (or files), it also means
+you have much more control over which files and which lines you look at.
+(Actually, I'm lying--it is possible to do an implicit loop with
+either the B<-n> or B<-p> switch. It's just not the mandatory
+default like it is in B<sed> and B<awk>.)
Perl is, for the most part, a free-form language. (The only exception
to this is format declarations, for obvious reasons.) Text from a
@@ -29,11 +22,27 @@ interpreted either as division or pattern matching, depending on the
context, and C++ C<//> comments just look like a null regular
expression, so don't do that.
+=head2 Declarations
+
+The only things you need to declare in Perl are report formats
+and subroutines--and even undefined subroutines can be handled
+through AUTOLOAD. A variable holds the undefined value (C<undef>)
+until it has been assigned a defined value, which is anything
+other than C<undef>. When used as a number, C<undef> is treated
+as C<0>; when used as a string, it is treated the empty string,
+C<"">; and when used as a reference that isn't being assigned
+to, it is treated as an error. If you enable warnings, you'll
+be notified of an uninitialized value whenever you treat C<undef>
+as a string or a number. Well, usually. Boolean ("don't-care")
+contexts and operators such as C<++>, C<-->, C<+=>, C<-=>, and
+C<.=> are always exempt from such warnings.
+
A declaration can be put anywhere a statement can, but has no effect on
the execution of the primary sequence of statements--declarations all
take effect at compile time. Typically all the declarations are put at
the beginning or the end of the script. However, if you're using
-lexically-scoped private variables created with C<my()>, you'll have to make sure
+lexically-scoped private variables created with C<my()>, you'll
+have to make sure
your format or subroutine definition is within the same block scope
as the my if you expect to be able to access those private variables.
@@ -44,7 +53,7 @@ subroutine without defining it by saying C<sub name>, thus:
sub myname;
$me = myname $0 or die "can't get myname";
-Note that it functions as a list operator, not as a unary operator; so
+Note that my() functions as a list operator, not as a unary operator; so
be careful to use C<or> instead of C<||> in this case. However, if
you were to declare the subroutine as C<sub myname ($)>, then
C<myname> would function as a unary operator, so either C<or> or
@@ -86,7 +95,7 @@ presuming you're a speaker of English. The C<foreach> modifier is an
iterator: For each value in EXPR, it aliases C<$_> to the value and
executes the statement. The C<while> and C<until> modifiers have the
usual "C<while> loop" semantics (conditional evaluated first), except
-when applied to a C<do>-BLOCK (or to the now-deprecated C<do>-SUBROUTINE
+when applied to a C<do>-BLOCK (or to the deprecated C<do>-SUBROUTINE
statement), in which case the block executes once before the
conditional is evaluated. This is so that you can write loops like:
@@ -134,6 +143,7 @@ The following compound statements may be used to control flow:
LABEL while (EXPR) BLOCK continue BLOCK
LABEL for (EXPR; EXPR; EXPR) BLOCK
LABEL foreach VAR (LIST) BLOCK
+ LABEL foreach VAR (LIST) BLOCK continue BLOCK
LABEL BLOCK continue BLOCK
Note that, unlike C and Pascal, these are defined in terms of BLOCKs,
@@ -154,13 +164,17 @@ C<if> an C<else> goes with. If you use C<unless> in place of C<if>,
the sense of the test is reversed.
The C<while> statement executes the block as long as the expression is
-true (does not evaluate to the null string (C<"">) or C<0> or C<"0")>. The LABEL is
-optional, and if present, consists of an identifier followed by a colon.
-The LABEL identifies the loop for the loop control statements C<next>,
-C<last>, and C<redo>. If the LABEL is omitted, the loop control statement
+true (does not evaluate to the null string C<""> or C<0> or C<"0">).
+The LABEL is optional, and if present, consists of an identifier followed
+by a colon. The LABEL identifies the loop for the loop control
+statements C<next>, C<last>, and C<redo>.
+If the LABEL is omitted, the loop control statement
refers to the innermost enclosing loop. This may include dynamically
looking back your call-stack at run time to find the LABEL. Such
-desperate behavior triggers a warning if you use the B<-w> flag.
+desperate behavior triggers a warning if you use the C<use warnings>
+praga or the B<-w> flag.
+Unlike a C<foreach> statement, a C<while> statement never implicitly
+localises any variables.
If there is a C<continue> BLOCK, it is always executed just before the
conditional is about to be evaluated again, just like the third part of a
@@ -289,9 +303,7 @@ is therefore visible only within the loop. Otherwise, the variable is
implicitly local to the loop and regains its former value upon exiting
the loop. If the variable was previously declared with C<my>, it uses
that variable instead of the global one, but it's still localized to
-the loop. (Note that a lexically scoped variable can cause problems
-if you have subroutine or format declarations within the loop which
-refer to it.)
+the loop.
The C<foreach> keyword is actually a synonym for the C<for> keyword, so
you can use C<foreach> for readability or C<for> for brevity. (Or because
@@ -312,7 +324,7 @@ Examples:
for (@ary) { s/foo/bar/ }
- foreach my $elem (@elements) {
+ for my $elem (@elements) {
$elem *= 2;
}
@@ -341,8 +353,8 @@ Here's how a C programmer might code up a particular algorithm in Perl:
Whereas here's how a Perl programmer more comfortable with the idiom might
do it:
- OUTER: foreach my $wid (@ary1) {
- INNER: foreach my $jet (@ary2) {
+ OUTER: for my $wid (@ary1) {
+ INNER: for my $jet (@ary2) {
next OUTER if $wid > $jet;
$wid += $jet;
}
@@ -490,15 +502,15 @@ C<HTTP_USER_AGENT> envariable.
That kind of switch statement only works when you know the C<&&> clauses
will be true. If you don't, the previous C<?:> example should be used.
-You might also consider writing a hash instead of synthesizing a C<switch>
-statement.
+You might also consider writing a hash of subroutine references
+instead of synthesizing a C<switch> statement.
=head2 Goto
-Although not for the faint of heart, Perl does support a C<goto> statement.
-A loop's LABEL is not actually a valid target for a C<goto>;
-it's just the name of the loop. There are three forms: C<goto>-LABEL,
-C<goto>-EXPR, and C<goto>-&NAME.
+Although not for the faint of heart, Perl does support a C<goto>
+statement. There are three forms: C<goto>-LABEL, C<goto>-EXPR, and
+C<goto>-&NAME. A loop's LABEL is not actually a valid target for
+a C<goto>; it's just the name of the loop.
The C<goto>-LABEL form finds the statement labeled with LABEL and resumes
execution there. It may not be used to go into any construct that
@@ -513,7 +525,7 @@ The C<goto>-EXPR form expects a label name, whose scope will be resolved
dynamically. This allows for computed C<goto>s per FORTRAN, but isn't
necessarily recommended if you're optimizing for maintainability:
- goto ("FOO", "BAR", "GLARCH")[$i];
+ goto(("FOO", "BAR", "GLARCH")[$i]);
The C<goto>-&NAME form is highly magical, and substitutes a call to the
named subroutine for the currently running subroutine. This is used by
@@ -582,7 +594,7 @@ this, one can control Perl's idea of filenames and line numbers in
error or warning messages (especially for strings that are processed
with C<eval()>). The syntax for this mechanism is the same as for most
C preprocessors: it matches the regular expression
-C</^#\s*line\s+(\d+)\s*(?:\s"([^"]*)")?/> with C<$1> being the line
+C</^#\s*line\s+(\d+)\s*(?:\s"([^"]+)")?\s*$/> with C<$1> being the line
number for the next line, and C<$2> being the optional filename
(specified within quotes).
diff --git a/contrib/perl5/pod/perlthrtut.pod b/contrib/perl5/pod/perlthrtut.pod
index f2ca3bd..0f15d57 100644
--- a/contrib/perl5/pod/perlthrtut.pod
+++ b/contrib/perl5/pod/perlthrtut.pod
@@ -4,8 +4,16 @@ perlthrtut - tutorial on threads in Perl
=head1 DESCRIPTION
+ WARNING: Threading is an experimental feature. Both the interface
+ and implementation are subject to change drastically. In fact, this
+ documentation describes the flavor of threads that was in version
+ 5.005. Perl 5.6.0 and later have the beginnings of support for
+ interpreter threads, which (when finished) is expected to be
+ significantly different from what is described here. The information
+ contained here may therefore soon be obsolete. Use at your own risk!
+
One of the most prominent new features of Perl 5.005 is the inclusion
-of threads. Threads make a number of things a lot easier, and are a
+of threads. Threads make a number of things a lot easier, and are a
very useful addition to your bag of programming tricks.
=head1 What Is A Thread Anyway?
@@ -14,44 +22,44 @@ A thread is a flow of control through a program with a single
execution point.
Sounds an awful lot like a process, doesn't it? Well, it should.
-Threads are one of the pieces of a process. Every process has at least
+Threads are one of the pieces of a process. Every process has at least
one thread and, up until now, every process running Perl had only one
-thread. With 5.005, though, you can create extra threads. We're going
+thread. With 5.005, though, you can create extra threads. We're going
to show you how, when, and why.
=head1 Threaded Program Models
There are three basic ways that you can structure a threaded
-program. Which model you choose depends on what you need your program
-to do. For many non-trivial threaded programs you'll need to choose
+program. Which model you choose depends on what you need your program
+to do. For many non-trivial threaded programs you'll need to choose
different models for different pieces of your program.
=head2 Boss/Worker
The boss/worker model usually has one `boss' thread and one or more
-`worker' threads. The boss thread gathers or generates tasks that need
+`worker' threads. The boss thread gathers or generates tasks that need
to be done, then parcels those tasks out to the appropriate worker
thread.
This model is common in GUI and server programs, where a main thread
waits for some event and then passes that event to the appropriate
-worker threads for processing. Once the event has been passed on, the
+worker threads for processing. Once the event has been passed on, the
boss thread goes back to waiting for another event.
-The boss thread does relatively little work. While tasks aren't
+The boss thread does relatively little work. While tasks aren't
necessarily performed faster than with any other method, it tends to
have the best user-response times.
=head2 Work Crew
In the work crew model, several threads are created that do
-essentially the same thing to different pieces of data. It closely
+essentially the same thing to different pieces of data. It closely
mirrors classical parallel processing and vector processors, where a
large array of processors do the exact same thing to many pieces of
data.
This model is particularly useful if the system running the program
-will distribute multiple threads across different processors. It can
+will distribute multiple threads across different processors. It can
also be useful in ray tracing or rendering engines, where the
individual threads can pass on interim results to give the user visual
feedback.
@@ -60,29 +68,29 @@ feedback.
The pipeline model divides up a task into a series of steps, and
passes the results of one step on to the thread processing the
-next. Each thread does one thing to each piece of data and passes the
+next. Each thread does one thing to each piece of data and passes the
results to the next thread in line.
This model makes the most sense if you have multiple processors so two
or more threads will be executing in parallel, though it can often
-make sense in other contexts as well. It tends to keep the individual
+make sense in other contexts as well. It tends to keep the individual
tasks small and simple, as well as allowing some parts of the pipeline
to block (on I/O or system calls, for example) while other parts keep
-going. If you're running different parts of the pipeline on different
+going. If you're running different parts of the pipeline on different
processors you may also take advantage of the caches on each
processor.
This model is also handy for a form of recursive programming where,
rather than having a subroutine call itself, it instead creates
-another thread. Prime and Fibonacci generators both map well to this
+another thread. Prime and Fibonacci generators both map well to this
form of the pipeline model. (A version of a prime number generator is
presented later on.)
=head1 Native threads
-There are several different ways to implement threads on a system. How
+There are several different ways to implement threads on a system. How
threads are implemented depends both on the vendor and, in some cases,
-the version of the operating system. Often the first implementation
+the version of the operating system. Often the first implementation
will be relatively simple, but later versions of the OS will be more
sophisticated.
@@ -93,42 +101,42 @@ There are three basic categories of threads-user-mode threads, kernel
threads, and multiprocessor kernel threads.
User-mode threads are threads that live entirely within a program and
-its libraries. In this model, the OS knows nothing about threads. As
+its libraries. In this model, the OS knows nothing about threads. As
far as it's concerned, your process is just a process.
This is the easiest way to implement threads, and the way most OSes
-start. The big disadvantage is that, since the OS knows nothing about
-threads, if one thread blocks they all do. Typical blocking activities
+start. The big disadvantage is that, since the OS knows nothing about
+threads, if one thread blocks they all do. Typical blocking activities
include most system calls, most I/O, and things like sleep().
-Kernel threads are the next step in thread evolution. The OS knows
+Kernel threads are the next step in thread evolution. The OS knows
about kernel threads, and makes allowances for them. The main
difference between a kernel thread and a user-mode thread is
-blocking. With kernel threads, things that block a single thread don't
-block other threads. This is not the case with user-mode threads,
+blocking. With kernel threads, things that block a single thread don't
+block other threads. This is not the case with user-mode threads,
where the kernel blocks at the process level and not the thread level.
This is a big step forward, and can give a threaded program quite a
performance boost over non-threaded programs. Threads that block
performing I/O, for example, won't block threads that are doing other
-things. Each process still has only one thread running at once,
+things. Each process still has only one thread running at once,
though, regardless of how many CPUs a system might have.
Since kernel threading can interrupt a thread at any time, they will
uncover some of the implicit locking assumptions you may make in your
-program. For example, something as simple as C<$a = $a + 2> can behave
-unpredictably with kernel threads if C<$a> is visible to other
-threads, as another thread may have changed C<$a> between the time it
+program. For example, something as simple as C<$a = $a + 2> can behave
+unpredictably with kernel threads if $a is visible to other
+threads, as another thread may have changed $a between the time it
was fetched on the right hand side and the time the new value is
stored.
Multiprocessor Kernel Threads are the final step in thread
-support. With multiprocessor kernel threads on a machine with multiple
+support. With multiprocessor kernel threads on a machine with multiple
CPUs, the OS may schedule two or more threads to run simultaneously on
different CPUs.
This can give a serious performance boost to your threaded program,
-since more than one thread will be executing at the same time. As a
+since more than one thread will be executing at the same time. As a
tradeoff, though, any of those nagging synchronization issues that
might not have shown with basic kernel threads will appear with a
vengeance.
@@ -138,14 +146,14 @@ different OSes (and different thread implementations for a particular
OS) allocate CPU cycles to threads in different ways.
Cooperative multitasking systems have running threads give up control
-if one of two things happen. If a thread calls a yield function, it
-gives up control. It also gives up control if the thread does
-something that would cause it to block, such as perform I/O. In a
+if one of two things happen. If a thread calls a yield function, it
+gives up control. It also gives up control if the thread does
+something that would cause it to block, such as perform I/O. In a
cooperative multitasking implementation, one thread can starve all the
others for CPU time if it so chooses.
Preemptive multitasking systems interrupt threads at regular intervals
-while the system decides which thread should run next. In a preemptive
+while the system decides which thread should run next. In a preemptive
multitasking system, one thread usually won't monopolize the CPU.
On some systems, there can be cooperative and preemptive threads
@@ -156,18 +164,18 @@ normal priorities behave preemptively.)
=head1 What kind of threads are perl threads?
If you have experience with other thread implementations, you might
-find that things aren't quite what you expect. It's very important to
+find that things aren't quite what you expect. It's very important to
remember when dealing with Perl threads that Perl Threads Are Not X
Threads, for all values of X. They aren't POSIX threads, or
-DecThreads, or Java's Green threads, or Win32 threads. There are
+DecThreads, or Java's Green threads, or Win32 threads. There are
similarities, and the broad concepts are the same, but if you start
looking for implementation details you're going to be either
-disappointed or confused. Possibly both.
+disappointed or confused. Possibly both.
This is not to say that Perl threads are completely different from
-everything that's ever come before--they're not. Perl's threading
-model owes a lot to other thread models, especially POSIX. Just as
-Perl is not C, though, Perl threads are not POSIX threads. So if you
+everything that's ever come before--they're not. Perl's threading
+model owes a lot to other thread models, especially POSIX. Just as
+Perl is not C, though, Perl threads are not POSIX threads. So if you
find yourself looking for mutexes, or thread priorities, it's time to
step back a bit and think about what you want to do and how Perl can
do it.
@@ -175,28 +183,28 @@ do it.
=head1 Threadsafe Modules
The addition of threads has changed Perl's internals
-substantially. There are implications for people who write
-modules--especially modules with XS code or external libraries. While
+substantially. There are implications for people who write
+modules--especially modules with XS code or external libraries. While
most modules won't encounter any problems, modules that aren't
explicitly tagged as thread-safe should be tested before being used in
production code.
Not all modules that you might use are thread-safe, and you should
always assume a module is unsafe unless the documentation says
-otherwise. This includes modules that are distributed as part of the
-core. Threads are a beta feature, and even some of the standard
+otherwise. This includes modules that are distributed as part of the
+core. Threads are a beta feature, and even some of the standard
modules aren't thread-safe.
If you're using a module that's not thread-safe for some reason, you
can protect yourself by using semaphores and lots of programming
-discipline to control access to the module. Semaphores are covered
+discipline to control access to the module. Semaphores are covered
later in the article. Perl Threads Are Different
=head1 Thread Basics
The core Thread module provides the basic functions you need to write
-threaded programs. In the following sections we'll cover the basics,
-showing you what you need to do to create a threaded program. After
+threaded programs. In the following sections we'll cover the basics,
+showing you what you need to do to create a threaded program. After
that, we'll go over some of the features of the Thread module that
make threaded programming easier.
@@ -208,7 +216,7 @@ your programs are compiled. If your Perl wasn't compiled with thread
support enabled, then any attempt to use threads will fail.
Remember that the threading support in 5.005 is in beta release, and
-should be treated as such. You should expect that it may not function
+should be treated as such. You should expect that it may not function
entirely properly, and the thread interface may well change some
before it is a fully supported, production release. The beta version
shouldn't be used for mission-critical projects. Having said that,
@@ -237,13 +245,13 @@ have code like this:
Since code that runs both with and without threads is usually pretty
messy, it's best to isolate the thread-specific code in its own
-module. In our example above, that's what MyMod_threaded is, and it's
+module. In our example above, that's what MyMod_threaded is, and it's
only imported if we're running on a threaded Perl.
=head2 Creating Threads
The Thread package provides the tools you need to create new
-threads. Like any other module, you need to tell Perl you want to use
+threads. Like any other module, you need to tell Perl you want to use
it; use Thread imports all the pieces you need to create basic
threads.
@@ -258,11 +266,11 @@ The simplest, straightforward way to create a thread is with new():
}
The new() method takes a reference to a subroutine and creates a new
-thread, which starts executing in the referenced subroutine. Control
+thread, which starts executing in the referenced subroutine. Control
then passes both to the subroutine and the caller.
If you need to, your program can pass parameters to the subroutine as
-part of the thread startup. Just include the list of parameters as
+part of the thread startup. Just include the list of parameters as
part of the C<Thread::new> call, like this:
use Thread;
@@ -281,8 +289,8 @@ part of the C<Thread::new> call, like this:
The subroutine runs like a normal Perl subroutine, and the call to new
Thread returns whatever the subroutine returns.
-The last example illustrates another feature of threads. You can spawn
-off several threads using the same subroutine. Each thread executes
+The last example illustrates another feature of threads. You can spawn
+off several threads using the same subroutine. Each thread executes
the same subroutine, but in a separate thread with a separate
environment and potentially separate arguments.
@@ -305,22 +313,22 @@ spin off a chunk of code like eval(), but into its own thread:
You'll notice we did a use Thread qw(async) in that example. async is
not exported by default, so if you want it, you'll either need to
import it before you use it or fully qualify it as
-Thread::async. You'll also note that there's a semicolon after the
-closing brace. That's because async() treats the following block as an
+Thread::async. You'll also note that there's a semicolon after the
+closing brace. That's because async() treats the following block as an
anonymous subroutine, so the semicolon is necessary.
Like eval(), the code executes in the same context as it would if it
-weren't spun off. Since both the code inside and after the async start
-executing, you need to be careful with any shared resources. Locking
+weren't spun off. Since both the code inside and after the async start
+executing, you need to be careful with any shared resources. Locking
and other synchronization techniques are covered later.
=head2 Giving up control
There are times when you may find it useful to have a thread
-explicitly give up the CPU to another thread. Your threading package
+explicitly give up the CPU to another thread. Your threading package
might not support preemptive multitasking for threads, for example, or
you may be doing something compute-intensive and want to make sure
-that the user-interface thread gets called frequently. Regardless,
+that the user-interface thread gets called frequently. Regardless,
there are times that you might want a thread to give up the processor.
Perl's threading package provides the yield() function that does
@@ -344,7 +352,7 @@ this. yield() is pretty straightforward, and works like this:
=head2 Waiting For A Thread To Exit
-Since threads are also subroutines, they can return values. To wait
+Since threads are also subroutines, they can return values. To wait
for a thread to exit and extract any scalars it might return, you can
use the join() method.
@@ -357,11 +365,11 @@ use the join() method.
sub sub1 { return "Fifty-six", "foo", 2; }
In the example above, the join() method returns as soon as the thread
-ends. In addition to waiting for a thread to finish and gathering up
+ends. In addition to waiting for a thread to finish and gathering up
any values that the thread might have returned, join() also performs
any OS cleanup necessary for the thread. That cleanup might be
important, especially for long-running programs that spawn lots of
-threads. If you don't want the return values and don't want to wait
+threads. If you don't want the return values and don't want to wait
for the thread to finish, you should call the detach() method
instead. detach() is covered later in the article.
@@ -369,7 +377,7 @@ instead. detach() is covered later in the article.
So what happens when an error occurs in a thread? Any errors that
could be caught with eval() are postponed until the thread is
-joined. If your program never joins, the errors appear when your
+joined. If your program never joins, the errors appear when your
program exits.
Errors deferred until a join() can be caught with eval():
@@ -389,13 +397,13 @@ to get them.
=head2 Ignoring A Thread
-join() does three things:it waits for a thread to exit, cleans up
-after it, and returns any data the thread may have produced. But what
+join() does three things: it waits for a thread to exit, cleans up
+after it, and returns any data the thread may have produced. But what
if you're not interested in the thread's return values, and you don't
really care when the thread finishes? All you want is for the thread
to get cleaned up after when it's done.
-In this case, you use the detach() method. Once a thread is detached,
+In this case, you use the detach() method. Once a thread is detached,
it'll run until it's finished, then Perl will clean up after it
automatically.
@@ -421,29 +429,29 @@ lost.
=head1 Threads And Data
Now that we've covered the basics of threads, it's time for our next
-topic: data. Threading introduces a couple of complications to data
+topic: data. Threading introduces a couple of complications to data
access that non-threaded programs never need to worry about.
=head2 Shared And Unshared Data
The single most important thing to remember when using threads is that
all threads potentially have access to all the data anywhere in your
-program. While this is true with a nonthreaded Perl program as well,
+program. While this is true with a nonthreaded Perl program as well,
it's especially important to remember with a threaded program, since
more than one thread can be accessing this data at once.
Perl's scoping rules don't change because you're using threads. If a
subroutine (or block, in the case of async()) could see a variable if
-you weren't running with threads, it can see it if you are. This is
-especially important for the subroutines that create, and makes my
-variables even more important. Remember--if your variables aren't
-lexically scoped (declared with C<my>) you're probably sharing it between
-threads.
+you weren't running with threads, it can see it if you are. This is
+especially important for the subroutines that create, and makes C<my>
+variables even more important. Remember--if your variables aren't
+lexically scoped (declared with C<my>) you're probably sharing them
+between threads.
=head2 Thread Pitfall: Races
While threads bring a new set of useful tools, they also bring a
-number of pitfalls. One pitfall is the race condition:
+number of pitfalls. One pitfall is the race condition:
use Thread;
$a = 1;
@@ -458,14 +466,14 @@ number of pitfalls. One pitfall is the race condition:
What do you think $a will be? The answer, unfortunately, is "it
depends." Both sub1() and sub2() access the global variable $a, once
-to read and once to write. Depending on factors ranging from your
+to read and once to write. Depending on factors ranging from your
thread implementation's scheduling algorithm to the phase of the moon,
$a can be 2 or 3.
Race conditions are caused by unsynchronized access to shared
-data. Without explicit synchronization, there's no way to be sure that
+data. Without explicit synchronization, there's no way to be sure that
nothing has happened to the shared data between the time you access it
-and the time you update it. Even this simple code fragment has the
+and the time you update it. Even this simple code fragment has the
possibility of error:
use Thread qw(async);
@@ -473,8 +481,8 @@ possibility of error:
async{ $b = $a; $a = $b + 1; };
async{ $c = $a; $a = $c + 1; };
-Two threads both access $a. Each thread can potentially be interrupted
-at any point, or be executed in any order. At the end, $a could be 3
+Two threads both access $a. Each thread can potentially be interrupted
+at any point, or be executed in any order. At the end, $a could be 3
or 4, and both $b and $c could be 2 or 3.
Whenever your program accesses data or resources that can be accessed
@@ -484,9 +492,9 @@ data corruption and race conditions.
=head2 Controlling access: lock()
The lock() function takes a variable (or subroutine, but we'll get to
-that later) and puts a lock on it. No other thread may lock the
+that later) and puts a lock on it. No other thread may lock the
variable until the locking thread exits the innermost block containing
-the lock. Using lock() is straightforward:
+the lock. Using lock() is straightforward:
use Thread qw(async);
$a = 4;
@@ -513,29 +521,29 @@ the lock. Using lock() is straightforward:
print "\$a is $a\n";
lock() blocks the thread until the variable being locked is
-available. When lock() returns, your thread can be sure that no other
+available. When lock() returns, your thread can be sure that no other
thread can lock that variable until the innermost block containing the
lock exits.
It's important to note that locks don't prevent access to the variable
-in question, only lock attempts. This is in keeping with Perl's
+in question, only lock attempts. This is in keeping with Perl's
longstanding tradition of courteous programming, and the advisory file
-locking that flock() gives you. Locked subroutines behave differently,
-however. We'll cover that later in the article.
+locking that flock() gives you. Locked subroutines behave differently,
+however. We'll cover that later in the article.
-You may lock arrays and hashes as well as scalars. Locking an array,
+You may lock arrays and hashes as well as scalars. Locking an array,
though, will not block subsequent locks on array elements, just lock
attempts on the array itself.
Finally, locks are recursive, which means it's okay for a thread to
-lock a variable more than once. The lock will last until the outermost
+lock a variable more than once. The lock will last until the outermost
lock() on the variable goes out of scope.
=head2 Thread Pitfall: Deadlocks
-Locks are a handy tool to synchronize access to data. Using them
-properly is the key to safe shared data. Unfortunately, locks aren't
-without their dangers. Consider the following code:
+Locks are a handy tool to synchronize access to data. Using them
+properly is the key to safe shared data. Unfortunately, locks aren't
+without their dangers. Consider the following code:
use Thread qw(async yield);
$a = 4;
@@ -553,34 +561,34 @@ without their dangers. Consider the following code:
lock ($a);
};
-This program will probably hang until you kill it. The only way it
+This program will probably hang until you kill it. The only way it
won't hang is if one of the two async() routines acquires both locks
-first. A guaranteed-to-hang version is more complicated, but the
+first. A guaranteed-to-hang version is more complicated, but the
principle is the same.
The first thread spawned by async() will grab a lock on $a then, a
-second or two later, try to grab a lock on $b. Meanwhile, the second
-thread grabs a lock on $b, then later tries to grab a lock on $a. The
+second or two later, try to grab a lock on $b. Meanwhile, the second
+thread grabs a lock on $b, then later tries to grab a lock on $a. The
second lock attempt for both threads will block, each waiting for the
other to release its lock.
This condition is called a deadlock, and it occurs whenever two or
more threads are trying to get locks on resources that the others
-own. Each thread will block, waiting for the other to release a lock
-on a resource. That never happens, though, since the thread with the
+own. Each thread will block, waiting for the other to release a lock
+on a resource. That never happens, though, since the thread with the
resource is itself waiting for a lock to be released.
-There are a number of ways to handle this sort of problem. The best
+There are a number of ways to handle this sort of problem. The best
way is to always have all threads acquire locks in the exact same
-order. If, for example, you lock variables $a, $b, and $c, always lock
-$a before $b, and $b before $c. It's also best to hold on to locks for
+order. If, for example, you lock variables $a, $b, and $c, always lock
+$a before $b, and $b before $c. It's also best to hold on to locks for
as short a period of time to minimize the risks of deadlock.
=head2 Queues: Passing Data Around
A queue is a special thread-safe object that lets you put data in one
end and take it out the other without having to worry about
-synchronization issues. They're pretty straightforward, and look like
+synchronization issues. They're pretty straightforward, and look like
this:
use Thread qw(async);
@@ -599,13 +607,13 @@ this:
sleep 10;
$DataQueue->enqueue(undef);
-You create the queue with new Thread::Queue. Then you can add lists of
+You create the queue with new Thread::Queue. Then you can add lists of
scalars onto the end with enqueue(), and pop scalars off the front of
-it with dequeue(). A queue has no fixed size, and can grow as needed
+it with dequeue(). A queue has no fixed size, and can grow as needed
to hold everything pushed on to it.
If a queue is empty, dequeue() blocks until another thread enqueues
-something. This makes queues ideal for event loops and other
+something. This makes queues ideal for event loops and other
communications between threads.
=head1 Threads And Code
@@ -617,10 +625,10 @@ entire subroutines.
=head2 Semaphores: Synchronizing Data Access
-Semaphores are a kind of generic locking mechanism. Unlike lock, which
+Semaphores are a kind of generic locking mechanism. Unlike lock, which
gets a lock on a particular scalar, Perl doesn't associate any
particular thing with a semaphore so you can use them to control
-access to anything you like. In addition, semaphores can allow more
+access to anything you like. In addition, semaphores can allow more
than one thread to access a resource at once, though by default
semaphores only allow one thread access at a time.
@@ -630,7 +638,7 @@ semaphores only allow one thread access at a time.
Semaphores have two methods, down and up. down decrements the resource
count, while up increments it. down calls will block if the
-semaphore's current count would decrement below zero. This program
+semaphore's current count would decrement below zero. This program
gives a quick demonstration:
use Thread qw(yield);
@@ -659,20 +667,20 @@ gives a quick demonstration:
}
}
-The three invocations of the subroutine all operate in sync. The
+The three invocations of the subroutine all operate in sync. The
semaphore, though, makes sure that only one thread is accessing the
global variable at once.
=item Advanced Semaphores
By default, semaphores behave like locks, letting only one thread
-down() them at a time. However, there are other uses for semaphores.
+down() them at a time. However, there are other uses for semaphores.
Each semaphore has a counter attached to it. down() decrements the
-counter and up() increments the counter. By default, semaphores are
+counter and up() increments the counter. By default, semaphores are
created with the counter set to one, down() decrements by one, and
-up() increments by one. If down() attempts to decrement the counter
-below zero, it blocks until the counter is large enough. Note that
+up() increments by one. If down() attempts to decrement the counter
+below zero, it blocks until the counter is large enough. Note that
while a semaphore can be created with a starting count of zero, any
up() or down() always changes the counter by at least
one. $semaphore->down(0) is the same as $semaphore->down(1).
@@ -680,21 +688,21 @@ one. $semaphore->down(0) is the same as $semaphore->down(1).
The question, of course, is why would you do something like this? Why
create a semaphore with a starting count that's not one, or why
decrement/increment it by more than one? The answer is resource
-availability. Many resources that you want to manage access for can be
+availability. Many resources that you want to manage access for can be
safely used by more than one thread at once.
-For example, let's take a GUI driven program. It has a semaphore that
+For example, let's take a GUI driven program. It has a semaphore that
it uses to synchronize access to the display, so only one thread is
-ever drawing at once. Handy, but of course you don't want any thread
-to start drawing until things are properly set up. In this case, you
+ever drawing at once. Handy, but of course you don't want any thread
+to start drawing until things are properly set up. In this case, you
can create a semaphore with a counter set to zero, and up it when
things are ready for drawing.
Semaphores with counters greater than one are also useful for
-establishing quotas. Say, for example, that you have a number of
-threads that can do I/O at once. You don't want all the threads
+establishing quotas. Say, for example, that you have a number of
+threads that can do I/O at once. You don't want all the threads
reading or writing at once though, since that can potentially swamp
-your I/O channels, or deplete your process' quota of filehandles. You
+your I/O channels, or deplete your process' quota of filehandles. You
can use a semaphore initialized to the number of concurrent I/O
requests (or open files) that you want at any one time, and have your
threads quietly block and unblock themselves.
@@ -707,14 +715,14 @@ thread needs to check out or return a number of resources at once.
=head2 Attributes: Restricting Access To Subroutines
In addition to synchronizing access to data or resources, you might
-find it useful to synchronize access to subroutines. You may be
+find it useful to synchronize access to subroutines. You may be
accessing a singular machine resource (perhaps a vector processor), or
find it easier to serialize calls to a particular subroutine than to
have a set of locks and sempahores.
-One of the additions to Perl 5.005 is subroutine attributes. The
+One of the additions to Perl 5.005 is subroutine attributes. The
Thread package uses these to provide several flavors of
-serialization. It's important to remember that these attributes are
+serialization. It's important to remember that these attributes are
used in the compilation phase of your program so you can't change a
subroutine's behavior while your program is actually running.
@@ -722,14 +730,13 @@ subroutine's behavior while your program is actually running.
The basic subroutine lock looks like this:
- sub test_sub {
- use attrs qw(locked);
+ sub test_sub :locked {
}
This ensures that only one thread will be executing this subroutine at
-any one time. Once a thread calls this subroutine, any other thread
+any one time. Once a thread calls this subroutine, any other thread
that calls it will block until the thread in the subroutine exits
-it. A more elaborate example looks like this:
+it. A more elaborate example looks like this:
use Thread qw(yield);
@@ -738,8 +745,7 @@ it. A more elaborate example looks like this:
new Thread \&thread_sub, 3;
new Thread \&thread_sub, 4;
- sub sync_sub {
- use attrs qw(locked);
+ sub sync_sub :locked {
my $CallingThread = shift @_;
print "In sync_sub for thread $CallingThread\n";
yield;
@@ -754,16 +760,16 @@ it. A more elaborate example looks like this:
print "$ThreadID is done with sync_sub\n";
}
-The use attrs qw(locked) locks sync_sub(), and if you run this, you
-can see that only one thread is in it at any one time.
+The C<locked> attribute tells perl to lock sync_sub(), and if you run
+this, you can see that only one thread is in it at any one time.
=head2 Methods
Locking an entire subroutine can sometimes be overkill, especially
-when dealing with Perl objects. When calling a method for an object,
+when dealing with Perl objects. When calling a method for an object,
for example, you want to serialize calls to a method, so that only one
thread will be in the subroutine for a particular object, but threads
-calling that subroutine for a different object aren't blocked. The
+calling that subroutine for a different object aren't blocked. The
method attribute indicates whether the subroutine is really a method.
use Thread;
@@ -793,8 +799,7 @@ method attribute indicates whether the subroutine is really a method.
return bless [@_], $class;
}
- sub per_object {
- use attrs qw(locked method);
+ sub per_object :locked :method {
my ($class, $thrnum) = @_;
print "In per_object for thread $thrnum\n";
yield;
@@ -802,8 +807,7 @@ method attribute indicates whether the subroutine is really a method.
print "Exiting per_object for thread $thrnum\n";
}
- sub one_at_a_time {
- use attrs qw(locked);
+ sub one_at_a_time :locked {
my ($class, $thrnum) = @_;
print "In one_at_a_time for thread $thrnum\n";
yield;
@@ -817,25 +821,25 @@ thread is ever in one_at_a_time() at once.
=head2 Locking A Subroutine
-You can lock a subroutine as you would lock a variable. Subroutine
-locks work the same as a C<use attrs qw(locked)> in the subroutine,
+You can lock a subroutine as you would lock a variable. Subroutine locks
+work the same as specifying a C<locked> attribute for the subroutine,
and block all access to the subroutine for other threads until the
-lock goes out of scope. When the subroutine isn't locked, any number
+lock goes out of scope. When the subroutine isn't locked, any number
of threads can be in it at once, and getting a lock on a subroutine
-doesn't affect threads already in the subroutine. Getting a lock on a
+doesn't affect threads already in the subroutine. Getting a lock on a
subroutine looks like this:
lock(\&sub_to_lock);
-Simple enough. Unlike use attrs, which is a compile time option,
-locking and unlocking a subroutine can be done at runtime at your
-discretion. There is some runtime penalty to using lock(\&sub) instead
-of use attrs qw(locked), so make sure you're choosing the proper
+Simple enough. Unlike the C<locked> attribute, which is a compile time
+option, locking and unlocking a subroutine can be done at runtime at your
+discretion. There is some runtime penalty to using lock(\&sub) instead
+of the C<locked> attribute, so make sure you're choosing the proper
method to do the locking.
You'd choose lock(\&sub) when writing modules and code to run on both
threaded and unthreaded Perl, especially for code that will run on
-5.004 or earlier Perls. In that case, it's useful to have subroutines
+5.004 or earlier Perls. In that case, it's useful to have subroutines
that should be serialized lock themselves if they're running threaded,
like so:
@@ -855,20 +859,20 @@ version of Perl you're running.
We've covered the workhorse parts of Perl's threading package, and
with these tools you should be well on your way to writing threaded
-code and packages. There are a few useful little pieces that didn't
+code and packages. There are a few useful little pieces that didn't
really fit in anyplace else.
=head2 What Thread Am I In?
The Thread->self method provides your program with a way to get an
-object representing the thread it's currently in. You can use this
+object representing the thread it's currently in. You can use this
object in the same way as the ones returned from the thread creation.
=head2 Thread IDs
tid() is a thread object method that returns the thread ID of the
-thread the object represents. Thread IDs are integers, with the main
-thread in a program being 0. Currently Perl assigns a unique tid to
+thread the object represents. Thread IDs are integers, with the main
+thread in a program being 0. Currently Perl assigns a unique tid to
every thread ever created in your program, assigning the first thread
to be created a tid of 1, and increasing the tid by 1 for each new
thread that's created.
@@ -881,7 +885,7 @@ if the objects represent the same thread, and false if they don't.
=head2 What Threads Are Running?
Thread->list returns a list of thread objects, one for each thread
-that's currently running. Handy for a number of things, including
+that's currently running. Handy for a number of things, including
cleaning up at the end of your program:
# Loop through all the threads
@@ -892,14 +896,14 @@ cleaning up at the end of your program:
}
}
-The example above is just for illustration. It isn't strictly
+The example above is just for illustration. It isn't strictly
necessary to join all the threads you create, since Perl detaches all
the threads before it exits.
=head1 A Complete Example
Confused yet? It's time for an example program to show some of the
-things we've covered. This program finds prime numbers using threads.
+things we've covered. This program finds prime numbers using threads.
1 #!/usr/bin/perl -w
2 # prime-pthread, courtesy of Tom Christiansen
@@ -936,12 +940,12 @@ things we've covered. This program finds prime numbers using threads.
33 $kid->join() if $kid;
34 }
-This program uses the pipeline model to generate prime numbers. Each
+This program uses the pipeline model to generate prime numbers. Each
thread in the pipeline has an input queue that feeds numbers to be
checked, a prime number that it's responsible for, and an output queue
-that it funnels numbers that have failed the check into. If the thread
+that it funnels numbers that have failed the check into. If the thread
has a number that's failed its check and there's no child thread, then
-the thread must have found a new prime number. In that case, a new
+the thread must have found a new prime number. In that case, a new
child thread is created for that prime and stuck on the end of the
pipeline.
@@ -952,20 +956,20 @@ number is, it's a number that's only evenly divisible by itself and 1)
The bulk of the work is done by the check_num() subroutine, which
takes a reference to its input queue and a prime number that it's
-responsible for. After pulling in the input queue and the prime that
+responsible for. After pulling in the input queue and the prime that
the subroutine's checking (line 20), we create a new queue (line 22)
and reserve a scalar for the thread that we're likely to create later
(line 21).
The while loop from lines 23 to line 31 grabs a scalar off the input
queue and checks against the prime this thread is responsible
-for. Line 24 checks to see if there's a remainder when we modulo the
-number to be checked against our prime. If there is one, the number
+for. Line 24 checks to see if there's a remainder when we modulo the
+number to be checked against our prime. If there is one, the number
must not be evenly divisible by our prime, so we need to either pass
it on to the next thread if we've created one (line 26) or create a
new thread if we haven't.
-The new thread creation is line 29. We pass on to it a reference to
+The new thread creation is line 29. We pass on to it a reference to
the queue we've created, and the prime number we've found.
Finally, once the loop terminates (because we got a 0 or undef in the
@@ -975,18 +979,18 @@ child and wait for it to exit if we've created a child (Lines 32 and
Meanwhile, back in the main thread, we create a queue (line 9) and the
initial child thread (line 10), and pre-seed it with the first prime:
-2. Then we queue all the numbers from 3 to 1000 for checking (lines
+2. Then we queue all the numbers from 3 to 1000 for checking (lines
12-14), then queue a die notice (line 16) and wait for the first child
-thread to terminate (line 17). Because a child won't die until its
+thread to terminate (line 17). Because a child won't die until its
child has died, we know that we're done once we return from the join.
-That's how it works. It's pretty simple; as with many Perl programs,
+That's how it works. It's pretty simple; as with many Perl programs,
the explanation is much longer than the program.
=head1 Conclusion
A complete thread tutorial could fill a book (and has, many times),
-but this should get you well on your way. The final authority on how
+but this should get you well on your way. The final authority on how
Perl's threads behave is the documention bundled with the Perl
distribution, but with what we've covered in this article, you should
be well on your way to becoming a threaded Perl expert.
@@ -1046,7 +1050,7 @@ France, September 1992, Yves Bekkers and Jacques Cohen, eds. Springer,
Thanks (in no particular order) to Chaim Frenkel, Steve Fink, Gurusamy
Sarathy, Ilya Zakharevich, Benjamin Sugars, Jürgen Christoffel, Joshua
Pritikin, and Alan Burlison, for their help in reality-checking and
-polishing this article. Big thanks to Tom Christiansen for his rewrite
+polishing this article. Big thanks to Tom Christiansen for his rewrite
of the prime number generator.
=head1 AUTHOR
diff --git a/contrib/perl5/pod/perltie.pod b/contrib/perl5/pod/perltie.pod
index 6652658..c835738 100644
--- a/contrib/perl5/pod/perltie.pod
+++ b/contrib/perl5/pod/perltie.pod
@@ -184,11 +184,13 @@ methods: TIEARRAY, FETCH, STORE, FETCHSIZE, STORESIZE and perhaps DESTROY.
FETCHSIZE and STORESIZE are used to provide C<$#array> and
equivalent C<scalar(@array)> access.
-
-The methods POP, PUSH, SHIFT, UNSHIFT, SPLICE are required if the perl
-operator with the corresponding (but lowercase) name is to operate on the
-tied array. The B<Tie::Array> class can be used as a base class to implement
-these in terms of the basic five methods above.
+
+The methods POP, PUSH, SHIFT, UNSHIFT, SPLICE, DELETE, and EXISTS are
+required if the perl operator with the corresponding (but lowercase) name
+is to operate on the tied array. The B<Tie::Array> class can be used as a
+base class to implement the first five of these in terms of the basic
+methods above. The default implementations of DELETE and EXISTS in
+B<Tie::Array> simply C<croak>.
In addition EXTEND will be called when perl would have pre-extended
allocation in a real array.
@@ -621,7 +623,9 @@ This is partially implemented now.
A class implementing a tied filehandle should define the following
methods: TIEHANDLE, at least one of PRINT, PRINTF, WRITE, READLINE, GETC,
-READ, and possibly CLOSE and DESTROY.
+READ, and possibly CLOSE and DESTROY. The class can also provide: BINMODE,
+OPEN, EOF, FILENO, SEEK, TELL - if the corresponding perl operators are
+used on the handle.
It is especially useful when perl is embedded in some other program,
where output to STDOUT and STDERR may have to be redirected in some
@@ -739,6 +743,7 @@ a scalar.
package Remember;
use strict;
+ use warnings;
use IO::File;
sub TIESCALAR {
@@ -832,7 +837,7 @@ destructor (DESTROY) is called, which is normal for objects that have
no more valid references; and thus the file is closed.
In the second example, however, we have stored another reference to
-the tied object in C<$x>. That means that when untie() gets called
+the tied object in $x. That means that when untie() gets called
there will still be a valid reference to the object in existence, so
the destructor is not called at that time, and thus the file is not
closed. The reason there is no output is because the file buffers
@@ -841,7 +846,8 @@ have not been flushed to disk.
Now that you know what the problem is, what can you do to avoid it?
Well, the good old C<-w> flag will spot any instances where you call
untie() and there are still valid references to the tied object. If
-the second script above is run with the C<-w> flag, Perl prints this
+the second script above this near the top C<use warnings 'untie'>
+or was run with the C<-w> flag, Perl prints this
warning message:
untie attempted while 1 inner references still exist
diff --git a/contrib/perl5/pod/perltoc.pod b/contrib/perl5/pod/perltoc.pod
index 9dc0b36..798a24d 100644
--- a/contrib/perl5/pod/perltoc.pod
+++ b/contrib/perl5/pod/perltoc.pod
@@ -13,16 +13,23 @@ through to locate the proper section you're looking for.
=head2 perl - Practical Extraction and Report Language
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-Many usability enhancements, Simplified grammar, Lexical scoping,
-Arbitrarily nested data structures, Modularity and reusability,
-Object-oriented programming, Embeddable and Extensible, POSIX compliant,
-Package constructors and destructors, Multiple simultaneous DBM
-implementations, Subroutine definitions may now be autoloaded, Regular
-expression enhancements, Innumerable Unbundled Modules, Compilability
+modularity and reusability using innumerable modules, embeddable and
+extensible, roll-your-own magic variables (including multiple simultaneous
+DBM implementations), subroutines can now be overridden, autoloaded, and
+prototyped, arbitrarily nested data structures and anonymous functions,
+object-oriented programming, compilability into C code or Perl bytecode,
+support for light-weight processes (threads), support for
+internationalization, localization, and Unicode, lexical scoping, regular
+expression enhancements, enhanced debugger and interactive Perl
+environment, with integrated editor support, POSIX 1003.1 compliant library
+
+=item AVAILABILITY
=item ENVIRONMENT
@@ -38,16 +45,231 @@ expression enhancements, Innumerable Unbundled Modules, Compilability
=item NOTES
-=head2 perlfaq - frequently asked questions about Perl ($Date: 1998/07/20
-23:12:17 $)
+=back
+
+=head2 perlfaq - frequently asked questions about Perl ($Date: 1999/05/23
+20:38:02 $)
+
+=over
=item DESCRIPTION
perlfaq: Structural overview of the FAQ, L<perlfaq1>: General Questions
-About Perl, L<perlfaq2>: Obtaining and Learning about Perl, L<perlfaq3>:
-Programming Tools, L<perlfaq4>: Data Manipulation, L<perlfaq5>: Files and
-Formats, L<perlfaq6>: Regexps, L<perlfaq7>: General Perl Language Issues,
-L<perlfaq8>: System Interaction, L<perlfaq9>: Networking
+About Perl, What is Perl?, Who supports Perl? Who develops it? Why is it
+free?, Which version of Perl should I use?, What are perl4 and perl5?, What
+is perl6?, How stable is Perl?, Is Perl difficult to learn?, How does Perl
+compare with other languages like Java, Python, REXX, Scheme, or Tcl?, Can
+I do [task] in Perl?, When shouldn't I program in Perl?, What's the
+difference between "perl" and "Perl"?, Is it a Perl program or a Perl
+script?, What is a JAPH?, Where can I get a list of Larry Wall witticisms?,
+How can I convince my sysadmin/supervisor/employees to use version
+(5/5.005/Perl instead of some other language)?, L<perlfaq2>: Obtaining and
+Learning about Perl, What machines support Perl? Where do I get it?, How
+can I get a binary version of Perl?, I don't have a C compiler on my
+system. How can I compile perl?, I copied the Perl binary from one machine
+to another, but scripts don't work, I grabbed the sources and tried to
+compile but gdbm/dynamic loading/malloc/linking/... failed. How do I make
+it work?, What modules and extensions are available for Perl? What is
+CPAN? What does CPAN/src/... mean?, Is there an ISO or ANSI certified
+version of Perl?, Where can I get information on Perl?, What are the Perl
+newsgroups on USENET? Where do I post questions?, Where should I post
+source code?, Perl Books, Perl in Magazines, Perl on the Net: FTP and WWW
+Access, What mailing lists are there for perl?, Archives of
+comp.lang.perl.misc, Where can I buy a commercial version of Perl?, Where
+do I send bug reports?, What is perl.com?, L<perlfaq3>: Programming Tools,
+How do I do (anything)?, How can I use Perl interactively?, Is there a Perl
+shell?, How do I debug my Perl programs?, How do I profile my Perl
+programs?, How do I cross-reference my Perl programs?, Is there a
+pretty-printer (formatter) for Perl?, Is there a ctags for Perl?, Is there
+an IDE or Windows Perl Editor?, Where can I get Perl macros for vi?, Where
+can I get perl-mode for emacs?, How can I use curses with Perl?, How can I
+use X or Tk with Perl?, How can I generate simple menus without using CGI
+or Tk?, What is undump?, How can I make my Perl program run faster?, How
+can I make my Perl program take less memory?, Is it unsafe to return a
+pointer to local data?, How can I free an array or hash so my program
+shrinks?, How can I make my CGI script more efficient?, How can I hide the
+source for my Perl program?, How can I compile my Perl program into byte
+code or C?, How can I compile Perl into Java?, How can I get C<#!perl> to
+work on [MS-DOS,NT,...]?, Can I write useful perl programs on the command
+line?, Why don't perl one-liners work on my DOS/Mac/VMS system?, Where can
+I learn about CGI or Web programming in Perl?, Where can I learn about
+object-oriented Perl programming?, Where can I learn about linking C with
+Perl? [h2xs, xsubpp], I've read perlembed, perlguts, etc., but I can't
+embed perl inmy C program, what am I doing wrong?, When I tried to run my
+script, I got this message. What does itmean?, What's MakeMaker?,
+L<perlfaq4>: Data Manipulation, Why am I getting long decimals (eg,
+19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?,
+Why isn't my octal data interpreted correctly?, Does Perl have a round()
+function? What about ceil() and floor()? Trig functions?, How do I
+convert bits into ints?, Why doesn't & work the way I want it to?, How do I
+multiply matrices?, How do I perform an operation on a series of integers?,
+How can I output Roman numerals?, Why aren't my random numbers random?, How
+do I find the week-of-the-year/day-of-the-year?, How do I find the current
+century or millennium?, How can I compare two dates and find the
+difference?, How can I take a string and turn it into epoch seconds?, How
+can I find the Julian Day?, How do I find yesterday's date?, Does Perl have
+a year 2000 problem? Is Perl Y2K compliant?, How do I validate input?, How
+do I unescape a string?, How do I remove consecutive pairs of characters?,
+How do I expand function calls in a string?, How do I find matching/nesting
+anything?, How do I reverse a string?, How do I expand tabs in a string?,
+How do I reformat a paragraph?, How can I access/change the first N letters
+of a string?, How do I change the Nth occurrence of something?, How can I
+count the number of occurrences of a substring within a string?, How do I
+capitalize all the words on one line?, How can I split a [character]
+delimited string except when inside[character]? (Comma-separated files),
+How do I strip blank space from the beginning/end of a string?, How do I
+pad a string with blanks or pad a number with zeroes?, How do I extract
+selected columns from a string?, How do I find the soundex value of a
+string?, How can I expand variables in text strings?, What's wrong with
+always quoting "$vars"?, Why don't my <<HERE documents work?, What is the
+difference between a list and an array?, What is the difference between
+$array[1] and @array[1]?, How can I remove duplicate elements from a list
+or array?, How can I tell whether a list or array contains a certain
+element?, How do I compute the difference of two arrays? How do I compute
+the intersection of two arrays?, How do I test whether two arrays or hashes
+are equal?, How do I find the first array element for which a condition is
+true?, How do I handle linked lists?, How do I handle circular lists?, How
+do I shuffle an array randomly?, How do I process/modify each element of an
+array?, How do I select a random element from an array?, How do I permute N
+elements of a list?, How do I sort an array by (anything)?, How do I
+manipulate arrays of bits?, Why does defined() return true on empty arrays
+and hashes?, How do I process an entire hash?, What happens if I add or
+remove keys from a hash while iterating over it?, How do I look up a hash
+element by value?, How can I know how many entries are in a hash?, How do I
+sort a hash (optionally by value instead of key)?, How can I always keep my
+hash sorted?, What's the difference between "delete" and "undef" with
+hashes?, Why don't my tied hashes make the defined/exists distinction?, How
+do I reset an each() operation part-way through?, How can I get the unique
+keys from two hashes?, How can I store a multidimensional array in a DBM
+file?, How can I make my hash remember the order I put elements into it?,
+Why does passing a subroutine an undefined element in a hash create it?,
+How can I make the Perl equivalent of a C structure/C++ class/hash or array
+of hashes or arrays?, How can I use a reference as a hash key?, How do I
+handle binary data correctly?, How do I determine whether a scalar is a
+number/whole/integer/float?, How do I keep persistent data across program
+calls?, How do I print out or copy a recursive data structure?, How do I
+define methods for every class/object?, How do I verify a credit card
+checksum?, How do I pack arrays of doubles or floats for XS code?,
+L<perlfaq5>: Files and Formats, How do I flush/unbuffer an output
+filehandle? Why must I do this?, How do I change one line in a file/delete
+a line in a file/insert a line in the middle of a file/append to the
+beginning of a file?, How do I count the number of lines in a file?, How do
+I make a temporary file name?, How can I manipulate fixed-record-length
+files?, How can I make a filehandle local to a subroutine? How do I pass
+filehandles between subroutines? How do I make an array of filehandles?,
+How can I use a filehandle indirectly?, How can I set up a footer format to
+be used with write()?, How can I write() into a string?, How can I output
+my numbers with commas added?, How can I translate tildes (~) in a
+filename?, How come when I open a file read-write it wipes it out?, Why do
+I sometimes get an "Argument list too long" when I use <*>?, Is there a
+leak/bug in glob()?, How can I open a file with a leading ">" or trailing
+blanks?, How can I reliably rename a file?, How can I lock a file?, Why
+can't I just open(FH, ">file.lock")?, I still don't get locking. I just
+want to increment the number in the file. How can I do this?, How do I
+randomly update a binary file?, How do I get a file's timestamp in perl?,
+How do I set a file's timestamp in perl?, How do I print to more than one
+file at once?, How can I read in an entire file all at once?, How can I
+read in a file by paragraphs?, How can I read a single character from a
+file? From the keyboard?, How can I tell whether there's a character
+waiting on a filehandle?, How do I do a C<tail -f> in perl?, How do I dup()
+a filehandle in Perl?, How do I close a file descriptor by number?, Why
+can't I use "C:\temp\foo" in DOS paths? What doesn't `C:\temp\foo.exe`
+work?, Why doesn't glob("*.*") get all the files?, Why does Perl let me
+delete read-only files? Why does C<-i> clobber protected files? Isn't
+this a bug in Perl?, How do I select a random line from a file?, Why do I
+get weird spaces when I print an array of lines?, L<perlfaq6>: Regexps, How
+can I hope to use regular expressions without creating illegible and
+unmaintainable code?, I'm having trouble matching over more than one line.
+What's wrong?, How can I pull out lines between two patterns that are
+themselves on different lines?, I put a regular expression into $/ but it
+didn't work. What's wrong?, How do I substitute case insensitively on the
+LHS, but preserving case on the RHS?, How can I make C<\w> match national
+character sets?, How can I match a locale-smart version of C</[a-zA-Z]/>?,
+How can I quote a variable to use in a regex?, What is C</o> really for?,
+How do I use a regular expression to strip C style comments from a file?,
+Can I use Perl regular expressions to match balanced text?, What does it
+mean that regexes are greedy? How can I get around it?, How do I process
+each word on each line?, How can I print out a word-frequency or
+line-frequency summary?, How can I do approximate matching?, How do I
+efficiently match many regular expressions at once?, Why don't
+word-boundary searches with C<\b> work for me?, Why does using $&, $`, or
+$' slow my program down?, What good is C<\G> in a regular expression?, Are
+Perl regexes DFAs or NFAs? Are they POSIX compliant?, What's wrong with
+using grep or map in a void context?, How can I match strings with
+multibyte characters?, How do I match a pattern that is supplied by the
+user?, L<perlfaq7>: General Perl Language Issues, Can I get a BNF/yacc/RE
+for the Perl language?, What are all these $@%&* punctuation signs, and how
+do I know when to use them?, Do I always/never have to quote my strings or
+use semicolons and commas?, How do I skip some return values?, How do I
+temporarily block warnings?, What's an extension?, Why do Perl operators
+have different precedence than C operators?, How do I declare/create a
+structure?, How do I create a module?, How do I create a class?, How can I
+tell if a variable is tainted?, What's a closure?, What is variable suicide
+and how can I prevent it?, How can I pass/return a {Function, FileHandle,
+Array, Hash, Method, Regex}?, How do I create a static variable?, What's
+the difference between dynamic and lexical (static) scoping? Between
+local() and my()?, How can I access a dynamic variable while a similarly
+named lexical is in scope?, What's the difference between deep and shallow
+binding?, Why doesn't "my($foo) = <FILE>;" work right?, How do I redefine a
+builtin function, operator, or method?, What's the difference between
+calling a function as &foo and foo()?, How do I create a switch or case
+statement?, How can I catch accesses to undefined
+variables/functions/methods?, Why can't a method included in this same file
+be found?, How can I find out my current package?, How can I comment out a
+large block of perl code?, How do I clear a package?, How can I use a
+variable as a variable name?, L<perlfaq8>: System Interaction, How do I
+find out which operating system I'm running under?, How come exec() doesn't
+return?, How do I do fancy stuff with the keyboard/screen/mouse?, How do I
+print something out in color?, How do I read just one key without waiting
+for a return key?, How do I check whether input is ready on the keyboard?,
+How do I clear the screen?, How do I get the screen size?, How do I ask the
+user for a password?, How do I read and write the serial port?, How do I
+decode encrypted password files?, How do I start a process in the
+background?, How do I trap control characters/signals?, How do I modify the
+shadow password file on a Unix system?, How do I set the time and date?,
+How can I sleep() or alarm() for under a second?, How can I measure time
+under a second?, How can I do an atexit() or setjmp()/longjmp()? (Exception
+handling), Why doesn't my sockets program work under System V (Solaris)?
+What does the error message "Protocol not supported" mean?, How can I call
+my system's unique C functions from Perl?, Where do I get the include files
+to do ioctl() or syscall()?, Why do setuid perl scripts complain about
+kernel problems?, How can I open a pipe both to and from a command?, Why
+can't I get the output of a command with system()?, How can I capture
+STDERR from an external command?, Why doesn't open() return an error when a
+pipe open fails?, What's wrong with using backticks in a void context?, How
+can I call backticks without shell processing?, Why can't my script read
+from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?, How can I
+convert my shell script to perl?, Can I use perl to run a telnet or ftp
+session?, How can I write expect in Perl?, Is there a way to hide perl's
+command line from programs such as "ps"?, I {changed directory, modified my
+environment} in a perl script. How come the change disappeared when I
+exited the script? How do I get my changes to be visible?, How do I close
+a process's filehandle without waiting for it to complete?, How do I fork a
+daemon process?, How do I make my program run with sh and csh?, How do I
+find out if I'm running interactively or not?, How do I timeout a slow
+event?, How do I set CPU limits?, How do I avoid zombies on a Unix system?,
+How do I use an SQL database?, How do I make a system() exit on control-C?,
+How do I open a file without blocking?, How do I install a module from
+CPAN?, What's the difference between require and use?, How do I keep my own
+module/library directory?, How do I add the directory my program lives in
+to the module/library search path?, How do I add a directory to my include
+path at runtime?, What is socket.ph and where do I get it?, L<perlfaq9>:
+Networking, My CGI script runs from the command line but not the browser.
+(500 Server Error), How can I get better error messages from a CGI
+program?, How do I remove HTML from a string?, How do I extract URLs?, How
+do I download a file from the user's machine? How do I open a file on
+another machine?, How do I make a pop-up menu in HTML?, How do I fetch an
+HTML file?, How do I automate an HTML form submission?, How do I decode or
+create those %-encodings on the web?, How do I redirect to another page?,
+How do I put a password on my web pages?, How do I edit my .htpasswd and
+.htgroup files with Perl?, How do I make sure users can't enter values into
+a form that cause my CGI script to do bad things?, How do I parse a mail
+header?, How do I decode a CGI form?, How do I check a valid mail address?,
+How do I decode a MIME/BASE64 string?, How do I return the user's mail
+address?, How do I send mail?, How do I read mail?, How do I find out my
+hostname/domainname/IP address?, How do I fetch a news article or the
+active newsgroups?, How do I fetch/put an FTP file?, How can I do RPC in
+Perl?
=over
@@ -74,11 +296,15 @@ authors
=item Changes
-24/April/97, 23/April/97, 25/March/97, 18/March/97, 17/March/97 Version,
-Initial Release: 11/March/97
+23/May/99, 13/April/99, 7/January/99, 22/June/98, 24/April/97, 23/April/97,
+25/March/97, 18/March/97, 17/March/97 Version, Initial Release: 11/March/97
+
+=back
+
+=head2 perlfaq1 - General Questions About Perl ($Revision: 1.23 $, $Date:
+1999/05/23 16:08:30 $)
-=head2 perlfaq1 - General Questions About Perl ($Revision: 1.14 $, $Date:
-1998/06/14 22:15:25 $)
+=over
=item DESCRIPTION
@@ -92,6 +318,8 @@ Initial Release: 11/March/97
=item What are perl4 and perl5?
+=item What is perl6?
+
=item How stable is Perl?
=item Is Perl difficult to learn?
@@ -112,14 +340,18 @@ Scheme, or Tcl?
=item Where can I get a list of Larry Wall witticisms?
=item How can I convince my sysadmin/supervisor/employees to use version
-(5/5.004/Perl instead of some other language)?
+(5/5.005/Perl instead of some other language)?
=back
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.24 $,
-$Date: 1998/07/20 23:40:28 $)
+=back
+
+=head2 perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.32 $,
+$Date: 1999/10/14 18:46:09 $)
+
+=over
=item DESCRIPTION
@@ -137,30 +369,26 @@ don't work.
=item I grabbed the sources and tried to compile but gdbm/dynamic
loading/malloc/linking/... failed. How do I make it work?
-=item What modules and extensions are available for Perl? What is CPAN?
+=item What modules and extensions are available for Perl? What is CPAN?
What does CPAN/src/... mean?
=item Is there an ISO or ANSI certified version of Perl?
=item Where can I get information on Perl?
-=item What are the Perl newsgroups on USENET? Where do I post questions?
+=item What are the Perl newsgroups on Usenet? Where do I post questions?
=item Where should I post source code?
=item Perl Books
-References, Tutorials
-*Learning Perl [2nd edition]
-by Randal L. Schwartz and Tom Christiansen, Task-Oriented, Special Topics
+References, Tutorials, Task-Oriented, Special Topics
=item Perl in Magazines
=item Perl on the Net: FTP and WWW Access
-=item What mailing lists are there for perl?
-
-MacPerl, Perl5-Porters, NTPerl, Perl-Packrats
+=item What mailing lists are there for Perl?
=item Archives of comp.lang.perl.misc
@@ -168,16 +396,18 @@ MacPerl, Perl5-Porters, NTPerl, Perl-Packrats
=item Where do I send bug reports?
-=item What is perl.com? perl.org? The Perl Institute?
-
-=item How do I learn about object-oriented Perl programming?
+=item What is perl.com? Perl Mongers? pm.org? perl.org?
=back
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq3 - Programming Tools ($Revision: 1.28 $, $Date: 1998/07/16
-22:08:49 $)
+=back
+
+=head2 perlfaq3 - Programming Tools ($Revision: 1.38 $, $Date: 1999/05/23
+16:08:30 $)
+
+=over
=item DESCRIPTION
@@ -199,6 +429,8 @@ MacPerl, Perl5-Porters, NTPerl, Perl-Packrats
=item Is there a ctags for Perl?
+=item Is there an IDE or Windows Perl Editor?
+
=item Where can I get Perl macros for vi?
=item Where can I get perl-mode for emacs?
@@ -225,11 +457,13 @@ MacPerl, Perl5-Porters, NTPerl, Perl-Packrats
=item How can I compile my Perl program into byte code or C?
+=item How can I compile Perl into Java?
+
=item How can I get C<#!perl> to work on [MS-DOS,NT,...]?
-=item Can I write useful perl programs on the command line?
+=item Can I write useful Perl programs on the command line?
-=item Why don't perl one-liners work on my DOS/Mac/VMS system?
+=item Why don't Perl one-liners work on my DOS/Mac/VMS system?
=item Where can I learn about CGI or Web programming in Perl?
@@ -249,8 +483,12 @@ mean?
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq4 - Data Manipulation ($Revision: 1.25 $, $Date: 1998/07/16
-22:49:55 $)
+=back
+
+=head2 perlfaq4 - Data Manipulation ($Revision: 1.49 $, $Date: 1999/05/23
+20:37:49 $)
+
+=over
=item DESCRIPTION
@@ -263,11 +501,13 @@ numbers I should be getting (eg, 19.95)?
=item Why isn't my octal data interpreted correctly?
-=item Does perl have a round function? What about ceil() and floor()?
+=item Does Perl have a round() function? What about ceil() and floor()?
Trig functions?
=item How do I convert bits into ints?
+=item Why doesn't & work the way I want it to?
+
=item How do I multiply matrices?
=item How do I perform an operation on a series of integers?
@@ -284,13 +524,17 @@ Trig functions?
=item How do I find the week-of-the-year/day-of-the-year?
+=item How do I find the current century or millennium?
+
=item How can I compare two dates and find the difference?
=item How can I take a string and turn it into epoch seconds?
=item How can I find the Julian Day?
-=item Does Perl have a year 2000 problem? Is Perl Y2K compliant?
+=item How do I find yesterday's date?
+
+=item Does Perl have a Year 2000 problem? Is Perl Y2K compliant?
=back
@@ -328,6 +572,8 @@ string?
=item How do I strip blank space from the beginning/end of a string?
+=item How do I pad a string with blanks or pad a number with zeroes?
+
=item How do I extract selected columns from a string?
=item How do I find the soundex value of a string?
@@ -348,9 +594,11 @@ the tag
=over
+=item What is the difference between a list and an array?
+
=item What is the difference between $array[1] and @array[1]?
-=item How can I extract just the unique elements of an array?
+=item How can I remove duplicate elements from a list or array?
a) If @in is sorted, and you want @out to be sorted:(this assumes all true
values in the array), b) If you don't know whether @in is sorted:, c) Like
@@ -363,6 +611,8 @@ integers:
=item How do I compute the difference of two arrays? How do I compute the
intersection of two arrays?
+=item How do I test whether two arrays or hashes are equal?
+
=item How do I find the first array element for which a condition is true?
=item How do I handle linked lists?
@@ -440,12 +690,18 @@ array of hashes or arrays?
=item How do I verify a credit card checksum?
+=item How do I pack arrays of doubles or floats for XS code?
+
=back
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq5 - Files and Formats ($Revision: 1.24 $, $Date: 1998/07/05
-15:07:20 $)
+=back
+
+=head2 perlfaq5 - Files and Formats ($Revision: 1.38 $, $Date: 1999/05/23
+16:08:30 $)
+
+=over
=item DESCRIPTION
@@ -481,13 +737,13 @@ filehandles between subroutines? How do I make an array of filehandles?
=item Is there a leak/bug in glob()?
-=item How can I open a file with a leading "E<gt>" or trailing blanks?
+=item How can I open a file with a leading ">" or trailing blanks?
=item How can I reliably rename a file?
=item How can I lock a file?
-=item What can't I just open(FH, ">file.lock")?
+=item Why can't I just open(FH, ">file.lock")?
=item I still don't get locking. I just want to increment the number in
the file. How can I do this?
@@ -500,11 +756,13 @@ the file. How can I do this?
=item How do I print to more than one file at once?
+=item How can I read in an entire file all at once?
+
=item How can I read in a file by paragraphs?
=item How can I read a single character from a file? From the keyboard?
-=item How can I tell if there's a character waiting on a filehandle?
+=item How can I tell whether there's a character waiting on a filehandle?
=item How do I do a C<tail -f> in perl?
@@ -522,11 +780,17 @@ protected files? Isn't this a bug in Perl?
=item How do I select a random line from a file?
+=item Why do I get weird spaces when I print an array of lines?
+
=back
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq6 - Regexps ($Revision: 1.22 $, $Date: 1998/07/16 14:01:07 $)
+=back
+
+=head2 perlfaq6 - Regexes ($Revision: 1.27 $, $Date: 1999/05/23 16:08:30 $)
+
+=over
=item DESCRIPTION
@@ -535,8 +799,7 @@ protected files? Isn't this a bug in Perl?
=item How can I hope to use regular expressions without creating illegible
and unmaintainable code?
-Comments Outside the Regexp, Comments Inside the Regexp, Different
-Delimiters
+Comments Outside the Regex, Comments Inside the Regex, Different Delimiters
=item I'm having trouble matching over more than one line. What's wrong?
@@ -552,7 +815,7 @@ case on the RHS?
=item How can I match a locale-smart version of C</[a-zA-Z]/>?
-=item How can I quote a variable to use in a regexp?
+=item How can I quote a variable to use in a regex?
=item What is C</o> really for?
@@ -561,7 +824,7 @@ file?
=item Can I use Perl regular expressions to match balanced text?
-=item What does it mean that regexps are greedy? How can I get around it?
+=item What does it mean that regexes are greedy? How can I get around it?
=item How do I process each word on each line?
@@ -577,18 +840,24 @@ file?
=item What good is C<\G> in a regular expression?
-=item Are Perl regexps DFAs or NFAs? Are they POSIX compliant?
+=item Are Perl regexes DFAs or NFAs? Are they POSIX compliant?
=item What's wrong with using grep or map in a void context?
=item How can I match strings with multibyte characters?
+=item How do I match a pattern that is supplied by the user?
+
=back
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq7 - Perl Language Issues ($Revision: 1.21 $, $Date:
-1998/06/22 15:20:07 $)
+=back
+
+=head2 perlfaq7 - Perl Language Issues ($Revision: 1.28 $, $Date:
+1999/05/23 20:36:18 $)
+
+=over
=item DESCRIPTION
@@ -596,7 +865,7 @@ file?
=item Can I get a BNF/yacc/RE for the Perl language?
-=item What are all these $@%* punctuation signs, and how do I know when to
+=item What are all these $@%&* punctuation signs, and how do I know when to
use them?
=item Do I always/never have to quote my strings or use semicolons and
@@ -623,14 +892,14 @@ commas?
=item What is variable suicide and how can I prevent it?
=item How can I pass/return a {Function, FileHandle, Array, Hash, Method,
-Regexp}?
+Regex}?
-Passing Variables and Functions, Passing Filehandles, Passing Regexps,
+Passing Variables and Functions, Passing Filehandles, Passing Regexes,
Passing Methods
=item How do I create a static variable?
-=item What's the difference between dynamic and lexical (static) scoping?
+=item What's the difference between dynamic and lexical (static) scoping?
Between local() and my()?
=item How can I access a dynamic variable while a similarly named lexical
@@ -654,12 +923,20 @@ is in scope?
=item How can I comment out a large block of perl code?
+=item How do I clear a package?
+
+=item How can I use a variable as a variable name?
+
=back
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq8 - System Interaction ($Revision: 1.25 $, $Date: 1998/07/05
-15:07:20 $)
+=back
+
+=head2 perlfaq8 - System Interaction ($Revision: 1.39 $, $Date: 1999/05/23
+18:37:57 $)
+
+=over
=item DESCRIPTION
@@ -767,7 +1044,7 @@ complete?
=item How do I open a file without blocking?
-=item How do I install a CPAN module?
+=item How do I install a module from CPAN?
=item What's the difference between require and use?
@@ -778,13 +1055,19 @@ search path?
=item How do I add a directory to my include path at runtime?
+=item What is socket.ph and where do I get it?
+
=back
=item AUTHOR AND COPYRIGHT
-=head2 perlfaq9 - Networking ($Revision: 1.20 $, $Date: 1998/06/22 18:31:09
+=back
+
+=head2 perlfaq9 - Networking ($Revision: 1.26 $, $Date: 1999/05/23 16:08:30
$)
+=over
+
=item DESCRIPTION
=over
@@ -844,181 +1127,402 @@ CGI script to do bad things?
=item AUTHOR AND COPYRIGHT
-=head2 perldelta - what's new for perl5.005
+=back
-=item DESCRIPTION
+=head2 perldelta - what's new for perl v5.6.0
-=item About the new versioning system
+=over
-=item Incompatible Changes
+=item DESCRIPTION
+
+=item Core Enhancements
=over
-=item WARNING: This version is not binary compatible with Perl 5.004.
+=item Interpreter cloning, threads, and concurrency
+
+=item Lexically scoped warning categories
+
+=item Unicode and UTF-8 support
+
+=item Support for interpolating named characters
+
+=item "our" declarations
+
+=item Support for strings represented as a vector of ordinals
+
+=item Improved Perl version numbering system
+
+=item New syntax for declaring subroutine attributes
+
+=item File and directory handles can be autovivified
+
+=item open() with more than two arguments
+
+=item 64-bit support
+
+=item Large file support
+
+=item Long doubles
+
+=item "more bits"
+
+=item Enhanced support for sort() subroutines
+
+=item C<sort $coderef @foo> allowed
+
+=item File globbing implemented internally
+
+Support for CHECK blocks
+
+=item POSIX character class syntax [: :] supported
+
+Better pseudo-random number generator
+
+=item Improved C<qw//> operator
+
+Better worst-case behavior of hashes
+
+=item pack() format 'Z' supported
+
+=item pack() format modifier '!' supported
+
+=item pack() and unpack() support counted strings
+
+=item Comments in pack() templates
+
+=item Weak references
+
+=item Binary numbers supported
+
+=item Lvalue subroutines
+
+=item Some arrows may be omitted in calls through references
+
+=item Boolean assignment operators are legal lvalues
+
+=item exists() is supported on subroutine names
+
+=item exists() and delete() are supported on array elements
+
+=item Pseudo-hashes work better
+
+=item Automatic flushing of output buffers
-=item Default installation structure has changed
+=item Better diagnostics on meaningless filehandle operations
-=item Perl Source Compatibility
+=item Where possible, buffered data discarded from duped input filehandle
-=item C Source Compatibility
+=item eof() has the same old magic as <>
-Core sources now require ANSI C compiler, All Perl global variables must
-now be referenced with an explicit prefix, Enabling threads has source
-compatibility issues
+=item binmode() can be used to set :crlf and :raw modes
-=item Binary Compatibility
+=item C<-T> filetest recognizes UTF-8 encoded files as "text"
-=item Security fixes may affect compatibility
+=item system(), backticks and pipe open now reflect exec() failure
-=item Relaxed new mandatory warnings introduced in 5.004
+=item Improved diagnostics
-=item Licensing
+=item Diagnostics follow STDERR
+
+More consistent close-on-exec behavior
+
+=item syswrite() ease-of-use
+
+=item Better syntax checks on parenthesized unary operators
+
+=item Bit operators support full native integer width
+
+=item Improved security features
+
+More functional bareword prototype (*)
+
+=item C<require> and C<do> may be overridden
+
+=item $^X variables may now have names longer than one character
+
+=item New variable $^C reflects C<-c> switch
+
+=item New variable $^V contains Perl version as a string
+
+=item Optional Y2K warnings
=back
-=item Core Changes
+=item Modules and Pragmata
=over
-=item Threads
+=item Modules
-=item Compiler
+attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper,
+DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English,
+Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec,
+File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt,
+Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker,
+podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage,
+pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname,
+Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters
-=item Regular Expressions
+=item Pragmata
-Many new and improved optimizations, Many bug fixes, New regular expression
-constructs, New operator for precompiled regular expressions, Other
-improvements, Incompatible changes
+=back
-=item Improved malloc()
+=item Utility Changes
-=item Quicksort is internally implemented
+=over
-=item Reliable signals
+=item dprofpp
-=item Reliable stack pointers
+=item find2perl
-=item More generous treatment of carriage returns
+=item h2xs
-=item Memory leaks
+=item perlcc
-=item Better support for multiple interpreters
+=item perldoc
-=item Behavior of local() on array and hash elements is now well-defined
+=item The Perl Debugger
-=item C<%!> is transparently tied to the L<Errno> module
+=back
-=item Pseudo-hashes are supported
+=item Improved Documentation
-=item C<EXPR foreach EXPR> is supported
+perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod,
+perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod,
+perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod,
+perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod
-=item Keywords can be globally overridden
+=item Performance enhancements
-=item C<$^E> is meaningful on Win32
+=over
-=item C<foreach (1..1000000)> optimized
+=item Simple sort() using { $a <=> $b } and the like are optimized
-=item C<Foo::> can be used as implicitly quoted package name
+=item Optimized assignments to lexical variables
-=item C<exists $Foo::{Bar::}> tests existence of a package
+=item Faster subroutine calls
-=item Better locale support
+delete(), each(), values() and hash iteration are faster
-=item Experimental support for 64-bit platforms
+=back
-=item prototype() returns useful results on builtins
+=item Installation and Configuration Improvements
-=item Extended support for exception handling
+=over
-=item Re-blessing in DESTROY() supported for chaining DESTROY() methods
+=item -Dusethreads means something different
-=item All C<printf> format conversions are handled internally
+=item New Configure flags
-=item New C<INIT> keyword
+=item Threadedness and 64-bitness now more daring
-=item New C<lock> keyword
+=item Long Doubles
-=item New C<qr//> operator
+=item -Dusemorebits
-=item C<our> is now a reserved word
+=item -Duselargefiles
-=item Tied arrays are now fully supported
+=item installusrbinperl
-=item Tied handles support is better
+=item SOCKS support
-=item 4th argument to substr
+=item C<-A> flag
-=item Negative LENGTH argument to splice
+=item Enhanced Installation Directories
-=item Magic lvalues are now more magical
+=back
-=item E<lt>E<gt> now reads in records
+=item Platform specific changes
+
+=over
+
+=item Supported platforms
+
+=item DOS
+
+=item OS390 (OpenEdition MVS)
+
+=item VMS
+
+=item Win32
=back
-=item Supported Platforms
+=item Significant bug fixes
=over
-=item New Platforms
+=item <HANDLE> on empty files
+
+=item C<eval '...'> improvements
+
+=item All compilation errors are true errors
+
+=item Implicitly closed filehandles are safer
+
+=item Behavior of list slices is more consistent
+
+=item C<(\$)> prototype and C<$foo{a}>
-=item Changes in existing support
+=item C<goto &sub> and AUTOLOAD
+
+=item C<-bareword> allowed under C<use integer>
+
+=item Failures in DESTROY()
+
+=item Locale bugs fixed
+
+=item Memory leaks
+
+=item Spurious subroutine stubs after failed subroutine calls
+
+=item Taint failures under C<-U>
+
+=item END blocks and the C<-c> switch
+
+=item Potential to leak DATA filehandles
=back
-=item Modules and Pragmata
+=item New or Changed Diagnostics
+
+"%s" variable %s masks earlier declaration in same %s, "my sub" not yet
+implemented, "our" variable %s redeclared, '!' allowed only after types %s,
+/ cannot take a count, / must be followed by a, A or Z, / must be followed
+by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape
+\\%c passed through, /%s/: Unrecognized escape \\%c in character class
+passed through, /%s/ should probably be written as "%s", %s() called too
+early to check prototype, %s argument is not a HASH or ARRAY element, %s
+argument is not a HASH or ARRAY element or slice, %s argument is not a
+subroutine name, %s package attribute may clash with future reserved word:
+%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled
+substitution pattern, Bad realloc() ignored, Bareword found in conditional,
+Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector
+size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check
+filesystem of script "%s", Can't declare class for non-scalar %s in "%s",
+Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default,
+Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't
+remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't
+weaken a nonreference, Character class [:%s:] unknown, Character class
+syntax [%s] belongs inside character classes, Constant is not %s reference,
+constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated,
+defined(%hash) is deprecated, Did not produce a valid header, (Did you mean
+"local" instead of "our"?), Document contains no data, entering effective
+%s failed, false [] range "%s" in regexp, Filehandle %s opened only for
+output, flock() on closed filehandle %s, Global symbol "%s" requires
+explicit package name, Hexadecimal number > 0xffffffff non-portable,
+Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter:
+|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal
+number of bits in vec, Integer overflow in %s number, Invalid %s attribute:
+%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid
+separator character %s in attribute list, Invalid separator character %s in
+subroutine attribute list, leaving effective %s failed, Lvalue subs
+returning %s not implemented yet, Method %s not permitted, Missing
+%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub",
+No %s specified for -%c, No package name allowed for variable %s in "our",
+No space allowed after -%c, no UTC offset information; assuming local time
+is UTC, Octal number > 037777777777 non-portable, panic: del_backref,
+panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing
+around "%s" list, Possible Y2K bug: %s, pragma "attrs" is deprecated, use
+"sub NAME : ATTRS" instead, Premature end of script headers, Repeat count
+in pack overflows, Repeat count in unpack overflows, realloc() of freed
+memory ignored, Reference is already weak, setpgrp can't take arguments,
+Strange *+?{} on zero-length expression, switching effective %s is not
+implemented, This Perl can't reset CRTL environ elements (%s), This Perl
+can't set CRTL environ elements (%s=%s), Too late to run %s block, Unknown
+open() mode '%s', Unknown process %x sent message to prime_env_iter: %s,
+Unrecognized escape \\%c passed through, Unterminated attribute parameter
+in attribute list, Unterminated attribute list, Unterminated attribute
+parameter in subroutine attribute list, Unterminated subroutine attribute
+list, Value of CLI symbol "%s" too long, Version number must be a constant
+number
+
+=item New tests
+
+=item Incompatible Changes
=over
-=item New Modules
+=item Perl Source Incompatibilities
-B, Data::Dumper, Errno, File::Spec, ExtUtils::Installed,
-ExtUtils::Packlist, Fatal, IPC::SysV, Test, Tie::Array, Tie::Handle,
-Thread, attrs, fields, re
+CHECK is a new keyword, Treatment of list slices of undef has changed
-=item Changes in existing modules
+=item Format of $English::PERL_VERSION is different
-CGI, POSIX, DB_File, MakeMaker, CPAN, Cwd, Benchmark
+Literals of the form C<1.2.3> parse differently, Possibly changed
+pseudo-random number generator, Hashing function for hash keys has changed,
+C<undef> fails on read only values, Close-on-exec bit may be set on pipe
+and socket handles, Writing C<"$$1"> to mean C<"${$}1"> is unsupported,
+delete(), values() and C<\(%h)> operate on aliases to values, not copies,
+vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS, Text of some diagnostic
+output has changed, C<%@> has been removed, Parenthesized not() behaves
+like a list operator, Semantics of bareword prototype C<(*)> have changed
+
+=item Semantics of bit operators may have changed on 64-bit platforms
+
+=item More builtins taint their results
+
+=item C Source Incompatibilities
+
+C<PERL_POLLUTE>, C<PERL_IMPLICIT_CONTEXT>, C<PERL_POLLUTE_MALLOC>
+
+=item Compatible C Source API Changes
+
+C<PATCHLEVEL> is now C<PERL_VERSION>
+
+=item Binary Incompatibilities
=back
-=item Utility Changes
+=item Known Problems
+
+=over
+
+=item Thread test failures
+
+=item EBCDIC platforms not supported
+
+=item In 64-bit HP-UX the lib/io_multihomed test may hang
-=item Documentation Changes
-
-=item New Diagnostics
-
-Ambiguous call resolved as CORE::%s(), qualify as such or use &, Bad index
-while coercing array into hash, Bareword "%s" refers to nonexistent
-package, Can't call method "%s" on an undefined value, Can't coerce array
-into hash, Can't goto subroutine from an eval-string, Can't localize
-pseudo-hash element, Can't use %%! because Errno.pm is not available,
-Cannot find an opnumber for "%s", Character class syntax [. .] is reserved
-for future extensions, Character class syntax [: :] is reserved for future
-extensions, Character class syntax [= =] is reserved for future extensions,
-%s: Eval-group in insecure regular expression, %s: Eval-group not allowed,
-use re 'eval', %s: Eval-group not allowed at run time, Explicit blessing to
-'' (assuming package main), Illegal hex digit ignored, No such array field,
-No such field "%s" in variable %s of type %s, Out of memory during
-ridiculously large request, Range iterator outside integer range, Recursive
-inheritance detected while looking for method '%s' in package '%s',
-Reference found where even-sized list expected, Undefined value assigned to
-typeglob, Use of reserved word "%s" is deprecated, perl: warning: Setting
-locale failed
+=item NEXTSTEP 3.3 POSIX test failure
+
+=item Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with
+gcc
+
+=item UNICOS/mk CC failures during Configure run
+
+=item Arrow operator and arrays
+
+=item Windows 2000
+
+=item Experimental features
+
+Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The
+pseudo-hash data type, The Compiler suite, Internal implementation of file
+globbing, The DB module, The regular expression constructs C<(?{ code })>
+and C<(??{ code })>
+
+=back
=item Obsolete Diagnostics
-Can't mktemp(), Can't write to temp file for B<-e>: %s, Cannot open
-temporary file
+Character class syntax [: :] is reserved for future extensions, Ill-formed
+logical name |%s| in prime_env_iter, Probable precedence problem on %s,
+regexp too big, Use of "$$<digit>" to mean "${$}<digit>" is deprecated
-=item BUGS
+=item Reporting Bugs
=item SEE ALSO
=item HISTORY
+=back
+
=head2 perldata - Perl data types
+=over
+
=item DESCRIPTION
=over
@@ -1033,12 +1537,20 @@ temporary file
=item List value constructors
+=item Slices
+
=item Typeglobs and Filehandles
=back
+=item SEE ALSO
+
+=back
+
=head2 perlsyn - Perl syntax
+=over
+
=item DESCRIPTION
=over
@@ -1065,8 +1577,12 @@ temporary file
=back
+=back
+
=head2 perlop - Perl operators and precedence
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -1131,14 +1647,14 @@ unary &, unary *, (TYPE)
?PATTERN?, m/PATTERN/cgimosx, /PATTERN/cgimosx, q/STRING/, C<'STRING'>,
qq/STRING/, "STRING", qr/STRING/imosx, qx/STRING/, `STRING`, qw/STRING/,
-s/PATTERN/REPLACEMENT/egimosx, tr/SEARCHLIST/REPLACEMENTLIST/cds,
-y/SEARCHLIST/REPLACEMENTLIST/cds
+s/PATTERN/REPLACEMENT/egimosx, tr/SEARCHLIST/REPLACEMENTLIST/cdsUC,
+y/SEARCHLIST/REPLACEMENTLIST/cdsUC
=item Gory details of parsing quoted constructs
Finding the end, Removal of backslashes before delimiters, Interpolation,
C<<<'EOF'>, C<m''>, C<s'''>, C<tr///>, C<y///>, C<''>, C<q//>, C<"">,
-C<``>, C<qq//>, C<qx//>, C<<file*globE<gt>>, C<?RE?>, C</RE/>, C<m/RE/>,
+C<``>, C<qq//>, C<qx//>, C<< <file*glob> >>, C<?RE?>, C</RE/>, C<m/RE/>,
C<s/RE/foo/>,, Interpolation of regular expressions, Optimization of
regular expressions
@@ -1156,8 +1672,12 @@ regular expressions
=back
+=back
+
=head2 perlre - Perl regular expressions
+=over
+
=item DESCRIPTION
i, m, s, x
@@ -1166,27 +1686,44 @@ i, m, s, x
=item Regular Expressions
-C<(?#text)>, C<(?:pattern)>, C<(?imsx-imsx:pattern)>, C<(?=pattern)>,
-C<(?!pattern)>, C<(?E<lt>=pattern)>, C<(?<!pattern)>, C<(?{ code })>,
-C<(?E<gt>pattern)>, C<(?(condition)yes-pattern|no-pattern)>,
-C<(?(condition)yes-pattern)>, C<(?imsx-imsx)>
+cntrl, graph, print, punct, xdigit
+
+=item Extended Patterns
+
+C<(?#text)>, C<(?imsx-imsx)>, C<(?:pattern)>, C<(?imsx-imsx:pattern)>,
+C<(?=pattern)>, C<(?!pattern)>, C<(?<=pattern)>, C<(?<!pattern)>, C<(?{
+code })>, C<(??{ code })>, C<< (?>pattern) >>,
+C<(?(condition)yes-pattern|no-pattern)>, C<(?(condition)yes-pattern)>
=item Backtracking
=item Version 8 Regular Expressions
-=item WARNING on \1 vs $1
+=item Warning on \1 vs $1
=item Repeated patterns matching zero-length substring
+=item Combining pieces together
+
+C<ST>, C<S|T>, C<S{REPEAT_COUNT}>, C<S{min,max}>, C<S{min,max}?>, C<S?>,
+C<S*>, C<S+>, C<S??>, C<S*?>, C<S+?>, C<< (?>S) >>, C<(?=S)>, C<(?<=S)>,
+C<(?!S)>, C<(?<!S)>, C<(??{ EXPR })>,
+C<(?(condition)yes-pattern|no-pattern)>
+
=item Creating custom RE engines
+=back
+
+=item BUGS
+
=item SEE ALSO
=back
=head2 perlrun - how to execute the Perl interpreter
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -1195,28 +1732,33 @@ C<(?(condition)yes-pattern)>, C<(?imsx-imsx)>
=item #! and quoting on non-Unix systems
-OS/2, MS-DOS, Win95/NT, Macintosh
+OS/2, MS-DOS, Win95/NT, Macintosh, VMS
=item Location of Perl
-=item Switches
+=item Command Switches
-B<-0>[I<digits>], B<-a>, B<-c>, B<-d>, B<-d:>I<foo>, B<-D>I<letters>,
-B<-D>I<number>, B<-e> I<commandline>, B<-F>I<pattern>, B<-h>,
-B<-i>[I<extension>], B<-I>I<directory>, B<-l>[I<octnum>],
+B<-0>[I<digits>], B<-a>, B<-C>, B<-c>, B<-d>, B<-d:>I<foo>,
+B<-D>I<letters>, B<-D>I<number>, B<-e> I<commandline>, B<-F>I<pattern>,
+B<-h>, B<-i>[I<extension>], B<-I>I<directory>, B<-l>[I<octnum>],
B<-m>[B<->]I<module>, B<-M>[B<->]I<module>, B<-M>[B<->]I<'module ...'>,
B<-[mM]>[B<->]I<module=arg[,arg]...>, B<-n>, B<-p>, B<-P>, B<-s>, B<-S>,
-B<-T>, B<-u>, B<-U>, B<-v>, B<-V>, B<-V:>I<name>, B<-w>, B<-x> I<directory>
+B<-T>, B<-u>, B<-U>, B<-v>, B<-V>, B<-V:>I<name>, B<-w>, B<-W>, B<-X>,
+B<-x> I<directory>
=back
=item ENVIRONMENT
HOME, LOGDIR, PATH, PERL5LIB, PERL5OPT, PERLLIB, PERL5DB, PERL5SHELL
-(specific to WIN32 port), PERL_DEBUG_MSTATS, PERL_DESTRUCT_LEVEL
+(specific to the Win32 port), PERL_DEBUG_MSTATS, PERL_DESTRUCT_LEVEL
+
+=back
=head2 perlfunc - Perl builtin functions
+=over
+
=item DESCRIPTION
=over
@@ -1235,49 +1777,53 @@ communication functions, Fetching user and group info, Fetching network
info, Time-related functions, Functions new in perl5, Functions obsoleted
in perl5
+=item Portability
+
=item Alphabetical Listing of Perl Functions
I<-X> FILEHANDLE, I<-X> EXPR, I<-X>, abs VALUE, abs, accept
NEWSOCKET,GENERICSOCKET, alarm SECONDS, alarm, atan2 Y,X, bind SOCKET,NAME,
-binmode FILEHANDLE, bless REF,CLASSNAME, bless REF, caller EXPR, caller,
-chdir EXPR, chmod LIST, chomp VARIABLE, chomp LIST, chomp, chop VARIABLE,
-chop LIST, chop, chown LIST, chr NUMBER, chr, chroot FILENAME, chroot,
-close FILEHANDLE, close, closedir DIRHANDLE, connect SOCKET,NAME, continue
-BLOCK, cos EXPR, crypt PLAINTEXT,SALT, dbmclose HASH, dbmopen
-HASH,DBNAME,MODE, defined EXPR, defined, delete EXPR, die LIST, do BLOCK,
-do SUBROUTINE(LIST), do EXPR, dump LABEL, each HASH, eof FILEHANDLE, eof
-(), eof, eval EXPR, eval BLOCK, exec LIST, exec PROGRAM LIST, exists EXPR,
-exit EXPR, exp EXPR, exp, fcntl FILEHANDLE,FUNCTION,SCALAR, fileno
-FILEHANDLE, flock FILEHANDLE,OPERATION, fork, format, formline
-PICTURE,LIST, getc FILEHANDLE, getc, getlogin, getpeername SOCKET, getpgrp
-PID, getppid, getpriority WHICH,WHO, getpwnam NAME, getgrnam NAME,
-gethostbyname NAME, getnetbyname NAME, getprotobyname NAME, getpwuid UID,
-getgrgid GID, getservbyname NAME,PROTO, gethostbyaddr ADDR,ADDRTYPE,
-getnetbyaddr ADDR,ADDRTYPE, getprotobynumber NUMBER, getservbyport
-PORT,PROTO, getpwent, getgrent, gethostent, getnetent, getprotoent,
-getservent, setpwent, setgrent, sethostent STAYOPEN, setnetent STAYOPEN,
-setprotoent STAYOPEN, setservent STAYOPEN, endpwent, endgrent, endhostent,
-endnetent, endprotoent, endservent, getsockname SOCKET, getsockopt
-SOCKET,LEVEL,OPTNAME, glob EXPR, glob, gmtime EXPR, goto LABEL, goto EXPR,
-goto &NAME, grep BLOCK LIST, grep EXPR,LIST, hex EXPR, hex, import, index
-STR,SUBSTR,POSITION, index STR,SUBSTR, int EXPR, int, ioctl
-FILEHANDLE,FUNCTION,SCALAR, join EXPR,LIST, keys HASH, kill LIST, last
-LABEL, last, lc EXPR, lc, lcfirst EXPR, lcfirst, length EXPR, length, link
-OLDFILE,NEWFILE, listen SOCKET,QUEUESIZE, local EXPR, localtime EXPR, log
-EXPR, log, lstat FILEHANDLE, lstat EXPR, lstat, m//, map BLOCK LIST, map
-EXPR,LIST, mkdir FILENAME,MODE, msgctl ID,CMD,ARG, msgget KEY,FLAGS, msgsnd
-ID,MSG,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, my EXPR, next LABEL, next, no
-Module LIST, oct EXPR, oct, open FILEHANDLE,EXPR, open FILEHANDLE, opendir
-DIRHANDLE,EXPR, ord EXPR, ord, pack TEMPLATE,LIST, package, package
-NAMESPACE, pipe READHANDLE,WRITEHANDLE, pop ARRAY, pop, pos SCALAR, pos,
-print FILEHANDLE LIST, print LIST, print, printf FILEHANDLE FORMAT, LIST,
-printf FORMAT, LIST, prototype FUNCTION, push ARRAY,LIST, q/STRING/,
-qq/STRING/, qr/STRING/, qx/STRING/, qw/STRING/, quotemeta EXPR, quotemeta,
-rand EXPR, rand, read FILEHANDLE,SCALAR,LENGTH,OFFSET, read
-FILEHANDLE,SCALAR,LENGTH, readdir DIRHANDLE, readline EXPR, readlink EXPR,
-readlink, readpipe EXPR, recv SOCKET,SCALAR,LEN,FLAGS, redo LABEL, redo,
-ref EXPR, ref, rename OLDNAME,NEWNAME, require EXPR, require, reset EXPR,
-reset, return EXPR, return, reverse LIST, rewinddir DIRHANDLE, rindex
+binmode FILEHANDLE, DISCIPLINE, binmode FILEHANDLE, bless REF,CLASSNAME,
+bless REF, caller EXPR, caller, chdir EXPR, chmod LIST, chomp VARIABLE,
+chomp LIST, chomp, chop VARIABLE, chop LIST, chop, chown LIST, chr NUMBER,
+chr, chroot FILENAME, chroot, close FILEHANDLE, close, closedir DIRHANDLE,
+connect SOCKET,NAME, continue BLOCK, cos EXPR, crypt PLAINTEXT,SALT,
+dbmclose HASH, dbmopen HASH,DBNAME,MASK, defined EXPR, defined, delete
+EXPR, die LIST, do BLOCK, do SUBROUTINE(LIST), do EXPR, dump LABEL, dump,
+each HASH, eof FILEHANDLE, eof (), eof, eval EXPR, eval BLOCK, exec LIST,
+exec PROGRAM LIST, exists EXPR, exit EXPR, exp EXPR, exp, fcntl
+FILEHANDLE,FUNCTION,SCALAR, fileno FILEHANDLE, flock FILEHANDLE,OPERATION,
+fork, format, formline PICTURE,LIST, getc FILEHANDLE, getc, getlogin,
+getpeername SOCKET, getpgrp PID, getppid, getpriority WHICH,WHO, getpwnam
+NAME, getgrnam NAME, gethostbyname NAME, getnetbyname NAME, getprotobyname
+NAME, getpwuid UID, getgrgid GID, getservbyname NAME,PROTO, gethostbyaddr
+ADDR,ADDRTYPE, getnetbyaddr ADDR,ADDRTYPE, getprotobynumber NUMBER,
+getservbyport PORT,PROTO, getpwent, getgrent, gethostent, getnetent,
+getprotoent, getservent, setpwent, setgrent, sethostent STAYOPEN, setnetent
+STAYOPEN, setprotoent STAYOPEN, setservent STAYOPEN, endpwent, endgrent,
+endhostent, endnetent, endprotoent, endservent, getsockname SOCKET,
+getsockopt SOCKET,LEVEL,OPTNAME, glob EXPR, glob, gmtime EXPR, goto LABEL,
+goto EXPR, goto &NAME, grep BLOCK LIST, grep EXPR,LIST, hex EXPR, hex,
+import, index STR,SUBSTR,POSITION, index STR,SUBSTR, int EXPR, int, ioctl
+FILEHANDLE,FUNCTION,SCALAR, join EXPR,LIST, keys HASH, kill SIGNAL, LIST,
+last LABEL, last, lc EXPR, lc, lcfirst EXPR, lcfirst, length EXPR, length,
+link OLDFILE,NEWFILE, listen SOCKET,QUEUESIZE, local EXPR, localtime EXPR,
+lock, log EXPR, log, lstat FILEHANDLE, lstat EXPR, lstat, m//, map BLOCK
+LIST, map EXPR,LIST, mkdir FILENAME,MASK, mkdir FILENAME, msgctl
+ID,CMD,ARG, msgget KEY,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, msgsnd
+ID,MSG,FLAGS, my EXPR, my EXPR : ATTRIBUTES, next LABEL, next, no Module
+LIST, oct EXPR, oct, open FILEHANDLE,MODE,LIST, open FILEHANDLE,EXPR, open
+FILEHANDLE, opendir DIRHANDLE,EXPR, ord EXPR, ord, our EXPR, pack
+TEMPLATE,LIST, package, package NAMESPACE, pipe READHANDLE,WRITEHANDLE, pop
+ARRAY, pop, pos SCALAR, pos, print FILEHANDLE LIST, print LIST, print,
+printf FILEHANDLE FORMAT, LIST, printf FORMAT, LIST, prototype FUNCTION,
+push ARRAY,LIST, q/STRING/, qq/STRING/, qr/STRING/, qx/STRING/, qw/STRING/,
+quotemeta EXPR, quotemeta, rand EXPR, rand, read
+FILEHANDLE,SCALAR,LENGTH,OFFSET, read FILEHANDLE,SCALAR,LENGTH, readdir
+DIRHANDLE, readline EXPR, readlink EXPR, readlink, readpipe EXPR, recv
+SOCKET,SCALAR,LENGTH,FLAGS, redo LABEL, redo, ref EXPR, ref, rename
+OLDNAME,NEWNAME, require VERSION, require EXPR, require, reset EXPR, reset,
+return EXPR, return, reverse LIST, rewinddir DIRHANDLE, rindex
STR,SUBSTR,POSITION, rindex STR,SUBSTR, rmdir FILENAME, rmdir, s///, scalar
EXPR, seek FILEHANDLE,POSITION,WHENCE, seekdir DIRHANDLE,POS, select
FILEHANDLE, select, select RBITS,WBITS,EBITS,TIMEOUT, semctl
@@ -1289,81 +1835,103 @@ shmwrite ID,STRING,POS,SIZE, shutdown SOCKET,HOW, sin EXPR, sin, sleep
EXPR, sleep, socket SOCKET,DOMAIN,TYPE,PROTOCOL, socketpair
SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL, sort SUBNAME LIST, sort BLOCK LIST,
sort LIST, splice ARRAY,OFFSET,LENGTH,LIST, splice ARRAY,OFFSET,LENGTH,
-splice ARRAY,OFFSET, split /PATTERN/,EXPR,LIMIT, split /PATTERN/,EXPR,
-split /PATTERN/, split, sprintf FORMAT, LIST, sqrt EXPR, sqrt, srand EXPR,
-srand, stat FILEHANDLE, stat EXPR, stat, study SCALAR, study, sub BLOCK,
-sub NAME, sub NAME BLOCK, substr EXPR,OFFSET,LEN,REPLACEMENT, substr
-EXPR,OFFSET,LEN, substr EXPR,OFFSET, symlink OLDFILE,NEWFILE, syscall LIST,
-sysopen FILEHANDLE,FILENAME,MODE, sysopen FILEHANDLE,FILENAME,MODE,PERMS,
-sysread FILEHANDLE,SCALAR,LENGTH,OFFSET, sysread FILEHANDLE,SCALAR,LENGTH,
-sysseek FILEHANDLE,POSITION,WHENCE, system LIST, system PROGRAM LIST,
-syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET, syswrite
-FILEHANDLE,SCALAR,LENGTH, tell FILEHANDLE, tell, telldir DIRHANDLE, tie
+splice ARRAY,OFFSET, splice ARRAY, split /PATTERN/,EXPR,LIMIT, split
+/PATTERN/,EXPR, split /PATTERN/, split, sprintf FORMAT, LIST, sqrt EXPR,
+sqrt, srand EXPR, srand, stat FILEHANDLE, stat EXPR, stat, study SCALAR,
+study, sub BLOCK, sub NAME, sub NAME BLOCK, substr
+EXPR,OFFSET,LENGTH,REPLACEMENT, substr EXPR,OFFSET,LENGTH, substr
+EXPR,OFFSET, symlink OLDFILE,NEWFILE, syscall LIST, sysopen
+FILEHANDLE,FILENAME,MODE, sysopen FILEHANDLE,FILENAME,MODE,PERMS, sysread
+FILEHANDLE,SCALAR,LENGTH,OFFSET, sysread FILEHANDLE,SCALAR,LENGTH, sysseek
+FILEHANDLE,POSITION,WHENCE, system LIST, system PROGRAM LIST, syswrite
+FILEHANDLE,SCALAR,LENGTH,OFFSET, syswrite FILEHANDLE,SCALAR,LENGTH,
+syswrite FILEHANDLE,SCALAR, tell FILEHANDLE, tell, telldir DIRHANDLE, tie
VARIABLE,CLASSNAME,LIST, tied VARIABLE, time, times, tr///, truncate
FILEHANDLE,LENGTH, truncate EXPR,LENGTH, uc EXPR, uc, ucfirst EXPR,
ucfirst, umask EXPR, umask, undef EXPR, undef, unlink LIST, unlink, unpack
-TEMPLATE,EXPR, untie VARIABLE, unshift ARRAY,LIST, use Module LIST, use
-Module, use Module VERSION LIST, use VERSION, utime LIST, values HASH, vec
-EXPR,OFFSET,BITS, wait, waitpid PID,FLAGS, wantarray, warn LIST, write
-FILEHANDLE, write EXPR, write, y///
+TEMPLATE,EXPR, untie VARIABLE, unshift ARRAY,LIST, use Module VERSION LIST,
+use Module VERSION, use Module LIST, use Module, use VERSION, utime LIST,
+values HASH, vec EXPR,OFFSET,BITS, wait, waitpid PID,FLAGS, wantarray, warn
+LIST, write FILEHANDLE, write EXPR, write, y///
+
+=back
=back
=head2 perlvar - Perl predefined variables
+=over
+
=item DESCRIPTION
=over
=item Predefined Names
-$ARG, $_, $E<lt>I<digits>E<gt>, $MATCH, $&, $PREMATCH, $`, $POSTMATCH, $',
-$LAST_PAREN_MATCH, $+, $MULTILINE_MATCHING, $*, input_line_number HANDLE
-EXPR, $INPUT_LINE_NUMBER, $NR, $, input_record_separator HANDLE EXPR,
-$INPUT_RECORD_SEPARATOR, $RS, $/, autoflush HANDLE EXPR, $OUTPUT_AUTOFLUSH,
-$|, output_field_separator HANDLE EXPR, $OUTPUT_FIELD_SEPARATOR, $OFS, $,,
-output_record_separator HANDLE EXPR, $OUTPUT_RECORD_SEPARATOR, $ORS, $\,
-$LIST_SEPARATOR, $", $SUBSCRIPT_SEPARATOR, $SUBSEP, $;, $OFMT, $#,
-format_page_number HANDLE EXPR, $FORMAT_PAGE_NUMBER, $%,
-format_lines_per_page HANDLE EXPR, $FORMAT_LINES_PER_PAGE, $=,
-format_lines_left HANDLE EXPR, $FORMAT_LINES_LEFT, $-, format_name HANDLE
-EXPR, $FORMAT_NAME, $~, format_top_name HANDLE EXPR, $FORMAT_TOP_NAME, $^,
-format_line_break_characters HANDLE EXPR, $FORMAT_LINE_BREAK_CHARACTERS,
-$:, format_formfeed HANDLE EXPR, $FORMAT_FORMFEED, $^L, $ACCUMULATOR, $^A,
-$CHILD_ERROR, $?, $OS_ERROR, $ERRNO, $!, $EXTENDED_OS_ERROR, $^E,
-$EVAL_ERROR, $@, $PROCESS_ID, $PID, $$, $REAL_USER_ID, $UID, $<,
-$EFFECTIVE_USER_ID, $EUID, $>, $REAL_GROUP_ID, $GID, $(,
-$EFFECTIVE_GROUP_ID, $EGID, $), $PROGRAM_NAME, $0, $[, $PERL_VERSION, $],
-$DEBUGGING, $^D, $SYSTEM_FD_MAX, $^F, $^H, $INPLACE_EDIT, $^I, $^M,
-$OSNAME, $^O, $PERLDB, $^P, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, $^R, $^S,
-$BASETIME, $^T, $WARNING, $^W, $EXECUTABLE_NAME, $^X, $ARGV, @ARGV, @INC,
-@_, %INC, %ENV $ENV{expr}, %SIG $SIG{expr}
+$ARG, $_, $<I<digits>>, $MATCH, $&, $PREMATCH, $`, $POSTMATCH, $',
+$LAST_PAREN_MATCH, $+, @+, $MULTILINE_MATCHING, $*, input_line_number
+HANDLE EXPR, $INPUT_LINE_NUMBER, $NR, $, input_record_separator HANDLE
+EXPR, $INPUT_RECORD_SEPARATOR, $RS, $/, autoflush HANDLE EXPR,
+$OUTPUT_AUTOFLUSH, $|, output_field_separator HANDLE EXPR,
+$OUTPUT_FIELD_SEPARATOR, $OFS, $,, output_record_separator HANDLE EXPR,
+$OUTPUT_RECORD_SEPARATOR, $ORS, $\, $LIST_SEPARATOR, $",
+$SUBSCRIPT_SEPARATOR, $SUBSEP, $;, $OFMT, $#, format_page_number HANDLE
+EXPR, $FORMAT_PAGE_NUMBER, $%, format_lines_per_page HANDLE EXPR,
+$FORMAT_LINES_PER_PAGE, $=, format_lines_left HANDLE EXPR,
+$FORMAT_LINES_LEFT, $-, @-, C<$`> is the same as C<substr($var, 0, $-[0]>),
+C<$&> is the same as C<substr($var, $-[0], $+[0] - $-[0]>), C<$'> is the
+same as C<substr($var, $+[0]>), C<$1> is the same as C<substr($var, $-[1],
+$+[1] - $-[1])>, C<$2> is the same as C<substr($var, $-[2], $+[2] -
+$-[2])>, C<$3> is the same as C<substr $var, $-[3], $+[3] - $-[3]>),
+format_name HANDLE EXPR, $FORMAT_NAME, $~, format_top_name HANDLE EXPR,
+$FORMAT_TOP_NAME, $^, format_line_break_characters HANDLE EXPR,
+$FORMAT_LINE_BREAK_CHARACTERS, $:, format_formfeed HANDLE EXPR,
+$FORMAT_FORMFEED, $^L, $ACCUMULATOR, $^A, $CHILD_ERROR, $?, $OS_ERROR,
+$ERRNO, $!, $EXTENDED_OS_ERROR, $^E, $EVAL_ERROR, $@, $PROCESS_ID, $PID,
+$$, $REAL_USER_ID, $UID, $<, $EFFECTIVE_USER_ID, $EUID, $>, $REAL_GROUP_ID,
+$GID, $(, $EFFECTIVE_GROUP_ID, $EGID, $), $PROGRAM_NAME, $0, $[, $],
+$COMPILING, $^C, $DEBUGGING, $^D, $SYSTEM_FD_MAX, $^F, $^H, %^H,
+$INPLACE_EDIT, $^I, $^M, $OSNAME, $^O, $PERLDB, $^P, 0x01, 0x02, 0x04,
+0x08, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, $LAST_REGEXP_CODE_RESULT, $^R,
+$EXCEPTIONS_BEING_CAUGHT, $^S, $BASETIME, $^T, $PERL_VERSION, $^V,
+$WARNING, $^W, ${^WARNING_BITS}, ${^WIDE_SYSTEM_CALLS}, $EXECUTABLE_NAME,
+$^X, $ARGV, @ARGV, @INC, @_, %INC, %ENV, $ENV{expr}, %SIG, $SIG{expr}
=item Error Indicators
+=item Technical Note on the Syntax of Variable Names
+
+=back
+
+=item BUGS
+
=back
=head2 perlsub - Perl subroutines
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=over
-=item Private Variables via C<my()>
+=item Private Variables via my()
=item Persistent Private Variables
=item Temporary Values via local()
+=item Lvalue subroutines
+
=item Passing Symbol Table Entries (typeglobs)
=item When to Still Use local()
-1. You need to give a global variable a temporary value, especially C<$_>,
-2. You need to create a local file or directory handle or a local function,
-3. You want to temporarily change just one element of an array or hash
+1. You need to give a global variable a temporary value, especially $_, 2.
+You need to create a local file or directory handle or a local function, 3.
+You want to temporarily change just one element of an array or hash
=item Pass by Reference
@@ -1371,16 +1939,22 @@ $BASETIME, $^T, $WARNING, $^W, $EXECUTABLE_NAME, $^X, $ARGV, @ARGV, @INC,
=item Constant Functions
-=item Overriding Builtin Functions
+=item Overriding Built-in Functions
=item Autoloading
+=item Subroutine Attributes
+
=back
=item SEE ALSO
+=back
+
=head2 perlmod - Perl modules (packages and symbol tables)
+=over
+
=item DESCRIPTION
=over
@@ -1399,8 +1973,12 @@ $BASETIME, $^T, $WARNING, $^W, $EXECUTABLE_NAME, $^X, $ARGV, @ARGV, @INC,
=item SEE ALSO
+=back
+
=head2 perlmodlib - constructing new Perl modules and finding existing ones
+=over
+
=item DESCRIPTION
=item THE PERL MODULE LIBRARY
@@ -1409,27 +1987,40 @@ $BASETIME, $^T, $WARNING, $^W, $EXECUTABLE_NAME, $^X, $ARGV, @ARGV, @INC,
=item Pragmatic Modules
-use autouse MODULE => qw(sub1 sub2 sub3), blib, diagnostics, integer, less,
-lib, locale, ops, overload, re, sigtrap, strict, subs, vmsish, vars
+attributes, attrs, autouse, base, blib, caller, charnames, constant,
+diagnostics, fields, filetest, integer, less, lib, locale, ops, overload,
+re, sigtrap, strict, subs, utf8, vars, warnings
=item Standard Modules
-AnyDBM_File, AutoLoader, AutoSplit, Benchmark, CPAN, CPAN::FirstTime,
-CPAN::Nox, Carp, Class::Struct, Config, Cwd, DB_File, Devel::SelfStubber,
-DirHandle, DynaLoader, English, Env, Exporter, ExtUtils::Embed,
-ExtUtils::Install, ExtUtils::Liblist, ExtUtils::MM_OS2, ExtUtils::MM_Unix,
-ExtUtils::MM_VMS, ExtUtils::MakeMaker, ExtUtils::Manifest,
-ExtUtils::Mkbootstrap, ExtUtils::Mksymlists, ExtUtils::testlib, Fatal,
-Fcntl, File::Basename, File::CheckTree, File::Compare, File::Copy,
-File::Find, File::Path, File::stat, FileCache, FileHandle, FindBin,
-GDBM_File, Getopt::Long, Getopt::Std, I18N::Collate, IO, IO::File,
-IO::Handle, IO::Pipe, IO::Seekable, IO::Select, IO::Socket, IPC::Open2,
-IPC::Open3, Math::BigFloat, Math::BigInt, Math::Complex, Math::Trig,
-NDBM_File, Net::Ping, Net::hostent, Net::netent, Net::protoent,
-Net::servent, Opcode, Pod::Text, POSIX, SDBM_File, Safe, Search::Dict,
-SelectSaver, SelfLoader, Shell, Socket, Symbol, Sys::Hostname, Sys::Syslog,
-Term::Cap, Term::Complete, Term::ReadLine, Test::Harness, Text::Abbrev,
-Text::ParseWords, Text::Soundex, Text::Tabs, Text::Wrap, Tie::Hash,
+AnyDBM_File, AutoLoader, AutoSplit, B, B::Asmdata, B::Assembler, B::Bblock,
+B::Bytecode, B::C, B::CC, B::Debug, B::Deparse, B::Disassembler, B::Lint,
+B::Showlex, B::Stackobj, B::Terse, B::Xref, Benchmark, ByteLoader, CGI,
+CGI::Apache, CGI::Carp, CGI::Cookie, CGI::Fast, CGI::Pretty, CGI::Push,
+CGI::Switch, CPAN, CPAN::FirstTime, CPAN::Nox, Carp, Carp::Heavy,
+Class::Struct, Config, Cwd, DB, DB_File, Data::Dumper, Devel::DProf,
+Devel::Peek, Devel::SelfStubber, DirHandle, Dumpvalue, DynaLoader, English,
+Env, Errno, Exporter, Exporter::Heavy, ExtUtils::Command, ExtUtils::Embed,
+ExtUtils::Install, ExtUtils::Installed, ExtUtils::Liblist,
+ExtUtils::MM_Cygwin, ExtUtils::MM_OS2, ExtUtils::MM_Unix, ExtUtils::MM_VMS,
+ExtUtils::MM_Win32, ExtUtils::MakeMaker, ExtUtils::Manifest,
+ExtUtils::Mkbootstrap, ExtUtils::Mksymlists, ExtUtils::Packlist,
+ExtUtils::testlib, Fatal, Fcntl, File::Basename, File::CheckTree,
+File::Compare, File::Copy, File::DosGlob, File::Find, File::Glob,
+File::Path, File::Spec, File::Spec::Functions, File::Spec::Mac,
+File::Spec::OS2, File::Spec::Unix, File::Spec::VMS, File::Spec::Win32,
+File::stat, FileCache, FileHandle, FindBin, GDBM_File, Getopt::Long,
+Getopt::Std, I18N::Collate, IO, IO::Dir, IO::File, IO::Handle, IO::Pipe,
+IO::Poll, IO::Seekable, IO::Select, IO::Socket, IO::Socket::INET,
+IO::Socket::UNIX, IPC::Msg, IPC::Open2, IPC::Open3, IPC::Semaphore,
+IPC::SysV, Math::BigFloat, Math::BigInt, Math::Complex, Math::Trig,
+Net::Ping, Net::hostent, Net::netent, Net::protoent, Net::servent, O,
+Opcode, POSIX, Pod::Checker, Pod::Html, Pod::InputObjects, Pod::Man,
+Pod::Parser, Pod::Select, Pod::Text, Pod::Text::Color, Pod::Usage,
+SDBM_File, Safe, Search::Dict, SelectSaver, SelfLoader, Shell, Socket,
+Symbol, Sys::Hostname, Sys::Syslog, Term::Cap, Term::Complete,
+Term::ReadLine, Test, Test::Harness, Text::Abbrev, Text::ParseWords,
+Text::Soundex, Text::Wrap, Tie::Array, Tie::Handle, Tie::Hash,
Tie::RefHash, Tie::Scalar, Tie::SubstrHash, Time::Local, Time::gmtime,
Time::localtime, Time::tm, UNIVERSAL, User::grent, User::pwent
@@ -1451,8 +2042,8 @@ World Wide Web, HTML, HTTP, CGI, MIME, Server and Daemon Utilities,
Archiving and Compression, Images, Pixmap and Bitmap Manipulation, Drawing,
and Graphing, Mail and Usenet News, Control Flow Utilities (callbacks and
exceptions etc), File Handle and Input/Output Stream Utilities,
-Miscellaneous Modules, Africa, Asia, Australasia, Europe, North America,
-South America
+Miscellaneous Modules, Africa, Asia, Australasia, Central America, Europe,
+North America, South America
=item Modules: Creation, Use, and Abuse
@@ -1491,8 +2082,12 @@ can then be reduced to a small
=item NOTE
+=back
+
=head2 perlmodinstall - Installing CPAN Modules
+=over
+
=item DESCRIPTION
=over
@@ -1510,8 +2105,50 @@ module (sometimes unnecessary), B<INSTALL> the module
=item COPYRIGHT
+=back
+
+=head2 perlfork - Perl's fork() emulation
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over
+
+=item Behavior of other Perl features in forked pseudo-processes
+
+$$ or $PROCESS_ID, %ENV, chdir() and all other builtins that accept
+filenames, wait() and waitpid(), kill(), exec(), exit(), Open handles to
+files, directories and network sockets
+
+=item Resource limits
+
+=item Killing the parent process
+
+=item Lifetime of the parent process and pseudo-processes
+
+=item CAVEATS AND LIMITATIONS
+
+BEGIN blocks, Open filehandles, Forking pipe open() not yet implemented,
+Global state maintained by XSUBs, Interpreter embedded in larger
+application, Thread-safety of extensions
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
=head2 perlform - Perl formats
+=over
+
=item DESCRIPTION
=over
@@ -1532,9 +2169,13 @@ module (sometimes unnecessary), B<INSTALL> the module
=item WARNINGS
+=back
+
=head2 perllocale - Perl locale handling (internationalization and
localization)
+=over
+
=item DESCRIPTION
=item PREPARING TO USE LOCALES
@@ -1555,9 +2196,9 @@ localization)
=item Permanently fixing locale problems
-=item Permanently fixing your locale configuration
+=item Permanently fixing your system's locale configuration
-=item Permanently fixing system locale configuration
+=item Fixing system locale configuration
=item The localeconv function
@@ -1586,18 +2227,17 @@ localization)
B<Comparison operators> (C<lt>, C<le>, C<ge>, C<gt> and C<cmp>):,
B<Case-mapping interpolation> (with C<\l>, C<\L>, C<\u> or C<\U>),
B<Matching operator> (C<m//>):, B<Substitution operator> (C<s///>):,
-B<In-memory formatting function> (sprintf()):, B<Output formatting
-functions> (printf() and write()):, B<Case-mapping functions> (lc(),
-lcfirst(), uc(), ucfirst()):, B<POSIX locale-dependent functions>
-(localeconv(), strcoll(),strftime(), strxfrm()):, B<POSIX character class
-tests> (isalnum(), isalpha(), isdigit(),isgraph(), islower(), isprint(),
-ispunct(), isspace(), isupper(),
+B<Output formatting functions> (printf() and write()):, B<Case-mapping
+functions> (lc(), lcfirst(), uc(), ucfirst()):, B<POSIX locale-dependent
+functions> (localeconv(), strcoll(),strftime(), strxfrm()):, B<POSIX
+character class tests> (isalnum(), isalpha(), isdigit(),isgraph(),
+islower(), isprint(), ispunct(), isspace(), isupper(),
isxdigit()):
=item ENVIRONMENT
-PERL_BADLANG, LC_ALL, LC_CTYPE, LC_COLLATE, LC_MONETARY, LC_NUMERIC,
-LC_TIME, LANG
+PERL_BADLANG, LC_ALL, LANGUAGE, LC_CTYPE, LC_COLLATE, LC_MONETARY,
+LC_NUMERIC, LC_TIME, LANG
=item NOTES
@@ -1631,8 +2271,14 @@ LC_TIME, LANG
=item HISTORY
+=back
+
=head2 perlref - Perl references and nested data structures
+=over
+
+=item NOTE
+
=item DESCRIPTION
=over
@@ -1655,8 +2301,52 @@ LC_TIME, LANG
=item SEE ALSO
+=back
+
+=head2 perlreftut - Mark's very short tutorial about references
+
+=over
+
+=item DESCRIPTION
+
+=item Who Needs Complicated Data Structures?
+
+=item The Solution
+
+=item Syntax
+
+=over
+
+=item Making References
+
+=item Using References
+
+=back
+
+=item An Example
+
+=item Arrow Rule
+
+=item Solution
+
+=item The Rest
+
+=item Summary
+
+=item Credits
+
+=over
+
+=item Distribution Conditions
+
+=back
+
+=back
+
=head2 perldsc - Perl Data Structures Cookbook
+=over
+
=item DESCRIPTION
arrays of arrays, hashes of arrays, arrays of hashes, hashes of hashes,
@@ -1674,39 +2364,39 @@ more elaborate constructs
=item CODE EXAMPLES
-=item LISTS OF LISTS
+=item ARRAYS OF ARRAYS
=over
-=item Declaration of a LIST OF LISTS
+=item Declaration of a ARRAY OF ARRAYS
-=item Generation of a LIST OF LISTS
+=item Generation of a ARRAY OF ARRAYS
-=item Access and Printing of a LIST OF LISTS
+=item Access and Printing of a ARRAY OF ARRAYS
=back
-=item HASHES OF LISTS
+=item HASHES OF ARRAYS
=over
-=item Declaration of a HASH OF LISTS
+=item Declaration of a HASH OF ARRAYS
-=item Generation of a HASH OF LISTS
+=item Generation of a HASH OF ARRAYS
-=item Access and Printing of a HASH OF LISTS
+=item Access and Printing of a HASH OF ARRAYS
=back
-=item LISTS OF HASHES
+=item ARRAYS OF HASHES
=over
-=item Declaration of a LIST OF HASHES
+=item Declaration of a ARRAY OF HASHES
-=item Generation of a LIST OF HASHES
+=item Generation of a ARRAY OF HASHES
-=item Access and Printing of a LIST OF HASHES
+=item Access and Printing of a ARRAY OF HASHES
=back
@@ -1740,11 +2430,15 @@ more elaborate constructs
=item AUTHOR
-=head2 perllol, perlLoL - Manipulating Lists of Lists in Perl
+=back
+
+=head2 perllol - Manipulating Arrays of Arrays in Perl
+
+=over
=item DESCRIPTION
-=item Declaration and Access of Lists of Lists
+=item Declaration and Access of Arrays of Arrays
=item Growing Your Own
@@ -1756,8 +2450,70 @@ more elaborate constructs
=item AUTHOR
+=back
+
+=head2 perlboot - Beginner's Object-Oriented Tutorial
+
+=over
+
+=item DESCRIPTION
+
+=over
+
+=item If we could talk to the animals...
+
+=item Introducing the method invocation arrow
+
+=item Invoking a barnyard
+
+=item The extra parameter of method invocation
+
+=item Calling a second method to simplify things
+
+=item Inheriting the windpipes
+
+=item A few notes about @ISA
+
+=item Overriding the methods
+
+=item Starting the search from a different place
+
+=item The SUPER way of doing things
+
+=item Where we're at so far...
+
+=item A horse is a horse, of course of course -- or is it?
+
+=item Invoking an instance method
+
+=item Accessing the instance data
+
+=item How to build a horse
+
+=item Inheriting the constructor
+
+=item Making a method work with either classes or instances
+
+=item Adding parameters to a method
+
+=item More interesting instances
+
+=item A horse of a different color
+
+=item Summary
+
+=back
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
=head2 perltoot - Tom's object-oriented tutorial for perl
+=over
+
=item DESCRIPTION
=item Creating a Class
@@ -1852,8 +2608,64 @@ more elaborate constructs
=back
+=back
+
+=head2 perltootc - Tom's OO Tutorial for Class Data in Perl
+
+=over
+
+=item DESCRIPTION
+
+=item Class Data as Package Variables
+
+=over
+
+=item Putting All Your Eggs in One Basket
+
+=item Inheritance Concerns
+
+=item The Eponymous Meta-Object
+
+=item Indirect References to Class Data
+
+=item Monadic Classes
+
+=item Translucent Attributes
+
+=back
+
+=item Class Data as Lexical Variables
+
+=over
+
+=item Privacy and Responsibility
+
+=item File-Scoped Lexicals
+
+=item More Inheritance Concerns
+
+=item Locking the Door and Throwing Away the Key
+
+=item Translucency Revisited
+
+=back
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=item ACKNOWLEDGEMENTS
+
+=item HISTORY
+
+=back
+
=head2 perlobj - Perl objects
+=over
+
=item DESCRIPTION
=over
@@ -1866,14 +2678,14 @@ more elaborate constructs
=item Method Invocation
+=item WARNING
+
=item Default UNIVERSAL methods
isa(CLASS), can(METHOD), VERSION( [NEED] )
=item Destructors
-=item WARNING
-
=item Summary
=item Two-Phased Garbage Collection
@@ -1882,8 +2694,12 @@ isa(CLASS), can(METHOD), VERSION( [NEED] )
=item SEE ALSO
+=back
+
=head2 perltie - how to hide an object class in a simple variable
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -1920,8 +2736,12 @@ LIST, READ this, LIST, READLINE this, GETC this, CLOSE this, DESTROY this
=item AUTHOR
+=back
+
=head2 perlbot - Bag'o Object Tricks (the BOT)
+=over
+
=item DESCRIPTION
=item OO SCALING TIPS
@@ -1946,9 +2766,13 @@ LIST, READ this, LIST, READLINE this, GETC this, CLOSE this, DESTROY this
=item DELEGATION
+=back
+
=head2 perlipc - Perl interprocess communication (signals, fifos, pipes,
safe subprocesses, sockets, and semaphores)
+=over
+
=item DESCRIPTION
=item Signals
@@ -2021,8 +2845,39 @@ Proto, LocalPort, Listen, Reuse
=item SEE ALSO
+=back
+
+=head2 perldbmfilter - Perl DBM Filters
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
+B<filter_fetch_value>
+
+=over
+
+=item The Filter
+
+=item An Example -- the NULL termination problem.
+
+=item Another Example -- Key is a C int.
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
=head2 perldebug - Perl debugging
+=over
+
=item DESCRIPTION
=item The Perl Debugger
@@ -2032,24 +2887,28 @@ Proto, LocalPort, Listen, Reuse
=item Debugger Commands
h [command], p expr, x expr, V [pkg [vars]], X [vars], T, s [expr], n
-[expr], E<lt>CRE<gt>, c [line|sub], l, l min+incr, l min-max, l line, l
-subname, -, w [line], f filename, /pattern/, ?pattern?, L, S [[!]pattern],
-t, t expr, b [line] [condition], b subname [condition], b postpone subname
+[expr], r, <CR>, c [line|sub], l, l min+incr, l min-max, l line, l subname,
+-, w [line], f filename, /pattern/, ?pattern?, L, S [[!]regex], t, t expr,
+b [line] [condition], b subname [condition], b postpone subname
[condition], b load filename, b compile subname, d [line], D, a [line]
-command, A, W [expr], W, O [opt[=val]] [opt"val"] [opt?]..,
+command, a [line], A, W expr, W, O booloption .., O anyoption? .., O
+option=value .., < ?, < [ command ], << command, > ?, > command, >>
+command, { ?, { [ command ], {{ command, ! number, ! -number, ! pattern, !!
+cmd, H -number, q or ^D, R, |dbcmd, ||dbcmd, command, m expr, man [manpage]
+
+=item Configurable Options
+
C<recallCommand>, C<ShellBang>, C<pager>, C<tkRunning>, C<signalLevel>,
C<warnLevel>, C<dieLevel>, C<AutoTrace>, C<LineInfo>, C<inhibit_exit>,
C<PrintRet>, C<ornaments>, C<frame>, C<maxTraceLen>, C<arrayDepth>,
C<hashDepth>, C<compactDump>, C<veryCompact>, C<globPrint>, C<DumpDBFiles>,
C<DumpPackages>, C<DumpReused>, C<quote>, C<HighBit>, C<undefPrint>,
-C<UsageOnly>, C<TTY>, C<noTTY>, C<ReadLine>, C<NonStop>, E<lt> [ command ],
-E<lt>E<lt> command, E<gt> command, E<gt>E<gt> command, { [ command ], {{
-command, ! number, ! -number, ! pattern, !! cmd, H -number, q or ^D, R,
-|dbcmd, ||dbcmd, command, m expr, m package
+C<UsageOnly>, C<TTY>, C<noTTY>, C<ReadLine>, C<NonStop>
=item Debugger input/output
-Prompt, Multiline commands, Stack backtrace, Listing, Frame listing
+Prompt, Multiline commands, Stack backtrace, Line Listing Format, Frame
+listing
=item Debugging compile-time statements
@@ -2061,38 +2920,59 @@ Prompt, Multiline commands, Stack backtrace, Listing, Frame listing
=item The Perl Profiler
-=item Debugger support in perl
+=back
-=item Debugger Internals
+=item Debugging regular expressions
-=item Other resources
+=item Debugging memory usage
+
+=item SEE ALSO
=item BUGS
=back
-=item Debugging Perl memory usage
+=head2 perlnumber - semantics of numbers and numeric operations in Perl
=over
-=item Using C<$ENV{PERL_DEBUG_MSTATS}>
+=item SYNOPSIS
-C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>, Free/Used, C<Total sbrk():
-SBRKed/SBRKs:CONTINUOUS>, C<pad: 0>, C<heads: 2192>, C<chain: 0>, C<tail:
-6144>
+=item DESCRIPTION
-=item Example of using B<-DL> switch
+=item Storing numbers
-C<717>, C<002>, C<054>, C<602>, C<702>, C<704>
+=item Numeric operators and numeric conversions
-=item B<-DL> details
+=item Flavors of Perl numeric operations
-C<!!!>, C<!!>, C<!>
+Arithmetic operators except, C<no integer>, Arithmetic operators except,
+C<use integer>, Bitwise operators, C<no integer>, Bitwise operators, C<use
+integer>, Operators which expect an integer, Operators which expect a
+string
+
+=item AUTHOR
-=item Limitations of B<-DL> statistic
+=item SEE ALSO
+
+=back
+
+=head2 perldebguts - Guts of Perl debugging
+
+=over
+
+=item DESCRIPTION
+
+=item Debugger Internals
+
+=over
+
+=item Writing Your Own Debugger
=back
+=item Frame Listing Output Examples
+
=item Debugging regular expressions
=over
@@ -2110,12 +2990,44 @@ C<anchored(TYPE)>
=back
+=item Debugging Perl memory usage
+
+=over
+
+=item Using C<$ENV{PERL_DEBUG_MSTATS}>
+
+C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>, Free/Used, C<Total sbrk():
+SBRKed/SBRKs:CONTINUOUS>, C<pad: 0>, C<heads: 2192>, C<chain: 0>, C<tail:
+6144>
+
+=item Example of using B<-DL> switch
+
+C<717>, C<002>, C<054>, C<602>, C<702>, C<704>
+
+=item B<-DL> details
+
+C<!!!>, C<!!>, C<!>
+
+=item Limitations of B<-DL> statistics
+
+=back
+
+=item SEE ALSO
+
+=back
+
=head2 perldiag - various Perl diagnostics
+=over
+
=item DESCRIPTION
+=back
+
=head2 perlsec - Perl security
+=over
+
=item DESCRIPTION
=over
@@ -2134,8 +3046,12 @@ C<anchored(TYPE)>
=item SEE ALSO
+=back
+
=head2 perltrap - Perl traps for the unwary
+=over
+
=item DESCRIPTION
=over
@@ -2161,7 +3077,7 @@ Subroutine, Signal, Sorting Traps, OS Traps, DBM Traps, Unclassified Traps
Discontinuance, Deprecation, BugFix, Discontinuance, Discontinuance,
Discontinuance, BugFix, Discontinuance, Discontinuance, BugFix,
-Discontinuance, Discontinuance, Deprecation, Discontinuance
+Discontinuance, Deprecation, Discontinuance
=item Parsing Traps
@@ -2169,7 +3085,7 @@ Parsing, Parsing, Parsing, Parsing
=item Numerical Traps
-Numerical, Numerical, Numerical
+Numerical, Numerical, Numerical, Bitwise string ops
=item General data type traps
@@ -2215,11 +3131,15 @@ LIMIT specified
=back
+=back
+
=head2 perlport - Writing portable Perl
+=over
+
=item DESCRIPTION
-Not all Perl programs have to be portable, The vast majority of Perl B<is>
+Not all Perl programs have to be portable, Nearly all of Perl already I<is>
portable
=item ISSUES
@@ -2228,7 +3148,9 @@ portable
=item Newlines
-=item File Paths
+=item Numbers endianness and Width
+
+=item Files and Filesystems
=item System Interaction
@@ -2240,6 +3162,10 @@ portable
=item Time and Date
+=item Character sets and character encoding
+
+=item Internationalisation
+
=item System Resources
=item Security
@@ -2248,10 +3174,10 @@ portable
=back
-=item CPAN TESTERS
+=item CPAN Testers
Mailing list: cpan-testers@perl.org, Testing results:
-C<http://www.connect.net/gbarr/cpan-test/>
+http://testers.cpan.org/
=item PLATFORMS
@@ -2261,32 +3187,20 @@ C<http://www.connect.net/gbarr/cpan-test/>
=item DOS and Derivatives
-The djgpp environment for DOS, C<http://www.delorie.com/djgpp/>, The EMX
-environment for DOS, OS/2, etc.
-C<emx@iaehv.nl>,C<http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/index.html>,
-C<ftp://hobbes.nmsu.edu/pub/os2/dev/emx>. Build instructions
-for Win32, L<perlwin32>, The ActiveState Pages,
-C<http://www.activestate.com/>
-
-=item MacPerl
+Build instructions for OS/2, L<perlos2>
-The MacPerl Pages, C<http://www.ptf.com/macperl/>, The MacPerl mailing
-list, C<mac-perl-request@iis.ee.ethz.ch>
+=item S<Mac OS>
=item VMS
-L<perlvms.pod>, vmsperl list, C<vmsperl-request@newman.upenn.edu>, vmsperl
-on the web, C<http://www.sidhe.org/vmsperl/index.html>
+=item VOS
=item EBCDIC Platforms
-perl-mvs list, AS/400 Perl information at C<http://as400.rochester.ibm.com>
+=item Acorn RISC OS
=item Other perls
-Atari, Guido Flohr's page C<http://stud.uni-sb.de/~gufl0000/>, HP 300
-MPE/iX C<http://www.cccd.edu/~markb/perlix.html>, Novell Netware
-
=back
=item FUNCTION IMPLEMENTATIONS
@@ -2295,42 +3209,65 @@ MPE/iX C<http://www.cccd.edu/~markb/perlix.html>, Novell Netware
=item Alphabetical Listing of Perl Functions
--I<X> FILEHANDLE, -I<X> EXPR, -I<X>, binmode FILEHANDLE, chmod LIST, chown
-LIST, chroot FILENAME, chroot, crypt PLAINTEXT,SALT, dbmclose HASH, dbmopen
-HASH,DBNAME,MODE, dump LABEL, exec LIST, fcntl FILEHANDLE,FUNCTION,SCALAR,
-flock FILEHANDLE,OPERATION, fork, getlogin, getpgrp PID, getppid,
-getpriority WHICH,WHO, getpwnam NAME, getgrnam NAME, getnetbyname NAME,
-getpwuid UID, getgrgid GID, getnetbyaddr ADDR,ADDRTYPE, getprotobynumber
-NUMBER, getservbyport PORT,PROTO, getpwent, getgrent, gethostent,
-getnetent, getprotoent, getservent, setpwent, setgrent, sethostent
-STAYOPEN, setnetent STAYOPEN, setprotoent STAYOPEN, setservent STAYOPEN,
-endpwent, endgrent, endhostent, endnetent, endprotoent, endservent,
-getsockopt SOCKET,LEVEL,OPTNAME, glob EXPR, glob, ioctl
-FILEHANDLE,FUNCTION,SCALAR, kill LIST, link OLDFILE,NEWFILE, lstat
-FILEHANDLE, lstat EXPR, lstat, msgctl ID,CMD,ARG, msgget KEY,FLAGS, msgsnd
-ID,MSG,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, open FILEHANDLE,EXPR, open
-FILEHANDLE, pipe READHANDLE,WRITEHANDLE, readlink EXPR, readlink, select
-RBITS,WBITS,EBITS,TIMEOUT, semctl ID,SEMNUM,CMD,ARG, semget
-KEY,NSEMS,FLAGS, semop KEY,OPSTRING, setpgrp PID,PGRP, setpriority
-WHICH,WHO,PRIORITY, setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL, shmctl
-ID,CMD,ARG, shmget KEY,SIZE,FLAGS, shmread ID,VAR,POS,SIZE, shmwrite
-ID,STRING,POS,SIZE, socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL, stat
-FILEHANDLE, stat EXPR, stat, symlink OLDFILE,NEWFILE, syscall LIST, system
-LIST, times, truncate FILEHANDLE,LENGTH, truncate EXPR,LENGTH, umask EXPR,
-umask, utime LIST, wait, waitpid PID,FLAGS
+-I<X> FILEHANDLE, -I<X> EXPR, -I<X>, alarm SECONDS, alarm, binmode
+FILEHANDLE, chmod LIST, chown LIST, chroot FILENAME, chroot, crypt
+PLAINTEXT,SALT, dbmclose HASH, dbmopen HASH,DBNAME,MODE, dump LABEL, exec
+LIST, fcntl FILEHANDLE,FUNCTION,SCALAR, flock FILEHANDLE,OPERATION, fork,
+getlogin, getpgrp PID, getppid, getpriority WHICH,WHO, getpwnam NAME,
+getgrnam NAME, getnetbyname NAME, getpwuid UID, getgrgid GID, getnetbyaddr
+ADDR,ADDRTYPE, getprotobynumber NUMBER, getservbyport PORT,PROTO, getpwent,
+getgrent, gethostent, getnetent, getprotoent, getservent, setpwent,
+setgrent, sethostent STAYOPEN, setnetent STAYOPEN, setprotoent STAYOPEN,
+setservent STAYOPEN, endpwent, endgrent, endhostent, endnetent,
+endprotoent, endservent, getsockopt SOCKET,LEVEL,OPTNAME, glob EXPR, glob,
+ioctl FILEHANDLE,FUNCTION,SCALAR, kill SIGNAL, LIST, link OLDFILE,NEWFILE,
+lstat FILEHANDLE, lstat EXPR, lstat, msgctl ID,CMD,ARG, msgget KEY,FLAGS,
+msgsnd ID,MSG,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, open FILEHANDLE,EXPR,
+open FILEHANDLE, pipe READHANDLE,WRITEHANDLE, readlink EXPR, readlink,
+select RBITS,WBITS,EBITS,TIMEOUT, semctl ID,SEMNUM,CMD,ARG, semget
+KEY,NSEMS,FLAGS, semop KEY,OPSTRING, setgrent, setpgrp PID,PGRP,
+setpriority WHICH,WHO,PRIORITY, setpwent, setsockopt
+SOCKET,LEVEL,OPTNAME,OPTVAL, shmctl ID,CMD,ARG, shmget KEY,SIZE,FLAGS,
+shmread ID,VAR,POS,SIZE, shmwrite ID,STRING,POS,SIZE, socketpair
+SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL, stat FILEHANDLE, stat EXPR, stat,
+symlink OLDFILE,NEWFILE, syscall LIST, sysopen
+FILEHANDLE,FILENAME,MODE,PERMS, system LIST, times, truncate
+FILEHANDLE,LENGTH, truncate EXPR,LENGTH, umask EXPR, umask, utime LIST,
+wait, waitpid PID,FLAGS
=back
+=item CHANGES
+
+v1.47, 22 March 2000, v1.46, 12 February 2000, v1.45, 20 December 1999,
+v1.44, 19 July 1999, v1.43, 24 May 1999, v1.42, 22 May 1999, v1.41, 19 May
+1999, v1.40, 11 April 1999, v1.39, 11 February 1999, v1.38, 31 December
+1998, v1.37, 19 December 1998, v1.36, 9 September 1998, v1.35, 13 August
+1998, v1.33, 06 August 1998, v1.32, 05 August 1998, v1.30, 03 August 1998,
+v1.23, 10 July 1998
+
+=item Supported Platforms
+
+=item SEE ALSO
+
=item AUTHORS / CONTRIBUTORS
=item VERSION
+=back
+
=head2 perlstyle - Perl style guide
+=over
+
=item DESCRIPTION
+=back
+
=head2 perlpod - plain old documentation
+=over
+
=item DESCRIPTION
=over
@@ -2353,12 +3290,20 @@ umask, utime LIST, wait, waitpid PID,FLAGS
=item AUTHOR
+=back
+
=head2 perlbook - Perl book information
+=over
+
=item DESCRIPTION
+=back
+
=head2 perlembed - how to embed perl in your C program
+=over
+
=item DESCRIPTION
=over
@@ -2399,8 +3344,12 @@ program
=item COPYRIGHT
+=back
+
=head2 perlapio - perl's IO abstraction interface.
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -2429,8 +3378,12 @@ B<PerlIO_get_base(f)>, B<PerlIO_get_bufsiz(f)>
=back
+=back
+
=head2 perlxs - XS language reference manual
+=over
+
=item DESCRIPTION
=over
@@ -2519,59 +3472,99 @@ B<PerlIO_get_base(f)>, B<PerlIO_get_bufsiz(f)>
=item AUTHOR
-=head2 perlxstut, perlXStut - Tutorial for XSUBs
+=back
+
+=head2 perlxstut, perlXStut - Tutorial for writing XSUBs
+
+=over
=item DESCRIPTION
+=item SPECIAL NOTES
+
=over
-=item VERSION CAVEAT
+=item make
+
+=item Version caveat
+
+=item Dynamic Loading versus Static Loading
+
+=back
+
+=item TUTORIAL
-=item DYNAMIC VERSUS STATIC
+=over
=item EXAMPLE 1
=item EXAMPLE 2
-=item WHAT HAS GONE ON?
+=item What has gone on?
-=item WRITING GOOD TEST SCRIPTS
+=item Writing good test scripts
=item EXAMPLE 3
-=item WHAT'S NEW HERE?
+=item What's new here?
-=item INPUT AND OUTPUT PARAMETERS
+=item Input and Output Parameters
-=item THE XSUBPP COMPILER
+=item The XSUBPP Program
-=item THE TYPEMAP FILE
+=item The TYPEMAP file
-=item WARNING
+=item Warning about Output Arguments
=item EXAMPLE 4
-=item WHAT HAS HAPPENED HERE?
+=item What has happened here?
-=item SPECIFYING ARGUMENTS TO XSUBPP
+=item Anatomy of .xs file
-=item THE ARGUMENT STACK
+=item Getting the fat out of XSUBs
-=item EXTENDING YOUR EXTENSION
+=item More about XSUB arguments
-=item DOCUMENTING YOUR EXTENSION
+=item The Argument Stack
-=item INSTALLING YOUR EXTENSION
+=item Extending your Extension
-=item SEE ALSO
+=item Documenting your Extension
+
+=item Installing your Extension
+
+=item EXAMPLE 5
+
+=item New Things in this Example
+
+=item EXAMPLE 6 (Coming Soon)
+
+=item EXAMPLE 7 (Coming Soon)
+
+=item EXAMPLE 8 (Coming Soon)
+
+=item EXAMPLE 9 (Coming Soon)
+
+=item Troubleshooting these Examples
+
+=back
+
+=item See also
=item Author
+=over
+
=item Last Changed
=back
-=head2 perlguts - Perl's Internal Functions
+=back
+
+=head2 perlguts - Introduction to the Perl API
+
+=over
=item DESCRIPTION
@@ -2620,11 +3613,12 @@ B<PerlIO_get_base(f)>, B<PerlIO_get_bufsiz(f)>
C<SAVEINT(int i)>, C<SAVEIV(IV i)>, C<SAVEI32(I32 i)>, C<SAVELONG(long i)>,
C<SAVESPTR(s)>, C<SAVEPPTR(p)>, C<SAVEFREESV(SV *sv)>, C<SAVEFREEOP(OP
*op)>, C<SAVEFREEPV(p)>, C<SAVECLEARSV(SV *sv)>, C<SAVEDELETE(HV *hv, char
-*key, I32 length)>, C<SAVEDESTRUCTOR(f,p)>, C<SAVESTACK_POS()>, C<SV*
-save_scalar(GV *gv)>, C<AV* save_ary(GV *gv)>, C<HV* save_hash(GV *gv)>,
-C<void save_item(SV *item)>, C<void save_list(SV **sarg, I32 maxsarg)>,
-C<SV* save_svref(SV **sptr)>, C<void save_aptr(AV **aptr)>, C<void
-save_hptr(HV **hptr)>
+*key, I32 length)>, C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void
+*p)>, C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>, C<SAVESTACK_POS()>,
+C<SV* save_scalar(GV *gv)>, C<AV* save_ary(GV *gv)>, C<HV* save_hash(GV
+*gv)>, C<void save_item(SV *item)>, C<void save_list(SV **sarg, I32
+maxsarg)>, C<SV* save_svref(SV **sptr)>, C<void save_aptr(AV **aptr)>,
+C<void save_hptr(HV **hptr)>
=back
@@ -2666,67 +3660,35 @@ save_hptr(HV **hptr)>
=back
-=item API LISTING
-
-av_clear, av_extend, av_fetch, AvFILL, av_len, av_make, av_pop, av_push,
-av_shift, av_store, av_undef, av_unshift, CLASS, Copy, croak, CvSTASH,
-PL_DBsingle, PL_DBsub, PL_DBtrace, dMARK, dORIGMARK, PL_dowarn, dSP,
-dXSARGS, dXSI32, do_binmode, ENTER, EXTEND, fbm_compile, fbm_instr,
-FREETMPS, G_ARRAY, G_DISCARD, G_EVAL, GIMME, GIMME_V, G_NOARGS, G_SCALAR,
-gv_fetchmeth, gv_fetchmethod, gv_fetchmethod_autoload, G_VOID, gv_stashpv,
-gv_stashsv, GvSV, HEf_SVKEY, HeHASH, HeKEY, HeKLEN, HePV, HeSVKEY,
-HeSVKEY_force, HeSVKEY_set, HeVAL, hv_clear, hv_delayfree_ent, hv_delete,
-hv_delete_ent, hv_exists, hv_exists_ent, hv_fetch, hv_fetch_ent,
-hv_free_ent, hv_iterinit, hv_iterkey, hv_iterkeysv, hv_iternext,
-hv_iternextsv, hv_iterval, hv_magic, HvNAME, 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_len, mg_magical, mg_set, Move, PL_na, New, newAV, Newc,
-newCONSTSUB, newHV, newRV_inc, newRV_noinc, NEWSV, newSViv, newSVnv,
-newSVpv, newSVpvf, newSVpvn, newSVrv, newSVsv, newXS, newXSproto, Newz,
-Nullav, Nullch, Nullcv, Nullhv, Nullsv, ORIGMARK, perl_alloc,
-perl_call_argv, perl_call_method, perl_call_pv, perl_call_sv,
-perl_construct, perl_destruct, perl_eval_sv, perl_eval_pv, perl_free,
-perl_get_av, perl_get_cv, perl_get_hv, perl_get_sv, perl_parse,
-perl_require_pv, perl_run, POPi, POPl, POPp, POPn, POPs, PUSHMARK, PUSHi,
-PUSHn, PUSHp, PUSHs, PUSHu, PUTBACK, Renew, Renewc, RETVAL, safefree,
-safemalloc, saferealloc, savepv, savepvn, SAVETMPS, SP, SPAGAIN, ST, strEQ,
-strGE, strGT, strLE, strLT, strNE, strnEQ, strnNE, sv_2mortal, sv_bless,
-sv_catpv, sv_catpv_mg, sv_catpvn, sv_catpvn_mg, sv_catpvf, sv_catpvf_mg,
-sv_catsv, sv_catsv_mg, sv_chop, sv_cmp, SvCUR, SvCUR_set, sv_dec,
-sv_derived_from, sv_derived_from, SvEND, sv_eq, SvGETMAGIC, SvGROW,
-sv_grow, sv_inc, sv_insert, SvIOK, SvIOK_off, SvIOK_on, SvIOK_only, SvIOKp,
-sv_isa, sv_isobject, SvIV, SvIVX, SvLEN, sv_len, sv_magic, sv_mortalcopy,
-sv_newmortal, SvNIOK, SvNIOK_off, SvNIOKp, PL_sv_no, SvNOK, SvNOK_off,
-SvNOK_on, SvNOK_only, SvNOKp, SvNV, SvNVX, SvOK, SvOOK, SvPOK, SvPOK_off,
-SvPOK_on, SvPOK_only, SvPOKp, SvPV, SvPV_force, SvPVX, SvREFCNT,
-SvREFCNT_dec, SvREFCNT_inc, SvROK, SvROK_off, SvROK_on, SvRV, SvSETMAGIC,
-sv_setiv, sv_setiv_mg, sv_setnv, sv_setnv_mg, sv_setpv, sv_setpv_mg,
-sv_setpviv, sv_setpviv_mg, sv_setpvn, sv_setpvn_mg, sv_setpvf,
-sv_setpvf_mg, sv_setref_iv, sv_setref_nv, sv_setref_pv, sv_setref_pvn,
-SvSetSV, SvSetSV_nosteal, sv_setsv, sv_setsv_mg, sv_setuv, sv_setuv_mg,
-SvSTASH, SvTAINT, SvTAINTED, SvTAINTED_off, SvTAINTED_on, SVt_IV, SVt_PV,
-SVt_PVAV, SVt_PVCV, SVt_PVHV, SVt_PVMG, SVt_NV, SvTRUE, SvTYPE, svtype,
-PL_sv_undef, sv_unref, SvUPGRADE, sv_upgrade, sv_usepvn, sv_usepvn_mg,
-sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale),
-sv_vsetpvfn(sv, pat, patlen, args, svargs, svmax, used_locale), SvUV,
-SvUVX, PL_sv_yes, THIS, toLOWER, toUPPER, 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_mNV,
-XST_mNO, XST_mPV, XST_mUNDEF, XST_mYES, XS_VERSION, XS_VERSION_BOOTCHECK,
-Zero
+=item How multiple interpreters and concurrency are supported
+
+=over
+
+=item Background and PERL_IMPLICIT_CONTEXT
+
+=item How do I use all this in extensions?
+
+=item Future Plans and PERL_IMPLICIT_SYS
+
+=back
=item AUTHORS
+=item SEE ALSO
+
+=back
+
=head2 perlcall - Perl calling conventions from C
+=over
+
=item DESCRIPTION
An Error Handler, An Event Driven Program
-=item THE PERL_CALL FUNCTIONS
+=item THE CALL_ FUNCTIONS
-B<perl_call_sv>, B<perl_call_pv>, B<perl_call_method>, B<perl_call_argv>
+call_sv, call_pv, call_method, call_argv
=item FLAG VALUES
@@ -2772,11 +3734,11 @@ B<perl_call_sv>, B<perl_call_pv>, B<perl_call_method>, B<perl_call_argv>
=item Using G_KEEPERR
-=item Using perl_call_sv
+=item Using call_sv
-=item Using perl_call_argv
+=item Using call_argv
-=item Using perl_call_method
+=item Using call_method
=item Using GIMME_V
@@ -2800,8 +3762,125 @@ callback
=item DATE
+=back
+
+=head2 perlcompile - Introduction to the Perl Compiler-Translator
+
+=over
+
+=item DESCRIPTION
+
+=over
+
+=item Layout
+
+B::Bytecode, B::C, B::CC, B::Lint, B::Deparse, B::Xref
+
+=back
+
+=item Using The Back Ends
+
+=over
+
+=item The Cross Referencing Back End
+
+i, &, s, r
+
+=item The Decompiling Back End
+
+=item The Lint Back End
+
+=item The Simple C Back End
+
+=item The Bytecode Back End
+
+=item The Optimized C Back End
+
+B, O, B::Asmdata, B::Assembler, B::Bblock, B::Bytecode, B::C, B::CC,
+B::Debug, B::Deparse, B::Disassembler, B::Lint, B::Showlex, B::Stackobj,
+B::Stash, B::Terse, B::Xref
+
+=back
+
+=item KNOWN PROBLEMS
+
+=item AUTHOR
+
+=back
+
+=head2 perlapi - autogenerated documentation for the perl public API
+
+=over
+
+=item DESCRIPTION
+
+AvFILL, av_clear, av_extend, av_fetch, av_len, av_make, av_pop, av_push,
+av_shift, av_store, av_undef, av_unshift, call_argv, call_method, call_pv,
+call_sv, CLASS, Copy, croak, CvSTASH, dMARK, dORIGMARK, dSP, dXSARGS,
+dXSI32, ENTER, eval_pv, eval_sv, EXTEND, fbm_compile, fbm_instr, FREETMPS,
+get_av, get_cv, get_hv, get_sv, GIMME, GIMME_V, GvSV, gv_fetchmeth,
+gv_fetchmethod, gv_fetchmethod_autoload, gv_stashpv, gv_stashsv, G_ARRAY,
+G_DISCARD, G_EVAL, G_NOARGS, G_SCALAR, G_VOID, HEf_SVKEY, HeHASH, HeKEY,
+HeKLEN, HePV, HeSVKEY, HeSVKEY_force, HeSVKEY_set, HeVAL, HvNAME, hv_clear,
+hv_delete, hv_delete_ent, hv_exists, hv_exists_ent, hv_fetch, hv_fetch_ent,
+hv_iterinit, hv_iterkey, hv_iterkeysv, hv_iternext, hv_iternextsv,
+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,
+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_cmp, sv_dec,
+sv_derived_from, sv_eq, sv_grow, sv_inc, sv_insert, sv_isa, sv_isobject,
+sv_len, sv_magic, sv_mortalcopy, sv_newmortal, 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_unref, sv_upgrade, sv_usepvn, sv_usepvn_mg, sv_vcatpvfn,
+sv_vsetpvfn, THIS, toLOWER, toUPPER, 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
+
+=item SEE ALSO
+
+=back
+
+=head2 perlintern - autogenerated documentation of purely B<internal>
+ Perl functions
+
+=over
+
+=item DESCRIPTION
+
+=item AUTHORS
+
+=item SEE ALSO
+
+=back
+
=head2 perlhist - the Perl history records
+=over
+
=item DESCRIPTION
=item INTRODUCTION
@@ -2826,9 +3905,13 @@ callback
=item THE KEEPERS OF THE RECORDS
+=back
+
=head1 PRAGMA DOCUMENTATION
-=head2 attrs - set/get attributes of a subroutine
+=head2 attrs - set/get attributes of a subroutine (deprecated)
+
+=over
=item SYNOPSIS
@@ -2836,14 +3919,78 @@ callback
method, locked
+=back
+
=head2 re - Perl pragma to alter regular expression behaviour
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 attributes - get/set subroutine or variable attributes
+
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=over
+
+=item Built-in Attributes
+
+locked, method, lvalue
+
+=item Available Subroutines
+
+get, reftype
+
+=item Package-specific Attribute Handling
+
+FETCH_I<type>_ATTRIBUTES, MODIFY_I<type>_ATTRIBUTES
+
+=item Syntax of Attribute Lists
+
+=back
+
+=item EXPORTS
+
+=over
+
+=item Default exports
+
+=item Available exports
+
+=item Export tags defined
+
+=back
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=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
+
=item SYNOPSIS
=item DESCRIPTION
@@ -2854,16 +4001,26 @@ method, locked
=item SEE ALSO
+=back
+
=head2 base - Establish IS-A relationship with base class at compile time
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=item HISTORY
+
=item SEE ALSO
+=back
+
=head2 blib - Use MakeMaker's uninstalled version of a package
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -2872,8 +4029,40 @@ method, locked
=item AUTHOR
+=back
+
+=head2 bytes - Perl pragma to force byte semantics rather than character
+semantics
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
+=head2 charnames - define character names for C<\N{named}> string literal
+escape.
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CUSTOM TRANSLATORS
+
+=item BUGS
+
+=back
+
=head2 constant - Perl pragma to declare constants
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -2888,9 +4077,13 @@ method, locked
=item COPYRIGHT
+=back
+
=head2 diagnostics - Perl compiler pragma to force verbose warning
diagnostics
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -2911,40 +4104,74 @@ diagnostics
=item AUTHOR
+=back
+
=head2 fields - compile-time class fields
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+new, phash
+
=item SEE ALSO
+=back
+
+=head2 filetest - Perl pragma to control the filetest permission operators
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over
+
+=item subpragma access
+
+=back
+
+=back
+
=head2 integer - Perl pragma to compute arithmetic in integer instead of
double
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 less - perl pragma to request less of something from the compiler
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 lib - manipulate @INC at compile time
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=over
-=item ADDING DIRECTORIES TO @INC
+=item Adding directories to @INC
-=item DELETING DIRECTORIES FROM @INC
+=item Deleting directories from @INC
-=item RESTORING ORIGINAL @INC
+=item Restoring original @INC
=back
@@ -2952,18 +4179,50 @@ double
=item AUTHOR
+=back
+
=head2 locale - Perl pragma to use and avoid POSIX locales for built-in
operations
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-=head2 overload - Package for overloading perl operations
+=back
+
+=head2 open - perl pragma to set default disciplines for input and output
+
+=over
=item SYNOPSIS
-=item CAVEAT SCRIPTOR
+=item DESCRIPTION
+
+=item UNIMPLEMENTED FUNCTIONALITY
+
+=item SEE ALSO
+
+=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
+
+=item SYNOPSIS
=item DESCRIPTION
@@ -2977,11 +4236,15 @@ FALSE, TRUE, C<undef>
=item Calling Conventions for Unary Operations
+=item Calling Conventions for Mutators
+
+C<++> and C<-->, C<x=> and other assignment versions
+
=item Overloadable Operations
I<Arithmetic operations>, I<Comparison operations>, I<Bit operations>,
I<Increment and decrement>, I<Transcendental functions>, I<Boolean, string
-and numeric conversion>, I<Special>
+and numeric conversion>, I<Iteration>, I<Dereferencing>, I<Special>
=item Inheritance and overloading
@@ -3010,9 +4273,10 @@ B<Example>
I<Assignment forms of arithmetic operations>, I<Conversion operations>,
I<Increment and decrement>, C<abs($a)>, I<Unary minus>, I<Negation>,
-I<Concatenation>, I<Comparison operations>, I<Copy operator>
+I<Concatenation>, I<Comparison operations>, I<Iterator>, I<Dereferencing>,
+I<Copy operator>
-=item WARNING
+=item Losing overloading
=item Run-time Overloading
@@ -3026,14 +4290,44 @@ integer, float, binary, q, qr
=item IMPLEMENTATION
+=item Metaphor clash
+
+=item Cookbook
+
+=over
+
+=item Two-face scalars
+
+=item Two-face references
+
+=item Symbolic calculator
+
+=item I<Really> symbolic calculator
+
+=back
+
=item AUTHOR
=item DIAGNOSTICS
=item BUGS
+=back
+
+=head2 re - Perl pragma to alter regular expression behaviour
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
=head2 sigtrap - Perl pragma to enable simple signal handling
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3058,30 +4352,71 @@ B<untrapped>, B<any>, I<signal>, I<number>
=item EXAMPLES
+=back
+
=head2 strict - Perl pragma to restrict unsafe constructs
+=over
+
=item SYNOPSIS
=item DESCRIPTION
C<strict refs>, C<strict vars>, C<strict subs>
+=back
+
=head2 subs - Perl pragma to predeclare sub names
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 utf8 - Perl pragma to enable/disable UTF-8 in source code
+
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-=head2 vars - Perl pragma to predeclare global variable names
+=item SEE ALSO
+
+=back
+
+=head2 vars - Perl pragma to predeclare global variable names (obsolete)
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 warnings - Perl pragma to control optional warnings
+
+=over
=item SYNOPSIS
=item DESCRIPTION
+use warnings::register, warnings::enabled([$category]),
+warnings::warn([$category,] $message)
+
+=back
+
=head1 MODULE DOCUMENTATION
=head2 AnyDBM_File - provide framework for multiple DBMs
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3096,8 +4431,12 @@ C<strict refs>, C<strict vars>, C<strict subs>
=item SEE ALSO
+=back
+
=head2 AutoLoader - load subroutines only on demand
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3120,8 +4459,12 @@ C<strict refs>, C<strict vars>, C<strict subs>
=item SEE ALSO
+=back
+
=head2 AutoSplit - split a package for autoloading
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3136,8 +4479,12 @@ $keep, $check, $modtime
=item DIAGNOSTICS
+=back
+
=head2 B - The Perl Compiler
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3186,8 +4533,8 @@ USEFUL, PREVIOUS, RARE, TABLE
=item B::GV METHODS
-NAME, STASH, SV, IO, FORM, AV, HV, EGV, CV, CVGEN, LINE, FILEGV, GvREFCNT,
-FLAGS
+is_empty, NAME, STASH, SV, IO, FORM, AV, HV, EGV, CV, CVGEN, LINE, FILE,
+FILEGV, GvREFCNT, FLAGS
=item B::IO METHODS
@@ -3200,7 +4547,8 @@ FILL, MAX, OFF, ARRAY, AvFLAGS
=item B::CV METHODS
-STASH, START, ROOT, GV, FILEGV, DEPTH, PADLIST, OUTSIDE, XSUB, XSUBANY
+STASH, START, ROOT, GV, FILE, DEPTH, PADLIST, OUTSIDE, XSUB, XSUBANY,
+CvFLAGS
=item B::HV METHODS
@@ -3210,7 +4558,7 @@ FILL, MAX, KEYS, RITER, NAME, PMROOT, ARRAY
=item B::OP METHODS
-next, sibling, ppaddr, desc, targ, type, seq, flags, private
+next, sibling, name, ppaddr, desc, targ, type, seq, flags, private
=item B::UNOP METHOD
@@ -3224,10 +4572,6 @@ last
other
-=item B::CONDOP METHODS
-
-true, false
-
=item B::LISTOP METHOD
children
@@ -3238,11 +4582,11 @@ pmreplroot, pmreplstart, pmnext, pmregexp, pmflags, pmpermflags, precomp
=item B::SVOP METHOD
-sv
+sv, gv
-=item B::GVOP METHOD
+=item B::PADOP METHOD
-gv
+padix
=item B::PVOP METHOD
@@ -3254,62 +4598,84 @@ redoop, nextop, lastop
=item B::COP METHODS
-label, stash, filegv, cop_seq, arybase, line
+label, stash, file, cop_seq, arybase, line
=back
=item FUNCTIONS EXPORTED BY C<B>
-main_cv, main_root, main_start, comppadlist, sv_undef, sv_yes, sv_no,
-walkoptree(OP, METHOD), walkoptree_debug(DEBUG), walksymtable(SYMREF,
-METHOD, RECURSE), svref_2object(SV), ppname(OPNUM), hash(STR), cast_I32(I),
-minus_c, cstring(STR), class(OBJ), threadsv_names, byteload_fh(FILEHANDLE)
+main_cv, init_av, main_root, main_start, comppadlist, sv_undef, sv_yes,
+sv_no, amagic_generation, walkoptree(OP, METHOD), walkoptree_debug(DEBUG),
+walksymtable(SYMREF, METHOD, RECURSE), svref_2object(SV), ppname(OPNUM),
+hash(STR), cast_I32(I), minus_c, cstring(STR), class(OBJ), threadsv_names
=item AUTHOR
+=back
+
=head2 B::Asmdata - Autogenerated data about Perl ops, used to generate
bytecode
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Assembler - Assemble Perl bytecode
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Bblock - Walk basic blocks
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Bytecode - Perl compiler's bytecode backend
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item OPTIONS
-B<-ofilename>, B<-->, B<-f>, B<-fcompress-nullops>,
+B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>,
B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-fstrip-syntax-tree>,
B<-On>, B<-D>, B<-Do>, B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-m>
+=item EXAMPLES
+
=item BUGS
=item AUTHOR
+=back
+
=head2 B::C - Perl compiler's C backend
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3317,7 +4683,7 @@ B<-On>, B<-D>, B<-Do>, B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-m>
=item OPTIONS
B<-ofilename>, B<-v>, B<-->, B<-uPackname>, B<-D>, B<-Do>, B<-Dc>, B<-DA>,
-B<-DC>, B<-DM>, B<-f>, B<-fcog>, B<-fno-cog>, B<-On>
+B<-DC>, B<-DM>, B<-f>, B<-fcog>, B<-fno-cog>, B<-On>, B<-llimit>
=item EXAMPLES
@@ -3325,8 +4691,12 @@ B<-DC>, B<-DM>, B<-f>, B<-fcog>, B<-fno-cog>, B<-On>
=item AUTHOR
+=back
+
=head2 B::CC - Perl compiler's optimized C translation backend
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3357,38 +4727,69 @@ B<-ffreetmps-each-bblock>, B<-ffreetmps-each-loop>, B<-fomit-taint>, B<-On>
=item AUTHOR
+=back
+
=head2 B::Debug - Walk Perl syntax tree, printing debug info about ops
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Deparse - Perl compiler backend to produce perl code
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item OPTIONS
-B<-p>, B<-u>I<PACKAGE>, B<-l>, B<-s>I<LETTERS>, B<C>
+B<-l>, B<-p>, B<-q>, B<-u>I<PACKAGE>, B<-s>I<LETTERS>, B<C>, B<i>I<NUMBER>,
+B<T>, B<v>I<STRING>B<.>
+
+=item USING B::Deparse AS A MODULE
+
+=over
+
+=item Synopsis
+
+=item Description
+
+=item new
+
+=item coderef2text
+
+=back
=item BUGS
=item AUTHOR
+=back
+
=head2 B::Disassembler - Disassemble Perl bytecode
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Lint - Perl lint
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3406,8 +4807,12 @@ B<-u Package>
=item AUTHOR
+=back
+
=head2 B::O, O - Generic interface to Perl Compiler backends
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3418,32 +4823,48 @@ B<-u Package>
=item AUTHOR
+=back
+
=head2 B::Showlex - Show lexical variables used in functions or files
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Stackobj - Helper module for CC backend
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Terse - Walk Perl syntax tree, printing terse info about ops
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 B::Xref - Generates cross reference reports for Perl programs
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3456,7 +4877,23 @@ C<-oFILENAME>, C<-r>, C<-D[tO]>
=item AUTHOR
-=head2 Benchmark - benchmark running times of code
+=back
+
+=head2 Bblock, B::Bblock - Walk basic blocks
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
+=head2 Benchmark - benchmark running times of Perl code
+
+=over
=item SYNOPSIS
@@ -3466,7 +4903,7 @@ C<-oFILENAME>, C<-r>, C<-D[tO]>
=item Methods
-new, debug
+new, debug, iters
=item Standard Exports
@@ -3476,22 +4913,68 @@ TIMEDIFF, [ STYLE, [ FORMAT ] ] )
=item Optional Exports
-clearcache ( COUNT ), clearallcache ( ), disablecache ( ), enablecache ( )
+clearcache ( COUNT ), clearallcache ( ), cmpthese ( COUT, CODEHASHREF, [
+STYLE ] ), cmpthese ( RESULTSHASHREF ), countit(TIME, CODE), disablecache (
+), enablecache ( ), timesum ( T1, T2 )
=back
=item NOTES
+=item EXAMPLES
+
=item INHERITANCE
=item CAVEATS
+=item SEE ALSO
+
=item AUTHORS
=item MODIFICATION HISTORY
+=back
+
+=head2 ByteLoader - load byte compiled perl code
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Bytecode, B::Bytecode - Perl compiler's bytecode backend
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>,
+B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-fstrip-syntax-tree>,
+B<-On>, B<-D>, B<-Do>, B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-m>
+
+=item EXAMPLES
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
=head2 CGI - Simple Common Gateway Interface Class
+=over
+
=item SYNOPSIS
=item ABSTRACT
@@ -3530,8 +5013,12 @@ clearcache ( COUNT ), clearallcache ( ), disablecache ( ), enablecache ( )
=item DIRECT ACCESS TO THE PARAMETER LIST:
+=item FETCHING THE PARAMETER LIST AS A HASH:
+
=item SAVING THE STATE OF THE SCRIPT TO A FILE:
+=item RETRIEVING CGI ERRORS
+
=item USING THE FUNCTION-ORIENTED INTERFACE
B<:cgi>, B<:form>, B<:html2>, B<:html3>, B<:netscape>, B<:html>,
@@ -3539,7 +5026,14 @@ B<:standard>, B<:all>
=item PRAGMAS
--any, -compile, -nph, -autoload, -no_debug, -private_tempfiles
+-any, -compile, -nph, -newstyle_urls, -autoload, -no_debug,
+-private_tempfiles
+
+=item SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
+
+1. start_table() (generates a <TABLE> tag), 2. end_table() (generates a
+</TABLE> tag), 3. start_ul() (generates a <UL> tag), 4. end_ul() (generates
+a </UL> tag)
=back
@@ -3564,6 +5058,8 @@ B<Parameters:>, 4, 5, 6..
B<-absolute>, B<-relative>, B<-full>, B<-path> (B<-path_info>), B<-query>
(B<-query_string>)
+=item MIXING POST AND URL PARAMETERS
+
=back
=item CREATING STANDARD HTML ELEMENTS:
@@ -3578,6 +5074,8 @@ B<-absolute>, B<-relative>, B<-full>, B<-path> (B<-path_info>), B<-query>
=item NON-STANDARD HTML SHORTCUTS
+=item PRETTY-PRINTING HTML
+
=back
=item CREATING FILL-OUT FORMS:
@@ -3642,12 +5140,12 @@ TOP, BOTTOM or MIDDLE
=back
-=item NETSCAPE COOKIES
+=item HTTP COOKIES
1. an expiration time, 2. a domain, 3. a path, 4. a "secure" flag,
B<-name>, B<-value>, B<-path>, B<-domain>, B<-expires>, B<-secure>
-=item WORKING WITH NETSCAPE FRAMES
+=item WORKING WITH FRAMES
1. Create a <Frameset> document, 2. Specify the destination for the
document in the HTTP header, 3. Specify the destination for the document in
@@ -3665,12 +5163,12 @@ the <FORM> tag
=item FETCHING ENVIRONMENT VARIABLES
-B<accept()>, B<raw_cookie()>, B<user_agent()>, B<path_info()>,
+B<Accept()>, B<raw_cookie()>, B<user_agent()>, B<path_info()>,
B<path_translated()>, B<remote_host()>, B<script_name()>Return the script
name as a partial URL, for self-refering
scripts, B<referer()>, B<auth_type ()>, B<server_name ()>, B<virtual_host
()>, B<server_software ()>, B<remote_user ()>, B<user_name ()>,
-B<request_method()>
+B<request_method()>, B<content_type()>, B<http()>, B<https()>
=item USING NPH SCRIPTS
@@ -3679,8 +5177,7 @@ parameters in the B<header()> and B<redirect()> statements:
=item Server Push
-multipart_init()
-multipart_init(-boundary=>$boundary);, multipart_start(), multipart_end()
+multipart_init(), multipart_start(), multipart_end()
=item Avoiding Denial of Service Attacks
@@ -3696,15 +5193,15 @@ basis>, B<2. Globally for all scripts>
Matt Heffron (heffron@falstaff.css.beckman.com), James Taylor
(james.taylor@srs.gov), Scott Anguish <sanguish@digifix.com>, Mike Jewell
(mlj3u@virginia.edu), Timothy Shimmin (tes@kbs.citri.edu.au), Joergen Haegg
-(jh@axis.se), Laurent Delfosse (delfosse@csgrad1.cs.wvu.edu), Richard
-Resnick (applepi1@aol.com), Craig Bishop (csb@barwonwater.vic.gov.au), Tony
-Curtis (tc@vcpc.univie.ac.at), Tim Bunce (Tim.Bunce@ig.co.uk), Tom
-Christiansen (tchrist@convex.com), Andreas Koenig
-(k@franz.ww.TU-Berlin.DE), Tim MacKenzie (Tim.MacKenzie@fulcrum.com.au),
-Kevin B. Hendricks (kbhend@dogwood.tyler.wm.edu), Stephen Dahmen
-(joyfire@inxpress.net), Ed Jordan (ed@fidalgo.net), David Alan Pisoni
-(david@cnation.com), Doug MacEachern (dougm@opengroup.org), Robin Houston
-(robin@oneworld.org), ...and many many more..
+(jh@axis.se), Laurent Delfosse (delfosse@delfosse.com), Richard Resnick
+(applepi1@aol.com), Craig Bishop (csb@barwonwater.vic.gov.au), Tony Curtis
+(tc@vcpc.univie.ac.at), Tim Bunce (Tim.Bunce@ig.co.uk), Tom Christiansen
+(tchrist@convex.com), Andreas Koenig (k@franz.ww.TU-Berlin.DE), Tim
+MacKenzie (Tim.MacKenzie@fulcrum.com.au), Kevin B. Hendricks
+(kbhend@dogwood.tyler.wm.edu), Stephen Dahmen (joyfire@inxpress.net), Ed
+Jordan (ed@fidalgo.net), David Alan Pisoni (david@cnation.com), Doug
+MacEachern (dougm@opengroup.org), Robin Houston (robin@oneworld.org),
+...and many many more..
=item A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT
@@ -3712,23 +5209,31 @@ Kevin B. Hendricks (kbhend@dogwood.tyler.wm.edu), Stephen Dahmen
=item SEE ALSO
-=head2 CGI::Apache - Make things work with CGI.pm against Perl-Apache API
+=back
+
+=head2 CGI::Apache - Backward compatibility module for CGI.pm
+
+=over
=item SYNOPSIS
+=item ABSTRACT
+
=item DESCRIPTION
-=item NOTE 1
+=item AUTHOR INFORMATION
-=item NOTE 2
+=item BUGS
=item SEE ALSO
-=item AUTHOR
+=back
=head2 CGI::Carp, B<CGI::Carp> - CGI routines for writing to the HTTPD (or
other) error log
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3749,8 +5254,12 @@ other) error log
=item SEE ALSO
+=back
+
=head2 CGI::Cookie - Interface to Netscape Cookies
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3779,8 +5288,12 @@ B<name()>, B<value()>, B<domain()>, B<path()>, B<expires()>
=item SEE ALSO
+=back
+
=head2 CGI::Fast - CGI Interface for Fast CGI
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3801,8 +5314,36 @@ B<name()>, B<value()>, B<domain()>, B<path()>, B<expires()>
=item SEE ALSO
+=back
+
+=head2 CGI::Pretty - module to produce nicely formatted HTML code
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over
+
+=item Tags that won't be formatted
+
+=item Customizing the Indenting
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
=head2 CGI::Push - Simple Interface to Server Push
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3821,27 +5362,36 @@ B<name()>, B<value()>, B<domain()>, B<path()>, B<expires()>
=item INSTALLING CGI::Push SCRIPTS
-=item CAVEATS
-
=item AUTHOR INFORMATION
=item BUGS
=item SEE ALSO
-=head2 CGI::Switch - Try more than one constructors and return the first
-object available
+=back
+
+=head2 CGI::Switch - Backward compatibility module for defunct CGI::Switch
+
+=over
=item SYNOPSIS
+=item ABSTRACT
+
=item DESCRIPTION
+=item AUTHOR INFORMATION
+
+=item BUGS
+
=item SEE ALSO
-=item AUTHOR
+=back
=head2 CPAN - query, download and build perl modules from CPAN sites
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3851,7 +5401,7 @@ object available
=item Interactive Mode
Searching for authors, bundles, distribution files and modules, make, test,
-install, clean modules or distributions, readme, look module or
+install, clean modules or distributions, get, readme, look module or
distribution, Signals
=item CPAN::Shell
@@ -3866,7 +5416,7 @@ distribution, Signals
expand($type,@things), Programming Examples
-=item Methods in the four
+=item Methods in the four Classes
=item Cache Manager
@@ -3878,20 +5428,22 @@ expand($type,@things), Programming Examples
=item Debugging
-=item Floppy, Zip, and all that Jazz
+=item Floppy, Zip, Offline Mode
=back
=item CONFIGURATION
-o conf E<lt>scalar optionE<gt>, o conf E<lt>scalar optionE<gt>
-E<lt>valueE<gt>, o conf E<lt>list optionE<gt>, o conf E<lt>list optionE<gt>
-[shift|pop], o conf E<lt>list optionE<gt> [unshift|push|splice]
-E<lt>listE<gt>
+C<o conf E<lt>scalar optionE<gt>>, C<o conf E<lt>scalar optionE<gt>
+E<lt>valueE<gt>>, C<o conf E<lt>list optionE<gt>>, C<o conf E<lt>list
+optionE<gt> [shift|pop]>, C<o conf E<lt>list optionE<gt>
+[unshift|push|splice] E<lt>listE<gt>>
=over
-=item CD-ROM support
+=item Note on urllist parameter's format
+
+=item urllist parameter has CD-ROM support
=back
@@ -3899,29 +5451,47 @@ E<lt>listE<gt>
=item EXPORT
+=item POPULATE AN INSTALLATION WITH LOTS OF MODULES
+
+=item WORKING WITH CPAN.pm BEHIND FIREWALLS
+
+http firewall, ftp firewall, One way visibility, SOCKS, IP Masquerade
+
=item BUGS
=item AUTHOR
=item SEE ALSO
+=back
+
=head2 CPAN::FirstTime - Utility for CPAN::Config file Initialization
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 CPANox, CPAN::Nox - Wrapper around CPAN.pm without using any XS
module
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item SEE ALSO
+=back
+
=head2 Carp, carp - warn of errors (from perspective of caller)
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3932,8 +5502,24 @@ module
=back
+=item BUGS
+
+=back
+
+=head2 Carp::Heavy - Carp guts
+
+=over
+
+=item SYNOPIS
+
+=item DESCRIPTION
+
+=back
+
=head2 Class::Struct - declare struct-like datatypes as Perl classes
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3947,22 +5533,337 @@ module
Scalar (C<'$'> or C<'*$'>), Array (C<'@'> or C<'*@'>), Hash (C<'%'> or
C<'*%'>), Class (C<'Class_Name'> or C<'*Class_Name'>)
+=item Initializing with C<new>
+
=back
=item EXAMPLES
-Example 1, Example 2
+Example 1, Example 2, Example 3
=item Author and Modification History
+=back
+
+=head2 Config - access Perl configuration information
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+myconfig(), config_sh(), config_vars(@names)
+
+=item EXAMPLE
+
+=item WARNING
+
+=item GLOSSARY
+
+=over
+
+=item _
+
+C<_a>, C<_exe>, C<_o>
+
+=item a
+
+C<afs>, C<alignbytes>, C<ansi2knr>, C<aphostname>, C<api_revision>,
+C<api_subversion>, C<api_version>, C<api_versionstring>, C<ar>, C<archlib>,
+C<archlibexp>, C<archname64>, C<archname>, C<archobjs>, C<awk>
+
+=item b
+
+C<baserev>, C<bash>, C<bin>, C<bincompat5005>, C<binexp>, C<bison>,
+C<byacc>, C<byteorder>
+
+=item c
+
+C<c>, C<castflags>, C<cat>, C<cc>, C<cccdlflags>, C<ccdlflags>, C<ccflags>,
+C<ccsymbols>, C<cf_by>, C<cf_email>, C<cf_time>, C<charsize>, C<chgrp>,
+C<chmod>, C<chown>, C<clocktype>, C<comm>, C<compress>
+
+=item C
+
+C<CONFIGDOTSH>, C<contains>, C<cp>, C<cpio>, C<cpp>, C<cpp_stuff>,
+C<cppccsymbols>, C<cppflags>, C<cpplast>, C<cppminus>, C<cpprun>,
+C<cppstdin>, C<cppsymbols>, C<crosscompile>, C<cryptlib>, C<csh>
+
+=item d
+
+C<d_access>, C<d_accessx>, C<d_alarm>, C<d_archlib>, C<d_atolf>,
+C<d_atoll>, C<d_attribut>, C<d_bcmp>, C<d_bcopy>, C<d_bincompat5005>,
+C<d_bsd>, C<d_bsdgetpgrp>, C<d_bsdsetpgrp>, C<d_bzero>, C<d_casti32>,
+C<d_castneg>, C<d_charvspr>, C<d_chown>, C<d_chroot>, C<d_chsize>,
+C<d_closedir>, C<d_const>, C<d_crypt>, C<d_csh>, C<d_cuserid>,
+C<d_dbl_dig>, C<d_difftime>, C<d_dirnamlen>, C<d_dlerror>, C<d_dlopen>,
+C<d_dlsymun>, C<d_dosuid>, C<d_drand48proto>, C<d_dup2>, C<d_eaccess>,
+C<d_endgrent>, C<d_endhent>, C<d_endnent>, C<d_endpent>, C<d_endpwent>,
+C<d_endsent>, C<d_endspent>, C<d_eofnblk>, C<d_eunice>, C<d_fchmod>,
+C<d_fchown>, C<d_fcntl>, C<d_fd_macros>, C<d_fd_set>, C<d_fds_bits>,
+C<d_fgetpos>, C<d_flexfnam>, C<d_flock>, C<d_fork>, C<d_fpathconf>,
+C<d_fpos64_t>, C<d_fs_data_s>, C<d_fseeko>, C<d_fsetpos>, C<d_fstatfs>,
+C<d_fstatvfs>, C<d_ftello>, C<d_ftime>, C<d_Gconvert>, C<d_getcwd>,
+C<d_getfsstat>, C<d_getgrent>, C<d_getgrps>, C<d_gethbyaddr>,
+C<d_gethbyname>, C<d_gethent>, C<d_gethname>, C<d_gethostprotos>,
+C<d_getlogin>, C<d_getmnt>, C<d_getmntent>, C<d_getnbyaddr>,
+C<d_getnbyname>, C<d_getnent>, C<d_getnetprotos>, C<d_getpbyname>,
+C<d_getpbynumber>, C<d_getpent>, C<d_getpgid>, C<d_getpgrp2>, C<d_getpgrp>,
+C<d_getppid>, C<d_getprior>, C<d_getprotoprotos>, C<d_getpwent>,
+C<d_getsbyname>, C<d_getsbyport>, C<d_getsent>, C<d_getservprotos>,
+C<d_getspent>, C<d_getspnam>, C<d_gettimeod>, C<d_gnulibc>, C<d_grpasswd>,
+C<d_hasmntopt>, C<d_htonl>, C<d_iconv>, C<d_index>, C<d_inetaton>,
+C<d_int64_t>, C<d_isascii>, C<d_killpg>, C<d_lchown>, C<d_ldbl_dig>,
+C<d_link>, C<d_locconv>, C<d_lockf>, C<d_longdbl>, C<d_longlong>,
+C<d_lseekproto>, C<d_lstat>, C<d_madvise>, C<d_mblen>, C<d_mbstowcs>,
+C<d_mbtowc>, C<d_memchr>, C<d_memcmp>, C<d_memcpy>, C<d_memmove>,
+C<d_memset>, C<d_mkdir>, C<d_mkdtemp>, C<d_mkfifo>, C<d_mkstemp>,
+C<d_mkstemps>, C<d_mktime>, C<d_mmap>, C<d_mprotect>, C<d_msg>,
+C<d_msg_ctrunc>, C<d_msg_dontroute>, C<d_msg_oob>, C<d_msg_peek>,
+C<d_msg_proxy>, C<d_msgctl>, C<d_msgget>, C<d_msgrcv>, C<d_msgsnd>,
+C<d_msync>, C<d_munmap>, C<d_mymalloc>, C<d_nice>, C<d_nv_preserves_uv>,
+C<d_off64_t>, C<d_old_pthread_create_joinable>, C<d_oldpthreads>,
+C<d_oldsock>, C<d_open3>, C<d_pathconf>, C<d_pause>, C<d_phostname>,
+C<d_pipe>, C<d_poll>, C<d_portable>, C<d_PRId64>, C<d_PRIeldbl>,
+C<d_PRIEldbl>, C<d_PRIfldbl>, C<d_PRIFldbl>, C<d_PRIgldbl>, C<d_PRIGldbl>,
+C<d_PRIi64>, C<d_PRIo64>, C<d_PRIu64>, C<d_PRIx64>, C<d_PRIX64>,
+C<d_pthread_yield>, C<d_pwage>, C<d_pwchange>, C<d_pwclass>,
+C<d_pwcomment>, C<d_pwexpire>, C<d_pwgecos>, C<d_pwpasswd>, C<d_pwquota>,
+C<d_qgcvt>, C<d_quad>, C<d_readdir>, C<d_readlink>, C<d_rename>,
+C<d_rewinddir>, C<d_rmdir>, C<d_safebcpy>, C<d_safemcpy>, C<d_sanemcmp>,
+C<d_sched_yield>, C<d_scm_rights>, C<d_seekdir>, C<d_select>, C<d_sem>,
+C<d_semctl>, C<d_semctl_semid_ds>, C<d_semctl_semun>, C<d_semget>,
+C<d_semop>, C<d_setegid>, C<d_seteuid>, C<d_setgrent>, C<d_setgrps>,
+C<d_sethent>, C<d_setlinebuf>, C<d_setlocale>, C<d_setnent>, C<d_setpent>,
+C<d_setpgid>, C<d_setpgrp2>, C<d_setpgrp>, C<d_setprior>, C<d_setpwent>,
+C<d_setregid>, C<d_setresgid>, C<d_setresuid>, C<d_setreuid>, C<d_setrgid>,
+C<d_setruid>, C<d_setsent>, C<d_setsid>, C<d_setspent>, C<d_setvbuf>,
+C<d_sfio>, C<d_shm>, C<d_shmat>, C<d_shmatprototype>, C<d_shmctl>,
+C<d_shmdt>, C<d_shmget>, C<d_sigaction>, C<d_sigsetjmp>, C<d_socket>,
+C<d_socklen_t>, C<d_sockpair>, C<d_sqrtl>, C<d_statblks>,
+C<d_statfs_f_flags>, C<d_statfs_s>, C<d_statvfs>, C<d_stdio_cnt_lval>,
+C<d_stdio_ptr_lval>, C<d_stdio_stream_array>, C<d_stdiobase>,
+C<d_stdstdio>, C<d_strchr>, C<d_strcoll>, C<d_strctcpy>, C<d_strerrm>,
+C<d_strerror>, C<d_strtod>, C<d_strtol>, C<d_strtold>, C<d_strtoll>,
+C<d_strtoul>, C<d_strtoull>, C<d_strtouq>, C<d_strxfrm>, C<d_suidsafe>,
+C<d_symlink>, C<d_syscall>, C<d_sysconf>, C<d_sysernlst>, C<d_syserrlst>,
+C<d_system>, C<d_tcgetpgrp>, C<d_tcsetpgrp>, C<d_telldir>,
+C<d_telldirproto>, C<d_time>, C<d_times>, C<d_truncate>, C<d_tzname>,
+C<d_umask>, C<d_uname>, C<d_union_semun>, C<d_ustat>, C<d_vendorarch>,
+C<d_vendorbin>, C<d_vendorlib>, C<d_vfork>, C<d_void_closedir>,
+C<d_voidsig>, C<d_voidtty>, C<d_volatile>, C<d_vprintf>, C<d_wait4>,
+C<d_waitpid>, C<d_wcstombs>, C<d_wctomb>, C<d_xenix>, C<date>,
+C<db_hashtype>, C<db_prefixtype>, C<defvoidused>, C<direntrytype>,
+C<dlext>, C<dlsrc>, C<doublesize>, C<drand01>, C<dynamic_ext>
+
+=item e
+
+C<eagain>, C<ebcdic>, C<echo>, C<egrep>, C<emacs>, C<eunicefix>,
+C<exe_ext>, C<expr>, C<extensions>
+
+=item f
+
+C<fflushall>, C<fflushNULL>, C<find>, C<firstmakefile>, C<flex>,
+C<fpossize>, C<fpostype>, C<freetype>, C<full_ar>, C<full_csh>, C<full_sed>
+
+=item g
+
+C<gccversion>, C<gidformat>, C<gidsign>, C<gidsize>, 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>
+
+=item i
+
+C<i16size>, C<i16type>, C<i32size>, C<i32type>, C<i64size>, C<i64type>,
+C<i8size>, C<i8type>, C<i_arpainet>, C<i_bsdioctl>, C<i_db>, C<i_dbm>,
+C<i_dirent>, C<i_dld>, C<i_dlfcn>, C<i_fcntl>, C<i_float>, C<i_gdbm>,
+C<i_grp>, C<i_iconv>, C<i_ieeefp>, C<i_inttypes>, C<i_limits>, C<i_locale>,
+C<i_machcthr>, C<i_malloc>, C<i_math>, C<i_memory>, C<i_mntent>, C<i_ndbm>,
+C<i_netdb>, C<i_neterrno>, C<i_netinettcp>, C<i_niin>, C<i_poll>,
+C<i_pthread>, C<i_pwd>, C<i_rpcsvcdbm>, C<i_sfio>, C<i_sgtty>, C<i_shadow>,
+C<i_socks>, C<i_stdarg>, C<i_stddef>, C<i_stdlib>, C<i_string>,
+C<i_sunmath>, C<i_sysaccess>, C<i_sysdir>, C<i_sysfile>, C<i_sysfilio>,
+C<i_sysin>, C<i_sysioctl>, C<i_syslog>, C<i_sysmman>, C<i_sysmode>,
+C<i_sysmount>, C<i_sysndir>, C<i_sysparam>, C<i_sysresrc>, C<i_syssecrt>,
+C<i_sysselct>, C<i_syssockio>, C<i_sysstat>, C<i_sysstatfs>,
+C<i_sysstatvfs>, C<i_systime>, C<i_systimek>, C<i_systimes>, C<i_systypes>,
+C<i_sysuio>, C<i_sysun>, C<i_sysutsname>, C<i_sysvfs>, C<i_syswait>,
+C<i_termio>, C<i_termios>, C<i_time>, C<i_unistd>, C<i_ustat>, C<i_utime>,
+C<i_values>, 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>
+
+=item k
+
+C<known_extensions>, C<ksh>
+
+=item l
+
+C<large>, C<ld>, C<lddlflags>, C<ldflags>, 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<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
+
+C<mail>, C<mailx>, C<make>, C<make_set_make>, C<mallocobj>, C<mallocsrc>,
+C<malloctype>, C<man1dir>, C<man1direxp>, C<man1ext>, C<man3dir>,
+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>
+
+=item n
+
+C<n>, C<netdb_hlen_type>, C<netdb_host_type>, C<netdb_name_type>,
+C<netdb_net_type>, C<nm>, C<nm_opt>, C<nm_so_opt>, C<nonxs_ext>, C<nroff>,
+C<nvsize>, C<nvtype>
+
+=item o
+
+C<o_nonblock>, C<obj_ext>, C<old_pthread_create_joinable>, C<optimize>,
+C<orderlib>, C<osname>, C<osvers>
+
+=item p
+
+C<package>, C<pager>, C<passcat>, C<patchlevel>, C<path_sep>, C<perl5>,
+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>
+
+=item q
+
+C<quadkind>, C<quadtype>
+
+=item r
+
+C<randbits>, C<randfunc>, C<randseedtype>, C<ranlib>, C<rd_nodata>,
+C<revision>, C<rm>, C<rmail>, C<runnm>
+
+=item s
+
+C<sched_yield>, C<scriptdir>, C<scriptdirexp>, C<sed>, C<seedfunc>,
+C<selectminbits>, C<selecttype>, C<sendmail>, C<sh>, C<shar>, C<sharpbang>,
+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<sPRIEldbl>,
+C<sPRIfldbl>, C<sPRIFldbl>, C<sPRIgldbl>, C<sPRIGldbl>, C<sPRIi64>,
+C<sPRIo64>, C<sPRIu64>, C<sPRIx64>, C<sPRIX64>, C<src>, 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
+
+C<tail>, C<tar>, C<tbl>, C<tee>, C<test>, C<timeincl>, C<timetype>,
+C<touch>, C<tr>, C<trnl>, C<troff>
+
+=item u
+
+C<u16size>, C<u16type>, C<u32size>, C<u32type>, C<u64size>, C<u64type>,
+C<u8size>, C<u8type>, C<uidformat>, C<uidsign>, C<uidsize>, C<uidtype>,
+C<uname>, C<uniq>, C<uquadtype>, C<use5005threads>, C<use64bitall>,
+C<use64bitint>, C<usedl>, C<useithreads>, C<uselargefiles>,
+C<uselongdouble>, C<usemorebits>, C<usemultiplicity>, C<usemymalloc>,
+C<usenm>, C<useopcode>, C<useperlio>, C<useposix>, C<usesfio>,
+C<useshrplib>, C<usesocks>, C<usethreads>, C<usevendorprefix>, C<usevfork>,
+C<usrinc>, C<uuname>, C<uvoformat>, C<uvsize>, C<uvtype>, C<uvuformat>,
+C<uvxformat>
+
+=item v
+
+C<vendorarch>, C<vendorarchexp>, C<vendorbin>, C<vendorbinexp>,
+C<vendorlib>, C<vendorlib_stem>, C<vendorlibexp>, C<vendorprefix>,
+C<vendorprefixexp>, C<version>, C<vi>, C<voidflags>
+
+=item x
+
+C<xlibpth>, C<xs_apiversion>
+
+=item z
+
+C<zcat>, C<zip>
+
+=back
+
+=item NOTE
+
+=back
+
=head2 Cwd, getcwd - get pathname of current working directory
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 DB - programmatic interface to the Perl debugging API (draft,
+subject to
+change)
+
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=over
+
+=item Global Variables
+
+ $DB::sub, %DB::sub, $DB::single, $DB::signal, $DB::trace, @DB::args,
+@DB::dbline, %DB::dbline, $DB::package, $DB::filename, $DB::subname,
+$DB::lineno
+
+=item API Methods
+
+CLIENT->register(), CLIENT->evalcode(STRING), CLIENT->skippkg('D::hide'),
+CLIENT->run(), CLIENT->step(), CLIENT->next(), CLIENT->done()
+
+=item Client Callback Methods
+
+CLIENT->init(), CLIENT->prestop([STRING]), CLIENT->stop(), CLIENT->idle(),
+CLIENT->poststop([STRING]), CLIENT->evalcode(STRING), CLIENT->cleanup(),
+CLIENT->output(LIST)
+
+=back
+
+=item BUGS
+
+=item AUTHOR
+
+=back
+
=head2 DB_File - Perl5 access to Berkeley DB version 1.x
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -3971,7 +5872,7 @@ B<DB_HASH>, B<DB_BTREE>, B<DB_RECNO>
=over
-=item Using DB_File with Berkeley DB version 2
+=item Using DB_File with Berkeley DB version 2 or 3
=item Interface to Berkeley DB
@@ -4001,6 +5902,10 @@ B<DB_HASH>, B<DB_BTREE>, B<DB_RECNO>
=item The get_dup() Method
+=item The find_dup() Method
+
+=item The del_dup() Method
+
=item Matching Partial Keys
=back
@@ -4013,7 +5918,7 @@ B<DB_HASH>, B<DB_BTREE>, B<DB_RECNO>
=item A Simple Example
-=item Extra Methods
+=item Extra RECNO Methods
B<$X-E<gt>push(list) ;>, B<$value = $X-E<gt>pop ;>, B<$X-E<gt>shift>,
B<$X-E<gt>unshift(list) ;>, B<$X-E<gt>length>
@@ -4029,11 +5934,30 @@ $X-E<gt>put($key, $value [, $flags]) ;>, B<$status = $X-E<gt>del($key [,
$flags]) ;>, B<$status = $X-E<gt>fd ;>, B<$status = $X-E<gt>seq($key,
$value, $flags) ;>, B<$status = $X-E<gt>sync([$flags]) ;>
+=item DBM FILTERS
+
+B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
+B<filter_fetch_value>
+
+=over
+
+=item The Filter
+
+=item An Example -- the NULL termination problem.
+
+=item Another Example -- Key is a C int.
+
+=back
+
=item HINTS AND TIPS
=over
-=item Locking Databases
+=item Locking: The Trouble with fd
+
+=item Safe ways to lock a database
+
+B<Tie::DB_Lock>, B<Tie::DB_LockFile>, B<DB_File::Lock>
=item Sharing Databases With C Applications
@@ -4055,6 +5979,8 @@ $value, $flags) ;>, B<$status = $X-E<gt>sync([$flags]) ;>
=back
+=item REFERENCES
+
=item HISTORY
=item BUGS
@@ -4067,9 +5993,13 @@ $value, $flags) ;>, B<$status = $X-E<gt>sync([$flags]) ;>
=item AUTHOR
+=back
+
=head2 Data::Dumper - stringified perl data structures, suitable for both
printing and C<eval>
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4078,15 +6008,14 @@ printing and C<eval>
=item Methods
-I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Dump I<or>
-I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Dumpxs I<or>
-I<PACKAGE>->Dumpxs(I<ARRAYREF [>, I<ARRAYREF]>),
-I<$OBJ>->Seen(I<[HASHREF]>), I<$OBJ>->Values(I<[ARRAYREF]>),
-I<$OBJ>->Names(I<[ARRAYREF]>), I<$OBJ>->Reset
+I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Dump I<or>
+I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Seen(I<[HASHREF]>),
+I<$OBJ>->Values(I<[ARRAYREF]>), I<$OBJ>->Names(I<[ARRAYREF]>),
+I<$OBJ>->Reset
=item Functions
-Dumper(I<LIST>), DumperX(I<LIST>)
+Dumper(I<LIST>)
=item Configuration Variables or Methods
@@ -4100,7 +6029,8 @@ $Data::Dumper::Freezer I<or> $I<OBJ>->Freezer(I<[NEWVAL]>),
$Data::Dumper::Toaster I<or> $I<OBJ>->Toaster(I<[NEWVAL]>),
$Data::Dumper::Deepcopy I<or> $I<OBJ>->Deepcopy(I<[NEWVAL]>),
$Data::Dumper::Quotekeys I<or> $I<OBJ>->Quotekeys(I<[NEWVAL]>),
-$Data::Dumper::Bless I<or> $I<OBJ>->Bless(I<[NEWVAL]>)
+$Data::Dumper::Bless I<or> $I<OBJ>->Bless(I<[NEWVAL]>),
+$Data::Dumper::Maxdepth I<or> $I<OBJ>->Maxdepth(I<[NEWVAL]>)
=item Exports
@@ -4118,41 +6048,203 @@ Dumper
=item SEE ALSO
+=back
+
+=head2 Devel::DProf - a Perl code profiler
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item PROFILE FORMAT
+
+=item AUTOLOAD
+
+=item ENVIRONMENT
+
+=item BUGS
+
+=item SEE ALSO
+
+=back
+
+=head2 Devel::Peek - A data debugging tool for the XS programmer
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=over
+
+=item A simple scalar string
+
+=item A simple scalar number
+
+=item A simple scalar with an extra reference
+
+=item A reference to a simple scalar
+
+=item A reference to an array
+
+=item A reference to a hash
+
+=item Dumping a large array or hash
+
+=item A reference to an SV which holds a C pointer
+
+=item A reference to a subroutine
+
+=back
+
+=item EXPORTS
+
+=item BUGS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
=head2 Devel::SelfStubber - generate stubs for a SelfLoading module
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 DirHandle - supply object methods for directory handles
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 Dumpvalue - provides screen dump of Perl data.
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over
+
+=item Creation
+
+C<arrayDepth>, C<hashDepth>, C<compactDump>, C<veryCompact>, C<globPrint>,
+C<DumpDBFiles>, C<DumpPackages>, C<DumpReused>, C<tick>, C<HighBit>,
+C<printUndef>, C<UsageOnly>, unctrl, subdump, bareStringify, quoteHighBit,
+stopDbSignal
+
+=item Methods
+
+dumpValue, dumpValues, dumpvars, set_quote, set_unctrl, compactDump,
+veryCompact, set, get
+
+=back
+
+=back
+
+=head2 DynaLoader - Dynamically load C libraries into Perl code
+
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+@dl_library_path, @dl_resolve_using, @dl_require_symbols, @dl_librefs,
+@dl_modules, dl_error(), $dl_debug, dl_findfile(), dl_expandspec(),
+dl_load_file(), dl_unload_file(), dl_loadflags(), dl_find_symbol(),
+dl_find_symbol_anywhere(), dl_undef_symbols(), dl_install_xsub(),
+bootstrap()
+
+=item AUTHOR
+
+=back
+
+=head2 DynaLoader::XSLoader, XSLoader - Dynamically load C libraries into
+Perl code
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
=head2 English - use nice English (or awk) names for ugly punctuation
variables
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-=head2 Env - perl module that imports environment variables
+=item BUGS
+
+=back
+
+=head2 Env - perl module that imports environment variables as scalars or
+arrays
+
+=over
=item SYNOPSIS
=item DESCRIPTION
+=item LIMITATIONS
+
=item AUTHOR
+=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
+
=item SYNOPSIS
=item DESCRIPTION
=over
+=item How to Export
+
=item Selecting What To Export
=item Specialised Import Lists
@@ -4167,16 +6259,50 @@ variables
=back
+=back
+
+=head2 Exporter::Heavy - Exporter guts
+
+=over
+
+=item SYNOPIS
+
+=item DESCRIPTION
+
+=back
+
=head2 ExtUtils::Command - utilities to replace common UNIX commands in
Makefiles etc.
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-cat, eqtime src dst, rm_f files..., rm_f files..., touch files .., mv
-source... destination, cp source... destination, chmod mode files.., mkpath
-directory.., test_f file
+=back
+
+cat
+
+eqtime src dst
+
+rm_f files...
+
+rm_f files...
+
+touch files ..
+
+mv source... destination
+
+cp source... destination
+
+chmod mode files..
+
+mkpath directory..
+
+test_f file
+
+=over
=item BUGS
@@ -4184,8 +6310,12 @@ directory.., test_f file
=item AUTHOR
+=back
+
=head2 ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4203,14 +6333,22 @@ ccopts(), xsi_header(), xsi_protos(@modules), xsi_body(@modules)
=item AUTHOR
+=back
+
=head2 ExtUtils::Install - install files from here to there
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 ExtUtils::Installed - Inventory management of installed modules
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4226,8 +6364,12 @@ packlist(), version()
=item AUTHOR
+=back
+
=head2 ExtUtils::Liblist - determine libraries to use and how to use them
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4256,15 +6398,36 @@ For static extensions, For dynamic extensions, For dynamic extensions
=item SEE ALSO
+=back
+
+=head2 ExtUtils::MM_Cygwin - methods to override UN*X behaviour in
+ExtUtils::MakeMaker
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+canonpath, cflags, manifypods, perl_archive
+
+=back
+
=head2 ExtUtils::MM_OS2 - methods to override UN*X behaviour in
ExtUtils::MakeMaker
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4275,37 +6438,203 @@ ExtUtils::MakeMaker
=item Preloaded methods
-canonpath, catdir, catfile, curdir, rootdir, updir
+canonpath
+
+=back
+
+=back
+
+catdir
+
+catfile
+
+curdir
+
+rootdir
+
+updir
+
+=over
=item SelfLoaded methods
-c_o (o), cflags (o), clean (o), const_cccmd (o), const_config (o),
-const_loadlibs (o), constants (o), depend (o), dir_target (o), dist (o),
-dist_basics (o), dist_ci (o), dist_core (o), dist_dir (o), dist_test (o),
-dlsyms (o), dynamic (o), dynamic_bs (o), dynamic_lib (o), exescan,
-extliblist, file_name_is_absolute, find_perl
+c_o (o)
+
+=back
+
+cflags (o)
+
+clean (o)
+
+const_cccmd (o)
+
+const_config (o)
+
+const_loadlibs (o)
+
+constants (o)
+
+depend (o)
+
+dir_target (o)
+
+dist (o)
+
+dist_basics (o)
+
+dist_ci (o)
+
+dist_core (o)
+
+dist_dir (o)
+
+dist_test (o)
+
+dlsyms (o)
+
+dynamic (o)
+
+dynamic_bs (o)
+
+dynamic_lib (o)
+
+exescan
+
+extliblist
+
+file_name_is_absolute
+
+find_perl
+
+=over
=item Methods to actually produce chunks of text for the Makefile
-fixin, force (o), guess_name, has_link_code, init_dirscan, init_main,
-init_others, install (o), installbin (o), libscan (o), linkext (o), lsdir,
-macro (o), makeaperl (o), makefile (o), manifypods (o), maybe_command,
-maybe_command_in_dirs, needs_linking (o), nicetext, parse_version,
-parse_abstract, pasthru (o), path, perl_script, perldepend (o), ppd,
-perm_rw (o), perm_rwx (o), pm_to_blib, post_constants (o), post_initialize
-(o), postamble (o), prefixify, processPL (o), realclean (o),
-replace_manpage_separator, static (o), static_lib (o), staticmake (o),
-subdir_x (o), subdirs (o), test (o), test_via_harness (o), test_via_script
-(o), tool_autosplit (o), tools_other (o), tool_xsubpp (o), top_targets (o),
-writedoc, xs_c (o), xs_o (o), perl_archive, export_list
+fixin
=back
+force (o)
+
+guess_name
+
+has_link_code
+
+htmlifypods (o)
+
+init_dirscan
+
+init_main
+
+init_others
+
+install (o)
+
+installbin (o)
+
+libscan (o)
+
+linkext (o)
+
+lsdir
+
+macro (o)
+
+makeaperl (o)
+
+makefile (o)
+
+manifypods (o)
+
+maybe_command
+
+maybe_command_in_dirs
+
+needs_linking (o)
+
+nicetext
+
+parse_version
+
+parse_abstract
+
+pasthru (o)
+
+path
+
+perl_script
+
+perldepend (o)
+
+ppd
+
+perm_rw (o)
+
+perm_rwx (o)
+
+pm_to_blib
+
+post_constants (o)
+
+post_initialize (o)
+
+postamble (o)
+
+prefixify
+
+processPL (o)
+
+realclean (o)
+
+replace_manpage_separator
+
+static (o)
+
+static_lib (o)
+
+staticmake (o)
+
+subdir_x (o)
+
+subdirs (o)
+
+test (o)
+
+test_via_harness (o)
+
+test_via_script (o)
+
+tool_autosplit (o)
+
+tools_other (o)
+
+tool_xsubpp (o)
+
+top_targets (o)
+
+writedoc
+
+xs_c (o)
+
+xs_cpp (o)
+
+xs_o (o)
+
+perl_archive
+
+export_list
+
+=over
+
=item SEE ALSO
+=back
+
=head2 ExtUtils::MM_VMS - methods to override UN*X behaviour in
ExtUtils::MakeMaker
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4314,43 +6643,159 @@ ExtUtils::MakeMaker
=item Methods always loaded
-eliminate_macros, fixpath, catdir, catfile, wraplist, curdir (override),
-rootdir (override), updir (override)
+wraplist
+
+=back
+
+=back
+
+rootdir (override)
+
+=over
=item SelfLoaded methods
-guess_name (override), find_perl (override), path (override), maybe_command
-(override), maybe_command_in_dirs (override), perl_script (override),
-file_name_is_absolute (override), replace_manpage_separator, init_others
-(override), constants (override), cflags (override), const_cccmd
-(override), pm_to_blib (override), tool_autosplit (override), tool_sxubpp
-(override), xsubpp_version (override), tools_other (override), dist
-(override), c_o (override), xs_c (override), xs_o (override), top_targets
-(override), dlsyms (override), dynamic_lib (override), dynamic_bs
-(override), static_lib (override), manifypods (override), processPL
-(override), installbin (override), subdir_x (override), clean (override),
-realclean (override), dist_basics (override), dist_core (override),
-dist_dir (override), dist_test (override), install (override), perldepend
-(override), makefile (override), test (override), test_via_harness
-(override), test_via_script (override), makeaperl (override), nicetext
-(override)
+guess_name (override)
=back
+find_perl (override)
+
+path (override)
+
+maybe_command (override)
+
+maybe_command_in_dirs (override)
+
+perl_script (override)
+
+file_name_is_absolute (override)
+
+replace_manpage_separator
+
+init_others (override)
+
+constants (override)
+
+cflags (override)
+
+const_cccmd (override)
+
+pm_to_blib (override)
+
+tool_autosplit (override)
+
+tool_sxubpp (override)
+
+xsubpp_version (override)
+
+tools_other (override)
+
+dist (override)
+
+c_o (override)
+
+xs_c (override)
+
+xs_o (override)
+
+top_targets (override)
+
+dlsyms (override)
+
+dynamic_lib (override)
+
+dynamic_bs (override)
+
+static_lib (override)
+
+manifypods (override)
+
+processPL (override)
+
+installbin (override)
+
+subdir_x (override)
+
+clean (override)
+
+realclean (override)
+
+dist_basics (override)
+
+dist_core (override)
+
+dist_dir (override)
+
+dist_test (override)
+
+install (override)
+
+perldepend (override)
+
+makefile (override)
+
+test (override)
+
+test_via_harness (override)
+
+test_via_script (override)
+
+makeaperl (override)
+
+nicetext (override)
+
=head2 ExtUtils::MM_Win32 - methods to override UN*X behaviour in
ExtUtils::MakeMaker
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-catfile, constants (o), static_lib (o), dynamic_bs (o), dynamic_lib (o),
-canonpath, perl_script, pm_to_blib, test_via_harness (o), tool_autosplit
-(override), tools_other (o), xs_o (o), top_targets (o), manifypods (o),
-dist_ci (o), dist_core (o), pasthru (o)
+=back
+
+catfile
+
+constants (o)
+
+static_lib (o)
+
+dynamic_bs (o)
+
+dynamic_lib (o)
+
+canonpath
+
+perl_script
+
+pm_to_blib
+
+test_via_harness (o)
+
+tool_autosplit (override)
+
+tools_other (o)
+
+xs_o (o)
+
+top_targets (o)
+
+htmlifypods (o)
+
+manifypods (o)
+
+dist_ci (o)
+
+dist_core (o)
+
+pasthru (o)
=head2 ExtUtils::MakeMaker - create an extension Makefile
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4379,21 +6824,25 @@ dist_ci (o), dist_core (o), pasthru (o)
=item Using Attributes and Parameters
-C, CCFLAGS, CONFIG, CONFIGURE, DEFINE, DIR, DISTNAME, DL_FUNCS, DL_VARS,
-EXCLUDE_EXT, EXE_FILES, NO_VC, FIRST_MAKEFILE, FULLPERL, H, IMPORTS, INC,
-INCLUDE_EXT, INSTALLARCHLIB, INSTALLBIN, INSTALLDIRS, INSTALLMAN1DIR,
-INSTALLMAN3DIR, INSTALLPRIVLIB, INSTALLSCRIPT, INSTALLSITELIB,
-INSTALLSITEARCH, INST_ARCHLIB, INST_BIN, INST_EXE, INST_LIB, INST_MAN1DIR,
-INST_MAN3DIR, INST_SCRIPT, LDFROM, LIBPERL_A, LIB, LIBS, LINKTYPE,
-MAKEAPERL, MAKEFILE, MAN1PODS, MAN3PODS, MAP_TARGET, MYEXTLIB, NAME,
-NEEDS_LINKING, NOECHO, NORECURS, OBJECT, OPTIMIZE, PERL, PERLMAINCC,
-PERL_ARCHLIB, PERL_LIB, PERL_SRC, PERM_RW, PERM_RWX, PL_FILES, PM,
-PMLIBDIRS, PREFIX, PREREQ_PM, SKIP, TYPEMAPS, VERSION, VERSION_FROM, XS,
-XSOPT, XSPROTOARG, XS_VERSION
+AUTHOR, ABSTRACT, ABSTRACT_FROM, BINARY_LOCATION, C, CAPI, CCFLAGS, CONFIG,
+CONFIGURE, DEFINE, DIR, DISTNAME, DL_FUNCS, DL_VARS, EXCLUDE_EXT,
+EXE_FILES, FIRST_MAKEFILE, FULLPERL, FUNCLIST, H, HTMLLIBPODS,
+HTMLSCRIPTPODS, IMPORTS, INC, INCLUDE_EXT, INSTALLARCHLIB, INSTALLBIN,
+INSTALLDIRS, INSTALLHTMLPRIVLIBDIR, INSTALLHTMLSCRIPTDIR,
+INSTALLHTMLSITELIBDIR, INSTALLMAN1DIR, INSTALLMAN3DIR, INSTALLPRIVLIB,
+INSTALLSCRIPT, INSTALLSITEARCH, INSTALLSITELIB, INST_ARCHLIB, INST_BIN,
+INST_EXE, INST_LIB, INST_HTMLLIBDIR, INST_HTMLSCRIPTDIR, INST_MAN1DIR,
+INST_MAN3DIR, INST_SCRIPT, PERL_MALLOC_OK, LDFROM, LIB, LIBPERL_A, LIBS,
+LINKTYPE, MAKEAPERL, MAKEFILE, MAN1PODS, MAN3PODS, MAP_TARGET, MYEXTLIB,
+NAME, NEEDS_LINKING, NOECHO, NORECURS, NO_VC, OBJECT, OPTIMIZE, PERL,
+PERLMAINCC, PERL_ARCHLIB, PERL_LIB, PERL_SRC, PERM_RW, PERM_RWX, PL_FILES,
+PM, PMLIBDIRS, POLLUTE, PPM_INSTALL_EXEC, PPM_INSTALL_SCRIPT, PREFIX,
+PREREQ_PM, SKIP, TYPEMAPS, VERSION, VERSION_FROM, XS, XSOPT, XSPROTOARG,
+XS_VERSION
=item Additional lowercase attributes
-clean, depend, dist, dynamic_lib, installpm, linkext, macro, realclean,
+clean, depend, dist, dynamic_lib, linkext, macro, realclean, test,
tool_autosplit
=item Overriding MakeMaker Methods
@@ -4402,20 +6851,28 @@ tool_autosplit
=item Distribution Support
-make distcheck, make skipcheck, make distclean, make manifest,
-make distdir, make tardist, make dist, make uutardist, make
+ make distcheck, make skipcheck, make distclean, make manifest,
+ make distdir, make tardist, make dist, make uutardist, make
shdist, make zipdist, make ci
=item Disabling an extension
=back
+=item ENVIRONMENT
+
+PERL_MM_OPT
+
=item SEE ALSO
=item AUTHORS
+=back
+
=head2 ExtUtils::Manifest - utilities to write and check a MANIFEST file
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4435,27 +6892,51 @@ C<Added to MANIFEST:> I<file>
=item AUTHOR
+=back
+
+=head2 ExtUtils::Miniperl, writemain - write the C code for perlmain.c
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
=head2 ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 ExtUtils::Mksymlists - write linker options files for dynamic
extension
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-NAME, DL_FUNCS, DL_VARS, FILE, FUNCLIST, DLBASE
+DLBASE, DL_FUNCS, DL_VARS, FILE, FUNCLIST, IMPORTS, NAME
=item AUTHOR
=item REVISION
+=back
+
=head2 ExtUtils::Packlist - manage .packlist files
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4470,22 +6951,34 @@ new(), read(), write(), validate(), packlist_file()
=item AUTHOR
+=back
+
=head2 ExtUtils::testlib - add blib/* directories to @INC
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 Fatal - replace functions with equivalents which succeed or die
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 Fcntl - load the C Fcntl.h defines
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4494,8 +6987,12 @@ new(), read(), write(), validate(), packlist_file()
=item EXPORTED SYMBOLS
+=back
+
=head2 File::Basename, fileparse - split a pathname into pieces
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4506,14 +7003,22 @@ fileparse_set_fstype, fileparse
C<basename>, C<dirname>
+=back
+
=head2 File::CheckTree, validate - run many filetest checks on a tree
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 File::Compare - Compare files or filehandles
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4522,15 +7027,19 @@ C<basename>, C<dirname>
=item AUTHOR
+=back
+
=head2 File::Copy - Copy files or filehandles
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=over
-=item Special behavior if C<syscopy> is defined (VMS and OS/2)
+=item Special behaviour if C<syscopy> is defined (OS/2, VMS and Win32)
rmscopy($from,$to[,$date_flag])
@@ -4540,8 +7049,12 @@ rmscopy($from,$to[,$date_flag])
=item AUTHOR
+=back
+
=head2 File::DosGlob - DOS like globbing and then some
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4556,15 +7069,47 @@ rmscopy($from,$to[,$date_flag])
=item SEE ALSO
+=back
+
=head2 File::Find, find - traverse a file tree
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-=item BUGS
+C<wanted>, C<bydepth>, C<follow>, C<follow_fast>, C<follow_skip>,
+C<no_chdir>, C<untaint>, C<untaint_pattern>, C<untaint_skip>
+
+=item CAVEAT
+
+=back
-=head2 File::Path - create or remove a series of directories
+=head2 File::Glob - Perl extension for BSD glob routine
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+C<GLOB_ERR>, C<GLOB_MARK>, C<GLOB_NOCASE>, C<GLOB_NOCHECK>, C<GLOB_NOSORT>,
+C<GLOB_BRACE>, C<GLOB_NOMAGIC>, C<GLOB_QUOTE>, C<GLOB_TILDE>, C<GLOB_CSH>
+
+=item DIAGNOSTICS
+
+C<GLOB_NOSPACE>, C<GLOB_ABEND>
+
+=item NOTES
+
+=item AUTHOR
+
+=back
+
+=head2 File::Path - create or remove directory trees
+
+=over
=item SYNOPSIS
@@ -4572,10 +7117,12 @@ rmscopy($from,$to[,$date_flag])
=item AUTHORS
-=item REVISION
+=back
=head2 File::Spec - portably perform operations on file names
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4584,63 +7131,234 @@ rmscopy($from,$to[,$date_flag])
=item AUTHORS
+=back
+
+=head2 File::Spec::Functions - portably perform operations on file names
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over
+
+=item Exports
+
+=back
+
+=item SEE ALSO
+
+=back
+
=head2 File::Spec::Mac - File::Spec for MacOS
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item METHODS
-canonpath, catdir, catfile, curdir, rootdir, updir, file_name_is_absolute,
+canonpath
+
+=back
+
+catdir
+
+catfile
+
+curdir
+
+devnull
+
+rootdir
+
+tmpdir
+
+updir
+
+file_name_is_absolute
+
path
+splitpath
+
+splitdir
+
+catpath
+
+abs2rel
+
+rel2abs
+
+=over
+
=item SEE ALSO
+=back
+
=head2 File::Spec::OS2 - methods for OS/2 file specs
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 File::Spec::Unix - methods used by File::Spec
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item METHODS
-canonpath, catdir, catfile, curdir, rootdir, updir, no_upwards,
-file_name_is_absolute, path, join, nativename
+canonpath
+
+=back
+
+catdir
+
+catfile
+
+curdir
+
+devnull
+
+rootdir
+
+tmpdir
+
+updir
+
+no_upwards
+
+case_tolerant
+
+file_name_is_absolute
+
+path
+
+join
+
+splitpath
+
+splitdir
+
+catpath
+
+abs2rel
+
+rel2abs
+
+=over
=item SEE ALSO
+=back
+
=head2 File::Spec::VMS - methods for VMS file specs
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+eliminate_macros
+
+=back
+
+fixpath
+
=over
=item Methods always loaded
-catdir, catfile, curdir (override), rootdir (override), updir (override),
-path (override), file_name_is_absolute (override)
+canonpath (override)
+
+=back
+
+catdir
+
+catfile
+
+curdir (override)
+
+devnull (override)
+
+rootdir (override)
+
+tmpdir (override)
+
+updir (override)
+
+case_tolerant (override)
+
+path (override)
+
+file_name_is_absolute (override)
+
+splitpath (override)
+
+splitdir (override)
+
+catpath (override)
+
+abs2rel (override)
+
+rel2abs (override)
+
+=over
+
+=item SEE ALSO
=back
=head2 File::Spec::Win32 - methods for Win32 file specs
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-catfile, canonpath
+devnull
+
+=back
+
+tmpdir
+
+catfile
+
+canonpath
+
+splitpath
+
+splitdir
+
+catpath
+
+abs2rel
+
+rel2abs
+
+=over
+
+=item SEE ALSO
+
+=back
=head2 File::stat - by-name interface to Perl's built-in stat() functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4649,16 +7367,24 @@ catfile, canonpath
=item AUTHOR
+=back
+
=head2 FileCache - keep more files open than the system permits
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item BUGS
+=back
+
=head2 FileHandle - supply object methods for filehandles
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4667,8 +7393,12 @@ $fh->print, $fh->printf, $fh->getline, $fh->getlines
=item SEE ALSO
+=back
+
=head2 FindBin - Locate directory of original perl script
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4681,10 +7411,12 @@ $fh->print, $fh->printf, $fh->getline, $fh->getlines
=item COPYRIGHT
-=item REVISION
+=back
=head2 GDBM_File - Perl5 access to the gdbm library.
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4695,77 +7427,385 @@ $fh->print, $fh->printf, $fh->getline, $fh->getlines
=item SEE ALSO
-=head2 Getopt::Long, GetOptions - extended processing of command line
-options
+=back
+
+=head2 Getopt::Long - Extended processing of command line options
+
+=over
=item SYNOPSIS
=item DESCRIPTION
-!, +, :s, :i, :f
+=item Command Line Options, an Introduction
+
+=item Getting Started with Getopt::Long
=over
-=item Linkage specification
+=item Simple options
-=item Aliases and abbreviations
+=item A little bit less simple options
-=item Non-option call-back routine
+=item Mixing command line option with other arguments
-=item Option starters
+=item Options with values
-=item Return values and Errors
+=item Options with multiple values
+
+=item Options with hash values
+
+=item User-defined subroutines to handle options
+
+=item Options with multiple names
+
+=item Case and abbreviations
+
+=item Summary of Option Specifications
+
+!, +, s, i, f, : I<type> [ I<desttype> ]
=back
-=item COMPATIBILITY
+=item Advanced Possibilities
-=item EXAMPLES
+=over
+
+=item Documentation and help texts
+
+=item Storing options in a hash
+
+=item Bundling
+
+=item The lonesome dash
+
+=item Argument call-back
+
+=back
-=item CONFIGURATION OPTIONS
+=item Configuring Getopt::Long
default, auto_abbrev, getopt_compat, require_order, permute, bundling
-(default: reset), bundling_override (default: reset), ignore_case
+(default: reset), bundling_override (default: reset), ignore_case
(default: set), ignore_case_always (default: reset), pass_through (default:
reset), prefix, prefix_pattern, debug (default: reset)
-=item OTHER USEFUL VARIABLES
+=item Return values and Errors
+
+=item Legacy
+
+=over
+
+=item Default destinations
+
+=item Alternative option starters
-$Getopt::Long::VERSION, $Getopt::Long::error
+=item Configuration variables
+
+=back
=item AUTHOR
=item COPYRIGHT AND DISCLAIMER
+=back
+
=head2 Getopt::Std, getopt - Process single-character switches with switch
clustering
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 I18N::Collate - compare 8-bit scalar data according to the current
locale
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 IO - load various IO modules
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=head2 IO::Dir - supply object methods for directory handles
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
+rewind (), close (), tie %hash, IO::Dir, DIRNAME [, OPTIONS ]
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::File - supply object methods for filehandles
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
+
+=item METHODS
+
+open( FILENAME [,MODE [,PERMS]] )
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::Handle - supply object methods for I/O handles
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new (), new_from_fd ( FD, MODE )
+
+=item METHODS
+
+$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
+$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
+$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
+$io->blocking ( [ BOOL ] ), $io->untaint
+
+=item NOTE
+
+=item SEE ALSO
+
+=item BUGS
+
+=item HISTORY
+
+=back
+
+=head2 IO::Pipe - supply object methods for pipes
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [READER, WRITER] )
+
+=item METHODS
+
+reader ([ARGS]), writer ([ARGS]), handles ()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Poll - Object interface to system poll call
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
+IO ), handles( [ EVENT_MASK ] )
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Seekable - supply seek based methods for I/O objects
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item HISTORY
+
+=back
+
+=head2 IO::Select - OO interface to the select system call
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ HANDLES ] )
+
+=item METHODS
+
+add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
+count (), bits(), select ( READ, WRITE, ERROR [, TIMEOUT ] )
+
+=item EXAMPLE
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket - Object interface to socket communications
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), timeout([VAL]),
+sockopt(OPT [, VAL]), sockdomain, socktype, protocol, connected
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket::INET - Object interface for AF_INET domain sockets
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=over
+
+=item METHODS
+
+sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
+()
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::Socket::UNIX - Object interface for AF_UNIX domain sockets
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=item METHODS
+
+hostpath(), peerpath()
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Dir, IO::Dir - supply object methods for directory
+handles
+
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
+rewind (), close (), tie %hash, IO::Dir, DIRNAME [, OPTIONS ]
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
=head2 IO::lib::IO::File, IO::File - supply object methods for filehandles
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item CONSTRUCTOR
-new ([ ARGS ] ), new_tmpfile
+new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
=item METHODS
@@ -4775,9 +7815,13 @@ open( FILENAME [,MODE [,PERMS]] )
=item HISTORY
+=back
+
=head2 IO::lib::IO::Handle, IO::Handle - supply object methods for I/O
handles
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4788,9 +7832,10 @@ new (), new_from_fd ( FD, MODE )
=item METHODS
-$fh->fdopen ( FD, MODE ), $fh->opened, $fh->getline, $fh->getlines,
-$fh->ungetc ( ORD ), $fh->write ( BUF, LEN [, OFFSET }\] ), $fh->flush,
-$fh->error, $fh->clearerr, $fh->untaint
+$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
+$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
+$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
+$io->blocking ( [ BOOL ] ), $io->untaint
=item NOTE
@@ -4800,13 +7845,17 @@ $fh->error, $fh->clearerr, $fh->untaint
=item HISTORY
-=head2 IO::lib::IO::Pipe, IO::pipe - supply object methods for pipes
+=back
+
+=head2 IO::lib::IO::Pipe, IO::Pipe - supply object methods for pipes
+
+=over
=item SYNOPSIS
=item DESCRIPTION
-=item CONSTRCUTOR
+=item CONSTRUCTOR
new ( [READER, WRITER] )
@@ -4820,9 +7869,34 @@ reader ([ARGS]), writer ([ARGS]), handles ()
=item COPYRIGHT
+=back
+
+=head2 IO::lib::IO::Poll, IO::Poll - Object interface to system poll call
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
+IO ), handles( [ EVENT_MASK ] )
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
=head2 IO::lib::IO::Seekable, IO::Seekable - supply seek based methods for
I/O objects
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4831,9 +7905,13 @@ I/O objects
=item HISTORY
+=back
+
=head2 IO::lib::IO::Select, IO::Select - OO interface to the select system
call
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4845,8 +7923,8 @@ new ( [ HANDLES ] )
=item METHODS
add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
-[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_error ( [ TIMEOUT ] ), count
-(), bits(), bits(), select ( READ, WRITE, ERROR [, TIMEOUT ] )
+[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
+count (), bits(), select ( READ, WRITE, ERROR [, TIMEOUT ] )
=item EXAMPLE
@@ -4854,9 +7932,13 @@ add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
=item COPYRIGHT
+=back
+
=head2 IO::lib::IO::Socket, IO::Socket - Object interface to socket
communications
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4867,36 +7949,98 @@ new ( [ARGS] )
=item METHODS
-accept([PKG]), timeout([VAL]), sockopt(OPT [, VAL]), sockdomain, socktype,
-protocol
+accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), timeout([VAL]),
+sockopt(OPT [, VAL]), sockdomain, socktype, protocol, connected
-=item SUB-CLASSES
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket::INET, IO::Socket::INET - Object interface for
+AF_INET domain sockets
=over
-=item IO::Socket::INET
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
+
+=over
=item METHODS
sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
()
-=item IO::Socket::UNIX
+=back
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
+=head2 IO::lib::IO::Socket::UNIX, IO::Socket::UNIX - Object interface for
+AF_UNIX domain sockets
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONSTRUCTOR
+
+new ( [ARGS] )
=item METHODS
hostpath(), peerpath()
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
=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
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4905,17 +8049,48 @@ hostpath(), peerpath()
=item SEE ALSO
+=back
+
=head2 IPC::Open3, open3 - open a process for reading, writing, and error
handling
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item WARNING
+=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
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4928,8 +8103,12 @@ ftok( PATH, ID )
=item COPYRIGHT
+=back
+
=head2 IPC::SysV::Msg, IPC::Msg - SysV Msg IPC object class
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4946,9 +8125,13 @@ FLAGS ] ), stat
=item COPYRIGHT
+=back
+
=head2 IPC::SysV::Semaphore, IPC::Semaphore - SysV Semaphore IPC object
class
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4966,20 +8149,29 @@ set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N
=item COPYRIGHT
+=back
+
=head2 Math::BigFloat - Arbitrary length float math package
+=over
+
=item SYNOPSIS
=item DESCRIPTION
-number format, Error returns 'NaN', Division is computed to
+number format, Error returns 'NaN', Division is computed to, Rounding is
+performed
=item BUGS
=item AUTHOR
+=back
+
=head2 Math::BigInt - Arbitrary size integer math package
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -4994,31 +8186,12 @@ Canonical notation, Input, Output
=item AUTHOR
-=head2 Math::Complex - complex numbers and associated mathematical
-functions
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPERATIONS
-
-=item CREATION
-
-=item STRINGIFICATION
-
-=item USAGE
-
-=item ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
-
-=item ERRORS DUE TO INDIGESTIBLE ARGUMENTS
-
-=item BUGS
-
-=item AUTHORS
+=back
=head2 Math::Trig - trigonometric functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5058,14 +8231,22 @@ cylindrical_to_spherical, spherical_to_cartesian, spherical_to_cylindrical
=item AUTHORS
+=back
+
=head2 NDBM_File - Tied access to ndbm files
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 Net::Ping - check a remote host for reachability
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5083,9 +8264,13 @@ $timeout]);, $p->close();, pingecho($host [, $timeout]);
=item NOTES
+=back
+
=head2 Net::hostent - by-name interface to Perl's built-in gethost*()
functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5096,9 +8281,13 @@ functions
=item AUTHOR
+=back
+
=head2 Net::netent - by-name interface to Perl's built-in getnet*()
functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5109,9 +8298,13 @@ functions
=item AUTHOR
+=back
+
=head2 Net::protoent - by-name interface to Perl's built-in getproto*()
functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5120,9 +8313,13 @@ functions
=item AUTHOR
+=back
+
=head2 Net::servent - by-name interface to Perl's built-in getserv*()
functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5133,14 +8330,38 @@ functions
=item AUTHOR
+=back
+
+=head2 O - Generic interface to Perl Compiler backends
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CONVENTIONS
+
+=item IMPLEMENTATION
+
+=item AUTHOR
+
+=back
+
=head2 ODBM_File - Tied access to odbm files
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 Opcode - Disable named opcodes when compiling perl code
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5165,6 +8386,10 @@ opdump (PAT)
=item TO DO (maybe)
+=back
+
+=over
+
=item Predefined Opcode Tags
:base_core, :base_mem, :base_loop, :base_io, :base_orig, :base_math,
@@ -5176,9 +8401,13 @@ opdump (PAT)
=item AUTHORS
+=back
+
=head2 Opcode::Safe, Safe - Compile and execute code in restricted
compartments
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5206,17 +8435,25 @@ Memory, CPU, Snooping, Signals, State Changes
=back
+=back
+
=head2 Opcode::ops, ops - Perl pragma to restrict unsafe operations when
compiling
-=item SYNOPSIS
+=over
+
+=item SYNOPSIS
=item DESCRIPTION
=item SEE ALSO
+=back
+
=head2 POSIX - Perl interface to IEEE Std 1003.1
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5342,57 +8579,1002 @@ Constants, Macros
=item CREATION
+=back
+
+=head2 Pod::Checker, podchecker() - check pod documents for syntax errors
+
+=over
+
+=item SYNOPSIS
+
+=item OPTIONS/ARGUMENTS
+
+=over
+
+=item podchecker()
+
+B<-warnings> =E<gt> I<val>
+
+=back
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+=over
+
+=item Errors
+
+empty =headn, =over on line I<N> without closing =back, =item without
+previous =over, =back without previous =over, No argument for =begin, =end
+without =begin, Nested =begin's, =for without formatter specification,
+unresolved internal link I<NAME>, Unknown command "I<CMD>", Unknown
+interior-sequence "I<SEQ>", nested commands
+I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>, garbled entity I<STRING>, Entity
+number out of range, malformed link LE<lt>E<gt>, nonempty ZE<lt>E<gt>,
+empty XE<lt>E<gt>, Spurious text after =pod / =cut, Spurious character(s)
+after =back
+
+=item Warnings
+
+multiple occurence of link target I<name>, line containing nothing but
+whitespace in paragraph, file does not start with =head, No numeric
+argument for =over, previous =item has no contents, preceding non-item
+paragraph(s), =item type mismatch (I<one> vs. I<two>), I<N> unescaped
+C<E<lt>E<gt>> in paragraph, Unknown entity, No items in =over, No argument
+for =item, empty section in previous paragraph, Verbatim paragraph in NAME
+section, Hyperlinks
+
+=back
+
+=item RETURN VALUE
+
+=item EXAMPLES
+
+=item INTERFACE
+
+=back
+
+C<$checker-E<gt>poderror( @args )>, C<$checker-E<gt>poderror( {%opts},
+@args )>
+
+C<$checker-E<gt>num_errors()>
+
+C<$checker-E<gt>name()>
+
+C<$checker-E<gt>node()>
+
+C<$checker-E<gt>idx()>
+
+C<$checker-E<gt>hyperlink()>
+
+=over
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Find - find POD documents in directory trees
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item OPTIONS
+
+B<-verbose>, B<-perl>, B<-script>, B<-inc>
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
=head2 Pod::Html - module to convert pod files to HTML
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item ARGUMENTS
-help, htmlroot, infile, outfile, podroot, podpath, libpods, netscape,
-nonetscape, index, noindex, recurse, norecurse, title, verbose
+backlink, css, flush, header, help, htmldir, htmlroot, index, infile,
+libpods, netscape, outfile, podpath, podroot, quiet, recurse, title,
+verbose
=item EXAMPLE
+=item ENVIRONMENT
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 Pod::InputObjects - objects representing POD input paragraphs,
+commands, etc.
+
+=over
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+B<Pod::InputSource>, B<Pod::Paragraph>, B<Pod::InteriorSequence>,
+B<Pod::ParseTree>
+
+=back
+
+=over
+
+=item B<Pod::InputSource>
+
+=back
+
+=over
+
+=item B<new()>
+
+=back
+
+=over
+
+=item B<name()>
+
+=back
+
+=over
+
+=item B<handle()>
+
+=back
+
+=over
+
+=item B<was_cutting()>
+
+=back
+
+=over
+
+=item B<Pod::Paragraph>
+
+=back
+
+=over
+
+=item B<new()>
+
+=back
+
+=over
+
+=item B<cmd_name()>
+
+=back
+
+=over
+
+=item B<text()>
+
+=back
+
+=over
+
+=item B<raw_text()>
+
+=back
+
+=over
+
+=item B<cmd_prefix()>
+
+=back
+
+=over
+
+=item B<cmd_separator()>
+
+=back
+
+=over
+
+=item B<parse_tree()>
+
+=back
+
+=over
+
+=item B<file_line()>
+
+=back
+
+=over
+
+=item B<Pod::InteriorSequence>
+
+=back
+
+=over
+
+=item B<new()>
+
+=back
+
+=over
+
+=item B<cmd_name()>
+
+=back
+
+=over
+
+=item B<prepend()>
+
+=back
+
+=over
+
+=item B<append()>
+
+=back
+
+=over
+
+=item B<nested()>
+
+=back
+
+=over
+
+=item B<raw_text()>
+
+=back
+
+=over
+
+=item B<left_delimiter()>
+
+=back
+
+=over
+
+=item B<right_delimiter()>
+
+=back
+
+=over
+
+=item B<parse_tree()>
+
+=back
+
+=over
+
+=item B<file_line()>
+
+=back
+
+=over
+
+=item B<DESTROY()>
+
+=back
+
+=over
+
+=item B<Pod::ParseTree>
+
+=back
+
+=over
+
+=item B<new()>
+
+=back
+
+=over
+
+=item B<top()>
+
+=back
+
+=over
+
+=item B<children()>
+
+=back
+
+=over
+
+=item B<prepend()>
+
+=back
+
+=over
+
+=item B<append()>
+
+=back
+
+=over
+
+=item B<raw_text()>
+
+=back
+
+=over
+
+=item B<DESTROY()>
+
+=back
+
+=over
+
+=item SEE ALSO
+
=item AUTHOR
+=back
+
+=head2 Pod::Man - Convert POD data to formatted *roff input
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, release,
+section
+
+=item DIAGNOSTICS
+
+roff font should be 1 or 2 chars, not `%s', Invalid link %s, Unknown escape
+EE<lt>%sE<gt>, Unknown sequence %s, Unmatched =back
+
=item BUGS
=item SEE ALSO
-=item COPYRIGHT
+=item AUTHOR
+
+=back
+
+=head2 Pod::ParseUtils - helpers for POD parsing and conversion
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=back
+
+=over
+
+=item Pod::List
+
+new()
+
+=back
+
+file()
+
+start()
+
+indent()
+
+type()
+
+rx()
+
+item()
+
+parent()
+
+tag()
+
+=over
+
+=item Pod::Hyperlink
+
+new()
+
+=back
+
+parse($string)
+
+markup($string)
+
+text()
+
+warning()
+
+line(), file()
+
+page()
+
+node()
+
+alttext()
+
+type()
+
+link()
+
+=over
+
+=item Pod::Cache
+
+new()
+
+=back
+
+item()
+
+find_page($name)
+
+=over
+
+=item Pod::Cache::Item
+
+new()
+
+=back
+
+page()
+
+description()
+
+path()
+
+file()
+
+nodes()
+
+find_node($name)
+
+idx()
+
+=over
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Parser - base class for creating POD filters and translators
+
+=over
+
+=item SYNOPSIS
+
+=item REQUIRES
+
+=item EXPORTS
+
+=item DESCRIPTION
+
+=item QUICK OVERVIEW
+
+=item PARSING OPTIONS
+
+B<-want_nonPODs> (default: unset), B<-process_cut_cmd> (default: unset),
+B<-warnings> (default: unset)
+
+=back
+
+=over
+
+=item RECOMMENDED SUBROUTINE/METHOD OVERRIDES
+
+=back
+
+=over
+
+=item B<command()>
+
+C<$cmd>, C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over
+
+=item B<verbatim()>
+
+C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over
+
+=item B<textblock()>
+
+C<$text>, C<$line_num>, C<$pod_para>
+
+=back
+
+=over
+
+=item B<interior_sequence()>
+
+=back
+
+=over
+
+=item OPTIONAL SUBROUTINE/METHOD OVERRIDES
+
+=back
+
+=over
+
+=item B<new()>
+
+=back
+
+=over
+
+=item B<initialize()>
+
+=back
+
+=over
+
+=item B<begin_pod()>
+
+=back
+
+=over
+
+=item B<begin_input()>
+
+=back
+
+=over
+
+=item B<end_input()>
+
+=back
+
+=over
+
+=item B<end_pod()>
+
+=back
+
+=over
+
+=item B<preprocess_line()>
+
+=back
+
+=over
+
+=item B<preprocess_paragraph()>
+
+=back
+
+=over
+
+=item METHODS FOR PARSING AND PROCESSING
+
+=back
+
+=over
+
+=item B<parse_text()>
+
+B<-expand_seq> =E<gt> I<code-ref>|I<method-name>, B<-expand_text> =E<gt>
+I<code-ref>|I<method-name>, B<-expand_ptree> =E<gt>
+I<code-ref>|I<method-name>
+
+=back
+
+=over
+
+=item B<interpolate()>
+
+=back
+
+=over
+
+=item B<parse_paragraph()>
+
+=back
+
+=over
+
+=item B<parse_from_filehandle()>
+
+=back
+
+=over
+
+=item B<parse_from_file()>
+
+=back
+
+=over
+
+=item ACCESSOR METHODS
+
+=back
+
+=over
+
+=item B<errorsub()>
+
+=back
+
+=over
+
+=item B<cutting()>
+
+=back
+
+=over
+
+=item B<parseopts()>
+
+=back
+
+=over
+
+=item B<output_file()>
+
+=back
+
+=over
+
+=item B<output_handle()>
+
+=back
+
+=over
+
+=item B<input_file()>
+
+=back
+
+=over
+
+=item B<input_handle()>
+
+=back
+
+=over
+
+=item B<input_streams()>
+
+=back
+
+=over
+
+=item B<top_stream()>
+
+=back
+
+=over
+
+=item PRIVATE METHODS AND DATA
+
+=back
+
+=over
+
+=item B<_push_input_stream()>
+
+=back
+
+=over
+
+=item B<_pop_input_stream()>
+
+=back
+
+=over
+
+=item TREE-BASED PARSING
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Plainer - Perl extension for converting Pod to old style Pod.
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over
+
+=item EXPORT
-=head2 Pod::Text - convert POD data to formatted ASCII text
+=back
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
+=head2 Pod::Select, podselect() - extract selected sections of POD from
+input
+
+=over
=item SYNOPSIS
+=item REQUIRES
+
+=item EXPORTS
+
=item DESCRIPTION
+=item SECTION SPECIFICATIONS
+
+=item RANGE SPECIFICATIONS
+
+=back
+
+=over
+
+=item OBJECT METHODS
+
+=back
+
+=over
+
+=item B<curr_headings()>
+
+=back
+
+=over
+
+=item B<select()>
+
+=back
+
+=over
+
+=item B<add_selection()>
+
+=back
+
+=over
+
+=item B<clear_selections()>
+
+=back
+
+=over
+
+=item B<match_section()>
+
+=back
+
+=over
+
+=item B<is_selected()>
+
+=back
+
+=over
+
+=item EXPORTED FUNCTIONS
+
+=back
+
+=over
+
+=item B<podselect()>
+
+B<-output>, B<-sections>, B<-ranges>
+
+=back
+
+=over
+
+=item PRIVATE METHODS AND DATA
+
+=back
+
+=over
+
+=item B<_compile_section_spec()>
+
+=back
+
+=over
+
+=item $self->{_SECTION_HEADINGS}
+
+=back
+
+=over
+
+=item $self->{_SELECTED_SECTIONS}
+
+=back
+
+=over
+
+=item SEE ALSO
+
=item AUTHOR
-=item TODO
+=back
+
+=head2 Pod::Text - Convert POD data to formatted ASCII text
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+alt, indent, loose, sentence, width
+
+=item DIAGNOSTICS
+
+Bizarre space in item, Can't open %s for reading: %s, Unknown escape: %s,
+Unknown sequence: %s, Unmatched =back
+
+=item RESTRICTIONS
+
+=item NOTES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Text::Color - Convert POD data to formatted color ASCII text
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item BUGS
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Text::Termcap, Pod::Text::Color - Convert POD data to ASCII
+text with format escapes
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Pod::Usage, pod2usage() - print a usage message from embedded pod
+documentation
+
+=over
+
+=item SYNOPSIS
+
+=item ARGUMENTS
+
+C<-message>, C<-msg>, C<-exitval>, C<-verbose>, C<-output>, C<-input>,
+C<-pathlist>
+
+=item DESCRIPTION
+
+=item EXAMPLES
+
+=over
+
+=item Recommended Use
+
+=back
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item ACKNOWLEDGEMENTS
+
+=back
=head2 SDBM_File - Tied access to sdbm files
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=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
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 SelectSaver - save and restore selected file handle
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 SelfLoader - load functions only on demand
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5415,17 +9597,25 @@ nonetscape, index, noindex, recurse, norecurse, title, verbose
=item Multiple packages and fully qualified subroutine names
+=back
+
=head2 Shell - run shell commands transparently within perl
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C
socket.h defines and structure manipulators
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5436,23 +9626,35 @@ SOCKADDR_IN, pack_sockaddr_in PORT, IP_ADDRESS, unpack_sockaddr_in
SOCKADDR_IN, sockaddr_un PATHNAME, sockaddr_un SOCKADDR_UN,
pack_sockaddr_un PATH, unpack_sockaddr_un SOCKADDR_UN
+=back
+
=head2 Symbol - manipulate Perl symbols and their names
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=back
+
=head2 Sys::Hostname - Try every conceivable way to get hostname
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 Syslog, Sys::Syslog, openlog, closelog, setlogmask, syslog - Perl
interface to the UNIX syslog(3) calls
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5463,22 +9665,69 @@ closelog
=item EXAMPLES
-=item DEPENDENCIES
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
+=head2 Syslog::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 Term::ANSIColor - Color screen output using ANSI escape sequences
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item DIAGNOSTICS
+
+Invalid attribute name %s, Identifier %s used only once: possible typo, No
+comma allowed after filehandle, Bareword %s not allowed while "strict subs"
+in use
+
+=item RESTRICTIONS
+
+=item AUTHORS
+
+=back
+
=head2 Term::Cap - Perl termcap interface
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item EXAMPLES
+=back
+
=head2 Term::Complete - Perl word completion module
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5491,9 +9740,13 @@ E<lt>tabE<gt>, ^D, ^U, E<lt>delE<gt>, E<lt>bsE<gt>
=item AUTHOR
+=back
+
=head2 Term::ReadLine - Perl interface to various C<readline> packages. If
no real package is found, substitutes stubs instead of basic functions.
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5511,7 +9764,11 @@ C<tkRunning>, C<ornaments>, C<newTTY>
=item ENVIRONMENT
-=head2 Test - provides a simple framework for writing test scripts
+=back
+
+=head2 Test - provides a simple framework for writing test scripts
+
+=over
=item SYNOPSIS
@@ -5521,14 +9778,20 @@ C<tkRunning>, C<ornaments>, C<newTTY>
NORMAL TESTS, SKIPPED TESTS, TODO TESTS
+=item RETURN VALUE
+
=item ONFAIL
=item SEE ALSO
=item AUTHOR
+=back
+
=head2 Test::Harness - run perl standard test scripts with statistics
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5556,17 +9819,25 @@ C<All tests successful.\nFiles=%d, Tests=%d, %s>, C<FAILED tests
=item BUGS
+=back
+
=head2 Text::Abbrev, abbrev - create an abbreviation table from a list
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item EXAMPLE
+=back
+
=head2 Text::ParseWords - parse text into an array of tokens or array of
arrays
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5581,9 +9852,13 @@ backslashed double-quote)
=item AUTHORS
+=back
+
=head2 Text::Soundex - Implementation of the Soundex Algorithm as Described
by Knuth
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5594,9 +9869,13 @@ by Knuth
=item AUTHOR
+=back
+
=head2 Text::Tabs -- expand and unexpand tabs per the unix expand(1) and
unexpand(1)
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5605,19 +9884,26 @@ unexpand(1)
=item AUTHOR
+=back
+
=head2 Text::Wrap - line wrapping to form simple paragraphs
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item EXAMPLE
-=item BUGS
-
=item AUTHOR
-=head2 Thread - multithreading
+=back
+
+=head2 Thread - manipulate threads in Perl (EXPERIMENTAL, subject to
+change)
+
+=over
=item SYNOPSIS
@@ -5627,18 +9913,22 @@ unexpand(1)
new \&start_sub, new \&start_sub, LIST, lock VARIABLE, async BLOCK;,
Thread->self, Thread->list, cond_wait VARIABLE, cond_signal VARIABLE,
-cond_broadcast VARIABLE
+cond_broadcast VARIABLE, yield
=item METHODS
-join, eval, tid
+join, eval, detach, equal, tid
=item LIMITATIONS
=item SEE ALSO
+=back
+
=head2 Thread::Queue - thread-safe queues
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5649,8 +9939,12 @@ new, enqueue LIST, dequeue, dequeue_nb, pending
=item SEE ALSO
+=back
+
=head2 Thread::Semaphore - thread-safe semaphores
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5659,34 +9953,53 @@ new, enqueue LIST, dequeue, dequeue_nb, pending
new, new NUMBER, down, down NUMBER, up, up NUMBER
+=back
+
=head2 Thread::Signal - Start a thread which runs signal handlers reliably
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item BUGS
+=back
+
=head2 Thread::Specific - thread-specific keys
+=over
+
=item SYNOPSIS
+=item DESCRIPTION
+
+=back
+
=head2 Tie::Array - base class for tied arrays
-=item SYNOPSIS
+=over
+
+=item SYNOPSIS
-=item DESCRIPTION
+=item DESCRIPTION
TIEARRAY classname, LIST, STORE this, index, value, FETCH this, index,
-FETCHSIZE this, STORESIZE this, count, EXTEND this, count, CLEAR this,
-DESTROY this, PUSH this, LIST, POP this, SHIFT this, UNSHIFT this, LIST,
-SPLICE this, offset, length, LIST
+FETCHSIZE this, STORESIZE this, count, EXTEND this, count, EXISTS this,
+key, DELETE this, key, CLEAR this, DESTROY this, PUSH this, LIST, POP this,
+SHIFT this, UNSHIFT this, LIST, SPLICE this, offset, length, LIST
=item CAVEATS
=item AUTHOR
-=head2 Tie::Handle - base class definitions for tied handles
+=back
+
+=head2 Tie::Handle, Tie::StdHandle - base class definitions for tied
+handles
+
+=over
=item SYNOPSIS
@@ -5694,12 +10007,17 @@ SPLICE this, offset, length, LIST
TIEHANDLE classname, LIST, WRITE this, scalar, length, offset, PRINT this,
LIST, PRINTF this, format, LIST, READ this, scalar, length, offset,
-READLINE this, GETC this, DESTROY this
+READLINE this, GETC this, CLOSE this, OPEN this, filename, BINMODE this,
+EOF this, TELL this, SEEK this, offset, whence, DESTROY this
=item MORE INFORMATION
+=back
+
=head2 Tie::Hash, Tie::StdHash - base class definitions for tied hashes
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5711,8 +10029,12 @@ this, NEXTKEY this, lastkey, EXISTS this, key, DELETE this, key, CLEAR this
=item MORE INFORMATION
+=back
+
=head2 Tie::RefHash - use references as hash keys
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5725,9 +10047,13 @@ this, NEXTKEY this, lastkey, EXISTS this, key, DELETE this, key, CLEAR this
=item SEE ALSO
+=back
+
=head2 Tie::Scalar, Tie::StdScalar - base class definitions for tied
scalars
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5736,23 +10062,39 @@ TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
=item MORE INFORMATION
+=back
+
=head2 Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item CAVEATS
+=back
+
=head2 Time::Local - efficiently compute time from local and GMT time
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=item IMPLEMENTATION
+
+=item BUGS
+
+=back
+
=head2 Time::gmtime - by-name interface to Perl's built-in gmtime()
function
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5761,9 +10103,13 @@ function
=item AUTHOR
+=back
+
=head2 Time::localtime - by-name interface to Perl's built-in localtime()
function
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5772,16 +10118,24 @@ function
=item AUTHOR
+=back
+
=head2 Time::tm - internal object used by Time::gmtime and Time::localtime
+=over
+
=item SYNOPSIS
=item DESCRIPTION
=item AUTHOR
+=back
+
=head2 UNIVERSAL - base class for ALL classes (blessed references)
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5789,9 +10143,13 @@ function
isa ( TYPE ), can ( METHOD ), VERSION ( [ REQUIRE ] ), UNIVERSAL::isa (
VAL, TYPE ), UNIVERSAL::can ( VAL, METHOD )
+=back
+
=head2 User::grent - by-name interface to Perl's built-in getgr*()
functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
@@ -5800,22 +10158,52 @@ functions
=item AUTHOR
+=back
+
=head2 User::pwent - by-name interface to Perl's built-in getpw*()
functions
+=over
+
=item SYNOPSIS
=item DESCRIPTION
+=over
+
+=item System Specifics
+
+=back
+
=item NOTE
=item AUTHOR
+=item HISTORY
+
+March 18th, 2000
+
+=back
+
+=head2 XSLoader - Dynamically load C libraries into Perl code
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item AUTHOR
+
+=back
+
=head1 AUXILIARY DOCUMENTATION
Here should be listed all the extra programs' documentation, but they
don't all have manual pages yet:
+=over
+
=item a2p
=item s2p
@@ -5834,6 +10222,8 @@ don't all have manual pages yet:
=item wrapsuid
+=back
+
=head1 AUTHOR
Larry Wall <F<larry@wall.org>>, with the help of oodles
diff --git a/contrib/perl5/pod/perltodo.pod b/contrib/perl5/pod/perltodo.pod
new file mode 100644
index 0000000..f22d473
--- /dev/null
+++ b/contrib/perl5/pod/perltodo.pod
@@ -0,0 +1,870 @@
+=head1 NAME
+
+perltodo - Perl TO-DO List
+
+=head1 DESCRIPTION
+
+This is a list of wishes for Perl. It is maintained by Nathan
+Torkington for the Perl porters. Send updates to
+I<perl5-porters@perl.org>. If you want to work on any of these
+projects, be sure to check the perl5-porters archives for past ideas,
+flames, and propaganda. This will save you time and also prevent you
+from implementing something that Larry has already vetoed. One set
+of archives may be found at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/
+
+
+=head1 Infrastructure
+
+=head2 Mailing list archives
+
+Chaim suggests contacting egroup and asking them to archive the other
+perl.org mailing lists. Probably not advocacy, but definitely
+perl6-porters, etc.
+
+=head2 Bug tracking system
+
+Richard Foley I<richard@perl.org> is writing one. We looked at
+several, like gnats and the Debian system, but at the time we
+investigated them, none met our needs. Since then, Jitterbug has
+matured, and may be worth reinvestigation.
+
+The system we've developed is the recipient of perlbug mail, and any
+followups it generates from perl5-porters. New bugs are entered
+into a mysql database, and sent on to
+perl5-porters with the subject line rewritten to include a "ticket
+number" (unique ID for the new bug). If the incoming message already
+had a ticket number in the subject line, then the message is logged
+against that bug. There is a separate email interface (not forwarding
+to p5p) that permits porters to claim, categorize, and close tickets.
+
+There is also a web interface to the system at http://bugs.perl.org.
+
+The current delay in implementation is caused by perl.org lockups.
+One suspect is the mail handling system, possibly going into loops.
+
+We still desperately need a bugmaster, someone who will look at
+every new "bug" and kill those that we already know about, those
+that are not bugs at all, etc.
+
+=head2 Regression Tests
+
+The test suite for Perl serves two needs: ensuring features work, and
+ensuring old bugs have not been reintroduced. Both need work.
+
+Brent LaVelle (lavelle@metronet.com) has stepped forward to work on
+performance tests and improving the size of the test suite.
+
+=over 4
+
+=item Coverage
+
+Do the tests that come with Perl exercise every line (or every block,
+or ...) of the Perl interpreter, and if not then how can we make them
+do so?
+
+=item Regression
+
+No bug fixes should be made without a corresponding testsuite addition.
+This needs a dedicated enforcer, as the current pumpking is either too
+lazy or too stupid or both and lets enforcement wander all over the
+map. :-)
+
+=item __DIE__
+
+Tests that fail need to be of a form that can be readily mailed
+to perlbug and diagnosed with minimal back-and-forth's to determine
+which test failed, due to what cause, etc.
+
+=item suidperl
+
+We need regression/sanity tests for suidperl
+
+=item The 25% slowdown from perl4 to perl5
+
+This value may or may not be accurate, but it certainly is
+eye-catching. For some things perl5 is faster than perl4, but often
+the reliability and extensability have come at a cost of speed. The
+benchmark suite that Gisle released earlier has been hailed as both a
+fantastic solution and as a source of entirely meaningless figures.
+Do we need to test "real applications"? Can you do so? Anyone have
+machines to dedicate to the task? Identify the things that have grown
+slower, and see if there's a way to make them faster.
+
+=back
+
+=head1 Configure
+
+Andy Dougherty maintain(ed|s) a list of "todo" items for the configure
+that comes with Perl. See Porting/pumpkin.pod in the latest
+source release.
+
+=head2 Install HTML
+
+Have "make install" give you the option to install HTML as well. This
+would be part of Configure. Andy Wardley (certified Perl studmuffin)
+will look into the current problems of HTML installation--is
+'installhtml' preventing this from happening cleanly, or is pod2html
+the problem? If the latter, Brad Appleton's pod work may fix the
+problem for free.
+
+=head1 Perl Language
+
+=head2 our ($var)
+
+Declare global variables (lexically or otherwise).
+
+=head2 64-bit Perl
+
+Verify complete 64 bit support so that the value of sysseek, or C<-s>, or
+stat(), or tell can fit into a perl number without losing precision.
+Work with the perl-64bit mailing list on perl.org.
+
+=head2 Prototypes
+
+=over 4
+
+=item Named prototypes
+
+Add proper named prototypes that actually work usefully.
+
+=item Indirect objects
+
+Fix prototype bug that forgets indirect objects.
+
+=item Method calls
+
+Prototypes for method calls.
+
+=item Context
+
+Return context prototype declarations.
+
+=item Scoped subs
+
+lexically-scoped subs, e.g. my sub
+
+=back
+
+=head1 Perl Internals
+
+=head2 magic_setisa
+
+C<magic_setisa> should be made to update %FIELDS [???]
+
+=head2 Garbage Collection
+
+There was talk of a mark-and-sweep garbage collector at TPC2, but the
+(to users) unpredictable nature of its behaviour put some off.
+Sarathy, I believe, did the work. Here's what he has to say:
+
+Yeah, I hope to implement it someday too. The points that were
+raised in TPC2 were all to do with calling DESTROY() methods, but
+I think we can accomodate that by extending bless() to stash
+extra information for objects so we track their lifetime accurately
+for those that want their DESTROY() to be predictable (this will be
+a speed hit, naturally, and will therefore be optional, naturally. :)
+
+[N.B. Don't even ask me about this now! When I have the time to
+write a cogent summary, I'll post it.]
+
+=head2 Reliable signals
+
+Sarathy and Dan Sugalski are working on this. Chip posted a patch
+earlier, but it was not accepted into 5.005. The issue is tricky,
+because it has the potential to greatly slow down the core.
+
+There are at least three things to consider:
+
+=over 4
+
+=item Alternate runops() for signal despatch
+
+Sarathy and Dan are discussed this on perl5-porters.
+
+=item Figure out how to die() in delayed sighandler
+
+=item Add tests for Thread::Signal
+
+=item Automatic tests against CPAN
+
+Is there some way to automatically build all/most of CPAN with
+the new Perl and check that the modules there pass all the tests?
+
+=back
+
+=head2 Interpolated regex performance bugs
+
+ while (<>) {
+ $found = 0;
+ foreach $pat (@patterns) {
+ $found++ if /$pat/o;
+ }
+ print if $found;
+ }
+
+The qr// syntax added in 5.005 has solved this problem, but
+it needs more thorough documentation.
+
+=head2 Memory leaks from failed eval/regcomp
+
+The only known memory leaks in Perl are in failed code or regexp
+compilation. Fix this. Hugo Van Der Sanden will attempt this but
+won't have tuits until January 1999.
+
+=head2 Make XS easier to use
+
+There was interest in SWIG from porters, but nothing has happened
+lately.
+
+=head2 Make embedded Perl easier to use
+
+This is probably difficult for the same reasons that "XS For Dummies"
+will be difficult.
+
+=head2 Namespace cleanup
+
+ CPP-space: restrict CPP symbols exported from headers
+ header-space: move into CORE/perl/
+ API-space: begin list of things that constitute public api
+ env-space: Configure should use PERL_CONFIG instead of CONFIG etc.
+
+=head2 MULTIPLICITY
+
+Complete work on safe recursive interpreters C<Perl-E<gt>new()>.
+Sarathy says that a reference implementation exists.
+
+=head2 MacPerl
+
+Chris Nandor and Matthias Neeracher are working on better integrating
+MacPerl into the Perl distribution.
+
+=head1 Documentation
+
+There's a lot of documentation that comes with Perl. The quantity of
+documentation makes it difficult for users to know which section of
+which manpage to read in order to solve their problem. Tom
+Christiansen has done much of the documentation work in the past.
+
+=head2 A clear division into tutorial and reference
+
+Some manpages (e.g., perltoot and perlreftut) clearly set out to
+educate the reader about a subject. Other manpages (e.g., perlsub)
+are references for which there is no tutorial, or are references with
+a slight tutorial bent. If things are either tutorial or reference,
+then the reader knows which manpage to read to learn about a subject,
+and which manpage to read to learn all about an aspect of that
+subject. Part of the solution to this is:
+
+=head2 Remove the artificial distinction between operators and functions
+
+History shows us that users, and often porters, aren't clear on the
+operator-function distinction. The present split in reference
+material between perlfunc and perlop hinders user navigation. Given
+that perlfunc is by far the larger of the two, move operator reference
+into perlfunc.
+
+=head2 More tutorials
+
+More documents of a tutorial nature could help. Here are some
+candidates:
+
+=over 4
+
+=item Regular expressions
+
+Robin Berjon (r.berjon@ltconsulting.net) has volunteered.
+
+=item I/O
+
+Mark-Jason Dominus (mjd@plover.com) has an outline for perliotut.
+
+=item pack/unpack
+
+This is badly needed. There has been some discussion on the
+subject on perl5-porters.
+
+=item Debugging
+
+Ronald Kimball (rjk@linguist.dartmouth.edu) has volunteered.
+
+=back
+
+=head2 Include a search tool
+
+perldoc should be able to 'grep' fulltext indices of installed POD
+files. This would let people say:
+
+ perldoc -find printing numbers with commas
+
+and get back the perlfaq entry on 'commify'.
+
+This solution, however, requires documentation to contain the keywords
+the user is searching for. Even when the users know what they're
+looking for, often they can't spell it.
+
+=head2 Include a locate tool
+
+perldoc should be able to help people find the manpages on a
+particular high-level subject:
+
+ perldoc -find web
+
+would tell them manpages, web pages, and books with material on web
+programming. Similarly C<perldoc -find databases>, C<perldoc -find
+references> and so on.
+
+We need something in the vicinity of:
+
+ % perl -help random stuff
+ No documentation for perl function `random stuff' found
+ The following entry in perlfunc.pod matches /random/a:
+ =item rand EXPR
+
+ =item rand
+
+ Returns a random fractional number greater than or equal to C<0> and less
+ than the value of EXPR. (EXPR should be positive.) If EXPR is
+ omitted, the value C<1> is used. Automatically calls C<srand()> unless
+ C<srand()> has already been called. See also C<srand()>.
+
+ (Note: If your rand function consistently returns numbers that are too
+ large or too small, then your version of Perl was probably compiled
+ with the wrong number of RANDBITS.)
+ The following pod pages seem to have /stuff/a:
+ perlfunc.pod (7 hits)
+ perlfaq7.pod (6 hits)
+ perlmod.pod (4 hits)
+ perlsyn.pod (3 hits)
+ perlfaq8.pod (2 hits)
+ perlipc.pod (2 hits)
+ perl5004delta.pod (1 hit)
+ perl5005delta.pod (1 hit)
+ perlcall.pod (1 hit)
+ perldelta.pod (1 hit)
+ perlfaq3.pod (1 hit)
+ perlfaq5.pod (1 hit)
+ perlhist.pod (1 hit)
+ perlref.pod (1 hit)
+ perltoc.pod (1 hit)
+ perltrap.pod (1 hit)
+ Proceed to open perlfunc.pod? [y] n
+ Do you want to speak perl interactively? [y] n
+ Should I dial 911? [y] n
+ Do you need psychiatric help? [y] y
+ <PELIZA> Hi, what bothers you today?
+ A Python programmer in the next cubby is driving me nuts!
+ <PELIZA> Hmm, thats fixable. Just [rest censored]
+
+=head2 Separate function manpages by default
+
+Perl should install 'manpages' for every function/operator into the
+3pl or 3p manual section. By default. The splitman program in the
+Perl source distribution does the work of turning big perlfunc into
+little 3p pages.
+
+=head2 Users can't find the manpages
+
+Make C<perldoc> tell users what they need to add to their .login or
+.cshrc to set their MANPATH correctly.
+
+=head2 Install ALL Documentation
+
+Make the standard documentation kit include the VMS, OS/2, Win32,
+Threads, etc information. installperl and pod/Makefile should know
+enough to copy README.foo to perlfoo.pod before building everything,
+when appropriate.
+
+=head2 Outstanding issues to be documented
+
+Tom has a list of 5.005_5* features or changes that require
+documentation.
+
+Create one document that coherently explains the delta between the
+last camel release and the current release. perldelta was supposed
+to be that, but no longer. The things in perldelta never seemed to
+get placed in the right places in the real manpages, either. This
+needs work.
+
+=head2 Adapt www.linuxhq.com for Perl
+
+This should help glorify documentation and get more people involved in
+perl development.
+
+=head2 Replace man with a perl program
+
+Can we reimplement man in Perl? Tom has a start. I believe some of
+the Linux systems distribute a manalike. Alternatively, build on
+perldoc to remove the unfeatures like "is slow" and "has no apropos".
+
+=head2 Unicode tutorial
+
+We could use more work on helping people understand Perl's new
+Unicode support that Larry has created.
+
+=head1 Modules
+
+=head2 Update the POSIX extension to conform with the POSIX 1003.1 Edition 2
+
+The current state of the POSIX extension is as of Edition 1, 1991,
+whereas the Edition 2 came out in 1996. ISO/IEC 9945:1-1996(E),
+ANSI/IEEE Std 1003.1, 1996 Edition. ISBN 1-55937-573-6. The updates
+were legion: threads, IPC, and real time extensions.
+
+=head2 Module versions
+
+Automate the checking of versions in the standard distribution so
+it's easy for a pumpking to check whether CPAN has a newer version
+that we should be including?
+
+=head2 New modules
+
+Which modules should be added to the standard distribution? This ties
+in with the SDK discussed on the perl-sdk list at perl.org.
+
+=head2 Profiler
+
+Make the profiler (Devel::DProf) part of the standard release, and
+document it well.
+
+=head2 Tie Modules
+
+=over 4
+
+=item VecArray
+
+Implement array using vec(). Nathan Torkington has working code to
+do this.
+
+=item SubstrArray
+
+Implement array using substr()
+
+=item VirtualArray
+
+Implement array using a file
+
+=item ShiftSplice
+
+Defines shift et al in terms of splice method
+
+=back
+
+=head2 Procedural options
+
+Support procedural interfaces for the common cases of Perl's
+gratuitously OOO modules. Tom objects to "use IO::File" reading many
+thousands of lines of code.
+
+=head2 RPC
+
+Write a module for transparent, portable remote procedure calls. (Not
+core). This touches on the CORBA and ILU work.
+
+=head2 y2k localtime/gmtime
+
+Write a module, Y2k::Catch, which overloads localtime and gmtime's
+returned year value and catches "bad" attempts to use it.
+
+=head2 Export File::Find variables
+
+Make File::Find export C<$name> etc manually, at least if asked to.
+
+=head2 Ioctl
+
+Finish a proper Ioctl module.
+
+=head2 Debugger attach/detach
+
+Permit a user to debug an already-running program.
+
+=head2 Regular Expression debugger
+
+Create a visual profiler/debugger tool that stepped you through the
+execution of a regular expression point by point. Ilya has a module
+to color-code and display regular expression parses and executions.
+There's something at http://tkworld.org/ that might be a good start,
+it's a Tk/Tcl RE wizard, that builds regexen of many flavours.
+
+=head2 Alternative RE Syntax
+
+Make an alternative regular expression syntax that is accessed through
+a module. For instance,
+
+ use RE;
+ $re = start_of_line()
+ ->literal("1998/10/08")
+ ->optional( whitespace() )
+ ->literal("[")
+ ->remember( many( or( "-", digit() ) ) );
+
+ if (/$re/) {
+ print "time is $1\n";
+ }
+
+Newbies to regular expressions typically only use a subset of the full
+language. Perhaps you wouldn't have to implement the full feature set.
+
+=head2 Bundled modules
+
+Nicholas Clark (nick@flirble.org) had a patch for storing modules in
+zipped format. This needs exploring and concluding.
+
+=head2 Expect
+
+Adopt IO::Tty, make it as portable as Don Libes' "expect" (can we link
+against expect code?), and perfect a Perl version of expect. IO::Tty
+and expect could then be distributed as part of the core distribution,
+replacing Comm.pl and other hacks.
+
+=head2 GUI::Native
+
+A simple-to-use interface to native graphical abilities would
+be welcomed. Oh, Perl's access Tk is nice enough, and reasonably
+portable, but it's not particularly as fast as one would like.
+Simple access to the mouse's cut buffer or mouse-presses shouldn't
+required loading a few terabytes of Tk code.
+
+=head2 Update semibroken auxiliary tools; h2ph, a2p, etc.
+
+Kurt Starsinic is working on h2ph. mjd has fixed bugs in a2p in the
+past. a2p apparently doesn't work on nawk and gawk extensions.
+Graham Barr has an Include module that does h2ph work at runtime.
+
+=head2 POD Converters
+
+Brad's PodParser code needs to become part of the core, and the Pod::*
+and pod2* programs rewritten to use this standard parser. Currently
+the converters take different options, some behave in different
+fashions, and some are more picky than others in terms of the POD
+files they accept.
+
+=head2 pod2html
+
+A short-term fix: pod2html generates absolute HTML links. Make it
+generate relative links.
+
+=head2 Podchecker
+
+Something like lint for Pod would be good. Something that catches
+common errors as well as gross ones. Brad Appleton is putting
+together something as part of his PodParser work.
+
+=head1 Tom's Wishes
+
+=head2 Webperl
+
+Design a webperl environment that's as tightly integrated and as
+easy-to-use as Perl's current command-line environment.
+
+=head2 Mobile agents
+
+More work on a safe and secure execution environment for mobile
+agents would be neat; the Safe.pm module is a start, but there's a
+still a lot to be done in that area. Adopt Penguin?
+
+=head2 POSIX on non-POSIX
+
+Standard programming constructs for non-POSIX systems would help a
+lot of programmers stuck on primitive, legacy systems. For example,
+Microsoft still hasn't made a usable POSIX interface on their clunky
+systems, which means that standard operations such as alarm() and
+fork(), both critical for sophisticated client-server programming,
+must both be kludged around.
+
+I'm unsure whether Tom means to emulate alarm( )and fork(), or merely
+to provide a document like perlport.pod to say which features are
+portable and which are not.
+
+=head2 Portable installations
+
+Figure out a portable semi-gelled installation, that is, one without
+full paths. Larry has said that he's thinking about this. Ilya
+pointed out that perllib_mangle() is good for this.
+
+=head1 Win32 Stuff
+
+=head2 Rename new headers to be consistent with the rest
+
+=head2 Sort out the spawnvp() mess
+
+=head2 Work out DLL versioning
+
+=head2 Style-check
+
+=head1 Would be nice to have
+
+=over 4
+
+=item C<pack "(stuff)*">
+
+=item Contiguous bitfields in pack/unpack
+
+=item lexperl
+
+=item Bundled perl preprocessor
+
+=item Use posix calls internally where possible
+
+=item format BOTTOM
+
+=item -i rename file only when successfully changed
+
+=item All ARGV input should act like <>
+
+=item report HANDLE [formats].
+
+=item support in perlmain to rerun debugger
+
+=item lvalue functions
+
+Tuomas Lukka, on behalf of the PDL project, greatly desires this and
+Ilya has a patch for it (probably against an older version of Perl).
+Tuomas points out that what PDL really wants is lvalue I<methods>,
+not just subs.
+
+=back
+
+=head1 Possible pragmas
+
+=head2 'less'
+
+(use less memory, CPU)
+
+=head1 Optimizations
+
+=head2 constant function cache
+
+=head2 foreach(reverse...)
+
+=head2 Cache eval tree
+
+Unless lexical outer scope used (mark in &compiling?).
+
+=head2 rcatmaybe
+
+=head2 Shrink opcode tables
+
+Via multiple implementations selected in peep.
+
+=head2 Cache hash value
+
+Not a win, according to Guido.
+
+=head2 Optimize away @_ where possible
+
+=head2 Optimize sort by { $a <=> $b }
+
+Greg Bacon added several more sort optimizations. These have
+made it into 5.005_55, thanks to Hans Mulder.
+
+=head2 Rewrite regexp parser for better integrated optimization
+
+The regexp parser was rewritten for 5.005. Ilya's the regexp guru.
+
+=head1 Vague possibilities
+
+=over 4
+
+=item ref function in list context
+
+This seems impossible to do without substantially breaking code.
+
+=item make tr/// return histogram in list context?
+
+=item Loop control on do{} et al
+
+=item Explicit switch statements
+
+Nobody has yet managed to come up with a switch syntax that would
+allow for mixed hash, constant, regexp checks. Submit implementation
+with syntax, please.
+
+=item compile to real threaded code
+
+=item structured types
+
+=item Modifiable $1 et al
+
+The intent is for this to be a means of editing the matched portions of
+the target string.
+
+=back
+
+=head1 To Do Or Not To Do
+
+These are things that have been discussed in the past and roundly
+criticized for being of questionable value.
+
+=head2 Making my() work on "package" variables
+
+Being able to say my($Foo::Bar), something that sounds ludicrous and
+the 5.6 pumpking has mocked.
+
+=head2 "or" testing defined not truth
+
+We tell people that C<||> can be used to give a default value to a
+variable:
+
+ $children = shift || 5; # default is 5 children
+
+which is almost (but not):
+
+ $children = shift;
+ $children = 5 unless $children;
+
+but if the first argument was given and is "0", then it will be
+considered false by C<||> and C<5> used instead. Really we want
+an C<||>-like operator that behaves like:
+
+ $children = shift;
+ $children = 5 unless defined $children;
+
+Namely, a C<||> that tests defined-ness rather than truth. One was
+discussed, and a patch submitted, but the objections were many. While
+there were objections, many still feel the need. At least it was
+decided that C<??> is the best name for the operator.
+
+=head2 "dynamic" lexicals
+
+ my $x;
+ sub foo {
+ local $x;
+ }
+
+Localizing, as Tim Bunce points out, is a separate concept from
+whether the variable is global or lexical. Chip Salzenberg had
+an implementation once, but Larry thought it had potential to
+confuse.
+
+=head2 "class"-based, rather than package-based "lexicals"
+
+This is like what the Alias module provides, but the variables would
+be lexicals reserved by perl at compile-time, which really are indices
+pointing into the pseudo-hash object visible inside every method so
+declared.
+
+=head1 Threading
+
+=head2 Modules
+
+Which of the standard modules are thread-safe? Which CPAN modules?
+How easy is it to fix those non-safe modules?
+
+=head2 Testing
+
+Threading is still experimental. Every reproducible bug identifies
+something else for us to fix. Find and submit more of these problems.
+
+=head2 $AUTOLOAD
+
+=head2 exit/die
+
+Consistent semantics for exit/die in threads.
+
+=head2 External threads
+
+Better support for externally created threads.
+
+=head2 Thread::Pool
+
+=head2 thread-safety
+
+Spot-check globals like statcache and global GVs for thread-safety.
+"B<Part done>", says Sarathy.
+
+=head2 Per-thread GVs
+
+According to Sarathy, this would make @_ be the same in threaded
+and non-threaded, as well as helping solve problems like filehandles
+(the same filehandle currently cannot be used in two threads).
+
+=head1 Compiler
+
+=head2 Optimization
+
+The compiler's back-end code-generators for creating bytecode or
+compilable C code could use optimization work.
+
+=head2 Byteperl
+
+Figure out how and where byteperl will be built for the various
+platforms.
+
+=head2 Precompiled modules
+
+Save byte-compiled modules on disk.
+
+=head2 Executables
+
+Auto-produce executable.
+
+=head2 Typed lexicals
+
+Typed lexicals should affect B::CC::load_pad.
+
+=head2 Win32
+
+Workarounds to help Win32 dynamic loading.
+
+=head2 END blocks
+
+END blocks need saving in compiled output, now that CHECK blocks
+are available.
+
+=head2 _AUTOLOAD
+
+_AUTOLOAD prodding.
+
+=head2 comppadlist
+
+Fix comppadlist (names in comppad_name can have fake SvCUR
+from where newASSIGNOP steals the field).
+
+=head2 Cached compilation
+
+Can we install modules as bytecode?
+
+=head1 Recently Finished Tasks
+
+=head2 Figure a way out of $^(capital letter)
+
+Figure out a clean way to extend $^(capital letter) beyond
+the 26 alphabets. (${^WORD} maybe?)
+
+Mark-Jason Dominus sent a patch which went into 5.005_56.
+
+=head2 Filenames
+
+Keep filenames in the distribution and in the standard module set
+be 8.3 friendly where feasible. Good luck changing the standard
+modules, though.
+
+=head2 Foreign lines
+
+Perl should be more generous in accepting foreign line terminations.
+Mostly B<done> in 5.005.
+
+=head2 Namespace cleanup
+
+ symbol-space: "pl_" prefix for all global vars
+ "Perl_" prefix for all functions
+
+ CPP-space: stop malloc()/free() pollution unless asked
+
+=head2 ISA.pm
+
+Rename and alter ISA.pm. B<Done>. It is now base.pm.
+
+=head2 gettimeofday
+
+See Time::HiRes.
+
+=head2 autocroak?
+
+This is the Fatal.pm module, so any builtin that that does
+not return success automatically die()s. If you're feeling brave, tie
+this in with the unified exceptions scheme.
+
+=cut
diff --git a/contrib/perl5/pod/perltoot.pod b/contrib/perl5/pod/perltoot.pod
index c77a971..31a7c76 100644
--- a/contrib/perl5/pod/perltoot.pod
+++ b/contrib/perl5/pod/perltoot.pod
@@ -111,8 +111,8 @@ by up-casing the hash keys:
PEERS => [ "Norbert", "Rhys", "Phineas"],
};
-And so you could get at C<$rec-E<gt>{NAME}> to find "Jason", or
-C<@{ $rec-E<gt>{PEERS} }> to get at "Norbert", "Rhys", and "Phineas".
+And so you could get at C<< $rec->{NAME} >> to find "Jason", or
+C<< @{ $rec->{PEERS} } >> to get at "Norbert", "Rhys", and "Phineas".
(Have you ever noticed how many 23-year-old programmers seem to
be named "Jason" these days? :-)
@@ -329,7 +329,7 @@ do more than fetch or set one particular field.
sub exclaim {
my $self = shift;
return sprintf "Hi, I'm %s, age %d, working with %s",
- $self->{NAME}, $self->{AGE}, join(", ", $self->{PEERS});
+ $self->{NAME}, $self->{AGE}, join(", ", @{$self->{PEERS}});
}
Or maybe even one like this:
@@ -542,7 +542,7 @@ and DESTROY methods as follows:
}
What happens if a derived class (which we'll call Employee) inherits
-methods from this Person base class? Then C<Employee-E<gt>debug()>, when called
+methods from this Person base class? Then C<< Employee->debug() >>, when called
as a class method, manipulates $Person::Debugging not $Employee::Debugging.
=head2 Class Destructors
@@ -816,7 +816,7 @@ What do we mean by the Person::new() function -- isn't that actually
a method? Well, in principle, yes. A method is just a function that
expects as its first argument a class name (package) or object
(blessed reference). Person::new() is the function that both the
-C<Person-E<gt>new()> method and the C<Employee-E<gt>new()> method end
+C<< Person->new() >> method and the C<< Employee->new() >> method end
up calling. Understand that while a method call looks a lot like a
function call, they aren't really quite the same, and if you treat them
as the same, you'll very soon be left with nothing but broken programs.
@@ -1124,8 +1124,7 @@ it happens when you say
If you wanted to add version checking to your Person class explained
above, just add this to Person.pm:
- use vars qw($VERSION);
- $VERSION = '1.1';
+ our $VERSION = '1.1';
and then in Employee.pm could you can say
@@ -1363,7 +1362,7 @@ constructor will look like when taking this approach:
package Person;
use Carp;
- use vars qw($AUTOLOAD); # it's a package global
+ our $AUTOLOAD; # it's a package global
my %fields = (
name => undef,
@@ -1433,8 +1432,7 @@ Here's how to be careful:
package Employee;
use Person;
use strict;
- use vars qw(@ISA);
- @ISA = qw(Person);
+ our @ISA = qw(Person);
my %fields = (
id => undef,
@@ -1560,16 +1558,15 @@ Here's the whole implementation:
BEGIN {
use Exporter ();
- use vars qw(@EXPORT @EXPORT_OK %EXPORT_TAGS);
- @EXPORT = qw(gethostbyname gethostbyaddr gethost);
- @EXPORT_OK = qw(
- $h_name @h_aliases
- $h_addrtype $h_length
- @h_addr_list $h_addr
- );
- %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+ our @EXPORT = qw(gethostbyname gethostbyaddr gethost);
+ our @EXPORT_OK = qw(
+ $h_name @h_aliases
+ $h_addrtype $h_length
+ @h_addr_list $h_addr
+ );
+ our %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
}
- use vars @EXPORT_OK;
+ our @EXPORT_OK;
# Class::Struct forbids use of @ISA
sub import { goto &Exporter::import }
@@ -1661,7 +1658,7 @@ update value fields in the hash. Convenient, eh?
}
use Alias qw(attr);
- use vars qw($NAME $AGE $PEERS);
+ our ($NAME, $AGE, $PEERS);
sub name {
my $self = attr shift;
@@ -1692,7 +1689,7 @@ update value fields in the hash. Convenient, eh?
return ++$AGE;
}
-The need for the C<use vars> declaration is because what Alias does
+The need for the C<our> declaration is because what Alias does
is play with package globals with the same name as the fields. To use
globals while C<use strict> is in effect, you have to predeclare them.
These package variables are localized to the block enclosing the attr()
diff --git a/contrib/perl5/pod/perltootc.pod b/contrib/perl5/pod/perltootc.pod
new file mode 100644
index 0000000..64f8233
--- /dev/null
+++ b/contrib/perl5/pod/perltootc.pod
@@ -0,0 +1,1337 @@
+=head1 NAME
+
+perltootc - Tom's OO Tutorial for Class Data in Perl
+
+=head1 DESCRIPTION
+
+When designing an object class, you are sometimes faced with the situation
+of wanting common state shared by all objects of that class.
+Such I<class attributes> act somewhat like global variables for the entire
+class, but unlike program-wide globals, class attributes have meaning only to
+the class itself.
+
+Here are a few examples where class attributes might come in handy:
+
+=over
+
+=item *
+
+to keep a count of the objects you've created, or how many are
+still extant.
+
+=item *
+
+to extract the name or file descriptor for a logfile used by a debugging
+method.
+
+=item *
+
+to access collective data, like the total amount of cash dispensed by
+all ATMs in a network in a given day.
+
+=item *
+
+to access the last object created by a class, or the most accessed object,
+or to retrieve a list of all objects.
+
+=back
+
+Unlike a true global, class attributes should not be accessed directly.
+Instead, their state should be inspected, and perhaps altered, only
+through the mediated access of I<class methods>. These class attributes
+accessor methods are similar in spirit and function to accessors used
+to manipulate the state of instance attributes on an object. They provide a
+clear firewall between interface and implementation.
+
+You should allow access to class attributes through either the class
+name or any object of that class. If we assume that $an_object is of
+type Some_Class, and the &Some_Class::population_count method accesses
+class attributes, then these two invocations should both be possible,
+and almost certainly equivalent.
+
+ Some_Class->population_count()
+ $an_object->population_count()
+
+The question is, where do you store the state which that method accesses?
+Unlike more restrictive languages like C++, where these are called
+static data members, Perl provides no syntactic mechanism to declare
+class attributes, any more than it provides a syntactic mechanism to
+declare instance attributes. Perl provides the developer with a broad
+set of powerful but flexible features that can be uniquely crafted to
+the particular demands of the situation.
+
+A class in Perl is typically implemented in a module. A module consists
+of two complementary feature sets: a package for interfacing with the
+outside world, and a lexical file scope for privacy. Either of these
+two mechanisms can be used to implement class attributes. That means you
+get to decide whether to put your class attributes in package variables
+or to put them in lexical variables.
+
+And those aren't the only decisions to make. If you choose to use package
+variables, you can make your class attribute accessor methods either ignorant
+of inheritance or sensitive to it. If you choose lexical variables,
+you can elect to permit access to them from anywhere in the entire file
+scope, or you can limit direct data access exclusively to the methods
+implementing those attributes.
+
+=head1 Class Data as Package Variables
+
+Because a class in Perl is really just a package, using package variables
+to hold class attributes is the most natural choice. This makes it simple
+for each class to have its own class attributes. Let's say you have a class
+called Some_Class that needs a couple of different attributes that you'd
+like to be global to the entire class. The simplest thing to do is to
+use package variables like $Some_Class::CData1 and $Some_Class::CData2
+to hold these attributes. But we certainly don't want to encourage
+outsiders to touch those data directly, so we provide methods
+to mediate access.
+
+In the accessor methods below, we'll for now just ignore the first
+argument--that part to the left of the arrow on method invocation, which
+is either a class name or an object reference.
+
+ package Some_Class;
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $Some_Class::CData1 = shift if @_;
+ return $Some_Class::CData1;
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $Some_Class::CData2 = shift if @_;
+ return $Some_Class::CData2;
+ }
+
+This technique is highly legible and should be completely straightforward
+to even the novice Perl programmer. By fully qualifying the package
+variables, they stand out clearly when reading the code. Unfortunately,
+if you misspell one of these, you've introduced an error that's hard
+to catch. It's also somewhat disconcerting to see the class name itself
+hard-coded in so many places.
+
+Both these problems can be easily fixed. Just add the C<use strict>
+pragma, then pre-declare your package variables. (The C<our> operator
+will be new in 5.6, and will work for package globals just like C<my>
+works for scoped lexicals.)
+
+ package Some_Class;
+ use strict;
+ our($CData1, $CData2); # our() is new to perl5.6
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $CData1 = shift if @_;
+ return $CData1;
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $CData2 = shift if @_;
+ return $CData2;
+ }
+
+
+As with any other global variable, some programmers prefer to start their
+package variables with capital letters. This helps clarity somewhat, but
+by no longer fully qualifying the package variables, their significance
+can be lost when reading the code. You can fix this easily enough by
+choosing better names than were used here.
+
+=head2 Putting All Your Eggs in One Basket
+
+Just as the mindless enumeration of accessor methods for instance attributes
+grows tedious after the first few (see L<perltoot>), so too does the
+repetition begin to grate when listing out accessor methods for class
+data. Repetition runs counter to the primary virtue of a programmer:
+Laziness, here manifesting as that innate urge every programmer feels
+to factor out duplicate code whenever possible.
+
+Here's what to do. First, make just one hash to hold all class attributes.
+
+ package Some_Class;
+ use strict;
+ our %ClassData = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+Using closures (see L<perlref>) and direct access to the package symbol
+table (see L<perlmod>), now clone an accessor method for each key in
+the %ClassData hash. Each of these methods is used to fetch or store
+values to the specific, named class attribute.
+
+ for my $datum (keys %ClassData) {
+ no strict "refs"; # to register new methods in package
+ *$datum = sub {
+ shift; # XXX: ignore calling class/object
+ $ClassData{$datum} = shift if @_;
+ return $ClassData{$datum};
+ }
+ }
+
+It's true that you could work out a solution employing an &AUTOLOAD
+method, but this approach is unlikely to prove satisfactory. Your
+function would have to distinguish between class attributes and object
+attributes; it could interfere with inheritance; and it would have to
+careful about DESTROY. Such complexity is uncalled for in most cases,
+and certainly in this one.
+
+You may wonder why we're rescinding strict refs for the loop. We're
+manipulating the package's symbol table to introduce new function names
+using symbolic references (indirect naming), which the strict pragma
+would otherwise forbid. Normally, symbolic references are a dodgy
+notion at best. This isn't just because they can be used accidentally
+when you aren't meaning to. It's also because for most uses
+to which beginning Perl programmers attempt to put symbolic references,
+we have much better approaches, like nested hashes or hashes of arrays.
+But there's nothing wrong with using symbolic references to manipulate
+something that is meaningful only from the perspective of the package
+symbol symbol table, like method names or package variables. In other
+words, when you want to refer to the symbol table, use symbol references.
+
+Clustering all the class attributes in one place has several advantages.
+They're easy to spot, initialize, and change. The aggregation also
+makes them convenient to access externally, such as from a debugger
+or a persistence package. The only possible problem is that we don't
+automatically know the name of each class's class object, should it have
+one. This issue is addressed below in L<"The Eponymous Meta-Object">.
+
+=head2 Inheritance Concerns
+
+Suppose you have an instance of a derived class, and you access class
+data using an inherited method call. Should that end up referring
+to the base class's attributes, or to those in the derived class?
+How would it work in the earlier examples? The derived class inherits
+all the base class's methods, including those that access class attributes.
+But what package are the class attributes stored in?
+
+The answer is that, as written, class attributes are stored in the package into
+which those methods were compiled. When you invoke the &CData1 method
+on the name of the derived class or on one of that class's objects, the
+version shown above is still run, so you'll access $Some_Class::CData1--or
+in the method cloning version, C<$Some_Class::ClassData{CData1}>.
+
+Think of these class methods as executing in the context of their base
+class, not in that of their derived class. Sometimes this is exactly
+what you want. If Feline subclasses Carnivore, then the population of
+Carnivores in the world should go up when a new Feline is born.
+But what if you wanted to figure out how many Felines you have apart
+from Carnivores? The current approach doesn't support that.
+
+You'll have to decide on a case-by-case basis whether it makes any sense
+for class attributes to be package-relative. If you want it to be so,
+then stop ignoring the first argument to the function. Either it will
+be a package name if the method was invoked directly on a class name,
+or else it will be an object reference if the method was invoked on an
+object reference. In the latter case, the ref() function provides the
+class of that object.
+
+ package Some_Class;
+ sub CData1 {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $varname = $class . "::CData1";
+ no strict "refs"; # to access package data symbolically
+ $$varname = shift if @_;
+ return $$varname;
+ }
+
+And then do likewise for all other class attributes (such as CData2,
+etc.) that you wish to access as package variables in the invoking package
+instead of the compiling package as we had previously.
+
+Once again we temporarily disable the strict references ban, because
+otherwise we couldn't use the fully-qualified symbolic name for
+the package global. This is perfectly reasonable: since all package
+variables by definition live in a package, there's nothing wrong with
+accessing them via that package's symbol table. That's what it's there
+for (well, somewhat).
+
+What about just using a single hash for everything and then cloning
+methods? What would that look like? The only difference would be the
+closure used to produce new method entries for the class's symbol table.
+
+ no strict "refs";
+ *$datum = sub {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $varname = $class . "::ClassData";
+ $varname->{$datum} = shift if @_;
+ return $varname->{$datum};
+ }
+
+=head2 The Eponymous Meta-Object
+
+It could be argued that the %ClassData hash in the previous example is
+neither the most imaginative nor the most intuitive of names. Is there
+something else that might make more sense, be more useful, or both?
+
+As it happens, yes, there is. For the "class meta-object", we'll use
+a package variable of the same name as the package itself. Within the
+scope of a package Some_Class declaration, we'll use the eponymously
+named hash %Some_Class as that class's meta-object. (Using an eponymously
+named hash is somewhat reminiscent of classes that name their constructors
+eponymously in the Python or C++ fashion. That is, class Some_Class would
+use &Some_Class::Some_Class as a constructor, probably even exporting that
+name as well. The StrNum class in Recipe 13.14 in I<The Perl Cookbook>
+does this, if you're looking for an example.)
+
+This predictable approach has many benefits, including having a well-known
+identifier to aid in debugging, transparent persistence,
+or checkpointing. It's also the obvious name for monadic classes and
+translucent attributes, discussed later.
+
+Here's an example of such a class. Notice how the name of the
+hash storing the meta-object is the same as the name of the package
+used to implement the class.
+
+ package Some_Class;
+ use strict;
+
+ # create class meta-object using that most perfect of names
+ our %Some_Class = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+ # this accessor is calling-package-relative
+ sub CData1 {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ no strict "refs"; # to access eponymous meta-object
+ $class->{CData1} = shift if @_;
+ return $class->{CData1};
+ }
+
+ # but this accessor is not
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ no strict "refs"; # to access eponymous meta-object
+ __PACKAGE__ -> {CData2} = shift if @_;
+ return __PACKAGE__ -> {CData2};
+ }
+
+In the second accessor method, the __PACKAGE__ notation was used for
+two reasons. First, to avoid hardcoding the literal package name
+in the code in case we later want to change that name. Second, to
+clarify to the reader that what matters here is the package currently
+being compiled into, not the package of the invoking object or class.
+If the long sequence of non-alphabetic characters bothers you, you can
+always put the __PACKAGE__ in a variable first.
+
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ no strict "refs"; # to access eponymous meta-object
+ my $class = __PACKAGE__;
+ $class->{CData2} = shift if @_;
+ return $class->{CData2};
+ }
+
+Even though we're using symbolic references for good not evil, some
+folks tend to become unnerved when they see so many places with strict
+ref checking disabled. Given a symbolic reference, you can always
+produce a real reference (the reverse is not true, though). So we'll
+create a subroutine that does this conversion for us. If invoked as a
+function of no arguments, it returns a reference to the compiling class's
+eponymous hash. Invoked as a class method, it returns a reference to
+the eponymous hash of its caller. And when invoked as an object method,
+this function returns a reference to the eponymous hash for whatever
+class the object belongs to.
+
+ package Some_Class;
+ use strict;
+
+ our %Some_Class = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+ # tri-natured: function, class method, or object method
+ sub _classobj {
+ my $obclass = shift || __PACKAGE__;
+ my $class = ref($obclass) || $obclass;
+ no strict "refs"; # to convert sym ref to real one
+ return \%$class;
+ }
+
+ for my $datum (keys %{ _classobj() } ) {
+ # turn off strict refs so that we can
+ # register a method in the symbol table
+ no strict "refs";
+ *$datum = sub {
+ use strict "refs";
+ my $self = shift->_classobj();
+ $self->{$datum} = shift if @_;
+ return $self->{$datum};
+ }
+ }
+
+=head2 Indirect References to Class Data
+
+A reasonably common strategy for handling class attributes is to store
+a reference to each package variable on the object itself. This is
+a strategy you've probably seen before, such as in L<perltoot> and
+L<perlbot>, but there may be variations in the example below that you
+haven't thought of before.
+
+ package Some_Class;
+ our($CData1, $CData2); # our() is new to perl5.6
+
+ sub new {
+ my $obclass = shift;
+ return bless my $self = {
+ ObData1 => "",
+ ObData2 => "",
+ CData1 => \$CData1,
+ CData2 => \$CData2,
+ } => (ref $obclass || $obclass);
+ }
+
+ sub ObData1 {
+ my $self = shift;
+ $self->{ObData1} = shift if @_;
+ return $self->{ObData1};
+ }
+
+ sub ObData2 {
+ my $self = shift;
+ $self->{ObData2} = shift if @_;
+ return $self->{ObData2};
+ }
+
+ sub CData1 {
+ my $self = shift;
+ my $dataref = ref $self
+ ? $self->{CData1}
+ : \$CData1;
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+ sub CData2 {
+ my $self = shift;
+ my $dataref = ref $self
+ ? $self->{CData2}
+ : \$CData2;
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+As written above, a derived class will inherit these methods, which
+will consequently access package variables in the base class's package.
+This is not necessarily expected behavior in all circumstances. Here's an
+example that uses a variable meta-object, taking care to access the
+proper package's data.
+
+ package Some_Class;
+ use strict;
+
+ our %Some_Class = ( # our() is new to perl5.6
+ CData1 => "",
+ CData2 => "",
+ );
+
+ sub _classobj {
+ my $self = shift;
+ my $class = ref($self) || $self;
+ no strict "refs";
+ # get (hard) ref to eponymous meta-object
+ return \%$class;
+ }
+
+ sub new {
+ my $obclass = shift;
+ my $classobj = $obclass->_classobj();
+ bless my $self = {
+ ObData1 => "",
+ ObData2 => "",
+ CData1 => \$classobj->{CData1},
+ CData2 => \$classobj->{CData2},
+ } => (ref $obclass || $obclass);
+ return $self;
+ }
+
+ sub ObData1 {
+ my $self = shift;
+ $self->{ObData1} = shift if @_;
+ return $self->{ObData1};
+ }
+
+ sub ObData2 {
+ my $self = shift;
+ $self->{ObData2} = shift if @_;
+ return $self->{ObData2};
+ }
+
+ sub CData1 {
+ my $self = shift;
+ $self = $self->_classobj() unless ref $self;
+ my $dataref = $self->{CData1};
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+ sub CData2 {
+ my $self = shift;
+ $self = $self->_classobj() unless ref $self;
+ my $dataref = $self->{CData2};
+ $$dataref = shift if @_;
+ return $$dataref;
+ }
+
+Not only are we now strict refs clean, using an eponymous meta-object
+seems to make the code cleaner. Unlike the previous version, this one
+does something interesting in the face of inheritance: it accesses the
+class meta-object in the invoking class instead of the one into which
+the method was initially compiled.
+
+You can easily access data in the class meta-object, making
+it easy to dump the complete class state using an external mechanism such
+as when debugging or implementing a persistent class. This works because
+the class meta-object is a package variable, has a well-known name, and
+clusters all its data together. (Transparent persistence
+is not always feasible, but it's certainly an appealing idea.)
+
+There's still no check that object accessor methods have not been
+invoked on a class name. If strict ref checking is enabled, you'd
+blow up. If not, then you get the eponymous meta-object. What you do
+with--or about--this is up to you. The next two sections demonstrate
+innovative uses for this powerful feature.
+
+=head2 Monadic Classes
+
+Some of the standard modules shipped with Perl provide class interfaces
+without any attribute methods whatsoever. The most commonly used module
+not numbered amongst the pragmata, the Exporter module, is a class with
+neither constructors nor attributes. Its job is simply to provide a
+standard interface for modules wishing to export part of their namespace
+into that of their caller. Modules use the Exporter's &import method by
+setting their inheritance list in their package's @ISA array to mention
+"Exporter". But class Exporter provides no constructor, so you can't
+have several instances of the class. In fact, you can't have any--it
+just doesn't make any sense. All you get is its methods. Its interface
+contains no statefulness, so state data is wholly superfluous.
+
+Another sort of class that pops up from time to time is one that supports
+a unique instance. Such classes are called I<monadic classes>, or less
+formally, I<singletons> or I<highlander classes>.
+
+If a class is monadic, where do you store its state, that is,
+its attributes? How do you make sure that there's never more than
+one instance? While you could merely use a slew of package variables,
+it's a lot cleaner to use the eponymously named hash. Here's a complete
+example of a monadic class:
+
+ package Cosmos;
+ %Cosmos = ();
+
+ # accessor method for "name" attribute
+ sub name {
+ my $self = shift;
+ $self->{name} = shift if @_;
+ return $self->{name};
+ }
+
+ # read-only accessor method for "birthday" attribute
+ sub birthday {
+ my $self = shift;
+ die "can't reset birthday" if @_; # XXX: croak() is better
+ return $self->{birthday};
+ }
+
+ # accessor method for "stars" attribute
+ sub stars {
+ my $self = shift;
+ $self->{stars} = shift if @_;
+ return $self->{stars};
+ }
+
+ # oh my - one of our stars just went out!
+ sub supernova {
+ my $self = shift;
+ my $count = $self->stars();
+ $self->stars($count - 1) if $count > 0;
+ }
+
+ # constructor/initializer method - fix by reboot
+ sub bigbang {
+ my $self = shift;
+ %$self = (
+ name => "the world according to tchrist",
+ birthday => time(),
+ stars => 0,
+ );
+ return $self; # yes, it's probably a class. SURPRISE!
+ }
+
+ # After the class is compiled, but before any use or require
+ # returns, we start off the universe with a bang.
+ __PACKAGE__ -> bigbang();
+
+Hold on, that doesn't look like anything special. Those attribute
+accessors look no different than they would if this were a regular class
+instead of a monadic one. The crux of the matter is there's nothing
+that says that $self must hold a reference to a blessed object. It merely
+has to be something you can invoke methods on. Here the package name
+itself, Cosmos, works as an object. Look at the &supernova method. Is that
+a class method or an object method? The answer is that static analysis
+cannot reveal the answer. Perl doesn't care, and neither should you.
+In the three attribute methods, C<%$self> is really accessing the %Cosmos
+package variable.
+
+If like Stephen Hawking, you posit the existence of multiple, sequential,
+and unrelated universes, then you can invoke the &bigbang method yourself
+at any time to start everything all over again. You might think of
+&bigbang as more of an initializer than a constructor, since the function
+doesn't allocate new memory; it only initializes what's already there.
+But like any other constructor, it does return a scalar value to use
+for later method invocations.
+
+Imagine that some day in the future, you decide that one universe just
+isn't enough. You could write a new class from scratch, but you already
+have an existing class that does what you want--except that it's monadic,
+and you want more than just one cosmos.
+
+That's what code reuse via subclassing is all about. Look how short
+the new code is:
+
+ package Multiverse;
+ use Cosmos;
+ @ISA = qw(Cosmos);
+
+ sub new {
+ my $protoverse = shift;
+ my $class = ref($protoverse) || $protoverse;
+ my $self = {};
+ return bless($self, $class)->bigbang();
+ }
+ 1;
+
+Because we were careful to be good little creators when we designed our
+Cosmos class, we can now reuse it without touching a single line of code
+when it comes time to write our Multiverse class. The same code that
+worked when invoked as a class method continues to work perfectly well
+when invoked against separate instances of a derived class.
+
+The astonishing thing about the Cosmos class above is that the value
+returned by the &bigbang "constructor" is not a reference to a blessed
+object at all. It's just the class's own name. A class name is, for
+virtually all intents and purposes, a perfectly acceptable object.
+It has state, behavior, and identify, the three crucial components
+of an object system. It even manifests inheritance, polymorphism,
+and encapsulation. And what more can you ask of an object?
+
+To understand object orientation in Perl, it's important to recognize the
+unification of what other programming languages might think of as class
+methods and object methods into just plain methods. "Class methods"
+and "object methods" are distinct only in the compartmentalizing mind
+of the Perl programmer, not in the Perl language itself.
+
+Along those same lines, a constructor is nothing special either, which
+is one reason why Perl has no pre-ordained name for them. "Constructor"
+is just an informal term loosely used to describe a method that returns
+a scalar value that you can make further method calls against. So long
+as it's either a class name or an object reference, that's good enough.
+It doesn't even have to be a reference to a brand new object.
+
+You can have as many--or as few--constructors as you want, and you can
+name them whatever you care to. Blindly and obediently using new()
+for each and every constructor you ever write is to speak Perl with
+such a severe C++ accent that you do a disservice to both languages.
+There's no reason to insist that each class have but one constructor,
+or that that constructor be named new(), or that that constructor be
+used solely as a class method and not an object method.
+
+The next section shows how useful it can be to further distance ourselves
+from any formal distinction between class method calls and object method
+calls, both in constructors and in accessor methods.
+
+=head2 Translucent Attributes
+
+A package's eponymous hash can be used for more than just containing
+per-class, global state data. It can also serve as a sort of template
+containing default settings for object attributes. These default
+settings can then be used in constructors for initialization of a
+particular object. The class's eponymous hash can also be used to
+implement I<translucent attributes>. A translucent attribute is one
+that has a class-wide default. Each object can set its own value for the
+attribute, in which case C<< $object->attribute() >> returns that value.
+But if no value has been set, then C<< $object->attribute() >> returns
+the class-wide default.
+
+We'll apply something of a copy-on-write approach to these translucent
+attributes. If you're just fetching values from them, you get
+translucency. But if you store a new value to them, that new value is
+set on the current object. On the other hand, if you use the class as
+an object and store the attribute value directly on the class, then the
+meta-object's value changes, and later fetch operations on objects with
+uninitialized values for those attributes will retrieve the meta-object's
+new values. Objects with their own initialized values, however, won't
+see any change.
+
+Let's look at some concrete examples of using these properties before we
+show how to implement them. Suppose that a class named Some_Class
+had a translucent data attribute called "color". First you set the color
+in the meta-object, then you create three objects using a constructor
+that happens to be named &spawn.
+
+ use Vermin;
+ Vermin->color("vermilion");
+
+ $ob1 = Vermin->spawn(); # so that's where Jedi come from
+ $ob2 = Vermin->spawn();
+ $ob3 = Vermin->spawn();
+
+ print $obj3->color(); # prints "vermilion"
+
+Each of these objects' colors is now "vermilion", because that's the
+meta-object's value that attribute, and these objects do not have
+individual color values set.
+
+Changing the attribute on one object has no effect on other objects
+previously created.
+
+ $ob3->color("chartreuse");
+ print $ob3->color(); # prints "chartreuse"
+ print $ob1->color(); # prints "vermilion", translucently
+
+If you now use $ob3 to spawn off another object, the new object will
+take the color its parent held, which now happens to be "chartreuse".
+That's because the constructor uses the invoking object as its template
+for initializing attributes. When that invoking object is the
+class name, the object used as a template is the eponymous meta-object.
+When the invoking object is a reference to an instantiated object, the
+&spawn constructor uses that existing object as a template.
+
+ $ob4 = $ob3->spawn(); # $ob3 now template, not %Vermin
+ print $ob4->color(); # prints "chartreuse"
+
+Any actual values set on the template object will be copied to the
+new object. But attributes undefined in the template object, being
+translucent, will remain undefined and consequently translucent in the
+new one as well.
+
+Now let's change the color attribute on the entire class:
+
+ Vermin->color("azure");
+ print $ob1->color(); # prints "azure"
+ print $ob2->color(); # prints "azure"
+ print $ob3->color(); # prints "chartreuse"
+ print $ob4->color(); # prints "chartreuse"
+
+That color change took effect only in the first pair of objects, which
+were still translucently accessing the meta-object's values. The second
+pair had per-object initialized colors, and so didn't change.
+
+One important question remains. Changes to the meta-object are reflected
+in translucent attributes in the entire class, but what about
+changes to discrete objects? If you change the color of $ob3, does the
+value of $ob4 see that change? Or vice-versa. If you change the color
+of $ob4, does then the value of $ob3 shift?
+
+ $ob3->color("amethyst");
+ print $ob3->color(); # prints "amethyst"
+ print $ob4->color(); # hmm: "chartreuse" or "amethyst"?
+
+While one could argue that in certain rare cases it should, let's not
+do that. Good taste aside, we want the answer to the question posed in
+the comment above to be "chartreuse", not "amethyst". So we'll treat
+these attributes similar to the way process attributes like environment
+variables, user and group IDs, or the current working directory are
+treated across a fork(). You can change only yourself, but you will see
+those changes reflected in your unspawned children. Changes to one object
+will propagate neither up to the parent nor down to any existing child objects.
+Those objects made later, however, will see the changes.
+
+If you have an object with an actual attribute value, and you want to
+make that object's attribute value translucent again, what do you do?
+Let's design the class so that when you invoke an accessor method with
+C<undef> as its argument, that attribute returns to translucency.
+
+ $ob4->color(undef); # back to "azure"
+
+Here's a complete implementation of Vermin as described above.
+
+ package Vermin;
+
+ # here's the class meta-object, eponymously named.
+ # it holds all class attributes, and also all instance attributes
+ # so the latter can be used for both initialization
+ # and translucency.
+
+ our %Vermin = ( # our() is new to perl5.6
+ PopCount => 0, # capital for class attributes
+ color => "beige", # small for instance attributes
+ );
+
+ # constructor method
+ # invoked as class method or object method
+ sub spawn {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $self = {};
+ bless($self, $class);
+ $class->{PopCount}++;
+ # init fields from invoking object, or omit if
+ # invoking object is the class to provide translucency
+ %$self = %$obclass if ref $obclass;
+ return $self;
+ }
+
+ # translucent accessor for "color" attribute
+ # invoked as class method or object method
+ sub color {
+ my $self = shift;
+ my $class = ref($self) || $self;
+
+ # handle class invocation
+ unless (ref $self) {
+ $class->{color} = shift if @_;
+ return $class->{color}
+ }
+
+ # handle object invocation
+ $self->{color} = shift if @_;
+ if (defined $self->{color}) { # not exists!
+ return $self->{color};
+ } else {
+ return $class->{color};
+ }
+ }
+
+ # accessor for "PopCount" class attribute
+ # invoked as class method or object method
+ # but uses object solely to locate meta-object
+ sub population {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ return $class->{PopCount};
+ }
+
+ # instance destructor
+ # invoked only as object method
+ sub DESTROY {
+ my $self = shift;
+ my $class = ref $self;
+ $class->{PopCount}--;
+ }
+
+Here are a couple of helper methods that might be convenient. They aren't
+accessor methods at all. They're used to detect accessibility of data
+attributes. The &is_translucent method determines whether a particular
+object attribute is coming from the meta-object. The &has_attribute
+method detects whether a class implements a particular property at all.
+It could also be used to distinguish undefined properties from non-existent
+ones.
+
+ # detect whether an object attribute is translucent
+ # (typically?) invoked only as object method
+ sub is_translucent {
+ my($self, $attr) = @_;
+ return !defined $self->{$attr};
+ }
+
+ # test for presence of attribute in class
+ # invoked as class method or object method
+ sub has_attribute {
+ my($self, $attr) = @_;
+ my $class = ref $self if $self;
+ return exists $class->{$attr};
+ }
+
+If you prefer to install your accessors more generically, you can make
+use of the upper-case versus lower-case convention to register into the
+package appropriate methods cloned from generic closures.
+
+ for my $datum (keys %{ +__PACKAGE__ }) {
+ *$datum = ($datum =~ /^[A-Z]/)
+ ? sub { # install class accessor
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ return $class->{$datum};
+ }
+ : sub { # install translucent accessor
+ my $self = shift;
+ my $class = ref($self) || $self;
+ unless (ref $self) {
+ $class->{$datum} = shift if @_;
+ return $class->{$datum}
+ }
+ $self->{$datum} = shift if @_;
+ return defined $self->{$datum}
+ ? $self -> {$datum}
+ : $class -> {$datum}
+ }
+ }
+
+Translations of this closure-based approach into C++, Java, and Python
+have been left as exercises for the reader. Be sure to send us mail as
+soon as you're done.
+
+=head1 Class Data as Lexical Variables
+
+=head2 Privacy and Responsibility
+
+Unlike conventions used by some Perl programmers, in the previous
+examples, we didn't prefix the package variables used for class attributes
+with an underscore, nor did we do so for the names of the hash keys used
+for instance attributes. You don't need little markers on data names to
+suggest nominal privacy on attribute variables or hash keys, because these
+are B<already> notionally private! Outsiders have no business whatsoever
+playing with anything within a class save through the mediated access of
+its documented interface; in other words, through method invocations.
+And not even through just any method, either. Methods that begin with
+an underscore are traditionally considered off-limits outside the class.
+If outsiders skip the documented method interface to poke around the
+internals of your class and end up breaking something, that's not your
+fault--it's theirs.
+
+Perl believes in individual responsibility rather than mandated control.
+Perl respects you enough to let you choose your own preferred level of
+pain, or of pleasure. Perl believes that you are creative, intelligent,
+and capable of making your own decisions--and fully expects you to
+take complete responsibility for your own actions. In a perfect world,
+these admonitions alone would suffice, and everyone would be intelligent,
+responsible, happy, and creative. And careful. One probably shouldn't
+forget careful, and that's a good bit harder to expect. Even Einstein
+would take wrong turns by accident and end up lost in the wrong part
+of town.
+
+Some folks get the heebie-jeebies when they see package variables
+hanging out there for anyone to reach over and alter them. Some folks
+live in constant fear that someone somewhere might do something wicked.
+The solution to that problem is simply to fire the wicked, of course.
+But unfortunately, it's not as simple as all that. These cautious
+types are also afraid that they or others will do something not so
+much wicked as careless, whether by accident or out of desperation.
+If we fire everyone who ever gets careless, pretty soon there won't be
+anybody left to get any work done.
+
+Whether it's needless paranoia or sensible caution, this uneasiness can
+be a problem for some people. We can take the edge off their discomfort
+by providing the option of storing class attributes as lexical variables
+instead of as package variables. The my() operator is the source of
+all privacy in Perl, and it is a powerful form of privacy indeed.
+
+It is widely perceived, and indeed has often been written, that Perl
+provides no data hiding, that it affords the class designer no privacy
+nor isolation, merely a rag-tag assortment of weak and unenforcible
+social conventions instead. This perception is demonstrably false and
+easily disproven. In the next section, we show how to implement forms
+of privacy that are far stronger than those provided in nearly any
+other object-oriented language.
+
+=head2 File-Scoped Lexicals
+
+A lexical variable is visible only through the end of its static scope.
+That means that the only code able to access that variable is code
+residing textually below the my() operator through the end of its block
+if it has one, or through the end of the current file if it doesn't.
+
+Starting again with our simplest example given at the start of this
+document, we replace our() variables with my() versions.
+
+ package Some_Class;
+ my($CData1, $CData2); # file scope, not in any package
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $CData1 = shift if @_;
+ return $CData1;
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $CData2 = shift if @_;
+ return $CData2;
+ }
+
+So much for that old $Some_Class::CData1 package variable and its brethren!
+Those are gone now, replaced with lexicals. No one outside the
+scope can reach in and alter the class state without resorting to the
+documented interface. Not even subclasses or superclasses of
+this one have unmediated access to $CData1. They have to invoke the &CData1
+method against Some_Class or an instance thereof, just like anybody else.
+
+To be scrupulously honest, that last statement assumes you haven't packed
+several classes together into the same file scope, nor strewn your class
+implementation across several different files. Accessibility of those
+variables is based uniquely on the static file scope. It has nothing to
+do with the package. That means that code in a different file but
+the same package (class) could not access those variables, yet code in the
+same file but a different package (class) could. There are sound reasons
+why we usually suggest a one-to-one mapping between files and packages
+and modules and classes. You don't have to stick to this suggestion if
+you really know what you're doing, but you're apt to confuse yourself
+otherwise, especially at first.
+
+If you'd like to aggregate your class attributes into one lexically scoped,
+composite structure, you're perfectly free to do so.
+
+ package Some_Class;
+ my %ClassData = (
+ CData1 => "",
+ CData2 => "",
+ );
+ sub CData1 {
+ shift; # XXX: ignore calling class/object
+ $ClassData{CData1} = shift if @_;
+ return $ClassData{CData1};
+ }
+ sub CData2 {
+ shift; # XXX: ignore calling class/object
+ $ClassData{CData2} = shift if @_;
+ return $ClassData{CData2};
+ }
+
+To make this more scalable as other class attributes are added, we can
+again register closures into the package symbol table to create accessor
+methods for them.
+
+ package Some_Class;
+ my %ClassData = (
+ CData1 => "",
+ CData2 => "",
+ );
+ for my $datum (keys %ClassData) {
+ no strict "refs";
+ *$datum = sub {
+ shift; # XXX: ignore calling class/object
+ $ClassData{$datum} = shift if @_;
+ return $ClassData{$datum};
+ };
+ }
+
+Requiring even your own class to use accessor methods like anybody else is
+probably a good thing. But demanding and expecting that everyone else,
+be they subclass or superclass, friend or foe, will all come to your
+object through mediation is more than just a good idea. It's absolutely
+critical to the model. Let there be in your mind no such thing as
+"public" data, nor even "protected" data, which is a seductive but
+ultimately destructive notion. Both will come back to bite at you.
+That's because as soon as you take that first step out of the solid
+position in which all state is considered completely private, save from the
+perspective of its own accessor methods, you have violated the envelope.
+And, having pierced that encapsulating envelope, you shall doubtless
+someday pay the price when future changes in the implementation break
+unrelated code. Considering that avoiding this infelicitous outcome was
+precisely why you consented to suffer the slings and arrows of obsequious
+abstraction by turning to object orientation in the first place, such
+breakage seems unfortunate in the extreme.
+
+=head2 More Inheritance Concerns
+
+Suppose that Some_Class were used as a base class from which to derive
+Another_Class. If you invoke a &CData method on the derived class or
+on an object of that class, what do you get? Would the derived class
+have its own state, or would it piggyback on its base class's versions
+of the class attributes?
+
+The answer is that under the scheme outlined above, the derived class
+would B<not> have its own state data. As before, whether you consider
+this a good thing or a bad one depends on the semantics of the classes
+involved.
+
+The cleanest, sanest, simplest way to address per-class state in a
+lexical is for the derived class to override its base class's version
+of the method that accesses the class attributes. Since the actual method
+called is the one in the object's derived class if this exists, you
+automatically get per-class state this way. Any urge to provide an
+unadvertised method to sneak out a reference to the %ClassData hash
+should be strenuously resisted.
+
+As with any other overridden method, the implementation in the
+derived class always has the option of invoking its base class's
+version of the method in addition to its own. Here's an example:
+
+ package Another_Class;
+ @ISA = qw(Some_Class);
+
+ my %ClassData = (
+ CData1 => "",
+ );
+
+ sub CData1 {
+ my($self, $newvalue) = @_;
+ if (@_ > 1) {
+ # set locally first
+ $ClassData{CData1} = $newvalue;
+
+ # then pass the buck up to the first
+ # overridden version, if there is one
+ if ($self->can("SUPER::CData1")) {
+ $self->SUPER::CData1($newvalue);
+ }
+ }
+ return $ClassData{CData1};
+ }
+
+Those dabbling in multiple inheritance might be concerned
+about there being more than one override.
+
+ for my $parent (@ISA) {
+ my $methname = $parent . "::CData1";
+ if ($self->can($methname)) {
+ $self->$methname($newvalue);
+ }
+ }
+
+Because the &UNIVERSAL::can method returns a reference
+to the function directly, you can use this directly
+for a significant performance improvement:
+
+ for my $parent (@ISA) {
+ if (my $coderef = $self->can($parent . "::CData1")) {
+ $self->$coderef($newvalue);
+ }
+ }
+
+=head2 Locking the Door and Throwing Away the Key
+
+As currently implemented, any code within the same scope as the
+file-scoped lexical %ClassData can alter that hash directly. Is that
+ok? Is it acceptable or even desirable to allow other parts of the
+implementation of this class to access class attributes directly?
+
+That depends on how careful you want to be. Think back to the Cosmos
+class. If the &supernova method had directly altered $Cosmos::Stars or
+C<$Cosmos::Cosmos{stars}>, then we wouldn't have been able to reuse the
+class when it came to inventing a Multiverse. So letting even the class
+itself access its own class attributes without the mediating intervention of
+properly designed accessor methods is probably not a good idea after all.
+
+Restricting access to class attributes from the class itself is usually
+not enforcible even in strongly object-oriented languages. But in Perl,
+you can.
+
+Here's one way:
+
+ package Some_Class;
+
+ { # scope for hiding $CData1
+ my $CData1;
+ sub CData1 {
+ shift; # XXX: unused
+ $CData1 = shift if @_;
+ return $CData1;
+ }
+ }
+
+ { # scope for hiding $CData2
+ my $CData2;
+ sub CData2 {
+ shift; # XXX: unused
+ $CData2 = shift if @_;
+ return $CData2;
+ }
+ }
+
+No one--absolutely no one--is allowed to read or write the class
+attributes without the mediation of the managing accessor method, since
+only that method has access to the lexical variable it's managing.
+This use of mediated access to class attributes is a form of privacy far
+stronger than most OO languages provide.
+
+The repetition of code used to create per-datum accessor methods chafes
+at our Laziness, so we'll again use closures to create similar
+methods.
+
+ package Some_Class;
+
+ { # scope for ultra-private meta-object for class attributes
+ my %ClassData = (
+ CData1 => "",
+ CData2 => "",
+ );
+
+ for my $datum (keys %ClassData ) {
+ no strict "refs";
+ *$datum = sub {
+ use strict "refs";
+ my ($self, $newvalue) = @_;
+ $ClassData{$datum} = $newvalue if @_ > 1;
+ return $ClassData{$datum};
+ }
+ }
+
+ }
+
+The closure above can be modified to take inheritance into account using
+the &UNIVERSAL::can method and SUPER as shown previously.
+
+=head2 Translucency Revisited
+
+The Vermin class demonstrates translucency using a package variable,
+eponymously named %Vermin, as its meta-object. If you prefer to
+use absolutely no package variables beyond those necessary to appease
+inheritance or possibly the Exporter, this strategy is closed to you.
+That's too bad, because translucent attributes are an appealing
+technique, so it would be valuable to devise an implementation using
+only lexicals.
+
+There's a second reason why you might wish to avoid the eponymous
+package hash. If you use class names with double-colons in them, you
+would end up poking around somewhere you might not have meant to poke.
+
+ package Vermin;
+ $class = "Vermin";
+ $class->{PopCount}++;
+ # accesses $Vermin::Vermin{PopCount}
+
+ package Vermin::Noxious;
+ $class = "Vermin::Noxious";
+ $class->{PopCount}++;
+ # accesses $Vermin::Noxious{PopCount}
+
+In the first case, because the class name had no double-colons, we got
+the hash in the current package. But in the second case, instead of
+getting some hash in the current package, we got the hash %Noxious in
+the Vermin package. (The noxious vermin just invaded another package and
+sprayed their data around it. :-) Perl doesn't support relative packages
+in its naming conventions, so any double-colons trigger a fully-qualified
+lookup instead of just looking in the current package.
+
+In practice, it is unlikely that the Vermin class had an existing
+package variable named %Noxious that you just blew away. If you're
+still mistrustful, you could always stake out your own territory
+where you know the rules, such as using Eponymous::Vermin::Noxious or
+Hieronymus::Vermin::Boschious or Leave_Me_Alone::Vermin::Noxious as class
+names instead. Sure, it's in theory possible that someone else has
+a class named Eponymous::Vermin with its own %Noxious hash, but this
+kind of thing is always true. There's no arbiter of package names.
+It's always the case that globals like @Cwd::ISA would collide if more
+than one class uses the same Cwd package.
+
+If this still leaves you with an uncomfortable twinge of paranoia,
+we have another solution for you. There's nothing that says that you
+have to have a package variable to hold a class meta-object, either for
+monadic classes or for translucent attributes. Just code up the methods
+so that they access a lexical instead.
+
+Here's another implementation of the Vermin class with semantics identical
+to those given previously, but this time using no package variables.
+
+ package Vermin;
+
+
+ # Here's the class meta-object, eponymously named.
+ # It holds all class data, and also all instance data
+ # so the latter can be used for both initialization
+ # and translucency. it's a template.
+ my %ClassData = (
+ PopCount => 0, # capital for class attributes
+ color => "beige", # small for instance attributes
+ );
+
+ # constructor method
+ # invoked as class method or object method
+ sub spawn {
+ my $obclass = shift;
+ my $class = ref($obclass) || $obclass;
+ my $self = {};
+ bless($self, $class);
+ $ClassData{PopCount}++;
+ # init fields from invoking object, or omit if
+ # invoking object is the class to provide translucency
+ %$self = %$obclass if ref $obclass;
+ return $self;
+ }
+
+ # translucent accessor for "color" attribute
+ # invoked as class method or object method
+ sub color {
+ my $self = shift;
+
+ # handle class invocation
+ unless (ref $self) {
+ $ClassData{color} = shift if @_;
+ return $ClassData{color}
+ }
+
+ # handle object invocation
+ $self->{color} = shift if @_;
+ if (defined $self->{color}) { # not exists!
+ return $self->{color};
+ } else {
+ return $ClassData{color};
+ }
+ }
+
+ # class attribute accessor for "PopCount" attribute
+ # invoked as class method or object method
+ sub population {
+ return $ClassData{PopCount};
+ }
+
+ # instance destructor; invoked only as object method
+ sub DESTROY {
+ $ClassData{PopCount}--;
+ }
+
+ # detect whether an object attribute is translucent
+ # (typically?) invoked only as object method
+ sub is_translucent {
+ my($self, $attr) = @_;
+ $self = \%ClassData if !ref $self;
+ return !defined $self->{$attr};
+ }
+
+ # test for presence of attribute in class
+ # invoked as class method or object method
+ sub has_attribute {
+ my($self, $attr) = @_;
+ return exists $ClassData{$attr};
+ }
+
+=head1 NOTES
+
+Inheritance is a powerful but subtle device, best used only after careful
+forethought and design. Aggregation instead of inheritance is often a
+better approach.
+
+We use the hypothetical our() syntax for package variables. It works
+like C<use vars>, but looks like my(). It should be in this summer's
+major release (5.6) of perl--we hope.
+
+You can't use file-scoped lexicals in conjunction with the SelfLoader
+or the AutoLoader, because they alter the lexical scope in which the
+module's methods wind up getting compiled.
+
+The usual mealy-mouthed package-mungeing doubtless applies to setting
+up names of object attributes. For example, C<< $self->{ObData1} >>
+should probably be C<< $self->{ __PACKAGE__ . "_ObData1" } >>, but that
+would just confuse the examples.
+
+=head1 SEE ALSO
+
+L<perltoot>, L<perlobj>, L<perlmod>, and L<perlbot>.
+
+The Tie::SecureHash module from CPAN is worth checking out.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1999 Tom Christiansen.
+All rights reserved.
+
+When included as part of the Standard Version of Perl, or as part of
+its complete documentation whether printed or otherwise, this work
+may be distributed only under the terms of Perl's Artistic License.
+Any distribution of this file or derivatives thereof I<outside>
+of that package require that special arrangements be made with
+copyright holder.
+
+Irrespective of its distribution, all code examples in this file
+are hereby placed into the public domain. You are permitted and
+encouraged to use this code in your own programs for fun
+or for profit as you see fit. A simple comment in the code giving
+credit would be courteous but is not required.
+
+=head1 ACKNOWLEDGEMENTS
+
+Russ Albery, Jon Orwant, Randy Ray, Larry Rosler, Nat Torkington,
+and Stephen Warren all contributed suggestions and corrections to this
+piece. Thanks especially to Damian Conway for his ideas and feedback,
+and without whose indirect prodding I might never have taken the time
+to show others how much Perl has to offer in the way of objects once
+you start thinking outside the tiny little box that today's "popular"
+object-oriented languages enforce.
+
+=head1 HISTORY
+
+Last edit: Fri May 21 15:47:56 MDT 1999
diff --git a/contrib/perl5/pod/perltrap.pod b/contrib/perl5/pod/perltrap.pod
index 852d8e9..261a20f 100644
--- a/contrib/perl5/pod/perltrap.pod
+++ b/contrib/perl5/pod/perltrap.pod
@@ -22,7 +22,7 @@ The English module, loaded via
use English;
allows you to refer to special variables (like C<$/>) with names (like
-C<$RS>), as though they were in B<awk>; see L<perlvar> for details.
+$RS), as though they were in B<awk>; see L<perlvar> for details.
=item *
@@ -69,7 +69,7 @@ executed.) See L<perlvar>.
=item *
-$E<lt>I<digit>E<gt> does not refer to fields--it refers to substrings matched
+$<I<digit>> does not refer to fields--it refers to substrings matched
by the last match pattern.
=item *
@@ -103,7 +103,7 @@ basically incompatible with C.)
The concatenation operator is ".", not the null string. (Using the
null string would render C</pat/ /pat/> unparsable, because the third slash
would be interpreted as a division operator--the tokenizer is in fact
-slightly context sensitive for operators like "/", "?", and "E<gt>".
+slightly context sensitive for operators like "/", "?", and ">".
And in fact, "." itself can be the beginning of a number.)
=item *
@@ -160,7 +160,7 @@ You must use C<elsif> rather than C<else if>.
The C<break> and C<continue> keywords from C become in
Perl C<last> and C<next>, respectively.
-Unlike in C, these do I<NOT> work within a C<do { } while> construct.
+Unlike in C, these do I<not> work within a C<do { } while> construct.
=item *
@@ -295,7 +295,7 @@ you might expect to do not.
=item *
-The E<lt>FHE<gt> construct is not the name of the filehandle, it is a readline
+The <FH> construct is not the name of the filehandle, it is a readline
operation on that handle. The data read is assigned to $_ only if the
file read is the sole condition in a while loop:
@@ -305,7 +305,7 @@ file read is the sole condition in a while loop:
=item *
-Remember not to use "C<=>" when you need "C<=~>";
+Remember not to use C<=> when you need C<=~>;
these two constructs are quite different:
$x = /foo/;
@@ -393,7 +393,8 @@ Everything else.
If you find an example of a conversion trap that is not listed here,
please submit it to Bill Middleton <F<wjm@best.com>> for inclusion.
-Also note that at least some of these can be caught with B<-w>.
+Also note that at least some of these can be caught with the
+C<use warnings> pragma or the B<-w> switch.
=head2 Discontinuance, Deprecation, and BugFix traps
@@ -424,7 +425,7 @@ behave differently in perl4 vs. perl5, because the packages don't exist.
$a=1;$b=2;$c=3;$var=4;
print "$a::$b::$c ";
print "$var::abc::xyz\n";
-
+
# perl4 prints: 1::2::3 4::abc::xyz
# perl5 prints: 3
@@ -585,24 +586,6 @@ number of elements in the resulting list.
# perl4 prints: second new
# perl5 prints: 3
-=item * Discontinuance
-
-In Perl 4 (and versions of Perl 5 before 5.004), C<'\r'> characters in
-Perl code were silently allowed, although they could cause (mysterious!)
-failures in certain constructs, particularly here documents. Now,
-C<'\r'> characters cause an immediate fatal error. (Note: In this
-example, the notation B<\015> represents the incorrect line
-ending. Depending upon your text viewer, it will look different.)
-
- print "foo";\015
- print "bar";
-
- # perl4 prints: foobar
- # perl5.003 prints: foobar
- # perl5.004 dies: Illegal character \015 (carriage return)
-
-See L<perldiag> for full details.
-
=item * Deprecation
Some error messages will be different.
@@ -715,6 +698,30 @@ Logical tests now return an null, instead of 0
Also see L<"General Regular Expression Traps using s///, etc.">
for another example of this new feature...
+=item * Bitwise string ops
+
+When bitwise operators which can operate upon either numbers or
+strings (C<& | ^ ~>) are given only strings as arguments, perl4 would
+treat the operands as bitstrings so long as the program contained a call
+to the C<vec()> function. perl5 treats the string operands as bitstrings.
+(See L<perlop/Bitwise String Operators> for more details.)
+
+ $fred = "10";
+ $barney = "12";
+ $betty = $fred & $barney;
+ print "$betty\n";
+ # Uncomment the next line to change perl4's behavior
+ # ($dummy) = vec("dummy", 0, 0);
+
+ # Perl4 prints:
+ 8
+
+ # Perl5 prints:
+ 10
+
+ # If vec() is used anywhere in the program, both print:
+ 10
+
=back
=head2 General data type traps
@@ -761,6 +768,9 @@ Hashes get defined before use
# perl4 prints:
# perl5 dies: hash %h defined
+Perl will now generate a warning when it sees defined(@a) and
+defined(%h).
+
=item * (Globs)
glob assignment from variable to variable will fail if the assigned
@@ -1056,7 +1066,7 @@ All types of RE traps.
=item * Regular Expression
C<s'$lhs'$rhs'> now does no interpolation on either side. It used to
-interpolate C<$lhs> but not C<$rhs>. (And still does not match a literal
+interpolate $lhs but not $rhs. (And still does not match a literal
'$' in string)
$a=1;$b=2;
@@ -1095,7 +1105,7 @@ the very first time in any such closure. For instance, if you say
}
build_match() will always return a sub which matches the contents of
-C<$left> and C<$right> as they were the I<first> time that build_match()
+$left and $right as they were the I<first> time that build_match()
was called, not as they are in the current call.
This is probably a bug, and may change in future versions of Perl.
@@ -1257,7 +1267,7 @@ Since version 5.002, Perl uses sigaction() under SysV.
=item * (SysV)
-Under SysV OSes, C<seek()> on a file opened to append C<E<gt>E<gt>> now does
+Under SysV OSes, C<seek()> on a file opened to append C<<< >> >>> now does
the right thing w.r.t. the fopen() manpage. e.g., - When a file is opened
for append, it is impossible to overwrite information already in
the file.
@@ -1327,7 +1337,7 @@ Note that you can C<use strict;> to ward off such trappiness under perl5.
=item * Interpolation
The construct "this is $$x" used to interpolate the pid at that
-point, but now apparently tries to dereference C<$x>. C<$$> by itself still
+point, but now apparently tries to dereference $x. C<$$> by itself still
works fine, however.
print "this is $$x\n";
diff --git a/contrib/perl5/pod/perlunicode.pod b/contrib/perl5/pod/perlunicode.pod
new file mode 100644
index 0000000..5333ac4
--- /dev/null
+++ b/contrib/perl5/pod/perlunicode.pod
@@ -0,0 +1,244 @@
+=head1 NAME
+
+perlunicode - Unicode support in Perl
+
+=head1 DESCRIPTION
+
+=head2 Important Caveat
+
+WARNING: The implementation of Unicode support in Perl is incomplete.
+
+The following areas need further work.
+
+=over
+
+=item Input and Output Disciplines
+
+There is currently no easy way to mark data read from a file or other
+external source as being utf8. This will be one of the major areas of
+focus in the near future.
+
+=item Regular Expressions
+
+The existing regular expression compiler does not produce polymorphic
+opcodes. This means that the determination on whether to match Unicode
+characters is made when the pattern is compiled, based on whether the
+pattern contains Unicode characters, and not when the matching happens
+at run time. This needs to be changed to adaptively match Unicode if
+the string to be matched is Unicode.
+
+=item C<use utf8> still needed to enable a few features
+
+The C<utf8> pragma implements the tables used for Unicode support. These
+tables are automatically loaded on demand, so the C<utf8> pragma need not
+normally be used.
+
+However, as a compatibility measure, this pragma must be explicitly used
+to enable recognition of UTF-8 encoded literals and identifiers in the
+source text.
+
+=back
+
+=head2 Byte and Character semantics
+
+Beginning with version 5.6, Perl uses logically wide characters to
+represent strings internally. This internal representation of strings
+uses the UTF-8 encoding.
+
+In future, Perl-level operations can be expected to work with characters
+rather than bytes, in general.
+
+However, as strictly an interim compatibility measure, Perl v5.6 aims to
+provide a safe migration path from byte semantics to character semantics
+for programs. For operations where Perl can unambiguously decide that the
+input data is characters, Perl now switches to character semantics.
+For operations where this determination cannot be made without additional
+information from the user, Perl decides in favor of compatibility, and
+chooses to use byte semantics.
+
+This behavior preserves compatibility with earlier versions of Perl,
+which allowed byte semantics in Perl operations, but only as long as
+none of the program's inputs are marked as being as source of Unicode
+character data. Such data may come from filehandles, from calls to
+external programs, from information provided by the system (such as %ENV),
+or from literals and constants in the source text.
+
+If the C<-C> command line switch is used, (or the ${^WIDE_SYSTEM_CALLS}
+global flag is set to C<1>), all system calls will use the
+corresponding wide character APIs. This is currently only implemented
+on Windows.
+
+Regardless of the above, the C<bytes> pragma can always be used to force
+byte semantics in a particular lexical scope. See L<bytes>.
+
+The C<utf8> pragma is primarily a compatibility device that enables
+recognition of UTF-8 in literals encountered by the parser. It may also
+be used for enabling some of the more experimental Unicode support features.
+Note that this pragma is only required until a future version of Perl
+in which character semantics will become the default. This pragma may
+then become a no-op. See L<utf8>.
+
+Unless mentioned otherwise, Perl operators will use character semantics
+when they are dealing with Unicode data, and byte semantics otherwise.
+Thus, character semantics for these operations apply transparently; if
+the input data came from a Unicode source (for example, by adding a
+character encoding discipline to the filehandle whence it came, or a
+literal UTF-8 string constant in the program), character semantics
+apply; otherwise, byte semantics are in effect. To force byte semantics
+on Unicode data, the C<bytes> pragma should be used.
+
+Under character semantics, many operations that formerly operated on
+bytes change to operating on characters. For ASCII data this makes
+no difference, because UTF-8 stores ASCII in single bytes, but for
+any character greater than C<chr(127)>, the character may be stored in
+a sequence of two or more bytes, all of which have the high bit set.
+But by and large, the user need not worry about this, because Perl
+hides it from the user. A character in Perl is logically just a number
+ranging from 0 to 2**32 or so. Larger characters encode to longer
+sequences of bytes internally, but again, this is just an internal
+detail which is hidden at the Perl level.
+
+=head2 Effects of character semantics
+
+Character semantics have the following effects:
+
+=over 4
+
+=item *
+
+Strings and patterns may contain characters that have an ordinal value
+larger than 255.
+
+Presuming you use a Unicode editor to edit your program, such characters
+will typically occur directly within the literal strings as UTF-8
+characters, but you can also specify a particular character with an
+extension of the C<\x> notation. UTF-8 characters are specified by
+putting the hexadecimal code within curlies after the C<\x>. For instance,
+a Unicode smiley face is C<\x{263A}>. A character in the Latin-1 range
+(128..255) should be written C<\x{ab}> rather than C<\xab>, since the
+former will turn into a two-byte UTF-8 code, while the latter will
+continue to be interpreted as generating a 8-bit byte rather than a
+character. In fact, if the C<use warnings> pragma of the C<-w> switch
+is turned on, it will produce a warning
+that you might be generating invalid UTF-8.
+
+=item *
+
+Identifiers within the Perl script may contain Unicode alphanumeric
+characters, including ideographs. (You are currently on your own when
+it comes to using the canonical forms of characters--Perl doesn't (yet)
+attempt to canonicalize variable names for you.)
+
+=item *
+
+Regular expressions match characters instead of bytes. For instance,
+"." matches a character instead of a byte. (However, the C<\C> pattern
+is provided to force a match a single byte ("C<char>" in C, hence
+C<\C>).)
+
+=item *
+
+Character classes in regular expressions match characters instead of
+bytes, and match against the character properties specified in the
+Unicode properties database. So C<\w> can be used to match an ideograph,
+for instance.
+
+=item *
+
+Named Unicode properties and block ranges make be used as character
+classes via the new C<\p{}> (matches property) and C<\P{}> (doesn't
+match property) constructs. For instance, C<\p{Lu}> matches any
+character with the Unicode uppercase property, while C<\p{M}> matches
+any mark character. Single letter properties may omit the brackets, so
+that can be written C<\pM> also. Many predefined character classes are
+available, such as C<\p{IsMirrored}> and C<\p{InTibetan}>.
+
+=item *
+
+The special pattern C<\X> match matches any extended Unicode sequence
+(a "combining character sequence" in Standardese), where the first
+character is a base character and subsequent characters are mark
+characters that apply to the base character. It is equivalent to
+C<(?:\PM\pM*)>.
+
+=item *
+
+The C<tr///> operator translates characters instead of bytes. It can also
+be forced to translate between 8-bit codes and UTF-8. For instance, if you
+know your input in Latin-1, you can say:
+
+ while (<>) {
+ tr/\0-\xff//CU; # latin1 char to utf8
+ ...
+ }
+
+Similarly you could translate your output with
+
+ tr/\0-\x{ff}//UC; # utf8 to latin1 char
+
+No, C<s///> doesn't take /U or /C (yet?).
+
+=item *
+
+Case translation operators use the Unicode case translation tables
+when provided character input. Note that C<uc()> translates to
+uppercase, while C<ucfirst> translates to titlecase (for languages
+that make the distinction). Naturally the corresponding backslash
+sequences have the same semantics.
+
+=item *
+
+Most operators that deal with positions or lengths in the string will
+automatically switch to using character positions, including C<chop()>,
+C<substr()>, C<pos()>, C<index()>, C<rindex()>, C<sprintf()>,
+C<write()>, and C<length()>. Operators that specifically don't switch
+include C<vec()>, C<pack()>, and C<unpack()>. Operators that really
+don't care include C<chomp()>, as well as any other operator that
+treats a string as a bucket of bits, such as C<sort()>, and the
+operators dealing with filenames.
+
+=item *
+
+The C<pack()>/C<unpack()> letters "C<c>" and "C<C>" do I<not> change,
+since they're often used for byte-oriented formats. (Again, think
+"C<char>" in the C language.) However, there is a new "C<U>" specifier
+that will convert between UTF-8 characters and integers. (It works
+outside of the utf8 pragma too.)
+
+=item *
+
+The C<chr()> and C<ord()> functions work on characters. This is like
+C<pack("U")> and C<unpack("U")>, not like C<pack("C")> and
+C<unpack("C")>. In fact, the latter are how you now emulate
+byte-oriented C<chr()> and C<ord()> under utf8.
+
+=item *
+
+And finally, C<scalar reverse()> reverses by character rather than by byte.
+
+=back
+
+=head2 Character encodings for input and output
+
+[XXX: This feature is not yet implemented.]
+
+=head1 CAVEATS
+
+As of yet, there is no method for automatically coercing input and
+output to some encoding other than UTF-8. This is planned in the near
+future, however.
+
+Whether an arbitrary piece of data will be treated as "characters" or
+"bytes" by internal operations cannot be divined at the current time.
+
+Use of locales with utf8 may lead to odd results. Currently there is
+some attempt to apply 8-bit locale info to characters in the range
+0..255, but this is demonstrably incorrect for locales that use
+characters above that range (when mapped into Unicode). It will also
+tend to run slower. Avoidance of locales is strongly encouraged.
+
+=head1 SEE ALSO
+
+L<bytes>, L<utf8>, L<perlvar/"${^WIDE_SYSTEM_CALLS}">
+
+=cut
diff --git a/contrib/perl5/pod/perlvar.pod b/contrib/perl5/pod/perlvar.pod
index 8d0ded6..04fb3fe 100644
--- a/contrib/perl5/pod/perlvar.pod
+++ b/contrib/perl5/pod/perlvar.pod
@@ -7,9 +7,9 @@ perlvar - Perl predefined variables
=head2 Predefined Names
The following names have special meaning to Perl. Most
-punctuation names have reasonable mnemonics, or analogues in one of
-the shells. Nevertheless, if you wish to use long variable names,
-you just need to say
+punctuation names have reasonable mnemonics, or analogs in the
+shells. Nevertheless, if you wish to use long variable names,
+you need only say
use English;
@@ -17,21 +17,12 @@ at the top of your program. This will alias all the short names to the
long names in the current package. Some even have medium names,
generally borrowed from B<awk>.
-Due to an unfortunate accident of Perl's implementation, "C<use English>"
-imposes a considerable performance penalty on all regular expression
-matches in a program, regardless of whether they occur in the scope of
-"C<use English>". For that reason, saying "C<use English>" in
-libraries is strongly discouraged. See the Devel::SawAmpersand module
-documentation from CPAN
-(http://www.perl.com/CPAN/modules/by-module/Devel/Devel-SawAmpersand-0.10.readme)
-for more information.
-
-To go a step further, those variables that depend on the currently
-selected filehandle may instead (and preferably) be set by calling an
-object method on the FileHandle object. (Summary lines below for this
-contain the word HANDLE.) First you must say
+If you don't mind the performance hit, variables that depend on the
+currently selected filehandle may instead be set by calling an
+appropriate object method on the IO::Handle object. (Summary lines
+below for this contain the word HANDLE.) First you must say
- use FileHandle;
+ use IO::Handle;
after which you may use either
@@ -41,21 +32,20 @@ or more safely,
HANDLE->method(EXPR)
-Each of the methods returns the old value of the FileHandle attribute.
+Each method returns the old value of the IO::Handle attribute.
The methods each take an optional EXPR, which if supplied specifies the
-new value for the FileHandle attribute in question. If not supplied,
-most of the methods do nothing to the current value, except for
+new value for the IO::Handle attribute in question. If not supplied,
+most methods do nothing to the current value--except for
autoflush(), which will assume a 1 for you, just to be different.
+Because loading in the IO::Handle class is an expensive operation, you should
+learn how to use the regular built-in variables.
A few of these variables are considered "read-only". This means that if
you try to assign to this variable, either directly or indirectly through
a reference, you'll raise a run-time exception.
The following list is ordered by scalar variables first, then the
-arrays, then the hashes (except $^M was added in the wrong place).
-This is somewhat obscured by the fact that %ENV and %SIG are listed as
-$ENV{expr} and $SIG{expr}.
-
+arrays, then the hashes.
=over 8
@@ -66,7 +56,7 @@ $ENV{expr} and $SIG{expr}.
The default input and pattern-searching space. The following pairs are
equivalent:
- while (<>) {...} # equivalent in only while!
+ while (<>) {...} # equivalent only in while!
while (defined($_ = <>)) {...}
/^Subject:/
@@ -75,8 +65,8 @@ equivalent:
tr/a-z/A-Z/
$_ =~ tr/a-z/A-Z/
- chop
- chop($_)
+ chomp
+ chomp($_)
Here are the places where Perl will assume $_ even if you
don't use it:
@@ -109,9 +99,9 @@ The implicit iterator variable in the grep() and map() functions.
=item *
-The default place to put an input record when a C<E<lt>FHE<gt>>
+The default place to put an input record when a C<< <FH> >>
operation's result is tested by itself as the sole criterion of a C<while>
-test. Note that outside of a C<while> test, this will not happen.
+test. Outside a C<while> test, this will not happen.
=back
@@ -121,12 +111,13 @@ test. Note that outside of a C<while> test, this will not happen.
=over 8
-=item $E<lt>I<digits>E<gt>
+=item $<I<digits>>
-Contains the subpattern from the corresponding set of parentheses in
-the last pattern matched, not counting patterns matched in nested
-blocks that have been exited already. (Mnemonic: like \digits.)
-These variables are all read-only.
+Contains the subpattern from the corresponding set of capturing
+parentheses from the last pattern match, not counting patterns
+matched in nested blocks that have been exited already. (Mnemonic:
+like \digits.) These variables are all read-only and dynamically
+scoped to the current BLOCK.
=item $MATCH
@@ -134,11 +125,11 @@ These variables are all read-only.
The string matched by the last successful pattern match (not counting
any matches hidden within a BLOCK or eval() enclosed by the current
-BLOCK). (Mnemonic: like & in some editors.) This variable is read-only.
+BLOCK). (Mnemonic: like & in some editors.) This variable is read-only
+and dynamically scoped to the current BLOCK.
The use of this variable anywhere in a program imposes a considerable
-performance penalty on all regular expression matches. See the
-Devel::SawAmpersand module from CPAN for more information.
+performance penalty on all regular expression matches. See L<BUGS>.
=item $PREMATCH
@@ -150,8 +141,7 @@ enclosed by the current BLOCK). (Mnemonic: C<`> often precedes a quoted
string.) This variable is read-only.
The use of this variable anywhere in a program imposes a considerable
-performance penalty on all regular expression matches. See the
-Devel::SawAmpersand module from CPAN for more information.
+performance penalty on all regular expression matches. See L<BUGS>.
=item $POSTMATCH
@@ -166,24 +156,36 @@ string.) Example:
/def/;
print "$`:$&:$'\n"; # prints abc:def:ghi
-This variable is read-only.
+This variable is read-only and dynamically scoped to the current BLOCK.
The use of this variable anywhere in a program imposes a considerable
-performance penalty on all regular expression matches. See the
-Devel::SawAmpersand module from CPAN for more information.
+performance penalty on all regular expression matches. See L<BUGS>.
=item $LAST_PAREN_MATCH
=item $+
The last bracket matched by the last search pattern. This is useful if
-you don't know which of a set of alternative patterns matched. For
+you don't know which one of a set of alternative patterns matched. For
example:
/Version: (.*)|Revision: (.*)/ && ($rev = $+);
(Mnemonic: be positive and forward looking.)
-This variable is read-only.
+This variable is read-only and dynamically scoped to the current BLOCK.
+
+=item @+
+
+This array holds the offsets of the ends of the last successful
+submatches in the currently active dynamic scope. C<$+[0]> is
+the offset into the string of the end of the entire match. This
+is the same value as what the C<pos> function returns when called
+on the variable that was matched against. The I<n>th element
+of this array holds the offset of the I<n>th submatch, so
+C<$+[1]> is the offset past where $1 ends, C<$+[2]> the offset
+past where $2 ends, and so on. You can use C<$#+> to determine
+how many subgroups were in the last successful match. See the
+examples given for the C<@-> variable.
=item $MULTILINE_MATCHING
@@ -192,12 +194,12 @@ This variable is read-only.
Set to 1 to do multi-line matching within a string, 0 to tell Perl
that it can assume that strings contain a single line, for the purpose
of optimizing pattern matches. Pattern matches on strings containing
-multiple newlines can produce confusing results when "C<$*>" is 0. Default
-is 0. (Mnemonic: * matches multiple things.) Note that this variable
-influences the interpretation of only "C<^>" and "C<$>". A literal newline can
+multiple newlines can produce confusing results when C<$*> is 0. Default
+is 0. (Mnemonic: * matches multiple things.) This variable
+influences the interpretation of only C<^> and C<$>. A literal newline can
be searched for even when C<$* == 0>.
-Use of "C<$*>" is deprecated in modern Perls, supplanted by
+Use of C<$*> is deprecated in modern Perl, supplanted by
the C</s> and C</m> modifiers on pattern matching.
=item input_line_number HANDLE EXPR
@@ -208,15 +210,16 @@ the C</s> and C</m> modifiers on pattern matching.
=item $.
-The current input line number for the last file handle from
-which you read (or performed a C<seek> or C<tell> on). The value
+The current input record number for the last file handle from which
+you just read() (or called a C<seek> or C<tell> on). The value
may be different from the actual physical line number in the file,
-depending on what notion of "line" is in effect--see L<$/> on how
-to affect that. An
-explicit close on a filehandle resets the line number. Because
-"C<E<lt>E<gt>>" never does an explicit close, line numbers increase
-across ARGV files (but see examples under eof()). Localizing C<$.> has
-the effect of also localizing Perl's notion of "the last read
+depending on what notion of "line" is in effect--see C<$/> on how
+to change that. An explicit close on a filehandle resets the line
+number. Because C<< <> >> never does an explicit close, line
+numbers increase across ARGV files (but see examples in L<perlfunc/eof>).
+Consider this variable read-only: setting it does not reposition
+the seek pointer; you'll have to do that on your own. Localizing C<$.>
+has the effect of also localizing Perl's notion of "the last read
filehandle". (Mnemonic: many programs use "." to mean the current line
number.)
@@ -228,48 +231,50 @@ number.)
=item $/
-The input record separator, newline by default. This is used to
-influence Perl's idea of what a "line" is. Works like B<awk>'s RS
-variable, including treating empty lines as delimiters if set to the
-null string. (Note: An empty line cannot contain any spaces or tabs.)
-You may set it to a multi-character string to match a multi-character
-delimiter, or to C<undef> to read to end of file. Note that setting it
-to C<"\n\n"> means something slightly different than setting it to
-C<"">, if the file contains consecutive empty lines. Setting it to
-C<""> will treat two or more consecutive empty lines as a single empty
-line. Setting it to C<"\n\n"> will blindly assume that the next input
-character belongs to the next paragraph, even if it's a newline.
-(Mnemonic: / is used to delimit line boundaries when quoting poetry.)
+The input record separator, newline by default. This
+influences Perl's idea of what a "line" is. Works like B<awk>'s RS
+variable, including treating empty lines as a terminator if set to
+the null string. (An empty line cannot contain any spaces
+or tabs.) You may set it to a multi-character string to match a
+multi-character terminator, or to C<undef> to read through the end
+of file. Setting it to C<"\n\n"> means something slightly
+different than setting to C<"">, if the file contains consecutive
+empty lines. Setting to C<""> will treat two or more consecutive
+empty lines as a single empty line. Setting to C<"\n\n"> will
+blindly assume that the next input character belongs to the next
+paragraph, even if it's a newline. (Mnemonic: / delimits
+line boundaries when quoting poetry.)
undef $/; # enable "slurp" mode
$_ = <FH>; # whole file now here
s/\n[ \t]+/ /g;
-Remember: the value of $/ is a string, not a regexp. AWK has to be
-better for something :-)
+Remember: the value of C<$/> is a string, not a regex. B<awk> has to be
+better for something. :-)
-Setting $/ to a reference to an integer, scalar containing an integer, or
-scalar that's convertable to an integer will attempt to read records
+Setting C<$/> to a reference to an integer, scalar containing an integer, or
+scalar that's convertible to an integer will attempt to read records
instead of lines, with the maximum record size being the referenced
-integer. So this:
+integer. So this:
$/ = \32768; # or \"32768", or \$var_containing_32768
open(FILE, $myfile);
$_ = <FILE>;
-will read a record of no more than 32768 bytes from FILE. If you're not
-reading from a record-oriented file (or your OS doesn't have
-record-oriented files), then you'll likely get a full chunk of data with
-every read. If a record is larger than the record size you've set, you'll
-get the record back in pieces.
+will read a record of no more than 32768 bytes from FILE. If you're
+not reading from a record-oriented file (or your OS doesn't have
+record-oriented files), then you'll likely get a full chunk of data
+with every read. If a record is larger than the record size you've
+set, you'll get the record back in pieces.
-On VMS, record reads are done with the equivalent of C<sysread>, so it's
-best not to mix record and non-record reads on the same file. (This is
-likely not a problem, as any file you'd want to read in record mode is
-probably usable in line mode) Non-VMS systems perform normal I/O, so
-it's safe to mix record and non-record reads of a file.
+On VMS, record reads are done with the equivalent of C<sysread>,
+so it's best not to mix record and non-record reads on the same
+file. (This is unlikely to be a problem, because any file you'd
+want to read in record mode is probably unusable in line mode.)
+Non-VMS systems do normal I/O, so it's safe to mix record and
+non-record reads of a file.
-Also see L<$.>.
+See also L<perlport/"Newlines">. Also see C<$.>.
=item autoflush HANDLE EXPR
@@ -277,16 +282,17 @@ Also see L<$.>.
=item $|
-If set to nonzero, forces a flush right away and after every write or print on the
-currently selected output channel. Default is 0 (regardless of whether
-the channel is actually buffered by the system or not; C<$|> tells you
-only whether you've asked Perl explicitly to flush after each write).
-Note that STDOUT will typically be line buffered if output is to the
-terminal and block buffered otherwise. Setting this variable is useful
-primarily when you are outputting to a pipe, such as when you are running
-a Perl script under rsh and want to see the output as it's happening. This
-has no effect on input buffering.
-(Mnemonic: when you want your pipes to be piping hot.)
+If set to nonzero, forces a flush right away and after every write
+or print on the currently selected output channel. Default is 0
+(regardless of whether the channel is really buffered by the
+system or not; C<$|> tells you only whether you've asked Perl
+explicitly to flush after each write). STDOUT will
+typically be line buffered if output is to the terminal and block
+buffered otherwise. Setting this variable is useful primarily when
+you are outputting to a pipe or socket, such as when you are running
+a Perl program under B<rsh> and want to see the output as it's
+happening. This has no effect on input buffering. See L<perlfunc/getc>
+for that. (Mnemonic: when you want your pipes to be piping hot.)
=item output_field_separator HANDLE EXPR
@@ -297,11 +303,11 @@ has no effect on input buffering.
=item $,
The output field separator for the print operator. Ordinarily the
-print operator simply prints out the comma-separated fields you
-specify. To get behavior more like B<awk>, set this variable
-as you would set B<awk>'s OFS variable to specify what is printed
-between fields. (Mnemonic: what is printed when there is a , in your
-print statement.)
+print operator simply prints out its arguments without further
+adornment. To get behavior more like B<awk>, set this variable as
+you would set B<awk>'s OFS variable to specify what is printed
+between fields. (Mnemonic: what is printed when there is a "," in
+your print statement.)
=item output_record_separator HANDLE EXPR
@@ -312,21 +318,21 @@ print statement.)
=item $\
The output record separator for the print operator. Ordinarily the
-print operator simply prints out the comma-separated fields you
-specify, with no trailing newline or record separator assumed.
-To get behavior more like B<awk>, set this variable as you would
-set B<awk>'s ORS variable to specify what is printed at the end of the
-print. (Mnemonic: you set "C<$\>" instead of adding \n at the end of the
-print. Also, it's just like C<$/>, but it's what you get "back" from
-Perl.)
+print operator simply prints out its arguments as is, with no
+trailing newline or other end-of-record string added. To get
+behavior more like B<awk>, set this variable as you would set
+B<awk>'s ORS variable to specify what is printed at the end of the
+print. (Mnemonic: you set C<$\> instead of adding "\n" at the
+end of the print. Also, it's just like C<$/>, but it's what you
+get "back" from Perl.)
=item $LIST_SEPARATOR
=item $"
-This is like "C<$,>" except that it applies to array values interpolated
-into a double-quoted string (or similar interpreted string). Default
-is a space. (Mnemonic: obvious, I think.)
+This is like C<$,> except that it applies to array and slice values
+interpolated into a double-quoted string (or similar interpreted
+string). Default is a space. (Mnemonic: obvious, I think.)
=item $SUBSCRIPT_SEPARATOR
@@ -351,13 +357,14 @@ which means
($foo{$a},$foo{$b},$foo{$c})
-Default is "\034", the same as SUBSEP in B<awk>. Note that if your
-keys contain binary data there might not be any safe value for "C<$;>".
+Default is "\034", the same as SUBSEP in B<awk>. If your
+keys contain binary data there might not be any safe value for C<$;>.
(Mnemonic: comma (the syntactic subscript separator) is a
-semi-semicolon. Yeah, I know, it's pretty lame, but "C<$,>" is already
+semi-semicolon. Yeah, I know, it's pretty lame, but C<$,> is already
taken for something more important.)
-Consider using "real" multidimensional arrays.
+Consider using "real" multidimensional arrays as described
+in L<perllol>.
=item $OFMT
@@ -365,13 +372,13 @@ Consider using "real" multidimensional arrays.
The output format for printed numbers. This variable is a half-hearted
attempt to emulate B<awk>'s OFMT variable. There are times, however,
-when B<awk> and Perl have differing notions of what is in fact
-numeric. The initial value is %.I<n>g, where I<n> is the value
+when B<awk> and Perl have differing notions of what counts as
+numeric. The initial value is "%.I<n>g", where I<n> is the value
of the macro DBL_DIG from your system's F<float.h>. This is different from
-B<awk>'s default OFMT setting of %.6g, so you need to set "C<$#>"
+B<awk>'s default OFMT setting of "%.6g", so you need to set C<$#>
explicitly to get B<awk>'s value. (Mnemonic: # is the number sign.)
-Use of "C<$#>" is deprecated.
+Use of C<$#> is deprecated.
=item format_page_number HANDLE EXPR
@@ -380,6 +387,7 @@ Use of "C<$#>" is deprecated.
=item $%
The current page number of the currently selected output channel.
+Used with formats.
(Mnemonic: % is page number in B<nroff>.)
=item format_lines_per_page HANDLE EXPR
@@ -389,7 +397,9 @@ The current page number of the currently selected output channel.
=item $=
The current page length (printable lines) of the currently selected
-output channel. Default is 60. (Mnemonic: = has horizontal lines.)
+output channel. Default is 60.
+Used with formats.
+(Mnemonic: = has horizontal lines.)
=item format_lines_left HANDLE EXPR
@@ -398,7 +408,50 @@ output channel. Default is 60. (Mnemonic: = has horizontal lines.)
=item $-
The number of lines left on the page of the currently selected output
-channel. (Mnemonic: lines_on_page - lines_printed.)
+channel.
+Used with formats.
+(Mnemonic: lines_on_page - lines_printed.)
+
+=item @-
+
+$-[0] is the offset of the start of the last successful match.
+C<$-[>I<n>C<]> is the offset of the start of the substring matched by
+I<n>-th subpattern, or undef if the subpattern did not match.
+
+Thus after a match against $_, $& coincides with C<substr $_, $-[0],
+$+[0] - $-[0]>. Similarly, C<$>I<n> coincides with C<substr $_, $-[>I<n>C<],
+$+[>I<n>C<] - $-[>I<n>C<]> if C<$-[>I<n>C<]> is defined, and $+ coincides with
+C<substr $_, $-[$#-], $+[$#-]>. One can use C<$#-> to find the last
+matched subgroup in the last successful match. Contrast with
+C<$#+>, the number of subgroups in the regular expression. Compare
+with C<@+>.
+
+This array holds the offsets of the beginnings of the last
+successful submatches in the currently active dynamic scope.
+C<$-[0]> is the offset into the string of the beginning of the
+entire match. The I<n>th element of this array holds the offset
+of the I<n>th submatch, so C<$+[1]> is the offset where $1
+begins, C<$+[2]> the offset where $2 begins, and so on.
+You can use C<$#-> to determine how many subgroups were in the
+last successful match. Compare with the C<@+> variable.
+
+After a match against some variable $var:
+
+=over 5
+
+=item C<$`> is the same as C<substr($var, 0, $-[0]>)
+
+=item C<$&> is the same as C<substr($var, $-[0], $+[0] - $-[0]>)
+
+=item C<$'> is the same as C<substr($var, $+[0]>)
+
+=item C<$1> is the same as C<substr($var, $-[1], $+[1] - $-[1])>
+
+=item C<$2> is the same as C<substr($var, $-[2], $+[2] - $-[2])>
+
+=item C<$3> is the same as C<substr $var, $-[3], $+[3] - $-[3]>)
+
+=back
=item format_name HANDLE EXPR
@@ -407,8 +460,8 @@ channel. (Mnemonic: lines_on_page - lines_printed.)
=item $~
The name of the current report format for the currently selected output
-channel. Default is name of the filehandle. (Mnemonic: brother to
-"C<$^>".)
+channel. Default is the name of the filehandle. (Mnemonic: brother to
+C<$^>.)
=item format_top_name HANDLE EXPR
@@ -417,7 +470,7 @@ channel. Default is name of the filehandle. (Mnemonic: brother to
=item $^
The name of the current top-of-page format for the currently selected
-output channel. Default is name of the filehandle with _TOP
+output channel. Default is the name of the filehandle with _TOP
appended. (Mnemonic: points to top of page.)
=item format_line_break_characters HANDLE EXPR
@@ -437,16 +490,16 @@ poetry is a part of a line.)
=item $^L
-What formats output to perform a form feed. Default is \f.
+What formats output as a form feed. Default is \f.
=item $ACCUMULATOR
=item $^A
The current value of the write() accumulator for format() lines. A format
-contains formline() commands that put their result into C<$^A>. After
+contains formline() calls that put their result into C<$^A>. After
calling its format, write() prints out the contents of C<$^A> and empties.
-So you never actually see the contents of C<$^A> unless you call
+So you never really see the contents of C<$^A> unless you call
formline() yourself and then look at it. See L<perlform> and
L<perlfunc/formline()>.
@@ -455,21 +508,27 @@ L<perlfunc/formline()>.
=item $?
The status returned by the last pipe close, backtick (C<``>) command,
-or system() operator. Note that this is the status word returned by the
-wait() system call (or else is made up to look like it). Thus, the exit
-value of the subprocess is actually (C<$? E<gt>E<gt> 8>), and C<$? & 127>
-gives which signal, if any, the process died from, and C<$? & 128> reports
-whether there was a core dump. (Mnemonic: similar to B<sh> and B<ksh>.)
+successful call to wait() or waitpid(), or from the system()
+operator. This is just the 16-bit status word returned by the
+wait() system call (or else is made up to look like it). Thus, the
+exit value of the subprocess is really (C<<< $? >> 8 >>>), and
+C<$? & 127> gives which signal, if any, the process died from, and
+C<$? & 128> reports whether there was a core dump. (Mnemonic:
+similar to B<sh> and B<ksh>.)
Additionally, if the C<h_errno> variable is supported in C, its value
-is returned via $? if any of the C<gethost*()> functions fail.
+is returned via $? if any C<gethost*()> function fails.
-Note that if you have installed a signal handler for C<SIGCHLD>, the
+If you have installed a signal handler for C<SIGCHLD>, the
value of C<$?> will usually be wrong outside that handler.
Inside an C<END> subroutine C<$?> contains the value that is going to be
given to C<exit()>. You can modify C<$?> in an C<END> subroutine to
-change the exit status of the script.
+change the exit status of your program. For example:
+
+ END {
+ $? = 1 if $? == 255; # die would make it 255
+ }
Under VMS, the pragma C<use vmsish 'status'> makes C<$?> reflect the
actual VMS exit status, instead of the default emulation of POSIX
@@ -483,14 +542,15 @@ Also see L<Error Indicators>.
=item $!
-If used in a numeric context, yields the current value of errno, with
-all the usual caveats. (This means that you shouldn't depend on the
-value of C<$!> to be anything in particular unless you've gotten a
-specific error return indicating a system error.) If used in a string
-context, yields the corresponding system error string. You can assign
-to C<$!> to set I<errno> if, for instance, you want C<"$!"> to return the
-string for error I<n>, or you want to set the exit value for the die()
-operator. (Mnemonic: What just went bang?)
+If used numerically, yields the current value of the C C<errno>
+variable, with all the usual caveats. (This means that you shouldn't
+depend on the value of C<$!> to be anything in particular unless
+you've gotten a specific error return indicating a system error.)
+If used an a string, yields the corresponding system error string.
+You can assign a number to C<$!> to set I<errno> if, for instance,
+you want C<"$!"> to return the string for error I<n>, or you want
+to set the exit value for the die() operator. (Mnemonic: What just
+went bang?)
Also see L<Error Indicators>.
@@ -514,7 +574,7 @@ OS/2 API either via CRT, or directly from perl.
Under Win32, C<$^E> always returns the last error information
reported by the Win32 call C<GetLastError()> which describes
the last error from within the Win32 API. Most Win32-specific
-code will report errors via C<$^E>. ANSI C and UNIX-like calls
+code will report errors via C<$^E>. ANSI C and Unix-like calls
set C<errno> and so most portable Perl code will report errors
via C<$!>.
@@ -527,12 +587,12 @@ Also see L<Error Indicators>.
=item $@
-The Perl syntax error message from the last eval() command. If null, the
+The Perl syntax error message from the last eval() operator. If null, the
last eval() parsed and executed correctly (although the operations you
invoked may have failed in the normal fashion). (Mnemonic: Where was
the syntax error "at"?)
-Note that warning messages are not collected in this variable. You can,
+Warning messages are not collected in this variable. You can,
however, set up a routine to process warnings by setting C<$SIG{__WARN__}>
as described below.
@@ -544,8 +604,9 @@ Also see L<Error Indicators>.
=item $$
-The process number of the Perl running this script. (Mnemonic: same
-as shells.)
+The process number of the Perl running this script. You should
+consider this variable read-only, although it will be altered
+across fork() calls. (Mnemonic: same as shells.)
=item $REAL_USER_ID
@@ -553,7 +614,7 @@ as shells.)
=item $<
-The real uid of this process. (Mnemonic: it's the uid you came I<FROM>,
+The real uid of this process. (Mnemonic: it's the uid you came I<from>,
if you're running setuid.)
=item $EFFECTIVE_USER_ID
@@ -567,8 +628,8 @@ The effective uid of this process. Example:
$< = $>; # set real to effective uid
($<,$>) = ($>,$<); # swap real and effective uid
-(Mnemonic: it's the uid you went I<TO>, if you're running setuid.)
-Note: "C<$E<lt>>" and "C<$E<gt>>" can be swapped only on machines
+(Mnemonic: it's the uid you went I<to>, if you're running setuid.)
+C<< $< >> and C<< $> >> can be swapped only on machines
supporting setreuid().
=item $REAL_GROUP_ID
@@ -583,12 +644,12 @@ list of groups you are in. The first number is the one returned by
getgid(), and the subsequent ones by getgroups(), one of which may be
the same as the first number.
-However, a value assigned to "C<$(>" must be a single number used to
-set the real gid. So the value given by "C<$(>" should I<not> be assigned
-back to "C<$(>" without being forced numeric, such as by adding zero.
+However, a value assigned to C<$(> must be a single number used to
+set the real gid. So the value given by C<$(> should I<not> be assigned
+back to C<$(> without being forced numeric, such as by adding zero.
-(Mnemonic: parentheses are used to I<GROUP> things. The real gid is the
-group you I<LEFT>, if you're running setgid.)
+(Mnemonic: parentheses are used to I<group> things. The real gid is the
+group you I<left>, if you're running setgid.)
=item $EFFECTIVE_GROUP_ID
@@ -602,44 +663,41 @@ separated list of groups you are in. The first number is the one
returned by getegid(), and the subsequent ones by getgroups(), one of
which may be the same as the first number.
-Similarly, a value assigned to "C<$)>" must also be a space-separated
-list of numbers. The first number is used to set the effective gid, and
+Similarly, a value assigned to C<$)> must also be a space-separated
+list of numbers. The first number sets the effective gid, and
the rest (if any) are passed to setgroups(). To get the effect of an
empty list for setgroups(), just repeat the new effective gid; that is,
to force an effective gid of 5 and an effectively empty setgroups()
list, say C< $) = "5 5" >.
-(Mnemonic: parentheses are used to I<GROUP> things. The effective gid
-is the group that's I<RIGHT> for you, if you're running setgid.)
+(Mnemonic: parentheses are used to I<group> things. The effective gid
+is the group that's I<right> for you, if you're running setgid.)
-Note: "C<$E<lt>>", "C<$E<gt>>", "C<$(>" and "C<$)>" can be set only on
-machines that support the corresponding I<set[re][ug]id()> routine. "C<$(>"
-and "C<$)>" can be swapped only on machines supporting setregid().
+C<< $< >>, C<< $> >>, C<$(> and C<$)> can be set only on
+machines that support the corresponding I<set[re][ug]id()> routine. C<$(>
+and C<$)> can be swapped only on machines supporting setregid().
=item $PROGRAM_NAME
=item $0
-Contains the name of the file containing the Perl script being
-executed. On some operating systems
-assigning to "C<$0>" modifies the argument area that the ps(1)
-program sees. This is more useful as a way of indicating the
-current program state than it is for hiding the program you're running.
+Contains the name of the program being executed. On some operating
+systems assigning to C<$0> modifies the argument area that the B<ps>
+program sees. This is more useful as a way of indicating the current
+program state than it is for hiding the program you're running.
(Mnemonic: same as B<sh> and B<ksh>.)
=item $[
The index of the first element in an array, and of the first character
-in a substring. Default is 0, but you could set it to 1 to make
-Perl behave more like B<awk> (or Fortran) when subscripting and when
-evaluating the index() and substr() functions. (Mnemonic: [ begins
-subscripts.)
+in a substring. Default is 0, but you could theoretically set it
+to 1 to make Perl behave more like B<awk> (or Fortran) when
+subscripting and when evaluating the index() and substr() functions.
+(Mnemonic: [ begins subscripts.)
-As of Perl 5, assignment to "C<$[>" is treated as a compiler directive,
-and cannot influence the behavior of any other file. Its use is
-discouraged.
-
-=item $PERL_VERSION
+As of release 5 of Perl, assignment to C<$[> is treated as a compiler
+directive, and cannot influence the behavior of any other file.
+Its use is highly discouraged.
=item $]
@@ -651,16 +709,22 @@ of perl in the right bracket?) Example:
warn "No checksumming!\n" if $] < 3.019;
See also the documentation of C<use VERSION> and C<require VERSION>
-for a convenient way to fail if the Perl interpreter is too old.
+for a convenient way to fail if the running Perl interpreter is too old.
+
+The use of this variable is deprecated. The floating point representation
+can sometimes lead to inaccurate numeric comparisons. See C<$^V> for a
+more modern representation of the Perl version that allows accurate string
+comparisons.
=item $COMPILING
=item $^C
-The current value of the flag associated with the B<-c> switch. Mainly
-of use with B<-MO=...> to allow code to alter its behaviour when being compiled.
-(For example to automatically AUTOLOADing at compile time rather than normal
-deferred loading.) Setting C<$^C = 1> is similar to calling C<B::minus_c>.
+The current value of the flag associated with the B<-c> switch.
+Mainly of use with B<-MO=...> to allow code to alter its behavior
+when being compiled, such as for example to AUTOLOAD at compile
+time rather than normal, deferred loading. See L<perlcc>. Setting
+C<$^C = 1> is similar to calling C<B::minus_c>.
=item $DEBUGGING
@@ -677,14 +741,61 @@ The maximum system file descriptor, ordinarily 2. System file
descriptors are passed to exec()ed processes, while higher file
descriptors are not. Also, during an open(), system file descriptors are
preserved even if the open() fails. (Ordinary file descriptors are
-closed before the open() is attempted.) Note that the close-on-exec
+closed before the open() is attempted.) The close-on-exec
status of a file descriptor will be decided according to the value of
-C<$^F> when the open() or pipe() was called, not the time of the exec().
+C<$^F> when the corresponding file, pipe, or socket was opened, not the
+time of the exec().
=item $^H
-The current set of syntax checks enabled by C<use strict> and other block
-scoped compiler hints. See the documentation of C<strict> for more details.
+WARNING: This variable is strictly for internal use only. Its availability,
+behavior, and contents are subject to change without notice.
+
+This variable contains compile-time hints for the Perl interpreter. At the
+end of compilation of a BLOCK the value of this variable is restored to the
+value when the interpreter started to compile the BLOCK.
+
+When perl begins to parse any block construct that provides a lexical scope
+(e.g., eval body, required file, subroutine body, loop body, or conditional
+block), the existing value of $^H is saved, but its value is left unchanged.
+When the compilation of the block is completed, it regains the saved value.
+Between the points where its value is saved and restored, code that
+executes within BEGIN blocks is free to change the value of $^H.
+
+This behavior provides the semantic of lexical scoping, and is used in,
+for instance, the C<use strict> pragma.
+
+The contents should be an integer; different bits of it are used for
+different pragmatic flags. Here's an example:
+
+ sub add_100 { $^H |= 0x100 }
+
+ sub foo {
+ BEGIN { add_100() }
+ bar->baz($boon);
+ }
+
+Consider what happens during execution of the BEGIN block. At this point
+the BEGIN block has already been compiled, but the body of foo() is still
+being compiled. The new value of $^H will therefore be visible only while
+the body of foo() is being compiled.
+
+Substitution of the above BEGIN block with:
+
+ BEGIN { require strict; strict->import('vars') }
+
+demonstrates how C<use strict 'vars'> is implemented. Here's a conditional
+version of the same lexical pragma:
+
+ BEGIN { require strict; strict->import('vars') if $condition }
+
+=item %^H
+
+WARNING: This variable is strictly for internal use only. Its availability,
+behavior, and contents are subject to change without notice.
+
+The %^H hash provides the same scoping semantic as $^H. This makes it
+useful for implementation of lexically scoped pragmas.
=item $INPLACE_EDIT
@@ -695,17 +806,18 @@ inplace editing. (Mnemonic: value of B<-i> switch.)
=item $^M
-By default, running out of memory it is not trappable. However, if
-compiled for this, Perl may use the contents of C<$^M> as an emergency
-pool after die()ing with this message. Suppose that your Perl were
-compiled with -DPERL_EMERGENCY_SBRK and used Perl's malloc. Then
+By default, running out of memory is an untrappable, fatal error.
+However, if suitably built, Perl can use the contents of C<$^M>
+as an emergency memory pool after die()ing. Suppose that your Perl
+were compiled with -DPERL_EMERGENCY_SBRK and used Perl's malloc.
+Then
- $^M = 'a' x (1<<16);
+ $^M = 'a' x (1 << 16);
-would allocate a 64K buffer for use when in emergency. See the F<INSTALL>
-file for information on how to enable this option. As a disincentive to
-casual use of this advanced feature, there is no L<English> long name for
-this variable.
+would allocate a 64K buffer for use when in emergency. See the
+F<INSTALL> file in the Perl distribution for information on how to
+enable this option. To discourage casual use of this advanced
+feature, there is no L<English> long name for this variable.
=item $OSNAME
@@ -713,14 +825,15 @@ this variable.
The name of the operating system under which this copy of Perl was
built, as determined during the configuration process. The value
-is identical to C<$Config{'osname'}>.
+is identical to C<$Config{'osname'}>. See also L<Config> and the
+B<-V> command-line switch documented in L<perlrun>.
=item $PERLDB
=item $^P
-The internal variable for debugging support. Different bits mean the
-following (subject to change):
+The internal variable for debugging support. The meanings of the
+various bits are subject to change, but currently indicate:
=over 6
@@ -748,65 +861,128 @@ Keep info about source lines on which a subroutine is defined.
Start with single-step on.
+=item 0x40
+
+Use subroutine address instead of name when reporting.
+
+=item 0x80
+
+Report C<goto &subroutine> as well.
+
+=item 0x100
+
+Provide informative "file" names for evals based on the place they were compiled.
+
+=item 0x200
+
+Provide informative names to anonymous subroutines based on the place they
+were compiled.
+
=back
-Note that some bits may be relevant at compile-time only, some at
-run-time only. This is a new mechanism and the details may change.
+Some bits may be relevant at compile-time only, some at
+run-time only. This is a new mechanism and the details may change.
+
+=item $LAST_REGEXP_CODE_RESULT
=item $^R
-The result of evaluation of the last successful L<perlre/C<(?{ code })>>
-regular expression assertion. (Excluding those used as switches.) May
-be written to.
+The result of evaluation of the last successful C<(?{ code })>
+regular expression assertion (see L<perlre>). May be written to.
+
+=item $EXCEPTIONS_BEING_CAUGHT
=item $^S
Current state of the interpreter. Undefined if parsing of the current
module/eval is not finished (may happen in $SIG{__DIE__} and
-$SIG{__WARN__} handlers). True if inside an eval, otherwise false.
+$SIG{__WARN__} handlers). True if inside an eval(), otherwise false.
=item $BASETIME
=item $^T
-The time at which the script began running, in seconds since the
+The time at which the program began running, in seconds since the
epoch (beginning of 1970). The values returned by the B<-M>, B<-A>,
-and B<-C> filetests are
-based on this value.
+and B<-C> filetests are based on this value.
+
+=item $PERL_VERSION
+
+=item $^V
+
+The revision, version, and subversion of the Perl interpreter, represented
+as a string composed of characters with those ordinals. Thus in Perl v5.6.0
+it equals C<chr(5) . chr(6) . chr(0)> and will return true for
+C<$^V eq v5.6.0>. Note that the characters in this string value can
+potentially be in Unicode range.
+
+This can be used to determine whether the Perl interpreter executing a
+script is in the right range of versions. (Mnemonic: use ^V for Version
+Control.) Example:
+
+ warn "No "our" declarations!\n" if $^V and $^V lt v5.6.0;
+
+See the documentation of C<use VERSION> and C<require VERSION>
+for a convenient way to fail if the running Perl interpreter is too old.
+
+See also C<$]> for an older representation of the Perl version.
=item $WARNING
=item $^W
-The current value of the warning switch, either TRUE or FALSE.
-(Mnemonic: related to the B<-w> switch.)
+The current value of the warning switch, initially true if B<-w>
+was used, false otherwise, but directly modifiable. (Mnemonic:
+related to the B<-w> switch.) See also L<warnings>.
+
+=item ${^WARNING_BITS}
+
+The current set of warning checks enabled by the C<use warnings> pragma.
+See the documentation of C<warnings> for more details.
+
+=item ${^WIDE_SYSTEM_CALLS}
+
+Global flag that enables system calls made by Perl to use wide character
+APIs native to the system, if available. This is currently only implemented
+on the Windows platform.
+
+This can also be enabled from the command line using the C<-C> switch.
+
+The initial value is typically C<0> for compatibility with Perl versions
+earlier than 5.6, but may be automatically set to C<1> by Perl if the system
+provides a user-settable default (e.g., C<$ENV{LC_CTYPE}>).
+
+The C<bytes> pragma always overrides the effect of this flag in the current
+lexical scope. See L<bytes>.
=item $EXECUTABLE_NAME
=item $^X
The name that the Perl binary itself was executed as, from C's C<argv[0]>.
+This may not be a full pathname, nor even necessarily in your path.
=item $ARGV
-contains the name of the current file when reading from E<lt>E<gt>.
+contains the name of the current file when reading from <>.
=item @ARGV
-The array @ARGV contains the command line arguments intended for the
-script. Note that C<$#ARGV> is the generally number of arguments minus
-one, because C<$ARGV[0]> is the first argument, I<NOT> the command name. See
-"C<$0>" for the command name.
+The array @ARGV contains the command-line arguments intended for
+the script. C<$#ARGV> is generally the number of arguments minus
+one, because C<$ARGV[0]> is the first argument, I<not> the program's
+command name itself. See C<$0> for the command name.
=item @INC
-The array @INC contains the list of places to look for Perl scripts to
-be evaluated by the C<do EXPR>, C<require>, or C<use> constructs. It
-initially consists of the arguments to any B<-I> command line switches,
-followed by the default Perl library, probably F</usr/local/lib/perl>,
-followed by ".", to represent the current directory. If you need to
-modify this at runtime, you should use the C<use lib> pragma
-to get the machine-dependent library properly loaded also:
+The array @INC contains the list of places that the C<do EXPR>,
+C<require>, or C<use> constructs look for their library files. It
+initially consists of the arguments to any B<-I> command-line
+switches, followed by the default Perl library, probably
+F</usr/local/lib/perl>, followed by ".", to represent the current
+directory. If you need to modify this at runtime, you should use
+the C<use lib> pragma to get the machine-dependent library properly
+loaded also:
use lib '/mypath/libdir/';
use SomeMod;
@@ -814,29 +990,30 @@ to get the machine-dependent library properly loaded also:
=item @_
Within a subroutine the array @_ contains the parameters passed to that
-subroutine. See L<perlsub>.
+subroutine. See L<perlsub>.
=item %INC
-The hash %INC contains entries for each filename that has
-been included via C<do> or C<require>. The key is the filename you
-specified, and the value is the location of the file actually found.
-The C<require> command uses this array to determine whether a given file
-has already been included.
+The hash %INC contains entries for each filename included via the
+C<do>, C<require>, or C<use> operators. The key is the filename
+you specified (with module names converted to pathnames), and the
+value is the location of the file found. The C<require>
+operator uses this hash to determine whether a particular file has
+already been included.
=item %ENV
=item $ENV{expr}
The hash %ENV contains your current environment. Setting a
-value in C<ENV> changes the environment for child processes.
+value in C<ENV> changes the environment for any child processes
+you subsequently fork() off.
=item %SIG
=item $SIG{expr}
-The hash %SIG is used to set signal handlers for various
-signals. Example:
+The hash %SIG contains signal handlers for signals. For example:
sub handler { # 1st argument is signal name
my($sig) = @_;
@@ -848,30 +1025,27 @@ signals. Example:
$SIG{'INT'} = \&handler;
$SIG{'QUIT'} = \&handler;
...
- $SIG{'INT'} = 'DEFAULT'; # restore default action
+ $SIG{'INT'} = 'DEFAULT'; # restore default action
$SIG{'QUIT'} = 'IGNORE'; # ignore SIGQUIT
Using a value of C<'IGNORE'> usually has the effect of ignoring the
signal, except for the C<CHLD> signal. See L<perlipc> for more about
this special case.
-The %SIG array contains values for only the signals actually set within
-the Perl script. Here are some other examples:
+Here are some other examples:
- $SIG{"PIPE"} = Plumber; # SCARY!!
$SIG{"PIPE"} = "Plumber"; # assumes main::Plumber (not recommended)
$SIG{"PIPE"} = \&Plumber; # just fine; assume current Plumber
+ $SIG{"PIPE"} = *Plumber; # somewhat esoteric
$SIG{"PIPE"} = Plumber(); # oops, what did Plumber() return??
-The one marked scary is problematic because it's a bareword, which means
-sometimes it's a string representing the function, and sometimes it's
-going to call the subroutine call right then and there! Best to be sure
-and quote it or take a reference to it. *Plumber works too. See L<perlsub>.
+Be sure not to use a bareword as the name of a signal handler,
+lest you inadvertently call it.
If your system has the sigaction() function then signal handlers are
installed using it. This means you get reliable signal handling. If
your system has the SA_RESTART flag it is used when signals handlers are
-installed. This means that system calls for which it is supported
+installed. This means that system calls for which restarting is supported
continue rather than returning when a signal arrives. If you want your
system calls to be interrupted by signal delivery then do something like
this:
@@ -902,16 +1076,20 @@ unless the hook routine itself exits via a C<goto>, a loop exit, or a die().
The C<__DIE__> handler is explicitly disabled during the call, so that you
can die from a C<__DIE__> handler. Similarly for C<__WARN__>.
-Note that the C<$SIG{__DIE__}> hook is called even inside eval()ed
-blocks/strings. See L<perlfunc/die> and L<perlvar/$^S> for how to
-circumvent this.
-
-Note that C<__DIE__>/C<__WARN__> handlers are very special in one
-respect: they may be called to report (probable) errors found by the
-parser. In such a case the parser may be in inconsistent state, so
-any attempt to evaluate Perl code from such a handler will probably
-result in a segfault. This means that calls which result/may-result
-in parsing Perl should be used with extreme caution, like this:
+Due to an implementation glitch, the C<$SIG{__DIE__}> hook is called
+even inside an eval(). Do not use this to rewrite a pending exception
+in C<$@>, or as a bizarre substitute for overriding CORE::GLOBAL::die().
+This strange action at a distance may be fixed in a future release
+so that C<$SIG{__DIE__}> is only called if your program is about
+to exit, as was the original intent. Any other use is deprecated.
+
+C<__DIE__>/C<__WARN__> handlers are very special in one respect:
+they may be called to report (probable) errors found by the parser.
+In such a case the parser may be in inconsistent state, so any
+attempt to evaluate Perl code from such a handler will probably
+result in a segfault. This means that warnings or errors that
+result from parsing Perl should be used with extreme caution, like
+this:
require Carp if defined $^S;
Carp::confess("Something wrong") if defined &Carp::confess;
@@ -923,83 +1101,94 @@ called the handler. The second line will print backtrace and die if
Carp was available. The third line will be executed only if Carp was
not available.
-See L<perlfunc/die>, L<perlfunc/warn> and L<perlfunc/eval> for
-additional info.
+See L<perlfunc/die>, L<perlfunc/warn>, L<perlfunc/eval>, and
+L<warnings> for additional information.
=back
=head2 Error Indicators
-The variables L<$@>, L<$!>, L<$^E>, and L<$?> contain information about
-different types of error conditions that may appear during execution of
-Perl script. The variables are shown ordered by the "distance" between
-the subsystem which reported the error and the Perl process, and
-correspond to errors detected by the Perl interpreter, C library,
-operating system, or an external program, respectively.
+The variables C<$@>, C<$!>, C<$^E>, and C<$?> contain information
+about different types of error conditions that may appear during
+execution of a Perl program. The variables are shown ordered by
+the "distance" between the subsystem which reported the error and
+the Perl process. They correspond to errors detected by the Perl
+interpreter, C library, operating system, or an external program,
+respectively.
To illustrate the differences between these variables, consider the
-following Perl expression:
+following Perl expression, which uses a single-quoted string:
- eval '
- open PIPE, "/cdrom/install |";
- @res = <PIPE>;
- close PIPE or die "bad pipe: $?, $!";
- ';
+ eval q{
+ open PIPE, "/cdrom/install |";
+ @res = <PIPE>;
+ close PIPE or die "bad pipe: $?, $!";
+ };
After execution of this statement all 4 variables may have been set.
-$@ is set if the string to be C<eval>-ed did not compile (this may happen if
-C<open> or C<close> were imported with bad prototypes), or if Perl
-code executed during evaluation die()d (either implicitly, say,
-if C<open> was imported from module L<Fatal>, or the C<die> after
-C<close> was triggered). In these cases the value of $@ is the compile
-error, or C<Fatal> error (which will interpolate C<$!>!), or the argument
-to C<die> (which will interpolate C<$!> and C<$?>!).
-
-When the above expression is executed, open(), C<<PIPEE<gt>>, and C<close>
-are translated to C run-time library calls. $! is set if one of these
-calls fails. The value is a symbolic indicator chosen by the C run-time
-library, say C<No such file or directory>.
-
-On some systems the above C library calls are further translated
-to calls to the kernel. The kernel may have set more verbose error
-indicator that one of the handful of standard C errors. In such cases $^E
-contains this verbose error indicator, which may be, say, C<CDROM tray not
-closed>. On systems where C library calls are identical to system calls
-$^E is a duplicate of $!.
-
-Finally, $? may be set to non-C<0> value if the external program
-C</cdrom/install> fails. Upper bits of the particular value may reflect
-specific error conditions encountered by this program (this is
-program-dependent), lower-bits reflect mode of failure (segfault, completion,
-etc.). Note that in contrast to $@, $!, and $^E, which are set only
-if error condition is detected, the variable $? is set on each C<wait> or
-pipe C<close>, overwriting the old value.
-
-For more details, see the individual descriptions at L<$@>, L<$!>, L<$^E>,
-and L<$?>.
+C<$@> is set if the string to be C<eval>-ed did not compile (this
+may happen if C<open> or C<close> were imported with bad prototypes),
+or if Perl code executed during evaluation die()d . In these cases
+the value of $@ is the compile error, or the argument to C<die>
+(which will interpolate C<$!> and C<$?>!). (See also L<Fatal>,
+though.)
+
+When the eval() expression above is executed, open(), C<< <PIPE> >>,
+and C<close> are translated to calls in the C run-time library and
+thence to the operating system kernel. C<$!> is set to the C library's
+C<errno> if one of these calls fails.
+
+Under a few operating systems, C<$^E> may contain a more verbose
+error indicator, such as in this case, "CDROM tray not closed."
+Systems that do not support extended error messages leave C<$^E>
+the same as C<$!>.
+
+Finally, C<$?> may be set to non-0 value if the external program
+F</cdrom/install> fails. The upper eight bits reflect specific
+error conditions encountered by the program (the program's exit()
+value). The lower eight bits reflect mode of failure, like signal
+death and core dump information See wait(2) for details. In
+contrast to C<$!> and C<$^E>, which are set only if error condition
+is detected, the variable C<$?> is set on each C<wait> or pipe
+C<close>, overwriting the old value. This is more like C<$@>, which
+on every eval() is always set on failure and cleared on success.
+For more details, see the individual descriptions at C<$@>, C<$!>, C<$^E>,
+and C<$?>.
=head2 Technical Note on the Syntax of Variable Names
-Variable names in Perl can have several formats. Usually, they must
-begin with a letter or underscore, in which case they can be
-arbitrarily long (up to an internal limit of 256 characters) and may
-contain letters, digits, underscores, or the special sequence C<::>.
-In this case the part before the last C<::> is taken to be a I<package
-qualifier>; see L<perlmod>.
+Variable names in Perl can have several formats. Usually, they
+must begin with a letter or underscore, in which case they can be
+arbitrarily long (up to an internal limit of 251 characters) and
+may contain letters, digits, underscores, or the special sequence
+C<::> or C<'>. In this case, the part before the last C<::> or
+C<'> is taken to be a I<package qualifier>; see L<perlmod>.
Perl variable names may also be a sequence of digits or a single
punctuation or control character. These names are all reserved for
-special uses by Perl; for example, the all-digits names are used to
-hold backreferences after a regular expression match. Perl has a
-special syntax for the single-control-character names: It understands
-C<^X> (caret C<X>) to mean the control-C<X> character. For example,
-the notation C<$^W> (dollar-sign caret C<W>) is the scalar variable
-whose name is the single character control-C<W>. This is better than
-typing a literal control-C<W> into your program.
-
-All Perl variables that begin with digits, control characters, or
+special uses by Perl; for example, the all-digits names are used
+to hold data captured by backreferences after a regular expression
+match. Perl has a special syntax for the single-control-character
+names: It understands C<^X> (caret C<X>) to mean the control-C<X>
+character. For example, the notation C<$^W> (dollar-sign caret
+C<W>) is the scalar variable whose name is the single character
+control-C<W>. This is better than typing a literal control-C<W>
+into your program.
+
+Finally, new in Perl 5.6, Perl variable names may be alphanumeric
+strings that begin with control characters (or better yet, a caret).
+These variables must be written in the form C<${^Foo}>; the braces
+are not optional. C<${^Foo}> denotes the scalar variable whose
+name is a control-C<F> followed by two C<o>'s. These variables are
+reserved for future special uses by Perl, except for the ones that
+begin with C<^_> (control-underscore or caret-underscore). No
+control-character name that begins with C<^_> will acquire a special
+meaning in any future version of Perl; such names may therefore be
+used safely in programs. C<$^_> itself, however, I<is> reserved.
+
+Perl identifiers that begin with digits, control characters, or
punctuation characters are exempt from the effects of the C<package>
declaration and are always forced to be in package C<main>. A few
other names are also exempt:
@@ -1010,3 +1199,22 @@ other names are also exempt:
ARGVOUT
SIG
+In particular, the new special C<${^_XYZ}> variables are always taken
+to be in package C<main>, regardless of any C<package> declarations
+presently in scope.
+
+=head1 BUGS
+
+Due to an unfortunate accident of Perl's implementation, C<use
+English> imposes a considerable performance penalty on all regular
+expression matches in a program, regardless of whether they occur
+in the scope of C<use English>. For that reason, saying C<use
+English> in libraries is strongly discouraged. See the
+Devel::SawAmpersand module documentation from CPAN
+(http://www.perl.com/CPAN/modules/by-module/Devel/)
+for more information.
+
+Having to even think about the C<$^S> variable in your exception
+handlers is simply wrong. C<$SIG{__DIE__}> as currently implemented
+invites grievous and difficult to track down errors. Avoid it
+and use an C<END{}> or CORE::GLOBAL::die override instead.
diff --git a/contrib/perl5/pod/perlxs.pod b/contrib/perl5/pod/perlxs.pod
index 98a9834..3c0927e 100644
--- a/contrib/perl5/pod/perlxs.pod
+++ b/contrib/perl5/pod/perlxs.pod
@@ -6,28 +6,73 @@ perlxs - XS language reference manual
=head2 Introduction
-XS is a language used to create an extension interface
-between Perl and some C library which one wishes to use with
-Perl. The XS interface is combined with the library to
-create a new library which can be linked to Perl. An B<XSUB>
-is a function in the XS language and is the core component
-of the Perl application interface.
-
-The XS compiler is called B<xsubpp>. This compiler will embed
-the constructs necessary to let an XSUB, which is really a C
-function in disguise, manipulate Perl values and creates the
-glue necessary to let Perl access the XSUB. The compiler
+XS is an interface description file format used to create an extension
+interface between Perl and C code (or a C library) which one wishes
+to use with Perl. The XS interface is combined with the library to
+create a new library which can then be either dynamically loaded
+or statically linked into perl. The XS interface description is
+written in the XS language and is the core component of the Perl
+extension interface.
+
+An B<XSUB> forms the basic unit of the XS interface. After compilation
+by the B<xsubpp> compiler, each XSUB amounts to a C function definition
+which will provide the glue between Perl calling conventions and C
+calling conventions.
+
+The glue code pulls the arguments from the Perl stack, converts these
+Perl values to the formats expected by a C function, call this C function,
+transfers the return values of the C function back to Perl.
+Return values here may be a conventional C return value or any C
+function arguments that may serve as output parameters. These return
+values may be passed back to Perl either by putting them on the
+Perl stack, or by modifying the arguments supplied from the Perl side.
+
+The above is a somewhat simplified view of what really happens. Since
+Perl allows more flexible calling conventions than C, XSUBs may do much
+more in practice, such as checking input parameters for validity,
+throwing exceptions (or returning undef/empty list) if the return value
+from the C function indicates failure, calling different C functions
+based on numbers and types of the arguments, providing an object-oriented
+interface, etc.
+
+Of course, one could write such glue code directly in C. However, this
+would be a tedious task, especially if one needs to write glue for
+multiple C functions, and/or one is not familiar enough with the Perl
+stack discipline and other such arcana. XS comes to the rescue here:
+instead of writing this glue C code in long-hand, one can write
+a more concise short-hand I<description> of what should be done by
+the glue, and let the XS compiler B<xsubpp> handle the rest.
+
+The XS language allows one to describe the mapping between how the C
+routine is used, and how the corresponding Perl routine is used. It
+also allows creation of Perl routines which are directly translated to
+C code and which are not related to a pre-existing C function. In cases
+when the C interface coincides with the Perl interface, the XSUB
+declaration is almost identical to a declaration of a C function (in K&R
+style). In such circumstances, there is another tool called C<h2xs>
+that is able to translate an entire C header file into a corresponding
+XS file that will provide glue to the functions/macros described in
+the header file.
+
+The XS compiler is called B<xsubpp>. This compiler creates
+the constructs necessary to let an XSUB manipulate Perl values, and
+creates the glue necessary to let Perl call the XSUB. The compiler
uses B<typemaps> to determine how to map C function parameters
-and variables to Perl values. The default typemap handles
-many common C types. A supplement typemap must be created
-to handle special structures and types for the library being
-linked.
+and output values to Perl values and back. The default typemap
+(which comes with Perl) handles many common C types. A supplementary
+typemap may also be needed to handle any special structures and types
+for the library being linked.
+
+A file in XS format starts with a C language section which goes until the
+first C<MODULE =Z<>> directive. Other XS directives and XSUB definitions
+may follow this line. The "language" used in this part of the file
+is usually referred to as the XS language.
See L<perlxstut> for a tutorial on the whole extension creation process.
-Note: For many extensions, Dave Beazley's SWIG system provides a
-significantly more convenient mechanism for creating the XS glue
-code. See L<http://www.cs.utah.edu/~beazley/SWIG> for more
+Note: For some extensions, Dave Beazley's SWIG system may provide a
+significantly more convenient mechanism for creating the extension glue
+code. See L<http://www.swig.org> for more
information.
=head2 On The Road
@@ -76,7 +121,7 @@ expanded later in this document.
rpcb_gettime(host,timep)
char *host
time_t &timep
- OUTPUT:
+ OUTPUT:
timep
Any extension to Perl, including those containing XSUBs,
@@ -110,6 +155,10 @@ function.
=head2 The Anatomy of an XSUB
+The simplest XSUBs consist of 3 parts: a description of the return
+value, the name of the XSUB routine and the names of its arguments,
+and a description of types or formats of the arguments.
+
The following XSUB allows a Perl program to access a C library function
called sin(). The XSUB will imitate the C function which takes a single
argument and returns a single value.
@@ -118,14 +167,24 @@ argument and returns a single value.
sin(x)
double x
-When using C pointers the indirection operator C<*> should be considered
-part of the type and the address operator C<&> should be considered part of
-the variable, as is demonstrated in the rpcb_gettime() function above. See
-the section on typemaps for more about handling qualifiers and unary
+When using parameters with C pointer types, as in
+
+ double string_to_double(char *s);
+
+there may be two ways to describe this argument to B<xsubpp>:
+
+ char * s
+ char &s
+
+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
+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.
The function name and the return type must be placed on
-separate lines.
+separate lines and should be flush left-adjusted.
INCORRECT CORRECT
@@ -135,7 +194,7 @@ separate lines.
The function body 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.
+document will indent the body for better readability.
CORRECT
@@ -143,13 +202,23 @@ document will indent the body.
sin(x)
double x
+More complicated XSUBs may contain many other sections. Each section of
+an XSUB starts with the corresponding keyword, such as INIT: or CLEANUP:.
+However, the first two lines of an XSUB always contain the same data:
+descriptions of the return type and the names of the function and its
+parameters. Whatever immediately follows these is considered to be
+an INPUT: section unless explicitly marked with another keyword.
+(See L<The INPUT: Keyword>.)
+
+An XSUB section continues until another section-start keyword is found.
+
=head2 The Argument Stack
-The argument stack is used to store the values which are
+The Perl argument stack is used to store the values which are
sent as parameters to the XSUB and to store the XSUB's
-return value. In reality all Perl functions keep their
-values on this stack at the same time, each limited to its
-own range of positions on the stack. In this document the
+return value(s). In reality all Perl functions (including non-XSUB
+ones) keep their values on this stack all the same time, each limited
+to its own range of positions on the stack. In this document the
first position on that stack which belongs to the active
function will be referred to as position 0 for that function.
@@ -163,17 +232,19 @@ typemaps. In more complex cases the programmer must supply the code.
=head2 The RETVAL Variable
-The RETVAL variable is a magic variable which always matches
-the return type of the C library function. The B<xsubpp> compiler will
-supply this variable in each XSUB and by default will use it to hold the
-return value of the C library function being called. In simple cases the
-value of RETVAL will be placed in ST(0) of the argument stack where it can
-be received by Perl as the return value of the XSUB.
+The RETVAL variable is a special C variable that is declared automatically
+for you. The C type of RETVAL matches the return type of the C library
+function. The B<xsubpp> compiler will declare this variable in each XSUB
+with non-C<void> return type. By default the generated C function
+will use RETVAL to hold the return value of the C library function being
+called. In simple cases the value of RETVAL will be placed in ST(0) of
+the argument stack where it can be received by Perl as the return value
+of the XSUB.
If the XSUB has a return type of C<void> then the compiler will
-not supply a RETVAL variable for that function. When using
-the PPCODE: directive the RETVAL variable is not needed, unless used
-explicitly.
+not declare a RETVAL variable for that function. When using
+a PPCODE: section no manipulation of the RETVAL variable is required, the
+section may use direct stack manipulation to place output values on the stack.
If PPCODE: directive is not used, C<void> return value should be used
only for subroutines which do not return a value, I<even if> CODE:
@@ -248,8 +319,9 @@ keyword.
The OUTPUT: keyword indicates that certain function parameters should be
updated (new values made visible to Perl) when the XSUB terminates or that
certain values should be returned to the calling Perl function. For
-simple functions, such as the sin() function above, the RETVAL variable is
-automatically designated as an output value. In more complex functions
+simple functions which have no CODE: or PPCODE: section,
+such as the sin() function above, the RETVAL variable is
+automatically designated as an output value. For more complex functions
the B<xsubpp> compiler will need help to determine which variables are output
variables.
@@ -268,7 +340,7 @@ be seen by Perl.
rpcb_gettime(host,timep)
char *host
time_t &timep
- OUTPUT:
+ OUTPUT:
timep
The OUTPUT: keyword will also allow an output parameter to
@@ -279,7 +351,7 @@ typemap.
rpcb_gettime(host,timep)
char *host
time_t &timep
- OUTPUT:
+ OUTPUT:
timep sv_setnv(ST(1), (double)timep);
B<xsubpp> emits an automatic C<SvSETMAGIC()> for all parameters in the
@@ -297,8 +369,8 @@ about 'set' magic.
This keyword is used in more complicated XSUBs which require
special handling for the C function. The RETVAL variable is
-available but will not be returned unless it is specified
-under the OUTPUT: keyword.
+still declared, but it will not be returned unless it is specified
+in the OUTPUT: section.
The following XSUB is for a C function which requires special handling of
its parameters. The Perl usage is given first.
@@ -311,9 +383,9 @@ The XSUB follows.
rpcb_gettime(host,timep)
char *host
time_t timep
- CODE:
+ CODE:
RETVAL = rpcb_gettime( host, &timep );
- OUTPUT:
+ OUTPUT:
timep
RETVAL
@@ -327,11 +399,24 @@ above, this keyword does not affect the way the compiler handles RETVAL.
rpcb_gettime(host,timep)
char *host
time_t &timep
- INIT:
+ INIT:
printf("# Host is %s\n", host );
- OUTPUT:
+ OUTPUT:
timep
+Another use for the INIT: section is to check for preconditions before
+making a call to the C function:
+
+ long long
+ lldiv(a,b)
+ long long a
+ long long b
+ INIT:
+ if (a == 0 && b == 0)
+ XSRETURN_UNDEF;
+ if (b == 0)
+ croak("lldiv: cannot divide by 0");
+
=head2 The NO_INIT Keyword
The NO_INIT keyword is used to indicate that a function
@@ -351,30 +436,34 @@ not care about its initial contents.
rpcb_gettime(host,timep)
char *host
time_t &timep = NO_INIT
- OUTPUT:
+ OUTPUT:
timep
=head2 Initializing Function Parameters
-Function parameters are normally initialized with their
-values from the argument stack. The typemaps contain the
-code segments which are used to transfer the Perl values to
+C function parameters are normally initialized with their values from
+the argument stack (which in turn contains the parameters that were
+passed to the XSUB from Perl). The typemaps contain the
+code segments which are used to translate the Perl values to
the C parameters. The programmer, however, is allowed to
override the typemaps and supply alternate (or additional)
-initialization code.
+initialization code. Initialization code starts with the first
+C<=>, C<;> or C<+> on a line in the INPUT: section. The only
+exception happens if this C<;> terminates the line, then this C<;>
+is quietly ignored.
The following code demonstrates how to supply initialization code for
function parameters. The initialization code is eval'd within double
quotes by the compiler before it is added to the output so anything
which should be interpreted literally [mainly C<$>, C<@>, or C<\\>]
-must be protected with backslashes. The variables C<$var>, C<$arg>,
-and C<$type> can be used as in typemaps.
+must be protected with backslashes. The variables $var, $arg,
+and $type can be used as in typemaps.
bool_t
rpcb_gettime(host,timep)
char *host = (char *)SvPV($arg,PL_na);
time_t &timep = 0;
- OUTPUT:
+ OUTPUT:
timep
This should not be used to supply default values for parameters. One
@@ -382,36 +471,47 @@ would normally use this when a function parameter must be processed by
another library function before it can be used. Default parameters are
covered in the next section.
-If the initialization begins with C<=>, then it is output on
-the same line where the input variable is declared. If the
-initialization begins with C<;> or C<+>, then it is output after
-all of the input variables have been declared. The C<=> and C<;>
-cases replace the initialization normally supplied from the typemap.
-For the C<+> case, the initialization from the typemap will precede
-the initialization code included after the C<+>. A global
+If the initialization begins with C<=>, then it is output in
+the declaration for the input variable, replacing the initialization
+supplied by the typemap. If the initialization
+begins with C<;> or C<+>, then it is performed after
+all of the input variables have been declared. In the C<;>
+case the initialization normally supplied by the typemap is not performed.
+For the C<+> case, the declaration for the variable will include the
+initialization from the typemap. A global
variable, C<%v>, is available for the truly rare case where
information from one initialization is needed in another
initialization.
+Here's a truly obscure example:
+
bool_t
rpcb_gettime(host,timep)
- time_t &timep ; /*\$v{time}=@{[$v{time}=$arg]}*/
- char *host + SvOK($v{time}) ? SvPV($arg,PL_na) : NULL;
- OUTPUT:
+ time_t &timep ; /* \$v{timep}=@{[$v{timep}=$arg]} */
+ char *host + SvOK($v{timep}) ? SvPV($arg,PL_na) : NULL;
+ OUTPUT:
timep
+The construct C<\$v{timep}=@{[$v{timep}=$arg]}> used in the above
+example has a two-fold purpose: first, when this line is processed by
+B<xsubpp>, the Perl snippet C<$v{timep}=$arg> is evaluated. Second,
+the text of the evaluated snippet is output into the generated C file
+(inside a C comment)! During the processing of C<char *host> line,
+$arg will evaluate to C<ST(0)>, and C<$v{timep}> will evaluate to
+C<ST(1)>.
+
=head2 Default Parameter Values
-Default values can be specified for function parameters by
-placing an assignment statement in the parameter list. The
-default value may be a number or a string. Defaults should
+Default values for XSUB arguments can be specified by placing an
+assignment statement in the parameter list. The default value may
+be a number, a string or the special string C<NO_INIT>. Defaults should
always be used on the right-most parameters only.
To allow the XSUB for rpcb_gettime() to have a default host
value the parameters to the XSUB could be rearranged. The
XSUB will then call the real rpcb_gettime() function with
-the parameters in the correct order. Perl will call this
-XSUB with either of the following statements.
+the parameters in the correct order. This XSUB can be called
+from Perl with either of the following statements:
$status = rpcb_gettime( $timep, $host );
@@ -425,20 +525,29 @@ the parameters in the correct order for that function.
rpcb_gettime(timep,host="localhost")
char *host
time_t timep = NO_INIT
- CODE:
+ CODE:
RETVAL = rpcb_gettime( host, &timep );
- OUTPUT:
+ OUTPUT:
timep
RETVAL
=head2 The PREINIT: Keyword
-The PREINIT: keyword allows extra variables to be declared before the
-typemaps are expanded. If a variable is declared in a CODE: block then that
-variable will follow any typemap code. This may result in a C syntax
-error. To force the variable to be declared before the typemap code, place
-it into a PREINIT: block. The PREINIT: keyword may be used one or more
-times within an XSUB.
+The PREINIT: keyword allows extra variables to be declared immediately
+before or after the declartions of the parameters from the INPUT: section
+are emitted.
+
+If a variable is declared inside a CODE: section it will follow any typemap
+code that is emitted for the input parameters. This may result in the
+declaration ending up after C code, which is C syntax error. Similar
+errors may happen with an explicit C<;>-type or C<+>-type initialization of
+parameters is used (see L<"Initializing Function Parameters">). Declaring
+these variables in an INIT: section will not help.
+
+In such cases, to force an additional variable to be declared together
+with declarations of other variables, place the declaration into a
+PREINIT: section. The PREINIT: keyword may be used one or more times
+within an XSUB.
The following examples are equivalent, but if the code is using complex
typemaps then the first example is safer.
@@ -446,23 +555,79 @@ typemaps then the first example is safer.
bool_t
rpcb_gettime(timep)
time_t timep = NO_INIT
- PREINIT:
+ PREINIT:
char *host = "localhost";
- CODE:
+ CODE:
RETVAL = rpcb_gettime( host, &timep );
- OUTPUT:
+ OUTPUT:
timep
RETVAL
-A correct, but error-prone example.
+For this particular case an INIT: keyword would generate the
+same C code as the PREINIT: keyword. Another correct, but error-prone example:
bool_t
rpcb_gettime(timep)
time_t timep = NO_INIT
- CODE:
+ CODE:
char *host = "localhost";
RETVAL = rpcb_gettime( host, &timep );
- OUTPUT:
+ OUTPUT:
+ timep
+ RETVAL
+
+Another way to declare C<host> is to use a C block in the CODE: section:
+
+ bool_t
+ rpcb_gettime(timep)
+ time_t timep = NO_INIT
+ CODE:
+ {
+ char *host = "localhost";
+ RETVAL = rpcb_gettime( host, &timep );
+ }
+ OUTPUT:
+ timep
+ RETVAL
+
+The ability to put additional declarations before the typemap entries are
+processed is very handy in the cases when typemap conversions manipulate
+some global state:
+
+ MyObject
+ mutate(o)
+ PREINIT:
+ MyState st = global_state;
+ INPUT:
+ MyObject o;
+ CLEANUP:
+ reset_to(global_state, st);
+
+Here we suppose that conversion to C<MyObject> in the INPUT: section and from
+MyObject when processing RETVAL will modify a global variable C<global_state>.
+After these conversions are performed, we restore the old value of
+C<global_state> (to avoid memory leaks, for example).
+
+There is another way to trade clarity for compactness: INPUT sections allow
+declaration of C variables which do not appear in the parameter list of
+a subroutine. Thus the above code for mutate() can be rewritten as
+
+ MyObject
+ mutate(o)
+ MyState st = global_state;
+ MyObject o;
+ CLEANUP:
+ reset_to(global_state, st);
+
+and the code for rpcb_gettime() can be rewritten as
+
+ bool_t
+ rpcb_gettime(timep)
+ time_t timep = NO_INIT
+ char *host = "localhost";
+ C_ARGS:
+ host, &timep
+ OUTPUT:
timep
RETVAL
@@ -472,8 +637,8 @@ The SCOPE: keyword allows scoping to be enabled for a particular XSUB. If
enabled, the XSUB will invoke ENTER and LEAVE automatically.
To support potentially complex type mappings, if a typemap entry used
-by this XSUB contains a comment like C</*scope*/> then scoping will
-automatically be enabled for that XSUB.
+by an XSUB contains a comment like C</*scope*/> then scoping will
+be automatically enabled for that XSUB.
To enable scoping:
@@ -497,14 +662,14 @@ evaluated late, after a PREINIT.
bool_t
rpcb_gettime(host,timep)
char *host
- PREINIT:
+ PREINIT:
time_t tt;
- INPUT:
+ INPUT:
time_t timep
- CODE:
+ CODE:
RETVAL = rpcb_gettime( host, &tt );
timep = tt;
- OUTPUT:
+ OUTPUT:
timep
RETVAL
@@ -512,22 +677,43 @@ The next example shows each input parameter evaluated late.
bool_t
rpcb_gettime(host,timep)
- PREINIT:
+ PREINIT:
time_t tt;
- INPUT:
+ INPUT:
char *host
- PREINIT:
+ PREINIT:
char *h;
- INPUT:
+ INPUT:
time_t timep
- CODE:
+ CODE:
h = host;
RETVAL = rpcb_gettime( h, &tt );
timep = tt;
- OUTPUT:
+ OUTPUT:
+ timep
+ RETVAL
+
+Since INPUT sections allow declaration of C variables which do not appear
+in the parameter list of a subroutine, this may be shortened to:
+
+ bool_t
+ rpcb_gettime(host,timep)
+ time_t tt;
+ char *host;
+ char *h = host;
+ time_t timep;
+ CODE:
+ RETVAL = rpcb_gettime( h, &tt );
+ timep = tt;
+ OUTPUT:
timep
RETVAL
+(We used our knowledge that input conversion for C<char *> is a "simple" one,
+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 Variable-length Parameter Lists
XSUBs can have variable-length parameter lists by specifying an ellipsis
@@ -551,14 +737,14 @@ The XS code, with ellipsis, follows.
bool_t
rpcb_gettime(timep, ...)
time_t timep = NO_INIT
- PREINIT:
+ PREINIT:
char *host = "localhost";
STRLEN n_a;
- CODE:
- if( items > 1 )
- host = (char *)SvPV(ST(1), n_a);
- RETVAL = rpcb_gettime( host, &timep );
- OUTPUT:
+ CODE:
+ if( items > 1 )
+ host = (char *)SvPV(ST(1), n_a);
+ RETVAL = rpcb_gettime( host, &timep );
+ OUTPUT:
timep
RETVAL
@@ -566,10 +752,10 @@ The XS code, with ellipsis, follows.
The C_ARGS: keyword allows creating of XSUBS which have different
calling sequence from Perl than from C, without a need to write
-CODE: or CPPCODE: section. The contents of the C_ARGS: paragraph is
+CODE: or PPCODE: section. The contents of the C_ARGS: paragraph is
put as the argument to the called C function without any change.
-For example, suppose that C function is declared as
+For example, suppose that a C function is declared as
symbolic nth_derivative(int n, symbolic function, int flags);
@@ -585,7 +771,7 @@ To do this, declare the XSUB as
nth_derivative(function, n)
symbolic function
int n
- C_ARGS:
+ C_ARGS:
n, function, default_flags
=head2 The PPCODE: Keyword
@@ -595,9 +781,29 @@ to tell the B<xsubpp> compiler that the programmer is supplying the code to
control the argument stack for the XSUBs return values. Occasionally one
will want an XSUB to return a list of values rather than a single value.
In these cases one must use PPCODE: and then explicitly push the list of
-values on the stack. The PPCODE: and CODE: keywords are not used
+values on the stack. The PPCODE: and CODE: keywords should not be used
together within the same XSUB.
+The actual difference between PPCODE: and CODE: sections is in the
+initialization of C<SP> macro (which stands for the I<current> Perl
+stack pointer), and in the handling of data on the stack when returning
+from an XSUB. In CODE: sections SP preserves the value which was on
+entry to the XSUB: SP is on the function pointer (which follows the
+last parameter). In PPCODE: sections SP is moved backward to the
+beginning of the parameter list, which allows C<PUSH*()> macros
+to place output values in the place Perl expects them to be when
+the XSUB returns back to Perl.
+
+The generated trailer for a CODE: section ensures that the number of return
+values Perl will see is either 0 or 1 (depending on the C<void>ness of the
+return value of the C function, and heuristics mentioned in
+L<"The RETVAL Variable">). The trailer generated for a PPCODE: section
+is based on the number of return values and on the number of times
+C<SP> was updated by C<[X]PUSH*()> macros.
+
+Note that macros C<ST(i)>, C<XST_m*()> and C<XSRETURN*()> work equally
+well in CODE: sections and PPCODE: sections.
+
The following XSUB will call the C rpcb_gettime() function
and will return its two output values, timep and status, to
Perl as a single list.
@@ -605,10 +811,10 @@ Perl as a single list.
void
rpcb_gettime(host)
char *host
- PREINIT:
+ PREINIT:
time_t timep;
bool_t status;
- PPCODE:
+ PPCODE:
status = rpcb_gettime( host, &timep );
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv(status)));
@@ -659,10 +865,10 @@ the default return value.
SV *
rpcb_gettime(host)
char * host
- PREINIT:
+ PREINIT:
time_t timep;
bool_t x;
- CODE:
+ CODE:
ST(0) = sv_newmortal();
if( rpcb_gettime( host, &timep ) )
sv_setnv( ST(0), (double)timep);
@@ -673,10 +879,10 @@ return value, should the need arise.
SV *
rpcb_gettime(host)
char * host
- PREINIT:
+ PREINIT:
time_t timep;
bool_t x;
- CODE:
+ CODE:
ST(0) = sv_newmortal();
if( rpcb_gettime( host, &timep ) ){
sv_setnv( ST(0), (double)timep);
@@ -691,14 +897,14 @@ then not push return values on the stack.
void
rpcb_gettime(host)
char *host
- PREINIT:
+ PREINIT:
time_t timep;
- PPCODE:
+ PPCODE:
if( rpcb_gettime( host, &timep ) )
PUSHs(sv_2mortal(newSViv(timep)));
else{
- /* Nothing pushed on stack, so an empty */
- /* list is implicitly returned. */
+ /* Nothing pushed on stack, so an empty
+ * list is implicitly returned. */
}
Some people may be inclined to include an explicit C<return> in the above
@@ -707,6 +913,32 @@ situations C<XSRETURN_EMPTY> should be used, instead. This will ensure that
the XSUB stack is properly adjusted. Consult L<perlguts/"API LISTING"> for
other C<XSRETURN> macros.
+Since C<XSRETURN_*> macros can be used with CODE blocks as well, one can
+rewrite this example as:
+
+ int
+ rpcb_gettime(host)
+ char *host
+ PREINIT:
+ time_t timep;
+ CODE:
+ RETVAL = rpcb_gettime( host, &timep );
+ if (RETVAL == 0)
+ XSRETURN_UNDEF;
+ OUTPUT:
+ RETVAL
+
+In fact, one can put this check into a CLEANUP: section as well. Together
+with PREINIT: simplifications, this leads to:
+
+ int
+ rpcb_gettime(host)
+ char *host
+ time_t timep;
+ CLEANUP:
+ if (RETVAL == 0)
+ XSRETURN_UNDEF;
+
=head2 The REQUIRE: Keyword
The REQUIRE: keyword is used to indicate the minimum version of the
@@ -784,15 +1016,15 @@ prototypes.
bool_t
rpcb_gettime(timep, ...)
time_t timep = NO_INIT
- PROTOTYPE: $;$
- PREINIT:
+ PROTOTYPE: $;$
+ PREINIT:
char *host = "localhost";
STRLEN n_a;
- CODE:
+ CODE:
if( items > 1 )
host = (char *)SvPV(ST(1), n_a);
RETVAL = rpcb_gettime( host, &timep );
- OUTPUT:
+ OUTPUT:
timep
RETVAL
@@ -812,12 +1044,12 @@ C<BAR::getit()> for this function.
rpcb_gettime(host,timep)
char *host
time_t &timep
- ALIAS:
+ ALIAS:
FOO::gettime = 1
BAR::getit = 2
- INIT:
+ INIT:
printf("# ix = %d\n", ix );
- OUTPUT:
+ OUTPUT:
timep
=head2 The INTERFACE: Keyword
@@ -825,14 +1057,14 @@ C<BAR::getit()> for this function.
This keyword declares the current XSUB as a keeper of the given
calling signature. If some text follows this keyword, it is
considered as a list of functions which have this signature, and
-should be attached to XSUBs.
+should be attached to the current XSUB.
-Say, if you have 4 functions multiply(), divide(), add(), subtract() all
-having the signature
+For example, if you have 4 C functions multiply(), divide(), add(),
+subtract() all having the signature:
symbolic f(symbolic, symbolic);
-you code them all by using XSUB
+you can make them all to use the same XSUB using this:
symbolic
interface_s_ss(arg1, arg2)
@@ -842,16 +1074,21 @@ you code them all by using XSUB
multiply divide
add subtract
-The advantage of this approach comparing to ALIAS: keyword is that one
+(This is the complete XSUB code for 4 Perl functions!) Four generated
+Perl function share names with corresponding C functions.
+
+The advantage of this approach comparing to ALIAS: keyword is that there
+is no need to code a switch statement, each Perl function (which shares
+the same XSUB) knows which C function it should call. Additionally, one
can attach an extra function remainder() at runtime by using
-
+
CV *mycv = newXSproto("Symbolic::remainder",
XS_Symbolic_interface_s_ss, __FILE__, "$$");
XSINTERFACE_FUNC_SET(mycv, remainder);
-(This example supposes that there was no INTERFACE_MACRO: section,
-otherwise one needs to use something else instead of
-C<XSINTERFACE_FUNC_SET>.)
+say, from another XSUB. (This example supposes that there was no
+INTERFACE_MACRO: section, otherwise one needs to use something else instead of
+C<XSINTERFACE_FUNC_SET>, see the next section.)
=head2 The INTERFACE_MACRO: Keyword
@@ -882,10 +1119,10 @@ in C section,
interface_s_ss(arg1, arg2)
symbolic arg1
symbolic arg2
- INTERFACE_MACRO:
+ INTERFACE_MACRO:
XSINTERFACE_FUNC_BYOFFSET
XSINTERFACE_FUNC_BYOFFSET_set
- INTERFACE:
+ INTERFACE:
multiply divide
add subtract
@@ -903,7 +1140,7 @@ The file F<Rpcb1.xsh> contains our C<rpcb_gettime()> function:
rpcb_gettime(host,timep)
char *host
time_t &timep
- OUTPUT:
+ OUTPUT:
timep
The XS module can use INCLUDE: to pull that file into it.
@@ -936,22 +1173,22 @@ reversed, C<(time_t *timep, char *host)>.
long
rpcb_gettime(a,b)
CASE: ix == 1
- ALIAS:
+ ALIAS:
x_gettime = 1
- INPUT:
+ INPUT:
# 'a' is timep, 'b' is host
char *b
time_t a = NO_INIT
- CODE:
+ CODE:
RETVAL = rpcb_gettime( b, &a );
- OUTPUT:
+ OUTPUT:
a
RETVAL
CASE:
# 'a' is host, 'b' is timep
char *a
time_t &b = NO_INIT
- OUTPUT:
+ OUTPUT:
b
RETVAL
@@ -964,12 +1201,15 @@ the different argument lists.
=head2 The & Unary Operator
-The & unary operator is used to tell the compiler that it should dereference
-the object when it calls the C function. This is used when a CODE: block is
-not used and the object is a not a pointer type (the object is an C<int> or
-C<long> but not a C<int*> or C<long*>).
+The C<&> unary operator in the INPUT: section is used to tell B<xsubpp>
+that it should convert a Perl value to/from C using the C type to the left
+of C<&>, but provide a pointer to this value when the C function is called.
-The following XSUB will generate incorrect C code. The xsubpp compiler will
+This is useful to avoid a CODE: block for a C function which takes a parameter
+by reference. Typically, the parameter should be not a pointer type (an
+C<int> or C<long> but not a C<int*> or C<long*>).
+
+The following XSUB will generate incorrect C code. The B<xsubpp> compiler will
turn this into code which calls C<rpcb_gettime()> with parameters C<(char
*host, time_t timep)>, but the real C<rpcb_gettime()> wants the C<timep>
parameter to be of type C<time_t*> rather than C<time_t>.
@@ -978,10 +1218,10 @@ parameter to be of type C<time_t*> rather than C<time_t>.
rpcb_gettime(host,timep)
char *host
time_t timep
- OUTPUT:
+ OUTPUT:
timep
-That problem is corrected by using the C<&> operator. The xsubpp compiler
+That problem is corrected by using the C<&> operator. The B<xsubpp> compiler
will now turn this into code which calls C<rpcb_gettime()> correctly with
parameters C<(char *host, time_t *timep)>. It does this by carrying the
C<&> through, so the function call looks like C<rpcb_gettime(host, &timep)>.
@@ -990,7 +1230,7 @@ C<&> through, so the function call looks like C<rpcb_gettime(host, &timep)>.
rpcb_gettime(host,timep)
char *host
time_t &timep
- OUTPUT:
+ OUTPUT:
timep
=head2 Inserting Comments and C Preprocessor Directives
@@ -1021,13 +1261,14 @@ and not
#if ... version2
#endif
-because otherwise xsubpp will believe that you made a duplicate
+because otherwise B<xsubpp> will believe that you made a duplicate
definition of the function. Also, put a blank line before the
#else/#endif so it will not be seen as part of the function body.
=head2 Using XS With C++
-If a function is defined as a C++ method then it will assume
+If an XSUB name contains C<::>, it is considered to be a C++ method.
+The generated Perl function will assume that
its first argument is an object pointer. The object pointer
will be stored in a variable called THIS. The object should
have been created by C++ with the new() function and should
@@ -1035,7 +1276,8 @@ be blessed by Perl with the sv_setref_pv() macro. The
blessing of the object by Perl can be handled by a typemap. An example
typemap is shown at the end of this section.
-If the method is defined as static it will call the C++
+If the return type of the XSUB includes C<static>, the method is considered
+to be a static method. It will call the C++
function using the class::method() syntax. If the method is not static
the function will be called using the THIS-E<gt>method() syntax.
@@ -1063,22 +1305,37 @@ not listed.
color::set_blue( val )
int val
-Both functions will expect an object as the first parameter. The xsubpp
-compiler will call that object C<THIS> and will use it to call the specified
-method. So in the C++ code the blue() and set_blue() methods will be called
-in the following manner.
+Both Perl functions will expect an object as the first parameter. In the
+generated C++ code the object is called C<THIS>, and the method call will
+be performed on this object. So in the C++ code the blue() and set_blue()
+methods will be called as this:
RETVAL = THIS->blue();
THIS->set_blue( val );
+You could also write a single get/set method using an optional argument:
+
+ int
+ color::blue( val = NO_INIT )
+ int val
+ PROTOTYPE $;$
+ CODE:
+ if (items > 1)
+ THIS->set_blue( val );
+ RETVAL = THIS->blue();
+ OUTPUT:
+ RETVAL
+
If the function's name is B<DESTROY> then the C++ C<delete> function will be
-called and C<THIS> will be given as its parameter.
+called and C<THIS> will be given as its parameter. The generated C++ code for
void
color::DESTROY()
-The C++ code will call C<delete>.
+will look like this:
+
+ color *THIS = ...; // Initialized as in typemap
delete THIS;
@@ -1090,9 +1347,9 @@ argument.
color *
color::new()
-The C++ code will call C<new>.
+The generated C++ code will call C<new>.
- RETVAL = new color();
+ RETVAL = new color();
The following is an example of a typemap that could be used for this C++
example.
@@ -1118,30 +1375,59 @@ example.
=head2 Interface Strategy
When designing an interface between Perl and a C library a straight
-translation from C to XS is often sufficient. The interface will often be
+translation from C to XS (such as created by C<h2xs -x>) is often sufficient.
+However, sometimes the interface will look
very C-like and occasionally nonintuitive, especially when the C function
-modifies one of its parameters. In cases where the programmer wishes to
+modifies one of its parameters, or returns failure inband (as in "negative
+return values mean failure"). In cases where the programmer wishes to
create a more Perl-like interface the following strategy may help to
identify the more critical parts of the interface.
-Identify the C functions which modify their parameters. The XSUBs for
-these functions may be able to return lists to Perl, or may be
-candidates to return undef or an empty list in case of failure.
+Identify the C functions with input/output or output parameters. The XSUBs for
+these functions may be able to return lists to Perl.
+
+Identify the C functions which use some inband info as an indication
+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
+failure. In more complicated cases use CODE: or PPCODE: sections.
+
+If many functions use the same failure indication based on the return value,
+you may want to create a special typedef to handle this situation. Put
+
+ typedef int negative_is_failure;
+
+near the beginning of XS file, and create an OUTPUT typemap entry
+for C<negative_is_failure> which converts negative values to C<undef>, or
+maybe croak()s. After this the return value of type C<negative_is_failure>
+will create more Perl-like interface.
Identify which values are used by only the C and XSUB functions
-themselves. If Perl does not need to access the contents of the value
+themselves, say, when a parameter to a function should be a contents of a
+global variable. If Perl does not need to access the contents of the value
then it may not be necessary to provide a translation for that value
from C to Perl.
Identify the pointers in the C function parameter lists and return
-values. Some pointers can be handled in XS with the & unary operator on
-the variable name while others will require the use of the * operator on
-the type name. In general it is easier to work with the & operator.
+values. Some pointers may be used to implement input/output or
+output parameters, they can be handled in XS with the C<&> unary operator,
+and, possibly, using the NO_INIT keyword.
+Some others will require handling of types like C<int *>, and one needs
+to decide what a useful Perl translation will do in such a case. When
+the semantic is clear, it is advisable to put the translation into a typemap
+file.
Identify the structures used by the C functions. In many
cases it may be helpful to use the T_PTROBJ typemap for
these structures so they can be manipulated by Perl as
-blessed objects.
+blessed objects. (This is handled automatically by C<h2xs -x>.)
+
+If the same C type is used in several different contexts which require
+different translations, C<typedef> several new types mapped to this C type,
+and create separate F<typemap> entries for these new types. Use these
+types in declarations of return type and parameters to XSUBs.
=head2 Perl Objects And C Structures
@@ -1188,7 +1474,7 @@ trim the name to the word DESTROY as Perl will expect.
void
rpcb_DESTROY(netconf)
Netconfig *netconf
- CODE:
+ CODE:
printf("Now in NetconfigPtr::DESTROY\n");
free( netconf );
@@ -1214,8 +1500,8 @@ getnetconfigent() XSUB and an object created by a normal Perl subroutine.
The typemap is a collection of code fragments which are used by the B<xsubpp>
compiler to map C function parameters and values to Perl values. The
typemap file may consist of three sections labeled C<TYPEMAP>, C<INPUT>, and
-C<OUTPUT>. Any unlabelled initial section is assumed to be a C<TYPEMAP>
-section if a name is not explicitly specified. The INPUT section tells
+C<OUTPUT>. An unlabelled initial section is assumed to be a C<TYPEMAP>
+section. The INPUT section tells
the compiler how to translate Perl values
into variables of certain C types. The OUTPUT section tells the compiler
how to translate the values from certain C types into values Perl can
@@ -1239,8 +1525,8 @@ with the T_PTROBJ typemap. The typemap used by getnetconfigent() is shown
here. Note that the C type is separated from the XS type with a tab and
that the C unary operator C<*> is considered to be a part of the C type name.
- TYPEMAP
- Netconfig *<tab>T_PTROBJ
+ TYPEMAP
+ Netconfig *<tab>T_PTROBJ
Here's a more complicated example: suppose that you wanted C<struct
netconfig> to be blessed into the class C<Net::Config>. One way to do
@@ -1290,9 +1576,9 @@ File C<RPC.xs>: Interface to some ONC+ RPC bind library functions.
SV *
rpcb_gettime(host="localhost")
char *host
- PREINIT:
+ PREINIT:
time_t timep;
- CODE:
+ CODE:
ST(0) = sv_newmortal();
if( rpcb_gettime( host, &timep ) )
sv_setnv( ST(0), (double)timep );
@@ -1306,7 +1592,7 @@ File C<RPC.xs>: Interface to some ONC+ RPC bind library functions.
void
rpcb_DESTROY(netconf)
Netconfig *netconf
- CODE:
+ CODE:
printf("NetconfigPtr::DESTROY\n");
free( netconf );
@@ -1348,5 +1634,6 @@ This document covers features supported by C<xsubpp> 1.935.
=head1 AUTHOR
-Dean Roehrich <F<roehrich@cray.com>>
-Jul 8, 1996
+Originally written by Dean Roehrich <F<roehrich@cray.com>>.
+
+Maintained since 1996 by The Perl Porters <F<perlbug@perl.com>>.
diff --git a/contrib/perl5/pod/perlxstut.pod b/contrib/perl5/pod/perlxstut.pod
index 69a1a25..d79f4b9 100644
--- a/contrib/perl5/pod/perlxstut.pod
+++ b/contrib/perl5/pod/perlxstut.pod
@@ -1,6 +1,6 @@
=head1 NAME
-perlXStut - Tutorial for XSUBs
+perlXStut - Tutorial for writing XSUBs
=head1 DESCRIPTION
@@ -10,61 +10,57 @@ L<perlxs>.
This tutorial starts with very simple examples and becomes more complex,
with each new example adding new features. Certain concepts may not be
-completely explained until later in the tutorial to ease the
-reader slowly into building extensions.
+completely explained until later in the tutorial in order to slowly ease
+the reader into building extensions.
-=head2 VERSION CAVEAT
+This tutorial was written from a Unix point of view. Where I know them
+to be otherwise different for other platforms (e.g. Win32), I will list
+them. If you find something that was missed, please let me know.
-This tutorial tries hard to keep up with the latest development versions
-of Perl. This often means that it is sometimes in advance of the latest
-released version of Perl, and that certain features described here might
-not work on earlier versions. This section will keep track of when various
-features were added to Perl 5.
+=head1 SPECIAL NOTES
-=over 4
-
-=item *
-
-In versions of Perl 5.002 prior to the gamma version, the test script
-in Example 1 will not function properly. You need to change the "use
-lib" line to read:
-
- use lib './blib';
-
-=item *
-
-In versions of Perl 5.002 prior to version beta 3, the line in the .xs file
-about "PROTOTYPES: DISABLE" will cause a compiler error. Simply remove that
-line from the file.
-
-=item *
-
-In versions of Perl 5.002 prior to version 5.002b1h, the test.pl file was not
-automatically created by h2xs. This means that you cannot say "make test"
-to run the test script. You will need to add the following line before the
-"use extension" statement:
+=head2 make
- use lib './blib';
+This tutorial assumes that the make program that Perl is configured to
+use is called C<make>. Instead of running "make" in the examples that
+follow, you may have to substitute whatever make program Perl has been
+configured to use. Running B<perl -V:make> should tell you what it is.
-=item *
+=head2 Version caveat
-In versions 5.000 and 5.001, instead of using the above line, you will need
-to use the following line:
+When writing a Perl extension for general consumption, one should expect that
+the extension will be used with versions of Perl different from the
+version available on your machine. Since you are reading this document,
+the version of Perl on your machine is probably 5.005 or later, but the users
+of your extension may have more ancient versions.
- BEGIN { unshift(@INC, "./blib") }
+To understand what kinds of incompatibilities one may expect, and in the rare
+case that the version of Perl on your machine is older than this document,
+see the section on "Troubleshooting these Examples" for more information.
-=item *
+If your extension uses some features of Perl which are not available on older
+releases of Perl, your users would appreciate an early meaningful warning.
+You would probably put this information into the F<README> file, but nowadays
+installation of extensions may be performed automatically, guided by F<CPAN.pm>
+module or other tools.
-This document assumes that the executable named "perl" is Perl version 5.
-Some systems may have installed Perl version 5 as "perl5".
+In MakeMaker-based installations, F<Makefile.PL> provides the earliest
+opportunity to perform version checks. One can put something like this
+in F<Makefile.PL> for this purpose:
-=back
+ eval { require 5.007 }
+ or die <<EOD;
+ ############
+ ### This module uses frobnication framework which is not available before
+ ### version 5.007 of Perl. Upgrade your Perl before installing Kara::Mba.
+ ############
+ EOD
-=head2 DYNAMIC VERSUS STATIC
+=head2 Dynamic Loading versus Static Loading
It is commonly thought that if a system does not have the capability to
-load a library dynamically, you cannot build XSUBs. This is incorrect.
-You I<can> build them, but you must link the XSUB's subroutines with the
+dynamically load a library, you cannot build XSUBs. This is incorrect.
+You I<can> build them, but you must link the XSUBs subroutines with the
rest of Perl, creating a new executable. This situation is similar to
Perl 4.
@@ -75,25 +71,30 @@ executable with that static library linked in.
Should you wish to build a statically-linked executable on a system which
can dynamically load libraries, you may, in all the following examples,
-where the command "make" with no arguments is executed, run the command
-"make perl" instead.
+where the command "C<make>" with no arguments is executed, run the command
+"C<make perl>" instead.
If you have generated such a statically-linked executable by choice, then
-instead of saying "make test", you should say "make test_static". On systems
-that cannot build dynamically-loadable libraries at all, simply saying "make
-test" is sufficient.
+instead of saying "C<make test>", you should say "C<make test_static>".
+On systems that cannot build dynamically-loadable libraries at all, simply
+saying "C<make test>" is sufficient.
+
+=head1 TUTORIAL
+
+Now let's go on with the show!
=head2 EXAMPLE 1
Our first extension will be very simple. When we call the routine in the
extension, it will print out a well-known message and return.
-Run C<h2xs -A -n Mytest>. This creates a directory named Mytest, possibly under
-ext/ if that directory exists in the current working directory. Several files
-will be created in the Mytest dir, including MANIFEST, Makefile.PL, Mytest.pm,
-Mytest.xs, test.pl, and Changes.
+Run "C<h2xs -A -n Mytest>". This creates a directory named Mytest,
+possibly under ext/ if that directory exists in the current working
+directory. Several files will be created in the Mytest dir, including
+MANIFEST, Makefile.PL, Mytest.pm, Mytest.xs, test.pl, and Changes.
-The MANIFEST file contains the names of all the files created.
+The MANIFEST file contains the names of all the files just created in the
+Mytest directory.
The file Makefile.PL should look something like this:
@@ -101,28 +102,31 @@ The file Makefile.PL should look something like this:
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
- 'NAME' => 'Mytest',
- 'VERSION_FROM' => 'Mytest.pm', # finds $VERSION
- 'LIBS' => [''], # e.g., '-lm'
- 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
- 'INC' => '', # e.g., '-I/usr/include/other'
+ NAME => 'Mytest',
+ VERSION_FROM => 'Mytest.pm', # finds $VERSION
+ LIBS => [''], # e.g., '-lm'
+ DEFINE => '', # e.g., '-DHAVE_SOMETHING'
+ INC => '', # e.g., '-I/usr/include/other'
);
The file Mytest.pm should start with something like this:
package Mytest;
+ use strict;
+ use warnings;
+
require Exporter;
require DynaLoader;
- @ISA = qw(Exporter DynaLoader);
+ our @ISA = qw(Exporter DynaLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
- @EXPORT = qw(
+ our @EXPORT = qw(
);
- $VERSION = '0.01';
+ our $VERSION = '0.01';
bootstrap Mytest $VERSION;
@@ -134,19 +138,14 @@ The file Mytest.pm should start with something like this:
__END__
# Below is the stub of documentation for your module. You better edit it!
-And the Mytest.xs file should look something like this:
+The rest of the .pm file contains sample code for providing documentation for
+the extension.
+
+Finally, the Mytest.xs file should look something like this:
- #ifdef __cplusplus
- extern "C" {
- #endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
- #ifdef __cplusplus
- }
- #endif
-
- PROTOTYPES: DISABLE
MODULE = Mytest PACKAGE = Mytest
@@ -154,10 +153,14 @@ Let's edit the .xs file by adding this to the end of the file:
void
hello()
- CODE:
+ CODE:
printf("Hello, world!\n");
-Now we'll run "perl Makefile.PL". This will create a real Makefile,
+It is okay for the lines starting at the "CODE:" line to not be indented.
+However, for readability purposes, it is suggested that you indent CODE:
+one level and the lines following one more level.
+
+Now we'll run "C<perl Makefile.PL>". This will create a real Makefile,
which make needs. Its output looks something like:
% perl Makefile.PL
@@ -166,12 +169,14 @@ which make needs. Its output looks something like:
Writing Makefile for Mytest
%
-Now, running make will produce output that looks something like this
-(some long lines shortened for clarity):
+Now, running make will produce output that looks something like this (some
+long lines have been shortened for clarity and some extraneous lines have
+been deleted):
% make
umask 0 && cp Mytest.pm ./blib/Mytest.pm
perl xsubpp -typemap typemap Mytest.xs >Mytest.tc && mv Mytest.tc Mytest.c
+ Please specify prototyping behavior for Mytest.xs (see perlxs manual)
cc -c Mytest.c
Running Mkbootstrap for Mytest ()
chmod 644 Mytest.bs
@@ -179,9 +184,21 @@ Now, running make will produce output that looks something like this
chmod 755 ./blib/PA-RISC1.1/auto/Mytest/Mytest.sl
cp Mytest.bs ./blib/PA-RISC1.1/auto/Mytest/Mytest.bs
chmod 644 ./blib/PA-RISC1.1/auto/Mytest/Mytest.bs
+ Manifying ./blib/man3/Mytest.3
+ %
+
+You can safely ignore the line about "prototyping behavior".
+
+If you are on a Win32 system, and the build process fails with linker
+errors for functions in the C library, check if your Perl is configured
+to use PerlCRT (running B<perl -V:libc> should show you if this is the
+case). If Perl is configured to use PerlCRT, you have to make sure
+PerlCRT.lib is copied to the same location that msvcrt.lib lives in,
+so that the compiler can find it on its own. msvcrt.lib is usually
+found in the Visual C compiler's lib directory (e.g. C:/DevStudio/VC/lib).
-Now, although there is already a test.pl template ready for us, for this
-example only, we'll create a special test script. Create a file called hello
+Perl has its own special way of easily writing test scripts, but for this
+example only, we'll create our own test script. Create a file called hello
that looks like this:
#! /opt/perl5/bin/perl
@@ -192,42 +209,40 @@ that looks like this:
Mytest::hello();
-Now we run the script and we should see the following output:
+Now we make the script executable (C<chmod -x hello>), run the script
+and we should see the following output:
- % perl hello
+ % ./hello
Hello, world!
%
=head2 EXAMPLE 2
-Now let's add to our extension a subroutine that will take a single argument
-and return 1 if the argument is even, 0 if the argument is odd.
+Now let's add to our extension a subroutine that will take a single numeric
+argument as input and return 0 if the number is even or 1 if the number
+is odd.
Add the following to the end of Mytest.xs:
int
is_even(input)
int input
- CODE:
+ CODE:
RETVAL = (input % 2 == 0);
- OUTPUT:
+ OUTPUT:
RETVAL
-There does not need to be white space at the start of the "int input" line,
-but it is useful for improving readability. The semi-colon at the end of
-that line is also optional.
+There does not need to be white space at the start of the "C<int input>"
+line, but it is useful for improving readability. Placing a semi-colon at
+the end of that line is also optional. Any amount and kind of white space
+may be placed between the "C<int>" and "C<input>".
-Any white space may be between the "int" and "input". It is also okay for
-the four lines starting at the "CODE:" line to not be indented. However,
-for readability purposes, it is suggested that you indent them 8 spaces
-(or one normal tab stop).
-
-Now rerun make to rebuild our new shared library.
+Now re-run make to rebuild our new shared library.
Now perform the same steps as before, generating a Makefile from the
Makefile.PL file, and running make.
-To test that our extension works, we now need to look at the
+In order to test that our extension works, we now need to look at the
file test.pl. This file is set up to imitate the same kind of testing
structure that Perl itself has. Within the test script, you perform a
number of tests to confirm the behavior of the extension, printing "ok"
@@ -239,11 +254,11 @@ to the end of the file:
print &Mytest::is_even(1) == 0 ? "ok 3" : "not ok 3", "\n";
print &Mytest::is_even(2) == 1 ? "ok 4" : "not ok 4", "\n";
-We will be calling the test script through the command "make test". You
+We will be calling the test script through the command "C<make test>". You
should see output that looks something like this:
% make test
- PERL_DL_NONLAZY=1 /opt/perl5.002b2/bin/perl (lots of -I arguments) test.pl
+ PERL_DL_NONLAZY=1 /opt/perl5.004/bin/perl (lots of -I arguments) test.pl
1..4
ok 1
ok 2
@@ -251,7 +266,7 @@ should see output that looks something like this:
ok 4
%
-=head2 WHAT HAS GONE ON?
+=head2 What has gone on?
The program h2xs is the starting point for creating extensions. In later
examples we'll see how we can use h2xs to read header files and generate
@@ -261,71 +276,72 @@ h2xs creates a number of files in the extension directory. The file
Makefile.PL is a perl script which will generate a true Makefile to build
the extension. We'll take a closer look at it later.
-The files E<lt>extensionE<gt>.pm and E<lt>extensionE<gt>.xs contain the meat
-of the extension.
-The .xs file holds the C routines that make up the extension. The .pm file
-contains routines that tell Perl how to load your extension.
-
-Generating and invoking the Makefile created a directory blib (which stands
-for "build library") in the current working directory. This directory will
-contain the shared library that we will build. Once we have tested it, we
-can install it into its final location.
-
-Invoking the test script via "make test" did something very important. It
-invoked perl with all those C<-I> arguments so that it could find the various
-files that are part of the extension.
-
-It is I<very> important that while you are still testing extensions that
-you use "make test". If you try to run the test script all by itself, you
-will get a fatal error.
-
-Another reason it is important to use "make test" to run your test script
-is that if you are testing an upgrade to an already-existing version, using
-"make test" insures that you use your new extension, not the already-existing
-version.
+The .pm and .xs files contain the meat of the extension. The .xs file holds
+the C routines that make up the extension. The .pm file contains routines
+that tell Perl how to load your extension.
+
+Generating the Makefile and running C<make> created a directory called blib
+(which stands for "build library") in the current working directory. This
+directory will contain the shared library that we will build. Once we have
+tested it, we can install it into its final location.
+
+Invoking the test script via "C<make test>" did something very important.
+It invoked perl with all those C<-I> arguments so that it could find the
+various files that are part of the extension. It is I<very> important that
+while you are still testing extensions that you use "C<make test>". If you
+try to run the test script all by itself, you will get a fatal error.
+Another reason it is important to use "C<make test>" to run your test
+script is that if you are testing an upgrade to an already-existing version,
+using "C<make test>" insures that you will test your new extension, not the
+already-existing version.
When Perl sees a C<use extension;>, it searches for a file with the same name
-as the use'd extension that has a .pm suffix. If that file cannot be found,
+as the C<use>'d extension that has a .pm suffix. If that file cannot be found,
Perl dies with a fatal error. The default search path is contained in the
-@INC array.
+C<@INC> array.
In our case, Mytest.pm tells perl that it will need the Exporter and Dynamic
-Loader extensions. It then sets the @ISA and @EXPORT arrays and the $VERSION
-scalar; finally it tells perl to bootstrap the module. Perl will call its
-dynamic loader routine (if there is one) and load the shared library.
+Loader extensions. It then sets the C<@ISA> and C<@EXPORT> arrays and the
+C<$VERSION> scalar; finally it tells perl to bootstrap the module. Perl
+will call its dynamic loader routine (if there is one) and load the shared
+library.
-The two arrays that are set in the .pm file are very important. The @ISA
+The two arrays C<@ISA> and C<@EXPORT> are very important. The C<@ISA>
array contains a list of other packages in which to search for methods (or
-subroutines) that do not exist in the current package. The @EXPORT array
-tells Perl which of the extension's routines should be placed into the
-calling package's namespace.
+subroutines) that do not exist in the current package. This is usually
+only important for object-oriented extensions (which we will talk about
+much later), and so usually doesn't need to be modified.
-It's important to select what to export carefully. Do NOT export method names
-and do NOT export anything else I<by default> without a good reason.
+The C<@EXPORT> array tells Perl which of the extension's variables and
+subroutines should be placed into the calling package's namespace. Because
+you don't know if the user has already used your variable and subroutine
+names, it's vitally important to carefully select what to export. Do I<not>
+export method or variable names I<by default> without a good reason.
As a general rule, if the module is trying to be object-oriented then don't
-export anything. If it's just a collection of functions then you can export
-any of the functions via another array, called @EXPORT_OK.
+export anything. If it's just a collection of functions and variables, then
+you can export them via another array, called C<@EXPORT_OK>. This array
+does not automatically place its subroutine and variable names into the
+namespace unless the user specifically requests that this be done.
See L<perlmod> for more information.
-The $VERSION variable is used to ensure that the .pm file and the shared
+The C<$VERSION> variable is used to ensure that the .pm file and the shared
library are "in sync" with each other. Any time you make changes to
the .pm or .xs files, you should increment the value of this variable.
-=head2 WRITING GOOD TEST SCRIPTS
+=head2 Writing good test scripts
The importance of writing good test scripts cannot be overemphasized. You
should closely follow the "ok/not ok" style that Perl itself uses, so that
it is very easy and unambiguous to determine the outcome of each test case.
When you find and fix a bug, make sure you add a test case for it.
-By running "make test", you ensure that your test.pl script runs and uses
+By running "C<make test>", you ensure that your test.pl script runs and uses
the correct version of your extension. If you have many test cases, you
-might want to copy Perl's test style. Create a directory named "t", and
-ensure all your test files end with the suffix ".t". The Makefile will
-properly run all these test files.
-
+might want to copy Perl's test style. Create a directory named "t" in the
+extension's directory and append the suffix ".t" to the names of your test
+files. When you run "C<make test>", all of these test files will be executed.
=head2 EXAMPLE 3
@@ -337,7 +353,7 @@ Add the following to the end of Mytest.xs:
void
round(arg)
double arg
- CODE:
+ CODE:
if (arg > 0.0) {
arg = floor(arg + 0.5);
} else if (arg < 0.0) {
@@ -345,14 +361,14 @@ Add the following to the end of Mytest.xs:
} else {
arg = 0.0;
}
- OUTPUT:
+ OUTPUT:
arg
Edit the Makefile.PL file so that the corresponding line looks like this:
'LIBS' => ['-lm'], # e.g., '-lm'
-Generate the Makefile and run make. Change the BEGIN block to print out
+Generate the Makefile and run make. Change the BEGIN block to print
"1..9" and add the following to test.pl:
$i = -1.5; &Mytest::round($i); print $i == -2.0 ? "ok 5" : "not ok 5", "\n";
@@ -361,58 +377,70 @@ Generate the Makefile and run make. Change the BEGIN block to print out
$i = 0.5; &Mytest::round($i); print $i == 1.0 ? "ok 8" : "not ok 8", "\n";
$i = 1.2; &Mytest::round($i); print $i == 1.0 ? "ok 9" : "not ok 9", "\n";
-Running "make test" should now print out that all nine tests are okay.
+Running "C<make test>" should now print out that all nine tests are okay.
-You might be wondering if you can round a constant. To see what happens, add
-the following line to test.pl temporarily:
+Notice that in these new test cases, the argument passed to round was a
+scalar variable. You might be wondering if you can round a constant or
+literal. To see what happens, temporarily add the following line to test.pl:
&Mytest::round(3);
-Run "make test" and notice that Perl dies with a fatal error. Perl won't let
-you change the value of constants!
+Run "C<make test>" and notice that Perl dies with a fatal error. Perl won't
+let you change the value of constants!
+
+=head2 What's new here?
+
+=over 4
+
+=item *
+
+We've made some changes to Makefile.PL. In this case, we've specified an
+extra library to be linked into the extension's shared library, the math
+library libm in this case. We'll talk later about how to write XSUBs that
+can call every routine in a library.
-=head2 WHAT'S NEW HERE?
+=item *
-Two things are new here. First, we've made some changes to Makefile.PL.
-In this case, we've specified an extra library to link in, the math library
-libm. We'll talk later about how to write XSUBs that can call every routine
-in a library.
+The value of the function is not being passed back as the function's return
+value, but by changing the value of the variable that was passed into the
+function. You might have guessed that when you saw that the return value
+of round is of type "void".
-Second, the value of the function is being passed back not as the function's
-return value, but through the same variable that was passed into the function.
+=back
-=head2 INPUT AND OUTPUT PARAMETERS
+=head2 Input and Output Parameters
-You specify the parameters that will be passed into the XSUB just after you
-declare the function return value and name. Each parameter line starts with
-optional white space, and may have an optional terminating semicolon.
+You specify the parameters that will be passed into the XSUB on the line(s)
+after you declare the function's return value and name. Each input parameter
+line starts with optional white space, and may have an optional terminating
+semicolon.
-The list of output parameters occurs after the OUTPUT: directive. The use
-of RETVAL tells Perl that you wish to send this value back as the return
-value of the XSUB function. In Example 3, the value we wanted returned was
-contained in the same variable we passed in, so we listed it (and not RETVAL)
-in the OUTPUT: section.
+The list of output parameters occurs at the very end of the function, just
+before after the OUTPUT: directive. The use of RETVAL tells Perl that you
+wish to send this value back as the return value of the XSUB function. In
+Example 3, we wanted the "return value" placed in the original variable
+which we passed in, so we listed it (and not RETVAL) in the OUTPUT: section.
-=head2 THE XSUBPP COMPILER
+=head2 The XSUBPP Program
-The compiler xsubpp takes the XS code in the .xs file and converts it into
+The B<xsubpp> program takes the XS code in the .xs file and translates it into
C code, placing it in a file whose suffix is .c. The C code created makes
heavy use of the C functions within Perl.
-=head2 THE TYPEMAP FILE
+=head2 The TYPEMAP file
-The xsubpp compiler uses rules to convert from Perl's data types (scalar,
-array, etc.) to C's data types (int, char *, etc.). These rules are stored
+The B<xsubpp> program uses rules to convert from Perl's data types (scalar,
+array, etc.) to C's data types (int, char, etc.). These rules are stored
in the typemap file ($PERLLIB/ExtUtils/typemap). This file is split into
three parts.
-The first part attempts to map various C data types to a coded flag, which
-has some correspondence with the various Perl types. The second part contains
-C code which xsubpp uses for input parameters. The third part contains C
-code which xsubpp uses for output parameters. We'll talk more about the
-C code later.
+The first section maps various C data types to a name, which corresponds
+somewhat with the various Perl types. The second section contains C code
+which B<xsubpp> uses to handle input parameters. The third section contains
+C code which B<xsubpp> uses to handle output parameters.
-Let's now take a look at a portion of the .c file created for our extension.
+Let's take a look at a portion of the .c file created for our extension.
+The file name is Mytest.c:
XS(XS_Mytest_round)
{
@@ -428,13 +456,13 @@ Let's now take a look at a portion of the .c file created for our extension.
} else {
arg = 0.0;
}
- sv_setnv(ST(0), (double)arg); /* XXXXX */
+ sv_setnv(ST(0), (double)arg); /* XXXXX */
}
XSRETURN(1);
}
-Notice the two lines marked with "XXXXX". If you check the first section of
-the typemap file, you'll see that doubles are of type T_DOUBLE. In the
+Notice the two lines commented with "XXXXX". If you check the first section
+of the typemap file, you'll see that doubles are of type T_DOUBLE. In the
INPUT section, an argument that is T_DOUBLE is assigned to the variable
arg by calling the routine SvNV on something, then casting it to double,
then assigned to the variable arg. Similarly, in the OUTPUT section,
@@ -443,17 +471,19 @@ be passed back to the calling subroutine. These two functions are explained
in L<perlguts>; we'll talk more later about what that "ST(0)" means in the
section on the argument stack.
-=head2 WARNING
+=head2 Warning about Output Arguments
In general, it's not a good idea to write extensions that modify their input
-parameters, as in Example 3. However, to accommodate better calling
-pre-existing C routines, which often do modify their input parameters,
-this behavior is tolerated. The next example will show how to do this.
+parameters, as in Example 3. Instead, you should probably return multiple
+values in an array and let the caller handle them (we'll do this in a later
+example). However, in order to better accomodate calling pre-existing C
+routines, which often do modify their input parameters, this behavior is
+tolerated.
=head2 EXAMPLE 4
In this example, we'll now begin to write XSUBs that will interact with
-predefined C libraries. To begin with, we will build a small library of
+pre-defined C libraries. To begin with, we will build a small library of
our own, then let h2xs write our .pm and .xs files for us.
Create a new directory called Mytest2 at the same level as the directory
@@ -477,10 +507,7 @@ Also create a file mylib.c that looks like this:
#include "./mylib.h"
double
- foo(a, b, c)
- int a;
- long b;
- const char * c;
+ foo(int a, long b, const char *c)
{
return (a + b + atof(c) + TESTVAL);
}
@@ -490,9 +517,9 @@ And finally create a file Makefile.PL that looks like this:
use ExtUtils::MakeMaker;
$Verbose = 1;
WriteMakefile(
- NAME => 'Mytest2::mylib',
- SKIP => [qw(all static static_lib dynamic dynamic_lib)],
- clean => {'FILES' => 'libmylib$(LIB_EXT)'},
+ NAME => 'Mytest2::mylib',
+ SKIP => [qw(all static static_lib dynamic dynamic_lib)],
+ clean => {'FILES' => 'libmylib$(LIBEEXT)'},
);
@@ -500,6 +527,8 @@ And finally create a file Makefile.PL that looks like this:
'
all :: static
+ pure_all :: static
+
static :: libmylib$(LIB_EXT)
libmylib$(LIB_EXT): $(O_FILES)
@@ -509,6 +538,11 @@ And finally create a file Makefile.PL that looks like this:
';
}
+Make sure you use a tab and not spaces on the lines beginning with "$(AR)"
+and "$(RANLIB)". Make will not function properly if you use spaces.
+It has also been reported that the "cr" argument to $(AR) is unnecessary
+on Win32 systems.
+
We will now create the main top-level Mytest2 files. Change to the directory
above Mytest2 and run the following command:
@@ -519,24 +553,29 @@ Our files are stored in Mytest2/mylib, and will be untouched.
The normal Makefile.PL that h2xs generates doesn't know about the mylib
directory. We need to tell it that there is a subdirectory and that we
-will be generating a library in it. Let's add the following key-value
-pair to the WriteMakefile call:
+will be generating a library in it. Let's add the argument MYEXTLIB to
+the WriteMakefile call so that it looks like this:
- 'MYEXTLIB' => 'mylib/libmylib$(LIB_EXT)',
+ WriteMakefile(
+ 'NAME' => 'Mytest2',
+ 'VERSION_FROM' => 'Mytest2.pm', # finds $VERSION
+ 'LIBS' => [''], # e.g., '-lm'
+ 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
+ 'INC' => '', # e.g., '-I/usr/include/other'
+ 'MYEXTLIB' => 'mylib/libmylib$(LIB_EXT)',
+ );
-and a new replacement subroutine too:
+and then at the end add a subroutine (which will override the pre-existing
+subroutine). Remember to use a tab character to indent the line beginning
+with "cd"!
sub MY::postamble {
'
$(MYEXTLIB): mylib/Makefile
- cd mylib && $(MAKE) $(PASTHRU)
+ cd mylib && $(MAKE) $(PASSTHRU)
';
}
-(Note: Most makes will require that there be a tab character that indents
-the line C<cd mylib && $(MAKE) $(PASTHRU)>, similarly for the Makefile in the
-subdirectory.)
-
Let's also fix the MANIFEST file so that it accurately reflects the contents
of our extension. The single line that says "mylib" should be replaced by
the following three lines:
@@ -546,8 +585,7 @@ the following three lines:
mylib/mylib.h
To keep our namespace nice and unpolluted, edit the .pm file and change
-the lines setting @EXPORT to @EXPORT_OK (there are two: one in the line
-beginning "use vars" and one setting the array itself). Finally, in the
+the variable C<@EXPORT> to C<@EXPORT_OK>. Finally, in the
.xs file, edit the #include line to read:
#include "mylib/mylib.h"
@@ -559,17 +597,17 @@ And also add the following function definition to the end of the .xs file:
int a
long b
const char * c
- OUTPUT:
+ OUTPUT:
RETVAL
Now we also need to create a typemap file because the default Perl doesn't
-currently support the const char * type. Create a file called typemap and
-place the following in it:
+currently support the const char * type. Create a file called typemap in
+the Mytest2 directory and place the following in it:
const char * T_PV
Now run perl on the top-level Makefile.PL. Notice that it also created a
-Makefile in the mylib directory. Run make and see that it does cd into
+Makefile in the mylib directory. Run make and watch that it does cd into
the mylib directory and run make in there as well.
Now edit the test.pl script and change the BEGIN block to print "1..4",
@@ -579,13 +617,13 @@ and add the following lines to the end of the script:
print &Mytest2::foo(1, 2, "0.0") == 7 ? "ok 3\n" : "not ok 3\n";
print abs(&Mytest2::foo(0, 0, "-3.4") - 0.6) <= 0.01 ? "ok 4\n" : "not ok 4\n";
-(When dealing with floating-point comparisons, it is often useful not to check
-for equality, but rather the difference being below a certain epsilon factor,
-0.01 in this case)
+(When dealing with floating-point comparisons, it is best to not check for
+equality, but rather that the difference between the expected and actual
+result is below a certain amount (called epsilon) which is 0.01 in this case)
-Run "make test" and all should be well.
+Run "C<make test>" and all should be well.
-=head2 WHAT HAS HAPPENED HERE?
+=head2 What has happened here?
Unlike previous examples, we've now run h2xs on a real include file. This
has caused some extra goodies to appear in both the .pm and .xs files.
@@ -594,76 +632,214 @@ has caused some extra goodies to appear in both the .pm and .xs files.
=item *
-In the .xs file, there's now a #include declaration with the full path to
-the mylib.h header file.
+In the .xs file, there's now a #include directive with the absolute path to
+the mylib.h header file. We changed this to a relative path so that we
+could move the extension directory if we wanted to.
=item *
There's now some new C code that's been added to the .xs file. The purpose
of the C<constant> routine is to make the values that are #define'd in the
-header file available to the Perl script (in this case, by calling
-C<&main::TESTVAL>). There's also some XS code to allow calls to the
+header file accessible by the Perl script (by calling either C<TESTVAL> or
+C<&Mytest2::TESTVAL>). There's also some XS code to allow calls to the
C<constant> routine.
=item *
-The .pm file has exported the name TESTVAL in the @EXPORT array. This
-could lead to name clashes. A good rule of thumb is that if the #define
-is going to be used by only the C routines themselves, and not by the user,
-they should be removed from the @EXPORT array. Alternately, if you don't
-mind using the "fully qualified name" of a variable, you could remove most
-or all of the items in the @EXPORT array.
+The .pm file originally exported the name C<TESTVAL> in the C<@EXPORT> array.
+This could lead to name clashes. A good rule of thumb is that if the #define
+is only going to be used by the C routines themselves, and not by the user,
+they should be removed from the C<@EXPORT> array. Alternately, if you don't
+mind using the "fully qualified name" of a variable, you could move most
+or all of the items from the C<@EXPORT> array into the C<@EXPORT_OK> array.
=item *
-If our include file contained #include directives, these would not be
-processed at all by h2xs. There is no good solution to this right now.
+If our include file had contained #include directives, these would not have
+been processed by h2xs. There is no good solution to this right now.
-=back
+=item *
We've also told Perl about the library that we built in the mylib
-subdirectory. That required the addition of only the MYEXTLIB variable
+subdirectory. That required only the addition of the C<MYEXTLIB> variable
to the WriteMakefile call and the replacement of the postamble subroutine
to cd into the subdirectory and run make. The Makefile.PL for the
library is a bit more complicated, but not excessively so. Again we
replaced the postamble subroutine to insert our own code. This code
-specified simply that the library to be created here was a static
-archive (as opposed to a dynamically loadable library) and provided the
+simply specified that the library to be created here was a static archive
+library (as opposed to a dynamically loadable library) and provided the
commands to build it.
-=head2 SPECIFYING ARGUMENTS TO XSUBPP
+=back
+
+=head2 Anatomy of .xs file
+
+The .xs file of L<"EXAMPLE 4"> contained some new elements. To understand
+the meaning of these elements, pay attention to the line which reads
+
+ MODULE = Mytest2 PACKAGE = Mytest2
+
+Anything before this line is plain C code which describes which headers
+to include, and defines some convenience functions. No translations are
+performed on this part, it goes into the generated output C file as is.
+
+Anything after this line is the description of XSUB functions.
+These descriptions are translated by B<xsubpp> into C code which
+implements these functions using Perl calling conventions, and which
+makes these functions visible from Perl interpreter.
+
+Pay a special attention to the function C<constant>. This name appears
+twice in the generated .xs file: once in the first part, as a static C
+function, the another time in the second part, when an XSUB interface to
+this static C function is defined.
+
+This is quite typical for .xs files: usually the .xs file provides
+an interface to an existing C function. Then this C function is defined
+somewhere (either in an external library, or in the first part of .xs file),
+and a Perl interface to this function (i.e. "Perl glue") is described in the
+second part of .xs file. The situation in L<"EXAMPLE 1">, L<"EXAMPLE 2">,
+and L<"EXAMPLE 3">, when all the work is done inside the "Perl glue", is
+somewhat of an exception rather than the rule.
+
+=head2 Getting the fat out of XSUBs
+
+In L<"EXAMPLE 4"> the second part of .xs file contained the following
+description of an XSUB:
+
+ double
+ foo(a,b,c)
+ int a
+ long b
+ const char * c
+ OUTPUT:
+ RETVAL
+
+Note that in contrast with L<"EXAMPLE 1">, L<"EXAMPLE 2"> and L<"EXAMPLE 3">,
+this description does not contain the actual I<code> for what is done
+is done during a call to Perl function foo(). To understand what is going
+on here, one can add a CODE section to this XSUB:
+
+ double
+ foo(a,b,c)
+ int a
+ long b
+ const char * c
+ CODE:
+ RETVAL = foo(a,b,c);
+ OUTPUT:
+ RETVAL
+
+However, these two XSUBs provide almost identical generated C code: B<xsubpp>
+compiler is smart enough to figure out the C<CODE:> section from the first
+two lines of the description of XSUB. What about C<OUTPUT:> section? In
+fact, that is absolutely the same! The C<OUTPUT:> section can be removed
+as well, I<as far as C<CODE:> section or C<PPCODE:> section> is not
+specified: B<xsubpp> can see that it needs to generate a function call
+section, and will autogenerate the OUTPUT section too. Thus one can
+shortcut the XSUB to become:
+
+ double
+ foo(a,b,c)
+ int a
+ long b
+ const char * c
+
+Can we do the same with an XSUB
+
+ int
+ is_even(input)
+ int input
+ CODE:
+ RETVAL = (input % 2 == 0);
+ OUTPUT:
+ RETVAL
+
+of L<"EXAMPLE 2">? To do this, one needs to define a C function C<int
+is_even(int input)>. As we saw in L<Anatomy of .xs file>, a proper place
+for this definition is in the first part of .xs file. In fact a C function
+
+ int
+ is_even(int arg)
+ {
+ return (arg % 2 == 0);
+ }
+
+is probably overkill for this. Something as simple as a C<#define> will
+do too:
+
+ #define is_even(arg) ((arg) % 2 == 0)
+
+After having this in the first part of .xs file, the "Perl glue" part becomes
+as simple as
+
+ int
+ is_even(input)
+ int input
+
+This technique of separation of the glue part from the workhorse part has
+obvious tradeoffs: if you want to change a Perl interface, you need to
+change two places in your code. However, it removes a lot of clutter,
+and makes the workhorse part independent from idiosyncrasies of Perl calling
+convention. (In fact, there is nothing Perl-specific in the above description,
+a different version of B<xsubpp> might have translated this to TCL glue or
+Python glue as well.)
+
+=head2 More about XSUB arguments
With the completion of Example 4, we now have an easy way to simulate some
real-life libraries whose interfaces may not be the cleanest in the world.
We shall now continue with a discussion of the arguments passed to the
-xsubpp compiler.
+B<xsubpp> compiler.
+
+When you specify arguments to routines in the .xs file, you are really
+passing three pieces of information for each argument listed. The first
+piece is the order of that argument relative to the others (first, second,
+etc). The second is the type of argument, and consists of the type
+declaration of the argument (e.g., int, char*, etc). The third piece is
+the calling convention for the argument in the call to the library function.
+
+While Perl passes arguments to functions by reference,
+C passes arguments by value; to implement a C function which modifies data
+of one of the "arguments", the actual argument of this C function would be
+a pointer to the data. Thus two C functions with declarations
-When you specify arguments in the .xs file, you are really passing three
-pieces of information for each one listed. The first piece is the order
-of that argument relative to the others (first, second, etc). The second
-is the type of argument, and consists of the type declaration of the
-argument (e.g., int, char*, etc). The third piece is the exact way in
-which the argument should be used in the call to the library function
-from this XSUB. This would mean whether or not to place a "&" before
-the argument or not, meaning the argument expects to be passed the address
-of the specified data type.
+ int string_length(char *s);
+ int upper_case_char(char *cp);
-There is a difference between the two arguments in this hypothetical function:
+may have completely different semantics: the first one may inspect an array
+of chars pointed by s, and the second one may immediately dereference C<cp>
+and manipulate C<*cp> only (using the return value as, say, a success
+indicator). From Perl one would use these functions in
+a completely different manner.
+
+One conveys this info to B<xsubpp> by replacing C<*> before the
+argument by C<&>. C<&> means that the argument should be passed to a library
+function by its address. The above two function may be XSUB-ified as
+
+ int
+ string_length(s)
+ char * s
+
+ int
+ upper_case_char(cp)
+ char &cp
+
+For example, consider:
int
foo(a,b)
char &a
char * b
-The first argument to this function would be treated as a char and assigned
+The first Perl argument to this function would be treated as a char and assigned
to the variable a, and its address would be passed into the function foo.
-The second argument would be treated as a string pointer and assigned to the
+The second Perl argument would be treated as a string pointer and assigned to the
variable b. The I<value> of b would be passed into the function foo. The
-actual call to the function foo that xsubpp generates would look like this:
+actual call to the function foo that B<xsubpp> generates would look like this:
foo(&a, b);
-Xsubpp will identically parse the following function argument lists:
+B<xsubpp> will parse the following function argument lists identically:
char &a
char&a
@@ -672,40 +848,72 @@ Xsubpp will identically parse the following function argument lists:
However, to help ease understanding, it is suggested that you place a "&"
next to the variable name and away from the variable type), and place a
"*" near the variable type, but away from the variable name (as in the
-complete example above). By doing so, it is easy to understand exactly
-what will be passed to the C function -- it will be whatever is in the
-"last column".
+call to foo above). By doing so, it is easy to understand exactly what
+will be passed to the C function -- it will be whatever is in the "last
+column".
You should take great pains to try to pass the function the type of variable
it wants, when possible. It will save you a lot of trouble in the long run.
-=head2 THE ARGUMENT STACK
+=head2 The Argument Stack
If we look at any of the C code generated by any of the examples except
example 1, you will notice a number of references to ST(n), where n is
-usually 0. The "ST" is actually a macro that points to the n'th argument
-on the argument stack. ST(0) is thus the first argument passed to the
-XSUB, ST(1) is the second argument, and so on.
+usually 0. "ST" is actually a macro that points to the n'th argument
+on the argument stack. ST(0) is thus the first argument on the stack and
+therefore the first argument passed to the XSUB, ST(1) is the second
+argument, and so on.
-When you list the arguments to the XSUB in the .xs file, that tells xsubpp
+When you list the arguments to the XSUB in the .xs file, that tells B<xsubpp>
which argument corresponds to which of the argument stack (i.e., the first
one listed is the first argument, and so on). You invite disaster if you
do not list them in the same order as the function expects them.
-=head2 EXTENDING YOUR EXTENSION
+The actual values on the argument stack are pointers to the values passed
+in. When an argument is listed as being an OUTPUT value, its corresponding
+value on the stack (i.e., ST(0) if it was the first argument) is changed.
+You can verify this by looking at the C code generated for Example 3.
+The code for the round() XSUB routine contains lines that look like this:
+
+ double arg = (double)SvNV(ST(0));
+ /* Round the contents of the variable arg */
+ sv_setnv(ST(0), (double)arg);
+
+The arg variable is initially set by taking the value from ST(0), then is
+stored back into ST(0) at the end of the routine.
+
+XSUBs are also allowed to return lists, not just scalars. This must be
+done by manipulating stack values ST(0), ST(1), etc, in a subtly
+different way. See L<perlxs> for details.
+
+XSUBs are also allowed to avoid automatic conversion of Perl function arguments
+to C function arguments. See L<perlxs> for details. Some people prefer
+manual conversion by inspecting C<ST(i)> even in the cases when automatic
+conversion will do, arguing that this makes the logic of an XSUB call clearer.
+Compare with L<"Getting the fat out of XSUBs"> for a similar tradeoff of
+a complete separation of "Perl glue" and "workhorse" parts of an XSUB.
+
+While experts may argue about these idioms, a novice to Perl guts may
+prefer a way which is as little Perl-guts-specific as possible, meaning
+automatic conversion and automatic call generation, as in
+L<"Getting the fat out of XSUBs">. This approach has the additional
+benefit of protecting the XSUB writer from future changes to the Perl API.
+
+=head2 Extending your Extension
Sometimes you might want to provide some extra methods or subroutines
to assist in making the interface between Perl and your extension simpler
or easier to understand. These routines should live in the .pm file.
Whether they are automatically loaded when the extension itself is loaded
-or loaded only when called depends on where in the .pm file the subroutine
-definition is placed.
+or only loaded when called depends on where in the .pm file the subroutine
+definition is placed. You can also consult L<AutoLoader> for an alternate
+way to store and load your extra subroutines.
-=head2 DOCUMENTING YOUR EXTENSION
+=head2 Documenting your Extension
There is absolutely no excuse for not documenting your extension.
Documentation belongs in the .pm file. This file will be fed to pod2man,
-and the embedded documentation will be converted to the manpage format,
+and the embedded documentation will be converted to the man page format,
then placed in the blib directory. It will be copied to Perl's man
page directory when the extension is installed.
@@ -715,19 +923,199 @@ as the comment inside the .pm file explains.
See L<perlpod> for more information about the pod format.
-=head2 INSTALLING YOUR EXTENSION
+=head2 Installing your Extension
Once your extension is complete and passes all its tests, installing it
-is quite simple: you simply run "make install". You will either need
+is quite simple: you simply run "make install". You will either need
to have write permission into the directories where Perl is installed,
or ask your system administrator to run the make for you.
-=head2 SEE ALSO
+Alternately, you can specify the exact directory to place the extension's
+files by placing a "PREFIX=/destination/directory" after the make install.
+(or in between the make and install if you have a brain-dead version of make).
+This can be very useful if you are building an extension that will eventually
+be distributed to multiple systems. You can then just archive the files in
+the destination directory and distribute them to your destination systems.
+
+=head2 EXAMPLE 5
+
+In this example, we'll do some more work with the argument stack. The
+previous examples have all returned only a single value. We'll now
+create an extension that returns an array.
+
+This extension is very Unix-oriented (struct statfs and the statfs system
+call). If you are not running on a Unix system, you can substitute for
+statfs any other function that returns multiple values, you can hard-code
+values to be returned to the caller (although this will be a bit harder
+to test the error case), or you can simply not do this example. If you
+change the XSUB, be sure to fix the test cases to match the changes.
+
+Return to the Mytest directory and add the following code to the end of
+Mytest.xs:
+
+ void
+ statfs(path)
+ char * path
+ INIT:
+ int i;
+ struct statfs buf;
+
+ PPCODE:
+ i = statfs(path, &buf);
+ if (i == 0) {
+ XPUSHs(sv_2mortal(newSVnv(buf.f_bavail)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_bfree)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_blocks)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_bsize)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_ffree)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_files)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_type)));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_fsid[0])));
+ XPUSHs(sv_2mortal(newSVnv(buf.f_fsid[1])));
+ } else {
+ XPUSHs(sv_2mortal(newSVnv(errno)));
+ }
+
+You'll also need to add the following code to the top of the .xs file, just
+after the include of "XSUB.h":
+
+ #include <sys/vfs.h>
+
+Also add the following code segment to test.pl while incrementing the "1..9"
+string in the BEGIN block to "1..11":
+
+ @a = &Mytest::statfs("/blech");
+ print ((scalar(@a) == 1 && $a[0] == 2) ? "ok 10\n" : "not ok 10\n");
+ @a = &Mytest::statfs("/");
+ print scalar(@a) == 9 ? "ok 11\n" : "not ok 11\n";
+
+=head2 New Things in this Example
+
+This example added quite a few new concepts. We'll take them one at a time.
+
+=over 4
+
+=item *
+
+The INIT: directive contains code that will be placed immediately after
+the argument stack is decoded. C does not allow variable declarations at
+arbitrary locations inside a function,
+so this is usually the best way to declare local variables needed by the XSUB.
+(Alternatively, one could put the whole C<PPCODE:> section into braces, and
+put these declarations on top.)
+
+=item *
+
+This routine also returns a different number of arguments depending on the
+success or failure of the call to statfs. If there is an error, the error
+number is returned as a single-element array. If the call is successful,
+then a 9-element array is returned. Since only one argument is passed into
+this function, we need room on the stack to hold the 9 values which may be
+returned.
+
+We do this by using the PPCODE: directive, rather than the CODE: directive.
+This tells B<xsubpp> that we will be managing the return values that will be
+put on the argument stack by ourselves.
+
+=item *
+
+When we want to place values to be returned to the caller onto the stack,
+we use the series of macros that begin with "XPUSH". There are five
+different versions, for placing integers, unsigned integers, doubles,
+strings, and Perl scalars on the stack. In our example, we placed a
+Perl scalar onto the stack. (In fact this is the only macro which
+can be used to return multiple values.)
+
+The XPUSH* macros will automatically extend the return stack to prevent
+it from being overrun. You push values onto the stack in the order you
+want them seen by the calling program.
+
+=item *
+
+The values pushed onto the return stack of the XSUB are actually mortal SV's.
+They are made mortal so that once the values are copied by the calling
+program, the SV's that held the returned values can be deallocated.
+If they were not mortal, then they would continue to exist after the XSUB
+routine returned, but would not be accessible. This is a memory leak.
+
+=item *
+
+If we were interested in performance, not in code compactness, in the success
+branch we would not use C<XPUSHs> macros, but C<PUSHs> macros, and would
+pre-extend the stack before pushing the return values:
+
+ EXTEND(SP, 9);
+
+The tradeoff is that one needs to calculate the number of return values
+in advance (though overextending the stack will not typically hurt
+anything but memory consumption).
+
+Similarly, in the failure branch we could use C<PUSHs> I<without> extending
+the stack: the Perl function reference comes to an XSUB on the stack, thus
+the stack is I<always> large enough to take one return value.
+
+=back
+
+=head2 EXAMPLE 6 (Coming Soon)
+
+Passing in and returning references to arrays and/or hashes
+
+=head2 EXAMPLE 7 (Coming Soon)
+
+XPUSH args AND set RETVAL AND assign return value to array
+
+=head2 EXAMPLE 8 (Coming Soon)
+
+Setting $!
+
+=head2 EXAMPLE 9 (Coming Soon)
+
+Getting fd's from filehandles
+
+=head2 Troubleshooting these Examples
+
+As mentioned at the top of this document, if you are having problems with
+these example extensions, you might see if any of these help you.
+
+=over 4
+
+=item *
+
+In versions of 5.002 prior to the gamma version, the test script in Example
+1 will not function properly. You need to change the "use lib" line to
+read:
+
+ use lib './blib';
+
+=item *
+
+In versions of 5.002 prior to version 5.002b1h, the test.pl file was not
+automatically created by h2xs. This means that you cannot say "make test"
+to run the test script. You will need to add the following line before the
+"use extension" statement:
+
+ use lib './blib';
+
+=item *
+
+In versions 5.000 and 5.001, instead of using the above line, you will need
+to use the following line:
+
+ BEGIN { unshift(@INC, "./blib") }
+
+=item *
+
+This document assumes that the executable named "perl" is Perl version 5.
+Some systems may have installed Perl version 5 as "perl5".
+
+=back
+
+=head1 See also
For more information, consult L<perlguts>, L<perlxs>, L<perlmod>,
and L<perlpod>.
-=head2 Author
+=head1 Author
Jeff Okamoto <F<okamoto@corp.hp.com>>
@@ -736,4 +1124,4 @@ and Tim Bunce.
=head2 Last Changed
-1996/7/10
+1999/11/30
diff --git a/contrib/perl5/pod/pod2latex.PL b/contrib/perl5/pod/pod2latex.PL
index feed98e..71115f3 100644
--- a/contrib/perl5/pod/pod2latex.PL
+++ b/contrib/perl5/pod/pod2latex.PL
@@ -101,7 +101,6 @@ print OUT <<'!NO!SUBS!';
# Translation of HTML escapes of various European accents might be wrong.
-$/ = ""; # record separator is blank lines
# TeX special characters.
##$tt_ables = "!@*()-=+|;:'\"`,./?<>";
$backslash_escapables = "#\$%&{}_";
@@ -119,13 +118,16 @@ $indent = 0;
# parse the pods, produce LaTeX.
-open(POD,"<$ARGV[0]") || die "cant open $ARGV[0]";
+use Pod::Plainer;
+open(POD,"-|") or Pod::Plainer -> new() -> parse_from_file($ARGV[0]), exit;
+
($pod=$ARGV[0]) =~ s/\.pod$//;
open(LATEX,">$pod.tex");
&do_hdr();
$cutting = 1;
$begun = "";
+$/ = ""; # record separator is blank lines
while (<POD>) {
if ($cutting) {
next unless /^=/;
@@ -314,6 +316,8 @@ while (<POD>) {
}
}gex;
+ s/X<([^<>]*)>/\\index{$1}/g;
+
s/Z<>/\\&/g; # the "don't format me" thing
# comes last because not subject to reprocessing
@@ -416,7 +420,7 @@ while (<POD>) {
}
print LATEX "\n\\begin{$listingcmd}\n";
push(@listingcmd,$listingcmd);
- } elsif ($lastcmd ne 'item') {
+ } elsif ( !@listingcmd ) {
warn "Illegal '=item' command without preceding 'over':";
warn "=item $bareitem";
}
diff --git a/contrib/perl5/pod/pod2man.PL b/contrib/perl5/pod/pod2man.PL
index 3c55d6e..bf35cff 100644
--- a/contrib/perl5/pod/pod2man.PL
+++ b/contrib/perl5/pod/pod2man.PL
@@ -9,7 +9,6 @@ use Cwd;
# have to mention them as if they were shell variables, not
# %Config entries. Thus you write
# $startperl
-# $man3ext
# to ensure Configure will look for $Config{startperl}.
# This forces PL files to create target in same directory as PL file.
@@ -29,1191 +28,445 @@ print "Extracting $file (with variable substitutions)\n";
print OUT <<"!GROK!THIS!";
$Config{startperl}
eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
- if \$running_under_some_shell;
-
-\$DEF_PM_SECTION = '$Config{man3ext}' || '3';
+ if \$running_under_some_shell;
!GROK!THIS!
# In the following, perl variables are not expanded during extraction.
print OUT <<'!NO!SUBS!';
-=head1 NAME
-
-pod2man - translate embedded Perl pod directives into man pages
-
-=head1 SYNOPSIS
-
-B<pod2man>
-[ B<--section=>I<manext> ]
-[ B<--release=>I<relpatch> ]
-[ B<--center=>I<string> ]
-[ B<--date=>I<string> ]
-[ B<--fixed=>I<font> ]
-[ B<--official> ]
-[ B<--lax> ]
-I<inputfile>
-
-=head1 DESCRIPTION
-
-B<pod2man> converts its input file containing embedded pod directives (see
-L<perlpod>) into nroff source suitable for viewing with nroff(1) or
-troff(1) using the man(7) macro set.
-
-Besides the obvious pod conversions, B<pod2man> also takes care of
-func(), func(n), and simple variable references like $foo or @bar so
-you don't have to use code escapes for them; complex expressions like
-C<$fred{'stuff'}> will still need to be escaped, though. Other nagging
-little roffish things that it catches include translating the minus in
-something like foo-bar, making a long dash--like this--into a real em
-dash, fixing up "paired quotes", putting a little space after the
-parens in something like func(), making C++ and PI look right, making
-double underbars have a little tiny space between them, making ALLCAPS
-a teeny bit smaller in troff(1), and escaping backslashes so you don't
-have to.
-
-=head1 OPTIONS
-
-=over 8
-
-=item center
-
-Set the centered header to a specific string. The default is
-"User Contributed Perl Documentation", unless the C<--official> flag is
-given, in which case the default is "Perl Programmers Reference Guide".
-
-=item date
-
-Set the left-hand footer string to this value. By default,
-the modification date of the input file will be used.
-
-=item fixed
-
-The fixed font to use for code refs. Defaults to CW.
-
-=item official
-
-Set the default header to indicate that this page is of
-the standard release in case C<--center> is not given.
-
-=item release
-
-Set the centered footer. By default, this is the current
-perl release.
-
-=item section
-
-Set the section for the C<.TH> macro. The standard conventions on
-sections are to use 1 for user commands, 2 for system calls, 3 for
-functions, 4 for devices, 5 for file formats, 6 for games, 7 for
-miscellaneous information, and 8 for administrator commands. This works
-best if you put your Perl man pages in a separate tree, like
-F</usr/local/perl/man/>. By default, section 1 will be used
-unless the file ends in F<.pm> in which case section 3 will be selected.
-
-=item lax
-
-Don't complain when required sections aren't present.
-
-=back
-
-=head1 Anatomy of a Proper Man Page
-
-For those not sure of the proper layout of a man page, here's
-an example of the skeleton of a proper man page. Head of the
-major headers should be setout as a C<=head1> directive, and
-are historically written in the rather startling ALL UPPER CASE
-format, although this is not mandatory.
-Minor headers may be included using C<=head2>, and are
-typically in mixed case.
-
-=over 10
-
-=item NAME
+# pod2man -- Convert POD data to formatted *roff input.
+# $Id: pod2man.PL,v 1.2 2000/03/16 21:08:23 eagle Exp $
+#
+# Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+require 5.004;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Man ();
+use Pod::Usage qw(pod2usage);
+
+use strict;
+
+# Insert -- into @ARGV before any single dash argument to hide it from
+# Getopt::Long; we want to interpret it as meaning stdin (which Pod::Parser
+# does correctly).
+my $stdin;
+@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV;
+
+# Parse our options, trying to retain backwards compatibility with pod2man
+# but allowing short forms as well. --lax is currently ignored.
+my %options;
+Getopt::Long::config ('bundling_override');
+GetOptions (\%options, 'section|s=s', 'release|r=s', 'center|c=s',
+ 'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
+ 'fixedbolditalic=s', 'official|o', 'lax|l', 'help|h') or exit 1;
+pod2usage (0) if $options{help};
+
+# Official sets --center, but don't override things explicitly set.
+if ($options{official} && !defined $options{center}) {
+ $options{center} = 'Perl Programmers Reference Guide';
+}
-Mandatory section; should be a comma-separated list of programs or
-functions documented by this podpage, such as:
+# Initialize and run the formatter.
+my $parser = Pod::Man->new (%options);
+$parser->parse_from_file (@ARGV);
- foo, bar - programs to do something
+__END__
-=item SYNOPSIS
+=head1 NAME
-A short usage summary for programs and functions, which
-may someday be deemed mandatory.
+pod2man - Convert POD data to formatted *roff input
-=item DESCRIPTION
+=head1 SYNOPSIS
-Long drawn out discussion of the program. It's a good idea to break this
-up into subsections using the C<=head2> directives, like
+pod2man [B<--section>=I<manext>] [B<--release>=I<version>]
+[B<--center>=I<string>] [B<--date>=I<string>] [B<--fixed>=I<font>]
+[B<--fixedbold>=I<font>] [B<--fixeditalic>=I<font>]
+[B<--fixedbolditalic>=I<font>] [B<--official>] [B<--lax>] [I<input>
+[I<output>]]
- =head2 A Sample Subection
+pod2man B<--help>
- =head2 Yet Another Sample Subection
+=head1 DESCRIPTION
-=item OPTIONS
+B<pod2man> is a front-end for Pod::Man, using it to generate *roff input
+from POD source. The resulting *roff code is suitable for display on a
+terminal using nroff(1), normally via man(1), or printing using troff(1).
+
+I<input> is the file to read for POD source (the POD can be embedded in
+code). If I<input> isn't given, it defaults to STDIN. I<output>, if given,
+is the file to which to write the formatted output. If I<output> isn't
+given, the formatted output is written to STDOUT.
+
+B<--section>, B<--release>, B<--center>, B<--date>, and B<--official> can be
+used to set the headers and footers to use; if not given, Pod::Man will
+assume various defaults. See below or L<Pod::Man> for details.
+
+B<pod2man> assumes that your *roff formatters have a fixed-width font named
+CW. If yours is called something else (like CR), use B<--fixed> to specify
+it. This generally only matters for troff output for printing. Similarly,
+you can set the fonts used for bold, italic, and bold italic fixed-width
+output.
+
+Besides the obvious pod conversions, Pod::Man, and therefore pod2man also
+takes care of formatting func(), func(n), and simple variable references
+like $foo or @bar so you don't have to use code escapes for them; complex
+expressions like C<$fred{'stuff'}> will still need to be escaped, though.
+It also translates dashes that aren't used as hyphens into en dashes, makes
+long dashes--like this--into proper em dashes, fixes "paired quotes," and
+takes care of several other troff-specific tweaks. See L<Pod::Man> for
+complete information.
-Some people make this separate from the description.
+=head1 OPTIONS
-=item RETURN VALUE
+=over 4
-What the program or function returns if successful.
+=item B<-c> I<string>, B<--center>=I<string>
-=item ERRORS
+Sets the centered page header to I<string>. The default is "User
+Contributed Perl Documentation", but also see B<--official> below.
-Exceptions, return codes, exit stati, and errno settings.
+=item B<-d> I<string>, B<--date>=I<string>
-=item EXAMPLES
+Set the left-hand footer string to this value. By default, the modification
+date of the input file will be used, or the current date if input comes from
+STDIN.
-Give some example uses of the program.
+=item B<--fixed>=I<font>
-=item ENVIRONMENT
+The fixed-width font to use for vertabim text and code. Defaults to CW.
+Some systems may want CR instead. Only matters for troff(1) output.
-Envariables this program might care about.
+=item B<--fixedbold>=I<font>
-=item FILES
+Bold version of the fixed-width font. Defaults to CB. Only matters for
+troff(1) output.
-All files used by the program. You should probably use the FE<lt>E<gt>
-for these.
+=item B<--fixeditalic>=I<font>
-=item SEE ALSO
+Italic version of the fixed-width font (actually, something of a misnomer,
+since most fixed-width fonts only have an oblique version, not an italic
+version). Defaults to CI. Only matters for troff(1) output.
-Other man pages to check out, like man(1), man(7), makewhatis(8), or catman(8).
+=item B<--fixedbolditalic>=I<font>
-=item NOTES
+Bold italic (probably actually oblique) version of the fixed-width font.
+Pod::Man doesn't assume you have this, and defaults to CB. Some systems
+(such as Solaris) have this font available as CX. Only matters for troff(1)
+output.
-Miscellaneous commentary.
+=item B<-h>, B<--help>
-=item CAVEATS
+Print out usage information.
-Things to take special care with; sometimes called WARNINGS.
+=item B<-l>, B<--lax>
-=item DIAGNOSTICS
+Don't complain when required sections are missing. Not currently used, as
+POD checking functionality is not yet implemented in Pod::Man.
-All possible messages the program can print out--and
-what they mean.
+=item B<-o>, B<--official>
-=item BUGS
+Set the default header to indicate that this page is part of the standard
+Perl release, if B<--center> is not also given.
-Things that are broken or just don't work quite right.
+=item B<-r>, B<--release>
-=item RESTRICTIONS
+Set the centered footer. By default, this is the version of Perl you run
+B<pod2man> under. Note that some system an macro sets assume that the
+centered footer will be a modification date and will prepend something like
+"Last modified: "; if this is the case, you may want to set B<--release> to
+the last modified date and B<--date> to the version number.
-Bugs you don't plan to fix :-)
+=item B<-s>, B<--section>
-=item AUTHOR
+Set the section for the C<.TH> macro. The standard section numbering
+convention is to use 1 for user commands, 2 for system calls, 3 for
+functions, 4 for devices, 5 for file formats, 6 for games, 7 for
+miscellaneous information, and 8 for administrator commands. There is a lot
+of variation here, however; some systems (like Solaris) use 4 for file
+formats, 5 for miscellaneous information, and 7 for devices. Still others
+use 1m instead of 8, or some mix of both. About the only section numbers
+that are reliably consistent are 1, 2, and 3.
-Who wrote it (or AUTHORS if multiple).
+By default, section 1 will be used unless the file ends in .pm in which case
+section 3 will be selected.
-=item HISTORY
+=back
-Programs derived from other sources sometimes have this, or
-you might keep a modification log here.
+=head1 DIAGNOSTICS
-=back
+If B<pod2man> fails with errors, see L<Pod::Man> and L<Pod::Parser> for
+information about what those errors might mean.
=head1 EXAMPLES
pod2man program > program.1
- pod2man some_module.pm > /usr/perl/man/man3/some_module.3
+ pod2man SomeModule.pm /usr/perl/man/man3/SomeModule.3
pod2man --section=7 note.pod > note.7
-=head1 DIAGNOSTICS
+If you would like to print out a lot of man page continuously, you probably
+want to set the C and D registers to set contiguous page numbering and
+even/odd paging, at least on some versions of man(7).
-The following diagnostics are generated by B<pod2man>. Items
-marked "(W)" are non-fatal, whereas the "(F)" errors will cause
-B<pod2man> to immediately exit with a non-zero status.
+ troff -man -rC1 -rD1 perl.1 perldata.1 perlsyn.1 ...
-=over 4
+To get index entries on stderr, turn on the F register, as in:
-=item bad option in paragraph %d of %s: ``%s'' should be [%s]<%s>
+ troff -man -rF1 perl.1
-(W) If you start include an option, you should set it off
-as bold, italic, or code.
+The indexing merely outputs messages via C<.tm> for each major page,
+section, subsection, item, and any C<XE<lt>E<gt>> directives. See
+L<Pod::Man> for more details.
-=item can't open %s: %s
+=head1 BUGS
-(F) The input file wasn't available for the given reason.
+Lots of this documentation is duplicated from L<Pod::Man>.
-=item Improper man page - no dash in NAME header in paragraph %d of %s
+POD checking and the corresponding B<--lax> option don't work yet.
-(W) The NAME header did not have an isolated dash in it. This is
-considered important.
+=head1 NOTES
-=item Invalid man page - no NAME line in %s
+For those not sure of the proper layout of a man page, here are some notes
+on writing a proper man page.
-(F) You did not include a NAME header, which is essential.
+The name of the program being documented is conventionally written in bold
+(using BE<lt>E<gt>) wherever it occurs, as are all program options.
+Arguments should be written in italics (IE<lt>E<gt>). Functions are
+traditionally written in italics; if you write a function as function(),
+Pod::Man will take care of this for you. Literal code or commands should
+be in CE<lt>E<gt>. References to other man pages should be in the form
+C<manpage(section)>, and Pod::Man will automatically format those
+appropriately. As an exception, it's traditional not to use this form when
+referring to module documentation; use C<LE<lt>Module::NameE<gt>> instead.
-=item roff font should be 1 or 2 chars, not `%s' (F)
+References to other programs or functions are normally in the form of man
+page references so that cross-referencing tools can provide the user with
+links and the like. It's possible to overdo this, though, so be careful not
+to clutter your documentation with too much markup.
-(F) The font specified with the C<--fixed> option was not
-a one- or two-digit roff font.
+The major headers should be set out using a C<=head1> directive, and are
+historically written in the rather startling ALL UPPER CASE format, although
+this is not mandatory. Minor headers may be included using C<=head2>, and
+are typically in mixed case.
-=item %s is missing required section: %s
+The standard sections of a manual page are:
-(W) Required sections include NAME, DESCRIPTION, and if you're
-using a section starting with a 3, also a SYNOPSIS. Actually,
-not having a NAME is a fatal.
+=over 4
-=item Unknown escape: %s in %s
+=item NAME
-(W) An unknown HTML entity (probably for an 8-bit character) was given via
-a C<EE<lt>E<gt>> directive. Besides amp, lt, gt, and quot, recognized
-entities are Aacute, aacute, Acirc, acirc, AElig, aelig, Agrave, agrave,
-Aring, aring, Atilde, atilde, Auml, auml, Ccedil, ccedil, Eacute, eacute,
-Ecirc, ecirc, Egrave, egrave, ETH, eth, Euml, euml, Iacute, iacute, Icirc,
-icirc, Igrave, igrave, Iuml, iuml, Ntilde, ntilde, Oacute, oacute, Ocirc,
-ocirc, Ograve, ograve, Oslash, oslash, Otilde, otilde, Ouml, ouml, szlig,
-THORN, thorn, Uacute, uacute, Ucirc, ucirc, Ugrave, ugrave, Uuml, uuml,
-Yacute, yacute, and yuml.
+Mandatory section; should be a comma-separated list of programs or functions
+documented by this podpage, such as:
-=item Unmatched =back
+ foo, bar - programs to do something
-(W) You have a C<=back> without a corresponding C<=over>.
+Manual page indexers are often extremely picky about the format of this
+section, so don't put anything in it except this line. A single dash, and
+only a single dash, should separate the list of programs or functions from
+the description. Functions should not be qualified with C<()> or the like.
+The description should ideally fit on a single line, even if a man program
+replaces the dash with a few tabs.
-=item Unrecognized pod directive: %s
+=item SYNOPSIS
-(W) You specified a pod directive that isn't in the known list of
-C<=head1>, C<=head2>, C<=item>, C<=over>, C<=back>, or C<=cut>.
+A short usage summary for programs and functions. This section is mandatory
+for section 3 pages.
+=item DESCRIPTION
-=back
+Extended description and discussion of the program or functions, or the body
+of the documentation for man pages that document something else. If
+particularly long, it's a good idea to break this up into subsections
+C<=head2> directives like:
-=head1 NOTES
+ =head2 Normal Usage
-If you would like to print out a lot of man page continuously, you
-probably want to set the C and D registers to set contiguous page
-numbering and even/odd paging, at least on some versions of man(7).
-Settting the F register will get you some additional experimental
-indexing:
+ =head2 Advanced Features
- troff -man -rC1 -rD1 -rF1 perl.1 perldata.1 perlsyn.1 ...
+ =head2 Writing Configuration Files
-The indexing merely outputs messages via C<.tm> for each
-major page, section, subsection, item, and any C<XE<lt>E<gt>>
-directives.
+or whatever is appropriate for your documentation.
+=item OPTIONS
-=head1 RESTRICTIONS
+Detailed description of each of the command-line options taken by the
+program. This should be separate from the description for the use of things
+like L<Pod::Usage|Pod::Usage>. This is normally presented as a list, with
+each option as a separate C<=item>. The specific option string should be
+enclosed in BE<lt>E<gt>. Any values that the option takes should be
+enclosed in IE<lt>E<gt>. For example, the section for the option
+B<--section>=I<manext> would be introduced with:
-None at this time.
+ =item B<--section>=I<manext>
-=head1 BUGS
+Synonymous options (like both the short and long forms) are separated by a
+comma and a space on the same C<=item> line, or optionally listed as their
+own item with a reference to the canonical name. For example, since
+B<--section> can also be written as B<-s>, the above would be:
-The =over and =back directives don't really work right. They
-take absolute positions instead of offsets, don't nest well, and
-making people count is suboptimal in any event.
+ =item B<-s> I<manext>, B<--section>=I<manext>
-=head1 AUTHORS
+(Writing the short option first is arguably easier to read, since the long
+option is long enough to draw the eye to it anyway and the short option can
+otherwise get lost in visual noise.)
-Original prototype by Larry Wall, but so massively hacked over by
-Tom Christiansen such that Larry probably doesn't recognize it anymore.
+=item RETURN VALUE
-=cut
+What the program or function returns, if successful. This section can be
+omitted for programs whose precise exit codes aren't important, provided
+they return 0 on success as is standard. It should always be present for
+functions.
-$/ = "";
-$cutting = 1;
-@Indices = ();
-
-# We try first to get the version number from a local binary, in case we're
-# running an installed version of Perl to produce documentation from an
-# uninstalled newer version's pod files.
-if ($^O ne 'plan9' and $^O ne 'dos' and $^O ne 'os2' and $^O ne 'MSWin32') {
- my $perl = (-x './perl' && -f './perl' ) ?
- './perl' :
- ((-x '../perl' && -f '../perl') ?
- '../perl' :
- '');
- ($version,$patch) = `$perl -e 'print $]'` =~ /^(\d\.\d{3})(\d{2})?/ if $perl;
-}
-# No luck; we'll just go with the running Perl's version
-($version,$patch) = $] =~ /^(.{5})(\d{2})?/ unless $version;
-$DEF_RELEASE = "perl $version";
-$DEF_RELEASE .= ", patch $patch" if $patch;
-
-
-sub makedate {
- my $secs = shift;
- my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($secs);
- my $mname = (qw{Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec})[$mon];
- $year += 1900;
- return "$mday/$mname/$year";
-}
+=item ERRORS
-use Getopt::Long;
-
-$DEF_SECTION = 1;
-$DEF_CENTER = "User Contributed Perl Documentation";
-$STD_CENTER = "Perl Programmers Reference Guide";
-$DEF_FIXED = 'CW';
-$DEF_LAX = 0;
-
-sub usage {
- warn "$0: @_\n" if @_;
- die <<EOF;
-usage: $0 [options] podpage
-Options are:
- --section=manext (default "$DEF_SECTION")
- --release=relpatch (default "$DEF_RELEASE")
- --center=string (default "$DEF_CENTER")
- --date=string (default "$DEF_DATE")
- --fixed=font (default "$DEF_FIXED")
- --official (default NOT)
- --lax (default NOT)
-EOF
-}
+Exceptions, error return codes, exit statuses, and errno settings.
+Typically used for function documentation; program documentation uses
+DIAGNOSTICS instead. The general rule of thumb is that errors printed to
+STDOUT or STDERR and intended for the end user are documented in DIAGNOSTICS
+while errors passed internal to the calling program and intended for other
+programmers are documented in ERRORS. When documenting a function that sets
+errno, a full list of the possible errno values should be given here.
-$uok = GetOptions( qw(
- section=s
- release=s
- center=s
- date=s
- fixed=s
- official
- lax
- help));
+=item DIAGNOSTICS
-$DEF_DATE = makedate((stat($ARGV[0]))[9] || time());
+All possible messages the program can print out--and what they mean. You
+may wish to follow the same documentation style as the Perl documentation;
+see perldiag(1) for more details (and look at the POD source as well).
-usage("Usage error!") unless $uok;
-usage() if $opt_help;
-usage("Need one and only one podpage argument") unless @ARGV == 1;
+If applicable, please include details on what the user should do to correct
+the error; documenting an error as indicating "the input buffer is too
+small" without telling the user how to increase the size of the input buffer
+(or at least telling them that it isn't possible) aren't very useful.
-$section = $opt_section || ($ARGV[0] =~ /\.pm$/
- ? $DEF_PM_SECTION : $DEF_SECTION);
-$RP = $opt_release || $DEF_RELEASE;
-$center = $opt_center || ($opt_official ? $STD_CENTER : $DEF_CENTER);
-$lax = $opt_lax || $DEF_LAX;
+=item EXAMPLES
-$CFont = $opt_fixed || $DEF_FIXED;
+Give some example uses of the program or function. Don't skimp; users often
+find this the most useful part of the documentation. The examples are
+generally given as verbatim paragraphs.
-if (length($CFont) == 2) {
- $CFont_embed = "\\f($CFont";
-}
-elsif (length($CFont) == 1) {
- $CFont_embed = "\\f$CFont";
-}
-else {
- die "roff font should be 1 or 2 chars, not `$CFont_embed'";
-}
+Don't just present an example without explaining what it does. Adding a
+short paragraph saying what the example will do can increase the value of
+the example immensely.
-$date = $opt_date || $DEF_DATE;
+=item ENVIRONMENT
-for (qw{NAME DESCRIPTION}) {
-# for (qw{NAME DESCRIPTION AUTHOR}) {
- $wanna_see{$_}++;
-}
-$wanna_see{SYNOPSIS}++ if $section =~ /^3/;
+Environment variables that the program cares about, normally presented as a
+list using C<=over>, C<=item>, and C<=back>. For example:
+ =over 6
-$name = @ARGV ? $ARGV[0] : "<STDIN>";
-$Filename = $name;
-if ($section =~ /^1/) {
- require File::Basename;
- $name = uc File::Basename::basename($name);
-}
-$name =~ s/\.(pod|p[lm])$//i;
-
-# Lose everything up to the first of
-# */lib/*perl* standard or site_perl module
-# */*perl*/lib from -D prefix=/opt/perl
-# */*perl*/ random module hierarchy
-# which works.
-$name =~ s-//+-/-g;
-if ($name =~ s-^.*?/lib/[^/]*perl[^/]*/--i
- or $name =~ s-^.*?/[^/]*perl[^/]*/lib/--i
- or $name =~ s-^.*?/[^/]*perl[^/]*/--i) {
- # Lose ^site(_perl)?/.
- $name =~ s-^site(_perl)?/--;
- # Lose ^arch/. (XXX should we use Config? Just for archname?)
- $name =~ s~^(.*-$^O|$^O-.*)/~~o;
- # Lose ^version/.
- $name =~ s-^\d+\.\d+/--;
-}
+ =item HOME
-# Translate Getopt/Long to Getopt::Long, etc.
-$name =~ s(/)(::)g;
-
-if ($name ne 'something') {
- FCHECK: {
- open(F, "< $ARGV[0]") || die "can't open $ARGV[0]: $!";
- while (<F>) {
- next unless /^=\b/;
- if (/^=head1\s+NAME\s*$/) { # an /m would forgive mistakes
- $_ = <F>;
- unless (/\s*-+\s+/) {
- $oops++;
- warn "$0: Improper man page - no dash in NAME header in paragraph $. of $ARGV[0]\n"
- } else {
- my @n = split /\s+-+\s+/;
- if (@n != 2) {
- $oops++;
- warn "$0: Improper man page - malformed NAME header in paragraph $. of $ARGV[0]\n"
- }
- else {
- %namedesc = @n;
- }
- }
- last FCHECK;
- }
- next if /^=cut\b/; # DB_File and Net::Ping have =cut before NAME
- next if /^=pod\b/; # It is OK to have =pod before NAME
- die "$0: Invalid man page - 1st pod line is not NAME in $ARGV[0]\n" unless $lax;
- }
- die "$0: Invalid man page - no documentation in $ARGV[0]\n" unless $lax;
- }
- close F;
-}
+ Used to determine the user's home directory. F<.foorc> in this
+ directory is read for configuration details, if it exists.
-print <<"END";
-.rn '' }`
-''' \$RCSfile\$\$Revision\$\$Date\$
-'''
-''' \$Log\$
-'''
-.de Sh
-.br
-.if t .Sp
-.ne 5
-.PP
-\\fB\\\\\$1\\fR
-.PP
-..
-.de Sp
-.if t .sp .5v
-.if n .sp
-..
-.de Ip
-.br
-.ie \\\\n(.\$>=3 .ne \\\\\$3
-.el .ne 3
-.IP "\\\\\$1" \\\\\$2
-..
-.de Vb
-.ft $CFont
-.nf
-.ne \\\\\$1
-..
-.de Ve
-.ft R
-
-.fi
-..
-'''
-'''
-''' Set up \\*(-- to give an unbreakable dash;
-''' string Tr holds user defined translation string.
-''' Bell System Logo is used as a dummy character.
-'''
-.tr \\(*W-|\\(bv\\*(Tr
-.ie n \\{\\
-.ds -- \\(*W-
-.ds PI pi
-.if (\\n(.H=4u)&(1m=24u) .ds -- \\(*W\\h'-12u'\\(*W\\h'-12u'-\\" diablo 10 pitch
-.if (\\n(.H=4u)&(1m=20u) .ds -- \\(*W\\h'-12u'\\(*W\\h'-8u'-\\" diablo 12 pitch
-.ds L" ""
-.ds R" ""
-''' \\*(M", \\*(S", \\*(N" and \\*(T" are the equivalent of
-''' \\*(L" and \\*(R", except that they are used on ".xx" lines,
-''' such as .IP and .SH, which do another additional levels of
-''' double-quote interpretation
-.ds M" """
-.ds S" """
-.ds N" """""
-.ds T" """""
-.ds L' '
-.ds R' '
-.ds M' '
-.ds S' '
-.ds N' '
-.ds T' '
-'br\\}
-.el\\{\\
-.ds -- \\(em\\|
-.tr \\*(Tr
-.ds L" ``
-.ds R" ''
-.ds M" ``
-.ds S" ''
-.ds N" ``
-.ds T" ''
-.ds L' `
-.ds R' '
-.ds M' `
-.ds S' '
-.ds N' `
-.ds T' '
-.ds PI \\(*p
-'br\\}
-END
-
-print <<'END';
-.\" If the F register is turned on, we'll generate
-.\" index entries out stderr for the following things:
-.\" TH Title
-.\" SH Header
-.\" Sh Subsection
-.\" Ip Item
-.\" X<> Xref (embedded
-.\" Of course, you have to process the output yourself
-.\" in some meaninful fashion.
-.if \nF \{
-.de IX
-.tm Index:\\$1\t\\n%\t"\\$2"
-..
-.nr % 0
-.rr F
-.\}
-END
-
-print <<"END";
-.TH $name $section "$RP" "$date" "$center"
-.UC
-END
-
-push(@Indices, qq{.IX Title "$name $section"});
-
-while (($name, $desc) = each %namedesc) {
- for ($name, $desc) { s/^\s+//; s/\s+$//; }
- push(@Indices, qq(.IX Name "$name - $desc"\n));
-}
+ =back
-print <<'END';
-.if n .hy 0
-.if n .na
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.de CQ \" put $1 in typewriter font
-END
-print ".ft $CFont\n";
-print <<'END';
-'if n "\c
-'if t \\&\\$1\c
-'if n \\&\\$1\c
-'if n \&"
-\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
-'.ft R
-..
-.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
-. \" AM - accent mark definitions
-.bd B 3
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds ? ?
-. ds ! !
-. ds /
-. ds q
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
-. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
-.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
-.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
-.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.ds oe o\h'-(\w'o'u*4/10)'e
-.ds Oe O\h'-(\w'O'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds v \h'-1'\o'\(aa\(ga'
-. ds _ \h'-1'^
-. ds . \h'-1'.
-. ds 3 3
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-. ds oe oe
-. ds Oe OE
-.\}
-.rm #[ #] #H #V #F C
-END
-
-$indent = 0;
-
-$begun = "";
-
-# Unrolling [^A-Z>]|[A-Z](?!<) gives: // MRE pp 165.
-my $nonest = '(?:[^A-Z>]*(?:[A-Z](?!<)[^A-Z>]*)*)';
-
-while (<>) {
- if ($cutting) {
- next unless /^=/;
- $cutting = 0;
- }
- if ($begun) {
- if (/^=end\s+$begun/) {
- $begun = "";
- }
- elsif ($begun =~ /^(roff|man)$/) {
- print STDOUT $_;
- }
- next;
- }
- chomp;
-
- # Translate verbatim paragraph
-
- if (/^\s/) {
- @lines = split(/\n/);
- for (@lines) {
- 1 while s
- {^( [^\t]* ) \t ( \t* ) }
- { $1 . ' ' x (8 - (length($1)%8) + 8 * (length($2))) }ex;
- s/\\/\\e/g;
- s/\A/\\&/s;
- }
- $lines = @lines;
- makespace() unless $verbatim++;
- print ".Vb $lines\n";
- print join("\n", @lines), "\n";
- print ".Ve\n";
- $needspace = 0;
- next;
- }
-
- $verbatim = 0;
-
- if (/^=for\s+(\S+)\s*/s) {
- if ($1 eq "man" or $1 eq "roff") {
- print STDOUT $',"\n\n";
- } else {
- # ignore unknown for
- }
- next;
- }
- elsif (/^=begin\s+(\S+)\s*/s) {
- $begun = $1;
- if ($1 eq "man" or $1 eq "roff") {
- print STDOUT $'."\n\n";
- }
- next;
- }
-
- # check for things that'll hosed our noremap scheme; affects $_
- init_noremap();
-
- if (!/^=item/) {
-
- # trofficate backslashes; must do it before what happens below
- s/\\/noremap('\\e')/ge;
-
- # protect leading periods and quotes against *roff
- # mistaking them for directives
- s/^(?:[A-Z]<)?[.']/\\&$&/gm;
-
- # first hide the escapes in case we need to
- # intuit something and get it wrong due to fmting
-
- 1 while s/([A-Z]<$nonest>)/noremap($1)/ge;
-
- # func() is a reference to a perl function
- s{
- \b
- (
- [:\w]+ \(\)
- )
- } {I<$1>}gx;
-
- # func(n) is a reference to a perl function or a man page
- s{
- ([:\w]+)
- (
- \( [^\051]+ \)
- )
- } {I<$1>\\|$2}gx;
-
- # convert simple variable references
- s/(\s+)([\$\@%][\w:]+)(?!\()/${1}C<$2>/g;
-
- if (m{ (
- [\-\w]+
- \(
- [^\051]*?
- [\@\$,]
- [^\051]*?
- \)
- )
- }x && $` !~ /([LCI]<[^<>]*|-)$/ && !/^=\w/)
- {
- warn "$0: bad option in paragraph $. of $ARGV: ``$1'' should be [LCI]<$1>\n";
- $oops++;
- }
-
- while (/(-[a-zA-Z])\b/g && $` !~ /[\w\-]$/) {
- warn "$0: bad option in paragraph $. of $ARGV: ``$1'' should be [CB]<$1>\n";
- $oops++;
- }
-
- # put it back so we get the <> processed again;
- clear_noremap(0); # 0 means leave the E's
-
- } else {
- # trofficate backslashes
- s/\\/noremap('\\e')/ge;
-
- }
-
- # need to hide E<> first; they're processed in clear_noremap
- s/(E<[^<>]+>)/noremap($1)/ge;
-
-
- $maxnest = 10;
- while ($maxnest-- && /[A-Z]</) {
-
- # can't do C font here
- s/([BI])<($nonest)>/font($1) . $2 . font('R')/eg;
-
- # files and filelike refs in italics
- s/F<($nonest)>/I<$1>/g;
-
- # no break -- usually we want C<> for this
- s/S<($nonest)>/nobreak($1)/eg;
-
- # LREF: a la HREF L<show this text|man/section>
- s:L<([^|>]+)\|[^>]+>:$1:g;
-
- # LREF: a manpage(3f)
- s:L<([a-zA-Z][^\s\/]+)(\([^\)]+\))?>:the I<$1>$2 manpage:g;
-
- # LREF: an =item on another manpage
- s{
- L<
- ([^/]+)
- /
- (
- [:\w]+
- (\(\))?
- )
- >
- } {the C<$2> entry in the I<$1> manpage}gx;
-
- # LREF: an =item on this manpage
- s{
- ((?:
- L<
- /
- (
- [:\w]+
- (\(\))?
- )
- >
- (,?\s+(and\s+)?)?
- )+)
- } { internal_lrefs($1) }gex;
-
- # LREF: a =head2 (head1?), maybe on a manpage, maybe right here
- # the "func" can disambiguate
- s{
- L<
- (?:
- ([a-zA-Z]\S+?) /
- )?
- "?(.*?)"?
- >
- }{
- do {
- $1 # if no $1, assume it means on this page.
- ? "the section on I<$2> in the I<$1> manpage"
- : "the section on I<$2>"
- }
- }gesx; # s in case it goes over multiple lines, so . matches \n
-
- s/Z<>/\\&/g;
-
- # comes last because not subject to reprocessing
- s/C<($nonest)>/noremap("${CFont_embed}${1}\\fR")/eg;
- }
-
- if (s/^=//) {
- $needspace = 0; # Assume this.
-
- s/\n/ /g;
-
- ($Cmd, $_) = split(' ', $_, 2);
-
- $dotlevel = 1;
- if ($Cmd eq 'head1') {
- $dotlevel = 1;
- }
- elsif ($Cmd eq 'head2') {
- $dotlevel = 1;
- }
- elsif ($Cmd eq 'item') {
- $dotlevel = 2;
- }
-
- if (defined $_) {
- &escapes($dotlevel);
- s/"/""/g;
- }
-
- clear_noremap(1);
-
- if ($Cmd eq 'cut') {
- $cutting = 1;
- }
- elsif ($Cmd eq 'head1') {
- s/\s+$//;
- delete $wanna_see{$_} if exists $wanna_see{$_};
- print qq{.SH "$_"\n};
- push(@Indices, qq{.IX Header "$_"\n});
- }
- elsif ($Cmd eq 'head2') {
- print qq{.Sh "$_"\n};
- push(@Indices, qq{.IX Subsection "$_"\n});
- }
- elsif ($Cmd eq 'over') {
- push(@indent,$indent);
- $indent += ($_ + 0) || 5;
- }
- elsif ($Cmd eq 'back') {
- $indent = pop(@indent);
- warn "$0: Unmatched =back in paragraph $. of $ARGV\n" unless defined $indent;
- $needspace = 1;
- }
- elsif ($Cmd eq 'item') {
- s/^\*( |$)/\\(bu$1/g;
- # if you know how to get ":s please do
- s/\\\*\(L"([^"]+?)\\\*\(R"/'$1'/g;
- s/\\\*\(L"([^"]+?)""/'$1'/g;
- s/[^"]""([^"]+?)""[^"]/'$1'/g;
- # here do something about the $" in perlvar?
- print STDOUT qq{.Ip "$_" $indent\n};
- push(@Indices, qq{.IX Item "$_"\n});
- }
- elsif ($Cmd eq 'pod') {
- # this is just a comment
- }
- else {
- warn "$0: Unrecognized pod directive in paragraph $. of $ARGV: $Cmd\n";
- }
- }
- else {
- if ($needspace) {
- &makespace;
- }
- &escapes(0);
- clear_noremap(1);
- print $_, "\n";
- $needspace = 1;
- }
-}
+Since environment variables are normally in all uppercase, no additional
+special formatting is generally needed; they're glaring enough as it is.
-print <<"END";
+=item FILES
-.rn }` ''
-END
+All files used by the program or function, normally presented as a list, and
+what it uses them for. File names should be enclosed in FE<lt>E<gt>. It's
+particularly important to document files that will be potentially modified.
-if (%wanna_see && !$lax) {
- @missing = keys %wanna_see;
- warn "$0: $Filename is missing required section"
- . (@missing > 1 && "s")
- . ": @missing\n";
- $oops++;
-}
+=item CAVEATS
-foreach (@Indices) { print "$_\n"; }
+Things to take special care with, sometimes called WARNINGS.
-exit;
-#exit ($oops != 0);
+=item BUGS
-#########################################################################
+Things that are broken or just don't work quite right.
-sub nobreak {
- my $string = shift;
- $string =~ s/ /\\ /g;
- $string;
-}
+=item RESTRICTIONS
-sub escapes {
- my $indot = shift;
-
- s/X<(.*?)>/mkindex($1)/ge;
-
- # translate the minus in foo-bar into foo\-bar for roff
- s/([^0-9a-z-])-([^-])/$1\\-$2/g;
-
- # make -- into the string version \*(-- (defined above)
- s/\b--\b/\\*(--/g;
- s/"--([^"])/"\\*(--$1/g; # should be a better way
- s/([^"])--"/$1\\*(--"/g;
-
- # fix up quotes; this is somewhat tricky
- my $dotmacroL = 'L';
- my $dotmacroR = 'R';
- if ( $indot == 1 ) {
- $dotmacroL = 'M';
- $dotmacroR = 'S';
- }
- elsif ( $indot >= 2 ) {
- $dotmacroL = 'N';
- $dotmacroR = 'T';
- }
- if (!/""/) {
- s/(^|\s)(['"])/noremap("$1\\*($dotmacroL$2")/ge;
- s/(['"])($|[\-\s,;\\!?.])/noremap("\\*($dotmacroR$1$2")/ge;
- }
-
- #s/(?!")(?:.)--(?!")(?:.)/\\*(--/g;
- #s/(?:(?!")(?:.)--(?:"))|(?:(?:")--(?!")(?:.))/\\*(--/g;
-
-
- # make sure that func() keeps a bit a space tween the parens
- ### s/\b\(\)/\\|()/g;
- ### s/\b\(\)/(\\|)/g;
-
- # make C++ into \*C+, which is a squinched version (defined above)
- s/\bC\+\+/\\*(C+/g;
-
- # make double underbars have a little tiny space between them
- s/__/_\\|_/g;
-
- # PI goes to \*(PI (defined above)
- s/\bPI\b/noremap('\\*(PI')/ge;
-
- # make all caps a teeny bit smaller, but don't muck with embedded code literals
- my $hidCFont = font('C');
- if ($Cmd !~ /^head1/) { # SH already makes smaller
- # /g isn't enough; 1 while or we'll be off
-
-# 1 while s{
-# (?!$hidCFont)(..|^.|^)
-# \b
-# (
-# [A-Z][\/A-Z+:\-\d_$.]+
-# )
-# (s?)
-# \b
-# } {$1\\s-1$2\\s0}gmox;
-
- 1 while s{
- (?!$hidCFont)(..|^.|^)
- (
- \b[A-Z]{2,}[\/A-Z+:\-\d_\$]*\b
- )
- } {
- $1 . noremap( '\\s-1' . $2 . '\\s0' )
- }egmox;
-
- }
-}
+Bugs you don't plan to fix. :-)
-# make troff just be normal, but make small nroff get quoted
-# decided to just put the quotes in the text; sigh;
-sub ccvt {
- local($_,$prev) = @_;
- noremap(qq{.CQ "$_" \n\\&});
-}
+=item NOTES
-sub makespace {
- if ($indent) {
- print ".Sp\n";
- }
- else {
- print ".PP\n";
- }
-}
+Miscellaneous commentary.
-sub mkindex {
- my ($entry) = @_;
- my @entries = split m:\s*/\s*:, $entry;
- push @Indices, ".IX Xref " . join ' ', map {qq("$_")} @entries;
- return '';
-}
+=item SEE ALSO
-sub font {
- local($font) = shift;
- return '\\f' . noremap($font);
-}
+Other man pages to check out, like man(1), man(7), makewhatis(8), or
+catman(8). Normally a simple list of man pages separated by commas, or a
+paragraph giving the name of a reference work. Man page references, if they
+use the standard C<name(section)> form, don't have to be enclosed in
+LE<lt>E<gt>, but other things in this section probably should be when
+appropriate. You may need to use the C<LE<lt>...|...E<gt>> syntax to keep
+B<pod2man> and B<pod2text> from being too verbose; see perlpod(1).
-sub noremap {
- local($thing_to_hide) = shift;
- $thing_to_hide =~ tr/\000-\177/\200-\377/;
- return $thing_to_hide;
-}
+If the package has a web site, include a URL here.
-sub init_noremap {
- # escape high bit characters in input stream
- s/([\200-\377])/"E<".ord($1).">"/ge;
-}
+=item AUTHOR
-sub clear_noremap {
- my $ready_to_print = $_[0];
-
- tr/\200-\377/\000-\177/;
-
- # trofficate backslashes
- # s/(?!\\e)(?:..|^.|^)\\/\\e/g;
-
- # now for the E<>s, which have been hidden until now
- # otherwise the interative \w<> processing would have
- # been hosed by the E<gt>
- s {
- E<
- (
- ( \d + )
- | ( [A-Za-z]+ )
- )
- >
- } {
- do {
- defined $2
- ? chr($2)
- :
- exists $HTML_Escapes{$3}
- ? do { $HTML_Escapes{$3} }
- : do {
- warn "$0: Unknown escape in paragraph $. of $ARGV: ``$&''\n";
- "E<$1>";
- }
- }
- }egx if $ready_to_print;
-}
+Who wrote it (use AUTHORS for multiple people). Including your current
+e-mail address (or some e-mail address to which bug reports should be sent)
+so that users have a way of contacting you is a good idea. Remember that
+program documentation tends to roam the wild for far longer than you expect
+and pick an e-mail address that's likely to last if possible.
-sub internal_lrefs {
- local($_) = shift;
- local $trailing_and = s/and\s+$// ? "and " : "";
-
- s{L</([^>]+)>}{$1}g;
- my(@items) = split( /(?:,?\s+(?:and\s+)?)/ );
- my $retstr = "the ";
- my $i;
- for ($i = 0; $i <= $#items; $i++) {
- $retstr .= "C<$items[$i]>";
- $retstr .= ", " if @items > 2 && $i != $#items;
- $retstr .= " and " if $i+2 == @items;
- }
-
- $retstr .= " entr" . ( @items > 1 ? "ies" : "y" )
- . " elsewhere in this document";
- # terminal space to avoid words running together (pattern used
- # strips terminal spaces)
- $retstr .= " " if length $trailing_and;
- $retstr .= $trailing_and;
-
- return $retstr;
+=item HISTORY
-}
+Programs derived from other sources sometimes have this, or you might keep a
+modification log here.
-BEGIN {
-%HTML_Escapes = (
- 'amp' => '&', # ampersand
- 'lt' => '<', # left chevron, less-than
- 'gt' => '>', # right chevron, greater-than
- 'quot' => '"', # double quote
-
- "Aacute" => "A\\*'", # capital A, acute accent
- "aacute" => "a\\*'", # small a, acute accent
- "Acirc" => "A\\*^", # capital A, circumflex accent
- "acirc" => "a\\*^", # small a, circumflex accent
- "AElig" => '\*(AE', # capital AE diphthong (ligature)
- "aelig" => '\*(ae', # small ae diphthong (ligature)
- "Agrave" => "A\\*`", # capital A, grave accent
- "agrave" => "A\\*`", # small a, grave accent
- "Aring" => 'A\\*o', # capital A, ring
- "aring" => 'a\\*o', # small a, ring
- "Atilde" => 'A\\*~', # capital A, tilde
- "atilde" => 'a\\*~', # small a, tilde
- "Auml" => 'A\\*:', # capital A, dieresis or umlaut mark
- "auml" => 'a\\*:', # small a, dieresis or umlaut mark
- "Ccedil" => 'C\\*,', # capital C, cedilla
- "ccedil" => 'c\\*,', # small c, cedilla
- "Eacute" => "E\\*'", # capital E, acute accent
- "eacute" => "e\\*'", # small e, acute accent
- "Ecirc" => "E\\*^", # capital E, circumflex accent
- "ecirc" => "e\\*^", # small e, circumflex accent
- "Egrave" => "E\\*`", # capital E, grave accent
- "egrave" => "e\\*`", # small e, grave accent
- "ETH" => '\\*(D-', # capital Eth, Icelandic
- "eth" => '\\*(d-', # small eth, Icelandic
- "Euml" => "E\\*:", # capital E, dieresis or umlaut mark
- "euml" => "e\\*:", # small e, dieresis or umlaut mark
- "Iacute" => "I\\*'", # capital I, acute accent
- "iacute" => "i\\*'", # small i, acute accent
- "Icirc" => "I\\*^", # capital I, circumflex accent
- "icirc" => "i\\*^", # small i, circumflex accent
- "Igrave" => "I\\*`", # capital I, grave accent
- "igrave" => "i\\*`", # small i, grave accent
- "Iuml" => "I\\*:", # capital I, dieresis or umlaut mark
- "iuml" => "i\\*:", # small i, dieresis or umlaut mark
- "Ntilde" => 'N\*~', # capital N, tilde
- "ntilde" => 'n\*~', # small n, tilde
- "Oacute" => "O\\*'", # capital O, acute accent
- "oacute" => "o\\*'", # small o, acute accent
- "Ocirc" => "O\\*^", # capital O, circumflex accent
- "ocirc" => "o\\*^", # small o, circumflex accent
- "Ograve" => "O\\*`", # capital O, grave accent
- "ograve" => "o\\*`", # small o, grave accent
- "Oslash" => "O\\*/", # capital O, slash
- "oslash" => "o\\*/", # small o, slash
- "Otilde" => "O\\*~", # capital O, tilde
- "otilde" => "o\\*~", # small o, tilde
- "Ouml" => "O\\*:", # capital O, dieresis or umlaut mark
- "ouml" => "o\\*:", # small o, dieresis or umlaut mark
- "szlig" => '\*8', # small sharp s, German (sz ligature)
- "THORN" => '\\*(Th', # capital THORN, Icelandic
- "thorn" => '\\*(th',, # small thorn, Icelandic
- "Uacute" => "U\\*'", # capital U, acute accent
- "uacute" => "u\\*'", # small u, acute accent
- "Ucirc" => "U\\*^", # capital U, circumflex accent
- "ucirc" => "u\\*^", # small u, circumflex accent
- "Ugrave" => "U\\*`", # capital U, grave accent
- "ugrave" => "u\\*`", # small u, grave accent
- "Uuml" => "U\\*:", # capital U, dieresis or umlaut mark
- "uuml" => "u\\*:", # small u, dieresis or umlaut mark
- "Yacute" => "Y\\*'", # capital Y, acute accent
- "yacute" => "y\\*'", # small y, acute accent
- "yuml" => "y\\*:", # small y, dieresis or umlaut mark
-);
-}
+=back
+
+In addition, some systems use CONFORMING TO to note conformance to relevant
+standards and MT-LEVEL to note safeness for use in threaded programs or
+signal handlers. These headings are primarily useful when documenting parts
+of a C library. Documentation of object-oriented libraries or modules may
+use CONSTRUCTORS and METHODS sections for detailed documentation of the
+parts of the library and save the DESCRIPTION section for an overview; other
+large modules may use FUNCTIONS for similar reasons. Some people use
+OVERVIEW to summarize the description if it's quite long. Sometimes there's
+an additional COPYRIGHT section at the bottom, for licensing terms.
+AVAILABILITY is sometimes added, giving the canonical download site for the
+software or a URL for updates.
+
+Section ordering varies, although NAME should I<always> be the first section
+(you'll break some man page systems otherwise), and NAME, SYNOPSIS,
+DESCRIPTION, and OPTIONS generally always occur first and in that order if
+present. In general, SEE ALSO, AUTHOR, and similar material should be left
+for last. Some systems also move WARNINGS and NOTES to last. The order
+given above should be reasonable for most purposes.
+
+Finally, as a general note, try not to use an excessive amount of markup.
+As documented here and in L<Pod::Man>, you can safely leave Perl variables,
+function names, man page references, and the like unadorned by markup and
+the POD translators will figure it out for you. This makes it much easier
+to later edit the documentation. Note that many existing translators
+(including this one currently) will do the wrong thing with e-mail addresses
+or URLs when wrapped in LE<lt>E<gt>, so don't do that.
+
+For additional information that may be more accurate for your specific
+system, see either man(5) or man(7) depending on your system manual section
+numbering conventions.
+
+=head1 SEE ALSO
+
+L<Pod::Man|Pod::Man>, L<Pod::Parser|Pod::Parser>, man(1), nroff(1),
+troff(1), man(7)
+
+The man page documenting the an macro set may be man(5) instead of man(7) on
+your system.
+
+=head1 AUTHOR
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the
+original B<pod2man> by Larry Wall and Tom Christiansen. Large portions of
+this documentation, particularly the sections on the anatomy of a proper man
+page, are taken from the B<pod2man> documentation by Tom.
+=cut
!NO!SUBS!
+#'# (cperl-mode)
close OUT or die "Can't close $file: $!";
chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
diff --git a/contrib/perl5/pod/pod2text.PL b/contrib/perl5/pod/pod2text.PL
index 94516c3..c5460ae 100644
--- a/contrib/perl5/pod/pod2text.PL
+++ b/contrib/perl5/pod/pod2text.PL
@@ -28,21 +28,200 @@ print "Extracting $file (with variable substitutions)\n";
print OUT <<"!GROK!THIS!";
$Config{startperl}
eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
- if \$running_under_some_shell;
+ if \$running_under_some_shell;
!GROK!THIS!
# In the following, perl variables are not expanded during extraction.
print OUT <<'!NO!SUBS!';
-use Pod::Text;
+# pod2text -- Convert POD data to formatted ASCII text.
+#
+# Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# The driver script for Pod::Text, Pod::Text::Termcap, and Pod::Text::Color,
+# invoked by perldoc -t among other things.
-if(@ARGV) {
- pod2text($ARGV[0]);
-} else {
- pod2text("<&STDIN");
+require 5.004;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Text ();
+use Pod::Usage qw(pod2usage);
+
+use strict;
+
+# Take an initial pass through our options, looking for one of the form
+# -<number>. We turn that into -w <number> for compatibility with the
+# original pod2text script.
+for (my $i = 0; $i < @ARGV; $i++) {
+ last if $ARGV[$i] =~ /^--$/;
+ if ($ARGV[$i] =~ /^-(\d+)$/) {
+ splice (@ARGV, $i++, 1, '-w', $1);
+ }
+}
+
+# Insert -- into @ARGV before any single dash argument to hide it from
+# Getopt::Long; we want to interpret it as meaning stdin (which Pod::Parser
+# does correctly).
+my $stdin;
+@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV;
+
+# Parse our options. Use the same names as Pod::Text for simplicity, and
+# default to sentence boundaries turned off for compatibility.
+my %options;
+$options{sentence} = 0;
+Getopt::Long::config ('bundling');
+GetOptions (\%options, 'alt|a', 'color|c', 'help|h', 'indent|i=i',
+ 'loose|l', 'sentence|s', 'termcap|t', 'width|w=i') or exit 1;
+pod2usage (1) if $options{help};
+
+# Figure out what formatter we're going to use. -c overrides -t.
+my $formatter = 'Pod::Text';
+if ($options{color}) {
+ $formatter = 'Pod::Text::Color';
+ eval { require Term::ANSIColor };
+ if ($@) { die "-c (--color) requires Term::ANSIColor be installed\n" }
+ require Pod::Text::Color;
+} elsif ($options{termcap}) {
+ $formatter = 'Pod::Text::Termcap';
+ require Pod::Text::Termcap;
}
+delete @options{'color', 'termcap'};
+
+# Initialize and run the formatter.
+my $parser = $formatter->new (%options);
+$parser->parse_from_file (@ARGV);
+
+__END__
+
+=head1 NAME
+
+pod2text - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+pod2text [B<-aclst>] [B<-i> I<indent>] [B<-w> I<width>] [I<input> [I<output>]]
+
+pod2text B<-h>
+
+=head1 DESCRIPTION
+
+B<pod2text> is a front-end for Pod::Text and its subclasses. It uses them
+to generate formatted ASCII text from POD source. It can optionally use
+either termcap sequences or ANSI color escape sequences to format the text.
+
+I<input> is the file to read for POD source (the POD can be embedded in
+code). If I<input> isn't given, it defaults to STDIN. I<output>, if given,
+is the file to which to write the formatted output. If I<output> isn't
+given, the formatted output is written to STDOUT.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-a>, B<--alt>
+
+Use an alternate output format that, among other things, uses a different
+heading style and marks C<=item> entries with a colon in the left margin.
+
+=item B<-c>, B<--color>
+
+Format the output with ANSI color escape sequences. Using this option
+requires that Term::ANSIColor be installed on your system.
+
+=item B<-i> I<indent>, B<--indent=>I<indent>
+
+Set the number of spaces to indent regular text, and the default indentation
+for C<=over> blocks. Defaults to 4 spaces if this option isn't given.
+
+=item B<-h>, B<--help>
+
+Print out usage information and exit.
+
+=item B<-l>, B<--loose>
+
+Print a blank line after a C<=head1> heading. Normally, no blank line is
+printed after C<=head1>, although one is still printed after C<=head2>,
+because this is the expected formatting for manual pages; if you're
+formatting arbitrary text documents, using this option is recommended.
+
+=item B<-s>, B<--sentence>
+
+Assume each sentence ends with two spaces and try to preserve that spacing.
+Without this option, all consecutive whitespace in non-verbatim paragraphs
+is compressed into a single space.
+
+=item B<-t>, B<--termcap>
+
+Try to determine the width of the screen and the bold and underline
+sequences for the terminal from termcap, and use that information in
+formatting the output. Output will be wrapped at two columns less than the
+width of your terminal device. Using this option requires that your system
+have a termcap file somewhere where Term::Cap can find it and requires that
+your system support termios. With this option, the output of B<pod2text>
+will contain terminal control sequences for your current terminal type.
+
+=item B<-w>, B<--width=>I<width>, B<->I<width>
+
+The column at which to wrap text on the right-hand side. Defaults to 76,
+unless B<-t> is given, in which case it's two columns less than the width of
+your terminal device.
+
+=back
+
+=head1 DIAGNOSTICS
+
+If B<pod2text> fails with errors, see L<Pod::Text> and L<Pod::Parser> for
+information about what those errors might mean. Internally, it can also
+produce the following diagnostics:
+
+=over 4
+
+=item -c (--color) requires Term::ANSIColor be installed
+
+(F) B<-c> or B<--color> were given, but Term::ANSIColor could not be
+loaded.
+
+=item Unknown option: %s
+
+(F) An unknown command line option was given.
+
+=back
+
+In addition, other L<Getopt::Long|Getopt::Long> error messages may result
+from invalid command-line options.
+
+=head1 ENVIRONMENT
+
+=over 4
+
+=item COLUMNS
+
+If B<-t> is given, B<pod2text> will take the current width of your screen
+from this environment variable, if available. It overrides terminal width
+information in TERMCAP.
+
+=item TERMCAP
+
+If B<-t> is given, B<pod2text> will use the contents of this environment
+variable if available to determine the correct formatting sequences for your
+current terminal device.
+
+=back
+
+=head1 SEE ALSO
+
+L<Pod::Text|Pod::Text>, L<Pod::Text::Color|Pod::Text::Color>,
+L<Pod::Text::Termcap|Pod::Text::Termcap>, L<Pod::Parser|Pod::Parser>
+
+=head1 AUTHOR
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>.
+=cut
!NO!SUBS!
close OUT or die "Can't close $file: $!";
diff --git a/contrib/perl5/pod/pod2usage.PL b/contrib/perl5/pod/pod2usage.PL
new file mode 100644
index 0000000..e0f70b2
--- /dev/null
+++ b/contrib/perl5/pod/pod2usage.PL
@@ -0,0 +1,179 @@
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+use Cwd;
+
+# List explicitly here the variables you want Configure to
+# generate. Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries. Thus you write
+# $startperl
+# to ensure Configure will look for $Config{startperl}.
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+$origdir = cwd;
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$// if ($^O eq 'os2' or $^O eq 'dos'); # "case-forgiving"
+$file =~ s/\.pl$/.com/ if ($^O eq 'VMS'); # "case-forgiving"
+
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'}
+ eval 'exec perl -S \$0 "\$@"'
+ if 0;
+!GROK!THIS!
+
+# In the following, perl variables are not expanded during extraction.
+
+print OUT <<'!NO!SUBS!';
+
+#############################################################################
+# pod2usage -- command to print usage messages from embedded pod docs
+#
+# Copyright (c) 1996-1999 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+use strict;
+use diagnostics;
+
+=head1 NAME
+
+pod2usage - print usage messages from embedded pod docs in files
+
+=head1 SYNOPSIS
+
+=over 12
+
+=item B<pod2usage>
+
+[B<-help>]
+[B<-man>]
+[B<-exit>S< >I<exitval>]
+[B<-output>S< >I<outfile>]
+[B<-verbose> I<level>]
+[B<-pathlist> I<dirlist>]
+I<file>
+
+=back
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print this command's manual page and exit.
+
+=item B<-exit> I<exitval>
+
+The exit status value to return.
+
+=item B<-output> I<outfile>
+
+The output file to print to. If the special names "-" or ">&1" or ">&STDOUT"
+are used then standard output is used. If ">&2" or ">&STDERR" is used then
+standard error is used.
+
+=item B<-verbose> I<level>
+
+The desired level of verbosity to use:
+
+ 1 : print SYNOPSIS only
+ 2 : print SYNOPSIS sections and any OPTIONS/ARGUMENTS sections
+ 3 : print the entire manpage (similar to running pod2text)
+
+=item B<-pathlist> I<dirlist>
+
+Specifies one or more directories to search for the input file if it
+was not supplied with an absolute path. Each directory path in the given
+list should be separated by a ':' on Unix (';' on MSWin32 and DOS).
+
+=item I<file>
+
+The pathname of a file containing pod documentation to be output in
+usage mesage format (defaults to standard input).
+
+=back
+
+=head1 DESCRIPTION
+
+B<pod2usage> will read the given input file looking for pod
+documentation and will print the corresponding usage message.
+If no input file is specifed than standard input is read.
+
+B<pod2usage> invokes the B<pod2usage()> function in the B<Pod::Usage>
+module. Please see L<Pod::Usage/pod2usage()>.
+
+=head1 SEE ALSO
+
+L<Pod::Usage>, L<pod2text(1)>
+
+=head1 AUTHOR
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<pod2text(1)> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+use Pod::Usage;
+use Getopt::Long;
+
+## Define options
+my %options = ();
+my @opt_specs = (
+ "help",
+ "man",
+ "exit=i",
+ "output=s",
+ "pathlist=s",
+ "verbose=i",
+);
+
+## Parse options
+GetOptions(\%options, @opt_specs) || pod2usage(2);
+pod2usage(1) if ($options{help});
+pod2usage(VERBOSE => 2) if ($options{man});
+
+## Dont default to STDIN if connected to a terminal
+pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
+
+@ARGV = ("-") unless (@ARGV > 0);
+if (@ARGV > 1) {
+ print STDERR "pod2usage: Too many filenames given\n\n";
+ pod2usage(2);
+}
+
+my %usage = ();
+$usage{-input} = shift(@ARGV);
+$usage{-exitval} = $options{"exit"} if (defined $options{"exit"});
+$usage{-output} = $options{"output"} if (defined $options{"output"});
+$usage{-verbose} = $options{"verbose"} if (defined $options{"verbose"});
+$usage{-pathlist} = $options{"pathlist"} if (defined $options{"pathlist"});
+
+pod2usage(\%usage);
+
+
+!NO!SUBS!
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
diff --git a/contrib/perl5/pod/podchecker.PL b/contrib/perl5/pod/podchecker.PL
new file mode 100644
index 0000000..a7f9643
--- /dev/null
+++ b/contrib/perl5/pod/podchecker.PL
@@ -0,0 +1,162 @@
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+use Cwd;
+
+# List explicitly here the variables you want Configure to
+# generate. Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries. Thus you write
+# $startperl
+# to ensure Configure will look for $Config{startperl}.
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+$origdir = cwd;
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$//
+ if ($^O eq 'VMS' or $^O eq 'os2' or $^O eq 'dos'); # "case-forgiving"
+$file .= '.com' if $^O eq 'VMS';
+
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'}
+ eval 'exec perl -S \$0 "\$@"'
+ if 0;
+!GROK!THIS!
+
+# In the following, perl variables are not expanded during extraction.
+
+print OUT <<'!NO!SUBS!';
+#############################################################################
+# podchecker -- command to invoke the podchecker function in Pod::Checker
+#
+# Copyright (c) 1998-1999 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+use strict;
+#use diagnostics;
+
+=head1 NAME
+
+podchecker - check the syntax of POD format documentation files
+
+=head1 SYNOPSIS
+
+B<podchecker> [B<-help>] [B<-man>] [B<-(no)warnings>] [I<file>S< >...]
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print the manual page and exit.
+
+=item B<-warnings> B<-nowarnings>
+
+Turn on/off printing of warnings.
+
+=item I<file>
+
+The pathname of a POD file to syntax-check (defaults to standard input).
+
+=back
+
+=head1 DESCRIPTION
+
+B<podchecker> will read the given input files looking for POD
+syntax errors in the POD documentation and will print any errors
+it find to STDERR. At the end, it will print a status message
+indicating the number of errors found.
+
+B<podchecker> invokes the B<podchecker()> function exported by B<Pod::Checker>
+Please see L<Pod::Checker/podchecker()> for more details.
+
+=head1 RETURN VALUE
+
+B<podchecker> returns a 0 (zero) exit status if all specified
+POD files are ok.
+
+=head1 ERRORS
+
+B<podchecker> returns the exit status 1 if at least one of
+the given POD files has syntax errors.
+
+The status 2 indicates that at least one of the specified
+files does not contain I<any> POD commands.
+
+Status 1 overrides status 2. If you want unambigouus
+results, call B<podchecker> with one single argument only.
+
+=head1 SEE ALSO
+
+L<Pod::Parser> and L<Pod::Checker>
+
+=head1 AUTHORS
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>,
+Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>
+
+Based on code for B<Pod::Text::pod2text(1)> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+
+use Pod::Checker;
+use Pod::Usage;
+use Getopt::Long;
+
+## Define options
+my %options = (
+ "help" => 0,
+ "man" => 0,
+ "warnings" => 1,
+);
+
+## Parse options
+GetOptions(\%options, "help", "man", "warnings!") || pod2usage(2);
+pod2usage(1) if ($options{help});
+pod2usage(-verbose => 2) if ($options{man});
+
+## Dont default to STDIN if connected to a terminal
+pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
+
+## Invoke podchecker()
+my $status = 0;
+@ARGV = ("<&STDIN") unless(@ARGV);
+for (@ARGV) {
+ my $s = podchecker($_, undef, '-warnings' => $options{warnings});
+ if($s > 0) {
+ # errors occurred
+ $status = 1;
+ }
+ elsif($s < 0) {
+ # no pod found
+ $status = 2 unless($status);
+ }
+}
+exit $status;
+
+!NO!SUBS!
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
diff --git a/contrib/perl5/pod/podselect.PL b/contrib/perl5/pod/podselect.PL
new file mode 100644
index 0000000..f2ba80a
--- /dev/null
+++ b/contrib/perl5/pod/podselect.PL
@@ -0,0 +1,142 @@
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+use Cwd;
+
+# List explicitly here the variables you want Configure to
+# generate. Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries. Thus you write
+# $startperl
+# to ensure Configure will look for $Config{startperl}.
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+$origdir = cwd;
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$// if ($^O eq 'os2' or $^O eq 'dos'); # "case-forgiving"
+$file =~ s/\.pl$/.com/ if ($^O eq 'VMS'); # "case-forgiving"
+
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'}
+ eval 'exec perl -S \$0 "\$@"'
+ if 0;
+!GROK!THIS!
+
+# In the following, perl variables are not expanded during extraction.
+
+print OUT <<'!NO!SUBS!';
+
+#############################################################################
+# podselect -- command to invoke the podselect function in Pod::Select
+#
+# Copyright (c) 1996-1999 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+use strict;
+use diagnostics;
+
+=head1 NAME
+
+podselect - print selected sections of pod documentation on standard output
+
+=head1 SYNOPSIS
+
+B<podselect> [B<-help>] [B<-man>] [B<-section>S< >I<section-spec>]
+[I<file>S< >...]
+
+=head1 OPTIONS AND ARGUMENTS
+
+=over 8
+
+=item B<-help>
+
+Print a brief help message and exit.
+
+=item B<-man>
+
+Print the manual page and exit.
+
+=item B<-section>S< >I<section-spec>
+
+Specify a section to include in the output.
+See L<Pod::Parser/"SECTION SPECIFICATIONS">
+for the format to use for I<section-spec>.
+This option may be given multiple times on the command line.
+
+=item I<file>
+
+The pathname of a file from which to select sections of pod
+documentation (defaults to standard input).
+
+=back
+
+=head1 DESCRIPTION
+
+B<podselect> will read the given input files looking for pod
+documentation and will print out (in raw pod format) all sections that
+match one ore more of the given section specifications. If no section
+specifications are given than all pod sections encountered are output.
+
+B<podselect> invokes the B<podselect()> function exported by B<Pod::Select>
+Please see L<Pod::Select/podselect()> for more details.
+
+=head1 SEE ALSO
+
+L<Pod::Parser> and L<Pod::Select>
+
+=head1 AUTHOR
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text::pod2text(1)> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+use Pod::Select;
+use Pod::Usage;
+use Getopt::Long;
+
+## Define options
+my %options = (
+ "help" => 0,
+ "man" => 0,
+ "sections" => [],
+);
+
+## Parse options
+GetOptions(\%options, "help", "man", "sections|select=s@") || pod2usage(2);
+pod2usage(1) if ($options{help});
+pod2usage(-verbose => 2) if ($options{man});
+
+## Dont default to STDIN if connected to a terminal
+pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
+
+## Invoke podselect().
+if (@{ $options{"sections"} } > 0) {
+ podselect({ -sections => $options{"sections"} }, @ARGV);
+}
+else {
+ podselect(@ARGV);
+}
+
+
+!NO!SUBS!
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
diff --git a/contrib/perl5/pod/roffitall b/contrib/perl5/pod/roffitall
index 9ab7f29..018c0b3 100644
--- a/contrib/perl5/pod/roffitall
+++ b/contrib/perl5/pod/roffitall
@@ -36,24 +36,29 @@ toroff=`
$mandir/perlre.1 \
$mandir/perlrun.1 \
$mandir/perlfunc.1 \
- $mandir/perlopentut.1 \
$mandir/perlvar.1 \
$mandir/perlsub.1 \
+ $mandir/perlopentut.1 \
$mandir/perlmod.1 \
$mandir/perlmodlib.1 \
$mandir/perlmodinstall.1 \
+ $mandir/perlfork.1 \
$mandir/perlform.1 \
$mandir/perllocale.1 \
$mandir/perlref.1 \
$mandir/perlreftut.1 \
$mandir/perldsc.1 \
$mandir/perllol.1 \
+ $mandir/perlboot.1 \
$mandir/perltoot.1 \
$mandir/perlobj.1 \
$mandir/perltie.1 \
$mandir/perlbot.1 \
$mandir/perlipc.1 \
+ $mandir/perlthrtut.1 \
+ $mandir/perldebguts.1 \
$mandir/perldebug.1 \
+ $mandir/perlnumber.1 \
$mandir/perldiag.1 \
$mandir/perlsec.1 \
$mandir/perltrap.1 \
@@ -67,10 +72,15 @@ toroff=`
$mandir/perlxstut.1 \
$mandir/perlguts.1 \
$mandir/perlcall.1 \
- $mandir/perlthrtut.1 \
+ $mandir/perlcompile.1 \
+ $mandir/perltodo.1 \
+ $mandir/perlapi.1 \
+ $mandir/perlintern.1 \
+ $mandir/perlhack.1 \
$mandir/perlhist.1 \
$mandir/perldelta.1 \
$mandir/perl5004delta.1 \
+ $mandir/perl5005delta.1 \
$mandir/perlfaq.1 \
$mandir/perlfaq1.1 \
$mandir/perlfaq2.1 \
@@ -84,6 +94,7 @@ toroff=`
\
$mandir/a2p.1 \
$mandir/c2ph.1 \
+ $mandir/dprofpp.1 \
$mandir/h2ph.1 \
$mandir/h2xs.1 \
$mandir/perlbug.1 \
@@ -102,6 +113,7 @@ toroff=`
$libdir/constant.3 \
$libdir/diagnostics.3 \
$libdir/fields.3 \
+ $libdir/filetest.3 \
$libdir/integer.3 \
$libdir/less.3 \
$libdir/lib.3 \
diff --git a/contrib/perl5/pp.c b/contrib/perl5/pp.c
index 1f62886..a59664e 100644
--- a/contrib/perl5/pp.c
+++ b/contrib/perl5/pp.c
@@ -1,6 +1,6 @@
/* pp.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -13,6 +13,7 @@
*/
#include "EXTERN.h"
+#define PERL_IN_PP_C
#include "perl.h"
/*
@@ -27,37 +28,6 @@ static double UV_MAX_cxux = ((double)UV_MAX);
#endif
/*
- * Types used in bitwise operations.
- *
- * Normally we'd just use IV and UV. However, some hardware and
- * software combinations (e.g. Alpha and current OSF/1) don't have a
- * floating-point type to use for NV that has adequate bits to fully
- * hold an IV/UV. (In other words, sizeof(long) == sizeof(double).)
- *
- * It just so happens that "int" is the right size almost everywhere.
- */
-typedef int IBW;
-typedef unsigned UBW;
-
-/*
- * Mask used after bitwise operations.
- *
- * There is at least one realm (Cray word machines) that doesn't
- * have an integral type (except char) small enough to be represented
- * in a double without loss; that is, it has no 32-bit type.
- */
-#if LONGSIZE > 4 && defined(_CRAY) && !defined(_CRAYMPP)
-# define BW_BITS 32
-# define BW_MASK ((1 << BW_BITS) - 1)
-# define BW_SIGN (1 << (BW_BITS - 1))
-# define BWi(i) (((i) & BW_SIGN) ? ((i) | ~BW_MASK) : ((i) & BW_MASK))
-# define BWu(u) ((u) & BW_MASK)
-#else
-# define BWi(i) (i)
-# define BWu(u) (u)
-#endif
-
-/*
* Offset for integer pack/unpack.
*
* On architectures where I16 and I32 aren't really 16 and 32 bits,
@@ -78,7 +48,14 @@ typedef unsigned UBW;
#define SIZE16 2
#define SIZE32 4
-#if BYTEORDER > 0xFFFF && defined(_CRAY) && !defined(_CRAYMPP)
+/* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
+ --jhi Feb 1999 */
+
+#if SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
+# define PERL_NATINT_PACK
+#endif
+
+#if LONGSIZE > 4 && defined(_CRAY)
# if BYTEORDER == 0x12345678
# define OFF16(p) (char*)(p)
# define OFF32(p) (char*)(p)
@@ -92,23 +69,17 @@ typedef unsigned UBW;
# endif
# define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
# define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
+# define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
# define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
# define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
#else
# define COPY16(s,p) Copy(s, p, SIZE16, char)
# define COPY32(s,p) Copy(s, p, SIZE32, char)
+# define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
# define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
# define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
#endif
-#ifndef PERL_OBJECT
-static void doencodes _((SV* sv, char* s, I32 len));
-static SV* refto _((SV* sv));
-static U32 seed _((void));
-static bool srand_called = FALSE;
-#endif
-
-
/* variations on pp_null */
#ifdef I_UNISTD
@@ -184,12 +155,12 @@ PP(pp_padhv)
RETURN;
gimme = GIMME_V;
if (gimme == G_ARRAY) {
- RETURNOP(do_kv(ARGS));
+ RETURNOP(do_kv());
}
else if (gimme == G_SCALAR) {
SV* sv = sv_newmortal();
if (HvFILL((HV*)TARG))
- sv_setpvf(sv, "%ld/%ld",
+ Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
(long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
else
sv_setiv(sv, 0);
@@ -200,17 +171,19 @@ PP(pp_padhv)
PP(pp_padany)
{
- DIE("NOT IMPL LINE %d",__LINE__);
+ DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
}
/* Translations. */
PP(pp_rv2gv)
{
- djSP; dTOPss;
+ djSP; dTOPss;
if (SvROK(sv)) {
wasref:
+ tryAMAGICunDEREF(to_gv);
+
sv = SvRV(sv);
if (SvTYPE(sv) == SVt_PVIO) {
GV *gv = (GV*) sv_newmortal();
@@ -218,8 +191,9 @@ PP(pp_rv2gv)
GvIOp(gv) = (IO *)sv;
(void)SvREFCNT_inc(sv);
sv = (SV*) gv;
- } else if (SvTYPE(sv) != SVt_PVGV)
- DIE("Not a GLOB reference");
+ }
+ else if (SvTYPE(sv) != SVt_PVGV)
+ DIE(aTHX_ "Not a GLOB reference");
}
else {
if (SvTYPE(sv) != SVt_PVGV) {
@@ -231,18 +205,50 @@ PP(pp_rv2gv)
if (SvROK(sv))
goto wasref;
}
- if (!SvOK(sv)) {
+ if (!SvOK(sv) && sv != &PL_sv_undef) {
+ /* If this is a 'my' scalar and flag is set then vivify
+ * NI-S 1999/05/07
+ */
+ if (PL_op->op_private & OPpDEREF) {
+ char *name;
+ GV *gv;
+ if (cUNOP->op_targ) {
+ STRLEN len;
+ SV *namesv = PL_curpad[cUNOP->op_targ];
+ name = SvPV(namesv, len);
+ gv = (GV*)NEWSV(0,0);
+ gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
+ }
+ else {
+ name = CopSTASHPV(PL_curcop);
+ gv = newGVgen(name);
+ }
+ sv_upgrade(sv, SVt_RV);
+ SvRV(sv) = (SV*)gv;
+ SvROK_on(sv);
+ SvSETMAGIC(sv);
+ goto wasref;
+ }
if (PL_op->op_flags & OPf_REF ||
PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_usym, "a symbol");
- if (PL_dowarn)
- warn(warn_uninit);
+ DIE(aTHX_ PL_no_usym, "a symbol");
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
RETSETUNDEF;
}
sym = SvPV(sv, n_a);
- if (PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_symref, sym, "a symbol");
- sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
+ if ((PL_op->op_flags & OPf_SPECIAL) &&
+ !(PL_op->op_flags & OPf_MOD))
+ {
+ sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
+ if (!sv)
+ RETSETUNDEF;
+ }
+ else {
+ if (PL_op->op_private & HINT_STRICT_REFS)
+ DIE(aTHX_ PL_no_symref, sym, "a symbol");
+ sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
+ }
}
}
if (PL_op->op_private & OPpLVAL_INTRO)
@@ -257,12 +263,14 @@ PP(pp_rv2sv)
if (SvROK(sv)) {
wasref:
+ tryAMAGICunDEREF(to_sv);
+
sv = SvRV(sv);
switch (SvTYPE(sv)) {
case SVt_PVAV:
case SVt_PVHV:
case SVt_PVCV:
- DIE("Not a SCALAR reference");
+ DIE(aTHX_ "Not a SCALAR reference");
}
}
else {
@@ -279,15 +287,24 @@ PP(pp_rv2sv)
if (!SvOK(sv)) {
if (PL_op->op_flags & OPf_REF ||
PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_usym, "a SCALAR");
- if (PL_dowarn)
- warn(warn_uninit);
+ DIE(aTHX_ PL_no_usym, "a SCALAR");
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
RETSETUNDEF;
}
sym = SvPV(sv, n_a);
- if (PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_symref, sym, "a SCALAR");
- gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
+ if ((PL_op->op_flags & OPf_SPECIAL) &&
+ !(PL_op->op_flags & OPf_MOD))
+ {
+ gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
+ if (!gv)
+ RETSETUNDEF;
+ }
+ else {
+ if (PL_op->op_private & HINT_STRICT_REFS)
+ DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
+ gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
+ }
}
sv = GvSV(gv);
}
@@ -340,7 +357,10 @@ PP(pp_pos)
if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
mg = mg_find(sv, 'g');
if (mg && mg->mg_len >= 0) {
- PUSHi(mg->mg_len + PL_curcop->cop_arybase);
+ I32 i = mg->mg_len;
+ if (DO_UTF8(sv))
+ sv_pos_b2u(sv, &i);
+ PUSHi(i + PL_curcop->cop_arybase);
RETURN;
}
}
@@ -360,6 +380,8 @@ PP(pp_rv2cv)
if (cv) {
if (CvCLONE(cv))
cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
+ if ((PL_op->op_private & OPpLVAL_INTRO) && !CvLVALUE(cv))
+ DIE(aTHX_ "Can't modify non-lvalue subroutine call");
}
else
cv = (CV*)&PL_sv_undef;
@@ -389,18 +411,22 @@ PP(pp_prototype)
char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
while (i < MAXO) { /* The slow way. */
- if (strEQ(s + 6, op_name[i]) || strEQ(s + 6, op_desc[i]))
+ if (strEQ(s + 6, PL_op_name[i])
+ || strEQ(s + 6, PL_op_desc[i]))
+ {
goto found;
+ }
i++;
}
goto nonesuch; /* Should not happen... */
found:
- oa = opargs[i] >> OASHIFT;
+ oa = PL_opargs[i] >> OASHIFT;
while (oa) {
if (oa & OA_OPTIONAL) {
seen_question = 1;
str[n++] = ';';
- } else if (seen_question)
+ }
+ else if (n && str[0] == ';' && seen_question)
goto set; /* XXXX system, exec */
if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
&& (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
@@ -411,18 +437,19 @@ PP(pp_prototype)
oa = oa >> 4;
}
str[n++] = '\0';
- ret = sv_2mortal(newSVpv(str, n - 1));
- } else if (code) /* Non-Overridable */
+ ret = sv_2mortal(newSVpvn(str, n - 1));
+ }
+ else if (code) /* Non-Overridable */
goto set;
else { /* None such */
nonesuch:
- croak("Cannot find an opnumber for \"%s\"", s+6);
+ DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
}
}
}
cv = sv_2cv(TOPs, &stash, &gv, FALSE);
if (cv && SvPOK(cv))
- ret = sv_2mortal(newSVpv(SvPVX(cv), SvCUR(cv)));
+ ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
set:
SETs(ret);
RETURN;
@@ -465,7 +492,7 @@ PP(pp_refgen)
}
STATIC SV*
-refto(SV *sv)
+S_refto(pTHX_ SV *sv)
{
SV* rv;
@@ -474,6 +501,14 @@ refto(SV *sv)
vivify_defelem(sv);
if (!(sv = LvTARG(sv)))
sv = &PL_sv_undef;
+ else
+ (void)SvREFCNT_inc(sv);
+ }
+ else if (SvTYPE(sv) == SVt_PVAV) {
+ if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
+ av_reify((AV*)sv);
+ SvTEMP_off(sv);
+ (void)SvREFCNT_inc(sv);
}
else if (SvPADTMP(sv))
sv = newSVsv(sv);
@@ -514,13 +549,14 @@ PP(pp_bless)
HV *stash;
if (MAXARG == 1)
- stash = PL_curcop->cop_stash;
+ stash = CopSTASH(PL_curcop);
else {
SV *ssv = POPs;
STRLEN len;
char *ptr = SvPV(ssv,len);
- if (PL_dowarn && len == 0)
- warn("Explicit blessing to '' (assuming package main)");
+ if (ckWARN(WARN_MISC) && len == 0)
+ Perl_warner(aTHX_ WARN_MISC,
+ "Explicit blessing to '' (assuming package main)");
stash = gv_stashpvn(ptr, len, TRUE);
}
@@ -536,7 +572,7 @@ PP(pp_gelem)
char *elem;
djSP;
STRLEN n_a;
-
+
sv = POPs;
elem = SvPV(sv, n_a);
gv = (GV*)POPs;
@@ -570,7 +606,7 @@ PP(pp_gelem)
break;
case 'N':
if (strEQ(elem, "NAME"))
- sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
+ sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
break;
case 'P':
if (strEQ(elem, "PACKAGE"))
@@ -596,7 +632,6 @@ PP(pp_gelem)
PP(pp_study)
{
djSP; dPOPss;
- register UNOP *unop = cUNOP;
register unsigned char *s;
register I32 pos;
register I32 ch;
@@ -636,7 +671,7 @@ PP(pp_study)
snext = PL_screamnext;
if (!sfirst || !snext)
- DIE("do_study: out of memory");
+ DIE(aTHX_ "do_study: out of memory");
for (ch = 256; ch; --ch)
*sfirst++ = -1;
@@ -668,7 +703,7 @@ PP(pp_trans)
EXTEND(SP,1);
}
TARG = sv_newmortal();
- PUSHi(do_trans(sv, PL_op));
+ PUSHi(do_trans(sv));
RETURN;
}
@@ -753,15 +788,8 @@ PP(pp_undef)
if (!sv)
RETPUSHUNDEF;
- if (SvTHINKFIRST(sv)) {
- if (SvREADONLY(sv)) {
- dTHR;
- if (PL_curcop != &PL_compiling)
- croak(no_modify);
- }
- if (SvROK(sv))
- sv_unref(sv);
- }
+ if (SvTHINKFIRST(sv))
+ sv_force_normal(sv);
switch (SvTYPE(sv)) {
case SVt_NULL:
@@ -773,14 +801,17 @@ PP(pp_undef)
hv_undef((HV*)sv);
break;
case SVt_PVCV:
- if (PL_dowarn && cv_const_sv((CV*)sv))
- warn("Constant subroutine %s undefined",
+ if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
+ Perl_warner(aTHX_ WARN_MISC, "Constant subroutine %s undefined",
CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
/* FALL THROUGH */
case SVt_PVFM:
- { GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
- cv_undef((CV*)sv);
- CvGV((CV*)sv) = gv; } /* let user-undef'd sub keep its identity */
+ {
+ /* let user-undef'd sub keep its identity */
+ GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
+ cv_undef((CV*)sv);
+ CvGV((CV*)sv) = gv;
+ }
break;
case SVt_PVGV:
if (SvFAKE(sv))
@@ -791,7 +822,7 @@ PP(pp_undef)
Newz(602, gp, 1, GP);
GvGP(sv) = gp_ref(gp);
GvSV(sv) = NEWSV(72,0);
- GvLINE(sv) = PL_curcop->cop_line;
+ GvLINE(sv) = CopLINE(PL_curcop);
GvEGV(sv) = (GV*)sv;
GvMULTI_on(sv);
}
@@ -814,8 +845,8 @@ PP(pp_predec)
{
djSP;
if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
- croak(no_modify);
- if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
+ DIE(aTHX_ PL_no_modify);
+ if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MIN)
{
--SvIVX(TOPs);
@@ -831,9 +862,9 @@ PP(pp_postinc)
{
djSP; dTARGET;
if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
- croak(no_modify);
+ DIE(aTHX_ PL_no_modify);
sv_setsv(TARG, TOPs);
- if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
+ if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MAX)
{
++SvIVX(TOPs);
@@ -851,10 +882,10 @@ PP(pp_postinc)
PP(pp_postdec)
{
djSP; dTARGET;
- if(SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
- croak(no_modify);
+ if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
+ DIE(aTHX_ PL_no_modify);
sv_setsv(TARG, TOPs);
- if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
+ if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MIN)
{
--SvIVX(TOPs);
@@ -874,7 +905,7 @@ PP(pp_pow)
djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
{
dPOPTOPnnrl;
- SETn( pow( left, right) );
+ SETn( Perl_pow( left, right) );
RETURN;
}
}
@@ -894,18 +925,19 @@ PP(pp_divide)
djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
{
dPOPPOPnnrl;
- double value;
+ NV value;
if (right == 0.0)
- DIE("Illegal division by zero");
+ DIE(aTHX_ "Illegal division by zero");
#ifdef SLOPPYDIVIDE
/* insure that 20./5. == 4. */
{
IV k;
- if ((double)I_V(left) == left &&
- (double)I_V(right) == right &&
+ if ((NV)I_V(left) == left &&
+ (NV)I_V(right) == right &&
(k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
value = k;
- } else {
+ }
+ else {
value = left / right;
}
}
@@ -921,48 +953,99 @@ PP(pp_modulo)
{
djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
{
- UV left;
- UV right;
- bool left_neg;
- bool right_neg;
- UV ans;
-
- if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
- IV i = SvIVX(POPs);
- right = (right_neg = (i < 0)) ? -i : i;
- }
- else {
- double n = POPn;
- right = U_V((right_neg = (n < 0)) ? -n : n);
- }
+ UV left;
+ UV right;
+ bool left_neg;
+ bool right_neg;
+ bool use_double = 0;
+ NV dright;
+ NV dleft;
+
+ if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
+ IV i = SvIVX(POPs);
+ right = (right_neg = (i < 0)) ? -i : i;
+ }
+ else {
+ dright = POPn;
+ use_double = 1;
+ right_neg = dright < 0;
+ if (right_neg)
+ dright = -dright;
+ }
- if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
- IV i = SvIVX(POPs);
- left = (left_neg = (i < 0)) ? -i : i;
- }
- else {
- double n = POPn;
- left = U_V((left_neg = (n < 0)) ? -n : n);
- }
+ if (!use_double && SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
+ IV i = SvIVX(POPs);
+ left = (left_neg = (i < 0)) ? -i : i;
+ }
+ else {
+ dleft = POPn;
+ if (!use_double) {
+ use_double = 1;
+ dright = right;
+ }
+ left_neg = dleft < 0;
+ if (left_neg)
+ dleft = -dleft;
+ }
- if (!right)
- DIE("Illegal modulus zero");
-
- ans = left % right;
- if ((left_neg != right_neg) && ans)
- ans = right - ans;
- if (right_neg) {
- /* XXX may warn: unary minus operator applied to unsigned type */
- /* could change -foo to be (~foo)+1 instead */
- if (ans <= ~((UV)IV_MAX)+1)
- sv_setiv(TARG, ~ans+1);
- else
- sv_setnv(TARG, -(double)ans);
- }
- else
- sv_setuv(TARG, ans);
- PUSHTARG;
- RETURN;
+ if (use_double) {
+ NV dans;
+
+#if 1
+/* Somehow U_V is pessimized even if CASTFLAGS is 0 */
+# if CASTFLAGS & 2
+# define CAST_D2UV(d) U_V(d)
+# else
+# define CAST_D2UV(d) ((UV)(d))
+# endif
+ /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
+ * or, in other words, precision of UV more than of NV.
+ * But in fact the approach below turned out to be an
+ * optimization - floor() may be slow */
+ if (dright <= UV_MAX && dleft <= UV_MAX) {
+ right = CAST_D2UV(dright);
+ left = CAST_D2UV(dleft);
+ goto do_uv;
+ }
+#endif
+
+ /* Backward-compatibility clause: */
+ dright = Perl_floor(dright + 0.5);
+ dleft = Perl_floor(dleft + 0.5);
+
+ if (!dright)
+ DIE(aTHX_ "Illegal modulus zero");
+
+ dans = Perl_fmod(dleft, dright);
+ if ((left_neg != right_neg) && dans)
+ dans = dright - dans;
+ if (right_neg)
+ dans = -dans;
+ sv_setnv(TARG, dans);
+ }
+ else {
+ UV ans;
+
+ do_uv:
+ if (!right)
+ DIE(aTHX_ "Illegal modulus zero");
+
+ ans = left % right;
+ if ((left_neg != right_neg) && ans)
+ ans = right - ans;
+ if (right_neg) {
+ /* XXX may warn: unary minus operator applied to unsigned type */
+ /* could change -foo to be (~foo)+1 instead */
+ if (ans <= ~((UV)IV_MAX)+1)
+ sv_setiv(TARG, ~ans+1);
+ else
+ sv_setnv(TARG, -(NV)ans);
+ }
+ else
+ sv_setuv(TARG, ans);
+ }
+ PUSHTARG;
+ RETURN;
}
}
@@ -997,12 +1080,6 @@ PP(pp_repeat)
STRLEN len;
tmpstr = POPs;
- if (TARG == tmpstr && SvTHINKFIRST(tmpstr)) {
- if (SvREADONLY(tmpstr) && PL_curcop != &PL_compiling)
- DIE("Can't x= to readonly value");
- if (SvROK(tmpstr))
- sv_unref(tmpstr);
- }
SvSetSV(TARG, tmpstr);
SvPV_force(TARG, len);
if (count != 1) {
@@ -1036,16 +1113,14 @@ PP(pp_left_shift)
{
djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
{
- IBW shift = POPi;
+ IV shift = POPi;
if (PL_op->op_private & HINT_INTEGER) {
- IBW i = TOPi;
- i = BWi(i) << shift;
- SETi(BWi(i));
+ IV i = TOPi;
+ SETi(i << shift);
}
else {
- UBW u = TOPu;
- u <<= shift;
- SETu(BWu(u));
+ UV u = TOPu;
+ SETu(u << shift);
}
RETURN;
}
@@ -1055,16 +1130,14 @@ PP(pp_right_shift)
{
djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
{
- IBW shift = POPi;
+ IV shift = POPi;
if (PL_op->op_private & HINT_INTEGER) {
- IBW i = TOPi;
- i = BWi(i) >> shift;
- SETi(BWi(i));
+ IV i = TOPi;
+ SETi(i >> shift);
}
else {
- UBW u = TOPu;
- u >>= shift;
- SETu(BWu(u));
+ UV u = TOPu;
+ SETu(u >> shift);
}
RETURN;
}
@@ -1126,7 +1199,21 @@ PP(pp_ncmp)
{
dPOPTOPnnrl;
I32 value;
+#ifdef __osf__ /* XXX Configure probe for isnan and isnanl needed XXX */
+#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#define Perl_isnan isnanl
+#else
+#define Perl_isnan isnan
+#endif
+#endif
+#ifdef __osf__ /* XXX fix in 5.6.1 --jhi */
+ if (Perl_isnan(left) || Perl_isnan(right)) {
+ SETs(&PL_sv_undef);
+ RETURN;
+ }
+ value = (left > right) - (left < right);
+#else
if (left == right)
value = 0;
else if (left < right)
@@ -1137,6 +1224,7 @@ PP(pp_ncmp)
SETs(&PL_sv_undef);
RETURN;
}
+#endif
SETi(value);
RETURN;
}
@@ -1234,12 +1322,12 @@ PP(pp_bit_and)
dPOPTOPssrl;
if (SvNIOKp(left) || SvNIOKp(right)) {
if (PL_op->op_private & HINT_INTEGER) {
- IBW value = SvIV(left) & SvIV(right);
- SETi(BWi(value));
+ IV i = SvIV(left) & SvIV(right);
+ SETi(i);
}
else {
- UBW value = SvUV(left) & SvUV(right);
- SETu(BWu(value));
+ UV u = SvUV(left) & SvUV(right);
+ SETu(u);
}
}
else {
@@ -1257,12 +1345,12 @@ PP(pp_bit_xor)
dPOPTOPssrl;
if (SvNIOKp(left) || SvNIOKp(right)) {
if (PL_op->op_private & HINT_INTEGER) {
- IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
- SETi(BWi(value));
+ IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
+ SETi(i);
}
else {
- UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
- SETu(BWu(value));
+ UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
+ SETu(u);
}
}
else {
@@ -1280,12 +1368,12 @@ PP(pp_bit_or)
dPOPTOPssrl;
if (SvNIOKp(left) || SvNIOKp(right)) {
if (PL_op->op_private & HINT_INTEGER) {
- IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
- SETi(BWi(value));
+ IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
+ SETi(i);
}
else {
- UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
- SETu(BWu(value));
+ UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
+ SETu(u);
}
}
else {
@@ -1303,9 +1391,23 @@ PP(pp_negate)
dTOPss;
if (SvGMAGICAL(sv))
mg_get(sv);
- if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv) && SvIVX(sv) != IV_MIN)
- SETi(-SvIVX(sv));
- else if (SvNIOKp(sv))
+ if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv)) {
+ if (SvIsUV(sv)) {
+ if (SvIVX(sv) == IV_MIN) {
+ SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
+ RETURN;
+ }
+ else if (SvUVX(sv) <= IV_MAX) {
+ SETi(-SvIVX(sv));
+ RETURN;
+ }
+ }
+ else if (SvIVX(sv) != IV_MIN) {
+ SETi(-SvIVX(sv));
+ RETURN;
+ }
+ }
+ if (SvNIOKp(sv))
SETn(-SvNV(sv));
else if (SvPOKp(sv)) {
STRLEN len;
@@ -1318,6 +1420,10 @@ PP(pp_negate)
sv_setsv(TARG, sv);
*SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
}
+ else if (DO_UTF8(sv) && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
+ sv_setpvn(TARG, "-", 1);
+ sv_catsv(TARG, sv);
+ }
else
sv_setnv(TARG, -SvNV(sv));
SETTARG;
@@ -1330,9 +1436,7 @@ PP(pp_negate)
PP(pp_not)
{
-#ifdef OVERLOAD
djSP; tryAMAGICunSET(not);
-#endif /* OVERLOAD */
*PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
return NORMAL;
}
@@ -1344,12 +1448,12 @@ PP(pp_complement)
dTOPss;
if (SvNIOKp(sv)) {
if (PL_op->op_private & HINT_INTEGER) {
- IBW value = ~SvIV(sv);
- SETi(BWi(value));
+ IV i = ~SvIV(sv);
+ SETi(i);
}
else {
- UBW value = ~SvUV(sv);
- SETu(BWu(value));
+ UV u = ~SvUV(sv);
+ SETu(u);
}
}
else {
@@ -1396,7 +1500,7 @@ PP(pp_i_divide)
{
dPOPiv;
if (value == 0)
- DIE("Illegal division by zero");
+ DIE(aTHX_ "Illegal division by zero");
value = POPi / value;
PUSHi( value );
RETURN;
@@ -1409,7 +1513,7 @@ PP(pp_i_modulo)
{
dPOPTOPiirl;
if (!right)
- DIE("Illegal modulus zero");
+ DIE(aTHX_ "Illegal modulus zero");
SETi( left % right );
RETURN;
}
@@ -1527,7 +1631,7 @@ PP(pp_atan2)
djSP; dTARGET; tryAMAGICbin(atan2,0);
{
dPOPTOPnnrl;
- SETn(atan2(left, right));
+ SETn(Perl_atan2(left, right));
RETURN;
}
}
@@ -1536,9 +1640,9 @@ PP(pp_sin)
{
djSP; dTARGET; tryAMAGICun(sin);
{
- double value;
+ NV value;
value = POPn;
- value = sin(value);
+ value = Perl_sin(value);
XPUSHn(value);
RETURN;
}
@@ -1548,9 +1652,9 @@ PP(pp_cos)
{
djSP; dTARGET; tryAMAGICun(cos);
{
- double value;
+ NV value;
value = POPn;
- value = cos(value);
+ value = Perl_cos(value);
XPUSHn(value);
RETURN;
}
@@ -1562,40 +1666,30 @@ PP(pp_cos)
compatibility by calling rand() but allow the user to override it.
See INSTALL for details. --Andy Dougherty 15 July 1998
*/
-#ifndef my_rand
-# define my_rand rand
-#endif
-#ifndef my_srand
-# define my_srand srand
+/* Now it's after 5.005, and Configure supports drand48() and random(),
+ in addition to rand(). So the overrides should not be needed any more.
+ --Jarkko Hietaniemi 27 September 1998
+ */
+
+#ifndef HAS_DRAND48_PROTO
+extern double drand48 (void);
#endif
PP(pp_rand)
{
djSP; dTARGET;
- double value;
+ NV value;
if (MAXARG < 1)
value = 1.0;
else
value = POPn;
if (value == 0.0)
value = 1.0;
- if (!srand_called) {
- (void)my_srand((unsigned)seed());
- srand_called = TRUE;
+ if (!PL_srand_called) {
+ (void)seedDrand01((Rand_seed_t)seed());
+ PL_srand_called = TRUE;
}
-#if RANDBITS == 31
- value = my_rand() * value / 2147483648.0;
-#else
-#if RANDBITS == 16
- value = my_rand() * value / 65536.0;
-#else
-#if RANDBITS == 15
- value = my_rand() * value / 32768.0;
-#else
- value = my_rand() * value / (double)(((unsigned long)1) << RANDBITS);
-#endif
-#endif
-#endif
+ value *= Drand01();
XPUSHn(value);
RETURN;
}
@@ -1608,22 +1702,22 @@ PP(pp_srand)
anum = seed();
else
anum = POPu;
- (void)my_srand((unsigned)anum);
- srand_called = TRUE;
+ (void)seedDrand01((Rand_seed_t)anum);
+ PL_srand_called = TRUE;
EXTEND(SP, 1);
RETPUSHYES;
}
STATIC U32
-seed(void)
+S_seed(pTHX)
{
/*
* This is really just a quick hack which grabs various garbage
* values. It really should be a real hash algorithm which
* spreads the effect of every input bit onto every output bit,
- * if someone who knows about such tings would bother to write it.
+ * if someone who knows about such things would bother to write it.
* Might be a good idea to add that function to CORE as well.
- * No numbers below come from careful analysis or anyting here,
+ * No numbers below come from careful analysis or anything here,
* except they are primes and SEED_C1 > 1E6 to get a full-width
* value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
* probably be bigger too.
@@ -1688,10 +1782,10 @@ seed(void)
u = (U32)SEED_C1 * when;
# endif
#endif
- u += SEED_C3 * (U32)getpid();
- u += SEED_C4 * (U32)(UV)PL_stack_sp;
+ u += SEED_C3 * (U32)PerlProc_getpid();
+ u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
#ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
- u += SEED_C5 * (U32)(UV)&when;
+ u += SEED_C5 * (U32)PTR2UV(&when);
#endif
return u;
}
@@ -1700,9 +1794,9 @@ PP(pp_exp)
{
djSP; dTARGET; tryAMAGICun(exp);
{
- double value;
+ NV value;
value = POPn;
- value = exp(value);
+ value = Perl_exp(value);
XPUSHn(value);
RETURN;
}
@@ -1712,13 +1806,13 @@ PP(pp_log)
{
djSP; dTARGET; tryAMAGICun(log);
{
- double value;
+ NV value;
value = POPn;
if (value <= 0.0) {
- SET_NUMERIC_STANDARD();
- DIE("Can't take log of %g", value);
+ RESTORE_NUMERIC_STANDARD();
+ DIE(aTHX_ "Can't take log of %g", value);
}
- value = log(value);
+ value = Perl_log(value);
XPUSHn(value);
RETURN;
}
@@ -1728,13 +1822,13 @@ PP(pp_sqrt)
{
djSP; dTARGET; tryAMAGICun(sqrt);
{
- double value;
+ NV value;
value = POPn;
if (value < 0.0) {
- SET_NUMERIC_STANDARD();
- DIE("Can't take sqrt of %g", value);
+ RESTORE_NUMERIC_STANDARD();
+ DIE(aTHX_ "Can't take sqrt of %g", value);
}
- value = sqrt(value);
+ value = Perl_sqrt(value);
XPUSHn(value);
RETURN;
}
@@ -1744,7 +1838,7 @@ PP(pp_int)
{
djSP; dTARGET;
{
- double value = TOPn;
+ NV value = TOPn;
IV iv;
if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
@@ -1753,9 +1847,9 @@ PP(pp_int)
}
else {
if (value >= 0.0)
- (void)modf(value, &value);
+ (void)Perl_modf(value, &value);
else {
- (void)modf(-value, &value);
+ (void)Perl_modf(-value, &value);
value = -value;
}
iv = I_V(value);
@@ -1772,7 +1866,7 @@ PP(pp_abs)
{
djSP; dTARGET; tryAMAGICun(abs);
{
- double value = TOPn;
+ NV value = TOPn;
IV iv;
if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
@@ -1798,14 +1892,14 @@ PP(pp_hex)
STRLEN n_a;
tmps = POPpx;
- XPUSHu(scan_hex(tmps, 99, &argtype));
+ XPUSHn(scan_hex(tmps, 99, &argtype));
RETURN;
}
PP(pp_oct)
{
djSP; dTARGET;
- UV value;
+ NV value;
I32 argtype;
char *tmps;
STRLEN n_a;
@@ -1817,9 +1911,11 @@ PP(pp_oct)
tmps++;
if (*tmps == 'x')
value = scan_hex(++tmps, 99, &argtype);
+ else if (*tmps == 'b')
+ value = scan_bin(++tmps, 99, &argtype);
else
value = scan_oct(tmps, 99, &argtype);
- XPUSHu(value);
+ XPUSHn(value);
RETURN;
}
@@ -1828,7 +1924,12 @@ PP(pp_oct)
PP(pp_length)
{
djSP; dTARGET;
- SETi( sv_len(TOPs) );
+ SV *sv = TOPs;
+
+ if (DO_UTF8(sv))
+ SETi(sv_len_utf8(sv));
+ else
+ SETi(sv_len(sv));
RETURN;
}
@@ -1838,6 +1939,7 @@ PP(pp_substr)
SV *sv;
I32 len;
STRLEN curlen;
+ STRLEN utfcurlen;
I32 pos;
I32 rem;
I32 fail;
@@ -1848,6 +1950,7 @@ PP(pp_substr)
STRLEN repl_len;
SvTAINTED_off(TARG); /* decontaminate */
+ SvUTF8_off(TARG); /* decontaminate */
if (MAXARG > 2) {
if (MAXARG > 3) {
sv = POPs;
@@ -1859,6 +1962,16 @@ PP(pp_substr)
sv = POPs;
PUTBACK;
tmps = SvPV(sv, curlen);
+ if (DO_UTF8(sv)) {
+ utfcurlen = sv_len_utf8(sv);
+ if (utfcurlen == curlen)
+ utfcurlen = 0;
+ else
+ curlen = utfcurlen;
+ }
+ else
+ utfcurlen = 0;
+
if (pos >= arybase) {
pos -= arybase;
rem = curlen-pos;
@@ -1893,20 +2006,29 @@ PP(pp_substr)
rem -= pos;
}
if (fail < 0) {
- if (PL_dowarn || lvalue || repl)
- warn("substr outside of string");
+ if (lvalue || repl)
+ Perl_croak(aTHX_ "substr outside of string");
+ if (ckWARN(WARN_SUBSTR))
+ Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
RETPUSHUNDEF;
}
else {
+ if (utfcurlen) {
+ sv_pos_u2b(sv, &pos, &rem);
+ SvUTF8_on(TARG);
+ }
tmps += pos;
sv_setpvn(TARG, tmps, rem);
- if (lvalue) { /* it's an lvalue! */
+ if (repl)
+ sv_insert(sv, pos, rem, repl, repl_len);
+ else if (lvalue) { /* it's an lvalue! */
if (!SvGMAGICAL(sv)) {
if (SvROK(sv)) {
STRLEN n_a;
SvPV_force(sv,n_a);
- if (PL_dowarn)
- warn("Attempt to use reference as lvalue in substr");
+ if (ckWARN(WARN_SUBSTR))
+ Perl_warner(aTHX_ WARN_SUBSTR,
+ "Attempt to use reference as lvalue in substr");
}
if (SvOK(sv)) /* is it defined ? */
(void)SvPOK_only(sv);
@@ -1928,8 +2050,6 @@ PP(pp_substr)
LvTARGOFF(TARG) = pos;
LvTARGLEN(TARG) = rem;
}
- else if (repl)
- sv_insert(sv, pos, rem, repl, repl_len);
}
SPAGAIN;
PUSHs(TARG); /* avoid SvSETMAGIC here */
@@ -1943,74 +2063,24 @@ PP(pp_vec)
register I32 offset = POPi;
register SV *src = POPs;
I32 lvalue = PL_op->op_flags & OPf_MOD;
- STRLEN srclen;
- unsigned char *s = (unsigned char*)SvPV(src, srclen);
- unsigned long retnum;
- I32 len;
-
- SvTAINTED_off(TARG); /* decontaminate */
- offset *= size; /* turn into bit offset */
- len = (offset + size + 7) / 8;
- if (offset < 0 || size < 1)
- retnum = 0;
- else {
- if (lvalue) { /* it's an lvalue! */
- if (SvTYPE(TARG) < SVt_PVLV) {
- sv_upgrade(TARG, SVt_PVLV);
- sv_magic(TARG, Nullsv, 'v', Nullch, 0);
- }
- LvTYPE(TARG) = 'v';
- if (LvTARG(TARG) != src) {
- if (LvTARG(TARG))
- SvREFCNT_dec(LvTARG(TARG));
- LvTARG(TARG) = SvREFCNT_inc(src);
- }
- LvTARGOFF(TARG) = offset;
- LvTARGLEN(TARG) = size;
- }
- if (len > srclen) {
- if (size <= 8)
- retnum = 0;
- else {
- offset >>= 3;
- if (size == 16) {
- if (offset >= srclen)
- retnum = 0;
- else
- retnum = (unsigned long) s[offset] << 8;
- }
- else if (size == 32) {
- if (offset >= srclen)
- retnum = 0;
- else if (offset + 1 >= srclen)
- retnum = (unsigned long) s[offset] << 24;
- else if (offset + 2 >= srclen)
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16);
- else
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16) +
- (s[offset + 2] << 8);
- }
- }
+ SvTAINTED_off(TARG); /* decontaminate */
+ if (lvalue) { /* it's an lvalue! */
+ if (SvTYPE(TARG) < SVt_PVLV) {
+ sv_upgrade(TARG, SVt_PVLV);
+ sv_magic(TARG, Nullsv, 'v', Nullch, 0);
}
- else if (size < 8)
- retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
- else {
- offset >>= 3;
- if (size == 8)
- retnum = s[offset];
- else if (size == 16)
- retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
- else if (size == 32)
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16) +
- (s[offset + 2] << 8) + s[offset+3];
+ LvTYPE(TARG) = 'v';
+ if (LvTARG(TARG) != src) {
+ if (LvTARG(TARG))
+ SvREFCNT_dec(LvTARG(TARG));
+ LvTARG(TARG) = SvREFCNT_inc(src);
}
+ LvTARGOFF(TARG) = offset;
+ LvTARGLEN(TARG) = size;
}
- sv_setuv(TARG, (UV)retnum);
+ sv_setuv(TARG, do_vecget(src, offset, size));
PUSHs(TARG);
RETURN;
}
@@ -2034,16 +2104,20 @@ PP(pp_index)
little = POPs;
big = POPs;
tmps = SvPV(big, biglen);
+ if (offset > 0 && DO_UTF8(big))
+ sv_pos_u2b(big, &offset, 0);
if (offset < 0)
offset = 0;
else if (offset > biglen)
offset = biglen;
if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
(unsigned char*)tmps + biglen, little, 0)))
- retval = -1 + arybase;
+ retval = -1;
else
- retval = tmps2 - tmps + arybase;
- PUSHi(retval);
+ retval = tmps2 - tmps;
+ if (retval > 0 && DO_UTF8(big))
+ sv_pos_b2u(big, &retval);
+ PUSHi(retval + arybase);
RETURN;
}
@@ -2054,7 +2128,6 @@ PP(pp_rindex)
SV *little;
STRLEN blen;
STRLEN llen;
- SV *offstr;
I32 offset;
I32 retval;
char *tmps;
@@ -2062,37 +2135,36 @@ PP(pp_rindex)
I32 arybase = PL_curcop->cop_arybase;
if (MAXARG >= 3)
- offstr = POPs;
+ offset = POPi;
little = POPs;
big = POPs;
tmps2 = SvPV(little, llen);
tmps = SvPV(big, blen);
if (MAXARG < 3)
offset = blen;
- else
- offset = SvIV(offstr) - arybase + llen;
+ else {
+ if (offset > 0 && DO_UTF8(big))
+ sv_pos_u2b(big, &offset, 0);
+ offset = offset - arybase + llen;
+ }
if (offset < 0)
offset = 0;
else if (offset > blen)
offset = blen;
if (!(tmps2 = rninstr(tmps, tmps + offset,
tmps2, tmps2 + llen)))
- retval = -1 + arybase;
+ retval = -1;
else
- retval = tmps2 - tmps + arybase;
- PUSHi(retval);
+ retval = tmps2 - tmps;
+ if (retval > 0 && DO_UTF8(big))
+ sv_pos_b2u(big, &retval);
+ PUSHi(retval + arybase);
RETURN;
}
PP(pp_sprintf)
{
djSP; dMARK; dORIGMARK; dTARGET;
-#ifdef USE_LOCALE_NUMERIC
- if (PL_op->op_private & OPpLOCALE)
- SET_NUMERIC_LOCAL();
- else
- SET_NUMERIC_STANDARD();
-#endif
do_sprintf(TARG, SP-MARK, MARK+1);
TAINT_IF(SvTAINTED(TARG));
SP = ORIGMARK;
@@ -2103,20 +2175,17 @@ PP(pp_sprintf)
PP(pp_ord)
{
djSP; dTARGET;
- I32 value;
- char *tmps;
+ UV value;
STRLEN n_a;
+ SV *tmpsv = POPs;
+ U8 *tmps = (U8*)SvPVx(tmpsv,n_a);
+ I32 retlen;
-#ifndef I286
- tmps = POPpx;
- value = (I32) (*tmps & 255);
-#else
- I32 anum;
- tmps = POPpx;
- anum = (I32) *tmps;
- value = (I32) (anum & 255);
-#endif
- XPUSHi(value);
+ if ((*tmps & 0x80) && DO_UTF8(tmpsv))
+ value = utf8_to_uv(tmps, &retlen);
+ else
+ value = (UV)(*tmps & 255);
+ XPUSHu(value);
RETURN;
}
@@ -2124,13 +2193,28 @@ PP(pp_chr)
{
djSP; dTARGET;
char *tmps;
+ U32 value = POPu;
(void)SvUPGRADE(TARG,SVt_PV);
+
+ if (value > 255 && !IN_BYTE) {
+ SvGROW(TARG, UTF8_MAXLEN+1);
+ tmps = SvPVX(TARG);
+ tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
+ SvCUR_set(TARG, tmps - SvPVX(TARG));
+ *tmps = '\0';
+ (void)SvPOK_only(TARG);
+ SvUTF8_on(TARG);
+ XPUSHs(TARG);
+ RETURN;
+ }
+
SvGROW(TARG,2);
SvCUR_set(TARG, 1);
tmps = SvPVX(TARG);
- *tmps++ = POPi;
+ *tmps++ = value;
*tmps = '\0';
+ SvUTF8_off(TARG); /* decontaminate */
(void)SvPOK_only(TARG);
XPUSHs(TARG);
RETURN;
@@ -2148,7 +2232,7 @@ PP(pp_crypt)
sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
#endif
#else
- DIE(
+ DIE(aTHX_
"The crypt() function is unimplemented due to excessive paranoia.");
#endif
SETs(TARG);
@@ -2159,26 +2243,58 @@ PP(pp_ucfirst)
{
djSP;
SV *sv = TOPs;
- register char *s;
- STRLEN n_a;
+ register U8 *s;
+ STRLEN slen;
+
+ if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
+ I32 ulen;
+ U8 tmpbuf[UTF8_MAXLEN];
+ U8 *tend;
+ UV uv = utf8_to_uv(s, &ulen);
- if (!SvPADTMP(sv)) {
- dTARGET;
- sv_setsv(TARG, sv);
- sv = TARG;
- SETs(sv);
- }
- s = SvPV_force(sv, n_a);
- if (*s) {
if (PL_op->op_private & OPpLOCALE) {
TAINT;
SvTAINTED_on(sv);
- *s = toUPPER_LC(*s);
+ uv = toTITLE_LC_uni(uv);
}
else
- *s = toUPPER(*s);
+ uv = toTITLE_utf8(s);
+
+ tend = uv_to_utf8(tmpbuf, uv);
+
+ if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
+ dTARGET;
+ sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
+ sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
+ SvUTF8_on(TARG);
+ SETs(TARG);
+ }
+ else {
+ s = (U8*)SvPV_force(sv, slen);
+ Copy(tmpbuf, s, ulen, U8);
+ }
}
-
+ else {
+ if (!SvPADTMP(sv) || SvREADONLY(sv)) {
+ dTARGET;
+ SvUTF8_off(TARG); /* decontaminate */
+ sv_setsv(TARG, sv);
+ sv = TARG;
+ SETs(sv);
+ }
+ s = (U8*)SvPV_force(sv, slen);
+ if (*s) {
+ if (PL_op->op_private & OPpLOCALE) {
+ TAINT;
+ SvTAINTED_on(sv);
+ *s = toUPPER_LC(*s);
+ }
+ else
+ *s = toUPPER(*s);
+ }
+ }
+ if (SvSMAGICAL(sv))
+ mg_set(sv);
RETURN;
}
@@ -2186,27 +2302,58 @@ PP(pp_lcfirst)
{
djSP;
SV *sv = TOPs;
- register char *s;
- STRLEN n_a;
+ register U8 *s;
+ STRLEN slen;
+
+ if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
+ I32 ulen;
+ U8 tmpbuf[UTF8_MAXLEN];
+ U8 *tend;
+ UV uv = utf8_to_uv(s, &ulen);
- if (!SvPADTMP(sv)) {
- dTARGET;
- sv_setsv(TARG, sv);
- sv = TARG;
- SETs(sv);
- }
- s = SvPV_force(sv, n_a);
- if (*s) {
if (PL_op->op_private & OPpLOCALE) {
TAINT;
SvTAINTED_on(sv);
- *s = toLOWER_LC(*s);
+ uv = toLOWER_LC_uni(uv);
}
else
- *s = toLOWER(*s);
+ uv = toLOWER_utf8(s);
+
+ tend = uv_to_utf8(tmpbuf, uv);
+
+ if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
+ dTARGET;
+ sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
+ sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
+ SvUTF8_on(TARG);
+ SETs(TARG);
+ }
+ else {
+ s = (U8*)SvPV_force(sv, slen);
+ Copy(tmpbuf, s, ulen, U8);
+ }
}
-
- SETs(sv);
+ else {
+ if (!SvPADTMP(sv) || SvREADONLY(sv)) {
+ dTARGET;
+ SvUTF8_off(TARG); /* decontaminate */
+ sv_setsv(TARG, sv);
+ sv = TARG;
+ SETs(sv);
+ }
+ s = (U8*)SvPV_force(sv, slen);
+ if (*s) {
+ if (PL_op->op_private & OPpLOCALE) {
+ TAINT;
+ SvTAINTED_on(sv);
+ *s = toLOWER_LC(*s);
+ }
+ else
+ *s = toLOWER(*s);
+ }
+ }
+ if (SvSMAGICAL(sv))
+ mg_set(sv);
RETURN;
}
@@ -2214,31 +2361,73 @@ PP(pp_uc)
{
djSP;
SV *sv = TOPs;
- register char *s;
+ register U8 *s;
STRLEN len;
- if (!SvPADTMP(sv)) {
+ if (DO_UTF8(sv)) {
dTARGET;
- sv_setsv(TARG, sv);
- sv = TARG;
- SETs(sv);
- }
-
- s = SvPV_force(sv, len);
- if (len) {
- register char *send = s + len;
-
- if (PL_op->op_private & OPpLOCALE) {
- TAINT;
- SvTAINTED_on(sv);
- for (; s < send; s++)
- *s = toUPPER_LC(*s);
+ I32 ulen;
+ register U8 *d;
+ U8 *send;
+
+ s = (U8*)SvPV(sv,len);
+ if (!len) {
+ SvUTF8_off(TARG); /* decontaminate */
+ sv_setpvn(TARG, "", 0);
+ SETs(TARG);
}
else {
- for (; s < send; s++)
- *s = toUPPER(*s);
+ (void)SvUPGRADE(TARG, SVt_PV);
+ SvGROW(TARG, (len * 2) + 1);
+ (void)SvPOK_only(TARG);
+ d = (U8*)SvPVX(TARG);
+ send = s + len;
+ if (PL_op->op_private & OPpLOCALE) {
+ TAINT;
+ SvTAINTED_on(TARG);
+ while (s < send) {
+ d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
+ s += ulen;
+ }
+ }
+ else {
+ while (s < send) {
+ d = uv_to_utf8(d, toUPPER_utf8( s ));
+ s += UTF8SKIP(s);
+ }
+ }
+ *d = '\0';
+ SvUTF8_on(TARG);
+ SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
+ SETs(TARG);
}
}
+ else {
+ if (!SvPADTMP(sv) || SvREADONLY(sv)) {
+ dTARGET;
+ SvUTF8_off(TARG); /* decontaminate */
+ sv_setsv(TARG, sv);
+ sv = TARG;
+ SETs(sv);
+ }
+ s = (U8*)SvPV_force(sv, len);
+ if (len) {
+ register U8 *send = s + len;
+
+ if (PL_op->op_private & OPpLOCALE) {
+ TAINT;
+ SvTAINTED_on(sv);
+ for (; s < send; s++)
+ *s = toUPPER_LC(*s);
+ }
+ else {
+ for (; s < send; s++)
+ *s = toUPPER(*s);
+ }
+ }
+ }
+ if (SvSMAGICAL(sv))
+ mg_set(sv);
RETURN;
}
@@ -2246,31 +2435,74 @@ PP(pp_lc)
{
djSP;
SV *sv = TOPs;
- register char *s;
+ register U8 *s;
STRLEN len;
- if (!SvPADTMP(sv)) {
+ if (DO_UTF8(sv)) {
dTARGET;
- sv_setsv(TARG, sv);
- sv = TARG;
- SETs(sv);
+ I32 ulen;
+ register U8 *d;
+ U8 *send;
+
+ s = (U8*)SvPV(sv,len);
+ if (!len) {
+ SvUTF8_off(TARG); /* decontaminate */
+ sv_setpvn(TARG, "", 0);
+ SETs(TARG);
+ }
+ else {
+ (void)SvUPGRADE(TARG, SVt_PV);
+ SvGROW(TARG, (len * 2) + 1);
+ (void)SvPOK_only(TARG);
+ d = (U8*)SvPVX(TARG);
+ send = s + len;
+ if (PL_op->op_private & OPpLOCALE) {
+ TAINT;
+ SvTAINTED_on(TARG);
+ while (s < send) {
+ d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
+ s += ulen;
+ }
+ }
+ else {
+ while (s < send) {
+ d = uv_to_utf8(d, toLOWER_utf8(s));
+ s += UTF8SKIP(s);
+ }
+ }
+ *d = '\0';
+ SvUTF8_on(TARG);
+ SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
+ SETs(TARG);
+ }
}
+ else {
+ if (!SvPADTMP(sv) || SvREADONLY(sv)) {
+ dTARGET;
+ SvUTF8_off(TARG); /* decontaminate */
+ sv_setsv(TARG, sv);
+ sv = TARG;
+ SETs(sv);
+ }
- s = SvPV_force(sv, len);
- if (len) {
- register char *send = s + len;
+ s = (U8*)SvPV_force(sv, len);
+ if (len) {
+ register U8 *send = s + len;
- if (PL_op->op_private & OPpLOCALE) {
- TAINT;
- SvTAINTED_on(sv);
- for (; s < send; s++)
- *s = toLOWER_LC(*s);
- }
- else {
- for (; s < send; s++)
- *s = toLOWER(*s);
+ if (PL_op->op_private & OPpLOCALE) {
+ TAINT;
+ SvTAINTED_on(sv);
+ for (; s < send; s++)
+ *s = toLOWER_LC(*s);
+ }
+ else {
+ for (; s < send; s++)
+ *s = toLOWER(*s);
+ }
}
}
+ if (SvSMAGICAL(sv))
+ mg_set(sv);
RETURN;
}
@@ -2282,14 +2514,36 @@ PP(pp_quotemeta)
register char *s = SvPV(sv,len);
register char *d;
+ SvUTF8_off(TARG); /* decontaminate */
if (len) {
(void)SvUPGRADE(TARG, SVt_PV);
SvGROW(TARG, (len * 2) + 1);
d = SvPVX(TARG);
- while (len--) {
- if (!isALNUM(*s))
- *d++ = '\\';
- *d++ = *s++;
+ if (DO_UTF8(sv)) {
+ while (len) {
+ if (*s & 0x80) {
+ STRLEN ulen = UTF8SKIP(s);
+ if (ulen > len)
+ ulen = len;
+ len -= ulen;
+ while (ulen--)
+ *d++ = *s++;
+ }
+ else {
+ if (!isALNUM(*s))
+ *d++ = '\\';
+ *d++ = *s++;
+ len--;
+ }
+ }
+ SvUTF8_on(TARG);
+ }
+ else {
+ while (len--) {
+ if (!isALNUM(*s))
+ *d++ = '\\';
+ *d++ = *s++;
+ }
}
*d = '\0';
SvCUR_set(TARG, d - SvPVX(TARG));
@@ -2298,6 +2552,8 @@ PP(pp_quotemeta)
else
sv_setpvn(TARG, s, len);
SETs(TARG);
+ if (SvSMAGICAL(TARG))
+ mg_set(TARG);
RETURN;
}
@@ -2331,7 +2587,7 @@ PP(pp_aslice)
svp = av_fetch(av, elem, lval);
if (lval) {
if (!svp || *svp == &PL_sv_undef)
- DIE(no_aelem, elem);
+ DIE(aTHX_ PL_no_aelem, elem);
if (PL_op->op_private & OPpLVAL_INTRO)
save_aelem(av, elem, svp);
}
@@ -2350,7 +2606,7 @@ PP(pp_aslice)
PP(pp_each)
{
- djSP; dTARGET;
+ djSP;
HV *hash = (HV*)POPs;
HE *entry;
I32 gimme = GIMME_V;
@@ -2365,12 +2621,13 @@ PP(pp_each)
if (entry) {
PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
if (gimme == G_ARRAY) {
+ SV *val;
PUTBACK;
/* might clobber stack_sp */
- sv_setsv(TARG, realhv ?
- hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry));
+ val = realhv ?
+ hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
SPAGAIN;
- PUSHs(TARG);
+ PUSHs(val);
}
}
else if (gimme == G_SCALAR)
@@ -2381,12 +2638,12 @@ PP(pp_each)
PP(pp_values)
{
- return do_kv(ARGS);
+ return do_kv();
}
PP(pp_keys)
{
- return do_kv(ARGS);
+ return do_kv();
}
PP(pp_delete)
@@ -2402,13 +2659,28 @@ PP(pp_delete)
U32 hvtype;
hv = (HV*)POPs;
hvtype = SvTYPE(hv);
- while (++MARK <= SP) {
- if (hvtype == SVt_PVHV)
+ if (hvtype == SVt_PVHV) { /* hash element */
+ while (++MARK <= SP) {
sv = hv_delete_ent(hv, *MARK, discard, 0);
- else
- DIE("Not a HASH reference");
- *MARK = sv ? sv : &PL_sv_undef;
+ *MARK = sv ? sv : &PL_sv_undef;
+ }
+ }
+ else if (hvtype == SVt_PVAV) {
+ if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
+ while (++MARK <= SP) {
+ sv = av_delete((AV*)hv, SvIV(*MARK), discard);
+ *MARK = sv ? sv : &PL_sv_undef;
+ }
+ }
+ else { /* pseudo-hash element */
+ while (++MARK <= SP) {
+ sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
+ *MARK = sv ? sv : &PL_sv_undef;
+ }
+ }
}
+ else
+ DIE(aTHX_ "Not a HASH reference");
if (discard)
SP = ORIGMARK;
else if (gimme == G_SCALAR) {
@@ -2422,8 +2694,14 @@ PP(pp_delete)
hv = (HV*)POPs;
if (SvTYPE(hv) == SVt_PVHV)
sv = hv_delete_ent(hv, keysv, discard, 0);
+ else if (SvTYPE(hv) == SVt_PVAV) {
+ if (PL_op->op_flags & OPf_SPECIAL)
+ sv = av_delete((AV*)hv, SvIV(keysv), discard);
+ else
+ sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
+ }
else
- DIE("Not a HASH reference");
+ DIE(aTHX_ "Not a HASH reference");
if (!sv)
sv = &PL_sv_undef;
if (!discard)
@@ -2435,16 +2713,36 @@ PP(pp_delete)
PP(pp_exists)
{
djSP;
- SV *tmpsv = POPs;
- HV *hv = (HV*)POPs;
+ SV *tmpsv;
+ HV *hv;
+
+ if (PL_op->op_private & OPpEXISTS_SUB) {
+ GV *gv;
+ CV *cv;
+ SV *sv = POPs;
+ cv = sv_2cv(sv, &hv, &gv, FALSE);
+ if (cv)
+ RETPUSHYES;
+ if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
+ RETPUSHYES;
+ RETPUSHNO;
+ }
+ tmpsv = POPs;
+ hv = (HV*)POPs;
if (SvTYPE(hv) == SVt_PVHV) {
if (hv_exists_ent(hv, tmpsv, 0))
RETPUSHYES;
- } else if (SvTYPE(hv) == SVt_PVAV) {
- if (avhv_exists_ent((AV*)hv, tmpsv, 0))
+ }
+ else if (SvTYPE(hv) == SVt_PVAV) {
+ if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
+ if (av_exists((AV*)hv, SvIV(tmpsv)))
+ RETPUSHYES;
+ }
+ else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
RETPUSHYES;
- } else {
- DIE("Not a HASH reference");
+ }
+ else {
+ DIE(aTHX_ "Not a HASH reference");
}
RETPUSHNO;
}
@@ -2457,7 +2755,7 @@ PP(pp_hslice)
I32 realhv = (SvTYPE(hv) == SVt_PVHV);
if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
- DIE("Can't localize pseudo-hash element");
+ DIE(aTHX_ "Can't localize pseudo-hash element");
if (realhv || SvTYPE(hv) == SVt_PVAV) {
while (++MARK <= SP) {
@@ -2466,13 +2764,14 @@ PP(pp_hslice)
if (realhv) {
HE *he = hv_fetch_ent(hv, keysv, lval, 0);
svp = he ? &HeVAL(he) : 0;
- } else {
+ }
+ else {
svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
}
if (lval) {
if (!svp || *svp == &PL_sv_undef) {
STRLEN n_a;
- DIE(no_helem, SvPV(keysv, n_a));
+ DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
}
if (PL_op->op_private & OPpLVAL_INTRO)
save_helem(hv, keysv, svp);
@@ -2539,20 +2838,17 @@ PP(pp_lslice)
for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
ix = SvIVx(*lelem);
- if (ix < 0) {
+ if (ix < 0)
ix += max;
- if (ix < 0)
- *lelem = &PL_sv_undef;
- else if (!(*lelem = firstrelem[ix]))
- *lelem = &PL_sv_undef;
- }
- else {
+ else
ix -= arybase;
- if (ix >= max || !(*lelem = firstrelem[ix]))
+ if (ix < 0 || ix >= max)
+ *lelem = &PL_sv_undef;
+ else {
+ is_something_there = TRUE;
+ if (!(*lelem = firstrelem[ix]))
*lelem = &PL_sv_undef;
}
- if (!is_something_there && (SvOK(*lelem) || SvGMAGICAL(*lelem)))
- is_something_there = TRUE;
}
if (is_something_there)
SP = lastlelem;
@@ -2581,8 +2877,8 @@ PP(pp_anonhash)
SV *val = NEWSV(46, 0);
if (MARK < SP)
sv_setsv(val, *++MARK);
- else if (PL_dowarn)
- warn("Odd number of elements in hash assignment");
+ else if (ckWARN(WARN_MISC))
+ Perl_warner(aTHX_ WARN_MISC, "Odd number of elements in hash assignment");
(void)hv_store_ent(hv,key,val,0);
}
SP = ORIGMARK;
@@ -2605,12 +2901,12 @@ PP(pp_splice)
SV **tmparyval = 0;
MAGIC *mg;
- if (mg = SvTIED_mg((SV*)ary, 'P')) {
+ if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
*MARK-- = SvTIED_obj((SV*)ary, mg);
PUSHMARK(MARK);
PUTBACK;
ENTER;
- perl_call_method("SPLICE",GIMME_V);
+ call_method("SPLICE",GIMME_V);
LEAVE;
SPAGAIN;
RETURN;
@@ -2625,7 +2921,7 @@ PP(pp_splice)
else
offset -= PL_curcop->cop_arybase;
if (offset < 0)
- DIE(no_aelem, i);
+ DIE(aTHX_ PL_no_aelem, i);
if (++MARK < SP) {
length = SvIVx(*MARK++);
if (length < 0) {
@@ -2655,12 +2951,8 @@ PP(pp_splice)
newlen = SP - MARK;
diff = newlen - length;
- if (newlen && !AvREAL(ary)) {
- if (AvREIFY(ary))
- av_reify(ary);
- else
- assert(AvREAL(ary)); /* would leak, so croak */
- }
+ if (newlen && !AvREAL(ary) && AvREIFY(ary))
+ av_reify(ary);
if (diff < 0) { /* shrinking the area */
if (newlen) {
@@ -2803,12 +3095,12 @@ PP(pp_push)
register SV *sv = &PL_sv_undef;
MAGIC *mg;
- if (mg = SvTIED_mg((SV*)ary, 'P')) {
+ if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
*MARK-- = SvTIED_obj((SV*)ary, mg);
PUSHMARK(MARK);
PUTBACK;
ENTER;
- perl_call_method("PUSH",G_SCALAR|G_DISCARD);
+ call_method("PUSH",G_SCALAR|G_DISCARD);
LEAVE;
SPAGAIN;
}
@@ -2859,12 +3151,12 @@ PP(pp_unshift)
register I32 i = 0;
MAGIC *mg;
- if (mg = SvTIED_mg((SV*)ary, 'P')) {
+ if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
*MARK-- = SvTIED_obj((SV*)ary, mg);
PUSHMARK(MARK);
PUTBACK;
ENTER;
- perl_call_method("UNSHIFT",G_SCALAR|G_DISCARD);
+ call_method("UNSHIFT",G_SCALAR|G_DISCARD);
LEAVE;
SPAGAIN;
}
@@ -2894,6 +3186,7 @@ PP(pp_reverse)
*MARK++ = *SP;
*SP-- = tmp;
}
+ /* safe as long as stack cannot get extended in the above */
SP = oldsp;
}
else {
@@ -2903,12 +3196,40 @@ PP(pp_reverse)
dTARGET;
STRLEN len;
+ SvUTF8_off(TARG); /* decontaminate */
if (SP - MARK > 1)
do_join(TARG, &PL_sv_no, MARK, SP);
else
sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
up = SvPV_force(TARG, len);
if (len > 1) {
+ if (DO_UTF8(TARG)) { /* first reverse each character */
+ U8* s = (U8*)SvPVX(TARG);
+ U8* send = (U8*)(s + len);
+ while (s < send) {
+ if (*s < 0x80) {
+ s++;
+ continue;
+ }
+ else {
+ up = (char*)s;
+ s += UTF8SKIP(s);
+ down = (char*)(s - 1);
+ if (s > send || !((*down & 0xc0) == 0x80)) {
+ if (ckWARN_d(WARN_UTF8))
+ Perl_warner(aTHX_ WARN_UTF8,
+ "Malformed UTF-8 character");
+ break;
+ }
+ while (down > up) {
+ tmp = *up;
+ *up++ = *down;
+ *down-- = tmp;
+ }
+ }
+ }
+ up = SvPVX(TARG);
+ }
down = SvPVX(TARG) + len - 1;
while (down > up) {
tmp = *up;
@@ -2923,8 +3244,8 @@ PP(pp_reverse)
RETURN;
}
-STATIC SV *
-mul128(SV *sv, U8 m)
+STATIC SV *
+S_mul128(pTHX_ SV *sv, U8 m)
{
STRLEN len;
char *s = SvPV(sv, len);
@@ -2932,7 +3253,7 @@ mul128(SV *sv, U8 m)
U32 i = 0;
if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
- SV *tmpNew = newSVpv("0000000000", 10);
+ SV *tmpNew = newSVpvn("0000000000", 10);
sv_catsv(tmpNew, sv);
SvREFCNT_dec(sv); /* free old sv */
@@ -2952,11 +3273,6 @@ mul128(SV *sv, U8 m)
/* Explosives and implosives. */
-static const char uuemap[] =
- "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
-#ifndef PERL_OBJECT
-static char uudmap[256]; /* Initialised on first use */
-#endif
#if 'I' == 73 && 'J' == 74
/* On an ASCII/ISO kind of system */
#define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
@@ -2965,14 +3281,14 @@ static char uudmap[256]; /* Initialised on first use */
Some other sort of character set - use memchr() so we don't match
the null byte.
*/
-#define ISUUCHAR(ch) (memchr(uuemap, (ch), sizeof(uuemap)-1) || (ch) == ' ')
+#define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
#endif
PP(pp_unpack)
{
djSP;
dPOPPOPssrl;
- SV **oldsp = SP;
+ I32 start_sp_offset = SP - PL_stack_base;
I32 gimme = GIMME_V;
SV *sv;
STRLEN llen;
@@ -2985,6 +3301,7 @@ PP(pp_unpack)
I32 datumtype;
register I32 len;
register I32 bits;
+ register char *str;
/* These must not be in registers: */
I16 ashort;
@@ -2997,18 +3314,20 @@ PP(pp_unpack)
unsigned int auint;
U32 aulong;
#ifdef HAS_QUAD
- unsigned Quad_t auquad;
+ Uquad_t auquad;
#endif
char *aptr;
float afloat;
double adouble;
I32 checksum = 0;
register U32 culong;
- double cdouble;
-#ifndef PERL_OBJECT
- static char* bitcount = 0;
-#endif
+ NV cdouble;
int commas = 0;
+ int star;
+#ifdef PERL_NATINT_PACK
+ int natint; /* native integer */
+ int unatint; /* unsigned native integer */
+#endif
if (gimme != G_ARRAY) { /* arrange to do first one only */
/*SUPPRESS 530*/
@@ -3024,27 +3343,54 @@ PP(pp_unpack)
while (pat < patend) {
reparse:
datumtype = *pat++ & 0xFF;
+#ifdef PERL_NATINT_PACK
+ natint = 0;
+#endif
if (isSPACE(datumtype))
continue;
+ if (datumtype == '#') {
+ while (pat < patend && *pat != '\n')
+ pat++;
+ continue;
+ }
+ if (*pat == '!') {
+ char *natstr = "sSiIlL";
+
+ if (strchr(natstr, datumtype)) {
+#ifdef PERL_NATINT_PACK
+ natint = 1;
+#endif
+ pat++;
+ }
+ else
+ DIE(aTHX_ "'!' allowed only after types %s", natstr);
+ }
+ star = 0;
if (pat >= patend)
len = 1;
else if (*pat == '*') {
len = strend - strbeg; /* long enough */
pat++;
+ star = 1;
}
else if (isDIGIT(*pat)) {
len = *pat++ - '0';
- while (isDIGIT(*pat))
+ while (isDIGIT(*pat)) {
len = (len * 10) + (*pat++ - '0');
+ if (len < 0)
+ DIE(aTHX_ "Repeat count in unpack overflows");
+ }
}
else
len = (datumtype != '@');
+ redo_switch:
switch(datumtype) {
default:
- croak("Invalid type in unpack: '%c'", (int)datumtype);
+ DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
case ',': /* grandfather in commas but with a warning */
- if (commas++ == 0 && PL_dowarn)
- warn("Invalid type in unpack: '%c'", (int)datumtype);
+ if (commas++ == 0 && ckWARN(WARN_UNPACK))
+ Perl_warner(aTHX_ WARN_UNPACK,
+ "Invalid type in unpack: '%c'", (int)datumtype);
break;
case '%':
if (len == 1 && pat[-1] != '1')
@@ -3057,19 +3403,30 @@ PP(pp_unpack)
break;
case '@':
if (len > strend - strbeg)
- DIE("@ outside of string");
+ DIE(aTHX_ "@ outside of string");
s = strbeg + len;
break;
case 'X':
if (len > s - strbeg)
- DIE("X outside of string");
+ DIE(aTHX_ "X outside of string");
s -= len;
break;
case 'x':
if (len > strend - s)
- DIE("x outside of string");
+ DIE(aTHX_ "x outside of string");
s += len;
break;
+ case '/':
+ if (start_sp_offset >= SP - PL_stack_base)
+ DIE(aTHX_ "/ must follow a numeric type");
+ datumtype = *pat++;
+ if (*pat == '*')
+ pat++; /* ignore '*' for compatibility with pack */
+ if (isDIGIT(*pat))
+ DIE(aTHX_ "/ cannot take a count" );
+ len = POPi;
+ star = 0;
+ goto redo_switch;
case 'A':
case 'Z':
case 'a':
@@ -3100,24 +3457,24 @@ PP(pp_unpack)
break;
case 'B':
case 'b':
- if (pat[-1] == '*' || len > (strend - s) * 8)
+ if (star || len > (strend - s) * 8)
len = (strend - s) * 8;
if (checksum) {
- if (!bitcount) {
- Newz(601, bitcount, 256, char);
+ if (!PL_bitcount) {
+ Newz(601, PL_bitcount, 256, char);
for (bits = 1; bits < 256; bits++) {
- if (bits & 1) bitcount[bits]++;
- if (bits & 2) bitcount[bits]++;
- if (bits & 4) bitcount[bits]++;
- if (bits & 8) bitcount[bits]++;
- if (bits & 16) bitcount[bits]++;
- if (bits & 32) bitcount[bits]++;
- if (bits & 64) bitcount[bits]++;
- if (bits & 128) bitcount[bits]++;
+ if (bits & 1) PL_bitcount[bits]++;
+ if (bits & 2) PL_bitcount[bits]++;
+ if (bits & 4) PL_bitcount[bits]++;
+ if (bits & 8) PL_bitcount[bits]++;
+ if (bits & 16) PL_bitcount[bits]++;
+ if (bits & 32) PL_bitcount[bits]++;
+ if (bits & 64) PL_bitcount[bits]++;
+ if (bits & 128) PL_bitcount[bits]++;
}
}
while (len >= 8) {
- culong += bitcount[*(unsigned char*)s++];
+ culong += PL_bitcount[*(unsigned char*)s++];
len -= 8;
}
if (len) {
@@ -3140,8 +3497,7 @@ PP(pp_unpack)
sv = NEWSV(35, len + 1);
SvCUR_set(sv, len);
SvPOK_on(sv);
- aptr = pat; /* borrow register */
- pat = SvPVX(sv);
+ str = SvPVX(sv);
if (datumtype == 'b') {
aint = len;
for (len = 0; len < aint; len++) {
@@ -3149,7 +3505,7 @@ PP(pp_unpack)
bits >>= 1;
else
bits = *s++;
- *pat++ = '0' + (bits & 1);
+ *str++ = '0' + (bits & 1);
}
}
else {
@@ -3159,22 +3515,20 @@ PP(pp_unpack)
bits <<= 1;
else
bits = *s++;
- *pat++ = '0' + ((bits & 128) != 0);
+ *str++ = '0' + ((bits & 128) != 0);
}
}
- *pat = '\0';
- pat = aptr; /* unborrow register */
+ *str = '\0';
XPUSHs(sv_2mortal(sv));
break;
case 'H':
case 'h':
- if (pat[-1] == '*' || len > (strend - s) * 2)
+ if (star || len > (strend - s) * 2)
len = (strend - s) * 2;
sv = NEWSV(35, len + 1);
SvCUR_set(sv, len);
SvPOK_on(sv);
- aptr = pat; /* borrow register */
- pat = SvPVX(sv);
+ str = SvPVX(sv);
if (datumtype == 'h') {
aint = len;
for (len = 0; len < aint; len++) {
@@ -3182,7 +3536,7 @@ PP(pp_unpack)
bits >>= 4;
else
bits = *s++;
- *pat++ = PL_hexdigit[bits & 15];
+ *str++ = PL_hexdigit[bits & 15];
}
}
else {
@@ -3192,11 +3546,10 @@ PP(pp_unpack)
bits <<= 4;
else
bits = *s++;
- *pat++ = PL_hexdigit[(bits >> 4) & 15];
+ *str++ = PL_hexdigit[(bits >> 4) & 15];
}
}
- *pat = '\0';
- pat = aptr; /* unborrow register */
+ *str = '\0';
XPUSHs(sv_2mortal(sv));
break;
case 'c':
@@ -3244,75 +3597,166 @@ PP(pp_unpack)
}
}
break;
+ case 'U':
+ if (len > strend - s)
+ len = strend - s;
+ if (checksum) {
+ while (len-- > 0 && s < strend) {
+ auint = utf8_to_uv((U8*)s, &along);
+ s += along;
+ if (checksum > 32)
+ cdouble += (NV)auint;
+ else
+ culong += auint;
+ }
+ }
+ else {
+ EXTEND(SP, len);
+ EXTEND_MORTAL(len);
+ while (len-- > 0 && s < strend) {
+ auint = utf8_to_uv((U8*)s, &along);
+ s += along;
+ sv = NEWSV(37, 0);
+ sv_setuv(sv, (UV)auint);
+ PUSHs(sv_2mortal(sv));
+ }
+ }
+ break;
case 's':
+#if SHORTSIZE == SIZE16
along = (strend - s) / SIZE16;
+#else
+ along = (strend - s) / (natint ? sizeof(short) : SIZE16);
+#endif
if (len > along)
len = along;
if (checksum) {
- while (len-- > 0) {
- COPY16(s, &ashort);
+#if SHORTSIZE != SIZE16
+ if (natint) {
+ short ashort;
+ while (len-- > 0) {
+ COPYNN(s, &ashort, sizeof(short));
+ s += sizeof(short);
+ culong += ashort;
+
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY16(s, &ashort);
#if SHORTSIZE > SIZE16
- if (ashort > 32767)
- ashort -= 65536;
+ if (ashort > 32767)
+ ashort -= 65536;
#endif
- s += SIZE16;
- culong += ashort;
+ s += SIZE16;
+ culong += ashort;
+ }
}
}
else {
EXTEND(SP, len);
EXTEND_MORTAL(len);
- while (len-- > 0) {
- COPY16(s, &ashort);
+#if SHORTSIZE != SIZE16
+ if (natint) {
+ short ashort;
+ while (len-- > 0) {
+ COPYNN(s, &ashort, sizeof(short));
+ s += sizeof(short);
+ sv = NEWSV(38, 0);
+ sv_setiv(sv, (IV)ashort);
+ PUSHs(sv_2mortal(sv));
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY16(s, &ashort);
#if SHORTSIZE > SIZE16
- if (ashort > 32767)
- ashort -= 65536;
+ if (ashort > 32767)
+ ashort -= 65536;
#endif
- s += SIZE16;
- sv = NEWSV(38, 0);
- sv_setiv(sv, (IV)ashort);
- PUSHs(sv_2mortal(sv));
+ s += SIZE16;
+ sv = NEWSV(38, 0);
+ sv_setiv(sv, (IV)ashort);
+ PUSHs(sv_2mortal(sv));
+ }
}
}
break;
case 'v':
case 'n':
case 'S':
+#if SHORTSIZE == SIZE16
along = (strend - s) / SIZE16;
+#else
+ unatint = natint && datumtype == 'S';
+ along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
+#endif
if (len > along)
len = along;
if (checksum) {
- while (len-- > 0) {
- COPY16(s, &aushort);
- s += SIZE16;
+#if SHORTSIZE != SIZE16
+ if (unatint) {
+ unsigned short aushort;
+ while (len-- > 0) {
+ COPYNN(s, &aushort, sizeof(unsigned short));
+ s += sizeof(unsigned short);
+ culong += aushort;
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY16(s, &aushort);
+ s += SIZE16;
#ifdef HAS_NTOHS
- if (datumtype == 'n')
- aushort = PerlSock_ntohs(aushort);
+ if (datumtype == 'n')
+ aushort = PerlSock_ntohs(aushort);
#endif
#ifdef HAS_VTOHS
- if (datumtype == 'v')
- aushort = vtohs(aushort);
+ if (datumtype == 'v')
+ aushort = vtohs(aushort);
#endif
- culong += aushort;
+ culong += aushort;
+ }
}
}
else {
EXTEND(SP, len);
EXTEND_MORTAL(len);
- while (len-- > 0) {
- COPY16(s, &aushort);
- s += SIZE16;
- sv = NEWSV(39, 0);
+#if SHORTSIZE != SIZE16
+ if (unatint) {
+ unsigned short aushort;
+ while (len-- > 0) {
+ COPYNN(s, &aushort, sizeof(unsigned short));
+ s += sizeof(unsigned short);
+ sv = NEWSV(39, 0);
+ sv_setiv(sv, (UV)aushort);
+ PUSHs(sv_2mortal(sv));
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY16(s, &aushort);
+ s += SIZE16;
+ sv = NEWSV(39, 0);
#ifdef HAS_NTOHS
- if (datumtype == 'n')
- aushort = PerlSock_ntohs(aushort);
+ if (datumtype == 'n')
+ aushort = PerlSock_ntohs(aushort);
#endif
#ifdef HAS_VTOHS
- if (datumtype == 'v')
- aushort = vtohs(aushort);
+ if (datumtype == 'v')
+ aushort = vtohs(aushort);
#endif
- sv_setiv(sv, (IV)aushort);
- PUSHs(sv_2mortal(sv));
+ sv_setiv(sv, (UV)aushort);
+ PUSHs(sv_2mortal(sv));
+ }
}
}
break;
@@ -3325,7 +3769,7 @@ PP(pp_unpack)
Copy(s, &aint, 1, int);
s += sizeof(int);
if (checksum > 32)
- cdouble += (double)aint;
+ cdouble += (NV)aint;
else
culong += aint;
}
@@ -3340,7 +3784,25 @@ PP(pp_unpack)
#ifdef __osf__
/* Without the dummy below unpack("i", pack("i",-1))
* return 0xFFffFFff instead of -1 for Digital Unix V4.0
- * cc with optimization turned on */
+ * cc with optimization turned on.
+ *
+ * The bug was detected in
+ * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
+ * with optimization (-O4) turned on.
+ * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
+ * does not have this problem even with -O4.
+ *
+ * This bug was reported as DECC_BUGS 1431
+ * and tracked internally as GEM_BUGS 7775.
+ *
+ * The bug is fixed in
+ * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
+ * UNIX V4.0F support: DEC C V5.9-006 or later
+ * UNIX V4.0E support: DEC C V5.8-011 or later
+ * and also in DTK.
+ *
+ * See also few lines later for the same bug.
+ */
(aint) ?
sv_setiv(sv, (IV)aint) :
#endif
@@ -3358,7 +3820,7 @@ PP(pp_unpack)
Copy(s, &auint, 1, unsigned int);
s += sizeof(unsigned int);
if (checksum > 32)
- cdouble += (double)auint;
+ cdouble += (NV)auint;
else
culong += auint;
}
@@ -3372,12 +3834,8 @@ PP(pp_unpack)
sv = NEWSV(41, 0);
#ifdef __osf__
/* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
- * returns 1.84467440737096e+19 instead of 0xFFFFFFFF for
- * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (aka V4.0D)
- * with optimization turned on.
- * (DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (aka V4.0B)
- * does not have this problem even with -O4)
- */
+ * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
+ * See details few lines earlier. */
(auint) ?
sv_setuv(sv, (UV)auint) :
#endif
@@ -3387,80 +3845,151 @@ PP(pp_unpack)
}
break;
case 'l':
+#if LONGSIZE == SIZE32
along = (strend - s) / SIZE32;
+#else
+ along = (strend - s) / (natint ? sizeof(long) : SIZE32);
+#endif
if (len > along)
len = along;
if (checksum) {
- while (len-- > 0) {
- COPY32(s, &along);
+#if LONGSIZE != SIZE32
+ if (natint) {
+ long along;
+ while (len-- > 0) {
+ COPYNN(s, &along, sizeof(long));
+ s += sizeof(long);
+ if (checksum > 32)
+ cdouble += (NV)along;
+ else
+ culong += along;
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY32(s, &along);
#if LONGSIZE > SIZE32
- if (along > 2147483647)
- along -= 4294967296;
+ if (along > 2147483647)
+ along -= 4294967296;
#endif
- s += SIZE32;
- if (checksum > 32)
- cdouble += (double)along;
- else
- culong += along;
+ s += SIZE32;
+ if (checksum > 32)
+ cdouble += (NV)along;
+ else
+ culong += along;
+ }
}
}
else {
EXTEND(SP, len);
EXTEND_MORTAL(len);
- while (len-- > 0) {
- COPY32(s, &along);
+#if LONGSIZE != SIZE32
+ if (natint) {
+ long along;
+ while (len-- > 0) {
+ COPYNN(s, &along, sizeof(long));
+ s += sizeof(long);
+ sv = NEWSV(42, 0);
+ sv_setiv(sv, (IV)along);
+ PUSHs(sv_2mortal(sv));
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY32(s, &along);
#if LONGSIZE > SIZE32
- if (along > 2147483647)
- along -= 4294967296;
+ if (along > 2147483647)
+ along -= 4294967296;
#endif
- s += SIZE32;
- sv = NEWSV(42, 0);
- sv_setiv(sv, (IV)along);
- PUSHs(sv_2mortal(sv));
+ s += SIZE32;
+ sv = NEWSV(42, 0);
+ sv_setiv(sv, (IV)along);
+ PUSHs(sv_2mortal(sv));
+ }
}
}
break;
case 'V':
case 'N':
case 'L':
+#if LONGSIZE == SIZE32
along = (strend - s) / SIZE32;
+#else
+ unatint = natint && datumtype == 'L';
+ along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
+#endif
if (len > along)
len = along;
if (checksum) {
- while (len-- > 0) {
- COPY32(s, &aulong);
- s += SIZE32;
+#if LONGSIZE != SIZE32
+ if (unatint) {
+ unsigned long aulong;
+ while (len-- > 0) {
+ COPYNN(s, &aulong, sizeof(unsigned long));
+ s += sizeof(unsigned long);
+ if (checksum > 32)
+ cdouble += (NV)aulong;
+ else
+ culong += aulong;
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY32(s, &aulong);
+ s += SIZE32;
#ifdef HAS_NTOHL
- if (datumtype == 'N')
- aulong = PerlSock_ntohl(aulong);
+ if (datumtype == 'N')
+ aulong = PerlSock_ntohl(aulong);
#endif
#ifdef HAS_VTOHL
- if (datumtype == 'V')
- aulong = vtohl(aulong);
+ if (datumtype == 'V')
+ aulong = vtohl(aulong);
#endif
- if (checksum > 32)
- cdouble += (double)aulong;
- else
- culong += aulong;
+ if (checksum > 32)
+ cdouble += (NV)aulong;
+ else
+ culong += aulong;
+ }
}
}
else {
EXTEND(SP, len);
EXTEND_MORTAL(len);
- while (len-- > 0) {
- COPY32(s, &aulong);
- s += SIZE32;
+#if LONGSIZE != SIZE32
+ if (unatint) {
+ unsigned long aulong;
+ while (len-- > 0) {
+ COPYNN(s, &aulong, sizeof(unsigned long));
+ s += sizeof(unsigned long);
+ sv = NEWSV(43, 0);
+ sv_setuv(sv, (UV)aulong);
+ PUSHs(sv_2mortal(sv));
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ COPY32(s, &aulong);
+ s += SIZE32;
#ifdef HAS_NTOHL
- if (datumtype == 'N')
- aulong = PerlSock_ntohl(aulong);
+ if (datumtype == 'N')
+ aulong = PerlSock_ntohl(aulong);
#endif
#ifdef HAS_VTOHL
- if (datumtype == 'V')
- aulong = vtohl(aulong);
+ if (datumtype == 'V')
+ aulong = vtohl(aulong);
#endif
- sv = NEWSV(43, 0);
- sv_setuv(sv, (UV)aulong);
- PUSHs(sv_2mortal(sv));
+ sv = NEWSV(43, 0);
+ sv_setuv(sv, (UV)aulong);
+ PUSHs(sv_2mortal(sv));
+ }
}
}
break;
@@ -3504,7 +4033,7 @@ PP(pp_unpack)
char *t;
STRLEN n_a;
- sv = newSVpvf("%.*Vu", (int)TYPE_DIGITS(UV), auv);
+ sv = Perl_newSVpvf(aTHX_ "%.*Vu", (int)TYPE_DIGITS(UV), auv);
while (s < strend) {
sv = mul128(sv, *s & 0x7f);
if (!(*s++ & 0x80)) {
@@ -3522,7 +4051,7 @@ PP(pp_unpack)
}
}
if ((s >= strend) && bytes)
- croak("Unterminated compressed integer");
+ DIE(aTHX_ "Unterminated compressed integer");
}
break;
case 'P':
@@ -3556,7 +4085,7 @@ PP(pp_unpack)
if (aquad >= IV_MIN && aquad <= IV_MAX)
sv_setiv(sv, (IV)aquad);
else
- sv_setnv(sv, (double)aquad);
+ sv_setnv(sv, (NV)aquad);
PUSHs(sv_2mortal(sv));
}
break;
@@ -3567,17 +4096,17 @@ PP(pp_unpack)
EXTEND(SP, len);
EXTEND_MORTAL(len);
while (len-- > 0) {
- if (s + sizeof(unsigned Quad_t) > strend)
+ if (s + sizeof(Uquad_t) > strend)
auquad = 0;
else {
- Copy(s, &auquad, 1, unsigned Quad_t);
- s += sizeof(unsigned Quad_t);
+ Copy(s, &auquad, 1, Uquad_t);
+ s += sizeof(Uquad_t);
}
sv = NEWSV(43, 0);
if (auquad <= UV_MAX)
sv_setuv(sv, (UV)auquad);
else
- sv_setnv(sv, (double)auquad);
+ sv_setnv(sv, (NV)auquad);
PUSHs(sv_2mortal(sv));
}
break;
@@ -3602,7 +4131,7 @@ PP(pp_unpack)
Copy(s, &afloat, 1, float);
s += sizeof(float);
sv = NEWSV(47, 0);
- sv_setnv(sv, (double)afloat);
+ sv_setnv(sv, (NV)afloat);
PUSHs(sv_2mortal(sv));
}
}
@@ -3626,7 +4155,7 @@ PP(pp_unpack)
Copy(s, &adouble, 1, double);
s += sizeof(double);
sv = NEWSV(48, 0);
- sv_setnv(sv, (double)adouble);
+ sv_setnv(sv, (NV)adouble);
PUSHs(sv_2mortal(sv));
}
}
@@ -3637,16 +4166,16 @@ PP(pp_unpack)
* algorithm, the code will be character-set independent
* (and just as fast as doing character arithmetic)
*/
- if (uudmap['M'] == 0) {
+ if (PL_uudmap['M'] == 0) {
int i;
- for (i = 0; i < sizeof(uuemap); i += 1)
- uudmap[uuemap[i]] = i;
+ for (i = 0; i < sizeof(PL_uuemap); i += 1)
+ PL_uudmap[(U8)PL_uuemap[i]] = i;
/*
* Because ' ' and '`' map to the same value,
* we need to decode them both the same.
*/
- uudmap[' '] = 0;
+ PL_uudmap[' '] = 0;
}
along = (strend - s) * 3 / 4;
@@ -3658,22 +4187,22 @@ PP(pp_unpack)
char hunk[4];
hunk[3] = '\0';
- len = uudmap[*s++] & 077;
+ len = PL_uudmap[*(U8*)s++] & 077;
while (len > 0) {
if (s < strend && ISUUCHAR(*s))
- a = uudmap[*s++] & 077;
+ a = PL_uudmap[*(U8*)s++] & 077;
else
a = 0;
if (s < strend && ISUUCHAR(*s))
- b = uudmap[*s++] & 077;
+ b = PL_uudmap[*(U8*)s++] & 077;
else
b = 0;
if (s < strend && ISUUCHAR(*s))
- c = uudmap[*s++] & 077;
+ c = PL_uudmap[*(U8*)s++] & 077;
else
c = 0;
if (s < strend && ISUUCHAR(*s))
- d = uudmap[*s++] & 077;
+ d = PL_uudmap[*(U8*)s++] & 077;
else
d = 0;
hunk[0] = (a << 2) | (b >> 4);
@@ -3693,8 +4222,8 @@ PP(pp_unpack)
if (checksum) {
sv = NEWSV(42, 0);
if (strchr("fFdD", datumtype) ||
- (checksum > 32 && strchr("iIlLN", datumtype)) ) {
- double trouble;
+ (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
+ NV trouble;
adouble = 1.0;
while (checksum >= 16) {
@@ -3710,7 +4239,7 @@ PP(pp_unpack)
along = (1 << checksum) - 1;
while (cdouble < 0.0)
cdouble += adouble;
- cdouble = modf(cdouble / adouble, &trouble) * adouble;
+ cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
sv_setnv(sv, cdouble);
}
else {
@@ -3724,44 +4253,44 @@ PP(pp_unpack)
checksum = 0;
}
}
- if (SP == oldsp && gimme == G_SCALAR)
+ if (SP - PL_stack_base == start_sp_offset && gimme == G_SCALAR)
PUSHs(&PL_sv_undef);
RETURN;
}
STATIC void
-doencodes(register SV *sv, register char *s, register I32 len)
+S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
{
char hunk[5];
- *hunk = uuemap[len];
+ *hunk = PL_uuemap[len];
sv_catpvn(sv, hunk, 1);
hunk[4] = '\0';
while (len > 2) {
- hunk[0] = uuemap[(077 & (*s >> 2))];
- hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
- hunk[2] = uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
- hunk[3] = uuemap[(077 & (s[2] & 077))];
+ hunk[0] = PL_uuemap[(077 & (*s >> 2))];
+ hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
+ hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
+ hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
sv_catpvn(sv, hunk, 4);
s += 3;
len -= 3;
}
if (len > 0) {
char r = (len > 1 ? s[1] : '\0');
- hunk[0] = uuemap[(077 & (*s >> 2))];
- hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
- hunk[2] = uuemap[(077 & ((r << 2) & 074))];
- hunk[3] = uuemap[0];
+ hunk[0] = PL_uuemap[(077 & (*s >> 2))];
+ hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
+ hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
+ hunk[3] = PL_uuemap[0];
sv_catpvn(sv, hunk, 4);
}
sv_catpvn(sv, "\n", 1);
}
-STATIC SV *
-is_an_int(char *s, STRLEN l)
+STATIC SV *
+S_is_an_int(pTHX_ char *s, STRLEN l)
{
- STRLEN n_a;
- SV *result = newSVpv("", l);
+ STRLEN n_a;
+ SV *result = newSVpvn(s, l);
char *result_c = SvPV(result, n_a); /* convenience */
char *out = result_c;
bool skip = 1;
@@ -3806,10 +4335,9 @@ is_an_int(char *s, STRLEN l)
return (result);
}
+/* pnum must be '\0' terminated */
STATIC int
-div128(SV *pnum, bool *done)
- /* must be '\0' terminated */
-
+S_div128(pTHX_ SV *pnum, bool *done)
{
STRLEN len;
char *s = SvPV(pnum, len);
@@ -3859,41 +4387,76 @@ PP(pp_pack)
U32 aulong;
#ifdef HAS_QUAD
Quad_t aquad;
- unsigned Quad_t auquad;
+ Uquad_t auquad;
#endif
char *aptr;
float afloat;
double adouble;
int commas = 0;
+#ifdef PERL_NATINT_PACK
+ int natint; /* native integer */
+#endif
items = SP - MARK;
MARK++;
sv_setpvn(cat, "", 0);
while (pat < patend) {
-#define NEXTFROM (items-- > 0 ? *MARK++ : &PL_sv_no)
+ SV *lengthcode = Nullsv;
+#define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
datumtype = *pat++ & 0xFF;
+#ifdef PERL_NATINT_PACK
+ natint = 0;
+#endif
if (isSPACE(datumtype))
continue;
+ if (datumtype == '#') {
+ while (pat < patend && *pat != '\n')
+ pat++;
+ continue;
+ }
+ if (*pat == '!') {
+ char *natstr = "sSiIlL";
+
+ if (strchr(natstr, datumtype)) {
+#ifdef PERL_NATINT_PACK
+ natint = 1;
+#endif
+ pat++;
+ }
+ else
+ DIE(aTHX_ "'!' allowed only after types %s", natstr);
+ }
if (*pat == '*') {
len = strchr("@Xxu", datumtype) ? 0 : items;
pat++;
}
else if (isDIGIT(*pat)) {
len = *pat++ - '0';
- while (isDIGIT(*pat))
+ while (isDIGIT(*pat)) {
len = (len * 10) + (*pat++ - '0');
+ if (len < 0)
+ DIE(aTHX_ "Repeat count in pack overflows");
+ }
}
else
len = 1;
+ if (*pat == '/') {
+ ++pat;
+ if ((*pat != 'a' && *pat != 'A' && *pat != 'Z') || pat[1] != '*')
+ DIE(aTHX_ "/ must be followed by a*, A* or Z*");
+ lengthcode = sv_2mortal(newSViv(sv_len(items > 0
+ ? *MARK : &PL_sv_no)));
+ }
switch(datumtype) {
default:
- croak("Invalid type in pack: '%c'", (int)datumtype);
+ DIE(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
case ',': /* grandfather in commas but with a warning */
- if (commas++ == 0 && PL_dowarn)
- warn("Invalid type in pack: '%c'", (int)datumtype);
+ if (commas++ == 0 && ckWARN(WARN_PACK))
+ Perl_warner(aTHX_ WARN_PACK,
+ "Invalid type in pack: '%c'", (int)datumtype);
break;
case '%':
- DIE("%% may only be used in unpack");
+ DIE(aTHX_ "%% may only be used in unpack");
case '@':
len -= SvCUR(cat);
if (len > 0)
@@ -3905,7 +4468,7 @@ PP(pp_pack)
case 'X':
shrink:
if (SvCUR(cat) < len)
- DIE("X outside of string");
+ DIE(aTHX_ "X outside of string");
SvCUR(cat) -= len;
*SvEND(cat) = '\0';
break;
@@ -3922,10 +4485,16 @@ PP(pp_pack)
case 'a':
fromstr = NEXTFROM;
aptr = SvPV(fromstr, fromlen);
- if (pat[-1] == '*')
+ if (pat[-1] == '*') {
len = fromlen;
- if (fromlen > len)
+ if (datumtype == 'Z')
+ ++len;
+ }
+ if (fromlen >= len) {
sv_catpvn(cat, aptr, len);
+ if (datumtype == 'Z')
+ *(SvEND(cat)-1) = '\0';
+ }
else {
sv_catpvn(cat, aptr, fromlen);
len -= fromlen;
@@ -3948,15 +4517,14 @@ PP(pp_pack)
case 'B':
case 'b':
{
- char *savepat = pat;
+ register char *str;
I32 saveitems;
fromstr = NEXTFROM;
saveitems = items;
- aptr = SvPV(fromstr, fromlen);
+ str = SvPV(fromstr, fromlen);
if (pat[-1] == '*')
len = fromlen;
- pat = aptr;
aint = SvCUR(cat);
SvCUR(cat) += (len+7)/8;
SvGROW(cat, SvCUR(cat) + 1);
@@ -3967,7 +4535,7 @@ PP(pp_pack)
items = 0;
if (datumtype == 'B') {
for (len = 0; len++ < aint;) {
- items |= *pat++ & 1;
+ items |= *str++ & 1;
if (len & 7)
items <<= 1;
else {
@@ -3978,7 +4546,7 @@ PP(pp_pack)
}
else {
for (len = 0; len++ < aint;) {
- if (*pat++ & 1)
+ if (*str++ & 1)
items |= 128;
if (len & 7)
items >>= 1;
@@ -3995,26 +4563,24 @@ PP(pp_pack)
items >>= 7 - (aint & 7);
*aptr++ = items & 0xff;
}
- pat = SvPVX(cat) + SvCUR(cat);
- while (aptr <= pat)
+ str = SvPVX(cat) + SvCUR(cat);
+ while (aptr <= str)
*aptr++ = '\0';
- pat = savepat;
items = saveitems;
}
break;
case 'H':
case 'h':
{
- char *savepat = pat;
+ register char *str;
I32 saveitems;
fromstr = NEXTFROM;
saveitems = items;
- aptr = SvPV(fromstr, fromlen);
+ str = SvPV(fromstr, fromlen);
if (pat[-1] == '*')
len = fromlen;
- pat = aptr;
aint = SvCUR(cat);
SvCUR(cat) += (len+1)/2;
SvGROW(cat, SvCUR(cat) + 1);
@@ -4025,10 +4591,10 @@ PP(pp_pack)
items = 0;
if (datumtype == 'H') {
for (len = 0; len++ < aint;) {
- if (isALPHA(*pat))
- items |= ((*pat++ & 15) + 9) & 15;
+ if (isALPHA(*str))
+ items |= ((*str++ & 15) + 9) & 15;
else
- items |= *pat++ & 15;
+ items |= *str++ & 15;
if (len & 1)
items <<= 4;
else {
@@ -4039,10 +4605,10 @@ PP(pp_pack)
}
else {
for (len = 0; len++ < aint;) {
- if (isALPHA(*pat))
- items |= (((*pat++ & 15) + 9) & 15) << 4;
+ if (isALPHA(*str))
+ items |= (((*str++ & 15) + 9) & 15) << 4;
else
- items |= (*pat++ & 15) << 4;
+ items |= (*str++ & 15) << 4;
if (len & 1)
items >>= 4;
else {
@@ -4053,11 +4619,10 @@ PP(pp_pack)
}
if (aint & 1)
*aptr++ = items & 0xff;
- pat = SvPVX(cat) + SvCUR(cat);
- while (aptr <= pat)
+ str = SvPVX(cat) + SvCUR(cat);
+ while (aptr <= str)
*aptr++ = '\0';
- pat = savepat;
items = saveitems;
}
break;
@@ -4070,6 +4635,16 @@ PP(pp_pack)
sv_catpvn(cat, &achar, sizeof(char));
}
break;
+ case 'U':
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ auint = SvUV(fromstr);
+ SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN);
+ SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
+ - SvPVX(cat));
+ }
+ *SvEND(cat) = '\0';
+ break;
/* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
case 'f':
case 'F':
@@ -4108,11 +4683,48 @@ PP(pp_pack)
}
break;
case 'S':
+#if SHORTSIZE != SIZE16
+ if (natint) {
+ unsigned short aushort;
+
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ aushort = SvUV(fromstr);
+ sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
+ }
+ }
+ else
+#endif
+ {
+ U16 aushort;
+
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ aushort = (U16)SvUV(fromstr);
+ CAT16(cat, &aushort);
+ }
+
+ }
+ break;
case 's':
- while (len-- > 0) {
- fromstr = NEXTFROM;
- ashort = (I16)SvIV(fromstr);
- CAT16(cat, &ashort);
+#if SHORTSIZE != SIZE16
+ if (natint) {
+ short ashort;
+
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ ashort = SvIV(fromstr);
+ sv_catpvn(cat, (char *)&ashort, sizeof(short));
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ ashort = (I16)SvIV(fromstr);
+ CAT16(cat, &ashort);
+ }
}
break;
case 'I':
@@ -4125,26 +4737,22 @@ PP(pp_pack)
case 'w':
while (len-- > 0) {
fromstr = NEXTFROM;
- adouble = floor(SvNV(fromstr));
+ adouble = Perl_floor(SvNV(fromstr));
if (adouble < 0)
- croak("Cannot compress negative numbers");
+ DIE(aTHX_ "Cannot compress negative numbers");
if (
-#ifdef BW_BITS
- adouble <= BW_MASK
-#else
#ifdef CXUX_BROKEN_CONSTANT_CONVERT
adouble <= UV_MAX_cxux
#else
adouble <= UV_MAX
#endif
-#endif
)
{
char buf[1 + sizeof(UV)];
char *in = buf + sizeof(buf);
- UV auv = U_V(adouble);;
+ UV auv = U_V(adouble);
do {
*--in = (auv & 0x7f) | 0x80;
@@ -4162,7 +4770,7 @@ PP(pp_pack)
/* Copy string and check for compliance */
from = SvPV(fromstr, len);
if ((norm = is_an_int(from, len)) == NULL)
- croak("can compress only unsigned integer");
+ DIE(aTHX_ "can compress only unsigned integer");
New('w', result, len, char);
in = result + len;
@@ -4182,14 +4790,14 @@ PP(pp_pack)
double next = floor(adouble / 128);
*--in = (unsigned char)(adouble - (next * 128)) | 0x80;
if (--in < buf) /* this cannot happen ;-) */
- croak ("Cannot compress integer");
+ DIE(aTHX_ "Cannot compress integer");
adouble = next;
} while (adouble > 0);
buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
}
else
- croak("Cannot compress non integer");
+ DIE(aTHX_ "Cannot compress non integer");
}
break;
case 'i':
@@ -4220,25 +4828,53 @@ PP(pp_pack)
}
break;
case 'L':
- while (len-- > 0) {
- fromstr = NEXTFROM;
- aulong = SvUV(fromstr);
- CAT32(cat, &aulong);
+#if LONGSIZE != SIZE32
+ if (natint) {
+ unsigned long aulong;
+
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ aulong = SvUV(fromstr);
+ sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ aulong = SvUV(fromstr);
+ CAT32(cat, &aulong);
+ }
}
break;
case 'l':
- while (len-- > 0) {
- fromstr = NEXTFROM;
- along = SvIV(fromstr);
- CAT32(cat, &along);
+#if LONGSIZE != SIZE32
+ if (natint) {
+ long along;
+
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ along = SvIV(fromstr);
+ sv_catpvn(cat, (char *)&along, sizeof(long));
+ }
+ }
+ else
+#endif
+ {
+ while (len-- > 0) {
+ fromstr = NEXTFROM;
+ along = SvIV(fromstr);
+ CAT32(cat, &along);
+ }
}
break;
#ifdef HAS_QUAD
case 'Q':
while (len-- > 0) {
fromstr = NEXTFROM;
- auquad = (unsigned Quad_t)SvIV(fromstr);
- sv_catpvn(cat, (char*)&auquad, sizeof(unsigned Quad_t));
+ auquad = (Uquad_t)SvUV(fromstr);
+ sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
}
break;
case 'q':
@@ -4248,7 +4884,7 @@ PP(pp_pack)
sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
}
break;
-#endif /* HAS_QUAD */
+#endif
case 'P':
len = 1; /* assume SV is correct length */
/* FALL THROUGH */
@@ -4264,8 +4900,13 @@ PP(pp_pack)
* of pack() (and all copies of the result) are
* gone.
*/
- if (PL_dowarn && (SvTEMP(fromstr) || SvPADTMP(fromstr)))
- warn("Attempt to pack pointer to temporary value");
+ if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
+ || (SvPADTMP(fromstr)
+ && !SvREADONLY(fromstr))))
+ {
+ Perl_warner(aTHX_ WARN_PACK,
+ "Attempt to pack pointer to temporary value");
+ }
if (SvPOK(fromstr) || SvNIOK(fromstr))
aptr = SvPV(fromstr,n_a);
else
@@ -4336,14 +4977,19 @@ PP(pp_split)
pm = (PMOP*)POPs;
#endif
if (!pm || !s)
- DIE("panic: do_split");
+ DIE(aTHX_ "panic: do_split");
rx = pm->op_pmregexp;
TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
(pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
- if (pm->op_pmreplroot)
+ if (pm->op_pmreplroot) {
+#ifdef USE_ITHREADS
+ ary = GvAVn((GV*)PL_curpad[(PADOFFSET)pm->op_pmreplroot]);
+#else
ary = GvAVn((GV*)pm->op_pmreplroot);
+#endif
+ }
else if (gimme != G_ARRAY)
#ifdef USE_THREADS
ary = (AV*)PL_curpad[0];
@@ -4358,13 +5004,14 @@ PP(pp_split)
av_extend(ary,0);
av_clear(ary);
SPAGAIN;
- if (mg = SvTIED_mg((SV*)ary, 'P')) {
+ if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
PUSHMARK(SP);
XPUSHs(SvTIED_obj((SV*)ary, mg));
}
else {
if (!AvREAL(ary)) {
AvREAL_on(ary);
+ AvREIFY_off(ary);
for (i = AvFILLp(ary); i >= 0; i--)
AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
}
@@ -4430,15 +5077,19 @@ PP(pp_split)
s = m;
}
}
- else if (rx->check_substr && !rx->nparens
+ else if ((rx->reganch & RE_USE_INTUIT) && !rx->nparens
&& (rx->reganch & ROPT_CHECK_ALL)
&& !(rx->reganch & ROPT_ANCH)) {
- i = SvCUR(rx->check_substr);
- if (i == 1 && !SvTAIL(rx->check_substr)) {
- i = *SvPVX(rx->check_substr);
+ int tail = (rx->reganch & RE_INTUIT_TAIL);
+ SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
+ char c;
+
+ len = rx->minlen;
+ if (len == 1 && !tail) {
+ c = *SvPV(csv,len);
while (--limit) {
/*SUPPRESS 530*/
- for (m = s; m < strend && *m != i; m++) ;
+ for (m = s; m < strend && *m != c; m++) ;
if (m >= strend)
break;
dstr = NEWSV(30, m-s);
@@ -4452,8 +5103,8 @@ PP(pp_split)
else {
#ifndef lint
while (s < strend && --limit &&
- (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
- rx->check_substr, 0)) )
+ (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
+ csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
#endif
{
dstr = NEWSV(31, m-s);
@@ -4461,25 +5112,28 @@ PP(pp_split)
if (make_mortal)
sv_2mortal(dstr);
XPUSHs(dstr);
- s = m + i;
+ s = m + len; /* Fake \n at the end */
}
}
}
else {
maxiters += (strend - s) * rx->nparens;
- while (s < strend && --limit &&
- CALLREGEXEC(rx, s, strend, orig, 1, Nullsv, NULL, 0))
+ while (s < strend && --limit
+/* && (!rx->check_substr
+ || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
+ 0, NULL))))
+*/ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
+ 1 /* minend */, sv, NULL, 0))
{
TAINT_IF(RX_MATCH_TAINTED(rx));
- if (rx->subbase
- && rx->subbase != orig) {
+ if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
m = s;
s = orig;
- orig = rx->subbase;
+ orig = rx->subbeg;
s = orig + (m - s);
strend = s + (strend - m);
}
- m = rx->startp[0];
+ m = rx->startp[0] + orig;
dstr = NEWSV(32, m-s);
sv_setpvn(dstr, s, m-s);
if (make_mortal)
@@ -4487,8 +5141,8 @@ PP(pp_split)
XPUSHs(dstr);
if (rx->nparens) {
for (i = 1; i <= rx->nparens; i++) {
- s = rx->startp[i];
- m = rx->endp[i];
+ s = rx->startp[i] + orig;
+ m = rx->endp[i] + orig;
if (m && s) {
dstr = NEWSV(33, m-s);
sv_setpvn(dstr, s, m-s);
@@ -4500,14 +5154,14 @@ PP(pp_split)
XPUSHs(dstr);
}
}
- s = rx->endp[0];
+ s = rx->endp[0] + orig;
}
}
LEAVE_SCOPE(oldsave);
iters = (SP - PL_stack_base) - base;
if (iters > maxiters)
- DIE("Split loop");
+ DIE(aTHX_ "Split loop");
/* keep field after final delim? */
if (s < strend || (iters && origlimit)) {
@@ -4541,7 +5195,7 @@ PP(pp_split)
else {
PUTBACK;
ENTER;
- perl_call_method("PUSH",G_SCALAR|G_DISCARD);
+ call_method("PUSH",G_SCALAR|G_DISCARD);
LEAVE;
SPAGAIN;
if (gimme == G_ARRAY) {
@@ -4569,20 +5223,20 @@ PP(pp_split)
#ifdef USE_THREADS
void
-unlock_condpair(void *svv)
+Perl_unlock_condpair(pTHX_ void *svv)
{
dTHR;
MAGIC *mg = mg_find((SV*)svv, 'm');
if (!mg)
- croak("panic: unlock_condpair unlocking non-mutex");
+ Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
MUTEX_LOCK(MgMUTEXP(mg));
if (MgOWNER(mg) != thr)
- croak("panic: unlock_condpair unlocking mutex that we don't own");
+ Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
MgOWNER(mg) = 0;
COND_SIGNAL(MgOWNERCONDP(mg));
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: unlock 0x%lx\n",
- (unsigned long)thr, (unsigned long)svv);)
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": unlock 0x%"UVxf"\n",
+ PTR2UV(thr), PTR2UV(svv));)
MUTEX_UNLOCK(MgMUTEXP(mg));
}
#endif /* USE_THREADS */
@@ -4606,10 +5260,10 @@ PP(pp_lock)
while (MgOWNER(mg))
COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
MgOWNER(mg) = thr;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: pp_lock lock 0x%lx\n",
- (unsigned long)thr, (unsigned long)sv);)
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": pp_lock lock 0x%"UVxf"\n",
+ PTR2UV(thr), PTR2UV(sv));)
MUTEX_UNLOCK(MgMUTEXP(mg));
- save_destructor(unlock_condpair, sv);
+ SAVEDESTRUCTOR_X(Perl_unlock_condpair, sv);
}
#endif /* USE_THREADS */
if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
@@ -4622,8 +5276,8 @@ PP(pp_lock)
PP(pp_threadsv)
{
- djSP;
#ifdef USE_THREADS
+ djSP;
EXTEND(SP, 1);
if (PL_op->op_private & OPpLVAL_INTRO)
PUSHs(*save_threadsv(PL_op->op_targ));
@@ -4631,6 +5285,6 @@ PP(pp_threadsv)
PUSHs(THREADSV(PL_op->op_targ));
RETURN;
#else
- DIE("tried to access per-thread data in non-threaded perl");
+ DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
#endif /* USE_THREADS */
}
diff --git a/contrib/perl5/pp.h b/contrib/perl5/pp.h
index c0cebcc..bdc0b1a 100644
--- a/contrib/perl5/pp.h
+++ b/contrib/perl5/pp.h
@@ -1,6 +1,6 @@
/* pp.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -14,11 +14,40 @@
#define ARGS
#define dARGS
#endif /* USE_THREADS */
-#ifdef PERL_OBJECT
-#define PP(s) OP * CPerlObj::s(ARGSproto)
-#else
-#define PP(s) OP * s(ARGSproto)
-#endif
+
+#define PP(s) OP * Perl_##s(pTHX)
+
+/*
+=for apidoc AmU||SP
+Stack pointer. This is usually handled by C<xsubpp>. See C<dSP> and
+C<SPAGAIN>.
+
+=for apidoc AmU||MARK
+Stack marker variable for the XSUB. See C<dMARK>.
+
+=for apidoc Ams||PUSHMARK
+Opening bracket for arguments on a callback. See C<PUTBACK> and
+L<perlcall>.
+
+=for apidoc Ams||dSP
+Declares a local copy of perl's stack pointer for the XSUB, available via
+the C<SP> macro. See C<SP>.
+
+=for apidoc Ams||dMARK
+Declare a stack marker variable, C<mark>, for the XSUB. See C<MARK> and
+C<dORIGMARK>.
+
+=for apidoc Ams||dORIGMARK
+Saves the original stack mark for the XSUB. See C<ORIGMARK>.
+
+=for apidoc AmU||ORIGMARK
+The original stack mark for the XSUB. See C<dORIGMARK>.
+
+=for apidoc Ams||SPAGAIN
+Refetch the stack pointer. Used after a callback. See L<perlcall>.
+
+=cut
+*/
#define SP sp
#define MARK mark
@@ -53,7 +82,30 @@
#define dTARG SV *targ
#define NORMAL PL_op->op_next
-#define DIE return die
+#define DIE return Perl_die
+
+/*
+=for apidoc Ams||PUTBACK
+Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
+See C<PUSHMARK> and L<perlcall> for other uses.
+
+=for apidoc Amn|SV*|POPs
+Pops an SV off the stack.
+
+=for apidoc Amn|char*|POPp
+Pops a string off the stack.
+
+=for apidoc Amn|NV|POPn
+Pops a double off the stack.
+
+=for apidoc Amn|IV|POPi
+Pops an integer off the stack.
+
+=for apidoc Amn|long|POPl
+Pops a long off the stack.
+
+=cut
+*/
#define PUTBACK PL_stack_sp = sp
#define RETURN return PUTBACK, NORMAL
@@ -67,6 +119,11 @@
#define POPi ((IV)SvIVx(POPs))
#define POPu ((UV)SvUVx(POPs))
#define POPl ((long)SvIVx(POPs))
+#define POPul ((unsigned long)SvIVx(POPs))
+#ifdef HAS_QUAD
+#define POPq ((Quad_t)SvIVx(POPs))
+#define POPuq ((Uquad_t)SvUVx(POPs))
+#endif
#define TOPs (*sp)
#define TOPp (SvPV(TOPs, PL_na)) /* deprecated */
@@ -75,8 +132,65 @@
#define TOPi ((IV)SvIV(TOPs))
#define TOPu ((UV)SvUV(TOPs))
#define TOPl ((long)SvIV(TOPs))
+#define TOPul ((unsigned long)SvUV(TOPs))
+#ifdef HAS_QUAD
+#define TOPq ((Quad_t)SvIV(TOPs))
+#define TOPuq ((Uquad_t)SvUV(TOPs))
+#endif
/* Go to some pains in the rare event that we must extend the stack. */
+
+/*
+=for apidoc Am|void|EXTEND|SP|int nitems
+Used to extend the argument stack for an XSUB's return values. Once
+used, guarrantees that there is room for at least C<nitems> to be pushed
+onto the stack.
+
+=for apidoc Am|void|PUSHs|SV* sv
+Push an SV onto the stack. The stack must have room for this element.
+Does not handle 'set' magic. See C<XPUSHs>.
+
+=for apidoc Am|void|PUSHp|char* str|STRLEN len
+Push a string onto the stack. The stack must have room for this element.
+The C<len> indicates the length of the string. Handles 'set' magic. See
+C<XPUSHp>.
+
+=for apidoc Am|void|PUSHn|NV nv
+Push a double onto the stack. The stack must have room for this element.
+Handles 'set' magic. See C<XPUSHn>.
+
+=for apidoc Am|void|PUSHi|IV iv
+Push an integer onto the stack. The stack must have room for this element.
+Handles 'set' magic. See C<XPUSHi>.
+
+=for apidoc Am|void|PUSHu|UV uv
+Push an unsigned integer onto the stack. The stack must have room for this
+element. See C<XPUSHu>.
+
+=for apidoc Am|void|XPUSHs|SV* sv
+Push an SV onto the stack, extending the stack if necessary. Does not
+handle 'set' magic. See C<PUSHs>.
+
+=for apidoc Am|void|XPUSHp|char* str|STRLEN len
+Push a string onto the stack, extending the stack if necessary. The C<len>
+indicates the length of the string. Handles 'set' magic. See
+C<PUSHp>.
+
+=for apidoc Am|void|XPUSHn|NV nv
+Push a double onto the stack, extending the stack if necessary. Handles
+'set' magic. See C<PUSHn>.
+
+=for apidoc Am|void|XPUSHi|IV iv
+Push an integer onto the stack, extending the stack if necessary. Handles
+'set' magic. See C<PUSHi>.
+
+=for apidoc Am|void|XPUSHu|UV uv
+Push an unsigned integer onto the stack, extending the stack if necessary.
+See C<PUSHu>.
+
+=cut
+*/
+
#define EXTEND(p,n) STMT_START { if (PL_stack_max - p < (n)) { \
sp = stack_grow(sp,p, (int) (n)); \
} } STMT_END
@@ -91,43 +205,50 @@
#define PUSHs(s) (*++sp = (s))
#define PUSHTARG STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END
#define PUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); PUSHTARG; } STMT_END
-#define PUSHn(n) STMT_START { sv_setnv(TARG, (double)(n)); PUSHTARG; } STMT_END
+#define PUSHn(n) STMT_START { sv_setnv(TARG, (NV)(n)); PUSHTARG; } STMT_END
#define PUSHi(i) STMT_START { sv_setiv(TARG, (IV)(i)); PUSHTARG; } STMT_END
#define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
#define XPUSHs(s) STMT_START { EXTEND(sp,1); (*++sp = (s)); } STMT_END
#define XPUSHTARG STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END
#define XPUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END
-#define XPUSHn(n) STMT_START { sv_setnv(TARG, (double)(n)); XPUSHTARG; } STMT_END
+#define XPUSHn(n) STMT_START { sv_setnv(TARG, (NV)(n)); XPUSHTARG; } STMT_END
#define XPUSHi(i) STMT_START { sv_setiv(TARG, (IV)(i)); XPUSHTARG; } STMT_END
#define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#define XPUSHundef STMT_START { SvOK_off(TARG); XPUSHs(TARG); } STMT_END
#define SETs(s) (*sp = s)
#define SETTARG STMT_START { SvSETMAGIC(TARG); SETs(TARG); } STMT_END
#define SETp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); SETTARG; } STMT_END
-#define SETn(n) STMT_START { sv_setnv(TARG, (double)(n)); SETTARG; } STMT_END
+#define SETn(n) STMT_START { sv_setnv(TARG, (NV)(n)); SETTARG; } STMT_END
#define SETi(i) STMT_START { sv_setiv(TARG, (IV)(i)); SETTARG; } STMT_END
#define SETu(u) STMT_START { sv_setuv(TARG, (UV)(u)); SETTARG; } STMT_END
#define dTOPss SV *sv = TOPs
#define dPOPss SV *sv = POPs
-#define dTOPnv double value = TOPn
-#define dPOPnv double value = POPn
+#define dTOPnv NV value = TOPn
+#define dPOPnv NV value = POPn
#define dTOPiv IV value = TOPi
#define dPOPiv IV value = POPi
#define dTOPuv UV value = TOPu
#define dPOPuv UV value = POPu
+#ifdef HAS_QUAD
+#define dTOPqv Quad_t value = TOPu
+#define dPOPqv Quad_t value = POPu
+#define dTOPuqv Uquad_t value = TOPuq
+#define dPOPuqv Uquad_t value = POPuq
+#endif
#define dPOPXssrl(X) SV *right = POPs; SV *left = CAT2(X,s)
-#define dPOPXnnrl(X) double right = POPn; double left = CAT2(X,n)
+#define dPOPXnnrl(X) NV right = POPn; NV left = CAT2(X,n)
#define dPOPXiirl(X) IV right = POPi; IV left = CAT2(X,i)
#define USE_LEFT(sv) \
(SvOK(sv) || SvGMAGICAL(sv) || !(PL_op->op_flags & OPf_STACKED))
#define dPOPXnnrl_ul(X) \
- double right = POPn; \
+ NV right = POPn; \
SV *leftsv = CAT2(X,s); \
- double left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0
+ NV left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0
#define dPOPXiirl_ul(X) \
IV right = POPi; \
SV *leftsv = CAT2(X,s); \
@@ -154,24 +275,24 @@
#define RETSETUNDEF RETURNX(SETs(&PL_sv_undef))
#define ARGTARG PL_op->op_targ
-#define MAXARG PL_op->op_private
+
+ /* See OPpTARGET_MY: */
+#define MAXARG (PL_op->op_private & 15)
#define SWITCHSTACK(f,t) \
STMT_START { \
- AvFILLp(f) = sp - PL_stack_base; \
+ AvFILLp(f) = sp - PL_stack_base; \
PL_stack_base = AvARRAY(t); \
- PL_stack_max = PL_stack_base + AvMAX(t); \
+ PL_stack_max = PL_stack_base + AvMAX(t); \
sp = PL_stack_sp = PL_stack_base + AvFILLp(t); \
- PL_curstack = t; \
+ PL_curstack = t; \
} STMT_END
#define EXTEND_MORTAL(n) \
- STMT_START { \
- if (PL_tmps_ix + (n) >= PL_tmps_max) \
- Renew(PL_tmps_stack, PL_tmps_max = PL_tmps_ix + (n) + 1, SV*); \
- } STMT_END
-
-#ifdef OVERLOAD
+ STMT_START { \
+ if (PL_tmps_ix + (n) >= PL_tmps_max) \
+ tmps_grow(n); \
+ } STMT_END
#define AMGf_noright 1
#define AMGf_noleft 2
@@ -200,23 +321,43 @@
#define AMG_CALLbinL(left,right,meth) \
amagic_call(left,right,CAT2(meth,_amg),AMGf_noright)
-#define tryAMAGICunW(meth,set) STMT_START { \
+#define tryAMAGICunW(meth,set,shift,ret) STMT_START { \
if (PL_amagic_generation) { \
SV* tmpsv; \
- SV* arg= *(sp); \
+ SV* arg= sp[shift]; \
+ am_again: \
if ((SvAMAGIC(arg))&&\
(tmpsv=AMG_CALLun(arg,meth))) {\
- SPAGAIN; \
- set(tmpsv); RETURN; } \
+ SPAGAIN; if (shift) sp += shift; \
+ set(tmpsv); ret; } \
} \
} STMT_END
-#define tryAMAGICun tryAMAGICunSET
-#define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs)
+#define FORCE_SETs(sv) STMT_START { sv_setsv(TARG, (sv)); SETTARG; } STMT_END
+
+#define tryAMAGICun(meth) tryAMAGICunW(meth,SETsvUN,0,RETURN)
+#define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs,0,RETURN)
+#define tryAMAGICunTARGET(meth, shift) \
+ { dSP; sp--; /* get TARGET from below PL_stack_sp */ \
+ { dTARGETSTACKED; \
+ { dSP; tryAMAGICunW(meth,FORCE_SETs,shift,RETURN);}}}
+
+#define setAGAIN(ref) sv = arg = ref; \
+ if (!SvROK(ref)) \
+ Perl_croak(aTHX_ "Overloaded dereference did not return a reference"); \
+ goto am_again;
+
+#define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0,(void)0)
#define opASSIGN (PL_op->op_flags & OPf_STACKED)
#define SETsv(sv) STMT_START { \
- if (opASSIGN) { sv_setsv(TARG, (sv)); SETTARG; } \
+ if (opASSIGN || (SvFLAGS(TARG) & SVs_PADMY)) \
+ { sv_setsv(TARG, (sv)); SETTARG; } \
+ else SETs(sv); } STMT_END
+
+#define SETsvUN(sv) STMT_START { \
+ if (SvFLAGS(TARG) & SVs_PADMY) \
+ { sv_setsv(TARG, (sv)); SETTARG; } \
else SETs(sv); } STMT_END
/* newSVsv does not behave as advertised, so we copy missing
@@ -229,11 +370,3 @@
SvREFCNT_dec(tmpRef); \
SvRV(rv)=AMG_CALLun(rv,copy); \
} } STMT_END
-#else
-
-#define tryAMAGICbin(a,b)
-#define tryAMAGICbinSET(a,b)
-#define tryAMAGICun(a)
-#define tryAMAGICunSET(a)
-
-#endif /* OVERLOAD */
diff --git a/contrib/perl5/pp.sym b/contrib/perl5/pp.sym
new file mode 100644
index 0000000..0e6c056
--- /dev/null
+++ b/contrib/perl5/pp.sym
@@ -0,0 +1,391 @@
+#
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by opcode.pl from its data. Any changes made here
+# will be lost!
+#
+
+Perl_ck_anoncode
+Perl_ck_bitop
+Perl_ck_concat
+Perl_ck_defined
+Perl_ck_delete
+Perl_ck_eof
+Perl_ck_eval
+Perl_ck_exec
+Perl_ck_exists
+Perl_ck_exit
+Perl_ck_ftst
+Perl_ck_fun
+Perl_ck_fun_locale
+Perl_ck_glob
+Perl_ck_grep
+Perl_ck_index
+Perl_ck_join
+Perl_ck_lengthconst
+Perl_ck_lfun
+Perl_ck_listiob
+Perl_ck_match
+Perl_ck_method
+Perl_ck_null
+Perl_ck_open
+Perl_ck_repeat
+Perl_ck_require
+Perl_ck_rfun
+Perl_ck_rvconst
+Perl_ck_sassign
+Perl_ck_scmp
+Perl_ck_select
+Perl_ck_shift
+Perl_ck_sort
+Perl_ck_spair
+Perl_ck_split
+Perl_ck_subr
+Perl_ck_svconst
+Perl_ck_trunc
+Perl_pp_null
+Perl_pp_stub
+Perl_pp_scalar
+Perl_pp_pushmark
+Perl_pp_wantarray
+Perl_pp_const
+Perl_pp_gvsv
+Perl_pp_gv
+Perl_pp_gelem
+Perl_pp_padsv
+Perl_pp_padav
+Perl_pp_padhv
+Perl_pp_padany
+Perl_pp_pushre
+Perl_pp_rv2gv
+Perl_pp_rv2sv
+Perl_pp_av2arylen
+Perl_pp_rv2cv
+Perl_pp_anoncode
+Perl_pp_prototype
+Perl_pp_refgen
+Perl_pp_srefgen
+Perl_pp_ref
+Perl_pp_bless
+Perl_pp_backtick
+Perl_pp_glob
+Perl_pp_readline
+Perl_pp_rcatline
+Perl_pp_regcmaybe
+Perl_pp_regcreset
+Perl_pp_regcomp
+Perl_pp_match
+Perl_pp_qr
+Perl_pp_subst
+Perl_pp_substcont
+Perl_pp_trans
+Perl_pp_sassign
+Perl_pp_aassign
+Perl_pp_chop
+Perl_pp_schop
+Perl_pp_chomp
+Perl_pp_schomp
+Perl_pp_defined
+Perl_pp_undef
+Perl_pp_study
+Perl_pp_pos
+Perl_pp_preinc
+Perl_pp_predec
+Perl_pp_postinc
+Perl_pp_postdec
+Perl_pp_pow
+Perl_pp_multiply
+Perl_pp_i_multiply
+Perl_pp_divide
+Perl_pp_i_divide
+Perl_pp_modulo
+Perl_pp_i_modulo
+Perl_pp_repeat
+Perl_pp_add
+Perl_pp_i_add
+Perl_pp_subtract
+Perl_pp_i_subtract
+Perl_pp_concat
+Perl_pp_stringify
+Perl_pp_left_shift
+Perl_pp_right_shift
+Perl_pp_lt
+Perl_pp_i_lt
+Perl_pp_gt
+Perl_pp_i_gt
+Perl_pp_le
+Perl_pp_i_le
+Perl_pp_ge
+Perl_pp_i_ge
+Perl_pp_eq
+Perl_pp_i_eq
+Perl_pp_ne
+Perl_pp_i_ne
+Perl_pp_ncmp
+Perl_pp_i_ncmp
+Perl_pp_slt
+Perl_pp_sgt
+Perl_pp_sle
+Perl_pp_sge
+Perl_pp_seq
+Perl_pp_sne
+Perl_pp_scmp
+Perl_pp_bit_and
+Perl_pp_bit_xor
+Perl_pp_bit_or
+Perl_pp_negate
+Perl_pp_i_negate
+Perl_pp_not
+Perl_pp_complement
+Perl_pp_atan2
+Perl_pp_sin
+Perl_pp_cos
+Perl_pp_rand
+Perl_pp_srand
+Perl_pp_exp
+Perl_pp_log
+Perl_pp_sqrt
+Perl_pp_int
+Perl_pp_hex
+Perl_pp_oct
+Perl_pp_abs
+Perl_pp_length
+Perl_pp_substr
+Perl_pp_vec
+Perl_pp_index
+Perl_pp_rindex
+Perl_pp_sprintf
+Perl_pp_formline
+Perl_pp_ord
+Perl_pp_chr
+Perl_pp_crypt
+Perl_pp_ucfirst
+Perl_pp_lcfirst
+Perl_pp_uc
+Perl_pp_lc
+Perl_pp_quotemeta
+Perl_pp_rv2av
+Perl_pp_aelemfast
+Perl_pp_aelem
+Perl_pp_aslice
+Perl_pp_each
+Perl_pp_values
+Perl_pp_keys
+Perl_pp_delete
+Perl_pp_exists
+Perl_pp_rv2hv
+Perl_pp_helem
+Perl_pp_hslice
+Perl_pp_unpack
+Perl_pp_pack
+Perl_pp_split
+Perl_pp_join
+Perl_pp_list
+Perl_pp_lslice
+Perl_pp_anonlist
+Perl_pp_anonhash
+Perl_pp_splice
+Perl_pp_push
+Perl_pp_pop
+Perl_pp_shift
+Perl_pp_unshift
+Perl_pp_sort
+Perl_pp_reverse
+Perl_pp_grepstart
+Perl_pp_grepwhile
+Perl_pp_mapstart
+Perl_pp_mapwhile
+Perl_pp_range
+Perl_pp_flip
+Perl_pp_flop
+Perl_pp_and
+Perl_pp_or
+Perl_pp_xor
+Perl_pp_cond_expr
+Perl_pp_andassign
+Perl_pp_orassign
+Perl_pp_method
+Perl_pp_entersub
+Perl_pp_leavesub
+Perl_pp_leavesublv
+Perl_pp_caller
+Perl_pp_warn
+Perl_pp_die
+Perl_pp_reset
+Perl_pp_lineseq
+Perl_pp_nextstate
+Perl_pp_dbstate
+Perl_pp_unstack
+Perl_pp_enter
+Perl_pp_leave
+Perl_pp_scope
+Perl_pp_enteriter
+Perl_pp_iter
+Perl_pp_enterloop
+Perl_pp_leaveloop
+Perl_pp_return
+Perl_pp_last
+Perl_pp_next
+Perl_pp_redo
+Perl_pp_dump
+Perl_pp_goto
+Perl_pp_exit
+Perl_pp_open
+Perl_pp_close
+Perl_pp_pipe_op
+Perl_pp_fileno
+Perl_pp_umask
+Perl_pp_binmode
+Perl_pp_tie
+Perl_pp_untie
+Perl_pp_tied
+Perl_pp_dbmopen
+Perl_pp_dbmclose
+Perl_pp_sselect
+Perl_pp_select
+Perl_pp_getc
+Perl_pp_read
+Perl_pp_enterwrite
+Perl_pp_leavewrite
+Perl_pp_prtf
+Perl_pp_print
+Perl_pp_sysopen
+Perl_pp_sysseek
+Perl_pp_sysread
+Perl_pp_syswrite
+Perl_pp_send
+Perl_pp_recv
+Perl_pp_eof
+Perl_pp_tell
+Perl_pp_seek
+Perl_pp_truncate
+Perl_pp_fcntl
+Perl_pp_ioctl
+Perl_pp_flock
+Perl_pp_socket
+Perl_pp_sockpair
+Perl_pp_bind
+Perl_pp_connect
+Perl_pp_listen
+Perl_pp_accept
+Perl_pp_shutdown
+Perl_pp_gsockopt
+Perl_pp_ssockopt
+Perl_pp_getsockname
+Perl_pp_getpeername
+Perl_pp_lstat
+Perl_pp_stat
+Perl_pp_ftrread
+Perl_pp_ftrwrite
+Perl_pp_ftrexec
+Perl_pp_fteread
+Perl_pp_ftewrite
+Perl_pp_fteexec
+Perl_pp_ftis
+Perl_pp_fteowned
+Perl_pp_ftrowned
+Perl_pp_ftzero
+Perl_pp_ftsize
+Perl_pp_ftmtime
+Perl_pp_ftatime
+Perl_pp_ftctime
+Perl_pp_ftsock
+Perl_pp_ftchr
+Perl_pp_ftblk
+Perl_pp_ftfile
+Perl_pp_ftdir
+Perl_pp_ftpipe
+Perl_pp_ftlink
+Perl_pp_ftsuid
+Perl_pp_ftsgid
+Perl_pp_ftsvtx
+Perl_pp_fttty
+Perl_pp_fttext
+Perl_pp_ftbinary
+Perl_pp_chdir
+Perl_pp_chown
+Perl_pp_chroot
+Perl_pp_unlink
+Perl_pp_chmod
+Perl_pp_utime
+Perl_pp_rename
+Perl_pp_link
+Perl_pp_symlink
+Perl_pp_readlink
+Perl_pp_mkdir
+Perl_pp_rmdir
+Perl_pp_open_dir
+Perl_pp_readdir
+Perl_pp_telldir
+Perl_pp_seekdir
+Perl_pp_rewinddir
+Perl_pp_closedir
+Perl_pp_fork
+Perl_pp_wait
+Perl_pp_waitpid
+Perl_pp_system
+Perl_pp_exec
+Perl_pp_kill
+Perl_pp_getppid
+Perl_pp_getpgrp
+Perl_pp_setpgrp
+Perl_pp_getpriority
+Perl_pp_setpriority
+Perl_pp_time
+Perl_pp_tms
+Perl_pp_localtime
+Perl_pp_gmtime
+Perl_pp_alarm
+Perl_pp_sleep
+Perl_pp_shmget
+Perl_pp_shmctl
+Perl_pp_shmread
+Perl_pp_shmwrite
+Perl_pp_msgget
+Perl_pp_msgctl
+Perl_pp_msgsnd
+Perl_pp_msgrcv
+Perl_pp_semget
+Perl_pp_semctl
+Perl_pp_semop
+Perl_pp_require
+Perl_pp_dofile
+Perl_pp_entereval
+Perl_pp_leaveeval
+Perl_pp_entertry
+Perl_pp_leavetry
+Perl_pp_ghbyname
+Perl_pp_ghbyaddr
+Perl_pp_ghostent
+Perl_pp_gnbyname
+Perl_pp_gnbyaddr
+Perl_pp_gnetent
+Perl_pp_gpbyname
+Perl_pp_gpbynumber
+Perl_pp_gprotoent
+Perl_pp_gsbyname
+Perl_pp_gsbyport
+Perl_pp_gservent
+Perl_pp_shostent
+Perl_pp_snetent
+Perl_pp_sprotoent
+Perl_pp_sservent
+Perl_pp_ehostent
+Perl_pp_enetent
+Perl_pp_eprotoent
+Perl_pp_eservent
+Perl_pp_gpwnam
+Perl_pp_gpwuid
+Perl_pp_gpwent
+Perl_pp_spwent
+Perl_pp_epwent
+Perl_pp_ggrnam
+Perl_pp_ggrgid
+Perl_pp_ggrent
+Perl_pp_sgrent
+Perl_pp_egrent
+Perl_pp_getlogin
+Perl_pp_syscall
+Perl_pp_lock
+Perl_pp_threadsv
+Perl_pp_setstate
+Perl_pp_method_named
diff --git a/contrib/perl5/pp_ctl.c b/contrib/perl5/pp_ctl.c
index 653a345..acbcc7e 100644
--- a/contrib/perl5/pp_ctl.c
+++ b/contrib/perl5/pp_ctl.c
@@ -1,6 +1,6 @@
/* pp_ctl.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -17,6 +17,7 @@
*/
#include "EXTERN.h"
+#define PERL_IN_PP_CTL_C
#include "perl.h"
#ifndef WORD_ALIGN
@@ -25,22 +26,23 @@
#define DOCATCH(o) ((CATCH_GET == TRUE) ? docatch(o) : (o))
+static I32 sortcv(pTHXo_ SV *a, SV *b);
+static I32 sortcv_stacked(pTHXo_ SV *a, SV *b);
+static I32 sortcv_xsub(pTHXo_ SV *a, SV *b);
+static I32 sv_ncmp(pTHXo_ SV *a, SV *b);
+static I32 sv_i_ncmp(pTHXo_ SV *a, SV *b);
+static I32 amagic_ncmp(pTHXo_ SV *a, SV *b);
+static I32 amagic_i_ncmp(pTHXo_ SV *a, SV *b);
+static I32 amagic_cmp(pTHXo_ SV *a, SV *b);
+static I32 amagic_cmp_locale(pTHXo_ SV *a, SV *b);
+static I32 run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen);
+
#ifdef PERL_OBJECT
-#define CALLOP this->*PL_op
+static I32 sv_cmp_static(pTHXo_ SV *a, SV *b);
+static I32 sv_cmp_locale_static(pTHXo_ SV *a, SV *b);
#else
-#define CALLOP *PL_op
-static OP *docatch _((OP *o));
-static OP *dofindlabel _((OP *o, char *label, OP **opstack, OP **oplimit));
-static void doparseform _((SV *sv));
-static I32 dopoptoeval _((I32 startingblock));
-static I32 dopoptolabel _((char *label));
-static I32 dopoptoloop _((I32 startingblock));
-static I32 dopoptosub _((I32 startingblock));
-static I32 dopoptosub_at _((PERL_CONTEXT *cxstk, I32 startingblock));
-static void save_lines _((AV *array, SV *sv));
-static I32 sortcv _((SV *a, SV *b));
-static void qsortsv _((SV **array, size_t num_elts, I32 (*fun)(SV *a, SV *b)));
-static OP *doeval _((int gimme, OP** startop));
+#define sv_cmp_static Perl_sv_cmp
+#define sv_cmp_locale_static Perl_sv_cmp_locale
#endif
PP(pp_wantarray)
@@ -112,7 +114,9 @@ PP(pp_regcomp)
PL_reginterp_cnt = I32_MAX; /* Mark as safe. */
pm->op_pmflags = pm->op_pmpermflags; /* reset case sensitivity */
- pm->op_pmregexp = CALLREGCOMP(t, t + len, pm);
+ if (DO_UTF8(tmpstr))
+ pm->op_pmdynflags |= PMdf_UTF8;
+ pm->op_pmregexp = CALLREGCOMP(aTHX_ t, t + len, pm);
PL_reginterp_cnt = 0; /* XXXX Be extra paranoid - needed
inside tie/overload accessors. */
}
@@ -132,9 +136,13 @@ PP(pp_regcomp)
else if (strEQ("\\s+", pm->op_pmregexp->precomp))
pm->op_pmflags |= PMf_WHITE;
+ /* XXX runtime compiled output needs to move to the pad */
if (pm->op_pmflags & PMf_KEEP) {
pm->op_private &= ~OPpRUNTIME; /* no point compiling again */
+#if !defined(USE_ITHREADS) && !defined(USE_THREADS)
+ /* XXX can't change the optree at runtime either */
cLOGOP->op_first->op_next = PL_op->op_next;
+#endif
}
RETURN;
}
@@ -154,16 +162,18 @@ PP(pp_substcont)
if (cx->sb_iters++) {
if (cx->sb_iters > cx->sb_maxiters)
- DIE("Substitution loop");
+ DIE(aTHX_ "Substitution loop");
if (!(cx->sb_rxtainted & 2) && SvTAINTED(TOPs))
cx->sb_rxtainted |= 2;
sv_catsv(dstr, POPs);
/* Are we done */
- if (cx->sb_once || !CALLREGEXEC(rx, s, cx->sb_strend, orig,
- s == m, Nullsv, NULL,
- cx->sb_safebase ? 0 : REXEC_COPY_STR))
+ if (cx->sb_once || !CALLREGEXEC(aTHX_ rx, s, cx->sb_strend, orig,
+ s == m, cx->sb_targ, NULL,
+ ((cx->sb_rflags & REXEC_COPY_STR)
+ ? (REXEC_IGNOREPOS|REXEC_NOT_FIRST)
+ : (REXEC_COPY_STR|REXEC_IGNOREPOS|REXEC_NOT_FIRST))))
{
SV *targ = cx->sb_targ;
sv_catpvn(dstr, s, cx->sb_strend - s);
@@ -191,23 +201,23 @@ PP(pp_substcont)
RETURNOP(pm->op_next);
}
}
- if (rx->subbase && rx->subbase != orig) {
+ if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
m = s;
s = orig;
- cx->sb_orig = orig = rx->subbase;
+ cx->sb_orig = orig = rx->subbeg;
s = orig + (m - s);
cx->sb_strend = s + (cx->sb_strend - m);
}
- cx->sb_m = m = rx->startp[0];
+ cx->sb_m = m = rx->startp[0] + orig;
sv_catpvn(dstr, s, m-s);
- cx->sb_s = rx->endp[0];
+ cx->sb_s = rx->endp[0] + orig;
cx->sb_rxtainted |= RX_MATCH_TAINTED(rx);
rxres_save(&cx->sb_rxres, rx);
RETURNOP(pm->op_pmreplstart);
}
void
-rxres_save(void **rsp, REGEXP *rx)
+Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
{
UV *p = (UV*)*rsp;
U32 i;
@@ -221,13 +231,13 @@ rxres_save(void **rsp, REGEXP *rx)
*rsp = (void*)p;
}
- *p++ = (UV)rx->subbase;
- rx->subbase = Nullch;
+ *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
+ RX_MATCH_COPIED_off(rx);
*p++ = rx->nparens;
- *p++ = (UV)rx->subbeg;
- *p++ = (UV)rx->subend;
+ *p++ = PTR2UV(rx->subbeg);
+ *p++ = (UV)rx->sublen;
for (i = 0; i <= rx->nparens; ++i) {
*p++ = (UV)rx->startp[i];
*p++ = (UV)rx->endp[i];
@@ -235,32 +245,33 @@ rxres_save(void **rsp, REGEXP *rx)
}
void
-rxres_restore(void **rsp, REGEXP *rx)
+Perl_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
{
UV *p = (UV*)*rsp;
U32 i;
- Safefree(rx->subbase);
- rx->subbase = (char*)(*p);
+ if (RX_MATCH_COPIED(rx))
+ Safefree(rx->subbeg);
+ RX_MATCH_COPIED_set(rx, *p);
*p++ = 0;
rx->nparens = *p++;
- rx->subbeg = (char*)(*p++);
- rx->subend = (char*)(*p++);
+ rx->subbeg = INT2PTR(char*,*p++);
+ rx->sublen = (I32)(*p++);
for (i = 0; i <= rx->nparens; ++i) {
- rx->startp[i] = (char*)(*p++);
- rx->endp[i] = (char*)(*p++);
+ rx->startp[i] = (I32)(*p++);
+ rx->endp[i] = (I32)(*p++);
}
}
void
-rxres_free(void **rsp)
+Perl_rxres_free(pTHX_ void **rsp)
{
UV *p = (UV*)*rsp;
if (p) {
- Safefree((char*)(*p));
+ Safefree(INT2PTR(char*,*p));
Safefree(p);
*rsp = Null(void*);
}
@@ -284,17 +295,24 @@ PP(pp_formline)
bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
char *chophere;
char *linemark;
- double value;
+ NV value;
bool gotsome;
STRLEN len;
+ STRLEN fudge = SvCUR(tmpForm) * (IN_BYTE ? 1 : 3) + 1;
+ bool item_is_utf = FALSE;
if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
- SvREADONLY_off(tmpForm);
- doparseform(tmpForm);
+ if (SvREADONLY(tmpForm)) {
+ SvREADONLY_off(tmpForm);
+ doparseform(tmpForm);
+ SvREADONLY_on(tmpForm);
+ }
+ else
+ doparseform(tmpForm);
}
SvPV_force(PL_formtarget, len);
- t = SvGROW(PL_formtarget, len + SvCUR(tmpForm) + 1); /* XXX SvCUR bad */
+ t = SvGROW(PL_formtarget, len + fudge + 1); /* XXX SvCUR bad */
t += len;
f = SvPV(tmpForm, len);
/* need to jump to the next word */
@@ -326,9 +344,9 @@ PP(pp_formline)
case FF_END: name = "END"; break;
}
if (arg >= 0)
- PerlIO_printf(PerlIO_stderr(), "%-16s%ld\n", name, (long) arg);
+ PerlIO_printf(Perl_debug_log, "%-16s%ld\n", name, (long) arg);
else
- PerlIO_printf(PerlIO_stderr(), "%-16s\n", name);
+ PerlIO_printf(Perl_debug_log, "%-16s\n", name);
} )
switch (*fpc++) {
case FF_LINEMARK:
@@ -356,14 +374,40 @@ PP(pp_formline)
sv = *++MARK;
else {
sv = &PL_sv_no;
- if (PL_dowarn)
- warn("Not enough format arguments");
+ if (ckWARN(WARN_SYNTAX))
+ Perl_warner(aTHX_ WARN_SYNTAX, "Not enough format arguments");
}
break;
case FF_CHECKNL:
item = s = SvPV(sv, len);
itemsize = len;
+ if (DO_UTF8(sv)) {
+ itemsize = sv_len_utf8(sv);
+ if (itemsize != len) {
+ I32 itembytes;
+ if (itemsize > fieldsize) {
+ itemsize = fieldsize;
+ itembytes = itemsize;
+ sv_pos_u2b(sv, &itembytes, 0);
+ }
+ else
+ itembytes = len;
+ send = chophere = s + itembytes;
+ while (s < send) {
+ if (*s & ~31)
+ gotsome = TRUE;
+ else if (*s == '\n')
+ break;
+ s++;
+ }
+ item_is_utf = TRUE;
+ itemsize = s - item;
+ sv_pos_b2u(sv, &itemsize);
+ break;
+ }
+ }
+ item_is_utf = FALSE;
if (itemsize > fieldsize)
itemsize = fieldsize;
send = chophere = s + itemsize;
@@ -380,6 +424,49 @@ PP(pp_formline)
case FF_CHECKCHOP:
item = s = SvPV(sv, len);
itemsize = len;
+ if (DO_UTF8(sv)) {
+ itemsize = sv_len_utf8(sv);
+ if (itemsize != len) {
+ I32 itembytes;
+ if (itemsize <= fieldsize) {
+ send = chophere = s + itemsize;
+ while (s < send) {
+ if (*s == '\r') {
+ itemsize = s - item;
+ break;
+ }
+ if (*s++ & ~31)
+ gotsome = TRUE;
+ }
+ }
+ else {
+ itemsize = fieldsize;
+ itembytes = itemsize;
+ sv_pos_u2b(sv, &itembytes, 0);
+ send = chophere = s + itembytes;
+ while (s < send || (s == send && isSPACE(*s))) {
+ if (isSPACE(*s)) {
+ if (chopspace)
+ chophere = s;
+ if (*s == '\r')
+ break;
+ }
+ else {
+ if (*s & ~31)
+ gotsome = TRUE;
+ if (strchr(PL_chopset, *s))
+ chophere = s + 1;
+ }
+ s++;
+ }
+ itemsize = chophere - item;
+ sv_pos_b2u(sv, &itemsize);
+ }
+ item_is_utf = TRUE;
+ break;
+ }
+ }
+ item_is_utf = FALSE;
if (itemsize <= fieldsize) {
send = chophere = s + itemsize;
while (s < send) {
@@ -435,6 +522,26 @@ PP(pp_formline)
case FF_ITEM:
arg = itemsize;
s = item;
+ if (item_is_utf) {
+ while (arg--) {
+ if (*s & 0x80) {
+ switch (UTF8SKIP(s)) {
+ case 7: *t++ = *s++;
+ case 6: *t++ = *s++;
+ case 5: *t++ = *s++;
+ case 4: *t++ = *s++;
+ case 3: *t++ = *s++;
+ case 2: *t++ = *s++;
+ case 1: *t++ = *s++;
+ }
+ }
+ else {
+ if ( !((*t++ = *s++) & ~31) )
+ t[-1] = ' ';
+ }
+ }
+ break;
+ }
while (arg--) {
#ifdef EBCDIC
int ch = *t++ = *s++;
@@ -458,6 +565,7 @@ PP(pp_formline)
case FF_LINEGLOB:
item = s = SvPV(sv, len);
itemsize = len;
+ item_is_utf = FALSE; /* XXX is this correct? */
if (itemsize) {
gotsome = TRUE;
send = s + itemsize;
@@ -471,7 +579,7 @@ PP(pp_formline)
}
SvCUR_set(PL_formtarget, t - SvPVX(PL_formtarget));
sv_catpvn(PL_formtarget, item, itemsize);
- SvGROW(PL_formtarget, SvCUR(PL_formtarget) + SvCUR(tmpForm) + 1);
+ SvGROW(PL_formtarget, SvCUR(PL_formtarget) + fudge + 1);
t = SvPVX(PL_formtarget) + SvCUR(PL_formtarget);
}
break;
@@ -489,11 +597,25 @@ PP(pp_formline)
gotsome = TRUE;
value = SvNV(sv);
/* Formats aren't yet marked for locales, so assume "yes". */
- SET_NUMERIC_LOCAL();
- if (arg & 256) {
- sprintf(t, "%#*.*f", (int) fieldsize, (int) arg & 255, value);
- } else {
- sprintf(t, "%*.0f", (int) fieldsize, value);
+ {
+ RESTORE_NUMERIC_LOCAL();
+#if defined(USE_LONG_DOUBLE)
+ if (arg & 256) {
+ sprintf(t, "%#*.*" PERL_PRIfldbl,
+ (int) fieldsize, (int) arg & 255, value);
+ } else {
+ sprintf(t, "%*.0" PERL_PRIfldbl, (int) fieldsize, value);
+ }
+#else
+ if (arg & 256) {
+ sprintf(t, "%#*.*f",
+ (int) fieldsize, (int) arg & 255, value);
+ } else {
+ sprintf(t, "%*.0f",
+ (int) fieldsize, value);
+ }
+#endif
+ RESTORE_NUMERIC_STANDARD();
}
t += fieldsize;
break;
@@ -515,7 +637,7 @@ PP(pp_formline)
if (lines == 200) {
arg = t - linemark;
if (strnEQ(linemark, linemark - arg, arg))
- DIE("Runaway format");
+ DIE(aTHX_ "Runaway format");
}
FmLINES(PL_formtarget) = lines;
SP = ORIGMARK;
@@ -571,23 +693,19 @@ PP(pp_grepstart)
if (PL_stack_base + *PL_markstack_ptr == SP) {
(void)POPMARK;
if (GIMME_V == G_SCALAR)
- XPUSHs(&PL_sv_no);
+ XPUSHs(sv_2mortal(newSViv(0)));
RETURNOP(PL_op->op_next->op_next);
}
PL_stack_sp = PL_stack_base + *PL_markstack_ptr + 1;
- pp_pushmark(ARGS); /* push dst */
- pp_pushmark(ARGS); /* push src */
+ pp_pushmark(); /* push dst */
+ pp_pushmark(); /* push src */
ENTER; /* enter outer scope */
SAVETMPS;
-#ifdef USE_THREADS
- /* SAVE_DEFSV does *not* suffice here */
- save_sptr(&THREADSV(0));
-#else
- SAVESPTR(GvSV(PL_defgv));
-#endif /* USE_THREADS */
+ /* SAVE_DEFSV does *not* suffice here for USE_THREADS */
+ SAVESPTR(DEFSV);
ENTER; /* enter inner scope */
- SAVESPTR(PL_curpm);
+ SAVEVPTR(PL_curpm);
src = PL_stack_base[*PL_markstack_ptr];
SvTEMP_off(src);
@@ -595,13 +713,13 @@ PP(pp_grepstart)
PUTBACK;
if (PL_op->op_type == OP_MAPSTART)
- pp_pushmark(ARGS); /* push top */
+ pp_pushmark(); /* push top */
return ((LOGOP*)PL_op->op_next)->op_other;
}
PP(pp_mapstart)
{
- DIE("panic: mapstart"); /* uses grepstart */
+ DIE(aTHX_ "panic: mapstart"); /* uses grepstart */
}
PP(pp_mapwhile)
@@ -657,7 +775,7 @@ PP(pp_mapwhile)
SV *src;
ENTER; /* enter inner scope */
- SAVESPTR(PL_curpm);
+ SAVEVPTR(PL_curpm);
src = PL_stack_base[PL_markstack_ptr[-1]];
SvTEMP_off(src);
@@ -667,61 +785,6 @@ PP(pp_mapwhile)
}
}
-#define tryCALL_AMAGICbin(left,right,meth,svp) STMT_START { \
- *svp = Nullsv; \
- if (PL_amagic_generation) { \
- if (SvAMAGIC(left)||SvAMAGIC(right))\
- *svp = amagic_call(left, \
- right, \
- CAT2(meth,_amg), \
- 0); \
- } \
- } STMT_END
-
-STATIC I32
-amagic_cmp(register SV *str1, register SV *str2)
-{
- SV *tmpsv;
- tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
- if (tmpsv) {
- double d;
-
- if (SvIOK(tmpsv)) {
- I32 i = SvIVX(tmpsv);
- if (i > 0)
- return 1;
- return i? -1 : 0;
- }
- d = SvNV(tmpsv);
- if (d > 0)
- return 1;
- return d? -1 : 0;
- }
- return sv_cmp(str1, str2);
-}
-
-STATIC I32
-amagic_cmp_locale(register SV *str1, register SV *str2)
-{
- SV *tmpsv;
- tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
- if (tmpsv) {
- double d;
-
- if (SvIOK(tmpsv)) {
- I32 i = SvIVX(tmpsv);
- if (i > 0)
- return 1;
- return i? -1 : 0;
- }
- d = SvNV(tmpsv);
- if (d > 0)
- return 1;
- return d? -1 : 0;
- }
- return sv_cmp_locale(str1, str2);
-}
-
PP(pp_sort)
{
djSP; dMARK; dORIGMARK;
@@ -734,6 +797,8 @@ PP(pp_sort)
I32 gimme = GIMME;
OP* nextop = PL_op->op_next;
I32 overloading = 0;
+ bool hasargs = FALSE;
+ I32 is_xsub = 0;
if (gimme != G_ARRAY) {
SP = MARK;
@@ -741,58 +806,67 @@ PP(pp_sort)
}
ENTER;
- SAVEPPTR(PL_sortcop);
+ SAVEVPTR(PL_sortcop);
if (PL_op->op_flags & OPf_STACKED) {
if (PL_op->op_flags & OPf_SPECIAL) {
OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
kid = kUNOP->op_first; /* pass rv2gv */
kid = kUNOP->op_first; /* pass leave */
PL_sortcop = kid->op_next;
- stash = PL_curcop->cop_stash;
+ stash = CopSTASH(PL_curcop);
}
else {
cv = sv_2cv(*++MARK, &stash, &gv, 0);
+ if (cv && SvPOK(cv)) {
+ STRLEN n_a;
+ char *proto = SvPV((SV*)cv, n_a);
+ if (proto && strEQ(proto, "$$")) {
+ hasargs = TRUE;
+ }
+ }
if (!(cv && CvROOT(cv))) {
- if (gv) {
+ if (cv && CvXSUB(cv)) {
+ is_xsub = 1;
+ }
+ else if (gv) {
SV *tmpstr = sv_newmortal();
gv_efullname3(tmpstr, gv, Nullch);
- if (cv && CvXSUB(cv))
- DIE("Xsub \"%s\" called in sort", SvPVX(tmpstr));
- DIE("Undefined sort subroutine \"%s\" called",
+ DIE(aTHX_ "Undefined sort subroutine \"%s\" called",
SvPVX(tmpstr));
}
- if (cv) {
- if (CvXSUB(cv))
- DIE("Xsub called in sort");
- DIE("Undefined subroutine in sort");
+ else {
+ DIE(aTHX_ "Undefined subroutine in sort");
}
- DIE("Not a CODE reference in sort");
}
- PL_sortcop = CvSTART(cv);
- SAVESPTR(CvROOT(cv)->op_ppaddr);
- CvROOT(cv)->op_ppaddr = ppaddr[OP_NULL];
- SAVESPTR(PL_curpad);
- PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
+ if (is_xsub)
+ PL_sortcop = (OP*)cv;
+ else {
+ PL_sortcop = CvSTART(cv);
+ SAVEVPTR(CvROOT(cv)->op_ppaddr);
+ CvROOT(cv)->op_ppaddr = PL_ppaddr[OP_NULL];
+
+ SAVEVPTR(PL_curpad);
+ PL_curpad = AvARRAY((AV*)AvARRAY(CvPADLIST(cv))[1]);
+ }
}
}
else {
PL_sortcop = Nullop;
- stash = PL_curcop->cop_stash;
+ stash = CopSTASH(PL_curcop);
}
up = myorigmark + 1;
while (MARK < SP) { /* This may or may not shift down one here. */
/*SUPPRESS 560*/
- if (*up = *++MARK) { /* Weed out nulls. */
+ if ((*up = *++MARK)) { /* Weed out nulls. */
SvTEMP_off(*up);
if (!PL_sortcop && !SvPOK(*up)) {
+ STRLEN n_a;
if (SvAMAGIC(*up))
overloading = 1;
- else {
- STRLEN n_a;
+ else
(void)sv_2pv(*up, &n_a);
- }
}
up++;
}
@@ -820,7 +894,6 @@ PP(pp_sort)
PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
if (!(PL_op->op_flags & OPf_SPECIAL)) {
- bool hasargs = FALSE;
cx->cx_type = CXt_SUB;
cx->blk_gimme = G_SCALAR;
PUSHSUB(cx);
@@ -828,9 +901,22 @@ PP(pp_sort)
(void)SvREFCNT_inc(cv); /* in preparation for POPSUB */
}
PL_sortcxix = cxstack_ix;
- qsortsv((myorigmark+1), max, FUNC_NAME_TO_PTR(sortcv));
+
+ if (hasargs && !is_xsub) {
+ /* This is mostly copied from pp_entersub */
+ AV *av = (AV*)PL_curpad[0];
+
+#ifndef USE_THREADS
+ cx->blk_sub.savearray = GvAV(PL_defgv);
+ GvAV(PL_defgv) = (AV*)SvREFCNT_inc(av);
+#endif /* USE_THREADS */
+ cx->blk_sub.argarray = av;
+ }
+ qsortsv((myorigmark+1), max,
+ is_xsub ? sortcv_xsub : hasargs ? sortcv_stacked : sortcv);
POPBLOCK(cx,PL_curpm);
+ PL_stack_sp = newsp;
POPSTACK;
CATCH_SET(oldcatch);
}
@@ -839,13 +925,24 @@ PP(pp_sort)
if (max > 1) {
MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
qsortsv(ORIGMARK+1, max,
- (PL_op->op_private & OPpLOCALE)
- ? ( overloading
- ? FUNC_NAME_TO_PTR(amagic_cmp_locale)
- : FUNC_NAME_TO_PTR(sv_cmp_locale))
- : ( overloading
- ? FUNC_NAME_TO_PTR(amagic_cmp)
- : FUNC_NAME_TO_PTR(sv_cmp) ));
+ (PL_op->op_private & OPpSORT_NUMERIC)
+ ? ( (PL_op->op_private & OPpSORT_INTEGER)
+ ? ( overloading ? amagic_i_ncmp : sv_i_ncmp)
+ : ( overloading ? amagic_ncmp : sv_ncmp))
+ : ( (PL_op->op_private & OPpLOCALE)
+ ? ( overloading
+ ? amagic_cmp_locale
+ : sv_cmp_locale_static)
+ : ( overloading ? amagic_cmp : sv_cmp_static)));
+ if (PL_op->op_private & OPpSORT_REVERSE) {
+ SV **p = ORIGMARK+1;
+ SV **q = ORIGMARK+max;
+ while (p < q) {
+ SV *tmp = *p;
+ *p++ = *q;
+ *q-- = tmp;
+ }
+ }
}
}
LEAVE;
@@ -858,8 +955,11 @@ PP(pp_sort)
PP(pp_range)
{
if (GIMME == G_ARRAY)
- return cCONDOP->op_true;
- return SvTRUEx(PAD_SV(PL_op->op_targ)) ? cCONDOP->op_false : cCONDOP->op_true;
+ return NORMAL;
+ if (SvTRUEx(PAD_SV(PL_op->op_targ)))
+ return cLOGOP->op_other;
+ else
+ return NORMAL;
}
PP(pp_flip)
@@ -867,7 +967,7 @@ PP(pp_flip)
djSP;
if (GIMME == G_ARRAY) {
- RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
+ RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
}
else {
dTOPss;
@@ -885,7 +985,7 @@ PP(pp_flip)
else {
sv_setiv(targ, 0);
SP--;
- RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
+ RETURNOP(((LOGOP*)cUNOP->op_first)->op_other);
}
}
sv_setpv(TARG, "");
@@ -904,11 +1004,18 @@ PP(pp_flop)
register SV *sv;
I32 max;
+ if (SvGMAGICAL(left))
+ mg_get(left);
+ if (SvGMAGICAL(right))
+ mg_get(right);
+
if (SvNIOKp(left) || !SvPOKp(left) ||
- (looks_like_number(left) && *SvPVX(left) != '0') )
+ SvNIOKp(right) || !SvPOKp(right) ||
+ (looks_like_number(left) && *SvPVX(left) != '0' &&
+ looks_like_number(right) && *SvPVX(right) != '0'))
{
if (SvNV(left) < IV_MIN || SvNV(right) > IV_MAX)
- croak("Range iterator outside integer range");
+ DIE(aTHX_ "Range iterator outside integer range");
i = SvIV(left);
max = SvIV(right);
if (max >= i) {
@@ -925,8 +1032,7 @@ PP(pp_flop)
}
else {
SV *final = sv_mortalcopy(right);
- STRLEN len;
- STRLEN n_a;
+ STRLEN len, n_a;
char *tmps = SvPV(final, len);
sv = sv_mortalcopy(left);
@@ -959,7 +1065,7 @@ PP(pp_flop)
/* Control. */
STATIC I32
-dopoptolabel(char *label)
+S_dopoptolabel(pTHX_ char *label)
{
dTHR;
register I32 i;
@@ -969,29 +1075,38 @@ dopoptolabel(char *label)
cx = &cxstack[i];
switch (CxTYPE(cx)) {
case CXt_SUBST:
- if (PL_dowarn)
- warn("Exiting substitution via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting substitution via %s",
+ PL_op_name[PL_op->op_type]);
break;
case CXt_SUB:
- if (PL_dowarn)
- warn("Exiting subroutine via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting subroutine via %s",
+ PL_op_name[PL_op->op_type]);
+ break;
+ case CXt_FORMAT:
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting format via %s",
+ PL_op_name[PL_op->op_type]);
break;
case CXt_EVAL:
- if (PL_dowarn)
- warn("Exiting eval via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting eval via %s",
+ PL_op_name[PL_op->op_type]);
break;
case CXt_NULL:
- if (PL_dowarn)
- warn("Exiting pseudo-block via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting pseudo-block via %s",
+ PL_op_name[PL_op->op_type]);
return -1;
case CXt_LOOP:
if (!cx->blk_loop.label ||
strNE(label, cx->blk_loop.label) ) {
- DEBUG_l(deb("(Skipping label #%ld %s)\n",
+ DEBUG_l(Perl_deb(aTHX_ "(Skipping label #%ld %s)\n",
(long)i, cx->blk_loop.label));
continue;
}
- DEBUG_l( deb("(Found label #%ld %s)\n", (long)i, label));
+ DEBUG_l( Perl_deb(aTHX_ "(Found label #%ld %s)\n", (long)i, label));
return i;
}
}
@@ -999,14 +1114,14 @@ dopoptolabel(char *label)
}
I32
-dowantarray(void)
+Perl_dowantarray(pTHX)
{
I32 gimme = block_gimme();
return (gimme == G_VOID) ? G_SCALAR : gimme;
}
I32
-block_gimme(void)
+Perl_block_gimme(pTHX)
{
dTHR;
I32 cxix;
@@ -1023,21 +1138,21 @@ block_gimme(void)
case G_ARRAY:
return G_ARRAY;
default:
- croak("panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
+ Perl_croak(aTHX_ "panic: bad gimme: %d\n", cxstack[cxix].blk_gimme);
/* NOTREACHED */
return 0;
}
}
STATIC I32
-dopoptosub(I32 startingblock)
+S_dopoptosub(pTHX_ I32 startingblock)
{
dTHR;
return dopoptosub_at(cxstack, startingblock);
}
STATIC I32
-dopoptosub_at(PERL_CONTEXT *cxstk, I32 startingblock)
+S_dopoptosub_at(pTHX_ PERL_CONTEXT *cxstk, I32 startingblock)
{
dTHR;
I32 i;
@@ -1049,7 +1164,8 @@ dopoptosub_at(PERL_CONTEXT *cxstk, I32 startingblock)
continue;
case CXt_EVAL:
case CXt_SUB:
- DEBUG_l( deb("(Found sub #%ld)\n", (long)i));
+ case CXt_FORMAT:
+ DEBUG_l( Perl_deb(aTHX_ "(Found sub #%ld)\n", (long)i));
return i;
}
}
@@ -1057,7 +1173,7 @@ dopoptosub_at(PERL_CONTEXT *cxstk, I32 startingblock)
}
STATIC I32
-dopoptoeval(I32 startingblock)
+S_dopoptoeval(pTHX_ I32 startingblock)
{
dTHR;
I32 i;
@@ -1068,7 +1184,7 @@ dopoptoeval(I32 startingblock)
default:
continue;
case CXt_EVAL:
- DEBUG_l( deb("(Found eval #%ld)\n", (long)i));
+ DEBUG_l( Perl_deb(aTHX_ "(Found eval #%ld)\n", (long)i));
return i;
}
}
@@ -1076,7 +1192,7 @@ dopoptoeval(I32 startingblock)
}
STATIC I32
-dopoptoloop(I32 startingblock)
+S_dopoptoloop(pTHX_ I32 startingblock)
{
dTHR;
I32 i;
@@ -1085,23 +1201,32 @@ dopoptoloop(I32 startingblock)
cx = &cxstack[i];
switch (CxTYPE(cx)) {
case CXt_SUBST:
- if (PL_dowarn)
- warn("Exiting substitution via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting substitution via %s",
+ PL_op_name[PL_op->op_type]);
break;
case CXt_SUB:
- if (PL_dowarn)
- warn("Exiting subroutine via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting subroutine via %s",
+ PL_op_name[PL_op->op_type]);
+ break;
+ case CXt_FORMAT:
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting format via %s",
+ PL_op_name[PL_op->op_type]);
break;
case CXt_EVAL:
- if (PL_dowarn)
- warn("Exiting eval via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting eval via %s",
+ PL_op_name[PL_op->op_type]);
break;
case CXt_NULL:
- if (PL_dowarn)
- warn("Exiting pseudo-block via %s", op_name[PL_op->op_type]);
+ if (ckWARN(WARN_EXITING))
+ Perl_warner(aTHX_ WARN_EXITING, "Exiting pseudo-block via %s",
+ PL_op_name[PL_op->op_type]);
return -1;
case CXt_LOOP:
- DEBUG_l( deb("(Found loop #%ld)\n", (long)i));
+ DEBUG_l( Perl_deb(aTHX_ "(Found loop #%ld)\n", (long)i));
return i;
}
}
@@ -1109,24 +1234,25 @@ dopoptoloop(I32 startingblock)
}
void
-dounwind(I32 cxix)
+Perl_dounwind(pTHX_ I32 cxix)
{
dTHR;
register PERL_CONTEXT *cx;
- SV **newsp;
I32 optype;
while (cxstack_ix > cxix) {
+ SV *sv;
cx = &cxstack[cxstack_ix];
DEBUG_l(PerlIO_printf(Perl_debug_log, "Unwinding block %ld, type %s\n",
- (long) cxstack_ix, block_type[CxTYPE(cx)]));
+ (long) cxstack_ix, PL_block_type[CxTYPE(cx)]));
/* Note: we don't need to restore the base context info till the end. */
switch (CxTYPE(cx)) {
case CXt_SUBST:
POPSUBST(cx);
continue; /* not break */
case CXt_SUB:
- POPSUB(cx);
+ POPSUB(cx,sv);
+ LEAVESUB(sv);
break;
case CXt_EVAL:
POPEVAL(cx);
@@ -1136,15 +1262,65 @@ dounwind(I32 cxix)
break;
case CXt_NULL:
break;
+ case CXt_FORMAT:
+ POPFORMAT(cx);
+ break;
}
cxstack_ix--;
}
}
+/*
+ * Closures mentioned at top level of eval cannot be referenced
+ * again, and their presence indirectly causes a memory leak.
+ * (Note that the fact that compcv and friends are still set here
+ * is, AFAIK, an accident.) --Chip
+ *
+ * XXX need to get comppad et al from eval's cv rather than
+ * relying on the incidental global values.
+ */
+STATIC void
+S_free_closures(pTHX)
+{
+ dTHR;
+ SV **svp = AvARRAY(PL_comppad_name);
+ I32 ix;
+ for (ix = AvFILLp(PL_comppad_name); ix >= 0; ix--) {
+ SV *sv = svp[ix];
+ if (sv && sv != &PL_sv_undef && *SvPVX(sv) == '&') {
+ SvREFCNT_dec(sv);
+ svp[ix] = &PL_sv_undef;
+
+ sv = PL_curpad[ix];
+ if (CvCLONE(sv)) {
+ SvREFCNT_dec(CvOUTSIDE(sv));
+ CvOUTSIDE(sv) = Nullcv;
+ }
+ else {
+ SvREFCNT_dec(sv);
+ sv = NEWSV(0,0);
+ SvPADTMP_on(sv);
+ PL_curpad[ix] = sv;
+ }
+ }
+ }
+}
+
+void
+Perl_qerror(pTHX_ SV *err)
+{
+ if (PL_in_eval)
+ sv_catsv(ERRSV, err);
+ else if (PL_errors)
+ sv_catsv(PL_errors, err);
+ else
+ Perl_warn(aTHX_ "%"SVf, err);
+ ++PL_error_count;
+}
+
OP *
-die_where(char *message)
+Perl_die_where(pTHX_ char *message, STRLEN msglen)
{
- dSP;
STRLEN n_a;
if (PL_in_eval) {
I32 cxix;
@@ -1153,33 +1329,37 @@ die_where(char *message)
SV **newsp;
if (message) {
- if (PL_in_eval & 4) {
- SV **svp;
- STRLEN klen = strlen(message);
-
- svp = hv_fetch(ERRHV, message, klen, TRUE);
- if (svp) {
- if (!SvIOK(*svp)) {
- static char prefix[] = "\t(in cleanup) ";
- SV *err = ERRSV;
- sv_upgrade(*svp, SVt_IV);
- (void)SvIOK_only(*svp);
- if (!SvPOK(err))
- sv_setpv(err,"");
- SvGROW(err, SvCUR(err)+sizeof(prefix)+klen);
- sv_catpvn(err, prefix, sizeof(prefix)-1);
- sv_catpvn(err, message, klen);
+ if (PL_in_eval & EVAL_KEEPERR) {
+ static char prefix[] = "\t(in cleanup) ";
+ SV *err = ERRSV;
+ char *e = Nullch;
+ if (!SvPOK(err))
+ sv_setpv(err,"");
+ else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
+ e = SvPV(err, n_a);
+ e += n_a - msglen;
+ if (*e != *message || strNE(e,message))
+ e = Nullch;
+ }
+ if (!e) {
+ SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
+ sv_catpvn(err, prefix, sizeof(prefix)-1);
+ sv_catpvn(err, message, msglen);
+ if (ckWARN(WARN_MISC)) {
+ STRLEN start = SvCUR(err)-msglen-sizeof(prefix)+1;
+ Perl_warner(aTHX_ WARN_MISC, SvPVX(err)+start);
}
- sv_inc(*svp);
}
}
else
- sv_setpv(ERRSV, message);
+ sv_setpvn(ERRSV, message, msglen);
}
else
- message = SvPVx(ERRSV, n_a);
+ message = SvPVx(ERRSV, msglen);
- while ((cxix = dopoptoeval(cxstack_ix)) < 0 && PL_curstackinfo->si_prev) {
+ while ((cxix = dopoptoeval(cxstack_ix)) < 0
+ && PL_curstackinfo->si_prev)
+ {
dounwind(-1);
POPSTACK;
}
@@ -1192,7 +1372,8 @@ die_where(char *message)
POPBLOCK(cx,PL_curpm);
if (CxTYPE(cx) != CXt_EVAL) {
- PerlIO_printf(PerlIO_stderr(), "panic: die %s", message);
+ PerlIO_write(Perl_error_log, "panic: die ", 11);
+ PerlIO_write(Perl_error_log, message, msglen);
my_exit(1);
}
POPEVAL(cx);
@@ -1205,15 +1386,27 @@ die_where(char *message)
if (optype == OP_REQUIRE) {
char* msg = SvPVx(ERRSV, n_a);
- DIE("%s", *msg ? msg : "Compilation failed in require");
+ DIE(aTHX_ "%sCompilation failed in require",
+ *msg ? msg : "Unknown error\n");
}
return pop_return();
}
}
- if(!message)
- message = SvPVx(ERRSV, n_a);
- PerlIO_printf(PerlIO_stderr(), "%s",message);
- PerlIO_flush(PerlIO_stderr());
+ if (!message)
+ message = SvPVx(ERRSV, msglen);
+ {
+#ifdef USE_SFIO
+ /* SFIO can really mess with your errno */
+ int e = errno;
+#endif
+ PerlIO *serr = Perl_error_log;
+
+ PerlIO_write(serr, message, msglen);
+ (void)PerlIO_flush(serr);
+#ifdef USE_SFIO
+ errno = e;
+#endif
+ }
my_failure_exit();
/* NOTREACHED */
return 0;
@@ -1255,13 +1448,13 @@ PP(pp_caller)
PERL_SI *top_si = PL_curstackinfo;
I32 dbcxix;
I32 gimme;
- HV *hv;
+ char *stashname;
SV *sv;
I32 count = 0;
if (MAXARG)
count = POPi;
- EXTEND(SP, 6);
+ EXTEND(SP, 10);
for (;;) {
/* we may be in a higher stacklevel, so dig down deeper */
while (cxix < 0 && top_si->si_type != PERLSI_MAIN) {
@@ -1283,7 +1476,7 @@ PP(pp_caller)
}
cx = &ccstack[cxix];
- if (CxTYPE(cx) == CXt_SUB) {
+ if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
dbcxix = dopoptosub_at(ccstack, cxix - 1);
/* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the
field below is defined for any cx. */
@@ -1291,35 +1484,35 @@ PP(pp_caller)
cx = &ccstack[dbcxix];
}
+ stashname = CopSTASHPV(cx->blk_oldcop);
if (GIMME != G_ARRAY) {
- hv = cx->blk_oldcop->cop_stash;
- if (!hv)
+ if (!stashname)
PUSHs(&PL_sv_undef);
else {
dTARGET;
- sv_setpv(TARG, HvNAME(hv));
+ sv_setpv(TARG, stashname);
PUSHs(TARG);
}
RETURN;
}
- hv = cx->blk_oldcop->cop_stash;
- if (!hv)
+ if (!stashname)
PUSHs(&PL_sv_undef);
else
- PUSHs(sv_2mortal(newSVpv(HvNAME(hv), 0)));
- PUSHs(sv_2mortal(newSVpv(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
- PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
+ PUSHs(sv_2mortal(newSVpv(stashname, 0)));
+ PUSHs(sv_2mortal(newSVpv(CopFILE(cx->blk_oldcop), 0)));
+ PUSHs(sv_2mortal(newSViv((I32)CopLINE(cx->blk_oldcop))));
if (!MAXARG)
RETURN;
- if (CxTYPE(cx) == CXt_SUB) { /* So is ccstack[dbcxix]. */
+ if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
+ /* So is ccstack[dbcxix]. */
sv = NEWSV(49, 0);
gv_efullname3(sv, CvGV(ccstack[cxix].blk_sub.cv), Nullch);
PUSHs(sv_2mortal(sv));
PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
}
else {
- PUSHs(sv_2mortal(newSVpv("(eval)",0)));
+ PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
PUSHs(sv_2mortal(newSViv(0)));
}
gimme = (I32)cx->blk_gimme;
@@ -1331,16 +1524,19 @@ PP(pp_caller)
if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
PUSHs(cx->blk_eval.cur_text);
PUSHs(&PL_sv_no);
- }
- else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
- /* Require, put the name. */
- PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
+ }
+ /* try blocks have old_namesv == 0 */
+ else if (cx->blk_eval.old_namesv) {
+ PUSHs(sv_2mortal(newSVsv(cx->blk_eval.old_namesv)));
PUSHs(&PL_sv_yes);
}
}
- else if (CxTYPE(cx) == CXt_SUB &&
- cx->blk_sub.hasargs &&
- PL_curcop->cop_stash == PL_debstash)
+ else {
+ PUSHs(&PL_sv_undef);
+ PUSHs(&PL_sv_undef);
+ }
+ if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs
+ && CopSTASH_eq(PL_curcop, PL_debstash))
{
AV *ary = cx->blk_sub.argarray;
int off = AvARRAY(ary) - AvALLOC(ary);
@@ -1358,31 +1554,23 @@ PP(pp_caller)
Copy(AvALLOC(ary), AvARRAY(PL_dbargs), AvFILLp(ary) + 1 + off, SV*);
AvFILLp(PL_dbargs) = AvFILLp(ary) + off;
}
- RETURN;
-}
-
-STATIC I32
-sortcv(SV *a, SV *b)
-{
- dTHR;
- I32 oldsaveix = PL_savestack_ix;
- I32 oldscopeix = PL_scopestack_ix;
- I32 result;
- GvSV(PL_firstgv) = a;
- GvSV(PL_secondgv) = b;
- PL_stack_sp = PL_stack_base;
- PL_op = PL_sortcop;
- CALLRUNOPS();
- if (PL_stack_sp != PL_stack_base + 1)
- croak("Sort subroutine didn't return single value");
- if (!SvNIOKp(*PL_stack_sp))
- croak("Sort subroutine didn't return a numeric value");
- result = SvIV(*PL_stack_sp);
- while (PL_scopestack_ix > oldscopeix) {
- LEAVE;
+ /* XXX only hints propagated via op_private are currently
+ * visible (others are not easily accessible, since they
+ * use the global PL_hints) */
+ PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->op_private &
+ HINT_PRIVATE_MASK)));
+ {
+ SV * mask ;
+ SV * old_warnings = cx->blk_oldcop->cop_warnings ;
+ if (old_warnings == pWARN_NONE || old_warnings == pWARN_STD)
+ mask = newSVpvn(WARN_NONEstring, WARNsize) ;
+ else if (old_warnings == pWARN_ALL)
+ mask = newSVpvn(WARN_ALLstring, WARNsize) ;
+ else
+ mask = newSVsv(old_warnings);
+ PUSHs(sv_2mortal(mask));
}
- leave_scope(oldsaveix);
- return result;
+ RETURN;
}
PP(pp_reset)
@@ -1395,7 +1583,7 @@ PP(pp_reset)
tmps = "";
else
tmps = POPpx;
- sv_reset(tmps, PL_curcop->cop_stash);
+ sv_reset(tmps, CopSTASH(PL_curcop));
PUSHs(&PL_sv_yes);
RETURN;
}
@@ -1424,7 +1612,7 @@ PP(pp_dbstate)
gv = PL_DBgv;
cv = GvCV(gv);
if (!cv)
- DIE("No DB::DB routine defined");
+ DIE(aTHX_ "No DB::DB routine defined");
if (CvDEPTH(cv) >= 1 && !(PL_debug & (1<<30))) /* don't do recursive DB::DB call */
return NORMAL;
@@ -1443,7 +1631,7 @@ PP(pp_dbstate)
PUSHSUB(cx);
CvDEPTH(cv)++;
(void)SvREFCNT_inc(cv);
- SAVESPTR(PL_curpad);
+ SAVEVPTR(PL_curpad);
PL_curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
RETURNOP(CvSTART(cv));
}
@@ -1462,6 +1650,10 @@ PP(pp_enteriter)
register PERL_CONTEXT *cx;
I32 gimme = GIMME_V;
SV **svp;
+ U32 cxtype = CXt_LOOP;
+#ifdef USE_ITHREADS
+ void *iterdata;
+#endif
ENTER;
SAVETMPS;
@@ -1478,26 +1670,42 @@ PP(pp_enteriter)
if (PL_op->op_targ) {
svp = &PL_curpad[PL_op->op_targ]; /* "my" variable */
SAVESPTR(*svp);
+#ifdef USE_ITHREADS
+ iterdata = (void*)PL_op->op_targ;
+ cxtype |= CXp_PADVAR;
+#endif
}
else {
- svp = &GvSV((GV*)POPs); /* symbol table variable */
+ GV *gv = (GV*)POPs;
+ svp = &GvSV(gv); /* symbol table variable */
SAVEGENERICSV(*svp);
*svp = NEWSV(0,0);
+#ifdef USE_ITHREADS
+ iterdata = (void*)gv;
+#endif
}
ENTER;
- PUSHBLOCK(cx, CXt_LOOP, SP);
+ PUSHBLOCK(cx, cxtype, SP);
+#ifdef USE_ITHREADS
+ PUSHLOOP(cx, iterdata, MARK);
+#else
PUSHLOOP(cx, svp, MARK);
+#endif
if (PL_op->op_flags & OPf_STACKED) {
cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
if (SvTYPE(cx->blk_loop.iterary) != SVt_PVAV) {
dPOPss;
if (SvNIOKp(sv) || !SvPOKp(sv) ||
- (looks_like_number(sv) && *SvPVX(sv) != '0')) {
+ SvNIOKp(cx->blk_loop.iterary) || !SvPOKp(cx->blk_loop.iterary) ||
+ (looks_like_number(sv) && *SvPVX(sv) != '0' &&
+ looks_like_number((SV*)cx->blk_loop.iterary) &&
+ *SvPVX(cx->blk_loop.iterary) != '0'))
+ {
if (SvNV(sv) < IV_MIN ||
SvNV((SV*)cx->blk_loop.iterary) >= IV_MAX)
- croak("Range iterator outside integer range");
+ DIE(aTHX_ "Range iterator outside integer range");
cx->blk_loop.iterix = SvIV(sv);
cx->blk_loop.itermax = SvIV((SV*)cx->blk_loop.iterary);
}
@@ -1534,7 +1742,6 @@ PP(pp_leaveloop)
{
djSP;
register PERL_CONTEXT *cx;
- struct block_loop cxloop;
I32 gimme;
SV **newsp;
PMOP *newpm;
@@ -1542,7 +1749,7 @@ PP(pp_leaveloop)
POPBLOCK(cx,newpm);
mark = newsp;
- POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
+ newsp = PL_stack_base + cx->blk_loop.resetsp;
TAINT_NOT;
if (gimme == G_VOID)
@@ -1562,7 +1769,7 @@ PP(pp_leaveloop)
SP = newsp;
PUTBACK;
- POPLOOP2(); /* Stack values are safe: release loop vars ... */
+ POPLOOP(cx); /* Stack values are safe: release loop vars ... */
PL_curpm = newpm; /* ... and pop $1 et al */
LEAVE;
@@ -1576,15 +1783,18 @@ PP(pp_return)
djSP; dMARK;
I32 cxix;
register PERL_CONTEXT *cx;
- struct block_sub cxsub;
bool popsub2 = FALSE;
+ bool clear_errsv = FALSE;
I32 gimme;
SV **newsp;
PMOP *newpm;
I32 optype = 0;
+ SV *sv;
if (PL_curstackinfo->si_type == PERLSI_SORT) {
- if (cxstack_ix == PL_sortcxix || dopoptosub(cxstack_ix) <= PL_sortcxix) {
+ if (cxstack_ix == PL_sortcxix
+ || dopoptosub(cxstack_ix) <= PL_sortcxix)
+ {
if (cxstack_ix > PL_sortcxix)
dounwind(PL_sortcxix);
AvARRAY(PL_curstack)[1] = *SP;
@@ -1595,49 +1805,64 @@ PP(pp_return)
cxix = dopoptosub(cxstack_ix);
if (cxix < 0)
- DIE("Can't return outside a subroutine");
+ DIE(aTHX_ "Can't return outside a subroutine");
if (cxix < cxstack_ix)
dounwind(cxix);
POPBLOCK(cx,newpm);
switch (CxTYPE(cx)) {
case CXt_SUB:
- POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
popsub2 = TRUE;
break;
case CXt_EVAL:
+ if (!(PL_in_eval & EVAL_KEEPERR))
+ clear_errsv = TRUE;
POPEVAL(cx);
+ if (CxTRYBLOCK(cx))
+ break;
+ if (AvFILLp(PL_comppad_name) >= 0)
+ free_closures();
+ lex_end();
if (optype == OP_REQUIRE &&
(MARK == SP || (gimme == G_SCALAR && !SvTRUE(*SP))) )
{
/* Unassume the success we assumed earlier. */
- char *name = cx->blk_eval.old_name;
- (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
- DIE("%s did not return a true value", name);
+ SV *nsv = cx->blk_eval.old_namesv;
+ (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
+ DIE(aTHX_ "%s did not return a true value", SvPVX(nsv));
}
break;
+ case CXt_FORMAT:
+ POPFORMAT(cx);
+ break;
default:
- DIE("panic: return");
+ DIE(aTHX_ "panic: return");
}
TAINT_NOT;
if (gimme == G_SCALAR) {
if (MARK < SP) {
if (popsub2) {
- if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) {
+ if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
if (SvTEMP(TOPs)) {
*++newsp = SvREFCNT_inc(*SP);
FREETMPS;
sv_2mortal(*newsp);
- } else {
+ }
+ else {
+ sv = SvREFCNT_inc(*SP); /* FREETMPS could clobber it */
FREETMPS;
- *++newsp = sv_mortalcopy(*SP);
+ *++newsp = sv_mortalcopy(sv);
+ SvREFCNT_dec(sv);
}
- } else
+ }
+ else
*++newsp = (SvTEMP(*SP)) ? *SP : sv_mortalcopy(*SP);
- } else
+ }
+ else
*++newsp = sv_mortalcopy(*SP);
- } else
+ }
+ else
*++newsp = &PL_sv_undef;
}
else if (gimme == G_ARRAY) {
@@ -1651,11 +1876,16 @@ PP(pp_return)
/* Stack values are safe: */
if (popsub2) {
- POPSUB2(); /* release CV and @_ ... */
+ POPSUB(cx,sv); /* release CV and @_ ... */
}
+ else
+ sv = Nullsv;
PL_curpm = newpm; /* ... and pop $1 et al */
LEAVE;
+ LEAVESUB(sv);
+ if (clear_errsv)
+ sv_setpv(ERRSV,"");
return pop_return();
}
@@ -1664,38 +1894,37 @@ PP(pp_last)
djSP;
I32 cxix;
register PERL_CONTEXT *cx;
- struct block_loop cxloop;
- struct block_sub cxsub;
I32 pop2 = 0;
I32 gimme;
I32 optype;
OP *nextop;
SV **newsp;
PMOP *newpm;
- SV **mark = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
+ SV **mark;
+ SV *sv = Nullsv;
if (PL_op->op_flags & OPf_SPECIAL) {
cxix = dopoptoloop(cxstack_ix);
if (cxix < 0)
- DIE("Can't \"last\" outside a block");
+ DIE(aTHX_ "Can't \"last\" outside a loop block");
}
else {
cxix = dopoptolabel(cPVOP->op_pv);
if (cxix < 0)
- DIE("Label not found for \"last %s\"", cPVOP->op_pv);
+ DIE(aTHX_ "Label not found for \"last %s\"", cPVOP->op_pv);
}
if (cxix < cxstack_ix)
dounwind(cxix);
POPBLOCK(cx,newpm);
+ mark = newsp;
switch (CxTYPE(cx)) {
case CXt_LOOP:
- POPLOOP1(cx); /* Delay POPLOOP2 until stack values are safe */
pop2 = CXt_LOOP;
- nextop = cxloop.last_op->op_next;
+ newsp = PL_stack_base + cx->blk_loop.resetsp;
+ nextop = cx->blk_loop.last_op->op_next;
break;
case CXt_SUB:
- POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
pop2 = CXt_SUB;
nextop = pop_return();
break;
@@ -1703,8 +1932,12 @@ PP(pp_last)
POPEVAL(cx);
nextop = pop_return();
break;
+ case CXt_FORMAT:
+ POPFORMAT(cx);
+ nextop = pop_return();
+ break;
default:
- DIE("panic: last");
+ DIE(aTHX_ "panic: last");
}
TAINT_NOT;
@@ -1728,16 +1961,17 @@ PP(pp_last)
/* Stack values are safe: */
switch (pop2) {
case CXt_LOOP:
- POPLOOP2(); /* release loop vars ... */
+ POPLOOP(cx); /* release loop vars ... */
LEAVE;
break;
case CXt_SUB:
- POPSUB2(); /* release CV and @_ ... */
+ POPSUB(cx,sv); /* release CV and @_ ... */
break;
}
PL_curpm = newpm; /* ... and pop $1 et al */
LEAVE;
+ LEAVESUB(sv);
return nextop;
}
@@ -1750,19 +1984,23 @@ PP(pp_next)
if (PL_op->op_flags & OPf_SPECIAL) {
cxix = dopoptoloop(cxstack_ix);
if (cxix < 0)
- DIE("Can't \"next\" outside a block");
+ DIE(aTHX_ "Can't \"next\" outside a loop block");
}
else {
cxix = dopoptolabel(cPVOP->op_pv);
if (cxix < 0)
- DIE("Label not found for \"next %s\"", cPVOP->op_pv);
+ DIE(aTHX_ "Label not found for \"next %s\"", cPVOP->op_pv);
}
if (cxix < cxstack_ix)
dounwind(cxix);
TOPBLOCK(cx);
- oldsave = PL_scopestack[PL_scopestack_ix - 1];
- LEAVE_SCOPE(oldsave);
+
+ /* clean scope, but only if there's no continue block */
+ if (!(cx->blk_loop.last_op->op_private & OPpLOOP_CONTINUE)) {
+ oldsave = PL_scopestack[PL_scopestack_ix - 1];
+ LEAVE_SCOPE(oldsave);
+ }
return cx->blk_loop.next_op;
}
@@ -1775,12 +2013,12 @@ PP(pp_redo)
if (PL_op->op_flags & OPf_SPECIAL) {
cxix = dopoptoloop(cxstack_ix);
if (cxix < 0)
- DIE("Can't \"redo\" outside a block");
+ DIE(aTHX_ "Can't \"redo\" outside a loop block");
}
else {
cxix = dopoptolabel(cPVOP->op_pv);
if (cxix < 0)
- DIE("Label not found for \"redo %s\"", cPVOP->op_pv);
+ DIE(aTHX_ "Label not found for \"redo %s\"", cPVOP->op_pv);
}
if (cxix < cxstack_ix)
dounwind(cxix);
@@ -1792,14 +2030,14 @@ PP(pp_redo)
}
STATIC OP *
-dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
+S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit)
{
OP *kid;
OP **ops = opstack;
static char too_deep[] = "Target of goto is too deeply nested";
if (ops >= oplimit)
- croak(too_deep);
+ Perl_croak(aTHX_ too_deep);
if (o->op_type == OP_LEAVE ||
o->op_type == OP_SCOPE ||
o->op_type == OP_LEAVELOOP ||
@@ -1807,7 +2045,7 @@ dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
{
*ops++ = cUNOPo->op_first;
if (ops >= oplimit)
- croak(too_deep);
+ Perl_croak(aTHX_ too_deep);
}
*ops = 0;
if (o->op_flags & OPf_KIDS) {
@@ -1826,7 +2064,7 @@ dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
(ops[-1]->op_type != OP_NEXTSTATE &&
ops[-1]->op_type != OP_DBSTATE)))
*ops++ = kid;
- if (o = dofindlabel(kid, label, ops, oplimit))
+ if ((o = dofindlabel(kid, label, ops, oplimit)))
return o;
}
}
@@ -1836,7 +2074,7 @@ dofindlabel(OP *o, char *label, OP **opstack, OP **oplimit)
PP(pp_dump)
{
- return pp_goto(ARGS);
+ return pp_goto();
/*NOTREACHED*/
}
@@ -1850,6 +2088,7 @@ PP(pp_goto)
OP *enterops[GOTO_DEPTH];
char *label;
int do_dump = (PL_op->op_type == OP_DUMP);
+ static char must_have_label[] = "goto must have label";
label = 0;
if (PL_op->op_flags & OPf_STACKED) {
@@ -1864,7 +2103,6 @@ PP(pp_goto)
SV** mark;
I32 items = 0;
I32 oldsave;
- int arg_was_real = 0;
retry:
if (!CvROOT(cv) && !CvXSUB(cv)) {
@@ -1881,23 +2119,23 @@ PP(pp_goto)
goto retry;
tmpstr = sv_newmortal();
gv_efullname3(tmpstr, gv, Nullch);
- DIE("Goto undefined subroutine &%s",SvPVX(tmpstr));
+ DIE(aTHX_ "Goto undefined subroutine &%s",SvPVX(tmpstr));
}
- DIE("Goto undefined subroutine");
+ DIE(aTHX_ "Goto undefined subroutine");
}
/* First do some returnish stuff. */
cxix = dopoptosub(cxstack_ix);
if (cxix < 0)
- DIE("Can't goto subroutine outside a subroutine");
+ DIE(aTHX_ "Can't goto subroutine outside a subroutine");
if (cxix < cxstack_ix)
dounwind(cxix);
TOPBLOCK(cx);
if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_ENTEREVAL)
- DIE("Can't goto subroutine from an eval-string");
+ DIE(aTHX_ "Can't goto subroutine from an eval-string");
mark = PL_stack_sp;
- if (CxTYPE(cx) == CXt_SUB &&
- cx->blk_sub.hasargs) { /* put @_ back onto stack */
+ if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) {
+ /* put @_ back onto stack */
AV* av = cx->blk_sub.argarray;
items = AvFILLp(av) + 1;
@@ -1909,15 +2147,17 @@ PP(pp_goto)
SvREFCNT_dec(GvAV(PL_defgv));
GvAV(PL_defgv) = cx->blk_sub.savearray;
#endif /* USE_THREADS */
+ /* abandon @_ if it got reified */
if (AvREAL(av)) {
- arg_was_real = 1;
- AvREAL_off(av); /* so av_clear() won't clobber elts */
+ (void)sv_2mortal((SV*)av); /* delay until return */
+ av = newAV();
+ av_extend(av, items-1);
+ AvFLAGS(av) = AVf_REIFY;
+ PL_curpad[0] = (SV*)(cx->blk_sub.argarray = av);
}
- av_clear(av);
}
else if (CvXSUB(cv)) { /* put GvAV(defgv) back onto stack */
AV* av;
- int i;
#ifdef USE_THREADS
av = (AV*)PL_curpad[0];
#else
@@ -1938,26 +2178,29 @@ PP(pp_goto)
/* Now do some callish stuff. */
SAVETMPS;
if (CvXSUB(cv)) {
+#ifdef PERL_XSUB_OLDSTYLE
if (CvOLDSTYLE(cv)) {
- I32 (*fp3)_((int,int,int));
+ I32 (*fp3)(int,int,int);
while (SP > mark) {
SP[1] = SP[0];
SP--;
}
- fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
+ fp3 = (I32(*)(int,int,int))CvXSUB(cv);
items = (*fp3)(CvXSUBANY(cv).any_i32,
mark - PL_stack_base + 1,
items);
SP = PL_stack_base + items;
}
- else {
+ else
+#endif /* PERL_XSUB_OLDSTYLE */
+ {
SV **newsp;
I32 gimme;
PL_stack_sp--; /* There is no cv arg. */
/* Push a mark for the start of arglist */
PUSHMARK(mark);
- (void)(*CvXSUB(cv))(cv _PERL_OBJECT_THIS);
+ (void)(*CvXSUB(cv))(aTHXo_ cv);
/* Pop the current context like a decent sub should */
POPBLOCK(cx, PL_curpm);
/* Do _not_ use PUTBACK, keep the XSUB's return stack! */
@@ -1980,15 +2223,16 @@ PP(pp_goto)
if (CvDEPTH(cv) < 2)
(void)SvREFCNT_inc(cv);
else { /* save temporaries on recursion? */
- if (CvDEPTH(cv) == 100 && PL_dowarn)
+ if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION))
sub_crush_depth(cv);
if (CvDEPTH(cv) > AvFILLp(padlist)) {
AV *newpad = newAV();
SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
I32 ix = AvFILLp((AV*)svp[1]);
+ I32 names_fill = AvFILLp((AV*)svp[0]);
svp = AvARRAY(svp[0]);
for ( ;ix > 0; ix--) {
- if (svp[ix] != &PL_sv_undef) {
+ if (names_fill >= ix && svp[ix] != &PL_sv_undef) {
char *name = SvPVX(svp[ix]);
if ((SvFLAGS(svp[ix]) & SVf_FAKE)
|| *name == '&')
@@ -2007,6 +2251,9 @@ PP(pp_goto)
SvPADMY_on(sv);
}
}
+ else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
+ av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix]));
+ }
else {
av_store(newpad, ix, sv = NEWSV(0,0));
SvPADTMP_on(sv);
@@ -2037,7 +2284,7 @@ PP(pp_goto)
}
}
#endif /* USE_THREADS */
- SAVESPTR(PL_curpad);
+ SAVEVPTR(PL_curpad);
PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
#ifndef USE_THREADS
if (cx->blk_sub.hasargs)
@@ -2068,11 +2315,7 @@ PP(pp_goto)
}
Copy(mark,AvARRAY(av),items,SV*);
AvFILLp(av) = items - 1;
- /* preserve @_ nature */
- if (arg_was_real) {
- AvREIFY_off(av);
- AvREAL_on(av);
- }
+ assert(!AvREAL(av));
while (items--) {
if (*mark)
SvTEMP_off(*mark);
@@ -2088,27 +2331,30 @@ PP(pp_goto)
CV *gotocv;
if (PERLDB_SUB_NN) {
- SvIVX(sv) = (IV)cv; /* Already upgraded, saved */
+ SvIVX(sv) = PTR2IV(cv); /* Already upgraded, saved */
} else {
save_item(sv);
gv_efullname3(sv, CvGV(cv), Nullch);
}
if ( PERLDB_GOTO
- && (gotocv = perl_get_cv("DB::goto", FALSE)) ) {
+ && (gotocv = get_cv("DB::goto", FALSE)) ) {
PUSHMARK( PL_stack_sp );
- perl_call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
+ call_sv((SV*)gotocv, G_SCALAR | G_NODEBUG);
PL_stack_sp--;
}
}
RETURNOP(CvSTART(cv));
}
}
- else
+ else {
label = SvPV(sv,n_a);
+ if (!(do_dump || *label))
+ DIE(aTHX_ must_have_label);
+ }
}
else if (PL_op->op_flags & OPf_SPECIAL) {
if (! do_dump)
- DIE("goto must have label");
+ DIE(aTHX_ must_have_label);
}
else
label = cPVOP->op_pv;
@@ -2143,22 +2389,25 @@ PP(pp_goto)
break;
}
/* FALL THROUGH */
+ case CXt_FORMAT:
case CXt_NULL:
- DIE("Can't \"goto\" outside a block");
+ DIE(aTHX_ "Can't \"goto\" out of a pseudo block");
default:
if (ix)
- DIE("panic: goto");
+ DIE(aTHX_ "panic: goto");
gotoprobe = PL_main_root;
break;
}
- retop = dofindlabel(gotoprobe, label,
- enterops, enterops + GOTO_DEPTH);
- if (retop)
- break;
+ if (gotoprobe) {
+ retop = dofindlabel(gotoprobe, label,
+ enterops, enterops + GOTO_DEPTH);
+ if (retop)
+ break;
+ }
PL_lastgotoprobe = gotoprobe;
}
if (!retop)
- DIE("Can't find label %s", label);
+ DIE(aTHX_ "Can't find label %s", label);
/* pop unwanted frames */
@@ -2182,9 +2431,8 @@ PP(pp_goto)
/* Eventually we may want to stack the needed arguments
* for each op. For now, we punt on the hard ones. */
if (PL_op->op_type == OP_ENTERITER)
- DIE("Can't \"goto\" into the middle of a foreach loop",
- label);
- (CALLOP->op_ppaddr)(ARGS);
+ DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loop");
+ CALL_FPTR(PL_op->op_ppaddr)(aTHX);
}
PL_op = oldop;
}
@@ -2215,11 +2463,12 @@ PP(pp_exit)
anum = 0;
else {
anum = SvIVx(POPs);
-#ifdef VMSISH_EXIT
- if (anum == 1 && VMSISH_EXIT)
+#ifdef VMS
+ if (anum == 1 && (PL_op->op_private & OPpEXIT_VMSISH))
anum = 0;
#endif
}
+ PL_exit_flags |= PERL_EXIT_EXPECTED;
my_exit(anum);
PUSHs(&PL_sv_undef);
RETURN;
@@ -2229,11 +2478,11 @@ PP(pp_exit)
PP(pp_nswitch)
{
djSP;
- double value = SvNVx(GvSV(cCOP->cop_gv));
+ NV value = SvNVx(GvSV(cCOP->cop_gv));
register I32 match = I_32(value);
if (value < 0.0) {
- if (((double)match) > value)
+ if (((NV)match) > value)
--match; /* was fractional--truncate other way */
}
match -= cCOP->uop.scop.scop_offset;
@@ -2269,7 +2518,7 @@ PP(pp_cswitch)
/* Eval. */
STATIC void
-save_lines(AV *array, SV *sv)
+S_save_lines(pTHX_ AV *array, SV *sv)
{
register char *s = SvPVX(sv);
register char *send = SvPVX(sv) + SvCUR(sv);
@@ -2292,36 +2541,59 @@ save_lines(AV *array, SV *sv)
}
}
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+STATIC void *
+S_docatch_body(pTHX_ va_list args)
+{
+ return docatch_body();
+}
+#endif
+
+STATIC void *
+S_docatch_body(pTHX)
+{
+ CALLRUNOPS(aTHX);
+ return NULL;
+}
+
STATIC OP *
-docatch(OP *o)
+S_docatch(pTHX_ OP *o)
{
dTHR;
int ret;
OP *oldop = PL_op;
+ volatile PERL_SI *cursi = PL_curstackinfo;
dJMPENV;
- PL_op = o;
#ifdef DEBUGGING
assert(CATCH_GET == TRUE);
- DEBUG_l(deb("Setting up local jumplevel %p, was %p\n", &cur_env, PL_top_env));
#endif
+ PL_op = o;
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_docatch_body));
+#else
JMPENV_PUSH(ret);
+#endif
switch (ret) {
- default: /* topmost level handles it */
-pass_the_buck:
+ case 0:
+#ifndef PERL_FLEXIBLE_EXCEPTIONS
+ redo_body:
+ docatch_body();
+#endif
+ break;
+ case 3:
+ if (PL_restartop && cursi == PL_curstackinfo) {
+ PL_op = PL_restartop;
+ PL_restartop = 0;
+ goto redo_body;
+ }
+ /* FALL THROUGH */
+ default:
JMPENV_POP;
PL_op = oldop;
JMPENV_JUMP(ret);
/* NOTREACHED */
- case 3:
- if (!PL_restartop)
- goto pass_the_buck;
- PL_op = PL_restartop;
- PL_restartop = 0;
- /* FALL THROUGH */
- case 0:
- CALLRUNOPS();
- break;
}
JMPENV_POP;
PL_op = oldop;
@@ -2329,7 +2601,7 @@ pass_the_buck:
}
OP *
-sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
+Perl_sv_compile_2op(pTHX_ SV *sv, OP** startop, char *code, AV** avp)
/* sv Text to convert to OP tree. */
/* startop op_free() this to undo. */
/* code Short string id of the caller. */
@@ -2340,8 +2612,9 @@ sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
I32 gimme = 0; /* SUSPECT - INITIALZE TO WHAT? NI-S */
I32 optype;
OP dummy;
- OP *oop = PL_op, *rop;
- char tmpbuf[TYPE_DIGITS(long) + 12 + 10];
+ OP *rop;
+ char tbuf[TYPE_DIGITS(long) + 12 + 10];
+ char *tmpbuf = tbuf;
char *safestr;
ENTER;
@@ -2350,14 +2623,22 @@ sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
/* switch to eval mode */
if (PL_curcop == &PL_compiling) {
- SAVESPTR(PL_compiling.cop_stash);
- PL_compiling.cop_stash = PL_curstash;
- }
- SAVESPTR(PL_compiling.cop_filegv);
- SAVEI16(PL_compiling.cop_line);
- sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
- PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
- PL_compiling.cop_line = 1;
+ SAVECOPSTASH(&PL_compiling);
+ CopSTASH_set(&PL_compiling, PL_curstash);
+ }
+ SAVECOPFILE(&PL_compiling);
+ SAVECOPLINE(&PL_compiling);
+ if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
+ SV *sv = sv_newmortal();
+ Perl_sv_setpvf(aTHX_ sv, "_<(%.10seval %lu)[%s:%"IVdf"]",
+ code, (unsigned long)++PL_evalseq,
+ CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
+ tmpbuf = SvPVX(sv);
+ }
+ else
+ sprintf(tmpbuf, "_<(%.10s_eval %lu)", code, (unsigned long)++PL_evalseq);
+ CopFILE_set(&PL_compiling, tmpbuf+2);
+ CopLINE_set(&PL_compiling, 1);
/* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
deleting the eval's FILEGV from the stash before gv_check() runs
(i.e. before run-time proper). To work around the coredump that
@@ -2369,24 +2650,26 @@ sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
#ifdef OP_IN_REGISTER
PL_opsave = op;
#else
- SAVEPPTR(PL_op);
+ SAVEVPTR(PL_op);
#endif
PL_hints = 0;
PL_op = &dummy;
- PL_op->op_type = 0; /* Avoid uninit warning. */
+ PL_op->op_type = OP_ENTEREVAL;
PL_op->op_flags = 0; /* Avoid uninit warning. */
PUSHBLOCK(cx, CXt_EVAL, SP);
- PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
+ PUSHEVAL(cx, 0, Nullgv);
rop = doeval(G_SCALAR, startop);
POPBLOCK(cx,PL_curpm);
POPEVAL(cx);
(*startop)->op_type = OP_NULL;
- (*startop)->op_ppaddr = ppaddr[OP_NULL];
+ (*startop)->op_ppaddr = PL_ppaddr[OP_NULL];
lex_end();
*avp = (AV*)SvREFCNT_inc(PL_comppad);
LEAVE;
+ if (PL_curcop == &PL_compiling)
+ PL_compiling.op_private = PL_hints;
#ifdef OP_IN_REGISTER
op = PL_opsave;
#endif
@@ -2395,23 +2678,22 @@ sv_compile_2op(SV *sv, OP** startop, char *code, AV** avp)
/* With USE_THREADS, eval_owner must be held on entry to doeval */
STATIC OP *
-doeval(int gimme, OP** startop)
+S_doeval(pTHX_ int gimme, OP** startop)
{
dSP;
OP *saveop = PL_op;
- HV *newstash;
CV *caller;
AV* comppadlist;
I32 i;
- PL_in_eval = 1;
+ PL_in_eval = EVAL_INEVAL;
PUSHMARK(SP);
/* set up a scratch pad */
SAVEI32(PL_padix);
- SAVESPTR(PL_curpad);
+ SAVEVPTR(PL_curpad);
SAVESPTR(PL_comppad);
SAVESPTR(PL_comppad_name);
SAVEI32(PL_comppad_name_fill);
@@ -2423,7 +2705,7 @@ doeval(int gimme, OP** startop)
PERL_CONTEXT *cx = &cxstack[i];
if (CxTYPE(cx) == CXt_EVAL)
break;
- else if (CxTYPE(cx) == CXt_SUB) {
+ else if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) {
caller = cx->blk_sub.cv;
break;
}
@@ -2447,7 +2729,7 @@ doeval(int gimme, OP** startop)
PL_min_intro_pending = 0;
PL_padix = 0;
#ifdef USE_THREADS
- av_store(PL_comppad_name, 0, newSVpv("@_", 2));
+ av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
PL_curpad[0] = (SV*)newAV();
SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
#endif /* USE_THREADS */
@@ -2458,17 +2740,19 @@ doeval(int gimme, OP** startop)
av_store(comppadlist, 1, (SV*)PL_comppad);
CvPADLIST(PL_compcv) = comppadlist;
- if (!saveop || saveop->op_type != OP_REQUIRE)
+ if (!saveop ||
+ (saveop->op_type != OP_REQUIRE && saveop->op_type != OP_DOFILE))
+ {
CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(caller);
+ }
SAVEFREESV(PL_compcv);
/* make sure we compile in the right package */
- newstash = PL_curcop->cop_stash;
- if (PL_curstash != newstash) {
+ if (CopSTASH_ne(PL_curcop, PL_curstash)) {
SAVESPTR(PL_curstash);
- PL_curstash = newstash;
+ PL_curstash = CopSTASH(PL_curcop);
}
SAVESPTR(PL_beginav);
PL_beginav = newAV();
@@ -2481,9 +2765,9 @@ doeval(int gimme, OP** startop)
PL_curcop = &PL_compiling;
PL_curcop->cop_arybase = 0;
SvREFCNT_dec(PL_rs);
- PL_rs = newSVpv("\n", 1);
+ PL_rs = newSVpvn("\n", 1);
if (saveop && saveop->op_flags & OPf_SPECIAL)
- PL_in_eval |= 4;
+ PL_in_eval |= EVAL_KEEPERR;
else
sv_setpv(ERRSV,"");
if (yyparse() || PL_error_count || !PL_eval_root) {
@@ -2492,7 +2776,7 @@ doeval(int gimme, OP** startop)
PERL_CONTEXT *cx;
I32 optype = 0; /* Might be reset by POPEVAL. */
STRLEN n_a;
-
+
PL_op = saveop;
if (PL_eval_root) {
op_free(PL_eval_root);
@@ -2508,13 +2792,16 @@ doeval(int gimme, OP** startop)
LEAVE;
if (optype == OP_REQUIRE) {
char* msg = SvPVx(ERRSV, n_a);
- DIE("%s", *msg ? msg : "Compilation failed in require");
- } else if (startop) {
+ DIE(aTHX_ "%sCompilation failed in require",
+ *msg ? msg : "Unknown error\n");
+ }
+ else if (startop) {
char* msg = SvPVx(ERRSV, n_a);
POPBLOCK(cx,PL_curpm);
POPEVAL(cx);
- croak("%sCompilation failed in regexp", (*msg ? msg : "Unknown error\n"));
+ Perl_croak(aTHX_ "%sCompilation failed in regexp",
+ (*msg ? msg : "Unknown error\n"));
}
SvREFCNT_dec(PL_rs);
PL_rs = SvREFCNT_inc(PL_nrs);
@@ -2528,7 +2815,7 @@ doeval(int gimme, OP** startop)
}
SvREFCNT_dec(PL_rs);
PL_rs = SvREFCNT_inc(PL_nrs);
- PL_compiling.cop_line = 0;
+ CopLINE_set(&PL_compiling, 0);
if (startop) {
*startop = PL_eval_root;
SvREFCNT_dec(CvOUTSIDE(PL_compcv));
@@ -2546,13 +2833,13 @@ doeval(int gimme, OP** startop)
/* Register with debugger: */
if (PERLDB_INTER && saveop->op_type == OP_REQUIRE) {
- CV *cv = perl_get_cv("DB::postponed", FALSE);
+ CV *cv = get_cv("DB::postponed", FALSE);
if (cv) {
dSP;
PUSHMARK(SP);
- XPUSHs((SV*)PL_compiling.cop_filegv);
+ XPUSHs((SV*)CopFILEGV(&PL_compiling));
PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ call_sv((SV*)cv, G_DISCARD);
}
}
@@ -2571,6 +2858,38 @@ doeval(int gimme, OP** startop)
RETURNOP(PL_eval_start);
}
+STATIC PerlIO *
+S_doopen_pmc(pTHX_ const char *name, const char *mode)
+{
+ STRLEN namelen = strlen(name);
+ PerlIO *fp;
+
+ if (namelen > 3 && strEQ(name + namelen - 3, ".pm")) {
+ SV *pmcsv = Perl_newSVpvf(aTHX_ "%s%c", name, 'c');
+ char *pmc = SvPV_nolen(pmcsv);
+ Stat_t pmstat;
+ Stat_t pmcstat;
+ if (PerlLIO_stat(pmc, &pmcstat) < 0) {
+ fp = PerlIO_open(name, mode);
+ }
+ else {
+ if (PerlLIO_stat(name, &pmstat) < 0 ||
+ pmstat.st_mtime < pmcstat.st_mtime)
+ {
+ fp = PerlIO_open(pmc, mode);
+ }
+ else {
+ fp = PerlIO_open(name, mode);
+ }
+ }
+ SvREFCNT_dec(pmcsv);
+ }
+ else {
+ fp = PerlIO_open(name, mode);
+ }
+ return fp;
+}
+
PP(pp_require)
{
djSP;
@@ -2584,18 +2903,78 @@ PP(pp_require)
I32 gimme = G_SCALAR;
PerlIO *tryrsfp = 0;
STRLEN n_a;
+ int filter_has_file = 0;
+ GV *filter_child_proc = 0;
+ SV *filter_state = 0;
+ SV *filter_sub = 0;
sv = POPs;
- if (SvNIOKp(sv) && !SvPOKp(sv)) {
- SET_NUMERIC_STANDARD();
- if (atof(PL_patchlevel) + 0.00000999 < SvNV(sv))
- DIE("Perl %s required--this is only version %s, stopped",
- SvPV(sv,n_a),PL_patchlevel);
+ if (SvNIOKp(sv)) {
+ UV rev, ver, sver;
+ if (SvPOKp(sv)) { /* require v5.6.1 */
+ I32 len;
+ U8 *s = (U8*)SvPVX(sv);
+ U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
+ if (s < end) {
+ rev = utf8_to_uv(s, &len);
+ s += len;
+ if (s < end) {
+ ver = utf8_to_uv(s, &len);
+ s += len;
+ if (s < end)
+ sver = utf8_to_uv(s, &len);
+ else
+ sver = 0;
+ }
+ else
+ ver = 0;
+ }
+ else
+ rev = 0;
+ if (PERL_REVISION < rev
+ || (PERL_REVISION == rev
+ && (PERL_VERSION < ver
+ || (PERL_VERSION == ver
+ && PERL_SUBVERSION < sver))))
+ {
+ DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--this is only "
+ "v%d.%d.%d, stopped", rev, ver, sver, PERL_REVISION,
+ PERL_VERSION, PERL_SUBVERSION);
+ }
+ }
+ else if (!SvPOKp(sv)) { /* require 5.005_03 */
+ if ((NV)PERL_REVISION + ((NV)PERL_VERSION/(NV)1000)
+ + ((NV)PERL_SUBVERSION/(NV)1000000)
+ + 0.00000099 < SvNV(sv))
+ {
+ NV nrev = SvNV(sv);
+ UV rev = (UV)nrev;
+ NV nver = (nrev - rev) * 1000;
+ UV ver = (UV)(nver + 0.0009);
+ NV nsver = (nver - ver) * 1000;
+ UV sver = (UV)(nsver + 0.0009);
+
+ /* help out with the "use 5.6" confusion */
+ if (sver == 0 && (rev > 5 || (rev == 5 && ver >= 100))) {
+ DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
+ "this is only v%d.%d.%d, stopped"
+ " (did you mean v%"UVuf".%"UVuf".0?)",
+ rev, ver, sver, PERL_REVISION, PERL_VERSION,
+ PERL_SUBVERSION, rev, ver/100);
+ }
+ else {
+ DIE(aTHX_ "Perl v%"UVuf".%"UVuf".%"UVuf" required--"
+ "this is only v%d.%d.%d, stopped",
+ rev, ver, sver, PERL_REVISION, PERL_VERSION,
+ PERL_SUBVERSION);
+ }
+ }
+ }
RETPUSHYES;
}
name = SvPV(sv, len);
if (!(name && len > 0 && *name))
- DIE("Null filename used");
+ DIE(aTHX_ "Null filename used");
TAINT_PROPER("require");
if (PL_op->op_type == OP_REQUIRE &&
(svp = hv_fetch(GvHVn(PL_incgv), name, len, 0)) &&
@@ -2604,24 +2983,12 @@ PP(pp_require)
/* prepare to compile file */
- if (*name == '/' ||
- (*name == '.' &&
- (name[1] == '/' ||
- (name[1] == '.' && name[2] == '/')))
-#ifdef DOSISH
- || (name[0] && name[1] == ':')
-#endif
-#ifdef WIN32
- || (name[0] == '\\' && name[1] == '\\') /* UNC path */
-#endif
-#ifdef VMS
- || (strchr(name,':') || ((*name == '[' || *name == '<') &&
- (isALNUM(name[1]) || strchr("$-_]>",name[1]))))
-#endif
- )
+ if (PERL_FILE_IS_ABSOLUTE(name)
+ || (*name == '.' && (name[1] == '/' ||
+ (name[1] == '.' && name[2] == '/'))))
{
tryname = name;
- tryrsfp = PerlIO_open(name,PERL_SCRIPT_MODE);
+ tryrsfp = doopen_pmc(name,PERL_SCRIPT_MODE);
}
else {
AV *ar = GvAVn(PL_incgv);
@@ -2633,49 +3000,162 @@ PP(pp_require)
{
namesv = NEWSV(806, 0);
for (i = 0; i <= AvFILL(ar); i++) {
- char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
+ SV *dirsv = *av_fetch(ar, i, TRUE);
+
+ if (SvROK(dirsv)) {
+ int count;
+ SV *loader = dirsv;
+
+ if (SvTYPE(SvRV(loader)) == SVt_PVAV) {
+ loader = *av_fetch((AV *)SvRV(loader), 0, TRUE);
+ }
+
+ Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
+ PTR2UV(SvANY(loader)), name);
+ tryname = SvPVX(namesv);
+ tryrsfp = 0;
+
+ ENTER;
+ SAVETMPS;
+ EXTEND(SP, 2);
+
+ PUSHMARK(SP);
+ PUSHs(dirsv);
+ PUSHs(sv);
+ PUTBACK;
+ count = call_sv(loader, G_ARRAY);
+ SPAGAIN;
+
+ if (count > 0) {
+ int i = 0;
+ SV *arg;
+
+ SP -= count - 1;
+ arg = SP[i++];
+
+ if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVGV) {
+ arg = SvRV(arg);
+ }
+
+ if (SvTYPE(arg) == SVt_PVGV) {
+ IO *io = GvIO((GV *)arg);
+
+ ++filter_has_file;
+
+ if (io) {
+ tryrsfp = IoIFP(io);
+ if (IoTYPE(io) == '|') {
+ /* reading from a child process doesn't
+ nest -- when returning from reading
+ the inner module, the outer one is
+ unreadable (closed?) I've tried to
+ save the gv to manage the lifespan of
+ the pipe, but this didn't help. XXX */
+ filter_child_proc = (GV *)arg;
+ (void)SvREFCNT_inc(filter_child_proc);
+ }
+ else {
+ if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
+ PerlIO_close(IoOFP(io));
+ }
+ IoIFP(io) = Nullfp;
+ IoOFP(io) = Nullfp;
+ }
+ }
+
+ if (i < count) {
+ arg = SP[i++];
+ }
+ }
+
+ if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
+ filter_sub = arg;
+ (void)SvREFCNT_inc(filter_sub);
+
+ if (i < count) {
+ filter_state = SP[i];
+ (void)SvREFCNT_inc(filter_state);
+ }
+
+ if (tryrsfp == 0) {
+ tryrsfp = PerlIO_open("/dev/null",
+ PERL_SCRIPT_MODE);
+ }
+ }
+ }
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+
+ if (tryrsfp) {
+ break;
+ }
+
+ filter_has_file = 0;
+ if (filter_child_proc) {
+ SvREFCNT_dec(filter_child_proc);
+ filter_child_proc = 0;
+ }
+ if (filter_state) {
+ SvREFCNT_dec(filter_state);
+ filter_state = 0;
+ }
+ if (filter_sub) {
+ SvREFCNT_dec(filter_sub);
+ filter_sub = 0;
+ }
+ }
+ else {
+ char *dir = SvPVx(dirsv, n_a);
#ifdef VMS
- char *unixdir;
- if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
- continue;
- sv_setpv(namesv, unixdir);
- sv_catpv(namesv, unixname);
+ char *unixdir;
+ if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
+ continue;
+ sv_setpv(namesv, unixdir);
+ sv_catpv(namesv, unixname);
#else
- sv_setpvf(namesv, "%s/%s", dir, name);
+ Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
#endif
- TAINT_PROPER("require");
- tryname = SvPVX(namesv);
- tryrsfp = PerlIO_open(tryname, PERL_SCRIPT_MODE);
- if (tryrsfp) {
- if (tryname[0] == '.' && tryname[1] == '/')
- tryname += 2;
- break;
+ TAINT_PROPER("require");
+ tryname = SvPVX(namesv);
+ tryrsfp = doopen_pmc(tryname, PERL_SCRIPT_MODE);
+ if (tryrsfp) {
+ if (tryname[0] == '.' && tryname[1] == '/')
+ tryname += 2;
+ break;
+ }
}
}
}
}
- SAVESPTR(PL_compiling.cop_filegv);
- PL_compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name);
+ SAVECOPFILE(&PL_compiling);
+ CopFILE_set(&PL_compiling, tryrsfp ? tryname : name);
SvREFCNT_dec(namesv);
if (!tryrsfp) {
if (PL_op->op_type == OP_REQUIRE) {
- SV *msg = sv_2mortal(newSVpvf("Can't locate %s in @INC", name));
- SV *dirmsgsv = NEWSV(0, 0);
- AV *ar = GvAVn(PL_incgv);
- I32 i;
- if (instr(SvPVX(msg), ".h "))
- sv_catpv(msg, " (change .h to .ph maybe?)");
- if (instr(SvPVX(msg), ".ph "))
- sv_catpv(msg, " (did you run h2ph?)");
- sv_catpv(msg, " (@INC contains:");
- for (i = 0; i <= AvFILL(ar); i++) {
- char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
- sv_setpvf(dirmsgsv, " %s", dir);
- sv_catsv(msg, dirmsgsv);
+ char *msgstr = name;
+ if (namesv) { /* did we lookup @INC? */
+ SV *msg = sv_2mortal(newSVpv(msgstr,0));
+ SV *dirmsgsv = NEWSV(0, 0);
+ AV *ar = GvAVn(PL_incgv);
+ I32 i;
+ sv_catpvn(msg, " in @INC", 8);
+ if (instr(SvPVX(msg), ".h "))
+ sv_catpv(msg, " (change .h to .ph maybe?)");
+ if (instr(SvPVX(msg), ".ph "))
+ sv_catpv(msg, " (did you run h2ph?)");
+ sv_catpv(msg, " (@INC contains:");
+ for (i = 0; i <= AvFILL(ar); i++) {
+ char *dir = SvPVx(*av_fetch(ar, i, TRUE), n_a);
+ Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
+ sv_catsv(msg, dirmsgsv);
+ }
+ sv_catpvn(msg, ")", 1);
+ SvREFCNT_dec(dirmsgsv);
+ msgstr = SvPV_nolen(msg);
}
- sv_catpvn(msg, ")", 1);
- SvREFCNT_dec(dirmsgsv);
- DIE("%_", msg);
+ DIE(aTHX_ "Can't locate %s", msgstr);
}
RETPUSHUNDEF;
@@ -2685,28 +3165,40 @@ PP(pp_require)
/* Assume success here to prevent recursive requirement. */
(void)hv_store(GvHVn(PL_incgv), name, strlen(name),
- newSVsv(GvSV(PL_compiling.cop_filegv)), 0 );
+ newSVpv(CopFILE(&PL_compiling), 0), 0 );
ENTER;
SAVETMPS;
- lex_start(sv_2mortal(newSVpv("",0)));
+ lex_start(sv_2mortal(newSVpvn("",0)));
SAVEGENERICSV(PL_rsfp_filters);
PL_rsfp_filters = Nullav;
PL_rsfp = tryrsfp;
- name = savepv(name);
- SAVEFREEPV(name);
SAVEHINTS();
PL_hints = 0;
-
- /* switch to eval mode */
+ SAVESPTR(PL_compiling.cop_warnings);
+ if (PL_dowarn & G_WARN_ALL_ON)
+ PL_compiling.cop_warnings = pWARN_ALL ;
+ else if (PL_dowarn & G_WARN_ALL_OFF)
+ PL_compiling.cop_warnings = pWARN_NONE ;
+ else
+ PL_compiling.cop_warnings = pWARN_STD ;
+
+ if (filter_sub || filter_child_proc) {
+ SV *datasv = filter_add(run_user_filter, Nullsv);
+ IoLINES(datasv) = filter_has_file;
+ IoFMT_GV(datasv) = (GV *)filter_child_proc;
+ IoTOP_GV(datasv) = (GV *)filter_state;
+ IoBOTTOM_GV(datasv) = (GV *)filter_sub;
+ }
+ /* switch to eval mode */
push_return(PL_op->op_next);
PUSHBLOCK(cx, CXt_EVAL, SP);
- PUSHEVAL(cx, name, PL_compiling.cop_filegv);
+ PUSHEVAL(cx, name, Nullgv);
- SAVEI16(PL_compiling.cop_line);
- PL_compiling.cop_line = 0;
+ SAVECOPLINE(&PL_compiling);
+ CopLINE_set(&PL_compiling, 0);
PUTBACK;
#ifdef USE_THREADS
@@ -2722,7 +3214,7 @@ PP(pp_require)
PP(pp_dofile)
{
- return pp_require(ARGS);
+ return pp_require();
}
PP(pp_entereval)
@@ -2731,7 +3223,8 @@ PP(pp_entereval)
register PERL_CONTEXT *cx;
dPOPss;
I32 gimme = GIMME_V, was = PL_sub_generation;
- char tmpbuf[TYPE_DIGITS(long) + 12];
+ char tbuf[TYPE_DIGITS(long) + 12];
+ char *tmpbuf = tbuf;
char *safestr;
STRLEN len;
OP *ret;
@@ -2746,10 +3239,18 @@ PP(pp_entereval)
/* switch to eval mode */
- SAVESPTR(PL_compiling.cop_filegv);
- sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
- PL_compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
- PL_compiling.cop_line = 1;
+ SAVECOPFILE(&PL_compiling);
+ if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) {
+ SV *sv = sv_newmortal();
+ Perl_sv_setpvf(aTHX_ sv, "_<(eval %lu)[%s:%"IVdf"]",
+ (unsigned long)++PL_evalseq,
+ CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
+ tmpbuf = SvPVX(sv);
+ }
+ else
+ sprintf(tmpbuf, "_<(eval %lu)", (unsigned long)++PL_evalseq);
+ CopFILE_set(&PL_compiling, tmpbuf+2);
+ CopLINE_set(&PL_compiling, 1);
/* XXX For C<eval "...">s within BEGIN {} blocks, this ends up
deleting the eval's FILEGV from the stash before gv_check() runs
(i.e. before run-time proper). To work around the coredump that
@@ -2759,15 +3260,20 @@ PP(pp_entereval)
SAVEDELETE(PL_defstash, safestr, strlen(safestr));
SAVEHINTS();
PL_hints = PL_op->op_targ;
+ SAVESPTR(PL_compiling.cop_warnings);
+ if (!specialWARN(PL_compiling.cop_warnings)) {
+ PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
+ SAVEFREESV(PL_compiling.cop_warnings) ;
+ }
push_return(PL_op->op_next);
PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
- PUSHEVAL(cx, 0, PL_compiling.cop_filegv);
+ PUSHEVAL(cx, 0, Nullgv);
/* prepare to compile string */
if (PERLDB_LINE && PL_curstash != PL_debstash)
- save_lines(GvAV(PL_compiling.cop_filegv), PL_linestr);
+ save_lines(CopFILEAV(&PL_compiling), PL_linestr);
PUTBACK;
#ifdef USE_THREADS
MUTEX_LOCK(&PL_eval_mutex);
@@ -2816,6 +3322,7 @@ PP(pp_leaveeval)
MEXTEND(mark,0);
*MARK = &PL_sv_undef;
}
+ SP = MARK;
}
else {
/* in case LEAVE wipes old return values */
@@ -2828,35 +3335,8 @@ PP(pp_leaveeval)
}
PL_curpm = newpm; /* Don't pop $1 et al till now */
- /*
- * Closures mentioned at top level of eval cannot be referenced
- * again, and their presence indirectly causes a memory leak.
- * (Note that the fact that compcv and friends are still set here
- * is, AFAIK, an accident.) --Chip
- */
- if (AvFILLp(PL_comppad_name) >= 0) {
- SV **svp = AvARRAY(PL_comppad_name);
- I32 ix;
- for (ix = AvFILLp(PL_comppad_name); ix >= 0; ix--) {
- SV *sv = svp[ix];
- if (sv && sv != &PL_sv_undef && *SvPVX(sv) == '&') {
- SvREFCNT_dec(sv);
- svp[ix] = &PL_sv_undef;
-
- sv = PL_curpad[ix];
- if (CvCLONE(sv)) {
- SvREFCNT_dec(CvOUTSIDE(sv));
- CvOUTSIDE(sv) = Nullcv;
- }
- else {
- SvREFCNT_dec(sv);
- sv = NEWSV(0,0);
- SvPADTMP_on(sv);
- PL_curpad[ix] = sv;
- }
- }
- }
- }
+ if (AvFILLp(PL_comppad_name) >= 0)
+ free_closures();
#ifdef DEBUGGING
assert(CvDEPTH(PL_compcv) == 1);
@@ -2868,9 +3348,9 @@ PP(pp_leaveeval)
!(gimme == G_SCALAR ? SvTRUE(*SP) : SP > newsp))
{
/* Unassume the success we assumed earlier. */
- char *name = cx->blk_eval.old_name;
- (void)hv_delete(GvHVn(PL_incgv), name, strlen(name), G_DISCARD);
- retop = die("%s did not return a true value", name);
+ SV *nsv = cx->blk_eval.old_namesv;
+ (void)hv_delete(GvHVn(PL_incgv), SvPVX(nsv), SvCUR(nsv), G_DISCARD);
+ retop = Perl_die(aTHX_ "%s did not return a true value", SvPVX(nsv));
/* die_where() did LEAVE, or we won't be here */
}
else {
@@ -2892,11 +3372,11 @@ PP(pp_entertry)
SAVETMPS;
push_return(cLOGOP->op_other->op_next);
- PUSHBLOCK(cx, CXt_EVAL, SP);
+ PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), SP);
PUSHEVAL(cx, 0, 0);
PL_eval_root = PL_op; /* Only needed so that goto works right. */
- PL_in_eval = 1;
+ PL_in_eval = EVAL_INEVAL;
sv_setpv(ERRSV,"");
PUTBACK;
return DOCATCH(PL_op->op_next);
@@ -2950,7 +3430,7 @@ PP(pp_leavetry)
}
STATIC void
-doparseform(SV *sv)
+S_doparseform(pTHX_ SV *sv)
{
STRLEN len;
register char *s = SvPV_force(sv, len);
@@ -2967,7 +3447,7 @@ doparseform(SV *sv)
bool ischop;
if (len == 0)
- croak("Null picture in formline");
+ Perl_croak(aTHX_ "Null picture in formline");
New(804, fops, (send - s)*3+10, U16); /* Almost certainly too long... */
fpc = fops;
@@ -3233,13 +3713,8 @@ struct partition_stack_entry {
/* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
*/
-#ifdef PERL_OBJECT
-#define qsort_cmp(elt1, elt2) \
- ((this->*compare)(array[elt1], array[elt2]))
-#else
#define qsort_cmp(elt1, elt2) \
- ((*compare)(array[elt1], array[elt2]))
-#endif
+ ((*compare)(aTHXo_ array[elt1], array[elt2]))
#ifdef QSORT_ORDER_GUESS
#define QSORT_NOTICE_SWAP swapped++;
@@ -3320,14 +3795,7 @@ doqsort_all_asserts(
/* ****************************************************************** qsort */
STATIC void
-#ifdef PERL_OBJECT
-qsortsv(SV ** array, size_t num_elts, SVCOMPARE compare)
-#else
-qsortsv(
- SV ** array,
- size_t num_elts,
- I32 (*compare)(SV *a, SV *b))
-#endif
+S_qsortsv(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare)
{
register SV * temp;
@@ -3555,7 +4023,7 @@ qsortsv(
on the correct side of the partition. If I find a greater
value, then stop the scan.
*/
- while (still_work_on_left = (u_right >= part_left)) {
+ while ((still_work_on_left = (u_right >= part_left))) {
s = qsort_cmp(u_right, pc_left);
if (s < 0) {
--u_right;
@@ -3576,7 +4044,7 @@ qsortsv(
/* Do a mirror image scan of uncompared values on the right
*/
- while (still_work_on_right = (u_left <= part_right)) {
+ while ((still_work_on_right = (u_left <= part_right))) {
s = qsort_cmp(pc_right, u_left);
if (s < 0) {
++u_left;
@@ -3817,3 +4285,310 @@ qsortsv(
/* Believe it or not, the array is sorted at this point! */
}
+
+
+#ifdef PERL_OBJECT
+#undef this
+#define this pPerl
+#include "XSUB.h"
+#endif
+
+
+static I32
+sortcv(pTHXo_ SV *a, SV *b)
+{
+ dTHR;
+ I32 oldsaveix = PL_savestack_ix;
+ I32 oldscopeix = PL_scopestack_ix;
+ I32 result;
+ GvSV(PL_firstgv) = a;
+ GvSV(PL_secondgv) = b;
+ PL_stack_sp = PL_stack_base;
+ PL_op = PL_sortcop;
+ CALLRUNOPS(aTHX);
+ if (PL_stack_sp != PL_stack_base + 1)
+ Perl_croak(aTHX_ "Sort subroutine didn't return single value");
+ if (!SvNIOKp(*PL_stack_sp))
+ Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
+ result = SvIV(*PL_stack_sp);
+ while (PL_scopestack_ix > oldscopeix) {
+ LEAVE;
+ }
+ leave_scope(oldsaveix);
+ return result;
+}
+
+static I32
+sortcv_stacked(pTHXo_ SV *a, SV *b)
+{
+ dTHR;
+ I32 oldsaveix = PL_savestack_ix;
+ I32 oldscopeix = PL_scopestack_ix;
+ I32 result;
+ AV *av;
+
+#ifdef USE_THREADS
+ av = (AV*)PL_curpad[0];
+#else
+ av = GvAV(PL_defgv);
+#endif
+
+ if (AvMAX(av) < 1) {
+ SV** ary = AvALLOC(av);
+ if (AvARRAY(av) != ary) {
+ AvMAX(av) += AvARRAY(av) - AvALLOC(av);
+ SvPVX(av) = (char*)ary;
+ }
+ if (AvMAX(av) < 1) {
+ AvMAX(av) = 1;
+ Renew(ary,2,SV*);
+ SvPVX(av) = (char*)ary;
+ }
+ }
+ AvFILLp(av) = 1;
+
+ AvARRAY(av)[0] = a;
+ AvARRAY(av)[1] = b;
+ PL_stack_sp = PL_stack_base;
+ PL_op = PL_sortcop;
+ CALLRUNOPS(aTHX);
+ if (PL_stack_sp != PL_stack_base + 1)
+ Perl_croak(aTHX_ "Sort subroutine didn't return single value");
+ if (!SvNIOKp(*PL_stack_sp))
+ Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
+ result = SvIV(*PL_stack_sp);
+ while (PL_scopestack_ix > oldscopeix) {
+ LEAVE;
+ }
+ leave_scope(oldsaveix);
+ return result;
+}
+
+static I32
+sortcv_xsub(pTHXo_ SV *a, SV *b)
+{
+ dSP;
+ I32 oldsaveix = PL_savestack_ix;
+ I32 oldscopeix = PL_scopestack_ix;
+ I32 result;
+ CV *cv=(CV*)PL_sortcop;
+
+ SP = PL_stack_base;
+ PUSHMARK(SP);
+ EXTEND(SP, 2);
+ *++SP = a;
+ *++SP = b;
+ PUTBACK;
+ (void)(*CvXSUB(cv))(aTHXo_ cv);
+ if (PL_stack_sp != PL_stack_base + 1)
+ Perl_croak(aTHX_ "Sort subroutine didn't return single value");
+ if (!SvNIOKp(*PL_stack_sp))
+ Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value");
+ result = SvIV(*PL_stack_sp);
+ while (PL_scopestack_ix > oldscopeix) {
+ LEAVE;
+ }
+ leave_scope(oldsaveix);
+ return result;
+}
+
+
+static I32
+sv_ncmp(pTHXo_ SV *a, SV *b)
+{
+ NV nv1 = SvNV(a);
+ NV nv2 = SvNV(b);
+ return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0;
+}
+
+static I32
+sv_i_ncmp(pTHXo_ SV *a, SV *b)
+{
+ IV iv1 = SvIV(a);
+ IV iv2 = SvIV(b);
+ return iv1 < iv2 ? -1 : iv1 > iv2 ? 1 : 0;
+}
+#define tryCALL_AMAGICbin(left,right,meth,svp) STMT_START { \
+ *svp = Nullsv; \
+ if (PL_amagic_generation) { \
+ if (SvAMAGIC(left)||SvAMAGIC(right))\
+ *svp = amagic_call(left, \
+ right, \
+ CAT2(meth,_amg), \
+ 0); \
+ } \
+ } STMT_END
+
+static I32
+amagic_ncmp(pTHXo_ register SV *a, register SV *b)
+{
+ SV *tmpsv;
+ tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
+ if (tmpsv) {
+ NV d;
+
+ if (SvIOK(tmpsv)) {
+ I32 i = SvIVX(tmpsv);
+ if (i > 0)
+ return 1;
+ return i? -1 : 0;
+ }
+ d = SvNV(tmpsv);
+ if (d > 0)
+ return 1;
+ return d? -1 : 0;
+ }
+ return sv_ncmp(aTHXo_ a, b);
+}
+
+static I32
+amagic_i_ncmp(pTHXo_ register SV *a, register SV *b)
+{
+ SV *tmpsv;
+ tryCALL_AMAGICbin(a,b,ncmp,&tmpsv);
+ if (tmpsv) {
+ NV d;
+
+ if (SvIOK(tmpsv)) {
+ I32 i = SvIVX(tmpsv);
+ if (i > 0)
+ return 1;
+ return i? -1 : 0;
+ }
+ d = SvNV(tmpsv);
+ if (d > 0)
+ return 1;
+ return d? -1 : 0;
+ }
+ return sv_i_ncmp(aTHXo_ a, b);
+}
+
+static I32
+amagic_cmp(pTHXo_ register SV *str1, register SV *str2)
+{
+ SV *tmpsv;
+ tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
+ if (tmpsv) {
+ NV d;
+
+ if (SvIOK(tmpsv)) {
+ I32 i = SvIVX(tmpsv);
+ if (i > 0)
+ return 1;
+ return i? -1 : 0;
+ }
+ d = SvNV(tmpsv);
+ if (d > 0)
+ return 1;
+ return d? -1 : 0;
+ }
+ return sv_cmp(str1, str2);
+}
+
+static I32
+amagic_cmp_locale(pTHXo_ register SV *str1, register SV *str2)
+{
+ SV *tmpsv;
+ tryCALL_AMAGICbin(str1,str2,scmp,&tmpsv);
+ if (tmpsv) {
+ NV d;
+
+ if (SvIOK(tmpsv)) {
+ I32 i = SvIVX(tmpsv);
+ if (i > 0)
+ return 1;
+ return i? -1 : 0;
+ }
+ d = SvNV(tmpsv);
+ if (d > 0)
+ return 1;
+ return d? -1 : 0;
+ }
+ return sv_cmp_locale(str1, str2);
+}
+
+static I32
+run_user_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
+{
+ SV *datasv = FILTER_DATA(idx);
+ int filter_has_file = IoLINES(datasv);
+ GV *filter_child_proc = (GV *)IoFMT_GV(datasv);
+ SV *filter_state = (SV *)IoTOP_GV(datasv);
+ SV *filter_sub = (SV *)IoBOTTOM_GV(datasv);
+ int len = 0;
+
+ /* I was having segfault trouble under Linux 2.2.5 after a
+ parse error occured. (Had to hack around it with a test
+ for PL_error_count == 0.) Solaris doesn't segfault --
+ not sure where the trouble is yet. XXX */
+
+ if (filter_has_file) {
+ len = FILTER_READ(idx+1, buf_sv, maxlen);
+ }
+
+ if (filter_sub && len >= 0) {
+ djSP;
+ int count;
+
+ ENTER;
+ SAVE_DEFSV;
+ SAVETMPS;
+ EXTEND(SP, 2);
+
+ DEFSV = buf_sv;
+ PUSHMARK(SP);
+ PUSHs(sv_2mortal(newSViv(maxlen)));
+ if (filter_state) {
+ PUSHs(filter_state);
+ }
+ PUTBACK;
+ count = call_sv(filter_sub, G_SCALAR);
+ SPAGAIN;
+
+ if (count > 0) {
+ SV *out = POPs;
+ if (SvOK(out)) {
+ len = SvIV(out);
+ }
+ }
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+ }
+
+ if (len <= 0) {
+ IoLINES(datasv) = 0;
+ if (filter_child_proc) {
+ SvREFCNT_dec(filter_child_proc);
+ IoFMT_GV(datasv) = Nullgv;
+ }
+ if (filter_state) {
+ SvREFCNT_dec(filter_state);
+ IoTOP_GV(datasv) = Nullgv;
+ }
+ if (filter_sub) {
+ SvREFCNT_dec(filter_sub);
+ IoBOTTOM_GV(datasv) = Nullgv;
+ }
+ filter_del(run_user_filter);
+ }
+
+ return len;
+}
+
+#ifdef PERL_OBJECT
+
+static I32
+sv_cmp_locale_static(pTHXo_ register SV *str1, register SV *str2)
+{
+ return sv_cmp_locale(str1, str2);
+}
+
+static I32
+sv_cmp_static(pTHXo_ register SV *str1, register SV *str2)
+{
+ return sv_cmp(str1, str2);
+}
+
+#endif /* PERL_OBJECT */
diff --git a/contrib/perl5/pp_hot.c b/contrib/perl5/pp_hot.c
index e4d398d..c888ea5 100644
--- a/contrib/perl5/pp_hot.c
+++ b/contrib/perl5/pp_hot.c
@@ -1,6 +1,6 @@
/* pp_hot.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -16,46 +16,23 @@
*/
#include "EXTERN.h"
+#define PERL_IN_PP_HOT_C
#include "perl.h"
#ifdef I_UNISTD
#include <unistd.h>
#endif
-#ifdef I_FCNTL
-#include <fcntl.h>
-#endif
-#ifdef I_SYS_FILE
-#include <sys/file.h>
-#endif
/* Hot code. */
#ifdef USE_THREADS
-static void
-unset_cvowner(void *cvarg)
-{
- register CV* cv = (CV *) cvarg;
-#ifdef DEBUGGING
- dTHR;
-#endif /* DEBUGGING */
-
- DEBUG_S((PerlIO_printf(PerlIO_stderr(), "%p unsetting CvOWNER of %p:%s\n",
- thr, cv, SvPEEK((SV*)cv))));
- MUTEX_LOCK(CvMUTEXP(cv));
- DEBUG_S(if (CvDEPTH(cv) != 0)
- PerlIO_printf(PerlIO_stderr(), "depth %ld != 0\n",
- CvDEPTH(cv)););
- assert(thr == CvOWNER(cv));
- CvOWNER(cv) = 0;
- MUTEX_UNLOCK(CvMUTEXP(cv));
- SvREFCNT_dec(cv);
-}
+static void unset_cvowner(pTHXo_ void *cvarg);
#endif /* USE_THREADS */
PP(pp_const)
{
djSP;
- XPUSHs(cSVOP->op_sv);
+ XPUSHs(cSVOP_sv);
RETURN;
}
@@ -73,9 +50,9 @@ PP(pp_gvsv)
djSP;
EXTEND(SP,1);
if (PL_op->op_private & OPpLVAL_INTRO)
- PUSHs(save_scalar(cGVOP->op_gv));
+ PUSHs(save_scalar(cGVOP_gv));
else
- PUSHs(GvSV(cGVOP->op_gv));
+ PUSHs(GvSV(cGVOP_gv));
RETURN;
}
@@ -84,6 +61,12 @@ PP(pp_null)
return NORMAL;
}
+PP(pp_setstate)
+{
+ PL_curcop = (COP*)PL_op;
+ return NORMAL;
+}
+
PP(pp_pushmark)
{
PUSHMARK(PL_stack_sp);
@@ -97,6 +80,8 @@ PP(pp_stringify)
char *s;
s = SvPV(TOPs,len);
sv_setpvn(TARG,s,len);
+ if (SvUTF8(TOPs) && !IN_BYTE)
+ SvUTF8_on(TARG);
SETTARG;
RETURN;
}
@@ -104,7 +89,7 @@ PP(pp_stringify)
PP(pp_gv)
{
djSP;
- XPUSHs((SV*)cGVOP->op_gv);
+ XPUSHs((SV*)cGVOP_gv);
RETURN;
}
@@ -122,7 +107,6 @@ PP(pp_and)
PP(pp_sassign)
{
djSP; dPOPTOPssrl;
- MAGIC *mg;
if (PL_op->op_private & OPpASSIGN_BACKWARDS) {
SV *temp;
@@ -139,9 +123,9 @@ PP(pp_cond_expr)
{
djSP;
if (SvTRUEx(POPs))
- RETURNOP(cCONDOP->op_true);
+ RETURNOP(cLOGOP->op_other);
else
- RETURNOP(cCONDOP->op_false);
+ RETURNOP(cLOGOP->op_next);
}
PP(pp_unstack)
@@ -162,8 +146,14 @@ PP(pp_concat)
dPOPTOPssrl;
STRLEN len;
char *s;
+
if (TARG != left) {
s = SvPV(left,len);
+ if (TARG == right) {
+ sv_insert(TARG, 0, 0, s, len);
+ SETs(TARG);
+ RETURN;
+ }
sv_setpvn(TARG,s,len);
}
else if (SvGMAGICAL(TARG))
@@ -173,8 +163,30 @@ PP(pp_concat)
s = SvPV_force(TARG, len);
}
s = SvPV(right,len);
- if (SvOK(TARG))
+ if (SvOK(TARG)) {
+#if defined(PERL_Y2KWARN)
+ if ((SvIOK(right) || SvNOK(right)) && ckWARN(WARN_Y2K)) {
+ STRLEN n;
+ char *s = SvPV(TARG,n);
+ if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
+ && (n == 2 || !isDIGIT(s[n-3])))
+ {
+ Perl_warner(aTHX_ WARN_Y2K, "Possible Y2K bug: %s",
+ "about to append an integer to '19'");
+ }
+ }
+#endif
+ if (DO_UTF8(right))
+ sv_utf8_upgrade(TARG);
sv_catpvn(TARG,s,len);
+ if (!IN_BYTE) {
+ if (SvUTF8(right))
+ SvUTF8_on(TARG);
+ }
+ else if (!SvUTF8(right)) {
+ SvUTF8_off(TARG);
+ }
+ }
else
sv_setpvn(TARG,s,len); /* suppress warning */
SETTARG;
@@ -200,7 +212,19 @@ PP(pp_padsv)
PP(pp_readline)
{
+ tryAMAGICunTARGET(iter, 0);
PL_last_in_gv = (GV*)(*PL_stack_sp--);
+ if (SvTYPE(PL_last_in_gv) != SVt_PVGV) {
+ if (SvROK(PL_last_in_gv) && SvTYPE(SvRV(PL_last_in_gv)) == SVt_PVGV)
+ PL_last_in_gv = (GV*)SvRV(PL_last_in_gv);
+ else {
+ dSP;
+ XPUSHs((SV*)PL_last_in_gv);
+ PUTBACK;
+ pp_rv2gv();
+ PL_last_in_gv = (GV*)(*PL_stack_sp--);
+ }
+ }
return do_readline();
}
@@ -218,8 +242,8 @@ PP(pp_preinc)
{
djSP;
if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
- croak(no_modify);
- if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
+ DIE(aTHX_ PL_no_modify);
+ if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
SvIVX(TOPs) != IV_MAX)
{
++SvIVX(TOPs);
@@ -255,7 +279,7 @@ PP(pp_add)
PP(pp_aelemfast)
{
djSP;
- AV *av = GvAV((GV*)cSVOP->op_sv);
+ AV *av = GvAV(cGVOP_gv);
U32 lval = PL_op->op_flags & OPf_MOD;
SV** svp = av_fetch(av, PL_op->op_private, lval);
SV *sv = (svp ? *svp : &PL_sv_undef);
@@ -310,7 +334,7 @@ PP(pp_print)
gv = (GV*)*++MARK;
else
gv = PL_defoutgv;
- if (mg = SvTIED_mg((SV*)gv, 'q')) {
+ if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
if (MARK == ORIGMARK) {
/* If using default handle then we need to make space to
* pass object as 1st arg, so move other args up ...
@@ -324,7 +348,7 @@ PP(pp_print)
*MARK = SvTIED_obj((SV*)gv, mg);
PUTBACK;
ENTER;
- perl_call_method("PRINT", G_SCALAR);
+ call_method("PRINT", G_SCALAR);
LEAVE;
SPAGAIN;
MARK = ORIGMARK + 1;
@@ -333,23 +357,26 @@ PP(pp_print)
RETURN;
}
if (!(io = GvIO(gv))) {
- if (PL_dowarn) {
+ if (ckWARN(WARN_UNOPENED)) {
SV* sv = sv_newmortal();
- gv_fullname3(sv, gv, Nullch);
- warn("Filehandle %s never opened", SvPV(sv,n_a));
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_UNOPENED, "Filehandle %s never opened",
+ SvPV(sv,n_a));
}
-
SETERRNO(EBADF,RMS$_IFI);
goto just_say_no;
}
else if (!(fp = IoOFP(io))) {
- if (PL_dowarn) {
- SV* sv = sv_newmortal();
- gv_fullname3(sv, gv, Nullch);
- if (IoIFP(io))
- warn("Filehandle %s opened only for input", SvPV(sv,n_a));
- else
- warn("print on closed filehandle %s", SvPV(sv,n_a));
+ if (ckWARN2(WARN_CLOSED, WARN_IO)) {
+ if (IoIFP(io)) {
+ SV* sv = sv_newmortal();
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_IO,
+ "Filehandle %s opened only for input",
+ SvPV(sv,n_a));
+ }
+ else if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io, "print", "filehandle");
}
SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
goto just_say_no;
@@ -400,16 +427,18 @@ PP(pp_print)
PP(pp_rv2av)
{
- djSP; dPOPss;
+ djSP; dTOPss;
AV *av;
if (SvROK(sv)) {
wasref:
+ tryAMAGICunDEREF(to_av);
+
av = (AV*)SvRV(sv);
if (SvTYPE(av) != SVt_PVAV)
- DIE("Not an ARRAY reference");
+ DIE(aTHX_ "Not an ARRAY reference");
if (PL_op->op_flags & OPf_REF) {
- PUSHs((SV*)av);
+ SETs((SV*)av);
RETURN;
}
}
@@ -417,7 +446,7 @@ PP(pp_rv2av)
if (SvTYPE(sv) == SVt_PVAV) {
av = (AV*)sv;
if (PL_op->op_flags & OPf_REF) {
- PUSHs((SV*)av);
+ SETs((SV*)av);
RETURN;
}
}
@@ -436,25 +465,37 @@ PP(pp_rv2av)
if (!SvOK(sv)) {
if (PL_op->op_flags & OPf_REF ||
PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_usym, "an ARRAY");
- if (PL_dowarn)
- warn(warn_uninit);
- if (GIMME == G_ARRAY)
+ DIE(aTHX_ PL_no_usym, "an ARRAY");
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
+ if (GIMME == G_ARRAY) {
+ (void)POPs;
RETURN;
- RETPUSHUNDEF;
+ }
+ RETSETUNDEF;
}
sym = SvPV(sv,n_a);
- if (PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_symref, sym, "an ARRAY");
- gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
- } else {
+ if ((PL_op->op_flags & OPf_SPECIAL) &&
+ !(PL_op->op_flags & OPf_MOD))
+ {
+ gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PVAV);
+ if (!gv)
+ RETSETUNDEF;
+ }
+ else {
+ if (PL_op->op_private & HINT_STRICT_REFS)
+ DIE(aTHX_ PL_no_symref, sym, "an ARRAY");
+ gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
+ }
+ }
+ else {
gv = (GV*)sv;
}
av = GvAVn(gv);
if (PL_op->op_private & OPpLVAL_INTRO)
av = save_ary(gv);
if (PL_op->op_flags & OPf_REF) {
- PUSHs((SV*)av);
+ SETs((SV*)av);
RETURN;
}
}
@@ -462,6 +503,7 @@ PP(pp_rv2av)
if (GIMME == G_ARRAY) {
I32 maxarg = AvFILL(av) + 1;
+ (void)POPs; /* XXXX May be optimized away? */
EXTEND(SP, maxarg);
if (SvRMAGICAL(av)) {
U32 i;
@@ -478,7 +520,7 @@ PP(pp_rv2av)
else {
dTARGET;
I32 maxarg = AvFILL(av) + 1;
- PUSHi(maxarg);
+ SETi(maxarg);
}
RETURN;
}
@@ -490,9 +532,11 @@ PP(pp_rv2hv)
if (SvROK(sv)) {
wasref:
+ tryAMAGICunDEREF(to_hv);
+
hv = (HV*)SvRV(sv);
if (SvTYPE(hv) != SVt_PVHV && SvTYPE(hv) != SVt_PVAV)
- DIE("Not a HASH reference");
+ DIE(aTHX_ "Not a HASH reference");
if (PL_op->op_flags & OPf_REF) {
SETs((SV*)hv);
RETURN;
@@ -521,9 +565,9 @@ PP(pp_rv2hv)
if (!SvOK(sv)) {
if (PL_op->op_flags & OPf_REF ||
PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_usym, "a HASH");
- if (PL_dowarn)
- warn(warn_uninit);
+ DIE(aTHX_ PL_no_usym, "a HASH");
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
if (GIMME == G_ARRAY) {
SP--;
RETURN;
@@ -531,10 +575,20 @@ PP(pp_rv2hv)
RETSETUNDEF;
}
sym = SvPV(sv,n_a);
- if (PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_symref, sym, "a HASH");
- gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
- } else {
+ if ((PL_op->op_flags & OPf_SPECIAL) &&
+ !(PL_op->op_flags & OPf_MOD))
+ {
+ gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PVHV);
+ if (!gv)
+ RETSETUNDEF;
+ }
+ else {
+ if (PL_op->op_private & HINT_STRICT_REFS)
+ DIE(aTHX_ PL_no_symref, sym, "a HASH");
+ gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
+ }
+ }
+ else {
gv = (GV*)sv;
}
hv = GvHVn(gv);
@@ -549,15 +603,15 @@ PP(pp_rv2hv)
if (GIMME == G_ARRAY) { /* array wanted */
*PL_stack_sp = (SV*)hv;
- return do_kv(ARGS);
+ return do_kv();
}
else {
dTARGET;
if (SvTYPE(hv) == SVt_PVAV)
hv = avhv_keys((AV*)hv);
if (HvFILL(hv))
- sv_setpvf(TARG, "%ld/%ld",
- (long)HvFILL(hv), (long)HvMAX(hv) + 1);
+ Perl_sv_setpvf(aTHX_ TARG, "%"IVdf"/%"IVdf,
+ (IV)HvFILL(hv), (IV)HvMAX(hv) + 1);
else
sv_setiv(TARG, 0);
@@ -566,6 +620,92 @@ PP(pp_rv2hv)
}
}
+STATIC int
+S_do_maybe_phash(pTHX_ AV *ary, SV **lelem, SV **firstlelem, SV **relem,
+ SV **lastrelem)
+{
+ OP *leftop;
+ I32 i;
+
+ leftop = ((BINOP*)PL_op)->op_last;
+ assert(leftop);
+ assert(leftop->op_type == OP_NULL && leftop->op_targ == OP_LIST);
+ leftop = ((LISTOP*)leftop)->op_first;
+ assert(leftop);
+ /* Skip PUSHMARK and each element already assigned to. */
+ for (i = lelem - firstlelem; i > 0; i--) {
+ leftop = leftop->op_sibling;
+ assert(leftop);
+ }
+ if (leftop->op_type != OP_RV2HV)
+ return 0;
+
+ /* pseudohash */
+ if (av_len(ary) > 0)
+ av_fill(ary, 0); /* clear all but the fields hash */
+ if (lastrelem >= relem) {
+ while (relem < lastrelem) { /* gobble up all the rest */
+ SV *tmpstr;
+ assert(relem[0]);
+ assert(relem[1]);
+ /* Avoid a memory leak when avhv_store_ent dies. */
+ tmpstr = sv_newmortal();
+ sv_setsv(tmpstr,relem[1]); /* value */
+ relem[1] = tmpstr;
+ if (avhv_store_ent(ary,relem[0],tmpstr,0))
+ (void)SvREFCNT_inc(tmpstr);
+ if (SvMAGICAL(ary) != 0 && SvSMAGICAL(tmpstr))
+ mg_set(tmpstr);
+ relem += 2;
+ TAINT_NOT;
+ }
+ }
+ if (relem == lastrelem)
+ return 1;
+ return 2;
+}
+
+STATIC void
+S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem)
+{
+ if (*relem) {
+ SV *tmpstr;
+ if (ckWARN(WARN_MISC)) {
+ if (relem == firstrelem &&
+ SvROK(*relem) &&
+ (SvTYPE(SvRV(*relem)) == SVt_PVAV ||
+ SvTYPE(SvRV(*relem)) == SVt_PVHV))
+ {
+ Perl_warner(aTHX_ WARN_MISC,
+ "Reference found where even-sized list expected");
+ }
+ else
+ Perl_warner(aTHX_ WARN_MISC,
+ "Odd number of elements in hash assignment");
+ }
+ if (SvTYPE(hash) == SVt_PVAV) {
+ /* pseudohash */
+ tmpstr = sv_newmortal();
+ if (avhv_store_ent((AV*)hash,*relem,tmpstr,0))
+ (void)SvREFCNT_inc(tmpstr);
+ if (SvMAGICAL(hash) && SvSMAGICAL(tmpstr))
+ mg_set(tmpstr);
+ }
+ else {
+ HE *didstore;
+ tmpstr = NEWSV(29,0);
+ didstore = hv_store_ent(hash,*relem,tmpstr,0);
+ if (SvMAGICAL(hash)) {
+ if (SvSMAGICAL(tmpstr))
+ mg_set(tmpstr);
+ if (!didstore)
+ sv_2mortal(tmpstr);
+ }
+ }
+ TAINT_NOT;
+ }
+}
+
PP(pp_aassign)
{
djSP;
@@ -591,20 +731,22 @@ PP(pp_aassign)
* special care that assigning the identifier on the left doesn't
* clobber a value on the right that's used later in the list.
*/
- if (PL_op->op_private & OPpASSIGN_COMMON) {
- for (relem = firstrelem; relem <= lastrelem; relem++) {
- /*SUPPRESS 560*/
- if (sv = *relem) {
+ if (PL_op->op_private & (OPpASSIGN_COMMON)) {
+ EXTEND_MORTAL(lastrelem - firstrelem + 1);
+ for (relem = firstrelem; relem <= lastrelem; relem++) {
+ /*SUPPRESS 560*/
+ if ((sv = *relem)) {
TAINT_NOT; /* Each item is independent */
- *relem = sv_mortalcopy(sv);
+ *relem = sv_mortalcopy(sv);
}
- }
+ }
}
relem = firstrelem;
lelem = firstlelem;
ary = Null(AV*);
hash = Null(HV*);
+
while (lelem <= lastlelem) {
TAINT_NOT; /* Each item stands on its own, taintwise. */
sv = *lelem++;
@@ -612,7 +754,19 @@ PP(pp_aassign)
case SVt_PVAV:
ary = (AV*)sv;
magic = SvMAGICAL(ary) != 0;
-
+ if (PL_op->op_private & OPpASSIGN_HASH) {
+ switch (do_maybe_phash(ary, lelem, firstlelem, relem,
+ lastrelem))
+ {
+ case 0:
+ goto normal_array;
+ case 1:
+ do_oddball((HV*)ary, relem, firstrelem);
+ }
+ relem = lastrelem + 1;
+ break;
+ }
+ normal_array:
av_clear(ary);
av_extend(ary, lastrelem - relem);
i = 0;
@@ -627,12 +781,12 @@ PP(pp_aassign)
if (SvSMAGICAL(sv))
mg_set(sv);
if (!didstore)
- SvREFCNT_dec(sv);
+ sv_2mortal(sv);
}
TAINT_NOT;
}
break;
- case SVt_PVHV: {
+ case SVt_PVHV: { /* normal hash */
SV *tmpstr;
hash = (HV*)sv;
@@ -654,47 +808,21 @@ PP(pp_aassign)
if (SvSMAGICAL(tmpstr))
mg_set(tmpstr);
if (!didstore)
- SvREFCNT_dec(tmpstr);
+ sv_2mortal(tmpstr);
}
TAINT_NOT;
}
if (relem == lastrelem) {
- if (*relem) {
- HE *didstore;
- if (PL_dowarn) {
- if (relem == firstrelem &&
- SvROK(*relem) &&
- ( SvTYPE(SvRV(*relem)) == SVt_PVAV ||
- SvTYPE(SvRV(*relem)) == SVt_PVHV ) )
- warn("Reference found where even-sized list expected");
- else
- warn("Odd number of elements in hash assignment");
- }
- tmpstr = NEWSV(29,0);
- didstore = hv_store_ent(hash,*relem,tmpstr,0);
- if (magic) {
- if (SvSMAGICAL(tmpstr))
- mg_set(tmpstr);
- if (!didstore)
- SvREFCNT_dec(tmpstr);
- }
- TAINT_NOT;
- }
+ do_oddball(hash, relem, firstrelem);
relem++;
}
}
break;
default:
- if (SvTHINKFIRST(sv)) {
- if (SvREADONLY(sv) && PL_curcop != &PL_compiling) {
- if (!SvIMMORTAL(sv))
- DIE(no_modify);
- if (relem <= lastrelem)
- relem++;
- break;
- }
- if (SvROK(sv))
- sv_unref(sv);
+ if (SvIMMORTAL(sv)) {
+ if (relem <= lastrelem)
+ relem++;
+ break;
}
if (relem <= lastrelem) {
sv_setsv(sv, *relem);
@@ -728,13 +856,13 @@ PP(pp_aassign)
# endif /* HAS_SETEUID */
if (PL_delaymagic & DM_UID) {
if (PL_uid != PL_euid)
- DIE("No setreuid available");
+ DIE(aTHX_ "No setreuid available");
(void)PerlProc_setuid(PL_uid);
}
# endif /* HAS_SETREUID */
#endif /* HAS_SETRESUID */
- PL_uid = (int)PerlProc_getuid();
- PL_euid = (int)PerlProc_geteuid();
+ PL_uid = PerlProc_getuid();
+ PL_euid = PerlProc_geteuid();
}
if (PL_delaymagic & DM_GID) {
#ifdef HAS_SETRESGID
@@ -757,13 +885,13 @@ PP(pp_aassign)
# endif /* HAS_SETEGID */
if (PL_delaymagic & DM_GID) {
if (PL_gid != PL_egid)
- DIE("No setregid available");
+ DIE(aTHX_ "No setregid available");
(void)PerlProc_setgid(PL_gid);
}
# endif /* HAS_SETREGID */
#endif /* HAS_SETRESGID */
- PL_gid = (int)PerlProc_getgid();
- PL_egid = (int)PerlProc_getegid();
+ PL_gid = PerlProc_getgid();
+ PL_egid = PerlProc_getegid();
}
PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
}
@@ -807,8 +935,8 @@ PP(pp_match)
register char *s;
char *strend;
I32 global;
- I32 safebase;
- char *truebase;
+ I32 r_flags = REXEC_CHECKED;
+ char *truebase; /* Start of string */
register REGEXP *rx = pm->op_pmregexp;
bool rxtainted;
I32 gimme = GIMME;
@@ -816,7 +944,7 @@ PP(pp_match)
I32 minmatch = 0;
I32 oldsave = PL_savestack_ix;
I32 update_minmatch = 1;
- SV *screamer;
+ I32 had_zerolen = 0;
if (PL_op->op_flags & OPf_STACKED)
TARG = POPs;
@@ -828,7 +956,7 @@ PP(pp_match)
s = SvPV(TARG, len);
strend = s + len;
if (!s)
- DIE("panic: do_match");
+ DIE(aTHX_ "panic: do_match");
rxtainted = ((pm->op_pmdynflags & PMdf_TAINTED) ||
(PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
TAINT_NOT;
@@ -846,84 +974,57 @@ PP(pp_match)
}
if (rx->minlen > len) goto failure;
- screamer = ( (SvSCREAM(TARG) && rx->check_substr
- && SvTYPE(rx->check_substr) == SVt_PVBM
- && SvVALID(rx->check_substr))
- ? TARG : Nullsv);
truebase = t = s;
- if (global = pm->op_pmflags & PMf_GLOBAL) {
- rx->startp[0] = 0;
+
+ /* XXXX What part of this is needed with true \G-support? */
+ if ((global = pm->op_pmflags & PMf_GLOBAL)) {
+ rx->startp[0] = -1;
if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
MAGIC* mg = mg_find(TARG, 'g');
if (mg && mg->mg_len >= 0) {
- rx->endp[0] = rx->startp[0] = s + mg->mg_len;
+ if (!(rx->reganch & ROPT_GPOS_SEEN))
+ rx->endp[0] = rx->startp[0] = mg->mg_len;
+ else if (rx->reganch & ROPT_ANCH_GPOS) {
+ r_flags |= REXEC_IGNOREPOS;
+ rx->endp[0] = rx->startp[0] = mg->mg_len;
+ }
minmatch = (mg->mg_flags & MGf_MINMATCH);
update_minmatch = 0;
}
}
}
- safebase = ((gimme != G_ARRAY && !global && rx->nparens)
- || SvTEMP(TARG) || PL_sawampersand)
- ? REXEC_COPY_STR : 0;
+ if ((gimme != G_ARRAY && !global && rx->nparens)
+ || SvTEMP(TARG) || PL_sawampersand)
+ r_flags |= REXEC_COPY_STR;
+ if (SvSCREAM(TARG))
+ r_flags |= REXEC_SCREAM;
+
if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
SAVEINT(PL_multiline);
PL_multiline = pm->op_pmflags & PMf_MULTILINE;
}
play_it_again:
- if (global && rx->startp[0]) {
- t = s = rx->endp[0];
+ if (global && rx->startp[0] != -1) {
+ t = s = rx->endp[0] + truebase;
if ((s + rx->minlen) > strend)
goto nope;
if (update_minmatch++)
- minmatch = (s == rx->startp[0]);
- }
- if (rx->check_substr) {
- if (!(rx->reganch & ROPT_NOSCAN)) { /* Floating checkstring. */
- if ( screamer ) {
- I32 p = -1;
-
- if (PL_screamfirst[BmRARE(rx->check_substr)] < 0)
- goto nope;
- else if (!(s = screaminstr(TARG, rx->check_substr,
- rx->check_offset_min, 0, &p, 0)))
- goto nope;
- else if ((rx->reganch & ROPT_CHECK_ALL)
- && !PL_sawampersand && !SvTAIL(rx->check_substr))
- goto yup;
- }
- else if (!(s = fbm_instr((unsigned char*)s + rx->check_offset_min,
- (unsigned char*)strend,
- rx->check_substr, 0)))
- goto nope;
- else if ((rx->reganch & ROPT_CHECK_ALL) && !PL_sawampersand)
- goto yup;
- if (s && rx->check_offset_max < s - t) {
- ++BmUSEFUL(rx->check_substr);
- s -= rx->check_offset_max;
- }
- else
- s = t;
- }
- /* Now checkstring is fixed, i.e. at fixed offset from the
- beginning of match, and the match is anchored at s. */
- else if (!PL_multiline) { /* Anchored near beginning of string. */
- I32 slen;
- if (*SvPVX(rx->check_substr) != s[rx->check_offset_min]
- || ((slen = SvCUR(rx->check_substr)) > 1
- && memNE(SvPVX(rx->check_substr),
- s + rx->check_offset_min, slen)))
- goto nope;
- }
- if (!rx->naughty && --BmUSEFUL(rx->check_substr) < 0
- && rx->check_substr == rx->float_substr) {
- SvREFCNT_dec(rx->check_substr);
- rx->check_substr = Nullsv; /* opt is being useless */
- rx->float_substr = Nullsv;
- }
- }
- if (CALLREGEXEC(rx, s, strend, truebase, minmatch,
- screamer, NULL, safebase))
+ minmatch = had_zerolen;
+ }
+ if (rx->reganch & RE_USE_INTUIT) {
+ s = CALLREG_INTUIT_START(aTHX_ rx, TARG, s, strend, r_flags, NULL);
+
+ if (!s)
+ goto nope;
+ if ( (rx->reganch & ROPT_CHECK_ALL)
+ && !PL_sawampersand
+ && ((rx->reganch & ROPT_NOSCAN)
+ || !((rx->reganch & RE_INTUIT_TAIL)
+ && (r_flags & REXEC_SCREAM))))
+ goto yup;
+ }
+ if (CALLREGEXEC(aTHX_ rx, s, strend, truebase, minmatch, TARG, NULL, r_flags))
{
PL_curpm = pm;
if (pm->op_pmflags & PMf_ONCE)
@@ -952,17 +1053,21 @@ play_it_again:
for (i = !i; i <= iters; i++) {
PUSHs(sv_newmortal());
/*SUPPRESS 560*/
- if ((s = rx->startp[i]) && rx->endp[i] ) {
- len = rx->endp[i] - s;
+ if ((rx->startp[i] != -1) && rx->endp[i] != -1 ) {
+ len = rx->endp[i] - rx->startp[i];
+ s = rx->startp[i] + truebase;
sv_setpvn(*SP, s, len);
+ if ((pm->op_pmdynflags & PMdf_UTF8) && !IN_BYTE) {
+ SvUTF8_on(*SP);
+ sv_utf8_downgrade(*SP, TRUE);
+ }
}
}
if (global) {
- truebase = rx->subbeg;
- strend = rx->subend;
- if (rx->startp[0] && rx->startp[0] == rx->endp[0])
- ++rx->endp[0];
+ had_zerolen = (rx->startp[0] != -1
+ && rx->startp[0] == rx->endp[0]);
PUTBACK; /* EVAL blocks may use stack */
+ r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
goto play_it_again;
}
else if (!iters)
@@ -979,8 +1084,8 @@ play_it_again:
sv_magic(TARG, (SV*)0, 'g', Nullch, 0);
mg = mg_find(TARG, 'g');
}
- if (rx->startp[0]) {
- mg->mg_len = rx->endp[0] - rx->subbeg;
+ if (rx->startp[0] != -1) {
+ mg->mg_len = rx->endp[0];
if (rx->startp[0] == rx->endp[0])
mg->mg_flags |= MGf_MINMATCH;
else
@@ -991,39 +1096,42 @@ play_it_again:
RETPUSHYES;
}
-yup: /* Confirmed by check_substr */
+yup: /* Confirmed by INTUIT */
if (rxtainted)
RX_MATCH_TAINTED_on(rx);
TAINT_IF(RX_MATCH_TAINTED(rx));
- ++BmUSEFUL(rx->check_substr);
PL_curpm = pm;
if (pm->op_pmflags & PMf_ONCE)
pm->op_pmdynflags |= PMdf_USED;
- Safefree(rx->subbase);
- rx->subbase = Nullch;
+ if (RX_MATCH_COPIED(rx))
+ Safefree(rx->subbeg);
+ RX_MATCH_COPIED_off(rx);
+ rx->subbeg = Nullch;
if (global) {
rx->subbeg = truebase;
- rx->subend = strend;
- rx->startp[0] = s;
- rx->endp[0] = s + SvCUR(rx->check_substr);
+ rx->startp[0] = s - truebase;
+ rx->endp[0] = s - truebase + rx->minlen;
+ rx->sublen = strend - truebase;
goto gotcha;
- }
+ }
if (PL_sawampersand) {
- char *tmps;
+ I32 off;
- tmps = rx->subbase = savepvn(t, strend-t);
- rx->subbeg = tmps;
- rx->subend = tmps + (strend-t);
- tmps = rx->startp[0] = tmps + (s - t);
- rx->endp[0] = tmps + SvCUR(rx->check_substr);
+ rx->subbeg = savepvn(t, strend - t);
+ rx->sublen = strend - t;
+ RX_MATCH_COPIED_on(rx);
+ off = rx->startp[0] = s - t;
+ rx->endp[0] = off + rx->minlen;
}
+ else { /* startp/endp are used by @- @+. */
+ rx->startp[0] = s - truebase;
+ rx->endp[0] = s - truebase + rx->minlen;
+ }
+ rx->nparens = rx->lastparen = 0; /* used by @- and @+ */
LEAVE_SCOPE(oldsave);
RETPUSHYES;
nope:
- if (rx->check_substr)
- ++BmUSEFUL(rx->check_substr);
-
ret_no:
if (global && !(pm->op_pmflags & PMf_CONTINUE)) {
if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
@@ -1039,7 +1147,7 @@ ret_no:
}
OP *
-do_readline(void)
+Perl_do_readline(pTHX)
{
dSP; dTARGETSTACKED;
register SV *sv;
@@ -1051,12 +1159,12 @@ do_readline(void)
I32 gimme = GIMME_V;
MAGIC *mg;
- if (mg = SvTIED_mg((SV*)PL_last_in_gv, 'q')) {
+ if ((mg = SvTIED_mg((SV*)PL_last_in_gv, 'q'))) {
PUSHMARK(SP);
XPUSHs(SvTIED_obj((SV*)PL_last_in_gv, mg));
PUTBACK;
ENTER;
- perl_call_method("READLINE", gimme);
+ call_method("READLINE", gimme);
LEAVE;
SPAGAIN;
if (gimme == G_SCALAR)
@@ -1069,9 +1177,9 @@ do_readline(void)
if (!fp) {
if (IoFLAGS(io) & IOf_ARGV) {
if (IoFLAGS(io) & IOf_START) {
- IoFLAGS(io) &= ~IOf_START;
IoLINES(io) = 0;
if (av_len(GvAVn(PL_last_in_gv)) < 0) {
+ IoFLAGS(io) &= ~IOf_START;
do_open(PL_last_in_gv,"-",1,FALSE,O_RDONLY,0,Nullfp);
sv_setpvn(GvSV(PL_last_in_gv), "-", 1);
SvSETMAGIC(GvSV(PL_last_in_gv));
@@ -1082,7 +1190,6 @@ do_readline(void)
fp = nextargv(PL_last_in_gv);
if (!fp) { /* Note: fp != IoIFP(io) */
(void)do_close(PL_last_in_gv, FALSE); /* now it does*/
- IoFLAGS(io) |= IOf_START;
}
}
else if (type == OP_GLOB) {
@@ -1174,6 +1281,11 @@ do_readline(void)
}
}
#else /* !VMS */
+#ifdef MACOS_TRADITIONAL
+ sv_setpv(tmpcmd, "glob ");
+ sv_catsv(tmpcmd, tmpglob);
+ sv_catpv(tmpcmd, " |");
+#else
#ifdef DOSISH
#ifdef OS2
sv_setpv(tmpcmd, "for a in ");
@@ -1205,6 +1317,7 @@ do_readline(void)
#endif
#endif /* !CSH */
#endif /* !DOSISH */
+#endif /* MACOS_TRADITIONAL */
(void)do_open(PL_last_in_gv, SvPVX(tmpcmd), SvCUR(tmpcmd),
FALSE, O_RDONLY, 0, Nullfp);
fp = IoIFP(io);
@@ -1214,10 +1327,25 @@ do_readline(void)
}
else if (type == OP_GLOB)
SP--;
+ else if (ckWARN(WARN_IO) /* stdout/stderr or other write fh */
+ && (IoTYPE(io) == '>' || fp == PerlIO_stdout()
+ || fp == PerlIO_stderr()))
+ {
+ SV* sv = sv_newmortal();
+ gv_efullname3(sv, PL_last_in_gv, Nullch);
+ Perl_warner(aTHX_ WARN_IO, "Filehandle %s opened only for output",
+ SvPV_nolen(sv));
+ }
}
if (!fp) {
- if (PL_dowarn && io && !(IoFLAGS(io) & IOf_START))
- warn("Read on closed filehandle <%s>", GvENAME(PL_last_in_gv));
+ if (ckWARN2(WARN_GLOB,WARN_CLOSED) && io && !(IoFLAGS(io) & IOf_START)) {
+ if (type == OP_GLOB)
+ Perl_warner(aTHX_ WARN_GLOB,
+ "glob failed (can't start child: %s)",
+ Strerror(errno));
+ else
+ report_closed_fh(PL_last_in_gv, io, "readline", "filehandle");
+ }
if (gimme == G_SCALAR) {
(void)SvOK_off(TARG);
PUSHTARG;
@@ -1243,12 +1371,11 @@ do_readline(void)
offset = 0;
}
-/* flip-flop EOF state for a snarfed empty file */
+/* delay EOF state for a snarfed empty file */
#define SNARF_EOF(gimme,rs,io,sv) \
- ((gimme != G_SCALAR || SvCUR(sv) \
- || (IoFLAGS(io) & IOf_NOLINE) || IoLINES(io) || !RsSNARF(rs)) \
- ? ((IoFLAGS(io) &= ~IOf_NOLINE), TRUE) \
- : ((IoFLAGS(io) |= IOf_NOLINE), FALSE))
+ (gimme != G_SCALAR || SvCUR(sv) \
+ || !RsSNARF(rs) || (IoFLAGS(io) & IOf_NOLINE) \
+ || ((IoFLAGS(io) |= IOf_NOLINE), FALSE))
for (;;) {
if (!sv_gets(sv, fp, offset)
@@ -1260,13 +1387,13 @@ do_readline(void)
if (fp)
continue;
(void)do_close(PL_last_in_gv, FALSE);
- IoFLAGS(io) |= IOf_START;
}
else if (type == OP_GLOB) {
- if (!do_close(PL_last_in_gv, FALSE)) {
- warn("glob failed (child exited with status %d%s)",
- STATUS_CURRENT >> 8,
- (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
+ if (!do_close(PL_last_in_gv, FALSE) && ckWARN(WARN_GLOB)) {
+ Perl_warner(aTHX_ WARN_GLOB,
+ "glob failed (child exited with status %d%s)",
+ (int)(STATUS_CURRENT >> 8),
+ (STATUS_CURRENT & 0x80) ? ", core dumped" : "");
}
}
if (gimme == G_SCALAR) {
@@ -1297,7 +1424,7 @@ do_readline(void)
if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
break;
- if (*tmps && PerlLIO_stat(SvPVX(sv), &PL_statbuf) < 0) {
+ if (*tmps && PerlLIO_lstat(SvPVX(sv), &PL_statbuf) < 0) {
(void)POPs; /* Unmatched wildcard? Chuck it... */
continue;
}
@@ -1360,7 +1487,7 @@ PP(pp_helem)
}
else if (SvTYPE(hv) == SVt_PVAV) {
if (PL_op->op_private & OPpLVAL_INTRO)
- DIE("Can't localize pseudo-hash element");
+ DIE(aTHX_ "Can't localize pseudo-hash element");
svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, 0);
}
else {
@@ -1372,7 +1499,7 @@ PP(pp_helem)
SV* key2;
if (!defer) {
STRLEN n_a;
- DIE(no_helem, SvPV(keysv, n_a));
+ DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
}
lv = sv_newmortal();
sv_upgrade(lv, SVt_PVLV);
@@ -1468,12 +1595,14 @@ PP(pp_iter)
register PERL_CONTEXT *cx;
SV* sv;
AV* av;
+ SV **itersvp;
EXTEND(SP, 1);
cx = &cxstack[cxstack_ix];
if (CxTYPE(cx) != CXt_LOOP)
- DIE("panic: pp_iter");
+ DIE(aTHX_ "panic: pp_iter");
+ itersvp = CxITERVAR(cx);
av = cx->blk_loop.iterary;
if (SvTYPE(av) != SVt_PVAV) {
/* iterate ($min .. $max) */
@@ -1484,11 +1613,9 @@ PP(pp_iter)
char *max = SvPV((SV*)av, maxlen);
if (!SvNIOK(cur) && SvCUR(cur) <= maxlen) {
#ifndef USE_THREADS /* don't risk potential race */
- if (SvREFCNT(*cx->blk_loop.itervar) == 1
- && !SvMAGICAL(*cx->blk_loop.itervar))
- {
+ if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
/* safe to reuse old SV */
- sv_setsv(*cx->blk_loop.itervar, cur);
+ sv_setsv(*itersvp, cur);
}
else
#endif
@@ -1496,8 +1623,8 @@ PP(pp_iter)
/* we need a fresh SV every time so that loop body sees a
* completely new SV for closures/references to work as
* they used to */
- SvREFCNT_dec(*cx->blk_loop.itervar);
- *cx->blk_loop.itervar = newSVsv(cur);
+ SvREFCNT_dec(*itersvp);
+ *itersvp = newSVsv(cur);
}
if (strEQ(SvPVX(cur), max))
sv_setiv(cur, 0); /* terminate next time */
@@ -1512,11 +1639,9 @@ PP(pp_iter)
RETPUSHNO;
#ifndef USE_THREADS /* don't risk potential race */
- if (SvREFCNT(*cx->blk_loop.itervar) == 1
- && !SvMAGICAL(*cx->blk_loop.itervar))
- {
+ if (SvREFCNT(*itersvp) == 1 && !SvMAGICAL(*itersvp)) {
/* safe to reuse old SV */
- sv_setiv(*cx->blk_loop.itervar, cx->blk_loop.iterix++);
+ sv_setiv(*itersvp, cx->blk_loop.iterix++);
}
else
#endif
@@ -1524,8 +1649,8 @@ PP(pp_iter)
/* we need a fresh SV every time so that loop body sees a
* completely new SV for closures/references to work as they
* used to */
- SvREFCNT_dec(*cx->blk_loop.itervar);
- *cx->blk_loop.itervar = newSViv(cx->blk_loop.iterix++);
+ SvREFCNT_dec(*itersvp);
+ *itersvp = newSViv(cx->blk_loop.iterix++);
}
RETPUSHYES;
}
@@ -1534,11 +1659,11 @@ PP(pp_iter)
if (cx->blk_loop.iterix >= (av == PL_curstack ? cx->blk_oldsp : AvFILL(av)))
RETPUSHNO;
- SvREFCNT_dec(*cx->blk_loop.itervar);
+ SvREFCNT_dec(*itersvp);
- if (sv = (SvMAGICAL(av))
- ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE)
- : AvARRAY(av)[++cx->blk_loop.iterix])
+ if ((sv = SvMAGICAL(av)
+ ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE)
+ : AvARRAY(av)[++cx->blk_loop.iterix]))
SvTEMP_off(sv);
else
sv = &PL_sv_undef;
@@ -1558,11 +1683,11 @@ PP(pp_iter)
}
LvTARG(lv) = SvREFCNT_inc(av);
LvTARGOFF(lv) = cx->blk_loop.iterix;
- LvTARGLEN(lv) = (UV) -1;
+ LvTARGLEN(lv) = (STRLEN)UV_MAX;
sv = (SV*)lv;
}
- *cx->blk_loop.itervar = SvREFCNT_inc(sv);
+ *itersvp = SvREFCNT_inc(sv);
RETPUSHYES;
}
@@ -1584,13 +1709,11 @@ PP(pp_subst)
bool once;
bool rxtainted;
char *orig;
- I32 safebase;
+ I32 r_flags;
register REGEXP *rx = pm->op_pmregexp;
STRLEN len;
int force_on_match = 0;
I32 oldsave = PL_savestack_ix;
- I32 update_minmatch = 1;
- SV *screamer;
/* known replacement string? */
dstr = (pm->op_pmflags & PMf_CONST) ? POPs : Nullsv;
@@ -1603,7 +1726,7 @@ PP(pp_subst)
if (SvREADONLY(TARG)
|| (SvTYPE(TARG) > SVt_PVLV
&& !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
- croak(no_modify);
+ DIE(aTHX_ PL_no_modify);
PUTBACK;
s = SvPV(TARG, len);
@@ -1617,7 +1740,7 @@ PP(pp_subst)
force_it:
if (!pm || !s)
- DIE("panic: do_subst");
+ DIE(aTHX_ "panic: do_subst");
strend = s + len;
maxiters = 2*(strend - s) + 10; /* We can match twice at each
@@ -1628,54 +1751,28 @@ PP(pp_subst)
pm = PL_curpm;
rx = pm->op_pmregexp;
}
- screamer = ( (SvSCREAM(TARG) && rx->check_substr
- && SvTYPE(rx->check_substr) == SVt_PVBM
- && SvVALID(rx->check_substr))
- ? TARG : Nullsv);
- safebase = (rx->nparens || SvTEMP(TARG) || PL_sawampersand)
+ r_flags = (rx->nparens || SvTEMP(TARG) || PL_sawampersand)
? REXEC_COPY_STR : 0;
+ if (SvSCREAM(TARG))
+ r_flags |= REXEC_SCREAM;
if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
SAVEINT(PL_multiline);
PL_multiline = pm->op_pmflags & PMf_MULTILINE;
}
orig = m = s;
- if (rx->check_substr) {
- if (!(rx->reganch & ROPT_NOSCAN)) { /* It floats. */
- if (screamer) {
- I32 p = -1;
-
- if (PL_screamfirst[BmRARE(rx->check_substr)] < 0)
- goto nope;
- else if (!(s = screaminstr(TARG, rx->check_substr, rx->check_offset_min, 0, &p, 0)))
- goto nope;
- }
- else if (!(s = fbm_instr((unsigned char*)s + rx->check_offset_min,
- (unsigned char*)strend,
- rx->check_substr, 0)))
- goto nope;
- if (s && rx->check_offset_max < s - m) {
- ++BmUSEFUL(rx->check_substr);
- s -= rx->check_offset_max;
- }
- else
- s = m;
- }
- /* Now checkstring is fixed, i.e. at fixed offset from the
- beginning of match, and the match is anchored at s. */
- else if (!PL_multiline) { /* Anchored at beginning of string. */
- I32 slen;
- if (*SvPVX(rx->check_substr) != s[rx->check_offset_min]
- || ((slen = SvCUR(rx->check_substr)) > 1
- && memNE(SvPVX(rx->check_substr),
- s + rx->check_offset_min, slen)))
- goto nope;
- }
- if (!rx->naughty && --BmUSEFUL(rx->check_substr) < 0
- && rx->check_substr == rx->float_substr) {
- SvREFCNT_dec(rx->check_substr);
- rx->check_substr = Nullsv; /* opt is being useless */
- rx->float_substr = Nullsv;
- }
+ if (rx->reganch & RE_USE_INTUIT) {
+ s = CALLREG_INTUIT_START(aTHX_ rx, TARG, s, strend, r_flags, NULL);
+
+ if (!s)
+ goto nope;
+ /* How to do it in subst? */
+/* if ( (rx->reganch & ROPT_CHECK_ALL)
+ && !PL_sawampersand
+ && ((rx->reganch & ROPT_NOSCAN)
+ || !((rx->reganch & RE_INTUIT_TAIL)
+ && (r_flags & REXEC_SCREAM))))
+ goto yup;
+*/
}
/* only replace once? */
@@ -1685,9 +1782,11 @@ PP(pp_subst)
c = dstr ? SvPV(dstr, clen) : Nullch;
/* can do inplace substitution? */
- if (c && clen <= rx->minlen && (once || !(safebase & REXEC_COPY_STR))
+ if (c && clen <= rx->minlen && (once || !(r_flags & REXEC_COPY_STR))
&& !(rx->reganch & ROPT_LOOKBEHIND_SEEN)) {
- if (!CALLREGEXEC(rx, s, strend, orig, 0, screamer, NULL, safebase)) {
+ if (!CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
+ r_flags | REXEC_CHECKED))
+ {
SPAGAIN;
PUSHs(&PL_sv_no);
LEAVE_SCOPE(oldsave);
@@ -1703,13 +1802,8 @@ PP(pp_subst)
SvSCREAM_off(TARG); /* disable possible screamer */
if (once) {
rxtainted |= RX_MATCH_TAINTED(rx);
- if (rx->subbase) {
- m = orig + (rx->startp[0] - rx->subbase);
- d = orig + (rx->endp[0] - rx->subbase);
- } else {
- m = rx->startp[0];
- d = rx->endp[0];
- }
+ m = orig + rx->startp[0];
+ d = orig + rx->endp[0];
s = orig;
if (m - s > strend - d) { /* faster to shorten from end */
if (clen) {
@@ -1725,7 +1819,7 @@ PP(pp_subst)
SvCUR_set(TARG, m - s);
}
/*SUPPRESS 560*/
- else if (i = m - s) { /* faster from front */
+ else if ((i = m - s)) { /* faster from front */
d -= clen;
m = d;
sv_chop(TARG, d-i);
@@ -1750,11 +1844,11 @@ PP(pp_subst)
else {
do {
if (iters++ > maxiters)
- DIE("Substitution loop");
+ DIE(aTHX_ "Substitution loop");
rxtainted |= RX_MATCH_TAINTED(rx);
- m = rx->startp[0];
+ m = rx->startp[0] + orig;
/*SUPPRESS 560*/
- if (i = m - s) {
+ if ((i = m - s)) {
if (s != d)
Move(s, d, i, char);
d += i;
@@ -1763,9 +1857,11 @@ PP(pp_subst)
Copy(c, d, clen, char);
d += clen;
}
- s = rx->endp[0];
- } while (CALLREGEXEC(rx, s, strend, orig, s == m,
- Nullsv, NULL, 0)); /* don't match same null twice */
+ s = rx->endp[0] + orig;
+ } while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m,
+ TARG, NULL,
+ /* don't match same null twice */
+ REXEC_NOT_FIRST|REXEC_IGNOREPOS));
if (s != d) {
i = strend - s;
SvCUR_set(TARG, d - SvPVX(TARG) + i);
@@ -1787,7 +1883,9 @@ PP(pp_subst)
RETURN;
}
- if (CALLREGEXEC(rx, s, strend, orig, 0, screamer, NULL, safebase)) {
+ if (CALLREGEXEC(aTHX_ rx, s, strend, orig, 0, TARG, NULL,
+ r_flags | REXEC_CHECKED))
+ {
if (force_on_match) {
force_on_match = 0;
s = SvPV_force(TARG, len);
@@ -1803,25 +1901,26 @@ PP(pp_subst)
PUSHSUBST(cx);
RETURNOP(cPMOP->op_pmreplroot);
}
+ r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST;
do {
if (iters++ > maxiters)
- DIE("Substitution loop");
+ DIE(aTHX_ "Substitution loop");
rxtainted |= RX_MATCH_TAINTED(rx);
- if (rx->subbase && rx->subbase != orig) {
+ if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
m = s;
s = orig;
- orig = rx->subbase;
+ orig = rx->subbeg;
s = orig + (m - s);
strend = s + (strend - m);
}
- m = rx->startp[0];
+ m = rx->startp[0] + orig;
sv_catpvn(dstr, s, m-s);
- s = rx->endp[0];
+ s = rx->endp[0] + orig;
if (clen)
sv_catpvn(dstr, c, clen);
if (once)
break;
- } while (CALLREGEXEC(rx, s, strend, orig, s == m, Nullsv, NULL, safebase));
+ } while (CALLREGEXEC(aTHX_ rx, s, strend, orig, s == m, TARG, NULL, r_flags));
sv_catpvn(dstr, s, strend - s);
(void)SvOOK_off(TARG);
@@ -1846,8 +1945,6 @@ PP(pp_subst)
goto ret_no;
nope:
- ++BmUSEFUL(rx->check_substr);
-
ret_no:
SPAGAIN;
PUSHs(&PL_sv_no);
@@ -1886,7 +1983,7 @@ PP(pp_grepwhile)
SV *src;
ENTER; /* enter inner scope */
- SAVESPTR(PL_curpm);
+ SAVEVPTR(PL_curpm);
src = PL_stack_base[*PL_markstack_ptr];
SvTEMP_off(src);
@@ -1904,27 +2001,31 @@ PP(pp_leavesub)
PMOP *newpm;
I32 gimme;
register PERL_CONTEXT *cx;
- struct block_sub cxsub;
+ SV *sv;
POPBLOCK(cx,newpm);
- POPSUB1(cx); /* Delay POPSUB2 until stack values are safe */
TAINT_NOT;
if (gimme == G_SCALAR) {
MARK = newsp + 1;
if (MARK <= SP) {
- if (cxsub.cv && CvDEPTH(cxsub.cv) > 1) {
+ if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
if (SvTEMP(TOPs)) {
*MARK = SvREFCNT_inc(TOPs);
FREETMPS;
sv_2mortal(*MARK);
- } else {
+ }
+ else {
+ sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
FREETMPS;
- *MARK = sv_mortalcopy(TOPs);
+ *MARK = sv_mortalcopy(sv);
+ SvREFCNT_dec(sv);
}
- } else
+ }
+ else
*MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
- } else {
+ }
+ else {
MEXTEND(MARK, 0);
*MARK = &PL_sv_undef;
}
@@ -1940,15 +2041,170 @@ PP(pp_leavesub)
}
PUTBACK;
- POPSUB2(); /* Stack values are safe: release CV and @_ ... */
+ POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
+ PL_curpm = newpm; /* ... and pop $1 et al */
+
+ LEAVE;
+ LEAVESUB(sv);
+ return pop_return();
+}
+
+/* This duplicates the above code because the above code must not
+ * get any slower by more conditions */
+PP(pp_leavesublv)
+{
+ djSP;
+ SV **mark;
+ SV **newsp;
+ PMOP *newpm;
+ I32 gimme;
+ register PERL_CONTEXT *cx;
+ SV *sv;
+
+ POPBLOCK(cx,newpm);
+
+ TAINT_NOT;
+
+ if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
+ /* We are an argument to a function or grep().
+ * This kind of lvalueness was legal before lvalue
+ * subroutines too, so be backward compatible:
+ * cannot report errors. */
+
+ /* Scalar context *is* possible, on the LHS of -> only,
+ * as in f()->meth(). But this is not an lvalue. */
+ if (gimme == G_SCALAR)
+ goto temporise;
+ if (gimme == G_ARRAY) {
+ if (!CvLVALUE(cx->blk_sub.cv))
+ goto temporise_array;
+ EXTEND_MORTAL(SP - newsp);
+ for (mark = newsp + 1; mark <= SP; mark++) {
+ if (SvTEMP(*mark))
+ /* empty */ ;
+ else if (SvFLAGS(*mark) & (SVs_PADTMP | SVf_READONLY))
+ *mark = sv_mortalcopy(*mark);
+ else {
+ /* Can be a localized value subject to deletion. */
+ PL_tmps_stack[++PL_tmps_ix] = *mark;
+ (void)SvREFCNT_inc(*mark);
+ }
+ }
+ }
+ }
+ else if (cx->blk_sub.lval) { /* Leave it as it is if we can. */
+ /* Here we go for robustness, not for speed, so we change all
+ * the refcounts so the caller gets a live guy. Cannot set
+ * TEMP, so sv_2mortal is out of question. */
+ if (!CvLVALUE(cx->blk_sub.cv)) {
+ POPSUB(cx,sv);
+ PL_curpm = newpm;
+ LEAVE;
+ LEAVESUB(sv);
+ DIE(aTHX_ "Can't modify non-lvalue subroutine call");
+ }
+ if (gimme == G_SCALAR) {
+ MARK = newsp + 1;
+ EXTEND_MORTAL(1);
+ if (MARK == SP) {
+ if (SvFLAGS(TOPs) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
+ POPSUB(cx,sv);
+ PL_curpm = newpm;
+ LEAVE;
+ LEAVESUB(sv);
+ DIE(aTHX_ "Can't return a %s from lvalue subroutine",
+ SvREADONLY(TOPs) ? "readonly value" : "temporary");
+ }
+ else { /* Can be a localized value
+ * subject to deletion. */
+ PL_tmps_stack[++PL_tmps_ix] = *mark;
+ (void)SvREFCNT_inc(*mark);
+ }
+ }
+ else { /* Should not happen? */
+ POPSUB(cx,sv);
+ PL_curpm = newpm;
+ LEAVE;
+ LEAVESUB(sv);
+ DIE(aTHX_ "%s returned from lvalue subroutine in scalar context",
+ (MARK > SP ? "Empty array" : "Array"));
+ }
+ SP = MARK;
+ }
+ else if (gimme == G_ARRAY) {
+ EXTEND_MORTAL(SP - newsp);
+ for (mark = newsp + 1; mark <= SP; mark++) {
+ if (SvFLAGS(*mark) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) {
+ /* Might be flattened array after $#array = */
+ PUTBACK;
+ POPSUB(cx,sv);
+ PL_curpm = newpm;
+ LEAVE;
+ LEAVESUB(sv);
+ DIE(aTHX_ "Can't return %s from lvalue subroutine",
+ (*mark != &PL_sv_undef)
+ ? (SvREADONLY(TOPs)
+ ? "a readonly value" : "a temporary")
+ : "an uninitialized value");
+ }
+ else {
+ /* Can be a localized value subject to deletion. */
+ PL_tmps_stack[++PL_tmps_ix] = *mark;
+ (void)SvREFCNT_inc(*mark);
+ }
+ }
+ }
+ }
+ else {
+ if (gimme == G_SCALAR) {
+ temporise:
+ MARK = newsp + 1;
+ if (MARK <= SP) {
+ if (cx->blk_sub.cv && CvDEPTH(cx->blk_sub.cv) > 1) {
+ if (SvTEMP(TOPs)) {
+ *MARK = SvREFCNT_inc(TOPs);
+ FREETMPS;
+ sv_2mortal(*MARK);
+ }
+ else {
+ sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
+ FREETMPS;
+ *MARK = sv_mortalcopy(sv);
+ SvREFCNT_dec(sv);
+ }
+ }
+ else
+ *MARK = SvTEMP(TOPs) ? TOPs : sv_mortalcopy(TOPs);
+ }
+ else {
+ MEXTEND(MARK, 0);
+ *MARK = &PL_sv_undef;
+ }
+ SP = MARK;
+ }
+ else if (gimme == G_ARRAY) {
+ temporise_array:
+ for (MARK = newsp + 1; MARK <= SP; MARK++) {
+ if (!SvTEMP(*MARK)) {
+ *MARK = sv_mortalcopy(*MARK);
+ TAINT_NOT; /* Each item is independent */
+ }
+ }
+ }
+ }
+ PUTBACK;
+
+ POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */
PL_curpm = newpm; /* ... and pop $1 et al */
LEAVE;
+ LEAVESUB(sv);
return pop_return();
}
+
STATIC CV *
-get_db_sub(SV **svp, CV *cv)
+S_get_db_sub(pTHX_ SV **svp, CV *cv)
{
dTHR;
SV *dbsv = GvSV(PL_DBsub);
@@ -1971,10 +2227,10 @@ get_db_sub(SV **svp, CV *cv)
}
}
else {
- SvUPGRADE(dbsv, SVt_PVIV);
- SvIOK_on(dbsv);
+ (void)SvUPGRADE(dbsv, SVt_PVIV);
+ (void)SvIOK_on(dbsv);
SAVEIV(SvIVX(dbsv));
- SvIVX(dbsv) = (IV)cv; /* Do it the quickest way */
+ SvIVX(dbsv) = PTR2IV(cv); /* Do it the quickest way */
}
if (CvXSUB(cv))
@@ -1994,7 +2250,7 @@ PP(pp_entersub)
bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;
if (!sv)
- DIE("Not a CODE reference");
+ DIE(aTHX_ "Not a CODE reference");
switch (SvTYPE(sv)) {
default:
if (!SvROK(sv)) {
@@ -2013,25 +2269,34 @@ PP(pp_entersub)
else
sym = SvPV(sv, n_a);
if (!sym)
- DIE(no_usym, "a subroutine");
+ DIE(aTHX_ PL_no_usym, "a subroutine");
if (PL_op->op_private & HINT_STRICT_REFS)
- DIE(no_symref, sym, "a subroutine");
- cv = perl_get_cv(sym, TRUE);
+ DIE(aTHX_ PL_no_symref, sym, "a subroutine");
+ cv = get_cv(sym, TRUE);
break;
}
+ {
+ SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
+ tryAMAGICunDEREF(to_cv);
+ }
cv = (CV*)SvRV(sv);
if (SvTYPE(cv) == SVt_PVCV)
break;
/* FALL THROUGH */
case SVt_PVHV:
case SVt_PVAV:
- DIE("Not a CODE reference");
+ DIE(aTHX_ "Not a CODE reference");
case SVt_PVCV:
cv = (CV*)sv;
break;
case SVt_PVGV:
if (!(cv = GvCVu((GV*)sv)))
- cv = sv_2cv(sv, &stash, &gv, TRUE);
+ cv = sv_2cv(sv, &stash, &gv, FALSE);
+ if (!cv) {
+ ENTER;
+ SAVETMPS;
+ goto try_autoload;
+ }
break;
}
@@ -2039,39 +2304,44 @@ PP(pp_entersub)
SAVETMPS;
retry:
- if (!cv)
- DIE("Not a CODE reference");
-
if (!CvROOT(cv) && !CvXSUB(cv)) {
GV* autogv;
SV* sub_name;
/* anonymous or undef'd function leaves us no recourse */
if (CvANON(cv) || !(gv = CvGV(cv)))
- DIE("Undefined subroutine called");
+ DIE(aTHX_ "Undefined subroutine called");
+
/* autoloaded stub? */
if (cv != GvCV(gv)) {
cv = GvCV(gv);
- goto retry;
}
/* should call AUTOLOAD now? */
- if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
+ else {
+try_autoload:
+ if ((autogv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv),
FALSE)))
- {
- cv = GvCV(autogv);
- goto retry;
+ {
+ cv = GvCV(autogv);
+ }
+ /* sorry */
+ else {
+ sub_name = sv_newmortal();
+ gv_efullname3(sub_name, gv, Nullch);
+ DIE(aTHX_ "Undefined subroutine &%s called", SvPVX(sub_name));
+ }
}
- /* sorry */
- sub_name = sv_newmortal();
- gv_efullname3(sub_name, gv, Nullch);
- DIE("Undefined subroutine &%s called", SvPVX(sub_name));
+ if (!cv)
+ DIE(aTHX_ "Not a CODE reference");
+ goto retry;
}
gimme = GIMME_V;
- if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv))
+ if ((PL_op->op_private & OPpENTERSUB_DB) && GvCV(PL_DBsub) && !CvNODEBUG(cv)) {
cv = get_db_sub(&sv, cv);
- if (!cv)
- DIE("No DBsub routine");
+ if (!cv)
+ DIE(aTHX_ "No DBsub routine");
+ }
#ifdef USE_THREADS
/*
@@ -2088,8 +2358,13 @@ PP(pp_entersub)
if (SP > PL_stack_base + TOPMARK)
sv = *(PL_stack_base + TOPMARK + 1);
else {
- MUTEX_UNLOCK(CvMUTEXP(cv));
- croak("no argument for locked method call");
+ AV *av = (AV*)PL_curpad[0];
+ if (hasargs || !av || AvFILLp(av) < 0
+ || !(sv = AvARRAY(av)[0]))
+ {
+ MUTEX_UNLOCK(CvMUTEXP(cv));
+ DIE(aTHX_ "no argument for locked method call");
+ }
}
if (SvROK(sv))
sv = SvRV(sv);
@@ -2111,10 +2386,10 @@ PP(pp_entersub)
while (MgOWNER(mg))
COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
MgOWNER(mg) = thr;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: pp_entersub lock %p\n",
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: pp_entersub lock %p\n",
thr, sv);)
MUTEX_UNLOCK(MgMUTEXP(mg));
- save_destructor(unlock_condpair, sv);
+ SAVEDESTRUCTOR_X(Perl_unlock_condpair, sv);
}
MUTEX_LOCK(CvMUTEXP(cv));
}
@@ -2153,13 +2428,13 @@ PP(pp_entersub)
/* We already have a clone to use */
MUTEX_UNLOCK(CvMUTEXP(cv));
cv = *(CV**)svp;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"entersub: %p already has clone %p:%s\n",
thr, cv, SvPEEK((SV*)cv)));
CvOWNER(cv) = thr;
SvREFCNT_inc(cv);
if (CvDEPTH(cv) == 0)
- SAVEDESTRUCTOR(unset_cvowner, (void*) cv);
+ SAVEDESTRUCTOR_X(unset_cvowner, (void*) cv);
}
else {
/* (2) => grab ownership of cv. (3) => make clone */
@@ -2167,16 +2442,17 @@ PP(pp_entersub)
CvOWNER(cv) = thr;
SvREFCNT_inc(cv);
MUTEX_UNLOCK(CvMUTEXP(cv));
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"entersub: %p grabbing %p:%s in stash %s\n",
thr, cv, SvPEEK((SV*)cv), CvSTASH(cv) ?
HvNAME(CvSTASH(cv)) : "(none)"));
- } else {
+ }
+ else {
/* Make a new clone. */
CV *clonecv;
SvREFCNT_inc(cv); /* don't let it vanish from under us */
MUTEX_UNLOCK(CvMUTEXP(cv));
- DEBUG_S((PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S((PerlIO_printf(Perl_debug_log,
"entersub: %p cloning %p:%s\n",
thr, cv, SvPEEK((SV*)cv))));
/*
@@ -2194,16 +2470,17 @@ PP(pp_entersub)
SvREFCNT_inc(cv);
}
DEBUG_S(if (CvDEPTH(cv) != 0)
- PerlIO_printf(PerlIO_stderr(), "depth %ld != 0\n",
+ PerlIO_printf(Perl_debug_log, "depth %ld != 0\n",
CvDEPTH(cv)););
- SAVEDESTRUCTOR(unset_cvowner, (void*) cv);
+ SAVEDESTRUCTOR_X(unset_cvowner, (void*) cv);
}
}
#endif /* USE_THREADS */
if (CvXSUB(cv)) {
+#ifdef PERL_XSUB_OLDSTYLE
if (CvOLDSTYLE(cv)) {
- I32 (*fp3)_((int,int,int));
+ I32 (*fp3)(int,int,int);
dMARK;
register I32 items = SP - MARK;
/* We dont worry to copy from @_. */
@@ -2212,13 +2489,15 @@ PP(pp_entersub)
SP--;
}
PL_stack_sp = mark + 1;
- fp3 = (I32(*)_((int,int,int)))CvXSUB(cv);
+ fp3 = (I32(*)(int,int,int))CvXSUB(cv);
items = (*fp3)(CvXSUBANY(cv).any_i32,
MARK - PL_stack_base + 1,
items);
PL_stack_sp = PL_stack_base + items;
}
- else {
+ else
+#endif /* PERL_XSUB_OLDSTYLE */
+ {
I32 markix = TOPMARK;
PUTBACK;
@@ -2244,15 +2523,14 @@ PP(pp_entersub)
PUTBACK ;
}
}
- if (PL_curcopdb) { /* We assume that the first
- XSUB in &DB::sub is the
- called one. */
- SAVESPTR(PL_curcop);
+ /* We assume first XSUB in &DB::sub is the called one. */
+ if (PL_curcopdb) {
+ SAVEVPTR(PL_curcop);
PL_curcop = PL_curcopdb;
PL_curcopdb = NULL;
}
/* Do we need to open block here? XXXX */
- (void)(*CvXSUB(cv))(cv _PERL_OBJECT_THIS);
+ (void)(*CvXSUB(cv))(aTHXo_ cv);
/* Enforce some sanity in scalar context. */
if (gimme == G_SCALAR && ++markix != PL_stack_sp - PL_stack_base ) {
@@ -2283,14 +2561,16 @@ PP(pp_entersub)
if (CvDEPTH(cv) < 2)
(void)SvREFCNT_inc(cv);
else { /* save temporaries on recursion? */
+ PERL_STACK_OVERFLOW_CHECK();
if (CvDEPTH(cv) > AvFILLp(padlist)) {
AV *av;
AV *newpad = newAV();
SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
I32 ix = AvFILLp((AV*)svp[1]);
+ I32 names_fill = AvFILLp((AV*)svp[0]);
svp = AvARRAY(svp[0]);
for ( ;ix > 0; ix--) {
- if (svp[ix] != &PL_sv_undef) {
+ if (names_fill >= ix && svp[ix] != &PL_sv_undef) {
char *name = SvPVX(svp[ix]);
if ((SvFLAGS(svp[ix]) & SVf_FAKE) /* outer lexical? */
|| *name == '&') /* anonymous code? */
@@ -2307,6 +2587,9 @@ PP(pp_entersub)
SvPADMY_on(sv);
}
}
+ else if (IS_PADGV(oldpad[ix]) || IS_PADCONST(oldpad[ix])) {
+ av_store(newpad, ix, sv = SvREFCNT_inc(oldpad[ix]));
+ }
else {
av_store(newpad, ix, sv = NEWSV(0,0));
SvPADTMP_on(sv);
@@ -2335,7 +2618,7 @@ PP(pp_entersub)
}
}
#endif /* USE_THREADS */
- SAVESPTR(PL_curpad);
+ SAVEVPTR(PL_curpad);
PL_curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
#ifndef USE_THREADS
if (hasargs)
@@ -2345,13 +2628,16 @@ PP(pp_entersub)
SV** ary;
#if 0
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p entersub preparing @_\n", thr));
#endif
av = (AV*)PL_curpad[0];
if (AvREAL(av)) {
+ /* @_ is normally not REAL--this should only ever
+ * happen when DB::sub() calls things that modify @_ */
av_clear(av);
AvREAL_off(av);
+ AvREIFY_on(av);
}
#ifndef USE_THREADS
cx->blk_sub.savearray = GvAV(PL_defgv);
@@ -2386,11 +2672,11 @@ PP(pp_entersub)
* stuff so that __WARN__ handlers can safely dounwind()
* if they want to
*/
- if (CvDEPTH(cv) == 100 && PL_dowarn
+ if (CvDEPTH(cv) == 100 && ckWARN(WARN_RECURSION)
&& !(PERLDB_SUB && cv == GvCV(PL_DBsub)))
sub_crush_depth(cv);
#if 0
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p entersub returning %p\n", thr, CvSTART(cv)));
#endif
RETURNOP(CvSTART(cv));
@@ -2398,14 +2684,15 @@ PP(pp_entersub)
}
void
-sub_crush_depth(CV *cv)
+Perl_sub_crush_depth(pTHX_ CV *cv)
{
if (CvANON(cv))
- warn("Deep recursion on anonymous subroutine");
+ Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on anonymous subroutine");
else {
SV* tmpstr = sv_newmortal();
gv_efullname3(tmpstr, CvGV(cv), Nullch);
- warn("Deep recursion on subroutine \"%s\"", SvPVX(tmpstr));
+ Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on subroutine \"%s\"",
+ SvPVX(tmpstr));
}
}
@@ -2428,7 +2715,7 @@ PP(pp_aelem)
if (!svp || *svp == &PL_sv_undef) {
SV* lv;
if (!defer)
- DIE(no_aelem, elem);
+ DIE(aTHX_ PL_no_aelem, elem);
lv = sv_newmortal();
sv_upgrade(lv, SVt_PVLV);
LvTYPE(lv) = 'y';
@@ -2452,13 +2739,13 @@ PP(pp_aelem)
}
void
-vivify_ref(SV *sv, U32 to_what)
+Perl_vivify_ref(pTHX_ SV *sv, U32 to_what)
{
if (SvGMAGICAL(sv))
mg_get(sv);
if (!SvOK(sv)) {
if (SvREADONLY(sv))
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
if (SvTYPE(sv) < SVt_RV)
sv_upgrade(sv, SVt_RV);
else if (SvTYPE(sv) >= SVt_PV) {
@@ -2485,25 +2772,45 @@ vivify_ref(SV *sv, U32 to_what)
PP(pp_method)
{
djSP;
+ SV* sv = TOPs;
+
+ if (SvROK(sv)) {
+ SV* rsv = SvRV(sv);
+ if (SvTYPE(rsv) == SVt_PVCV) {
+ SETs(rsv);
+ RETURN;
+ }
+ }
+
+ SETs(method_common(sv, Null(U32*)));
+ RETURN;
+}
+
+PP(pp_method_named)
+{
+ djSP;
+ SV* sv = cSVOP->op_sv;
+ U32 hash = SvUVX(sv);
+
+ XPUSHs(method_common(sv, &hash));
+ RETURN;
+}
+
+STATIC SV *
+S_method_common(pTHX_ SV* meth, U32* hashp)
+{
SV* sv;
SV* ob;
GV* gv;
HV* stash;
char* name;
+ STRLEN namelen;
char* packname;
STRLEN packlen;
- if (SvROK(TOPs)) {
- sv = SvRV(TOPs);
- if (SvTYPE(sv) == SVt_PVCV) {
- SETs(sv);
- RETURN;
- }
- }
-
- name = SvPV(TOPs, packlen);
+ name = SvPV(meth, namelen);
sv = *(PL_stack_base + TOPMARK + 1);
-
+
if (SvGMAGICAL(sv))
mg_get(sv);
if (SvROK(sv))
@@ -2517,22 +2824,44 @@ PP(pp_method)
!(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
!(ob=(SV*)GvIO(iogv)))
{
- if (!packname || !isIDFIRST(*packname))
- DIE("Can't call method \"%s\" %s", name,
- SvOK(sv)? "without a package or object reference"
- : "on an undefined value");
+ if (!packname ||
+ ((*(U8*)packname >= 0xc0 && DO_UTF8(sv))
+ ? !isIDFIRST_utf8((U8*)packname)
+ : !isIDFIRST(*packname)
+ ))
+ {
+ Perl_croak(aTHX_ "Can't call method \"%s\" %s", name,
+ SvOK(sv) ? "without a package or object reference"
+ : "on an undefined value");
+ }
stash = gv_stashpvn(packname, packlen, TRUE);
goto fetch;
}
*(PL_stack_base + TOPMARK + 1) = sv_2mortal(newRV((SV*)iogv));
}
- if (!ob || !SvOBJECT(ob))
- DIE("Can't call method \"%s\" on unblessed reference", name);
+ if (!ob || !(SvOBJECT(ob)
+ || (SvTYPE(ob) == SVt_PVGV && (ob = (SV*)GvIO((GV*)ob))
+ && SvOBJECT(ob))))
+ {
+ Perl_croak(aTHX_ "Can't call method \"%s\" on unblessed reference",
+ name);
+ }
stash = SvSTASH(ob);
fetch:
+ /* shortcut for simple names */
+ if (hashp) {
+ HE* he = hv_fetch_ent(stash, meth, 0, *hashp);
+ if (he) {
+ gv = (GV*)HeVAL(he);
+ if (isGV(gv) && GvCV(gv) &&
+ (!GvCVGEN(gv) || GvCVGEN(gv) == PL_sub_generation))
+ return (SV*)GvCV(gv);
+ }
+ }
+
gv = gv_fetchmethod(stash, name);
if (!gv) {
char* leaf = name;
@@ -2546,17 +2875,38 @@ PP(pp_method)
sep = p, leaf = p + 2;
}
if (!sep || ((sep - name) == 5 && strnEQ(name, "SUPER", 5))) {
- packname = HvNAME(sep ? PL_curcop->cop_stash : stash);
+ packname = sep ? CopSTASHPV(PL_curcop) : HvNAME(stash);
packlen = strlen(packname);
}
else {
packname = name;
packlen = sep - name;
}
- DIE("Can't locate object method \"%s\" via package \"%.*s\"",
- leaf, (int)packlen, packname);
+ Perl_croak(aTHX_
+ "Can't locate object method \"%s\" via package \"%s\"",
+ leaf, packname);
}
- SETs(isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv);
- RETURN;
+ return isGV(gv) ? (SV*)GvCV(gv) : (SV*)gv;
}
+#ifdef USE_THREADS
+static void
+unset_cvowner(pTHXo_ void *cvarg)
+{
+ register CV* cv = (CV *) cvarg;
+#ifdef DEBUGGING
+ dTHR;
+#endif /* DEBUGGING */
+
+ DEBUG_S((PerlIO_printf(Perl_debug_log, "%p unsetting CvOWNER of %p:%s\n",
+ thr, cv, SvPEEK((SV*)cv))));
+ MUTEX_LOCK(CvMUTEXP(cv));
+ DEBUG_S(if (CvDEPTH(cv) != 0)
+ PerlIO_printf(Perl_debug_log, "depth %ld != 0\n",
+ CvDEPTH(cv)););
+ assert(thr == CvOWNER(cv));
+ CvOWNER(cv) = 0;
+ MUTEX_UNLOCK(CvMUTEXP(cv));
+ SvREFCNT_dec(cv);
+}
+#endif /* USE_THREADS */
diff --git a/contrib/perl5/pp_proto.h b/contrib/perl5/pp_proto.h
index ad82696..4ce9d74 100644
--- a/contrib/perl5/pp_proto.h
+++ b/contrib/perl5/pp_proto.h
@@ -1,344 +1,392 @@
-PPDEF(pp_null)
-PPDEF(pp_stub)
-PPDEF(pp_scalar)
-PPDEF(pp_pushmark)
-PPDEF(pp_wantarray)
-PPDEF(pp_const)
-PPDEF(pp_gvsv)
-PPDEF(pp_gv)
-PPDEF(pp_gelem)
-PPDEF(pp_padsv)
-PPDEF(pp_padav)
-PPDEF(pp_padhv)
-PPDEF(pp_padany)
-PPDEF(pp_pushre)
-PPDEF(pp_rv2gv)
-PPDEF(pp_rv2sv)
-PPDEF(pp_av2arylen)
-PPDEF(pp_rv2cv)
-PPDEF(pp_anoncode)
-PPDEF(pp_prototype)
-PPDEF(pp_refgen)
-PPDEF(pp_srefgen)
-PPDEF(pp_ref)
-PPDEF(pp_bless)
-PPDEF(pp_backtick)
-PPDEF(pp_glob)
-PPDEF(pp_readline)
-PPDEF(pp_rcatline)
-PPDEF(pp_regcmaybe)
-PPDEF(pp_regcreset)
-PPDEF(pp_regcomp)
-PPDEF(pp_match)
-PPDEF(pp_qr)
-PPDEF(pp_subst)
-PPDEF(pp_substcont)
-PPDEF(pp_trans)
-PPDEF(pp_sassign)
-PPDEF(pp_aassign)
-PPDEF(pp_chop)
-PPDEF(pp_schop)
-PPDEF(pp_chomp)
-PPDEF(pp_schomp)
-PPDEF(pp_defined)
-PPDEF(pp_undef)
-PPDEF(pp_study)
-PPDEF(pp_pos)
-PPDEF(pp_preinc)
-PPDEF(pp_predec)
-PPDEF(pp_postinc)
-PPDEF(pp_postdec)
-PPDEF(pp_pow)
-PPDEF(pp_multiply)
-PPDEF(pp_i_multiply)
-PPDEF(pp_divide)
-PPDEF(pp_i_divide)
-PPDEF(pp_modulo)
-PPDEF(pp_i_modulo)
-PPDEF(pp_repeat)
-PPDEF(pp_add)
-PPDEF(pp_i_add)
-PPDEF(pp_subtract)
-PPDEF(pp_i_subtract)
-PPDEF(pp_concat)
-PPDEF(pp_stringify)
-PPDEF(pp_left_shift)
-PPDEF(pp_right_shift)
-PPDEF(pp_lt)
-PPDEF(pp_i_lt)
-PPDEF(pp_gt)
-PPDEF(pp_i_gt)
-PPDEF(pp_le)
-PPDEF(pp_i_le)
-PPDEF(pp_ge)
-PPDEF(pp_i_ge)
-PPDEF(pp_eq)
-PPDEF(pp_i_eq)
-PPDEF(pp_ne)
-PPDEF(pp_i_ne)
-PPDEF(pp_ncmp)
-PPDEF(pp_i_ncmp)
-PPDEF(pp_slt)
-PPDEF(pp_sgt)
-PPDEF(pp_sle)
-PPDEF(pp_sge)
-PPDEF(pp_seq)
-PPDEF(pp_sne)
-PPDEF(pp_scmp)
-PPDEF(pp_bit_and)
-PPDEF(pp_bit_xor)
-PPDEF(pp_bit_or)
-PPDEF(pp_negate)
-PPDEF(pp_i_negate)
-PPDEF(pp_not)
-PPDEF(pp_complement)
-PPDEF(pp_atan2)
-PPDEF(pp_sin)
-PPDEF(pp_cos)
-PPDEF(pp_rand)
-PPDEF(pp_srand)
-PPDEF(pp_exp)
-PPDEF(pp_log)
-PPDEF(pp_sqrt)
-PPDEF(pp_int)
-PPDEF(pp_hex)
-PPDEF(pp_oct)
-PPDEF(pp_abs)
-PPDEF(pp_length)
-PPDEF(pp_substr)
-PPDEF(pp_vec)
-PPDEF(pp_index)
-PPDEF(pp_rindex)
-PPDEF(pp_sprintf)
-PPDEF(pp_formline)
-PPDEF(pp_ord)
-PPDEF(pp_chr)
-PPDEF(pp_crypt)
-PPDEF(pp_ucfirst)
-PPDEF(pp_lcfirst)
-PPDEF(pp_uc)
-PPDEF(pp_lc)
-PPDEF(pp_quotemeta)
-PPDEF(pp_rv2av)
-PPDEF(pp_aelemfast)
-PPDEF(pp_aelem)
-PPDEF(pp_aslice)
-PPDEF(pp_each)
-PPDEF(pp_values)
-PPDEF(pp_keys)
-PPDEF(pp_delete)
-PPDEF(pp_exists)
-PPDEF(pp_rv2hv)
-PPDEF(pp_helem)
-PPDEF(pp_hslice)
-PPDEF(pp_unpack)
-PPDEF(pp_pack)
-PPDEF(pp_split)
-PPDEF(pp_join)
-PPDEF(pp_list)
-PPDEF(pp_lslice)
-PPDEF(pp_anonlist)
-PPDEF(pp_anonhash)
-PPDEF(pp_splice)
-PPDEF(pp_push)
-PPDEF(pp_pop)
-PPDEF(pp_shift)
-PPDEF(pp_unshift)
-PPDEF(pp_sort)
-PPDEF(pp_reverse)
-PPDEF(pp_grepstart)
-PPDEF(pp_grepwhile)
-PPDEF(pp_mapstart)
-PPDEF(pp_mapwhile)
-PPDEF(pp_range)
-PPDEF(pp_flip)
-PPDEF(pp_flop)
-PPDEF(pp_and)
-PPDEF(pp_or)
-PPDEF(pp_xor)
-PPDEF(pp_cond_expr)
-PPDEF(pp_andassign)
-PPDEF(pp_orassign)
-PPDEF(pp_method)
-PPDEF(pp_entersub)
-PPDEF(pp_leavesub)
-PPDEF(pp_caller)
-PPDEF(pp_warn)
-PPDEF(pp_die)
-PPDEF(pp_reset)
-PPDEF(pp_lineseq)
-PPDEF(pp_nextstate)
-PPDEF(pp_dbstate)
-PPDEF(pp_unstack)
-PPDEF(pp_enter)
-PPDEF(pp_leave)
-PPDEF(pp_scope)
-PPDEF(pp_enteriter)
-PPDEF(pp_iter)
-PPDEF(pp_enterloop)
-PPDEF(pp_leaveloop)
-PPDEF(pp_return)
-PPDEF(pp_last)
-PPDEF(pp_next)
-PPDEF(pp_redo)
-PPDEF(pp_dump)
-PPDEF(pp_goto)
-PPDEF(pp_exit)
-PPDEF(pp_open)
-PPDEF(pp_close)
-PPDEF(pp_pipe_op)
-PPDEF(pp_fileno)
-PPDEF(pp_umask)
-PPDEF(pp_binmode)
-PPDEF(pp_tie)
-PPDEF(pp_untie)
-PPDEF(pp_tied)
-PPDEF(pp_dbmopen)
-PPDEF(pp_dbmclose)
-PPDEF(pp_sselect)
-PPDEF(pp_select)
-PPDEF(pp_getc)
-PPDEF(pp_read)
-PPDEF(pp_enterwrite)
-PPDEF(pp_leavewrite)
-PPDEF(pp_prtf)
-PPDEF(pp_print)
-PPDEF(pp_sysopen)
-PPDEF(pp_sysseek)
-PPDEF(pp_sysread)
-PPDEF(pp_syswrite)
-PPDEF(pp_send)
-PPDEF(pp_recv)
-PPDEF(pp_eof)
-PPDEF(pp_tell)
-PPDEF(pp_seek)
-PPDEF(pp_truncate)
-PPDEF(pp_fcntl)
-PPDEF(pp_ioctl)
-PPDEF(pp_flock)
-PPDEF(pp_socket)
-PPDEF(pp_sockpair)
-PPDEF(pp_bind)
-PPDEF(pp_connect)
-PPDEF(pp_listen)
-PPDEF(pp_accept)
-PPDEF(pp_shutdown)
-PPDEF(pp_gsockopt)
-PPDEF(pp_ssockopt)
-PPDEF(pp_getsockname)
-PPDEF(pp_getpeername)
-PPDEF(pp_lstat)
-PPDEF(pp_stat)
-PPDEF(pp_ftrread)
-PPDEF(pp_ftrwrite)
-PPDEF(pp_ftrexec)
-PPDEF(pp_fteread)
-PPDEF(pp_ftewrite)
-PPDEF(pp_fteexec)
-PPDEF(pp_ftis)
-PPDEF(pp_fteowned)
-PPDEF(pp_ftrowned)
-PPDEF(pp_ftzero)
-PPDEF(pp_ftsize)
-PPDEF(pp_ftmtime)
-PPDEF(pp_ftatime)
-PPDEF(pp_ftctime)
-PPDEF(pp_ftsock)
-PPDEF(pp_ftchr)
-PPDEF(pp_ftblk)
-PPDEF(pp_ftfile)
-PPDEF(pp_ftdir)
-PPDEF(pp_ftpipe)
-PPDEF(pp_ftlink)
-PPDEF(pp_ftsuid)
-PPDEF(pp_ftsgid)
-PPDEF(pp_ftsvtx)
-PPDEF(pp_fttty)
-PPDEF(pp_fttext)
-PPDEF(pp_ftbinary)
-PPDEF(pp_chdir)
-PPDEF(pp_chown)
-PPDEF(pp_chroot)
-PPDEF(pp_unlink)
-PPDEF(pp_chmod)
-PPDEF(pp_utime)
-PPDEF(pp_rename)
-PPDEF(pp_link)
-PPDEF(pp_symlink)
-PPDEF(pp_readlink)
-PPDEF(pp_mkdir)
-PPDEF(pp_rmdir)
-PPDEF(pp_open_dir)
-PPDEF(pp_readdir)
-PPDEF(pp_telldir)
-PPDEF(pp_seekdir)
-PPDEF(pp_rewinddir)
-PPDEF(pp_closedir)
-PPDEF(pp_fork)
-PPDEF(pp_wait)
-PPDEF(pp_waitpid)
-PPDEF(pp_system)
-PPDEF(pp_exec)
-PPDEF(pp_kill)
-PPDEF(pp_getppid)
-PPDEF(pp_getpgrp)
-PPDEF(pp_setpgrp)
-PPDEF(pp_getpriority)
-PPDEF(pp_setpriority)
-PPDEF(pp_time)
-PPDEF(pp_tms)
-PPDEF(pp_localtime)
-PPDEF(pp_gmtime)
-PPDEF(pp_alarm)
-PPDEF(pp_sleep)
-PPDEF(pp_shmget)
-PPDEF(pp_shmctl)
-PPDEF(pp_shmread)
-PPDEF(pp_shmwrite)
-PPDEF(pp_msgget)
-PPDEF(pp_msgctl)
-PPDEF(pp_msgsnd)
-PPDEF(pp_msgrcv)
-PPDEF(pp_semget)
-PPDEF(pp_semctl)
-PPDEF(pp_semop)
-PPDEF(pp_require)
-PPDEF(pp_dofile)
-PPDEF(pp_entereval)
-PPDEF(pp_leaveeval)
-PPDEF(pp_entertry)
-PPDEF(pp_leavetry)
-PPDEF(pp_ghbyname)
-PPDEF(pp_ghbyaddr)
-PPDEF(pp_ghostent)
-PPDEF(pp_gnbyname)
-PPDEF(pp_gnbyaddr)
-PPDEF(pp_gnetent)
-PPDEF(pp_gpbyname)
-PPDEF(pp_gpbynumber)
-PPDEF(pp_gprotoent)
-PPDEF(pp_gsbyname)
-PPDEF(pp_gsbyport)
-PPDEF(pp_gservent)
-PPDEF(pp_shostent)
-PPDEF(pp_snetent)
-PPDEF(pp_sprotoent)
-PPDEF(pp_sservent)
-PPDEF(pp_ehostent)
-PPDEF(pp_enetent)
-PPDEF(pp_eprotoent)
-PPDEF(pp_eservent)
-PPDEF(pp_gpwnam)
-PPDEF(pp_gpwuid)
-PPDEF(pp_gpwent)
-PPDEF(pp_spwent)
-PPDEF(pp_epwent)
-PPDEF(pp_ggrnam)
-PPDEF(pp_ggrgid)
-PPDEF(pp_ggrent)
-PPDEF(pp_sgrent)
-PPDEF(pp_egrent)
-PPDEF(pp_getlogin)
-PPDEF(pp_syscall)
-PPDEF(pp_lock)
-PPDEF(pp_threadsv)
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
+PERL_CKDEF(Perl_ck_anoncode)
+PERL_CKDEF(Perl_ck_bitop)
+PERL_CKDEF(Perl_ck_concat)
+PERL_CKDEF(Perl_ck_defined)
+PERL_CKDEF(Perl_ck_delete)
+PERL_CKDEF(Perl_ck_eof)
+PERL_CKDEF(Perl_ck_eval)
+PERL_CKDEF(Perl_ck_exec)
+PERL_CKDEF(Perl_ck_exists)
+PERL_CKDEF(Perl_ck_exit)
+PERL_CKDEF(Perl_ck_ftst)
+PERL_CKDEF(Perl_ck_fun)
+PERL_CKDEF(Perl_ck_fun_locale)
+PERL_CKDEF(Perl_ck_glob)
+PERL_CKDEF(Perl_ck_grep)
+PERL_CKDEF(Perl_ck_index)
+PERL_CKDEF(Perl_ck_join)
+PERL_CKDEF(Perl_ck_lengthconst)
+PERL_CKDEF(Perl_ck_lfun)
+PERL_CKDEF(Perl_ck_listiob)
+PERL_CKDEF(Perl_ck_match)
+PERL_CKDEF(Perl_ck_method)
+PERL_CKDEF(Perl_ck_null)
+PERL_CKDEF(Perl_ck_open)
+PERL_CKDEF(Perl_ck_repeat)
+PERL_CKDEF(Perl_ck_require)
+PERL_CKDEF(Perl_ck_rfun)
+PERL_CKDEF(Perl_ck_rvconst)
+PERL_CKDEF(Perl_ck_sassign)
+PERL_CKDEF(Perl_ck_scmp)
+PERL_CKDEF(Perl_ck_select)
+PERL_CKDEF(Perl_ck_shift)
+PERL_CKDEF(Perl_ck_sort)
+PERL_CKDEF(Perl_ck_spair)
+PERL_CKDEF(Perl_ck_split)
+PERL_CKDEF(Perl_ck_subr)
+PERL_CKDEF(Perl_ck_svconst)
+PERL_CKDEF(Perl_ck_trunc)
+
+
+PERL_PPDEF(Perl_pp_null)
+PERL_PPDEF(Perl_pp_stub)
+PERL_PPDEF(Perl_pp_scalar)
+PERL_PPDEF(Perl_pp_pushmark)
+PERL_PPDEF(Perl_pp_wantarray)
+PERL_PPDEF(Perl_pp_const)
+PERL_PPDEF(Perl_pp_gvsv)
+PERL_PPDEF(Perl_pp_gv)
+PERL_PPDEF(Perl_pp_gelem)
+PERL_PPDEF(Perl_pp_padsv)
+PERL_PPDEF(Perl_pp_padav)
+PERL_PPDEF(Perl_pp_padhv)
+PERL_PPDEF(Perl_pp_padany)
+PERL_PPDEF(Perl_pp_pushre)
+PERL_PPDEF(Perl_pp_rv2gv)
+PERL_PPDEF(Perl_pp_rv2sv)
+PERL_PPDEF(Perl_pp_av2arylen)
+PERL_PPDEF(Perl_pp_rv2cv)
+PERL_PPDEF(Perl_pp_anoncode)
+PERL_PPDEF(Perl_pp_prototype)
+PERL_PPDEF(Perl_pp_refgen)
+PERL_PPDEF(Perl_pp_srefgen)
+PERL_PPDEF(Perl_pp_ref)
+PERL_PPDEF(Perl_pp_bless)
+PERL_PPDEF(Perl_pp_backtick)
+PERL_PPDEF(Perl_pp_glob)
+PERL_PPDEF(Perl_pp_readline)
+PERL_PPDEF(Perl_pp_rcatline)
+PERL_PPDEF(Perl_pp_regcmaybe)
+PERL_PPDEF(Perl_pp_regcreset)
+PERL_PPDEF(Perl_pp_regcomp)
+PERL_PPDEF(Perl_pp_match)
+PERL_PPDEF(Perl_pp_qr)
+PERL_PPDEF(Perl_pp_subst)
+PERL_PPDEF(Perl_pp_substcont)
+PERL_PPDEF(Perl_pp_trans)
+PERL_PPDEF(Perl_pp_sassign)
+PERL_PPDEF(Perl_pp_aassign)
+PERL_PPDEF(Perl_pp_chop)
+PERL_PPDEF(Perl_pp_schop)
+PERL_PPDEF(Perl_pp_chomp)
+PERL_PPDEF(Perl_pp_schomp)
+PERL_PPDEF(Perl_pp_defined)
+PERL_PPDEF(Perl_pp_undef)
+PERL_PPDEF(Perl_pp_study)
+PERL_PPDEF(Perl_pp_pos)
+PERL_PPDEF(Perl_pp_preinc)
+PERL_PPDEF(Perl_pp_predec)
+PERL_PPDEF(Perl_pp_postinc)
+PERL_PPDEF(Perl_pp_postdec)
+PERL_PPDEF(Perl_pp_pow)
+PERL_PPDEF(Perl_pp_multiply)
+PERL_PPDEF(Perl_pp_i_multiply)
+PERL_PPDEF(Perl_pp_divide)
+PERL_PPDEF(Perl_pp_i_divide)
+PERL_PPDEF(Perl_pp_modulo)
+PERL_PPDEF(Perl_pp_i_modulo)
+PERL_PPDEF(Perl_pp_repeat)
+PERL_PPDEF(Perl_pp_add)
+PERL_PPDEF(Perl_pp_i_add)
+PERL_PPDEF(Perl_pp_subtract)
+PERL_PPDEF(Perl_pp_i_subtract)
+PERL_PPDEF(Perl_pp_concat)
+PERL_PPDEF(Perl_pp_stringify)
+PERL_PPDEF(Perl_pp_left_shift)
+PERL_PPDEF(Perl_pp_right_shift)
+PERL_PPDEF(Perl_pp_lt)
+PERL_PPDEF(Perl_pp_i_lt)
+PERL_PPDEF(Perl_pp_gt)
+PERL_PPDEF(Perl_pp_i_gt)
+PERL_PPDEF(Perl_pp_le)
+PERL_PPDEF(Perl_pp_i_le)
+PERL_PPDEF(Perl_pp_ge)
+PERL_PPDEF(Perl_pp_i_ge)
+PERL_PPDEF(Perl_pp_eq)
+PERL_PPDEF(Perl_pp_i_eq)
+PERL_PPDEF(Perl_pp_ne)
+PERL_PPDEF(Perl_pp_i_ne)
+PERL_PPDEF(Perl_pp_ncmp)
+PERL_PPDEF(Perl_pp_i_ncmp)
+PERL_PPDEF(Perl_pp_slt)
+PERL_PPDEF(Perl_pp_sgt)
+PERL_PPDEF(Perl_pp_sle)
+PERL_PPDEF(Perl_pp_sge)
+PERL_PPDEF(Perl_pp_seq)
+PERL_PPDEF(Perl_pp_sne)
+PERL_PPDEF(Perl_pp_scmp)
+PERL_PPDEF(Perl_pp_bit_and)
+PERL_PPDEF(Perl_pp_bit_xor)
+PERL_PPDEF(Perl_pp_bit_or)
+PERL_PPDEF(Perl_pp_negate)
+PERL_PPDEF(Perl_pp_i_negate)
+PERL_PPDEF(Perl_pp_not)
+PERL_PPDEF(Perl_pp_complement)
+PERL_PPDEF(Perl_pp_atan2)
+PERL_PPDEF(Perl_pp_sin)
+PERL_PPDEF(Perl_pp_cos)
+PERL_PPDEF(Perl_pp_rand)
+PERL_PPDEF(Perl_pp_srand)
+PERL_PPDEF(Perl_pp_exp)
+PERL_PPDEF(Perl_pp_log)
+PERL_PPDEF(Perl_pp_sqrt)
+PERL_PPDEF(Perl_pp_int)
+PERL_PPDEF(Perl_pp_hex)
+PERL_PPDEF(Perl_pp_oct)
+PERL_PPDEF(Perl_pp_abs)
+PERL_PPDEF(Perl_pp_length)
+PERL_PPDEF(Perl_pp_substr)
+PERL_PPDEF(Perl_pp_vec)
+PERL_PPDEF(Perl_pp_index)
+PERL_PPDEF(Perl_pp_rindex)
+PERL_PPDEF(Perl_pp_sprintf)
+PERL_PPDEF(Perl_pp_formline)
+PERL_PPDEF(Perl_pp_ord)
+PERL_PPDEF(Perl_pp_chr)
+PERL_PPDEF(Perl_pp_crypt)
+PERL_PPDEF(Perl_pp_ucfirst)
+PERL_PPDEF(Perl_pp_lcfirst)
+PERL_PPDEF(Perl_pp_uc)
+PERL_PPDEF(Perl_pp_lc)
+PERL_PPDEF(Perl_pp_quotemeta)
+PERL_PPDEF(Perl_pp_rv2av)
+PERL_PPDEF(Perl_pp_aelemfast)
+PERL_PPDEF(Perl_pp_aelem)
+PERL_PPDEF(Perl_pp_aslice)
+PERL_PPDEF(Perl_pp_each)
+PERL_PPDEF(Perl_pp_values)
+PERL_PPDEF(Perl_pp_keys)
+PERL_PPDEF(Perl_pp_delete)
+PERL_PPDEF(Perl_pp_exists)
+PERL_PPDEF(Perl_pp_rv2hv)
+PERL_PPDEF(Perl_pp_helem)
+PERL_PPDEF(Perl_pp_hslice)
+PERL_PPDEF(Perl_pp_unpack)
+PERL_PPDEF(Perl_pp_pack)
+PERL_PPDEF(Perl_pp_split)
+PERL_PPDEF(Perl_pp_join)
+PERL_PPDEF(Perl_pp_list)
+PERL_PPDEF(Perl_pp_lslice)
+PERL_PPDEF(Perl_pp_anonlist)
+PERL_PPDEF(Perl_pp_anonhash)
+PERL_PPDEF(Perl_pp_splice)
+PERL_PPDEF(Perl_pp_push)
+PERL_PPDEF(Perl_pp_pop)
+PERL_PPDEF(Perl_pp_shift)
+PERL_PPDEF(Perl_pp_unshift)
+PERL_PPDEF(Perl_pp_sort)
+PERL_PPDEF(Perl_pp_reverse)
+PERL_PPDEF(Perl_pp_grepstart)
+PERL_PPDEF(Perl_pp_grepwhile)
+PERL_PPDEF(Perl_pp_mapstart)
+PERL_PPDEF(Perl_pp_mapwhile)
+PERL_PPDEF(Perl_pp_range)
+PERL_PPDEF(Perl_pp_flip)
+PERL_PPDEF(Perl_pp_flop)
+PERL_PPDEF(Perl_pp_and)
+PERL_PPDEF(Perl_pp_or)
+PERL_PPDEF(Perl_pp_xor)
+PERL_PPDEF(Perl_pp_cond_expr)
+PERL_PPDEF(Perl_pp_andassign)
+PERL_PPDEF(Perl_pp_orassign)
+PERL_PPDEF(Perl_pp_method)
+PERL_PPDEF(Perl_pp_entersub)
+PERL_PPDEF(Perl_pp_leavesub)
+PERL_PPDEF(Perl_pp_leavesublv)
+PERL_PPDEF(Perl_pp_caller)
+PERL_PPDEF(Perl_pp_warn)
+PERL_PPDEF(Perl_pp_die)
+PERL_PPDEF(Perl_pp_reset)
+PERL_PPDEF(Perl_pp_lineseq)
+PERL_PPDEF(Perl_pp_nextstate)
+PERL_PPDEF(Perl_pp_dbstate)
+PERL_PPDEF(Perl_pp_unstack)
+PERL_PPDEF(Perl_pp_enter)
+PERL_PPDEF(Perl_pp_leave)
+PERL_PPDEF(Perl_pp_scope)
+PERL_PPDEF(Perl_pp_enteriter)
+PERL_PPDEF(Perl_pp_iter)
+PERL_PPDEF(Perl_pp_enterloop)
+PERL_PPDEF(Perl_pp_leaveloop)
+PERL_PPDEF(Perl_pp_return)
+PERL_PPDEF(Perl_pp_last)
+PERL_PPDEF(Perl_pp_next)
+PERL_PPDEF(Perl_pp_redo)
+PERL_PPDEF(Perl_pp_dump)
+PERL_PPDEF(Perl_pp_goto)
+PERL_PPDEF(Perl_pp_exit)
+PERL_PPDEF(Perl_pp_open)
+PERL_PPDEF(Perl_pp_close)
+PERL_PPDEF(Perl_pp_pipe_op)
+PERL_PPDEF(Perl_pp_fileno)
+PERL_PPDEF(Perl_pp_umask)
+PERL_PPDEF(Perl_pp_binmode)
+PERL_PPDEF(Perl_pp_tie)
+PERL_PPDEF(Perl_pp_untie)
+PERL_PPDEF(Perl_pp_tied)
+PERL_PPDEF(Perl_pp_dbmopen)
+PERL_PPDEF(Perl_pp_dbmclose)
+PERL_PPDEF(Perl_pp_sselect)
+PERL_PPDEF(Perl_pp_select)
+PERL_PPDEF(Perl_pp_getc)
+PERL_PPDEF(Perl_pp_read)
+PERL_PPDEF(Perl_pp_enterwrite)
+PERL_PPDEF(Perl_pp_leavewrite)
+PERL_PPDEF(Perl_pp_prtf)
+PERL_PPDEF(Perl_pp_print)
+PERL_PPDEF(Perl_pp_sysopen)
+PERL_PPDEF(Perl_pp_sysseek)
+PERL_PPDEF(Perl_pp_sysread)
+PERL_PPDEF(Perl_pp_syswrite)
+PERL_PPDEF(Perl_pp_send)
+PERL_PPDEF(Perl_pp_recv)
+PERL_PPDEF(Perl_pp_eof)
+PERL_PPDEF(Perl_pp_tell)
+PERL_PPDEF(Perl_pp_seek)
+PERL_PPDEF(Perl_pp_truncate)
+PERL_PPDEF(Perl_pp_fcntl)
+PERL_PPDEF(Perl_pp_ioctl)
+PERL_PPDEF(Perl_pp_flock)
+PERL_PPDEF(Perl_pp_socket)
+PERL_PPDEF(Perl_pp_sockpair)
+PERL_PPDEF(Perl_pp_bind)
+PERL_PPDEF(Perl_pp_connect)
+PERL_PPDEF(Perl_pp_listen)
+PERL_PPDEF(Perl_pp_accept)
+PERL_PPDEF(Perl_pp_shutdown)
+PERL_PPDEF(Perl_pp_gsockopt)
+PERL_PPDEF(Perl_pp_ssockopt)
+PERL_PPDEF(Perl_pp_getsockname)
+PERL_PPDEF(Perl_pp_getpeername)
+PERL_PPDEF(Perl_pp_lstat)
+PERL_PPDEF(Perl_pp_stat)
+PERL_PPDEF(Perl_pp_ftrread)
+PERL_PPDEF(Perl_pp_ftrwrite)
+PERL_PPDEF(Perl_pp_ftrexec)
+PERL_PPDEF(Perl_pp_fteread)
+PERL_PPDEF(Perl_pp_ftewrite)
+PERL_PPDEF(Perl_pp_fteexec)
+PERL_PPDEF(Perl_pp_ftis)
+PERL_PPDEF(Perl_pp_fteowned)
+PERL_PPDEF(Perl_pp_ftrowned)
+PERL_PPDEF(Perl_pp_ftzero)
+PERL_PPDEF(Perl_pp_ftsize)
+PERL_PPDEF(Perl_pp_ftmtime)
+PERL_PPDEF(Perl_pp_ftatime)
+PERL_PPDEF(Perl_pp_ftctime)
+PERL_PPDEF(Perl_pp_ftsock)
+PERL_PPDEF(Perl_pp_ftchr)
+PERL_PPDEF(Perl_pp_ftblk)
+PERL_PPDEF(Perl_pp_ftfile)
+PERL_PPDEF(Perl_pp_ftdir)
+PERL_PPDEF(Perl_pp_ftpipe)
+PERL_PPDEF(Perl_pp_ftlink)
+PERL_PPDEF(Perl_pp_ftsuid)
+PERL_PPDEF(Perl_pp_ftsgid)
+PERL_PPDEF(Perl_pp_ftsvtx)
+PERL_PPDEF(Perl_pp_fttty)
+PERL_PPDEF(Perl_pp_fttext)
+PERL_PPDEF(Perl_pp_ftbinary)
+PERL_PPDEF(Perl_pp_chdir)
+PERL_PPDEF(Perl_pp_chown)
+PERL_PPDEF(Perl_pp_chroot)
+PERL_PPDEF(Perl_pp_unlink)
+PERL_PPDEF(Perl_pp_chmod)
+PERL_PPDEF(Perl_pp_utime)
+PERL_PPDEF(Perl_pp_rename)
+PERL_PPDEF(Perl_pp_link)
+PERL_PPDEF(Perl_pp_symlink)
+PERL_PPDEF(Perl_pp_readlink)
+PERL_PPDEF(Perl_pp_mkdir)
+PERL_PPDEF(Perl_pp_rmdir)
+PERL_PPDEF(Perl_pp_open_dir)
+PERL_PPDEF(Perl_pp_readdir)
+PERL_PPDEF(Perl_pp_telldir)
+PERL_PPDEF(Perl_pp_seekdir)
+PERL_PPDEF(Perl_pp_rewinddir)
+PERL_PPDEF(Perl_pp_closedir)
+PERL_PPDEF(Perl_pp_fork)
+PERL_PPDEF(Perl_pp_wait)
+PERL_PPDEF(Perl_pp_waitpid)
+PERL_PPDEF(Perl_pp_system)
+PERL_PPDEF(Perl_pp_exec)
+PERL_PPDEF(Perl_pp_kill)
+PERL_PPDEF(Perl_pp_getppid)
+PERL_PPDEF(Perl_pp_getpgrp)
+PERL_PPDEF(Perl_pp_setpgrp)
+PERL_PPDEF(Perl_pp_getpriority)
+PERL_PPDEF(Perl_pp_setpriority)
+PERL_PPDEF(Perl_pp_time)
+PERL_PPDEF(Perl_pp_tms)
+PERL_PPDEF(Perl_pp_localtime)
+PERL_PPDEF(Perl_pp_gmtime)
+PERL_PPDEF(Perl_pp_alarm)
+PERL_PPDEF(Perl_pp_sleep)
+PERL_PPDEF(Perl_pp_shmget)
+PERL_PPDEF(Perl_pp_shmctl)
+PERL_PPDEF(Perl_pp_shmread)
+PERL_PPDEF(Perl_pp_shmwrite)
+PERL_PPDEF(Perl_pp_msgget)
+PERL_PPDEF(Perl_pp_msgctl)
+PERL_PPDEF(Perl_pp_msgsnd)
+PERL_PPDEF(Perl_pp_msgrcv)
+PERL_PPDEF(Perl_pp_semget)
+PERL_PPDEF(Perl_pp_semctl)
+PERL_PPDEF(Perl_pp_semop)
+PERL_PPDEF(Perl_pp_require)
+PERL_PPDEF(Perl_pp_dofile)
+PERL_PPDEF(Perl_pp_entereval)
+PERL_PPDEF(Perl_pp_leaveeval)
+PERL_PPDEF(Perl_pp_entertry)
+PERL_PPDEF(Perl_pp_leavetry)
+PERL_PPDEF(Perl_pp_ghbyname)
+PERL_PPDEF(Perl_pp_ghbyaddr)
+PERL_PPDEF(Perl_pp_ghostent)
+PERL_PPDEF(Perl_pp_gnbyname)
+PERL_PPDEF(Perl_pp_gnbyaddr)
+PERL_PPDEF(Perl_pp_gnetent)
+PERL_PPDEF(Perl_pp_gpbyname)
+PERL_PPDEF(Perl_pp_gpbynumber)
+PERL_PPDEF(Perl_pp_gprotoent)
+PERL_PPDEF(Perl_pp_gsbyname)
+PERL_PPDEF(Perl_pp_gsbyport)
+PERL_PPDEF(Perl_pp_gservent)
+PERL_PPDEF(Perl_pp_shostent)
+PERL_PPDEF(Perl_pp_snetent)
+PERL_PPDEF(Perl_pp_sprotoent)
+PERL_PPDEF(Perl_pp_sservent)
+PERL_PPDEF(Perl_pp_ehostent)
+PERL_PPDEF(Perl_pp_enetent)
+PERL_PPDEF(Perl_pp_eprotoent)
+PERL_PPDEF(Perl_pp_eservent)
+PERL_PPDEF(Perl_pp_gpwnam)
+PERL_PPDEF(Perl_pp_gpwuid)
+PERL_PPDEF(Perl_pp_gpwent)
+PERL_PPDEF(Perl_pp_spwent)
+PERL_PPDEF(Perl_pp_epwent)
+PERL_PPDEF(Perl_pp_ggrnam)
+PERL_PPDEF(Perl_pp_ggrgid)
+PERL_PPDEF(Perl_pp_ggrent)
+PERL_PPDEF(Perl_pp_sgrent)
+PERL_PPDEF(Perl_pp_egrent)
+PERL_PPDEF(Perl_pp_getlogin)
+PERL_PPDEF(Perl_pp_syscall)
+PERL_PPDEF(Perl_pp_lock)
+PERL_PPDEF(Perl_pp_threadsv)
+PERL_PPDEF(Perl_pp_setstate)
+PERL_PPDEF(Perl_pp_method_named)
diff --git a/contrib/perl5/pp_sys.c b/contrib/perl5/pp_sys.c
index 1f3b119..0ec539d 100644
--- a/contrib/perl5/pp_sys.c
+++ b/contrib/perl5/pp_sys.c
@@ -1,6 +1,6 @@
/* pp_sys.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -15,8 +15,21 @@
*/
#include "EXTERN.h"
+#define PERL_IN_PP_SYS_C
#include "perl.h"
+#ifdef I_SHADOW
+/* Shadow password support for solaris - pdo@cs.umd.edu
+ * Not just Solaris: at least HP-UX, IRIX, Linux.
+ * the API is from SysV. --jhi */
+#ifdef __hpux__
+/* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
+ * and another MAXINT from "perl.h" <- <sys/param.h>. */
+#undef MAXINT
+#endif
+#include <shadow.h>
+#endif
+
/* XXX If this causes problems, set i_unistd=undef in the hint file. */
#ifdef I_UNISTD
# include <unistd.h>
@@ -38,6 +51,9 @@ extern "C" int syscall(unsigned long,...);
#if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
# include <sys/socket.h>
+# if defined(USE_SOCKS) && defined(I_SOCKS)
+# include <socks.h>
+# endif
# ifdef I_NETDB
# include <netdb.h>
# endif
@@ -61,7 +77,7 @@ extern "C" int syscall(unsigned long,...);
compiling multithreaded and singlethreaded ($ccflags et al).
HOST_NOT_FOUND is typically defined in <netdb.h>.
*/
-#if defined(HOST_NOT_FOUND) && !defined(h_errno)
+#if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
extern int h_errno;
#endif
@@ -69,11 +85,11 @@ extern int h_errno;
# ifdef I_PWD
# include <pwd.h>
# else
- struct passwd *getpwnam _((char *));
- struct passwd *getpwuid _((Uid_t));
+ struct passwd *getpwnam (char *);
+ struct passwd *getpwuid (Uid_t);
# endif
# ifdef HAS_GETPWENT
- struct passwd *getpwent _((void));
+ struct passwd *getpwent (void);
# endif
#endif
@@ -81,11 +97,11 @@ extern int h_errno;
# ifdef I_GRP
# include <grp.h>
# else
- struct group *getgrnam _((char *));
- struct group *getgrgid _((Gid_t));
+ struct group *getgrnam (char *);
+ struct group *getgrgid (Gid_t);
# endif
# ifdef HAS_GETGRENT
- struct group *getgrent _((void));
+ struct group *getgrent (void);
# endif
#endif
@@ -96,31 +112,12 @@ extern int h_errno;
# include <utime.h>
# endif
#endif
-#ifdef I_FCNTL
-#include <fcntl.h>
-#endif
-#ifdef I_SYS_FILE
-#include <sys/file.h>
-#endif
/* Put this after #includes because fork and vfork prototypes may conflict. */
#ifndef HAS_VFORK
# define vfork fork
#endif
-/* Put this after #includes because <unistd.h> defines _XOPEN_*. */
-#ifndef Sock_size_t
-# if _XOPEN_VERSION >= 5 || defined(_XOPEN_SOURCE_EXTENDED) || defined(__GLIBC__)
-# define Sock_size_t Size_t
-# else
-# define Sock_size_t int
-# endif
-#endif
-
-#if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
-static int dooneliner _((char *cmd, char *filename));
-#endif
-
#ifdef HAS_CHSIZE
# ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
# undef my_chsize
@@ -151,7 +148,7 @@ static int dooneliner _((char *cmd, char *filename));
# endif /* no flock() or fcntl(F_SETLK,...) */
# ifdef FLOCK
- static int FLOCK _((int, int));
+ static int FLOCK (int, int);
/*
* These are the flock() constants. Since this sytems doesn't have
@@ -173,18 +170,132 @@ static int dooneliner _((char *cmd, char *filename));
#endif /* no flock() */
-#ifndef MAXPATHLEN
-# ifdef PATH_MAX
-# define MAXPATHLEN PATH_MAX
-# else
-# define MAXPATHLEN 1024
-# endif
-#endif
-
#define ZBTLEN 10
static char zero_but_true[ZBTLEN + 1] = "0 but true";
-/* Pushy I/O. */
+#if defined(I_SYS_ACCESS) && !defined(R_OK)
+# include <sys/access.h>
+#endif
+
+#if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
+# define FD_CLOEXEC 1 /* NeXT needs this */
+#endif
+
+#undef PERL_EFF_ACCESS_R_OK /* EFFective uid/gid ACCESS R_OK */
+#undef PERL_EFF_ACCESS_W_OK
+#undef PERL_EFF_ACCESS_X_OK
+
+/* F_OK unused: if stat() cannot find it... */
+
+#if !defined(PERL_EFF_ACCESS_R_OK) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
+ /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
+# define PERL_EFF_ACCESS_R_OK(p) (access((p), R_OK | EFF_ONLY_OK))
+# define PERL_EFF_ACCESS_W_OK(p) (access((p), W_OK | EFF_ONLY_OK))
+# define PERL_EFF_ACCESS_X_OK(p) (access((p), X_OK | EFF_ONLY_OK))
+#endif
+
+#if !defined(PERL_EFF_ACCESS_R_OK) && defined(HAS_EACCESS)
+# if defined(I_SYS_SECURITY)
+# include <sys/security.h>
+# endif
+ /* XXX Configure test needed for eaccess */
+# ifdef ACC_SELF
+ /* HP SecureWare */
+# define PERL_EFF_ACCESS_R_OK(p) (eaccess((p), R_OK, ACC_SELF))
+# define PERL_EFF_ACCESS_W_OK(p) (eaccess((p), W_OK, ACC_SELF))
+# define PERL_EFF_ACCESS_X_OK(p) (eaccess((p), X_OK, ACC_SELF))
+# else
+ /* SCO */
+# define PERL_EFF_ACCESS_R_OK(p) (eaccess((p), R_OK))
+# define PERL_EFF_ACCESS_W_OK(p) (eaccess((p), W_OK))
+# define PERL_EFF_ACCESS_X_OK(p) (eaccess((p), X_OK))
+# endif
+#endif
+
+#if !defined(PERL_EFF_ACCESS_R_OK) && defined(HAS_ACCESSX) && defined(ACC_SELF)
+ /* AIX */
+# define PERL_EFF_ACCESS_R_OK(p) (accessx((p), R_OK, ACC_SELF))
+# define PERL_EFF_ACCESS_W_OK(p) (accessx((p), W_OK, ACC_SELF))
+# define PERL_EFF_ACCESS_X_OK(p) (accessx((p), X_OK, ACC_SELF))
+#endif
+
+#if !defined(PERL_EFF_ACCESS_R_OK) && defined(HAS_ACCESS) \
+ && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
+ || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
+/* The Hard Way. */
+STATIC int
+S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
+{
+ Uid_t ruid = getuid();
+ Uid_t euid = geteuid();
+ Gid_t rgid = getgid();
+ Gid_t egid = getegid();
+ int res;
+
+ LOCK_CRED_MUTEX;
+#if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
+ Perl_croak(aTHX_ "switching effective uid is not implemented");
+#else
+#ifdef HAS_SETREUID
+ if (setreuid(euid, ruid))
+#else
+#ifdef HAS_SETRESUID
+ if (setresuid(euid, ruid, (Uid_t)-1))
+#endif
+#endif
+ Perl_croak(aTHX_ "entering effective uid failed");
+#endif
+
+#if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
+ Perl_croak(aTHX_ "switching effective gid is not implemented");
+#else
+#ifdef HAS_SETREGID
+ if (setregid(egid, rgid))
+#else
+#ifdef HAS_SETRESGID
+ if (setresgid(egid, rgid, (Gid_t)-1))
+#endif
+#endif
+ Perl_croak(aTHX_ "entering effective gid failed");
+#endif
+
+ res = access(path, mode);
+
+#ifdef HAS_SETREUID
+ if (setreuid(ruid, euid))
+#else
+#ifdef HAS_SETRESUID
+ if (setresuid(ruid, euid, (Uid_t)-1))
+#endif
+#endif
+ Perl_croak(aTHX_ "leaving effective uid failed");
+
+#ifdef HAS_SETREGID
+ if (setregid(rgid, egid))
+#else
+#ifdef HAS_SETRESGID
+ if (setresgid(rgid, egid, (Gid_t)-1))
+#endif
+#endif
+ Perl_croak(aTHX_ "leaving effective gid failed");
+ UNLOCK_CRED_MUTEX;
+
+ return res;
+}
+# define PERL_EFF_ACCESS_R_OK(p) (emulate_eaccess((p), R_OK))
+# define PERL_EFF_ACCESS_W_OK(p) (emulate_eaccess((p), W_OK))
+# define PERL_EFF_ACCESS_X_OK(p) (emulate_eaccess((p), X_OK))
+#endif
+
+#if !defined(PERL_EFF_ACCESS_R_OK)
+STATIC int
+S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
+{
+ Perl_croak(aTHX_ "switching effective uid is not implemented");
+ /*NOTREACHED*/
+ return -1;
+}
+#endif
PP(pp_backtick)
{
@@ -193,9 +304,14 @@ PP(pp_backtick)
STRLEN n_a;
char *tmps = POPpx;
I32 gimme = GIMME_V;
+ char *mode = "r";
TAINT_PROPER("``");
- fp = PerlProc_popen(tmps, "r");
+ if (PL_op->op_private & OPpOPEN_IN_RAW)
+ mode = "rb";
+ else if (PL_op->op_private & OPpOPEN_IN_CRLF)
+ mode = "rt";
+ fp = PerlProc_popen(tmps, mode);
if (fp) {
if (gimme == G_VOID) {
char tmpbuf[256];
@@ -243,6 +359,12 @@ PP(pp_backtick)
PP(pp_glob)
{
OP *result;
+ tryAMAGICunTARGET(iter, -1);
+
+ /* Note that we only ever get here if File::Glob fails to load
+ * without at the same time croaking, for some reason, or if
+ * perl was built with PERL_EXTERNAL_GLOB */
+
ENTER;
#ifndef VMS
@@ -252,7 +374,7 @@ PP(pp_glob)
* so for security reasons we must assume the worst.
*/
TAINT;
- taint_proper(no_security, "glob");
+ taint_proper(PL_no_security, "glob");
}
#endif /* !VMS */
@@ -260,7 +382,7 @@ PP(pp_glob)
PL_last_in_gv = (GV*)*PL_stack_sp--;
SAVESPTR(PL_rs); /* This is not permanent, either. */
- PL_rs = sv_2mortal(newSVpv("", 1));
+ PL_rs = sv_2mortal(newSVpvn("\000", 1));
#ifndef DOSISH
#ifndef CSH
*SvPVX(PL_rs) = '\n';
@@ -283,34 +405,38 @@ PP(pp_indread)
PP(pp_rcatline)
{
- PL_last_in_gv = cGVOP->op_gv;
+ PL_last_in_gv = cGVOP_gv;
return do_readline();
}
PP(pp_warn)
{
djSP; dMARK;
+ SV *tmpsv;
char *tmps;
- STRLEN n_a;
+ STRLEN len;
if (SP - MARK != 1) {
dTARGET;
do_join(TARG, &PL_sv_no, MARK, SP);
- tmps = SvPV(TARG, n_a);
+ tmpsv = TARG;
SP = MARK + 1;
}
else {
- tmps = SvPV(TOPs, n_a);
+ tmpsv = TOPs;
}
- if (!tmps || !*tmps) {
+ tmps = SvPV(tmpsv, len);
+ if (!tmps || !len) {
SV *error = ERRSV;
(void)SvUPGRADE(error, SVt_PV);
if (SvPOK(error) && SvCUR(error))
sv_catpv(error, "\t...caught");
- tmps = SvPV(error, n_a);
+ tmpsv = error;
+ tmps = SvPV(tmpsv, len);
}
- if (!tmps || !*tmps)
- tmps = "Warning: something's wrong";
- warn("%s", tmps);
+ if (!tmps || !len)
+ tmpsv = sv_2mortal(newSVpvn("Warning: something's wrong", 26));
+
+ Perl_warn(aTHX_ "%"SVf, tmpsv);
RETSETYES;
}
@@ -318,53 +444,57 @@ PP(pp_die)
{
djSP; dMARK;
char *tmps;
- SV *tmpsv = Nullsv;
- char *pat = "%s";
- STRLEN n_a;
+ SV *tmpsv;
+ STRLEN len;
+ bool multiarg = 0;
if (SP - MARK != 1) {
dTARGET;
do_join(TARG, &PL_sv_no, MARK, SP);
- tmps = SvPV(TARG, n_a);
+ tmpsv = TARG;
+ tmps = SvPV(tmpsv, len);
+ multiarg = 1;
SP = MARK + 1;
}
else {
tmpsv = TOPs;
- tmps = SvROK(tmpsv) ? Nullch : SvPV(tmpsv, n_a);
+ tmps = SvROK(tmpsv) ? Nullch : SvPV(tmpsv, len);
}
- if (!tmps || !*tmps) {
+ if (!tmps || !len) {
SV *error = ERRSV;
(void)SvUPGRADE(error, SVt_PV);
- if(tmpsv ? SvROK(tmpsv) : SvROK(error)) {
- if(tmpsv)
+ if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
+ if (!multiarg)
SvSetSV(error,tmpsv);
- else if(sv_isobject(error)) {
+ else if (sv_isobject(error)) {
HV *stash = SvSTASH(SvRV(error));
GV *gv = gv_fetchmethod(stash, "PROPAGATE");
if (gv) {
- SV *file = sv_2mortal(newSVsv(GvSV(PL_curcop->cop_filegv)));
- SV *line = sv_2mortal(newSViv(PL_curcop->cop_line));
+ SV *file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
+ SV *line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
EXTEND(SP, 3);
PUSHMARK(SP);
PUSHs(error);
PUSHs(file);
PUSHs(line);
PUTBACK;
- perl_call_sv((SV*)GvCV(gv),
- G_SCALAR|G_EVAL|G_KEEPERR);
+ call_sv((SV*)GvCV(gv),
+ G_SCALAR|G_EVAL|G_KEEPERR);
sv_setsv(error,*PL_stack_sp--);
}
}
- pat = Nullch;
+ DIE(aTHX_ Nullch);
}
else {
if (SvPOK(error) && SvCUR(error))
sv_catpv(error, "\t...propagated");
- tmps = SvPV(error, n_a);
+ tmpsv = error;
+ tmps = SvPV(tmpsv, len);
}
}
- if (!tmps || !*tmps)
- tmps = "Died";
- DIE(pat, tmps);
+ if (!tmps || !len)
+ tmpsv = sv_2mortal(newSVpvn("Died", 4));
+
+ DIE(aTHX_ "%"SVf, tmpsv);
}
/* I/O. */
@@ -374,22 +504,44 @@ PP(pp_open)
djSP; dTARGET;
GV *gv;
SV *sv;
+ SV *name;
+ I32 have_name = 0;
char *tmps;
STRLEN len;
+ MAGIC *mg;
+ if (MAXARG > 2) {
+ name = POPs;
+ have_name = 1;
+ }
if (MAXARG > 1)
sv = POPs;
if (!isGV(TOPs))
- DIE(no_usym, "filehandle");
+ DIE(aTHX_ PL_no_usym, "filehandle");
if (MAXARG <= 1)
sv = GvSV(TOPs);
gv = (GV*)POPs;
if (!isGV(gv))
- DIE(no_usym, "filehandle");
+ DIE(aTHX_ PL_no_usym, "filehandle");
if (GvIOp(gv))
IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
+
+ if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
+ PUSHMARK(SP);
+ XPUSHs(SvTIED_obj((SV*)gv, mg));
+ XPUSHs(sv);
+ if (have_name)
+ XPUSHs(name);
+ PUTBACK;
+ ENTER;
+ call_method("OPEN", G_SCALAR);
+ LEAVE;
+ SPAGAIN;
+ RETURN;
+ }
+
tmps = SvPV(sv, len);
- if (do_open(gv, tmps, len, FALSE, O_RDONLY, 0, Nullfp))
+ if (do_open9(gv, tmps, len, FALSE, O_RDONLY, 0, Nullfp, name, have_name))
PUSHi( (I32)PL_forkprocess );
else if (PL_forkprocess == 0) /* we are a new child */
PUSHi(0);
@@ -409,12 +561,12 @@ PP(pp_close)
else
gv = (GV*)POPs;
- if (mg = SvTIED_mg((SV*)gv, 'q')) {
+ if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
PUSHMARK(SP);
XPUSHs(SvTIED_obj((SV*)gv, mg));
PUTBACK;
ENTER;
- perl_call_method("CLOSE", G_SCALAR);
+ call_method("CLOSE", G_SCALAR);
LEAVE;
SPAGAIN;
RETURN;
@@ -441,7 +593,7 @@ PP(pp_pipe_op)
goto badexit;
if (SvTYPE(rgv) != SVt_PVGV || SvTYPE(wgv) != SVt_PVGV)
- DIE(no_usym, "filehandle");
+ DIE(aTHX_ PL_no_usym, "filehandle");
rstio = GvIOn(rgv);
wstio = GvIOn(wgv);
@@ -475,7 +627,7 @@ PP(pp_pipe_op)
badexit:
RETPUSHUNDEF;
#else
- DIE(no_func, "pipe");
+ DIE(aTHX_ PL_no_func, "pipe");
#endif
}
@@ -485,9 +637,23 @@ PP(pp_fileno)
GV *gv;
IO *io;
PerlIO *fp;
+ MAGIC *mg;
+
if (MAXARG < 1)
RETPUSHUNDEF;
gv = (GV*)POPs;
+
+ if (gv && (mg = SvTIED_mg((SV*)gv, 'q'))) {
+ PUSHMARK(SP);
+ XPUSHs(SvTIED_obj((SV*)gv, mg));
+ PUTBACK;
+ ENTER;
+ call_method("FILENO", G_SCALAR);
+ LEAVE;
+ SPAGAIN;
+ RETURN;
+ }
+
if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io)))
RETPUSHUNDEF;
PUSHi(PerlIO_fileno(fp));
@@ -497,7 +663,7 @@ PP(pp_fileno)
PP(pp_umask)
{
djSP; dTARGET;
- int anum;
+ Mode_t anum;
#ifdef HAS_UMASK
if (MAXARG < 1) {
@@ -513,7 +679,7 @@ PP(pp_umask)
* Otherwise it's harmless and more useful to just return undef
* since 'group' and 'other' concepts probably don't exist here. */
if (MAXARG >= 1 && (POPi & 0700))
- DIE("umask not implemented");
+ DIE(aTHX_ "umask not implemented");
XPUSHs(&PL_sv_undef);
#endif
RETURN;
@@ -525,23 +691,39 @@ PP(pp_binmode)
GV *gv;
IO *io;
PerlIO *fp;
+ MAGIC *mg;
+ SV *discp = Nullsv;
if (MAXARG < 1)
RETPUSHUNDEF;
+ if (MAXARG > 1)
+ discp = POPs;
- gv = (GV*)POPs;
+ gv = (GV*)POPs;
+
+ if (gv && (mg = SvTIED_mg((SV*)gv, 'q'))) {
+ PUSHMARK(SP);
+ XPUSHs(SvTIED_obj((SV*)gv, mg));
+ if (discp)
+ XPUSHs(discp);
+ PUTBACK;
+ ENTER;
+ call_method("BINMODE", G_SCALAR);
+ LEAVE;
+ SPAGAIN;
+ RETURN;
+ }
EXTEND(SP, 1);
if (!(io = GvIO(gv)) || !(fp = IoIFP(io)))
RETPUSHUNDEF;
- if (do_binmode(fp,IoTYPE(io),TRUE))
+ if (do_binmode(fp,IoTYPE(io),mode_from_discipline(discp)))
RETPUSHYES;
else
RETPUSHUNDEF;
}
-
PP(pp_tie)
{
djSP;
@@ -554,6 +736,7 @@ PP(pp_tie)
char *methname;
int how = 'P';
U32 items;
+ STRLEN n_a;
varsv = *++MARK;
switch(SvTYPE(varsv)) {
@@ -581,16 +764,15 @@ PP(pp_tie)
while (items--)
PUSHs(*MARK++);
PUTBACK;
- perl_call_method(methname, G_SCALAR);
+ call_method(methname, G_SCALAR);
}
else {
- /* Not clear why we don't call perl_call_method here too.
+ /* Not clear why we don't call call_method here too.
* perhaps to get different error message ?
*/
stash = gv_stashsv(*MARK, FALSE);
if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
- STRLEN n_a;
- DIE("Can't locate object method \"%s\" via package \"%s\"",
+ DIE(aTHX_ "Can't locate object method \"%s\" via package \"%s\"",
methname, SvPV(*MARK,n_a));
}
ENTER;
@@ -600,7 +782,7 @@ PP(pp_tie)
while (items--)
PUSHs(*MARK++);
PUTBACK;
- perl_call_sv((SV*)GvCV(gv), G_SCALAR);
+ call_sv((SV*)GvCV(gv), G_SCALAR);
}
SPAGAIN;
@@ -622,12 +804,13 @@ PP(pp_untie)
SV *sv = POPs;
char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) ? 'P' : 'q';
- if (PL_dowarn) {
- MAGIC *mg;
- if (mg = SvTIED_mg(sv, how)) {
- if (mg->mg_obj && SvREFCNT(SvRV(mg->mg_obj)) > 1)
- warn("untie attempted while %lu inner references still exist",
- (unsigned long)SvREFCNT(SvRV(mg->mg_obj)) - 1 ) ;
+ if (ckWARN(WARN_UNTIE)) {
+ MAGIC * mg ;
+ if ((mg = SvTIED_mg(sv, how))) {
+ if (mg && SvREFCNT(SvRV(mg->mg_obj)) > 1)
+ Perl_warner(aTHX_ WARN_UNTIE,
+ "untie attempted while %"UVuf" inner references still exist",
+ (UV)SvREFCNT(SvRV(mg->mg_obj)) - 1 ) ;
}
}
@@ -642,7 +825,7 @@ PP(pp_tied)
char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) ? 'P' : 'q';
MAGIC *mg;
- if (mg = SvTIED_mg(sv, how)) {
+ if ((mg = SvTIED_mg(sv, how))) {
SV *osv = SvTIED_obj(sv, mg);
if (osv == mg->mg_obj)
osv = sv_mortalcopy(osv);
@@ -668,10 +851,10 @@ PP(pp_dbmopen)
stash = gv_stashsv(sv, FALSE);
if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
PUTBACK;
- perl_require_pv("AnyDBM_File.pm");
+ require_pv("AnyDBM_File.pm");
SPAGAIN;
if (!(gv = gv_fetchmethod(stash, "TIEHASH")))
- DIE("No dbm on this machine");
+ DIE(aTHX_ "No dbm on this machine");
}
ENTER;
@@ -681,12 +864,12 @@ PP(pp_dbmopen)
PUSHs(sv);
PUSHs(left);
if (SvIV(right))
- PUSHs(sv_2mortal(newSViv(O_RDWR|O_CREAT)));
+ PUSHs(sv_2mortal(newSVuv(O_RDWR|O_CREAT)));
else
- PUSHs(sv_2mortal(newSViv(O_RDWR)));
+ PUSHs(sv_2mortal(newSVuv(O_RDWR)));
PUSHs(right);
PUTBACK;
- perl_call_sv((SV*)GvCV(gv), G_SCALAR);
+ call_sv((SV*)GvCV(gv), G_SCALAR);
SPAGAIN;
if (!sv_isobject(TOPs)) {
@@ -694,10 +877,10 @@ PP(pp_dbmopen)
PUSHMARK(SP);
PUSHs(sv);
PUSHs(left);
- PUSHs(sv_2mortal(newSViv(O_RDONLY)));
+ PUSHs(sv_2mortal(newSVuv(O_RDONLY)));
PUSHs(right);
PUTBACK;
- perl_call_sv((SV*)GvCV(gv), G_SCALAR);
+ call_sv((SV*)GvCV(gv), G_SCALAR);
SPAGAIN;
}
@@ -711,7 +894,7 @@ PP(pp_dbmopen)
PP(pp_dbmclose)
{
- return pp_untie(ARGS);
+ return pp_untie();
}
PP(pp_sselect)
@@ -722,7 +905,7 @@ PP(pp_sselect)
register I32 j;
register char *s;
register SV *sv;
- double value;
+ NV value;
I32 maxlen = 0;
I32 nfound;
struct timeval timebuf;
@@ -758,23 +941,23 @@ PP(pp_sselect)
/* If SELECT_MIN_BITS is greater than one we most probably will want
* to align the sizes with SELECT_MIN_BITS/8 because for example
* in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
- * UNIX, Solaris, NeXT) the smallest quantum select() operates on
- * (sets bit) is 32 bits. */
+ * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
+ * on (sets/tests/clears bits) is 32 bits. */
growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
-#else
+# else
growsize = sizeof(fd_set);
-#endif
-#else
-#ifdef NFDBITS
+# endif
+# else
+# ifdef NFDBITS
-#ifndef NBBY
-#define NBBY 8
-#endif
+# ifndef NBBY
+# define NBBY 8
+# endif
masksize = NFDBITS / NBBY;
-#else
+# else
masksize = sizeof(long); /* documented int, everyone seems to use long */
-#endif
+# endif
growsize = maxlen + (masksize - (maxlen % masksize));
Zero(&fd_sets[0], 4, char*);
#endif
@@ -785,7 +968,7 @@ PP(pp_sselect)
if (value < 0.0)
value = 0.0;
timebuf.tv_sec = (long)value;
- value -= (double)timebuf.tv_sec;
+ value -= (NV)timebuf.tv_sec;
timebuf.tv_usec = (long)(value * 1000000.0);
}
else
@@ -844,19 +1027,19 @@ PP(pp_sselect)
PUSHi(nfound);
if (GIMME == G_ARRAY && tbuf) {
- value = (double)(timebuf.tv_sec) +
- (double)(timebuf.tv_usec) / 1000000.0;
+ value = (NV)(timebuf.tv_sec) +
+ (NV)(timebuf.tv_usec) / 1000000.0;
PUSHs(sv = sv_mortalcopy(&PL_sv_no));
sv_setnv(sv, value);
}
RETURN;
#else
- DIE("select not implemented");
+ DIE(aTHX_ "select not implemented");
#endif
}
void
-setdefout(GV *gv)
+Perl_setdefout(pTHX_ GV *gv)
{
dTHR;
if (gv)
@@ -906,20 +1089,18 @@ PP(pp_getc)
GV *gv;
MAGIC *mg;
- if (MAXARG <= 0)
+ if (MAXARG == 0)
gv = PL_stdingv;
else
gv = (GV*)POPs;
- if (!gv)
- gv = PL_argvgv;
- if (mg = SvTIED_mg((SV*)gv, 'q')) {
+ if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
I32 gimme = GIMME_V;
PUSHMARK(SP);
XPUSHs(SvTIED_obj((SV*)gv, mg));
PUTBACK;
ENTER;
- perl_call_method("GETC", gimme);
+ call_method("GETC", gimme);
LEAVE;
SPAGAIN;
if (gimme == G_SCALAR)
@@ -937,11 +1118,11 @@ PP(pp_getc)
PP(pp_read)
{
- return pp_sysread(ARGS);
+ return pp_sysread();
}
STATIC OP *
-doform(CV *cv, GV *gv, OP *retop)
+S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
{
dTHR;
register PERL_CONTEXT *cx;
@@ -953,9 +1134,9 @@ doform(CV *cv, GV *gv, OP *retop)
SAVETMPS;
push_return(retop);
- PUSHBLOCK(cx, CXt_SUB, PL_stack_sp);
+ PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
PUSHFORMAT(cx);
- SAVESPTR(PL_curpad);
+ SAVEVPTR(PL_curpad);
PL_curpad = AvARRAY((AV*)svp[1]);
setdefout(gv); /* locally select filehandle so $% et al work */
@@ -992,9 +1173,9 @@ PP(pp_enterwrite)
if (fgv) {
SV *tmpsv = sv_newmortal();
gv_efullname3(tmpsv, fgv, Nullch);
- DIE("Undefined format \"%s\" called",SvPVX(tmpsv));
+ DIE(aTHX_ "Undefined format \"%s\" called",SvPVX(tmpsv));
}
- DIE("Not a format reference");
+ DIE(aTHX_ "Not a format reference");
}
if (CvCLONE(cv))
cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
@@ -1028,7 +1209,7 @@ PP(pp_leavewrite)
if (!IoTOP_NAME(io)) {
if (!IoFMT_NAME(io))
IoFMT_NAME(io) = savepv(GvNAME(gv));
- topname = sv_2mortal(newSVpvf("%s_TOP", IoFMT_NAME(io)));
+ topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", IoFMT_NAME(io)));
topgv = gv_fetchpv(SvPVX(topname), FALSE, SVt_PVFM);
if ((topgv && GvFORM(topgv)) ||
!gv_fetchpv("top",FALSE,SVt_PVFM))
@@ -1068,12 +1249,12 @@ PP(pp_leavewrite)
IoFLAGS(io) |= IOf_DIDTOP;
fgv = IoTOP_GV(io);
if (!fgv)
- DIE("bad top format reference");
+ DIE(aTHX_ "bad top format reference");
cv = GvFORM(fgv);
if (!cv) {
SV *tmpsv = sv_newmortal();
gv_efullname3(tmpsv, fgv, Nullch);
- DIE("Undefined top format \"%s\" called",SvPVX(tmpsv));
+ DIE(aTHX_ "Undefined top format \"%s\" called",SvPVX(tmpsv));
}
if (CvCLONE(cv))
cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
@@ -1087,18 +1268,23 @@ PP(pp_leavewrite)
fp = IoOFP(io);
if (!fp) {
- if (PL_dowarn) {
- if (IoIFP(io))
- warn("Filehandle only opened for input");
- else
- warn("Write on closed filehandle");
+ if (ckWARN2(WARN_CLOSED,WARN_IO)) {
+ if (IoIFP(io)) {
+ SV* sv = sv_newmortal();
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_IO,
+ "Filehandle %s opened only for input",
+ SvPV_nolen(sv));
+ }
+ else if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io, "write", "filehandle");
}
PUSHs(&PL_sv_no);
}
else {
if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
- if (PL_dowarn)
- warn("page overflow");
+ if (ckWARN(WARN_IO))
+ Perl_warner(aTHX_ WARN_IO, "page overflow");
}
if (!PerlIO_write(ofp, SvPVX(PL_formtarget), SvCUR(PL_formtarget)) ||
PerlIO_error(fp))
@@ -1132,7 +1318,7 @@ PP(pp_prtf)
else
gv = PL_defoutgv;
- if (mg = SvTIED_mg((SV*)gv, 'q')) {
+ if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
if (MARK == ORIGMARK) {
MEXTEND(SP, 1);
++MARK;
@@ -1143,7 +1329,7 @@ PP(pp_prtf)
*MARK = SvTIED_obj((SV*)gv, mg);
PUTBACK;
ENTER;
- perl_call_method("PRINTF", G_SCALAR);
+ call_method("PRINTF", G_SCALAR);
LEAVE;
SPAGAIN;
MARK = ORIGMARK + 1;
@@ -1154,31 +1340,29 @@ PP(pp_prtf)
sv = NEWSV(0,0);
if (!(io = GvIO(gv))) {
- if (PL_dowarn) {
- gv_fullname3(sv, gv, Nullch);
- warn("Filehandle %s never opened", SvPV(sv,n_a));
+ if (ckWARN(WARN_UNOPENED)) {
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_UNOPENED,
+ "Filehandle %s never opened", SvPV(sv,n_a));
}
SETERRNO(EBADF,RMS$_IFI);
goto just_say_no;
}
else if (!(fp = IoOFP(io))) {
- if (PL_dowarn) {
- gv_fullname3(sv, gv, Nullch);
- if (IoIFP(io))
- warn("Filehandle %s opened only for input", SvPV(sv,n_a));
- else
- warn("printf on closed filehandle %s", SvPV(sv,n_a));
+ if (ckWARN2(WARN_CLOSED,WARN_IO)) {
+ if (IoIFP(io)) {
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_IO,
+ "Filehandle %s opened only for input",
+ SvPV(sv,n_a));
+ }
+ else if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io, "printf", "filehandle");
}
SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
goto just_say_no;
}
else {
-#ifdef USE_LOCALE_NUMERIC
- if (PL_op->op_private & OPpLOCALE)
- SET_NUMERIC_LOCAL();
- else
- SET_NUMERIC_STANDARD();
-#endif
do_sprintf(sv, SP - MARK, MARK + 1);
if (!do_print(sv, fp))
goto just_say_no;
@@ -1216,6 +1400,8 @@ PP(pp_sysopen)
sv = POPs;
gv = (GV *)POPs;
+ /* Need TIEHANDLE method ? */
+
tmps = SvPV(sv, len);
if (do_open(gv, tmps, len, TRUE, mode, perm, Nullfp)) {
IoLINES(GvIOp(gv)) = 0;
@@ -1249,7 +1435,7 @@ PP(pp_sysread)
PUSHMARK(MARK-1);
*MARK = SvTIED_obj((SV*)gv, mg);
ENTER;
- perl_call_method("READ", G_SCALAR);
+ call_method("READ", G_SCALAR);
LEAVE;
SPAGAIN;
sv = POPs;
@@ -1266,7 +1452,7 @@ PP(pp_sysread)
buffer = SvPV_force(bufsv, blen);
length = SvIVx(*++MARK);
if (length < 0)
- DIE("Negative length");
+ DIE(aTHX_ "Negative length");
SETERRNO(0,0);
if (MARK < SP)
offset = SvIVx(*++MARK);
@@ -1283,6 +1469,14 @@ PP(pp_sysread)
#else
bufsize = sizeof namebuf;
#endif
+#ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
+ if (bufsize >= 256)
+ bufsize = 255;
+#endif
+#ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
+ if (bufsize >= 256)
+ bufsize = 255;
+#endif
buffer = SvGROW(bufsv, length+1);
/* 'offset' means 'flags' here */
length = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
@@ -1303,11 +1497,11 @@ PP(pp_sysread)
}
#else
if (PL_op->op_type == OP_RECV)
- DIE(no_sock_func, "recv");
+ DIE(aTHX_ PL_no_sock_func, "recv");
#endif
if (offset < 0) {
if (-offset > blen)
- DIE("Offset outside string");
+ DIE(aTHX_ "Offset outside string");
offset += blen;
}
bufsize = SvCUR(bufsv);
@@ -1348,8 +1542,17 @@ PP(pp_sysread)
if (length == 0 && PerlIO_error(IoIFP(io)))
length = -1;
}
- if (length < 0)
+ if (length < 0) {
+ if ((IoTYPE(io) == '>' || IoIFP(io) == PerlIO_stdout()
+ || IoIFP(io) == PerlIO_stderr()) && ckWARN(WARN_IO))
+ {
+ SV* sv = sv_newmortal();
+ gv_efullname3(sv, gv, Nullch);
+ Perl_warner(aTHX_ WARN_IO, "Filehandle %s opened only for output",
+ SvPV_nolen(sv));
+ }
goto say_undef;
+ }
SvCUR_set(bufsv, length+offset);
*SvEND(bufsv) = '\0';
(void)SvPOK_only(bufsv);
@@ -1374,10 +1577,10 @@ PP(pp_syswrite)
SV *sv;
EXTEND(SP, 1);
sv = sv_2mortal(newSViv(sv_len(*SP)));
- PUSHs(sv);
+ PUSHs(sv);
PUTBACK;
}
- return pp_send(ARGS);
+ return pp_send();
}
PP(pp_send)
@@ -1385,10 +1588,11 @@ PP(pp_send)
djSP; dMARK; dORIGMARK; dTARGET;
GV *gv;
IO *io;
- int offset;
SV *bufsv;
char *buffer;
- int length;
+ Size_t length;
+ SSize_t retval;
+ IV offset;
STRLEN blen;
MAGIC *mg;
@@ -1399,7 +1603,7 @@ PP(pp_send)
PUSHMARK(MARK-1);
*MARK = SvTIED_obj((SV*)gv, mg);
ENTER;
- perl_call_method("WRITE", G_SCALAR);
+ call_method("WRITE", G_SCALAR);
LEAVE;
SPAGAIN;
sv = POPs;
@@ -1411,18 +1615,22 @@ PP(pp_send)
goto say_undef;
bufsv = *++MARK;
buffer = SvPV(bufsv, blen);
- length = SvIVx(*++MARK);
- if (length < 0)
- DIE("Negative length");
+#if Size_t_size > IVSIZE
+ length = (Size_t)SvNVx(*++MARK);
+#else
+ length = (Size_t)SvIVx(*++MARK);
+#endif
+ if ((SSize_t)length < 0)
+ DIE(aTHX_ "Negative length");
SETERRNO(0,0);
io = GvIO(gv);
if (!io || !IoIFP(io)) {
- length = -1;
- if (PL_dowarn) {
+ retval = -1;
+ if (ckWARN(WARN_CLOSED)) {
if (PL_op->op_type == OP_SYSWRITE)
- warn("Syswrite on closed filehandle");
+ report_closed_fh(gv, io, "syswrite", "filehandle");
else
- warn("Send on closed socket");
+ report_closed_fh(gv, io, "send", "socket");
}
}
else if (PL_op->op_type == OP_SYSWRITE) {
@@ -1430,23 +1638,24 @@ PP(pp_send)
offset = SvIVx(*++MARK);
if (offset < 0) {
if (-offset > blen)
- DIE("Offset outside string");
+ DIE(aTHX_ "Offset outside string");
offset += blen;
} else if (offset >= blen && blen > 0)
- DIE("Offset outside string");
+ DIE(aTHX_ "Offset outside string");
} else
offset = 0;
if (length > blen - offset)
length = blen - offset;
#ifdef PERL_SOCK_SYSWRITE_IS_SEND
if (IoTYPE(io) == 's') {
- length = PerlSock_send(PerlIO_fileno(IoIFP(io)),
+ retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
buffer+offset, length, 0);
}
else
#endif
{
- length = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
+ /* See the note at doio.c:do_print about filesize limits. --jhi */
+ retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
buffer+offset, length);
}
}
@@ -1455,20 +1664,24 @@ PP(pp_send)
char *sockbuf;
STRLEN mlen;
sockbuf = SvPVx(*++MARK, mlen);
- length = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen, length,
- (struct sockaddr *)sockbuf, mlen);
+ retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
+ length, (struct sockaddr *)sockbuf, mlen);
}
else
- length = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, length);
+ retval = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, length);
#else
else
- DIE(no_sock_func, "send");
+ DIE(aTHX_ PL_no_sock_func, "send");
#endif
- if (length < 0)
+ if (retval < 0)
goto say_undef;
SP = ORIGMARK;
- PUSHi(length);
+#if Size_t_size > IVSIZE
+ PUSHn(retval);
+#else
+ PUSHi(retval);
+#endif
RETURN;
say_undef:
@@ -1478,18 +1691,49 @@ PP(pp_send)
PP(pp_recv)
{
- return pp_sysread(ARGS);
+ return pp_sysread();
}
PP(pp_eof)
{
djSP;
GV *gv;
+ MAGIC *mg;
- if (MAXARG <= 0)
- gv = PL_last_in_gv;
+ if (MAXARG == 0) {
+ if (PL_op->op_flags & OPf_SPECIAL) { /* eof() */
+ IO *io;
+ gv = PL_last_in_gv = PL_argvgv;
+ io = GvIO(gv);
+ if (io && !IoIFP(io)) {
+ if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
+ IoLINES(io) = 0;
+ IoFLAGS(io) &= ~IOf_START;
+ do_open(gv, "-", 1, FALSE, O_RDONLY, 0, Nullfp);
+ sv_setpvn(GvSV(gv), "-", 1);
+ SvSETMAGIC(GvSV(gv));
+ }
+ else if (!nextargv(gv))
+ RETPUSHYES;
+ }
+ }
+ else
+ gv = PL_last_in_gv; /* eof */
+ }
else
- gv = PL_last_in_gv = (GV*)POPs;
+ gv = PL_last_in_gv = (GV*)POPs; /* eof(FH) */
+
+ if (gv && (mg = SvTIED_mg((SV*)gv, 'q'))) {
+ PUSHMARK(SP);
+ XPUSHs(SvTIED_obj((SV*)gv, mg));
+ PUTBACK;
+ ENTER;
+ call_method("EOF", G_SCALAR);
+ LEAVE;
+ SPAGAIN;
+ RETURN;
+ }
+
PUSHs(boolSV(!gv || do_eof(gv)));
RETURN;
}
@@ -1497,19 +1741,36 @@ PP(pp_eof)
PP(pp_tell)
{
djSP; dTARGET;
- GV *gv;
+ GV *gv;
+ MAGIC *mg;
- if (MAXARG <= 0)
+ if (MAXARG == 0)
gv = PL_last_in_gv;
else
gv = PL_last_in_gv = (GV*)POPs;
+
+ if (gv && (mg = SvTIED_mg((SV*)gv, 'q'))) {
+ PUSHMARK(SP);
+ XPUSHs(SvTIED_obj((SV*)gv, mg));
+ PUTBACK;
+ ENTER;
+ call_method("TELL", G_SCALAR);
+ LEAVE;
+ SPAGAIN;
+ RETURN;
+ }
+
+#if LSEEKSIZE > IVSIZE
+ PUSHn( do_tell(gv) );
+#else
PUSHi( do_tell(gv) );
+#endif
RETURN;
}
PP(pp_seek)
{
- return pp_sysseek(ARGS);
+ return pp_sysseek();
}
PP(pp_sysseek)
@@ -1517,16 +1778,48 @@ PP(pp_sysseek)
djSP;
GV *gv;
int whence = POPi;
- long offset = POPl;
+#if LSEEKSIZE > IVSIZE
+ Off_t offset = (Off_t)SvNVx(POPs);
+#else
+ Off_t offset = (Off_t)SvIVx(POPs);
+#endif
+ MAGIC *mg;
gv = PL_last_in_gv = (GV*)POPs;
+
+ if (gv && (mg = SvTIED_mg((SV*)gv, 'q'))) {
+ PUSHMARK(SP);
+ XPUSHs(SvTIED_obj((SV*)gv, mg));
+#if LSEEKSIZE > IVSIZE
+ XPUSHs(sv_2mortal(newSVnv((NV) offset)));
+#else
+ XPUSHs(sv_2mortal(newSViv(offset)));
+#endif
+ XPUSHs(sv_2mortal(newSViv(whence)));
+ PUTBACK;
+ ENTER;
+ call_method("SEEK", G_SCALAR);
+ LEAVE;
+ SPAGAIN;
+ RETURN;
+ }
+
if (PL_op->op_type == OP_SEEK)
PUSHs(boolSV(do_seek(gv, offset, whence)));
else {
- long n = do_sysseek(gv, offset, whence);
- PUSHs((n < 0) ? &PL_sv_undef
- : sv_2mortal(n ? newSViv((IV)n)
- : newSVpv(zero_but_true, ZBTLEN)));
+ Off_t sought = do_sysseek(gv, offset, whence);
+ if (sought < 0)
+ PUSHs(&PL_sv_undef);
+ else {
+ SV* sv = sought ?
+#if LSEEKSIZE > IVSIZE
+ newSVnv((NV)sought)
+#else
+ newSViv(sought)
+#endif
+ : newSVpvn(zero_but_true, ZBTLEN);
+ PUSHs(sv_2mortal(sv));
+ }
}
RETURN;
}
@@ -1534,28 +1827,46 @@ PP(pp_sysseek)
PP(pp_truncate)
{
djSP;
- Off_t len = (Off_t)POPn;
+ /* There seems to be no consensus on the length type of truncate()
+ * and ftruncate(), both off_t and size_t have supporters. In
+ * general one would think that when using large files, off_t is
+ * at least as wide as size_t, so using an off_t should be okay. */
+ /* XXX Configure probe for the length type of *truncate() needed XXX */
+ Off_t len;
int result = 1;
GV *tmpgv;
STRLEN n_a;
+#if Size_t_size > IVSIZE
+ len = (Off_t)POPn;
+#else
+ len = (Off_t)POPi;
+#endif
+ /* Checking for length < 0 is problematic as the type might or
+ * might not be signed: if it is not, clever compilers will moan. */
+ /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
SETERRNO(0,0);
#if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE) || defined(F_FREESP)
if (PL_op->op_flags & OPf_SPECIAL) {
tmpgv = gv_fetchpv(POPpx, FALSE, SVt_PVIO);
do_ftruncate:
TAINT_PROPER("truncate");
- if (!GvIO(tmpgv) || !IoIFP(GvIOp(tmpgv)) ||
+ if (!GvIO(tmpgv) || !IoIFP(GvIOp(tmpgv)))
+ result = 0;
+ else {
+ PerlIO_flush(IoIFP(GvIOp(tmpgv)));
#ifdef HAS_TRUNCATE
- ftruncate(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
+ if (ftruncate(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
#else
- my_chsize(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
+ if (my_chsize(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
#endif
- result = 0;
+ result = 0;
+ }
}
else {
SV *sv = POPs;
char *name;
+ STRLEN n_a;
if (SvTYPE(sv) == SVt_PVGV) {
tmpgv = (GV*)sv; /* *main::FRED for example */
@@ -1591,13 +1902,13 @@ PP(pp_truncate)
SETERRNO(EBADF,RMS$_IFI);
RETPUSHUNDEF;
#else
- DIE("truncate not implemented");
+ DIE(aTHX_ "truncate not implemented");
#endif
}
PP(pp_fcntl)
{
- return pp_ioctl(ARGS);
+ return pp_ioctl();
}
PP(pp_ioctl)
@@ -1630,7 +1941,7 @@ PP(pp_ioctl)
}
else {
retval = SvIV(argsv);
- s = (char*)retval; /* ouch */
+ s = INT2PTR(char*,retval); /* ouch */
}
TAINT_PROPER(optype == OP_IOCTL ? "ioctl" : "fcntl");
@@ -1639,7 +1950,7 @@ PP(pp_ioctl)
#ifdef HAS_IOCTL
retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
#else
- DIE("ioctl is not implemented");
+ DIE(aTHX_ "ioctl is not implemented");
#endif
else
#ifdef HAS_FCNTL
@@ -1649,13 +1960,13 @@ PP(pp_ioctl)
retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
#endif
#else
- DIE("fcntl is not implemented");
+ DIE(aTHX_ "fcntl is not implemented");
#endif
if (SvPOK(argsv)) {
if (s[SvCUR(argsv)] != 17)
- DIE("Possible memory corruption: %s overflowed 3rd argument",
- op_name[optype]);
+ DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
+ PL_op_name[optype]);
s[SvCUR(argsv)] = 0; /* put our null back */
SvSETMAGIC(argsv); /* Assume it has changed */
}
@@ -1681,7 +1992,7 @@ PP(pp_flock)
#ifdef FLOCK
argtype = POPi;
- if (MAXARG <= 0)
+ if (MAXARG == 0)
gv = PL_last_in_gv;
else
gv = (GV*)POPs;
@@ -1693,12 +2004,16 @@ PP(pp_flock)
(void)PerlIO_flush(fp);
value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
}
- else
+ else {
value = 0;
+ SETERRNO(EBADF,RMS$_IFI);
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, GvIO(gv), "flock", "filehandle");
+ }
PUSHi(value);
RETURN;
#else
- DIE(no_func, "flock()");
+ DIE(aTHX_ PL_no_func, "flock()");
#endif
}
@@ -1739,10 +2054,13 @@ PP(pp_socket)
if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
RETPUSHUNDEF;
}
+#if defined(HAS_FCNTL) && defined(F_SETFD)
+ fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
+#endif
RETPUSHYES;
#else
- DIE(no_sock_func, "socket");
+ DIE(aTHX_ PL_no_sock_func, "socket");
#endif
}
@@ -1789,10 +2107,14 @@ PP(pp_sockpair)
if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
RETPUSHUNDEF;
}
+#if defined(HAS_FCNTL) && defined(F_SETFD)
+ fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
+ fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
+#endif
RETPUSHYES;
#else
- DIE(no_sock_func, "socketpair");
+ DIE(aTHX_ PL_no_sock_func, "socketpair");
#endif
}
@@ -1846,12 +2168,12 @@ PP(pp_bind)
RETPUSHUNDEF;
nuts:
- if (PL_dowarn)
- warn("bind() on closed fd");
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io, "bind", "socket");
SETERRNO(EBADF,SS$_IVCHAN);
RETPUSHUNDEF;
#else
- DIE(no_sock_func, "bind");
+ DIE(aTHX_ PL_no_sock_func, "bind");
#endif
}
@@ -1876,12 +2198,12 @@ PP(pp_connect)
RETPUSHUNDEF;
nuts:
- if (PL_dowarn)
- warn("connect() on closed fd");
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io, "connect", "socket");
SETERRNO(EBADF,SS$_IVCHAN);
RETPUSHUNDEF;
#else
- DIE(no_sock_func, "connect");
+ DIE(aTHX_ PL_no_sock_func, "connect");
#endif
}
@@ -1902,12 +2224,12 @@ PP(pp_listen)
RETPUSHUNDEF;
nuts:
- if (PL_dowarn)
- warn("listen() on closed fd");
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io, "listen", "socket");
SETERRNO(EBADF,SS$_IVCHAN);
RETPUSHUNDEF;
#else
- DIE(no_sock_func, "listen");
+ DIE(aTHX_ PL_no_sock_func, "listen");
#endif
}
@@ -1951,20 +2273,23 @@ PP(pp_accept)
if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
goto badexit;
}
+#if defined(HAS_FCNTL) && defined(F_SETFD)
+ fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
+#endif
PUSHp((char *)&saddr, len);
RETURN;
nuts:
- if (PL_dowarn)
- warn("accept() on closed fd");
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(ggv, ggv ? GvIO(ggv) : 0, "accept", "socket");
SETERRNO(EBADF,SS$_IVCHAN);
badexit:
RETPUSHUNDEF;
#else
- DIE(no_sock_func, "accept");
+ DIE(aTHX_ PL_no_sock_func, "accept");
#endif
}
@@ -1983,21 +2308,21 @@ PP(pp_shutdown)
RETURN;
nuts:
- if (PL_dowarn)
- warn("shutdown() on closed fd");
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io, "shutdown", "socket");
SETERRNO(EBADF,SS$_IVCHAN);
RETPUSHUNDEF;
#else
- DIE(no_sock_func, "shutdown");
+ DIE(aTHX_ PL_no_sock_func, "shutdown");
#endif
}
PP(pp_gsockopt)
{
#ifdef HAS_SOCKET
- return pp_ssockopt(ARGS);
+ return pp_ssockopt();
#else
- DIE(no_sock_func, "getsockopt");
+ DIE(aTHX_ PL_no_sock_func, "getsockopt");
#endif
}
@@ -2062,23 +2387,25 @@ PP(pp_ssockopt)
RETURN;
nuts:
- if (PL_dowarn)
- warn("[gs]etsockopt() on closed fd");
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io,
+ optype == OP_GSOCKOPT ? "getsockopt" : "setsockopt",
+ "socket");
SETERRNO(EBADF,SS$_IVCHAN);
nuts2:
RETPUSHUNDEF;
#else
- DIE(no_sock_func, "setsockopt");
+ DIE(aTHX_ PL_no_sock_func, "setsockopt");
#endif
}
PP(pp_getsockname)
{
#ifdef HAS_SOCKET
- return pp_getpeername(ARGS);
+ return pp_getpeername();
#else
- DIE(no_sock_func, "getsockname");
+ DIE(aTHX_ PL_no_sock_func, "getsockname");
#endif
}
@@ -2135,14 +2462,17 @@ PP(pp_getpeername)
RETURN;
nuts:
- if (PL_dowarn)
- warn("get{sock, peer}name() on closed fd");
+ if (ckWARN(WARN_CLOSED))
+ report_closed_fh(gv, io,
+ optype == OP_GETSOCKNAME ? "getsockname"
+ : "getpeername",
+ "socket");
SETERRNO(EBADF,SS$_IVCHAN);
nuts2:
RETPUSHUNDEF;
#else
- DIE(no_sock_func, "getpeername");
+ DIE(aTHX_ PL_no_sock_func, "getpeername");
#endif
}
@@ -2150,7 +2480,7 @@ nuts2:
PP(pp_lstat)
{
- return pp_stat(ARGS);
+ return pp_stat();
}
PP(pp_stat)
@@ -2162,7 +2492,7 @@ PP(pp_stat)
STRLEN n_a;
if (PL_op->op_flags & OPf_REF) {
- tmpgv = cGVOP->op_gv;
+ tmpgv = cGVOP_gv;
do_fstat:
if (tmpgv != PL_defgv) {
PL_laststype = OP_STAT;
@@ -2194,8 +2524,8 @@ PP(pp_stat)
#endif
PL_laststatval = PerlLIO_stat(SvPV(PL_statname, n_a), &PL_statcache);
if (PL_laststatval < 0) {
- if (PL_dowarn && strchr(SvPV(PL_statname, n_a), '\n'))
- warn(warn_nl, "stat");
+ if (ckWARN(WARN_NEWLINE) && strchr(SvPV(PL_statname, n_a), '\n'))
+ Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "stat");
max = 0;
}
}
@@ -2209,33 +2539,53 @@ PP(pp_stat)
if (max) {
EXTEND(SP, max);
EXTEND_MORTAL(max);
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_dev)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_ino)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_mode)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_nlink)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_uid)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_gid)));
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_dev)));
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_ino)));
+ PUSHs(sv_2mortal(newSVuv(PL_statcache.st_mode)));
+ PUSHs(sv_2mortal(newSVuv(PL_statcache.st_nlink)));
+#if Uid_t_size > IVSIZE
+ PUSHs(sv_2mortal(newSVnv(PL_statcache.st_uid)));
+#else
+# if Uid_t_sign <= 0
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_uid)));
+# else
+ PUSHs(sv_2mortal(newSVuv(PL_statcache.st_uid)));
+# endif
+#endif
+#if Gid_t_size > IVSIZE
+ PUSHs(sv_2mortal(newSVnv(PL_statcache.st_gid)));
+#else
+# if Gid_t_sign <= 0
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_gid)));
+# else
+ PUSHs(sv_2mortal(newSVuv(PL_statcache.st_gid)));
+# endif
+#endif
#ifdef USE_STAT_RDEV
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_rdev)));
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_rdev)));
+#else
+ PUSHs(sv_2mortal(newSVpvn("", 0)));
+#endif
+#if Off_t_size > IVSIZE
+ PUSHs(sv_2mortal(newSVnv(PL_statcache.st_size)));
#else
- PUSHs(sv_2mortal(newSVpv("", 0)));
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_size)));
#endif
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_size)));
#ifdef BIG_TIME
- PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_atime)));
- PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_mtime)));
- PUSHs(sv_2mortal(newSVnv((U32)PL_statcache.st_ctime)));
+ PUSHs(sv_2mortal(newSVnv(PL_statcache.st_atime)));
+ PUSHs(sv_2mortal(newSVnv(PL_statcache.st_mtime)));
+ PUSHs(sv_2mortal(newSVnv(PL_statcache.st_ctime)));
#else
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_atime)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_mtime)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_ctime)));
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_atime)));
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_mtime)));
+ PUSHs(sv_2mortal(newSViv(PL_statcache.st_ctime)));
#endif
#ifdef USE_STAT_BLOCKS
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_blksize)));
- PUSHs(sv_2mortal(newSViv((I32)PL_statcache.st_blocks)));
+ PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blksize)));
+ PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blocks)));
#else
- PUSHs(sv_2mortal(newSVpv("", 0)));
- PUSHs(sv_2mortal(newSVpv("", 0)));
+ PUSHs(sv_2mortal(newSVpvn("", 0)));
+ PUSHs(sv_2mortal(newSVpvn("", 0)));
#endif
}
RETURN;
@@ -2243,8 +2593,24 @@ PP(pp_stat)
PP(pp_ftrread)
{
- I32 result = my_stat(ARGS);
+ I32 result;
djSP;
+#if defined(HAS_ACCESS) && defined(R_OK)
+ STRLEN n_a;
+ if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
+ result = access(TOPpx, R_OK);
+ if (result == 0)
+ RETPUSHYES;
+ if (result < 0)
+ RETPUSHUNDEF;
+ RETPUSHNO;
+ }
+ else
+ result = my_stat();
+#else
+ result = my_stat();
+#endif
+ SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
if (cando(S_IRUSR, 0, &PL_statcache))
@@ -2254,8 +2620,24 @@ PP(pp_ftrread)
PP(pp_ftrwrite)
{
- I32 result = my_stat(ARGS);
+ I32 result;
djSP;
+#if defined(HAS_ACCESS) && defined(W_OK)
+ STRLEN n_a;
+ if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
+ result = access(TOPpx, W_OK);
+ if (result == 0)
+ RETPUSHYES;
+ if (result < 0)
+ RETPUSHUNDEF;
+ RETPUSHNO;
+ }
+ else
+ result = my_stat();
+#else
+ result = my_stat();
+#endif
+ SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
if (cando(S_IWUSR, 0, &PL_statcache))
@@ -2265,8 +2647,24 @@ PP(pp_ftrwrite)
PP(pp_ftrexec)
{
- I32 result = my_stat(ARGS);
+ I32 result;
djSP;
+#if defined(HAS_ACCESS) && defined(X_OK)
+ STRLEN n_a;
+ if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
+ result = access(TOPpx, X_OK);
+ if (result == 0)
+ RETPUSHYES;
+ if (result < 0)
+ RETPUSHUNDEF;
+ RETPUSHNO;
+ }
+ else
+ result = my_stat();
+#else
+ result = my_stat();
+#endif
+ SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
if (cando(S_IXUSR, 0, &PL_statcache))
@@ -2276,8 +2674,24 @@ PP(pp_ftrexec)
PP(pp_fteread)
{
- I32 result = my_stat(ARGS);
+ I32 result;
djSP;
+#ifdef PERL_EFF_ACCESS_R_OK
+ STRLEN n_a;
+ if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
+ result = PERL_EFF_ACCESS_R_OK(TOPpx);
+ if (result == 0)
+ RETPUSHYES;
+ if (result < 0)
+ RETPUSHUNDEF;
+ RETPUSHNO;
+ }
+ else
+ result = my_stat();
+#else
+ result = my_stat();
+#endif
+ SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
if (cando(S_IRUSR, 1, &PL_statcache))
@@ -2287,8 +2701,24 @@ PP(pp_fteread)
PP(pp_ftewrite)
{
- I32 result = my_stat(ARGS);
+ I32 result;
djSP;
+#ifdef PERL_EFF_ACCESS_W_OK
+ STRLEN n_a;
+ if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
+ result = PERL_EFF_ACCESS_W_OK(TOPpx);
+ if (result == 0)
+ RETPUSHYES;
+ if (result < 0)
+ RETPUSHUNDEF;
+ RETPUSHNO;
+ }
+ else
+ result = my_stat();
+#else
+ result = my_stat();
+#endif
+ SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
if (cando(S_IWUSR, 1, &PL_statcache))
@@ -2298,8 +2728,24 @@ PP(pp_ftewrite)
PP(pp_fteexec)
{
- I32 result = my_stat(ARGS);
+ I32 result;
djSP;
+#ifdef PERL_EFF_ACCESS_X_OK
+ STRLEN n_a;
+ if ((PL_hints & HINT_FILETEST_ACCESS) && SvPOK(TOPs)) {
+ result = PERL_EFF_ACCESS_X_OK(TOPpx);
+ if (result == 0)
+ RETPUSHYES;
+ if (result < 0)
+ RETPUSHUNDEF;
+ RETPUSHNO;
+ }
+ else
+ result = my_stat();
+#else
+ result = my_stat();
+#endif
+ SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
if (cando(S_IXUSR, 1, &PL_statcache))
@@ -2309,7 +2755,7 @@ PP(pp_fteexec)
PP(pp_ftis)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2318,74 +2764,79 @@ PP(pp_ftis)
PP(pp_fteowned)
{
- return pp_ftrowned(ARGS);
+ return pp_ftrowned();
}
PP(pp_ftrowned)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
- if (PL_statcache.st_uid == (PL_op->op_type == OP_FTEOWNED ? PL_euid : PL_uid) )
+ if (PL_statcache.st_uid == (PL_op->op_type == OP_FTEOWNED ?
+ PL_euid : PL_uid) )
RETPUSHYES;
RETPUSHNO;
}
PP(pp_ftzero)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
- if (!PL_statcache.st_size)
+ if (PL_statcache.st_size == 0)
RETPUSHYES;
RETPUSHNO;
}
PP(pp_ftsize)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP; dTARGET;
if (result < 0)
RETPUSHUNDEF;
+#if Off_t_size > IVSIZE
+ PUSHn(PL_statcache.st_size);
+#else
PUSHi(PL_statcache.st_size);
+#endif
RETURN;
}
PP(pp_ftmtime)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP; dTARGET;
if (result < 0)
RETPUSHUNDEF;
- PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_mtime) / 86400.0 );
+ PUSHn( (PL_basetime - PL_statcache.st_mtime) / 86400.0 );
RETURN;
}
PP(pp_ftatime)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP; dTARGET;
if (result < 0)
RETPUSHUNDEF;
- PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_atime) / 86400.0 );
+ PUSHn( (PL_basetime - PL_statcache.st_atime) / 86400.0 );
RETURN;
}
PP(pp_ftctime)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP; dTARGET;
if (result < 0)
RETPUSHUNDEF;
- PUSHn( ((I32)PL_basetime - (I32)PL_statcache.st_ctime) / 86400.0 );
+ PUSHn( (PL_basetime - PL_statcache.st_ctime) / 86400.0 );
RETURN;
}
PP(pp_ftsock)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2396,7 +2847,7 @@ PP(pp_ftsock)
PP(pp_ftchr)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2407,7 +2858,7 @@ PP(pp_ftchr)
PP(pp_ftblk)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2418,7 +2869,7 @@ PP(pp_ftblk)
PP(pp_ftfile)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2429,7 +2880,7 @@ PP(pp_ftfile)
PP(pp_ftdir)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2440,7 +2891,7 @@ PP(pp_ftdir)
PP(pp_ftpipe)
{
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2451,7 +2902,7 @@ PP(pp_ftpipe)
PP(pp_ftlink)
{
- I32 result = my_lstat(ARGS);
+ I32 result = my_lstat();
djSP;
if (result < 0)
RETPUSHUNDEF;
@@ -2464,7 +2915,7 @@ PP(pp_ftsuid)
{
djSP;
#ifdef S_ISUID
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
@@ -2478,7 +2929,7 @@ PP(pp_ftsgid)
{
djSP;
#ifdef S_ISGID
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
@@ -2492,7 +2943,7 @@ PP(pp_ftsvtx)
{
djSP;
#ifdef S_ISVTX
- I32 result = my_stat(ARGS);
+ I32 result = my_stat();
SPAGAIN;
if (result < 0)
RETPUSHUNDEF;
@@ -2511,7 +2962,7 @@ PP(pp_fttty)
STRLEN n_a;
if (PL_op->op_flags & OPf_REF)
- gv = cGVOP->op_gv;
+ gv = cGVOP_gv;
else if (isGV(TOPs))
gv = (GV*)POPs;
else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
@@ -2550,9 +3001,10 @@ PP(pp_fttext)
register SV *sv;
GV *gv;
STRLEN n_a;
+ PerlIO *fp;
if (PL_op->op_flags & OPf_REF)
- gv = cGVOP->op_gv;
+ gv = cGVOP_gv;
else if (isGV(TOPs))
gv = (GV*)POPs;
else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
@@ -2578,7 +3030,7 @@ PP(pp_fttext)
}
if (io && IoIFP(io)) {
if (! PerlIO_has_base(IoIFP(io)))
- DIE("-T and -B not implemented on filehandles");
+ DIE(aTHX_ "-T and -B not implemented on filehandles");
PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
if (PL_laststatval < 0)
RETPUSHUNDEF;
@@ -2601,9 +3053,11 @@ PP(pp_fttext)
len = 512;
}
else {
- if (PL_dowarn)
- warn("Test on unopened file <%s>",
- GvENAME(cGVOP->op_gv));
+ if (ckWARN(WARN_UNOPENED)) {
+ gv = cGVOP_gv;
+ Perl_warner(aTHX_ WARN_UNOPENED, "Test on unopened file <%s>",
+ GvENAME(gv));
+ }
SETERRNO(EBADF,RMS$_IFI);
RETPUSHUNDEF;
}
@@ -2614,21 +3068,19 @@ PP(pp_fttext)
PL_statgv = Nullgv;
PL_laststatval = -1;
sv_setpv(PL_statname, SvPV(sv, n_a));
-#ifdef HAS_OPEN3
- i = PerlLIO_open3(SvPV(sv, n_a), O_RDONLY, 0);
-#else
- i = PerlLIO_open(SvPV(sv, n_a), 0);
-#endif
- if (i < 0) {
- if (PL_dowarn && strchr(SvPV(sv, n_a), '\n'))
- warn(warn_nl, "open");
+ if (!(fp = PerlIO_open(SvPVX(PL_statname), "r"))) {
+ if (ckWARN(WARN_NEWLINE) && strchr(SvPV(sv, n_a), '\n'))
+ Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "open");
RETPUSHUNDEF;
}
- PL_laststatval = PerlLIO_fstat(i, &PL_statcache);
- if (PL_laststatval < 0)
+ PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
+ if (PL_laststatval < 0) {
+ (void)PerlIO_close(fp);
RETPUSHUNDEF;
- len = PerlLIO_read(i, tbuf, 512);
- (void)PerlLIO_close(i);
+ }
+ do_binmode(fp, '<', TRUE);
+ len = PerlIO_read(fp, tbuf, sizeof(tbuf));
+ (void)PerlIO_close(fp);
if (len <= 0) {
if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
RETPUSHNO; /* special case NFS directories */
@@ -2640,6 +3092,12 @@ PP(pp_fttext)
/* now scan s to look for textiness */
/* XXX ASCII dependent code */
+#if defined(DOSISH) || defined(USEMYBINMODE)
+ /* ignore trailing ^Z on short files */
+ if (len && len < sizeof(tbuf) && tbuf[len-1] == 26)
+ --len;
+#endif
+
for (i = 0; i < len; i++, s++) {
if (!*s) { /* null never allowed in text */
odd += len;
@@ -2649,8 +3107,29 @@ PP(pp_fttext)
else if (!(isPRINT(*s) || isSPACE(*s)))
odd++;
#else
- else if (*s & 128)
+ else if (*s & 128) {
+#ifdef USE_LOCALE
+ if ((PL_op->op_private & OPpLOCALE) && isALPHA_LC(*s))
+ continue;
+#endif
+ /* utf8 characters don't count as odd */
+ if (*s & 0x40) {
+ int ulen = UTF8SKIP(s);
+ if (ulen < len - i) {
+ int j;
+ for (j = 1; j < ulen; j++) {
+ if ((s[j] & 0xc0) != 0x80)
+ goto not_utf8;
+ }
+ --ulen; /* loop does extra increment */
+ s += ulen;
+ i += ulen;
+ continue;
+ }
+ }
+ not_utf8:
odd++;
+ }
else if (*s < 32 &&
*s != '\n' && *s != '\r' && *s != '\b' &&
*s != '\t' && *s != '\f' && *s != 27)
@@ -2666,7 +3145,7 @@ PP(pp_fttext)
PP(pp_ftbinary)
{
- return pp_fttext(ARGS);
+ return pp_fttext();
}
/* File calls. */
@@ -2719,7 +3198,7 @@ PP(pp_chown)
PUSHi(value);
RETURN;
#else
- DIE(no_func, "Unsupported function chown");
+ DIE(aTHX_ PL_no_func, "Unsupported function chown");
#endif
}
@@ -2727,14 +3206,14 @@ PP(pp_chroot)
{
djSP; dTARGET;
char *tmps;
- STRLEN n_a;
#ifdef HAS_CHROOT
+ STRLEN n_a;
tmps = POPpx;
TAINT_PROPER("chroot");
PUSHi( chroot(tmps) >= 0 );
RETURN;
#else
- DIE(no_func, "chroot");
+ DIE(aTHX_ PL_no_func, "chroot");
#endif
}
@@ -2803,9 +3282,9 @@ PP(pp_link)
char *tmps2 = POPpx;
char *tmps = SvPV(TOPs, n_a);
TAINT_PROPER("link");
- SETi( link(tmps, tmps2) >= 0 );
+ SETi( PerlLIO_link(tmps, tmps2) >= 0 );
#else
- DIE(no_func, "Unsupported function link");
+ DIE(aTHX_ PL_no_func, "Unsupported function link");
#endif
RETURN;
}
@@ -2821,7 +3300,7 @@ PP(pp_symlink)
SETi( symlink(tmps, tmps2) >= 0 );
RETURN;
#else
- DIE(no_func, "symlink");
+ DIE(aTHX_ PL_no_func, "symlink");
#endif
}
@@ -2851,10 +3330,8 @@ PP(pp_readlink)
}
#if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
-static int
-dooneliner(cmd, filename)
-char *cmd;
-char *filename;
+STATIC int
+S_dooneliner(pTHX_ char *cmd, char *filename)
{
char *save_filename = filename;
char *cmdline;
@@ -2942,12 +3419,19 @@ char *filename;
PP(pp_mkdir)
{
djSP; dTARGET;
- int mode = POPi;
+ int mode;
#ifndef HAS_MKDIR
int oldumask;
#endif
STRLEN n_a;
- char *tmps = SvPV(TOPs, n_a);
+ char *tmps;
+
+ if (MAXARG > 1)
+ mode = POPi;
+ else
+ mode = 0777;
+
+ tmps = SvPV(TOPs, n_a);
TAINT_PROPER("mkdir");
#ifdef HAS_MKDIR
@@ -3002,7 +3486,7 @@ nope:
SETERRNO(EBADF,RMS$_DIR);
RETPUSHUNDEF;
#else
- DIE(no_dir_func, "opendir");
+ DIE(aTHX_ PL_no_dir_func, "opendir");
#endif
}
@@ -3011,7 +3495,7 @@ PP(pp_readdir)
djSP;
#if defined(Direntry_t) && defined(HAS_READDIR)
#ifndef I_DIRENT
- Direntry_t *readdir _((DIR *));
+ Direntry_t *readdir (DIR *);
#endif
register Direntry_t *dp;
GV *gv = (GV*)POPs;
@@ -3023,14 +3507,15 @@ PP(pp_readdir)
if (GIMME == G_ARRAY) {
/*SUPPRESS 560*/
- while (dp = (Direntry_t *)PerlDir_read(IoDIRP(io))) {
+ while ((dp = (Direntry_t *)PerlDir_read(IoDIRP(io)))) {
#ifdef DIRNAMLEN
- sv = newSVpv(dp->d_name, dp->d_namlen);
+ sv = newSVpvn(dp->d_name, dp->d_namlen);
#else
sv = newSVpv(dp->d_name, 0);
#endif
#ifndef INCOMPLETE_TAINTS
- SvTAINTED_on(sv);
+ if (!(IoFLAGS(io) & IOf_UNTAINT))
+ SvTAINTED_on(sv);
#endif
XPUSHs(sv_2mortal(sv));
}
@@ -3039,12 +3524,13 @@ PP(pp_readdir)
if (!(dp = (Direntry_t *)PerlDir_read(IoDIRP(io))))
goto nope;
#ifdef DIRNAMLEN
- sv = newSVpv(dp->d_name, dp->d_namlen);
+ sv = newSVpvn(dp->d_name, dp->d_namlen);
#else
sv = newSVpv(dp->d_name, 0);
#endif
#ifndef INCOMPLETE_TAINTS
- SvTAINTED_on(sv);
+ if (!(IoFLAGS(io) & IOf_UNTAINT))
+ SvTAINTED_on(sv);
#endif
XPUSHs(sv_2mortal(sv));
}
@@ -3058,7 +3544,7 @@ nope:
else
RETPUSHUNDEF;
#else
- DIE(no_dir_func, "readdir");
+ DIE(aTHX_ PL_no_dir_func, "readdir");
#endif
}
@@ -3066,8 +3552,12 @@ PP(pp_telldir)
{
djSP; dTARGET;
#if defined(HAS_TELLDIR) || defined(telldir)
-# ifdef NEED_TELLDIR_PROTO /* XXX does _anyone_ need this? --AD 2/20/1998 */
- long telldir _((DIR *));
+ /* XXX does _anyone_ need this? --AD 2/20/1998 */
+ /* XXX netbsd still seemed to.
+ XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
+ --JHI 1999-Feb-02 */
+# if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
+ long telldir (DIR *);
# endif
GV *gv = (GV*)POPs;
register IO *io = GvIOn(gv);
@@ -3082,7 +3572,7 @@ nope:
SETERRNO(EBADF,RMS$_ISI);
RETPUSHUNDEF;
#else
- DIE(no_dir_func, "telldir");
+ DIE(aTHX_ PL_no_dir_func, "telldir");
#endif
}
@@ -3105,7 +3595,7 @@ nope:
SETERRNO(EBADF,RMS$_ISI);
RETPUSHUNDEF;
#else
- DIE(no_dir_func, "seekdir");
+ DIE(aTHX_ PL_no_dir_func, "seekdir");
#endif
}
@@ -3126,7 +3616,7 @@ nope:
SETERRNO(EBADF,RMS$_ISI);
RETPUSHUNDEF;
#else
- DIE(no_dir_func, "rewinddir");
+ DIE(aTHX_ PL_no_dir_func, "rewinddir");
#endif
}
@@ -3156,7 +3646,7 @@ nope:
SETERRNO(EBADF,RMS$_IFI);
RETPUSHUNDEF;
#else
- DIE(no_dir_func, "closedir");
+ DIE(aTHX_ PL_no_dir_func, "closedir");
#endif
}
@@ -3166,31 +3656,43 @@ PP(pp_fork)
{
#ifdef HAS_FORK
djSP; dTARGET;
- int childpid;
+ Pid_t childpid;
GV *tmpgv;
EXTEND(SP, 1);
+ PERL_FLUSHALL_FOR_CHILD;
childpid = fork();
if (childpid < 0)
RETSETUNDEF;
if (!childpid) {
/*SUPPRESS 560*/
- if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV))
- sv_setiv(GvSV(tmpgv), (IV)getpid());
+ if ((tmpgv = gv_fetchpv("$", TRUE, SVt_PV)))
+ sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
}
PUSHi(childpid);
RETURN;
#else
- DIE(no_func, "Unsupported function fork");
+# if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
+ djSP; dTARGET;
+ Pid_t childpid;
+
+ EXTEND(SP, 1);
+ PERL_FLUSHALL_FOR_CHILD;
+ childpid = PerlProc_fork();
+ PUSHi(childpid);
+ RETURN;
+# else
+ DIE(aTHX_ PL_no_func, "Unsupported function fork");
+# endif
#endif
}
PP(pp_wait)
{
-#if !defined(DOSISH) || defined(OS2) || defined(WIN32)
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
djSP; dTARGET;
- int childpid;
+ Pid_t childpid;
int argflags;
childpid = wait4pid(-1, &argflags, 0);
@@ -3198,15 +3700,15 @@ PP(pp_wait)
XPUSHi(childpid);
RETURN;
#else
- DIE(no_func, "Unsupported function wait");
+ DIE(aTHX_ PL_no_func, "Unsupported function wait");
#endif
}
PP(pp_waitpid)
{
-#if !defined(DOSISH) || defined(OS2) || defined(WIN32)
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
djSP; dTARGET;
- int childpid;
+ Pid_t childpid;
int optype;
int argflags;
@@ -3217,7 +3719,7 @@ PP(pp_waitpid)
SETi(childpid);
RETURN;
#else
- DIE(no_func, "Unsupported function waitpid");
+ DIE(aTHX_ PL_no_func, "Unsupported function waitpid");
#endif
}
@@ -3225,11 +3727,13 @@ PP(pp_system)
{
djSP; dMARK; dORIGMARK; dTARGET;
I32 value;
- int childpid;
+ Pid_t childpid;
int result;
int status;
Sigsave_t ihand,qhand; /* place to save signals during system() */
STRLEN n_a;
+ I32 did_pipes = 0;
+ int pp[2];
if (SP - MARK == 1) {
if (PL_tainting) {
@@ -3238,17 +3742,26 @@ PP(pp_system)
TAINT_PROPER("system");
}
}
+ PERL_FLUSHALL_FOR_CHILD;
#if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2)
+ if (PerlProc_pipe(pp) >= 0)
+ did_pipes = 1;
while ((childpid = vfork()) == -1) {
if (errno != EAGAIN) {
value = -1;
SP = ORIGMARK;
PUSHi(value);
+ if (did_pipes) {
+ PerlLIO_close(pp[0]);
+ PerlLIO_close(pp[1]);
+ }
RETURN;
}
sleep(5);
}
if (childpid > 0) {
+ if (did_pipes)
+ PerlLIO_close(pp[1]);
rsignal_save(SIGINT, SIG_IGN, &ihand);
rsignal_save(SIGQUIT, SIG_IGN, &qhand);
do {
@@ -3259,17 +3772,43 @@ PP(pp_system)
STATUS_NATIVE_SET(result == -1 ? -1 : status);
do_execfree(); /* free any memory child malloced on vfork */
SP = ORIGMARK;
+ if (did_pipes) {
+ int errkid;
+ int n = 0, n1;
+
+ while (n < sizeof(int)) {
+ n1 = PerlLIO_read(pp[0],
+ (void*)(((char*)&errkid)+n),
+ (sizeof(int)) - n);
+ if (n1 <= 0)
+ break;
+ n += n1;
+ }
+ PerlLIO_close(pp[0]);
+ if (n) { /* Error */
+ if (n != sizeof(int))
+ DIE(aTHX_ "panic: kid popen errno read");
+ errno = errkid; /* Propagate errno from kid */
+ STATUS_CURRENT = -1;
+ }
+ }
PUSHi(STATUS_CURRENT);
RETURN;
}
+ if (did_pipes) {
+ PerlLIO_close(pp[0]);
+#if defined(HAS_FCNTL) && defined(F_SETFD)
+ fcntl(pp[1], F_SETFD, FD_CLOEXEC);
+#endif
+ }
if (PL_op->op_flags & OPf_STACKED) {
SV *really = *++MARK;
- value = (I32)do_aexec(really, MARK, SP);
+ value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
}
else if (SP - MARK != 1)
- value = (I32)do_aexec(Nullsv, MARK, SP);
+ value = (I32)do_aexec5(Nullsv, MARK, SP, pp[1], did_pipes);
else {
- value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), n_a));
+ value = (I32)do_exec3(SvPVx(sv_mortalcopy(*SP), n_a), pp[1], did_pipes);
}
PerlProc__exit(-1);
#else /* ! FORK or VMS or OS/2 */
@@ -3296,6 +3835,7 @@ PP(pp_exec)
I32 value;
STRLEN n_a;
+ PERL_FLUSHALL_FOR_CHILD;
if (PL_op->op_flags & OPf_STACKED) {
SV *really = *++MARK;
value = (I32)do_aexec(really, MARK, SP);
@@ -3304,7 +3844,14 @@ PP(pp_exec)
#ifdef VMS
value = (I32)vms_do_aexec(Nullsv, MARK, SP);
#else
+# ifdef __OPEN_VM
+ {
+ (void ) do_aspawn(Nullsv, MARK, SP);
+ value = 0;
+ }
+# else
value = (I32)do_aexec(Nullsv, MARK, SP);
+# endif
#endif
else {
if (PL_tainting) {
@@ -3315,9 +3862,20 @@ PP(pp_exec)
#ifdef VMS
value = (I32)vms_do_exec(SvPVx(sv_mortalcopy(*SP), n_a));
#else
+# ifdef __OPEN_VM
+ (void) do_spawn(SvPVx(sv_mortalcopy(*SP), n_a));
+ value = 0;
+# else
value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), n_a));
+# endif
#endif
}
+
+#if !defined(HAS_FORK) && defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
+ if (value >= 0)
+ my_exit(value);
+#endif
+
SP = ORIGMARK;
PUSHi(value);
RETURN;
@@ -3333,7 +3891,7 @@ PP(pp_kill)
PUSHi(value);
RETURN;
#else
- DIE(no_func, "Unsupported function kill");
+ DIE(aTHX_ PL_no_func, "Unsupported function kill");
#endif
}
@@ -3344,7 +3902,7 @@ PP(pp_getppid)
XPUSHi( getppid() );
RETURN;
#else
- DIE(no_func, "getppid");
+ DIE(aTHX_ PL_no_func, "getppid");
#endif
}
@@ -3352,24 +3910,24 @@ PP(pp_getpgrp)
{
#ifdef HAS_GETPGRP
djSP; dTARGET;
- int pid;
- I32 value;
+ Pid_t pid;
+ Pid_t pgrp;
if (MAXARG < 1)
pid = 0;
else
pid = SvIVx(POPs);
#ifdef BSD_GETPGRP
- value = (I32)BSD_GETPGRP(pid);
+ pgrp = (I32)BSD_GETPGRP(pid);
#else
- if (pid != 0 && pid != getpid())
- DIE("POSIX getpgrp can't take an argument");
- value = (I32)getpgrp();
+ if (pid != 0 && pid != PerlProc_getpid())
+ DIE(aTHX_ "POSIX getpgrp can't take an argument");
+ pgrp = getpgrp();
#endif
- XPUSHi(value);
+ XPUSHi(pgrp);
RETURN;
#else
- DIE(no_func, "getpgrp()");
+ DIE(aTHX_ PL_no_func, "getpgrp()");
#endif
}
@@ -3377,8 +3935,8 @@ PP(pp_setpgrp)
{
#ifdef HAS_SETPGRP
djSP; dTARGET;
- int pgrp;
- int pid;
+ Pid_t pgrp;
+ Pid_t pid;
if (MAXARG < 2) {
pgrp = 0;
pid = 0;
@@ -3392,13 +3950,16 @@ PP(pp_setpgrp)
#ifdef BSD_SETPGRP
SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
#else
- if ((pgrp != 0 && pgrp != getpid()) || (pid != 0 && pid != getpid()))
- DIE("POSIX setpgrp can't take an argument");
+ if ((pgrp != 0 && pgrp != PerlProc_getpid())
+ || (pid != 0 && pid != PerlProc_getpid()))
+ {
+ DIE(aTHX_ "setpgrp can't take arguments");
+ }
SETi( setpgrp() >= 0 );
#endif /* USE_BSDPGRP */
RETURN;
#else
- DIE(no_func, "setpgrp()");
+ DIE(aTHX_ PL_no_func, "setpgrp()");
#endif
}
@@ -3413,7 +3974,7 @@ PP(pp_getpriority)
SETi( getpriority(which, who) );
RETURN;
#else
- DIE(no_func, "getpriority()");
+ DIE(aTHX_ PL_no_func, "getpriority()");
#endif
}
@@ -3431,7 +3992,7 @@ PP(pp_setpriority)
SETi( setpriority(which, who, niceval) >= 0 );
RETURN;
#else
- DIE(no_func, "setpriority()");
+ DIE(aTHX_ PL_no_func, "setpriority()");
#endif
}
@@ -3469,7 +4030,7 @@ PP(pp_tms)
djSP;
#ifndef HAS_TIMES
- DIE("times not implemented");
+ DIE(aTHX_ "times not implemented");
#else
EXTEND(SP, 4);
@@ -3481,11 +4042,11 @@ PP(pp_tms)
/* is returned. */
#endif
- PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_utime)/HZ)));
+ PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_utime)/HZ)));
if (GIMME == G_ARRAY) {
- PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_stime)/HZ)));
- PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_cutime)/HZ)));
- PUSHs(sv_2mortal(newSVnv(((double)PL_timesbuf.tms_cstime)/HZ)));
+ PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_stime)/HZ)));
+ PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cutime)/HZ)));
+ PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cstime)/HZ)));
}
RETURN;
#endif /* HAS_TIMES */
@@ -3493,7 +4054,7 @@ PP(pp_tms)
PP(pp_localtime)
{
- return pp_gmtime(ARGS);
+ return pp_gmtime();
}
PP(pp_gmtime)
@@ -3522,30 +4083,29 @@ PP(pp_gmtime)
EXTEND(SP, 9);
EXTEND_MORTAL(9);
if (GIMME != G_ARRAY) {
- dTARGET;
SV *tsv;
if (!tmbuf)
RETPUSHUNDEF;
- tsv = newSVpvf("%s %s %2d %02d:%02d:%02d %d",
- dayname[tmbuf->tm_wday],
- monname[tmbuf->tm_mon],
- tmbuf->tm_mday,
- tmbuf->tm_hour,
- tmbuf->tm_min,
- tmbuf->tm_sec,
- tmbuf->tm_year + 1900);
+ tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %d",
+ dayname[tmbuf->tm_wday],
+ monname[tmbuf->tm_mon],
+ tmbuf->tm_mday,
+ tmbuf->tm_hour,
+ tmbuf->tm_min,
+ tmbuf->tm_sec,
+ tmbuf->tm_year + 1900);
PUSHs(sv_2mortal(tsv));
}
else if (tmbuf) {
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_sec)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_min)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_hour)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mday)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mon)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_year)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_wday)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_yday)));
- PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_isdst)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_sec)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_min)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_hour)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_mday)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_mon)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_year)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_wday)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_yday)));
+ PUSHs(sv_2mortal(newSViv(tmbuf->tm_isdst)));
}
RETURN;
}
@@ -3560,10 +4120,10 @@ PP(pp_alarm)
EXTEND(SP, 1);
if (anum < 0)
RETPUSHUNDEF;
- PUSHi((I32)anum);
+ PUSHi(anum);
RETURN;
#else
- DIE(no_func, "Unsupported function alarm");
+ DIE(aTHX_ PL_no_func, "Unsupported function alarm");
#endif
}
@@ -3590,17 +4150,17 @@ PP(pp_sleep)
PP(pp_shmget)
{
- return pp_semget(ARGS);
+ return pp_semget();
}
PP(pp_shmctl)
{
- return pp_semctl(ARGS);
+ return pp_semctl();
}
PP(pp_shmread)
{
- return pp_shmwrite(ARGS);
+ return pp_shmwrite();
}
PP(pp_shmwrite)
@@ -3612,7 +4172,7 @@ PP(pp_shmwrite)
PUSHi(value);
RETURN;
#else
- return pp_semget(ARGS);
+ return pp_semget();
#endif
}
@@ -3620,12 +4180,12 @@ PP(pp_shmwrite)
PP(pp_msgget)
{
- return pp_semget(ARGS);
+ return pp_semget();
}
PP(pp_msgctl)
{
- return pp_semctl(ARGS);
+ return pp_semctl();
}
PP(pp_msgsnd)
@@ -3637,7 +4197,7 @@ PP(pp_msgsnd)
PUSHi(value);
RETURN;
#else
- return pp_semget(ARGS);
+ return pp_semget();
#endif
}
@@ -3650,7 +4210,7 @@ PP(pp_msgrcv)
PUSHi(value);
RETURN;
#else
- return pp_semget(ARGS);
+ return pp_semget();
#endif
}
@@ -3667,7 +4227,7 @@ PP(pp_semget)
PUSHi(anum);
RETURN;
#else
- DIE("System V IPC is not implemented on this machine");
+ DIE(aTHX_ "System V IPC is not implemented on this machine");
#endif
}
@@ -3687,7 +4247,7 @@ PP(pp_semctl)
}
RETURN;
#else
- return pp_semget(ARGS);
+ return pp_semget();
#endif
}
@@ -3700,7 +4260,7 @@ PP(pp_semop)
PUSHi(value);
RETURN;
#else
- return pp_semget(ARGS);
+ return pp_semget();
#endif
}
@@ -3709,18 +4269,18 @@ PP(pp_semop)
PP(pp_ghbyname)
{
#ifdef HAS_GETHOSTBYNAME
- return pp_ghostent(ARGS);
+ return pp_ghostent();
#else
- DIE(no_sock_func, "gethostbyname");
+ DIE(aTHX_ PL_no_sock_func, "gethostbyname");
#endif
}
PP(pp_ghbyaddr)
{
#ifdef HAS_GETHOSTBYADDR
- return pp_ghostent(ARGS);
+ return pp_ghostent();
#else
- DIE(no_sock_func, "gethostbyaddr");
+ DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
#endif
}
@@ -3738,16 +4298,15 @@ PP(pp_ghostent)
#endif
struct hostent *hent;
unsigned long len;
+ STRLEN n_a;
EXTEND(SP, 10);
- if (which == OP_GHBYNAME) {
+ if (which == OP_GHBYNAME)
#ifdef HAS_GETHOSTBYNAME
- STRLEN n_a;
hent = PerlSock_gethostbyname(POPpx);
#else
- DIE(no_sock_func, "gethostbyname");
+ DIE(aTHX_ PL_no_sock_func, "gethostbyname");
#endif
- }
else if (which == OP_GHBYADDR) {
#ifdef HAS_GETHOSTBYADDR
int addrtype = POPi;
@@ -3757,14 +4316,14 @@ PP(pp_ghostent)
hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
#else
- DIE(no_sock_func, "gethostbyaddr");
+ DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
#endif
}
else
#ifdef HAS_GETHOSTENT
hent = PerlSock_gethostent();
#else
- DIE(no_sock_func, "gethostent");
+ DIE(aTHX_ PL_no_sock_func, "gethostent");
#endif
#ifdef HOST_NOT_FOUND
@@ -3812,25 +4371,25 @@ PP(pp_ghostent)
}
RETURN;
#else
- DIE(no_sock_func, "gethostent");
+ DIE(aTHX_ PL_no_sock_func, "gethostent");
#endif
}
PP(pp_gnbyname)
{
#ifdef HAS_GETNETBYNAME
- return pp_gnetent(ARGS);
+ return pp_gnetent();
#else
- DIE(no_sock_func, "getnetbyname");
+ DIE(aTHX_ PL_no_sock_func, "getnetbyname");
#endif
}
PP(pp_gnbyaddr)
{
#ifdef HAS_GETNETBYADDR
- return pp_gnetent(ARGS);
+ return pp_gnetent();
#else
- DIE(no_sock_func, "getnetbyaddr");
+ DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
#endif
}
@@ -3847,29 +4406,28 @@ PP(pp_gnetent)
struct netent *PerlSock_getnetent(void);
#endif
struct netent *nent;
+ STRLEN n_a;
- if (which == OP_GNBYNAME) {
+ if (which == OP_GNBYNAME)
#ifdef HAS_GETNETBYNAME
- STRLEN n_a;
nent = PerlSock_getnetbyname(POPpx);
#else
- DIE(no_sock_func, "getnetbyname");
+ DIE(aTHX_ PL_no_sock_func, "getnetbyname");
#endif
- }
else if (which == OP_GNBYADDR) {
#ifdef HAS_GETNETBYADDR
int addrtype = POPi;
Netdb_net_t addr = (Netdb_net_t) U_L(POPn);
nent = PerlSock_getnetbyaddr(addr, addrtype);
#else
- DIE(no_sock_func, "getnetbyaddr");
+ DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
#endif
}
else
#ifdef HAS_GETNETENT
nent = PerlSock_getnetent();
#else
- DIE(no_sock_func, "getnetent");
+ DIE(aTHX_ PL_no_sock_func, "getnetent");
#endif
EXTEND(SP, 4);
@@ -3901,25 +4459,25 @@ PP(pp_gnetent)
RETURN;
#else
- DIE(no_sock_func, "getnetent");
+ DIE(aTHX_ PL_no_sock_func, "getnetent");
#endif
}
PP(pp_gpbyname)
{
#ifdef HAS_GETPROTOBYNAME
- return pp_gprotoent(ARGS);
+ return pp_gprotoent();
#else
- DIE(no_sock_func, "getprotobyname");
+ DIE(aTHX_ PL_no_sock_func, "getprotobyname");
#endif
}
PP(pp_gpbynumber)
{
#ifdef HAS_GETPROTOBYNUMBER
- return pp_gprotoent(ARGS);
+ return pp_gprotoent();
#else
- DIE(no_sock_func, "getprotobynumber");
+ DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
#endif
}
@@ -3936,26 +4494,25 @@ PP(pp_gprotoent)
struct protoent *PerlSock_getprotoent(void);
#endif
struct protoent *pent;
+ STRLEN n_a;
- if (which == OP_GPBYNAME) {
+ if (which == OP_GPBYNAME)
#ifdef HAS_GETPROTOBYNAME
- STRLEN n_a;
pent = PerlSock_getprotobyname(POPpx);
#else
- DIE(no_sock_func, "getprotobyname");
+ DIE(aTHX_ PL_no_sock_func, "getprotobyname");
#endif
- }
else if (which == OP_GPBYNUMBER)
#ifdef HAS_GETPROTOBYNUMBER
pent = PerlSock_getprotobynumber(POPi);
#else
- DIE(no_sock_func, "getprotobynumber");
+ DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
#endif
else
#ifdef HAS_GETPROTOENT
pent = PerlSock_getprotoent();
#else
- DIE(no_sock_func, "getprotoent");
+ DIE(aTHX_ PL_no_sock_func, "getprotoent");
#endif
EXTEND(SP, 3);
@@ -3985,25 +4542,25 @@ PP(pp_gprotoent)
RETURN;
#else
- DIE(no_sock_func, "getprotoent");
+ DIE(aTHX_ PL_no_sock_func, "getprotoent");
#endif
}
PP(pp_gsbyname)
{
#ifdef HAS_GETSERVBYNAME
- return pp_gservent(ARGS);
+ return pp_gservent();
#else
- DIE(no_sock_func, "getservbyname");
+ DIE(aTHX_ PL_no_sock_func, "getservbyname");
#endif
}
PP(pp_gsbyport)
{
#ifdef HAS_GETSERVBYPORT
- return pp_gservent(ARGS);
+ return pp_gservent();
#else
- DIE(no_sock_func, "getservbyport");
+ DIE(aTHX_ PL_no_sock_func, "getservbyport");
#endif
}
@@ -4020,10 +4577,10 @@ PP(pp_gservent)
struct servent *PerlSock_getservent(void);
#endif
struct servent *sent;
+ STRLEN n_a;
if (which == OP_GSBYNAME) {
#ifdef HAS_GETSERVBYNAME
- STRLEN n_a;
char *proto = POPpx;
char *name = POPpx;
@@ -4032,12 +4589,11 @@ PP(pp_gservent)
sent = PerlSock_getservbyname(name, proto);
#else
- DIE(no_sock_func, "getservbyname");
+ DIE(aTHX_ PL_no_sock_func, "getservbyname");
#endif
}
else if (which == OP_GSBYPORT) {
#ifdef HAS_GETSERVBYPORT
- STRLEN n_a;
char *proto = POPpx;
unsigned short port = POPu;
@@ -4046,14 +4602,14 @@ PP(pp_gservent)
#endif
sent = PerlSock_getservbyport(port, proto);
#else
- DIE(no_sock_func, "getservbyport");
+ DIE(aTHX_ PL_no_sock_func, "getservbyport");
#endif
}
else
#ifdef HAS_GETSERVENT
sent = PerlSock_getservent();
#else
- DIE(no_sock_func, "getservent");
+ DIE(aTHX_ PL_no_sock_func, "getservent");
#endif
EXTEND(SP, 4);
@@ -4094,7 +4650,7 @@ PP(pp_gservent)
RETURN;
#else
- DIE(no_sock_func, "getservent");
+ DIE(aTHX_ PL_no_sock_func, "getservent");
#endif
}
@@ -4105,7 +4661,7 @@ PP(pp_shostent)
PerlSock_sethostent(TOPi);
RETSETYES;
#else
- DIE(no_sock_func, "sethostent");
+ DIE(aTHX_ PL_no_sock_func, "sethostent");
#endif
}
@@ -4116,7 +4672,7 @@ PP(pp_snetent)
PerlSock_setnetent(TOPi);
RETSETYES;
#else
- DIE(no_sock_func, "setnetent");
+ DIE(aTHX_ PL_no_sock_func, "setnetent");
#endif
}
@@ -4127,7 +4683,7 @@ PP(pp_sprotoent)
PerlSock_setprotoent(TOPi);
RETSETYES;
#else
- DIE(no_sock_func, "setprotoent");
+ DIE(aTHX_ PL_no_sock_func, "setprotoent");
#endif
}
@@ -4138,7 +4694,7 @@ PP(pp_sservent)
PerlSock_setservent(TOPi);
RETSETYES;
#else
- DIE(no_sock_func, "setservent");
+ DIE(aTHX_ PL_no_sock_func, "setservent");
#endif
}
@@ -4150,7 +4706,7 @@ PP(pp_ehostent)
EXTEND(SP,1);
RETPUSHYES;
#else
- DIE(no_sock_func, "endhostent");
+ DIE(aTHX_ PL_no_sock_func, "endhostent");
#endif
}
@@ -4162,7 +4718,7 @@ PP(pp_enetent)
EXTEND(SP,1);
RETPUSHYES;
#else
- DIE(no_sock_func, "endnetent");
+ DIE(aTHX_ PL_no_sock_func, "endnetent");
#endif
}
@@ -4174,7 +4730,7 @@ PP(pp_eprotoent)
EXTEND(SP,1);
RETPUSHYES;
#else
- DIE(no_sock_func, "endprotoent");
+ DIE(aTHX_ PL_no_sock_func, "endprotoent");
#endif
}
@@ -4186,50 +4742,78 @@ PP(pp_eservent)
EXTEND(SP,1);
RETPUSHYES;
#else
- DIE(no_sock_func, "endservent");
+ DIE(aTHX_ PL_no_sock_func, "endservent");
#endif
}
PP(pp_gpwnam)
{
#ifdef HAS_PASSWD
- return pp_gpwent(ARGS);
+ return pp_gpwent();
#else
- DIE(no_func, "getpwnam");
+ DIE(aTHX_ PL_no_func, "getpwnam");
#endif
}
PP(pp_gpwuid)
{
#ifdef HAS_PASSWD
- return pp_gpwent(ARGS);
+ return pp_gpwent();
#else
- DIE(no_func, "getpwuid");
+ DIE(aTHX_ PL_no_func, "getpwuid");
#endif
}
PP(pp_gpwent)
{
djSP;
-#if defined(HAS_PASSWD) && defined(HAS_GETPWENT)
+#ifdef HAS_PASSWD
I32 which = PL_op->op_type;
register SV *sv;
struct passwd *pwent;
STRLEN n_a;
+#if defined(HAS_GETSPENT) || defined(HAS_GETSPNAM)
+ struct spwd *spwent = NULL;
+#endif
if (which == OP_GPWNAM)
pwent = getpwnam(POPpx);
else if (which == OP_GPWUID)
pwent = getpwuid(POPi);
else
+#ifdef HAS_GETPWENT
pwent = (struct passwd *)getpwent();
+#else
+ DIE(aTHX_ PL_no_func, "getpwent");
+#endif
+
+#ifdef HAS_GETSPNAM
+ if (which == OP_GPWNAM) {
+ if (pwent)
+ spwent = getspnam(pwent->pw_name);
+ }
+# ifdef HAS_GETSPUID /* AFAIK there isn't any anywhere. --jhi */
+ else if (which == OP_GPWUID) {
+ if (pwent)
+ spwent = getspnam(pwent->pw_name);
+ }
+# endif
+# ifdef HAS_GETSPENT
+ else
+ spwent = (struct spwd *)getspent();
+# endif
+#endif
EXTEND(SP, 10);
if (GIMME != G_ARRAY) {
PUSHs(sv = sv_newmortal());
if (pwent) {
if (which == OP_GPWNAM)
+#if Uid_t_sign <= 0
sv_setiv(sv, (IV)pwent->pw_uid);
+#else
+ sv_setuv(sv, (UV)pwent->pw_uid);
+#endif
else
sv_setpv(sv, pwent->pw_name);
}
@@ -4242,15 +4826,33 @@ PP(pp_gpwent)
PUSHs(sv = sv_mortalcopy(&PL_sv_no));
#ifdef PWPASSWD
+# if defined(HAS_GETSPENT) || defined(HAS_GETSPNAM)
+ if (spwent)
+ sv_setpv(sv, spwent->sp_pwdp);
+ else
+ sv_setpv(sv, pwent->pw_passwd);
+# else
sv_setpv(sv, pwent->pw_passwd);
+# endif
+#endif
+#ifndef INCOMPLETE_TAINTS
+ /* passwd is tainted because user himself can diddle with it. */
+ SvTAINTED_on(sv);
#endif
PUSHs(sv = sv_mortalcopy(&PL_sv_no));
+#if Uid_t_sign <= 0
sv_setiv(sv, (IV)pwent->pw_uid);
+#else
+ sv_setuv(sv, (UV)pwent->pw_uid);
+#endif
PUSHs(sv = sv_mortalcopy(&PL_sv_no));
+#if Uid_t_sign <= 0
sv_setiv(sv, (IV)pwent->pw_gid);
-
+#else
+ sv_setuv(sv, (UV)pwent->pw_gid);
+#endif
/* pw_change, pw_quota, and pw_age are mutually exclusive. */
PUSHs(sv = sv_mortalcopy(&PL_sv_no));
#ifdef PWCHANGE
@@ -4289,6 +4891,10 @@ PP(pp_gpwent)
PUSHs(sv = sv_mortalcopy(&PL_sv_no));
sv_setpv(sv, pwent->pw_shell);
+#ifndef INCOMPLETE_TAINTS
+ /* pw_shell is tainted because user himself can diddle with it. */
+ SvTAINTED_on(sv);
+#endif
#ifdef PWEXPIRE
PUSHs(sv = sv_mortalcopy(&PL_sv_no));
@@ -4297,18 +4903,21 @@ PP(pp_gpwent)
}
RETURN;
#else
- DIE(no_func, "getpwent");
+ DIE(aTHX_ PL_no_func, "getpwent");
#endif
}
PP(pp_spwent)
{
djSP;
-#if defined(HAS_PASSWD) && defined(HAS_SETPWENT) && !defined(CYGWIN32)
+#if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
setpwent();
+# ifdef HAS_SETSPENT
+ setspent();
+# endif
RETPUSHYES;
#else
- DIE(no_func, "setpwent");
+ DIE(aTHX_ PL_no_func, "setpwent");
#endif
}
@@ -4317,34 +4926,37 @@ PP(pp_epwent)
djSP;
#if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
endpwent();
+# ifdef HAS_ENDSPENT
+ endspent();
+# endif
RETPUSHYES;
#else
- DIE(no_func, "endpwent");
+ DIE(aTHX_ PL_no_func, "endpwent");
#endif
}
PP(pp_ggrnam)
{
#ifdef HAS_GROUP
- return pp_ggrent(ARGS);
+ return pp_ggrent();
#else
- DIE(no_func, "getgrnam");
+ DIE(aTHX_ PL_no_func, "getgrnam");
#endif
}
PP(pp_ggrgid)
{
#ifdef HAS_GROUP
- return pp_ggrent(ARGS);
+ return pp_ggrent();
#else
- DIE(no_func, "getgrgid");
+ DIE(aTHX_ PL_no_func, "getgrgid");
#endif
}
PP(pp_ggrent)
{
djSP;
-#if defined(HAS_GROUP) && defined(HAS_GETGRENT)
+#ifdef HAS_GROUP
I32 which = PL_op->op_type;
register char **elem;
register SV *sv;
@@ -4356,7 +4968,11 @@ PP(pp_ggrent)
else if (which == OP_GGRGID)
grent = (struct group *)getgrgid(POPi);
else
+#ifdef HAS_GETGRENT
grent = (struct group *)getgrent();
+#else
+ DIE(aTHX_ PL_no_func, "getgrent");
+#endif
EXTEND(SP, 4);
if (GIMME != G_ARRAY) {
@@ -4392,7 +5008,7 @@ PP(pp_ggrent)
RETURN;
#else
- DIE(no_func, "getgrent");
+ DIE(aTHX_ PL_no_func, "getgrent");
#endif
}
@@ -4403,7 +5019,7 @@ PP(pp_sgrent)
setgrent();
RETPUSHYES;
#else
- DIE(no_func, "setgrent");
+ DIE(aTHX_ PL_no_func, "setgrent");
#endif
}
@@ -4414,7 +5030,7 @@ PP(pp_egrent)
endgrent();
RETPUSHYES;
#else
- DIE(no_func, "endgrent");
+ DIE(aTHX_ PL_no_func, "endgrent");
#endif
}
@@ -4429,7 +5045,7 @@ PP(pp_getlogin)
PUSHp(tmps, strlen(tmps));
RETURN;
#else
- DIE(no_func, "getlogin");
+ DIE(aTHX_ PL_no_func, "getlogin");
#endif
}
@@ -4443,7 +5059,7 @@ PP(pp_syscall)
unsigned long a[20];
register I32 i = 0;
I32 retval = -1;
- MAGIC *mg;
+ STRLEN n_a;
if (PL_tainting) {
while (++MARK <= SP) {
@@ -4465,18 +5081,16 @@ PP(pp_syscall)
a[i++] = SvIV(*MARK);
else if (*MARK == &PL_sv_undef)
a[i++] = 0;
- else {
- STRLEN n_a;
+ else
a[i++] = (unsigned long)SvPV_force(*MARK, n_a);
- }
if (i > 15)
break;
}
switch (items) {
default:
- DIE("Too many args to syscall");
+ DIE(aTHX_ "Too many args to syscall");
case 0:
- DIE("Too few args to syscall");
+ DIE(aTHX_ "Too few args to syscall");
case 1:
retval = syscall(a[0]);
break;
@@ -4530,7 +5144,7 @@ PP(pp_syscall)
PUSHi(retval);
RETURN;
#else
- DIE(no_func, "syscall");
+ DIE(aTHX_ PL_no_func, "syscall");
#endif
}
@@ -4560,7 +5174,7 @@ fcntl_emulate_flock(int fd, int operation)
return -1;
}
flock.l_whence = SEEK_SET;
- flock.l_start = flock.l_len = 0L;
+ flock.l_start = flock.l_len = (Off_t)0;
return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
}
@@ -4598,9 +5212,7 @@ fcntl_emulate_flock(int fd, int operation)
# endif
static int
-lockf_emulate_flock (fd, operation)
-int fd;
-int operation;
+lockf_emulate_flock(int fd, int operation)
{
int i;
int save_errno;
diff --git a/contrib/perl5/proto.h b/contrib/perl5/proto.h
index 62fb9f6..1be9992 100644
--- a/contrib/perl5/proto.h
+++ b/contrib/perl5/proto.h
@@ -1,909 +1,1259 @@
-#ifndef PERL_CALLCONV
-# define PERL_CALLCONV
-#endif
+/*
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is autogenerated from data in embed.pl. Edit that file
+ * and run 'make regen_headers' to effect changes.
+ */
+
+
-#ifdef PERL_OBJECT
-#define VIRTUAL virtual PERL_CALLCONV
-#else
-#define VIRTUAL PERL_CALLCONV
START_EXTERN_C
+
+#if defined(PERL_IMPLICIT_SYS)
+PERL_CALLCONV PerlInterpreter* perl_alloc_using(struct IPerlMem* m, struct IPerlMem* ms, struct IPerlMem* mp, struct IPerlEnv* e, struct IPerlStdIO* io, struct IPerlLIO* lio, struct IPerlDir* d, struct IPerlSock* s, struct IPerlProc* p);
+#endif
+PERL_CALLCONV PerlInterpreter* perl_alloc(void);
+PERL_CALLCONV void perl_construct(PerlInterpreter* interp);
+PERL_CALLCONV void perl_destruct(PerlInterpreter* interp);
+PERL_CALLCONV void perl_free(PerlInterpreter* interp);
+PERL_CALLCONV int perl_run(PerlInterpreter* interp);
+PERL_CALLCONV int perl_parse(PerlInterpreter* interp, XSINIT_t xsinit, int argc, char** argv, char** env);
+#if defined(USE_ITHREADS)
+PERL_CALLCONV PerlInterpreter* perl_clone(PerlInterpreter* interp, UV flags);
+# if defined(PERL_IMPLICIT_SYS)
+PERL_CALLCONV PerlInterpreter* perl_clone_using(PerlInterpreter *interp, UV flags, struct IPerlMem* m, struct IPerlMem* ms, struct IPerlMem* mp, struct IPerlEnv* e, struct IPerlStdIO* io, struct IPerlLIO* lio, struct IPerlDir* d, struct IPerlSock* s, struct IPerlProc* p);
+# endif
#endif
-/* NOTE!!! When new virtual functions are added, they must be added at
- * the end of this file to maintain binary compatibility with PERL_OBJECT
- */
+#if defined(MYMALLOC)
+PERL_CALLCONV Malloc_t Perl_malloc(MEM_SIZE nbytes);
+PERL_CALLCONV Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size);
+PERL_CALLCONV Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes);
+PERL_CALLCONV Free_t Perl_mfree(Malloc_t where);
+PERL_CALLCONV MEM_SIZE Perl_malloced_size(void *p);
+#endif
+
+PERL_CALLCONV void* Perl_get_context(void);
+PERL_CALLCONV void Perl_set_context(void *thx);
+END_EXTERN_C
-#ifndef NEXT30_NO_ATTRIBUTE
-#ifndef HASATTRIBUTE /* disable GNU-cc attribute checking? */
-#ifdef __attribute__ /* Avoid possible redefinition errors */
-#undef __attribute__
-#endif
-#define __attribute__(attr)
-#endif
-#endif
-#ifdef OVERLOAD
-VIRTUAL SV* amagic_call _((SV* left,SV* right,int method,int dir));
-VIRTUAL bool Gv_AMupdate _((HV* stash));
-#endif /* OVERLOAD */
-VIRTUAL OP* append_elem _((I32 optype, OP* head, OP* tail));
-VIRTUAL OP* append_list _((I32 optype, LISTOP* first, LISTOP* last));
-VIRTUAL I32 apply _((I32 type, SV** mark, SV** sp));
-VIRTUAL void assertref _((OP* o));
-VIRTUAL bool avhv_exists_ent _((AV *ar, SV* keysv, U32 hash));
-VIRTUAL SV** avhv_fetch_ent _((AV *ar, SV* keysv, I32 lval, U32 hash));
-VIRTUAL HE* avhv_iternext _((AV *ar));
-VIRTUAL SV* avhv_iterval _((AV *ar, HE* entry));
-VIRTUAL HV* avhv_keys _((AV *ar));
-VIRTUAL void av_clear _((AV* ar));
-VIRTUAL void av_extend _((AV* ar, I32 key));
-VIRTUAL AV* av_fake _((I32 size, SV** svp));
-VIRTUAL SV** av_fetch _((AV* ar, I32 key, I32 lval));
-VIRTUAL void av_fill _((AV* ar, I32 fill));
-VIRTUAL I32 av_len _((AV* ar));
-VIRTUAL AV* av_make _((I32 size, SV** svp));
-VIRTUAL SV* av_pop _((AV* ar));
-VIRTUAL void av_push _((AV* ar, SV* val));
-VIRTUAL void av_reify _((AV* ar));
-VIRTUAL SV* av_shift _((AV* ar));
-VIRTUAL SV** av_store _((AV* ar, I32 key, SV* val));
-VIRTUAL void av_undef _((AV* ar));
-VIRTUAL void av_unshift _((AV* ar, I32 num));
-VIRTUAL OP* bind_match _((I32 type, OP* left, OP* pat));
-VIRTUAL OP* block_end _((I32 floor, OP* seq));
-VIRTUAL I32 block_gimme _((void));
-VIRTUAL int block_start _((int full));
-VIRTUAL void boot_core_UNIVERSAL _((void));
-VIRTUAL void call_list _((I32 oldscope, AV* av_list));
-VIRTUAL I32 cando _((I32 bit, I32 effective, Stat_t* statbufp));
-#ifndef CASTNEGFLOAT
-VIRTUAL U32 cast_ulong _((double f));
+/* functions with flag 'n' should come before here */
+#if defined(PERL_OBJECT)
+class CPerlObj {
+public:
+ struct interpreter interp;
+ CPerlObj(IPerlMem*, IPerlMem*, IPerlMem*, IPerlEnv*, IPerlStdIO*,
+ IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
+ void* operator new(size_t nSize, IPerlMem *pvtbl);
+#ifndef __BORLANDC__
+ static void operator delete(void* pPerl, IPerlMem *pvtbl);
#endif
+ int do_aspawn (void *vreally, void **vmark, void **vsp);
+#endif
+#if defined(PERL_OBJECT)
+public:
+#else
+START_EXTERN_C
+#endif
+# include "pp_proto.h"
+PERL_CALLCONV SV* Perl_amagic_call(pTHX_ SV* left, SV* right, int method, int dir);
+PERL_CALLCONV bool Perl_Gv_AMupdate(pTHX_ HV* stash);
+PERL_CALLCONV OP* Perl_append_elem(pTHX_ I32 optype, OP* head, OP* tail);
+PERL_CALLCONV OP* Perl_append_list(pTHX_ I32 optype, LISTOP* first, LISTOP* last);
+PERL_CALLCONV I32 Perl_apply(pTHX_ I32 type, SV** mark, SV** sp);
+PERL_CALLCONV SV* Perl_avhv_delete_ent(pTHX_ AV *ar, SV* keysv, I32 flags, U32 hash);
+PERL_CALLCONV bool Perl_avhv_exists_ent(pTHX_ AV *ar, SV* keysv, U32 hash);
+PERL_CALLCONV SV** Perl_avhv_fetch_ent(pTHX_ AV *ar, SV* keysv, I32 lval, U32 hash);
+PERL_CALLCONV SV** Perl_avhv_store_ent(pTHX_ AV *ar, SV* keysv, SV* val, U32 hash);
+PERL_CALLCONV HE* Perl_avhv_iternext(pTHX_ AV *ar);
+PERL_CALLCONV SV* Perl_avhv_iterval(pTHX_ AV *ar, HE* entry);
+PERL_CALLCONV HV* Perl_avhv_keys(pTHX_ AV *ar);
+PERL_CALLCONV void Perl_av_clear(pTHX_ AV* ar);
+PERL_CALLCONV SV* Perl_av_delete(pTHX_ AV* ar, I32 key, I32 flags);
+PERL_CALLCONV bool Perl_av_exists(pTHX_ AV* ar, I32 key);
+PERL_CALLCONV void Perl_av_extend(pTHX_ AV* ar, I32 key);
+PERL_CALLCONV AV* Perl_av_fake(pTHX_ I32 size, SV** svp);
+PERL_CALLCONV SV** Perl_av_fetch(pTHX_ AV* ar, I32 key, I32 lval);
+PERL_CALLCONV void Perl_av_fill(pTHX_ AV* ar, I32 fill);
+PERL_CALLCONV I32 Perl_av_len(pTHX_ AV* ar);
+PERL_CALLCONV AV* Perl_av_make(pTHX_ I32 size, SV** svp);
+PERL_CALLCONV SV* Perl_av_pop(pTHX_ AV* ar);
+PERL_CALLCONV void Perl_av_push(pTHX_ AV* ar, SV* val);
+PERL_CALLCONV void Perl_av_reify(pTHX_ AV* ar);
+PERL_CALLCONV SV* Perl_av_shift(pTHX_ AV* ar);
+PERL_CALLCONV SV** Perl_av_store(pTHX_ AV* ar, I32 key, SV* val);
+PERL_CALLCONV void Perl_av_undef(pTHX_ AV* ar);
+PERL_CALLCONV void Perl_av_unshift(pTHX_ AV* ar, I32 num);
+PERL_CALLCONV OP* Perl_bind_match(pTHX_ I32 type, OP* left, OP* pat);
+PERL_CALLCONV OP* Perl_block_end(pTHX_ I32 floor, OP* seq);
+PERL_CALLCONV I32 Perl_block_gimme(pTHX);
+PERL_CALLCONV int Perl_block_start(pTHX_ int full);
+PERL_CALLCONV void Perl_boot_core_UNIVERSAL(pTHX);
+PERL_CALLCONV void Perl_call_list(pTHX_ I32 oldscope, AV* av_list);
+PERL_CALLCONV bool Perl_cando(pTHX_ Mode_t mode, Uid_t effective, Stat_t* statbufp);
+PERL_CALLCONV U32 Perl_cast_ulong(pTHX_ NV f);
+PERL_CALLCONV I32 Perl_cast_i32(pTHX_ NV f);
+PERL_CALLCONV IV Perl_cast_iv(pTHX_ NV f);
+PERL_CALLCONV UV Perl_cast_uv(pTHX_ NV f);
#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
-VIRTUAL I32 my_chsize _((int fd, Off_t length));
-#endif
-VIRTUAL OP* ck_gvconst _((OP* o));
-VIRTUAL OP* ck_retarget _((OP* o));
-#ifdef USE_THREADS
-VIRTUAL MAGIC * condpair_magic _((SV *sv));
-#endif
-VIRTUAL OP* convert _((I32 optype, I32 flags, OP* o));
-VIRTUAL void croak _((const char* pat,...)) __attribute__((noreturn));
-VIRTUAL void cv_ckproto _((CV* cv, GV* gv, char* p));
-VIRTUAL CV* cv_clone _((CV* proto));
-VIRTUAL SV* cv_const_sv _((CV* cv));
-VIRTUAL SV* op_const_sv _((OP* o, CV* cv));
-VIRTUAL void cv_undef _((CV* cv));
-VIRTUAL void cx_dump _((PERL_CONTEXT* cs));
-VIRTUAL SV* filter_add _((filter_t funcp, SV* datasv));
-VIRTUAL void filter_del _((filter_t funcp));
-VIRTUAL I32 filter_read _((int idx, SV* buffer, int maxlen));
-VIRTUAL char ** get_op_descs _((void));
-VIRTUAL char ** get_op_names _((void));
-VIRTUAL char * get_no_modify _((void));
-VIRTUAL U32 * get_opargs _((void));
-VIRTUAL I32 cxinc _((void));
-VIRTUAL void deb _((const char* pat,...));
-VIRTUAL void deb_growlevel _((void));
-VIRTUAL void debprofdump _((void));
-VIRTUAL I32 debop _((OP* o));
-VIRTUAL I32 debstack _((void));
-VIRTUAL I32 debstackptrs _((void));
-VIRTUAL char* delimcpy _((char* to, char* toend, char* from, char* fromend,
- int delim, I32* retlen));
-VIRTUAL void deprecate _((char* s));
-VIRTUAL OP* die _((const char* pat,...));
-VIRTUAL OP* die_where _((char* message));
-VIRTUAL void dounwind _((I32 cxix));
-VIRTUAL bool do_aexec _((SV* really, SV** mark, SV** sp));
-VIRTUAL int do_binmode _((PerlIO *fp, int iotype, int flag));
-VIRTUAL void do_chop _((SV* asv, SV* sv));
-VIRTUAL bool do_close _((GV* gv, bool not_implicit));
-VIRTUAL bool do_eof _((GV* gv));
-VIRTUAL bool do_exec _((char* cmd));
-VIRTUAL void do_execfree _((void));
-#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-I32 do_ipcctl _((I32 optype, SV** mark, SV** sp));
-I32 do_ipcget _((I32 optype, SV** mark, SV** sp));
+PERL_CALLCONV I32 Perl_my_chsize(pTHX_ int fd, Off_t length);
#endif
-VIRTUAL void do_join _((SV* sv, SV* del, SV** mark, SV** sp));
-VIRTUAL OP* do_kv _((ARGSproto));
-#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-I32 do_msgrcv _((SV** mark, SV** sp));
-I32 do_msgsnd _((SV** mark, SV** sp));
-#endif
-VIRTUAL bool do_open _((GV* gv, char* name, I32 len,
- int as_raw, int rawmode, int rawperm, PerlIO* supplied_fp));
-VIRTUAL void do_pipe _((SV* sv, GV* rgv, GV* wgv));
-VIRTUAL bool do_print _((SV* sv, PerlIO* fp));
-VIRTUAL OP* do_readline _((void));
-VIRTUAL I32 do_chomp _((SV* sv));
-VIRTUAL bool do_seek _((GV* gv, long pos, int whence));
+#if defined(USE_THREADS)
+PERL_CALLCONV MAGIC* Perl_condpair_magic(pTHX_ SV *sv);
+#endif
+PERL_CALLCONV OP* Perl_convert(pTHX_ I32 optype, I32 flags, OP* o);
+PERL_CALLCONV void Perl_croak(pTHX_ const char* pat, ...) __attribute__((noreturn))
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_1,pTHX_2)))
+#endif
+;
+PERL_CALLCONV void Perl_vcroak(pTHX_ const char* pat, va_list* args) __attribute__((noreturn));
+#if defined(PERL_IMPLICIT_CONTEXT)
+PERL_CALLCONV void Perl_croak_nocontext(const char* pat, ...) __attribute__((noreturn))
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,1,2)))
+#endif
+;
+PERL_CALLCONV OP* Perl_die_nocontext(const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,1,2)))
+#endif
+;
+PERL_CALLCONV void Perl_deb_nocontext(const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,1,2)))
+#endif
+;
+PERL_CALLCONV char* Perl_form_nocontext(const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,1,2)))
+#endif
+;
+PERL_CALLCONV void Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,3,4)))
+#endif
+;
+PERL_CALLCONV SV* Perl_mess_nocontext(const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,1,2)))
+#endif
+;
+PERL_CALLCONV void Perl_warn_nocontext(const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,1,2)))
+#endif
+;
+PERL_CALLCONV void Perl_warner_nocontext(U32 err, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,2,3)))
+#endif
+;
+PERL_CALLCONV SV* Perl_newSVpvf_nocontext(const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,1,2)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_catpvf_nocontext(SV* sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,2,3)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_setpvf_nocontext(SV* sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,2,3)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_catpvf_mg_nocontext(SV* sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,2,3)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_setpvf_mg_nocontext(SV* sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,2,3)))
+#endif
+;
+PERL_CALLCONV int Perl_fprintf_nocontext(PerlIO* stream, const char* fmt, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,2,3)))
+#endif
+;
+#endif
+PERL_CALLCONV void Perl_cv_ckproto(pTHX_ CV* cv, GV* gv, char* p);
+PERL_CALLCONV CV* Perl_cv_clone(pTHX_ CV* proto);
+PERL_CALLCONV SV* Perl_cv_const_sv(pTHX_ CV* cv);
+PERL_CALLCONV SV* Perl_op_const_sv(pTHX_ OP* o, CV* cv);
+PERL_CALLCONV void Perl_cv_undef(pTHX_ CV* cv);
+PERL_CALLCONV void Perl_cx_dump(pTHX_ PERL_CONTEXT* cs);
+PERL_CALLCONV SV* Perl_filter_add(pTHX_ filter_t funcp, SV* datasv);
+PERL_CALLCONV void Perl_filter_del(pTHX_ filter_t funcp);
+PERL_CALLCONV I32 Perl_filter_read(pTHX_ int idx, SV* buffer, int maxlen);
+PERL_CALLCONV char** Perl_get_op_descs(pTHX);
+PERL_CALLCONV char** Perl_get_op_names(pTHX);
+PERL_CALLCONV char* Perl_get_no_modify(pTHX);
+PERL_CALLCONV U32* Perl_get_opargs(pTHX);
+PERL_CALLCONV PPADDR_t* Perl_get_ppaddr(pTHX);
+PERL_CALLCONV I32 Perl_cxinc(pTHX);
+PERL_CALLCONV void Perl_deb(pTHX_ const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_1,pTHX_2)))
+#endif
+;
+PERL_CALLCONV void Perl_vdeb(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void Perl_debprofdump(pTHX);
+PERL_CALLCONV I32 Perl_debop(pTHX_ OP* o);
+PERL_CALLCONV I32 Perl_debstack(pTHX);
+PERL_CALLCONV I32 Perl_debstackptrs(pTHX);
+PERL_CALLCONV char* Perl_delimcpy(pTHX_ char* to, char* toend, char* from, char* fromend, int delim, I32* retlen);
+PERL_CALLCONV void Perl_deprecate(pTHX_ char* s);
+PERL_CALLCONV OP* Perl_die(pTHX_ const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_1,pTHX_2)))
+#endif
+;
+PERL_CALLCONV OP* Perl_vdie(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV OP* Perl_die_where(pTHX_ char* message, STRLEN msglen);
+PERL_CALLCONV void Perl_dounwind(pTHX_ I32 cxix);
+PERL_CALLCONV bool Perl_do_aexec(pTHX_ SV* really, SV** mark, SV** sp);
+PERL_CALLCONV bool Perl_do_aexec5(pTHX_ SV* really, SV** mark, SV** sp, int fd, int flag);
+PERL_CALLCONV int Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int flag);
+PERL_CALLCONV void Perl_do_chop(pTHX_ SV* asv, SV* sv);
+PERL_CALLCONV bool Perl_do_close(pTHX_ GV* gv, bool not_implicit);
+PERL_CALLCONV bool Perl_do_eof(pTHX_ GV* gv);
+PERL_CALLCONV bool Perl_do_exec(pTHX_ char* cmd);
+#if !defined(WIN32)
+PERL_CALLCONV bool Perl_do_exec3(pTHX_ char* cmd, int fd, int flag);
+#endif
+PERL_CALLCONV void Perl_do_execfree(pTHX);
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-I32 do_semop _((SV** mark, SV** sp));
-I32 do_shmio _((I32 optype, SV** mark, SV** sp));
-#endif
-VIRTUAL void do_sprintf _((SV* sv, I32 len, SV** sarg));
-VIRTUAL long do_sysseek _((GV* gv, long pos, int whence));
-VIRTUAL long do_tell _((GV* gv));
-VIRTUAL I32 do_trans _((SV* sv, OP* arg));
-VIRTUAL void do_vecset _((SV* sv));
-VIRTUAL void do_vop _((I32 optype, SV* sv, SV* left, SV* right));
-VIRTUAL I32 dowantarray _((void));
-VIRTUAL void dump_all _((void));
-VIRTUAL void dump_eval _((void));
-#ifdef DUMP_FDS /* See util.c */
-VIRTUAL void dump_fds _((char* s));
-#endif
-VIRTUAL void dump_form _((GV* gv));
-VIRTUAL void dump_gv _((GV* gv));
-#ifdef MYMALLOC
-VIRTUAL void dump_mstats _((char* s));
-#endif
-VIRTUAL void dump_op _((OP* arg));
-VIRTUAL void dump_pm _((PMOP* pm));
-VIRTUAL void dump_packsubs _((HV* stash));
-VIRTUAL void dump_sub _((GV* gv));
-VIRTUAL void fbm_compile _((SV* sv, U32 flags));
-VIRTUAL char* fbm_instr _((unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags));
-VIRTUAL char* find_script _((char *scriptname, bool dosearch, char **search_ext, I32 flags));
-#ifdef USE_THREADS
-VIRTUAL PADOFFSET find_threadsv _((char *name));
-#endif
-VIRTUAL OP* force_list _((OP* arg));
-VIRTUAL OP* fold_constants _((OP* arg));
-VIRTUAL char* form _((const char* pat, ...));
-VIRTUAL void free_tmps _((void));
-VIRTUAL OP* gen_constant_list _((OP* o));
-VIRTUAL void gp_free _((GV* gv));
-VIRTUAL GP* gp_ref _((GP* gp));
-VIRTUAL GV* gv_AVadd _((GV* gv));
-VIRTUAL GV* gv_HVadd _((GV* gv));
-VIRTUAL GV* gv_IOadd _((GV* gv));
-VIRTUAL GV* gv_autoload4 _((HV* stash, char* name, STRLEN len, I32 method));
-VIRTUAL void gv_check _((HV* stash));
-VIRTUAL void gv_efullname _((SV* sv, GV* gv));
-VIRTUAL void gv_efullname3 _((SV* sv, GV* gv, char* prefix));
-VIRTUAL GV* gv_fetchfile _((char* name));
-VIRTUAL GV* gv_fetchmeth _((HV* stash, char* name, STRLEN len, I32 level));
-VIRTUAL GV* gv_fetchmethod _((HV* stash, char* name));
-VIRTUAL GV* gv_fetchmethod_autoload _((HV* stash, char* name, I32 autoload));
-VIRTUAL GV* gv_fetchpv _((char* name, I32 add, I32 sv_type));
-VIRTUAL void gv_fullname _((SV* sv, GV* gv));
-VIRTUAL void gv_fullname3 _((SV* sv, GV* gv, char* prefix));
-VIRTUAL void gv_init _((GV* gv, HV* stash, char* name, STRLEN len, int multi));
-VIRTUAL HV* gv_stashpv _((char* name, I32 create));
-VIRTUAL HV* gv_stashpvn _((char* name, U32 namelen, I32 create));
-VIRTUAL HV* gv_stashsv _((SV* sv, I32 create));
-VIRTUAL void hv_clear _((HV* tb));
-VIRTUAL void hv_delayfree_ent _((HV* hv, HE* entry));
-VIRTUAL SV* hv_delete _((HV* tb, char* key, U32 klen, I32 flags));
-VIRTUAL SV* hv_delete_ent _((HV* tb, SV* key, I32 flags, U32 hash));
-VIRTUAL bool hv_exists _((HV* tb, char* key, U32 klen));
-VIRTUAL bool hv_exists_ent _((HV* tb, SV* key, U32 hash));
-VIRTUAL SV** hv_fetch _((HV* tb, char* key, U32 klen, I32 lval));
-VIRTUAL HE* hv_fetch_ent _((HV* tb, SV* key, I32 lval, U32 hash));
-VIRTUAL void hv_free_ent _((HV* hv, HE* entry));
-VIRTUAL I32 hv_iterinit _((HV* tb));
-VIRTUAL char* hv_iterkey _((HE* entry, I32* retlen));
-VIRTUAL SV* hv_iterkeysv _((HE* entry));
-VIRTUAL HE* hv_iternext _((HV* tb));
-VIRTUAL SV* hv_iternextsv _((HV* hv, char** key, I32* retlen));
-VIRTUAL SV* hv_iterval _((HV* tb, HE* entry));
-VIRTUAL void hv_ksplit _((HV* hv, IV newmax));
-VIRTUAL void hv_magic _((HV* hv, GV* gv, int how));
-VIRTUAL SV** hv_store _((HV* tb, char* key, U32 klen, SV* val, U32 hash));
-VIRTUAL HE* hv_store_ent _((HV* tb, SV* key, SV* val, U32 hash));
-VIRTUAL void hv_undef _((HV* tb));
-VIRTUAL I32 ibcmp _((char* a, char* b, I32 len));
-VIRTUAL I32 ibcmp_locale _((char* a, char* b, I32 len));
-VIRTUAL I32 ingroup _((I32 testgid, I32 effective));
-VIRTUAL void init_stacks _((ARGSproto));
-VIRTUAL U32 intro_my _((void));
-VIRTUAL char* instr _((char* big, char* little));
-VIRTUAL bool io_close _((IO* io));
-VIRTUAL OP* invert _((OP* cmd));
-VIRTUAL OP* jmaybe _((OP* arg));
-VIRTUAL I32 keyword _((char* d, I32 len));
-VIRTUAL void leave_scope _((I32 base));
-VIRTUAL void lex_end _((void));
-VIRTUAL void lex_start _((SV* line));
-VIRTUAL OP* linklist _((OP* o));
-VIRTUAL OP* list _((OP* o));
-VIRTUAL OP* listkids _((OP* o));
-VIRTUAL OP* localize _((OP* arg, I32 lexical));
-VIRTUAL I32 looks_like_number _((SV* sv));
-VIRTUAL int magic_clearenv _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_clear_all_env _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_clearpack _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_clearsig _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_existspack _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_freeregexp _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_get _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getarylen _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getdefelem _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getglob _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getnkeys _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getpack _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getpos _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getsig _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getsubstr _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_gettaint _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getuvar _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_getvec _((SV* sv, MAGIC* mg));
-VIRTUAL U32 magic_len _((SV* sv, MAGIC* mg));
-#ifdef USE_THREADS
-VIRTUAL int magic_mutexfree _((SV* sv, MAGIC* mg));
-#endif /* USE_THREADS */
-VIRTUAL int magic_nextpack _((SV* sv, MAGIC* mg, SV* key));
-VIRTUAL int magic_set _((SV* sv, MAGIC* mg));
-#ifdef OVERLOAD
-VIRTUAL int magic_setamagic _((SV* sv, MAGIC* mg));
-#endif /* OVERLOAD */
-VIRTUAL int magic_setarylen _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setbm _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setdbline _((SV* sv, MAGIC* mg));
-#ifdef USE_LOCALE_COLLATE
-VIRTUAL int magic_setcollxfrm _((SV* sv, MAGIC* mg));
-#endif
-VIRTUAL int magic_setdefelem _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setenv _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setfm _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setisa _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setglob _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setmglob _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setnkeys _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setpack _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setpos _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setsig _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setsubstr _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_settaint _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setuvar _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_setvec _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_set_all_env _((SV* sv, MAGIC* mg));
-VIRTUAL U32 magic_sizepack _((SV* sv, MAGIC* mg));
-VIRTUAL int magic_wipepack _((SV* sv, MAGIC* mg));
-VIRTUAL void magicname _((char* sym, char* name, I32 namlen));
-int main _((int argc, char** argv, char** env));
-#ifdef MYMALLOC
-VIRTUAL MEM_SIZE malloced_size _((void *p));
-#endif
-VIRTUAL void markstack_grow _((void));
-#ifdef USE_LOCALE_COLLATE
-VIRTUAL char* mem_collxfrm _((const char* s, STRLEN len, STRLEN* xlen));
-#endif
-VIRTUAL char* mess _((const char* pat, va_list* args));
-VIRTUAL int mg_clear _((SV* sv));
-VIRTUAL int mg_copy _((SV* sv, SV* nsv, char* key, I32 klen));
-VIRTUAL MAGIC* mg_find _((SV* sv, int type));
-VIRTUAL int mg_free _((SV* sv));
-VIRTUAL int mg_get _((SV* sv));
-VIRTUAL U32 mg_length _((SV* sv));
-VIRTUAL void mg_magical _((SV* sv));
-VIRTUAL int mg_set _((SV* sv));
-VIRTUAL I32 mg_size _((SV* sv));
-VIRTUAL OP* mod _((OP* o, I32 type));
-VIRTUAL char* moreswitches _((char* s));
-VIRTUAL OP* my _((OP* o));
+PERL_CALLCONV I32 Perl_do_ipcctl(pTHX_ I32 optype, SV** mark, SV** sp);
+PERL_CALLCONV I32 Perl_do_ipcget(pTHX_ I32 optype, SV** mark, SV** sp);
+PERL_CALLCONV I32 Perl_do_msgrcv(pTHX_ SV** mark, SV** sp);
+PERL_CALLCONV I32 Perl_do_msgsnd(pTHX_ SV** mark, SV** sp);
+PERL_CALLCONV I32 Perl_do_semop(pTHX_ SV** mark, SV** sp);
+PERL_CALLCONV I32 Perl_do_shmio(pTHX_ I32 optype, SV** mark, SV** sp);
+#endif
+PERL_CALLCONV void Perl_do_join(pTHX_ SV* sv, SV* del, SV** mark, SV** sp);
+PERL_CALLCONV OP* Perl_do_kv(pTHX);
+PERL_CALLCONV bool Perl_do_open(pTHX_ GV* gv, char* name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO* supplied_fp);
+PERL_CALLCONV bool Perl_do_open9(pTHX_ GV *gv, char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num);
+PERL_CALLCONV void Perl_do_pipe(pTHX_ SV* sv, GV* rgv, GV* wgv);
+PERL_CALLCONV bool Perl_do_print(pTHX_ SV* sv, PerlIO* fp);
+PERL_CALLCONV OP* Perl_do_readline(pTHX);
+PERL_CALLCONV I32 Perl_do_chomp(pTHX_ SV* sv);
+PERL_CALLCONV bool Perl_do_seek(pTHX_ GV* gv, Off_t pos, int whence);
+PERL_CALLCONV void Perl_do_sprintf(pTHX_ SV* sv, I32 len, SV** sarg);
+PERL_CALLCONV Off_t Perl_do_sysseek(pTHX_ GV* gv, Off_t pos, int whence);
+PERL_CALLCONV Off_t Perl_do_tell(pTHX_ GV* gv);
+PERL_CALLCONV I32 Perl_do_trans(pTHX_ SV* sv);
+PERL_CALLCONV UV Perl_do_vecget(pTHX_ SV* sv, I32 offset, I32 size);
+PERL_CALLCONV void Perl_do_vecset(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_do_vop(pTHX_ I32 optype, SV* sv, SV* left, SV* right);
+PERL_CALLCONV OP* Perl_dofile(pTHX_ OP* term);
+PERL_CALLCONV I32 Perl_dowantarray(pTHX);
+PERL_CALLCONV void Perl_dump_all(pTHX);
+PERL_CALLCONV void Perl_dump_eval(pTHX);
+#if defined(DUMP_FDS)
+PERL_CALLCONV void Perl_dump_fds(pTHX_ char* s);
+#endif
+PERL_CALLCONV void Perl_dump_form(pTHX_ GV* gv);
+PERL_CALLCONV void Perl_gv_dump(pTHX_ GV* gv);
+PERL_CALLCONV void Perl_op_dump(pTHX_ OP* arg);
+PERL_CALLCONV void Perl_pmop_dump(pTHX_ PMOP* pm);
+PERL_CALLCONV void Perl_dump_packsubs(pTHX_ HV* stash);
+PERL_CALLCONV void Perl_dump_sub(pTHX_ GV* gv);
+PERL_CALLCONV void Perl_fbm_compile(pTHX_ SV* sv, U32 flags);
+PERL_CALLCONV char* Perl_fbm_instr(pTHX_ unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags);
+PERL_CALLCONV char* Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 flags);
+#if defined(USE_THREADS)
+PERL_CALLCONV PADOFFSET Perl_find_threadsv(pTHX_ const char *name);
+#endif
+PERL_CALLCONV OP* Perl_force_list(pTHX_ OP* arg);
+PERL_CALLCONV OP* Perl_fold_constants(pTHX_ OP* arg);
+PERL_CALLCONV char* Perl_form(pTHX_ const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_1,pTHX_2)))
+#endif
+;
+PERL_CALLCONV char* Perl_vform(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void Perl_free_tmps(pTHX);
+PERL_CALLCONV OP* Perl_gen_constant_list(pTHX_ OP* o);
+#if !defined(HAS_GETENV_LEN)
+PERL_CALLCONV char* Perl_getenv_len(pTHX_ char* key, unsigned long *len);
+#endif
+PERL_CALLCONV void Perl_gp_free(pTHX_ GV* gv);
+PERL_CALLCONV GP* Perl_gp_ref(pTHX_ GP* gp);
+PERL_CALLCONV GV* Perl_gv_AVadd(pTHX_ GV* gv);
+PERL_CALLCONV GV* Perl_gv_HVadd(pTHX_ GV* gv);
+PERL_CALLCONV GV* Perl_gv_IOadd(pTHX_ GV* gv);
+PERL_CALLCONV GV* Perl_gv_autoload4(pTHX_ HV* stash, const char* name, STRLEN len, I32 method);
+PERL_CALLCONV void Perl_gv_check(pTHX_ HV* stash);
+PERL_CALLCONV void Perl_gv_efullname(pTHX_ SV* sv, GV* gv);
+PERL_CALLCONV void Perl_gv_efullname3(pTHX_ SV* sv, GV* gv, const char* prefix);
+PERL_CALLCONV GV* Perl_gv_fetchfile(pTHX_ const char* name);
+PERL_CALLCONV GV* Perl_gv_fetchmeth(pTHX_ HV* stash, const char* name, STRLEN len, I32 level);
+PERL_CALLCONV GV* Perl_gv_fetchmethod(pTHX_ HV* stash, const char* name);
+PERL_CALLCONV GV* Perl_gv_fetchmethod_autoload(pTHX_ HV* stash, const char* name, I32 autoload);
+PERL_CALLCONV GV* Perl_gv_fetchpv(pTHX_ const char* name, I32 add, I32 sv_type);
+PERL_CALLCONV void Perl_gv_fullname(pTHX_ SV* sv, GV* gv);
+PERL_CALLCONV void Perl_gv_fullname3(pTHX_ SV* sv, GV* gv, const char* prefix);
+PERL_CALLCONV void Perl_gv_init(pTHX_ GV* gv, HV* stash, const char* name, STRLEN len, int multi);
+PERL_CALLCONV HV* Perl_gv_stashpv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV HV* Perl_gv_stashpvn(pTHX_ const char* name, U32 namelen, I32 create);
+PERL_CALLCONV HV* Perl_gv_stashsv(pTHX_ SV* sv, I32 create);
+PERL_CALLCONV void Perl_hv_clear(pTHX_ HV* tb);
+PERL_CALLCONV void Perl_hv_delayfree_ent(pTHX_ HV* hv, HE* entry);
+PERL_CALLCONV SV* Perl_hv_delete(pTHX_ HV* tb, const char* key, U32 klen, I32 flags);
+PERL_CALLCONV SV* Perl_hv_delete_ent(pTHX_ HV* tb, SV* key, I32 flags, U32 hash);
+PERL_CALLCONV bool Perl_hv_exists(pTHX_ HV* tb, const char* key, U32 klen);
+PERL_CALLCONV bool Perl_hv_exists_ent(pTHX_ HV* tb, SV* key, U32 hash);
+PERL_CALLCONV SV** Perl_hv_fetch(pTHX_ HV* tb, const char* key, U32 klen, I32 lval);
+PERL_CALLCONV HE* Perl_hv_fetch_ent(pTHX_ HV* tb, SV* key, I32 lval, U32 hash);
+PERL_CALLCONV void Perl_hv_free_ent(pTHX_ HV* hv, HE* entry);
+PERL_CALLCONV I32 Perl_hv_iterinit(pTHX_ HV* tb);
+PERL_CALLCONV char* Perl_hv_iterkey(pTHX_ HE* entry, I32* retlen);
+PERL_CALLCONV SV* Perl_hv_iterkeysv(pTHX_ HE* entry);
+PERL_CALLCONV HE* Perl_hv_iternext(pTHX_ HV* tb);
+PERL_CALLCONV SV* Perl_hv_iternextsv(pTHX_ HV* hv, char** key, I32* retlen);
+PERL_CALLCONV SV* Perl_hv_iterval(pTHX_ HV* tb, HE* entry);
+PERL_CALLCONV void Perl_hv_ksplit(pTHX_ HV* hv, IV newmax);
+PERL_CALLCONV void Perl_hv_magic(pTHX_ HV* hv, GV* gv, int how);
+PERL_CALLCONV SV** Perl_hv_store(pTHX_ HV* tb, const char* key, U32 klen, SV* val, U32 hash);
+PERL_CALLCONV HE* Perl_hv_store_ent(pTHX_ HV* tb, SV* key, SV* val, U32 hash);
+PERL_CALLCONV void Perl_hv_undef(pTHX_ HV* tb);
+PERL_CALLCONV I32 Perl_ibcmp(pTHX_ const char* a, const char* b, I32 len);
+PERL_CALLCONV I32 Perl_ibcmp_locale(pTHX_ const char* a, const char* b, I32 len);
+PERL_CALLCONV bool Perl_ingroup(pTHX_ Gid_t testgid, Uid_t effective);
+PERL_CALLCONV void Perl_init_debugger(pTHX);
+PERL_CALLCONV void Perl_init_stacks(pTHX);
+PERL_CALLCONV U32 Perl_intro_my(pTHX);
+PERL_CALLCONV char* Perl_instr(pTHX_ const char* big, const char* little);
+PERL_CALLCONV bool Perl_io_close(pTHX_ IO* io, bool not_implicit);
+PERL_CALLCONV OP* Perl_invert(pTHX_ OP* cmd);
+PERL_CALLCONV bool Perl_is_uni_alnum(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_alnumc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_idfirst(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_alpha(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_ascii(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_space(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_cntrl(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_graph(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_digit(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_upper(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_lower(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_print(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_punct(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_xdigit(pTHX_ U32 c);
+PERL_CALLCONV U32 Perl_to_uni_upper(pTHX_ U32 c);
+PERL_CALLCONV U32 Perl_to_uni_title(pTHX_ U32 c);
+PERL_CALLCONV U32 Perl_to_uni_lower(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_alnum_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_alnumc_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_idfirst_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_alpha_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_ascii_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_space_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_cntrl_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_graph_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_digit_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_upper_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_lower_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_print_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_punct_lc(pTHX_ U32 c);
+PERL_CALLCONV bool Perl_is_uni_xdigit_lc(pTHX_ U32 c);
+PERL_CALLCONV U32 Perl_to_uni_upper_lc(pTHX_ U32 c);
+PERL_CALLCONV U32 Perl_to_uni_title_lc(pTHX_ U32 c);
+PERL_CALLCONV U32 Perl_to_uni_lower_lc(pTHX_ U32 c);
+PERL_CALLCONV int Perl_is_utf8_char(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_alnum(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_alnumc(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_idfirst(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_alpha(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_ascii(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_space(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_cntrl(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_digit(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_graph(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_upper(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_lower(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_print(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_punct(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_xdigit(pTHX_ U8 *p);
+PERL_CALLCONV bool Perl_is_utf8_mark(pTHX_ U8 *p);
+PERL_CALLCONV OP* Perl_jmaybe(pTHX_ OP* arg);
+PERL_CALLCONV I32 Perl_keyword(pTHX_ char* d, I32 len);
+PERL_CALLCONV void Perl_leave_scope(pTHX_ I32 base);
+PERL_CALLCONV void Perl_lex_end(pTHX);
+PERL_CALLCONV void Perl_lex_start(pTHX_ SV* line);
+PERL_CALLCONV OP* Perl_linklist(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_list(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_listkids(pTHX_ OP* o);
+PERL_CALLCONV void Perl_load_module(pTHX_ U32 flags, SV* name, SV* ver, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_3,pTHX_4)))
+#endif
+;
+PERL_CALLCONV void Perl_vload_module(pTHX_ U32 flags, SV* name, SV* ver, va_list* args);
+PERL_CALLCONV OP* Perl_localize(pTHX_ OP* arg, I32 lexical);
+PERL_CALLCONV I32 Perl_looks_like_number(pTHX_ SV* sv);
+PERL_CALLCONV int Perl_magic_clearenv(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_clear_all_env(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_clearpack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_clearsig(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_existspack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_freeregexp(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_get(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getarylen(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getdefelem(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getglob(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getnkeys(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getpack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getpos(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getsig(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getsubstr(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_gettaint(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getuvar(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_getvec(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV U32 Perl_magic_len(pTHX_ SV* sv, MAGIC* mg);
+#if defined(USE_THREADS)
+PERL_CALLCONV int Perl_magic_mutexfree(pTHX_ SV* sv, MAGIC* mg);
+#endif
+PERL_CALLCONV int Perl_magic_nextpack(pTHX_ SV* sv, MAGIC* mg, SV* key);
+PERL_CALLCONV U32 Perl_magic_regdata_cnt(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_regdatum_get(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_set(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setamagic(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setarylen(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setbm(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setdbline(pTHX_ SV* sv, MAGIC* mg);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV int Perl_magic_setcollxfrm(pTHX_ SV* sv, MAGIC* mg);
+#endif
+PERL_CALLCONV int Perl_magic_setdefelem(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setenv(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setfm(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setisa(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setglob(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setmglob(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setnkeys(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setpack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setpos(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setsig(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setsubstr(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_settaint(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setuvar(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_setvec(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_set_all_env(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV U32 Perl_magic_sizepack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int Perl_magic_wipepack(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV void Perl_magicname(pTHX_ char* sym, char* name, I32 namlen);
+PERL_CALLCONV void Perl_markstack_grow(pTHX);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV char* Perl_mem_collxfrm(pTHX_ const char* s, STRLEN len, STRLEN* xlen);
+#endif
+PERL_CALLCONV SV* Perl_mess(pTHX_ const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_1,pTHX_2)))
+#endif
+;
+PERL_CALLCONV SV* Perl_vmess(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void Perl_qerror(pTHX_ SV* err);
+PERL_CALLCONV int Perl_mg_clear(pTHX_ SV* sv);
+PERL_CALLCONV int Perl_mg_copy(pTHX_ SV* sv, SV* nsv, const char* key, I32 klen);
+PERL_CALLCONV MAGIC* Perl_mg_find(pTHX_ SV* sv, int type);
+PERL_CALLCONV int Perl_mg_free(pTHX_ SV* sv);
+PERL_CALLCONV int Perl_mg_get(pTHX_ SV* sv);
+PERL_CALLCONV U32 Perl_mg_length(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_mg_magical(pTHX_ SV* sv);
+PERL_CALLCONV int Perl_mg_set(pTHX_ SV* sv);
+PERL_CALLCONV I32 Perl_mg_size(pTHX_ SV* sv);
+PERL_CALLCONV OP* Perl_mod(pTHX_ OP* o, I32 type);
+PERL_CALLCONV int Perl_mode_from_discipline(pTHX_ SV* discp);
+PERL_CALLCONV char* Perl_moreswitches(pTHX_ char* s);
+PERL_CALLCONV OP* Perl_my(pTHX_ OP* o);
+PERL_CALLCONV NV Perl_my_atof(pTHX_ const char *s);
#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
-VIRTUAL char* my_bcopy _((char* from, char* to, I32 len));
+PERL_CALLCONV char* Perl_my_bcopy(const char* from, char* to, I32 len);
#endif
#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
-char* my_bzero _((char* loc, I32 len));
+PERL_CALLCONV char* Perl_my_bzero(char* loc, I32 len);
#endif
-VIRTUAL void my_exit _((U32 status)) __attribute__((noreturn));
-VIRTUAL void my_failure_exit _((void)) __attribute__((noreturn));
-VIRTUAL I32 my_lstat _((ARGSproto));
+PERL_CALLCONV void Perl_my_exit(pTHX_ U32 status) __attribute__((noreturn));
+PERL_CALLCONV void Perl_my_failure_exit(pTHX) __attribute__((noreturn));
+PERL_CALLCONV I32 Perl_my_fflush_all(pTHX);
+PERL_CALLCONV I32 Perl_my_lstat(pTHX);
#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
-VIRTUAL I32 my_memcmp _((char* s1, char* s2, I32 len));
+PERL_CALLCONV I32 Perl_my_memcmp(const char* s1, const char* s2, I32 len);
#endif
#if !defined(HAS_MEMSET)
-VIRTUAL void* my_memset _((char* loc, I32 ch, I32 len));
-#endif
-#ifndef PERL_OBJECT
-VIRTUAL I32 my_pclose _((PerlIO* ptr));
-VIRTUAL PerlIO* my_popen _((char* cmd, char* mode));
-#endif
-VIRTUAL void my_setenv _((char* nam, char* val));
-VIRTUAL I32 my_stat _((ARGSproto));
-#ifdef MYSWAP
-VIRTUAL short my_swap _((short s));
-VIRTUAL long my_htonl _((long l));
-VIRTUAL long my_ntohl _((long l));
-#endif
-VIRTUAL void my_unexec _((void));
-VIRTUAL OP* newANONLIST _((OP* o));
-VIRTUAL OP* newANONHASH _((OP* o));
-VIRTUAL OP* newANONSUB _((I32 floor, OP* proto, OP* block));
-VIRTUAL OP* newASSIGNOP _((I32 flags, OP* left, I32 optype, OP* right));
-VIRTUAL OP* newCONDOP _((I32 flags, OP* expr, OP* trueop, OP* falseop));
-VIRTUAL void newCONSTSUB _((HV* stash, char* name, SV* sv));
-VIRTUAL void newFORM _((I32 floor, OP* o, OP* block));
-VIRTUAL OP* newFOROP _((I32 flags, char* label, line_t forline, OP* sclr, OP* expr, OP*block, OP*cont));
-VIRTUAL OP* newLOGOP _((I32 optype, I32 flags, OP* left, OP* right));
-VIRTUAL OP* newLOOPEX _((I32 type, OP* label));
-VIRTUAL OP* newLOOPOP _((I32 flags, I32 debuggable, OP* expr, OP* block));
-VIRTUAL OP* newNULLLIST _((void));
-VIRTUAL OP* newOP _((I32 optype, I32 flags));
-VIRTUAL void newPROG _((OP* o));
-VIRTUAL OP* newRANGE _((I32 flags, OP* left, OP* right));
-VIRTUAL OP* newSLICEOP _((I32 flags, OP* subscript, OP* list));
-VIRTUAL OP* newSTATEOP _((I32 flags, char* label, OP* o));
-VIRTUAL CV* newSUB _((I32 floor, OP* o, OP* proto, OP* block));
-VIRTUAL CV* newXS _((char* name, void (*subaddr)(CV* cv _CPERLproto), char* filename));
-VIRTUAL AV* newAV _((void));
-VIRTUAL OP* newAVREF _((OP* o));
-VIRTUAL OP* newBINOP _((I32 type, I32 flags, OP* first, OP* last));
-VIRTUAL OP* newCVREF _((I32 flags, OP* o));
-VIRTUAL OP* newGVOP _((I32 type, I32 flags, GV* gv));
-VIRTUAL GV* newGVgen _((char* pack));
-VIRTUAL OP* newGVREF _((I32 type, OP* o));
-VIRTUAL OP* newHVREF _((OP* o));
-VIRTUAL HV* newHV _((void));
-VIRTUAL HV* newHVhv _((HV* hv));
-VIRTUAL IO* newIO _((void));
-VIRTUAL OP* newLISTOP _((I32 type, I32 flags, OP* first, OP* last));
-VIRTUAL OP* newPMOP _((I32 type, I32 flags));
-VIRTUAL OP* newPVOP _((I32 type, I32 flags, char* pv));
-VIRTUAL SV* newRV _((SV* pref));
-VIRTUAL SV* newRV_noinc _((SV *sv));
-VIRTUAL SV* newSV _((STRLEN len));
-VIRTUAL OP* newSVREF _((OP* o));
-VIRTUAL OP* newSVOP _((I32 type, I32 flags, SV* sv));
-VIRTUAL SV* newSViv _((IV i));
-VIRTUAL SV* newSVnv _((double n));
-VIRTUAL SV* newSVpv _((char* s, STRLEN len));
-VIRTUAL SV* newSVpvn _((char *s, STRLEN len));
-VIRTUAL SV* newSVpvf _((const char* pat, ...));
-VIRTUAL SV* newSVrv _((SV* rv, char* classname));
-VIRTUAL SV* newSVsv _((SV* old));
-VIRTUAL OP* newUNOP _((I32 type, I32 flags, OP* first));
-VIRTUAL OP* newWHILEOP _((I32 flags, I32 debuggable, LOOP* loop,
- I32 whileline, OP* expr, OP* block, OP* cont));
-#ifdef USE_THREADS
-VIRTUAL struct perl_thread * new_struct_thread _((struct perl_thread *t));
-#endif
-VIRTUAL PERL_SI * new_stackinfo _((I32 stitems, I32 cxitems));
-VIRTUAL PerlIO* nextargv _((GV* gv));
-VIRTUAL char* ninstr _((char* big, char* bigend, char* little, char* lend));
-VIRTUAL OP* oopsCV _((OP* o));
-VIRTUAL void op_free _((OP* arg));
-VIRTUAL void package _((OP* o));
-VIRTUAL PADOFFSET pad_alloc _((I32 optype, U32 tmptype));
-VIRTUAL PADOFFSET pad_allocmy _((char* name));
-VIRTUAL PADOFFSET pad_findmy _((char* name));
-VIRTUAL OP* oopsAV _((OP* o));
-VIRTUAL OP* oopsHV _((OP* o));
-VIRTUAL void pad_leavemy _((I32 fill));
-VIRTUAL SV* pad_sv _((PADOFFSET po));
-VIRTUAL void pad_free _((PADOFFSET po));
-VIRTUAL void pad_reset _((void));
-VIRTUAL void pad_swipe _((PADOFFSET po));
-VIRTUAL void peep _((OP* o));
-#ifndef PERL_OBJECT
-PerlInterpreter* perl_alloc _((void));
-#endif
-#ifdef PERL_OBJECT
-VIRTUAL void perl_atexit _((void(*fn)(CPerlObj *, void *), void* ptr));
-#else
-void perl_atexit _((void(*fn)(void *), void*));
-#endif
-VIRTUAL I32 perl_call_argv _((char* sub_name, I32 flags, char** argv));
-VIRTUAL I32 perl_call_method _((char* methname, I32 flags));
-VIRTUAL I32 perl_call_pv _((char* sub_name, I32 flags));
-VIRTUAL I32 perl_call_sv _((SV* sv, I32 flags));
-#ifdef PERL_OBJECT
-VIRTUAL void perl_construct _((void));
-VIRTUAL void perl_destruct _((void));
-#else
-void perl_construct _((PerlInterpreter* sv_interp));
-void perl_destruct _((PerlInterpreter* sv_interp));
+PERL_CALLCONV void* Perl_my_memset(char* loc, I32 ch, I32 len);
#endif
-VIRTUAL SV* perl_eval_pv _((char* p, I32 croak_on_error));
-VIRTUAL I32 perl_eval_sv _((SV* sv, I32 flags));
-#ifdef PERL_OBJECT
-VIRTUAL void perl_free _((void));
-#else
-void perl_free _((PerlInterpreter* sv_interp));
-#endif
-VIRTUAL SV* perl_get_sv _((char* name, I32 create));
-VIRTUAL AV* perl_get_av _((char* name, I32 create));
-VIRTUAL HV* perl_get_hv _((char* name, I32 create));
-VIRTUAL CV* perl_get_cv _((char* name, I32 create));
-VIRTUAL int perl_init_i18nl10n _((int printwarn));
-VIRTUAL int perl_init_i18nl14n _((int printwarn));
-VIRTUAL void perl_new_collate _((char* newcoll));
-VIRTUAL void perl_new_ctype _((char* newctype));
-VIRTUAL void perl_new_numeric _((char* newcoll));
-VIRTUAL void perl_set_numeric_local _((void));
-VIRTUAL void perl_set_numeric_standard _((void));
-#ifdef PERL_OBJECT
-VIRTUAL int perl_parse _((void(*xsinit)(CPerlObj*), int argc, char** argv, char** env));
-#else
-int perl_parse _((PerlInterpreter* sv_interp, void(*xsinit)(void), int argc, char** argv, char** env));
+#if !defined(PERL_OBJECT)
+PERL_CALLCONV I32 Perl_my_pclose(pTHX_ PerlIO* ptr);
+PERL_CALLCONV PerlIO* Perl_my_popen(pTHX_ char* cmd, char* mode);
#endif
-VIRTUAL void perl_require_pv _((char* pv));
-#define perl_requirepv perl_require_pv
-#ifdef PERL_OBJECT
-VIRTUAL int perl_run _((void));
-#else
-int perl_run _((PerlInterpreter* sv_interp));
-#endif
-VIRTUAL void pidgone _((int pid, int status));
-VIRTUAL void pmflag _((U16* pmfl, int ch));
-VIRTUAL OP* pmruntime _((OP* pm, OP* expr, OP* repl));
-VIRTUAL OP* pmtrans _((OP* o, OP* expr, OP* repl));
-VIRTUAL OP* pop_return _((void));
-VIRTUAL void pop_scope _((void));
-VIRTUAL OP* prepend_elem _((I32 optype, OP* head, OP* tail));
-VIRTUAL void push_return _((OP* o));
-VIRTUAL void push_scope _((void));
-VIRTUAL OP* ref _((OP* o, I32 type));
-VIRTUAL OP* refkids _((OP* o, I32 type));
-VIRTUAL void regdump _((regexp* r));
-VIRTUAL I32 pregexec _((regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave));
-VIRTUAL void pregfree _((struct regexp* r));
-VIRTUAL regexp* pregcomp _((char* exp, char* xend, PMOP* pm));
-VIRTUAL I32 regexec_flags _((regexp* prog, char* stringarg, char* strend,
- char* strbeg, I32 minend, SV* screamer,
- void* data, U32 flags));
-VIRTUAL regnode* regnext _((regnode* p));
-VIRTUAL void regprop _((SV* sv, regnode* o));
-VIRTUAL void repeatcpy _((char* to, char* from, I32 len, I32 count));
-VIRTUAL char* rninstr _((char* big, char* bigend, char* little, char* lend));
-VIRTUAL Sighandler_t rsignal _((int i, Sighandler_t t));
-VIRTUAL int rsignal_restore _((int i, Sigsave_t* t));
-VIRTUAL int rsignal_save _((int i, Sighandler_t t1, Sigsave_t* t2));
-VIRTUAL Sighandler_t rsignal_state _((int i));
-VIRTUAL void rxres_free _((void** rsp));
-VIRTUAL void rxres_restore _((void** rsp, REGEXP* prx));
-VIRTUAL void rxres_save _((void** rsp, REGEXP* prx));
-#ifndef HAS_RENAME
-VIRTUAL I32 same_dirent _((char* a, char* b));
-#endif
-VIRTUAL char* savepv _((char* sv));
-VIRTUAL char* savepvn _((char* sv, I32 len));
-VIRTUAL void savestack_grow _((void));
-VIRTUAL void save_aelem _((AV* av, I32 idx, SV **sptr));
-VIRTUAL void save_aptr _((AV** aptr));
-VIRTUAL AV* save_ary _((GV* gv));
-VIRTUAL void save_clearsv _((SV** svp));
-VIRTUAL void save_delete _((HV* hv, char* key, I32 klen));
-#ifndef titan /* TitanOS cc can't handle this */
-#ifdef PERL_OBJECT
-typedef void (CPerlObj::*DESTRUCTORFUNC) _((void*));
-VIRTUAL void save_destructor _((DESTRUCTORFUNC f, void* p));
-#else
-void save_destructor _((void (*f)(void*), void* p));
-#endif
-#endif /* titan */
-VIRTUAL void save_freesv _((SV* sv));
-VIRTUAL void save_freeop _((OP* o));
-VIRTUAL void save_freepv _((char* pv));
-VIRTUAL void save_gp _((GV* gv, I32 empty));
-VIRTUAL HV* save_hash _((GV* gv));
-VIRTUAL void save_helem _((HV* hv, SV *key, SV **sptr));
-VIRTUAL void save_hints _((void));
-VIRTUAL void save_hptr _((HV** hptr));
-VIRTUAL void save_I16 _((I16* intp));
-VIRTUAL void save_I32 _((I32* intp));
-VIRTUAL void save_int _((int* intp));
-VIRTUAL void save_item _((SV* item));
-VIRTUAL void save_iv _((IV* iv));
-VIRTUAL void save_list _((SV** sarg, I32 maxsarg));
-VIRTUAL void save_long _((long* longp));
-VIRTUAL void save_nogv _((GV* gv));
-VIRTUAL void save_op _((void));
-VIRTUAL SV* save_scalar _((GV* gv));
-VIRTUAL void save_pptr _((char** pptr));
-VIRTUAL void save_sptr _((SV** sptr));
-VIRTUAL SV* save_svref _((SV** sptr));
-VIRTUAL SV** save_threadsv _((PADOFFSET i));
-VIRTUAL OP* sawparens _((OP* o));
-VIRTUAL OP* scalar _((OP* o));
-VIRTUAL OP* scalarkids _((OP* o));
-VIRTUAL OP* scalarseq _((OP* o));
-VIRTUAL OP* scalarvoid _((OP* o));
-VIRTUAL UV scan_hex _((char* start, I32 len, I32* retlen));
-VIRTUAL char* scan_num _((char* s));
-VIRTUAL UV scan_oct _((char* start, I32 len, I32* retlen));
-VIRTUAL OP* scope _((OP* o));
-VIRTUAL char* screaminstr _((SV* bigsv, SV* littlesv, I32 start_shift, I32 end_shift, I32 *state, I32 last));
-#ifndef VMS
-VIRTUAL I32 setenv_getix _((char* nam));
-#endif
-VIRTUAL void setdefout _((GV* gv));
-VIRTUAL char* sharepvn _((char* sv, I32 len, U32 hash));
-VIRTUAL HEK* share_hek _((char* sv, I32 len, U32 hash));
-VIRTUAL Signal_t sighandler _((int sig));
-VIRTUAL SV** stack_grow _((SV** sp, SV**p, int n));
-VIRTUAL I32 start_subparse _((I32 is_format, U32 flags));
-VIRTUAL void sub_crush_depth _((CV* cv));
-VIRTUAL bool sv_2bool _((SV* sv));
-VIRTUAL CV* sv_2cv _((SV* sv, HV** st, GV** gvp, I32 lref));
-VIRTUAL IO* sv_2io _((SV* sv));
-VIRTUAL IV sv_2iv _((SV* sv));
-VIRTUAL SV* sv_2mortal _((SV* sv));
-VIRTUAL double sv_2nv _((SV* sv));
-VIRTUAL char* sv_2pv _((SV* sv, STRLEN* lp));
-VIRTUAL UV sv_2uv _((SV* sv));
-VIRTUAL IV sv_iv _((SV* sv));
-VIRTUAL UV sv_uv _((SV* sv));
-VIRTUAL double sv_nv _((SV* sv));
-VIRTUAL char * sv_pvn _((SV *sv, STRLEN *len));
-VIRTUAL I32 sv_true _((SV *sv));
-VIRTUAL void sv_add_arena _((char* ptr, U32 size, U32 flags));
-VIRTUAL int sv_backoff _((SV* sv));
-VIRTUAL SV* sv_bless _((SV* sv, HV* stash));
-VIRTUAL void sv_catpvf _((SV* sv, const char* pat, ...));
-VIRTUAL void sv_catpv _((SV* sv, char* ptr));
-VIRTUAL void sv_catpvn _((SV* sv, char* ptr, STRLEN len));
-VIRTUAL void sv_catsv _((SV* dsv, SV* ssv));
-VIRTUAL void sv_chop _((SV* sv, char* ptr));
-VIRTUAL void sv_clean_all _((void));
-VIRTUAL void sv_clean_objs _((void));
-VIRTUAL void sv_clear _((SV* sv));
-VIRTUAL I32 sv_cmp _((SV* sv1, SV* sv2));
-VIRTUAL I32 sv_cmp_locale _((SV* sv1, SV* sv2));
-#ifdef USE_LOCALE_COLLATE
-VIRTUAL char* sv_collxfrm _((SV* sv, STRLEN* nxp));
-#endif
-VIRTUAL OP* sv_compile_2op _((SV* sv, OP** startp, char* code, AV** avp));
-VIRTUAL void sv_dec _((SV* sv));
-VIRTUAL void sv_dump _((SV* sv));
-VIRTUAL bool sv_derived_from _((SV* sv, char* name));
-VIRTUAL I32 sv_eq _((SV* sv1, SV* sv2));
-VIRTUAL void sv_free _((SV* sv));
-VIRTUAL void sv_free_arenas _((void));
-VIRTUAL char* sv_gets _((SV* sv, PerlIO* fp, I32 append));
-#ifndef DOSISH
-VIRTUAL char* sv_grow _((SV* sv, I32 newlen));
-#else
-VIRTUAL char* sv_grow _((SV* sv, unsigned long newlen));
-#endif
-VIRTUAL void sv_inc _((SV* sv));
-VIRTUAL void sv_insert _((SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen));
-VIRTUAL int sv_isa _((SV* sv, char* name));
-VIRTUAL int sv_isobject _((SV* sv));
-VIRTUAL STRLEN sv_len _((SV* sv));
-VIRTUAL void sv_magic _((SV* sv, SV* obj, int how, char* name, I32 namlen));
-VIRTUAL SV* sv_mortalcopy _((SV* oldsv));
-VIRTUAL SV* sv_newmortal _((void));
-VIRTUAL SV* sv_newref _((SV* sv));
-VIRTUAL char* sv_peek _((SV* sv));
-VIRTUAL char* sv_pvn_force _((SV* sv, STRLEN* lp));
-VIRTUAL char* sv_reftype _((SV* sv, int ob));
-VIRTUAL void sv_replace _((SV* sv, SV* nsv));
-VIRTUAL void sv_report_used _((void));
-VIRTUAL void sv_reset _((char* s, HV* stash));
-VIRTUAL void sv_setpvf _((SV* sv, const char* pat, ...));
-VIRTUAL void sv_setiv _((SV* sv, IV num));
-VIRTUAL void sv_setpviv _((SV* sv, IV num));
-VIRTUAL void sv_setuv _((SV* sv, UV num));
-VIRTUAL void sv_setnv _((SV* sv, double num));
-VIRTUAL SV* sv_setref_iv _((SV* rv, char* classname, IV iv));
-VIRTUAL SV* sv_setref_nv _((SV* rv, char* classname, double nv));
-VIRTUAL SV* sv_setref_pv _((SV* rv, char* classname, void* pv));
-VIRTUAL SV* sv_setref_pvn _((SV* rv, char* classname, char* pv, I32 n));
-VIRTUAL void sv_setpv _((SV* sv, const char* ptr));
-VIRTUAL void sv_setpvn _((SV* sv, const char* ptr, STRLEN len));
-VIRTUAL void sv_setsv _((SV* dsv, SV* ssv));
-VIRTUAL void sv_taint _((SV* sv));
-VIRTUAL bool sv_tainted _((SV* sv));
-VIRTUAL int sv_unmagic _((SV* sv, int type));
-VIRTUAL void sv_unref _((SV* sv));
-VIRTUAL void sv_untaint _((SV* sv));
-VIRTUAL bool sv_upgrade _((SV* sv, U32 mt));
-VIRTUAL void sv_usepvn _((SV* sv, char* ptr, STRLEN len));
-VIRTUAL void sv_vcatpvfn _((SV* sv, const char* pat, STRLEN patlen,
- va_list* args, SV** svargs, I32 svmax,
- bool *used_locale));
-VIRTUAL void sv_vsetpvfn _((SV* sv, const char* pat, STRLEN patlen,
- va_list* args, SV** svargs, I32 svmax,
- bool *used_locale));
-VIRTUAL void taint_env _((void));
-VIRTUAL void taint_proper _((const char* f, char* s));
-#ifdef UNLINK_ALL_VERSIONS
-VIRTUAL I32 unlnk _((char* f));
-#endif
-#ifdef USE_THREADS
-VIRTUAL void unlock_condpair _((void* svv));
-#endif
-VIRTUAL void unsharepvn _((char* sv, I32 len, U32 hash));
-VIRTUAL void unshare_hek _((HEK* hek));
-VIRTUAL void utilize _((int aver, I32 floor, OP* version, OP* id, OP* arg));
-VIRTUAL void vivify_defelem _((SV* sv));
-VIRTUAL void vivify_ref _((SV* sv, U32 to_what));
-VIRTUAL I32 wait4pid _((int pid, int* statusp, int flags));
-VIRTUAL void warn _((const char* pat,...));
-VIRTUAL void watch _((char** addr));
-VIRTUAL I32 whichsig _((char* sig));
-VIRTUAL int yyerror _((char* s));
-VIRTUAL int yylex _((void));
-VIRTUAL int yyparse _((void));
-VIRTUAL int yywarn _((char* s));
+PERL_CALLCONV void Perl_my_setenv(pTHX_ char* nam, char* val);
+PERL_CALLCONV I32 Perl_my_stat(pTHX);
+#if defined(MYSWAP)
+PERL_CALLCONV short Perl_my_swap(pTHX_ short s);
+PERL_CALLCONV long Perl_my_htonl(pTHX_ long l);
+PERL_CALLCONV long Perl_my_ntohl(pTHX_ long l);
+#endif
+PERL_CALLCONV void Perl_my_unexec(pTHX);
+PERL_CALLCONV OP* Perl_newANONLIST(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_newANONHASH(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_newANONSUB(pTHX_ I32 floor, OP* proto, OP* block);
+PERL_CALLCONV OP* Perl_newASSIGNOP(pTHX_ I32 flags, OP* left, I32 optype, OP* right);
+PERL_CALLCONV OP* Perl_newCONDOP(pTHX_ I32 flags, OP* expr, OP* trueop, OP* falseop);
+PERL_CALLCONV void Perl_newCONSTSUB(pTHX_ HV* stash, char* name, SV* sv);
+PERL_CALLCONV void Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
+PERL_CALLCONV OP* Perl_newFOROP(pTHX_ I32 flags, char* label, line_t forline, OP* sclr, OP* expr, OP*block, OP*cont);
+PERL_CALLCONV OP* Perl_newLOGOP(pTHX_ I32 optype, I32 flags, OP* left, OP* right);
+PERL_CALLCONV OP* Perl_newLOOPEX(pTHX_ I32 type, OP* label);
+PERL_CALLCONV OP* Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP* expr, OP* block);
+PERL_CALLCONV OP* Perl_newNULLLIST(pTHX);
+PERL_CALLCONV OP* Perl_newOP(pTHX_ I32 optype, I32 flags);
+PERL_CALLCONV void Perl_newPROG(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_newRANGE(pTHX_ I32 flags, OP* left, OP* right);
+PERL_CALLCONV OP* Perl_newSLICEOP(pTHX_ I32 flags, OP* subscript, OP* listop);
+PERL_CALLCONV OP* Perl_newSTATEOP(pTHX_ I32 flags, char* label, OP* o);
+PERL_CALLCONV CV* Perl_newSUB(pTHX_ I32 floor, OP* o, OP* proto, OP* block);
+PERL_CALLCONV CV* Perl_newXS(pTHX_ char* name, XSUBADDR_t f, char* filename);
+PERL_CALLCONV AV* Perl_newAV(pTHX);
+PERL_CALLCONV OP* Perl_newAVREF(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_newBINOP(pTHX_ I32 type, I32 flags, OP* first, OP* last);
+PERL_CALLCONV OP* Perl_newCVREF(pTHX_ I32 flags, OP* o);
+PERL_CALLCONV OP* Perl_newGVOP(pTHX_ I32 type, I32 flags, GV* gv);
+PERL_CALLCONV GV* Perl_newGVgen(pTHX_ char* pack);
+PERL_CALLCONV OP* Perl_newGVREF(pTHX_ I32 type, OP* o);
+PERL_CALLCONV OP* Perl_newHVREF(pTHX_ OP* o);
+PERL_CALLCONV HV* Perl_newHV(pTHX);
+PERL_CALLCONV HV* Perl_newHVhv(pTHX_ HV* hv);
+PERL_CALLCONV IO* Perl_newIO(pTHX);
+PERL_CALLCONV OP* Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP* first, OP* last);
+PERL_CALLCONV OP* Perl_newPADOP(pTHX_ I32 type, I32 flags, SV* sv);
+PERL_CALLCONV OP* Perl_newPMOP(pTHX_ I32 type, I32 flags);
+PERL_CALLCONV OP* Perl_newPVOP(pTHX_ I32 type, I32 flags, char* pv);
+PERL_CALLCONV SV* Perl_newRV(pTHX_ SV* pref);
+PERL_CALLCONV SV* Perl_newRV_noinc(pTHX_ SV *sv);
+PERL_CALLCONV SV* Perl_newSV(pTHX_ STRLEN len);
+PERL_CALLCONV OP* Perl_newSVREF(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_newSVOP(pTHX_ I32 type, I32 flags, SV* sv);
+PERL_CALLCONV SV* Perl_newSViv(pTHX_ IV i);
+PERL_CALLCONV SV* Perl_newSVuv(pTHX_ UV u);
+PERL_CALLCONV SV* Perl_newSVnv(pTHX_ NV n);
+PERL_CALLCONV SV* Perl_newSVpv(pTHX_ const char* s, STRLEN len);
+PERL_CALLCONV SV* Perl_newSVpvn(pTHX_ const char* s, STRLEN len);
+PERL_CALLCONV SV* Perl_newSVpvf(pTHX_ const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_1,pTHX_2)))
+#endif
+;
+PERL_CALLCONV SV* Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV SV* Perl_newSVrv(pTHX_ SV* rv, const char* classname);
+PERL_CALLCONV SV* Perl_newSVsv(pTHX_ SV* old);
+PERL_CALLCONV OP* Perl_newUNOP(pTHX_ I32 type, I32 flags, OP* first);
+PERL_CALLCONV OP* Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP* loop, I32 whileline, OP* expr, OP* block, OP* cont);
-#ifndef MYMALLOC
-VIRTUAL Malloc_t safemalloc _((MEM_SIZE nbytes));
-VIRTUAL Malloc_t safecalloc _((MEM_SIZE elements, MEM_SIZE size));
-VIRTUAL Malloc_t saferealloc _((Malloc_t where, MEM_SIZE nbytes));
-VIRTUAL Free_t safefree _((Malloc_t where));
+PERL_CALLCONV PERL_SI* Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems);
+PERL_CALLCONV PerlIO* Perl_nextargv(pTHX_ GV* gv);
+PERL_CALLCONV char* Perl_ninstr(pTHX_ const char* big, const char* bigend, const char* little, const char* lend);
+PERL_CALLCONV OP* Perl_oopsCV(pTHX_ OP* o);
+PERL_CALLCONV void Perl_op_free(pTHX_ OP* arg);
+PERL_CALLCONV void Perl_package(pTHX_ OP* o);
+PERL_CALLCONV PADOFFSET Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype);
+PERL_CALLCONV PADOFFSET Perl_pad_allocmy(pTHX_ char* name);
+PERL_CALLCONV PADOFFSET Perl_pad_findmy(pTHX_ char* name);
+PERL_CALLCONV OP* Perl_oopsAV(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_oopsHV(pTHX_ OP* o);
+PERL_CALLCONV void Perl_pad_leavemy(pTHX_ I32 fill);
+PERL_CALLCONV SV* Perl_pad_sv(pTHX_ PADOFFSET po);
+PERL_CALLCONV void Perl_pad_free(pTHX_ PADOFFSET po);
+PERL_CALLCONV void Perl_pad_reset(pTHX);
+PERL_CALLCONV void Perl_pad_swipe(pTHX_ PADOFFSET po);
+PERL_CALLCONV void Perl_peep(pTHX_ OP* o);
+#if defined(PERL_OBJECT)
+PERL_CALLCONV void Perl_construct(pTHX);
+PERL_CALLCONV void Perl_destruct(pTHX);
+PERL_CALLCONV void Perl_free(pTHX);
+PERL_CALLCONV int Perl_run(pTHX);
+PERL_CALLCONV int Perl_parse(pTHX_ XSINIT_t xsinit, int argc, char** argv, char** env);
+#endif
+#if defined(USE_THREADS)
+PERL_CALLCONV struct perl_thread* Perl_new_struct_thread(pTHX_ struct perl_thread *t);
+#endif
+PERL_CALLCONV void Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr);
+PERL_CALLCONV I32 Perl_call_argv(pTHX_ const char* sub_name, I32 flags, char** argv);
+PERL_CALLCONV I32 Perl_call_method(pTHX_ const char* methname, I32 flags);
+PERL_CALLCONV I32 Perl_call_pv(pTHX_ const char* sub_name, I32 flags);
+PERL_CALLCONV I32 Perl_call_sv(pTHX_ SV* sv, I32 flags);
+PERL_CALLCONV SV* Perl_eval_pv(pTHX_ const char* p, I32 croak_on_error);
+PERL_CALLCONV I32 Perl_eval_sv(pTHX_ SV* sv, I32 flags);
+PERL_CALLCONV SV* Perl_get_sv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV AV* Perl_get_av(pTHX_ const char* name, I32 create);
+PERL_CALLCONV HV* Perl_get_hv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV CV* Perl_get_cv(pTHX_ const char* name, I32 create);
+PERL_CALLCONV int Perl_init_i18nl10n(pTHX_ int printwarn);
+PERL_CALLCONV int Perl_init_i18nl14n(pTHX_ int printwarn);
+PERL_CALLCONV void Perl_new_collate(pTHX_ const char* newcoll);
+PERL_CALLCONV void Perl_new_ctype(pTHX_ const char* newctype);
+PERL_CALLCONV void Perl_new_numeric(pTHX_ const char* newcoll);
+PERL_CALLCONV void Perl_set_numeric_local(pTHX);
+PERL_CALLCONV void Perl_set_numeric_radix(pTHX);
+PERL_CALLCONV void Perl_set_numeric_standard(pTHX);
+PERL_CALLCONV void Perl_require_pv(pTHX_ const char* pv);
+PERL_CALLCONV void Perl_pidgone(pTHX_ Pid_t pid, int status);
+PERL_CALLCONV void Perl_pmflag(pTHX_ U16* pmfl, int ch);
+PERL_CALLCONV OP* Perl_pmruntime(pTHX_ OP* pm, OP* expr, OP* repl);
+PERL_CALLCONV OP* Perl_pmtrans(pTHX_ OP* o, OP* expr, OP* repl);
+PERL_CALLCONV OP* Perl_pop_return(pTHX);
+PERL_CALLCONV void Perl_pop_scope(pTHX);
+PERL_CALLCONV OP* Perl_prepend_elem(pTHX_ I32 optype, OP* head, OP* tail);
+PERL_CALLCONV void Perl_push_return(pTHX_ OP* o);
+PERL_CALLCONV void Perl_push_scope(pTHX);
+PERL_CALLCONV OP* Perl_ref(pTHX_ OP* o, I32 type);
+PERL_CALLCONV OP* Perl_refkids(pTHX_ OP* o, I32 type);
+PERL_CALLCONV void Perl_regdump(pTHX_ regexp* r);
+PERL_CALLCONV I32 Perl_pregexec(pTHX_ regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave);
+PERL_CALLCONV void Perl_pregfree(pTHX_ struct regexp* r);
+PERL_CALLCONV regexp* Perl_pregcomp(pTHX_ char* exp, char* xend, PMOP* pm);
+PERL_CALLCONV char* Perl_re_intuit_start(pTHX_ regexp* prog, SV* sv, char* strpos, char* strend, U32 flags, struct re_scream_pos_data_s *data);
+PERL_CALLCONV SV* Perl_re_intuit_string(pTHX_ regexp* prog);
+PERL_CALLCONV I32 Perl_regexec_flags(pTHX_ regexp* prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, void* data, U32 flags);
+PERL_CALLCONV regnode* Perl_regnext(pTHX_ regnode* p);
+PERL_CALLCONV void Perl_regprop(pTHX_ SV* sv, regnode* o);
+PERL_CALLCONV void Perl_repeatcpy(pTHX_ char* to, const char* from, I32 len, I32 count);
+PERL_CALLCONV char* Perl_rninstr(pTHX_ const char* big, const char* bigend, const char* little, const char* lend);
+PERL_CALLCONV Sighandler_t Perl_rsignal(pTHX_ int i, Sighandler_t t);
+PERL_CALLCONV int Perl_rsignal_restore(pTHX_ int i, Sigsave_t* t);
+PERL_CALLCONV int Perl_rsignal_save(pTHX_ int i, Sighandler_t t1, Sigsave_t* t2);
+PERL_CALLCONV Sighandler_t Perl_rsignal_state(pTHX_ int i);
+PERL_CALLCONV void Perl_rxres_free(pTHX_ void** rsp);
+PERL_CALLCONV void Perl_rxres_restore(pTHX_ void** rsp, REGEXP* prx);
+PERL_CALLCONV void Perl_rxres_save(pTHX_ void** rsp, REGEXP* prx);
+#if !defined(HAS_RENAME)
+PERL_CALLCONV I32 Perl_same_dirent(pTHX_ char* a, char* b);
+#endif
+PERL_CALLCONV char* Perl_savepv(pTHX_ const char* sv);
+PERL_CALLCONV char* Perl_savepvn(pTHX_ const char* sv, I32 len);
+PERL_CALLCONV void Perl_savestack_grow(pTHX);
+PERL_CALLCONV void Perl_save_aelem(pTHX_ AV* av, I32 idx, SV **sptr);
+PERL_CALLCONV I32 Perl_save_alloc(pTHX_ I32 size, I32 pad);
+PERL_CALLCONV void Perl_save_aptr(pTHX_ AV** aptr);
+PERL_CALLCONV AV* Perl_save_ary(pTHX_ GV* gv);
+PERL_CALLCONV void Perl_save_clearsv(pTHX_ SV** svp);
+PERL_CALLCONV void Perl_save_delete(pTHX_ HV* hv, char* key, I32 klen);
+PERL_CALLCONV void Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p);
+PERL_CALLCONV void Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p);
+PERL_CALLCONV void Perl_save_freesv(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_save_freeop(pTHX_ OP* o);
+PERL_CALLCONV void Perl_save_freepv(pTHX_ char* pv);
+PERL_CALLCONV void Perl_save_generic_svref(pTHX_ SV** sptr);
+PERL_CALLCONV void Perl_save_gp(pTHX_ GV* gv, I32 empty);
+PERL_CALLCONV HV* Perl_save_hash(pTHX_ GV* gv);
+PERL_CALLCONV void Perl_save_helem(pTHX_ HV* hv, SV *key, SV **sptr);
+PERL_CALLCONV void Perl_save_hints(pTHX);
+PERL_CALLCONV void Perl_save_hptr(pTHX_ HV** hptr);
+PERL_CALLCONV void Perl_save_I16(pTHX_ I16* intp);
+PERL_CALLCONV void Perl_save_I32(pTHX_ I32* intp);
+PERL_CALLCONV void Perl_save_I8(pTHX_ I8* bytep);
+PERL_CALLCONV void Perl_save_int(pTHX_ int* intp);
+PERL_CALLCONV void Perl_save_item(pTHX_ SV* item);
+PERL_CALLCONV void Perl_save_iv(pTHX_ IV* iv);
+PERL_CALLCONV void Perl_save_list(pTHX_ SV** sarg, I32 maxsarg);
+PERL_CALLCONV void Perl_save_long(pTHX_ long* longp);
+PERL_CALLCONV void Perl_save_nogv(pTHX_ GV* gv);
+PERL_CALLCONV void Perl_save_op(pTHX);
+PERL_CALLCONV SV* Perl_save_scalar(pTHX_ GV* gv);
+PERL_CALLCONV void Perl_save_pptr(pTHX_ char** pptr);
+PERL_CALLCONV void Perl_save_vptr(pTHX_ void* pptr);
+PERL_CALLCONV void Perl_save_re_context(pTHX);
+PERL_CALLCONV void Perl_save_sptr(pTHX_ SV** sptr);
+PERL_CALLCONV SV* Perl_save_svref(pTHX_ SV** sptr);
+PERL_CALLCONV SV** Perl_save_threadsv(pTHX_ PADOFFSET i);
+PERL_CALLCONV OP* Perl_sawparens(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_scalar(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_scalarkids(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_scalarseq(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_scalarvoid(pTHX_ OP* o);
+PERL_CALLCONV NV Perl_scan_bin(pTHX_ char* start, I32 len, I32* retlen);
+PERL_CALLCONV NV Perl_scan_hex(pTHX_ char* start, I32 len, I32* retlen);
+PERL_CALLCONV char* Perl_scan_num(pTHX_ char* s);
+PERL_CALLCONV NV Perl_scan_oct(pTHX_ char* start, I32 len, I32* retlen);
+PERL_CALLCONV OP* Perl_scope(pTHX_ OP* o);
+PERL_CALLCONV char* Perl_screaminstr(pTHX_ SV* bigsv, SV* littlesv, I32 start_shift, I32 end_shift, I32 *state, I32 last);
+#if !defined(VMS)
+PERL_CALLCONV I32 Perl_setenv_getix(pTHX_ char* nam);
+#endif
+PERL_CALLCONV void Perl_setdefout(pTHX_ GV* gv);
+PERL_CALLCONV char* Perl_sharepvn(pTHX_ const char* sv, I32 len, U32 hash);
+PERL_CALLCONV HEK* Perl_share_hek(pTHX_ const char* sv, I32 len, U32 hash);
+PERL_CALLCONV Signal_t Perl_sighandler(int sig);
+PERL_CALLCONV SV** Perl_stack_grow(pTHX_ SV** sp, SV**p, int n);
+PERL_CALLCONV I32 Perl_start_subparse(pTHX_ I32 is_format, U32 flags);
+PERL_CALLCONV void Perl_sub_crush_depth(pTHX_ CV* cv);
+PERL_CALLCONV bool Perl_sv_2bool(pTHX_ SV* sv);
+PERL_CALLCONV CV* Perl_sv_2cv(pTHX_ SV* sv, HV** st, GV** gvp, I32 lref);
+PERL_CALLCONV IO* Perl_sv_2io(pTHX_ SV* sv);
+PERL_CALLCONV IV Perl_sv_2iv(pTHX_ SV* sv);
+PERL_CALLCONV SV* Perl_sv_2mortal(pTHX_ SV* sv);
+PERL_CALLCONV NV Perl_sv_2nv(pTHX_ SV* sv);
+PERL_CALLCONV char* Perl_sv_2pv(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char* Perl_sv_2pvutf8(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char* Perl_sv_2pvbyte(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV UV Perl_sv_2uv(pTHX_ SV* sv);
+PERL_CALLCONV IV Perl_sv_iv(pTHX_ SV* sv);
+PERL_CALLCONV UV Perl_sv_uv(pTHX_ SV* sv);
+PERL_CALLCONV NV Perl_sv_nv(pTHX_ SV* sv);
+PERL_CALLCONV char* Perl_sv_pvn(pTHX_ SV *sv, STRLEN *len);
+PERL_CALLCONV char* Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *len);
+PERL_CALLCONV char* Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *len);
+PERL_CALLCONV I32 Perl_sv_true(pTHX_ SV *sv);
+PERL_CALLCONV void Perl_sv_add_arena(pTHX_ char* ptr, U32 size, U32 flags);
+PERL_CALLCONV int Perl_sv_backoff(pTHX_ SV* sv);
+PERL_CALLCONV SV* Perl_sv_bless(pTHX_ SV* sv, HV* stash);
+PERL_CALLCONV void Perl_sv_catpvf(pTHX_ SV* sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_2,pTHX_3)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_vcatpvf(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void Perl_sv_catpv(pTHX_ SV* sv, const char* ptr);
+PERL_CALLCONV void Perl_sv_catpvn(pTHX_ SV* sv, const char* ptr, STRLEN len);
+PERL_CALLCONV void Perl_sv_catsv(pTHX_ SV* dsv, SV* ssv);
+PERL_CALLCONV void Perl_sv_chop(pTHX_ SV* sv, char* ptr);
+PERL_CALLCONV void Perl_sv_clean_all(pTHX);
+PERL_CALLCONV void Perl_sv_clean_objs(pTHX);
+PERL_CALLCONV void Perl_sv_clear(pTHX_ SV* sv);
+PERL_CALLCONV I32 Perl_sv_cmp(pTHX_ SV* sv1, SV* sv2);
+PERL_CALLCONV I32 Perl_sv_cmp_locale(pTHX_ SV* sv1, SV* sv2);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV char* Perl_sv_collxfrm(pTHX_ SV* sv, STRLEN* nxp);
+#endif
+PERL_CALLCONV OP* Perl_sv_compile_2op(pTHX_ SV* sv, OP** startp, char* code, AV** avp);
+PERL_CALLCONV void Perl_sv_dec(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_sv_dump(pTHX_ SV* sv);
+PERL_CALLCONV bool Perl_sv_derived_from(pTHX_ SV* sv, const char* name);
+PERL_CALLCONV I32 Perl_sv_eq(pTHX_ SV* sv1, SV* sv2);
+PERL_CALLCONV void Perl_sv_free(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_sv_free_arenas(pTHX);
+PERL_CALLCONV char* Perl_sv_gets(pTHX_ SV* sv, PerlIO* fp, I32 append);
+PERL_CALLCONV char* Perl_sv_grow(pTHX_ SV* sv, STRLEN newlen);
+PERL_CALLCONV void Perl_sv_inc(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_sv_insert(pTHX_ SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen);
+PERL_CALLCONV int Perl_sv_isa(pTHX_ SV* sv, const char* name);
+PERL_CALLCONV int Perl_sv_isobject(pTHX_ SV* sv);
+PERL_CALLCONV STRLEN Perl_sv_len(pTHX_ SV* sv);
+PERL_CALLCONV STRLEN Perl_sv_len_utf8(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_sv_magic(pTHX_ SV* sv, SV* obj, int how, const char* name, I32 namlen);
+PERL_CALLCONV SV* Perl_sv_mortalcopy(pTHX_ SV* oldsv);
+PERL_CALLCONV SV* Perl_sv_newmortal(pTHX);
+PERL_CALLCONV SV* Perl_sv_newref(pTHX_ SV* sv);
+PERL_CALLCONV char* Perl_sv_peek(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_sv_pos_u2b(pTHX_ SV* sv, I32* offsetp, I32* lenp);
+PERL_CALLCONV void Perl_sv_pos_b2u(pTHX_ SV* sv, I32* offsetp);
+PERL_CALLCONV char* Perl_sv_pvn_force(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char* Perl_sv_pvutf8n_force(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char* Perl_sv_pvbyten_force(pTHX_ SV* sv, STRLEN* lp);
+PERL_CALLCONV char* Perl_sv_reftype(pTHX_ SV* sv, int ob);
+PERL_CALLCONV void Perl_sv_replace(pTHX_ SV* sv, SV* nsv);
+PERL_CALLCONV void Perl_sv_report_used(pTHX);
+PERL_CALLCONV void Perl_sv_reset(pTHX_ char* s, HV* stash);
+PERL_CALLCONV void Perl_sv_setpvf(pTHX_ SV* sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_2,pTHX_3)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_vsetpvf(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void Perl_sv_setiv(pTHX_ SV* sv, IV num);
+PERL_CALLCONV void Perl_sv_setpviv(pTHX_ SV* sv, IV num);
+PERL_CALLCONV void Perl_sv_setuv(pTHX_ SV* sv, UV num);
+PERL_CALLCONV void Perl_sv_setnv(pTHX_ SV* sv, NV num);
+PERL_CALLCONV SV* Perl_sv_setref_iv(pTHX_ SV* rv, const char* classname, IV iv);
+PERL_CALLCONV SV* Perl_sv_setref_nv(pTHX_ SV* rv, const char* classname, NV nv);
+PERL_CALLCONV SV* Perl_sv_setref_pv(pTHX_ SV* rv, const char* classname, void* pv);
+PERL_CALLCONV SV* Perl_sv_setref_pvn(pTHX_ SV* rv, const char* classname, char* pv, STRLEN n);
+PERL_CALLCONV void Perl_sv_setpv(pTHX_ SV* sv, const char* ptr);
+PERL_CALLCONV void Perl_sv_setpvn(pTHX_ SV* sv, const char* ptr, STRLEN len);
+PERL_CALLCONV void Perl_sv_setsv(pTHX_ SV* dsv, SV* ssv);
+PERL_CALLCONV void Perl_sv_taint(pTHX_ SV* sv);
+PERL_CALLCONV bool Perl_sv_tainted(pTHX_ SV* sv);
+PERL_CALLCONV int Perl_sv_unmagic(pTHX_ SV* sv, int type);
+PERL_CALLCONV void Perl_sv_unref(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_sv_untaint(pTHX_ SV* sv);
+PERL_CALLCONV bool Perl_sv_upgrade(pTHX_ SV* sv, U32 mt);
+PERL_CALLCONV void Perl_sv_usepvn(pTHX_ SV* sv, char* ptr, STRLEN len);
+PERL_CALLCONV void Perl_sv_vcatpvfn(pTHX_ SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted);
+PERL_CALLCONV void Perl_sv_vsetpvfn(pTHX_ SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted);
+PERL_CALLCONV NV Perl_str_to_version(pTHX_ SV *sv);
+PERL_CALLCONV SV* Perl_swash_init(pTHX_ char* pkg, char* name, SV* listsv, I32 minbits, I32 none);
+PERL_CALLCONV UV Perl_swash_fetch(pTHX_ SV *sv, U8 *ptr);
+PERL_CALLCONV void Perl_taint_env(pTHX);
+PERL_CALLCONV void Perl_taint_proper(pTHX_ const char* f, const char* s);
+PERL_CALLCONV UV Perl_to_utf8_lower(pTHX_ U8 *p);
+PERL_CALLCONV UV Perl_to_utf8_upper(pTHX_ U8 *p);
+PERL_CALLCONV UV Perl_to_utf8_title(pTHX_ U8 *p);
+#if defined(UNLINK_ALL_VERSIONS)
+PERL_CALLCONV I32 Perl_unlnk(pTHX_ char* f);
+#endif
+#if defined(USE_THREADS)
+PERL_CALLCONV void Perl_unlock_condpair(pTHX_ void* svv);
+#endif
+PERL_CALLCONV void Perl_unsharepvn(pTHX_ const char* sv, I32 len, U32 hash);
+PERL_CALLCONV void Perl_unshare_hek(pTHX_ HEK* hek);
+PERL_CALLCONV void Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* id, OP* arg);
+PERL_CALLCONV U8* Perl_utf16_to_utf8(pTHX_ U16* p, U8 *d, I32 bytelen);
+PERL_CALLCONV U8* Perl_utf16_to_utf8_reversed(pTHX_ U16* p, U8 *d, I32 bytelen);
+PERL_CALLCONV I32 Perl_utf8_distance(pTHX_ U8 *a, U8 *b);
+PERL_CALLCONV U8* Perl_utf8_hop(pTHX_ U8 *s, I32 off);
+PERL_CALLCONV UV Perl_utf8_to_uv(pTHX_ U8 *s, I32* retlen);
+PERL_CALLCONV U8* Perl_uv_to_utf8(pTHX_ U8 *d, UV uv);
+PERL_CALLCONV void Perl_vivify_defelem(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_vivify_ref(pTHX_ SV* sv, U32 to_what);
+PERL_CALLCONV I32 Perl_wait4pid(pTHX_ Pid_t pid, int* statusp, int flags);
+PERL_CALLCONV void Perl_report_closed_fh(pTHX_ GV *gv, IO *io, const char *func, const char *obj);
+PERL_CALLCONV void Perl_report_uninit(pTHX);
+PERL_CALLCONV void Perl_warn(pTHX_ const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_1,pTHX_2)))
+#endif
+;
+PERL_CALLCONV void Perl_vwarn(pTHX_ const char* pat, va_list* args);
+PERL_CALLCONV void Perl_warner(pTHX_ U32 err, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_2,pTHX_3)))
+#endif
+;
+PERL_CALLCONV void Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args);
+PERL_CALLCONV void Perl_watch(pTHX_ char** addr);
+PERL_CALLCONV I32 Perl_whichsig(pTHX_ char* sig);
+PERL_CALLCONV int Perl_yyerror(pTHX_ char* s);
+#if defined(USE_PURE_BISON)
+PERL_CALLCONV int Perl_yylex(pTHX_ YYSTYPE *lvalp, int *lcharp);
+#else
+PERL_CALLCONV int Perl_yylex(pTHX);
+#endif
+PERL_CALLCONV int Perl_yyparse(pTHX);
+PERL_CALLCONV int Perl_yywarn(pTHX_ char* s);
+#if defined(MYMALLOC)
+PERL_CALLCONV void Perl_dump_mstats(pTHX_ char* s);
+PERL_CALLCONV int Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level);
+#endif
+PERL_CALLCONV Malloc_t Perl_safesysmalloc(MEM_SIZE nbytes);
+PERL_CALLCONV Malloc_t Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size);
+PERL_CALLCONV Malloc_t Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes);
+PERL_CALLCONV Free_t Perl_safesysfree(Malloc_t where);
+#if defined(LEAKTEST)
+PERL_CALLCONV Malloc_t Perl_safexmalloc(I32 x, MEM_SIZE size);
+PERL_CALLCONV Malloc_t Perl_safexcalloc(I32 x, MEM_SIZE elements, MEM_SIZE size);
+PERL_CALLCONV Malloc_t Perl_safexrealloc(Malloc_t where, MEM_SIZE size);
+PERL_CALLCONV void Perl_safexfree(Malloc_t where);
+#endif
+#if defined(PERL_GLOBAL_STRUCT)
+PERL_CALLCONV struct perl_vars * Perl_GetVars(pTHX);
+#endif
+PERL_CALLCONV int Perl_runops_standard(pTHX);
+PERL_CALLCONV int Perl_runops_debug(pTHX);
+PERL_CALLCONV void Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_2,pTHX_3)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_vcatpvf_mg(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void Perl_sv_catpv_mg(pTHX_ SV *sv, const char *ptr);
+PERL_CALLCONV void Perl_sv_catpvn_mg(pTHX_ SV *sv, const char *ptr, STRLEN len);
+PERL_CALLCONV void Perl_sv_catsv_mg(pTHX_ SV *dstr, SV *sstr);
+PERL_CALLCONV void Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_2,pTHX_3)))
+#endif
+;
+PERL_CALLCONV void Perl_sv_vsetpvf_mg(pTHX_ SV* sv, const char* pat, va_list* args);
+PERL_CALLCONV void Perl_sv_setiv_mg(pTHX_ SV *sv, IV i);
+PERL_CALLCONV void Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv);
+PERL_CALLCONV void Perl_sv_setuv_mg(pTHX_ SV *sv, UV u);
+PERL_CALLCONV void Perl_sv_setnv_mg(pTHX_ SV *sv, NV num);
+PERL_CALLCONV void Perl_sv_setpv_mg(pTHX_ SV *sv, const char *ptr);
+PERL_CALLCONV void Perl_sv_setpvn_mg(pTHX_ SV *sv, const char *ptr, STRLEN len);
+PERL_CALLCONV void Perl_sv_setsv_mg(pTHX_ SV *dstr, SV *sstr);
+PERL_CALLCONV void Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len);
+PERL_CALLCONV MGVTBL* Perl_get_vtbl(pTHX_ int vtbl_id);
+PERL_CALLCONV char* Perl_pv_display(pTHX_ SV *sv, char *pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+PERL_CALLCONV void Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
+#ifdef CHECK_FORMAT
+ __attribute__((format(printf,pTHX_3,pTHX_4)))
+#endif
+;
+PERL_CALLCONV void Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args);
+PERL_CALLCONV void Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, char *name, GV *sv);
+PERL_CALLCONV void Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, char *name, GV *sv);
+PERL_CALLCONV void Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, char *name, HV *sv);
+PERL_CALLCONV void Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
+PERL_CALLCONV void Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, OP *o);
+PERL_CALLCONV void Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, PMOP *pm);
+PERL_CALLCONV void Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim);
+PERL_CALLCONV void Perl_magic_dump(pTHX_ MAGIC *mg);
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+PERL_CALLCONV void* Perl_default_protect(pTHX_ volatile JMPENV *je, int *excpt, protect_body_t body, ...);
+PERL_CALLCONV void* Perl_vdefault_protect(pTHX_ volatile JMPENV *je, int *excpt, protect_body_t body, va_list *args);
+#endif
+PERL_CALLCONV void Perl_reginitcolors(pTHX);
+PERL_CALLCONV char* Perl_sv_2pv_nolen(pTHX_ SV* sv);
+PERL_CALLCONV char* Perl_sv_2pvutf8_nolen(pTHX_ SV* sv);
+PERL_CALLCONV char* Perl_sv_2pvbyte_nolen(pTHX_ SV* sv);
+PERL_CALLCONV char* Perl_sv_pv(pTHX_ SV *sv);
+PERL_CALLCONV char* Perl_sv_pvutf8(pTHX_ SV *sv);
+PERL_CALLCONV char* Perl_sv_pvbyte(pTHX_ SV *sv);
+PERL_CALLCONV void Perl_sv_utf8_upgrade(pTHX_ SV *sv);
+PERL_CALLCONV bool Perl_sv_utf8_downgrade(pTHX_ SV *sv, bool fail_ok);
+PERL_CALLCONV void Perl_sv_utf8_encode(pTHX_ SV *sv);
+PERL_CALLCONV bool Perl_sv_utf8_decode(pTHX_ SV *sv);
+PERL_CALLCONV void Perl_sv_force_normal(pTHX_ SV *sv);
+PERL_CALLCONV void Perl_tmps_grow(pTHX_ I32 n);
+PERL_CALLCONV SV* Perl_sv_rvweaken(pTHX_ SV *sv);
+PERL_CALLCONV int Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg);
+PERL_CALLCONV OP* Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block);
+PERL_CALLCONV CV* Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
+PERL_CALLCONV void Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
+PERL_CALLCONV OP * Perl_my_attrs(pTHX_ OP *o, OP *attrs);
+PERL_CALLCONV void Perl_boot_core_xsutils(pTHX);
+#if defined(USE_ITHREADS)
+PERL_CALLCONV PERL_CONTEXT* Perl_cx_dup(pTHX_ PERL_CONTEXT* cx, I32 ix, I32 max);
+PERL_CALLCONV PERL_SI* Perl_si_dup(pTHX_ PERL_SI* si);
+PERL_CALLCONV ANY* Perl_ss_dup(pTHX_ PerlInterpreter* proto_perl);
+PERL_CALLCONV void* Perl_any_dup(pTHX_ void* v, PerlInterpreter* proto_perl);
+PERL_CALLCONV HE* Perl_he_dup(pTHX_ HE* e, bool shared);
+PERL_CALLCONV REGEXP* Perl_re_dup(pTHX_ REGEXP* r);
+PERL_CALLCONV PerlIO* Perl_fp_dup(pTHX_ PerlIO* fp, char type);
+PERL_CALLCONV DIR* Perl_dirp_dup(pTHX_ DIR* dp);
+PERL_CALLCONV GP* Perl_gp_dup(pTHX_ GP* gp);
+PERL_CALLCONV MAGIC* Perl_mg_dup(pTHX_ MAGIC* mg);
+PERL_CALLCONV SV* Perl_sv_dup(pTHX_ SV* sstr);
+#if defined(HAVE_INTERP_INTERN)
+PERL_CALLCONV void Perl_sys_intern_dup(pTHX_ struct interp_intern* src, struct interp_intern* dst);
+#endif
+PERL_CALLCONV PTR_TBL_t* Perl_ptr_table_new(pTHX);
+PERL_CALLCONV void* Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv);
+PERL_CALLCONV void Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldsv, void *newsv);
+PERL_CALLCONV void Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl);
#endif
-#ifdef LEAKTEST
-VIRTUAL Malloc_t safexmalloc _((I32 x, MEM_SIZE size));
-VIRTUAL Malloc_t safexcalloc _((I32 x, MEM_SIZE elements, MEM_SIZE size));
-VIRTUAL Malloc_t safexrealloc _((Malloc_t where, MEM_SIZE size));
-VIRTUAL void safexfree _((Malloc_t where));
+#if defined(PERL_OBJECT)
+protected:
+#else
+END_EXTERN_C
#endif
-#ifdef PERL_GLOBAL_STRUCT
-VIRTUAL struct perl_vars *Perl_GetVars _((void));
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_avhv_index_sv(pTHX_ SV* sv);
+STATIC I32 S_avhv_index(pTHX_ AV* av, SV* sv, U32 hash);
#endif
-#ifdef PERL_OBJECT
-protected:
-void hsplit _((HV *hv));
-void hfreeentries _((HV *hv));
-void more_he _((void));
-HE* new_he _((void));
-void del_he _((HE *p));
-HEK *save_hek _((char *str, I32 len, U32 hash));
-SV *mess_alloc _((void));
-void gv_init_sv _((GV *gv, I32 sv_type));
-SV *save_scalar_at _((SV **sptr));
-IV asIV _((SV* sv));
-UV asUV _((SV* sv));
-SV *more_sv _((void));
-void more_xiv _((void));
-void more_xnv _((void));
-void more_xpv _((void));
-void more_xrv _((void));
-XPVIV *new_xiv _((void));
-XPVNV *new_xnv _((void));
-XPV *new_xpv _((void));
-XRV *new_xrv _((void));
-void del_xiv _((XPVIV* p));
-void del_xnv _((XPVNV* p));
-void del_xpv _((XPV* p));
-void del_xrv _((XRV* p));
-void sv_mortalgrow _((void));
-void sv_unglob _((SV* sv));
-void sv_check_thinkfirst _((SV *sv));
-I32 avhv_index_sv _((SV* sv));
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_do_trans_CC_simple(pTHX_ SV *sv);
+STATIC I32 S_do_trans_CC_count(pTHX_ SV *sv);
+STATIC I32 S_do_trans_CC_complex(pTHX_ SV *sv);
+STATIC I32 S_do_trans_UU_simple(pTHX_ SV *sv);
+STATIC I32 S_do_trans_UU_count(pTHX_ SV *sv);
+STATIC I32 S_do_trans_UU_complex(pTHX_ SV *sv);
+STATIC I32 S_do_trans_UC_simple(pTHX_ SV *sv);
+STATIC I32 S_do_trans_CU_simple(pTHX_ SV *sv);
+STATIC I32 S_do_trans_UC_trivial(pTHX_ SV *sv);
+STATIC I32 S_do_trans_CU_trivial(pTHX_ SV *sv);
+#endif
-void do_report_used _((SV *sv));
-void do_clean_objs _((SV *sv));
-void do_clean_named_objs _((SV *sv));
-void do_clean_all _((SV *sv));
-void not_a_number _((SV *sv));
-void* my_safemalloc _((MEM_SIZE size));
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+STATIC void S_gv_init_sv(pTHX_ GV *gv, I32 sv_type);
+#endif
-typedef void (CPerlObj::*SVFUNC) _((SV*));
-void visit _((SVFUNC f));
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+STATIC void S_hsplit(pTHX_ HV *hv);
+STATIC void S_hfreeentries(pTHX_ HV *hv);
+STATIC void S_more_he(pTHX);
+STATIC HE* S_new_he(pTHX);
+STATIC void S_del_he(pTHX_ HE *p);
+STATIC HEK* S_save_hek(pTHX_ const char *str, I32 len, U32 hash);
+STATIC void S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store);
+#endif
-typedef I32 (CPerlObj::*SVCOMPARE) _((SV*, SV*));
-void qsortsv _((SV ** array, size_t num_elts, SVCOMPARE f));
-I32 sortcv _((SV *a, SV *b));
-void save_magic _((MGS *mgs, SV *sv));
-int magic_methpack _((SV *sv, MAGIC *mg, char *meth));
-int magic_methcall _((SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val));
-OP * doform _((CV *cv, GV *gv, OP *retop));
-void doencodes _((SV* sv, char* s, I32 len));
-SV* refto _((SV* sv));
-U32 seed _((void));
-OP *docatch _((OP *o));
-OP *dofindlabel _((OP *o, char *label, OP **opstack, OP **oplimit));
-void doparseform _((SV *sv));
-I32 dopoptoeval _((I32 startingblock));
-I32 dopoptolabel _((char *label));
-I32 dopoptoloop _((I32 startingblock));
-I32 dopoptosub _((I32 startingblock));
-I32 dopoptosub_at _((PERL_CONTEXT* cxstk, I32 startingblock));
-void save_lines _((AV *array, SV *sv));
-OP *doeval _((int gimme, OP** startop));
-SV *mul128 _((SV *sv, U8 m));
-SV *is_an_int _((char *s, STRLEN l));
-int div128 _((SV *pnum, bool *done));
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+STATIC void S_save_magic(pTHX_ I32 mgs_ix, SV *sv);
+STATIC int S_magic_methpack(pTHX_ SV *sv, MAGIC *mg, char *meth);
+STATIC int S_magic_methcall(pTHX_ SV *sv, MAGIC *mg, char *meth, I32 f, int n, SV *val);
+#endif
-int runops_standard _((void));
-int runops_debug _((void));
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_list_assignment(pTHX_ OP *o);
+STATIC void S_bad_type(pTHX_ I32 n, char *t, char *name, OP *kid);
+STATIC void S_cop_free(pTHX_ COP *cop);
+STATIC OP* S_modkids(pTHX_ OP *o, I32 type);
+STATIC void S_no_bareword_allowed(pTHX_ OP *o);
+STATIC OP* S_no_fh_allowed(pTHX_ OP *o);
+STATIC OP* S_scalarboolean(pTHX_ OP *o);
+STATIC OP* S_too_few_arguments(pTHX_ OP *o, char* name);
+STATIC OP* S_too_many_arguments(pTHX_ OP *o, char* name);
+STATIC void S_op_clear(pTHX_ OP* o);
+STATIC void S_null(pTHX_ OP* o);
+STATIC PADOFFSET S_pad_addlex(pTHX_ SV* name);
+STATIC PADOFFSET S_pad_findlex(pTHX_ char* name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 saweval, U32 flags);
+STATIC OP* S_newDEFSVOP(pTHX);
+STATIC OP* S_new_logop(pTHX_ I32 type, I32 flags, OP **firstp, OP **otherp);
+STATIC void S_simplify_sort(pTHX_ OP *o);
+STATIC bool S_is_handle_constructor(pTHX_ OP *o, I32 argnum);
+STATIC char* S_gv_ename(pTHX_ GV *gv);
+STATIC void S_cv_dump(pTHX_ CV *cv);
+STATIC CV* S_cv_clone2(pTHX_ CV *proto, CV *outside);
+STATIC bool S_scalar_mod_type(pTHX_ OP *o, I32 type);
+STATIC OP * S_my_kid(pTHX_ OP *o, OP *attrs);
+STATIC OP * S_dup_attrlist(pTHX_ OP *o);
+STATIC void S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs);
+# if defined(PL_OP_SLAB_ALLOC)
+STATIC void* S_Slab_Alloc(pTHX_ int m, size_t sz);
+# endif
+#endif
-void check_uni _((void));
-void force_next _((I32 type));
-char *force_version _((char *start));
-char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
-SV *tokeq _((SV *sv));
-char *scan_const _((char *start));
-char *scan_formline _((char *s));
-char *scan_heredoc _((char *s));
-char *scan_ident _((char *s, char *send, char *dest, STRLEN destlen, I32 ck_uni));
-char *scan_inputsymbol _((char *start));
-char *scan_pat _((char *start, I32 type));
-char *scan_str _((char *start));
-char *scan_subst _((char *start));
-char *scan_trans _((char *start));
-char *scan_word _((char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp));
-char *skipspace _((char *s));
-void checkcomma _((char *s, char *name, char *what));
-void force_ident _((char *s, int kind));
-void incline _((char *s));
-int intuit_method _((char *s, GV *gv));
-int intuit_more _((char *s));
-I32 lop _((I32 f, expectation x, char *s));
-void missingterm _((char *s));
-void no_op _((char *what, char *s));
-void set_csh _((void));
-I32 sublex_done _((void));
-I32 sublex_push _((void));
-I32 sublex_start _((void));
-#ifdef CRIPPLED_CC
-int uni _((I32 f, char *s));
-#endif
-char * filter_gets _((SV *sv, PerlIO *fp, STRLEN append));
-SV *new_constant _((char *s, STRLEN len, char *key, SV *sv, SV *pv, char *type));
-int ao _((int toketype));
-void depcom _((void));
-#ifdef WIN32
-I32 win32_textfilter _((int idx, SV *sv, int maxlen));
-#endif
-char* incl_perldb _((void));
-SV *isa_lookup _((HV *stash, char *name, int len, int level));
-CV *get_db_sub _((SV **svp, CV *cv));
-I32 list_assignment _((OP *o));
-void bad_type _((I32 n, char *t, char *name, OP *kid));
-OP *modkids _((OP *o, I32 type));
-OP *no_fh_allowed _((OP *o));
-OP *scalarboolean _((OP *o));
-OP *too_few_arguments _((OP *o, char* name));
-OP *too_many_arguments _((OP *o, char* name));
-void null _((OP* o));
-PADOFFSET pad_findlex _((char* name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 saweval, U32 flags));
-OP *newDEFSVOP _((void));
-char* gv_ename _((GV *gv));
-CV *cv_clone2 _((CV *proto, CV *outside));
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+STATIC void S_find_beginning(pTHX);
+STATIC void S_forbid_setid(pTHX_ char *);
+STATIC void S_incpush(pTHX_ char *, int, int);
+STATIC void S_init_interp(pTHX);
+STATIC void S_init_ids(pTHX);
+STATIC void S_init_lexer(pTHX);
+STATIC void S_init_main_stash(pTHX);
+STATIC void S_init_perllib(pTHX);
+STATIC void S_init_postdump_symbols(pTHX_ int, char **, char **);
+STATIC void S_init_predump_symbols(pTHX);
+STATIC void S_my_exit_jump(pTHX) __attribute__((noreturn));
+STATIC void S_nuke_stacks(pTHX);
+STATIC void S_open_script(pTHX_ char *, bool, SV *, int *fd);
+STATIC void S_usage(pTHX_ char *);
+STATIC void S_validate_suid(pTHX_ char *, char*, int);
+# if defined(IAMSUID)
+STATIC int S_fd_on_nosuid_fs(pTHX_ int fd);
+# endif
+STATIC void* S_parse_body(pTHX_ char **env, XSINIT_t xsinit);
+STATIC void* S_run_body(pTHX_ I32 oldscope);
+STATIC void S_call_body(pTHX_ OP *myop, int is_eval);
+STATIC void* S_call_list_body(pTHX_ CV *cv);
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+STATIC void* S_vparse_body(pTHX_ va_list args);
+STATIC void* S_vrun_body(pTHX_ va_list args);
+STATIC void* S_vcall_body(pTHX_ va_list args);
+STATIC void* S_vcall_list_body(pTHX_ va_list args);
+#endif
+# if defined(USE_THREADS)
+STATIC struct perl_thread * S_init_main_thread(pTHX);
+# endif
+#endif
-void find_beginning _((void));
-void forbid_setid _((char *));
-void incpush _((char *, int));
-void init_interp _((void));
-void init_ids _((void));
-void init_debugger _((void));
-void init_lexer _((void));
-void init_main_stash _((void));
-#ifdef USE_THREADS
-struct perl_thread * init_main_thread _((void));
-#endif /* USE_THREADS */
-void init_perllib _((void));
-void init_postdump_symbols _((int, char **, char **));
-void init_predump_symbols _((void));
-void my_exit_jump _((void)) __attribute__((noreturn));
-void nuke_stacks _((void));
-void open_script _((char *, bool, SV *, int *fd));
-void usage _((char *));
-void validate_suid _((char *, char*, int));
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+STATIC void S_doencodes(pTHX_ SV* sv, char* s, I32 len);
+STATIC SV* S_refto(pTHX_ SV* sv);
+STATIC U32 S_seed(pTHX);
+STATIC SV* S_mul128(pTHX_ SV *sv, U8 m);
+STATIC SV* S_is_an_int(pTHX_ char *s, STRLEN l);
+STATIC int S_div128(pTHX_ SV *pnum, bool *done);
+#endif
-regnode *reg _((I32, I32 *));
-regnode *reganode _((U8, U32));
-regnode *regatom _((I32 *));
-regnode *regbranch _((I32 *, I32));
-void regc _((U8, char *));
-regnode *regclass _((void));
-I32 regcurly _((char *));
-regnode *reg_node _((U8));
-regnode *regpiece _((I32 *));
-void reginsert _((U8, regnode *));
-void regoptail _((regnode *, regnode *));
-void regset _((char *, I32));
-void regtail _((regnode *, regnode *));
-char* regwhite _((char *, char *));
-char* nextchar _((void));
-regnode *dumpuntil _((regnode *start, regnode *node, regnode *last, SV* sv, I32 l));
-void scan_commit _((scan_data_t *data));
-I32 study_chunk _((regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 flags));
-I32 add_data _((I32 n, char *s));
-void re_croak2 _((const char* pat1,const char* pat2,...)) __attribute__((noreturn));
-I32 regmatch _((regnode *prog));
-I32 regrepeat _((regnode *p, I32 max));
-I32 regrepeat_hard _((regnode *p, I32 max, I32 *lp));
-I32 regtry _((regexp *prog, char *startpos));
-bool reginclass _((char *p, I32 c));
-CHECKPOINT regcppush _((I32 parenfloor));
-char * regcppop _((void));
-void dump _((char *pat,...));
-#ifdef WIN32
-int do_aspawn _((void *vreally, void **vmark, void **vsp));
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_docatch(pTHX_ OP *o);
+STATIC void* S_docatch_body(pTHX);
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+STATIC void* S_vdocatch_body(pTHX_ va_list args);
+#endif
+STATIC OP* S_dofindlabel(pTHX_ OP *o, char *label, OP **opstack, OP **oplimit);
+STATIC void S_doparseform(pTHX_ SV *sv);
+STATIC I32 S_dopoptoeval(pTHX_ I32 startingblock);
+STATIC I32 S_dopoptolabel(pTHX_ char *label);
+STATIC I32 S_dopoptoloop(pTHX_ I32 startingblock);
+STATIC I32 S_dopoptosub(pTHX_ I32 startingblock);
+STATIC I32 S_dopoptosub_at(pTHX_ PERL_CONTEXT* cxstk, I32 startingblock);
+STATIC void S_free_closures(pTHX);
+STATIC void S_save_lines(pTHX_ AV *array, SV *sv);
+STATIC OP* S_doeval(pTHX_ int gimme, OP** startop);
+STATIC PerlIO * S_doopen_pmc(pTHX_ const char *name, const char *mode);
+STATIC void S_qsortsv(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t f);
#endif
-#ifdef DEBUGGING
-void del_sv _((SV *p));
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+STATIC int S_do_maybe_phash(pTHX_ AV *ary, SV **lelem, SV **firstlelem, SV **relem, SV **lastrelem);
+STATIC void S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem);
+STATIC CV* S_get_db_sub(pTHX_ SV **svp, CV *cv);
+STATIC SV* S_method_common(pTHX_ SV* meth, U32* hashp);
#endif
-void debprof _((OP *o));
-void *bset_obj_store _((void *obj, I32 ix));
-OP *new_logop _((I32 type, I32 flags, OP **firstp, OP **otherp));
-I32 amagic_cmp _((register SV *str1, register SV *str2));
-I32 amagic_cmp_locale _((register SV *str1, register SV *str2));
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_doform(pTHX_ CV *cv, GV *gv, OP *retop);
+STATIC int S_emulate_eaccess(pTHX_ const char* path, Mode_t mode);
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+STATIC int S_dooneliner(pTHX_ char *cmd, char *filename);
+# endif
+#endif
-#define PPDEF(s) OP* CPerlObj::s _((ARGSproto));
-public:
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+STATIC regnode* S_reg(pTHX_ I32, I32 *);
+STATIC regnode* S_reganode(pTHX_ U8, U32);
+STATIC regnode* S_regatom(pTHX_ I32 *);
+STATIC regnode* S_regbranch(pTHX_ I32 *, I32);
+STATIC void S_reguni(pTHX_ UV, char *, I32*);
+STATIC regnode* S_regclass(pTHX);
+STATIC regnode* S_regclassutf8(pTHX);
+STATIC I32 S_regcurly(pTHX_ char *);
+STATIC regnode* S_reg_node(pTHX_ U8);
+STATIC regnode* S_regpiece(pTHX_ I32 *);
+STATIC void S_reginsert(pTHX_ U8, regnode *);
+STATIC void S_regoptail(pTHX_ regnode *, regnode *);
+STATIC void S_regtail(pTHX_ regnode *, regnode *);
+STATIC char* S_regwhite(pTHX_ char *, char *);
+STATIC char* S_nextchar(pTHX);
+STATIC regnode* S_dumpuntil(pTHX_ regnode *start, regnode *node, regnode *last, SV* sv, I32 l);
+STATIC void S_put_byte(pTHX_ SV* sv, int c);
+STATIC void S_scan_commit(pTHX_ struct scan_data_t *data);
+STATIC void S_cl_anything(pTHX_ struct regnode_charclass_class *cl);
+STATIC int S_cl_is_anything(pTHX_ struct regnode_charclass_class *cl);
+STATIC void S_cl_init(pTHX_ struct regnode_charclass_class *cl);
+STATIC void S_cl_init_zero(pTHX_ struct regnode_charclass_class *cl);
+STATIC void S_cl_and(pTHX_ struct regnode_charclass_class *cl, struct regnode_charclass_class *and_with);
+STATIC void S_cl_or(pTHX_ struct regnode_charclass_class *cl, struct regnode_charclass_class *or_with);
+STATIC I32 S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, struct scan_data_t *data, U32 flags);
+STATIC I32 S_add_data(pTHX_ I32 n, char *s);
+STATIC void S_re_croak2(pTHX_ const char* pat1, const char* pat2, ...) __attribute__((noreturn));
+STATIC I32 S_regpposixcc(pTHX_ I32 value);
+STATIC void S_checkposixcc(pTHX);
+#endif
-#include "pp_proto.h"
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_regmatch(pTHX_ regnode *prog);
+STATIC I32 S_regrepeat(pTHX_ regnode *p, I32 max);
+STATIC I32 S_regrepeat_hard(pTHX_ regnode *p, I32 max, I32 *lp);
+STATIC I32 S_regtry(pTHX_ regexp *prog, char *startpos);
+STATIC bool S_reginclass(pTHX_ regnode *p, I32 c);
+STATIC bool S_reginclassutf8(pTHX_ regnode *f, U8* p);
+STATIC CHECKPOINT S_regcppush(pTHX_ I32 parenfloor);
+STATIC char* S_regcppop(pTHX);
+STATIC char* S_regcp_set_to(pTHX_ I32 ss);
+STATIC void S_cache_re(pTHX_ regexp *prog);
+STATIC U8* S_reghop(pTHX_ U8 *pos, I32 off);
+STATIC U8* S_reghopmaybe(pTHX_ U8 *pos, I32 off);
+STATIC char* S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *startpos, I32 norun);
+#endif
-OP * ck_ftst _((OP *o));
-OP *ck_anoncode _((OP *o));
-OP *ck_bitop _((OP *o));
-OP *ck_concat _((OP *o));
-OP *ck_spair _((OP *o));
-OP *ck_delete _((OP *o));
-OP *ck_eof _((OP *o));
-OP *ck_eval _((OP *o));
-OP *ck_exec _((OP *o));
-OP *ck_exists _((OP *o));
-OP *ck_rvconst _((OP *o));
-OP *ck_fun _((OP *o));
-OP *ck_glob _((OP *o));
-OP *ck_grep _((OP *o));
-OP *ck_index _((OP *o));
-OP *ck_lengthconst _((OP *o));
-OP *ck_lfun _((OP *o));
-OP *ck_rfun _((OP *o));
-OP *ck_listiob _((OP *o));
-OP *ck_fun_locale _((OP *o));
-OP *ck_scmp _((OP *o));
-OP *ck_match _((OP *o));
-OP *ck_null _((OP *o));
-OP *ck_repeat _((OP *o));
-OP *ck_require _((OP *o));
-OP *ck_select _((OP *o));
-OP *ck_shift _((OP *o));
-OP *ck_sort _((OP *o));
-OP *ck_split _((OP *o));
-OP *ck_subr _((OP *o));
-OP *ck_svconst _((OP *o));
-OP *ck_trunc _((OP *o));
-void unwind_handler_stack _((void *p));
-void restore_magic _((void *p));
-void restore_rsfp _((void *f));
-void restore_expect _((void *e));
-void restore_lex_expect _((void *e));
-void yydestruct _((void *ptr));
+#if defined(PERL_IN_RUN_C) || defined(PERL_DECL_PROT)
+STATIC void S_debprof(pTHX_ OP *o);
+#endif
-VIRTUAL int fprintf _((PerlIO *pf, const char *pat, ...));
-VIRTUAL SV** get_specialsv_list _((void));
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+STATIC SV* S_save_scalar_at(pTHX_ SV **sptr);
+#endif
-#ifdef WIN32
-VIRTUAL int& ErrorNo _((void));
-#endif /* WIN32 */
-#else /* !PERL_OBJECT */
-END_EXTERN_C
-#endif /* PERL_OBJECT */
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+STATIC IV S_asIV(pTHX_ SV* sv);
+STATIC UV S_asUV(pTHX_ SV* sv);
+STATIC SV* S_more_sv(pTHX);
+STATIC void S_more_xiv(pTHX);
+STATIC void S_more_xnv(pTHX);
+STATIC void S_more_xpv(pTHX);
+STATIC void S_more_xpviv(pTHX);
+STATIC void S_more_xpvnv(pTHX);
+STATIC void S_more_xpvcv(pTHX);
+STATIC void S_more_xpvav(pTHX);
+STATIC void S_more_xpvhv(pTHX);
+STATIC void S_more_xpvmg(pTHX);
+STATIC void S_more_xpvlv(pTHX);
+STATIC void S_more_xpvbm(pTHX);
+STATIC void S_more_xrv(pTHX);
+STATIC XPVIV* S_new_xiv(pTHX);
+STATIC XPVNV* S_new_xnv(pTHX);
+STATIC XPV* S_new_xpv(pTHX);
+STATIC XPVIV* S_new_xpviv(pTHX);
+STATIC XPVNV* S_new_xpvnv(pTHX);
+STATIC XPVCV* S_new_xpvcv(pTHX);
+STATIC XPVAV* S_new_xpvav(pTHX);
+STATIC XPVHV* S_new_xpvhv(pTHX);
+STATIC XPVMG* S_new_xpvmg(pTHX);
+STATIC XPVLV* S_new_xpvlv(pTHX);
+STATIC XPVBM* S_new_xpvbm(pTHX);
+STATIC XRV* S_new_xrv(pTHX);
+STATIC void S_del_xiv(pTHX_ XPVIV* p);
+STATIC void S_del_xnv(pTHX_ XPVNV* p);
+STATIC void S_del_xpv(pTHX_ XPV* p);
+STATIC void S_del_xpviv(pTHX_ XPVIV* p);
+STATIC void S_del_xpvnv(pTHX_ XPVNV* p);
+STATIC void S_del_xpvcv(pTHX_ XPVCV* p);
+STATIC void S_del_xpvav(pTHX_ XPVAV* p);
+STATIC void S_del_xpvhv(pTHX_ XPVHV* p);
+STATIC void S_del_xpvmg(pTHX_ XPVMG* p);
+STATIC void S_del_xpvlv(pTHX_ XPVLV* p);
+STATIC void S_del_xpvbm(pTHX_ XPVBM* p);
+STATIC void S_del_xrv(pTHX_ XRV* p);
+STATIC void S_sv_unglob(pTHX_ SV* sv);
+STATIC void S_not_a_number(pTHX_ SV *sv);
+STATIC void S_visit(pTHX_ SVFUNC_t f);
+STATIC void S_sv_add_backref(pTHX_ SV *tsv, SV *sv);
+STATIC void S_sv_del_backref(pTHX_ SV *sv);
+# if defined(DEBUGGING)
+STATIC void S_del_sv(pTHX_ SV *p);
+# endif
+#endif
-#ifdef INDIRECT_BGET_MACROS
-VIRTUAL void byterun _((struct bytestream bs));
-#else
-VIRTUAL void byterun _((PerlIO *fp));
-#endif /* INDIRECT_BGET_MACROS */
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+STATIC void S_check_uni(pTHX);
+STATIC void S_force_next(pTHX_ I32 type);
+STATIC char* S_force_version(pTHX_ char *start);
+STATIC char* S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack, int allow_tick);
+STATIC SV* S_tokeq(pTHX_ SV *sv);
+STATIC char* S_scan_const(pTHX_ char *start);
+STATIC char* S_scan_formline(pTHX_ char *s);
+STATIC char* S_scan_heredoc(pTHX_ char *s);
+STATIC char* S_scan_ident(pTHX_ char *s, char *send, char *dest, STRLEN destlen, I32 ck_uni);
+STATIC char* S_scan_inputsymbol(pTHX_ char *start);
+STATIC char* S_scan_pat(pTHX_ char *start, I32 type);
+STATIC char* S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims);
+STATIC char* S_scan_subst(pTHX_ char *start);
+STATIC char* S_scan_trans(pTHX_ char *start);
+STATIC char* S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp);
+STATIC char* S_skipspace(pTHX_ char *s);
+STATIC void S_checkcomma(pTHX_ char *s, char *name, char *what);
+STATIC void S_force_ident(pTHX_ char *s, int kind);
+STATIC void S_incline(pTHX_ char *s);
+STATIC int S_intuit_method(pTHX_ char *s, GV *gv);
+STATIC int S_intuit_more(pTHX_ char *s);
+STATIC I32 S_lop(pTHX_ I32 f, int x, char *s);
+STATIC void S_missingterm(pTHX_ char *s);
+STATIC void S_no_op(pTHX_ char *what, char *s);
+STATIC void S_set_csh(pTHX);
+STATIC I32 S_sublex_done(pTHX);
+STATIC I32 S_sublex_push(pTHX);
+STATIC I32 S_sublex_start(pTHX);
+STATIC char * S_filter_gets(pTHX_ SV *sv, PerlIO *fp, STRLEN append);
+STATIC SV* S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv, const char *type);
+STATIC int S_ao(pTHX_ int toketype);
+STATIC void S_depcom(pTHX);
+STATIC char* S_incl_perldb(pTHX);
+#if 0
+STATIC I32 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
+STATIC I32 S_utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
+#endif
+# if defined(CRIPPLED_CC)
+STATIC int S_uni(pTHX_ I32 f, char *s);
+# endif
+# if defined(PERL_CR_FILTER)
+STATIC I32 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen);
+# endif
+#endif
-VIRTUAL void sv_catpvf_mg _((SV *sv, const char* pat, ...));
-VIRTUAL void sv_catpv_mg _((SV *sv, char *ptr));
-VIRTUAL void sv_catpvn_mg _((SV *sv, char *ptr, STRLEN len));
-VIRTUAL void sv_catsv_mg _((SV *dstr, SV *sstr));
-VIRTUAL void sv_setpvf_mg _((SV *sv, const char* pat, ...));
-VIRTUAL void sv_setiv_mg _((SV *sv, IV i));
-VIRTUAL void sv_setpviv_mg _((SV *sv, IV iv));
-VIRTUAL void sv_setuv_mg _((SV *sv, UV u));
-VIRTUAL void sv_setnv_mg _((SV *sv, double num));
-VIRTUAL void sv_setpv_mg _((SV *sv, const char *ptr));
-VIRTUAL void sv_setpvn_mg _((SV *sv, const char *ptr, STRLEN len));
-VIRTUAL void sv_setsv_mg _((SV *dstr, SV *sstr));
-VIRTUAL void sv_usepvn_mg _((SV *sv, char *ptr, STRLEN len));
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+STATIC SV* S_isa_lookup(pTHX_ HV *stash, const char *name, int len, int level);
+#endif
-VIRTUAL MGVTBL* get_vtbl _((int vtbl_id));
-VIRTUAL OP* dofile _((OP* term));
-VIRTUAL void save_generic_svref _((SV** sptr));
-
-/* New virtual functions must be added here to maintain binary
- * compatablity with PERL_OBJECT
- */
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+STATIC SV* S_mess_alloc(pTHX);
+# if defined(LEAKTEST)
+STATIC void S_xstat(pTHX_ int);
+# endif
+#endif
+#if defined(PERL_OBJECT)
+};
+#endif
diff --git a/contrib/perl5/regcomp.c b/contrib/perl5/regcomp.c
index 6ddecf9..c0425b7 100644
--- a/contrib/perl5/regcomp.c
+++ b/contrib/perl5/regcomp.c
@@ -25,7 +25,7 @@
# define PERL_IN_XSUB_RE
# endif
/* need access to debugger hooks */
-# ifndef DEBUGGING
+# if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
# define DEBUGGING
# endif
#endif
@@ -35,9 +35,14 @@
# define Perl_pregcomp my_regcomp
# define Perl_regdump my_regdump
# define Perl_regprop my_regprop
-/* *These* symbols are masked to allow static link. */
# define Perl_pregfree my_regfree
+# define Perl_re_intuit_string my_re_intuit_string
+/* *These* symbols are masked to allow static link. */
# define Perl_regnext my_regnext
+# define Perl_save_re_context my_save_re_context
+# define Perl_reginitcolors my_reginitcolors
+
+# define PERL_NO_GET_CONTEXT
#endif
/*SUPPRESS 112*/
@@ -64,7 +69,7 @@
*
**** Alterations to Henry's code are...
****
- **** Copyright (c) 1991-1999, Larry Wall
+ **** Copyright (c) 1991-2000, Larry Wall
****
**** You may distribute under the terms of either the GNU General Public
**** License or the Artistic License, as specified in the README file.
@@ -75,9 +80,14 @@
* regular-expression syntax might require a total rethink.
*/
#include "EXTERN.h"
+#define PERL_IN_REGCOMP_C
#include "perl.h"
-#ifndef PERL_IN_XSUB_RE
+#ifdef PERL_IN_XSUB_RE
+# if defined(PERL_CAPI) || defined(PERL_OBJECT)
+# include "XSUB.h"
+# endif
+#else
# include "INTERN.h"
#endif
@@ -122,32 +132,9 @@
#define SPSTART 0x4 /* Starts with * or +. */
#define TRYAGAIN 0x8 /* Weeded out a declaration. */
-/*
- * Forward declarations for pregcomp()'s friends.
- */
-
-#ifndef PERL_OBJECT
-static regnode *reg _((I32, I32 *));
-static regnode *reganode _((U8, U32));
-static regnode *regatom _((I32 *));
-static regnode *regbranch _((I32 *, I32));
-static void regc _((U8, char *));
-static regnode *regclass _((void));
-STATIC I32 regcurly _((char *));
-static regnode *reg_node _((U8));
-static regnode *regpiece _((I32 *));
-static void reginsert _((U8, regnode *));
-static void regoptail _((regnode *, regnode *));
-static void regtail _((regnode *, regnode *));
-static char* regwhite _((char *, char *));
-static char* nextchar _((void));
-static void re_croak2 _((const char* pat1,const char* pat2,...)) __attribute__((noreturn));
-#endif
-
/* Length of a variant. */
-#ifndef PERL_OBJECT
-typedef struct {
+typedef struct scan_data_t {
I32 len_min;
I32 len_delta;
I32 pos_min;
@@ -163,10 +150,16 @@ typedef struct {
I32 offset_float_min;
I32 offset_float_max;
I32 flags;
+ I32 whilem_c;
+ struct regnode_charclass_class *start_class;
} scan_data_t;
-#endif
-static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+/*
+ * Forward declarations for pregcomp()'s friends.
+ */
+
+static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0 };
#define SF_BEFORE_EOL (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
#define SF_BEFORE_SEOL 0x1
@@ -192,12 +185,37 @@ static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
#define SF_IN_PAR 0x100
#define SF_HAS_EVAL 0x200
#define SCF_DO_SUBSTR 0x400
+#define SCF_DO_STCLASS_AND 0x0800
+#define SCF_DO_STCLASS_OR 0x1000
+#define SCF_DO_STCLASS (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
+
+#define RF_utf8 8
+#define UTF (PL_reg_flags & RF_utf8)
+#define LOC (PL_regflags & PMf_LOCALE)
+#define FOLD (PL_regflags & PMf_FOLD)
+
+#define OOB_CHAR8 1234
+#define OOB_UTF8 123456
+#define OOB_NAMEDCLASS -1
+
+#define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
+#define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
+
+/* Allow for side effects in s */
+#define REGC(c,s) STMT_START { if (!SIZE_ONLY) *(s) = (c); else (s);} STMT_END
+
+static void clear_re(pTHXo_ void *r);
+
+/* Mark that we cannot extend a found fixed substring at this point.
+ Updata the longest found anchored substring and the longest found
+ floating substrings if needed. */
STATIC void
-scan_commit(scan_data_t *data)
+S_scan_commit(pTHX_ scan_data_t *data)
{
- STRLEN l = SvCUR(data->last_found);
- STRLEN old_l = SvCUR(*data->longest);
+ dTHR;
+ STRLEN l = CHR_SVLEN(data->last_found);
+ STRLEN old_l = CHR_SVLEN(*data->longest);
if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
sv_setsv(*data->longest, data->last_found);
@@ -208,7 +226,8 @@ scan_commit(scan_data_t *data)
|= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
else
data->flags &= ~SF_FIX_BEFORE_EOL;
- } else {
+ }
+ else {
data->offset_float_min = l ? data->last_start_min : data->pos_min;
data->offset_float_max = (l
? data->last_start_max
@@ -225,11 +244,136 @@ scan_commit(scan_data_t *data)
data->flags &= ~SF_BEFORE_EOL;
}
+/* Can match anything (initialization) */
+STATIC void
+S_cl_anything(pTHX_ struct regnode_charclass_class *cl)
+{
+ int value;
+
+ ANYOF_CLASS_ZERO(cl);
+ for (value = 0; value < 256; ++value)
+ ANYOF_BITMAP_SET(cl, value);
+ cl->flags = ANYOF_EOS;
+ if (LOC)
+ cl->flags |= ANYOF_LOCALE;
+}
+
+/* Can match anything (initialization) */
+STATIC int
+S_cl_is_anything(pTHX_ struct regnode_charclass_class *cl)
+{
+ int value;
+
+ for (value = 0; value < ANYOF_MAX; value += 2)
+ if (ANYOF_CLASS_TEST(cl, value) && ANYOF_CLASS_TEST(cl, value + 1))
+ return 1;
+ for (value = 0; value < 256; ++value)
+ if (!ANYOF_BITMAP_TEST(cl, value))
+ return 0;
+ return 1;
+}
+
+/* Can match anything (initialization) */
+STATIC void
+S_cl_init(pTHX_ struct regnode_charclass_class *cl)
+{
+ Zero(cl, 1, struct regnode_charclass_class);
+ cl->type = ANYOF;
+ cl_anything(cl);
+}
+
+STATIC void
+S_cl_init_zero(pTHX_ struct regnode_charclass_class *cl)
+{
+ Zero(cl, 1, struct regnode_charclass_class);
+ cl->type = ANYOF;
+ cl_anything(cl);
+ if (LOC)
+ cl->flags |= ANYOF_LOCALE;
+}
+
+/* 'And' a given class with another one. Can create false positives */
+/* We assume that cl is not inverted */
+STATIC void
+S_cl_and(pTHX_ struct regnode_charclass_class *cl,
+ struct regnode_charclass_class *and_with)
+{
+ if (!(and_with->flags & ANYOF_CLASS)
+ && !(cl->flags & ANYOF_CLASS)
+ && (and_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
+ && !(and_with->flags & ANYOF_FOLD)
+ && !(cl->flags & ANYOF_FOLD)) {
+ int i;
+
+ if (and_with->flags & ANYOF_INVERT)
+ for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
+ cl->bitmap[i] &= ~and_with->bitmap[i];
+ else
+ for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
+ cl->bitmap[i] &= and_with->bitmap[i];
+ } /* XXXX: logic is complicated otherwise, leave it along for a moment. */
+ if (!(and_with->flags & ANYOF_EOS))
+ cl->flags &= ~ANYOF_EOS;
+}
+
+/* 'OR' a given class with another one. Can create false positives */
+/* We assume that cl is not inverted */
+STATIC void
+S_cl_or(pTHX_ struct regnode_charclass_class *cl, struct regnode_charclass_class *or_with)
+{
+ if (or_with->flags & ANYOF_INVERT) {
+ /* We do not use
+ * (B1 | CL1) | (!B2 & !CL2) = (B1 | !B2 & !CL2) | (CL1 | (!B2 & !CL2))
+ * <= (B1 | !B2) | (CL1 | !CL2)
+ * which is wasteful if CL2 is small, but we ignore CL2:
+ * (B1 | CL1) | (!B2 & !CL2) <= (B1 | CL1) | !B2 = (B1 | !B2) | CL1
+ * XXXX Can we handle case-fold? Unclear:
+ * (OK1(i) | OK1(i')) | !(OK1(i) | OK1(i')) =
+ * (OK1(i) | OK1(i')) | (!OK1(i) & !OK1(i'))
+ */
+ if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
+ && !(or_with->flags & ANYOF_FOLD)
+ && !(cl->flags & ANYOF_FOLD) ) {
+ int i;
+
+ for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
+ cl->bitmap[i] |= ~or_with->bitmap[i];
+ } /* XXXX: logic is complicated otherwise */
+ else {
+ cl_anything(cl);
+ }
+ } else {
+ /* (B1 | CL1) | (B2 | CL2) = (B1 | B2) | (CL1 | CL2)) */
+ if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
+ && (!(or_with->flags & ANYOF_FOLD)
+ || (cl->flags & ANYOF_FOLD)) ) {
+ int i;
+
+ /* OR char bitmap and class bitmap separately */
+ for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
+ cl->bitmap[i] |= or_with->bitmap[i];
+ if (or_with->flags & ANYOF_CLASS) {
+ for (i = 0; i < ANYOF_CLASSBITMAP_SIZE; i++)
+ cl->classflags[i] |= or_with->classflags[i];
+ cl->flags |= ANYOF_CLASS;
+ }
+ }
+ else { /* XXXX: logic is complicated, leave it along for a moment. */
+ cl_anything(cl);
+ }
+ }
+ if (or_with->flags & ANYOF_EOS)
+ cl->flags |= ANYOF_EOS;
+}
+
+/* REx optimizer. Converts nodes into quickier variants "in place".
+ Finds fixed substrings. */
+
/* Stops at toplevel WHILEM as well as at `last'. At end *scanp is set
to the position after last scanned or to NULL. */
STATIC I32
-study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 flags)
+S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 flags)
/* scanp: Start here (read-write). */
/* deltap: Write maxlen-minlen here. */
/* last: Stop before this one. */
@@ -242,27 +386,29 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
int is_inf_internal = 0; /* The studied chunk is infinite */
I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
scan_data_t data_fake;
+ struct regnode_charclass_class and_with; /* Valid if flags & SCF_DO_STCLASS_OR */
while (scan && OP(scan) != END && scan < last) {
/* Peephole optimizer: */
- if (regkind[(U8)OP(scan)] == EXACT) {
+ if (PL_regkind[(U8)OP(scan)] == EXACT) {
+ /* Merge several consecutive EXACTish nodes into one. */
regnode *n = regnext(scan);
U32 stringok = 1;
#ifdef DEBUGGING
regnode *stop = scan;
#endif
- next = scan + (*OPERAND(scan) + 2 - 1)/sizeof(regnode) + 2;
+ next = scan + NODE_SZ_STR(scan);
/* Skip NOTHING, merge EXACT*. */
while (n &&
- ( regkind[(U8)OP(n)] == NOTHING ||
+ ( PL_regkind[(U8)OP(n)] == NOTHING ||
(stringok && (OP(n) == OP(scan))))
&& NEXT_OFF(n)
&& NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX) {
if (OP(n) == TAIL || n > next)
stringok = 0;
- if (regkind[(U8)OP(n)] == NOTHING) {
+ if (PL_regkind[(U8)OP(n)] == NOTHING) {
NEXT_OFF(scan) += NEXT_OFF(n);
next = n + NODE_STEP_REGNODE;
#ifdef DEBUGGING
@@ -270,18 +416,19 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
stop = n;
#endif
n = regnext(n);
- } else {
- int oldl = *OPERAND(scan);
+ }
+ else {
+ int oldl = STR_LEN(scan);
regnode *nnext = regnext(n);
- if (oldl + *OPERAND(n) > U8_MAX)
+ if (oldl + STR_LEN(n) > U8_MAX)
break;
NEXT_OFF(scan) += NEXT_OFF(n);
- *OPERAND(scan) += *OPERAND(n);
- next = n + (*OPERAND(n) + 2 - 1)/sizeof(regnode) + 2;
+ STR_LEN(scan) += STR_LEN(n);
+ next = n + NODE_SZ_STR(n);
/* Now we can overwrite *n : */
- Move(OPERAND(n) + 1, OPERAND(scan) + oldl + 1,
- *OPERAND(n) + 1, char);
+ Move(STRING(n), STRING(scan) + oldl,
+ STR_LEN(n), char);
#ifdef DEBUGGING
if (stringok)
stop = next - 1;
@@ -291,21 +438,18 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
}
#ifdef DEBUGGING
/* Allow dumping */
- n = scan + (*OPERAND(scan) + 2 - 1)/sizeof(regnode) + 2;
+ n = scan + NODE_SZ_STR(scan);
while (n <= stop) {
- /* Purify reports a benign UMR here sometimes, because we
- * don't initialize the OP() slot of a node when that node
- * is occupied by just the trailing null of the string in
- * an EXACT node */
- if (regkind[(U8)OP(n)] != NOTHING || OP(n) == NOTHING) {
+ if (PL_regkind[(U8)OP(n)] != NOTHING || OP(n) == NOTHING) {
OP(n) = OPTIMIZED;
NEXT_OFF(n) = 0;
}
n++;
}
-#endif
-
+#endif
}
+ /* Follow the next-chain of the current node and optimize
+ away all the NOTHINGs from it. */
if (OP(scan) != CURLYX) {
int max = (reg_off_by_arg[OP(scan)]
? I32_MAX
@@ -317,7 +461,7 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
/* Skip NOTHING and LONGJMP. */
while ((n = regnext(n))
- && ((regkind[(U8)OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
+ && ((PL_regkind[(U8)OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
|| ((OP(n) == LONGJMP) && (noff = ARG(n))))
&& off + noff < max)
off += noff;
@@ -326,6 +470,8 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
else
NEXT_OFF(scan) = off;
}
+ /* The principal pseudo-switch. Cannot be a switch, since we
+ look into several different things. */
if (OP(scan) == BRANCH || OP(scan) == BRANCHJ
|| OP(scan) == IFTHEN || OP(scan) == SUSPEND) {
next = regnext(scan);
@@ -333,21 +479,32 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
if (OP(next) == code || code == IFTHEN || code == SUSPEND) {
I32 max1 = 0, min1 = I32_MAX, num = 0;
+ struct regnode_charclass_class accum;
- if (flags & SCF_DO_SUBSTR)
- scan_commit(data);
+ if (flags & SCF_DO_SUBSTR) /* XXXX Add !SUSPEND? */
+ scan_commit(data); /* Cannot merge strings after this. */
+ if (flags & SCF_DO_STCLASS)
+ cl_init_zero(&accum);
while (OP(scan) == code) {
- I32 deltanext, minnext;
+ I32 deltanext, minnext, f = 0;
+ struct regnode_charclass_class this_class;
num++;
data_fake.flags = 0;
+ if (data)
+ data_fake.whilem_c = data->whilem_c;
next = regnext(scan);
scan = NEXTOPER(scan);
if (code != BRANCH)
scan = NEXTOPER(scan);
- /* We suppose the run is continuous, last=next...*/
+ if (flags & SCF_DO_STCLASS) {
+ cl_init(&this_class);
+ data_fake.start_class = &this_class;
+ f = SCF_DO_STCLASS_AND;
+ }
+ /* we suppose the run is continuous, last=next...*/
minnext = study_chunk(&scan, &deltanext, next,
- &data_fake, 0);
+ &data_fake, f);
if (min1 > minnext)
min1 = minnext;
if (max1 < minnext + deltanext)
@@ -359,6 +516,10 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
pars++;
if (data && (data_fake.flags & SF_HAS_EVAL))
data->flags |= SF_HAS_EVAL;
+ if (data)
+ data->whilem_c = data_fake.whilem_c;
+ if (flags & SCF_DO_STCLASS)
+ cl_or(&accum, &this_class);
if (code == SUSPEND)
break;
}
@@ -372,16 +533,51 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
}
min += min1;
delta += max1 - min1;
- } else if (code == BRANCHJ) /* single branch is optimized. */
+ if (flags & SCF_DO_STCLASS_OR) {
+ cl_or(data->start_class, &accum);
+ if (min1) {
+ cl_and(data->start_class, &and_with);
+ flags &= ~SCF_DO_STCLASS;
+ }
+ }
+ else if (flags & SCF_DO_STCLASS_AND) {
+ if (min1) {
+ cl_and(data->start_class, &accum);
+ flags &= ~SCF_DO_STCLASS;
+ }
+ else {
+ /* Switch to OR mode: cache the old value of
+ * data->start_class */
+ StructCopy(data->start_class, &and_with,
+ struct regnode_charclass_class);
+ flags &= ~SCF_DO_STCLASS_AND;
+ StructCopy(&accum, data->start_class,
+ struct regnode_charclass_class);
+ flags |= SCF_DO_STCLASS_OR;
+ data->start_class->flags |= ANYOF_EOS;
+ }
+ }
+ }
+ else if (code == BRANCHJ) /* single branch is optimized. */
scan = NEXTOPER(NEXTOPER(scan));
else /* single branch is optimized. */
scan = NEXTOPER(scan);
continue;
- } else if (OP(scan) == EXACT) {
- min += *OPERAND(scan);
+ }
+ else if (OP(scan) == EXACT) {
+ I32 l = STR_LEN(scan);
+ if (UTF) {
+ unsigned char *s = (unsigned char *)STRING(scan);
+ unsigned char *e = s + l;
+ I32 newl = 0;
+ while (s < e) {
+ newl++;
+ s += UTF8SKIP(s);
+ }
+ l = newl;
+ }
+ min += l;
if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
- I32 l = *OPERAND(scan);
-
/* The code below prefers earlier match for fixed
offset, later match for variable offset. */
if (data->last_end == -1) { /* Update the start info. */
@@ -389,29 +585,99 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
data->last_start_max = is_inf
? I32_MAX : data->pos_min + data->pos_delta;
}
- sv_catpvn(data->last_found, (char *)(OPERAND(scan)+1), l);
+ sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
data->last_end = data->pos_min + l;
data->pos_min += l; /* As in the first entry. */
data->flags &= ~SF_BEFORE_EOL;
}
- } else if (regkind[(U8)OP(scan)] == EXACT) {
+ if (flags & SCF_DO_STCLASS_AND) {
+ /* Check whether it is compatible with what we know already! */
+ int compat = 1;
+
+ if (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
+ && !ANYOF_BITMAP_TEST(data->start_class, *STRING(scan))
+ && (!(data->start_class->flags & ANYOF_FOLD)
+ || !ANYOF_BITMAP_TEST(data->start_class,
+ PL_fold[*(U8*)STRING(scan)])))
+ compat = 0;
+ ANYOF_CLASS_ZERO(data->start_class);
+ ANYOF_BITMAP_ZERO(data->start_class);
+ if (compat)
+ ANYOF_BITMAP_SET(data->start_class, *STRING(scan));
+ data->start_class->flags &= ~ANYOF_EOS;
+ }
+ else if (flags & SCF_DO_STCLASS_OR) {
+ /* false positive possible if the class is case-folded */
+ ANYOF_BITMAP_SET(data->start_class, *STRING(scan));
+ data->start_class->flags &= ~ANYOF_EOS;
+ cl_and(data->start_class, &and_with);
+ }
+ flags &= ~SCF_DO_STCLASS;
+ }
+ else if (PL_regkind[(U8)OP(scan)] == EXACT) { /* But OP != EXACT! */
+ I32 l = STR_LEN(scan);
+
+ /* Search for fixed substrings supports EXACT only. */
if (flags & SCF_DO_SUBSTR)
scan_commit(data);
- min += *OPERAND(scan);
+ if (UTF) {
+ unsigned char *s = (unsigned char *)STRING(scan);
+ unsigned char *e = s + l;
+ I32 newl = 0;
+ while (s < e) {
+ newl++;
+ s += UTF8SKIP(s);
+ }
+ l = newl;
+ }
+ min += l;
if (data && (flags & SCF_DO_SUBSTR))
- data->pos_min += *OPERAND(scan);
- } else if (strchr(varies,OP(scan))) {
+ data->pos_min += l;
+ if (flags & SCF_DO_STCLASS_AND) {
+ /* Check whether it is compatible with what we know already! */
+ int compat = 1;
+
+ if (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
+ && !ANYOF_BITMAP_TEST(data->start_class, *STRING(scan))
+ && !ANYOF_BITMAP_TEST(data->start_class,
+ PL_fold[*(U8*)STRING(scan)]))
+ compat = 0;
+ ANYOF_CLASS_ZERO(data->start_class);
+ ANYOF_BITMAP_ZERO(data->start_class);
+ if (compat) {
+ ANYOF_BITMAP_SET(data->start_class, *STRING(scan));
+ data->start_class->flags &= ~ANYOF_EOS;
+ data->start_class->flags |= ANYOF_FOLD;
+ if (OP(scan) == EXACTFL)
+ data->start_class->flags |= ANYOF_LOCALE;
+ }
+ }
+ else if (flags & SCF_DO_STCLASS_OR) {
+ if (data->start_class->flags & ANYOF_FOLD) {
+ /* false positive possible if the class is case-folded.
+ Assume that the locale settings are the same... */
+ ANYOF_BITMAP_SET(data->start_class, *STRING(scan));
+ data->start_class->flags &= ~ANYOF_EOS;
+ }
+ cl_and(data->start_class, &and_with);
+ }
+ flags &= ~SCF_DO_STCLASS;
+ }
+ else if (strchr((char*)PL_varies,OP(scan))) {
I32 mincount, maxcount, minnext, deltanext, pos_before, fl;
+ I32 f = flags;
regnode *oscan = scan;
-
- switch (regkind[(U8)OP(scan)]) {
- case WHILEM:
+ struct regnode_charclass_class this_class;
+ struct regnode_charclass_class *oclass = NULL;
+
+ switch (PL_regkind[(U8)OP(scan)]) {
+ case WHILEM: /* End of (?:...)* . */
scan = NEXTOPER(scan);
goto finish;
case PLUS:
- if (flags & SCF_DO_SUBSTR) {
+ if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
next = NEXTOPER(scan);
- if (OP(next) == EXACT) {
+ if (OP(next) == EXACT || (flags & SCF_DO_STCLASS)) {
mincount = 1;
maxcount = REG_INFTY;
next = regnext(scan);
@@ -424,10 +690,17 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
min++;
/* Fall through. */
case STAR:
+ if (flags & SCF_DO_STCLASS) {
+ mincount = 0;
+ maxcount = REG_INFTY;
+ next = regnext(scan);
+ scan = NEXTOPER(scan);
+ goto do_curly;
+ }
is_inf = is_inf_internal = 1;
scan = regnext(scan);
if (flags & SCF_DO_SUBSTR) {
- scan_commit(data);
+ scan_commit(data); /* Cannot extend fixed substrings */
data->longest = &(data->longest_float);
}
goto optimize_curly_tail;
@@ -438,7 +711,7 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
do_curly:
if (flags & SCF_DO_SUBSTR) {
- if (mincount == 0) scan_commit(data);
+ if (mincount == 0) scan_commit(data); /* Cannot extend fixed substrings */
pos_before = data->pos_min;
}
if (data) {
@@ -447,20 +720,56 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
if (is_inf)
data->flags |= SF_IS_INF;
}
+ if (flags & SCF_DO_STCLASS) {
+ cl_init(&this_class);
+ oclass = data->start_class;
+ data->start_class = &this_class;
+ f |= SCF_DO_STCLASS_AND;
+ f &= ~SCF_DO_STCLASS_OR;
+ }
+
/* This will finish on WHILEM, setting scan, or on NULL: */
minnext = study_chunk(&scan, &deltanext, last, data,
mincount == 0
- ? (flags & ~SCF_DO_SUBSTR) : flags);
+ ? (f & ~SCF_DO_SUBSTR) : f);
+
+ if (flags & SCF_DO_STCLASS)
+ data->start_class = oclass;
+ if (mincount == 0 || minnext == 0) {
+ if (flags & SCF_DO_STCLASS_OR) {
+ cl_or(data->start_class, &this_class);
+ }
+ else if (flags & SCF_DO_STCLASS_AND) {
+ /* Switch to OR mode: cache the old value of
+ * data->start_class */
+ StructCopy(data->start_class, &and_with,
+ struct regnode_charclass_class);
+ flags &= ~SCF_DO_STCLASS_AND;
+ StructCopy(&this_class, data->start_class,
+ struct regnode_charclass_class);
+ flags |= SCF_DO_STCLASS_OR;
+ data->start_class->flags |= ANYOF_EOS;
+ }
+ } else { /* Non-zero len */
+ if (flags & SCF_DO_STCLASS_OR) {
+ cl_or(data->start_class, &this_class);
+ cl_and(data->start_class, &and_with);
+ }
+ else if (flags & SCF_DO_STCLASS_AND)
+ cl_and(data->start_class, &this_class);
+ flags &= ~SCF_DO_STCLASS;
+ }
if (!scan) /* It was not CURLYX, but CURLY. */
scan = next;
- if (PL_dowarn && (minnext + deltanext == 0)
+ if (ckWARN(WARN_REGEXP) && (minnext + deltanext == 0)
&& !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
- && maxcount <= 10000) /* Complement check for big count */
- warn("Strange *+?{} on zero-length expression");
+ && maxcount <= REG_INFTY/3) /* Complement check for big count */
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "Strange *+?{} on zero-length expression");
min += minnext * mincount;
- is_inf_internal |= (maxcount == REG_INFTY
- && (minnext + deltanext) > 0
- || deltanext == I32_MAX);
+ is_inf_internal |= ((maxcount == REG_INFTY
+ && (minnext + deltanext) > 0)
+ || deltanext == I32_MAX);
is_inf |= is_inf_internal;
delta += (minnext + deltanext) * maxcount - minnext * mincount;
@@ -475,9 +784,9 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
/* Skip open. */
nxt = regnext(nxt);
- if (!strchr(simple,OP(nxt))
- && !(regkind[(U8)OP(nxt)] == EXACT
- && *OPERAND(nxt) == 1))
+ if (!strchr((char*)PL_simple,OP(nxt))
+ && !(PL_regkind[(U8)OP(nxt)] == EXACT
+ && STR_LEN(nxt) == 1))
goto nogo;
nxt2 = nxt;
nxt = regnext(nxt);
@@ -546,9 +855,20 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
#endif
/* Optimize again: */
study_chunk(&nxt1, &deltanext, nxt, NULL, 0);
- } else
+ }
+ else
oscan->flags = 0;
}
+ else if (OP(oscan) == CURLYX && data && ++data->whilem_c < 16) {
+ /* This stays as CURLYX, and can put the count/of pair. */
+ /* Find WHILEM (as in regexec.c) */
+ regnode *nxt = oscan + NEXT_OFF(oscan);
+
+ if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
+ nxt += ARG(nxt);
+ PREVOPER(nxt)->flags = data->whilem_c
+ | (PL_reg_whilem_seen << 4); /* On WHILEM */
+ }
if (data && fl & (SF_HAS_PAR|SF_IN_PAR))
pars++;
if (flags & SCF_DO_SUBSTR) {
@@ -560,10 +880,14 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
? pos_before : data->last_start_min;
STRLEN l;
char *s = SvPV(data->last_found, l);
+ I32 old = b - data->last_start_min;
+
+ if (UTF)
+ old = utf8_hop((U8*)s, old) - (U8*)s;
- l -= b - data->last_start_min;
+ l -= old;
/* Get the added string: */
- last_str = newSVpv(s + b - data->last_start_min, l);
+ last_str = newSVpvn(s + old, l);
if (deltanext == 0 && pos_before == b) {
/* What was added is a constant string */
if (mincount > 1) {
@@ -584,16 +908,18 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
data->pos_delta += - counted * deltanext +
(minnext + deltanext) * maxcount - minnext * mincount;
if (mincount != maxcount) {
+ /* Cannot extend fixed substrings found inside
+ the group. */
scan_commit(data);
if (mincount && last_str) {
sv_setsv(data->last_found, last_str);
data->last_end = data->pos_min;
data->last_start_min =
- data->pos_min - SvCUR(last_str);
+ data->pos_min - CHR_SVLEN(last_str);
data->last_start_max = is_inf
? I32_MAX
: data->pos_min + data->pos_delta
- - SvCUR(last_str);
+ - CHR_SVLEN(last_str);
}
data->longest = &(data->longest_float);
}
@@ -603,44 +929,269 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
data->flags |= SF_HAS_EVAL;
optimize_curly_tail:
if (OP(oscan) != CURLYX) {
- while (regkind[(U8)OP(next = regnext(oscan))] == NOTHING
+ while (PL_regkind[(U8)OP(next = regnext(oscan))] == NOTHING
&& NEXT_OFF(next))
NEXT_OFF(oscan) += NEXT_OFF(next);
}
continue;
- default: /* REF only? */
+ default: /* REF and CLUMP only? */
if (flags & SCF_DO_SUBSTR) {
- scan_commit(data);
+ scan_commit(data); /* Cannot expect anything... */
data->longest = &(data->longest_float);
}
is_inf = is_inf_internal = 1;
+ if (flags & SCF_DO_STCLASS_OR)
+ cl_anything(data->start_class);
+ flags &= ~SCF_DO_STCLASS;
break;
}
- } else if (strchr(simple,OP(scan))) {
+ }
+ else if (strchr((char*)PL_simple,OP(scan)) || PL_regkind[(U8)OP(scan)] == ANYUTF8) {
+ int value;
+
if (flags & SCF_DO_SUBSTR) {
scan_commit(data);
data->pos_min++;
}
min++;
- } else if (regkind[(U8)OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
+ if (flags & SCF_DO_STCLASS) {
+ data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
+
+ /* Some of the logic below assumes that switching
+ locale on will only add false positives. */
+ switch (PL_regkind[(U8)OP(scan)]) {
+ case ANYUTF8:
+ case SANY:
+ case SANYUTF8:
+ case ALNUMUTF8:
+ case ANYOFUTF8:
+ case ALNUMLUTF8:
+ case NALNUMUTF8:
+ case NALNUMLUTF8:
+ case SPACEUTF8:
+ case NSPACEUTF8:
+ case SPACELUTF8:
+ case NSPACELUTF8:
+ case DIGITUTF8:
+ case NDIGITUTF8:
+ default:
+ do_default:
+ /* Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", OP(scan)); */
+ if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
+ cl_anything(data->start_class);
+ break;
+ case REG_ANY:
+ if (OP(scan) == SANY)
+ goto do_default;
+ if (flags & SCF_DO_STCLASS_OR) { /* Everything but \n */
+ value = (ANYOF_BITMAP_TEST(data->start_class,'\n')
+ || (data->start_class->flags & ANYOF_CLASS));
+ cl_anything(data->start_class);
+ }
+ if (flags & SCF_DO_STCLASS_AND || !value)
+ ANYOF_BITMAP_CLEAR(data->start_class,'\n');
+ break;
+ case ANYOF:
+ if (flags & SCF_DO_STCLASS_AND)
+ cl_and(data->start_class,
+ (struct regnode_charclass_class*)scan);
+ else
+ cl_or(data->start_class,
+ (struct regnode_charclass_class*)scan);
+ break;
+ case ALNUM:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (!(data->start_class->flags & ANYOF_LOCALE)) {
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
+ for (value = 0; value < 256; value++)
+ if (!isALNUM(value))
+ ANYOF_BITMAP_CLEAR(data->start_class, value);
+ }
+ }
+ else {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isALNUM(value))
+ ANYOF_BITMAP_SET(data->start_class, value);
+ }
+ }
+ break;
+ case ALNUML:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
+ }
+ else {
+ ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
+ data->start_class->flags |= ANYOF_LOCALE;
+ }
+ break;
+ case NALNUM:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (!(data->start_class->flags & ANYOF_LOCALE)) {
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
+ for (value = 0; value < 256; value++)
+ if (isALNUM(value))
+ ANYOF_BITMAP_CLEAR(data->start_class, value);
+ }
+ }
+ else {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isALNUM(value))
+ ANYOF_BITMAP_SET(data->start_class, value);
+ }
+ }
+ break;
+ case NALNUML:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
+ }
+ else {
+ data->start_class->flags |= ANYOF_LOCALE;
+ ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
+ }
+ break;
+ case SPACE:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (!(data->start_class->flags & ANYOF_LOCALE)) {
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
+ for (value = 0; value < 256; value++)
+ if (!isSPACE(value))
+ ANYOF_BITMAP_CLEAR(data->start_class, value);
+ }
+ }
+ else {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isSPACE(value))
+ ANYOF_BITMAP_SET(data->start_class, value);
+ }
+ }
+ break;
+ case SPACEL:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
+ }
+ else {
+ data->start_class->flags |= ANYOF_LOCALE;
+ ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
+ }
+ break;
+ case NSPACE:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (!(data->start_class->flags & ANYOF_LOCALE)) {
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
+ for (value = 0; value < 256; value++)
+ if (isSPACE(value))
+ ANYOF_BITMAP_CLEAR(data->start_class, value);
+ }
+ }
+ else {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isSPACE(value))
+ ANYOF_BITMAP_SET(data->start_class, value);
+ }
+ }
+ break;
+ case NSPACEL:
+ if (flags & SCF_DO_STCLASS_AND) {
+ if (data->start_class->flags & ANYOF_LOCALE) {
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
+ for (value = 0; value < 256; value++)
+ if (!isSPACE(value))
+ ANYOF_BITMAP_CLEAR(data->start_class, value);
+ }
+ }
+ else {
+ data->start_class->flags |= ANYOF_LOCALE;
+ ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
+ }
+ break;
+ case DIGIT:
+ if (flags & SCF_DO_STCLASS_AND) {
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NDIGIT);
+ for (value = 0; value < 256; value++)
+ if (!isDIGIT(value))
+ ANYOF_BITMAP_CLEAR(data->start_class, value);
+ }
+ else {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_SET(data->start_class,ANYOF_DIGIT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isDIGIT(value))
+ ANYOF_BITMAP_SET(data->start_class, value);
+ }
+ }
+ break;
+ case NDIGIT:
+ if (flags & SCF_DO_STCLASS_AND) {
+ ANYOF_CLASS_CLEAR(data->start_class,ANYOF_DIGIT);
+ for (value = 0; value < 256; value++)
+ if (isDIGIT(value))
+ ANYOF_BITMAP_CLEAR(data->start_class, value);
+ }
+ else {
+ if (data->start_class->flags & ANYOF_LOCALE)
+ ANYOF_CLASS_SET(data->start_class,ANYOF_NDIGIT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isDIGIT(value))
+ ANYOF_BITMAP_SET(data->start_class, value);
+ }
+ }
+ break;
+ }
+ if (flags & SCF_DO_STCLASS_OR)
+ cl_and(data->start_class, &and_with);
+ flags &= ~SCF_DO_STCLASS;
+ }
+ }
+ else if (PL_regkind[(U8)OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
data->flags |= (OP(scan) == MEOL
? SF_BEFORE_MEOL
: SF_BEFORE_SEOL);
- } else if (regkind[(U8)OP(scan)] == BRANCHJ
- && (scan->flags || data)
+ }
+ else if ( PL_regkind[(U8)OP(scan)] == BRANCHJ
+ /* Lookbehind, or need to calculate parens/evals/stclass: */
+ && (scan->flags || data || (flags & SCF_DO_STCLASS))
&& (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) {
+ /* Lookahead/lookbehind */
I32 deltanext, minnext;
regnode *nscan;
+ struct regnode_charclass_class intrnl;
+ int f = 0;
data_fake.flags = 0;
+ if (data)
+ data_fake.whilem_c = data->whilem_c;
+ if ( flags & SCF_DO_STCLASS && !scan->flags
+ && OP(scan) == IFMATCH ) { /* Lookahead */
+ cl_init(&intrnl);
+ data_fake.start_class = &intrnl;
+ f = SCF_DO_STCLASS_AND;
+ }
next = regnext(scan);
nscan = NEXTOPER(NEXTOPER(scan));
- minnext = study_chunk(&nscan, &deltanext, last, &data_fake, 0);
+ minnext = study_chunk(&nscan, &deltanext, last, &data_fake, f);
if (scan->flags) {
if (deltanext) {
FAIL("variable length lookbehind not implemented");
- } else if (minnext > U8_MAX) {
- FAIL2("lookbehind longer than %d not implemented", U8_MAX);
+ }
+ else if (minnext > U8_MAX) {
+ FAIL2("lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
}
scan->flags = minnext;
}
@@ -648,17 +1199,39 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
pars++;
if (data && (data_fake.flags & SF_HAS_EVAL))
data->flags |= SF_HAS_EVAL;
- } else if (OP(scan) == OPEN) {
+ if (data)
+ data->whilem_c = data_fake.whilem_c;
+ if (f) {
+ int was = (data->start_class->flags & ANYOF_EOS);
+
+ cl_and(data->start_class, &intrnl);
+ if (was)
+ data->start_class->flags |= ANYOF_EOS;
+ }
+ }
+ else if (OP(scan) == OPEN) {
pars++;
- } else if (OP(scan) == CLOSE && ARG(scan) == is_par) {
+ }
+ else if (OP(scan) == CLOSE && ARG(scan) == is_par) {
next = regnext(scan);
if ( next && (OP(next) != WHILEM) && next < last)
is_par = 0; /* Disable optimization */
- } else if (OP(scan) == EVAL) {
+ }
+ else if (OP(scan) == EVAL) {
if (data)
data->flags |= SF_HAS_EVAL;
}
+ else if (OP(scan) == LOGICAL && scan->flags == 2) { /* Embedded follows */
+ if (flags & SCF_DO_SUBSTR) {
+ scan_commit(data);
+ data->longest = &(data->longest_float);
+ }
+ is_inf = is_inf_internal = 1;
+ if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
+ cl_anything(data->start_class);
+ flags &= ~SCF_DO_STCLASS;
+ }
/* Else: zero-length, ignore. */
scan = regnext(scan);
}
@@ -673,15 +1246,18 @@ study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32
if (is_par && pars==1 && data) {
data->flags |= SF_IN_PAR;
data->flags &= ~SF_HAS_PAR;
- } else if (pars && data) {
+ }
+ else if (pars && data) {
data->flags |= SF_HAS_PAR;
data->flags &= ~SF_IN_PAR;
}
+ if (flags & SCF_DO_STCLASS_OR)
+ cl_and(data->start_class, &and_with);
return min;
}
STATIC I32
-add_data(I32 n, char *s)
+S_add_data(pTHX_ I32 n, char *s)
{
dTHR;
if (PL_regcomp_rx->data) {
@@ -690,7 +1266,8 @@ add_data(I32 n, char *s)
char, struct reg_data);
Renew(PL_regcomp_rx->data->what, PL_regcomp_rx->data->count + n, U8);
PL_regcomp_rx->data->count += n;
- } else {
+ }
+ else {
Newc(1207, PL_regcomp_rx->data, sizeof(*PL_regcomp_rx->data) + sizeof(void*) * (n - 1),
char, struct reg_data);
New(1208, PL_regcomp_rx->data->what, n, U8);
@@ -700,6 +1277,31 @@ add_data(I32 n, char *s)
return PL_regcomp_rx->data->count - n;
}
+void
+Perl_reginitcolors(pTHX)
+{
+ dTHR;
+ int i = 0;
+ char *s = PerlEnv_getenv("PERL_RE_COLORS");
+
+ if (s) {
+ PL_colors[0] = s = savepv(s);
+ while (++i < 6) {
+ s = strchr(s, '\t');
+ if (s) {
+ *s = '\0';
+ PL_colors[i] = ++s;
+ }
+ else
+ PL_colors[i] = s = "";
+ }
+ } else {
+ while (i < 6)
+ PL_colors[i++] = "";
+ }
+ PL_colorset = 1;
+}
+
/*
- pregcomp - compile a regular expression into internal code
*
@@ -716,26 +1318,32 @@ add_data(I32 n, char *s)
* of the structure of the compiled regexp. [I'll say.]
*/
regexp *
-pregcomp(char *exp, char *xend, PMOP *pm)
+Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm)
{
dTHR;
register regexp *r;
regnode *scan;
- SV **longest;
- SV *longest_fixed;
- SV *longest_float;
regnode *first;
I32 flags;
I32 minlen = 0;
I32 sawplus = 0;
I32 sawopen = 0;
+ scan_data_t data;
if (exp == NULL)
FAIL("NULL regexp argument");
+ if (pm->op_pmdynflags & PMdf_UTF8) {
+ PL_reg_flags |= RF_utf8;
+ }
+ else
+ PL_reg_flags = 0;
+
PL_regprecomp = savepvn(exp, xend - exp);
- DEBUG_r(PerlIO_printf(Perl_debug_log, "compiling RE `%*s'\n",
- xend - exp, PL_regprecomp));
+ DEBUG_r(if (!PL_colorset) reginitcolors());
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%sCompiling REx%s `%s%*s%s'\n",
+ PL_colors[4],PL_colors[5],PL_colors[0],
+ (int)(xend - exp), PL_regprecomp, PL_colors[1]));
PL_regflags = pm->op_pmflags;
PL_regsawback = 0;
@@ -751,38 +1359,17 @@ pregcomp(char *exp, char *xend, PMOP *pm)
PL_regnpar = 1;
PL_regsize = 0L;
PL_regcode = &PL_regdummy;
- regc((U8)MAGIC, (char*)PL_regcode);
+ PL_reg_whilem_seen = 0;
+#if 0 /* REGC() is (currently) a NOP at the first pass.
+ * Clever compilers notice this and complain. --jhi */
+ REGC((U8)REG_MAGIC, (char*)PL_regcode);
+#endif
if (reg(0, &flags) == NULL) {
Safefree(PL_regprecomp);
PL_regprecomp = Nullch;
return(NULL);
}
- DEBUG_r(PerlIO_printf(Perl_debug_log, "size %d ", PL_regsize));
-
- DEBUG_r(
- if (!PL_colorset) {
- int i = 0;
- char *s = PerlEnv_getenv("TERMCAP_COLORS");
-
- PL_colorset = 1;
- if (s) {
- PL_colors[0] = s = savepv(s);
- while (++i < 4) {
- s = strchr(s, '\t');
- if (!s)
- FAIL("Not enough TABs in TERMCAP_COLORS");
- *s = '\0';
- PL_colors[i] = ++s;
- }
- } else {
- while (i < 4)
- PL_colors[i++] = "";
- }
- /* Reset colors: */
- PerlIO_printf(Perl_debug_log, "%s%s%s%s",
- PL_colors[0],PL_colors[1],PL_colors[2],PL_colors[3]);
- }
- );
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "size %"IVdf" ", (IV)PL_regsize));
/* Small enough for pointer-storage convention?
If extralen==0, this means that we will not need long jumps. */
@@ -790,17 +1377,29 @@ pregcomp(char *exp, char *xend, PMOP *pm)
PL_regsize += PL_extralen;
else
PL_extralen = 0;
+ if (PL_reg_whilem_seen > 15)
+ PL_reg_whilem_seen = 15;
/* Allocate space and initialize. */
Newc(1001, r, sizeof(regexp) + (unsigned)PL_regsize * sizeof(regnode),
char, regexp);
if (r == NULL)
FAIL("regexp out of space");
+#ifdef DEBUGGING
+ /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
+ Zero(r, sizeof(regexp) + (unsigned)PL_regsize * sizeof(regnode), char);
+#endif
r->refcnt = 1;
r->prelen = xend - exp;
r->precomp = PL_regprecomp;
- r->subbeg = r->subbase = NULL;
- r->nparens = PL_regnpar - 1; /* set early to validate backrefs */
+ r->subbeg = NULL;
+ r->reganch = pm->op_pmflags & PMf_COMPILETIME;
+ r->nparens = PL_regnpar - 1; /* set early to validate backrefs */
+
+ r->substrs = 0; /* Useful during FAIL. */
+ r->startp = 0; /* Useful during FAIL. */
+ r->endp = 0; /* Useful during FAIL. */
+
PL_regcomp_rx = r;
/* Second pass: emit code. */
@@ -811,35 +1410,42 @@ pregcomp(char *exp, char *xend, PMOP *pm)
PL_regcode = r->program;
/* Store the count of eval-groups for security checks: */
PL_regcode->next_off = ((PL_seen_evals > U16_MAX) ? U16_MAX : PL_seen_evals);
- regc((U8)MAGIC, (char*) PL_regcode++);
+ REGC((U8)REG_MAGIC, (char*) PL_regcode++);
r->data = 0;
if (reg(0, &flags) == NULL)
return(NULL);
/* Dig out information for optimizations. */
- r->reganch = pm->op_pmflags & PMf_COMPILETIME;
+ r->reganch = pm->op_pmflags & PMf_COMPILETIME; /* Again? */
pm->op_pmflags = PL_regflags;
+ if (UTF)
+ r->reganch |= ROPT_UTF8;
r->regstclass = NULL;
- r->naughty = PL_regnaughty >= 10; /* Probably an expensive pattern. */
+ if (PL_regnaughty >= 10) /* Probably an expensive pattern. */
+ r->reganch |= ROPT_NAUGHTY;
scan = r->program + 1; /* First BRANCH. */
/* XXXX To minimize changes to RE engine we always allocate
3-units-long substrs field. */
Newz(1004, r->substrs, 1, struct reg_substr_data);
+ StructCopy(&zero_scan_data, &data, scan_data_t);
+ /* XXXX Should not we check for something else? Usually it is OPEN1... */
if (OP(scan) != BRANCH) { /* Only one top-level choice. */
- scan_data_t data;
I32 fake;
STRLEN longest_float_length, longest_fixed_length;
+ struct regnode_charclass_class ch_class;
+ int stclass_flag;
- StructCopy(&zero_scan_data, &data, scan_data_t);
first = scan;
/* Skip introductions and multiplicators >= 1. */
while ((OP(first) == OPEN && (sawopen = 1)) ||
+ /* An OR of *one* alternative - should not happen now. */
(OP(first) == BRANCH && OP(regnext(first)) != BRANCH) ||
(OP(first) == PLUS) ||
(OP(first) == MINMOD) ||
- (regkind[(U8)OP(first)] == CURLY && ARG1(first) > 0) ) {
+ /* An {n,m} with n>0 */
+ (PL_regkind[(U8)OP(first)] == CURLY && ARG1(first) > 0) ) {
if (OP(first) == PLUS)
sawplus = 1;
else
@@ -849,14 +1455,23 @@ pregcomp(char *exp, char *xend, PMOP *pm)
/* Starting-point info. */
again:
- if (OP(first) == EXACT); /* Empty, get anchored substr later. */
- else if (strchr(simple+2,OP(first)))
+ if (PL_regkind[(U8)OP(first)] == EXACT) {
+ if (OP(first) == EXACT); /* Empty, get anchored substr later. */
+ else if ((OP(first) == EXACTF || OP(first) == EXACTFL)
+ && !UTF)
+ r->regstclass = first;
+ }
+ else if (strchr((char*)PL_simple,OP(first)))
r->regstclass = first;
- else if (regkind[(U8)OP(first)] == BOUND ||
- regkind[(U8)OP(first)] == NBOUND)
+ else if (PL_regkind[(U8)OP(first)] == BOUND ||
+ PL_regkind[(U8)OP(first)] == NBOUND)
r->regstclass = first;
- else if (regkind[(U8)OP(first)] == BOL) {
- r->reganch |= (OP(first) == MBOL ? ROPT_ANCH_MBOL: ROPT_ANCH_BOL);
+ else if (PL_regkind[(U8)OP(first)] == BOL) {
+ r->reganch |= (OP(first) == MBOL
+ ? ROPT_ANCH_MBOL
+ : (OP(first) == SBOL
+ ? ROPT_ANCH_SBOL
+ : ROPT_ANCH_BOL));
first = NEXTOPER(first);
goto again;
}
@@ -866,20 +1481,29 @@ pregcomp(char *exp, char *xend, PMOP *pm)
goto again;
}
else if ((OP(first) == STAR &&
- regkind[(U8)OP(NEXTOPER(first))] == ANY) &&
+ PL_regkind[(U8)OP(NEXTOPER(first))] == REG_ANY) &&
!(r->reganch & ROPT_ANCH) )
{
/* turn .* into ^.* with an implied $*=1 */
- r->reganch |= ROPT_ANCH_BOL | ROPT_IMPLICIT;
+ int type = OP(NEXTOPER(first));
+
+ if (type == REG_ANY || type == ANYUTF8)
+ type = ROPT_ANCH_MBOL;
+ else
+ type = ROPT_ANCH_SBOL;
+
+ r->reganch |= type | ROPT_IMPLICIT;
first = NEXTOPER(first);
goto again;
}
- if (sawplus && (!sawopen || !PL_regsawback))
- r->reganch |= ROPT_SKIP; /* x+ must match 1st of run */
+ if (sawplus && (!sawopen || !PL_regsawback)
+ && !(PL_regseen & REG_SEEN_EVAL)) /* May examine pos and $& */
+ /* x+ must match at the 1st pos of run of x's */
+ r->reganch |= ROPT_SKIP;
/* Scan is after the zeroth branch, first is atomic matcher. */
- DEBUG_r(PerlIO_printf(Perl_debug_log, "first at %d\n",
- first - scan + 1));
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
+ (IV)(first - scan + 1)));
/*
* If there's something expensive in the r.e., find the
* longest literal string that must appear and make it the
@@ -893,14 +1517,20 @@ pregcomp(char *exp, char *xend, PMOP *pm)
*/
minlen = 0;
- data.longest_fixed = newSVpv("",0);
- data.longest_float = newSVpv("",0);
- data.last_found = newSVpv("",0);
+ data.longest_fixed = newSVpvn("",0);
+ data.longest_float = newSVpvn("",0);
+ data.last_found = newSVpvn("",0);
data.longest = &(data.longest_fixed);
first = scan;
-
+ if (!r->regstclass) {
+ cl_init(&ch_class);
+ data.start_class = &ch_class;
+ stclass_flag = SCF_DO_STCLASS_AND;
+ } else /* XXXX Check for BOUND? */
+ stclass_flag = 0;
+
minlen = study_chunk(&first, &fake, scan + PL_regsize, /* Up to end */
- &data, SCF_DO_SUBSTR);
+ &data, SCF_DO_SUBSTR | stclass_flag);
if ( PL_regnpar == 1 && data.longest == &(data.longest_fixed)
&& data.last_start_min == 0 && data.last_end > 0
&& !PL_seen_zerolen
@@ -909,50 +1539,74 @@ pregcomp(char *exp, char *xend, PMOP *pm)
scan_commit(&data);
SvREFCNT_dec(data.last_found);
- longest_float_length = SvCUR(data.longest_float);
+ longest_float_length = CHR_SVLEN(data.longest_float);
if (longest_float_length
|| (data.flags & SF_FL_BEFORE_EOL
&& (!(data.flags & SF_FL_BEFORE_MEOL)
|| (PL_regflags & PMf_MULTILINE)))) {
- if (SvCUR(data.longest_fixed)
+ int t;
+
+ if (SvCUR(data.longest_fixed) /* ok to leave SvCUR */
&& data.offset_fixed == data.offset_float_min
&& SvCUR(data.longest_fixed) == SvCUR(data.longest_float))
- goto remove_float; /* Like in (a)+. */
-
+ goto remove_float; /* As in (a)+. */
+
r->float_substr = data.longest_float;
r->float_min_offset = data.offset_float_min;
r->float_max_offset = data.offset_float_max;
- fbm_compile(r->float_substr, 0);
- BmUSEFUL(r->float_substr) = 100;
- if (data.flags & SF_FL_BEFORE_EOL /* Cannot have SEOL and MULTI */
- && (!(data.flags & SF_FL_BEFORE_MEOL)
- || (PL_regflags & PMf_MULTILINE)))
- SvTAIL_on(r->float_substr);
- } else {
+ t = (data.flags & SF_FL_BEFORE_EOL /* Can't have SEOL and MULTI */
+ && (!(data.flags & SF_FL_BEFORE_MEOL)
+ || (PL_regflags & PMf_MULTILINE)));
+ fbm_compile(r->float_substr, t ? FBMcf_TAIL : 0);
+ }
+ else {
remove_float:
r->float_substr = Nullsv;
SvREFCNT_dec(data.longest_float);
longest_float_length = 0;
}
- longest_fixed_length = SvCUR(data.longest_fixed);
+ longest_fixed_length = CHR_SVLEN(data.longest_fixed);
if (longest_fixed_length
|| (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
&& (!(data.flags & SF_FIX_BEFORE_MEOL)
|| (PL_regflags & PMf_MULTILINE)))) {
+ int t;
+
r->anchored_substr = data.longest_fixed;
r->anchored_offset = data.offset_fixed;
- fbm_compile(r->anchored_substr, 0);
- BmUSEFUL(r->anchored_substr) = 100;
- if (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
- && (!(data.flags & SF_FIX_BEFORE_MEOL)
- || (PL_regflags & PMf_MULTILINE)))
- SvTAIL_on(r->anchored_substr);
- } else {
+ t = (data.flags & SF_FIX_BEFORE_EOL /* Can't have SEOL and MULTI */
+ && (!(data.flags & SF_FIX_BEFORE_MEOL)
+ || (PL_regflags & PMf_MULTILINE)));
+ fbm_compile(r->anchored_substr, t ? FBMcf_TAIL : 0);
+ }
+ else {
r->anchored_substr = Nullsv;
SvREFCNT_dec(data.longest_fixed);
longest_fixed_length = 0;
}
+ if (r->regstclass
+ && (OP(r->regstclass) == REG_ANY || OP(r->regstclass) == ANYUTF8
+ || OP(r->regstclass) == SANYUTF8 || OP(r->regstclass) == SANY))
+ r->regstclass = NULL;
+ if ((!r->anchored_substr || r->anchored_offset) && stclass_flag
+ && !(data.start_class->flags & ANYOF_EOS)
+ && !cl_is_anything(data.start_class)) {
+ SV *sv;
+ I32 n = add_data(1, "f");
+
+ New(1006, PL_regcomp_rx->data->data[n], 1,
+ struct regnode_charclass_class);
+ StructCopy(data.start_class,
+ (struct regnode_charclass_class*)PL_regcomp_rx->data->data[n],
+ struct regnode_charclass_class);
+ r->regstclass = (regnode*)PL_regcomp_rx->data->data[n];
+ r->reganch &= ~ROPT_SKIP; /* Used in find_byclass(). */
+ DEBUG_r((sv = sv_newmortal(),
+ regprop(sv, (regnode*)data.start_class),
+ PerlIO_printf(Perl_debug_log, "synthetic stclass `%s'.\n",
+ SvPVX(sv))));
+ }
/* A temporary algorithm prefers floated substr to fixed one to dig more info. */
if (longest_fixed_length > longest_float_length) {
@@ -960,19 +1614,48 @@ pregcomp(char *exp, char *xend, PMOP *pm)
r->check_offset_min = r->check_offset_max = r->anchored_offset;
if (r->reganch & ROPT_ANCH_SINGLE)
r->reganch |= ROPT_NOSCAN;
- } else {
+ }
+ else {
r->check_substr = r->float_substr;
r->check_offset_min = data.offset_float_min;
r->check_offset_max = data.offset_float_max;
}
- } else {
+ /* XXXX Currently intuiting is not compatible with ANCH_GPOS.
+ This should be changed ASAP! */
+ if (r->check_substr && !(r->reganch & ROPT_ANCH_GPOS)) {
+ r->reganch |= RE_USE_INTUIT;
+ if (SvTAIL(r->check_substr))
+ r->reganch |= RE_INTUIT_TAIL;
+ }
+ }
+ else {
/* Several toplevels. Best we can is to set minlen. */
I32 fake;
+ struct regnode_charclass_class ch_class;
DEBUG_r(PerlIO_printf(Perl_debug_log, "\n"));
scan = r->program + 1;
- minlen = study_chunk(&scan, &fake, scan + PL_regsize, NULL, 0);
+ cl_init(&ch_class);
+ data.start_class = &ch_class;
+ minlen = study_chunk(&scan, &fake, scan + PL_regsize, &data, SCF_DO_STCLASS_AND);
r->check_substr = r->anchored_substr = r->float_substr = Nullsv;
+ if (!(data.start_class->flags & ANYOF_EOS)
+ && !cl_is_anything(data.start_class)) {
+ SV *sv;
+ I32 n = add_data(1, "f");
+
+ New(1006, PL_regcomp_rx->data->data[n], 1,
+ struct regnode_charclass_class);
+ StructCopy(data.start_class,
+ (struct regnode_charclass_class*)PL_regcomp_rx->data->data[n],
+ struct regnode_charclass_class);
+ r->regstclass = (regnode*)PL_regcomp_rx->data->data[n];
+ r->reganch &= ~ROPT_SKIP; /* Used in find_byclass(). */
+ DEBUG_r((sv = sv_newmortal(),
+ regprop(sv, (regnode*)data.start_class),
+ PerlIO_printf(Perl_debug_log, "synthetic stclass `%s'.\n",
+ SvPVX(sv))));
+ }
}
r->minlen = minlen;
@@ -982,8 +1665,8 @@ pregcomp(char *exp, char *xend, PMOP *pm)
r->reganch |= ROPT_LOOKBEHIND_SEEN;
if (PL_regseen & REG_SEEN_EVAL)
r->reganch |= ROPT_EVAL_SEEN;
- Newz(1002, r->startp, PL_regnpar, char*);
- Newz(1002, r->endp, PL_regnpar, char*);
+ Newz(1002, r->startp, PL_regnpar, I32);
+ Newz(1002, r->endp, PL_regnpar, I32);
DEBUG_r(regdump(r));
return(r);
}
@@ -998,7 +1681,7 @@ pregcomp(char *exp, char *xend, PMOP *pm)
* follows makes it hard to avoid.
*/
STATIC regnode *
-reg(I32 paren, I32 *flagp)
+S_reg(pTHX_ I32 paren, I32 *flagp)
/* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
{
dTHR;
@@ -1017,6 +1700,7 @@ reg(I32 paren, I32 *flagp)
if (*PL_regcomp_parse == '?') {
U16 posflags = 0, negflags = 0;
U16 *flagsp = &posflags;
+ int logical = 0;
PL_regcomp_parse++;
paren = *PL_regcomp_parse++;
@@ -1047,6 +1731,15 @@ reg(I32 paren, I32 *flagp)
nextchar();
*flagp = TRYAGAIN;
return NULL;
+ case 'p':
+ if (SIZE_ONLY)
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "(?p{}) is deprecated - use (??{})");
+ /* FALL THROUGH*/
+ case '?':
+ logical = 1;
+ paren = *PL_regcomp_parse++;
+ /* FALL THROUGH */
case '{':
{
dTHR;
@@ -1073,19 +1766,21 @@ reg(I32 paren, I32 *flagp)
AV *av;
if (PL_regcomp_parse - 1 - s)
- sv = newSVpv(s, PL_regcomp_parse - 1 - s);
+ sv = newSVpvn(s, PL_regcomp_parse - 1 - s);
else
- sv = newSVpv("", 0);
+ sv = newSVpvn("", 0);
rop = sv_compile_2op(sv, &sop, "re", &av);
- n = add_data(3, "nso");
+ n = add_data(3, "nop");
PL_regcomp_rx->data->data[n] = (void*)rop;
- PL_regcomp_rx->data->data[n+1] = (void*)av;
- PL_regcomp_rx->data->data[n+2] = (void*)sop;
+ PL_regcomp_rx->data->data[n+1] = (void*)sop;
+ PL_regcomp_rx->data->data[n+2] = (void*)av;
SvREFCNT_dec(sv);
- } else { /* First pass */
- if (PL_reginterp_cnt < ++PL_seen_evals && PL_curcop != &PL_compiling)
+ }
+ else { /* First pass */
+ if (PL_reginterp_cnt < ++PL_seen_evals
+ && PL_curcop != &PL_compiling)
/* No compiled RE interpolated, has runtime
components ===> unsafe. */
FAIL("Eval-group not allowed at runtime, use re 'eval'");
@@ -1094,6 +1789,13 @@ reg(I32 paren, I32 *flagp)
}
nextchar();
+ if (logical) {
+ ret = reg_node(LOGICAL);
+ if (!SIZE_ONLY)
+ ret->flags = 2;
+ regtail(ret, reganode(EVAL, n));
+ return ret;
+ }
return reganode(EVAL, n);
}
case '(':
@@ -1105,10 +1807,13 @@ reg(I32 paren, I32 *flagp)
I32 flag;
ret = reg_node(LOGICAL);
+ if (!SIZE_ONLY)
+ ret->flags = 1;
regtail(ret, reg(1, &flag));
goto insert_if;
}
- } else if (PL_regcomp_parse[0] >= '1' && PL_regcomp_parse[0] <= '9' ) {
+ }
+ else if (PL_regcomp_parse[0] >= '1' && PL_regcomp_parse[0] <= '9' ) {
parno = atoi(PL_regcomp_parse++);
while (isDIGIT(*PL_regcomp_parse))
@@ -1130,10 +1835,11 @@ reg(I32 paren, I32 *flagp)
lastbr = reganode(IFTHEN, 0); /* Fake one for optimizer. */
regbranch(&flags, 1);
regtail(ret, lastbr);
- if (flags&HASWIDTH)
+ if (flags&HASWIDTH)
*flagp |= HASWIDTH;
c = *nextchar();
- } else
+ }
+ else
lastbr = NULL;
if (c != ')')
FAIL("Switch (?(condition)... contains too many branches");
@@ -1142,10 +1848,12 @@ reg(I32 paren, I32 *flagp)
if (lastbr) {
regtail(lastbr, ender);
regtail(NEXTOPER(NEXTOPER(lastbr)), ender);
- } else
+ }
+ else
regtail(ret, ender);
return ret;
- } else {
+ }
+ else {
FAIL2("Unknown condition for (?(%.2s", PL_regcomp_parse);
}
}
@@ -1186,7 +1894,8 @@ reg(I32 paren, I32 *flagp)
ret = reganode(OPEN, parno);
open = 1;
}
- } else
+ }
+ else
ret = NULL;
/* Pick up the branches, linking them together. */
@@ -1196,17 +1905,20 @@ reg(I32 paren, I32 *flagp)
if (*PL_regcomp_parse == '|') {
if (!SIZE_ONLY && PL_extralen) {
reginsert(BRANCHJ, br);
- } else
+ }
+ else
reginsert(BRANCH, br);
have_branch = 1;
if (SIZE_ONLY)
PL_extralen += 1; /* For BRANCHJ-BRANCH. */
- } else if (paren == ':') {
+ }
+ else if (paren == ':') {
*flagp |= flags&SIMPLE;
}
if (open) { /* Starts with OPEN. */
regtail(ret, br); /* OPEN -> first. */
- } else if (paren != '?') /* Not Conditional */
+ }
+ else if (paren != '?') /* Not Conditional */
ret = br;
if (flags&HASWIDTH)
*flagp |= HASWIDTH;
@@ -1279,18 +1991,20 @@ reg(I32 paren, I32 *flagp)
}
/* Check for proper termination. */
- if (paren && (PL_regcomp_parse >= PL_regxend || *nextchar() != ')')) {
- FAIL("unmatched () in regexp");
- } else if (!paren && PL_regcomp_parse < PL_regxend) {
+ if (paren) {
+ PL_regflags = oregflags;
+ if (PL_regcomp_parse >= PL_regxend || *nextchar() != ')') {
+ FAIL("unmatched () in regexp");
+ }
+ }
+ else if (!paren && PL_regcomp_parse < PL_regxend) {
if (*PL_regcomp_parse == ')') {
FAIL("unmatched () in regexp");
- } else
+ }
+ else
FAIL("junk on end of regexp"); /* "Can't happen". */
/* NOTREACHED */
}
- if (paren != 0) {
- PL_regflags = oregflags;
- }
return(ret);
}
@@ -1301,7 +2015,7 @@ reg(I32 paren, I32 *flagp)
* Implements the concatenation operator.
*/
STATIC regnode *
-regbranch(I32 *flagp, I32 first)
+S_regbranch(pTHX_ I32 *flagp, I32 first)
{
dTHR;
register regnode *ret;
@@ -1332,7 +2046,8 @@ regbranch(I32 *flagp, I32 first)
if (flags & TRYAGAIN)
continue;
return(NULL);
- } else if (ret == NULL)
+ }
+ else if (ret == NULL)
ret = latest;
*flagp |= flags&HASWIDTH;
if (chain == NULL) /* First piece. */
@@ -1366,7 +2081,7 @@ regbranch(I32 *flagp, I32 first)
* endmarker role is not redundant.
*/
STATIC regnode *
-regpiece(I32 *flagp)
+S_regpiece(pTHX_ I32 *flagp)
{
dTHR;
register regnode *ret;
@@ -1422,8 +2137,10 @@ regpiece(I32 *flagp)
reginsert(CURLY, ret);
}
else {
- PL_regnaughty += 4 + PL_regnaughty; /* compound interest */
- regtail(ret, reg_node(WHILEM));
+ regnode *w = reg_node(WHILEM);
+
+ w->flags = 0;
+ regtail(ret, w);
if (!SIZE_ONLY && PL_extralen) {
reginsert(LONGJMP,ret);
reginsert(NOTHING,ret);
@@ -1434,7 +2151,8 @@ regpiece(I32 *flagp)
NEXT_OFF(ret) = 3; /* Go over NOTHING to LONGJMP. */
regtail(ret, reg_node(NOTHING));
if (SIZE_ONLY)
- PL_extralen += 3;
+ PL_reg_whilem_seen++, PL_extralen += 3;
+ PL_regnaughty += 4 + PL_regnaughty; /* compound interest */
}
ret->flags = 0;
@@ -1475,7 +2193,8 @@ regpiece(I32 *flagp)
else if (op == '*') {
min = 0;
goto do_curly;
- } else if (op == '+' && (flags&SIMPLE)) {
+ }
+ else if (op == '+' && (flags&SIMPLE)) {
reginsert(PLUS, ret);
ret->flags = 0;
PL_regnaughty += 3;
@@ -1483,13 +2202,14 @@ regpiece(I32 *flagp)
else if (op == '+') {
min = 1;
goto do_curly;
- } else if (op == '?') {
+ }
+ else if (op == '?') {
min = 0; max = 1;
goto do_curly;
}
nest_check:
- if (PL_dowarn && !SIZE_ONLY && !(flags&HASWIDTH) && max > 10000) {
- warn("%.*s matches null string many times",
+ if (ckWARN(WARN_REGEXP) && !SIZE_ONLY && !(flags&HASWIDTH) && max > REG_INFTY/3) {
+ Perl_warner(aTHX_ WARN_REGEXP, "%.*s matches null string many times",
PL_regcomp_parse - origparse, origparse);
}
@@ -1515,7 +2235,7 @@ regpiece(I32 *flagp)
* [Yes, it is worth fixing, some scripts can run twice the speed.]
*/
STATIC regnode *
-regatom(I32 *flagp)
+S_regatom(pTHX_ I32 *flagp)
{
dTHR;
register regnode *ret = 0;
@@ -1548,16 +2268,28 @@ tryagain:
break;
case '.':
nextchar();
- if (PL_regflags & PMf_SINGLELINE)
- ret = reg_node(SANY);
- else
- ret = reg_node(ANY);
+ if (UTF) {
+ if (PL_regflags & PMf_SINGLELINE)
+ ret = reg_node(SANYUTF8);
+ else
+ ret = reg_node(ANYUTF8);
+ *flagp |= HASWIDTH;
+ }
+ else {
+ if (PL_regflags & PMf_SINGLELINE)
+ ret = reg_node(SANY);
+ else
+ ret = reg_node(REG_ANY);
+ *flagp |= HASWIDTH|SIMPLE;
+ }
PL_regnaughty++;
- *flagp |= HASWIDTH|SIMPLE;
break;
case '[':
PL_regcomp_parse++;
- ret = regclass();
+ ret = (UTF ? regclassutf8() : regclass());
+ if (*PL_regcomp_parse != ']')
+ FAIL("unmatched [] in regexp");
+ nextchar();
*flagp |= HASWIDTH|SIMPLE;
break;
case '(':
@@ -1615,47 +2347,118 @@ tryagain:
PL_seen_zerolen++; /* Do not optimize RE away */
nextchar();
break;
+ case 'C':
+ ret = reg_node(SANY);
+ *flagp |= HASWIDTH|SIMPLE;
+ nextchar();
+ break;
+ case 'X':
+ ret = reg_node(CLUMP);
+ *flagp |= HASWIDTH;
+ nextchar();
+ if (UTF && !PL_utf8_mark)
+ is_utf8_mark((U8*)"~"); /* preload table */
+ break;
case 'w':
- ret = reg_node((PL_regflags & PMf_LOCALE) ? ALNUML : ALNUM);
+ ret = reg_node(
+ UTF
+ ? (LOC ? ALNUMLUTF8 : ALNUMUTF8)
+ : (LOC ? ALNUML : ALNUM));
*flagp |= HASWIDTH|SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_alnum)
+ is_utf8_alnum((U8*)"a"); /* preload table */
break;
case 'W':
- ret = reg_node((PL_regflags & PMf_LOCALE) ? NALNUML : NALNUM);
+ ret = reg_node(
+ UTF
+ ? (LOC ? NALNUMLUTF8 : NALNUMUTF8)
+ : (LOC ? NALNUML : NALNUM));
*flagp |= HASWIDTH|SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_alnum)
+ is_utf8_alnum((U8*)"a"); /* preload table */
break;
case 'b':
PL_seen_zerolen++;
- ret = reg_node((PL_regflags & PMf_LOCALE) ? BOUNDL : BOUND);
+ PL_regseen |= REG_SEEN_LOOKBEHIND;
+ ret = reg_node(
+ UTF
+ ? (LOC ? BOUNDLUTF8 : BOUNDUTF8)
+ : (LOC ? BOUNDL : BOUND));
*flagp |= SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_alnum)
+ is_utf8_alnum((U8*)"a"); /* preload table */
break;
case 'B':
PL_seen_zerolen++;
- ret = reg_node((PL_regflags & PMf_LOCALE) ? NBOUNDL : NBOUND);
+ PL_regseen |= REG_SEEN_LOOKBEHIND;
+ ret = reg_node(
+ UTF
+ ? (LOC ? NBOUNDLUTF8 : NBOUNDUTF8)
+ : (LOC ? NBOUNDL : NBOUND));
*flagp |= SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_alnum)
+ is_utf8_alnum((U8*)"a"); /* preload table */
break;
case 's':
- ret = reg_node((PL_regflags & PMf_LOCALE) ? SPACEL : SPACE);
+ ret = reg_node(
+ UTF
+ ? (LOC ? SPACELUTF8 : SPACEUTF8)
+ : (LOC ? SPACEL : SPACE));
*flagp |= HASWIDTH|SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_space)
+ is_utf8_space((U8*)" "); /* preload table */
break;
case 'S':
- ret = reg_node((PL_regflags & PMf_LOCALE) ? NSPACEL : NSPACE);
+ ret = reg_node(
+ UTF
+ ? (LOC ? NSPACELUTF8 : NSPACEUTF8)
+ : (LOC ? NSPACEL : NSPACE));
*flagp |= HASWIDTH|SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_space)
+ is_utf8_space((U8*)" "); /* preload table */
break;
case 'd':
- ret = reg_node(DIGIT);
+ ret = reg_node(UTF ? DIGITUTF8 : DIGIT);
*flagp |= HASWIDTH|SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_digit)
+ is_utf8_digit((U8*)"1"); /* preload table */
break;
case 'D':
- ret = reg_node(NDIGIT);
+ ret = reg_node(UTF ? NDIGITUTF8 : NDIGIT);
*flagp |= HASWIDTH|SIMPLE;
nextchar();
+ if (UTF && !PL_utf8_digit)
+ is_utf8_digit((U8*)"1"); /* preload table */
+ break;
+ case 'p':
+ case 'P':
+ { /* a lovely hack--pretend we saw [\pX] instead */
+ char* oldregxend = PL_regxend;
+
+ if (PL_regcomp_parse[1] == '{') {
+ PL_regxend = strchr(PL_regcomp_parse, '}');
+ if (!PL_regxend)
+ FAIL("Missing right brace on \\p{}");
+ PL_regxend++;
+ }
+ else
+ PL_regxend = PL_regcomp_parse + 2;
+ PL_regcomp_parse--;
+
+ ret = regclassutf8();
+
+ PL_regxend = oldregxend;
+ PL_regcomp_parse--;
+ nextchar();
+ *flagp |= HASWIDTH|SIMPLE;
+ }
break;
case 'n':
case 'r':
@@ -1678,8 +2481,8 @@ tryagain:
if (!SIZE_ONLY && num > PL_regcomp_rx->nparens)
FAIL("reference to nonexistent group");
PL_regsawback = 1;
- ret = reganode((PL_regflags & PMf_FOLD)
- ? ((PL_regflags & PMf_LOCALE) ? REFFL : REFF)
+ ret = reganode(FOLD
+ ? (LOC ? REFFL : REFF)
: REF, num);
*flagp |= HASWIDTH;
while (isDIGIT(*PL_regcomp_parse))
@@ -1694,6 +2497,8 @@ tryagain:
FAIL("trailing \\ in regexp");
/* FALL THROUGH */
default:
+ /* Do not generate `unrecognized' warnings here, we fall
+ back into the quick-grab loop below */
goto defchar;
}
break;
@@ -1708,7 +2513,7 @@ tryagain:
default: {
register I32 len;
- register U8 ender;
+ register UV ender;
register char *p;
char *oldp, *s;
I32 numlen;
@@ -1716,11 +2521,10 @@ tryagain:
PL_regcomp_parse++;
defchar:
- ret = reg_node((PL_regflags & PMf_FOLD)
- ? ((PL_regflags & PMf_LOCALE) ? EXACTFL : EXACTF)
+ ret = reg_node(FOLD
+ ? (LOC ? EXACTFL : EXACTF)
: EXACT);
- s = (char *) OPERAND(ret);
- regc(0, s++); /* save spot for len */
+ s = STRING(ret);
for (len = 0, p = PL_regcomp_parse - 1;
len < 127 && p < PL_regxend;
len++)
@@ -1752,6 +2556,8 @@ tryagain:
case 'S':
case 'd':
case 'D':
+ case 'p':
+ case 'P':
--p;
goto loopdone;
case 'n':
@@ -1771,16 +2577,42 @@ tryagain:
p++;
break;
case 'e':
- ender = '\033';
+#ifdef ASCIIish
+ ender = '\033';
+#else
+ ender = '\047';
+#endif
p++;
break;
case 'a':
- ender = '\007';
+#ifdef ASCIIish
+ ender = '\007';
+#else
+ ender = '\057';
+#endif
p++;
break;
case 'x':
- ender = scan_hex(++p, 2, &numlen);
- p += numlen;
+ if (*++p == '{') {
+ char* e = strchr(p, '}');
+
+ if (!e)
+ FAIL("Missing right brace on \\x{}");
+ else if (UTF) {
+ ender = (UV)scan_hex(p + 1, e - p, &numlen);
+ if (numlen + len >= 127) { /* numlen is generous */
+ p--;
+ goto loopdone;
+ }
+ p = e + 1;
+ }
+ else
+ FAIL("Can't use \\x{} without 'use utf8' declaration");
+ }
+ else {
+ ender = (UV)scan_hex(p, 2, &numlen);
+ p += numlen;
+ }
break;
case 'c':
p++;
@@ -1791,7 +2623,7 @@ tryagain:
case '5': case '6': case '7': case '8':case '9':
if (*p == '0' ||
(isDIGIT(p[1]) && atoi(p) >= PL_regnpar) ) {
- ender = scan_oct(p, 3, &numlen);
+ ender = (UV)scan_oct(p, 3, &numlen);
p += numlen;
}
else {
@@ -1804,26 +2636,53 @@ tryagain:
FAIL("trailing \\ in regexp");
/* FALL THROUGH */
default:
- ender = *p++;
- break;
+ if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(*p))
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "/%.127s/: Unrecognized escape \\%c passed through",
+ PL_regprecomp,
+ *p);
+ goto normal_default;
}
break;
default:
- ender = *p++;
+ normal_default:
+ if ((*p & 0xc0) == 0xc0 && UTF) {
+ ender = utf8_to_uv((U8*)p, &numlen);
+ p += numlen;
+ }
+ else
+ ender = *p++;
break;
}
if (PL_regflags & PMf_EXTENDED)
p = regwhite(p, PL_regxend);
+ if (UTF && FOLD) {
+ if (LOC)
+ ender = toLOWER_LC_uni(ender);
+ else
+ ender = toLOWER_uni(ender);
+ }
if (ISMULT2(p)) { /* Back off on ?+*. */
if (len)
p = oldp;
+ else if (ender >= 0x80 && UTF) {
+ reguni(ender, s, &numlen);
+ s += numlen;
+ len += numlen;
+ }
else {
len++;
- regc(ender, s++);
+ REGC(ender, s++);
}
break;
}
- regc(ender, s++);
+ if (ender >= 0x80 && UTF) {
+ reguni(ender, s, &numlen);
+ s += numlen;
+ len += numlen - 1;
+ }
+ else
+ REGC(ender, s++);
}
loopdone:
PL_regcomp_parse = p - 1;
@@ -1835,13 +2694,11 @@ tryagain:
if (len == 1)
*flagp |= SIMPLE;
if (!SIZE_ONLY)
- *OPERAND(ret) = len;
- regc('\0', s++);
- if (SIZE_ONLY) {
- PL_regsize += (len + 2 + sizeof(regnode) - 1) / sizeof(regnode);
- } else {
- PL_regcode += (len + 2 + sizeof(regnode) - 1) / sizeof(regnode);
- }
+ STR_LEN(ret) = len;
+ if (SIZE_ONLY)
+ PL_regsize += STR_SZ(len);
+ else
+ PL_regcode += STR_SZ(len);
}
break;
}
@@ -1850,7 +2707,7 @@ tryagain:
}
STATIC char *
-regwhite(char *p, char *e)
+S_regwhite(pTHX_ char *p, char *e)
{
while (p < e) {
if (isSPACE(*p))
@@ -1866,229 +2723,849 @@ regwhite(char *p, char *e)
return p;
}
+/* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
+ Character classes ([:foo:]) can also be negated ([:^foo:]).
+ Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
+ Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
+ but trigger warnings because they are currently unimplemented. */
+STATIC I32
+S_regpposixcc(pTHX_ I32 value)
+{
+ dTHR;
+ char *posixcc = 0;
+ I32 namedclass = OOB_NAMEDCLASS;
+
+ if (value == '[' && PL_regcomp_parse + 1 < PL_regxend &&
+ /* I smell either [: or [= or [. -- POSIX has been here, right? */
+ (*PL_regcomp_parse == ':' ||
+ *PL_regcomp_parse == '=' ||
+ *PL_regcomp_parse == '.')) {
+ char c = *PL_regcomp_parse;
+ char* s = PL_regcomp_parse++;
+
+ while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != c)
+ PL_regcomp_parse++;
+ if (PL_regcomp_parse == PL_regxend)
+ /* Grandfather lone [:, [=, [. */
+ PL_regcomp_parse = s;
+ else {
+ char* t = PL_regcomp_parse++; /* skip over the c */
+
+ if (*PL_regcomp_parse == ']') {
+ PL_regcomp_parse++; /* skip over the ending ] */
+ posixcc = s + 1;
+ if (*s == ':') {
+ I32 complement = *posixcc == '^' ? *posixcc++ : 0;
+ I32 skip = 5; /* the most common skip */
+
+ switch (*posixcc) {
+ case 'a':
+ if (strnEQ(posixcc, "alnum", 5))
+ namedclass =
+ complement ? ANYOF_NALNUMC : ANYOF_ALNUMC;
+ else if (strnEQ(posixcc, "alpha", 5))
+ namedclass =
+ complement ? ANYOF_NALPHA : ANYOF_ALPHA;
+ else if (strnEQ(posixcc, "ascii", 5))
+ namedclass =
+ complement ? ANYOF_NASCII : ANYOF_ASCII;
+ break;
+ case 'c':
+ if (strnEQ(posixcc, "cntrl", 5))
+ namedclass =
+ complement ? ANYOF_NCNTRL : ANYOF_CNTRL;
+ break;
+ case 'd':
+ if (strnEQ(posixcc, "digit", 5))
+ namedclass =
+ complement ? ANYOF_NDIGIT : ANYOF_DIGIT;
+ break;
+ case 'g':
+ if (strnEQ(posixcc, "graph", 5))
+ namedclass =
+ complement ? ANYOF_NGRAPH : ANYOF_GRAPH;
+ break;
+ case 'l':
+ if (strnEQ(posixcc, "lower", 5))
+ namedclass =
+ complement ? ANYOF_NLOWER : ANYOF_LOWER;
+ break;
+ case 'p':
+ if (strnEQ(posixcc, "print", 5))
+ namedclass =
+ complement ? ANYOF_NPRINT : ANYOF_PRINT;
+ else if (strnEQ(posixcc, "punct", 5))
+ namedclass =
+ complement ? ANYOF_NPUNCT : ANYOF_PUNCT;
+ break;
+ case 's':
+ if (strnEQ(posixcc, "space", 5))
+ namedclass =
+ complement ? ANYOF_NSPACE : ANYOF_SPACE;
+ case 'u':
+ if (strnEQ(posixcc, "upper", 5))
+ namedclass =
+ complement ? ANYOF_NUPPER : ANYOF_UPPER;
+ break;
+ case 'w': /* this is not POSIX, this is the Perl \w */
+ if (strnEQ(posixcc, "word", 4)) {
+ namedclass =
+ complement ? ANYOF_NALNUM : ANYOF_ALNUM;
+ skip = 4;
+ }
+ break;
+ case 'x':
+ if (strnEQ(posixcc, "xdigit", 6)) {
+ namedclass =
+ complement ? ANYOF_NXDIGIT : ANYOF_XDIGIT;
+ skip = 6;
+ }
+ break;
+ }
+ if (namedclass == OOB_NAMEDCLASS ||
+ posixcc[skip] != ':' ||
+ posixcc[skip+1] != ']')
+ Perl_croak(aTHX_
+ "Character class [:%.*s:] unknown",
+ t - s - 1, s + 1);
+ } else if (ckWARN(WARN_REGEXP) && !SIZE_ONLY)
+ /* [[=foo=]] and [[.foo.]] are still future. */
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "Character class syntax [%c %c] is reserved for future extensions", c, c);
+ } else {
+ /* Maternal grandfather:
+ * "[:" ending in ":" but not in ":]" */
+ PL_regcomp_parse = s;
+ }
+ }
+ }
+
+ return namedclass;
+}
+
+STATIC void
+S_checkposixcc(pTHX)
+{
+ if (!SIZE_ONLY && ckWARN(WARN_REGEXP) &&
+ (*PL_regcomp_parse == ':' ||
+ *PL_regcomp_parse == '=' ||
+ *PL_regcomp_parse == '.')) {
+ char *s = PL_regcomp_parse;
+ char c = *s++;
+
+ while(*s && isALNUM(*s))
+ s++;
+ if (*s && c == *s && s[1] == ']') {
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "Character class syntax [%c %c] belongs inside character classes", c, c);
+ if (c == '=' || c == '.')
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "Character class syntax [%c %c] is reserved for future extensions", c, c);
+ }
+ }
+}
+
STATIC regnode *
-regclass(void)
+S_regclass(pTHX)
{
dTHR;
- register char *opnd, *s;
- register I32 Class;
- register I32 lastclass = 1234;
+ register U32 value;
+ register I32 lastvalue = OOB_CHAR8;
register I32 range = 0;
register regnode *ret;
- register I32 def;
I32 numlen;
+ I32 namedclass;
+ char *rangebegin;
+ bool need_class = 0;
- s = opnd = (char *) OPERAND(PL_regcode);
ret = reg_node(ANYOF);
- for (Class = 0; Class < 33; Class++)
- regc(0, s++);
+ if (SIZE_ONLY)
+ PL_regsize += ANYOF_SKIP;
+ else {
+ ret->flags = 0;
+ ANYOF_BITMAP_ZERO(ret);
+ PL_regcode += ANYOF_SKIP;
+ if (FOLD)
+ ANYOF_FLAGS(ret) |= ANYOF_FOLD;
+ if (LOC)
+ ANYOF_FLAGS(ret) |= ANYOF_LOCALE;
+ }
if (*PL_regcomp_parse == '^') { /* Complement of range. */
PL_regnaughty++;
PL_regcomp_parse++;
if (!SIZE_ONLY)
- *opnd |= ANYOF_INVERT;
- }
- if (!SIZE_ONLY) {
- PL_regcode += ANY_SKIP;
- if (PL_regflags & PMf_FOLD)
- *opnd |= ANYOF_FOLD;
- if (PL_regflags & PMf_LOCALE)
- *opnd |= ANYOF_LOCALE;
- } else {
- PL_regsize += ANY_SKIP;
+ ANYOF_FLAGS(ret) |= ANYOF_INVERT;
}
+
+ if (!SIZE_ONLY && ckWARN(WARN_REGEXP))
+ checkposixcc();
+
if (*PL_regcomp_parse == ']' || *PL_regcomp_parse == '-')
goto skipcond; /* allow 1st char to be ] or - */
while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != ']') {
skipcond:
- Class = UCHARAT(PL_regcomp_parse++);
- if (Class == '[' && PL_regcomp_parse + 1 < PL_regxend &&
- /* I smell either [: or [= or [. -- POSIX has been here, right? */
- (*PL_regcomp_parse == ':' || *PL_regcomp_parse == '=' || *PL_regcomp_parse == '.')) {
- char posixccc = *PL_regcomp_parse;
- char* posixccs = PL_regcomp_parse++;
-
- while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != posixccc)
- PL_regcomp_parse++;
- if (PL_regcomp_parse == PL_regxend)
- /* Grandfather lone [:, [=, [. */
- PL_regcomp_parse = posixccs;
- else {
- PL_regcomp_parse++; /* skip over the posixccc */
- if (*PL_regcomp_parse == ']') {
- /* Not Implemented Yet.
- * (POSIX Extended Character Classes, that is)
- * The text between e.g. [: and :] would start
- * at posixccs + 1 and stop at regcomp_parse - 2. */
- if (PL_dowarn && !SIZE_ONLY)
- warn("Character class syntax [%c %c] is reserved for future extensions", posixccc, posixccc);
- PL_regcomp_parse++; /* skip over the ending ] */
- }
+ namedclass = OOB_NAMEDCLASS;
+ if (!range)
+ rangebegin = PL_regcomp_parse;
+ value = UCHARAT(PL_regcomp_parse++);
+ if (value == '[')
+ namedclass = regpposixcc(value);
+ else if (value == '\\') {
+ value = UCHARAT(PL_regcomp_parse++);
+ /* Some compilers cannot handle switching on 64-bit integer
+ * values, therefore value cannot be an UV. --jhi */
+ switch (value) {
+ case 'w': namedclass = ANYOF_ALNUM; break;
+ case 'W': namedclass = ANYOF_NALNUM; break;
+ case 's': namedclass = ANYOF_SPACE; break;
+ case 'S': namedclass = ANYOF_NSPACE; break;
+ case 'd': namedclass = ANYOF_DIGIT; break;
+ case 'D': namedclass = ANYOF_NDIGIT; break;
+ case 'n': value = '\n'; break;
+ case 'r': value = '\r'; break;
+ case 't': value = '\t'; break;
+ case 'f': value = '\f'; break;
+ case 'b': value = '\b'; break;
+#ifdef ASCIIish
+ case 'e': value = '\033'; break;
+ case 'a': value = '\007'; break;
+#else
+ case 'e': value = '\047'; break;
+ case 'a': value = '\057'; break;
+#endif
+ case 'x':
+ value = (UV)scan_hex(PL_regcomp_parse, 2, &numlen);
+ PL_regcomp_parse += numlen;
+ break;
+ case 'c':
+ value = UCHARAT(PL_regcomp_parse++);
+ value = toCTRL(value);
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ value = (UV)scan_oct(--PL_regcomp_parse, 3, &numlen);
+ PL_regcomp_parse += numlen;
+ break;
+ default:
+ if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value))
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "/%.127s/: Unrecognized escape \\%c in character class passed through",
+ PL_regprecomp,
+ (int)value);
+ break;
}
}
- if (Class == '\\') {
- Class = UCHARAT(PL_regcomp_parse++);
- switch (Class) {
- case 'w':
+ if (namedclass > OOB_NAMEDCLASS) {
+ if (!need_class && !SIZE_ONLY)
+ ANYOF_CLASS_ZERO(ret);
+ need_class = 1;
+ if (range) { /* a-\d, a-[:digit:] */
if (!SIZE_ONLY) {
- if (PL_regflags & PMf_LOCALE)
- *opnd |= ANYOF_ALNUML;
+ if (ckWARN(WARN_REGEXP))
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "/%.127s/: false [] range \"%*.*s\" in regexp",
+ PL_regprecomp,
+ PL_regcomp_parse - rangebegin,
+ PL_regcomp_parse - rangebegin,
+ rangebegin);
+ ANYOF_BITMAP_SET(ret, lastvalue);
+ ANYOF_BITMAP_SET(ret, '-');
+ }
+ range = 0; /* this is not a true range */
+ }
+ if (!SIZE_ONLY) {
+ switch (namedclass) {
+ case ANYOF_ALNUM:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_ALNUM);
else {
- for (Class = 0; Class < 256; Class++)
- if (isALNUM(Class))
- ANYOF_SET(opnd, Class);
+ for (value = 0; value < 256; value++)
+ if (isALNUM(value))
+ ANYOF_BITMAP_SET(ret, value);
}
- }
- lastclass = 1234;
- continue;
- case 'W':
- if (!SIZE_ONLY) {
- if (PL_regflags & PMf_LOCALE)
- *opnd |= ANYOF_NALNUML;
+ break;
+ case ANYOF_NALNUM:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NALNUM);
else {
- for (Class = 0; Class < 256; Class++)
- if (!isALNUM(Class))
- ANYOF_SET(opnd, Class);
+ for (value = 0; value < 256; value++)
+ if (!isALNUM(value))
+ ANYOF_BITMAP_SET(ret, value);
}
- }
- lastclass = 1234;
- continue;
- case 's':
- if (!SIZE_ONLY) {
- if (PL_regflags & PMf_LOCALE)
- *opnd |= ANYOF_SPACEL;
+ break;
+ case ANYOF_SPACE:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_SPACE);
else {
- for (Class = 0; Class < 256; Class++)
- if (isSPACE(Class))
- ANYOF_SET(opnd, Class);
+ for (value = 0; value < 256; value++)
+ if (isSPACE(value))
+ ANYOF_BITMAP_SET(ret, value);
}
- }
- lastclass = 1234;
- continue;
- case 'S':
- if (!SIZE_ONLY) {
- if (PL_regflags & PMf_LOCALE)
- *opnd |= ANYOF_NSPACEL;
+ break;
+ case ANYOF_NSPACE:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NSPACE);
else {
- for (Class = 0; Class < 256; Class++)
- if (!isSPACE(Class))
- ANYOF_SET(opnd, Class);
+ for (value = 0; value < 256; value++)
+ if (!isSPACE(value))
+ ANYOF_BITMAP_SET(ret, value);
}
+ break;
+ case ANYOF_DIGIT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_DIGIT);
+ else {
+ for (value = '0'; value <= '9'; value++)
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NDIGIT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NDIGIT);
+ else {
+ for (value = 0; value < '0'; value++)
+ ANYOF_BITMAP_SET(ret, value);
+ for (value = '9' + 1; value < 256; value++)
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NALNUMC:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NALNUMC);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isALNUMC(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_ALNUMC:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_ALNUMC);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isALNUMC(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_ALPHA:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_ALPHA);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isALPHA(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NALPHA:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NALPHA);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isALPHA(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_ASCII:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_ASCII);
+ else {
+#ifdef ASCIIish
+ for (value = 0; value < 128; value++)
+ ANYOF_BITMAP_SET(ret, value);
+#else /* EBCDIC */
+ for (value = 0; value < 256; value++)
+ if (isASCII(value))
+ ANYOF_BITMAP_SET(ret, value);
+#endif /* EBCDIC */
+ }
+ break;
+ case ANYOF_NASCII:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NASCII);
+ else {
+#ifdef ASCIIish
+ for (value = 128; value < 256; value++)
+ ANYOF_BITMAP_SET(ret, value);
+#else /* EBCDIC */
+ for (value = 0; value < 256; value++)
+ if (!isASCII(value))
+ ANYOF_BITMAP_SET(ret, value);
+#endif /* EBCDIC */
+ }
+ break;
+ case ANYOF_CNTRL:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_CNTRL);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isCNTRL(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ lastvalue = OOB_CHAR8;
+ break;
+ case ANYOF_NCNTRL:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NCNTRL);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isCNTRL(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_GRAPH:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_GRAPH);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isGRAPH(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NGRAPH:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NGRAPH);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isGRAPH(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_LOWER:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_LOWER);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isLOWER(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NLOWER:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NLOWER);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isLOWER(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_PRINT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_PRINT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isPRINT(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NPRINT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NPRINT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isPRINT(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_PUNCT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_PUNCT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isPUNCT(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NPUNCT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NPUNCT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isPUNCT(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_UPPER:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_UPPER);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isUPPER(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NUPPER:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NUPPER);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isUPPER(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_XDIGIT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_XDIGIT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (isXDIGIT(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ case ANYOF_NXDIGIT:
+ if (LOC)
+ ANYOF_CLASS_SET(ret, ANYOF_NXDIGIT);
+ else {
+ for (value = 0; value < 256; value++)
+ if (!isXDIGIT(value))
+ ANYOF_BITMAP_SET(ret, value);
+ }
+ break;
+ default:
+ FAIL("invalid [::] class in regexp");
+ break;
}
- lastclass = 1234;
- continue;
- case 'd':
- if (!SIZE_ONLY) {
- for (Class = '0'; Class <= '9'; Class++)
- ANYOF_SET(opnd, Class);
- }
- lastclass = 1234;
- continue;
- case 'D':
- if (!SIZE_ONLY) {
- for (Class = 0; Class < '0'; Class++)
- ANYOF_SET(opnd, Class);
- for (Class = '9' + 1; Class < 256; Class++)
- ANYOF_SET(opnd, Class);
- }
- lastclass = 1234;
+ if (LOC)
+ ANYOF_FLAGS(ret) |= ANYOF_CLASS;
continue;
- case 'n':
- Class = '\n';
- break;
- case 'r':
- Class = '\r';
- break;
- case 't':
- Class = '\t';
- break;
- case 'f':
- Class = '\f';
- break;
- case 'b':
- Class = '\b';
- break;
- case 'e':
- Class = '\033';
- break;
- case 'a':
- Class = '\007';
- break;
- case 'x':
- Class = scan_hex(PL_regcomp_parse, 2, &numlen);
- PL_regcomp_parse += numlen;
- break;
- case 'c':
- Class = UCHARAT(PL_regcomp_parse++);
- Class = toCTRL(Class);
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- Class = scan_oct(--PL_regcomp_parse, 3, &numlen);
- PL_regcomp_parse += numlen;
- break;
}
}
if (range) {
- if (lastclass > Class)
- FAIL("invalid [] range in regexp");
+ if (lastvalue > value) /* b-a */ {
+ Perl_croak(aTHX_
+ "/%.127s/: invalid [] range \"%*.*s\" in regexp",
+ PL_regprecomp,
+ PL_regcomp_parse - rangebegin,
+ PL_regcomp_parse - rangebegin,
+ rangebegin);
+ }
range = 0;
}
else {
- lastclass = Class;
+ lastvalue = value;
if (*PL_regcomp_parse == '-' && PL_regcomp_parse+1 < PL_regxend &&
- PL_regcomp_parse[1] != ']') {
+ PL_regcomp_parse[1] != ']') {
PL_regcomp_parse++;
- range = 1;
+ if (namedclass > OOB_NAMEDCLASS) { /* \w-, [:word:]- */
+ if (ckWARN(WARN_REGEXP))
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "/%.127s/: false [] range \"%*.*s\" in regexp",
+ PL_regprecomp,
+ PL_regcomp_parse - rangebegin,
+ PL_regcomp_parse - rangebegin,
+ rangebegin);
+ if (!SIZE_ONLY)
+ ANYOF_BITMAP_SET(ret, '-');
+ } else
+ range = 1;
continue; /* do it next time */
}
}
+ /* now is the next time */
if (!SIZE_ONLY) {
-#ifndef ASCIIish
- register I32 i;
- if ((isLOWER(lastclass) && isLOWER(Class)) ||
- (isUPPER(lastclass) && isUPPER(Class))) {
- if (isLOWER(lastclass)) {
- for (i = lastclass; i <= Class; i++)
+#ifndef ASCIIish /* EBCDIC, for example. */
+ if ((isLOWER(lastvalue) && isLOWER(value)) ||
+ (isUPPER(lastvalue) && isUPPER(value)))
+ {
+ I32 i;
+ if (isLOWER(lastvalue)) {
+ for (i = lastvalue; i <= value; i++)
if (isLOWER(i))
- ANYOF_SET(opnd, i);
+ ANYOF_BITMAP_SET(ret, i);
} else {
- for (i = lastclass; i <= Class; i++)
+ for (i = lastvalue; i <= value; i++)
if (isUPPER(i))
- ANYOF_SET(opnd, i);
+ ANYOF_BITMAP_SET(ret, i);
}
}
else
#endif
- for ( ; lastclass <= Class; lastclass++)
- ANYOF_SET(opnd, lastclass);
- }
- lastclass = Class;
+ for ( ; lastvalue <= value; lastvalue++)
+ ANYOF_BITMAP_SET(ret, lastvalue);
+ }
+ range = 0;
+ }
+ if (need_class) {
+ if (SIZE_ONLY)
+ PL_regsize += ANYOF_CLASS_ADD_SKIP;
+ else
+ PL_regcode += ANYOF_CLASS_ADD_SKIP;
}
- if (*PL_regcomp_parse != ']')
- FAIL("unmatched [] in regexp");
- nextchar();
/* optimize case-insensitive simple patterns (e.g. /[a-z]/i) */
- if (!SIZE_ONLY && (*opnd & (0xFF ^ ANYOF_INVERT)) == ANYOF_FOLD) {
- for (Class = 0; Class < 256; ++Class) {
- if (ANYOF_TEST(opnd, Class)) {
- I32 cf = fold[Class];
- ANYOF_SET(opnd, cf);
+ if (!SIZE_ONLY &&
+ (ANYOF_FLAGS(ret) & (ANYOF_FLAGS_ALL ^ ANYOF_INVERT)) == ANYOF_FOLD) {
+ for (value = 0; value < 256; ++value) {
+ if (ANYOF_BITMAP_TEST(ret, value)) {
+ I32 cf = PL_fold[value];
+ ANYOF_BITMAP_SET(ret, cf);
}
}
- *opnd &= ~ANYOF_FOLD;
+ ANYOF_FLAGS(ret) &= ~ANYOF_FOLD;
}
/* optimize inverted simple patterns (e.g. [^a-z]) */
- if (!SIZE_ONLY && (*opnd & 0xFF) == ANYOF_INVERT) {
- for (Class = 0; Class < 32; ++Class)
- opnd[1 + Class] ^= 0xFF;
- *opnd = 0;
+ if (!SIZE_ONLY && (ANYOF_FLAGS(ret) & ANYOF_FLAGS_ALL) == ANYOF_INVERT) {
+ for (value = 0; value < ANYOF_BITMAP_SIZE; ++value)
+ ANYOF_BITMAP(ret)[value] ^= ANYOF_FLAGS_ALL;
+ ANYOF_FLAGS(ret) = 0;
}
return ret;
}
+STATIC regnode *
+S_regclassutf8(pTHX)
+{
+ dTHR;
+ register char *e;
+ register U32 value;
+ register U32 lastvalue = OOB_UTF8;
+ register I32 range = 0;
+ register regnode *ret;
+ I32 numlen;
+ I32 n;
+ SV *listsv;
+ U8 flags = 0;
+ I32 namedclass;
+ char *rangebegin;
+
+ if (*PL_regcomp_parse == '^') { /* Complement of range. */
+ PL_regnaughty++;
+ PL_regcomp_parse++;
+ if (!SIZE_ONLY)
+ flags |= ANYOF_INVERT;
+ }
+ if (!SIZE_ONLY) {
+ if (FOLD)
+ flags |= ANYOF_FOLD;
+ if (LOC)
+ flags |= ANYOF_LOCALE;
+ listsv = newSVpvn("# comment\n",10);
+ }
+
+ if (!SIZE_ONLY && ckWARN(WARN_REGEXP))
+ checkposixcc();
+
+ if (*PL_regcomp_parse == ']' || *PL_regcomp_parse == '-')
+ goto skipcond; /* allow 1st char to be ] or - */
+
+ while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != ']') {
+ skipcond:
+ namedclass = OOB_NAMEDCLASS;
+ if (!range)
+ rangebegin = PL_regcomp_parse;
+ value = utf8_to_uv((U8*)PL_regcomp_parse, &numlen);
+ PL_regcomp_parse += numlen;
+ if (value == '[')
+ namedclass = regpposixcc(value);
+ else if (value == '\\') {
+ value = (U32)utf8_to_uv((U8*)PL_regcomp_parse, &numlen);
+ PL_regcomp_parse += numlen;
+ /* Some compilers cannot handle switching on 64-bit integer
+ * values, therefore value cannot be an UV. Yes, this will
+ * be a problem later if we want switch on Unicode. --jhi */
+ switch (value) {
+ case 'w': namedclass = ANYOF_ALNUM; break;
+ case 'W': namedclass = ANYOF_NALNUM; break;
+ case 's': namedclass = ANYOF_SPACE; break;
+ case 'S': namedclass = ANYOF_NSPACE; break;
+ case 'd': namedclass = ANYOF_DIGIT; break;
+ case 'D': namedclass = ANYOF_NDIGIT; break;
+ case 'p':
+ case 'P':
+ if (*PL_regcomp_parse == '{') {
+ e = strchr(PL_regcomp_parse++, '}');
+ if (!e)
+ FAIL("Missing right brace on \\p{}");
+ n = e - PL_regcomp_parse;
+ }
+ else {
+ e = PL_regcomp_parse;
+ n = 1;
+ }
+ if (!SIZE_ONLY) {
+ if (value == 'p')
+ Perl_sv_catpvf(aTHX_ listsv,
+ "+utf8::%.*s\n", (int)n, PL_regcomp_parse);
+ else
+ Perl_sv_catpvf(aTHX_ listsv,
+ "!utf8::%.*s\n", (int)n, PL_regcomp_parse);
+ }
+ PL_regcomp_parse = e + 1;
+ lastvalue = OOB_UTF8;
+ continue;
+ case 'n': value = '\n'; break;
+ case 'r': value = '\r'; break;
+ case 't': value = '\t'; break;
+ case 'f': value = '\f'; break;
+ case 'b': value = '\b'; break;
+#ifdef ASCIIish
+ case 'e': value = '\033'; break;
+ case 'a': value = '\007'; break;
+#else
+ case 'e': value = '\047'; break;
+ case 'a': value = '\057'; break;
+#endif
+ case 'x':
+ if (*PL_regcomp_parse == '{') {
+ e = strchr(PL_regcomp_parse++, '}');
+ if (!e)
+ FAIL("Missing right brace on \\x{}");
+ value = (UV)scan_hex(PL_regcomp_parse,
+ e - PL_regcomp_parse,
+ &numlen);
+ PL_regcomp_parse = e + 1;
+ }
+ else {
+ value = (UV)scan_hex(PL_regcomp_parse, 2, &numlen);
+ PL_regcomp_parse += numlen;
+ }
+ break;
+ case 'c':
+ value = UCHARAT(PL_regcomp_parse++);
+ value = toCTRL(value);
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ value = (UV)scan_oct(--PL_regcomp_parse, 3, &numlen);
+ PL_regcomp_parse += numlen;
+ break;
+ default:
+ if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value))
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "/%.127s/: Unrecognized escape \\%c in character class passed through",
+ PL_regprecomp,
+ (int)value);
+ break;
+ }
+ }
+ if (namedclass > OOB_NAMEDCLASS) {
+ if (range) { /* a-\d, a-[:digit:] */
+ if (!SIZE_ONLY) {
+ if (ckWARN(WARN_REGEXP))
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "/%.127s/: false [] range \"%*.*s\" in regexp",
+ PL_regprecomp,
+ PL_regcomp_parse - rangebegin,
+ PL_regcomp_parse - rangebegin,
+ rangebegin);
+ Perl_sv_catpvf(aTHX_ listsv,
+ /* 0x002D is Unicode for '-' */
+ "%04"UVxf"\n002D\n", (UV)lastvalue);
+ }
+ range = 0;
+ }
+ if (!SIZE_ONLY) {
+ switch (namedclass) {
+ case ANYOF_ALNUM:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsWord\n"); break;
+ case ANYOF_NALNUM:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsWord\n"); break;
+ case ANYOF_ALNUMC:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsAlnum\n"); break;
+ case ANYOF_NALNUMC:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsAlnum\n"); break;
+ case ANYOF_ALPHA:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsAlpha\n"); break;
+ case ANYOF_NALPHA:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsAlpha\n"); break;
+ case ANYOF_ASCII:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsASCII\n"); break;
+ case ANYOF_NASCII:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsASCII\n"); break;
+ case ANYOF_CNTRL:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsCntrl\n"); break;
+ case ANYOF_NCNTRL:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsCntrl\n"); break;
+ case ANYOF_GRAPH:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsGraph\n"); break;
+ case ANYOF_NGRAPH:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsGraph\n"); break;
+ case ANYOF_DIGIT:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsDigit\n"); break;
+ case ANYOF_NDIGIT:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsDigit\n"); break;
+ case ANYOF_LOWER:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsLower\n"); break;
+ case ANYOF_NLOWER:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsLower\n"); break;
+ case ANYOF_PRINT:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsPrint\n"); break;
+ case ANYOF_NPRINT:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsPrint\n"); break;
+ case ANYOF_PUNCT:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsPunct\n"); break;
+ case ANYOF_NPUNCT:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsPunct\n"); break;
+ case ANYOF_SPACE:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsSpace\n"); break;
+ case ANYOF_NSPACE:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsSpace\n"); break;
+ case ANYOF_UPPER:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsUpper\n"); break;
+ case ANYOF_NUPPER:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsUpper\n"); break;
+ case ANYOF_XDIGIT:
+ Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsXDigit\n"); break;
+ case ANYOF_NXDIGIT:
+ Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsXDigit\n"); break;
+ }
+ continue;
+ }
+ }
+ if (range) {
+ if (lastvalue > value) { /* b-a */
+ Perl_croak(aTHX_
+ "/%.127s/: invalid [] range \"%*.*s\" in regexp",
+ PL_regprecomp,
+ PL_regcomp_parse - rangebegin,
+ PL_regcomp_parse - rangebegin,
+ rangebegin);
+ }
+ range = 0;
+ }
+ else {
+ lastvalue = value;
+ if (*PL_regcomp_parse == '-' && PL_regcomp_parse+1 < PL_regxend &&
+ PL_regcomp_parse[1] != ']') {
+ PL_regcomp_parse++;
+ if (namedclass > OOB_NAMEDCLASS) { /* \w-, [:word:]- */
+ if (ckWARN(WARN_REGEXP))
+ Perl_warner(aTHX_ WARN_REGEXP,
+ "/%.127s/: false [] range \"%*.*s\" in regexp",
+ PL_regprecomp,
+ PL_regcomp_parse - rangebegin,
+ PL_regcomp_parse - rangebegin,
+ rangebegin);
+ if (!SIZE_ONLY)
+ Perl_sv_catpvf(aTHX_ listsv,
+ /* 0x002D is Unicode for '-' */
+ "002D\n");
+ } else
+ range = 1;
+ continue; /* do it next time */
+ }
+ }
+ /* now is the next time */
+ if (!SIZE_ONLY)
+ Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\t%04"UVxf"\n",
+ (UV)lastvalue, (UV)value);
+ range = 0;
+ }
+
+ ret = reganode(ANYOFUTF8, 0);
+
+ if (!SIZE_ONLY) {
+ SV *rv = swash_init("utf8", "", listsv, 1, 0);
+ SvREFCNT_dec(listsv);
+ n = add_data(1,"s");
+ PL_regcomp_rx->data->data[n] = (void*)rv;
+ ARG1_SET(ret, flags);
+ ARG2_SET(ret, n);
+ }
+
+ return ret;
+}
+
STATIC char*
-nextchar(void)
+S_nextchar(pTHX)
{
dTHR;
char* retval = PL_regcomp_parse++;
@@ -2121,7 +3598,7 @@ nextchar(void)
- reg_node - emit a node
*/
STATIC regnode * /* Location. */
-reg_node(U8 op)
+S_reg_node(pTHX_ U8 op)
{
dTHR;
register regnode *ret;
@@ -2146,7 +3623,7 @@ reg_node(U8 op)
- reganode - emit a node with an argument
*/
STATIC regnode * /* Location. */
-reganode(U8 op, U32 arg)
+S_reganode(pTHX_ U8 op, U32 arg)
{
dTHR;
register regnode *ret;
@@ -2168,14 +3645,19 @@ reganode(U8 op, U32 arg)
}
/*
-- regc - emit (if appropriate) a byte of code
+- reguni - emit (if appropriate) a Unicode character
*/
STATIC void
-regc(U8 b, char* s)
+S_reguni(pTHX_ UV uv, char* s, I32* lenp)
{
dTHR;
- if (!SIZE_ONLY)
- *s = b;
+ if (SIZE_ONLY) {
+ U8 tmpbuf[UTF8_MAXLEN];
+ *lenp = uv_to_utf8(tmpbuf, uv) - tmpbuf;
+ }
+ else
+ *lenp = uv_to_utf8((U8*)s, uv) - (U8*)s;
+
}
/*
@@ -2184,7 +3666,7 @@ regc(U8 b, char* s)
* Means relocating the operand.
*/
STATIC void
-reginsert(U8 op, regnode *opnd)
+S_reginsert(pTHX_ U8 op, regnode *opnd)
{
dTHR;
register regnode *src;
@@ -2192,7 +3674,7 @@ reginsert(U8 op, regnode *opnd)
register regnode *place;
register int offset = regarglen[(U8)op];
-/* (regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
+/* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
if (SIZE_ONLY) {
PL_regsize += NODE_STEP_REGNODE + offset;
@@ -2215,12 +3697,11 @@ reginsert(U8 op, regnode *opnd)
- regtail - set the next-pointer at the end of a node chain of p to val.
*/
STATIC void
-regtail(regnode *p, regnode *val)
+S_regtail(pTHX_ regnode *p, regnode *val)
{
dTHR;
register regnode *scan;
register regnode *temp;
- register I32 offset;
if (SIZE_ONLY)
return;
@@ -2236,7 +3717,8 @@ regtail(regnode *p, regnode *val)
if (reg_off_by_arg[OP(scan)]) {
ARG_SET(scan, val - scan);
- } else {
+ }
+ else {
NEXT_OFF(scan) = val - scan;
}
}
@@ -2245,17 +3727,19 @@ regtail(regnode *p, regnode *val)
- regoptail - regtail on operand of first argument; nop if operandless
*/
STATIC void
-regoptail(regnode *p, regnode *val)
+S_regoptail(pTHX_ regnode *p, regnode *val)
{
dTHR;
/* "Operandless" and "op != BRANCH" are synonymous in practice. */
if (p == NULL || SIZE_ONLY)
return;
- if (regkind[(U8)OP(p)] == BRANCH) {
+ if (PL_regkind[(U8)OP(p)] == BRANCH) {
regtail(NEXTOPER(p), val);
- } else if ( regkind[(U8)OP(p)] == BRANCHJ) {
+ }
+ else if ( PL_regkind[(U8)OP(p)] == BRANCHJ) {
regtail(NEXTOPER(NEXTOPER(p)), val);
- } else
+ }
+ else
return;
}
@@ -2263,7 +3747,7 @@ regoptail(regnode *p, regnode *val)
- regcurly - a little FSA that accepts {\d+,?\d*}
*/
STATIC I32
-regcurly(register char *s)
+S_regcurly(pTHX_ register char *s)
{
if (*s++ != '{')
return FALSE;
@@ -2282,11 +3766,11 @@ regcurly(register char *s)
STATIC regnode *
-dumpuntil(regnode *start, regnode *node, regnode *last, SV* sv, I32 l)
+S_dumpuntil(pTHX_ regnode *start, regnode *node, regnode *last, SV* sv, I32 l)
{
#ifdef DEBUGGING
- register char op = EXACT; /* Arbitrary non-END op. */
- register regnode *next, *onode;
+ register U8 op = EXACT; /* Arbitrary non-END op. */
+ register regnode *next;
while (op != END && (!last || node < last)) {
/* While that wasn't END last time... */
@@ -2300,39 +3784,46 @@ dumpuntil(regnode *start, regnode *node, regnode *last, SV* sv, I32 l)
if (OP(node) == OPTIMIZED)
goto after_print;
regprop(sv, node);
- PerlIO_printf(Perl_debug_log, "%4d:%*s%s", node - start,
- 2*l + 1, "", SvPVX(sv));
+ PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
+ (int)(2*l + 1), "", SvPVX(sv));
if (next == NULL) /* Next ptr. */
PerlIO_printf(Perl_debug_log, "(0)");
else
- PerlIO_printf(Perl_debug_log, "(%d)", next - start);
+ PerlIO_printf(Perl_debug_log, "(%"IVdf")", (IV)(next - start));
(void)PerlIO_putc(Perl_debug_log, '\n');
after_print:
- if (regkind[(U8)op] == BRANCHJ) {
+ if (PL_regkind[(U8)op] == BRANCHJ) {
register regnode *nnode = (OP(next) == LONGJMP
? regnext(next)
: next);
if (last && nnode > last)
nnode = last;
node = dumpuntil(start, NEXTOPER(NEXTOPER(node)), nnode, sv, l + 1);
- } else if (regkind[(U8)op] == BRANCH) {
+ }
+ else if (PL_regkind[(U8)op] == BRANCH) {
node = dumpuntil(start, NEXTOPER(node), next, sv, l + 1);
- } else if ( op == CURLY) { /* `next' might be very big: optimizer */
+ }
+ else if ( op == CURLY) { /* `next' might be very big: optimizer */
node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
NEXTOPER(node) + EXTRA_STEP_2ARGS + 1, sv, l + 1);
- } else if (regkind[(U8)op] == CURLY && op != CURLYX) {
+ }
+ else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
next, sv, l + 1);
- } else if ( op == PLUS || op == STAR) {
+ }
+ else if ( op == PLUS || op == STAR) {
node = dumpuntil(start, NEXTOPER(node), NEXTOPER(node) + 1, sv, l + 1);
- } else if (op == ANYOF) {
+ }
+ else if (op == ANYOF) {
node = NEXTOPER(node);
- node += ANY_SKIP;
- } else if (regkind[(U8)op] == EXACT) {
+ node += ANYOF_SKIP;
+ }
+ else if (PL_regkind[(U8)op] == EXACT) {
/* Literal string, where present. */
- node += ((*OPERAND(node)) + 2 + sizeof(regnode) - 1) / sizeof(regnode);
+ node += NODE_SZ_STR(node) - 1;
node = NEXTOPER(node);
- } else {
+ }
+ else {
node = NEXTOPER(node);
node += regarglen[(U8)op];
}
@@ -2349,7 +3840,7 @@ dumpuntil(regnode *start, regnode *node, regnode *last, SV* sv, I32 l)
- regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
*/
void
-regdump(regexp *r)
+Perl_regdump(pTHX_ regexp *r)
{
#ifdef DEBUGGING
dTHR;
@@ -2359,19 +3850,23 @@ regdump(regexp *r)
/* Header fields of interest. */
if (r->anchored_substr)
- PerlIO_printf(Perl_debug_log, "anchored `%s%s%s'%s at %d ",
+ PerlIO_printf(Perl_debug_log,
+ "anchored `%s%.*s%s'%s at %"IVdf" ",
PL_colors[0],
+ (int)(SvCUR(r->anchored_substr) - (SvTAIL(r->anchored_substr)!=0)),
SvPVX(r->anchored_substr),
PL_colors[1],
SvTAIL(r->anchored_substr) ? "$" : "",
- r->anchored_offset);
+ (IV)r->anchored_offset);
if (r->float_substr)
- PerlIO_printf(Perl_debug_log, "floating `%s%s%s'%s at %d..%u ",
+ PerlIO_printf(Perl_debug_log,
+ "floating `%s%.*s%s'%s at %"IVdf"..%"UVuf" ",
PL_colors[0],
- SvPVX(r->float_substr),
+ (int)(SvCUR(r->float_substr) - (SvTAIL(r->float_substr)!=0)),
+ SvPVX(r->float_substr),
PL_colors[1],
SvTAIL(r->float_substr) ? "$" : "",
- r->float_min_offset, r->float_max_offset);
+ (IV)r->float_min_offset, (UV)r->float_max_offset);
if (r->check_substr)
PerlIO_printf(Perl_debug_log,
r->check_substr == r->float_substr
@@ -2393,6 +3888,8 @@ regdump(regexp *r)
PerlIO_printf(Perl_debug_log, "(BOL)");
if (r->reganch & ROPT_ANCH_MBOL)
PerlIO_printf(Perl_debug_log, "(MBOL)");
+ if (r->reganch & ROPT_ANCH_SBOL)
+ PerlIO_printf(Perl_debug_log, "(SBOL)");
if (r->reganch & ROPT_ANCH_GPOS)
PerlIO_printf(Perl_debug_log, "(GPOS)");
PerlIO_putc(Perl_debug_log, ' ');
@@ -2410,211 +3907,152 @@ regdump(regexp *r)
#endif /* DEBUGGING */
}
+STATIC void
+S_put_byte(pTHX_ SV *sv, int c)
+{
+ if (c <= ' ' || c == 127 || c == 255)
+ Perl_sv_catpvf(aTHX_ sv, "\\%o", c);
+ else if (c == '-' || c == ']' || c == '\\' || c == '^')
+ Perl_sv_catpvf(aTHX_ sv, "\\%c", c);
+ else
+ Perl_sv_catpvf(aTHX_ sv, "%c", c);
+}
+
/*
- regprop - printable representation of opcode
*/
void
-regprop(SV *sv, regnode *o)
+Perl_regprop(pTHX_ SV *sv, regnode *o)
{
#ifdef DEBUGGING
dTHR;
- register char *p = 0;
+ register int k;
sv_setpvn(sv, "", 0);
- switch (OP(o)) {
- case BOL:
- p = "BOL";
- break;
- case MBOL:
- p = "MBOL";
- break;
- case SBOL:
- p = "SBOL";
- break;
- case EOL:
- p = "EOL";
- break;
- case EOS:
- p = "EOS";
- break;
- case MEOL:
- p = "MEOL";
- break;
- case SEOL:
- p = "SEOL";
- break;
- case ANY:
- p = "ANY";
- break;
- case SANY:
- p = "SANY";
- break;
- case ANYOF:
- p = "ANYOF";
- break;
- case BRANCH:
- p = "BRANCH";
- break;
- case EXACT:
- sv_catpvf(sv, "EXACT <%s%s%s>", PL_colors[0], OPERAND(o) + 1, PL_colors[1]);
- break;
- case EXACTF:
- sv_catpvf(sv, "EXACTF <%s%s%s>", PL_colors[0], OPERAND(o) + 1, PL_colors[1]);
- break;
- case EXACTFL:
- sv_catpvf(sv, "EXACTFL <%s%s%s>", PL_colors[0], OPERAND(o) + 1, PL_colors[1]);
- break;
- case NOTHING:
- p = "NOTHING";
- break;
- case TAIL:
- p = "TAIL";
- break;
- case BACK:
- p = "BACK";
- break;
- case END:
- p = "END";
- break;
- case BOUND:
- p = "BOUND";
- break;
- case BOUNDL:
- p = "BOUNDL";
- break;
- case NBOUND:
- p = "NBOUND";
- break;
- case NBOUNDL:
- p = "NBOUNDL";
- break;
- case CURLY:
- sv_catpvf(sv, "CURLY {%d,%d}", ARG1(o), ARG2(o));
- break;
- case CURLYM:
- sv_catpvf(sv, "CURLYM[%d] {%d,%d}", o->flags, ARG1(o), ARG2(o));
- break;
- case CURLYN:
- sv_catpvf(sv, "CURLYN[%d] {%d,%d}", o->flags, ARG1(o), ARG2(o));
- break;
- case CURLYX:
- sv_catpvf(sv, "CURLYX {%d,%d}", ARG1(o), ARG2(o));
- break;
- case REF:
- sv_catpvf(sv, "REF%d", ARG(o));
- break;
- case REFF:
- sv_catpvf(sv, "REFF%d", ARG(o));
- break;
- case REFFL:
- sv_catpvf(sv, "REFFL%d", ARG(o));
- break;
- case OPEN:
- sv_catpvf(sv, "OPEN%d", ARG(o));
- break;
- case CLOSE:
- sv_catpvf(sv, "CLOSE%d", ARG(o));
- p = NULL;
- break;
- case STAR:
- p = "STAR";
- break;
- case PLUS:
- p = "PLUS";
- break;
- case MINMOD:
- p = "MINMOD";
- break;
- case GPOS:
- p = "GPOS";
- break;
- case UNLESSM:
- sv_catpvf(sv, "UNLESSM[-%d]", o->flags);
- break;
- case IFMATCH:
- sv_catpvf(sv, "IFMATCH[-%d]", o->flags);
- break;
- case SUCCEED:
- p = "SUCCEED";
- break;
- case WHILEM:
- p = "WHILEM";
- break;
- case DIGIT:
- p = "DIGIT";
- break;
- case NDIGIT:
- p = "NDIGIT";
- break;
- case ALNUM:
- p = "ALNUM";
- break;
- case NALNUM:
- p = "NALNUM";
- break;
- case SPACE:
- p = "SPACE";
- break;
- case NSPACE:
- p = "NSPACE";
- break;
- case ALNUML:
- p = "ALNUML";
- break;
- case NALNUML:
- p = "NALNUML";
- break;
- case SPACEL:
- p = "SPACEL";
- break;
- case NSPACEL:
- p = "NSPACEL";
- break;
- case EVAL:
- p = "EVAL";
- break;
- case LONGJMP:
- p = "LONGJMP";
- break;
- case BRANCHJ:
- p = "BRANCHJ";
- break;
- case IFTHEN:
- p = "IFTHEN";
- break;
- case GROUPP:
- sv_catpvf(sv, "GROUPP%d", ARG(o));
- break;
- case LOGICAL:
- p = "LOGICAL";
- break;
- case SUSPEND:
- p = "SUSPEND";
- break;
- case RENUM:
- p = "RENUM";
- break;
- case OPTIMIZED:
- p = "OPTIMIZED";
- break;
- default:
+ if (OP(o) >= reg_num) /* regnode.type is unsigned */
FAIL("corrupted regexp opcode");
+ sv_catpv(sv, (char*)reg_name[OP(o)]); /* Take off const! */
+
+ k = PL_regkind[(U8)OP(o)];
+
+ if (k == EXACT)
+ Perl_sv_catpvf(aTHX_ sv, " <%s%.*s%s>", PL_colors[0],
+ STR_LEN(o), STRING(o), PL_colors[1]);
+ else if (k == CURLY) {
+ if (OP(o) == CURLYM || OP(o) == CURLYN)
+ Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
+ Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
}
- if (p)
- sv_catpv(sv, p);
+ else if (k == WHILEM && o->flags) /* Ordinal/of */
+ Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
+ else if (k == REF || k == OPEN || k == CLOSE || k == GROUPP )
+ Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o)); /* Parenth number */
+ else if (k == LOGICAL)
+ Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* 2: embedded, otherwise 1 */
+ else if (k == ANYOF) {
+ int i, rangestart = -1;
+ const char * const out[] = { /* Should be syncronized with
+ a table in regcomp.h */
+ "\\w",
+ "\\W",
+ "\\s",
+ "\\S",
+ "\\d",
+ "\\D",
+ "[:alnum:]",
+ "[:^alnum:]",
+ "[:alpha:]",
+ "[:^alpha:]",
+ "[:ascii:]",
+ "[:^ascii:]",
+ "[:ctrl:]",
+ "[:^ctrl:]",
+ "[:graph:]",
+ "[:^graph:]",
+ "[:lower:]",
+ "[:^lower:]",
+ "[:print:]",
+ "[:^print:]",
+ "[:punct:]",
+ "[:^punct:]",
+ "[:upper:]",
+ "[:!upper:]",
+ "[:xdigit:]",
+ "[:^xdigit:]"
+ };
+
+ if (o->flags & ANYOF_LOCALE)
+ sv_catpv(sv, "{loc}");
+ if (o->flags & ANYOF_FOLD)
+ sv_catpv(sv, "{i}");
+ Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
+ if (o->flags & ANYOF_INVERT)
+ sv_catpv(sv, "^");
+ for (i = 0; i <= 256; i++) {
+ if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
+ if (rangestart == -1)
+ rangestart = i;
+ } else if (rangestart != -1) {
+ if (i <= rangestart + 3)
+ for (; rangestart < i; rangestart++)
+ put_byte(sv, rangestart);
+ else {
+ put_byte(sv, rangestart);
+ sv_catpv(sv, "-");
+ put_byte(sv, i - 1);
+ }
+ rangestart = -1;
+ }
+ }
+ if (o->flags & ANYOF_CLASS)
+ for (i = 0; i < sizeof(out)/sizeof(char*); i++)
+ if (ANYOF_CLASS_TEST(o,i))
+ sv_catpv(sv, out[i]);
+ Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
+ }
+ else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
+ Perl_sv_catpvf(aTHX_ sv, "[-%d]", o->flags);
#endif /* DEBUGGING */
}
+SV *
+Perl_re_intuit_string(pTHX_ regexp *prog)
+{ /* Assume that RE_INTUIT is set */
+ DEBUG_r(
+ { STRLEN n_a;
+ char *s = SvPV(prog->check_substr,n_a);
+
+ if (!PL_colorset) reginitcolors();
+ PerlIO_printf(Perl_debug_log,
+ "%sUsing REx substr:%s `%s%.60s%s%s'\n",
+ PL_colors[4],PL_colors[5],PL_colors[0],
+ s,
+ PL_colors[1],
+ (strlen(s) > 60 ? "..." : ""));
+ } );
+
+ return prog->check_substr;
+}
+
void
-pregfree(struct regexp *r)
+Perl_pregfree(pTHX_ struct regexp *r)
{
dTHR;
+ DEBUG_r(if (!PL_colorset) reginitcolors());
+
if (!r || (--r->refcnt > 0))
return;
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ "%sFreeing REx:%s `%s%.60s%s%s'\n",
+ PL_colors[4],PL_colors[5],PL_colors[0],
+ r->precomp,
+ PL_colors[1],
+ (strlen(r->precomp) > 60 ? "..." : "")));
+
if (r->precomp)
Safefree(r->precomp);
- if (r->subbase)
- Safefree(r->subbase);
+ if (RX_MATCH_COPIED(r))
+ Safefree(r->subbeg);
if (r->substrs) {
if (r->anchored_substr)
SvREFCNT_dec(r->anchored_substr);
@@ -2624,13 +4062,33 @@ pregfree(struct regexp *r)
}
if (r->data) {
int n = r->data->count;
+ AV* new_comppad = NULL;
+ AV* old_comppad;
+ SV** old_curpad;
+
while (--n >= 0) {
switch (r->data->what[n]) {
case 's':
SvREFCNT_dec((SV*)r->data->data[n]);
break;
+ case 'f':
+ Safefree(r->data->data[n]);
+ break;
+ case 'p':
+ new_comppad = (AV*)r->data->data[n];
+ break;
case 'o':
+ if (new_comppad == NULL)
+ Perl_croak(aTHX_ "panic: pregfree comppad");
+ old_comppad = PL_comppad;
+ old_curpad = PL_curpad;
+ PL_comppad = new_comppad;
+ PL_curpad = AvARRAY(new_comppad);
op_free((OP_4tree*)r->data->data[n]);
+ PL_comppad = old_comppad;
+ PL_curpad = old_curpad;
+ SvREFCNT_dec((SV*)new_comppad);
+ new_comppad = NULL;
break;
case 'n':
break;
@@ -2653,7 +4111,7 @@ pregfree(struct regexp *r)
* that bypass this code for speed.]
*/
regnode *
-regnext(register regnode *p)
+Perl_regnext(pTHX_ register regnode *p)
{
dTHR;
register I32 offset;
@@ -2669,12 +4127,13 @@ regnext(register regnode *p)
}
STATIC void
-re_croak2(const char* pat1,const char* pat2,...)
+S_re_croak2(pTHX_ const char* pat1,const char* pat2,...)
{
va_list args;
STRLEN l1 = strlen(pat1);
STRLEN l2 = strlen(pat2);
char buf[512];
+ SV *msv;
char *message;
if (l1 > 510)
@@ -2685,13 +4144,83 @@ re_croak2(const char* pat1,const char* pat2,...)
Copy(pat2, buf + l1, l2 , char);
buf[l1 + l2] = '\n';
buf[l1 + l2 + 1] = '\0';
+#ifdef I_STDARG
+ /* ANSI variant takes additional second argument */
va_start(args, pat2);
- message = mess(buf, &args);
+#else
+ va_start(args);
+#endif
+ msv = vmess(buf, &args);
va_end(args);
- l1 = strlen(message);
+ message = SvPV(msv,l1);
if (l1 > 512)
l1 = 512;
Copy(message, buf, l1 , char);
buf[l1] = '\0'; /* Overwrite \n */
- croak("%s", buf);
+ Perl_croak(aTHX_ "%s", buf);
}
+
+/* XXX Here's a total kludge. But we need to re-enter for swash routines. */
+
+void
+Perl_save_re_context(pTHX)
+{
+ dTHR;
+ SAVEPPTR(PL_bostr);
+ SAVEPPTR(PL_regprecomp); /* uncompiled string. */
+ SAVEI32(PL_regnpar); /* () count. */
+ SAVEI32(PL_regsize); /* Code size. */
+ SAVEI16(PL_regflags); /* are we folding, multilining? */
+ SAVEPPTR(PL_reginput); /* String-input pointer. */
+ SAVEPPTR(PL_regbol); /* Beginning of input, for ^ check. */
+ SAVEPPTR(PL_regeol); /* End of input, for $ check. */
+ SAVEVPTR(PL_regstartp); /* Pointer to startp array. */
+ SAVEVPTR(PL_regendp); /* Ditto for endp. */
+ SAVEVPTR(PL_reglastparen); /* Similarly for lastparen. */
+ SAVEPPTR(PL_regtill); /* How far we are required to go. */
+ SAVEI8(PL_regprev); /* char before regbol, \n if none */
+ SAVEVPTR(PL_reg_start_tmp); /* from regexec.c */
+ PL_reg_start_tmp = 0;
+ SAVEFREEPV(PL_reg_start_tmp);
+ SAVEI32(PL_reg_start_tmpl); /* from regexec.c */
+ PL_reg_start_tmpl = 0;
+ SAVEVPTR(PL_regdata);
+ SAVEI32(PL_reg_flags); /* from regexec.c */
+ SAVEI32(PL_reg_eval_set); /* from regexec.c */
+ SAVEI32(PL_regnarrate); /* from regexec.c */
+ SAVEVPTR(PL_regprogram); /* from regexec.c */
+ SAVEINT(PL_regindent); /* from regexec.c */
+ SAVEVPTR(PL_regcc); /* from regexec.c */
+ SAVEVPTR(PL_curcop);
+ SAVEVPTR(PL_regcomp_rx); /* from regcomp.c */
+ SAVEI32(PL_regseen); /* from regcomp.c */
+ SAVEI32(PL_regsawback); /* Did we see \1, ...? */
+ SAVEI32(PL_regnaughty); /* How bad is this pattern? */
+ SAVEVPTR(PL_regcode); /* Code-emit pointer; &regdummy = don't */
+ SAVEPPTR(PL_regxend); /* End of input for compile */
+ SAVEPPTR(PL_regcomp_parse); /* Input-scan pointer. */
+ SAVEVPTR(PL_reg_call_cc); /* from regexec.c */
+ SAVEVPTR(PL_reg_re); /* from regexec.c */
+ SAVEPPTR(PL_reg_ganch); /* from regexec.c */
+ SAVESPTR(PL_reg_sv); /* from regexec.c */
+ SAVEVPTR(PL_reg_magic); /* from regexec.c */
+ SAVEI32(PL_reg_oldpos); /* from regexec.c */
+ SAVEVPTR(PL_reg_oldcurpm); /* from regexec.c */
+ SAVEVPTR(PL_reg_curpm); /* from regexec.c */
+#ifdef DEBUGGING
+ SAVEPPTR(PL_reg_starttry); /* from regexec.c */
+#endif
+}
+
+#ifdef PERL_OBJECT
+#include "XSUB.h"
+#undef this
+#define this pPerl
+#endif
+
+static void
+clear_re(pTHXo_ void *r)
+{
+ ReREFCNT_dec((regexp *)r);
+}
+
diff --git a/contrib/perl5/regcomp.h b/contrib/perl5/regcomp.h
index 526b885..3624917 100644
--- a/contrib/perl5/regcomp.h
+++ b/contrib/perl5/regcomp.h
@@ -66,10 +66,10 @@ typedef OP OP_4tree; /* Will be redefined later. */
*/
struct regnode_string {
- U8 flags;
+ U8 str_len;
U8 type;
U16 next_off;
- U8 string[1];
+ char string[1];
};
struct regnode_1 {
@@ -87,6 +87,24 @@ struct regnode_2 {
U16 arg2;
};
+#define ANYOF_BITMAP_SIZE 32 /* 256 b/(8 b/B) */
+#define ANYOF_CLASSBITMAP_SIZE 4
+
+struct regnode_charclass {
+ U8 flags;
+ U8 type;
+ U16 next_off;
+ char bitmap[ANYOF_BITMAP_SIZE];
+};
+
+struct regnode_charclass_class {
+ U8 flags;
+ U8 type;
+ U16 next_off;
+ char bitmap[ANYOF_BITMAP_SIZE];
+ char classflags[ANYOF_CLASSBITMAP_SIZE];
+};
+
/* XXX fix this description.
Impose a limit of REG_INFTY on various pattern matching operations
to limit stack growth and to avoid "infinite" recursions.
@@ -133,6 +151,12 @@ struct regnode_2 {
#define OP(p) ((p)->type)
#define OPERAND(p) (((struct regnode_string *)p)->string)
+#define MASK(p) ((char*)OPERAND(p))
+#define STR_LEN(p) (((struct regnode_string *)p)->str_len)
+#define STRING(p) (((struct regnode_string *)p)->string)
+#define STR_SZ(l) ((l + sizeof(regnode) - 1) / sizeof(regnode))
+#define NODE_SZ_STR(p) (STR_SZ(STR_LEN(p))+1)
+
#define NODE_ALIGN(node)
#define ARG_LOC(p) (((struct regnode_1 *)p)->arg1)
#define ARG1_LOC(p) (((struct regnode_2 *)p)->arg1)
@@ -150,35 +174,94 @@ struct regnode_2 {
#define FILL_ADVANCE_NODE_ARG(ptr, op, arg) STMT_START { \
ARG_SET(ptr, arg); FILL_ADVANCE_NODE(ptr, op); (ptr) += 1; } STMT_END
-#define MAGIC 0234
+#define REG_MAGIC 0234
#define SIZE_ONLY (PL_regcode == &PL_regdummy)
-/* Flags for first parameter byte of ANYOF */
-#define ANYOF_INVERT 0x40
-#define ANYOF_FOLD 0x20
-#define ANYOF_LOCALE 0x10
-#define ANYOF_ISA 0x0F
-#define ANYOF_ALNUML 0x08
-#define ANYOF_NALNUML 0x04
-#define ANYOF_SPACEL 0x02
-#define ANYOF_NSPACEL 0x01
-
-/* Utility macros for bitmap of ANYOF */
-#define ANYOF_BYTE(p,c) (p)[1 + (((c) >> 3) & 31)]
-#define ANYOF_BIT(c) (1 << ((c) & 7))
-#define ANYOF_SET(p,c) (ANYOF_BYTE(p,c) |= ANYOF_BIT(c))
-#define ANYOF_CLEAR(p,c) (ANYOF_BYTE(p,c) &= ~ANYOF_BIT(c))
-#define ANYOF_TEST(p,c) (ANYOF_BYTE(p,c) & ANYOF_BIT(c))
-
-#define ANY_SKIP ((33 - 1)/sizeof(regnode) + 1)
+/* Flags for node->flags of ANYOF */
+
+#define ANYOF_CLASS 0x08
+#define ANYOF_INVERT 0x04
+#define ANYOF_FOLD 0x02
+#define ANYOF_LOCALE 0x01
+
+/* Used for regstclass only */
+#define ANYOF_EOS 0x10 /* Can match an empty string too */
+
+/* Character classes for node->classflags of ANYOF */
+/* Should be synchronized with a table in regprop() */
+/* 2n should pair with 2n+1 */
+
+#define ANYOF_ALNUM 0 /* \w, utf8::IsWord, isALNUM() */
+#define ANYOF_NALNUM 1
+#define ANYOF_SPACE 2
+#define ANYOF_NSPACE 3
+#define ANYOF_DIGIT 4
+#define ANYOF_NDIGIT 5
+#define ANYOF_ALNUMC 6 /* isalnum(3), utf8::IsAlnum, isALNUMC() */
+#define ANYOF_NALNUMC 7
+#define ANYOF_ALPHA 8
+#define ANYOF_NALPHA 9
+#define ANYOF_ASCII 10
+#define ANYOF_NASCII 11
+#define ANYOF_CNTRL 12
+#define ANYOF_NCNTRL 13
+#define ANYOF_GRAPH 14
+#define ANYOF_NGRAPH 15
+#define ANYOF_LOWER 16
+#define ANYOF_NLOWER 17
+#define ANYOF_PRINT 18
+#define ANYOF_NPRINT 19
+#define ANYOF_PUNCT 20
+#define ANYOF_NPUNCT 21
+#define ANYOF_UPPER 22
+#define ANYOF_NUPPER 23
+#define ANYOF_XDIGIT 24
+#define ANYOF_NXDIGIT 25
+
+#define ANYOF_MAX 31
+
+/* Backward source code compatibility. */
+
+#define ANYOF_ALNUML ANYOF_ALNUM
+#define ANYOF_NALNUML ANYOF_NALNUM
+#define ANYOF_SPACEL ANYOF_SPACE
+#define ANYOF_NSPACEL ANYOF_NSPACE
+
+/* Utility macros for the bitmap and classes of ANYOF */
+
+#define ANYOF_SIZE (sizeof(struct regnode_charclass))
+#define ANYOF_CLASS_SIZE (sizeof(struct regnode_charclass_class))
+
+#define ANYOF_FLAGS(p) ((p)->flags)
+#define ANYOF_FLAGS_ALL 0xff
+
+#define ANYOF_BIT(c) (1 << ((c) & 7))
+
+#define ANYOF_CLASS_BYTE(p, c) (((struct regnode_charclass_class*)(p))->classflags[((c) >> 3) & 3])
+#define ANYOF_CLASS_SET(p, c) (ANYOF_CLASS_BYTE(p, c) |= ANYOF_BIT(c))
+#define ANYOF_CLASS_CLEAR(p, c) (ANYOF_CLASS_BYTE(p, c) &= ~ANYOF_BIT(c))
+#define ANYOF_CLASS_TEST(p, c) (ANYOF_CLASS_BYTE(p, c) & ANYOF_BIT(c))
+
+#define ANYOF_CLASS_ZERO(ret) Zero(((struct regnode_charclass_class*)(ret))->classflags, ANYOF_CLASSBITMAP_SIZE, char)
+#define ANYOF_BITMAP_ZERO(ret) Zero(((struct regnode_charclass*)(ret))->bitmap, ANYOF_BITMAP_SIZE, char)
+
+#define ANYOF_BITMAP(p) (((struct regnode_charclass*)(p))->bitmap)
+#define ANYOF_BITMAP_BYTE(p, c) (ANYOF_BITMAP(p)[((c) >> 3) & 31])
+#define ANYOF_BITMAP_SET(p, c) (ANYOF_BITMAP_BYTE(p, c) |= ANYOF_BIT(c))
+#define ANYOF_BITMAP_CLEAR(p,c) (ANYOF_BITMAP_BYTE(p, c) &= ~ANYOF_BIT(c))
+#define ANYOF_BITMAP_TEST(p, c) (ANYOF_BITMAP_BYTE(p, c) & ANYOF_BIT(c))
+
+#define ANYOF_SKIP ((ANYOF_SIZE - 1)/sizeof(regnode))
+#define ANYOF_CLASS_SKIP ((ANYOF_CLASS_SIZE - 1)/sizeof(regnode))
+#define ANYOF_CLASS_ADD_SKIP (ANYOF_CLASS_SKIP - ANYOF_SKIP)
/*
* Utility definitions.
*/
#ifndef lint
#ifndef CHARMASK
-#define UCHARAT(p) ((int)*(unsigned char *)(p))
+#define UCHARAT(p) ((int)*(U8*)(p))
#else
#define UCHARAT(p) ((int)*(p)&CHARMASK)
#endif
@@ -186,8 +269,19 @@ struct regnode_2 {
#define UCHARAT(p) PL_regdummy
#endif /* lint */
-#define FAIL(m) croak ("/%.127s/: %s", PL_regprecomp,m)
-#define FAIL2(pat,m) re_croak2("/%.127s/: ",pat,PL_regprecomp,m)
+#define FAIL(m) \
+ STMT_START { \
+ if (!SIZE_ONLY) \
+ SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx); \
+ Perl_croak(aTHX_ "/%.127s/: %s", PL_regprecomp,m); \
+ } STMT_END
+
+#define FAIL2(pat,m) \
+ STMT_START { \
+ if (!SIZE_ONLY) \
+ SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx); \
+ S_re_croak2(aTHX_ "/%.127s/: ",pat,PL_regprecomp,m); \
+ } STMT_END
#define EXTRA_SIZE(guy) ((sizeof(guy)-1)/sizeof(struct regnode))
@@ -196,27 +290,64 @@ struct regnode_2 {
#define REG_SEEN_GPOS 4
#define REG_SEEN_EVAL 8
+START_EXTERN_C
+
#include "regnodes.h"
-/* The following have no fixed length. char* since we do strchr on it. */
+/* The following have no fixed length. U8 so we can do strchr() on it. */
#ifndef DOINIT
-EXTCONST char varies[];
+EXTCONST U8 PL_varies[];
#else
-EXTCONST char varies[] = {
+EXTCONST U8 PL_varies[] = {
BRANCH, BACK, STAR, PLUS, CURLY, CURLYX, REF, REFF, REFFL,
- WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, 0
+ WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, CLUMP, 0
};
#endif
-/* The following always have a length of 1. char* since we do strchr on it. */
+/* The following always have a length of 1. U8 we can do strchr() on it. */
+/* (Note that length 1 means "one character" under UTF8, not "one octet".) */
#ifndef DOINIT
-EXTCONST char simple[];
+EXTCONST U8 PL_simple[];
#else
-EXTCONST char simple[] = {
- ANY, SANY, ANYOF,
- ALNUM, ALNUML, NALNUM, NALNUML,
- SPACE, SPACEL, NSPACE, NSPACEL,
- DIGIT, NDIGIT, 0
+EXTCONST U8 PL_simple[] = {
+ REG_ANY, ANYUTF8, SANY, SANYUTF8, ANYOF, ANYOFUTF8,
+ ALNUM, ALNUMUTF8, ALNUML, ALNUMLUTF8,
+ NALNUM, NALNUMUTF8, NALNUML, NALNUMLUTF8,
+ SPACE, SPACEUTF8, SPACEL, SPACELUTF8,
+ NSPACE, NSPACEUTF8, NSPACEL, NSPACELUTF8,
+ DIGIT, DIGITUTF8, NDIGIT, NDIGITUTF8, 0
};
#endif
+END_EXTERN_C
+
+typedef struct re_scream_pos_data_s
+{
+ char **scream_olds; /* match pos */
+ I32 *scream_pos; /* Internal iterator of scream. */
+} re_scream_pos_data;
+
+struct reg_data {
+ U32 count;
+ U8 *what;
+ void* data[1];
+};
+
+struct reg_substr_datum {
+ I32 min_offset;
+ I32 max_offset;
+ SV *substr;
+};
+
+struct reg_substr_data {
+ struct reg_substr_datum data[3]; /* Actual array */
+};
+
+#define anchored_substr substrs->data[0].substr
+#define anchored_offset substrs->data[0].min_offset
+#define float_substr substrs->data[1].substr
+#define float_min_offset substrs->data[1].min_offset
+#define float_max_offset substrs->data[1].max_offset
+#define check_substr substrs->data[2].substr
+#define check_offset_min substrs->data[2].min_offset
+#define check_offset_max substrs->data[2].max_offset
diff --git a/contrib/perl5/regcomp.pl b/contrib/perl5/regcomp.pl
index cfe59ad..d7d0733 100644
--- a/contrib/perl5/regcomp.pl
+++ b/contrib/perl5/regcomp.pl
@@ -21,7 +21,7 @@ open OUT, ">$tmp_h";
print OUT <<EOP;
/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- This file is built by regcomp.pl from regcomp.sym.
+ This file is built by regcomp.pl from regcomp.sym.
Any changes made here will be lost!
*/
@@ -39,9 +39,9 @@ EOP
print OUT <<EOP;
#ifndef DOINIT
-EXTCONST U8 regkind[];
+EXTCONST U8 PL_regkind[];
#else
-EXTCONST U8 regkind[] = {
+EXTCONST U8 PL_regkind[] = {
EOP
$ind = 0;
@@ -79,7 +79,7 @@ EOP
$ind = 0;
while (++$ind <= $tot) {
$size = $longj[$ind] || 0;
-
+
print OUT <<EOP;
$size, /* $name[$ind] */
EOP
@@ -87,6 +87,27 @@ EOP
print OUT <<EOP;
};
+
+#ifdef DEBUGGING
+const static char * const reg_name[] = {
+EOP
+
+$ind = 0;
+while (++$ind <= $tot) {
+ $hind = sprintf "%#4x", $ind-1;
+ $size = $longj[$ind] || 0;
+
+ print OUT <<EOP;
+ "$name[$ind]", /* $hind */
+EOP
+}
+
+print OUT <<EOP;
+};
+
+const static int reg_num = $tot;
+
+#endif /* DEBUGGING */
#endif /* REG_COMP_C */
EOP
diff --git a/contrib/perl5/regcomp.sym b/contrib/perl5/regcomp.sym
index 9775b93..bb5f8f8 100644
--- a/contrib/perl5/regcomp.sym
+++ b/contrib/perl5/regcomp.sym
@@ -16,25 +16,47 @@ EOL EOL, no Match "" at end of line.
MEOL EOL, no Same, assuming multiline.
SEOL EOL, no Same, assuming singleline.
BOUND BOUND, no Match "" at any word boundary
+BOUNDUTF8 BOUND, no Match "" at any word boundary
BOUNDL BOUND, no Match "" at any word boundary
+BOUNDLUTF8 BOUND, no Match "" at any word boundary
NBOUND NBOUND, no Match "" at any word non-boundary
+NBOUNDUTF8 NBOUND, no Match "" at any word non-boundary
NBOUNDL NBOUND, no Match "" at any word non-boundary
+NBOUNDLUTF8 NBOUND, no Match "" at any word non-boundary
GPOS GPOS, no Matches where last m//g left off.
# [Special] alternatives
-ANY ANY, no Match any one character (except newline).
-SANY ANY, no Match any one character.
+REG_ANY REG_ANY, no Match any one character (except newline).
+ANYUTF8 REG_ANY, no Match any one Unicode character (except newline).
+SANY REG_ANY, no Match any one character.
+SANYUTF8 REG_ANY, no Match any one Unicode character.
ANYOF ANYOF, sv Match character in (or not in) this class.
+ANYOFUTF8 ANYOF, sv 1 Match character in (or not in) this class.
ALNUM ALNUM, no Match any alphanumeric character
+ALNUMUTF8 ALNUM, no Match any alphanumeric character in utf8
ALNUML ALNUM, no Match any alphanumeric char in locale
+ALNUMLUTF8 ALNUM, no Match any alphanumeric char in locale+utf8
NALNUM NALNUM, no Match any non-alphanumeric character
+NALNUMUTF8 NALNUM, no Match any non-alphanumeric character in utf8
NALNUML NALNUM, no Match any non-alphanumeric char in locale
+NALNUMLUTF8 NALNUM, no Match any non-alphanumeric char in locale+utf8
SPACE SPACE, no Match any whitespace character
+SPACEUTF8 SPACE, no Match any whitespace character in utf8
SPACEL SPACE, no Match any whitespace char in locale
+SPACELUTF8 SPACE, no Match any whitespace char in locale+utf8
NSPACE NSPACE, no Match any non-whitespace character
+NSPACEUTF8 NSPACE, no Match any non-whitespace character in utf8
NSPACEL NSPACE, no Match any non-whitespace char in locale
+NSPACELUTF8 NSPACE, no Match any non-whitespace char in locale+utf8
DIGIT DIGIT, no Match any numeric character
+DIGITUTF8 DIGIT, no Match any numeric character in utf8
+DIGITL DIGIT, no Match any numeric character in locale
+DIGITLUTF8 DIGIT, no Match any numeric character in locale+utf8
NDIGIT NDIGIT, no Match any non-numeric character
+NDIGITUTF8 NDIGIT, no Match any non-numeric character in utf8
+NDIGITL NDIGIT, no Match any non-numeric character in locale
+NDIGITLUTF8 NDIGIT, no Match any non-numeric character in locale+utf8
+CLUMP CLUMP, no Match any combining character sequence
# BRANCH The set of branches constituting a single choice are hooked
# together with their "next" pointers, since precedence prevents
diff --git a/contrib/perl5/regexec.c b/contrib/perl5/regexec.c
index 98f7ef5..3b6d857 100644
--- a/contrib/perl5/regexec.c
+++ b/contrib/perl5/regexec.c
@@ -25,7 +25,7 @@
# define PERL_IN_XSUB_RE
# endif
/* need access to debugger hooks */
-# ifndef DEBUGGING
+# if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
# define DEBUGGING
# endif
#endif
@@ -35,8 +35,12 @@
# define Perl_regexec_flags my_regexec
# define Perl_regdump my_regdump
# define Perl_regprop my_regprop
+# define Perl_re_intuit_start my_re_intuit_start
/* *These* symbols are masked to allow static link. */
# define Perl_pregexec my_pregexec
+# define Perl_reginitcolors my_reginitcolors
+
+# define PERL_NO_GET_CONTEXT
#endif
/*SUPPRESS 112*/
@@ -62,7 +66,7 @@
*
**** Alterations to Henry's code are...
****
- **** Copyright (c) 1991-1999, Larry Wall
+ **** Copyright (c) 1991-2000, Larry Wall
****
**** You may distribute under the terms of either the GNU General Public
**** License or the Artistic License, as specified in the README file.
@@ -72,12 +76,23 @@
* regular-expression syntax might require a total rethink.
*/
#include "EXTERN.h"
+#define PERL_IN_REGEXEC_C
#include "perl.h"
+
+#ifdef PERL_IN_XSUB_RE
+# if defined(PERL_CAPI) || defined(PERL_OBJECT)
+# include "XSUB.h"
+# endif
+#endif
+
#include "regcomp.h"
#define RF_tainted 1 /* tainted information used? */
#define RF_warned 2 /* warned about big count? */
#define RF_evaled 4 /* Did an EVAL with setting? */
+#define RF_utf8 8 /* String contains multibyte chars? */
+
+#define UTF (PL_reg_flags & RF_utf8)
#define RS_init 1 /* eval environment created */
#define RS_set 2 /* replsv value is set */
@@ -86,26 +101,28 @@
#define STATIC static
#endif
-#ifndef PERL_OBJECT
-typedef I32 CHECKPOINT;
-
/*
* Forwards.
*/
-static I32 regmatch _((regnode *prog));
-static I32 regrepeat _((regnode *p, I32 max));
-static I32 regrepeat_hard _((regnode *p, I32 max, I32 *lp));
-static I32 regtry _((regexp *prog, char *startpos));
+#define REGINCLASS(p,c) (ANYOF_FLAGS(p) ? reginclass(p,c) : ANYOF_BITMAP_TEST(p,c))
+#define REGINCLASSUTF8(f,p) (ARG1(f) ? reginclassutf8(f,p) : swash_fetch((SV*)PL_regdata->data[ARG2(f)],p))
+
+#define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
+#define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
+
+#define reghop_c(pos,off) ((char*)reghop((U8*)pos, off))
+#define reghopmaybe_c(pos,off) ((char*)reghopmaybe((U8*)pos, off))
+#define HOP(pos,off) (UTF ? reghop((U8*)pos, off) : (U8*)(pos + off))
+#define HOPMAYBE(pos,off) (UTF ? reghopmaybe((U8*)pos, off) : (U8*)(pos + off))
+#define HOPc(pos,off) ((char*)HOP(pos,off))
+#define HOPMAYBEc(pos,off) ((char*)HOPMAYBE(pos,off))
+
+static void restore_pos(pTHXo_ void *arg);
-static bool reginclass _((char *p, I32 c));
-static CHECKPOINT regcppush _((I32 parenfloor));
-static char * regcppop _((void));
-#endif
-#define REGINCLASS(p,c) (*(p) ? reginclass(p,c) : ANYOF_TEST(p,c))
STATIC CHECKPOINT
-regcppush(I32 parenfloor)
+S_regcppush(pTHX_ I32 parenfloor)
{
dTHR;
int retval = PL_savestack_ix;
@@ -114,8 +131,8 @@ regcppush(I32 parenfloor)
SSCHECK(i + 5);
for (p = PL_regsize; p > parenfloor; p--) {
- SSPUSHPTR(PL_regendp[p]);
- SSPUSHPTR(PL_regstartp[p]);
+ SSPUSHINT(PL_regendp[p]);
+ SSPUSHINT(PL_regstartp[p]);
SSPUSHPTR(PL_reg_start_tmp[p]);
SSPUSHINT(p);
}
@@ -129,22 +146,22 @@ regcppush(I32 parenfloor)
/* These are needed since we do not localize EVAL nodes: */
# define REGCP_SET DEBUG_r(PerlIO_printf(Perl_debug_log, \
- " Setting an EVAL scope, savestack=%i\n", \
- PL_savestack_ix)); lastcp = PL_savestack_ix
+ " Setting an EVAL scope, savestack=%"IVdf"\n", \
+ (IV)PL_savestack_ix)); lastcp = PL_savestack_ix
# define REGCP_UNWIND DEBUG_r(lastcp != PL_savestack_ix ? \
PerlIO_printf(Perl_debug_log, \
- " Clearing an EVAL scope, savestack=%i..%i\n", \
- lastcp, PL_savestack_ix) : 0); regcpblow(lastcp)
+ " Clearing an EVAL scope, savestack=%"IVdf"..%"IVdf"\n", \
+ (IV)lastcp, (IV)PL_savestack_ix) : 0); regcpblow(lastcp)
STATIC char *
-regcppop(void)
+S_regcppop(pTHX)
{
dTHR;
I32 i = SSPOPINT;
U32 paren = 0;
char *input;
- char *tmps;
+ I32 tmps;
assert(i == SAVEt_REGCONTEXT);
i = SSPOPINT;
input = (char *) SSPOPPTR;
@@ -153,34 +170,55 @@ regcppop(void)
for (i -= 3; i > 0; i -= 4) {
paren = (U32)SSPOPINT;
PL_reg_start_tmp[paren] = (char *) SSPOPPTR;
- PL_regstartp[paren] = (char *) SSPOPPTR;
- tmps = (char*)SSPOPPTR;
+ PL_regstartp[paren] = SSPOPINT;
+ tmps = SSPOPINT;
if (paren <= *PL_reglastparen)
PL_regendp[paren] = tmps;
DEBUG_r(
PerlIO_printf(Perl_debug_log,
- " restoring \\%d to %d(%d)..%d%s\n",
- paren, PL_regstartp[paren] - PL_regbol,
- PL_reg_start_tmp[paren] - PL_regbol,
- PL_regendp[paren] - PL_regbol,
+ " restoring \\%"UVuf" to %"IVdf"(%"IVdf")..%"IVdf"%s\n",
+ (UV)paren, (IV)PL_regstartp[paren],
+ (IV)(PL_reg_start_tmp[paren] - PL_bostr),
+ (IV)PL_regendp[paren],
(paren > *PL_reglastparen ? "(no)" : ""));
);
}
DEBUG_r(
if (*PL_reglastparen + 1 <= PL_regnpar) {
PerlIO_printf(Perl_debug_log,
- " restoring \\%d..\\%d to undef\n",
- *PL_reglastparen + 1, PL_regnpar);
+ " restoring \\%"IVdf"..\\%"IVdf" to undef\n",
+ (IV)(*PL_reglastparen + 1), (IV)PL_regnpar);
}
);
for (paren = *PL_reglastparen + 1; paren <= PL_regnpar; paren++) {
if (paren > PL_regsize)
- PL_regstartp[paren] = Nullch;
- PL_regendp[paren] = Nullch;
+ PL_regstartp[paren] = -1;
+ PL_regendp[paren] = -1;
}
return input;
}
+STATIC char *
+S_regcp_set_to(pTHX_ I32 ss)
+{
+ dTHR;
+ I32 tmp = PL_savestack_ix;
+
+ PL_savestack_ix = ss;
+ regcppop();
+ PL_savestack_ix = tmp;
+ return Nullch;
+}
+
+typedef struct re_cc_state
+{
+ I32 ss;
+ regnode *node;
+ struct re_cc_state *prev;
+ CURCUR *cc;
+ regexp *re;
+} re_cc_state;
+
#define regcpblow(cp) LEAVE_SCOPE(cp)
/*
@@ -191,7 +229,7 @@ regcppop(void)
- pregexec - match a regexp against a string
*/
I32
-pregexec(register regexp *prog, char *stringarg, register char *strend,
+Perl_pregexec(pTHX_ register regexp *prog, char *stringarg, register char *strend,
char *strbeg, I32 minend, SV *screamer, U32 nosave)
/* strend: pointer to null at end of string */
/* strbeg: real beginning of string */
@@ -202,226 +240,572 @@ pregexec(register regexp *prog, char *stringarg, register char *strend,
regexec_flags(prog, stringarg, strend, strbeg, minend, screamer, NULL,
nosave ? 0 : REXEC_COPY_STR);
}
-
-/*
- - regexec_flags - match a regexp against a string
- */
-I32
-regexec_flags(register regexp *prog, char *stringarg, register char *strend,
- char *strbeg, I32 minend, SV *screamer, void *data, U32 flags)
-/* strend: pointer to null at end of string */
-/* strbeg: real beginning of string */
-/* minend: end of match must be >=minend after stringarg. */
-/* data: May be used for some additional optimizations. */
-/* nosave: For optimizations. */
+
+STATIC void
+S_cache_re(pTHX_ regexp *prog)
{
dTHR;
- register char *s;
- register regnode *c;
- register char *startpos = stringarg;
- register I32 tmp;
- I32 minlen; /* must match at least this many chars */
- I32 dontbother = 0; /* how many characters not to try at end */
- CURCUR cc;
- I32 start_shift = 0; /* Offset of the start to find
- constant substr. */
- I32 end_shift = 0; /* Same for the end. */
- I32 scream_pos = -1; /* Internal iterator of scream. */
- char *scream_olds;
- SV* oreplsv = GvSV(PL_replgv);
-
- cc.cur = 0;
- cc.oldcc = 0;
- PL_regcc = &cc;
-
- PL_regprecomp = prog->precomp; /* Needed for error messages. */
+ PL_regprecomp = prog->precomp; /* Needed for FAIL. */
#ifdef DEBUGGING
- PL_regnarrate = PL_debug & 512;
PL_regprogram = prog->program;
#endif
+ PL_regnpar = prog->nparens;
+ PL_regdata = prog->data;
+ PL_reg_re = prog;
+}
- /* Be paranoid... */
- if (prog == NULL || startpos == NULL) {
- croak("NULL regexp parameter");
- return 0;
- }
+/*
+ * Need to implement the following flags for reg_anch:
+ *
+ * USE_INTUIT_NOML - Useful to call re_intuit_start() first
+ * USE_INTUIT_ML
+ * INTUIT_AUTORITATIVE_NOML - Can trust a positive answer
+ * INTUIT_AUTORITATIVE_ML
+ * INTUIT_ONCE_NOML - Intuit can match in one location only.
+ * INTUIT_ONCE_ML
+ *
+ * Another flag for this function: SECOND_TIME (so that float substrs
+ * with giant delta may be not rechecked).
+ */
- minlen = prog->minlen;
- if (strend - startpos < minlen) goto phooey;
+/* Assumptions: if ANCH_GPOS, then strpos is anchored. XXXX Check GPOS logic */
- if (startpos == strbeg) /* is ^ valid at stringarg? */
- PL_regprev = '\n';
- else {
- PL_regprev = stringarg[-1];
- if (!PL_multiline && PL_regprev == '\n')
- PL_regprev = '\0'; /* force ^ to NOT match */
- }
+/* If SCREAM, then SvPVX(sv) should be compatible with strpos and strend.
+ Otherwise, only SvCUR(sv) is used to get strbeg. */
- /* Check validity of program. */
- if (UCHARAT(prog->program) != MAGIC) {
- FAIL("corrupted regexp program");
- }
+/* XXXX We assume that strpos is strbeg unless sv. */
- PL_regnpar = prog->nparens;
- PL_reg_flags = 0;
- PL_reg_eval_set = 0;
+/* XXXX Some places assume that there is a fixed substring.
+ An update may be needed if optimizer marks as "INTUITable"
+ RExen without fixed substrings. Similarly, it is assumed that
+ lengths of all the strings are no more than minlen, thus they
+ cannot come from lookahead.
+ (Or minlen should take into account lookahead.) */
- /* If there is a "must appear" string, look for it. */
- s = startpos;
- if (!(flags & REXEC_CHECKED)
- && prog->check_substr != Nullsv &&
- !(prog->reganch & ROPT_ANCH_GPOS) &&
- (!(prog->reganch & (ROPT_ANCH_BOL | ROPT_ANCH_MBOL))
- || (PL_multiline && prog->check_substr == prog->anchored_substr)) )
- {
- start_shift = prog->check_offset_min;
- /* Should be nonnegative! */
- end_shift = minlen - start_shift - SvCUR(prog->check_substr);
- if (screamer) {
- if (PL_screamfirst[BmRARE(prog->check_substr)] >= 0)
- s = screaminstr(screamer, prog->check_substr,
- start_shift + (stringarg - strbeg),
- end_shift, &scream_pos, 0);
- else
- s = Nullch;
- scream_olds = s;
- }
- else
- s = fbm_instr((unsigned char*)s + start_shift,
- (unsigned char*)strend - end_shift,
- prog->check_substr, 0);
- if (!s) {
- ++BmUSEFUL(prog->check_substr); /* hooray */
- goto phooey; /* not present */
- } else if ((s - stringarg) > prog->check_offset_max) {
- ++BmUSEFUL(prog->check_substr); /* hooray/2 */
- s -= prog->check_offset_max;
- } else if (!prog->naughty
- && --BmUSEFUL(prog->check_substr) < 0
- && prog->check_substr == prog->float_substr) { /* boo */
- SvREFCNT_dec(prog->check_substr);
- prog->check_substr = Nullsv; /* disable */
- prog->float_substr = Nullsv; /* clear */
- s = startpos;
- } else s = startpos;
- }
+/* A failure to find a constant substring means that there is no need to make
+ an expensive call to REx engine, thus we celebrate a failure. Similarly,
+ finding a substring too deep into the string means that less calls to
+ regtry() should be needed.
- /* Mark beginning of line for ^ and lookbehind. */
- PL_regbol = startpos;
- PL_bostr = strbeg;
+ REx compiler's optimizer found 4 possible hints:
+ a) Anchored substring;
+ b) Fixed substring;
+ c) Whether we are anchored (beginning-of-line or \G);
+ d) First node (of those at offset 0) which may distingush positions;
+ We use a)b)d) and multiline-part of c), and try to find a position in the
+ string which does not contradict any of them.
+ */
- /* Mark end of line for $ (and such) */
- PL_regeol = strend;
+/* Most of decisions we do here should have been done at compile time.
+ The nodes of the REx which we used for the search should have been
+ deleted from the finite automaton. */
- /* see how far we have to get to not match where we matched before */
- PL_regtill = startpos+minend;
+char *
+Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
+ char *strend, U32 flags, re_scream_pos_data *data)
+{
+ register I32 start_shift;
+ /* Should be nonnegative! */
+ register I32 end_shift;
+ register char *s;
+ register SV *check;
+ char *t;
+ I32 ml_anch;
+ char *tmp;
+ register char *other_last = Nullch; /* other substr checked before this */
+ char *check_at; /* check substr found at this pos */
+#ifdef DEBUGGING
+ char *i_strpos = strpos;
+#endif
- DEBUG_r(
- PerlIO_printf(Perl_debug_log,
- "Matching `%.60s%s' against `%.*s%s'\n",
- prog->precomp,
+ DEBUG_r( if (!PL_colorset) reginitcolors() );
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ "%sGuessing start of match, REx%s `%s%.60s%s%s' against `%s%.*s%s%s'...\n",
+ PL_colors[4],PL_colors[5],PL_colors[0],
+ prog->precomp,
+ PL_colors[1],
(strlen(prog->precomp) > 60 ? "..." : ""),
- (strend - startpos > 60 ? 60 : strend - startpos),
- startpos,
- (strend - startpos > 60 ? "..." : ""))
+ PL_colors[0],
+ (int)(strend - strpos > 60 ? 60 : strend - strpos),
+ strpos, PL_colors[1],
+ (strend - strpos > 60 ? "..." : ""))
);
- /* Simplest case: anchored match need be tried only once. */
- /* [unless only anchor is BOL and multiline is set] */
- if (prog->reganch & ROPT_ANCH) {
- if (regtry(prog, startpos))
- goto got_it;
- else if (!(prog->reganch & ROPT_ANCH_GPOS) &&
- (PL_multiline || (prog->reganch & ROPT_IMPLICIT)
- || (prog->reganch & ROPT_ANCH_MBOL)))
- {
- if (minlen)
- dontbother = minlen - 1;
- strend -= dontbother;
- /* for multiline we only have to try after newlines */
- if (s > startpos)
- s--;
- while (s < strend) {
- if (*s++ == '\n') {
- if (s < strend && regtry(prog, s))
- goto got_it;
+ if (prog->minlen > strend - strpos) {
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "String too short...\n"));
+ goto fail;
+ }
+ check = prog->check_substr;
+ if (prog->reganch & ROPT_ANCH) { /* Match at beg-of-str or after \n */
+ ml_anch = !( (prog->reganch & ROPT_ANCH_SINGLE)
+ || ( (prog->reganch & ROPT_ANCH_BOL)
+ && !PL_multiline ) ); /* Check after \n? */
+
+ if ((prog->check_offset_min == prog->check_offset_max) && !ml_anch) {
+ /* Substring at constant offset from beg-of-str... */
+ I32 slen;
+
+ if ( !(prog->reganch & ROPT_ANCH_GPOS) /* Checked by the caller */
+ && (sv && (strpos + SvCUR(sv) != strend)) ) {
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "Not at start...\n"));
+ goto fail;
+ }
+ PL_regeol = strend; /* Used in HOP() */
+ s = HOPc(strpos, prog->check_offset_min);
+ if (SvTAIL(check)) {
+ slen = SvCUR(check); /* >= 1 */
+
+ if ( strend - s > slen || strend - s < slen - 1
+ || (strend - s == slen && strend[-1] != '\n')) {
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "String too long...\n"));
+ goto fail_finish;
+ }
+ /* Now should match s[0..slen-2] */
+ slen--;
+ if (slen && (*SvPVX(check) != *s
+ || (slen > 1
+ && memNE(SvPVX(check), s, slen)))) {
+ report_neq:
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "String not equal...\n"));
+ goto fail_finish;
}
}
+ else if (*SvPVX(check) != *s
+ || ((slen = SvCUR(check)) > 1
+ && memNE(SvPVX(check), s, slen)))
+ goto report_neq;
+ goto success_at_start;
+ }
+ /* Match is anchored, but substr is not anchored wrt beg-of-str. */
+ s = strpos;
+ start_shift = prog->check_offset_min; /* okay to underestimate on CC */
+ end_shift = prog->minlen - start_shift -
+ CHR_SVLEN(check) + (SvTAIL(check) != 0);
+ if (!ml_anch) {
+ I32 end = prog->check_offset_max + CHR_SVLEN(check)
+ - (SvTAIL(check) != 0);
+ I32 eshift = strend - s - end;
+
+ if (end_shift < eshift)
+ end_shift = eshift;
}
- goto phooey;
+ }
+ else { /* Can match at random position */
+ ml_anch = 0;
+ s = strpos;
+ start_shift = prog->check_offset_min; /* okay to underestimate on CC */
+ /* Should be nonnegative! */
+ end_shift = prog->minlen - start_shift -
+ CHR_SVLEN(check) + (SvTAIL(check) != 0);
}
- /* Messy cases: unanchored match. */
- if (prog->anchored_substr && prog->reganch & ROPT_SKIP) {
- /* we have /x+whatever/ */
- /* it must be a one character string */
- char ch = SvPVX(prog->anchored_substr)[0];
- while (s < strend) {
- if (*s == ch) {
- if (regtry(prog, s)) goto got_it;
- s++;
- while (s < strend && *s == ch)
- s++;
+#ifdef DEBUGGING /* 7/99: reports of failure (with the older version) */
+ if (end_shift < 0)
+ Perl_croak(aTHX_ "panic: end_shift");
+#endif
+
+ restart:
+ /* Find a possible match in the region s..strend by looking for
+ the "check" substring in the region corrected by start/end_shift. */
+ if (flags & REXEC_SCREAM) {
+ char *strbeg = SvPVX(sv); /* XXXX Assume PV_force() on SCREAM! */
+ I32 p = -1; /* Internal iterator of scream. */
+ I32 *pp = data ? data->scream_pos : &p;
+
+ if (PL_screamfirst[BmRARE(check)] >= 0
+ || ( BmRARE(check) == '\n'
+ && (BmPREVIOUS(check) == SvCUR(check) - 1)
+ && SvTAIL(check) ))
+ s = screaminstr(sv, check,
+ start_shift + (s - strbeg), end_shift, pp, 0);
+ else
+ goto fail_finish;
+ if (data)
+ *data->scream_olds = s;
+ }
+ else
+ s = fbm_instr((unsigned char*)s + start_shift,
+ (unsigned char*)strend - end_shift,
+ check, PL_multiline ? FBMrf_MULTILINE : 0);
+
+ /* Update the count-of-usability, remove useless subpatterns,
+ unshift s. */
+
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%s %s substr `%s%.*s%s'%s%s",
+ (s ? "Found" : "Did not find"),
+ ((check == prog->anchored_substr) ? "anchored" : "floating"),
+ PL_colors[0],
+ (int)(SvCUR(check) - (SvTAIL(check)!=0)),
+ SvPVX(check),
+ PL_colors[1], (SvTAIL(check) ? "$" : ""),
+ (s ? " at offset " : "...\n") ) );
+
+ if (!s)
+ goto fail_finish;
+
+ check_at = s;
+
+ /* Finish the diagnostic message */
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%ld...\n", (long)(s - i_strpos)) );
+
+ /* Got a candidate. Check MBOL anchoring, and the *other* substr.
+ Start with the other substr.
+ XXXX no SCREAM optimization yet - and a very coarse implementation
+ XXXX /ttx+/ results in anchored=`ttx', floating=`x'. floating will
+ *always* match. Probably should be marked during compile...
+ Probably it is right to do no SCREAM here...
+ */
+
+ if (prog->float_substr && prog->anchored_substr) {
+ /* Take into account the "other" substring. */
+ /* XXXX May be hopelessly wrong for UTF... */
+ if (!other_last)
+ other_last = strpos;
+ if (check == prog->float_substr) {
+ do_other_anchored:
+ {
+ char *last = s - start_shift, *last1, *last2;
+ char *s1 = s;
+
+ tmp = PL_bostr;
+ t = s - prog->check_offset_max;
+ if (s - strpos > prog->check_offset_max /* signed-corrected t > strpos */
+ && (!(prog->reganch & ROPT_UTF8)
+ || (PL_bostr = strpos, /* Used in regcopmaybe() */
+ (t = reghopmaybe_c(s, -(prog->check_offset_max)))
+ && t > strpos)))
+ /* EMPTY */;
+ else
+ t = strpos;
+ t += prog->anchored_offset;
+ if (t < other_last) /* These positions already checked */
+ t = other_last;
+ PL_bostr = tmp;
+ last2 = last1 = strend - prog->minlen;
+ if (last < last1)
+ last1 = last;
+ /* XXXX It is not documented what units *_offsets are in. Assume bytes. */
+ /* On end-of-str: see comment below. */
+ s = fbm_instr((unsigned char*)t,
+ (unsigned char*)last1 + prog->anchored_offset
+ + SvCUR(prog->anchored_substr)
+ - (SvTAIL(prog->anchored_substr)!=0),
+ prog->anchored_substr, PL_multiline ? FBMrf_MULTILINE : 0);
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%s anchored substr `%s%.*s%s'%s",
+ (s ? "Found" : "Contradicts"),
+ PL_colors[0],
+ (int)(SvCUR(prog->anchored_substr)
+ - (SvTAIL(prog->anchored_substr)!=0)),
+ SvPVX(prog->anchored_substr),
+ PL_colors[1], (SvTAIL(prog->anchored_substr) ? "$" : "")));
+ if (!s) {
+ if (last1 >= last2) {
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ ", giving up...\n"));
+ goto fail_finish;
+ }
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ ", trying floating at offset %ld...\n",
+ (long)(s1 + 1 - i_strpos)));
+ PL_regeol = strend; /* Used in HOP() */
+ other_last = last1 + prog->anchored_offset + 1;
+ s = HOPc(last, 1);
+ goto restart;
+ }
+ else {
+ DEBUG_r(PerlIO_printf(Perl_debug_log, " at offset %ld...\n",
+ (long)(s - i_strpos)));
+ t = s - prog->anchored_offset;
+ other_last = s + 1;
+ s = s1;
+ if (t == strpos)
+ goto try_at_start;
+ goto try_at_offset;
+ }
}
- s++;
+ }
+ else { /* Take into account the floating substring. */
+ char *last, *last1;
+ char *s1 = s;
+
+ t = s - start_shift;
+ last1 = last = strend - prog->minlen + prog->float_min_offset;
+ if (last - t > prog->float_max_offset)
+ last = t + prog->float_max_offset;
+ s = t + prog->float_min_offset;
+ if (s < other_last)
+ s = other_last;
+ /* XXXX It is not documented what units *_offsets are in. Assume bytes. */
+ /* fbm_instr() takes into account exact value of end-of-str
+ if the check is SvTAIL(ed). Since false positives are OK,
+ and end-of-str is not later than strend we are OK. */
+ s = fbm_instr((unsigned char*)s,
+ (unsigned char*)last + SvCUR(prog->float_substr)
+ - (SvTAIL(prog->float_substr)!=0),
+ prog->float_substr, PL_multiline ? FBMrf_MULTILINE : 0);
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%s floating substr `%s%.*s%s'%s",
+ (s ? "Found" : "Contradicts"),
+ PL_colors[0],
+ (int)(SvCUR(prog->float_substr)
+ - (SvTAIL(prog->float_substr)!=0)),
+ SvPVX(prog->float_substr),
+ PL_colors[1], (SvTAIL(prog->float_substr) ? "$" : "")));
+ if (!s) {
+ if (last1 == last) {
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ ", giving up...\n"));
+ goto fail_finish;
+ }
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ ", trying anchored starting at offset %ld...\n",
+ (long)(s1 + 1 - i_strpos)));
+ other_last = last + 1;
+ PL_regeol = strend; /* Used in HOP() */
+ s = HOPc(t, 1);
+ goto restart;
+ }
+ else {
+ DEBUG_r(PerlIO_printf(Perl_debug_log, " at offset %ld...\n",
+ (long)(s - i_strpos)));
+ other_last = s + 1;
+ s = s1;
+ if (t == strpos)
+ goto try_at_start;
+ goto try_at_offset;
+ }
}
}
- /*SUPPRESS 560*/
- else if (prog->anchored_substr != Nullsv
- || (prog->float_substr != Nullsv
- && prog->float_max_offset < strend - s)) {
- SV *must = prog->anchored_substr
- ? prog->anchored_substr : prog->float_substr;
- I32 back_max =
- prog->anchored_substr ? prog->anchored_offset : prog->float_max_offset;
- I32 back_min =
- prog->anchored_substr ? prog->anchored_offset : prog->float_min_offset;
- I32 delta = back_max - back_min;
- char *last = strend - SvCUR(must) - back_min; /* Cannot start after this */
- char *last1 = s - 1; /* Last position checked before */
- /* XXXX check_substr already used to find `s', can optimize if
- check_substr==must. */
- scream_pos = -1;
- dontbother = end_shift;
- strend -= dontbother;
- while ( (s <= last) &&
- (screamer
- ? (s = screaminstr(screamer, must, s + back_min - strbeg,
- end_shift, &scream_pos, 0))
- : (s = fbm_instr((unsigned char*)s + back_min,
- (unsigned char*)strend, must, 0))) ) {
- if (s - back_max > last1) {
- last1 = s - back_min;
- s = s - back_max;
- } else {
- char *t = last1 + 1;
+ t = s - prog->check_offset_max;
+ tmp = PL_bostr;
+ if (s - strpos > prog->check_offset_max /* signed-corrected t > strpos */
+ && (!(prog->reganch & ROPT_UTF8)
+ || (PL_bostr = strpos, /* Used in regcopmaybe() */
+ ((t = reghopmaybe_c(s, -(prog->check_offset_max)))
+ && t > strpos)))) {
+ PL_bostr = tmp;
+ /* Fixed substring is found far enough so that the match
+ cannot start at strpos. */
+ try_at_offset:
+ if (ml_anch && t[-1] != '\n') {
+ /* Eventually fbm_*() should handle this, but often
+ anchored_offset is not 0, so this check will not be wasted. */
+ /* XXXX In the code below we prefer to look for "^" even in
+ presence of anchored substrings. And we search even
+ beyond the found float position. These pessimizations
+ are historical artefacts only. */
+ find_anchor:
+ while (t < strend - prog->minlen) {
+ if (*t == '\n') {
+ if (t < s - prog->check_offset_min) {
+ if (prog->anchored_substr) {
+ /* We definitely contradict the found anchored
+ substr. Due to the above check we do not
+ contradict "check" substr.
+ Thus we can arrive here only if check substr
+ is float. Redo checking for "other"=="fixed".
+ */
+ strpos = t + 1;
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m at offset %ld, rescanning for anchored from offset %ld...\n",
+ PL_colors[0],PL_colors[1], (long)(strpos - i_strpos), (long)(strpos - i_strpos + prog->anchored_offset)));
+ goto do_other_anchored;
+ }
+ s = t + 1;
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m at offset %ld...\n",
+ PL_colors[0],PL_colors[1], (long)(s - i_strpos)));
+ goto set_useful;
+ }
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m, restarting at offset %ld...\n",
+ PL_colors[0],PL_colors[1], (long)(t + 1 - i_strpos)));
+ strpos = s = t + 1;
+ goto restart;
+ }
+ t++;
+ }
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "Did not find /%s^%s/m...\n",
+ PL_colors[0],PL_colors[1]));
+ goto fail_finish;
+ }
+ s = t;
+ set_useful:
+ ++BmUSEFUL(prog->check_substr); /* hooray/5 */
+ }
+ else {
+ PL_bostr = tmp;
+ /* The found string does not prohibit matching at beg-of-str
+ - no optimization of calling REx engine can be performed,
+ unless it was an MBOL and we are not after MBOL. */
+ try_at_start:
+ /* Even in this situation we may use MBOL flag if strpos is offset
+ wrt the start of the string. */
+ if (ml_anch && sv
+ && (strpos + SvCUR(sv) != strend) && strpos[-1] != '\n'
+ /* May be due to an implicit anchor of m{.*foo} */
+ && !(prog->reganch & ROPT_IMPLICIT))
+ {
+ t = strpos;
+ goto find_anchor;
+ }
+ DEBUG_r( if (ml_anch)
+ PerlIO_printf(Perl_debug_log, "Does not contradict /%s^%s/m...\n",
+ PL_colors[0],PL_colors[1]);
+ );
+ success_at_start:
+ if (!(prog->reganch & ROPT_NAUGHTY) /* XXXX If strpos moved? */
+ && prog->check_substr /* Could be deleted already */
+ && --BmUSEFUL(prog->check_substr) < 0
+ && prog->check_substr == prog->float_substr)
+ {
+ /* If flags & SOMETHING - do not do it many times on the same match */
+ SvREFCNT_dec(prog->check_substr);
+ prog->check_substr = Nullsv; /* disable */
+ prog->float_substr = Nullsv; /* clear */
+ s = strpos;
+ /* XXXX This is a remnant of the old implementation. It
+ looks wasteful, since now INTUIT can use many
+ other heuristics. */
+ prog->reganch &= ~RE_USE_INTUIT;
+ }
+ else
+ s = strpos;
+ }
- last1 = s - back_min;
- s = t;
+ /* Last resort... */
+ /* XXXX BmUSEFUL already changed, maybe multiple change is meaningful... */
+ if (prog->regstclass) {
+ /* minlen == 0 is possible if regstclass is \b or \B,
+ and the fixed substr is ''$.
+ Since minlen is already taken into account, s+1 is before strend;
+ accidentally, minlen >= 1 guaranties no false positives at s + 1
+ even for \b or \B. But (minlen? 1 : 0) below assumes that
+ regstclass does not come from lookahead... */
+ /* If regstclass takes bytelength more than 1: If charlength==1, OK.
+ This leaves EXACTF only, which is dealt with in find_byclass(). */
+ int cl_l = (PL_regkind[(U8)OP(prog->regstclass)] == EXACT
+ ? STR_LEN(prog->regstclass)
+ : 1);
+ char *endpos = (prog->anchored_substr || ml_anch)
+ ? s + (prog->minlen? cl_l : 0)
+ : (prog->float_substr ? check_at - start_shift + cl_l
+ : strend) ;
+ char *startpos = sv && SvPOK(sv) ? strend - SvCUR(sv) : s;
+
+ t = s;
+ if (prog->reganch & ROPT_UTF8) {
+ PL_regdata = prog->data; /* Used by REGINCLASS UTF logic */
+ PL_bostr = startpos;
+ }
+ s = find_byclass(prog, prog->regstclass, s, endpos, startpos, 1);
+ if (!s) {
+#ifdef DEBUGGING
+ char *what;
+#endif
+ if (endpos == strend) {
+ DEBUG_r( PerlIO_printf(Perl_debug_log,
+ "Could not match STCLASS...\n") );
+ goto fail;
}
- while (s <= last1) {
- if (regtry(prog, s))
- goto got_it;
- s++;
+ DEBUG_r( PerlIO_printf(Perl_debug_log,
+ "This position contradicts STCLASS...\n") );
+ if ((prog->reganch & ROPT_ANCH) && !ml_anch)
+ goto fail;
+ /* Contradict one of substrings */
+ if (prog->anchored_substr) {
+ if (prog->anchored_substr == check) {
+ DEBUG_r( what = "anchored" );
+ hop_and_restart:
+ PL_regeol = strend; /* Used in HOP() */
+ s = HOPc(t, 1);
+ if (s + start_shift + end_shift > strend) {
+ /* XXXX Should be taken into account earlier? */
+ DEBUG_r( PerlIO_printf(Perl_debug_log,
+ "Could not match STCLASS...\n") );
+ goto fail;
+ }
+ DEBUG_r( PerlIO_printf(Perl_debug_log,
+ "Trying %s substr starting at offset %ld...\n",
+ what, (long)(s + start_shift - i_strpos)) );
+ goto restart;
+ }
+ /* Have both, check_string is floating */
+ if (t + start_shift >= check_at) /* Contradicts floating=check */
+ goto retry_floating_check;
+ /* Recheck anchored substring, but not floating... */
+ s = check_at;
+ DEBUG_r( PerlIO_printf(Perl_debug_log,
+ "Trying anchored substr starting at offset %ld...\n",
+ (long)(other_last - i_strpos)) );
+ goto do_other_anchored;
+ }
+ /* Another way we could have checked stclass at the
+ current position only: */
+ if (ml_anch) {
+ s = t = t + 1;
+ DEBUG_r( PerlIO_printf(Perl_debug_log,
+ "Trying /^/m starting at offset %ld...\n",
+ (long)(t - i_strpos)) );
+ goto try_at_offset;
}
+ if (!prog->float_substr) /* Could have been deleted */
+ goto fail;
+ /* Check is floating subtring. */
+ retry_floating_check:
+ t = check_at - start_shift;
+ DEBUG_r( what = "floating" );
+ goto hop_and_restart;
}
- goto phooey;
- } else if (c = prog->regstclass) {
+ DEBUG_r( if (t != s)
+ PerlIO_printf(Perl_debug_log,
+ "By STCLASS: moving %ld --> %ld\n",
+ (long)(t - i_strpos), (long)(s - i_strpos));
+ else
+ PerlIO_printf(Perl_debug_log,
+ "Does not contradict STCLASS...\n") );
+ }
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%sGuessed:%s match at offset %ld\n",
+ PL_colors[4], PL_colors[5], (long)(s - i_strpos)) );
+ return s;
+
+ fail_finish: /* Substring not found */
+ if (prog->check_substr) /* could be removed already */
+ BmUSEFUL(prog->check_substr) += 5; /* hooray */
+ fail:
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%sMatch rejected by optimizer%s\n",
+ PL_colors[4],PL_colors[5]));
+ return Nullch;
+}
+
+/* We know what class REx starts with. Try to find this position... */
+STATIC char *
+S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *startpos, I32 norun)
+{
I32 doevery = (prog->reganch & ROPT_SKIP) == 0;
- char *Class;
+ char *m;
+ STRLEN ln;
+ unsigned int c1;
+ unsigned int c2;
+ char *e;
+ register I32 tmp = 1; /* Scratch variable? */
- if (minlen)
- dontbother = minlen - 1;
- strend -= dontbother; /* don't bother with what can't match */
- tmp = 1;
/* We know what class it must start with. */
switch (OP(c)) {
+ case ANYOFUTF8:
+ while (s < strend) {
+ if (REGINCLASSUTF8(c, (U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case ANYOF:
- Class = (char *) OPERAND(c);
while (s < strend) {
- if (REGINCLASS(Class, *s)) {
- if (tmp && regtry(prog, s))
+ if (REGINCLASS(c, *(U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -431,47 +815,120 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case EXACTF:
+ m = STRING(c);
+ ln = STR_LEN(c);
+ c1 = *(U8*)m;
+ c2 = PL_fold[c1];
+ goto do_exactf;
+ case EXACTFL:
+ m = STRING(c);
+ ln = STR_LEN(c);
+ c1 = *(U8*)m;
+ c2 = PL_fold_locale[c1];
+ do_exactf:
+ e = strend - ln;
+
+ if (norun && e < s)
+ e = s; /* Due to minlen logic of intuit() */
+ /* Here it is NOT UTF! */
+ if (c1 == c2) {
+ while (s <= e) {
+ if ( *(U8*)s == c1
+ && (ln == 1 || !(OP(c) == EXACTF
+ ? ibcmp(s, m, ln)
+ : ibcmp_locale(s, m, ln)))
+ && (norun || regtry(prog, s)) )
+ goto got_it;
+ s++;
+ }
+ } else {
+ while (s <= e) {
+ if ( (*(U8*)s == c1 || *(U8*)s == c2)
+ && (ln == 1 || !(OP(c) == EXACTF
+ ? ibcmp(s, m, ln)
+ : ibcmp_locale(s, m, ln)))
+ && (norun || regtry(prog, s)) )
+ goto got_it;
+ s++;
+ }
+ }
+ break;
case BOUNDL:
PL_reg_flags |= RF_tainted;
/* FALL THROUGH */
case BOUND:
- if (minlen)
- dontbother++,strend--;
- tmp = (s != startpos) ? UCHARAT(s - 1) : PL_regprev;
+ tmp = (s != startpos) ? UCHARAT(s - 1) : '\n';
tmp = ((OP(c) == BOUND ? isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
while (s < strend) {
if (tmp == !(OP(c) == BOUND ? isALNUM(*s) : isALNUM_LC(*s))) {
tmp = !tmp;
- if (regtry(prog, s))
+ if ((norun || regtry(prog, s)))
goto got_it;
}
s++;
}
- if ((minlen || tmp) && regtry(prog,s))
+ if ((!prog->minlen && tmp) && (norun || regtry(prog, s)))
+ goto got_it;
+ break;
+ case BOUNDLUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case BOUNDUTF8:
+ tmp = (I32)(s != startpos) ? utf8_to_uv(reghop((U8*)s, -1), 0) : '\n';
+ tmp = ((OP(c) == BOUNDUTF8 ? isALNUM_uni(tmp) : isALNUM_LC_uni(tmp)) != 0);
+ while (s < strend) {
+ if (tmp == !(OP(c) == BOUNDUTF8 ?
+ swash_fetch(PL_utf8_alnum, (U8*)s) :
+ isALNUM_LC_utf8((U8*)s)))
+ {
+ tmp = !tmp;
+ if ((norun || regtry(prog, s)))
+ goto got_it;
+ }
+ s += UTF8SKIP(s);
+ }
+ if ((!prog->minlen && tmp) && (norun || regtry(prog, s)))
goto got_it;
break;
case NBOUNDL:
PL_reg_flags |= RF_tainted;
/* FALL THROUGH */
case NBOUND:
- if (minlen)
- dontbother++,strend--;
- tmp = (s != startpos) ? UCHARAT(s - 1) : PL_regprev;
+ tmp = (s != startpos) ? UCHARAT(s - 1) : '\n';
tmp = ((OP(c) == NBOUND ? isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
while (s < strend) {
if (tmp == !(OP(c) == NBOUND ? isALNUM(*s) : isALNUM_LC(*s)))
tmp = !tmp;
- else if (regtry(prog, s))
+ else if ((norun || regtry(prog, s)))
goto got_it;
s++;
}
- if ((minlen || !tmp) && regtry(prog,s))
+ if ((!prog->minlen && !tmp) && (norun || regtry(prog, s)))
+ goto got_it;
+ break;
+ case NBOUNDLUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case NBOUNDUTF8:
+ tmp = (I32)(s != startpos) ? utf8_to_uv(reghop((U8*)s, -1), 0) : '\n';
+ tmp = ((OP(c) == NBOUNDUTF8 ? isALNUM_uni(tmp) : isALNUM_LC_uni(tmp)) != 0);
+ while (s < strend) {
+ if (tmp == !(OP(c) == NBOUNDUTF8 ?
+ swash_fetch(PL_utf8_alnum, (U8*)s) :
+ isALNUM_LC_utf8((U8*)s)))
+ tmp = !tmp;
+ else if ((norun || regtry(prog, s)))
+ goto got_it;
+ s += UTF8SKIP(s);
+ }
+ if ((!prog->minlen && !tmp) && (norun || regtry(prog, s)))
goto got_it;
break;
case ALNUM:
while (s < strend) {
if (isALNUM(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -481,11 +938,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case ALNUMUTF8:
+ while (s < strend) {
+ if (swash_fetch(PL_utf8_alnum, (U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case ALNUML:
PL_reg_flags |= RF_tainted;
while (s < strend) {
if (isALNUM_LC(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -495,10 +965,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case ALNUMLUTF8:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (isALNUM_LC_utf8((U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case NALNUM:
while (s < strend) {
if (!isALNUM(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -508,11 +992,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case NALNUMUTF8:
+ while (s < strend) {
+ if (!swash_fetch(PL_utf8_alnum, (U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case NALNUML:
PL_reg_flags |= RF_tainted;
while (s < strend) {
if (!isALNUM_LC(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -522,10 +1019,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case NALNUMLUTF8:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (!isALNUM_LC_utf8((U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case SPACE:
while (s < strend) {
if (isSPACE(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -535,11 +1046,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case SPACEUTF8:
+ while (s < strend) {
+ if (*s == ' ' || swash_fetch(PL_utf8_space,(U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case SPACEL:
PL_reg_flags |= RF_tainted;
while (s < strend) {
if (isSPACE_LC(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -549,10 +1073,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case SPACELUTF8:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (*s == ' ' || isSPACE_LC_utf8((U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case NSPACE:
while (s < strend) {
if (!isSPACE(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -562,11 +1100,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case NSPACEUTF8:
+ while (s < strend) {
+ if (!(*s == ' ' || swash_fetch(PL_utf8_space,(U8*)s))) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case NSPACEL:
PL_reg_flags |= RF_tainted;
while (s < strend) {
if (!isSPACE_LC(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -576,10 +1127,24 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case NSPACELUTF8:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (!(*s == ' ' || isSPACE_LC_utf8((U8*)s))) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case DIGIT:
while (s < strend) {
if (isDIGIT(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -589,10 +1154,51 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case DIGITUTF8:
+ while (s < strend) {
+ if (swash_fetch(PL_utf8_digit,(U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
+ case DIGITL:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (isDIGIT_LC(*s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s++;
+ }
+ break;
+ case DIGITLUTF8:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (isDIGIT_LC_utf8((U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
case NDIGIT:
while (s < strend) {
if (!isDIGIT(*s)) {
- if (tmp && regtry(prog, s))
+ if (tmp && (norun || regtry(prog, s)))
goto got_it;
else
tmp = doevery;
@@ -602,82 +1208,414 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend,
s++;
}
break;
+ case NDIGITUTF8:
+ while (s < strend) {
+ if (!swash_fetch(PL_utf8_digit,(U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
+ case NDIGITL:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (!isDIGIT_LC(*s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s++;
+ }
+ break;
+ case NDIGITLUTF8:
+ PL_reg_flags |= RF_tainted;
+ while (s < strend) {
+ if (!isDIGIT_LC_utf8((U8*)s)) {
+ if (tmp && (norun || regtry(prog, s)))
+ goto got_it;
+ else
+ tmp = doevery;
+ }
+ else
+ tmp = 1;
+ s += UTF8SKIP(s);
+ }
+ break;
+ default:
+ Perl_croak(aTHX_ "panic: unknown regstclass %d", (int)OP(c));
+ break;
}
+ return 0;
+ got_it:
+ return s;
+}
+
+/*
+ - regexec_flags - match a regexp against a string
+ */
+I32
+Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *strend,
+ char *strbeg, I32 minend, SV *sv, void *data, U32 flags)
+/* strend: pointer to null at end of string */
+/* strbeg: real beginning of string */
+/* minend: end of match must be >=minend after stringarg. */
+/* data: May be used for some additional optimizations. */
+/* nosave: For optimizations. */
+{
+ dTHR;
+ register char *s;
+ register regnode *c;
+ register char *startpos = stringarg;
+ I32 minlen; /* must match at least this many chars */
+ I32 dontbother = 0; /* how many characters not to try at end */
+ /* I32 start_shift = 0; */ /* Offset of the start to find
+ constant substr. */ /* CC */
+ I32 end_shift = 0; /* Same for the end. */ /* CC */
+ I32 scream_pos = -1; /* Internal iterator of scream. */
+ char *scream_olds;
+ SV* oreplsv = GvSV(PL_replgv);
+
+ PL_regcc = 0;
+
+ cache_re(prog);
+#ifdef DEBUGGING
+ PL_regnarrate = PL_debug & 512;
+#endif
+
+ /* Be paranoid... */
+ if (prog == NULL || startpos == NULL) {
+ Perl_croak(aTHX_ "NULL regexp parameter");
+ return 0;
+ }
+
+ minlen = prog->minlen;
+ if (strend - startpos < minlen) goto phooey;
+
+ if (startpos == strbeg) /* is ^ valid at stringarg? */
+ PL_regprev = '\n';
+ else {
+ PL_regprev = (U32)stringarg[-1];
+ if (!PL_multiline && PL_regprev == '\n')
+ PL_regprev = '\0'; /* force ^ to NOT match */
+ }
+
+ /* Check validity of program. */
+ if (UCHARAT(prog->program) != REG_MAGIC) {
+ Perl_croak(aTHX_ "corrupted regexp program");
+ }
+
+ PL_reg_flags = 0;
+ PL_reg_eval_set = 0;
+ PL_reg_maxiter = 0;
+
+ if (prog->reganch & ROPT_UTF8)
+ PL_reg_flags |= RF_utf8;
+
+ /* Mark beginning of line for ^ and lookbehind. */
+ PL_regbol = startpos;
+ PL_bostr = strbeg;
+ PL_reg_sv = sv;
+
+ /* Mark end of line for $ (and such) */
+ PL_regeol = strend;
+
+ /* see how far we have to get to not match where we matched before */
+ PL_regtill = startpos+minend;
+
+ /* We start without call_cc context. */
+ PL_reg_call_cc = 0;
+
+ /* If there is a "must appear" string, look for it. */
+ s = startpos;
+
+ if (prog->reganch & ROPT_GPOS_SEEN) { /* Need to have PL_reg_ganch */
+ MAGIC *mg;
+
+ if (flags & REXEC_IGNOREPOS) /* Means: check only at start */
+ PL_reg_ganch = startpos;
+ else if (sv && SvTYPE(sv) >= SVt_PVMG
+ && SvMAGIC(sv)
+ && (mg = mg_find(sv, 'g')) && mg->mg_len >= 0) {
+ PL_reg_ganch = strbeg + mg->mg_len; /* Defined pos() */
+ if (prog->reganch & ROPT_ANCH_GPOS) {
+ if (s > PL_reg_ganch)
+ goto phooey;
+ s = PL_reg_ganch;
+ }
+ }
+ else /* pos() not defined */
+ PL_reg_ganch = strbeg;
+ }
+
+ if (!(flags & REXEC_CHECKED) && prog->check_substr != Nullsv) {
+ re_scream_pos_data d;
+
+ d.scream_olds = &scream_olds;
+ d.scream_pos = &scream_pos;
+ s = re_intuit_start(prog, sv, s, strend, flags, &d);
+ if (!s)
+ goto phooey; /* not present */
+ }
+
+ DEBUG_r( if (!PL_colorset) reginitcolors() );
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ "%sMatching REx%s `%s%.60s%s%s' against `%s%.*s%s%s'\n",
+ PL_colors[4],PL_colors[5],PL_colors[0],
+ prog->precomp,
+ PL_colors[1],
+ (strlen(prog->precomp) > 60 ? "..." : ""),
+ PL_colors[0],
+ (int)(strend - startpos > 60 ? 60 : strend - startpos),
+ startpos, PL_colors[1],
+ (strend - startpos > 60 ? "..." : ""))
+ );
+
+ /* Simplest case: anchored match need be tried only once. */
+ /* [unless only anchor is BOL and multiline is set] */
+ if (prog->reganch & (ROPT_ANCH & ~ROPT_ANCH_GPOS)) {
+ if (s == startpos && regtry(prog, startpos))
+ goto got_it;
+ else if (PL_multiline || (prog->reganch & ROPT_IMPLICIT)
+ || (prog->reganch & ROPT_ANCH_MBOL)) /* XXXX SBOL? */
+ {
+ char *end;
+
+ if (minlen)
+ dontbother = minlen - 1;
+ end = HOPc(strend, -dontbother) - 1;
+ /* for multiline we only have to try after newlines */
+ if (prog->check_substr) {
+ if (s == startpos)
+ goto after_try;
+ while (1) {
+ if (regtry(prog, s))
+ goto got_it;
+ after_try:
+ if (s >= end)
+ goto phooey;
+ if (prog->reganch & RE_USE_INTUIT) {
+ s = re_intuit_start(prog, sv, s + 1, strend, flags, NULL);
+ if (!s)
+ goto phooey;
+ }
+ else
+ s++;
+ }
+ } else {
+ if (s > startpos)
+ s--;
+ while (s < end) {
+ if (*s++ == '\n') { /* don't need PL_utf8skip here */
+ if (regtry(prog, s))
+ goto got_it;
+ }
+ }
+ }
+ }
+ goto phooey;
+ } else if (prog->reganch & ROPT_ANCH_GPOS) {
+ if (regtry(prog, PL_reg_ganch))
+ goto got_it;
+ goto phooey;
+ }
+
+ /* Messy cases: unanchored match. */
+ if (prog->anchored_substr && prog->reganch & ROPT_SKIP) {
+ /* we have /x+whatever/ */
+ /* it must be a one character string (XXXX Except UTF?) */
+ char ch = SvPVX(prog->anchored_substr)[0];
+ if (UTF) {
+ while (s < strend) {
+ if (*s == ch) {
+ if (regtry(prog, s)) goto got_it;
+ s += UTF8SKIP(s);
+ while (s < strend && *s == ch)
+ s += UTF8SKIP(s);
+ }
+ s += UTF8SKIP(s);
+ }
+ }
+ else {
+ while (s < strend) {
+ if (*s == ch) {
+ if (regtry(prog, s)) goto got_it;
+ s++;
+ while (s < strend && *s == ch)
+ s++;
+ }
+ s++;
+ }
+ }
+ }
+ /*SUPPRESS 560*/
+ else if (prog->anchored_substr != Nullsv
+ || (prog->float_substr != Nullsv
+ && prog->float_max_offset < strend - s)) {
+ SV *must = prog->anchored_substr
+ ? prog->anchored_substr : prog->float_substr;
+ I32 back_max =
+ prog->anchored_substr ? prog->anchored_offset : prog->float_max_offset;
+ I32 back_min =
+ prog->anchored_substr ? prog->anchored_offset : prog->float_min_offset;
+ char *last = HOPc(strend, /* Cannot start after this */
+ -(I32)(CHR_SVLEN(must)
+ - (SvTAIL(must) != 0) + back_min));
+ char *last1; /* Last position checked before */
+
+ if (s > PL_bostr)
+ last1 = HOPc(s, -1);
+ else
+ last1 = s - 1; /* bogus */
+
+ /* XXXX check_substr already used to find `s', can optimize if
+ check_substr==must. */
+ scream_pos = -1;
+ dontbother = end_shift;
+ strend = HOPc(strend, -dontbother);
+ while ( (s <= last) &&
+ ((flags & REXEC_SCREAM)
+ ? (s = screaminstr(sv, must, HOPc(s, back_min) - strbeg,
+ end_shift, &scream_pos, 0))
+ : (s = fbm_instr((unsigned char*)HOP(s, back_min),
+ (unsigned char*)strend, must,
+ PL_multiline ? FBMrf_MULTILINE : 0))) ) {
+ if (HOPc(s, -back_max) > last1) {
+ last1 = HOPc(s, -back_min);
+ s = HOPc(s, -back_max);
+ }
+ else {
+ char *t = (last1 >= PL_bostr) ? HOPc(last1, 1) : last1 + 1;
+
+ last1 = HOPc(s, -back_min);
+ s = t;
+ }
+ if (UTF) {
+ while (s <= last1) {
+ if (regtry(prog, s))
+ goto got_it;
+ s += UTF8SKIP(s);
+ }
+ }
+ else {
+ while (s <= last1) {
+ if (regtry(prog, s))
+ goto got_it;
+ s++;
+ }
+ }
+ }
+ goto phooey;
+ }
+ else if ((c = prog->regstclass)) {
+ if (minlen && PL_regkind[(U8)OP(prog->regstclass)] != EXACT)
+ /* don't bother with what can't match */
+ strend = HOPc(strend, -(minlen - 1));
+ if (find_byclass(prog, c, s, strend, startpos, 0))
+ goto got_it;
}
else {
dontbother = 0;
if (prog->float_substr != Nullsv) { /* Trim the end. */
char *last;
- I32 oldpos = scream_pos;
- if (screamer) {
- last = screaminstr(screamer, prog->float_substr, s - strbeg,
+ if (flags & REXEC_SCREAM) {
+ last = screaminstr(sv, prog->float_substr, s - strbeg,
end_shift, &scream_pos, 1); /* last one */
- if (!last) {
+ if (!last)
last = scream_olds; /* Only one occurence. */
- }
- } else {
+ }
+ else {
STRLEN len;
char *little = SvPV(prog->float_substr, len);
- if (len)
- last = rninstr(s, strend, little, little + len);
- else
- last = strend; /* matching `$' */
+
+ if (SvTAIL(prog->float_substr)) {
+ if (memEQ(strend - len + 1, little, len - 1))
+ last = strend - len + 1;
+ else if (!PL_multiline)
+ last = memEQ(strend - len, little, len)
+ ? strend - len : Nullch;
+ else
+ goto find_last;
+ } else {
+ find_last:
+ if (len)
+ last = rninstr(s, strend, little, little + len);
+ else
+ last = strend; /* matching `$' */
+ }
}
if (last == NULL) goto phooey; /* Should not happen! */
dontbother = strend - last + prog->float_min_offset;
}
if (minlen && (dontbother < minlen))
dontbother = minlen - 1;
- strend -= dontbother;
+ strend -= dontbother; /* this one's always in bytes! */
/* We don't know much -- general case. */
- do {
- if (regtry(prog, s))
- goto got_it;
- } while (s++ < strend);
+ if (UTF) {
+ for (;;) {
+ if (regtry(prog, s))
+ goto got_it;
+ if (s >= strend)
+ break;
+ s += UTF8SKIP(s);
+ };
+ }
+ else {
+ do {
+ if (regtry(prog, s))
+ goto got_it;
+ } while (s++ < strend);
+ }
}
/* Failure. */
goto phooey;
got_it:
- prog->subbeg = strbeg;
- prog->subend = PL_regeol; /* strend may have been modified */
RX_MATCH_TAINTED_set(prog, PL_reg_flags & RF_tainted);
+ if (PL_reg_eval_set) {
+ /* Preserve the current value of $^R */
+ if (oreplsv != GvSV(PL_replgv))
+ sv_setsv(oreplsv, GvSV(PL_replgv));/* So that when GvSV(replgv) is
+ restored, the value remains
+ the same. */
+ restore_pos(aTHXo_ 0);
+ }
+
/* make sure $`, $&, $', and $digit will work later */
- if (strbeg != prog->subbase) { /* second+ //g match. */
- if (!(flags & REXEC_COPY_STR)) {
- if (prog->subbase) {
- Safefree(prog->subbase);
- prog->subbase = Nullch;
- }
+ if ( !(flags & REXEC_NOT_FIRST) ) {
+ if (RX_MATCH_COPIED(prog)) {
+ Safefree(prog->subbeg);
+ RX_MATCH_COPIED_off(prog);
}
- else {
+ if (flags & REXEC_COPY_STR) {
I32 i = PL_regeol - startpos + (stringarg - strbeg);
+
s = savepvn(strbeg, i);
- Safefree(prog->subbase);
- prog->subbase = s;
- prog->subbeg = prog->subbase;
- prog->subend = prog->subbase + i;
- s = prog->subbase + (stringarg - strbeg);
- for (i = 0; i <= prog->nparens; i++) {
- if (prog->endp[i]) {
- prog->startp[i] = s + (prog->startp[i] - startpos);
- prog->endp[i] = s + (prog->endp[i] - startpos);
- }
- }
+ prog->subbeg = s;
+ prog->sublen = i;
+ RX_MATCH_COPIED_on(prog);
+ }
+ else {
+ prog->subbeg = strbeg;
+ prog->sublen = PL_regeol - strbeg; /* strend may have been modified */
}
}
- /* Preserve the current value of $^R */
- if (oreplsv != GvSV(PL_replgv)) {
- sv_setsv(oreplsv, GvSV(PL_replgv));/* So that when GvSV(replgv) is
- restored, the value remains
- the same. */
- }
+
return 1;
phooey:
+ if (PL_reg_eval_set)
+ restore_pos(aTHXo_ 0);
return 0;
}
@@ -685,34 +1623,75 @@ phooey:
- regtry - try match at specific point
*/
STATIC I32 /* 0 failure, 1 success */
-regtry(regexp *prog, char *startpos)
+S_regtry(pTHX_ regexp *prog, char *startpos)
{
dTHR;
register I32 i;
- register char **sp;
- register char **ep;
+ register I32 *sp;
+ register I32 *ep;
CHECKPOINT lastcp;
if ((prog->reganch & ROPT_EVAL_SEEN) && !PL_reg_eval_set) {
+ MAGIC *mg;
+
PL_reg_eval_set = RS_init;
DEBUG_r(DEBUG_s(
- PerlIO_printf(Perl_debug_log, " setting stack tmpbase at %i\n",
- PL_stack_sp - PL_stack_base);
+ PerlIO_printf(Perl_debug_log, " setting stack tmpbase at %"IVdf"\n",
+ (IV)(PL_stack_sp - PL_stack_base));
));
- SAVEINT(cxstack[cxstack_ix].blk_oldsp);
+ SAVEI32(cxstack[cxstack_ix].blk_oldsp);
cxstack[cxstack_ix].blk_oldsp = PL_stack_sp - PL_stack_base;
/* Otherwise OP_NEXTSTATE will free whatever on stack now. */
SAVETMPS;
/* Apparently this is not needed, judging by wantarray. */
- /* SAVEINT(cxstack[cxstack_ix].blk_gimme);
+ /* SAVEI8(cxstack[cxstack_ix].blk_gimme);
cxstack[cxstack_ix].blk_gimme = G_SCALAR; */
+
+ if (PL_reg_sv) {
+ /* Make $_ available to executed code. */
+ if (PL_reg_sv != DEFSV) {
+ /* SAVE_DEFSV does *not* suffice here for USE_THREADS */
+ SAVESPTR(DEFSV);
+ DEFSV = PL_reg_sv;
+ }
+
+ if (!(SvTYPE(PL_reg_sv) >= SVt_PVMG && SvMAGIC(PL_reg_sv)
+ && (mg = mg_find(PL_reg_sv, 'g')))) {
+ /* prepare for quick setting of pos */
+ sv_magic(PL_reg_sv, (SV*)0, 'g', Nullch, 0);
+ mg = mg_find(PL_reg_sv, 'g');
+ mg->mg_len = -1;
+ }
+ PL_reg_magic = mg;
+ PL_reg_oldpos = mg->mg_len;
+ SAVEDESTRUCTOR_X(restore_pos, 0);
+ }
+ if (!PL_reg_curpm)
+ Newz(22,PL_reg_curpm, 1, PMOP);
+ PL_reg_curpm->op_pmregexp = prog;
+ PL_reg_oldcurpm = PL_curpm;
+ PL_curpm = PL_reg_curpm;
+ if (RX_MATCH_COPIED(prog)) {
+ /* Here is a serious problem: we cannot rewrite subbeg,
+ since it may be needed if this match fails. Thus
+ $` inside (?{}) could fail... */
+ PL_reg_oldsaved = prog->subbeg;
+ PL_reg_oldsavedlen = prog->sublen;
+ RX_MATCH_COPIED_off(prog);
+ }
+ else
+ PL_reg_oldsaved = Nullch;
+ prog->subbeg = PL_bostr;
+ prog->sublen = PL_regeol - PL_bostr; /* strend may have been modified */
}
+ prog->startp[0] = startpos - PL_bostr;
PL_reginput = startpos;
PL_regstartp = prog->startp;
PL_regendp = prog->endp;
PL_reglastparen = &prog->lastparen;
prog->lastparen = 0;
PL_regsize = 0;
+ DEBUG_r(PL_reg_starttry = startpos);
if (PL_reg_start_tmpl <= prog->nparens) {
PL_reg_start_tmpl = prog->nparens*3/2 + 3;
if(PL_reg_start_tmp)
@@ -721,19 +1700,20 @@ regtry(regexp *prog, char *startpos)
New(22,PL_reg_start_tmp, PL_reg_start_tmpl, char*);
}
+ /* XXXX What this code is doing here?!!! There should be no need
+ to do this again and again, PL_reglastparen should take care of
+ this! */
sp = prog->startp;
ep = prog->endp;
- PL_regdata = prog->data;
if (prog->nparens) {
- for (i = prog->nparens; i >= 0; i--) {
- *sp++ = NULL;
- *ep++ = NULL;
+ for (i = prog->nparens; i >= 1; i--) {
+ *++sp = -1;
+ *++ep = -1;
}
}
REGCP_SET;
if (regmatch(prog->program + 1)) {
- prog->startp[0] = startpos;
- prog->endp[0] = PL_reginput;
+ prog->endp[0] = PL_reginput - PL_bostr;
return 1;
}
REGCP_UNWIND;
@@ -755,7 +1735,7 @@ regtry(regexp *prog, char *startpos)
* advantage of machines that use a register save mask on subroutine entry.
*/
STATIC I32 /* 0 failure, 1 success */
-regmatch(regnode *prog)
+S_regmatch(pTHX_ regnode *prog)
{
dTHR;
register regnode *scan; /* Current node. */
@@ -773,6 +1753,7 @@ regmatch(regnode *prog)
PL_regindent++;
#endif
+ /* Note that nextchr is a byte even in UTF */
nextchr = UCHARAT(locinput);
scan = prog;
while (scan != NULL) {
@@ -780,11 +1761,19 @@ regmatch(regnode *prog)
#ifdef DEBUGGING
# define sayYES goto yes
# define sayNO goto no
+# define sayYES_FINAL goto yes_final
+# define sayYES_LOUD goto yes_loud
+# define sayNO_FINAL goto no_final
+# define sayNO_SILENT goto do_no
# define saySAME(x) if (x) goto yes; else goto no
# define REPORT_CODE_OFF 24
#else
# define sayYES return 1
# define sayNO return 0
+# define sayYES_FINAL return 1
+# define sayYES_LOUD return 1
+# define sayNO_FINAL return 0
+# define sayNO_SILENT return 0
# define saySAME(x) return x
#endif
DEBUG_r( {
@@ -792,22 +1781,36 @@ regmatch(regnode *prog)
int docolor = *PL_colors[0];
int taill = (docolor ? 10 : 7); /* 3 chars for "> <" */
int l = (PL_regeol - locinput > taill ? taill : PL_regeol - locinput);
+ /* The part of the string before starttry has one color
+ (pref0_len chars), between starttry and current
+ position another one (pref_len - pref0_len chars),
+ after the current position the third one.
+ We assume that pref0_len <= pref_len, otherwise we
+ decrease pref0_len. */
int pref_len = (locinput - PL_bostr > (5 + taill) - l
? (5 + taill) - l : locinput - PL_bostr);
+ int pref0_len = pref_len - (locinput - PL_reg_starttry);
if (l + pref_len < (5 + taill) && l < PL_regeol - locinput)
l = ( PL_regeol - locinput > (5 + taill) - pref_len
? (5 + taill) - pref_len : PL_regeol - locinput);
+ if (pref0_len < 0)
+ pref0_len = 0;
+ if (pref0_len > pref_len)
+ pref0_len = pref_len;
regprop(prop, scan);
PerlIO_printf(Perl_debug_log,
- "%4i <%s%.*s%s%s%s%.*s%s>%*s|%3d:%*s%s\n",
- locinput - PL_bostr,
- PL_colors[2], pref_len, locinput - pref_len, PL_colors[3],
+ "%4"IVdf" <%s%.*s%s%s%.*s%s%s%s%.*s%s>%*s|%3"IVdf":%*s%s\n",
+ (IV)(locinput - PL_bostr),
+ PL_colors[4], pref0_len,
+ locinput - pref_len, PL_colors[5],
+ PL_colors[2], pref_len - pref0_len,
+ locinput - pref_len + pref0_len, PL_colors[3],
(docolor ? "" : "> <"),
PL_colors[0], l, locinput, PL_colors[1],
15 - l - pref_len + 1,
"",
- scan - PL_regprogram, PL_regindent*2, "",
+ (IV)(scan - PL_regprogram), PL_regindent*2, "",
SvPVX(prop));
} );
@@ -822,7 +1825,7 @@ regmatch(regnode *prog)
: (PL_multiline &&
(nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
{
- /* PL_regtill = PL_regbol; */
+ /* regtill = regbol; */
break;
}
sayNO;
@@ -839,7 +1842,7 @@ regmatch(regnode *prog)
break;
sayNO;
case GPOS:
- if (locinput == PL_regbol)
+ if (locinput == PL_reg_ganch)
break;
sayNO;
case EOL:
@@ -863,19 +1866,43 @@ regmatch(regnode *prog)
if (PL_regeol != locinput)
sayNO;
break;
+ case SANYUTF8:
+ if (nextchr & 0x80) {
+ locinput += PL_utf8skip[nextchr];
+ if (locinput > PL_regeol)
+ sayNO;
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if (!nextchr && locinput >= PL_regeol)
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
case SANY:
if (!nextchr && locinput >= PL_regeol)
sayNO;
nextchr = UCHARAT(++locinput);
break;
- case ANY:
- if (!nextchr && locinput >= PL_regeol || nextchr == '\n')
+ case ANYUTF8:
+ if (nextchr & 0x80) {
+ locinput += PL_utf8skip[nextchr];
+ if (locinput > PL_regeol)
+ sayNO;
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if ((!nextchr && locinput >= PL_regeol) || nextchr == '\n')
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
+ case REG_ANY:
+ if ((!nextchr && locinput >= PL_regeol) || nextchr == '\n')
sayNO;
nextchr = UCHARAT(++locinput);
break;
case EXACT:
- s = (char *) OPERAND(scan);
- ln = UCHARAT(s++);
+ s = STRING(scan);
+ ln = STR_LEN(scan);
/* Inline the first character, for speed. */
if (UCHARAT(s) != nextchr)
sayNO;
@@ -890,12 +1917,34 @@ regmatch(regnode *prog)
PL_reg_flags |= RF_tainted;
/* FALL THROUGH */
case EXACTF:
- s = (char *) OPERAND(scan);
- ln = UCHARAT(s++);
+ s = STRING(scan);
+ ln = STR_LEN(scan);
+
+ if (UTF) {
+ char *l = locinput;
+ char *e = s + ln;
+ c1 = OP(scan) == EXACTF;
+ while (s < e) {
+ if (l >= PL_regeol)
+ sayNO;
+ if (utf8_to_uv((U8*)s, 0) != (c1 ?
+ toLOWER_utf8((U8*)l) :
+ toLOWER_LC_utf8((U8*)l)))
+ {
+ sayNO;
+ }
+ s += UTF8SKIP(s);
+ l += UTF8SKIP(l);
+ }
+ locinput = l;
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+
/* Inline the first character, for speed. */
if (UCHARAT(s) != nextchr &&
UCHARAT(s) != ((OP(scan) == EXACTF)
- ? fold : fold_locale)[nextchr])
+ ? PL_fold : PL_fold_locale)[nextchr])
sayNO;
if (PL_regeol - locinput < ln)
sayNO;
@@ -906,11 +1955,18 @@ regmatch(regnode *prog)
locinput += ln;
nextchr = UCHARAT(locinput);
break;
+ case ANYOFUTF8:
+ if (!REGINCLASSUTF8(scan, (U8*)locinput))
+ sayNO;
+ if (locinput >= PL_regeol)
+ sayNO;
+ locinput += PL_utf8skip[nextchr];
+ nextchr = UCHARAT(locinput);
+ break;
case ANYOF:
- s = (char *) OPERAND(scan);
if (nextchr < 0)
nextchr = UCHARAT(locinput);
- if (!REGINCLASS(s, nextchr))
+ if (!REGINCLASS(scan, nextchr))
sayNO;
if (!nextchr && locinput >= PL_regeol)
sayNO;
@@ -927,6 +1983,28 @@ regmatch(regnode *prog)
sayNO;
nextchr = UCHARAT(++locinput);
break;
+ case ALNUMLUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case ALNUMUTF8:
+ if (!nextchr)
+ sayNO;
+ if (nextchr & 0x80) {
+ if (!(OP(scan) == ALNUMUTF8
+ ? swash_fetch(PL_utf8_alnum, (U8*)locinput)
+ : isALNUM_LC_utf8((U8*)locinput)))
+ {
+ sayNO;
+ }
+ locinput += PL_utf8skip[nextchr];
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if (!(OP(scan) == ALNUMUTF8
+ ? isALNUM(nextchr) : isALNUM_LC(nextchr)))
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
case NALNUML:
PL_reg_flags |= RF_tainted;
/* FALL THROUGH */
@@ -938,6 +2016,28 @@ regmatch(regnode *prog)
sayNO;
nextchr = UCHARAT(++locinput);
break;
+ case NALNUMLUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case NALNUMUTF8:
+ if (!nextchr && locinput >= PL_regeol)
+ sayNO;
+ if (nextchr & 0x80) {
+ if (OP(scan) == NALNUMUTF8
+ ? swash_fetch(PL_utf8_alnum, (U8*)locinput)
+ : isALNUM_LC_utf8((U8*)locinput))
+ {
+ sayNO;
+ }
+ locinput += PL_utf8skip[nextchr];
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if (OP(scan) == NALNUMUTF8
+ ? isALNUM(nextchr) : isALNUM_LC(nextchr))
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
case BOUNDL:
case NBOUNDL:
PL_reg_flags |= RF_tainted;
@@ -957,58 +2057,222 @@ regmatch(regnode *prog)
if (((!ln) == (!n)) == (OP(scan) == BOUND || OP(scan) == BOUNDL))
sayNO;
break;
+ case BOUNDLUTF8:
+ case NBOUNDLUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case BOUNDUTF8:
+ case NBOUNDUTF8:
+ /* was last char in word? */
+ ln = (locinput != PL_regbol)
+ ? utf8_to_uv(reghop((U8*)locinput, -1), 0) : PL_regprev;
+ if (OP(scan) == BOUNDUTF8 || OP(scan) == NBOUNDUTF8) {
+ ln = isALNUM_uni(ln);
+ n = swash_fetch(PL_utf8_alnum, (U8*)locinput);
+ }
+ else {
+ ln = isALNUM_LC_uni(ln);
+ n = isALNUM_LC_utf8((U8*)locinput);
+ }
+ if (((!ln) == (!n)) == (OP(scan) == BOUNDUTF8 || OP(scan) == BOUNDLUTF8))
+ sayNO;
+ break;
case SPACEL:
PL_reg_flags |= RF_tainted;
/* FALL THROUGH */
case SPACE:
- if (!nextchr && locinput >= PL_regeol)
+ if (!nextchr)
sayNO;
if (!(OP(scan) == SPACE
? isSPACE(nextchr) : isSPACE_LC(nextchr)))
sayNO;
nextchr = UCHARAT(++locinput);
break;
+ case SPACELUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case SPACEUTF8:
+ if (!nextchr)
+ sayNO;
+ if (nextchr & 0x80) {
+ if (!(OP(scan) == SPACEUTF8
+ ? swash_fetch(PL_utf8_space, (U8*)locinput)
+ : isSPACE_LC_utf8((U8*)locinput)))
+ {
+ sayNO;
+ }
+ locinput += PL_utf8skip[nextchr];
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if (!(OP(scan) == SPACEUTF8
+ ? isSPACE(nextchr) : isSPACE_LC(nextchr)))
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
case NSPACEL:
PL_reg_flags |= RF_tainted;
/* FALL THROUGH */
case NSPACE:
- if (!nextchr)
+ if (!nextchr && locinput >= PL_regeol)
+ sayNO;
+ if (OP(scan) == NSPACE
+ ? isSPACE(nextchr) : isSPACE_LC(nextchr))
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
+ case NSPACELUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case NSPACEUTF8:
+ if (!nextchr && locinput >= PL_regeol)
sayNO;
- if (OP(scan) == SPACE
+ if (nextchr & 0x80) {
+ if (OP(scan) == NSPACEUTF8
+ ? swash_fetch(PL_utf8_space, (U8*)locinput)
+ : isSPACE_LC_utf8((U8*)locinput))
+ {
+ sayNO;
+ }
+ locinput += PL_utf8skip[nextchr];
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if (OP(scan) == NSPACEUTF8
? isSPACE(nextchr) : isSPACE_LC(nextchr))
sayNO;
nextchr = UCHARAT(++locinput);
break;
+ case DIGITL:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
case DIGIT:
- if (!isDIGIT(nextchr))
+ if (!nextchr)
+ sayNO;
+ if (!(OP(scan) == DIGIT
+ ? isDIGIT(nextchr) : isDIGIT_LC(nextchr)))
sayNO;
nextchr = UCHARAT(++locinput);
break;
+ case DIGITLUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case DIGITUTF8:
+ if (!nextchr)
+ sayNO;
+ if (nextchr & 0x80) {
+ if (!(OP(scan) == DIGITUTF8
+ ? swash_fetch(PL_utf8_digit, (U8*)locinput)
+ : isDIGIT_LC_utf8((U8*)locinput)))
+ {
+ sayNO;
+ }
+ locinput += PL_utf8skip[nextchr];
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if (!(OP(scan) == DIGITUTF8
+ ? isDIGIT(nextchr) : isDIGIT_LC(nextchr)))
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
+ case NDIGITL:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
case NDIGIT:
if (!nextchr && locinput >= PL_regeol)
sayNO;
- if (isDIGIT(nextchr))
+ if (OP(scan) == NDIGIT
+ ? isDIGIT(nextchr) : isDIGIT_LC(nextchr))
sayNO;
nextchr = UCHARAT(++locinput);
break;
+ case NDIGITLUTF8:
+ PL_reg_flags |= RF_tainted;
+ /* FALL THROUGH */
+ case NDIGITUTF8:
+ if (!nextchr && locinput >= PL_regeol)
+ sayNO;
+ if (nextchr & 0x80) {
+ if (OP(scan) == NDIGITUTF8
+ ? swash_fetch(PL_utf8_digit, (U8*)locinput)
+ : isDIGIT_LC_utf8((U8*)locinput))
+ {
+ sayNO;
+ }
+ locinput += PL_utf8skip[nextchr];
+ nextchr = UCHARAT(locinput);
+ break;
+ }
+ if (OP(scan) == NDIGITUTF8
+ ? isDIGIT(nextchr) : isDIGIT_LC(nextchr))
+ sayNO;
+ nextchr = UCHARAT(++locinput);
+ break;
+ case CLUMP:
+ if (locinput >= PL_regeol || swash_fetch(PL_utf8_mark,(U8*)locinput))
+ sayNO;
+ locinput += PL_utf8skip[nextchr];
+ while (locinput < PL_regeol && swash_fetch(PL_utf8_mark,(U8*)locinput))
+ locinput += UTF8SKIP(locinput);
+ if (locinput > PL_regeol)
+ sayNO;
+ nextchr = UCHARAT(locinput);
+ break;
case REFFL:
PL_reg_flags |= RF_tainted;
/* FALL THROUGH */
case REF:
case REFF:
n = ARG(scan); /* which paren pair */
- s = PL_regstartp[n];
- if (*PL_reglastparen < n || !s)
+ ln = PL_regstartp[n];
+ PL_reg_leftiter = PL_reg_maxiter; /* Void cache */
+ if (*PL_reglastparen < n || ln == -1)
sayNO; /* Do not match unless seen CLOSEn. */
- if (s == PL_regendp[n])
+ if (ln == PL_regendp[n])
+ break;
+
+ s = PL_bostr + ln;
+ if (UTF && OP(scan) != REF) { /* REF can do byte comparison */
+ char *l = locinput;
+ char *e = PL_bostr + PL_regendp[n];
+ /*
+ * Note that we can't do the "other character" lookup trick as
+ * in the 8-bit case (no pun intended) because in Unicode we
+ * have to map both upper and title case to lower case.
+ */
+ if (OP(scan) == REFF) {
+ while (s < e) {
+ if (l >= PL_regeol)
+ sayNO;
+ if (toLOWER_utf8((U8*)s) != toLOWER_utf8((U8*)l))
+ sayNO;
+ s += UTF8SKIP(s);
+ l += UTF8SKIP(l);
+ }
+ }
+ else {
+ while (s < e) {
+ if (l >= PL_regeol)
+ sayNO;
+ if (toLOWER_LC_utf8((U8*)s) != toLOWER_LC_utf8((U8*)l))
+ sayNO;
+ s += UTF8SKIP(s);
+ l += UTF8SKIP(l);
+ }
+ }
+ locinput = l;
+ nextchr = UCHARAT(locinput);
break;
+ }
+
/* Inline the first character, for speed. */
if (UCHARAT(s) != nextchr &&
(OP(scan) == REF ||
(UCHARAT(s) != ((OP(scan) == REFF
- ? fold : fold_locale)[nextchr]))))
+ ? PL_fold : PL_fold_locale)[nextchr]))))
sayNO;
- ln = PL_regendp[n] - s;
+ ln = PL_regendp[n] - ln;
if (locinput + ln > PL_regeol)
sayNO;
if (ln > 1 && (OP(scan) == REF
@@ -1036,22 +2300,116 @@ regmatch(regnode *prog)
n = ARG(scan);
PL_op = (OP_4tree*)PL_regdata->data[n];
- DEBUG_r( PerlIO_printf(Perl_debug_log, " re_eval 0x%x\n", PL_op) );
- PL_curpad = AvARRAY((AV*)PL_regdata->data[n + 1]);
+ DEBUG_r( PerlIO_printf(Perl_debug_log, " re_eval 0x%"UVxf"\n", PTR2UV(PL_op)) );
+ PL_curpad = AvARRAY((AV*)PL_regdata->data[n + 2]);
+ PL_regendp[0] = PL_reg_magic->mg_len = locinput - PL_bostr;
- CALLRUNOPS(); /* Scalar context. */
+ CALLRUNOPS(aTHX); /* Scalar context. */
SPAGAIN;
ret = POPs;
PUTBACK;
- if (logical) {
- logical = 0;
- sw = SvTRUE(ret);
- } else
- sv_setsv(save_scalar(PL_replgv), ret);
PL_op = oop;
PL_curpad = ocurpad;
PL_curcop = ocurcop;
+ if (logical) {
+ if (logical == 2) { /* Postponed subexpression. */
+ regexp *re;
+ MAGIC *mg = Null(MAGIC*);
+ re_cc_state state;
+ CHECKPOINT cp, lastcp;
+
+ if(SvROK(ret) || SvRMAGICAL(ret)) {
+ SV *sv = SvROK(ret) ? SvRV(ret) : ret;
+
+ if(SvMAGICAL(sv))
+ mg = mg_find(sv, 'r');
+ }
+ if (mg) {
+ re = (regexp *)mg->mg_obj;
+ (void)ReREFCNT_inc(re);
+ }
+ else {
+ STRLEN len;
+ char *t = SvPV(ret, len);
+ PMOP pm;
+ char *oprecomp = PL_regprecomp;
+ I32 osize = PL_regsize;
+ I32 onpar = PL_regnpar;
+
+ pm.op_pmflags = 0;
+ pm.op_pmdynflags = (UTF||DO_UTF8(ret) ? PMdf_UTF8 : 0);
+ re = CALLREGCOMP(aTHX_ t, t + len, &pm);
+ if (!(SvFLAGS(ret)
+ & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)))
+ sv_magic(ret,(SV*)ReREFCNT_inc(re),'r',0,0);
+ PL_regprecomp = oprecomp;
+ PL_regsize = osize;
+ PL_regnpar = onpar;
+ }
+ DEBUG_r(
+ PerlIO_printf(Perl_debug_log,
+ "Entering embedded `%s%.60s%s%s'\n",
+ PL_colors[0],
+ re->precomp,
+ PL_colors[1],
+ (strlen(re->precomp) > 60 ? "..." : ""))
+ );
+ state.node = next;
+ state.prev = PL_reg_call_cc;
+ state.cc = PL_regcc;
+ state.re = PL_reg_re;
+
+ PL_regcc = 0;
+
+ cp = regcppush(0); /* Save *all* the positions. */
+ REGCP_SET;
+ cache_re(re);
+ state.ss = PL_savestack_ix;
+ *PL_reglastparen = 0;
+ PL_reg_call_cc = &state;
+ PL_reginput = locinput;
+
+ /* XXXX This is too dramatic a measure... */
+ PL_reg_maxiter = 0;
+
+ if (regmatch(re->program + 1)) {
+ /* Even though we succeeded, we need to restore
+ global variables, since we may be wrapped inside
+ SUSPEND, thus the match may be not finished yet. */
+
+ /* XXXX Do this only if SUSPENDed? */
+ PL_reg_call_cc = state.prev;
+ PL_regcc = state.cc;
+ PL_reg_re = state.re;
+ cache_re(PL_reg_re);
+
+ /* XXXX This is too dramatic a measure... */
+ PL_reg_maxiter = 0;
+
+ /* These are needed even if not SUSPEND. */
+ ReREFCNT_dec(re);
+ regcpblow(cp);
+ sayYES;
+ }
+ ReREFCNT_dec(re);
+ REGCP_UNWIND;
+ regcppop();
+ PL_reg_call_cc = state.prev;
+ PL_regcc = state.cc;
+ PL_reg_re = state.re;
+ cache_re(PL_reg_re);
+
+ /* XXXX This is too dramatic a measure... */
+ PL_reg_maxiter = 0;
+
+ sayNO;
+ }
+ sw = SvTRUE(ret);
+ logical = 0;
+ }
+ else
+ sv_setsv(save_scalar(PL_replgv), ret);
break;
}
case OPEN:
@@ -1062,16 +2420,17 @@ regmatch(regnode *prog)
break;
case CLOSE:
n = ARG(scan); /* which paren pair */
- PL_regstartp[n] = PL_reg_start_tmp[n];
- PL_regendp[n] = locinput;
+ PL_regstartp[n] = PL_reg_start_tmp[n] - PL_bostr;
+ PL_regendp[n] = locinput - PL_bostr;
if (n > *PL_reglastparen)
*PL_reglastparen = n;
break;
case GROUPP:
n = ARG(scan); /* which paren pair */
- sw = (*PL_reglastparen >= n && PL_regendp[n] != NULL);
+ sw = (*PL_reglastparen >= n && PL_regendp[n] != -1);
break;
case IFTHEN:
+ PL_reg_leftiter = PL_reg_maxiter; /* Void cache */
if (sw)
next = NEXTOPER(NEXTOPER(scan));
else {
@@ -1081,8 +2440,83 @@ regmatch(regnode *prog)
}
break;
case LOGICAL:
- logical = 1;
+ logical = scan->flags;
break;
+/*******************************************************************
+ PL_regcc contains infoblock about the innermost (...)* loop, and
+ a pointer to the next outer infoblock.
+
+ Here is how Y(A)*Z is processed (if it is compiled into CURLYX/WHILEM):
+
+ 1) After matching X, regnode for CURLYX is processed;
+
+ 2) This regnode creates infoblock on the stack, and calls
+ regmatch() recursively with the starting point at WHILEM node;
+
+ 3) Each hit of WHILEM node tries to match A and Z (in the order
+ depending on the current iteration, min/max of {min,max} and
+ greediness). The information about where are nodes for "A"
+ and "Z" is read from the infoblock, as is info on how many times "A"
+ was already matched, and greediness.
+
+ 4) After A matches, the same WHILEM node is hit again.
+
+ 5) Each time WHILEM is hit, PL_regcc is the infoblock created by CURLYX
+ of the same pair. Thus when WHILEM tries to match Z, it temporarily
+ resets PL_regcc, since this Y(A)*Z can be a part of some other loop:
+ as in (Y(A)*Z)*. If Z matches, the automaton will hit the WHILEM node
+ of the external loop.
+
+ Currently present infoblocks form a tree with a stem formed by PL_curcc
+ and whatever it mentions via ->next, and additional attached trees
+ corresponding to temporarily unset infoblocks as in "5" above.
+
+ In the following picture infoblocks for outer loop of
+ (Y(A)*?Z)*?T are denoted O, for inner I. NULL starting block
+ is denoted by x. The matched string is YAAZYAZT. Temporarily postponed
+ infoblocks are drawn below the "reset" infoblock.
+
+ In fact in the picture below we do not show failed matches for Z and T
+ by WHILEM blocks. [We illustrate minimal matches, since for them it is
+ more obvious *why* one needs to *temporary* unset infoblocks.]
+
+ Matched REx position InfoBlocks Comment
+ (Y(A)*?Z)*?T x
+ Y(A)*?Z)*?T x <- O
+ Y (A)*?Z)*?T x <- O
+ Y A)*?Z)*?T x <- O <- I
+ YA )*?Z)*?T x <- O <- I
+ YA A)*?Z)*?T x <- O <- I
+ YAA )*?Z)*?T x <- O <- I
+ YAA Z)*?T x <- O # Temporary unset I
+ I
+
+ YAAZ Y(A)*?Z)*?T x <- O
+ I
+
+ YAAZY (A)*?Z)*?T x <- O
+ I
+
+ YAAZY A)*?Z)*?T x <- O <- I
+ I
+
+ YAAZYA )*?Z)*?T x <- O <- I
+ I
+
+ YAAZYA Z)*?T x <- O # Temporary unset I
+ I,I
+
+ YAAZYAZ )*?T x <- O
+ I,I
+
+ YAAZYAZ T x # Temporary unset O
+ O
+ I,I
+
+ YAAZYAZT x
+ O
+ I,I
+ *******************************************************************/
case CURLYX: {
CURCUR cc;
CHECKPOINT cp = PL_savestack_ix;
@@ -1110,7 +2544,7 @@ regmatch(regnode *prog)
/*
* This is really hard to understand, because after we match
* what we're trying to match, we must make sure the rest of
- * the RE is going to match for sure, and to do that we have
+ * the REx is going to match for sure, and to do that we have
* to go back UP the parse tree by recursing ever deeper. And
* if it fails, we have to reset our parent's current state
* that we can try again after backing off.
@@ -1135,7 +2569,8 @@ regmatch(regnode *prog)
if (locinput == cc->lastloc && n >= cc->min) {
PL_regcc = cc->oldcc;
- ln = PL_regcc->cur;
+ if (PL_regcc)
+ ln = PL_regcc->cur;
DEBUG_r(
PerlIO_printf(Perl_debug_log,
"%*s empty match detected, try continuation...\n",
@@ -1143,12 +2578,8 @@ regmatch(regnode *prog)
);
if (regmatch(cc->next))
sayYES;
- DEBUG_r(
- PerlIO_printf(Perl_debug_log,
- "%*s failed...\n",
- REPORT_CODE_OFF+PL_regindent*2, "")
- );
- PL_regcc->cur = ln;
+ if (PL_regcc)
+ PL_regcc->cur = ln;
PL_regcc = cc;
sayNO;
}
@@ -1162,19 +2593,60 @@ regmatch(regnode *prog)
sayYES;
cc->cur = n - 1;
cc->lastloc = lastloc;
+ sayNO;
+ }
+
+ if (scan->flags) {
+ /* Check whether we already were at this position.
+ Postpone detection until we know the match is not
+ *that* much linear. */
+ if (!PL_reg_maxiter) {
+ PL_reg_maxiter = (PL_regeol - PL_bostr + 1) * (scan->flags>>4);
+ PL_reg_leftiter = PL_reg_maxiter;
+ }
+ if (PL_reg_leftiter-- == 0) {
+ I32 size = (PL_reg_maxiter + 7)/8;
+ if (PL_reg_poscache) {
+ if (PL_reg_poscache_size < size) {
+ Renew(PL_reg_poscache, size, char);
+ PL_reg_poscache_size = size;
+ }
+ Zero(PL_reg_poscache, size, char);
+ }
+ else {
+ PL_reg_poscache_size = size;
+ Newz(29, PL_reg_poscache, size, char);
+ }
+ DEBUG_r(
+ PerlIO_printf(Perl_debug_log,
+ "%sDetected a super-linear match, switching on caching%s...\n",
+ PL_colors[4], PL_colors[5])
+ );
+ }
+ if (PL_reg_leftiter < 0) {
+ I32 o = locinput - PL_bostr, b;
+
+ o = (scan->flags & 0xf) - 1 + o * (scan->flags>>4);
+ b = o % 8;
+ o /= 8;
+ if (PL_reg_poscache[o] & (1<<b)) {
DEBUG_r(
PerlIO_printf(Perl_debug_log,
- "%*s failed...\n",
+ "%*s already tried at this position...\n",
REPORT_CODE_OFF+PL_regindent*2, "")
);
- sayNO;
+ sayNO_SILENT;
+ }
+ PL_reg_poscache[o] |= (1<<b);
+ }
}
/* Prefer next over scan for minimal matching. */
if (cc->minmod) {
PL_regcc = cc->oldcc;
- ln = PL_regcc->cur;
+ if (PL_regcc)
+ ln = PL_regcc->cur;
cp = regcppush(cc->parenfloor);
REGCP_SET;
if (regmatch(cc->next)) {
@@ -1183,14 +2655,15 @@ regmatch(regnode *prog)
}
REGCP_UNWIND;
regcppop();
- PL_regcc->cur = ln;
+ if (PL_regcc)
+ PL_regcc->cur = ln;
PL_regcc = cc;
if (n >= cc->max) { /* Maximum greed exceeded? */
- if (PL_dowarn && n >= REG_INFTY
+ if (ckWARN(WARN_REGEXP) && n >= REG_INFTY
&& !(PL_reg_flags & RF_warned)) {
PL_reg_flags |= RF_warned;
- warn("%s limit (%d) exceeded",
+ Perl_warner(aTHX_ WARN_REGEXP, "%s limit (%d) exceeded",
"Complex regular subexpression recursion",
REG_INFTY - 1);
}
@@ -1212,11 +2685,6 @@ regmatch(regnode *prog)
regcpblow(cp);
sayYES;
}
- DEBUG_r(
- PerlIO_printf(Perl_debug_log,
- "%*s failed...\n",
- REPORT_CODE_OFF+PL_regindent*2, "")
- );
REGCP_UNWIND;
regcppop();
cc->cur = n - 1;
@@ -1244,23 +2712,22 @@ regmatch(regnode *prog)
REPORT_CODE_OFF+PL_regindent*2, "")
);
}
- if (PL_dowarn && n >= REG_INFTY && !(PL_reg_flags & RF_warned)) {
+ if (ckWARN(WARN_REGEXP) && n >= REG_INFTY
+ && !(PL_reg_flags & RF_warned)) {
PL_reg_flags |= RF_warned;
- warn("%s limit (%d) exceeded",
+ Perl_warner(aTHX_ WARN_REGEXP, "%s limit (%d) exceeded",
"Complex regular subexpression recursion",
REG_INFTY - 1);
}
/* Failed deeper matches of scan, so see if this one works. */
PL_regcc = cc->oldcc;
- ln = PL_regcc->cur;
+ if (PL_regcc)
+ ln = PL_regcc->cur;
if (regmatch(cc->next))
sayYES;
- DEBUG_r(
- PerlIO_printf(Perl_debug_log, "%*s failed...\n",
- REPORT_CODE_OFF+PL_regindent*2, "")
- );
- PL_regcc->cur = ln;
+ if (PL_regcc)
+ PL_regcc->cur = ln;
PL_regcc = cc;
cc->cur = n - 1;
cc->lastloc = lastloc;
@@ -1291,11 +2758,11 @@ regmatch(regnode *prog)
sayYES;
REGCP_UNWIND;
for (n = *PL_reglastparen; n > lastparen; n--)
- PL_regendp[n] = 0;
+ PL_regendp[n] = -1;
*PL_reglastparen = n;
scan = next;
/*SUPPRESS 560*/
- if (n = (c1 == BRANCH ? NEXT_OFF(next) : ARG(next)))
+ if ((n = (c1 == BRANCH ? NEXT_OFF(next) : ARG(next))))
next += n;
else
next = NULL;
@@ -1344,15 +2811,16 @@ regmatch(regnode *prog)
&& !(paren && ln == 0))
ln = n;
locinput = PL_reginput;
- if (regkind[(U8)OP(next)] == EXACT) {
- c1 = UCHARAT(OPERAND(next) + 1);
+ if (PL_regkind[(U8)OP(next)] == EXACT) {
+ c1 = (U8)*STRING(next);
if (OP(next) == EXACTF)
- c2 = fold[c1];
+ c2 = PL_fold[c1];
else if (OP(next) == EXACTFL)
- c2 = fold_locale[c1];
+ c2 = PL_fold_locale[c1];
else
c2 = c1;
- } else
+ }
+ else
c1 = c2 = -1000;
REGCP_SET;
/* This may be improved if l == 0. */
@@ -1364,10 +2832,12 @@ regmatch(regnode *prog)
{
if (paren) {
if (n) {
- PL_regstartp[paren] = PL_reginput - l;
- PL_regendp[paren] = PL_reginput;
- } else
- PL_regendp[paren] = NULL;
+ PL_regstartp[paren] =
+ HOPc(PL_reginput, -l) - PL_bostr;
+ PL_regendp[paren] = PL_reginput - PL_bostr;
+ }
+ else
+ PL_regendp[paren] = -1;
}
if (regmatch(next))
sayYES;
@@ -1382,7 +2852,8 @@ regmatch(regnode *prog)
else
sayNO;
}
- } else {
+ }
+ else {
n = regrepeat_hard(scan, n, &l);
if (n != 0 && l == 0
/* In fact, this is tricky. If paren, then the
@@ -1393,19 +2864,21 @@ regmatch(regnode *prog)
locinput = PL_reginput;
DEBUG_r(
PerlIO_printf(Perl_debug_log,
- "%*s matched %ld times, len=%ld...\n",
- REPORT_CODE_OFF+PL_regindent*2, "", n, l)
+ "%*s matched %"IVdf" times, len=%"IVdf"...\n",
+ (int)(REPORT_CODE_OFF+PL_regindent*2), "",
+ (IV) n, (IV)l)
);
if (n >= ln) {
- if (regkind[(U8)OP(next)] == EXACT) {
- c1 = UCHARAT(OPERAND(next) + 1);
+ if (PL_regkind[(U8)OP(next)] == EXACT) {
+ c1 = (U8)*STRING(next);
if (OP(next) == EXACTF)
- c2 = fold[c1];
+ c2 = PL_fold[c1];
else if (OP(next) == EXACTFL)
- c2 = fold_locale[c1];
+ c2 = PL_fold_locale[c1];
else
c2 = c1;
- } else
+ }
+ else
c1 = c2 = -1000;
}
REGCP_SET;
@@ -1414,26 +2887,27 @@ regmatch(regnode *prog)
if (c1 == -1000 ||
UCHARAT(PL_reginput) == c1 ||
UCHARAT(PL_reginput) == c2)
- {
- DEBUG_r(
+ {
+ DEBUG_r(
PerlIO_printf(Perl_debug_log,
- "%*s trying tail with n=%ld...\n",
- REPORT_CODE_OFF+PL_regindent*2, "", n)
- );
- if (paren) {
- if (n) {
- PL_regstartp[paren] = PL_reginput - l;
- PL_regendp[paren] = PL_reginput;
- } else
- PL_regendp[paren] = NULL;
+ "%*s trying tail with n=%"IVdf"...\n",
+ (int)(REPORT_CODE_OFF+PL_regindent*2), "", (IV)n)
+ );
+ if (paren) {
+ if (n) {
+ PL_regstartp[paren] = HOPc(PL_reginput, -l) - PL_bostr;
+ PL_regendp[paren] = PL_reginput - PL_bostr;
}
- if (regmatch(next))
- sayYES;
- REGCP_UNWIND;
+ else
+ PL_regendp[paren] = -1;
}
+ if (regmatch(next))
+ sayYES;
+ REGCP_UNWIND;
+ }
/* Couldn't or didn't -- back up. */
n--;
- locinput -= l;
+ locinput = HOPc(locinput, -l);
PL_reginput = locinput;
}
}
@@ -1472,12 +2946,12 @@ regmatch(regnode *prog)
* Lookahead to avoid useless match attempts
* when we know what character comes next.
*/
- if (regkind[(U8)OP(next)] == EXACT) {
- c1 = UCHARAT(OPERAND(next) + 1);
+ if (PL_regkind[(U8)OP(next)] == EXACT) {
+ c1 = (U8)*STRING(next);
if (OP(next) == EXACTF)
- c2 = fold[c1];
+ c2 = PL_fold[c1];
else if (OP(next) == EXACTFL)
- c2 = fold_locale[c1];
+ c2 = PL_fold_locale[c1];
else
c2 = c1;
}
@@ -1489,7 +2963,52 @@ regmatch(regnode *prog)
minmod = 0;
if (ln && regrepeat(scan, ln) < ln)
sayNO;
+ locinput = PL_reginput;
REGCP_SET;
+ if (c1 != -1000) {
+ char *e = locinput + n - ln; /* Should not check after this */
+ char *old = locinput;
+
+ if (e >= PL_regeol || (n == REG_INFTY))
+ e = PL_regeol - 1;
+ while (1) {
+ /* Find place 'next' could work */
+ if (c1 == c2) {
+ while (locinput <= e && *locinput != c1)
+ locinput++;
+ } else {
+ while (locinput <= e
+ && *locinput != c1
+ && *locinput != c2)
+ locinput++;
+ }
+ if (locinput > e)
+ sayNO;
+ /* PL_reginput == old now */
+ if (locinput != old) {
+ ln = 1; /* Did some */
+ if (regrepeat(scan, locinput - old) <
+ locinput - old)
+ sayNO;
+ }
+ /* PL_reginput == locinput now */
+ if (paren) {
+ if (ln) {
+ PL_regstartp[paren] = HOPc(locinput, -1) - PL_bostr;
+ PL_regendp[paren] = locinput - PL_bostr;
+ }
+ else
+ PL_regendp[paren] = -1;
+ }
+ if (regmatch(next))
+ sayYES;
+ PL_reginput = locinput; /* Could be reset... */
+ REGCP_UNWIND;
+ /* Couldn't or didn't -- move forward. */
+ old = locinput++;
+ }
+ }
+ else
while (n >= ln || (n == REG_INFTY && ln > 0)) { /* ln overflow ? */
/* If it could work, try it. */
if (c1 == -1000 ||
@@ -1498,30 +3017,39 @@ regmatch(regnode *prog)
{
if (paren) {
if (n) {
- PL_regstartp[paren] = PL_reginput - 1;
- PL_regendp[paren] = PL_reginput;
- } else
- PL_regendp[paren] = NULL;
+ PL_regstartp[paren] = HOPc(PL_reginput, -1) - PL_bostr;
+ PL_regendp[paren] = PL_reginput - PL_bostr;
+ }
+ else
+ PL_regendp[paren] = -1;
}
if (regmatch(next))
sayYES;
REGCP_UNWIND;
}
/* Couldn't or didn't -- move forward. */
- PL_reginput = locinput + ln;
+ PL_reginput = locinput;
if (regrepeat(scan, 1)) {
ln++;
- PL_reginput = locinput + ln;
- } else
+ locinput = PL_reginput;
+ }
+ else
sayNO;
}
}
else {
CHECKPOINT lastcp;
n = regrepeat(scan, n);
- if (ln < n && regkind[(U8)OP(next)] == EOL &&
- (!PL_multiline || OP(next) == SEOL))
+ locinput = PL_reginput;
+ if (ln < n && PL_regkind[(U8)OP(next)] == EOL &&
+ (!PL_multiline || OP(next) == SEOL || OP(next) == EOS)) {
ln = n; /* why back off? */
+ /* ...because $ and \Z can match before *and* after
+ newline at the end. Consider "\n\n" =~ /\n+\Z\n/.
+ We should back off by one in this case. */
+ if (UCHARAT(PL_reginput - 1) == '\n' && OP(next) != EOS)
+ ln--;
+ }
REGCP_SET;
if (paren) {
while (n >= ln) {
@@ -1532,10 +3060,11 @@ regmatch(regnode *prog)
{
if (paren && n) {
if (n) {
- PL_regstartp[paren] = PL_reginput - 1;
- PL_regendp[paren] = PL_reginput;
- } else
- PL_regendp[paren] = NULL;
+ PL_regstartp[paren] = HOPc(PL_reginput, -1) - PL_bostr;
+ PL_regendp[paren] = PL_reginput - PL_bostr;
+ }
+ else
+ PL_regendp[paren] = -1;
}
if (regmatch(next))
sayYES;
@@ -1543,9 +3072,10 @@ regmatch(regnode *prog)
}
/* Couldn't or didn't -- back up. */
n--;
- PL_reginput = locinput + n;
+ PL_reginput = locinput = HOPc(locinput, -1);
}
- } else {
+ }
+ else {
while (n >= ln) {
/* If it could work, try it. */
if (c1 == -1000 ||
@@ -1558,34 +3088,108 @@ regmatch(regnode *prog)
}
/* Couldn't or didn't -- back up. */
n--;
- PL_reginput = locinput + n;
+ PL_reginput = locinput = HOPc(locinput, -1);
}
}
}
sayNO;
break;
case END:
- if (locinput < PL_regtill)
- sayNO; /* Cannot match: too short. */
- /* Fall through */
+ if (PL_reg_call_cc) {
+ re_cc_state *cur_call_cc = PL_reg_call_cc;
+ CURCUR *cctmp = PL_regcc;
+ regexp *re = PL_reg_re;
+ CHECKPOINT cp, lastcp;
+
+ cp = regcppush(0); /* Save *all* the positions. */
+ REGCP_SET;
+ regcp_set_to(PL_reg_call_cc->ss); /* Restore parens of
+ the caller. */
+ PL_reginput = locinput; /* Make position available to
+ the callcc. */
+ cache_re(PL_reg_call_cc->re);
+ PL_regcc = PL_reg_call_cc->cc;
+ PL_reg_call_cc = PL_reg_call_cc->prev;
+ if (regmatch(cur_call_cc->node)) {
+ PL_reg_call_cc = cur_call_cc;
+ regcpblow(cp);
+ sayYES;
+ }
+ REGCP_UNWIND;
+ regcppop();
+ PL_reg_call_cc = cur_call_cc;
+ PL_regcc = cctmp;
+ PL_reg_re = re;
+ cache_re(re);
+
+ DEBUG_r(
+ PerlIO_printf(Perl_debug_log,
+ "%*s continuation failed...\n",
+ REPORT_CODE_OFF+PL_regindent*2, "")
+ );
+ sayNO_SILENT;
+ }
+ if (locinput < PL_regtill) {
+ DEBUG_r(PerlIO_printf(Perl_debug_log,
+ "%sMatch possible, but length=%ld is smaller than requested=%ld, failing!%s\n",
+ PL_colors[4],
+ (long)(locinput - PL_reg_starttry),
+ (long)(PL_regtill - PL_reg_starttry),
+ PL_colors[5]));
+ sayNO_FINAL; /* Cannot match: too short. */
+ }
+ PL_reginput = locinput; /* put where regtry can find it */
+ sayYES_FINAL; /* Success! */
case SUCCEED:
PL_reginput = locinput; /* put where regtry can find it */
- sayYES; /* Success! */
+ sayYES_LOUD; /* Success! */
case SUSPEND:
n = 1;
PL_reginput = locinput;
goto do_ifmatch;
case UNLESSM:
n = 0;
- if (locinput < PL_bostr + scan->flags)
- goto say_yes;
+ if (scan->flags) {
+ if (UTF) { /* XXXX This is absolutely
+ broken, we read before
+ start of string. */
+ s = HOPMAYBEc(locinput, -scan->flags);
+ if (!s)
+ goto say_yes;
+ PL_reginput = s;
+ }
+ else {
+ if (locinput < PL_bostr + scan->flags)
+ goto say_yes;
+ PL_reginput = locinput - scan->flags;
+ goto do_ifmatch;
+ }
+ }
+ else
+ PL_reginput = locinput;
goto do_ifmatch;
case IFMATCH:
n = 1;
- if (locinput < PL_bostr + scan->flags)
- goto say_no;
+ if (scan->flags) {
+ if (UTF) { /* XXXX This is absolutely
+ broken, we read before
+ start of string. */
+ s = HOPMAYBEc(locinput, -scan->flags);
+ if (!s || s < PL_bostr)
+ goto say_no;
+ PL_reginput = s;
+ }
+ else {
+ if (locinput < PL_bostr + scan->flags)
+ goto say_no;
+ PL_reginput = locinput - scan->flags;
+ goto do_ifmatch;
+ }
+ }
+ else
+ PL_reginput = locinput;
+
do_ifmatch:
- PL_reginput = locinput - scan->flags;
inner = NEXTOPER(NEXTOPER(scan));
if (regmatch(inner) != n) {
say_no:
@@ -1593,7 +3197,8 @@ regmatch(regnode *prog)
logical = 0;
sw = 0;
goto do_longjump;
- } else
+ }
+ else
sayNO;
}
say_yes:
@@ -1613,9 +3218,9 @@ regmatch(regnode *prog)
next = NULL;
break;
default:
- PerlIO_printf(PerlIO_stderr(), "%lx %d\n",
- (unsigned long)scan, OP(scan));
- FAIL("regexp memory corruption");
+ PerlIO_printf(Perl_error_log, "%"UVxf" %d\n",
+ PTR2UV(scan), OP(scan));
+ Perl_croak(aTHX_ "regexp memory corruption");
}
scan = next;
}
@@ -1624,10 +3229,20 @@ regmatch(regnode *prog)
* We get here only if there's trouble -- normally "case END" is
* the terminating point.
*/
- FAIL("corrupted regexp pointers");
+ Perl_croak(aTHX_ "corrupted regexp pointers");
/*NOTREACHED*/
sayNO;
+yes_loud:
+ DEBUG_r(
+ PerlIO_printf(Perl_debug_log,
+ "%*s %scould match...%s\n",
+ REPORT_CODE_OFF+PL_regindent*2, "", PL_colors[4],PL_colors[5])
+ );
+ goto yes;
+yes_final:
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "%sMatch successful!%s\n",
+ PL_colors[4],PL_colors[5]));
yes:
#ifdef DEBUGGING
PL_regindent--;
@@ -1635,6 +3250,14 @@ yes:
return 1;
no:
+ DEBUG_r(
+ PerlIO_printf(Perl_debug_log,
+ "%*s %sfailed...%s\n",
+ REPORT_CODE_OFF+PL_regindent*2, "",PL_colors[4],PL_colors[5])
+ );
+ goto do_no;
+no_final:
+do_no:
#ifdef DEBUGGING
PL_regindent--;
#endif
@@ -1647,100 +3270,199 @@ no:
/*
* [This routine now assumes that it will only match on things of length 1.
* That was true before, but now we assume scan - reginput is the count,
- * rather than incrementing count on every character.]
+ * rather than incrementing count on every character. [Er, except utf8.]]
*/
STATIC I32
-regrepeat(regnode *p, I32 max)
+S_regrepeat(pTHX_ regnode *p, I32 max)
{
dTHR;
register char *scan;
- register char *opnd;
register I32 c;
register char *loceol = PL_regeol;
+ register I32 hardcount = 0;
scan = PL_reginput;
if (max != REG_INFTY && max < loceol - scan)
loceol = scan + max;
- opnd = (char *) OPERAND(p);
switch (OP(p)) {
- case ANY:
+ case REG_ANY:
while (scan < loceol && *scan != '\n')
scan++;
break;
case SANY:
scan = loceol;
break;
+ case ANYUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && *scan != '\n') {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
+ case SANYUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case EXACT: /* length of string is 1 */
- c = UCHARAT(++opnd);
+ c = (U8)*STRING(p);
while (scan < loceol && UCHARAT(scan) == c)
scan++;
break;
case EXACTF: /* length of string is 1 */
- c = UCHARAT(++opnd);
+ c = (U8)*STRING(p);
while (scan < loceol &&
- (UCHARAT(scan) == c || UCHARAT(scan) == fold[c]))
+ (UCHARAT(scan) == c || UCHARAT(scan) == PL_fold[c]))
scan++;
break;
case EXACTFL: /* length of string is 1 */
PL_reg_flags |= RF_tainted;
- c = UCHARAT(++opnd);
+ c = (U8)*STRING(p);
while (scan < loceol &&
- (UCHARAT(scan) == c || UCHARAT(scan) == fold_locale[c]))
+ (UCHARAT(scan) == c || UCHARAT(scan) == PL_fold_locale[c]))
scan++;
break;
+ case ANYOFUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && REGINCLASSUTF8(p, (U8*)scan)) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case ANYOF:
- while (scan < loceol && REGINCLASS(opnd, *scan))
+ while (scan < loceol && REGINCLASS(p, *scan))
scan++;
break;
case ALNUM:
while (scan < loceol && isALNUM(*scan))
scan++;
break;
+ case ALNUMUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && swash_fetch(PL_utf8_alnum, (U8*)scan)) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case ALNUML:
PL_reg_flags |= RF_tainted;
while (scan < loceol && isALNUM_LC(*scan))
scan++;
break;
+ case ALNUMLUTF8:
+ PL_reg_flags |= RF_tainted;
+ loceol = PL_regeol;
+ while (scan < loceol && isALNUM_LC_utf8((U8*)scan)) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
+ break;
case NALNUM:
while (scan < loceol && !isALNUM(*scan))
scan++;
break;
+ case NALNUMUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && !swash_fetch(PL_utf8_alnum, (U8*)scan)) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case NALNUML:
PL_reg_flags |= RF_tainted;
while (scan < loceol && !isALNUM_LC(*scan))
scan++;
break;
+ case NALNUMLUTF8:
+ PL_reg_flags |= RF_tainted;
+ loceol = PL_regeol;
+ while (scan < loceol && !isALNUM_LC_utf8((U8*)scan)) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case SPACE:
while (scan < loceol && isSPACE(*scan))
scan++;
break;
+ case SPACEUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && (*scan == ' ' || swash_fetch(PL_utf8_space,(U8*)scan))) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case SPACEL:
PL_reg_flags |= RF_tainted;
while (scan < loceol && isSPACE_LC(*scan))
scan++;
break;
+ case SPACELUTF8:
+ PL_reg_flags |= RF_tainted;
+ loceol = PL_regeol;
+ while (scan < loceol && (*scan == ' ' || isSPACE_LC_utf8((U8*)scan))) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case NSPACE:
while (scan < loceol && !isSPACE(*scan))
scan++;
break;
+ case NSPACEUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && !(*scan == ' ' || swash_fetch(PL_utf8_space,(U8*)scan))) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case NSPACEL:
PL_reg_flags |= RF_tainted;
while (scan < loceol && !isSPACE_LC(*scan))
scan++;
break;
+ case NSPACELUTF8:
+ PL_reg_flags |= RF_tainted;
+ loceol = PL_regeol;
+ while (scan < loceol && !(*scan == ' ' || isSPACE_LC_utf8((U8*)scan))) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
case DIGIT:
while (scan < loceol && isDIGIT(*scan))
scan++;
break;
+ case DIGITUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && swash_fetch(PL_utf8_digit,(U8*)scan)) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
+ break;
case NDIGIT:
while (scan < loceol && !isDIGIT(*scan))
scan++;
break;
+ case NDIGITUTF8:
+ loceol = PL_regeol;
+ while (scan < loceol && !swash_fetch(PL_utf8_digit,(U8*)scan)) {
+ scan += UTF8SKIP(scan);
+ hardcount++;
+ }
+ break;
default: /* Called on something of 0 width. */
break; /* So match right here or not at all. */
}
- c = scan - PL_reginput;
+ if (hardcount)
+ c = hardcount;
+ else
+ c = scan - PL_reginput;
PL_reginput = scan;
DEBUG_r(
@@ -1749,8 +3471,8 @@ regrepeat(regnode *p, I32 max)
regprop(prop, p);
PerlIO_printf(Perl_debug_log,
- "%*s %s can match %ld times out of %ld...\n",
- REPORT_CODE_OFF+1, "", SvPVX(prop),c,max);
+ "%*s %s can match %"IVdf" times out of %"IVdf"...\n",
+ REPORT_CODE_OFF+1, "", SvPVX(prop),(IV)c,(IV)max);
});
return(c);
@@ -1763,7 +3485,7 @@ regrepeat(regnode *p, I32 max)
*/
STATIC I32
-regrepeat_hard(regnode *p, I32 max, I32 *lp)
+S_regrepeat_hard(pTHX_ regnode *p, I32 max, I32 *lp)
{
dTHR;
register char *scan;
@@ -1776,13 +3498,31 @@ regrepeat_hard(regnode *p, I32 max, I32 *lp)
return 0;
start = PL_reginput;
- while (PL_reginput < loceol && (scan = PL_reginput, res = regmatch(p))) {
- if (!count++) {
- *lp = l = PL_reginput - start;
- if (max != REG_INFTY && l*max < loceol - scan)
- loceol = scan + l*max;
- if (l == 0)
- return max;
+ if (UTF) {
+ while (PL_reginput < loceol && (scan = PL_reginput, res = regmatch(p))) {
+ if (!count++) {
+ l = 0;
+ while (start < PL_reginput) {
+ l++;
+ start += UTF8SKIP(start);
+ }
+ *lp = l;
+ if (l == 0)
+ return max;
+ }
+ if (count == max)
+ return count;
+ }
+ }
+ else {
+ while (PL_reginput < loceol && (scan = PL_reginput, res = regmatch(p))) {
+ if (!count++) {
+ *lp = l = PL_reginput - start;
+ if (max != REG_INFTY && l*max < loceol - scan)
+ loceol = scan + l*max;
+ if (l == 0)
+ return max;
+ }
}
}
if (!res)
@@ -1792,38 +3532,61 @@ regrepeat_hard(regnode *p, I32 max, I32 *lp)
}
/*
- - regclass - determine if a character falls into a character class
+ - reginclass - determine if a character falls into a character class
*/
STATIC bool
-reginclass(register char *p, register I32 c)
+S_reginclass(pTHX_ register regnode *p, register I32 c)
{
dTHR;
- char flags = *p;
+ char flags = ANYOF_FLAGS(p);
bool match = FALSE;
c &= 0xFF;
- if (ANYOF_TEST(p, c))
+ if (ANYOF_BITMAP_TEST(p, c))
match = TRUE;
else if (flags & ANYOF_FOLD) {
I32 cf;
if (flags & ANYOF_LOCALE) {
PL_reg_flags |= RF_tainted;
- cf = fold_locale[c];
+ cf = PL_fold_locale[c];
}
else
- cf = fold[c];
- if (ANYOF_TEST(p, cf))
+ cf = PL_fold[c];
+ if (ANYOF_BITMAP_TEST(p, cf))
match = TRUE;
}
- if (!match && (flags & ANYOF_ISA)) {
+ if (!match && (flags & ANYOF_CLASS)) {
PL_reg_flags |= RF_tainted;
-
- if (((flags & ANYOF_ALNUML) && isALNUM_LC(c)) ||
- ((flags & ANYOF_NALNUML) && !isALNUM_LC(c)) ||
- ((flags & ANYOF_SPACEL) && isSPACE_LC(c)) ||
- ((flags & ANYOF_NSPACEL) && !isSPACE_LC(c)))
+ if (
+ (ANYOF_CLASS_TEST(p, ANYOF_ALNUM) && isALNUM_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NALNUM) && !isALNUM_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_SPACE) && isSPACE_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NSPACE) && !isSPACE_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_DIGIT) && isDIGIT_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NDIGIT) && !isDIGIT_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_ALNUMC) && isALNUMC_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NALNUMC) && !isALNUMC_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_ALPHA) && isALPHA_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NALPHA) && !isALPHA_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_ASCII) && isASCII(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NASCII) && !isASCII(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_CNTRL) && isCNTRL_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NCNTRL) && !isCNTRL_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_GRAPH) && isGRAPH_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NGRAPH) && !isGRAPH_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_LOWER) && isLOWER_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NLOWER) && !isLOWER_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_PRINT) && isPRINT_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NPRINT) && !isPRINT_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_PUNCT) && isPUNCT_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NPUNCT) && !isPUNCT_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_UPPER) && isUPPER_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NUPPER) && !isUPPER_LC(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_XDIGIT) && isXDIGIT(c)) ||
+ (ANYOF_CLASS_TEST(p, ANYOF_NXDIGIT) && !isXDIGIT(c))
+ ) /* How's that for a conditional? */
{
match = TRUE;
}
@@ -1832,5 +3595,100 @@ reginclass(register char *p, register I32 c)
return (flags & ANYOF_INVERT) ? !match : match;
}
+STATIC bool
+S_reginclassutf8(pTHX_ regnode *f, U8 *p)
+{
+ dTHR;
+ char flags = ARG1(f);
+ bool match = FALSE;
+ SV *sv = (SV*)PL_regdata->data[ARG2(f)];
+
+ if (swash_fetch(sv, p))
+ match = TRUE;
+ else if (flags & ANYOF_FOLD) {
+ U8 tmpbuf[UTF8_MAXLEN];
+ if (flags & ANYOF_LOCALE) {
+ PL_reg_flags |= RF_tainted;
+ uv_to_utf8(tmpbuf, toLOWER_LC_utf8(p));
+ }
+ else
+ uv_to_utf8(tmpbuf, toLOWER_utf8(p));
+ if (swash_fetch(sv, tmpbuf))
+ match = TRUE;
+ }
+ /* UTF8 combined with ANYOF_CLASS is ill-defined. */
+
+ return (flags & ANYOF_INVERT) ? !match : match;
+}
+
+STATIC U8 *
+S_reghop(pTHX_ U8 *s, I32 off)
+{
+ dTHR;
+ if (off >= 0) {
+ while (off-- && s < (U8*)PL_regeol)
+ s += UTF8SKIP(s);
+ }
+ else {
+ while (off++) {
+ if (s > (U8*)PL_bostr) {
+ s--;
+ if (*s & 0x80) {
+ while (s > (U8*)PL_bostr && (*s & 0xc0) == 0x80)
+ s--;
+ } /* XXX could check well-formedness here */
+ }
+ }
+ }
+ return s;
+}
+
+STATIC U8 *
+S_reghopmaybe(pTHX_ U8* s, I32 off)
+{
+ dTHR;
+ if (off >= 0) {
+ while (off-- && s < (U8*)PL_regeol)
+ s += UTF8SKIP(s);
+ if (off >= 0)
+ return 0;
+ }
+ else {
+ while (off++) {
+ if (s > (U8*)PL_bostr) {
+ s--;
+ if (*s & 0x80) {
+ while (s > (U8*)PL_bostr && (*s & 0xc0) == 0x80)
+ s--;
+ } /* XXX could check well-formedness here */
+ }
+ else
+ break;
+ }
+ if (off <= 0)
+ return 0;
+ }
+ return s;
+}
+
+#ifdef PERL_OBJECT
+#include "XSUB.h"
+#endif
+
+static void
+restore_pos(pTHXo_ void *arg)
+{
+ dTHR;
+ if (PL_reg_eval_set) {
+ if (PL_reg_oldsaved) {
+ PL_reg_re->subbeg = PL_reg_oldsaved;
+ PL_reg_re->sublen = PL_reg_oldsavedlen;
+ RX_MATCH_COPIED_on(PL_reg_re);
+ }
+ PL_reg_magic->mg_len = PL_reg_oldpos;
+ PL_reg_eval_set = 0;
+ PL_curpm = PL_reg_oldcurpm;
+ }
+}
diff --git a/contrib/perl5/regexp.h b/contrib/perl5/regexp.h
index fbc9237..ca0e9ed 100644
--- a/contrib/perl5/regexp.h
+++ b/contrib/perl5/regexp.h
@@ -17,78 +17,62 @@ struct regnode {
typedef struct regnode regnode;
-struct reg_data {
- U32 count;
- U8 *what;
- void* data[1];
-};
-
-struct reg_substr_datum {
- I32 min_offset;
- I32 max_offset;
- SV *substr;
-};
-
-struct reg_substr_data {
- struct reg_substr_datum data[3]; /* Actual array */
-};
+struct reg_substr_data;
typedef struct regexp {
- I32 refcnt;
- char **startp;
- char **endp;
+ I32 *startp;
+ I32 *endp;
regnode *regstclass;
+ struct reg_substr_data *substrs;
+ char *precomp; /* pre-compilation regular expression */
+ struct reg_data *data; /* Additional data. */
+ char *subbeg; /* saved or original string
+ so \digit works forever. */
+ I32 sublen; /* Length of string pointed by subbeg */
+ I32 refcnt;
I32 minlen; /* mininum possible length of $& */
I32 prelen; /* length of precomp */
U32 nparens; /* number of parentheses */
U32 lastparen; /* last paren matched */
- char *precomp; /* pre-compilation regular expression */
- char *subbase; /* saved string so \digit works forever */
- char *subbeg; /* same, but not responsible for allocation */
- char *subend; /* end of subbase */
- U16 naughty; /* how exponential is this pattern? */
- U16 reganch; /* Internal use only +
+ U32 reganch; /* Internal use only +
Tainted information used by regexec? */
-#if 0
- SV *anchored_substr; /* Substring at fixed position wrt start. */
- I32 anchored_offset; /* Position of it. */
- SV *float_substr; /* Substring at variable position wrt start. */
- I32 float_min_offset; /* Minimal position of it. */
- I32 float_max_offset; /* Maximal position of it. */
- SV *check_substr; /* Substring to check before matching. */
- I32 check_offset_min; /* Offset of the above. */
- I32 check_offset_max; /* Offset of the above. */
-#else
- struct reg_substr_data *substrs;
-#endif
- struct reg_data *data; /* Additional data. */
regnode program[1]; /* Unwarranted chumminess with compiler. */
} regexp;
-#define anchored_substr substrs->data[0].substr
-#define anchored_offset substrs->data[0].min_offset
-#define float_substr substrs->data[1].substr
-#define float_min_offset substrs->data[1].min_offset
-#define float_max_offset substrs->data[1].max_offset
-#define check_substr substrs->data[2].substr
-#define check_offset_min substrs->data[2].min_offset
-#define check_offset_max substrs->data[2].max_offset
-
-#define ROPT_ANCH (ROPT_ANCH_BOL|ROPT_ANCH_MBOL|ROPT_ANCH_GPOS)
-#define ROPT_ANCH_SINGLE (ROPT_ANCH_BOL|ROPT_ANCH_GPOS)
-#define ROPT_ANCH_BOL 1
-#define ROPT_ANCH_MBOL 2
-#define ROPT_ANCH_GPOS 4
-#define ROPT_SKIP 8
-#define ROPT_IMPLICIT 0x10 /* Converted .* to ^.* */
-#define ROPT_NOSCAN 0x20 /* Check-string always at start. */
-#define ROPT_GPOS_SEEN 0x40
-#define ROPT_CHECK_ALL 0x80
-#define ROPT_LOOKBEHIND_SEEN 0x100
-#define ROPT_EVAL_SEEN 0x200
-#define ROPT_TAINTED_SEEN 0x400
+#define ROPT_ANCH (ROPT_ANCH_BOL|ROPT_ANCH_MBOL|ROPT_ANCH_GPOS|ROPT_ANCH_SBOL)
+#define ROPT_ANCH_SINGLE (ROPT_ANCH_SBOL|ROPT_ANCH_GPOS)
+#define ROPT_ANCH_BOL 0x00001
+#define ROPT_ANCH_MBOL 0x00002
+#define ROPT_ANCH_SBOL 0x00004
+#define ROPT_ANCH_GPOS 0x00008
+#define ROPT_SKIP 0x00010
+#define ROPT_IMPLICIT 0x00020 /* Converted .* to ^.* */
+#define ROPT_NOSCAN 0x00040 /* Check-string always at start. */
+#define ROPT_GPOS_SEEN 0x00080
+#define ROPT_CHECK_ALL 0x00100
+#define ROPT_LOOKBEHIND_SEEN 0x00200
+#define ROPT_EVAL_SEEN 0x00400
+
/* 0xf800 of reganch is used by PMf_COMPILETIME */
+#define ROPT_UTF8 0x10000
+#define ROPT_NAUGHTY 0x20000 /* how exponential is this pattern? */
+#define ROPT_COPY_DONE 0x40000 /* subbeg is a copy of the string */
+#define ROPT_TAINTED_SEEN 0x80000
+
+#define RE_USE_INTUIT_NOML 0x0100000 /* Best to intuit before matching */
+#define RE_USE_INTUIT_ML 0x0200000
+#define REINT_AUTORITATIVE_NOML 0x0400000 /* Can trust a positive answer */
+#define REINT_AUTORITATIVE_ML 0x0800000
+#define REINT_ONCE_NOML 0x1000000 /* Intuit can succed once only. */
+#define REINT_ONCE_ML 0x2000000
+#define RE_INTUIT_ONECHAR 0x4000000
+#define RE_INTUIT_TAIL 0x8000000
+
+#define RE_USE_INTUIT (RE_USE_INTUIT_NOML|RE_USE_INTUIT_ML)
+#define REINT_AUTORITATIVE (REINT_AUTORITATIVE_NOML|REINT_AUTORITATIVE_ML)
+#define REINT_ONCE (REINT_ONCE_NOML|REINT_ONCE_ML)
+
#define RX_MATCH_TAINTED(prog) ((prog)->reganch & ROPT_TAINTED_SEEN)
#define RX_MATCH_TAINTED_on(prog) ((prog)->reganch |= ROPT_TAINTED_SEEN)
#define RX_MATCH_TAINTED_off(prog) ((prog)->reganch &= ~ROPT_TAINTED_SEEN)
@@ -96,8 +80,29 @@ typedef struct regexp {
? RX_MATCH_TAINTED_on(prog) \
: RX_MATCH_TAINTED_off(prog))
-#define REXEC_COPY_STR 1 /* Need to copy the string. */
-#define REXEC_CHECKED 2 /* check_substr already checked. */
+#define RX_MATCH_COPIED(prog) ((prog)->reganch & ROPT_COPY_DONE)
+#define RX_MATCH_COPIED_on(prog) ((prog)->reganch |= ROPT_COPY_DONE)
+#define RX_MATCH_COPIED_off(prog) ((prog)->reganch &= ~ROPT_COPY_DONE)
+#define RX_MATCH_COPIED_set(prog,t) ((t) \
+ ? RX_MATCH_COPIED_on(prog) \
+ : RX_MATCH_COPIED_off(prog))
+
+#define REXEC_COPY_STR 0x01 /* Need to copy the string. */
+#define REXEC_CHECKED 0x02 /* check_substr already checked. */
+#define REXEC_SCREAM 0x04 /* use scream table. */
+#define REXEC_IGNOREPOS 0x08 /* \G matches at start. */
+#define REXEC_NOT_FIRST 0x10 /* This is another iteration of //g. */
+#define REXEC_ML 0x20 /* $* was set. */
+
+#define ReREFCNT_inc(re) ((void)(re && re->refcnt++), re)
+#define ReREFCNT_dec(re) CALLREGFREE(aTHX_ re)
+
+#define FBMcf_TAIL_DOLLAR 1
+#define FBMcf_TAIL_DOLLARM 2
+#define FBMcf_TAIL_Z 4
+#define FBMcf_TAIL_z 8
+#define FBMcf_TAIL (FBMcf_TAIL_DOLLAR|FBMcf_TAIL_DOLLARM|FBMcf_TAIL_Z|FBMcf_TAIL_z)
+
+#define FBMrf_MULTILINE 1
-#define ReREFCNT_inc(re) ((re && re->refcnt++), re)
-#define ReREFCNT_dec(re) pregfree(re)
+struct re_scream_pos_data_s;
diff --git a/contrib/perl5/regnodes.h b/contrib/perl5/regnodes.h
index c494dae..c5725cd 100644
--- a/contrib/perl5/regnodes.h
+++ b/contrib/perl5/regnodes.h
@@ -1,5 +1,5 @@
/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- This file is built by regcomp.pl from regcomp.sym.
+ This file is built by regcomp.pl from regcomp.sym.
Any changes made here will be lost!
*/
@@ -13,59 +13,81 @@
#define MEOL 7 /* 0x7 Same, assuming multiline. */
#define SEOL 8 /* 0x8 Same, assuming singleline. */
#define BOUND 9 /* 0x9 Match "" at any word boundary */
-#define BOUNDL 10 /* 0xa Match "" at any word boundary */
-#define NBOUND 11 /* 0xb Match "" at any word non-boundary */
-#define NBOUNDL 12 /* 0xc Match "" at any word non-boundary */
-#define GPOS 13 /* 0xd Matches where last m//g left off. */
-#define ANY 14 /* 0xe Match any one character (except newline). */
-#define SANY 15 /* 0xf Match any one character. */
-#define ANYOF 16 /* 0x10 Match character in (or not in) this class. */
-#define ALNUM 17 /* 0x11 Match any alphanumeric character */
-#define ALNUML 18 /* 0x12 Match any alphanumeric char in locale */
-#define NALNUM 19 /* 0x13 Match any non-alphanumeric character */
-#define NALNUML 20 /* 0x14 Match any non-alphanumeric char in locale */
-#define SPACE 21 /* 0x15 Match any whitespace character */
-#define SPACEL 22 /* 0x16 Match any whitespace char in locale */
-#define NSPACE 23 /* 0x17 Match any non-whitespace character */
-#define NSPACEL 24 /* 0x18 Match any non-whitespace char in locale */
-#define DIGIT 25 /* 0x19 Match any numeric character */
-#define NDIGIT 26 /* 0x1a Match any non-numeric character */
-#define BRANCH 27 /* 0x1b Match this alternative, or the next... */
-#define BACK 28 /* 0x1c Match "", "next" ptr points backward. */
-#define EXACT 29 /* 0x1d Match this string (preceded by length). */
-#define EXACTF 30 /* 0x1e Match this string, folded (prec. by length). */
-#define EXACTFL 31 /* 0x1f Match this string, folded in locale (w/len). */
-#define NOTHING 32 /* 0x20 Match empty string. */
-#define TAIL 33 /* 0x21 Match empty string. Can jump here from outside. */
-#define STAR 34 /* 0x22 Match this (simple) thing 0 or more times. */
-#define PLUS 35 /* 0x23 Match this (simple) thing 1 or more times. */
-#define CURLY 36 /* 0x24 Match this simple thing {n,m} times. */
-#define CURLYN 37 /* 0x25 Match next-after-this simple thing */
-#define CURLYM 38 /* 0x26 Match this medium-complex thing {n,m} times. */
-#define CURLYX 39 /* 0x27 Match this complex thing {n,m} times. */
-#define WHILEM 40 /* 0x28 Do curly processing and see if rest matches. */
-#define OPEN 41 /* 0x29 Mark this point in input as start of #n. */
-#define CLOSE 42 /* 0x2a Analogous to OPEN. */
-#define REF 43 /* 0x2b Match some already matched string */
-#define REFF 44 /* 0x2c Match already matched string, folded */
-#define REFFL 45 /* 0x2d Match already matched string, folded in loc. */
-#define IFMATCH 46 /* 0x2e Succeeds if the following matches. */
-#define UNLESSM 47 /* 0x2f Fails if the following matches. */
-#define SUSPEND 48 /* 0x30 "Independent" sub-RE. */
-#define IFTHEN 49 /* 0x31 Switch, should be preceeded by switcher . */
-#define GROUPP 50 /* 0x32 Whether the group matched. */
-#define LONGJMP 51 /* 0x33 Jump far away. */
-#define BRANCHJ 52 /* 0x34 BRANCH with long offset. */
-#define EVAL 53 /* 0x35 Execute some Perl code. */
-#define MINMOD 54 /* 0x36 Next operator is not greedy. */
-#define LOGICAL 55 /* 0x37 Next opcode should set the flag only. */
-#define RENUM 56 /* 0x38 Group with independently numbered parens. */
-#define OPTIMIZED 57 /* 0x39 Placeholder for dump. */
+#define BOUNDUTF8 10 /* 0xa Match "" at any word boundary */
+#define BOUNDL 11 /* 0xb Match "" at any word boundary */
+#define BOUNDLUTF8 12 /* 0xc Match "" at any word boundary */
+#define NBOUND 13 /* 0xd Match "" at any word non-boundary */
+#define NBOUNDUTF8 14 /* 0xe Match "" at any word non-boundary */
+#define NBOUNDL 15 /* 0xf Match "" at any word non-boundary */
+#define NBOUNDLUTF8 16 /* 0x10 Match "" at any word non-boundary */
+#define GPOS 17 /* 0x11 Matches where last m//g left off. */
+#define REG_ANY 18 /* 0x12 Match any one character (except newline). */
+#define ANYUTF8 19 /* 0x13 Match any one Unicode character (except newline). */
+#define SANY 20 /* 0x14 Match any one character. */
+#define SANYUTF8 21 /* 0x15 Match any one Unicode character. */
+#define ANYOF 22 /* 0x16 Match character in (or not in) this class. */
+#define ANYOFUTF8 23 /* 0x17 Match character in (or not in) this class. */
+#define ALNUM 24 /* 0x18 Match any alphanumeric character */
+#define ALNUMUTF8 25 /* 0x19 Match any alphanumeric character in utf8 */
+#define ALNUML 26 /* 0x1a Match any alphanumeric char in locale */
+#define ALNUMLUTF8 27 /* 0x1b Match any alphanumeric char in locale+utf8 */
+#define NALNUM 28 /* 0x1c Match any non-alphanumeric character */
+#define NALNUMUTF8 29 /* 0x1d Match any non-alphanumeric character in utf8 */
+#define NALNUML 30 /* 0x1e Match any non-alphanumeric char in locale */
+#define NALNUMLUTF8 31 /* 0x1f Match any non-alphanumeric char in locale+utf8 */
+#define SPACE 32 /* 0x20 Match any whitespace character */
+#define SPACEUTF8 33 /* 0x21 Match any whitespace character in utf8 */
+#define SPACEL 34 /* 0x22 Match any whitespace char in locale */
+#define SPACELUTF8 35 /* 0x23 Match any whitespace char in locale+utf8 */
+#define NSPACE 36 /* 0x24 Match any non-whitespace character */
+#define NSPACEUTF8 37 /* 0x25 Match any non-whitespace character in utf8 */
+#define NSPACEL 38 /* 0x26 Match any non-whitespace char in locale */
+#define NSPACELUTF8 39 /* 0x27 Match any non-whitespace char in locale+utf8 */
+#define DIGIT 40 /* 0x28 Match any numeric character */
+#define DIGITUTF8 41 /* 0x29 Match any numeric character in utf8 */
+#define DIGITL 42 /* 0x2a Match any numeric character in locale */
+#define DIGITLUTF8 43 /* 0x2b Match any numeric character in locale+utf8 */
+#define NDIGIT 44 /* 0x2c Match any non-numeric character */
+#define NDIGITUTF8 45 /* 0x2d Match any non-numeric character in utf8 */
+#define NDIGITL 46 /* 0x2e Match any non-numeric character in locale */
+#define NDIGITLUTF8 47 /* 0x2f Match any non-numeric character in locale+utf8 */
+#define CLUMP 48 /* 0x30 Match any combining character sequence */
+#define BRANCH 49 /* 0x31 Match this alternative, or the next... */
+#define BACK 50 /* 0x32 Match "", "next" ptr points backward. */
+#define EXACT 51 /* 0x33 Match this string (preceded by length). */
+#define EXACTF 52 /* 0x34 Match this string, folded (prec. by length). */
+#define EXACTFL 53 /* 0x35 Match this string, folded in locale (w/len). */
+#define NOTHING 54 /* 0x36 Match empty string. */
+#define TAIL 55 /* 0x37 Match empty string. Can jump here from outside. */
+#define STAR 56 /* 0x38 Match this (simple) thing 0 or more times. */
+#define PLUS 57 /* 0x39 Match this (simple) thing 1 or more times. */
+#define CURLY 58 /* 0x3a Match this simple thing {n,m} times. */
+#define CURLYN 59 /* 0x3b Match next-after-this simple thing */
+#define CURLYM 60 /* 0x3c Match this medium-complex thing {n,m} times. */
+#define CURLYX 61 /* 0x3d Match this complex thing {n,m} times. */
+#define WHILEM 62 /* 0x3e Do curly processing and see if rest matches. */
+#define OPEN 63 /* 0x3f Mark this point in input as start of #n. */
+#define CLOSE 64 /* 0x40 Analogous to OPEN. */
+#define REF 65 /* 0x41 Match some already matched string */
+#define REFF 66 /* 0x42 Match already matched string, folded */
+#define REFFL 67 /* 0x43 Match already matched string, folded in loc. */
+#define IFMATCH 68 /* 0x44 Succeeds if the following matches. */
+#define UNLESSM 69 /* 0x45 Fails if the following matches. */
+#define SUSPEND 70 /* 0x46 "Independent" sub-RE. */
+#define IFTHEN 71 /* 0x47 Switch, should be preceeded by switcher . */
+#define GROUPP 72 /* 0x48 Whether the group matched. */
+#define LONGJMP 73 /* 0x49 Jump far away. */
+#define BRANCHJ 74 /* 0x4a BRANCH with long offset. */
+#define EVAL 75 /* 0x4b Execute some Perl code. */
+#define MINMOD 76 /* 0x4c Next operator is not greedy. */
+#define LOGICAL 77 /* 0x4d Next opcode should set the flag only. */
+#define RENUM 78 /* 0x4e Group with independently numbered parens. */
+#define OPTIMIZED 79 /* 0x4f Placeholder for dump. */
#ifndef DOINIT
-EXTCONST U8 regkind[];
+EXTCONST U8 PL_regkind[];
#else
-EXTCONST U8 regkind[] = {
+EXTCONST U8 PL_regkind[] = {
END, /* END */
END, /* SUCCEED */
BOL, /* BOL */
@@ -76,23 +98,45 @@ EXTCONST U8 regkind[] = {
EOL, /* MEOL */
EOL, /* SEOL */
BOUND, /* BOUND */
+ BOUND, /* BOUNDUTF8 */
BOUND, /* BOUNDL */
+ BOUND, /* BOUNDLUTF8 */
NBOUND, /* NBOUND */
+ NBOUND, /* NBOUNDUTF8 */
NBOUND, /* NBOUNDL */
+ NBOUND, /* NBOUNDLUTF8 */
GPOS, /* GPOS */
- ANY, /* ANY */
- ANY, /* SANY */
+ REG_ANY, /* REG_ANY */
+ REG_ANY, /* ANYUTF8 */
+ REG_ANY, /* SANY */
+ REG_ANY, /* SANYUTF8 */
ANYOF, /* ANYOF */
+ ANYOF, /* ANYOFUTF8 */
ALNUM, /* ALNUM */
+ ALNUM, /* ALNUMUTF8 */
ALNUM, /* ALNUML */
+ ALNUM, /* ALNUMLUTF8 */
NALNUM, /* NALNUM */
+ NALNUM, /* NALNUMUTF8 */
NALNUM, /* NALNUML */
+ NALNUM, /* NALNUMLUTF8 */
SPACE, /* SPACE */
+ SPACE, /* SPACEUTF8 */
SPACE, /* SPACEL */
+ SPACE, /* SPACELUTF8 */
NSPACE, /* NSPACE */
+ NSPACE, /* NSPACEUTF8 */
NSPACE, /* NSPACEL */
+ NSPACE, /* NSPACELUTF8 */
DIGIT, /* DIGIT */
+ DIGIT, /* DIGITUTF8 */
+ DIGIT, /* DIGITL */
+ DIGIT, /* DIGITLUTF8 */
NDIGIT, /* NDIGIT */
+ NDIGIT, /* NDIGITUTF8 */
+ NDIGIT, /* NDIGITL */
+ NDIGIT, /* NDIGITLUTF8 */
+ CLUMP, /* CLUMP */
BRANCH, /* BRANCH */
BACK, /* BACK */
EXACT, /* EXACT */
@@ -140,23 +184,45 @@ const static U8 regarglen[] = {
0, /* MEOL */
0, /* SEOL */
0, /* BOUND */
+ 0, /* BOUNDUTF8 */
0, /* BOUNDL */
+ 0, /* BOUNDLUTF8 */
0, /* NBOUND */
+ 0, /* NBOUNDUTF8 */
0, /* NBOUNDL */
+ 0, /* NBOUNDLUTF8 */
0, /* GPOS */
- 0, /* ANY */
+ 0, /* REG_ANY */
+ 0, /* ANYUTF8 */
0, /* SANY */
+ 0, /* SANYUTF8 */
0, /* ANYOF */
+ EXTRA_SIZE(struct regnode_1), /* ANYOFUTF8 */
0, /* ALNUM */
+ 0, /* ALNUMUTF8 */
0, /* ALNUML */
+ 0, /* ALNUMLUTF8 */
0, /* NALNUM */
+ 0, /* NALNUMUTF8 */
0, /* NALNUML */
+ 0, /* NALNUMLUTF8 */
0, /* SPACE */
+ 0, /* SPACEUTF8 */
0, /* SPACEL */
+ 0, /* SPACELUTF8 */
0, /* NSPACE */
+ 0, /* NSPACEUTF8 */
0, /* NSPACEL */
+ 0, /* NSPACELUTF8 */
0, /* DIGIT */
+ 0, /* DIGITUTF8 */
+ 0, /* DIGITL */
+ 0, /* DIGITLUTF8 */
0, /* NDIGIT */
+ 0, /* NDIGITUTF8 */
+ 0, /* NDIGITL */
+ 0, /* NDIGITLUTF8 */
+ 0, /* CLUMP */
0, /* BRANCH */
0, /* BACK */
0, /* EXACT */
@@ -201,23 +267,45 @@ const static char reg_off_by_arg[] = {
0, /* MEOL */
0, /* SEOL */
0, /* BOUND */
+ 0, /* BOUNDUTF8 */
0, /* BOUNDL */
+ 0, /* BOUNDLUTF8 */
0, /* NBOUND */
+ 0, /* NBOUNDUTF8 */
0, /* NBOUNDL */
+ 0, /* NBOUNDLUTF8 */
0, /* GPOS */
- 0, /* ANY */
+ 0, /* REG_ANY */
+ 0, /* ANYUTF8 */
0, /* SANY */
+ 0, /* SANYUTF8 */
0, /* ANYOF */
+ 0, /* ANYOFUTF8 */
0, /* ALNUM */
+ 0, /* ALNUMUTF8 */
0, /* ALNUML */
+ 0, /* ALNUMLUTF8 */
0, /* NALNUM */
+ 0, /* NALNUMUTF8 */
0, /* NALNUML */
+ 0, /* NALNUMLUTF8 */
0, /* SPACE */
+ 0, /* SPACEUTF8 */
0, /* SPACEL */
+ 0, /* SPACELUTF8 */
0, /* NSPACE */
+ 0, /* NSPACEUTF8 */
0, /* NSPACEL */
+ 0, /* NSPACELUTF8 */
0, /* DIGIT */
+ 0, /* DIGITUTF8 */
+ 0, /* DIGITL */
+ 0, /* DIGITLUTF8 */
0, /* NDIGIT */
+ 0, /* NDIGITUTF8 */
+ 0, /* NDIGITL */
+ 0, /* NDIGITLUTF8 */
+ 0, /* CLUMP */
0, /* BRANCH */
0, /* BACK */
0, /* EXACT */
@@ -250,5 +338,93 @@ const static char reg_off_by_arg[] = {
1, /* RENUM */
0, /* OPTIMIZED */
};
+
+#ifdef DEBUGGING
+const static char * const reg_name[] = {
+ "END", /* 0 */
+ "SUCCEED", /* 0x1 */
+ "BOL", /* 0x2 */
+ "MBOL", /* 0x3 */
+ "SBOL", /* 0x4 */
+ "EOS", /* 0x5 */
+ "EOL", /* 0x6 */
+ "MEOL", /* 0x7 */
+ "SEOL", /* 0x8 */
+ "BOUND", /* 0x9 */
+ "BOUNDUTF8", /* 0xa */
+ "BOUNDL", /* 0xb */
+ "BOUNDLUTF8", /* 0xc */
+ "NBOUND", /* 0xd */
+ "NBOUNDUTF8", /* 0xe */
+ "NBOUNDL", /* 0xf */
+ "NBOUNDLUTF8", /* 0x10 */
+ "GPOS", /* 0x11 */
+ "REG_ANY", /* 0x12 */
+ "ANYUTF8", /* 0x13 */
+ "SANY", /* 0x14 */
+ "SANYUTF8", /* 0x15 */
+ "ANYOF", /* 0x16 */
+ "ANYOFUTF8", /* 0x17 */
+ "ALNUM", /* 0x18 */
+ "ALNUMUTF8", /* 0x19 */
+ "ALNUML", /* 0x1a */
+ "ALNUMLUTF8", /* 0x1b */
+ "NALNUM", /* 0x1c */
+ "NALNUMUTF8", /* 0x1d */
+ "NALNUML", /* 0x1e */
+ "NALNUMLUTF8", /* 0x1f */
+ "SPACE", /* 0x20 */
+ "SPACEUTF8", /* 0x21 */
+ "SPACEL", /* 0x22 */
+ "SPACELUTF8", /* 0x23 */
+ "NSPACE", /* 0x24 */
+ "NSPACEUTF8", /* 0x25 */
+ "NSPACEL", /* 0x26 */
+ "NSPACELUTF8", /* 0x27 */
+ "DIGIT", /* 0x28 */
+ "DIGITUTF8", /* 0x29 */
+ "DIGITL", /* 0x2a */
+ "DIGITLUTF8", /* 0x2b */
+ "NDIGIT", /* 0x2c */
+ "NDIGITUTF8", /* 0x2d */
+ "NDIGITL", /* 0x2e */
+ "NDIGITLUTF8", /* 0x2f */
+ "CLUMP", /* 0x30 */
+ "BRANCH", /* 0x31 */
+ "BACK", /* 0x32 */
+ "EXACT", /* 0x33 */
+ "EXACTF", /* 0x34 */
+ "EXACTFL", /* 0x35 */
+ "NOTHING", /* 0x36 */
+ "TAIL", /* 0x37 */
+ "STAR", /* 0x38 */
+ "PLUS", /* 0x39 */
+ "CURLY", /* 0x3a */
+ "CURLYN", /* 0x3b */
+ "CURLYM", /* 0x3c */
+ "CURLYX", /* 0x3d */
+ "WHILEM", /* 0x3e */
+ "OPEN", /* 0x3f */
+ "CLOSE", /* 0x40 */
+ "REF", /* 0x41 */
+ "REFF", /* 0x42 */
+ "REFFL", /* 0x43 */
+ "IFMATCH", /* 0x44 */
+ "UNLESSM", /* 0x45 */
+ "SUSPEND", /* 0x46 */
+ "IFTHEN", /* 0x47 */
+ "GROUPP", /* 0x48 */
+ "LONGJMP", /* 0x49 */
+ "BRANCHJ", /* 0x4a */
+ "EVAL", /* 0x4b */
+ "MINMOD", /* 0x4c */
+ "LOGICAL", /* 0x4d */
+ "RENUM", /* 0x4e */
+ "OPTIMIZED", /* 0x4f */
+};
+
+const static int reg_num = 80;
+
+#endif /* DEBUGGING */
#endif /* REG_COMP_C */
diff --git a/contrib/perl5/run.c b/contrib/perl5/run.c
index ed50fb0..728b761 100644
--- a/contrib/perl5/run.c
+++ b/contrib/perl5/run.c
@@ -1,6 +1,6 @@
/* run.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -8,6 +8,7 @@
*/
#include "EXTERN.h"
+#define PERL_IN_RUN_C
#include "perl.h"
/*
@@ -16,54 +17,43 @@
* know. Run now! Hope is in speed!" --Gandalf
*/
-#ifdef PERL_OBJECT
-#define CALLOP this->*PL_op
-#else
-#define CALLOP *PL_op
-#endif
-
int
-runops_standard(void)
+Perl_runops_standard(pTHX)
{
dTHR;
- while ( PL_op = (CALLOP->op_ppaddr)(ARGS) ) ;
+ while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))) {
+ PERL_ASYNC_CHECK();
+ }
TAINT_NOT;
return 0;
}
-#ifdef DEBUGGING
-
-dEXT char **watchaddr = 0;
-dEXT char *watchok;
-
-#ifndef PERL_OBJECT
-static void debprof _((OP*o));
-#endif
-
-#endif /* DEBUGGING */
-
int
-runops_debug(void)
+Perl_runops_debug(pTHX)
{
#ifdef DEBUGGING
dTHR;
if (!PL_op) {
- warn("NULL OP IN RUN");
+ if (ckWARN_d(WARN_DEBUGGING))
+ Perl_warner(aTHX_ WARN_DEBUGGING, "NULL OP IN RUN");
return 0;
}
do {
+ PERL_ASYNC_CHECK();
if (PL_debug) {
- if (watchaddr != 0 && *watchaddr != watchok)
- PerlIO_printf(Perl_debug_log, "WARNING: %lx changed from %lx to %lx\n",
- (long)watchaddr, (long)watchok, (long)*watchaddr);
+ if (PL_watchaddr != 0 && *PL_watchaddr != PL_watchok)
+ PerlIO_printf(Perl_debug_log,
+ "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
+ PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
+ PTR2UV(*PL_watchaddr));
DEBUG_s(debstack());
DEBUG_t(debop(PL_op));
DEBUG_P(debprof(PL_op));
}
- } while ( PL_op = (CALLOP->op_ppaddr)(ARGS) );
+ } while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX)));
TAINT_NOT;
return 0;
@@ -73,21 +63,21 @@ runops_debug(void)
}
I32
-debop(OP *o)
+Perl_debop(pTHX_ OP *o)
{
#ifdef DEBUGGING
SV *sv;
STRLEN n_a;
- deb("%s", op_name[o->op_type]);
+ Perl_deb(aTHX_ "%s", PL_op_name[o->op_type]);
switch (o->op_type) {
case OP_CONST:
- PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo->op_sv));
+ PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
break;
case OP_GVSV:
case OP_GV:
- if (cGVOPo->op_gv) {
+ if (cGVOPo_gv) {
sv = NEWSV(0,0);
- gv_fullname3(sv, cGVOPo->op_gv, Nullch);
+ gv_fullname3(sv, cGVOPo_gv, Nullch);
PerlIO_printf(Perl_debug_log, "(%s)", SvPV(sv, n_a));
SvREFCNT_dec(sv);
}
@@ -103,18 +93,19 @@ debop(OP *o)
}
void
-watch(char **addr)
+Perl_watch(pTHX_ char **addr)
{
#ifdef DEBUGGING
- watchaddr = addr;
- watchok = *addr;
- PerlIO_printf(Perl_debug_log, "WATCHING, %lx is currently %lx\n",
- (long)watchaddr, (long)watchok);
+ dTHR;
+ PL_watchaddr = addr;
+ PL_watchok = *addr;
+ PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
+ PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
#endif /* DEBUGGING */
}
STATIC void
-debprof(OP *o)
+S_debprof(pTHX_ OP *o)
{
#ifdef DEBUGGING
if (!PL_profiledata)
@@ -124,7 +115,7 @@ debprof(OP *o)
}
void
-debprofdump(void)
+Perl_debprofdump(pTHX)
{
#ifdef DEBUGGING
unsigned i;
@@ -134,7 +125,7 @@ debprofdump(void)
if (PL_profiledata[i])
PerlIO_printf(Perl_debug_log,
"%5lu %s\n", (unsigned long)PL_profiledata[i],
- op_name[i]);
+ PL_op_name[i]);
}
#endif /* DEBUGGING */
}
diff --git a/contrib/perl5/scope.c b/contrib/perl5/scope.c
index ff893e6..3b9f0d1 100644
--- a/contrib/perl5/scope.c
+++ b/contrib/perl5/scope.c
@@ -1,6 +1,6 @@
/* scope.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -13,10 +13,43 @@
*/
#include "EXTERN.h"
+#define PERL_IN_SCOPE_C
#include "perl.h"
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
+void *
+Perl_default_protect(pTHX_ volatile JMPENV *pcur_env, int *excpt,
+ protect_body_t body, ...)
+{
+ void *ret;
+ va_list args;
+ va_start(args, body);
+ ret = vdefault_protect(pcur_env, excpt, body, &args);
+ va_end(args);
+ return ret;
+}
+
+void *
+Perl_vdefault_protect(pTHX_ volatile JMPENV *pcur_env, int *excpt,
+ protect_body_t body, va_list *args)
+{
+ dTHR;
+ int ex;
+ void *ret;
+
+ JMPENV_PUSH(ex);
+ if (ex)
+ ret = NULL;
+ else
+ ret = CALL_FPTR(body)(aTHX_ *args);
+ *excpt = ex;
+ JMPENV_POP;
+ return ret;
+}
+#endif
+
SV**
-stack_grow(SV **sp, SV **p, int n)
+Perl_stack_grow(pTHX_ SV **sp, SV **p, int n)
{
dTHR;
#if defined(DEBUGGING) && !defined(USE_THREADS)
@@ -43,10 +76,9 @@ stack_grow(SV **sp, SV **p, int n)
#endif
PERL_SI *
-new_stackinfo(I32 stitems, I32 cxitems)
+Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
{
PERL_SI *si;
- PERL_CONTEXT *cxt;
New(56, si, 1, PERL_SI);
si->si_stack = newAV();
AvREAL_off(si->si_stack);
@@ -63,7 +95,7 @@ new_stackinfo(I32 stitems, I32 cxitems)
}
I32
-cxinc(void)
+Perl_cxinc(pTHX)
{
dTHR;
cxstack_max = GROW(cxstack_max);
@@ -72,7 +104,7 @@ cxinc(void)
}
void
-push_return(OP *retop)
+Perl_push_return(pTHX_ OP *retop)
{
dTHR;
if (PL_retstack_ix == PL_retstack_max) {
@@ -83,7 +115,7 @@ push_return(OP *retop)
}
OP *
-pop_return(void)
+Perl_pop_return(pTHX)
{
dTHR;
if (PL_retstack_ix > 0)
@@ -93,7 +125,7 @@ pop_return(void)
}
void
-push_scope(void)
+Perl_push_scope(pTHX)
{
dTHR;
if (PL_scopestack_ix == PL_scopestack_max) {
@@ -105,7 +137,7 @@ push_scope(void)
}
void
-pop_scope(void)
+Perl_pop_scope(pTHX)
{
dTHR;
I32 oldsave = PL_scopestack[--PL_scopestack_ix];
@@ -113,7 +145,7 @@ pop_scope(void)
}
void
-markstack_grow(void)
+Perl_markstack_grow(pTHX)
{
dTHR;
I32 oldmax = PL_markstack_max - PL_markstack;
@@ -125,7 +157,7 @@ markstack_grow(void)
}
void
-savestack_grow(void)
+Perl_savestack_grow(pTHX)
{
dTHR;
PL_savestack_max = GROW(PL_savestack_max) + 4;
@@ -135,7 +167,20 @@ savestack_grow(void)
#undef GROW
void
-free_tmps(void)
+Perl_tmps_grow(pTHX_ I32 n)
+{
+ dTHR;
+#ifndef STRESS_REALLOC
+ if (n < 128)
+ n = (PL_tmps_max < 512) ? 128 : 512;
+#endif
+ PL_tmps_max = PL_tmps_ix + n + 1;
+ Renew(PL_tmps_stack, PL_tmps_max, SV*);
+}
+
+
+void
+Perl_free_tmps(pTHX)
{
dTHR;
/* XXX should tmps_floor live in cxstack? */
@@ -151,7 +196,7 @@ free_tmps(void)
}
STATIC SV *
-save_scalar_at(SV **sptr)
+S_save_scalar_at(pTHX_ SV **sptr)
{
dTHR;
register SV *sv;
@@ -182,7 +227,7 @@ save_scalar_at(SV **sptr)
}
SV *
-save_scalar(GV *gv)
+Perl_save_scalar(pTHX_ GV *gv)
{
dTHR;
SV **sptr = &GvSV(gv);
@@ -194,7 +239,7 @@ save_scalar(GV *gv)
}
SV*
-save_svref(SV **sptr)
+Perl_save_svref(pTHX_ SV **sptr)
{
dTHR;
SSCHECK(3);
@@ -207,7 +252,7 @@ save_svref(SV **sptr)
/* Like save_svref(), but doesn't deal with magic. Can be used to
* restore a global SV to its prior contents, freeing new value. */
void
-save_generic_svref(SV **sptr)
+Perl_save_generic_svref(pTHX_ SV **sptr)
{
dTHR;
SSCHECK(3);
@@ -217,7 +262,7 @@ save_generic_svref(SV **sptr)
}
void
-save_gp(GV *gv, I32 empty)
+Perl_save_gp(pTHX_ GV *gv, I32 empty)
{
dTHR;
SSCHECK(6);
@@ -233,12 +278,17 @@ save_gp(GV *gv, I32 empty)
if (empty) {
register GP *gp;
+ Newz(602, gp, 1, GP);
+
if (GvCVu(gv))
PL_sub_generation++; /* taking a method out of circulation */
- Newz(602, gp, 1, GP);
+ if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
+ gp->gp_io = newIO();
+ IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
+ }
GvGP(gv) = gp_ref(gp);
GvSV(gv) = NEWSV(72,0);
- GvLINE(gv) = PL_curcop->cop_line;
+ GvLINE(gv) = CopLINE(PL_curcop);
GvEGV(gv) = gv;
}
else {
@@ -248,7 +298,7 @@ save_gp(GV *gv, I32 empty)
}
AV *
-save_ary(GV *gv)
+Perl_save_ary(pTHX_ GV *gv)
{
dTHR;
AV *oav = GvAVn(gv);
@@ -265,7 +315,7 @@ save_ary(GV *gv)
av = GvAVn(gv);
if (SvMAGIC(oav)) {
SvMAGIC(av) = SvMAGIC(oav);
- SvFLAGS(av) |= SvMAGICAL(oav);
+ SvFLAGS((SV*)av) |= SvMAGICAL(oav);
SvMAGICAL_off(oav);
SvMAGIC(oav) = 0;
PL_localizing = 1;
@@ -276,7 +326,7 @@ save_ary(GV *gv)
}
HV *
-save_hash(GV *gv)
+Perl_save_hash(pTHX_ GV *gv)
{
dTHR;
HV *ohv, *hv;
@@ -290,7 +340,7 @@ save_hash(GV *gv)
hv = GvHVn(gv);
if (SvMAGIC(ohv)) {
SvMAGIC(hv) = SvMAGIC(ohv);
- SvFLAGS(hv) |= SvMAGICAL(ohv);
+ SvFLAGS((SV*)hv) |= SvMAGICAL(ohv);
SvMAGICAL_off(ohv);
SvMAGIC(ohv) = 0;
PL_localizing = 1;
@@ -301,7 +351,7 @@ save_hash(GV *gv)
}
void
-save_item(register SV *item)
+Perl_save_item(pTHX_ register SV *item)
{
dTHR;
register SV *sv = NEWSV(0,0);
@@ -314,7 +364,7 @@ save_item(register SV *item)
}
void
-save_int(int *intp)
+Perl_save_int(pTHX_ int *intp)
{
dTHR;
SSCHECK(3);
@@ -324,7 +374,7 @@ save_int(int *intp)
}
void
-save_long(long int *longp)
+Perl_save_long(pTHX_ long int *longp)
{
dTHR;
SSCHECK(3);
@@ -334,7 +384,7 @@ save_long(long int *longp)
}
void
-save_I32(I32 *intp)
+Perl_save_I32(pTHX_ I32 *intp)
{
dTHR;
SSCHECK(3);
@@ -344,7 +394,7 @@ save_I32(I32 *intp)
}
void
-save_I16(I16 *intp)
+Perl_save_I16(pTHX_ I16 *intp)
{
dTHR;
SSCHECK(3);
@@ -354,7 +404,17 @@ save_I16(I16 *intp)
}
void
-save_iv(IV *ivp)
+Perl_save_I8(pTHX_ I8 *bytep)
+{
+ dTHR;
+ SSCHECK(3);
+ SSPUSHINT(*bytep);
+ SSPUSHPTR(bytep);
+ SSPUSHINT(SAVEt_I8);
+}
+
+void
+Perl_save_iv(pTHX_ IV *ivp)
{
dTHR;
SSCHECK(3);
@@ -367,7 +427,7 @@ save_iv(IV *ivp)
* force word-alignment and we'll miss the pointer.
*/
void
-save_pptr(char **pptr)
+Perl_save_pptr(pTHX_ char **pptr)
{
dTHR;
SSCHECK(3);
@@ -377,7 +437,17 @@ save_pptr(char **pptr)
}
void
-save_sptr(SV **sptr)
+Perl_save_vptr(pTHX_ void *ptr)
+{
+ dTHR;
+ SSCHECK(3);
+ SSPUSHPTR(*(char**)ptr);
+ SSPUSHPTR(ptr);
+ SSPUSHINT(SAVEt_VPTR);
+}
+
+void
+Perl_save_sptr(pTHX_ SV **sptr)
{
dTHR;
SSCHECK(3);
@@ -387,23 +457,23 @@ save_sptr(SV **sptr)
}
SV **
-save_threadsv(PADOFFSET i)
+Perl_save_threadsv(pTHX_ PADOFFSET i)
{
#ifdef USE_THREADS
dTHR;
SV **svp = &THREADSV(i); /* XXX Change to save by offset */
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "save_threadsv %u: %p %p:%s\n",
- i, svp, *svp, SvPEEK(*svp)));
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "save_threadsv %"UVuf": %p %p:%s\n",
+ (UV)i, svp, *svp, SvPEEK(*svp)));
save_svref(svp);
return svp;
#else
- croak("panic: save_threadsv called in non-threaded perl");
+ Perl_croak(aTHX_ "panic: save_threadsv called in non-threaded perl");
return 0;
#endif /* USE_THREADS */
}
void
-save_nogv(GV *gv)
+Perl_save_nogv(pTHX_ GV *gv)
{
dTHR;
SSCHECK(2);
@@ -412,7 +482,7 @@ save_nogv(GV *gv)
}
void
-save_hptr(HV **hptr)
+Perl_save_hptr(pTHX_ HV **hptr)
{
dTHR;
SSCHECK(3);
@@ -422,7 +492,7 @@ save_hptr(HV **hptr)
}
void
-save_aptr(AV **aptr)
+Perl_save_aptr(pTHX_ AV **aptr)
{
dTHR;
SSCHECK(3);
@@ -432,7 +502,7 @@ save_aptr(AV **aptr)
}
void
-save_freesv(SV *sv)
+Perl_save_freesv(pTHX_ SV *sv)
{
dTHR;
SSCHECK(2);
@@ -441,7 +511,7 @@ save_freesv(SV *sv)
}
void
-save_freeop(OP *o)
+Perl_save_freeop(pTHX_ OP *o)
{
dTHR;
SSCHECK(2);
@@ -450,7 +520,7 @@ save_freeop(OP *o)
}
void
-save_freepv(char *pv)
+Perl_save_freepv(pTHX_ char *pv)
{
dTHR;
SSCHECK(2);
@@ -459,7 +529,7 @@ save_freepv(char *pv)
}
void
-save_clearsv(SV **svp)
+Perl_save_clearsv(pTHX_ SV **svp)
{
dTHR;
SSCHECK(2);
@@ -468,7 +538,7 @@ save_clearsv(SV **svp)
}
void
-save_delete(HV *hv, char *key, I32 klen)
+Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
{
dTHR;
SSCHECK(4);
@@ -479,7 +549,7 @@ save_delete(HV *hv, char *key, I32 klen)
}
void
-save_list(register SV **sarg, I32 maxsarg)
+Perl_save_list(pTHX_ register SV **sarg, I32 maxsarg)
{
dTHR;
register SV *sv;
@@ -496,11 +566,7 @@ save_list(register SV **sarg, I32 maxsarg)
}
void
-#ifdef PERL_OBJECT
-save_destructor(DESTRUCTORFUNC f, void* p)
-#else
-save_destructor(void (*f) (void *), void *p)
-#endif
+Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
{
dTHR;
SSCHECK(3);
@@ -510,7 +576,17 @@ save_destructor(void (*f) (void *), void *p)
}
void
-save_aelem(AV *av, I32 idx, SV **sptr)
+Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
+{
+ dTHR;
+ SSCHECK(3);
+ SSPUSHDXPTR(f);
+ SSPUSHPTR(p);
+ SSPUSHINT(SAVEt_DESTRUCTOR_X);
+}
+
+void
+Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr)
{
dTHR;
SSCHECK(4);
@@ -522,7 +598,7 @@ save_aelem(AV *av, I32 idx, SV **sptr)
}
void
-save_helem(HV *hv, SV *key, SV **sptr)
+Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr)
{
dTHR;
SSCHECK(4);
@@ -534,7 +610,7 @@ save_helem(HV *hv, SV *key, SV **sptr)
}
void
-save_op(void)
+Perl_save_op(pTHX)
{
dTHR;
SSCHECK(2);
@@ -542,8 +618,26 @@ save_op(void)
SSPUSHINT(SAVEt_OP);
}
+I32
+Perl_save_alloc(pTHX_ I32 size, I32 pad)
+{
+ dTHR;
+ register I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
+ - (char*)PL_savestack);
+ register I32 elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
+
+ /* SSCHECK may not be good enough */
+ while (PL_savestack_ix + elems + 2 > PL_savestack_max)
+ savestack_grow();
+
+ PL_savestack_ix += elems;
+ SSPUSHINT(elems);
+ SSPUSHINT(SAVEt_ALLOC);
+ return start;
+}
+
void
-leave_scope(I32 base)
+Perl_leave_scope(pTHX_ I32 base)
{
dTHR;
register SV *sv;
@@ -555,7 +649,7 @@ leave_scope(I32 base)
I32 i;
if (base < -1)
- croak("panic: corrupt saved stack index");
+ Perl_croak(aTHX_ "panic: corrupt saved stack index");
while (PL_savestack_ix > base) {
switch (SSPOPINT) {
case SAVEt_ITEM: /* normal string */
@@ -587,7 +681,7 @@ leave_scope(I32 base)
ptr = SSPOPPTR;
restore_sv:
sv = *(SV**)ptr;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"restore svref: %p %p:%s -> %p:%s\n",
ptr, sv, SvPEEK(sv), value, SvPEEK(value)));
if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) &&
@@ -620,7 +714,7 @@ leave_scope(I32 base)
if (GvAV(gv)) {
AV *goner = GvAV(gv);
SvMAGIC(av) = SvMAGIC(goner);
- SvFLAGS(av) |= SvMAGICAL(goner);
+ SvFLAGS((SV*)av) |= SvMAGICAL(goner);
SvMAGICAL_off(goner);
SvMAGIC(goner) = 0;
SvREFCNT_dec(goner);
@@ -666,6 +760,10 @@ leave_scope(I32 base)
ptr = SSPOPPTR;
*(I16*)ptr = (I16)SSPOPINT;
break;
+ case SAVEt_I8: /* I8 reference */
+ ptr = SSPOPPTR;
+ *(I8*)ptr = (I8)SSPOPINT;
+ break;
case SAVEt_IV: /* IV reference */
ptr = SSPOPPTR;
*(IV*)ptr = (IV)SSPOPIV;
@@ -674,6 +772,7 @@ leave_scope(I32 base)
ptr = SSPOPPTR;
*(SV**)ptr = (SV*)SSPOPPTR;
break;
+ case SAVEt_VPTR: /* random* reference */
case SAVEt_PPTR: /* char* reference */
ptr = SSPOPPTR;
*(char**)ptr = (char*)SSPOPPTR;
@@ -724,12 +823,8 @@ leave_scope(I32 base)
sv = *(SV**)ptr;
/* Can clear pad variable in place? */
if (SvREFCNT(sv) <= 1 && !SvOBJECT(sv)) {
- if (SvTHINKFIRST(sv)) {
- if (SvREADONLY(sv))
- croak("panic: leave_scope clearsv");
- if (SvROK(sv))
- sv_unref(sv);
- }
+ if (SvTHINKFIRST(sv))
+ sv_force_normal(sv);
if (SvMAGICAL(sv))
mg_free(sv);
@@ -743,7 +838,7 @@ leave_scope(I32 base)
hv_clear((HV*)sv);
break;
case SVt_PVCV:
- croak("panic: leave_scope pad code");
+ Perl_croak(aTHX_ "panic: leave_scope pad code");
case SVt_RV:
case SVt_IV:
case SVt_NV:
@@ -776,9 +871,14 @@ leave_scope(I32 base)
break;
case SAVEt_DESTRUCTOR:
ptr = SSPOPPTR;
- (CALLDESTRUCTOR)(ptr);
+ (*SSPOPDPTR)(ptr);
+ break;
+ case SAVEt_DESTRUCTOR_X:
+ ptr = SSPOPPTR;
+ (*SSPOPDXPTR)(aTHXo_ ptr);
break;
case SAVEt_REGCONTEXT:
+ case SAVEt_ALLOC:
i = SSPOPINT;
PL_savestack_ix -= i; /* regexp must have croaked */
break;
@@ -833,53 +933,71 @@ leave_scope(I32 base)
}
*(I32*)&PL_hints = (I32)SSPOPINT;
break;
+ case SAVEt_COMPPAD:
+ PL_comppad = (AV*)SSPOPPTR;
+ if (PL_comppad)
+ PL_curpad = AvARRAY(PL_comppad);
+ else
+ PL_curpad = Null(SV**);
+ break;
default:
- croak("panic: leave_scope inconsistency");
+ Perl_croak(aTHX_ "panic: leave_scope inconsistency");
}
}
}
void
-cx_dump(PERL_CONTEXT *cx)
+Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
{
#ifdef DEBUGGING
dTHR;
- PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), block_type[CxTYPE(cx)]);
+ PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), PL_block_type[CxTYPE(cx)]);
if (CxTYPE(cx) != CXt_SUBST) {
PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
- PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%lx\n", (long)cx->blk_oldcop);
+ PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_oldcop));
PerlIO_printf(Perl_debug_log, "BLK_OLDMARKSP = %ld\n", (long)cx->blk_oldmarksp);
PerlIO_printf(Perl_debug_log, "BLK_OLDSCOPESP = %ld\n", (long)cx->blk_oldscopesp);
PerlIO_printf(Perl_debug_log, "BLK_OLDRETSP = %ld\n", (long)cx->blk_oldretsp);
- PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%lx\n", (long)cx->blk_oldpm);
+ PerlIO_printf(Perl_debug_log, "BLK_OLDPM = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_oldpm));
PerlIO_printf(Perl_debug_log, "BLK_GIMME = %s\n", cx->blk_gimme ? "LIST" : "SCALAR");
}
switch (CxTYPE(cx)) {
case CXt_NULL:
case CXt_BLOCK:
break;
+ case CXt_FORMAT:
+ PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_sub.cv));
+ PerlIO_printf(Perl_debug_log, "BLK_SUB.GV = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_sub.gv));
+ PerlIO_printf(Perl_debug_log, "BLK_SUB.DFOUTGV = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_sub.dfoutgv));
+ PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
+ (int)cx->blk_sub.hasargs);
+ break;
case CXt_SUB:
- PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%lx\n",
- (long)cx->blk_sub.cv);
- PerlIO_printf(Perl_debug_log, "BLK_SUB.GV = 0x%lx\n",
- (long)cx->blk_sub.gv);
- PerlIO_printf(Perl_debug_log, "BLK_SUB.DFOUTGV = 0x%lx\n",
- (long)cx->blk_sub.dfoutgv);
+ PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_sub.cv));
PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
(long)cx->blk_sub.olddepth);
PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
(int)cx->blk_sub.hasargs);
+ PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n",
+ (int)cx->blk_sub.lval);
break;
case CXt_EVAL:
PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
(long)cx->blk_eval.old_in_eval);
PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
- op_name[cx->blk_eval.old_op_type],
- op_desc[cx->blk_eval.old_op_type]);
- PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
- cx->blk_eval.old_name);
- PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%lx\n",
- (long)cx->blk_eval.old_eval_root);
+ PL_op_name[cx->blk_eval.old_op_type],
+ PL_op_desc[cx->blk_eval.old_op_type]);
+ if (cx->blk_eval.old_namesv)
+ PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
+ SvPVX(cx->blk_eval.old_namesv));
+ PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_eval.old_eval_root));
break;
case CXt_LOOP:
@@ -887,23 +1005,23 @@ cx_dump(PERL_CONTEXT *cx)
cx->blk_loop.label);
PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
(long)cx->blk_loop.resetsp);
- PerlIO_printf(Perl_debug_log, "BLK_LOOP.REDO_OP = 0x%lx\n",
- (long)cx->blk_loop.redo_op);
- PerlIO_printf(Perl_debug_log, "BLK_LOOP.NEXT_OP = 0x%lx\n",
- (long)cx->blk_loop.next_op);
- PerlIO_printf(Perl_debug_log, "BLK_LOOP.LAST_OP = 0x%lx\n",
- (long)cx->blk_loop.last_op);
+ PerlIO_printf(Perl_debug_log, "BLK_LOOP.REDO_OP = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_loop.redo_op));
+ PerlIO_printf(Perl_debug_log, "BLK_LOOP.NEXT_OP = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_loop.next_op));
+ PerlIO_printf(Perl_debug_log, "BLK_LOOP.LAST_OP = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_loop.last_op));
PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
(long)cx->blk_loop.iterix);
- PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%lx\n",
- (long)cx->blk_loop.iterary);
- PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%lx\n",
- (long)cx->blk_loop.itervar);
- if (cx->blk_loop.itervar)
- PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%lx\n",
- (long)cx->blk_loop.itersave);
- PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERLVAL = 0x%lx\n",
- (long)cx->blk_loop.iterlval);
+ PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_loop.iterary));
+ PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%"UVxf"\n",
+ PTR2UV(CxITERVAR(cx)));
+ if (CxITERVAR(cx))
+ PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_loop.itersave));
+ PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERLVAL = 0x%"UVxf"\n",
+ PTR2UV(cx->blk_loop.iterlval));
break;
case CXt_SUBST:
@@ -911,24 +1029,24 @@ cx_dump(PERL_CONTEXT *cx)
(long)cx->sb_iters);
PerlIO_printf(Perl_debug_log, "SB_MAXITERS = %ld\n",
(long)cx->sb_maxiters);
- PerlIO_printf(Perl_debug_log, "SB_SAFEBASE = %ld\n",
- (long)cx->sb_safebase);
+ PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
+ (long)cx->sb_rflags);
PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
(long)cx->sb_once);
PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
cx->sb_orig);
- PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%lx\n",
- (long)cx->sb_dstr);
- PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%lx\n",
- (long)cx->sb_targ);
- PerlIO_printf(Perl_debug_log, "SB_S = 0x%lx\n",
- (long)cx->sb_s);
- PerlIO_printf(Perl_debug_log, "SB_M = 0x%lx\n",
- (long)cx->sb_m);
- PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%lx\n",
- (long)cx->sb_strend);
- PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%lx\n",
- (long)cx->sb_rxres);
+ PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%"UVxf"\n",
+ PTR2UV(cx->sb_dstr));
+ PerlIO_printf(Perl_debug_log, "SB_TARG = 0x%"UVxf"\n",
+ PTR2UV(cx->sb_targ));
+ PerlIO_printf(Perl_debug_log, "SB_S = 0x%"UVxf"\n",
+ PTR2UV(cx->sb_s));
+ PerlIO_printf(Perl_debug_log, "SB_M = 0x%"UVxf"\n",
+ PTR2UV(cx->sb_m));
+ PerlIO_printf(Perl_debug_log, "SB_STREND = 0x%"UVxf"\n",
+ PTR2UV(cx->sb_strend));
+ PerlIO_printf(Perl_debug_log, "SB_RXRES = 0x%"UVxf"\n",
+ PTR2UV(cx->sb_rxres));
break;
}
#endif /* DEBUGGING */
diff --git a/contrib/perl5/scope.h b/contrib/perl5/scope.h
index 9fab6ee..f33154a 100644
--- a/contrib/perl5/scope.h
+++ b/contrib/perl5/scope.h
@@ -1,33 +1,37 @@
-#define SAVEt_ITEM 0
-#define SAVEt_SV 1
-#define SAVEt_AV 2
-#define SAVEt_HV 3
-#define SAVEt_INT 4
-#define SAVEt_LONG 5
-#define SAVEt_I32 6
-#define SAVEt_IV 7
-#define SAVEt_SPTR 8
-#define SAVEt_APTR 9
-#define SAVEt_HPTR 10
-#define SAVEt_PPTR 11
-#define SAVEt_NSTAB 12
-#define SAVEt_SVREF 13
-#define SAVEt_GP 14
-#define SAVEt_FREESV 15
-#define SAVEt_FREEOP 16
-#define SAVEt_FREEPV 17
-#define SAVEt_CLEARSV 18
-#define SAVEt_DELETE 19
-#define SAVEt_DESTRUCTOR 20
-#define SAVEt_REGCONTEXT 21
-#define SAVEt_STACK_POS 22
-#define SAVEt_I16 23
-#define SAVEt_AELEM 24
-#define SAVEt_HELEM 25
-#define SAVEt_OP 26
-#define SAVEt_HINTS 27
-/* #define SAVEt_ALLOC 28 */ /* defined in 5.005_5x */
+#define SAVEt_ITEM 0
+#define SAVEt_SV 1
+#define SAVEt_AV 2
+#define SAVEt_HV 3
+#define SAVEt_INT 4
+#define SAVEt_LONG 5
+#define SAVEt_I32 6
+#define SAVEt_IV 7
+#define SAVEt_SPTR 8
+#define SAVEt_APTR 9
+#define SAVEt_HPTR 10
+#define SAVEt_PPTR 11
+#define SAVEt_NSTAB 12
+#define SAVEt_SVREF 13
+#define SAVEt_GP 14
+#define SAVEt_FREESV 15
+#define SAVEt_FREEOP 16
+#define SAVEt_FREEPV 17
+#define SAVEt_CLEARSV 18
+#define SAVEt_DELETE 19
+#define SAVEt_DESTRUCTOR 20
+#define SAVEt_REGCONTEXT 21
+#define SAVEt_STACK_POS 22
+#define SAVEt_I16 23
+#define SAVEt_AELEM 24
+#define SAVEt_HELEM 25
+#define SAVEt_OP 26
+#define SAVEt_HINTS 27
+#define SAVEt_ALLOC 28
#define SAVEt_GENERIC_SVREF 29
+#define SAVEt_DESTRUCTOR_X 30
+#define SAVEt_VPTR 31
+#define SAVEt_I8 32
+#define SAVEt_COMPPAD 33
#define SSCHECK(need) if (PL_savestack_ix + need > PL_savestack_max) savestack_grow()
#define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
@@ -35,11 +39,31 @@
#define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
#define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
#define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
+#define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p))
#define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32)
#define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
#define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
#define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
#define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
+#define SSPOPDXPTR (PL_savestack[--PL_savestack_ix].any_dxptr)
+
+/*
+=for apidoc Ams||SAVETMPS
+Opening bracket for temporaries on a callback. See C<FREETMPS> and
+L<perlcall>.
+
+=for apidoc Ams||FREETMPS
+Closing bracket for temporaries on a callback. See C<SAVETMPS> and
+L<perlcall>.
+
+=for apidoc Ams||ENTER
+Opening bracket on a callback. See C<LEAVE> and L<perlcall>.
+
+=for apidoc Ams||LEAVE
+Closing bracket on a callback. See C<ENTER> and L<perlcall>.
+
+=cut
+*/
#define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix
#define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps()
@@ -48,12 +72,12 @@
#define ENTER \
STMT_START { \
push_scope(); \
- DEBUG_l(WITH_THR(deb("ENTER scope %ld at %s:%d\n", \
+ DEBUG_l(WITH_THR(Perl_deb(aTHX_ "ENTER scope %ld at %s:%d\n", \
PL_scopestack_ix, __FILE__, __LINE__))); \
} STMT_END
#define LEAVE \
STMT_START { \
- DEBUG_l(WITH_THR(deb("LEAVE scope %ld at %s:%d\n", \
+ DEBUG_l(WITH_THR(Perl_deb(aTHX_ "LEAVE scope %ld at %s:%d\n", \
PL_scopestack_ix, __FILE__, __LINE__))); \
pop_scope(); \
} STMT_END
@@ -67,6 +91,7 @@
* Not using SOFT_CAST on SAVESPTR, SAVEGENERICSV and SAVEFREESV
* because these are used for several kinds of pointer values
*/
+#define SAVEI8(i) save_I8(SOFT_CAST(I8*)&(i))
#define SAVEI16(i) save_I16(SOFT_CAST(I16*)&(i))
#define SAVEI32(i) save_I32(SOFT_CAST(I32*)&(i))
#define SAVEINT(i) save_int(SOFT_CAST(int*)&(i))
@@ -74,6 +99,7 @@
#define SAVELONG(l) save_long(SOFT_CAST(long*)&(l))
#define SAVESPTR(s) save_sptr((SV**)&(s))
#define SAVEPPTR(s) save_pptr(SOFT_CAST(char**)&(s))
+#define SAVEVPTR(s) save_vptr((void*)&(s))
#define SAVEFREESV(s) save_freesv((SV*)(s))
#define SAVEFREEOP(o) save_freeop(SOFT_CAST(OP*)(o))
#define SAVEFREEPV(p) save_freepv(SOFT_CAST(char*)(p))
@@ -81,17 +107,11 @@
#define SAVEGENERICSV(s) save_generic_svref((SV**)&(s))
#define SAVEDELETE(h,k,l) \
save_delete(SOFT_CAST(HV*)(h), SOFT_CAST(char*)(k), (I32)(l))
-#ifdef PERL_OBJECT
-#define CALLDESTRUCTOR this->*SSPOPDPTR
-#define SAVEDESTRUCTOR(f,p) \
- save_destructor((DESTRUCTORFUNC)(FUNC_NAME_TO_PTR(f)), \
- SOFT_CAST(void*)(p))
-#else
-#define CALLDESTRUCTOR *SSPOPDPTR
#define SAVEDESTRUCTOR(f,p) \
- save_destructor(SOFT_CAST(void(*)_((void*)))(FUNC_NAME_TO_PTR(f)), \
- SOFT_CAST(void*)(p))
-#endif
+ save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), SOFT_CAST(void*)(p))
+
+#define SAVEDESTRUCTOR_X(f,p) \
+ save_destructor_x((DESTRUCTORFUNC_t)(f), SOFT_CAST(void*)(p))
#define SAVESTACK_POS() \
STMT_START { \
@@ -113,6 +133,46 @@
} \
} STMT_END
+#define SAVECOMPPAD() \
+ STMT_START { \
+ if (PL_comppad && PL_curpad == AvARRAY(PL_comppad)) { \
+ SSCHECK(2); \
+ SSPUSHPTR((SV*)PL_comppad); \
+ SSPUSHINT(SAVEt_COMPPAD); \
+ } \
+ else { \
+ SAVEVPTR(PL_curpad); \
+ SAVESPTR(PL_comppad); \
+ } \
+ } STMT_END
+
+#ifdef USE_ITHREADS
+# define SAVECOPSTASH(cop) SAVEPPTR(CopSTASHPV(cop))
+# define SAVECOPFILE(cop) SAVEPPTR(CopFILE(cop))
+#else
+# define SAVECOPSTASH(cop) SAVESPTR(CopSTASH(cop))
+# define SAVECOPFILE(cop) SAVESPTR(CopFILEGV(cop))
+#endif
+
+#define SAVECOPLINE(cop) SAVEI16(CopLINE(cop))
+
+/* SSNEW() temporarily allocates a specified number of bytes of data on the
+ * savestack. It returns an integer index into the savestack, because a
+ * pointer would get broken if the savestack is moved on reallocation.
+ * SSNEWa() works like SSNEW(), but also aligns the data to the specified
+ * number of bytes. MEM_ALIGNBYTES is perhaps the most useful. The
+ * alignment will be preserved therough savestack reallocation *only* if
+ * realloc returns data aligned to a size divisible by `align'!
+ *
+ * SSPTR() converts the index returned by SSNEW/SSNEWa() into a pointer.
+ */
+
+#define SSNEW(size) save_alloc(size, 0)
+#define SSNEWa(size,align) save_alloc(size, \
+ (align - ((int)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
+
+#define SSPTR(off,type) ((type) ((char*)PL_savestack + off))
+
/* A jmpenv packages the state required to perform a proper non-local jump.
* Note that there is a start_env initialized when perl starts, and top_env
* points to this initially, so top_env should always be non-null.
@@ -130,9 +190,13 @@
struct jmpenv {
struct jmpenv * je_prev;
- Sigjmp_buf je_buf;
- int je_ret; /* return value of last setjmp() */
- bool je_mustcatch; /* longjmp()s must be caught locally */
+ Sigjmp_buf je_buf; /* only for use if !je_throw */
+ int je_ret; /* last exception thrown */
+ bool je_mustcatch; /* need to call longjmp()? */
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ void (*je_throw)(int v); /* last for bincompat */
+ bool je_noset; /* no need for setjmp() */
+#endif
};
typedef struct jmpenv JMPENV;
@@ -145,30 +209,164 @@ typedef struct jmpenv JMPENV;
#define OP_MEM_TO_REG NOOP
#endif
-#define dJMPENV JMPENV cur_env
-#define JMPENV_PUSH(v) \
+/*
+ * How to build the first jmpenv.
+ *
+ * top_env needs to be non-zero. It points to an area
+ * in which longjmp() stuff is stored, as C callstack
+ * info there at least is thread specific this has to
+ * be per-thread. Otherwise a 'die' in a thread gives
+ * that thread the C stack of last thread to do an eval {}!
+ */
+
+#define JMPENV_BOOTSTRAP \
+ STMT_START { \
+ Zero(&PL_start_env, 1, JMPENV); \
+ PL_start_env.je_ret = -1; \
+ PL_start_env.je_mustcatch = TRUE; \
+ PL_top_env = &PL_start_env; \
+ } STMT_END
+
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+
+/*
+ * These exception-handling macros are split up to
+ * ease integration with C++ exceptions.
+ *
+ * To use C++ try+catch to catch Perl exceptions, an extension author
+ * needs to first write an extern "C" function to throw an appropriate
+ * exception object; typically it will be or contain an integer,
+ * because Perl's internals use integers to track exception types:
+ * extern "C" { static void thrower(int i) { throw i; } }
+ *
+ * Then (as shown below) the author needs to use, not the simple
+ * JMPENV_PUSH, but several of its constitutent macros, to arrange for
+ * the Perl internals to call thrower() rather than longjmp() to
+ * report exceptions:
+ *
+ * dJMPENV;
+ * JMPENV_PUSH_INIT(thrower);
+ * try {
+ * ... stuff that may throw exceptions ...
+ * }
+ * catch (int why) { // or whatever matches thrower()
+ * JMPENV_POST_CATCH;
+ * EXCEPT_SET(why);
+ * switch (why) {
+ * ... // handle various Perl exception codes
+ * }
+ * }
+ * JMPENV_POP; // don't forget this!
+ */
+
+/*
+ * Function that catches/throws, and its callback for the
+ * body of protected processing.
+ */
+typedef void *(CPERLscope(*protect_body_t)) (pTHX_ va_list);
+typedef void *(CPERLscope(*protect_proc_t)) (pTHX_ volatile JMPENV *pcur_env,
+ int *, protect_body_t, ...);
+
+#define dJMPENV JMPENV cur_env; \
+ volatile JMPENV *pcur_env = ((cur_env.je_noset = 0),&cur_env)
+
+#define JMPENV_PUSH_INIT_ENV(ce,THROWFUNC) \
STMT_START { \
- cur_env.je_prev = PL_top_env; \
+ (ce).je_throw = (THROWFUNC); \
+ (ce).je_ret = -1; \
+ (ce).je_mustcatch = FALSE; \
+ (ce).je_prev = PL_top_env; \
+ PL_top_env = &(ce); \
OP_REG_TO_MEM; \
- cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, 1); \
+ } STMT_END
+
+#define JMPENV_PUSH_INIT(THROWFUNC) JMPENV_PUSH_INIT_ENV(*(JMPENV*)pcur_env,THROWFUNC)
+
+#define JMPENV_POST_CATCH_ENV(ce) \
+ STMT_START { \
OP_MEM_TO_REG; \
- PL_top_env = &cur_env; \
- cur_env.je_mustcatch = FALSE; \
- (v) = cur_env.je_ret; \
+ PL_top_env = &(ce); \
+ } STMT_END
+
+#define JMPENV_POST_CATCH JMPENV_POST_CATCH_ENV(*(JMPENV*)pcur_env)
+
+#define JMPENV_PUSH_ENV(ce,v) \
+ STMT_START { \
+ if (!(ce).je_noset) { \
+ DEBUG_l(Perl_deb(aTHX_ "Setting up jumplevel %p, was %p\n", \
+ ce, PL_top_env)); \
+ JMPENV_PUSH_INIT_ENV(ce,NULL); \
+ EXCEPT_SET_ENV(ce,PerlProc_setjmp((ce).je_buf, 1));\
+ (ce).je_noset = 1; \
+ } \
+ else \
+ EXCEPT_SET_ENV(ce,0); \
+ JMPENV_POST_CATCH_ENV(ce); \
+ (v) = EXCEPT_GET_ENV(ce); \
+ } STMT_END
+
+#define JMPENV_PUSH(v) JMPENV_PUSH_ENV(*(JMPENV*)pcur_env,v)
+
+#define JMPENV_POP_ENV(ce) \
+ STMT_START { \
+ if (PL_top_env == &(ce)) \
+ PL_top_env = (ce).je_prev; \
} STMT_END
+
+#define JMPENV_POP JMPENV_POP_ENV(*(JMPENV*)pcur_env)
+
+#define JMPENV_JUMP(v) \
+ STMT_START { \
+ OP_REG_TO_MEM; \
+ if (PL_top_env->je_prev) { \
+ if (PL_top_env->je_throw) \
+ PL_top_env->je_throw(v); \
+ else \
+ PerlProc_longjmp(PL_top_env->je_buf, (v)); \
+ } \
+ if ((v) == 2) \
+ PerlProc_exit(STATUS_NATIVE_EXPORT); \
+ PerlIO_printf(Perl_error_log, "panic: top_env\n"); \
+ PerlProc_exit(1); \
+ } STMT_END
+
+#define EXCEPT_GET_ENV(ce) ((ce).je_ret)
+#define EXCEPT_GET EXCEPT_GET_ENV(*(JMPENV*)pcur_env)
+#define EXCEPT_SET_ENV(ce,v) ((ce).je_ret = (v))
+#define EXCEPT_SET(v) EXCEPT_SET_ENV(*(JMPENV*)pcur_env,v)
+
+#else /* !PERL_FLEXIBLE_EXCEPTIONS */
+
+#define dJMPENV JMPENV cur_env
+
+#define JMPENV_PUSH(v) \
+ STMT_START { \
+ DEBUG_l(Perl_deb(aTHX_ "Setting up jumplevel %p, was %p\n", \
+ &cur_env, PL_top_env)); \
+ cur_env.je_prev = PL_top_env; \
+ OP_REG_TO_MEM; \
+ cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, 1); \
+ OP_MEM_TO_REG; \
+ PL_top_env = &cur_env; \
+ cur_env.je_mustcatch = FALSE; \
+ (v) = cur_env.je_ret; \
+ } STMT_END
+
#define JMPENV_POP \
STMT_START { PL_top_env = cur_env.je_prev; } STMT_END
+
#define JMPENV_JUMP(v) \
STMT_START { \
OP_REG_TO_MEM; \
- if (PL_top_env->je_prev) \
- PerlProc_longjmp(PL_top_env->je_buf, (v)); \
+ if (PL_top_env->je_prev) \
+ PerlProc_longjmp(PL_top_env->je_buf, (v)); \
if ((v) == 2) \
- PerlProc_exit(STATUS_NATIVE_EXPORT); \
+ PerlProc_exit(STATUS_NATIVE_EXPORT); \
PerlIO_printf(PerlIO_stderr(), "panic: top_env\n"); \
- PerlProc_exit(1); \
+ PerlProc_exit(1); \
} STMT_END
-
-#define CATCH_GET (PL_top_env->je_mustcatch)
-#define CATCH_SET(v) (PL_top_env->je_mustcatch = (v))
-
+
+#endif /* PERL_FLEXIBLE_EXCEPTIONS */
+
+#define CATCH_GET (PL_top_env->je_mustcatch)
+#define CATCH_SET(v) (PL_top_env->je_mustcatch = (v))
diff --git a/contrib/perl5/sv.c b/contrib/perl5/sv.c
index 0778a72..3eebc9a 100644
--- a/contrib/perl5/sv.c
+++ b/contrib/perl5/sv.c
@@ -1,6 +1,6 @@
/* sv.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -12,214 +12,66 @@
*/
#include "EXTERN.h"
+#define PERL_IN_SV_C
#include "perl.h"
-#ifdef OVR_DBL_DIG
-/* Use an overridden DBL_DIG */
-# ifdef DBL_DIG
-# undef DBL_DIG
-# endif
-# define DBL_DIG OVR_DBL_DIG
-#else
-/* The following is all to get DBL_DIG, in order to pick a nice
- default value for printing floating point numbers in Gconvert.
- (see config.h)
-*/
-#ifdef I_LIMITS
-#include <limits.h>
-#endif
-#ifdef I_FLOAT
-#include <float.h>
-#endif
-#ifndef HAS_DBL_DIG
-#define DBL_DIG 15 /* A guess that works lots of places */
-#endif
-#endif
-
-#if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE) && !defined(__QNX__)
-# define FAST_SV_GETS
-#endif
-
-#ifdef PERL_OBJECT
-#define FCALL this->*f
-#define VTBL this->*vtbl
-
-#else /* !PERL_OBJECT */
-
-static IV asIV _((SV* sv));
-static UV asUV _((SV* sv));
-static SV *more_sv _((void));
-static void more_xiv _((void));
-static void more_xnv _((void));
-static void more_xpv _((void));
-static void more_xrv _((void));
-static XPVIV *new_xiv _((void));
-static XPVNV *new_xnv _((void));
-static XPV *new_xpv _((void));
-static XRV *new_xrv _((void));
-static void del_xiv _((XPVIV* p));
-static void del_xnv _((XPVNV* p));
-static void del_xpv _((XPV* p));
-static void del_xrv _((XRV* p));
-static void sv_mortalgrow _((void));
-static void sv_unglob _((SV* sv));
-static void sv_check_thinkfirst _((SV *sv));
-
-#ifndef PURIFY
-static void *my_safemalloc(MEM_SIZE size);
-#endif
-
-typedef void (*SVFUNC) _((SV*));
-#define VTBL *vtbl
#define FCALL *f
+#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
-#endif /* PERL_OBJECT */
-
-#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_check_thinkfirst(sv)
-
-#ifdef PURIFY
-
-#define new_SV(p) \
- do { \
- LOCK_SV_MUTEX; \
- (p) = (SV*)safemalloc(sizeof(SV)); \
- reg_add(p); \
- UNLOCK_SV_MUTEX; \
- } while (0)
-
-#define del_SV(p) \
- do { \
- LOCK_SV_MUTEX; \
- reg_remove(p); \
- Safefree((char*)(p)); \
- UNLOCK_SV_MUTEX; \
- } while (0)
-
-static SV **registry;
-static I32 registry_size;
-
-#define REGHASH(sv,size) ((((U32)(sv)) >> 2) % (size))
-
-#define REG_REPLACE(sv,a,b) \
- do { \
- void* p = sv->sv_any; \
- I32 h = REGHASH(sv, registry_size); \
- I32 i = h; \
- while (registry[i] != (a)) { \
- if (++i >= registry_size) \
- i = 0; \
- if (i == h) \
- die("SV registry bug"); \
- } \
- registry[i] = (b); \
- } while (0)
-
-#define REG_ADD(sv) REG_REPLACE(sv,Nullsv,sv)
-#define REG_REMOVE(sv) REG_REPLACE(sv,sv,Nullsv)
-
-static void
-reg_add(sv)
-SV* sv;
-{
- if (PL_sv_count >= (registry_size >> 1))
- {
- SV **oldreg = registry;
- I32 oldsize = registry_size;
-
- registry_size = registry_size ? ((registry_size << 2) + 1) : 2037;
- Newz(707, registry, registry_size, SV*);
-
- if (oldreg) {
- I32 i;
-
- for (i = 0; i < oldsize; ++i) {
- SV* oldsv = oldreg[i];
- if (oldsv)
- REG_ADD(oldsv);
- }
- Safefree(oldreg);
- }
- }
-
- REG_ADD(sv);
- ++PL_sv_count;
-}
-
-static void
-reg_remove(sv)
-SV* sv;
-{
- REG_REMOVE(sv);
- --PL_sv_count;
-}
-
-static void
-visit(f)
-SVFUNC f;
-{
- I32 i;
-
- for (i = 0; i < registry_size; ++i) {
- SV* sv = registry[i];
- if (sv && SvTYPE(sv) != SVTYPEMASK)
- (*f)(sv);
- }
-}
-
-void
-sv_add_arena(ptr, size, flags)
-char* ptr;
-U32 size;
-U32 flags;
-{
- if (!(flags & SVf_FAKE))
- Safefree(ptr);
-}
-
-#else /* ! PURIFY */
+static void do_report_used(pTHXo_ SV *sv);
+static void do_clean_objs(pTHXo_ SV *sv);
+#ifndef DISABLE_DESTRUCTOR_KLUDGE
+static void do_clean_named_objs(pTHXo_ SV *sv);
+#endif
+static void do_clean_all(pTHXo_ SV *sv);
/*
* "A time to plant, and a time to uproot what was planted..."
*/
-#define plant_SV(p) \
- do { \
- SvANY(p) = (void *)PL_sv_root; \
- SvFLAGS(p) = SVTYPEMASK; \
- PL_sv_root = (p); \
- --PL_sv_count; \
- } while (0)
+#define plant_SV(p) \
+ STMT_START { \
+ SvANY(p) = (void *)PL_sv_root; \
+ SvFLAGS(p) = SVTYPEMASK; \
+ PL_sv_root = (p); \
+ --PL_sv_count; \
+ } STMT_END
/* sv_mutex must be held while calling uproot_SV() */
-#define uproot_SV(p) \
- do { \
- (p) = PL_sv_root; \
- PL_sv_root = (SV*)SvANY(p); \
- ++PL_sv_count; \
- } while (0)
-
-#define new_SV(p) do { \
- LOCK_SV_MUTEX; \
- if (PL_sv_root) \
- uproot_SV(p); \
- else \
- (p) = more_sv(); \
- UNLOCK_SV_MUTEX; \
- } while (0)
+#define uproot_SV(p) \
+ STMT_START { \
+ (p) = PL_sv_root; \
+ PL_sv_root = (SV*)SvANY(p); \
+ ++PL_sv_count; \
+ } STMT_END
+
+#define new_SV(p) \
+ STMT_START { \
+ LOCK_SV_MUTEX; \
+ if (PL_sv_root) \
+ uproot_SV(p); \
+ else \
+ (p) = more_sv(); \
+ UNLOCK_SV_MUTEX; \
+ SvANY(p) = 0; \
+ SvREFCNT(p) = 1; \
+ SvFLAGS(p) = 0; \
+ } STMT_END
#ifdef DEBUGGING
-#define del_SV(p) do { \
- LOCK_SV_MUTEX; \
- if (PL_debug & 32768) \
- del_sv(p); \
- else \
- plant_SV(p); \
- UNLOCK_SV_MUTEX; \
- } while (0)
+#define del_SV(p) \
+ STMT_START { \
+ LOCK_SV_MUTEX; \
+ if (PL_debug & 32768) \
+ del_sv(p); \
+ else \
+ plant_SV(p); \
+ UNLOCK_SV_MUTEX; \
+ } STMT_END
STATIC void
-del_sv(SV *p)
+S_del_sv(pTHX_ SV *p)
{
if (PL_debug & 32768) {
SV* sva;
@@ -233,7 +85,10 @@ del_sv(SV *p)
ok = 1;
}
if (!ok) {
- warn("Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
+ if (ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL,
+ "Attempt to free non-arena SV: 0x%"UVxf,
+ PTR2UV(p));
return;
}
}
@@ -247,12 +102,12 @@ del_sv(SV *p)
#endif /* DEBUGGING */
void
-sv_add_arena(char *ptr, U32 size, U32 flags)
+Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
{
SV* sva = (SV*)ptr;
register SV* sv;
register SV* svend;
- Zero(sva, size, char);
+ Zero(ptr, size, char);
/* The first SV in an arena isn't an SV. */
SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
@@ -275,7 +130,7 @@ sv_add_arena(char *ptr, U32 size, U32 flags)
/* sv_mutex must be held while calling more_sv() */
STATIC SV*
-more_sv(void)
+S_more_sv(pTHX)
{
register SV* sv;
@@ -293,7 +148,7 @@ more_sv(void)
}
STATIC void
-visit(SVFUNC f)
+S_visit(pTHX_ SVFUNC_t f)
{
SV* sva;
SV* sv;
@@ -303,92 +158,39 @@ visit(SVFUNC f)
svend = &sva[SvREFCNT(sva)];
for (sv = sva + 1; sv < svend; ++sv) {
if (SvTYPE(sv) != SVTYPEMASK)
- (FCALL)(sv);
+ (FCALL)(aTHXo_ sv);
}
}
}
-#endif /* PURIFY */
-
-STATIC void
-do_report_used(SV *sv)
-{
- if (SvTYPE(sv) != SVTYPEMASK) {
- /* XXX Perhaps this ought to go to Perl_debug_log, if DEBUGGING. */
- PerlIO_printf(PerlIO_stderr(), "****\n");
- sv_dump(sv);
- }
-}
-
void
-sv_report_used(void)
-{
- visit(FUNC_NAME_TO_PTR(do_report_used));
-}
-
-STATIC void
-do_clean_objs(SV *sv)
-{
- SV* rv;
-
- if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
- DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
- SvROK_off(sv);
- SvRV(sv) = 0;
- SvREFCNT_dec(rv);
- }
-
- /* XXX Might want to check arrays, etc. */
-}
-
-#ifndef DISABLE_DESTRUCTOR_KLUDGE
-STATIC void
-do_clean_named_objs(SV *sv)
+Perl_sv_report_used(pTHX)
{
- if (SvTYPE(sv) == SVt_PVGV) {
- if ( SvOBJECT(GvSV(sv)) ||
- GvAV(sv) && SvOBJECT(GvAV(sv)) ||
- GvHV(sv) && SvOBJECT(GvHV(sv)) ||
- GvIO(sv) && SvOBJECT(GvIO(sv)) ||
- GvCV(sv) && SvOBJECT(GvCV(sv)) )
- {
- DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
- SvREFCNT_dec(sv);
- }
- }
+ visit(do_report_used);
}
-#endif
void
-sv_clean_objs(void)
+Perl_sv_clean_objs(pTHX)
{
PL_in_clean_objs = TRUE;
- visit(FUNC_NAME_TO_PTR(do_clean_objs));
+ visit(do_clean_objs);
#ifndef DISABLE_DESTRUCTOR_KLUDGE
/* some barnacles may yet remain, clinging to typeglobs */
- visit(FUNC_NAME_TO_PTR(do_clean_named_objs));
+ visit(do_clean_named_objs);
#endif
PL_in_clean_objs = FALSE;
}
-STATIC void
-do_clean_all(SV *sv)
-{
- DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%lx\n", sv) );)
- SvFLAGS(sv) |= SVf_BREAK;
- SvREFCNT_dec(sv);
-}
-
void
-sv_clean_all(void)
+Perl_sv_clean_all(pTHX)
{
PL_in_clean_all = TRUE;
- visit(FUNC_NAME_TO_PTR(do_clean_all));
+ visit(do_clean_all);
PL_in_clean_all = FALSE;
}
void
-sv_free_arenas(void)
+Perl_sv_free_arenas(pTHX)
{
SV* sva;
SV* svanext;
@@ -413,8 +215,18 @@ sv_free_arenas(void)
PL_sv_root = 0;
}
+void
+Perl_report_uninit(pTHX)
+{
+ if (PL_op)
+ Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit,
+ " in ", PL_op_desc[PL_op->op_type]);
+ else
+ Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit, "", "");
+}
+
STATIC XPVIV*
-new_xiv(void)
+S_new_xiv(pTHX)
{
IV* xiv;
LOCK_SV_MUTEX;
@@ -430,7 +242,7 @@ new_xiv(void)
}
STATIC void
-del_xiv(XPVIV *p)
+S_del_xiv(pTHX_ XPVIV *p)
{
IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
LOCK_SV_MUTEX;
@@ -440,7 +252,7 @@ del_xiv(XPVIV *p)
}
STATIC void
-more_xiv(void)
+S_more_xiv(pTHX)
{
register IV* xiv;
register IV* xivend;
@@ -461,46 +273,46 @@ more_xiv(void)
}
STATIC XPVNV*
-new_xnv(void)
+S_new_xnv(pTHX)
{
- double* xnv;
+ NV* xnv;
LOCK_SV_MUTEX;
if (!PL_xnv_root)
more_xnv();
xnv = PL_xnv_root;
- PL_xnv_root = *(double**)xnv;
+ PL_xnv_root = *(NV**)xnv;
UNLOCK_SV_MUTEX;
return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
}
STATIC void
-del_xnv(XPVNV *p)
+S_del_xnv(pTHX_ XPVNV *p)
{
- double* xnv = (double*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
+ NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
LOCK_SV_MUTEX;
- *(double**)xnv = PL_xnv_root;
- PL_xnv_root = xnv;
+ *(NV**)xnv = PL_xnv_root;
+ PL_xnv_root = xnv;
UNLOCK_SV_MUTEX;
}
STATIC void
-more_xnv(void)
+S_more_xnv(pTHX)
{
- register double* xnv;
- register double* xnvend;
- New(711, xnv, 1008/sizeof(double), double);
- xnvend = &xnv[1008 / sizeof(double) - 1];
- xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
+ register NV* xnv;
+ register NV* xnvend;
+ New(711, xnv, 1008/sizeof(NV), NV);
+ xnvend = &xnv[1008 / sizeof(NV) - 1];
+ xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
PL_xnv_root = xnv;
while (xnv < xnvend) {
- *(double**)xnv = (double*)(xnv + 1);
+ *(NV**)xnv = (NV*)(xnv + 1);
xnv++;
}
- *(double**)xnv = 0;
+ *(NV**)xnv = 0;
}
STATIC XRV*
-new_xrv(void)
+S_new_xrv(pTHX)
{
XRV* xrv;
LOCK_SV_MUTEX;
@@ -513,16 +325,16 @@ new_xrv(void)
}
STATIC void
-del_xrv(XRV *p)
+S_del_xrv(pTHX_ XRV *p)
{
LOCK_SV_MUTEX;
- p->xrv_rv = (SV*)PL_xrv_root;
- PL_xrv_root = p;
+ p->xrv_rv = (SV*)PL_xrv_root;
+ PL_xrv_root = p;
UNLOCK_SV_MUTEX;
}
STATIC void
-more_xrv(void)
+S_more_xrv(pTHX)
{
register XRV* xrv;
register XRV* xrvend;
@@ -537,7 +349,7 @@ more_xrv(void)
}
STATIC XPV*
-new_xpv(void)
+S_new_xpv(pTHX)
{
XPV* xpv;
LOCK_SV_MUTEX;
@@ -550,16 +362,16 @@ new_xpv(void)
}
STATIC void
-del_xpv(XPV *p)
+S_del_xpv(pTHX_ XPV *p)
{
LOCK_SV_MUTEX;
- p->xpv_pv = (char*)PL_xpv_root;
- PL_xpv_root = p;
+ p->xpv_pv = (char*)PL_xpv_root;
+ PL_xpv_root = p;
UNLOCK_SV_MUTEX;
}
STATIC void
-more_xpv(void)
+S_more_xpv(pTHX)
{
register XPV* xpv;
register XPV* xpvend;
@@ -573,93 +385,433 @@ more_xpv(void)
xpv->xpv_pv = 0;
}
-#ifdef PURIFY
-#define new_XIV() (void*)safemalloc(sizeof(XPVIV))
-#define del_XIV(p) Safefree((char*)p)
-#else
-#define new_XIV() (void*)new_xiv()
-#define del_XIV(p) del_xiv((XPVIV*) p)
-#endif
+STATIC XPVIV*
+S_new_xpviv(pTHX)
+{
+ XPVIV* xpviv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpviv_root)
+ more_xpviv();
+ xpviv = PL_xpviv_root;
+ PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpviv;
+}
-#ifdef PURIFY
-#define new_XNV() (void*)safemalloc(sizeof(XPVNV))
-#define del_XNV(p) Safefree((char*)p)
-#else
-#define new_XNV() (void*)new_xnv()
-#define del_XNV(p) del_xnv((XPVNV*) p)
-#endif
+STATIC void
+S_del_xpviv(pTHX_ XPVIV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpviv_root;
+ PL_xpviv_root = p;
+ UNLOCK_SV_MUTEX;
+}
-#ifdef PURIFY
-#define new_XRV() (void*)safemalloc(sizeof(XRV))
-#define del_XRV(p) Safefree((char*)p)
-#else
-#define new_XRV() (void*)new_xrv()
-#define del_XRV(p) del_xrv((XRV*) p)
-#endif
-#ifdef PURIFY
-#define new_XPV() (void*)safemalloc(sizeof(XPV))
-#define del_XPV(p) Safefree((char*)p)
+STATIC void
+S_more_xpviv(pTHX)
+{
+ register XPVIV* xpviv;
+ register XPVIV* xpvivend;
+ New(714, PL_xpviv_root, 1008/sizeof(XPVIV), XPVIV);
+ xpviv = PL_xpviv_root;
+ xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
+ while (xpviv < xpvivend) {
+ xpviv->xpv_pv = (char*)(xpviv + 1);
+ xpviv++;
+ }
+ xpviv->xpv_pv = 0;
+}
+
+
+STATIC XPVNV*
+S_new_xpvnv(pTHX)
+{
+ XPVNV* xpvnv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvnv_root)
+ more_xpvnv();
+ xpvnv = PL_xpvnv_root;
+ PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvnv;
+}
+
+STATIC void
+S_del_xpvnv(pTHX_ XPVNV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvnv_root;
+ PL_xpvnv_root = p;
+ UNLOCK_SV_MUTEX;
+}
+
+
+STATIC void
+S_more_xpvnv(pTHX)
+{
+ register XPVNV* xpvnv;
+ register XPVNV* xpvnvend;
+ New(715, PL_xpvnv_root, 1008/sizeof(XPVNV), XPVNV);
+ xpvnv = PL_xpvnv_root;
+ xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
+ while (xpvnv < xpvnvend) {
+ xpvnv->xpv_pv = (char*)(xpvnv + 1);
+ xpvnv++;
+ }
+ xpvnv->xpv_pv = 0;
+}
+
+
+
+STATIC XPVCV*
+S_new_xpvcv(pTHX)
+{
+ XPVCV* xpvcv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvcv_root)
+ more_xpvcv();
+ xpvcv = PL_xpvcv_root;
+ PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvcv;
+}
+
+STATIC void
+S_del_xpvcv(pTHX_ XPVCV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvcv_root;
+ PL_xpvcv_root = p;
+ UNLOCK_SV_MUTEX;
+}
+
+
+STATIC void
+S_more_xpvcv(pTHX)
+{
+ register XPVCV* xpvcv;
+ register XPVCV* xpvcvend;
+ New(716, PL_xpvcv_root, 1008/sizeof(XPVCV), XPVCV);
+ xpvcv = PL_xpvcv_root;
+ xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
+ while (xpvcv < xpvcvend) {
+ xpvcv->xpv_pv = (char*)(xpvcv + 1);
+ xpvcv++;
+ }
+ xpvcv->xpv_pv = 0;
+}
+
+
+
+STATIC XPVAV*
+S_new_xpvav(pTHX)
+{
+ XPVAV* xpvav;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvav_root)
+ more_xpvav();
+ xpvav = PL_xpvav_root;
+ PL_xpvav_root = (XPVAV*)xpvav->xav_array;
+ UNLOCK_SV_MUTEX;
+ return xpvav;
+}
+
+STATIC void
+S_del_xpvav(pTHX_ XPVAV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xav_array = (char*)PL_xpvav_root;
+ PL_xpvav_root = p;
+ UNLOCK_SV_MUTEX;
+}
+
+
+STATIC void
+S_more_xpvav(pTHX)
+{
+ register XPVAV* xpvav;
+ register XPVAV* xpvavend;
+ New(717, PL_xpvav_root, 1008/sizeof(XPVAV), XPVAV);
+ xpvav = PL_xpvav_root;
+ xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
+ while (xpvav < xpvavend) {
+ xpvav->xav_array = (char*)(xpvav + 1);
+ xpvav++;
+ }
+ xpvav->xav_array = 0;
+}
+
+
+
+STATIC XPVHV*
+S_new_xpvhv(pTHX)
+{
+ XPVHV* xpvhv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvhv_root)
+ more_xpvhv();
+ xpvhv = PL_xpvhv_root;
+ PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
+ UNLOCK_SV_MUTEX;
+ return xpvhv;
+}
+
+STATIC void
+S_del_xpvhv(pTHX_ XPVHV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xhv_array = (char*)PL_xpvhv_root;
+ PL_xpvhv_root = p;
+ UNLOCK_SV_MUTEX;
+}
+
+
+STATIC void
+S_more_xpvhv(pTHX)
+{
+ register XPVHV* xpvhv;
+ register XPVHV* xpvhvend;
+ New(718, PL_xpvhv_root, 1008/sizeof(XPVHV), XPVHV);
+ xpvhv = PL_xpvhv_root;
+ xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
+ while (xpvhv < xpvhvend) {
+ xpvhv->xhv_array = (char*)(xpvhv + 1);
+ xpvhv++;
+ }
+ xpvhv->xhv_array = 0;
+}
+
+
+STATIC XPVMG*
+S_new_xpvmg(pTHX)
+{
+ XPVMG* xpvmg;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvmg_root)
+ more_xpvmg();
+ xpvmg = PL_xpvmg_root;
+ PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvmg;
+}
+
+STATIC void
+S_del_xpvmg(pTHX_ XPVMG *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvmg_root;
+ PL_xpvmg_root = p;
+ UNLOCK_SV_MUTEX;
+}
+
+
+STATIC void
+S_more_xpvmg(pTHX)
+{
+ register XPVMG* xpvmg;
+ register XPVMG* xpvmgend;
+ New(719, PL_xpvmg_root, 1008/sizeof(XPVMG), XPVMG);
+ xpvmg = PL_xpvmg_root;
+ xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
+ while (xpvmg < xpvmgend) {
+ xpvmg->xpv_pv = (char*)(xpvmg + 1);
+ xpvmg++;
+ }
+ xpvmg->xpv_pv = 0;
+}
+
+
+
+STATIC XPVLV*
+S_new_xpvlv(pTHX)
+{
+ XPVLV* xpvlv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvlv_root)
+ more_xpvlv();
+ xpvlv = PL_xpvlv_root;
+ PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvlv;
+}
+
+STATIC void
+S_del_xpvlv(pTHX_ XPVLV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvlv_root;
+ PL_xpvlv_root = p;
+ UNLOCK_SV_MUTEX;
+}
+
+
+STATIC void
+S_more_xpvlv(pTHX)
+{
+ register XPVLV* xpvlv;
+ register XPVLV* xpvlvend;
+ New(720, PL_xpvlv_root, 1008/sizeof(XPVLV), XPVLV);
+ xpvlv = PL_xpvlv_root;
+ xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
+ while (xpvlv < xpvlvend) {
+ xpvlv->xpv_pv = (char*)(xpvlv + 1);
+ xpvlv++;
+ }
+ xpvlv->xpv_pv = 0;
+}
+
+
+STATIC XPVBM*
+S_new_xpvbm(pTHX)
+{
+ XPVBM* xpvbm;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvbm_root)
+ more_xpvbm();
+ xpvbm = PL_xpvbm_root;
+ PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvbm;
+}
+
+STATIC void
+S_del_xpvbm(pTHX_ XPVBM *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvbm_root;
+ PL_xpvbm_root = p;
+ UNLOCK_SV_MUTEX;
+}
+
+
+STATIC void
+S_more_xpvbm(pTHX)
+{
+ register XPVBM* xpvbm;
+ register XPVBM* xpvbmend;
+ New(721, PL_xpvbm_root, 1008/sizeof(XPVBM), XPVBM);
+ xpvbm = PL_xpvbm_root;
+ xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
+ while (xpvbm < xpvbmend) {
+ xpvbm->xpv_pv = (char*)(xpvbm + 1);
+ xpvbm++;
+ }
+ xpvbm->xpv_pv = 0;
+}
+
+#ifdef LEAKTEST
+# define my_safemalloc(s) (void*)safexmalloc(717,s)
+# define my_safefree(p) safexfree((char*)p)
#else
-#define new_XPV() (void*)new_xpv()
-#define del_XPV(p) del_xpv((XPV *)p)
+# define my_safemalloc(s) (void*)safemalloc(s)
+# define my_safefree(p) safefree((char*)p)
#endif
#ifdef PURIFY
-# define my_safemalloc(s) safemalloc(s)
-# define my_safefree(s) free(s)
-#else
-STATIC void*
-my_safemalloc(MEM_SIZE size)
-{
- char *p;
- New(717, p, size, char);
- return (void*)p;
-}
-# define my_safefree(s) Safefree(s)
-#endif
-#define new_XPVIV() (void*)my_safemalloc(sizeof(XPVIV))
-#define del_XPVIV(p) my_safefree((char*)p)
-
-#define new_XPVNV() (void*)my_safemalloc(sizeof(XPVNV))
-#define del_XPVNV(p) my_safefree((char*)p)
-
-#define new_XPVMG() (void*)my_safemalloc(sizeof(XPVMG))
-#define del_XPVMG(p) my_safefree((char*)p)
-
-#define new_XPVLV() (void*)my_safemalloc(sizeof(XPVLV))
-#define del_XPVLV(p) my_safefree((char*)p)
-
-#define new_XPVAV() (void*)my_safemalloc(sizeof(XPVAV))
-#define del_XPVAV(p) my_safefree((char*)p)
-
-#define new_XPVHV() (void*)my_safemalloc(sizeof(XPVHV))
-#define del_XPVHV(p) my_safefree((char*)p)
-
-#define new_XPVCV() (void*)my_safemalloc(sizeof(XPVCV))
-#define del_XPVCV(p) my_safefree((char*)p)
-
-#define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
-#define del_XPVGV(p) my_safefree((char*)p)
+#define new_XIV() my_safemalloc(sizeof(XPVIV))
+#define del_XIV(p) my_safefree(p)
+
+#define new_XNV() my_safemalloc(sizeof(XPVNV))
+#define del_XNV(p) my_safefree(p)
+
+#define new_XRV() my_safemalloc(sizeof(XRV))
+#define del_XRV(p) my_safefree(p)
+
+#define new_XPV() my_safemalloc(sizeof(XPV))
+#define del_XPV(p) my_safefree(p)
+
+#define new_XPVIV() my_safemalloc(sizeof(XPVIV))
+#define del_XPVIV(p) my_safefree(p)
+
+#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
+#define del_XPVNV(p) my_safefree(p)
+
+#define new_XPVCV() my_safemalloc(sizeof(XPVCV))
+#define del_XPVCV(p) my_safefree(p)
+
+#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
+#define del_XPVAV(p) my_safefree(p)
+
+#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
+#define del_XPVHV(p) my_safefree(p)
-#define new_XPVBM() (void*)my_safemalloc(sizeof(XPVBM))
-#define del_XPVBM(p) my_safefree((char*)p)
+#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
+#define del_XPVMG(p) my_safefree(p)
+
+#define new_XPVLV() my_safemalloc(sizeof(XPVLV))
+#define del_XPVLV(p) my_safefree(p)
+
+#define new_XPVBM() my_safemalloc(sizeof(XPVBM))
+#define del_XPVBM(p) my_safefree(p)
+
+#else /* !PURIFY */
+
+#define new_XIV() (void*)new_xiv()
+#define del_XIV(p) del_xiv((XPVIV*) p)
+
+#define new_XNV() (void*)new_xnv()
+#define del_XNV(p) del_xnv((XPVNV*) p)
+
+#define new_XRV() (void*)new_xrv()
+#define del_XRV(p) del_xrv((XRV*) p)
+
+#define new_XPV() (void*)new_xpv()
+#define del_XPV(p) del_xpv((XPV *)p)
+
+#define new_XPVIV() (void*)new_xpviv()
+#define del_XPVIV(p) del_xpviv((XPVIV *)p)
+
+#define new_XPVNV() (void*)new_xpvnv()
+#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
+
+#define new_XPVCV() (void*)new_xpvcv()
+#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
+
+#define new_XPVAV() (void*)new_xpvav()
+#define del_XPVAV(p) del_xpvav((XPVAV *)p)
+
+#define new_XPVHV() (void*)new_xpvhv()
+#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
-#define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
-#define del_XPVFM(p) my_safefree((char*)p)
+#define new_XPVMG() (void*)new_xpvmg()
+#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
+
+#define new_XPVLV() (void*)new_xpvlv()
+#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
+
+#define new_XPVBM() (void*)new_xpvbm()
+#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
+
+#endif /* PURIFY */
+
+#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
+#define del_XPVGV(p) my_safefree(p)
+
+#define new_XPVFM() my_safemalloc(sizeof(XPVFM))
+#define del_XPVFM(p) my_safefree(p)
-#define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
-#define del_XPVIO(p) my_safefree((char*)p)
+#define new_XPVIO() my_safemalloc(sizeof(XPVIO))
+#define del_XPVIO(p) my_safefree(p)
+
+/*
+=for apidoc sv_upgrade
+
+Upgrade an SV to a more complex form. Use C<SvUPGRADE>. See
+C<svtype>.
+
+=cut
+*/
bool
-sv_upgrade(register SV *sv, U32 mt)
+Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
{
char* pv;
U32 cur;
U32 len;
IV iv;
- double nv;
+ NV nv;
MAGIC* magic;
HV* stash;
@@ -684,7 +836,7 @@ sv_upgrade(register SV *sv, U32 mt)
cur = 0;
len = 0;
iv = SvIVX(sv);
- nv = (double)SvIVX(sv);
+ nv = (NV)SvIVX(sv);
del_XIV(SvANY(sv));
magic = 0;
stash = 0;
@@ -698,7 +850,7 @@ sv_upgrade(register SV *sv, U32 mt)
cur = 0;
len = 0;
nv = SvNVX(sv);
- iv = I_32(nv);
+ iv = I_V(nv);
magic = 0;
stash = 0;
del_XNV(SvANY(sv));
@@ -710,8 +862,8 @@ sv_upgrade(register SV *sv, U32 mt)
pv = (char*)SvRV(sv);
cur = 0;
len = 0;
- iv = (IV)pv;
- nv = (double)(unsigned long)pv;
+ iv = PTR2IV(pv);
+ nv = PTR2NV(pv);
del_XRV(SvANY(sv));
magic = 0;
stash = 0;
@@ -761,12 +913,12 @@ sv_upgrade(register SV *sv, U32 mt)
del_XPVMG(SvANY(sv));
break;
default:
- croak("Can't upgrade that kind of scalar");
+ Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
}
switch (mt) {
case SVt_NULL:
- croak("Can't upgrade to undef");
+ Perl_croak(aTHX_ "Can't upgrade to undef");
case SVt_IV:
SvANY(sv) = new_XIV();
SvIVX(sv) = iv;
@@ -926,158 +1078,8 @@ sv_upgrade(register SV *sv, U32 mt)
return TRUE;
}
-char *
-sv_peek(SV *sv)
-{
-#ifdef DEBUGGING
- SV *t = sv_newmortal();
- STRLEN prevlen;
- int unref = 0;
-
- sv_setpvn(t, "", 0);
- retry:
- if (!sv) {
- sv_catpv(t, "VOID");
- goto finish;
- }
- else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
- sv_catpv(t, "WILD");
- goto finish;
- }
- else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes) {
- if (sv == &PL_sv_undef) {
- sv_catpv(t, "SV_UNDEF");
- if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
- SVs_GMG|SVs_SMG|SVs_RMG)) &&
- SvREADONLY(sv))
- goto finish;
- }
- else if (sv == &PL_sv_no) {
- sv_catpv(t, "SV_NO");
- if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
- SVs_GMG|SVs_SMG|SVs_RMG)) &&
- !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
- SVp_POK|SVp_NOK)) &&
- SvCUR(sv) == 0 &&
- SvNVX(sv) == 0.0)
- goto finish;
- }
- else {
- sv_catpv(t, "SV_YES");
- if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
- SVs_GMG|SVs_SMG|SVs_RMG)) &&
- !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
- SVp_POK|SVp_NOK)) &&
- SvCUR(sv) == 1 &&
- SvPVX(sv) && *SvPVX(sv) == '1' &&
- SvNVX(sv) == 1.0)
- goto finish;
- }
- sv_catpv(t, ":");
- }
- else if (SvREFCNT(sv) == 0) {
- sv_catpv(t, "(");
- unref++;
- }
- if (SvROK(sv)) {
- sv_catpv(t, "\\");
- if (SvCUR(t) + unref > 10) {
- SvCUR(t) = unref + 3;
- *SvEND(t) = '\0';
- sv_catpv(t, "...");
- goto finish;
- }
- sv = (SV*)SvRV(sv);
- goto retry;
- }
- switch (SvTYPE(sv)) {
- default:
- sv_catpv(t, "FREED");
- goto finish;
-
- case SVt_NULL:
- sv_catpv(t, "UNDEF");
- goto finish;
- case SVt_IV:
- sv_catpv(t, "IV");
- break;
- case SVt_NV:
- sv_catpv(t, "NV");
- break;
- case SVt_RV:
- sv_catpv(t, "RV");
- break;
- case SVt_PV:
- sv_catpv(t, "PV");
- break;
- case SVt_PVIV:
- sv_catpv(t, "PVIV");
- break;
- case SVt_PVNV:
- sv_catpv(t, "PVNV");
- break;
- case SVt_PVMG:
- sv_catpv(t, "PVMG");
- break;
- case SVt_PVLV:
- sv_catpv(t, "PVLV");
- break;
- case SVt_PVAV:
- sv_catpv(t, "AV");
- break;
- case SVt_PVHV:
- sv_catpv(t, "HV");
- break;
- case SVt_PVCV:
- if (CvGV(sv))
- sv_catpvf(t, "CV(%s)", GvNAME(CvGV(sv)));
- else
- sv_catpv(t, "CV()");
- goto finish;
- case SVt_PVGV:
- sv_catpv(t, "GV");
- break;
- case SVt_PVBM:
- sv_catpv(t, "BM");
- break;
- case SVt_PVFM:
- sv_catpv(t, "FM");
- break;
- case SVt_PVIO:
- sv_catpv(t, "IO");
- break;
- }
-
- if (SvPOKp(sv)) {
- if (!SvPVX(sv))
- sv_catpv(t, "(null)");
- if (SvOOK(sv))
- sv_catpvf(t, "(%ld+\"%.127s\")",(long)SvIVX(sv),SvPVX(sv));
- else
- sv_catpvf(t, "(\"%.127s\")",SvPVX(sv));
- }
- else if (SvNOKp(sv)) {
- SET_NUMERIC_STANDARD();
- sv_catpvf(t, "(%g)",SvNVX(sv));
- }
- else if (SvIOKp(sv))
- sv_catpvf(t, "(%ld)",(long)SvIVX(sv));
- else
- sv_catpv(t, "()");
-
- finish:
- if (unref) {
- while (unref--)
- sv_catpv(t, ")");
- }
- return SvPV(t, prevlen);
-#else /* DEBUGGING */
- return "";
-#endif /* DEBUGGING */
-}
-
int
-sv_backoff(register SV *sv)
+Perl_sv_backoff(pTHX_ register SV *sv)
{
assert(SvOOK(sv));
if (SvIVX(sv)) {
@@ -1091,18 +1093,25 @@ sv_backoff(register SV *sv)
return 0;
}
+/*
+=for apidoc sv_grow
+
+Expands the character buffer in the SV. This will use C<sv_unref> and will
+upgrade the SV to C<SVt_PV>. Returns a pointer to the character buffer.
+Use C<SvGROW>.
+
+=cut
+*/
+
char *
-#ifndef DOSISH
-sv_grow(register SV *sv, register I32 newlen)
-#else
-sv_grow(SV* sv, unsigned long newlen)
-#endif
+Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
{
register char *s;
#ifdef HAS_64K_LIMIT
if (newlen >= 0x10000) {
- PerlIO_printf(Perl_debug_log, "Allocation too large: %lx\n", newlen);
+ PerlIO_printf(Perl_debug_log,
+ "Allocation too large: %"UVxf"\n", (UV)newlen);
my_exit(1);
}
#endif /* HAS_64K_LIMIT */
@@ -1126,7 +1135,7 @@ sv_grow(SV* sv, unsigned long newlen)
s = SvPVX(sv);
if (newlen > SvLEN(sv)) { /* need more room? */
if (SvLEN(sv) && s) {
-#if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
+#if defined(MYMALLOC) && !defined(LEAKTEST)
STRLEN l = malloced_size((void*)SvPVX(sv));
if (newlen <= l) {
SvLEN_set(sv, l);
@@ -1143,8 +1152,17 @@ sv_grow(SV* sv, unsigned long newlen)
return s;
}
+/*
+=for apidoc sv_setiv
+
+Copies an integer into the given SV. Does not handle 'set' magic. See
+C<sv_setiv_mg>.
+
+=cut
+*/
+
void
-sv_setiv(register SV *sv, IV i)
+Perl_sv_setiv(pTHX_ register SV *sv, IV i)
{
SV_CHECK_THINKFIRST(sv);
switch (SvTYPE(sv)) {
@@ -1160,11 +1178,6 @@ sv_setiv(register SV *sv, IV i)
break;
case SVt_PVGV:
- if (SvFAKE(sv)) {
- sv_unglob(sv);
- break;
- }
- /* FALL THROUGH */
case SVt_PVAV:
case SVt_PVHV:
case SVt_PVCV:
@@ -1172,8 +1185,8 @@ sv_setiv(register SV *sv, IV i)
case SVt_PVIO:
{
dTHR;
- croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
- op_desc[PL_op->op_type]);
+ Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
+ PL_op_desc[PL_op->op_type]);
}
}
(void)SvIOK_only(sv); /* validate number */
@@ -1181,31 +1194,64 @@ sv_setiv(register SV *sv, IV i)
SvTAINT(sv);
}
+/*
+=for apidoc sv_setiv_mg
+
+Like C<sv_setiv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_setiv_mg(register SV *sv, IV i)
+Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
{
sv_setiv(sv,i);
SvSETMAGIC(sv);
}
+/*
+=for apidoc sv_setuv
+
+Copies an unsigned integer into the given SV. Does not handle 'set' magic.
+See C<sv_setuv_mg>.
+
+=cut
+*/
+
void
-sv_setuv(register SV *sv, UV u)
+Perl_sv_setuv(pTHX_ register SV *sv, UV u)
{
- if (u <= IV_MAX)
- sv_setiv(sv, u);
- else
- sv_setnv(sv, (double)u);
+ sv_setiv(sv, 0);
+ SvIsUV_on(sv);
+ SvUVX(sv) = u;
}
+/*
+=for apidoc sv_setuv_mg
+
+Like C<sv_setuv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_setuv_mg(register SV *sv, UV u)
+Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
{
sv_setuv(sv,u);
SvSETMAGIC(sv);
}
+/*
+=for apidoc sv_setnv
+
+Copies a double into the given SV. Does not handle 'set' magic. See
+C<sv_setnv_mg>.
+
+=cut
+*/
+
void
-sv_setnv(register SV *sv, double num)
+Perl_sv_setnv(pTHX_ register SV *sv, NV num)
{
SV_CHECK_THINKFIRST(sv);
switch (SvTYPE(sv)) {
@@ -1220,11 +1266,6 @@ sv_setnv(register SV *sv, double num)
break;
case SVt_PVGV:
- if (SvFAKE(sv)) {
- sv_unglob(sv);
- break;
- }
- /* FALL THROUGH */
case SVt_PVAV:
case SVt_PVHV:
case SVt_PVCV:
@@ -1232,8 +1273,8 @@ sv_setnv(register SV *sv, double num)
case SVt_PVIO:
{
dTHR;
- croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
- op_name[PL_op->op_type]);
+ Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
+ PL_op_name[PL_op->op_type]);
}
}
SvNVX(sv) = num;
@@ -1241,15 +1282,23 @@ sv_setnv(register SV *sv, double num)
SvTAINT(sv);
}
+/*
+=for apidoc sv_setnv_mg
+
+Like C<sv_setnv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_setnv_mg(register SV *sv, double num)
+Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
{
sv_setnv(sv,num);
SvSETMAGIC(sv);
}
STATIC void
-not_a_number(SV *sv)
+S_not_a_number(pTHX_ SV *sv)
{
dTHR;
char tmpbuf[64];
@@ -1297,14 +1346,25 @@ not_a_number(SV *sv)
*d = '\0';
if (PL_op)
- warn("Argument \"%s\" isn't numeric in %s", tmpbuf,
- op_name[PL_op->op_type]);
+ Perl_warner(aTHX_ WARN_NUMERIC,
+ "Argument \"%s\" isn't numeric in %s", tmpbuf,
+ PL_op_desc[PL_op->op_type]);
else
- warn("Argument \"%s\" isn't numeric", tmpbuf);
+ Perl_warner(aTHX_ WARN_NUMERIC,
+ "Argument \"%s\" isn't numeric", tmpbuf);
}
+/* the number can be converted to integer with atol() or atoll() */
+#define IS_NUMBER_TO_INT_BY_ATOL 0x01
+#define IS_NUMBER_TO_INT_BY_ATOF 0x02 /* atol() may be != atof() */
+#define IS_NUMBER_NOT_IV 0x04 /* (IV)atof() may be != atof() */
+#define IS_NUMBER_NEG 0x08 /* not good to cache UV */
+
+/* Actually, ISO C leaves conversion of UV to IV undefined, but
+ until proven guilty, assume that things are not that bad... */
+
IV
-sv_2iv(register SV *sv)
+Perl_sv_2iv(pTHX_ register SV *sv)
{
if (!sv)
return 0;
@@ -1313,80 +1373,138 @@ sv_2iv(register SV *sv)
if (SvIOKp(sv))
return SvIVX(sv);
if (SvNOKp(sv)) {
- if (SvNVX(sv) < 0.0)
- return I_V(SvNVX(sv));
- else
- return (IV) U_V(SvNVX(sv));
+ return I_V(SvNVX(sv));
}
if (SvPOKp(sv) && SvLEN(sv))
return asIV(sv);
if (!SvROK(sv)) {
- if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
+ if (!(SvFLAGS(sv) & SVs_PADTMP)) {
dTHR;
- if (!PL_localizing)
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
+ report_uninit();
}
return 0;
}
}
if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
-#ifdef OVERLOAD
SV* tmpstr;
if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
- return SvIV(tmpstr);
-#endif /* OVERLOAD */
- return (IV)SvRV(sv);
+ return SvIV(tmpstr);
+ return PTR2IV(SvRV(sv));
}
- if (SvREADONLY(sv)) {
- if (SvNOKp(sv)) {
- if (SvNVX(sv) < 0.0)
- return I_V(SvNVX(sv));
- else
- return (IV) U_V(SvNVX(sv));
- }
- if (SvPOKp(sv) && SvLEN(sv))
- return asIV(sv);
- if (PL_dowarn)
- warn(warn_uninit);
+ if (SvREADONLY(sv) && !SvOK(sv)) {
+ dTHR;
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
return 0;
}
}
- switch (SvTYPE(sv)) {
- case SVt_NULL:
- sv_upgrade(sv, SVt_IV);
- break;
- case SVt_PV:
- sv_upgrade(sv, SVt_PVIV);
- break;
- case SVt_NV:
- sv_upgrade(sv, SVt_PVNV);
- break;
+ if (SvIOKp(sv)) {
+ if (SvIsUV(sv)) {
+ return (IV)(SvUVX(sv));
+ }
+ else {
+ return SvIVX(sv);
+ }
}
if (SvNOKp(sv)) {
+ /* We can cache the IV/UV value even if it not good enough
+ * to reconstruct NV, since the conversion to PV will prefer
+ * NV over IV/UV.
+ */
+
+ if (SvTYPE(sv) == SVt_NV)
+ sv_upgrade(sv, SVt_PVNV);
+
(void)SvIOK_on(sv);
- if (SvNVX(sv) < 0.0)
+ if (SvNVX(sv) < (NV)IV_MAX + 0.5)
SvIVX(sv) = I_V(SvNVX(sv));
- else
+ else {
SvUVX(sv) = U_V(SvNVX(sv));
+ SvIsUV_on(sv);
+ ret_iv_max:
+ DEBUG_c(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
+ PTR2UV(sv),
+ SvUVX(sv),
+ SvUVX(sv)));
+ return (IV)SvUVX(sv);
+ }
}
else if (SvPOKp(sv) && SvLEN(sv)) {
- (void)SvIOK_on(sv);
- SvIVX(sv) = asIV(sv);
+ I32 numtype = looks_like_number(sv);
+
+ /* We want to avoid a possible problem when we cache an IV which
+ may be later translated to an NV, and the resulting NV is not
+ the translation of the initial data.
+
+ This means that if we cache such an IV, we need to cache the
+ NV as well. Moreover, we trade speed for space, and do not
+ cache the NV if not needed.
+ */
+ if (numtype & IS_NUMBER_NOT_IV) {
+ /* May be not an integer. Need to cache NV if we cache IV
+ * - otherwise future conversion to NV will be wrong. */
+ NV d;
+
+ d = Atof(SvPVX(sv));
+
+ if (SvTYPE(sv) < SVt_PVNV)
+ sv_upgrade(sv, SVt_PVNV);
+ SvNVX(sv) = d;
+ (void)SvNOK_on(sv);
+ (void)SvIOK_on(sv);
+#if defined(USE_LONG_DOUBLE)
+ DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
+ PTR2UV(sv), SvNVX(sv)));
+#else
+ DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%g)\n",
+ PTR2UV(sv), SvNVX(sv)));
+#endif
+ if (SvNVX(sv) < (NV)IV_MAX + 0.5)
+ SvIVX(sv) = I_V(SvNVX(sv));
+ else {
+ SvUVX(sv) = U_V(SvNVX(sv));
+ SvIsUV_on(sv);
+ goto ret_iv_max;
+ }
+ }
+ else if (numtype) {
+ /* The NV may be reconstructed from IV - safe to cache IV,
+ which may be calculated by atol(). */
+ if (SvTYPE(sv) == SVt_PV)
+ sv_upgrade(sv, SVt_PVIV);
+ (void)SvIOK_on(sv);
+ SvIVX(sv) = Atol(SvPVX(sv));
+ }
+ else { /* Not a number. Cache 0. */
+ dTHR;
+
+ if (SvTYPE(sv) < SVt_PVIV)
+ sv_upgrade(sv, SVt_PVIV);
+ SvIVX(sv) = 0;
+ (void)SvIOK_on(sv);
+ if (ckWARN(WARN_NUMERIC))
+ not_a_number(sv);
+ }
}
else {
dTHR;
- if (PL_dowarn && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
+ report_uninit();
+ if (SvTYPE(sv) < SVt_IV)
+ /* Typically the caller expects that sv_any is not NULL now. */
+ sv_upgrade(sv, SVt_IV);
return 0;
}
- DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
- (unsigned long)sv,(long)SvIVX(sv)));
- return SvIVX(sv);
+ DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
+ PTR2UV(sv),SvIVX(sv)));
+ return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
}
UV
-sv_2uv(register SV *sv)
+Perl_sv_2uv(pTHX_ register SV *sv)
{
if (!sv)
return 0;
@@ -1399,68 +1517,153 @@ sv_2uv(register SV *sv)
if (SvPOKp(sv) && SvLEN(sv))
return asUV(sv);
if (!SvROK(sv)) {
- if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
+ if (!(SvFLAGS(sv) & SVs_PADTMP)) {
dTHR;
- if (!PL_localizing)
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
+ report_uninit();
}
return 0;
}
}
if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
-#ifdef OVERLOAD
SV* tmpstr;
if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
- return SvUV(tmpstr);
-#endif /* OVERLOAD */
- return (UV)SvRV(sv);
+ return SvUV(tmpstr);
+ return PTR2UV(SvRV(sv));
}
- if (SvREADONLY(sv)) {
- if (SvNOKp(sv)) {
- return U_V(SvNVX(sv));
- }
- if (SvPOKp(sv) && SvLEN(sv))
- return asUV(sv);
- if (PL_dowarn)
- warn(warn_uninit);
+ if (SvREADONLY(sv) && !SvOK(sv)) {
+ dTHR;
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
return 0;
}
}
- switch (SvTYPE(sv)) {
- case SVt_NULL:
- sv_upgrade(sv, SVt_IV);
- break;
- case SVt_PV:
- sv_upgrade(sv, SVt_PVIV);
- break;
- case SVt_NV:
- sv_upgrade(sv, SVt_PVNV);
- break;
+ if (SvIOKp(sv)) {
+ if (SvIsUV(sv)) {
+ return SvUVX(sv);
+ }
+ else {
+ return (UV)SvIVX(sv);
+ }
}
if (SvNOKp(sv)) {
+ /* We can cache the IV/UV value even if it not good enough
+ * to reconstruct NV, since the conversion to PV will prefer
+ * NV over IV/UV.
+ */
+ if (SvTYPE(sv) == SVt_NV)
+ sv_upgrade(sv, SVt_PVNV);
(void)SvIOK_on(sv);
- SvUVX(sv) = U_V(SvNVX(sv));
+ if (SvNVX(sv) >= -0.5) {
+ SvIsUV_on(sv);
+ SvUVX(sv) = U_V(SvNVX(sv));
+ }
+ else {
+ SvIVX(sv) = I_V(SvNVX(sv));
+ ret_zero:
+ DEBUG_c(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" 2uv(%"IVdf" => %"IVdf") (as signed)\n",
+ PTR2UV(sv),
+ SvIVX(sv),
+ (IV)(UV)SvIVX(sv)));
+ return (UV)SvIVX(sv);
+ }
}
else if (SvPOKp(sv) && SvLEN(sv)) {
- (void)SvIOK_on(sv);
- SvUVX(sv) = asUV(sv);
+ I32 numtype = looks_like_number(sv);
+
+ /* We want to avoid a possible problem when we cache a UV which
+ may be later translated to an NV, and the resulting NV is not
+ the translation of the initial data.
+
+ This means that if we cache such a UV, we need to cache the
+ NV as well. Moreover, we trade speed for space, and do not
+ cache the NV if not needed.
+ */
+ if (numtype & IS_NUMBER_NOT_IV) {
+ /* May be not an integer. Need to cache NV if we cache IV
+ * - otherwise future conversion to NV will be wrong. */
+ NV d;
+
+ d = Atof(SvPVX(sv));
+
+ if (SvTYPE(sv) < SVt_PVNV)
+ sv_upgrade(sv, SVt_PVNV);
+ SvNVX(sv) = d;
+ (void)SvNOK_on(sv);
+ (void)SvIOK_on(sv);
+#if defined(USE_LONG_DOUBLE)
+ DEBUG_c(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
+ PTR2UV(sv), SvNVX(sv)));
+#else
+ DEBUG_c(PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" 2nv(%g)\n",
+ PTR2UV(sv), SvNVX(sv)));
+#endif
+ if (SvNVX(sv) < -0.5) {
+ SvIVX(sv) = I_V(SvNVX(sv));
+ goto ret_zero;
+ } else {
+ SvUVX(sv) = U_V(SvNVX(sv));
+ SvIsUV_on(sv);
+ }
+ }
+ else if (numtype & IS_NUMBER_NEG) {
+ /* The NV may be reconstructed from IV - safe to cache IV,
+ which may be calculated by atol(). */
+ if (SvTYPE(sv) == SVt_PV)
+ sv_upgrade(sv, SVt_PVIV);
+ (void)SvIOK_on(sv);
+ SvIVX(sv) = (IV)Atol(SvPVX(sv));
+ }
+ else if (numtype) { /* Non-negative */
+ /* The NV may be reconstructed from UV - safe to cache UV,
+ which may be calculated by strtoul()/atol. */
+ if (SvTYPE(sv) == SVt_PV)
+ sv_upgrade(sv, SVt_PVIV);
+ (void)SvIOK_on(sv);
+ (void)SvIsUV_on(sv);
+#ifdef HAS_STRTOUL
+ SvUVX(sv) = Strtoul(SvPVX(sv), Null(char**), 10);
+#else /* no atou(), but we know the number fits into IV... */
+ /* The only problem may be if it is negative... */
+ SvUVX(sv) = (UV)Atol(SvPVX(sv));
+#endif
+ }
+ else { /* Not a number. Cache 0. */
+ dTHR;
+
+ if (SvTYPE(sv) < SVt_PVIV)
+ sv_upgrade(sv, SVt_PVIV);
+ SvUVX(sv) = 0; /* We assume that 0s have the
+ same bitmap in IV and UV. */
+ (void)SvIOK_on(sv);
+ (void)SvIsUV_on(sv);
+ if (ckWARN(WARN_NUMERIC))
+ not_a_number(sv);
+ }
}
else {
- if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
+ if (!(SvFLAGS(sv) & SVs_PADTMP)) {
dTHR;
- if (!PL_localizing)
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
+ report_uninit();
}
+ if (SvTYPE(sv) < SVt_IV)
+ /* Typically the caller expects that sv_any is not NULL now. */
+ sv_upgrade(sv, SVt_IV);
return 0;
}
- DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
- (unsigned long)sv,SvUVX(sv)));
- return SvUVX(sv);
+
+ DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
+ PTR2UV(sv),SvUVX(sv)));
+ return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
}
-double
-sv_2nv(register SV *sv)
+NV
+Perl_sv_2nv(pTHX_ register SV *sv)
{
if (!sv)
return 0.0;
@@ -1469,42 +1672,37 @@ sv_2nv(register SV *sv)
if (SvNOKp(sv))
return SvNVX(sv);
if (SvPOKp(sv) && SvLEN(sv)) {
- if (PL_dowarn && !SvIOKp(sv) && !looks_like_number(sv))
+ dTHR;
+ if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
not_a_number(sv);
- SET_NUMERIC_STANDARD();
- return atof(SvPVX(sv));
+ return Atof(SvPVX(sv));
}
- if (SvIOKp(sv))
- return (double)SvIVX(sv);
+ if (SvIOKp(sv)) {
+ if (SvIsUV(sv))
+ return (NV)SvUVX(sv);
+ else
+ return (NV)SvIVX(sv);
+ }
if (!SvROK(sv)) {
- if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
+ if (!(SvFLAGS(sv) & SVs_PADTMP)) {
dTHR;
- if (!PL_localizing)
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
+ report_uninit();
}
return 0;
}
}
if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
-#ifdef OVERLOAD
SV* tmpstr;
if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
- return SvNV(tmpstr);
-#endif /* OVERLOAD */
- return (double)(unsigned long)SvRV(sv);
+ return SvNV(tmpstr);
+ return PTR2NV(SvRV(sv));
}
- if (SvREADONLY(sv)) {
- if (SvPOKp(sv) && SvLEN(sv)) {
- if (PL_dowarn && !SvIOKp(sv) && !looks_like_number(sv))
- not_a_number(sv);
- SET_NUMERIC_STANDARD();
- return atof(SvPVX(sv));
- }
- if (SvIOKp(sv))
- return (double)SvIVX(sv);
- if (PL_dowarn)
- warn(warn_uninit);
+ if (SvREADONLY(sv) && !SvOK(sv)) {
+ dTHR;
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
return 0.0;
}
}
@@ -1513,76 +1711,128 @@ sv_2nv(register SV *sv)
sv_upgrade(sv, SVt_PVNV);
else
sv_upgrade(sv, SVt_NV);
- DEBUG_c(SET_NUMERIC_STANDARD());
- DEBUG_c(PerlIO_printf(Perl_debug_log,
- "0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
+#if defined(USE_LONG_DOUBLE)
+ DEBUG_c({
+ RESTORE_NUMERIC_STANDARD();
+ PerlIO_printf(Perl_debug_log,
+ "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
+ PTR2UV(sv), SvNVX(sv));
+ RESTORE_NUMERIC_LOCAL();
+ });
+#else
+ DEBUG_c({
+ RESTORE_NUMERIC_STANDARD();
+ PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%g)\n",
+ PTR2UV(sv), SvNVX(sv));
+ RESTORE_NUMERIC_LOCAL();
+ });
+#endif
}
else if (SvTYPE(sv) < SVt_PVNV)
sv_upgrade(sv, SVt_PVNV);
if (SvIOKp(sv) &&
(!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
{
- SvNVX(sv) = (double)SvIVX(sv);
+ SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
}
else if (SvPOKp(sv) && SvLEN(sv)) {
- if (PL_dowarn && !SvIOKp(sv) && !looks_like_number(sv))
+ dTHR;
+ if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
not_a_number(sv);
- SET_NUMERIC_STANDARD();
- SvNVX(sv) = atof(SvPVX(sv));
+ SvNVX(sv) = Atof(SvPVX(sv));
}
else {
dTHR;
- if (PL_dowarn && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
+ report_uninit();
+ if (SvTYPE(sv) < SVt_NV)
+ /* Typically the caller expects that sv_any is not NULL now. */
+ sv_upgrade(sv, SVt_NV);
return 0.0;
}
SvNOK_on(sv);
- DEBUG_c(SET_NUMERIC_STANDARD());
- DEBUG_c(PerlIO_printf(Perl_debug_log,
- "0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
+#if defined(USE_LONG_DOUBLE)
+ DEBUG_c({
+ RESTORE_NUMERIC_STANDARD();
+ PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
+ PTR2UV(sv), SvNVX(sv));
+ RESTORE_NUMERIC_LOCAL();
+ });
+#else
+ DEBUG_c({
+ RESTORE_NUMERIC_STANDARD();
+ PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%g)\n",
+ PTR2UV(sv), SvNVX(sv));
+ RESTORE_NUMERIC_LOCAL();
+ });
+#endif
return SvNVX(sv);
}
STATIC IV
-asIV(SV *sv)
+S_asIV(pTHX_ SV *sv)
{
I32 numtype = looks_like_number(sv);
- double d;
-
- if (numtype == 1)
- return atol(SvPVX(sv));
- if (!numtype && PL_dowarn)
- not_a_number(sv);
- SET_NUMERIC_STANDARD();
- d = atof(SvPVX(sv));
- if (d < 0.0)
- return I_V(d);
- else
- return (IV) U_V(d);
+ NV d;
+
+ if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
+ return Atol(SvPVX(sv));
+ if (!numtype) {
+ dTHR;
+ if (ckWARN(WARN_NUMERIC))
+ not_a_number(sv);
+ }
+ d = Atof(SvPVX(sv));
+ return I_V(d);
}
STATIC UV
-asUV(SV *sv)
+S_asUV(pTHX_ SV *sv)
{
I32 numtype = looks_like_number(sv);
#ifdef HAS_STRTOUL
- if (numtype == 1)
- return strtoul(SvPVX(sv), Null(char**), 10);
+ if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
+ return Strtoul(SvPVX(sv), Null(char**), 10);
#endif
- if (!numtype && PL_dowarn)
- not_a_number(sv);
- SET_NUMERIC_STANDARD();
- return U_V(atof(SvPVX(sv)));
+ if (!numtype) {
+ dTHR;
+ if (ckWARN(WARN_NUMERIC))
+ not_a_number(sv);
+ }
+ return U_V(Atof(SvPVX(sv)));
}
+/*
+ * Returns a combination of (advisory only - can get false negatives)
+ * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
+ * IS_NUMBER_NEG
+ * 0 if does not look like number.
+ *
+ * In fact possible values are 0 and
+ * IS_NUMBER_TO_INT_BY_ATOL 123
+ * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV 123.1
+ * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV 123e0
+ * with a possible addition of IS_NUMBER_NEG.
+ */
+
+/*
+=for apidoc looks_like_number
+
+Test if an the content of an SV looks like a number (or is a
+number).
+
+=cut
+*/
+
I32
-looks_like_number(SV *sv)
+Perl_looks_like_number(pTHX_ SV *sv)
{
register char *s;
register char *send;
register char *sbegin;
- I32 numtype;
+ register char *nbegin;
+ I32 numtype = 0;
STRLEN len;
if (SvPOK(sv)) {
@@ -1598,23 +1848,50 @@ looks_like_number(SV *sv)
s = sbegin;
while (isSPACE(*s))
s++;
- if (*s == '+' || *s == '-')
+ if (*s == '-') {
s++;
+ numtype = IS_NUMBER_NEG;
+ }
+ else if (*s == '+')
+ s++;
+
+ nbegin = s;
+ /*
+ * we return IS_NUMBER_TO_INT_BY_ATOL if the number can be converted
+ * to _integer_ with atol() and IS_NUMBER_TO_INT_BY_ATOF if you need
+ * (int)atof().
+ */
- /* next must be digit or '.' */
+ /* next must be digit or the radix separator */
if (isDIGIT(*s)) {
do {
s++;
} while (isDIGIT(*s));
- if (*s == '.') {
+
+ if (s - nbegin >= TYPE_DIGITS(IV)) /* Cannot cache ato[ul]() */
+ numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
+ else
+ numtype |= IS_NUMBER_TO_INT_BY_ATOL;
+
+ if (*s == '.'
+#ifdef USE_LOCALE_NUMERIC
+ || IS_NUMERIC_RADIX(*s)
+#endif
+ ) {
s++;
- while (isDIGIT(*s)) /* optional digits after "." */
+ numtype |= IS_NUMBER_NOT_IV;
+ while (isDIGIT(*s)) /* optional digits after the radix */
s++;
}
}
- else if (*s == '.') {
+ else if (*s == '.'
+#ifdef USE_LOCALE_NUMERIC
+ || IS_NUMERIC_RADIX(*s)
+#endif
+ ) {
s++;
- /* no digits before '.' means we need digits after it */
+ numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
+ /* no digits before the radix means we need digits after it */
if (isDIGIT(*s)) {
do {
s++;
@@ -1626,15 +1903,10 @@ looks_like_number(SV *sv)
else
return 0;
- /*
- * we return 1 if the number can be converted to _integer_ with atol()
- * and 2 if you need (int)atof().
- */
- numtype = 1;
-
/* we can have an optional exponent part */
if (*s == 'e' || *s == 'E') {
- numtype = 2;
+ numtype &= ~IS_NUMBER_NEG;
+ numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
s++;
if (*s == '+' || *s == '-')
s++;
@@ -1651,17 +1923,51 @@ looks_like_number(SV *sv)
if (s >= send)
return numtype;
if (len == 10 && memEQ(sbegin, "0 but true", 10))
- return 1;
+ return IS_NUMBER_TO_INT_BY_ATOL;
return 0;
}
char *
-sv_2pv(register SV *sv, STRLEN *lp)
+Perl_sv_2pv_nolen(pTHX_ register SV *sv)
+{
+ STRLEN n_a;
+ return sv_2pv(sv, &n_a);
+}
+
+/* We assume that buf is at least TYPE_CHARS(UV) long. */
+static char *
+uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
+{
+ char *ptr = buf + TYPE_CHARS(UV);
+ char *ebuf = ptr;
+ int sign;
+
+ if (is_uv)
+ sign = 0;
+ else if (iv >= 0) {
+ uv = iv;
+ sign = 0;
+ } else {
+ uv = -iv;
+ sign = 1;
+ }
+ do {
+ *--ptr = '0' + (uv % 10);
+ } while (uv /= 10);
+ if (sign)
+ *--ptr = '-';
+ *peob = ebuf;
+ return ptr;
+}
+
+char *
+Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
{
register char *s;
int olderrno;
SV *tsv;
- char tmpbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
+ char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
+ char *tmpbuf = tbuf;
if (!sv) {
*lp = 0;
@@ -1674,21 +1980,23 @@ sv_2pv(register SV *sv, STRLEN *lp)
return SvPVX(sv);
}
if (SvIOKp(sv)) {
- (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
+ if (SvIsUV(sv))
+ (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
+ else
+ (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
tsv = Nullsv;
goto tokensave;
}
if (SvNOKp(sv)) {
- SET_NUMERIC_STANDARD();
- Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
+ Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
tsv = Nullsv;
goto tokensave;
}
if (!SvROK(sv)) {
- if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
+ if (!(SvFLAGS(sv) & SVs_PADTMP)) {
dTHR;
- if (!PL_localizing)
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
+ report_uninit();
}
*lp = 0;
return "";
@@ -1696,11 +2004,9 @@ sv_2pv(register SV *sv, STRLEN *lp)
}
if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
-#ifdef OVERLOAD
SV* tmpstr;
if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
- return SvPV(tmpstr,*lp);
-#endif /* OVERLOAD */
+ return SvPV(tmpstr,*lp);
sv = (SV*)SvRV(sv);
if (!sv)
s = "NULLREF";
@@ -1725,7 +2031,7 @@ sv_2pv(register SV *sv, STRLEN *lp)
int right = 4;
U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
- while(ch = *fptr++) {
+ while((ch = *fptr++)) {
if(reganch & 1) {
reflags[left++] = ch;
}
@@ -1772,35 +2078,28 @@ sv_2pv(register SV *sv, STRLEN *lp)
}
tsv = NEWSV(0,0);
if (SvOBJECT(sv))
- sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
+ Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
else
sv_setpv(tsv, s);
- sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
+ Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
goto tokensaveref;
}
*lp = strlen(s);
return s;
}
- if (SvREADONLY(sv)) {
- if (SvNOKp(sv)) {
- SET_NUMERIC_STANDARD();
- Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
- tsv = Nullsv;
- goto tokensave;
- }
- if (SvIOKp(sv)) {
- (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
- tsv = Nullsv;
- goto tokensave;
- }
- if (PL_dowarn)
- warn(warn_uninit);
+ if (SvREADONLY(sv) && !SvOK(sv)) {
+ dTHR;
+ if (ckWARN(WARN_UNINITIALIZED))
+ report_uninit();
*lp = 0;
return "";
}
}
- (void)SvUPGRADE(sv, SVt_PV);
- if (SvNOKp(sv)) {
+ if (SvNOKp(sv)) { /* See note in sv_2uv() */
+ /* XXXX 64-bit? IV may have better precision... */
+ /* I tried changing this for to be 64-bit-aware and
+ * the t/op/numconvert.t became very, very, angry.
+ * --jhi Sep 1999 */
if (SvTYPE(sv) < SVt_PVNV)
sv_upgrade(sv, SVt_PVNV);
SvGROW(sv, 28);
@@ -1812,8 +2111,7 @@ sv_2pv(register SV *sv, STRLEN *lp)
else
#endif /*apollo*/
{
- SET_NUMERIC_STANDARD();
- Gconvert(SvNVX(sv), DBL_DIG, 0, s);
+ Gconvert(SvNVX(sv), NV_DIG, 0, s);
}
errno = olderrno;
#ifdef FIXNEGATIVEZERO
@@ -1827,29 +2125,48 @@ sv_2pv(register SV *sv, STRLEN *lp)
#endif
}
else if (SvIOKp(sv)) {
- U32 oldIOK = SvIOK(sv);
+ U32 isIOK = SvIOK(sv);
+ U32 isUIOK = SvIsUV(sv);
+ char buf[TYPE_CHARS(UV)];
+ char *ebuf, *ptr;
+
if (SvTYPE(sv) < SVt_PVIV)
sv_upgrade(sv, SVt_PVIV);
- olderrno = errno; /* some Xenix systems wipe out errno here */
- sv_setpviv(sv, SvIVX(sv));
- errno = olderrno;
+ if (isUIOK)
+ ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
+ else
+ ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
+ SvGROW(sv, ebuf - ptr + 1); /* inlined from sv_setpvn */
+ Move(ptr,SvPVX(sv),ebuf - ptr,char);
+ SvCUR_set(sv, ebuf - ptr);
s = SvEND(sv);
- if (oldIOK)
+ *s = '\0';
+ if (isIOK)
SvIOK_on(sv);
else
SvIOKp_on(sv);
+ if (isUIOK)
+ SvIsUV_on(sv);
+ SvPOK_on(sv);
}
else {
dTHR;
- if (PL_dowarn && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
- warn(warn_uninit);
+ if (ckWARN(WARN_UNINITIALIZED)
+ && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
+ {
+ report_uninit();
+ }
*lp = 0;
+ if (SvTYPE(sv) < SVt_PV)
+ /* Typically the caller expects that sv_any is not NULL now. */
+ sv_upgrade(sv, SVt_PV);
return "";
}
*lp = s - SvPVX(sv);
SvCUR_set(sv, *lp);
SvPOK_on(sv);
- DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
+ DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
+ PTR2UV(sv),SvPVX(sv)));
return SvPVX(sv);
tokensave:
@@ -1892,9 +2209,36 @@ sv_2pv(register SV *sv, STRLEN *lp)
}
}
+char *
+Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
+{
+ STRLEN n_a;
+ return sv_2pvbyte(sv, &n_a);
+}
+
+char *
+Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
+{
+ return sv_2pv(sv,lp);
+}
+
+char *
+Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
+{
+ STRLEN n_a;
+ return sv_2pvutf8(sv, &n_a);
+}
+
+char *
+Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
+{
+ sv_utf8_upgrade(sv);
+ return sv_2pv(sv,lp);
+}
+
/* This function is only called on magical items */
bool
-sv_2bool(register SV *sv)
+Perl_sv_2bool(pTHX_ register SV *sv)
{
if (SvGMAGICAL(sv))
mg_get(sv);
@@ -1902,14 +2246,10 @@ sv_2bool(register SV *sv)
if (!SvOK(sv))
return 0;
if (SvROK(sv)) {
-#ifdef OVERLOAD
- {
dTHR;
SV* tmpsv;
if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
- return SvTRUE(tmpsv);
- }
-#endif /* OVERLOAD */
+ return SvTRUE(tmpsv);
return SvRV(sv) != 0;
}
if (SvPOKp(sv)) {
@@ -1934,13 +2274,157 @@ sv_2bool(register SV *sv)
}
}
+void
+Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
+{
+ int hicount;
+ char *c;
+
+ if (!sv || !SvPOK(sv) || SvUTF8(sv))
+ return;
+
+ /* This function could be much more efficient if we had a FLAG
+ * to signal if there are any hibit chars in the string
+ */
+ hicount = 0;
+ for (c = SvPVX(sv); c < SvEND(sv); c++) {
+ if (*c & 0x80)
+ hicount++;
+ }
+
+ if (hicount) {
+ char *src, *dst;
+ SvGROW(sv, SvCUR(sv) + hicount + 1);
+
+ src = SvEND(sv) - 1;
+ SvCUR_set(sv, SvCUR(sv) + hicount);
+ dst = SvEND(sv) - 1;
+
+ while (src < dst) {
+ if (*src & 0x80) {
+ dst--;
+ uv_to_utf8((U8*)dst, (U8)*src--);
+ dst--;
+ }
+ else {
+ *dst-- = *src--;
+ }
+ }
+
+ SvUTF8_on(sv);
+ }
+}
+
+bool
+Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
+{
+ if (SvPOK(sv) && SvUTF8(sv)) {
+ char *c = SvPVX(sv);
+ char *first_hi = 0;
+ /* need to figure out if this is possible at all first */
+ while (c < SvEND(sv)) {
+ if (*c & 0x80) {
+ I32 len;
+ UV uv = utf8_to_uv((U8*)c, &len);
+ if (uv >= 256) {
+ if (fail_ok)
+ return FALSE;
+ else {
+ /* XXX might want to make a callback here instead */
+ Perl_croak(aTHX_ "Big byte");
+ }
+ }
+ if (!first_hi)
+ first_hi = c;
+ c += len;
+ }
+ else {
+ c++;
+ }
+ }
+
+ if (first_hi) {
+ char *src = first_hi;
+ char *dst = first_hi;
+ while (src < SvEND(sv)) {
+ if (*src & 0x80) {
+ I32 len;
+ U8 u = (U8)utf8_to_uv((U8*)src, &len);
+ *dst++ = u;
+ src += len;
+ }
+ else {
+ *dst++ = *src++;
+ }
+ }
+ SvCUR_set(sv, dst - SvPVX(sv));
+ }
+ SvUTF8_off(sv);
+ }
+ return TRUE;
+}
+
+void
+Perl_sv_utf8_encode(pTHX_ register SV *sv)
+{
+ sv_utf8_upgrade(sv);
+ SvUTF8_off(sv);
+}
+
+bool
+Perl_sv_utf8_decode(pTHX_ register SV *sv)
+{
+ if (SvPOK(sv)) {
+ char *c;
+ bool has_utf = FALSE;
+ if (!sv_utf8_downgrade(sv, TRUE))
+ return FALSE;
+
+ /* it is actually just a matter of turning the utf8 flag on, but
+ * we want to make sure everything inside is valid utf8 first.
+ */
+ c = SvPVX(sv);
+ while (c < SvEND(sv)) {
+ if (*c & 0x80) {
+ I32 len;
+ (void)utf8_to_uv((U8*)c, &len);
+ if (len == 1) {
+ /* bad utf8 */
+ return FALSE;
+ }
+ c += len;
+ has_utf = TRUE;
+ }
+ else {
+ c++;
+ }
+ }
+
+ if (has_utf)
+ SvUTF8_on(sv);
+ }
+ return TRUE;
+}
+
+
/* Note: sv_setsv() should not be called with a source string that needs
* to be reused, since it may destroy the source string if it is marked
* as temporary.
*/
+/*
+=for apidoc sv_setsv
+
+Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
+The source SV may be destroyed if it is mortal. Does not handle 'set'
+magic. See the macro forms C<SvSetSV>, C<SvSetSV_nosteal> and
+C<sv_setsv_mg>.
+
+=cut
+*/
+
void
-sv_setsv(SV *dstr, register SV *sstr)
+Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
{
dTHR;
register U32 sflags;
@@ -1955,16 +2439,8 @@ sv_setsv(SV *dstr, register SV *sstr)
stype = SvTYPE(sstr);
dtype = SvTYPE(dstr);
- if (dtype == SVt_PVGV && (SvFLAGS(dstr) & SVf_FAKE)) {
- sv_unglob(dstr); /* so fake GLOB won't perpetuate */
- sv_setpvn(dstr, "", 0);
- (void)SvPOK_only(dstr);
- dtype = SvTYPE(dstr);
- }
-
-#ifdef OVERLOAD
SvAMAGIC_off(dstr);
-#endif /* OVERLOAD */
+
/* There's a lot of redundancy below but we're going for speed here */
switch (stype) {
@@ -1991,6 +2467,8 @@ sv_setsv(SV *dstr, register SV *sstr)
}
(void)SvIOK_only(dstr);
SvIVX(dstr) = SvIVX(sstr);
+ if (SvIsUV(sstr))
+ SvIsUV_on(dstr);
SvTAINT(dstr);
return;
}
@@ -2023,8 +2501,11 @@ sv_setsv(SV *dstr, register SV *sstr)
SvTYPE(SvRV(sstr)) == SVt_PVGV) {
sstr = SvRV(sstr);
if (sstr == dstr) {
- if (PL_curcop->cop_stash != GvSTASH(dstr))
+ if (GvIMPORTED(dstr) != GVf_IMPORTED
+ && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
+ {
GvIMPORTED_on(dstr);
+ }
GvMULTI_on(dstr);
return;
}
@@ -2049,10 +2530,10 @@ sv_setsv(SV *dstr, register SV *sstr)
case SVt_PVCV:
case SVt_PVIO:
if (PL_op)
- croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
- op_name[PL_op->op_type]);
+ Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
+ PL_op_name[PL_op->op_type]);
else
- croak("Bizarre copy of %s", sv_reftype(sstr, 0));
+ Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
break;
case SVt_PVGV:
@@ -2071,15 +2552,18 @@ sv_setsv(SV *dstr, register SV *sstr)
/* ahem, death to those who redefine active sort subs */
else if (PL_curstackinfo->si_type == PERLSI_SORT
&& GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
- croak("Can't redefine active sort subroutine %s",
+ Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
GvNAME(dstr));
(void)SvOK_off(dstr);
GvINTRO_off(dstr); /* one-shot flag */
gp_free((GV*)dstr);
GvGP(dstr) = gp_ref(GvGP(sstr));
SvTAINT(dstr);
- if (PL_curcop->cop_stash != GvSTASH(dstr))
+ if (GvIMPORTED(dstr) != GVf_IMPORTED
+ && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
+ {
GvIMPORTED_on(dstr);
+ }
GvMULTI_on(dstr);
return;
}
@@ -2095,9 +2579,9 @@ sv_setsv(SV *dstr, register SV *sstr)
}
}
if (stype == SVt_PVLV)
- SvUPGRADE(dstr, SVt_PVNV);
+ (void)SvUPGRADE(dstr, SVt_PVNV);
else
- SvUPGRADE(dstr, stype);
+ (void)SvUPGRADE(dstr, stype);
}
sflags = SvFLAGS(sstr);
@@ -2111,12 +2595,12 @@ sv_setsv(SV *dstr, register SV *sstr)
if (intro) {
GP *gp;
- GvGP(dstr)->gp_refcnt--;
+ gp_free((GV*)dstr);
GvINTRO_off(dstr); /* one-shot flag */
Newz(602,gp, 1, GP);
GvGP(dstr) = gp_ref(gp);
GvSV(dstr) = NEWSV(72,0);
- GvLINE(dstr) = PL_curcop->cop_line;
+ GvLINE(dstr) = CopLINE(PL_curcop);
GvEGV(dstr) = (GV*)dstr;
}
GvMULTI_on(dstr);
@@ -2127,8 +2611,11 @@ sv_setsv(SV *dstr, register SV *sstr)
else
dref = (SV*)GvAV(dstr);
GvAV(dstr) = (AV*)sref;
- if (PL_curcop->cop_stash != GvSTASH(dstr))
+ if (!GvIMPORTED_AV(dstr)
+ && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
+ {
GvIMPORTED_AV_on(dstr);
+ }
break;
case SVt_PVHV:
if (intro)
@@ -2136,8 +2623,11 @@ sv_setsv(SV *dstr, register SV *sstr)
else
dref = (SV*)GvHV(dstr);
GvHV(dstr) = (HV*)sref;
- if (PL_curcop->cop_stash != GvSTASH(dstr))
+ if (!GvIMPORTED_HV(dstr)
+ && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
+ {
GvIMPORTED_HV_on(dstr);
+ }
break;
case SVt_PVCV:
if (intro) {
@@ -2167,19 +2657,14 @@ sv_setsv(SV *dstr, register SV *sstr)
* active sort subs */
if (PL_curstackinfo->si_type == PERLSI_SORT &&
PL_sortcop == CvSTART(cv))
- croak(
+ Perl_croak(aTHX_
"Can't redefine active sort subroutine %s",
GvENAME((GV*)dstr));
- if (PL_dowarn || (const_changed && const_sv)) {
- if (!(CvGV(cv) && GvSTASH(CvGV(cv))
- && HvNAME(GvSTASH(CvGV(cv)))
- && strEQ(HvNAME(GvSTASH(CvGV(cv))),
- "autouse")))
- warn(const_sv ?
+ if ((const_changed || const_sv) && ckWARN(WARN_REDEFINE))
+ Perl_warner(aTHX_ WARN_REDEFINE, const_sv ?
"Constant subroutine %s redefined"
: "Subroutine %s redefined",
GvENAME((GV*)dstr));
- }
}
cv_ckproto(cv, (GV*)dstr,
SvPOK(sref) ? SvPVX(sref) : Nullch);
@@ -2189,8 +2674,11 @@ sv_setsv(SV *dstr, register SV *sstr)
GvASSUMECV_on(dstr);
PL_sub_generation++;
}
- if (PL_curcop->cop_stash != GvSTASH(dstr))
+ if (!GvIMPORTED_CV(dstr)
+ && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
+ {
GvIMPORTED_CV_on(dstr);
+ }
break;
case SVt_PVIO:
if (intro)
@@ -2205,8 +2693,11 @@ sv_setsv(SV *dstr, register SV *sstr)
else
dref = (SV*)GvSV(dstr);
GvSV(dstr) = sref;
- if (PL_curcop->cop_stash != GvSTASH(dstr))
+ if (!GvIMPORTED_SV(dstr)
+ && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
+ {
GvIMPORTED_SV_on(dstr);
+ }
break;
}
if (dref)
@@ -2218,7 +2709,8 @@ sv_setsv(SV *dstr, register SV *sstr)
}
if (SvPVX(dstr)) {
(void)SvOOK_off(dstr); /* backoff */
- Safefree(SvPVX(dstr));
+ if (SvLEN(dstr))
+ Safefree(SvPVX(dstr));
SvLEN(dstr)=SvCUR(dstr)=0;
}
}
@@ -2232,12 +2724,12 @@ sv_setsv(SV *dstr, register SV *sstr)
if (sflags & SVp_IOK) {
(void)SvIOK_on(dstr);
SvIVX(dstr) = SvIVX(sstr);
+ if (SvIsUV(sstr))
+ SvIsUV_on(dstr);
}
-#ifdef OVERLOAD
if (SvAMAGIC(sstr)) {
SvAMAGIC_on(dstr);
}
-#endif /* OVERLOAD */
}
else if (sflags & SVp_POK) {
@@ -2257,13 +2749,18 @@ sv_setsv(SV *dstr, register SV *sstr)
SvFLAGS(dstr) &= ~SVf_OOK;
Safefree(SvPVX(dstr) - SvIVX(dstr));
}
- else
+ else if (SvLEN(dstr))
Safefree(SvPVX(dstr));
}
(void)SvPOK_only(dstr);
SvPV_set(dstr, SvPVX(sstr));
SvLEN_set(dstr, SvLEN(sstr));
SvCUR_set(dstr, SvCUR(sstr));
+ if (SvUTF8(sstr))
+ SvUTF8_on(dstr);
+ else
+ SvUTF8_off(dstr);
+
SvTEMP_off(dstr);
(void)SvOK_off(sstr);
SvPV_set(sstr, Nullch);
@@ -2280,6 +2777,8 @@ sv_setsv(SV *dstr, register SV *sstr)
*SvEND(dstr) = '\0';
(void)SvPOK_only(dstr);
}
+ if (DO_UTF8(sstr))
+ SvUTF8_on(dstr);
/*SUPPRESS 560*/
if (sflags & SVp_NOK) {
SvNOK_on(dstr);
@@ -2288,6 +2787,8 @@ sv_setsv(SV *dstr, register SV *sstr)
if (sflags & SVp_IOK) {
(void)SvIOK_on(dstr);
SvIVX(dstr) = SvIVX(sstr);
+ if (SvIsUV(sstr))
+ SvIsUV_on(dstr);
}
}
else if (sflags & SVp_NOK) {
@@ -2296,16 +2797,21 @@ sv_setsv(SV *dstr, register SV *sstr)
if (SvIOK(sstr)) {
(void)SvIOK_on(dstr);
SvIVX(dstr) = SvIVX(sstr);
+ /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
+ if (SvIsUV(sstr))
+ SvIsUV_on(dstr);
}
}
else if (sflags & SVp_IOK) {
(void)SvIOK_only(dstr);
SvIVX(dstr) = SvIVX(sstr);
+ if (SvIsUV(sstr))
+ SvIsUV_on(dstr);
}
else {
if (dtype == SVt_PVGV) {
- if (PL_dowarn)
- warn("Undefined value assigned to typeglob");
+ if (ckWARN(WARN_MISC))
+ Perl_warner(aTHX_ WARN_MISC, "Undefined value assigned to typeglob");
}
else
(void)SvOK_off(dstr);
@@ -2313,15 +2819,32 @@ sv_setsv(SV *dstr, register SV *sstr)
SvTAINT(dstr);
}
+/*
+=for apidoc sv_setsv_mg
+
+Like C<sv_setsv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_setsv_mg(SV *dstr, register SV *sstr)
+Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
{
sv_setsv(dstr,sstr);
SvSETMAGIC(dstr);
}
+/*
+=for apidoc sv_setpvn
+
+Copies a string into an SV. The C<len> parameter indicates the number of
+bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
+
+=cut
+*/
+
void
-sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
+Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
{
register char *dptr;
assert(len >= 0); /* STRLEN is probably unsigned, so this may
@@ -2331,12 +2854,7 @@ sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
(void)SvOK_off(sv);
return;
}
- if (SvTYPE(sv) >= SVt_PV) {
- if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
- sv_unglob(sv);
- }
- else
- sv_upgrade(sv, SVt_PV);
+ (void)SvUPGRADE(sv, SVt_PV);
SvGROW(sv, len + 1);
dptr = SvPVX(sv);
@@ -2347,15 +2865,32 @@ sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
SvTAINT(sv);
}
+/*
+=for apidoc sv_setpvn_mg
+
+Like C<sv_setpvn>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
+Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
{
sv_setpvn(sv,ptr,len);
SvSETMAGIC(sv);
}
+/*
+=for apidoc sv_setpv
+
+Copies a string into an SV. The string must be null-terminated. Does not
+handle 'set' magic. See C<sv_setpv_mg>.
+
+=cut
+*/
+
void
-sv_setpv(register SV *sv, register const char *ptr)
+Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
{
register STRLEN len;
@@ -2365,12 +2900,7 @@ sv_setpv(register SV *sv, register const char *ptr)
return;
}
len = strlen(ptr);
- if (SvTYPE(sv) >= SVt_PV) {
- if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
- sv_unglob(sv);
- }
- else
- sv_upgrade(sv, SVt_PV);
+ (void)SvUPGRADE(sv, SVt_PV);
SvGROW(sv, len + 1);
Move(ptr,SvPVX(sv),len+1,char);
@@ -2379,15 +2909,37 @@ sv_setpv(register SV *sv, register const char *ptr)
SvTAINT(sv);
}
+/*
+=for apidoc sv_setpv_mg
+
+Like C<sv_setpv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_setpv_mg(register SV *sv, register const char *ptr)
+Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
{
sv_setpv(sv,ptr);
SvSETMAGIC(sv);
}
+/*
+=for apidoc sv_usepvn
+
+Tells an SV to use C<ptr> to find its string value. Normally the string is
+stored inside the SV but sv_usepvn allows the SV to use an outside string.
+The C<ptr> should point to memory that was allocated by C<malloc>. The
+string length, C<len>, must be supplied. This function will realloc the
+memory pointed to by C<ptr>, so that pointer should not be freed or used by
+the programmer after giving it to sv_usepvn. Does not handle 'set' magic.
+See C<sv_usepvn_mg>.
+
+=cut
+*/
+
void
-sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
+Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
{
SV_CHECK_THINKFIRST(sv);
(void)SvUPGRADE(sv, SVt_PV);
@@ -2395,7 +2947,8 @@ sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
(void)SvOK_off(sv);
return;
}
- if (SvPVX(sv))
+ (void)SvOOK_off(sv);
+ if (SvPVX(sv) && SvLEN(sv))
Safefree(SvPVX(sv));
Renew(ptr, len+1, char);
SvPVX(sv) = ptr;
@@ -2406,27 +2959,48 @@ sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
SvTAINT(sv);
}
+/*
+=for apidoc sv_usepvn_mg
+
+Like C<sv_usepvn>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
+Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
{
sv_usepvn(sv,ptr,len);
SvSETMAGIC(sv);
}
-STATIC void
-sv_check_thinkfirst(register SV *sv)
+void
+Perl_sv_force_normal(pTHX_ register SV *sv)
{
if (SvREADONLY(sv)) {
dTHR;
if (PL_curcop != &PL_compiling)
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
}
if (SvROK(sv))
sv_unref(sv);
+ else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
+ sv_unglob(sv);
}
+/*
+=for apidoc sv_chop
+
+Efficient removal of characters from the beginning of the string buffer.
+SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
+the string buffer. The C<ptr> becomes the first character of the adjusted
+string.
+
+=cut
+*/
+
void
-sv_chop(register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
+Perl_sv_chop(pTHX_ register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
{
@@ -2439,10 +3013,17 @@ sv_chop(register SV *sv, register char *ptr) /* like set but assuming ptr is in
sv_upgrade(sv,SVt_PVIV);
if (!SvOOK(sv)) {
+ if (!SvLEN(sv)) { /* make copy of shared string */
+ char *pvx = SvPVX(sv);
+ STRLEN len = SvCUR(sv);
+ SvGROW(sv, len + 1);
+ Move(pvx,SvPVX(sv),len,char);
+ *SvEND(sv) = '\0';
+ }
SvIVX(sv) = 0;
SvFLAGS(sv) |= SVf_OOK;
}
- SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK);
+ SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
delta = ptr - SvPVX(sv);
SvLEN(sv) -= delta;
SvCUR(sv) -= delta;
@@ -2450,8 +3031,18 @@ sv_chop(register SV *sv, register char *ptr) /* like set but assuming ptr is in
SvIVX(sv) += delta;
}
+/*
+=for apidoc sv_catpvn
+
+Concatenates the string onto the end of the string which is in the SV. The
+C<len> indicates number of bytes to copy. Handles 'get' magic, but not
+'set' magic. See C<sv_catpvn_mg>.
+
+=cut
+*/
+
void
-sv_catpvn(register SV *sv, register char *ptr, register STRLEN len)
+Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
{
STRLEN tlen;
char *junk;
@@ -2463,37 +3054,76 @@ sv_catpvn(register SV *sv, register char *ptr, register STRLEN len)
Move(ptr,SvPVX(sv)+tlen,len,char);
SvCUR(sv) += len;
*SvEND(sv) = '\0';
- (void)SvPOK_only(sv); /* validate pointer */
+ (void)SvPOK_only_UTF8(sv); /* validate pointer */
SvTAINT(sv);
}
+/*
+=for apidoc sv_catpvn_mg
+
+Like C<sv_catpvn>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_catpvn_mg(register SV *sv, register char *ptr, register STRLEN len)
+Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
{
sv_catpvn(sv,ptr,len);
SvSETMAGIC(sv);
}
+/*
+=for apidoc sv_catsv
+
+Concatenates the string from SV C<ssv> onto the end of the string in SV
+C<dsv>. Handles 'get' magic, but not 'set' magic. See C<sv_catsv_mg>.
+
+=cut
+*/
+
void
-sv_catsv(SV *dstr, register SV *sstr)
+Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
{
char *s;
STRLEN len;
if (!sstr)
return;
- if (s = SvPV(sstr, len))
+ if ((s = SvPV(sstr, len))) {
+ if (SvUTF8(sstr))
+ sv_utf8_upgrade(dstr);
sv_catpvn(dstr,s,len);
+ if (SvUTF8(sstr))
+ SvUTF8_on(dstr);
+ }
}
+/*
+=for apidoc sv_catsv_mg
+
+Like C<sv_catsv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_catsv_mg(SV *dstr, register SV *sstr)
+Perl_sv_catsv_mg(pTHX_ SV *dstr, register SV *sstr)
{
sv_catsv(dstr,sstr);
SvSETMAGIC(dstr);
}
+/*
+=for apidoc sv_catpv
+
+Concatenates the string onto the end of the string which is in the SV.
+Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
+
+=cut
+*/
+
void
-sv_catpv(register SV *sv, register char *ptr)
+Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
{
register STRLEN len;
STRLEN tlen;
@@ -2508,26 +3138,31 @@ sv_catpv(register SV *sv, register char *ptr)
ptr = SvPVX(sv);
Move(ptr,SvPVX(sv)+tlen,len+1,char);
SvCUR(sv) += len;
- (void)SvPOK_only(sv); /* validate pointer */
+ (void)SvPOK_only_UTF8(sv); /* validate pointer */
SvTAINT(sv);
}
+/*
+=for apidoc sv_catpv_mg
+
+Like C<sv_catpv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_catpv_mg(register SV *sv, register char *ptr)
+Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
{
sv_catpv(sv,ptr);
SvSETMAGIC(sv);
}
SV *
-newSV(STRLEN len)
+Perl_newSV(pTHX_ STRLEN len)
{
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
if (len) {
sv_upgrade(sv, SVt_PV);
SvGROW(sv, len + 1);
@@ -2537,15 +3172,23 @@ newSV(STRLEN len)
/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
+/*
+=for apidoc sv_magic
+
+Adds magic to an SV.
+
+=cut
+*/
+
void
-sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
+Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
{
MAGIC* mg;
if (SvREADONLY(sv)) {
dTHR;
if (PL_curcop != &PL_compiling && !strchr("gBf", how))
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
}
if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
@@ -2578,100 +3221,107 @@ sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
switch (how) {
case 0:
- mg->mg_virtual = &vtbl_sv;
+ mg->mg_virtual = &PL_vtbl_sv;
break;
-#ifdef OVERLOAD
case 'A':
- mg->mg_virtual = &vtbl_amagic;
+ mg->mg_virtual = &PL_vtbl_amagic;
break;
case 'a':
- mg->mg_virtual = &vtbl_amagicelem;
+ mg->mg_virtual = &PL_vtbl_amagicelem;
break;
case 'c':
mg->mg_virtual = 0;
break;
-#endif /* OVERLOAD */
case 'B':
- mg->mg_virtual = &vtbl_bm;
+ mg->mg_virtual = &PL_vtbl_bm;
+ break;
+ case 'D':
+ mg->mg_virtual = &PL_vtbl_regdata;
+ break;
+ case 'd':
+ mg->mg_virtual = &PL_vtbl_regdatum;
break;
case 'E':
- mg->mg_virtual = &vtbl_env;
+ mg->mg_virtual = &PL_vtbl_env;
break;
case 'f':
- mg->mg_virtual = &vtbl_fm;
+ mg->mg_virtual = &PL_vtbl_fm;
break;
case 'e':
- mg->mg_virtual = &vtbl_envelem;
+ mg->mg_virtual = &PL_vtbl_envelem;
break;
case 'g':
- mg->mg_virtual = &vtbl_mglob;
+ mg->mg_virtual = &PL_vtbl_mglob;
break;
case 'I':
- mg->mg_virtual = &vtbl_isa;
+ mg->mg_virtual = &PL_vtbl_isa;
break;
case 'i':
- mg->mg_virtual = &vtbl_isaelem;
+ mg->mg_virtual = &PL_vtbl_isaelem;
break;
case 'k':
- mg->mg_virtual = &vtbl_nkeys;
+ mg->mg_virtual = &PL_vtbl_nkeys;
break;
case 'L':
SvRMAGICAL_on(sv);
mg->mg_virtual = 0;
break;
case 'l':
- mg->mg_virtual = &vtbl_dbline;
+ mg->mg_virtual = &PL_vtbl_dbline;
break;
#ifdef USE_THREADS
case 'm':
- mg->mg_virtual = &vtbl_mutex;
+ mg->mg_virtual = &PL_vtbl_mutex;
break;
#endif /* USE_THREADS */
#ifdef USE_LOCALE_COLLATE
case 'o':
- mg->mg_virtual = &vtbl_collxfrm;
+ mg->mg_virtual = &PL_vtbl_collxfrm;
break;
#endif /* USE_LOCALE_COLLATE */
case 'P':
- mg->mg_virtual = &vtbl_pack;
+ mg->mg_virtual = &PL_vtbl_pack;
break;
case 'p':
case 'q':
- mg->mg_virtual = &vtbl_packelem;
+ mg->mg_virtual = &PL_vtbl_packelem;
break;
case 'r':
- mg->mg_virtual = &vtbl_regexp;
+ mg->mg_virtual = &PL_vtbl_regexp;
break;
case 'S':
- mg->mg_virtual = &vtbl_sig;
+ mg->mg_virtual = &PL_vtbl_sig;
break;
case 's':
- mg->mg_virtual = &vtbl_sigelem;
+ mg->mg_virtual = &PL_vtbl_sigelem;
break;
case 't':
- mg->mg_virtual = &vtbl_taint;
+ mg->mg_virtual = &PL_vtbl_taint;
mg->mg_len = 1;
break;
case 'U':
- mg->mg_virtual = &vtbl_uvar;
+ mg->mg_virtual = &PL_vtbl_uvar;
break;
case 'v':
- mg->mg_virtual = &vtbl_vec;
+ mg->mg_virtual = &PL_vtbl_vec;
break;
case 'x':
- mg->mg_virtual = &vtbl_substr;
+ mg->mg_virtual = &PL_vtbl_substr;
break;
case 'y':
- mg->mg_virtual = &vtbl_defelem;
+ mg->mg_virtual = &PL_vtbl_defelem;
break;
case '*':
- mg->mg_virtual = &vtbl_glob;
+ mg->mg_virtual = &PL_vtbl_glob;
break;
case '#':
- mg->mg_virtual = &vtbl_arylen;
+ mg->mg_virtual = &PL_vtbl_arylen;
break;
case '.':
- mg->mg_virtual = &vtbl_pos;
+ mg->mg_virtual = &PL_vtbl_pos;
+ break;
+ case '<':
+ mg->mg_virtual = &PL_vtbl_backref;
break;
case '~': /* Reserved for use by extensions not perl internals. */
/* Useful for attaching extension internal data to perl vars. */
@@ -2680,7 +3330,7 @@ sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
SvRMAGICAL_on(sv);
break;
default:
- croak("Don't know how to handle magic of type '%c'", how);
+ Perl_croak(aTHX_ "Don't know how to handle magic of type '%c'", how);
}
mg_magical(sv);
if (SvGMAGICAL(sv))
@@ -2688,7 +3338,7 @@ sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
}
int
-sv_unmagic(SV *sv, int type)
+Perl_sv_unmagic(pTHX_ SV *sv, int type)
{
MAGIC* mg;
MAGIC** mgp;
@@ -2699,8 +3349,8 @@ sv_unmagic(SV *sv, int type)
if (mg->mg_type == type) {
MGVTBL* vtbl = mg->mg_virtual;
*mgp = mg->mg_moremagic;
- if (vtbl && (vtbl->svt_free != NULL))
- (VTBL->svt_free)(sv, mg);
+ if (vtbl && vtbl->svt_free)
+ CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
if (mg->mg_ptr && mg->mg_type != 'g')
if (mg->mg_len >= 0)
Safefree(mg->mg_ptr);
@@ -2721,8 +3371,74 @@ sv_unmagic(SV *sv, int type)
return 0;
}
+SV *
+Perl_sv_rvweaken(pTHX_ SV *sv)
+{
+ SV *tsv;
+ if (!SvOK(sv)) /* let undefs pass */
+ return sv;
+ if (!SvROK(sv))
+ Perl_croak(aTHX_ "Can't weaken a nonreference");
+ else if (SvWEAKREF(sv)) {
+ dTHR;
+ if (ckWARN(WARN_MISC))
+ Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
+ return sv;
+ }
+ tsv = SvRV(sv);
+ sv_add_backref(tsv, sv);
+ SvWEAKREF_on(sv);
+ SvREFCNT_dec(tsv);
+ return sv;
+}
+
+STATIC void
+S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
+{
+ AV *av;
+ MAGIC *mg;
+ if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
+ av = (AV*)mg->mg_obj;
+ else {
+ av = newAV();
+ sv_magic(tsv, (SV*)av, '<', NULL, 0);
+ SvREFCNT_dec(av); /* for sv_magic */
+ }
+ av_push(av,sv);
+}
+
+STATIC void
+S_sv_del_backref(pTHX_ SV *sv)
+{
+ AV *av;
+ SV **svp;
+ I32 i;
+ SV *tsv = SvRV(sv);
+ MAGIC *mg;
+ if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
+ Perl_croak(aTHX_ "panic: del_backref");
+ av = (AV *)mg->mg_obj;
+ svp = AvARRAY(av);
+ i = AvFILLp(av);
+ while (i >= 0) {
+ if (svp[i] == sv) {
+ svp[i] = &PL_sv_undef; /* XXX */
+ }
+ i--;
+ }
+}
+
+/*
+=for apidoc sv_insert
+
+Inserts a string at the specified offset/length within the SV. Similar to
+the Perl substr() function.
+
+=cut
+*/
+
void
-sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
+Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
{
register char *big;
register char *mid;
@@ -2733,7 +3449,7 @@ sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
if (!bigstr)
- croak("Can't modify non-existent substring");
+ Perl_croak(aTHX_ "Can't modify non-existent substring");
SvPV_force(bigstr, curlen);
if (offset + len > curlen) {
SvGROW(bigstr, offset+len+1);
@@ -2741,6 +3457,7 @@ sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
SvCUR_set(bigstr, offset+len);
}
+ SvTAINT(bigstr);
i = littlelen - len;
if (i > 0) { /* string might grow */
big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
@@ -2767,7 +3484,7 @@ sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
bigend = big + SvCUR(bigstr);
if (midend > bigend)
- croak("panic: sv_insert");
+ Perl_croak(aTHX_ "panic: sv_insert");
if (mid - big > bigend - midend) { /* faster to shorten from end */
if (littlelen) {
@@ -2783,7 +3500,7 @@ sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
SvCUR_set(bigstr, mid - big);
}
/*SUPPRESS 560*/
- else if (i = mid - big) { /* faster from front */
+ else if ((i = mid - big)) { /* faster from front */
midend -= littlelen;
mid = midend;
sv_chop(bigstr,midend-i);
@@ -2807,12 +3524,13 @@ sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
/* make sv point to what nstr did */
void
-sv_replace(register SV *sv, register SV *nsv)
+Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
{
+ dTHR;
U32 refcnt = SvREFCNT(sv);
SV_CHECK_THINKFIRST(sv);
- if (SvREFCNT(nsv) != 1)
- warn("Reference miscount in sv_replace()");
+ if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Reference miscount in sv_replace()");
if (SvMAGICAL(sv)) {
if (SvMAGICAL(nsv))
mg_free(nsv);
@@ -2833,7 +3551,7 @@ sv_replace(register SV *sv, register SV *nsv)
}
void
-sv_clear(register SV *sv)
+Perl_sv_clear(pTHX_ register SV *sv)
{
HV* stash;
assert(sv);
@@ -2863,15 +3581,24 @@ sv_clear(register SV *sv)
PUSHMARK(SP);
PUSHs(&tmpref);
PUTBACK;
- perl_call_sv((SV*)GvCV(destructor),
- G_DISCARD|G_EVAL|G_KEEPERR);
+ call_sv((SV*)GvCV(destructor),
+ G_DISCARD|G_EVAL|G_KEEPERR);
SvREFCNT(sv)--;
POPSTACK;
+ SPAGAIN;
LEAVE;
}
} while (SvOBJECT(sv) && SvSTASH(sv) != stash);
del_XRV(SvANY(&tmpref));
+
+ if (SvREFCNT(sv)) {
+ if (PL_in_clean_objs)
+ Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
+ HvNAME(stash));
+ /* DESTROY gave object new lease on life */
+ return;
+ }
}
if (SvOBJECT(sv)) {
@@ -2880,12 +3607,6 @@ sv_clear(register SV *sv)
if (SvTYPE(sv) != SVt_PVIO)
--PL_sv_objcount; /* XXX Might want something more general */
}
- if (SvREFCNT(sv)) {
- if (PL_in_clean_objs)
- croak("DESTROY created new reference to dead object");
- /* DESTROY gave object new lease on life */
- return;
- }
}
if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
mg_free(sv);
@@ -2896,7 +3617,12 @@ sv_clear(register SV *sv)
IoIFP(sv) != PerlIO_stdin() &&
IoIFP(sv) != PerlIO_stdout() &&
IoIFP(sv) != PerlIO_stderr())
- io_close((IO*)sv);
+ {
+ io_close((IO*)sv, FALSE);
+ }
+ if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
+ PerlDir_close(IoDIRP(sv));
+ IoDIRP(sv) = (DIR*)NULL;
Safefree(IoTOP_NAME(sv));
Safefree(IoFMT_NAME(sv));
Safefree(IoBOTTOM_NAME(sv));
@@ -2933,8 +3659,12 @@ sv_clear(register SV *sv)
/* FALL THROUGH */
case SVt_PV:
case SVt_RV:
- if (SvROK(sv))
- SvREFCNT_dec(SvRV(sv));
+ if (SvROK(sv)) {
+ if (SvWEAKREF(sv))
+ sv_del_backref(sv);
+ else
+ SvREFCNT_dec(SvRV(sv));
+ }
else if (SvPVX(sv) && SvLEN(sv))
Safefree(SvPVX(sv));
break;
@@ -3006,7 +3736,7 @@ sv_clear(register SV *sv)
}
SV *
-sv_newref(SV *sv)
+Perl_sv_newref(pTHX_ SV *sv)
{
if (sv)
ATOMIC_INC(SvREFCNT(sv));
@@ -3014,8 +3744,9 @@ sv_newref(SV *sv)
}
void
-sv_free(SV *sv)
+Perl_sv_free(pTHX_ SV *sv)
{
+ dTHR;
int refcount_is_zero;
if (!sv)
@@ -3030,7 +3761,8 @@ sv_free(SV *sv)
SvREFCNT(sv) = (~(U32)0)/2;
return;
}
- warn("Attempt to free unreferenced scalar");
+ if (ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
return;
}
ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
@@ -3038,7 +3770,10 @@ sv_free(SV *sv)
return;
#ifdef DEBUGGING
if (SvTEMP(sv)) {
- warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
+ if (ckWARN_d(WARN_DEBUGGING))
+ Perl_warner(aTHX_ WARN_DEBUGGING,
+ "Attempt to free temp prematurely: SV 0x%"UVxf,
+ PTR2UV(sv));
return;
}
#endif
@@ -3052,8 +3787,16 @@ sv_free(SV *sv)
del_SV(sv);
}
+/*
+=for apidoc sv_len
+
+Returns the length of the string in the SV. See also C<SvCUR>.
+
+=cut
+*/
+
STRLEN
-sv_len(register SV *sv)
+Perl_sv_len(pTHX_ register SV *sv)
{
char *junk;
STRLEN len;
@@ -3068,8 +3811,102 @@ sv_len(register SV *sv)
return len;
}
+STRLEN
+Perl_sv_len_utf8(pTHX_ register SV *sv)
+{
+ U8 *s;
+ U8 *send;
+ STRLEN len;
+
+ if (!sv)
+ return 0;
+
+#ifdef NOTYET
+ if (SvGMAGICAL(sv))
+ len = mg_length(sv);
+ else
+#endif
+ s = (U8*)SvPV(sv, len);
+ send = s + len;
+ len = 0;
+ while (s < send) {
+ s += UTF8SKIP(s);
+ len++;
+ }
+ return len;
+}
+
+void
+Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
+{
+ U8 *start;
+ U8 *s;
+ U8 *send;
+ I32 uoffset = *offsetp;
+ STRLEN len;
+
+ if (!sv)
+ return;
+
+ start = s = (U8*)SvPV(sv, len);
+ send = s + len;
+ while (s < send && uoffset--)
+ s += UTF8SKIP(s);
+ if (s >= send)
+ s = send;
+ *offsetp = s - start;
+ if (lenp) {
+ I32 ulen = *lenp;
+ start = s;
+ while (s < send && ulen--)
+ s += UTF8SKIP(s);
+ if (s >= send)
+ s = send;
+ *lenp = s - start;
+ }
+ return;
+}
+
+void
+Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
+{
+ U8 *s;
+ U8 *send;
+ STRLEN len;
+
+ if (!sv)
+ return;
+
+ s = (U8*)SvPV(sv, len);
+ if (len < *offsetp)
+ Perl_croak(aTHX_ "panic: bad byte offset");
+ send = s + *offsetp;
+ len = 0;
+ while (s < send) {
+ s += UTF8SKIP(s);
+ ++len;
+ }
+ if (s != send) {
+ dTHR;
+ if (ckWARN_d(WARN_UTF8))
+ Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
+ --len;
+ }
+ *offsetp = len;
+ return;
+}
+
+/*
+=for apidoc sv_eq
+
+Returns a boolean indicating whether the strings in the two SVs are
+identical.
+
+=cut
+*/
+
I32
-sv_eq(register SV *str1, register SV *str2)
+Perl_sv_eq(pTHX_ register SV *str1, register SV *str2)
{
char *pv1;
STRLEN cur1;
@@ -3094,15 +3931,55 @@ sv_eq(register SV *str1, register SV *str2)
return memEQ(pv1, pv2, cur1);
}
+/*
+=for apidoc sv_cmp
+
+Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
+string in C<sv1> is less than, equal to, or greater than the string in
+C<sv2>.
+
+=cut
+*/
+
I32
-sv_cmp(register SV *str1, register SV *str2)
+Perl_sv_cmp(pTHX_ register SV *str1, register SV *str2)
{
- STRLEN cur1 = 0;
- char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
- STRLEN cur2 = 0;
- char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
+ STRLEN cur1, cur2;
+ char *pv1, *pv2;
I32 retval;
+ if (str1) {
+ pv1 = SvPV(str1, cur1);
+ }
+ else {
+ cur1 = 0;
+ }
+
+ if (str2) {
+ if (SvPOK(str2)) {
+ if (SvPOK(str1) && SvUTF8(str1) != SvUTF8(str2) && !IN_BYTE) {
+ /* must upgrade other to UTF8 first */
+ if (SvUTF8(str1)) {
+ sv_utf8_upgrade(str2);
+ }
+ else {
+ sv_utf8_upgrade(str1);
+ /* refresh pointer and length */
+ pv1 = SvPVX(str1);
+ cur1 = SvCUR(str1);
+ }
+ }
+ pv2 = SvPVX(str2);
+ cur2 = SvCUR(str2);
+ }
+ else {
+ pv2 = sv_2pv(str2, &cur2);
+ }
+ }
+ else {
+ cur2 = 0;
+ }
+
if (!cur1)
return cur2 ? -1 : 0;
@@ -3121,7 +3998,7 @@ sv_cmp(register SV *str1, register SV *str2)
}
I32
-sv_cmp_locale(register SV *sv1, register SV *sv2)
+Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
{
#ifdef USE_LOCALE_COLLATE
@@ -3176,7 +4053,7 @@ sv_cmp_locale(register SV *sv1, register SV *sv2)
* according to the locale settings.
*/
char *
-sv_collxfrm(SV *sv, STRLEN *nxp)
+Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
{
MAGIC *mg;
@@ -3222,7 +4099,7 @@ sv_collxfrm(SV *sv, STRLEN *nxp)
#endif /* USE_LOCALE_COLLATE */
char *
-sv_gets(register SV *sv, register PerlIO *fp, I32 append)
+Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
{
dTHR;
char *rsptr;
@@ -3234,6 +4111,7 @@ sv_gets(register SV *sv, register PerlIO *fp, I32 append)
SV_CHECK_THINKFIRST(sv);
(void)SvUPGRADE(sv, SVt_PV);
+
SvSCREAM_off(sv);
if (RsSNARF(PL_rs)) {
@@ -3331,11 +4209,11 @@ sv_gets(register SV *sv, register PerlIO *fp, I32 append)
bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
ptr = (STDCHAR*)PerlIO_get_ptr(fp);
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
+ "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
- (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
- (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
+ "Screamer: entering: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
+ PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
+ PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
for (;;) {
screamer:
if (cnt > 0) {
@@ -3365,24 +4243,25 @@ sv_gets(register SV *sv, register PerlIO *fp, I32 append)
}
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
+ "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
+ PTR2UV(ptr),(long)cnt));
PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
- (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
- (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
+ "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
+ PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
+ PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
/* This used to call 'filbuf' in stdio form, but as that behaves like
getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
another abstraction. */
i = PerlIO_getc(fp); /* get more characters */
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
- (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
- (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
+ "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
+ PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
+ PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
cnt = PerlIO_get_cnt(fp);
ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
+ "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
if (i == EOF) /* all done for ever? */
goto thats_really_all_folks;
@@ -3406,12 +4285,12 @@ thats_really_all_folks:
if (shortbuffered)
cnt += shortbuffered;
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
+ "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
DEBUG_P(PerlIO_printf(Perl_debug_log,
- "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
- (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
- (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
+ "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
+ PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
+ PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
*bp = '\0';
SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
DEBUG_P(PerlIO_printf(Perl_debug_log,
@@ -3420,8 +4299,16 @@ thats_really_all_folks:
}
else
{
+#ifndef EPOC
/*The big, slow, and stupid way */
STDCHAR buf[8192];
+#else
+ /* Need to work around EPOC SDK features */
+ /* On WINS: MS VC5 generates calls to _chkstk, */
+ /* if a `large' stack frame is allocated */
+ /* gcc on MARM does not generate calls like these */
+ STDCHAR buf[1024];
+#endif
screamer2:
if (rslen) {
@@ -3476,16 +4363,20 @@ screamer2:
}
}
-#ifdef WIN32
- win32_strip_return(sv);
-#endif
-
return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
}
+/*
+=for apidoc sv_inc
+
+Auto-increment of the value in the SV.
+
+=cut
+*/
+
void
-sv_inc(register SV *sv)
+Perl_sv_inc(pTHX_ register SV *sv)
{
register char *d;
int flags;
@@ -3498,14 +4389,13 @@ sv_inc(register SV *sv)
if (SvREADONLY(sv)) {
dTHR;
if (PL_curcop != &PL_compiling)
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
}
if (SvROK(sv)) {
IV i;
-#ifdef OVERLOAD
- if (SvAMAGIC(sv) && AMG_CALLun(sv,inc)) return;
-#endif /* OVERLOAD */
- i = (IV)SvRV(sv);
+ if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
+ return;
+ i = PTR2IV(SvRV(sv));
sv_unref(sv);
sv_setiv(sv, i);
}
@@ -3517,11 +4407,19 @@ sv_inc(register SV *sv)
return;
}
if (flags & SVp_IOK) {
- if (SvIVX(sv) == IV_MAX)
- sv_setnv(sv, (double)IV_MAX + 1.0);
- else {
- (void)SvIOK_only(sv);
- ++SvIVX(sv);
+ if (SvIsUV(sv)) {
+ if (SvUVX(sv) == UV_MAX)
+ sv_setnv(sv, (NV)UV_MAX + 1.0);
+ else
+ (void)SvIOK_only_UV(sv);
+ ++SvUVX(sv);
+ } else {
+ if (SvIVX(sv) == IV_MAX)
+ sv_setnv(sv, (NV)IV_MAX + 1.0);
+ else {
+ (void)SvIOK_only(sv);
+ ++SvIVX(sv);
+ }
}
return;
}
@@ -3536,8 +4434,7 @@ sv_inc(register SV *sv)
while (isALPHA(*d)) d++;
while (isDIGIT(*d)) d++;
if (*d) {
- SET_NUMERIC_STANDARD();
- sv_setnv(sv,atof(SvPVX(sv)) + 1.0); /* punt */
+ sv_setnv(sv,Atof(SvPVX(sv)) + 1.0); /* punt */
return;
}
d--;
@@ -3579,8 +4476,16 @@ sv_inc(register SV *sv)
*d = d[1];
}
+/*
+=for apidoc sv_dec
+
+Auto-decrement of the value in the SV.
+
+=cut
+*/
+
void
-sv_dec(register SV *sv)
+Perl_sv_dec(pTHX_ register SV *sv)
{
int flags;
@@ -3592,14 +4497,13 @@ sv_dec(register SV *sv)
if (SvREADONLY(sv)) {
dTHR;
if (PL_curcop != &PL_compiling)
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
}
if (SvROK(sv)) {
IV i;
-#ifdef OVERLOAD
- if (SvAMAGIC(sv) && AMG_CALLun(sv,dec)) return;
-#endif /* OVERLOAD */
- i = (IV)SvRV(sv);
+ if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
+ return;
+ i = PTR2IV(SvRV(sv));
sv_unref(sv);
sv_setiv(sv, i);
}
@@ -3611,11 +4515,22 @@ sv_dec(register SV *sv)
return;
}
if (flags & SVp_IOK) {
- if (SvIVX(sv) == IV_MIN)
- sv_setnv(sv, (double)IV_MIN - 1.0);
- else {
- (void)SvIOK_only(sv);
- --SvIVX(sv);
+ if (SvIsUV(sv)) {
+ if (SvUVX(sv) == 0) {
+ (void)SvIOK_only(sv);
+ SvIVX(sv) = -1;
+ }
+ else {
+ (void)SvIOK_only_UV(sv);
+ --SvUVX(sv);
+ }
+ } else {
+ if (SvIVX(sv) == IV_MIN)
+ sv_setnv(sv, (NV)IV_MIN - 1.0);
+ else {
+ (void)SvIOK_only(sv);
+ --SvIVX(sv);
+ }
}
return;
}
@@ -3626,155 +4541,242 @@ sv_dec(register SV *sv)
(void)SvNOK_only(sv);
return;
}
- SET_NUMERIC_STANDARD();
- sv_setnv(sv,atof(SvPVX(sv)) - 1.0); /* punt */
+ sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
}
+/*
+=for apidoc sv_mortalcopy
+
+Creates a new SV which is a copy of the original SV. The new SV is marked
+as mortal.
+
+=cut
+*/
+
/* Make a string that will exist for the duration of the expression
* evaluation. Actually, it may have to last longer than that, but
* hopefully we won't free it until it has been assigned to a
* permanent location. */
-STATIC void
-sv_mortalgrow(void)
-{
- dTHR;
- PL_tmps_max += (PL_tmps_max < 512) ? 128 : 512;
- Renew(PL_tmps_stack, PL_tmps_max, SV*);
-}
-
SV *
-sv_mortalcopy(SV *oldstr)
+Perl_sv_mortalcopy(pTHX_ SV *oldstr)
{
dTHR;
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
sv_setsv(sv,oldstr);
- if (++PL_tmps_ix >= PL_tmps_max)
- sv_mortalgrow();
- PL_tmps_stack[PL_tmps_ix] = sv;
+ EXTEND_MORTAL(1);
+ PL_tmps_stack[++PL_tmps_ix] = sv;
SvTEMP_on(sv);
return sv;
}
+/*
+=for apidoc sv_newmortal
+
+Creates a new SV which is mortal. The reference count of the SV is set to 1.
+
+=cut
+*/
+
SV *
-sv_newmortal(void)
+Perl_sv_newmortal(pTHX)
{
dTHR;
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
SvFLAGS(sv) = SVs_TEMP;
- if (++PL_tmps_ix >= PL_tmps_max)
- sv_mortalgrow();
- PL_tmps_stack[PL_tmps_ix] = sv;
+ EXTEND_MORTAL(1);
+ PL_tmps_stack[++PL_tmps_ix] = sv;
return sv;
}
+/*
+=for apidoc sv_2mortal
+
+Marks an SV as mortal. The SV will be destroyed when the current context
+ends.
+
+=cut
+*/
+
/* same thing without the copying */
SV *
-sv_2mortal(register SV *sv)
+Perl_sv_2mortal(pTHX_ register SV *sv)
{
dTHR;
if (!sv)
return sv;
if (SvREADONLY(sv) && SvIMMORTAL(sv))
return sv;
- if (++PL_tmps_ix >= PL_tmps_max)
- sv_mortalgrow();
- PL_tmps_stack[PL_tmps_ix] = sv;
+ EXTEND_MORTAL(1);
+ PL_tmps_stack[++PL_tmps_ix] = sv;
SvTEMP_on(sv);
return sv;
}
+/*
+=for apidoc newSVpv
+
+Creates a new SV and copies a string into it. The reference count for the
+SV is set to 1. If C<len> is zero, Perl will compute the length using
+strlen(). For efficiency, consider using C<newSVpvn> instead.
+
+=cut
+*/
+
SV *
-newSVpv(char *s, STRLEN len)
+Perl_newSVpv(pTHX_ const char *s, STRLEN len)
{
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
if (!len)
len = strlen(s);
sv_setpvn(sv,s,len);
return sv;
}
+/*
+=for apidoc newSVpvn
+
+Creates a new SV and copies a string into it. The reference count for the
+SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
+string. You are responsible for ensuring that the source string is at least
+C<len> bytes long.
+
+=cut
+*/
+
SV *
-newSVpvn(char *s, STRLEN len)
+Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
{
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
sv_setpvn(sv,s,len);
return sv;
}
+#if defined(PERL_IMPLICIT_CONTEXT)
SV *
-newSVpvf(const char* pat, ...)
+Perl_newSVpvf_nocontext(const char* pat, ...)
{
+ dTHX;
register SV *sv;
va_list args;
+ va_start(args, pat);
+ sv = vnewSVpvf(pat, &args);
+ va_end(args);
+ return sv;
+}
+#endif
- new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
+/*
+=for apidoc newSVpvf
+
+Creates a new SV an initialize it with the string formatted like
+C<sprintf>.
+
+=cut
+*/
+
+SV *
+Perl_newSVpvf(pTHX_ const char* pat, ...)
+{
+ register SV *sv;
+ va_list args;
va_start(args, pat);
- sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ sv = vnewSVpvf(pat, &args);
va_end(args);
return sv;
}
+SV *
+Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
+{
+ register SV *sv;
+ new_SV(sv);
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+ return sv;
+}
+
+/*
+=for apidoc newSVnv
+
+Creates a new SV and copies a floating point value into it.
+The reference count for the SV is set to 1.
+
+=cut
+*/
SV *
-newSVnv(double n)
+Perl_newSVnv(pTHX_ NV n)
{
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
sv_setnv(sv,n);
return sv;
}
+/*
+=for apidoc newSViv
+
+Creates a new SV and copies an integer into it. The reference count for the
+SV is set to 1.
+
+=cut
+*/
+
SV *
-newSViv(IV i)
+Perl_newSViv(pTHX_ IV i)
{
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
sv_setiv(sv,i);
return sv;
}
+/*
+=for apidoc newSVuv
+
+Creates a new SV and copies an unsigned integer into it.
+The reference count for the SV is set to 1.
+
+=cut
+*/
+
+SV *
+Perl_newSVuv(pTHX_ UV u)
+{
+ register SV *sv;
+
+ new_SV(sv);
+ sv_setuv(sv,u);
+ return sv;
+}
+
+/*
+=for apidoc newRV_noinc
+
+Creates an RV wrapper for an SV. The reference count for the original
+SV is B<not> incremented.
+
+=cut
+*/
+
SV *
-newRV_noinc(SV *tmpRef)
+Perl_newRV_noinc(pTHX_ SV *tmpRef)
{
dTHR;
register SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
sv_upgrade(sv, SVt_RV);
SvTEMP_off(tmpRef);
SvRV(sv) = tmpRef;
@@ -3782,29 +4784,37 @@ newRV_noinc(SV *tmpRef)
return sv;
}
+/* newRV_inc is #defined to newRV in sv.h */
SV *
-newRV(SV *tmpRef)
+Perl_newRV(pTHX_ SV *tmpRef)
{
return newRV_noinc(SvREFCNT_inc(tmpRef));
}
+/*
+=for apidoc newSVsv
+
+Creates a new SV which is an exact duplicate of the original SV.
+
+=cut
+*/
+
/* make an exact duplicate of old */
SV *
-newSVsv(register SV *old)
+Perl_newSVsv(pTHX_ register SV *old)
{
+ dTHR;
register SV *sv;
if (!old)
return Nullsv;
if (SvTYPE(old) == SVTYPEMASK) {
- warn("semi-panic: attempt to dup freed string");
+ if (ckWARN_d(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
return Nullsv;
}
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 1;
- SvFLAGS(sv) = 0;
if (SvTEMP(old)) {
SvTEMP_off(old);
sv_setsv(sv,old);
@@ -3816,7 +4826,7 @@ newSVsv(register SV *old)
}
void
-sv_reset(register char *s, HV *stash)
+Perl_sv_reset(pTHX_ register char *s, HV *stash)
{
register HE *entry;
register GV *gv;
@@ -3824,7 +4834,7 @@ sv_reset(register char *s, HV *stash)
register I32 i;
register PMOP *pm;
register I32 max;
- char todo[256];
+ char todo[PERL_UCHAR_MAX+1];
if (!stash)
return;
@@ -3843,18 +4853,18 @@ sv_reset(register char *s, HV *stash)
Zero(todo, 256, char);
while (*s) {
- i = *s;
+ i = (unsigned char)*s;
if (s[1] == '-') {
s += 2;
}
- max = *s++;
+ max = (unsigned char)*s++;
for ( ; i <= max; i++) {
todo[i] = 1;
}
for (i = 0; i <= (I32) HvMAX(stash); i++) {
for (entry = HvARRAY(stash)[i];
- entry;
- entry = HeNEXT(entry))
+ entry;
+ entry = HeNEXT(entry))
{
if (!todo[(U8)*HeKEY(entry)])
continue;
@@ -3862,7 +4872,7 @@ sv_reset(register char *s, HV *stash)
sv = GvSV(gv);
if (SvTHINKFIRST(sv)) {
if (!SvREADONLY(sv) && SvROK(sv))
- sv_unref(sv);
+ sv_unref(sv);
continue;
}
(void)SvOK_off(sv);
@@ -3888,7 +4898,7 @@ sv_reset(register char *s, HV *stash)
}
IO*
-sv_2io(SV *sv)
+Perl_sv_2io(pTHX_ SV *sv)
{
IO* io;
GV* gv;
@@ -3902,11 +4912,11 @@ sv_2io(SV *sv)
gv = (GV*)sv;
io = GvIO(gv);
if (!io)
- croak("Bad filehandle: %s", GvNAME(gv));
+ Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
break;
default:
if (!SvOK(sv))
- croak(no_usym, "filehandle");
+ Perl_croak(aTHX_ PL_no_usym, "filehandle");
if (SvROK(sv))
return sv_2io(SvRV(sv));
gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
@@ -3915,14 +4925,14 @@ sv_2io(SV *sv)
else
io = 0;
if (!io)
- croak("Bad filehandle: %s", SvPV(sv,n_a));
+ Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
break;
}
return io;
}
CV *
-sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
+Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
{
GV *gv;
CV *cv;
@@ -3949,6 +4959,10 @@ sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
if (SvGMAGICAL(sv))
mg_get(sv);
if (SvROK(sv)) {
+ dTHR;
+ SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
+ tryAMAGICunDEREF(to_cv);
+
sv = SvRV(sv);
if (SvTYPE(sv) == SVt_PVCV) {
cv = (CV*)sv;
@@ -3959,7 +4973,7 @@ sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
else if(isGV(sv))
gv = (GV*)sv;
else
- croak("Not a subroutine reference");
+ Perl_croak(aTHX_ "Not a subroutine reference");
}
else if (isGV(sv))
gv = (GV*)sv;
@@ -3975,20 +4989,23 @@ sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
ENTER;
tmpsv = NEWSV(704,0);
gv_efullname3(tmpsv, gv, Nullch);
+ /* XXX this is probably not what they think they're getting.
+ * It has the same effect as "sub name;", i.e. just a forward
+ * declaration! */
newSUB(start_subparse(FALSE, 0),
newSVOP(OP_CONST, 0, tmpsv),
Nullop,
Nullop);
LEAVE;
if (!GvCVu(gv))
- croak("Unable to create sub named \"%s\"", SvPV(sv,n_a));
+ Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
}
return GvCVu(gv);
}
}
I32
-sv_true(register SV *sv)
+Perl_sv_true(pTHX_ register SV *sv)
{
dTHR;
if (!sv)
@@ -3996,8 +5013,7 @@ sv_true(register SV *sv)
if (SvPOK(sv)) {
register XPV* tXpv;
if ((tXpv = (XPV*)SvANY(sv)) &&
- (*tXpv->xpv_pv > '0' ||
- tXpv->xpv_cur > 1 ||
+ (tXpv->xpv_cur > 1 ||
(tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
return 1;
else
@@ -4016,23 +5032,29 @@ sv_true(register SV *sv)
}
IV
-sv_iv(register SV *sv)
+Perl_sv_iv(pTHX_ register SV *sv)
{
- if (SvIOK(sv))
+ if (SvIOK(sv)) {
+ if (SvIsUV(sv))
+ return (IV)SvUVX(sv);
return SvIVX(sv);
+ }
return sv_2iv(sv);
}
UV
-sv_uv(register SV *sv)
+Perl_sv_uv(pTHX_ register SV *sv)
{
- if (SvIOK(sv))
- return SvUVX(sv);
+ if (SvIOK(sv)) {
+ if (SvIsUV(sv))
+ return SvUVX(sv);
+ return (UV)SvIVX(sv);
+ }
return sv_2uv(sv);
}
-double
-sv_nv(register SV *sv)
+NV
+Perl_sv_nv(pTHX_ register SV *sv)
{
if (SvNOK(sv))
return SvNVX(sv);
@@ -4040,7 +5062,18 @@ sv_nv(register SV *sv)
}
char *
-sv_pvn(SV *sv, STRLEN *lp)
+Perl_sv_pv(pTHX_ SV *sv)
+{
+ STRLEN n_a;
+
+ if (SvPOK(sv))
+ return SvPVX(sv);
+
+ return sv_2pv(sv, &n_a);
+}
+
+char *
+Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
{
if (SvPOK(sv)) {
*lp = SvCUR(sv);
@@ -4050,31 +5083,21 @@ sv_pvn(SV *sv, STRLEN *lp)
}
char *
-sv_pvn_force(SV *sv, STRLEN *lp)
+Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
{
char *s;
- if (SvREADONLY(sv)) {
- dTHR;
- if (PL_curcop != &PL_compiling)
- croak(no_modify);
- }
+ if (SvTHINKFIRST(sv) && !SvROK(sv))
+ sv_force_normal(sv);
if (SvPOK(sv)) {
*lp = SvCUR(sv);
}
else {
if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
- if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV) {
- sv_unglob(sv);
- s = SvPVX(sv);
- *lp = SvCUR(sv);
- }
- else {
- dTHR;
- croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
- op_name[PL_op->op_type]);
- }
+ dTHR;
+ Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
+ PL_op_name[PL_op->op_type]);
}
else
s = sv_2pv(sv, lp);
@@ -4092,15 +5115,54 @@ sv_pvn_force(SV *sv, STRLEN *lp)
if (!SvPOK(sv)) {
SvPOK_on(sv); /* validate pointer */
SvTAINT(sv);
- DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
- (unsigned long)sv,SvPVX(sv)));
+ DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
+ PTR2UV(sv),SvPVX(sv)));
}
}
return SvPVX(sv);
}
char *
-sv_reftype(SV *sv, int ob)
+Perl_sv_pvbyte(pTHX_ SV *sv)
+{
+ return sv_pv(sv);
+}
+
+char *
+Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
+{
+ return sv_pvn(sv,lp);
+}
+
+char *
+Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
+{
+ return sv_pvn_force(sv,lp);
+}
+
+char *
+Perl_sv_pvutf8(pTHX_ SV *sv)
+{
+ sv_utf8_upgrade(sv);
+ return sv_pv(sv);
+}
+
+char *
+Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
+{
+ sv_utf8_upgrade(sv);
+ return sv_pvn(sv,lp);
+}
+
+char *
+Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
+{
+ sv_utf8_upgrade(sv);
+ return sv_pvn_force(sv,lp);
+}
+
+char *
+Perl_sv_reftype(pTHX_ SV *sv, int ob)
{
if (ob && SvOBJECT(sv))
return HvNAME(SvSTASH(sv));
@@ -4125,13 +5187,24 @@ sv_reftype(SV *sv, int ob)
case SVt_PVCV: return "CODE";
case SVt_PVGV: return "GLOB";
case SVt_PVFM: return "FORMAT";
+ case SVt_PVIO: return "IO";
default: return "UNKNOWN";
}
}
}
+/*
+=for apidoc sv_isobject
+
+Returns a boolean indicating whether the SV is an RV pointing to a blessed
+object. If the SV is not an RV, or if the object is not blessed, then this
+will return false.
+
+=cut
+*/
+
int
-sv_isobject(SV *sv)
+Perl_sv_isobject(pTHX_ SV *sv)
{
if (!sv)
return 0;
@@ -4145,8 +5218,18 @@ sv_isobject(SV *sv)
return 1;
}
+/*
+=for apidoc sv_isa
+
+Returns a boolean indicating whether the SV is blessed into the specified
+class. This does not check for subtypes; use C<sv_derived_from> to verify
+an inheritance relationship.
+
+=cut
+*/
+
int
-sv_isa(SV *sv, char *name)
+Perl_sv_isa(pTHX_ SV *sv, const char *name)
{
if (!sv)
return 0;
@@ -4161,27 +5244,33 @@ sv_isa(SV *sv, char *name)
return strEQ(HvNAME(SvSTASH(sv)), name);
}
+/*
+=for apidoc newSVrv
+
+Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
+it will be upgraded to one. If C<classname> is non-null then the new SV will
+be blessed in the specified package. The new SV is returned and its
+reference count is 1.
+
+=cut
+*/
+
SV*
-newSVrv(SV *rv, char *classname)
+Perl_newSVrv(pTHX_ SV *rv, const char *classname)
{
dTHR;
SV *sv;
new_SV(sv);
- SvANY(sv) = 0;
- SvREFCNT(sv) = 0;
- SvFLAGS(sv) = 0;
SV_CHECK_THINKFIRST(rv);
-#ifdef OVERLOAD
SvAMAGIC_off(rv);
-#endif /* OVERLOAD */
if (SvTYPE(rv) < SVt_RV)
sv_upgrade(rv, SVt_RV);
(void)SvOK_off(rv);
- SvRV(rv) = SvREFCNT_inc(sv);
+ SvRV(rv) = sv;
SvROK_on(rv);
if (classname) {
@@ -4191,50 +5280,117 @@ newSVrv(SV *rv, char *classname)
return sv;
}
+/*
+=for apidoc sv_setref_pv
+
+Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
+into the SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
+will be returned and will have a reference count of 1.
+
+Do not use with other Perl types such as HV, AV, SV, CV, because those
+objects will become corrupted by the pointer copy process.
+
+Note that C<sv_setref_pvn> copies the string while this copies the pointer.
+
+=cut
+*/
+
SV*
-sv_setref_pv(SV *rv, char *classname, void *pv)
+Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
{
if (!pv) {
sv_setsv(rv, &PL_sv_undef);
SvSETMAGIC(rv);
}
else
- sv_setiv(newSVrv(rv,classname), (IV)pv);
+ sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
return rv;
}
+/*
+=for apidoc sv_setref_iv
+
+Copies an integer into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
+will be returned and will have a reference count of 1.
+
+=cut
+*/
+
SV*
-sv_setref_iv(SV *rv, char *classname, IV iv)
+Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
{
sv_setiv(newSVrv(rv,classname), iv);
return rv;
}
+/*
+=for apidoc sv_setref_nv
+
+Copies a double into a new SV, optionally blessing the SV. The C<rv>
+argument will be upgraded to an RV. That RV will be modified to point to
+the new SV. The C<classname> argument indicates the package for the
+blessing. Set C<classname> to C<Nullch> to avoid the blessing. The new SV
+will be returned and will have a reference count of 1.
+
+=cut
+*/
+
SV*
-sv_setref_nv(SV *rv, char *classname, double nv)
+Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
{
sv_setnv(newSVrv(rv,classname), nv);
return rv;
}
+/*
+=for apidoc sv_setref_pvn
+
+Copies a string into a new SV, optionally blessing the SV. The length of the
+string must be specified with C<n>. The C<rv> argument will be upgraded to
+an RV. That RV will be modified to point to the new SV. The C<classname>
+argument indicates the package for the blessing. Set C<classname> to
+C<Nullch> to avoid the blessing. The new SV will be returned and will have
+a reference count of 1.
+
+Note that C<sv_setref_pv> copies the pointer while this copies the string.
+
+=cut
+*/
+
SV*
-sv_setref_pvn(SV *rv, char *classname, char *pv, I32 n)
+Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
{
sv_setpvn(newSVrv(rv,classname), pv, n);
return rv;
}
+/*
+=for apidoc sv_bless
+
+Blesses an SV into a specified package. The SV must be an RV. The package
+must be designated by its stash (see C<gv_stashpv()>). The reference count
+of the SV is unaffected.
+
+=cut
+*/
+
SV*
-sv_bless(SV *sv, HV *stash)
+Perl_sv_bless(pTHX_ SV *sv, HV *stash)
{
dTHR;
SV *tmpRef;
if (!SvROK(sv))
- croak("Can't bless non-reference value");
+ Perl_croak(aTHX_ "Can't bless non-reference value");
tmpRef = SvRV(sv);
if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
if (SvREADONLY(tmpRef))
- croak(no_modify);
+ Perl_croak(aTHX_ PL_no_modify);
if (SvOBJECT(tmpRef)) {
if (SvTYPE(tmpRef) != SVt_PVIO)
--PL_sv_objcount;
@@ -4247,19 +5403,19 @@ sv_bless(SV *sv, HV *stash)
(void)SvUPGRADE(tmpRef, SVt_PVMG);
SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
-#ifdef OVERLOAD
if (Gv_AMG(stash))
SvAMAGIC_on(sv);
else
SvAMAGIC_off(sv);
-#endif /* OVERLOAD */
return sv;
}
STATIC void
-sv_unglob(SV *sv)
+S_sv_unglob(pTHX_ SV *sv)
{
+ void *xpvmg;
+
assert(SvTYPE(sv) == SVt_PVGV);
SvFAKE_off(sv);
if (GvGP(sv))
@@ -4271,15 +5427,38 @@ sv_unglob(SV *sv)
sv_unmagic(sv, '*');
Safefree(GvNAME(sv));
GvMULTI_off(sv);
+
+ /* need to keep SvANY(sv) in the right arena */
+ xpvmg = new_XPVMG();
+ StructCopy(SvANY(sv), xpvmg, XPVMG);
+ del_XPVGV(SvANY(sv));
+ SvANY(sv) = xpvmg;
+
SvFLAGS(sv) &= ~SVTYPEMASK;
SvFLAGS(sv) |= SVt_PVMG;
}
+/*
+=for apidoc sv_unref
+
+Unsets the RV status of the SV, and decrements the reference count of
+whatever was being referenced by the RV. This can almost be thought of
+as a reversal of C<newSVrv>. See C<SvROK_off>.
+
+=cut
+*/
+
void
-sv_unref(SV *sv)
+Perl_sv_unref(pTHX_ SV *sv)
{
SV* rv = SvRV(sv);
-
+
+ if (SvWEAKREF(sv)) {
+ sv_del_backref(sv);
+ SvWEAKREF_off(sv);
+ SvRV(sv) = 0;
+ return;
+ }
SvRV(sv) = 0;
SvROK_off(sv);
if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
@@ -4289,13 +5468,13 @@ sv_unref(SV *sv)
}
void
-sv_taint(SV *sv)
+Perl_sv_taint(pTHX_ SV *sv)
{
sv_magic((sv), Nullsv, 't', Nullch, 0);
}
void
-sv_untaint(SV *sv)
+Perl_sv_untaint(pTHX_ SV *sv)
{
if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
MAGIC *mg = mg_find(sv, 't');
@@ -4305,105 +5484,227 @@ sv_untaint(SV *sv)
}
bool
-sv_tainted(SV *sv)
+Perl_sv_tainted(pTHX_ SV *sv)
{
if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
MAGIC *mg = mg_find(sv, 't');
- if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
+ if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
return TRUE;
}
return FALSE;
}
+/*
+=for apidoc sv_setpviv
+
+Copies an integer into the given SV, also updating its string value.
+Does not handle 'set' magic. See C<sv_setpviv_mg>.
+
+=cut
+*/
+
void
-sv_setpviv(SV *sv, IV iv)
+Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
{
- STRLEN len;
- char buf[TYPE_DIGITS(UV)];
- char *ptr = buf + sizeof(buf);
- int sign;
- UV uv;
- char *p;
+ char buf[TYPE_CHARS(UV)];
+ char *ebuf;
+ char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
- sv_setpvn(sv, "", 0);
- if (iv >= 0) {
- uv = iv;
- sign = 0;
- } else {
- uv = -iv;
- sign = 1;
- }
- do {
- *--ptr = '0' + (uv % 10);
- } while (uv /= 10);
- len = (buf + sizeof(buf)) - ptr;
- /* taking advantage of SvCUR(sv) == 0 */
- SvGROW(sv, sign + len + 1);
- p = SvPVX(sv);
- if (sign)
- *p++ = '-';
- memcpy(p, ptr, len);
- p += len;
- *p = '\0';
- SvCUR(sv) = p - SvPVX(sv);
+ sv_setpvn(sv, ptr, ebuf - ptr);
}
+/*
+=for apidoc sv_setpviv_mg
+
+Like C<sv_setpviv>, but also handles 'set' magic.
+
+=cut
+*/
+
void
-sv_setpviv_mg(SV *sv, IV iv)
+Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
{
- sv_setpviv(sv,iv);
+ char buf[TYPE_CHARS(UV)];
+ char *ebuf;
+ char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
+
+ sv_setpvn(sv, ptr, ebuf - ptr);
SvSETMAGIC(sv);
}
+#if defined(PERL_IMPLICIT_CONTEXT)
+void
+Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvf(sv, pat, &args);
+ va_end(args);
+}
+
+
+void
+Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vsetpvf_mg(sv, pat, &args);
+ va_end(args);
+}
+#endif
+
+/*
+=for apidoc sv_setpvf
+
+Processes its arguments like C<sprintf> and sets an SV to the formatted
+output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
+
+=cut
+*/
+
void
-sv_setpvf(SV *sv, const char* pat, ...)
+Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
{
va_list args;
va_start(args, pat);
- sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ sv_vsetpvf(sv, pat, &args);
va_end(args);
}
+void
+Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
+{
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+}
+
+/*
+=for apidoc sv_setpvf_mg
+
+Like C<sv_setpvf>, but also handles 'set' magic.
+
+=cut
+*/
void
-sv_setpvf_mg(SV *sv, const char* pat, ...)
+Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
{
va_list args;
va_start(args, pat);
- sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ sv_vsetpvf_mg(sv, pat, &args);
va_end(args);
+}
+
+void
+Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
+{
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
SvSETMAGIC(sv);
}
+#if defined(PERL_IMPLICIT_CONTEXT)
+void
+Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvf(sv, pat, &args);
+ va_end(args);
+}
+
+void
+Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ sv_vcatpvf_mg(sv, pat, &args);
+ va_end(args);
+}
+#endif
+
+/*
+=for apidoc sv_catpvf
+
+Processes its arguments like C<sprintf> and appends the formatted output
+to an SV. Handles 'get' magic, but not 'set' magic. C<SvSETMAGIC()> must
+typically be called after calling this function to handle 'set' magic.
+
+=cut
+*/
+
void
-sv_catpvf(SV *sv, const char* pat, ...)
+Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
{
va_list args;
va_start(args, pat);
- sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ sv_vcatpvf(sv, pat, &args);
va_end(args);
}
void
-sv_catpvf_mg(SV *sv, const char* pat, ...)
+Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
+{
+ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+}
+
+/*
+=for apidoc sv_catpvf_mg
+
+Like C<sv_catpvf>, but also handles 'set' magic.
+
+=cut
+*/
+
+void
+Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
{
va_list args;
va_start(args, pat);
- sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ sv_vcatpvf_mg(sv, pat, &args);
va_end(args);
+}
+
+void
+Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
+{
+ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
SvSETMAGIC(sv);
}
+/*
+=for apidoc sv_vsetpvfn
+
+Works like C<vcatpvfn> but copies the text into the SV instead of
+appending it.
+
+=cut
+*/
+
void
-sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
+Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
{
sv_setpvn(sv, "", 0);
- sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
+ sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
}
+/*
+=for apidoc sv_vcatpvfn
+
+Processes its arguments like C<vsprintf> and appends the formatted output
+to an SV. Uses an array of SVs if the C style variable argument list is
+missing (NULL). When running with taint checks enabled, indicates via
+C<maybe_tainted> if results are untrustworthy (often due to the use of
+locales).
+
+=cut
+*/
+
void
-sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
+Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
{
dTHR;
char *p;
@@ -4412,6 +5713,7 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
STRLEN origlen;
I32 svix = 0;
static char nullstr[] = "(null)";
+ SV *argsv;
/* no matter what, this is a string now */
(void)SvPV_force(sv, origlen);
@@ -4426,12 +5728,18 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
char *s = va_arg(*args, char*);
sv_catpv(sv, s ? s : nullstr);
}
- else if (svix < svmax)
+ else if (svix < svmax) {
sv_catsv(sv, *svargs);
+ if (DO_UTF8(*svargs))
+ SvUTF8_on(sv);
+ }
return;
case '_':
if (args) {
- sv_catsv(sv, va_arg(*args, SV*));
+ argsv = va_arg(*args, SV*);
+ sv_catsv(sv, argsv);
+ if (DO_UTF8(argsv))
+ SvUTF8_on(sv);
return;
}
/* See comment on '_' below */
@@ -4443,6 +5751,8 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
for (p = (char*)pat; p < patend; p = q) {
bool alt = FALSE;
bool left = FALSE;
+ bool vectorize = FALSE;
+ bool utf = FALSE;
char fill = ' ';
char plus = 0;
char intsize = 0;
@@ -4450,28 +5760,35 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
STRLEN zeros = 0;
bool has_precis = FALSE;
STRLEN precis = 0;
+ bool is_utf = FALSE;
char esignbuf[4];
+ U8 utf8buf[UTF8_MAXLEN];
STRLEN esignlen = 0;
char *eptr = Nullch;
STRLEN elen = 0;
- char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
-
-#ifndef PERL_OBJECT
- static char *efloatbuf = Nullch;
- static STRLEN efloatsize = 0;
-#endif
-
+ /* Times 4: a decimal digit takes more than 3 binary digits.
+ * NV_DIG: mantissa takes than many decimal digits.
+ * Plus 32: Playing safe. */
+ char ebuf[IV_DIG * 4 + NV_DIG + 32];
+ /* large enough for "%#.#f" --chip */
+ /* what about long double NVs? --jhi */
+
+ SV *vecsv;
+ U8 *vecstr = Null(U8*);
+ STRLEN veclen = 0;
char c;
int i;
unsigned base;
IV iv;
UV uv;
- double nv;
+ NV nv;
STRLEN have;
STRLEN need;
STRLEN gap;
+ char *dotstr = ".";
+ STRLEN dotstrlen = 1;
for (q = p; q < patend && *q != '%'; ++q) ;
if (q > p) {
@@ -4504,6 +5821,37 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
q++;
continue;
+ case '*': /* printf("%*vX",":",$ipv6addr) */
+ if (q[1] != 'v')
+ break;
+ q++;
+ if (args)
+ vecsv = va_arg(*args, SV*);
+ else if (svix < svmax)
+ vecsv = svargs[svix++];
+ else
+ continue;
+ dotstr = SvPVx(vecsv,dotstrlen);
+ if (DO_UTF8(vecsv))
+ is_utf = TRUE;
+ /* FALL THROUGH */
+
+ case 'v':
+ vectorize = TRUE;
+ q++;
+ if (args)
+ vecsv = va_arg(*args, SV*);
+ else if (svix < svmax)
+ vecsv = svargs[svix++];
+ else {
+ vecstr = (U8*)"";
+ veclen = 0;
+ continue;
+ }
+ vecstr = (U8*)SvPVx(vecsv,veclen);
+ utf = DO_UTF8(vecsv);
+ continue;
+
default:
break;
}
@@ -4555,16 +5903,24 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
/* SIZE */
switch (*q) {
+#ifdef HAS_QUAD
+ case 'L': /* Ld */
+ case 'q': /* qd */
+ intsize = 'q';
+ q++;
+ break;
+#endif
case 'l':
-#if 0 /* when quads have better support within Perl */
- if (*(q + 1) == 'l') {
+#ifdef HAS_QUAD
+ if (*(q + 1) == 'l') { /* lld */
intsize = 'q';
q += 2;
break;
- }
+ }
#endif
/* FALL THROUGH */
case 'h':
+ /* FALL THROUGH */
case 'V':
intsize = *q++;
break;
@@ -4583,25 +5939,52 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
case 'c':
if (args)
- c = va_arg(*args, int);
+ uv = va_arg(*args, int);
else
- c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
- eptr = &c;
- elen = 1;
+ uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
+ if ((uv > 255 || (uv > 127 && SvUTF8(sv))) && !IN_BYTE) {
+ eptr = (char*)utf8buf;
+ elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
+ is_utf = TRUE;
+ }
+ else {
+ c = (char)uv;
+ eptr = &c;
+ elen = 1;
+ }
goto string;
case 's':
if (args) {
eptr = va_arg(*args, char*);
if (eptr)
+#ifdef MACOS_TRADITIONAL
+ /* On MacOS, %#s format is used for Pascal strings */
+ if (alt)
+ elen = *eptr++;
+ else
+#endif
elen = strlen(eptr);
else {
eptr = nullstr;
elen = sizeof nullstr - 1;
}
}
- else if (svix < svmax)
- eptr = SvPVx(svargs[svix++], elen);
+ else if (svix < svmax) {
+ argsv = svargs[svix++];
+ eptr = SvPVx(argsv, elen);
+ if (DO_UTF8(argsv)) {
+ if (has_precis && precis < elen) {
+ I32 p = precis;
+ sv_pos_u2b(argsv, &p, 0); /* sticks at end */
+ precis = p;
+ }
+ if (width) { /* fudge width (can't fudge elen) */
+ width += elen - sv_len_utf8(argsv);
+ }
+ is_utf = TRUE;
+ }
+ }
goto string;
case '_':
@@ -4612,9 +5995,13 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
*/
if (!args)
goto unknown;
- eptr = SvPVx(va_arg(*args, SV*), elen);
+ argsv = va_arg(*args,SV*);
+ eptr = SvPVx(argsv, elen);
+ if (DO_UTF8(argsv))
+ is_utf = TRUE;
string:
+ vectorize = FALSE;
if (has_precis && elen > precis)
elen = precis;
break;
@@ -4623,23 +6010,45 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
case 'p':
if (args)
- uv = (UV)va_arg(*args, void*);
+ uv = PTR2UV(va_arg(*args, void*));
else
- uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
+ uv = (svix < svmax) ? PTR2UV(svargs[svix++]) : 0;
base = 16;
goto integer;
case 'D':
+#ifdef IV_IS_QUAD
+ intsize = 'q';
+#else
intsize = 'l';
+#endif
/* FALL THROUGH */
case 'd':
case 'i':
- if (args) {
+ if (vectorize) {
+ I32 ulen;
+ if (!veclen) {
+ vectorize = FALSE;
+ break;
+ }
+ if (utf)
+ iv = (IV)utf8_to_uv(vecstr, &ulen);
+ else {
+ iv = *vecstr;
+ ulen = 1;
+ }
+ vecstr += ulen;
+ veclen -= ulen;
+ }
+ else if (args) {
switch (intsize) {
case 'h': iv = (short)va_arg(*args, int); break;
default: iv = va_arg(*args, int); break;
case 'l': iv = va_arg(*args, long); break;
case 'V': iv = va_arg(*args, IV); break;
+#ifdef HAS_QUAD
+ case 'q': iv = va_arg(*args, Quad_t); break;
+#endif
}
}
else {
@@ -4649,6 +6058,9 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
default: iv = (int)iv; break;
case 'l': iv = (long)iv; break;
case 'V': break;
+#ifdef HAS_QUAD
+ case 'q': iv = (Quad_t)iv; break;
+#endif
}
}
if (iv >= 0) {
@@ -4664,14 +6076,26 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
goto integer;
case 'U':
+#ifdef IV_IS_QUAD
+ intsize = 'q';
+#else
intsize = 'l';
+#endif
/* FALL THROUGH */
case 'u':
base = 10;
goto uns_integer;
+ case 'b':
+ base = 2;
+ goto uns_integer;
+
case 'O':
+#ifdef IV_IS_QUAD
+ intsize = 'q';
+#else
intsize = 'l';
+#endif
/* FALL THROUGH */
case 'o':
base = 8;
@@ -4682,12 +6106,31 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
base = 16;
uns_integer:
- if (args) {
+ if (vectorize) {
+ I32 ulen;
+ vector:
+ if (!veclen) {
+ vectorize = FALSE;
+ break;
+ }
+ if (utf)
+ uv = utf8_to_uv(vecstr, &ulen);
+ else {
+ uv = *vecstr;
+ ulen = 1;
+ }
+ vecstr += ulen;
+ veclen -= ulen;
+ }
+ else if (args) {
switch (intsize) {
case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
default: uv = va_arg(*args, unsigned); break;
case 'l': uv = va_arg(*args, unsigned long); break;
case 'V': uv = va_arg(*args, UV); break;
+#ifdef HAS_QUAD
+ case 'q': uv = va_arg(*args, Quad_t); break;
+#endif
}
}
else {
@@ -4697,6 +6140,9 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
default: uv = (unsigned)uv; break;
case 'l': uv = (unsigned long)uv; break;
case 'V': break;
+#ifdef HAS_QUAD
+ case 'q': uv = (Quad_t)uv; break;
+#endif
}
}
@@ -4707,7 +6153,8 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
case 16:
if (!uv)
alt = FALSE;
- p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
+ p = (char*)((c == 'X')
+ ? "0123456789ABCDEF" : "0123456789abcdef");
do {
dig = uv & 15;
*--eptr = p[dig];
@@ -4725,7 +6172,30 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
if (alt && *eptr != '0')
*--eptr = '0';
break;
+ case 2:
+ do {
+ dig = uv & 1;
+ *--eptr = '0' + dig;
+ } while (uv >>= 1);
+ if (alt) {
+ esignbuf[esignlen++] = '0';
+ esignbuf[esignlen++] = 'b';
+ }
+ break;
default: /* it had better be ten or less */
+#if defined(PERL_Y2KWARN)
+ if (ckWARN(WARN_Y2K)) {
+ STRLEN n;
+ char *s = SvPV(sv,n);
+ if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
+ && (n == 2 || !isDIGIT(s[n-3])))
+ {
+ Perl_warner(aTHX_ WARN_Y2K,
+ "Possible Y2K bug: %%%c %s",
+ c, "format string following '19'");
+ }
+ }
+#endif
do {
dig = uv % base;
*--eptr = '0' + dig;
@@ -4752,17 +6222,18 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
/* This is evil, but floating point is even more evil */
+ vectorize = FALSE;
if (args)
- nv = va_arg(*args, double);
+ nv = va_arg(*args, NV);
else
nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
need = 0;
if (c != 'e' && c != 'E') {
i = PERL_INT_MIN;
- (void)frexp(nv, &i);
+ (void)Perl_frexp(nv, &i);
if (i == PERL_INT_MIN)
- die("panic: frexp");
+ Perl_die(aTHX_ "panic: frexp");
if (i > 0)
need = BIT_DIGITS(i);
}
@@ -4771,15 +6242,23 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
need = width;
need += 20; /* fudge factor */
- if (efloatsize < need) {
- Safefree(efloatbuf);
- efloatsize = need + 20; /* more fudge */
- New(906, efloatbuf, efloatsize, char);
+ if (PL_efloatsize < need) {
+ Safefree(PL_efloatbuf);
+ PL_efloatsize = need + 20; /* more fudge */
+ New(906, PL_efloatbuf, PL_efloatsize, char);
+ PL_efloatbuf[0] = '\0';
}
eptr = ebuf + sizeof ebuf;
*--eptr = '\0';
*--eptr = c;
+#ifdef USE_LONG_DOUBLE
+ {
+ static char const my_prifldbl[] = PERL_PRIfldbl;
+ char const *p = my_prifldbl + sizeof my_prifldbl - 3;
+ while (p >= my_prifldbl) { *--eptr = *p--; }
+ }
+#endif
if (has_precis) {
base = precis;
do { *--eptr = '0' + (base % 10); } while (base /= 10);
@@ -4799,26 +6278,20 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
*--eptr = '#';
*--eptr = '%';
- (void)sprintf(efloatbuf, eptr, nv);
-
- eptr = efloatbuf;
- elen = strlen(efloatbuf);
-
-#ifdef LC_NUMERIC
- /*
- * User-defined locales may include arbitrary characters.
- * And, unfortunately, some system may alloc the "C" locale
- * to be overridden by a malicious user.
- */
- if (used_locale)
- *used_locale = TRUE;
-#endif /* LC_NUMERIC */
+ {
+ RESTORE_NUMERIC_STANDARD();
+ (void)sprintf(PL_efloatbuf, eptr, nv);
+ RESTORE_NUMERIC_LOCAL();
+ }
+ eptr = PL_efloatbuf;
+ elen = strlen(PL_efloatbuf);
break;
/* SPECIAL */
case 'n':
+ vectorize = FALSE;
i = SvCUR(sv) - origlen;
if (args) {
switch (intsize) {
@@ -4826,6 +6299,9 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
default: *(va_arg(*args, int*)) = i; break;
case 'l': *(va_arg(*args, long*)) = i; break;
case 'V': *(va_arg(*args, IV*)) = i; break;
+#ifdef HAS_QUAD
+ case 'q': *(va_arg(*args, Quad_t*)) = i; break;
+#endif
}
}
else if (svix < svmax)
@@ -4836,17 +6312,23 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
default:
unknown:
- if (!args && PL_dowarn &&
+ vectorize = FALSE;
+ if (!args && ckWARN(WARN_PRINTF) &&
(PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
SV *msg = sv_newmortal();
- sv_setpvf(msg, "Invalid conversion in %s: ",
+ Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
(PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
- if (c)
- sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
- c & 0xFF);
- else
+ if (c) {
+ if (isPRINT(c))
+ Perl_sv_catpvf(aTHX_ msg,
+ "\"%%%c\"", c & 0xFF);
+ else
+ Perl_sv_catpvf(aTHX_ msg,
+ "\"%%\\%03"UVof"\"",
+ (UV)c & 0xFF);
+ } else
sv_catpv(msg, "end of string");
- warn("%_", msg); /* yes, this is reentrant */
+ Perl_warner(aTHX_ WARN_PRINTF, "%"SVf, msg); /* yes, this is reentrant */
}
/* output mangled stuff ... */
@@ -4869,7 +6351,7 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
need = (have > width ? have : width);
gap = need - have;
- SvGROW(sv, SvCUR(sv) + need + 1);
+ SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
p = SvEND(sv);
if (esignlen && fill == '0') {
for (i = 0; i < esignlen; i++)
@@ -4895,279 +6377,1675 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
memset(p, ' ', gap);
p += gap;
}
+ if (vectorize) {
+ if (veclen) {
+ memcpy(p, dotstr, dotstrlen);
+ p += dotstrlen;
+ }
+ else
+ vectorize = FALSE; /* done iterating over vecstr */
+ }
+ if (is_utf)
+ SvUTF8_on(sv);
*p = '\0';
SvCUR(sv) = p - SvPVX(sv);
+ if (vectorize) {
+ esignlen = 0;
+ goto vector;
+ }
}
}
-void
-sv_dump(SV *sv)
+#if defined(USE_ITHREADS)
+
+#if defined(USE_THREADS)
+# include "error: USE_THREADS and USE_ITHREADS are incompatible"
+#endif
+
+#ifndef GpREFCNT_inc
+# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
+#endif
+
+
+#define sv_dup_inc(s) SvREFCNT_inc(sv_dup(s))
+#define av_dup(s) (AV*)sv_dup((SV*)s)
+#define av_dup_inc(s) (AV*)SvREFCNT_inc(sv_dup((SV*)s))
+#define hv_dup(s) (HV*)sv_dup((SV*)s)
+#define hv_dup_inc(s) (HV*)SvREFCNT_inc(sv_dup((SV*)s))
+#define cv_dup(s) (CV*)sv_dup((SV*)s)
+#define cv_dup_inc(s) (CV*)SvREFCNT_inc(sv_dup((SV*)s))
+#define io_dup(s) (IO*)sv_dup((SV*)s)
+#define io_dup_inc(s) (IO*)SvREFCNT_inc(sv_dup((SV*)s))
+#define gv_dup(s) (GV*)sv_dup((SV*)s)
+#define gv_dup_inc(s) (GV*)SvREFCNT_inc(sv_dup((SV*)s))
+#define SAVEPV(p) (p ? savepv(p) : Nullch)
+#define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
+
+REGEXP *
+Perl_re_dup(pTHX_ REGEXP *r)
{
-#ifdef DEBUGGING
- SV *d = sv_newmortal();
- char *s;
- U32 flags;
- U32 type;
+ /* XXX fix when pmop->op_pmregexp becomes shared */
+ return ReREFCNT_inc(r);
+}
- if (!sv) {
- PerlIO_printf(Perl_debug_log, "SV = 0\n");
- return;
+PerlIO *
+Perl_fp_dup(pTHX_ PerlIO *fp, char type)
+{
+ PerlIO *ret;
+ if (!fp)
+ return (PerlIO*)NULL;
+
+ /* look for it in the table first */
+ ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
+ if (ret)
+ return ret;
+
+ /* create anew and remember what it is */
+ ret = PerlIO_fdupopen(fp);
+ ptr_table_store(PL_ptr_table, fp, ret);
+ return ret;
+}
+
+DIR *
+Perl_dirp_dup(pTHX_ DIR *dp)
+{
+ if (!dp)
+ return (DIR*)NULL;
+ /* XXX TODO */
+ return dp;
+}
+
+GP *
+Perl_gp_dup(pTHX_ GP *gp)
+{
+ GP *ret;
+ if (!gp)
+ return (GP*)NULL;
+ /* look for it in the table first */
+ ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
+ if (ret)
+ return ret;
+
+ /* create anew and remember what it is */
+ Newz(0, ret, 1, GP);
+ ptr_table_store(PL_ptr_table, gp, ret);
+
+ /* clone */
+ ret->gp_refcnt = 0; /* must be before any other dups! */
+ ret->gp_sv = sv_dup_inc(gp->gp_sv);
+ ret->gp_io = io_dup_inc(gp->gp_io);
+ ret->gp_form = cv_dup_inc(gp->gp_form);
+ ret->gp_av = av_dup_inc(gp->gp_av);
+ ret->gp_hv = hv_dup_inc(gp->gp_hv);
+ ret->gp_egv = gv_dup(gp->gp_egv); /* GvEGV is not refcounted */
+ ret->gp_cv = cv_dup_inc(gp->gp_cv);
+ ret->gp_cvgen = gp->gp_cvgen;
+ ret->gp_flags = gp->gp_flags;
+ ret->gp_line = gp->gp_line;
+ ret->gp_file = gp->gp_file; /* points to COP.cop_file */
+ return ret;
+}
+
+MAGIC *
+Perl_mg_dup(pTHX_ MAGIC *mg)
+{
+ MAGIC *mgret = (MAGIC*)NULL;
+ MAGIC *mgprev;
+ if (!mg)
+ return (MAGIC*)NULL;
+ /* look for it in the table first */
+ mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
+ if (mgret)
+ return mgret;
+
+ for (; mg; mg = mg->mg_moremagic) {
+ MAGIC *nmg;
+ Newz(0, nmg, 1, MAGIC);
+ if (!mgret)
+ mgret = nmg;
+ else
+ mgprev->mg_moremagic = nmg;
+ nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
+ nmg->mg_private = mg->mg_private;
+ nmg->mg_type = mg->mg_type;
+ nmg->mg_flags = mg->mg_flags;
+ if (mg->mg_type == 'r') {
+ nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj);
+ }
+ else {
+ nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
+ ? sv_dup_inc(mg->mg_obj)
+ : sv_dup(mg->mg_obj);
+ }
+ nmg->mg_len = mg->mg_len;
+ nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
+ if (mg->mg_ptr && mg->mg_type != 'g') {
+ if (mg->mg_len >= 0) {
+ nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
+ if (mg->mg_type == 'c' && AMT_AMAGIC((AMT*)mg->mg_ptr)) {
+ AMT *amtp = (AMT*)mg->mg_ptr;
+ AMT *namtp = (AMT*)nmg->mg_ptr;
+ I32 i;
+ for (i = 1; i < NofAMmeth; i++) {
+ namtp->table[i] = cv_dup_inc(amtp->table[i]);
+ }
+ }
+ }
+ else if (mg->mg_len == HEf_SVKEY)
+ nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr);
+ }
+ mgprev = nmg;
}
-
- flags = SvFLAGS(sv);
- type = SvTYPE(sv);
-
- sv_setpvf(d, "(0x%lx)\n REFCNT = %ld\n FLAGS = (",
- (unsigned long)SvANY(sv), (long)SvREFCNT(sv));
- if (flags & SVs_PADBUSY) sv_catpv(d, "PADBUSY,");
- if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
- if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
- if (flags & SVs_TEMP) sv_catpv(d, "TEMP,");
- if (flags & SVs_OBJECT) sv_catpv(d, "OBJECT,");
- if (flags & SVs_GMG) sv_catpv(d, "GMG,");
- if (flags & SVs_SMG) sv_catpv(d, "SMG,");
- if (flags & SVs_RMG) sv_catpv(d, "RMG,");
-
- if (flags & SVf_IOK) sv_catpv(d, "IOK,");
- if (flags & SVf_NOK) sv_catpv(d, "NOK,");
- if (flags & SVf_POK) sv_catpv(d, "POK,");
- if (flags & SVf_ROK) sv_catpv(d, "ROK,");
- if (flags & SVf_OOK) sv_catpv(d, "OOK,");
- if (flags & SVf_FAKE) sv_catpv(d, "FAKE,");
- if (flags & SVf_READONLY) sv_catpv(d, "READONLY,");
-
-#ifdef OVERLOAD
- if (flags & SVf_AMAGIC) sv_catpv(d, "OVERLOAD,");
-#endif /* OVERLOAD */
- if (flags & SVp_IOK) sv_catpv(d, "pIOK,");
- if (flags & SVp_NOK) sv_catpv(d, "pNOK,");
- if (flags & SVp_POK) sv_catpv(d, "pPOK,");
- if (flags & SVp_SCREAM) sv_catpv(d, "SCREAM,");
-
- switch (type) {
- case SVt_PVCV:
- case SVt_PVFM:
- if (CvANON(sv)) sv_catpv(d, "ANON,");
- if (CvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
- if (CvCLONE(sv)) sv_catpv(d, "CLONE,");
- if (CvCLONED(sv)) sv_catpv(d, "CLONED,");
- if (CvNODEBUG(sv)) sv_catpv(d, "NODEBUG,");
- break;
- case SVt_PVHV:
- if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,");
- if (HvLAZYDEL(sv)) sv_catpv(d, "LAZYDEL,");
- break;
- case SVt_PVGV:
- if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
- if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
- if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
- if (GvIMPORTED(sv)) {
- sv_catpv(d, "IMPORT");
- if (GvIMPORTED(sv) == GVf_IMPORTED)
- sv_catpv(d, "ALL,");
- else {
- sv_catpv(d, "(");
- if (GvIMPORTED_SV(sv)) sv_catpv(d, " SV");
- if (GvIMPORTED_AV(sv)) sv_catpv(d, " AV");
- if (GvIMPORTED_HV(sv)) sv_catpv(d, " HV");
- if (GvIMPORTED_CV(sv)) sv_catpv(d, " CV");
- sv_catpv(d, " ),");
+ return mgret;
+}
+
+PTR_TBL_t *
+Perl_ptr_table_new(pTHX)
+{
+ PTR_TBL_t *tbl;
+ Newz(0, tbl, 1, PTR_TBL_t);
+ tbl->tbl_max = 511;
+ tbl->tbl_items = 0;
+ Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
+ return tbl;
+}
+
+void *
+Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
+{
+ PTR_TBL_ENT_t *tblent;
+ UV hash = PTR2UV(sv);
+ assert(tbl);
+ tblent = tbl->tbl_ary[hash & tbl->tbl_max];
+ for (; tblent; tblent = tblent->next) {
+ if (tblent->oldval == sv)
+ return tblent->newval;
+ }
+ return (void*)NULL;
+}
+
+void
+Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
+{
+ PTR_TBL_ENT_t *tblent, **otblent;
+ /* XXX this may be pessimal on platforms where pointers aren't good
+ * hash values e.g. if they grow faster in the most significant
+ * bits */
+ UV hash = PTR2UV(oldv);
+ bool i = 1;
+
+ assert(tbl);
+ otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
+ for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
+ if (tblent->oldval == oldv) {
+ tblent->newval = newv;
+ tbl->tbl_items++;
+ return;
+ }
+ }
+ Newz(0, tblent, 1, PTR_TBL_ENT_t);
+ tblent->oldval = oldv;
+ tblent->newval = newv;
+ tblent->next = *otblent;
+ *otblent = tblent;
+ tbl->tbl_items++;
+ if (i && tbl->tbl_items > tbl->tbl_max)
+ ptr_table_split(tbl);
+}
+
+void
+Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
+{
+ PTR_TBL_ENT_t **ary = tbl->tbl_ary;
+ UV oldsize = tbl->tbl_max + 1;
+ UV newsize = oldsize * 2;
+ UV i;
+
+ Renew(ary, newsize, PTR_TBL_ENT_t*);
+ Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
+ tbl->tbl_max = --newsize;
+ tbl->tbl_ary = ary;
+ for (i=0; i < oldsize; i++, ary++) {
+ PTR_TBL_ENT_t **curentp, **entp, *ent;
+ if (!*ary)
+ continue;
+ curentp = ary + oldsize;
+ for (entp = ary, ent = *ary; ent; ent = *entp) {
+ if ((newsize & PTR2UV(ent->oldval)) != i) {
+ *entp = ent->next;
+ ent->next = *curentp;
+ *curentp = ent;
+ continue;
}
+ else
+ entp = &ent->next;
}
- case SVt_PVBM:
- if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
- if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
- break;
}
+}
- if (*(SvEND(d) - 1) == ',')
- SvPVX(d)[--SvCUR(d)] = '\0';
- sv_catpv(d, ")");
- s = SvPVX(d);
+#ifdef DEBUGGING
+char *PL_watch_pvx;
+#endif
+
+SV *
+Perl_sv_dup(pTHX_ SV *sstr)
+{
+ SV *dstr;
+
+ if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
+ return Nullsv;
+ /* look for it in the table first */
+ dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
+ if (dstr)
+ return dstr;
+
+ /* create anew and remember what it is */
+ new_SV(dstr);
+ ptr_table_store(PL_ptr_table, sstr, dstr);
+
+ /* clone */
+ SvFLAGS(dstr) = SvFLAGS(sstr);
+ SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
+ SvREFCNT(dstr) = 0; /* must be before any other dups! */
+
+#ifdef DEBUGGING
+ if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
+ PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
+ PL_watch_pvx, SvPVX(sstr));
+#endif
- PerlIO_printf(Perl_debug_log, "SV = ");
- switch (type) {
+ switch (SvTYPE(sstr)) {
case SVt_NULL:
- PerlIO_printf(Perl_debug_log, "NULL%s\n", s);
- return;
+ SvANY(dstr) = NULL;
+ break;
case SVt_IV:
- PerlIO_printf(Perl_debug_log, "IV%s\n", s);
+ SvANY(dstr) = new_XIV();
+ SvIVX(dstr) = SvIVX(sstr);
break;
case SVt_NV:
- PerlIO_printf(Perl_debug_log, "NV%s\n", s);
+ SvANY(dstr) = new_XNV();
+ SvNVX(dstr) = SvNVX(sstr);
break;
case SVt_RV:
- PerlIO_printf(Perl_debug_log, "RV%s\n", s);
+ SvANY(dstr) = new_XRV();
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
break;
case SVt_PV:
- PerlIO_printf(Perl_debug_log, "PV%s\n", s);
+ SvANY(dstr) = new_XPV();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
break;
case SVt_PVIV:
- PerlIO_printf(Perl_debug_log, "PVIV%s\n", s);
+ SvANY(dstr) = new_XPVIV();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
break;
case SVt_PVNV:
- PerlIO_printf(Perl_debug_log, "PVNV%s\n", s);
- break;
- case SVt_PVBM:
- PerlIO_printf(Perl_debug_log, "PVBM%s\n", s);
+ SvANY(dstr) = new_XPVNV();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
break;
case SVt_PVMG:
- PerlIO_printf(Perl_debug_log, "PVMG%s\n", s);
+ SvANY(dstr) = new_XPVMG();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
+ break;
+ case SVt_PVBM:
+ SvANY(dstr) = new_XPVBM();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
+ BmRARE(dstr) = BmRARE(sstr);
+ BmUSEFUL(dstr) = BmUSEFUL(sstr);
+ BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
break;
case SVt_PVLV:
- PerlIO_printf(Perl_debug_log, "PVLV%s\n", s);
+ SvANY(dstr) = new_XPVLV();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
+ LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
+ LvTARGLEN(dstr) = LvTARGLEN(sstr);
+ LvTARG(dstr) = sv_dup_inc(LvTARG(sstr));
+ LvTYPE(dstr) = LvTYPE(sstr);
break;
- case SVt_PVAV:
- PerlIO_printf(Perl_debug_log, "PVAV%s\n", s);
+ case SVt_PVGV:
+ SvANY(dstr) = new_XPVGV();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
+ GvNAMELEN(dstr) = GvNAMELEN(sstr);
+ GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
+ GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr));
+ GvFLAGS(dstr) = GvFLAGS(sstr);
+ GvGP(dstr) = gp_dup(GvGP(sstr));
+ (void)GpREFCNT_inc(GvGP(dstr));
break;
- case SVt_PVHV:
- PerlIO_printf(Perl_debug_log, "PVHV%s\n", s);
+ case SVt_PVIO:
+ SvANY(dstr) = new_XPVIO();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ if (SvROK(sstr))
+ SvRV(dstr) = sv_dup_inc(SvRV(sstr));
+ else if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
+ IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr));
+ if (IoOFP(sstr) == IoIFP(sstr))
+ IoOFP(dstr) = IoIFP(dstr);
+ else
+ IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr));
+ /* PL_rsfp_filters entries have fake IoDIRP() */
+ if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
+ IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
+ else
+ IoDIRP(dstr) = IoDIRP(sstr);
+ IoLINES(dstr) = IoLINES(sstr);
+ IoPAGE(dstr) = IoPAGE(sstr);
+ IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
+ IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
+ IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
+ IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr));
+ IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
+ IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr));
+ IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
+ IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr));
+ IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
+ IoTYPE(dstr) = IoTYPE(sstr);
+ IoFLAGS(dstr) = IoFLAGS(sstr);
break;
- case SVt_PVCV:
- PerlIO_printf(Perl_debug_log, "PVCV%s\n", s);
+ case SVt_PVAV:
+ SvANY(dstr) = new_XPVAV();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr));
+ AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
+ if (AvARRAY((AV*)sstr)) {
+ SV **dst_ary, **src_ary;
+ SSize_t items = AvFILLp((AV*)sstr) + 1;
+
+ src_ary = AvARRAY((AV*)sstr);
+ Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
+ ptr_table_store(PL_ptr_table, src_ary, dst_ary);
+ SvPVX(dstr) = (char*)dst_ary;
+ AvALLOC((AV*)dstr) = dst_ary;
+ if (AvREAL((AV*)sstr)) {
+ while (items-- > 0)
+ *dst_ary++ = sv_dup_inc(*src_ary++);
+ }
+ else {
+ while (items-- > 0)
+ *dst_ary++ = sv_dup(*src_ary++);
+ }
+ items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
+ while (items-- > 0) {
+ *dst_ary++ = &PL_sv_undef;
+ }
+ }
+ else {
+ SvPVX(dstr) = Nullch;
+ AvALLOC((AV*)dstr) = (SV**)NULL;
+ }
break;
- case SVt_PVGV:
- PerlIO_printf(Perl_debug_log, "PVGV%s\n", s);
+ case SVt_PVHV:
+ SvANY(dstr) = new_XPVHV();
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
+ if (HvARRAY((HV*)sstr)) {
+ STRLEN i = 0;
+ XPVHV *dxhv = (XPVHV*)SvANY(dstr);
+ XPVHV *sxhv = (XPVHV*)SvANY(sstr);
+ Newz(0, dxhv->xhv_array,
+ PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
+ while (i <= sxhv->xhv_max) {
+ ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
+ !!HvSHAREKEYS(sstr));
+ ++i;
+ }
+ dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr));
+ }
+ else {
+ SvPVX(dstr) = Nullch;
+ HvEITER((HV*)dstr) = (HE*)NULL;
+ }
+ HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
+ HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
break;
case SVt_PVFM:
- PerlIO_printf(Perl_debug_log, "PVFM%s\n", s);
- break;
- case SVt_PVIO:
- PerlIO_printf(Perl_debug_log, "PVIO%s\n", s);
+ SvANY(dstr) = new_XPVFM();
+ FmLINES(dstr) = FmLINES(sstr);
+ goto dup_pvcv;
+ /* NOTREACHED */
+ case SVt_PVCV:
+ SvANY(dstr) = new_XPVCV();
+dup_pvcv:
+ SvCUR(dstr) = SvCUR(sstr);
+ SvLEN(dstr) = SvLEN(sstr);
+ SvIVX(dstr) = SvIVX(sstr);
+ SvNVX(dstr) = SvNVX(sstr);
+ SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
+ SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
+ if (SvPVX(sstr) && SvLEN(sstr))
+ SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
+ else
+ SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
+ CvSTASH(dstr) = hv_dup(CvSTASH(sstr));/* NOTE: not refcounted */
+ CvSTART(dstr) = CvSTART(sstr);
+ CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
+ CvXSUB(dstr) = CvXSUB(sstr);
+ CvXSUBANY(dstr) = CvXSUBANY(sstr);
+ CvGV(dstr) = gv_dup_inc(CvGV(sstr));
+ CvDEPTH(dstr) = CvDEPTH(sstr);
+ if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
+ /* XXX padlists are real, but pretend to be not */
+ AvREAL_on(CvPADLIST(sstr));
+ CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
+ AvREAL_off(CvPADLIST(sstr));
+ AvREAL_off(CvPADLIST(dstr));
+ }
+ else
+ CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
+ CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr));
+ CvFLAGS(dstr) = CvFLAGS(sstr);
break;
default:
- PerlIO_printf(Perl_debug_log, "UNKNOWN%s\n", s);
- return;
+ Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
+ break;
}
- if (type >= SVt_PVIV || type == SVt_IV)
- PerlIO_printf(Perl_debug_log, " IV = %ld\n", (long)SvIVX(sv));
- if (type >= SVt_PVNV || type == SVt_NV) {
- SET_NUMERIC_STANDARD();
- PerlIO_printf(Perl_debug_log, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
+
+ if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
+ ++PL_sv_objcount;
+
+ return dstr;
+}
+
+PERL_CONTEXT *
+Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max)
+{
+ PERL_CONTEXT *ncxs;
+
+ if (!cxs)
+ return (PERL_CONTEXT*)NULL;
+
+ /* look for it in the table first */
+ ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
+ if (ncxs)
+ return ncxs;
+
+ /* create anew and remember what it is */
+ Newz(56, ncxs, max + 1, PERL_CONTEXT);
+ ptr_table_store(PL_ptr_table, cxs, ncxs);
+
+ while (ix >= 0) {
+ PERL_CONTEXT *cx = &cxs[ix];
+ PERL_CONTEXT *ncx = &ncxs[ix];
+ ncx->cx_type = cx->cx_type;
+ if (CxTYPE(cx) == CXt_SUBST) {
+ Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
+ }
+ else {
+ ncx->blk_oldsp = cx->blk_oldsp;
+ ncx->blk_oldcop = cx->blk_oldcop;
+ ncx->blk_oldretsp = cx->blk_oldretsp;
+ ncx->blk_oldmarksp = cx->blk_oldmarksp;
+ ncx->blk_oldscopesp = cx->blk_oldscopesp;
+ ncx->blk_oldpm = cx->blk_oldpm;
+ ncx->blk_gimme = cx->blk_gimme;
+ switch (CxTYPE(cx)) {
+ case CXt_SUB:
+ ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
+ ? cv_dup_inc(cx->blk_sub.cv)
+ : cv_dup(cx->blk_sub.cv));
+ ncx->blk_sub.argarray = (cx->blk_sub.hasargs
+ ? av_dup_inc(cx->blk_sub.argarray)
+ : Nullav);
+ ncx->blk_sub.savearray = av_dup(cx->blk_sub.savearray);
+ ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
+ ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
+ ncx->blk_sub.lval = cx->blk_sub.lval;
+ break;
+ case CXt_EVAL:
+ ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
+ ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
+ ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv);
+ ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
+ ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text);
+ break;
+ case CXt_LOOP:
+ ncx->blk_loop.label = cx->blk_loop.label;
+ ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
+ ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
+ ncx->blk_loop.next_op = cx->blk_loop.next_op;
+ ncx->blk_loop.last_op = cx->blk_loop.last_op;
+ ncx->blk_loop.iterdata = (CxPADLOOP(cx)
+ ? cx->blk_loop.iterdata
+ : gv_dup((GV*)cx->blk_loop.iterdata));
+ ncx->blk_loop.oldcurpad
+ = (SV**)ptr_table_fetch(PL_ptr_table,
+ cx->blk_loop.oldcurpad);
+ ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave);
+ ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval);
+ ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary);
+ ncx->blk_loop.iterix = cx->blk_loop.iterix;
+ ncx->blk_loop.itermax = cx->blk_loop.itermax;
+ break;
+ case CXt_FORMAT:
+ ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv);
+ ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv);
+ ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv);
+ ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
+ break;
+ case CXt_BLOCK:
+ case CXt_NULL:
+ break;
+ }
+ }
+ --ix;
}
- if (SvROK(sv)) {
- PerlIO_printf(Perl_debug_log, " RV = 0x%lx\n", (long)SvRV(sv));
- sv_dump(SvRV(sv));
- return;
+ return ncxs;
+}
+
+PERL_SI *
+Perl_si_dup(pTHX_ PERL_SI *si)
+{
+ PERL_SI *nsi;
+
+ if (!si)
+ return (PERL_SI*)NULL;
+
+ /* look for it in the table first */
+ nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
+ if (nsi)
+ return nsi;
+
+ /* create anew and remember what it is */
+ Newz(56, nsi, 1, PERL_SI);
+ ptr_table_store(PL_ptr_table, si, nsi);
+
+ nsi->si_stack = av_dup_inc(si->si_stack);
+ nsi->si_cxix = si->si_cxix;
+ nsi->si_cxmax = si->si_cxmax;
+ nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax);
+ nsi->si_type = si->si_type;
+ nsi->si_prev = si_dup(si->si_prev);
+ nsi->si_next = si_dup(si->si_next);
+ nsi->si_markoff = si->si_markoff;
+
+ return nsi;
+}
+
+#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
+#define TOPINT(ss,ix) ((ss)[ix].any_i32)
+#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
+#define TOPLONG(ss,ix) ((ss)[ix].any_long)
+#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
+#define TOPIV(ss,ix) ((ss)[ix].any_iv)
+#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
+#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
+#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
+#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
+#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
+#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
+
+/* XXXXX todo */
+#define pv_dup_inc(p) SAVEPV(p)
+#define pv_dup(p) SAVEPV(p)
+#define svp_dup_inc(p,pp) any_dup(p,pp)
+
+void *
+Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
+{
+ void *ret;
+
+ if (!v)
+ return (void*)NULL;
+
+ /* look for it in the table first */
+ ret = ptr_table_fetch(PL_ptr_table, v);
+ if (ret)
+ return ret;
+
+ /* see if it is part of the interpreter structure */
+ if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
+ ret = (void*)(((char*)aTHXo) + (((char*)v) - (char*)proto_perl));
+ else
+ ret = v;
+
+ return ret;
+}
+
+ANY *
+Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl)
+{
+ ANY *ss = proto_perl->Tsavestack;
+ I32 ix = proto_perl->Tsavestack_ix;
+ I32 max = proto_perl->Tsavestack_max;
+ ANY *nss;
+ SV *sv;
+ GV *gv;
+ AV *av;
+ HV *hv;
+ void* ptr;
+ int intval;
+ long longval;
+ GP *gp;
+ IV iv;
+ I32 i;
+ char *c;
+ void (*dptr) (void*);
+ void (*dxptr) (pTHXo_ void*);
+ OP *o;
+
+ Newz(54, nss, max, ANY);
+
+ while (ix > 0) {
+ i = POPINT(ss,ix);
+ TOPINT(nss,ix) = i;
+ switch (i) {
+ case SAVEt_ITEM: /* normal string */
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ break;
+ case SAVEt_SV: /* scalar reference */
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ gv = (GV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = gv_dup_inc(gv);
+ break;
+ case SAVEt_GENERIC_SVREF: /* generic sv */
+ case SAVEt_SVREF: /* scalar reference */
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
+ break;
+ case SAVEt_AV: /* array reference */
+ av = (AV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = av_dup_inc(av);
+ gv = (GV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = gv_dup(gv);
+ break;
+ case SAVEt_HV: /* hash reference */
+ hv = (HV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = hv_dup_inc(hv);
+ gv = (GV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = gv_dup(gv);
+ break;
+ case SAVEt_INT: /* int reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ intval = (int)POPINT(ss,ix);
+ TOPINT(nss,ix) = intval;
+ break;
+ case SAVEt_LONG: /* long reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ longval = (long)POPLONG(ss,ix);
+ TOPLONG(nss,ix) = longval;
+ break;
+ case SAVEt_I32: /* I32 reference */
+ case SAVEt_I16: /* I16 reference */
+ case SAVEt_I8: /* I8 reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ i = POPINT(ss,ix);
+ TOPINT(nss,ix) = i;
+ break;
+ case SAVEt_IV: /* IV reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ iv = POPIV(ss,ix);
+ TOPIV(nss,ix) = iv;
+ break;
+ case SAVEt_SPTR: /* SV* reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup(sv);
+ break;
+ case SAVEt_VPTR: /* random* reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ break;
+ case SAVEt_PPTR: /* char* reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ c = (char*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = pv_dup(c);
+ break;
+ case SAVEt_HPTR: /* HV* reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ hv = (HV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = hv_dup(hv);
+ break;
+ case SAVEt_APTR: /* AV* reference */
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+ av = (AV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = av_dup(av);
+ break;
+ case SAVEt_NSTAB:
+ gv = (GV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = gv_dup(gv);
+ break;
+ case SAVEt_GP: /* scalar reference */
+ gp = (GP*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = gp = gp_dup(gp);
+ (void)GpREFCNT_inc(gp);
+ gv = (GV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = gv_dup_inc(c);
+ c = (char*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = pv_dup(c);
+ iv = POPIV(ss,ix);
+ TOPIV(nss,ix) = iv;
+ iv = POPIV(ss,ix);
+ TOPIV(nss,ix) = iv;
+ break;
+ case SAVEt_FREESV:
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ break;
+ case SAVEt_FREEOP:
+ ptr = POPPTR(ss,ix);
+ if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
+ /* these are assumed to be refcounted properly */
+ switch (((OP*)ptr)->op_type) {
+ case OP_LEAVESUB:
+ case OP_LEAVESUBLV:
+ case OP_LEAVEEVAL:
+ case OP_LEAVE:
+ case OP_SCOPE:
+ case OP_LEAVEWRITE:
+ TOPPTR(nss,ix) = ptr;
+ o = (OP*)ptr;
+ OpREFCNT_inc(o);
+ break;
+ default:
+ TOPPTR(nss,ix) = Nullop;
+ break;
+ }
+ }
+ else
+ TOPPTR(nss,ix) = Nullop;
+ break;
+ case SAVEt_FREEPV:
+ c = (char*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = pv_dup_inc(c);
+ break;
+ case SAVEt_CLEARSV:
+ longval = POPLONG(ss,ix);
+ TOPLONG(nss,ix) = longval;
+ break;
+ case SAVEt_DELETE:
+ hv = (HV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = hv_dup_inc(hv);
+ c = (char*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = pv_dup_inc(c);
+ i = POPINT(ss,ix);
+ TOPINT(nss,ix) = i;
+ break;
+ case SAVEt_DESTRUCTOR:
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
+ dptr = POPDPTR(ss,ix);
+ TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
+ break;
+ case SAVEt_DESTRUCTOR_X:
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
+ dxptr = POPDXPTR(ss,ix);
+ TOPDXPTR(nss,ix) = (void (*)(pTHXo_ void*))any_dup((void *)dxptr, proto_perl);
+ break;
+ case SAVEt_REGCONTEXT:
+ case SAVEt_ALLOC:
+ i = POPINT(ss,ix);
+ TOPINT(nss,ix) = i;
+ ix -= i;
+ break;
+ case SAVEt_STACK_POS: /* Position on Perl stack */
+ i = POPINT(ss,ix);
+ TOPINT(nss,ix) = i;
+ break;
+ case SAVEt_AELEM: /* array element */
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ i = POPINT(ss,ix);
+ TOPINT(nss,ix) = i;
+ av = (AV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = av_dup_inc(av);
+ break;
+ case SAVEt_HELEM: /* hash element */
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ sv = (SV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = sv_dup_inc(sv);
+ hv = (HV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = hv_dup_inc(hv);
+ break;
+ case SAVEt_OP:
+ ptr = POPPTR(ss,ix);
+ TOPPTR(nss,ix) = ptr;
+ break;
+ case SAVEt_HINTS:
+ i = POPINT(ss,ix);
+ TOPINT(nss,ix) = i;
+ break;
+ case SAVEt_COMPPAD:
+ av = (AV*)POPPTR(ss,ix);
+ TOPPTR(nss,ix) = av_dup(av);
+ break;
+ default:
+ Perl_croak(aTHX_ "panic: ss_dup inconsistency");
+ }
}
- if (type < SVt_PV)
- return;
- if (type <= SVt_PVLV) {
- if (SvPVX(sv))
- PerlIO_printf(Perl_debug_log, " PV = 0x%lx \"%s\"\n CUR = %ld\n LEN = %ld\n",
- (long)SvPVX(sv), SvPVX(sv), (long)SvCUR(sv), (long)SvLEN(sv));
- else
- PerlIO_printf(Perl_debug_log, " PV = 0\n");
+
+ return nss;
+}
+
+#ifdef PERL_OBJECT
+#include "XSUB.h"
+#endif
+
+PerlInterpreter *
+perl_clone(PerlInterpreter *proto_perl, UV flags)
+{
+#ifdef PERL_OBJECT
+ CPerlObj *pPerl = (CPerlObj*)proto_perl;
+#endif
+
+#ifdef PERL_IMPLICIT_SYS
+ return perl_clone_using(proto_perl, flags,
+ proto_perl->IMem,
+ proto_perl->IMemShared,
+ proto_perl->IMemParse,
+ proto_perl->IEnv,
+ proto_perl->IStdIO,
+ proto_perl->ILIO,
+ proto_perl->IDir,
+ proto_perl->ISock,
+ proto_perl->IProc);
+}
+
+PerlInterpreter *
+perl_clone_using(PerlInterpreter *proto_perl, UV flags,
+ struct IPerlMem* ipM, struct IPerlMem* ipMS,
+ struct IPerlMem* ipMP, struct IPerlEnv* ipE,
+ struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
+ struct IPerlDir* ipD, struct IPerlSock* ipS,
+ struct IPerlProc* ipP)
+{
+ /* XXX many of the string copies here can be optimized if they're
+ * constants; they need to be allocated as common memory and just
+ * their pointers copied. */
+
+ IV i;
+# ifdef PERL_OBJECT
+ CPerlObj *pPerl = new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd, ipLIO,
+ ipD, ipS, ipP);
+ PERL_SET_THX(pPerl);
+# else /* !PERL_OBJECT */
+ PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
+ PERL_SET_THX(my_perl);
+
+# ifdef DEBUGGING
+ memset(my_perl, 0xab, sizeof(PerlInterpreter));
+ PL_markstack = 0;
+ PL_scopestack = 0;
+ PL_savestack = 0;
+ PL_retstack = 0;
+# else /* !DEBUGGING */
+ Zero(my_perl, 1, PerlInterpreter);
+# endif /* DEBUGGING */
+
+ /* host pointers */
+ PL_Mem = ipM;
+ PL_MemShared = ipMS;
+ PL_MemParse = ipMP;
+ PL_Env = ipE;
+ PL_StdIO = ipStd;
+ PL_LIO = ipLIO;
+ PL_Dir = ipD;
+ PL_Sock = ipS;
+ PL_Proc = ipP;
+# endif /* PERL_OBJECT */
+#else /* !PERL_IMPLICIT_SYS */
+ IV i;
+ PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
+ PERL_SET_THX(my_perl);
+
+# ifdef DEBUGGING
+ memset(my_perl, 0xab, sizeof(PerlInterpreter));
+ PL_markstack = 0;
+ PL_scopestack = 0;
+ PL_savestack = 0;
+ PL_retstack = 0;
+# else /* !DEBUGGING */
+ Zero(my_perl, 1, PerlInterpreter);
+# endif /* DEBUGGING */
+#endif /* PERL_IMPLICIT_SYS */
+
+ /* arena roots */
+ PL_xiv_arenaroot = NULL;
+ PL_xiv_root = NULL;
+ PL_xnv_root = NULL;
+ PL_xrv_root = NULL;
+ PL_xpv_root = NULL;
+ PL_xpviv_root = NULL;
+ PL_xpvnv_root = NULL;
+ PL_xpvcv_root = NULL;
+ PL_xpvav_root = NULL;
+ PL_xpvhv_root = NULL;
+ PL_xpvmg_root = NULL;
+ PL_xpvlv_root = NULL;
+ PL_xpvbm_root = NULL;
+ PL_he_root = NULL;
+ PL_nice_chunk = NULL;
+ PL_nice_chunk_size = 0;
+ PL_sv_count = 0;
+ PL_sv_objcount = 0;
+ PL_sv_root = Nullsv;
+ PL_sv_arenaroot = Nullsv;
+
+ PL_debug = proto_perl->Idebug;
+
+ /* create SV map for pointer relocation */
+ PL_ptr_table = ptr_table_new();
+
+ /* initialize these special pointers as early as possible */
+ SvANY(&PL_sv_undef) = NULL;
+ SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
+ SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
+ ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
+
+#ifdef PERL_OBJECT
+ SvUPGRADE(&PL_sv_no, SVt_PVNV);
+#else
+ SvANY(&PL_sv_no) = new_XPVNV();
+#endif
+ SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
+ SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
+ SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
+ SvCUR(&PL_sv_no) = 0;
+ SvLEN(&PL_sv_no) = 1;
+ SvNVX(&PL_sv_no) = 0;
+ ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
+
+#ifdef PERL_OBJECT
+ SvUPGRADE(&PL_sv_yes, SVt_PVNV);
+#else
+ SvANY(&PL_sv_yes) = new_XPVNV();
+#endif
+ SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
+ SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
+ SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
+ SvCUR(&PL_sv_yes) = 1;
+ SvLEN(&PL_sv_yes) = 2;
+ SvNVX(&PL_sv_yes) = 1;
+ ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
+
+ /* create shared string table */
+ PL_strtab = newHV();
+ HvSHAREKEYS_off(PL_strtab);
+ hv_ksplit(PL_strtab, 512);
+ ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
+
+ PL_compiling = proto_perl->Icompiling;
+ PL_compiling.cop_stashpv = SAVEPV(PL_compiling.cop_stashpv);
+ PL_compiling.cop_file = SAVEPV(PL_compiling.cop_file);
+ ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
+ if (!specialWARN(PL_compiling.cop_warnings))
+ PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings);
+ PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
+
+ /* pseudo environmental stuff */
+ PL_origargc = proto_perl->Iorigargc;
+ i = PL_origargc;
+ New(0, PL_origargv, i+1, char*);
+ PL_origargv[i] = '\0';
+ while (i-- > 0) {
+ PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
+ }
+ PL_envgv = gv_dup(proto_perl->Ienvgv);
+ PL_incgv = gv_dup(proto_perl->Iincgv);
+ PL_hintgv = gv_dup(proto_perl->Ihintgv);
+ PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
+ PL_diehook = sv_dup_inc(proto_perl->Idiehook);
+ PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook);
+
+ /* switches */
+ PL_minus_c = proto_perl->Iminus_c;
+ PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel);
+ PL_localpatches = proto_perl->Ilocalpatches;
+ PL_splitstr = proto_perl->Isplitstr;
+ PL_preprocess = proto_perl->Ipreprocess;
+ PL_minus_n = proto_perl->Iminus_n;
+ PL_minus_p = proto_perl->Iminus_p;
+ PL_minus_l = proto_perl->Iminus_l;
+ PL_minus_a = proto_perl->Iminus_a;
+ PL_minus_F = proto_perl->Iminus_F;
+ PL_doswitches = proto_perl->Idoswitches;
+ PL_dowarn = proto_perl->Idowarn;
+ PL_doextract = proto_perl->Idoextract;
+ PL_sawampersand = proto_perl->Isawampersand;
+ PL_unsafe = proto_perl->Iunsafe;
+ PL_inplace = SAVEPV(proto_perl->Iinplace);
+ PL_e_script = sv_dup_inc(proto_perl->Ie_script);
+ PL_perldb = proto_perl->Iperldb;
+ PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
+
+ /* magical thingies */
+ /* XXX time(&PL_basetime) when asked for? */
+ PL_basetime = proto_perl->Ibasetime;
+ PL_formfeed = sv_dup(proto_perl->Iformfeed);
+
+ PL_maxsysfd = proto_perl->Imaxsysfd;
+ PL_multiline = proto_perl->Imultiline;
+ PL_statusvalue = proto_perl->Istatusvalue;
+#ifdef VMS
+ PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
+#endif
+
+ /* shortcuts to various I/O objects */
+ PL_stdingv = gv_dup(proto_perl->Istdingv);
+ PL_stderrgv = gv_dup(proto_perl->Istderrgv);
+ PL_defgv = gv_dup(proto_perl->Idefgv);
+ PL_argvgv = gv_dup(proto_perl->Iargvgv);
+ PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv);
+ PL_argvout_stack = av_dup(proto_perl->Iargvout_stack);
+
+ /* shortcuts to regexp stuff */
+ PL_replgv = gv_dup(proto_perl->Ireplgv);
+
+ /* shortcuts to misc objects */
+ PL_errgv = gv_dup(proto_perl->Ierrgv);
+
+ /* shortcuts to debugging objects */
+ PL_DBgv = gv_dup(proto_perl->IDBgv);
+ PL_DBline = gv_dup(proto_perl->IDBline);
+ PL_DBsub = gv_dup(proto_perl->IDBsub);
+ PL_DBsingle = sv_dup(proto_perl->IDBsingle);
+ PL_DBtrace = sv_dup(proto_perl->IDBtrace);
+ PL_DBsignal = sv_dup(proto_perl->IDBsignal);
+ PL_lineary = av_dup(proto_perl->Ilineary);
+ PL_dbargs = av_dup(proto_perl->Idbargs);
+
+ /* symbol tables */
+ PL_defstash = hv_dup_inc(proto_perl->Tdefstash);
+ PL_curstash = hv_dup(proto_perl->Tcurstash);
+ PL_debstash = hv_dup(proto_perl->Idebstash);
+ PL_globalstash = hv_dup(proto_perl->Iglobalstash);
+ PL_curstname = sv_dup_inc(proto_perl->Icurstname);
+
+ PL_beginav = av_dup_inc(proto_perl->Ibeginav);
+ PL_endav = av_dup_inc(proto_perl->Iendav);
+ PL_checkav = av_dup_inc(proto_perl->Icheckav);
+ PL_initav = av_dup_inc(proto_perl->Iinitav);
+
+ PL_sub_generation = proto_perl->Isub_generation;
+
+ /* funky return mechanisms */
+ PL_forkprocess = proto_perl->Iforkprocess;
+
+ /* subprocess state */
+ PL_fdpid = av_dup_inc(proto_perl->Ifdpid);
+
+ /* internal state */
+ PL_tainting = proto_perl->Itainting;
+ PL_maxo = proto_perl->Imaxo;
+ if (proto_perl->Iop_mask)
+ PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
+ else
+ PL_op_mask = Nullch;
+
+ /* current interpreter roots */
+ PL_main_cv = cv_dup_inc(proto_perl->Imain_cv);
+ PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
+ PL_main_start = proto_perl->Imain_start;
+ PL_eval_root = proto_perl->Ieval_root;
+ PL_eval_start = proto_perl->Ieval_start;
+
+ /* runtime control stuff */
+ PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
+ PL_copline = proto_perl->Icopline;
+
+ PL_filemode = proto_perl->Ifilemode;
+ PL_lastfd = proto_perl->Ilastfd;
+ PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
+ PL_Argv = NULL;
+ PL_Cmd = Nullch;
+ PL_gensym = proto_perl->Igensym;
+ PL_preambled = proto_perl->Ipreambled;
+ PL_preambleav = av_dup_inc(proto_perl->Ipreambleav);
+ PL_laststatval = proto_perl->Ilaststatval;
+ PL_laststype = proto_perl->Ilaststype;
+ PL_mess_sv = Nullsv;
+
+ PL_orslen = proto_perl->Iorslen;
+ PL_ors = SAVEPVN(proto_perl->Iors, PL_orslen);
+ PL_ofmt = SAVEPV(proto_perl->Iofmt);
+
+ /* interpreter atexit processing */
+ PL_exitlistlen = proto_perl->Iexitlistlen;
+ if (PL_exitlistlen) {
+ New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
+ Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
}
- if (type >= SVt_PVMG) {
- if (SvMAGIC(sv)) {
- PerlIO_printf(Perl_debug_log, " MAGIC = 0x%lx\n", (long)SvMAGIC(sv));
+ else
+ PL_exitlist = (PerlExitListEntry*)NULL;
+ PL_modglobal = hv_dup_inc(proto_perl->Imodglobal);
+
+ PL_profiledata = NULL;
+ PL_rsfp = fp_dup(proto_perl->Irsfp, '<');
+ /* PL_rsfp_filters entries have fake IoDIRP() */
+ PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters);
+
+ PL_compcv = cv_dup(proto_perl->Icompcv);
+ PL_comppad = av_dup(proto_perl->Icomppad);
+ PL_comppad_name = av_dup(proto_perl->Icomppad_name);
+ PL_comppad_name_fill = proto_perl->Icomppad_name_fill;
+ PL_comppad_name_floor = proto_perl->Icomppad_name_floor;
+ PL_curpad = (SV**)ptr_table_fetch(PL_ptr_table,
+ proto_perl->Tcurpad);
+
+#ifdef HAVE_INTERP_INTERN
+ sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
+#endif
+
+ /* more statics moved here */
+ PL_generation = proto_perl->Igeneration;
+ PL_DBcv = cv_dup(proto_perl->IDBcv);
+
+ PL_in_clean_objs = proto_perl->Iin_clean_objs;
+ PL_in_clean_all = proto_perl->Iin_clean_all;
+
+ PL_uid = proto_perl->Iuid;
+ PL_euid = proto_perl->Ieuid;
+ PL_gid = proto_perl->Igid;
+ PL_egid = proto_perl->Iegid;
+ PL_nomemok = proto_perl->Inomemok;
+ PL_an = proto_perl->Ian;
+ PL_cop_seqmax = proto_perl->Icop_seqmax;
+ PL_op_seqmax = proto_perl->Iop_seqmax;
+ PL_evalseq = proto_perl->Ievalseq;
+ PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
+ PL_origalen = proto_perl->Iorigalen;
+ PL_pidstatus = newHV(); /* XXX flag for cloning? */
+ PL_osname = SAVEPV(proto_perl->Iosname);
+ PL_sh_path = SAVEPV(proto_perl->Ish_path);
+ PL_sighandlerp = proto_perl->Isighandlerp;
+
+
+ PL_runops = proto_perl->Irunops;
+
+ Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
+
+#ifdef CSH
+ PL_cshlen = proto_perl->Icshlen;
+ PL_cshname = SAVEPVN(proto_perl->Icshname, PL_cshlen);
+#endif
+
+ PL_lex_state = proto_perl->Ilex_state;
+ PL_lex_defer = proto_perl->Ilex_defer;
+ PL_lex_expect = proto_perl->Ilex_expect;
+ PL_lex_formbrack = proto_perl->Ilex_formbrack;
+ PL_lex_dojoin = proto_perl->Ilex_dojoin;
+ PL_lex_starts = proto_perl->Ilex_starts;
+ PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff);
+ PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl);
+ PL_lex_op = proto_perl->Ilex_op;
+ PL_lex_inpat = proto_perl->Ilex_inpat;
+ PL_lex_inwhat = proto_perl->Ilex_inwhat;
+ PL_lex_brackets = proto_perl->Ilex_brackets;
+ i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
+ PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
+ PL_lex_casemods = proto_perl->Ilex_casemods;
+ i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
+ PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
+
+ Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
+ Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
+ PL_nexttoke = proto_perl->Inexttoke;
+
+ PL_linestr = sv_dup_inc(proto_perl->Ilinestr);
+ i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
+ PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
+ i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
+ PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
+ i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
+ PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
+ PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
+ i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
+ PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
+ PL_pending_ident = proto_perl->Ipending_ident;
+ PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
+
+ PL_expect = proto_perl->Iexpect;
+
+ PL_multi_start = proto_perl->Imulti_start;
+ PL_multi_end = proto_perl->Imulti_end;
+ PL_multi_open = proto_perl->Imulti_open;
+ PL_multi_close = proto_perl->Imulti_close;
+
+ PL_error_count = proto_perl->Ierror_count;
+ PL_subline = proto_perl->Isubline;
+ PL_subname = sv_dup_inc(proto_perl->Isubname);
+
+ PL_min_intro_pending = proto_perl->Imin_intro_pending;
+ PL_max_intro_pending = proto_perl->Imax_intro_pending;
+ PL_padix = proto_perl->Ipadix;
+ PL_padix_floor = proto_perl->Ipadix_floor;
+ PL_pad_reset_pending = proto_perl->Ipad_reset_pending;
+
+ i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
+ PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
+ i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
+ PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
+ PL_last_lop_op = proto_perl->Ilast_lop_op;
+ PL_in_my = proto_perl->Iin_my;
+ PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash);
+#ifdef FCRYPT
+ PL_cryptseen = proto_perl->Icryptseen;
+#endif
+
+ PL_hints = proto_perl->Ihints;
+
+ PL_amagic_generation = proto_perl->Iamagic_generation;
+
+#ifdef USE_LOCALE_COLLATE
+ PL_collation_ix = proto_perl->Icollation_ix;
+ PL_collation_name = SAVEPV(proto_perl->Icollation_name);
+ PL_collation_standard = proto_perl->Icollation_standard;
+ PL_collxfrm_base = proto_perl->Icollxfrm_base;
+ PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
+#endif /* USE_LOCALE_COLLATE */
+
+#ifdef USE_LOCALE_NUMERIC
+ PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
+ PL_numeric_standard = proto_perl->Inumeric_standard;
+ PL_numeric_local = proto_perl->Inumeric_local;
+ PL_numeric_radix = proto_perl->Inumeric_radix;
+#endif /* !USE_LOCALE_NUMERIC */
+
+ /* utf8 character classes */
+ PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum);
+ PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc);
+ PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii);
+ PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha);
+ PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space);
+ PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl);
+ PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph);
+ PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit);
+ PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper);
+ PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower);
+ PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print);
+ PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct);
+ PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit);
+ PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark);
+ PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper);
+ PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle);
+ PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower);
+
+ /* swatch cache */
+ PL_last_swash_hv = Nullhv; /* reinits on demand */
+ PL_last_swash_klen = 0;
+ PL_last_swash_key[0]= '\0';
+ PL_last_swash_tmps = (U8*)NULL;
+ PL_last_swash_slen = 0;
+
+ /* perly.c globals */
+ PL_yydebug = proto_perl->Iyydebug;
+ PL_yynerrs = proto_perl->Iyynerrs;
+ PL_yyerrflag = proto_perl->Iyyerrflag;
+ PL_yychar = proto_perl->Iyychar;
+ PL_yyval = proto_perl->Iyyval;
+ PL_yylval = proto_perl->Iyylval;
+
+ PL_glob_index = proto_perl->Iglob_index;
+ PL_srand_called = proto_perl->Isrand_called;
+ PL_uudmap['M'] = 0; /* reinits on demand */
+ PL_bitcount = Nullch; /* reinits on demand */
+
+ if (proto_perl->Ipsig_ptr) {
+ int sig_num[] = { SIG_NUM };
+ Newz(0, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
+ Newz(0, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
+ for (i = 1; PL_sig_name[i]; i++) {
+ PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i]);
+ PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i]);
}
- if (SvSTASH(sv))
- PerlIO_printf(Perl_debug_log, " STASH = \"%s\"\n", HvNAME(SvSTASH(sv)));
}
- switch (type) {
- case SVt_PVLV:
- PerlIO_printf(Perl_debug_log, " TYPE = %c\n", LvTYPE(sv));
- PerlIO_printf(Perl_debug_log, " TARGOFF = %ld\n", (long)LvTARGOFF(sv));
- PerlIO_printf(Perl_debug_log, " TARGLEN = %ld\n", (long)LvTARGLEN(sv));
- PerlIO_printf(Perl_debug_log, " TARG = 0x%lx\n", (long)LvTARG(sv));
- sv_dump(LvTARG(sv));
- break;
- case SVt_PVAV:
- PerlIO_printf(Perl_debug_log, " ARRAY = 0x%lx\n", (long)AvARRAY(sv));
- PerlIO_printf(Perl_debug_log, " ALLOC = 0x%lx\n", (long)AvALLOC(sv));
- PerlIO_printf(Perl_debug_log, " FILL = %ld\n", (long)AvFILLp(sv));
- PerlIO_printf(Perl_debug_log, " MAX = %ld\n", (long)AvMAX(sv));
- PerlIO_printf(Perl_debug_log, " ARYLEN = 0x%lx\n", (long)AvARYLEN(sv));
- flags = AvFLAGS(sv);
- sv_setpv(d, "");
- if (flags & AVf_REAL) sv_catpv(d, ",REAL");
- if (flags & AVf_REIFY) sv_catpv(d, ",REIFY");
- if (flags & AVf_REUSED) sv_catpv(d, ",REUSED");
- PerlIO_printf(Perl_debug_log, " FLAGS = (%s)\n",
- SvCUR(d) ? SvPVX(d) + 1 : "");
- break;
- case SVt_PVHV:
- PerlIO_printf(Perl_debug_log, " ARRAY = 0x%lx\n",(long)HvARRAY(sv));
- PerlIO_printf(Perl_debug_log, " KEYS = %ld\n", (long)HvKEYS(sv));
- PerlIO_printf(Perl_debug_log, " FILL = %ld\n", (long)HvFILL(sv));
- PerlIO_printf(Perl_debug_log, " MAX = %ld\n", (long)HvMAX(sv));
- PerlIO_printf(Perl_debug_log, " RITER = %ld\n", (long)HvRITER(sv));
- PerlIO_printf(Perl_debug_log, " EITER = 0x%lx\n",(long) HvEITER(sv));
- if (HvPMROOT(sv))
- PerlIO_printf(Perl_debug_log, " PMROOT = 0x%lx\n",(long)HvPMROOT(sv));
- if (HvNAME(sv))
- PerlIO_printf(Perl_debug_log, " NAME = \"%s\"\n", HvNAME(sv));
- break;
- case SVt_PVCV:
- if (SvPOK(sv)) {
- STRLEN n_a;
- PerlIO_printf(Perl_debug_log, " PROTOTYPE = \"%s\"\n", SvPV(sv,n_a));
+ else {
+ PL_psig_ptr = (SV**)NULL;
+ PL_psig_name = (SV**)NULL;
+ }
+
+ /* thrdvar.h stuff */
+
+ if (flags & 1) {
+ /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
+ PL_tmps_ix = proto_perl->Ttmps_ix;
+ PL_tmps_max = proto_perl->Ttmps_max;
+ PL_tmps_floor = proto_perl->Ttmps_floor;
+ Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
+ i = 0;
+ while (i <= PL_tmps_ix) {
+ PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i]);
+ ++i;
}
- /* FALL THROUGH */
- case SVt_PVFM:
- PerlIO_printf(Perl_debug_log, " STASH = 0x%lx\n", (long)CvSTASH(sv));
- PerlIO_printf(Perl_debug_log, " START = 0x%lx\n", (long)CvSTART(sv));
- PerlIO_printf(Perl_debug_log, " ROOT = 0x%lx\n", (long)CvROOT(sv));
- PerlIO_printf(Perl_debug_log, " XSUB = 0x%lx\n", (long)CvXSUB(sv));
- PerlIO_printf(Perl_debug_log, " XSUBANY = %ld\n", (long)CvXSUBANY(sv).any_i32);
- PerlIO_printf(Perl_debug_log, " GV = 0x%lx", (long)CvGV(sv));
- if (CvGV(sv) && GvNAME(CvGV(sv))) {
- PerlIO_printf(Perl_debug_log, " \"%s\"\n", GvNAME(CvGV(sv)));
- } else {
- PerlIO_printf(Perl_debug_log, "\n");
+
+ /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
+ i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
+ Newz(54, PL_markstack, i, I32);
+ PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
+ - proto_perl->Tmarkstack);
+ PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
+ - proto_perl->Tmarkstack);
+ Copy(proto_perl->Tmarkstack, PL_markstack,
+ PL_markstack_ptr - PL_markstack + 1, I32);
+
+ /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
+ * NOTE: unlike the others! */
+ PL_scopestack_ix = proto_perl->Tscopestack_ix;
+ PL_scopestack_max = proto_perl->Tscopestack_max;
+ Newz(54, PL_scopestack, PL_scopestack_max, I32);
+ Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
+
+ /* next push_return() sets PL_retstack[PL_retstack_ix]
+ * NOTE: unlike the others! */
+ PL_retstack_ix = proto_perl->Tretstack_ix;
+ PL_retstack_max = proto_perl->Tretstack_max;
+ Newz(54, PL_retstack, PL_retstack_max, OP*);
+ Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
+
+ /* NOTE: si_dup() looks at PL_markstack */
+ PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo);
+
+ /* PL_curstack = PL_curstackinfo->si_stack; */
+ PL_curstack = av_dup(proto_perl->Tcurstack);
+ PL_mainstack = av_dup(proto_perl->Tmainstack);
+
+ /* next PUSHs() etc. set *(PL_stack_sp+1) */
+ PL_stack_base = AvARRAY(PL_curstack);
+ PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
+ - proto_perl->Tstack_base);
+ PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
+
+ /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
+ * NOTE: unlike the others! */
+ PL_savestack_ix = proto_perl->Tsavestack_ix;
+ PL_savestack_max = proto_perl->Tsavestack_max;
+ /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
+ PL_savestack = ss_dup(proto_perl);
+ }
+ else {
+ init_stacks();
+ }
+
+ PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
+ PL_top_env = &PL_start_env;
+
+ PL_op = proto_perl->Top;
+
+ PL_Sv = Nullsv;
+ PL_Xpv = (XPV*)NULL;
+ PL_na = proto_perl->Tna;
+
+ PL_statbuf = proto_perl->Tstatbuf;
+ PL_statcache = proto_perl->Tstatcache;
+ PL_statgv = gv_dup(proto_perl->Tstatgv);
+ PL_statname = sv_dup_inc(proto_perl->Tstatname);
+#ifdef HAS_TIMES
+ PL_timesbuf = proto_perl->Ttimesbuf;
+#endif
+
+ PL_tainted = proto_perl->Ttainted;
+ PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
+ PL_nrs = sv_dup_inc(proto_perl->Tnrs);
+ PL_rs = sv_dup_inc(proto_perl->Trs);
+ PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv);
+ PL_ofslen = proto_perl->Tofslen;
+ PL_ofs = SAVEPVN(proto_perl->Tofs, PL_ofslen);
+ PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv);
+ PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
+ PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget);
+ PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget);
+ PL_formtarget = sv_dup(proto_perl->Tformtarget);
+
+ PL_restartop = proto_perl->Trestartop;
+ PL_in_eval = proto_perl->Tin_eval;
+ PL_delaymagic = proto_perl->Tdelaymagic;
+ PL_dirty = proto_perl->Tdirty;
+ PL_localizing = proto_perl->Tlocalizing;
+
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ PL_protect = proto_perl->Tprotect;
+#endif
+ PL_errors = sv_dup_inc(proto_perl->Terrors);
+ PL_av_fetch_sv = Nullsv;
+ PL_hv_fetch_sv = Nullsv;
+ Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
+ PL_modcount = proto_perl->Tmodcount;
+ PL_lastgotoprobe = Nullop;
+ PL_dumpindent = proto_perl->Tdumpindent;
+
+ PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
+ PL_sortstash = hv_dup(proto_perl->Tsortstash);
+ PL_firstgv = gv_dup(proto_perl->Tfirstgv);
+ PL_secondgv = gv_dup(proto_perl->Tsecondgv);
+ PL_sortcxix = proto_perl->Tsortcxix;
+ PL_efloatbuf = Nullch; /* reinits on demand */
+ PL_efloatsize = 0; /* reinits on demand */
+
+ /* regex stuff */
+
+ PL_screamfirst = NULL;
+ PL_screamnext = NULL;
+ PL_maxscream = -1; /* reinits on demand */
+ PL_lastscream = Nullsv;
+
+ PL_watchaddr = NULL;
+ PL_watchok = Nullch;
+
+ PL_regdummy = proto_perl->Tregdummy;
+ PL_regcomp_parse = Nullch;
+ PL_regxend = Nullch;
+ PL_regcode = (regnode*)NULL;
+ PL_regnaughty = 0;
+ PL_regsawback = 0;
+ PL_regprecomp = Nullch;
+ PL_regnpar = 0;
+ PL_regsize = 0;
+ PL_regflags = 0;
+ PL_regseen = 0;
+ PL_seen_zerolen = 0;
+ PL_seen_evals = 0;
+ PL_regcomp_rx = (regexp*)NULL;
+ PL_extralen = 0;
+ PL_colorset = 0; /* reinits PL_colors[] */
+ /*PL_colors[6] = {0,0,0,0,0,0};*/
+ PL_reg_whilem_seen = 0;
+ PL_reginput = Nullch;
+ PL_regbol = Nullch;
+ PL_regeol = Nullch;
+ PL_regstartp = (I32*)NULL;
+ PL_regendp = (I32*)NULL;
+ PL_reglastparen = (U32*)NULL;
+ PL_regtill = Nullch;
+ PL_regprev = '\n';
+ PL_reg_start_tmp = (char**)NULL;
+ PL_reg_start_tmpl = 0;
+ PL_regdata = (struct reg_data*)NULL;
+ PL_bostr = Nullch;
+ PL_reg_flags = 0;
+ PL_reg_eval_set = 0;
+ PL_regnarrate = 0;
+ PL_regprogram = (regnode*)NULL;
+ PL_regindent = 0;
+ PL_regcc = (CURCUR*)NULL;
+ PL_reg_call_cc = (struct re_cc_state*)NULL;
+ PL_reg_re = (regexp*)NULL;
+ PL_reg_ganch = Nullch;
+ PL_reg_sv = Nullsv;
+ PL_reg_magic = (MAGIC*)NULL;
+ PL_reg_oldpos = 0;
+ PL_reg_oldcurpm = (PMOP*)NULL;
+ PL_reg_curpm = (PMOP*)NULL;
+ PL_reg_oldsaved = Nullch;
+ PL_reg_oldsavedlen = 0;
+ PL_reg_maxiter = 0;
+ PL_reg_leftiter = 0;
+ PL_reg_poscache = Nullch;
+ PL_reg_poscache_size= 0;
+
+ /* RE engine - function pointers */
+ PL_regcompp = proto_perl->Tregcompp;
+ PL_regexecp = proto_perl->Tregexecp;
+ PL_regint_start = proto_perl->Tregint_start;
+ PL_regint_string = proto_perl->Tregint_string;
+ PL_regfree = proto_perl->Tregfree;
+
+ PL_reginterp_cnt = 0;
+ PL_reg_starttry = 0;
+
+#ifdef PERL_OBJECT
+ return (PerlInterpreter*)pPerl;
+#else
+ return my_perl;
+#endif
+}
+
+#else /* !USE_ITHREADS */
+
+#ifdef PERL_OBJECT
+#include "XSUB.h"
+#endif
+
+#endif /* USE_ITHREADS */
+
+static void
+do_report_used(pTHXo_ SV *sv)
+{
+ if (SvTYPE(sv) != SVTYPEMASK) {
+ PerlIO_printf(Perl_debug_log, "****\n");
+ sv_dump(sv);
+ }
+}
+
+static void
+do_clean_objs(pTHXo_ SV *sv)
+{
+ SV* rv;
+
+ if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
+ DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
+ SvROK_off(sv);
+ SvRV(sv) = 0;
+ SvREFCNT_dec(rv);
+ }
+
+ /* XXX Might want to check arrays, etc. */
+}
+
+#ifndef DISABLE_DESTRUCTOR_KLUDGE
+static void
+do_clean_named_objs(pTHXo_ SV *sv)
+{
+ if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
+ if ( SvOBJECT(GvSV(sv)) ||
+ (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
+ (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
+ (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
+ (GvCV(sv) && SvOBJECT(GvCV(sv))) )
+ {
+ DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
+ SvREFCNT_dec(sv);
}
- PerlIO_printf(Perl_debug_log, " FILEGV = 0x%lx\n", (long)CvFILEGV(sv));
- PerlIO_printf(Perl_debug_log, " DEPTH = %ld\n", (long)CvDEPTH(sv));
- PerlIO_printf(Perl_debug_log, " PADLIST = 0x%lx\n", (long)CvPADLIST(sv));
- PerlIO_printf(Perl_debug_log, " OUTSIDE = 0x%lx\n", (long)CvOUTSIDE(sv));
-#ifdef USE_THREADS
- PerlIO_printf(Perl_debug_log, " MUTEXP = 0x%lx\n", (long)CvMUTEXP(sv));
- PerlIO_printf(Perl_debug_log, " OWNER = 0x%lx\n", (long)CvOWNER(sv));
-#endif /* USE_THREADS */
- PerlIO_printf(Perl_debug_log, " FLAGS = 0x%lx\n",
- (unsigned long)CvFLAGS(sv));
- if (type == SVt_PVFM)
- PerlIO_printf(Perl_debug_log, " LINES = %ld\n", (long)FmLINES(sv));
- break;
- case SVt_PVGV:
- PerlIO_printf(Perl_debug_log, " NAME = \"%s\"\n", GvNAME(sv));
- PerlIO_printf(Perl_debug_log, " NAMELEN = %ld\n", (long)GvNAMELEN(sv));
- PerlIO_printf(Perl_debug_log, " STASH = \"%s\"\n",
- SvTYPE(GvSTASH(sv)) == SVt_PVHV ? HvNAME(GvSTASH(sv)) : "(deleted)");
- PerlIO_printf(Perl_debug_log, " GP = 0x%lx\n", (long)GvGP(sv));
- PerlIO_printf(Perl_debug_log, " SV = 0x%lx\n", (long)GvSV(sv));
- PerlIO_printf(Perl_debug_log, " REFCNT = %ld\n", (long)GvREFCNT(sv));
- PerlIO_printf(Perl_debug_log, " IO = 0x%lx\n", (long)GvIOp(sv));
- PerlIO_printf(Perl_debug_log, " FORM = 0x%lx\n", (long)GvFORM(sv));
- PerlIO_printf(Perl_debug_log, " AV = 0x%lx\n", (long)GvAV(sv));
- PerlIO_printf(Perl_debug_log, " HV = 0x%lx\n", (long)GvHV(sv));
- PerlIO_printf(Perl_debug_log, " CV = 0x%lx\n", (long)GvCV(sv));
- PerlIO_printf(Perl_debug_log, " CVGEN = 0x%lx\n", (long)GvCVGEN(sv));
- PerlIO_printf(Perl_debug_log, " LASTEXPR = %ld\n", (long)GvLASTEXPR(sv));
- PerlIO_printf(Perl_debug_log, " LINE = %ld\n", (long)GvLINE(sv));
- PerlIO_printf(Perl_debug_log, " FILEGV = 0x%lx\n", (long)GvFILEGV(sv));
- PerlIO_printf(Perl_debug_log, " EGV = 0x%lx\n", (long)GvEGV(sv));
- break;
- case SVt_PVIO:
- PerlIO_printf(Perl_debug_log, " IFP = 0x%lx\n", (long)IoIFP(sv));
- PerlIO_printf(Perl_debug_log, " OFP = 0x%lx\n", (long)IoOFP(sv));
- PerlIO_printf(Perl_debug_log, " DIRP = 0x%lx\n", (long)IoDIRP(sv));
- PerlIO_printf(Perl_debug_log, " LINES = %ld\n", (long)IoLINES(sv));
- PerlIO_printf(Perl_debug_log, " PAGE = %ld\n", (long)IoPAGE(sv));
- PerlIO_printf(Perl_debug_log, " PAGE_LEN = %ld\n", (long)IoPAGE_LEN(sv));
- PerlIO_printf(Perl_debug_log, " LINES_LEFT = %ld\n", (long)IoLINES_LEFT(sv));
- PerlIO_printf(Perl_debug_log, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
- PerlIO_printf(Perl_debug_log, " TOP_GV = 0x%lx\n", (long)IoTOP_GV(sv));
- PerlIO_printf(Perl_debug_log, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
- PerlIO_printf(Perl_debug_log, " FMT_GV = 0x%lx\n", (long)IoFMT_GV(sv));
- PerlIO_printf(Perl_debug_log, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
- PerlIO_printf(Perl_debug_log, " BOTTOM_GV = 0x%lx\n", (long)IoBOTTOM_GV(sv));
- PerlIO_printf(Perl_debug_log, " SUBPROCESS = %ld\n", (long)IoSUBPROCESS(sv));
- PerlIO_printf(Perl_debug_log, " TYPE = %c\n", IoTYPE(sv));
- PerlIO_printf(Perl_debug_log, " FLAGS = 0x%lx\n", (long)IoFLAGS(sv));
- break;
}
-#endif /* DEBUGGING */
}
+#endif
+
+static void
+do_clean_all(pTHXo_ SV *sv)
+{
+ DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) );)
+ SvFLAGS(sv) |= SVf_BREAK;
+ SvREFCNT_dec(sv);
+}
+
diff --git a/contrib/perl5/sv.h b/contrib/perl5/sv.h
index 7448b83..245199f 100644
--- a/contrib/perl5/sv.h
+++ b/contrib/perl5/sv.h
@@ -1,6 +1,6 @@
/* sv.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -11,6 +11,35 @@
#undef sv_flags /* Convex has this in <signal.h> for sigvec() */
#endif
+/*
+=for apidoc AmU||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.
+
+=for apidoc AmU||SVt_PV
+Pointer type flag for scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_IV
+Integer type flag for scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_NV
+Double type flag for scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_PVMG
+Type flag for blessed scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_PVAV
+Type flag for arrays. See C<svtype>.
+
+=for apidoc AmU||SVt_PVHV
+Type flag for hashes. See C<svtype>.
+
+=for apidoc AmU||SVt_PVCV
+Type flag for code refs. See C<svtype>.
+
+=cut
+*/
+
typedef enum {
SVt_NULL, /* 0 */
SVt_IV, /* 1 */
@@ -68,6 +97,26 @@ struct io {
U32 sv_flags; /* what we are */
};
+/*
+=for apidoc Am|U32|SvREFCNT|SV* sv
+Returns the value of the object's reference count.
+
+=for apidoc Am|SV*|SvREFCNT_inc|SV* sv
+Increments the reference count of the given SV.
+
+=for apidoc Am|void|SvREFCNT_dec|SV* sv
+Decrements the reference count of the given SV.
+
+=for apidoc Am|svtype|SvTYPE|SV* sv
+Returns the type of the SV. See C<svtype>.
+
+=for apidoc Am|void|SvUPGRADE|SV* sv|svtype type
+Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to
+perform the upgrade if necessary. See C<svtype>.
+
+=cut
+*/
+
#define SvANY(sv) (sv)->sv_any
#define SvFLAGS(sv) (sv)->sv_flags
#define SvREFCNT(sv) (sv)->sv_refcnt
@@ -137,34 +186,42 @@ struct io {
#define SVf_BREAK 0x00400000 /* refcnt is artificially low */
#define SVf_READONLY 0x00800000 /* may not be modified */
-#define SVf_THINKFIRST (SVf_READONLY|SVf_ROK)
#define SVp_IOK 0x01000000 /* has valid non-public integer value */
#define SVp_NOK 0x02000000 /* has valid non-public numeric value */
#define SVp_POK 0x04000000 /* has valid non-public pointer value */
#define SVp_SCREAM 0x08000000 /* has been studied? */
+#define SVf_UTF8 0x20000000 /* SvPVX is UTF-8 encoded */
+
+#define SVf_THINKFIRST (SVf_READONLY|SVf_ROK|SVf_FAKE|SVf_UTF8)
+
#define SVf_OK (SVf_IOK|SVf_NOK|SVf_POK|SVf_ROK| \
SVp_IOK|SVp_NOK|SVp_POK)
-#ifdef OVERLOAD
-#define SVf_AMAGIC 0x10000000 /* has magical overloaded methods */
-#else
-#define SVf_AMAGIC 0 /* can be or-ed without effect */
-#endif /* OVERLOAD */
+#define SVf_AMAGIC 0x10000000 /* has magical overloaded methods */
#define PRIVSHIFT 8
/* Some private flags. */
-#define SVpfm_COMPILED 0x80000000
+/* SVpad_OUR may be set on SVt_PV{NV,MG,GV} types */
+#define SVpad_OUR 0x80000000 /* pad name is "our" instead of "my" */
+
+#define SVf_IVisUV 0x80000000 /* use XPVUV instead of XPVIV */
+
+#define SVpfm_COMPILED 0x80000000 /* FORMLINE is compiled */
#define SVpbm_VALID 0x80000000
#define SVpbm_TAIL 0x40000000
+#define SVrepl_EVAL 0x40000000 /* Replacement part of s///e */
+
#define SVphv_SHAREKEYS 0x20000000 /* keys live on shared string table */
#define SVphv_LAZYDEL 0x40000000 /* entry in xhv_eiter must be deleted */
+#define SVprv_WEAKREF 0x80000000 /* Weak reference */
+
struct xrv {
SV * xrv_rv; /* pointer to another SV */
};
@@ -194,7 +251,7 @@ struct xpvnv {
STRLEN xpv_cur; /* length of xpv_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xiv_iv; /* integer value or pv offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
};
/* These structure must match the beginning of struct xpvhv in hv.h. */
@@ -203,7 +260,7 @@ struct xpvmg {
STRLEN xpv_cur; /* length of xpv_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xiv_iv; /* integer value or pv offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
};
@@ -213,7 +270,7 @@ struct xpvlv {
STRLEN xpv_cur; /* length of xpv_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xiv_iv; /* integer value or pv offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
@@ -228,7 +285,7 @@ struct xpvgv {
STRLEN xpv_cur; /* length of xpv_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xiv_iv; /* integer value or pv offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
@@ -244,7 +301,7 @@ struct xpvbm {
STRLEN xpv_cur; /* length of xpv_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xiv_iv; /* integer value or pv offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
@@ -253,7 +310,7 @@ struct xpvbm {
U8 xbm_rare; /* rarest character in string */
};
-/* This structure much match XPVCV */
+/* This structure much match XPVCV in cv.h */
typedef U16 cv_flags_t;
@@ -262,18 +319,18 @@ struct xpvfm {
STRLEN xpv_cur; /* length of xpv_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xiv_iv; /* integer value or pv offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
HV * xcv_stash;
OP * xcv_start;
OP * xcv_root;
- void (*xcv_xsub)_((CV* _CPERLproto));
+ void (*xcv_xsub)(pTHXo_ CV*);
ANY xcv_xsubany;
GV * xcv_gv;
- GV * xcv_filegv;
- long xcv_depth; /* >= 2 indicates recursive call */
+ char * xcv_file;
+ long xcv_depth; /* >= 2 indicates recursive call */
AV * xcv_padlist;
CV * xcv_outside;
#ifdef USE_THREADS
@@ -290,7 +347,7 @@ struct xpvio {
STRLEN xpv_cur; /* length of xpv_pv as a C string */
STRLEN xpv_len; /* allocated size */
IV xiv_iv; /* integer value or pv offset */
- double xnv_nv; /* numeric value, if any */
+ NV xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* linked list of magicalness */
HV* xmg_stash; /* class package */
@@ -312,53 +369,194 @@ struct xpvio {
char xio_flags;
};
-#define IOf_ARGV 1 /* this fp iterates over ARGV */
-#define IOf_START 2 /* check for null ARGV and substitute '-' */
-#define IOf_FLUSH 4 /* this fp wants a flush after write op */
-#define IOf_DIDTOP 8 /* just did top of form */
-#define IOf_UNTAINT 16 /* consider this fp (and its data) "safe" */
-#define IOf_NOLINE 32 /* slurped a pseudo-line from empty file */
+#define IOf_ARGV 1 /* this fp iterates over ARGV */
+#define IOf_START 2 /* check for null ARGV and substitute '-' */
+#define IOf_FLUSH 4 /* this fp wants a flush after write op */
+#define IOf_DIDTOP 8 /* just did top of form */
+#define IOf_UNTAINT 16 /* consider this fp (and its data) "safe" */
+#define IOf_NOLINE 32 /* slurped a pseudo-line from empty file */
+#define IOf_FAKE_DIRP 64 /* xio_dirp is fake (source filters kludge) */
/* The following macros define implementation-independent predicates on SVs. */
+/*
+=for apidoc Am|bool|SvNIOK|SV* sv
+Returns a boolean indicating whether the SV contains a number, integer or
+double.
+
+=for apidoc Am|bool|SvNIOKp|SV* sv
+Returns a boolean indicating whether the SV contains a number, integer or
+double. Checks the B<private> setting. Use C<SvNIOK>.
+
+=for apidoc Am|void|SvNIOK_off|SV* sv
+Unsets the NV/IV status of an SV.
+
+=for apidoc Am|bool|SvOK|SV* sv
+Returns a boolean indicating whether the value is an SV.
+
+=for apidoc Am|bool|SvIOKp|SV* sv
+Returns a boolean indicating whether the SV contains an integer. Checks
+the B<private> setting. Use C<SvIOK>.
+
+=for apidoc Am|bool|SvNOKp|SV* sv
+Returns a boolean indicating whether the SV contains a double. Checks the
+B<private> setting. Use C<SvNOK>.
+
+=for apidoc Am|bool|SvPOKp|SV* sv
+Returns a boolean indicating whether the SV contains a character string.
+Checks the B<private> setting. Use C<SvPOK>.
+
+=for apidoc Am|bool|SvIOK|SV* sv
+Returns a boolean indicating whether the SV contains an integer.
+
+=for apidoc Am|void|SvIOK_on|SV* sv
+Tells an SV that it is an integer.
+
+=for apidoc Am|void|SvIOK_off|SV* sv
+Unsets the IV status of an SV.
+
+=for apidoc Am|void|SvIOK_only|SV* sv
+Tells an SV that it is an integer and disables all other OK bits.
+
+=for apidoc Am|bool|SvNOK|SV* sv
+Returns a boolean indicating whether the SV contains a double.
+
+=for apidoc Am|void|SvNOK_on|SV* sv
+Tells an SV that it is a double.
+
+=for apidoc Am|void|SvNOK_off|SV* sv
+Unsets the NV status of an SV.
+
+=for apidoc Am|void|SvNOK_only|SV* sv
+Tells an SV that it is a double and disables all other OK bits.
+
+=for apidoc Am|bool|SvPOK|SV* sv
+Returns a boolean indicating whether the SV contains a character
+string.
+
+=for apidoc Am|void|SvPOK_on|SV* sv
+Tells an SV that it is a string.
+
+=for apidoc Am|void|SvPOK_off|SV* sv
+Unsets the PV status of an SV.
+
+=for apidoc Am|void|SvPOK_only|SV* sv
+Tells an SV that it is a string and disables all other OK bits.
+
+=for apidoc Am|bool|SvOOK|SV* sv
+Returns a boolean indicating whether the SvIVX is a valid offset value for
+the SvPVX. This hack is used internally to speed up removal of characters
+from the beginning of a SvPV. When SvOOK is true, then the start of the
+allocated string buffer is really (SvPVX - SvIVX).
+
+=for apidoc Am|bool|SvROK|SV* sv
+Tests if the SV is an RV.
+
+=for apidoc Am|void|SvROK_on|SV* sv
+Tells an SV that it is an RV.
+
+=for apidoc Am|void|SvROK_off|SV* sv
+Unsets the RV status of an SV.
+
+=for apidoc Am|SV*|SvRV|SV* sv
+Dereferences an RV to return the SV.
+
+=for apidoc Am|IV|SvIVX|SV* sv
+Returns the integer which is stored in the SV, assuming SvIOK is
+true.
+
+=for apidoc Am|UV|SvUVX|SV* sv
+Returns the unsigned integer which is stored in the SV, assuming SvIOK is
+true.
+
+=for apidoc Am|NV|SvNVX|SV* sv
+Returns the double which is stored in the SV, assuming SvNOK is
+true.
+
+=for apidoc Am|char*|SvPVX|SV* sv
+Returns a pointer to the string in the SV. The SV must contain a
+string.
+
+=for apidoc Am|STRLEN|SvCUR|SV* sv
+Returns the length of the string which is in the SV. See C<SvLEN>.
+
+=for apidoc Am|STRLEN|SvLEN|SV* sv
+Returns the size of the string buffer in the SV. See C<SvCUR>.
+
+=for apidoc Am|char*|SvEND|SV* sv
+Returns a pointer to the last character in the string which is in the SV.
+See C<SvCUR>. Access the character as *(SvEND(sv)).
+
+=for apidoc Am|HV*|SvSTASH|SV* sv
+Returns the stash of the SV.
+
+=for apidoc Am|void|SvCUR_set|SV* sv|STRLEN len
+Set the length of the string which is in the SV. See C<SvCUR>.
+
+=cut
+*/
+
#define SvNIOK(sv) (SvFLAGS(sv) & (SVf_IOK|SVf_NOK))
#define SvNIOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK))
#define SvNIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK| \
- SVp_IOK|SVp_NOK))
+ SVp_IOK|SVp_NOK|SVf_IVisUV))
#define SvOK(sv) (SvFLAGS(sv) & SVf_OK)
-#define SvOK_off(sv) (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC), \
+#define SvOK_off(sv) (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
+ SVf_IVisUV|SVf_UTF8), \
+ SvOOK_off(sv))
+#define SvOK_off_exc_UV(sv) (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
+ SVf_UTF8), \
SvOOK_off(sv))
#define SvOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK))
#define SvIOKp(sv) (SvFLAGS(sv) & SVp_IOK)
-#define SvIOKp_on(sv) (SvOOK_off(sv), SvFLAGS(sv) |= SVp_IOK)
+#define SvIOKp_on(sv) ((void)SvOOK_off(sv), SvFLAGS(sv) |= SVp_IOK)
#define SvNOKp(sv) (SvFLAGS(sv) & SVp_NOK)
#define SvNOKp_on(sv) (SvFLAGS(sv) |= SVp_NOK)
#define SvPOKp(sv) (SvFLAGS(sv) & SVp_POK)
#define SvPOKp_on(sv) (SvFLAGS(sv) |= SVp_POK)
#define SvIOK(sv) (SvFLAGS(sv) & SVf_IOK)
-#define SvIOK_on(sv) (SvOOK_off(sv), \
+#define SvIOK_on(sv) ((void)SvOOK_off(sv), \
+ SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+#define SvIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV))
+#define SvIOK_only(sv) ((void)SvOK_off(sv), \
SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
-#define SvIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK))
-#define SvIOK_only(sv) (SvOK_off(sv), \
+#define SvIOK_only_UV(sv) ((void)SvOK_off_exc_UV(sv), \
SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+#define SvIOK_UV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \
+ == (SVf_IOK|SVf_IVisUV))
+#define SvIOK_notUV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \
+ == SVf_IOK)
+
+#define SvIsUV(sv) (SvFLAGS(sv) & SVf_IVisUV)
+#define SvIsUV_on(sv) (SvFLAGS(sv) |= SVf_IVisUV)
+#define SvIsUV_off(sv) (SvFLAGS(sv) &= ~SVf_IVisUV)
+
#define SvNOK(sv) (SvFLAGS(sv) & SVf_NOK)
#define SvNOK_on(sv) (SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
#define SvNOK_off(sv) (SvFLAGS(sv) &= ~(SVf_NOK|SVp_NOK))
-#define SvNOK_only(sv) (SvOK_off(sv), \
+#define SvNOK_only(sv) ((void)SvOK_off(sv), \
SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
+#define SvUTF8(sv) (SvFLAGS(sv) & SVf_UTF8)
+#define SvUTF8_on(sv) (SvFLAGS(sv) |= (SVf_UTF8))
+#define SvUTF8_off(sv) (SvFLAGS(sv) &= ~(SVf_UTF8))
+
#define SvPOK(sv) (SvFLAGS(sv) & SVf_POK)
#define SvPOK_on(sv) (SvFLAGS(sv) |= (SVf_POK|SVp_POK))
#define SvPOK_off(sv) (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
-#define SvPOK_only(sv) (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC), \
+#define SvPOK_only(sv) (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
+ SVf_IVisUV|SVf_UTF8), \
+ SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#define SvPOK_only_UTF8(sv) (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC| \
+ SVf_IVisUV), \
SvFLAGS(sv) |= (SVf_POK|SVp_POK))
#define SvOOK(sv) (SvFLAGS(sv) & SVf_OOK)
-#define SvOOK_on(sv) (SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
+#define SvOOK_on(sv) ((void)SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
#define SvOOK_off(sv) (SvOOK(sv) && sv_backoff(sv))
#define SvFAKE(sv) (SvFLAGS(sv) & SVf_FAKE)
@@ -385,10 +583,9 @@ struct xpvio {
#define SvRMAGICAL_on(sv) (SvFLAGS(sv) |= SVs_RMG)
#define SvRMAGICAL_off(sv) (SvFLAGS(sv) &= ~SVs_RMG)
-#ifdef OVERLOAD
-#define SvAMAGIC(sv) (SvFLAGS(sv) & SVf_AMAGIC)
-#define SvAMAGIC_on(sv) (SvFLAGS(sv) |= SVf_AMAGIC)
-#define SvAMAGIC_off(sv) (SvFLAGS(sv) &= ~SVf_AMAGIC)
+#define SvAMAGIC(sv) (SvFLAGS(sv) & SVf_AMAGIC)
+#define SvAMAGIC_on(sv) (SvFLAGS(sv) |= SVf_AMAGIC)
+#define SvAMAGIC_off(sv) (SvFLAGS(sv) &= ~SVf_AMAGIC)
/*
#define Gv_AMG(stash) \
@@ -396,7 +593,11 @@ struct xpvio {
((!HV_AMAGICbad(stash) && HV_AMAGIC(stash)) || Gv_AMupdate(stash)))
*/
#define Gv_AMG(stash) (PL_amagic_generation && Gv_AMupdate(stash))
-#endif /* OVERLOAD */
+
+#define SvWEAKREF(sv) ((SvFLAGS(sv) & (SVf_ROK|SVprv_WEAKREF)) \
+ == (SVf_ROK|SVprv_WEAKREF))
+#define SvWEAKREF_on(sv) (SvFLAGS(sv) |= (SVf_ROK|SVprv_WEAKREF))
+#define SvWEAKREF_off(sv) (SvFLAGS(sv) &= ~(SVf_ROK|SVprv_WEAKREF))
#define SvTHINKFIRST(sv) (SvFLAGS(sv) & SVf_THINKFIRST)
@@ -429,6 +630,10 @@ struct xpvio {
#define SvCOMPILED_on(sv) (SvFLAGS(sv) |= SVpfm_COMPILED)
#define SvCOMPILED_off(sv) (SvFLAGS(sv) &= ~SVpfm_COMPILED)
+#define SvEVALED(sv) (SvFLAGS(sv) & SVrepl_EVAL)
+#define SvEVALED_on(sv) (SvFLAGS(sv) |= SVrepl_EVAL)
+#define SvEVALED_off(sv) (SvFLAGS(sv) &= ~SVrepl_EVAL)
+
#define SvTAIL(sv) (SvFLAGS(sv) & SVpbm_TAIL)
#define SvTAIL_on(sv) (SvFLAGS(sv) |= SVpbm_TAIL)
#define SvTAIL_off(sv) (SvFLAGS(sv) &= ~SVpbm_TAIL)
@@ -503,6 +708,28 @@ struct xpvio {
#define IoTYPE(sv) ((XPVIO*) SvANY(sv))->xio_type
#define IoFLAGS(sv) ((XPVIO*) SvANY(sv))->xio_flags
+/*
+=for apidoc Am|bool|SvTAINTED|SV* sv
+Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
+not.
+
+=for apidoc Am|void|SvTAINTED_on|SV* sv
+Marks an SV as tainted.
+
+=for apidoc Am|void|SvTAINTED_off|SV* sv
+Untaints an SV. Be I<very> careful with this routine, as it short-circuits
+some of Perl's fundamental security features. XS module authors should not
+use this function unless they fully understand all the implications of
+unconditionally untainting the value. Untainting should be done in the
+standard perl fashion, via a carefully crafted regexp, rather than directly
+untainting variables.
+
+=for apidoc Am|void|SvTAINT|SV* sv
+Taints an SV if tainting is enabled
+
+=cut
+*/
+
#define SvTAINTED(sv) (SvMAGICAL(sv) && sv_tainted(sv))
#define SvTAINTED_on(sv) STMT_START{ if(PL_tainting){sv_taint(sv);} }STMT_END
#define SvTAINTED_off(sv) STMT_START{ if(PL_tainting){sv_untaint(sv);} }STMT_END
@@ -516,23 +743,69 @@ struct xpvio {
} \
} STMT_END
+/*
+=for apidoc Am|char*|SvPV_force|SV* sv|STRLEN len
+Like <SvPV> but will force the SV into becoming a string (SvPOK). You want
+force if you are going to update the SvPVX directly.
+
+=for apidoc Am|char*|SvPV|SV* sv|STRLEN len
+Returns a pointer to the string in the SV, or a stringified form of the SV
+if the SV does not contain a string. Handles 'get' magic.
+
+=for apidoc Am|char*|SvPV_nolen|SV* sv
+Returns a pointer to the string in the SV, or a stringified form of the SV
+if the SV does not contain a string. Handles 'get' magic.
+
+=for apidoc Am|IV|SvIV|SV* sv
+Coerces the given SV to an integer and returns it.
+
+=for apidoc Am|NV|SvNV|SV* sv
+Coerce the given SV to a double and return it.
+
+=for apidoc Am|UV|SvUV|SV* sv
+Coerces the given SV to an unsigned integer and returns it.
+
+=for apidoc Am|bool|SvTRUE|SV* sv
+Returns a boolean indicating whether Perl would evaluate the SV as true or
+false, defined or undefined. Does not handle 'get' magic.
+
+=cut
+*/
+
#define SvPV_force(sv, lp) sv_pvn_force(sv, &lp)
#define SvPV(sv, lp) sv_pvn(sv, &lp)
+#define SvPV_nolen(sv) sv_pv(sv)
+
+#define SvPVutf8_force(sv, lp) sv_pvutf8n_force(sv, &lp)
+#define SvPVutf8(sv, lp) sv_pvutf8n(sv, &lp)
+#define SvPVutf8_nolen(sv) sv_pvutf8(sv)
+
+#define SvPVbyte_force(sv, lp) sv_pvbyte_force(sv, &lp)
+#define SvPVbyte(sv, lp) sv_pvbyten(sv, &lp)
+#define SvPVbyte_nolen(sv) sv_pvbyte(sv)
+
+#define SvPVx(sv, lp) sv_pvn(sv, &lp)
+#define SvPVx_force(sv, lp) sv_pvn_force(sv, &lp)
+#define SvPVutf8x(sv, lp) sv_pvutf8n(sv, &lp)
+#define SvPVutf8x_force(sv, lp) sv_pvutf8n_force(sv, &lp)
+#define SvPVbytex(sv, lp) sv_pvbyten(sv, &lp)
+#define SvPVbytex_force(sv, lp) sv_pvbyten_force(sv, &lp)
+
#define SvIVx(sv) sv_iv(sv)
#define SvUVx(sv) sv_uv(sv)
#define SvNVx(sv) sv_nv(sv)
-#define SvPVx(sv, lp) sv_pvn(sv, &lp)
-#define SvPVx_force(sv, lp) sv_pvn_force(sv, &lp)
+
#define SvTRUEx(sv) sv_true(sv)
#define SvIV(sv) SvIVx(sv)
#define SvNV(sv) SvNVx(sv)
-#define SvUV(sv) SvIVx(sv)
+#define SvUV(sv) SvUVx(sv)
#define SvTRUE(sv) SvTRUEx(sv)
#ifndef CRIPPLED_CC
/* redefine some things to more efficient inlined versions */
+/* Let us hope that bitmaps for UV and IV are the same */
#undef SvIV
#define SvIV(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv))
@@ -544,32 +817,88 @@ struct xpvio {
#undef SvPV
#define SvPV(sv, lp) \
- (SvPOK(sv) ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv(sv, &lp))
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv(sv, &lp))
+
#undef SvPV_force
#define SvPV_force(sv, lp) \
((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force(sv, &lp))
+#undef SvPV_nolen
+#define SvPV_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX(sv) : sv_2pv_nolen(sv))
+
+#undef SvPVutf8
+#define SvPVutf8(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &lp))
+
+#undef SvPVutf8_force
+#define SvPVutf8_force(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == (SVf_POK|SVf_UTF8) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &lp))
+
+#undef SvPVutf8_nolen
+#define SvPVutf8_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8)\
+ ? SvPVX(sv) : sv_2pvutf8_nolen(sv))
+
+#undef SvPVutf8
+#define SvPVutf8(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &lp))
+
+#undef SvPVutf8_force
+#define SvPVutf8_force(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == (SVf_POK|SVf_UTF8) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &lp))
+
+#undef SvPVutf8_nolen
+#define SvPVutf8_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8)\
+ ? SvPVX(sv) : sv_2pvutf8_nolen(sv))
+
+#undef SvPVbyte
+#define SvPVbyte(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#undef SvPVbyte_force
+#define SvPVbyte_force(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8|SVf_THINKFIRST)) == (SVf_POK) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvbyte_force(sv, &lp))
+
+#undef SvPVbyte_nolen
+#define SvPVbyte_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)\
+ ? SvPVX(sv) : sv_2pvbyte_nolen(sv))
+
+
#ifdef __GNUC__
# undef SvIVx
# undef SvUVx
# undef SvNVx
# undef SvPVx
+# undef SvPVutf8x
+# undef SvPVbytex
# undef SvTRUE
# undef SvTRUEx
# define SvIVx(sv) ({SV *nsv = (SV*)(sv); SvIV(nsv); })
# define SvUVx(sv) ({SV *nsv = (SV*)(sv); SvUV(nsv); })
# define SvNVx(sv) ({SV *nsv = (SV*)(sv); SvNV(nsv); })
# define SvPVx(sv, lp) ({SV *nsv = (sv); SvPV(nsv, lp); })
+# define SvPVutf8x(sv, lp) ({SV *nsv = (sv); SvPVutf8(nsv, lp); })
+# define SvPVbytex(sv, lp) ({SV *nsv = (sv); SvPVbyte(nsv, lp); })
# define SvTRUE(sv) ( \
!sv \
? 0 \
: SvPOK(sv) \
? (({XPV *nxpv = (XPV*)SvANY(sv); \
nxpv && \
- (*nxpv->xpv_pv > '0' || \
- nxpv->xpv_cur > 1 || \
+ (nxpv->xpv_cur > 1 || \
(nxpv->xpv_cur && *nxpv->xpv_pv != '0')); }) \
? 1 \
: 0) \
@@ -589,19 +918,22 @@ struct xpvio {
# undef SvUVx
# undef SvNVx
# undef SvPVx
+# undef SvPVutf8x
+# undef SvPVbytex
# undef SvTRUE
# undef SvTRUEx
# define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv))
# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
# define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv))
# define SvPVx(sv, lp) ((PL_Sv = (sv)), SvPV(PL_Sv, lp))
+# define SvPVutf8x(sv, lp) ((PL_Sv = (sv)), SvPVutf8(PL_Sv, lp))
+# define SvPVbytex(sv, lp) ((PL_Sv = (sv)), SvPVbyte(PL_Sv, lp))
# define SvTRUE(sv) ( \
!sv \
? 0 \
: SvPOK(sv) \
? ((PL_Xpv = (XPV*)SvANY(sv)) && \
- (*PL_Xpv->xpv_pv > '0' || \
- PL_Xpv->xpv_cur > 1 || \
+ (PL_Xpv->xpv_cur > 1 || \
(PL_Xpv->xpv_cur && *PL_Xpv->xpv_pv != '0')) \
? 1 \
: 0) \
@@ -616,10 +948,45 @@ struct xpvio {
#endif /* !__GNU__ */
#endif /* !CRIPPLED_CC */
+/*
+=for apidoc Am|SV*|newRV_inc|SV* sv
+
+Creates an RV wrapper for an SV. The reference count for the original SV is
+incremented.
+
+=cut
+*/
+
#define newRV_inc(sv) newRV(sv)
/* the following macros update any magic values this sv is associated with */
+/*
+=for apidoc Am|void|SvGETMAGIC|SV* sv
+Invokes C<mg_get> on an SV if it has 'get' magic. This macro evaluates its
+argument more than once.
+
+=for apidoc Am|void|SvSETMAGIC|SV* sv
+Invokes C<mg_set> on an SV if it has 'set' magic. This macro evaluates its
+argument more than once.
+
+=for apidoc Am|void|SvSetSV|SV* dsb|SV* ssv
+Calls C<sv_setsv> if dsv is not the same as ssv. May evaluate arguments
+more than once.
+
+=for apidoc Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv
+Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
+ssv. May evaluate arguments more than once.
+
+=for apidoc Am|void|SvGROW|SV* sv|STRLEN len
+Expands the character buffer in the SV so that it has room for the
+indicated number of bytes (remember to reserve space for an extra trailing
+NUL character). Calls C<sv_grow> to perform the expansion if necessary.
+Returns a pointer to the character buffer.
+
+=cut
+*/
+
#define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
#define SvSETMAGIC(x) STMT_START { if (SvSMAGICAL(x)) mg_set(x); } STMT_END
@@ -651,7 +1018,11 @@ struct xpvio {
#define SvSetMagicSV_nosteal(dst,src) \
SvSetSV_nosteal_and(dst,src,SvSETMAGIC(dst))
+#ifdef DEBUGGING
#define SvPEEK(sv) sv_peek(sv)
+#else
+#define SvPEEK(sv) ""
+#endif
#define SvIMMORTAL(sv) ((sv)==&PL_sv_undef || (sv)==&PL_sv_yes || (sv)==&PL_sv_no)
@@ -659,12 +1030,5 @@ struct xpvio {
#define isGV(sv) (SvTYPE(sv) == SVt_PVGV)
-#ifndef DOSISH
-# define SvGROW(sv,len) (SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX(sv))
-# define Sv_Grow sv_grow
-#else
- /* extra parentheses intentionally NOT placed around "len"! */
-# define SvGROW(sv,len) ((SvLEN(sv) < (unsigned long)len) \
- ? sv_grow(sv,(unsigned long)len) : SvPVX(sv))
-# define Sv_Grow(sv,len) sv_grow(sv,(unsigned long)(len))
-#endif /* DOSISH */
+#define SvGROW(sv,len) (SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX(sv))
+#define Sv_Grow sv_grow
diff --git a/contrib/perl5/t/TEST b/contrib/perl5/t/TEST
index 3685c2a..0b674af 100755
--- a/contrib/perl5/t/TEST
+++ b/contrib/perl5/t/TEST
@@ -1,6 +1,6 @@
#!./perl
-# Last change: Fri Jan 10 09:57:03 WET 1997
+# Last change: Fri May 28 03:16:57 BST 1999
# This is written in a peculiar style, since we're trying to avoid
# most of the constructs we'll be testing for.
@@ -43,6 +43,9 @@ TESTING COMPILER
--------------------------------------------------------------------------------
EOT
+ $ENV{PERLCC_TIMEOUT} = 120
+ if ($type eq 'compile' && !$ENV{PERLCC_TIMEOUT});
+
$bad = 0;
$good = 0;
$total = @tests;
@@ -150,12 +153,12 @@ EOT
}
}
else {
- $pct = sprintf("%.2f", $good / $total * 100);
+ $pct = $files ? sprintf("%.2f", ($files - $bad) / $files * 100) : "0.00";
if ($bad == 1) {
- warn "Failed 1 test script out of $total, $pct% okay.\n";
+ warn "Failed 1 test script out of $files, $pct% okay.\n";
}
else {
- warn "Failed $bad test scripts out of $total, $pct% okay.\n";
+ warn "Failed $bad test scripts out of $files, $pct% okay.\n";
}
warn <<'SHRDLU';
### Since not all tests were successful, you may want to run some
diff --git a/contrib/perl5/t/UTEST b/contrib/perl5/t/UTEST
new file mode 100755
index 0000000..b5f285b
--- /dev/null
+++ b/contrib/perl5/t/UTEST
@@ -0,0 +1,195 @@
+#!./perl
+
+# Last change: Fri Jan 10 09:57:03 WET 1997
+
+# This is written in a peculiar style, since we're trying to avoid
+# most of the constructs we'll be testing for.
+
+$| = 1;
+
+if ($#ARGV >= 0 && $ARGV[0] eq '-v') {
+ $verbose = 1;
+ shift;
+}
+
+chdir 't' if -f 't/TEST';
+
+die "You need to run \"make test\" first to set things up.\n"
+ unless -e 'perl' or -e 'perl.exe';
+
+#$ENV{PERL_DESTRUCT_LEVEL} = '2';
+$ENV{EMXSHELL} = 'sh'; # For OS/2
+
+if ($#ARGV == -1) {
+ @ARGV = split(/[ \n]/,
+ `echo base/*.t comp/*.t cmd/*.t io/*.t; echo op/*.t pragma/*.t lib/*.t`);
+}
+
+if ($^O eq 'os2' || $^O eq 'qnx') {
+ $sharpbang = 0;
+}
+else {
+ open(CONFIG, "../config.sh");
+ while (<CONFIG>) {
+ if (/sharpbang='(.*)'/) {
+ $sharpbang = ($1 eq '#!');
+ last;
+ }
+ }
+ close(CONFIG);
+}
+
+%infinite = ( 'comp/require.t', 1, 'op/bop.t', 1, 'lib/hostname.t', 1 );
+
+_testprogs('perl', @ARGV);
+_testprogs('compile', @ARGV) if (-e "../testcompile");
+
+sub _testprogs {
+ $type = shift @_;
+ @tests = @_;
+
+
+ print <<'EOT' if ($type eq 'compile');
+--------------------------------------------------------------------------------
+TESTING COMPILER
+--------------------------------------------------------------------------------
+EOT
+
+ $ENV{PERLCC_TIMEOUT} = 120
+ if ($type eq 'compile' && !$ENV{PERLCC_TIMEOUT});
+
+ $bad = 0;
+ $good = 0;
+ $total = @tests;
+ $files = 0;
+ $totmax = 0;
+ while ($test = shift @tests) {
+
+ if ( $infinite{$test} && $type eq 'compile' ) {
+ print STDERR "$test creates infinite loop! Skipping.\n";
+ next;
+ }
+ if ($test =~ /^$/) {
+ next;
+ }
+ $te = $test;
+ chop($te);
+ print "$te" . '.' x (18 - length($te));
+ if (0) {
+ -x $test || (print "isn't executable.\n");
+
+ if ($type eq 'perl') {
+ open(RESULTS, "./$test |") || (print "can't run.\n"); }
+ else {
+ open(RESULTS, "./perl -I../lib ../utils/perlcc ./$test -run -verbose dcf -log ../compilelog |") or print "can't compile.\n";
+ }
+ }
+ else {
+ open(SCRIPT,"$test") or die "Can't run $test.\n";
+ $_ = <SCRIPT>;
+ close(SCRIPT);
+ if (/#!..perl(.*)/) {
+ $switch = $1;
+ if ($^O eq 'VMS') {
+ # Must protect uppercase switches with "" on command line
+ $switch =~ s/-([A-Z]\S*)/"-$1"/g;
+ }
+ }
+ else {
+ $switch = '';
+ }
+
+ if ($type eq 'perl') {
+ open(RESULTS,"./perl$switch -I../lib -Mutf8 $test |") || (print "can't run.\n");
+ }
+ else {
+ open(RESULTS, "./perl -I../lib ../utils/perlcc -Mutf8 ./$test -run -verbose dcf -log ../compilelog |") or print "can't compile.\n";
+ }
+ }
+ $ok = 0;
+ $next = 0;
+ while (<RESULTS>) {
+ if ($verbose) {
+ print $_;
+ }
+ unless (/^#/) {
+ if (/^1\.\.([0-9]+)/) {
+ $max = $1;
+ $totmax += $max;
+ $files += 1;
+ $next = 1;
+ $ok = 1;
+ }
+ else {
+ $next = $1, $ok = 0, last if /^not ok ([0-9]*)/;
+ if (/^ok (\d+)(\s*#.*)?$/ && $1 == $next) {
+ $next = $next + 1;
+ }
+ else {
+ $ok = 0;
+ }
+ }
+ }
+ }
+ close RESULTS;
+ $next = $next - 1;
+ if ($ok && $next == $max) {
+ if ($max) {
+ print "ok\n";
+ $good = $good + 1;
+ }
+ else {
+ print "skipping test on this platform\n";
+ $files -= 1;
+ }
+ }
+ else {
+ $next += 1;
+ print "FAILED at test $next\n";
+ $bad = $bad + 1;
+ $_ = $test;
+ if (/^base/) {
+ die "Failed a basic test--cannot continue.\n";
+ }
+ }
+ }
+
+ if ($bad == 0) {
+ if ($ok) {
+ print "All tests successful.\n";
+ # XXX add mention of 'perlbug -ok' ?
+ }
+ else {
+ die "FAILED--no tests were run for some reason.\n";
+ }
+ }
+ else {
+ $pct = sprintf("%.2f", $good / $total * 100);
+ if ($bad == 1) {
+ warn "Failed 1 test script out of $total, $pct% okay.\n";
+ }
+ else {
+ warn "Failed $bad test scripts out of $total, $pct% okay.\n";
+ }
+ warn <<'SHRDLU';
+ ### Since not all tests were successful, you may want to run some
+ ### of them individually and examine any diagnostic messages they
+ ### produce. See the INSTALL document's section on "make test".
+ ### If you are testing the compiler, then ignore this message
+ ### and run
+ ### ./perl harness
+ ### in the directory ./t.
+SHRDLU
+ warn <<'SHRDLU' if $good / $total > 0.8;
+ ###
+ ### Since most tests were successful, you have a good chance to
+ ### get information with better granularity by running
+ ### ./perl harness
+ ### in directory ./t.
+SHRDLU
+ }
+ ($user,$sys,$cuser,$csys) = times;
+ print sprintf("u=%g s=%g cu=%g cs=%g scripts=%d tests=%d\n",
+ $user,$sys,$cuser,$csys,$files,$totmax);
+}
+exit ($bad != 0);
diff --git a/contrib/perl5/t/base/lex.t b/contrib/perl5/t/base/lex.t
index 8e2452d..d90d404 100755
--- a/contrib/perl5/t/base/lex.t
+++ b/contrib/perl5/t/base/lex.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..35\n";
+print "1..46\n";
$x = 'x';
@@ -116,6 +116,70 @@ $foo =~ s/^not /substr(<<EOF, 0, 0)/e;
EOF
print $foo;
+# Tests for new extended control-character variables
+# MJD 19990227
+
+{ my $CX = "\cX";
+ my $CXY ="\cXY";
+ $ {$CX} = 17;
+ $ {$CXY} = 23;
+ if ($ {^XY} != 23) { print "not " }
+ print "ok 31\n";
+
+# Does the syntax where we use the literal control character still work?
+ if (eval "\$ {\cX}" != 17 or $@) { print "not " }
+ print "ok 32\n";
+
+ eval "\$\cN = 24"; # Literal control character
+ if ($@ or ${"\cN"} != 24) { print "not " }
+ print "ok 33\n";
+ if ($^N != 24) { print "not " } # Control character escape sequence
+ print "ok 34\n";
+
+# Does the old UNBRACED syntax still do what it used to?
+ if ("$^XY" ne "17Y") { print "not " }
+ print "ok 35\n";
+
+ sub XX () { 6 }
+ $ {"\cN\cXX"} = 119;
+ $^N = 5; # This should be an unused ^Var.
+ $N = 5;
+ # The second caret here should be interpreted as an xor
+ if (($^N^XX) != 3) { print "not " }
+ print "ok 36\n";
+# if (($N ^ XX()) != 3) { print "not " }
+# print "ok 32\n";
+
+ # These next two tests are trying to make sure that
+ # $^FOO is always global; it doesn't make sense to `my' it.
+ #
+
+ eval 'my $^X;';
+ print "not " unless index ($@, 'Can\'t use global $^X in "my"') > -1;
+ print "ok 37\n";
+# print "($@)\n" if $@;
+
+ eval 'my $ {^XYZ};';
+ print "not " unless index ($@, 'Can\'t use global $^XYZ in "my"') > -1;
+ print "ok 38\n";
+# print "($@)\n" if $@;
+
+# Now let's make sure that caret variables are all forced into the main package.
+ package Someother;
+ $^N = 'Someother';
+ $ {^Nostril} = 'Someother 2';
+ $ {^M} = 'Someother 3';
+ package main;
+ print "not " unless $^N eq 'Someother';
+ print "ok 39\n";
+ print "not " unless $ {^Nostril} eq 'Someother 2';
+ print "ok 40\n";
+ print "not " unless $ {^M} eq 'Someother 3';
+ print "ok 41\n";
+
+
+}
+
# see if eval '', s///e, and heredocs mix
sub T {
@@ -125,7 +189,7 @@ sub T {
print "ok $num\n";
}
-my $test = 31;
+my $test = 42;
{
# line 42 "plink"
diff --git a/contrib/perl5/t/base/rs.t b/contrib/perl5/t/base/rs.t
index 52a9572..021d699 100755
--- a/contrib/perl5/t/base/rs.t
+++ b/contrib/perl5/t/base/rs.t
@@ -24,7 +24,7 @@ $bar = <TESTFILE>;
if ($bar eq "12\n") {print "ok 2\n";} else {print "not ok 2\n";}
# Try a non line terminator
-$/ = "3";
+$/ = 3;
$bar = <TESTFILE>;
if ($bar eq "123") {print "ok 3\n";} else {print "not ok 3\n";}
@@ -122,8 +122,7 @@ if ($^O eq 'VMS') {
if ($bar eq "z\n") {print "ok 14\n";} else {print "not ok 14\n";}
close TESTFILE;
- unlink "./foo.bar";
- unlink "./foo.com";
+ 1 while unlink qw(foo.bar foo.com foo.fdl);
} else {
# Nobody else does this at the moment (well, maybe OS/390, but they can
# put their own tests in) so we just punt
diff --git a/contrib/perl5/t/base/term.t b/contrib/perl5/t/base/term.t
index e96313d..6380694 100755
--- a/contrib/perl5/t/base/term.t
+++ b/contrib/perl5/t/base/term.t
@@ -4,7 +4,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Config;
diff --git a/contrib/perl5/t/cmd/while.t b/contrib/perl5/t/cmd/while.t
index 392c137..ecc15ed 100755
--- a/contrib/perl5/t/cmd/while.t
+++ b/contrib/perl5/t/cmd/while.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: while.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:15 $
-
-print "1..15\n";
+print "1..22\n";
open (tmp,'>Cmd_while.tmp') || die "Can't create Cmd_while.tmp.";
print tmp "tvi925\n";
@@ -128,3 +126,54 @@ while (1) {
$i++;
print "not " unless $` . $& . $' eq "abc";
print "ok $i\n";
+
+# check that scope cleanup happens right when there's a continue block
+{
+ my $var = 16;
+ while (my $i = ++$var) {
+ next if $i == 17;
+ last if $i > 17;
+ my $i = 0;
+ }
+ continue {
+ print "ok ", $var-1, "\nok $i\n";
+ }
+}
+
+{
+ local $l = 18;
+ {
+ local $l = 0
+ }
+ continue {
+ print "ok $l\n"
+ }
+}
+
+{
+ local $l = 19;
+ my $x = 0;
+ while (!$x++) {
+ local $l = 0
+ }
+ continue {
+ print "ok $l\n"
+ }
+}
+
+$i = 20;
+{
+ while (1) {
+ my $x;
+ print $x if defined $x;
+ $x = "not ";
+ print "ok $i\n"; ++$i;
+ if ($i == 21) {
+ next;
+ }
+ last;
+ }
+ continue {
+ print "ok $i\n"; ++$i;
+ }
+}
diff --git a/contrib/perl5/t/comp/bproto.t b/contrib/perl5/t/comp/bproto.t
new file mode 100755
index 0000000..01efb84
--- /dev/null
+++ b/contrib/perl5/t/comp/bproto.t
@@ -0,0 +1,44 @@
+#!./perl
+#
+# check if builtins behave as prototyped
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+print "1..10\n";
+
+my $i = 1;
+
+sub foo {}
+my $bar = "bar";
+
+sub test_too_many {
+ eval $_[0];
+ print "not " unless $@ =~ /^Too many arguments/;
+ printf "ok %d\n",$i++;
+}
+
+sub test_no_error {
+ eval $_[0];
+ print "not " if $@;
+ printf "ok %d\n",$i++;
+}
+
+test_too_many($_) for split /\n/,
+q[ defined(&foo, $bar);
+ undef(&foo, $bar);
+ uc($bar,$bar);
+];
+
+test_no_error($_) for split /\n/,
+q[ scalar(&foo,$bar);
+ defined &foo, &foo, &foo;
+ undef &foo, $bar;
+ uc $bar,$bar;
+ grep(not($bar), $bar);
+ grep(not($bar, $bar), $bar);
+ grep((not $bar, $bar, $bar), $bar);
+];
diff --git a/contrib/perl5/t/comp/colon.t b/contrib/perl5/t/comp/colon.t
index d2c64fe..dee5330 100755
--- a/contrib/perl5/t/comp/colon.t
+++ b/contrib/perl5/t/comp/colon.t
@@ -9,7 +9,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use strict;
diff --git a/contrib/perl5/t/comp/cpp.aux b/contrib/perl5/t/comp/cpp.aux
index bb93d21..536268a 100755
--- a/contrib/perl5/t/comp/cpp.aux
+++ b/contrib/perl5/t/comp/cpp.aux
@@ -1,14 +1,10 @@
#!./perl -P
-# $RCSfile: cpp.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:18 $
-
print "1..3\n";
-#this is a comment
#define MESS "ok 1\n"
print MESS;
-#If you capitalize, it's a comment.
#ifdef MESS
print "ok 2\n";
#else
diff --git a/contrib/perl5/t/comp/cpp.t b/contrib/perl5/t/comp/cpp.t
index 86e7359..bbff38c 100755
--- a/contrib/perl5/t/comp/cpp.t
+++ b/contrib/perl5/t/comp/cpp.t
@@ -4,14 +4,14 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Config;
if ( $^O eq 'MSWin32' or
($Config{'cppstdin'} =~ /\bcppstdin\b/) and
( ! -x $Config{'binexp'} . "/cppstdin") ) {
- print "1..0\n";
+ print "1..0 # Skip: \$Config{cppstdin} unavailable\n";
exit; # Cannot test till after install, alas.
}
diff --git a/contrib/perl5/t/comp/proto.t b/contrib/perl5/t/comp/proto.t
index db6a9b5..ee17088 100755
--- a/contrib/perl5/t/comp/proto.t
+++ b/contrib/perl5/t/comp/proto.t
@@ -11,12 +11,12 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use strict;
-print "1..87\n";
+print "1..107\n";
my $i = 1;
@@ -384,11 +384,11 @@ print "ok ", $i++, "\n";
print "not " if defined prototype('CORE::system');
print "ok ", $i++, "\n";
-print "# CORE::open => ($p)\nnot " if ($p = prototype('CORE::open')) ne '*;$';
+print "# CORE::open => ($p)\nnot " if ($p = prototype('CORE::open')) ne '*;$@';
print "ok ", $i++, "\n";
print "# CORE:Foo => ($p), \$@ => `$@'\nnot "
- if defined ($p = eval { prototype('CORE::Foo') or 1 }) or $@ !~ /^Cannot find an opnumber/;
+ if defined ($p = eval { prototype('CORE::Foo') or 1 }) or $@ !~ /^Can't find an opnumber/;
print "ok ", $i++, "\n";
# correctly note too-short parameter lists that don't end with '$',
@@ -417,9 +417,52 @@ print "ok ", $i++, "\n";
# test if the (*) prototype allows barewords, constants, scalar expressions,
# globs and globrefs (just as CORE::open() does), all under stricture
sub star (*&) { &{$_[1]} }
+sub star2 (**&) { &{$_[2]} }
+sub BAR { "quux" }
+sub Bar::BAZ { "quuz" }
my $star = 'FOO';
star FOO, sub { print "ok $i\n" if $_[0] eq 'FOO' }; $i++;
+star(FOO, sub { print "ok $i\n" if $_[0] eq 'FOO' }); $i++;
star "FOO", sub { print "ok $i\n" if $_[0] eq 'FOO' }; $i++;
+star("FOO", sub { print "ok $i\n" if $_[0] eq 'FOO' }); $i++;
star $star, sub { print "ok $i\n" if $_[0] eq 'FOO' }; $i++;
+star($star, sub { print "ok $i\n" if $_[0] eq 'FOO' }); $i++;
star *FOO, sub { print "ok $i\n" if $_[0] eq \*FOO }; $i++;
+star(*FOO, sub { print "ok $i\n" if $_[0] eq \*FOO }); $i++;
star \*FOO, sub { print "ok $i\n" if $_[0] eq \*FOO }; $i++;
+star(\*FOO, sub { print "ok $i\n" if $_[0] eq \*FOO }); $i++;
+star2 FOO, BAR, sub { print "ok $i\n"
+ if $_[0] eq 'FOO' and $_[1] eq 'BAR' }; $i++;
+star2(Bar::BAZ, FOO, sub { print "ok $i\n"
+ if $_[0] eq 'Bar::BAZ' and $_[1] eq 'FOO' }); $i++;
+star2 BAR(), FOO, sub { print "ok $i\n"
+ if $_[0] eq 'quux' and $_[1] eq 'FOO' }; $i++;
+star2(FOO, BAR(), sub { print "ok $i\n"
+ if $_[0] eq 'FOO' and $_[1] eq 'quux' }); $i++;
+star2 "FOO", "BAR", sub { print "ok $i\n"
+ if $_[0] eq 'FOO' and $_[1] eq 'BAR' }; $i++;
+star2("FOO", "BAR", sub { print "ok $i\n"
+ if $_[0] eq 'FOO' and $_[1] eq 'BAR' }); $i++;
+star2 $star, $star, sub { print "ok $i\n"
+ if $_[0] eq 'FOO' and $_[1] eq 'FOO' }; $i++;
+star2($star, $star, sub { print "ok $i\n"
+ if $_[0] eq 'FOO' and $_[1] eq 'FOO' }); $i++;
+star2 *FOO, *BAR, sub { print "ok $i\n"
+ if $_[0] eq \*FOO and $_[1] eq \*BAR }; $i++;
+star2(*FOO, *BAR, sub { print "ok $i\n"
+ if $_[0] eq \*FOO and $_[1] eq \*BAR }); $i++;
+star2 \*FOO, \*BAR, sub { no strict 'refs'; print "ok $i\n"
+ if $_[0] eq \*{'FOO'} and $_[1] eq \*{'BAR'} }; $i++;
+star2(\*FOO, \*BAR, sub { no strict 'refs'; print "ok $i\n"
+ if $_[0] eq \*{'FOO'} and $_[1] eq \*{'BAR'} }); $i++;
+
+# test scalarref prototype
+sub sreftest (\$$) {
+ print "ok $_[1]\n" if ref $_[0];
+}
+{
+ no strict 'vars';
+ sreftest my $sref, $i++;
+ sreftest($helem{$i}, $i++);
+ sreftest $aelem[0], $i++;
+}
diff --git a/contrib/perl5/t/comp/require.t b/contrib/perl5/t/comp/require.t
index 5c41f5c..1d92687 100755
--- a/contrib/perl5/t/comp/require.t
+++ b/contrib/perl5/t/comp/require.t
@@ -2,12 +2,12 @@
BEGIN {
chdir 't' if -d 't';
- @INC = ('.', '../lib');
+ unshift @INC, ('.', '../lib');
}
# don't make this lexical
$i = 1;
-print "1..4\n";
+print "1..20\n";
sub do_require {
%INC = ();
@@ -23,6 +23,74 @@ sub write_file {
close REQ;
}
+eval {require 5.005};
+print "# $@\nnot " if $@;
+print "ok ",$i++,"\n";
+
+eval { require 5.005 };
+print "# $@\nnot " if $@;
+print "ok ",$i++,"\n";
+
+eval { require 5.005; };
+print "# $@\nnot " if $@;
+print "ok ",$i++,"\n";
+
+eval {
+ require 5.005
+};
+print "# $@\nnot " if $@;
+print "ok ",$i++,"\n";
+
+# new style version numbers
+
+eval { require v5.5.630; };
+print "# $@\nnot " if $@;
+print "ok ",$i++,"\n";
+
+eval { require 10.0.2; };
+print "# $@\nnot " unless $@ =~ /^Perl v10\.0\.2 required/;
+print "ok ",$i++,"\n";
+
+eval q{ use v5.5.630; };
+print "# $@\nnot " if $@;
+print "ok ",$i++,"\n";
+
+eval q{ use 10.0.2; };
+print "# $@\nnot " unless $@ =~ /^Perl v10\.0\.2 required/;
+print "ok ",$i++,"\n";
+
+my $ver = 5.005_63;
+eval { require $ver; };
+print "# $@\nnot " if $@;
+print "ok ",$i++,"\n";
+
+# check inaccurate fp
+$ver = 10.2;
+eval { require $ver; };
+print "# $@\nnot " unless $@ =~ /^Perl v10\.200\.0 required/;
+print "ok ",$i++,"\n";
+
+$ver = 10.000_02;
+eval { require $ver; };
+print "# $@\nnot " unless $@ =~ /^Perl v10\.0\.20 required/;
+print "ok ",$i++,"\n";
+
+print "not " unless 5.5.1 gt v5.5;
+print "ok ",$i++,"\n";
+
+{
+ use utf8;
+ print "not " unless v5.5.640 eq "\x{5}\x{5}\x{280}";
+ print "ok ",$i++,"\n";
+
+ print "not " unless v7.15 eq "\x{7}\x{f}";
+ print "ok ",$i++,"\n";
+
+ print "not "
+ unless v1.20.300.4000.50000.600000 eq "\x{1}\x{14}\x{12c}\x{fa0}\x{c350}\x{927c0}";
+ print "ok ",$i++,"\n";
+}
+
# interaction with pod (see the eof)
write_file('bleah.pm', "print 'ok $i\n'; 1;\n");
require "bleah.pm";
@@ -45,7 +113,18 @@ do_require "1";
print "# $@\nnot " if $@;
print "ok ",$i++,"\n";
-END { unlink 'bleah.pm'; }
+# do FILE shouldn't see any outside lexicals
+my $x = "ok $i\n";
+write_file("bleah.do", <<EOT);
+\$x = "not ok $i\\n";
+EOT
+do "bleah.do";
+dofile();
+sub dofile { do "bleah.do"; };
+print $x;
+$i++;
+
+END { 1 while unlink 'bleah.pm'; 1 while unlink 'bleah.do'; }
# ***interaction with pod (don't put any thing after here)***
diff --git a/contrib/perl5/t/comp/script.t b/contrib/perl5/t/comp/script.t
index d0c12e9..a9bc47d 100755
--- a/contrib/perl5/t/comp/script.t
+++ b/contrib/perl5/t/comp/script.t
@@ -6,7 +6,6 @@ print "1..3\n";
$PERL = ($^O eq 'MSWin32') ? '.\perl' : './perl';
$x = `$PERL -le "print 'ok';"`;
-if ($x =~ /DCL-W-NOCOMD/) { $x = `\$ mcr sys\$disk:[]perl. -e "print ""ok\n""";`; }
if ($x eq "ok\n") {print "ok 1\n";} else {print "not ok 1\n";}
@@ -15,12 +14,10 @@ print try 'print "ok\n";'; print try "\n";
close try;
$x = `$PERL Comp.script`;
-if ($x =~ /DCL-W-NOCOMD/) { $x = `\$ mcr sys\$disk:[]perl. Comp.script`; }
if ($x eq "ok\n") {print "ok 2\n";} else {print "not ok 2\n";}
$x = `$PERL <Comp.script`;
-if ($x =~ /DCL-W-NOCOMD/) { $x = `\$ mcr sys\$disk:[]perl. <Comp.script`; }
if ($x eq "ok\n") {print "ok 3\n";} else {print "not ok 3\n";}
diff --git a/contrib/perl5/t/comp/term.t b/contrib/perl5/t/comp/term.t
index eb99680..f079eef 100755
--- a/contrib/perl5/t/comp/term.t
+++ b/contrib/perl5/t/comp/term.t
@@ -1,10 +1,8 @@
#!./perl
-# $RCSfile: term.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:24 $
-
# tests that aren't important enough for base.term
-print "1..22\n";
+print "1..23\n";
$x = "\\n";
print "#1\t:$x: eq " . ':\n:' . "\n";
@@ -68,3 +66,7 @@ if (ref($a) eq 'HASH') {print "ok 21\n";} else {print "not ok 21\n";}
$a = "+{ \$a=>'foo'}";
$a = eval $a;
if (ref($a) eq 'HASH') {print "ok 22\n";} else {print "not ok 22\n";}
+
+$a = "{ 0x01 => 'foo'}->{0x01}";
+$a = eval $a;
+if ($a eq 'foo') {print "ok 23\n";} else {print "not ok 23\n";}
diff --git a/contrib/perl5/t/comp/use.t b/contrib/perl5/t/comp/use.t
index a6ce2a4..1f5fae3 100755
--- a/contrib/perl5/t/comp/use.t
+++ b/contrib/perl5/t/comp/use.t
@@ -2,12 +2,18 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
-print "1..14\n";
+print "1..27\n";
my $i = 1;
+eval "use 5.000"; # implicit semicolon
+if ($@) {
+ print STDERR $@,"\n";
+ print "not ";
+}
+print "ok ",$i++,"\n";
eval "use 5.000;";
if ($@) {
@@ -44,9 +50,7 @@ unless ($@) {
print "ok ",$i++,"\n";
-
-use lib; # I know that this module will be there.
-
+{ use lib } # check that subparse saves pending tokens
local $lib::VERSION = 1.0;
@@ -99,3 +103,68 @@ print "ok ",$i++,"\n";
print "not " if $INC[0] eq "freda";
print "ok ",$i++,"\n";
+
+{
+ local $lib::VERSION = 35.36;
+ eval "use lib v33.55";
+ print "not " if $@;
+ print "ok ",$i++,"\n";
+
+ eval "use lib v100.105";
+ unless ($@ =~ /lib version 100\.105 required--this is only version 35\.3/) {
+ print "not ";
+ }
+ print "ok ",$i++,"\n";
+
+ eval "use lib 33.55";
+ print "not " if $@;
+ print "ok ",$i++,"\n";
+
+ eval "use lib 100.105";
+ unless ($@ =~ /lib version 100\.105 required--this is only version 35\.3/) {
+ print "not ";
+ }
+ print "ok ",$i++,"\n";
+
+ local $lib::VERSION = '35.36';
+ eval "use lib v33.55";
+ print "not " if $@;
+ print "ok ",$i++,"\n";
+
+ eval "use lib v100.105";
+ unless ($@ =~ /lib version 100\.105 required--this is only version 35\.36/) {
+ print "not ";
+ }
+ print "ok ",$i++,"\n";
+
+ eval "use lib 33.55";
+ print "not " if $@;
+ print "ok ",$i++,"\n";
+
+ eval "use lib 100.105";
+ unless ($@ =~ /lib version 100\.105 required--this is only version 35\.36/) {
+ print "not ";
+ }
+ print "ok ",$i++,"\n";
+
+ local $lib::VERSION = v35.36;
+ eval "use lib v33.55";
+ print "not " if $@;
+ print "ok ",$i++,"\n";
+
+ eval "use lib v100.105";
+ unless ($@ =~ /lib v100\.105 required--this is only v35\.36/) {
+ print "not ";
+ }
+ print "ok ",$i++,"\n";
+
+ eval "use lib 33.55";
+ print "not " if $@;
+ print "ok ",$i++,"\n";
+
+ eval "use lib 100.105";
+ unless ($@ =~ /lib version 100\.105 required--this is only version 35\.036/) {
+ print "not ";
+ }
+ print "ok ",$i++,"\n";
+}
diff --git a/contrib/perl5/t/harness b/contrib/perl5/t/harness
index f6d94de..e1a4dd7 100644
--- a/contrib/perl5/t/harness
+++ b/contrib/perl5/t/harness
@@ -5,29 +5,77 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
- $ENV{PERL5LIB} = '../lib'; # so children will see it too
+ unshift @INC, '../lib';
+ $ENV{PERL5LIB} = '../lib'; # so children will see it too
}
use lib '../lib';
use Test::Harness;
-$Test::Harness::switches = ""; # Too much noise otherwise
+$Test::Harness::switches = ""; # Too much noise otherwise
$Test::Harness::verbose = shift if @ARGV && $ARGV[0] eq '-v';
+#fudge DATA for now.
+%datahandle = qw(
+ lib/bigint.t 1
+ lib/bigintpm.t 1
+ lib/bigfloat.t 1
+ lib/bigfloatpm.t 1
+ op/gv.t 1
+ lib/complex.t 1
+ lib/ph.t 1
+ lib/soundex.t 1
+ op/misc.t 1
+ op/runlevel.t 1
+ op/tie.t 1
+ op/lex_assign.t 1
+ pragma/subs.t 1
+ );
+
+foreach (keys %datahandle) {
+ unlink "$_.t";
+}
+
@tests = @ARGV;
@tests = <base/*.t comp/*.t cmd/*.t io/*.t op/*.t pragma/*.t lib/*.t> unless @tests;
Test::Harness::runtests @tests;
+exit(0) unless -e "../testcompile";
-%infinite = ('comp/require.t', 1, 'op/bop.t', 1, 'lib/hostname.t', 1 );
+%infinite = qw (
+ op/bop.t 1
+ lib/hostname.t 1
+ op/lex_assign.t 1
+ lib/ph.t 1
+ );
+
+my $dhwrapper = <<'EOT';
+open DATA,"<".__FILE__;
+until (($_=<DATA>) =~ /^__END__/) {};
+EOT
@tests = grep (!$infinite{$_}, @tests);
+@tests = map {
+ my $new = $_;
+ if ($datahandle{$_} && !( -f "$new.t") ) {
+ $new .= '.t';
+ local(*F, *T);
+ open(F,"<$_") or die "Can't open $_: $!";
+ open(T,">$new") or die "Can't open $new: $!";
+ print T $dhwrapper, <F>;
+ close F;
+ close T;
+ }
+ $new;
+ } @tests;
+
+print "The tests ", join(' ', keys(%infinite)),
+ " generate infinite loops! Skipping!\n";
-if (-e "../testcompile")
-{
- print "The tests ", join(' ', keys(%infinite)),
- " generate infinite loops! Skipping!\n";
+$ENV{'HARNESS_COMPILE_TEST'} = 1;
+$ENV{'PERLCC_TIMEOUT'} = 120 unless $ENV{'PERLCC_TIMEOUT'};
- $ENV{'COMPILE_TEST'} = 1; Test::Harness::runtests @tests;
+Test::Harness::runtests @tests;
+foreach (keys %datahandle) {
+ unlink "$_.t";
}
diff --git a/contrib/perl5/t/io/argv.t b/contrib/perl5/t/io/argv.t
index c6565dc..d6093f9 100755
--- a/contrib/perl5/t/io/argv.t
+++ b/contrib/perl5/t/io/argv.t
@@ -1,24 +1,33 @@
#!./perl
-print "1..6\n";
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+print "1..20\n";
+
+use File::Spec;
+
+my $devnull = File::Spec->devnull;
-open(try, '>Io.argv.tmp') || (die "Can't open temp file: $!");
+open(try, '>Io_argv1.tmp') || (die "Can't open temp file: $!");
print try "a line\n";
close try;
if ($^O eq 'MSWin32') {
- $x = `.\\perl -e "while (<>) {print \$.,\$_;}" Io.argv.tmp Io.argv.tmp`;
+ $x = `.\\perl -e "while (<>) {print \$.,\$_;}" Io_argv1.tmp Io_argv1.tmp`;
}
else {
- $x = `./perl -e 'while (<>) {print \$.,\$_;}' Io.argv.tmp Io.argv.tmp`;
+ $x = `./perl -e 'while (<>) {print \$.,\$_;}' Io_argv1.tmp Io_argv1.tmp`;
}
if ($x eq "1a line\n2a line\n") {print "ok 1\n";} else {print "not ok 1\n";}
if ($^O eq 'MSWin32') {
- $x = `.\\perl -le "print 'foo'" | .\\perl -e "while (<>) {print \$_;}" Io.argv.tmp -`;
+ $x = `.\\perl -le "print 'foo'" | .\\perl -e "while (<>) {print \$_;}" Io_argv1.tmp -`;
}
else {
- $x = `echo foo|./perl -e 'while (<>) {print $_;}' Io.argv.tmp -`;
+ $x = `echo foo|./perl -e 'while (<>) {print $_;}' Io_argv1.tmp -`;
}
if ($x eq "a line\nfoo\n") {print "ok 2\n";} else {print "not ok 2\n";}
@@ -30,7 +39,7 @@ else {
}
if ($x eq "foo\n") {print "ok 3\n";} else {print "not ok 3 :$x:\n";}
-@ARGV = ('Io.argv.tmp', 'Io.argv.tmp', '/dev/null', 'Io.argv.tmp');
+@ARGV = ('Io_argv1.tmp', 'Io_argv1.tmp', $devnull, 'Io_argv1.tmp');
while (<>) {
$y .= $. . $_;
if (eof()) {
@@ -43,17 +52,74 @@ if ($y eq "1a line\n2a line\n3a line\n")
else
{print "not ok 5\n";}
-open(try, '>Io.argv.tmp') or die "Can't open temp file: $!";
+open(try, '>Io_argv1.tmp') or die "Can't open temp file: $!";
close try;
-@ARGV = 'Io.argv.tmp';
+open(try, '>Io_argv2.tmp') or die "Can't open temp file: $!";
+close try;
+@ARGV = ('Io_argv1.tmp', 'Io_argv2.tmp');
$^I = '.bak';
$/ = undef;
+my $i = 6;
while (<>) {
- s/^/ok 6\n/;
+ s/^/ok $i\n/;
+ ++$i;
print;
}
-open(try, '<Io.argv.tmp') or die "Can't open temp file: $!";
+open(try, '<Io_argv1.tmp') or die "Can't open temp file: $!";
+print while <try>;
+open(try, '<Io_argv2.tmp') or die "Can't open temp file: $!";
print while <try>;
close try;
+undef $^I;
+
+eof try or print 'not ';
+print "ok 8\n";
+
+eof NEVEROPENED or print 'not ';
+print "ok 9\n";
+
+open STDIN, 'Io_argv1.tmp' or die $!;
+@ARGV = ();
+!eof() or print 'not ';
+print "ok 10\n";
+
+<> eq "ok 6\n" or print 'not ';
+print "ok 11\n";
+
+open STDIN, $devnull or die $!;
+@ARGV = ();
+eof() or print 'not ';
+print "ok 12\n";
+
+@ARGV = ('Io_argv1.tmp');
+!eof() or print 'not ';
+print "ok 13\n";
+
+@ARGV = ($devnull, $devnull);
+!eof() or print 'not ';
+print "ok 14\n";
+
+close ARGV or die $!;
+eof() or print 'not ';
+print "ok 15\n";
+
+{
+ local $/;
+ open F, 'Io_argv1.tmp' or die;
+ <F>; # set $. = 1
+ open F, $devnull or die;
+ print "not " unless defined(<F>);
+ print "ok 16\n";
+ print "not " if defined(<F>);
+ print "ok 17\n";
+ print "not " if defined(<F>);
+ print "ok 18\n";
+ open F, $devnull or die; # restart cycle again
+ print "not " unless defined(<F>);
+ print "ok 19\n";
+ print "not " if defined(<F>);
+ print "ok 20\n";
+ close F;
+}
-END { unlink 'Io.argv.tmp', 'Io.argv.tmp.bak' }
+END { unlink 'Io_argv1.tmp', 'Io_argv1.tmp.bak', 'Io_argv2.tmp', 'Io_argv2.tmp.bak' }
diff --git a/contrib/perl5/t/io/dup.t b/contrib/perl5/t/io/dup.t
index f312671..af13d4d 100755
--- a/contrib/perl5/t/io/dup.t
+++ b/contrib/perl5/t/io/dup.t
@@ -37,3 +37,4 @@ else { system 'cat Io.dup' }
unlink 'Io.dup';
print STDOUT "ok 6\n";
+
diff --git a/contrib/perl5/t/io/fs.t b/contrib/perl5/t/io/fs.t
index f09d66c..970e2f3 100755
--- a/contrib/perl5/t/io/fs.t
+++ b/contrib/perl5/t/io/fs.t
@@ -4,7 +4,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Config;
@@ -12,12 +12,16 @@ use Config;
$Is_Dosish = ($^O eq 'MSWin32' or $^O eq 'dos' or
$^O eq 'os2' or $^O eq 'mint');
-print "1..28\n";
+if (defined &Win32::IsWinNT && Win32::IsWinNT()) {
+ $Is_Dosish = '' if Win32::FsType() eq 'NTFS';
+}
+
+print "1..29\n";
$wd = (($^O eq 'MSWin32') ? `cd` : `pwd`);
chop($wd);
-if ($^O eq 'MSWin32') { `del tmp 2>nul`; `mkdir tmp`; }
+if ($^O eq 'MSWin32') { `rmdir /s /q tmp 2>nul`; `mkdir tmp`; }
else { `rm -f tmp 2>/dev/null; mkdir tmp 2>/dev/null`; }
chdir './tmp';
`/bin/rm -rf a b c x` if -x '/bin/rm';
@@ -54,28 +58,35 @@ elsif (($mode & 0777) == 0666)
{print "ok 5\n";}
else {print "not ok 5\n";}
-if ((chmod 0777,'a') == 1) {print "ok 6\n";} else {print "not ok 6\n";}
+$newmode = $^O eq 'MSWin32' ? 0444 : 0777;
+if ((chmod $newmode,'a') == 1) {print "ok 6\n";} else {print "not ok 6\n";}
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
$blksize,$blocks) = stat('c');
if ($Is_Dosish) {print "ok 7 # skipped: no link\n";}
-elsif (($mode & 0777) == 0777) {print "ok 7\n";}
+elsif (($mode & 0777) == $newmode) {print "ok 7\n";}
else {print "not ok 7\n";}
+$newmode = 0700;
+if ($^O eq 'MSWin32') {
+ chmod 0444, 'x';
+ $newmode = 0666;
+}
+
if ($Is_Dosish) {print "ok 8 # skipped: no link\n";}
-elsif ((chmod 0700,'c','x') == 2) {print "ok 8\n";}
+elsif ((chmod $newmode,'c','x') == 2) {print "ok 8\n";}
else {print "not ok 8\n";}
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
$blksize,$blocks) = stat('c');
if ($Is_Dosish) {print "ok 9 # skipped: no link\n";}
-elsif (($mode & 0777) == 0700) {print "ok 9\n";}
+elsif (($mode & 0777) == $newmode) {print "ok 9\n";}
else {print "not ok 9\n";}
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
$blksize,$blocks) = stat('x');
if ($Is_Dosish) {print "ok 10 # skipped: no link\n";}
-elsif (($mode & 0777) == 0700) {print "ok 10\n";}
+elsif (($mode & 0777) == $newmode) {print "ok 10\n";}
else {print "not ok 10\n";}
if ($Is_Dosish) {print "ok 11 # skipped: no link\n"; unlink 'b','x'; }
@@ -93,6 +104,7 @@ if (rename('a','b')) {print "ok 14\n";} else {print "not ok 14\n";}
$blksize,$blocks) = stat('a');
if ($ino == 0) {print "ok 15\n";} else {print "not ok 15\n";}
$delta = $Is_Dosish ? 2 : 1; # Granularity of time on the filesystem
+chmod 0777, 'b';
$foo = (utime 500000000,500000000 + $delta,'b');
if ($foo == 1) {print "ok 16\n";} else {print "not ok 16 $foo\n";}
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
@@ -141,25 +153,45 @@ else {
truncate "Iofs.tmp", 0;
if (-z "Iofs.tmp") {print "ok 24\n"} else {print "not ok 24\n"}
open(FH, ">Iofs.tmp") or die "Can't create Iofs.tmp";
+ binmode FH;
{ select FH; $| = 1; select STDOUT }
- print FH "helloworld\n";
- truncate FH, 5;
- if ($^O eq 'dos') {
+ {
+ use strict;
+ print FH "x\n" x 200;
+ truncate(FH, 200) or die "Can't truncate FH: $!";
+ }
+ if ($^O eq 'dos'
+ # Not needed on HPFS, but needed on HPFS386 ?!
+ or $^O eq 'os2')
+ {
close (FH); open (FH, ">>Iofs.tmp") or die "Can't reopen Iofs.tmp";
}
- if (-s "Iofs.tmp" == 5) {print "ok 25\n"} else {print "not ok 25\n"}
+ if (-s "Iofs.tmp" == 200) {print "ok 25\n"} else {print "not ok 25\n"}
truncate FH, 0;
- if ($^O eq 'dos') {
+ if ($^O eq 'dos'
+ # Not needed on HPFS, but needed on HPFS386 ?!
+ or $^O eq 'os2')
+ {
close (FH); open (FH, ">>Iofs.tmp") or die "Can't reopen Iofs.tmp";
}
if (-z "Iofs.tmp") {print "ok 26\n"} else {print "not ok 26\n"}
close FH;
}
+# check if rename() can be used to just change case of filename
+chdir './tmp';
+open(fh,'>x') || die "Can't create x";
+close(fh);
+rename('x', 'X');
+print 'not ' unless -e 'X';
+print "ok 27\n";
+unlink 'X';
+chdir $wd || die "Can't cd back to $wd";
+
# check if rename() works on directories
rename 'tmp', 'tmp1' or print "not ";
-print "ok 27\n";
--d 'tmp1' or print "not ";
print "ok 28\n";
+-d 'tmp1' or print "not ";
+print "ok 29\n";
END { rmdir 'tmp1'; unlink "Iofs.tmp"; }
diff --git a/contrib/perl5/t/io/nargv.t b/contrib/perl5/t/io/nargv.t
new file mode 100755
index 0000000..fb13857
--- /dev/null
+++ b/contrib/perl5/t/io/nargv.t
@@ -0,0 +1,63 @@
+#!./perl
+
+print "1..5\n";
+
+my $j = 1;
+for $i ( 1,2,5,4,3 ) {
+ $file = mkfiles($i);
+ open(FH, "> $file") || die "can't create $file: $!";
+ print FH "not ok " . $j++ . "\n";
+ close(FH) || die "Can't close $file: $!";
+}
+
+
+{
+ local *ARGV;
+ local $^I = '.bak';
+ local $_;
+ @ARGV = mkfiles(1..3);
+ $n = 0;
+ while (<>) {
+ print STDOUT "# initial \@ARGV: [@ARGV]\n";
+ if ($n++ == 2) {
+ other();
+ }
+ show();
+ }
+}
+
+$^I = undef;
+@ARGV = mkfiles(1..3);
+$n = 0;
+while (<>) {
+ print STDOUT "#final \@ARGV: [@ARGV]\n";
+ if ($n++ == 2) {
+ other();
+ }
+ show();
+}
+
+sub show {
+ #warn "$ARGV: $_";
+ s/^not //;
+ print;
+}
+
+sub other {
+ print STDOUT "# Calling other\n";
+ local *ARGV;
+ local *ARGVOUT;
+ local $_;
+ @ARGV = mkfiles(5, 4);
+ while (<>) {
+ print STDOUT "# inner \@ARGV: [@ARGV]\n";
+ show();
+ }
+}
+
+sub mkfiles {
+ my @files = map { "scratch$_" } @_;
+ return wantarray ? @files : $files[-1];
+}
+
+END { unlink map { ($_, "$_.bak") } mkfiles(1..5) }
diff --git a/contrib/perl5/t/io/open.t b/contrib/perl5/t/io/open.t
new file mode 100755
index 0000000..30db598
--- /dev/null
+++ b/contrib/perl5/t/io/open.t
@@ -0,0 +1,282 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+# $RCSfile$
+$| = 1;
+use warnings;
+$Is_VMS = $^O eq 'VMS';
+
+print "1..66\n";
+
+my $test = 1;
+
+sub ok { print "ok $test\n"; $test++ }
+
+# my $file tests
+
+# 1..9
+{
+ unlink("afile") if -f "afile";
+ print "$!\nnot " unless open(my $f,"+>afile");
+ ok;
+ binmode $f;
+ print "not " unless -f "afile";
+ ok;
+ print "not " unless print $f "SomeData\n";
+ ok;
+ print "not " unless tell($f) == 9;
+ ok;
+ print "not " unless seek($f,0,0);
+ ok;
+ $b = <$f>;
+ print "not " unless $b eq "SomeData\n";
+ ok;
+ print "not " unless -f $f;
+ ok;
+ eval { die "Message" };
+ # warn $@;
+ print "not " unless $@ =~ /<\$f> line 1/;
+ ok;
+ print "not " unless close($f);
+ ok;
+ unlink("afile");
+}
+
+# 10..12
+{
+ print "# \$!='$!'\nnot " unless open(my $f,'>', 'afile');
+ ok;
+ print $f "a row\n";
+ print "not " unless close($f);
+ ok;
+ print "not " unless -s 'afile' < 10;
+ ok;
+}
+
+# 13..15
+{
+ print "# \$!='$!'\nnot " unless open(my $f,'>>', 'afile');
+ ok;
+ print $f "a row\n";
+ print "not " unless close($f);
+ ok;
+ print "not " unless -s 'afile' > 10;
+ ok;
+}
+
+# 16..18
+{
+ print "# \$!='$!'\nnot " unless open(my $f, '<', 'afile');
+ ok;
+ @rows = <$f>;
+ print "not " unless @rows == 2;
+ ok;
+ print "not " unless close($f);
+ ok;
+}
+
+# 19..23
+{
+ print "not " unless -s 'afile' < 20;
+ ok;
+ print "# \$!='$!'\nnot " unless open(my $f, '+<', 'afile');
+ ok;
+ @rows = <$f>;
+ print "not " unless @rows == 2;
+ ok;
+ seek $f, 0, 1;
+ print $f "yet another row\n";
+ print "not " unless close($f);
+ ok;
+ print "not " unless -s 'afile' > 20;
+ ok;
+
+ unlink("afile");
+}
+
+# 24..26
+if ($Is_VMS) {
+ for (24..26) { print "ok $_ # skipped: not Unix fork\n"; $test++;}
+}
+else {
+ print "# \$!='$!'\nnot " unless open(my $f, '-|', <<'EOC');
+ ./perl -e "print qq(a row\n); print qq(another row\n)"
+EOC
+ ok;
+ @rows = <$f>;
+ print "not " unless @rows == 2;
+ ok;
+ print "not " unless close($f);
+ ok;
+}
+
+# 27..30
+if ($Is_VMS) {
+ for (27..30) { print "ok $_ # skipped: not Unix fork\n"; $test++;}
+}
+else {
+ print "# \$!='$!'\nnot " unless open(my $f, '|-', <<'EOC');
+ ./perl -pe "s/^not //"
+EOC
+ ok;
+ @rows = <$f>;
+ print $f "not ok $test\n"; $test++;
+ print $f "not ok $test\n"; $test++;
+ print "#\nnot " unless close($f);
+ sleep 1;
+ ok;
+}
+
+# 31..32
+eval <<'EOE' and print "not ";
+open my $f, '<&', 'afile';
+1;
+EOE
+ok;
+$@ =~ /Unknown open\(\) mode \'<&\'/ or print "not ";
+ok;
+
+# local $file tests
+
+# 33..41
+{
+ unlink("afile") if -f "afile";
+ print "$!\nnot " unless open(local $f,"+>afile");
+ ok;
+ binmode $f;
+ print "not " unless -f "afile";
+ ok;
+ print "not " unless print $f "SomeData\n";
+ ok;
+ print "not " unless tell($f) == 9;
+ ok;
+ print "not " unless seek($f,0,0);
+ ok;
+ $b = <$f>;
+ print "not " unless $b eq "SomeData\n";
+ ok;
+ print "not " unless -f $f;
+ ok;
+ eval { die "Message" };
+ # warn $@;
+ print "not " unless $@ =~ /<\$f> line 1/;
+ ok;
+ print "not " unless close($f);
+ ok;
+ unlink("afile");
+}
+
+# 42..44
+{
+ print "# \$!='$!'\nnot " unless open(local $f,'>', 'afile');
+ ok;
+ print $f "a row\n";
+ print "not " unless close($f);
+ ok;
+ print "not " unless -s 'afile' < 10;
+ ok;
+}
+
+# 45..47
+{
+ print "# \$!='$!'\nnot " unless open(local $f,'>>', 'afile');
+ ok;
+ print $f "a row\n";
+ print "not " unless close($f);
+ ok;
+ print "not " unless -s 'afile' > 10;
+ ok;
+}
+
+# 48..50
+{
+ print "# \$!='$!'\nnot " unless open(local $f, '<', 'afile');
+ ok;
+ @rows = <$f>;
+ print "not " unless @rows == 2;
+ ok;
+ print "not " unless close($f);
+ ok;
+}
+
+# 51..55
+{
+ print "not " unless -s 'afile' < 20;
+ ok;
+ print "# \$!='$!'\nnot " unless open(local $f, '+<', 'afile');
+ ok;
+ @rows = <$f>;
+ print "not " unless @rows == 2;
+ ok;
+ seek $f, 0, 1;
+ print $f "yet another row\n";
+ print "not " unless close($f);
+ ok;
+ print "not " unless -s 'afile' > 20;
+ ok;
+
+ unlink("afile");
+}
+
+# 56..58
+if ($Is_VMS) {
+ for (56..58) { print "ok $_ # skipped: not Unix fork\n"; $test++;}
+}
+else {
+ print "# \$!='$!'\nnot " unless open(local $f, '-|', <<'EOC');
+ ./perl -e "print qq(a row\n); print qq(another row\n)"
+EOC
+ ok;
+ @rows = <$f>;
+ print "not " unless @rows == 2;
+ ok;
+ print "not " unless close($f);
+ ok;
+}
+
+# 59..62
+if ($Is_VMS) {
+ for (59..62) { print "ok $_ # skipped: not Unix fork\n"; $test++;}
+}
+else {
+ print "# \$!='$!'\nnot " unless open(local $f, '|-', <<'EOC');
+ ./perl -pe "s/^not //"
+EOC
+ ok;
+ @rows = <$f>;
+ print $f "not ok $test\n"; $test++;
+ print $f "not ok $test\n"; $test++;
+ print "#\nnot " unless close($f);
+ sleep 1;
+ ok;
+}
+
+# 63..64
+eval <<'EOE' and print "not ";
+open local $f, '<&', 'afile';
+1;
+EOE
+ok;
+$@ =~ /Unknown open\(\) mode \'<&\'/ or print "not ";
+ok;
+
+# 65..66
+{
+ local *F;
+ for (1..2) {
+ open(F, "echo #foo|") or print "not ";
+ print <F>;
+ close F;
+ }
+ ok;
+ for (1..2) {
+ open(F, "-|", "echo #foo") or print "not ";
+ print <F>;
+ close F;
+ }
+ ok;
+}
diff --git a/contrib/perl5/t/io/openpid.t b/contrib/perl5/t/io/openpid.t
new file mode 100755
index 0000000..80c6bde
--- /dev/null
+++ b/contrib/perl5/t/io/openpid.t
@@ -0,0 +1,86 @@
+#!./perl
+
+#####################################################################
+#
+# Test for process id return value from open
+# Ronald Schmidt (The Software Path) RonaldWS@software-path.com
+#
+#####################################################################
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ if ($^O eq 'dos') {
+ print "1..0 # Skip: no multitasking\n";
+ exit 0;
+ }
+}
+
+
+use FileHandle;
+use Config;
+autoflush STDOUT 1;
+$SIG{PIPE} = 'IGNORE';
+
+print "1..10\n";
+
+$perl = qq[$^X "-I../lib"];
+
+#
+# commands run 4 perl programs. Two of these programs write a
+# short message to STDOUT and exit. Two of these programs
+# read from STDIN. One reader never exits and must be killed.
+# the other reader reads one line, waits a few seconds and then
+# exits to test the waitpid function.
+#
+$cmd1 = qq/$perl -e "use FileHandle; autoflush STDOUT 1; / .
+ qq/print qq[first process\\n]; sleep 30;"/;
+$cmd2 = qq/$perl -e "use FileHandle; autoflush STDOUT 1; / .
+ qq/print qq[second process\\n]; sleep 30;"/;
+$cmd3 = qq/$perl -e "print <>;"/; # hangs waiting for end of STDIN
+$cmd4 = qq/$perl -e "print scalar <>;"/;
+
+#warn "#$cmd1\n#$cmd2\n#$cmd3\n#$cmd4\n";
+
+# start the processes
+$pid1 = open(FH1, "$cmd1 |") or print "not ";
+print "ok 1\n";
+$pid2 = open(FH2, "$cmd2 |") or print "not ";
+print "ok 2\n";
+$pid3 = open(FH3, "| $cmd3") or print "not ";
+print "ok 3\n";
+$pid4 = open(FH4, "| $cmd4") or print "not ";
+print "ok 4\n";
+
+print "# pids were $pid1, $pid2, $pid3, $pid4\n";
+
+my $killsig = 'HUP';
+$killsig = 1 unless $Config{sig_name} =~ /\bHUP\b/;
+
+# get message from first process and kill it
+chomp($from_pid1 = scalar(<FH1>));
+print "# child1 returned [$from_pid1]\nnot "
+ unless $from_pid1 eq 'first process';
+print "ok 5\n";
+$kill_cnt = kill $killsig, $pid1;
+print "not " unless $kill_cnt == 1;
+print "ok 6\n";
+
+# get message from second process and kill second process and reader process
+chomp($from_pid2 = scalar(<FH2>));
+print "# child2 returned [$from_pid2]\nnot "
+ unless $from_pid2 eq 'second process';
+print "ok 7\n";
+$kill_cnt = kill $killsig, $pid2, $pid3;
+print "not " unless $kill_cnt == 2;
+print "ok 8\n";
+
+# send one expected line of text to child process and then wait for it
+autoflush FH4 1;
+print FH4 "ok 9\n";
+print "ok 9 # skip VMS\n" if $^O eq 'VMS';
+print "# waiting for process $pid4 to exit\n";
+$reap_pid = waitpid $pid4, 0;
+print "# reaped pid $reap_pid != $pid4\nnot "
+ unless $reap_pid == $pid4;
+print "ok 10\n";
diff --git a/contrib/perl5/t/io/pipe.t b/contrib/perl5/t/io/pipe.t
index ba7a9b0..4559624 100755
--- a/contrib/perl5/t/io/pipe.t
+++ b/contrib/perl5/t/io/pipe.t
@@ -1,57 +1,65 @@
#!./perl
-# $RCSfile: pipe.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:31 $
-
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
unless ($Config{'d_fork'}) {
- print "1..0\n";
+ print "1..0 # Skip: no fork\n";
exit 0;
}
}
$| = 1;
-print "1..12\n";
+print "1..15\n";
+# External program 'tr' assumed.
open(PIPE, "|-") || (exec 'tr', 'YX', 'ko');
print PIPE "Xk 1\n";
print PIPE "oY 2\n";
close PIPE;
-if (open(PIPE, "-|")) {
- while(<PIPE>) {
- s/^not //;
- print;
+if ($^O eq 'vmesa') {
+ # Doesn't work, yet.
+ for (3..6) {
+ print "ok $_ # skipped\n";
+ }
+} else {
+ if (open(PIPE, "-|")) {
+ while(<PIPE>) {
+ s/^not //;
+ print;
+ }
+ close PIPE; # avoid zombies which disrupt test 12
+ }
+ else {
+ # External program 'echo' assumed.
+ print STDOUT "not ok 3\n";
+ exec 'echo', 'not ok 4';
}
- close PIPE; # avoid zombies which disrupt test 12
-}
-else {
- print STDOUT "not ok 3\n";
- exec 'echo', 'not ok 4';
-}
-pipe(READER,WRITER) || die "Can't open pipe";
+ pipe(READER,WRITER) || die "Can't open pipe";
-if ($pid = fork) {
- close WRITER;
- while(<READER>) {
- s/^not //;
- y/A-Z/a-z/;
- print;
+ if ($pid = fork) {
+ close WRITER;
+ while(<READER>) {
+ s/^not //;
+ y/A-Z/a-z/;
+ print;
+ }
+ close READER; # avoid zombies which disrupt test 12
+ }
+ else {
+ die "Couldn't fork" unless defined $pid;
+ close READER;
+ print WRITER "not ok 5\n";
+ open(STDOUT,">&WRITER") || die "Can't dup WRITER to STDOUT";
+ close WRITER;
+ # External program 'echo' assumed.
+ exec 'echo', 'not ok 6';
}
- close READER; # avoid zombies which disrupt test 12
-}
-else {
- die "Couldn't fork" unless defined $pid;
- close READER;
- print WRITER "not ok 5\n";
- open(STDOUT,">&WRITER") || die "Can't dup WRITER to STDOUT";
- close WRITER;
- exec 'echo', 'not ok 6';
}
-
+wait; # Collect from $pid
pipe(READER,WRITER) || die "Can't open pipe";
close READER;
@@ -72,24 +80,25 @@ print "ok 8\n";
# STDOUT. Someone should modify tests #9 to #12 to work with VMS.
if ($^O eq 'VMS') {
- print "ok 9\n";
- print "ok 10\n";
- print "ok 11\n";
- print "ok 12\n";
+ print "ok 9 # skipped\n";
+ print "ok 10 # skipped\n";
+ print "ok 11 # skipped\n";
+ print "ok 12 # skipped\n";
exit;
}
-if ($Config{d_sfio} || $^O eq machten || $^O eq beos) {
+if ($Config{d_sfio} || $^O eq 'machten' || $^O eq 'beos' || $^O eq 'posix-bc') {
# Sfio doesn't report failure when closing a broken pipe
# that has pending output. Go figure. MachTen doesn't either,
# but won't write to broken pipes, so nothing's pending at close.
# BeOS will not write to broken pipes, either.
- print "ok 9\n";
+ # Nor does POSIX-BC.
+ print "ok 9 # skipped\n";
}
else {
local $SIG{PIPE} = 'IGNORE';
open NIL, '|true' or die "open failed: $!";
- sleep 2;
+ sleep 5;
print NIL 'foo' or die "print failed: $!";
if (close NIL) {
print "not ok 9\n";
@@ -99,6 +108,14 @@ else {
}
}
+if ($^O eq 'vmesa') {
+ # These don't work, yet.
+ print "ok 10 # skipped\n";
+ print "ok 11 # skipped\n";
+ print "ok 12 # skipped\n";
+ exit;
+}
+
# check that errno gets forced to 0 if the piped program exited non-zero
open NIL, '|exit 23;' or die "fork failed: $!";
$! = 1;
@@ -115,21 +132,45 @@ else {
print "ok 10\n";
}
-# check that status for the correct process is collected
-wait; # Collect from $pid
-my $zombie = fork or exit 37;
-my $pipe = open *FH, "sleep 2;exit 13|" or die "Open: $!\n";
-$SIG{ALRM} = sub { return };
-alarm(1);
-my $close = close FH;
-if ($? == 13*256 && ! length $close && ! $!) {
- print "ok 11\n";
-} else {
- print "not ok 11\n# close $close\$?=$? \$!=", $!+0, ":$!\n";
-};
-my $wait = wait;
-if ($? == 37*256 && $wait == $zombie && ! $!) {
- print "ok 12\n";
+if ($^O eq 'mpeix') {
+ print "ok 11 # skipped\n";
+ print "ok 12 # skipped\n";
} else {
- print "not ok 12\n# pid=$wait first=$pid pipe=$pipe zombie=$zombie me=$$ \$?=$? \$!=", $!+0, ":$!\n";
+ # check that status for the correct process is collected
+ my $zombie = fork or exit 37;
+ my $pipe = open *FH, "sleep 2;exit 13|" or die "Open: $!\n";
+ $SIG{ALRM} = sub { return };
+ alarm(1);
+ my $close = close FH;
+ if ($? == 13*256 && ! length $close && ! $!) {
+ print "ok 11\n";
+ } else {
+ print "not ok 11\n# close $close\$?=$? \$!=", $!+0, ":$!\n";
+ };
+ my $wait = wait;
+ if ($? == 37*256 && $wait == $zombie && ! $!) {
+ print "ok 12\n";
+ } else {
+ print "not ok 12\n# pid=$wait first=$pid pipe=$pipe zombie=$zombie me=$$ \$?=$? \$!=", $!+0, ":$!\n";
+ }
+}
+
+# Test new semantics for missing command in piped open
+# 19990114 M-J. Dominus mjd@plover.com
+{ local *P;
+ print (((open P, "| " ) ? "not " : ""), "ok 13\n");
+ print (((open P, " |" ) ? "not " : ""), "ok 14\n");
+}
+
+# check that status is unaffected by implicit close
+{
+ local(*NIL);
+ open NIL, '|exit 23;' or die "fork failed: $!";
+ $? = 42;
+ # NIL implicitly closed here
+}
+if ($? != 42) {
+ print "# status $?, expected 42\nnot ";
}
+print "ok 15\n";
+$? = 0;
diff --git a/contrib/perl5/t/io/print.t b/contrib/perl5/t/io/print.t
index 180b1e8..0578ee6 100755
--- a/contrib/perl5/t/io/print.t
+++ b/contrib/perl5/t/io/print.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: print.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:32 $
-
-print "1..16\n";
+print "1..18\n";
$foo = 'STDOUT';
print $foo "ok 1\n";
@@ -30,3 +28,7 @@ print "ok","11";
@x = ("ok","12\nok","13\nok");
@y = ("15\nok","16");
print @x,"14\nok",@y;
+{
+ local $\ = "ok 17\n# null =>[\000]\nok 18\n";
+ print "";
+}
diff --git a/contrib/perl5/t/io/tell.t b/contrib/perl5/t/io/tell.t
index 83904e8..b89aefb 100755
--- a/contrib/perl5/t/io/tell.t
+++ b/contrib/perl5/t/io/tell.t
@@ -1,13 +1,16 @@
#!./perl
-# $RCSfile: tell.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:33 $
+# $RCSfile: tell.t,v $$Revision$$Date$
-print "1..13\n";
+print "1..21\n";
$TST = 'tst';
+$Is_Dosish = ($^O eq 'MSWin32' or $^O eq 'dos' or
+ $^O eq 'os2' or $^O eq 'mint' or $^O eq 'cygwin');
+
open($TST, '../Configure') || (die "Can't open ../Configure");
-binmode $TST if $^O eq 'MSWin32';
+binmode $TST if $Is_Dosish;
if (eof(tst)) { print "not ok 1\n"; } else { print "ok 1\n"; }
$firstline = <$TST>;
@@ -42,3 +45,40 @@ if (seek(tst,0,2)) { print "ok 11\n"; } else { print "not ok 11\n"; }
if ($lastpos == tell) { print "ok 12\n"; } else { print "not ok 12\n"; }
unless (eof) { print "not ok 13\n"; } else { print "ok 13\n"; }
+
+if ($. == 0) { print "not ok 14\n"; } else { print "ok 14\n"; }
+
+$curline = $.;
+open(other, '../Configure') || (die "Can't open ../Configure");
+binmode other if $^O eq 'MSWin32';
+
+{
+ local($.);
+
+ if ($. == 0) { print "not ok 15\n"; } else { print "ok 15\n"; }
+
+ tell other;
+ if ($. == 0) { print "ok 16\n"; } else { print "not ok 16\n"; }
+
+ $. = 5;
+ scalar <other>;
+ if ($. == 6) { print "ok 17\n"; } else { print "not ok 17\n"; }
+}
+
+if ($. == $curline) { print "ok 18\n"; } else { print "not ok 18\n"; }
+
+{
+ local($.);
+
+ scalar <other>;
+ if ($. == 7) { print "ok 19\n"; } else { print "not ok 19\n"; }
+}
+
+if ($. == $curline) { print "ok 20\n"; } else { print "not ok 20\n"; }
+
+{
+ local($.);
+
+ tell other;
+ if ($. == 7) { print "ok 21\n"; } else { print "not ok 21\n"; }
+}
diff --git a/contrib/perl5/t/lib/abbrev.t b/contrib/perl5/t/lib/abbrev.t
index fb5a984..05e5c70 100755
--- a/contrib/perl5/t/lib/abbrev.t
+++ b/contrib/perl5/t/lib/abbrev.t
@@ -4,7 +4,7 @@ print "1..7\n";
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Text::Abbrev;
diff --git a/contrib/perl5/t/lib/ansicolor.t b/contrib/perl5/t/lib/ansicolor.t
new file mode 100755
index 0000000..3e16dce
--- /dev/null
+++ b/contrib/perl5/t/lib/ansicolor.t
@@ -0,0 +1,73 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+# Test suite for the Term::ANSIColor Perl module. Before `make install' is
+# performed this script should be runnable with `make test'. After `make
+# install' it should work as `perl test.pl'.
+
+############################################################################
+# Ensure module can be loaded
+############################################################################
+
+BEGIN { $| = 1; print "1..7\n" }
+END { print "not ok 1\n" unless $loaded }
+use Term::ANSIColor qw(:constants color colored);
+$loaded = 1;
+print "ok 1\n";
+
+
+############################################################################
+# Test suite
+############################################################################
+
+# Test simple color attributes.
+if (color ('blue on_green', 'bold') eq "\e[34;42;1m") {
+ print "ok 2\n";
+} else {
+ print "not ok 2\n";
+}
+
+# Test colored.
+if (colored ("testing", 'blue', 'bold') eq "\e[34;1mtesting\e[0m") {
+ print "ok 3\n";
+} else {
+ print "not ok 3\n";
+}
+
+# Test the constants.
+if (BLUE BOLD "testing" eq "\e[34m\e[1mtesting") {
+ print "ok 4\n";
+} else {
+ print "not ok 4\n";
+}
+
+# Test AUTORESET.
+$Term::ANSIColor::AUTORESET = 1;
+if (BLUE BOLD "testing" eq "\e[34m\e[1mtesting\e[0m\e[0m") {
+ print "ok 5\n";
+} else {
+ print "not ok 5\n";
+}
+
+# Test EACHLINE.
+$Term::ANSIColor::EACHLINE = "\n";
+if (colored ("test\n\ntest", 'bold')
+ eq "\e[1mtest\e[0m\n\n\e[1mtest\e[0m") {
+ print "ok 6\n";
+} else {
+ print colored ("test\n\ntest", 'bold'), "\n";
+ print "not ok 6\n";
+}
+
+# Test EACHLINE with multiple trailing delimiters.
+$Term::ANSIColor::EACHLINE = "\r\n";
+if (colored ("test\ntest\r\r\n\r\n", 'bold')
+ eq "\e[1mtest\ntest\r\e[0m\r\n\r\n") {
+ print "ok 7\n";
+} else {
+ print "not ok 7\n";
+}
diff --git a/contrib/perl5/t/lib/anydbm.t b/contrib/perl5/t/lib/anydbm.t
index 0391b7b..e38c7e7 100755
--- a/contrib/perl5/t/lib/anydbm.t
+++ b/contrib/perl5/t/lib/anydbm.t
@@ -4,7 +4,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
require AnyDBM_File;
#If Fcntl is not available, try 0x202 or 0x102 for O_RDWR|O_CREAT
@@ -12,6 +12,9 @@ use Fcntl;
print "1..12\n";
+$Is_Dosish = ($^O eq 'amigaos' || $^O eq 'MSWin32' or $^O eq 'dos' or
+ $^O eq 'os2' or $^O eq 'mint');
+
unlink <Op_dbmx*>;
umask(0);
@@ -22,7 +25,7 @@ $Dfile = "Op_dbmx.pag";
if (! -e $Dfile) {
($Dfile) = <Op_dbmx*>;
}
-if ($^O eq 'amigaos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'dos') {
+if ($Is_Dosish) {
print "ok 2 # Skipped: different file permission semantics\n";
}
else {
@@ -115,7 +118,30 @@ print ($size > 0 ? "ok 9\n" : "not ok 9\n");
print join(':',200..400) eq join(':',@foo) ? "ok 10\n" : "not ok 10\n";
print ($h{'foo'} eq '' ? "ok 11\n" : "not ok 11\n");
-print ($h{''} eq 'bar' ? "ok 12\n" : "not ok 12\n");
+if ($h{''} eq 'bar') {
+ print "ok 12\n" ;
+}
+else {
+ if ($AnyDBM_File::ISA[0] eq 'DB_File' && $DB_File::db_ver >= 2.004010) {
+ ($major, $minor, $patch) = ($DB_File::db_ver =~ /^(\d+)\.(\d\d\d)(\d\d\d)/) ;
+ $major =~ s/^0+// ;
+ $minor =~ s/^0+// ;
+ $patch =~ s/^0+// ;
+ $compact = "$major.$minor.$patch" ;
+ #
+ # anydbm.t test 12 will fail when AnyDBM_File uses the combination of
+ # DB_File and Berkeley DB 2.4.10 (or greater).
+ # You are using DB_File $DB_File::VERSION and Berkeley DB $compact
+ #
+ # Berkeley DB 2 from version 2.4.10 onwards does not allow null keys.
+ # This feature will be reenabled in a future version of Berkeley DB.
+ #
+ print "ok 12 # skipped: db v$compact, no null key support\n" ;
+ }
+ else {
+ print "not ok 12\n" ;
+ }
+}
untie %h;
if ($^O eq 'VMS') {
diff --git a/contrib/perl5/t/lib/attrs.t b/contrib/perl5/t/lib/attrs.t
new file mode 100755
index 0000000..eb8c8c4
--- /dev/null
+++ b/contrib/perl5/t/lib/attrs.t
@@ -0,0 +1,138 @@
+#!./perl
+
+# Regression tests for attrs.pm and the C<sub x : attrs> syntax.
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ eval 'require attrs; 1' or do {
+ print "1..0\n";
+ exit 0;
+ }
+}
+
+sub NTESTS () ;
+
+my $test, $ntests;
+BEGIN {$ntests=0}
+$test=0;
+my $failed = 0;
+
+print "1..".NTESTS."\n";
+
+eval 'sub t1 ($) { use attrs "locked"; $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub t2 { use attrs "locked"; $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub t3 ($) : locked ;';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub t4 : locked ;';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my $anon1;
+eval '$anon1 = sub ($) { use attrs qw(locked method); $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my $anon2;
+eval '$anon2 = sub { use attrs qw(locked method); $_[0]++ }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my $anon3;
+eval '$anon3 = sub { use attrs "method"; $_[0]->[1] }';
+(print "not "), $failed=1 if $@;
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+my @attrs = attrs::get($anon3 ? $anon3 : \&ns);
+(print "not "), $failed=1 unless "@attrs" eq "method";
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+@attrs = sort +attrs::get($anon2 ? $anon2 : \&ns);
+(print "not "), $failed=1 unless "@attrs" eq "locked method";
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+@attrs = sort +attrs::get($anon1 ? $anon1 : \&ns);
+(print "not "), $failed=1 unless "@attrs" eq "locked method";
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e1 ($) : plugh ;';
+unless ($@ && $@ =~ m/^Invalid CODE attribute: ["']?plugh["']? at/) {
+ my $x = $@;
+ $x =~ s/\n.*\z//s;
+ print "# $x\n";
+ print "not ";
+ $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e2 ($) : plugh(0,0) xyzzy ;';
+unless ($@ && $@ =~ m/^Invalid CODE attributes: ["']?plugh\(0,0\)["']? /) {
+ my $x = $@;
+ $x =~ s/\n.*\z//s;
+ print "# $x\n";
+ print "not ";
+ $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e3 ($) : plugh(0,0 xyzzy ;';
+unless ($@ && $@ =~ m/Unterminated attribute parameter in attribute list at/) {
+ my $x = $@;
+ $x =~ s/\n.*\z//s;
+ print "# $x\n";
+ print "not ";
+ $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+eval 'sub e4 ($) : plugh + xyzzy ;';
+unless ($@ && $@ =~ m/Invalid separator character '[+]' in attribute list at/) {
+ my $x = $@;
+ $x =~ s/\n.*\z//s;
+ print "# $x\n";
+ print "not ";
+ $failed = 1;
+}
+print "ok ",++$test,"\n";
+BEGIN {++$ntests}
+
+{
+ my $w = "" ;
+ local $SIG{__WARN__} = sub {$w = @_[0]} ;
+ eval 'sub w1 ($) { use warnings "deprecated"; use attrs "locked"; $_[0]++ }';
+ (print "not "), $failed=1 if $@;
+ print "ok ",++$test,"\n";
+ BEGIN {++$ntests}
+ (print "not "), $failed=1
+ if $w !~ /^pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead at/;
+ print "ok ",++$test,"\n";
+ BEGIN {++$ntests}
+}
+
+
+# Other tests should be added above this line
+
+sub NTESTS () { $ntests }
+
+exit $failed;
diff --git a/contrib/perl5/t/lib/autoloader.t b/contrib/perl5/t/lib/autoloader.t
index b1622a8..3bf690b 100755
--- a/contrib/perl5/t/lib/autoloader.t
+++ b/contrib/perl5/t/lib/autoloader.t
@@ -3,10 +3,10 @@
BEGIN {
chdir 't' if -d 't';
$dir = "auto-$$";
- @INC = ("./$dir", "../lib");
+ unshift @INC, ("./$dir", "../lib");
}
-print "1..9\n";
+print "1..11\n";
# First we must set up some autoloader files
mkdir $dir, 0755 or die "Can't mkdir $dir: $!";
@@ -88,12 +88,33 @@ print "ok 8\n";
print "not " unless $foo->bazmarkhianish($1) eq 'foo';
print "ok 9\n";
+# test recursive autoloads
+open(F, ">$dir/auto/Foo/a.al") or die;
+print F <<'EOT';
+package Foo;
+BEGIN { b() }
+sub a { print "ok 11\n"; }
+1;
+EOT
+close(F);
+
+open(F, ">$dir/auto/Foo/b.al") or die;
+print F <<'EOT';
+package Foo;
+sub b { print "ok 10\n"; }
+1;
+EOT
+close(F);
+Foo::a();
+
# cleanup
END {
return unless $dir && -d $dir;
unlink "$dir/auto/Foo/foo.al";
unlink "$dir/auto/Foo/bar.al";
unlink "$dir/auto/Foo/bazmarkhian.al";
+unlink "$dir/auto/Foo/a.al";
+unlink "$dir/auto/Foo/b.al";
rmdir "$dir/auto/Foo";
rmdir "$dir/auto";
rmdir "$dir";
diff --git a/contrib/perl5/t/lib/basename.t b/contrib/perl5/t/lib/basename.t
index a02aa32..478e26a 100755
--- a/contrib/perl5/t/lib/basename.t
+++ b/contrib/perl5/t/lib/basename.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use File::Basename qw(fileparse basename dirname);
diff --git a/contrib/perl5/t/lib/bigfloat.t b/contrib/perl5/t/lib/bigfloat.t
new file mode 100755
index 0000000..8e0a0ef
--- /dev/null
+++ b/contrib/perl5/t/lib/bigfloat.t
@@ -0,0 +1,408 @@
+#!./perl
+
+BEGIN { @INC = '../lib' }
+require "bigfloat.pl";
+
+$test = 0;
+$| = 1;
+print "1..355\n";
+while (<DATA>) {
+ chop;
+ if (/^&/) {
+ $f = $_;
+ } elsif (/^\$.*/) {
+ eval "$_;";
+ } else {
+ ++$test;
+ @args = split(/:/,$_,99);
+ $ans = pop(@args);
+ $try = "$f('" . join("','", @args) . "');";
+ if (($ans1 = eval($try)) eq $ans) {
+ print "ok $test\n";
+ } else {
+ print "not ok $test\n";
+ print "# '$try' expected: '$ans' got: '$ans1'\n";
+ }
+ }
+}
+__END__
+&fnorm
+abc:NaN
+ 1 a:NaN
+1bcd2:NaN
+11111b:NaN
++1z:NaN
+-1z:NaN
+0:+0E+0
++0:+0E+0
++00:+0E+0
++0 0 0:+0E+0
+000000 0000000 00000:+0E+0
+-0:+0E+0
+-0000:+0E+0
++1:+1E+0
++01:+1E+0
++001:+1E+0
++00000100000:+1E+5
+123456789:+123456789E+0
+-1:-1E+0
+-01:-1E+0
+-001:-1E+0
+-123456789:-123456789E+0
+-00000100000:-1E+5
+123.456a:NaN
+123.456:+123456E-3
+0.01:+1E-2
+.002:+2E-3
+-0.0003:-3E-4
+-.0000000004:-4E-10
+123456E2:+123456E+2
+123456E-2:+123456E-2
+-123456E2:-123456E+2
+-123456E-2:-123456E-2
+1e1:+1E+1
+2e-11:+2E-11
+-3e111:-3E+111
+-4e-1111:-4E-1111
+&fneg
+abd:NaN
++0:+0E+0
++1:-1E+0
+-1:+1E+0
++123456789:-123456789E+0
+-123456789:+123456789E+0
++123.456789:-123456789E-6
+-123456.789:+123456789E-3
+&fabs
+abc:NaN
++0:+0E+0
++1:+1E+0
+-1:+1E+0
++123456789:+123456789E+0
+-123456789:+123456789E+0
++123.456789:+123456789E-6
+-123456.789:+123456789E-3
+&fround
+$bigfloat::rnd_mode = 'trunc'
++10123456789:5:+10123E+6
+-10123456789:5:-10123E+6
++10123456789:9:+101234567E+2
+-10123456789:9:-101234567E+2
++101234500:6:+101234E+3
+-101234500:6:-101234E+3
+$bigfloat::rnd_mode = 'zero'
++20123456789:5:+20123E+6
+-20123456789:5:-20123E+6
++20123456789:9:+201234568E+2
+-20123456789:9:-201234568E+2
++201234500:6:+201234E+3
+-201234500:6:-201234E+3
+$bigfloat::rnd_mode = '+inf'
++30123456789:5:+30123E+6
+-30123456789:5:-30123E+6
++30123456789:9:+301234568E+2
+-30123456789:9:-301234568E+2
++301234500:6:+301235E+3
+-301234500:6:-301234E+3
+$bigfloat::rnd_mode = '-inf'
++40123456789:5:+40123E+6
+-40123456789:5:-40123E+6
++40123456789:9:+401234568E+2
+-40123456789:9:-401234568E+2
++401234500:6:+401234E+3
+-401234500:6:-401235E+3
+$bigfloat::rnd_mode = 'odd'
++50123456789:5:+50123E+6
+-50123456789:5:-50123E+6
++50123456789:9:+501234568E+2
+-50123456789:9:-501234568E+2
++501234500:6:+501235E+3
+-501234500:6:-501235E+3
+$bigfloat::rnd_mode = 'even'
++60123456789:5:+60123E+6
+-60123456789:5:-60123E+6
++60123456789:9:+601234568E+2
+-60123456789:9:-601234568E+2
++601234500:6:+601234E+3
+-601234500:6:-601234E+3
+&ffround
+$bigfloat::rnd_mode = 'trunc'
++1.23:-1:+12E-1
+-1.23:-1:-12E-1
++1.27:-1:+12E-1
+-1.27:-1:-12E-1
++1.25:-1:+12E-1
+-1.25:-1:-12E-1
++1.35:-1:+13E-1
+-1.35:-1:-13E-1
+-0.006:-1:+0E+0
+-0.006:-2:+0E+0
+$bigfloat::rnd_mode = 'zero'
++2.23:-1:+22E-1
+-2.23:-1:-22E-1
++2.27:-1:+23E-1
+-2.27:-1:-23E-1
++2.25:-1:+22E-1
+-2.25:-1:-22E-1
++2.35:-1:+23E-1
+-2.35:-1:-23E-1
+-0.0065:-1:+0E+0
+-0.0065:-2:-1E-2
+-0.0065:-3:-6E-3
+-0.0065:-4:-65E-4
+-0.0065:-5:-65E-4
+$bigfloat::rnd_mode = '+inf'
++3.23:-1:+32E-1
+-3.23:-1:-32E-1
++3.27:-1:+33E-1
+-3.27:-1:-33E-1
++3.25:-1:+33E-1
+-3.25:-1:-32E-1
++3.35:-1:+34E-1
+-3.35:-1:-33E-1
+-0.0065:-1:+0E+0
+-0.0065:-2:-1E-2
+-0.0065:-3:-6E-3
+-0.0065:-4:-65E-4
+-0.0065:-5:-65E-4
+$bigfloat::rnd_mode = '-inf'
++4.23:-1:+42E-1
+-4.23:-1:-42E-1
++4.27:-1:+43E-1
+-4.27:-1:-43E-1
++4.25:-1:+42E-1
+-4.25:-1:-43E-1
++4.35:-1:+43E-1
+-4.35:-1:-44E-1
+-0.0065:-1:+0E+0
+-0.0065:-2:-1E-2
+-0.0065:-3:-7E-3
+-0.0065:-4:-65E-4
+-0.0065:-5:-65E-4
+$bigfloat::rnd_mode = 'odd'
++5.23:-1:+52E-1
+-5.23:-1:-52E-1
++5.27:-1:+53E-1
+-5.27:-1:-53E-1
++5.25:-1:+53E-1
+-5.25:-1:-53E-1
++5.35:-1:+53E-1
+-5.35:-1:-53E-1
+-0.0065:-1:+0E+0
+-0.0065:-2:-1E-2
+-0.0065:-3:-7E-3
+-0.0065:-4:-65E-4
+-0.0065:-5:-65E-4
+$bigfloat::rnd_mode = 'even'
++6.23:-1:+62E-1
+-6.23:-1:-62E-1
++6.27:-1:+63E-1
+-6.27:-1:-63E-1
++6.25:-1:+62E-1
+-6.25:-1:-62E-1
++6.35:-1:+64E-1
+-6.35:-1:-64E-1
+-0.0065:-1:+0E+0
+-0.0065:-2:-1E-2
+-0.0065:-3:-6E-3
+-0.0065:-4:-65E-4
+-0.0065:-5:-65E-4
+&fcmp
+abc:abc:
+abc:+0:
++0:abc:
++0:+0:0
+-1:+0:-1
++0:-1:1
++1:+0:1
++0:+1:-1
+-1:+1:-1
++1:-1:1
+-1:-1:0
++1:+1:0
++123:+123:0
++123:+12:1
++12:+123:-1
+-123:-123:0
+-123:-12:-1
+-12:-123:1
++123:+124:-1
++124:+123:1
+-123:-124:1
+-124:-123:-1
+&fadd
+abc:abc:NaN
+abc:+0:NaN
++0:abc:NaN
++0:+0:+0E+0
++1:+0:+1E+0
++0:+1:+1E+0
++1:+1:+2E+0
+-1:+0:-1E+0
++0:-1:-1E+0
+-1:-1:-2E+0
+-1:+1:+0E+0
++1:-1:+0E+0
++9:+1:+1E+1
++99:+1:+1E+2
++999:+1:+1E+3
++9999:+1:+1E+4
++99999:+1:+1E+5
++999999:+1:+1E+6
++9999999:+1:+1E+7
++99999999:+1:+1E+8
++999999999:+1:+1E+9
++9999999999:+1:+1E+10
++99999999999:+1:+1E+11
++10:-1:+9E+0
++100:-1:+99E+0
++1000:-1:+999E+0
++10000:-1:+9999E+0
++100000:-1:+99999E+0
++1000000:-1:+999999E+0
++10000000:-1:+9999999E+0
++100000000:-1:+99999999E+0
++1000000000:-1:+999999999E+0
++10000000000:-1:+9999999999E+0
++123456789:+987654321:+111111111E+1
+-123456789:+987654321:+864197532E+0
+-123456789:-987654321:-111111111E+1
++123456789:-987654321:-864197532E+0
+&fsub
+abc:abc:NaN
+abc:+0:NaN
++0:abc:NaN
++0:+0:+0E+0
++1:+0:+1E+0
++0:+1:-1E+0
++1:+1:+0E+0
+-1:+0:-1E+0
++0:-1:+1E+0
+-1:-1:+0E+0
+-1:+1:-2E+0
++1:-1:+2E+0
++9:+1:+8E+0
++99:+1:+98E+0
++999:+1:+998E+0
++9999:+1:+9998E+0
++99999:+1:+99998E+0
++999999:+1:+999998E+0
++9999999:+1:+9999998E+0
++99999999:+1:+99999998E+0
++999999999:+1:+999999998E+0
++9999999999:+1:+9999999998E+0
++99999999999:+1:+99999999998E+0
++10:-1:+11E+0
++100:-1:+101E+0
++1000:-1:+1001E+0
++10000:-1:+10001E+0
++100000:-1:+100001E+0
++1000000:-1:+1000001E+0
++10000000:-1:+10000001E+0
++100000000:-1:+100000001E+0
++1000000000:-1:+1000000001E+0
++10000000000:-1:+10000000001E+0
++123456789:+987654321:-864197532E+0
+-123456789:+987654321:-111111111E+1
+-123456789:-987654321:+864197532E+0
++123456789:-987654321:+111111111E+1
+&fmul
+abc:abc:NaN
+abc:+0:NaN
++0:abc:NaN
++0:+0:+0E+0
++0:+1:+0E+0
++1:+0:+0E+0
++0:-1:+0E+0
+-1:+0:+0E+0
++123456789123456789:+0:+0E+0
++0:+123456789123456789:+0E+0
+-1:-1:+1E+0
+-1:+1:-1E+0
++1:-1:-1E+0
++1:+1:+1E+0
++2:+3:+6E+0
+-2:+3:-6E+0
++2:-3:-6E+0
+-2:-3:+6E+0
++111:+111:+12321E+0
++10101:+10101:+102030201E+0
++1001001:+1001001:+1002003002001E+0
++100010001:+100010001:+10002000300020001E+0
++10000100001:+10000100001:+100002000030000200001E+0
++11111111111:+9:+99999999999E+0
++22222222222:+9:+199999999998E+0
++33333333333:+9:+299999999997E+0
++44444444444:+9:+399999999996E+0
++55555555555:+9:+499999999995E+0
++66666666666:+9:+599999999994E+0
++77777777777:+9:+699999999993E+0
++88888888888:+9:+799999999992E+0
++99999999999:+9:+899999999991E+0
+&fdiv
+abc:abc:NaN
+abc:+1:abc:NaN
++1:abc:NaN
++0:+0:NaN
++0:+1:+0E+0
++1:+0:NaN
++0:-1:+0E+0
+-1:+0:NaN
++1:+1:+1E+0
+-1:-1:+1E+0
++1:-1:-1E+0
+-1:+1:-1E+0
++1:+2:+5E-1
++2:+1:+2E+0
++10:+5:+2E+0
++100:+4:+25E+0
++1000:+8:+125E+0
++10000:+16:+625E+0
++10000:-16:-625E+0
++999999999999:+9:+111111111111E+0
++999999999999:+99:+10101010101E+0
++999999999999:+999:+1001001001E+0
++999999999999:+9999:+100010001E+0
++999999999999999:+99999:+10000100001E+0
++1000000000:+9:+1111111111111111111111111111111111111111E-31
++2000000000:+9:+2222222222222222222222222222222222222222E-31
++3000000000:+9:+3333333333333333333333333333333333333333E-31
++4000000000:+9:+4444444444444444444444444444444444444444E-31
++5000000000:+9:+5555555555555555555555555555555555555556E-31
++6000000000:+9:+6666666666666666666666666666666666666667E-31
++7000000000:+9:+7777777777777777777777777777777777777778E-31
++8000000000:+9:+8888888888888888888888888888888888888889E-31
++9000000000:+9:+1E+9
++35500000:+113:+3141592920353982300884955752212389380531E-34
++71000000:+226:+3141592920353982300884955752212389380531E-34
++106500000:+339:+3141592920353982300884955752212389380531E-34
++1000000000:+3:+3333333333333333333333333333333333333333E-31
+$bigfloat::div_scale = 20
++1000000000:+9:+11111111111111111111E-11
++2000000000:+9:+22222222222222222222E-11
++3000000000:+9:+33333333333333333333E-11
++4000000000:+9:+44444444444444444444E-11
++5000000000:+9:+55555555555555555556E-11
++6000000000:+9:+66666666666666666667E-11
++7000000000:+9:+77777777777777777778E-11
++8000000000:+9:+88888888888888888889E-11
++9000000000:+9:+1E+9
++35500000:+113:+314159292035398230088E-15
++71000000:+226:+314159292035398230088E-15
++106500000:+339:+31415929203539823009E-14
++1000000000:+3:+33333333333333333333E-11
+$bigfloat::div_scale = 40
+&fsqrt
++0:+0E+0
+-1:NaN
+-2:NaN
+-16:NaN
+-123.456:NaN
++1:+1E+0
++1.44:+12E-1
++2:+141421356237309504880168872420969807857E-38
++4:+2E+0
++16:+4E+0
++100:+1E+1
++123.456:+1111107555549866648462149404118219234119E-38
++15241.383936:+123456E-3
diff --git a/contrib/perl5/t/lib/bigfltpm.t b/contrib/perl5/t/lib/bigfltpm.t
new file mode 100755
index 0000000..5d97f1b
--- /dev/null
+++ b/contrib/perl5/t/lib/bigfltpm.t
@@ -0,0 +1,463 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+use Math::BigFloat;
+
+$test = 0;
+$| = 1;
+print "1..362\n";
+while (<DATA>) {
+ chop;
+ if (s/^&//) {
+ $f = $_;
+ } elsif (/^\$.*/) {
+ eval "$_;";
+ } else {
+ ++$test;
+ if (m|^(.*?):(/.+)$|) {
+ $ans = $2;
+ @args = split(/:/,$1,99);
+ }
+ else {
+ @args = split(/:/,$_,99);
+ $ans = pop(@args);
+ }
+ $try = "\$x = new Math::BigFloat \"$args[0]\";";
+ if ($f eq "fnorm"){
+ $try .= "\$x+0;";
+ } elsif ($f eq "fneg") {
+ $try .= "-\$x;";
+ } elsif ($f eq "fabs") {
+ $try .= "abs \$x;";
+ } elsif ($f eq "fround") {
+ $try .= "0+\$x->fround($args[1]);";
+ } elsif ($f eq "ffround") {
+ $try .= "0+\$x->ffround($args[1]);";
+ } elsif ($f eq "fsqrt") {
+ $try .= "0+\$x->fsqrt;";
+ } else {
+ $try .= "\$y = new Math::BigFloat \"$args[1]\";";
+ if ($f eq "fcmp") {
+ $try .= "\$x <=> \$y;";
+ } elsif ($f eq "fadd") {
+ $try .= "\$x + \$y;";
+ } elsif ($f eq "fsub") {
+ $try .= "\$x - \$y;";
+ } elsif ($f eq "fmul") {
+ $try .= "\$x * \$y;";
+ } elsif ($f eq "fdiv") {
+ $try .= "\$x / \$y;";
+ } else { warn "Unknown op"; }
+ }
+ #print ">>>",$try,"<<<\n";
+ $ans1 = eval $try;
+ if ($ans =~ m|^/(.*)$|) {
+ my $pat = $1;
+ if ($ans1 =~ /$pat/) {
+ print "ok $test\n";
+ }
+ else {
+ print "not ok $test\n";
+ print "# '$try' expected: /$pat/ got: '$ans1'\n";
+ }
+ }
+ elsif ("$ans1" eq $ans) { #bug!
+ print "ok $test\n";
+ } else {
+ print "not ok $test\n";
+ print "# '$try' expected: '$ans' got: '$ans1'\n";
+ }
+ }
+}
+__END__
+&fnorm
+abc:NaN.
+ 1 a:NaN.
+1bcd2:NaN.
+11111b:NaN.
++1z:NaN.
+-1z:NaN.
+0:0.
++0:0.
++00:0.
++0 0 0:0.
+000000 0000000 00000:0.
+-0:0.
+-0000:0.
++1:1.
++01:1.
++001:1.
++00000100000:100000.
+123456789:123456789.
+-1:-1.
+-01:-1.
+-001:-1.
+-123456789:-123456789.
+-00000100000:-100000.
+123.456a:NaN.
+123.456:123.456
+0.01:.01
+.002:.002
+-0.0003:-.0003
+-.0000000004:-.0000000004
+123456E2:12345600.
+123456E-2:1234.56
+-123456E2:-12345600.
+-123456E-2:-1234.56
+1e1:10.
+2e-11:.00000000002
+-3e111:-3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.
+-4e-1111:-.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
+&fneg
+abd:NaN.
++0:0.
++1:-1.
+-1:1.
++123456789:-123456789.
+-123456789:123456789.
++123.456789:-123.456789
+-123456.789:123456.789
+&fabs
+abc:NaN.
++0:0.
++1:1.
+-1:1.
++123456789:123456789.
+-123456789:123456789.
++123.456789:123.456789
+-123456.789:123456.789
+&fround
+$Math::BigFloat::rnd_mode = 'trunc'
++10123456789:5:10123000000
+-10123456789:5:-10123000000
++10123456789:9:10123456700
+-10123456789:9:-10123456700
++101234500:6:101234000
+-101234500:6:-101234000
+$Math::BigFloat::rnd_mode = 'zero'
++20123456789:5:20123000000
+-20123456789:5:-20123000000
++20123456789:9:20123456800
+-20123456789:9:-20123456800
++201234500:6:201234000
+-201234500:6:-201234000
+$Math::BigFloat::rnd_mode = '+inf'
++30123456789:5:30123000000
+-30123456789:5:-30123000000
++30123456789:9:30123456800
+-30123456789:9:-30123456800
++301234500:6:301235000
+-301234500:6:-301234000
+$Math::BigFloat::rnd_mode = '-inf'
++40123456789:5:40123000000
+-40123456789:5:-40123000000
++40123456789:9:40123456800
+-40123456789:9:-40123456800
++401234500:6:401234000
+-401234500:6:-401235000
+$Math::BigFloat::rnd_mode = 'odd'
++50123456789:5:50123000000
+-50123456789:5:-50123000000
++50123456789:9:50123456800
+-50123456789:9:-50123456800
++501234500:6:501235000
+-501234500:6:-501235000
+$Math::BigFloat::rnd_mode = 'even'
++60123456789:5:60123000000
+-60123456789:5:-60123000000
++60123456789:9:60123456800
+-60123456789:9:-60123456800
++601234500:6:601234000
+-601234500:6:-601234000
+&ffround
+$Math::BigFloat::rnd_mode = 'trunc'
++1.23:-1:1.2
+-1.23:-1:-1.2
++1.27:-1:1.2
+-1.27:-1:-1.2
++1.25:-1:1.2
+-1.25:-1:-1.2
++1.35:-1:1.3
+-1.35:-1:-1.3
+-0.006:-1:0
+-0.006:-2:0
+-0.0065:-3:/-0\.006|-6e-03
+-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+$Math::BigFloat::rnd_mode = 'zero'
++2.23:-1:/2.2(?:0{5}\d+)?
+-2.23:-1:/-2.2(?:0{5}\d+)?
++2.27:-1:/2.(?:3|29{5}\d+)
+-2.27:-1:/-2.(?:3|29{5}\d+)
++2.25:-1:/2.2(?:0{5}\d+)?
+-2.25:-1:/-2.2(?:0{5}\d+)?
++2.35:-1:/2.(?:3|29{5}\d+)
+-2.35:-1:/-2.(?:3|29{5}\d+)
+-0.0065:-1:0
+-0.0065:-2:/-0\.01|-1e-02
+-0.0065:-3:/-0\.006|-6e-03
+-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+$Math::BigFloat::rnd_mode = '+inf'
++3.23:-1:/3.2(?:0{5}\d+)?
+-3.23:-1:/-3.2(?:0{5}\d+)?
++3.27:-1:/3.(?:3|29{5}\d+)
+-3.27:-1:/-3.(?:3|29{5}\d+)
++3.25:-1:/3.(?:3|29{5}\d+)
+-3.25:-1:/-3.2(?:0{5}\d+)?
++3.35:-1:/3.(?:4|39{5}\d+)
+-3.35:-1:/-3.(?:3|29{5}\d+)
+-0.0065:-1:0
+-0.0065:-2:/-0\.01|-1e-02
+-0.0065:-3:/-0\.006|-6e-03
+-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+$Math::BigFloat::rnd_mode = '-inf'
++4.23:-1:/4.2(?:0{5}\d+)?
+-4.23:-1:/-4.2(?:0{5}\d+)?
++4.27:-1:/4.(?:3|29{5}\d+)
+-4.27:-1:/-4.(?:3|29{5}\d+)
++4.25:-1:/4.2(?:0{5}\d+)?
+-4.25:-1:/-4.(?:3|29{5}\d+)
++4.35:-1:/4.(?:3|29{5}\d+)
+-4.35:-1:/-4.(?:4|39{5}\d+)
+-0.0065:-1:0
+-0.0065:-2:/-0\.01|-1e-02
+-0.0065:-3:/-0\.007|-7e-03
+-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+$Math::BigFloat::rnd_mode = 'odd'
++5.23:-1:/5.2(?:0{5}\d+)?
+-5.23:-1:/-5.2(?:0{5}\d+)?
++5.27:-1:/5.(?:3|29{5}\d+)
+-5.27:-1:/-5.(?:3|29{5}\d+)
++5.25:-1:/5.(?:3|29{5}\d+)
+-5.25:-1:/-5.(?:3|29{5}\d+)
++5.35:-1:/5.(?:3|29{5}\d+)
+-5.35:-1:/-5.(?:3|29{5}\d+)
+-0.0065:-1:0
+-0.0065:-2:/-0\.01|-1e-02
+-0.0065:-3:/-0\.007|-7e-03
+-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+$Math::BigFloat::rnd_mode = 'even'
++6.23:-1:/6.2(?:0{5}\d+)?
+-6.23:-1:/-6.2(?:0{5}\d+)?
++6.27:-1:/6.(?:3|29{5}\d+)
+-6.27:-1:/-6.(?:3|29{5}\d+)
++6.25:-1:/6.2(?:0{5}\d+)?
+-6.25:-1:/-6.2(?:0{5}\d+)?
++6.35:-1:/6.(?:4|39{5}\d+)
+-6.35:-1:/-6.(?:4|39{5}\d+)
+-0.0065:-1:0
+-0.0065:-2:/-0\.01|-1e-02
+-0.0065:-3:/-0\.006|-6e-03
+-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
+&fcmp
+abc:abc:
+abc:+0:
++0:abc:
++0:+0:0
+-1:+0:-1
++0:-1:1
++1:+0:1
++0:+1:-1
+-1:+1:-1
++1:-1:1
+-1:-1:0
++1:+1:0
+-1.1:0:-1
++0:-1.1:1
++1.1:+0:1
++0:+1.1:-1
++123:+123:0
++123:+12:1
++12:+123:-1
+-123:-123:0
+-123:-12:-1
+-12:-123:1
++123:+124:-1
++124:+123:1
+-123:-124:1
+-124:-123:-1
+&fadd
+abc:abc:NaN.
+abc:+0:NaN.
++0:abc:NaN.
++0:+0:0.
++1:+0:1.
++0:+1:1.
++1:+1:2.
+-1:+0:-1.
++0:-1:-1.
+-1:-1:-2.
+-1:+1:0.
++1:-1:0.
++9:+1:10.
++99:+1:100.
++999:+1:1000.
++9999:+1:10000.
++99999:+1:100000.
++999999:+1:1000000.
++9999999:+1:10000000.
++99999999:+1:100000000.
++999999999:+1:1000000000.
++9999999999:+1:10000000000.
++99999999999:+1:100000000000.
++10:-1:9.
++100:-1:99.
++1000:-1:999.
++10000:-1:9999.
++100000:-1:99999.
++1000000:-1:999999.
++10000000:-1:9999999.
++100000000:-1:99999999.
++1000000000:-1:999999999.
++10000000000:-1:9999999999.
++123456789:+987654321:1111111110.
+-123456789:+987654321:864197532.
+-123456789:-987654321:-1111111110.
++123456789:-987654321:-864197532.
+&fsub
+abc:abc:NaN.
+abc:+0:NaN.
++0:abc:NaN.
++0:+0:0.
++1:+0:1.
++0:+1:-1.
++1:+1:0.
+-1:+0:-1.
++0:-1:1.
+-1:-1:0.
+-1:+1:-2.
++1:-1:2.
++9:+1:8.
++99:+1:98.
++999:+1:998.
++9999:+1:9998.
++99999:+1:99998.
++999999:+1:999998.
++9999999:+1:9999998.
++99999999:+1:99999998.
++999999999:+1:999999998.
++9999999999:+1:9999999998.
++99999999999:+1:99999999998.
++10:-1:11.
++100:-1:101.
++1000:-1:1001.
++10000:-1:10001.
++100000:-1:100001.
++1000000:-1:1000001.
++10000000:-1:10000001.
++100000000:-1:100000001.
++1000000000:-1:1000000001.
++10000000000:-1:10000000001.
++123456789:+987654321:-864197532.
+-123456789:+987654321:-1111111110.
+-123456789:-987654321:864197532.
++123456789:-987654321:1111111110.
+&fmul
+abc:abc:NaN.
+abc:+0:NaN.
++0:abc:NaN.
++0:+0:0.
++0:+1:0.
++1:+0:0.
++0:-1:0.
+-1:+0:0.
++123456789123456789:+0:0.
++0:+123456789123456789:0.
+-1:-1:1.
+-1:+1:-1.
++1:-1:-1.
++1:+1:1.
++2:+3:6.
+-2:+3:-6.
++2:-3:-6.
+-2:-3:6.
++111:+111:12321.
++10101:+10101:102030201.
++1001001:+1001001:1002003002001.
++100010001:+100010001:10002000300020001.
++10000100001:+10000100001:100002000030000200001.
++11111111111:+9:99999999999.
++22222222222:+9:199999999998.
++33333333333:+9:299999999997.
++44444444444:+9:399999999996.
++55555555555:+9:499999999995.
++66666666666:+9:599999999994.
++77777777777:+9:699999999993.
++88888888888:+9:799999999992.
++99999999999:+9:899999999991.
+&fdiv
+abc:abc:NaN.
+abc:+1:abc:NaN.
++1:abc:NaN.
++0:+0:NaN.
++0:+1:0.
++1:+0:NaN.
++0:-1:0.
+-1:+0:NaN.
++1:+1:1.
+-1:-1:1.
++1:-1:-1.
+-1:+1:-1.
++1:+2:.5
++2:+1:2.
++10:+5:2.
++100:+4:25.
++1000:+8:125.
++10000:+16:625.
++10000:-16:-625.
++999999999999:+9:111111111111.
++999999999999:+99:10101010101.
++999999999999:+999:1001001001.
++999999999999:+9999:100010001.
++999999999999999:+99999:10000100001.
++1000000000:+9:111111111.1111111111111111111111111111111
++2000000000:+9:222222222.2222222222222222222222222222222
++3000000000:+9:333333333.3333333333333333333333333333333
++4000000000:+9:444444444.4444444444444444444444444444444
++5000000000:+9:555555555.5555555555555555555555555555556
++6000000000:+9:666666666.6666666666666666666666666666667
++7000000000:+9:777777777.7777777777777777777777777777778
++8000000000:+9:888888888.8888888888888888888888888888889
++9000000000:+9:1000000000.
++35500000:+113:314159.2920353982300884955752212389380531
++71000000:+226:314159.2920353982300884955752212389380531
++106500000:+339:314159.2920353982300884955752212389380531
++1000000000:+3:333333333.3333333333333333333333333333333
+$Math::BigFloat::div_scale = 20
++1000000000:+9:111111111.11111111111
++2000000000:+9:222222222.22222222222
++3000000000:+9:333333333.33333333333
++4000000000:+9:444444444.44444444444
++5000000000:+9:555555555.55555555556
++6000000000:+9:666666666.66666666667
++7000000000:+9:777777777.77777777778
++8000000000:+9:888888888.88888888889
++9000000000:+9:1000000000.
++35500000:+113:314159.292035398230088
++71000000:+226:314159.292035398230088
++106500000:+339:314159.29203539823009
++1000000000:+3:333333333.33333333333
+$Math::BigFloat::div_scale = 40
+&fsqrt
++0:0
+-1:/^(?i:0|\?|NaNQ?)$
+-2:/^(?i:0|\?|NaNQ?)$
+-16:/^(?i:0|\?|NaNQ?)$
+-123.456:/^(?i:0|\?|NaNQ?)$
++1:1.
++1.44:1.2
++2:1.41421356237309504880168872420969807857
++4:2.
++16:4.
++100:10.
++123.456:11.11107555549866648462149404118219234119
++15241.383936:123.456
diff --git a/contrib/perl5/t/lib/bigint.t b/contrib/perl5/t/lib/bigint.t
index 034c5c6..d2d520e 100755
--- a/contrib/perl5/t/lib/bigint.t
+++ b/contrib/perl5/t/lib/bigint.t
@@ -1,6 +1,6 @@
#!./perl
-BEGIN { @INC = '../lib' }
+BEGIN { unshift @INC, '../lib' }
require "bigint.pl";
$test = 0;
diff --git a/contrib/perl5/t/lib/bigintpm.t b/contrib/perl5/t/lib/bigintpm.t
index e7cac26..ae362e2 100755
--- a/contrib/perl5/t/lib/bigintpm.t
+++ b/contrib/perl5/t/lib/bigintpm.t
@@ -2,14 +2,14 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Math::BigInt;
$test = 0;
$| = 1;
-print "1..247\n";
+print "1..278\n";
while (<DATA>) {
chop;
if (s/^&//) {
@@ -27,20 +27,32 @@ while (<DATA>) {
$try .= "abs \$x;";
} else {
$try .= "\$y = new Math::BigInt \"$args[1]\";";
- if ($f eq bcmp){
+ if ($f eq "bcmp"){
$try .= "\$x <=> \$y;";
- }elsif ($f eq badd){
+ }elsif ($f eq "badd"){
$try .= "\$x + \$y;";
- }elsif ($f eq bsub){
+ }elsif ($f eq "bsub"){
$try .= "\$x - \$y;";
- }elsif ($f eq bmul){
+ }elsif ($f eq "bmul"){
$try .= "\$x * \$y;";
- }elsif ($f eq bdiv){
+ }elsif ($f eq "bdiv"){
$try .= "\$x / \$y;";
- }elsif ($f eq bmod){
+ }elsif ($f eq "bmod"){
$try .= "\$x % \$y;";
- }elsif ($f eq bgcd){
+ }elsif ($f eq "bgcd"){
$try .= "Math::BigInt::bgcd(\$x, \$y);";
+ }elsif ($f eq "blsft"){
+ $try .= "\$x << \$y;";
+ }elsif ($f eq "brsft"){
+ $try .= "\$x >> \$y;";
+ }elsif ($f eq "band"){
+ $try .= "\$x & \$y;";
+ }elsif ($f eq "bior"){
+ $try .= "\$x | \$y;";
+ }elsif ($f eq "bxor"){
+ $try .= "\$x ^ \$y;";
+ }elsif ($f eq "bnot"){
+ $try .= "~\$x;";
} else { warn "Unknown op"; }
}
#print ">>>",$try,"<<<\n";
@@ -52,7 +64,24 @@ while (<DATA>) {
print "# '$try' expected: '$ans' got: '$ans1'\n";
}
}
-}
+}
+
+{
+ use Math::BigInt ':constant';
+
+ $test++;
+ print "not "
+ unless 2**150 eq "+1427247692705959881058285969449495136382746624";
+ print "ok $test\n";
+ $test++;
+ @a = ();
+ for ($i = 1; $i < 10; $i++) {
+ push @a, $i;
+ }
+ print "not " unless "@a" eq "+1 +2 +3 +4 +5 +6 +7 +8 +9";
+ print "ok $test\n";
+}
+
__END__
&bnorm
abc:NaN
@@ -93,29 +122,29 @@ abc:NaN
+123456789:+123456789
-123456789:+123456789
&bcmp
-abc:abc:NaN
-abc:+0:NaN
-+0:abc:NaN
-+0:+0:+0
+abc:abc:
+abc:+0:
++0:abc:
++0:+0:0
-1:+0:-1
-+0:-1:+1
-+1:+0:+1
++0:-1:1
++1:+0:1
+0:+1:-1
-1:+1:-1
-+1:-1:+1
--1:-1:+0
-+1:+1:+0
-+123:+123:+0
-+123:+12:+1
++1:-1:1
+-1:-1:0
++1:+1:0
++123:+123:0
++123:+12:1
+12:+123:-1
--123:-123:+0
+-123:-123:0
-123:-12:-1
--12:-123:+1
+-12:-123:1
+123:+124:-1
-+124:+123:+1
--123:-124:+1
++124:+123:1
+-123:-124:1
-124:-123:-1
-+100:+5:+1
++100:+5:1
&badd
abc:abc:NaN
abc:+0:NaN
@@ -311,3 +340,38 @@ abc:+0:NaN
+3:+2:+1
+100:+625:+25
+4096:+81:+1
+&blsft
+abc:abc:NaN
++2:+2:+8
++1:+32:+4294967296
++1:+48:+281474976710656
++8:-2:NaN
+&brsft
+abc:abc:NaN
++8:+2:+2
++4294967296:+32:+1
++281474976710656:+48:+1
++2:-2:NaN
+&band
+abc:abc:NaN
++8:+2:+0
++281474976710656:+0:+0
++281474976710656:+1:+0
++281474976710656:+281474976710656:+281474976710656
+&bior
+abc:abc:NaN
++8:+2:+10
++281474976710656:+0:+281474976710656
++281474976710656:+1:+281474976710657
++281474976710656:+281474976710656:+281474976710656
+&bxor
+abc:abc:NaN
++8:+2:+10
++281474976710656:+0:+281474976710656
++281474976710656:+1:+281474976710657
++281474976710656:+281474976710656:+0
+&bnot
+abc:NaN
++0:-1
++8:-9
++281474976710656:-281474976710657
diff --git a/contrib/perl5/t/lib/cgi-form.t b/contrib/perl5/t/lib/cgi-form.t
index 86df161..e3cba5f 100755
--- a/contrib/perl5/t/lib/cgi-form.t
+++ b/contrib/perl5/t/lib/cgi-form.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
BEGIN {$| = 1; print "1..17\n"; }
@@ -44,16 +44,16 @@ test(6,textfield(-name=>'weather') eq qq(<INPUT TYPE="text" NAME="weather" VALUE
test(7,textfield(-name=>'weather',-value=>'nice') eq qq(<INPUT TYPE="text" NAME="weather" VALUE="dull">),"textfield({-name,-value})");
test(8,textfield(-name=>'weather',-value=>'nice',-override=>1) eq qq(<INPUT TYPE="text" NAME="weather" VALUE="nice">),
"textfield({-name,-value,-override})");
-test(9,checkbox(-name=>'weather',-value=>'nice') eq qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice">weather\n),
+test(9,checkbox(-name=>'weather',-value=>'nice') eq qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice">weather),
"checkbox()");
test(10,checkbox(-name=>'weather',-value=>'nice',-label=>'forecast') eq
- qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice">forecast\n),
+ qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice">forecast),
"checkbox()");
test(11,checkbox(-name=>'weather',-value=>'nice',-label=>'forecast',-checked=>1,-override=>1) eq
- qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice" CHECKED>forecast\n),
+ qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice" CHECKED>forecast),
"checkbox()");
test(12,checkbox(-name=>'weather',-value=>'dull',-label=>'forecast') eq
- qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="dull" CHECKED>forecast\n),
+ qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="dull" CHECKED>forecast),
"checkbox()");
test(13,radio_group(-name=>'game') eq
diff --git a/contrib/perl5/t/lib/cgi-function.t b/contrib/perl5/t/lib/cgi-function.t
index ad8b968..b4cd568 100755
--- a/contrib/perl5/t/lib/cgi-function.t
+++ b/contrib/perl5/t/lib/cgi-function.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
BEGIN {$| = 1; print "1..24\n"; }
diff --git a/contrib/perl5/t/lib/cgi-html.t b/contrib/perl5/t/lib/cgi-html.t
index 6a7ff1e..43d41ec 100755
--- a/contrib/perl5/t/lib/cgi-html.t
+++ b/contrib/perl5/t/lib/cgi-html.t
@@ -5,12 +5,11 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
+ require Config; import Config;
}
BEGIN {$| = 1; print "1..20\n"; }
-BEGIN {$eol = $^O eq 'VMS' ? "\n" : "\cM\cJ";
- $eol = "\r\n" if $^O eq 'os390'; }
END {print "not ok 1\n" unless $loaded;}
use CGI (':standard','-no_debug','*h3','start_table');
$loaded = 1;
@@ -18,6 +17,9 @@ print "ok 1\n";
######################### End of black magic.
+my $Is_EBCDIC = $Config{'ebcdic'} eq 'define';
+my $crlf = $CGI::CRLF;
+
# util
sub test {
local($^W) = 0;
@@ -38,10 +40,11 @@ test(7,h1({-align=>'CENTER'},['fred','agnes']) eq
local($") = '-';
test(8,h1('fred','agnes','maura') eq '<H1>fred-agnes-maura</H1>',"open/close tag \$\" interpolation");
}
-test(9,header() eq "Content-Type: text/html${eol}${eol}","header()");
-test(10,header(-type=>'image/gif') eq "Content-Type: image/gif${eol}${eol}","header()");
-test(11,header(-type=>'image/gif',-status=>'500 Sucks') eq "Status: 500 Sucks${eol}Content-Type: image/gif${eol}${eol}","header()");
-test(12,header(-nph=>1) eq "HTTP/1.0 200 OK${eol}Content-Type: text/html${eol}${eol}","header()");
+
+test(9,header() eq "Content-Type: text/html$crlf$crlf","header()");
+test(10,header(-type=>'image/gif') eq "Content-Type: image/gif$crlf$crlf","header()");
+test(11,header(-type=>'image/gif',-status=>'500 Sucks') eq "Status: 500 Sucks${crlf}Content-Type: image/gif$crlf$crlf","header()");
+test(12,header(-nph=>1) eq "HTTP/1.0 200 OK${crlf}Content-Type: text/html$crlf$crlf","header()");
test(13,start_html() ."\n" eq <<END,"start_html()");
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML><HEAD><TITLE>Untitled Document</TITLE>
@@ -62,8 +65,11 @@ END
;
test(16,($cookie=cookie(-name=>'fred',-value=>['chocolate','chip'],-path=>'/')) eq
'fred=chocolate&chip; path=/',"cookie()");
-test(17,header(-Cookie=>$cookie) =~ m!^Set-Cookie: fred=chocolate&chip\; path=/${eol}Date:.*${eol}Content-Type: text/html${eol}${eol}!s,
+test(17,header(-Cookie=>$cookie) =~ m!^Set-Cookie: fred=chocolate&chip\; path=/${crlf}Date:.*${crlf}Content-Type: text/html$crlf$crlf!s,
"header(-cookie)");
test(18,start_h3 eq '<H3>');
test(19,end_h3 eq '</H3>');
test(20,start_table({-border=>undef}) eq '<TABLE BORDER>');
+
+
+
diff --git a/contrib/perl5/t/lib/cgi-request.t b/contrib/perl5/t/lib/cgi-request.t
index 8c70c40..9e8cdc2 100755
--- a/contrib/perl5/t/lib/cgi-request.t
+++ b/contrib/perl5/t/lib/cgi-request.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
BEGIN {$| = 1; print "1..31\n"; }
@@ -25,15 +25,16 @@ sub test {
}
# Set up a CGI environment
-$ENV{REQUEST_METHOD}='GET';
-$ENV{QUERY_STRING} ='game=chess&game=checkers&weather=dull';
-$ENV{PATH_INFO} ='/somewhere/else';
-$ENV{PATH_TRANSLATED} ='/usr/local/somewhere/else';
-$ENV{SCRIPT_NAME} ='/cgi-bin/foo.cgi';
+$ENV{REQUEST_METHOD} = 'GET';
+$ENV{QUERY_STRING} = 'game=chess&game=checkers&weather=dull';
+$ENV{PATH_INFO} = '/somewhere/else';
+$ENV{PATH_TRANSLATED} = '/usr/local/somewhere/else';
+$ENV{SCRIPT_NAME} = '/cgi-bin/foo.cgi';
$ENV{SERVER_PROTOCOL} = 'HTTP/1.0';
-$ENV{SERVER_PORT} = 8080;
-$ENV{SERVER_NAME} = 'the.good.ship.lollypop.com';
-$ENV{HTTP_LOVE} = 'true';
+$ENV{SERVER_PORT} = 8080;
+$ENV{SERVER_NAME} = 'the.good.ship.lollypop.com';
+$ENV{REQUEST_URI} = "$ENV{SCRIPT_NAME}$ENV{PATH_INFO}?$ENV{QUERY_STRING}";
+$ENV{HTTP_LOVE} = 'true';
$q = new CGI;
test(2,$q,"CGI::new()");
diff --git a/contrib/perl5/t/lib/charnames.t b/contrib/perl5/t/lib/charnames.t
new file mode 100755
index 0000000..7643390
--- /dev/null
+++ b/contrib/perl5/t/lib/charnames.t
@@ -0,0 +1,74 @@
+#!./perl
+
+BEGIN {
+ unless(grep /blib/, @INC) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ }
+}
+
+$| = 1;
+print "1..12\n";
+
+use charnames ':full';
+
+print "not " unless "Here\N{EXCLAMATION MARK}?" eq "Here\041?";
+print "ok 1\n";
+
+{
+ use bytes; # UTEST can switch utf8 on
+
+ print "# \$res=$res \$\@='$@'\nnot "
+ if $res = eval <<'EOE'
+use charnames ":full";
+"Here: \N{CYRILLIC SMALL LETTER BE}!";
+1
+EOE
+ or $@ !~ /above 0xFF/;
+ print "ok 2\n";
+ # print "# \$res=$res \$\@='$@'\n";
+
+ print "# \$res=$res \$\@='$@'\nnot "
+ if $res = eval <<'EOE'
+use charnames 'cyrillic';
+"Here: \N{Be}!";
+1
+EOE
+ or $@ !~ /CYRILLIC CAPITAL LETTER BE.*above 0xFF/;
+ print "ok 3\n";
+}
+
+# If octal representation of unicode char is \0xyzt, then the utf8 is \3xy\2zt
+$encoded_be = "\320\261";
+$encoded_alpha = "\316\261";
+$encoded_bet = "\327\221";
+{
+ use charnames ':full';
+
+ print "not " unless "\N{CYRILLIC SMALL LETTER BE}" eq $encoded_be;
+ print "ok 4\n";
+
+ use charnames qw(cyrillic greek :short);
+
+ print "not " unless "\N{be},\N{alpha},\N{hebrew:bet}"
+ eq "$encoded_be,$encoded_alpha,$encoded_bet";
+ print "ok 5\n";
+}
+
+{
+ use charnames ':full';
+ print "not " unless "\x{263a}" eq "\N{WHITE SMILING FACE}";
+ print "ok 6\n";
+ print "not " unless length("\x{263a}") == 1;
+ print "ok 7\n";
+ print "not " unless length("\N{WHITE SMILING FACE}") == 1;
+ print "ok 8\n";
+ print "not " unless sprintf("%vx", "\x{263a}") eq "263a";
+ print "ok 9\n";
+ print "not " unless sprintf("%vx", "\N{WHITE SMILING FACE}") eq "263a";
+ print "ok 10\n";
+ print "not " unless sprintf("%vx", "\xFF\N{WHITE SMILING FACE}") eq "ff.263a";
+ print "ok 11\n";
+ print "not " unless sprintf("%vx", "\x{ff}\N{WHITE SMILING FACE}") eq "ff.263a";
+ print "ok 12\n";
+}
diff --git a/contrib/perl5/t/lib/checktree.t b/contrib/perl5/t/lib/checktree.t
index b5426ca..7603575 100755
--- a/contrib/perl5/t/lib/checktree.t
+++ b/contrib/perl5/t/lib/checktree.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..1\n";
diff --git a/contrib/perl5/t/lib/complex.t b/contrib/perl5/t/lib/complex.t
index c073f50..a636ff0 100755
--- a/contrib/perl5/t/lib/complex.t
+++ b/contrib/perl5/t/lib/complex.t
@@ -9,7 +9,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Math::Complex;
@@ -73,6 +73,7 @@ push(@script, <<'EOT');
my $z = cplx( 1, 1);
$z->Re(2);
$z->Im(3);
+ print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
print 'not ' unless Re($z) == 2 and Im($z) == 3;
EOT
push(@script, qq(print "ok $test\\n"}\n));
@@ -82,6 +83,7 @@ push(@script, <<'EOT');
{
my $z = cplx( 1, 1);
$z->abs(3 * sqrt(2));
+ print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
print 'not ' unless (abs($z) - 3 * sqrt(2)) < $eps and
(arg($z) - pi / 4 ) < $eps and
(Re($z) - 3 ) < $eps and
@@ -94,6 +96,7 @@ push(@script, <<'EOT');
{
my $z = cplx( 1, 1);
$z->arg(-3 / 4 * pi);
+ print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n";
print 'not ' unless (arg($z) + 3 / 4 * pi) < $eps and
(abs($z) - sqrt(2) ) < $eps and
(Re($z) + 1 ) < $eps and
@@ -120,10 +123,11 @@ push(@script, $constants);
sub test_dbz {
for my $op (@_) {
$test++;
-
push(@script, <<EOT);
-eval '$op';
-print 'not ' unless (\$@ =~ /Division by zero/);
+ eval '$op';
+ (\$bad) = (\$@ =~ /(.+)/);
+ print "# $test op = $op divbyzero? \$bad...\n";
+ print 'not ' unless (\$@ =~ /Division by zero/);
EOT
push(@script, qq(print "ok $test\\n";\n));
}
@@ -134,10 +138,11 @@ EOT
sub test_loz {
for my $op (@_) {
$test++;
-
push(@script, <<EOT);
-eval '$op';
-print 'not ' unless (\$@ =~ /Logarithm of zero/);
+ eval '$op';
+ (\$bad) = (\$@ =~ /(.+)/);
+ print "# $test op = $op logofzero? \$bad...\n";
+ print 'not ' unless (\$@ =~ /Logarithm of zero/);
EOT
push(@script, qq(print "ok $test\\n";\n));
}
@@ -178,10 +183,11 @@ test_loz(
sub test_broot {
for my $op (@_) {
$test++;
-
push(@script, <<EOT);
-eval 'root(2, $op)';
-print 'not ' unless (\$@ =~ /root must be/);
+ eval 'root(2, $op)';
+ (\$bad) = (\$@ =~ /(.+)/);
+ print "# $test op = $op badroot? \$bad...\n";
+ print 'not ' unless (\$@ =~ /root must be/);
EOT
push(@script, qq(print "ok $test\\n";\n));
}
@@ -189,6 +195,99 @@ EOT
test_broot(qw(-3 -2.1 0 0.99));
+sub test_display_format {
+ push @script, <<EOS;
+ my \$j = (root(1,3))[1];
+
+ \$j->display_format('polar');
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# display_format polar?\n";
+ print "not " unless \$j->display_format eq 'polar';
+ print "ok $test\n";
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# j = \$j\n";
+ print "not " unless "\$j" eq "[1,2pi/3]";
+ print "ok $test\n";
+
+ my %display_format;
+
+ %display_format = \$j->display_format;
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# display_format{style} polar?\n";
+ print "not " unless \$display_format{style} eq 'polar';
+ print "ok $test\n";
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# keys %display_format == 2?\n";
+ print "not " unless keys %display_format == 2;
+ print "ok $test\n";
+
+ \$j->display_format('style' => 'cartesian', 'format' => '%.5f');
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# j = \$j\n";
+ print "not " unless "\$j" eq "-0.50000+0.86603i";
+ print "ok $test\n";
+
+ %display_format = \$j->display_format;
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# display_format{format} %.5f?\n";
+ print "not " unless \$display_format{format} eq '%.5f';
+ print "ok $test\n";
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# keys %display_format == 3?\n";
+ print "not " unless keys %display_format == 3;
+ print "ok $test\n";
+
+ \$j->display_format('format' => undef);
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# j = \$j\n";
+ print "not " unless "\$j" =~ /^-0\\.5\\+0.86602540\\d+i\$/;
+ print "ok $test\n";
+
+ \$j->display_format('style' => 'polar', 'polar_pretty_print' => 0);
+EOS
+
+ $test++;
+ push @script, <<EOS;
+ print "# j = \$j\n";
+ print "not " unless "\$j" =~ /^\\[1,2\\.09439510\\d+\\]\$/;
+ print "ok $test\n";
+
+ \$j->display_format('style' => 'cartesian', 'format' => '(%.5g)');
+EOS
+ $test++;
+ push @script, <<EOS;
+ print "# j = \$j\n";
+ print "not " unless "\$j" eq "(-0.5)+(0.86603)i";
+ print "ok $test\n";
+EOS
+}
+
+test_display_format();
+
print "1..$test\n";
eval join '', @script;
die $@ if $@;
@@ -294,7 +393,7 @@ sub value {
sub check {
my ($test, $try, $got, $expected, @z) = @_;
-# print "# @_\n";
+ print "# @_\n";
if ("$got" eq "$expected"
||
diff --git a/contrib/perl5/t/lib/db-btree.t b/contrib/perl5/t/lib/db-btree.t
index bf739c8..b13e50ea 100755
--- a/contrib/perl5/t/lib/db-btree.t
+++ b/contrib/perl5/t/lib/db-btree.t
@@ -1,10 +1,10 @@
#!./perl -w
BEGIN {
- @INC = '../lib' if -d '../lib' ;
+ unshift @INC, '../lib' if -d '../lib' ;
require Config; import Config;
if ($Config{'extensions'} !~ /\bDB_File\b/) {
- print "1..0\n";
+ print "1..0 # Skip: DB_File was not built\n";
exit 0;
}
}
@@ -12,7 +12,7 @@ BEGIN {
use DB_File;
use Fcntl;
-print "1..102\n";
+print "1..155\n";
sub ok
{
@@ -38,7 +38,53 @@ sub lexical
return @a - @b ;
}
-$Dfile = "dbbtree.tmp";
+{
+ package Redirect ;
+ use Symbol ;
+
+ sub new
+ {
+ my $class = shift ;
+ my $filename = shift ;
+ my $fh = gensym ;
+ open ($fh, ">$filename") || die "Cannot open $filename: $!" ;
+ my $real_stdout = select($fh) ;
+ return bless [$fh, $real_stdout ] ;
+
+ }
+ sub DESTROY
+ {
+ my $self = shift ;
+ close $self->[0] ;
+ select($self->[1]) ;
+ }
+}
+
+sub docat
+{
+ my $file = shift;
+ #local $/ = undef unless wantarray ;
+ open(CAT,$file) || die "Cannot open $file: $!";
+ my @result = <CAT>;
+ close(CAT);
+ wantarray ? @result : join("", @result) ;
+}
+
+sub docat_del
+{
+ my $file = shift;
+ #local $/ = undef unless wantarray ;
+ open(CAT,$file) || die "Cannot open $file: $!";
+ my @result = <CAT>;
+ close(CAT);
+ unlink $file ;
+ wantarray ? @result : join("", @result) ;
+}
+
+
+$db185mode = ($DB_File::db_version == 1 && ! $DB_File::db_185_compat) ;
+
+my $Dfile = "dbbtree.tmp";
unlink $Dfile;
umask(0);
@@ -134,7 +180,6 @@ delete $h{'goner2'};
undef $X ;
untie(%h);
-
# tie to the same file again
ok(26, $X = tie(%h,'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE)) ;
@@ -609,4 +654,567 @@ EOM
}
+{
+ # DBM Filter tests
+ use strict ;
+ my (%h, $db) ;
+ my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ unlink $Dfile;
+
+ sub checkOutput
+ {
+ my($fk, $sk, $fv, $sv) = @_ ;
+ return
+ $fetch_key eq $fk && $store_key eq $sk &&
+ $fetch_value eq $fv && $store_value eq $sv &&
+ $_ eq 'original' ;
+ }
+
+ ok(103, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) );
+
+ $db->filter_fetch_key (sub { $fetch_key = $_ }) ;
+ $db->filter_store_key (sub { $store_key = $_ }) ;
+ $db->filter_fetch_value (sub { $fetch_value = $_}) ;
+ $db->filter_store_value (sub { $store_value = $_ }) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ # fk sk fv sv
+ ok(104, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(105, $h{"fred"} eq "joe");
+ # fk sk fv sv
+ ok(106, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(107, $db->FIRSTKEY() eq "fred") ;
+ # fk sk fv sv
+ ok(108, checkOutput( "fred", "", "", "")) ;
+
+ # replace the filters, but remember the previous set
+ my ($old_fk) = $db->filter_fetch_key
+ (sub { $_ = uc $_ ; $fetch_key = $_ }) ;
+ my ($old_sk) = $db->filter_store_key
+ (sub { $_ = lc $_ ; $store_key = $_ }) ;
+ my ($old_fv) = $db->filter_fetch_value
+ (sub { $_ = "[$_]"; $fetch_value = $_ }) ;
+ my ($old_sv) = $db->filter_store_value
+ (sub { s/o/x/g; $store_value = $_ }) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"Fred"} = "Joe" ;
+ # fk sk fv sv
+ ok(109, checkOutput( "", "fred", "", "Jxe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(110, $h{"Fred"} eq "[Jxe]");
+ # fk sk fv sv
+ ok(111, checkOutput( "", "fred", "[Jxe]", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(112, $db->FIRSTKEY() eq "FRED") ;
+ # fk sk fv sv
+ ok(113, checkOutput( "FRED", "", "", "")) ;
+
+ # put the original filters back
+ $db->filter_fetch_key ($old_fk);
+ $db->filter_store_key ($old_sk);
+ $db->filter_fetch_value ($old_fv);
+ $db->filter_store_value ($old_sv);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(114, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(115, $h{"fred"} eq "joe");
+ ok(116, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(117, $db->FIRSTKEY() eq "fred") ;
+ ok(118, checkOutput( "fred", "", "", "")) ;
+
+ # delete the filters
+ $db->filter_fetch_key (undef);
+ $db->filter_store_key (undef);
+ $db->filter_fetch_value (undef);
+ $db->filter_store_value (undef);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(119, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(120, $h{"fred"} eq "joe");
+ ok(121, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(122, $db->FIRSTKEY() eq "fred") ;
+ ok(123, checkOutput( "", "", "", "")) ;
+
+ undef $db ;
+ untie %h;
+ unlink $Dfile;
+}
+
+{
+ # DBM Filter with a closure
+
+ use strict ;
+ my (%h, $db) ;
+
+ unlink $Dfile;
+ ok(124, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) );
+
+ my %result = () ;
+
+ sub Closure
+ {
+ my ($name) = @_ ;
+ my $count = 0 ;
+ my @kept = () ;
+
+ return sub { ++$count ;
+ push @kept, $_ ;
+ $result{$name} = "$name - $count: [@kept]" ;
+ }
+ }
+
+ $db->filter_store_key(Closure("store key")) ;
+ $db->filter_store_value(Closure("store value")) ;
+ $db->filter_fetch_key(Closure("fetch key")) ;
+ $db->filter_fetch_value(Closure("fetch value")) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ ok(125, $result{"store key"} eq "store key - 1: [fred]");
+ ok(126, $result{"store value"} eq "store value - 1: [joe]");
+ ok(127, ! defined $result{"fetch key"} );
+ ok(128, ! defined $result{"fetch value"} );
+ ok(129, $_ eq "original") ;
+
+ ok(130, $db->FIRSTKEY() eq "fred") ;
+ ok(131, $result{"store key"} eq "store key - 1: [fred]");
+ ok(132, $result{"store value"} eq "store value - 1: [joe]");
+ ok(133, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(134, ! defined $result{"fetch value"} );
+ ok(135, $_ eq "original") ;
+
+ $h{"jim"} = "john" ;
+ ok(136, $result{"store key"} eq "store key - 2: [fred jim]");
+ ok(137, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(138, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(139, ! defined $result{"fetch value"} );
+ ok(140, $_ eq "original") ;
+
+ ok(141, $h{"fred"} eq "joe");
+ ok(142, $result{"store key"} eq "store key - 3: [fred jim fred]");
+ ok(143, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(144, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(145, $result{"fetch value"} eq "fetch value - 1: [joe]");
+ ok(146, $_ eq "original") ;
+
+ undef $db ;
+ untie %h;
+ unlink $Dfile;
+}
+
+{
+ # DBM Filter recursion detection
+ use strict ;
+ my (%h, $db) ;
+ unlink $Dfile;
+
+ ok(147, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) );
+
+ $db->filter_store_key (sub { $_ = $h{$_} }) ;
+
+ eval '$h{1} = 1234' ;
+ ok(148, $@ =~ /^recursion detected in filter_store_key at/ );
+
+ undef $db ;
+ untie %h;
+ unlink $Dfile;
+}
+
+
+{
+ # Examples from the POD
+
+
+ my $file = "xyzt" ;
+ {
+ my $redirect = new Redirect $file ;
+
+ # BTREE example 1
+ ###
+
+ use strict ;
+ use DB_File ;
+
+ my %h ;
+
+ sub Compare
+ {
+ my ($key1, $key2) = @_ ;
+ "\L$key1" cmp "\L$key2" ;
+ }
+
+ # specify the Perl sub that will do the comparison
+ $DB_BTREE->{'compare'} = \&Compare ;
+
+ unlink "tree" ;
+ tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open file 'tree': $!\n" ;
+
+ # Add a key/value pair to the file
+ $h{'Wall'} = 'Larry' ;
+ $h{'Smith'} = 'John' ;
+ $h{'mouse'} = 'mickey' ;
+ $h{'duck'} = 'donald' ;
+
+ # Delete
+ delete $h{"duck"} ;
+
+ # Cycle through the keys printing them in order.
+ # Note it is not necessary to sort the keys as
+ # the btree will have kept them in order automatically.
+ foreach (keys %h)
+ { print "$_\n" }
+
+ untie %h ;
+
+ unlink "tree" ;
+ }
+
+ delete $DB_BTREE->{'compare'} ;
+
+ ok(149, docat_del($file) eq <<'EOM') ;
+mouse
+Smith
+Wall
+EOM
+
+ {
+ my $redirect = new Redirect $file ;
+
+ # BTREE example 2
+ ###
+
+ use strict ;
+ use DB_File ;
+
+ use vars qw($filename %h ) ;
+
+ $filename = "tree" ;
+ unlink $filename ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ # Add some key/value pairs to the file
+ $h{'Wall'} = 'Larry' ;
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key and value
+ $h{'Smith'} = 'John' ;
+ $h{'mouse'} = 'mickey' ;
+
+ # iterate through the associative array
+ # and print each key/value pair.
+ foreach (keys %h)
+ { print "$_ -> $h{$_}\n" }
+
+ untie %h ;
+
+ unlink $filename ;
+ }
+
+ ok(150, docat_del($file) eq ($db185mode ? <<'EOM' : <<'EOM') ) ;
+Smith -> John
+Wall -> Brick
+Wall -> Brick
+Wall -> Brick
+mouse -> mickey
+EOM
+Smith -> John
+Wall -> Larry
+Wall -> Larry
+Wall -> Larry
+mouse -> mickey
+EOM
+
+ {
+ my $redirect = new Redirect $file ;
+
+ # BTREE example 3
+ ###
+
+ use strict ;
+ use DB_File ;
+
+ use vars qw($filename $x %h $status $key $value) ;
+
+ $filename = "tree" ;
+ unlink $filename ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ # Add some key/value pairs to the file
+ $h{'Wall'} = 'Larry' ;
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key
+ $h{'Wall'} = 'Brick' ; # Note the duplicate key and value
+ $h{'Smith'} = 'John' ;
+ $h{'mouse'} = 'mickey' ;
+
+ # iterate through the btree using seq
+ # and print each key/value pair.
+ $key = $value = 0 ;
+ for ($status = $x->seq($key, $value, R_FIRST) ;
+ $status == 0 ;
+ $status = $x->seq($key, $value, R_NEXT) )
+ { print "$key -> $value\n" }
+
+
+ undef $x ;
+ untie %h ;
+ }
+
+ ok(151, docat_del($file) eq ($db185mode == 1 ? <<'EOM' : <<'EOM') ) ;
+Smith -> John
+Wall -> Brick
+Wall -> Brick
+Wall -> Larry
+mouse -> mickey
+EOM
+Smith -> John
+Wall -> Larry
+Wall -> Brick
+Wall -> Brick
+mouse -> mickey
+EOM
+
+
+ {
+ my $redirect = new Redirect $file ;
+
+ # BTREE example 4
+ ###
+
+ use strict ;
+ use DB_File ;
+
+ use vars qw($filename $x %h ) ;
+
+ $filename = "tree" ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ my $cnt = $x->get_dup("Wall") ;
+ print "Wall occurred $cnt times\n" ;
+
+ my %hash = $x->get_dup("Wall", 1) ;
+ print "Larry is there\n" if $hash{'Larry'} ;
+ print "There are $hash{'Brick'} Brick Walls\n" ;
+
+ my @list = sort $x->get_dup("Wall") ;
+ print "Wall => [@list]\n" ;
+
+ @list = $x->get_dup("Smith") ;
+ print "Smith => [@list]\n" ;
+
+ @list = $x->get_dup("Dog") ;
+ print "Dog => [@list]\n" ;
+
+ undef $x ;
+ untie %h ;
+ }
+
+ ok(152, docat_del($file) eq <<'EOM') ;
+Wall occurred 3 times
+Larry is there
+There are 2 Brick Walls
+Wall => [Brick Brick Larry]
+Smith => [John]
+Dog => []
+EOM
+
+ {
+ my $redirect = new Redirect $file ;
+
+ # BTREE example 5
+ ###
+
+ use strict ;
+ use DB_File ;
+
+ use vars qw($filename $x %h $found) ;
+
+ my $filename = "tree" ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ;
+ print "Larry Wall is $found there\n" ;
+
+ $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ;
+ print "Harry Wall is $found there\n" ;
+
+ undef $x ;
+ untie %h ;
+ }
+
+ ok(153, docat_del($file) eq <<'EOM') ;
+Larry Wall is there
+Harry Wall is not there
+EOM
+
+ {
+ my $redirect = new Redirect $file ;
+
+ # BTREE example 6
+ ###
+
+ use strict ;
+ use DB_File ;
+
+ use vars qw($filename $x %h $found) ;
+
+ my $filename = "tree" ;
+
+ # Enable duplicate records
+ $DB_BTREE->{'flags'} = R_DUP ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ $x->del_dup("Wall", "Larry") ;
+
+ $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ;
+ print "Larry Wall is $found there\n" ;
+
+ undef $x ;
+ untie %h ;
+
+ unlink $filename ;
+ }
+
+ ok(154, docat_del($file) eq <<'EOM') ;
+Larry Wall is not there
+EOM
+
+ {
+ my $redirect = new Redirect $file ;
+
+ # BTREE example 7
+ ###
+
+ use strict ;
+ use DB_File ;
+ use Fcntl ;
+
+ use vars qw($filename $x %h $st $key $value) ;
+
+ sub match
+ {
+ my $key = shift ;
+ my $value = 0;
+ my $orig_key = $key ;
+ $x->seq($key, $value, R_CURSOR) ;
+ print "$orig_key\t-> $key\t-> $value\n" ;
+ }
+
+ $filename = "tree" ;
+ unlink $filename ;
+
+ $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE
+ or die "Cannot open $filename: $!\n";
+
+ # Add some key/value pairs to the file
+ $h{'mouse'} = 'mickey' ;
+ $h{'Wall'} = 'Larry' ;
+ $h{'Walls'} = 'Brick' ;
+ $h{'Smith'} = 'John' ;
+
+
+ $key = $value = 0 ;
+ print "IN ORDER\n" ;
+ for ($st = $x->seq($key, $value, R_FIRST) ;
+ $st == 0 ;
+ $st = $x->seq($key, $value, R_NEXT) )
+
+ { print "$key -> $value\n" }
+
+ print "\nPARTIAL MATCH\n" ;
+
+ match "Wa" ;
+ match "A" ;
+ match "a" ;
+
+ undef $x ;
+ untie %h ;
+
+ unlink $filename ;
+
+ }
+
+ ok(155, docat_del($file) eq <<'EOM') ;
+IN ORDER
+Smith -> John
+Wall -> Larry
+Walls -> Brick
+mouse -> mickey
+
+PARTIAL MATCH
+Wa -> Wall -> Larry
+A -> Smith -> John
+a -> mouse -> mickey
+EOM
+
+}
+
+#{
+# # R_SETCURSOR
+# use strict ;
+# my (%h, $db) ;
+# unlink $Dfile;
+#
+# ok(156, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) );
+#
+# $h{abc} = 33 ;
+# my $k = "newest" ;
+# my $v = 44 ;
+# my $status = $db->put($k, $v, R_SETCURSOR) ;
+# print "status = [$status]\n" ;
+# ok(157, $status == 0) ;
+# $status = $db->del($k, R_CURSOR) ;
+# print "status = [$status]\n" ;
+# ok(158, $status == 0) ;
+# $k = "newest" ;
+# ok(159, $db->get($k, $v, R_CURSOR)) ;
+#
+# ok(160, keys %h == 1) ;
+#
+# undef $db ;
+# untie %h;
+# unlink $Dfile;
+#}
+
exit ;
diff --git a/contrib/perl5/t/lib/db-hash.t b/contrib/perl5/t/lib/db-hash.t
index e748472..c52d8ae 100755
--- a/contrib/perl5/t/lib/db-hash.t
+++ b/contrib/perl5/t/lib/db-hash.t
@@ -1,10 +1,10 @@
#!./perl -w
BEGIN {
- @INC = '../lib' if -d '../lib' ;
+ unshift @INC, '../lib' if -d '../lib' ;
require Config; import Config;
if ($Config{'extensions'} !~ /\bDB_File\b/) {
- print "1..0\n";
+ print "1..0 # Skip: DB_File was not built\n";
exit 0;
}
}
@@ -12,7 +12,7 @@ BEGIN {
use DB_File;
use Fcntl;
-print "1..62\n";
+print "1..109\n";
sub ok
{
@@ -23,7 +23,40 @@ sub ok
print "ok $no\n" ;
}
-$Dfile = "dbhash.tmp";
+{
+ package Redirect ;
+ use Symbol ;
+
+ sub new
+ {
+ my $class = shift ;
+ my $filename = shift ;
+ my $fh = gensym ;
+ open ($fh, ">$filename") || die "Cannot open $filename: $!" ;
+ my $real_stdout = select($fh) ;
+ return bless [$fh, $real_stdout ] ;
+
+ }
+ sub DESTROY
+ {
+ my $self = shift ;
+ close $self->[0] ;
+ select($self->[1]) ;
+ }
+}
+
+sub docat_del
+{
+ my $file = shift;
+ local $/ = undef;
+ open(CAT,$file) || die "Cannot open $file: $!";
+ my $result = <CAT>;
+ close(CAT);
+ unlink $file ;
+ return $result;
+}
+
+my $Dfile = "dbhash.tmp";
unlink $Dfile;
umask(0);
@@ -164,6 +197,8 @@ ok(25, $#keys == 31) ;
$h{'foo'} = '';
ok(26, $h{'foo'} eq '' );
+# Berkeley DB 2 from version 2.4.10 onwards does not allow null keys.
+# This feature will be reenabled in a future version of Berkeley DB.
#$h{''} = 'bar';
#ok(27, $h{''} eq 'bar' );
ok(27,1) ;
@@ -413,4 +448,238 @@ EOM
unlink "SubDB.pm", "dbhash.tmp" ;
}
+
+{
+ # DBM Filter tests
+ use strict ;
+ my (%h, $db) ;
+ my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ unlink $Dfile;
+
+ sub checkOutput
+ {
+ my($fk, $sk, $fv, $sv) = @_ ;
+ return
+ $fetch_key eq $fk && $store_key eq $sk &&
+ $fetch_value eq $fv && $store_value eq $sv &&
+ $_ eq 'original' ;
+ }
+
+ ok(63, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) );
+
+ $db->filter_fetch_key (sub { $fetch_key = $_ }) ;
+ $db->filter_store_key (sub { $store_key = $_ }) ;
+ $db->filter_fetch_value (sub { $fetch_value = $_}) ;
+ $db->filter_store_value (sub { $store_value = $_ }) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ # fk sk fv sv
+ ok(64, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(65, $h{"fred"} eq "joe");
+ # fk sk fv sv
+ ok(66, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(67, $db->FIRSTKEY() eq "fred") ;
+ # fk sk fv sv
+ ok(68, checkOutput( "fred", "", "", "")) ;
+
+ # replace the filters, but remember the previous set
+ my ($old_fk) = $db->filter_fetch_key
+ (sub { $_ = uc $_ ; $fetch_key = $_ }) ;
+ my ($old_sk) = $db->filter_store_key
+ (sub { $_ = lc $_ ; $store_key = $_ }) ;
+ my ($old_fv) = $db->filter_fetch_value
+ (sub { $_ = "[$_]"; $fetch_value = $_ }) ;
+ my ($old_sv) = $db->filter_store_value
+ (sub { s/o/x/g; $store_value = $_ }) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"Fred"} = "Joe" ;
+ # fk sk fv sv
+ ok(69, checkOutput( "", "fred", "", "Jxe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(70, $h{"Fred"} eq "[Jxe]");
+ # fk sk fv sv
+ ok(71, checkOutput( "", "fred", "[Jxe]", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(72, $db->FIRSTKEY() eq "FRED") ;
+ # fk sk fv sv
+ ok(73, checkOutput( "FRED", "", "", "")) ;
+
+ # put the original filters back
+ $db->filter_fetch_key ($old_fk);
+ $db->filter_store_key ($old_sk);
+ $db->filter_fetch_value ($old_fv);
+ $db->filter_store_value ($old_sv);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(74, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(75, $h{"fred"} eq "joe");
+ ok(76, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(77, $db->FIRSTKEY() eq "fred") ;
+ ok(78, checkOutput( "fred", "", "", "")) ;
+
+ # delete the filters
+ $db->filter_fetch_key (undef);
+ $db->filter_store_key (undef);
+ $db->filter_fetch_value (undef);
+ $db->filter_store_value (undef);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(79, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(80, $h{"fred"} eq "joe");
+ ok(81, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(82, $db->FIRSTKEY() eq "fred") ;
+ ok(83, checkOutput( "", "", "", "")) ;
+
+ undef $db ;
+ untie %h;
+ unlink $Dfile;
+}
+
+{
+ # DBM Filter with a closure
+
+ use strict ;
+ my (%h, $db) ;
+
+ unlink $Dfile;
+ ok(84, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) );
+
+ my %result = () ;
+
+ sub Closure
+ {
+ my ($name) = @_ ;
+ my $count = 0 ;
+ my @kept = () ;
+
+ return sub { ++$count ;
+ push @kept, $_ ;
+ $result{$name} = "$name - $count: [@kept]" ;
+ }
+ }
+
+ $db->filter_store_key(Closure("store key")) ;
+ $db->filter_store_value(Closure("store value")) ;
+ $db->filter_fetch_key(Closure("fetch key")) ;
+ $db->filter_fetch_value(Closure("fetch value")) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ ok(85, $result{"store key"} eq "store key - 1: [fred]");
+ ok(86, $result{"store value"} eq "store value - 1: [joe]");
+ ok(87, ! defined $result{"fetch key"} );
+ ok(88, ! defined $result{"fetch value"} );
+ ok(89, $_ eq "original") ;
+
+ ok(90, $db->FIRSTKEY() eq "fred") ;
+ ok(91, $result{"store key"} eq "store key - 1: [fred]");
+ ok(92, $result{"store value"} eq "store value - 1: [joe]");
+ ok(93, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(94, ! defined $result{"fetch value"} );
+ ok(95, $_ eq "original") ;
+
+ $h{"jim"} = "john" ;
+ ok(96, $result{"store key"} eq "store key - 2: [fred jim]");
+ ok(97, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(98, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(99, ! defined $result{"fetch value"} );
+ ok(100, $_ eq "original") ;
+
+ ok(101, $h{"fred"} eq "joe");
+ ok(102, $result{"store key"} eq "store key - 3: [fred jim fred]");
+ ok(103, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(104, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(105, $result{"fetch value"} eq "fetch value - 1: [joe]");
+ ok(106, $_ eq "original") ;
+
+ undef $db ;
+ untie %h;
+ unlink $Dfile;
+}
+
+{
+ # DBM Filter recursion detection
+ use strict ;
+ my (%h, $db) ;
+ unlink $Dfile;
+
+ ok(107, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) );
+
+ $db->filter_store_key (sub { $_ = $h{$_} }) ;
+
+ eval '$h{1} = 1234' ;
+ ok(108, $@ =~ /^recursion detected in filter_store_key at/ );
+
+ undef $db ;
+ untie %h;
+ unlink $Dfile;
+}
+
+
+{
+ # Examples from the POD
+
+ my $file = "xyzt" ;
+ {
+ my $redirect = new Redirect $file ;
+
+ use strict ;
+ use DB_File ;
+ use vars qw( %h $k $v ) ;
+
+ unlink "fruit" ;
+ tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0640, $DB_HASH
+ or die "Cannot open file 'fruit': $!\n";
+
+ # Add a few key/value pairs to the file
+ $h{"apple"} = "red" ;
+ $h{"orange"} = "orange" ;
+ $h{"banana"} = "yellow" ;
+ $h{"tomato"} = "red" ;
+
+ # Check for existence of a key
+ print "Banana Exists\n\n" if $h{"banana"} ;
+
+ # Delete a key/value pair.
+ delete $h{"apple"} ;
+
+ # print the contents of the file
+ while (($k, $v) = each %h)
+ { print "$k -> $v\n" }
+
+ untie %h ;
+
+ unlink "fruit" ;
+ }
+
+ ok(109, docat_del($file) eq <<'EOM') ;
+Banana Exists
+
+orange -> orange
+tomato -> red
+banana -> yellow
+EOM
+
+}
+
exit ;
diff --git a/contrib/perl5/t/lib/db-recno.t b/contrib/perl5/t/lib/db-recno.t
index da703c9..276f38b 100755
--- a/contrib/perl5/t/lib/db-recno.t
+++ b/contrib/perl5/t/lib/db-recno.t
@@ -1,10 +1,10 @@
#!./perl -w
BEGIN {
- @INC = '../lib' if -d '../lib' ;
+ unshift @INC, '../lib' if -d '../lib' ;
require Config; import Config;
if ($Config{'extensions'} !~ /\bDB_File\b/) {
- print "1..0\n";
+ print "1..0 # Skip: DB_File was not built\n";
exit 0;
}
}
@@ -38,6 +38,49 @@ sub ok
return $result ;
}
+{
+ package Redirect ;
+ use Symbol ;
+
+ sub new
+ {
+ my $class = shift ;
+ my $filename = shift ;
+ my $fh = gensym ;
+ open ($fh, ">$filename") || die "Cannot open $filename: $!" ;
+ my $real_stdout = select($fh) ;
+ return bless [$fh, $real_stdout ] ;
+
+ }
+ sub DESTROY
+ {
+ my $self = shift ;
+ close $self->[0] ;
+ select($self->[1]) ;
+ }
+}
+
+sub docat
+{
+ my $file = shift;
+ local $/ = undef;
+ open(CAT,$file) || die "Cannot open $file:$!";
+ my $result = <CAT>;
+ close(CAT);
+ return $result;
+}
+
+sub docat_del
+{
+ my $file = shift;
+ local $/ = undef;
+ open(CAT,$file) || die "Cannot open $file: $!";
+ my $result = <CAT>;
+ close(CAT);
+ unlink $file ;
+ return $result;
+}
+
sub bad_one
{
print STDERR <<EOM unless $bad_ones++ ;
@@ -46,7 +89,7 @@ sub bad_one
# 53 and 55.
#
# You can safely ignore the errors if you're never going to use the
-# broken functionality (recno databases with a modified bval).
+# broken functionality (recno databases with a modified bval).
# Otherwise you'll have to upgrade your DB library.
#
# If you want to use Berkeley DB version 1, then 1.85 and 1.86 are the
@@ -56,7 +99,7 @@ sub bad_one
EOM
}
-print "1..78\n";
+print "1..126\n";
my $Dfile = "recno.tmp";
unlink $Dfile ;
@@ -209,16 +252,6 @@ untie(@h);
unlink $Dfile;
-sub docat
-{
- my $file = shift;
- local $/ = undef;
- open(CAT,$file) || die "Cannot open $file:$!";
- my $result = <CAT>;
- close(CAT);
- return $result;
-}
-
{
# Check bval defaults to \n
@@ -452,4 +485,355 @@ EOM
}
+{
+ # DBM Filter tests
+ use strict ;
+ my (@h, $db) ;
+ my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ unlink $Dfile;
+
+ sub checkOutput
+ {
+ my($fk, $sk, $fv, $sv) = @_ ;
+ return
+ $fetch_key eq $fk && $store_key eq $sk &&
+ $fetch_value eq $fv && $store_value eq $sv &&
+ $_ eq 'original' ;
+ }
+
+ ok(79, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) );
+
+ $db->filter_fetch_key (sub { $fetch_key = $_ }) ;
+ $db->filter_store_key (sub { $store_key = $_ }) ;
+ $db->filter_fetch_value (sub { $fetch_value = $_}) ;
+ $db->filter_store_value (sub { $store_value = $_ }) ;
+
+ $_ = "original" ;
+
+ $h[0] = "joe" ;
+ # fk sk fv sv
+ ok(80, checkOutput( "", 0, "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(81, $h[0] eq "joe");
+ # fk sk fv sv
+ ok(82, checkOutput( "", 0, "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(83, $db->FIRSTKEY() == 0) ;
+ # fk sk fv sv
+ ok(84, checkOutput( 0, "", "", "")) ;
+
+ # replace the filters, but remember the previous set
+ my ($old_fk) = $db->filter_fetch_key
+ (sub { ++ $_ ; $fetch_key = $_ }) ;
+ my ($old_sk) = $db->filter_store_key
+ (sub { $_ *= 2 ; $store_key = $_ }) ;
+ my ($old_fv) = $db->filter_fetch_value
+ (sub { $_ = "[$_]"; $fetch_value = $_ }) ;
+ my ($old_sv) = $db->filter_store_value
+ (sub { s/o/x/g; $store_value = $_ }) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h[1] = "Joe" ;
+ # fk sk fv sv
+ ok(85, checkOutput( "", 2, "", "Jxe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(86, $h[1] eq "[Jxe]");
+ # fk sk fv sv
+ ok(87, checkOutput( "", 2, "[Jxe]", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(88, $db->FIRSTKEY() == 1) ;
+ # fk sk fv sv
+ ok(89, checkOutput( 1, "", "", "")) ;
+
+ # put the original filters back
+ $db->filter_fetch_key ($old_fk);
+ $db->filter_store_key ($old_sk);
+ $db->filter_fetch_value ($old_fv);
+ $db->filter_store_value ($old_sv);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h[0] = "joe" ;
+ ok(90, checkOutput( "", 0, "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(91, $h[0] eq "joe");
+ ok(92, checkOutput( "", 0, "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(93, $db->FIRSTKEY() == 0) ;
+ ok(94, checkOutput( 0, "", "", "")) ;
+
+ # delete the filters
+ $db->filter_fetch_key (undef);
+ $db->filter_store_key (undef);
+ $db->filter_fetch_value (undef);
+ $db->filter_store_value (undef);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h[0] = "joe" ;
+ ok(95, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(96, $h[0] eq "joe");
+ ok(97, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(98, $db->FIRSTKEY() == 0) ;
+ ok(99, checkOutput( "", "", "", "")) ;
+
+ undef $db ;
+ untie @h;
+ unlink $Dfile;
+}
+
+{
+ # DBM Filter with a closure
+
+ use strict ;
+ my (@h, $db) ;
+
+ unlink $Dfile;
+ ok(100, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) );
+
+ my %result = () ;
+
+ sub Closure
+ {
+ my ($name) = @_ ;
+ my $count = 0 ;
+ my @kept = () ;
+
+ return sub { ++$count ;
+ push @kept, $_ ;
+ $result{$name} = "$name - $count: [@kept]" ;
+ }
+ }
+
+ $db->filter_store_key(Closure("store key")) ;
+ $db->filter_store_value(Closure("store value")) ;
+ $db->filter_fetch_key(Closure("fetch key")) ;
+ $db->filter_fetch_value(Closure("fetch value")) ;
+
+ $_ = "original" ;
+
+ $h[0] = "joe" ;
+ ok(101, $result{"store key"} eq "store key - 1: [0]");
+ ok(102, $result{"store value"} eq "store value - 1: [joe]");
+ ok(103, ! defined $result{"fetch key"} );
+ ok(104, ! defined $result{"fetch value"} );
+ ok(105, $_ eq "original") ;
+
+ ok(106, $db->FIRSTKEY() == 0 ) ;
+ ok(107, $result{"store key"} eq "store key - 1: [0]");
+ ok(108, $result{"store value"} eq "store value - 1: [joe]");
+ ok(109, $result{"fetch key"} eq "fetch key - 1: [0]");
+ ok(110, ! defined $result{"fetch value"} );
+ ok(111, $_ eq "original") ;
+
+ $h[7] = "john" ;
+ ok(112, $result{"store key"} eq "store key - 2: [0 7]");
+ ok(113, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(114, $result{"fetch key"} eq "fetch key - 1: [0]");
+ ok(115, ! defined $result{"fetch value"} );
+ ok(116, $_ eq "original") ;
+
+ ok(117, $h[0] eq "joe");
+ ok(118, $result{"store key"} eq "store key - 3: [0 7 0]");
+ ok(119, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(120, $result{"fetch key"} eq "fetch key - 1: [0]");
+ ok(121, $result{"fetch value"} eq "fetch value - 1: [joe]");
+ ok(122, $_ eq "original") ;
+
+ undef $db ;
+ untie @h;
+ unlink $Dfile;
+}
+
+{
+ # DBM Filter recursion detection
+ use strict ;
+ my (@h, $db) ;
+ unlink $Dfile;
+
+ ok(123, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) );
+
+ $db->filter_store_key (sub { $_ = $h[0] }) ;
+
+ eval '$h[1] = 1234' ;
+ ok(124, $@ =~ /^recursion detected in filter_store_key at/ );
+
+ undef $db ;
+ untie @h;
+ unlink $Dfile;
+}
+
+
+{
+ # Examples from the POD
+
+ my $file = "xyzt" ;
+ {
+ my $redirect = new Redirect $file ;
+
+ use strict ;
+ use DB_File ;
+
+ my $filename = "text" ;
+ unlink $filename ;
+
+ my @h ;
+ my $x = tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_RECNO
+ or die "Cannot open file 'text': $!\n" ;
+
+ # Add a few key/value pairs to the file
+ $h[0] = "orange" ;
+ $h[1] = "blue" ;
+ $h[2] = "yellow" ;
+
+ $FA ? push @h, "green", "black"
+ : $x->push("green", "black") ;
+
+ my $elements = $FA ? scalar @h : $x->length ;
+ print "The array contains $elements entries\n" ;
+
+ my $last = $FA ? pop @h : $x->pop ;
+ print "popped $last\n" ;
+
+ $FA ? unshift @h, "white"
+ : $x->unshift("white") ;
+ my $first = $FA ? shift @h : $x->shift ;
+ print "shifted $first\n" ;
+
+ # Check for existence of a key
+ print "Element 1 Exists with value $h[1]\n" if $h[1] ;
+
+ # use a negative index
+ print "The last element is $h[-1]\n" ;
+ print "The 2nd last element is $h[-2]\n" ;
+
+ undef $x ;
+ untie @h ;
+
+ unlink $filename ;
+ }
+
+ ok(125, docat_del($file) eq <<'EOM') ;
+The array contains 5 entries
+popped black
+shifted white
+Element 1 Exists with value blue
+The last element is green
+The 2nd last element is yellow
+EOM
+
+ my $save_output = "xyzt" ;
+ {
+ my $redirect = new Redirect $save_output ;
+
+ use strict ;
+ use vars qw(@h $H $file $i) ;
+ use DB_File ;
+ use Fcntl ;
+
+ $file = "text" ;
+
+ unlink $file ;
+
+ $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0640, $DB_RECNO
+ or die "Cannot open file $file: $!\n" ;
+
+ # first create a text file to play with
+ $h[0] = "zero" ;
+ $h[1] = "one" ;
+ $h[2] = "two" ;
+ $h[3] = "three" ;
+ $h[4] = "four" ;
+
+
+ # Print the records in order.
+ #
+ # The length method is needed here because evaluating a tied
+ # array in a scalar context does not return the number of
+ # elements in the array.
+
+ print "\nORIGINAL\n" ;
+ foreach $i (0 .. $H->length - 1) {
+ print "$i: $h[$i]\n" ;
+ }
+
+ # use the push & pop methods
+ $a = $H->pop ;
+ $H->push("last") ;
+ print "\nThe last record was [$a]\n" ;
+
+ # and the shift & unshift methods
+ $a = $H->shift ;
+ $H->unshift("first") ;
+ print "The first record was [$a]\n" ;
+
+ # Use the API to add a new record after record 2.
+ $i = 2 ;
+ $H->put($i, "Newbie", R_IAFTER) ;
+
+ # and a new record before record 1.
+ $i = 1 ;
+ $H->put($i, "New One", R_IBEFORE) ;
+
+ # delete record 3
+ $H->del(3) ;
+
+ # now print the records in reverse order
+ print "\nREVERSE\n" ;
+ for ($i = $H->length - 1 ; $i >= 0 ; -- $i)
+ { print "$i: $h[$i]\n" }
+
+ # same again, but use the API functions instead
+ print "\nREVERSE again\n" ;
+ my ($s, $k, $v) = (0, 0, 0) ;
+ for ($s = $H->seq($k, $v, R_LAST) ;
+ $s == 0 ;
+ $s = $H->seq($k, $v, R_PREV))
+ { print "$k: $v\n" }
+
+ undef $H ;
+ untie @h ;
+
+ unlink $file ;
+ }
+
+ ok(126, docat_del($save_output) eq <<'EOM') ;
+
+ORIGINAL
+0: zero
+1: one
+2: two
+3: three
+4: four
+
+The last record was [four]
+The first record was [zero]
+
+REVERSE
+5: last
+4: three
+3: Newbie
+2: one
+1: New One
+0: first
+
+REVERSE again
+5: last
+4: three
+3: Newbie
+2: one
+1: New One
+0: first
+EOM
+
+}
+
exit ;
diff --git a/contrib/perl5/t/lib/dirhand.t b/contrib/perl5/t/lib/dirhand.t
index aa7be35..a8683c7 100755
--- a/contrib/perl5/t/lib/dirhand.t
+++ b/contrib/perl5/t/lib/dirhand.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if (not $Config{'d_readdir'}) {
print "1..0\n";
diff --git a/contrib/perl5/t/lib/dosglob.t b/contrib/perl5/t/lib/dosglob.t
index 577d4ea..ea537bf 100755
--- a/contrib/perl5/t/lib/dosglob.t
+++ b/contrib/perl5/t/lib/dosglob.t
@@ -6,7 +6,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..10\n";
diff --git a/contrib/perl5/t/lib/dprof.t b/contrib/perl5/t/lib/dprof.t
new file mode 100755
index 0000000..4d6f782
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof.t
@@ -0,0 +1,80 @@
+#!perl
+
+BEGIN {
+ chdir( 't' ) if -d 't';
+ unshift @INC, '../lib';
+}
+
+END {
+ unlink 'tmon.out', 'err';
+}
+
+use Benchmark qw( timediff timestr );
+use Getopt::Std 'getopts';
+use Config '%Config';
+getopts('vI:p:');
+
+# -v Verbose
+# -I Add to @INC
+# -p Name of perl binary
+
+@tests = @ARGV ? @ARGV : sort <lib/dprof/*_t lib/dprof/*_v>; # glob-sort, for OS/2
+
+$path_sep = $Config{path_sep} || ':';
+$perl5lib = $opt_I || join( $path_sep, @INC );
+$perl = $opt_p || $^X;
+
+if( $opt_v ){
+ print "tests: @tests\n";
+ print "perl: $perl\n";
+ print "perl5lib: $perl5lib\n";
+}
+if( $perl =~ m|^\./| ){
+ # turn ./perl into ../perl, because of chdir(t) above.
+ $perl = ".$perl";
+}
+if( ! -f $perl ){ die "Where's Perl?" }
+
+sub profile {
+ my $test = shift;
+ my @results;
+ local $ENV{PERL5LIB} = $perl5lib;
+ my $opt_d = '-d:DProf';
+
+ my $t_start = new Benchmark;
+ open( R, "$perl $opt_d $test |" ) || warn "$0: Can't run. $!\n";
+ @results = <R>;
+ close R;
+ my $t_total = timediff( new Benchmark, $t_start );
+
+ if( $opt_v ){
+ print "\n";
+ print @results
+ }
+
+ print timestr( $t_total, 'nop' ), "\n";
+}
+
+
+sub verify {
+ my $test = shift;
+
+ system $perl, '-I../lib', '-I./lib/dprof', $test,
+ $opt_v?'-v':'', '-p', $perl;
+}
+
+
+$| = 1;
+print "1..18\n";
+while( @tests ){
+ $test = shift @tests;
+ if( $test =~ /_t$/i ){
+ print "# $test" . '.' x (20 - length $test);
+ profile $test;
+ }
+ else{
+ verify $test;
+ }
+}
+
+unlink("tmon.out");
diff --git a/contrib/perl5/t/lib/dprof/V.pm b/contrib/perl5/t/lib/dprof/V.pm
new file mode 100644
index 0000000..7e34da5
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/V.pm
@@ -0,0 +1,59 @@
+package V;
+
+use Getopt::Std 'getopts';
+getopts('vp:d:');
+
+require Exporter;
+@ISA = 'Exporter';
+
+@EXPORT = qw( dprofpp $opt_v $results $expected report @results );
+@EXPORT_OK = qw( notok ok $num );
+
+$num = 0;
+$results = $expected = '';
+$perl = $opt_p || $^X;
+$dpp = $opt_d || '../utils/dprofpp';
+
+print "\nperl: $perl\n" if $opt_v;
+if( ! -f $perl ){ die "Where's Perl?" }
+if( ! -f $dpp ){ die "Where's dprofpp?" }
+
+sub dprofpp {
+ my $switches = shift;
+
+ open( D, "$perl -I../lib $dpp $switches 2> err |" ) || warn "$0: Can't run. $!\n";
+ @results = <D>;
+ close D;
+
+ open( D, "<err" ) || warn "$0: Can't open: $!\n";
+ @err = <D>;
+ close D;
+ push( @results, @err ) if @err;
+
+ $results = qq{@results};
+ # ignore Loader (Dyna/Auto etc), leave newline
+ $results =~ s/^\w+Loader::import//;
+ $results =~ s/\n /\n/gm;
+ $results;
+}
+
+sub report {
+ $num = shift;
+ my $sub = shift;
+ my $x;
+
+ $x = &$sub;
+ $x ? &ok : &notok;
+}
+
+sub ok {
+ print "ok $num\n";
+}
+
+sub notok {
+ print "not ok $num\n";
+ print "\nResult\n{$results}\n";
+ print "Expected\n{$expected}\n";
+}
+
+1;
diff --git a/contrib/perl5/t/lib/dprof/test1_t b/contrib/perl5/t/lib/dprof/test1_t
new file mode 100644
index 0000000..d504cd5
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test1_t
@@ -0,0 +1,18 @@
+sub foo {
+ print "in sub foo\n";
+ bar();
+}
+
+sub bar {
+ print "in sub bar\n";
+}
+
+sub baz {
+ print "in sub baz\n";
+ bar();
+ foo();
+}
+
+bar();
+baz();
+foo();
diff --git a/contrib/perl5/t/lib/dprof/test1_v b/contrib/perl5/t/lib/dprof/test1_v
new file mode 100644
index 0000000..542a503
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test1_v
@@ -0,0 +1,24 @@
+# perl
+
+use V;
+
+dprofpp( '-T' );
+$expected =
+qq{main::bar
+main::baz
+ main::bar
+ main::foo
+ main::bar
+main::foo
+ main::bar
+};
+report 1, sub { $expected eq $results };
+
+dprofpp('-TF');
+report 2, sub { $expected eq $results };
+
+dprofpp( '-t' );
+report 3, sub { $expected eq $results };
+
+dprofpp('-tF');
+report 4, sub { $expected eq $results };
diff --git a/contrib/perl5/t/lib/dprof/test2_t b/contrib/perl5/t/lib/dprof/test2_t
new file mode 100644
index 0000000..edc46c5
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test2_t
@@ -0,0 +1,21 @@
+sub foo {
+ print "in sub foo\n";
+ bar();
+}
+
+sub bar {
+ print "in sub bar\n";
+}
+
+sub baz {
+ print "in sub baz\n";
+ bar();
+ bar();
+ bar();
+ foo();
+}
+
+bar();
+bar();
+baz();
+foo();
diff --git a/contrib/perl5/t/lib/dprof/test2_v b/contrib/perl5/t/lib/dprof/test2_v
new file mode 100644
index 0000000..8b775b3
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test2_v
@@ -0,0 +1,36 @@
+# perl
+
+use V;
+
+dprofpp( '-T' );
+$expected =
+qq{main::bar
+main::bar
+main::baz
+ main::bar
+ main::bar
+ main::bar
+ main::foo
+ main::bar
+main::foo
+ main::bar
+};
+report 5, sub { $expected eq $results };
+
+dprofpp('-TF');
+report 6, sub { $expected eq $results };
+
+dprofpp( '-t' );
+$expected =
+qq{main::bar (2x)
+main::baz
+ main::bar (3x)
+ main::foo
+ main::bar
+main::foo
+ main::bar
+};
+report 7, sub { $expected eq $results };
+
+dprofpp('-tF');
+report 8, sub { $expected eq $results };
diff --git a/contrib/perl5/t/lib/dprof/test3_t b/contrib/perl5/t/lib/dprof/test3_t
new file mode 100644
index 0000000..a5327f4
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test3_t
@@ -0,0 +1,19 @@
+sub foo {
+ print "in sub foo\n";
+ exit(0);
+ bar();
+}
+
+sub bar {
+ print "in sub bar\n";
+}
+
+sub baz {
+ print "in sub baz\n";
+ bar();
+ foo();
+}
+
+bar();
+baz();
+foo();
diff --git a/contrib/perl5/t/lib/dprof/test3_v b/contrib/perl5/t/lib/dprof/test3_v
new file mode 100644
index 0000000..df7543e
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test3_v
@@ -0,0 +1,29 @@
+# perl
+
+use V;
+
+dprofpp( '-T' );
+$e1 = $expected =
+qq{main::bar
+main::baz
+ main::bar
+ main::foo
+};
+report 9, sub { $expected eq $results };
+
+dprofpp('-TF');
+$e2 = $expected =
+qq{main::bar
+main::baz
+ main::bar
+ main::foo
+};
+report 10, sub { $expected eq $results };
+
+dprofpp( '-t' );
+$expected = $e1;
+report 11, sub { 1 };
+
+dprofpp('-tF');
+$expected = $e2;
+report 12, sub { $expected eq $results };
diff --git a/contrib/perl5/t/lib/dprof/test4_t b/contrib/perl5/t/lib/dprof/test4_t
new file mode 100644
index 0000000..7299682
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test4_t
@@ -0,0 +1,24 @@
+sub foo {
+ print "in sub foo\n";
+ bar();
+}
+
+sub bar {
+ print "in sub bar\n";
+}
+
+sub baz {
+ print "in sub baz\n";
+ bar();
+ bar();
+ bar();
+ foo();
+}
+
+bar();
+
+eval { fork };
+
+bar();
+baz();
+foo();
diff --git a/contrib/perl5/t/lib/dprof/test4_v b/contrib/perl5/t/lib/dprof/test4_v
new file mode 100644
index 0000000..d9677ff
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test4_v
@@ -0,0 +1,36 @@
+# perl
+
+use V;
+
+dprofpp( '-T' );
+$expected =
+qq{main::bar
+main::bar
+main::baz
+ main::bar
+ main::bar
+ main::bar
+ main::foo
+ main::bar
+main::foo
+ main::bar
+};
+report 13, sub { $expected eq $results };
+
+dprofpp('-TF');
+report 14, sub { $expected eq $results };
+
+dprofpp( '-t' );
+$expected =
+qq{main::bar (2x)
+main::baz
+ main::bar (3x)
+ main::foo
+ main::bar
+main::foo
+ main::bar
+};
+report 15, sub { $expected eq $results };
+
+dprofpp('-tF');
+report 16, sub { $expected eq $results };
diff --git a/contrib/perl5/t/lib/dprof/test5_t b/contrib/perl5/t/lib/dprof/test5_t
new file mode 100644
index 0000000..0b11137
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test5_t
@@ -0,0 +1,25 @@
+# Test that dprof doesn't break
+# &bar; used as &bar(@_);
+
+sub foo1 {
+ print "in foo1(@_)\n";
+ bar(@_);
+}
+sub foo2 {
+ print "in foo2(@_)\n";
+ &bar;
+}
+sub bar {
+ print "in bar(@_)\n";
+ if( @_ > 0 ){
+ &yeppers;
+ }
+}
+sub yeppers {
+ print "rest easy\n";
+}
+
+
+&foo1( A );
+&foo2( B );
+
diff --git a/contrib/perl5/t/lib/dprof/test5_v b/contrib/perl5/t/lib/dprof/test5_v
new file mode 100644
index 0000000..9e9298c
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test5_v
@@ -0,0 +1,15 @@
+# perl
+
+use V;
+
+dprofpp( '-T' );
+$expected =
+qq{main::foo1
+ main::bar
+ main::yeppers
+main::foo2
+ main::bar
+ main::yeppers
+};
+report 17, sub { $expected eq $results };
+
diff --git a/contrib/perl5/t/lib/dprof/test6_t b/contrib/perl5/t/lib/dprof/test6_t
new file mode 100644
index 0000000..7b8bf4a
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test6_t
@@ -0,0 +1,29 @@
+sub foo {
+ my $x;
+ my $y;
+ print "in sub foo\n";
+ for( $x = 1; $x < 100; ++$x ){
+ bar();
+ for( $y = 1; $y < 100; ++$y ){
+ }
+ }
+}
+
+sub bar {
+ my $x;
+ print "in sub bar\n";
+ for( $x = 1; $x < 100; ++$x ){
+ }
+ die "bar exiting";
+}
+
+sub baz {
+ print "in sub baz\n";
+ eval { bar(); };
+ eval { foo(); };
+}
+
+eval { bar(); };
+baz();
+eval { foo(); };
+
diff --git a/contrib/perl5/t/lib/dprof/test6_v b/contrib/perl5/t/lib/dprof/test6_v
new file mode 100644
index 0000000..2f651ea
--- /dev/null
+++ b/contrib/perl5/t/lib/dprof/test6_v
@@ -0,0 +1,16 @@
+# perl
+
+use V;
+
+dprofpp( '-T' );
+$expected =
+qq{main::bar
+main::baz
+ main::bar
+ main::foo
+ main::bar
+main::foo
+ main::bar
+};
+report 18, sub { $expected eq $results };
+
diff --git a/contrib/perl5/t/lib/dumper-ovl.t b/contrib/perl5/t/lib/dumper-ovl.t
index db4a5d9..8c095e5 100755
--- a/contrib/perl5/t/lib/dumper-ovl.t
+++ b/contrib/perl5/t/lib/dumper-ovl.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
use Data::Dumper;
diff --git a/contrib/perl5/t/lib/dumper.t b/contrib/perl5/t/lib/dumper.t
index 8c8dc40..3167535 100755
--- a/contrib/perl5/t/lib/dumper.t
+++ b/contrib/perl5/t/lib/dumper.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
use Data::Dumper;
@@ -22,6 +22,16 @@ sub TEST {
my $string = shift;
my $t = eval $string;
++$TNUM;
+ $t =~ s/([A-Z]+)\(0x[0-9a-f]+\)/$1(0xdeadbeef)/g
+ if ($WANT =~ /deadbeef/);
+ if ($Is_ebcdic) {
+ # these data need massaging with non ascii character sets
+ # because of hashing order differences
+ $WANT = join("\n",sort(split(/\n/,$WANT)));
+ $WANT =~ s/\,$//mg;
+ $t = join("\n",sort(split(/\n/,$t)));
+ $t =~ s/\,$//mg;
+ }
print( ($t eq $WANT and not $@) ? "ok $TNUM\n"
: "not ok $TNUM\n--Expected--\n$WANT\n--Got--\n$@$t\n");
@@ -31,17 +41,26 @@ sub TEST {
$t = eval $string;
++$TNUM;
+ $t =~ s/([A-Z]+)\(0x[0-9a-f]+\)/$1(0xdeadbeef)/g
+ if ($WANT =~ /deadbeef/);
+ if ($Is_ebcdic) {
+ # here too there are hashing order differences
+ $WANT = join("\n",sort(split(/\n/,$WANT)));
+ $WANT =~ s/\,$//mg;
+ $t = join("\n",sort(split(/\n/,$t)));
+ $t =~ s/\,$//mg;
+ }
print( ($t eq $WANT and not $@) ? "ok $TNUM\n"
: "not ok $TNUM\n--Expected--\n$WANT\n--Got--\n$@$t\n");
}
if (defined &Data::Dumper::Dumpxs) {
print "### XS extension loaded, will run XS tests\n";
- $TMAX = 162; $XS = 1;
+ $TMAX = 186; $XS = 1;
}
else {
print "### XS extensions not loaded, will NOT run XS tests\n";
- $TMAX = 81; $XS = 0;
+ $TMAX = 93; $XS = 0;
}
print "1..$TMAX\n";
@@ -236,20 +255,11 @@ EOT
############# 43
##
-if (!$Is_ebcdic) {
$WANT = <<'EOT';
#$VAR1 = {
# "abc\0'\efg" => "mno\0"
#};
EOT
-}
-else {
-$WANT = <<'EOT';
-#$VAR1 = {
-# "\201\202\203\340\360'\340\205\206\207" => "\224\225\226\340\360"
-#};
-EOT
-}
$foo = { "abc\000\'\efg" => "mno\000" };
{
@@ -291,11 +301,11 @@ EOT
# #0
# 10,
# #1
-# '',
+# do{my $o},
# #2
# {
# 'a' => 1,
-# 'b' => '',
+# 'b' => do{my $o},
# 'c' => [],
# 'd' => {}
# }
@@ -321,10 +331,10 @@ EOT
#*::foo = \5;
#*::foo = [
# 10,
-# '',
+# do{my $o},
# {
# 'a' => 1,
-# 'b' => '',
+# 'b' => do{my $o},
# 'c' => [],
# 'd' => {}
# }
@@ -354,7 +364,7 @@ EOT
#*::foo = \@bar;
#*::foo = {
# 'a' => 1,
-# 'b' => '',
+# 'b' => do{my $o},
# 'c' => [],
# 'd' => {}
#};
@@ -381,7 +391,7 @@ EOT
#*::foo = $bar;
#*::foo = {
# 'a' => 1,
-# 'b' => '',
+# 'b' => do{my $o},
# 'c' => [],
# 'd' => {}
#};
@@ -455,7 +465,6 @@ EOT
############# 85
##
-if (!$Is_ebcdic) {
$WANT = <<'EOT';
#%kennels = (
# First => \'Fido',
@@ -468,21 +477,6 @@ if (!$Is_ebcdic) {
#);
#%mutts = %kennels;
EOT
-}
-else {
- $WANT = <<'EOT';
-#%kennels = (
-# Second => \'Wags',
-# First => \'Fido'
-#);
-#@dogs = (
-# ${$kennels{First}},
-# ${$kennels{Second}},
-# \%kennels
-#);
-#%mutts = %kennels;
-EOT
-}
TEST q(
$d = Data::Dumper->new([\\%kennel, \\@dogs, $mutts],
@@ -510,7 +504,6 @@ EOT
############# 97
##
-if (!$Is_ebcdic) {
$WANT = <<'EOT';
#%kennels = (
# First => \'Fido',
@@ -523,21 +516,7 @@ if (!$Is_ebcdic) {
#);
#%mutts = %kennels;
EOT
-}
-else {
- $WANT = <<'EOT';
-#%kennels = (
-# Second => \'Wags',
-# First => \'Fido'
-#);
-#@dogs = (
-# ${$kennels{First}},
-# ${$kennels{Second}},
-# \%kennels
-#);
-#%mutts = %kennels;
-EOT
-}
+
TEST q($d->Reset; $d->Dump);
if ($XS) {
@@ -546,8 +525,7 @@ EOT
############# 103
##
-if (!$Is_ebcdic) {
- $WANT = <<'EOT';
+ $WANT = <<'EOT';
#@dogs = (
# 'Fido',
# 'Wags',
@@ -559,21 +537,6 @@ if (!$Is_ebcdic) {
#%kennels = %{$dogs[2]};
#%mutts = %{$dogs[2]};
EOT
-}
-else {
- $WANT = <<'EOT';
-#@dogs = (
-# 'Fido',
-# 'Wags',
-# {
-# Second => \$dogs[1],
-# First => \$dogs[0]
-# }
-#);
-#%kennels = %{$dogs[2]};
-#%mutts = %{$dogs[2]};
-EOT
-}
TEST q(
$d = Data::Dumper->new([\\@dogs, \\%kennel, $mutts],
@@ -597,7 +560,6 @@ EOT
############# 115
##
-if (!$Is_ebcdic) {
$WANT = <<'EOT';
#@dogs = (
# 'Fido',
@@ -612,23 +574,6 @@ if (!$Is_ebcdic) {
# Second => \'Wags'
#);
EOT
-}
-else {
- $WANT = <<'EOT';
-#@dogs = (
-# 'Fido',
-# 'Wags',
-# {
-# Second => \'Wags',
-# First => \'Fido'
-# }
-#);
-#%kennels = (
-# Second => \'Wags',
-# First => \'Fido'
-#);
-EOT
-}
TEST q(
$d = Data::Dumper->new( [\@dogs, \%kennel], [qw(*dogs *kennels)] );
@@ -695,7 +640,7 @@ TEST q(Data::Dumper->new([\&z,$c],['*a','*c'])->Seen({'*b' => \&z})->Dumpxs;)
$WANT = <<'EOT';
#@a = (
# undef,
-# ''
+# do{my $o}
#);
#$a[1] = \$a[0];
EOT
@@ -732,7 +677,7 @@ TEST q(Data::Dumper->new([$a,$b],['a','b'])->Purity(1)->Dumpxs;)
# {
# a => \[
# {
-# c => ''
+# c => do{my $o}
# },
# {
# d => \[]
@@ -778,3 +723,79 @@ TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dump;);
TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Purity(1)->Dumpxs;)
if $XS;
}
+
+{
+ $f = "pearl";
+ $e = [ $f ];
+ $d = { 'e' => $e };
+ $c = [ $d ];
+ $b = { 'c' => $c };
+ $a = { 'b' => $b };
+
+############# 163
+##
+ $WANT = <<'EOT';
+#$a = {
+# b => {
+# c => [
+# {
+# e => 'ARRAY(0xdeadbeef)'
+# }
+# ]
+# }
+#};
+#$b = $a->{b};
+#$c = $a->{b}{c};
+EOT
+
+TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dump;);
+TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(4)->Dumpxs;)
+ if $XS;
+
+############# 169
+##
+ $WANT = <<'EOT';
+#$a = {
+# b => 'HASH(0xdeadbeef)'
+#};
+#$b = $a->{b};
+#$c = [
+# 'HASH(0xdeadbeef)'
+#];
+EOT
+
+TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dump;);
+TEST q(Data::Dumper->new([$a,$b,$c],['a','b','c'])->Maxdepth(1)->Dumpxs;)
+ if $XS;
+}
+
+{
+ $a = \$a;
+ $b = [$a];
+
+############# 175
+##
+ $WANT = <<'EOT';
+#$b = [
+# \$b->[0]
+#];
+EOT
+
+TEST q(Data::Dumper->new([$b],['b'])->Purity(0)->Dump;);
+TEST q(Data::Dumper->new([$b],['b'])->Purity(0)->Dumpxs;)
+ if $XS;
+
+############# 181
+##
+ $WANT = <<'EOT';
+#$b = [
+# \do{my $o}
+#];
+#${$b->[0]} = $b->[0];
+EOT
+
+
+TEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dump;);
+TEST q(Data::Dumper->new([$b],['b'])->Purity(1)->Dumpxs;)
+ if $XS;
+}
diff --git a/contrib/perl5/t/lib/english.t b/contrib/perl5/t/lib/english.t
index 9691229..dba68db 100755
--- a/contrib/perl5/t/lib/english.t
+++ b/contrib/perl5/t/lib/english.t
@@ -2,10 +2,10 @@
print "1..16\n";
-BEGIN { @INC = '../lib' }
+BEGIN { unshift @INC, '../lib' }
use English;
use Config;
-my $threads = $Config{'usethreads'} || 0;
+my $threads = $Config{'use5005threads'} || 0;
print $PID == $$ ? "ok 1\n" : "not ok 1\n";
diff --git a/contrib/perl5/t/lib/env-array.t b/contrib/perl5/t/lib/env-array.t
new file mode 100755
index 0000000..d90d892
--- /dev/null
+++ b/contrib/perl5/t/lib/env-array.t
@@ -0,0 +1,100 @@
+#!./perl
+
+$| = 1;
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+if ($^O eq 'VMS') {
+ print "1..11\n";
+ foreach (1..11) { print "ok $_ # skipped for VMS\n"; }
+ exit 0;
+}
+
+use Env qw(@FOO);
+use vars qw(@BAR);
+
+sub array_equal
+{
+ my ($a, $b) = @_;
+ return 0 unless scalar(@$a) == scalar(@$b);
+ for my $i (0..scalar(@$a) - 1) {
+ return 0 unless $a->[$i] eq $b->[$i];
+ }
+ return 1;
+}
+
+sub test
+{
+ my ($desc, $code) = @_;
+
+ &$code;
+
+ print "# $desc...\n";
+ print "# FOO = (", join(", ", @FOO), ")\n";
+ print "# BAR = (", join(", ", @BAR), ")\n";
+
+ if (defined $check) { print "not " unless &$check; }
+ else { print "not " unless array_equal(\@FOO, \@BAR); }
+
+ print "ok ", ++$i, "\n";
+}
+
+print "1..11\n";
+
+test "Assignment", sub {
+ @FOO = qw(a B c);
+ @BAR = qw(a B c);
+};
+
+test "Storing", sub {
+ $FOO[1] = 'b';
+ $BAR[1] = 'b';
+};
+
+test "Truncation", sub {
+ $#FOO = 0;
+ $#BAR = 0;
+};
+
+test "Push", sub {
+ push @FOO, 'b', 'c';
+ push @BAR, 'b', 'c';
+};
+
+test "Pop", sub {
+ pop @FOO;
+ pop @BAR;
+};
+
+test "Shift", sub {
+ shift @FOO;
+ shift @BAR;
+};
+
+test "Push", sub {
+ push @FOO, 'c';
+ push @BAR, 'c';
+};
+
+test "Unshift", sub {
+ unshift @FOO, 'a';
+ unshift @BAR, 'a';
+};
+
+test "Reverse", sub {
+ @FOO = reverse @FOO;
+ @BAR = reverse @BAR;
+};
+
+test "Sort", sub {
+ @FOO = sort @FOO;
+ @BAR = sort @BAR;
+};
+
+test "Splice", sub {
+ splice @FOO, 1, 1, 'B';
+ splice @BAR, 1, 1, 'B';
+};
diff --git a/contrib/perl5/t/lib/env.t b/contrib/perl5/t/lib/env.t
index 5a82207..2573164 100755
--- a/contrib/perl5/t/lib/env.t
+++ b/contrib/perl5/t/lib/env.t
@@ -2,17 +2,24 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
BEGIN {
$ENV{FOO} = "foo";
+ $ENV{BAR} = "bar";
}
-use Env qw(FOO);
+use Env qw(FOO $BAR);
$FOO .= "/bar";
+$BAR .= "/baz";
+
+print "1..2\n";
-print "1..1\n";
print "not " if $FOO ne 'foo/bar';
print "ok 1\n";
+
+print "not " if $BAR ne 'bar/baz';
+print "ok 2\n";
+
diff --git a/contrib/perl5/t/lib/errno.t b/contrib/perl5/t/lib/errno.t
index 361723f..6320f6b 100755
--- a/contrib/perl5/t/lib/errno.t
+++ b/contrib/perl5/t/lib/errno.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
diff --git a/contrib/perl5/t/lib/fatal.t b/contrib/perl5/t/lib/fatal.t
index fb3757f..4013fbd 100755
--- a/contrib/perl5/t/lib/fatal.t
+++ b/contrib/perl5/t/lib/fatal.t
@@ -3,11 +3,11 @@
BEGIN {
chdir 't' if -d 't';
unshift @INC, '../lib';
- print "1..9\n";
+ print "1..15\n";
}
use strict;
-use Fatal qw(open);
+use Fatal qw(open close :void opendir);
my $i = 1;
eval { open FOO, '<lkjqweriuapofukndajsdlfjnvcvn' };
@@ -20,8 +20,17 @@ for ('$foo', "'$foo'", "*$foo", "\\*$foo") {
print "not " if $@;
print "ok $i\n"; ++$i;
- print "not " unless scalar(<FOO>) =~ m|^#!./perl|;
+ print "not " if $@ or scalar(<$foo>) !~ m|^#!./perl|;
+ print "ok $i\n"; ++$i;
+ eval qq{ close FOO };
print "not " if $@;
print "ok $i\n"; ++$i;
- close FOO;
}
+
+eval { opendir FOO, 'lkjqweriuapofukndajsdlfjnvcvn' };
+print "not " unless $@ =~ /^Can't open/;
+print "ok $i\n"; ++$i;
+
+eval { my $a = opendir FOO, 'lkjqweriuapofukndajsdlfjnvcvn' };
+print "not " if $@ =~ /^Can't open/;
+print "ok $i\n"; ++$i;
diff --git a/contrib/perl5/t/lib/fields.t b/contrib/perl5/t/lib/fields.t
index 139e469..7709ee5 100755
--- a/contrib/perl5/t/lib/fields.t
+++ b/contrib/perl5/t/lib/fields.t
@@ -4,7 +4,7 @@ my $w;
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
$SIG{__WARN__} = sub {
if ($_[0] =~ /^Hides field 'b1' in base class/) {
$w++;
@@ -15,6 +15,7 @@ BEGIN {
}
use strict;
+use warnings;
use vars qw($DEBUG);
package B1;
@@ -56,10 +57,17 @@ package Foo::Bar::Baz;
use base 'Foo::Bar';
use fields qw(foo bar baz);
+# Test repeatability for when modules get reloaded.
+package B1;
+use fields qw(b1 b2 b3);
+
+package D3;
+use base 'B2';
+use fields qw(b1 d1 _b1 _d1); # hide b1
+
package main;
-sub fstr
-{
+sub fstr {
my $h = shift;
my @tmp;
for my $k (sort {$h->{$a} <=> $h->{$b}} keys %$h) {
@@ -82,7 +90,7 @@ my %expect = (
'Foo::Bar::Baz' => 'b1:1,b2:2,b3:3,foo:4,bar:5,baz:6',
);
-print "1..", int(keys %expect)+3, "\n";
+print "1..", int(keys %expect)+13, "\n";
my $testno = 0;
while (my($class, $exp) = each %expect) {
no strict 'refs';
@@ -106,7 +114,59 @@ print "ok ", ++$testno, "\n";
# We should get compile time failures field name typos
eval q(my D3 $obj3 = $obj2; $obj3->{notthere} = "");
-print "not " unless $@ && $@ =~ /^No such field "notthere"/;
+print "not " unless $@ && $@ =~ /^No such pseudo-hash field "notthere"/;
+print "ok ", ++$testno, "\n";
+
+# Slices
+@$obj1{"_b1", "b1"} = (17, 29);
+print "not " unless "@$obj1[1,2]" eq "17 29";
+print "ok ", ++$testno, "\n";
+@$obj1[1,2] = (44,28);
+print "not " unless "@$obj1{'b1','_b1','b1'}" eq "28 44 28";
+print "ok ", ++$testno, "\n";
+
+my $ph = fields::phash(a => 1, b => 2, c => 3);
+print "not " unless fstr($ph) eq 'a:1,b:2,c:3';
+print "ok ", ++$testno, "\n";
+
+$ph = fields::phash([qw/a b c/], [1, 2, 3]);
+print "not " unless fstr($ph) eq 'a:1,b:2,c:3';
+print "ok ", ++$testno, "\n";
+
+$ph = fields::phash([qw/a b c/], [1]);
+print "not " if exists $ph->{b} or exists $ph->{c} or !exists $ph->{a};
+print "ok ", ++$testno, "\n";
+
+eval '$ph = fields::phash("odd")';
+print "not " unless $@ && $@ =~ /^Odd number of/;
print "ok ", ++$testno, "\n";
#fields::_dump();
+
+# check if fields autovivify
+{
+ package Foo;
+ use fields qw(foo bar);
+ sub new { bless [], $_[0]; }
+
+ package main;
+ my Foo $a = Foo->new();
+ $a->{foo} = ['a', 'ok ' . ++$testno, 'c'];
+ $a->{bar} = { A => 'ok ' . ++$testno };
+ print $a->{foo}[1], "\n";
+ print $a->{bar}->{A}, "\n";
+}
+
+# check if fields autovivify
+{
+ package Bar;
+ use fields qw(foo bar);
+ sub new { return fields::new($_[0]) }
+
+ package main;
+ my Bar $a = Bar::->new();
+ $a->{foo} = ['a', 'ok ' . ++$testno, 'c'];
+ $a->{bar} = { A => 'ok ' . ++$testno };
+ print $a->{foo}[1], "\n";
+ print $a->{bar}->{A}, "\n";
+}
diff --git a/contrib/perl5/t/lib/filecache.t b/contrib/perl5/t/lib/filecache.t
index a97fdd5..019f374 100755
--- a/contrib/perl5/t/lib/filecache.t
+++ b/contrib/perl5/t/lib/filecache.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..1\n";
diff --git a/contrib/perl5/t/lib/filecopy.t b/contrib/perl5/t/lib/filecopy.t
index 329931f..b6fcbea 100755
--- a/contrib/perl5/t/lib/filecopy.t
+++ b/contrib/perl5/t/lib/filecopy.t
@@ -2,89 +2,108 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
-print "1..11\n";
-
$| = 1;
+my @pass = (0,1);
+my $tests = 11;
+printf "1..%d\n", $tests * scalar(@pass);
+
use File::Copy;
-# First we create a file
-open(F, ">file-$$") or die;
-binmode F; # for DOSISH platforms, because test 3 copies to stdout
-print F "ok 3\n";
-close F;
-
-copy "file-$$", "copy-$$";
-
-open(F, "copy-$$") or die;
-$foo = <F>;
-close(F);
-
-print "not " if -s "file-$$" != -s "copy-$$";
-print "ok 1\n";
-
-print "not " unless $foo eq "ok 3\n";
-print "ok 2\n";
-
-binmode STDOUT unless $^O eq 'VMS'; # Copy::copy works in binary mode
-copy "copy-$$", \*STDOUT;
-unlink "copy-$$" or die "unlink: $!";
-
-open(F,"file-$$");
-copy(*F, "copy-$$");
-open(R, "copy-$$") or die "open copy-$$: $!"; $foo = <R>; close(R);
-print "not " unless $foo eq "ok 3\n";
-print "ok 4\n";
-unlink "copy-$$" or die "unlink: $!";
-open(F,"file-$$");
-copy(\*F, "copy-$$");
-close(F) or die "close: $!";
-open(R, "copy-$$") or die; $foo = <R>; close(R) or die "close: $!";
-print "not " unless $foo eq "ok 3\n";
-print "ok 5\n";
-unlink "copy-$$" or die "unlink: $!";
-
-require IO::File;
-$fh = IO::File->new(">copy-$$") or die "Cannot open copy-$$:$!";
-binmode $fh or die;
-copy("file-$$",$fh);
-$fh->close or die "close: $!";
-open(R, "copy-$$") or die; $foo = <R>; close(R);
-print "# foo=`$foo'\nnot " unless $foo eq "ok 3\n";
-print "ok 6\n";
-unlink "copy-$$" or die "unlink: $!";
-require FileHandle;
-my $fh = FileHandle->new(">copy-$$") or die "Cannot open copy-$$:$!";
-binmode $fh or die;
-copy("file-$$",$fh);
-$fh->close;
-open(R, "copy-$$") or die; $foo = <R>; close(R);
-print "not " unless $foo eq "ok 3\n";
-print "ok 7\n";
-unlink "file-$$" or die "unlink: $!";
-
-print "# moved missing file.\nnot " if move("file-$$", "copy-$$");
-print "# target disappeared.\nnot " if not -e "copy-$$";
-print "ok 8\n";
-
-move "copy-$$", "file-$$" or print "# move did not succeed.\n";
-print "# not moved: $!\nnot " unless -e "file-$$" and not -e "copy-$$";
-open(R, "file-$$") or die; $foo = <R>; close(R);
-print "# foo=`$foo'\nnot " unless $foo eq "ok 3\n";
-print "ok 9\n";
-
-copy "file-$$", "lib";
-open(R, "lib/file-$$") or die; $foo = <R>; close(R);
-print "not " unless $foo eq "ok 3\n";
-print "ok 10\n";
-unlink "lib/file-$$" or die "unlink: $!";
-
-move "file-$$", "lib";
-open(R, "lib/file-$$") or die "open lib/file-$$: $!"; $foo = <R>; close(R);
-print "not " unless $foo eq "ok 3\n" and not -e "file-$$";;
-print "ok 11\n";
-unlink "lib/file-$$" or die "unlink: $!";
+for my $pass (@pass) {
+
+ require File::Copy;
+
+ my $loopconst = $pass*$tests;
+
+ # First we create a file
+ open(F, ">file-$$") or die;
+ binmode F; # for DOSISH platforms, because test 3 copies to stdout
+ printf F "ok %d\n", 3 + $loopconst;
+ close F;
+
+ copy "file-$$", "copy-$$";
+
+ open(F, "copy-$$") or die;
+ $foo = <F>;
+ close(F);
+
+ print "not " if -s "file-$$" != -s "copy-$$";
+ printf "ok %d\n", 1 + $loopconst;
+
+ print "not " unless $foo eq sprintf "ok %d\n", 3+$loopconst;
+ printf "ok %d\n", 2+$loopconst;
+
+ binmode STDOUT unless $^O eq 'VMS'; # Copy::copy works in binary mode
+ copy "copy-$$", \*STDOUT;
+ unlink "copy-$$" or die "unlink: $!";
+
+ open(F,"file-$$");
+ copy(*F, "copy-$$");
+ open(R, "copy-$$") or die "open copy-$$: $!"; $foo = <R>; close(R);
+ print "not " unless $foo eq sprintf "ok %d\n", 3+$loopconst;
+ printf "ok %d\n", 4+$loopconst;
+ unlink "copy-$$" or die "unlink: $!";
+ open(F,"file-$$");
+ copy(\*F, "copy-$$");
+ close(F) or die "close: $!";
+ open(R, "copy-$$") or die; $foo = <R>; close(R) or die "close: $!";
+ print "not " unless $foo eq sprintf "ok %d\n", 3+$loopconst;
+ printf "ok %d\n", 5+$loopconst;
+ unlink "copy-$$" or die "unlink: $!";
+
+ require IO::File;
+ $fh = IO::File->new(">copy-$$") or die "Cannot open copy-$$:$!";
+ binmode $fh or die;
+ copy("file-$$",$fh);
+ $fh->close or die "close: $!";
+ open(R, "copy-$$") or die; $foo = <R>; close(R);
+ print "# foo=`$foo'\nnot " unless $foo eq sprintf "ok %d\n", 3+$loopconst;
+ printf "ok %d\n", 6+$loopconst;
+ unlink "copy-$$" or die "unlink: $!";
+ require FileHandle;
+ my $fh = FileHandle->new(">copy-$$") or die "Cannot open copy-$$:$!";
+ binmode $fh or die;
+ copy("file-$$",$fh);
+ $fh->close;
+ open(R, "copy-$$") or die; $foo = <R>; close(R);
+ print "not " unless $foo eq sprintf "ok %d\n", 3+$loopconst;
+ printf "ok %d\n", 7+$loopconst;
+ unlink "file-$$" or die "unlink: $!";
+
+ print "# moved missing file.\nnot " if move("file-$$", "copy-$$");
+ print "# target disappeared.\nnot " if not -e "copy-$$";
+ printf "ok %d\n", 8+$loopconst;
+
+ move "copy-$$", "file-$$" or print "# move did not succeed.\n";
+ print "# not moved: $!\nnot " unless -e "file-$$" and not -e "copy-$$";
+ open(R, "file-$$") or die; $foo = <R>; close(R);
+ print "# foo=`$foo'\nnot " unless $foo eq sprintf "ok %d\n", 3+$loopconst;
+ printf "ok %d\n", 9+$loopconst;
+
+ copy "file-$$", "lib";
+ open(R, "lib/file-$$") or die; $foo = <R>; close(R);
+ print "not " unless $foo eq sprintf "ok %d\n", 3+$loopconst;
+ printf "ok %d\n", 10+$loopconst;
+ unlink "lib/file-$$" or die "unlink: $!";
+
+ move "file-$$", "lib";
+ open(R, "lib/file-$$") or die "open lib/file-$$: $!"; $foo = <R>; close(R);
+ print "not " unless $foo eq sprintf("ok %d\n", 3+$loopconst)
+ and not -e "file-$$";;
+ printf "ok %d\n", 11+$loopconst;
+ unlink "lib/file-$$" or die "unlink: $!";
+
+ # warn sprintf "INC->".$INC{"File/Copy.pm"};
+ delete $INC{"File/Copy.pm"};
+
+}
+
+END {
+ 1 while unlink "file-$$";
+ 1 while unlink "lib/file-$$";
+}
diff --git a/contrib/perl5/t/lib/filefind.t b/contrib/perl5/t/lib/filefind.t
index cd2e977..e9a2916 100755
--- a/contrib/perl5/t/lib/filefind.t
+++ b/contrib/perl5/t/lib/filefind.t
@@ -1,14 +1,168 @@
-#!./perl
+####!./perl
+
+
+my %Expect;
+my $symlink_exists = eval { symlink("",""); 1 };
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
-print "1..2\n";
+if ( $symlink_exists ) { print "1..117\n"; }
+else { print "1..61\n"; }
use File::Find;
-# hope we will eventually find ourself
find(sub { print "ok 1\n" if $_ eq 'filefind.t'; }, ".");
finddepth(sub { print "ok 2\n" if $_ eq 'filefind.t'; }, ".");
+
+
+my $case = 2;
+
+END {
+ unlink 'fa/fa_ord','fa/fsl','fa/faa/faa_ord',
+ 'fa/fab/fab_ord','fa/fab/faba/faba_ord','fb/fb_ord','fb/fba/fba_ord';
+ rmdir 'fa/faa';
+ rmdir 'fa/fab/faba';
+ rmdir 'fa/fab';
+ rmdir 'fa';
+ rmdir 'fb/fba';
+ rmdir 'fb';
+ chdir '..';
+ rmdir 'for_find';
+}
+
+sub Check($) {
+ $case++;
+ if ($_[0]) { print "ok $case\n"; }
+ else { print "not ok $case\n"; }
+}
+
+sub CheckDie($) {
+ $case++;
+ if ($_[0]) { print "ok $case\n"; }
+ else { print "not ok $case\n $!\n"; exit 0; }
+}
+
+sub touch {
+ CheckDie( open(my $T,'>',$_[0]) );
+}
+
+sub MkDir($$) {
+ CheckDie( mkdir($_[0],$_[1]) );
+}
+
+sub wanted {
+ print "# '$_' => 1\n";
+ s#\.$## if ($^O eq 'VMS' && $_ ne '.');
+ Check( $Expect{$_} );
+ delete $Expect{$_};
+ $File::Find::prune=1 if $_ eq 'faba';
+}
+
+sub dn_wanted {
+ my $n = $File::Find::name;
+ $n =~ s#\.$## if ($^O eq 'VMS' && $n ne '.');
+ print "# '$n' => 1\n";
+ my $i = rindex($n,'/');
+ my $OK = exists($Expect{$n});
+ if ( $OK ) {
+ $OK= exists($Expect{substr($n,0,$i)}) if $i >= 0;
+ }
+ Check($OK);
+ delete $Expect{$n};
+}
+
+sub d_wanted {
+ print "# '$_' => 1\n";
+ s#\.$## if ($^O eq 'VMS' && $_ ne '.');
+ my $i = rindex($_,'/');
+ my $OK = exists($Expect{$_});
+ if ( $OK ) {
+ $OK= exists($Expect{substr($_,0,$i)}) if $i >= 0;
+ }
+ Check($OK);
+ delete $Expect{$_};
+}
+
+MkDir( 'for_find',0770 );
+CheckDie(chdir(for_find));
+MkDir( 'fa',0770 );
+MkDir( 'fb',0770 );
+touch('fb/fb_ord');
+MkDir( 'fb/fba',0770 );
+touch('fb/fba/fba_ord');
+CheckDie( symlink('../fb','fa/fsl') ) if $symlink_exists;
+touch('fa/fa_ord');
+
+MkDir( 'fa/faa',0770 );
+touch('fa/faa/faa_ord');
+MkDir( 'fa/fab',0770 );
+touch('fa/fab/fab_ord');
+MkDir( 'fa/fab/faba',0770 );
+touch('fa/fab/faba/faba_ord');
+
+%Expect = ('.' => 1, 'fsl' => 1, 'fa_ord' => 1, 'fab' => 1, 'fab_ord' => 1,
+ 'faba' => 1, 'faa' => 1, 'faa_ord' => 1);
+delete $Expect{'fsl'} unless $symlink_exists;
+File::Find::find( {wanted => \&wanted, },'fa' );
+Check( scalar(keys %Expect) == 0 );
+
+%Expect=('fa' => 1, 'fa/fsl' => 1, 'fa/fa_ord' => 1, 'fa/fab' => 1,
+ 'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1,
+ 'fa/fab/faba/faba_ord' => 1, 'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
+delete $Expect{'fa/fsl'} unless $symlink_exists;
+File::Find::find( {wanted => \&wanted, no_chdir => 1},'fa' );
+
+Check( scalar(keys %Expect) == 0 );
+
+%Expect=('.' => 1, './fa' => 1, './fa/fsl' => 1, './fa/fa_ord' => 1, './fa/fab' => 1,
+ './fa/fab/fab_ord' => 1, './fa/fab/faba' => 1,
+ './fa/fab/faba/faba_ord' => 1, './fa/faa' => 1, './fa/faa/faa_ord' => 1,
+ './fb' => 1, './fb/fba' => 1, './fb/fba/fba_ord' => 1, './fb/fb_ord' => 1);
+delete $Expect{'./fa/fsl'} unless $symlink_exists;
+File::Find::finddepth( {wanted => \&dn_wanted },'.' );
+Check( scalar(keys %Expect) == 0 );
+
+%Expect=('.' => 1, './fa' => 1, './fa/fsl' => 1, './fa/fa_ord' => 1, './fa/fab' => 1,
+ './fa/fab/fab_ord' => 1, './fa/fab/faba' => 1,
+ './fa/fab/faba/faba_ord' => 1, './fa/faa' => 1, './fa/faa/faa_ord' => 1,
+ './fb' => 1, './fb/fba' => 1, './fb/fba/fba_ord' => 1, './fb/fb_ord' => 1);
+delete $Expect{'./fa/fsl'} unless $symlink_exists;
+File::Find::finddepth( {wanted => \&d_wanted, no_chdir => 1 },'.' );
+Check( scalar(keys %Expect) == 0 );
+
+if ( $symlink_exists ) {
+ %Expect=('.' => 1, 'fa_ord' => 1, 'fsl' => 1, 'fb_ord' => 1, 'fba' => 1,
+ 'fba_ord' => 1, 'fab' => 1, 'fab_ord' => 1, 'faba' => 1, 'faa' => 1,
+ 'faa_ord' => 1);
+
+ File::Find::find( {wanted => \&wanted, follow_fast => 1},'fa' );
+ Check( scalar(keys %Expect) == 0 );
+
+ %Expect=('fa' => 1, 'fa/fa_ord' => 1, 'fa/fsl' => 1, 'fa/fsl/fb_ord' => 1,
+ 'fa/fsl/fba' => 1, 'fa/fsl/fba/fba_ord' => 1, 'fa/fab' => 1,
+ 'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1, 'fa/fab/faba/faba_ord' => 1,
+ 'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
+ File::Find::find( {wanted => \&wanted, follow_fast => 1, no_chdir => 1},'fa' );
+ Check( scalar(keys %Expect) == 0 );
+
+ %Expect=('fa' => 1, 'fa/fa_ord' => 1, 'fa/fsl' => 1, 'fa/fsl/fb_ord' => 1,
+ 'fa/fsl/fba' => 1, 'fa/fsl/fba/fba_ord' => 1, 'fa/fab' => 1,
+ 'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1, 'fa/fab/faba/faba_ord' => 1,
+ 'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
+
+ File::Find::finddepth( {wanted => \&dn_wanted, follow_fast => 1},'fa' );
+ Check( scalar(keys %Expect) == 0 );
+
+ %Expect=('fa' => 1, 'fa/fa_ord' => 1, 'fa/fsl' => 1, 'fa/fsl/fb_ord' => 1,
+ 'fa/fsl/fba' => 1, 'fa/fsl/fba/fba_ord' => 1, 'fa/fab' => 1,
+ 'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1, 'fa/fab/faba/faba_ord' => 1,
+ 'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
+
+ File::Find::finddepth( {wanted => \&d_wanted, follow_fast => 1, no_chdir => 1},'fa' );
+ Check( scalar(keys %Expect) == 0 );
+}
+
+print "# of cases: $case\n";
diff --git a/contrib/perl5/t/lib/filefunc.t b/contrib/perl5/t/lib/filefunc.t
new file mode 100755
index 0000000..46a1e35
--- /dev/null
+++ b/contrib/perl5/t/lib/filefunc.t
@@ -0,0 +1,17 @@
+#!./perl
+
+BEGIN {
+ $^O = '';
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+print "1..1\n";
+
+use File::Spec::Functions;
+
+if (catfile('a','b','c') eq 'a/b/c') {
+ print "ok 1\n";
+} else {
+ print "not ok 1\n";
+}
diff --git a/contrib/perl5/t/lib/filehand.t b/contrib/perl5/t/lib/filehand.t
index b8ec95f..22cff0e 100755
--- a/contrib/perl5/t/lib/filehand.t
+++ b/contrib/perl5/t/lib/filehand.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bIO\b/ && $^O ne 'VMS') {
print "1..0\n";
@@ -72,7 +72,8 @@ if ($^O eq 'dos')
($rd,$wr) = FileHandle::pipe;
-if ($^O eq 'VMS' || $^O eq 'os2' || $^O eq 'amigaos' || $^O eq 'MSWin32') {
+if ($^O eq 'VMS' || $^O eq 'os2' || $^O eq 'amigaos' || $^O eq 'MSWin32' ||
+ $Config{d_fork} ne 'define') {
$wr->autoflush;
$wr->printf("ok %d\n",11);
print $rd->getline;
diff --git a/contrib/perl5/t/lib/filepath.t b/contrib/perl5/t/lib/filepath.t
index c3bf4a4..5628d0c 100755
--- a/contrib/perl5/t/lib/filepath.t
+++ b/contrib/perl5/t/lib/filepath.t
@@ -2,14 +2,14 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use File::Path;
use strict;
my $count = 0;
-$^W = 1;
+use warnings;
print "1..4\n";
diff --git a/contrib/perl5/t/lib/filespec.t b/contrib/perl5/t/lib/filespec.t
index ca22d3e..da52ec5 100755
--- a/contrib/perl5/t/lib/filespec.t
+++ b/contrib/perl5/t/lib/filespec.t
@@ -3,41 +3,377 @@
BEGIN {
$^O = '';
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
-print "1..4\n";
+# Each element in this array is a single test. Storing them this way makes
+# maintenance easy, and should be OK since perl should be pretty functional
+# before these tests are run.
-use File::Spec;
+@tests = (
+# Function Expected
+[ "Unix->catfile('a','b','c')", 'a/b/c' ],
+[ "Unix->splitpath('file')", ',,file' ],
+[ "Unix->splitpath('/d1/d2/d3/')", ',/d1/d2/d3/,' ],
+[ "Unix->splitpath('d1/d2/d3/')", ',d1/d2/d3/,' ],
+[ "Unix->splitpath('/d1/d2/d3/.')", ',/d1/d2/d3/.,' ],
+[ "Unix->splitpath('/d1/d2/d3/..')", ',/d1/d2/d3/..,' ],
+[ "Unix->splitpath('/d1/d2/d3/.file')", ',/d1/d2/d3/,.file' ],
+[ "Unix->splitpath('d1/d2/d3/file')", ',d1/d2/d3/,file' ],
+[ "Unix->splitpath('/../../d1/')", ',/../../d1/,' ],
+[ "Unix->splitpath('/././d1/')", ',/././d1/,' ],
-if (File::Spec->catfile('a','b','c') eq 'a/b/c') {
- print "ok 1\n";
-} else {
- print "not ok 1\n";
-}
+[ "Unix->catpath('','','file')", 'file' ],
+[ "Unix->catpath('','/d1/d2/d3/','')", '/d1/d2/d3/' ],
+[ "Unix->catpath('','d1/d2/d3/','')", 'd1/d2/d3/' ],
+[ "Unix->catpath('','/d1/d2/d3/.','')", '/d1/d2/d3/.' ],
+[ "Unix->catpath('','/d1/d2/d3/..','')", '/d1/d2/d3/..' ],
+[ "Unix->catpath('','/d1/d2/d3/','.file')", '/d1/d2/d3/.file' ],
+[ "Unix->catpath('','d1/d2/d3/','file')", 'd1/d2/d3/file' ],
+[ "Unix->catpath('','/../../d1/','')", '/../../d1/' ],
+[ "Unix->catpath('','/././d1/','')", '/././d1/' ],
+[ "Unix->catpath('d1','d2/d3/','')", 'd2/d3/' ],
+[ "Unix->catpath('d1','d2','d3/')", 'd2/d3/' ],
-use File::Spec::OS2;
+[ "Unix->splitdir('')", '' ],
+[ "Unix->splitdir('/d1/d2/d3/')", ',d1,d2,d3,' ],
+[ "Unix->splitdir('d1/d2/d3/')", 'd1,d2,d3,' ],
+[ "Unix->splitdir('/d1/d2/d3')", ',d1,d2,d3' ],
+[ "Unix->splitdir('d1/d2/d3')", 'd1,d2,d3' ],
-if (File::Spec::OS2->catfile('a','b','c') eq 'a/b/c') {
- print "ok 2\n";
-} else {
- print "not ok 2\n";
-}
+[ "Unix->catdir()", '' ],
+[ "Unix->catdir('/')", '/' ],
+[ "Unix->catdir('','d1','d2','d3','')", '/d1/d2/d3' ],
+[ "Unix->catdir('d1','d2','d3','')", 'd1/d2/d3' ],
+[ "Unix->catdir('','d1','d2','d3')", '/d1/d2/d3' ],
+[ "Unix->catdir('d1','d2','d3')", 'd1/d2/d3' ],
+
+[ "Unix->catfile('a','b','c')", 'a/b/c' ],
+
+[ "Unix->canonpath('')", '' ],
+[ "Unix->canonpath('///../../..//./././a//b/.././c/././')", '/a/b/../c' ],
+[ "Unix->canonpath('/.')", '/.' ],
+
+[ "Unix->abs2rel('/t1/t2/t3','/t1/t2/t3')", '' ],
+[ "Unix->abs2rel('/t1/t2/t4','/t1/t2/t3')", '../t4' ],
+[ "Unix->abs2rel('/t1/t2','/t1/t2/t3')", '..' ],
+[ "Unix->abs2rel('/t1/t2/t3/t4','/t1/t2/t3')", 't4' ],
+[ "Unix->abs2rel('/t4/t5/t6','/t1/t2/t3')", '../../../t4/t5/t6' ],
+#[ "Unix->abs2rel('../t4','/t1/t2/t3')", '../t4' ],
+[ "Unix->abs2rel('/','/t1/t2/t3')", '../../..' ],
+[ "Unix->abs2rel('///','/t1/t2/t3')", '../../..' ],
+[ "Unix->abs2rel('/.','/t1/t2/t3')", '../../../.' ],
+[ "Unix->abs2rel('/./','/t1/t2/t3')", '../../..' ],
+#[ "Unix->abs2rel('../t4','/t1/t2/t3')", '../t4' ],
+
+[ "Unix->rel2abs('t4','/t1/t2/t3')", '/t1/t2/t3/t4' ],
+[ "Unix->rel2abs('t4/t5','/t1/t2/t3')", '/t1/t2/t3/t4/t5' ],
+[ "Unix->rel2abs('.','/t1/t2/t3')", '/t1/t2/t3' ],
+[ "Unix->rel2abs('..','/t1/t2/t3')", '/t1/t2/t3/..' ],
+[ "Unix->rel2abs('../t4','/t1/t2/t3')", '/t1/t2/t3/../t4' ],
+[ "Unix->rel2abs('/t1','/t1/t2/t3')", '/t1' ],
+
+[ "Win32->splitpath('file')", ',,file' ],
+[ "Win32->splitpath('\\d1/d2\\d3/')", ',\\d1/d2\\d3/,' ],
+[ "Win32->splitpath('d1/d2\\d3/')", ',d1/d2\\d3/,' ],
+[ "Win32->splitpath('\\d1/d2\\d3/.')", ',\\d1/d2\\d3/.,' ],
+[ "Win32->splitpath('\\d1/d2\\d3/..')", ',\\d1/d2\\d3/..,' ],
+[ "Win32->splitpath('\\d1/d2\\d3/.file')", ',\\d1/d2\\d3/,.file' ],
+[ "Win32->splitpath('\\d1/d2\\d3/file')", ',\\d1/d2\\d3/,file' ],
+[ "Win32->splitpath('d1/d2\\d3/file')", ',d1/d2\\d3/,file' ],
+[ "Win32->splitpath('C:\\d1/d2\\d3/')", 'C:,\\d1/d2\\d3/,' ],
+[ "Win32->splitpath('C:d1/d2\\d3/')", 'C:,d1/d2\\d3/,' ],
+[ "Win32->splitpath('C:\\d1/d2\\d3/file')", 'C:,\\d1/d2\\d3/,file' ],
+[ "Win32->splitpath('C:d1/d2\\d3/file')", 'C:,d1/d2\\d3/,file' ],
+[ "Win32->splitpath('C:\\../d2\\d3/file')", 'C:,\\../d2\\d3/,file' ],
+[ "Win32->splitpath('C:../d2\\d3/file')", 'C:,../d2\\d3/,file' ],
+[ "Win32->splitpath('\\../..\\d1/')", ',\\../..\\d1/,' ],
+[ "Win32->splitpath('\\./.\\d1/')", ',\\./.\\d1/,' ],
+[ "Win32->splitpath('\\\\node\\share\\d1/d2\\d3/')", '\\\\node\\share,\\d1/d2\\d3/,' ],
+[ "Win32->splitpath('\\\\node\\share\\d1/d2\\d3/file')", '\\\\node\\share,\\d1/d2\\d3/,file' ],
+[ "Win32->splitpath('\\\\node\\share\\d1/d2\\file')", '\\\\node\\share,\\d1/d2\\,file' ],
+[ "Win32->splitpath('file',1)", ',file,' ],
+[ "Win32->splitpath('\\d1/d2\\d3/',1)", ',\\d1/d2\\d3/,' ],
+[ "Win32->splitpath('d1/d2\\d3/',1)", ',d1/d2\\d3/,' ],
+[ "Win32->splitpath('\\\\node\\share\\d1/d2\\d3/',1)", '\\\\node\\share,\\d1/d2\\d3/,' ],
+
+[ "Win32->catpath('','','file')", 'file' ],
+[ "Win32->catpath('','\\d1/d2\\d3/','')", '\\d1/d2\\d3/' ],
+[ "Win32->catpath('','d1/d2\\d3/','')", 'd1/d2\\d3/' ],
+[ "Win32->catpath('','\\d1/d2\\d3/.','')", '\\d1/d2\\d3/.' ],
+[ "Win32->catpath('','\\d1/d2\\d3/..','')", '\\d1/d2\\d3/..' ],
+[ "Win32->catpath('','\\d1/d2\\d3/','.file')", '\\d1/d2\\d3/.file' ],
+[ "Win32->catpath('','\\d1/d2\\d3/','file')", '\\d1/d2\\d3/file' ],
+[ "Win32->catpath('','d1/d2\\d3/','file')", 'd1/d2\\d3/file' ],
+[ "Win32->catpath('C:','\\d1/d2\\d3/','')", 'C:\\d1/d2\\d3/' ],
+[ "Win32->catpath('C:','d1/d2\\d3/','')", 'C:d1/d2\\d3/' ],
+[ "Win32->catpath('C:','\\d1/d2\\d3/','file')", 'C:\\d1/d2\\d3/file' ],
+[ "Win32->catpath('C:','d1/d2\\d3/','file')", 'C:d1/d2\\d3/file' ],
+[ "Win32->catpath('C:','\\../d2\\d3/','file')", 'C:\\../d2\\d3/file' ],
+[ "Win32->catpath('C:','../d2\\d3/','file')", 'C:../d2\\d3/file' ],
+[ "Win32->catpath('','\\../..\\d1/','')", '\\../..\\d1/' ],
+[ "Win32->catpath('','\\./.\\d1/','')", '\\./.\\d1/' ],
+[ "Win32->catpath('\\\\node\\share','\\d1/d2\\d3/','')", '\\\\node\\share\\d1/d2\\d3/' ],
+[ "Win32->catpath('\\\\node\\share','\\d1/d2\\d3/','file')", '\\\\node\\share\\d1/d2\\d3/file' ],
+[ "Win32->catpath('\\\\node\\share','\\d1/d2\\','file')", '\\\\node\\share\\d1/d2\\file' ],
+
+[ "Win32->splitdir('')", '' ],
+[ "Win32->splitdir('\\d1/d2\\d3/')", ',d1,d2,d3,' ],
+[ "Win32->splitdir('d1/d2\\d3/')", 'd1,d2,d3,' ],
+[ "Win32->splitdir('\\d1/d2\\d3')", ',d1,d2,d3' ],
+[ "Win32->splitdir('d1/d2\\d3')", 'd1,d2,d3' ],
+
+[ "Win32->catdir()", '' ],
+[ "Win32->catdir('')", '\\' ],
+[ "Win32->catdir('/')", '\\' ],
+[ "Win32->catdir('//d1','d2')", '\\\\d1\\d2' ],
+[ "Win32->catdir('','/d1','d2')", '\\\\d1\\d2' ],
+[ "Win32->catdir('','','/d1','d2')", '\\\\\\d1\\d2' ],
+[ "Win32->catdir('','//d1','d2')", '\\\\\\d1\\d2' ],
+[ "Win32->catdir('','','//d1','d2')", '\\\\\\\\d1\\d2' ],
+[ "Win32->catdir('','d1','','d2','')", '\\d1\\d2' ],
+[ "Win32->catdir('','d1','d2','d3','')", '\\d1\\d2\\d3' ],
+[ "Win32->catdir('d1','d2','d3','')", 'd1\\d2\\d3' ],
+[ "Win32->catdir('','d1','d2','d3')", '\\d1\\d2\\d3' ],
+[ "Win32->catdir('d1','d2','d3')", 'd1\\d2\\d3' ],
+[ "Win32->catdir('A:/d1','d2','d3')", 'A:\\d1\\d2\\d3' ],
+[ "Win32->catdir('A:/d1','d2','d3','')", 'A:\\d1\\d2\\d3' ],
+#[ "Win32->catdir('A:/d1','B:/d2','d3','')", 'A:\\d1\\d2\\d3' ],
+[ "Win32->catdir('A:/d1','B:/d2','d3','')", 'A:\\d1\\B:\\d2\\d3' ],
+[ "Win32->catdir('A:/')", 'A:\\' ],
+
+[ "Win32->catfile('a','b','c')", 'a\\b\\c' ],
+
+[ "Win32->canonpath('')", '' ],
+[ "Win32->canonpath('a:')", 'A:' ],
+[ "Win32->canonpath('A:f')", 'A:f' ],
+[ "Win32->canonpath('//a\\b//c')", '\\\\a\\b\\c' ],
+[ "Win32->canonpath('/a/..../c')", '\\a\\....\\c' ],
+[ "Win32->canonpath('//a/b\\c')", '\\\\a\\b\\c' ],
+[ "Win32->canonpath('////')", '\\\\\\' ],
+[ "Win32->canonpath('//')", '\\' ],
+[ "Win32->canonpath('/.')", '\\.' ],
+[ "Win32->canonpath('//a/b/../../c')", '\\\\a\\b\\..\\..\\c' ],
+[ "Win32->canonpath('//a/../../c')", '\\\\a\\..\\..\\c' ],
+
+[ "Win32->abs2rel('/t1/t2/t3','/t1/t2/t3')", '' ],
+[ "Win32->abs2rel('/t1/t2/t4','/t1/t2/t3')", '..\\t4' ],
+[ "Win32->abs2rel('/t1/t2','/t1/t2/t3')", '..' ],
+[ "Win32->abs2rel('/t1/t2/t3/t4','/t1/t2/t3')", 't4' ],
+[ "Win32->abs2rel('/t4/t5/t6','/t1/t2/t3')", '..\\..\\..\\t4\\t5\\t6' ],
+#[ "Win32->abs2rel('../t4','/t1/t2/t3')", '\\t1\\t2\\t3\\..\\t4' ],
+[ "Win32->abs2rel('/','/t1/t2/t3')", '..\\..\\..' ],
+[ "Win32->abs2rel('///','/t1/t2/t3')", '..\\..\\..' ],
+[ "Win32->abs2rel('/.','/t1/t2/t3')", '..\\..\\..\\.' ],
+[ "Win32->abs2rel('/./','/t1/t2/t3')", '..\\..\\..' ],
+[ "Win32->abs2rel('\\\\a/t1/t2/t4','/t2/t3')", '..\\t4' ],
+[ "Win32->abs2rel('//a/t1/t2/t4','/t2/t3')", '..\\t4' ],
+
+[ "Win32->rel2abs('temp','C:/')", 'C:\\temp' ],
+[ "Win32->rel2abs('temp','C:/a')", 'C:\\a\\temp' ],
+[ "Win32->rel2abs('temp','C:/a/')", 'C:\\a\\temp' ],
+[ "Win32->rel2abs('../','C:/')", 'C:\\..' ],
+[ "Win32->rel2abs('../','C:/a')", 'C:\\a\\..' ],
+[ "Win32->rel2abs('temp','//prague_main/work/')", '\\\\prague_main\\work\\temp' ],
+[ "Win32->rel2abs('../temp','//prague_main/work/')", '\\\\prague_main\\work\\..\\temp' ],
+[ "Win32->rel2abs('temp','//prague_main/work')", '\\\\prague_main\\work\\temp' ],
+[ "Win32->rel2abs('../','//prague_main/work')", '\\\\prague_main\\work\\..' ],
+
+[ "VMS->splitpath('file')", ',,file' ],
+[ "VMS->splitpath('[d1.d2.d3]')", ',[d1.d2.d3],' ],
+[ "VMS->splitpath('[.d1.d2.d3]')", ',[.d1.d2.d3],' ],
+[ "VMS->splitpath('[d1.d2.d3]file')", ',[d1.d2.d3],file' ],
+[ "VMS->splitpath('d1/d2/d3/file')", ',[.d1.d2.d3],file' ],
+[ "VMS->splitpath('/d1/d2/d3/file')", 'd1:,[d2.d3],file' ],
+[ "VMS->splitpath('[.d1.d2.d3]file')", ',[.d1.d2.d3],file' ],
+[ "VMS->splitpath('node::volume:[d1.d2.d3]')", 'node::volume:,[d1.d2.d3],' ],
+[ "VMS->splitpath('node::volume:[d1.d2.d3]file')", 'node::volume:,[d1.d2.d3],file' ],
+[ "VMS->splitpath('node\"access_spec\"::volume:[d1.d2.d3]')", 'node"access_spec"::volume:,[d1.d2.d3],' ],
+[ "VMS->splitpath('node\"access_spec\"::volume:[d1.d2.d3]file')", 'node"access_spec"::volume:,[d1.d2.d3],file' ],
+
+[ "VMS->catpath('','','file')", 'file' ],
+[ "VMS->catpath('','[d1.d2.d3]','')", '[d1.d2.d3]' ],
+[ "VMS->catpath('','[.d1.d2.d3]','')", '[.d1.d2.d3]' ],
+[ "VMS->catpath('','[d1.d2.d3]','file')", '[d1.d2.d3]file' ],
+[ "VMS->catpath('','[.d1.d2.d3]','file')", '[.d1.d2.d3]file' ],
+[ "VMS->catpath('','d1/d2/d3','file')", '[.d1.d2.d3]file' ],
+[ "VMS->catpath('v','d1/d2/d3','file')", 'v:[.d1.d2.d3]file' ],
+[ "VMS->catpath('node::volume:','[d1.d2.d3]','')", 'node::volume:[d1.d2.d3]' ],
+[ "VMS->catpath('node::volume:','[d1.d2.d3]','file')", 'node::volume:[d1.d2.d3]file' ],
+[ "VMS->catpath('node\"access_spec\"::volume:','[d1.d2.d3]','')", 'node"access_spec"::volume:[d1.d2.d3]' ],
+[ "VMS->catpath('node\"access_spec\"::volume:','[d1.d2.d3]','file')", 'node"access_spec"::volume:[d1.d2.d3]file' ],
+
+[ "VMS->canonpath('')", '' ],
+[ "VMS->canonpath('volume:[d1]file')", 'volume:[d1]file' ],
+[ "VMS->canonpath('volume:[d1.-.d2.][d3.d4.-]')", 'volume:[d2.d3]' ],
+[ "VMS->canonpath('volume:[000000.d1]d2.dir;1')", 'volume:[d1]d2.dir;1' ],
+
+[ "VMS->splitdir('')", '' ],
+[ "VMS->splitdir('[]')", '' ],
+[ "VMS->splitdir('d1.d2.d3')", 'd1,d2,d3' ],
+[ "VMS->splitdir('[d1.d2.d3]')", 'd1,d2,d3' ],
+[ "VMS->splitdir('.d1.d2.d3')", ',d1,d2,d3' ],
+[ "VMS->splitdir('[.d1.d2.d3]')", ',d1,d2,d3' ],
+[ "VMS->splitdir('.-.d2.d3')", ',-,d2,d3' ],
+[ "VMS->splitdir('[.-.d2.d3]')", ',-,d2,d3' ],
+
+[ "VMS->catdir('')", '' ],
+[ "VMS->catdir('d1','d2','d3')", '[.d1.d2.d3]' ],
+[ "VMS->catdir('d1','d2/','d3')", '[.d1.d2.d3]' ],
+[ "VMS->catdir('','d1','d2','d3')", '[.d1.d2.d3]' ],
+[ "VMS->catdir('','-','d2','d3')", '[-.d2.d3]' ],
+[ "VMS->catdir('','-','','d3')", '[-.d3]' ],
+[ "VMS->catdir('dir.dir','d2.dir','d3.dir')", '[.dir.d2.d3]' ],
+[ "VMS->catdir('[.name]')", '[.name]' ],
+[ "VMS->catdir('[.name]','[.name]')", '[.name.name]'],
+
+[ "VMS->abs2rel('node::volume:[t1.t2.t3]','[t1.t2.t3]')", '' ],
+[ "VMS->abs2rel('node::volume:[t1.t2.t4]','[t1.t2.t3]')", '[-.t4]' ],
+[ "VMS->abs2rel('[t1.t2.t3]','[t1.t2.t3]')", '' ],
+[ "VMS->abs2rel('[t1.t2.t3]file','[t1.t2.t3]')", 'file' ],
+[ "VMS->abs2rel('[t1.t2.t4]','[t1.t2.t3]')", '[-.t4]' ],
+[ "VMS->abs2rel('[t1.t2]file','[t1.t2.t3]')", '[-]file' ],
+[ "VMS->abs2rel('[t1.t2.t3.t4]','[t1.t2.t3]')", '[t4]' ],
+[ "VMS->abs2rel('[t4.t5.t6]','[t1.t2.t3]')", '[---.t4.t5.t6]' ],
+[ "VMS->abs2rel('[000000]','[t1.t2.t3]')", '[---.000000]' ],
+[ "VMS->abs2rel('a:[t1.t2.t4]','[t1.t2.t3]')", '[-.t4]' ],
+[ "VMS->abs2rel('[a.-.b.c.-]','[t1.t2.t3]')", '[---.b]' ],
-use File::Spec::Win32;
+[ "VMS->rel2abs('[.t4]','[t1.t2.t3]')", '[t1.t2.t3.t4]' ],
+[ "VMS->rel2abs('[.t4.t5]','[t1.t2.t3]')", '[t1.t2.t3.t4.t5]' ],
+[ "VMS->rel2abs('[]','[t1.t2.t3]')", '[t1.t2.t3]' ],
+[ "VMS->rel2abs('[-]','[t1.t2.t3]')", '[t1.t2]' ],
+[ "VMS->rel2abs('[-.t4]','[t1.t2.t3]')", '[t1.t2.t4]' ],
+[ "VMS->rel2abs('[t1]','[t1.t2.t3]')", '[t1]' ],
-if (File::Spec::Win32->catfile('a','b','c') eq 'a\b\c') {
- print "ok 3\n";
-} else {
- print "not ok 3\n";
+[ "OS2->catdir('A:/d1','B:/d2','d3','')", 'A:/d1/B:/d2/d3' ],
+[ "OS2->catfile('a','b','c')", 'a/b/c' ],
+
+[ "Mac->splitpath('file')", ',,file' ],
+[ "Mac->splitpath(':file')", ',:,file' ],
+[ "Mac->splitpath(':d1',1)", ',:d1:,' ],
+[ "Mac->splitpath('d1',1)", 'd1:,,' ],
+[ "Mac->splitpath('d1:d2:d3:')", 'd1:,d2:d3:,' ],
+[ "Mac->splitpath('d1:d2:d3',1)", 'd1:,d2:d3:,' ],
+[ "Mac->splitpath(':d1:d2:d3:')", ',:d1:d2:d3:,' ],
+[ "Mac->splitpath(':d1:d2:d3:',1)", ',:d1:d2:d3:,' ],
+[ "Mac->splitpath('d1:d2:d3:file')", 'd1:,d2:d3:,file' ],
+[ "Mac->splitpath('d1:d2:d3',1)", 'd1:,d2:d3:,' ],
+
+[ "Mac->catdir('')", ':' ],
+[ "Mac->catdir('d1','d2','d3')", 'd1:d2:d3:' ],
+[ "Mac->catdir('d1','d2/','d3')", 'd1:d2/:d3:' ],
+[ "Mac->catdir('','d1','d2','d3')", ':d1:d2:d3:' ],
+[ "Mac->catdir('','','d2','d3')", '::d2:d3:' ],
+[ "Mac->catdir('','','','d3')", ':::d3:' ],
+[ "Mac->catdir(':name')", ':name:' ],
+[ "Mac->catdir(':name',':name')", ':name:name:' ],
+
+[ "Mac->catfile('a','b','c')", 'a:b:c' ],
+
+[ "Mac->canonpath('')", '' ],
+[ "Mac->canonpath(':')", ':' ],
+[ "Mac->canonpath('::')", '::' ],
+[ "Mac->canonpath('a::')", 'a::' ],
+[ "Mac->canonpath(':a::')", ':a::' ],
+
+[ "Mac->abs2rel('t1:t2:t3','t1:t2:t3')", ':' ],
+[ "Mac->abs2rel('t1:t2','t1:t2:t3')", '::' ],
+[ "Mac->abs2rel('t1:t4','t1:t2:t3')", ':::t4' ],
+[ "Mac->abs2rel('t1:t2:t4','t1:t2:t3')", '::t4' ],
+[ "Mac->abs2rel('t1:t2:t3:t4','t1:t2:t3')", ':t4' ],
+[ "Mac->abs2rel('t4:t5:t6','t1:t2:t3')", '::::t4:t5:t6' ],
+[ "Mac->abs2rel('t1','t1:t2:t3')", ':::' ],
+
+[ "Mac->rel2abs(':t4','t1:t2:t3')", 't1:t2:t3:t4' ],
+[ "Mac->rel2abs(':t4:t5','t1:t2:t3')", 't1:t2:t3:t4:t5' ],
+[ "Mac->rel2abs('','t1:t2:t3')", '' ],
+[ "Mac->rel2abs('::','t1:t2:t3')", 't1:t2:t3::' ],
+[ "Mac->rel2abs('::t4','t1:t2:t3')", 't1:t2:t3::t4' ],
+[ "Mac->rel2abs('t1','t1:t2:t3')", 't1' ],
+) ;
+
+# Grab all of the plain routines from File::Spec
+use File::Spec @File::Spec::EXPORT_OK ;
+
+require File::Spec::Unix ;
+require File::Spec::Win32 ;
+
+eval {
+ require VMS::Filespec ;
+} ;
+
+my $skip_exception = "Install VMS::Filespec (from vms/ext)" ;
+
+if ( $@ ) {
+ # Not pretty, but it allows testing of things not implemented soley
+ # on VMS. It might be better to change File::Spec::VMS to do this,
+ # making it more usable when running on (say) Unix but working with
+ # VMS paths.
+ eval qq-
+ sub File::Spec::VMS::vmsify { die "$skip_exception" }
+ sub File::Spec::VMS::unixify { die "$skip_exception" }
+ sub File::Spec::VMS::vmspath { die "$skip_exception" }
+ - ;
+ $INC{"VMS/Filespec.pm"} = 1 ;
}
+require File::Spec::VMS ;
+
+require File::Spec::OS2 ;
+require File::Spec::Mac ;
+
+print "1..", scalar( @tests ), "\n" ;
-use File::Spec::Mac;
+my $current_test= 1 ;
-if (File::Spec::Mac->catfile('a','b','c') eq 'a:b:c') {
- print "ok 4\n";
-} else {
- print "not ok 4\n";
+# Test out the class methods
+for ( @tests ) {
+ tryfunc( @$_ ) ;
}
+
+
+#
+# Tries a named function with the given args and compares the result against
+# an expected result. Works with functions that return scalars or arrays.
+#
+sub tryfunc {
+ my $function = shift ;
+ my $expected = shift ;
+ my $platform = shift ;
+
+ if ($platform && $^O ne $platform) {
+ print "ok $current_test # skipped: $function\n" ;
+ ++$current_test ;
+ return;
+ }
+
+ $function =~ s#\\#\\\\#g ;
+
+ my $got ;
+ if ( $function =~ /^[^\$].*->/ ) {
+ $got = eval( "join( ',', File::Spec::$function )" ) ;
+ }
+ else {
+ $got = eval( "join( ',', $function )" ) ;
+ }
+
+ if ( $@ ) {
+ if ( substr( $@, 0, length $skip_exception ) eq $skip_exception ) {
+ chomp $@ ;
+ print "ok $current_test # skip $function: $@\n" ;
+ }
+ else {
+ chomp $@ ;
+ print "not ok $current_test # $function: $@\n" ;
+ }
+ }
+ elsif ( !defined( $got ) || $got ne $expected ) {
+ print "not ok $current_test # $function: got '$got', expected '$expected'\n" ;
+ }
+ else {
+ print "ok $current_test # $function\n" ;
+ }
+ ++$current_test ;
+}
diff --git a/contrib/perl5/t/lib/findbin.t b/contrib/perl5/t/lib/findbin.t
index 3e742f9..f0939e9 100755
--- a/contrib/perl5/t/lib/findbin.t
+++ b/contrib/perl5/t/lib/findbin.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..1\n";
diff --git a/contrib/perl5/t/lib/gdbm.t b/contrib/perl5/t/lib/gdbm.t
index 2395611..dc4e96e 100755
--- a/contrib/perl5/t/lib/gdbm.t
+++ b/contrib/perl5/t/lib/gdbm.t
@@ -3,17 +3,17 @@
# $RCSfile: dbm.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:43 $
BEGIN {
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bGDBM_File\b/) {
- print "1..0\n";
+ print "1..0 # Skip: GDBM_File was not built\n";
exit 0;
}
}
use GDBM_File;
-print "1..20\n";
+print "1..66\n";
unlink <Op.dbmx*>;
@@ -206,3 +206,189 @@ EOM
unlink "SubDB.pm", <dbhash.tmp*> ;
}
+
+{
+ # DBM Filter tests
+ use strict ;
+ my (%h, $db) ;
+ my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+
+ sub checkOutput
+ {
+ my($fk, $sk, $fv, $sv) = @_ ;
+ return
+ $fetch_key eq $fk && $store_key eq $sk &&
+ $fetch_value eq $fv && $store_value eq $sv &&
+ $_ eq 'original' ;
+ }
+
+ unlink <Op.dbmx*>;
+ ok(21, $db = tie(%h, 'GDBM_File','Op.dbmx', &GDBM_WRCREAT, 0640)) ;
+
+ $db->filter_fetch_key (sub { $fetch_key = $_ }) ;
+ $db->filter_store_key (sub { $store_key = $_ }) ;
+ $db->filter_fetch_value (sub { $fetch_value = $_}) ;
+ $db->filter_store_value (sub { $store_value = $_ }) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ # fk sk fv sv
+ ok(22, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(23, $h{"fred"} eq "joe");
+ # fk sk fv sv
+ ok(24, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(25, $db->FIRSTKEY() eq "fred") ;
+ # fk sk fv sv
+ ok(26, checkOutput( "fred", "", "", "")) ;
+
+ # replace the filters, but remember the previous set
+ my ($old_fk) = $db->filter_fetch_key
+ (sub { $_ = uc $_ ; $fetch_key = $_ }) ;
+ my ($old_sk) = $db->filter_store_key
+ (sub { $_ = lc $_ ; $store_key = $_ }) ;
+ my ($old_fv) = $db->filter_fetch_value
+ (sub { $_ = "[$_]"; $fetch_value = $_ }) ;
+ my ($old_sv) = $db->filter_store_value
+ (sub { s/o/x/g; $store_value = $_ }) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"Fred"} = "Joe" ;
+ # fk sk fv sv
+ ok(27, checkOutput( "", "fred", "", "Jxe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(28, $h{"Fred"} eq "[Jxe]");
+ # fk sk fv sv
+ ok(29, checkOutput( "", "fred", "[Jxe]", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(30, $db->FIRSTKEY() eq "FRED") ;
+ # fk sk fv sv
+ ok(31, checkOutput( "FRED", "", "", "")) ;
+
+ # put the original filters back
+ $db->filter_fetch_key ($old_fk);
+ $db->filter_store_key ($old_sk);
+ $db->filter_fetch_value ($old_fv);
+ $db->filter_store_value ($old_sv);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(32, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(33, $h{"fred"} eq "joe");
+ ok(34, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(35, $db->FIRSTKEY() eq "fred") ;
+ ok(36, checkOutput( "fred", "", "", "")) ;
+
+ # delete the filters
+ $db->filter_fetch_key (undef);
+ $db->filter_store_key (undef);
+ $db->filter_fetch_value (undef);
+ $db->filter_store_value (undef);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(37, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(38, $h{"fred"} eq "joe");
+ ok(39, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(40, $db->FIRSTKEY() eq "fred") ;
+ ok(41, checkOutput( "", "", "", "")) ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
+
+{
+ # DBM Filter with a closure
+
+ use strict ;
+ my (%h, $db) ;
+
+ unlink <Op.dbmx*>;
+ ok(42, $db = tie(%h, 'GDBM_File','Op.dbmx', &GDBM_WRCREAT, 0640)) ;
+
+ my %result = () ;
+
+ sub Closure
+ {
+ my ($name) = @_ ;
+ my $count = 0 ;
+ my @kept = () ;
+
+ return sub { ++$count ;
+ push @kept, $_ ;
+ $result{$name} = "$name - $count: [@kept]" ;
+ }
+ }
+
+ $db->filter_store_key(Closure("store key")) ;
+ $db->filter_store_value(Closure("store value")) ;
+ $db->filter_fetch_key(Closure("fetch key")) ;
+ $db->filter_fetch_value(Closure("fetch value")) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ ok(43, $result{"store key"} eq "store key - 1: [fred]");
+ ok(44, $result{"store value"} eq "store value - 1: [joe]");
+ ok(45, !defined $result{"fetch key"} );
+ ok(46, !defined $result{"fetch value"} );
+ ok(47, $_ eq "original") ;
+
+ ok(48, $db->FIRSTKEY() eq "fred") ;
+ ok(49, $result{"store key"} eq "store key - 1: [fred]");
+ ok(50, $result{"store value"} eq "store value - 1: [joe]");
+ ok(51, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(52, ! defined $result{"fetch value"} );
+ ok(53, $_ eq "original") ;
+
+ $h{"jim"} = "john" ;
+ ok(54, $result{"store key"} eq "store key - 2: [fred jim]");
+ ok(55, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(56, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(57, $result{"fetch value"} eq "");
+ ok(58, $_ eq "original") ;
+
+ ok(59, $h{"fred"} eq "joe");
+ ok(60, $result{"store key"} eq "store key - 3: [fred jim fred]");
+ ok(61, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(62, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(63, $result{"fetch value"} eq "fetch value - 1: [joe]");
+ ok(64, $_ eq "original") ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
+
+{
+ # DBM Filter recursion detection
+ use strict ;
+ my (%h, $db) ;
+ unlink <Op.dbmx*>;
+
+ ok(65, $db = tie(%h, 'GDBM_File','Op.dbmx', &GDBM_WRCREAT, 0640)) ;
+
+ $db->filter_store_key (sub { $_ = $h{$_} }) ;
+
+ eval '$h{1} = 1234' ;
+ ok(66, $@ =~ /^recursion detected in filter_store_key at/ );
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
diff --git a/contrib/perl5/t/lib/getopt.t b/contrib/perl5/t/lib/getopt.t
index fb70f10..0354627 100755
--- a/contrib/perl5/t/lib/getopt.t
+++ b/contrib/perl5/t/lib/getopt.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..11\n";
diff --git a/contrib/perl5/t/lib/glob-basic.t b/contrib/perl5/t/lib/glob-basic.t
new file mode 100755
index 0000000..4728083
--- /dev/null
+++ b/contrib/perl5/t/lib/glob-basic.t
@@ -0,0 +1,119 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
+ print "1..0\n";
+ exit 0;
+ }
+ print "1..9\n";
+}
+END {
+ print "not ok 1\n" unless $loaded;
+}
+use File::Glob ':glob';
+use Cwd ();
+$loaded = 1;
+print "ok 1\n";
+
+sub array {
+ return '(', join(", ", map {defined $_ ? "\"$_\"" : "undef"} @a), ")\n";
+}
+
+# look for the contents of the current directory
+$ENV{PATH} = "/bin";
+delete @ENV{BASH_ENV, CDPATH, ENV, IFS};
+@correct = ();
+if (opendir(D, ".")) {
+ @correct = grep { !/^\.\.?$/ } sort readdir(D);
+ closedir D;
+}
+@a = File::Glob::glob("*", 0);
+@a = sort @a;
+if ("@a" ne "@correct" || GLOB_ERROR) {
+ print "# |@a| ne |@correct|\nnot ";
+}
+print "ok 2\n";
+
+# look up the user's home directory
+# should return a list with one item, and not set ERROR
+if ($^O ne 'MSWin32' || $^O ne 'VMS') {
+ eval {
+ ($name, $home) = (getpwuid($>))[0,7];
+ 1;
+ } and do {
+ @a = File::Glob::glob("~$name", GLOB_TILDE);
+ if (scalar(@a) != 1 || $a[0] ne $home || GLOB_ERROR) {
+ print "not ";
+ }
+ };
+}
+print "ok 3\n";
+
+# check backslashing
+# should return a list with one item, and not set ERROR
+@a = File::Glob::glob('TEST', GLOB_QUOTE);
+if (scalar @a != 1 || $a[0] ne 'TEST' || GLOB_ERROR) {
+ local $/ = "][";
+ print "# [@a]\n";
+ print "not ";
+}
+print "ok 4\n";
+
+# check nonexistent checks
+# should return an empty list
+# XXX since errfunc is NULL on win32, this test is not valid there
+@a = File::Glob::glob("asdfasdf", 0);
+if ($^O ne 'MSWin32' and scalar @a != 0) {
+ print "# |@a|\nnot ";
+}
+print "ok 5\n";
+
+# check bad protections
+# should return an empty list, and set ERROR
+if ($^O eq 'mpeix' or $^O eq 'MSWin32' or $^O eq 'os2' or $^O eq 'VMS'
+ or $^O eq 'cygwin' or Cwd::cwd() =~ m#^/afs#s or not $>)
+{
+ print "ok 6 # skipped\n";
+}
+else {
+ $dir = "PtEeRsLt.dir";
+ mkdir $dir, 0;
+ @a = File::Glob::glob("$dir/*", GLOB_ERR);
+ #print "\@a = ", array(@a);
+ rmdir $dir;
+ if (scalar(@a) != 0 || GLOB_ERROR == 0) {
+ print "not ";
+ }
+ print "ok 6\n";
+}
+
+# check for csh style globbing
+@a = File::Glob::glob('{a,b}', GLOB_BRACE | GLOB_NOMAGIC);
+unless (@a == 2 and $a[0] eq 'a' and $a[1] eq 'b') {
+ print "not ";
+}
+print "ok 7\n";
+
+@a = File::Glob::glob(
+ '{TES*,doesntexist*,a,b}',
+ GLOB_BRACE | GLOB_NOMAGIC
+);
+unless (@a == 3
+ and $a[0] eq ($^O eq 'VMS'? 'test.' : 'TEST')
+ and $a[1] eq 'a'
+ and $a[2] eq 'b')
+{
+ print "not ";
+}
+print "ok 8\n";
+
+# "~" should expand to $ENV{HOME}
+$ENV{HOME} = "sweet home";
+@a = File::Glob::glob('~', GLOB_TILDE | GLOB_NOMAGIC);
+unless (@a == 1 and $a[0] eq $ENV{HOME}) {
+ print "not ";
+}
+print "ok 9\n";
diff --git a/contrib/perl5/t/lib/glob-case.t b/contrib/perl5/t/lib/glob-case.t
new file mode 100755
index 0000000..32719b2
--- /dev/null
+++ b/contrib/perl5/t/lib/glob-case.t
@@ -0,0 +1,53 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
+ print "1..0\n";
+ exit 0;
+ }
+ print "1..7\n";
+}
+END {
+ print "not ok 1\n" unless $loaded;
+}
+use File::Glob qw(:glob csh_glob);
+$loaded = 1;
+print "ok 1\n";
+
+# Test the actual use of the case sensitivity tags, via csh_glob()
+import File::Glob ':nocase';
+@a = csh_glob("lib/G*.t"); # At least glob-basic.t glob-case.t glob-global.t
+print "not " unless @a >= 3;
+print "ok 2\n";
+
+# This may fail on systems which are not case-PRESERVING
+import File::Glob ':case';
+@a = csh_glob("lib/G*.t"); # None should be uppercase
+print "not " unless @a == 0;
+print "ok 3\n";
+
+# Test the explicit use of the GLOB_NOCASE flag
+@a = File::Glob::glob("lib/G*.t", GLOB_NOCASE);
+print "not " unless @a >= 3;
+print "ok 4\n";
+
+# Test Win32 backslash nastiness...
+if ($^O ne 'MSWin32') {
+ print "ok 5\nok 6\nok 7\n";
+}
+else {
+ @a = File::Glob::glob("lib\\g*.t");
+ print "not " unless @a >= 3;
+ print "ok 5\n";
+ mkdir "[]", 0;
+ @a = File::Glob::glob("\\[\\]", GLOB_QUOTE);
+ rmdir "[]";
+ print "# returned @a\nnot " unless @a == 1;
+ print "ok 6\n";
+ @a = File::Glob::glob("lib\\*", GLOB_QUOTE);
+ print "not " if @a == 0;
+ print "ok 7\n";
+}
diff --git a/contrib/perl5/t/lib/glob-global.t b/contrib/perl5/t/lib/glob-global.t
new file mode 100755
index 0000000..9d273bd
--- /dev/null
+++ b/contrib/perl5/t/lib/glob-global.t
@@ -0,0 +1,110 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
+ print "1..0\n";
+ exit 0;
+ }
+ print "1..10\n";
+}
+END {
+ print "not ok 1\n" unless $loaded;
+}
+
+BEGIN {
+ *CORE::GLOBAL::glob = sub { "Just another Perl hacker," };
+}
+
+BEGIN {
+ if ("Just another Perl hacker," ne (<*>)[0]) {
+ die <<EOMessage;
+Your version of perl ($]) doesn't seem to allow extensions to override
+the core glob operator.
+EOMessage
+ }
+}
+
+use File::Glob ':globally';
+$loaded = 1;
+print "ok 1\n";
+
+$_ = "lib/*.t";
+my @r = glob;
+print "not " if $_ ne 'lib/*.t';
+print "ok 2\n";
+
+# we should have at least basic.t, global.t, taint.t
+print "# |@r|\nnot " if @r < 3;
+print "ok 3\n";
+
+# check if <*/*> works
+@r = <*/*.t>;
+# at least t/global.t t/basic.t, t/taint.t
+print "not " if @r < 3;
+print "ok 4\n";
+my $r = scalar @r;
+
+# check if scalar context works
+@r = ();
+while (defined($_ = <*/*.t>)) {
+ #print "# $_\n";
+ push @r, $_;
+}
+print "not " if @r != $r;
+print "ok 5\n";
+
+# check if array context works
+@r = ();
+for (<*/*.t>) {
+ #print "# $_\n";
+ push @r, $_;
+}
+print "not " if @r != $r;
+print "ok 6\n";
+
+# test if implicit assign to $_ in while() works
+@r = ();
+while (<*/*.t>) {
+ #print "# $_\n";
+ push @r, $_;
+}
+print "not " if @r != $r;
+print "ok 7\n";
+
+# test if explicit glob() gets assign magic too
+my @s = ();
+while (glob '*/*.t') {
+ #print "# $_\n";
+ push @s, $_;
+}
+print "not " if "@r" ne "@s";
+print "ok 8\n";
+
+# how about in a different package, like?
+package Foo;
+use File::Glob ':globally';
+@s = ();
+while (glob '*/*.t') {
+ #print "# $_\n";
+ push @s, $_;
+}
+print "not " if "@r" ne "@s";
+print "ok 9\n";
+
+# test if different glob ops maintain independent contexts
+@s = ();
+my $i = 0;
+while (<*/*.t>) {
+ #print "# $_ <";
+ push @s, $_;
+ while (<bas*/*.t>) {
+ #print " $_";
+ $i++;
+ }
+ #print " >\n";
+}
+print "not " if "@r" ne "@s" or not $i;
+print "ok 10\n";
diff --git a/contrib/perl5/t/lib/glob-taint.t b/contrib/perl5/t/lib/glob-taint.t
new file mode 100755
index 0000000..a8dc213
--- /dev/null
+++ b/contrib/perl5/t/lib/glob-taint.t
@@ -0,0 +1,26 @@
+#!./perl -T
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
+ print "1..0\n";
+ exit 0;
+ }
+ print "1..2\n";
+}
+END {
+ print "not ok 1\n" unless $loaded;
+}
+use File::Glob;
+$loaded = 1;
+print "ok 1\n";
+
+# all filenames should be tainted
+@a = File::Glob::glob("*");
+eval { $a = join("",@a), kill 0; 1 };
+unless ($@ =~ /Insecure dependency/) {
+ print "not ";
+}
+print "ok 2\n";
diff --git a/contrib/perl5/t/lib/gol-basic.t b/contrib/perl5/t/lib/gol-basic.t
new file mode 100755
index 0000000..4b25322
--- /dev/null
+++ b/contrib/perl5/t/lib/gol-basic.t
@@ -0,0 +1,24 @@
+#!./perl -w
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+use Getopt::Long 2.17;
+
+print "1..9\n";
+
+@ARGV = qw(-Foo -baR --foo bar);
+Getopt::Long::Configure ("no_ignore_case");
+undef $opt_baR;
+undef $opt_bar;
+print "ok 1\n" if GetOptions ("foo", "Foo=s");
+print ((defined $opt_foo) ? "" : "not ", "ok 2\n");
+print (($opt_foo == 1) ? "" : "not ", "ok 3\n");
+print ((defined $opt_Foo) ? "" : "not ", "ok 4\n");
+print (($opt_Foo eq "-baR") ? "" : "not ", "ok 5\n");
+print ((@ARGV == 1) ? "" : "not ", "ok 6\n");
+print (($ARGV[0] eq "bar") ? "" : "not ", "ok 7\n");
+print (!(defined $opt_baR) ? "" : "not ", "ok 8\n");
+print (!(defined $opt_bar) ? "" : "not ", "ok 9\n");
diff --git a/contrib/perl5/t/lib/gol-compat.t b/contrib/perl5/t/lib/gol-compat.t
new file mode 100755
index 0000000..a4f807c
--- /dev/null
+++ b/contrib/perl5/t/lib/gol-compat.t
@@ -0,0 +1,25 @@
+#!./perl -w
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+require "newgetopt.pl";
+
+print "1..9\n";
+
+@ARGV = qw(-Foo -baR --foo bar);
+$newgetopt::ignorecase = 0;
+$newgetopt::ignorecase = 0;
+undef $opt_baR;
+undef $opt_bar;
+print "ok 1\n" if NGetOpt ("foo", "Foo=s");
+print ((defined $opt_foo) ? "" : "not ", "ok 2\n");
+print (($opt_foo == 1) ? "" : "not ", "ok 3\n");
+print ((defined $opt_Foo) ? "" : "not ", "ok 4\n");
+print (($opt_Foo eq "-baR") ? "" : "not ", "ok 5\n");
+print ((@ARGV == 1) ? "" : "not ", "ok 6\n");
+print (($ARGV[0] eq "bar") ? "" : "not ", "ok 7\n");
+print (!(defined $opt_baR) ? "" : "not ", "ok 8\n");
+print (!(defined $opt_bar) ? "" : "not ", "ok 9\n");
diff --git a/contrib/perl5/t/lib/gol-linkage.t b/contrib/perl5/t/lib/gol-linkage.t
new file mode 100755
index 0000000..a1b2c05
--- /dev/null
+++ b/contrib/perl5/t/lib/gol-linkage.t
@@ -0,0 +1,37 @@
+#!./perl -w
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+use Getopt::Long;
+
+print "1..18\n";
+
+@ARGV = qw(-Foo -baR --foo bar);
+Getopt::Long::Configure ("no_ignore_case");
+%lnk = ();
+print "ok 1\n" if GetOptions (\%lnk, "foo", "Foo=s");
+print ((defined $lnk{foo}) ? "" : "not ", "ok 2\n");
+print (($lnk{foo} == 1) ? "" : "not ", "ok 3\n");
+print ((defined $lnk{Foo}) ? "" : "not ", "ok 4\n");
+print (($lnk{Foo} eq "-baR") ? "" : "not ", "ok 5\n");
+print ((@ARGV == 1) ? "" : "not ", "ok 6\n");
+print (($ARGV[0] eq "bar") ? "" : "not ", "ok 7\n");
+print (!(exists $lnk{baR}) ? "" : "not ", "ok 8\n");
+
+@ARGV = qw(-Foo -baR --foo bar);
+Getopt::Long::Configure ("default","no_ignore_case");
+%lnk = ();
+my $foo;
+print "ok 9\n" if GetOptions (\%lnk, "foo" => \$foo, "Foo=s");
+print ((defined $foo) ? "" : "not ", "ok 10\n");
+print (($foo == 1) ? "" : "not ", "ok 11\n");
+print ((defined $lnk{Foo}) ? "" : "not ", "ok 12\n");
+print (($lnk{Foo} eq "-baR") ? "" : "not ", "ok 13\n");
+print ((@ARGV == 1) ? "" : "not ", "ok 14\n");
+print (($ARGV[0] eq "bar") ? "" : "not ", "ok 15\n");
+print (!(exists $lnk{foo}) ? "" : "not ", "ok 16\n");
+print (!(exists $lnk{baR}) ? "" : "not ", "ok 17\n");
+print (!(exists $lnk{bar}) ? "" : "not ", "ok 18\n");
diff --git a/contrib/perl5/t/lib/h2ph.t b/contrib/perl5/t/lib/h2ph.t
index 1fa7f63..acb150d 100755
--- a/contrib/perl5/t/lib/h2ph.t
+++ b/contrib/perl5/t/lib/h2ph.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..2\n";
@@ -31,4 +31,5 @@ unless(-e '../utils/h2ph') {
# cleanup - should this be in an END block?
unlink("lib/h2ph.ph");
+ unlink("_h2ph_pre.ph");
}
diff --git a/contrib/perl5/t/lib/hostname.t b/contrib/perl5/t/lib/hostname.t
index e4ac365..6f61fb9 100755
--- a/contrib/perl5/t/lib/hostname.t
+++ b/contrib/perl5/t/lib/hostname.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Sys::Hostname;
@@ -15,5 +15,6 @@ if ($@) {
print "1..0\n" if $@ =~ /Cannot get host name/;
} else {
print "1..1\n";
+ print "# \$host = `$host'\n";
print "ok 1\n";
}
diff --git a/contrib/perl5/t/lib/io_const.t b/contrib/perl5/t/lib/io_const.t
new file mode 100755
index 0000000..48cb6b5
--- /dev/null
+++ b/contrib/perl5/t/lib/io_const.t
@@ -0,0 +1,33 @@
+
+BEGIN {
+ unless(grep /blib/, @INC) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ }
+}
+
+use Config;
+
+BEGIN {
+ if(-d "lib" && -f "TEST") {
+ if ($Config{'extensions'} !~ /\bIO\b/ && $^O ne 'VMS') {
+ print "1..0\n";
+ exit 0;
+ }
+ }
+}
+
+use IO::Handle;
+
+print "1..6\n";
+my $i = 1;
+foreach (qw(SEEK_SET SEEK_CUR SEEK_END _IOFBF _IOLBF _IONBF)) {
+ my $d1 = defined(&{"IO::Handle::" . $_}) ? 1 : 0;
+ my $v1 = $d1 ? &{"IO::Handle::" . $_}() : undef;
+ my $v2 = IO::Handle::constant($_);
+ my $d2 = defined($v2);
+
+ print "not "
+ if($d1 != $d2 || ($d1 && ($v1 != $v2)));
+ print "ok ",$i++,"\n";
+}
diff --git a/contrib/perl5/t/lib/io_dir.t b/contrib/perl5/t/lib/io_dir.t
new file mode 100755
index 0000000..11ec8bc
--- /dev/null
+++ b/contrib/perl5/t/lib/io_dir.t
@@ -0,0 +1,66 @@
+#!./perl
+
+BEGIN {
+ unless(grep /blib/, @INC) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ }
+ require Config; import Config;
+ if ($] < 5.00326 || not $Config{'d_readdir'}) {
+ print "1..0\n";
+ exit 0;
+ }
+}
+
+select(STDERR); $| = 1;
+select(STDOUT); $| = 1;
+
+use IO::Dir qw(DIR_UNLINK);
+
+print "1..10\n";
+
+$dot = new IO::Dir ".";
+print defined($dot) ? "ok" : "not ok", " 1\n";
+
+@a = sort <*>;
+do { $first = $dot->read } while defined($first) && $first =~ /^\./;
+print +(grep { $_ eq $first } @a) ? "ok" : "not ok", " 2\n";
+
+@b = sort($first, (grep {/^[^.]/} $dot->read));
+print +(join("\0", @a) eq join("\0", @b)) ? "ok" : "not ok", " 3\n";
+
+$dot->rewind;
+@c = sort grep {/^[^.]/} $dot->read;
+print +(join("\0", @b) eq join("\0", @c)) ? "ok" : "not ok", " 4\n";
+
+$dot->close;
+$dot->rewind;
+print defined($dot->read) ? "not ok" : "ok", " 5\n";
+
+open(FH,'>X') || die "Can't create x";
+print FH "X";
+close(FH);
+
+tie %dir, IO::Dir, ".";
+my @files = keys %dir;
+
+# I hope we do not have an empty dir :-)
+print @files ? "ok" : "not ok", " 6\n";
+
+my $stat = $dir{'X'};
+print defined($stat) && UNIVERSAL::isa($stat,'File::stat') && $stat->size == 1
+ ? "ok" : "not ok", " 7\n";
+
+delete $dir{'X'};
+
+print -f 'X' ? "ok" : "not ok", " 8\n";
+
+tie %dirx, IO::Dir, ".", DIR_UNLINK;
+
+my $statx = $dirx{'X'};
+print defined($statx) && UNIVERSAL::isa($statx,'File::stat') && $statx->size == 1
+ ? "ok" : "not ok", " 9\n";
+
+delete $dirx{'X'};
+
+print -f 'X' ? "not ok" : "ok", " 10\n";
diff --git a/contrib/perl5/t/lib/io_dup.t b/contrib/perl5/t/lib/io_dup.t
index 6b0caf1..c895fb4 100755
--- a/contrib/perl5/t/lib/io_dup.t
+++ b/contrib/perl5/t/lib/io_dup.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
diff --git a/contrib/perl5/t/lib/io_linenum.t b/contrib/perl5/t/lib/io_linenum.t
new file mode 100755
index 0000000..3503215
--- /dev/null
+++ b/contrib/perl5/t/lib/io_linenum.t
@@ -0,0 +1,80 @@
+#!./perl
+
+# test added 29th April 1999 by Paul Johnson (pjcj@transeda.com)
+# updated 28th May 1999 by Paul Johnson
+
+my $File;
+
+BEGIN
+{
+ $File = __FILE__;
+ if (-d 't')
+ {
+ chdir 't';
+ $File =~ s/^t\W+//; # Remove first directory
+ }
+ unshift @INC, '../lib' if -d '../lib';
+ require strict; import strict;
+}
+
+use Test;
+
+BEGIN { plan tests => 12 }
+
+use IO::File;
+
+sub lineno
+{
+ my ($f) = @_;
+ my $l;
+ $l .= "$. ";
+ $l .= $f->input_line_number;
+ $l .= " $."; # check $. before and after input_line_number
+ $l;
+}
+
+my $t;
+
+open (F, $File) or die $!;
+my $io = IO::File->new($File) or die $!;
+
+<F> for (1 .. 10);
+ok(lineno($io), "10 0 10");
+
+$io->getline for (1 .. 5);
+ok(lineno($io), "5 5 5");
+
+<F>;
+ok(lineno($io), "11 5 11");
+
+$io->getline;
+ok(lineno($io), "6 6 6");
+
+$t = tell F; # tell F; provokes a warning
+ok(lineno($io), "11 6 11");
+
+<F>;
+ok(lineno($io), "12 6 12");
+
+select F;
+ok(lineno($io), "12 6 12");
+
+<F> for (1 .. 10);
+ok(lineno($io), "22 6 22");
+
+$io->getline for (1 .. 5);
+ok(lineno($io), "11 11 11");
+
+$t = tell F;
+# We used to have problems here before local $. worked.
+# input_line_number() used to use select and tell. When we did the
+# same, that mechanism broke. It should work now.
+ok(lineno($io), "22 11 22");
+
+{
+ local $.;
+ $io->getline for (1 .. 5);
+ ok(lineno($io), "16 16 16");
+}
+
+ok(lineno($io), "22 16 22");
diff --git a/contrib/perl5/t/lib/io_multihomed.t b/contrib/perl5/t/lib/io_multihomed.t
new file mode 100755
index 0000000..7337a5f
--- /dev/null
+++ b/contrib/perl5/t/lib/io_multihomed.t
@@ -0,0 +1,124 @@
+#!./perl
+
+BEGIN {
+ unless(grep /blib/, @INC) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ }
+}
+
+use Config;
+
+BEGIN {
+ if(-d "lib" && -f "TEST") {
+ my $reason;
+ if (! $Config{'d_fork'}) {
+ $reason = 'no fork';
+ }
+ elsif ($Config{'extensions'} !~ /\bSocket\b/) {
+ $reason = 'Socket extension unavailable';
+ }
+ elsif ($Config{'extensions'} !~ /\bIO\b/) {
+ $reason = 'IO extension unavailable';
+ }
+ if ($reason) {
+ print "1..0 # Skip: $reason\n";
+ exit 0;
+ }
+ }
+}
+
+$| = 1;
+
+print "1..8\n";
+
+
+package Multi;
+require IO::Socket::INET;
+@ISA=qw(IO::Socket::INET);
+
+use Socket qw(inet_aton inet_ntoa unpack_sockaddr_in);
+
+sub _get_addr
+{
+ my($sock,$addr_str, $multi) = @_;
+ #print "_get_addr($sock, $addr_str, $multi)\n";
+
+ print "not " unless $multi;
+ print "ok 2\n";
+
+ (
+ # private IP-addresses which I hope does not work anywhere :-)
+ inet_aton("10.250.230.10"),
+ inet_aton("10.250.230.12"),
+ inet_aton("127.0.0.1") # loopback
+ )
+}
+
+sub connect
+{
+ my $self = shift;
+ if (@_ == 1) {
+ my($port, $addr) = unpack_sockaddr_in($_[0]);
+ $addr = inet_ntoa($addr);
+ #print "connect($self, $port, $addr)\n";
+ if($addr eq "10.250.230.10") {
+ print "ok 3\n";
+ return 0;
+ }
+ if($addr eq "10.250.230.12") {
+ print "ok 4\n";
+ return 0;
+ }
+ }
+ $self->SUPER::connect(@_);
+}
+
+
+
+package main;
+
+use IO::Socket;
+
+$listen = IO::Socket::INET->new(Listen => 2,
+ Proto => 'tcp',
+ Timeout => 5,
+ ) or die "$!";
+
+print "ok 1\n";
+
+$port = $listen->sockport;
+
+if($pid = fork()) {
+
+ $sock = $listen->accept() or die "$!";
+ print "ok 5\n";
+
+ print $sock->getline();
+ print $sock "ok 7\n";
+
+ waitpid($pid,0);
+
+ $sock->close;
+
+ print "ok 8\n";
+
+} elsif(defined $pid) {
+
+ $sock = Multi->new(PeerPort => $port,
+ Proto => 'tcp',
+ PeerAddr => 'localhost',
+ MultiHomed => 1,
+ Timeout => 1,
+ ) or die "$!";
+
+ print $sock "ok 6\n";
+ sleep(1); # race condition
+ print $sock->getline();
+
+ $sock->close;
+
+ exit;
+} else {
+ die;
+}
diff --git a/contrib/perl5/t/lib/io_pipe.t b/contrib/perl5/t/lib/io_pipe.t
index e617c92..bcb89a0 100755
--- a/contrib/perl5/t/lib/io_pipe.t
+++ b/contrib/perl5/t/lib/io_pipe.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
@@ -11,10 +11,16 @@ use Config;
BEGIN {
if(-d "lib" && -f "TEST") {
- if (! $Config{'d_fork'} ||
- ($Config{'extensions'} !~ /\bIO\b/ && $^O ne 'VMS'))
- {
- print "1..0\n";
+ my $reason;
+ if (! $Config{'d_fork'}) {
+ $reason = 'no fork';
+ }
+ elsif ($Config{'extensions'} !~ /\bIO\b/) {
+ $reason = 'IO extension unavailable';
+ }
+ undef $reason if $^O eq 'VMS';
+ if ($reason) {
+ print "1..0 # Skip: $reason\n";
exit 0;
}
}
diff --git a/contrib/perl5/t/lib/io_poll.t b/contrib/perl5/t/lib/io_poll.t
new file mode 100755
index 0000000..68ad7b7
--- /dev/null
+++ b/contrib/perl5/t/lib/io_poll.t
@@ -0,0 +1,77 @@
+#!./perl
+
+BEGIN {
+ unless(grep /blib/, @INC) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ }
+}
+
+if ($^O eq 'mpeix') {
+ print "1..0 # Skip: broken on MPE/iX\n";
+ exit 0;
+}
+
+select(STDERR); $| = 1;
+select(STDOUT); $| = 1;
+
+print "1..8\n";
+
+use IO::Handle;
+use IO::Poll qw(/POLL/);
+
+my $poll = new IO::Poll;
+
+my $stdout = \*STDOUT;
+my $dupout = IO::Handle->new_from_fd(fileno($stdout),"w");
+
+$poll->mask($stdout => POLLOUT);
+
+print "not "
+ unless $poll->mask($stdout) == POLLOUT;
+print "ok 1\n";
+
+$poll->mask($dupout => POLLPRI);
+
+print "not "
+ unless $poll->mask($dupout) == POLLPRI;
+print "ok 2\n";
+
+$poll->poll(0.1);
+
+if ($^O eq 'MSWin32') {
+print "ok 3 # skipped, doesn't work on non-socket fds\n";
+print "ok 4 # skipped, doesn't work on non-socket fds\n";
+}
+else {
+print "not "
+ unless $poll->events($stdout) == POLLOUT;
+print "ok 3\n";
+
+print "not "
+ if $poll->events($dupout);
+print "ok 4\n";
+}
+
+my @h = $poll->handles;
+print "not "
+ unless @h == 2;
+print "ok 5\n";
+
+$poll->remove($stdout);
+
+@h = $poll->handles;
+
+print "not "
+ unless @h == 1;
+print "ok 6\n";
+
+print "not "
+ if $poll->mask($stdout);
+print "ok 7\n";
+
+$poll->poll(0.1);
+
+print "not "
+ if $poll->events($stdout);
+print "ok 8\n";
diff --git a/contrib/perl5/t/lib/io_sel.t b/contrib/perl5/t/lib/io_sel.t
index 3dc651b..85e14ab 100755
--- a/contrib/perl5/t/lib/io_sel.t
+++ b/contrib/perl5/t/lib/io_sel.t
@@ -3,14 +3,14 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
select(STDERR); $| = 1;
select(STDOUT); $| = 1;
-print "1..21\n";
+print "1..23\n";
use IO::Select 1.09;
@@ -114,3 +114,19 @@ print "ok 20\n";
$sel->remove($sel->handles);
print "not " unless $sel->count == 0 && !defined($sel->bits);
print "ok 21\n";
+
+# check warnings
+$SIG{__WARN__} = sub {
+ ++ $w
+ if $_[0] =~ /^Call to depreciated method 'has_error', use 'has_exception'/
+ } ;
+$w = 0 ;
+IO::Select::has_error();
+print "not " unless $w == 0 ;
+$w = 0 ;
+print "ok 22\n" ;
+use warnings 'IO::Select' ;
+IO::Select::has_error();
+print "not " unless $w == 1 ;
+$w = 0 ;
+print "ok 23\n" ;
diff --git a/contrib/perl5/t/lib/io_sock.t b/contrib/perl5/t/lib/io_sock.t
index 8fc52e4..056d131f 100755
--- a/contrib/perl5/t/lib/io_sock.t
+++ b/contrib/perl5/t/lib/io_sock.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
@@ -11,23 +11,34 @@ use Config;
BEGIN {
if (-d "lib" && -f "TEST") {
- if (!$Config{'d_fork'} ||
- (($Config{'extensions'} !~ /\bSocket\b/ ||
- $Config{'extensions'} !~ /\bIO\b/) &&
- !(($^O eq 'VMS') && $Config{d_socket}))) {
- print "1..0\n";
+ my $reason;
+ if (! $Config{'d_fork'}) {
+ $reason = 'no fork';
+ }
+ elsif ($Config{'extensions'} !~ /\bSocket\b/) {
+ $reason = 'Socket extension unavailable';
+ }
+ elsif ($Config{'extensions'} !~ /\bIO\b/) {
+ $reason = 'IO extension unavailable';
+ }
+ undef $reason if $^O eq 'VMS' and $Config{d_socket};
+ if ($reason) {
+ print "1..0 # Skip: $reason\n";
exit 0;
}
}
}
$| = 1;
-print "1..5\n";
+print "1..14\n";
use IO::Socket;
$listen = IO::Socket::INET->new(Listen => 2,
Proto => 'tcp',
+ # some systems seem to need as much as 10,
+ # so be generous with the timeout
+ Timeout => 15,
) or die "$!";
print "ok 1\n";
@@ -43,7 +54,7 @@ $port = $listen->sockport;
if($pid = fork()) {
- $sock = $listen->accept();
+ $sock = $listen->accept() or die "accept failed: $!";
print "ok 2\n";
$sock->autoflush(1);
@@ -69,7 +80,7 @@ if($pid = fork()) {
Proto => 'tcp',
PeerAddr => 'localhost'
)
- or die "$! (maybe your system does not have the 'localhost' address defined)";
+ or die "$! (maybe your system does not have the 'localhost' address defined)";
$sock->autoflush(1);
@@ -84,8 +95,103 @@ if($pid = fork()) {
die;
}
+# Test various other ways to create INET sockets that should
+# also work.
+$listen = IO::Socket::INET->new(Listen => '', Timeout => 15) or die "$!";
+$port = $listen->sockport;
+
+if($pid = fork()) {
+ SERVER_LOOP:
+ while (1) {
+ last SERVER_LOOP unless $sock = $listen->accept;
+ while (<$sock>) {
+ last SERVER_LOOP if /^quit/;
+ last if /^done/;
+ print;
+ }
+ $sock = undef;
+ }
+ $listen->close;
+} elsif (defined $pid) {
+ # child, try various ways to connect
+ $sock = IO::Socket::INET->new("localhost:$port");
+ if ($sock) {
+ print "not " unless $sock->connected;
+ print "ok 6\n";
+ $sock->print("ok 7\n");
+ sleep(1);
+ print "ok 8\n";
+ $sock->print("ok 9\n");
+ $sock->print("done\n");
+ $sock->close;
+ }
+ else {
+ print "# $@\n";
+ print "not ok 6\n";
+ print "not ok 7\n";
+ print "not ok 8\n";
+ print "not ok 9\n";
+ }
+
+ # some machines seem to suffer from a race condition here
+ sleep(2);
+
+ $sock = IO::Socket::INET->new("127.0.0.1:$port");
+ if ($sock) {
+ $sock->print("ok 10\n");
+ $sock->print("done\n");
+ $sock->close;
+ }
+ else {
+ print "# $@\n";
+ print "not ok 10\n";
+ }
+ # some machines seem to suffer from a race condition here
+ sleep(1);
+ $sock = IO::Socket->new(Domain => AF_INET,
+ PeerAddr => "localhost:$port");
+ if ($sock) {
+ $sock->print("ok 11\n");
+ $sock->print("quit\n");
+ }
+ $sock = undef;
+ sleep(1);
+ exit;
+} else {
+ die;
+}
+# Then test UDP sockets
+$server = IO::Socket->new(Domain => AF_INET,
+ Proto => 'udp',
+ LocalAddr => 'localhost');
+$port = $server->sockport;
+
+if ($^O eq 'mpeix') {
+ print("ok 12 # skipped\n")
+} else {
+ if ($pid = fork()) {
+ my $buf;
+ $server->recv($buf, 100);
+ print $buf;
+ } elsif (defined($pid)) {
+ #child
+ $sock = IO::Socket::INET->new(Proto => 'udp',
+ PeerAddr => "localhost:$port");
+ $sock->send("ok 12\n");
+ sleep(1);
+ $sock->send("ok 12\n"); # send another one to be sure
+ exit;
+ } else {
+ die;
+ }
+}
+print "not " unless $server->blocking;
+print "ok 13\n";
+$server->blocking(0);
+print "not " if $server->blocking;
+print "ok 14\n";
diff --git a/contrib/perl5/t/lib/io_taint.t b/contrib/perl5/t/lib/io_taint.t
index 0ef2cfd..deaa6c7 100755
--- a/contrib/perl5/t/lib/io_taint.t
+++ b/contrib/perl5/t/lib/io_taint.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
diff --git a/contrib/perl5/t/lib/io_tell.t b/contrib/perl5/t/lib/io_tell.t
index 2009d61..8d75242 100755
--- a/contrib/perl5/t/lib/io_tell.t
+++ b/contrib/perl5/t/lib/io_tell.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
$tell_file = "TEST";
}
else {
diff --git a/contrib/perl5/t/lib/io_udp.t b/contrib/perl5/t/lib/io_udp.t
index ad2632d..3d5145e 100755
--- a/contrib/perl5/t/lib/io_udp.t
+++ b/contrib/perl5/t/lib/io_udp.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
@@ -11,18 +11,48 @@ use Config;
BEGIN {
if(-d "lib" && -f "TEST") {
- if ( ($Config{'extensions'} !~ /\bSocket\b/ ||
- $Config{'extensions'} !~ /\bIO\b/ ||
- ($^O eq 'os2') || $^O eq 'apollo') &&
- !(($^O eq 'VMS') && $Config{d_socket})) {
- print "1..0\n";
+ my $reason;
+
+ if ($Config{'extensions'} !~ /\bSocket\b/) {
+ $reason = 'Socket was not built';
+ }
+ elsif ($Config{'extensions'} !~ /\bIO\b/) {
+ $reason = 'IO was not built';
+ }
+ elsif ($^O eq 'apollo') {
+ $reason = "unknown *FIXME*";
+ }
+ undef $reason if $^O eq 'VMS' and $Config{d_socket};
+ if ($reason) {
+ print "1..0 # Skip: $reason\n";
exit 0;
- }
+ }
+ }
+}
+
+sub compare_addr {
+ no utf8;
+ my $a = shift;
+ my $b = shift;
+ if (length($a) != length $b) {
+ my $min = (length($a) < length $b) ? length($a) : length $b;
+ if ($min and substr($a, 0, $min) eq substr($b, 0, $min)) {
+ printf "# Apparently: %d bytes junk at the end of %s\n# %s\n",
+ abs(length($a) - length ($b)),
+ $_[length($a) < length ($b) ? 1 : 0],
+ "consider decreasing bufsize of recfrom.";
+ substr($a, $min) = "";
+ substr($b, $min) = "";
+ }
+ return 0;
}
+ my @a = unpack_sockaddr_in($a);
+ my @b = unpack_sockaddr_in($b);
+ "$a[0]$a[1]" eq "$b[0]$b[1]";
}
$| = 1;
-print "1..3\n";
+print "1..7\n";
use Socket;
use IO::Socket qw(AF_INET SOCK_DGRAM INADDR_ANY);
@@ -35,14 +65,34 @@ use IO::Socket qw(AF_INET SOCK_DGRAM INADDR_ANY);
$udpa = IO::Socket::INET->new(Proto => 'udp', LocalAddr => 'localhost')
or die "$! (maybe your system does not have the 'localhost' address defined)";
+
+print "ok 1\n";
+
$udpb = IO::Socket::INET->new(Proto => 'udp', LocalAddr => 'localhost')
or die "$! (maybe your system does not have the 'localhost' address defined)";
-print "ok 1\n";
+print "ok 2\n";
-$udpa->send("ok 2\n",0,$udpb->sockname);
-$udpb->recv($buf="",5);
+$udpa->send("ok 4\n",0,$udpb->sockname);
+
+print "not "
+ unless compare_addr($udpa->peername,$udpb->sockname, 'peername', 'sockname');
+print "ok 3\n";
+
+my $where = $udpb->recv($buf="",5);
print $buf;
-$udpb->send("ok 3\n");
+
+my @xtra = ();
+
+unless(compare_addr($where,$udpa->sockname, 'recv name', 'sockname')) {
+ print "not ";
+ @xtra = (0,$udpa->sockname);
+}
+print "ok 5\n";
+
+$udpb->send("ok 6\n",@xtra);
$udpa->recv($buf="",5);
print $buf;
+
+print "not " if $udpa->connected;
+print "ok 7\n";
diff --git a/contrib/perl5/t/lib/io_unix.t b/contrib/perl5/t/lib/io_unix.t
new file mode 100755
index 0000000..247647a
--- /dev/null
+++ b/contrib/perl5/t/lib/io_unix.t
@@ -0,0 +1,89 @@
+#!./perl
+
+BEGIN {
+ unless(grep /blib/, @INC) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ }
+}
+
+use Config;
+
+BEGIN {
+ if(-d "lib" && -f "TEST") {
+ my $reason;
+ if (! $Config{'d_fork'}) {
+ $reason = 'no fork';
+ }
+ elsif ($Config{'extensions'} !~ /\bSocket\b/) {
+ $reason = 'Socket extension unavailable';
+ }
+ elsif ($Config{'extensions'} !~ /\bIO\b/) {
+ $reason = 'IO extension unavailable';
+ }
+ elsif ($^O eq 'os2') {
+ require IO::Socket;
+
+ eval {IO::Socket::pack_sockaddr_un('/tmp/foo') || 1}
+ or $@ !~ /not implemented/ or
+ $reason = 'compiled without TCP/IP stack v4';
+ } elsif ($^O eq 'qnx') {
+ $reason = 'Not implemented';
+ }
+ undef $reason if $^O eq 'VMS' and $Config{d_socket};
+ if ($reason) {
+ print "1..0 # Skip: $reason\n";
+ exit 0;
+ }
+ }
+}
+
+$PATH = "/tmp/sock-$$";
+
+# Test if we can create the file within the tmp directory
+if (-e $PATH or not open(TEST, ">$PATH") and $^O ne 'os2') {
+ print "1..0 # Skip: cannot open '$PATH' for write\n";
+ exit 0;
+}
+close(TEST);
+unlink($PATH) or $^O eq 'os2' or die "Can't unlink $PATH: $!";
+
+# Start testing
+$| = 1;
+print "1..5\n";
+
+use IO::Socket;
+
+$listen = IO::Socket::UNIX->new(Local=>$PATH, Listen=>0) || die "$!";
+print "ok 1\n";
+
+if($pid = fork()) {
+
+ $sock = $listen->accept();
+ print "ok 2\n";
+
+ print $sock->getline();
+
+ print $sock "ok 4\n";
+
+ $sock->close;
+
+ waitpid($pid,0);
+ unlink($PATH) || $^O eq 'os2' || warn "Can't unlink $PATH: $!";
+
+ print "ok 5\n";
+
+} elsif(defined $pid) {
+
+ $sock = IO::Socket::UNIX->new(Peer => $PATH) or die "$!";
+
+ print $sock "ok 3\n";
+
+ print $sock->getline();
+
+ $sock->close;
+
+ exit;
+} else {
+ die;
+}
diff --git a/contrib/perl5/t/lib/io_xs.t b/contrib/perl5/t/lib/io_xs.t
index 1a6fd38..6bbba16 100755
--- a/contrib/perl5/t/lib/io_xs.t
+++ b/contrib/perl5/t/lib/io_xs.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
}
diff --git a/contrib/perl5/t/lib/ipc_sysv.t b/contrib/perl5/t/lib/ipc_sysv.t
index 30ea48d..a4f3e3f 100755
--- a/contrib/perl5/t/lib/ipc_sysv.t
+++ b/contrib/perl5/t/lib/ipc_sysv.t
@@ -3,22 +3,27 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
- unless ($Config{'d_msg'} eq 'define' &&
- $Config{'d_sem'} eq 'define') {
- print "1..0\n";
- exit;
+ my $reason;
+
+ if ($Config{'d_sem'} ne 'define') {
+ $reason = '$Config{d_sem} undefined';
+ } elsif ($Config{'d_msg'} ne 'define') {
+ $reason = '$Config{d_msg} undefined';
+ }
+ if ($reason) {
+ print "1..0 # Skip: $reason\n";
+ exit 0;
}
}
# These constants are common to all tests.
# Later the sem* tests will import more for themselves.
-use IPC::SysV qw(IPC_PRIVATE IPC_NOWAIT IPC_STAT IPC_RMID
- S_IRWXU S_IRWXG S_IRWXO);
+use IPC::SysV qw(IPC_PRIVATE IPC_NOWAIT IPC_STAT IPC_RMID S_IRWXU);
use strict;
print "1..16\n";
@@ -49,11 +54,14 @@ EOM
exit(1);
};
+my $perm = S_IRWXU;
+
if ($Config{'d_msgget'} eq 'define' &&
$Config{'d_msgctl'} eq 'define' &&
$Config{'d_msgsnd'} eq 'define' &&
$Config{'d_msgrcv'} eq 'define') {
- $msg = msgget(IPC_PRIVATE, S_IRWXU | S_IRWXG | S_IRWXO);
+
+ $msg = msgget(IPC_PRIVATE, $perm);
# Very first time called after machine is booted value may be 0
die "msgget failed: $!\n" unless defined($msg) && $msg >= 0;
@@ -63,8 +71,34 @@ if ($Config{'d_msgget'} eq 'define' &&
my $msgtype = 1;
my $msgtext = "hello";
- msgsnd($msg,pack("L a*",$msgtype,$msgtext),0) or print "not ";
+ my $test2bad;
+ my $test5bad;
+ my $test6bad;
+
+ unless (msgsnd($msg,pack("L! a*",$msgtype,$msgtext),IPC_NOWAIT)) {
+ print "not ";
+ $test2bad = 1;
+ }
print "ok 2\n";
+ if ($test2bad) {
+ print <<EOM;
+#
+# The failure of the subtest #2 may indicate that the message queue
+# resource limits either of the system or of the testing account
+# have been reached. Error message "Operating would block" is
+# usually indicative of this situation. The error message was now:
+# "$!"
+#
+# You can check the message queues with the 'ipcs' command and
+# you can remove unneeded queues with the 'ipcrm -q id' command.
+# You may also consider configuring your system or account
+# to have more message queue resources.
+#
+# Because of the subtest #2 failing also the substests #5 and #6 will
+# very probably also fail.
+#
+EOM
+ }
my $data;
msgctl($msg,IPC_STAT,$data) or print "not ";
@@ -74,13 +108,33 @@ if ($Config{'d_msgget'} eq 'define' &&
print "ok 4\n";
my $msgbuf;
- msgrcv($msg,$msgbuf,256,0,IPC_NOWAIT) or print "not ";
+ unless (msgrcv($msg,$msgbuf,256,0,IPC_NOWAIT)) {
+ print "not ";
+ $test5bad = 1;
+ }
print "ok 5\n";
+ if ($test5bad && $test2bad) {
+ print <<EOM;
+#
+# This failure was to be expected because the subtest #2 failed.
+#
+EOM
+ }
- my($rmsgtype,$rmsgtext) = unpack("L a*",$msgbuf);
-
- print "not " unless($rmsgtype == $msgtype && $rmsgtext eq $msgtext);
+ my($rmsgtype,$rmsgtext);
+ ($rmsgtype,$rmsgtext) = unpack("L! a*",$msgbuf);
+ unless ($rmsgtype == $msgtype && $rmsgtext eq $msgtext) {
+ print "not ";
+ $test6bad = 1;
+ }
print "ok 6\n";
+ if ($test6bad && $test2bad) {
+ print <<EOM;
+#
+# This failure was to be expected because the subtest #2 failed.
+#
+EOM
+ }
} else {
for (1..6) {
print "ok $_\n"; # fake it
@@ -90,80 +144,64 @@ if ($Config{'d_msgget'} eq 'define' &&
if($Config{'d_semget'} eq 'define' &&
$Config{'d_semctl'} eq 'define') {
- use IPC::SysV qw(IPC_CREAT GETALL SETALL);
+ if ($Config{'d_semctl_semid_ds'} eq 'define' ||
+ $Config{'d_semctl_semun'} eq 'define') {
- $sem = semget(IPC_PRIVATE, 10, S_IRWXU | S_IRWXG | S_IRWXO | IPC_CREAT);
- # Very first time called after machine is booted value may be 0
- die "semget: $!\n" unless defined($sem) && $sem >= 0;
+ use IPC::SysV qw(IPC_CREAT GETALL SETALL);
- print "ok 7\n";
+ $sem = semget(IPC_PRIVATE, 10, $perm | IPC_CREAT);
+ # Very first time called after machine is booted value may be 0
+ die "semget: $!\n" unless defined($sem) && $sem >= 0;
- my $data;
- semctl($sem,0,IPC_STAT,$data) or print "not ";
- print "ok 8\n";
+ print "ok 7\n";
- print "not " unless length($data);
- print "ok 9\n";
-
- my $template;
-
- # Find the pack/unpack template capable of handling native C shorts.
-
- if ($Config{shortsize} == 2) {
- $template = "s";
- } elsif ($Config{shortsize} == 4) {
- $template = "l";
- } elsif ($Config{shortsize} == 8) {
- # Try quad last because not supported everywhere.
- foreach my $t (qw(i q)) {
- # We could trap the unsupported quad template with eval
- # but if we get this far we should have quad support anyway.
- if (length(pack($t, 0)) == 8) {
- $template = $t;
- last;
- }
- }
- }
-
- die "$0: cannot pack native shorts\n" unless defined $template;
-
- $template .= "*";
+ my $data;
+ semctl($sem,0,IPC_STAT,$data) or print "not ";
+ print "ok 8\n";
+
+ print "not " unless length($data);
+ print "ok 9\n";
- my $nsem = 10;
+ my $nsem = 10;
- semctl($sem,0,SETALL,pack($template,(0) x $nsem)) or print "not ";
- print "ok 10\n";
+ semctl($sem,0,SETALL,pack("s!*",(0) x $nsem)) or print "not ";
+ print "ok 10\n";
- $data = "";
- semctl($sem,0,GETALL,$data) or print "not ";
- print "ok 11\n";
+ $data = "";
+ semctl($sem,0,GETALL,$data) or print "not ";
+ print "ok 11\n";
- print "not " unless length($data) == length(pack($template,(0) x $nsem));
- print "ok 12\n";
+ print "not " unless length($data) == length(pack("s!*",(0) x $nsem));
+ print "ok 12\n";
- my @data = unpack($template,$data);
+ my @data = unpack("s!*",$data);
- my $adata = "0" x $nsem;
+ my $adata = "0" x $nsem;
- print "not " unless @data == $nsem and join("",@data) eq $adata;
- print "ok 13\n";
+ print "not " unless @data == $nsem and join("",@data) eq $adata;
+ print "ok 13\n";
- my $poke = 2;
+ my $poke = 2;
- $data[$poke] = 1;
- semctl($sem,0,SETALL,pack($template,@data)) or print "not ";
- print "ok 14\n";
+ $data[$poke] = 1;
+ semctl($sem,0,SETALL,pack("s!*",@data)) or print "not ";
+ print "ok 14\n";
- $data = "";
- semctl($sem,0,GETALL,$data) or print "not ";
- print "ok 15\n";
+ $data = "";
+ semctl($sem,0,GETALL,$data) or print "not ";
+ print "ok 15\n";
- @data = unpack($template,$data);
+ @data = unpack("s!*",$data);
- my $bdata = "0" x $poke . "1" . "0" x ($nsem-$poke-1);
+ my $bdata = "0" x $poke . "1" . "0" x ($nsem-$poke-1);
- print "not " unless join("",@data) eq $bdata;
- print "ok 16\n";
+ print "not " unless join("",@data) eq $bdata;
+ print "ok 16\n";
+ } else {
+ for (7..16) {
+ print "ok $_ # skipped, no semctl possible\n";
+ }
+ }
} else {
for (7..16) {
print "ok $_\n"; # fake it
diff --git a/contrib/perl5/t/lib/ndbm.t b/contrib/perl5/t/lib/ndbm.t
index a97dbd1..39c3f40 100755
--- a/contrib/perl5/t/lib/ndbm.t
+++ b/contrib/perl5/t/lib/ndbm.t
@@ -4,10 +4,10 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bNDBM_File\b/) {
- print "1..0\n";
+ print "1..0 # Skip: NDBM_File was not built\n";
exit 0;
}
}
@@ -16,7 +16,7 @@ require NDBM_File;
#If Fcntl is not available, try 0x202 or 0x102 for O_RDWR|O_CREAT
use Fcntl;
-print "1..18\n";
+print "1..64\n";
unlink <Op.dbmx*>;
@@ -205,3 +205,189 @@ EOM
unlink "SubDB.pm", <dbhash.tmp*> ;
}
+
+{
+ # DBM Filter tests
+ use strict ;
+ my (%h, $db) ;
+ my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+
+ sub checkOutput
+ {
+ my($fk, $sk, $fv, $sv) = @_ ;
+ return
+ $fetch_key eq $fk && $store_key eq $sk &&
+ $fetch_value eq $fv && $store_value eq $sv &&
+ $_ eq 'original' ;
+ }
+
+ unlink <Op.dbmx*>;
+ ok(19, $db = tie(%h, 'NDBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ $db->filter_fetch_key (sub { $fetch_key = $_ }) ;
+ $db->filter_store_key (sub { $store_key = $_ }) ;
+ $db->filter_fetch_value (sub { $fetch_value = $_}) ;
+ $db->filter_store_value (sub { $store_value = $_ }) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ # fk sk fv sv
+ ok(20, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(21, $h{"fred"} eq "joe");
+ # fk sk fv sv
+ ok(22, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(23, $db->FIRSTKEY() eq "fred") ;
+ # fk sk fv sv
+ ok(24, checkOutput( "fred", "", "", "")) ;
+
+ # replace the filters, but remember the previous set
+ my ($old_fk) = $db->filter_fetch_key
+ (sub { $_ = uc $_ ; $fetch_key = $_ }) ;
+ my ($old_sk) = $db->filter_store_key
+ (sub { $_ = lc $_ ; $store_key = $_ }) ;
+ my ($old_fv) = $db->filter_fetch_value
+ (sub { $_ = "[$_]"; $fetch_value = $_ }) ;
+ my ($old_sv) = $db->filter_store_value
+ (sub { s/o/x/g; $store_value = $_ }) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"Fred"} = "Joe" ;
+ # fk sk fv sv
+ ok(25, checkOutput( "", "fred", "", "Jxe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(26, $h{"Fred"} eq "[Jxe]");
+ # fk sk fv sv
+ ok(27, checkOutput( "", "fred", "[Jxe]", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(28, $db->FIRSTKEY() eq "FRED") ;
+ # fk sk fv sv
+ ok(29, checkOutput( "FRED", "", "", "")) ;
+
+ # put the original filters back
+ $db->filter_fetch_key ($old_fk);
+ $db->filter_store_key ($old_sk);
+ $db->filter_fetch_value ($old_fv);
+ $db->filter_store_value ($old_sv);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(30, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(31, $h{"fred"} eq "joe");
+ ok(32, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(33, $db->FIRSTKEY() eq "fred") ;
+ ok(34, checkOutput( "fred", "", "", "")) ;
+
+ # delete the filters
+ $db->filter_fetch_key (undef);
+ $db->filter_store_key (undef);
+ $db->filter_fetch_value (undef);
+ $db->filter_store_value (undef);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(35, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(36, $h{"fred"} eq "joe");
+ ok(37, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(38, $db->FIRSTKEY() eq "fred") ;
+ ok(39, checkOutput( "", "", "", "")) ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
+
+{
+ # DBM Filter with a closure
+
+ use strict ;
+ my (%h, $db) ;
+
+ unlink <Op.dbmx*>;
+ ok(40, $db = tie(%h, 'NDBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ my %result = () ;
+
+ sub Closure
+ {
+ my ($name) = @_ ;
+ my $count = 0 ;
+ my @kept = () ;
+
+ return sub { ++$count ;
+ push @kept, $_ ;
+ $result{$name} = "$name - $count: [@kept]" ;
+ }
+ }
+
+ $db->filter_store_key(Closure("store key")) ;
+ $db->filter_store_value(Closure("store value")) ;
+ $db->filter_fetch_key(Closure("fetch key")) ;
+ $db->filter_fetch_value(Closure("fetch value")) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ ok(41, $result{"store key"} eq "store key - 1: [fred]");
+ ok(42, $result{"store value"} eq "store value - 1: [joe]");
+ ok(43, !defined $result{"fetch key"} );
+ ok(44, !defined $result{"fetch value"} );
+ ok(45, $_ eq "original") ;
+
+ ok(46, $db->FIRSTKEY() eq "fred") ;
+ ok(47, $result{"store key"} eq "store key - 1: [fred]");
+ ok(48, $result{"store value"} eq "store value - 1: [joe]");
+ ok(49, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(50, ! defined $result{"fetch value"} );
+ ok(51, $_ eq "original") ;
+
+ $h{"jim"} = "john" ;
+ ok(52, $result{"store key"} eq "store key - 2: [fred jim]");
+ ok(53, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(54, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(55, $result{"fetch value"} eq "");
+ ok(56, $_ eq "original") ;
+
+ ok(57, $h{"fred"} eq "joe");
+ ok(58, $result{"store key"} eq "store key - 3: [fred jim fred]");
+ ok(59, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(60, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(61, $result{"fetch value"} eq "fetch value - 1: [joe]");
+ ok(62, $_ eq "original") ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
+
+{
+ # DBM Filter recursion detection
+ use strict ;
+ my (%h, $db) ;
+ unlink <Op.dbmx*>;
+
+ ok(63, $db = tie(%h, 'NDBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ $db->filter_store_key (sub { $_ = $h{$_} }) ;
+
+ eval '$h{1} = 1234' ;
+ ok(64, $@ =~ /^recursion detected in filter_store_key at/ );
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
diff --git a/contrib/perl5/t/lib/odbm.t b/contrib/perl5/t/lib/odbm.t
index 8ba9bcf..f8b8a11 100755
--- a/contrib/perl5/t/lib/odbm.t
+++ b/contrib/perl5/t/lib/odbm.t
@@ -4,10 +4,10 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bODBM_File\b/) {
- print "1..0\n";
+ print "1..0 # Skip: ODBM_File was not built\n";
exit 0;
}
}
@@ -16,7 +16,7 @@ require ODBM_File;
#If Fcntl is not available, try 0x202 or 0x102 for O_RDWR|O_CREAT
use Fcntl;
-print "1..18\n";
+print "1..64\n";
unlink <Op.dbmx*>;
@@ -205,3 +205,202 @@ EOM
unlink "SubDB.pm", <dbhash.tmp*> ;
}
+
+{
+ # DBM Filter tests
+ use strict ;
+ my (%h, $db) ;
+ my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+
+ sub checkOutput
+ {
+ my($fk, $sk, $fv, $sv) = @_ ;
+ print "# ", join('|', $fetch_key, $fk, $store_key, $sk,
+ $fetch_value, $fv, $store_value, $sv, $_), "\n";
+ return
+ $fetch_key eq $fk && $store_key eq $sk &&
+ $fetch_value eq $fv && $store_value eq $sv &&
+ $_ eq 'original' ;
+ }
+
+ unlink <Op.dbmx*>;
+ ok(19, $db = tie(%h, 'ODBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ $db->filter_fetch_key (sub { $fetch_key = $_ }) ;
+ $db->filter_store_key (sub { $store_key = $_ }) ;
+ $db->filter_fetch_value (sub { $fetch_value = $_}) ;
+ $db->filter_store_value (sub { $store_value = $_ }) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ # fk sk fv sv
+ ok(20, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(21, $h{"fred"} eq "joe");
+ # fk sk fv sv
+ ok(22, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(23, $db->FIRSTKEY() eq "fred") ;
+ # fk sk fv sv
+ ok(24, checkOutput( "fred", "", "", "")) ;
+
+ # replace the filters, but remember the previous set
+ my ($old_fk) = $db->filter_fetch_key
+ (sub { $_ = uc $_ ; $fetch_key = $_ }) ;
+ my ($old_sk) = $db->filter_store_key
+ (sub { $_ = lc $_ ; $store_key = $_ }) ;
+ my ($old_fv) = $db->filter_fetch_value
+ (sub { $_ = "[$_]"; $fetch_value = $_ }) ;
+ my ($old_sv) = $db->filter_store_value
+ (sub { s/o/x/g; $store_value = $_ }) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"Fred"} = "Joe" ;
+ # fk sk fv sv
+ ok(25, checkOutput( "", "fred", "", "Jxe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(26, $h{"Fred"} eq "[Jxe]");
+ # fk sk fv sv
+ ok(27, checkOutput( "", "fred", "[Jxe]", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(28, $db->FIRSTKEY() eq "FRED") ;
+ # fk sk fv sv
+ ok(29, checkOutput( "FRED", "", "", "")) ;
+
+ # put the original filters back
+ $db->filter_fetch_key ($old_fk);
+ $db->filter_store_key ($old_sk);
+ $db->filter_fetch_value ($old_fv);
+ $db->filter_store_value ($old_sv);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(30, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(31, $h{"fred"} eq "joe");
+ ok(32, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(33, $db->FIRSTKEY() eq "fred") ;
+ ok(34, checkOutput( "fred", "", "", "")) ;
+
+ # delete the filters
+ $db->filter_fetch_key (undef);
+ $db->filter_store_key (undef);
+ $db->filter_fetch_value (undef);
+ $db->filter_store_value (undef);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(35, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(36, $h{"fred"} eq "joe");
+ ok(37, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(38, $db->FIRSTKEY() eq "fred") ;
+ ok(39, checkOutput( "", "", "", "")) ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
+
+{
+ # DBM Filter with a closure
+
+ use strict ;
+ my (%h, $db) ;
+
+ unlink <Op.dbmx*>;
+ ok(40, $db = tie(%h, 'ODBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ my %result = () ;
+
+ sub Closure
+ {
+ my ($name) = @_ ;
+ my $count = 0 ;
+ my @kept = () ;
+
+ return sub { ++$count ;
+ push @kept, $_ ;
+ $result{$name} = "$name - $count: [@kept]" ;
+ }
+ }
+
+ $db->filter_store_key(Closure("store key")) ;
+ $db->filter_store_value(Closure("store value")) ;
+ $db->filter_fetch_key(Closure("fetch key")) ;
+ $db->filter_fetch_value(Closure("fetch value")) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ ok(41, $result{"store key"} eq "store key - 1: [fred]");
+ ok(42, $result{"store value"} eq "store value - 1: [joe]");
+ ok(43, !defined $result{"fetch key"} );
+ ok(44, !defined $result{"fetch value"} );
+ ok(45, $_ eq "original") ;
+
+ ok(46, $db->FIRSTKEY() eq "fred") ;
+ ok(47, $result{"store key"} eq "store key - 1: [fred]");
+ ok(48, $result{"store value"} eq "store value - 1: [joe]");
+ ok(49, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(50, ! defined $result{"fetch value"} );
+ ok(51, $_ eq "original") ;
+
+ $h{"jim"} = "john" ;
+ ok(52, $result{"store key"} eq "store key - 2: [fred jim]");
+ ok(53, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(54, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(55, $result{"fetch value"} eq "");
+ ok(56, $_ eq "original") ;
+
+ ok(57, $h{"fred"} eq "joe");
+ ok(58, $result{"store key"} eq "store key - 3: [fred jim fred]");
+ ok(59, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(60, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(61, $result{"fetch value"} eq "fetch value - 1: [joe]");
+ ok(62, $_ eq "original") ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
+
+{
+ # DBM Filter recursion detection
+ use strict ;
+ my (%h, $db) ;
+ unlink <Op.dbmx*>;
+
+ ok(63, $db = tie(%h, 'ODBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ $db->filter_store_key (sub { $_ = $h{$_} }) ;
+
+ eval '$h{1} = 1234' ;
+ ok(64, $@ =~ /^recursion detected in filter_store_key at/ );
+
+ undef $db ;
+ untie %h;
+ unlink <Op.dbmx*>;
+}
+
+if ($^O eq 'hpux') {
+ print <<EOM;
+#
+# If you experience failures with the odbm test in HP-UX,
+# this is a well-known bug that's unfortunately very hard to fix.
+# The suggested course of action is to avoid using the ODBM_File,
+# but to use instead the NDBM_File extension.
+#
+EOM
+}
diff --git a/contrib/perl5/t/lib/opcode.t b/contrib/perl5/t/lib/opcode.t
index a785fce..f83a689 100755
--- a/contrib/perl5/t/lib/opcode.t
+++ b/contrib/perl5/t/lib/opcode.t
@@ -4,7 +4,7 @@ $|=1;
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
print "1..0\n";
diff --git a/contrib/perl5/t/lib/open2.t b/contrib/perl5/t/lib/open2.t
index 85b807c..6443112 100755
--- a/contrib/perl5/t/lib/open2.t
+++ b/contrib/perl5/t/lib/open2.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if (!$Config{'d_fork'}
# open2/3 supported on win32 (but not Borland due to CRT bugs)
diff --git a/contrib/perl5/t/lib/open3.t b/contrib/perl5/t/lib/open3.t
index b84dac9..7cd0ca3 100755
--- a/contrib/perl5/t/lib/open3.t
+++ b/contrib/perl5/t/lib/open3.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if (!$Config{'d_fork'}
# open2/3 supported on win32 (but not Borland due to CRT bugs)
@@ -49,7 +49,7 @@ my ($pid, $reaped_pid);
STDOUT->autoflush;
STDERR->autoflush;
-print "1..21\n";
+print "1..22\n";
# basic
ok 1, $pid = open3 'WRITE', 'READ', 'ERROR', $perl, '-e', cmd_line(<<'EOF');
@@ -134,3 +134,17 @@ EOF
print WRITE "ok 20\n";
print WRITE "ok 21\n";
waitpid $pid, 0;
+
+# command line in single parameter variant of open3
+# for understanding of Config{'sh'} test see exec description in camel book
+my $cmd = 'print(scalar(<STDIN>))';
+$cmd = $Config{'sh'} =~ /sh/ ? "'$cmd'" : cmd_line($cmd);
+eval{$pid = open3 'WRITE', '>&STDOUT', 'ERROR', "$perl -e " . $cmd; };
+if ($@) {
+ print "error $@\n";
+ print "not ok 22\n";
+}
+else {
+ print WRITE "ok 22\n";
+ waitpid $pid, 0;
+}
diff --git a/contrib/perl5/t/lib/ops.t b/contrib/perl5/t/lib/ops.t
index 56b1bac..ce8b6d0 100755
--- a/contrib/perl5/t/lib/ops.t
+++ b/contrib/perl5/t/lib/ops.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
print "1..0\n";
diff --git a/contrib/perl5/t/lib/parsewords.t b/contrib/perl5/t/lib/parsewords.t
index 3c5e75b..2c936f1 100755
--- a/contrib/perl5/t/lib/parsewords.t
+++ b/contrib/perl5/t/lib/parsewords.t
@@ -2,9 +2,10 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
+use warnings;
use Text::ParseWords;
print "1..18\n";
@@ -17,15 +18,15 @@ print "ok 2\n";
print "not " if $words[2] ne 'zoo';
print "ok 3\n";
-# Gonna get some undefined things back
-local($^W) = 0;
+{
+ # Gonna get some undefined things back
+ no warnings 'uninitialized' ;
-# Test quotewords() with other parameters and null last field
-@words = quotewords(':+', 1, 'foo:::"bar:foo":zoo zoo:');
-print "not " unless join(";", @words) eq qq(foo;"bar:foo";zoo zoo;);
-print "ok 4\n";
-
-$^W = 1;
+ # Test quotewords() with other parameters and null last field
+ @words = quotewords(':+', 1, 'foo:::"bar:foo":zoo zoo:');
+ print "not " unless join(";", @words) eq qq(foo;"bar:foo";zoo zoo;);
+ print "ok 4\n";
+}
# Test $keep eq 'delimiters' and last field zero
@words = quotewords('\s+', 'delimiters', '4 3 2 1 0');
@@ -71,29 +72,30 @@ print "ok 11\n";
print "not " if (@words);
print "ok 12\n";
-# Gonna get some more undefined things back
-$^W = 0;
+{
+ # Gonna get some more undefined things back
+ no warnings 'uninitialized' ;
-@words = nested_quotewords('s+', 0, $string);
-print "not " if (@words);
-print "ok 13\n";
+ @words = nested_quotewords('s+', 0, $string);
+ print "not " if (@words);
+ print "ok 13\n";
-# Now test empty fields
-$result = join('|', parse_line(':', 0, 'foo::0:"":::'));
-print "not " unless ($result eq 'foo||0||||');
-print "ok 14\n";
+ # Now test empty fields
+ $result = join('|', parse_line(':', 0, 'foo::0:"":::'));
+ print "not " unless ($result eq 'foo||0||||');
+ print "ok 14\n";
-# Test for 0 in quotes without $keep
-$result = join('|', parse_line(':', 0, ':"0":'));
-print "not " unless ($result eq '|0|');
-print "ok 15\n";
+ # Test for 0 in quotes without $keep
+ $result = join('|', parse_line(':', 0, ':"0":'));
+ print "not " unless ($result eq '|0|');
+ print "ok 15\n";
-# Test for \001 in quoted string
-$result = join('|', parse_line(':', 0, ':"' . "\001" . '":'));
-print "not " unless ($result eq "|\1|");
-print "ok 16\n";
+ # Test for \001 in quoted string
+ $result = join('|', parse_line(':', 0, ':"' . "\001" . '":'));
+ print "not " unless ($result eq "|\1|");
+ print "ok 16\n";
-$^W = 1;
+}
# Now test perlish single quote behavior
$Text::ParseWords::PERL_SINGLE_QUOTE = 1;
diff --git a/contrib/perl5/t/lib/ph.t b/contrib/perl5/t/lib/ph.t
index de27dee..dd24c79 100755
--- a/contrib/perl5/t/lib/ph.t
+++ b/contrib/perl5/t/lib/ph.t
@@ -6,7 +6,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
# All the constants which Socket.pm tries to make available:
diff --git a/contrib/perl5/t/lib/posix.t b/contrib/perl5/t/lib/posix.t
index f6d8e92..abc4563 100755
--- a/contrib/perl5/t/lib/posix.t
+++ b/contrib/perl5/t/lib/posix.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($^O ne 'VMS' and $Config{'extensions'} !~ /\bPOSIX\b/) {
print "1..0\n";
@@ -14,7 +14,7 @@ use POSIX qw(fcntl_h signal_h limits_h _exit getcwd open read strftime write);
use strict subs;
$| = 1;
-print "1..18\n";
+print "1..27\n";
$Is_W32 = $^O eq 'MSWin32';
@@ -72,6 +72,9 @@ print getcwd() =~ m#/t$# ? "ok 13\n" : "not ok 13\n";
if ($Config{d_strtod}) {
$lc = &POSIX::setlocale(&POSIX::LC_NUMERIC, 'C') if $Config{d_setlocale};
($n, $x) = &POSIX::strtod('3.14159_OR_SO');
+# Using long double NVs may introduce greater accuracy than wanted.
+ $n =~ s/^3.14158999\d*$/3.14159/
+ if $Config{uselongdouble} eq 'define';
print (($n == 3.14159) && ($x == 6) ? "ok 14\n" : "not ok 14\n");
&POSIX::setlocale(&POSIX::LC_NUMERIC, $lc) if $Config{d_setlocale};
} else { print "# strtod not present\n", "ok 14\n"; }
@@ -95,6 +98,32 @@ print &POSIX::acos(1.0) == 0.0 ? "ok 17\n" : "not ok 17\n";
# See ext/POSIX/hints/sunos_4.pl and ext/POSIX/hints/linux.pl
print POSIX::strftime("ok 18 # %H:%M, on %D\n", localtime());
+# If that worked, validate the mini_mktime() routine's normalisation of
+# input fields to strftime().
+sub try_strftime {
+ my $num = shift;
+ my $expect = shift;
+ my $got = POSIX::strftime("%a %b %d %H:%M:%S %Y %j", @_);
+ if ($got eq $expect) {
+ print "ok $num\n";
+ }
+ else {
+ print "# expected: $expect\n# got: $got\nnot ok $num\n";
+ }
+}
+
+$lc = &POSIX::setlocale(&POSIX::LC_TIME, 'C') if $Config{d_setlocale};
+try_strftime(19, "Wed Feb 28 00:00:00 1996 059", 0,0,0, 28,1,96);
+try_strftime(20, "Thu Feb 29 00:00:60 1996 060", 60,0,-24, 30,1,96);
+try_strftime(21, "Fri Mar 01 00:00:00 1996 061", 0,0,-24, 31,1,96);
+try_strftime(22, "Sun Feb 28 00:00:00 1999 059", 0,0,0, 28,1,99);
+try_strftime(23, "Mon Mar 01 00:00:00 1999 060", 0,0,24, 28,1,99);
+try_strftime(24, "Mon Feb 28 00:00:00 2000 059", 0,0,0, 28,1,100);
+try_strftime(25, "Tue Feb 29 00:00:00 2000 060", 0,0,0, 0,2,100);
+try_strftime(26, "Wed Mar 01 00:00:00 2000 061", 0,0,0, 1,2,100);
+try_strftime(27, "Fri Mar 31 00:00:00 2000 091", 0,0,0, 31,2,100);
+&POSIX::setlocale(&POSIX::LC_TIME, $lc) if $Config{d_setlocale};
+
$| = 0;
# The following line assumes buffered output, which may be not true with EMX:
print '@#!*$@(!@#$' unless ($^O eq 'os2' || $^O eq 'uwin' || $^O eq 'os390');
diff --git a/contrib/perl5/t/lib/safe1.t b/contrib/perl5/t/lib/safe1.t
index 27993d9..6e12873 100755
--- a/contrib/perl5/t/lib/safe1.t
+++ b/contrib/perl5/t/lib/safe1.t
@@ -2,7 +2,7 @@
$|=1;
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
print "1..0\n";
diff --git a/contrib/perl5/t/lib/safe2.t b/contrib/perl5/t/lib/safe2.t
index 6afc117..293b515 100755
--- a/contrib/perl5/t/lib/safe2.t
+++ b/contrib/perl5/t/lib/safe2.t
@@ -2,7 +2,7 @@
$|=1;
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
print "1..0\n";
@@ -10,6 +10,7 @@ BEGIN {
}
# test 30 rather naughtily expects English error messages
$ENV{'LC_ALL'} = 'C';
+ $ENV{LANGUAGE} = 'C'; # GNU locale extension
}
# Tests Todo:
@@ -65,7 +66,7 @@ $glob = "ok 11\n";
sub sayok { print "ok @_\n" }
$cpt->share(qw($foo %bar @baz *glob sayok));
-$cpt->share('$"') unless $Config{archname} =~ /-thread$/;
+$cpt->share('$"') unless $Config{use5005threads};
$cpt->reval(q{
package other;
@@ -123,7 +124,7 @@ print $@ =~ /foo bar/ ? "ok 29\n" : "not ok 29\n";
my $t = 30;
$cpt->rdo('/non/existant/file.name');
# The regexp is getting rather baroque.
-print $! =~ /No such file|file specification syntax error|A file or directory in the path name does not exist|Invalid argument|Device not configured|file not found/i ? "ok $t\n" : "not ok $t # $!\n"; $t++;
+print $! =~ /cannot find|No such file|file specification syntax error|A file or directory in the path name does not exist|Invalid argument|Device not configured|file not found|File or directory doesn't exist/i ? "ok $t\n" : "not ok $t # $!\n"; $t++;
# test #31 is gone.
print 1 ? "ok $t\n" : "not ok $t\n#$@/$!\n"; $t++;
diff --git a/contrib/perl5/t/lib/sdbm.t b/contrib/perl5/t/lib/sdbm.t
index 591fe14..2689d19 100755
--- a/contrib/perl5/t/lib/sdbm.t
+++ b/contrib/perl5/t/lib/sdbm.t
@@ -4,7 +4,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
if (($Config{'extensions'} !~ /\bSDBM_File\b/) && ($^O ne 'VMS')){
print "1..0\n";
@@ -15,7 +15,7 @@ require SDBM_File;
#If Fcntl is not available, try 0x202 or 0x102 for O_RDWR|O_CREAT
use Fcntl;
-print "1..18\n";
+print "1..66\n";
unlink <Op_dbmx.*>;
@@ -122,13 +122,6 @@ print join(':',200..400) eq join(':',@foo) ? "ok 10\n" : "not ok 10\n";
print ($h{'foo'} eq '' ? "ok 11\n" : "not ok 11\n");
print ($h{''} eq 'bar' ? "ok 12\n" : "not ok 12\n");
-untie %h;
-if ($^O eq 'VMS') {
- unlink 'Op_dbmx.sdbm_dir', $Dfile;
-} else {
- unlink 'Op_dbmx.dir', $Dfile;
-}
-
sub ok
{
@@ -210,3 +203,196 @@ EOM
unlink "SubDB.pm", <dbhash_tmp.*> ;
}
+
+ok(19, !exists $h{'goner1'});
+ok(20, exists $h{'foo'});
+
+untie %h;
+unlink <Op_dbmx*>, $Dfile;
+
+{
+ # DBM Filter tests
+ use strict ;
+ my (%h, $db) ;
+ my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+
+ sub checkOutput
+ {
+ my($fk, $sk, $fv, $sv) = @_ ;
+ return
+ $fetch_key eq $fk && $store_key eq $sk &&
+ $fetch_value eq $fv && $store_value eq $sv &&
+ $_ eq 'original' ;
+ }
+
+ unlink <Op_dbmx*>;
+ ok(21, $db = tie(%h, 'SDBM_File','Op_dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ $db->filter_fetch_key (sub { $fetch_key = $_ }) ;
+ $db->filter_store_key (sub { $store_key = $_ }) ;
+ $db->filter_fetch_value (sub { $fetch_value = $_}) ;
+ $db->filter_store_value (sub { $store_value = $_ }) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ # fk sk fv sv
+ ok(22, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(23, $h{"fred"} eq "joe");
+ # fk sk fv sv
+ ok(24, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(25, $db->FIRSTKEY() eq "fred") ;
+ # fk sk fv sv
+ ok(26, checkOutput( "fred", "", "", "")) ;
+
+ # replace the filters, but remember the previous set
+ my ($old_fk) = $db->filter_fetch_key
+ (sub { $_ = uc $_ ; $fetch_key = $_ }) ;
+ my ($old_sk) = $db->filter_store_key
+ (sub { $_ = lc $_ ; $store_key = $_ }) ;
+ my ($old_fv) = $db->filter_fetch_value
+ (sub { $_ = "[$_]"; $fetch_value = $_ }) ;
+ my ($old_sv) = $db->filter_store_value
+ (sub { s/o/x/g; $store_value = $_ }) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"Fred"} = "Joe" ;
+ # fk sk fv sv
+ ok(27, checkOutput( "", "fred", "", "Jxe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(28, $h{"Fred"} eq "[Jxe]");
+ # fk sk fv sv
+ ok(29, checkOutput( "", "fred", "[Jxe]", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(30, $db->FIRSTKEY() eq "FRED") ;
+ # fk sk fv sv
+ ok(31, checkOutput( "FRED", "", "", "")) ;
+
+ # put the original filters back
+ $db->filter_fetch_key ($old_fk);
+ $db->filter_store_key ($old_sk);
+ $db->filter_fetch_value ($old_fv);
+ $db->filter_store_value ($old_sv);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(32, checkOutput( "", "fred", "", "joe")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(33, $h{"fred"} eq "joe");
+ ok(34, checkOutput( "", "fred", "joe", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(35, $db->FIRSTKEY() eq "fred") ;
+ ok(36, checkOutput( "fred", "", "", "")) ;
+
+ # delete the filters
+ $db->filter_fetch_key (undef);
+ $db->filter_store_key (undef);
+ $db->filter_fetch_value (undef);
+ $db->filter_store_value (undef);
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ $h{"fred"} = "joe" ;
+ ok(37, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(38, $h{"fred"} eq "joe");
+ ok(39, checkOutput( "", "", "", "")) ;
+
+ ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ;
+ ok(40, $db->FIRSTKEY() eq "fred") ;
+ ok(41, checkOutput( "", "", "", "")) ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op_dbmx*>;
+}
+
+{
+ # DBM Filter with a closure
+
+ use strict ;
+ my (%h, $db) ;
+
+ unlink <Op_dbmx*>;
+ ok(42, $db = tie(%h, 'SDBM_File','Op_dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ my %result = () ;
+
+ sub Closure
+ {
+ my ($name) = @_ ;
+ my $count = 0 ;
+ my @kept = () ;
+
+ return sub { ++$count ;
+ push @kept, $_ ;
+ $result{$name} = "$name - $count: [@kept]" ;
+ }
+ }
+
+ $db->filter_store_key(Closure("store key")) ;
+ $db->filter_store_value(Closure("store value")) ;
+ $db->filter_fetch_key(Closure("fetch key")) ;
+ $db->filter_fetch_value(Closure("fetch value")) ;
+
+ $_ = "original" ;
+
+ $h{"fred"} = "joe" ;
+ ok(43, $result{"store key"} eq "store key - 1: [fred]");
+ ok(44, $result{"store value"} eq "store value - 1: [joe]");
+ ok(45, !defined $result{"fetch key"} );
+ ok(46, !defined $result{"fetch value"} );
+ ok(47, $_ eq "original") ;
+
+ ok(48, $db->FIRSTKEY() eq "fred") ;
+ ok(49, $result{"store key"} eq "store key - 1: [fred]");
+ ok(50, $result{"store value"} eq "store value - 1: [joe]");
+ ok(51, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(52, ! defined $result{"fetch value"} );
+ ok(53, $_ eq "original") ;
+
+ $h{"jim"} = "john" ;
+ ok(54, $result{"store key"} eq "store key - 2: [fred jim]");
+ ok(55, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(56, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(57, $result{"fetch value"} eq "");
+ ok(58, $_ eq "original") ;
+
+ ok(59, $h{"fred"} eq "joe");
+ ok(60, $result{"store key"} eq "store key - 3: [fred jim fred]");
+ ok(61, $result{"store value"} eq "store value - 2: [joe john]");
+ ok(62, $result{"fetch key"} eq "fetch key - 1: [fred]");
+ ok(63, $result{"fetch value"} eq "fetch value - 1: [joe]");
+ ok(64, $_ eq "original") ;
+
+ undef $db ;
+ untie %h;
+ unlink <Op_dbmx*>;
+}
+
+{
+ # DBM Filter recursion detection
+ use strict ;
+ my (%h, $db) ;
+ unlink <Op_dbmx*>;
+
+ ok(65, $db = tie(%h, 'SDBM_File','Op_dbmx', O_RDWR|O_CREAT, 0640)) ;
+
+ $db->filter_store_key (sub { $_ = $h{$_} }) ;
+
+ eval '$h{1} = 1234' ;
+ ok(66, $@ =~ /^recursion detected in filter_store_key at/ );
+
+ undef $db ;
+ untie %h;
+ unlink <Op_dbmx*>;
+}
+
diff --git a/contrib/perl5/t/lib/searchdict.t b/contrib/perl5/t/lib/searchdict.t
index c36fdb8..46cea39 100755
--- a/contrib/perl5/t/lib/searchdict.t
+++ b/contrib/perl5/t/lib/searchdict.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..4\n";
diff --git a/contrib/perl5/t/lib/selectsaver.t b/contrib/perl5/t/lib/selectsaver.t
index 3b58d70..677caec 100755
--- a/contrib/perl5/t/lib/selectsaver.t
+++ b/contrib/perl5/t/lib/selectsaver.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..3\n";
diff --git a/contrib/perl5/t/lib/socket.t b/contrib/perl5/t/lib/socket.t
index 4e38295..d5e1848 100755
--- a/contrib/perl5/t/lib/socket.t
+++ b/contrib/perl5/t/lib/socket.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
require Config; import Config;
if ($Config{'extensions'} !~ /\bSocket\b/ &&
!(($^O eq 'VMS') && $Config{d_socket})) {
@@ -13,7 +13,7 @@ BEGIN {
use Socket;
-print "1..6\n";
+print "1..8\n";
if (socket(T,PF_INET,SOCK_STREAM,6)) {
print "ok 1\n";
@@ -74,3 +74,14 @@ else {
print "# $!\n";
print "not ok 4\n";
}
+
+# warnings
+$SIG{__WARN__} = sub {
+ ++ $w if $_[0] =~ /^6-ARG sockaddr_in call is deprecated/ ;
+} ;
+$w = 0 ;
+sockaddr_in(1,2,3,4,5,6) ;
+print ($w == 1 ? "not ok 7\n" : "ok 7\n") ;
+use warnings 'Socket' ;
+sockaddr_in(1,2,3,4,5,6) ;
+print ($w == 1 ? "ok 8\n" : "not ok 8\n") ;
diff --git a/contrib/perl5/t/lib/soundex.t b/contrib/perl5/t/lib/soundex.t
index d35f264..a04cccd 100755
--- a/contrib/perl5/t/lib/soundex.t
+++ b/contrib/perl5/t/lib/soundex.t
@@ -18,7 +18,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Text::Soundex;
diff --git a/contrib/perl5/t/lib/symbol.t b/contrib/perl5/t/lib/symbol.t
index 03449a3..14c919c 100755
--- a/contrib/perl5/t/lib/symbol.t
+++ b/contrib/perl5/t/lib/symbol.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..8\n";
diff --git a/contrib/perl5/t/lib/syslfs.t b/contrib/perl5/t/lib/syslfs.t
new file mode 100755
index 0000000..2857120
--- /dev/null
+++ b/contrib/perl5/t/lib/syslfs.t
@@ -0,0 +1,221 @@
+# NOTE: this file tests how large files (>2GB) work with raw system IO.
+# stdio: open(), tell(), seek(), print(), read() is tested in t/op/lfs.t.
+# If you modify/add tests here, remember to update also t/op/lfs.t.
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ require Config; import Config;
+ # Don't bother if there are no quad offsets.
+ if ($Config{lseeksize} < 8) {
+ print "1..0\n# no 64-bit file offsets\n";
+ exit(0);
+ }
+ require Fcntl; import Fcntl qw(/^O_/ /^SEEK_/);
+}
+
+sub zap {
+ close(BIG);
+ unlink("big");
+ unlink("big1");
+ unlink("big2");
+}
+
+sub bye {
+ zap();
+ exit(0);
+}
+
+sub explain {
+ print <<EOM;
+#
+# If the lfs (large file support: large meaning larger than two gigabytes)
+# tests are skipped or fail, it may mean either that your process
+# (or process group) is not allowed to write large files (resource
+# limits) or that the file system you are running the tests on doesn't
+# let your user/group have large files (quota) or the filesystem simply
+# doesn't support large files. You may even need to reconfigure your kernel.
+# (This is all very operating system and site-dependent.)
+#
+# Perl may still be able to support large files, once you have
+# such a process, enough quota, and such a (file) system.
+#
+EOM
+}
+
+print "# checking whether we have sparse files...\n";
+
+# Known have-nots.
+if ($^O eq 'win32' || $^O eq 'vms') {
+ print "1..0\n# no sparse files (because this is $^O) \n";
+ bye();
+}
+
+# Known haves that have problems running this test
+# (for example because they do not support sparse files, like UNICOS)
+if ($^O eq 'unicos') {
+ print "1..0\n# large files known to work but unable to test them here ($^O)\n";
+ bye();
+}
+
+# Then try heuristically to deduce whether we have sparse files.
+
+# We'll start off by creating a one megabyte file which has
+# only three "true" bytes. If we have sparseness, we should
+# consume less blocks than one megabyte (assuming nobody has
+# one megabyte blocks...)
+
+sysopen(BIG, "big1", O_WRONLY|O_CREAT|O_TRUNC) or
+ do { warn "sysopen big1 failed: $!\n"; bye };
+sysseek(BIG, 1_000_000, SEEK_SET) or
+ do { warn "sysseek big1 failed: $!\n"; bye };
+syswrite(BIG, "big") or
+ do { warn "syswrite big1 failed; $!\n"; bye };
+close(BIG) or
+ do { warn "close big1 failed: $!\n"; bye };
+
+my @s1 = stat("big1");
+
+print "# s1 = @s1\n";
+
+sysopen(BIG, "big2", O_WRONLY|O_CREAT|O_TRUNC) or
+ do { warn "sysopen big2 failed: $!\n"; bye };
+sysseek(BIG, 2_000_000, SEEK_SET) or
+ do { warn "sysseek big2 failed: $!\n"; bye };
+syswrite(BIG, "big") or
+ do { warn "syswrite big2 failed; $!\n"; bye };
+close(BIG) or
+ do { warn "close big2 failed: $!\n"; bye };
+
+my @s2 = stat("big2");
+
+print "# s2 = @s2\n";
+
+zap();
+
+unless ($s1[7] == 1_000_003 && $s2[7] == 2_000_003 &&
+ $s1[11] == $s2[11] && $s1[12] == $s2[12]) {
+ print "1..0\n#no sparse files?\n";
+ bye;
+}
+
+print "# we seem to have sparse files...\n";
+
+# By now we better be sure that we do have sparse files:
+# if we are not, the following will hog 5 gigabytes of disk. Ooops.
+
+$ENV{LC_ALL} = "C";
+
+sysopen(BIG, "big", O_WRONLY|O_CREAT|O_TRUNC) or
+ do { warn "sysopen 'big' failed: $!\n"; bye };
+my $sysseek = sysseek(BIG, 5_000_000_000, SEEK_SET);
+unless (defined $sysseek && $sysseek == 5_000_000_000) {
+ print "1..0\n# seeking past 2GB failed: $! (sysseek returned ",
+ defined $sysseek ? $sysseek : 'undef', ")\n";
+ explain();
+ bye();
+}
+
+# The syswrite will fail if there are are filesize limitations (process or fs).
+my $syswrite = syswrite(BIG, "big");
+print "# syswrite failed: $! (syswrite returned ",
+ defined $syswrite ? $syswrite : 'undef', ")\n"
+ unless defined $syswrite && $syswrite == 3;
+my $close = close BIG;
+print "# close failed: $!\n" unless $close;
+unless($syswrite && $close) {
+ if ($! =~/too large/i) {
+ print "1..0\n# writing past 2GB failed: process limits?\n";
+ } elsif ($! =~ /quota/i) {
+ print "1..0\n# filesystem quota limits?\n";
+ }
+ explain();
+ bye();
+}
+
+@s = stat("big");
+
+print "# @s\n";
+
+unless ($s[7] == 5_000_000_003) {
+ print "1..0\n# not configured to use large files?\n";
+ explain();
+ bye();
+}
+
+sub fail () {
+ print "not ";
+ $fail++;
+}
+
+print "1..17\n";
+
+my $fail = 0;
+
+fail unless $s[7] == 5_000_000_003; # exercizes pp_stat
+print "ok 1\n";
+
+fail unless -s "big" == 5_000_000_003; # exercizes pp_ftsize
+print "ok 2\n";
+
+fail unless -e "big";
+print "ok 3\n";
+
+fail unless -f "big";
+print "ok 4\n";
+
+sysopen(BIG, "big", O_RDONLY) or do { warn "sysopen failed: $!\n"; bye };
+
+fail unless sysseek(BIG, 4_500_000_000, SEEK_SET) == 4_500_000_000;
+print "ok 5\n";
+
+fail unless sysseek(BIG, 0, SEEK_CUR) == 4_500_000_000;
+print "ok 6\n";
+
+fail unless sysseek(BIG, 1, SEEK_CUR) == 4_500_000_001;
+print "ok 7\n";
+
+fail unless sysseek(BIG, 0, SEEK_CUR) == 4_500_000_001;
+print "ok 8\n";
+
+fail unless sysseek(BIG, -1, SEEK_CUR) == 4_500_000_000;
+print "ok 9\n";
+
+fail unless sysseek(BIG, 0, SEEK_CUR) == 4_500_000_000;
+print "ok 10\n";
+
+fail unless sysseek(BIG, -3, SEEK_END) == 5_000_000_000;
+print "ok 11\n";
+
+fail unless sysseek(BIG, 0, SEEK_CUR) == 5_000_000_000;
+print "ok 12\n";
+
+my $big;
+
+fail unless sysread(BIG, $big, 3) == 3;
+print "ok 13\n";
+
+fail unless $big eq "big";
+print "ok 14\n";
+
+# 705_032_704 = (I32)5_000_000_000
+fail unless seek(BIG, 705_032_704, SEEK_SET);
+print "ok 15\n";
+
+my $zero;
+
+fail unless read(BIG, $zero, 3) == 3;
+print "ok 16\n";
+
+fail unless $zero eq "\0\0\0";
+print "ok 17\n";
+
+explain if $fail;
+
+bye(); # does the necessary cleanup
+
+END {
+ unlink "big"; # be paranoid about leaving 5 gig files lying around
+}
+
+# eof
diff --git a/contrib/perl5/t/lib/textfill.t b/contrib/perl5/t/lib/textfill.t
index 19add69..daeee23 100755
--- a/contrib/perl5/t/lib/textfill.t
+++ b/contrib/perl5/t/lib/textfill.t
@@ -2,9 +2,11 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
+use Text::Wrap qw(&fill);
+
@tests = (split(/\nEND\n/s, <<DONE));
TEST1
Cyberdog Information
diff --git a/contrib/perl5/t/lib/texttabs.t b/contrib/perl5/t/lib/texttabs.t
index ea9012c..80395f4 100755
--- a/contrib/perl5/t/lib/texttabs.t
+++ b/contrib/perl5/t/lib/texttabs.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
print "1..3\n";
diff --git a/contrib/perl5/t/lib/textwrap.t b/contrib/perl5/t/lib/textwrap.t
index c3a455b..bb1d5ca 100755
--- a/contrib/perl5/t/lib/textwrap.t
+++ b/contrib/perl5/t/lib/textwrap.t
@@ -2,8 +2,9 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
+use Text::Wrap qw(&wrap);
@tests = (split(/\nEND\n/s, <<DONE));
TEST1
diff --git a/contrib/perl5/t/lib/thr5005.t b/contrib/perl5/t/lib/thr5005.t
new file mode 100755
index 0000000..6b3c800
--- /dev/null
+++ b/contrib/perl5/t/lib/thr5005.t
@@ -0,0 +1,118 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ require Config; import Config;
+ if (! $Config{'use5005threads'}) {
+ print "1..0 # Skip: not use5005threads\n";
+ exit 0;
+ }
+
+ # XXX known trouble with global destruction
+ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
+}
+$| = 1;
+print "1..21\n";
+use Thread 'yield';
+print "ok 1\n";
+
+sub content
+{
+ print shift;
+ return shift;
+}
+
+# create a thread passing args and immedaietly wait for it.
+my $t = new Thread \&content,("ok 2\n","ok 3\n", 1..1000);
+print $t->join;
+
+# check that lock works ...
+{lock $foo;
+ $t = new Thread sub { lock $foo; print "ok 5\n" };
+ print "ok 4\n";
+}
+$t->join;
+
+sub dorecurse
+{
+ my $val = shift;
+ my $ret;
+ print $val;
+ if (@_)
+ {
+ $ret = Thread->new(\&dorecurse, @_);
+ $ret->join;
+ }
+}
+
+$t = new Thread \&dorecurse, map { "ok $_\n" } 6..10;
+$t->join;
+
+# test that sleep lets other thread run
+$t = new Thread \&dorecurse,"ok 11\n";
+sleep 6;
+print "ok 12\n";
+$t->join;
+
+sub islocked : locked {
+ my $val = shift;
+ my $ret;
+ print $val;
+ if (@_)
+ {
+ $ret = Thread->new(\&islocked, shift);
+ }
+ $ret;
+}
+
+$t = Thread->new(\&islocked, "ok 13\n", "ok 14\n");
+$t->join->join;
+
+{
+ package Loch::Ness;
+ sub new { bless [], shift }
+ sub monster : locked : method {
+ my($s, $m) = @_;
+ print "ok $m\n";
+ }
+ sub gollum { &monster }
+}
+Loch::Ness->monster(15);
+Loch::Ness->new->monster(16);
+Loch::Ness->gollum(17);
+Loch::Ness->new->gollum(18);
+
+my $short = "This is a long string that goes on and on.";
+my $shorte = " a long string that goes on and on.";
+my $long = "This is short.";
+my $longe = " short.";
+my $thr1 = new Thread \&threaded, $short, $shorte, "19";
+my $thr2 = new Thread \&threaded, $long, $longe, "20";
+
+sub threaded {
+ my ($string, $string_end, $testno) = @_;
+
+ # Do the match, saving the output in appropriate variables
+ $string =~ /(.*)(is)(.*)/;
+ # Yield control, allowing the other thread to fill in the match variables
+ yield();
+ # Examine the match variable contents; on broken perls this fails
+ if ($3 eq $string_end) {
+ print "ok $testno\n";
+ }
+ else {
+ warn <<EOT;
+
+#
+# This is a KNOWN FAILURE, and one of the reasons why threading
+# is still an experimental feature. It is here to stop people
+# from deploying threads in production. ;-)
+#
+EOT
+ print "not ok $testno # other thread filled in match variables\n";
+ }
+}
+$thr1->join;
+$thr2->join;
+print "ok 21\n";
diff --git a/contrib/perl5/t/lib/tie-push.t b/contrib/perl5/t/lib/tie-push.t
index dd718de..23a0a94 100755
--- a/contrib/perl5/t/lib/tie-push.t
+++ b/contrib/perl5/t/lib/tie-push.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
{
@@ -21,4 +21,4 @@ tie @x,Basic;
tie @get,Basic;
tie @got,Basic;
tie @tests,Basic;
-require "../t/op/push.t"
+require "op/push.t"
diff --git a/contrib/perl5/t/lib/tie-stdarray.t b/contrib/perl5/t/lib/tie-stdarray.t
index 7ca4d76..5a678a5 100755
--- a/contrib/perl5/t/lib/tie-stdarray.t
+++ b/contrib/perl5/t/lib/tie-stdarray.t
@@ -2,11 +2,11 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Tie::Array;
tie @foo,Tie::StdArray;
tie @ary,Tie::StdArray;
tie @bar,Tie::StdArray;
-require "../t/op/array.t"
+require "op/array.t"
diff --git a/contrib/perl5/t/lib/tie-stdhandle.t b/contrib/perl5/t/lib/tie-stdhandle.t
new file mode 100755
index 0000000..cf3a183
--- /dev/null
+++ b/contrib/perl5/t/lib/tie-stdhandle.t
@@ -0,0 +1,47 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+use Tie::Handle;
+tie *tst,Tie::StdHandle;
+
+$f = 'tst';
+
+print "1..13\n";
+
+# my $file tests
+
+unlink("afile.new") if -f "afile";
+print "$!\nnot " unless open($f,"+>afile");
+print "ok 1\n";
+print "$!\nnot " unless binmode($f);
+print "ok 2\n";
+print "not " unless -f "afile";
+print "ok 3\n";
+print "not " unless print $f "SomeData\n";
+print "ok 4\n";
+print "not " unless tell($f) == 9;
+print "ok 5\n";
+print "not " unless printf $f "Some %d value\n",1234;
+print "ok 6\n";
+print "not " unless seek($f,0,0);
+print "ok 7\n";
+$b = <$f>;
+print "not " unless $b eq "SomeData\n";
+print "ok 8\n";
+print "not " if eof($f);
+print "ok 9\n";
+read($f,($b=''),4);
+print "'$b' not " unless $b eq 'Some';
+print "ok 10\n";
+print "not " unless getc($f) eq ' ';
+print "ok 11\n";
+$b = <$f>;
+print "not " unless eof($f);
+print "ok 12\n";
+print "not " unless close($f);
+print "ok 13\n";
+unlink("afile");
diff --git a/contrib/perl5/t/lib/tie-stdpush.t b/contrib/perl5/t/lib/tie-stdpush.t
index 34a6947..35ae1b8 100755
--- a/contrib/perl5/t/lib/tie-stdpush.t
+++ b/contrib/perl5/t/lib/tie-stdpush.t
@@ -2,9 +2,9 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Tie::Array;
tie @x,Tie::StdArray;
-require "../t/op/push.t"
+require "op/push.t"
diff --git a/contrib/perl5/t/lib/timelocal.t b/contrib/perl5/t/lib/timelocal.t
index 100e076..359d71e 100755
--- a/contrib/perl5/t/lib/timelocal.t
+++ b/contrib/perl5/t/lib/timelocal.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Time::Local;
diff --git a/contrib/perl5/t/lib/trig.t b/contrib/perl5/t/lib/trig.t
index 3114176..20669f0 100755
--- a/contrib/perl5/t/lib/trig.t
+++ b/contrib/perl5/t/lib/trig.t
@@ -10,7 +10,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Math::Trig;
diff --git a/contrib/perl5/t/op/64bitint.t b/contrib/perl5/t/op/64bitint.t
new file mode 100755
index 0000000..60f72c3
--- /dev/null
+++ b/contrib/perl5/t/op/64bitint.t
@@ -0,0 +1,242 @@
+#./perl
+
+BEGIN {
+ eval { my $q = pack "q", 0 };
+ if ($@) {
+ print "1..0\n# no 64-bit types\n";
+ exit(0);
+ }
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+# This could use a lot of more tests.
+
+# so that using > 0xfffffff constants and
+# 32+ bit integers don't cause noise
+no warnings qw(overflow portable);
+
+print "1..48\n";
+
+my $q = 12345678901;
+my $r = 23456789012;
+my $f = 0xffffffff;
+my $x;
+my $y;
+
+$x = unpack "q", pack "q", $q;
+print "not " unless $x == $q && $x > $f;
+print "ok 1\n";
+
+
+$x = sprintf("%lld", 12345678901);
+print "not " unless $x eq $q && $x > $f;
+print "ok 2\n";
+
+
+$x = sprintf("%lld", $q);
+print "not " unless $x == $q && $x eq $q && $x > $f;
+print "ok 3\n";
+
+$x = sprintf("%Ld", $q);
+print "not " unless $x == $q && $x eq $q && $x > $f;
+print "ok 4\n";
+
+$x = sprintf("%qd", $q);
+print "not " unless $x == $q && $x eq $q && $x > $f;
+print "ok 5\n";
+
+
+$x = sprintf("%llx", $q);
+print "not " unless hex($x) == 0x2dfdc1c35 && hex($x) > $f;
+print "ok 6\n";
+
+$x = sprintf("%Lx", $q);
+print "not " unless hex($x) == 0x2dfdc1c35 && hex($x) > $f;
+print "ok 7\n";
+
+$x = sprintf("%qx", $q);
+print "not " unless hex($x) == 0x2dfdc1c35 && hex($x) > $f;
+print "ok 8\n";
+
+
+$x = sprintf("%llo", $q);
+print "not " unless oct("0$x") == 0133767016065 && oct($x) > $f;
+print "ok 9\n";
+
+$x = sprintf("%Lo", $q);
+print "not " unless oct("0$x") == 0133767016065 && oct($x) > $f;
+print "ok 10\n";
+
+$x = sprintf("%qo", $q);
+print "not " unless oct("0$x") == 0133767016065 && oct($x) > $f;
+print "ok 11\n";
+
+
+$x = sprintf("%llb", $q);
+print "not " unless oct("0b$x") == 0b1011011111110111000001110000110101 &&
+ oct("0b$x") > $f;
+print "ok 12\n";
+
+$x = sprintf("%Lb", $q);
+print "not " unless oct("0b$x") == 0b1011011111110111000001110000110101 &&
+ oct("0b$x") > $f;
+print "ok 13\n";
+
+$x = sprintf("%qb", $q);
+print "not " unless oct("0b$x") == 0b1011011111110111000001110000110101 &&
+ oct("0b$x") > $f;
+print "ok 14\n";
+
+
+$x = sprintf("%llu", $q);
+print "not " unless $x eq $q && $x > $f;
+print "ok 15\n";
+
+$x = sprintf("%Lu", $q);
+print "not " unless $x == $q && $x eq $q && $x > $f;
+print "ok 16\n";
+
+$x = sprintf("%qu", $q);
+print "not " unless $x == $q && $x eq $q && $x > $f;
+print "ok 17\n";
+
+
+$x = sprintf("%D", $q);
+print "not " unless $x == $q && $x eq $q && $x > $f;
+print "ok 18\n";
+
+$x = sprintf("%U", $q);
+print "not " unless $x == $q && $x eq $q && $x > $f;
+print "ok 19\n";
+
+$x = sprintf("%O", $q);
+print "not " unless oct($x) == $q && oct($x) > $f;
+print "ok 20\n";
+
+
+$x = $q + $r;
+print "not " unless $x == 35802467913 && $x > $f;
+print "ok 21\n";
+
+$x = $q - $r;
+print "not " unless $x == -11111110111 && -$x > $f;
+print "ok 22\n";
+
+$x = $q * 1234567;
+print "not " unless $x == 15241567763770867 && $x > $f;
+print "ok 23\n";
+
+$x /= 1234567;
+print "not " unless $x == $q && $x > $f;
+print "ok 24\n";
+
+$x = 98765432109 % 12345678901;
+print "not " unless $x == 901;
+print "ok 25\n";
+
+# The following 12 tests adapted from op/inc.
+
+$a = 9223372036854775807;
+$c = $a++;
+print "not " unless $a == 9223372036854775808;
+print "ok 26\n";
+
+$a = 9223372036854775807;
+$c = ++$a;
+print "not " unless $a == 9223372036854775808 && $c == $a;
+print "ok 27\n";
+
+$a = 9223372036854775807;
+$c = $a + 1;
+print "not " unless $a == 9223372036854775807 && $c == 9223372036854775808;
+print "ok 28\n";
+
+$a = -9223372036854775808;
+$c = $a--;
+print "not " unless $a == -9223372036854775809 && $c == -9223372036854775808;
+print "ok 29\n";
+
+$a = -9223372036854775808;
+$c = --$a;
+print "not " unless $a == -9223372036854775809 && $c == $a;
+print "ok 30\n";
+
+$a = -9223372036854775808;
+$c = $a - 1;
+print "not " unless $a == -9223372036854775808 && $c == -9223372036854775809;
+print "ok 31\n";
+
+$a = 9223372036854775808;
+$a = -$a;
+$c = $a--;
+print "not " unless $a == -9223372036854775809 && $c == -9223372036854775808;
+print "ok 32\n";
+
+$a = 9223372036854775808;
+$a = -$a;
+$c = --$a;
+print "not " unless $a == -9223372036854775809 && $c == $a;
+print "ok 33\n";
+
+$a = 9223372036854775808;
+$a = -$a;
+$c = $a - 1;
+print "not " unless $a == -9223372036854775808 && $c == -9223372036854775809;
+print "ok 34\n";
+
+$a = 9223372036854775808;
+$b = -$a;
+$c = $b--;
+print "not " unless $b == -$a-1 && $c == -$a;
+print "ok 35\n";
+
+$a = 9223372036854775808;
+$b = -$a;
+$c = --$b;
+print "not " unless $b == -$a-1 && $c == $b;
+print "ok 36\n";
+
+$a = 9223372036854775808;
+$b = -$a;
+$b = $b - 1;
+print "not " unless $b == -(++$a);
+print "ok 37\n";
+
+
+$x = '';
+print "not " unless (vec($x, 1, 64) = $q) == $q;
+print "ok 38\n";
+
+print "not " unless vec($x, 1, 64) == $q && vec($x, 1, 64) > $f;
+print "ok 39\n";
+
+print "not " unless vec($x, 0, 64) == 0 && vec($x, 2, 64) == 0;
+print "ok 40\n";
+
+
+print "not " unless ~0 == 0xffffffffffffffff;
+print "ok 41\n";
+
+print "not " unless (0xffffffff<<32) == 0xffffffff00000000;
+print "ok 42\n";
+
+print "not " unless ((0xffffffff)<<32)>>32 == 0xffffffff;
+print "ok 43\n";
+
+print "not " unless 1<<63 == 0x8000000000000000;
+print "ok 44\n";
+
+print "not " unless (sprintf "%#Vx", 1<<63) eq '0x8000000000000000';
+print "ok 45\n";
+
+print "not " unless (0x8000000000000000 | 1) == 0x8000000000000001;
+print "ok 46\n";
+
+print "not " unless (0xf000000000000000 & 0x8000000000000000) == 0x8000000000000000;
+print "ok 47\n";
+
+print "not " unless (0xf000000000000000 ^ 0xfffffffffffffff0) == 0x0ffffffffffffff0;
+print "ok 48\n";
+
+# eof
diff --git a/contrib/perl5/t/op/args.t b/contrib/perl5/t/op/args.t
new file mode 100755
index 0000000..48bf5afe
--- /dev/null
+++ b/contrib/perl5/t/op/args.t
@@ -0,0 +1,54 @@
+#!./perl
+
+print "1..8\n";
+
+# test various operations on @_
+
+my $ord = 0;
+sub new1 { bless \@_ }
+{
+ my $x = new1("x");
+ my $y = new1("y");
+ ++$ord;
+ print "# got [@$y], expected [y]\nnot " unless "@$y" eq "y";
+ print "ok $ord\n";
+ ++$ord;
+ print "# got [@$x], expected [x]\nnot " unless "@$x" eq "x";
+ print "ok $ord\n";
+}
+
+sub new2 { splice @_, 0, 0, "a", "b", "c"; return \@_ }
+{
+ my $x = new2("x");
+ my $y = new2("y");
+ ++$ord;
+ print "# got [@$x], expected [a b c x]\nnot " unless "@$x" eq "a b c x";
+ print "ok $ord\n";
+ ++$ord;
+ print "# got [@$y], expected [a b c y]\nnot " unless "@$y" eq "a b c y";
+ print "ok $ord\n";
+}
+
+sub new3 { goto &new1 }
+{
+ my $x = new3("x");
+ my $y = new3("y");
+ ++$ord;
+ print "# got [@$y], expected [y]\nnot " unless "@$y" eq "y";
+ print "ok $ord\n";
+ ++$ord;
+ print "# got [@$x], expected [x]\nnot " unless "@$x" eq "x";
+ print "ok $ord\n";
+}
+
+sub new4 { goto &new2 }
+{
+ my $x = new4("x");
+ my $y = new4("y");
+ ++$ord;
+ print "# got [@$x], expected [a b c x]\nnot " unless "@$x" eq "a b c x";
+ print "ok $ord\n";
+ ++$ord;
+ print "# got [@$y], expected [a b c y]\nnot " unless "@$y" eq "a b c y";
+ print "ok $ord\n";
+}
diff --git a/contrib/perl5/t/op/arith.t b/contrib/perl5/t/op/arith.t
index 43af807..fe2f0f4 100755
--- a/contrib/perl5/t/op/arith.t
+++ b/contrib/perl5/t/op/arith.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..4\n";
+print "1..8\n";
sub try ($$) {
print +($_[1] ? "ok" : "not ok"), " $_[0]\n";
@@ -10,3 +10,14 @@ try 1, 13 % 4 == 1;
try 2, -13 % 4 == 3;
try 3, 13 % -4 == -3;
try 4, -13 % -4 == -1;
+
+my $limit = 1e6;
+
+# Division (and modulo) of floating point numbers
+# seem to be rather sloppy in Cray.
+$limit = 1e8 if $^O eq 'unicos';
+
+try 5, abs( 13e21 % 4e21 - 1e21) < $limit;
+try 6, abs(-13e21 % 4e21 - 3e21) < $limit;
+try 7, abs( 13e21 % -4e21 - -3e21) < $limit;
+try 8, abs(-13e21 % -4e21 - -1e21) < $limit;
diff --git a/contrib/perl5/t/op/array.t b/contrib/perl5/t/op/array.t
index 3409556..1108f49 100755
--- a/contrib/perl5/t/op/array.t
+++ b/contrib/perl5/t/op/array.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..65\n";
+print "1..66\n";
#
# @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them
@@ -211,3 +211,8 @@ my $t = 63;
sub reify { $_[1] = ++$t; print "@_\n"; }
reify('ok');
reify('ok');
+
+# qw() is no more a runtime split, it's compiletime.
+print "not " unless qw(foo bar snorfle)[2] eq 'snorfle';
+print "ok 66\n";
+
diff --git a/contrib/perl5/t/op/assignwarn.t b/contrib/perl5/t/op/assignwarn.t
index 57e89c4..b95cec5 100755
--- a/contrib/perl5/t/op/assignwarn.t
+++ b/contrib/perl5/t/op/assignwarn.t
@@ -8,12 +8,12 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use strict;
+use warnings;
-$^W = 1;
my $warn = "";
$SIG{q(__WARN__)} = sub { print $warn; $warn .= join("",@_) };
diff --git a/contrib/perl5/t/op/attrs.t b/contrib/perl5/t/op/attrs.t
new file mode 100755
index 0000000..615e4d3
--- /dev/null
+++ b/contrib/perl5/t/op/attrs.t
@@ -0,0 +1,176 @@
+#!./perl -w
+
+# Regression tests for attributes.pm and the C< : attrs> syntax.
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+sub NTESTS () ;
+
+my ($test, $ntests);
+BEGIN {$ntests=0}
+$test=0;
+my $failed = 0;
+
+print "1..".NTESTS."\n";
+
+$SIG{__WARN__} = sub { die @_ };
+
+sub mytest {
+ if (!$@ ne !$_[0] || $_[0] && $@ !~ $_[0]) {
+ if ($@) {
+ my $x = $@;
+ $x =~ s/\n.*\z//s;
+ print "# Got: $x\n"
+ }
+ else {
+ print "# Got unexpected success\n";
+ }
+ if ($_[0]) {
+ print "# Expected: $_[0]\n";
+ }
+ else {
+ print "# Expected success\n";
+ }
+ $failed = 1;
+ print "not ";
+ }
+ elsif (@_ == 3 && $_[1] ne $_[2]) {
+ print "# Got: $_[1]\n";
+ print "# Expected: $_[2]\n";
+ $failed = 1;
+ print "not ";
+ }
+ print "ok ",++$test,"\n";
+}
+
+eval 'sub t1 ($) : locked { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub t2 : locked { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub t3 ($) : locked ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub t4 : locked ;';
+mytest;
+BEGIN {++$ntests}
+
+my $anon1;
+eval '$anon1 = sub ($) : locked:method { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+my $anon2;
+eval '$anon2 = sub : locked : method { $_[0]++ }';
+mytest;
+BEGIN {++$ntests}
+
+my $anon3;
+eval '$anon3 = sub : method { $_[0]->[1] }';
+mytest;
+BEGIN {++$ntests}
+
+eval 'sub e1 ($) : plugh ;';
+mytest qr/^Invalid CODE attributes?: ["']?plugh["']? at/;
+BEGIN {++$ntests}
+
+eval 'sub e2 ($) : plugh(0,0) xyzzy ;';
+mytest qr/^Invalid CODE attributes: ["']?plugh\(0,0\)["']? /;
+BEGIN {++$ntests}
+
+eval 'sub e3 ($) : plugh(0,0 xyzzy ;';
+mytest qr/Unterminated attribute parameter in attribute list at/;
+BEGIN {++$ntests}
+
+eval 'sub e4 ($) : plugh + xyzzy ;';
+mytest qr/Invalid separator character '[+]' in attribute list at/;
+BEGIN {++$ntests}
+
+eval 'my main $x : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my $x : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my $x ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x) : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x) ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x) : ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) : = 0;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) : ;';
+mytest;
+BEGIN {++$ntests}
+
+eval 'my ($x,$y) : plugh;';
+mytest qr/^Invalid SCALAR attribute: ["']?plugh["']? at/;
+BEGIN {++$ntests}
+
+sub A::MODIFY_SCALAR_ATTRIBUTES { return }
+eval 'my A $x : plugh;';
+mytest qr/^SCALAR package attribute may clash with future reserved word: ["']?plugh["']? at/;
+BEGIN {++$ntests}
+
+eval 'my A $x : plugh plover;';
+mytest qr/^SCALAR package attributes may clash with future reserved words: ["']?plugh["']? /;
+BEGIN {++$ntests}
+
+sub X::MODIFY_CODE_ATTRIBUTES { die "$_[0]" }
+sub X::foo { 1 }
+*Y::bar = \&X::foo;
+*Y::bar = \&X::foo; # second time for -w
+eval 'package Z; sub Y::bar : locked';
+mytest qr/^X at /;
+BEGIN {++$ntests}
+
+my @attrs = eval 'attributes::get \&Y::bar';
+mytest '', "@attrs", "locked";
+BEGIN {++$ntests}
+
+@attrs = eval 'attributes::get $anon1';
+mytest '', "@attrs", "locked method";
+BEGIN {++$ntests}
+
+sub Z::DESTROY { }
+sub Z::FETCH_CODE_ATTRIBUTES { return 'Z' }
+my $thunk = eval 'bless +sub : method locked { 1 }, "Z"';
+mytest '', ref($thunk), "Z";
+BEGIN {++$ntests}
+
+@attrs = eval 'attributes::get $thunk';
+mytest '', "@attrs", "locked method Z";
+BEGIN {++$ntests}
+
+
+# Other tests should be added above this line
+
+sub NTESTS () { $ntests }
+
+exit $failed;
diff --git a/contrib/perl5/t/op/avhv.t b/contrib/perl5/t/op/avhv.t
index 55cc992..cd7c957 100755
--- a/contrib/perl5/t/op/avhv.t
+++ b/contrib/perl5/t/op/avhv.t
@@ -1,8 +1,8 @@
#!./perl
-
+
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
require Tie::Array;
@@ -17,7 +17,7 @@ sub STORESIZE { $#{$_[0]} = $_[1]+1 }
package main;
-print "1..12\n";
+print "1..28\n";
$sch = {
'abc' => 1,
@@ -108,3 +108,71 @@ f($a->{key});
print "not " unless $a->[1] eq 'b';
print "ok 12\n";
+# check if exists() is behaving properly
+$avhv = [{foo=>1,bar=>2,pants=>3}];
+print "not " if exists $avhv->{bar};
+print "ok 13\n";
+
+$avhv->{pants} = undef;
+print "not " unless exists $avhv->{pants};
+print "ok 14\n";
+print "not " if exists $avhv->{bar};
+print "ok 15\n";
+
+$avhv->{bar} = 10;
+print "not " unless exists $avhv->{bar} and $avhv->{bar} == 10;
+print "ok 16\n";
+
+$v = delete $avhv->{bar};
+print "not " unless $v == 10;
+print "ok 17\n";
+
+print "not " if exists $avhv->{bar};
+print "ok 18\n";
+
+$avhv->{foo} = 'xxx';
+$avhv->{bar} = 'yyy';
+$avhv->{pants} = 'zzz';
+@x = delete @{$avhv}{'foo','pants'};
+print "# @x\nnot " unless "@x" eq "xxx zzz";
+print "ok 19\n";
+
+print "not " unless "$avhv->{bar}" eq "yyy";
+print "ok 20\n";
+
+# hash assignment
+%$avhv = ();
+print "not " unless ref($avhv->[0]) eq 'HASH';
+print "ok 21\n";
+
+%hv = %$avhv;
+print "not " if grep defined, values %hv;
+print "ok 22\n";
+print "not " if grep ref, keys %hv;
+print "ok 23\n";
+
+%$avhv = (foo => 29, pants => 2, bar => 0);
+print "not " unless "@$avhv[1..3]" eq '29 0 2';
+print "ok 24\n";
+
+my $extra;
+my @extra;
+($extra, %$avhv) = ("moo", foo => 42, pants => 53, bar => "HIKE!");
+print "not " unless "@$avhv[1..3]" eq '42 HIKE! 53' and $extra eq 'moo';
+print "ok 25\n";
+
+%$avhv = ();
+(%$avhv, $extra) = (foo => 42, pants => 53, bar => "HIKE!");
+print "not " unless "@$avhv[1..3]" eq '42 HIKE! 53' and !defined $extra;
+print "ok 26\n";
+
+@extra = qw(whatever and stuff);
+%$avhv = ();
+(%$avhv, @extra) = (foo => 42, pants => 53, bar => "HIKE!");
+print "not " unless "@$avhv[1..3]" eq '42 HIKE! 53' and @extra == 0;
+print "ok 27\n";
+
+%$avhv = ();
+(@extra, %$avhv) = (foo => 42, pants => 53, bar => "HIKE!");
+print "not " unless ref $avhv->[0] eq 'HASH' and @extra == 6;
+print "ok 28\n";
diff --git a/contrib/perl5/t/op/bop.t b/contrib/perl5/t/op/bop.t
index b247341..7bcabdf 100755
--- a/contrib/perl5/t/op/bop.t
+++ b/contrib/perl5/t/op/bop.t
@@ -6,10 +6,10 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
-print "1..18\n";
+print "1..30\n";
# numerics
print ((0xdead & 0xbeef) == 0x9ead ? "ok 1\n" : "not ok 1\n");
@@ -62,3 +62,22 @@ print (($foo | $bar) eq ($Aoz x 75 . $zap) ? "ok 17\n" : "not ok 17\n");
# ^ does not truncate
print (($foo ^ $bar) eq ($Axz x 75 . $zap) ? "ok 18\n" : "not ok 18\n");
+#
+print "ok \xFF\xFF\n" & "ok 19\n";
+print "ok 20\n" | "ok \0\0\n";
+print "o\000 \0001\000" ^ "\000k\0002\000\n";
+
+#
+print "ok \x{FF}\x{FF}\n" & "ok 22\n";
+print "ok 23\n" | "ok \x{0}\x{0}\n";
+print "o\x{0} \x{0}4\x{0}" ^ "\x{0}k\x{0}2\x{0}\n";
+
+#
+print "ok 25\n" if sprintf("%vd", v4095 & v801) eq 801;
+print "ok 26\n" if sprintf("%vd", v4095 | v801) eq 4095;
+print "ok 27\n" if sprintf("%vd", v4095 ^ v801) eq 3294;
+
+#
+print "ok 28\n" if sprintf("%vd", v4095.801.4095 & v801.4095) eq '801.801';
+print "ok 29\n" if sprintf("%vd", v4095.801.4095 | v801.4095) eq '4095.4095.4095';
+print "ok 30\n" if sprintf("%vd", v801.4095 ^ v4095.801.4095) eq '3294.3294.4095';
diff --git a/contrib/perl5/t/op/chars.t b/contrib/perl5/t/op/chars.t
new file mode 100755
index 0000000..efdea02
--- /dev/null
+++ b/contrib/perl5/t/op/chars.t
@@ -0,0 +1,74 @@
+#!./perl
+
+print "1..33\n";
+
+# because of ebcdic.c these should be the same on asciiish
+# and ebcdic machines.
+# Peter Prymmer <pvhp@best.com>.
+
+my $c = "\c@";
+print +((ord($c) == 0) ? "" : "not "),"ok 1\n";
+$c = "\cA";
+print +((ord($c) == 1) ? "" : "not "),"ok 2\n";
+$c = "\cB";
+print +((ord($c) == 2) ? "" : "not "),"ok 3\n";
+$c = "\cC";
+print +((ord($c) == 3) ? "" : "not "),"ok 4\n";
+$c = "\cD";
+print +((ord($c) == 4) ? "" : "not "),"ok 5\n";
+$c = "\cE";
+print +((ord($c) == 5) ? "" : "not "),"ok 6\n";
+$c = "\cF";
+print +((ord($c) == 6) ? "" : "not "),"ok 7\n";
+$c = "\cG";
+print +((ord($c) == 7) ? "" : "not "),"ok 8\n";
+$c = "\cH";
+print +((ord($c) == 8) ? "" : "not "),"ok 9\n";
+$c = "\cI";
+print +((ord($c) == 9) ? "" : "not "),"ok 10\n";
+$c = "\cJ";
+print +((ord($c) == 10) ? "" : "not "),"ok 11\n";
+$c = "\cK";
+print +((ord($c) == 11) ? "" : "not "),"ok 12\n";
+$c = "\cL";
+print +((ord($c) == 12) ? "" : "not "),"ok 13\n";
+$c = "\cM";
+print +((ord($c) == 13) ? "" : "not "),"ok 14\n";
+$c = "\cN";
+print +((ord($c) == 14) ? "" : "not "),"ok 15\n";
+$c = "\cO";
+print +((ord($c) == 15) ? "" : "not "),"ok 16\n";
+$c = "\cP";
+print +((ord($c) == 16) ? "" : "not "),"ok 17\n";
+$c = "\cQ";
+print +((ord($c) == 17) ? "" : "not "),"ok 18\n";
+$c = "\cR";
+print +((ord($c) == 18) ? "" : "not "),"ok 19\n";
+$c = "\cS";
+print +((ord($c) == 19) ? "" : "not "),"ok 20\n";
+$c = "\cT";
+print +((ord($c) == 20) ? "" : "not "),"ok 21\n";
+$c = "\cU";
+print +((ord($c) == 21) ? "" : "not "),"ok 22\n";
+$c = "\cV";
+print +((ord($c) == 22) ? "" : "not "),"ok 23\n";
+$c = "\cW";
+print +((ord($c) == 23) ? "" : "not "),"ok 24\n";
+$c = "\cX";
+print +((ord($c) == 24) ? "" : "not "),"ok 25\n";
+$c = "\cY";
+print +((ord($c) == 25) ? "" : "not "),"ok 26\n";
+$c = "\cZ";
+print +((ord($c) == 26) ? "" : "not "),"ok 27\n";
+$c = "\c[";
+print +((ord($c) == 27) ? "" : "not "),"ok 28\n";
+$c = "\c\\";
+print +((ord($c) == 28) ? "" : "not "),"ok 29\n";
+$c = "\c]";
+print +((ord($c) == 29) ? "" : "not "),"ok 30\n";
+$c = "\c^";
+print +((ord($c) == 30) ? "" : "not "),"ok 31\n";
+$c = "\c_";
+print +((ord($c) == 31) ? "" : "not "),"ok 32\n";
+$c = "\c?";
+print +((ord($c) == 127) ? "" : "not "),"ok 33\n";
diff --git a/contrib/perl5/t/op/chop.t b/contrib/perl5/t/op/chop.t
index 77263ad..6723ca3 100755
--- a/contrib/perl5/t/op/chop.t
+++ b/contrib/perl5/t/op/chop.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: chop.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:40 $
-
-print "1..28\n";
+print "1..30\n";
# optimized
@@ -85,3 +83,9 @@ $_ = "axx";
$/ = "yy";
print chomp() == 0 ? "ok 27\n" : "not ok 27\n";
print $_ eq "axx" ? "ok 28\n" : "not ok 28\n";
+
+# This case once mistakenly behaved like paragraph mode.
+$_ = "ab\n";
+$/ = \3;
+print chomp() == 0 ? "ok 29\n" : "not ok 29\n";
+print $_ eq "ab\n" ? "ok 30\n" : "not ok 30\n";
diff --git a/contrib/perl5/t/op/closure.t b/contrib/perl5/t/op/closure.t
index 95d44f5..c691d6f 100755
--- a/contrib/perl5/t/op/closure.t
+++ b/contrib/perl5/t/op/closure.t
@@ -7,12 +7,12 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Config;
-print "1..169\n";
+print "1..171\n";
my $test = 1;
sub test (&) {
@@ -157,6 +157,31 @@ test {
&{$foo[4]}(4)
};
+for my $n (0..4) {
+ $foo[$n] = sub {
+ # no intervening reference to $n here
+ sub { $n == $_[0] }
+ };
+}
+
+test {
+ $foo[0]->()->(0) and
+ $foo[1]->()->(1) and
+ $foo[2]->()->(2) and
+ $foo[3]->()->(3) and
+ $foo[4]->()->(4)
+};
+
+{
+ my $w;
+ $w = sub {
+ my ($i) = @_;
+ test { $i == 10 };
+ sub { $w };
+ };
+ $w->(10);
+}
+
# Additional tests by Tom Phoenix <rootbeer@teleport.com>.
{
diff --git a/contrib/perl5/t/op/defins.t b/contrib/perl5/t/op/defins.t
index 33c74ea..9e714a7 100755
--- a/contrib/perl5/t/op/defins.t
+++ b/contrib/perl5/t/op/defins.t
@@ -6,7 +6,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
$SIG{__WARN__} = sub { $warns++; warn $_[0] };
print "1..14\n";
}
diff --git a/contrib/perl5/t/op/delete.t b/contrib/perl5/t/op/delete.t
index 6cc4475..10a218b 100755
--- a/contrib/perl5/t/op/delete.t
+++ b/contrib/perl5/t/op/delete.t
@@ -1,8 +1,8 @@
#!./perl
-# $RCSfile: delete.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:44 $
+print "1..36\n";
-print "1..16\n";
+# delete() on hash elements
$foo{1} = 'a';
$foo{2} = 'b';
@@ -13,7 +13,7 @@ $foo{5} = 'e';
$foo = delete $foo{2};
if ($foo eq 'b') {print "ok 1\n";} else {print "not ok 1 $foo\n";}
-if ($foo{2} eq '') {print "ok 2\n";} else {print "not ok 2 $foo{2}\n";}
+unless (exists $foo{2}) {print "ok 2\n";} else {print "not ok 2 $foo{2}\n";}
if ($foo{1} eq 'a') {print "ok 3\n";} else {print "not ok 3\n";}
if ($foo{3} eq 'c') {print "ok 4\n";} else {print "not ok 4\n";}
if ($foo{4} eq 'd') {print "ok 5\n";} else {print "not ok 5\n";}
@@ -24,8 +24,8 @@ if ($foo{5} eq 'e') {print "ok 6\n";} else {print "not ok 6\n";}
if (@foo == 2) {print "ok 7\n";} else {print "not ok 7 ", @foo+0, "\n";}
if ($foo[0] eq 'd') {print "ok 8\n";} else {print "not ok 8 ", $foo[0], "\n";}
if ($foo[1] eq 'e') {print "ok 9\n";} else {print "not ok 9 ", $foo[1], "\n";}
-if ($foo{4} eq '') {print "ok 10\n";} else {print "not ok 10 $foo{4}\n";}
-if ($foo{5} eq '') {print "ok 11\n";} else {print "not ok 11 $foo{5}\n";}
+unless (exists $foo{4}) {print "ok 10\n";} else {print "not ok 10 $foo{4}\n";}
+unless (exists $foo{5}) {print "ok 11\n";} else {print "not ok 11 $foo{5}\n";}
if ($foo{1} eq 'a') {print "ok 12\n";} else {print "not ok 12\n";}
if ($foo{3} eq 'c') {print "ok 13\n";} else {print "not ok 13\n";}
@@ -49,3 +49,75 @@ delete $refhash{"top"}->{"bar"};
@list = keys %{$refhash{"top"}};
print "@list" eq "foo" ? "ok 16\n" : "not ok 16 @list\n";
+
+{
+ my %a = ('bar', 33);
+ my($a) = \(values %a);
+ my $b = \$a{bar};
+ my $c = \delete $a{bar};
+
+ print "not " unless $a == $b && $b == $c;
+ print "ok 17\n";
+}
+
+# delete() on array elements
+
+@foo = ();
+$foo[1] = 'a';
+$foo[2] = 'b';
+$foo[3] = 'c';
+$foo[4] = 'd';
+$foo[5] = 'e';
+
+$foo = delete $foo[2];
+
+if ($foo eq 'b') {print "ok 18\n";} else {print "not ok 18 $foo\n";}
+unless (exists $foo[2]) {print "ok 19\n";} else {print "not ok 19 $foo[2]\n";}
+if ($foo[1] eq 'a') {print "ok 20\n";} else {print "not ok 20\n";}
+if ($foo[3] eq 'c') {print "ok 21\n";} else {print "not ok 21\n";}
+if ($foo[4] eq 'd') {print "ok 22\n";} else {print "not ok 22\n";}
+if ($foo[5] eq 'e') {print "ok 23\n";} else {print "not ok 23\n";}
+
+@bar = delete @foo[4,5];
+
+if (@bar == 2) {print "ok 24\n";} else {print "not ok 24 ", @bar+0, "\n";}
+if ($bar[0] eq 'd') {print "ok 25\n";} else {print "not ok 25 ", $bar[0], "\n";}
+if ($bar[1] eq 'e') {print "ok 26\n";} else {print "not ok 26 ", $bar[1], "\n";}
+unless (exists $foo[4]) {print "ok 27\n";} else {print "not ok 27 $foo[4]\n";}
+unless (exists $foo[5]) {print "ok 28\n";} else {print "not ok 28 $foo[5]\n";}
+if ($foo[1] eq 'a') {print "ok 29\n";} else {print "not ok 29\n";}
+if ($foo[3] eq 'c') {print "ok 30\n";} else {print "not ok 30\n";}
+
+$foo = join('',@foo);
+if ($foo eq 'ac') {print "ok 31\n";} else {print "not ok 31\n";}
+
+if (@foo == 4) {print "ok 32\n";} else {print "not ok 32\n";}
+
+foreach $key (0 .. $#foo) {
+ delete $foo[$key];
+}
+
+if (@foo == 0) {print "ok 33\n";} else {print "not ok 33\n";}
+
+$foo[0] = 'x';
+$foo[1] = 'y';
+
+$foo = "@foo";
+print +($foo eq 'x y') ? "ok 34\n" : "not ok 34\n";
+
+$refary[0]->[0] = "FOO";
+$refary[0]->[3] = "BAR";
+
+delete $refary[0]->[3];
+
+print @{$refary[0]} == 1 ? "ok 35\n" : "not ok 35 @list\n";
+
+{
+ my @a = 33;
+ my($a) = \(@a);
+ my $b = \$a[0];
+ my $c = \delete $a[bar];
+
+ print "not " unless $a == $b && $b == $c;
+ print "ok 36\n";
+}
diff --git a/contrib/perl5/t/op/die.t b/contrib/perl5/t/op/die.t
index d473ed6..cf4f8b0 100755
--- a/contrib/perl5/t/op/die.t
+++ b/contrib/perl5/t/op/die.t
@@ -4,7 +4,7 @@ print "1..10\n";
$SIG{__DIE__} = sub { print ref($_[0]) ? ("ok ",$_[0]->[0]++,"\n") : @_ } ;
-$err = "ok 1\n";
+$err = "#[\000]\nok 1\n";
eval {
die $err;
};
diff --git a/contrib/perl5/t/op/die_exit.t b/contrib/perl5/t/op/die_exit.t
index 26b477a..cb0478b 100755
--- a/contrib/perl5/t/op/die_exit.t
+++ b/contrib/perl5/t/op/die_exit.t
@@ -7,8 +7,14 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -e '../lib';
+ unshift @INC, '../lib' if -e '../lib';
}
+
+if ($^O eq 'mpeix') {
+ print "1..0 # Skip: broken on MPE/iX\n";
+ exit 0;
+}
+
my $perl = -e '../perl' ? '../perl' : -e './perl' ? './perl' : 'perl';
use strict;
@@ -31,7 +37,7 @@ my %tests = (
15 => [ 255, 1],
16 => [ 255, 256],
# see if implicit close preserves $?
- 17 => [ 0, 512, '{ local *F; open F, q[TEST]; close F } die;'],
+ 17 => [ 0, 512, '{ local *F; open F, q[TEST]; close F; $!=0 } die;'],
);
my $max = keys %tests;
diff --git a/contrib/perl5/t/op/each.t b/contrib/perl5/t/op/each.t
index 9063c2c..879c0d0 100755
--- a/contrib/perl5/t/op/each.t
+++ b/contrib/perl5/t/op/each.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: each.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:47 $
-
-print "1..16\n";
+print "1..19\n";
$h{'abc'} = 'ABC';
$h{'def'} = 'DEF';
@@ -120,3 +118,16 @@ while (($key, $value) = each(h)) {
}
}
if ($i == 5) { print "ok 16\n" } else { print "not ok\n" }
+
+{
+ package Obj;
+ sub DESTROY { print "ok 18\n"; }
+ {
+ my $h = { A => bless [], __PACKAGE__ };
+ while (my($k,$v) = each %$h) {
+ print "ok 17\n" if $k eq 'A' and ref($v) eq 'Obj';
+ }
+ }
+ print "ok 19\n";
+}
+
diff --git a/contrib/perl5/t/op/eval.t b/contrib/perl5/t/op/eval.t
index dc163e9..1838923 100755
--- a/contrib/perl5/t/op/eval.t
+++ b/contrib/perl5/t/op/eval.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..36\n";
+print "1..40\n";
eval 'print "ok 1\n";';
@@ -171,3 +171,38 @@ sub terminal { eval 'print $r' }
}
$x++;
+# Have we cured panic which occurred with require/eval in die handler ?
+$SIG{__DIE__} = sub { eval {1}; die shift };
+eval { die "ok ".$x++,"\n" };
+print $@;
+
+# does scalar eval"" pop stack correctly?
+{
+ my $c = eval "(1,2)x10";
+ print $c eq '2222222222' ? "ok $x\n" : "# $c\nnot ok $x\n";
+ $x++;
+}
+
+# return from eval {} should clear $@ correctly
+{
+ my $status = eval {
+ eval { die };
+ print "# eval { return } test\n";
+ return; # removing this changes behavior
+ };
+ print "not " if $@;
+ print "ok $x\n";
+ $x++;
+}
+
+# ditto for eval ""
+{
+ my $status = eval q{
+ eval q{ die };
+ print "# eval q{ return } test\n";
+ return; # removing this changes behavior
+ };
+ print "not " if $@;
+ print "ok $x\n";
+ $x++;
+}
diff --git a/contrib/perl5/t/op/exec.t b/contrib/perl5/t/op/exec.t
index 098a455..23e9ec1 100755
--- a/contrib/perl5/t/op/exec.t
+++ b/contrib/perl5/t/op/exec.t
@@ -1,13 +1,13 @@
#!./perl
-# $RCSfile: exec.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:49 $
-
$| = 1; # flush stdout
+$ENV{LC_ALL} = 'C'; # Forge English error messages.
+$ENV{LANGUAGE} = 'C'; # Ditto in GNU.
+
if ($^O eq 'MSWin32') {
- print "# exec is unsupported on Win32\n";
# XXX the system tests could be written to use ./perl and so work on Win32
- print "1..0\n";
+ print "1..0 # Skip: shh, win32\n";
exit(0);
}
@@ -25,10 +25,23 @@ print "not ok 3\n" if system "echo", "ok", "3"; # directly called
# these should probably be rewritten to match the examples in perlfunc.pod
if (system "true") {print "not ok 4\n";} else {print "ok 4\n";}
-if ((system "/bin/sh -c 'exit 1'") != 256) { print "not "; }
-print "ok 5\n";
+if ($^O eq 'mpeix') {
+ print "ok 5 # skipped: status broken on MPE/iX\n";
+} else {
+ if ((system "/bin/sh -c 'exit 1'") != 256) { print "not "; }
+ print "ok 5\n";
+}
-if ((system "lskdfj") == 255 << 8) {print "ok 6\n";} else {print "not ok 6\n";}
+$rc = system "lskdfj";
+if ($rc == 255 << 8 or $rc == -1 and
+ (
+ $! == 2 or
+ $! =~ /\bno\b.*\bfile/i or
+ $! == 13 or
+ $! =~ /permission denied/i
+ )
+ )
+ {print "ok 6\n";} else {print "not ok 6\n";}
unless (exec "lskdjfalksdjfdjfkls") {print "ok 7\n";} else {print "not ok 7\n";}
diff --git a/contrib/perl5/t/op/exists_sub.t b/contrib/perl5/t/op/exists_sub.t
new file mode 100755
index 0000000..3363dfd
--- /dev/null
+++ b/contrib/perl5/t/op/exists_sub.t
@@ -0,0 +1,46 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+print "1..9\n";
+
+sub t1;
+sub t2 : locked;
+sub t3 ();
+sub t4 ($);
+sub t5 {1;}
+{
+ package P1;
+ sub tmc {1;}
+ package P2;
+ @ISA = 'P1';
+}
+
+print "not " unless exists &t1 && not defined &t1;
+print "ok 1\n";
+print "not " unless exists &t2 && not defined &t2;
+print "ok 2\n";
+print "not " unless exists &t3 && not defined &t3;
+print "ok 3\n";
+print "not " unless exists &t4 && not defined &t4;
+print "ok 4\n";
+print "not " unless exists &t5 && defined &t5;
+print "ok 5\n";
+P2::->tmc;
+print "not " unless not exists &P2::tmc && not defined &P2::tmc;
+print "ok 6\n";
+my $ref;
+$ref->{A}[0] = \&t4;
+print "not " unless exists &{$ref->{A}[0]} && not defined &{$ref->{A}[0]};
+print "ok 7\n";
+undef &P1::tmc;
+print "not " unless exists &P1::tmc && not defined &P1::tmc;
+print "ok 8\n";
+eval 'exists &t5()';
+print "not " unless $@;
+print "ok 9\n";
+
+exit 0;
diff --git a/contrib/perl5/t/op/fh.t b/contrib/perl5/t/op/fh.t
new file mode 100755
index 0000000..86e405a
--- /dev/null
+++ b/contrib/perl5/t/op/fh.t
@@ -0,0 +1,26 @@
+#!./perl
+
+print "1..5\n";
+
+my $test = 0;
+
+# symbolic filehandles should only result in glob entries with FH constructors
+
+$|=1;
+my $a = "SYM000";
+print "not " if defined(fileno($a)) or defined *{$a};
+++$test; print "ok $test\n";
+
+select select $a;
+print "not " unless defined *{$a};
+++$test; print "ok $test\n";
+
+$a++;
+print "not " if close $a or defined *{$a};
+++$test; print "ok $test\n";
+
+print "not " unless open($a, ">&STDOUT") and defined *{$a};
+++$test; print $a "ok $test\n";
+
+print "not " unless close $a;
+++$test; print $a "not "; print "ok $test\n";
diff --git a/contrib/perl5/t/op/filetest.t b/contrib/perl5/t/op/filetest.t
new file mode 100755
index 0000000..e00d5fb
--- /dev/null
+++ b/contrib/perl5/t/op/filetest.t
@@ -0,0 +1,71 @@
+#!./perl
+
+# There are few filetest operators that are portable enough to test.
+# See pod/perlport.pod for details.
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+}
+
+use Config;
+print "1..10\n";
+
+print "not " unless -d 'op';
+print "ok 1\n";
+
+print "not " unless -f 'TEST';
+print "ok 2\n";
+
+print "not " if -f 'op';
+print "ok 3\n";
+
+print "not " if -d 'TEST';
+print "ok 4\n";
+
+print "not " unless -r 'TEST';
+print "ok 5\n";
+
+# make sure TEST is r-x
+eval { chmod 0555, 'TEST' };
+$bad_chmod = $@;
+
+$oldeuid = $>; # root can read and write anything
+eval '$> = 1'; # so switch uid (may not be implemented)
+
+print "# oldeuid = $oldeuid, euid = $>\n";
+
+if (!$Config{d_seteuid}) {
+ print "ok 6 #skipped, no seteuid\n";
+}
+elsif ($bad_chmod) {
+ print "#[$@]\nok 6 #skipped\n";
+}
+else {
+ print "not " if -w 'TEST';
+ print "ok 6\n";
+}
+
+# Scripts are not -x everywhere so cannot test that.
+
+eval '$> = $oldeuid'; # switch uid back (may not be implemented)
+
+# this would fail for the euid 1
+# (unless we have unpacked the source code as uid 1...)
+print "not " unless -r 'op';
+print "ok 7\n";
+
+# this would fail for the euid 1
+# (unless we have unpacked the source code as uid 1...)
+if ($Config{d_seteuid}) {
+ print "not " unless -w 'op';
+ print "ok 8\n";
+} else {
+ print "ok 8 #skipped, no seteuid\n";
+}
+
+print "not " unless -x 'op'; # Hohum. Are directories -x everywhere?
+print "ok 9\n";
+
+print "not " unless "@{[grep -r, qw(foo io noo op zoo)]}" eq "io op";
+print "ok 10\n";
diff --git a/contrib/perl5/t/op/fork.t b/contrib/perl5/t/op/fork.t
index 9790ff0..80c0b72 100755
--- a/contrib/perl5/t/op/fork.t
+++ b/contrib/perl5/t/op/fork.t
@@ -1,26 +1,376 @@
#!./perl
-# $RCSfile: fork.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:53 $
+# tests for both real and emulated fork()
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
require Config; import Config;
- unless ($Config{'d_fork'}) {
- print "1..0\n";
+ unless ($Config{'d_fork'}
+ or ($^O eq 'MSWin32' and $Config{useithreads}
+ and $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/))
+ {
+ print "1..0 # Skip: no fork\n";
exit 0;
}
+ $ENV{PERL5LIB} = "../lib";
}
-$| = 1;
-print "1..2\n";
+if ($^O eq 'mpeix') {
+ print "1..0 # Skip: fork/status problems on MPE/iX\n";
+ exit 0;
+}
+
+$|=1;
+
+undef $/;
+@prgs = split "\n########\n", <DATA>;
+print "1..", scalar @prgs, "\n";
+
+$tmpfile = "forktmp000";
+1 while -f ++$tmpfile;
+END { close TEST; unlink $tmpfile if $tmpfile; }
+
+$CAT = (($^O eq 'MSWin32') ? '.\perl -e "print <>"' : 'cat');
+
+for (@prgs){
+ my $switch;
+ if (s/^\s*(-\w.*)//){
+ $switch = $1;
+ }
+ my($prog,$expected) = split(/\nEXPECT\n/, $_);
+ $expected =~ s/\n+$//;
+ # results can be in any order, so sort 'em
+ my @expected = sort split /\n/, $expected;
+ open TEST, ">$tmpfile" or die "Cannot open $tmpfile: $!";
+ print TEST $prog, "\n";
+ close TEST or die "Cannot close $tmpfile: $!";
+ my $results;
+ if ($^O eq 'MSWin32') {
+ $results = `.\\perl -I../lib $switch $tmpfile 2>&1`;
+ }
+ else {
+ $results = `./perl $switch $tmpfile 2>&1`;
+ }
+ $status = $?;
+ $results =~ s/\n+$//;
+ $results =~ s/at\s+forktmp\d+\s+line/at - line/g;
+ $results =~ s/of\s+forktmp\d+\s+aborted/of - aborted/g;
+# bison says 'parse error' instead of 'syntax error',
+# various yaccs may or may not capitalize 'syntax'.
+ $results =~ s/^(syntax|parse) error/syntax error/mig;
+ $results =~ s/^\n*Process terminated by SIG\w+\n?//mg
+ if $^O eq 'os2';
+ my @results = sort split /\n/, $results;
+ if ( "@results" ne "@expected" ) {
+ print STDERR "PROG: $switch\n$prog\n";
+ print STDERR "EXPECTED:\n$expected\n";
+ print STDERR "GOT:\n$results\n";
+ print "not ";
+ }
+ print "ok ", ++$i, "\n";
+}
+__END__
+$| = 1;
if ($cid = fork) {
- sleep 2;
- if ($result = (kill 9, $cid)) {print "ok 2\n";} else {print "not ok 2 $result\n";}
+ sleep 1;
+ if ($result = (kill 9, $cid)) {
+ print "ok 2\n";
+ }
+ else {
+ print "not ok 2 $result\n";
+ }
+ sleep 1 if $^O eq 'MSWin32'; # avoid WinNT race bug
}
else {
- $| = 1;
print "ok 1\n";
sleep 10;
}
+EXPECT
+ok 1
+ok 2
+########
+$| = 1;
+sub forkit {
+ print "iteration $i start\n";
+ my $x = fork;
+ if (defined $x) {
+ if ($x) {
+ print "iteration $i parent\n";
+ }
+ else {
+ print "iteration $i child\n";
+ }
+ }
+ else {
+ print "pid $$ failed to fork\n";
+ }
+}
+while ($i++ < 3) { do { forkit(); }; }
+EXPECT
+iteration 1 start
+iteration 1 parent
+iteration 1 child
+iteration 2 start
+iteration 2 parent
+iteration 2 child
+iteration 2 start
+iteration 2 parent
+iteration 2 child
+iteration 3 start
+iteration 3 parent
+iteration 3 child
+iteration 3 start
+iteration 3 parent
+iteration 3 child
+iteration 3 start
+iteration 3 parent
+iteration 3 child
+iteration 3 start
+iteration 3 parent
+iteration 3 child
+########
+$| = 1;
+fork()
+ ? (print("parent\n"),sleep(1))
+ : (print("child\n"),exit) ;
+EXPECT
+parent
+child
+########
+$| = 1;
+fork()
+ ? (print("parent\n"),exit)
+ : (print("child\n"),sleep(1)) ;
+EXPECT
+parent
+child
+########
+$| = 1;
+@a = (1..3);
+for (@a) {
+ if (fork) {
+ print "parent $_\n";
+ $_ = "[$_]";
+ }
+ else {
+ print "child $_\n";
+ $_ = "-$_-";
+ }
+}
+print "@a\n";
+EXPECT
+parent 1
+child 1
+parent 2
+child 2
+parent 2
+child 2
+parent 3
+child 3
+parent 3
+child 3
+parent 3
+child 3
+parent 3
+child 3
+[1] [2] [3]
+-1- [2] [3]
+[1] -2- [3]
+[1] [2] -3-
+-1- -2- [3]
+-1- [2] -3-
+[1] -2- -3-
+-1- -2- -3-
+########
+use Config;
+$| = 1;
+$\ = "\n";
+fork()
+ ? print($Config{osname} eq $^O)
+ : print($Config{osname} eq $^O) ;
+EXPECT
+1
+1
+########
+$| = 1;
+$\ = "\n";
+fork()
+ ? do { require Config; print($Config::Config{osname} eq $^O); }
+ : do { require Config; print($Config::Config{osname} eq $^O); }
+EXPECT
+1
+1
+########
+$| = 1;
+use Cwd;
+$\ = "\n";
+my $dir;
+if (fork) {
+ $dir = "f$$.tst";
+ mkdir $dir, 0755;
+ chdir $dir;
+ print cwd() =~ /\Q$dir/i ? "ok 1 parent" : "not ok 1 parent";
+ chdir "..";
+ rmdir $dir;
+}
+else {
+ sleep 2;
+ $dir = "f$$.tst";
+ mkdir $dir, 0755;
+ chdir $dir;
+ print cwd() =~ /\Q$dir/i ? "ok 1 child" : "not ok 1 child";
+ chdir "..";
+ rmdir $dir;
+}
+EXPECT
+ok 1 parent
+ok 1 child
+########
+$| = 1;
+$\ = "\n";
+my $getenv;
+if ($^O eq 'MSWin32') {
+ $getenv = qq[$^X -e "print \$ENV{TST}"];
+}
+else {
+ $getenv = qq[$^X -e 'print \$ENV{TST}'];
+}
+$ENV{TST} = 'foo';
+if (fork) {
+ sleep 1;
+ print "parent before: " . `$getenv`;
+ $ENV{TST} = 'bar';
+ print "parent after: " . `$getenv`;
+}
+else {
+ print "child before: " . `$getenv`;
+ $ENV{TST} = 'baz';
+ print "child after: " . `$getenv`;
+}
+EXPECT
+child before: foo
+child after: baz
+parent before: foo
+parent after: bar
+########
+$| = 1;
+$\ = "\n";
+if ($pid = fork) {
+ waitpid($pid,0);
+ print "parent got $?"
+}
+else {
+ exit(42);
+}
+EXPECT
+parent got 10752
+########
+$| = 1;
+$\ = "\n";
+my $echo = 'echo';
+if ($pid = fork) {
+ waitpid($pid,0);
+ print "parent got $?"
+}
+else {
+ exec("$echo foo");
+}
+EXPECT
+foo
+parent got 0
+########
+if (fork) {
+ die "parent died";
+}
+else {
+ die "child died";
+}
+EXPECT
+parent died at - line 2.
+child died at - line 5.
+########
+if ($pid = fork) {
+ eval { die "parent died" };
+ print $@;
+}
+else {
+ eval { die "child died" };
+ print $@;
+}
+EXPECT
+parent died at - line 2.
+child died at - line 6.
+########
+if (eval q{$pid = fork}) {
+ eval q{ die "parent died" };
+ print $@;
+}
+else {
+ eval q{ die "child died" };
+ print $@;
+}
+EXPECT
+parent died at (eval 2) line 1.
+child died at (eval 2) line 1.
+########
+BEGIN {
+ $| = 1;
+ fork and exit;
+ print "inner\n";
+}
+# XXX In emulated fork(), the child will not execute anything after
+# the BEGIN block, due to difficulties in recreating the parse stacks
+# and restarting yyparse() midstream in the child. This can potentially
+# be overcome by treating what's after the BEGIN{} as a brand new parse.
+#print "outer\n"
+EXPECT
+inner
+########
+sub pipe_to_fork ($$) {
+ my $parent = shift;
+ my $child = shift;
+ pipe($child, $parent) or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ close($pid ? $child : $parent);
+ $pid;
+}
+
+if (pipe_to_fork('PARENT','CHILD')) {
+ # parent
+ print PARENT "pipe_to_fork\n";
+ close PARENT;
+}
+else {
+ # child
+ while (<CHILD>) { print; }
+ close CHILD;
+ exit;
+}
+
+sub pipe_from_fork ($$) {
+ my $parent = shift;
+ my $child = shift;
+ pipe($parent, $child) or die;
+ my $pid = fork();
+ die "fork() failed: $!" unless defined $pid;
+ close($pid ? $child : $parent);
+ $pid;
+}
+
+if (pipe_from_fork('PARENT','CHILD')) {
+ # parent
+ while (<PARENT>) { print; }
+ close PARENT;
+}
+else {
+ # child
+ print CHILD "pipe_from_fork\n";
+ close CHILD;
+ exit;
+}
+EXPECT
+pipe_from_fork
+pipe_to_fork
diff --git a/contrib/perl5/t/op/glob.t b/contrib/perl5/t/op/glob.t
index 253e4a3..4c27445 100755
--- a/contrib/perl5/t/op/glob.t
+++ b/contrib/perl5/t/op/glob.t
@@ -1,6 +1,9 @@
#!./perl
-# $RCSfile: glob.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:55 $
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
print "1..6\n";
diff --git a/contrib/perl5/t/op/goto.t b/contrib/perl5/t/op/goto.t
index 8096aff..96bb8dd 100755
--- a/contrib/perl5/t/op/goto.t
+++ b/contrib/perl5/t/op/goto.t
@@ -2,7 +2,7 @@
# "This IS structured code. It's just randomly structured."
-print "1..13\n";
+print "1..16\n";
while ($?) {
$foo = 1;
@@ -30,8 +30,8 @@ print "#2\t:$foo: == 4\n";
if ($foo == 4) {print "ok 2\n";} else {print "not ok 2\n";}
$PERL = ($^O eq 'MSWin32') ? '.\perl' : './perl';
-$x = `$PERL -e "goto foo;" 2>&1`;
-if ($x =~ /DCL-W-NOCOMD/) { $x = `\$ mcr sys\$disk:[]perl. -e "goto foo;"`; }
+$CMD = qq[$PERL -e "goto foo;" 2>&1 ];
+$x = `$CMD`;
if ($x =~ /label/) {print "ok 3\n";} else {print "not ok 3\n";}
@@ -55,6 +55,27 @@ exit;
FINALE:
print "ok 13\n";
+
+# does goto LABEL handle block contexts correctly?
+
+my $cond = 1;
+for (1) {
+ if ($cond == 1) {
+ $cond = 0;
+ goto OTHER;
+ }
+ elsif ($cond == 0) {
+ OTHER:
+ $cond = 2;
+ print "ok 14\n";
+ goto THIRD;
+ }
+ else {
+ THIRD:
+ print "ok 15\n";
+ }
+}
+print "ok 16\n";
exit;
bypass:
diff --git a/contrib/perl5/t/op/goto_xs.t b/contrib/perl5/t/op/goto_xs.t
index a35575e..8d9bca1 100755
--- a/contrib/perl5/t/op/goto_xs.t
+++ b/contrib/perl5/t/op/goto_xs.t
@@ -10,7 +10,7 @@
# break correctly as well.
chdir 't' if -d 't';
-@INC = "../lib";
+unshift @INC, "../lib";
$ENV{PERL5LIB} = "../lib";
# turn warnings into fatal errors
diff --git a/contrib/perl5/t/op/grent.t b/contrib/perl5/t/op/grent.t
new file mode 100755
index 0000000..761d8b9
--- /dev/null
+++ b/contrib/perl5/t/op/grent.t
@@ -0,0 +1,139 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, "../lib" if -d "../lib";
+ eval {my @n = getgrgid 0};
+ if ($@ && $@ =~ /(The \w+ function is unimplemented)/) {
+ print "1..0 # Skip: $1\n";
+ exit 0;
+ }
+ eval { require Config; import Config; };
+ my $reason;
+ if ($Config{'i_grp'} ne 'define') {
+ $reason = '$Config{i_grp} not defined';
+ }
+ elsif (not -f "/etc/group" ) { # Play safe.
+ $reason = 'no /etc/group file';
+ }
+
+ if (not defined $where) { # Try NIS.
+ foreach my $ypcat (qw(/usr/bin/ypcat /bin/ypcat /etc/ypcat)) {
+ if (-x $ypcat &&
+ open(GR, "$ypcat group 2>/dev/null |") &&
+ defined(<GR>)) {
+ $where = "NIS group";
+ undef $reason;
+ last;
+ }
+ }
+ }
+
+ if (not defined $where) { # Try NetInfo.
+ foreach my $nidump (qw(/usr/bin/nidump)) {
+ if (-x $nidump &&
+ open(GR, "$nidump group . 2>/dev/null |") &&
+ defined(<GR>)) {
+ $where = "NetInfo group";
+ undef $reason;
+ last;
+ }
+ }
+ }
+
+ if (not defined $where) { # Try local.
+ my $GR = "/etc/group";
+ if (-f $GR && open(GR, $GR) && defined(<GR>)) {
+ undef $reason;
+ $where = $GR;
+ }
+ }
+ if ($reason) {
+ print "1..0 # Skip: $reason\n";
+ exit 0;
+ }
+}
+
+# By now GR filehandle should be open and full of juicy group entries.
+
+print "1..1\n";
+
+# Go through at most this many groups.
+# (note that the first entry has been read away by now)
+my $max = 25;
+
+my $n = 0;
+my $tst = 1;
+my %perfect;
+my %seen;
+
+while (<GR>) {
+ chomp;
+ my @s = split /:/;
+ my ($name_s,$passwd_s,$gid_s,$members_s) = @s;
+ if (@s) {
+ push @{ $seen{$name_s} }, $.;
+ } else {
+ warn "# Your $where line $. is empty.\n";
+ next;
+ }
+ if ($n == $max) {
+ local $/;
+ my $junk = <GR>;
+ last;
+ }
+ # In principle we could whine if @s != 4 but do we know enough
+ # of group file formats everywhere?
+ if (@s == 4) {
+ $members_s =~ s/\s*,\s*/,/g;
+ $members_s =~ s/\s+$//;
+ $members_s =~ s/^\s+//;
+ @n = getgrgid($gid_s);
+ # 'nogroup' et al.
+ next unless @n;
+ my ($name,$passwd,$gid,$members) = @n;
+ # Protect against one-to-many and many-to-one mappings.
+ if ($name_s ne $name) {
+ @n = getgrnam($name_s);
+ ($name,$passwd,$gid,$members) = @n;
+ next if $name_s ne $name;
+ }
+ # NOTE: group names *CAN* contain whitespace.
+ $members =~ s/\s+/,/g;
+ # what about different orders of members?
+ $perfect{$name_s}++
+ if $name eq $name_s and
+# Do not compare passwords: think shadow passwords.
+# Not that group passwords are used much but better not assume anything.
+ $gid eq $gid_s and
+ $members eq $members_s;
+ }
+ $n++;
+}
+
+if (keys %perfect == 0) {
+ $max++;
+ print <<EOEX;
+#
+# The failure of op/grent test is not necessarily serious.
+# It may fail due to local group administration conventions.
+# If you are for example using both NIS and local groups,
+# test failure is possible. Any distributed group scheme
+# can cause such failures.
+#
+# What the grent test is doing is that it compares the $max first
+# entries of $where
+# with the results of getgrgid() and getgrnam() call. If it finds no
+# matches at all, it suspects something is wrong.
+#
+EOEX
+ print "not ";
+ $not = 1;
+} else {
+ $not = 0;
+}
+print "ok ", $tst++;
+print "\t# (not necessarily serious: run t/op/grent.t by itself)" if $not;
+print "\n";
+
+close(GR);
diff --git a/contrib/perl5/t/op/grep.t b/contrib/perl5/t/op/grep.t
index 45d0e25..3a7f8ad 100755
--- a/contrib/perl5/t/op/grep.t
+++ b/contrib/perl5/t/op/grep.t
@@ -4,7 +4,7 @@
# grep() and map() tests
#
-print "1..3\n";
+print "1..27\n";
$test = 1;
@@ -29,3 +29,71 @@ sub ok {
$test++;
}
+{
+ print map({$_} ("ok $test\n"));
+ $test++;
+ print map
+ ({$_} ("ok $test\n"));
+ $test++;
+ print((map({a => $_}, ("ok $test\n")))[0]->{a});
+ $test++;
+ print((map
+ ({a=>$_},
+ ("ok $test\n")))[0]->{a});
+ $test++;
+ print map { $_ } ("ok $test\n");
+ $test++;
+ print map
+ { $_ } ("ok $test\n");
+ $test++;
+ print((map {a => $_}, ("ok $test\n"))[0]->{a});
+ $test++;
+ print((map
+ {a=>$_},
+ ("ok $test\n"))[0]->{a});
+ $test++;
+ my $x = "ok \xFF\xFF\n";
+ print map($_&$x,("ok $test\n"));
+ $test++;
+ print map
+ ($_ & $x, ("ok $test\n"));
+ $test++;
+ print map { $_ & $x } ("ok $test\n");
+ $test++;
+ print map
+ { $_&$x } ("ok $test\n");
+ $test++;
+
+ print grep({$_} ("ok $test\n"));
+ $test++;
+ print grep
+ ({$_} ("ok $test\n"));
+ $test++;
+ print grep({a => $_}->{a}, ("ok $test\n"));
+ $test++;
+ print grep
+ ({a => $_}->{a},
+ ("ok $test\n"));
+ $test++;
+ print grep { $_ } ("ok $test\n");
+ $test++;
+ print grep
+ { $_ } ("ok $test\n");
+ $test++;
+ print grep {a => $_}->{a}, ("ok $test\n");
+ $test++;
+ print grep
+ {a => $_}->{a},
+ ("ok $test\n");
+ $test++;
+ print grep($_&"X",("ok $test\n"));
+ $test++;
+ print grep
+ ($_&"X", ("ok $test\n"));
+ $test++;
+ print grep { $_ & "X" } ("ok $test\n");
+ $test++;
+ print grep
+ { $_ & "X" } ("ok $test\n");
+ $test++;
+}
diff --git a/contrib/perl5/t/op/groups.t b/contrib/perl5/t/op/groups.t
index 47aabe3..4b655c8 100755
--- a/contrib/perl5/t/op/groups.t
+++ b/contrib/perl5/t/op/groups.t
@@ -1,13 +1,101 @@
#!./perl
-if (! -x ($groups = '/usr/ucb/groups') &&
- ! -x ($groups = '/usr/bin/groups') &&
- ! -x ($groups = '/bin/groups')
-) {
- print "1..0\n";
+$ENV{PATH} ="/bin:/usr/bin:/usr/xpg4/bin:/usr/ucb" .
+ exists $ENV{PATH} ? ":$ENV{PATH}" : "";
+$ENV{LC_ALL} = "C"; # so that external utilities speak English
+$ENV{LANGUAGE} = 'C'; # GNU locale extension
+
+sub quit {
+ print "1..0 # Skip: no `id` or `groups`\n";
exit 0;
}
+quit() if $^O eq 'MSWin32' or $^O =~ /lynxos/i;
+
+# We have to find a command that prints all (effective
+# and real) group names (not ids). The known commands are:
+# groups
+# id -Gn
+# id -a
+# Beware 1: some systems do just 'id -G' even when 'id -Gn' is used.
+# Beware 2: id -Gn or id -a format might be id(name) or name(id).
+# Beware 3: the groups= might be anywhere in the id output.
+# Beware 4: groups can have spaces ('id -a' being the only defense against this)
+# Beware 5: id -a might not contain the groups= part.
+#
+# That is, we might meet the following:
+#
+# foo bar zot # accept
+# foo 22 42 bar zot # accept
+# 1 22 42 2 3 # reject
+# groups=(42),foo(1),bar(2),zot me(3) # parse
+# groups=22,42,1(foo),2(bar),3(zot me) # parse
+#
+# and the groups= might be after, before, or between uid=... and gid=...
+
+GROUPS: {
+ # prefer 'id' over 'groups' (is this ever wrong anywhere?)
+ # and 'id -a' over 'id -Gn' (the former is good about spaces in group names)
+ if (($groups = `id -a 2>/dev/null`) ne '') {
+ # $groups is of the form:
+ # uid=39957(gsar) gid=22(users) groups=33536,39181,22(users),0(root),1067(dev)
+ last GROUPS if $groups =~ /groups=/;
+ }
+ if (($groups = `id -Gn 2>/dev/null`) ne '') {
+ # $groups could be of the form:
+ # users 33536 39181 root dev
+ last GROUPS if $groups !~ /^(\d|\s)+$/;
+ }
+ if (($groups = `groups 2>/dev/null`) ne '') {
+ # may not reflect all groups in some places, so do a sanity check
+ if (-d '/afs') {
+ print <<EOM;
+# These test results *may* be bogus, as you appear to have AFS,
+# and I can't find a working 'id' in your PATH (which I have set
+# to '$ENV{PATH}').
+#
+# If these tests fail, report the particular incantation you use
+# on this platform to find *all* the groups that an arbitrary
+# luser may belong to, using the 'perlbug' program.
+EOM
+ }
+ last GROUPS;
+ }
+ # Okay, not today.
+ quit();
+}
+
+unless (eval { getgrgid(0); 1 }) {
+ print "1..0 # Skip: getgrgid() not implemented\n";
+ exit 0;
+}
+
+# Remember that group names can contain whitespace, '-', et cetera.
+# That is: do not \w, do not \S.
+if ($groups =~ /groups=(.+)( [ug]id=|$)/) {
+ my $gr = $1;
+ my @g0 = split /,/, $gr;
+ my @g1;
+ # prefer names over numbers
+ for (@g0) {
+ # 42(zot me)
+ if (/^(\d+)(?:\(([^)]+)\))?/) {
+ push @g1, ($2 || $1);
+ }
+ # zot me(42)
+ elsif (/^([^(]*)\((\d+)\)/) {
+ push @g1, ($1 || $2);
+ }
+ else {
+ print "# ignoring group entry [$_]\n";
+ }
+ }
+ print "# groups=$gr\n";
+ print "# g0 = @g0\n";
+ print "# g1 = @g1\n";
+ $groups = "@g1";
+}
+
print "1..2\n";
$pwgid = $( + 0;
@@ -27,9 +115,13 @@ for (split(' ', $()) {
}
}
-$gr1 = join(' ', sort @gr);
+if ($^O eq "uwin") { # Or anybody else who can have spaces in group names.
+ $gr1 = join(' ', grep(!$did{$_}++, sort split(' ', join(' ', @gr))));
+} else {
+ $gr1 = join(' ', sort @gr);
+}
-$gr2 = join(' ', grep(!$basegroup{$_}++, sort split(' ',`$groups`)));
+$gr2 = join(' ', grep(!$basegroup{$_}++, sort split(' ',$groups)));
if ($gr1 eq $gr2) {
print "ok 1\n";
diff --git a/contrib/perl5/t/op/gv.t b/contrib/perl5/t/op/gv.t
index c253e4b..04905cd 100755
--- a/contrib/perl5/t/op/gv.t
+++ b/contrib/perl5/t/op/gv.t
@@ -4,7 +4,14 @@
# various typeglob tests
#
-print "1..23\n";
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+use warnings;
+
+print "1..30\n";
# type coersion on assignment
$foo = 'foo';
@@ -62,7 +69,7 @@ if (defined $baa) {
# fact that %X::Y:: is stored in %X:: isn't documented.
# (I hope.)
-{ package Foo::Bar }
+{ package Foo::Bar; no warnings 'once'; $test=1; }
print exists $Foo::{'Bar::'} ? "ok 12\n" : "not ok 12\n";
print $Foo::{'Bar::'} eq '*Foo::Bar::' ? "ok 13\n" : "not ok 13\n";
@@ -77,7 +84,7 @@ print +($foo || @foo || %foo) ? "not ok" : "ok", " 14\n";
{
my $msg;
local $SIG{__WARN__} = sub { $msg = $_[0] };
- local $^W = 1;
+ use warnings;
*foo = 'bar';
print $msg ? "not ok" : "ok", " 15\n";
*foo = undef;
@@ -95,4 +102,39 @@ print *{*x{GLOB}} eq "*main::STDOUT" ? "ok 21\n" : "not ok 21\n";
print {*x{IO}} "ok 22\n";
print {*x{FILEHANDLE}} "ok 23\n";
+# test if defined() doesn't create any new symbols
+
+{
+ my $test = 23;
+
+ my $a = "SYM000";
+ print "not " if defined *{$a};
+ ++$test; print "ok $test\n";
+
+ print "not " if defined @{$a} or defined *{$a};
+ ++$test; print "ok $test\n";
+
+ print "not " if defined %{$a} or defined *{$a};
+ ++$test; print "ok $test\n";
+
+ print "not " if defined ${$a} or defined *{$a};
+ ++$test; print "ok $test\n";
+
+ print "not " if defined &{$a} or defined *{$a};
+ ++$test; print "ok $test\n";
+
+ *{$a} = sub { print "ok $test\n" };
+ print "not " unless defined &{$a} and defined *{$a};
+ ++$test; &{$a};
+}
+
+# does pp_readline() handle glob-ness correctly?
+
+{
+ my $g = *foo;
+ $g = <DATA>;
+ print $g;
+}
+__END__
+ok 30
diff --git a/contrib/perl5/t/op/hashwarn.t b/contrib/perl5/t/op/hashwarn.t
index 6343a2a..9182273 100755
--- a/contrib/perl5/t/op/hashwarn.t
+++ b/contrib/perl5/t/op/hashwarn.t
@@ -2,19 +2,18 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use strict;
+use warnings;
use vars qw{ @warnings };
BEGIN {
- $^W |= 1; # Insist upon warnings
- # ...and save 'em as we go
$SIG{'__WARN__'} = sub { push @warnings, @_ };
$| = 1;
- print "1..7\n";
+ print "1..9\n";
}
END { print "not ok\n# Uncaught warnings:\n@warnings\n" if @warnings }
@@ -66,6 +65,13 @@ my $ref_msg = '/^Reference found where even-sized list expected/';
%hash = sub { print "ok" };
test_warning 6, shift @warnings, $odd_msg;
+ my $avhv = [{x=>1,y=>2}];
+ %$avhv = (x=>13,'y');
+ test_warning 7, shift @warnings, $odd_msg;
+
+ %$avhv = 'x';
+ test_warning 8, shift @warnings, $odd_msg;
+
$_ = { 1..10 };
- test 7, ! @warnings, "Unexpected warning";
+ test 9, ! @warnings, "Unexpected warning";
}
diff --git a/contrib/perl5/t/op/inc.t b/contrib/perl5/t/op/inc.t
index e5a2a92..f59115e 100755
--- a/contrib/perl5/t/op/inc.t
+++ b/contrib/perl5/t/op/inc.t
@@ -1,9 +1,6 @@
#!./perl
-
-# $RCSfile$
-
-print "1..6\n";
+print "1..12\n";
# Verify that addition/subtraction properly upgrade to doubles.
# These tests are only significant on machines with 32 bit longs,
@@ -50,3 +47,51 @@ if ($a == -2147483649)
{print "ok 6\n"}
else
{print "not ok 6\n";}
+
+$a = 2147483648;
+$a = -$a;
+$c=$a--;
+if ($a == -2147483649)
+ {print "ok 7\n"}
+else
+ {print "not ok 7\n";}
+
+$a = 2147483648;
+$a = -$a;
+$c=--$a;
+if ($a == -2147483649)
+ {print "ok 8\n"}
+else
+ {print "not ok 8\n";}
+
+$a = 2147483648;
+$a = -$a;
+$a=$a-1;
+if ($a == -2147483649)
+ {print "ok 9\n"}
+else
+ {print "not ok 9\n";}
+
+$a = 2147483648;
+$b = -$a;
+$c=$b--;
+if ($b == -$a-1)
+ {print "ok 10\n"}
+else
+ {print "not ok 10\n";}
+
+$a = 2147483648;
+$b = -$a;
+$c=--$b;
+if ($b == -$a-1)
+ {print "ok 11\n"}
+else
+ {print "not ok 11\n";}
+
+$a = 2147483648;
+$b = -$a;
+$b=$b-1;
+if ($b == -(++$a))
+ {print "ok 12\n"}
+else
+ {print "not ok 12\n";}
diff --git a/contrib/perl5/t/op/int.t b/contrib/perl5/t/op/int.t
index eb060ac..6ac0866 100755
--- a/contrib/perl5/t/op/int.t
+++ b/contrib/perl5/t/op/int.t
@@ -1,8 +1,11 @@
#!./perl
-# $RCSfile: int.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:00 $
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
-print "1..4\n";
+print "1..6\n";
# compile time evaluation
@@ -15,3 +18,13 @@ if (int(-1.234) == -1) {print "ok 2\n";} else {print "not ok 2\n";}
$x = 1.234;
if (int($x) == 1) {print "ok 3\n";} else {print "not ok 3\n";}
if (int(-$x) == -1) {print "ok 4\n";} else {print "not ok 4\n";}
+
+$x = length("abc") % -10;
+print $x == -7 ? "ok 5\n" : "# expected -7, got $x\nnot ok 5\n";
+
+{
+ use integer;
+ $x = length("abc") % -10;
+ $y = (3/-10)*-10;
+ print $x+$y == 3 && abs($x) < 10 ? "ok 6\n" : "not ok 6\n";
+}
diff --git a/contrib/perl5/t/op/join.t b/contrib/perl5/t/op/join.t
index eec4611..def5a9e 100755
--- a/contrib/perl5/t/op/join.t
+++ b/contrib/perl5/t/op/join.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: join.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:01 $
-
-print "1..3\n";
+print "1..6\n";
@x = (1, 2, 3);
if (join(':',@x) eq '1:2:3') {print "ok 1\n";} else {print "not ok 1\n";}
@@ -10,3 +8,15 @@ if (join(':',@x) eq '1:2:3') {print "ok 1\n";} else {print "not ok 1\n";}
if (join('',1,2,3) eq '123') {print "ok 2\n";} else {print "not ok 2\n";}
if (join(':',split(/ /,"1 2 3")) eq '1:2:3') {print "ok 3\n";} else {print "not ok 3\n";}
+
+my $f = 'a';
+$f = join ',', 'b', $f, 'e';
+if ($f eq 'b,a,e') {print "ok 4\n";} else {print "# '$f'\nnot ok 4\n";}
+
+$f = 'a';
+$f = join ',', $f, 'b', 'e';
+if ($f eq 'a,b,e') {print "ok 5\n";} else {print "not ok 5\n";}
+
+$f = 'a';
+$f = join $f, 'b', 'e', 'k';
+if ($f eq 'baeak') {print "ok 6\n";} else {print "# '$f'\nnot ok 6\n";}
diff --git a/contrib/perl5/t/op/lex_assign.t b/contrib/perl5/t/op/lex_assign.t
new file mode 100755
index 0000000..2fb059d
--- /dev/null
+++ b/contrib/perl5/t/op/lex_assign.t
@@ -0,0 +1,324 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+$ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
+
+umask 0;
+$xref = \ "";
+$runme = ($^O eq 'VMS' ? 'MCR ' : '') . $^X;
+@a = (1..5);
+%h = (1..6);
+$aref = \@a;
+$href = \%h;
+open OP, qq{$runme -le "print 'aaa Ok ok' for 1..100"|};
+$chopit = 'aaaaaa';
+@chopar = (113 .. 119);
+$posstr = '123456';
+$cstr = 'aBcD.eF';
+pos $posstr = 3;
+$nn = $n = 2;
+sub subb {"in s"}
+
+@INPUT = <DATA>;
+@simple_input = grep /^\s*\w+\s*\$\w+\s*[#\n]/, @INPUT;
+print "1..", (10 + @INPUT + @simple_input), "\n";
+$ord = 0;
+
+sub wrn {"@_"}
+
+# Check correct optimization of ucfirst etc
+$ord++;
+my $a = "AB";
+my $b = "\u\L$a";
+print "not " unless $b eq 'Ab';
+print "ok $ord\n";
+
+# Check correct destruction of objects:
+my $dc = 0;
+sub A::DESTROY {$dc += 1}
+$a=8;
+my $b;
+{ my $c = 6; $b = bless \$c, "A"}
+
+$ord++;
+print "not " unless $dc == 0;
+print "ok $ord\n";
+
+$b = $a+5;
+
+$ord++;
+print "not " unless $dc == 1;
+print "ok $ord\n";
+
+$ord++;
+my $xxx = 'b';
+$xxx = 'c' . ($xxx || 'e');
+print "not " unless $xxx eq 'cb';
+print "ok $ord\n";
+
+{ # Check calling STORE
+ my $sc = 0;
+ sub B::TIESCALAR {bless [11], 'B'}
+ sub B::FETCH { -(shift->[0]) }
+ sub B::STORE { $sc++; my $o = shift; $o->[0] = 17 + shift }
+
+ my $m;
+ tie $m, 'B';
+ $m = 100;
+
+ $ord++;
+ print "not " unless $sc == 1;
+ print "ok $ord\n";
+
+ my $t = 11;
+ $m = $t + 89;
+
+ $ord++;
+ print "not " unless $sc == 2;
+ print "ok $ord\n";
+
+ $ord++;
+ print "# $m\nnot " unless $m == -117;
+ print "ok $ord\n";
+
+ $m += $t;
+
+ $ord++;
+ print "not " unless $sc == 3;
+ print "ok $ord\n";
+
+ $ord++;
+ print "# $m\nnot " unless $m == 89;
+ print "ok $ord\n";
+
+}
+
+# Chains of assignments
+
+my ($l1, $l2, $l3, $l4);
+my $zzzz = 12;
+$zzz1 = $l1 = $l2 = $zzz2 = $l3 = $l4 = 1 + $zzzz;
+
+$ord++;
+print "# $zzz1 = $l1 = $l2 = $zzz2 = $l3 = $l4 = 13\nnot "
+ unless $zzz1 == 13 and $zzz2 == 13 and $l1 == 13
+ and $l2 == 13 and $l3 == 13 and $l4 == 13;
+print "ok $ord\n";
+
+for (@INPUT) {
+ $ord++;
+ ($op, undef, $comment) = /^([^\#]+)(\#\s+(.*))?/;
+ $comment = $op unless defined $comment;
+ $op = "$op==$op" unless $op =~ /==/;
+ ($op, $expectop) = $op =~ /(.*)==(.*)/;
+
+ $skip = ($op =~ /^'\?\?\?'/ or $comment =~ /skip\(.*\Q$^O\E.*\)/i)
+ ? "skip" : "not";
+ $integer = ($comment =~ /^i_/) ? "use integer" : '' ;
+ (print "#skipping $comment:\nok $ord\n"), next if $skip eq 'skip';
+
+ eval <<EOE;
+ local \$SIG{__WARN__} = \\&wrn;
+ my \$a = 'fake';
+ $integer;
+ \$a = $op;
+ \$b = $expectop;
+ if (\$a ne \$b) {
+ print "# \$comment: got `\$a', expected `\$b'\n";
+ print "\$skip " if \$a ne \$b or \$skip eq 'skip';
+ }
+ print "ok \$ord\\n";
+EOE
+ if ($@) {
+ if ($@ =~ /is unimplemented/) {
+ print "# skipping $comment: unimplemented:\nok $ord\n";
+ } else {
+ warn $@;
+ print "not ok $ord\n";
+ }
+ }
+}
+
+for (@simple_input) {
+ $ord++;
+ ($op, undef, $comment) = /^([^\#]+)(\#\s+(.*))?/;
+ $comment = $op unless defined $comment;
+ ($operator, $variable) = /^\s*(\w+)\s*\$(\w+)/ or warn "misprocessed '$_'\n";
+ eval <<EOE;
+ local \$SIG{__WARN__} = \\&wrn;
+ my \$$variable = "Ac# Ca\\nxxx";
+ \$$variable = $operator \$$variable;
+ \$toself = \$$variable;
+ \$direct = $operator "Ac# Ca\\nxxx";
+ print "# \\\$$variable = $operator \\\$$variable\\nnot "
+ unless \$toself eq \$direct;
+ print "ok \$ord\\n";
+EOE
+ if ($@) {
+ if ($@ =~ /is unimplemented/) {
+ print "# skipping $comment: unimplemented:\nok $ord\n";
+ } elsif ($@ =~ /Can't (modify|take log of 0)/) {
+ print "# skipping $comment: syntax not good for selfassign:\nok $ord\n";
+ } else {
+ warn $@;
+ print "not ok $ord\n";
+ }
+ }
+}
+__END__
+ref $xref # ref
+ref $cstr # ref nonref
+`$runme -e "print qq[1\n]"` # backtick skip(MSWin32)
+`$undefed` # backtick undef skip(MSWin32)
+<*> # glob
+<OP> # readline
+'faked' # rcatline
+(@z = (1 .. 3)) # aassign
+chop $chopit # chop
+(chop (@x=@chopar)) # schop
+chomp $chopit # chomp
+(chop (@x=@chopar)) # schomp
+pos $posstr # pos
+pos $chopit # pos returns undef
+$nn++==2 # postinc
+$nn++==3 # i_postinc
+$nn--==4 # postdec
+$nn--==3 # i_postdec
+$n ** $n # pow
+$n * $n # multiply
+$n * $n # i_multiply
+$n / $n # divide
+$n / $n # i_divide
+$n % $n # modulo
+$n % $n # i_modulo
+$n x $n # repeat
+$n + $n # add
+$n + $n # i_add
+$n - $n # subtract
+$n - $n # i_subtract
+$n . $n # concat
+$n . $a=='2fake' # concat with self
+"3$a"=='3fake' # concat with self in stringify
+"$n" # stringify
+$n << $n # left_shift
+$n >> $n # right_shift
+$n <=> $n # ncmp
+$n <=> $n # i_ncmp
+$n cmp $n # scmp
+$n & $n # bit_and
+$n ^ $n # bit_xor
+$n | $n # bit_or
+-$n # negate
+-$n # i_negate
+~$n # complement
+atan2 $n,$n # atan2
+sin $n # sin
+cos $n # cos
+'???' # rand
+exp $n # exp
+log $n # log
+sqrt $n # sqrt
+int $n # int
+hex $n # hex
+oct $n # oct
+abs $n # abs
+length $posstr # length
+substr $posstr, 2, 2 # substr
+vec("abc",2,8) # vec
+index $posstr, 2 # index
+rindex $posstr, 2 # rindex
+sprintf "%i%i", $n, $n # sprintf
+ord $n # ord
+chr $n # chr
+crypt $n, $n # crypt
+ucfirst ($cstr . "a") # ucfirst padtmp
+ucfirst $cstr # ucfirst
+lcfirst $cstr # lcfirst
+uc $cstr # uc
+lc $cstr # lc
+quotemeta $cstr # quotemeta
+@$aref # rv2av
+@$undefed # rv2av undef
+each %h==1 # each
+values %h # values
+keys %h # keys
+%$href # rv2hv
+pack "C2", $n,$n # pack
+split /a/, "abad" # split
+join "a"; @a # join
+push @a,3==6 # push
+unshift @aaa # unshift
+reverse @a # reverse
+reverse $cstr # reverse - scal
+grep $_, 1,0,2,0,3 # grepwhile
+map "x$_", 1,0,2,0,3 # mapwhile
+subb() # entersub
+caller # caller
+warn "ignore this\n" # warn
+'faked' # die
+open BLAH, "<non-existent" # open
+fileno STDERR # fileno
+umask 0 # umask
+select STDOUT # sselect
+select "","","",0 # select
+getc OP # getc
+'???' # read
+'???' # sysread
+'???' # syswrite
+'???' # send
+'???' # recv
+'???' # tell
+'???' # fcntl
+'???' # ioctl
+'???' # flock
+'???' # accept
+'???' # shutdown
+'???' # ftsize
+'???' # ftmtime
+'???' # ftatime
+'???' # ftctime
+chdir 'non-existent' # chdir
+'???' # chown
+'???' # chroot
+unlink 'non-existent' # unlink
+chmod 'non-existent' # chmod
+utime 'non-existent' # utime
+rename 'non-existent', 'non-existent1' # rename
+link 'non-existent', 'non-existent1' # link
+'???' # symlink
+readlink 'non-existent', 'non-existent1' # readlink
+'???' # mkdir
+'???' # rmdir
+'???' # telldir
+'???' # fork
+'???' # wait
+'???' # waitpid
+system "$runme -e 0" # system skip(VMS)
+'???' # exec
+'???' # kill
+getppid # getppid
+getpgrp # getpgrp
+'???' # setpgrp
+getpriority $$, $$ # getpriority
+'???' # setpriority
+time # time
+localtime $^T # localtime
+gmtime $^T # gmtime
+sleep 1 # sleep
+'???' # alarm
+'???' # shmget
+'???' # shmctl
+'???' # shmread
+'???' # shmwrite
+'???' # msgget
+'???' # msgctl
+'???' # msgsnd
+'???' # msgrcv
+'???' # semget
+'???' # semctl
+'???' # semop
+'???' # getlogin
+'???' # syscall
diff --git a/contrib/perl5/t/op/lfs.t b/contrib/perl5/t/op/lfs.t
new file mode 100755
index 0000000..e704f6f
--- /dev/null
+++ b/contrib/perl5/t/op/lfs.t
@@ -0,0 +1,226 @@
+# NOTE: this file tests how large files (>2GB) work with perlio (stdio/sfio).
+# sysopen(), sysseek(), syswrite(), sysread() are tested in t/lib/syslfs.t.
+# If you modify/add tests here, remember to update also t/lib/syslfs.t.
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ # Don't bother if there are no quad offsets.
+ require Config; import Config;
+ if ($Config{lseeksize} < 8) {
+ print "1..0\n# no 64-bit file offsets\n";
+ exit(0);
+ }
+}
+
+sub zap {
+ close(BIG);
+ unlink("big");
+ unlink("big1");
+ unlink("big2");
+}
+
+sub bye {
+ zap();
+ exit(0);
+}
+
+sub explain {
+ print <<EOM;
+#
+# If the lfs (large file support: large meaning larger than two gigabytes)
+# tests are skipped or fail, it may mean either that your process
+# (or process group) is not allowed to write large files (resource
+# limits) or that the file system you are running the tests on doesn't
+# let your user/group have large files (quota) or the filesystem simply
+# doesn't support large files. You may even need to reconfigure your kernel.
+# (This is all very operating system and site-dependent.)
+#
+# Perl may still be able to support large files, once you have
+# such a process, enough quota, and such a (file) system.
+#
+EOM
+}
+
+print "# checking whether we have sparse files...\n";
+
+# Known have-nots.
+if ($^O eq 'win32' || $^O eq 'vms') {
+ print "1..0\n# no sparse files (because this is $^O) \n";
+ bye();
+}
+
+# Known haves that have problems running this test
+# (for example because they do not support sparse files, like UNICOS)
+if ($^O eq 'unicos') {
+ print "1..0\n# large files known to work but unable to test them here ($^O)\n";
+ bye();
+}
+
+# Then try to heuristically deduce whether we have sparse files.
+
+# Let's not depend on Fcntl or any other extension.
+
+my ($SEEK_SET, $SEEK_CUR, $SEEK_END) = (0, 1, 2);
+
+# We'll start off by creating a one megabyte file which has
+# only three "true" bytes. If we have sparseness, we should
+# consume less blocks than one megabyte (assuming nobody has
+# one megabyte blocks...)
+
+open(BIG, ">big1") or
+ do { warn "open big1 failed: $!\n"; bye };
+binmode(BIG) or
+ do { warn "binmode big1 failed: $!\n"; bye };
+seek(BIG, 1_000_000, $SEEK_SET) or
+ do { warn "seek big1 failed: $!\n"; bye };
+print BIG "big" or
+ do { warn "print big1 failed: $!\n"; bye };
+close(BIG) or
+ do { warn "close big1 failed: $!\n"; bye };
+
+my @s1 = stat("big1");
+
+print "# s1 = @s1\n";
+
+open(BIG, ">big2") or
+ do { warn "open big2 failed: $!\n"; bye };
+binmode(BIG) or
+ do { warn "binmode big2 failed: $!\n"; bye };
+seek(BIG, 2_000_000, $SEEK_SET) or
+ do { warn "seek big2 failed; $!\n"; bye };
+print BIG "big" or
+ do { warn "print big2 failed; $!\n"; bye };
+close(BIG) or
+ do { warn "close big2 failed; $!\n"; bye };
+
+my @s2 = stat("big2");
+
+print "# s2 = @s2\n";
+
+zap();
+
+unless ($s1[7] == 1_000_003 && $s2[7] == 2_000_003 &&
+ $s1[11] == $s2[11] && $s1[12] == $s2[12]) {
+ print "1..0\n#no sparse files?\n";
+ bye;
+}
+
+print "# we seem to have sparse files...\n";
+
+# By now we better be sure that we do have sparse files:
+# if we are not, the following will hog 5 gigabytes of disk. Ooops.
+
+$ENV{LC_ALL} = "C";
+
+open(BIG, ">big") or do { warn "open failed: $!\n"; bye };
+binmode BIG;
+unless (seek(BIG, 5_000_000_000, $SEEK_SET)) {
+ print "1..0\n# seeking past 2GB failed: $!\n";
+ explain();
+ bye();
+}
+
+# Either the print or (more likely, thanks to buffering) the close will
+# fail if there are are filesize limitations (process or fs).
+my $print = print BIG "big";
+print "# print failed: $!\n" unless $print;
+my $close = close BIG;
+print "# close failed: $!\n" unless $close;
+unless ($print && $close) {
+ if ($! =~/too large/i) {
+ print "1..0\n# writing past 2GB failed: process limits?\n";
+ } elsif ($! =~ /quota/i) {
+ print "1..0\n# filesystem quota limits?\n";
+ }
+ explain();
+ bye();
+}
+
+@s = stat("big");
+
+print "# @s\n";
+
+unless ($s[7] == 5_000_000_003) {
+ print "1..0\n# not configured to use large files?\n";
+ explain();
+ bye();
+}
+
+sub fail () {
+ print "not ";
+ $fail++;
+}
+
+print "1..17\n";
+
+my $fail = 0;
+
+fail unless $s[7] == 5_000_000_003; # exercizes pp_stat
+print "ok 1\n";
+
+fail unless -s "big" == 5_000_000_003; # exercizes pp_ftsize
+print "ok 2\n";
+
+fail unless -e "big";
+print "ok 3\n";
+
+fail unless -f "big";
+print "ok 4\n";
+
+open(BIG, "big") or do { warn "open failed: $!\n"; bye };
+binmode BIG;
+
+fail unless seek(BIG, 4_500_000_000, $SEEK_SET);
+print "ok 5\n";
+
+fail unless tell(BIG) == 4_500_000_000;
+print "ok 6\n";
+
+fail unless seek(BIG, 1, $SEEK_CUR);
+print "ok 7\n";
+
+fail unless tell(BIG) == 4_500_000_001;
+print "ok 8\n";
+
+fail unless seek(BIG, -1, $SEEK_CUR);
+print "ok 9\n";
+
+fail unless tell(BIG) == 4_500_000_000;
+print "ok 10\n";
+
+fail unless seek(BIG, -3, $SEEK_END);
+print "ok 11\n";
+
+fail unless tell(BIG) == 5_000_000_000;
+print "ok 12\n";
+
+my $big;
+
+fail unless read(BIG, $big, 3) == 3;
+print "ok 13\n";
+
+fail unless $big eq "big";
+print "ok 14\n";
+
+# 705_032_704 = (I32)5_000_000_000
+fail unless seek(BIG, 705_032_704, $SEEK_SET);
+print "ok 15\n";
+
+my $zero;
+
+fail unless read(BIG, $zero, 3) == 3;
+print "ok 16\n";
+
+fail unless $zero eq "\0\0\0";
+print "ok 17\n";
+
+explain if $fail;
+
+bye(); # does the necessary cleanup
+
+END {
+ unlink "big"; # be paranoid about leaving 5 gig files lying around
+}
+
+# eof
diff --git a/contrib/perl5/t/op/list.t b/contrib/perl5/t/op/list.t
index a4230b6..4d7a2d5 100755
--- a/contrib/perl5/t/op/list.t
+++ b/contrib/perl5/t/op/list.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: list.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:02 $
-
-print "1..27\n";
+print "1..28\n";
@foo = (1, 2, 3, 4);
if ($foo[0] == 1 && $foo[3] == 4) {print "ok 1\n";} else {print "not ok 1\n";}
@@ -81,3 +79,11 @@ for ($x = 0; $x < 3; $x++) {
print $a,$b,$c;
}
+# slices
+{
+ my @a = (0, undef, undef, 3);
+ my @b = @a[1,2];
+ my @c = (0, undef, undef, 3)[1, 2];
+ print "not " unless @b == @c and @c == 2;
+ print "ok 28\n";
+}
diff --git a/contrib/perl5/t/op/lop.t b/contrib/perl5/t/op/lop.t
new file mode 100755
index 0000000..f15201f
--- /dev/null
+++ b/contrib/perl5/t/op/lop.t
@@ -0,0 +1,44 @@
+#!./perl
+
+#
+# test the logical operators '&&', '||', '!', 'and', 'or', 'not'
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+print "1..7\n";
+
+my $test = 0;
+for my $i (undef, 0 .. 2, "", "0 but true") {
+ my $true = 1;
+ my $false = 0;
+ for my $j (undef, 0 .. 2, "", "0 but true") {
+ $true &&= !(
+ ((!$i || !$j) != !($i && $j))
+ or (!($i || $j) != (!$i && !$j))
+ or (!!($i || $j) != !(!$i && !$j))
+ or (!(!$i || !$j) != !!($i && $j))
+ );
+ $false ||= (
+ ((!$i || !$j) == !!($i && $j))
+ and (!!($i || $j) == (!$i && !$j))
+ and ((!$i || $j) == ($i && !$j))
+ and (($i || !$j) != (!$i && $j))
+ );
+ }
+ if (not $true) {
+ print "not ";
+ } elsif ($false) {
+ print "not ";
+ }
+ print "ok ", ++$test, "\n";
+}
+
+# $test == 6
+my $i = 0;
+(($i ||= 1) &&= 3) += 4;
+print "not " unless $i == 7;
+print "ok ", ++$test, "\n";
diff --git a/contrib/perl5/t/op/magic.t b/contrib/perl5/t/op/magic.t
index 7f08e06..7739276 100755
--- a/contrib/perl5/t/op/magic.t
+++ b/contrib/perl5/t/op/magic.t
@@ -1,13 +1,14 @@
#!./perl
BEGIN {
- $^W = 1;
$| = 1;
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
$SIG{__WARN__} = sub { die "Dying on warning: ", @_ };
}
+use warnings;
+
sub ok {
my ($n, $result, $info) = @_;
if ($result) {
@@ -22,6 +23,8 @@ sub ok {
$Is_MSWin32 = $^O eq 'MSWin32';
$Is_VMS = $^O eq 'VMS';
$Is_Dos = $^O eq 'dos';
+$Is_os2 = $^O eq 'os2';
+$Is_Cygwin = $^O eq 'cygwin';
$PERL = ($Is_MSWin32 ? '.\perl' : './perl');
print "1..35\n";
@@ -111,6 +114,14 @@ ok 18, $$ > 0, $$;
if ($^O eq 'qnx') {
chomp($wd = `/usr/bin/fullpath -t`);
}
+ elsif($Is_Cygwin) {
+ # Cygwin turns the symlink into the real file
+ chomp($wd = `pwd`);
+ $wd =~ s#/t$##;
+ }
+ elsif($Is_os2) {
+ $wd = Cwd::sys_cwd();
+ }
else {
$wd = '.';
}
@@ -120,8 +131,9 @@ ok 18, $$ > 0, $$;
$script = "$wd/show-shebang";
if ($Is_MSWin32) {
chomp($wd = `cd`);
- $perl = "$wd\\perl.exe";
- $script = "$wd\\show-shebang.bat";
+ $wd =~ s|\\|/|g;
+ $perl = "$wd/perl.exe";
+ $script = "$wd/show-shebang.bat";
$headmaybe = <<EOH ;
\@rem ='
\@echo off
@@ -135,13 +147,16 @@ __END__
:endofperl
EOT
}
- if ($^O eq 'os390') { # no shebang
+ elsif ($Is_os2) {
+ $script = "./show-shebang";
+ }
+ if ($^O eq 'os390' or $^O eq 'posix-bc' or $^O eq 'vmesa') { # no shebang
$headmaybe = <<EOH ;
eval 'exec ./perl -S \$0 \${1+"\$\@"}'
if 0;
EOH
}
- $s1 = $s2 = "\$^X is $perl, \$0 is $script\n";
+ $s1 = "\$^X is $perl, \$0 is $script\n";
ok 19, open(SCRIPT, ">$script"), $!;
ok 20, print(SCRIPT $headmaybe . <<EOB . <<'EOF' . $tailmaybe), $!;
#!$wd/perl
@@ -151,13 +166,15 @@ EOF
ok 21, close(SCRIPT), $!;
ok 22, chmod(0755, $script), $!;
$_ = `$script`;
- s/.exe//i if $Is_Dos;
+ s/\.exe//i if $Is_Dos or $Is_Cygwin or $Is_os2;
s{\bminiperl\b}{perl}; # so that test doesn't fail with miniperl
s{is perl}{is $perl}; # for systems where $^X is only a basename
- ok 23, ($Is_MSWin32 ? uc($_) eq uc($s2) : $_ eq $s2), ":$_:!=:$s2:";
+ s{\\}{/}g;
+ ok 23, (($Is_MSWin32 || $Is_os2) ? uc($_) eq uc($s1) : $_ eq $s1), " :$_:!=:$s1:";
$_ = `$perl $script`;
- s/.exe//i if $Is_Dos;
- ok 24, ($Is_MSWin32 ? uc($_) eq uc($s1) : $_ eq $s1), ":$_:!=:$s1: after `$perl $script`";
+ s/\.exe//i if $Is_Dos or $Is_os2;
+ s{\\}{/}g;
+ ok 24, (($Is_MSWin32 || $Is_os2) ? uc($_) eq uc($s1) : $_ eq $s1), " :$_:!=:$s1: after `$perl $script`";
ok 25, unlink($script), $!;
}
@@ -185,7 +202,7 @@ else {
}
{
- local $SIG{'__WARN__'} = sub { print "not " };
+ local $SIG{'__WARN__'} = sub { print "# @_\nnot " };
$! = undef;
print "ok 31\n";
}
@@ -202,8 +219,8 @@ if ($Is_MSWin32) {
ok 35, (scalar(keys(%ENV)) == 0);
}
else {
- ok "32 # skipped",1;
- ok "33 # skipped",1;
- ok "34 # skipped",1;
- ok "35 # skipped",1;
+ ok "32 # skipped: no caseless %ENV support",1;
+ ok "33 # skipped: no caseless %ENV support",1;
+ ok "34 # skipped: no caseless %ENV support",1;
+ ok "35 # skipped: no caseless %ENV support",1;
}
diff --git a/contrib/perl5/t/op/method.t b/contrib/perl5/t/op/method.t
index f1b1888..1c6f3c5 100755
--- a/contrib/perl5/t/op/method.t
+++ b/contrib/perl5/t/op/method.t
@@ -4,7 +4,7 @@
# test method calls and autoloading.
#
-print "1..26\n";
+print "1..49\n";
@A::ISA = 'B';
@B::ISA = 'C';
@@ -19,6 +19,35 @@ sub test {
print "ok ", ++$cnt, "\n"
}
+# First, some basic checks of method-calling syntax:
+$obj = bless [], "Pack";
+sub Pack::method { shift; join(",", "method", @_) }
+$mname = "method";
+
+test(Pack->method("a","b","c"), "method,a,b,c");
+test(Pack->$mname("a","b","c"), "method,a,b,c");
+test(method Pack ("a","b","c"), "method,a,b,c");
+test((method Pack "a","b","c"), "method,a,b,c");
+
+test(Pack->method(), "method");
+test(Pack->$mname(), "method");
+test(method Pack (), "method");
+test(Pack->method, "method");
+test(Pack->$mname, "method");
+test(method Pack, "method");
+
+test($obj->method("a","b","c"), "method,a,b,c");
+test($obj->$mname("a","b","c"), "method,a,b,c");
+test((method $obj ("a","b","c")), "method,a,b,c");
+test((method $obj "a","b","c"), "method,a,b,c");
+
+test($obj->method(), "method");
+test($obj->$mname(), "method");
+test((method $obj ()), "method");
+test($obj->method, "method");
+test($obj->$mname, "method");
+test(method $obj, "method");
+
test( A->d, "C::d"); # Update hash table;
*B::d = \&D::d; # Import now.
@@ -126,3 +155,15 @@ test(A->eee(), "new B: In A::eee, 4"); # Which sticks
# this test added due to bug discovery
test(defined(@{"unknown_package::ISA"}) ? "defined" : "undefined", "undefined");
+
+# test that failed subroutine calls don't affect method calls
+{
+ package A1;
+ sub foo { "foo" }
+ package A2;
+ @ISA = 'A1';
+ package main;
+ test(A2->foo(), "foo");
+ test(do { eval 'A2::foo()'; $@ ? 1 : 0}, 1);
+ test(A2->foo(), "foo");
+}
diff --git a/contrib/perl5/t/op/misc.t b/contrib/perl5/t/op/misc.t
index c9050ef..ac1a44f 100755
--- a/contrib/perl5/t/op/misc.t
+++ b/contrib/perl5/t/op/misc.t
@@ -4,7 +4,7 @@
# separate executable and can't simply use eval.
chdir 't' if -d 't';
-@INC = "../lib";
+unshift @INC, "../lib";
$ENV{PERL5LIB} = "../lib";
$|=1;
@@ -25,22 +25,25 @@ for (@prgs){
$switch = $1;
}
my($prog,$expected) = split(/\nEXPECT\n/, $_);
+ open TEST, ">$tmpfile" or die "Cannot open $tmpfile: $!";
+ print TEST $prog, "\n";
+ close TEST or die "Cannot close $tmpfile: $!";
+
if ($^O eq 'MSWin32') {
- open TEST, "| .\\perl -I../lib $switch >$tmpfile 2>&1";
+ $results = `.\\perl -I../lib $switch $tmpfile 2>&1`;
}
else {
- open TEST, "| sh -c './perl $switch' >$tmpfile 2>&1";
+ $results = `./perl $switch $tmpfile 2>&1`;
}
- print TEST $prog, "\n";
- close TEST;
$status = $?;
- $results = `$CAT $tmpfile`;
$results =~ s/\n+$//;
+ $results =~ s/at\s+misctmp\d+\s+line/at - line/g;
+ $results =~ s/of\s+misctmp\d+\s+aborted/of - aborted/g;
# bison says 'parse error' instead of 'syntax error',
# various yaccs may or may not capitalize 'syntax'.
$results =~ s/^(syntax|parse) error/syntax error/mig;
$expected =~ s/\n+$//;
- if ( $results ne $expected){
+ if ( $results ne $expected ) {
print STDERR "PROG: $switch\n$prog\n";
print STDERR "EXPECTED:\n$expected\n";
print STDERR "GOT:\n$results\n";
@@ -56,11 +59,12 @@ $a = ":="; split /($a)/o, "a:=b:=c"; print "@_"
EXPECT
a := b := c
########
+use integer;
$cusp = ~0 ^ (~0 >> 1);
$, = " ";
print +($cusp - 1) % 8, $cusp % 8, -$cusp % 8, ($cusp + 1) % 8, "!\n";
EXPECT
-7 0 0 1 !
+-1 0 0 1 !
########
$foo=undef; $foo->go;
EXPECT
@@ -77,7 +81,7 @@ $x=0x0eabcd; print $x->ref;
EXPECT
Can't call method "ref" without a package or object reference at - line 1.
########
-chop ($str .= <STDIN>);
+chop ($str .= <DATA>);
########
close ($banana);
########
@@ -89,7 +93,7 @@ eval {sub bar {print "In bar";}}
########
system './perl -ne "print if eof" /dev/null'
########
-chop($file = <>);
+chop($file = <DATA>);
########
package N;
sub new {my ($obj,$n)=@_; bless \$n}
@@ -101,7 +105,7 @@ EXPECT
########
%@x=0;
EXPECT
-Can't modify hash deref in repeat at - line 1, near "0;"
+Can't modify hash dereference in repeat (x) at - line 1, near "0;"
Execution of - aborted due to compilation errors.
########
$_="foo";
@@ -346,20 +350,22 @@ Sequence (?{...}) not terminated or not {}-balanced at - line 1, within pattern
########
/(?{"{"}})/ # Check it outside of eval too
EXPECT
-Unmatched right bracket at (re_eval 1) line 1, at end of line
+Unmatched right curly bracket at (re_eval 1) line 1, at end of line
syntax error at (re_eval 1) line 1, near ""{"}"
Compilation failed in regexp at - line 1.
########
-BEGIN { @ARGV = qw(a b c) }
+BEGIN { @ARGV = qw(a b c d e) }
BEGIN { print "argv <@ARGV>\nbegin <",shift,">\n" }
END { print "end <",shift,">\nargv <@ARGV>\n" }
INIT { print "init <",shift,">\n" }
+CHECK { print "check <",shift,">\n" }
EXPECT
-argv <a b c>
+argv <a b c d e>
begin <a>
-init <b>
-end <c>
-argv <>
+check <b>
+init <c>
+end <d>
+argv <e>
########
-l
# fdopen from a system descriptor to a system descriptor used to close
@@ -433,6 +439,54 @@ foo
bar
BEGIN failed--compilation aborted at - line 8.
########
+package X;
+@ISA='Y';
+sub new {
+ my $class = shift;
+ my $self = { };
+ bless $self, $class;
+ my $init = shift;
+ $self->foo($init);
+ print "new", $init;
+ return $self;
+}
+sub DESTROY {
+ my $self = shift;
+ print "DESTROY", $self->foo;
+}
+package Y;
+sub attribute {
+ my $self = shift;
+ my $var = shift;
+ if (@_ == 0) {
+ return $self->{$var};
+ } elsif (@_ == 1) {
+ $self->{$var} = shift;
+ }
+}
+sub AUTOLOAD {
+ $AUTOLOAD =~ /::([^:]+)$/;
+ my $method = $1;
+ splice @_, 1, 0, $method;
+ goto &attribute;
+}
+package main;
+my $x = X->new(1);
+for (2..3) {
+ my $y = X->new($_);
+ print $y->foo;
+}
+print $x->foo;
+EXPECT
+new1new22DESTROY2new33DESTROY31DESTROY1
+########
+re();
+sub re {
+ my $re = join '', eval 'qr/(??{ $obj->method })/';
+ $re;
+}
+EXPECT
+########
use strict;
my $foo = "ZZZ\n";
END { print $foo }
@@ -446,3 +500,48 @@ END { print $foo }
';
EXPECT
ZZZ
+########
+-w
+if (@ARGV) { print "" }
+else {
+ if ($x == 0) { print "" } else { print $x }
+}
+EXPECT
+Use of uninitialized value in numeric eq (==) at - line 4.
+########
+$x = sub {};
+foo();
+sub foo { eval { return }; }
+print "ok\n";
+EXPECT
+ok
+########
+my @l = qw(hello.* world);
+my $x;
+
+foreach $x (@l) {
+ print "before - $x\n";
+ $x = "\Q$x\E";
+ print "quotemeta - $x\n";
+ $x = "\u$x";
+ print "ucfirst - $x\n";
+ $x = "\l$x";
+ print "lcfirst - $x\n";
+ $x = "\U$x\E";
+ print "uc - $x\n";
+ $x = "\L$x\E";
+ print "lc - $x\n";
+}
+EXPECT
+before - hello.*
+quotemeta - hello\.\*
+ucfirst - Hello\.\*
+lcfirst - hello\.\*
+uc - HELLO\.\*
+lc - hello\.\*
+before - world
+quotemeta - world
+ucfirst - World
+lcfirst - world
+uc - WORLD
+lc - world
diff --git a/contrib/perl5/t/op/mkdir.t b/contrib/perl5/t/op/mkdir.t
index acf16c1..cf8e55d 100755
--- a/contrib/perl5/t/op/mkdir.t
+++ b/contrib/perl5/t/op/mkdir.t
@@ -1,18 +1,25 @@
#!./perl
-# $RCSfile: mkdir.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:06 $
+print "1..9\n";
-print "1..7\n";
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
-$^O eq 'MSWin32' ? `del /s /q blurfl 2>&1` : `rm -rf blurfl`;
+use File::Path;
+rmtree('blurfl');
# tests 3 and 7 rather naughtily expect English error messages
$ENV{'LC_ALL'} = 'C';
+$ENV{LANGUAGE} = 'C'; # GNU locale extension
print (mkdir('blurfl',0777) ? "ok 1\n" : "not ok 1\n");
print (mkdir('blurfl',0777) ? "not ok 2\n" : "ok 2\n");
-print ($! =~ /exist|denied/ ? "ok 3\n" : "# $!\nnot ok 3\n");
+print ($! =~ /cannot move|exist|denied/ ? "ok 3\n" : "# $!\nnot ok 3\n");
print (-d 'blurfl' ? "ok 4\n" : "not ok 4\n");
print (rmdir('blurfl') ? "ok 5\n" : "not ok 5\n");
print (rmdir('blurfl') ? "not ok 6\n" : "ok 6\n");
-print ($! =~ /such|exist|not found/i ? "ok 7\n" : "not ok 7\n");
+print ($! =~ /cannot find|such|exist|not found/i ? "ok 7\n" : "# $!\nnot ok 7\n");
+print (mkdir('blurfl') ? "ok 8\n" : "not ok 8\n");
+print (rmdir('blurfl') ? "ok 9\n" : "not ok 9\n");
diff --git a/contrib/perl5/t/op/nothr5005.t b/contrib/perl5/t/op/nothr5005.t
new file mode 100755
index 0000000..fd36e2e
--- /dev/null
+++ b/contrib/perl5/t/op/nothr5005.t
@@ -0,0 +1,35 @@
+#!./perl
+
+# NOTE: Please don't add tests to this file unless they *need* to be run in
+# separate executable and can't simply use eval.
+
+BEGIN
+ {
+ chdir 't' if -d 't';
+ unshift @INC, "../lib";
+ require Config;
+ import Config;
+ if ($Config{'use5005threads'})
+ {
+ print "1..0 # Skip: this perl is threaded\n";
+ exit 0;
+ }
+ }
+
+
+$|=1;
+
+print "1..9\n";
+$t = 1;
+sub foo { local(@_) = ('p', 'q', 'r'); }
+sub bar { unshift @_, 'D'; @_ }
+sub baz { push @_, 'E'; return @_ }
+for (1..3)
+ {
+ print "not " unless join('',foo('a', 'b', 'c')) eq 'pqr';
+ print "ok ",$t++,"\n";
+ print "not" unless join('',bar('d')) eq 'Dd';
+ print "ok ",$t++,"\n";
+ print "not" unless join('',baz('e')) eq 'eE';
+ print "ok ",$t++,"\n";
+ }
diff --git a/contrib/perl5/t/op/numconvert.t b/contrib/perl5/t/op/numconvert.t
new file mode 100755
index 0000000..8eb9b6e
--- /dev/null
+++ b/contrib/perl5/t/op/numconvert.t
@@ -0,0 +1,186 @@
+#!./perl
+
+#
+# test the conversion operators
+#
+# Notations:
+#
+# "N p i N vs N N": Apply op-N, then op-p, then op-i, then reporter-N
+# Compare with application of op-N, then reporter-N
+# Right below are descriptions of different ops and reporters.
+
+# We do not use these subroutines any more, sub overhead makes a "switch"
+# solution better:
+
+# obviously, 0, 1 and 2, 3 are destructive. (XXXX 64-bit? 4 destructive too)
+
+# *0 = sub {--$_[0]}; # -
+# *1 = sub {++$_[0]}; # +
+
+# # Converters
+# *2 = sub { $_[0] = $max_uv & $_[0]}; # U
+# *3 = sub { use integer; $_[0] += $zero}; # I
+# *4 = sub { $_[0] += $zero}; # N
+# *5 = sub { $_[0] = "$_[0]" }; # P
+
+# # Side effects
+# *6 = sub { $max_uv & $_[0]}; # u
+# *7 = sub { use integer; $_[0] + $zero}; # i
+# *8 = sub { $_[0] + $zero}; # n
+# *9 = sub { $_[0] . "" }; # p
+
+# # Reporters
+# sub a2 { sprintf "%u", $_[0] } # U
+# sub a3 { sprintf "%d", $_[0] } # I
+# sub a4 { sprintf "%g", $_[0] } # N
+# sub a5 { "$_[0]" } # P
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+use strict 'vars';
+
+my $max_chain = $ENV{PERL_TEST_NUMCONVERTS} || 2;
+
+# Bulk out if unsigned type is hopelessly wrong:
+my $max_uv1 = ~0;
+my $max_uv2 = sprintf "%u", $max_uv1 ** 6; # 6 is an arbitrary number here
+my $big_iv = do {use integer; $max_uv1 * 16}; # 16 is an arbitrary number here
+
+print "# max_uv1 = $max_uv1, max_uv2 = $max_uv2, big_iv = $big_iv\n";
+if ($max_uv1 ne $max_uv2 or $big_iv > $max_uv1) {
+ print "1..0\n# Unsigned arithmetic is not sane\n";
+ exit 0;
+}
+
+my $st_t = 4*4; # We try 4 initializers and 4 reporters
+
+my $num = 0;
+$num += 10**$_ - 4**$_ for 1.. $max_chain;
+$num *= $st_t;
+print "1..$num\n"; # In fact 15 times more subsubtests...
+
+my $max_uv = ~0;
+my $max_iv = int($max_uv/2);
+my $zero = 0;
+
+my $l_uv = length $max_uv;
+my $l_iv = length $max_iv;
+
+# Hope: the first digits are good
+my $larger_than_uv = substr 97 x 100, 0, $l_uv;
+my $smaller_than_iv = substr 12 x 100, 0, $l_iv;
+my $yet_smaller_than_iv = substr 97 x 100, 0, ($l_iv - 1);
+
+my @list = (1, $yet_smaller_than_iv, $smaller_than_iv, $max_iv, $max_iv + 1,
+ $max_uv, $max_uv + 1);
+unshift @list, (reverse map -$_, @list), 0; # 15 elts
+@list = map "$_", @list; # Normalize
+
+# print "@list\n";
+
+
+my @opnames = split //, "-+UINPuinp";
+
+# @list = map { 2->($_), 3->($_), 4->($_), 5->($_), } @list; # Prepare input
+
+#print "@list\n";
+#print "'@ops'\n";
+
+my $test = 1;
+my $nok;
+for my $num_chain (1..$max_chain) {
+ my @ops = map [split //], grep /[4-9]/,
+ map { sprintf "%0${num_chain}d", $_ } 0 .. 10**$num_chain - 1;
+
+ #@ops = ([]) unless $num_chain;
+ #@ops = ([6, 4]);
+
+ # print "'@ops'\n";
+ for my $op (@ops) {
+ for my $first (2..5) {
+ for my $last (2..5) {
+ $nok = 0;
+ my @otherops = grep $_ <= 3, @$op;
+ my @curops = ($op,\@otherops);
+
+ for my $num (@list) {
+ my $inpt;
+ my @ans;
+
+ for my $short (0, 1) {
+ # undef $inpt; # Forget all we had - some bugs were masked
+
+ $inpt = $num; # Try to not contaminate $num...
+ $inpt = "$inpt";
+ if ($first == 2) {
+ $inpt = $max_uv & $inpt; # U 2
+ } elsif ($first == 3) {
+ use integer; $inpt += $zero; # I 3
+ } elsif ($first == 4) {
+ $inpt += $zero; # N 4
+ } else {
+ $inpt = "$inpt"; # P 5
+ }
+
+ # Saves 20% of time - not with this logic:
+ #my $tmp = $inpt;
+ #my $tmp1 = $num;
+ #next if $num_chain > 1
+ # and "$tmp" ne "$tmp1"; # Already the coercion gives problems...
+
+ for my $curop (@{$curops[$short]}) {
+ if ($curop < 5) {
+ if ($curop < 3) {
+ if ($curop == 0) {
+ --$inpt; # - 0
+ } elsif ($curop == 1) {
+ ++$inpt; # + 1
+ } else {
+ $inpt = $max_uv & $inpt; # U 2
+ }
+ } elsif ($curop == 3) {
+ use integer; $inpt += $zero;
+ } else {
+ $inpt += $zero; # N 4
+ }
+ } elsif ($curop < 8) {
+ if ($curop == 5) {
+ $inpt = "$inpt"; # P 5
+ } elsif ($curop == 6) {
+ $max_uv & $inpt; # u 6
+ } else {
+ use integer; $inpt + $zero;
+ }
+ } elsif ($curop == 8) {
+ $inpt + $zero; # n 8
+ } else {
+ $inpt . ""; # p 9
+ }
+ }
+
+ if ($last == 2) {
+ $inpt = sprintf "%u", $inpt; # U 2
+ } elsif ($last == 3) {
+ $inpt = sprintf "%d", $inpt; # I 3
+ } elsif ($last == 4) {
+ $inpt = sprintf "%g", $inpt; # N 4
+ } else {
+ $inpt = "$inpt"; # P 5
+ }
+ push @ans, $inpt;
+ }
+ $nok++,
+ print "# '$ans[0]' ne '$ans[1]',\t$num\t=> @opnames[$first,@{$curops[0]},$last] vs @opnames[$first,@{$curops[1]},$last]\n"
+ if $ans[0] ne $ans[1];
+ }
+ print "not " if $nok;
+ print "ok $test\n";
+ #print $txt if $nok;
+ $test++;
+ }
+ }
+ }
+}
diff --git a/contrib/perl5/t/op/oct.t b/contrib/perl5/t/op/oct.t
index 6623089..27ac5aa 100755
--- a/contrib/perl5/t/op/oct.t
+++ b/contrib/perl5/t/op/oct.t
@@ -1,13 +1,53 @@
#!./perl
-print "1..9\n";
-
-print +(oct('01234') == 01234) ? "ok" : "not ok", " 1\n";
-print +(oct('0x1234') == 0x1234) ? "ok" : "not ok", " 2\n";
-print +(hex('01234') == 0x1234) ? "ok" : "not ok", " 3\n";
-print +(oct('20000000000') == 020000000000) ? "ok" : "not ok", " 4\n";
-print +(oct('x80000000') == 0x80000000) ? "ok" : "not ok", " 5\n";
-print +(hex('80000000') == 0x80000000) ? "ok" : "not ok", " 6\n";
-print +(oct('1234') == 668) ? "ok" : "not ok", " 7\n";
-print +(hex('1234') == 4660) ? "ok" : "not ok", " 8\n";
-print +(hex('0x1234') == 0x1234) ? "ok" : "not ok", " 9\n";
+print "1..36\n";
+
+print +(oct('0b10101') == 0b10101) ? "ok" : "not ok", " 1\n";
+print +(oct('0b10101') == 025) ? "ok" : "not ok", " 2\n";
+print +(oct('0b10101') == 21) ? "ok" : "not ok", " 3\n";
+print +(oct('0b10101') == 0x15) ? "ok" : "not ok", " 4\n";
+
+print +(oct('b10101') == 0b10101) ? "ok" : "not ok", " 5\n";
+print +(oct('b10101') == 025) ? "ok" : "not ok", " 6\n";
+print +(oct('b10101') == 21) ? "ok" : "not ok", " 7\n";
+print +(oct('b10101') == 0x15) ? "ok" : "not ok", " 8\n";
+
+print +(oct('01234') == 0b1010011100) ? "ok" : "not ok", " 9\n";
+print +(oct('01234') == 01234) ? "ok" : "not ok", " 10\n";
+print +(oct('01234') == 668) ? "ok" : "not ok", " 11\n";
+print +(oct('01234') == 0x29c) ? "ok" : "not ok", " 12\n";
+
+print +(oct('0x1234') == 0b1001000110100) ? "ok" : "not ok", " 13\n";
+print +(oct('0x1234') == 011064) ? "ok" : "not ok", " 14\n";
+print +(oct('0x1234') == 4660) ? "ok" : "not ok", " 15\n";
+print +(oct('0x1234') == 0x1234) ? "ok" : "not ok", " 16\n";
+
+print +(oct('x1234') == 0b1001000110100) ? "ok" : "not ok", " 17\n";
+print +(oct('x1234') == 011064) ? "ok" : "not ok", " 18\n";
+print +(oct('x1234') == 4660) ? "ok" : "not ok", " 19\n";
+print +(oct('x1234') == 0x1234) ? "ok" : "not ok", " 20\n";
+
+print +(hex('01234') == 0b1001000110100) ? "ok" : "not ok", " 21\n";
+print +(hex('01234') == 011064) ? "ok" : "not ok", " 22\n";
+print +(hex('01234') == 4660) ? "ok" : "not ok", " 23\n";
+print +(hex('01234') == 0x1234) ? "ok" : "not ok", " 24\n";
+
+print +(hex('0x1234') == 0b1001000110100) ? "ok" : "not ok", " 25\n";
+print +(hex('0x1234') == 011064) ? "ok" : "not ok", " 26\n";
+print +(hex('0x1234') == 4660) ? "ok" : "not ok", " 27\n";
+print +(hex('0x1234') == 0x1234) ? "ok" : "not ok", " 28\n";
+
+print +(hex('x1234') == 0b1001000110100) ? "ok" : "not ok", " 29\n";
+print +(hex('x1234') == 011064) ? "ok" : "not ok", " 30\n";
+print +(hex('x1234') == 4660) ? "ok" : "not ok", " 31\n";
+print +(hex('x1234') == 0x1234) ? "ok" : "not ok", " 32\n";
+
+print +(oct('0b11111111111111111111111111111111') == 4294967295) ?
+ "ok" : "not ok", " 33\n";
+print +(oct('037777777777') == 4294967295) ?
+ "ok" : "not ok", " 34\n";
+print +(oct('0xffffffff') == 4294967295) ?
+ "ok" : "not ok", " 35\n";
+
+print +(hex('0xffffffff') == 4294967295) ?
+ "ok" : "not ok", " 36\n";
diff --git a/contrib/perl5/t/op/ord.t b/contrib/perl5/t/op/ord.t
index ba943f4..22ff3af 100755
--- a/contrib/perl5/t/op/ord.t
+++ b/contrib/perl5/t/op/ord.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: ord.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:09 $
-
-print "1..3\n";
+print "1..5\n";
# compile time evaluation
@@ -10,9 +8,16 @@ print "1..3\n";
# 193 EBCDIC
if (ord('A') == 65 || ord('A') == 193) {print "ok 1\n";} else {print "not ok 1\n";}
+print "not " unless ord(chr(500)) == 500;
+print "ok 2\n";
+
# run time evaluation
$x = 'ABC';
-if (ord($x) == 65 || ord($x) == 193) {print "ok 2\n";} else {print "not ok 2\n";}
+if (ord($x) == 65 || ord($x) == 193) {print "ok 3\n";} else {print "not ok 3\n";}
+
+if (chr 65 eq 'A' || chr 193 eq 'A') {print "ok 4\n";} else {print "not ok 4\n";}
-if (chr 65 == 'A' || chr 193 == 'A') {print "ok 3\n";} else {print "not ok 3\n";}
+$x = 500;
+print "not " unless ord(chr($x)) == $x;
+print "ok 5\n";
diff --git a/contrib/perl5/t/op/pack.t b/contrib/perl5/t/op/pack.t
index 902fc28..b336cb5 100755
--- a/contrib/perl5/t/op/pack.t
+++ b/contrib/perl5/t/op/pack.t
@@ -6,7 +6,7 @@ BEGIN {
require Config; import Config;
}
-print "1..142\n";
+print "1..156\n";
$format = "c2 x5 C C x s d i l a6";
# Need the expression in here to force ary[5] to be numeric. This avoids
@@ -19,7 +19,10 @@ print ($#ary == $#ary2 ? "ok 1\n" : "not ok 1\n");
$out1=join(':',@ary);
$out2=join(':',@ary2);
-print ($out1 eq $out2 ? "ok 2\n" : "not ok 2\n");
+# Using long double NVs may introduce greater accuracy than wanted.
+$out1 =~ s/:9\.87654321097999\d*:/:9.87654321098:/;
+$out2 =~ s/:9\.87654321097999\d*:/:9.87654321098:/;
+print ($out1 eq $out2? "ok 2\n" : "not ok 2\n");
print ($foo =~ /def/ ? "ok 3\n" : "not ok 3\n");
@@ -95,7 +98,7 @@ print((unpack("p",pack("p",$test)) == $test ? "ok " : "not ok "),$test++,"\n");
# temps
sub foo { my $a = "a"; return $a . $a++ . $a++ }
{
- local $^W = 1;
+ use warnings;
my $last = $test;
local $SIG{__WARN__} = sub {
print "ok ",$test++,"\n" if $_[0] =~ /temporary val/
@@ -208,7 +211,7 @@ EOUU
print "not " unless unpack('u', $uu) eq $in;
print "ok ", $test++, "\n";
-# 61..72: test the ascii template types (A, a, Z)
+# 61..73: test the ascii template types (A, a, Z)
print "not " unless pack('A*', "foo\0bar\0 ") eq "foo\0bar\0 ";
print "ok ", $test++, "\n";
@@ -234,115 +237,116 @@ print "ok ", $test++, "\n";
print "not " unless unpack('a8', "foo\0bar \0") eq "foo\0bar ";
print "ok ", $test++, "\n";
-print "not " unless pack('Z*', "foo\0bar\0 ") eq "foo\0bar\0 ";
+print "not " unless pack('Z*', "foo\0bar\0 ") eq "foo\0bar\0 \0";
print "ok ", $test++, "\n";
print "not " unless pack('Z11', "foo\0bar\0 ") eq "foo\0bar\0 \0\0";
print "ok ", $test++, "\n";
+print "not " unless pack('Z3', "foo") eq "fo\0";
+print "ok ", $test++, "\n";
+
print "not " unless unpack('Z*', "foo\0bar \0") eq "foo";
print "ok ", $test++, "\n";
print "not " unless unpack('Z8', "foo\0bar \0") eq "foo";
print "ok ", $test++, "\n";
-# 73..78: packing native shorts/ints/longs
+# 74..79: packing native shorts/ints/longs
-# integrated from mainline and don't want to change numbers all the way
-# down. native ints are not supported in _0x so comment out checks
-#print "not " unless length(pack("s!", 0)) == $Config{shortsize};
+print "not " unless length(pack("s!", 0)) == $Config{shortsize};
print "ok ", $test++, "\n";
-#print "not " unless length(pack("i!", 0)) == $Config{intsize};
+print "not " unless length(pack("i!", 0)) == $Config{intsize};
print "ok ", $test++, "\n";
-#print "not " unless length(pack("l!", 0)) == $Config{longsize};
+print "not " unless length(pack("l!", 0)) == $Config{longsize};
print "ok ", $test++, "\n";
-#print "not " unless length(pack("s!", 0)) <= length(pack("i!", 0));
+print "not " unless length(pack("s!", 0)) <= length(pack("i!", 0));
print "ok ", $test++, "\n";
-#print "not " unless length(pack("i!", 0)) <= length(pack("l!", 0));
+print "not " unless length(pack("i!", 0)) <= length(pack("l!", 0));
print "ok ", $test++, "\n";
-#print "not " unless length(pack("i!", 0)) == length(pack("i", 0));
+print "not " unless length(pack("i!", 0)) == length(pack("i", 0));
print "ok ", $test++, "\n";
-# 79..138: pack <-> unpack bijectionism
+# 80..139: pack <-> unpack bijectionism
-# 79.. 83 c
+# 80.. 84 c
foreach my $c (-128, -1, 0, 1, 127) {
print "not " unless unpack("c", pack("c", $c)) == $c;
print "ok ", $test++, "\n";
}
-# 84.. 88: C
+# 85.. 89: C
foreach my $C (0, 1, 127, 128, 255) {
print "not " unless unpack("C", pack("C", $C)) == $C;
print "ok ", $test++, "\n";
}
-# 89.. 93: s
+# 90.. 94: s
foreach my $s (-32768, -1, 0, 1, 32767) {
print "not " unless unpack("s", pack("s", $s)) == $s;
print "ok ", $test++, "\n";
}
-# 94.. 98: S
+# 95.. 99: S
foreach my $S (0, 1, 32767, 32768, 65535) {
print "not " unless unpack("S", pack("S", $S)) == $S;
print "ok ", $test++, "\n";
}
-# 99..103: i
+# 100..104: i
foreach my $i (-2147483648, -1, 0, 1, 2147483647) {
print "not " unless unpack("i", pack("i", $i)) == $i;
print "ok ", $test++, "\n";
}
-# 104..108: I
+# 105..109: I
foreach my $I (0, 1, 2147483647, 2147483648, 4294967295) {
print "not " unless unpack("I", pack("I", $I)) == $I;
print "ok ", $test++, "\n";
}
-# 109..113: l
+# 110..114: l
foreach my $l (-2147483648, -1, 0, 1, 2147483647) {
print "not " unless unpack("l", pack("l", $l)) == $l;
print "ok ", $test++, "\n";
}
-# 114..118: L
+# 115..119: L
foreach my $L (0, 1, 2147483647, 2147483648, 4294967295) {
print "not " unless unpack("L", pack("L", $L)) == $L;
print "ok ", $test++, "\n";
}
-# 119..123: n
+# 120..124: n
foreach my $n (0, 1, 32767, 32768, 65535) {
print "not " unless unpack("n", pack("n", $n)) == $n;
print "ok ", $test++, "\n";
}
-# 124..128: v
+# 125..129: v
foreach my $v (0, 1, 32767, 32768, 65535) {
print "not " unless unpack("v", pack("v", $v)) == $v;
print "ok ", $test++, "\n";
}
-# 129..133: N
+# 130..134: N
foreach my $N (0, 1, 2147483647, 2147483648, 4294967295) {
print "not " unless unpack("N", pack("N", $N)) == $N;
print "ok ", $test++, "\n";
}
-# 134..138: V
+# 135..139: V
foreach my $V (0, 1, 2147483647, 2147483648, 4294967295) {
print "not " unless unpack("V", pack("V", $V)) == $V;
print "ok ", $test++, "\n";
}
-# 139..142: pack nvNV byteorders
+# 140..143: pack nvNV byteorders
print "not " unless pack("n", 0xdead) eq "\xde\xad";
print "ok ", $test++, "\n";
@@ -355,3 +359,49 @@ print "ok ", $test++, "\n";
print "not " unless pack("V", 0xdeadbeef) eq "\xef\xbe\xad\xde";
print "ok ", $test++, "\n";
+
+# 144..152: /
+
+my $z;
+eval { ($x) = unpack '/a*','hello' };
+print 'not ' unless $@; print "ok $test\n"; $test++;
+eval { ($z,$x,$y) = unpack 'a3/A C/a* C/Z', "003ok \003yes\004z\000abc" };
+print $@ eq '' && $z eq 'ok' ? "ok $test\n" : "not ok $test\n"; $test++;
+print $@ eq '' && $x eq 'yes' ? "ok $test\n" : "not ok $test\n"; $test++;
+print $@ eq '' && $y eq 'z' ? "ok $test\n" : "not ok $test\n"; $test++;
+
+eval { ($x) = pack '/a*','hello' };
+print 'not ' unless $@; print "ok $test\n"; $test++;
+$z = pack 'n/a* w/A*','string','etc';
+print 'not ' unless $z eq "\000\006string\003etc"; print "ok $test\n"; $test++;
+
+eval { ($x) = unpack 'a/a*/a*', '212ab345678901234567' };
+print $@ eq '' && $x eq 'ab3456789012' ? "ok $test\n" : "#$x,$@\nnot ok $test\n";
+$test++;
+
+eval { ($x) = unpack 'a/a*/a*', '3012ab345678901234567' };
+print $@ eq '' && $x eq 'ab3456789012' ? "ok $test\n" : "not ok $test\n";
+$test++;
+
+eval { ($x) = unpack 'a/a*/b*', '212ab' };
+my $expected_x = '100001100100';
+if ($Config{ebcdic} eq 'define') { $expected_x = '100000010100'; }
+print $@ eq '' && $x eq $expected_x ? "ok $test\n" : "#$x,$@\nnot ok $test\n";
+$test++;
+
+# 153..156: / with #
+
+eval { ($z,$x,$y) = unpack <<EOU, "003ok \003yes\004z\000abc" };
+ a3/A # Count in ASCII
+ C/a* # Count in a C char
+ C/Z # Count in a C char but skip after \0
+EOU
+print $@ eq '' && $z eq 'ok' ? "ok $test\n" : "not ok $test\n"; $test++;
+print $@ eq '' && $x eq 'yes' ? "ok $test\n" : "not ok $test\n"; $test++;
+print $@ eq '' && $y eq 'z' ? "ok $test\n" : "not ok $test\n"; $test++;
+
+$z = pack <<EOP,'string','etc';
+ n/a* # Count as network short
+ w/A* # Count a BER integer
+EOP
+print 'not ' unless $z eq "\000\006string\003etc"; print "ok $test\n"; $test++;
diff --git a/contrib/perl5/t/op/pat.t b/contrib/perl5/t/op/pat.t
index ed8c778..188a3a3 100755
--- a/contrib/perl5/t/op/pat.t
+++ b/contrib/perl5/t/op/pat.t
@@ -4,11 +4,11 @@
# the format supported by op/regexp.t. If you want to add a test
# that does fit that format, add it to op/re_tests, not here.
-print "1..142\n";
+print "1..211\n";
BEGIN {
chdir 't' if -d 't';
- @INC = "../lib" if -d "../lib";
+ unshift @INC, "../lib" if -d "../lib";
}
eval 'use Config'; # Defaults assumed if this fails
@@ -282,14 +282,7 @@ eval qq("${context}y" =~ /(?<=$context)y/);
print "not " if $@ !~ m%^\Q/(?<=\Ex+/: lookbehind longer than 255 not%;
print "ok 71\n";
-# This one will fail when POSIX character classes do get implemented
-{
- my $w;
- local $^W = 1;
- local $SIG{__WARN__} = sub{$w = shift};
- eval q('a' =~ /[[:alpha:]]/);
- print "not " if $w !~ /^\QCharacter class syntax [: :] is reserved/;
-}
+# removed test
print "ok 72\n";
# Long Monsters
@@ -363,6 +356,7 @@ sub matchit {
/xg;
}
+@ans = ();
push @ans, $res while $res = matchit;
print "# ans='@ans'\n# expect='$expect'\nnot " if "@ans" ne "1 1 1";
@@ -375,6 +369,30 @@ print "# ans='@ans'\n# expect='$expect'\nnot " if "@ans" ne $expect;
print "ok $test\n";
$test++;
+print "not " unless "abc" =~ /^(??{"a"})b/;
+print "ok $test\n";
+$test++;
+
+my $matched;
+$matched = qr/\((?:(?>[^()]+)|(??{$matched}))*\)/;
+
+@ans = @ans1 = ();
+push(@ans, $res), push(@ans1, $&) while $res = m/$matched/g;
+
+print "# ans='@ans'\n# expect='$expect'\nnot " if "@ans" ne "1 1 1";
+print "ok $test\n";
+$test++;
+
+print "# ans1='@ans1'\n# expect='$expect'\nnot " if "@ans1" ne $expect;
+print "ok $test\n";
+$test++;
+
+@ans = m/$matched/g;
+
+print "# ans='@ans'\n# expect='$expect'\nnot " if "@ans" ne $expect;
+print "ok $test\n";
+$test++;
+
@ans = ('a/b' =~ m%(.*/)?(.*)%); # Stack may be bad
print "not " if "@ans" ne 'a/ b';
print "ok $test\n";
@@ -555,8 +573,8 @@ sub must_warn_pat {
sub must_warn {
my ($warn_pat, $code) = @_;
- local $^W; local %SIG;
- eval 'BEGIN { $^W = 1; $SIG{__WARN__} = $warn_pat };' . $code;
+ local %SIG;
+ eval 'BEGIN { use warnings; $SIG{__WARN__} = $warn_pat };' . $code;
print "ok $test\n";
$test++;
}
@@ -595,8 +613,385 @@ print "not " if @_;
print "ok $test\n";
$test++;
+/a(?=.$)/;
+print "not " if $#+ != 0 or $#- != 0;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[0] != 2 or $-[0] != 1;
+print "ok $test\n";
+$test++;
+
+print "not "
+ if defined $+[1] or defined $-[1] or defined $+[2] or defined $-[2];
+print "ok $test\n";
+$test++;
+
+/a(a)(a)/;
+print "not " if $#+ != 2 or $#- != 2;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[0] != 3 or $-[0] != 0;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[1] != 2 or $-[1] != 1;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[2] != 3 or $-[2] != 2;
+print "ok $test\n";
+$test++;
+
+print "not "
+ if defined $+[3] or defined $-[3] or defined $+[4] or defined $-[4];
+print "ok $test\n";
+$test++;
+
+/.(a)(b)?(a)/;
+print "not " if $#+ != 3 or $#- != 3;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[0] != 3 or $-[0] != 0;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[1] != 2 or $-[1] != 1;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[3] != 3 or $-[3] != 2;
+print "ok $test\n";
+$test++;
+
+print "not "
+ if defined $+[2] or defined $-[2] or defined $+[4] or defined $-[4];
+print "ok $test\n";
+$test++;
+
+/.(a)/;
+print "not " if $#+ != 1 or $#- != 1;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[0] != 2 or $-[0] != 0;
+print "ok $test\n";
+$test++;
+
+print "not " if $+[1] != 2 or $-[1] != 1;
+print "ok $test\n";
+$test++;
+
+print "not "
+ if defined $+[2] or defined $-[2] or defined $+[3] or defined $-[3];
+print "ok $test\n";
+$test++;
+
+/.(a)(ba*)?/;
+print "#$#-..$#+\nnot " if $#+ != 2 or $#- != 1;
+print "ok $test\n";
+$test++;
+
+$_ = 'aaa';
+pos = 1;
+@a = /\Ga/g;
+print "not " unless "@a" eq "a a";
+print "ok $test\n";
+$test++;
+
+$str = 'abcde';
+pos $str = 2;
+
+print "not " if $str =~ /^\G/;
+print "ok $test\n";
+$test++;
+
+print "not " if $str =~ /^.\G/;
+print "ok $test\n";
+$test++;
+
+print "not " unless $str =~ /^..\G/;
+print "ok $test\n";
+$test++;
+
+print "not " if $str =~ /^...\G/;
+print "ok $test\n";
+$test++;
+
+print "not " unless $str =~ /.\G./ and $& eq 'bc';
+print "ok $test\n";
+$test++;
+
+print "not " unless $str =~ /\G../ and $& eq 'cd';
+print "ok $test\n";
+$test++;
+
+undef $foo; undef $bar;
+print "#'$str','$foo','$bar'\nnot "
+ unless $str =~ /b(?{$foo = $_; $bar = pos})c/
+ and $foo eq 'abcde' and $bar eq 2;
+print "ok $test\n";
+$test++;
+
+undef $foo; undef $bar;
+pos $str = undef;
+print "#'$str','$foo','$bar'\nnot "
+ unless $str =~ /b(?{$foo = $_; $bar = pos})c/g
+ and $foo eq 'abcde' and $bar eq 2 and pos $str eq 3;
+print "ok $test\n";
+$test++;
+
+$_ = $str;
+
+undef $foo; undef $bar;
+print "#'$str','$foo','$bar'\nnot "
+ unless /b(?{$foo = $_; $bar = pos})c/
+ and $foo eq 'abcde' and $bar eq 2;
+print "ok $test\n";
+$test++;
+
+undef $foo; undef $bar;
+print "#'$str','$foo','$bar'\nnot "
+ unless /b(?{$foo = $_; $bar = pos})c/g
+ and $foo eq 'abcde' and $bar eq 2 and pos eq 3;
+print "ok $test\n";
+$test++;
+
+undef $foo; undef $bar;
+pos = undef;
+1 while /b(?{$foo = $_; $bar = pos})c/g;
+print "#'$str','$foo','$bar'\nnot "
+ unless $foo eq 'abcde' and $bar eq 2 and not defined pos;
+print "ok $test\n";
+$test++;
+
+undef $foo; undef $bar;
+$_ = 'abcde|abcde';
+print "#'$str','$foo','$bar','$_'\nnot "
+ unless s/b(?{$foo = $_; $bar = pos})c/x/g and $foo eq 'abcde|abcde'
+ and $bar eq 8 and $_ eq 'axde|axde';
+print "ok $test\n";
+$test++;
+
+@res = ();
+# List context:
+$_ = 'abcde|abcde';
+@dummy = /([ace]).(?{push @res, $1,$2})([ce])(?{push @res, $1,$2})/g;
+@res = map {defined $_ ? "'$_'" : 'undef'} @res;
+$res = "@res";
+print "#'@res' '$_'\nnot "
+ unless "@res" eq "'a' undef 'a' 'c' 'e' undef 'a' undef 'a' 'c'";
+print "ok $test\n";
+$test++;
+
+@res = ();
+@dummy = /([ace]).(?{push @res, $`,$&,$'})([ce])(?{push @res, $`,$&,$'})/g;
+@res = map {defined $_ ? "'$_'" : 'undef'} @res;
+$res = "@res";
+print "#'@res' '$_'\nnot "
+ unless "@res" eq
+ "'' 'ab' 'cde|abcde' " .
+ "'' 'abc' 'de|abcde' " .
+ "'abcd' 'e|' 'abcde' " .
+ "'abcde|' 'ab' 'cde' " .
+ "'abcde|' 'abc' 'de'" ;
+print "ok $test\n";
+$test++;
+
+#Some more \G anchor checks
+$foo='aabbccddeeffgg';
+
+pos($foo)=1;
+
+$foo=~/.\G(..)/g;
+print "not " unless($1 eq 'ab');
+print "ok $test\n";
+$test++;
+
+pos($foo) += 1;
+$foo=~/.\G(..)/g;
+print "not " unless($1 eq 'cc');
+print "ok $test\n";
+$test++;
+
+pos($foo) += 1;
+$foo=~/.\G(..)/g;
+print "not " unless($1 eq 'de');
+print "ok $test\n";
+$test++;
+
+print "not " unless $foo =~ /\Gef/g;
+print "ok $test\n";
+$test++;
+
+undef pos $foo;
+
+$foo=~/\G(..)/g;
+print "not " unless($1 eq 'aa');
+print "ok $test\n";
+$test++;
+
+$foo=~/\G(..)/g;
+print "not " unless($1 eq 'bb');
+print "ok $test\n";
+$test++;
+
+pos($foo)=5;
+$foo=~/\G(..)/g;
+print "not " unless($1 eq 'cd');
+print "ok $test\n";
+$test++;
+
+$_='123x123';
+@res = /(\d*|x)/g;
+print "not " unless('123||x|123|' eq join '|', @res);
+print "ok $test\n";
+$test++;
+
# see if matching against temporaries (created via pp_helem()) is safe
{ foo => "ok $test\n".$^X }->{foo} =~ /^(.*)\n/g;
print "$1\n";
$test++;
+# See if $i work inside (?{}) in the presense of saved substrings and
+# changing $_
+@a = qw(foo bar);
+@b = ();
+s/(\w)(?{push @b, $1})/,$1,/g for @a;
+
+print "# \@b='@b', expect 'f o o b a r'\nnot " unless("@b" eq "f o o b a r");
+print "ok $test\n";
+$test++;
+
+print "not " unless("@a" eq ",f,,o,,o, ,b,,a,,r,");
+print "ok $test\n";
+$test++;
+
+$brackets = qr{
+ { (?> [^{}]+ | (??{ $brackets }) )* }
+ }x;
+
+"{{}" =~ $brackets;
+print "ok $test\n"; # Did we survive?
+$test++;
+
+"something { long { and } hairy" =~ $brackets;
+print "ok $test\n"; # Did we survive?
+$test++;
+
+"something { long { and } hairy" =~ m/((??{ $brackets }))/;
+print "not " unless $1 eq "{ and }";
+print "ok $test\n";
+$test++;
+
+$_ = "a-a\nxbb";
+pos=1;
+m/^-.*bb/mg and print "not ";
+print "ok $test\n";
+$test++;
+
+$text = "aaXbXcc";
+pos($text)=0;
+$text =~ /\GXb*X/g and print 'not ';
+print "ok $test\n";
+$test++;
+
+$text = "xA\n" x 500;
+$text =~ /^\s*A/m and print 'not ';
+print "ok $test\n";
+$test++;
+
+$text = "abc dbf";
+@res = ($text =~ /.*?(b).*?\b/g);
+"@res" eq 'b b' or print 'not ';
+print "ok $test\n";
+$test++;
+
+@a = map chr,0..255;
+
+@b = grep(/\S/,@a);
+@c = grep(/[^\s]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\S/,@a);
+@c = grep(/[\S]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\s/,@a);
+@c = grep(/[^\S]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\s/,@a);
+@c = grep(/[\s]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\D/,@a);
+@c = grep(/[^\d]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\D/,@a);
+@c = grep(/[\D]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\d/,@a);
+@c = grep(/[^\D]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\d/,@a);
+@c = grep(/[\d]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\W/,@a);
+@c = grep(/[^\w]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\W/,@a);
+@c = grep(/[\W]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\w/,@a);
+@c = grep(/[^\W]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+@b = grep(/\w/,@a);
+@c = grep(/[\w]/,@a);
+print "not " if "@b" ne "@c";
+print "ok $test\n";
+$test++;
+
+# see if backtracking optimization works correctly
+"\n\n" =~ /\n $ \n/x or print "not ";
+print "ok $test\n";
+$test++;
+
+"\n\n" =~ /\n* $ \n/x or print "not ";
+print "ok $test\n";
+$test++;
+
+"\n\n" =~ /\n+ $ \n/x or print "not ";
+print "ok $test\n";
+$test++;
diff --git a/contrib/perl5/t/op/pwent.t b/contrib/perl5/t/op/pwent.t
new file mode 100755
index 0000000..ca14a99
--- /dev/null
+++ b/contrib/perl5/t/op/pwent.t
@@ -0,0 +1,137 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, "../lib" if -d "../lib";
+ eval {my @n = getpwuid 0};
+ if ($@ && $@ =~ /(The \w+ function is unimplemented)/) {
+ print "1..0 # Skip: $1\n";
+ exit 0;
+ }
+ eval { require Config; import Config; };
+ my $reason;
+ if ($Config{'i_pwd'} ne 'define') {
+ $reason = '$Config{i_pwd} undefined';
+ }
+ elsif (not -f "/etc/passwd" ) { # Play safe.
+ $reason = 'no /etc/passwd file';
+ }
+
+ if (not defined $where) { # Try NIS.
+ foreach my $ypcat (qw(/usr/bin/ypcat /bin/ypcat /etc/ypcat)) {
+ if (-x $ypcat &&
+ open(PW, "$ypcat passwd 2>/dev/null |") &&
+ defined(<PW>)) {
+ $where = "NIS passwd";
+ undef $reason;
+ last;
+ }
+ }
+ }
+
+ if (not defined $where) { # Try NetInfo.
+ foreach my $nidump (qw(/usr/bin/nidump)) {
+ if (-x $nidump &&
+ open(PW, "$nidump passwd . 2>/dev/null |") &&
+ defined(<PW>)) {
+ $where = "NetInfo passwd";
+ undef $reason;
+ last;
+ }
+ }
+ }
+
+ if (not defined $where) { # Try local.
+ my $PW = "/etc/passwd";
+ if (-f $PW && open(PW, $PW) && defined(<PW>)) {
+ $where = $PW;
+ undef $reason;
+ }
+ }
+
+ if ($reason) { # Give up.
+ print "1..0 # Skip: $reason\n";
+ exit 0;
+ }
+}
+
+# By now PW filehandle should be open and full of juicy password entries.
+
+print "1..1\n";
+
+# Go through at most this many users.
+# (note that the first entry has been read away by now)
+my $max = 25;
+
+my $n = 0;
+my $tst = 1;
+my %perfect;
+my %seen;
+
+while (<PW>) {
+ chomp;
+ my @s = split /:/;
+ my ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s;
+ next if /^\+/; # ignore NIS includes
+ if (@s) {
+ push @{ $seen{$name_s} }, $.;
+ } else {
+ warn "# Your $where line $. is empty.\n";
+ next;
+ }
+ if ($n == $max) {
+ local $/;
+ my $junk = <PW>;
+ last;
+ }
+ # In principle we could whine if @s != 7 but do we know enough
+ # of passwd file formats everywhere?
+ if (@s == 7) {
+ @n = getpwuid($uid_s);
+ # 'nobody' et al.
+ next unless @n;
+ my ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$home,$shell) = @n;
+ # Protect against one-to-many and many-to-one mappings.
+ if ($name_s ne $name) {
+ @n = getpwnam($name_s);
+ ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$home,$shell) = @n;
+ next if $name_s ne $name;
+ }
+ $perfect{$name_s}++
+ if $name eq $name_s and
+ $uid eq $uid_s and
+# Do not compare passwords: think shadow passwords.
+ $gid eq $gid_s and
+ $gcos eq $gcos_s and
+ $home eq $home_s and
+ $shell eq $shell_s;
+ }
+ $n++;
+}
+
+if (keys %perfect == 0) {
+ $max++;
+ print <<EOEX;
+#
+# The failure of op/pwent test is not necessarily serious.
+# It may fail due to local password administration conventions.
+# If you are for example using both NIS and local passwords,
+# test failure is possible. Any distributed password scheme
+# can cause such failures.
+#
+# What the pwent test is doing is that it compares the $max first
+# entries of $where
+# with the results of getpwuid() and getpwnam() call. If it finds no
+# matches at all, it suspects something is wrong.
+#
+EOEX
+ print "not ";
+ $not = 1;
+} else {
+ $not = 0;
+}
+print "ok ", $tst++;
+print "\t# (not necessarily serious: run t/op/pwent.t by itself)" if $not;
+print "\n";
+
+close(PW);
diff --git a/contrib/perl5/t/op/quotemeta.t b/contrib/perl5/t/op/quotemeta.t
index 913e07c..60e5b7b 100755
--- a/contrib/perl5/t/op/quotemeta.t
+++ b/contrib/perl5/t/op/quotemeta.t
@@ -1,8 +1,14 @@
#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ require Config; import Config;
+}
+
print "1..15\n";
-if ($^O eq 'os390') { # An EBCDIC variant.
+if ($Config{ebcdic} eq 'define') {
$_=join "", map chr($_), 129..233;
# 105 characters - 52 letters = 53 backslashes
diff --git a/contrib/perl5/t/op/rand.t b/contrib/perl5/t/op/rand.t
index c779f9d..97019bb 100755
--- a/contrib/perl5/t/op/rand.t
+++ b/contrib/perl5/t/op/rand.t
@@ -17,7 +17,7 @@
BEGIN {
chdir "t" if -d "t";
- @INC = "../lib" if -d "../lib";
+ unshift @INC, "../lib" if -d "../lib";
}
use strict;
@@ -52,6 +52,17 @@ sub bits ($) {
$max = $min = rand(1);
for (1..$reps) {
my $n = rand(1);
+ if ($n < 0.0 or $n >= 1.0) {
+ print <<EOM;
+# WHOA THERE! \$Config{drand01} is set to '$Config{drand01}',
+# but that apparently produces values < 0.0 or >= 1.0.
+# Make sure \$Config{drand01} is a valid expression in the
+# C-language, and produces values in the range [0.0,1.0).
+#
+# I give up.
+EOM
+ exit;
+ }
$sum += $n;
$bits += bits($n * 256); # Don't be greedy; 8 is enough
# It's too many if randbits is less than 8!
@@ -74,8 +85,8 @@ sub bits ($) {
# reason that the diagnostic message might get the
# wrong value is that Config.pm is incorrect.)
#
- if ($max <= 0 or $max >= (1 << $randbits)) { # Just in case...
- print "not ok 1\n";
+ if ($max <= 0 or $max >= (2 ** $randbits)) {# Just in case...
+ print "# max=[$max] min=[$min]\nnot ok 1\n";
print "# This perl was compiled with randbits=$randbits\n";
print "# which is _way_ off. Or maybe your system rand is broken,\n";
print "# or your C compiler can't multiply, or maybe Martians\n";
@@ -91,7 +102,7 @@ sub bits ($) {
$off = int($off) + ($off > 0); # Next more positive int
if ($off) {
$shouldbe = $Config{randbits} + $off;
- print "not ok 1\n";
+ print "# max=[$max] min=[$min]\nnot ok 1\n";
print "# This perl was compiled with randbits=$randbits on $^O.\n";
print "# Consider using randbits=$shouldbe instead.\n";
# And skip the remaining tests; they would be pointless now.
diff --git a/contrib/perl5/t/op/range.t b/contrib/perl5/t/op/range.t
index 01f5f70..e8aecf5 100755
--- a/contrib/perl5/t/op/range.t
+++ b/contrib/perl5/t/op/range.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..12\n";
+print "1..15\n";
print join(':',1..5) eq '1:2:3:4:5' ? "ok 1\n" : "not ok 1\n";
@@ -55,3 +55,21 @@ print "ok 11\n";
print "not " unless "@a" eq "-2147483647 -2147483646";
print "ok 12\n";
+# check magic
+{
+ my $bad = 0;
+ local $SIG{'__WARN__'} = sub { $bad = 1 };
+ my $x = 'a-e';
+ $x =~ s/(\w)-(\w)/join ':', $1 .. $2/e;
+ $bad = 1 unless $x eq 'a:b:c:d:e';
+ print $bad ? "not ok 13\n" : "ok 13\n";
+}
+
+# Should use magical autoinc only when both are strings
+print "not " unless 0 == (() = "0"..-1);
+print "ok 14\n";
+
+for my $x ("0"..-1) {
+ print "not ";
+}
+print "ok 15\n";
diff --git a/contrib/perl5/t/op/re_tests b/contrib/perl5/t/op/re_tests
index 3471cc3..d506e6e 100644
--- a/contrib/perl5/t/op/re_tests
+++ b/contrib/perl5/t/op/re_tests
@@ -45,7 +45,7 @@ a[b-d]e ace y $& ace
a[b-d] aac y $& ac
a[-b] a- y $& a-
a[b-] a- y $& a-
-a[b-a] - c - /a[b-a]/: invalid [] range in regexp
+a[b-a] - c - /a[b-a]/: invalid [] range "b-a" in regexp
a[]b - c - /a[]b/: unmatched [] in regexp
a[ - c - /a[/: unmatched [] in regexp
a] a] y $& a]
@@ -218,7 +218,7 @@ a[-]?c ac y $& ac
'a[b-d]'i AAC y $& AC
'a[-b]'i A- y $& A-
'a[b-]'i A- y $& A-
-'a[b-a]'i - c - /a[b-a]/: invalid [] range in regexp
+'a[b-a]'i - c - /a[b-a]/: invalid [] range "b-a" in regexp
'a[]b'i - c - /a[]b/: unmatched [] in regexp
'a['i - c - /a[/: unmatched [] in regexp
'a]'i A] y $& A]
@@ -402,7 +402,7 @@ a(?{{})b - c - /a(?{{})b/: Sequence (?{...}) not terminated or not {}-balanced
a(?{}})b - c - /a(?{}})b/: Sequence (?{...}) not terminated or not {}-balanced
a(?{"{"})b - c - /a(?{"{"})b/: Sequence (?{...}) not terminated or not {}-balanced
a(?{"\{"})b cabd y $& ab
-a(?{"{"}})b - c - Unmatched right bracket
+a(?{"{"}})b - c - Unmatched right curly bracket
a(?{$bl="\{"}).b caxbd y $bl {
x(~~)*(?:(?:F)?)? x~~ y - -
^a(?#xxx){3}c aaac y $& aaac
@@ -474,18 +474,279 @@ $(?<=^(a)) a y $1 a
([[=]+) a=[b]= y $1 =[
([[.]+) a.[b]. y $1 .[
[a[:xyz: - c - /[a[:xyz:/: unmatched [] in regexp
-[a[:xyz:] - c - /[a[:xyz:]/: unmatched [] in regexp
-([a[:xyz:]b]+) pbaq y $1 ba
+[a[:xyz:] - c - Character class [:xyz:] unknown
+[a[:]b[:c] abc y $& abc
+([a[:xyz:]b]+) pbaq c - Character class [:xyz:] unknown
+[a[:]b[:c] abc y $& abc
+([[:alpha:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd
+([[:alnum:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy
+([[:ascii:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy__-- ${nulnul}
+([[:cntrl:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ${nulnul}
+([[:digit:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 01
+([[:graph:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy__--
+([[:lower:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 cd
+([[:print:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy__--
+([[:punct:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 __--
+([[:space:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1
+([[:word:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy__
+([[:upper:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 AB
+([[:xdigit:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01
+([[:^alpha:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 01
+([[:^alnum:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 __-- ${nulnul}${ffff}
+([[:^ascii:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ${ffff}
+([[:^cntrl:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy__--
+([[:^digit:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd
+([[:^lower:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 AB
+([[:^print:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ${nulnul}${ffff}
+([[:^punct:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy
+([[:^space:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 ABcd01Xy__--
+([[:^word:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 -- ${nulnul}${ffff}
+([[:^upper:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 cd01
+([[:^xdigit:]]+) ABcd01Xy__-- ${nulnul}${ffff} y $1 Xy__-- ${nulnul}${ffff}
+[[:foo:]] - c - Character class [:foo:] unknown
+[[:^foo:]] - c - Character class [:^foo:] unknown
((?>a+)b) aaab y $1 aaab
(?>(a+))b aaab y $1 aaa
((?>[^()]+)|\([^()]*\))+ ((abc(ade)ufh()()x y $& abc(ade)ufh()()x
(?<=x+)y - c - /(?<=x+)y/: variable length lookbehind not implemented
a{37,17} - c - /a{37,17}/: Can't do {n,m} with n > m
+\Z a\nb\n y $-[0] 3
+\z a\nb\n y $-[0] 4
+$ a\nb\n y $-[0] 3
+\Z b\na\n y $-[0] 3
+\z b\na\n y $-[0] 4
+$ b\na\n y $-[0] 3
+\Z b\na y $-[0] 3
+\z b\na y $-[0] 3
+$ b\na y $-[0] 3
+'\Z'm a\nb\n y $-[0] 3
+'\z'm a\nb\n y $-[0] 4
+'$'m a\nb\n y $-[0] 1
+'\Z'm b\na\n y $-[0] 3
+'\z'm b\na\n y $-[0] 4
+'$'m b\na\n y $-[0] 1
+'\Z'm b\na y $-[0] 3
+'\z'm b\na y $-[0] 3
+'$'m b\na y $-[0] 1
a\Z a\nb\n n - -
-b\Z a\nb\n y - -
-b\z a\nb\n n - -
-b\Z a\nb y - -
-b\z a\nb y - -
+a\z a\nb\n n - -
+a$ a\nb\n n - -
+a\Z b\na\n y $-[0] 2
+a\z b\na\n n - -
+a$ b\na\n y $-[0] 2
+a\Z b\na y $-[0] 2
+a\z b\na y $-[0] 2
+a$ b\na y $-[0] 2
+'a\Z'm a\nb\n bn - -
+'a\z'm a\nb\n n - -
+'a$'m a\nb\n y $-[0] 0
+'a\Z'm b\na\n y $-[0] 2
+'a\z'm b\na\n n - -
+'a$'m b\na\n y $-[0] 2
+'a\Z'm b\na y $-[0] 2
+'a\z'm b\na y $-[0] 2
+'a$'m b\na y $-[0] 2
+aa\Z aa\nb\n n - -
+aa\z aa\nb\n n - -
+aa$ aa\nb\n n - -
+aa\Z b\naa\n y $-[0] 2
+aa\z b\naa\n n - -
+aa$ b\naa\n y $-[0] 2
+aa\Z b\naa y $-[0] 2
+aa\z b\naa y $-[0] 2
+aa$ b\naa y $-[0] 2
+'aa\Z'm aa\nb\n bn - -
+'aa\z'm aa\nb\n n - -
+'aa$'m aa\nb\n y $-[0] 0
+'aa\Z'm b\naa\n y $-[0] 2
+'aa\z'm b\naa\n n - -
+'aa$'m b\naa\n y $-[0] 2
+'aa\Z'm b\naa y $-[0] 2
+'aa\z'm b\naa y $-[0] 2
+'aa$'m b\naa y $-[0] 2
+aa\Z ac\nb\n n - -
+aa\z ac\nb\n n - -
+aa$ ac\nb\n n - -
+aa\Z b\nac\n n - -
+aa\z b\nac\n n - -
+aa$ b\nac\n n - -
+aa\Z b\nac n - -
+aa\z b\nac n - -
+aa$ b\nac n - -
+'aa\Z'm ac\nb\n n - -
+'aa\z'm ac\nb\n n - -
+'aa$'m ac\nb\n n - -
+'aa\Z'm b\nac\n n - -
+'aa\z'm b\nac\n n - -
+'aa$'m b\nac\n n - -
+'aa\Z'm b\nac n - -
+'aa\z'm b\nac n - -
+'aa$'m b\nac n - -
+aa\Z ca\nb\n n - -
+aa\z ca\nb\n n - -
+aa$ ca\nb\n n - -
+aa\Z b\nca\n n - -
+aa\z b\nca\n n - -
+aa$ b\nca\n n - -
+aa\Z b\nca n - -
+aa\z b\nca n - -
+aa$ b\nca n - -
+'aa\Z'm ca\nb\n n - -
+'aa\z'm ca\nb\n n - -
+'aa$'m ca\nb\n n - -
+'aa\Z'm b\nca\n n - -
+'aa\z'm b\nca\n n - -
+'aa$'m b\nca\n n - -
+'aa\Z'm b\nca n - -
+'aa\z'm b\nca n - -
+'aa$'m b\nca n - -
+ab\Z ab\nb\n n - -
+ab\z ab\nb\n n - -
+ab$ ab\nb\n n - -
+ab\Z b\nab\n y $-[0] 2
+ab\z b\nab\n n - -
+ab$ b\nab\n y $-[0] 2
+ab\Z b\nab y $-[0] 2
+ab\z b\nab y $-[0] 2
+ab$ b\nab y $-[0] 2
+'ab\Z'm ab\nb\n bn - -
+'ab\z'm ab\nb\n n - -
+'ab$'m ab\nb\n y $-[0] 0
+'ab\Z'm b\nab\n y $-[0] 2
+'ab\z'm b\nab\n n - -
+'ab$'m b\nab\n y $-[0] 2
+'ab\Z'm b\nab y $-[0] 2
+'ab\z'm b\nab y $-[0] 2
+'ab$'m b\nab y $-[0] 2
+ab\Z ac\nb\n n - -
+ab\z ac\nb\n n - -
+ab$ ac\nb\n n - -
+ab\Z b\nac\n n - -
+ab\z b\nac\n n - -
+ab$ b\nac\n n - -
+ab\Z b\nac n - -
+ab\z b\nac n - -
+ab$ b\nac n - -
+'ab\Z'm ac\nb\n n - -
+'ab\z'm ac\nb\n n - -
+'ab$'m ac\nb\n n - -
+'ab\Z'm b\nac\n n - -
+'ab\z'm b\nac\n n - -
+'ab$'m b\nac\n n - -
+'ab\Z'm b\nac n - -
+'ab\z'm b\nac n - -
+'ab$'m b\nac n - -
+ab\Z ca\nb\n n - -
+ab\z ca\nb\n n - -
+ab$ ca\nb\n n - -
+ab\Z b\nca\n n - -
+ab\z b\nca\n n - -
+ab$ b\nca\n n - -
+ab\Z b\nca n - -
+ab\z b\nca n - -
+ab$ b\nca n - -
+'ab\Z'm ca\nb\n n - -
+'ab\z'm ca\nb\n n - -
+'ab$'m ca\nb\n n - -
+'ab\Z'm b\nca\n n - -
+'ab\z'm b\nca\n n - -
+'ab$'m b\nca\n n - -
+'ab\Z'm b\nca n - -
+'ab\z'm b\nca n - -
+'ab$'m b\nca n - -
+abb\Z abb\nb\n n - -
+abb\z abb\nb\n n - -
+abb$ abb\nb\n n - -
+abb\Z b\nabb\n y $-[0] 2
+abb\z b\nabb\n n - -
+abb$ b\nabb\n y $-[0] 2
+abb\Z b\nabb y $-[0] 2
+abb\z b\nabb y $-[0] 2
+abb$ b\nabb y $-[0] 2
+'abb\Z'm abb\nb\n bn - -
+'abb\z'm abb\nb\n n - -
+'abb$'m abb\nb\n y $-[0] 0
+'abb\Z'm b\nabb\n y $-[0] 2
+'abb\z'm b\nabb\n n - -
+'abb$'m b\nabb\n y $-[0] 2
+'abb\Z'm b\nabb y $-[0] 2
+'abb\z'm b\nabb y $-[0] 2
+'abb$'m b\nabb y $-[0] 2
+abb\Z ac\nb\n n - -
+abb\z ac\nb\n n - -
+abb$ ac\nb\n n - -
+abb\Z b\nac\n n - -
+abb\z b\nac\n n - -
+abb$ b\nac\n n - -
+abb\Z b\nac n - -
+abb\z b\nac n - -
+abb$ b\nac n - -
+'abb\Z'm ac\nb\n n - -
+'abb\z'm ac\nb\n n - -
+'abb$'m ac\nb\n n - -
+'abb\Z'm b\nac\n n - -
+'abb\z'm b\nac\n n - -
+'abb$'m b\nac\n n - -
+'abb\Z'm b\nac n - -
+'abb\z'm b\nac n - -
+'abb$'m b\nac n - -
+abb\Z ca\nb\n n - -
+abb\z ca\nb\n n - -
+abb$ ca\nb\n n - -
+abb\Z b\nca\n n - -
+abb\z b\nca\n n - -
+abb$ b\nca\n n - -
+abb\Z b\nca n - -
+abb\z b\nca n - -
+abb$ b\nca n - -
+'abb\Z'm ca\nb\n n - -
+'abb\z'm ca\nb\n n - -
+'abb$'m ca\nb\n n - -
+'abb\Z'm b\nca\n n - -
+'abb\z'm b\nca\n n - -
+'abb$'m b\nca\n n - -
+'abb\Z'm b\nca n - -
+'abb\z'm b\nca n - -
+'abb$'m b\nca n - -
(^|x)(c) ca y $2 c
a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz x n - -
+a(?{$a=2;$b=3;($b)=$a})b yabz y $b 2
round\(((?>[^()]+))\) _I(round(xs * sz),1) y $1 xs * sz
+'((?x:.) )' x y $1- x -
+'((?-x:.) )'x x y $1- x-
+foo.bart foo.bart y - -
+'^d[x][x][x]'m abcd\ndxxx y - -
+.X(.+)+X bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.X(.+)+XX bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.XX(.+)+X bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.X(.+)+X bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.X(.+)+XX bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.XX(.+)+X bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.X(.+)+[X] bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.X(.+)+[X][X] bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.XX(.+)+[X] bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.X(.+)+[X] bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.X(.+)+[X][X] bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.XX(.+)+[X] bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.[X](.+)+[X] bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.[X](.+)+[X][X] bbbbXcXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.[X][X](.+)+[X] bbbbXXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa y - -
+.[X](.+)+[X] bbbbXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.[X](.+)+[X][X] bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+.[X][X](.+)+[X] bbbbXXXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa n - -
+tt+$ xxxtt y - -
+([a-\d]+) za-9z y $1 a-9
+([\d-z]+) a0-za y $1 0-z
+([\d-\s]+) a0- z y $1 0-
+([a-[:digit:]]+) za-9z y $1 a-9
+([[:digit:]-z]+) =0-z= y $1 0-z
+([[:digit:]-[:alpha:]]+) =0-z= y $1 0-z
+\GX.*X aaaXbX n - -
+(\d+\.\d+) 3.1415926 y $1 3.1415926
+(\ba.{0,10}br) have a web browser y $1 a web br
+'\.c(pp|xx|c)?$'i Changes n - -
+'\.c(pp|xx|c)?$'i IO.c y - -
+'(\.c(pp|xx|c)?$)'i IO.c y $1 .c
+^([a-z]:) C:/ n - -
+'^\S\s+aa$'m \nx aa y - -
+(^|a)b ab y - -
diff --git a/contrib/perl5/t/op/readdir.t b/contrib/perl5/t/op/readdir.t
index ca19ebc..d101c2f 100755
--- a/contrib/perl5/t/op/readdir.t
+++ b/contrib/perl5/t/op/readdir.t
@@ -1,10 +1,21 @@
#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
eval 'opendir(NOSUCH, "no/such/directory");';
if ($@) { print "1..0\n"; exit; }
print "1..3\n";
+for $i (1..2000) {
+ local *OP;
+ opendir(OP, "op") or die "can't opendir: $!";
+ # should auto-closedir() here
+}
+
if (opendir(OP, "op")) { print "ok 1\n"; } else { print "not ok 1\n"; }
@D = grep(/^[^\.].*\.t$/i, readdir(OP));
closedir(OP);
diff --git a/contrib/perl5/t/op/recurse.t b/contrib/perl5/t/op/recurse.t
index 6594940..dc823ed 100755
--- a/contrib/perl5/t/op/recurse.t
+++ b/contrib/perl5/t/op/recurse.t
@@ -4,7 +4,7 @@
# test recursive functions.
#
-print "1..23\n";
+print "1..25\n";
sub gcd ($$) {
return gcd($_[0] - $_[1], $_[1]) if ($_[0] > $_[1]);
@@ -84,3 +84,33 @@ for $x (0..3) {
print 'not ' unless (($t = takeuchi($x, $y, $z)) == $z + 1);
print "ok ", $i++, "\n";
print "# takeuchi($x, $y, $z) = $t\n";
+
+{
+ sub get_first1 {
+ get_list1(@_)->[0];
+ }
+
+ sub get_list1 {
+ return [24] unless $_[0];
+ my $u = get_first1(0);
+ [$u];
+ }
+ my $x = get_first1(1);
+ print "ok $x\n";
+}
+
+{
+ sub get_first2 {
+ return get_list2(@_)->[0];
+ }
+
+ sub get_list2 {
+ return [25] unless $_[0];
+ my $u = get_first2(0);
+ return [$u];
+ }
+ my $x = get_first2(1);
+ print "ok $x\n";
+}
+
+$i = 26;
diff --git a/contrib/perl5/t/op/ref.t b/contrib/perl5/t/op/ref.t
index 1d70f9f..a2baab8 100755
--- a/contrib/perl5/t/op/ref.t
+++ b/contrib/perl5/t/op/ref.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..55\n";
+print "1..56\n";
# Test glob operations.
@@ -241,11 +241,11 @@ print $$_,"\n";
package A;
sub new { bless {}, shift }
DESTROY { print "# destroying 'A'\nok 51\n" }
- package B;
+ package _B;
sub new { bless {}, shift }
- DESTROY { print "# destroying 'B'\nok 50\n"; bless shift, 'A' }
+ DESTROY { print "# destroying '_B'\nok 50\n"; bless shift, 'A' }
package main;
- my $b = B->new;
+ my $b = _B->new;
}
# test if $_[0] is properly protected in DESTROY()
@@ -271,14 +271,22 @@ print $$_,"\n";
print "# good, didn't recurse\n";
}
+# test if refgen behaves with autoviv magic
+
+{
+ my @a;
+ $a[1] = "ok 53\n";
+ print ${\$_} for @a;
+}
+
# test global destruction
package FINALE;
{
- $ref3 = bless ["ok 55\n"]; # package destruction
- my $ref2 = bless ["ok 54\n"]; # lexical destruction
- local $ref1 = bless ["ok 53\n"]; # dynamic destruction
+ $ref3 = bless ["ok 56\n"]; # package destruction
+ my $ref2 = bless ["ok 55\n"]; # lexical destruction
+ local $ref1 = bless ["ok 54\n"]; # dynamic destruction
1; # flush any temp values on stack
}
diff --git a/contrib/perl5/t/op/regexp.t b/contrib/perl5/t/op/regexp.t
index 11b3ee3..4ffe136 100755
--- a/contrib/perl5/t/op/regexp.t
+++ b/contrib/perl5/t/op/regexp.t
@@ -16,6 +16,8 @@ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
# y expect a match
# n expect no match
# c expect an error
+# B test exposes a known bug in Perl, should be skipped
+# b test exposes a known bug in Perl, should be skipped if noamp
#
# Columns 4 and 5 are used only if column 3 contains C<y> or C<c>.
#
@@ -31,7 +33,7 @@ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
$iters = shift || 1; # Poor man performance suite, 10000 is OK.
@@ -45,6 +47,8 @@ seek(TESTS,0,0);
$. = 0;
$bang = sprintf "\\%03o", ord "!"; # \41 would not be portable.
+$ffff = chr(0xff) x 2;
+$nulnul = "\0" x 2;
$| = 1;
print "1..$numtests\n# $iters iterations\n";
@@ -57,12 +61,18 @@ while (<TESTS>) {
infty_subst(\$pat);
infty_subst(\$expect);
$pat = "'$pat'" unless $pat =~ /^[:']/;
- $pat =~ s/\\n/\n/g;
$pat =~ s/(\$\{\w+\})/$1/eeg;
+ $pat =~ s/\\n/\n/g;
+ $subject =~ s/(\$\{\w+\})/$1/eeg;
$subject =~ s/\\n/\n/g;
+ $expect =~ s/(\$\{\w+\})/$1/eeg;
$expect =~ s/\\n/\n/g;
$expect = $repl = '-' if $skip_amp and $input =~ /\$[&\`\']/;
- for $study ("", "study \$subject") {
+ $skip = ($skip_amp ? ($result =~ s/B//i) : ($result =~ s/B//));
+ # Certain tests don't work with utf8 (the re_test should be in UTF8)
+ $skip = 1 if ($^H &= ~0x00000008) && $pat =~ /\[:\^(alnum|print|word):\]/;
+ $result =~ s/B//i unless $skip;
+ for $study ('', 'study \$subject') {
$c = $iters;
eval "$study; \$match = (\$subject =~ m$pat) while \$c--; \$got = \"$repl\";";
chomp( $err = $@ );
@@ -70,6 +80,9 @@ while (<TESTS>) {
if ($err !~ m!^\Q$expect!) { print "not ok $. (compile) $input => `$err'\n"; next TEST }
last; # no need to study a syntax error
}
+ elsif ( $skip ) {
+ print "ok $. # skipped\n"; next TEST;
+ }
elsif ($@) {
print "not ok $. $input => error `$err'\n"; next TEST;
}
diff --git a/contrib/perl5/t/op/repeat.t b/contrib/perl5/t/op/repeat.t
index f935bf1..c030ba9 100755
--- a/contrib/perl5/t/op/repeat.t
+++ b/contrib/perl5/t/op/repeat.t
@@ -42,10 +42,15 @@ print join(':', (9,9) x 4) eq '9:9:9:9:9:9:9:9' ? "ok 18\n" : "not ok 18\n";
print join('', (split(//,"123")) x 2) eq '123123' ? "ok 19\n" : "not ok 19\n";
#
-# The test #20 is actually testing for Digital C compiler optimizer bug.
+# The test #20 is actually testing for Digital C compiler optimizer bug,
+# present in Dec C versions 5.* and 6.0 (used in Digital UNIX and VMS),
+# found in December 1998. The bug was reported to Digital^WCompaq as
+# DECC 2745 (21-Dec-1998)
+# GEM_BUGS 7619 (23-Dec-1998)
+# As of April 1999 the bug has been fixed in Tru64 UNIX 5.0 and is planned
+# to be fixed also in 4.0G.
#
-# Dec C versions 5.* and 6.0 (used in Digital UNIX and VMS) used
-# to produce (as of December 1998) broken code for util.c:repeatcpy()
+# The bug was as follows: broken code was produced for util.c:repeatcpy()
# (a utility function for the 'x' operator) in the case *all* these
# four conditions held:
#
@@ -68,9 +73,6 @@ print join('', (split(//,"123")) x 2) eq '123123' ? "ok 19\n" : "not ok 19\n";
# 24 .........???????.???????
# 25 .........???????.???????.
#
-# The bug could be (obscurely) avoided by changing "from" to
-# be an unsigned char pointer.
-#
# The bug was triggered in the "if (len == 1)" branch. The fix
# was to introduce a new temporary variable. In diff -u format:
#
@@ -85,6 +87,9 @@ print join('', (split(//,"123")) x 2) eq '123123' ? "ok 19\n" : "not ok 19\n";
# return;
# }
#
+# The bug could also be (obscurely) avoided by changing "from" to
+# be an unsigned char pointer.
+#
# This obscure bug was not found by the then test suite but instead
# by Mark.Martinec@nsc.ijs.si while trying to install Digest-MD5-2.00.
#
diff --git a/contrib/perl5/t/op/runlevel.t b/contrib/perl5/t/op/runlevel.t
index bff3c36..e988ad9 100755
--- a/contrib/perl5/t/op/runlevel.t
+++ b/contrib/perl5/t/op/runlevel.t
@@ -3,11 +3,11 @@
##
## Many of these tests are originally from Michael Schroeder
## <Michael.Schroeder@informatik.uni-erlangen.de>
-## Adapted and expanded by Gurusamy Sarathy <gsar@umich.edu>
+## Adapted and expanded by Gurusamy Sarathy <gsar@activestate.com>
##
chdir 't' if -d 't';
-@INC = "../lib";
+unshift @INC, "../lib";
$Is_VMS = $^O eq 'VMS';
$Is_MSWin32 = $^O eq 'MSWin32';
$ENV{PERL5LIB} = "../lib" unless $Is_VMS;
@@ -32,10 +32,10 @@ for (@prgs){
print TEST "$prog\n";
close TEST;
my $results = $Is_VMS ?
- `MCR $^X "-I[-.lib]" $switch $tmpfile` :
+ `MCR $^X "-I[-.lib]" $switch $tmpfile 2>&1` :
$Is_MSWin32 ?
`.\\perl -I../lib $switch $tmpfile 2>&1` :
- `sh -c './perl $switch $tmpfile' 2>&1`;
+ `./perl $switch $tmpfile 2>&1`;
my $status = $?;
$results =~ s/\n+$//;
# allow expected output to be written as if $prog is on STDIN
@@ -57,7 +57,7 @@ __END__
@a = sort { last ; } @a;
}
EXPECT
-Can't "last" outside a block at - line 3.
+Can't "last" outside a loop block at - line 3.
########
package TEST;
@@ -174,7 +174,7 @@ exit;
bar:
print "bar reached\n";
EXPECT
-Can't "goto" outside a block at - line 2.
+Can't "goto" out of a pseudo block at - line 2.
########
sub sortfn {
(split(/./, 'x'x10000))[0];
@@ -227,7 +227,7 @@ tie $bar, TEST;
}
print "OK\n";
EXPECT
-Can't "next" outside a block at - line 8.
+Can't "next" outside a loop block at - line 8.
########
package TEST;
@@ -285,7 +285,7 @@ package main;
tie $bar, TEST;
}
EXPECT
-Can't "next" outside a block at - line 4.
+Can't "next" outside a loop block at - line 4.
########
@a = (1, 2, 3);
foo:
@@ -335,3 +335,17 @@ tie my @bar, 'TEST';
print join('|', @bar[0..3]), "\n";
EXPECT
foo|fee|fie|foe
+########
+package TH;
+sub TIEHASH { bless {}, TH }
+sub STORE { eval { print "@_[1,2]\n" }; die "bar\n" }
+tie %h, TH;
+eval { $h{A} = 1; print "never\n"; };
+print $@;
+eval { $h{B} = 2; };
+print $@;
+EXPECT
+A 1
+bar
+B 2
+bar
diff --git a/contrib/perl5/t/op/sort.t b/contrib/perl5/t/op/sort.t
index fdb4e34..ba0a4c2 100755
--- a/contrib/perl5/t/op/sort.t
+++ b/contrib/perl5/t/op/sort.t
@@ -1,11 +1,29 @@
#!./perl
-print "1..29\n";
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+use warnings;
+print "1..49\n";
# XXX known to leak scalars
-$ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
+{
+ no warnings 'uninitialized';
+ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
+}
+
+# these shouldn't hang
+{
+ no warnings;
+ sort { for ($_ = 0;; $_++) {} } @a;
+ sort { while(1) {} } @a;
+ sort { while(1) { last; } } @a;
+ sort { while(0) { last; } } @a;
+}
-sub backwards { $a lt $b ? 1 : $a gt $b ? -1 : 0 }
+sub Backwards { $a lt $b ? 1 : $a gt $b ? -1 : 0 }
+sub Backwards_stacked($$) { my($a,$b) = @_; $a lt $b ? 1 : $a gt $b ? -1 : 0 }
my $upperfirst = 'A' lt 'a';
@@ -31,129 +49,224 @@ $expected = $upperfirst ? 'AbelCaincatdogx' : 'catdogxAbelCain';
print "# 1: x = '$x', expected = '$expected'\n";
print ($x eq $expected ? "ok 1\n" : "not ok 1\n");
-$x = join('', sort( backwards @harry));
+$x = join('', sort( Backwards @harry));
$expected = $upperfirst ? 'xdogcatCainAbel' : 'CainAbelxdogcat';
print "# 2: x = '$x', expected = '$expected'\n";
print ($x eq $expected ? "ok 2\n" : "not ok 2\n");
+$x = join('', sort( Backwards_stacked @harry));
+$expected = $upperfirst ? 'xdogcatCainAbel' : 'CainAbelxdogcat';
+print "# 3: x = '$x', expected = '$expected'\n";
+print ($x eq $expected ? "ok 3\n" : "not ok 3\n");
+
$x = join('', sort @george, 'to', @harry);
$expected = $upperfirst ?
'AbelAxedCaincatchaseddoggonepunishedtoxyz' :
'catchaseddoggonepunishedtoxyzAbelAxedCain' ;
-print "# 3: x = '$x', expected = '$expected'\n";
-print ($x eq $expected ?"ok 3\n":"not ok 3\n");
+print "# 4: x = '$x', expected = '$expected'\n";
+print ($x eq $expected ?"ok 4\n":"not ok 4\n");
@a = ();
@b = reverse @a;
-print ("@b" eq "" ? "ok 4\n" : "not ok 4 (@b)\n");
+print ("@b" eq "" ? "ok 5\n" : "not ok 5 (@b)\n");
@a = (1);
@b = reverse @a;
-print ("@b" eq "1" ? "ok 5\n" : "not ok 5 (@b)\n");
+print ("@b" eq "1" ? "ok 6\n" : "not ok 6 (@b)\n");
@a = (1,2);
@b = reverse @a;
-print ("@b" eq "2 1" ? "ok 6\n" : "not ok 6 (@b)\n");
+print ("@b" eq "2 1" ? "ok 7\n" : "not ok 7 (@b)\n");
@a = (1,2,3);
@b = reverse @a;
-print ("@b" eq "3 2 1" ? "ok 7\n" : "not ok 7 (@b)\n");
+print ("@b" eq "3 2 1" ? "ok 8\n" : "not ok 8 (@b)\n");
@a = (1,2,3,4);
@b = reverse @a;
-print ("@b" eq "4 3 2 1" ? "ok 8\n" : "not ok 8 (@b)\n");
+print ("@b" eq "4 3 2 1" ? "ok 9\n" : "not ok 9 (@b)\n");
@a = (10,2,3,4);
@b = sort {$a <=> $b;} @a;
-print ("@b" eq "2 3 4 10" ? "ok 9\n" : "not ok 9 (@b)\n");
+print ("@b" eq "2 3 4 10" ? "ok 10\n" : "not ok 10 (@b)\n");
-$sub = 'backwards';
+$sub = 'Backwards';
$x = join('', sort $sub @harry);
$expected = $upperfirst ? 'xdogcatCainAbel' : 'CainAbelxdogcat';
-print "# 10: x = $x, expected = '$expected'\n";
-print ($x eq $expected ? "ok 10\n" : "not ok 10\n");
+print "# 11: x = $x, expected = '$expected'\n";
+print ($x eq $expected ? "ok 11\n" : "not ok 11\n");
+
+$sub = 'Backwards_stacked';
+$x = join('', sort $sub @harry);
+$expected = $upperfirst ? 'xdogcatCainAbel' : 'CainAbelxdogcat';
+print "# 12: x = $x, expected = '$expected'\n";
+print ($x eq $expected ? "ok 12\n" : "not ok 12\n");
# literals, combinations
@b = sort (4,1,3,2);
-print ("@b" eq '1 2 3 4' ? "ok 11\n" : "not ok 11\n");
+print ("@b" eq '1 2 3 4' ? "ok 13\n" : "not ok 13\n");
print "# x = '@b'\n";
@b = sort grep { $_ } (4,1,3,2);
-print ("@b" eq '1 2 3 4' ? "ok 12\n" : "not ok 12\n");
+print ("@b" eq '1 2 3 4' ? "ok 14\n" : "not ok 14\n");
print "# x = '@b'\n";
@b = sort map { $_ } (4,1,3,2);
-print ("@b" eq '1 2 3 4' ? "ok 13\n" : "not ok 13\n");
+print ("@b" eq '1 2 3 4' ? "ok 15\n" : "not ok 15\n");
print "# x = '@b'\n";
@b = sort reverse (4,1,3,2);
-print ("@b" eq '1 2 3 4' ? "ok 14\n" : "not ok 14\n");
+print ("@b" eq '1 2 3 4' ? "ok 16\n" : "not ok 16\n");
print "# x = '@b'\n";
-$^W = 0;
# redefining sort sub inside the sort sub should fail
sub twoface { *twoface = sub { $a <=> $b }; &twoface }
eval { @b = sort twoface 4,1,3,2 };
-print ($@ =~ /redefine active sort/ ? "ok 15\n" : "not ok 15\n");
+print ($@ =~ /redefine active sort/ ? "ok 17\n" : "not ok 17\n");
# redefining sort subs outside the sort should not fail
-eval { *twoface = sub { &backwards } };
-print $@ ? "not ok 16\n" : "ok 16\n";
+eval { no warnings 'redefine'; *twoface = sub { &Backwards } };
+print $@ ? "not ok 18\n" : "ok 18\n";
eval { @b = sort twoface 4,1,3,2 };
-print ("@b" eq '4 3 2 1' ? "ok 17\n" : "not ok 17 |@b|\n");
+print ("@b" eq '4 3 2 1' ? "ok 19\n" : "not ok 19 |@b|\n");
-*twoface = sub { *twoface = *backwards; $a <=> $b };
+{
+ no warnings 'redefine';
+ *twoface = sub { *twoface = *Backwards; $a <=> $b };
+}
eval { @b = sort twoface 4,1 };
-print ($@ =~ /redefine active sort/ ? "ok 18\n" : "not ok 18\n");
+print ($@ =~ /redefine active sort/ ? "ok 20\n" : "not ok 20\n");
-*twoface = sub {
+{
+ no warnings 'redefine';
+ *twoface = sub {
eval 'sub twoface { $a <=> $b }';
- die($@ =~ /redefine active sort/ ? "ok 19\n" : "not ok 19\n");
+ die($@ =~ /redefine active sort/ ? "ok 21\n" : "not ok 21\n");
$a <=> $b;
};
+}
eval { @b = sort twoface 4,1 };
-print $@ ? "$@" : "not ok 19\n";
+print $@ ? "$@" : "not ok 21\n";
eval <<'CODE';
- my @result = sort main'backwards 'one', 'two';
+ my @result = sort main'Backwards 'one', 'two';
CODE
-print $@ ? "not ok 20\n# $@" : "ok 20\n";
+print $@ ? "not ok 22\n# $@" : "ok 22\n";
eval <<'CODE';
# "sort 'one', 'two'" should not try to parse "'one" as a sort sub
my @result = sort 'one', 'two';
CODE
-print $@ ? "not ok 21\n# $@" : "ok 21\n";
+print $@ ? "not ok 23\n# $@" : "ok 23\n";
{
- my $sortsub = \&backwards;
- my $sortglob = *backwards;
- my $sortglobr = \*backwards;
- my $sortname = 'backwards';
+ my $sortsub = \&Backwards;
+ my $sortglob = *Backwards;
+ my $sortglobr = \*Backwards;
+ my $sortname = 'Backwards';
@b = sort $sortsub 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 22\n" : "not ok 22 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 24\n" : "not ok 24 |@b|\n");
@b = sort $sortglob 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 23\n" : "not ok 23 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 25\n" : "not ok 25 |@b|\n");
@b = sort $sortname 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 24\n" : "not ok 24 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 26\n" : "not ok 26 |@b|\n");
@b = sort $sortglobr 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 25\n" : "not ok 25 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 27\n" : "not ok 27 |@b|\n");
}
{
- local $sortsub = \&backwards;
- local $sortglob = *backwards;
- local $sortglobr = \*backwards;
- local $sortname = 'backwards';
+ my $sortsub = \&Backwards_stacked;
+ my $sortglob = *Backwards_stacked;
+ my $sortglobr = \*Backwards_stacked;
+ my $sortname = 'Backwards_stacked';
@b = sort $sortsub 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 26\n" : "not ok 26 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 28\n" : "not ok 28 |@b|\n");
@b = sort $sortglob 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 27\n" : "not ok 27 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 29\n" : "not ok 29 |@b|\n");
@b = sort $sortname 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 28\n" : "not ok 28 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 30\n" : "not ok 30 |@b|\n");
@b = sort $sortglobr 4,1,3,2;
- print ("@b" eq '4 3 2 1' ? "ok 29\n" : "not ok 29 |@b|\n");
+ print ("@b" eq '4 3 2 1' ? "ok 31\n" : "not ok 31 |@b|\n");
+}
+
+{
+ local $sortsub = \&Backwards;
+ local $sortglob = *Backwards;
+ local $sortglobr = \*Backwards;
+ local $sortname = 'Backwards';
+ @b = sort $sortsub 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 32\n" : "not ok 32 |@b|\n");
+ @b = sort $sortglob 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 33\n" : "not ok 33 |@b|\n");
+ @b = sort $sortname 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 34\n" : "not ok 34 |@b|\n");
+ @b = sort $sortglobr 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 35\n" : "not ok 35 |@b|\n");
+}
+
+{
+ local $sortsub = \&Backwards_stacked;
+ local $sortglob = *Backwards_stacked;
+ local $sortglobr = \*Backwards_stacked;
+ local $sortname = 'Backwards_stacked';
+ @b = sort $sortsub 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 36\n" : "not ok 36 |@b|\n");
+ @b = sort $sortglob 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 37\n" : "not ok 37 |@b|\n");
+ @b = sort $sortname 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 38\n" : "not ok 38 |@b|\n");
+ @b = sort $sortglobr 4,1,3,2;
+ print ("@b" eq '4 3 2 1' ? "ok 39\n" : "not ok 39 |@b|\n");
+}
+
+## exercise sort builtins... ($a <=> $b already tested)
+@a = ( 5, 19, 1996, 255, 90 );
+@b = sort {
+ my $dummy; # force blockness
+ return $b <=> $a
+} @a;
+print ("@b" eq '1996 255 90 19 5' ? "ok 40\n" : "not ok 40\n");
+print "# x = '@b'\n";
+$x = join('', sort { $a cmp $b } @harry);
+$expected = $upperfirst ? 'AbelCaincatdogx' : 'catdogxAbelCain';
+print ($x eq $expected ? "ok 41\n" : "not ok 41\n");
+print "# x = '$x'; expected = '$expected'\n";
+$x = join('', sort { $b cmp $a } @harry);
+$expected = $upperfirst ? 'xdogcatCainAbel' : 'CainAbelxdogcat';
+print ($x eq $expected ? "ok 42\n" : "not ok 42\n");
+print "# x = '$x'; expected = '$expected'\n";
+{
+ use integer;
+ @b = sort { $a <=> $b } @a;
+ print ("@b" eq '5 19 90 255 1996' ? "ok 43\n" : "not ok 43\n");
+ print "# x = '@b'\n";
+ @b = sort { $b <=> $a } @a;
+ print ("@b" eq '1996 255 90 19 5' ? "ok 44\n" : "not ok 44\n");
+ print "# x = '@b'\n";
+ $x = join('', sort { $a cmp $b } @harry);
+ $expected = $upperfirst ? 'AbelCaincatdogx' : 'catdogxAbelCain';
+ print ($x eq $expected ? "ok 45\n" : "not ok 45\n");
+ print "# x = '$x'; expected = '$expected'\n";
+ $x = join('', sort { $b cmp $a } @harry);
+ $expected = $upperfirst ? 'xdogcatCainAbel' : 'CainAbelxdogcat';
+ print ($x eq $expected ? "ok 46\n" : "not ok 46\n");
+ print "# x = '$x'; expected = '$expected'\n";
}
+# test that an optimized-away comparison block doesn't take any other
+# arguments away with it
+$x = join('', sort { $a <=> $b } 3, 1, 2);
+print $x eq "123" ? "ok 47\n" : "not ok 47\n";
+
+# test sorting in non-main package
+package Foo;
+@a = ( 5, 19, 1996, 255, 90 );
+@b = sort { $b <=> $a } @a;
+print ("@b" eq '1996 255 90 19 5' ? "ok 48\n" : "not ok 48\n");
+print "# x = '@b'\n";
+
+@b = sort main::Backwards_stacked @a;
+print ("@b" eq '90 5 255 1996 19' ? "ok 49\n" : "not ok 49\n");
+print "# x = '@b'\n";
diff --git a/contrib/perl5/t/op/split.t b/contrib/perl5/t/op/split.t
index 7f0acce..8b9f4ad 100755
--- a/contrib/perl5/t/op/split.t
+++ b/contrib/perl5/t/op/split.t
@@ -48,11 +48,9 @@ print $_ eq '1:2:3:4:5:6:::' ? "ok 10\n" : "not ok 10 $_\n";
# Does assignment to a list imply split to one more field than that?
if ($^O eq 'MSWin32') { $foo = `.\\perl -D1024 -e "(\$a,\$b) = split;" 2>&1` }
+elsif ($^O eq 'VMS') { $foo = `./perl "-D1024" -e "(\$a,\$b) = split;" 2>&1` }
else { $foo = `./perl -D1024 -e '(\$a,\$b) = split;' 2>&1` }
-if ($foo =~ /DCL-W-NOCOMD/) {
- $foo = `\$ mcr sys\$disk:[]perl. "-D1024" -e "(\$a,\$b) = split;"`;
-}
-print $foo =~ /DEBUGGING/ || $foo =~ /SV = IV\(3\)/ ? "ok 11\n" : "not ok 11\n";
+print $foo =~ /DEBUGGING/ || $foo =~ /SV = (VOID|IV\(3\))/ ? "ok 11\n" : "not ok 11\n";
# Can we say how many fields to split to when assigning to a list?
($a,$b) = split(' ','1 2 3 4 5 6', 2);
diff --git a/contrib/perl5/t/op/sprintf.t b/contrib/perl5/t/op/sprintf.t
index b9b4751..4d54d2c 100755
--- a/contrib/perl5/t/op/sprintf.t
+++ b/contrib/perl5/t/op/sprintf.t
@@ -2,9 +2,14 @@
# $RCSfile: sprintf.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:27 $
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+use warnings;
+
print "1..4\n";
-$^W = 1;
$SIG{__WARN__} = sub {
if ($_[0] =~ /^Invalid conversion/) {
$w++;
@@ -14,8 +19,8 @@ $SIG{__WARN__} = sub {
};
$w = 0;
-$x = sprintf("%3s %-4s%%foo %.0d%5d %#x%c%3.1f","hi",123,0,456,0,ord('A'),3.0999);
-if ($x eq ' hi 123 %foo 456 0A3.1' && $w == 0) {
+$x = sprintf("%3s %-4s%%foo %.0d%5d %#x%c%3.1f %b %x %X %#b %#x %#X","hi",123,0,456,0,ord('A'),3.0999,11,171,171,11,171,171);
+if ($x eq ' hi 123 %foo 456 0A3.1 1011 ab AB 0b1011 0xab 0XAB' && $w == 0) {
print "ok 1\n";
} else {
print "not ok 1 '$x'\n";
diff --git a/contrib/perl5/t/op/stat.t b/contrib/perl5/t/op/stat.t
index 2207b40..af4920c 100755
--- a/contrib/perl5/t/op/stat.t
+++ b/contrib/perl5/t/op/stat.t
@@ -4,7 +4,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
use Config;
@@ -14,28 +14,45 @@ print "1..58\n";
$Is_MSWin32 = $^O eq 'MSWin32';
$Is_Dos = $^O eq 'dos';
$Is_Dosish = $Is_Dos || $^O eq 'os2' || $Is_MSWin32;
+$Is_Cygwin = $^O eq 'cygwin';
chop($cwd = ($Is_MSWin32 ? `cd` : `pwd`));
-$DEV = `ls -l /dev` unless $Is_Dosish;
+$DEV = `ls -l /dev` unless $Is_Dosish or $Is_Cygwin;
unlink "Op.stat.tmp";
-open(FOO, ">Op.stat.tmp");
-
-# hack to make Apollo update link count:
-$junk = `ls Op.stat.tmp` unless ($Is_MSWin32 || $Is_Dos);
-
-($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
- $blksize,$blocks) = stat(FOO);
-if ($nlink == 1) {print "ok 1\n";} else {print "not ok 1\n";}
-if ($Is_MSWin32 || ($mtime && $mtime == $ctime)) {print "ok 2\n";}
-else {print "# |$mtime| vs |$ctime|\nnot ok 2\n";}
-
-print FOO "Now is the time for all good men to come to.\n";
-close(FOO);
-
-sleep 2;
+if (open(FOO, ">Op.stat.tmp")) {
+ # hack to make Apollo update link count:
+ $junk = `ls Op.stat.tmp` unless ($Is_MSWin32 || $Is_Dos);
+
+ ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
+ $blksize,$blocks) = stat(FOO);
+ if ($nlink == 1) {
+ print "ok 1\n";
+ }
+ else {
+ print "# res=$res, nlink=$nlink.\nnot ok 1\n";
+ }
+ if ($Is_MSWin32 or $Is_Cygwin || ($mtime && $mtime == $ctime)) {
+ print "ok 2\n";
+ }
+ else {
+ print "# |$mtime| vs |$ctime|\nnot ok 2\n";
+ }
+
+ my $funky_FAT_timestamps = $Is_Cygwin;
+
+ sleep 3 if $funky_FAT_timestamps;
+
+ print FOO "Now is the time for all good men to come to.\n";
+ close(FOO);
+
+ sleep 2 unless $funky_FAT_timestamps;
+
+} else {
+ print "# open failed: $!\nnot ok 1\nnot ok 2\n";
+}
-if ($Is_Dosish) { unlink "Op.stat.tmp2" }
+if ($Is_Dosish) { unlink "Op.stat.tmp2"}
else {
`rm -f Op.stat.tmp2;ln Op.stat.tmp Op.stat.tmp2; chmod 644 Op.stat.tmp`;
}
@@ -50,7 +67,8 @@ elsif ($nlink == 2)
else {print "# \$nlink is |$nlink|\nnot ok 3\n";}
if ( $Is_Dosish
- || ($cwd =~ m#^/tmp# and $mtime && $mtime==$ctime) # Solaris tmpfs bug
+ # Solaris tmpfs bug
+ || ($cwd =~ m#^/tmp# and $mtime && $mtime==$ctime && $^O eq 'solaris')
|| $cwd =~ m#/afs/#
|| $^O eq 'amigaos') {
print "ok 4 # skipped: different semantic of mtime/ctime\n";
@@ -65,7 +83,7 @@ else {
}
print "#4 :$mtime: should != :$ctime:\n";
-unlink "Op.stat.tmp";
+unlink "Op.stat.tmp" or print "# unlink failed: $!\n";
if ($Is_MSWin32) { open F, '>Op.stat.tmp' and close F }
else { `touch Op.stat.tmp` }
@@ -76,7 +94,7 @@ $Is_MSWin32 ? `cmd /c echo hi > Op.stat.tmp` : `echo hi >Op.stat.tmp`;
if (! -z 'Op.stat.tmp') {print "ok 7\n";} else {print "not ok 7\n";}
if (-s 'Op.stat.tmp') {print "ok 8\n";} else {print "not ok 8\n";}
-unlink 'Op.stat.tmp';
+unlink 'Op.stat.tmp' or print "# unlink failed: $!\n";
$olduid = $>; # can't test -r if uid == 0
$Is_MSWin32 ? `cmd /c echo hi > Op.stat.tmp` : `echo hi >Op.stat.tmp`;
chmod 0,'Op.stat.tmp';
@@ -93,6 +111,9 @@ foreach ((12,13,14,15,16,17)) {
print "ok $_\n"; #deleted tests
}
+# in ms windows, Op.stat.tmp inherits owner uid from directory
+# not sure about os/2, but chown is harmless anyway
+eval { chown $>,'Op.stat.tmp'; 1 } or print "# $@" ;
chmod 0700,'Op.stat.tmp';
if (-r 'Op.stat.tmp') {print "ok 18\n";} else {print "not ok 18\n";}
if (-w 'Op.stat.tmp') {print "ok 19\n";} else {print "not ok 19\n";}
@@ -149,7 +170,7 @@ else
{print "not ok 33\n";}
if (! -b '.') {print "ok 34\n";} else {print "not ok 34\n";}
-if ($^O eq 'amigaos' or $Is_Dosish) {
+if ($^O eq 'mpeix' or $^O eq 'amigaos' or $Is_Dosish or $Is_Cygwin) {
print "ok 35 # skipped: no -u\n"; goto tty_test;
}
@@ -184,14 +205,23 @@ unless($ENV{PERL_SKIP_TTY_TEST}) {
print "ok 37\n";
}
else {
- unless (open(tty,"/dev/tty")) {
- print STDERR "Can't open /dev/tty--run t/TEST outside of make.\n";
+ my $TTY = "/dev/tty";
+
+ $TTY = "/dev/ttyp0" if $^O eq 'rhapsody';
+
+ if (defined $TTY) {
+ unless (open(TTY, $TTY)) {
+ print STDERR "Can't open $TTY--run t/TEST outside of make.\n";
+ }
+ if (-t TTY) {print "ok 36\n";} else {print "not ok 36\n";}
+ if (-c TTY) {print "ok 37\n";} else {print "not ok 37\n";}
+ close(TTY);
+ } else { # if some platform completely undefines $TTY
+ print "ok 36 # skipped\n";
+ print "ok 37 # skipped\n";
}
- if (-t tty) {print "ok 36\n";} else {print "not ok 36\n";}
- if (-c tty) {print "ok 37\n";} else {print "not ok 37\n";}
- close(tty);
}
- if (! -t tty) {print "ok 38\n";} else {print "not ok 38\n";}
+ if (! -t TTY) {print "ok 38\n";} else {print "not ok 38\n";}
if (-t) {print "ok 39\n";} else {print "not ok 39\n";}
}
else {
@@ -249,4 +279,4 @@ $_ = 'Op.stat.tmp';
if (-f) {print "ok 57\n";} else {print "not ok 57\n";}
if (-f()) {print "ok 58\n";} else {print "not ok 58\n";}
-unlink 'Op.stat.tmp';
+unlink 'Op.stat.tmp' or print "# unlink failed: $!\n";
diff --git a/contrib/perl5/t/op/subst.t b/contrib/perl5/t/op/subst.t
index afa06ab..9757f4c 100755
--- a/contrib/perl5/t/op/subst.t
+++ b/contrib/perl5/t/op/subst.t
@@ -1,6 +1,12 @@
#!./perl
-print "1..71\n";
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ require Config; import Config;
+}
+
+print "1..84\n";
$x = 'foo';
$_ = "x";
@@ -181,7 +187,8 @@ tr/a-z/A-Z/;
print $_ eq 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ? "ok 52\n" : "not ok 52\n";
# same as tr/A-Z/a-z/;
-if ($^O eq 'os390') { # An EBCDIC variant.
+if ($Config{ebcdic} eq 'define') { # EBCDIC.
+ no utf8;
y[\301-\351][\201-\251];
} else { # Ye Olde ASCII. Or something like it.
y[\101-\132][\141-\172];
@@ -305,6 +312,70 @@ s{ \d+ \b [,.;]? (?{ 'digits' })
print ($_ eq $foo ? "ok 70\n" : "not ok 70\n#'$_'\n#'$foo'\n");
$_ = 'x' x 20;
-s/\d*|x/<$&>/g;
+s/(\d*|x)/<$1>/g;
$foo = '<>' . ('<x><>' x 20) ;
print ($_ eq $foo ? "ok 71\n" : "not ok 71\n#'$_'\n#'$foo'\n");
+
+$t = 'aaaaaaaaa';
+
+$_ = $t;
+pos = 6;
+s/\Ga/xx/g;
+print "not " unless $_ eq 'aaaaaaxxxxxx';
+print "ok 72\n";
+
+$_ = $t;
+pos = 6;
+s/\Ga/x/g;
+print "not " unless $_ eq 'aaaaaaxxx';
+print "ok 73\n";
+
+$_ = $t;
+pos = 6;
+s/\Ga/xx/;
+print "not " unless $_ eq 'aaaaaaxxaa';
+print "ok 74\n";
+
+$_ = $t;
+pos = 6;
+s/\Ga/x/;
+print "not " unless $_ eq 'aaaaaaxaa';
+print "ok 75\n";
+
+$_ = $t;
+s/\Ga/xx/g;
+print "not " unless $_ eq 'xxxxxxxxxxxxxxxxxx';
+print "ok 76\n";
+
+$_ = $t;
+s/\Ga/x/g;
+print "not " unless $_ eq 'xxxxxxxxx';
+print "ok 77\n";
+
+$_ = $t;
+s/\Ga/xx/;
+print "not " unless $_ eq 'xxaaaaaaaa';
+print "ok 78\n";
+
+$_ = $t;
+s/\Ga/x/;
+print "not " unless $_ eq 'xaaaaaaaa';
+print "ok 79\n";
+
+$_ = 'aaaa';
+s/\ba/./g;
+print "#'$_'\nnot " unless $_ eq '.aaa';
+print "ok 80\n";
+
+eval q% s/a/"b"}/e %;
+print ($@ =~ /Bad evalled substitution/ ? "ok 81\n" : "not ok 81\n");
+eval q% ($_ = "x") =~ s/(.)/"$1 "/e %;
+print +($_ eq "x " and !length $@) ? "ok 82\n" : "not ok 82\n# \$_ eq $_, $@\n";
+$x = $x = 'interp';
+eval q% ($_ = "x") =~ s/x(($x)*)/"$1"/e %;
+print +($_ eq '' and !length $@) ? "ok 83\n" : "not ok 83\n# \$_ eq $_, $@\n";
+
+$_ = "C:/";
+s/^([a-z]:)/\u$1/ and print "not ";
+print "ok 84\n";
+
diff --git a/contrib/perl5/t/op/subst_amp.t b/contrib/perl5/t/op/subst_amp.t
new file mode 100755
index 0000000..e2e7c0e5
--- /dev/null
+++ b/contrib/perl5/t/op/subst_amp.t
@@ -0,0 +1,104 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib';
+ require Config; import Config;
+}
+
+print "1..13\n";
+
+$_ = 'x' x 20;
+s/\d*|x/<$&>/g;
+$foo = '<>' . ('<x><>' x 20) ;
+print ($_ eq $foo ? "ok 1\n" : "not ok 1\n#'$_'\n#'$foo'\n");
+
+$t = 'aaa';
+
+$_ = $t;
+@res = ();
+pos = 1;
+s/\Ga(?{push @res, $_, $`})/xx/g;
+print "not " unless "$_ @res" eq 'axxxx aaa a aaa aa';
+print "ok 2\n";
+
+$_ = $t;
+@res = ();
+pos = 1;
+s/\Ga(?{push @res, $_, $`})/x/g;
+print "not " unless "$_ @res" eq 'axx aaa a aaa aa';
+print "ok 3\n";
+
+$_ = $t;
+@res = ();
+pos = 1;
+s/\Ga(?{push @res, $_, $`})/xx/;
+print "not " unless "$_ @res" eq 'axxa aaa a';
+print "ok 4\n";
+
+$_ = $t;
+@res = ();
+pos = 1;
+s/\Ga(?{push @res, $_, $`})/x/;
+print "not " unless "$_ @res" eq 'axa aaa a';
+print "ok 5\n";
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/xx/g;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axxxx aaa a aaa aa';
+print "ok 6\n";
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/x/g;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axx aaa a aaa aa';
+print "ok 7\n";
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/xx/;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axxa aaa a';
+print "ok 8\n";
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/x/;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axa aaa a';
+print "ok 9\n";
+
+sub x2 {'xx'}
+sub x1 {'x'}
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/x2/ge;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axxxx aaa a aaa aa';
+print "ok 10\n";
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/x1/ge;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axx aaa a aaa aa';
+print "ok 11\n";
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/x2/e;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axxa aaa a';
+print "ok 12\n";
+
+$a = $t;
+@res = ();
+pos ($a) = 1;
+$a =~ s/\Ga(?{push @res, $_, $`})/x1/e;
+print "#'$a' '@res'\nnot " unless "$a @res" eq 'axa aaa a';
+print "ok 13\n";
+
diff --git a/contrib/perl5/t/op/subst_wamp.t b/contrib/perl5/t/op/subst_wamp.t
new file mode 100755
index 0000000..b716b30
--- /dev/null
+++ b/contrib/perl5/t/op/subst_wamp.t
@@ -0,0 +1,11 @@
+#!./perl
+
+$dummy = defined $&; # Now we have it...
+for $file ('op/subst.t', 't/op/subst.t') {
+ if (-r $file) {
+ do $file;
+ exit;
+ }
+}
+die "Cannot find op/subst.t or t/op/subst.t\n";
+
diff --git a/contrib/perl5/t/op/substr.t b/contrib/perl5/t/op/substr.t
index 87efcb4..5764e67 100755
--- a/contrib/perl5/t/op/substr.t
+++ b/contrib/perl5/t/op/substr.t
@@ -1,12 +1,14 @@
-#!./perl
-print "1..106\n";
+print "1..125\n";
#P = start of string Q = start of substr R = end of substr S = end of string
-$a = 'abcdefxyz';
-BEGIN { $^W = 1 };
+BEGIN {
+ unshift @INC, '../lib' if -d '../lib' ;
+}
+use warnings ;
+$a = 'abcdefxyz';
$SIG{__WARN__} = sub {
if ($_[0] =~ /^substr outside of string/) {
$w++;
@@ -19,139 +21,198 @@ $SIG{__WARN__} = sub {
}
};
-sub fail { !defined(shift) && $w-- };
+sub ok { print (($_[1] ? "" : "not ") . "ok $_[0]\n") }
+
+$FATAL_MSG = '^substr outside of string' ;
-print (substr($a,0,3) eq 'abc' ? "ok 1\n" : "not ok 1\n"); # P=Q R S
-print (substr($a,3,3) eq 'def' ? "ok 2\n" : "not ok 2\n"); # P Q R S
-print (substr($a,6,999) eq 'xyz' ? "ok 3\n" : "not ok 3\n"); # P Q S R
-print (fail(substr($a,999,999)) ? "ok 4\n" : "not ok 4\n"); # P R Q S
-print (substr($a,0,-6) eq 'abc' ? "ok 5\n" : "not ok 5\n"); # P=Q R S
-print (substr($a,-3,1) eq 'x' ? "ok 6\n" : "not ok 6\n"); # P Q R S
+ok 1, substr($a,0,3) eq 'abc'; # P=Q R S
+ok 2, substr($a,3,3) eq 'def'; # P Q R S
+ok 3, substr($a,6,999) eq 'xyz'; # P Q S R
+$b = substr($a,999,999) ; # warn # P R Q S
+ok 4, $w-- == 1 ;
+eval{substr($a,999,999) = "" ; };# P R Q S
+ok 5, $@ =~ /$FATAL_MSG/;
+ok 6, substr($a,0,-6) eq 'abc'; # P=Q R S
+ok 7, substr($a,-3,1) eq 'x'; # P Q R S
$[ = 1;
-print (substr($a,1,3) eq 'abc' ? "ok 7\n" : "not ok 7\n"); # P=Q R S
-print (substr($a,4,3) eq 'def' ? "ok 8\n" : "not ok 8\n"); # P Q R S
-print (substr($a,7,999) eq 'xyz' ? "ok 9\n" : "not ok 9\n"); # P Q S R
-print (fail(substr($a,999,999)) ? "ok 10\n" : "not ok 10\n");# P R Q S
-print (substr($a,1,-6) eq 'abc' ? "ok 11\n" : "not ok 11\n");# P=Q R S
-print (substr($a,-3,1) eq 'x' ? "ok 12\n" : "not ok 12\n"); # P Q R S
+ok 8, substr($a,1,3) eq 'abc' ; # P=Q R S
+ok 9, substr($a,4,3) eq 'def' ; # P Q R S
+ok 10, substr($a,7,999) eq 'xyz';# P Q S R
+$b = substr($a,999,999) ; # warn # P R Q S
+ok 11, $w-- == 1 ;
+eval{substr($a,999,999) = "" ; } ; # P R Q S
+ok 12, $@ =~ /$FATAL_MSG/;
+ok 13, substr($a,1,-6) eq 'abc' ;# P=Q R S
+ok 14, substr($a,-3,1) eq 'x' ; # P Q R S
$[ = 0;
substr($a,3,3) = 'XYZ';
-print $a eq 'abcXYZxyz' ? "ok 13\n" : "not ok 13\n";
+ok 15, $a eq 'abcXYZxyz' ;
substr($a,0,2) = '';
-print $a eq 'cXYZxyz' ? "ok 14\n" : "not ok 14\n";
+ok 16, $a eq 'cXYZxyz' ;
substr($a,0,0) = 'ab';
-print $a eq 'abcXYZxyz' ? "ok 15\n" : "not ok 15 $a\n";
+ok 17, $a eq 'abcXYZxyz' ;
substr($a,0,0) = '12345678';
-print $a eq '12345678abcXYZxyz' ? "ok 16\n" : "not ok 16\n";
+ok 18, $a eq '12345678abcXYZxyz' ;
substr($a,-3,3) = 'def';
-print $a eq '12345678abcXYZdef' ? "ok 17\n" : "not ok 17\n";
+ok 19, $a eq '12345678abcXYZdef';
substr($a,-3,3) = '<';
-print $a eq '12345678abcXYZ<' ? "ok 18\n" : "not ok 18\n";
+ok 20, $a eq '12345678abcXYZ<' ;
substr($a,-1,1) = '12345678';
-print $a eq '12345678abcXYZ12345678' ? "ok 19\n" : "not ok 19\n";
+ok 21, $a eq '12345678abcXYZ12345678' ;
$a = 'abcdefxyz';
-print (substr($a,6) eq 'xyz' ? "ok 20\n" : "not ok 20\n"); # P Q R=S
-print (substr($a,-3) eq 'xyz' ? "ok 21\n" : "not ok 21\n"); # P Q R=S
-print (fail(substr($a,999)) ? "ok 22\n" : "not ok 22\n"); # P R=S Q
-print (substr($a,0) eq 'abcdefxyz' ? "ok 23\n" : "not ok 23\n");# P=Q R=S
-print (substr($a,9) eq '' ? "ok 24\n" : "not ok 24\n"); # P Q=R=S
-print (substr($a,-11) eq 'abcdefxyz' ? "ok 25\n" : "not ok 25\n");# Q P R=S
-print (substr($a,-9) eq 'abcdefxyz' ? "ok 26\n" : "not ok 26\n"); # P=Q R=S
+ok 22, substr($a,6) eq 'xyz' ; # P Q R=S
+ok 23, substr($a,-3) eq 'xyz' ; # P Q R=S
+$b = substr($a,999,999) ; # warning # P R=S Q
+ok 24, $w-- == 1 ;
+eval{substr($a,999,999) = "" ; } ; # P R=S Q
+ok 25, $@ =~ /$FATAL_MSG/;
+ok 26, substr($a,0) eq 'abcdefxyz' ; # P=Q R=S
+ok 27, substr($a,9) eq '' ; # P Q=R=S
+ok 28, substr($a,-11) eq 'abcdefxyz'; # Q P R=S
+ok 29, substr($a,-9) eq 'abcdefxyz'; # P=Q R=S
$a = '54321';
-print (fail(substr($a,-7, 1)) ? "ok 27\n" : "not ok 27\n"); # Q R P S
-print (fail(substr($a,-7,-6)) ? "ok 28\n" : "not ok 28\n"); # Q R P S
-print (substr($a,-5,-7) eq '' ? "ok 29\n" : "not ok 29\n"); # R P=Q S
-print (substr($a, 2,-7) eq '' ? "ok 30\n" : "not ok 30\n"); # R P Q S
-print (substr($a,-3,-7) eq '' ? "ok 31\n" : "not ok 31\n"); # R P Q S
-print (substr($a, 2,-5) eq '' ? "ok 32\n" : "not ok 32\n"); # P=R Q S
-print (substr($a,-3,-5) eq '' ? "ok 33\n" : "not ok 33\n"); # P=R Q S
-print (substr($a, 2,-4) eq '' ? "ok 34\n" : "not ok 34\n"); # P R Q S
-print (substr($a,-3,-4) eq '' ? "ok 35\n" : "not ok 35\n"); # P R Q S
-print (substr($a, 5,-6) eq '' ? "ok 36\n" : "not ok 36\n"); # R P Q=S
-print (substr($a, 5,-5) eq '' ? "ok 37\n" : "not ok 37\n"); # P=R Q S
-print (substr($a, 5,-3) eq '' ? "ok 38\n" : "not ok 38\n"); # P R Q=S
-print (fail(substr($a, 7,-7)) ? "ok 39\n" : "not ok 39\n"); # R P S Q
-print (fail(substr($a, 7,-5)) ? "ok 40\n" : "not ok 40\n"); # P=R S Q
-print (fail(substr($a, 7,-3)) ? "ok 41\n" : "not ok 41\n"); # P R S Q
-print (fail(substr($a, 7, 0)) ? "ok 42\n" : "not ok 42\n"); # P S Q=R
-
-print (substr($a,-7,2) eq '' ? "ok 43\n" : "not ok 43\n"); # Q P=R S
-print (substr($a,-7,4) eq '54' ? "ok 44\n" : "not ok 44\n"); # Q P R S
-print (substr($a,-7,7) eq '54321' ? "ok 45\n" : "not ok 45\n");# Q P R=S
-print (substr($a,-7,9) eq '54321' ? "ok 46\n" : "not ok 46\n");# Q P S R
-print (substr($a,-5,0) eq '' ? "ok 47\n" : "not ok 47\n"); # P=Q=R S
-print (substr($a,-5,3) eq '543' ? "ok 48\n" : "not ok 48\n");# P=Q R S
-print (substr($a,-5,5) eq '54321' ? "ok 49\n" : "not ok 49\n");# P=Q R=S
-print (substr($a,-5,7) eq '54321' ? "ok 50\n" : "not ok 50\n");# P=Q S R
-print (substr($a,-3,0) eq '' ? "ok 51\n" : "not ok 51\n"); # P Q=R S
-print (substr($a,-3,3) eq '321' ? "ok 52\n" : "not ok 52\n");# P Q R=S
-print (substr($a,-2,3) eq '21' ? "ok 53\n" : "not ok 53\n"); # P Q S R
-print (substr($a,0,-5) eq '' ? "ok 54\n" : "not ok 54\n"); # P=Q=R S
-print (substr($a,2,-3) eq '' ? "ok 55\n" : "not ok 55\n"); # P Q=R S
-print (substr($a,0,0) eq '' ? "ok 56\n" : "not ok 56\n"); # P=Q=R S
-print (substr($a,0,5) eq '54321' ? "ok 57\n" : "not ok 57\n");# P=Q R=S
-print (substr($a,0,7) eq '54321' ? "ok 58\n" : "not ok 58\n");# P=Q S R
-print (substr($a,2,0) eq '' ? "ok 59\n" : "not ok 59\n"); # P Q=R S
-print (substr($a,2,3) eq '321' ? "ok 60\n" : "not ok 60\n"); # P Q R=S
-print (substr($a,5,0) eq '' ? "ok 61\n" : "not ok 61\n"); # P Q=R=S
-print (substr($a,5,2) eq '' ? "ok 62\n" : "not ok 62\n"); # P Q=S R
-print (substr($a,-7,-5) eq '' ? "ok 63\n" : "not ok 63\n"); # Q P=R S
-print (substr($a,-7,-2) eq '543' ? "ok 64\n" : "not ok 64\n");# Q P R S
-print (substr($a,-5,-5) eq '' ? "ok 65\n" : "not ok 65\n"); # P=Q=R S
-print (substr($a,-5,-2) eq '543' ? "ok 66\n" : "not ok 66\n");# P=Q R S
-print (substr($a,-3,-3) eq '' ? "ok 67\n" : "not ok 67\n"); # P Q=R S
-print (substr($a,-3,-1) eq '32' ? "ok 68\n" : "not ok 68\n");# P Q R S
+$b = substr($a,-7, 1) ; # warn # Q R P S
+ok 30, $w-- == 1 ;
+eval{substr($a,-7, 1) = "" ; }; # Q R P S
+ok 31, $@ =~ /$FATAL_MSG/;
+$b = substr($a,-7,-6) ; # warn # Q R P S
+ok 32, $w-- == 1 ;
+eval{substr($a,-7,-6) = "" ; }; # Q R P S
+ok 33, $@ =~ /$FATAL_MSG/;
+ok 34, substr($a,-5,-7) eq ''; # R P=Q S
+ok 35, substr($a, 2,-7) eq ''; # R P Q S
+ok 36, substr($a,-3,-7) eq ''; # R P Q S
+ok 37, substr($a, 2,-5) eq ''; # P=R Q S
+ok 38, substr($a,-3,-5) eq ''; # P=R Q S
+ok 39, substr($a, 2,-4) eq ''; # P R Q S
+ok 40, substr($a,-3,-4) eq ''; # P R Q S
+ok 41, substr($a, 5,-6) eq ''; # R P Q=S
+ok 42, substr($a, 5,-5) eq ''; # P=R Q S
+ok 43, substr($a, 5,-3) eq ''; # P R Q=S
+$b = substr($a, 7,-7) ; # warn # R P S Q
+ok 44, $w-- == 1 ;
+eval{substr($a, 7,-7) = "" ; }; # R P S Q
+ok 45, $@ =~ /$FATAL_MSG/;
+$b = substr($a, 7,-5) ; # warn # P=R S Q
+ok 46, $w-- == 1 ;
+eval{substr($a, 7,-5) = "" ; }; # P=R S Q
+ok 47, $@ =~ /$FATAL_MSG/;
+$b = substr($a, 7,-3) ; # warn # P Q S Q
+ok 48, $w-- == 1 ;
+eval{substr($a, 7,-3) = "" ; }; # P Q S Q
+ok 49, $@ =~ /$FATAL_MSG/;
+$b = substr($a, 7, 0) ; # warn # P S Q=R
+ok 50, $w-- == 1 ;
+eval{substr($a, 7, 0) = "" ; }; # P S Q=R
+ok 51, $@ =~ /$FATAL_MSG/;
+
+ok 52, substr($a,-7,2) eq ''; # Q P=R S
+ok 53, substr($a,-7,4) eq '54'; # Q P R S
+ok 54, substr($a,-7,7) eq '54321';# Q P R=S
+ok 55, substr($a,-7,9) eq '54321';# Q P S R
+ok 56, substr($a,-5,0) eq ''; # P=Q=R S
+ok 57, substr($a,-5,3) eq '543';# P=Q R S
+ok 58, substr($a,-5,5) eq '54321';# P=Q R=S
+ok 59, substr($a,-5,7) eq '54321';# P=Q S R
+ok 60, substr($a,-3,0) eq ''; # P Q=R S
+ok 61, substr($a,-3,3) eq '321';# P Q R=S
+ok 62, substr($a,-2,3) eq '21'; # P Q S R
+ok 63, substr($a,0,-5) eq ''; # P=Q=R S
+ok 64, substr($a,2,-3) eq ''; # P Q=R S
+ok 65, substr($a,0,0) eq ''; # P=Q=R S
+ok 66, substr($a,0,5) eq '54321';# P=Q R=S
+ok 67, substr($a,0,7) eq '54321';# P=Q S R
+ok 68, substr($a,2,0) eq ''; # P Q=R S
+ok 69, substr($a,2,3) eq '321'; # P Q R=S
+ok 70, substr($a,5,0) eq ''; # P Q=R=S
+ok 71, substr($a,5,2) eq ''; # P Q=S R
+ok 72, substr($a,-7,-5) eq ''; # Q P=R S
+ok 73, substr($a,-7,-2) eq '543';# Q P R S
+ok 74, substr($a,-5,-5) eq ''; # P=Q=R S
+ok 75, substr($a,-5,-2) eq '543';# P=Q R S
+ok 76, substr($a,-3,-3) eq ''; # P Q=R S
+ok 77, substr($a,-3,-1) eq '32';# P Q R S
$a = '';
-print (substr($a,-2,2) eq '' ? "ok 69\n" : "not ok 69\n"); # Q P=R=S
-print (substr($a,0,0) eq '' ? "ok 70\n" : "not ok 70\n"); # P=Q=R=S
-print (substr($a,0,1) eq '' ? "ok 71\n" : "not ok 71\n"); # P=Q=S R
-print (substr($a,-2,3) eq '' ? "ok 72\n" : "not ok 72\n"); # Q P=S R
-print (substr($a,-2) eq '' ? "ok 73\n" : "not ok 73\n"); # Q P=R=S
-print (substr($a,0) eq '' ? "ok 74\n" : "not ok 74\n"); # P=Q=R=S
+ok 78, substr($a,-2,2) eq ''; # Q P=R=S
+ok 79, substr($a,0,0) eq ''; # P=Q=R=S
+ok 80, substr($a,0,1) eq ''; # P=Q=S R
+ok 81, substr($a,-2,3) eq ''; # Q P=S R
+ok 82, substr($a,-2) eq ''; # Q P=R=S
+ok 83, substr($a,0) eq ''; # P=Q=R=S
+
+
+ok 84, substr($a,0,-1) eq ''; # R P=Q=S
+$b = substr($a,-2, 0) ; # warn # Q=R P=S
+ok 85, $w-- == 1 ;
+eval{substr($a,-2, 0) = "" ; }; # Q=R P=S
+ok 86, $@ =~ /$FATAL_MSG/;
+$b = substr($a,-2, 1) ; # warn # Q R P=S
+ok 87, $w-- == 1 ;
+eval{substr($a,-2, 1) = "" ; }; # Q R P=S
+ok 88, $@ =~ /$FATAL_MSG/;
-print (substr($a,0,-1) eq '' ? "ok 75\n" : "not ok 75\n"); # R P=Q=S
-print (fail(substr($a,-2,0)) ? "ok 76\n" : "not ok 76\n"); # Q=R P=S
-print (fail(substr($a,-2,1)) ? "ok 77\n" : "not ok 77\n"); # Q R P=S
-print (fail(substr($a,-2,-1)) ? "ok 78\n" : "not ok 78\n"); # Q R P=S
-print (fail(substr($a,-2,-2)) ? "ok 79\n" : "not ok 79\n"); # Q=R P=S
-print (fail(substr($a,1,-2)) ? "ok 80\n" : "not ok 81\n"); # R P=S Q
-print (fail(substr($a,1,1)) ? "ok 81\n" : "not ok 81\n"); # P=S Q R
-print (fail(substr($a,1,0)) ? "ok 82\n" : "not ok 82\n"); # P=S Q=R
-print (fail(substr($a,1)) ? "ok 83\n" : "not ok 83\n"); # P=R=S Q
+$b = substr($a,-2,-1) ; # warn # Q R P=S
+ok 89, $w-- == 1 ;
+eval{substr($a,-2,-1) = "" ; }; # Q R P=S
+ok 90, $@ =~ /$FATAL_MSG/;
+$b = substr($a,-2,-2) ; # warn # Q=R P=S
+ok 91, $w-- == 1 ;
+eval{substr($a,-2,-2) = "" ; }; # Q=R P=S
+ok 92, $@ =~ /$FATAL_MSG/;
+
+$b = substr($a, 1,-2) ; # warn # R P=S Q
+ok 93, $w-- == 1 ;
+eval{substr($a, 1,-2) = "" ; }; # R P=S Q
+ok 94, $@ =~ /$FATAL_MSG/;
+
+$b = substr($a, 1, 1) ; # warn # P=S Q R
+ok 95, $w-- == 1 ;
+eval{substr($a, 1, 1) = "" ; }; # P=S Q R
+ok 96, $@ =~ /$FATAL_MSG/;
+
+$b = substr($a, 1, 0) ;# warn # P=S Q=R
+ok 97, $w-- == 1 ;
+eval{substr($a, 1, 0) = "" ; }; # P=S Q=R
+ok 98, $@ =~ /$FATAL_MSG/;
+
+$b = substr($a,1) ; # warning # P=R=S Q
+ok 99, $w-- == 1 ;
+eval{substr($a,1) = "" ; }; # P=R=S Q
+ok 100, $@ =~ /$FATAL_MSG/;
my $a = 'zxcvbnm';
substr($a,2,0) = '';
-print $a eq 'zxcvbnm' ? "ok 84\n" : "not ok 84\n";
+ok 101, $a eq 'zxcvbnm';
substr($a,7,0) = '';
-print $a eq 'zxcvbnm' ? "ok 85\n" : "not ok 85\n";
+ok 102, $a eq 'zxcvbnm';
substr($a,5,0) = '';
-print $a eq 'zxcvbnm' ? "ok 86\n" : "not ok 86\n";
+ok 103, $a eq 'zxcvbnm';
substr($a,0,2) = 'pq';
-print $a eq 'pqcvbnm' ? "ok 87\n" : "not ok 87\n";
+ok 104, $a eq 'pqcvbnm';
substr($a,2,0) = 'r';
-print $a eq 'pqrcvbnm' ? "ok 88\n" : "not ok 88\n";
+ok 105, $a eq 'pqrcvbnm';
substr($a,8,0) = 'asd';
-print $a eq 'pqrcvbnmasd' ? "ok 89\n" : "not ok 89\n";
+ok 106, $a eq 'pqrcvbnmasd';
substr($a,0,2) = 'iop';
-print $a eq 'ioprcvbnmasd' ? "ok 90\n" : "not ok 90\n";
+ok 107, $a eq 'ioprcvbnmasd';
substr($a,0,5) = 'fgh';
-print $a eq 'fghvbnmasd' ? "ok 91\n" : "not ok 91\n";
+ok 108, $a eq 'fghvbnmasd';
substr($a,3,5) = 'jkl';
-print $a eq 'fghjklsd' ? "ok 92\n" : "not ok 92\n";
+ok 109, $a eq 'fghjklsd';
substr($a,3,2) = '1234';
-print $a eq 'fgh1234lsd' ? "ok 93\n" : "not ok 93\n";
+ok 110, $a eq 'fgh1234lsd';
# with lexicals (and in re-entered scopes)
@@ -160,52 +221,50 @@ for (0,1) {
unless ($_) {
$txt = "Foo";
substr($txt, -1) = "X";
- print $txt eq "FoX" ? "ok 94\n" : "not ok 94\n";
+ ok 111, $txt eq "FoX";
}
else {
- local $^W = 0; # because of (spurious?) "uninitialised value"
substr($txt, 0, 1) = "X";
- print $txt eq "X" ? "ok 95\n" : "not ok 95\n";
+ ok 112, $txt eq "X";
}
}
+$w = 0 ;
# coercion of references
{
my $s = [];
substr($s, 0, 1) = 'Foo';
- print substr($s,0,7) eq "FooRRAY" && !($w-=2) ? "ok 96\n" : "not ok 96\n";
+ ok 113, substr($s,0,7) eq "FooRRAY" && !($w-=2);
}
# check no spurious warnings
-print $w ? "not ok 97\n" : "ok 97\n";
+ok 114, $w == 0;
# check new 4 arg replacement syntax
$a = "abcxyz";
$w = 0;
-print "not " unless substr($a, 0, 3, "") eq "abc" && $a eq "xyz";
-print "ok 98\n";
-print "not " unless substr($a, 0, 0, "abc") eq "" && $a eq "abcxyz";
-print "ok 99\n";
-print "not " unless substr($a, 3, -1, "") eq "xy" && $a eq "abcz";
-print "ok 100\n";
-
-print "not " unless substr($a, 3, undef, "xy") eq "" && $a eq "abcxyz"
+ok 115, substr($a, 0, 3, "") eq "abc" && $a eq "xyz";
+ok 116, substr($a, 0, 0, "abc") eq "" && $a eq "abcxyz";
+ok 117, substr($a, 3, -1, "") eq "xy" && $a eq "abcz";
+
+ok 118, substr($a, 3, undef, "xy") eq "" && $a eq "abcxyz"
&& $w == 3;
-print "ok 101\n";
+
$w = 0;
-print "not " unless substr($a, 3, 9999999, "") eq "xyz" && $a eq "abc";
-print "ok 102\n";
-print "not " unless fail(substr($a, -99, 0, ""));
-print "ok 103\n";
-print "not " unless fail(substr($a, 99, 3, ""));
-print "ok 104\n";
+ok 119, substr($a, 3, 9999999, "") eq "xyz" && $a eq "abc";
+eval{substr($a, -99, 0, "") };
+ok 120, $@ =~ /$FATAL_MSG/;
+eval{substr($a, 99, 3, "") };
+ok 121, $@ =~ /$FATAL_MSG/;
substr($a, 0, length($a), "foo");
-print "not " unless $a eq "foo" && !$w;
-print "ok 105\n";
+ok 122, $a eq "foo" && !$w;
# using 4 arg substr as lvalue is a compile time error
eval 'substr($a,0,0,"") = "abc"';
-print "not " unless $@ && $@ =~ /Can't modify substr/ && $a eq "foo";
-print "ok 106\n";
+ok 123, $@ && $@ =~ /Can't modify substr/ && $a eq "foo";
+
+$a = "abcdefgh";
+ok 124, sub { shift }->(substr($a, 0, 4, "xxxx")) eq 'abcd';
+ok 125, $a eq 'xxxxefgh';
diff --git a/contrib/perl5/t/op/sysio.t b/contrib/perl5/t/op/sysio.t
index 22e60e3..e43f850 100755
--- a/contrib/perl5/t/op/sysio.t
+++ b/contrib/perl5/t/op/sysio.t
@@ -2,7 +2,7 @@
print "1..39\n";
-chdir('op') || die "sysio.t: cannot look for myself: $!";
+chdir('op') || chdir('t/op') || die "sysio.t: cannot look for myself: $!";
open(I, 'sysio.t') || die "sysio.t: cannot find myself: $!";
diff --git a/contrib/perl5/t/op/taint.t b/contrib/perl5/t/op/taint.t
index 379093f..6548b46 100755
--- a/contrib/perl5/t/op/taint.t
+++ b/contrib/perl5/t/op/taint.t
@@ -9,7 +9,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
use strict;
@@ -19,6 +19,17 @@ use Config;
# just because Errno possibly failing.
eval { require Errno; import Errno };
+BEGIN {
+ if ($^O eq 'VMS' && !defined($Config{d_setenv})) {
+ $ENV{PATH} = $ENV{PATH};
+ $ENV{TERM} = $ENV{TERM} ne ''? $ENV{TERM} : 'dummy';
+ }
+ if ($Config{d_shm} || $Config{d_msg}) {
+ require IPC::SysV;
+ IPC::SysV->import(qw(IPC_PRIVATE IPC_RMID IPC_CREAT S_IRWXU));
+ }
+}
+
my $Is_VMS = $^O eq 'VMS';
my $Is_MSWin32 = $^O eq 'MSWin32';
my $Is_Dos = $^O eq 'dos';
@@ -33,9 +44,9 @@ if ($Is_VMS) {
}
eval <<EndOfCleanup;
END {
- \$ENV{PATH} = '';
+ \$ENV{PATH} = '' if $Config{d_setenv};
warn "# Note: logical name 'PATH' may have been deleted\n";
- @ENV{keys %old} = values %old;
+ \@ENV{keys %old} = values %old;
}
EndOfCleanup
}
@@ -87,7 +98,7 @@ print PROG 'print "@ARGV\n"', "\n";
close PROG;
my $echo = "$Invoke_Perl $ECHO";
-print "1..149\n";
+print "1..151\n";
# First, let's make sure that Perl is checking the dangerous
# environment variables. Maybe they aren't set yet, so we'll
@@ -130,7 +141,7 @@ print "1..149\n";
}
else {
$tmp = (grep { defined and -d and (stat _)[2] & 2 }
- qw(/tmp /var/tmp /usr/tmp /sys$scratch),
+ qw(sys$scratch /tmp /var/tmp /usr/tmp),
@ENV{qw(TMP TEMP)})[0]
or print "# can't find world-writeable directory to test PATH\n";
}
@@ -247,7 +258,8 @@ print "1..149\n";
# Globs should be forbidden, except under VMS,
# which doesn't spawn an external program.
-if ($Is_VMS) {
+if (1 # built-in glob
+ or $Is_VMS) {
for (35..36) { print "ok $_\n"; }
}
else {
@@ -383,10 +395,10 @@ else {
for (76..79) { print "ok $_ # Skipped: open('|') is not available\n" }
}
else {
- test 76, eval { open FOO, "| $foo" } eq '', 'popen to';
+ test 76, eval { open FOO, "| x$foo" } eq '', 'popen to';
test 77, $@ =~ /^Insecure dependency/, $@;
- test 78, eval { open FOO, "$foo |" } eq '', 'popen from';
+ test 78, eval { open FOO, "x$foo |" } eq '', 'popen from';
test 79, $@ =~ /^Insecure dependency/, $@;
}
@@ -539,14 +551,14 @@ else {
my @getpwent = getpwent();
die "getpwent: $!\n" unless (@getpwent);
test 142,( not tainted $getpwent[0]
- and not tainted $getpwent[1]
+ and tainted $getpwent[1]
and not tainted $getpwent[2]
and not tainted $getpwent[3]
and not tainted $getpwent[4]
and not tainted $getpwent[5]
- and tainted $getpwent[6] # gecos
+ and tainted $getpwent[6] # ge?cos
and not tainted $getpwent[7]
- and not tainted $getpwent[8]);
+ and tainted $getpwent[8]); # shell
endpwent();
} else {
for (142) { print "ok $_ # Skipped: getpwent() is not available\n" }
@@ -597,3 +609,74 @@ else {
$why =~ s/e/'-'.$$/ge;
test 149, tainted $why;
}
+
+# test shmread
+{
+ if ($Config{d_shm}) {
+ no strict 'subs';
+ my $sent = "foobar";
+ my $rcvd;
+ my $size = 2000;
+ my $id = shmget(IPC_PRIVATE, $size, S_IRWXU) ||
+ warn "# shmget failed: $!\n";
+ if (defined $id) {
+ if (shmwrite($id, $sent, 0, 60)) {
+ if (shmread($id, $rcvd, 0, 60)) {
+ substr($rcvd, index($rcvd, "\0")) = '';
+ } else {
+ warn "# shmread failed: $!\n";
+ }
+ } else {
+ warn "# shmwrite failed: $!\n";
+ }
+ shmctl($id, IPC_RMID, 0) || warn "# shmctl failed: $!\n";
+ } else {
+ warn "# shmget failed: $!\n";
+ }
+
+ if ($rcvd eq $sent) {
+ test 150, tainted $rcvd;
+ } else {
+ print "ok 150 # Skipped: SysV shared memory operation failed\n";
+ }
+ } else {
+ print "ok 150 # Skipped: SysV shared memory is not available\n";
+ }
+}
+
+# test msgrcv
+{
+ if ($Config{d_msg}) {
+ no strict 'subs';
+ my $id = msgget(IPC_PRIVATE, IPC_CREAT | S_IRWXU);
+
+ my $sent = "message";
+ my $type_sent = 1234;
+ my $rcvd;
+ my $type_rcvd;
+
+ if (defined $id) {
+ if (msgsnd($id, pack("l! a*", $type_sent, $sent), 0)) {
+ if (msgrcv($id, $rcvd, 60, 0, 0)) {
+ ($type_rcvd, $rcvd) = unpack("l! a*", $rcvd);
+ } else {
+ warn "# msgrcv failed\n";
+ }
+ } else {
+ warn "# msgsnd failed\n";
+ }
+ msgctl($id, IPC_RMID, 0) || warn "# msgctl failed: $!\n";
+ } else {
+ warn "# msgget failed\n";
+ }
+
+ if ($rcvd eq $sent && $type_sent == $type_rcvd) {
+ test 151, tainted $rcvd;
+ } else {
+ print "ok 151 # Skipped: SysV message queue operation failed\n";
+ }
+ } else {
+ print "ok 151 # Skipped: SysV message queues are not available\n";
+ }
+}
+
diff --git a/contrib/perl5/t/op/tie.t b/contrib/perl5/t/op/tie.t
index 472a6a7..9543420 100755
--- a/contrib/perl5/t/op/tie.t
+++ b/contrib/perl5/t/op/tie.t
@@ -6,7 +6,7 @@
# Currently it only tests the untie warning
chdir 't' if -d 't';
-@INC = "../lib";
+unshift @INC, "../lib";
$ENV{PERL5LIB} = "../lib";
$|=1;
@@ -77,8 +77,7 @@ EXPECT
########
# strict behaviour, without any extra references
-#use warning 'untie';
-local $^W = 1 ;
+use warnings 'untie';
use Tie::Hash ;
tie %h, Tie::StdHash;
untie %h;
@@ -86,8 +85,7 @@ EXPECT
########
# strict behaviour, with 1 extra references generating an error
-#use warning 'untie';
-local $^W = 1 ;
+use warnings 'untie';
use Tie::Hash ;
$a = tie %h, Tie::StdHash;
untie %h;
@@ -96,8 +94,7 @@ untie attempted while 1 inner references still exist
########
# strict behaviour, with 1 extra references via tied generating an error
-#use warning 'untie';
-local $^W = 1 ;
+use warnings 'untie';
use Tie::Hash ;
tie %h, Tie::StdHash;
$a = tied %h;
@@ -107,8 +104,7 @@ untie attempted while 1 inner references still exist
########
# strict behaviour, with 1 extra references which are destroyed
-#use warning 'untie';
-local $^W = 1 ;
+use warnings 'untie';
use Tie::Hash ;
$a = tie %h, Tie::StdHash;
$a = 0 ;
@@ -117,8 +113,7 @@ EXPECT
########
# strict behaviour, with extra 1 references via tied which are destroyed
-#use warning 'untie';
-local $^W = 1 ;
+use warnings 'untie';
use Tie::Hash ;
tie %h, Tie::StdHash;
$a = tied %h;
@@ -128,8 +123,7 @@ EXPECT
########
# strict error behaviour, with 2 extra references
-#use warning 'untie';
-local $^W = 1 ;
+use warnings 'untie';
use Tie::Hash ;
$a = tie %h, Tie::StdHash;
$b = tied %h ;
@@ -139,14 +133,12 @@ untie attempted while 2 inner references still exist
########
# strict behaviour, check scope of strictness.
-#no warning 'untie';
-local $^W = 0 ;
+no warnings 'untie';
use Tie::Hash ;
$A = tie %H, Tie::StdHash;
$C = $B = tied %H ;
{
- #use warning 'untie';
- local $^W = 1 ;
+ use warnings 'untie';
use Tie::Hash ;
tie %h, Tie::StdHash;
untie %h;
@@ -166,3 +158,15 @@ sub Self::DESTROY { $b = $_[0] + 0; }
}
die unless $a == $b;
EXPECT
+########
+# Interaction of tie and vec
+
+my ($a, $b);
+use Tie::Scalar;
+tie $a,Tie::StdScalar or die;
+vec($b,1,1)=1;
+$a = $b;
+vec($a,1,1)=0;
+vec($b,1,1)=0;
+die unless $a eq $b;
+EXPECT
diff --git a/contrib/perl5/t/op/tiearray.t b/contrib/perl5/t/op/tiearray.t
index 8e78b2f..25fda3f 100755
--- a/contrib/perl5/t/op/tiearray.t
+++ b/contrib/perl5/t/op/tiearray.t
@@ -3,7 +3,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
my %seen;
diff --git a/contrib/perl5/t/op/tiehandle.t b/contrib/perl5/t/op/tiehandle.t
index d7e6a78..6ae3faa 100755
--- a/contrib/perl5/t/op/tiehandle.t
+++ b/contrib/perl5/t/op/tiehandle.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
my @expect;
diff --git a/contrib/perl5/t/op/time.t b/contrib/perl5/t/op/time.t
index 1bec442..caf2c14 100755
--- a/contrib/perl5/t/op/time.t
+++ b/contrib/perl5/t/op/time.t
@@ -2,7 +2,7 @@
# $RCSfile: time.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:32 $
-if ($does_gmtime = gmtime(time)) { print "1..5\n" }
+if ($does_gmtime = gmtime(time)) { print "1..6\n" }
else { print "1..3\n" }
($beguser,$begsys) = times;
@@ -45,3 +45,9 @@ if (index(" :0:1:-1:364:365:-364:-365:",':' . ($localyday - $yday) . ':') > 0)
{print "ok 5\n";}
else
{print "not ok 5\n";}
+
+# This could be stricter.
+if (gmtime() =~ /^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([ \d]\d) (\d\d):(\d\d):(\d\d) (\d\d\d\d)$/)
+ {print "ok 6\n";}
+else
+ {print "not ok 6\n";}
diff --git a/contrib/perl5/t/op/tr.t b/contrib/perl5/t/op/tr.t
index 3503c3c..4e6667c 100755
--- a/contrib/perl5/t/op/tr.t
+++ b/contrib/perl5/t/op/tr.t
@@ -1,5 +1,10 @@
# tr.t
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, "../lib";
+}
+
print "1..4\n";
$_ = "abcdefghijklmnopqrstuvwxyz";
@@ -22,12 +27,13 @@ print "ok 3\n";
# In EBCDIC 'I' is \xc9 and 'J' is \0xd1, 'i' is \x89 and 'j' is \x91.
# Yes, discontinuities. Regardless, the \xca in the below should stay
# untouched (and not became \x8a).
+{
+ no utf8;
+ $_ = "I\xcaJ";
-$_ = "I\xcaJ";
-
-tr/I-J/i-j/;
-
-print "not " unless $_ eq "i\xcaj";
-print "ok 4\n";
+ tr/I-J/i-j/;
+ print "not " unless $_ eq "i\xcaj";
+ print "ok 4\n";
+}
#
diff --git a/contrib/perl5/t/op/undef.t b/contrib/perl5/t/op/undef.t
index 5b3c7ef..8944ee3 100755
--- a/contrib/perl5/t/op/undef.t
+++ b/contrib/perl5/t/op/undef.t
@@ -1,6 +1,11 @@
#!./perl
-print "1..23\n";
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+print "1..27\n";
print defined($a) ? "not ok 1\n" : "ok 1\n";
@@ -59,3 +64,18 @@ print $@ =~ /^Modification of a read/ ? "ok 22\n" : "not ok 22\n";
eval { $1 = undef };
print $@ =~ /^Modification of a read/ ? "ok 23\n" : "not ok 23\n";
+{
+ require Tie::Hash;
+ tie my %foo, 'Tie::StdHash';
+ print defined %foo ? "ok 24\n" : "not ok 24\n";
+ %foo = ( a => 1 );
+ print defined %foo ? "ok 25\n" : "not ok 25\n";
+}
+
+{
+ require Tie::Array;
+ tie my @foo, 'Tie::StdArray';
+ print defined @foo ? "ok 26\n" : "not ok 26\n";
+ @foo = ( a => 1 );
+ print defined @foo ? "ok 27\n" : "not ok 27\n";
+}
diff --git a/contrib/perl5/t/op/universal.t b/contrib/perl5/t/op/universal.t
index bde78fd..a6bd03d 100755
--- a/contrib/perl5/t/op/universal.t
+++ b/contrib/perl5/t/op/universal.t
@@ -5,10 +5,10 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
-print "1..72\n";
+print "1..73\n";
$a = {};
bless $a, "Bob";
@@ -70,7 +70,7 @@ test ! $a->can("export_tags"); # a method in Exporter
test (eval { $a->VERSION }) == 2.718;
test ! (eval { $a->VERSION(2.719) }) &&
- $@ =~ /^Alice version 2.719 required--this is only version 2.718 at /;
+ $@ =~ /^Alice version 2.71(?:9|8999\d+) required--this is only version 2.718 at /;
test (eval { $a->VERSION(2.718) }) && ! $@;
@@ -102,3 +102,5 @@ test $a->can("sleep");
test ! UNIVERSAL::can($b, "can");
test ! $a->can("export_tags"); # a method in Exporter
+
+test ! UNIVERSAL::isa("\xff\xff\xff\0", 'HASH');
diff --git a/contrib/perl5/t/op/vec.t b/contrib/perl5/t/op/vec.t
index 7117144..bf60fc4 100755
--- a/contrib/perl5/t/op/vec.t
+++ b/contrib/perl5/t/op/vec.t
@@ -8,7 +8,7 @@ print vec($foo,0,1) == 0 ? "ok 1\n" : "not ok 1\n";
print length($foo) == 0 ? "ok 2\n" : "not ok 2\n";
vec($foo,0,1) = 1;
print length($foo) == 1 ? "ok 3\n" : "not ok 3\n";
-print ord($foo) == 1 ? "ok 4\n" : "not ok 4\n";
+print unpack('C',$foo) == 1 ? "ok 4\n" : "not ok 4\n";
print vec($foo,0,1) == 1 ? "ok 5\n" : "not ok 5\n";
print vec($foo,20,1) == 0 ? "ok 6\n" : "not ok 6\n";
@@ -18,7 +18,7 @@ print length($foo) == 3 ? "ok 8\n" : "not ok 8\n";
print vec($foo,1,8) == 0 ? "ok 9\n" : "not ok 9\n";
vec($foo,1,8) = 0xf1;
print vec($foo,1,8) == 0xf1 ? "ok 10\n" : "not ok 10\n";
-print ((ord(substr($foo,1,1)) & 255) == 0xf1 ? "ok 11\n" : "not ok 11\n");
+print ((unpack('C',substr($foo,1,1)) & 255) == 0xf1 ? "ok 11\n" : "not ok 11\n");
print vec($foo,2,4) == 1 ? "ok 12\n" : "not ok 12\n";
print vec($foo,3,4) == 15 ? "ok 13\n" : "not ok 13\n";
vec($Vec, 0, 32) = 0xbaddacab;
diff --git a/contrib/perl5/t/op/ver.t b/contrib/perl5/t/op/ver.t
new file mode 100755
index 0000000..b08849f
--- /dev/null
+++ b/contrib/perl5/t/op/ver.t
@@ -0,0 +1,96 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, "../lib";
+}
+
+print "1..22\n";
+
+my $test = 1;
+
+use v5.5.640;
+require v5.5.640;
+print "ok $test\n"; ++$test;
+
+# printing characters should work
+print v111;
+print v107.32;
+print "$test\n"; ++$test;
+
+# hash keys too
+$h{v111.107} = "ok";
+print "$h{ok} $test\n"; ++$test;
+
+# poetry optimization should also
+sub v77 { "ok" }
+$x = v77;
+print "$x $test\n"; ++$test;
+
+# but not when dots are involved
+$x = v77.78.79;
+print "not " unless $x eq "MNO";
+print "ok $test\n"; ++$test;
+
+print "not " unless v1.20.300.4000 eq "\x{1}\x{14}\x{12c}\x{fa0}";
+print "ok $test\n"; ++$test;
+
+#
+# now do the same without the "v"
+use 5.5.640;
+require 5.5.640;
+print "ok $test\n"; ++$test;
+
+# hash keys too
+$h{111.107.32} = "ok";
+print "$h{ok } $test\n"; ++$test;
+
+$x = 77.78.79;
+print "not " unless $x eq "MNO";
+print "ok $test\n"; ++$test;
+
+print "not " unless 1.20.300.4000 eq "\x{1}\x{14}\x{12c}\x{fa0}";
+print "ok $test\n"; ++$test;
+
+# test sprintf("%vd"...) etc
+print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+print "ok $test\n"; ++$test;
+
+print "not " unless sprintf("%vd", v1.22.333.4444) eq '1.22.333.4444';
+print "ok $test\n"; ++$test;
+
+print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+print "ok $test\n"; ++$test;
+
+print "not " unless sprintf("%vX", 1.22.333.4444) eq '1.16.14D.115C';
+print "ok $test\n"; ++$test;
+
+print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+print "ok $test\n"; ++$test;
+
+print "not " unless sprintf("%*vb", "##", v1.22.333.4444)
+ eq '1##10110##101001101##1000101011100';
+print "ok $test\n"; ++$test;
+
+{
+ use bytes;
+ print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+ print "ok $test\n"; ++$test;
+
+ print "not " unless
+ sprintf("%vd", 1.22.333.4444) eq '1.22.197.141.225.133.156';
+ print "ok $test\n"; ++$test;
+
+ print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+ print "ok $test\n"; ++$test;
+
+ print "not " unless sprintf("%vX", v1.22.333.4444) eq '1.16.C5.8D.E1.85.9C';
+ print "ok $test\n"; ++$test;
+
+ print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+ print "ok $test\n"; ++$test;
+
+ print "not " unless sprintf("%*vb", "##", v1.22.333.4444)
+ eq '1##10110##11000101##10001101##11100001##10000101##10011100';
+ print "ok $test\n"; ++$test;
+}
diff --git a/contrib/perl5/t/op/write.t b/contrib/perl5/t/op/write.t
index 9918b2f..87d5042 100755
--- a/contrib/perl5/t/op/write.t
+++ b/contrib/perl5/t/op/write.t
@@ -1,8 +1,6 @@
#!./perl
-# $RCSfile: write.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:38 $
-
-print "1..6\n";
+print "1..8\n";
my $CAT = ($^O eq 'MSWin32') ? 'type' : 'cat';
@@ -190,3 +188,16 @@ if (`$CAT Op_write.tmp` eq $right)
else
{ print "not ok 6\n"; }
+# test lexicals and globals
+{
+ my $this = "ok";
+ our $that = 7;
+ format LEX =
+@<<@|
+$this,$that
+.
+ open(LEX, ">&STDOUT") or die;
+ write LEX;
+ $that = 8;
+ write LEX;
+}
diff --git a/contrib/perl5/t/pod/emptycmd.t b/contrib/perl5/t/pod/emptycmd.t
new file mode 100755
index 0000000..d348a9d
--- /dev/null
+++ b/contrib/perl5/t/pod/emptycmd.t
@@ -0,0 +1,21 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+__END__
+
+=pod
+
+= this is a test
+of the emergency
+broadcast system
+
+=cut
diff --git a/contrib/perl5/t/pod/emptycmd.xr b/contrib/perl5/t/pod/emptycmd.xr
new file mode 100644
index 0000000..f06d2db
--- /dev/null
+++ b/contrib/perl5/t/pod/emptycmd.xr
@@ -0,0 +1,2 @@
+ = this is a test of the emergency broadcast system
+
diff --git a/contrib/perl5/t/pod/for.t b/contrib/perl5/t/pod/for.t
new file mode 100755
index 0000000..b8a6ec5
--- /dev/null
+++ b/contrib/perl5/t/pod/for.t
@@ -0,0 +1,59 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+=pod
+
+This is a test
+
+=for theloveofpete
+You shouldn't see this
+or this
+or this
+
+=for text
+pod2text should see this
+and this
+and this
+
+and everything should see this!
+
+=begin text
+
+Similarly, this line ...
+
+and this one ...
+
+as well this one,
+
+should all be in pod2text output
+
+=end text
+
+Tweedley-deedley-dee, Im as happy as can be!
+Tweedley-deedley-dum, cuz youre my honey sugar plum!
+
+=begin atthebeginning
+
+But I expect to see neither hide ...
+
+nor tail ...
+
+of this text
+
+=end atthebeginning
+
+The rest of this should show up in everything.
+
diff --git a/contrib/perl5/t/pod/for.xr b/contrib/perl5/t/pod/for.xr
new file mode 100644
index 0000000..5f6b8b2
--- /dev/null
+++ b/contrib/perl5/t/pod/for.xr
@@ -0,0 +1,21 @@
+ This is a test
+
+ pod2text should see this
+ and this
+ and this
+
+ and everything should see this!
+
+Similarly, this line ...
+
+and this one ...
+
+as well this one,
+
+should all be in pod2text output
+
+ Tweedley-deedley-dee, Im as happy as can be! Tweedley-deedley-dum, cuz
+ youre my honey sugar plum!
+
+ The rest of this should show up in everything.
+
diff --git a/contrib/perl5/t/pod/headings.t b/contrib/perl5/t/pod/headings.t
new file mode 100755
index 0000000..fc7b4b2
--- /dev/null
+++ b/contrib/perl5/t/pod/headings.t
@@ -0,0 +1,140 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+#################################################################
+ use Pod::Usage;
+ pod2usage( VERBOSE => 2, EXIT => 1 );
+
+=pod
+
+=head1 NAME
+
+B<rdb2pg> - insert an rdb table into a PostgreSQL database
+
+=head1 SYNOPSIS
+
+B<rdb2pg> [I<param>=I<value> ...]
+
+=head1 PARAMETERS
+
+B<rdb2pg> uses an IRAF-compatible parameter interface.
+A template parameter file is in F</proj/axaf/simul/lib/uparm/rdb2pg.par>.
+
+=over 4
+
+=item B<input> I<file>
+
+The B<RDB> file to insert into the database. If the given name
+is the string C<stdin>, it reads from the UNIX standard input stream.
+
+
+=back
+
+=head1 DESCRIPTION
+
+B<rdb2pg> will enter the data from an B<RDB> database into a
+PostgreSQL database table, optionally creating the database and the
+table if they do not exist. It automatically determines the
+PostgreSQL data type from the column definition in the B<RDB> file,
+but may be overriden via a series of definition files or directly
+via one of its parameters.
+
+The target database and table are specified by the C<db> and C<table>
+parameters. If they do not exist, and the C<createdb> parameter is
+set, they will be created. Table field definitions are determined
+in the following order:
+
+=cut
+
+#################################################################
+
+results in:
+
+
+#################################################################
+
+ rdb2pg - insert an rdb table into a PostgreSQL database
+
+ rdb2pg [*param*=*value* ...]
+
+ rdb2pg uses an IRAF-compatible parameter interface. A template
+ parameter file is in /proj/axaf/simul/lib/uparm/rdb2pg.par.
+
+ The RDB file to insert into the database. If the given name is
+ the string `stdin', it reads from the UNIX standard input
+ stream.
+
+ rdb2pg will enter the data from an RDB database into a
+ PostgreSQL database table, optionally creating the database and
+ the table if they do not exist. It automatically determines the
+ PostgreSQL data type from the column definition in the RDB file,
+ but may be overriden via a series of definition files or
+ directly via one of its parameters.
+
+ The target database and table are specified by the `db' and
+ `table' parameters. If they do not exist, and the `createdb'
+ parameter is set, they will be created. Table field definitions
+ are determined in the following order:
+
+
+#################################################################
+
+while the original version of Text (using pod2text) gives
+
+#################################################################
+
+NAME
+ rdb2pg - insert an rdb table into a PostgreSQL database
+
+SYNOPSIS
+ rdb2pg [*param*=*value* ...]
+
+PARAMETERS
+ rdb2pg uses an IRAF-compatible parameter interface. A template
+ parameter file is in /proj/axaf/simul/lib/uparm/rdb2pg.par.
+
+ input *file*
+ The RDB file to insert into the database. If the given name
+ is the string `stdin', it reads from the UNIX standard input
+ stream.
+
+DESCRIPTION
+ rdb2pg will enter the data from an RDB database into a
+ PostgreSQL database table, optionally creating the database and
+ the table if they do not exist. It automatically determines the
+ PostgreSQL data type from the column definition in the RDB file,
+ but may be overriden via a series of definition files or
+ directly via one of its parameters.
+
+ The target database and table are specified by the `db' and
+ `table' parameters. If they do not exist, and the `createdb'
+ parameter is set, they will be created. Table field definitions
+ are determined in the following order:
+
+
+#################################################################
+
+
+Thanks for any help. If, as your email indicates, you've not much
+time to look at this, I can work around things by calling pod2text()
+directly using the official Text.pm.
+
+Diab
+
+-------------
+Diab Jerius
+djerius@cfa.harvard.edu
+
diff --git a/contrib/perl5/t/pod/headings.xr b/contrib/perl5/t/pod/headings.xr
new file mode 100644
index 0000000..fb37a2b
--- /dev/null
+++ b/contrib/perl5/t/pod/headings.xr
@@ -0,0 +1,26 @@
+NAME
+ rdb2pg - insert an rdb table into a PostgreSQL database
+
+SYNOPSIS
+ rdb2pg [*param*=*value* ...]
+
+PARAMETERS
+ rdb2pg uses an IRAF-compatible parameter interface. A template parameter
+ file is in /proj/axaf/simul/lib/uparm/rdb2pg.par.
+
+ input *file*
+ The RDB file to insert into the database. If the given name is the
+ string `stdin', it reads from the UNIX standard input stream.
+
+DESCRIPTION
+ rdb2pg will enter the data from an RDB database into a PostgreSQL
+ database table, optionally creating the database and the table if they
+ do not exist. It automatically determines the PostgreSQL data type from
+ the column definition in the RDB file, but may be overriden via a series
+ of definition files or directly via one of its parameters.
+
+ The target database and table are specified by the `db' and `table'
+ parameters. If they do not exist, and the `createdb' parameter is set,
+ they will be created. Table field definitions are determined in the
+ following order:
+
diff --git a/contrib/perl5/t/pod/include.t b/contrib/perl5/t/pod/include.t
new file mode 100755
index 0000000..6d0b7e3
--- /dev/null
+++ b/contrib/perl5/t/pod/include.t
@@ -0,0 +1,36 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+=pod
+
+This file tries to demonstrate a simple =include directive
+for pods. It is used as follows:
+
+ =include filename
+
+where "filename" is expected to be an absolute pathname, or else
+reside be relative to the directory in which the current processed
+podfile resides, or be relative to the current directory.
+
+Lets try it out with the file "included.t" shall we.
+
+***THIS TEXT IS IMMEDIATELY BEFORE THE INCLUDE***
+
+=include included.t
+
+***THIS TEXT IS IMMEDIATELY AFTER THE INCLUDE***
+
+So how did we do???
diff --git a/contrib/perl5/t/pod/include.xr b/contrib/perl5/t/pod/include.xr
new file mode 100644
index 0000000..624ee44
--- /dev/null
+++ b/contrib/perl5/t/pod/include.xr
@@ -0,0 +1,22 @@
+ This file tries to demonstrate a simple =include directive for pods. It
+ is used as follows:
+
+ =include filename
+
+ where "filename" is expected to be an absolute pathname, or else reside
+ be relative to the directory in which the current processed podfile
+ resides, or be relative to the current directory.
+
+ Lets try it out with the file "included.t" shall we.
+
+ ***THIS TEXT IS IMMEDIATELY BEFORE THE INCLUDE***
+
+###### begin =include included.t #####
+ This is the text of the included file named "included.t". It should
+ appear in the final pod document from pod2xxx
+
+###### end =include included.t #####
+ ***THIS TEXT IS IMMEDIATELY AFTER THE INCLUDE***
+
+ So how did we do???
+
diff --git a/contrib/perl5/t/pod/included.t b/contrib/perl5/t/pod/included.t
new file mode 100755
index 0000000..0e31a09
--- /dev/null
+++ b/contrib/perl5/t/pod/included.t
@@ -0,0 +1,35 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+##------------------------------------------------------------
+# This file is =included by "include.t"
+#
+# This text should NOT be in the resultant pod document
+# because we havent seen an =xxx pod directive in this file!
+##------------------------------------------------------------
+
+=pod
+
+This is the text of the included file named "included.t".
+It should appear in the final pod document from pod2xxx
+
+=cut
+
+##------------------------------------------------------------
+# This text should NOT be in the resultant pod document
+# because it is *after* an =cut an no other pod directives
+# proceed it!
+##------------------------------------------------------------
diff --git a/contrib/perl5/t/pod/included.xr b/contrib/perl5/t/pod/included.xr
new file mode 100644
index 0000000..54142fa
--- /dev/null
+++ b/contrib/perl5/t/pod/included.xr
@@ -0,0 +1,3 @@
+ This is the text of the included file named "included.t". It should
+ appear in the final pod document from pod2xxx
+
diff --git a/contrib/perl5/t/pod/lref.t b/contrib/perl5/t/pod/lref.t
new file mode 100755
index 0000000..e367d6d
--- /dev/null
+++ b/contrib/perl5/t/pod/lref.t
@@ -0,0 +1,66 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+=pod
+
+Try out I<LOTS> of different ways of specifying references:
+
+Reference the L<manpage/section>
+
+Reference the L<manpage / section>
+
+Reference the L<manpage/ section>
+
+Reference the L<manpage /section>
+
+Reference the L<"manpage/section">
+
+Reference the L<"manpage"/section>
+
+Reference the L<manpage/"section">
+
+Reference the L<manpage/
+section>
+
+Reference the L<manpage
+/section>
+
+Now try it using the new "|" stuff ...
+
+Reference the L<thistext|manpage/section>
+
+Reference the L<thistext | manpage / section>
+
+Reference the L<thistext| manpage/ section>
+
+Reference the L<thistext |manpage /section>
+
+Reference the L<thistext|
+"manpage/section">
+
+Reference the L<thistext
+|"manpage"/section>
+
+Reference the L<thistext|manpage/"section">
+
+Reference the L<thistext|
+manpage/
+section>
+
+Reference the L<thistext
+|manpage
+/section>
+
diff --git a/contrib/perl5/t/pod/lref.xr b/contrib/perl5/t/pod/lref.xr
new file mode 100644
index 0000000..297053b
--- /dev/null
+++ b/contrib/perl5/t/pod/lref.xr
@@ -0,0 +1,40 @@
+ Try out *LOTS* of different ways of specifying references:
+
+ Reference the the section entry in the manpage manpage
+
+ Reference the the section entry in the manpage manpage
+
+ Reference the the section entry in the manpage manpage
+
+ Reference the the section entry in the manpage manpage
+
+ Reference the the section on "manpage/section"
+
+ Reference the the section entry in the "manpage" manpage
+
+ Reference the the section on "section" in the manpage manpage
+
+ Reference the the section entry in the manpage manpage
+
+ Reference the the section entry in the manpage manpage
+
+ Now try it using the new "|" stuff ...
+
+ Reference the thistext
+
+ Reference the thistext
+
+ Reference the thistext
+
+ Reference the thistext
+
+ Reference the thistext
+
+ Reference the thistext
+
+ Reference the thistext
+
+ Reference the thistext
+
+ Reference the thistext
+
diff --git a/contrib/perl5/t/pod/multiline_items.t b/contrib/perl5/t/pod/multiline_items.t
new file mode 100755
index 0000000..37e8d53
--- /dev/null
+++ b/contrib/perl5/t/pod/multiline_items.t
@@ -0,0 +1,31 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+=head1 Test multiline item lists
+
+This is a test to ensure that multiline =item paragraphs
+get indented appropriately.
+
+=over 4
+
+=item This
+is
+a
+test.
+
+=back
+
+=cut
diff --git a/contrib/perl5/t/pod/multiline_items.xr b/contrib/perl5/t/pod/multiline_items.xr
new file mode 100644
index 0000000..dddf05f
--- /dev/null
+++ b/contrib/perl5/t/pod/multiline_items.xr
@@ -0,0 +1,5 @@
+Test multiline item lists
+ This is a test to ensure that multiline =item paragraphs get indented
+ appropriately.
+
+ This is a test.
diff --git a/contrib/perl5/t/pod/nested_items.t b/contrib/perl5/t/pod/nested_items.t
new file mode 100755
index 0000000..9c09801
--- /dev/null
+++ b/contrib/perl5/t/pod/nested_items.t
@@ -0,0 +1,64 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+=head1 Test nested item lists
+
+This is a test to ensure the nested =item paragraphs
+get indented appropriately.
+
+=over 2
+
+=item 1
+
+First section.
+
+=over 2
+
+=item a
+
+this is item a
+
+=item b
+
+this is item b
+
+=back
+
+=item 2
+
+Second section.
+
+=over 2
+
+=item a
+
+this is item a
+
+=item b
+
+this is item b
+
+=item c
+
+=item d
+
+This is item c & d.
+
+=back
+
+=back
+
+=cut
diff --git a/contrib/perl5/t/pod/nested_items.xr b/contrib/perl5/t/pod/nested_items.xr
new file mode 100644
index 0000000..dd1adac
--- /dev/null
+++ b/contrib/perl5/t/pod/nested_items.xr
@@ -0,0 +1,19 @@
+Test nested item lists
+ This is a test to ensure the nested =item paragraphs get indented
+ appropriately.
+
+ 1 First section.
+
+ a this is item a
+
+ b this is item b
+
+ 2 Second section.
+
+ a this is item a
+
+ b this is item b
+
+ c
+ d This is item c & d.
+
diff --git a/contrib/perl5/t/pod/nested_seqs.t b/contrib/perl5/t/pod/nested_seqs.t
new file mode 100755
index 0000000..6a5405b
--- /dev/null
+++ b/contrib/perl5/t/pod/nested_seqs.t
@@ -0,0 +1,23 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+=pod
+
+The statement: C<This is dog kind's I<finest> hour!> is a parody of a
+quotation from Winston Churchill.
+
+=cut
+
diff --git a/contrib/perl5/t/pod/nested_seqs.xr b/contrib/perl5/t/pod/nested_seqs.xr
new file mode 100644
index 0000000..f981061
--- /dev/null
+++ b/contrib/perl5/t/pod/nested_seqs.xr
@@ -0,0 +1,3 @@
+ The statement: `This is dog kind's *finest* hour!' is a parody of a
+ quotation from Winston Churchill.
+
diff --git a/contrib/perl5/t/pod/oneline_cmds.t b/contrib/perl5/t/pod/oneline_cmds.t
new file mode 100755
index 0000000..3081ef4
--- /dev/null
+++ b/contrib/perl5/t/pod/oneline_cmds.t
@@ -0,0 +1,46 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+==head1 NAME
+B<rdb2pg> - insert an rdb table into a PostgreSQL database
+
+==head1 SYNOPSIS
+B<rdb2pg> [I<param>=I<value> ...]
+
+==head1 PARAMETERS
+B<rdb2pg> uses an IRAF-compatible parameter interface.
+A template parameter file is in F</proj/axaf/simul/lib/uparm/rdb2pg.par>.
+
+==over 4
+==item B<input> I<file>
+The B<RDB> file to insert into the database. If the given name
+is the string C<stdin>, it reads from the UNIX standard input stream.
+
+==back
+
+==head1 DESCRIPTION
+B<rdb2pg> will enter the data from an B<RDB> database into a
+PostgreSQL database table, optionally creating the database and the
+table if they do not exist. It automatically determines the
+PostgreSQL data type from the column definition in the B<RDB> file,
+but may be overriden via a series of definition files or directly
+via one of its parameters.
+
+The target database and table are specified by the C<db> and C<table>
+parameters. If they do not exist, and the C<createdb> parameter is
+set, they will be created. Table field definitions are determined
+in the following order:
+
diff --git a/contrib/perl5/t/pod/oneline_cmds.xr b/contrib/perl5/t/pod/oneline_cmds.xr
new file mode 100644
index 0000000..fb37a2b
--- /dev/null
+++ b/contrib/perl5/t/pod/oneline_cmds.xr
@@ -0,0 +1,26 @@
+NAME
+ rdb2pg - insert an rdb table into a PostgreSQL database
+
+SYNOPSIS
+ rdb2pg [*param*=*value* ...]
+
+PARAMETERS
+ rdb2pg uses an IRAF-compatible parameter interface. A template parameter
+ file is in /proj/axaf/simul/lib/uparm/rdb2pg.par.
+
+ input *file*
+ The RDB file to insert into the database. If the given name is the
+ string `stdin', it reads from the UNIX standard input stream.
+
+DESCRIPTION
+ rdb2pg will enter the data from an RDB database into a PostgreSQL
+ database table, optionally creating the database and the table if they
+ do not exist. It automatically determines the PostgreSQL data type from
+ the column definition in the RDB file, but may be overriden via a series
+ of definition files or directly via one of its parameters.
+
+ The target database and table are specified by the `db' and `table'
+ parameters. If they do not exist, and the `createdb' parameter is set,
+ they will be created. Table field definitions are determined in the
+ following order:
+
diff --git a/contrib/perl5/t/pod/pod2usage.t b/contrib/perl5/t/pod/pod2usage.t
new file mode 100755
index 0000000..bceeeef
--- /dev/null
+++ b/contrib/perl5/t/pod/pod2usage.t
@@ -0,0 +1,18 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+=include pod2usage.PL
+
+
diff --git a/contrib/perl5/t/pod/pod2usage.xr b/contrib/perl5/t/pod/pod2usage.xr
new file mode 100644
index 0000000..7315d40
--- /dev/null
+++ b/contrib/perl5/t/pod/pod2usage.xr
@@ -0,0 +1,55 @@
+###### begin =include pod2usage.PL #####
+NAME
+ pod2usage - print usage messages from embedded pod docs in files
+
+SYNOPSIS
+ pod2usage [-help] [-man] [-exit *exitval*] [-output *outfile*]
+ [-verbose *level*] [-pathlist *dirlist*] *file*
+
+OPTIONS AND ARGUMENTS
+ -help Print a brief help message and exit.
+
+ -man Print this command's manual page and exit.
+
+ -exit *exitval*
+ The exit status value to return.
+
+ -output *outfile*
+ The output file to print to. If the special names "-" or ">&1"
+ or ">&STDOUT" are used then standard output is used. If ">&2" or
+ ">&STDERR" is used then standard error is used.
+
+ -verbose *level*
+ The desired level of verbosity to use:
+
+ 1 : print SYNOPSIS only
+ 2 : print SYNOPSIS sections and any OPTIONS/ARGUMENTS sections
+ 3 : print the entire manpage (similar to running pod2text)
+
+ -pathlist *dirlist*
+ Specifies one or more directories to search for the input file
+ if it was not supplied with an absolute path. Each directory
+ path in the given list should be separated by a ':' on Unix (';'
+ on MSWin32 and DOS).
+
+ *file* The pathname of a file containing pod documentation to be output
+ in usage mesage format (defaults to standard input).
+
+DESCRIPTION
+ pod2usage will read the given input file looking for pod documentation
+ and will print the corresponding usage message. If no input file is
+ specifed than standard input is read.
+
+ pod2usage invokes the pod2usage() function in the Pod::Usage module.
+ Please see the pod2usage() entry in the Pod::Usage manpage.
+
+SEE ALSO
+ the Pod::Usage manpage, the pod2text(1) manpage
+
+AUTHOR
+ Brad Appleton <bradapp@enteract.com>
+
+ Based on code for pod2text(1) written by Tom Christiansen
+ <tchrist@mox.perl.com>
+
+###### end =include pod2usage.PL #####
diff --git a/contrib/perl5/t/pod/poderrs.t b/contrib/perl5/t/pod/poderrs.t
new file mode 100755
index 0000000..ec632c2
--- /dev/null
+++ b/contrib/perl5/t/pod/poderrs.t
@@ -0,0 +1,125 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testpchk.pl";
+ import TestPodChecker;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodchecker \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+### Deliberately throw in some blank but non-empty lines
+
+### The above line should contain spaces
+
+
+__END__
+
+
+=head1 NAME
+
+poderrors.t - test Pod::Checker on some pod syntax errors
+
+=unknown1 this is an unknown command with two N<unknownA>
+and D<unknownB> interior sequences.
+
+This is some paragraph text with some unknown interior sequences,
+such as Q<unknown2>,
+A<unknown3>,
+and Y<unknown4 V<unknown5>>.
+
+Now try some unterminated sequences like
+I<hello mudda!
+B<hello fadda!
+
+Here I am at C<camp granada!
+
+Camps is very,
+entertaining.
+And they say we'll have some fun if it stops raining!
+
+Okay, now use a non-empty blank line to terminate a paragraph and make
+sure we get a warning.
+
+The above blank line contains tabs and spaces only
+
+=head1 Additional tests
+
+=head2 item without over
+
+=item oops
+
+=head2 back without over
+
+=back
+
+=head2 over without back
+
+=over 4
+
+=item oops
+
+=head2 end without begin
+
+=end
+
+=head2 begin and begin
+
+=begin html
+
+=begin text
+
+=end
+
+=end
+
+=head2 Nested sequences of the same type
+
+C<code I<italic C<code again!>>>
+
+=head2 Garbled entities
+
+E<alea iacta est>
+E<C<auml>>
+E<abcI<bla>>
+
+=head2 Unresolved internal links
+
+L</"begin or begin">
+L<"end with begin">
+L</OoPs>
+
+=head2 Some links with problems
+
+L<abc
+def>
+L<>
+L<"Warnings"> this one is ok
+
+=head2 Warnings
+
+L<passwd(5)>
+L< some text|page/"section" >
+
+=over 4
+
+=item bla
+
+=back 200
+
+=begin html
+
+What?
+
+=end xml
+
+=over 4
+
+=back
+
+see these unescaped < and > in the text?
+
+=cut
+
diff --git a/contrib/perl5/t/pod/poderrs.xr b/contrib/perl5/t/pod/poderrs.xr
new file mode 100644
index 0000000..b8e5e86
--- /dev/null
+++ b/contrib/perl5/t/pod/poderrs.xr
@@ -0,0 +1,33 @@
+*** ERROR: Unknown command 'unknown1' at line 25 in file pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'Q' at line 29 in file pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'A' at line 30 in file pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'Y' at line 31 in file pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'V' at line 31 in file pod/poderrs.t
+*** ERROR: unterminated B<...> at line 35 in file pod/poderrs.t
+*** ERROR: unterminated I<...> at line 34 in file pod/poderrs.t
+*** ERROR: unterminated C<...> at line 37 in file pod/poderrs.t
+*** WARNING: line containing nothing but whitespace in paragraph at line 45 in file pod/poderrs.t
+*** ERROR: =item without previous =over at line 52 in file pod/poderrs.t
+*** ERROR: =back without previous =over at line 56 in file pod/poderrs.t
+*** ERROR: =over on line 60 without closing =back (at head2) at line 64 in file pod/poderrs.t
+*** ERROR: =end without =begin at line 66 in file pod/poderrs.t
+*** ERROR: Nested =begin's (first at line 70:html) at line 72 in file pod/poderrs.t
+*** ERROR: =end without =begin at line 76 in file pod/poderrs.t
+*** ERROR: nested commands C<...C<...>...> at line 80 in file pod/poderrs.t
+*** ERROR: garbled entity E<alea iacta est> at line 84 in file pod/poderrs.t
+*** ERROR: garbled entity E<C<auml>> at line 85 in file pod/poderrs.t
+*** ERROR: garbled entity E<abcI<bla>> at line 86 in file pod/poderrs.t
+*** WARNING: collapsing newlines to blanks at line 96 in file pod/poderrs.t
+*** ERROR: malformed link L<> : empty link at line 98 in file pod/poderrs.t
+*** WARNING: ignoring leading whitespace in link at line 104 in file pod/poderrs.t
+*** WARNING: ignoring trailing whitespace in link at line 104 in file pod/poderrs.t
+*** ERROR: Spurious character(s) after =back at line 110 in file pod/poderrs.t
+*** WARNING: No items in =over (at line 118) / =back list at line 120 in file pod/poderrs.t
+*** WARNING: 2 unescaped <> in paragraph at line 122 in file pod/poderrs.t
+*** ERROR: unresolved internal link 'begin or begin' at line 90 in file pod/poderrs.t
+*** ERROR: unresolved internal link 'end with begin' at line 91 in file pod/poderrs.t
+*** ERROR: unresolved internal link 'OoPs' at line 92 in file pod/poderrs.t
+*** ERROR: unresolved internal link 'abc def' at line 96 in file pod/poderrs.t
+*** ERROR: unresolved internal link 'passwd(5)' at line 103 in file pod/poderrs.t
+*** WARNING: multiple occurence of link target 'oops' at line - in file pod/poderrs.t
+pod/poderrs.t has 25 pod syntax errors.
diff --git a/contrib/perl5/t/pod/podselect.t b/contrib/perl5/t/pod/podselect.t
new file mode 100755
index 0000000..30eb30c
--- /dev/null
+++ b/contrib/perl5/t/pod/podselect.t
@@ -0,0 +1,18 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+=include podselect.PL
+
+
diff --git a/contrib/perl5/t/pod/podselect.xr b/contrib/perl5/t/pod/podselect.xr
new file mode 100644
index 0000000..7d1188d
--- /dev/null
+++ b/contrib/perl5/t/pod/podselect.xr
@@ -0,0 +1,42 @@
+###### begin =include podselect.PL #####
+NAME
+ podselect - print selected sections of pod documentation on standard
+ output
+
+SYNOPSIS
+ podselect [-help] [-man] [-section *section-spec*] [*file* ...]
+
+OPTIONS AND ARGUMENTS
+ -help Print a brief help message and exit.
+
+ -man Print the manual page and exit.
+
+ -section *section-spec*
+ Specify a section to include in the output. See the section on
+ "SECTION SPECIFICATIONS" in the Pod::Parser manpage for the
+ format to use for *section-spec*. This option may be given
+ multiple times on the command line.
+
+ *file* The pathname of a file from which to select sections of pod
+ documentation (defaults to standard input).
+
+DESCRIPTION
+ podselect will read the given input files looking for pod documentation
+ and will print out (in raw pod format) all sections that match one ore
+ more of the given section specifications. If no section specifications
+ are given than all pod sections encountered are output.
+
+ podselect invokes the podselect() function exported by Pod::Select
+ Please see the podselect() entry in the Pod::Select manpage for more
+ details.
+
+SEE ALSO
+ the Pod::Parser manpage and the Pod::Select manpage
+
+AUTHOR
+ Brad Appleton <bradapp@enteract.com>
+
+ Based on code for Pod::Text::pod2text(1) written by Tom Christiansen
+ <tchrist@mox.perl.com>
+
+###### end =include podselect.PL #####
diff --git a/contrib/perl5/t/pod/special_seqs.t b/contrib/perl5/t/pod/special_seqs.t
new file mode 100755
index 0000000..b8af57e
--- /dev/null
+++ b/contrib/perl5/t/pod/special_seqs.t
@@ -0,0 +1,43 @@
+#!./perl
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, './pod', '../lib';
+ require "testp2pt.pl";
+ import TestPodIncPlainText;
+}
+
+my %options = map { $_ => 1 } @ARGV; ## convert cmdline to options-hash
+my $passed = testpodplaintext \%options, $0;
+exit( ($passed == 1) ? 0 : -1 ) unless $ENV{HARNESS_ACTIVE};
+
+
+__END__
+
+
+=pod
+
+This is a test to see if I can do not only C<$self> and C<method()>, but
+also C<< $self->method() >> and C<< $self->{FIELDNAME} >> and
+C<< $Foo <=> $Bar >> without resorting to escape sequences. If
+I want to refer to the right-shift operator I can do something
+like C<<< $x >> 3 >>> or even C<<<< $y >> 5 >>>>.
+
+Now for the grand finale of C<< $self->method()->{FIELDNAME} = {FOO=>BAR} >>.
+And I also want to make sure that newlines work like this
+C<<<
+$self->{FOOBAR} >> 3 and [$b => $a]->[$a <=> $b]
+>>>
+
+Of course I should still be able to do all this I<with> escape sequences
+too: C<$self-E<gt>method()> and C<$self-E<gt>{FIELDNAME}> and C<{FOO=E<gt>BAR}>.
+
+Dont forget C<$self-E<gt>method()-E<gt>{FIELDNAME} = {FOO=E<gt>BAR}>.
+
+And make sure that C<0> works too!
+
+Now, if I use << or >> as my delimiters, then I have to use whitespace.
+So things like C<<$self->method()>> and C<<$self->{FIELDNAME}>> wont end
+up doing what you might expect since the first > will still terminate
+the first < seen.
+
+=cut
diff --git a/contrib/perl5/t/pod/special_seqs.xr b/contrib/perl5/t/pod/special_seqs.xr
new file mode 100644
index 0000000..a07f4cf
--- /dev/null
+++ b/contrib/perl5/t/pod/special_seqs.xr
@@ -0,0 +1,22 @@
+ This is a test to see if I can do not only `$self' and `method()', but
+ also `$self->method()' and `$self->{FIELDNAME}' and `$Foo <=> $Bar'
+ without resorting to escape sequences. If I want to refer to the
+ right-shift operator I can do something like `$x >> 3' or even `$y >>
+ 5'.
+
+ Now for the grand finale of `$self->method()->{FIELDNAME} = {FOO=>BAR}'.
+ And I also want to make sure that newlines work like this
+ `$self->{FOOBAR} >> 3 and [$b => $a]->[$a <=> $b]'
+
+ Of course I should still be able to do all this *with* escape sequences
+ too: `$self->method()' and `$self->{FIELDNAME}' and `{FOO=>BAR}'.
+
+ Dont forget `$self->method()->{FIELDNAME} = {FOO=>BAR}'.
+
+ And make sure that `0' works too!
+
+ Now, if I use << or >> as my delimiters, then I have to use whitespace.
+ So things like `<$self-'method()>> and `<$self-'{FIELDNAME}>> wont end
+ up doing what you might expect since the first > will still terminate
+ the first < seen.
+
diff --git a/contrib/perl5/t/pod/testcmp.pl b/contrib/perl5/t/pod/testcmp.pl
new file mode 100644
index 0000000..5f62171
--- /dev/null
+++ b/contrib/perl5/t/pod/testcmp.pl
@@ -0,0 +1,91 @@
+package TestCompare;
+
+use vars qw(@ISA @EXPORT $MYPKG);
+#use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+use File::Basename;
+use File::Spec;
+use FileHandle;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&testcmp);
+$MYPKG = eval { (caller)[0] };
+
+##--------------------------------------------------------------------------
+
+=head1 NAME
+
+testcmp -- compare two files line-by-line
+
+=head1 SYNOPSIS
+
+ $is_diff = testcmp($file1, $file2);
+
+or
+
+ $is_diff = testcmp({-cmplines => \&mycmp}, $file1, $file2);
+
+=head2 DESCRIPTION
+
+Compare two text files line-by-line and return 0 if they are the
+same, 1 if they differ. Each of $file1 and $file2 may be a filenames,
+or a filehandles (in which case it must already be open for reading).
+
+If the first argument is a hashref, then the B<-cmplines> key in the
+hash may have a subroutine reference as its corresponding value.
+The referenced user-defined subroutine should be a line-comparator
+function that takes two pre-chomped text-lines as its arguments
+(the first is from $file1 and the second is from $file2). It should
+return 0 if it considers the two lines equivalent, and non-zero
+otherwise.
+
+=cut
+
+##--------------------------------------------------------------------------
+
+sub testcmp( $ $ ; $) {
+ my %opts = ref($_[0]) eq 'HASH' ? %{shift()} : ();
+ my ($file1, $file2) = @_;
+ my ($fh1, $fh2) = ($file1, $file2);
+ unless (ref $fh1) {
+ $fh1 = FileHandle->new($file1, "r") or die "Can't open $file1: $!";
+ }
+ unless (ref $fh2) {
+ $fh2 = FileHandle->new($file2, "r") or die "Can't open $file2: $!";
+ }
+
+ my $cmplines = $opts{'-cmplines'} || undef;
+ my ($f1text, $f2text) = ("", "");
+ my ($line, $diffs) = (0, 0);
+
+ while ( defined($f1text) and defined($f2text) ) {
+ defined($f1text = <$fh1>) and chomp($f1text);
+ defined($f2text = <$fh2>) and chomp($f2text);
+ ++$line;
+ last unless ( defined($f1text) and defined($f2text) );
+ $diffs = (ref $cmplines) ? &$cmplines($f1text, $f2text)
+ : ($f1text ne $f2text);
+ last if $diffs;
+ }
+ close($fh1) unless (ref $file1);
+ close($fh2) unless (ref $file2);
+
+ $diffs = 1 if (defined($f1text) or defined($f2text));
+ if ( defined($f1text) and defined($f2text) ) {
+ ## these two lines must be different
+ warn "$file1 and $file2 differ at line $line\n";
+ }
+ elsif (defined($f1text) and (! defined($f1text))) {
+ ## file1 must be shorter
+ warn "$file1 is shorter than $file2\n";
+ }
+ elsif (defined $f2text) {
+ ## file2 must be longer
+ warn "$file1 is shorter than $file2\n";
+ }
+ return $diffs;
+}
+
+1;
diff --git a/contrib/perl5/t/pod/testp2pt.pl b/contrib/perl5/t/pod/testp2pt.pl
new file mode 100644
index 0000000..2ff8aa4
--- /dev/null
+++ b/contrib/perl5/t/pod/testp2pt.pl
@@ -0,0 +1,192 @@
+package TestPodIncPlainText;
+
+BEGIN {
+ use File::Basename;
+ use File::Spec;
+ use Cwd qw(abs_path);
+ push @INC, '..';
+ my $THISDIR = abs_path(dirname $0);
+ unshift @INC, $THISDIR;
+ require "testcmp.pl";
+ import TestCompare;
+ my $PARENTDIR = dirname $THISDIR;
+ push @INC, map { File::Spec->catfile($_, 'lib') } ($PARENTDIR, $THISDIR);
+}
+
+#use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+#use File::Compare;
+#use Cwd qw(abs_path);
+
+use vars qw($MYPKG @EXPORT @ISA);
+$MYPKG = eval { (caller)[0] };
+@EXPORT = qw(&testpodplaintext);
+BEGIN {
+ if ( $] >= 5.005_58 ) {
+ require Pod::Text;
+ @ISA = qw( Pod::Text );
+ }
+ else {
+ require Pod::PlainText;
+ @ISA = qw( Pod::PlainText );
+ }
+ require VMS::Filespec if $^O eq 'VMS';
+}
+
+## Hardcode settings for TERMCAP and COLUMNS so we can try to get
+## reproducible results between environments
+@ENV{qw(TERMCAP COLUMNS)} = ('co=76:do=^J', 76);
+
+sub catfile(@) { File::Spec->catfile(@_); }
+
+my $INSTDIR = abs_path(dirname $0);
+$INSTDIR = VMS::Filespec::unixpath($INSTDIR) if $^O eq 'VMS';
+$INSTDIR =~ s#/$## if $^O eq 'VMS';
+$INSTDIR = (dirname $INSTDIR) if (basename($INSTDIR) eq 'pod');
+$INSTDIR = (dirname $INSTDIR) if (basename($INSTDIR) eq 't');
+my @PODINCDIRS = ( catfile($INSTDIR, 'lib', 'Pod'),
+ catfile($INSTDIR, 'scripts'),
+ catfile($INSTDIR, 'pod'),
+ catfile($INSTDIR, 't', 'pod')
+ );
+
+## Find the path to the file to =include
+sub findinclude {
+ my $self = shift;
+ my $incname = shift;
+
+ ## See if its already found w/out any "searching;
+ return $incname if (-r $incname);
+
+ ## Need to search for it. Look in the following directories ...
+ ## 1. the directory containing this pod file
+ my $thispoddir = dirname $self->input_file;
+ ## 2. the parent directory of the above
+ my $parentdir = dirname $thispoddir;
+ my @podincdirs = ($thispoddir, $parentdir, @PODINCDIRS);
+
+ for (@podincdirs) {
+ my $incfile = catfile($_, $incname);
+ return $incfile if (-r $incfile);
+ }
+ warn("*** Can't find =include file $incname in @podincdirs\n");
+ return "";
+}
+
+sub command {
+ my $self = shift;
+ my ($cmd, $text, $line_num, $pod_para) = @_;
+ $cmd = '' unless (defined $cmd);
+ local $_ = $text || '';
+ my $out_fh = $self->output_handle;
+
+ ## Defer to the superclass for everything except '=include'
+ return $self->SUPER::command(@_) unless ($cmd eq "include");
+
+ ## We have an '=include' command
+ my $incdebug = 1; ## debugging
+ my @incargs = split;
+ if (@incargs == 0) {
+ warn("*** No filename given for '=include'\n");
+ return;
+ }
+ my $incfile = $self->findinclude(shift @incargs) or return;
+ my $incbase = basename $incfile;
+ print $out_fh "###### begin =include $incbase #####\n" if ($incdebug);
+ $self->parse_from_file( {-cutting => 1}, $incfile );
+ print $out_fh "###### end =include $incbase #####\n" if ($incdebug);
+}
+
+sub begin_input {
+ $_[0]->{_INFILE} = VMS::Filespec::unixify($_[0]->{_INFILE}) if $^O eq 'VMS';
+}
+
+sub podinc2plaintext( $ $ ) {
+ my ($infile, $outfile) = @_;
+ local $_;
+ my $text_parser = $MYPKG->new;
+ $text_parser->parse_from_file($infile, $outfile);
+}
+
+sub testpodinc2plaintext( @ ) {
+ my %args = @_;
+ my $infile = $args{'-In'} || croak "No input file given!";
+ my $outfile = $args{'-Out'} || croak "No output file given!";
+ my $cmpfile = $args{'-Cmp'} || croak "No compare-result file given!";
+
+ my $different = '';
+ my $testname = basename $cmpfile, '.t', '.xr';
+
+ unless (-e $cmpfile) {
+ my $msg = "*** Can't find comparison file $cmpfile for testing $infile";
+ warn "$msg\n";
+ return $msg;
+ }
+
+ print "# Running testpodinc2plaintext for '$testname'...\n";
+ ## Compare the output against the expected result
+ podinc2plaintext($infile, $outfile);
+ if ( testcmp($outfile, $cmpfile) ) {
+ $different = "$outfile is different from $cmpfile";
+ }
+ else {
+ unlink($outfile);
+ }
+ return $different;
+}
+
+sub testpodplaintext( @ ) {
+ my %opts = (ref $_[0] eq 'HASH') ? %{shift()} : ();
+ my @testpods = @_;
+ my ($testname, $testdir) = ("", "");
+ my ($podfile, $cmpfile) = ("", "");
+ my ($outfile, $errfile) = ("", "");
+ my $passes = 0;
+ my $failed = 0;
+ local $_;
+
+ print "1..", scalar @testpods, "\n" unless ($opts{'-xrgen'});
+
+ for $podfile (@testpods) {
+ ($testname, $_) = fileparse($podfile);
+ $testdir ||= $_;
+ $testname =~ s/\.t$//;
+ $cmpfile = $testdir . $testname . '.xr';
+ $outfile = $testdir . $testname . '.OUT';
+
+ if ($opts{'-xrgen'}) {
+ if ($opts{'-force'} or ! -e $cmpfile) {
+ ## Create the comparison file
+ print "# Creating expected result for \"$testname\"" .
+ " pod2plaintext test ...\n";
+ podinc2plaintext($podfile, $cmpfile);
+ }
+ else {
+ print "# File $cmpfile already exists" .
+ " (use '-force' to regenerate it).\n";
+ }
+ next;
+ }
+
+ my $failmsg = testpodinc2plaintext
+ -In => $podfile,
+ -Out => $outfile,
+ -Cmp => $cmpfile;
+ if ($failmsg) {
+ ++$failed;
+ print "#\tFAILED. ($failmsg)\n";
+ print "not ok ", $failed+$passes, "\n";
+ }
+ else {
+ ++$passes;
+ unlink($outfile);
+ print "#\tPASSED.\n";
+ print "ok ", $failed+$passes, "\n";
+ }
+ }
+ return $passes;
+}
+
+1;
diff --git a/contrib/perl5/t/pod/testpchk.pl b/contrib/perl5/t/pod/testpchk.pl
new file mode 100644
index 0000000..8aa10b9
--- /dev/null
+++ b/contrib/perl5/t/pod/testpchk.pl
@@ -0,0 +1,129 @@
+package TestPodChecker;
+
+BEGIN {
+ use File::Basename;
+ use File::Spec;
+ push @INC, '..';
+ my $THISDIR = dirname $0;
+ unshift @INC, $THISDIR;
+ require "testcmp.pl";
+ import TestCompare;
+ my $PARENTDIR = dirname $THISDIR;
+ push @INC, map { File::Spec->catfile($_, 'lib') } ($PARENTDIR, $THISDIR);
+ require VMS::Filespec if $^O eq 'VMS';
+}
+
+use Pod::Checker;
+use vars qw(@ISA @EXPORT $MYPKG);
+#use strict;
+#use diagnostics;
+use Carp;
+use Exporter;
+#use File::Compare;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&testpodchecker);
+$MYPKG = eval { (caller)[0] };
+
+sub stripname( $ ) {
+ local $_ = shift;
+ return /(\w[.\w]*)\s*$/ ? $1 : $_;
+}
+
+sub msgcmp( $ $ ) {
+ ## filter out platform-dependent aspects of error messages
+ my ($line1, $line2) = @_;
+ for ($line1, $line2) {
+ ## remove filenames from error messages to avoid any
+ ## filepath naming differences between OS platforms
+ s/(at line \S+ in file) .*\W(\w+\.[tT])\s*$/$1 \L$2\E/;
+ s/.*\W(\w+\.[tT]) (has \d+ pod syntax error)/\L$1\E $2/;
+ }
+ return ($line1 ne $line2);
+}
+
+sub testpodcheck( @ ) {
+ my %args = @_;
+ my $infile = $args{'-In'} || croak "No input file given!";
+ my $outfile = $args{'-Out'} || croak "No output file given!";
+ my $cmpfile = $args{'-Cmp'} || croak "No compare-result file given!";
+
+ my $different = '';
+ my $testname = basename $cmpfile, '.t', '.xr';
+
+ unless (-e $cmpfile) {
+ my $msg = "*** Can't find comparison file $cmpfile for testing $infile";
+ warn "$msg\n";
+ return $msg;
+ }
+
+ print "# Running podchecker for '$testname'...\n";
+ ## Compare the output against the expected result
+ if ($^O eq 'VMS') {
+ for ($infile, $outfile, $cmpfile) {
+ $_ = VMS::Filespec::unixify($_) unless ref;
+ }
+ }
+ podchecker($infile, $outfile);
+ if ( testcmp({'-cmplines' => \&msgcmp}, $outfile, $cmpfile) ) {
+ $different = "$outfile is different from $cmpfile";
+ }
+ else {
+ unlink($outfile);
+ }
+ return $different;
+}
+
+sub testpodchecker( @ ) {
+ my %opts = (ref $_[0] eq 'HASH') ? %{shift()} : ();
+ my @testpods = @_;
+ my ($testname, $testdir) = ("", "");
+ my ($podfile, $cmpfile) = ("", "");
+ my ($outfile, $errfile) = ("", "");
+ my $passes = 0;
+ my $failed = 0;
+ local $_;
+
+ print "1..", scalar @testpods, "\n" unless ($opts{'-xrgen'});
+
+ for $podfile (@testpods) {
+ ($testname, $_) = fileparse($podfile);
+ $testdir ||= $_;
+ $testname =~ s/\.t$//;
+ $cmpfile = $testdir . $testname . '.xr';
+ $outfile = $testdir . $testname . '.OUT';
+
+ if ($opts{'-xrgen'}) {
+ if ($opts{'-force'} or ! -e $cmpfile) {
+ ## Create the comparison file
+ print "# Creating expected result for \"$testname\"" .
+ " podchecker test ...\n";
+ podchecker($podfile, $cmpfile);
+ }
+ else {
+ print "# File $cmpfile already exists" .
+ " (use '-force' to regenerate it).\n";
+ }
+ next;
+ }
+
+ my $failmsg = testpodcheck
+ -In => $podfile,
+ -Out => $outfile,
+ -Cmp => $cmpfile;
+ if ($failmsg) {
+ ++$failed;
+ print "#\tFAILED. ($failmsg)\n";
+ print "not ok ", $failed+$passes, "\n";
+ }
+ else {
+ ++$passes;
+ unlink($outfile);
+ print "#\tPASSED.\n";
+ print "ok ", $failed+$passes, "\n";
+ }
+ }
+ return $passes;
+}
+
+1;
diff --git a/contrib/perl5/t/pragma/constant.t b/contrib/perl5/t/pragma/constant.t
index 5b63dfa..6438332 100755
--- a/contrib/perl5/t/pragma/constant.t
+++ b/contrib/perl5/t/pragma/constant.t
@@ -2,10 +2,10 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib' if -d '../lib';
+ unshift @INC, '../lib' if -d '../lib';
}
-BEGIN {$^W |= 1} # Insist upon warnings
+use warnings;
use vars qw{ @warnings };
BEGIN { # ...and save 'em for later
$SIG{'__WARN__'} = sub { push @warnings, @_ }
@@ -14,9 +14,9 @@ END { print @warnings }
######################### We start with some black magic to print on failure.
-BEGIN { $| = 1; print "1..46\n"; }
+BEGIN { $| = 1; print "1..73\n"; }
END {print "not ok 1\n" unless $loaded;}
-use constant;
+use constant 1.01;
$loaded = 1;
#print "# Version: $constant::VERSION\n";
print "ok 1\n";
@@ -96,11 +96,8 @@ test 23, length(MESS) == 8;
use constant TRAILING => '12 cats';
{
- my $save_warn;
- local $^W;
- BEGIN { $save_warn = $^W; $^W = 0 }
+ no warnings 'numeric';
test 24, TRAILING == 12;
- BEGIN { $^W = $save_warn }
}
test 25, TRAILING eq '12 cats';
@@ -138,7 +135,7 @@ test 37, @warnings &&
shift @warnings;
test 38, @warnings == 0, "unexpected warning";
-test 39, $^W & 1, "Who disabled the warnings?";
+test 39, 1;
use constant CSCALAR => \"ok 40\n";
use constant CHASH => { foo => "ok 41\n" };
@@ -151,7 +148,83 @@ print CHASH->{foo};
print CARRAY->[1];
print CPHASH->{foo};
eval q{ CPHASH->{bar} };
-test 44, scalar($@ =~ /^No such array/);
+test 44, scalar($@ =~ /^No such pseudo-hash field/);
print CCODE->(45);
eval q{ CCODE->{foo} };
test 46, scalar($@ =~ /^Constant is not a HASH/);
+
+# Allow leading underscore
+use constant _PRIVATE => 47;
+test 47, _PRIVATE == 47;
+
+# Disallow doubled leading underscore
+eval q{
+ use constant __DISALLOWED => "Oops";
+};
+test 48, $@ =~ /begins with '__'/;
+
+# Check on declared() and %declared. This sub should be EXACTLY the
+# same as the one quoted in the docs!
+sub declared ($) {
+ use constant 1.01; # don't omit this!
+ my $name = shift;
+ $name =~ s/^::/main::/;
+ my $pkg = caller;
+ my $full_name = $name =~ /::/ ? $name : "${pkg}::$name";
+ $constant::declared{$full_name};
+}
+
+test 49, declared 'PI';
+test 50, $constant::declared{'main::PI'};
+
+test 51, !declared 'PIE';
+test 52, !$constant::declared{'main::PIE'};
+
+{
+ package Other;
+ use constant IN_OTHER_PACK => 42;
+ ::test 53, ::declared 'IN_OTHER_PACK';
+ ::test 54, $constant::declared{'Other::IN_OTHER_PACK'};
+ ::test 55, ::declared 'main::PI';
+ ::test 56, $constant::declared{'main::PI'};
+}
+
+test 57, declared 'Other::IN_OTHER_PACK';
+test 58, $constant::declared{'Other::IN_OTHER_PACK'};
+
+@warnings = ();
+eval q{
+ no warnings;
+ use warnings 'constant';
+ use constant 'BEGIN' => 1 ;
+ use constant 'INIT' => 1 ;
+ use constant 'CHECK' => 1 ;
+ use constant 'END' => 1 ;
+ use constant 'DESTROY' => 1 ;
+ use constant 'AUTOLOAD' => 1 ;
+ use constant 'STDIN' => 1 ;
+ use constant 'STDOUT' => 1 ;
+ use constant 'STDERR' => 1 ;
+ use constant 'ARGV' => 1 ;
+ use constant 'ARGVOUT' => 1 ;
+ use constant 'ENV' => 1 ;
+ use constant 'INC' => 1 ;
+ use constant 'SIG' => 1 ;
+};
+
+test 59, @warnings == 14 ;
+test 60, (shift @warnings) =~ /^Constant name 'BEGIN' is a Perl keyword at/;
+test 61, (shift @warnings) =~ /^Constant name 'INIT' is a Perl keyword at/;
+test 62, (shift @warnings) =~ /^Constant name 'CHECK' is a Perl keyword at/;
+test 63, (shift @warnings) =~ /^Constant name 'END' is a Perl keyword at/;
+test 64, (shift @warnings) =~ /^Constant name 'DESTROY' is a Perl keyword at/;
+test 65, (shift @warnings) =~ /^Constant name 'AUTOLOAD' is a Perl keyword at/;
+test 66, (shift @warnings) =~ /^Constant name 'STDIN' is forced into package main:: a/;
+test 67, (shift @warnings) =~ /^Constant name 'STDOUT' is forced into package main:: at/;
+test 68, (shift @warnings) =~ /^Constant name 'STDERR' is forced into package main:: at/;
+test 69, (shift @warnings) =~ /^Constant name 'ARGV' is forced into package main:: at/;
+test 70, (shift @warnings) =~ /^Constant name 'ARGVOUT' is forced into package main:: at/;
+test 71, (shift @warnings) =~ /^Constant name 'ENV' is forced into package main:: at/;
+test 72, (shift @warnings) =~ /^Constant name 'INC' is forced into package main:: at/;
+test 73, (shift @warnings) =~ /^Constant name 'SIG' is forced into package main:: at/;
+@warnings = ();
diff --git a/contrib/perl5/t/pragma/diagnostics.t b/contrib/perl5/t/pragma/diagnostics.t
new file mode 100755
index 0000000..15cd6b5
--- /dev/null
+++ b/contrib/perl5/t/pragma/diagnostics.t
@@ -0,0 +1,38 @@
+#!./perl
+
+BEGIN {
+ chdir '..' if -d '../pod';
+ unshift @INC, './lib' if -d './lib';
+}
+
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+use strict;
+use warnings;
+
+use vars qw($Test_Num $Total_tests);
+
+my $loaded;
+BEGIN { $| = 1; $Test_Num = 1 }
+END {print "not ok $Test_Num\n" unless $loaded;}
+print "1..$Total_tests\n";
+BEGIN { require diagnostics; } # Don't want diagnostics' noise yet.
+$loaded = 1;
+ok($loaded, 'compile');
+######################### End of black magic.
+
+sub ok {
+ my($test, $name) = shift;
+ print "not " unless $test;
+ print "ok $Test_Num";
+ print " - $name" if defined $name;
+ print "\n";
+ $Test_Num++;
+}
+
+
+# Change this to your # of ok() calls + 1
+BEGIN { $Total_tests = 1 }
diff --git a/contrib/perl5/t/pragma/locale.t b/contrib/perl5/t/pragma/locale.t
index 7e3df8c..414ceff 100755
--- a/contrib/perl5/t/pragma/locale.t
+++ b/contrib/perl5/t/pragma/locale.t
@@ -2,7 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, '.';
require Config; import Config;
if (!$Config{d_setlocale} || $Config{ccflags} =~ /\bD?NO_LOCALE\b/) {
print "1..0\n";
@@ -12,6 +13,16 @@ BEGIN {
use strict;
+my $debug = 1;
+
+sub debug {
+ print @_ if $debug;
+}
+
+sub debugf {
+ printf @_ if $debug;
+}
+
my $have_setlocale = 0;
eval {
require POSIX;
@@ -23,17 +34,11 @@ eval {
# and mingw32 uses said silly CRT
$have_setlocale = 0 if $^O eq 'MSWin32' && $Config{cc} =~ /^(cl|gcc)/i;
-# 103 (the last test) may fail but that is okay.
-# (It indicates something broken in the environment, not Perl)
-# Therefore .. only until 102, not 103.
-print "1..", ($have_setlocale ? 102 : 98), "\n";
+print "1..", ($have_setlocale ? 116 : 98), "\n";
-use vars qw($a
- $English $German $French $Spanish
- @C @English @German @French @Spanish
- $Locale @Locale %iLocale %UPPER %lower @Neoalpha);
+use vars qw(&LC_ALL);
-$a = 'abc %';
+my $a = 'abc %';
sub ok {
my ($n, $result) = @_;
@@ -47,7 +52,7 @@ sub ok {
# even the default locale will taint under 'use locale'.
sub is_tainted { # hello, camel two.
- local $^W; # no warnings 'undef'
+ no warnings 'uninitialized' ;
my $dummy;
not eval { $dummy = join("", @_), kill 0; 1 }
}
@@ -73,9 +78,9 @@ check_taint 7, "\L$a";
check_taint 8, lcfirst($a);
check_taint 9, "\l$a";
-check_taint 10, sprintf('%e', 123.456);
-check_taint 11, sprintf('%f', 123.456);
-check_taint 12, sprintf('%g', 123.456);
+check_taint_not 10, sprintf('%e', 123.456);
+check_taint_not 11, sprintf('%f', 123.456);
+check_taint_not 12, sprintf('%g', 123.456);
check_taint_not 13, sprintf('%d', 123.456);
check_taint_not 14, sprintf('%x', 123.456);
@@ -219,269 +224,511 @@ check_taint_not 98, $a;
# I think we've seen quite enough of taint.
# Let us do some *real* locale work now,
-# unless setlocale() is missing (i.e. minitest).
+# unless setlocale() is missing (i.e. minitest).
exit unless $have_setlocale;
-sub getalnum {
+# Find locales.
+
+debug "# Scanning for locales...\n";
+
+# Note that it's okay that some languages have their native names
+# capitalized here even though that's not "right". They are lowercased
+# anyway later during the scanning process (and besides, some clueless
+# vendor might have them capitalized errorneously anyway).
+
+my $locales = <<EOF;
+Afrikaans:af:za:1 15
+Arabic:ar:dz eg sa:6 arabic8
+Brezhoneg Breton:br:fr:1 15
+Bulgarski Bulgarian:bg:bg:5
+Chinese:zh:cn tw:cn.EUC eucCN eucTW euc.CN euc.TW GB2312 tw.EUC
+Hrvatski Croatian:hr:hr:2
+Cymraeg Welsh:cy:cy:1 14 15
+Czech:cs:cz:2
+Dansk Danish:dk:da:1 15
+Nederlands Dutch:nl:be nl:1 15
+English American British:en:au ca gb ie nz us uk:1 15 cp850
+Esperanto:eo:eo:3
+Eesti Estonian:et:ee:4 6 13
+Suomi Finnish:fi:fi:1 15
+Flamish::fl:1 15
+Deutsch German:de:at be ch de lu:1 15
+Euskaraz Basque:eu:es fr:1 15
+Galego Galician:gl:es:1 15
+Ellada Greek:el:gr:7 g8
+Frysk:fy:nl:1 15
+Greenlandic:kl:gl:4 6
+Hebrew:iw:il:8 hebrew8
+Hungarian:hu:hu:2
+Indonesian:in:id:1 15
+Gaeilge Irish:ga:IE:1 14 15
+Italiano Italian:it:ch it:1 15
+Nihongo Japanese:ja:jp:euc eucJP jp.EUC sjis
+Korean:ko:kr:
+Latine Latin:la:va:1 15
+Latvian:lv:lv:4 6 13
+Lithuanian:lt:lt:4 6 13
+Macedonian:mk:mk:1 15
+Maltese:mt:mt:3
+Norsk Norwegian:no:no:1 15
+Occitan:oc:es:1 15
+Polski Polish:pl:pl:2
+Rumanian:ro:ro:2
+Russki Russian:ru:ru su ua:5 koi8 koi8r koi8u cp1251
+Serbski Serbian:sr:yu:5
+Slovak:sk:sk:2
+Slovene Slovenian:sl:si:2
+Sqhip Albanian:sq:sq:1 15
+Svenska Swedish:sv:fi se:1 15
+Thai:th:th:11 tis620
+Turkish:tr:tr:9 turkish8
+Yiddish:::1 15
+EOF
+
+if ($^O eq 'os390') {
+ $locales =~ s/Svenska Swedish:sv:fi se:1 15\n//;
+ $locales =~ s/Thai:th:th:11 tis620\n//;
+}
+
+sub in_utf8 () { $^H & 0x08 }
+
+if (in_utf8) {
+ require "pragma/locale/utf8";
+} else {
+ require "pragma/locale/latin1";
+}
+
+my @Locale;
+my $Locale;
+my @Alnum_;
+
+sub getalnum_ {
sort grep /\w/, map { chr } 0..255
}
-sub locatelocale ($$@) {
- my ($lcall, $alnum, @try) = @_;
+sub trylocale {
+ my $locale = shift;
+ if (setlocale(LC_ALL, $locale)) {
+ push @Locale, $locale;
+ }
+}
- undef $$lcall;
+sub decode_encodings {
+ my @enc;
- for (@try) {
- local $^W = 0; # suppress "Subroutine LC_ALL redefined"
- if (setlocale(&LC_ALL, $_)) {
- $$lcall = $_;
- @$alnum = &getalnum;
- last;
+ foreach (split(/ /, shift)) {
+ if (/^(\d+)$/) {
+ push @enc, "ISO8859-$1";
+ push @enc, "iso8859$1"; # HP
+ if ($1 eq '1') {
+ push @enc, "roman8"; # HP
+ }
+ } else {
+ push @enc, $_;
}
}
+ if ($^O eq 'os390') {
+ push @enc, qw(IBM-037 IBM-819 IBM-1047);
+ }
- @$alnum = () unless (defined $$lcall);
+ return @enc;
}
-# Find some default locale
-
-locatelocale(\$Locale, \@Locale, qw(C POSIX));
-
-# Find some English locale
-
-locatelocale(\$English, \@English,
- qw(en_US.ISO8859-1 en_GB.ISO8859-1
- en en_US en_UK en_IE en_CA en_AU en_NZ
- english english.iso88591
- american american.iso88591
- british british.iso88591
- ));
-
-# Find some German locale
-
-locatelocale(\$German, \@German,
- qw(de_DE.ISO8859-1 de_AT.ISO8859-1 de_CH.ISO8859-1
- de de_DE de_AT de_CH
- german german.iso88591));
-
-# Find some French locale
-
-locatelocale(\$French, \@French,
- qw(fr_FR.ISO8859-1 fr_BE.ISO8859-1 fr_CA.ISO8859-1 fr_CH.ISO8859-1
- fr fr_FR fr_BE fr_CA fr_CH
- french french.iso88591));
-
-# Find some Spanish locale
-
-locatelocale(\$Spanish, \@Spanish,
- qw(es_AR.ISO8859-1 es_BO.ISO8859-1 es_CL.ISO8859-1
- es_CO.ISO8859-1 es_CR.ISO8859-1 es_EC.ISO8859-1
- es_ES.ISO8859-1 es_GT.ISO8859-1 es_MX.ISO8859-1
- es_NI.ISO8859-1 es_PA.ISO8859-1 es_PE.ISO8859-1
- es_PY.ISO8859-1 es_SV.ISO8859-1 es_UY.ISO8859-1 es_VE.ISO8859-1
- es es_AR es_BO es_CL
- es_CO es_CR es_EC
- es_ES es_GT es_MX
- es_NI es_PA es_PE
- es_PY es_SV es_UY es_VE
- spanish spanish.iso88591));
-
-# Select the largest of the alpha(num)bets.
-
-($Locale, @Locale) = ($English, @English)
- if (@English > @Locale);
-($Locale, @Locale) = ($German, @German)
- if (@German > @Locale);
-($Locale, @Locale) = ($French, @French)
- if (@French > @Locale);
-($Locale, @Locale) = ($Spanish, @Spanish)
- if (@Spanish > @Locale);
-
-{
- local $^W = 0;
- setlocale(&LC_ALL, $Locale);
+trylocale("C");
+trylocale("POSIX");
+foreach (0..15) {
+ trylocale("ISO8859-$_");
+ trylocale("iso8859$_");
+ trylocale("iso8859-$_");
+ trylocale("iso_8859_$_");
+ trylocale("isolatin$_");
+ trylocale("isolatin-$_");
+ trylocale("iso_latin_$_");
+}
+
+foreach my $locale (split(/\n/, $locales)) {
+ my ($locale_name, $language_codes, $country_codes, $encodings) =
+ split(/:/, $locale);
+ my @enc = decode_encodings($encodings);
+ foreach my $loc (split(/ /, $locale_name)) {
+ trylocale($loc);
+ foreach my $enc (@enc) {
+ trylocale("$loc.$enc");
+ }
+ $loc = lc $loc;
+ foreach my $enc (@enc) {
+ trylocale("$loc.$enc");
+ }
+ }
+ foreach my $lang (split(/ /, $language_codes)) {
+ trylocale($lang);
+ foreach my $country (split(/ /, $country_codes)) {
+ my $lc = "${lang}_${country}";
+ trylocale($lc);
+ foreach my $enc (@enc) {
+ trylocale("$lc.$enc");
+ }
+ my $lC = "${lang}_\U${country}";
+ trylocale($lC);
+ foreach my $enc (@enc) {
+ trylocale("$lC.$enc");
+ }
+ }
+ }
}
-# Sort it now that LC_ALL has been set.
+setlocale(LC_ALL, "C");
@Locale = sort @Locale;
-print "# Locale = $Locale\n";
-print "# Alnum_ = @Locale\n";
+debug "# Locales = @Locale\n";
+
+my %Problem;
+my %Okay;
+my %Testing;
+my @Neoalpha;
+my %Neoalpha;
+
+sub tryneoalpha {
+ my ($Locale, $i, $test) = @_;
+ debug "# testing $i with locale '$Locale'\n"
+ unless $Testing{$i}{$Locale}++;
+ unless ($test) {
+ $Problem{$i}{$Locale} = 1;
+ debug "# failed $i with locale '$Locale'\n";
+ } else {
+ push @{$Okay{$i}}, $Locale;
+ }
+}
-{
- my $i = 0;
+foreach $Locale (@Locale) {
+ debug "# Locale = $Locale\n";
+ @Alnum_ = getalnum_();
+ debug "# \\w = @Alnum_\n";
- for (@Locale) {
- $iLocale{$_} = $i++;
+ unless (setlocale(LC_ALL, $Locale)) {
+ foreach (99..103) {
+ $Problem{$_}{$Locale} = -1;
+ }
+ next;
+ }
+
+ # Sieve the uppercase and the lowercase.
+
+ my %UPPER = ();
+ my %lower = ();
+ my %BoThCaSe = ();
+ for (@Alnum_) {
+ if (/[^\d_]/) { # skip digits and the _
+ if (uc($_) eq $_) {
+ $UPPER{$_} = $_;
+ }
+ if (lc($_) eq $_) {
+ $lower{$_} = $_;
+ }
+ }
+ }
+ foreach (keys %UPPER) {
+ $BoThCaSe{$_}++ if exists $lower{$_};
+ }
+ foreach (keys %lower) {
+ $BoThCaSe{$_}++ if exists $UPPER{$_};
+ }
+ foreach (keys %BoThCaSe) {
+ delete $UPPER{$_};
+ delete $lower{$_};
}
-}
-# Sieve the uppercase and the lowercase.
+ debug "# UPPER = ", join(" ", sort keys %UPPER ), "\n";
+ debug "# lower = ", join(" ", sort keys %lower ), "\n";
+ debug "# BoThCaSe = ", join(" ", sort keys %BoThCaSe), "\n";
-for (@Locale) {
- if (/[^\d_]/) { # skip digits and the _
- if (lc eq $_) {
- $UPPER{$_} = uc;
- } else {
- $lower{$_} = lc;
+ # Find the alphabets that are not alphabets in the default locale.
+
+ {
+ no locale;
+
+ @Neoalpha = ();
+ for (keys %UPPER, keys %lower) {
+ push(@Neoalpha, $_) if (/\W/);
+ $Neoalpha{$_} = $_;
}
}
-}
-# Find the alphabets that are not alphabets in the default locale.
+ @Neoalpha = sort @Neoalpha;
+
+ debug "# Neoalpha = @Neoalpha\n";
+
+ if (@Neoalpha == 0) {
+ # If we have no Neoalphas the remaining tests are no-ops.
+ debug "# no Neoalpha, skipping tests 99..102 for locale '$Locale'\n";
+ foreach (99..102) {
+ push @{$Okay{$_}}, $Locale;
+ }
+ } else {
-{
- no locale;
+ # Test \w.
- for (keys %UPPER, keys %lower) {
- push(@Neoalpha, $_) if (/\W/);
+ {
+ my $word = join('', @Neoalpha);
+
+ $word =~ /^(\w+)$/;
+
+ tryneoalpha($Locale, 99, $1 eq $word);
+ }
+
+ # Cross-check the whole 8-bit character set.
+
+ for (map { chr } 0..255) {
+ tryneoalpha($Locale, 100,
+ (/\w/ xor /\W/) ||
+ (/\d/ xor /\D/) ||
+ (/\s/ xor /\S/));
+ }
+
+ # Test for read-only scalars' locale vs non-locale comparisons.
+
+ {
+ no locale;
+ $a = "qwerty";
+ {
+ use locale;
+ tryneoalpha($Locale, 101, ($a cmp "qwerty") == 0);
+ }
+ }
+
+ {
+ my ($from, $to, $lesser, $greater,
+ @test, %test, $test, $yes, $no, $sign);
+
+ for (0..9) {
+ # Select a slice.
+ $from = int(($_*@Alnum_)/10);
+ $to = $from + int(@Alnum_/10);
+ $to = $#Alnum_ if ($to > $#Alnum_);
+ $lesser = join('', @Alnum_[$from..$to]);
+ # Select a slice one character on.
+ $from++; $to++;
+ $to = $#Alnum_ if ($to > $#Alnum_);
+ $greater = join('', @Alnum_[$from..$to]);
+ ($yes, $no, $sign) = ($lesser lt $greater
+ ? (" ", "not ", 1)
+ : ("not ", " ", -1));
+ # all these tests should FAIL (return 0).
+ # Exact lt or gt cannot be tested because
+ # in some locales, say, eacute and E may test equal.
+ @test =
+ (
+ $no.' ($lesser le $greater)', # 1
+ 'not ($lesser ne $greater)', # 2
+ ' ($lesser eq $greater)', # 3
+ $yes.' ($lesser ge $greater)', # 4
+ $yes.' ($lesser ge $greater)', # 5
+ $yes.' ($greater le $lesser )', # 7
+ 'not ($greater ne $lesser )', # 8
+ ' ($greater eq $lesser )', # 9
+ $no.' ($greater ge $lesser )', # 10
+ 'not (($lesser cmp $greater) == -$sign)' # 12
+ );
+ @test{@test} = 0 x @test;
+ $test = 0;
+ for my $ti (@test) {
+ $test{$ti} = eval $ti;
+ $test ||= $test{$ti}
+ }
+ tryneoalpha($Locale, 102, $test == 0);
+ if ($test) {
+ debug "# lesser = '$lesser'\n";
+ debug "# greater = '$greater'\n";
+ debug "# lesser cmp greater = ",
+ $lesser cmp $greater, "\n";
+ debug "# greater cmp lesser = ",
+ $greater cmp $lesser, "\n";
+ debug "# (greater) from = $from, to = $to\n";
+ for my $ti (@test) {
+ debugf("# %-40s %-4s", $ti,
+ $test{$ti} ? 'FAIL' : 'ok');
+ if ($ti =~ /\(\.*(\$.+ +cmp +\$[^\)]+)\.*\)/) {
+ debugf("(%s == %4d)", $1, eval $1);
+ }
+ debug "\n#";
+ }
+
+ last;
+ }
+ }
+ }
}
-}
-@Neoalpha = sort @Neoalpha;
+ use locale;
-# Test \w.
+ my ($x, $y) = (1.23, 1.23);
-{
- my $word = join('', @Neoalpha);
+ my $a = "$x";
+ printf ''; # printf used to reset locale to "C"
+ my $b = "$y";
- $word =~ /^(\w*)$/;
+ debug "# 103..107: a = $a, b = $b, Locale = $Locale\n";
- print 'not ' if ($1 ne $word);
-}
-print "ok 99\n";
+ tryneoalpha($Locale, 103, $a eq $b);
-# Find places where the collation order differs from the default locale.
+ my $c = "$x";
+ my $z = sprintf ''; # sprintf used to reset locale to "C"
+ my $d = "$y";
-print "# testing 100\n";
-{
- my (@k, $i, $j, @d);
+ debug "# 104..107: c = $c, d = $d, Locale = $Locale\n";
+
+ tryneoalpha($Locale, 104, $c eq $d);
{
- no locale;
+ use warnings;
+ my $w = 0;
+ local $SIG{__WARN__} = sub { $w++ };
+
+ # the == (among other ops) used to warn for locales
+ # that had something else than "." as the radix character
+
+ tryneoalpha($Locale, 105, $c == 1.23);
+
+ tryneoalpha($Locale, 106, $c == $x);
+
+ tryneoalpha($Locale, 107, $c == $d);
+
+ {
+ no locale;
+
+ my $e = "$x";
+
+ debug "# 108..110: e = $e, Locale = $Locale\n";
+
+ tryneoalpha($Locale, 108, $e == 1.23);
+
+ tryneoalpha($Locale, 109, $e == $x);
+
+ tryneoalpha($Locale, 110, $e == $c);
+ }
+
+ tryneoalpha($Locale, 111, $w == 0);
+
+ my $f = "1.23";
- @k = sort (keys %UPPER, keys %lower);
+ debug "# 112..114: f = $f, locale = $Locale\n";
+
+ tryneoalpha($Locale, 112, $f == 1.23);
+
+ tryneoalpha($Locale, 113, $f == $x);
+
+ tryneoalpha($Locale, 114, $f == $c);
}
- for ($i = 0; $i < @k; $i++) {
- for ($j = $i + 1; $j < @k; $j++) {
- if ($iLocale{$k[$j]} < $iLocale{$k[$i]}) {
- push(@d, [$k[$j], $k[$i]]);
- }
+ debug "# testing 115 with locale '$Locale'\n";
+ {
+ use locale;
+
+ sub lcA {
+ my $lc0 = lc $_[0];
+ my $lc1 = lc $_[1];
+ return $lc0 cmp $lc1;
}
+
+ sub lcB {
+ return lc($_[0]) cmp lc($_[1]);
+ }
+
+ my $x = "ab";
+ my $y = "aa";
+ my $z = "AB";
+
+ tryneoalpha($Locale, 115,
+ lcA($x, $y) == 1 && lcB($x, $y) == 1 ||
+ lcA($x, $z) == 0 && lcB($x, $z) == 0);
}
- # Cross-check those places.
+ debug "# testing 116 with locale '$Locale'\n";
+ {
+ use locale;
- for (@d) {
- ($i, $j) = @$_;
- if ($i gt $j) {
- print "# failed 100 at:\n";
- print "# i = $i, j = $j, i ",
- $i le $j ? 'le' : 'gt', " j\n";
- print 'not ';
- last;
+ my @f = ();
+ foreach my $x (keys %UPPER) {
+ my $y = lc $x;
+ next unless uc $y eq $x;
+ push @f, $x unless $x =~ /$y/i && $y =~ /$x/i;
}
+ foreach my $x (keys %lower) {
+ my $y = uc $x;
+ next unless lc $y eq $x;
+ push @f, $x unless $x =~ /$y/i && $y =~ /$x/i;
+ }
+ tryneoalpha($Locale, 116, @f == 0);
+ print "# testing 116 failed for locale '$Locale' for characters @f\n"
+ if @f;
}
}
-print "ok 100\n";
-
-# Cross-check whole character set.
-
-print "# testing 101\n";
-for (map { chr } 0..255) {
- if (/\w/ and /\W/) { print 'not '; last }
- if (/\d/ and /\D/) { print 'not '; last }
- if (/\s/ and /\S/) { print 'not '; last }
- if (/\w/ and /\D/ and not /_/ and
- not (exists $UPPER{$_} or exists $lower{$_})) {
- print "# failed 101 at:\n";
- print "# ", ord($_), " '$_'\n";
- print 'not ';
- last;
+
+# Recount the errors.
+
+foreach (99..116) {
+ if ($Problem{$_} || !defined $Okay{$_} || !@{$Okay{$_}}) {
+ if ($_ == 102) {
+ print "# The failure of test 102 is not necessarily fatal.\n";
+ print "# It usually indicates a problem in the enviroment,\n";
+ print "# not in Perl itself.\n";
+ }
+ print "not ";
}
+ print "ok $_\n";
}
-print "ok 101\n";
-
-# Test for read-onlys.
-print "# testing 102\n";
-{
- no locale;
- $a = "qwerty";
- {
- use locale;
- print "not " if $a cmp "qwerty";
+# Give final advice.
+
+my $didwarn = 0;
+
+foreach (99..116) {
+ if ($Problem{$_}) {
+ my @f = sort keys %{ $Problem{$_} };
+ my $f = join(" ", @f);
+ $f =~ s/(.{50,60}) /$1\n#\t/g;
+ print
+ "#\n",
+ "# The locale ", (@f == 1 ? "definition" : "definitions"), "\n#\n",
+ "#\t", $f, "\n#\n",
+ "# on your system may have errors because the locale test $_\n",
+ "# failed in ", (@f == 1 ? "that locale" : "those locales"),
+ ".\n";
+ print <<EOW;
+#
+# If your users are not using these locales you are safe for the moment,
+# but please report this failure first to perlbug\@perl.com using the
+# perlbug script (as described in the INSTALL file) so that the exact
+# details of the failures can be sorted out first and then your operating
+# system supplier can be alerted about these anomalies.
+#
+EOW
+ $didwarn = 1;
}
}
-print "ok 102\n";
-
-# This test must be the last one because its failure is not fatal.
-# The @Locale should be internally consistent.
-# Thanks to Hallvard Furuseth <h.b.furuseth@usit.uio.no>
-# for inventing a way to test for ordering consistency
-# without requiring any particular order.
-# <jhi@iki.fi>
-
-print "# testing 103\n";
-{
- my ($from, $to, $lesser, $greater, @test, %test, $test, $yes, $no, $sign);
-
- for (0..9) {
- # Select a slice.
- $from = int(($_*@Locale)/10);
- $to = $from + int(@Locale/10);
- $to = $#Locale if ($to > $#Locale);
- $lesser = join('', @Locale[$from..$to]);
- # Select a slice one character on.
- $from++; $to++;
- $to = $#Locale if ($to > $#Locale);
- $greater = join('', @Locale[$from..$to]);
- ($yes, $no, $sign) = ($lesser lt $greater
- ? (" ", "not ", 1)
- : ("not ", " ", -1));
- # all these tests should FAIL (return 0).
- @test =
- (
- $no.' ($lesser lt $greater)', # 0
- $no.' ($lesser le $greater)', # 1
- 'not ($lesser ne $greater)', # 2
- ' ($lesser eq $greater)', # 3
- $yes.' ($lesser ge $greater)', # 4
- $yes.' ($lesser gt $greater)', # 5
- $yes.' ($greater lt $lesser )', # 6
- $yes.' ($greater le $lesser )', # 7
- 'not ($greater ne $lesser )', # 8
- ' ($greater eq $lesser )', # 9
- $no.' ($greater ge $lesser )', # 10
- $no.' ($greater gt $lesser )', # 11
- 'not (($lesser cmp $greater) == -$sign)' # 12
- );
- @test{@test} = 0 x @test;
- $test = 0;
- for my $ti (@test) { $test{$ti} = eval $ti ; $test ||= $test{$ti} }
- if ($test) {
- print "# failed 103 at:\n";
- print "# lesser = '$lesser'\n";
- print "# greater = '$greater'\n";
- print "# lesser cmp greater = ", $lesser cmp $greater, "\n";
- print "# greater cmp lesser = ", $greater cmp $lesser, "\n";
- print "# (greater) from = $from, to = $to\n";
- for my $ti (@test) {
- printf("# %-40s %-4s", $ti,
- $test{$ti} ? 'FAIL' : 'ok');
- if ($ti =~ /\(\.*(\$.+ +cmp +\$[^\)]+)\.*\)/) {
- printf("(%s == %4d)", $1, eval $1);
- }
- print "\n";
- }
- warn "The locale definition on your system may have errors.\n";
- last;
+# Tell which locales ere okay.
+
+if ($didwarn) {
+ my @s;
+
+ foreach my $l (@Locale) {
+ my $p = 0;
+ foreach my $t (102..102) {
+ $p++ if $Problem{$t}{$l};
}
+ push @s, $l if $p == 0;
}
+
+ my $s = join(" ", @s);
+ $s =~ s/(.{50,60}) /$1\n#\t/g;
+
+ warn
+ "# The following locales\n#\n",
+ "#\t", $s, "\n#\n",
+ "# tested okay.\n#\n",
}
# eof
diff --git a/contrib/perl5/t/pragma/locale/latin1 b/contrib/perl5/t/pragma/locale/latin1
new file mode 100644
index 0000000..f40f732
--- /dev/null
+++ b/contrib/perl5/t/pragma/locale/latin1
@@ -0,0 +1,10 @@
+$locales .= <<EOF;
+Català Catalan:ca:es:1 15
+Français French:fr:be ca ch fr lu:1 15
+Gáidhlig Gaelic:gd:gb uk:1 14 15
+Føroyskt Faroese:fo:fo:1 15
+Íslensku Icelandic:is:is:1 15
+Sámi Lappish:::4 6 13
+Português Portuguese:po:po br:1 15
+Espanõl Spanish:es:ar bo cl co cr do ec es gt hn mx ni pa pe py sv uy ve:1 15
+EOF
diff --git a/contrib/perl5/t/pragma/locale/utf8 b/contrib/perl5/t/pragma/locale/utf8
new file mode 100644
index 0000000..fbbe94f
--- /dev/null
+++ b/contrib/perl5/t/pragma/locale/utf8
@@ -0,0 +1,10 @@
+$locales .= <<EOF;
+Català Catalan:ca:es:1 15
+Français French:fr:be ca ch fr lu:1 15
+Gáidhlig Gaelic:gd:gb uk:1 14 15
+Føroyskt Faroese:fo:fo:1 15
+Ãslensku Icelandic:is:is:1 15
+Sámi Lappish:::4 6 13
+Português Portuguese:po:po br:1 15
+Espanõl Spanish:es:ar bo cl co cr do ec es gt hn mx ni pa pe py sv uy ve:1 15
+EOF
diff --git a/contrib/perl5/t/pragma/overload.t b/contrib/perl5/t/pragma/overload.t
index 0682266..f9a9c59 100755
--- a/contrib/perl5/t/pragma/overload.t
+++ b/contrib/perl5/t/pragma/overload.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
}
package Oscalar;
@@ -706,5 +706,227 @@ test($c, "bareword"); # 135
my @sorted2 = map $$_, @sorted1;
test "@sorted2", '0 10 7 4 1 11 8 5 12 2 9 6 3';
}
+{
+ package iterator;
+ use overload '<>' => \&iter;
+ sub new { my ($p, $v) = @_; bless \$v, $p }
+ sub iter { my ($x) = @_; return undef if $$x < 0; return $$x--; }
+}
+
+# XXX iterator overload not intended to work with CORE::GLOBAL?
+if (defined &CORE::GLOBAL::glob) {
+ test '1', '1'; # 175
+ test '1', '1'; # 176
+ test '1', '1'; # 177
+}
+else {
+ my $iter = iterator->new(5);
+ my $acc = '';
+ my $out;
+ $acc .= " $out" while $out = <${iter}>;
+ test $acc, ' 5 4 3 2 1 0'; # 175
+ $iter = iterator->new(5);
+ test scalar <${iter}>, '5'; # 176
+ $acc = '';
+ $acc .= " $out" while $out = <$iter>;
+ test $acc, ' 4 3 2 1 0'; # 177
+}
+{
+ package deref;
+ use overload '%{}' => \&hderef, '&{}' => \&cderef,
+ '*{}' => \&gderef, '${}' => \&sderef, '@{}' => \&aderef;
+ sub new { my ($p, $v) = @_; bless \$v, $p }
+ sub deref {
+ my ($self, $key) = (shift, shift);
+ my $class = ref $self;
+ bless $self, 'deref::dummy'; # Disable overloading of %{}
+ my $out = $self->{$key};
+ bless $self, $class; # Restore overloading
+ $out;
+ }
+ sub hderef {shift->deref('h')}
+ sub aderef {shift->deref('a')}
+ sub cderef {shift->deref('c')}
+ sub gderef {shift->deref('g')}
+ sub sderef {shift->deref('s')}
+}
+{
+ my $deref = bless { h => { foo => 5 , fake => 23 },
+ c => sub {return shift() + 34},
+ 's' => \123,
+ a => [11..13],
+ g => \*srt,
+ }, 'deref';
+ # Hash:
+ my @cont = sort %$deref;
+ if ("\t" eq "\011") { # ascii
+ test "@cont", '23 5 fake foo'; # 178
+ }
+ else { # ebcdic alpha-numeric sort order
+ test "@cont", 'fake foo 23 5'; # 178
+ }
+ my @keys = sort keys %$deref;
+ test "@keys", 'fake foo'; # 179
+ my @val = sort values %$deref;
+ test "@val", '23 5'; # 180
+ test $deref->{foo}, 5; # 181
+ test defined $deref->{bar}, ''; # 182
+ my $key;
+ @keys = ();
+ push @keys, $key while $key = each %$deref;
+ @keys = sort @keys;
+ test "@keys", 'fake foo'; # 183
+ test exists $deref->{bar}, ''; # 184
+ test exists $deref->{foo}, 1; # 185
+ # Code:
+ test $deref->(5), 39; # 186
+ test &$deref(6), 40; # 187
+ sub xxx_goto { goto &$deref }
+ test xxx_goto(7), 41; # 188
+ my $srt = bless { c => sub {$b <=> $a}
+ }, 'deref';
+ *srt = \&$srt;
+ my @sorted = sort srt 11, 2, 5, 1, 22;
+ test "@sorted", '22 11 5 2 1'; # 189
+ # Scalar
+ test $$deref, 123; # 190
+ # Code
+ @sorted = sort $srt 11, 2, 5, 1, 22;
+ test "@sorted", '22 11 5 2 1'; # 191
+ # Array
+ test "@$deref", '11 12 13'; # 192
+ test $#$deref, '2'; # 193
+ my $l = @$deref;
+ test $l, 3; # 194
+ test $deref->[2], '13'; # 195
+ $l = pop @$deref;
+ test $l, 13; # 196
+ $l = 1;
+ test $deref->[$l], '12'; # 197
+ # Repeated dereference
+ my $double = bless { h => $deref,
+ }, 'deref';
+ test $double->{foo}, 5; # 198
+}
+
+{
+ package two_refs;
+ use overload '%{}' => \&gethash, '@{}' => sub { ${shift()} };
+ sub new {
+ my $p = shift;
+ bless \ [@_], $p;
+ }
+ sub gethash {
+ my %h;
+ my $self = shift;
+ tie %h, ref $self, $self;
+ \%h;
+ }
+
+ sub TIEHASH { my $p = shift; bless \ shift, $p }
+ my %fields;
+ my $i = 0;
+ $fields{$_} = $i++ foreach qw{zero one two three};
+ sub STORE {
+ my $self = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $$self->[$key] = shift;
+ }
+ sub FETCH {
+ my $self = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $$self->[$key];
+ }
+}
+
+my $bar = new two_refs 3,4,5,6;
+$bar->[2] = 11;
+test $bar->{two}, 11; # 199
+$bar->{three} = 13;
+test $bar->[3], 13; # 200
+
+{
+ package two_refs_o;
+ @ISA = ('two_refs');
+}
+
+$bar = new two_refs_o 3,4,5,6;
+$bar->[2] = 11;
+test $bar->{two}, 11; # 201
+$bar->{three} = 13;
+test $bar->[3], 13; # 202
+
+{
+ package two_refs1;
+ use overload '%{}' => sub { ${shift()}->[1] },
+ '@{}' => sub { ${shift()}->[0] };
+ sub new {
+ my $p = shift;
+ my $a = [@_];
+ my %h;
+ tie %h, $p, $a;
+ bless \ [$a, \%h], $p;
+ }
+ sub gethash {
+ my %h;
+ my $self = shift;
+ tie %h, ref $self, $self;
+ \%h;
+ }
+
+ sub TIEHASH { my $p = shift; bless \ shift, $p }
+ my %fields;
+ my $i = 0;
+ $fields{$_} = $i++ foreach qw{zero one two three};
+ sub STORE {
+ my $a = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $a->[$key] = shift;
+ }
+ sub FETCH {
+ my $a = ${shift()};
+ my $key = $fields{shift()};
+ defined $key or die "Out of band access";
+ $a->[$key];
+ }
+}
+
+$bar = new two_refs_o 3,4,5,6;
+$bar->[2] = 11;
+test $bar->{two}, 11; # 203
+$bar->{three} = 13;
+test $bar->[3], 13; # 204
+
+{
+ package two_refs1_o;
+ @ISA = ('two_refs1');
+}
+
+$bar = new two_refs1_o 3,4,5,6;
+$bar->[2] = 11;
+test $bar->{two}, 11; # 205
+$bar->{three} = 13;
+test $bar->[3], 13; # 206
+
+{
+ package B;
+ use overload bool => sub { ${+shift} };
+}
+
+my $aaa;
+{ my $bbbb = 0; $aaa = bless \$bbbb, B }
+
+test !$aaa, 1;
+
+unless ($aaa) {
+ test 'ok', 'ok';
+} else {
+ test 'is not', 'ok';
+}
+
+
# Last test is:
-sub last {174}
+sub last {208}
diff --git a/contrib/perl5/t/pragma/strict-refs b/contrib/perl5/t/pragma/strict-refs
index 7bf1556..10599b0 100644
--- a/contrib/perl5/t/pragma/strict-refs
+++ b/contrib/perl5/t/pragma/strict-refs
@@ -196,6 +196,7 @@ ${"Fred"} ;
require "./abc";
EXPECT
Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at ./abc line 2.
+Compilation failed in require at - line 2.
########
--FILE-- abc.pm
@@ -207,6 +208,7 @@ my $a = ${"Fred"} ;
use abc;
EXPECT
Can't use string ("Fred") as a SCALAR ref while "strict refs" in use at abc.pm line 2.
+Compilation failed in require at - line 2.
BEGIN failed--compilation aborted at - line 2.
########
diff --git a/contrib/perl5/t/pragma/strict-subs b/contrib/perl5/t/pragma/strict-subs
index 61ec286..ed4fe7a 100644
--- a/contrib/perl5/t/pragma/strict-subs
+++ b/contrib/perl5/t/pragma/strict-subs
@@ -33,6 +33,24 @@ Execution of - aborted due to compilation errors.
########
# strict subs - error
+use strict 'subs' ;
+my @a = (A..Z);
+EXPECT
+Bareword "Z" not allowed while "strict subs" in use at - line 4.
+Bareword "A" not allowed while "strict subs" in use at - line 4.
+Execution of - aborted due to compilation errors.
+########
+
+# strict subs - error
+use strict 'subs' ;
+my $a = (B..Y);
+EXPECT
+Bareword "Y" not allowed while "strict subs" in use at - line 4.
+Bareword "B" not allowed while "strict subs" in use at - line 4.
+Execution of - aborted due to compilation errors.
+########
+
+# strict subs - error
use strict ;
Fred ;
EXPECT
@@ -277,3 +295,25 @@ my $a = Fred ;
EXPECT
Bareword "Fred" not allowed while "strict subs" in use at - line 8.
Execution of - aborted due to compilation errors.
+########
+
+# see if Foo->Bar(...) etc work under strictures
+use strict;
+package Foo; sub Bar { print "@_\n" }
+Foo->Bar('a',1);
+Bar Foo ('b',2);
+Foo->Bar(qw/c 3/);
+Bar Foo (qw/d 4/);
+Foo::->Bar('A',1);
+Bar Foo:: ('B',2);
+Foo::->Bar(qw/C 3/);
+Bar Foo:: (qw/D 4/);
+EXPECT
+Foo a 1
+Foo b 2
+Foo c 3
+Foo d 4
+Foo A 1
+Foo B 2
+Foo C 3
+Foo D 4
diff --git a/contrib/perl5/t/pragma/strict-vars b/contrib/perl5/t/pragma/strict-vars
index 42107fa..ae09742 100644
--- a/contrib/perl5/t/pragma/strict-vars
+++ b/contrib/perl5/t/pragma/strict-vars
@@ -27,6 +27,15 @@ EXPECT
# strict vars - no error
use strict 'vars' ;
use vars qw( $freddy) ;
+BEGIN { *freddy = \$joe::shmoe; }
+$freddy = 2 ;
+EXPECT
+
+########
+
+# strict vars - no error
+use strict 'vars' ;
+use vars qw( $freddy) ;
local $abc::joe ;
my $fred ;
my $b = \$fred ;
@@ -132,6 +141,40 @@ Compilation failed in require at - line 2.
BEGIN failed--compilation aborted at - line 2.
########
+--FILE-- abc.pm
+package Burp;
+use strict;
+$a = 1;$f = 1;$k = 1; # just to get beyond the limit...
+$b = 1;$g = 1;$l = 1;
+$c = 1;$h = 1;$m = 1;
+$d = 1;$i = 1;$n = 1;
+$e = 1;$j = 1;$o = 1;
+$p = 0b12;
+--FILE--
+# known scalar leak
+BEGIN { $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3; }
+use abc;
+EXPECT
+Global symbol "$f" requires explicit package name at abc.pm line 3.
+Global symbol "$k" requires explicit package name at abc.pm line 3.
+Global symbol "$g" requires explicit package name at abc.pm line 4.
+Global symbol "$l" requires explicit package name at abc.pm line 4.
+Global symbol "$c" requires explicit package name at abc.pm line 5.
+Global symbol "$h" requires explicit package name at abc.pm line 5.
+Global symbol "$m" requires explicit package name at abc.pm line 5.
+Global symbol "$d" requires explicit package name at abc.pm line 6.
+Global symbol "$i" requires explicit package name at abc.pm line 6.
+Global symbol "$n" requires explicit package name at abc.pm line 6.
+Global symbol "$e" requires explicit package name at abc.pm line 7.
+Global symbol "$j" requires explicit package name at abc.pm line 7.
+Global symbol "$o" requires explicit package name at abc.pm line 7.
+Global symbol "$p" requires explicit package name at abc.pm line 8.
+Illegal binary digit '2' at abc.pm line 8, at end of line
+abc.pm has too many errors.
+Compilation failed in require at - line 3.
+BEGIN failed--compilation aborted at - line 3.
+########
+
# Check scope of pragma with eval
no strict ;
eval {
@@ -165,6 +208,7 @@ print STDERR $@;
$joe = 1 ;
EXPECT
Global symbol "$joe" requires explicit package name at - line 5.
+Global symbol "$joe" requires explicit package name at - line 8.
Execution of - aborted due to compilation errors.
########
@@ -221,3 +265,135 @@ $joe = 1 ;
EXPECT
Global symbol "$joe" requires explicit package name at - line 8.
Execution of - aborted due to compilation errors.
+########
+
+# Check if multiple evals produce same errors
+use strict 'vars';
+my $ret = eval q{ print $x; };
+print $@;
+print "ok 1\n" unless defined $ret;
+$ret = eval q{ print $x; };
+print $@;
+print "ok 2\n" unless defined $ret;
+EXPECT
+Global symbol "$x" requires explicit package name at (eval 1) line 1.
+ok 1
+Global symbol "$x" requires explicit package name at (eval 2) line 1.
+ok 2
+########
+
+# strict vars with outer our - no error
+use strict 'vars' ;
+our $freddy;
+local $abc::joe ;
+my $fred ;
+my $b = \$fred ;
+$Fred::ABC = 1 ;
+$freddy = 2 ;
+EXPECT
+
+########
+
+# strict vars with inner our - no error
+use strict 'vars' ;
+sub foo {
+ our $fred;
+ $fred;
+}
+EXPECT
+
+########
+
+# strict vars with outer our, inner use - no error
+use strict 'vars' ;
+our $fred;
+sub foo {
+ $fred;
+}
+EXPECT
+
+########
+
+# strict vars with nested our - no error
+use strict 'vars' ;
+our $fred;
+sub foo {
+ our $fred;
+ $fred;
+}
+$fred ;
+EXPECT
+
+########
+
+# strict vars with elapsed our - error
+use strict 'vars' ;
+sub foo {
+ our $fred;
+ $fred;
+}
+$fred ;
+EXPECT
+Variable "$fred" is not imported at - line 8.
+Global symbol "$fred" requires explicit package name at - line 8.
+Execution of - aborted due to compilation errors.
+########
+
+# nested our with local - no error
+$fred = 1;
+use strict 'vars';
+{
+ local our $fred = 2;
+ print $fred,"\n";
+}
+print our $fred,"\n";
+EXPECT
+2
+1
+########
+
+# "nailed" our declaration visibility across package boundaries
+use strict 'vars';
+our $foo;
+$foo = 20;
+package Foo;
+print $foo, "\n";
+EXPECT
+20
+########
+
+# multiple our declarations in same scope, different packages, no warning
+use strict 'vars';
+use warnings;
+our $foo;
+${foo} = 10;
+package Foo;
+our $foo = 20;
+print $foo, "\n";
+EXPECT
+20
+########
+
+# multiple our declarations in same scope, same package, warning
+use strict 'vars';
+use warnings;
+our $foo;
+${foo} = 10;
+our $foo;
+EXPECT
+"our" variable $foo masks earlier declaration in same scope at - line 7.
+########
+
+# multiple our declarations in same scope, same package, warning
+use strict 'vars';
+use warnings;
+our $foo;
+{
+ our $foo;
+ package Foo;
+ our $foo;
+}
+EXPECT
+"our" variable $foo redeclared at - line 7.
+ (Did you mean "local" instead of "our"?)
+Name "Foo::foo" used only once: possible typo at - line 9.
diff --git a/contrib/perl5/t/pragma/strict.t b/contrib/perl5/t/pragma/strict.t
index fc32820..c4d6416 100755
--- a/contrib/perl5/t/pragma/strict.t
+++ b/contrib/perl5/t/pragma/strict.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
$ENV{PERL5LIB} = '../lib';
}
@@ -65,11 +65,9 @@ for (@prgs){
open TEST, ">$tmpfile";
print TEST $prog,"\n";
close TEST;
- my $results = $Is_VMS ?
- `MCR $^X $switch $tmpfile` :
- $Is_MSWin32 ?
+ my $results = $Is_MSWin32 ?
`.\\perl -I../lib $switch $tmpfile 2>&1` :
- `sh -c './perl $switch $tmpfile' 2>&1`;
+ `./perl $switch $tmpfile 2>&1`;
my $status = $?;
$results =~ s/\n+$//;
# allow expected output to be written as if $prog is on STDIN
diff --git a/contrib/perl5/t/pragma/sub_lval.t b/contrib/perl5/t/pragma/sub_lval.t
new file mode 100755
index 0000000..e96c329
--- /dev/null
+++ b/contrib/perl5/t/pragma/sub_lval.t
@@ -0,0 +1,429 @@
+print "1..46\n";
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+sub a : lvalue { my $a = 34; bless \$a } # Return a temporary
+sub b : lvalue { shift }
+
+my $out = a(b()); # Check that temporaries are allowed.
+print "# `$out'\nnot " unless ref $out eq 'main'; # Not reached if error.
+print "ok 1\n";
+
+my @out = grep /main/, a(b()); # Check that temporaries are allowed.
+print "# `@out'\nnot " unless @out==1; # Not reached if error.
+print "ok 2\n";
+
+my $in;
+
+# Check that we can return localized values from subroutines:
+
+sub in : lvalue { $in = shift; }
+sub neg : lvalue { #(num_str) return num_str
+ local $_ = shift;
+ s/^\+/-/;
+ $_;
+}
+in(neg("+2"));
+
+
+print "# `$in'\nnot " unless $in eq '-2';
+print "ok 3\n";
+
+sub get_lex : lvalue { $in }
+sub get_st : lvalue { $blah }
+sub id : lvalue { shift }
+sub id1 : lvalue { $_[0] }
+sub inc : lvalue { ++$_[0] }
+
+$in = 5;
+$blah = 3;
+
+get_st = 7;
+
+print "# `$blah' ne 7\nnot " unless $blah eq 7;
+print "ok 4\n";
+
+get_lex = 7;
+
+print "# `$in' ne 7\nnot " unless $in eq 7;
+print "ok 5\n";
+
+++get_st;
+
+print "# `$blah' ne 8\nnot " unless $blah eq 8;
+print "ok 6\n";
+
+++get_lex;
+
+print "# `$in' ne 8\nnot " unless $in eq 8;
+print "ok 7\n";
+
+id(get_st) = 10;
+
+print "# `$blah' ne 10\nnot " unless $blah eq 10;
+print "ok 8\n";
+
+id(get_lex) = 10;
+
+print "# `$in' ne 10\nnot " unless $in eq 10;
+print "ok 9\n";
+
+++id(get_st);
+
+print "# `$blah' ne 11\nnot " unless $blah eq 11;
+print "ok 10\n";
+
+++id(get_lex);
+
+print "# `$in' ne 11\nnot " unless $in eq 11;
+print "ok 11\n";
+
+id1(get_st) = 20;
+
+print "# `$blah' ne 20\nnot " unless $blah eq 20;
+print "ok 12\n";
+
+id1(get_lex) = 20;
+
+print "# `$in' ne 20\nnot " unless $in eq 20;
+print "ok 13\n";
+
+++id1(get_st);
+
+print "# `$blah' ne 21\nnot " unless $blah eq 21;
+print "ok 14\n";
+
+++id1(get_lex);
+
+print "# `$in' ne 21\nnot " unless $in eq 21;
+print "ok 15\n";
+
+inc(get_st);
+
+print "# `$blah' ne 22\nnot " unless $blah eq 22;
+print "ok 16\n";
+
+inc(get_lex);
+
+print "# `$in' ne 22\nnot " unless $in eq 22;
+print "ok 17\n";
+
+inc(id(get_st));
+
+print "# `$blah' ne 23\nnot " unless $blah eq 23;
+print "ok 18\n";
+
+inc(id(get_lex));
+
+print "# `$in' ne 23\nnot " unless $in eq 23;
+print "ok 19\n";
+
+++inc(id1(id(get_st)));
+
+print "# `$blah' ne 25\nnot " unless $blah eq 25;
+print "ok 20\n";
+
+++inc(id1(id(get_lex)));
+
+print "# `$in' ne 25\nnot " unless $in eq 25;
+print "ok 21\n";
+
+@a = (1) x 3;
+@b = (undef) x 2;
+$#c = 3; # These slots are not fillable.
+
+# Explanation: empty slots contain &sv_undef.
+
+=for disabled constructs
+
+sub a3 :lvalue {@a}
+sub b2 : lvalue {@b}
+sub c4: lvalue {@c}
+
+$_ = '';
+
+eval <<'EOE' or $_ = $@;
+ ($x, a3, $y, b2, $z, c4, $t) = (34 .. 78);
+ 1;
+EOE
+
+#@out = ($x, a3, $y, b2, $z, c4, $t);
+#@in = (34 .. 41, (undef) x 4, 46);
+#print "# `@out' ne `@in'\nnot " unless "@out" eq "@in";
+
+print "# '$_'.\nnot "
+ unless /Can\'t return an uninitialized value from lvalue subroutine/;
+=cut
+
+print "ok 22\n";
+
+my $var;
+
+sub a::var : lvalue { $var }
+
+"a"->var = 45;
+
+print "# `$var' ne 45\nnot " unless $var eq 45;
+print "ok 23\n";
+
+my $oo;
+$o = bless \$oo, "a";
+
+$o->var = 47;
+
+print "# `$var' ne 47\nnot " unless $var eq 47;
+print "ok 24\n";
+
+sub o : lvalue { $o }
+
+o->var = 49;
+
+print "# `$var' ne 49\nnot " unless $var eq 49;
+print "ok 25\n";
+
+sub nolv () { $x0, $x1 } # Not lvalue
+
+$_ = '';
+
+eval <<'EOE' or $_ = $@;
+ nolv = (2,3);
+ 1;
+EOE
+
+print "not "
+ unless /Can\'t modify non-lvalue subroutine call in scalar assignment/;
+print "ok 26\n";
+
+$_ = '';
+
+eval <<'EOE' or $_ = $@;
+ nolv = (2,3) if $_;
+ 1;
+EOE
+
+print "not "
+ unless /Can\'t modify non-lvalue subroutine call in scalar assignment/;
+print "ok 27\n";
+
+$_ = '';
+
+eval <<'EOE' or $_ = $@;
+ &nolv = (2,3) if $_;
+ 1;
+EOE
+
+print "not "
+ unless /Can\'t modify non-lvalue subroutine call in scalar assignment/;
+print "ok 28\n";
+
+$x0 = $x1 = $_ = undef;
+$nolv = \&nolv;
+
+eval <<'EOE' or $_ = $@;
+ $nolv->() = (2,3) if $_;
+ 1;
+EOE
+
+print "# '$_', '$x0', '$x1'.\nnot " if defined $_;
+print "ok 29\n";
+
+$x0 = $x1 = $_ = undef;
+$nolv = \&nolv;
+
+eval <<'EOE' or $_ = $@;
+ $nolv->() = (2,3);
+ 1;
+EOE
+
+print "# '$_', '$x0', '$x1'.\nnot "
+ unless /Can\'t modify non-lvalue subroutine call/;
+print "ok 30\n";
+
+sub lv0 : lvalue { } # Converted to lv10 in scalar context
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ lv0 = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a readonly value from lvalue subroutine/;
+print "ok 31\n";
+
+sub lv10 : lvalue {}
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ (lv0) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot " if defined $_;
+print "ok 32\n";
+
+sub lv1u :lvalue { undef }
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ lv1u = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a readonly value from lvalue subroutine/;
+print "ok 33\n";
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ (lv1u) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return an uninitialized value from lvalue subroutine/;
+print "ok 34\n";
+
+$x = '1234567';
+sub lv1t : lvalue { index $x, 2 }
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ lv1t = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a temporary from lvalue subroutine/;
+print "ok 35\n";
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ (lv1t) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a temporary from lvalue subroutine/;
+print "ok 36\n";
+
+$xxx = 'xxx';
+sub xxx () { $xxx } # Not lvalue
+sub lv1tmp : lvalue { xxx } # is it a TEMP?
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ lv1tmp = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a temporary from lvalue subroutine/;
+print "ok 37\n";
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ (lv1tmp) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a temporary from lvalue subroutine/;
+print "ok 38\n";
+
+sub xxx () { 'xxx' } # Not lvalue
+sub lv1tmpr : lvalue { xxx } # is it a TEMP?
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ lv1tmpr = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a readonly value from lvalue subroutine/;
+print "ok 39\n";
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ (lv1tmpr) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return a readonly value from lvalue subroutine/;
+print "ok 40\n";
+
+=for disabled constructs
+
+sub lva : lvalue {@a}
+
+$_ = undef;
+@a = ();
+$a[1] = 12;
+eval <<'EOE' or $_ = $@;
+ (lva) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot "
+ unless /Can\'t return an uninitialized value from lvalue subroutine/;
+print "ok 41\n";
+
+$_ = undef;
+@a = ();
+$a[0] = undef;
+$a[1] = 12;
+eval <<'EOE' or $_ = $@;
+ (lva) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot " unless "'@a' $_" eq "'2 3' ";
+print "ok 42\n";
+
+$_ = undef;
+@a = ();
+$a[0] = undef;
+$a[1] = 12;
+eval <<'EOE' or $_ = $@;
+ (lva) = (2,3);
+ 1;
+EOE
+
+print "# '$_'.\nnot " unless "'@a' $_" eq "'2 3' ";
+print "ok 43\n";
+
+=cut
+
+print "ok $_\n" for 41..43;
+
+sub lv1n : lvalue { $newvar }
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ lv1n = (3,4);
+ 1;
+EOE
+
+print "# '$_', '$newvar'.\nnot " unless "'$newvar' $_" eq "'4' ";
+print "ok 44\n";
+
+sub lv1nn : lvalue { $nnewvar }
+
+$_ = undef;
+eval <<'EOE' or $_ = $@;
+ (lv1nn) = (3,4);
+ 1;
+EOE
+
+print "# '$_'.\nnot " unless "'$nnewvar' $_" eq "'3' ";
+print "ok 45\n";
+
+$a = \&lv1nn;
+$a->() = 8;
+print "# '$nnewvar'.\nnot " unless $nnewvar eq '8';
+print "ok 46\n";
diff --git a/contrib/perl5/t/pragma/subs.t b/contrib/perl5/t/pragma/subs.t
index 6ebbf78..fe84f5e 100755
--- a/contrib/perl5/t/pragma/subs.t
+++ b/contrib/perl5/t/pragma/subs.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ unshift @INC, '../lib';
$ENV{PERL5LIB} = '../lib';
}
@@ -46,10 +46,10 @@ for (@prgs){
print TEST $prog,"\n";
close TEST;
my $results = $Is_VMS ?
- `MCR $^X $switch $tmpfile` :
+ `./perl $switch $tmpfile 2>&1` :
$Is_MSWin32 ?
`.\\perl -I../lib $switch $tmpfile 2>&1` :
- `sh -c './perl $switch $tmpfile' 2>&1`;
+ `./perl $switch $tmpfile 2>&1`;
my $status = $?;
$results =~ s/\n+$//;
# allow expected output to be written as if $prog is on STDIN
diff --git a/contrib/perl5/t/pragma/utf8.t b/contrib/perl5/t/pragma/utf8.t
new file mode 100755
index 0000000..0e55a67
--- /dev/null
+++ b/contrib/perl5/t/pragma/utf8.t
@@ -0,0 +1,253 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ $ENV{PERL5LIB} = '../lib';
+ if ( ord("\t") != 9 ) { # skip on ebcdic platforms
+ print "1..0 # Skip utf8 tests on ebcdic platform.\n";
+ exit;
+ }
+}
+
+print "1..60\n";
+
+my $test = 1;
+
+sub ok {
+ my ($got,$expect) = @_;
+ print "# expected [$expect], got [$got]\nnot " if $got ne $expect;
+ print "ok $test\n";
+}
+
+{
+ use utf8;
+ $_ = ">\x{263A}<";
+ s/([\x{80}-\x{10ffff}])/"&#".ord($1).";"/eg;
+ ok $_, '>&#9786;<';
+ $test++;
+
+ $_ = ">\x{263A}<";
+ my $rx = "\x{80}-\x{10ffff}";
+ s/([$rx])/"&#".ord($1).";"/eg;
+ ok $_, '>&#9786;<';
+ $test++;
+
+ $_ = ">\x{263A}<";
+ my $rx = "\\x{80}-\\x{10ffff}";
+ s/([$rx])/"&#".ord($1).";"/eg;
+ ok $_, '>&#9786;<';
+ $test++;
+
+ $_ = "alpha,numeric";
+ m/([[:alpha:]]+)/;
+ ok $1, 'alpha';
+ $test++;
+
+ $_ = "alphaNUMERICstring";
+ m/([[:^lower:]]+)/;
+ ok $1, 'NUMERIC';
+ $test++;
+
+ $_ = "alphaNUMERICstring";
+ m/(\p{Ll}+)/;
+ ok $1, 'alpha';
+ $test++;
+
+ $_ = "alphaNUMERICstring";
+ m/(\p{Lu}+)/;
+ ok $1, 'NUMERIC';
+ $test++;
+
+ $_ = "alpha,numeric";
+ m/([\p{IsAlpha}]+)/;
+ ok $1, 'alpha';
+ $test++;
+
+ $_ = "alphaNUMERICstring";
+ m/([^\p{IsLower}]+)/;
+ ok $1, 'NUMERIC';
+ $test++;
+
+ $_ = "alpha123numeric456";
+ m/([\p{IsDigit}]+)/;
+ ok $1, '123';
+ $test++;
+
+ $_ = "alpha123numeric456";
+ m/([^\p{IsDigit}]+)/;
+ ok $1, 'alpha';
+ $test++;
+
+ $_ = ",123alpha,456numeric";
+ m/([\p{IsAlnum}]+)/;
+ ok $1, '123alpha';
+ $test++;
+}
+{
+ use utf8;
+
+ $_ = "\x{263A}>\x{263A}\x{263A}";
+
+ ok length, 4;
+ $test++;
+
+ ok length((m/>(.)/)[0]), 1;
+ $test++;
+
+ ok length($&), 2;
+ $test++;
+
+ ok length($'), 1;
+ $test++;
+
+ ok length($`), 1;
+ $test++;
+
+ ok length($1), 1;
+ $test++;
+
+ ok length($tmp=$&), 2;
+ $test++;
+
+ ok length($tmp=$'), 1;
+ $test++;
+
+ ok length($tmp=$`), 1;
+ $test++;
+
+ ok length($tmp=$1), 1;
+ $test++;
+
+ ok $&, pack("C*", ord(">"), 0342, 0230, 0272);
+ $test++;
+
+ ok $', pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ ok $`, pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ ok $1, pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ {
+ use bytes;
+ no utf8;
+
+ ok length, 10;
+ $test++;
+
+ ok length((m/>(.)/)[0]), 1;
+ $test++;
+
+ ok length($&), 2;
+ $test++;
+
+ ok length($'), 5;
+ $test++;
+
+ ok length($`), 3;
+ $test++;
+
+ ok length($1), 1;
+ $test++;
+
+ ok $&, pack("C*", ord(">"), 0342);
+ $test++;
+
+ ok $', pack("C*", 0230, 0272, 0342, 0230, 0272);
+ $test++;
+
+ ok $`, pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ ok $1, pack("C*", 0342);
+ $test++;
+
+ }
+
+
+ {
+ no utf8;
+ $_="\342\230\272>\342\230\272\342\230\272";
+ }
+
+ ok length, 10;
+ $test++;
+
+ ok length((m/>(.)/)[0]), 1;
+ $test++;
+
+ ok length($&), 2;
+ $test++;
+
+ ok length($'), 1;
+ $test++;
+
+ ok length($`), 1;
+ $test++;
+
+ ok length($1), 1;
+ $test++;
+
+ ok length($tmp=$&), 2;
+ $test++;
+
+ ok length($tmp=$'), 1;
+ $test++;
+
+ ok length($tmp=$`), 1;
+ $test++;
+
+ ok length($tmp=$1), 1;
+ $test++;
+
+ ok $&, pack("C*", ord(">"), 0342, 0230, 0272);
+ $test++;
+
+ ok $', pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ ok $`, pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ ok $1, pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ {
+ use bytes;
+ no utf8;
+
+ ok length, 10;
+ $test++;
+
+ ok length((m/>(.)/)[0]), 1;
+ $test++;
+
+ ok length($&), 2;
+ $test++;
+
+ ok length($'), 5;
+ $test++;
+
+ ok length($`), 3;
+ $test++;
+
+ ok length($1), 1;
+ $test++;
+
+ ok $&, pack("C*", ord(">"), 0342);
+ $test++;
+
+ ok $', pack("C*", 0230, 0272, 0342, 0230, 0272);
+ $test++;
+
+ ok $`, pack("C*", 0342, 0230, 0272);
+ $test++;
+
+ ok $1, pack("C*", 0342);
+ $test++;
+
+ }
+}
diff --git a/contrib/perl5/t/pragma/warn/1global b/contrib/perl5/t/pragma/warn/1global
new file mode 100644
index 0000000..0af8022
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/1global
@@ -0,0 +1,189 @@
+Check existing $^W functionality
+
+
+__END__
+
+# warnable code, warnings disabled
+$a =+ 3 ;
+EXPECT
+
+########
+-w
+# warnable code, warnings enabled via command line switch
+$a =+ 3 ;
+EXPECT
+Reversed += operator at - line 3.
+Name "main::a" used only once: possible typo at - line 3.
+########
+#! perl -w
+# warnable code, warnings enabled via #! line
+$a =+ 3 ;
+EXPECT
+Reversed += operator at - line 3.
+Name "main::a" used only once: possible typo at - line 3.
+########
+
+# warnable code, warnings enabled via compile time $^W
+BEGIN { $^W = 1 }
+$a =+ 3 ;
+EXPECT
+Reversed += operator at - line 4.
+Name "main::a" used only once: possible typo at - line 4.
+########
+
+# compile-time warnable code, warnings enabled via runtime $^W
+# so no warning printed.
+$^W = 1 ;
+$a =+ 3 ;
+EXPECT
+
+########
+
+# warnable code, warnings enabled via runtime $^W
+$^W = 1 ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 4.
+########
+
+# warnings enabled at compile time, disabled at run time
+BEGIN { $^W = 1 }
+$^W = 0 ;
+my $b ; chop $b ;
+EXPECT
+
+########
+
+# warnings disabled at compile time, enabled at run time
+BEGIN { $^W = 0 }
+$^W = 1 ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 5.
+########
+-w
+--FILE-- abcd
+my $b ; chop $b ;
+1 ;
+--FILE--
+require "./abcd";
+EXPECT
+Use of uninitialized value in scalar chop at ./abcd line 1.
+########
+
+--FILE-- abcd
+my $b ; chop $b ;
+1 ;
+--FILE--
+#! perl -w
+require "./abcd";
+EXPECT
+Use of uninitialized value in scalar chop at ./abcd line 1.
+########
+
+--FILE-- abcd
+my $b ; chop $b ;
+1 ;
+--FILE--
+$^W =1 ;
+require "./abcd";
+EXPECT
+Use of uninitialized value in scalar chop at ./abcd line 1.
+########
+
+--FILE-- abcd
+$^W = 0;
+my $b ; chop $b ;
+1 ;
+--FILE--
+$^W =1 ;
+require "./abcd";
+EXPECT
+
+########
+
+--FILE-- abcd
+$^W = 1;
+1 ;
+--FILE--
+$^W =0 ;
+require "./abcd";
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 3.
+########
+
+$^W = 1;
+eval 'my $b ; chop $b ;' ;
+print $@ ;
+EXPECT
+Use of uninitialized value in scalar chop at (eval 1) line 1.
+########
+
+eval '$^W = 1;' ;
+print $@ ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 4.
+########
+
+eval {$^W = 1;} ;
+print $@ ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 4.
+########
+
+{
+ local ($^W) = 1;
+}
+my $b ; chop $b ;
+EXPECT
+
+########
+
+my $a ; chop $a ;
+{
+ local ($^W) = 1;
+ my $b ; chop $b ;
+}
+my $c ; chop $c ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 5.
+########
+-w
+-e undef
+EXPECT
+Use of uninitialized value in -e at - line 2.
+########
+
+$^W = 1 + 2 ;
+EXPECT
+
+########
+
+$^W = $a ;
+EXPECT
+
+########
+
+sub fred {}
+$^W = fred() ;
+EXPECT
+
+########
+
+sub fred { my $b ; chop $b ;}
+{ local $^W = 0 ;
+ fred() ;
+}
+EXPECT
+
+########
+
+sub fred { my $b ; chop $b ;}
+{ local $^W = 1 ;
+ fred() ;
+}
+EXPECT
+Use of uninitialized value in scalar chop at - line 2.
diff --git a/contrib/perl5/t/pragma/warn/2use b/contrib/perl5/t/pragma/warn/2use
new file mode 100644
index 0000000..60a60c3
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/2use
@@ -0,0 +1,308 @@
+Check lexical warnings functionality
+
+TODO
+ check that the warning hierarchy works.
+
+__END__
+
+# check illegal category is caught
+use warnings 'this-should-never-be-a-warning-category' ;
+EXPECT
+unknown warnings category 'this-should-never-be-a-warning-category' at - line 3
+BEGIN failed--compilation aborted at - line 3.
+########
+
+# Check compile time scope of pragma
+use warnings 'deprecated' ;
+{
+ no warnings ;
+ 1 if $a EQ $b ;
+}
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 8.
+########
+
+# Check compile time scope of pragma
+no warnings;
+{
+ use warnings 'deprecated' ;
+ 1 if $a EQ $b ;
+}
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 6.
+########
+
+# Check runtime scope of pragma
+use warnings 'uninitialized' ;
+{
+ no warnings ;
+ my $b ; chop $b ;
+}
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 8.
+########
+
+# Check runtime scope of pragma
+no warnings ;
+{
+ use warnings 'uninitialized' ;
+ my $b ; chop $b ;
+}
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check runtime scope of pragma
+no warnings ;
+{
+ use warnings 'uninitialized' ;
+ $a = sub { my $b ; chop $b ; }
+}
+&$a ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+use warnings 'deprecated' ;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 3.
+########
+
+--FILE-- abc
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings 'deprecated' ;
+require "./abc";
+EXPECT
+
+########
+
+--FILE-- abc
+use warnings 'deprecated' ;
+1;
+--FILE--
+require "./abc";
+1 if $a EQ $b ;
+EXPECT
+
+########
+
+--FILE-- abc
+use warnings 'deprecated' ;
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings 'uninitialized' ;
+require "./abc";
+my $a ; chop $a ;
+EXPECT
+Use of EQ is deprecated at ./abc line 2.
+Use of uninitialized value in scalar chop at - line 3.
+########
+
+--FILE-- abc.pm
+use warnings 'deprecated' ;
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings 'uninitialized' ;
+use abc;
+my $a ; chop $a ;
+EXPECT
+Use of EQ is deprecated at abc.pm line 2.
+Use of uninitialized value in scalar chop at - line 3.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval {
+ my $b ; chop $b ;
+}; print STDERR $@ ;
+my $b ; chop $b ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval {
+ use warnings 'uninitialized' ;
+ my $b ; chop $b ;
+}; print STDERR $@ ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check scope of pragma with eval
+use warnings 'uninitialized' ;
+eval {
+ my $b ; chop $b ;
+}; print STDERR $@ ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 5.
+Use of uninitialized value in scalar chop at - line 7.
+########
+
+# Check scope of pragma with eval
+use warnings 'uninitialized' ;
+eval {
+ no warnings ;
+ my $b ; chop $b ;
+}; print STDERR $@ ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 8.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval {
+ 1 if $a EQ $b ;
+}; print STDERR $@ ;
+1 if $a EQ $b ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval {
+ use warnings 'deprecated' ;
+ 1 if $a EQ $b ;
+}; print STDERR $@ ;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 6.
+########
+
+# Check scope of pragma with eval
+use warnings 'deprecated' ;
+eval {
+ 1 if $a EQ $b ;
+}; print STDERR $@ ;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 5.
+Use of EQ is deprecated at - line 7.
+########
+
+# Check scope of pragma with eval
+use warnings 'deprecated' ;
+eval {
+ no warnings ;
+ 1 if $a EQ $b ;
+}; print STDERR $@ ;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 8.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval '
+ my $b ; chop $b ;
+'; print STDERR $@ ;
+my $b ; chop $b ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval q[
+ use warnings 'uninitialized' ;
+ my $b ; chop $b ;
+]; print STDERR $@;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at (eval 1) line 3.
+########
+
+# Check scope of pragma with eval
+use warnings 'uninitialized' ;
+eval '
+ my $b ; chop $b ;
+'; print STDERR $@ ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at (eval 1) line 2.
+Use of uninitialized value in scalar chop at - line 7.
+########
+
+# Check scope of pragma with eval
+use warnings 'uninitialized' ;
+eval '
+ no warnings ;
+ my $b ; chop $b ;
+'; print STDERR $@ ;
+my $b ; chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 8.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval '
+ 1 if $a EQ $b ;
+'; print STDERR $@ ;
+1 if $a EQ $b ;
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval q[
+ use warnings 'deprecated' ;
+ 1 if $a EQ $b ;
+]; print STDERR $@;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at (eval 1) line 3.
+########
+
+# Check scope of pragma with eval
+use warnings 'deprecated' ;
+eval '
+ 1 if $a EQ $b ;
+'; print STDERR $@;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 7.
+Use of EQ is deprecated at (eval 1) line 2.
+########
+
+# Check scope of pragma with eval
+use warnings 'deprecated' ;
+eval '
+ no warnings ;
+ 1 if $a EQ $b ;
+'; print STDERR $@;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 8.
+########
+
+# Check the additive nature of the pragma
+1 if $a EQ $b ;
+my $a ; chop $a ;
+use warnings 'deprecated' ;
+1 if $a EQ $b ;
+my $b ; chop $b ;
+use warnings 'uninitialized' ;
+my $c ; chop $c ;
+no warnings 'deprecated' ;
+1 if $a EQ $b ;
+EXPECT
+Use of EQ is deprecated at - line 6.
+Use of uninitialized value in scalar chop at - line 9.
+Use of uninitialized value in string eq at - line 11.
+Use of uninitialized value in string eq at - line 11.
diff --git a/contrib/perl5/t/pragma/warn/3both b/contrib/perl5/t/pragma/warn/3both
new file mode 100644
index 0000000..132b99b
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/3both
@@ -0,0 +1,197 @@
+Check interaction of $^W and lexical
+
+__END__
+
+# Check interaction of $^W and use warnings
+sub fred {
+ use warnings ;
+ my $b ;
+ chop $b ;
+}
+{ local $^W = 0 ;
+ fred() ;
+}
+
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check interaction of $^W and use warnings
+sub fred {
+ use warnings ;
+ my $b ;
+ chop $b ;
+}
+{ $^W = 0 ;
+ fred() ;
+}
+
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check interaction of $^W and use warnings
+sub fred {
+ no warnings ;
+ my $b ;
+ chop $b ;
+}
+{ local $^W = 1 ;
+ fred() ;
+}
+
+EXPECT
+
+########
+
+# Check interaction of $^W and use warnings
+sub fred {
+ no warnings ;
+ my $b ;
+ chop $b ;
+}
+{ $^W = 1 ;
+ fred() ;
+}
+
+EXPECT
+
+########
+
+# Check interaction of $^W and use warnings
+use warnings ;
+$^W = 1 ;
+my $b ;
+chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check interaction of $^W and use warnings
+$^W = 1 ;
+use warnings ;
+my $b ;
+chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check interaction of $^W and use warnings
+$^W = 1 ;
+no warnings ;
+my $b ;
+chop $b ;
+EXPECT
+
+########
+
+# Check interaction of $^W and use warnings
+no warnings ;
+$^W = 1 ;
+my $b ;
+chop $b ;
+EXPECT
+
+########
+-w
+# Check interaction of $^W and use warnings
+no warnings ;
+my $b ;
+chop $b ;
+EXPECT
+
+########
+-w
+# Check interaction of $^W and use warnings
+use warnings ;
+my $b ;
+chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 5.
+########
+
+# Check interaction of $^W and use warnings
+sub fred {
+ use warnings ;
+ my $b ;
+ chop $b ;
+}
+BEGIN { $^W = 0 }
+fred() ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check interaction of $^W and use warnings
+sub fred {
+ no warnings ;
+ my $b ;
+ chop $b ;
+}
+BEGIN { $^W = 1 }
+fred() ;
+
+EXPECT
+
+########
+
+# Check interaction of $^W and use warnings
+use warnings ;
+BEGIN { $^W = 1 }
+my $b ;
+chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check interaction of $^W and use warnings
+BEGIN { $^W = 1 }
+use warnings ;
+my $b ;
+chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+# Check interaction of $^W and use warnings
+BEGIN { $^W = 1 }
+no warnings ;
+my $b ;
+chop $b ;
+EXPECT
+
+########
+
+# Check interaction of $^W and use warnings
+no warnings ;
+BEGIN { $^W = 1 }
+my $b ;
+chop $b ;
+EXPECT
+
+########
+
+# Check interaction of $^W and use warnings
+BEGIN { $^W = 1 }
+{
+ no warnings ;
+ my $b ;
+ chop $b ;
+}
+my $b ;
+chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 10.
+########
+
+# Check interaction of $^W and use warnings
+BEGIN { $^W = 0 }
+{
+ use warnings ;
+ my $b ;
+ chop $b ;
+}
+my $b ;
+chop $b ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 7.
diff --git a/contrib/perl5/t/pragma/warn/4lint b/contrib/perl5/t/pragma/warn/4lint
new file mode 100644
index 0000000..db54f31
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/4lint
@@ -0,0 +1,112 @@
+Check lint
+
+__END__
+-W
+# lint: check compile time $^W is zapped
+BEGIN { $^W = 0 ;}
+$a = $b = 1 ;
+$a = 1 if $a EQ $b ;
+close STDIN ; print STDIN "abc" ;
+EXPECT
+Use of EQ is deprecated at - line 5.
+print() on closed filehandle main::STDIN at - line 6.
+########
+-W
+# lint: check runtime $^W is zapped
+$^W = 0 ;
+close STDIN ; print STDIN "abc" ;
+EXPECT
+print() on closed filehandle main::STDIN at - line 4.
+########
+-W
+# lint: check runtime $^W is zapped
+{
+ $^W = 0 ;
+ close STDIN ; print STDIN "abc" ;
+}
+EXPECT
+print() on closed filehandle main::STDIN at - line 5.
+########
+-W
+# lint: check "no warnings" is zapped
+no warnings ;
+$a = $b = 1 ;
+$a = 1 if $a EQ $b ;
+close STDIN ; print STDIN "abc" ;
+EXPECT
+Use of EQ is deprecated at - line 5.
+print() on closed filehandle main::STDIN at - line 6.
+########
+-W
+# lint: check "no warnings" is zapped
+{
+ no warnings ;
+ close STDIN ; print STDIN "abc" ;
+}
+EXPECT
+print() on closed filehandle main::STDIN at - line 5.
+########
+-Ww
+# lint: check combination of -w and -W
+{
+ $^W = 0 ;
+ close STDIN ; print STDIN "abc" ;
+}
+EXPECT
+print() on closed filehandle main::STDIN at - line 5.
+########
+-W
+--FILE-- abc.pm
+no warnings 'deprecated' ;
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+no warnings 'uninitialized' ;
+use abc;
+my $a ; chop $a ;
+EXPECT
+Use of EQ is deprecated at abc.pm line 3.
+Use of uninitialized value in scalar chop at - line 3.
+########
+-W
+--FILE-- abc
+no warnings 'deprecated' ;
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+no warnings 'uninitialized' ;
+require "./abc";
+my $a ; chop $a ;
+EXPECT
+Use of EQ is deprecated at ./abc line 3.
+Use of uninitialized value in scalar chop at - line 3.
+########
+-W
+--FILE-- abc.pm
+BEGIN {$^W = 0}
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+$^W = 0 ;
+use abc;
+my $a ; chop $a ;
+EXPECT
+Use of EQ is deprecated at abc.pm line 3.
+Use of uninitialized value in scalar chop at - line 3.
+########
+-W
+--FILE-- abc
+BEGIN {$^W = 0}
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+$^W = 0 ;
+require "./abc";
+my $a ; chop $a ;
+EXPECT
+Use of EQ is deprecated at ./abc line 3.
+Use of uninitialized value in scalar chop at - line 3.
diff --git a/contrib/perl5/t/pragma/warn/5nolint b/contrib/perl5/t/pragma/warn/5nolint
new file mode 100644
index 0000000..994190a
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/5nolint
@@ -0,0 +1,96 @@
+Check anti-lint
+
+__END__
+-X
+# nolint: check compile time $^W is zapped
+BEGIN { $^W = 1 ;}
+$a = $b = 1 ;
+$a = 1 if $a EQ $b ;
+close STDIN ; print STDIN "abc" ;
+EXPECT
+########
+-X
+# nolint: check runtime $^W is zapped
+$^W = 1 ;
+close STDIN ; print STDIN "abc" ;
+EXPECT
+########
+-X
+# nolint: check runtime $^W is zapped
+{
+ $^W = 1 ;
+ close STDIN ; print STDIN "abc" ;
+}
+EXPECT
+########
+-X
+# nolint: check "no warnings" is zapped
+use warnings ;
+$a = $b = 1 ;
+$a = 1 if $a EQ $b ;
+close STDIN ; print STDIN "abc" ;
+EXPECT
+########
+-X
+# nolint: check "no warnings" is zapped
+{
+ use warnings ;
+ close STDIN ; print STDIN "abc" ;
+}
+EXPECT
+########
+-Xw
+# nolint: check combination of -w and -X
+{
+ $^W = 1 ;
+ close STDIN ; print STDIN "abc" ;
+}
+EXPECT
+########
+-X
+--FILE-- abc.pm
+use warnings 'deprecated' ;
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings 'uninitialized' ;
+use abc;
+my $a ; chop $a ;
+EXPECT
+########
+-X
+--FILE-- abc
+use warnings 'deprecated' ;
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings 'uninitialized' ;
+require "./abc";
+my $a ; chop $a ;
+EXPECT
+########
+-X
+--FILE-- abc.pm
+BEGIN {$^W = 1}
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+$^W = 1 ;
+use abc;
+my $a ; chop $a ;
+EXPECT
+########
+-X
+--FILE-- abc
+BEGIN {$^W = 1}
+my ($a, $b) = (0,0);
+1 if $a EQ $b ;
+1;
+--FILE--
+$^W = 1 ;
+require "./abc";
+my $a ; chop $a ;
+EXPECT
diff --git a/contrib/perl5/t/pragma/warn/6default b/contrib/perl5/t/pragma/warn/6default
new file mode 100644
index 0000000..dd3d182
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/6default
@@ -0,0 +1,53 @@
+Check default warnings
+
+__END__
+# default warnings should be displayed if you don't add anything
+# optional shouldn't
+my $a = oct "7777777777777777777777777777777777779" ;
+EXPECT
+Integer overflow in octal number at - line 3.
+########
+# no warnings should be displayed
+no warnings ;
+my $a = oct "7777777777777777777777777777777777778" ;
+EXPECT
+########
+# all warnings should be displayed
+use warnings ;
+my $a = oct "7777777777777777777777777777777777778" ;
+EXPECT
+Integer overflow in octal number at - line 3.
+Illegal octal digit '8' ignored at - line 3.
+Octal number > 037777777777 non-portable at - line 3.
+########
+# check scope
+use warnings ;
+my $a = oct "7777777777777777777777777777777777778" ;
+{
+ no warnings ;
+ my $a = oct "7777777777777777777777777777777777778" ;
+}
+my $c = oct "7777777777777777777777777777777777778" ;
+EXPECT
+Integer overflow in octal number at - line 3.
+Illegal octal digit '8' ignored at - line 3.
+Octal number > 037777777777 non-portable at - line 3.
+Integer overflow in octal number at - line 8.
+Illegal octal digit '8' ignored at - line 8.
+Octal number > 037777777777 non-portable at - line 8.
+########
+# all warnings should be displayed
+use warnings ;
+my $a = oct "0xfffffffffffffffffg" ;
+EXPECT
+Integer overflow in hexadecimal number at - line 3.
+Illegal hexadecimal digit 'g' ignored at - line 3.
+Hexadecimal number > 0xffffffff non-portable at - line 3.
+########
+# all warnings should be displayed
+use warnings ;
+my $a = oct "0b111111111111111111111111111111111111111111111111111111111111111112";
+EXPECT
+Integer overflow in binary number at - line 3.
+Illegal binary digit '2' ignored at - line 3.
+Binary number > 0b11111111111111111111111111111111 non-portable at - line 3.
diff --git a/contrib/perl5/t/pragma/warn/7fatal b/contrib/perl5/t/pragma/warn/7fatal
new file mode 100644
index 0000000..943bb06f
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/7fatal
@@ -0,0 +1,242 @@
+Check FATAL functionality
+
+__END__
+
+# Check compile time warning
+use warnings FATAL => 'deprecated' ;
+{
+ no warnings ;
+ 1 if $a EQ $b ;
+}
+1 if $a EQ $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of EQ is deprecated at - line 8.
+########
+
+# Check runtime scope of pragma
+use warnings FATAL => 'uninitialized' ;
+{
+ no warnings ;
+ my $b ; chop $b ;
+}
+my $b ; chop $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 8.
+########
+
+# Check runtime scope of pragma
+no warnings ;
+{
+ use warnings FATAL => 'uninitialized' ;
+ $a = sub { my $b ; chop $b ; }
+}
+&$a ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 6.
+########
+
+--FILE-- abc
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings FATAL => 'deprecated' ;
+require "./abc";
+EXPECT
+
+########
+
+--FILE-- abc
+use warnings FATAL => 'deprecated' ;
+1;
+--FILE--
+require "./abc";
+1 if $a EQ $b ;
+EXPECT
+
+########
+
+--FILE-- abc
+use warnings 'deprecated' ;
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings FATAL => 'uninitialized' ;
+require "./abc";
+my $a ; chop $a ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of EQ is deprecated at ./abc line 2.
+Use of uninitialized value in scalar chop at - line 3.
+########
+
+--FILE-- abc.pm
+use warnings 'deprecated' ;
+1 if $a EQ $b ;
+1;
+--FILE--
+use warnings FATAL => 'uninitialized' ;
+use abc;
+my $a ; chop $a ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of EQ is deprecated at abc.pm line 2.
+Use of uninitialized value in scalar chop at - line 3.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval {
+ use warnings FATAL => 'uninitialized' ;
+ my $b ; chop $b ;
+}; print STDERR "-- $@" ;
+my $b ; chop $b ;
+print STDERR "The End.\n" ;
+EXPECT
+-- Use of uninitialized value in scalar chop at - line 6.
+The End.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'uninitialized' ;
+eval {
+ my $b ; chop $b ;
+}; print STDERR "-- $@" ;
+my $b ; chop $b ;
+print STDERR "The End.\n" ;
+EXPECT
+-- Use of uninitialized value in scalar chop at - line 5.
+Use of uninitialized value in scalar chop at - line 7.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'uninitialized' ;
+eval {
+ no warnings ;
+ my $b ; chop $b ;
+}; print STDERR $@ ;
+my $b ; chop $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 8.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval {
+ use warnings FATAL => 'deprecated' ;
+ 1 if $a EQ $b ;
+}; print STDERR "-- $@" ;
+1 if $a EQ $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of EQ is deprecated at - line 6.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'deprecated' ;
+eval {
+ 1 if $a EQ $b ;
+}; print STDERR "-- $@" ;
+1 if $a EQ $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of EQ is deprecated at - line 5.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'deprecated' ;
+eval {
+ no warnings ;
+ 1 if $a EQ $b ;
+}; print STDERR $@ ;
+1 if $a EQ $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of EQ is deprecated at - line 8.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval {
+ use warnings FATAL => 'deprecated' ;
+}; print STDERR $@ ;
+1 if $a EQ $b ;
+print STDERR "The End.\n" ;
+EXPECT
+The End.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval q[
+ use warnings FATAL => 'uninitialized' ;
+ my $b ; chop $b ;
+]; print STDERR "-- $@";
+my $b ; chop $b ;
+print STDERR "The End.\n" ;
+EXPECT
+-- Use of uninitialized value in scalar chop at (eval 1) line 3.
+The End.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'uninitialized' ;
+eval '
+ my $b ; chop $b ;
+'; print STDERR "-- $@" ;
+my $b ; chop $b ;
+print STDERR "The End.\n" ;
+EXPECT
+-- Use of uninitialized value in scalar chop at (eval 1) line 2.
+Use of uninitialized value in scalar chop at - line 7.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'uninitialized' ;
+eval '
+ no warnings ;
+ my $b ; chop $b ;
+'; print STDERR $@ ;
+my $b ; chop $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of uninitialized value in scalar chop at - line 8.
+########
+
+# Check scope of pragma with eval
+no warnings ;
+eval q[
+ use warnings FATAL => 'deprecated' ;
+ 1 if $a EQ $b ;
+]; print STDERR "-- $@";
+1 if $a EQ $b ;
+print STDERR "The End.\n" ;
+EXPECT
+-- Use of EQ is deprecated at (eval 1) line 3.
+The End.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'deprecated' ;
+eval '
+ 1 if $a EQ $b ;
+'; print STDERR "-- $@";
+print STDERR "The End.\n" ;
+EXPECT
+-- Use of EQ is deprecated at (eval 1) line 2.
+The End.
+########
+
+# Check scope of pragma with eval
+use warnings FATAL => 'deprecated' ;
+eval '
+ no warnings ;
+ 1 if $a EQ $b ;
+'; print STDERR "-- $@";
+1 if $a EQ $b ;
+print STDERR "The End.\n" ;
+EXPECT
+Use of EQ is deprecated at - line 8.
diff --git a/contrib/perl5/t/pragma/warn/8signal b/contrib/perl5/t/pragma/warn/8signal
new file mode 100644
index 0000000..d480f19
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/8signal
@@ -0,0 +1,18 @@
+Check interaction of __WARN__, __DIE__ & lexical Warnings
+
+TODO
+
+__END__
+# 8signal
+BEGIN { $| = 1; $SIG{__WARN__} = sub { print "WARN -- @_" } }
+BEGIN { $SIG{__DIE__} = sub { print "DIE -- @_" } }
+1 if 1 EQ 2 ;
+use warnings qw(deprecated) ;
+1 if 1 EQ 2 ;
+use warnings FATAL => qw(deprecated) ;
+1 if 1 EQ 2 ;
+print "The End.\n" ;
+EXPECT
+WARN -- Use of EQ is deprecated at - line 6.
+DIE -- Use of EQ is deprecated at - line 8.
+Use of EQ is deprecated at - line 8.
diff --git a/contrib/perl5/t/pragma/warn/9enabled b/contrib/perl5/t/pragma/warn/9enabled
new file mode 100755
index 0000000..7facf99
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/9enabled
@@ -0,0 +1,819 @@
+Check warnings::enabled & warnings::warn
+
+__END__
+
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+print "ok1\n" if ! warnings::enabled('all') ;
+print "ok2\n" if ! warnings::enabled("io") ;
+1;
+--FILE--
+no warnings;
+use abc ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+print "ok1\n" if !warnings::enabled('all') ;
+print "ok2\n" if warnings::enabled("syntax") ;
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'syntax' ;
+print "ok1\n" if warnings::enabled('io') ;
+print "ok2\n" if ! warnings::enabled("syntax") ;
+1;
+--FILE--
+use warnings 'io' ;
+use abc ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc
+no warnings ;
+print "ok1\n" if !warnings::enabled('all') ;
+print "ok2\n" if warnings::enabled("syntax") ;
+1;
+--FILE--
+use warnings 'syntax' ;
+require "abc" ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc
+use warnings 'syntax' ;
+print "ok1\n" if ! warnings::enabled('all') ;
+print "ok2\n" if ! warnings::enabled("syntax") ;
+print "ok3\n" if warnings::enabled("io") ;
+1;
+--FILE--
+use warnings 'io' ;
+require "abc" ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+sub check {
+ print "ok1\n" if !warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+sub check {
+ print "ok1\n" if ! warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if ! warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc
+package abc ;
+no warnings ;
+sub check {
+ print "ok1\n" if !warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+require "abc" ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc
+package abc ;
+use warnings 'io' ;
+sub check {
+ print "ok1\n" if ! warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if ! warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+require "abc" ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+print "ok1\n" if ! warnings::enabled('all') ;
+print "ok2\n" if ! warnings::enabled("io") ;
+1;
+--FILE-- def.pm
+no warnings;
+use abc ;
+1;
+--FILE--
+use warnings;
+use def ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+print "ok1\n" if ! warnings::enabled('all') ;
+print "ok2\n" if warnings::enabled("syntax") ;
+print "ok3\n" if !warnings::enabled("io") ;
+1;
+--FILE-- def.pm
+use warnings 'syntax' ;
+print "ok4\n" if !warnings::enabled('all') ;
+print "ok5\n" if warnings::enabled("io") ;
+use abc ;
+1;
+--FILE--
+use warnings 'io' ;
+use def ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+ok5
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+sub check {
+ print "ok1\n" if !warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+eval { abc::check() ; };
+print $@ ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+sub check {
+ print "ok1\n" if ! warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if ! warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+eval { abc::check() ; } ;
+print $@ ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc
+package abc ;
+no warnings ;
+sub check {
+ print "ok1\n" if !warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+require "abc" ;
+eval { abc::check() ; } ;
+print $@ ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc
+package abc ;
+use warnings 'io' ;
+sub check {
+ print "ok1\n" if !warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+require "abc" ;
+eval { use warnings 'io' ; abc::check() ; };
+abc::check() ;
+print $@ ;
+EXPECT
+ok1
+ok2
+ok3
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+sub check {
+ print "ok1\n" if ! warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if ! warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+sub fred { abc::check() }
+fred() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+sub check {
+ print "ok1\n" if ! warnings::enabled('all') ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+sub fred { no warnings ; abc::check() }
+fred() ;
+EXPECT
+ok1
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'misc' ;
+sub check {
+ print "ok1\n" if ! warnings::enabled('all') ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if warnings::enabled("io") ;
+ print "ok4\n" if ! warnings::enabled("misc") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+sub fred { use warnings 'io' ; abc::check() }
+fred() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+########
+
+# check warnings::warn
+use warnings ;
+eval { warnings::warn() } ;
+print $@ ;
+eval { warnings::warn("fred", "joe") } ;
+print $@ ;
+EXPECT
+Usage: warnings::warn([category,] 'message') at - line 4
+unknown warnings category 'fred' at - line 6
+ require 0 called at - line 6
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'misc' ;
+sub check { warnings::warn("io", "hello") }
+1;
+--FILE--
+use warnings "io" ;
+use abc;
+abc::check() ;
+EXPECT
+hello at - line 3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'misc' ;
+sub check { warnings::warn("misc", "hello") }
+1;
+--FILE--
+use warnings "io" ;
+use abc;
+abc::check() ;
+EXPECT
+hello at - line 3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'misc' ;
+sub check { warnings::warn("io", "hello") }
+1;
+--FILE--
+use warnings qw( FATAL deprecated ) ;
+use abc;
+eval { abc::check() ; } ;
+print "[[$@]]\n";
+EXPECT
+hello at - line 3
+[[]]
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'misc' ;
+sub check { warnings::warn("io", "hello") }
+1;
+--FILE--
+use warnings qw( FATAL io ) ;
+use abc;
+eval { abc::check() ; } ;
+print "[[$@]]\n";
+EXPECT
+[[hello at - line 3
+]]
+########
+-W
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+print "ok1\n" if warnings::enabled("io") ;
+print "ok2\n" if warnings::enabled("all") ;
+1;
+--FILE--
+no warnings;
+use abc ;
+EXPECT
+ok1
+ok2
+########
+-X
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+print "ok1\n" if !warnings::enabled("io") ;
+print "ok2\n" if !warnings::enabled("all") ;
+1;
+--FILE--
+use warnings;
+use abc ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+sub check {
+ print "ok\n" if ! warnings::enabled() ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+package 'abc' not registered for warnings at - line 3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if warnings::enabled ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if !warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+use warnings 'abc' ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if !warnings::enabled ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if !warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if warnings::enabled ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+use warnings 'abc' ;
+eval { abc::check() ; };
+print $@ ;
+EXPECT
+ok1
+ok2
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if !warnings::enabled ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if !warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+eval { abc::check() ; } ;
+print $@ ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if warnings::enabled ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if !warnings::enabled("io") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+use warnings 'abc' ;
+sub fred { abc::check() }
+fred() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'io' ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if ! warnings::enabled ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+sub fred { no warnings ; abc::check() }
+fred() ;
+EXPECT
+ok1
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'misc' ;
+use warnings::register;
+sub check {
+ print "ok1\n" if warnings::enabled ;
+ print "ok2\n" if warnings::enabled("syntax") ;
+ print "ok3\n" if warnings::enabled("io") ;
+ print "ok4\n" if ! warnings::enabled("misc") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+use warnings 'abc' ;
+sub fred { use warnings 'io' ; abc::check() }
+fred() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings 'misc' ;
+use warnings::register;
+sub check { warnings::warn("hello") }
+1;
+--FILE--
+use abc;
+use warnings "abc" ;
+abc::check() ;
+EXPECT
+hello at - line 3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings::register;
+sub check { warnings::warn("hello") }
+1;
+--FILE--
+use abc;
+abc::check() ;
+EXPECT
+hello at - line 2
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings::register ;
+sub check { warnings::warn("hello") }
+1;
+--FILE--
+use abc;
+use warnings qw( FATAL deprecated ) ;
+eval { abc::check() ; } ;
+print "[[$@]]\n";
+EXPECT
+hello at - line 3
+[[]]
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings::register ;
+sub check { warnings::warn("hello") }
+1;
+--FILE--
+use abc;
+use warnings qw( FATAL abc ) ;
+eval { abc::check() ; } ;
+print "[[$@]]\n";
+EXPECT
+[[hello at - line 3
+]]
+########
+-W
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if warnings::enabled() ;
+ print "ok2\n" if warnings::enabled("io") ;
+ print "ok3\n" if warnings::enabled("all") ;
+}
+1;
+--FILE--
+no warnings;
+use abc ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+-X
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if !warnings::enabled() ;
+ print "ok2\n" if !warnings::enabled("io") ;
+ print "ok3\n" if !warnings::enabled("all") ;
+}
+1;
+--FILE--
+no warnings;
+use abc ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if warnings::enabled() ;
+ print "ok2\n" if warnings::enabled("io") ;
+ print "ok3\n" if warnings::enabled("all") ;
+}
+1;
+--FILE--
+use warnings 'all';
+use abc ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if !warnings::enabled() ;
+ print "ok2\n" if !warnings::enabled("io") ;
+ print "ok3\n" if !warnings::enabled("all") ;
+}
+1;
+--FILE--
+use abc ;
+no warnings ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+use warnings::register ;
+sub check {
+ print "ok1\n" if !warnings::enabled() ;
+ print "ok2\n" if !warnings::enabled("io") ;
+ print "ok3\n" if !warnings::enabled("all") ;
+}
+1;
+--FILE--
+use abc ;
+use warnings 'abc';
+no warnings ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+package abc ;
+use warnings "io" ;
+use warnings::register ;
+sub check {
+ print "abc self" . (warnings::enabled() ? "" : " not") . " enabled\n" ;
+ print "abc def" . (warnings::enabled('def') ? "" : " not") . " enabled\n" ;
+ print "abc all" . (warnings::enabled('all') ? "" : " not") . " enabled\n" ;
+}
+1;
+--FILE-- def.pm
+package def ;
+use warnings "io" ;
+use warnings::register ;
+sub check {
+ print "def self" . (warnings::enabled() ? "" : " not") . " enabled\n" ;
+ print "def abc" . (warnings::enabled('abc') ? "" : " not") . " enabled\n" ;
+ print "def all" . (warnings::enabled('all') ? "" : " not") . " enabled\n" ;
+}
+1;
+--FILE--
+use abc ;
+use def ;
+use warnings 'abc';
+abc::check() ;
+def::check() ;
+no warnings 'abc' ;
+use warnings 'def' ;
+abc::check() ;
+def::check() ;
+use warnings 'abc' ;
+use warnings 'def' ;
+abc::check() ;
+def::check() ;
+no warnings 'abc' ;
+no warnings 'def' ;
+abc::check() ;
+def::check() ;
+use warnings;
+abc::check() ;
+def::check() ;
+no warnings 'abc' ;
+abc::check() ;
+def::check() ;
+EXPECT
+abc self enabled
+abc def not enabled
+abc all not enabled
+def self not enabled
+def abc enabled
+def all not enabled
+abc self not enabled
+abc def enabled
+abc all not enabled
+def self enabled
+def abc not enabled
+def all not enabled
+abc self enabled
+abc def enabled
+abc all not enabled
+def self enabled
+def abc enabled
+def all not enabled
+abc self not enabled
+abc def not enabled
+abc all not enabled
+def self not enabled
+def abc not enabled
+def all not enabled
+abc self enabled
+abc def enabled
+abc all enabled
+def self enabled
+def abc enabled
+def all enabled
+abc self not enabled
+abc def enabled
+abc all not enabled
+def self enabled
+def abc not enabled
+def all not enabled
diff --git a/contrib/perl5/t/pragma/warn/av b/contrib/perl5/t/pragma/warn/av
new file mode 100644
index 0000000..79bd3b76
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/av
@@ -0,0 +1,9 @@
+ av.c
+
+ Mandatory Warnings ALL TODO
+ ------------------
+ av_reify called on tied array [av_reify]
+
+ Attempt to clear deleted array [av_clear]
+
+__END__
diff --git a/contrib/perl5/t/pragma/warn/doio b/contrib/perl5/t/pragma/warn/doio
new file mode 100644
index 0000000..bd40972
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/doio
@@ -0,0 +1,191 @@
+ doio.c
+
+ Can't open bidirectional pipe [Perl_do_open9]
+ open(F, "| true |");
+
+ Missing command in piped open [Perl_do_open9]
+ open(F, "| ");
+
+ Missing command in piped open [Perl_do_open9]
+ open(F, " |");
+
+ warn(warn_nl, "open"); [Perl_do_open9]
+ open(F, "true\ncd")
+
+ Close on unopened file <%s> [Perl_do_close] <<TODO
+ $a = "fred";close("$a")
+
+ tell() on unopened file [Perl_do_tell]
+ $a = "fred";$a = tell($a)
+
+ seek() on unopened file [Perl_do_seek]
+ $a = "fred";$a = seek($a,1,1)
+
+ sysseek() on unopened file [Perl_do_sysseek]
+ $a = "fred";$a = seek($a,1,1)
+
+ warn(warn_uninit); [Perl_do_print]
+ print $a ;
+
+ Stat on unopened file <%s> [Perl_my_stat]
+ close STDIN ; -x STDIN ;
+
+ warn(warn_nl, "stat"); [Perl_my_stat]
+ stat "ab\ncd"
+
+ warn(warn_nl, "lstat"); [Perl_my_lstat]
+ lstat "ab\ncd"
+
+ Can't exec \"%s\": %s [Perl_do_aexec5]
+
+ Can't exec \"%s\": %s [Perl_do_exec3]
+
+ Filehandle %s opened only for output [Perl_do_eof]
+ my $a = eof STDOUT
+
+ Mandatory Warnings ALL TODO
+ ------------------
+ Can't do inplace edit: %s is not a regular file [Perl_nextargv]
+ edit a directory
+
+ Can't do inplace edit: %s would not be unique [Perl_nextargv]
+ Can't rename %s to %s: %s, skipping file [Perl_nextargv]
+ Can't rename %s to %s: %s, skipping file [Perl_nextargv]
+ Can't remove %s: %s, skipping file [Perl_nextargv]
+ Can't do inplace edit on %s: %s [Perl_nextargv]
+
+
+__END__
+# doio.c [Perl_do_open9]
+use warnings 'io' ;
+open(F, '|'.($^O eq 'VMS' ? 'mcr ':'')."$^X -e 1|");
+close(F);
+no warnings 'io' ;
+open(G, '|'.($^O eq 'VMS' ? 'mcr ':'')."$^X -e 1|");
+close(G);
+EXPECT
+Can't open bidirectional pipe at - line 3.
+########
+# doio.c [Perl_do_open9]
+use warnings 'io' ;
+open(F, "| ");
+no warnings 'io' ;
+open(G, "| ");
+EXPECT
+Missing command in piped open at - line 3.
+########
+# doio.c [Perl_do_open9]
+use warnings 'io' ;
+open(F, " |");
+no warnings 'io' ;
+open(G, " |");
+EXPECT
+Missing command in piped open at - line 3.
+########
+# doio.c [Perl_do_open9]
+use warnings 'io' ;
+open(F, "<true\ncd");
+no warnings 'io' ;
+open(G, "<true\ncd");
+EXPECT
+Unsuccessful open on filename containing newline at - line 3.
+########
+# doio.c [Perl_do_close] <<TODO
+use warnings 'unopened' ;
+close "fred" ;
+no warnings 'unopened' ;
+close "joe" ;
+EXPECT
+Close on unopened file <fred> at - line 3.
+########
+# doio.c [Perl_do_tell Perl_do_seek Perl_do_sysseek Perl_my_stat]
+use warnings 'io' ;
+close STDIN ;
+tell(STDIN);
+$a = seek(STDIN,1,1);
+$a = sysseek(STDIN,1,1);
+-x STDIN ;
+no warnings 'io' ;
+close STDIN ;
+tell(STDIN);
+$a = seek(STDIN,1,1);
+$a = sysseek(STDIN,1,1);
+-x STDIN ;
+EXPECT
+tell() on unopened file at - line 4.
+seek() on unopened file at - line 5.
+sysseek() on unopened file at - line 6.
+Stat on unopened file <STDIN> at - line 7.
+########
+# doio.c [Perl_do_print]
+use warnings 'uninitialized' ;
+print $a ;
+no warnings 'uninitialized' ;
+print $b ;
+EXPECT
+Use of uninitialized value in print at - line 3.
+########
+# doio.c [Perl_my_stat Perl_my_lstat]
+use warnings 'io' ;
+stat "ab\ncd";
+lstat "ab\ncd";
+no warnings 'io' ;
+stat "ab\ncd";
+lstat "ab\ncd";
+EXPECT
+Unsuccessful stat on filename containing newline at - line 3.
+Unsuccessful stat on filename containing newline at - line 4.
+########
+# doio.c [Perl_do_aexec5]
+use warnings 'io' ;
+exec "lskdjfalksdjfdjfkls","" ;
+no warnings 'io' ;
+exec "lskdjfalksdjfdjfkls","" ;
+EXPECT
+OPTION regex
+Can't exec "lskdjfalksdjfdjfkls": .+
+########
+# doio.c [Perl_do_exec3]
+use warnings 'io' ;
+exec "lskdjfalksdjfdjfkls", "abc" ;
+no warnings 'io' ;
+exec "lskdjfalksdjfdjfkls", "abc" ;
+EXPECT
+OPTION regex
+Can't exec "lskdjfalksdjfdjfkls(:? abc)?": .+
+########
+# doio.c [Perl_nextargv]
+$^W = 0 ;
+my $filename = "./temp.dir" ;
+mkdir $filename, 0777
+ or die "Cannot create directory $filename: $!\n" ;
+{
+ local (@ARGV) = ($filename) ;
+ local ($^I) = "" ;
+ my $x = <> ;
+}
+{
+ no warnings 'inplace' ;
+ local (@ARGV) = ($filename) ;
+ local ($^I) = "" ;
+ my $x = <> ;
+}
+{
+ use warnings 'inplace' ;
+ local (@ARGV) = ($filename) ;
+ local ($^I) = "" ;
+ my $x = <> ;
+}
+rmdir $filename ;
+EXPECT
+Can't do inplace edit: ./temp.dir is not a regular file at - line 9.
+Can't do inplace edit: ./temp.dir is not a regular file at - line 21.
+
+########
+# doio.c [Perl_do_eof]
+use warnings 'io' ;
+my $a = eof STDOUT ;
+no warnings 'io' ;
+$a = eof STDOUT ;
+EXPECT
+Filehandle main::STDOUT opened only for output at - line 3.
diff --git a/contrib/perl5/t/pragma/warn/doop b/contrib/perl5/t/pragma/warn/doop
new file mode 100644
index 0000000..5803b44
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/doop
@@ -0,0 +1,6 @@
+# doop.c
+use utf8 ;
+$_ = "\x80 \xff" ;
+chop ;
+EXPECT
+########
diff --git a/contrib/perl5/t/pragma/warn/gv b/contrib/perl5/t/pragma/warn/gv
new file mode 100644
index 0000000..5ed4eca
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/gv
@@ -0,0 +1,54 @@
+ gv.c AOK
+
+ Can't locate package %s for @%s::ISA
+ @ISA = qw(Fred); joe()
+
+ Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated
+ sub Other::AUTOLOAD { 1 } sub Other::fred {}
+ @ISA = qw(Other) ;
+ fred() ;
+
+ Use of $# is deprecated
+ Use of $* is deprecated
+
+ $a = ${"#"} ;
+ $a = ${"*"} ;
+
+ Mandatory Warnings ALL TODO
+ ------------------
+
+ Had to create %s unexpectedly [gv_fetchpv]
+ Attempt to free unreferenced glob pointers [gp_free]
+
+__END__
+# gv.c
+use warnings 'misc' ;
+@ISA = qw(Fred); joe()
+EXPECT
+Can't locate package Fred for @main::ISA at - line 3.
+Undefined subroutine &main::joe called at - line 3.
+########
+# gv.c
+no warnings 'misc' ;
+@ISA = qw(Fred); joe()
+EXPECT
+Undefined subroutine &main::joe called at - line 3.
+########
+# gv.c
+sub Other::AUTOLOAD { 1 } sub Other::fred {}
+@ISA = qw(Other) ;
+use warnings 'deprecated' ;
+fred() ;
+EXPECT
+Use of inherited AUTOLOAD for non-method main::fred() is deprecated at - line 5.
+########
+# gv.c
+use warnings 'deprecated' ;
+$a = ${"#"};
+$a = ${"*"};
+no warnings 'deprecated' ;
+$a = ${"#"};
+$a = ${"*"};
+EXPECT
+Use of $# is deprecated at - line 3.
+Use of $* is deprecated at - line 4.
diff --git a/contrib/perl5/t/pragma/warn/hv b/contrib/perl5/t/pragma/warn/hv
new file mode 100644
index 0000000..c9eec02
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/hv
@@ -0,0 +1,8 @@
+ hv.c
+
+
+ Mandatory Warnings ALL TODO
+ ------------------
+ Attempt to free non-existent shared string [unsharepvn]
+
+__END__
diff --git a/contrib/perl5/t/pragma/warn/malloc b/contrib/perl5/t/pragma/warn/malloc
new file mode 100644
index 0000000..2f8b096
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/malloc
@@ -0,0 +1,9 @@
+ malloc.c
+
+
+ Mandatory Warnings ALL TODO
+ ------------------
+ %s free() ignored [Perl_mfree]
+ %s", "Bad free() ignored [Perl_mfree]
+
+__END__
diff --git a/contrib/perl5/t/pragma/warn/mg b/contrib/perl5/t/pragma/warn/mg
new file mode 100644
index 0000000..a8f9dbc
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/mg
@@ -0,0 +1,44 @@
+ mg.c AOK
+
+ No such signal: SIG%s
+ $SIG{FRED} = sub {}
+
+ SIG%s handler \"%s\" not defined.
+ $SIG{"INT"} = "ok3"; kill "INT",$$;
+
+ Mandatory Warnings TODO
+ ------------------
+ Can't break at that line [magic_setdbline]
+
+__END__
+# mg.c
+use warnings 'signal' ;
+$SIG{FRED} = sub {};
+EXPECT
+No such signal: SIGFRED at - line 3.
+########
+# mg.c
+no warnings 'signal' ;
+$SIG{FRED} = sub {};
+EXPECT
+
+########
+# mg.c
+use warnings 'signal' ;
+if ($^O eq 'MSWin32' || $^O eq 'VMS') {
+ print "SKIPPED\n# $^O, can't kill() to raise()\n"; exit;
+}
+$|=1;
+$SIG{"INT"} = "fred"; kill "INT",$$;
+EXPECT
+SIGINT handler "fred" not defined.
+########
+# mg.c
+no warnings 'signal' ;
+if ($^O eq 'MSWin32' || $^O eq 'VMS') {
+ print "SKIPPED\n# win32, can't kill() to raise()\n"; exit;
+}
+$|=1;
+$SIG{"INT"} = "fred"; kill "INT",$$;
+EXPECT
+
diff --git a/contrib/perl5/t/pragma/warn/op b/contrib/perl5/t/pragma/warn/op
new file mode 100644
index 0000000..1a79b4a
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/op
@@ -0,0 +1,861 @@
+ op.c AOK
+
+ "my" variable %s masks earlier declaration in same scope
+ my $x;
+ my $x ;
+
+ Variable "%s" may be unavailable
+ sub x {
+ my $x;
+ sub y {
+ $x
+ }
+ }
+
+ Variable "%s" will not stay shared
+ sub x {
+ my $x;
+ sub y {
+ sub { $x }
+ }
+ }
+
+ Found = in conditional, should be ==
+ 1 if $a = 1 ;
+
+ Use of implicit split to @_ is deprecated
+ split ;
+
+ Use of implicit split to @_ is deprecated
+ $a = split ;
+
+ Useless use of time in void context
+ Useless use of a variable in void context
+ Useless use of a constant in void context
+ time ;
+ $a ;
+ "abc"
+
+ Applying %s to %s will act on scalar(%s)
+ my $a ; my @a = () ; my %a = () ; my $b = \@a ; my $c = \%a ;
+ @a =~ /abc/ ;
+ @a =~ s/a/b/ ;
+ @a =~ tr/a/b/ ;
+ @$b =~ /abc/ ;
+ @$b =~ s/a/b/ ;
+ @$b =~ tr/a/b/ ;
+ %a =~ /abc/ ;
+ %a =~ s/a/b/ ;
+ %a =~ tr/a/b/ ;
+ %$c =~ /abc/ ;
+ %$c =~ s/a/b/ ;
+ %$c =~ tr/a/b/ ;
+
+
+ Parentheses missing around "my" list at -e line 1.
+ my $a, $b = (1,2);
+
+ Parentheses missing around "local" list at -e line 1.
+ local $a, $b = (1,2);
+
+ Bareword found in conditional at -e line 1.
+ use warnings 'bareword'; my $x = print(ABC || 1);
+
+ Value of %s may be \"0\"; use \"defined\"
+ $x = 1 if $x = <FH> ;
+ $x = 1 while $x = <FH> ;
+
+ Subroutine fred redefined at -e line 1.
+ sub fred{1;} sub fred{1;}
+
+ Constant subroutine %s redefined
+ sub fred() {1;} sub fred() {1;}
+
+ Format FRED redefined at /tmp/x line 5.
+ format FRED =
+ .
+ format FRED =
+ .
+
+ Array @%s missing the @ in argument %d of %s()
+ push fred ;
+
+ Hash %%%s missing the %% in argument %d of %s()
+ keys joe ;
+
+ Statement unlikely to be reached
+ (Maybe you meant system() when you said exec()?
+ exec "true" ; my $a
+
+ defined(@array) is deprecated
+ (Maybe you should just omit the defined()?)
+ my @a ; defined @a ;
+ defined (@a = (1,2,3)) ;
+
+ defined(%hash) is deprecated
+ (Maybe you should just omit the defined()?)
+ my %h ; defined %h ;
+
+ /---/ should probably be written as "---"
+ join(/---/, @foo);
+
+ %s() called too early to check prototype [Perl_peep]
+ fred() ; sub fred ($$) {}
+
+
+ Mandatory Warnings
+ ------------------
+ Prototype mismatch: [cv_ckproto]
+ sub fred() ;
+ sub fred($) {}
+
+ %s never introduced [pad_leavemy] TODO
+ Runaway prototype [newSUB] TODO
+ oops: oopsAV [oopsAV] TODO
+ oops: oopsHV [oopsHV] TODO
+
+
+__END__
+# op.c
+use warnings 'misc' ;
+my $x ;
+my $x ;
+no warnings 'misc' ;
+my $x ;
+EXPECT
+"my" variable $x masks earlier declaration in same scope at - line 4.
+########
+# op.c
+use warnings 'closure' ;
+sub x {
+ my $x;
+ sub y {
+ $x
+ }
+ }
+EXPECT
+Variable "$x" will not stay shared at - line 7.
+########
+# op.c
+no warnings 'closure' ;
+sub x {
+ my $x;
+ sub y {
+ $x
+ }
+ }
+EXPECT
+
+########
+# op.c
+use warnings 'closure' ;
+sub x {
+ my $x;
+ sub y {
+ sub { $x }
+ }
+ }
+EXPECT
+Variable "$x" may be unavailable at - line 6.
+########
+# op.c
+no warnings 'closure' ;
+sub x {
+ my $x;
+ sub y {
+ sub { $x }
+ }
+ }
+EXPECT
+
+########
+# op.c
+use warnings 'syntax' ;
+1 if $a = 1 ;
+no warnings 'syntax' ;
+1 if $a = 1 ;
+EXPECT
+Found = in conditional, should be == at - line 3.
+########
+# op.c
+use warnings 'deprecated' ;
+split ;
+no warnings 'deprecated' ;
+split ;
+EXPECT
+Use of implicit split to @_ is deprecated at - line 3.
+########
+# op.c
+use warnings 'deprecated' ;
+$a = split ;
+no warnings 'deprecated' ;
+$a = split ;
+EXPECT
+Use of implicit split to @_ is deprecated at - line 3.
+########
+# op.c
+use warnings 'void' ; close STDIN ;
+1 x 3 ; # OP_REPEAT
+ # OP_GVSV
+wantarray ; # OP_WANTARRAY
+ # OP_GV
+ # OP_PADSV
+ # OP_PADAV
+ # OP_PADHV
+ # OP_PADANY
+ # OP_AV2ARYLEN
+ref ; # OP_REF
+\@a ; # OP_REFGEN
+\$a ; # OP_SREFGEN
+defined $a ; # OP_DEFINED
+hex $a ; # OP_HEX
+oct $a ; # OP_OCT
+length $a ; # OP_LENGTH
+substr $a,1 ; # OP_SUBSTR
+vec $a,1,2 ; # OP_VEC
+index $a,1,2 ; # OP_INDEX
+rindex $a,1,2 ; # OP_RINDEX
+sprintf $a ; # OP_SPRINTF
+$a[0] ; # OP_AELEM
+ # OP_AELEMFAST
+@a[0] ; # OP_ASLICE
+#values %a ; # OP_VALUES
+#keys %a ; # OP_KEYS
+$a{0} ; # OP_HELEM
+@a{0} ; # OP_HSLICE
+unpack "a", "a" ; # OP_UNPACK
+pack $a,"" ; # OP_PACK
+join "" ; # OP_JOIN
+(@a)[0,1] ; # OP_LSLICE
+ # OP_ANONLIST
+ # OP_ANONHASH
+sort(1,2) ; # OP_SORT
+reverse(1,2) ; # OP_REVERSE
+ # OP_RANGE
+ # OP_FLIP
+(1 ..2) ; # OP_FLOP
+caller ; # OP_CALLER
+fileno STDIN ; # OP_FILENO
+eof STDIN ; # OP_EOF
+tell STDIN ; # OP_TELL
+readlink 1; # OP_READLINK
+time ; # OP_TIME
+localtime ; # OP_LOCALTIME
+gmtime ; # OP_GMTIME
+eval { getgrnam 1 }; # OP_GGRNAM
+eval { getgrgid 1 }; # OP_GGRGID
+eval { getpwnam 1 }; # OP_GPWNAM
+eval { getpwuid 1 }; # OP_GPWUID
+EXPECT
+Useless use of repeat (x) in void context at - line 3.
+Useless use of wantarray in void context at - line 5.
+Useless use of reference-type operator in void context at - line 12.
+Useless use of reference constructor in void context at - line 13.
+Useless use of single ref constructor in void context at - line 14.
+Useless use of defined operator in void context at - line 15.
+Useless use of hex in void context at - line 16.
+Useless use of oct in void context at - line 17.
+Useless use of length in void context at - line 18.
+Useless use of substr in void context at - line 19.
+Useless use of vec in void context at - line 20.
+Useless use of index in void context at - line 21.
+Useless use of rindex in void context at - line 22.
+Useless use of sprintf in void context at - line 23.
+Useless use of array element in void context at - line 24.
+Useless use of array slice in void context at - line 26.
+Useless use of hash element in void context at - line 29.
+Useless use of hash slice in void context at - line 30.
+Useless use of unpack in void context at - line 31.
+Useless use of pack in void context at - line 32.
+Useless use of join in void context at - line 33.
+Useless use of list slice in void context at - line 34.
+Useless use of sort in void context at - line 37.
+Useless use of reverse in void context at - line 38.
+Useless use of range (or flop) in void context at - line 41.
+Useless use of caller in void context at - line 42.
+Useless use of fileno in void context at - line 43.
+Useless use of eof in void context at - line 44.
+Useless use of tell in void context at - line 45.
+Useless use of readlink in void context at - line 46.
+Useless use of time in void context at - line 47.
+Useless use of localtime in void context at - line 48.
+Useless use of gmtime in void context at - line 49.
+Useless use of getgrnam in void context at - line 50.
+Useless use of getgrgid in void context at - line 51.
+Useless use of getpwnam in void context at - line 52.
+Useless use of getpwuid in void context at - line 53.
+########
+# op.c
+no warnings 'void' ; close STDIN ;
+1 x 3 ; # OP_REPEAT
+ # OP_GVSV
+wantarray ; # OP_WANTARRAY
+ # OP_GV
+ # OP_PADSV
+ # OP_PADAV
+ # OP_PADHV
+ # OP_PADANY
+ # OP_AV2ARYLEN
+ref ; # OP_REF
+\@a ; # OP_REFGEN
+\$a ; # OP_SREFGEN
+defined $a ; # OP_DEFINED
+hex $a ; # OP_HEX
+oct $a ; # OP_OCT
+length $a ; # OP_LENGTH
+substr $a,1 ; # OP_SUBSTR
+vec $a,1,2 ; # OP_VEC
+index $a,1,2 ; # OP_INDEX
+rindex $a,1,2 ; # OP_RINDEX
+sprintf $a ; # OP_SPRINTF
+$a[0] ; # OP_AELEM
+ # OP_AELEMFAST
+@a[0] ; # OP_ASLICE
+#values %a ; # OP_VALUES
+#keys %a ; # OP_KEYS
+$a{0} ; # OP_HELEM
+@a{0} ; # OP_HSLICE
+unpack "a", "a" ; # OP_UNPACK
+pack $a,"" ; # OP_PACK
+join "" ; # OP_JOIN
+(@a)[0,1] ; # OP_LSLICE
+ # OP_ANONLIST
+ # OP_ANONHASH
+sort(1,2) ; # OP_SORT
+reverse(1,2) ; # OP_REVERSE
+ # OP_RANGE
+ # OP_FLIP
+(1 ..2) ; # OP_FLOP
+caller ; # OP_CALLER
+fileno STDIN ; # OP_FILENO
+eof STDIN ; # OP_EOF
+tell STDIN ; # OP_TELL
+readlink 1; # OP_READLINK
+time ; # OP_TIME
+localtime ; # OP_LOCALTIME
+gmtime ; # OP_GMTIME
+eval { getgrnam 1 }; # OP_GGRNAM
+eval { getgrgid 1 }; # OP_GGRGID
+eval { getpwnam 1 }; # OP_GPWNAM
+eval { getpwuid 1 }; # OP_GPWUID
+EXPECT
+########
+# op.c
+use warnings 'void' ;
+for (@{[0]}) { "$_" } # check warning isn't duplicated
+no warnings 'void' ;
+for (@{[0]}) { "$_" } # check warning isn't duplicated
+EXPECT
+Useless use of string in void context at - line 3.
+########
+# op.c
+use warnings 'void' ;
+use Config ;
+BEGIN {
+ if ( ! $Config{d_telldir}) {
+ print <<EOM ;
+SKIPPED
+# telldir not present
+EOM
+ exit
+ }
+}
+telldir 1 ; # OP_TELLDIR
+no warnings 'void' ;
+telldir 1 ; # OP_TELLDIR
+EXPECT
+Useless use of telldir in void context at - line 13.
+########
+# op.c
+use warnings 'void' ;
+use Config ;
+BEGIN {
+ if ( ! $Config{d_getppid}) {
+ print <<EOM ;
+SKIPPED
+# getppid not present
+EOM
+ exit
+ }
+}
+getppid ; # OP_GETPPID
+no warnings 'void' ;
+getppid ; # OP_GETPPID
+EXPECT
+Useless use of getppid in void context at - line 13.
+########
+# op.c
+use warnings 'void' ;
+use Config ;
+BEGIN {
+ if ( ! $Config{d_getpgrp}) {
+ print <<EOM ;
+SKIPPED
+# getpgrp not present
+EOM
+ exit
+ }
+}
+getpgrp ; # OP_GETPGRP
+no warnings 'void' ;
+getpgrp ; # OP_GETPGRP
+EXPECT
+Useless use of getpgrp in void context at - line 13.
+########
+# op.c
+use warnings 'void' ;
+use Config ;
+BEGIN {
+ if ( ! $Config{d_times}) {
+ print <<EOM ;
+SKIPPED
+# times not present
+EOM
+ exit
+ }
+}
+times ; # OP_TMS
+no warnings 'void' ;
+times ; # OP_TMS
+EXPECT
+Useless use of times in void context at - line 13.
+########
+# op.c
+use warnings 'void' ;
+use Config ;
+BEGIN {
+ if ( ! $Config{d_getprior} or $^O eq 'os2') { # Locks before fixpak22
+ print <<EOM ;
+SKIPPED
+# getpriority not present
+EOM
+ exit
+ }
+}
+getpriority 1,2; # OP_GETPRIORITY
+no warnings 'void' ;
+getpriority 1,2; # OP_GETPRIORITY
+EXPECT
+Useless use of getpriority in void context at - line 13.
+########
+# op.c
+use warnings 'void' ;
+use Config ;
+BEGIN {
+ if ( ! $Config{d_getlogin}) {
+ print <<EOM ;
+SKIPPED
+# getlogin not present
+EOM
+ exit
+ }
+}
+getlogin ; # OP_GETLOGIN
+no warnings 'void' ;
+getlogin ; # OP_GETLOGIN
+EXPECT
+Useless use of getlogin in void context at - line 13.
+########
+# op.c
+use warnings 'void' ;
+use Config ; BEGIN {
+if ( ! $Config{d_socket}) {
+ print <<EOM ;
+SKIPPED
+# getsockname not present
+# getpeername not present
+# gethostbyname not present
+# gethostbyaddr not present
+# gethostent not present
+# getnetbyname not present
+# getnetbyaddr not present
+# getnetent not present
+# getprotobyname not present
+# getprotobynumber not present
+# getprotoent not present
+# getservbyname not present
+# getservbyport not present
+# getservent not present
+EOM
+ exit
+} }
+getsockname STDIN ; # OP_GETSOCKNAME
+getpeername STDIN ; # OP_GETPEERNAME
+gethostbyname 1 ; # OP_GHBYNAME
+gethostbyaddr 1,2; # OP_GHBYADDR
+gethostent ; # OP_GHOSTENT
+getnetbyname 1 ; # OP_GNBYNAME
+getnetbyaddr 1,2 ; # OP_GNBYADDR
+getnetent ; # OP_GNETENT
+getprotobyname 1; # OP_GPBYNAME
+getprotobynumber 1; # OP_GPBYNUMBER
+getprotoent ; # OP_GPROTOENT
+getservbyname 1,2; # OP_GSBYNAME
+getservbyport 1,2; # OP_GSBYPORT
+getservent ; # OP_GSERVENT
+
+no warnings 'void' ;
+getsockname STDIN ; # OP_GETSOCKNAME
+getpeername STDIN ; # OP_GETPEERNAME
+gethostbyname 1 ; # OP_GHBYNAME
+gethostbyaddr 1,2; # OP_GHBYADDR
+gethostent ; # OP_GHOSTENT
+getnetbyname 1 ; # OP_GNBYNAME
+getnetbyaddr 1,2 ; # OP_GNBYADDR
+getnetent ; # OP_GNETENT
+getprotobyname 1; # OP_GPBYNAME
+getprotobynumber 1; # OP_GPBYNUMBER
+getprotoent ; # OP_GPROTOENT
+getservbyname 1,2; # OP_GSBYNAME
+getservbyport 1,2; # OP_GSBYPORT
+getservent ; # OP_GSERVENT
+INIT {
+ # some functions may not be there, so we exit without running
+ exit;
+}
+EXPECT
+Useless use of getsockname in void context at - line 24.
+Useless use of getpeername in void context at - line 25.
+Useless use of gethostbyname in void context at - line 26.
+Useless use of gethostbyaddr in void context at - line 27.
+Useless use of gethostent in void context at - line 28.
+Useless use of getnetbyname in void context at - line 29.
+Useless use of getnetbyaddr in void context at - line 30.
+Useless use of getnetent in void context at - line 31.
+Useless use of getprotobyname in void context at - line 32.
+Useless use of getprotobynumber in void context at - line 33.
+Useless use of getprotoent in void context at - line 34.
+Useless use of getservbyname in void context at - line 35.
+Useless use of getservbyport in void context at - line 36.
+Useless use of getservent in void context at - line 37.
+########
+# op.c
+use warnings 'void' ;
+*a ; # OP_RV2GV
+$a ; # OP_RV2SV
+@a ; # OP_RV2AV
+%a ; # OP_RV2HV
+no warnings 'void' ;
+*a ; # OP_RV2GV
+$a ; # OP_RV2SV
+@a ; # OP_RV2AV
+%a ; # OP_RV2HV
+EXPECT
+Useless use of a variable in void context at - line 3.
+Useless use of a variable in void context at - line 4.
+Useless use of a variable in void context at - line 5.
+Useless use of a variable in void context at - line 6.
+########
+# op.c
+use warnings 'void' ;
+"abc"; # OP_CONST
+7 ; # OP_CONST
+no warnings 'void' ;
+"abc"; # OP_CONST
+7 ; # OP_CONST
+EXPECT
+Useless use of a constant in void context at - line 3.
+Useless use of a constant in void context at - line 4.
+########
+# op.c
+BEGIN{ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3; } # known scalar leak
+use warnings 'misc' ;
+my $a ; my @a = () ; my %a = () ; my $b = \@a ; my $c = \%a ;
+@a =~ /abc/ ;
+@a =~ s/a/b/ ;
+@a =~ tr/a/b/ ;
+@$b =~ /abc/ ;
+@$b =~ s/a/b/ ;
+@$b =~ tr/a/b/ ;
+%a =~ /abc/ ;
+%a =~ s/a/b/ ;
+%a =~ tr/a/b/ ;
+%$c =~ /abc/ ;
+%$c =~ s/a/b/ ;
+%$c =~ tr/a/b/ ;
+{
+no warnings 'misc' ;
+my $a ; my @a = () ; my %a = () ; my $b = \@a ; my $c = \%a ;
+@a =~ /abc/ ;
+@a =~ s/a/b/ ;
+@a =~ tr/a/b/ ;
+@$b =~ /abc/ ;
+@$b =~ s/a/b/ ;
+@$b =~ tr/a/b/ ;
+%a =~ /abc/ ;
+%a =~ s/a/b/ ;
+%a =~ tr/a/b/ ;
+%$c =~ /abc/ ;
+%$c =~ s/a/b/ ;
+%$c =~ tr/a/b/ ;
+}
+EXPECT
+Applying pattern match (m//) to @array will act on scalar(@array) at - line 5.
+Applying substitution (s///) to @array will act on scalar(@array) at - line 6.
+Can't modify private array in substitution (s///) at - line 6, near "s/a/b/ ;"
+Applying transliteration (tr///) to @array will act on scalar(@array) at - line 7.
+Applying pattern match (m//) to @array will act on scalar(@array) at - line 8.
+Applying substitution (s///) to @array will act on scalar(@array) at - line 9.
+Applying transliteration (tr///) to @array will act on scalar(@array) at - line 10.
+Applying pattern match (m//) to %hash will act on scalar(%hash) at - line 11.
+Applying substitution (s///) to %hash will act on scalar(%hash) at - line 12.
+Applying transliteration (tr///) to %hash will act on scalar(%hash) at - line 13.
+Applying pattern match (m//) to %hash will act on scalar(%hash) at - line 14.
+Applying substitution (s///) to %hash will act on scalar(%hash) at - line 15.
+Applying transliteration (tr///) to %hash will act on scalar(%hash) at - line 16.
+BEGIN not safe after errors--compilation aborted at - line 18.
+########
+# op.c
+use warnings 'syntax' ;
+my $a, $b = (1,2);
+no warnings 'syntax' ;
+my $c, $d = (1,2);
+EXPECT
+Parentheses missing around "my" list at - line 3.
+########
+# op.c
+use warnings 'syntax' ;
+local $a, $b = (1,2);
+no warnings 'syntax' ;
+local $c, $d = (1,2);
+EXPECT
+Parentheses missing around "local" list at - line 3.
+########
+# op.c
+use warnings 'bareword' ;
+print (ABC || 1) ;
+no warnings 'bareword' ;
+print (ABC || 1) ;
+EXPECT
+Bareword found in conditional at - line 3.
+########
+--FILE-- abc
+
+--FILE--
+# op.c
+use warnings 'misc' ;
+open FH, "<abc" ;
+$x = 1 if $x = <FH> ;
+no warnings 'misc' ;
+$x = 1 if $x = <FH> ;
+EXPECT
+Value of <HANDLE> construct can be "0"; test with defined() at - line 4.
+########
+# op.c
+use warnings 'misc' ;
+opendir FH, "." ;
+$x = 1 if $x = readdir FH ;
+no warnings 'misc' ;
+$x = 1 if $x = readdir FH ;
+closedir FH ;
+EXPECT
+Value of readdir() operator can be "0"; test with defined() at - line 4.
+########
+# op.c
+use warnings 'misc' ;
+$x = 1 if $x = <*> ;
+no warnings 'misc' ;
+$x = 1 if $x = <*> ;
+EXPECT
+Value of glob construct can be "0"; test with defined() at - line 3.
+########
+# op.c
+use warnings 'misc' ;
+%a = (1,2,3,4) ;
+$x = 1 if $x = each %a ;
+no warnings 'misc' ;
+$x = 1 if $x = each %a ;
+EXPECT
+Value of each() operator can be "0"; test with defined() at - line 4.
+########
+# op.c
+use warnings 'misc' ;
+$x = 1 while $x = <*> and 0 ;
+no warnings 'misc' ;
+$x = 1 while $x = <*> and 0 ;
+EXPECT
+Value of glob construct can be "0"; test with defined() at - line 3.
+########
+# op.c
+use warnings 'misc' ;
+opendir FH, "." ;
+$x = 1 while $x = readdir FH and 0 ;
+no warnings 'misc' ;
+$x = 1 while $x = readdir FH and 0 ;
+closedir FH ;
+EXPECT
+Value of readdir() operator can be "0"; test with defined() at - line 4.
+########
+# op.c
+use warnings 'redefine' ;
+sub fred {}
+sub fred {}
+no warnings 'redefine' ;
+sub fred {}
+EXPECT
+Subroutine fred redefined at - line 4.
+########
+# op.c
+use warnings 'redefine' ;
+sub fred () { 1 }
+sub fred () { 1 }
+no warnings 'redefine' ;
+sub fred () { 1 }
+EXPECT
+Constant subroutine fred redefined at - line 4.
+########
+# op.c
+use warnings 'redefine' ;
+format FRED =
+.
+format FRED =
+.
+no warnings 'redefine' ;
+format FRED =
+.
+EXPECT
+Format FRED redefined at - line 5.
+########
+# op.c
+use warnings 'deprecated' ;
+push FRED;
+no warnings 'deprecated' ;
+push FRED;
+EXPECT
+Array @FRED missing the @ in argument 1 of push() at - line 3.
+########
+# op.c
+use warnings 'deprecated' ;
+@a = keys FRED ;
+no warnings 'deprecated' ;
+@a = keys FRED ;
+EXPECT
+Hash %FRED missing the % in argument 1 of keys() at - line 3.
+########
+# op.c
+use warnings 'syntax' ;
+exec "$^X -e 1" ;
+my $a
+EXPECT
+Statement unlikely to be reached at - line 4.
+ (Maybe you meant system() when you said exec()?)
+########
+# op.c
+use warnings 'deprecated' ;
+my @a; defined(@a);
+EXPECT
+defined(@array) is deprecated at - line 3.
+ (Maybe you should just omit the defined()?)
+########
+# op.c
+use warnings 'deprecated' ;
+defined(@a = (1,2,3));
+EXPECT
+defined(@array) is deprecated at - line 3.
+ (Maybe you should just omit the defined()?)
+########
+# op.c
+use warnings 'deprecated' ;
+my %h; defined(%h);
+EXPECT
+defined(%hash) is deprecated at - line 3.
+ (Maybe you should just omit the defined()?)
+########
+# op.c
+no warnings 'syntax' ;
+exec "$^X -e 1" ;
+my $a
+EXPECT
+
+########
+# op.c
+sub fred();
+sub fred($) {}
+EXPECT
+Prototype mismatch: sub main::fred () vs ($) at - line 3.
+########
+# op.c
+$^W = 0 ;
+sub fred() ;
+sub fred($) {}
+{
+ no warnings 'prototype' ;
+ sub Fred() ;
+ sub Fred($) {}
+ use warnings 'prototype' ;
+ sub freD() ;
+ sub freD($) {}
+}
+sub FRED() ;
+sub FRED($) {}
+EXPECT
+Prototype mismatch: sub main::fred () vs ($) at - line 4.
+Prototype mismatch: sub main::freD () vs ($) at - line 11.
+Prototype mismatch: sub main::FRED () vs ($) at - line 14.
+########
+# op.c
+use warnings 'syntax' ;
+join /---/, 'x', 'y', 'z';
+EXPECT
+/---/ should probably be written as "---" at - line 3.
+########
+# op.c [Perl_peep]
+use warnings 'prototype' ;
+fred() ;
+sub fred ($$) {}
+no warnings 'prototype' ;
+joe() ;
+sub joe ($$) {}
+EXPECT
+main::fred() called too early to check prototype at - line 3.
+########
+# op.c [Perl_newATTRSUB]
+--FILE-- abc.pm
+use warnings 'void' ;
+BEGIN { $| = 1; print "in begin\n"; }
+CHECK { print "in check\n"; }
+INIT { print "in init\n"; }
+END { print "in end\n"; }
+print "in mainline\n";
+1;
+--FILE--
+use abc;
+delete $INC{"abc.pm"};
+require abc;
+do "abc.pm";
+EXPECT
+in begin
+in mainline
+in check
+in init
+in begin
+Too late to run CHECK block at abc.pm line 3.
+Too late to run INIT block at abc.pm line 4.
+in mainline
+in begin
+Too late to run CHECK block at abc.pm line 3.
+Too late to run INIT block at abc.pm line 4.
+in mainline
+in end
+in end
+in end
+########
+# op.c [Perl_newATTRSUB]
+--FILE-- abc.pm
+no warnings 'void' ;
+BEGIN { $| = 1; print "in begin\n"; }
+CHECK { print "in check\n"; }
+INIT { print "in init\n"; }
+END { print "in end\n"; }
+print "in mainline\n";
+1;
+--FILE--
+require abc;
+do "abc.pm";
+EXPECT
+in begin
+in mainline
+in begin
+in mainline
+in end
+in end
diff --git a/contrib/perl5/t/pragma/warn/perl b/contrib/perl5/t/pragma/warn/perl
new file mode 100644
index 0000000..4580749
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/perl
@@ -0,0 +1,57 @@
+ perl.c AOK
+
+ gv_check(defstash)
+ Name \"%s::%s\" used only once: possible typo
+
+ Mandatory Warnings All TODO
+ ------------------
+ Recompile perl with -DDEBUGGING to use -D switch [moreswitches]
+ Unbalanced scopes: %ld more ENTERs than LEAVEs [perl_destruct]
+ Unbalanced saves: %ld more saves than restores [perl_destruct]
+ Unbalanced tmps: %ld more allocs than frees [perl_destruct]
+ Unbalanced context: %ld more PUSHes than POPs [perl_destruct]
+ Unbalanced string table refcount: (%d) for \"%s\" [perl_destruct]
+ Scalars leaked: %ld [perl_destruct]
+
+
+__END__
+# perl.c
+no warnings 'once' ;
+$x = 3 ;
+use warnings 'once' ;
+$z = 3 ;
+EXPECT
+Name "main::z" used only once: possible typo at - line 5.
+########
+-w
+# perl.c
+$x = 3 ;
+no warnings 'once' ;
+$z = 3
+EXPECT
+Name "main::x" used only once: possible typo at - line 3.
+########
+# perl.c
+BEGIN { $^W =1 ; }
+$x = 3 ;
+no warnings 'once' ;
+$z = 3
+EXPECT
+Name "main::x" used only once: possible typo at - line 3.
+########
+-W
+# perl.c
+no warnings 'once' ;
+$x = 3 ;
+use warnings 'once' ;
+$z = 3 ;
+EXPECT
+Name "main::x" used only once: possible typo at - line 4.
+Name "main::z" used only once: possible typo at - line 6.
+########
+-X
+# perl.c
+use warnings 'once' ;
+$x = 3 ;
+EXPECT
+
diff --git a/contrib/perl5/t/pragma/warn/perlio b/contrib/perl5/t/pragma/warn/perlio
new file mode 100644
index 0000000..18c0dfa
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/perlio
@@ -0,0 +1,10 @@
+ perlio.c
+
+
+ Mandatory Warnings ALL TODO
+ ------------------
+ Setting cnt to %d
+ Setting ptr %p > end+1 %p
+ Setting cnt to %d, ptr implies %d
+
+__END__
diff --git a/contrib/perl5/t/pragma/warn/perly b/contrib/perl5/t/pragma/warn/perly
new file mode 100644
index 0000000..afc5dcc
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/perly
@@ -0,0 +1,31 @@
+ perly.y AOK
+
+ dep() => deprecate("\"do\" to call subroutines")
+ Use of "do" to call subroutines is deprecated
+
+ sub fred {} do fred()
+ sub fred {} do fred(1)
+ sub fred {} $a = "fred" ; do $a()
+ sub fred {} $a = "fred" ; do $a(1)
+
+
+__END__
+# perly.y
+use warnings 'deprecated' ;
+sub fred {}
+do fred() ;
+do fred(1) ;
+$a = "fred" ;
+do $a() ;
+do $a(1) ;
+no warnings 'deprecated' ;
+do fred() ;
+do fred(1) ;
+$a = "fred" ;
+do $a() ;
+do $a(1) ;
+EXPECT
+Use of "do" to call subroutines is deprecated at - line 4.
+Use of "do" to call subroutines is deprecated at - line 5.
+Use of "do" to call subroutines is deprecated at - line 7.
+Use of "do" to call subroutines is deprecated at - line 8.
diff --git a/contrib/perl5/t/pragma/warn/pp b/contrib/perl5/t/pragma/warn/pp
new file mode 100644
index 0000000..8f42ba6
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/pp
@@ -0,0 +1,110 @@
+ pp.c TODO
+
+ substr outside of string
+ $a = "ab" ; $b = substr($a, 4,5) ;
+
+ Attempt to use reference as lvalue in substr
+ $a = "ab" ; $b = \$a ; substr($b, 1,1) = $b
+
+ uninitialized in pp_rv2gv()
+ my *b = *{ undef()}
+
+ uninitialized in pp_rv2sv()
+ my $a = undef ; my $b = $$a
+
+ Odd number of elements in hash list
+ my $a = { 1,2,3 } ;
+
+ Invalid type in unpack: '%c
+ my $A = pack ("A,A", 1,2) ;
+ my @A = unpack ("A,A", "22") ;
+
+ Attempt to pack pointer to temporary value
+ pack("p", "abc") ;
+
+ Explicit blessing to '' (assuming package main)
+ bless \[], "";
+
+ Constant subroutine %s undefined <<<TODO
+ Constant subroutine (anonymous) undefined <<<TODO
+
+__END__
+# pp.c
+use warnings 'substr' ;
+$a = "ab" ;
+$b = substr($a, 4,5) ;
+no warnings 'substr' ;
+$a = "ab" ;
+$b = substr($a, 4,5) ;
+EXPECT
+substr outside of string at - line 4.
+########
+# pp.c
+use warnings 'substr' ;
+$a = "ab" ;
+$b = \$a ;
+substr($b, 1,1) = "ab" ;
+no warnings 'substr' ;
+substr($b, 1,1) = "ab" ;
+EXPECT
+Attempt to use reference as lvalue in substr at - line 5.
+########
+# pp.c
+use warnings 'uninitialized' ;
+# TODO
+EXPECT
+
+########
+# pp.c
+use warnings 'misc' ;
+my $a = { 1,2,3};
+no warnings 'misc' ;
+my $b = { 1,2,3};
+EXPECT
+Odd number of elements in hash assignment at - line 3.
+########
+# pp.c
+use warnings 'pack' ;
+use warnings 'unpack' ;
+my @a = unpack ("A,A", "22") ;
+my $a = pack ("A,A", 1,2) ;
+no warnings 'pack' ;
+no warnings 'unpack' ;
+my @b = unpack ("A,A", "22") ;
+my $b = pack ("A,A", 1,2) ;
+EXPECT
+Invalid type in unpack: ',' at - line 4.
+Invalid type in pack: ',' at - line 5.
+########
+# pp.c
+use warnings 'uninitialized' ;
+my $a = undef ;
+my $b = $$a;
+no warnings 'uninitialized' ;
+my $c = $$a;
+EXPECT
+Use of uninitialized value in scalar dereference at - line 4.
+########
+# pp.c
+use warnings 'pack' ;
+sub foo { my $a = "a"; return $a . $a++ . $a++ }
+my $a = pack("p", &foo) ;
+no warnings 'pack' ;
+my $b = pack("p", &foo) ;
+EXPECT
+Attempt to pack pointer to temporary value at - line 4.
+########
+# pp.c
+use warnings 'misc' ;
+bless \[], "" ;
+no warnings 'misc' ;
+bless \[], "" ;
+EXPECT
+Explicit blessing to '' (assuming package main) at - line 3.
+########
+# pp.c
+use utf8 ;
+$_ = "\x80 \xff" ;
+reverse ;
+EXPECT
+########
diff --git a/contrib/perl5/t/pragma/warn/pp_ctl b/contrib/perl5/t/pragma/warn/pp_ctl
new file mode 100644
index 0000000..0deccd3
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/pp_ctl
@@ -0,0 +1,217 @@
+ pp_ctl.c AOK
+
+ Not enough format arguments
+ format STDOUT =
+ @<<< @<<<
+ $a
+ .
+ write;
+
+
+ Exiting substitution via %s
+ $_ = "abc" ;
+ while ($i ++ == 0)
+ {
+ s/ab/last/e ;
+ }
+
+ Exiting subroutine via %s
+ sub fred { last }
+ { fred() }
+
+ Exiting eval via %s
+ { eval "last" }
+
+ Exiting pseudo-block via %s
+ @a = (1,2) ; @b = sort { last } @a ;
+
+ Exiting substitution via %s
+ $_ = "abc" ;
+ last fred:
+ while ($i ++ == 0)
+ {
+ s/ab/last fred/e ;
+ }
+
+
+ Exiting subroutine via %s
+ sub fred { last joe }
+ joe: { fred() }
+
+ Exiting eval via %s
+ fred: { eval "last fred" }
+
+ Exiting pseudo-block via %s
+ @a = (1,2) ; fred: @b = sort { last fred } @a ;
+
+
+ Deep recursion on subroutine \"%s\"
+ sub fred
+ {
+ fred() if $a++ < 200
+ }
+
+ fred()
+
+ (in cleanup) foo bar
+ package Foo;
+ DESTROY { die "foo bar" }
+ { bless [], 'Foo' for 1..10 }
+
+__END__
+# pp_ctl.c
+use warnings 'syntax' ;
+format STDOUT =
+@<<< @<<<
+1
+.
+write;
+EXPECT
+Not enough format arguments at - line 5.
+1
+########
+# pp_ctl.c
+no warnings 'syntax' ;
+format =
+@<<< @<<<
+1
+.
+write ;
+EXPECT
+1
+########
+# pp_ctl.c
+use warnings 'exiting' ;
+$_ = "abc" ;
+
+while ($i ++ == 0)
+{
+ s/ab/last/e ;
+}
+no warnings 'exiting' ;
+while ($i ++ == 0)
+{
+ s/ab/last/e ;
+}
+EXPECT
+Exiting substitution via last at - line 7.
+########
+# pp_ctl.c
+use warnings 'exiting' ;
+sub fred { last }
+{ fred() }
+no warnings 'exiting' ;
+sub joe { last }
+{ joe() }
+EXPECT
+Exiting subroutine via last at - line 3.
+########
+# pp_ctl.c
+{
+ eval "use warnings 'exiting' ; last;"
+}
+print STDERR $@ ;
+{
+ eval "no warnings 'exiting' ;last;"
+}
+print STDERR $@ ;
+EXPECT
+Exiting eval via last at (eval 1) line 1.
+########
+# pp_ctl.c
+use warnings 'exiting' ;
+@a = (1,2) ;
+@b = sort { last } @a ;
+no warnings 'exiting' ;
+@b = sort { last } @a ;
+EXPECT
+Exiting pseudo-block via last at - line 4.
+Can't "last" outside a loop block at - line 4.
+########
+# pp_ctl.c
+use warnings 'exiting' ;
+$_ = "abc" ;
+fred:
+while ($i ++ == 0)
+{
+ s/ab/last fred/e ;
+}
+no warnings 'exiting' ;
+while ($i ++ == 0)
+{
+ s/ab/last fred/e ;
+}
+EXPECT
+Exiting substitution via last at - line 7.
+########
+# pp_ctl.c
+use warnings 'exiting' ;
+sub fred { last joe }
+joe: { fred() }
+no warnings 'exiting' ;
+sub Fred { last Joe }
+Joe: { Fred() }
+EXPECT
+Exiting subroutine via last at - line 3.
+########
+# pp_ctl.c
+joe:
+{ eval "use warnings 'exiting' ; last joe;" }
+print STDERR $@ ;
+Joe:
+{ eval "no warnings 'exiting' ; last Joe;" }
+print STDERR $@ ;
+EXPECT
+Exiting eval via last at (eval 1) line 1.
+########
+# pp_ctl.c
+use warnings 'exiting' ;
+@a = (1,2) ;
+fred: @b = sort { last fred } @a ;
+no warnings 'exiting' ;
+Fred: @b = sort { last Fred } @a ;
+EXPECT
+Exiting pseudo-block via last at - line 4.
+Label not found for "last fred" at - line 4.
+########
+# pp_ctl.c
+use warnings 'recursion' ;
+BEGIN { warn "PREFIX\n" ;}
+sub fred
+{
+ fred() if $a++ < 200
+}
+
+fred()
+EXPECT
+Deep recursion on subroutine "main::fred" at - line 6.
+########
+# pp_ctl.c
+no warnings 'recursion' ;
+BEGIN { warn "PREFIX\n" ;}
+sub fred
+{
+ fred() if $a++ < 200
+}
+
+fred()
+EXPECT
+########
+# pp_ctl.c
+use warnings 'misc' ;
+package Foo;
+DESTROY { die "@{$_[0]} foo bar" }
+{ bless ['A'], 'Foo' for 1..10 }
+{ bless ['B'], 'Foo' for 1..10 }
+EXPECT
+ (in cleanup) A foo bar at - line 4.
+ (in cleanup) B foo bar at - line 4.
+########
+# pp_ctl.c
+no warnings 'misc' ;
+package Foo;
+DESTROY { die "@{$_[0]} foo bar" }
+{ bless ['A'], 'Foo' for 1..10 }
+{ bless ['B'], 'Foo' for 1..10 }
+EXPECT
+
diff --git a/contrib/perl5/t/pragma/warn/pp_hot b/contrib/perl5/t/pragma/warn/pp_hot
new file mode 100644
index 0000000..2759057
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/pp_hot
@@ -0,0 +1,226 @@
+ pp_hot.c
+
+ Filehandle %s never opened [pp_print]
+ $f = $a = "abc" ; print $f $a
+
+ Filehandle %s opened only for input [pp_print]
+ print STDIN "abc" ;
+
+ Filehandle %s opened only for output [pp_print]
+ print <STDOUT> ;
+
+ print() on closed filehandle %s [pp_print]
+ close STDIN ; print STDIN "abc" ;
+
+ uninitialized [pp_rv2av]
+ my $a = undef ; my @b = @$a
+
+ uninitialized [pp_rv2hv]
+ my $a = undef ; my %b = %$a
+
+ Odd number of elements in hash list [pp_aassign]
+ %X = (1,2,3) ;
+
+ Reference found where even-sized list expected [pp_aassign]
+ $X = [ 1 ..3 ];
+
+ Filehandle %s opened only for output [Perl_do_readline]
+ open (FH, ">./xcv") ;
+ my $a = <FH> ;
+
+ glob failed (can't start child: %s) [Perl_do_readline] <<TODO
+
+ readline() on closed filehandle %s [Perl_do_readline]
+ close STDIN ; $a = <STDIN>;
+
+ glob failed (child exited with status %d%s) [Perl_do_readline] <<TODO
+
+ Deep recursion on subroutine \"%s\" [Perl_sub_crush_depth]
+ sub fred { fred() if $a++ < 200} fred()
+
+ Deep recursion on anonymous subroutine [Perl_sub_crush_depth]
+ $a = sub { &$a if $a++ < 200} &$a
+
+ Possible Y2K bug: about to append an integer to '19' [pp_concat]
+ $x = "19$yy\n";
+
+__END__
+# pp_hot.c [pp_print]
+use warnings 'unopened' ;
+$f = $a = "abc" ;
+print $f $a;
+no warnings 'unopened' ;
+print $f $a;
+EXPECT
+Filehandle main::abc never opened at - line 4.
+########
+# pp_hot.c [pp_print]
+use warnings 'io' ;
+print STDIN "anc";
+print <STDOUT>;
+print <STDERR>;
+open(FOO, ">&STDOUT") and print <FOO>;
+print getc(STDERR);
+print getc(FOO);
+####################################################################
+# The next test is known to fail on some systems (Linux+old glibc, #
+# old *BSDs, and NeXT, among others. #
+# We skip it for now (on the grounds that it is "just" a warning). #
+####################################################################
+#read(FOO,$_,1);
+no warnings 'io' ;
+print STDIN "anc";
+EXPECT
+Filehandle main::STDIN opened only for input at - line 3.
+Filehandle main::STDOUT opened only for output at - line 4.
+Filehandle main::STDERR opened only for output at - line 5.
+Filehandle main::FOO opened only for output at - line 6.
+Filehandle main::STDERR opened only for output at - line 7.
+Filehandle main::FOO opened only for output at - line 8.
+########
+# pp_hot.c [pp_print]
+use warnings 'closed' ;
+close STDIN ;
+print STDIN "anc";
+opendir STDIN, ".";
+print STDIN "anc";
+closedir STDIN;
+no warnings 'closed' ;
+print STDIN "anc";
+opendir STDIN, ".";
+print STDIN "anc";
+EXPECT
+print() on closed filehandle main::STDIN at - line 4.
+print() on closed filehandle main::STDIN at - line 6.
+ (Are you trying to call print() on dirhandle main::STDIN?)
+########
+# pp_hot.c [pp_rv2av]
+use warnings 'uninitialized' ;
+my $a = undef ;
+my @b = @$a;
+no warnings 'uninitialized' ;
+my @c = @$a;
+EXPECT
+Use of uninitialized value in array dereference at - line 4.
+########
+# pp_hot.c [pp_rv2hv]
+use warnings 'uninitialized' ;
+my $a = undef ;
+my %b = %$a;
+no warnings 'uninitialized' ;
+my %c = %$a;
+EXPECT
+Use of uninitialized value in hash dereference at - line 4.
+########
+# pp_hot.c [pp_aassign]
+use warnings 'misc' ;
+my %X ; %X = (1,2,3) ;
+no warnings 'misc' ;
+my %Y ; %Y = (1,2,3) ;
+EXPECT
+Odd number of elements in hash assignment at - line 3.
+########
+# pp_hot.c [pp_aassign]
+use warnings 'misc' ;
+my %X ; %X = [1 .. 3] ;
+no warnings 'misc' ;
+my %Y ; %Y = [1 .. 3] ;
+EXPECT
+Reference found where even-sized list expected at - line 3.
+########
+# pp_hot.c [Perl_do_readline]
+use warnings 'closed' ;
+close STDIN ; $a = <STDIN> ;
+opendir STDIN, "." ; $a = <STDIN> ;
+closedir STDIN;
+no warnings 'closed' ;
+opendir STDIN, "." ; $a = <STDIN> ;
+$a = <STDIN> ;
+EXPECT
+readline() on closed filehandle main::STDIN at - line 3.
+readline() on closed filehandle main::STDIN at - line 4.
+ (Are you trying to call readline() on dirhandle main::STDIN?)
+########
+# pp_hot.c [Perl_do_readline]
+use warnings 'io' ;
+my $file = "./xcv" ; unlink $file ;
+open (FH, ">./xcv") ;
+my $a = <FH> ;
+no warnings 'io' ;
+$a = <FH> ;
+unlink $file ;
+EXPECT
+Filehandle main::FH opened only for output at - line 5.
+########
+# pp_hot.c [Perl_sub_crush_depth]
+use warnings 'recursion' ;
+sub fred
+{
+ fred() if $a++ < 200
+}
+{
+ local $SIG{__WARN__} = sub {
+ die "ok\n" if $_[0] =~ /^Deep recursion on subroutine "main::fred"/
+ };
+ fred();
+}
+EXPECT
+ok
+########
+# pp_hot.c [Perl_sub_crush_depth]
+no warnings 'recursion' ;
+sub fred
+{
+ fred() if $a++ < 200
+}
+{
+ local $SIG{__WARN__} = sub {
+ die "ok\n" if $_[0] =~ /^Deep recursion on subroutine "main::fred"/
+ };
+ fred();
+}
+EXPECT
+
+########
+# pp_hot.c [Perl_sub_crush_depth]
+use warnings 'recursion' ;
+$b = sub
+{
+ &$b if $a++ < 200
+} ;
+
+&$b ;
+EXPECT
+Deep recursion on anonymous subroutine at - line 5.
+########
+# pp_hot.c [Perl_sub_crush_depth]
+no warnings 'recursion' ;
+$b = sub
+{
+ &$b if $a++ < 200
+} ;
+
+&$b ;
+EXPECT
+########
+# pp_hot.c [pp_concat]
+use warnings 'y2k';
+use Config;
+BEGIN {
+ unless ($Config{ccflags} =~ /Y2KWARN/) {
+ print "SKIPPED\n# perl not built with -DPERL_Y2KWARN";
+ exit 0;
+ }
+}
+my $x;
+my $yy = 78;
+$x = "19$yy\n";
+$x = "19" . $yy . "\n";
+$x = "319$yy\n";
+$x = "319" . $yy . "\n";
+no warnings 'y2k';
+$x = "19$yy\n";
+$x = "19" . $yy . "\n";
+EXPECT
+Possible Y2K bug: about to append an integer to '19' at - line 12.
+Possible Y2K bug: about to append an integer to '19' at - line 13.
diff --git a/contrib/perl5/t/pragma/warn/pp_sys b/contrib/perl5/t/pragma/warn/pp_sys
new file mode 100644
index 0000000..7c38727
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/pp_sys
@@ -0,0 +1,354 @@
+ pp_sys.c AOK
+
+ untie attempted while %d inner references still exist [pp_untie]
+ sub TIESCALAR { bless [] } ; tie $a, 'main'; untie $a ;
+
+ Filehandle %s opened only for input [pp_leavewrite]
+ format STDIN =
+ .
+ write STDIN;
+
+ write() on closed filehandle %s [pp_leavewrite]
+ format STDIN =
+ .
+ close STDIN;
+ write STDIN ;
+
+ page overflow [pp_leavewrite]
+
+ Filehandle %s never opened [pp_prtf]
+ $a = "abc"; printf $a "fred"
+
+ Filehandle %s opened only for input [pp_prtf]
+ $a = "abc";
+ printf $a "fred"
+
+ printf() on closed filehandle %s [pp_prtf]
+ close STDIN ;
+ printf STDIN "fred"
+
+ syswrite() on closed filehandle %s [pp_send]
+ close STDIN;
+ syswrite STDIN, "fred", 1;
+
+ send() on closed socket %s [pp_send]
+ close STDIN;
+ send STDIN, "fred", 1
+
+ bind() on closed socket %s [pp_bind]
+ close STDIN;
+ bind STDIN, "fred" ;
+
+
+ connect() on closed socket %s [pp_connect]
+ close STDIN;
+ connect STDIN, "fred" ;
+
+ listen() on closed socket %s [pp_listen]
+ close STDIN;
+ listen STDIN, 2;
+
+ accept() on closed socket %s [pp_accept]
+ close STDIN;
+ accept "fred", STDIN ;
+
+ shutdown() on closed socket %s [pp_shutdown]
+ close STDIN;
+ shutdown STDIN, 0;
+
+ setsockopt() on closed socket %s [pp_ssockopt]
+ getsockopt() on closed socket %s [pp_ssockopt]
+ close STDIN;
+ setsockopt STDIN, 1,2,3;
+ getsockopt STDIN, 1,2;
+
+ getsockname() on closed socket %s [pp_getpeername]
+ getpeername() on closed socket %s [pp_getpeername]
+ close STDIN;
+ getsockname STDIN;
+ getpeername STDIN;
+
+ flock() on closed socket %s [pp_flock]
+ close STDIN;
+ flock STDIN, 8;
+
+ warn(warn_nl, "stat"); [pp_stat]
+
+ Test on unopened file <%s>
+ close STDIN ; -T STDIN ;
+
+ warn(warn_nl, "open"); [pp_fttext]
+ -T "abc\ndef" ;
+
+ Filehandle %s opened only for output [pp_sysread]
+ my $file = "./xcv" ;
+ open(F, ">$file") ;
+ my $a = sysread(F, $a,10) ;
+
+
+
+__END__
+# pp_sys.c [pp_untie]
+use warnings 'untie' ;
+sub TIESCALAR { bless [] } ;
+$b = tie $a, 'main';
+untie $a ;
+no warnings 'untie' ;
+$c = tie $d, 'main';
+untie $d ;
+EXPECT
+untie attempted while 1 inner references still exist at - line 5.
+########
+# pp_sys.c [pp_leavewrite]
+use warnings 'io' ;
+format STDIN =
+.
+write STDIN;
+no warnings 'io' ;
+write STDIN;
+EXPECT
+Filehandle main::STDIN opened only for input at - line 5.
+########
+# pp_sys.c [pp_leavewrite]
+use warnings 'closed' ;
+format STDIN =
+.
+close STDIN;
+write STDIN;
+opendir STDIN, ".";
+write STDIN;
+closedir STDIN;
+no warnings 'closed' ;
+write STDIN;
+opendir STDIN, ".";
+write STDIN;
+EXPECT
+write() on closed filehandle main::STDIN at - line 6.
+write() on closed filehandle main::STDIN at - line 8.
+ (Are you trying to call write() on dirhandle main::STDIN?)
+########
+# pp_sys.c [pp_leavewrite]
+use warnings 'io' ;
+format STDOUT_TOP =
+abc
+.
+format STDOUT =
+def
+ghi
+.
+$= = 1 ;
+$- =1 ;
+open STDOUT, ">".($^O eq 'VMS'? 'NL:' : '/dev/null') ;
+write ;
+no warnings 'io' ;
+write ;
+EXPECT
+page overflow at - line 13.
+########
+# pp_sys.c [pp_prtf]
+use warnings 'unopened' ;
+$a = "abc";
+printf $a "fred";
+no warnings 'unopened' ;
+printf $a "fred";
+EXPECT
+Filehandle main::abc never opened at - line 4.
+########
+# pp_sys.c [pp_prtf]
+use warnings 'closed' ;
+close STDIN ;
+printf STDIN "fred";
+opendir STDIN, ".";
+printf STDIN "fred";
+closedir STDIN;
+no warnings 'closed' ;
+printf STDIN "fred";
+opendir STDIN, ".";
+printf STDIN "fred";
+EXPECT
+printf() on closed filehandle main::STDIN at - line 4.
+printf() on closed filehandle main::STDIN at - line 6.
+ (Are you trying to call printf() on dirhandle main::STDIN?)
+########
+# pp_sys.c [pp_prtf]
+use warnings 'io' ;
+printf STDIN "fred";
+no warnings 'io' ;
+printf STDIN "fred";
+EXPECT
+Filehandle main::STDIN opened only for input at - line 3.
+########
+# pp_sys.c [pp_send]
+use warnings 'closed' ;
+close STDIN;
+syswrite STDIN, "fred", 1;
+opendir STDIN, ".";
+syswrite STDIN, "fred", 1;
+closedir STDIN;
+no warnings 'closed' ;
+syswrite STDIN, "fred", 1;
+opendir STDIN, ".";
+syswrite STDIN, "fred", 1;
+EXPECT
+syswrite() on closed filehandle main::STDIN at - line 4.
+syswrite() on closed filehandle main::STDIN at - line 6.
+ (Are you trying to call syswrite() on dirhandle main::STDIN?)
+########
+# pp_sys.c [pp_flock]
+use Config;
+BEGIN {
+ if ( $^O eq 'VMS' and ! $Config{d_flock}) {
+ print <<EOM ;
+SKIPPED
+# flock not present
+EOM
+ exit ;
+ }
+}
+use warnings 'closed' ;
+close STDIN;
+flock STDIN, 8;
+opendir STDIN, ".";
+flock STDIN, 8;
+no warnings 'closed' ;
+flock STDIN, 8;
+opendir STDIN, ".";
+flock STDIN, 8;
+EXPECT
+flock() on closed filehandle main::STDIN at - line 14.
+flock() on closed filehandle main::STDIN at - line 16.
+ (Are you trying to call flock() on dirhandle main::STDIN?)
+########
+# pp_sys.c [pp_prtf pp_send pp_bind pp_connect pp_listen pp_accept pp_shutdown pp_ssockopt ppp_getpeername]
+use warnings 'io' ;
+use Config;
+BEGIN {
+ if ( $^O ne 'VMS' and ! $Config{d_socket}) {
+ print <<EOM ;
+SKIPPED
+# send not present
+# bind not present
+# connect not present
+# accept not present
+# shutdown not present
+# setsockopt not present
+# getsockopt not present
+# getsockname not present
+# getpeername not present
+EOM
+ exit ;
+ }
+}
+close STDIN;
+send STDIN, "fred", 1;
+bind STDIN, "fred" ;
+connect STDIN, "fred" ;
+listen STDIN, 2;
+accept "fred", STDIN;
+shutdown STDIN, 0;
+setsockopt STDIN, 1,2,3;
+getsockopt STDIN, 1,2;
+getsockname STDIN;
+getpeername STDIN;
+opendir STDIN, ".";
+send STDIN, "fred", 1;
+bind STDIN, "fred" ;
+connect STDIN, "fred" ;
+listen STDIN, 2;
+accept "fred", STDIN;
+shutdown STDIN, 0;
+setsockopt STDIN, 1,2,3;
+getsockopt STDIN, 1,2;
+getsockname STDIN;
+getpeername STDIN;
+closedir STDIN;
+no warnings 'io' ;
+send STDIN, "fred", 1;
+bind STDIN, "fred" ;
+connect STDIN, "fred" ;
+listen STDIN, 2;
+accept STDIN, "fred" ;
+shutdown STDIN, 0;
+setsockopt STDIN, 1,2,3;
+getsockopt STDIN, 1,2;
+getsockname STDIN;
+getpeername STDIN;
+opendir STDIN, ".";
+send STDIN, "fred", 1;
+bind STDIN, "fred" ;
+connect STDIN, "fred" ;
+listen STDIN, 2;
+accept "fred", STDIN;
+shutdown STDIN, 0;
+setsockopt STDIN, 1,2,3;
+getsockopt STDIN, 1,2;
+getsockname STDIN;
+getpeername STDIN;
+EXPECT
+send() on closed socket main::STDIN at - line 22.
+bind() on closed socket main::STDIN at - line 23.
+connect() on closed socket main::STDIN at - line 24.
+listen() on closed socket main::STDIN at - line 25.
+accept() on closed socket main::STDIN at - line 26.
+shutdown() on closed socket main::STDIN at - line 27.
+setsockopt() on closed socket main::STDIN at - line 28.
+getsockopt() on closed socket main::STDIN at - line 29.
+getsockname() on closed socket main::STDIN at - line 30.
+getpeername() on closed socket main::STDIN at - line 31.
+send() on closed socket main::STDIN at - line 33.
+ (Are you trying to call send() on dirhandle main::STDIN?)
+bind() on closed socket main::STDIN at - line 34.
+ (Are you trying to call bind() on dirhandle main::STDIN?)
+connect() on closed socket main::STDIN at - line 35.
+ (Are you trying to call connect() on dirhandle main::STDIN?)
+listen() on closed socket main::STDIN at - line 36.
+ (Are you trying to call listen() on dirhandle main::STDIN?)
+accept() on closed socket main::STDIN at - line 37.
+ (Are you trying to call accept() on dirhandle main::STDIN?)
+shutdown() on closed socket main::STDIN at - line 38.
+ (Are you trying to call shutdown() on dirhandle main::STDIN?)
+setsockopt() on closed socket main::STDIN at - line 39.
+ (Are you trying to call setsockopt() on dirhandle main::STDIN?)
+getsockopt() on closed socket main::STDIN at - line 40.
+ (Are you trying to call getsockopt() on dirhandle main::STDIN?)
+getsockname() on closed socket main::STDIN at - line 41.
+ (Are you trying to call getsockname() on dirhandle main::STDIN?)
+getpeername() on closed socket main::STDIN at - line 42.
+ (Are you trying to call getpeername() on dirhandle main::STDIN?)
+########
+# pp_sys.c [pp_stat]
+use warnings 'newline' ;
+stat "abc\ndef";
+no warnings 'newline' ;
+stat "abc\ndef";
+EXPECT
+Unsuccessful stat on filename containing newline at - line 3.
+########
+# pp_sys.c [pp_fttext]
+use warnings 'unopened' ;
+close STDIN ;
+-T STDIN ;
+no warnings 'unopened' ;
+-T STDIN ;
+EXPECT
+Test on unopened file <STDIN> at - line 4.
+########
+# pp_sys.c [pp_fttext]
+use warnings 'newline' ;
+-T "abc\ndef" ;
+no warnings 'newline' ;
+-T "abc\ndef" ;
+EXPECT
+Unsuccessful open on filename containing newline at - line 3.
+########
+# pp_sys.c [pp_sysread]
+use warnings 'io' ;
+my $file = "./xcv" ;
+open(F, ">$file") ;
+my $a = sysread(F, $a,10) ;
+no warnings 'io' ;
+my $a = sysread(F, $a,10) ;
+close F ;
+unlink $file ;
+EXPECT
+Filehandle main::F opened only for output at - line 5.
diff --git a/contrib/perl5/t/pragma/warn/regcomp b/contrib/perl5/t/pragma/warn/regcomp
new file mode 100644
index 0000000..5d0c291
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/regcomp
@@ -0,0 +1,165 @@
+ regcomp.c AOK
+
+ Strange *+?{} on zero-length expression [S_study_chunk]
+ /(?=a)?/
+
+ %.*s matches null string many times [S_regpiece]
+ $a = "ABC123" ; $a =~ /(?=a)*/'
+
+ /%.127s/: Unrecognized escape \\%c passed through [S_regatom]
+ $x = '\m' ; /$x/
+
+ Character class [:%.*s:] unknown [S_regpposixcc]
+
+ Character class syntax [. .] is reserved for future extensions [S_regpposixcc]
+
+ Character class syntax [= =] is reserved for future extensions [S_checkposixcc]
+
+ Character class syntax [%c %c] belongs inside character classes [S_checkposixcc]
+
+ /%.127s/: false [] range \"%*.*s\" in regexp [S_regclass]
+
+ /%.127s/: false [] range \"%*.*s\" in regexp [S_regclassutf8]
+
+ /%.127s/: Unrecognized escape \\%c in character class passed through" [S_regclass]
+
+ /%.127s/: Unrecognized escape \\%c in character class passed through" [S_regclassutf8]
+
+__END__
+# regcomp.c [S_regpiece]
+use warnings 'regexp' ;
+my $a = "ABC123" ;
+$a =~ /(?=a)*/ ;
+no warnings 'regexp' ;
+$a =~ /(?=a)*/ ;
+EXPECT
+(?=a)* matches null string many times at - line 4.
+########
+# regcomp.c [S_study_chunk]
+use warnings 'regexp' ;
+$_ = "" ;
+/(?=a)?/;
+no warnings 'regexp' ;
+/(?=a)?/;
+EXPECT
+Strange *+?{} on zero-length expression at - line 4.
+########
+# regcomp.c [S_regatom]
+$x = '\m' ;
+use warnings 'regexp' ;
+$a =~ /a$x/ ;
+no warnings 'regexp' ;
+$a =~ /a$x/ ;
+EXPECT
+/a\m/: Unrecognized escape \m passed through at - line 4.
+########
+# regcomp.c [S_regpposixcc S_checkposixcc]
+BEGIN { $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3 }
+use warnings 'regexp' ;
+$_ = "" ;
+/[:alpha:]/;
+/[.bar.]/;
+/[=zog=]/;
+/[[:alpha:]]/;
+/[[.foo.]]/;
+/[[=bar=]]/;
+/[:zog:]/;
+/[[:zog:]]/;
+no warnings 'regexp' ;
+/[:alpha:]/;
+/[.foo.]/;
+/[=bar=]/;
+/[[:alpha:]]/;
+/[[.foo.]]/;
+/[[=bar=]]/;
+/[[:zog:]]/;
+/[:zog:]/;
+EXPECT
+Character class syntax [: :] belongs inside character classes at - line 5.
+Character class syntax [. .] belongs inside character classes at - line 6.
+Character class syntax [. .] is reserved for future extensions at - line 6.
+Character class syntax [= =] belongs inside character classes at - line 7.
+Character class syntax [= =] is reserved for future extensions at - line 7.
+Character class syntax [. .] is reserved for future extensions at - line 9.
+Character class syntax [= =] is reserved for future extensions at - line 10.
+Character class syntax [: :] belongs inside character classes at - line 11.
+Character class [:zog:] unknown at - line 12.
+########
+# regcomp.c [S_regclass]
+$_ = "";
+use warnings 'regexp' ;
+/[a-b]/;
+/[a-\d]/;
+/[\d-b]/;
+/[\s-\d]/;
+/[\d-\s]/;
+/[a-[:digit:]]/;
+/[[:digit:]-b]/;
+/[[:alpha:]-[:digit:]]/;
+/[[:digit:]-[:alpha:]]/;
+no warnings 'regexp' ;
+/[a-b]/;
+/[a-\d]/;
+/[\d-b]/;
+/[\s-\d]/;
+/[\d-\s]/;
+/[a-[:digit:]]/;
+/[[:digit:]-b]/;
+/[[:alpha:]-[:digit:]]/;
+/[[:digit:]-[:alpha:]]/;
+EXPECT
+/[a-\d]/: false [] range "a-\d" in regexp at - line 5.
+/[\d-b]/: false [] range "\d-" in regexp at - line 6.
+/[\s-\d]/: false [] range "\s-" in regexp at - line 7.
+/[\d-\s]/: false [] range "\d-" in regexp at - line 8.
+/[a-[:digit:]]/: false [] range "a-[:digit:]" in regexp at - line 9.
+/[[:digit:]-b]/: false [] range "[:digit:]-" in regexp at - line 10.
+/[[:alpha:]-[:digit:]]/: false [] range "[:alpha:]-" in regexp at - line 11.
+/[[:digit:]-[:alpha:]]/: false [] range "[:digit:]-" in regexp at - line 12.
+########
+# regcomp.c [S_regclassutf8]
+BEGIN {
+ if (ord("\t") == 5) {
+ print "SKIPPED\n# ebcdic regular expression ranges differ.";
+ exit 0;
+ }
+}
+use utf8;
+$_ = "";
+use warnings 'regexp' ;
+/[a-b]/;
+/[a-\d]/;
+/[\d-b]/;
+/[\s-\d]/;
+/[\d-\s]/;
+/[a-[:digit:]]/;
+/[[:digit:]-b]/;
+/[[:alpha:]-[:digit:]]/;
+/[[:digit:]-[:alpha:]]/;
+no warnings 'regexp' ;
+/[a-b]/;
+/[a-\d]/;
+/[\d-b]/;
+/[\s-\d]/;
+/[\d-\s]/;
+/[a-[:digit:]]/;
+/[[:digit:]-b]/;
+/[[:alpha:]-[:digit:]]/;
+/[[:digit:]-[:alpha:]]/;
+EXPECT
+/[a-\d]/: false [] range "a-\d" in regexp at - line 12.
+/[\d-b]/: false [] range "\d-" in regexp at - line 13.
+/[\s-\d]/: false [] range "\s-" in regexp at - line 14.
+/[\d-\s]/: false [] range "\d-" in regexp at - line 15.
+/[a-[:digit:]]/: false [] range "a-[:digit:]" in regexp at - line 16.
+/[[:digit:]-b]/: false [] range "[:digit:]-" in regexp at - line 17.
+/[[:alpha:]-[:digit:]]/: false [] range "[:alpha:]-" in regexp at - line 18.
+/[[:digit:]-[:alpha:]]/: false [] range "[:digit:]-" in regexp at - line 19.
+########
+# regcomp.c [S_regclass S_regclassutf8]
+use warnings 'regexp' ;
+$a =~ /[a\zb]/ ;
+no warnings 'regexp' ;
+$a =~ /[a\zb]/ ;
+EXPECT
+/[a\zb]/: Unrecognized escape \z in character class passed through at - line 3.
diff --git a/contrib/perl5/t/pragma/warn/regexec b/contrib/perl5/t/pragma/warn/regexec
new file mode 100644
index 0000000..73696df
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/regexec
@@ -0,0 +1,119 @@
+ regexec.c
+
+ This test generates "bad free" warnings when run under
+ PERL_DESTRUCT_LEVEL. This file merely serves as a placeholder
+ for investigation.
+
+ Complex regular subexpression recursion limit (%d) exceeded
+
+ $_ = 'a' x (2**15+1); /^()(a\1)*$/ ;
+ Complex regular subexpression recursion limit (%d) exceeded
+
+ $_ = 'a' x (2**15+1); /^()(a\1)*?$/ ;
+
+ (The actual value substituted for %d is masked in the tests so that
+ REG_INFTY configuration variable value does not affect outcome.)
+__END__
+# regexec.c
+print("SKIPPED\n# most systems run into stacksize limits\n"),exit;
+use warnings 'regexp' ;
+$SIG{__WARN__} = sub{local ($m) = shift;
+ $m =~ s/\(\d+\)/(*MASKED*)/;
+ print STDERR $m};
+$_ = 'a' x (2**15+1);
+/^()(a\1)*$/ ;
+#
+# If this test fails with a segmentation violation or similar,
+# you may have to increase the default stacksize limit in your
+# shell. You may need superuser privileges.
+#
+# Under the sh, ksh, zsh:
+# $ ulimit -s
+# 8192
+# $ ulimit -s 16000
+#
+# Under the csh:
+# % limit stacksize
+# stacksize 8192 kbytes
+# % limit stacksize 16000
+#
+EXPECT
+Complex regular subexpression recursion limit (*MASKED*) exceeded at - line 9.
+########
+# regexec.c
+print("SKIPPED\n# most systems run into stacksize limits\n"),exit;
+no warnings 'regexp' ;
+$SIG{__WARN__} = sub{local ($m) = shift;
+ $m =~ s/\(\d+\)/(*MASKED*)/;
+ print STDERR $m};
+$_ = 'a' x (2**15+1);
+/^()(a\1)*$/ ;
+#
+# If this test fails with a segmentation violation or similar,
+# you may have to increase the default stacksize limit in your
+# shell. You may need superuser privileges.
+#
+# Under the sh, ksh, zsh:
+# $ ulimit -s
+# 8192
+# $ ulimit -s 16000
+#
+# Under the csh:
+# % limit stacksize
+# stacksize 8192 kbytes
+# % limit stacksize 16000
+#
+EXPECT
+
+########
+# regexec.c
+print("SKIPPED\n# most systems run into stacksize limits\n"),exit;
+use warnings 'regexp' ;
+$SIG{__WARN__} = sub{local ($m) = shift;
+ $m =~ s/\(\d+\)/(*MASKED*)/;
+ print STDERR $m};
+$_ = 'a' x (2**15+1);
+/^()(a\1)*?$/ ;
+#
+# If this test fails with a segmentation violation or similar,
+# you may have to increase the default stacksize limit in your
+# shell. You may need superuser privileges.
+#
+# Under the sh, ksh, zsh:
+# $ ulimit -s
+# 8192
+# $ ulimit -s 16000
+#
+# Under the csh:
+# % limit stacksize
+# stacksize 8192 kbytes
+# % limit stacksize 16000
+#
+EXPECT
+Complex regular subexpression recursion limit (*MASKED*) exceeded at - line 9.
+########
+# regexec.c
+print("SKIPPED\n# most systems run into stacksize limits\n"),exit;
+no warnings 'regexp' ;
+$SIG{__WARN__} = sub{local ($m) = shift;
+ $m =~ s/\(\d+\)/(*MASKED*)/;
+ print STDERR $m};
+$_ = 'a' x (2**15+1);
+/^()(a\1)*?$/ ;
+#
+# If this test fails with a segmentation violation or similar,
+# you may have to increase the default stacksize limit in your
+# shell. You may need superuser privileges.
+#
+# Under the sh, ksh, zsh:
+# $ ulimit -s
+# 8192
+# $ ulimit -s 16000
+#
+# Under the csh:
+# % limit stacksize
+# stacksize 8192 kbytes
+# % limit stacksize 16000
+#
+EXPECT
+
diff --git a/contrib/perl5/t/pragma/warn/run b/contrib/perl5/t/pragma/warn/run
new file mode 100644
index 0000000..7a4be20
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/run
@@ -0,0 +1,8 @@
+ run.c
+
+
+ Mandatory Warnings ALL TODO
+ ------------------
+ NULL OP IN RUN
+
+__END__
diff --git a/contrib/perl5/t/pragma/warn/sv b/contrib/perl5/t/pragma/warn/sv
new file mode 100644
index 0000000..758137f
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/sv
@@ -0,0 +1,303 @@
+ sv.c
+
+ warn(warn_uninit);
+
+ warn(warn_uninit);
+
+ warn(warn_uninit);
+
+ warn(warn_uninit);
+
+ not_a_number(sv);
+
+ not_a_number(sv);
+
+ warn(warn_uninit);
+
+ not_a_number(sv);
+
+ warn(warn_uninit);
+
+ not_a_number(sv);
+
+ not_a_number(sv);
+
+ warn(warn_uninit);
+
+ warn(warn_uninit);
+
+ Subroutine %s redefined
+
+ Invalid conversion in %s:
+
+ Undefined value assigned to typeglob
+
+ Possible Y2K bug: %d format string following '19'
+
+ Reference is already weak [Perl_sv_rvweaken] <<TODO
+
+ Mandatory Warnings
+ ------------------
+ Malformed UTF-8 character [sv_pos_b2u] (not tested: difficult to produce
+ with perl now)
+
+ Mandatory Warnings TODO
+ ------------------
+ Attempt to free non-arena SV: 0x%lx [del_sv]
+ Reference miscount in sv_replace() [sv_replace]
+ Attempt to free unreferenced scalar [sv_free]
+ Attempt to free temp prematurely: SV 0x%lx [sv_free]
+ semi-panic: attempt to dup freed string [newSVsv]
+
+
+__END__
+# sv.c
+use integer ;
+use warnings 'uninitialized' ;
+$x = 1 + $a[0] ; # a
+no warnings 'uninitialized' ;
+$x = 1 + $b[0] ; # a
+EXPECT
+Use of uninitialized value in integer addition (+) at - line 4.
+########
+# sv.c (sv_2iv)
+package fred ;
+sub TIESCALAR { my $x ; bless \$x}
+sub FETCH { return undef }
+sub STORE { return 1 }
+package main ;
+tie $A, 'fred' ;
+use integer ;
+use warnings 'uninitialized' ;
+$A *= 2 ;
+no warnings 'uninitialized' ;
+$A *= 2 ;
+EXPECT
+Use of uninitialized value in integer multiplication (*) at - line 10.
+########
+# sv.c
+use integer ;
+use warnings 'uninitialized' ;
+my $x *= 2 ; #b
+no warnings 'uninitialized' ;
+my $y *= 2 ; #b
+EXPECT
+Use of uninitialized value in integer multiplication (*) at - line 4.
+########
+# sv.c (sv_2uv)
+package fred ;
+sub TIESCALAR { my $x ; bless \$x}
+sub FETCH { return undef }
+sub STORE { return 1 }
+package main ;
+tie $A, 'fred' ;
+use warnings 'uninitialized' ;
+$B = 0 ;
+$B |= $A ;
+no warnings 'uninitialized' ;
+$B = 0 ;
+$B |= $A ;
+EXPECT
+Use of uninitialized value in bitwise or (|) at - line 10.
+########
+# sv.c
+use warnings 'uninitialized' ;
+my $Y = 1 ;
+my $x = 1 | $a[$Y] ;
+no warnings 'uninitialized' ;
+my $Y = 1 ;
+$x = 1 | $b[$Y] ;
+EXPECT
+Use of uninitialized value in bitwise or (|) at - line 4.
+########
+# sv.c
+use warnings 'uninitialized' ;
+my $x *= 1 ; # d
+no warnings 'uninitialized' ;
+my $y *= 1 ; # d
+EXPECT
+Use of uninitialized value in multiplication (*) at - line 3.
+########
+# sv.c
+use warnings 'uninitialized' ;
+$x = 1 + $a[0] ; # e
+no warnings 'uninitialized' ;
+$x = 1 + $b[0] ; # e
+EXPECT
+Use of uninitialized value in addition (+) at - line 3.
+########
+# sv.c (sv_2nv)
+package fred ;
+sub TIESCALAR { my $x ; bless \$x}
+sub FETCH { return undef }
+sub STORE { return 1 }
+package main ;
+tie $A, 'fred' ;
+use warnings 'uninitialized' ;
+$A *= 2 ;
+no warnings 'uninitialized' ;
+$A *= 2 ;
+EXPECT
+Use of uninitialized value in multiplication (*) at - line 9.
+########
+# sv.c
+use warnings 'uninitialized' ;
+$x = $y + 1 ; # f
+no warnings 'uninitialized' ;
+$x = $z + 1 ; # f
+EXPECT
+Use of uninitialized value in addition (+) at - line 3.
+########
+# sv.c
+use warnings 'uninitialized' ;
+$x = chop undef ; # g
+no warnings 'uninitialized' ;
+$x = chop undef ; # g
+EXPECT
+Modification of a read-only value attempted at - line 3.
+########
+# sv.c
+use warnings 'uninitialized' ;
+$x = chop $y ; # h
+no warnings 'uninitialized' ;
+$x = chop $z ; # h
+EXPECT
+Use of uninitialized value in scalar chop at - line 3.
+########
+# sv.c (sv_2pv)
+package fred ;
+sub TIESCALAR { my $x ; bless \$x}
+sub FETCH { return undef }
+sub STORE { return 1 }
+package main ;
+tie $A, 'fred' ;
+use warnings 'uninitialized' ;
+$B = "" ;
+$B .= $A ;
+no warnings 'uninitialized' ;
+$C = "" ;
+$C .= $A ;
+EXPECT
+Use of uninitialized value in concatenation (.) at - line 10.
+########
+# sv.c
+use warnings 'numeric' ;
+sub TIESCALAR{bless[]} ;
+sub FETCH {"def"} ;
+tie $a,"main" ;
+my $b = 1 + $a;
+no warnings 'numeric' ;
+my $c = 1 + $a;
+EXPECT
+Argument "def" isn't numeric in addition (+) at - line 6.
+########
+# sv.c
+use warnings 'numeric' ;
+my $x = 1 + "def" ;
+no warnings 'numeric' ;
+my $z = 1 + "def" ;
+EXPECT
+Argument "def" isn't numeric in addition (+) at - line 3.
+########
+# sv.c
+use warnings 'numeric' ;
+my $a = "def" ;
+my $x = 1 + $a ;
+no warnings 'numeric' ;
+my $y = 1 + $a ;
+EXPECT
+Argument "def" isn't numeric in addition (+) at - line 4.
+########
+# sv.c
+use warnings 'numeric' ; use integer ;
+my $a = "def" ;
+my $x = 1 + $a ;
+no warnings 'numeric' ;
+my $z = 1 + $a ;
+EXPECT
+Argument "def" isn't numeric in integer addition (+) at - line 4.
+########
+# sv.c
+use warnings 'numeric' ;
+my $x = 1 & "def" ;
+no warnings 'numeric' ;
+my $z = 1 & "def" ;
+EXPECT
+Argument "def" isn't numeric in bitwise and (&) at - line 3.
+########
+# sv.c
+use warnings 'redefine' ;
+sub fred {}
+sub joe {}
+*fred = \&joe ;
+no warnings 'redefine' ;
+sub jim {}
+*jim = \&joe ;
+EXPECT
+Subroutine fred redefined at - line 5.
+########
+# sv.c
+use warnings 'printf' ;
+open F, ">".($^O eq 'VMS'? 'NL:' : '/dev/null') ;
+printf F "%z\n" ;
+my $a = sprintf "%z" ;
+printf F "%" ;
+$a = sprintf "%" ;
+printf F "%\x02" ;
+$a = sprintf "%\x02" ;
+no warnings 'printf' ;
+printf F "%z\n" ;
+$a = sprintf "%z" ;
+printf F "%" ;
+$a = sprintf "%" ;
+printf F "%\x02" ;
+$a = sprintf "%\x02" ;
+EXPECT
+Invalid conversion in sprintf: "%z" at - line 5.
+Invalid conversion in sprintf: end of string at - line 7.
+Invalid conversion in sprintf: "%\002" at - line 9.
+Invalid conversion in printf: "%z" at - line 4.
+Invalid conversion in printf: end of string at - line 6.
+Invalid conversion in printf: "%\002" at - line 8.
+########
+# sv.c
+use warnings 'misc' ;
+*a = undef ;
+no warnings 'misc' ;
+*b = undef ;
+EXPECT
+Undefined value assigned to typeglob at - line 3.
+########
+# sv.c
+use warnings 'y2k';
+use Config;
+BEGIN {
+ unless ($Config{ccflags} =~ /Y2KWARN/) {
+ print "SKIPPED\n# perl not built with -DPERL_Y2KWARN";
+ exit 0;
+ }
+ $|=1;
+}
+my $x;
+my $yy = 78;
+$x = printf "19%02d\n", $yy;
+$x = sprintf "#19%02d\n", $yy;
+$x = printf " 19%02d\n", 78;
+$x = sprintf "19%02d\n", 78;
+$x = printf "319%02d\n", $yy;
+$x = sprintf "319%02d\n", $yy;
+no warnings 'y2k';
+$x = printf "19%02d\n", $yy;
+$x = sprintf "19%02d\n", $yy;
+$x = printf "19%02d\n", 78;
+$x = sprintf "19%02d\n", 78;
+EXPECT
+Possible Y2K bug: %d format string following '19' at - line 16.
+Possible Y2K bug: %d format string following '19' at - line 13.
+1978
+Possible Y2K bug: %d format string following '19' at - line 14.
+Possible Y2K bug: %d format string following '19' at - line 15.
+ 1978
+31978
+1978
+1978
diff --git a/contrib/perl5/t/pragma/warn/taint b/contrib/perl5/t/pragma/warn/taint
new file mode 100644
index 0000000..fd6deed
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/taint
@@ -0,0 +1,49 @@
+ taint.c AOK
+
+ Insecure %s%s while running with -T switch
+
+__END__
+-T
+--FILE-- abc
+def
+--FILE--
+# taint.c
+open(FH, "<abc") ;
+$a = <FH> ;
+close FH ;
+chdir $a ;
+print "xxx\n" ;
+EXPECT
+Insecure dependency in chdir while running with -T switch at - line 5.
+########
+-TU
+--FILE-- abc
+def
+--FILE--
+# taint.c
+open(FH, "<abc") ;
+$a = <FH> ;
+close FH ;
+chdir $a ;
+print "xxx\n" ;
+EXPECT
+xxx
+########
+-TU
+--FILE-- abc
+def
+--FILE--
+# taint.c
+open(FH, "<abc") ;
+$a = <FH> ;
+close FH ;
+use warnings 'taint' ;
+chdir $a ;
+print "xxx\n" ;
+no warnings 'taint' ;
+chdir $a ;
+print "yyy\n" ;
+EXPECT
+Insecure dependency in chdir while running with -T switch at - line 6.
+xxx
+yyy
diff --git a/contrib/perl5/t/pragma/warn/toke b/contrib/perl5/t/pragma/warn/toke
new file mode 100644
index 0000000..cfdea78
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/toke
@@ -0,0 +1,583 @@
+toke.c AOK
+
+ we seem to have lost a few ambiguous warnings!!
+
+
+ 1 if $a EQ $b ;
+ 1 if $a NE $b ;
+ 1 if $a LT $b ;
+ 1 if $a GT $b ;
+ 1 if $a GE $b ;
+ 1 if $a LE $b ;
+ $a = <<;
+ Use of comma-less variable list is deprecated
+ (called 3 times via depcom)
+
+ \1 better written as $1
+ use warnings 'syntax' ;
+ s/(abc)/\1/;
+
+ warn(warn_nosemi)
+ Semicolon seems to be missing
+ $a = 1
+ &time ;
+
+
+ Reversed %c= operator
+ my $a =+ 2 ;
+ $a =- 2 ;
+ $a =* 2 ;
+ $a =% 2 ;
+ $a =& 2 ;
+ $a =. 2 ;
+ $a =^ 2 ;
+ $a =| 2 ;
+ $a =< 2 ;
+ $a =/ 2 ;
+
+ Multidimensional syntax %.*s not supported
+ my $a = $a[1,2] ;
+
+ You need to quote \"%s\""
+ sub fred {} ; $SIG{TERM} = fred;
+
+ Scalar value %.*s better written as $%.*s"
+ @a[3] = 2;
+ @a{3} = 2;
+
+ Can't use \\%c to mean $%c in expression
+ $_ = "ab" ; s/(ab)/\1/e;
+
+ Unquoted string "abc" may clash with future reserved word at - line 3.
+ warn(warn_reserved
+ $a = abc;
+
+ chmod() mode argument is missing initial 0
+ chmod 3;
+
+ Possible attempt to separate words with commas
+ @a = qw(a, b, c) ;
+
+ Possible attempt to put comments in qw() list
+ @a = qw(a b # c) ;
+
+ umask: argument is missing initial 0
+ umask 3;
+
+ %s (...) interpreted as function
+ print ("")
+ printf ("")
+ sort ("")
+
+ Ambiguous use of %c{%s%s} resolved to %c%s%s
+ $a = ${time[2]}
+ $a = ${time{2}}
+
+
+ Ambiguous use of %c{%s} resolved to %c%s
+ $a = ${time}
+ sub fred {} $a = ${fred}
+
+ Misplaced _ in number
+ $a = 1_2;
+ $a = 1_2345_6;
+
+ Bareword \"%s\" refers to nonexistent package
+ $a = FRED:: ;
+
+ Ambiguous call resolved as CORE::%s(), qualify as such or use &
+ sub time {}
+ my $a = time()
+
+ Unrecognized escape \\%c passed through
+ $a = "\m" ;
+
+ %s number > %s non-portable
+ my $a = 0b011111111111111111111111111111110 ;
+ $a = 0b011111111111111111111111111111111 ;
+ $a = 0b111111111111111111111111111111111 ;
+ $a = 0x0fffffffe ;
+ $a = 0x0ffffffff ;
+ $a = 0x1ffffffff ;
+ $a = 0037777777776 ;
+ $a = 0037777777777 ;
+ $a = 0047777777777 ;
+
+ Integer overflow in binary number
+ my $a = 0b011111111111111111111111111111110 ;
+ $a = 0b011111111111111111111111111111111 ;
+ $a = 0b111111111111111111111111111111111 ;
+ $a = 0x0fffffffe ;
+ $a = 0x0ffffffff ;
+ $a = 0x1ffffffff ;
+ $a = 0037777777776 ;
+ $a = 0037777777777 ;
+ $a = 0047777777777 ;
+
+ Mandatory Warnings
+ ------------------
+ Use of "%s" without parentheses is ambiguous [check_uni]
+ rand + 4
+
+ Ambiguous use of -%s resolved as -&%s() [yylex]
+ sub fred {} ; - fred ;
+
+ Precedence problem: open %.*s should be open(%.*s) [yylex]
+ open FOO || die;
+
+ Operator or semicolon missing before %c%s [yylex]
+ Ambiguous use of %c resolved as operator %c
+ *foo *foo
+
+__END__
+# toke.c
+use warnings 'deprecated' ;
+1 if $a EQ $b ;
+1 if $a NE $b ;
+1 if $a GT $b ;
+1 if $a LT $b ;
+1 if $a GE $b ;
+1 if $a LE $b ;
+no warnings 'deprecated' ;
+1 if $a EQ $b ;
+1 if $a NE $b ;
+1 if $a GT $b ;
+1 if $a LT $b ;
+1 if $a GE $b ;
+1 if $a LE $b ;
+EXPECT
+Use of EQ is deprecated at - line 3.
+Use of NE is deprecated at - line 4.
+Use of GT is deprecated at - line 5.
+Use of LT is deprecated at - line 6.
+Use of GE is deprecated at - line 7.
+Use of LE is deprecated at - line 8.
+########
+# toke.c
+use warnings 'deprecated' ;
+format STDOUT =
+@<<< @||| @>>> @>>>
+$a $b "abc" 'def'
+.
+no warnings 'deprecated' ;
+format STDOUT =
+@<<< @||| @>>> @>>>
+$a $b "abc" 'def'
+.
+EXPECT
+Use of comma-less variable list is deprecated at - line 5.
+Use of comma-less variable list is deprecated at - line 5.
+Use of comma-less variable list is deprecated at - line 5.
+########
+# toke.c
+use warnings 'deprecated' ;
+$a = <<;
+
+no warnings 'deprecated' ;
+$a = <<;
+
+EXPECT
+Use of bare << to mean <<"" is deprecated at - line 3.
+########
+# toke.c
+use warnings 'syntax' ;
+s/(abc)/\1/;
+no warnings 'syntax' ;
+s/(abc)/\1/;
+EXPECT
+\1 better written as $1 at - line 3.
+########
+# toke.c
+use warnings 'semicolon' ;
+$a = 1
+&time ;
+no warnings 'semicolon' ;
+$a = 1
+&time ;
+EXPECT
+Semicolon seems to be missing at - line 3.
+########
+# toke.c
+BEGIN {
+ # Scalars leaked: due to syntax errors
+ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
+}
+use warnings 'syntax' ;
+my $a =+ 2 ;
+$a =- 2 ;
+$a =* 2 ;
+$a =% 2 ;
+$a =& 2 ;
+$a =. 2 ;
+$a =^ 2 ;
+$a =| 2 ;
+$a =< 2 ;
+$a =/ 2 ;
+EXPECT
+Reversed += operator at - line 7.
+Reversed -= operator at - line 8.
+Reversed *= operator at - line 9.
+Reversed %= operator at - line 10.
+Reversed &= operator at - line 11.
+Reversed .= operator at - line 12.
+syntax error at - line 12, near "=."
+Reversed ^= operator at - line 13.
+syntax error at - line 13, near "=^"
+Reversed |= operator at - line 14.
+syntax error at - line 14, near "=|"
+Reversed <= operator at - line 15.
+Unterminated <> operator at - line 15.
+########
+# toke.c
+BEGIN {
+ # Scalars leaked: due to syntax errors
+ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
+}
+no warnings 'syntax' ;
+my $a =+ 2 ;
+$a =- 2 ;
+$a =* 2 ;
+$a =% 2 ;
+$a =& 2 ;
+$a =. 2 ;
+$a =^ 2 ;
+$a =| 2 ;
+$a =< 2 ;
+$a =/ 2 ;
+EXPECT
+syntax error at - line 12, near "=."
+syntax error at - line 13, near "=^"
+syntax error at - line 14, near "=|"
+Unterminated <> operator at - line 15.
+########
+# toke.c
+use warnings 'syntax' ;
+my $a = $a[1,2] ;
+no warnings 'syntax' ;
+my $a = $a[1,2] ;
+EXPECT
+Multidimensional syntax $a[1,2] not supported at - line 3.
+########
+# toke.c
+use warnings 'syntax' ;
+sub fred {} ; $SIG{TERM} = fred;
+no warnings 'syntax' ;
+$SIG{TERM} = fred;
+EXPECT
+You need to quote "fred" at - line 3.
+########
+# toke.c
+use warnings 'syntax' ;
+@a[3] = 2;
+@a{3} = 2;
+no warnings 'syntax' ;
+@a[3] = 2;
+@a{3} = 2;
+EXPECT
+Scalar value @a[3] better written as $a[3] at - line 3.
+Scalar value @a{3} better written as $a{3} at - line 4.
+########
+# toke.c
+use warnings 'syntax' ;
+$_ = "ab" ;
+s/(ab)/\1/e;
+no warnings 'syntax' ;
+$_ = "ab" ;
+s/(ab)/\1/e;
+EXPECT
+Can't use \1 to mean $1 in expression at - line 4.
+########
+# toke.c
+use warnings 'reserved' ;
+$a = abc;
+no warnings 'reserved' ;
+$a = abc;
+EXPECT
+Unquoted string "abc" may clash with future reserved word at - line 3.
+########
+# toke.c
+use warnings 'chmod' ;
+chmod 3;
+no warnings 'chmod' ;
+chmod 3;
+EXPECT
+chmod() mode argument is missing initial 0 at - line 3.
+########
+# toke.c
+use warnings 'qw' ;
+@a = qw(a, b, c) ;
+no warnings 'qw' ;
+@a = qw(a, b, c) ;
+EXPECT
+Possible attempt to separate words with commas at - line 3.
+########
+# toke.c
+use warnings 'qw' ;
+@a = qw(a b #) ;
+no warnings 'qw' ;
+@a = qw(a b #) ;
+EXPECT
+Possible attempt to put comments in qw() list at - line 3.
+########
+# toke.c
+use warnings 'umask' ;
+umask 3;
+no warnings 'umask' ;
+umask 3;
+EXPECT
+umask: argument is missing initial 0 at - line 3.
+########
+# toke.c
+use warnings 'syntax' ;
+print ("")
+EXPECT
+print (...) interpreted as function at - line 3.
+########
+# toke.c
+no warnings 'syntax' ;
+print ("")
+EXPECT
+
+########
+# toke.c
+use warnings 'syntax' ;
+printf ("")
+EXPECT
+printf (...) interpreted as function at - line 3.
+########
+# toke.c
+no warnings 'syntax' ;
+printf ("")
+EXPECT
+
+########
+# toke.c
+use warnings 'syntax' ;
+sort ("")
+EXPECT
+sort (...) interpreted as function at - line 3.
+########
+# toke.c
+no warnings 'syntax' ;
+sort ("")
+EXPECT
+
+########
+# toke.c
+use warnings 'ambiguous' ;
+$a = ${time[2]};
+no warnings 'ambiguous' ;
+$a = ${time[2]};
+EXPECT
+Ambiguous use of ${time[...]} resolved to $time[...] at - line 3.
+########
+# toke.c
+use warnings 'ambiguous' ;
+$a = ${time{2}};
+EXPECT
+Ambiguous use of ${time{...}} resolved to $time{...} at - line 3.
+########
+# toke.c
+no warnings 'ambiguous' ;
+$a = ${time{2}};
+EXPECT
+
+########
+# toke.c
+use warnings 'ambiguous' ;
+$a = ${time} ;
+no warnings 'ambiguous' ;
+$a = ${time} ;
+EXPECT
+Ambiguous use of ${time} resolved to $time at - line 3.
+########
+# toke.c
+use warnings 'ambiguous' ;
+sub fred {}
+$a = ${fred} ;
+no warnings 'ambiguous' ;
+$a = ${fred} ;
+EXPECT
+Ambiguous use of ${fred} resolved to $fred at - line 4.
+########
+# toke.c
+use warnings 'syntax' ;
+$a = 1_2;
+$a = 1_2345_6;
+no warnings 'syntax' ;
+$a = 1_2;
+$a = 1_2345_6;
+EXPECT
+Misplaced _ in number at - line 3.
+Misplaced _ in number at - line 4.
+Misplaced _ in number at - line 4.
+########
+# toke.c
+use warnings 'bareword' ;
+#line 25 "bar"
+$a = FRED:: ;
+no warnings 'bareword' ;
+#line 25 "bar"
+$a = FRED:: ;
+EXPECT
+Bareword "FRED::" refers to nonexistent package at bar line 25.
+########
+# toke.c
+use warnings 'ambiguous' ;
+sub time {}
+my $a = time() ;
+no warnings 'ambiguous' ;
+my $b = time() ;
+EXPECT
+Ambiguous call resolved as CORE::time(), qualify as such or use & at - line 4.
+########
+# toke.c
+use warnings ;
+eval <<'EOE';
+{
+#line 30 "foo"
+ $_ = " \x{123} " ;
+}
+EOE
+EXPECT
+
+########
+# toke.c
+my $a = rand + 4 ;
+EXPECT
+Warning: Use of "rand" without parens is ambiguous at - line 2.
+########
+# toke.c
+$^W = 0 ;
+my $a = rand + 4 ;
+{
+ no warnings 'ambiguous' ;
+ $a = rand + 4 ;
+ use warnings 'ambiguous' ;
+ $a = rand + 4 ;
+}
+$a = rand + 4 ;
+EXPECT
+Warning: Use of "rand" without parens is ambiguous at - line 3.
+Warning: Use of "rand" without parens is ambiguous at - line 8.
+Warning: Use of "rand" without parens is ambiguous at - line 10.
+########
+# toke.c
+sub fred {};
+-fred ;
+EXPECT
+Ambiguous use of -fred resolved as -&fred() at - line 3.
+########
+# toke.c
+$^W = 0 ;
+sub fred {} ;
+-fred ;
+{
+ no warnings 'ambiguous' ;
+ -fred ;
+ use warnings 'ambiguous' ;
+ -fred ;
+}
+-fred ;
+EXPECT
+Ambiguous use of -fred resolved as -&fred() at - line 4.
+Ambiguous use of -fred resolved as -&fred() at - line 9.
+Ambiguous use of -fred resolved as -&fred() at - line 11.
+########
+# toke.c
+open FOO || time;
+EXPECT
+Precedence problem: open FOO should be open(FOO) at - line 2.
+########
+# toke.c
+$^W = 0 ;
+open FOO || time;
+{
+ no warnings 'precedence' ;
+ open FOO || time;
+ use warnings 'precedence' ;
+ open FOO || time;
+}
+open FOO || time;
+EXPECT
+Precedence problem: open FOO should be open(FOO) at - line 3.
+Precedence problem: open FOO should be open(FOO) at - line 8.
+Precedence problem: open FOO should be open(FOO) at - line 10.
+########
+# toke.c
+$^W = 0 ;
+*foo *foo ;
+{
+ no warnings 'ambiguous' ;
+ *foo *foo ;
+ use warnings 'ambiguous' ;
+ *foo *foo ;
+}
+*foo *foo ;
+EXPECT
+Operator or semicolon missing before *foo at - line 3.
+Ambiguous use of * resolved as operator * at - line 3.
+Operator or semicolon missing before *foo at - line 8.
+Ambiguous use of * resolved as operator * at - line 8.
+Operator or semicolon missing before *foo at - line 10.
+Ambiguous use of * resolved as operator * at - line 10.
+########
+# toke.c
+use warnings 'misc' ;
+my $a = "\m" ;
+no warnings 'misc' ;
+$a = "\m" ;
+EXPECT
+Unrecognized escape \m passed through at - line 3.
+########
+# toke.c
+use warnings 'portable' ;
+my $a = 0b011111111111111111111111111111110 ;
+ $a = 0b011111111111111111111111111111111 ;
+ $a = 0b111111111111111111111111111111111 ;
+ $a = 0x0fffffffe ;
+ $a = 0x0ffffffff ;
+ $a = 0x1ffffffff ;
+ $a = 0037777777776 ;
+ $a = 0037777777777 ;
+ $a = 0047777777777 ;
+no warnings 'portable' ;
+ $a = 0b011111111111111111111111111111110 ;
+ $a = 0b011111111111111111111111111111111 ;
+ $a = 0b111111111111111111111111111111111 ;
+ $a = 0x0fffffffe ;
+ $a = 0x0ffffffff ;
+ $a = 0x1ffffffff ;
+ $a = 0037777777776 ;
+ $a = 0037777777777 ;
+ $a = 0047777777777 ;
+EXPECT
+Binary number > 0b11111111111111111111111111111111 non-portable at - line 5.
+Hexadecimal number > 0xffffffff non-portable at - line 8.
+Octal number > 037777777777 non-portable at - line 11.
+########
+# toke.c
+use warnings 'overflow' ;
+my $a = 0b011111111111111111111111111111110 ;
+ $a = 0b011111111111111111111111111111111 ;
+ $a = 0b10000000000000000000000000000000000000000000000000000000000000000 ;
+ $a = 0x0fffffffe ;
+ $a = 0x0ffffffff ;
+ $a = 0x10000000000000000 ;
+ $a = 0037777777776 ;
+ $a = 0037777777777 ;
+ $a = 002000000000000000000000;
+no warnings 'overflow' ;
+ $a = 0b011111111111111111111111111111110 ;
+ $a = 0b011111111111111111111111111111111 ;
+ $a = 0b10000000000000000000000000000000000000000000000000000000000000000 ;
+ $a = 0x0fffffffe ;
+ $a = 0x0ffffffff ;
+ $a = 0x10000000000000000 ;
+ $a = 0037777777776 ;
+ $a = 0037777777777 ;
+ $a = 002000000000000000000000;
+EXPECT
+Integer overflow in binary number at - line 5.
+Integer overflow in hexadecimal number at - line 8.
+Integer overflow in octal number at - line 11.
diff --git a/contrib/perl5/t/pragma/warn/universal b/contrib/perl5/t/pragma/warn/universal
new file mode 100644
index 0000000..6dbb1be
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/universal
@@ -0,0 +1,16 @@
+ universal.c AOK
+
+ Can't locate package %s for @%s::ISA [S_isa_lookup]
+
+
+
+__END__
+# universal.c [S_isa_lookup]
+use warnings 'misc' ;
+@ISA = qw(Joe) ;
+my $a = bless [] ;
+UNIVERSAL::isa $a, Jim ;
+EXPECT
+Can't locate package Joe for @main::ISA at - line 5.
+Can't locate package Joe for @main::ISA.
+Can't locate package Joe for @main::ISA.
diff --git a/contrib/perl5/t/pragma/warn/utf8 b/contrib/perl5/t/pragma/warn/utf8
new file mode 100644
index 0000000..6a2fe54
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/utf8
@@ -0,0 +1,29 @@
+
+ utf8.c AOK
+
+ [utf8_to_uv]
+ Malformed UTF-8 character
+ my $a = ord "\x80" ;
+
+ Malformed UTF-8 character
+ my $a = ord "\xf080" ;
+ <<<<<< this warning can't be easily triggered from perl anymore
+
+ [utf16_to_utf8]
+ Malformed UTF-16 surrogate
+ <<<<<< Add a test when somethig actually calls utf16_to_utf8
+
+__END__
+# utf8.c [utf8_to_uv] -W
+use utf8 ;
+my $a = "snøstorm" ;
+{
+ no warnings 'utf8' ;
+ my $a = "snøstorm";
+ use warnings 'utf8' ;
+ my $a = "snøstorm";
+}
+EXPECT
+Malformed UTF-8 character at - line 3.
+Malformed UTF-8 character at - line 8.
+########
diff --git a/contrib/perl5/t/pragma/warn/util b/contrib/perl5/t/pragma/warn/util
new file mode 100644
index 0000000..e82d6a6
--- /dev/null
+++ b/contrib/perl5/t/pragma/warn/util
@@ -0,0 +1,108 @@
+ util.c AOK
+
+ Illegal octal digit ignored
+ my $a = oct "029" ;
+
+ Illegal hex digit ignored
+ my $a = hex "0xv9" ;
+
+ Illegal binary digit ignored
+ my $a = oct "0b9" ;
+
+ Integer overflow in binary number
+ my $a = oct "0b111111111111111111111111111111111111111111" ;
+ Binary number > 0b11111111111111111111111111111111 non-portable
+ $a = oct "0b111111111111111111111111111111111" ;
+ Integer overflow in octal number
+ my $a = oct "077777777777777777777777777777" ;
+ Octal number > 037777777777 non-portable
+ $a = oct "0047777777777" ;
+ Integer overflow in hexadecimal number
+ my $a = hex "0xffffffffffffffffffff" ;
+ Hexadecimal number > 0xffffffff non-portable
+ $a = hex "0x1ffffffff" ;
+
+__END__
+# util.c
+use warnings 'digit' ;
+my $a = oct "029" ;
+no warnings 'digit' ;
+$a = oct "029" ;
+EXPECT
+Illegal octal digit '9' ignored at - line 3.
+########
+# util.c
+use warnings 'digit' ;
+my $a = hex "0xv9" ;
+no warnings 'digit' ;
+$a = hex "0xv9" ;
+EXPECT
+Illegal hexadecimal digit 'v' ignored at - line 3.
+########
+# util.c
+use warnings 'digit' ;
+my $a = oct "0b9" ;
+no warnings 'digit' ;
+$a = oct "0b9" ;
+EXPECT
+Illegal binary digit '9' ignored at - line 3.
+########
+# util.c
+use warnings 'overflow' ;
+my $a = oct "0b11111111111111111111111111111111111111111111111111111111111111111";
+no warnings 'overflow' ;
+$a = oct "0b11111111111111111111111111111111111111111111111111111111111111111";
+EXPECT
+Integer overflow in binary number at - line 3.
+########
+# util.c
+use warnings 'overflow' ;
+my $a = hex "0xffffffffffffffffffff" ;
+no warnings 'overflow' ;
+$a = hex "0xffffffffffffffffffff" ;
+EXPECT
+Integer overflow in hexadecimal number at - line 3.
+########
+# util.c
+use warnings 'overflow' ;
+my $a = oct "077777777777777777777777777777" ;
+no warnings 'overflow' ;
+$a = oct "077777777777777777777777777777" ;
+EXPECT
+Integer overflow in octal number at - line 3.
+########
+# util.c
+use warnings 'portable' ;
+my $a = oct "0b011111111111111111111111111111110" ;
+ $a = oct "0b011111111111111111111111111111111" ;
+ $a = oct "0b111111111111111111111111111111111" ;
+no warnings 'portable' ;
+ $a = oct "0b011111111111111111111111111111110" ;
+ $a = oct "0b011111111111111111111111111111111" ;
+ $a = oct "0b111111111111111111111111111111111" ;
+EXPECT
+Binary number > 0b11111111111111111111111111111111 non-portable at - line 5.
+########
+# util.c
+use warnings 'portable' ;
+my $a = hex "0x0fffffffe" ;
+ $a = hex "0x0ffffffff" ;
+ $a = hex "0x1ffffffff" ;
+no warnings 'portable' ;
+ $a = hex "0x0fffffffe" ;
+ $a = hex "0x0ffffffff" ;
+ $a = hex "0x1ffffffff" ;
+EXPECT
+Hexadecimal number > 0xffffffff non-portable at - line 5.
+########
+# util.c
+use warnings 'portable' ;
+my $a = oct "0037777777776" ;
+ $a = oct "0037777777777" ;
+ $a = oct "0047777777777" ;
+no warnings 'portable' ;
+ $a = oct "0037777777776" ;
+ $a = oct "0037777777777" ;
+ $a = oct "0047777777777" ;
+EXPECT
+Octal number > 037777777777 non-portable at - line 5.
diff --git a/contrib/perl5/t/pragma/warnings.t b/contrib/perl5/t/pragma/warnings.t
new file mode 100755
index 0000000..71fb0df
--- /dev/null
+++ b/contrib/perl5/t/pragma/warnings.t
@@ -0,0 +1,121 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ $ENV{PERL5LIB} = '../lib';
+ require Config; import Config;
+}
+
+$| = 1;
+
+my $Is_VMS = $^O eq 'VMS';
+my $Is_MSWin32 = $^O eq 'MSWin32';
+my $tmpfile = "tmp0000";
+my $i = 0 ;
+1 while -f ++$tmpfile;
+END { if ($tmpfile) { 1 while unlink $tmpfile} }
+
+my @prgs = () ;
+my @w_files = () ;
+
+if (@ARGV)
+ { print "ARGV = [@ARGV]\n" ; @w_files = map { s#^#./pragma/warn/#; $_ } @ARGV }
+else
+ { @w_files = sort glob("pragma/warn/*") }
+
+foreach (@w_files) {
+
+ next if /\.orig$/ ;
+
+ next if /(~|\.orig)$/;
+
+ open F, "<$_" or die "Cannot open $_: $!\n" ;
+ while (<F>) {
+ last if /^__END__/ ;
+ }
+
+ {
+ local $/ = undef;
+ @prgs = (@prgs, split "\n########\n", <F>) ;
+ }
+ close F ;
+}
+
+undef $/;
+
+print "1..", scalar @prgs, "\n";
+
+
+for (@prgs){
+ my $switch = "";
+ my @temps = () ;
+ if (s/^\s*-\w+//){
+ $switch = $&;
+ $switch =~ s/(-\S*[A-Z]\S*)/"$1"/ if $Is_VMS; # protect uc switches
+ }
+ my($prog,$expected) = split(/\nEXPECT\n/, $_);
+ if ( $prog =~ /--FILE--/) {
+ my(@files) = split(/\n--FILE--\s*([^\s\n]*)\s*\n/, $prog) ;
+ shift @files ;
+ die "Internal error test $i didn't split into pairs, got " .
+ scalar(@files) . "[" . join("%%%%", @files) ."]\n"
+ if @files % 2 ;
+ while (@files > 2) {
+ my $filename = shift @files ;
+ my $code = shift @files ;
+ push @temps, $filename ;
+ open F, ">$filename" or die "Cannot open $filename: $!\n" ;
+ print F $code ;
+ close F ;
+ }
+ shift @files ;
+ $prog = shift @files ;
+ }
+ open TEST, ">$tmpfile";
+ print TEST $prog,"\n";
+ close TEST;
+ my $results = $Is_VMS ?
+ `./perl "-I../lib" $switch $tmpfile 2>&1` :
+ $Is_MSWin32 ?
+ `.\\perl -I../lib $switch $tmpfile 2>&1` :
+ `./perl -I../lib $switch $tmpfile 2>&1`;
+ my $status = $?;
+ $results =~ s/\n+$//;
+ # allow expected output to be written as if $prog is on STDIN
+ $results =~ s/tmp\d+/-/g;
+ $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg
+# bison says 'parse error' instead of 'syntax error',
+# various yaccs may or may not capitalize 'syntax'.
+ $results =~ s/^(syntax|parse) error/syntax error/mig;
+ # allow all tests to run when there are leaks
+ $results =~ s/Scalars leaked: \d+\n//g;
+ $expected =~ s/\n+$//;
+ my $prefix = ($results =~ s#^PREFIX(\n|$)##) ;
+ # any special options? (OPTIONS foo bar zap)
+ my $option_regex = 0;
+ if ($expected =~ s/^OPTIONS? (.+)\n//) {
+ foreach my $option (split(' ', $1)) {
+ if ($option eq 'regex') { # allow regular expressions
+ $option_regex = 1;
+ } else {
+ die "$0: Unknown OPTION '$option'\n";
+ }
+ }
+ }
+ if ( $results =~ s/^SKIPPED\n//) {
+ print "$results\n" ;
+ }
+ elsif (($prefix && (( $option_regex && $results !~ /^$expected/) ||
+ (!$option_regex && $results !~ /^\Q$expected/))) or
+ (!$prefix && (( $option_regex && $results !~ /^$expected/) ||
+ (!$option_regex && $results ne $expected)))) {
+ print STDERR "PROG: $switch\n$prog\n";
+ print STDERR "EXPECTED:\n$expected\n";
+ print STDERR "GOT:\n$results\n";
+ print "not ";
+ }
+ print "ok ", ++$i, "\n";
+ foreach (@temps)
+ { unlink $_ if $_ }
+}
diff --git a/contrib/perl5/taint.c b/contrib/perl5/taint.c
index d5f8339..0f0ce98 100644
--- a/contrib/perl5/taint.c
+++ b/contrib/perl5/taint.c
@@ -5,20 +5,23 @@
*/
#include "EXTERN.h"
+#define PERL_IN_TAINT_C
#include "perl.h"
void
-taint_proper(const char *f, char *s)
+Perl_taint_proper(pTHX_ const char *f, const char *s)
{
dTHR; /* just for taint */
char *ug;
+#ifdef HAS_SETEUID
DEBUG_u(PerlIO_printf(Perl_debug_log,
- "%s %d %d %d\n", s, PL_tainted, PL_uid, PL_euid));
+ "%s %d %"Uid_t_f" %"Uid_t_f"\n", s, PL_tainted, PL_uid, PL_euid));
+#endif
if (PL_tainted) {
if (!f)
- f = no_security;
+ f = PL_no_security;
if (PL_euid != PL_uid)
ug = " while running setuid";
else if (PL_egid != PL_gid)
@@ -26,14 +29,14 @@ taint_proper(const char *f, char *s)
else
ug = " while running with -T switch";
if (!PL_unsafe)
- croak(f, s, ug);
- else if (PL_dowarn)
- warn(f, s, ug);
+ Perl_croak(aTHX_ f, s, ug);
+ else if (ckWARN(WARN_TAINT))
+ Perl_warner(aTHX_ WARN_TAINT, f, s, ug);
}
}
void
-taint_env(void)
+Perl_taint_env(pTHX)
{
SV** svp;
MAGIC* mg;
@@ -46,7 +49,7 @@ taint_env(void)
NULL
};
- if(!PL_envgv)
+ if (!PL_envgv)
return;
#ifdef VMS
diff --git a/contrib/perl5/thrdvar.h b/contrib/perl5/thrdvar.h
index 4ca3ccb..e4cfacc 100644
--- a/contrib/perl5/thrdvar.h
+++ b/contrib/perl5/thrdvar.h
@@ -10,13 +10,14 @@
*
* When building without USE_THREADS, these variables will be truly global.
* When building without USE_THREADS but with MULTIPLICITY, these variables
- * will be global per-interpreter.
- *
- * Avoid build-specific #ifdefs here, like DEBUGGING. That way,
- * we can keep binary compatibility of the curinterp structure */
+ * will be global per-interpreter. */
/* Important ones in the first cache line (if alignment is done right) */
+#ifdef USE_THREADS
+PERLVAR(interp, PerlInterpreter*) /* thread owner */
+#endif
+
PERLVAR(Tstack_sp, SV **) /* top of the stack */
#ifdef OP_IN_REGISTER
PERLVAR(Topsave, OP *)
@@ -53,6 +54,20 @@ PERLVAR(Tretstack_max, I32)
PERLVAR(TSv, SV *) /* used to hold temporary values */
PERLVAR(TXpv, XPV *) /* used to hold temporary values */
+/*
+=for apidoc Amn|STRLEN|PL_na
+
+A convenience variable which is typically used with C<SvPV> when one
+doesn't care about the length of the string. It is usually more efficient
+to either declare a local variable and use that instead or to use the
+C<SvPV_nolen> macro.
+
+=cut
+*/
+
+PERLVAR(Tna, STRLEN) /* for use in SvPV when length is
+ Not Applicable */
+
/* stat stuff */
PERLVAR(Tstatbuf, Stat_t)
PERLVAR(Tstatcache, Stat_t) /* _ */
@@ -85,14 +100,19 @@ PERLVAR(Trestartop, OP *) /* propagating an error from croak? */
PERLVARI(Tcurcop, COP * VOL, &PL_compiling)
PERLVAR(Tin_eval, VOL int) /* trap "fatal" errors? */
PERLVAR(Tdelaymagic, int) /* ($<,$>) = ... */
-PERLVAR(Tdirty, bool) /* in the middle of tearing things down? */
+PERLVARI(Tdirty, bool, FALSE) /* in the middle of tearing things down? */
PERLVAR(Tlocalizing, int) /* are we processing a local() list? */
PERLVAR(Tcurstack, AV *) /* THE STACK */
PERLVAR(Tcurstackinfo, PERL_SI *) /* current stack + context */
PERLVAR(Tmainstack, AV *) /* the stack when nothing funny is happening */
+
PERLVAR(Ttop_env, JMPENV *) /* ptr. to current sigjmp() environment */
PERLVAR(Tstart_env, JMPENV) /* empty startup sigjmp() environment */
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+PERLVARI(Tprotect, protect_proc_t, MEMBER_TO_FPTR(Perl_default_protect))
+#endif
+PERLVARI(Terrors, SV *, Nullsv) /* outstanding queued errors */
/* statics "owned" by various functions */
PERLVAR(Tav_fetch_sv, SV *) /* owned by av_fetch() */
@@ -102,6 +122,7 @@ PERLVAR(Thv_fetch_ent_mh, HE) /* owned by hv_fetch_ent() */
PERLVAR(Tmodcount, I32) /* how much mod()ification in assignment? */
PERLVAR(Tlastgotoprobe, OP*) /* from pp_ctl.c */
+PERLVARI(Tdumpindent, I32, 4) /* # of blanks per dump indentation level */
/* sort stuff */
PERLVAR(Tsortcop, OP *) /* user defined sort routine */
@@ -110,6 +131,10 @@ PERLVAR(Tfirstgv, GV *) /* $a */
PERLVAR(Tsecondgv, GV *) /* $b */
PERLVAR(Tsortcxix, I32) /* from pp_ctl.c */
+/* float buffer */
+PERLVAR(Tefloatbuf, char*)
+PERLVAR(Tefloatsize, STRLEN)
+
/* regex stuff */
PERLVAR(Tscreamfirst, I32 *)
@@ -133,12 +158,13 @@ PERLVAR(Tseen_evals, I32) /* from regcomp.c */
PERLVAR(Tregcomp_rx, regexp *) /* from regcomp.c */
PERLVAR(Textralen, I32) /* from regcomp.c */
PERLVAR(Tcolorset, int) /* from regcomp.c */
-PERLVAR(Tcolors[4], char *) /* from regcomp.c */
+PERLVARA(Tcolors,6, char *) /* from regcomp.c */
+PERLVAR(Treg_whilem_seen, I32) /* number of WHILEM in this expr */
PERLVAR(Treginput, char *) /* String-input pointer. */
PERLVAR(Tregbol, char *) /* Beginning of input, for ^ check. */
PERLVAR(Tregeol, char *) /* End of input, for $ check. */
-PERLVAR(Tregstartp, char **) /* Pointer to startp array. */
-PERLVAR(Tregendp, char **) /* Ditto for endp. */
+PERLVAR(Tregstartp, I32 *) /* Pointer to startp array. */
+PERLVAR(Tregendp, I32 *) /* Ditto for endp. */
PERLVAR(Treglastparen, U32 *) /* Similarly for lastparen. */
PERLVAR(Tregtill, char *) /* How far we are required to go. */
PERLVAR(Tregprev, char) /* char before regbol, \n if none */
@@ -153,14 +179,37 @@ PERLVAR(Tregnarrate, I32) /* from regexec.c */
PERLVAR(Tregprogram, regnode *) /* from regexec.c */
PERLVARI(Tregindent, int, 0) /* from regexec.c */
PERLVAR(Tregcc, CURCUR *) /* from regexec.c */
+PERLVAR(Treg_call_cc, struct re_cc_state *) /* from regexec.c */
+PERLVAR(Treg_re, regexp *) /* from regexec.c */
+PERLVAR(Treg_ganch, char *) /* position of \G */
+PERLVAR(Treg_sv, SV *) /* what we match against */
+PERLVAR(Treg_magic, MAGIC *) /* pos-magic of what we match */
+PERLVAR(Treg_oldpos, I32) /* old pos of what we match */
+PERLVARI(Treg_oldcurpm, PMOP*, NULL) /* curpm before match */
+PERLVARI(Treg_curpm, PMOP*, NULL) /* curpm during match */
+PERLVAR(Treg_oldsaved, char*) /* old saved substr during match */
+PERLVAR(Treg_oldsavedlen, STRLEN) /* old length of saved substr during match */
+PERLVAR(Treg_maxiter, I32) /* max wait until caching pos */
+PERLVAR(Treg_leftiter, I32) /* wait until caching pos */
+PERLVARI(Treg_poscache, char *, Nullch) /* cache of pos of WHILEM */
+PERLVAR(Treg_poscache_size, STRLEN) /* size of pos cache of WHILEM */
+
+PERLVARI(Tregcompp, regcomp_t, MEMBER_TO_FPTR(Perl_pregcomp))
+ /* Pointer to REx compiler */
+PERLVARI(Tregexecp, regexec_t, MEMBER_TO_FPTR(Perl_regexec_flags))
+ /* Pointer to REx executer */
+PERLVARI(Tregint_start, re_intuit_start_t, MEMBER_TO_FPTR(Perl_re_intuit_start))
+ /* Pointer to optimized REx executer */
+PERLVARI(Tregint_string,re_intuit_string_t, MEMBER_TO_FPTR(Perl_re_intuit_string))
+ /* Pointer to optimized REx string */
+PERLVARI(Tregfree, regfree_t, MEMBER_TO_FPTR(Perl_pregfree))
+ /* Pointer to REx free()er */
-PERLVARI(Tregcompp, regcomp_t, FUNC_NAME_TO_PTR(pregcomp))
- /* Pointer to RE compiler */
-PERLVARI(Tregexecp, regexec_t, FUNC_NAME_TO_PTR(regexec_flags))
- /* Pointer to RE executer */
PERLVARI(Treginterp_cnt,int, 0) /* Whether `Regexp'
was interpolated. */
-
+PERLVARI(Treg_starttry, char *, 0) /* -Dr: where regtry was called. */
+PERLVARI(Twatchaddr, char **, 0)
+PERLVAR(Twatchok, char *)
/* Note that the variables below are all explicitly referenced in the code
* as thr->whatever and therefore don't need the 'T' prefix. */
@@ -175,7 +224,6 @@ PERLVAR(threadsv, AV *) /* Per-thread SVs ($_, $@ etc.) */
PERLVAR(threadsvp, SV **) /* AvARRAY(threadsv) */
PERLVAR(specific, AV *) /* Thread-specific user data */
PERLVAR(errsv, SV *) /* Backing SV for $@ */
-PERLVAR(errhv, HV *) /* HV for what was %@ in pp_ctl.c */
PERLVAR(mutex, perl_mutex) /* For the fields others can change */
PERLVAR(tid, U32)
PERLVAR(prev, struct perl_thread *)
diff --git a/contrib/perl5/thread.h b/contrib/perl5/thread.h
index 089077c..0ea9e74 100644
--- a/contrib/perl5/thread.h
+++ b/contrib/perl5/thread.h
@@ -1,37 +1,60 @@
-#ifdef USE_THREADS
+#if defined(USE_THREADS) || defined(USE_ITHREADS)
#ifdef WIN32
# include <win32thread.h>
#else
-
-#ifndef DJGPP
-/* POSIXish threads */
-#ifdef OLD_PTHREADS_API
-# define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
-# define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
-# define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
-# define YIELD pthread_yield()
-# define DETACH(t) \
- STMT_START { \
- if (pthread_detach(&(t)->self)) { \
- MUTEX_UNLOCK(&(t)->mutex); \
- croak("panic: DETACH"); \
- } \
+# ifdef OLD_PTHREADS_API /* Here be dragons. */
+# define DETACH(t) \
+ STMT_START { \
+ if (pthread_detach(&(t)->self)) { \
+ MUTEX_UNLOCK(&(t)->mutex); \
+ Perl_croak_nocontext("panic: DETACH"); \
+ } \
} STMT_END
-#else
-# define pthread_mutexattr_default NULL
-# define pthread_condattr_default NULL
-#endif /* OLD_PTHREADS_API */
+
+# define PERL_GET_CONTEXT Perl_get_context()
+# define PERL_SET_CONTEXT(t) Perl_set_context((void*)t)
+
+# define PTHREAD_GETSPECIFIC_INT
+# ifdef DJGPP
+# define pthread_addr_t any_t
+# define NEED_PTHREAD_INIT
+# define PTHREAD_CREATE_JOINABLE (1)
+# endif
+# ifdef __OPEN_VM
+# define pthread_addr_t void *
+# endif
+# ifdef VMS
+# define pthread_attr_init(a) pthread_attr_create(a)
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_setdetach_np(a,s)
+# define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
+# define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
+# define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
+# define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
+# endif
+# if defined(DJGPP) || defined(__OPEN_VM)
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,&(s))
+# define YIELD pthread_yield(NULL)
+# endif
+# endif
+# define pthread_mutexattr_default NULL
+# define pthread_condattr_default NULL
#endif
+
+#ifndef PTHREAD_CREATE
+/* You are not supposed to pass NULL as the 2nd arg of PTHREAD_CREATE(). */
+# define PTHREAD_CREATE(t,a,s,d) pthread_create(t,&(a),s,d)
#endif
-#ifdef PTHREADS_CREATED_JOINABLE
-# define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE
-#else
-# ifdef PTHREAD_CREATE_UNDETACHED
-# define ATTR_JOINABLE PTHREAD_CREATE_UNDETACHED
+#ifndef PTHREAD_ATTR_SETDETACHSTATE
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s)
+#endif
+
+#ifndef PTHREAD_CREATE_JOINABLE
+# ifdef OLD_PTHREAD_CREATE_JOINABLE
+# define PTHREAD_CREATE_JOINABLE OLD_PTHREAD_CREATE_JOINABLE
# else
-# define ATTR_JOINABLE PTHREAD_CREATE_JOINABLE
+# define PTHREAD_CREATE_JOINABLE 0 /* Panic? No, guess. */
# endif
#endif
@@ -41,42 +64,43 @@
/* #include <mach/cthreads.h> is in perl.h #ifdef I_MACH_CTHREADS */
-#define MUTEX_INIT(m) \
- STMT_START { \
- *m = mutex_alloc(); \
- if (*m) { \
- mutex_init(*m); \
- } else { \
- croak("panic: MUTEX_INIT"); \
- } \
- } STMT_END
-
-#define MUTEX_LOCK(m) mutex_lock(*m)
-#define MUTEX_UNLOCK(m) mutex_unlock(*m)
-#define MUTEX_DESTROY(m) \
- STMT_START { \
- mutex_free(*m); \
- *m = 0; \
- } STMT_END
-
-#define COND_INIT(c) \
- STMT_START { \
- *c = condition_alloc(); \
- if (*c) { \
- condition_init(*c); \
- } else { \
- croak("panic: COND_INIT"); \
- } \
- } STMT_END
+#define MUTEX_INIT(m) \
+ STMT_START { \
+ *m = mutex_alloc(); \
+ if (*m) { \
+ mutex_init(*m); \
+ } else { \
+ Perl_croak_nocontext("panic: MUTEX_INIT"); \
+ } \
+ } STMT_END
+
+#define MUTEX_LOCK(m) mutex_lock(*m)
+#define MUTEX_UNLOCK(m) mutex_unlock(*m)
+#define MUTEX_DESTROY(m) \
+ STMT_START { \
+ mutex_free(*m); \
+ *m = 0; \
+ } STMT_END
+
+#define COND_INIT(c) \
+ STMT_START { \
+ *c = condition_alloc(); \
+ if (*c) { \
+ condition_init(*c); \
+ } \
+ else { \
+ Perl_croak_nocontext("panic: COND_INIT"); \
+ } \
+ } STMT_END
#define COND_SIGNAL(c) condition_signal(*c)
#define COND_BROADCAST(c) condition_broadcast(*c)
#define COND_WAIT(c, m) condition_wait(*c, *m)
-#define COND_DESTROY(c) \
- STMT_START { \
- condition_free(*c); \
- *c = 0; \
- } STMT_END
+#define COND_DESTROY(c) \
+ STMT_START { \
+ condition_free(*c); \
+ *c = 0; \
+ } STMT_END
#define THREAD_CREATE(thr, f) (thr->self = cthread_fork(f, thr), 0)
#define THREAD_POST_CREATE(thr)
@@ -87,22 +111,28 @@
#define DETACH(t) cthread_detach(t->self)
#define JOIN(t, avp) (*(avp) = (AV *)cthread_join(t->self))
-#define SET_THR(thr) cthread_set_data(cthread_self(), thr)
-#define THR cthread_data(cthread_self())
+#define PERL_SET_CONTEXT(t) cthread_set_data(cthread_self(), t)
+#define PERL_GET_CONTEXT cthread_data(cthread_self())
#define INIT_THREADS cthread_init()
#define YIELD cthread_yield()
-#define ALLOC_THREAD_KEY
+#define ALLOC_THREAD_KEY NOOP
#define SET_THREAD_SELF(thr) (thr->self = cthread_self())
#endif /* I_MACH_CTHREADS */
#ifndef YIELD
-# ifdef HAS_SCHED_YIELD
-# define YIELD sched_yield()
+# ifdef SCHED_YIELD
+# define YIELD SCHED_YIELD
# else
-# ifdef HAS_PTHREAD_YIELD
-# define YIELD pthread_yield()
+# ifdef HAS_SCHED_YIELD
+# define YIELD sched_yield()
+# else
+# ifdef HAS_PTHREAD_YIELD
+ /* pthread_yield(NULL) platforms are expected
+ * to have #defined YIELD for themselves. */
+# define YIELD pthread_yield()
+# endif
# endif
# endif
#endif
@@ -112,126 +142,130 @@
#endif
#ifndef MUTEX_INIT
-#ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
+
+# ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
/* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */
-#define MUTEX_INIT(m) \
+# define MUTEX_INIT(m) \
STMT_START { \
Zero((m), 1, perl_mutex); \
if (pthread_mutex_init((m), pthread_mutexattr_default)) \
- croak("panic: MUTEX_INIT"); \
+ Perl_croak_nocontext("panic: MUTEX_INIT"); \
} STMT_END
-#else
-#define MUTEX_INIT(m) \
+# else
+# define MUTEX_INIT(m) \
STMT_START { \
if (pthread_mutex_init((m), pthread_mutexattr_default)) \
- croak("panic: MUTEX_INIT"); \
+ Perl_croak_nocontext("panic: MUTEX_INIT"); \
} STMT_END
-#endif
-#define MUTEX_LOCK(m) \
- STMT_START { \
- if (pthread_mutex_lock((m))) \
- croak("panic: MUTEX_LOCK"); \
+# endif
+
+# define MUTEX_LOCK(m) \
+ STMT_START { \
+ if (pthread_mutex_lock((m))) \
+ Perl_croak_nocontext("panic: MUTEX_LOCK"); \
} STMT_END
-#define MUTEX_UNLOCK(m) \
- STMT_START { \
- if (pthread_mutex_unlock((m))) \
- croak("panic: MUTEX_UNLOCK"); \
+
+# define MUTEX_UNLOCK(m) \
+ STMT_START { \
+ if (pthread_mutex_unlock((m))) \
+ Perl_croak_nocontext("panic: MUTEX_UNLOCK"); \
} STMT_END
-#define MUTEX_DESTROY(m) \
- STMT_START { \
- if (pthread_mutex_destroy((m))) \
- croak("panic: MUTEX_DESTROY"); \
+
+# define MUTEX_DESTROY(m) \
+ STMT_START { \
+ if (pthread_mutex_destroy((m))) \
+ Perl_croak_nocontext("panic: MUTEX_DESTROY"); \
} STMT_END
#endif /* MUTEX_INIT */
#ifndef COND_INIT
-#define COND_INIT(c) \
+# define COND_INIT(c) \
STMT_START { \
if (pthread_cond_init((c), pthread_condattr_default)) \
- croak("panic: COND_INIT"); \
+ Perl_croak_nocontext("panic: COND_INIT"); \
} STMT_END
-#define COND_SIGNAL(c) \
- STMT_START { \
- if (pthread_cond_signal((c))) \
- croak("panic: COND_SIGNAL"); \
+
+# define COND_SIGNAL(c) \
+ STMT_START { \
+ if (pthread_cond_signal((c))) \
+ Perl_croak_nocontext("panic: COND_SIGNAL"); \
} STMT_END
-#define COND_BROADCAST(c) \
- STMT_START { \
- if (pthread_cond_broadcast((c))) \
- croak("panic: COND_BROADCAST"); \
+
+# define COND_BROADCAST(c) \
+ STMT_START { \
+ if (pthread_cond_broadcast((c))) \
+ Perl_croak_nocontext("panic: COND_BROADCAST"); \
} STMT_END
-#define COND_WAIT(c, m) \
- STMT_START { \
- if (pthread_cond_wait((c), (m))) \
- croak("panic: COND_WAIT"); \
+
+# define COND_WAIT(c, m) \
+ STMT_START { \
+ if (pthread_cond_wait((c), (m))) \
+ Perl_croak_nocontext("panic: COND_WAIT"); \
} STMT_END
-#define COND_DESTROY(c) \
- STMT_START { \
- if (pthread_cond_destroy((c))) \
- croak("panic: COND_DESTROY"); \
+
+# define COND_DESTROY(c) \
+ STMT_START { \
+ if (pthread_cond_destroy((c))) \
+ Perl_croak_nocontext("panic: COND_DESTROY"); \
} STMT_END
#endif /* COND_INIT */
/* DETACH(t) must only be called while holding t->mutex */
#ifndef DETACH
-#define DETACH(t) \
- STMT_START { \
- if (pthread_detach((t)->self)) { \
- MUTEX_UNLOCK(&(t)->mutex); \
- croak("panic: DETACH"); \
- } \
+# define DETACH(t) \
+ STMT_START { \
+ if (pthread_detach((t)->self)) { \
+ MUTEX_UNLOCK(&(t)->mutex); \
+ Perl_croak_nocontext("panic: DETACH"); \
+ } \
} STMT_END
#endif /* DETACH */
#ifndef JOIN
-#define JOIN(t, avp) \
- STMT_START { \
- if (pthread_join((t)->self, (void**)(avp))) \
- croak("panic: pthread_join"); \
+# define JOIN(t, avp) \
+ STMT_START { \
+ if (pthread_join((t)->self, (void**)(avp))) \
+ Perl_croak_nocontext("panic: pthread_join"); \
} STMT_END
#endif /* JOIN */
-#ifndef SET_THR
-#define SET_THR(t) \
- STMT_START { \
- if (pthread_setspecific(PL_thr_key, (void *) (t))) \
- croak("panic: pthread_setspecific"); \
- } STMT_END
-#endif /* SET_THR */
-
-#ifndef THR
-# ifdef OLD_PTHREADS_API
-struct perl_thread *getTHR _((void));
-# define THR getTHR()
-# else
-# define THR ((struct perl_thread *) pthread_getspecific(PL_thr_key))
-# endif /* OLD_PTHREADS_API */
-#endif /* THR */
+#ifndef PERL_GET_CONTEXT
+# define PERL_GET_CONTEXT pthread_getspecific(PL_thr_key)
+#endif
-/*
- * dTHR is performance-critical. Here, we only do the pthread_get_specific
- * if there may be more than one thread in existence, otherwise we get thr
- * from thrsv which is cached in the per-interpreter structure.
- * Systems with very fast pthread_get_specific (which should be all systems
- * but unfortunately isn't) may wish to simplify to "...*thr = THR".
- *
- * The use of PL_threadnum should be safe here.
- */
-#ifndef dTHR
-# define dTHR \
- struct perl_thread *thr = PL_threadnum? THR : (struct perl_thread*)SvPVX(PL_thrsv)
-#endif /* dTHR */
+#ifndef PERL_SET_CONTEXT
+# define PERL_SET_CONTEXT(t) \
+ STMT_START { \
+ if (pthread_setspecific(PL_thr_key, (void *)(t))) \
+ Perl_croak_nocontext("panic: pthread_setspecific"); \
+ } STMT_END
+#endif /* PERL_SET_CONTEXT */
#ifndef INIT_THREADS
# ifdef NEED_PTHREAD_INIT
# define INIT_THREADS pthread_init()
-# else
-# define INIT_THREADS NOOP
# endif
#endif
+#ifndef ALLOC_THREAD_KEY
+# define ALLOC_THREAD_KEY \
+ STMT_START { \
+ if (pthread_key_create(&PL_thr_key, 0)) { \
+ fprintf(stderr, "panic: pthread_key_create"); \
+ exit(1); \
+ } \
+ } STMT_END
+#endif
+
+#ifndef THREAD_RET_TYPE
+# define THREAD_RET_TYPE void *
+# define THREAD_RET_CAST(p) ((void *)(p))
+#endif /* THREAD_RET */
+
+#if defined(USE_THREADS)
+
/* Accessor for per-thread SVs */
-#define THREADSV(i) (thr->threadsvp[i])
+# define THREADSV(i) (thr->threadsvp[i])
/*
* LOCK_SV_MUTEX and UNLOCK_SV_MUTEX are performance-critical. Here, we
@@ -240,31 +274,12 @@ struct perl_thread *getTHR _((void));
* remove the "if (threadnum) ..." test.
* XXX do NOT use C<if (PL_threadnum) ...> -- it sets up race conditions!
*/
-#define LOCK_SV_MUTEX \
- STMT_START { \
- MUTEX_LOCK(&PL_sv_mutex); \
- } STMT_END
-
-#define UNLOCK_SV_MUTEX \
- STMT_START { \
- MUTEX_UNLOCK(&PL_sv_mutex); \
- } STMT_END
-
-/* Likewise for strtab_mutex */
-#define LOCK_STRTAB_MUTEX \
- STMT_START { \
- MUTEX_LOCK(&PL_strtab_mutex); \
- } STMT_END
-
-#define UNLOCK_STRTAB_MUTEX \
- STMT_START { \
- MUTEX_UNLOCK(&PL_strtab_mutex); \
- } STMT_END
-
-#ifndef THREAD_RET_TYPE
-# define THREAD_RET_TYPE void *
-# define THREAD_RET_CAST(p) ((void *)(p))
-#endif /* THREAD_RET */
+# define LOCK_SV_MUTEX MUTEX_LOCK(&PL_sv_mutex)
+# define UNLOCK_SV_MUTEX MUTEX_UNLOCK(&PL_sv_mutex)
+# define LOCK_STRTAB_MUTEX MUTEX_LOCK(&PL_strtab_mutex)
+# define UNLOCK_STRTAB_MUTEX MUTEX_UNLOCK(&PL_strtab_mutex)
+# define LOCK_CRED_MUTEX MUTEX_LOCK(&PL_cred_mutex)
+# define UNLOCK_CRED_MUTEX MUTEX_UNLOCK(&PL_cred_mutex)
/* Values and macros for thr->flags */
@@ -282,7 +297,7 @@ struct perl_thread *getTHR _((void));
#define ThrSETSTATE(t, s) STMT_START { \
(t)->flags &= ~THRf_STATE_MASK; \
(t)->flags |= (s); \
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), \
+ DEBUG_S(PerlIO_printf(Perl_debug_log, \
"thread %p set to state %d\n", (t), (s))); \
} STMT_END
@@ -298,27 +313,82 @@ typedef struct condpair {
#define MgCONDP(mg) (&((condpair_t *)(mg->mg_ptr))->cond)
#define MgOWNER(mg) ((condpair_t *)(mg->mg_ptr))->owner
-#else
-/* USE_THREADS is not defined */
-#define MUTEX_LOCK(m)
-#define MUTEX_UNLOCK(m)
-#define MUTEX_INIT(m)
-#define MUTEX_DESTROY(m)
-#define COND_INIT(c)
-#define COND_SIGNAL(c)
-#define COND_BROADCAST(c)
-#define COND_WAIT(c, m)
-#define COND_DESTROY(c)
-#define LOCK_SV_MUTEX
-#define UNLOCK_SV_MUTEX
-#define LOCK_STRTAB_MUTEX
-#define UNLOCK_STRTAB_MUTEX
-
-#define THR
-/* Rats: if dTHR is just blank then the subsequent ";" throws an error */
-#ifdef WIN32
-#define dTHR extern int Perl___notused
-#else
-#define dTHR extern int errno
-#endif
#endif /* USE_THREADS */
+#endif /* USE_THREADS || USE_ITHREADS */
+
+#ifndef MUTEX_LOCK
+# define MUTEX_LOCK(m)
+#endif
+
+#ifndef MUTEX_UNLOCK
+# define MUTEX_UNLOCK(m)
+#endif
+
+#ifndef MUTEX_INIT
+# define MUTEX_INIT(m)
+#endif
+
+#ifndef MUTEX_DESTROY
+# define MUTEX_DESTROY(m)
+#endif
+
+#ifndef COND_INIT
+# define COND_INIT(c)
+#endif
+
+#ifndef COND_SIGNAL
+# define COND_SIGNAL(c)
+#endif
+
+#ifndef COND_BROADCAST
+# define COND_BROADCAST(c)
+#endif
+
+#ifndef COND_WAIT
+# define COND_WAIT(c, m)
+#endif
+
+#ifndef COND_DESTROY
+# define COND_DESTROY(c)
+#endif
+
+#ifndef LOCK_SV_MUTEX
+# define LOCK_SV_MUTEX
+#endif
+
+#ifndef UNLOCK_SV_MUTEX
+# define UNLOCK_SV_MUTEX
+#endif
+
+#ifndef LOCK_STRTAB_MUTEX
+# define LOCK_STRTAB_MUTEX
+#endif
+
+#ifndef UNLOCK_STRTAB_MUTEX
+# define UNLOCK_STRTAB_MUTEX
+#endif
+
+#ifndef LOCK_CRED_MUTEX
+# define LOCK_CRED_MUTEX
+#endif
+
+#ifndef UNLOCK_CRED_MUTEX
+# define UNLOCK_CRED_MUTEX
+#endif
+
+/* THR, SET_THR, and dTHR are there for compatibility with old versions */
+#ifndef THR
+# define THR PERL_GET_THX
+#endif
+
+#ifndef SET_THR
+# define SET_THR(t) PERL_SET_THX(t)
+#endif
+
+#ifndef dTHR
+# define dTHR dNOOP
+#endif
+
+#ifndef INIT_THREADS
+# define INIT_THREADS NOOP
+#endif
diff --git a/contrib/perl5/toke.c b/contrib/perl5/toke.c
index 52a42af..48dad64 100644
--- a/contrib/perl5/toke.c
+++ b/contrib/perl5/toke.c
@@ -1,6 +1,6 @@
/* toke.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -11,56 +11,36 @@
* "It all comes from here, the stench and the peril." --Frodo
*/
+/*
+ * This file is the lexer for Perl. It's closely linked to the
+ * parser, perly.y.
+ *
+ * The main routine is yylex(), which returns the next token.
+ */
+
#include "EXTERN.h"
+#define PERL_IN_TOKE_C
#include "perl.h"
-#ifndef PERL_OBJECT
-static void check_uni _((void));
-static void force_next _((I32 type));
-static char *force_version _((char *start));
-static char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
-static SV *tokeq _((SV *sv));
-static char *scan_const _((char *start));
-static char *scan_formline _((char *s));
-static char *scan_heredoc _((char *s));
-static char *scan_ident _((char *s, char *send, char *dest, STRLEN destlen,
- I32 ck_uni));
-static char *scan_inputsymbol _((char *start));
-static char *scan_pat _((char *start, I32 type));
-static char *scan_str _((char *start));
-static char *scan_subst _((char *start));
-static char *scan_trans _((char *start));
-static char *scan_word _((char *s, char *dest, STRLEN destlen,
- int allow_package, STRLEN *slp));
-static char *skipspace _((char *s));
-static void checkcomma _((char *s, char *name, char *what));
-static void force_ident _((char *s, int kind));
-static void incline _((char *s));
-static int intuit_method _((char *s, GV *gv));
-static int intuit_more _((char *s));
-static I32 lop _((I32 f, expectation x, char *s));
-static void missingterm _((char *s));
-static void no_op _((char *what, char *s));
-static void set_csh _((void));
-static I32 sublex_done _((void));
-static I32 sublex_push _((void));
-static I32 sublex_start _((void));
-#ifdef CRIPPLED_CC
-static int uni _((I32 f, char *s));
-#endif
-static char * filter_gets _((SV *sv, PerlIO *fp, STRLEN append));
-static void restore_rsfp _((void *f));
-static SV *new_constant _((char *s, STRLEN len, char *key, SV *sv, SV *pv, char *type));
-static void restore_expect _((void *e));
-static void restore_lex_expect _((void *e));
-
-static char *PL_super_bufptr;
-static char *PL_super_bufend;
-#endif /* PERL_OBJECT */
+#define yychar PL_yychar
+#define yylval PL_yylval
static char ident_too_long[] = "Identifier too long";
-/* The following are arranged oddly so that the guard on the switch statement
+static void restore_rsfp(pTHXo_ void *f);
+
+#define XFAKEBRACK 128
+#define XENUMMASK 127
+
+/*#define UTF (SvUTF8(PL_linestr) && !(PL_hints & HINT_BYTE))*/
+#define UTF (PL_hints & HINT_UTF8)
+
+/* In variables name $^X, these are the legal values for X.
+ * 1999-02-27 mjd-perl-patch@plover.com */
+#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
+
+/* LEX_* are values for PL_lex_state, the state of the lexer.
+ * They are arranged oddly so that the guard on the switch statement
* can get by with a single comparison (if the compiler is smart enough).
*/
@@ -78,13 +58,6 @@ static char ident_too_long[] = "Identifier too long";
#define LEX_FORMLINE 1
#define LEX_KNOWNEXT 0
-#ifdef I_FCNTL
-#include <fcntl.h>
-#endif
-#ifdef I_SYS_FILE
-#include <sys/file.h>
-#endif
-
/* XXX If this causes problems, set i_unistd=undef in the hint file. */
#ifdef I_UNISTD
# include <unistd.h> /* Needed for execv() */
@@ -95,12 +68,54 @@ static char ident_too_long[] = "Identifier too long";
#undef ff_next
#endif
+#ifdef USE_PURE_BISON
+YYSTYPE* yylval_pointer = NULL;
+int* yychar_pointer = NULL;
+# undef yylval
+# undef yychar
+# define yylval (*yylval_pointer)
+# define yychar (*yychar_pointer)
+# define PERL_YYLEX_PARAM yylval_pointer,yychar_pointer
+# undef yylex
+# define yylex() Perl_yylex(aTHX_ yylval_pointer, yychar_pointer)
+#endif
+
#include "keywords.h"
+/* CLINE is a macro that ensures PL_copline has a sane value */
+
#ifdef CLINE
#undef CLINE
#endif
-#define CLINE (PL_copline = (PL_curcop->cop_line < PL_copline ? PL_curcop->cop_line : PL_copline))
+#define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
+
+/*
+ * Convenience functions to return different tokens and prime the
+ * lexer for the next token. They all take an argument.
+ *
+ * TOKEN : generic token (used for '(', DOLSHARP, etc)
+ * OPERATOR : generic operator
+ * AOPERATOR : assignment operator
+ * PREBLOCK : beginning the block after an if, while, foreach, ...
+ * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
+ * PREREF : *EXPR where EXPR is not a simple identifier
+ * TERM : expression term
+ * LOOPX : loop exiting command (goto, last, dump, etc)
+ * FTST : file test operator
+ * FUN0 : zero-argument function
+ * FUN1 : not used, except for not, which isn't a UNIOP
+ * BOop : bitwise or or xor
+ * BAop : bitwise and
+ * SHop : shift operator
+ * PWop : power operator
+ * PMop : pattern-matching operator
+ * Aop : addition-level operator
+ * Mop : multiplication-level operator
+ * Eop : equality-testing operator
+ * Rop : relational operator <= != gt
+ *
+ * Also see LOP and lop() below.
+ */
#define TOKEN(retval) return (PL_bufptr = s,(int)retval)
#define OPERATOR(retval) return (PL_expect = XTERM,PL_bufptr = s,(int)retval)
@@ -141,8 +156,15 @@ static char ident_too_long[] = "Identifier too long";
/* grandfather return to old style */
#define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
+/*
+ * S_ao
+ *
+ * This subroutine detects &&= and ||= and turns an ANDAND or OROR
+ * into an OP_ANDASSIGN or OP_ORASSIGN
+ */
+
STATIC int
-ao(int toketype)
+S_ao(pTHX_ int toketype)
{
if (*PL_bufptr == '=') {
PL_bufptr++;
@@ -155,31 +177,57 @@ ao(int toketype)
return toketype;
}
+/*
+ * S_no_op
+ * When Perl expects an operator and finds something else, no_op
+ * prints the warning. It always prints "<something> found where
+ * operator expected. It prints "Missing semicolon on previous line?"
+ * if the surprise occurs at the start of the line. "do you need to
+ * predeclare ..." is printed out for code like "sub bar; foo bar $x"
+ * where the compiler doesn't know if foo is a method call or a function.
+ * It prints "Missing operator before end of line" if there's nothing
+ * after the missing operator, or "... before <...>" if there is something
+ * after the missing operator.
+ */
+
STATIC void
-no_op(char *what, char *s)
+S_no_op(pTHX_ char *what, char *s)
{
char *oldbp = PL_bufptr;
bool is_first = (PL_oldbufptr == PL_linestart);
- PL_bufptr = s;
- yywarn(form("%s found where operator expected", what));
+ if (!s)
+ s = oldbp;
+ else {
+ assert(s >= oldbp);
+ PL_bufptr = s;
+ }
+ yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
if (is_first)
- warn("\t(Missing semicolon on previous line?)\n");
- else if (PL_oldoldbufptr && isIDFIRST(*PL_oldoldbufptr)) {
+ Perl_warn(aTHX_ "\t(Missing semicolon on previous line?)\n");
+ else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
char *t;
- for (t = PL_oldoldbufptr; *t && (isALNUM(*t) || *t == ':'); t++) ;
+ for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
if (t < PL_bufptr && isSPACE(*t))
- warn("\t(Do you need to predeclare %.*s?)\n",
+ Perl_warn(aTHX_ "\t(Do you need to predeclare %.*s?)\n",
t - PL_oldoldbufptr, PL_oldoldbufptr);
-
}
else
- warn("\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
+ Perl_warn(aTHX_ "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
PL_bufptr = oldbp;
}
+/*
+ * S_missingterm
+ * Complain about missing quote/regexp/heredoc terminator.
+ * If it's called with (char *)NULL then it cauterizes the line buffer.
+ * If we're in a delimited string and the delimiter is a control
+ * character, it's reformatted into a two-char sequence like ^C.
+ * This is fatal.
+ */
+
STATIC void
-missingterm(char *s)
+S_missingterm(pTHX_ char *s)
{
char tmpbuf[3];
char q;
@@ -207,37 +255,108 @@ missingterm(char *s)
s = tmpbuf;
}
q = strchr(s,'"') ? '\'' : '"';
- croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
+ Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
}
+/*
+ * Perl_deprecate
+ */
+
void
-deprecate(char *s)
+Perl_deprecate(pTHX_ char *s)
{
- if (PL_dowarn)
- warn("Use of %s is deprecated", s);
+ dTHR;
+ if (ckWARN(WARN_DEPRECATED))
+ Perl_warner(aTHX_ WARN_DEPRECATED, "Use of %s is deprecated", s);
}
+/*
+ * depcom
+ * Deprecate a comma-less variable list.
+ */
+
STATIC void
-depcom(void)
+S_depcom(pTHX)
{
deprecate("comma-less variable list");
}
-#ifdef WIN32
+/*
+ * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
+ * utf16-to-utf8-reversed.
+ */
+
+#ifdef PERL_CR_FILTER
+static void
+strip_return(SV *sv)
+{
+ register char *s = SvPVX(sv);
+ register char *e = s + SvCUR(sv);
+ /* outer loop optimized to do nothing if there are no CR-LFs */
+ while (s < e) {
+ if (*s++ == '\r' && *s == '\n') {
+ /* hit a CR-LF, need to copy the rest */
+ register char *d = s - 1;
+ *d++ = *s++;
+ while (s < e) {
+ if (*s == '\r' && s[1] == '\n')
+ s++;
+ *d++ = *s++;
+ }
+ SvCUR(sv) -= s - d;
+ return;
+ }
+ }
+}
STATIC I32
-win32_textfilter(int idx, SV *sv, int maxlen)
+S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
{
- I32 count = FILTER_READ(idx+1, sv, maxlen);
- if (count > 0 && !maxlen)
- win32_strip_return(sv);
- return count;
+ I32 count = FILTER_READ(idx+1, sv, maxlen);
+ if (count > 0 && !maxlen)
+ strip_return(sv);
+ return count;
}
#endif
+#if 0
+STATIC I32
+S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
+{
+ I32 count = FILTER_READ(idx+1, sv, maxlen);
+ if (count) {
+ U8* tmps;
+ U8* tend;
+ New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
+ tend = utf16_to_utf8((U16*)SvPVX(sv), tmps, SvCUR(sv));
+ sv_usepvn(sv, (char*)tmps, tend - tmps);
+ }
+ return count;
+}
+
+STATIC I32
+S_utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
+{
+ I32 count = FILTER_READ(idx+1, sv, maxlen);
+ if (count) {
+ U8* tmps;
+ U8* tend;
+ New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
+ tend = utf16_to_utf8_reversed((U16*)SvPVX(sv), tmps, SvCUR(sv));
+ sv_usepvn(sv, (char*)tmps, tend - tmps);
+ }
+ return count;
+}
+#endif
+
+/*
+ * Perl_lex_start
+ * Initialize variables. Uses the Perl save_stack to save its state (for
+ * recursive calls to the parser).
+ */
void
-lex_start(SV *line)
+Perl_lex_start(pTHX_ SV *line)
{
dTHR;
char *s;
@@ -245,13 +364,21 @@ lex_start(SV *line)
SAVEI32(PL_lex_dojoin);
SAVEI32(PL_lex_brackets);
- SAVEI32(PL_lex_fakebrack);
SAVEI32(PL_lex_casemods);
SAVEI32(PL_lex_starts);
SAVEI32(PL_lex_state);
- SAVESPTR(PL_lex_inpat);
+ SAVEVPTR(PL_lex_inpat);
SAVEI32(PL_lex_inwhat);
- SAVEI16(PL_curcop->cop_line);
+ if (PL_lex_state == LEX_KNOWNEXT) {
+ I32 toke = PL_nexttoke;
+ while (--toke >= 0) {
+ SAVEI32(PL_nexttype[toke]);
+ SAVEVPTR(PL_nextval[toke]);
+ }
+ SAVEI32(PL_nexttoke);
+ PL_nexttoke = 0;
+ }
+ SAVECOPLINE(PL_curcop);
SAVEPPTR(PL_bufptr);
SAVEPPTR(PL_bufend);
SAVEPPTR(PL_oldbufptr);
@@ -260,18 +387,18 @@ lex_start(SV *line)
SAVESPTR(PL_linestr);
SAVEPPTR(PL_lex_brackstack);
SAVEPPTR(PL_lex_casestack);
- SAVEDESTRUCTOR(restore_rsfp, PL_rsfp);
+ SAVEDESTRUCTOR_X(restore_rsfp, PL_rsfp);
SAVESPTR(PL_lex_stuff);
SAVEI32(PL_lex_defer);
+ SAVEI32(PL_sublex_info.sub_inwhat);
SAVESPTR(PL_lex_repl);
- SAVEDESTRUCTOR(restore_expect, PL_tokenbuf + PL_expect); /* encode as pointer */
- SAVEDESTRUCTOR(restore_lex_expect, PL_tokenbuf + PL_expect);
+ SAVEINT(PL_expect);
+ SAVEINT(PL_lex_expect);
PL_lex_state = LEX_NORMAL;
PL_lex_defer = 0;
PL_expect = XSTATE;
PL_lex_brackets = 0;
- PL_lex_fakebrack = 0;
New(899, PL_lex_brackstack, 120, char);
New(899, PL_lex_casestack, 12, char);
SAVEFREEPV(PL_lex_brackstack);
@@ -284,6 +411,7 @@ lex_start(SV *line)
PL_lex_repl = Nullsv;
PL_lex_inpat = 0;
PL_lex_inwhat = 0;
+ PL_sublex_info.sub_inwhat = 0;
PL_linestr = line;
if (SvREADONLY(PL_linestr))
PL_linestr = sv_2mortal(newSVsv(PL_linestr));
@@ -297,59 +425,54 @@ lex_start(SV *line)
PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
PL_bufend = PL_bufptr + SvCUR(PL_linestr);
SvREFCNT_dec(PL_rs);
- PL_rs = newSVpv("\n", 1);
+ PL_rs = newSVpvn("\n", 1);
PL_rsfp = 0;
}
+/*
+ * Perl_lex_end
+ * Finalizer for lexing operations. Must be called when the parser is
+ * done with the lexer.
+ */
+
void
-lex_end(void)
+Perl_lex_end(pTHX)
{
PL_doextract = FALSE;
}
-STATIC void
-restore_rsfp(void *f)
-{
- PerlIO *fp = (PerlIO*)f;
-
- if (PL_rsfp == PerlIO_stdin())
- PerlIO_clearerr(PL_rsfp);
- else if (PL_rsfp && (PL_rsfp != fp))
- PerlIO_close(PL_rsfp);
- PL_rsfp = fp;
-}
-
-STATIC void
-restore_expect(void *e)
-{
- /* a safe way to store a small integer in a pointer */
- PL_expect = (expectation)((char *)e - PL_tokenbuf);
-}
-
-STATIC void
-restore_lex_expect(void *e)
-{
- /* a safe way to store a small integer in a pointer */
- PL_lex_expect = (expectation)((char *)e - PL_tokenbuf);
-}
+/*
+ * S_incline
+ * This subroutine has nothing to do with tilting, whether at windmills
+ * or pinball tables. Its name is short for "increment line". It
+ * increments the current line number in CopLINE(PL_curcop) and checks
+ * to see whether the line starts with a comment of the form
+ * # line 500 "foo.pm"
+ * If so, it sets the current line number and file to the values in the comment.
+ */
STATIC void
-incline(char *s)
+S_incline(pTHX_ char *s)
{
dTHR;
char *t;
char *n;
+ char *e;
char ch;
- int sawline = 0;
- PL_curcop->cop_line++;
+ CopLINE_inc(PL_curcop);
if (*s++ != '#')
return;
while (*s == ' ' || *s == '\t') s++;
- if (strnEQ(s, "line ", 5)) {
- s += 5;
- sawline = 1;
- }
+ if (strnEQ(s, "line", 4))
+ s += 4;
+ else
+ return;
+ if (*s == ' ' || *s == '\t')
+ s++;
+ else
+ return;
+ while (*s == ' ' || *s == '\t') s++;
if (!isDIGIT(*s))
return;
n = s;
@@ -357,25 +480,35 @@ incline(char *s)
s++;
while (*s == ' ' || *s == '\t')
s++;
- if (*s == '"' && (t = strchr(s+1, '"')))
+ if (*s == '"' && (t = strchr(s+1, '"'))) {
s++;
+ e = t + 1;
+ }
else {
- if (!sawline)
- return; /* false alarm */
for (t = s; !isSPACE(*t); t++) ;
+ e = t;
}
+ while (*e == ' ' || *e == '\t' || *e == '\r' || *e == '\f')
+ e++;
+ if (*e != '\n' && *e != '\0')
+ return; /* false alarm */
+
ch = *t;
*t = '\0';
if (t - s > 0)
- PL_curcop->cop_filegv = gv_fetchfile(s);
- else
- PL_curcop->cop_filegv = gv_fetchfile(PL_origfilename);
+ CopFILE_set(PL_curcop, s);
*t = ch;
- PL_curcop->cop_line = atoi(n)-1;
+ CopLINE_set(PL_curcop, atoi(n)-1);
}
+/*
+ * S_skipspace
+ * Called to gobble the appropriate amount and type of whitespace.
+ * Skips comments as well.
+ */
+
STATIC char *
-skipspace(register char *s)
+S_skipspace(pTHX_ register char *s)
{
dTHR;
if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
@@ -385,10 +518,14 @@ skipspace(register char *s)
}
for (;;) {
STRLEN prevlen;
+ SSize_t oldprevlen, oldoldprevlen;
+ SSize_t oldloplen, oldunilen;
while (s < PL_bufend && isSPACE(*s)) {
if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
incline(s);
}
+
+ /* comment */
if (s < PL_bufend && *s == '#') {
while (s < PL_bufend && *s != '\n')
s++;
@@ -400,9 +537,20 @@ skipspace(register char *s)
}
}
}
- if (s < PL_bufend || !PL_rsfp || PL_lex_state != LEX_NORMAL)
+
+ /* only continue to recharge the buffer if we're at the end
+ * of the buffer, we're not reading from a source filter, and
+ * we're in normal lexing mode
+ */
+ if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
+ PL_lex_state == LEX_FORMLINE)
return s;
- if ((s = filter_gets(PL_linestr, PL_rsfp, (prevlen = SvCUR(PL_linestr)))) == Nullch) {
+
+ /* try to recharge the buffer */
+ if ((s = filter_gets(PL_linestr, PL_rsfp,
+ (prevlen = SvCUR(PL_linestr)))) == Nullch)
+ {
+ /* end of file. Add on the -p or -n magic */
if (PL_minus_n || PL_minus_p) {
sv_setpv(PL_linestr,PL_minus_p ?
";}continue{print or die qq(-p destination: $!\\n)" :
@@ -412,8 +560,19 @@ skipspace(register char *s)
}
else
sv_setpv(PL_linestr,";");
- PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
+
+ /* reset variables for next time we lex */
+ PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
+ = SvPVX(PL_linestr);
PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
+
+ /* Close the filehandle. Could be from -P preprocessor,
+ * STDIN, or a regular file. If we were reading code from
+ * STDIN (because the commandline held no -e or filename)
+ * then we don't close it, we reset it so the code can
+ * read from STDIN too.
+ */
+
if (PL_preprocess && !PL_in_eval)
(void)PerlProc_pclose(PL_rsfp);
else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
@@ -423,46 +582,84 @@ skipspace(register char *s)
PL_rsfp = Nullfp;
return s;
}
+
+ /* not at end of file, so we only read another line */
+ /* make corresponding updates to old pointers, for yyerror() */
+ oldprevlen = PL_oldbufptr - PL_bufend;
+ oldoldprevlen = PL_oldoldbufptr - PL_bufend;
+ if (PL_last_uni)
+ oldunilen = PL_last_uni - PL_bufend;
+ if (PL_last_lop)
+ oldloplen = PL_last_lop - PL_bufend;
PL_linestart = PL_bufptr = s + prevlen;
PL_bufend = s + SvCUR(PL_linestr);
s = PL_bufptr;
+ PL_oldbufptr = s + oldprevlen;
+ PL_oldoldbufptr = s + oldoldprevlen;
+ if (PL_last_uni)
+ PL_last_uni = s + oldunilen;
+ if (PL_last_lop)
+ PL_last_lop = s + oldloplen;
incline(s);
+
+ /* debugger active and we're not compiling the debugger code,
+ * so store the line into the debugger's array of lines
+ */
if (PERLDB_LINE && PL_curstash != PL_debstash) {
SV *sv = NEWSV(85,0);
sv_upgrade(sv, SVt_PVMG);
sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
- av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
+ av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
}
}
}
+/*
+ * S_check_uni
+ * Check the unary operators to ensure there's no ambiguity in how they're
+ * used. An ambiguous piece of code would be:
+ * rand + 5
+ * This doesn't mean rand() + 5. Because rand() is a unary operator,
+ * the +5 is its argument.
+ */
+
STATIC void
-check_uni(void) {
+S_check_uni(pTHX)
+{
char *s;
- char ch;
char *t;
+ dTHR;
if (PL_oldoldbufptr != PL_last_uni)
return;
while (isSPACE(*PL_last_uni))
PL_last_uni++;
- for (s = PL_last_uni; isALNUM(*s) || *s == '-'; s++) ;
+ for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++) ;
if ((t = strchr(s, '(')) && t < PL_bufptr)
return;
- ch = *s;
- *s = '\0';
- warn("Warning: Use of \"%s\" without parens is ambiguous", PL_last_uni);
- *s = ch;
+ if (ckWARN_d(WARN_AMBIGUOUS)){
+ char ch = *s;
+ *s = '\0';
+ Perl_warner(aTHX_ WARN_AMBIGUOUS,
+ "Warning: Use of \"%s\" without parens is ambiguous",
+ PL_last_uni);
+ *s = ch;
+ }
}
+/* workaround to replace the UNI() macro with a function. Only the
+ * hints/uts.sh file mentions this. Other comments elsewhere in the
+ * source indicate Microport Unix might need it too.
+ */
+
#ifdef CRIPPLED_CC
#undef UNI
#define UNI(f) return uni(f,s)
STATIC int
-uni(I32 f, char *s)
+S_uni(pTHX_ I32 f, char *s)
{
yylval.ival = f;
PL_expect = XTERM;
@@ -480,10 +677,23 @@ uni(I32 f, char *s)
#endif /* CRIPPLED_CC */
+/*
+ * LOP : macro to build a list operator. Its behaviour has been replaced
+ * with a subroutine, S_lop() for which LOP is just another name.
+ */
+
#define LOP(f,x) return lop(f,x,s)
+/*
+ * S_lop
+ * Build a list operator (or something that might be one). The rules:
+ * - if we have a next token, then it's a list operator [why?]
+ * - if the next thing is an opening paren, then it's a function
+ * - else it's a list operator
+ */
+
STATIC I32
-lop(I32 f, expectation x, char *s)
+S_lop(pTHX_ I32 f, int x, char *s)
{
dTHR;
yylval.ival = f;
@@ -503,8 +713,17 @@ lop(I32 f, expectation x, char *s)
return LSTOP;
}
+/*
+ * S_force_next
+ * When the lexer realizes it knows the next token (for instance,
+ * it is reordering tokens for the parser) then it can call S_force_next
+ * to know what token to return the next time the lexer is called. Caller
+ * will need to set PL_nextval[], and possibly PL_expect to ensure the lexer
+ * handles the token correctly.
+ */
+
STATIC void
-force_next(I32 type)
+S_force_next(pTHX_ I32 type)
{
PL_nexttype[PL_nexttoke] = type;
PL_nexttoke++;
@@ -515,15 +734,31 @@ force_next(I32 type)
}
}
+/*
+ * S_force_word
+ * When the lexer knows the next thing is a word (for instance, it has
+ * just seen -> and it knows that the next char is a word char, then
+ * it calls S_force_word to stick the next word into the PL_next lookahead.
+ *
+ * Arguments:
+ * char *start : buffer position (must be within PL_linestr)
+ * int token : PL_next will be this type of bare word (e.g., METHOD,WORD)
+ * int check_keyword : if true, Perl checks to make sure the word isn't
+ * a keyword (do this if the word is a label, e.g. goto FOO)
+ * int allow_pack : if true, : characters will also be allowed (require,
+ * use, etc. do this)
+ * int allow_initial_tick : used by the "sub" lexer only.
+ */
+
STATIC char *
-force_word(register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
+S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
{
register char *s;
STRLEN len;
start = skipspace(start);
s = start;
- if (isIDFIRST(*s) ||
+ if (isIDFIRST_lazy_if(s,UTF) ||
(allow_pack && *s == ':') ||
(allow_initial_tick && *s == '\'') )
{
@@ -536,8 +771,6 @@ force_word(register char *start, int token, int check_keyword, int allow_pack, i
PL_expect = XTERM;
else {
PL_expect = XOPERATOR;
- force_next(')');
- force_next('(');
}
}
PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
@@ -547,8 +780,17 @@ force_word(register char *start, int token, int check_keyword, int allow_pack, i
return s;
}
+/*
+ * S_force_ident
+ * Called when the lexer wants $foo *foo &foo etc, but the program
+ * text only contains the "foo" portion. The first argument is a pointer
+ * to the "foo", and the second argument is the type symbol to prefix.
+ * Forces the next token to be a "WORD".
+ * Creates the symbol if it didn't already exist (via gv_fetchpv()).
+ */
+
STATIC void
-force_ident(register char *s, int kind)
+S_force_ident(pTHX_ register char *s, int kind)
{
if (s && *s) {
OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
@@ -570,23 +812,59 @@ force_ident(register char *s, int kind)
}
}
+NV
+Perl_str_to_version(pTHX_ SV *sv)
+{
+ NV retval = 0.0;
+ NV nshift = 1.0;
+ STRLEN len;
+ char *start = SvPVx(sv,len);
+ bool utf = SvUTF8(sv);
+ char *end = start + len;
+ while (start < end) {
+ I32 skip;
+ UV n;
+ if (utf)
+ n = utf8_to_uv((U8*)start, &skip);
+ else {
+ n = *(U8*)start;
+ skip = 1;
+ }
+ retval += ((NV)n)/nshift;
+ start += skip;
+ nshift *= 1000;
+ }
+ return retval;
+}
+
+/*
+ * S_force_version
+ * Forces the next token to be a version number.
+ */
+
STATIC char *
-force_version(char *s)
+S_force_version(pTHX_ char *s)
{
OP *version = Nullop;
+ char *d;
s = skipspace(s);
- /* default VERSION number -- GBARR */
-
- if(isDIGIT(*s)) {
- char *d;
- int c;
- for( d=s, c = 1; isDIGIT(*d) || *d == '_' || (*d == '.' && c--); d++);
- if((*d == ';' || isSPACE(*d)) && *(skipspace(d)) != ',') {
+ d = s;
+ if (*d == 'v')
+ d++;
+ if (isDIGIT(*d)) {
+ for (; isDIGIT(*d) || *d == '_' || *d == '.'; d++);
+ if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
+ SV *ver;
s = scan_num(s);
- /* real VERSION number -- GBARR */
version = yylval.opval;
+ ver = cSVOPx(version)->op_sv;
+ if (SvPOK(ver) && !SvNIOK(ver)) {
+ (void)SvUPGRADE(ver, SVt_PVNV);
+ SvNVX(ver) = str_to_version(ver);
+ SvNOK_on(ver); /* hint that it is a version */
+ }
}
}
@@ -597,8 +875,16 @@ force_version(char *s)
return (s);
}
+/*
+ * S_tokeq
+ * Tokenize a quoted string passed in as an SV. It finds the next
+ * chunk, up to end of string or a backslash. It may make a new
+ * SV containing that chunk (if HINT_NEW_STRING is on). It also
+ * turns \\ into \.
+ */
+
STATIC SV *
-tokeq(SV *sv)
+S_tokeq(pTHX_ SV *sv)
{
register char *s;
register char *send;
@@ -619,7 +905,7 @@ tokeq(SV *sv)
goto finish;
d = s;
if ( PL_hints & HINT_NEW_STRING )
- pv = sv_2mortal(newSVpv(SvPVX(pv), len));
+ pv = sv_2mortal(newSVpvn(SvPVX(pv), len));
while (s < send) {
if (*s == '\\') {
if (s + 1 < send && (s[1] == '\\'))
@@ -635,8 +921,40 @@ tokeq(SV *sv)
return sv;
}
+/*
+ * Now come three functions related to double-quote context,
+ * S_sublex_start, S_sublex_push, and S_sublex_done. They're used when
+ * converting things like "\u\Lgnat" into ucfirst(lc("gnat")). They
+ * interact with PL_lex_state, and create fake ( ... ) argument lists
+ * to handle functions and concatenation.
+ * They assume that whoever calls them will be setting up a fake
+ * join call, because each subthing puts a ',' after it. This lets
+ * "lower \luPpEr"
+ * become
+ * join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
+ *
+ * (I'm not sure whether the spurious commas at the end of lcfirst's
+ * arguments and join's arguments are created or not).
+ */
+
+/*
+ * S_sublex_start
+ * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
+ *
+ * Pattern matching will set PL_lex_op to the pattern-matching op to
+ * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
+ *
+ * OP_CONST and OP_READLINE are easy--just make the new op and return.
+ *
+ * Everything else becomes a FUNC.
+ *
+ * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
+ * had an OP_CONST or OP_READLINE). This just sets us up for a
+ * call to S_sublex_push().
+ */
+
STATIC I32
-sublex_start(void)
+S_sublex_start(pTHX)
{
register I32 op_type = yylval.ival;
@@ -655,7 +973,7 @@ sublex_start(void)
SV *nsv;
p = SvPV(sv, len);
- nsv = newSVpv(p, len);
+ nsv = newSVpvn(p, len);
SvREFCNT_dec(sv);
sv = nsv;
}
@@ -679,8 +997,16 @@ sublex_start(void)
return FUNC;
}
+/*
+ * S_sublex_push
+ * Create a new scope to save the lexing state. The scope will be
+ * ended in S_sublex_done. Returns a '(', starting the function arguments
+ * to the uc, lc, etc. found before.
+ * Sets PL_lex_state to LEX_INTERPCONCAT.
+ */
+
STATIC I32
-sublex_push(void)
+S_sublex_push(pTHX)
{
dTHR;
ENTER;
@@ -688,13 +1014,12 @@ sublex_push(void)
PL_lex_state = PL_sublex_info.super_state;
SAVEI32(PL_lex_dojoin);
SAVEI32(PL_lex_brackets);
- SAVEI32(PL_lex_fakebrack);
SAVEI32(PL_lex_casemods);
SAVEI32(PL_lex_starts);
SAVEI32(PL_lex_state);
- SAVESPTR(PL_lex_inpat);
+ SAVEVPTR(PL_lex_inpat);
SAVEI32(PL_lex_inwhat);
- SAVEI16(PL_curcop->cop_line);
+ SAVECOPLINE(PL_curcop);
SAVEPPTR(PL_bufptr);
SAVEPPTR(PL_oldbufptr);
SAVEPPTR(PL_oldoldbufptr);
@@ -706,13 +1031,13 @@ sublex_push(void)
PL_linestr = PL_lex_stuff;
PL_lex_stuff = Nullsv;
- PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
+ PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
+ = SvPVX(PL_linestr);
PL_bufend += SvCUR(PL_linestr);
SAVEFREESV(PL_linestr);
PL_lex_dojoin = FALSE;
PL_lex_brackets = 0;
- PL_lex_fakebrack = 0;
New(899, PL_lex_brackstack, 120, char);
New(899, PL_lex_casestack, 12, char);
SAVEFREEPV(PL_lex_brackstack);
@@ -721,7 +1046,7 @@ sublex_push(void)
*PL_lex_casestack = '\0';
PL_lex_starts = 0;
PL_lex_state = LEX_INTERPCONCAT;
- PL_curcop->cop_line = PL_multi_start;
+ CopLINE_set(PL_curcop, PL_multi_start);
PL_lex_inwhat = PL_sublex_info.sub_inwhat;
if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
@@ -732,12 +1057,17 @@ sublex_push(void)
return '(';
}
+/*
+ * S_sublex_done
+ * Restores lexer state after a S_sublex_push.
+ */
+
STATIC I32
-sublex_done(void)
+S_sublex_done(pTHX)
{
if (!PL_lex_starts++) {
PL_expect = XOPERATOR;
- yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
+ yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn("",0));
return THING;
}
@@ -746,7 +1076,7 @@ sublex_done(void)
return yylex();
}
- /* Is there a right-hand side to take care of? */
+ /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
PL_linestr = PL_lex_repl;
PL_lex_inpat = 0;
@@ -755,17 +1085,21 @@ sublex_done(void)
SAVEFREESV(PL_linestr);
PL_lex_dojoin = FALSE;
PL_lex_brackets = 0;
- PL_lex_fakebrack = 0;
PL_lex_casemods = 0;
*PL_lex_casestack = '\0';
PL_lex_starts = 0;
- if (SvCOMPILED(PL_lex_repl)) {
+ if (SvEVALED(PL_lex_repl)) {
PL_lex_state = LEX_INTERPNORMAL;
PL_lex_starts++;
+ /* we don't clear PL_lex_repl here, so that we can check later
+ whether this is an evalled subst; that means we rely on the
+ logic to ensure sublex_done() is called again only via the
+ branch (in yylex()) that clears PL_lex_repl, else we'll loop */
}
- else
+ else {
PL_lex_state = LEX_INTERPCONCAT;
- PL_lex_repl = Nullsv;
+ PL_lex_repl = Nullsv;
+ }
return ',';
}
else {
@@ -773,6 +1107,7 @@ sublex_done(void)
PL_bufend = SvPVX(PL_linestr);
PL_bufend += SvCUR(PL_linestr);
PL_expect = XOPERATOR;
+ PL_sublex_info.sub_inwhat = 0;
return ')';
}
}
@@ -851,19 +1186,27 @@ sublex_done(void)
*/
STATIC char *
-scan_const(char *start)
+S_scan_const(pTHX_ char *start)
{
register char *send = PL_bufend; /* end of the constant */
SV *sv = NEWSV(93, send - start); /* sv for the constant */
register char *s = start; /* start of the constant */
register char *d = SvPVX(sv); /* destination for copies */
bool dorange = FALSE; /* are we in a translit range? */
+ bool has_utf = FALSE; /* embedded \x{} */
I32 len; /* ? */
-
- /* leaveit is the set of acceptably-backslashed characters */
- char *leaveit =
+ UV uv;
+
+ I32 utf = (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op)
+ ? (PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF))
+ : UTF;
+ I32 thisutf = (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op)
+ ? (PL_sublex_info.sub_op->op_private & (PL_lex_repl ?
+ OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF))
+ : UTF;
+ const char *leaveit = /* set of acceptably-backslashed characters */
PL_lex_inpat
- ? "\\.^$@AGZdDwWsSbB+*?|()-nrtfeaxcz0123456789[{]} \t\n\r\f\v#"
+ ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxcz0123456789[{]} \t\n\r\f\v#"
: "";
while (s < send || dorange) {
@@ -876,8 +1219,8 @@ scan_const(char *start)
I32 max; /* last character in range */
i = d - SvPVX(sv); /* remember current offset */
- SvGROW(sv, SvLEN(sv) + 256); /* expand the sv -- there'll never be more'n 256 chars in a range for it to grow by */
- d = SvPVX(sv) + i; /* restore d after the grow potentially has changed the ptr */
+ SvGROW(sv, SvLEN(sv) + 256); /* never more than 256 chars in a range */
+ d = SvPVX(sv) + i; /* refresh d after realloc */
d -= 2; /* eat the first char and the - */
min = (U8)*d; /* first char in range */
@@ -908,6 +1251,11 @@ scan_const(char *start)
/* range begins (ignore - as first or last char) */
else if (*s == '-' && s+1 < send && s != start) {
+ if (utf) {
+ *d++ = (char)0xff; /* use illegal utf8 byte--see pmtrans */
+ s++;
+ continue;
+ }
dorange = TRUE;
s++;
}
@@ -915,14 +1263,18 @@ scan_const(char *start)
/* if we get here, we're not doing a transliteration */
- /* skip for regexp comments /(?#comment)/ */
+ /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
+ except for the last char, which will be done separately. */
else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
if (s[2] == '#') {
while (s < send && *s != ')')
*d++ = *s++;
- } else if (s[2] == '{') { /* This should march regcomp.c */
+ }
+ else if (s[2] == '{' /* This should match regcomp.c */
+ || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
+ {
I32 count = 1;
- char *regparse = s + 3;
+ char *regparse = s + (s[2] == '{' ? 3 : 4);
char c;
while (count && (c = *regparse)) {
@@ -934,11 +1286,11 @@ scan_const(char *start)
count--;
regparse++;
}
- if (*regparse == ')')
- regparse++;
- else
+ if (*regparse != ')') {
+ regparse--; /* Leave one char for continuation. */
yyerror("Sequence (?{...}) not terminated or not {}-balanced");
- while (s < regparse && *s != ')')
+ }
+ while (s < regparse)
*d++ = *s++;
}
}
@@ -951,7 +1303,8 @@ scan_const(char *start)
}
/* check for embedded arrays (@foo, @:foo, @'foo, @{foo}, @$foo) */
- else if (*s == '@' && s[1] && (isALNUM(s[1]) || strchr(":'{$", s[1])))
+ else if (*s == '@' && s[1]
+ && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$", s[1])))
break;
/* check for embedded scalars. only stop if we're sure it's a
@@ -964,12 +1317,31 @@ scan_const(char *start)
break; /* in regexp, $ might be tail anchor */
}
+ /* (now in tr/// code again) */
+
+ if (*s & 0x80 && thisutf) {
+ (void)utf8_to_uv((U8*)s, &len);
+ if (len == 1) {
+ /* illegal UTF8, make it valid */
+ char *old_pvx = SvPVX(sv);
+ /* need space for one extra char (NOTE: SvCUR() not set here) */
+ d = SvGROW(sv, SvLEN(sv) + 1) + (d - old_pvx);
+ d = (char*)uv_to_utf8((U8*)d, (U8)*s++);
+ }
+ else {
+ while (len--)
+ *d++ = *s++;
+ }
+ has_utf = TRUE;
+ continue;
+ }
+
/* backslashes */
if (*s == '\\' && s+1 < send) {
s++;
/* some backslashes we leave behind */
- if (*s && strchr(leaveit, *s)) {
+ if (*leaveit && *s && strchr(leaveit, *s)) {
*d++ = '\\';
*d++ = *s++;
continue;
@@ -979,8 +1351,9 @@ scan_const(char *start)
if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
{
- if (PL_dowarn)
- warn("\\%c better written as $%c", *s, *s);
+ dTHR; /* only for ckWARN */
+ if (ckWARN(WARN_SYNTAX))
+ Perl_warner(aTHX_ WARN_SYNTAX, "\\%c better written as $%c", *s, *s);
*--s = '$';
break;
}
@@ -1001,22 +1374,133 @@ scan_const(char *start)
continue;
}
/* FALL THROUGH */
- /* default action is to copy the quoted character */
default:
- *d++ = *s++;
- continue;
+ {
+ dTHR;
+ if (ckWARN(WARN_MISC) && isALPHA(*s))
+ Perl_warner(aTHX_ WARN_MISC,
+ "Unrecognized escape \\%c passed through",
+ *s);
+ /* default action is to copy the quoted character */
+ *d++ = *s++;
+ continue;
+ }
/* \132 indicates an octal constant */
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
- *d++ = scan_oct(s, 3, &len);
+ uv = (UV)scan_oct(s, 3, &len);
s += len;
- continue;
+ goto NUM_ESCAPE_INSERT;
/* \x24 indicates a hex constant */
case 'x':
- *d++ = scan_hex(++s, 2, &len);
- s += len;
+ ++s;
+ if (*s == '{') {
+ char* e = strchr(s, '}');
+ if (!e) {
+ yyerror("Missing right brace on \\x{}");
+ e = s;
+ }
+ uv = (UV)scan_hex(s + 1, e - s - 1, &len);
+ s = e + 1;
+ }
+ else {
+ uv = (UV)scan_hex(s, 2, &len);
+ s += len;
+ }
+
+ NUM_ESCAPE_INSERT:
+ /* Insert oct or hex escaped character.
+ * There will always enough room in sv since such escapes will
+ * be longer than any utf8 sequence they can end up as
+ */
+ if (uv > 127) {
+ if (!thisutf && !has_utf && uv > 255) {
+ /* might need to recode whatever we have accumulated so far
+ * if it contains any hibit chars
+ */
+ int hicount = 0;
+ char *c;
+ for (c = SvPVX(sv); c < d; c++) {
+ if (*c & 0x80)
+ hicount++;
+ }
+ if (hicount) {
+ char *old_pvx = SvPVX(sv);
+ char *src, *dst;
+ d = SvGROW(sv, SvCUR(sv) + hicount + 1) + (d - old_pvx);
+
+ src = d - 1;
+ d += hicount;
+ dst = d - 1;
+
+ while (src < dst) {
+ if (*src & 0x80) {
+ dst--;
+ uv_to_utf8((U8*)dst, (U8)*src--);
+ dst--;
+ }
+ else {
+ *dst-- = *src--;
+ }
+ }
+ }
+ }
+
+ if (thisutf || uv > 255) {
+ d = (char*)uv_to_utf8((U8*)d, uv);
+ has_utf = TRUE;
+ }
+ else {
+ *d++ = (char)uv;
+ }
+ }
+ else {
+ *d++ = (char)uv;
+ }
+ continue;
+
+ /* \N{latin small letter a} is a named character */
+ case 'N':
+ ++s;
+ if (*s == '{') {
+ char* e = strchr(s, '}');
+ SV *res;
+ STRLEN len;
+ char *str;
+
+ if (!e) {
+ yyerror("Missing right brace on \\N{}");
+ e = s - 1;
+ goto cont_scan;
+ }
+ res = newSVpvn(s + 1, e - s - 1);
+ res = new_constant( Nullch, 0, "charnames",
+ res, Nullsv, "\\N{...}" );
+ str = SvPV(res,len);
+ if (!has_utf && SvUTF8(res)) {
+ char *ostart = SvPVX(sv);
+ SvCUR_set(sv, d - ostart);
+ SvPOK_on(sv);
+ sv_utf8_upgrade(sv);
+ d = SvPVX(sv) + SvCUR(sv);
+ has_utf = TRUE;
+ }
+ if (len > e - s + 4) {
+ char *odest = SvPVX(sv);
+
+ SvGROW(sv, (SvCUR(sv) + len - (e - s + 4)));
+ d = SvPVX(sv) + (d - odest);
+ }
+ Copy(str, d, len, char);
+ d += len;
+ SvREFCNT_dec(res);
+ cont_scan:
+ s = e + 1;
+ }
+ else
+ yyerror("Missing braces on \\N{}");
continue;
/* \c is a control character */
@@ -1049,12 +1533,21 @@ scan_const(char *start)
case 't':
*d++ = '\t';
break;
+#ifdef EBCDIC
+ case 'e':
+ *d++ = '\047'; /* CP 1047 */
+ break;
+ case 'a':
+ *d++ = '\057'; /* CP 1047 */
+ break;
+#else
case 'e':
*d++ = '\033';
break;
case 'a':
*d++ = '\007';
break;
+#endif
} /* end switch */
s++;
@@ -1068,6 +1561,8 @@ scan_const(char *start)
*d = '\0';
SvCUR_set(sv, d - SvPVX(sv));
SvPOK_on(sv);
+ if (has_utf)
+ SvUTF8_on(sv);
/* shrink the sv if we allocated more than we used */
if (SvCUR(sv) + 5 < SvLEN(sv)) {
@@ -1091,9 +1586,29 @@ scan_const(char *start)
return s;
}
+/* S_intuit_more
+ * Returns TRUE if there's more to the expression (e.g., a subscript),
+ * FALSE otherwise.
+ *
+ * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
+ *
+ * ->[ and ->{ return TRUE
+ * { and [ outside a pattern are always subscripts, so return TRUE
+ * if we're outside a pattern and it's not { or [, then return FALSE
+ * if we're in a pattern and the first char is a {
+ * {4,5} (any digits around the comma) returns FALSE
+ * if we're in a pattern and the first char is a [
+ * [] returns FALSE
+ * [SOMETHING] has a funky algorithm to decide whether it's a
+ * character class or not. It has to deal with things like
+ * /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
+ * anything else returns TRUE
+ */
+
/* This is the one truly awful dwimmer necessary to conflate C and sed. */
+
STATIC int
-intuit_more(register char *s)
+S_intuit_more(pTHX_ register char *s)
{
if (PL_lex_brackets)
return TRUE;
@@ -1127,6 +1642,7 @@ intuit_more(register char *s)
if (*s == ']' || *s == '^')
return FALSE;
else {
+ /* this is terrifying, and it works */
int weight = 2; /* let's weigh the evidence */
char seen[256];
unsigned char un_char = 255, last_un_char;
@@ -1155,7 +1671,7 @@ intuit_more(register char *s)
case '&':
case '$':
weight -= seen[un_char] * 10;
- if (isALNUM(s[1])) {
+ if (isALNUM_lazy_if(s+1,UTF)) {
scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
weight -= 100;
@@ -1222,8 +1738,29 @@ intuit_more(register char *s)
return TRUE;
}
+/*
+ * S_intuit_method
+ *
+ * Does all the checking to disambiguate
+ * foo bar
+ * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise
+ * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
+ *
+ * First argument is the stuff after the first token, e.g. "bar".
+ *
+ * Not a method if bar is a filehandle.
+ * Not a method if foo is a subroutine prototyped to take a filehandle.
+ * Not a method if it's really "Foo $bar"
+ * Method if it's "foo $bar"
+ * Not a method if it's really "print foo $bar"
+ * Method if it's really "foo package::" (interpreted as package->foo)
+ * Not a method if bar is known to be a subroutne ("sub bar; foo bar")
+ * Not a method if bar is a filehandle or package, but is quoted with
+ * =>
+ */
+
STATIC int
-intuit_method(char *start, GV *gv)
+S_intuit_method(pTHX_ char *start, GV *gv)
{
char *s = start + (*start == '$');
char tmpbuf[sizeof PL_tokenbuf];
@@ -1246,6 +1783,11 @@ intuit_method(char *start, GV *gv)
gv = 0;
}
s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
+ /* start is the beginning of the possible filehandle/object,
+ * and s is the end of it
+ * tmpbuf is a copy of it
+ */
+
if (*start == '$') {
if (gv || PL_last_lop_op == OP_PRINT || isUPPER(*PL_tokenbuf))
return 0;
@@ -1270,7 +1812,7 @@ intuit_method(char *start, GV *gv)
return 0; /* no assumptions -- "=>" quotes bearword */
bare_package:
PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
- newSVpv(tmpbuf,0));
+ newSVpvn(tmpbuf,len));
PL_nextval[PL_nexttoke].opval->op_private = OPpCONST_BARE;
PL_expect = XTERM;
force_next(WORD);
@@ -1281,8 +1823,15 @@ intuit_method(char *start, GV *gv)
return 0;
}
+/*
+ * S_incl_perldb
+ * Return a string of Perl code to load the debugger. If PERL5DB
+ * is set, it will return the contents of that, otherwise a
+ * compile-time require of perl5db.pl.
+ */
+
STATIC char*
-incl_perldb(void)
+S_incl_perldb(pTHX)
{
if (PL_perldb) {
char *pdb = PerlEnv_getenv("PERL5DB");
@@ -1307,32 +1856,28 @@ incl_perldb(void)
* store private buffers and state information.
*
* The supplied datasv parameter is upgraded to a PVIO type
- * and the IoDIRP field is used to store the function pointer.
+ * and the IoDIRP field is used to store the function pointer,
+ * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
* Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
* private use must be set using malloc'd pointers.
*/
-#ifndef PERL_OBJECT
-static int filter_debug = 0;
-#endif
SV *
-filter_add(filter_t funcp, SV *datasv)
+Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
{
- if (!funcp){ /* temporary handy debugging hack to be deleted */
- filter_debug = atoi((char*)datasv);
- return NULL;
- }
+ if (!funcp)
+ return Nullsv;
+
if (!PL_rsfp_filters)
PL_rsfp_filters = newAV();
if (!datasv)
datasv = NEWSV(255,0);
if (!SvUPGRADE(datasv, SVt_PVIO))
- die("Can't upgrade filter_add data to SVt_PVIO");
+ Perl_die(aTHX_ "Can't upgrade filter_add data to SVt_PVIO");
IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
- if (filter_debug) {
- STRLEN n_a;
- warn("filter_add func %p (%s)", funcp, SvPV(datasv,n_a));
- }
+ IoFLAGS(datasv) |= IOf_FAKE_DIRP;
+ DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
+ funcp, SvPV_nolen(datasv)));
av_unshift(PL_rsfp_filters, 1);
av_store(PL_rsfp_filters, 0, datasv) ;
return(datasv);
@@ -1341,26 +1886,29 @@ filter_add(filter_t funcp, SV *datasv)
/* Delete most recently added instance of this filter function. */
void
-filter_del(filter_t funcp)
+Perl_filter_del(pTHX_ filter_t funcp)
{
- if (filter_debug)
- warn("filter_del func %p", funcp);
+ SV *datasv;
+ DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", funcp));
if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
return;
/* if filter is on top of stack (usual case) just pop it off */
- if (IoDIRP(FILTER_DATA(AvFILLp(PL_rsfp_filters))) == (DIR*)funcp){
+ datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
+ if (IoDIRP(datasv) == (DIR*)funcp) {
+ IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
+ IoDIRP(datasv) = (DIR*)NULL;
sv_free(av_pop(PL_rsfp_filters));
return;
}
/* we need to search for the correct entry and clear it */
- die("filter_del can only delete in reverse order (currently)");
+ Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
}
/* Invoke the n'th filter function for the current rsfp. */
I32
-filter_read(int idx, SV *buf_sv, int maxlen)
+Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
/* 0 = read one text line */
@@ -1373,8 +1921,8 @@ filter_read(int idx, SV *buf_sv, int maxlen)
if (idx > AvFILLp(PL_rsfp_filters)){ /* Any more filters? */
/* Provide a default input filter to make life easy. */
/* Note that we append to the line. This is handy. */
- if (filter_debug)
- warn("filter_read %d: from rsfp\n", idx);
+ DEBUG_P(PerlIO_printf(Perl_debug_log,
+ "filter_read %d: from rsfp\n", idx));
if (maxlen) {
/* Want a block */
int len ;
@@ -1402,29 +1950,28 @@ filter_read(int idx, SV *buf_sv, int maxlen)
}
/* Skip this filter slot if filter has been deleted */
if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef){
- if (filter_debug)
- warn("filter_read %d: skipped (filter deleted)\n", idx);
+ DEBUG_P(PerlIO_printf(Perl_debug_log,
+ "filter_read %d: skipped (filter deleted)\n",
+ idx));
return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
}
/* Get function pointer hidden within datasv */
funcp = (filter_t)IoDIRP(datasv);
- if (filter_debug) {
- STRLEN n_a;
- warn("filter_read %d: via function %p (%s)\n",
- idx, funcp, SvPV(datasv,n_a));
- }
+ DEBUG_P(PerlIO_printf(Perl_debug_log,
+ "filter_read %d: via function %p (%s)\n",
+ idx, funcp, SvPV_nolen(datasv)));
/* Call function. The function is expected to */
/* call "FILTER_READ(idx+1, buf_sv)" first. */
/* Return: <0:error, =0:eof, >0:not eof */
- return (*funcp)(PERL_OBJECT_THIS_ idx, buf_sv, maxlen);
+ return (*funcp)(aTHXo_ idx, buf_sv, maxlen);
}
STATIC char *
-filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
+S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
{
-#ifdef WIN32FILTER
+#ifdef PERL_CR_FILTER
if (!PL_rsfp_filters) {
- filter_add(win32_textfilter,NULL);
+ filter_add(S_cr_textfilter,NULL);
}
#endif
if (PL_rsfp_filters) {
@@ -1443,11 +1990,11 @@ filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
#ifdef DEBUGGING
static char* exp_name[] =
- { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
+ { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
+ "ATTRTERM", "TERMBLOCK"
+ };
#endif
-EXT int yychar; /* last token */
-
/*
yylex
@@ -1474,7 +2021,11 @@ EXT int yychar; /* last token */
*/
int
-yylex(void)
+#ifdef USE_PURE_BISON
+Perl_yylex(pTHX_ YYSTYPE *lvalp, int *lcharp)
+#else
+Perl_yylex(pTHX)
+#endif
{
dTHR;
register char *s;
@@ -1484,6 +2035,11 @@ yylex(void)
GV *gv = Nullgv;
GV **gvp = 0;
+#ifdef USE_PURE_BISON
+ yylval_pointer = lvalp;
+ yychar_pointer = lcharp;
+#endif
+
/* check if there's an identifier for us to look at */
if (PL_pending_ident) {
/* pit holds the identifier we read and pending_ident is reset */
@@ -1497,12 +2053,21 @@ yylex(void)
if it's a legal name, the OP is a PADANY.
*/
if (PL_in_my) {
- if (strchr(PL_tokenbuf,':'))
- croak(no_myglob,PL_tokenbuf);
+ if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
+ if (strchr(PL_tokenbuf,':'))
+ yyerror(Perl_form(aTHX_ "No package name allowed for "
+ "variable %s in \"our\"",
+ PL_tokenbuf));
+ tmp = pad_allocmy(PL_tokenbuf);
+ }
+ else {
+ if (strchr(PL_tokenbuf,':'))
+ yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
- yylval.opval = newOP(OP_PADANY, 0);
- yylval.opval->op_targ = pad_allocmy(PL_tokenbuf);
- return PRIVATEREF;
+ yylval.opval = newOP(OP_PADANY, 0);
+ yylval.opval->op_targ = pad_allocmy(PL_tokenbuf);
+ return PRIVATEREF;
+ }
}
/*
@@ -1530,6 +2095,26 @@ yylex(void)
}
#endif /* USE_THREADS */
if ((tmp = pad_findmy(PL_tokenbuf)) != NOT_IN_PAD) {
+ SV *namesv = AvARRAY(PL_comppad_name)[tmp];
+ /* might be an "our" variable" */
+ if (SvFLAGS(namesv) & SVpad_OUR) {
+ /* build ops for a bareword */
+ SV *sym = newSVpv(HvNAME(GvSTASH(namesv)),0);
+ sv_catpvn(sym, "::", 2);
+ sv_catpv(sym, PL_tokenbuf+1);
+ yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
+ yylval.opval->op_private = OPpCONST_ENTERED;
+ gv_fetchpv(SvPVX(sym),
+ (PL_in_eval
+ ? (GV_ADDMULTI | GV_ADDINEVAL)
+ : TRUE
+ ),
+ ((PL_tokenbuf[0] == '$') ? SVt_PV
+ : (PL_tokenbuf[0] == '@') ? SVt_PVAV
+ : SVt_PVHV));
+ return WORD;
+ }
+
/* if it's a sort block and they're naming $a or $b */
if (PL_last_lop_op == OP_SORT &&
PL_tokenbuf[0] == '$' &&
@@ -1541,7 +2126,7 @@ yylex(void)
d++)
{
if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
- croak("Can't use \"my %s\" in sort comparison",
+ Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
PL_tokenbuf);
}
}
@@ -1561,7 +2146,7 @@ yylex(void)
if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
if (!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
- yyerror(form("In string, %s now must be written as \\%s",
+ yyerror(Perl_form(aTHX_ "In string, %s now must be written as \\%s",
PL_tokenbuf, PL_tokenbuf));
}
@@ -1584,7 +2169,7 @@ yylex(void)
break;
#endif
- /* when we're already built the next token, just pull it out the queue */
+ /* when we've already built the next token, just pull it out of the queue */
case LEX_KNOWNEXT:
PL_nexttoke--;
yylval = PL_nextval[PL_nexttoke];
@@ -1601,7 +2186,7 @@ yylex(void)
case LEX_INTERPCASEMOD:
#ifdef DEBUGGING
if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
- croak("panic: INTERPCASEMOD");
+ Perl_croak(aTHX_ "panic: INTERPCASEMOD");
#endif
/* handle \E or end of string */
if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
@@ -1656,7 +2241,7 @@ yylex(void)
else if (*s == 'Q')
PL_nextval[PL_nexttoke].ival = OP_QUOTEMETA;
else
- croak("panic: yylex");
+ Perl_croak(aTHX_ "panic: yylex");
PL_bufptr = s + 1;
force_next(FUNC);
if (PL_lex_starts) {
@@ -1713,11 +2298,18 @@ yylex(void)
PL_lex_state = LEX_INTERPCONCAT;
return ')';
}
+ if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
+ && SvEVALED(PL_lex_repl))
+ {
+ if (PL_bufptr != PL_bufend)
+ Perl_croak(aTHX_ "Bad evalled substitution pattern");
+ PL_lex_repl = Nullsv;
+ }
/* FALLTHROUGH */
case LEX_INTERPCONCAT:
#ifdef DEBUGGING
if (PL_lex_brackets)
- croak("panic: INTERPCONCAT");
+ Perl_croak(aTHX_ "panic: INTERPCONCAT");
#endif
if (PL_bufptr == PL_bufend)
return sublex_done();
@@ -1764,13 +2356,16 @@ yylex(void)
PL_oldoldbufptr = PL_oldbufptr;
PL_oldbufptr = s;
DEBUG_p( {
- PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[PL_expect], s);
+ PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at %s\n",
+ exp_name[PL_expect], s);
} )
retry:
switch (*s) {
default:
- croak("Unrecognized character \\%03o", *s & 255);
+ if (isIDFIRST_lazy_if(s,UTF))
+ goto keylookup;
+ Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
case 4:
case 26:
goto fake_eof; /* emulate EOF on ^D or ^Z */
@@ -1779,7 +2374,7 @@ yylex(void)
PL_last_uni = 0;
PL_last_lop = 0;
if (PL_lex_brackets)
- yyerror("Missing right bracket");
+ yyerror("Missing right curly or square bracket");
TOKEN(0);
}
if (s++ < PL_bufend)
@@ -1812,20 +2407,20 @@ yylex(void)
if (PL_minus_F) {
if (strchr("/'\"", *PL_splitstr)
&& strchr(PL_splitstr + 1, *PL_splitstr))
- sv_catpvf(PL_linestr, "@F=split(%s);", PL_splitstr);
+ Perl_sv_catpvf(aTHX_ PL_linestr, "@F=split(%s);", PL_splitstr);
else {
char delim;
s = "'~#\200\1'"; /* surely one char is unused...*/
while (s[1] && strchr(PL_splitstr, *s)) s++;
delim = *s;
- sv_catpvf(PL_linestr, "@F=split(%s%c",
+ Perl_sv_catpvf(aTHX_ PL_linestr, "@F=split(%s%c",
"q" + (delim == '\''), delim);
for (s = PL_splitstr; *s; s++) {
if (*s == '\\')
sv_catpvn(PL_linestr, "\\", 1);
sv_catpvn(PL_linestr, s, 1);
}
- sv_catpvf(PL_linestr, "%c);", delim);
+ Perl_sv_catpvf(aTHX_ PL_linestr, "%c);", delim);
}
}
else
@@ -1840,7 +2435,7 @@ yylex(void)
sv_upgrade(sv, SVt_PVMG);
sv_setsv(sv,PL_linestr);
- av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
+ av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
}
goto retry;
}
@@ -1889,10 +2484,10 @@ yylex(void)
sv_upgrade(sv, SVt_PVMG);
sv_setsv(sv,PL_linestr);
- av_store(GvAV(PL_curcop->cop_filegv),(I32)PL_curcop->cop_line,sv);
+ av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
}
PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
- if (PL_curcop->cop_line == 1) {
+ if (CopLINE(PL_curcop) == 1) {
while (s < PL_bufend && isSPACE(*s))
s++;
if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
@@ -1930,7 +2525,7 @@ yylex(void)
*/
SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
assert(SvPOK(x) || SvGMAGICAL(x));
- if (sv_eq(x, GvSV(PL_curcop->cop_filegv))) {
+ if (sv_eq(x, CopFILESV(PL_curcop))) {
sv_setpvn(x, ipath, ipathend - ipath);
SvSETMAGIC(x);
}
@@ -1942,8 +2537,24 @@ yylex(void)
* Look for options.
*/
d = instr(s,"perl -");
- if (!d)
+ if (!d) {
d = instr(s,"perl");
+#if defined(DOSISH)
+ /* avoid getting into infinite loops when shebang
+ * line contains "Perl" rather than "perl" */
+ if (!d) {
+ for (d = ipathend-4; d >= ipath; --d) {
+ if ((*d == 'p' || *d == 'P')
+ && !ibcmp(d, "perl", 4))
+ {
+ break;
+ }
+ }
+ if (d < ipath)
+ d = Nullch;
+ }
+#endif
+ }
#ifdef ALTERNATE_SHEBANG
/*
* If the ALTERNATE_SHEBANG on this system starts with a
@@ -1989,7 +2600,7 @@ yylex(void)
newargv = PL_origargv;
newargv[0] = ipath;
PerlProc_execv(ipath, newargv);
- croak("Can't exec %s", ipath);
+ Perl_croak(aTHX_ "Can't exec %s", ipath);
}
if (d) {
U32 oldpdb = PL_perldb;
@@ -2004,13 +2615,13 @@ yylex(void)
if (*d == 'M' || *d == 'm') {
char *m = d;
while (*d && !isSPACE(*d)) d++;
- croak("Too late for \"-%.*s\" option",
+ Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
(int)(d - m), m);
}
d = moreswitches(d);
} while (d);
- if (PERLDB_LINE && !oldpdb ||
- ( PL_minus_n || PL_minus_p ) && !(oldn || oldp) )
+ if ((PERLDB_LINE && !oldpdb) ||
+ ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
/* if we have already added "LINE: while (<>) {",
we must not do it again */
{
@@ -2034,9 +2645,9 @@ yylex(void)
goto retry;
case '\r':
#ifdef PERL_STRICT_CR
- warn("Illegal character \\%03o (carriage return)", '\r');
- croak(
- "(Maybe you didn't strip carriage returns after a network transfer?)\n");
+ Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
+ Perl_croak(aTHX_
+ "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
#endif
case ' ': case '\t': case '\f': case 013:
s++;
@@ -2105,7 +2716,7 @@ yylex(void)
case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
default:
- croak("Unrecognized file test: -%c", (int)tmp);
+ Perl_croak(aTHX_ "Unrecognized file test: -%c", (int)tmp);
break;
}
}
@@ -2120,7 +2731,7 @@ yylex(void)
else if (*s == '>') {
s++;
s = skipspace(s);
- if (isIDFIRST(*s)) {
+ if (isIDFIRST_lazy_if(s,UTF)) {
s = force_word(s,METHOD,FALSE,TRUE,FALSE);
TOKEN(ARROW);
}
@@ -2201,6 +2812,102 @@ yylex(void)
goto just_a_word;
}
s++;
+ switch (PL_expect) {
+ OP *attrs;
+ case XOPERATOR:
+ if (!PL_in_my || PL_lex_state != LEX_NORMAL)
+ break;
+ PL_bufptr = s; /* update in case we back off */
+ goto grabattrs;
+ case XATTRBLOCK:
+ PL_expect = XBLOCK;
+ goto grabattrs;
+ case XATTRTERM:
+ PL_expect = XTERMBLOCK;
+ grabattrs:
+ s = skipspace(s);
+ attrs = Nullop;
+ while (isIDFIRST_lazy_if(s,UTF)) {
+ d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
+ if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
+ if (tmp < 0) tmp = -tmp;
+ switch (tmp) {
+ case KEY_or:
+ case KEY_and:
+ case KEY_for:
+ case KEY_unless:
+ case KEY_if:
+ case KEY_while:
+ case KEY_until:
+ goto got_attrs;
+ default:
+ break;
+ }
+ }
+ if (*d == '(') {
+ d = scan_str(d,TRUE,TRUE);
+ if (!d) {
+ if (PL_lex_stuff) {
+ SvREFCNT_dec(PL_lex_stuff);
+ PL_lex_stuff = Nullsv;
+ }
+ /* MUST advance bufptr here to avoid bogus
+ "at end of line" context messages from yyerror().
+ */
+ PL_bufptr = s + len;
+ yyerror("Unterminated attribute parameter in attribute list");
+ if (attrs)
+ op_free(attrs);
+ return 0; /* EOF indicator */
+ }
+ }
+ if (PL_lex_stuff) {
+ SV *sv = newSVpvn(s, len);
+ sv_catsv(sv, PL_lex_stuff);
+ attrs = append_elem(OP_LIST, attrs,
+ newSVOP(OP_CONST, 0, sv));
+ SvREFCNT_dec(PL_lex_stuff);
+ PL_lex_stuff = Nullsv;
+ }
+ else {
+ attrs = append_elem(OP_LIST, attrs,
+ newSVOP(OP_CONST, 0,
+ newSVpvn(s, len)));
+ }
+ s = skipspace(d);
+ if (*s == ':' && s[1] != ':')
+ s = skipspace(s+1);
+ else if (s == d)
+ break; /* require real whitespace or :'s */
+ }
+ tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
+ if (*s != ';' && *s != tmp && (tmp != '=' || *s != ')')) {
+ char q = ((*s == '\'') ? '"' : '\'');
+ /* If here for an expression, and parsed no attrs, back off. */
+ if (tmp == '=' && !attrs) {
+ s = PL_bufptr;
+ break;
+ }
+ /* MUST advance bufptr here to avoid bogus "at end of line"
+ context messages from yyerror().
+ */
+ PL_bufptr = s;
+ if (!*s)
+ yyerror("Unterminated attribute list");
+ else
+ yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
+ q, *s, q));
+ if (attrs)
+ op_free(attrs);
+ OPERATOR(':');
+ }
+ got_attrs:
+ if (attrs) {
+ PL_nextval[PL_nexttoke].opval = attrs;
+ force_next(THING);
+ }
+ TOKEN(COLONATTR);
+ }
OPERATOR(':');
case '(':
s++;
@@ -2210,8 +2917,8 @@ yylex(void)
PL_expect = XTERM;
TOKEN('(');
case ';':
- if (PL_curcop->cop_line < PL_copline)
- PL_copline = PL_curcop->cop_line;
+ if (CopLINE(PL_curcop) < PL_copline)
+ PL_copline = CopLINE(PL_curcop);
tmp = *s++;
OPERATOR(tmp);
case ')':
@@ -2223,7 +2930,7 @@ yylex(void)
case ']':
s++;
if (PL_lex_brackets <= 0)
- yyerror("Unmatched right bracket");
+ yyerror("Unmatched right square bracket");
else
--PL_lex_brackets;
if (PL_lex_state == LEX_INTERPNORMAL) {
@@ -2265,7 +2972,7 @@ yylex(void)
while (d < PL_bufend && (*d == ' ' || *d == '\t'))
d++;
}
- if (d < PL_bufend && isIDFIRST(*d)) {
+ if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
FALSE, &len);
while (d < PL_bufend && (*d == ' ' || *d == '\t'))
@@ -2278,10 +2985,12 @@ yylex(void)
}
}
/* FALL THROUGH */
+ case XATTRBLOCK:
case XBLOCK:
PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
PL_expect = XSTATE;
break;
+ case XATTRTERM:
case XTERMBLOCK:
PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
PL_expect = XSTATE;
@@ -2322,7 +3031,8 @@ yylex(void)
if (++t < PL_bufend
&& (!isALNUM(*t)
|| ((*t == 'q' || *t == 'x') && ++t < PL_bufend
- && !isALNUM(*t)))) {
+ && !isALNUM(*t))))
+ {
char *tmps;
char open, close, term;
I32 brackets = 1;
@@ -2353,8 +3063,10 @@ yylex(void)
}
t++;
}
- else if (isALPHA(*s)) {
- for (t++; t < PL_bufend && isALNUM(*t); t++) ;
+ else if (isALNUM_lazy_if(t,UTF)) {
+ t += UTF8SKIP(t);
+ while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
+ t += UTF8SKIP(t);
}
while (t < PL_bufend && isSPACE(*t))
t++;
@@ -2372,7 +3084,7 @@ yylex(void)
}
break;
}
- yylval.ival = PL_curcop->cop_line;
+ yylval.ival = CopLINE(PL_curcop);
if (isSPACE(*s) || *s == '#')
PL_copline = NOLINE; /* invalidate current command line number */
TOKEN('{');
@@ -2380,17 +3092,18 @@ yylex(void)
rightbracket:
s++;
if (PL_lex_brackets <= 0)
- yyerror("Unmatched right bracket");
+ yyerror("Unmatched right curly bracket");
else
PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
if (PL_lex_brackets < PL_lex_formbrack)
PL_lex_formbrack = 0;
if (PL_lex_state == LEX_INTERPNORMAL) {
if (PL_lex_brackets == 0) {
- if (PL_lex_fakebrack) {
+ if (PL_expect & XFAKEBRACK) {
+ PL_expect &= XENUMMASK;
PL_lex_state = LEX_INTERPEND;
PL_bufptr = s;
- return yylex(); /* ignore fake brackets */
+ return yylex(); /* ignore fake brackets */
}
if (*s == '-' && s[1] == '>')
PL_lex_state = LEX_INTERPENDMAYBE;
@@ -2398,9 +3111,9 @@ yylex(void)
PL_lex_state = LEX_INTERPEND;
}
}
- if (PL_lex_brackets < PL_lex_fakebrack) {
+ if (PL_expect & XFAKEBRACK) {
+ PL_expect &= XENUMMASK;
PL_bufptr = s;
- PL_lex_fakebrack = 0;
return yylex(); /* ignore fake brackets */
}
force_next('}');
@@ -2412,10 +3125,12 @@ yylex(void)
AOPERATOR(ANDAND);
s--;
if (PL_expect == XOPERATOR) {
- if (PL_dowarn && isALPHA(*s) && PL_bufptr == PL_linestart) {
- PL_curcop->cop_line--;
- warn(warn_nosemi);
- PL_curcop->cop_line++;
+ if (ckWARN(WARN_SEMICOLON)
+ && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
+ {
+ CopLINE_dec(PL_curcop);
+ Perl_warner(aTHX_ WARN_SEMICOLON, PL_warn_nosemi);
+ CopLINE_inc(PL_curcop);
}
BAop(OP_BIT_AND);
}
@@ -2446,8 +3161,8 @@ yylex(void)
OPERATOR(',');
if (tmp == '~')
PMop(OP_MATCH);
- if (PL_dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
- warn("Reversed %c= operator",(int)tmp);
+ if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
+ Perl_warner(aTHX_ WARN_SYNTAX, "Reversed %c= operator",(int)tmp);
s--;
if (PL_expect == XSTATE && isALPHA(tmp) &&
(s == PL_linestart+1 || s[-2] == '\n') )
@@ -2542,12 +3257,12 @@ yylex(void)
}
}
- if (s[1] == '#' && (isALPHA(s[2]) || strchr("_{$:", s[2]))) {
- if (PL_expect == XOPERATOR)
- no_op("Array length", PL_bufptr);
+ if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
PL_tokenbuf[0] = '@';
- s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
- FALSE);
+ s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
+ sizeof PL_tokenbuf - 1, FALSE);
+ if (PL_expect == XOPERATOR)
+ no_op("Array length", s);
if (!PL_tokenbuf[1])
PREREF(DOLSHARP);
PL_expect = XOPERATOR;
@@ -2555,10 +3270,11 @@ yylex(void)
TOKEN(DOLSHARP);
}
- if (PL_expect == XOPERATOR)
- no_op("Scalar", PL_bufptr);
PL_tokenbuf[0] = '$';
- s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
+ s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
+ sizeof PL_tokenbuf - 1, FALSE);
+ if (PL_expect == XOPERATOR)
+ no_op("Scalar", s);
if (!PL_tokenbuf[1]) {
if (s == PL_bufend)
yyerror("Final $ should be \\$ or $name");
@@ -2568,12 +3284,13 @@ yylex(void)
/* This kludge not intended to be bulletproof. */
if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
yylval.opval = newSVOP(OP_CONST, 0,
- newSViv((IV)PL_compiling.cop_arybase));
+ newSViv(PL_compiling.cop_arybase));
yylval.opval->op_private = OPpCONST_ARYBASE;
TERM(THING);
}
d = s;
+ tmp = (I32)*s;
if (PL_lex_state == LEX_NORMAL)
s = skipspace(s);
@@ -2581,50 +3298,52 @@ yylex(void)
char *t;
if (*s == '[') {
PL_tokenbuf[0] = '@';
- if (PL_dowarn) {
+ if (ckWARN(WARN_SYNTAX)) {
for(t = s + 1;
- isSPACE(*t) || isALNUM(*t) || *t == '$';
+ isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
t++) ;
if (*t++ == ',') {
PL_bufptr = skipspace(PL_bufptr);
while (t < PL_bufend && *t != ']')
t++;
- warn("Multidimensional syntax %.*s not supported",
- (t - PL_bufptr) + 1, PL_bufptr);
+ Perl_warner(aTHX_ WARN_SYNTAX,
+ "Multidimensional syntax %.*s not supported",
+ (t - PL_bufptr) + 1, PL_bufptr);
}
}
}
else if (*s == '{') {
PL_tokenbuf[0] = '%';
- if (PL_dowarn && strEQ(PL_tokenbuf+1, "SIG") &&
+ if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
(t = strchr(s, '}')) && (t = strchr(t, '=')))
{
char tmpbuf[sizeof PL_tokenbuf];
STRLEN len;
for (t++; isSPACE(*t); t++) ;
- if (isIDFIRST(*t)) {
+ if (isIDFIRST_lazy_if(t,UTF)) {
t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
for (; isSPACE(*t); t++) ;
- if (*t == ';' && perl_get_cv(tmpbuf, FALSE))
- warn("You need to quote \"%s\"", tmpbuf);
+ if (*t == ';' && get_cv(tmpbuf, FALSE))
+ Perl_warner(aTHX_ WARN_SYNTAX,
+ "You need to quote \"%s\"", tmpbuf);
}
}
}
}
PL_expect = XOPERATOR;
- if (PL_lex_state == LEX_NORMAL && isSPACE(*d)) {
+ if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
bool islop = (PL_last_lop == PL_oldoldbufptr);
if (!islop || PL_last_lop_op == OP_GREPSTART)
PL_expect = XOPERATOR;
else if (strchr("$@\"'`q", *s))
PL_expect = XTERM; /* e.g. print $fh "foo" */
- else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
+ else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
PL_expect = XTERM; /* e.g. print $fh &sub */
- else if (isIDFIRST(*s)) {
+ else if (isIDFIRST_lazy_if(s,UTF)) {
char tmpbuf[sizeof PL_tokenbuf];
scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
- if (tmp = keyword(tmpbuf, len)) {
+ if ((tmp = keyword(tmpbuf, len))) {
/* binary operators exclude handle interpretations */
switch (tmp) {
case -KEY_x:
@@ -2676,15 +3395,16 @@ yylex(void)
PL_tokenbuf[0] = '%';
/* Warn about @ where they meant $. */
- if (PL_dowarn) {
+ if (ckWARN(WARN_SYNTAX)) {
if (*s == '[' || *s == '{') {
char *t = s + 1;
- while (*t && (isALNUM(*t) || strchr(" \t$#+-'\"", *t)))
+ while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
t++;
if (*t == '}' || *t == ']') {
t++;
PL_bufptr = skipspace(PL_bufptr);
- warn("Scalar value %.*s better written as $%.*s",
+ Perl_warner(aTHX_ WARN_SYNTAX,
+ "Scalar value %.*s better written as $%.*s",
t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
}
}
@@ -2699,7 +3419,8 @@ yylex(void)
/* Disable warning on "study /blah/" */
if (PL_oldoldbufptr == PL_last_uni
&& (*PL_last_uni != 's' || s - PL_last_uni < 5
- || memNE(PL_last_uni, "study", 5) || isALNUM(PL_last_uni[5])))
+ || memNE(PL_last_uni, "study", 5)
+ || isALNUM_lazy_if(PL_last_uni+5,UTF)))
check_uni();
s = scan_pat(s,OP_MATCH);
TERM(sublex_start());
@@ -2747,7 +3468,7 @@ yylex(void)
TERM(THING);
case '\'':
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (PL_expect == XOPERATOR) {
if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
PL_expect = XTERM;
@@ -2763,7 +3484,7 @@ yylex(void)
TERM(sublex_start());
case '"':
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (PL_expect == XOPERATOR) {
if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
PL_expect = XTERM;
@@ -2777,7 +3498,7 @@ yylex(void)
missingterm((char*)0);
yylval.ival = OP_CONST;
for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
- if (*d == '$' || *d == '@' || *d == '\\') {
+ if (*d == '$' || *d == '@' || *d == '\\' || *d & 0x80) {
yylval.ival = OP_STRINGIFY;
break;
}
@@ -2785,7 +3506,7 @@ yylex(void)
TERM(sublex_start());
case '`':
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (PL_expect == XOPERATOR)
no_op("Backticks",s);
if (!s)
@@ -2796,12 +3517,38 @@ yylex(void)
case '\\':
s++;
- if (PL_dowarn && PL_lex_inwhat && isDIGIT(*s))
- warn("Can't use \\%c to mean $%c in expression", *s, *s);
+ if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
+ Perl_warner(aTHX_ WARN_SYNTAX,"Can't use \\%c to mean $%c in expression",
+ *s, *s);
if (PL_expect == XOPERATOR)
no_op("Backslash",s);
OPERATOR(REFGEN);
+ case 'v':
+ if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
+ char *start = s;
+ start++;
+ start++;
+ while (isDIGIT(*start) || *start == '_')
+ start++;
+ if (*start == '.' && isDIGIT(start[1])) {
+ s = scan_num(s);
+ TERM(THING);
+ }
+ /* avoid v123abc() or $h{v1}, allow C<print v10;> */
+ else if (!isALPHA(*start) && (PL_expect == XTERM || PL_expect == XREF)) {
+ char c = *start;
+ GV *gv;
+ *start = '\0';
+ gv = gv_fetchpv(s, FALSE, SVt_PVCV);
+ *start = c;
+ if (!gv) {
+ s = scan_num(s);
+ TERM(THING);
+ }
+ }
+ }
+ goto keylookup;
case 'x':
if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
s++;
@@ -2831,14 +3578,13 @@ yylex(void)
case 's': case 'S':
case 't': case 'T':
case 'u': case 'U':
- case 'v': case 'V':
+ case 'V':
case 'w': case 'W':
case 'X':
case 'y': case 'Y':
case 'z': case 'Z':
keylookup: {
- STRLEN n_a;
gv = Nullgv;
gvp = 0;
@@ -2846,10 +3592,10 @@ yylex(void)
s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
/* Some keywords can be followed by any delimiter, including ':' */
- tmp = (len == 1 && strchr("msyq", PL_tokenbuf[0]) ||
- len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
- (PL_tokenbuf[0] == 'q' &&
- strchr("qwxr", PL_tokenbuf[1]))));
+ tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
+ (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
+ (PL_tokenbuf[0] == 'q' &&
+ strchr("qwxr", PL_tokenbuf[1])))));
/* x::* is just a word, unless x is "CORE" */
if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
@@ -2905,6 +3651,7 @@ yylex(void)
}
else if (gv && !gvp
&& -tmp==KEY_lock /* XXX generalizable kludge */
+ && GvCVu(gv)
&& !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
{
tmp = 0; /* any sub overrides "weak" keyword */
@@ -2913,9 +3660,10 @@ yylex(void)
tmp = -tmp;
gv = Nullgv;
gvp = 0;
- if (PL_dowarn && hgv
- && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
- warn("Ambiguous call resolved as CORE::%s(), %s",
+ if (ckWARN(WARN_AMBIGUOUS) && hgv
+ && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
+ Perl_warner(aTHX_ WARN_AMBIGUOUS,
+ "Ambiguous call resolved as CORE::%s(), %s",
GvENAME(hgv), "qualify as such or use &");
}
}
@@ -2930,21 +3678,21 @@ yylex(void)
/* Get the rest if it looks like a package qualifier */
- if (*s == '\'' || *s == ':' && s[1] == ':') {
+ if (*s == '\'' || (*s == ':' && s[1] == ':')) {
STRLEN morelen;
s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
TRUE, &morelen);
if (!morelen)
- croak("Bad name after %s%s", PL_tokenbuf,
+ Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
*s == '\'' ? "'" : "::");
len += morelen;
}
if (PL_expect == XOPERATOR) {
if (PL_bufptr == PL_linestart) {
- PL_curcop->cop_line--;
- warn(warn_nosemi);
- PL_curcop->cop_line++;
+ CopLINE_dec(PL_curcop);
+ Perl_warner(aTHX_ WARN_SEMICOLON, PL_warn_nosemi);
+ CopLINE_inc(PL_curcop);
}
else
no_op("Bareword",s);
@@ -2957,8 +3705,9 @@ yylex(void)
if (len > 2 &&
PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
{
- if (PL_dowarn && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
- warn("Bareword \"%s\" refers to nonexistent package",
+ if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
+ Perl_warner(aTHX_ WARN_BAREWORD,
+ "Bareword \"%s\" refers to nonexistent package",
PL_tokenbuf);
len -= 2;
PL_tokenbuf[len] = '\0';
@@ -2974,7 +3723,7 @@ yylex(void)
/* if we saw a global override before, get the right name */
if (gvp) {
- sv = newSVpv("CORE::GLOBAL::",14);
+ sv = newSVpvn("CORE::GLOBAL::",14);
sv_catpv(sv,PL_tokenbuf);
}
else
@@ -2995,13 +3744,11 @@ yylex(void)
if (PL_oldoldbufptr &&
PL_oldoldbufptr < PL_bufptr &&
- (PL_oldoldbufptr == PL_last_lop || PL_oldoldbufptr == PL_last_uni) &&
+ (PL_oldoldbufptr == PL_last_lop
+ || PL_oldoldbufptr == PL_last_uni) &&
/* NO SKIPSPACE BEFORE HERE! */
- (PL_expect == XREF
- || ((opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF
- || (PL_last_lop_op == OP_ENTERSUB
- && PL_last_proto
- && PL_last_proto[PL_last_proto[0] == ';' ? 1 : 0] == '*')) )
+ (PL_expect == XREF ||
+ ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
{
bool immediate_paren = *s == '(';
@@ -3010,15 +3757,17 @@ yylex(void)
/* Two barewords in a row may indicate method call. */
- if ((isALPHA(*s) || *s == '$') && (tmp=intuit_method(s,gv)))
+ if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
return tmp;
/* If not a declared subroutine, it's an indirect object. */
/* (But it's an indir obj regardless for sort.) */
if ((PL_last_lop_op == OP_SORT ||
- (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
- (PL_last_lop_op != OP_MAPSTART && PL_last_lop_op != OP_GREPSTART)){
+ (!immediate_paren && (!gv || !GvCVu(gv)))) &&
+ (PL_last_lop_op != OP_MAPSTART &&
+ PL_last_lop_op != OP_GREPSTART))
+ {
PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
goto bareword;
}
@@ -3031,11 +3780,8 @@ yylex(void)
if (*s == '(') {
CLINE;
if (gv && GvCVu(gv)) {
- CV *cv;
- if ((cv = GvCV(gv)) && SvPOK(cv))
- PL_last_proto = SvPV((SV*)cv, n_a);
for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
- if (*d == ')' && (sv = cv_const_sv(cv))) {
+ if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
s = d + 1;
goto its_constant;
}
@@ -3044,7 +3790,6 @@ yylex(void)
PL_expect = XOPERATOR;
force_next(WORD);
yylval.ival = 0;
- PL_last_lop_op = OP_ENTERSUB;
TOKEN('&');
}
@@ -3058,18 +3803,17 @@ yylex(void)
/* If followed by a bareword, see if it looks like indir obj. */
- if ((isALPHA(*s) || *s == '$') && (tmp = intuit_method(s,gv)))
+ if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp = intuit_method(s,gv)))
return tmp;
/* Not a method, so call it a subroutine (if defined) */
if (gv && GvCVu(gv)) {
CV* cv;
- if (lastchar == '-')
- warn("Ambiguous use of -%s resolved as -&%s()",
+ if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
+ Perl_warner(aTHX_ WARN_AMBIGUOUS,
+ "Ambiguous use of -%s resolved as -&%s()",
PL_tokenbuf, PL_tokenbuf);
- PL_last_lop = PL_oldbufptr;
- PL_last_lop_op = OP_ENTERSUB;
/* Check for a constant sub */
cv = GvCV(gv);
if ((sv = cv_const_sv(cv))) {
@@ -3083,60 +3827,51 @@ yylex(void)
/* Resolve to GV now. */
op_free(yylval.opval);
yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
+ yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
+ PL_last_lop = PL_oldbufptr;
PL_last_lop_op = OP_ENTERSUB;
/* Is there a prototype? */
if (SvPOK(cv)) {
STRLEN len;
- PL_last_proto = SvPV((SV*)cv, len);
+ char *proto = SvPV((SV*)cv, len);
if (!len)
TERM(FUNC0SUB);
- if (strEQ(PL_last_proto, "$"))
+ if (strEQ(proto, "$"))
OPERATOR(UNIOPSUB);
- if (*PL_last_proto == '&' && *s == '{') {
+ if (*proto == '&' && *s == '{') {
sv_setpv(PL_subname,"__ANON__");
PREBLOCK(LSTOPSUB);
}
- } else
- PL_last_proto = NULL;
+ }
PL_nextval[PL_nexttoke].opval = yylval.opval;
PL_expect = XTERM;
force_next(WORD);
TOKEN(NOAMP);
}
- if (PL_hints & HINT_STRICT_SUBS &&
- lastchar != '-' &&
- strnNE(s,"->",2) &&
- PL_last_lop_op != OP_TRUNCATE && /* S/F prototype in opcode.pl */
- PL_last_lop_op != OP_ACCEPT &&
- PL_last_lop_op != OP_PIPE_OP &&
- PL_last_lop_op != OP_SOCKPAIR &&
- !(PL_last_lop_op == OP_ENTERSUB
- && PL_last_proto
- && PL_last_proto[PL_last_proto[0] == ';' ? 1 : 0] == '*'))
- {
- warn(
- "Bareword \"%s\" not allowed while \"strict subs\" in use",
- PL_tokenbuf);
- ++PL_error_count;
- }
-
/* Call it a bare word */
- bareword:
- if (PL_dowarn) {
- if (lastchar != '-') {
- for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
- if (!*d)
- warn(warn_reserved, PL_tokenbuf);
+ if (PL_hints & HINT_STRICT_SUBS)
+ yylval.opval->op_private |= OPpCONST_STRICT;
+ else {
+ bareword:
+ if (ckWARN(WARN_RESERVED)) {
+ if (lastchar != '-') {
+ for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
+ if (!*d)
+ Perl_warner(aTHX_ WARN_RESERVED, PL_warn_reserved,
+ PL_tokenbuf);
+ }
}
}
safe_bareword:
- if (lastchar && strchr("*%&", lastchar)) {
- warn("Operator or semicolon missing before %c%s",
+ if (lastchar && strchr("*%&", lastchar) && ckWARN_d(WARN_AMBIGUOUS)) {
+ Perl_warner(aTHX_ WARN_AMBIGUOUS,
+ "Operator or semicolon missing before %c%s",
lastchar, PL_tokenbuf);
- warn("Ambiguous use of %c resolved as operator %c",
+ Perl_warner(aTHX_ WARN_AMBIGUOUS,
+ "Ambiguous use of %c resolved as operator %c",
lastchar, lastchar);
}
TOKEN(WORD);
@@ -3144,12 +3879,12 @@ yylex(void)
case KEY___FILE__:
yylval.opval = (OP*)newSVOP(OP_CONST, 0,
- newSVsv(GvSV(PL_curcop->cop_filegv)));
+ newSVpv(CopFILE(PL_curcop),0));
TERM(THING);
case KEY___LINE__:
- yylval.opval = (OP*)newSVOP(OP_CONST, 0,
- newSVpvf("%ld", (long)PL_curcop->cop_line));
+ yylval.opval = (OP*)newSVOP(OP_CONST, 0,
+ Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
TERM(THING);
case KEY___PACKAGE__:
@@ -3168,7 +3903,7 @@ yylex(void)
char *pname = "main";
if (PL_tokenbuf[2] == 'D')
pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
- gv = gv_fetchpv(form("%s::DATA", pname), TRUE, SVt_PVIO);
+ gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
GvMULTI_on(gv);
if (!GvIO(gv))
GvIOp(gv) = newIO();
@@ -3187,6 +3922,28 @@ yylex(void)
IoTYPE(GvIOp(gv)) = '-';
else
IoTYPE(GvIOp(gv)) = '<';
+#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
+ /* if the script was opened in binmode, we need to revert
+ * it to text mode for compatibility; but only iff it has CRs
+ * XXX this is a questionable hack at best. */
+ if (PL_bufend-PL_bufptr > 2
+ && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
+ {
+ Off_t loc = 0;
+ if (IoTYPE(GvIOp(gv)) == '<') {
+ loc = PerlIO_tell(PL_rsfp);
+ (void)PerlIO_seek(PL_rsfp, 0L, 0);
+ }
+ if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
+#if defined(__BORLANDC__)
+ /* XXX see note in do_binmode() */
+ ((FILE*)PL_rsfp)->flags |= _F_BIN;
+#endif
+ if (loc > 0)
+ PerlIO_seek(PL_rsfp, loc, 0);
+ }
+ }
+#endif
PL_rsfp = Nullfp;
}
goto fake_eof;
@@ -3195,8 +3952,9 @@ yylex(void)
case KEY_AUTOLOAD:
case KEY_DESTROY:
case KEY_BEGIN:
- case KEY_END:
+ case KEY_CHECK:
case KEY_INIT:
+ case KEY_END:
if (PL_expect == XSTATE) {
s = PL_bufptr;
goto really_sub;
@@ -3208,7 +3966,8 @@ yylex(void)
s += 2;
d = s;
s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
- tmp = keyword(PL_tokenbuf, len);
+ if (!(tmp = keyword(PL_tokenbuf, len)))
+ Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
if (tmp < 0)
tmp = -tmp;
goto reserved_word;
@@ -3234,7 +3993,7 @@ yylex(void)
LOP(OP_BIND,XTERM);
case KEY_binmode:
- UNI(OP_BINMODE);
+ LOP(OP_BINMODE,XTERM);
case KEY_bless:
LOP(OP_BLESS,XTERM);
@@ -3263,16 +4022,19 @@ yylex(void)
case KEY_crypt:
#ifdef FCRYPT
- if (!PL_cryptseen++)
+ if (!PL_cryptseen) {
+ PL_cryptseen = TRUE;
init_des();
+ }
#endif
LOP(OP_CRYPT,XTERM);
case KEY_chmod:
- if (PL_dowarn) {
+ if (ckWARN(WARN_CHMOD)) {
for (d = s; d < PL_bufend && (isSPACE(*d) || *d == '('); d++) ;
if (*d != '0' && isDIGIT(*d))
- yywarn("chmod: mode argument is missing initial 0");
+ Perl_warner(aTHX_ WARN_CHMOD,
+ "chmod() mode argument is missing initial 0");
}
LOP(OP_CHMOD,XTERM);
@@ -3324,7 +4086,7 @@ yylex(void)
PREBLOCK(ELSE);
case KEY_elsif:
- yylval.ival = PL_curcop->cop_line;
+ yylval.ival = CopLINE(PL_curcop);
OPERATOR(ELSIF);
case KEY_eq:
@@ -3374,16 +4136,24 @@ yylex(void)
case KEY_for:
case KEY_foreach:
- yylval.ival = PL_curcop->cop_line;
+ yylval.ival = CopLINE(PL_curcop);
s = skipspace(s);
- if (PL_expect == XSTATE && isIDFIRST(*s)) {
+ if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
char *p = s;
if ((PL_bufend - p) >= 3 &&
strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
p += 2;
+ else if ((PL_bufend - p) >= 4 &&
+ strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
+ p += 3;
p = skipspace(p);
- if (isIDFIRST(*p))
- croak("Missing $ on loop variable");
+ if (isIDFIRST_lazy_if(p,UTF)) {
+ p = scan_ident(p, PL_bufend,
+ PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
+ p = skipspace(p);
+ }
+ if (*p != '$')
+ Perl_croak(aTHX_ "Missing $ on loop variable");
}
OPERATOR(FOR);
@@ -3409,7 +4179,7 @@ yylex(void)
Rop(OP_SGE);
case KEY_grep:
- LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
+ LOP(OP_GREPSTART, XREF);
case KEY_goto:
s = force_word(s,WORD,TRUE,FALSE,FALSE);
@@ -3504,7 +4274,7 @@ yylex(void)
UNI(OP_HEX);
case KEY_if:
- yylval.ival = PL_curcop->cop_line;
+ yylval.ival = CopLINE(PL_curcop);
OPERATOR(IF);
case KEY_index:
@@ -3536,6 +4306,7 @@ yylex(void)
UNI(OP_LCFIRST);
case KEY_local:
+ yylval.ival = 0;
OPERATOR(LOCAL);
case KEY_length:
@@ -3570,8 +4341,8 @@ yylex(void)
TERM(sublex_start());
case KEY_map:
- LOP(OP_MAPSTART,XREF);
-
+ LOP(OP_MAPSTART, XREF);
+
case KEY_mkdir:
LOP(OP_MKDIR,XTERM);
@@ -3587,11 +4358,14 @@ yylex(void)
case KEY_msgsnd:
LOP(OP_MSGSND,XTERM);
+ case KEY_our:
case KEY_my:
- PL_in_my = TRUE;
+ PL_in_my = tmp;
s = skipspace(s);
- if (isIDFIRST(*s)) {
+ if (isIDFIRST_lazy_if(s,UTF)) {
s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
+ if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
+ goto really_sub;
PL_in_my_stash = gv_stashpv(PL_tokenbuf, FALSE);
if (!PL_in_my_stash) {
char tmpbuf[1024];
@@ -3600,6 +4374,7 @@ yylex(void)
yyerror(tmpbuf);
}
}
+ yylval.ival = 1;
OPERATOR(MY);
case KEY_next:
@@ -3618,17 +4393,21 @@ yylex(void)
OPERATOR(USE);
case KEY_not:
- OPERATOR(NOTOP);
+ if (*s == '(' || (s = skipspace(s), *s == '('))
+ FUN1(OP_NOT);
+ else
+ OPERATOR(NOTOP);
case KEY_open:
s = skipspace(s);
- if (isIDFIRST(*s)) {
+ if (isIDFIRST_lazy_if(s,UTF)) {
char *t;
- for (d = s; isALNUM(*d); d++) ;
+ for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
t = skipspace(d);
- if (strchr("|&*+-=!?:.", *t))
- warn("Precedence problem: open %.*s should be open(%.*s)",
- d-s,s, d-s,s);
+ if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE))
+ Perl_warner(aTHX_ WARN_PRECEDENCE,
+ "Precedence problem: open %.*s should be open(%.*s)",
+ d-s,s, d-s,s);
}
LOP(OP_OPEN,XTERM);
@@ -3676,7 +4455,7 @@ yylex(void)
LOP(OP_PIPE_OP,XTERM);
case KEY_q:
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (!s)
missingterm((char*)0);
yylval.ival = OP_CONST;
@@ -3686,40 +4465,52 @@ yylex(void)
UNI(OP_QUOTEMETA);
case KEY_qw:
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (!s)
missingterm((char*)0);
- if (PL_dowarn && SvLEN(PL_lex_stuff)) {
+ force_next(')');
+ if (SvCUR(PL_lex_stuff)) {
+ OP *words = Nullop;
+ int warned = 0;
d = SvPV_force(PL_lex_stuff, len);
- for (; len; --len, ++d) {
- if (*d == ',') {
- warn("Possible attempt to separate words with commas");
- break;
- }
- if (*d == '#') {
- warn("Possible attempt to put comments in qw() list");
- break;
+ while (len) {
+ for (; isSPACE(*d) && len; --len, ++d) ;
+ if (len) {
+ char *b = d;
+ if (!warned && ckWARN(WARN_QW)) {
+ for (; !isSPACE(*d) && len; --len, ++d) {
+ if (*d == ',') {
+ Perl_warner(aTHX_ WARN_QW,
+ "Possible attempt to separate words with commas");
+ ++warned;
+ }
+ else if (*d == '#') {
+ Perl_warner(aTHX_ WARN_QW,
+ "Possible attempt to put comments in qw() list");
+ ++warned;
+ }
+ }
+ }
+ else {
+ for (; !isSPACE(*d) && len; --len, ++d) ;
+ }
+ words = append_elem(OP_LIST, words,
+ newSVOP(OP_CONST, 0, newSVpvn(b, d-b)));
}
}
+ if (words) {
+ PL_nextval[PL_nexttoke].opval = words;
+ force_next(THING);
+ }
}
- force_next(')');
- PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, tokeq(PL_lex_stuff));
+ if (PL_lex_stuff)
+ SvREFCNT_dec(PL_lex_stuff);
PL_lex_stuff = Nullsv;
- force_next(THING);
- force_next(',');
- PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
- force_next(THING);
- force_next('(');
- yylval.ival = OP_SPLIT;
- CLINE;
PL_expect = XTERM;
- PL_bufptr = s;
- PL_last_lop = PL_oldbufptr;
- PL_last_lop_op = OP_SPLIT;
- return FUNC;
+ TOKEN('(');
case KEY_qq:
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (!s)
missingterm((char*)0);
yylval.ival = OP_STRINGIFY;
@@ -3732,7 +4523,7 @@ yylex(void)
TERM(sublex_start());
case KEY_qx:
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (!s)
missingterm((char*)0);
yylval.ival = OP_BACKTICK;
@@ -3743,12 +4534,18 @@ yylex(void)
OLDLOP(OP_RETURN);
case KEY_require:
- *PL_tokenbuf = '\0';
- s = force_word(s,WORD,TRUE,TRUE,FALSE);
- if (isIDFIRST(*PL_tokenbuf))
- gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
- else if (*s == '<')
- yyerror("<> should be quotes");
+ s = skipspace(s);
+ if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
+ s = force_version(s);
+ }
+ else {
+ *PL_tokenbuf = '\0';
+ s = force_word(s,WORD,TRUE,TRUE,FALSE);
+ if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
+ gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
+ else if (*s == '<')
+ yyerror("<> should be quotes");
+ }
UNI(OP_REQUIRE);
case KEY_reset:
@@ -3894,7 +4691,7 @@ yylex(void)
checkcomma(s,PL_tokenbuf,"subroutine name");
s = skipspace(s);
if (*s == ';' || *s == ')') /* probably a close */
- croak("sort is now a reserved word");
+ Perl_croak(aTHX_ "sort is now a reserved word");
PL_expect = XTERM;
s = force_word(s,WORD,TRUE,TRUE,FALSE);
LOP(OP_SORT,XREF);
@@ -3918,7 +4715,6 @@ yylex(void)
UNI(OP_STAT);
case KEY_study:
- PL_sawstudy++;
UNI(OP_STUDY);
case KEY_substr:
@@ -3927,73 +4723,97 @@ yylex(void)
case KEY_format:
case KEY_sub:
really_sub:
- s = skipspace(s);
-
- if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
+ {
char tmpbuf[sizeof PL_tokenbuf];
- PL_expect = XBLOCK;
- d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
- if (strchr(tmpbuf, ':'))
- sv_setpv(PL_subname, tmpbuf);
+ SSize_t tboffset;
+ expectation attrful;
+ bool have_name, have_proto;
+ int key = tmp;
+
+ s = skipspace(s);
+
+ if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
+ (*s == ':' && s[1] == ':'))
+ {
+ PL_expect = XBLOCK;
+ attrful = XATTRBLOCK;
+ /* remember buffer pos'n for later force_word */
+ tboffset = s - PL_oldbufptr;
+ d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
+ if (strchr(tmpbuf, ':'))
+ sv_setpv(PL_subname, tmpbuf);
+ else {
+ sv_setsv(PL_subname,PL_curstname);
+ sv_catpvn(PL_subname,"::",2);
+ sv_catpvn(PL_subname,tmpbuf,len);
+ }
+ s = skipspace(d);
+ have_name = TRUE;
+ }
else {
- sv_setsv(PL_subname,PL_curstname);
- sv_catpvn(PL_subname,"::",2);
- sv_catpvn(PL_subname,tmpbuf,len);
+ if (key == KEY_my)
+ Perl_croak(aTHX_ "Missing name in \"my sub\"");
+ PL_expect = XTERMBLOCK;
+ attrful = XATTRTERM;
+ sv_setpv(PL_subname,"?");
+ have_name = FALSE;
}
- s = force_word(s,WORD,FALSE,TRUE,TRUE);
- s = skipspace(s);
- }
- else {
- PL_expect = XTERMBLOCK;
- sv_setpv(PL_subname,"?");
- }
- if (tmp == KEY_format) {
- s = skipspace(s);
- if (*s == '=')
- PL_lex_formbrack = PL_lex_brackets + 1;
- OPERATOR(FORMAT);
- }
+ if (key == KEY_format) {
+ if (*s == '=')
+ PL_lex_formbrack = PL_lex_brackets + 1;
+ if (have_name)
+ (void) force_word(PL_oldbufptr + tboffset, WORD,
+ FALSE, TRUE, TRUE);
+ OPERATOR(FORMAT);
+ }
- /* Look for a prototype */
- if (*s == '(') {
- char *p;
+ /* Look for a prototype */
+ if (*s == '(') {
+ char *p;
+
+ s = scan_str(s,FALSE,FALSE);
+ if (!s) {
+ if (PL_lex_stuff)
+ SvREFCNT_dec(PL_lex_stuff);
+ PL_lex_stuff = Nullsv;
+ Perl_croak(aTHX_ "Prototype not terminated");
+ }
+ /* strip spaces */
+ d = SvPVX(PL_lex_stuff);
+ tmp = 0;
+ for (p = d; *p; ++p) {
+ if (!isSPACE(*p))
+ d[tmp++] = *p;
+ }
+ d[tmp] = '\0';
+ SvCUR(PL_lex_stuff) = tmp;
+ have_proto = TRUE;
- s = scan_str(s);
- if (!s) {
- if (PL_lex_stuff)
- SvREFCNT_dec(PL_lex_stuff);
- PL_lex_stuff = Nullsv;
- croak("Prototype not terminated");
+ s = skipspace(s);
}
- /* strip spaces */
- d = SvPVX(PL_lex_stuff);
- tmp = 0;
- for (p = d; *p; ++p) {
- if (!isSPACE(*p))
- d[tmp++] = *p;
+ else
+ have_proto = FALSE;
+
+ if (*s == ':' && s[1] != ':')
+ PL_expect = attrful;
+
+ if (have_proto) {
+ PL_nextval[PL_nexttoke].opval =
+ (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
+ PL_lex_stuff = Nullsv;
+ force_next(THING);
}
- d[tmp] = '\0';
- SvCUR(PL_lex_stuff) = tmp;
-
- PL_nexttoke++;
- PL_nextval[1] = PL_nextval[0];
- PL_nexttype[1] = PL_nexttype[0];
- PL_nextval[0].opval = (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
- PL_nexttype[0] = THING;
- if (PL_nexttoke == 1) {
- PL_lex_defer = PL_lex_state;
- PL_lex_expect = PL_expect;
- PL_lex_state = LEX_KNOWNEXT;
+ if (!have_name) {
+ sv_setpv(PL_subname,"__ANON__");
+ TOKEN(ANONSUB);
}
- PL_lex_stuff = Nullsv;
- }
-
- if (*SvPV(PL_subname,n_a) == '?') {
- sv_setpv(PL_subname,"__ANON__");
- TOKEN(ANONSUB);
+ (void) force_word(PL_oldbufptr + tboffset, WORD,
+ FALSE, TRUE, TRUE);
+ if (key == KEY_my)
+ TOKEN(MYSUB);
+ TOKEN(SUB);
}
- PREBLOCK(SUB);
case KEY_system:
set_csh();
@@ -4052,11 +4872,11 @@ yylex(void)
UNI(OP_UNTIE);
case KEY_until:
- yylval.ival = PL_curcop->cop_line;
+ yylval.ival = CopLINE(PL_curcop);
OPERATOR(UNTIL);
case KEY_unless:
- yylval.ival = PL_curcop->cop_line;
+ yylval.ival = CopLINE(PL_curcop);
OPERATOR(UNLESS);
case KEY_unlink:
@@ -4072,10 +4892,11 @@ yylex(void)
LOP(OP_UTIME,XTERM);
case KEY_umask:
- if (PL_dowarn) {
+ if (ckWARN(WARN_UMASK)) {
for (d = s; d < PL_bufend && (isSPACE(*d) || *d == '('); d++) ;
- if (*d != '0' && isDIGIT(*d))
- yywarn("umask: argument is missing initial 0");
+ if (*d != '0' && isDIGIT(*d))
+ Perl_warner(aTHX_ WARN_UMASK,
+ "umask: argument is missing initial 0");
}
UNI(OP_UMASK);
@@ -4086,9 +4907,9 @@ yylex(void)
if (PL_expect != XSTATE)
yyerror("\"use\" not allowed in expression");
s = skipspace(s);
- if(isDIGIT(*s)) {
+ if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
s = force_version(s);
- if(*s == ';' || (s = skipspace(s), *s == ';')) {
+ if (*s == ';' || (s = skipspace(s), *s == ';')) {
PL_nextval[PL_nexttoke].opval = Nullop;
force_next(WORD);
}
@@ -4104,11 +4925,10 @@ yylex(void)
UNI(OP_VALUES);
case KEY_vec:
- PL_sawvec = TRUE;
LOP(OP_VEC,XTERM);
case KEY_while:
- yylval.ival = PL_curcop->cop_line;
+ yylval.ival = CopLINE(PL_curcop);
OPERATOR(WHILE);
case KEY_warn:
@@ -4156,7 +4976,7 @@ yylex(void)
}
I32
-keyword(register char *d, I32 len)
+Perl_keyword(pTHX_ register char *d, I32 len)
{
switch (*d) {
case '_':
@@ -4196,6 +5016,7 @@ keyword(register char *d, I32 len)
break;
case 'C':
if (strEQ(d,"CORE")) return -KEY_CORE;
+ if (strEQ(d,"CHECK")) return KEY_CHECK;
break;
case 'c':
switch (len) {
@@ -4279,7 +5100,7 @@ keyword(register char *d, I32 len)
break;
case 6:
if (strEQ(d,"exists")) return KEY_exists;
- if (strEQ(d,"elseif")) warn("elseif should be elsif");
+ if (strEQ(d,"elseif")) Perl_warn(aTHX_ "elseif should be elsif");
break;
case 8:
if (strEQ(d,"endgrent")) return -KEY_endgrent;
@@ -4500,8 +5321,7 @@ keyword(register char *d, I32 len)
case 3:
if (strEQ(d,"ord")) return -KEY_ord;
if (strEQ(d,"oct")) return -KEY_oct;
- if (strEQ(d,"our")) { deprecate("reserved word \"our\"");
- return 0;}
+ if (strEQ(d,"our")) return KEY_our;
break;
case 4:
if (strEQ(d,"open")) return -KEY_open;
@@ -4775,22 +5595,26 @@ keyword(register char *d, I32 len)
}
STATIC void
-checkcomma(register char *s, char *name, char *what)
+S_checkcomma(pTHX_ register char *s, char *name, char *what)
{
char *w;
- if (PL_dowarn && *s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
- int level = 1;
- for (w = s+2; *w && level; w++) {
- if (*w == '(')
- ++level;
- else if (*w == ')')
- --level;
- }
- if (*w)
- for (; *w && isSPACE(*w); w++) ;
- if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
- warn("%s (...) interpreted as function",name);
+ if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
+ dTHR; /* only for ckWARN */
+ if (ckWARN(WARN_SYNTAX)) {
+ int level = 1;
+ for (w = s+2; *w && level; w++) {
+ if (*w == '(')
+ ++level;
+ else if (*w == ')')
+ --level;
+ }
+ if (*w)
+ for (; *w && isSPACE(*w); w++) ;
+ if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
+ Perl_warner(aTHX_ WARN_SYNTAX,
+ "%s (...) interpreted as function",name);
+ }
}
while (s < PL_bufend && isSPACE(*s))
s++;
@@ -4798,104 +5622,128 @@ checkcomma(register char *s, char *name, char *what)
s++;
while (s < PL_bufend && isSPACE(*s))
s++;
- if (isIDFIRST(*s)) {
+ if (isIDFIRST_lazy_if(s,UTF)) {
w = s++;
- while (isALNUM(*s))
+ while (isALNUM_lazy_if(s,UTF))
s++;
while (s < PL_bufend && isSPACE(*s))
s++;
if (*s == ',') {
int kw;
*s = '\0';
- kw = keyword(w, s - w) || perl_get_cv(w, FALSE) != 0;
+ kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
*s = ',';
if (kw)
return;
- croak("No comma allowed after %s", what);
+ Perl_croak(aTHX_ "No comma allowed after %s", what);
}
}
}
+/* Either returns sv, or mortalizes sv and returns a new SV*.
+ Best used as sv=new_constant(..., sv, ...).
+ If s, pv are NULL, calls subroutine with one argument,
+ and type is used with error messages only. */
+
STATIC SV *
-new_constant(char *s, STRLEN len, char *key, SV *sv, SV *pv, char *type)
+S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
+ const char *type)
{
dSP;
HV *table = GvHV(PL_hintgv); /* ^H */
- BINOP myop;
SV *res;
- bool oldcatch = CATCH_GET;
SV **cvp;
SV *cv, *typesv;
- char buf[128];
-
- if (!table) {
- yyerror("%^H is not defined");
- return sv;
+ const char *why1, *why2, *why3;
+
+ if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
+ SV *msg;
+
+ why1 = "%^H is not consistent";
+ why2 = strEQ(key,"charnames")
+ ? " (missing \"use charnames ...\"?)"
+ : "";
+ why3 = "";
+ report:
+ msg = Perl_newSVpvf(aTHX_ "constant(%s): %s%s%s",
+ (type ? type: "undef"), why1, why2, why3);
+ yyerror(SvPVX(msg));
+ SvREFCNT_dec(msg);
+ return sv;
}
cvp = hv_fetch(table, key, strlen(key), FALSE);
if (!cvp || !SvOK(*cvp)) {
- sprintf(buf,"$^H{%s} is not defined", key);
- yyerror(buf);
- return sv;
+ why1 = "$^H{";
+ why2 = key;
+ why3 = "} is not defined";
+ goto report;
}
sv_2mortal(sv); /* Parent created it permanently */
cv = *cvp;
- if (!pv)
- pv = sv_2mortal(newSVpv(s, len));
- if (type)
- typesv = sv_2mortal(newSVpv(type, 0));
+ if (!pv && s)
+ pv = sv_2mortal(newSVpvn(s, len));
+ if (type && pv)
+ typesv = sv_2mortal(newSVpv(type, 0));
else
- typesv = &PL_sv_undef;
- CATCH_SET(TRUE);
- Zero(&myop, 1, BINOP);
- myop.op_last = (OP *) &myop;
- myop.op_next = Nullop;
- myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
-
+ typesv = &PL_sv_undef;
+
PUSHSTACKi(PERLSI_OVERLOAD);
- ENTER;
- SAVEOP();
- PL_op = (OP *) &myop;
- if (PERLDB_SUB && PL_curstash != PL_debstash)
- PL_op->op_private |= OPpENTERSUB_DB;
- PUTBACK;
- pp_pushmark(ARGS);
-
+ ENTER ;
+ SAVETMPS;
+
+ PUSHMARK(SP) ;
EXTEND(sp, 4);
- PUSHs(pv);
+ if (pv)
+ PUSHs(pv);
PUSHs(sv);
- PUSHs(typesv);
+ if (pv)
+ PUSHs(typesv);
PUSHs(cv);
PUTBACK;
-
- if (PL_op = pp_entersub(ARGS))
- CALLRUNOPS();
- LEAVE;
- SPAGAIN;
-
- res = POPs;
- PUTBACK;
- CATCH_SET(oldcatch);
+ call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
+
+ SPAGAIN ;
+
+ /* Check the eval first */
+ if (!PL_in_eval && SvTRUE(ERRSV)) {
+ STRLEN n_a;
+ sv_catpv(ERRSV, "Propagated");
+ yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
+ (void)POPs;
+ res = SvREFCNT_inc(sv);
+ }
+ else {
+ res = POPs;
+ (void)SvREFCNT_inc(res);
+ }
+
+ PUTBACK ;
+ FREETMPS ;
+ LEAVE ;
POPSTACK;
-
+
if (!SvOK(res)) {
- sprintf(buf,"Call to &{$^H{%s}} did not return a defined value", key);
- yyerror(buf);
+ why1 = "Call to &{$^H{";
+ why2 = key;
+ why3 = "}} did not return a defined value";
+ sv = res;
+ goto report;
}
- return SvREFCNT_inc(res);
-}
+ return res;
+}
+
STATIC char *
-scan_word(register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
+S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
{
register char *d = dest;
register char *e = d + destlen - 3; /* two-character token, ending NUL */
for (;;) {
if (d >= e)
- croak(ident_too_long);
- if (isALNUM(*s))
+ Perl_croak(aTHX_ ident_too_long);
+ if (isALNUM(*s)) /* UTF handled below */
*d++ = *s++;
- else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
+ else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
*d++ = ':';
*d++ = ':';
s++;
@@ -4904,6 +5752,16 @@ scan_word(register char *s, char *dest, STRLEN destlen, int allow_package, STRLE
*d++ = *s++;
*d++ = *s++;
}
+ else if (UTF && *(U8*)s >= 0xc0 && isALNUM_utf8((U8*)s)) {
+ char *t = s + UTF8SKIP(s);
+ while (*t & 0x80 && is_utf8_mark((U8*)t))
+ t += UTF8SKIP(t);
+ if (d + (t - s) > e)
+ Perl_croak(aTHX_ ident_too_long);
+ Copy(s, d, t - s, char);
+ d += t - s;
+ s = t;
+ }
else {
*d = '\0';
*slp = d - dest;
@@ -4913,15 +5771,13 @@ scan_word(register char *s, char *dest, STRLEN destlen, int allow_package, STRLE
}
STATIC char *
-scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
+S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
{
register char *d;
register char *e;
char *bracket = 0;
char funny = *s++;
- if (PL_lex_brackets == 0)
- PL_lex_fakebrack = 0;
if (isSPACE(*s))
s = skipspace(s);
d = dest;
@@ -4929,17 +5785,17 @@ scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I3
if (isDIGIT(*s)) {
while (isDIGIT(*s)) {
if (d >= e)
- croak(ident_too_long);
+ Perl_croak(aTHX_ ident_too_long);
*d++ = *s++;
}
}
else {
for (;;) {
if (d >= e)
- croak(ident_too_long);
- if (isALNUM(*s))
+ Perl_croak(aTHX_ ident_too_long);
+ if (isALNUM(*s)) /* UTF handled below */
*d++ = *s++;
- else if (*s == '\'' && isIDFIRST(s[1])) {
+ else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
*d++ = ':';
*d++ = ':';
s++;
@@ -4948,6 +5804,16 @@ scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I3
*d++ = *s++;
*d++ = *s++;
}
+ else if (UTF && *(U8*)s >= 0xc0 && isALNUM_utf8((U8*)s)) {
+ char *t = s + UTF8SKIP(s);
+ while (*t & 0x80 && is_utf8_mark((U8*)t))
+ t += UTF8SKIP(t);
+ if (d + (t - s) > e)
+ Perl_croak(aTHX_ ident_too_long);
+ Copy(s, d, t - s, char);
+ d += t - s;
+ s = t;
+ }
else
break;
}
@@ -4960,12 +5826,9 @@ scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I3
return s;
}
if (*s == '$' && s[1] &&
- (isALNUM(s[1]) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
+ (isALNUM_lazy_if(s+1,UTF) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
{
- if (isDIGIT(s[1]) && PL_lex_state == LEX_INTERPNORMAL)
- deprecate("\"$$<digit>\" to mean \"${$}<digit>\"");
- else
- return s;
+ return s;
}
if (*s == '{') {
bracket = s;
@@ -4976,7 +5839,7 @@ scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I3
if (s < send)
*d = *s++;
d[1] = '\0';
- if (*d == '^' && *s && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
+ if (*d == '^' && *s && isCONTROLVAR(*s)) {
*d = toCTRL(*s);
s++;
}
@@ -4990,23 +5853,52 @@ scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I3
}
}
}
- if (isIDFIRST(*d)) {
+ if (isIDFIRST_lazy_if(d,UTF)) {
d++;
- while (isALNUM(*s) || *s == ':')
- *d++ = *s++;
+ if (UTF) {
+ e = s;
+ while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
+ e += UTF8SKIP(e);
+ while (e < send && *e & 0x80 && is_utf8_mark((U8*)e))
+ e += UTF8SKIP(e);
+ }
+ Copy(s, d, e - s, char);
+ d += e - s;
+ s = e;
+ }
+ else {
+ while ((isALNUM(*s) || *s == ':') && d < e)
+ *d++ = *s++;
+ if (d >= e)
+ Perl_croak(aTHX_ ident_too_long);
+ }
*d = '\0';
while (s < send && (*s == ' ' || *s == '\t')) s++;
if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
- if (PL_dowarn && keyword(dest, d - dest)) {
- char *brack = *s == '[' ? "[...]" : "{...}";
- warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
+ dTHR; /* only for ckWARN */
+ if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
+ const char *brack = *s == '[' ? "[...]" : "{...}";
+ Perl_warner(aTHX_ WARN_AMBIGUOUS,
+ "Ambiguous use of %c{%s%s} resolved to %c%s%s",
funny, dest, brack, funny, dest, brack);
}
- PL_lex_fakebrack = PL_lex_brackets+1;
bracket++;
- PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
+ PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
return s;
}
+ }
+ /* Handle extended ${^Foo} variables
+ * 1999-02-27 mjd-perl-patch@plover.com */
+ else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
+ && isALNUM(*s))
+ {
+ d++;
+ while (isALNUM(*s) && d < e) {
+ *d++ = *s++;
+ }
+ if (d >= e)
+ Perl_croak(aTHX_ ident_too_long);
+ *d = '\0';
}
if (*s == '}') {
s++;
@@ -5014,10 +5906,16 @@ scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I3
PL_lex_state = LEX_INTERPEND;
if (funny == '#')
funny = '@';
- if (PL_dowarn && PL_lex_state == LEX_NORMAL &&
- (keyword(dest, d - dest) || perl_get_cv(dest, FALSE)))
- warn("Ambiguous use of %c{%s} resolved to %c%s",
- funny, dest, funny, dest);
+ if (PL_lex_state == LEX_NORMAL) {
+ dTHR; /* only for ckWARN */
+ if (ckWARN(WARN_AMBIGUOUS) &&
+ (keyword(dest, d - dest) || get_cv(dest, FALSE)))
+ {
+ Perl_warner(aTHX_ WARN_AMBIGUOUS,
+ "Ambiguous use of %c{%s} resolved to %c%s",
+ funny, dest, funny, dest);
+ }
+ }
}
else {
s = bracket; /* let the parser handle it */
@@ -5029,7 +5927,8 @@ scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I3
return s;
}
-void pmflag(U16 *pmfl, int ch)
+void
+Perl_pmflag(pTHX_ U16 *pmfl, int ch)
{
if (ch == 'i')
*pmfl |= PMf_FOLD;
@@ -5048,17 +5947,17 @@ void pmflag(U16 *pmfl, int ch)
}
STATIC char *
-scan_pat(char *start, I32 type)
+S_scan_pat(pTHX_ char *start, I32 type)
{
PMOP *pm;
char *s;
- s = scan_str(start);
+ s = scan_str(start,FALSE,FALSE);
if (!s) {
if (PL_lex_stuff)
SvREFCNT_dec(PL_lex_stuff);
PL_lex_stuff = Nullsv;
- croak("Search pattern not terminated");
+ Perl_croak(aTHX_ "Search pattern not terminated");
}
pm = (PMOP*)newPMOP(type, 0);
@@ -5080,7 +5979,7 @@ scan_pat(char *start, I32 type)
}
STATIC char *
-scan_subst(char *start)
+S_scan_subst(pTHX_ char *start)
{
register char *s;
register PMOP *pm;
@@ -5089,20 +5988,20 @@ scan_subst(char *start)
yylval.ival = OP_NULL;
- s = scan_str(start);
+ s = scan_str(start,FALSE,FALSE);
if (!s) {
if (PL_lex_stuff)
SvREFCNT_dec(PL_lex_stuff);
PL_lex_stuff = Nullsv;
- croak("Substitution pattern not terminated");
+ Perl_croak(aTHX_ "Substitution pattern not terminated");
}
if (s[-1] == PL_multi_open)
s--;
first_start = PL_multi_start;
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (!s) {
if (PL_lex_stuff)
SvREFCNT_dec(PL_lex_stuff);
@@ -5110,7 +6009,7 @@ scan_subst(char *start)
if (PL_lex_repl)
SvREFCNT_dec(PL_lex_repl);
PL_lex_repl = Nullsv;
- croak("Substitution replacement not terminated");
+ Perl_croak(aTHX_ "Substitution replacement not terminated");
}
PL_multi_start = first_start; /* so whole substitution is taken together */
@@ -5128,17 +6027,17 @@ scan_subst(char *start)
if (es) {
SV *repl;
- PL_super_bufptr = s;
- PL_super_bufend = PL_bufend;
+ PL_sublex_info.super_bufptr = s;
+ PL_sublex_info.super_bufend = PL_bufend;
PL_multi_end = 0;
pm->op_pmflags |= PMf_EVAL;
- repl = newSVpv("",0);
+ repl = newSVpvn("",0);
while (es-- > 0)
sv_catpv(repl, es ? "eval " : "do ");
sv_catpvn(repl, "{ ", 2);
sv_catsv(repl, PL_lex_repl);
sv_catpvn(repl, " };", 2);
- SvCOMPILED_on(repl);
+ SvEVALED_on(repl);
SvREFCNT_dec(PL_lex_repl);
PL_lex_repl = repl;
}
@@ -5150,28 +6049,30 @@ scan_subst(char *start)
}
STATIC char *
-scan_trans(char *start)
+S_scan_trans(pTHX_ char *start)
{
register char* s;
OP *o;
short *tbl;
I32 squash;
- I32 Delete;
+ I32 del;
I32 complement;
+ I32 utf8;
+ I32 count = 0;
yylval.ival = OP_NULL;
- s = scan_str(start);
+ s = scan_str(start,FALSE,FALSE);
if (!s) {
if (PL_lex_stuff)
SvREFCNT_dec(PL_lex_stuff);
PL_lex_stuff = Nullsv;
- croak("Transliteration pattern not terminated");
+ Perl_croak(aTHX_ "Transliteration pattern not terminated");
}
if (s[-1] == PL_multi_open)
s--;
- s = scan_str(s);
+ s = scan_str(s,FALSE,FALSE);
if (!s) {
if (PL_lex_stuff)
SvREFCNT_dec(PL_lex_stuff);
@@ -5179,23 +6080,48 @@ scan_trans(char *start)
if (PL_lex_repl)
SvREFCNT_dec(PL_lex_repl);
PL_lex_repl = Nullsv;
- croak("Transliteration replacement not terminated");
+ Perl_croak(aTHX_ "Transliteration replacement not terminated");
}
- New(803,tbl,256,short);
- o = newPVOP(OP_TRANS, 0, (char*)tbl);
+ if (UTF) {
+ o = newSVOP(OP_TRANS, 0, 0);
+ utf8 = OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF;
+ }
+ else {
+ New(803,tbl,256,short);
+ o = newPVOP(OP_TRANS, 0, (char*)tbl);
+ utf8 = 0;
+ }
- complement = Delete = squash = 0;
- while (*s == 'c' || *s == 'd' || *s == 's') {
+ complement = del = squash = 0;
+ while (strchr("cdsCU", *s)) {
if (*s == 'c')
complement = OPpTRANS_COMPLEMENT;
else if (*s == 'd')
- Delete = OPpTRANS_DELETE;
- else
+ del = OPpTRANS_DELETE;
+ else if (*s == 's')
squash = OPpTRANS_SQUASH;
+ else {
+ switch (count++) {
+ case 0:
+ if (*s == 'C')
+ utf8 &= ~OPpTRANS_FROM_UTF;
+ else
+ utf8 |= OPpTRANS_FROM_UTF;
+ break;
+ case 1:
+ if (*s == 'C')
+ utf8 &= ~OPpTRANS_TO_UTF;
+ else
+ utf8 |= OPpTRANS_TO_UTF;
+ break;
+ default:
+ Perl_croak(aTHX_ "Too many /C and /U options");
+ }
+ }
s++;
}
- o->op_private = Delete|squash|complement;
+ o->op_private = del|squash|complement|utf8;
PL_lex_op = o;
yylval.ival = OP_TRANS;
@@ -5203,7 +6129,7 @@ scan_trans(char *start)
}
STATIC char *
-scan_heredoc(register char *s)
+S_scan_heredoc(pTHX_ register char *s)
{
dTHR;
SV *herewas;
@@ -5235,15 +6161,15 @@ scan_heredoc(register char *s)
s++, term = '\'';
else
term = '"';
- if (!isALNUM(*s))
+ if (!isALNUM_lazy_if(s,UTF))
deprecate("bare << to mean <<\"\"");
- for (; isALNUM(*s); s++) {
+ for (; isALNUM_lazy_if(s,UTF); s++) {
if (d < e)
*d++ = *s;
}
}
if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
- croak("Delimiter for here document is too long");
+ Perl_croak(aTHX_ "Delimiter for here document is too long");
*d++ = '\n';
*d = '\0';
len = d - PL_tokenbuf;
@@ -5273,9 +6199,9 @@ scan_heredoc(register char *s)
#endif
d = "\n";
if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
- herewas = newSVpv(s,PL_bufend-s);
+ herewas = newSVpvn(s,PL_bufend-s);
else
- s--, herewas = newSVpv(s,d-s);
+ s--, herewas = newSVpvn(s,d-s);
s += SvCUR(herewas);
tmpstr = NEWSV(87,79);
@@ -5290,12 +6216,12 @@ scan_heredoc(register char *s)
}
CLINE;
- PL_multi_start = PL_curcop->cop_line;
+ PL_multi_start = CopLINE(PL_curcop);
PL_multi_open = PL_multi_close = '<';
term = *PL_tokenbuf;
if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
- char *bufptr = PL_super_bufptr;
- char *bufend = PL_super_bufend;
+ char *bufptr = PL_sublex_info.super_bufptr;
+ char *bufend = PL_sublex_info.super_bufend;
char *olds = s - SvCUR(herewas);
s = strchr(bufptr, '\n');
if (!s)
@@ -5304,10 +6230,10 @@ scan_heredoc(register char *s)
while (s < bufend &&
(*s != term || memNE(s,PL_tokenbuf,len)) ) {
if (*s++ == '\n')
- PL_curcop->cop_line++;
+ CopLINE_inc(PL_curcop);
}
if (s >= bufend) {
- PL_curcop->cop_line = PL_multi_start;
+ CopLINE_set(PL_curcop, PL_multi_start);
missingterm(PL_tokenbuf);
}
sv_setpvn(herewas,bufptr,d-bufptr+1);
@@ -5324,15 +6250,15 @@ scan_heredoc(register char *s)
while (s < PL_bufend &&
(*s != term || memNE(s,PL_tokenbuf,len)) ) {
if (*s++ == '\n')
- PL_curcop->cop_line++;
+ CopLINE_inc(PL_curcop);
}
if (s >= PL_bufend) {
- PL_curcop->cop_line = PL_multi_start;
+ CopLINE_set(PL_curcop, PL_multi_start);
missingterm(PL_tokenbuf);
}
sv_setpvn(tmpstr,d+1,s-d);
s += len - 1;
- PL_curcop->cop_line++; /* the preceding stmt passes a newline */
+ CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
sv_catpvn(herewas,s,PL_bufend-s);
sv_setsv(PL_linestr,herewas);
@@ -5344,10 +6270,10 @@ scan_heredoc(register char *s)
while (s >= PL_bufend) { /* multiple line string? */
if (!outer ||
!(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
- PL_curcop->cop_line = PL_multi_start;
+ CopLINE_set(PL_curcop, PL_multi_start);
missingterm(PL_tokenbuf);
}
- PL_curcop->cop_line++;
+ CopLINE_inc(PL_curcop);
PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
#ifndef PERL_STRICT_CR
if (PL_bufend - PL_linestart >= 2) {
@@ -5369,8 +6295,7 @@ scan_heredoc(register char *s)
sv_upgrade(sv, SVt_PVMG);
sv_setsv(sv,PL_linestr);
- av_store(GvAV(PL_curcop->cop_filegv),
- (I32)PL_curcop->cop_line,sv);
+ av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
}
if (*s == term && memEQ(s,PL_tokenbuf,len)) {
s = PL_bufend - 1;
@@ -5385,7 +6310,7 @@ scan_heredoc(register char *s)
}
s++;
retval:
- PL_multi_end = PL_curcop->cop_line;
+ PL_multi_end = CopLINE(PL_curcop);
if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
@@ -5413,25 +6338,29 @@ retval:
*/
STATIC char *
-scan_inputsymbol(char *start)
+S_scan_inputsymbol(pTHX_ char *start)
{
register char *s = start; /* current position in buffer */
register char *d;
register char *e;
+ char *end;
I32 len;
d = PL_tokenbuf; /* start of temp holding space */
e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
- s = delimcpy(d, e, s + 1, PL_bufend, '>', &len); /* extract until > */
+ end = strchr(s, '\n');
+ if (!end)
+ end = PL_bufend;
+ s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
/* die if we didn't have space for the contents of the <>,
- or if it didn't end
+ or if it didn't end, or if we see a newline
*/
if (len >= sizeof PL_tokenbuf)
- croak("Excessively long <> operator");
- if (s >= PL_bufend)
- croak("Unterminated <> operator");
+ Perl_croak(aTHX_ "Excessively long <> operator");
+ if (s >= end)
+ Perl_croak(aTHX_ "Unterminated <> operator");
s++;
@@ -5445,7 +6374,7 @@ scan_inputsymbol(char *start)
if (*d == '$' && d[1]) d++;
/* allow <Pkg'VALUE> or <Pkg::VALUE> */
- while (*d && (isALNUM(*d) || *d == '\'' || *d == ':'))
+ while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
d++;
/* If we've tried to read what we allow filehandles to look like, and
@@ -5457,9 +6386,9 @@ scan_inputsymbol(char *start)
if (d - PL_tokenbuf != len) {
yylval.ival = OP_GLOB;
set_csh();
- s = scan_str(start);
+ s = scan_str(start,FALSE,FALSE);
if (!s)
- croak("Glob not terminated");
+ Perl_croak(aTHX_ "Glob not terminated");
return s;
}
else {
@@ -5482,16 +6411,16 @@ scan_inputsymbol(char *start)
if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
OP *o = newOP(OP_PADSV, 0);
o->op_targ = tmp;
- PL_lex_op = (OP*)newUNOP(OP_READLINE, 0, newUNOP(OP_RV2GV, 0, o));
+ PL_lex_op = (OP*)newUNOP(OP_READLINE, 0, o);
}
else {
GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
PL_lex_op = (OP*)newUNOP(OP_READLINE, 0,
- newUNOP(OP_RV2GV, 0,
newUNOP(OP_RV2SV, 0,
- newGVOP(OP_GV, 0, gv))));
+ newGVOP(OP_GV, 0, gv)));
}
- /* we created the ops in lex_op, so make yylval.ival a null op */
+ PL_lex_op->op_flags |= OPf_SPECIAL;
+ /* we created the ops in PL_lex_op, so make yylval.ival a null op */
yylval.ival = OP_NULL;
}
@@ -5510,6 +6439,8 @@ scan_inputsymbol(char *start)
/* scan_str
takes: start position in buffer
+ keep_quoted preserve \ on the embedded delimiter(s)
+ keep_delims preserve the delimiters around the string
returns: position to continue reading from buffer
side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
updates the read buffer.
@@ -5527,6 +6458,7 @@ scan_inputsymbol(char *start)
tr/// string transliterate tr/this/that/
y/// string transliterate y/this/that/
($*@) sub prototypes sub foo ($)
+ (stuff) sub attr parameters sub foo : attr(stuff)
<> readline or globs <FOO>, <>, <$fh>, or <*.c>
In most of these cases (all but <>, patterns and transliterate)
@@ -5549,7 +6481,7 @@ scan_inputsymbol(char *start)
*/
STATIC char *
-scan_str(char *start)
+S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
{
dTHR;
SV *sv; /* scalar value: string */
@@ -5558,6 +6490,7 @@ scan_str(char *start)
register char term; /* terminating character */
register char *to; /* current position in the sv's data */
I32 brackets = 1; /* bracket nesting level */
+ bool has_utf = FALSE; /* is there any utf8 content? */
/* skip space before the delimiter */
if (isSPACE(*s))
@@ -5568,8 +6501,11 @@ scan_str(char *start)
/* after skipping whitespace, the next character is the terminator */
term = *s;
+ if ((term & 0x80) && UTF)
+ has_utf = TRUE;
+
/* mark where we are */
- PL_multi_start = PL_curcop->cop_line;
+ PL_multi_start = CopLINE(PL_curcop);
PL_multi_open = term;
/* find corresponding closing delimiter */
@@ -5585,22 +6521,24 @@ scan_str(char *start)
(void)SvPOK_only(sv); /* validate pointer */
/* move past delimiter and try to read a complete string */
+ if (keep_delims)
+ sv_catpvn(sv, s, 1);
s++;
for (;;) {
/* extend sv if need be */
SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
/* set 'to' to the next character in the sv's string */
to = SvPVX(sv)+SvCUR(sv);
-
+
/* if open delimiter is the close delimiter read unbridle */
if (PL_multi_open == PL_multi_close) {
for (; s < PL_bufend; s++,to++) {
/* embedded newlines increment the current line number */
if (*s == '\n' && !PL_rsfp)
- PL_curcop->cop_line++;
+ CopLINE_inc(PL_curcop);
/* handle quoted delimiters */
if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
- if (s[1] == term)
+ if (!keep_quoted && s[1] == term)
s++;
/* any other quotes are simply copied straight through */
else
@@ -5610,6 +6548,8 @@ scan_str(char *start)
have found the terminator */
else if (*s == term)
break;
+ else if (!has_utf && (*s & 0x80) && UTF)
+ has_utf = TRUE;
*to = *s;
}
}
@@ -5623,10 +6563,11 @@ scan_str(char *start)
for (; s < PL_bufend; s++,to++) {
/* embedded newlines increment the line count */
if (*s == '\n' && !PL_rsfp)
- PL_curcop->cop_line++;
+ CopLINE_inc(PL_curcop);
/* backslashes can escape the open or closing characters */
if (*s == '\\' && s+1 < PL_bufend) {
- if ((s[1] == PL_multi_open) || (s[1] == PL_multi_close))
+ if (!keep_quoted &&
+ ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
s++;
else
*to++ = *s++;
@@ -5636,6 +6577,8 @@ scan_str(char *start)
break;
else if (*s == PL_multi_open)
brackets++;
+ else if (!has_utf && (*s & 0x80) && UTF)
+ has_utf = TRUE;
*to = *s;
}
}
@@ -5647,7 +6590,8 @@ scan_str(char *start)
* this next chunk reads more into the buffer if we're not done yet
*/
- if (s < PL_bufend) break; /* handle case where we are done yet :-) */
+ if (s < PL_bufend)
+ break; /* handle case where we are done yet :-) */
#ifndef PERL_STRICT_CR
if (to - SvPVX(sv) >= 2) {
@@ -5671,29 +6615,32 @@ scan_str(char *start)
if (!PL_rsfp ||
!(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
sv_free(sv);
- PL_curcop->cop_line = PL_multi_start;
+ CopLINE_set(PL_curcop, PL_multi_start);
return Nullch;
}
/* we read a line, so increment our line counter */
- PL_curcop->cop_line++;
-
+ CopLINE_inc(PL_curcop);
+
/* update debugger info */
if (PERLDB_LINE && PL_curstash != PL_debstash) {
SV *sv = NEWSV(88,0);
sv_upgrade(sv, SVt_PVMG);
sv_setsv(sv,PL_linestr);
- av_store(GvAV(PL_curcop->cop_filegv),
- (I32)PL_curcop->cop_line, sv);
+ av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
}
-
+
/* having changed the buffer, we must update PL_bufend */
PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
}
/* at this point, we have successfully read the delimited string */
- PL_multi_end = PL_curcop->cop_line;
+ if (keep_delims)
+ sv_catpvn(sv, s, 1);
+ if (has_utf)
+ SvUTF8_on(sv);
+ PL_multi_end = CopLINE(PL_curcop);
s++;
/* if we allocated too much space, give some back */
@@ -5721,7 +6668,7 @@ scan_str(char *start)
Read a number in any of the formats that Perl accepts:
- 0(x[0-7A-F]+)|([0-7]+)
+ 0(x[0-7A-F]+)|([0-7]+)|(b[01])
[\d_]+(\.[\d_]*)?[Ee](\d+)
Underbars (_) are allowed in decimal numbers. If -w is on,
@@ -5736,15 +6683,14 @@ scan_str(char *start)
*/
char *
-scan_num(char *start)
+Perl_scan_num(pTHX_ char *start)
{
register char *s = start; /* current position in buffer */
register char *d; /* destination in temp buffer */
register char *e; /* end of temp buffer */
- I32 tryiv; /* used to see if it can be an int */
- double value; /* number read, as a double */
- SV *sv; /* place to put the converted number */
- I32 floatit; /* boolean: int or float? */
+ NV value; /* number read, as a double */
+ SV *sv = Nullsv; /* place to put the converted number */
+ bool floatit; /* boolean: int or float? */
char *lastub = 0; /* position of last underbar */
static char number_too_long[] = "Number too long";
@@ -5752,42 +6698,63 @@ scan_num(char *start)
switch (*s) {
default:
- croak("panic: scan_num");
+ Perl_croak(aTHX_ "panic: scan_num");
/* if it starts with a 0, it could be an octal number, a decimal in
- 0.13 disguise, or a hexadecimal number.
- */
+ 0.13 disguise, or a hexadecimal number, or a binary number. */
case '0':
{
/* variables:
u holds the "number so far"
- shift the power of 2 of the base (hex == 4, octal == 3)
+ shift the power of 2 of the base
+ (hex == 4, octal == 3, binary == 1)
overflowed was the number more than we can hold?
Shift is used when we add a digit. It also serves as an "are
- we in octal or hex?" indicator to disallow hex characters when
- in octal mode.
+ we in octal/hex/binary?" indicator to disallow hex characters
+ when in octal mode.
*/
- UV u;
+ dTHR;
+ NV n = 0.0;
+ UV u = 0;
I32 shift;
bool overflowed = FALSE;
+ static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
+ static char* bases[5] = { "", "binary", "", "octal",
+ "hexadecimal" };
+ static char* Bases[5] = { "", "Binary", "", "Octal",
+ "Hexadecimal" };
+ static char *maxima[5] = { "",
+ "0b11111111111111111111111111111111",
+ "",
+ "037777777777",
+ "0xffffffff" };
+ char *base, *Base, *max;
/* check for hex */
if (s[1] == 'x') {
shift = 4;
s += 2;
+ } else if (s[1] == 'b') {
+ shift = 1;
+ s += 2;
}
/* check for a decimal in disguise */
- else if (s[1] == '.')
+ else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
goto decimal;
/* so it must be octal */
else
shift = 3;
- u = 0;
- /* read the rest of the octal number */
+ base = bases[shift];
+ Base = Bases[shift];
+ max = maxima[shift];
+
+ /* read the rest of the number */
for (;;) {
- UV n, b; /* n is used in the overflow test, b is the digit we're adding on */
+ /* x is used in the overflow test,
+ b is the digit we're adding on. */
+ UV x, b;
switch (*s) {
@@ -5802,13 +6769,18 @@ scan_num(char *start)
/* 8 and 9 are not octal */
case '8': case '9':
- if (shift != 4)
- yyerror("Illegal octal digit");
+ if (shift == 3)
+ yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
/* FALL THROUGH */
/* octal digits */
- case '0': case '1': case '2': case '3': case '4':
+ case '2': case '3': case '4':
case '5': case '6': case '7':
+ if (shift == 1)
+ yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
+ /* FALL THROUGH */
+
+ case '0': case '1':
b = *s++ & 15; /* ASCII digit -> value of digit */
goto digit;
@@ -5825,14 +6797,33 @@ scan_num(char *start)
*/
digit:
- n = u << shift; /* make room for the digit */
- if (!overflowed && (n >> shift) != u
- && !(PL_hints & HINT_NEW_BINARY)) {
- warn("Integer overflow in %s number",
- (shift == 4) ? "hex" : "octal");
- overflowed = TRUE;
+ if (!overflowed) {
+ x = u << shift; /* make room for the digit */
+
+ if ((x >> shift) != u
+ && !(PL_hints & HINT_NEW_BINARY)) {
+ dTHR;
+ overflowed = TRUE;
+ n = (NV) u;
+ if (ckWARN_d(WARN_OVERFLOW))
+ Perl_warner(aTHX_ WARN_OVERFLOW,
+ "Integer overflow in %s number",
+ base);
+ } else
+ u = x | b; /* add the digit to the end */
+ }
+ if (overflowed) {
+ n *= nvshift[shift];
+ /* If an NV has not enough bits in its
+ * mantissa to represent an UV this summing of
+ * small low-order numbers is a waste of time
+ * (because the NV cannot preserve the
+ * low-order bits anyway): we could just
+ * remember when did we overflow and in the
+ * end just multiply n by the right
+ * amount. */
+ n += (NV) b;
}
- u = n | b; /* add the digit to the end */
break;
}
}
@@ -5842,8 +6833,25 @@ scan_num(char *start)
*/
out:
sv = NEWSV(92,0);
- sv_setuv(sv, u);
- if ( PL_hints & HINT_NEW_BINARY)
+ if (overflowed) {
+ dTHR;
+ if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "%s number > %s non-portable",
+ Base, max);
+ sv_setnv(sv, n);
+ }
+ else {
+#if UVSIZE > 4
+ dTHR;
+ if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "%s number > %s non-portable",
+ Base, max);
+#endif
+ sv_setuv(sv, u);
+ }
+ if (PL_hints & HINT_NEW_BINARY)
sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
}
break;
@@ -5865,22 +6873,26 @@ scan_num(char *start)
if -w is on
*/
if (*s == '_') {
- if (PL_dowarn && lastub && s - lastub != 3)
- warn("Misplaced _ in number");
+ dTHR; /* only for ckWARN */
+ if (ckWARN(WARN_SYNTAX) && lastub && s - lastub != 3)
+ Perl_warner(aTHX_ WARN_SYNTAX, "Misplaced _ in number");
lastub = ++s;
}
else {
/* check for end of fixed-length buffer */
if (d >= e)
- croak(number_too_long);
+ Perl_croak(aTHX_ number_too_long);
/* if we're ok, copy the character */
*d++ = *s++;
}
}
/* final misplaced underbar check */
- if (PL_dowarn && lastub && s - lastub != 3)
- warn("Misplaced _ in number");
+ if (lastub && s - lastub != 3) {
+ dTHR;
+ if (ckWARN(WARN_SYNTAX))
+ Perl_warner(aTHX_ WARN_SYNTAX, "Misplaced _ in number");
+ }
/* read a decimal portion if there is one. avoid
3..5 being interpreted as the number 3. followed
@@ -5896,10 +6908,15 @@ scan_num(char *start)
for (; isDIGIT(*s) || *s == '_'; s++) {
/* fixed length buffer check */
if (d >= e)
- croak(number_too_long);
+ Perl_croak(aTHX_ number_too_long);
if (*s != '_')
*d++ = *s;
}
+ if (*s == '.' && isDIGIT(s[1])) {
+ /* oops, it's really a v-string, but without the "v" */
+ s = start - 1;
+ goto vstring;
+ }
}
/* read exponent part, if present */
@@ -5917,7 +6934,7 @@ scan_num(char *start)
/* read digits of exponent (no underbars :-) */
while (isDIGIT(*s)) {
if (d >= e)
- croak(number_too_long);
+ Perl_croak(aTHX_ number_too_long);
*d++ = *s++;
}
}
@@ -5927,9 +6944,17 @@ scan_num(char *start)
/* make an sv from the string */
sv = NEWSV(92,0);
- /* reset numeric locale in case we were earlier left in Swaziland */
- SET_NUMERIC_STANDARD();
- value = atof(PL_tokenbuf);
+
+ /* unfortunately this monster needs to be on one line or
+ makedepend will be confused. */
+#if (defined(USE_64_BIT_INT) && (!defined(HAS_STRTOLL)|| !defined(HAS_STRTOULL))) || (!defined(USE_64_BIT_INT) && (!defined(HAS_STRTOL) || !defined(HAS_STRTOUL)))
+
+ /*
+ No working strto[u]l[l]. Since atoi() doesn't do range checks,
+ we need to do this the hard way.
+ */
+
+ value = Atof(PL_tokenbuf);
/*
See if we can make do with an integer value without loss of
@@ -5941,31 +6966,130 @@ scan_num(char *start)
Note: if floatit is true, then we don't need to do the
conversion at all.
*/
- tryiv = I_V(value);
- if (!floatit && (double)tryiv == value)
- sv_setiv(sv, tryiv);
- else
+ {
+ UV tryuv = U_V(value);
+ if (!floatit && (NV)tryuv == value) {
+ if (tryuv <= IV_MAX)
+ sv_setiv(sv, (IV)tryuv);
+ else
+ sv_setuv(sv, tryuv);
+ }
+ else
+ sv_setnv(sv, value);
+ }
+#else
+ /*
+ strtol/strtoll sets errno to ERANGE if the number is too big
+ for an integer. We try to do an integer conversion first
+ if no characters indicating "float" have been found.
+ */
+
+ if (!floatit) {
+ IV iv;
+ UV uv;
+ errno = 0;
+ if (*PL_tokenbuf == '-')
+ iv = Strtol(PL_tokenbuf, (char**)NULL, 10);
+ else
+ uv = Strtoul(PL_tokenbuf, (char**)NULL, 10);
+ if (errno)
+ floatit = TRUE; /* probably just too large */
+ else if (*PL_tokenbuf == '-')
+ sv_setiv(sv, iv);
+ else
+ sv_setuv(sv, uv);
+ }
+ if (floatit) {
+ value = Atof(PL_tokenbuf);
sv_setnv(sv, value);
- if ( floatit ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) )
+ }
+#endif
+ if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
+ (PL_hints & HINT_NEW_INTEGER) )
sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
- (floatit ? "float" : "integer"), sv, Nullsv, NULL);
+ (floatit ? "float" : "integer"),
+ sv, Nullsv, NULL);
+ break;
+
+ /* if it starts with a v, it could be a v-string */
+ case 'v':
+vstring:
+ {
+ char *pos = s;
+ pos++;
+ while (isDIGIT(*pos) || *pos == '_')
+ pos++;
+ if (!isALPHA(*pos)) {
+ UV rev;
+ U8 tmpbuf[UTF8_MAXLEN];
+ U8 *tmpend;
+ bool utf8 = FALSE;
+ s++; /* get past 'v' */
+
+ sv = NEWSV(92,5);
+ sv_setpvn(sv, "", 0);
+
+ for (;;) {
+ if (*s == '0' && isDIGIT(s[1]))
+ yyerror("Octal number in vector unsupported");
+ rev = 0;
+ {
+ /* this is atoi() that tolerates underscores */
+ char *end = pos;
+ UV mult = 1;
+ while (--end >= s) {
+ UV orev;
+ if (*end == '_')
+ continue;
+ orev = rev;
+ rev += (*end - '0') * mult;
+ mult *= 10;
+ if (orev > rev && ckWARN_d(WARN_OVERFLOW))
+ Perl_warner(aTHX_ WARN_OVERFLOW,
+ "Integer overflow in decimal number");
+ }
+ }
+ tmpend = uv_to_utf8(tmpbuf, rev);
+ utf8 = utf8 || rev > 127;
+ sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
+ if (*pos == '.' && isDIGIT(pos[1]))
+ s = ++pos;
+ else {
+ s = pos;
+ break;
+ }
+ while (isDIGIT(*pos) || *pos == '_')
+ pos++;
+ }
+
+ SvPOK_on(sv);
+ SvREADONLY_on(sv);
+ if (utf8) {
+ SvUTF8_on(sv);
+ sv_utf8_downgrade(sv, TRUE);
+ }
+ }
+ }
break;
}
/* make the op for the constant and return */
- yylval.opval = newSVOP(OP_CONST, 0, sv);
+ if (sv)
+ yylval.opval = newSVOP(OP_CONST, 0, sv);
+ else
+ yylval.opval = Nullop;
return s;
}
STATIC char *
-scan_formline(register char *s)
+S_scan_formline(pTHX_ register char *s)
{
dTHR;
register char *eol;
register char *t;
- SV *stuff = newSVpv("",0);
+ SV *stuff = newSVpvn("",0);
bool needargs = FALSE;
while (!needargs) {
@@ -5996,6 +7120,14 @@ scan_formline(register char *s)
needargs = TRUE;
}
sv_catpvn(stuff, s, eol-s);
+#ifndef PERL_STRICT_CR
+ if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
+ char *end = SvPVX(stuff) + SvCUR(stuff);
+ end[-2] = '\n';
+ end[-1] = '\0';
+ SvCUR(stuff)--;
+ }
+#endif
}
s = eol;
if (PL_rsfp) {
@@ -6034,7 +7166,7 @@ scan_formline(register char *s)
}
STATIC void
-set_csh(void)
+S_set_csh(pTHX)
{
#ifdef CSH
if (!PL_cshlen)
@@ -6043,7 +7175,7 @@ set_csh(void)
}
I32
-start_subparse(I32 is_format, U32 flags)
+Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
{
dTHR;
I32 oldsavestack_ix = PL_savestack_ix;
@@ -6053,11 +7185,10 @@ start_subparse(I32 is_format, U32 flags)
if (PL_compcv) {
assert(SvTYPE(PL_compcv) == SVt_PVCV);
}
- save_I32(&PL_subline);
+ SAVEI32(PL_subline);
save_item(PL_subname);
SAVEI32(PL_padix);
- SAVESPTR(PL_curpad);
- SAVESPTR(PL_comppad);
+ SAVECOMPPAD();
SAVESPTR(PL_comppad_name);
SAVESPTR(PL_compcv);
SAVEI32(PL_comppad_name_fill);
@@ -6076,9 +7207,9 @@ start_subparse(I32 is_format, U32 flags)
PL_comppad_name_fill = 0;
PL_min_intro_pending = 0;
PL_padix = 0;
- PL_subline = PL_curcop->cop_line;
+ PL_subline = CopLINE(PL_curcop);
#ifdef USE_THREADS
- av_store(PL_comppad_name, 0, newSVpv("@_", 2));
+ av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
PL_curpad[0] = (SV*)newAV();
SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
#endif /* USE_THREADS */
@@ -6100,18 +7231,17 @@ start_subparse(I32 is_format, U32 flags)
}
int
-yywarn(char *s)
+Perl_yywarn(pTHX_ char *s)
{
dTHR;
- --PL_error_count;
- PL_in_eval |= 2;
+ PL_in_eval |= EVAL_WARNONLY;
yyerror(s);
- PL_in_eval &= ~2;
+ PL_in_eval &= ~EVAL_WARNONLY;
return 0;
}
int
-yyerror(char *s)
+Perl_yyerror(pTHX_ char *s)
{
dTHR;
char *where = NULL;
@@ -6137,7 +7267,12 @@ yyerror(char *s)
}
else if (yychar > 255)
where = "next token ???";
+#ifdef USE_PURE_BISON
+/* GNU Bison sets the value -2 */
+ else if (yychar == -2) {
+#else
else if ((yychar & 127) == 127) {
+#endif
if (PL_lex_state == LEX_NORMAL ||
(PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
where = "at end of line";
@@ -6147,39 +7282,63 @@ yyerror(char *s)
where = "within string";
}
else {
- SV *where_sv = sv_2mortal(newSVpv("next char ", 0));
+ SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
if (yychar < 32)
- sv_catpvf(where_sv, "^%c", toCTRL(yychar));
+ Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
else if (isPRINT_LC(yychar))
- sv_catpvf(where_sv, "%c", yychar);
+ Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
else
- sv_catpvf(where_sv, "\\%03o", yychar & 255);
+ Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
where = SvPVX(where_sv);
}
msg = sv_2mortal(newSVpv(s, 0));
- sv_catpvf(msg, " at %_ line %ld, ",
- GvSV(PL_curcop->cop_filegv), (long)PL_curcop->cop_line);
+ Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
+ CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
if (context)
- sv_catpvf(msg, "near \"%.*s\"\n", contlen, context);
+ Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
else
- sv_catpvf(msg, "%s\n", where);
- if (PL_multi_start < PL_multi_end && (U32)(PL_curcop->cop_line - PL_multi_end) <= 1) {
- sv_catpvf(msg,
- " (Might be a runaway multi-line %c%c string starting on line %ld)\n",
- (int)PL_multi_open,(int)PL_multi_close,(long)PL_multi_start);
+ Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
+ if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
+ Perl_sv_catpvf(aTHX_ msg,
+ " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
+ (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
PL_multi_end = 0;
}
- if (PL_in_eval & 2)
- warn("%_", msg);
- else if (PL_in_eval)
- sv_catsv(ERRSV, msg);
+ if (PL_in_eval & EVAL_WARNONLY)
+ Perl_warn(aTHX_ "%"SVf, msg);
else
- PerlIO_write(PerlIO_stderr(), SvPVX(msg), SvCUR(msg));
- if (++PL_error_count >= 10)
- croak("%_ has too many errors.\n", GvSV(PL_curcop->cop_filegv));
+ qerror(msg);
+ if (PL_error_count >= 10) {
+ if (PL_in_eval && SvCUR(ERRSV))
+ Perl_croak(aTHX_ "%_%s has too many errors.\n",
+ ERRSV, CopFILE(PL_curcop));
+ else
+ Perl_croak(aTHX_ "%s has too many errors.\n",
+ CopFILE(PL_curcop));
+ }
PL_in_my = 0;
PL_in_my_stash = Nullhv;
return 0;
}
+#ifdef PERL_OBJECT
+#include "XSUB.h"
+#endif
+
+/*
+ * restore_rsfp
+ * Restore a source filter.
+ */
+
+static void
+restore_rsfp(pTHXo_ void *f)
+{
+ PerlIO *fp = (PerlIO*)f;
+
+ if (PL_rsfp == PerlIO_stdin())
+ PerlIO_clearerr(PL_rsfp);
+ else if (PL_rsfp && (PL_rsfp != fp))
+ PerlIO_close(PL_rsfp);
+ PL_rsfp = fp;
+}
diff --git a/contrib/perl5/universal.c b/contrib/perl5/universal.c
index aba150e..fc0ec41 100644
--- a/contrib/perl5/universal.c
+++ b/contrib/perl5/universal.c
@@ -1,4 +1,5 @@
#include "EXTERN.h"
+#define PERL_IN_UNIVERSAL_C
#include "perl.h"
/*
@@ -7,7 +8,7 @@
*/
STATIC SV *
-isa_lookup(HV *stash, char *name, int len, int level)
+S_isa_lookup(pTHX_ HV *stash, const char *name, int len, int level)
{
AV* av;
GV* gv;
@@ -21,7 +22,7 @@ isa_lookup(HV *stash, char *name, int len, int level)
return &PL_sv_yes;
if (level > 100)
- croak("Recursive inheritance detected in package '%s'", HvNAME(stash));
+ Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'", HvNAME(stash));
gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, FALSE);
@@ -53,8 +54,10 @@ isa_lookup(HV *stash, char *name, int len, int level)
SV* sv = *svp++;
HV* basestash = gv_stashsv(sv, FALSE);
if (!basestash) {
- if (PL_dowarn)
- warn("Can't locate package %s for @%s::ISA",
+ dTHR;
+ if (ckWARN(WARN_MISC))
+ Perl_warner(aTHX_ WARN_SYNTAX,
+ "Can't locate package %s for @%s::ISA",
SvPVX(sv), HvNAME(stash));
continue;
}
@@ -70,10 +73,19 @@ isa_lookup(HV *stash, char *name, int len, int level)
return boolSV(strEQ(name, "UNIVERSAL"));
}
+/*
+=for apidoc sv_derived_from
+
+Returns a boolean indicating whether the SV is derived from the specified
+class. This is the function that implements C<UNIVERSAL::isa>. It works
+for class names as well as for objects.
+
+=cut
+*/
+
bool
-sv_derived_from(SV *sv, char *name)
+Perl_sv_derived_from(pTHX_ SV *sv, const char *name)
{
- SV *rv;
char *type;
HV *stash;
@@ -97,12 +109,21 @@ sv_derived_from(SV *sv, char *name)
(stash && isa_lookup(stash, name, strlen(name), 0) == &PL_sv_yes)
? TRUE
: FALSE ;
-
}
-#ifdef PERL_OBJECT
-#define NO_XSLOCKS
-#endif /* PERL_OBJECT */
+void XS_UNIVERSAL_isa(pTHXo_ CV *cv);
+void XS_UNIVERSAL_can(pTHXo_ CV *cv);
+void XS_UNIVERSAL_VERSION(pTHXo_ CV *cv);
+
+void
+Perl_boot_core_UNIVERSAL(pTHX)
+{
+ char *file = __FILE__;
+
+ newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
+ newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
+ newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
+}
#include "XSUB.h"
@@ -114,9 +135,16 @@ XS(XS_UNIVERSAL_isa)
STRLEN n_a;
if (items != 2)
- croak("Usage: UNIVERSAL::isa(reference, kind)");
+ Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)");
sv = ST(0);
+
+ if (SvGMAGICAL(sv))
+ mg_get(sv);
+
+ if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))))
+ XSRETURN_UNDEF;
+
name = (char *)SvPV(ST(1),n_a);
ST(0) = boolSV(sv_derived_from(sv, name));
@@ -133,9 +161,16 @@ XS(XS_UNIVERSAL_can)
STRLEN n_a;
if (items != 2)
- croak("Usage: UNIVERSAL::can(object-ref, method)");
+ Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)");
sv = ST(0);
+
+ if (SvGMAGICAL(sv))
+ mg_get(sv);
+
+ if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))))
+ XSRETURN_UNDEF;
+
name = (char *)SvPV(ST(1),n_a);
rv = &PL_sv_undef;
@@ -166,12 +201,11 @@ XS(XS_UNIVERSAL_VERSION)
GV *gv;
SV *sv;
char *undef;
- double req;
- if(SvROK(ST(0))) {
+ if (SvROK(ST(0))) {
sv = (SV*)SvRV(ST(0));
- if(!SvOBJECT(sv))
- croak("Cannot find version of an unblessed reference");
+ if (!SvOBJECT(sv))
+ Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
pkg = SvSTASH(sv);
}
else {
@@ -180,7 +214,7 @@ XS(XS_UNIVERSAL_VERSION)
gvp = pkg ? (GV**)hv_fetch(pkg,"VERSION",7,FALSE) : Null(GV**);
- if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (sv = GvSV(gv))) {
+ if (gvp && isGV(gv = *gvp) && SvOK(sv = GvSV(gv))) {
SV *nsv = sv_newmortal();
sv_setsv(nsv, sv);
sv = nsv;
@@ -191,29 +225,58 @@ XS(XS_UNIVERSAL_VERSION)
undef = "(undef)";
}
- if (items > 1 && (undef || (req = SvNV(ST(1)), req > SvNV(sv)))) {
- STRLEN n_a;
- croak("%s version %s required--this is only version %s",
- HvNAME(pkg), SvPV(ST(1),n_a), undef ? undef : SvPV(sv,n_a));
+ if (items > 1) {
+ STRLEN len;
+ SV *req = ST(1);
+
+ if (undef)
+ Perl_croak(aTHX_ "%s does not define $%s::VERSION--version check failed",
+ HvNAME(pkg), HvNAME(pkg));
+
+ if (!SvNIOK(sv) && SvPOK(sv)) {
+ char *str = SvPVx(sv,len);
+ while (len) {
+ --len;
+ /* XXX could DWIM "1.2.3" here */
+ if (!isDIGIT(str[len]) && str[len] != '.' && str[len] != '_')
+ break;
+ }
+ if (len) {
+ if (SvNIOKp(req) && SvPOK(req)) {
+ /* they said C<use Foo v1.2.3> and $Foo::VERSION
+ * doesn't look like a float: do string compare */
+ if (sv_cmp(req,sv) == 1) {
+ Perl_croak(aTHX_ "%s v%vd required--"
+ "this is only v%vd",
+ HvNAME(pkg), req, sv);
+ }
+ goto finish;
+ }
+ /* they said C<use Foo 1.002_003> and $Foo::VERSION
+ * doesn't look like a float: force numeric compare */
+ (void)SvUPGRADE(sv, SVt_PVNV);
+ SvNVX(sv) = str_to_version(sv);
+ SvPOK_off(sv);
+ SvNOK_on(sv);
+ }
+ }
+ /* if we get here, we're looking for a numeric comparison,
+ * so force the required version into a float, even if they
+ * said C<use Foo v1.2.3> */
+ if (SvNIOKp(req) && SvPOK(req)) {
+ NV n = SvNV(req);
+ req = sv_newmortal();
+ sv_setnv(req, n);
+ }
+
+ if (SvNV(req) > SvNV(sv))
+ Perl_croak(aTHX_ "%s version %s required--this is only version %s",
+ HvNAME(pkg), SvPV(req,len), SvPV(sv,len));
}
+finish:
ST(0) = sv;
XSRETURN(1);
}
-#ifdef PERL_OBJECT
-#undef boot_core_UNIVERSAL
-#define boot_core_UNIVERSAL CPerlObj::Perl_boot_core_UNIVERSAL
-#define pPerl this
-#endif
-
-void
-boot_core_UNIVERSAL(void)
-{
- char *file = __FILE__;
-
- newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
- newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
- newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
-}
diff --git a/contrib/perl5/unixish.h b/contrib/perl5/unixish.h
index 5bcff33..1168d29 100644
--- a/contrib/perl5/unixish.h
+++ b/contrib/perl5/unixish.h
@@ -89,7 +89,7 @@
*/
/* #define ALTERNATE_SHEBANG "#!" / **/
-#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) || defined(__NetBSD__)
+#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) || defined(__NetBSD__)
# include <signal.h>
#endif
@@ -99,7 +99,7 @@
#ifndef SIGILL
# define SIGILL 6 /* blech */
#endif
-#define ABORT() kill(getpid(),SIGABRT);
+#define ABORT() kill(PerlProc_getpid(),SIGABRT);
/*
* fwrite1() should be a routine with the same calling sequence as fwrite(),
@@ -114,17 +114,28 @@
#define Fflush(fp) fflush(fp)
#define Mkdir(path,mode) mkdir((path),(mode))
+/* these should be set in a hint file, not here */
#ifndef PERL_SYS_INIT
-#ifdef PERL_SCO5
-/* this should be set in a hint file, not here */
+#if defined(PERL_SCO5) || defined(__FreeBSD__)
+# ifdef __FreeBSD__
+# include <floatingpoint.h>
+# endif
# define PERL_SYS_INIT(c,v) fpsetmask(0); MALLOC_INIT
#else
-# define PERL_SYS_INIT(c,v) MALLOC_INIT
+# ifdef POSIX_BC
+# define PERL_SYS_INIT(c,v) sigignore(SIGFPE); MALLOC_INIT
+# else
+# ifdef __CYGWIN__
+# define PERL_SYS_INIT(c,v) Perl_my_setenv_init(&environ); MALLOC_INIT
+# else
+# define PERL_SYS_INIT(c,v) MALLOC_INIT
+# endif
+# endif
#endif
#endif
#ifndef PERL_SYS_TERM
-#define PERL_SYS_TERM() MALLOC_TERM
+#define PERL_SYS_TERM() OP_REFCNT_TERM; MALLOC_TERM
#endif
#define BIT_BUCKET "/dev/null"
diff --git a/contrib/perl5/utf8.c b/contrib/perl5/utf8.c
new file mode 100644
index 0000000..223f5ac
--- /dev/null
+++ b/contrib/perl5/utf8.c
@@ -0,0 +1,856 @@
+/* utf8.c
+ *
+ * Copyright (c) 1998-2000, Larry Wall
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * 'What a fix!' said Sam. 'That's the one place in all the lands we've ever
+ * heard of that we don't want to see any closer; and that's the one place
+ * we're trying to get to! And that's just where we can't get, nohow.'
+ *
+ * 'Well do I understand your speech,' he answered in the same language;
+ * 'yet few strangers do so. Why then do you not speak in the Common Tongue,
+ * as is the custom in the West, if you wish to be answered?'
+ *
+ * ...the travellers perceived that the floor was paved with stones of many
+ * hues; branching runes and strange devices intertwined beneath their feet.
+ */
+
+#include "EXTERN.h"
+#define PERL_IN_UTF8_C
+#include "perl.h"
+
+/* Unicode support */
+
+U8 *
+Perl_uv_to_utf8(pTHX_ U8 *d, UV uv)
+{
+ if (uv < 0x80) {
+ *d++ = uv;
+ return d;
+ }
+ if (uv < 0x800) {
+ *d++ = (( uv >> 6) | 0xc0);
+ *d++ = (( uv & 0x3f) | 0x80);
+ return d;
+ }
+ if (uv < 0x10000) {
+ *d++ = (( uv >> 12) | 0xe0);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ return d;
+ }
+ if (uv < 0x200000) {
+ *d++ = (( uv >> 18) | 0xf0);
+ *d++ = (((uv >> 12) & 0x3f) | 0x80);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ return d;
+ }
+ if (uv < 0x4000000) {
+ *d++ = (( uv >> 24) | 0xf8);
+ *d++ = (((uv >> 18) & 0x3f) | 0x80);
+ *d++ = (((uv >> 12) & 0x3f) | 0x80);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ return d;
+ }
+ if (uv < 0x80000000) {
+ *d++ = (( uv >> 30) | 0xfc);
+ *d++ = (((uv >> 24) & 0x3f) | 0x80);
+ *d++ = (((uv >> 18) & 0x3f) | 0x80);
+ *d++ = (((uv >> 12) & 0x3f) | 0x80);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ return d;
+ }
+#ifdef HAS_QUAD
+ if (uv < 0x1000000000LL)
+#endif
+ {
+ *d++ = 0xfe; /* Can't match U+FEFF! */
+ *d++ = (((uv >> 30) & 0x3f) | 0x80);
+ *d++ = (((uv >> 24) & 0x3f) | 0x80);
+ *d++ = (((uv >> 18) & 0x3f) | 0x80);
+ *d++ = (((uv >> 12) & 0x3f) | 0x80);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ return d;
+ }
+#ifdef HAS_QUAD
+ {
+ *d++ = 0xff; /* Can't match U+FFFE! */
+ *d++ = 0x80; /* 6 Reserved bits */
+ *d++ = (((uv >> 60) & 0x0f) | 0x80); /* 2 Reserved bits */
+ *d++ = (((uv >> 54) & 0x3f) | 0x80);
+ *d++ = (((uv >> 48) & 0x3f) | 0x80);
+ *d++ = (((uv >> 42) & 0x3f) | 0x80);
+ *d++ = (((uv >> 36) & 0x3f) | 0x80);
+ *d++ = (((uv >> 30) & 0x3f) | 0x80);
+ *d++ = (((uv >> 24) & 0x3f) | 0x80);
+ *d++ = (((uv >> 18) & 0x3f) | 0x80);
+ *d++ = (((uv >> 12) & 0x3f) | 0x80);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ return d;
+ }
+#endif
+}
+
+/* Tests if some arbitrary number of bytes begins in a valid UTF-8 character.
+ * The actual number of bytes in the UTF-8 character will be returned if it
+ * is valid, otherwise 0. */
+int
+Perl_is_utf8_char(pTHX_ U8 *s)
+{
+ U8 u = *s;
+ int slen, len;
+
+ if (!(u & 0x80))
+ return 1;
+
+ if (!(u & 0x40))
+ return 0;
+
+ if (!(u & 0x20)) { len = 2; }
+ else if (!(u & 0x10)) { len = 3; }
+ else if (!(u & 0x08)) { len = 4; }
+ else if (!(u & 0x04)) { len = 5; }
+ else if (!(u & 0x02)) { len = 6; }
+ else if (!(u & 0x01)) { len = 7; }
+ else { len = 13; } /* whoa! */
+
+ slen = len - 1;
+ s++;
+ while (slen--) {
+ if ((*s & 0xc0) != 0x80)
+ return 0;
+ s++;
+ }
+ return len;
+}
+
+UV
+Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen)
+{
+ UV uv = *s;
+ int len;
+ if (!(uv & 0x80)) {
+ if (retlen)
+ *retlen = 1;
+ return *s;
+ }
+ if (!(uv & 0x40)) {
+ dTHR;
+ if (ckWARN_d(WARN_UTF8))
+ Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
+ if (retlen)
+ *retlen = 1;
+ return *s;
+ }
+
+ if (!(uv & 0x20)) { len = 2; uv &= 0x1f; }
+ else if (!(uv & 0x10)) { len = 3; uv &= 0x0f; }
+ else if (!(uv & 0x08)) { len = 4; uv &= 0x07; }
+ else if (!(uv & 0x04)) { len = 5; uv &= 0x03; }
+ else if (!(uv & 0x02)) { len = 6; uv &= 0x01; }
+ else if (!(uv & 0x01)) { len = 7; uv = 0; }
+ else { len = 13; uv = 0; } /* whoa! */
+
+ if (retlen)
+ *retlen = len;
+ --len;
+ s++;
+ while (len--) {
+ if ((*s & 0xc0) != 0x80) {
+ dTHR;
+ if (ckWARN_d(WARN_UTF8))
+ Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
+ if (retlen)
+ *retlen -= len + 1;
+ return 0xfffd;
+ }
+ else
+ uv = (uv << 6) | (*s++ & 0x3f);
+ }
+ return uv;
+}
+
+/* utf8_distance(a,b) is intended to be a - b in pointer arithmetic */
+
+I32
+Perl_utf8_distance(pTHX_ U8 *a, U8 *b)
+{
+ I32 off = 0;
+ if (a < b) {
+ while (a < b) {
+ a += UTF8SKIP(a);
+ off--;
+ }
+ }
+ else {
+ while (b < a) {
+ b += UTF8SKIP(b);
+ off++;
+ }
+ }
+ return off;
+}
+
+/* WARNING: do not use the following unless you *know* off is within bounds */
+
+U8 *
+Perl_utf8_hop(pTHX_ U8 *s, I32 off)
+{
+ if (off >= 0) {
+ while (off--)
+ s += UTF8SKIP(s);
+ }
+ else {
+ while (off++) {
+ s--;
+ if (*s & 0x80) {
+ while ((*s & 0xc0) == 0x80)
+ s--;
+ }
+ }
+ }
+ return s;
+}
+
+/* XXX NOTHING CALLS THE FOLLOWING TWO ROUTINES YET!!! */
+/*
+ * Convert native or reversed UTF-16 to UTF-8.
+ *
+ * Destination must be pre-extended to 3/2 source. Do not use in-place.
+ * We optimize for native, for obvious reasons. */
+
+U8*
+Perl_utf16_to_utf8(pTHX_ U16* p, U8* d, I32 bytelen)
+{
+ U16* pend = p + bytelen / 2;
+ while (p < pend) {
+ UV uv = *p++;
+ if (uv < 0x80) {
+ *d++ = uv;
+ continue;
+ }
+ if (uv < 0x800) {
+ *d++ = (( uv >> 6) | 0xc0);
+ *d++ = (( uv & 0x3f) | 0x80);
+ continue;
+ }
+ if (uv >= 0xd800 && uv < 0xdbff) { /* surrogates */
+ dTHR;
+ int low = *p++;
+ if (low < 0xdc00 || low >= 0xdfff) {
+ if (ckWARN_d(WARN_UTF8))
+ Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-16 surrogate");
+ p--;
+ uv = 0xfffd;
+ }
+ uv = ((uv - 0xd800) << 10) + (low - 0xdc00) + 0x10000;
+ }
+ if (uv < 0x10000) {
+ *d++ = (( uv >> 12) | 0xe0);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ continue;
+ }
+ else {
+ *d++ = (( uv >> 18) | 0xf0);
+ *d++ = (((uv >> 12) & 0x3f) | 0x80);
+ *d++ = (((uv >> 6) & 0x3f) | 0x80);
+ *d++ = (( uv & 0x3f) | 0x80);
+ continue;
+ }
+ }
+ return d;
+}
+
+/* Note: this one is slightly destructive of the source. */
+
+U8*
+Perl_utf16_to_utf8_reversed(pTHX_ U16* p, U8* d, I32 bytelen)
+{
+ U8* s = (U8*)p;
+ U8* send = s + bytelen;
+ while (s < send) {
+ U8 tmp = s[0];
+ s[0] = s[1];
+ s[1] = tmp;
+ s += 2;
+ }
+ return utf16_to_utf8(p, d, bytelen);
+}
+
+/* for now these are all defined (inefficiently) in terms of the utf8 versions */
+
+bool
+Perl_is_uni_alnum(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_alnum(tmpbuf);
+}
+
+bool
+Perl_is_uni_alnumc(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_alnumc(tmpbuf);
+}
+
+bool
+Perl_is_uni_idfirst(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_idfirst(tmpbuf);
+}
+
+bool
+Perl_is_uni_alpha(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_alpha(tmpbuf);
+}
+
+bool
+Perl_is_uni_ascii(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_ascii(tmpbuf);
+}
+
+bool
+Perl_is_uni_space(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_space(tmpbuf);
+}
+
+bool
+Perl_is_uni_digit(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_digit(tmpbuf);
+}
+
+bool
+Perl_is_uni_upper(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_upper(tmpbuf);
+}
+
+bool
+Perl_is_uni_lower(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_lower(tmpbuf);
+}
+
+bool
+Perl_is_uni_cntrl(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_cntrl(tmpbuf);
+}
+
+bool
+Perl_is_uni_graph(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_graph(tmpbuf);
+}
+
+bool
+Perl_is_uni_print(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_print(tmpbuf);
+}
+
+bool
+Perl_is_uni_punct(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_punct(tmpbuf);
+}
+
+bool
+Perl_is_uni_xdigit(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return is_utf8_xdigit(tmpbuf);
+}
+
+U32
+Perl_to_uni_upper(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return to_utf8_upper(tmpbuf);
+}
+
+U32
+Perl_to_uni_title(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return to_utf8_title(tmpbuf);
+}
+
+U32
+Perl_to_uni_lower(pTHX_ U32 c)
+{
+ U8 tmpbuf[UTF8_MAXLEN];
+ uv_to_utf8(tmpbuf, (UV)c);
+ return to_utf8_lower(tmpbuf);
+}
+
+/* for now these all assume no locale info available for Unicode > 255 */
+
+bool
+Perl_is_uni_alnum_lc(pTHX_ U32 c)
+{
+ return is_uni_alnum(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_alnumc_lc(pTHX_ U32 c)
+{
+ return is_uni_alnumc(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_idfirst_lc(pTHX_ U32 c)
+{
+ return is_uni_idfirst(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_alpha_lc(pTHX_ U32 c)
+{
+ return is_uni_alpha(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_ascii_lc(pTHX_ U32 c)
+{
+ return is_uni_ascii(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_space_lc(pTHX_ U32 c)
+{
+ return is_uni_space(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_digit_lc(pTHX_ U32 c)
+{
+ return is_uni_digit(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_upper_lc(pTHX_ U32 c)
+{
+ return is_uni_upper(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_lower_lc(pTHX_ U32 c)
+{
+ return is_uni_lower(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_cntrl_lc(pTHX_ U32 c)
+{
+ return is_uni_cntrl(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_graph_lc(pTHX_ U32 c)
+{
+ return is_uni_graph(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_print_lc(pTHX_ U32 c)
+{
+ return is_uni_print(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_punct_lc(pTHX_ U32 c)
+{
+ return is_uni_punct(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_uni_xdigit_lc(pTHX_ U32 c)
+{
+ return is_uni_xdigit(c); /* XXX no locale support yet */
+}
+
+U32
+Perl_to_uni_upper_lc(pTHX_ U32 c)
+{
+ return to_uni_upper(c); /* XXX no locale support yet */
+}
+
+U32
+Perl_to_uni_title_lc(pTHX_ U32 c)
+{
+ return to_uni_title(c); /* XXX no locale support yet */
+}
+
+U32
+Perl_to_uni_lower_lc(pTHX_ U32 c)
+{
+ return to_uni_lower(c); /* XXX no locale support yet */
+}
+
+bool
+Perl_is_utf8_alnum(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_alnum)
+ PL_utf8_alnum = swash_init("utf8", "IsAlnum", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_alnum, p);
+/* return *p == '_' || is_utf8_alpha(p) || is_utf8_digit(p); */
+#ifdef SURPRISINGLY_SLOWER /* probably because alpha is usually true */
+ if (!PL_utf8_alnum)
+ PL_utf8_alnum = swash_init("utf8", "",
+ sv_2mortal(newSVpv("+utf8::IsAlpha\n+utf8::IsDigit\n005F\n",0)), 0, 0);
+ return swash_fetch(PL_utf8_alnum, p);
+#endif
+}
+
+bool
+Perl_is_utf8_alnumc(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_alnum)
+ PL_utf8_alnum = swash_init("utf8", "IsAlnumC", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_alnum, p);
+/* return is_utf8_alpha(p) || is_utf8_digit(p); */
+#ifdef SURPRISINGLY_SLOWER /* probably because alpha is usually true */
+ if (!PL_utf8_alnum)
+ PL_utf8_alnum = swash_init("utf8", "",
+ sv_2mortal(newSVpv("+utf8::IsAlpha\n+utf8::IsDigit\n005F\n",0)), 0, 0);
+ return swash_fetch(PL_utf8_alnum, p);
+#endif
+}
+
+bool
+Perl_is_utf8_idfirst(pTHX_ U8 *p)
+{
+ return *p == '_' || is_utf8_alpha(p);
+}
+
+bool
+Perl_is_utf8_alpha(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_alpha)
+ PL_utf8_alpha = swash_init("utf8", "IsAlpha", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_alpha, p);
+}
+
+bool
+Perl_is_utf8_ascii(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_ascii)
+ PL_utf8_ascii = swash_init("utf8", "IsAscii", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_ascii, p);
+}
+
+bool
+Perl_is_utf8_space(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_space)
+ PL_utf8_space = swash_init("utf8", "IsSpace", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_space, p);
+}
+
+bool
+Perl_is_utf8_digit(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_digit)
+ PL_utf8_digit = swash_init("utf8", "IsDigit", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_digit, p);
+}
+
+bool
+Perl_is_utf8_upper(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_upper)
+ PL_utf8_upper = swash_init("utf8", "IsUpper", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_upper, p);
+}
+
+bool
+Perl_is_utf8_lower(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_lower)
+ PL_utf8_lower = swash_init("utf8", "IsLower", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_lower, p);
+}
+
+bool
+Perl_is_utf8_cntrl(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_cntrl)
+ PL_utf8_cntrl = swash_init("utf8", "IsCntrl", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_cntrl, p);
+}
+
+bool
+Perl_is_utf8_graph(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_graph)
+ PL_utf8_graph = swash_init("utf8", "IsGraph", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_graph, p);
+}
+
+bool
+Perl_is_utf8_print(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_print)
+ PL_utf8_print = swash_init("utf8", "IsPrint", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_print, p);
+}
+
+bool
+Perl_is_utf8_punct(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_punct)
+ PL_utf8_punct = swash_init("utf8", "IsPunct", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_punct, p);
+}
+
+bool
+Perl_is_utf8_xdigit(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_xdigit)
+ PL_utf8_xdigit = swash_init("utf8", "IsXDigit", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_xdigit, p);
+}
+
+bool
+Perl_is_utf8_mark(pTHX_ U8 *p)
+{
+ if (!is_utf8_char(p))
+ return FALSE;
+ if (!PL_utf8_mark)
+ PL_utf8_mark = swash_init("utf8", "IsM", &PL_sv_undef, 0, 0);
+ return swash_fetch(PL_utf8_mark, p);
+}
+
+UV
+Perl_to_utf8_upper(pTHX_ U8 *p)
+{
+ UV uv;
+
+ if (!PL_utf8_toupper)
+ PL_utf8_toupper = swash_init("utf8", "ToUpper", &PL_sv_undef, 4, 0);
+ uv = swash_fetch(PL_utf8_toupper, p);
+ return uv ? uv : utf8_to_uv(p,0);
+}
+
+UV
+Perl_to_utf8_title(pTHX_ U8 *p)
+{
+ UV uv;
+
+ if (!PL_utf8_totitle)
+ PL_utf8_totitle = swash_init("utf8", "ToTitle", &PL_sv_undef, 4, 0);
+ uv = swash_fetch(PL_utf8_totitle, p);
+ return uv ? uv : utf8_to_uv(p,0);
+}
+
+UV
+Perl_to_utf8_lower(pTHX_ U8 *p)
+{
+ UV uv;
+
+ if (!PL_utf8_tolower)
+ PL_utf8_tolower = swash_init("utf8", "ToLower", &PL_sv_undef, 4, 0);
+ uv = swash_fetch(PL_utf8_tolower, p);
+ return uv ? uv : utf8_to_uv(p,0);
+}
+
+/* a "swash" is a swatch hash */
+
+SV*
+Perl_swash_init(pTHX_ char* pkg, char* name, SV *listsv, I32 minbits, I32 none)
+{
+ SV* retval;
+ char tmpbuf[256];
+ dSP;
+
+ if (!gv_stashpv(pkg, 0)) { /* demand load utf8 */
+ ENTER;
+ Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpv(pkg,0), Nullsv);
+ LEAVE;
+ }
+ SPAGAIN;
+ PUSHSTACKi(PERLSI_MAGIC);
+ PUSHMARK(SP);
+ EXTEND(SP,5);
+ PUSHs(sv_2mortal(newSVpvn(pkg, strlen(pkg))));
+ PUSHs(sv_2mortal(newSVpvn(name, strlen(name))));
+ PUSHs(listsv);
+ PUSHs(sv_2mortal(newSViv(minbits)));
+ PUSHs(sv_2mortal(newSViv(none)));
+ PUTBACK;
+ ENTER;
+ SAVEI32(PL_hints);
+ PL_hints = 0;
+ save_re_context();
+ if (PL_curcop == &PL_compiling) /* XXX ought to be handled by lex_start */
+ strncpy(tmpbuf, PL_tokenbuf, sizeof tmpbuf);
+ if (call_method("SWASHNEW", G_SCALAR))
+ retval = newSVsv(*PL_stack_sp--);
+ else
+ retval = &PL_sv_undef;
+ LEAVE;
+ POPSTACK;
+ if (PL_curcop == &PL_compiling) {
+ strncpy(PL_tokenbuf, tmpbuf, sizeof tmpbuf);
+ PL_curcop->op_private = PL_hints;
+ }
+ if (!SvROK(retval) || SvTYPE(SvRV(retval)) != SVt_PVHV)
+ Perl_croak(aTHX_ "SWASHNEW didn't return an HV ref");
+ return retval;
+}
+
+UV
+Perl_swash_fetch(pTHX_ SV *sv, U8 *ptr)
+{
+ HV* hv = (HV*)SvRV(sv);
+ U32 klen = UTF8SKIP(ptr) - 1;
+ U32 off = ptr[klen] & 127; /* NB: 64 bit always 0 when len > 1 */
+ STRLEN slen;
+ STRLEN needents = (klen ? 64 : 128);
+ U8 *tmps;
+ U32 bit;
+ SV *retval;
+
+ /*
+ * This single-entry cache saves about 1/3 of the utf8 overhead in test
+ * suite. (That is, only 7-8% overall over just a hash cache. Still,
+ * it's nothing to sniff at.) Pity we usually come through at least
+ * two function calls to get here...
+ *
+ * NB: this code assumes that swatches are never modified, once generated!
+ */
+
+ if (hv == PL_last_swash_hv &&
+ klen == PL_last_swash_klen &&
+ (!klen || memEQ(ptr,PL_last_swash_key,klen)) )
+ {
+ tmps = PL_last_swash_tmps;
+ slen = PL_last_swash_slen;
+ }
+ else {
+ /* Try our second-level swatch cache, kept in a hash. */
+ SV** svp = hv_fetch(hv, (char*)ptr, klen, FALSE);
+
+ /* If not cached, generate it via utf8::SWASHGET */
+ if (!svp || !SvPOK(*svp) || !(tmps = (U8*)SvPV(*svp, slen))) {
+ dSP;
+ ENTER;
+ SAVETMPS;
+ save_re_context();
+ PUSHSTACKi(PERLSI_MAGIC);
+ PUSHMARK(SP);
+ EXTEND(SP,3);
+ PUSHs((SV*)sv);
+ PUSHs(sv_2mortal(newSViv(utf8_to_uv(ptr, 0) & ~(needents - 1))));
+ PUSHs(sv_2mortal(newSViv(needents)));
+ PUTBACK;
+ if (call_method("SWASHGET", G_SCALAR))
+ retval = newSVsv(*PL_stack_sp--);
+ else
+ retval = &PL_sv_undef;
+ POPSTACK;
+ FREETMPS;
+ LEAVE;
+ if (PL_curcop == &PL_compiling)
+ PL_curcop->op_private = PL_hints;
+
+ svp = hv_store(hv, (char*)ptr, klen, retval, 0);
+
+ if (!svp || !(tmps = (U8*)SvPV(*svp, slen)) || slen < 8)
+ Perl_croak(aTHX_ "SWASHGET didn't return result of proper length");
+ }
+
+ PL_last_swash_hv = hv;
+ PL_last_swash_klen = klen;
+ PL_last_swash_tmps = tmps;
+ PL_last_swash_slen = slen;
+ if (klen)
+ Copy(ptr, PL_last_swash_key, klen, U8);
+ }
+
+ switch ((slen << 3) / needents) {
+ case 1:
+ bit = 1 << (off & 7);
+ off >>= 3;
+ return (tmps[off] & bit) != 0;
+ case 8:
+ return tmps[off];
+ case 16:
+ off <<= 1;
+ return (tmps[off] << 8) + tmps[off + 1] ;
+ case 32:
+ off <<= 2;
+ return (tmps[off] << 24) + (tmps[off+1] << 16) + (tmps[off+2] << 8) + tmps[off + 3] ;
+ }
+ Perl_croak(aTHX_ "panic: swash_fetch");
+ return 0;
+}
diff --git a/contrib/perl5/utf8.h b/contrib/perl5/utf8.h
new file mode 100644
index 0000000..c37a995
--- /dev/null
+++ b/contrib/perl5/utf8.h
@@ -0,0 +1,51 @@
+/* utf8.h
+ *
+ * Copyright (c) 1998-2000, Larry Wall
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+START_EXTERN_C
+
+#ifdef DOINIT
+EXTCONST unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, /* scripts */
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6, /* cjk etc. */
+7,13, /* Perl extended (not UTF-8). Up to 72bit allowed (64-bit + reserved). */
+};
+#else
+EXTCONST unsigned char PL_utf8skip[];
+#endif
+
+END_EXTERN_C
+
+#define UTF8_MAXLEN 13 /* how wide can a single UTF8 encoded character become */
+
+/*#define IN_UTF8 (PL_curcop->op_private & HINT_UTF8)*/
+#define IN_BYTE (PL_curcop->op_private & HINT_BYTE)
+#define DO_UTF8(sv) (SvUTF8(sv) && !IN_BYTE)
+
+#define UTF8SKIP(s) PL_utf8skip[*(U8*)s]
+
+/*
+ * Note: we try to be careful never to call the isXXX_utf8() functions
+ * unless we're pretty sure we've seen the beginning of a UTF-8 character
+ * (that is, the two high bits are set). Otherwise we risk loading in the
+ * heavy-duty SWASHINIT and SWASHGET routines unnecessarily.
+ */
+#define isIDFIRST_lazy_if(p,c) ((!c || (*((U8*)p) < 0xc0)) \
+ ? isIDFIRST(*(p)) \
+ : isIDFIRST_utf8((U8*)p))
+#define isALNUM_lazy_if(p,c) ((!c || (*((U8*)p) < 0xc0)) \
+ ? isALNUM(*(p)) \
+ : isALNUM_utf8((U8*)p))
+#define isIDFIRST_lazy(p) isIDFIRST_lazy_if(p,1)
+#define isALNUM_lazy(p) isALNUM_lazy_if(p,1)
diff --git a/contrib/perl5/util.c b/contrib/perl5/util.c
index 39f5f7a..059d9a4 100644
--- a/contrib/perl5/util.c
+++ b/contrib/perl5/util.c
@@ -1,6 +1,6 @@
/* util.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@ -13,6 +13,7 @@
*/
#include "EXTERN.h"
+#define PERL_IN_UTIL_C
#include "perl.h"
#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
@@ -39,22 +40,18 @@
# define vfork fork
#endif
-#ifdef I_FCNTL
-# include <fcntl.h>
-#endif
-#ifdef I_SYS_FILE
-# include <sys/file.h>
-#endif
-
#ifdef I_SYS_WAIT
# include <sys/wait.h>
#endif
+#ifdef I_LOCALE
+# include <locale.h>
+#endif
+
#define FLUSH
#ifdef LEAKTEST
-static void xstat _((int));
long xcount[MAXXCOUNT];
long lastxcount[MAXXCOUNT];
long xycount[MAXXCOUNT][MAXYCOUNT];
@@ -62,9 +59,11 @@ long lastxycount[MAXXCOUNT][MAXYCOUNT];
#endif
-#ifndef MYMALLOC
+#if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
+# define FD_CLOEXEC 1 /* NeXT needs this */
+#endif
-/* paranoid version of malloc */
+/* paranoid version of system's malloc() */
/* NOTE: Do not call the next three routines directly. Use the macros
* in handy.h, so that we can easily redefine everything to do tracking of
@@ -73,132 +72,121 @@ long lastxycount[MAXXCOUNT][MAXYCOUNT];
*/
Malloc_t
-safemalloc(MEM_SIZE size)
+Perl_safesysmalloc(MEM_SIZE size)
{
+ dTHX;
Malloc_t ptr;
#ifdef HAS_64K_LIMIT
if (size > 0xffff) {
- PerlIO_printf(PerlIO_stderr(), "Allocation too large: %lx\n", size) FLUSH;
- my_exit(1);
+ PerlIO_printf(Perl_error_log,
+ "Allocation too large: %lx\n", size) FLUSH;
+ my_exit(1);
}
#endif /* HAS_64K_LIMIT */
#ifdef DEBUGGING
if ((long)size < 0)
- croak("panic: malloc");
+ Perl_croak_nocontext("panic: malloc");
#endif
ptr = PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
-#if !(defined(I286) || defined(atarist))
- DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%x: (%05d) malloc %ld bytes\n",ptr,PL_an++,(long)size));
-#else
- DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%lx: (%05d) malloc %ld bytes\n",ptr,PL_an++,(long)size));
-#endif
+ PERL_ALLOC_CHECK(ptr);
+ DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
if (ptr != Nullch)
return ptr;
else if (PL_nomemok)
return Nullch;
else {
- PerlIO_puts(PerlIO_stderr(),no_mem) FLUSH;
+ PerlIO_puts(Perl_error_log,PL_no_mem) FLUSH;
my_exit(1);
return Nullch;
}
/*NOTREACHED*/
}
-/* paranoid version of realloc */
+/* paranoid version of system's realloc() */
Malloc_t
-saferealloc(Malloc_t where,MEM_SIZE size)
+Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
{
+ dTHX;
Malloc_t ptr;
-#if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE)
+#if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) && !defined(PERL_MICRO)
Malloc_t PerlMem_realloc();
#endif /* !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) */
#ifdef HAS_64K_LIMIT
if (size > 0xffff) {
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"Reallocation too large: %lx\n", size) FLUSH;
my_exit(1);
}
#endif /* HAS_64K_LIMIT */
if (!size) {
- safefree(where);
+ safesysfree(where);
return NULL;
}
if (!where)
- return safemalloc(size);
+ return safesysmalloc(size);
#ifdef DEBUGGING
if ((long)size < 0)
- croak("panic: realloc");
+ Perl_croak_nocontext("panic: realloc");
#endif
ptr = PerlMem_realloc(where,size);
-
-#if !(defined(I286) || defined(atarist))
- DEBUG_m( {
- PerlIO_printf(Perl_debug_log, "0x%x: (%05d) rfree\n",where,PL_an++);
- PerlIO_printf(Perl_debug_log, "0x%x: (%05d) realloc %ld bytes\n",ptr,PL_an++,(long)size);
- } )
-#else
- DEBUG_m( {
- PerlIO_printf(Perl_debug_log, "0x%lx: (%05d) rfree\n",where,PL_an++);
- PerlIO_printf(Perl_debug_log, "0x%lx: (%05d) realloc %ld bytes\n",ptr,PL_an++,(long)size);
- } )
-#endif
+ PERL_ALLOC_CHECK(ptr);
+
+ DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
+ DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
if (ptr != Nullch)
return ptr;
else if (PL_nomemok)
return Nullch;
else {
- PerlIO_puts(PerlIO_stderr(),no_mem) FLUSH;
+ PerlIO_puts(Perl_error_log,PL_no_mem) FLUSH;
my_exit(1);
return Nullch;
}
/*NOTREACHED*/
}
-/* safe version of free */
+/* safe version of system's free() */
Free_t
-safefree(Malloc_t where)
+Perl_safesysfree(Malloc_t where)
{
-#if !(defined(I286) || defined(atarist))
- DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%x: (%05d) free\n",(char *) where,PL_an++));
-#else
- DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%lx: (%05d) free\n",(char *) where,PL_an++));
+#ifdef PERL_IMPLICIT_SYS
+ dTHX;
#endif
+ DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
if (where) {
/*SUPPRESS 701*/
PerlMem_free(where);
}
}
-/* safe version of calloc */
+/* safe version of system's calloc() */
Malloc_t
-safecalloc(MEM_SIZE count, MEM_SIZE size)
+Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
{
+ dTHX;
Malloc_t ptr;
#ifdef HAS_64K_LIMIT
if (size * count > 0xffff) {
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"Allocation too large: %lx\n", size * count) FLUSH;
my_exit(1);
}
#endif /* HAS_64K_LIMIT */
#ifdef DEBUGGING
if ((long)size < 0 || (long)count < 0)
- croak("panic: calloc");
+ Perl_croak_nocontext("panic: calloc");
#endif
size *= count;
ptr = PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
-#if !(defined(I286) || defined(atarist))
- DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%x: (%05d) calloc %ld x %ld bytes\n",ptr,PL_an++,(long)count,(long)size));
-#else
- DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%lx: (%05d) calloc %ld x %ld bytes\n",ptr,PL_an++,(long)count,(long)size));
-#endif
+ PERL_ALLOC_CHECK(ptr);
+ DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) calloc %ld x %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)count,(long)size));
if (ptr != Nullch) {
memset((void*)ptr, 0, size);
return ptr;
@@ -206,15 +194,13 @@ safecalloc(MEM_SIZE count, MEM_SIZE size)
else if (PL_nomemok)
return Nullch;
else {
- PerlIO_puts(PerlIO_stderr(),no_mem) FLUSH;
+ PerlIO_puts(Perl_error_log,PL_no_mem) FLUSH;
my_exit(1);
return Nullch;
}
/*NOTREACHED*/
}
-#endif /* !MYMALLOC */
-
#ifdef LEAKTEST
struct mem_test_strut {
@@ -239,7 +225,7 @@ struct mem_test_strut {
: ((size) - 1)/4))
Malloc_t
-safexmalloc(I32 x, MEM_SIZE size)
+Perl_safexmalloc(I32 x, MEM_SIZE size)
{
register char* where = (char*)safemalloc(size + ALIGN);
@@ -251,7 +237,7 @@ safexmalloc(I32 x, MEM_SIZE size)
}
Malloc_t
-safexrealloc(Malloc_t wh, MEM_SIZE size)
+Perl_safexrealloc(Malloc_t wh, MEM_SIZE size)
{
char *where = (char*)wh;
@@ -272,7 +258,7 @@ safexrealloc(Malloc_t wh, MEM_SIZE size)
}
void
-safexfree(Malloc_t wh)
+Perl_safexfree(Malloc_t wh)
{
I32 x;
char *where = (char*)wh;
@@ -289,7 +275,7 @@ safexfree(Malloc_t wh)
}
Malloc_t
-safexcalloc(I32 x,MEM_SIZE count, MEM_SIZE size)
+Perl_safexcalloc(I32 x,MEM_SIZE count, MEM_SIZE size)
{
register char * where = (char*)safexmalloc(x, size * count + ALIGN);
xcount[x] += size;
@@ -300,8 +286,8 @@ safexcalloc(I32 x,MEM_SIZE count, MEM_SIZE size)
return (Malloc_t)(where + ALIGN);
}
-static void
-xstat(int flag)
+STATIC void
+S_xstat(pTHX_ int flag)
{
register I32 i, j, total = 0;
I32 subtot[MAXYCOUNT];
@@ -310,7 +296,7 @@ xstat(int flag)
subtot[j] = 0;
}
- PerlIO_printf(PerlIO_stderr(), " Id subtot 4 8 12 16 20 24 28 32 36 40 48 56 64 72 80 80+\n", total);
+ PerlIO_printf(Perl_debug_log, " Id subtot 4 8 12 16 20 24 28 32 36 40 48 56 64 72 80 80+\n", total);
for (i = 0; i < MAXXCOUNT; i++) {
total += xcount[i];
for (j = 0; j < MAXYCOUNT; j++) {
@@ -321,7 +307,7 @@ xstat(int flag)
: (flag == 2
? xcount[i] != lastxcount[i] /* Changed */
: xcount[i] > lastxcount[i])) { /* Growed */
- PerlIO_printf(PerlIO_stderr(),"%2d %02d %7ld ", i / 100, i % 100,
+ PerlIO_printf(Perl_debug_log,"%2d %02d %7ld ", i / 100, i % 100,
flag == 2 ? xcount[i] - lastxcount[i] : xcount[i]);
lastxcount[i] = xcount[i];
for (j = 0; j < MAXYCOUNT; j++) {
@@ -330,28 +316,28 @@ xstat(int flag)
: (flag == 2
? xycount[i][j] != lastxycount[i][j] /* Changed */
: xycount[i][j] > lastxycount[i][j])) { /* Growed */
- PerlIO_printf(PerlIO_stderr(),"%3ld ",
+ PerlIO_printf(Perl_debug_log,"%3ld ",
flag == 2
? xycount[i][j] - lastxycount[i][j]
: xycount[i][j]);
lastxycount[i][j] = xycount[i][j];
} else {
- PerlIO_printf(PerlIO_stderr(), " . ", xycount[i][j]);
+ PerlIO_printf(Perl_debug_log, " . ", xycount[i][j]);
}
}
- PerlIO_printf(PerlIO_stderr(), "\n");
+ PerlIO_printf(Perl_debug_log, "\n");
}
}
if (flag != 2) {
- PerlIO_printf(PerlIO_stderr(), "Total %7ld ", total);
+ PerlIO_printf(Perl_debug_log, "Total %7ld ", total);
for (j = 0; j < MAXYCOUNT; j++) {
if (subtot[j]) {
- PerlIO_printf(PerlIO_stderr(), "%3ld ", subtot[j]);
+ PerlIO_printf(Perl_debug_log, "%3ld ", subtot[j]);
} else {
- PerlIO_printf(PerlIO_stderr(), " . ");
+ PerlIO_printf(Perl_debug_log, " . ");
}
}
- PerlIO_printf(PerlIO_stderr(), "\n");
+ PerlIO_printf(Perl_debug_log, "\n");
}
}
@@ -360,7 +346,7 @@ xstat(int flag)
/* copy a string up to some (non-backslashed) delimiter, if any */
char *
-delimcpy(register char *to, register char *toend, register char *from, register char *fromend, register int delim, I32 *retlen)
+Perl_delimcpy(pTHX_ register char *to, register char *toend, register char *from, register char *fromend, register int delim, I32 *retlen)
{
register I32 tolen;
for (tolen = 0; from < fromend; from++, tolen++) {
@@ -389,16 +375,16 @@ delimcpy(register char *to, register char *toend, register char *from, register
/* This routine was donated by Corey Satten. */
char *
-instr(register char *big, register char *little)
+Perl_instr(pTHX_ register const char *big, register const char *little)
{
- register char *s, *x;
+ register const char *s, *x;
register I32 first;
if (!little)
- return big;
+ return (char*)big;
first = *little++;
if (!first)
- return big;
+ return (char*)big;
while (*big) {
if (*big++ != first)
continue;
@@ -411,7 +397,7 @@ instr(register char *big, register char *little)
}
}
if (!*s)
- return big-1;
+ return (char*)(big-1);
}
return Nullch;
}
@@ -419,14 +405,14 @@ instr(register char *big, register char *little)
/* same as instr but allow embedded nulls */
char *
-ninstr(register char *big, register char *bigend, char *little, char *lend)
+Perl_ninstr(pTHX_ register const char *big, register const char *bigend, const char *little, const char *lend)
{
- register char *s, *x;
+ register const char *s, *x;
register I32 first = *little;
- register char *littleend = lend;
+ register const char *littleend = lend;
if (!first && little >= littleend)
- return big;
+ return (char*)big;
if (bigend - big < littleend - little)
return Nullch;
bigend -= littleend - little++;
@@ -440,7 +426,7 @@ ninstr(register char *big, register char *bigend, char *little, char *lend)
}
}
if (s >= littleend)
- return big-1;
+ return (char*)(big-1);
}
return Nullch;
}
@@ -448,15 +434,15 @@ ninstr(register char *big, register char *bigend, char *little, char *lend)
/* reverse of the above--find last substring */
char *
-rninstr(register char *big, char *bigend, char *little, char *lend)
+Perl_rninstr(pTHX_ register const char *big, const char *bigend, const char *little, const char *lend)
{
- register char *bigbeg;
- register char *s, *x;
+ register const char *bigbeg;
+ register const char *s, *x;
register I32 first = *little;
- register char *littleend = lend;
+ register const char *littleend = lend;
if (!first && little >= littleend)
- return bigend;
+ return (char*)bigend;
bigbeg = big;
big = bigend - (littleend - little++);
while (big >= bigbeg) {
@@ -469,7 +455,7 @@ rninstr(register char *big, char *bigend, char *little, char *lend)
}
}
if (s >= littleend)
- return big+1;
+ return (char*)(big+1);
}
return Nullch;
}
@@ -478,7 +464,7 @@ rninstr(register char *big, char *bigend, char *little, char *lend)
* Set up for a new ctype locale.
*/
void
-perl_new_ctype(char *newctype)
+Perl_new_ctype(pTHX_ const char *newctype)
{
#ifdef USE_LOCALE_CTYPE
@@ -486,11 +472,11 @@ perl_new_ctype(char *newctype)
for (i = 0; i < 256; i++) {
if (isUPPER_LC(i))
- fold_locale[i] = toLOWER_LC(i);
+ PL_fold_locale[i] = toLOWER_LC(i);
else if (isLOWER_LC(i))
- fold_locale[i] = toUPPER_LC(i);
+ PL_fold_locale[i] = toUPPER_LC(i);
else
- fold_locale[i] = i;
+ PL_fold_locale[i] = i;
}
#endif /* USE_LOCALE_CTYPE */
@@ -500,7 +486,7 @@ perl_new_ctype(char *newctype)
* Set up for a new collation locale.
*/
void
-perl_new_collate(char *newcoll)
+Perl_new_collate(pTHX_ const char *newcoll)
{
#ifdef USE_LOCALE_COLLATE
@@ -531,7 +517,7 @@ perl_new_collate(char *newcoll)
Size_t fb = strxfrm(xbuf, "ab", XFRMBUFSIZE);
SSize_t mult = fb - fa;
if (mult < 1)
- croak("strxfrm() gets absurd");
+ Perl_croak(aTHX_ "strxfrm() gets absurd");
PL_collxfrm_base = (fa > mult) ? (fa - mult) : 0;
PL_collxfrm_mult = mult;
}
@@ -540,11 +526,30 @@ perl_new_collate(char *newcoll)
#endif /* USE_LOCALE_COLLATE */
}
+void
+Perl_set_numeric_radix(pTHX)
+{
+#ifdef USE_LOCALE_NUMERIC
+# ifdef HAS_LOCALECONV
+ struct lconv* lc;
+
+ lc = localeconv();
+ if (lc && lc->decimal_point)
+ /* We assume that decimal separator aka the radix
+ * character is always a single character. If it
+ * ever is a string, this needs to be rethunk. */
+ PL_numeric_radix = *lc->decimal_point;
+ else
+ PL_numeric_radix = 0;
+# endif /* HAS_LOCALECONV */
+#endif /* USE_LOCALE_NUMERIC */
+}
+
/*
* Set up for a new numeric locale.
*/
void
-perl_new_numeric(char *newnum)
+Perl_new_numeric(pTHX_ const char *newnum)
{
#ifdef USE_LOCALE_NUMERIC
@@ -563,13 +568,14 @@ perl_new_numeric(char *newnum)
PL_numeric_name = savepv(newnum);
PL_numeric_standard = (strEQ(newnum, "C") || strEQ(newnum, "POSIX"));
PL_numeric_local = TRUE;
+ set_numeric_radix();
}
#endif /* USE_LOCALE_NUMERIC */
}
void
-perl_set_numeric_standard(void)
+Perl_set_numeric_standard(pTHX)
{
#ifdef USE_LOCALE_NUMERIC
@@ -583,7 +589,7 @@ perl_set_numeric_standard(void)
}
void
-perl_set_numeric_local(void)
+Perl_set_numeric_local(pTHX)
{
#ifdef USE_LOCALE_NUMERIC
@@ -591,17 +597,17 @@ perl_set_numeric_local(void)
setlocale(LC_NUMERIC, PL_numeric_name);
PL_numeric_standard = FALSE;
PL_numeric_local = TRUE;
+ set_numeric_radix();
}
#endif /* USE_LOCALE_NUMERIC */
}
-
/*
* Initialize locale awareness.
*/
int
-perl_init_i18nl10n(int printwarn)
+Perl_init_i18nl10n(pTHX_ int printwarn)
{
int ok = 1;
/* returns
@@ -695,47 +701,47 @@ perl_init_i18nl10n(int printwarn)
if (setlocale_failure) {
char *p;
bool locwarn = (printwarn > 1 ||
- printwarn &&
- (!(p = PerlEnv_getenv("PERL_BADLANG")) || atoi(p)));
+ (printwarn &&
+ (!(p = PerlEnv_getenv("PERL_BADLANG")) || atoi(p))));
if (locwarn) {
#ifdef LC_ALL
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"perl: warning: Setting locale failed.\n");
#else /* !LC_ALL */
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"perl: warning: Setting locale failed for the categories:\n\t");
#ifdef USE_LOCALE_CTYPE
if (! curctype)
- PerlIO_printf(PerlIO_stderr(), "LC_CTYPE ");
+ PerlIO_printf(Perl_error_log, "LC_CTYPE ");
#endif /* USE_LOCALE_CTYPE */
#ifdef USE_LOCALE_COLLATE
if (! curcoll)
- PerlIO_printf(PerlIO_stderr(), "LC_COLLATE ");
+ PerlIO_printf(Perl_error_log, "LC_COLLATE ");
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
if (! curnum)
- PerlIO_printf(PerlIO_stderr(), "LC_NUMERIC ");
+ PerlIO_printf(Perl_error_log, "LC_NUMERIC ");
#endif /* USE_LOCALE_NUMERIC */
- PerlIO_printf(PerlIO_stderr(), "\n");
+ PerlIO_printf(Perl_error_log, "\n");
#endif /* LC_ALL */
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"perl: warning: Please check that your locale settings:\n");
#ifdef __GLIBC__
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"\tLANGUAGE = %c%s%c,\n",
language ? '"' : '(',
language ? language : "unset",
language ? '"' : ')');
#endif
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"\tLC_ALL = %c%s%c,\n",
lc_all ? '"' : '(',
lc_all ? lc_all : "unset",
@@ -747,18 +753,18 @@ perl_init_i18nl10n(int printwarn)
if (strnEQ(*e, "LC_", 3)
&& strnNE(*e, "LC_ALL=", 7)
&& (p = strchr(*e, '=')))
- PerlIO_printf(PerlIO_stderr(), "\t%.*s = \"%s\",\n",
+ PerlIO_printf(Perl_error_log, "\t%.*s = \"%s\",\n",
(int)(p - *e), *e, p + 1);
}
}
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"\tLANG = %c%s%c\n",
lang ? '"' : '(',
lang ? lang : "unset",
lang ? '"' : ')');
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
" are supported and installed on your system.\n");
}
@@ -766,13 +772,13 @@ perl_init_i18nl10n(int printwarn)
if (setlocale(LC_ALL, "C")) {
if (locwarn)
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"perl: warning: Falling back to the standard locale (\"C\").\n");
ok = 0;
}
else {
if (locwarn)
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"perl: warning: Failed to fall back to the standard locale (\"C\").\n");
ok = -1;
}
@@ -792,7 +798,7 @@ perl_init_i18nl10n(int printwarn)
)
{
if (locwarn)
- PerlIO_printf(PerlIO_stderr(),
+ PerlIO_printf(Perl_error_log,
"perl: warning: Cannot fall back to the standard locale (\"C\").\n");
ok = -1;
}
@@ -811,15 +817,15 @@ perl_init_i18nl10n(int printwarn)
}
#ifdef USE_LOCALE_CTYPE
- perl_new_ctype(curctype);
+ new_ctype(curctype);
#endif /* USE_LOCALE_CTYPE */
#ifdef USE_LOCALE_COLLATE
- perl_new_collate(curcoll);
+ new_collate(curcoll);
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
- perl_new_numeric(curnum);
+ new_numeric(curnum);
#endif /* USE_LOCALE_NUMERIC */
#endif /* USE_LOCALE */
@@ -829,9 +835,9 @@ perl_init_i18nl10n(int printwarn)
/* Backwards compatibility. */
int
-perl_init_i18nl14n(int printwarn)
+Perl_init_i18nl14n(pTHX_ int printwarn)
{
- return perl_init_i18nl10n(printwarn);
+ return init_i18nl10n(printwarn);
}
#ifdef USE_LOCALE_COLLATE
@@ -844,7 +850,7 @@ perl_init_i18nl14n(int printwarn)
* Please see sv_collxfrm() to see how this is used.
*/
char *
-mem_collxfrm(const char *s, STRLEN len, STRLEN *xlen)
+Perl_mem_collxfrm(pTHX_ const char *s, STRLEN len, STRLEN *xlen)
{
char *xbuf;
STRLEN xAlloc, xin, xout; /* xalloc is a reserved word in VC */
@@ -893,8 +899,25 @@ mem_collxfrm(const char *s, STRLEN len, STRLEN *xlen)
#endif /* USE_LOCALE_COLLATE */
+#define FBM_TABLE_OFFSET 2 /* Number of bytes between EOS and table*/
+
+/* As a space optimization, we do not compile tables for strings of length
+ 0 and 1, and for strings of length 2 unless FBMcf_TAIL. These are
+ special-cased in fbm_instr().
+
+ If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
+
+/*
+=for apidoc fbm_compile
+
+Analyses the string in order to make fast searches on it using fbm_instr()
+-- the Boyer-Moore algorithm.
+
+=cut
+*/
+
void
-fbm_compile(SV *sv, U32 flags /* not used yet */)
+Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
{
register U8 *s;
register U8 *table;
@@ -903,150 +926,252 @@ fbm_compile(SV *sv, U32 flags /* not used yet */)
I32 rarest = 0;
U32 frequency = 256;
+ if (flags & FBMcf_TAIL)
+ sv_catpvn(sv, "\n", 1); /* Taken into account in fbm_instr() */
s = (U8*)SvPV_force(sv, len);
(void)SvUPGRADE(sv, SVt_PVBM);
- if (len > 255 || len == 0) /* TAIL might be on on a zero-length string. */
- return; /* can't have offsets that big */
+ if (len == 0) /* TAIL might be on on a zero-length string. */
+ return;
if (len > 2) {
- Sv_Grow(sv,len + 258);
- table = (unsigned char*)(SvPVX(sv) + len + 1);
- s = table - 2;
- for (i = 0; i < 256; i++) {
- table[i] = len;
- }
+ U8 mlen;
+ unsigned char *sb;
+
+ if (len > 255)
+ mlen = 255;
+ else
+ mlen = (U8)len;
+ Sv_Grow(sv, len + 256 + FBM_TABLE_OFFSET);
+ table = (unsigned char*)(SvPVX(sv) + len + FBM_TABLE_OFFSET);
+ s = table - 1 - FBM_TABLE_OFFSET; /* last char */
+ memset((void*)table, mlen, 256);
+ table[-1] = (U8)flags;
i = 0;
- while (s >= (unsigned char*)(SvPVX(sv)))
- {
- if (table[*s] == len)
- table[*s] = i;
- s--,i++;
- }
+ sb = s - mlen + 1; /* first char (maybe) */
+ while (s >= sb) {
+ if (table[*s] == mlen)
+ table[*s] = (U8)i;
+ s--, i++;
+ }
}
sv_magic(sv, Nullsv, 'B', Nullch, 0); /* deep magic */
SvVALID_on(sv);
s = (unsigned char*)(SvPVX(sv)); /* deeper magic */
for (i = 0; i < len; i++) {
- if (freq[s[i]] < frequency) {
+ if (PL_freq[s[i]] < frequency) {
rarest = i;
- frequency = freq[s[i]];
+ frequency = PL_freq[s[i]];
}
}
BmRARE(sv) = s[rarest];
BmPREVIOUS(sv) = rarest;
- DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %d\n",BmRARE(sv),BmPREVIOUS(sv)));
+ BmUSEFUL(sv) = 100; /* Initial value */
+ if (flags & FBMcf_TAIL)
+ SvTAIL_on(sv);
+ DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %d\n",
+ BmRARE(sv),BmPREVIOUS(sv)));
}
+/* If SvTAIL(littlestr), it has a fake '\n' at end. */
+/* If SvTAIL is actually due to \Z or \z, this gives false positives
+ if multiline */
+
+/*
+=for apidoc fbm_instr
+
+Returns the location of the SV in the string delimited by C<str> and
+C<strend>. It returns C<Nullch> if the string can't be found. The C<sv>
+does not have to be fbm_compiled, but the search will not be as fast
+then.
+
+=cut
+*/
+
char *
-fbm_instr(unsigned char *big, register unsigned char *bigend, SV *littlestr, U32 flags)
+Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *littlestr, U32 flags)
{
register unsigned char *s;
- register I32 tmp;
- register I32 littlelen;
- register unsigned char *little;
- register unsigned char *table;
- register unsigned char *olds;
- register unsigned char *oldlittle;
+ STRLEN l;
+ register unsigned char *little = (unsigned char *)SvPV(littlestr,l);
+ register STRLEN littlelen = l;
+ register I32 multiline = flags & FBMrf_MULTILINE;
+
+ if (bigend - big < littlelen) {
+ if ( SvTAIL(littlestr)
+ && (bigend - big == littlelen - 1)
+ && (littlelen == 1
+ || (*big == *little && memEQ(big, little, littlelen - 1))))
+ return (char*)big;
+ return Nullch;
+ }
- if (SvTYPE(littlestr) != SVt_PVBM || !SvVALID(littlestr)) {
- STRLEN len;
- char *l = SvPV(littlestr,len);
- if (!len) {
- if (SvTAIL(littlestr)) { /* Can be only 0-len constant
- substr => we can ignore SvVALID */
- if (PL_multiline) {
- char *t = "\n";
- if ((s = (unsigned char*)ninstr((char*)big, (char*)bigend,
- t, t + len))) {
- return (char*)s;
+ if (littlelen <= 2) { /* Special-cased */
+
+ if (littlelen == 1) {
+ if (SvTAIL(littlestr) && !multiline) { /* Anchor only! */
+ /* Know that bigend != big. */
+ if (bigend[-1] == '\n')
+ return (char *)(bigend - 1);
+ return (char *) bigend;
+ }
+ s = big;
+ while (s < bigend) {
+ if (*s == *little)
+ return (char *)s;
+ s++;
+ }
+ if (SvTAIL(littlestr))
+ return (char *) bigend;
+ return Nullch;
+ }
+ if (!littlelen)
+ return (char*)big; /* Cannot be SvTAIL! */
+
+ /* littlelen is 2 */
+ if (SvTAIL(littlestr) && !multiline) {
+ if (bigend[-1] == '\n' && bigend[-2] == *little)
+ return (char*)bigend - 2;
+ if (bigend[-1] == *little)
+ return (char*)bigend - 1;
+ return Nullch;
+ }
+ {
+ /* This should be better than FBM if c1 == c2, and almost
+ as good otherwise: maybe better since we do less indirection.
+ And we save a lot of memory by caching no table. */
+ register unsigned char c1 = little[0];
+ register unsigned char c2 = little[1];
+
+ s = big + 1;
+ bigend--;
+ if (c1 != c2) {
+ while (s <= bigend) {
+ if (s[0] == c2) {
+ if (s[-1] == c1)
+ return (char*)s - 1;
+ s += 2;
+ continue;
+ }
+ next_chars:
+ if (s[0] == c1) {
+ if (s == bigend)
+ goto check_1char_anchor;
+ if (s[1] == c2)
+ return (char*)s;
+ else {
+ s++;
+ goto next_chars;
+ }
}
+ else
+ s += 2;
+ }
+ goto check_1char_anchor;
+ }
+ /* Now c1 == c2 */
+ while (s <= bigend) {
+ if (s[0] == c1) {
+ if (s[-1] == c1)
+ return (char*)s - 1;
+ if (s == bigend)
+ goto check_1char_anchor;
+ if (s[1] == c1)
+ return (char*)s;
+ s += 3;
}
- if (bigend > big && bigend[-1] == '\n')
- return (char *)(bigend - 1);
else
- return (char *) bigend;
+ s += 2;
}
- return (char*)big;
}
- return ninstr((char*)big,(char*)bigend, l, l + len);
+ check_1char_anchor: /* One char and anchor! */
+ if (SvTAIL(littlestr) && (*bigend == *little))
+ return (char *)bigend; /* bigend is already decremented. */
+ return Nullch;
}
-
- littlelen = SvCUR(littlestr);
- if (SvTAIL(littlestr) && !PL_multiline) { /* tail anchored? */
- if (littlelen > bigend - big)
- return Nullch;
- little = (unsigned char*)SvPVX(littlestr);
+ if (SvTAIL(littlestr) && !multiline) { /* tail anchored? */
s = bigend - littlelen;
- if (s > big
- && bigend[-1] == '\n'
- && s[-1] == *little && memEQ((char*)s - 1,(char*)little,littlelen))
- return (char*)s - 1; /* how sweet it is */
- else if (*s == *little && memEQ((char*)s,(char*)little,littlelen))
+ if (s >= big && bigend[-1] == '\n' && *s == *little
+ /* Automatically of length > 2 */
+ && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
+ {
return (char*)s; /* how sweet it is */
+ }
+ if (s[1] == *little
+ && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
+ {
+ return (char*)s + 1; /* how sweet it is */
+ }
return Nullch;
}
- if (littlelen <= 2) {
- unsigned char c1 = (unsigned char)SvPVX(littlestr)[0];
- unsigned char c2 = (unsigned char)SvPVX(littlestr)[1];
- /* This may do extra comparisons if littlelen == 2, but this
- should be hidden in the noise since we do less indirection. */
-
- s = big;
- bigend -= littlelen;
- while (s <= bigend) {
- if (s[0] == c1
- && (littlelen == 1 || s[1] == c2)
- && (!SvTAIL(littlestr)
- || s == bigend
- || s[littlelen] == '\n')) /* Automatically multiline */
+ if (SvTYPE(littlestr) != SVt_PVBM || !SvVALID(littlestr)) {
+ char *b = ninstr((char*)big,(char*)bigend,
+ (char*)little, (char*)little + littlelen);
+
+ if (!b && SvTAIL(littlestr)) { /* Automatically multiline! */
+ /* Chop \n from littlestr: */
+ s = bigend - littlelen + 1;
+ if (*s == *little
+ && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
{
return (char*)s;
}
- s++;
+ return Nullch;
}
- return Nullch;
+ return b;
}
- table = (unsigned char*)(SvPVX(littlestr) + littlelen + 1);
- if (--littlelen >= bigend - big)
- return Nullch;
- s = big + littlelen;
- oldlittle = little = table - 2;
- if (s < bigend) {
- top2:
- /*SUPPRESS 560*/
- if (tmp = table[*s]) {
+
+ { /* Do actual FBM. */
+ register unsigned char *table = little + littlelen + FBM_TABLE_OFFSET;
+ register unsigned char *oldlittle;
+
+ if (littlelen > bigend - big)
+ return Nullch;
+ --littlelen; /* Last char found by table lookup */
+
+ s = big + littlelen;
+ little += littlelen; /* last char */
+ oldlittle = little;
+ if (s < bigend) {
+ register I32 tmp;
+
+ top2:
+ /*SUPPRESS 560*/
+ if ((tmp = table[*s])) {
#ifdef POINTERRIGOR
- if (bigend - s > tmp) {
+ if (bigend - s > tmp) {
+ s += tmp;
+ goto top2;
+ }
s += tmp;
- goto top2;
- }
#else
- if ((s += tmp) < bigend)
- goto top2;
-#endif
- return Nullch;
- }
- else {
- tmp = littlelen; /* less expensive than calling strncmp() */
- olds = s;
- while (tmp--) {
- if (*--s == *--little)
- continue;
- differ:
- s = olds + 1; /* here we pay the price for failure */
- little = oldlittle;
- if (s < bigend) /* fake up continue to outer loop */
+ if ((s += tmp) < bigend)
goto top2;
- return Nullch;
+#endif
+ goto check_end;
+ }
+ else { /* less expensive than calling strncmp() */
+ register unsigned char *olds = s;
+
+ tmp = littlelen;
+
+ while (tmp--) {
+ if (*--s == *--little)
+ continue;
+ s = olds + 1; /* here we pay the price for failure */
+ little = oldlittle;
+ if (s < bigend) /* fake up continue to outer loop */
+ goto top2;
+ goto check_end;
+ }
+ return (char *)s;
}
- if (SvTAIL(littlestr) /* automatically multiline */
- && olds + 1 != bigend
- && olds[1] != '\n')
- goto differ;
- return (char *)s;
}
+ check_end:
+ if ( s == bigend && (table[-1] & FBMcf_TAIL)
+ && memEQ(bigend - littlelen, oldlittle - littlelen, littlelen) )
+ return (char*)bigend - littlelen;
+ return Nullch;
}
- return Nullch;
}
/* start_shift, end_shift are positive quantities which give offsets
@@ -1055,12 +1180,17 @@ fbm_instr(unsigned char *big, register unsigned char *bigend, SV *littlestr, U32
old_posp is the way of communication between consequent calls if
the next call needs to find the .
The initial *old_posp should be -1.
- Note that we do not take into account SvTAIL, so it may give wrong
- positives if _ALL flag is set.
+
+ Note that we take into account SvTAIL, so one can get extra
+ optimizations if _ALL flag is set.
*/
+/* If SvTAIL is actually due to \Z or \z, this gives false positives
+ if PL_multiline. In fact if !PL_multiline the autoritative answer
+ is not supported yet. */
+
char *
-screaminstr(SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
+Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
{
dTHR;
register unsigned char *s, *x;
@@ -1075,8 +1205,18 @@ screaminstr(SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_
if (*old_posp == -1
? (pos = PL_screamfirst[BmRARE(littlestr)]) < 0
- : (((pos = *old_posp), pos += PL_screamnext[pos]) == 0))
+ : (((pos = *old_posp), pos += PL_screamnext[pos]) == 0)) {
+ cant_find:
+ if ( BmRARE(littlestr) == '\n'
+ && BmPREVIOUS(littlestr) == SvCUR(littlestr) - 1) {
+ little = (unsigned char *)(SvPVX(littlestr));
+ littleend = little + SvCUR(littlestr);
+ first = *little++;
+ goto check_tail;
+ }
return Nullch;
+ }
+
little = (unsigned char *)(SvPVX(littlestr));
littleend = little + SvCUR(littlestr);
first = *little++;
@@ -1085,10 +1225,14 @@ screaminstr(SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_
big = (unsigned char *)(SvPVX(bigstr));
/* The value of pos we can stop at: */
stop_pos = SvCUR(bigstr) - end_shift - (SvCUR(littlestr) - 1 - previous);
- if (previous + start_shift > stop_pos) return Nullch;
+ if (previous + start_shift > stop_pos) {
+ if (previous + start_shift == stop_pos + 1) /* A fake '\n'? */
+ goto check_tail;
+ return Nullch;
+ }
while (pos < previous + start_shift) {
if (!(pos += PL_screamnext[pos]))
- return Nullch;
+ goto cant_find;
}
#ifdef POINTERRIGOR
do {
@@ -1126,17 +1270,31 @@ screaminstr(SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_
found = 1;
}
} while ( pos += PL_screamnext[pos] );
- return (last && found) ? (char *)(big+(*old_posp)) : Nullch;
+ if (last && found)
+ return (char *)(big+(*old_posp));
#endif /* POINTERRIGOR */
+ check_tail:
+ if (!SvTAIL(littlestr) || (end_shift > 0))
+ return Nullch;
+ /* Ignore the trailing "\n". This code is not microoptimized */
+ big = (unsigned char *)(SvPVX(bigstr) + SvCUR(bigstr));
+ stop_pos = littleend - little; /* Actual littlestr len */
+ if (stop_pos == 0)
+ return (char*)big;
+ big -= stop_pos;
+ if (*big == first
+ && ((stop_pos == 1) || memEQ(big + 1, little, stop_pos - 1)))
+ return (char*)big;
+ return Nullch;
}
I32
-ibcmp(char *s1, char *s2, register I32 len)
+Perl_ibcmp(pTHX_ const char *s1, const char *s2, register I32 len)
{
register U8 *a = (U8 *)s1;
register U8 *b = (U8 *)s2;
while (len--) {
- if (*a != *b && *a != fold[*b])
+ if (*a != *b && *a != PL_fold[*b])
return 1;
a++,b++;
}
@@ -1144,12 +1302,12 @@ ibcmp(char *s1, char *s2, register I32 len)
}
I32
-ibcmp_locale(char *s1, char *s2, register I32 len)
+Perl_ibcmp_locale(pTHX_ const char *s1, const char *s2, register I32 len)
{
register U8 *a = (U8 *)s1;
register U8 *b = (U8 *)s2;
while (len--) {
- if (*a != *b && *a != fold_locale[*b])
+ if (*a != *b && *a != PL_fold_locale[*b])
return 1;
a++,b++;
}
@@ -1158,8 +1316,16 @@ ibcmp_locale(char *s1, char *s2, register I32 len)
/* copy a string to a safe spot */
+/*
+=for apidoc savepv
+
+Copy a string to a safe spot. This does not use an SV.
+
+=cut
+*/
+
char *
-savepv(char *sv)
+Perl_savepv(pTHX_ const char *sv)
{
register char *newaddr;
@@ -1170,8 +1336,17 @@ savepv(char *sv)
/* same thing but with a known length */
+/*
+=for apidoc savepvn
+
+Copy a string to a safe spot. The C<len> indicates number of bytes to
+copy. This does not use an SV.
+
+=cut
+*/
+
char *
-savepvn(char *sv, register I32 len)
+Perl_savepvn(pTHX_ const char *sv, register I32 len)
{
register char *newaddr;
@@ -1181,91 +1356,154 @@ savepvn(char *sv, register I32 len)
return newaddr;
}
-/* the SV for form() and mess() is not kept in an arena */
+/* the SV for Perl_form() and mess() is not kept in an arena */
STATIC SV *
-mess_alloc(void)
+S_mess_alloc(pTHX)
{
+ dTHR;
SV *sv;
XPVMG *any;
+ if (!PL_dirty)
+ return sv_2mortal(newSVpvn("",0));
+
+ if (PL_mess_sv)
+ return PL_mess_sv;
+
/* Create as PVMG now, to avoid any upgrading later */
New(905, sv, 1, SV);
Newz(905, any, 1, XPVMG);
SvFLAGS(sv) = SVt_PVMG;
SvANY(sv) = (void*)any;
SvREFCNT(sv) = 1 << 30; /* practically infinite */
+ PL_mess_sv = sv;
return sv;
}
+#if defined(PERL_IMPLICIT_CONTEXT)
char *
-form(const char* pat, ...)
+Perl_form_nocontext(const char* pat, ...)
{
+ dTHX;
+ char *retval;
va_list args;
va_start(args, pat);
- if (!PL_mess_sv)
- PL_mess_sv = mess_alloc();
- sv_vsetpvfn(PL_mess_sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+ retval = vform(pat, &args);
va_end(args);
- return SvPVX(PL_mess_sv);
+ return retval;
}
+#endif /* PERL_IMPLICIT_CONTEXT */
char *
-mess(const char *pat, va_list *args)
+Perl_form(pTHX_ const char* pat, ...)
{
- SV *sv;
+ char *retval;
+ va_list args;
+ va_start(args, pat);
+ retval = vform(pat, &args);
+ va_end(args);
+ return retval;
+}
+
+char *
+Perl_vform(pTHX_ const char *pat, va_list *args)
+{
+ SV *sv = mess_alloc();
+ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+ return SvPVX(sv);
+}
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+SV *
+Perl_mess_nocontext(const char *pat, ...)
+{
+ dTHX;
+ SV *retval;
+ va_list args;
+ va_start(args, pat);
+ retval = vmess(pat, &args);
+ va_end(args);
+ return retval;
+}
+#endif /* PERL_IMPLICIT_CONTEXT */
+
+SV *
+Perl_mess(pTHX_ const char *pat, ...)
+{
+ SV *retval;
+ va_list args;
+ va_start(args, pat);
+ retval = vmess(pat, &args);
+ va_end(args);
+ return retval;
+}
+
+SV *
+Perl_vmess(pTHX_ const char *pat, va_list *args)
+{
+ SV *sv = mess_alloc();
static char dgd[] = " during global destruction.\n";
- if (!PL_mess_sv)
- PL_mess_sv = mess_alloc();
- sv = PL_mess_sv;
sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
dTHR;
- if (PL_dirty)
- sv_catpv(sv, dgd);
- else {
- if (PL_curcop->cop_line)
- sv_catpvf(sv, " at %_ line %ld",
- GvSV(PL_curcop->cop_filegv), (long)PL_curcop->cop_line);
- if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
- bool line_mode = (RsSIMPLE(PL_rs) &&
- SvLEN(PL_rs) == 1 && *SvPVX(PL_rs) == '\n');
- sv_catpvf(sv, ", <%s> %s %ld",
- PL_last_in_gv == PL_argvgv ? "" : GvNAME(PL_last_in_gv),
- line_mode ? "line" : "chunk",
- (long)IoLINES(GvIOp(PL_last_in_gv)));
- }
- sv_catpv(sv, ".\n");
+ if (CopLINE(PL_curcop))
+ Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
+ CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
+ if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
+ bool line_mode = (RsSIMPLE(PL_rs) &&
+ SvCUR(PL_rs) == 1 && *SvPVX(PL_rs) == '\n');
+ Perl_sv_catpvf(aTHX_ sv, ", <%s> %s %"IVdf,
+ PL_last_in_gv == PL_argvgv ? "" : GvNAME(PL_last_in_gv),
+ line_mode ? "line" : "chunk",
+ (IV)IoLINES(GvIOp(PL_last_in_gv)));
}
+#ifdef USE_THREADS
+ if (thr->tid)
+ Perl_sv_catpvf(aTHX_ sv, " thread %ld", thr->tid);
+#endif
+ sv_catpv(sv, PL_dirty ? dgd : ".\n");
}
- return SvPVX(sv);
+ return sv;
}
OP *
-die(const char* pat, ...)
+Perl_vdie(pTHX_ const char* pat, va_list *args)
{
dTHR;
- va_list args;
char *message;
int was_in_eval = PL_in_eval;
HV *stash;
GV *gv;
CV *cv;
+ SV *msv;
+ STRLEN msglen;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: die: curstack = %p, mainstack = %p\n",
thr, PL_curstack, PL_mainstack));
- va_start(args, pat);
- message = pat ? mess(pat, &args) : Nullch;
- va_end(args);
+ if (pat) {
+ msv = vmess(pat, args);
+ if (PL_errors && SvCUR(PL_errors)) {
+ sv_catsv(PL_errors, msv);
+ message = SvPV(PL_errors, msglen);
+ SvCUR_set(PL_errors, 0);
+ }
+ else
+ message = SvPV(msv,msglen);
+ }
+ else {
+ message = Nullch;
+ msglen = 0;
+ }
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: die: message = %s\ndiehook = %p\n",
thr, message, PL_diehook));
if (PL_diehook) {
- /* sv_2cv might call croak() */
+ /* sv_2cv might call Perl_croak() */
SV *olddiehook = PL_diehook;
ENTER;
SAVESPTR(PL_diehook);
@@ -1277,8 +1515,9 @@ die(const char* pat, ...)
SV *msg;
ENTER;
- if(message) {
- msg = newSVpv(message, 0);
+ save_re_context();
+ if (message) {
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
}
@@ -1290,14 +1529,14 @@ die(const char* pat, ...)
PUSHMARK(SP);
XPUSHs(msg);
PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ call_sv((SV*)cv, G_DISCARD);
POPSTACK;
LEAVE;
}
}
- PL_restartop = die_where(message);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ PL_restartop = die_where(message, msglen);
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"%p: die: restartop = %p, was_in_eval = %d, top_env = %p\n",
thr, PL_restartop, was_in_eval, PL_top_env));
if ((!PL_restartop && was_in_eval) || PL_top_env->je_prev)
@@ -1305,22 +1544,56 @@ die(const char* pat, ...)
return PL_restartop;
}
+#if defined(PERL_IMPLICIT_CONTEXT)
+OP *
+Perl_die_nocontext(const char* pat, ...)
+{
+ dTHX;
+ OP *o;
+ va_list args;
+ va_start(args, pat);
+ o = vdie(pat, &args);
+ va_end(args);
+ return o;
+}
+#endif /* PERL_IMPLICIT_CONTEXT */
+
+OP *
+Perl_die(pTHX_ const char* pat, ...)
+{
+ OP *o;
+ va_list args;
+ va_start(args, pat);
+ o = vdie(pat, &args);
+ va_end(args);
+ return o;
+}
+
void
-croak(const char* pat, ...)
+Perl_vcroak(pTHX_ const char* pat, va_list *args)
{
dTHR;
- va_list args;
char *message;
HV *stash;
GV *gv;
CV *cv;
+ SV *msv;
+ STRLEN msglen;
+
+ msv = vmess(pat, args);
+ if (PL_errors && SvCUR(PL_errors)) {
+ sv_catsv(PL_errors, msv);
+ message = SvPV(PL_errors, msglen);
+ SvCUR_set(PL_errors, 0);
+ }
+ else
+ message = SvPV(msv,msglen);
+
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "croak: 0x%"UVxf" %s",
+ PTR2UV(thr), message));
- va_start(args, pat);
- message = mess(pat, &args);
- va_end(args);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "croak: 0x%lx %s", (unsigned long) thr, message));
if (PL_diehook) {
- /* sv_2cv might call croak() */
+ /* sv_2cv might call Perl_croak() */
SV *olddiehook = PL_diehook;
ENTER;
SAVESPTR(PL_diehook);
@@ -1332,7 +1605,8 @@ croak(const char* pat, ...)
SV *msg;
ENTER;
- msg = newSVpv(message, 0);
+ save_re_context();
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
@@ -1340,35 +1614,79 @@ croak(const char* pat, ...)
PUSHMARK(SP);
XPUSHs(msg);
PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ call_sv((SV*)cv, G_DISCARD);
POPSTACK;
LEAVE;
}
}
if (PL_in_eval) {
- PL_restartop = die_where(message);
+ PL_restartop = die_where(message, msglen);
JMPENV_JUMP(3);
}
- PerlIO_puts(PerlIO_stderr(),message);
- (void)PerlIO_flush(PerlIO_stderr());
+ {
+#ifdef USE_SFIO
+ /* SFIO can really mess with your errno */
+ int e = errno;
+#endif
+ PerlIO *serr = Perl_error_log;
+
+ PerlIO_write(serr, message, msglen);
+ (void)PerlIO_flush(serr);
+#ifdef USE_SFIO
+ errno = e;
+#endif
+ }
my_failure_exit();
}
+#if defined(PERL_IMPLICIT_CONTEXT)
+void
+Perl_croak_nocontext(const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ vcroak(pat, &args);
+ /* NOTREACHED */
+ va_end(args);
+}
+#endif /* PERL_IMPLICIT_CONTEXT */
+
+/*
+=for apidoc croak
+
+This is the XSUB-writer's interface to Perl's C<die> function. Use this
+function the same way you use the C C<printf> function. See
+C<warn>.
+
+=cut
+*/
+
void
-warn(const char* pat,...)
+Perl_croak(pTHX_ const char *pat, ...)
{
va_list args;
+ va_start(args, pat);
+ vcroak(pat, &args);
+ /* NOTREACHED */
+ va_end(args);
+}
+
+void
+Perl_vwarn(pTHX_ const char* pat, va_list *args)
+{
char *message;
HV *stash;
GV *gv;
CV *cv;
+ SV *msv;
+ STRLEN msglen;
- va_start(args, pat);
- message = mess(pat, &args);
- va_end(args);
+ msv = vmess(pat, args);
+ message = SvPV(msv, msglen);
if (PL_warnhook) {
- /* sv_2cv might call warn() */
+ /* sv_2cv might call Perl_warn() */
dTHR;
SV *oldwarnhook = PL_warnhook;
ENTER;
@@ -1381,7 +1699,8 @@ warn(const char* pat,...)
SV *msg;
ENTER;
- msg = newSVpv(message, 0);
+ save_re_context();
+ msg = newSVpvn(message, msglen);
SvREADONLY_on(msg);
SAVEFREESV(msg);
@@ -1389,29 +1708,185 @@ warn(const char* pat,...)
PUSHMARK(SP);
XPUSHs(msg);
PUTBACK;
- perl_call_sv((SV*)cv, G_DISCARD);
+ call_sv((SV*)cv, G_DISCARD);
POPSTACK;
LEAVE;
return;
}
}
- PerlIO_puts(PerlIO_stderr(),message);
+ {
+ PerlIO *serr = Perl_error_log;
+
+ PerlIO_write(serr, message, msglen);
+#ifdef LEAKTEST
+ DEBUG_L(*message == '!'
+ ? (xstat(message[1]=='!'
+ ? (message[2]=='!' ? 2 : 1)
+ : 0)
+ , 0)
+ : 0);
+#endif
+ (void)PerlIO_flush(serr);
+ }
+}
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+void
+Perl_warn_nocontext(const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ vwarn(pat, &args);
+ va_end(args);
+}
+#endif /* PERL_IMPLICIT_CONTEXT */
+
+/*
+=for apidoc warn
+
+This is the XSUB-writer's interface to Perl's C<warn> function. Use this
+function the same way you use the C C<printf> function. See
+C<croak>.
+
+=cut
+*/
+
+void
+Perl_warn(pTHX_ const char *pat, ...)
+{
+ va_list args;
+ va_start(args, pat);
+ vwarn(pat, &args);
+ va_end(args);
+}
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+void
+Perl_warner_nocontext(U32 err, const char *pat, ...)
+{
+ dTHX;
+ va_list args;
+ va_start(args, pat);
+ vwarner(err, pat, &args);
+ va_end(args);
+}
+#endif /* PERL_IMPLICIT_CONTEXT */
+
+void
+Perl_warner(pTHX_ U32 err, const char* pat,...)
+{
+ va_list args;
+ va_start(args, pat);
+ vwarner(err, pat, &args);
+ va_end(args);
+}
+
+void
+Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args)
+{
+ dTHR;
+ char *message;
+ HV *stash;
+ GV *gv;
+ CV *cv;
+ SV *msv;
+ STRLEN msglen;
+
+ msv = vmess(pat, args);
+ message = SvPV(msv, msglen);
+
+ if (ckDEAD(err)) {
+#ifdef USE_THREADS
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "croak: 0x%"UVxf" %s", PTR2UV(thr), message));
+#endif /* USE_THREADS */
+ if (PL_diehook) {
+ /* sv_2cv might call Perl_croak() */
+ SV *olddiehook = PL_diehook;
+ ENTER;
+ SAVESPTR(PL_diehook);
+ PL_diehook = Nullsv;
+ cv = sv_2cv(olddiehook, &stash, &gv, 0);
+ LEAVE;
+ if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
+ dSP;
+ SV *msg;
+
+ ENTER;
+ save_re_context();
+ msg = newSVpvn(message, msglen);
+ SvREADONLY_on(msg);
+ SAVEFREESV(msg);
+
+ PUSHSTACKi(PERLSI_DIEHOOK);
+ PUSHMARK(sp);
+ XPUSHs(msg);
+ PUTBACK;
+ call_sv((SV*)cv, G_DISCARD);
+ POPSTACK;
+ LEAVE;
+ }
+ }
+ if (PL_in_eval) {
+ PL_restartop = die_where(message, msglen);
+ JMPENV_JUMP(3);
+ }
+ {
+ PerlIO *serr = Perl_error_log;
+ PerlIO_write(serr, message, msglen);
+ (void)PerlIO_flush(serr);
+ }
+ my_failure_exit();
+
+ }
+ else {
+ if (PL_warnhook) {
+ /* sv_2cv might call Perl_warn() */
+ dTHR;
+ SV *oldwarnhook = PL_warnhook;
+ ENTER;
+ SAVESPTR(PL_warnhook);
+ PL_warnhook = Nullsv;
+ cv = sv_2cv(oldwarnhook, &stash, &gv, 0);
+ LEAVE;
+ if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
+ dSP;
+ SV *msg;
+
+ ENTER;
+ save_re_context();
+ msg = newSVpvn(message, msglen);
+ SvREADONLY_on(msg);
+ SAVEFREESV(msg);
+
+ PUSHSTACKi(PERLSI_WARNHOOK);
+ PUSHMARK(sp);
+ XPUSHs(msg);
+ PUTBACK;
+ call_sv((SV*)cv, G_DISCARD);
+ POPSTACK;
+ LEAVE;
+ return;
+ }
+ }
+ {
+ PerlIO *serr = Perl_error_log;
+ PerlIO_write(serr, message, msglen);
#ifdef LEAKTEST
- DEBUG_L(*message == '!'
- ? (xstat(message[1]=='!'
- ? (message[2]=='!' ? 2 : 1)
- : 0)
- , 0)
- : 0);
+ DEBUG_L(xstat());
#endif
- (void)PerlIO_flush(PerlIO_stderr());
+ (void)PerlIO_flush(serr);
+ }
+ }
}
#ifndef VMS /* VMS' my_setenv() is in VMS.c */
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__CYGWIN__)
void
-my_setenv(char *nam, char *val)
+Perl_my_setenv(pTHX_ char *nam, char *val)
{
+#ifndef PERL_USE_SAFE_PUTENV
+ /* most putenv()s leak, so we manipulate environ directly */
register I32 i=setenv_getix(nam); /* where does it go? */
if (environ == PL_origenviron) { /* need we copy environment? */
@@ -1421,14 +1896,16 @@ my_setenv(char *nam, char *val)
/*SUPPRESS 530*/
for (max = i; environ[max]; max++) ;
- New(901,tmpenv, max+2, char*);
- for (j=0; j<max; j++) /* copy environment */
- tmpenv[j] = savepv(environ[j]);
+ tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*));
+ for (j=0; j<max; j++) { /* copy environment */
+ tmpenv[j] = (char*)safesysmalloc((strlen(environ[j])+1)*sizeof(char));
+ strcpy(tmpenv[j], environ[j]);
+ }
tmpenv[max] = Nullch;
environ = tmpenv; /* tell exec where it is now */
}
if (!val) {
- Safefree(environ[i]);
+ safesysfree(environ[i]);
while (environ[i]) {
environ[i] = environ[i+1];
i++;
@@ -1436,29 +1913,63 @@ my_setenv(char *nam, char *val)
return;
}
if (!environ[i]) { /* does not exist yet */
- Renew(environ, i+2, char*); /* just expand it a bit */
+ environ = (char**)safesysrealloc(environ, (i+2) * sizeof(char*));
environ[i+1] = Nullch; /* make sure it's null terminated */
}
else
- Safefree(environ[i]);
- New(904, environ[i], strlen(nam) + strlen(val) + 2, char);
-#ifndef MSDOS
+ safesysfree(environ[i]);
+ environ[i] = (char*)safesysmalloc((strlen(nam)+strlen(val)+2) * sizeof(char));
+
(void)sprintf(environ[i],"%s=%s",nam,val);/* all that work just for this */
-#else
- /* MS-DOS requires environment variable names to be in uppercase */
- /* [Tom Dinger, 27 August 1990: Well, it doesn't _require_ it, but
- * some utilities and applications may break because they only look
- * for upper case strings. (Fixed strupr() bug here.)]
- */
- strcpy(environ[i],nam); strupr(environ[i]);
- (void)sprintf(environ[i] + strlen(nam),"=%s",val);
-#endif /* MSDOS */
+
+#else /* PERL_USE_SAFE_PUTENV */
+ char *new_env;
+
+ new_env = (char*)safesysmalloc((strlen(nam) + strlen(val) + 2) * sizeof(char));
+ (void)sprintf(new_env,"%s=%s",nam,val);/* all that work just for this */
+ (void)putenv(new_env);
+#endif /* PERL_USE_SAFE_PUTENV */
}
+#else /* WIN32 || __CYGWIN__ */
+#if defined(__CYGWIN__)
+/*
+ * Save environ of perl.exe, currently Cygwin links in separate environ's
+ * for each exe/dll. Probably should be a member of impure_ptr.
+ */
+static char ***Perl_main_environ;
+
+EXTERN_C void
+Perl_my_setenv_init(char ***penviron)
+{
+ Perl_main_environ = penviron;
+}
+
+void
+Perl_my_setenv(pTHX_ char *nam, char *val)
+{
+ /* You can not directly manipulate the environ[] array because
+ * the routines do some additional work that syncs the Cygwin
+ * environment with the Windows environment.
+ */
+ char *oldstr = environ[setenv_getix(nam)];
+
+ if (!val) {
+ if (!oldstr)
+ return;
+ unsetenv(nam);
+ safesysfree(oldstr);
+ return;
+ }
+ setenv(nam, val, 1);
+ environ = *Perl_main_environ; /* environ realloc can occur in setenv */
+ if(oldstr && environ[setenv_getix(nam)] != oldstr)
+ safesysfree(oldstr);
+}
#else /* if WIN32 */
void
-my_setenv(char *nam,char *val)
+Perl_my_setenv(pTHX_ char *nam,char *val)
{
#ifdef USE_WIN32_RTL_ENV
@@ -1490,13 +2001,13 @@ my_setenv(char *nam,char *val)
}
else
vallen = strlen(val);
- New(904, envstr, namlen + vallen + 3, char);
+ envstr = (char*)safesysmalloc((namlen + vallen + 3) * sizeof(char));
(void)sprintf(envstr,"%s=%s",nam,val);
(void)PerlEnv_putenv(envstr);
if (oldstr)
- Safefree(oldstr);
+ safesysfree(oldstr);
#ifdef _MSC_VER
- Safefree(envstr); /* MSVCRT leaks without this */
+ safesysfree(envstr); /* MSVCRT leaks without this */
#endif
#else /* !USE_WIN32_RTL_ENV */
@@ -1516,9 +2027,10 @@ my_setenv(char *nam,char *val)
}
#endif /* WIN32 */
+#endif
I32
-setenv_getix(char *nam)
+Perl_setenv_getix(pTHX_ char *nam)
{
register I32 i, len = strlen(nam);
@@ -1539,8 +2051,7 @@ setenv_getix(char *nam)
#ifdef UNLINK_ALL_VERSIONS
I32
-unlnk(f) /* unlink all versions of a file */
-char *f;
+Perl_unlnk(pTHX_ char *f) /* unlink all versions of a file */
{
I32 i;
@@ -1549,9 +2060,10 @@ char *f;
}
#endif
+/* this is a drop-in replacement for bcopy() */
#if !defined(HAS_BCOPY) || !defined(HAS_SAFE_BCOPY)
char *
-my_bcopy(register char *from,register char *to,register I32 len)
+Perl_my_bcopy(register const char *from,register char *to,register I32 len)
{
char *retval = to;
@@ -1569,12 +2081,10 @@ my_bcopy(register char *from,register char *to,register I32 len)
}
#endif
+/* this is a drop-in replacement for memset() */
#ifndef HAS_MEMSET
void *
-my_memset(loc,ch,len)
-register char *loc;
-register I32 ch;
-register I32 len;
+Perl_my_memset(register char *loc, register I32 ch, register I32 len)
{
char *retval = loc;
@@ -1584,11 +2094,10 @@ register I32 len;
}
#endif
+/* this is a drop-in replacement for bzero() */
#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
char *
-my_bzero(loc,len)
-register char *loc;
-register I32 len;
+Perl_my_bzero(register char *loc, register I32 len)
{
char *retval = loc;
@@ -1598,12 +2107,10 @@ register I32 len;
}
#endif
+/* this is a drop-in replacement for memcmp() */
#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
I32
-my_memcmp(s1,s2,len)
-char *s1;
-char *s2;
-register I32 len;
+Perl_my_memcmp(const char *s1, const char *s2, register I32 len)
{
register U8 *a = (U8 *)s1;
register U8 *b = (U8 *)s2;
@@ -1624,10 +2131,7 @@ char *
#else
int
#endif
-vsprintf(dest, pat, args)
-char *dest;
-const char *pat;
-char *args;
+vsprintf(char *dest, const char *pat, char *args)
{
FILE fakebuf;
@@ -1651,7 +2155,7 @@ char *args;
#ifdef MYSWAP
#if BYTEORDER != 0x4321
short
-my_swap(short s)
+Perl_my_swap(pTHX_ short s)
{
#if (BYTEORDER & 1) == 0
short result;
@@ -1664,7 +2168,7 @@ my_swap(short s)
}
long
-my_htonl(long l)
+Perl_my_htonl(pTHX_ long l)
{
union {
long result;
@@ -1679,7 +2183,7 @@ my_htonl(long l)
return u.result;
#else
#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
- croak("Unknown BYTEORDER\n");
+ Perl_croak(aTHX_ "Unknown BYTEORDER\n");
#else
register I32 o;
register I32 s;
@@ -1693,7 +2197,7 @@ my_htonl(long l)
}
long
-my_ntohl(long l)
+Perl_my_ntohl(pTHX_ long l)
{
union {
long l;
@@ -1708,7 +2212,7 @@ my_ntohl(long l)
return u.l;
#else
#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
- croak("Unknown BYTEORDER\n");
+ Perl_croak(aTHX_ "Unknown BYTEORDER\n");
#else
register I32 o;
register I32 s;
@@ -1736,8 +2240,7 @@ my_ntohl(long l)
#define HTOV(name,type) \
type \
- name (n) \
- register type n; \
+ name (register type n) \
{ \
union { \
type value; \
@@ -1753,8 +2256,7 @@ my_ntohl(long l)
#define VTOH(name,type) \
type \
- name (n) \
- register type n; \
+ name (register type n) \
{ \
union { \
type value; \
@@ -1784,16 +2286,19 @@ VTOH(vtohl,long)
#endif
/* VMS' my_popen() is in VMS.c, same with OS/2. */
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
PerlIO *
-my_popen(char *cmd, char *mode)
+Perl_my_popen(pTHX_ char *cmd, char *mode)
{
int p[2];
register I32 This, that;
- register I32 pid;
+ register Pid_t pid;
SV *sv;
I32 doexec = strNE(cmd,"-");
+ I32 did_pipes = 0;
+ int pp[2];
+ PERL_FLUSHALL_FOR_CHILD;
#ifdef OS2
if (doexec) {
return my_syspopen(cmd,mode);
@@ -1807,11 +2312,17 @@ my_popen(char *cmd, char *mode)
}
if (PerlProc_pipe(p) < 0)
return Nullfp;
+ if (doexec && PerlProc_pipe(pp) >= 0)
+ did_pipes = 1;
while ((pid = (doexec?vfork():fork())) < 0) {
if (errno != EAGAIN) {
PerlLIO_close(p[This]);
+ if (did_pipes) {
+ PerlLIO_close(pp[0]);
+ PerlLIO_close(pp[1]);
+ }
if (!doexec)
- croak("Can't fork");
+ Perl_croak(aTHX_ "Can't fork");
return Nullfp;
}
sleep(5);
@@ -1824,10 +2335,17 @@ my_popen(char *cmd, char *mode)
#define THIS that
#define THAT This
PerlLIO_close(p[THAT]);
+ if (did_pipes) {
+ PerlLIO_close(pp[0]);
+#if defined(HAS_FCNTL) && defined(F_SETFD)
+ fcntl(pp[1], F_SETFD, FD_CLOEXEC);
+#endif
+ }
if (p[THIS] != (*mode == 'r')) {
PerlLIO_dup2(p[THIS], *mode == 'r');
PerlLIO_close(p[THIS]);
}
+#ifndef OS2
if (doexec) {
#if !defined(HAS_FCNTL) || !defined(F_SETFD)
int fd;
@@ -1836,14 +2354,16 @@ my_popen(char *cmd, char *mode)
#define NOFILE 20
#endif
for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
- PerlLIO_close(fd);
+ if (fd != pp[1])
+ PerlLIO_close(fd);
#endif
- do_exec(cmd); /* may or may not use the shell */
+ do_exec3(cmd,pp[1],did_pipes); /* may or may not use the shell */
PerlProc__exit(1);
}
+#endif /* defined OS2 */
/*SUPPRESS 560*/
- if (tmpgv = gv_fetchpv("$",TRUE, SVt_PV))
- sv_setiv(GvSV(tmpgv), (IV)getpid());
+ if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV)))
+ sv_setiv(GvSV(tmpgv), PerlProc_getpid());
PL_forkprocess = 0;
hv_clear(PL_pidstatus); /* we have no children */
return Nullfp;
@@ -1852,6 +2372,8 @@ my_popen(char *cmd, char *mode)
}
do_execfree(); /* free any memory malloced by child on vfork */
PerlLIO_close(p[that]);
+ if (did_pipes)
+ PerlLIO_close(pp[1]);
if (p[that] < p[This]) {
PerlLIO_dup2(p[This], p[that]);
PerlLIO_close(p[This]);
@@ -1861,18 +2383,40 @@ my_popen(char *cmd, char *mode)
(void)SvUPGRADE(sv,SVt_IV);
SvIVX(sv) = pid;
PL_forkprocess = pid;
+ if (did_pipes && pid > 0) {
+ int errkid;
+ int n = 0, n1;
+
+ while (n < sizeof(int)) {
+ n1 = PerlLIO_read(pp[0],
+ (void*)(((char*)&errkid)+n),
+ (sizeof(int)) - n);
+ if (n1 <= 0)
+ break;
+ n += n1;
+ }
+ PerlLIO_close(pp[0]);
+ did_pipes = 0;
+ if (n) { /* Error */
+ if (n != sizeof(int))
+ Perl_croak(aTHX_ "panic: kid popen errno read");
+ errno = errkid; /* Propagate errno from kid */
+ return Nullfp;
+ }
+ }
+ if (did_pipes)
+ PerlLIO_close(pp[0]);
return PerlIO_fdopen(p[This], mode);
}
#else
#if defined(atarist) || defined(DJGPP)
FILE *popen();
PerlIO *
-my_popen(cmd,mode)
-char *cmd;
-char *mode;
+Perl_my_popen(pTHX_ char *cmd, char *mode)
{
/* Needs work for PerlIO ! */
/* used 0 for 2nd parameter to PerlIO-exportFILE; apparently not used */
+ PERL_FLUSHALL_FOR_CHILD;
return popen(PerlIO_exportFILE(cmd, 0), mode);
}
#endif
@@ -1881,25 +2425,23 @@ char *mode;
#ifdef DUMP_FDS
void
-dump_fds(char *s)
+Perl_dump_fds(pTHX_ char *s)
{
int fd;
struct stat tmpstatbuf;
- PerlIO_printf(PerlIO_stderr(),"%s", s);
+ PerlIO_printf(Perl_debug_log,"%s", s);
for (fd = 0; fd < 32; fd++) {
if (PerlLIO_fstat(fd,&tmpstatbuf) >= 0)
- PerlIO_printf(PerlIO_stderr()," %d",fd);
+ PerlIO_printf(Perl_debug_log," %d",fd);
}
- PerlIO_printf(PerlIO_stderr(),"\n");
+ PerlIO_printf(Perl_debug_log,"\n");
}
#endif /* DUMP_FDS */
#ifndef HAS_DUP2
int
-dup2(oldfd,newfd)
-int oldfd;
-int newfd;
+dup2(int oldfd, int newfd)
{
#if defined(HAS_FCNTL) && defined(F_DUPFD)
if (oldfd == newfd)
@@ -1935,7 +2477,7 @@ int newfd;
#ifdef HAS_SIGACTION
Sighandler_t
-rsignal(int signo, Sighandler_t handler)
+Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
{
struct sigaction act, oact;
@@ -1956,7 +2498,7 @@ rsignal(int signo, Sighandler_t handler)
}
Sighandler_t
-rsignal_state(int signo)
+Perl_rsignal_state(pTHX_ int signo)
{
struct sigaction oact;
@@ -1967,7 +2509,7 @@ rsignal_state(int signo)
}
int
-rsignal_save(int signo, Sighandler_t handler, Sigsave_t *save)
+Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
{
struct sigaction act;
@@ -1985,7 +2527,7 @@ rsignal_save(int signo, Sighandler_t handler, Sigsave_t *save)
}
int
-rsignal_restore(int signo, Sigsave_t *save)
+Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
{
return sigaction(signo, save, (struct sigaction *)NULL);
}
@@ -1993,7 +2535,7 @@ rsignal_restore(int signo, Sigsave_t *save)
#else /* !HAS_SIGACTION */
Sighandler_t
-rsignal(int signo, Sighandler_t handler)
+Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
{
return PerlProc_signal(signo, handler);
}
@@ -2008,7 +2550,7 @@ sig_trap(int signo)
}
Sighandler_t
-rsignal_state(int signo)
+Perl_rsignal_state(pTHX_ int signo)
{
Sighandler_t oldsig;
@@ -2016,19 +2558,19 @@ rsignal_state(int signo)
oldsig = PerlProc_signal(signo, sig_trap);
PerlProc_signal(signo, oldsig);
if (sig_trapped)
- PerlProc_kill(getpid(), signo);
+ PerlProc_kill(PerlProc_getpid(), signo);
return oldsig;
}
int
-rsignal_save(int signo, Sighandler_t handler, Sigsave_t *save)
+Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
{
*save = PerlProc_signal(signo, handler);
return (*save == SIG_ERR) ? -1 : 0;
}
int
-rsignal_restore(int signo, Sigsave_t *save)
+Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
{
return (PerlProc_signal(signo, *save) == SIG_ERR) ? -1 : 0;
}
@@ -2036,15 +2578,15 @@ rsignal_restore(int signo, Sigsave_t *save)
#endif /* !HAS_SIGACTION */
/* VMS' my_pclose() is in VMS.c; same with OS/2 */
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
I32
-my_pclose(PerlIO *ptr)
+Perl_my_pclose(pTHX_ PerlIO *ptr)
{
Sigsave_t hstat, istat, qstat;
int status;
SV **svp;
- int pid;
- int pid2;
+ Pid_t pid;
+ Pid_t pid2;
bool close_failed;
int saved_errno;
#ifdef VMS
@@ -2055,7 +2597,7 @@ my_pclose(PerlIO *ptr)
#endif
svp = av_fetch(PL_fdpid,PerlIO_fileno(ptr),TRUE);
- pid = (int)SvIVX(*svp);
+ pid = SvIVX(*svp);
SvREFCNT_dec(*svp);
*svp = &PL_sv_undef;
#ifdef OS2
@@ -2092,9 +2634,9 @@ my_pclose(PerlIO *ptr)
}
#endif /* !DOSISH */
-#if !defined(DOSISH) || defined(OS2) || defined(WIN32)
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
I32
-wait4pid(int pid, int *statusp, int flags)
+Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
{
SV *sv;
SV** svp;
@@ -2103,7 +2645,7 @@ wait4pid(int pid, int *statusp, int flags)
if (!pid)
return -1;
if (pid > 0) {
- sprintf(spid, "%d", pid);
+ sprintf(spid, "%"IVdf, (IV)pid);
svp = hv_fetch(PL_pidstatus,spid,strlen(spid),FALSE);
if (svp && *svp != &PL_sv_undef) {
*statusp = SvIVX(*svp);
@@ -2115,11 +2657,11 @@ wait4pid(int pid, int *statusp, int flags)
HE *entry;
hv_iterinit(PL_pidstatus);
- if (entry = hv_iternext(PL_pidstatus)) {
+ if ((entry = hv_iternext(PL_pidstatus))) {
pid = atoi(hv_iterkey(entry,(I32*)statusp));
sv = hv_iterval(PL_pidstatus,entry);
*statusp = SvIVX(sv);
- sprintf(spid, "%d", pid);
+ sprintf(spid, "%"IVdf, (IV)pid);
(void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD);
return pid;
}
@@ -2139,7 +2681,7 @@ wait4pid(int pid, int *statusp, int flags)
{
I32 result;
if (flags)
- croak("Can't do waitpid with flags");
+ Perl_croak(aTHX_ "Can't do waitpid with flags");
else {
while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
pidgone(result,*statusp);
@@ -2154,12 +2696,12 @@ wait4pid(int pid, int *statusp, int flags)
void
/*SUPPRESS 590*/
-pidgone(int pid, int status)
+Perl_pidgone(pTHX_ Pid_t pid, int status)
{
register SV *sv;
char spid[TYPE_CHARS(int)];
- sprintf(spid, "%d", pid);
+ sprintf(spid, "%"IVdf, (IV)pid);
sv = *hv_fetch(PL_pidstatus,spid,strlen(spid),TRUE);
(void)SvUPGRADE(sv,SVt_IV);
SvIVX(sv) = status;
@@ -2171,29 +2713,31 @@ int pclose();
#ifdef HAS_FORK
int /* Cannot prototype with I32
in os2ish.h. */
-my_syspclose(ptr)
+my_syspclose(PerlIO *ptr)
#else
I32
-my_pclose(ptr)
+Perl_my_pclose(pTHX_ PerlIO *ptr)
#endif
-PerlIO *ptr;
{
/* Needs work for PerlIO ! */
FILE *f = PerlIO_findFILE(ptr);
I32 result = pclose(f);
+#if defined(DJGPP)
+ result = (result << 8) & 0xff00;
+#endif
PerlIO_releaseFILE(ptr,f);
return result;
}
#endif
void
-repeatcpy(register char *to, register char *from, I32 len, register I32 count)
+Perl_repeatcpy(pTHX_ register char *to, register const char *from, I32 len, register I32 count)
{
register I32 todo;
- register char *frombase = from;
+ register const char *frombase = from;
if (len == 1) {
- register char c = *from;
+ register const char c = *from;
while (count-- > 0)
*to++ = c;
return;
@@ -2206,10 +2750,8 @@ repeatcpy(register char *to, register char *from, I32 len, register I32 count)
}
}
-#ifndef CASTNEGFLOAT
U32
-cast_ulong(f)
-double f;
+Perl_cast_ulong(pTHX_ NV f)
{
long along;
@@ -2224,9 +2766,6 @@ double f;
return (unsigned long)along;
}
# undef BIGDOUBLE
-#endif
-
-#ifndef CASTI32
/* Unfortunately, on some systems the cast_uv() function doesn't
work with the system-supplied definition of ULONG_MAX. The
@@ -2249,8 +2788,7 @@ double f;
#endif
I32
-cast_i32(f)
-double f;
+Perl_cast_i32(pTHX_ NV f)
{
if (f >= I32_MAX)
return (I32) I32_MAX;
@@ -2260,32 +2798,40 @@ double f;
}
IV
-cast_iv(f)
-double f;
+Perl_cast_iv(pTHX_ NV f)
{
- if (f >= IV_MAX)
- return (IV) IV_MAX;
+ if (f >= IV_MAX) {
+ UV uv;
+
+ if (f >= (NV)UV_MAX)
+ return (IV) UV_MAX;
+ uv = (UV) f;
+ return (IV)uv;
+ }
if (f <= IV_MIN)
return (IV) IV_MIN;
return (IV) f;
}
UV
-cast_uv(f)
-double f;
+Perl_cast_uv(pTHX_ NV f)
{
if (f >= MY_UV_MAX)
return (UV) MY_UV_MAX;
+ if (f < 0) {
+ IV iv;
+
+ if (f < IV_MIN)
+ return (UV)IV_MIN;
+ iv = (IV) f;
+ return (UV) iv;
+ }
return (UV) f;
}
-#endif
-
#ifndef HAS_RENAME
I32
-same_dirent(a,b)
-char *a;
-char *b;
+Perl_same_dirent(pTHX_ char *a, char *b)
{
char *fa = strrchr(a,'/');
char *fb = strrchr(b,'/');
@@ -2320,67 +2866,212 @@ char *b;
}
#endif /* !HAS_RENAME */
-UV
-scan_oct(char *start, I32 len, I32 *retlen)
+NV
+Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen)
{
register char *s = start;
- register UV retval = 0;
- bool overflowed = FALSE;
+ register NV rnv = 0.0;
+ register UV ruv = 0;
+ register bool seenb = FALSE;
+ register bool overflowed = FALSE;
+
+ for (; len-- && *s; s++) {
+ if (!(*s == '0' || *s == '1')) {
+ if (*s == '_')
+ continue; /* Note: does not check for __ and the like. */
+ if (seenb == FALSE && *s == 'b' && ruv == 0) {
+ /* Disallow 0bbb0b0bbb... */
+ seenb = TRUE;
+ continue;
+ }
+ else {
+ dTHR;
+ if (ckWARN(WARN_DIGIT))
+ Perl_warner(aTHX_ WARN_DIGIT,
+ "Illegal binary digit '%c' ignored", *s);
+ break;
+ }
+ }
+ if (!overflowed) {
+ register UV xuv = ruv << 1;
+
+ if ((xuv >> 1) != ruv) {
+ dTHR;
+ overflowed = TRUE;
+ rnv = (NV) ruv;
+ if (ckWARN_d(WARN_OVERFLOW))
+ Perl_warner(aTHX_ WARN_OVERFLOW,
+ "Integer overflow in binary number");
+ } else
+ ruv = xuv | (*s - '0');
+ }
+ if (overflowed) {
+ rnv *= 2;
+ /* If an NV has not enough bits in its mantissa to
+ * represent an UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply rnv by the
+ * right amount. */
+ rnv += (*s - '0');
+ }
+ }
+ if (!overflowed)
+ rnv = (NV) ruv;
+ if ( ( overflowed && rnv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && ruv > 0xffffffff )
+#endif
+ ) {
+ dTHR;
+ if (ckWARN(WARN_PORTABLE))
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "Binary number > 0b11111111111111111111111111111111 non-portable");
+ }
+ *retlen = s - start;
+ return rnv;
+}
- while (len && *s >= '0' && *s <= '7') {
- register UV n = retval << 3;
- if (!overflowed && (n >> 3) != retval) {
- warn("Integer overflow in octal number");
- overflowed = TRUE;
+NV
+Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen)
+{
+ register char *s = start;
+ register NV rnv = 0.0;
+ register UV ruv = 0;
+ register bool overflowed = FALSE;
+
+ for (; len-- && *s; s++) {
+ if (!(*s >= '0' && *s <= '7')) {
+ if (*s == '_')
+ continue; /* Note: does not check for __ and the like. */
+ else {
+ /* Allow \octal to work the DWIM way (that is, stop scanning
+ * as soon as non-octal characters are seen, complain only iff
+ * someone seems to want to use the digits eight and nine). */
+ if (*s == '8' || *s == '9') {
+ dTHR;
+ if (ckWARN(WARN_DIGIT))
+ Perl_warner(aTHX_ WARN_DIGIT,
+ "Illegal octal digit '%c' ignored", *s);
+ }
+ break;
+ }
+ }
+ if (!overflowed) {
+ register UV xuv = ruv << 3;
+
+ if ((xuv >> 3) != ruv) {
+ dTHR;
+ overflowed = TRUE;
+ rnv = (NV) ruv;
+ if (ckWARN_d(WARN_OVERFLOW))
+ Perl_warner(aTHX_ WARN_OVERFLOW,
+ "Integer overflow in octal number");
+ } else
+ ruv = xuv | (*s - '0');
}
- retval = n | (*s++ - '0');
- len--;
+ if (overflowed) {
+ rnv *= 8.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent an UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply rnv by the
+ * right amount of 8-tuples. */
+ rnv += (NV)(*s - '0');
+ }
+ }
+ if (!overflowed)
+ rnv = (NV) ruv;
+ if ( ( overflowed && rnv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && ruv > 0xffffffff )
+#endif
+ ) {
+ dTHR;
+ if (ckWARN(WARN_PORTABLE))
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "Octal number > 037777777777 non-portable");
}
- if (PL_dowarn && len && (*s == '8' || *s == '9'))
- warn("Illegal octal digit ignored");
*retlen = s - start;
- return retval;
+ return rnv;
}
-UV
-scan_hex(char *start, I32 len, I32 *retlen)
+NV
+Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen)
{
register char *s = start;
- register UV retval = 0;
- bool overflowed = FALSE;
- char *tmp = s;
- register UV n;
-
- while (len-- && *s) {
- tmp = strchr((char *) PL_hexdigit, *s++);
- if (!tmp) {
- if (*(s-1) == '_' || (*(s-1) == 'x' && retval == 0))
+ register NV rnv = 0.0;
+ register UV ruv = 0;
+ register bool seenx = FALSE;
+ register bool overflowed = FALSE;
+ char *hexdigit;
+
+ for (; len-- && *s; s++) {
+ hexdigit = strchr((char *) PL_hexdigit, *s);
+ if (!hexdigit) {
+ if (*s == '_')
+ continue; /* Note: does not check for __ and the like. */
+ if (seenx == FALSE && *s == 'x' && ruv == 0) {
+ /* Disallow 0xxx0x0xxx... */
+ seenx = TRUE;
continue;
+ }
else {
- --s;
- if (PL_dowarn)
- warn("Illegal hex digit ignored");
+ dTHR;
+ if (ckWARN(WARN_DIGIT))
+ Perl_warner(aTHX_ WARN_DIGIT,
+ "Illegal hexadecimal digit '%c' ignored", *s);
break;
}
}
- n = retval << 4;
- if (!overflowed && (n >> 4) != retval) {
- warn("Integer overflow in hex number");
- overflowed = TRUE;
+ if (!overflowed) {
+ register UV xuv = ruv << 4;
+
+ if ((xuv >> 4) != ruv) {
+ dTHR;
+ overflowed = TRUE;
+ rnv = (NV) ruv;
+ if (ckWARN_d(WARN_OVERFLOW))
+ Perl_warner(aTHX_ WARN_OVERFLOW,
+ "Integer overflow in hexadecimal number");
+ } else
+ ruv = xuv | ((hexdigit - PL_hexdigit) & 15);
}
- retval = n | ((tmp - PL_hexdigit) & 15);
+ if (overflowed) {
+ rnv *= 16.0;
+ /* If an NV has not enough bits in its mantissa to
+ * represent an UV this summing of small low-order numbers
+ * is a waste of time (because the NV cannot preserve
+ * the low-order bits anyway): we could just remember when
+ * did we overflow and in the end just multiply rnv by the
+ * right amount of 16-tuples. */
+ rnv += (NV)((hexdigit - PL_hexdigit) & 15);
+ }
+ }
+ if (!overflowed)
+ rnv = (NV) ruv;
+ if ( ( overflowed && rnv > 4294967295.0)
+#if UVSIZE > 4
+ || (!overflowed && ruv > 0xffffffff )
+#endif
+ ) {
+ dTHR;
+ if (ckWARN(WARN_PORTABLE))
+ Perl_warner(aTHX_ WARN_PORTABLE,
+ "Hexadecimal number > 0xffffffff non-portable");
}
*retlen = s - start;
- return retval;
+ return rnv;
}
char*
-find_script(char *scriptname, bool dosearch, char **search_ext, I32 flags)
+Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 flags)
{
dTHR;
char *xfound = Nullch;
char *xfailed = Nullch;
- char tmpbuf[512];
+ char tmpbuf[MAXPATHLEN];
register char *s;
I32 len;
int retval;
@@ -2493,15 +3184,26 @@ find_script(char *scriptname, bool dosearch, char **search_ext, I32 flags)
}
#endif
+#ifdef MACOS_TRADITIONAL
+ if (dosearch && !strchr(scriptname, ':') &&
+ (s = PerlEnv_getenv("Commands")))
+#else
if (dosearch && !strchr(scriptname, '/')
#ifdef DOSISH
&& !strchr(scriptname, '\\')
#endif
- && (s = PerlEnv_getenv("PATH"))) {
+ && (s = PerlEnv_getenv("PATH")))
+#endif
+ {
bool seen_dot = 0;
PL_bufend = s + strlen(s);
while (s < PL_bufend) {
+#ifdef MACOS_TRADITIONAL
+ s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, PL_bufend,
+ ',',
+ &len);
+#else
#if defined(atarist) || defined(DOSISH)
for (len = 0; *s
# ifdef atarist
@@ -2518,12 +3220,17 @@ find_script(char *scriptname, bool dosearch, char **search_ext, I32 flags)
':',
&len);
#endif /* ! (atarist || DOSISH) */
+#endif /* MACOS_TRADITIONAL */
if (s < PL_bufend)
s++;
if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
continue; /* don't search dir with too-long name */
+#ifdef MACOS_TRADITIONAL
+ if (len && tmpbuf[len - 1] != ':')
+ tmpbuf[len++] = ':';
+#else
if (len
-#if defined(atarist) || defined(DOSISH)
+#if defined(atarist) || defined(__MINT__) || defined(DOSISH)
&& tmpbuf[len - 1] != '/'
&& tmpbuf[len - 1] != '\\'
#endif
@@ -2531,6 +3238,7 @@ find_script(char *scriptname, bool dosearch, char **search_ext, I32 flags)
tmpbuf[len++] = '/';
if (len == 2 && tmpbuf[0] == '.')
seen_dot = 1;
+#endif
(void)strcpy(tmpbuf + len, scriptname);
#endif /* !VMS */
@@ -2555,7 +3263,7 @@ find_script(char *scriptname, bool dosearch, char **search_ext, I32 flags)
continue;
if (S_ISREG(PL_statbuf.st_mode)
&& cando(S_IRUSR,TRUE,&PL_statbuf)
-#ifndef DOSISH
+#if !defined(DOSISH) && !defined(MACOS_TRADITIONAL)
&& cando(S_IXUSR,TRUE,&PL_statbuf)
#endif
)
@@ -2574,7 +3282,7 @@ find_script(char *scriptname, bool dosearch, char **search_ext, I32 flags)
seen_dot = 1; /* Disable message. */
if (!xfound) {
if (flags & 1) { /* do or die? */
- croak("Can't %s %s%s%s",
+ Perl_croak(aTHX_ "Can't %s %s%s%s",
(xfailed ? "execute" : "find"),
(xfailed ? xfailed : scriptname),
(xfailed ? "" : " on PATH"),
@@ -2589,8 +3297,46 @@ find_script(char *scriptname, bool dosearch, char **search_ext, I32 flags)
return (scriptname ? savepv(scriptname) : Nullch);
}
+#ifndef PERL_GET_CONTEXT_DEFINED
+
+void *
+Perl_get_context(void)
+{
+#if defined(USE_THREADS) || defined(USE_ITHREADS)
+# ifdef OLD_PTHREADS_API
+ pthread_addr_t t;
+ if (pthread_getspecific(PL_thr_key, &t))
+ Perl_croak_nocontext("panic: pthread_getspecific");
+ return (void*)t;
+# else
+# ifdef I_MACH_CTHREADS
+ return (void*)cthread_data(cthread_self());
+# else
+ return (void*)pthread_getspecific(PL_thr_key);
+# endif
+# endif
+#else
+ return (void*)NULL;
+#endif
+}
+
+void
+Perl_set_context(void *t)
+{
+#if defined(USE_THREADS) || defined(USE_ITHREADS)
+# ifdef I_MACH_CTHREADS
+ cthread_set_data(cthread_self(), t);
+# else
+ if (pthread_setspecific(PL_thr_key, t))
+ Perl_croak_nocontext("panic: pthread_setspecific");
+# endif
+#endif
+}
+
+#endif /* !PERL_GET_CONTEXT_DEFINED */
#ifdef USE_THREADS
+
#ifdef FAKE_THREADS
/* Very simplistic scheduler for now */
void
@@ -2600,15 +3346,13 @@ schedule(void)
}
void
-perl_cond_init(cp)
-perl_cond *cp;
+Perl_cond_init(pTHX_ perl_cond *cp)
{
*cp = 0;
}
void
-perl_cond_signal(cp)
-perl_cond *cp;
+Perl_cond_signal(pTHX_ perl_cond *cp)
{
perl_os_thread t;
perl_cond cond = *cp;
@@ -2628,8 +3372,7 @@ perl_cond *cp;
}
void
-perl_cond_broadcast(cp)
-perl_cond *cp;
+Perl_cond_broadcast(pTHX_ perl_cond *cp)
{
perl_os_thread t;
perl_cond cond, cond_next;
@@ -2650,13 +3393,12 @@ perl_cond *cp;
}
void
-perl_cond_wait(cp)
-perl_cond *cp;
+Perl_cond_wait(pTHX_ perl_cond *cp)
{
perl_cond cond;
if (thr->i.next_run == thr)
- croak("panic: perl_cond_wait called by last runnable thread");
+ Perl_croak(aTHX_ "panic: perl_cond_wait called by last runnable thread");
New(666, cond, 1, struct perl_wait_queue);
cond->thread = thr;
@@ -2669,20 +3411,8 @@ perl_cond *cp;
}
#endif /* FAKE_THREADS */
-#ifdef OLD_PTHREADS_API
-struct perl_thread *
-getTHR _((void))
-{
- pthread_addr_t t;
-
- if (pthread_getspecific(PL_thr_key, &t))
- croak("panic: pthread_getspecific");
- return (struct perl_thread *) t;
-}
-#endif /* OLD_PTHREADS_API */
-
MAGIC *
-condpair_magic(SV *sv)
+Perl_condpair_magic(pTHX_ SV *sv)
{
MAGIC *mg;
@@ -2696,11 +3426,11 @@ condpair_magic(SV *sv)
COND_INIT(&cp->owner_cond);
COND_INIT(&cp->cond);
cp->owner = 0;
- LOCK_SV_MUTEX;
+ LOCK_CRED_MUTEX; /* XXX need separate mutex? */
mg = mg_find(sv, 'm');
if (mg) {
/* someone else beat us to initialising it */
- UNLOCK_SV_MUTEX;
+ UNLOCK_CRED_MUTEX; /* XXX need separate mutex? */
MUTEX_DESTROY(&cp->mutex);
COND_DESTROY(&cp->owner_cond);
COND_DESTROY(&cp->cond);
@@ -2711,8 +3441,8 @@ condpair_magic(SV *sv)
mg = SvMAGIC(sv);
mg->mg_ptr = (char *)cp;
mg->mg_len = sizeof(cp);
- UNLOCK_SV_MUTEX;
- DEBUG_S(WITH_THR(PerlIO_printf(PerlIO_stderr(),
+ UNLOCK_CRED_MUTEX; /* XXX need separate mutex? */
+ DEBUG_S(WITH_THR(PerlIO_printf(Perl_debug_log,
"%p: condpair_magic %p\n", thr, sv));)
}
}
@@ -2727,14 +3457,16 @@ condpair_magic(SV *sv)
* thread calling new_struct_thread) clearly satisfies this constraint.
*/
struct perl_thread *
-new_struct_thread(struct perl_thread *t)
+Perl_new_struct_thread(pTHX_ struct perl_thread *t)
{
+#if !defined(PERL_IMPLICIT_CONTEXT)
struct perl_thread *thr;
+#endif
SV *sv;
SV **svp;
I32 i;
- sv = newSVpv("", 0);
+ sv = newSVpvn("", 0);
SvGROW(sv, sizeof(struct perl_thread) + 1);
SvCUR_set(sv, sizeof(struct perl_thread));
thr = (Thread) SvPVX(sv);
@@ -2752,38 +3484,30 @@ new_struct_thread(struct perl_thread *t)
#endif
thr->oursv = sv;
- init_stacks(ARGS);
+ init_stacks();
PL_curcop = &PL_compiling;
+ thr->interp = t->interp;
thr->cvcache = newHV();
thr->threadsv = newAV();
thr->specific = newAV();
- thr->errsv = newSVpv("", 0);
- thr->errhv = newHV();
+ thr->errsv = newSVpvn("", 0);
thr->flags = THRf_R_JOINABLE;
MUTEX_INIT(&thr->mutex);
+ JMPENV_BOOTSTRAP;
- /* top_env needs to be non-zero. It points to an area
- in which longjmp() stuff is stored, as C callstack
- info there at least is thread specific this has to
- be per-thread. Otherwise a 'die' in a thread gives
- that thread the C stack of last thread to do an eval {}!
- See comments in scope.h
- Initialize top entry (as in perl.c for main thread)
- */
- PL_start_env.je_prev = NULL;
- PL_start_env.je_ret = -1;
- PL_start_env.je_mustcatch = TRUE;
- PL_top_env = &PL_start_env;
-
- PL_in_eval = FALSE;
+ PL_in_eval = EVAL_NULL; /* ~(EVAL_INEVAL|EVAL_WARNONLY|EVAL_KEEPERR) */
PL_restartop = 0;
PL_statname = NEWSV(66,0);
+ PL_errors = newSVpvn("", 0);
PL_maxscream = -1;
- PL_regcompp = FUNC_NAME_TO_PTR(pregcomp);
- PL_regexecp = FUNC_NAME_TO_PTR(regexec_flags);
+ PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
+ PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
+ PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
+ PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
+ PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
PL_regindent = 0;
PL_reginterp_cnt = 0;
PL_lastscream = Nullsv;
@@ -2791,10 +3515,15 @@ new_struct_thread(struct perl_thread *t)
PL_screamnext = 0;
PL_reg_start_tmp = 0;
PL_reg_start_tmpl = 0;
+ PL_reg_poscache = Nullch;
/* parent thread's data needs to be locked while we make copy */
MUTEX_LOCK(&t->mutex);
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+ PL_protect = t->Tprotect;
+#endif
+
PL_curcop = t->Tcurcop; /* XXX As good a guess as any? */
PL_defstash = t->Tdefstash; /* XXX maybe these should */
PL_curstash = t->Tcurstash; /* always be set to main? */
@@ -2808,9 +3537,12 @@ new_struct_thread(struct perl_thread *t)
PL_ofs = savepvn(t->Tofs, PL_ofslen);
PL_defoutgv = (GV*)SvREFCNT_inc(t->Tdefoutgv);
PL_chopset = t->Tchopset;
- PL_formtarget = newSVsv(t->Tformtarget);
PL_bodytarget = newSVsv(t->Tbodytarget);
PL_toptarget = newSVsv(t->Ttoptarget);
+ if (t->Tformtarget == t->Ttoptarget)
+ PL_formtarget = PL_toptarget;
+ else
+ PL_formtarget = PL_bodytarget;
/* Initialise all per-thread SVs that the template thread used */
svp = AvARRAY(t->threadsv);
@@ -2819,8 +3551,9 @@ new_struct_thread(struct perl_thread *t)
SV *sv = newSVsv(*svp);
av_store(thr->threadsv, i, sv);
sv_magic(sv, 0, 0, &PL_threadsv_names[i], 1);
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
- "new_struct_thread: copied threadsv %d %p->%p\n",i, t, thr));
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
+ "new_struct_thread: copied threadsv %"IVdf" %p->%p\n",
+ (IV)i, t, thr));
}
}
thr->threadsvp = AvARRAY(thr->threadsv);
@@ -2838,7 +3571,7 @@ new_struct_thread(struct perl_thread *t)
MUTEX_UNLOCK(&t->mutex);
#ifdef HAVE_THREAD_INTERN
- init_thread_intern(thr);
+ Perl_init_thread_intern(thr);
#endif /* HAVE_THREAD_INTERN */
return thr;
}
@@ -2850,7 +3583,7 @@ new_struct_thread(struct perl_thread *t)
* So it is in perl for (say) POSIX to use.
* Needed for SunOS with Sun's 'acc' for example.
*/
-double
+NV
Perl_huge(void)
{
return HUGE_VAL;
@@ -2859,136 +3592,238 @@ Perl_huge(void)
#ifdef PERL_GLOBAL_STRUCT
struct perl_vars *
-Perl_GetVars(void)
+Perl_GetVars(pTHX)
{
return &PL_Vars;
}
#endif
char **
-get_op_names(void)
+Perl_get_op_names(pTHX)
{
- return op_name;
+ return PL_op_name;
}
char **
-get_op_descs(void)
+Perl_get_op_descs(pTHX)
{
- return op_desc;
+ return PL_op_desc;
}
char *
-get_no_modify(void)
+Perl_get_no_modify(pTHX)
{
- return (char*)no_modify;
+ return (char*)PL_no_modify;
}
U32 *
-get_opargs(void)
+Perl_get_opargs(pTHX)
{
- return opargs;
+ return PL_opargs;
}
+PPADDR_t*
+Perl_get_ppaddr(pTHX)
+{
+ return &PL_ppaddr;
+}
-SV **
-get_specialsv_list(void)
+#ifndef HAS_GETENV_LEN
+char *
+Perl_getenv_len(pTHX_ char *env_elem, unsigned long *len)
{
- return PL_specialsv_list;
+ char *env_trans = PerlEnv_getenv(env_elem);
+ if (env_trans)
+ *len = strlen(env_trans);
+ return env_trans;
}
+#endif
MGVTBL*
-get_vtbl(int vtbl_id)
+Perl_get_vtbl(pTHX_ int vtbl_id)
{
MGVTBL* result = Null(MGVTBL*);
switch(vtbl_id) {
case want_vtbl_sv:
- result = &vtbl_sv;
+ result = &PL_vtbl_sv;
break;
case want_vtbl_env:
- result = &vtbl_env;
+ result = &PL_vtbl_env;
break;
case want_vtbl_envelem:
- result = &vtbl_envelem;
+ result = &PL_vtbl_envelem;
break;
case want_vtbl_sig:
- result = &vtbl_sig;
+ result = &PL_vtbl_sig;
break;
case want_vtbl_sigelem:
- result = &vtbl_sigelem;
+ result = &PL_vtbl_sigelem;
break;
case want_vtbl_pack:
- result = &vtbl_pack;
+ result = &PL_vtbl_pack;
break;
case want_vtbl_packelem:
- result = &vtbl_packelem;
+ result = &PL_vtbl_packelem;
break;
case want_vtbl_dbline:
- result = &vtbl_dbline;
+ result = &PL_vtbl_dbline;
break;
case want_vtbl_isa:
- result = &vtbl_isa;
+ result = &PL_vtbl_isa;
break;
case want_vtbl_isaelem:
- result = &vtbl_isaelem;
+ result = &PL_vtbl_isaelem;
break;
case want_vtbl_arylen:
- result = &vtbl_arylen;
+ result = &PL_vtbl_arylen;
break;
case want_vtbl_glob:
- result = &vtbl_glob;
+ result = &PL_vtbl_glob;
break;
case want_vtbl_mglob:
- result = &vtbl_mglob;
+ result = &PL_vtbl_mglob;
break;
case want_vtbl_nkeys:
- result = &vtbl_nkeys;
+ result = &PL_vtbl_nkeys;
break;
case want_vtbl_taint:
- result = &vtbl_taint;
+ result = &PL_vtbl_taint;
break;
case want_vtbl_substr:
- result = &vtbl_substr;
+ result = &PL_vtbl_substr;
break;
case want_vtbl_vec:
- result = &vtbl_vec;
+ result = &PL_vtbl_vec;
break;
case want_vtbl_pos:
- result = &vtbl_pos;
+ result = &PL_vtbl_pos;
break;
case want_vtbl_bm:
- result = &vtbl_bm;
+ result = &PL_vtbl_bm;
break;
case want_vtbl_fm:
- result = &vtbl_fm;
+ result = &PL_vtbl_fm;
break;
case want_vtbl_uvar:
- result = &vtbl_uvar;
+ result = &PL_vtbl_uvar;
break;
#ifdef USE_THREADS
case want_vtbl_mutex:
- result = &vtbl_mutex;
+ result = &PL_vtbl_mutex;
break;
#endif
case want_vtbl_defelem:
- result = &vtbl_defelem;
+ result = &PL_vtbl_defelem;
break;
case want_vtbl_regexp:
- result = &vtbl_regexp;
+ result = &PL_vtbl_regexp;
+ break;
+ case want_vtbl_regdata:
+ result = &PL_vtbl_regdata;
+ break;
+ case want_vtbl_regdatum:
+ result = &PL_vtbl_regdatum;
break;
#ifdef USE_LOCALE_COLLATE
case want_vtbl_collxfrm:
- result = &vtbl_collxfrm;
+ result = &PL_vtbl_collxfrm;
break;
#endif
case want_vtbl_amagic:
- result = &vtbl_amagic;
+ result = &PL_vtbl_amagic;
break;
case want_vtbl_amagicelem:
- result = &vtbl_amagicelem;
+ result = &PL_vtbl_amagicelem;
+ break;
+ case want_vtbl_backref:
+ result = &PL_vtbl_backref;
break;
}
return result;
}
+I32
+Perl_my_fflush_all(pTHX)
+{
+#ifdef FFLUSH_NULL
+ return PerlIO_flush(NULL);
+#else
+ long open_max = -1;
+# if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
+# ifdef PERL_FFLUSH_ALL_FOPEN_MAX
+ open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
+# else
+# if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
+ open_max = sysconf(_SC_OPEN_MAX);
+# else
+# ifdef FOPEN_MAX
+ open_max = FOPEN_MAX;
+# else
+# ifdef OPEN_MAX
+ open_max = OPEN_MAX;
+# else
+# ifdef _NFILE
+ open_max = _NFILE;
+# endif
+# endif
+# endif
+# endif
+# endif
+ if (open_max > 0) {
+ long i;
+ for (i = 0; i < open_max; i++)
+ if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
+ STDIO_STREAM_ARRAY[i]._file < open_max &&
+ STDIO_STREAM_ARRAY[i]._flag)
+ PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
+ return 0;
+ }
+# endif
+ SETERRNO(EBADF,RMS$_IFI);
+ return EOF;
+#endif
+}
+
+NV
+Perl_my_atof(pTHX_ const char* s)
+{
+#ifdef USE_LOCALE_NUMERIC
+ if ((PL_hints & HINT_LOCALE) && PL_numeric_local) {
+ NV x, y;
+
+ x = Perl_atof(s);
+ SET_NUMERIC_STANDARD();
+ y = Perl_atof(s);
+ SET_NUMERIC_LOCAL();
+ if ((y < 0.0 && y < x) || (y > 0.0 && y > x))
+ return y;
+ return x;
+ }
+ else
+ return Perl_atof(s);
+#else
+ return Perl_atof(s);
+#endif
+}
+
+void
+Perl_report_closed_fh(pTHX_ GV *gv, IO *io, const char *func, const char *obj)
+{
+ SV *sv;
+ char *name;
+
+ assert(gv);
+
+ sv = sv_newmortal();
+ gv_efullname3(sv, gv, Nullch);
+ name = SvPVX(sv);
+
+ Perl_warner(aTHX_ WARN_CLOSED, "%s() on closed %s %s", func, obj, name);
+
+ if (io && IoDIRP(io))
+ Perl_warner(aTHX_ WARN_CLOSED,
+ "\t(Are you trying to call %s() on dirhandle %s?)\n",
+ func, name);
+}
diff --git a/contrib/perl5/util.h b/contrib/perl5/util.h
index 3082a20..beb5215 100644
--- a/contrib/perl5/util.h
+++ b/contrib/perl5/util.h
@@ -1,8 +1,32 @@
/* util.h
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*
*/
+
+#ifdef VMS
+# define PERL_FILE_IS_ABSOLUTE(f) \
+ (*(f) == '/' \
+ || (strchr(f,':') \
+ || ((*(f) == '[' || *(f) == '<') \
+ && (isALNUM((f)[1]) || strchr("$-_]>",(f)[1])))))
+
+#else /* !VMS */
+# ifdef WIN32
+# define PERL_FILE_IS_ABSOLUTE(f) \
+ (*(f) == '/' \
+ || ((f)[0] && (f)[1] == ':') /* drive name */ \
+ || ((f)[0] == '\\' && (f)[1] == '\\')) /* UNC path */
+# else /* !WIN32 */
+# ifdef DOSISH
+# define PERL_FILE_IS_ABSOLUTE(f) \
+ (*(f) == '/' \
+ || ((f)[0] && (f)[1] == ':')) /* drive name */
+# else /* !DOSISH */
+# define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
+# endif /* DOSISH */
+# endif /* WIN32 */
+#endif /* VMS */
diff --git a/contrib/perl5/utils/Makefile b/contrib/perl5/utils/Makefile
index 2df16d8..944cbe8 100644
--- a/contrib/perl5/utils/Makefile
+++ b/contrib/perl5/utils/Makefile
@@ -5,14 +5,14 @@ REALPERL = ../perl
# Files to be built with variable substitution after miniperl is
# available. Dependencies handled manually below (for now).
-pl = c2ph.PL h2ph.PL h2xs.PL perlbug.PL perldoc.PL pl2pm.PL splain.PL perlcc.PL
-plextract = c2ph h2ph h2xs perlbug perldoc pl2pm splain perlcc
-plextractexe = c2ph.exe h2ph.exe h2xs.exe perlbug.exe perldoc.exe pl2pm.exe splain.exe perlcc.exe
+pl = c2ph.PL h2ph.PL h2xs.PL perlbug.PL perldoc.PL pl2pm.PL splain.PL perlcc.PL dprofpp.PL
+plextract = c2ph h2ph h2xs perlbug perldoc pl2pm splain perlcc dprofpp
+plextractexe = c2ph.exe h2ph.exe h2xs.exe perlbug.exe perldoc.exe pl2pm.exe splain.exe perlcc.exe dprofpp.exe
all: $(plextract)
compile: all
- $(REALPERL) -I../lib perlcc -regex 's/$$/.exe/' $(plextract) -prog -verbose dcf -log ../compilelog;
+ $(REALPERL) -I../lib perlcc -opt -regex 's/$$/.exe/' $(plextract) -prog -verbose dcf -log ../compilelog;
$(plextract):
$(PERL) -I../lib $@.PL
@@ -31,12 +31,15 @@ pl2pm: pl2pm.PL ../config.sh
splain: splain.PL ../config.sh ../lib/diagnostics.pm
-perlcc: perlcc.PL ../config.sh
+perlcc: perlcc.PL ../config.sh
+
+dprofpp: dprofpp.PL ../config.sh
clean:
realclean:
rm -rf $(plextract) pstruct $(plextractexe)
+ rm -f ../t/_h2ph_pre.ph
clobber: realclean
diff --git a/contrib/perl5/utils/dprofpp.PL b/contrib/perl5/utils/dprofpp.PL
new file mode 100644
index 0000000..51e8d78
--- /dev/null
+++ b/contrib/perl5/utils/dprofpp.PL
@@ -0,0 +1,838 @@
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+
+# List explicitly here the variables you want Configure to
+# generate. Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries. Thus you write
+# $startperl
+# to ensure Configure will look for $Config{startperl}.
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$// if ($Config{'osname'} eq 'OS2'); # "case-forgiving"
+$file =~ s/\.pl$/.com/ if ($Config{'osname'} eq 'VMS'); # "case-forgiving"
+
+my $dprof_pm = '../ext/Devel/DProf/DProf.pm';
+my $VERSION = 0;
+open( PM, "<$dprof_pm" ) || die "Can't open $dprof_pm: $!";
+while(<PM>){
+ if( /^\$Devel::DProf::VERSION\s*=\s*'([\d._]+)'/ ){
+ $VERSION = $1;
+ last;
+ }
+}
+close PM;
+if( $VERSION == 0 ){
+ die "Did not find VERSION in $dprof_pm";
+}
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'}
+ eval 'exec perl -S \$0 "\$@"'
+ if 0;
+
+require 5.003;
+
+my \$VERSION = '$VERSION';
+
+!GROK!THIS!
+
+# In the following, perl variables are not expanded during extraction.
+
+print OUT <<'!NO!SUBS!';
+=head1 NAME
+
+dprofpp - display perl profile data
+
+=head1 SYNOPSIS
+
+dprofpp [B<-a>|B<-z>|B<-l>|B<-v>|B<-U>] [B<-s>|B<-r>|B<-u>] [B<-q>] [B<-F>] [B<-I|-E>] [B<-O cnt>] [B<-A>] [B<-R>] [B<-S>] [B<-g subroutine>] [profile]
+
+dprofpp B<-T> [B<-F>] [B<-g subroutine>] [profile]
+
+dprofpp B<-t> [B<-F>] [B<-g subroutine>] [profile]
+
+dprofpp B<-p script> [B<-Q>] [other opts]
+
+dprofpp B<-V> [profile]
+
+=head1 DESCRIPTION
+
+The I<dprofpp> command interprets profile data produced by a profiler, such
+as the Devel::DProf profiler. Dprofpp will read the file F<tmon.out> and
+will display the 15 subroutines which are using the most time. By default
+the times for each subroutine are given exclusive of the times of their
+child subroutines.
+
+To profile a Perl script run the perl interpreter with the B<-d> switch. So
+to profile script F<test.pl> with Devel::DProf the following command should
+be used.
+
+ $ perl5 -d:DProf test.pl
+
+Then run dprofpp to analyze the profile. The output of dprofpp depends
+on the flags to the program and the version of Perl you're using.
+
+ $ dprofpp -u
+ Total Elapsed Time = 1.67 Seconds
+ User Time = 0.61 Seconds
+ Exclusive Times
+ %Time Seconds #Calls sec/call Name
+ 52.4 0.320 2 0.1600 main::foo
+ 45.9 0.280 200 0.0014 main::bar
+ 0.00 0.000 1 0.0000 DynaLoader::import
+ 0.00 0.000 1 0.0000 main::baz
+
+The dprofpp tool can also run the profiler before analyzing the profile
+data. The above two commands can be executed with one dprofpp command.
+
+ $ dprofpp -u -p test.pl
+
+Consult L<Devel::DProf/"PROFILE FORMAT"> for a description of the raw profile.
+
+=head1 OUTPUT
+
+Columns are:
+
+=over 4
+
+=item %Time
+
+Percentage of time spent in this routine.
+
+=item #Calls
+
+Number of calls to this routine.
+
+=item sec/call
+
+Average number of seconds per call to this routine.
+
+=item Name
+
+Name of routine.
+
+=item CumulS
+
+Time (in seconds) spent in this routine and routines called from it.
+
+=item ExclSec
+
+Time (in seconds) spent in this routine (not including those called
+from it).
+
+=item Csec/c
+
+Average time (in seconds) spent in each call of this routine
+(including those called from it).
+
+=back
+
+=head1 OPTIONS
+
+=over 5
+
+=item B<-a>
+
+Sort alphabetically by subroutine names.
+
+=item B<-A>
+
+Count timing for autoloaded subroutine as timing for C<*::AUTOLOAD>.
+Otherwise the time to autoload it is counted as time of the subroutine
+itself (there is no way to separate autoload time from run time).
+
+This is going to be irrelevant with newer Perls. They will inform
+C<Devel::DProf> I<when> the C<AUTOLOAD> switches to actual subroutine,
+so a separate statistics for C<AUTOLOAD> will be collected no matter
+whether this option is set.
+
+=item B<-R>
+
+Count anonymous subroutines defined in the same package separately.
+
+=item B<-E>
+
+(default) Display all subroutine times exclusive of child subroutine times.
+
+=item B<-F>
+
+Force the generation of fake exit timestamps if dprofpp reports that the
+profile is garbled. This is only useful if dprofpp determines that the
+profile is garbled due to missing exit timestamps. You're on your own if
+you do this. Consult the BUGS section.
+
+=item B<-I>
+
+Display all subroutine times inclusive of child subroutine times.
+
+=item B<-l>
+
+Sort by number of calls to the subroutines. This may help identify
+candidates for inlining.
+
+=item B<-O cnt>
+
+Show only I<cnt> subroutines. The default is 15.
+
+=item B<-p script>
+
+Tells dprofpp that it should profile the given script and then interpret its
+profile data. See B<-Q>.
+
+=item B<-Q>
+
+Used with B<-p> to tell dprofpp to quit after profiling the script, without
+interpreting the data.
+
+=item B<-q>
+
+Do not display column headers.
+
+=item B<-r>
+
+Display elapsed real times rather than user+system times.
+
+=item B<-s>
+
+Display system times rather than user+system times.
+
+=item B<-T>
+
+Display subroutine call tree to stdout. Subroutine statistics are
+not displayed.
+
+=item B<-t>
+
+Display subroutine call tree to stdout. Subroutine statistics are not
+displayed. When a function is called multiple consecutive times at the same
+calling level then it is displayed once with a repeat count.
+
+=item B<-S>
+
+Display I<merged> subroutine call tree to stdout. Statistics is
+displayed for each branch of the tree.
+
+When a function is called multiple (I<not necessarily consecutive>)
+times in the same branch then all these calls go into one branch of
+the next level. A repeat count is output together with combined
+inclusive, exclusive and kids time.
+
+Branches are sorted w.r.t. inclusive time.
+
+=item B<-U>
+
+Do not sort. Display in the order found in the raw profile.
+
+=item B<-u>
+
+Display user times rather than user+system times.
+
+=item B<-V>
+
+Print dprofpp's version number and exit. If a raw profile is found then its
+XS_VERSION variable will be displayed, too.
+
+=item B<-v>
+
+Sort by average time spent in subroutines during each call. This may help
+identify candidates for inlining.
+
+=item B<-z>
+
+(default) Sort by amount of user+system time used. The first few lines
+should show you which subroutines are using the most time.
+
+=item B<-g> C<subroutine>
+
+Ignore subroutines except C<subroutine> and whatever is called from it.
+
+=back
+
+=head1 ENVIRONMENT
+
+The environment variable B<DPROFPP_OPTS> can be set to a string containing
+options for dprofpp. You might use this if you prefer B<-I> over B<-E> or
+if you want B<-F> on all the time.
+
+This was added fairly lazily, so there are some undesirable side effects.
+Options on the commandline should override options in DPROFPP_OPTS--but
+don't count on that in this version.
+
+=head1 BUGS
+
+Applications which call _exit() or exec() from within a subroutine
+will leave an incomplete profile. See the B<-F> option.
+
+Any bugs in Devel::DProf, or any profiler generating the profile data, could
+be visible here. See L<Devel::DProf/BUGS>.
+
+Mail bug reports and feature requests to the perl5-porters mailing list at
+F<E<lt>perl5-porters@perl.orgE<gt>>. Bug reports should include the
+output of the B<-V> option.
+
+=head1 FILES
+
+ dprofpp - profile processor
+ tmon.out - raw profile
+
+=head1 SEE ALSO
+
+L<perl>, L<Devel::DProf>, times(2)
+
+=cut
+
+use Getopt::Std 'getopts';
+use Config '%Config';
+
+Setup: {
+ my $options = 'O:g:lzaAvuTtqrRsUFEIp:QVS';
+
+ $Monfile = 'tmon.out';
+ if( exists $ENV{DPROFPP_OPTS} ){
+ my @tmpargv = @ARGV;
+ @ARGV = split( ' ', $ENV{DPROFPP_OPTS} );
+ getopts( $options );
+ if( @ARGV ){
+ # there was a filename.
+ $Monfile = shift;
+ }
+ @ARGV = @tmpargv;
+ }
+
+ getopts( $options );
+ if( @ARGV ){
+ # there was a filename, it overrides any earlier name.
+ $Monfile = shift;
+ }
+
+# -O cnt Specifies maximum number of subroutines to display.
+# -a Sort by alphabetic name of subroutines.
+# -z Sort by user+system time spent in subroutines. (default)
+# -l Sort by number of calls to subroutines.
+# -v Sort by average amount of time spent in subroutines.
+# -T Show call tree.
+# -t Show call tree, compressed.
+# -q Do not print column headers.
+# -u Use user time rather than user+system time.
+# -s Use system time rather than user+system time.
+# -r Use real elapsed time rather than user+system time.
+# -U Do not sort subroutines.
+# -E Sub times are reported exclusive of child times. (default)
+# -I Sub times are reported inclusive of child times.
+# -V Print dprofpp's version.
+# -p script Specifies name of script to be profiled.
+# -Q Used with -p to indicate the dprofpp should quit after
+# profiling the script, without interpreting the data.
+# -A count autoloaded to *AUTOLOAD
+# -R count anonyms separately even if from the same package
+# -g subr count only those who are SUBR or called from SUBR
+# -S Create statistics for all the depths
+
+ if( defined $opt_V ){
+ my $fh = 'main::fh';
+ print "$0 version: $VERSION\n";
+ open( $fh, "<$Monfile" ) && do {
+ local $XS_VERSION = 'early';
+ header($fh);
+ close( $fh );
+ print "XS_VERSION: $XS_VERSION\n";
+ };
+ exit(0);
+ }
+ $cnt = $opt_O || 15;
+ $sort = 'by_time';
+ $sort = 'by_ctime' if defined $opt_I;
+ $sort = 'by_calls' if defined $opt_l;
+ $sort = 'by_alpha' if defined $opt_a;
+ $sort = 'by_avgcpu' if defined $opt_v;
+ $incl_excl = 'Exclusive';
+ $incl_excl = 'Inclusive' if defined $opt_I;
+ $whichtime = 'User+System';
+ $whichtime = 'System' if defined $opt_s;
+ $whichtime = 'Real' if defined $opt_r;
+ $whichtime = 'User' if defined $opt_u;
+
+ if( defined $opt_p ){
+ my $prof = 'DProf';
+ my $startperl = $Config{'startperl'};
+
+ $startperl =~ s/^#!//; # remove shebang
+ run_profiler( $opt_p, $prof, $startperl );
+ $Monfile = 'tmon.out'; # because that's where it is
+ exit(0) if defined $opt_Q;
+ }
+ elsif( defined $opt_Q ){
+ die "-Q is meaningful only when used with -p\n";
+ }
+}
+
+Main: {
+ my $monout = $Monfile;
+ my $fh = 'main::fh';
+ local $names = {};
+ local $times = {}; # times in hz
+ local $ctimes = {}; # Cumulative times in hz
+ local $calls = {};
+ local $persecs = {}; # times in seconds
+ local $idkeys = [];
+ local $runtime; # runtime in seconds
+ my @a = ();
+ my $a;
+ local $rrun_utime = 0; # user time in hz
+ local $rrun_stime = 0; # system time in hz
+ local $rrun_rtime = 0; # elapsed run time in hz
+ local $rrun_ustime = 0; # user+system time in hz
+ local $hz = 0;
+ local $deep_times = {count => 0 , kids => {}, incl_time => 0};
+ local $time_precision = 2;
+ local $overhead = 0;
+
+ open( $fh, "<$monout" ) || die "Unable to open $monout\n";
+
+ header($fh);
+
+ $rrun_ustime = $rrun_utime + $rrun_stime;
+
+ $~ = 'STAT';
+ if( ! $opt_q ){
+ $^ = 'CSTAT_top';
+ }
+
+ parsestack( $fh, $names, $calls, $times, $ctimes, $idkeys );
+
+ settime( \$runtime, $hz ) unless $opt_g;
+
+ exit(0) if $opt_T || $opt_t;
+
+ if( $opt_v ){
+ percalc( $calls, ($opt_I ? $ctimes : $times), $persecs, $idkeys );
+ }
+ if( ! $opt_U ){
+ @a = sort $sort @$idkeys;
+ $a = \@a;
+ }
+ else {
+ $a = $idkeys;
+ }
+ display( $runtime, $hz, $names, $calls, $times, $ctimes, $cnt, $a,
+ $deep_times);
+}
+
+
+# Sets $runtime to user, system, real, or user+system time. The
+# result is given in seconds.
+#
+sub settime {
+ my( $runtime, $hz ) = @_;
+
+ $hz ||= 1;
+
+ if( $opt_r ){
+ $$runtime = ($rrun_rtime - $overhead - $over_rtime * $total_marks/$over_tests/2)/$hz;
+ }
+ elsif( $opt_s ){
+ $$runtime = ($rrun_stime - $overhead - $over_stime * $total_marks/$over_tests/2)/$hz;
+ }
+ elsif( $opt_u ){
+ $$runtime = ($rrun_utime - $overhead - $over_utime * $total_marks/$over_tests/2)/$hz;
+ }
+ else{
+ $$runtime = ($rrun_ustime - $overhead - ($over_utime + $over_stime) * $total_marks/$over_tests/2)/$hz;
+ }
+ $$runtime = 0 unless $$runtime > 0;
+}
+
+sub exclusives_in_tree {
+ my( $deep_times ) = @_;
+ my $kids_time = 0;
+ my $kid;
+ # When summing, take into account non-rounded-up kids time.
+ for $kid (keys %{$deep_times->{kids}}) {
+ $kids_time += $deep_times->{kids}{$kid}{incl_time};
+ }
+ $kids_time = 0 unless $kids_time >= 0;
+ $deep_times->{excl_time} = $deep_times->{incl_time} - $kids_time;
+ $deep_times->{excl_time} = 0 unless $deep_times->{excl_time} >= 0;
+ for $kid (keys %{$deep_times->{kids}}) {
+ exclusives_in_tree($deep_times->{kids}{$kid});
+ }
+ $deep_times->{incl_time} = 0 unless $deep_times->{incl_time} >= 0;
+ $deep_times->{kids_time} = $kids_time;
+}
+
+sub kids_by_incl { $kids{$b}{incl_time} <=> $kids{$a}{excl_time}
+ or $a cmp $b }
+
+sub display_tree {
+ my( $deep_times, $name, $level ) = @_;
+ exclusives_in_tree($deep_times);
+
+ my $kid;
+ local *kids = $deep_times->{kids}; # %kids
+
+ my $time;
+ if (%kids) {
+ $time = sprintf '%.*fs = (%.*f + %.*f)',
+ $time_precision, $deep_times->{incl_time}/$hz,
+ $time_precision, $deep_times->{excl_time}/$hz,
+ $time_precision, $deep_times->{kids_time}/$hz;
+ } else {
+ $time = sprintf '%.*f', $time_precision, $deep_times->{incl_time}/$hz;
+ }
+ print ' ' x (2*$level), "$name x $deep_times->{count} \t${time}s\n"
+ if $deep_times->{count};
+
+ for $kid (sort kids_by_incl keys %kids) {
+ display_tree( $deep_times->{kids}{$kid}, $kid, $level + 1 );
+ }
+}
+
+# Report the times in seconds.
+sub display {
+ my( $runtime, $hz, $names, $calls, $times, $ctimes, $cnt,
+ $idkeys, $deep_times ) = @_;
+ my( $x, $key, $s, $cs );
+ #format: $ncalls, $name, $secs, $percall, $pcnt
+
+ if ($opt_S) {
+ display_tree( $deep_times, 'toplevel', -1 )
+ } else {
+ for( $x = 0; $x < @$idkeys; ++$x ){
+ $key = $idkeys->[$x];
+ $ncalls = $calls->{$key};
+ $name = $names->{$key};
+ $s = $times->{$key}/$hz;
+ $secs = sprintf("%.3f", $s );
+ $cs = $ctimes->{$key}/$hz;
+ $csecs = sprintf("%.3f", $cs );
+ $percall = sprintf("%.4f", $s/$ncalls );
+ $cpercall = sprintf("%.4f", $cs/$ncalls );
+ $pcnt = sprintf("%.2f",
+ $runtime? ((($opt_I ? $csecs : $secs) / $runtime) * 100.0): 0 );
+ write;
+ $pcnt = $secs = $ncalls = $percall = "";
+ write while( length $name );
+ last unless --$cnt;
+ }
+ }
+}
+
+sub move_keys {
+ my ($source, $dest) = @_;
+ my $kid;
+
+ for $kid (keys %$source) {
+ if (exists $dest->{$kid}) {
+ $dest->{count} += $source->{count};
+ $dest->{incl_time} += $source->{incl_time};
+ move_keys($source->{kids},$dest->{kids});
+ } else {
+ $dest->{$kid} = delete $source->{$kid};
+ }
+ }
+}
+
+sub add_to_tree {
+ my ($curdeep_times, $name, $t) = @_;
+ if ($name ne $curdeep_times->[-1]{name} and $opt_A) {
+ $name = $curdeep_times->[-1]{name};
+ }
+ die "Shorted?!" unless @$curdeep_times >= 2;
+ $curdeep_times->[-2]{kids}{$name} = { count => 0 , kids => {},
+ incl_time => 0,
+ }
+ unless exists $curdeep_times->[-2]{kids}{$name};
+ my $entry = $curdeep_times->[-2]{kids}{$name};
+ # Now transfer to the new node (could not do earlier, since name can change)
+ $entry->{count}++;
+ $entry->{incl_time} += $t - $curdeep_times->[-1]{enter_stamp};
+ # Merge the kids?
+ move_keys($curdeep_times->[-1]->{kids},$entry->{kids});
+ pop @$curdeep_times;
+}
+
+sub parsestack {
+ my( $fh, $names, $calls, $times, $ctimes, $idkeys ) = @_;
+ my( $dir, $name );
+ my( $t, $syst, $realt, $usert );
+ my( $x, $z, $c, $id, $pack );
+ my @stack = ();
+ my @tstack = ();
+ my $tab = 3;
+ my $in = 0;
+
+ # remember last call depth and function name
+ my $l_in = $in;
+ my $l_name = '';
+ my $repcnt = 0;
+ my $repstr = '';
+ my $dprof_t = 0;
+ my $dprof_stamp;
+ my %cv_hash;
+ my $in_level = not defined $opt_g; # Level deep in report grouping
+ my $curdeep_times = [$deep_times];
+
+ my $over_per_call;
+ if ( $opt_u ) { $over_per_call = $over_utime }
+ elsif( $opt_s ) { $over_per_call = $over_stime }
+ elsif( $opt_r ) { $over_per_call = $over_rtime }
+ else { $over_per_call = $over_utime + $over_stime }
+ $over_per_call /= 2*$over_tests; # distribute over entry and exit
+
+ while(<$fh>){
+ next if /^#/;
+ last if /^PART/;
+
+ chop;
+ if (/^&/) {
+ ($dir, $id, $pack, $name) = split;
+ if ($opt_R and ($name =~ /::(__ANON_|END)$/)) {
+ $name .= "($id)";
+ }
+ $cv_hash{$id} = "$pack\::$name";
+ next;
+ }
+ ($dir, $usert, $syst, $realt, $name) = split;
+
+ my $ot = $t;
+ if ( $dir eq '/' ) {
+ $syst = $stack[-1][0];
+ $usert = '&';
+ $dir = '-';
+ #warn("Inserted exit for $stack[-1][0].\n")
+ }
+ if (defined $realt) { # '+ times nam' '- times nam' or '@ incr'
+ if ( $opt_u ) { $t = $usert }
+ elsif( $opt_s ) { $t = $syst }
+ elsif( $opt_r ) { $t = $realt }
+ else { $t = $usert + $syst }
+ $t += $ot, next if $dir eq '@'; # Increments there
+ } else {
+ # "- id" or "- & name"
+ $name = defined $syst ? $syst : $cv_hash{$usert};
+ }
+
+ next unless $in_level or $name eq $opt_g or $dir eq '*';
+ if ( $dir eq '-' or $dir eq '*' ) {
+ my $ename = $dir eq '*' ? $stack[-1][0] : $name;
+ $overhead += $over_per_call;
+ if ($name eq "Devel::DProf::write") {
+ $dprof_t += $t - $dprof_stamp;
+ next;
+ } elsif (defined $opt_g and $ename eq $opt_g) {
+ $in_level--;
+ }
+ add_to_tree($curdeep_times, $ename,
+ $t - $dprof_t - $overhead) if $opt_S;
+ exitstamp( \@stack, \@tstack,
+ $t - $dprof_t - $overhead,
+ $times, $ctimes, $ename, \$in, $tab,
+ $curdeep_times );
+ }
+ next unless $in_level or $name eq $opt_g;
+ if( $dir eq '+' or $dir eq '*' ){
+ if ($name eq "Devel::DProf::write") {
+ $dprof_stamp = $t;
+ next;
+ } elsif (defined $opt_g and $name eq $opt_g) {
+ $in_level++;
+ }
+ $overhead += $over_per_call;
+ if( $opt_T ){
+ print ' ' x $in, "$name\n";
+ $in += $tab;
+ }
+ elsif( $opt_t ){
+ # suppress output on same function if the
+ # same calling level is called.
+ if ($l_in == $in and $l_name eq $name) {
+ $repcnt++;
+ } else {
+ $repstr = ' ('.++$repcnt.'x)'
+ if $repcnt;
+ print ' ' x $l_in, "$l_name$repstr\n"
+ if $l_name ne '';
+ $repstr = '';
+ $repcnt = 0;
+ $l_in = $in;
+ $l_name = $name;
+ }
+ $in += $tab;
+ }
+ if( ! defined $names->{$name} ){
+ $names->{$name} = $name;
+ $times->{$name} = 0;
+ $ctimes->{$name} = 0;
+ push( @$idkeys, $name );
+ }
+ $calls->{$name}++;
+ push @$curdeep_times, { kids => {},
+ name => $name,
+ enter_stamp => $t - $dprof_t - $overhead,
+ } if $opt_S;
+ $x = [ $name, $t - $dprof_t - $overhead ];
+ push( @stack, $x );
+
+ # my children will put their time here
+ push( @tstack, 0 );
+ } elsif ($dir ne '-'){
+ die "Bad profile: $_";
+ }
+ }
+ if( $opt_t ){
+ $repstr = ' ('.++$repcnt.'x)' if $repcnt;
+ print ' ' x $l_in, "$l_name$repstr\n";
+ }
+
+ if( @stack ){
+ if( ! $opt_F ){
+ warn "Garbled profile is missing some exit time stamps:\n";
+ foreach $x (@stack) {
+ print $x->[0],"\n";
+ }
+ die "Try rerunning dprofpp with -F.\n";
+ # I don't want -F to be default behavior--yet
+ # 9/18/95 dmr
+ }
+ else{
+ warn( "Faking " . scalar( @stack ) . " exit timestamp(s).\n");
+ foreach $x ( reverse @stack ){
+ $name = $x->[0];
+ exitstamp( \@stack, \@tstack,
+ $t - $dprof_t - $overhead, $times,
+ $ctimes, $name, \$in, $tab,
+ $curdeep_times );
+ add_to_tree($curdeep_times, $name,
+ $t - $dprof_t - $overhead)
+ if $opt_S;
+ }
+ }
+ }
+ if (defined $opt_g) {
+ $runtime = $ctimes->{$opt_g}/$hz;
+ $runtime = 0 unless $runtime > 0;
+ }
+}
+
+sub exitstamp {
+ my($stack, $tstack, $t, $times, $ctimes, $name, $in, $tab, $deep) = @_;
+ my( $x, $c, $z );
+
+ $x = pop( @$stack );
+ if( ! defined $x ){
+ die "Garbled profile, missing an enter time stamp";
+ }
+ if( $x->[0] ne $name ){
+ if ($x->[0] =~ /::AUTOLOAD$/) {
+ if ($opt_A) {
+ $name = $x->[0];
+ }
+ } elsif ( $opt_F ) {
+ warn( "Garbled profile, faking exit timestamp:\n\t$name => $x->[0].\n");
+ $name = $x->[0];
+ } else {
+ foreach $z (@stack, $x) {
+ print $z->[0],"\n";
+ }
+ die "Garbled profile, unexpected exit time stamp";
+ }
+ }
+ if( $opt_T || $opt_t ){
+ $$in -= $tab;
+ }
+ # collect childtime
+ $c = pop( @$tstack );
+ # total time this func has been active
+ $z = $t - $x->[1];
+ $ctimes->{$name} += $z;
+ $times->{$name} += ($z > $c)? $z - $c: 0;
+ # pass my time to my parent
+ if( @$tstack ){
+ $c = pop( @$tstack );
+ push( @$tstack, $c + $z );
+ }
+}
+
+
+sub header {
+ my $fh = shift;
+ chop($_ = <$fh>);
+ if( ! /^#fOrTyTwO$/ ){
+ die "Not a perl profile";
+ }
+ while(<$fh>){
+ next if /^#/;
+ last if /^PART/;
+ eval;
+ }
+ $over_tests = 1 unless $over_tests;
+ $time_precision = length int ($hz - 1); # log ;-)
+}
+
+
+# Report avg time-per-function in seconds
+sub percalc {
+ my( $calls, $times, $persecs, $idkeys ) = @_;
+ my( $x, $t, $n, $key );
+
+ for( $x = 0; $x < @$idkeys; ++$x ){
+ $key = $idkeys->[$x];
+ $n = $calls->{$key};
+ $t = $times->{$key} / $hz;
+ $persecs->{$key} = $t ? $t / $n : 0;
+ }
+}
+
+
+# Runs the given script with the given profiler and the given perl.
+sub run_profiler {
+ my $script = shift;
+ my $profiler = shift;
+ my $startperl = shift;
+
+ system $startperl, "-d:$profiler", $script;
+ if( $? / 256 > 0 ){
+ die "Failed: $startperl -d:$profiler $script: $!";
+ }
+}
+
+
+sub by_time { $times->{$b} <=> $times->{$a} }
+sub by_ctime { $ctimes->{$b} <=> $ctimes->{$a} }
+sub by_calls { $calls->{$b} <=> $calls->{$a} }
+sub by_alpha { $names->{$a} cmp $names->{$b} }
+sub by_avgcpu { $persecs->{$b} <=> $persecs->{$a} }
+
+
+format CSTAT_top =
+Total Elapsed Time = @>>>>>>> Seconds
+(($rrun_rtime - $overhead - $over_rtime * $total_marks/$over_tests/2) / $hz)
+ @>>>>>>>>>> Time = @>>>>>>> Seconds
+$whichtime, $runtime
+@<<<<<<<< Times
+$incl_excl
+%Time ExclSec CumulS #Calls sec/call Csec/c Name
+.
+
+format STAT =
+ ^>>> ^>>>> ^>>>>> ^>>>>> ^>>>>> ^>>>>> ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+$pcnt, $secs, $csecs, $ncalls, $percall, $cpercall, $name
+.
+
+!NO!SUBS!
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
diff --git a/contrib/perl5/utils/h2ph.PL b/contrib/perl5/utils/h2ph.PL
index 6011d98..0b0208b 100644
--- a/contrib/perl5/utils/h2ph.PL
+++ b/contrib/perl5/utils/h2ph.PL
@@ -528,7 +528,7 @@ sub inc_dirs
sub build_preamble_if_necessary
{
# Increment $VERSION every time this function is modified:
- my $VERSION = 1;
+ my $VERSION = 2;
my $preamble = "$Dest_dir/_h2ph_pre.ph";
# Can we skip building the preamble file?
@@ -556,6 +556,9 @@ sub build_preamble_if_necessary
if ($define{$_} =~ /^\d+$/) {
print PREAMBLE
"unless (defined &$_) { sub $_() { $define{$_} } }\n\n";
+ } elsif ($define{$_} =~ /^\w+$/) {
+ print PREAMBLE
+ "unless (defined &$_) { sub $_() { &$define{$_} } }\n\n";
} else {
print PREAMBLE
"unless (defined &$_) { sub $_() { \"",
@@ -576,8 +579,7 @@ sub _extract_cc_defines
# Split compiler pre-definitions into `key=value' pairs:
foreach (split /\s+/, $allsymbols) {
- /(.*?)=(.*)/;
- $define{$1} = $2;
+ /(.+?)=(.+)/ and $define{$1} = $2;
if ($opt_D) {
print STDERR "$_: $1 -> $2\n";
diff --git a/contrib/perl5/utils/h2xs.PL b/contrib/perl5/utils/h2xs.PL
index 129b01b..ca0e7cb 100644
--- a/contrib/perl5/utils/h2xs.PL
+++ b/contrib/perl5/utils/h2xs.PL
@@ -41,7 +41,7 @@ h2xs - convert .h C header files to Perl extensions
=head1 SYNOPSIS
-B<h2xs> [B<-AOPXcdf>] [B<-v> version] [B<-n> module_name] [B<-p> prefix] [B<-s> sub] [headerfile ... [extra_libraries]]
+B<h2xs> [B<-ACOPXcdf>] [B<-v> version] [B<-n> module_name] [B<-p> prefix] [B<-s> sub] [headerfile ... [extra_libraries]]
B<h2xs> B<-h>
@@ -71,12 +71,21 @@ in the extra-libraries argument.
=item B<-A>
Omit all autoload facilities. This is the same as B<-c> but also removes the
-S<C<require AutoLoader>> statement from the .pm file.
+S<C<use AutoLoader>> statement from the .pm file.
+
+=item B<-C>
+
+Omits creation of the F<Changes> file, and adds a HISTORY section to
+the POD template.
=item B<-F>
Additional flags to specify to C preprocessor when scanning header for
-function declarations. Should not be used without B<-x>.
+function declarations. Should not be used without B<-x>.
+
+=item B<-M> I<regular expression>
+
+selects functions/macros to process.
=item B<-O>
@@ -89,7 +98,21 @@ Omit the autogenerated stub POD section.
=item B<-X>
Omit the XS portion. Used to generate templates for a module which is not
-XS-based.
+XS-based. C<-c> and C<-f> are implicitly enabled.
+
+=item B<-a>
+
+Generate an accessor method for each element of structs and unions. The
+generated methods are named after the element name; will return the current
+value of the element if called without additional arguments; and will set
+the element to the supplied value (and return the new value) if called with
+an additional argument. Embedded structures and unions are returned as a
+pointer rather than the complete structure, to facilitate chained calls.
+
+These methods all apply to the Ptr type for the structure; additionally
+two methods are constructed for the structure type itself, C<_to_ptr>
+which returns a Ptr type pointing to the same structure, and a C<new>
+method to construct and return a new structure, initialised to zeroes.
=item B<-c>
@@ -103,21 +126,46 @@ Turn on debugging messages.
=item B<-f>
Allows an extension to be created for a header even if that header is
-not found in /usr/include.
+not found in standard include directories.
=item B<-h>
Print the usage, help and version for this h2xs and exit.
+=item B<-k>
+
+For function arguments declared as C<const>, omit the const attribute in the
+generated XS code.
+
+=item B<-m>
+
+B<Experimental>: for each variable declared in the header file(s), declare
+a perl variable of the same name magically tied to the C variable.
+
=item B<-n> I<module_name>
Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
+=item B<-o> I<regular expression>
+
+Use "opaque" data type for the C types matched by the regular
+expression, even if these types are C<typedef>-equivalent to types
+from typemaps. Should not be used without B<-x>.
+
+This may be useful since, say, types which are C<typedef>-equivalent
+to integers may represent OS-related handles, and one may want to work
+with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
+Use C<-o .> if you want to handle all the C<typedef>ed types as opaque types.
+
+The type-to-match is whitewashed (except for commas, which have no
+whitespace before them, and multiple C<*> which have no whitespace
+between them).
+
=item B<-p> I<prefix>
Specify a prefix which should be removed from the Perl function names, e.g., S<-p sec_rgy_>
This sets up the XS B<PREFIX> keyword and removes the prefix from functions that are
-autoloaded via the C<constant()> mechansim.
+autoloaded via the C<constant()> mechanism.
=item B<-s> I<sub1,sub2>
@@ -140,7 +188,8 @@ but XSUBs are emitted only for the declarations included from file NAME2.
Note that some types of arguments/return-values for functions may
result in XSUB-declarations/typemap-entries which need
hand-editing. Such may be objects which cannot be converted from/to a
-pointer (like C<long long>), pointers to functions, or arrays.
+pointer (like C<long long>), pointers to functions, or arrays. See
+also the section on L<LIMITATIONS of B<-x>>.
=back
@@ -193,6 +242,12 @@ pointer (like C<long long>), pointers to functions, or arrays.
# Same with function declaration in proto.h as visible from perl.h.
h2xs -xAn perl2 perl.h,proto.h
+ # Same but select only functions which match /^av_/
+ h2xs -M '^av_' -xAn perl2 perl.h,proto.h
+
+ # Same but treat SV* etc as "opaque" types
+ h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
+
=head1 ENVIRONMENT
No environment variables are used.
@@ -209,27 +264,97 @@ L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
The usual warnings if it cannot read or write the files involved.
+=head1 LIMITATIONS of B<-x>
+
+F<h2xs> would not distinguish whether an argument to a C function
+which is of the form, say, C<int *>, is an input, output, or
+input/output parameter. In particular, argument declarations of the
+form
+
+ int
+ foo(n)
+ int *n
+
+should be better rewritten as
+
+ int
+ foo(n)
+ int &n
+
+if C<n> is an input parameter.
+
+Additionally, F<h2xs> has no facilities to intuit that a function
+
+ int
+ foo(addr,l)
+ char *addr
+ int l
+
+takes a pair of address and length of data at this address, so it is better
+to rewrite this function as
+
+ int
+ foo(sv)
+ SV *addr
+ PREINIT:
+ STRLEN len;
+ char *s;
+ CODE:
+ s = SvPV(sv,len);
+ RETVAL = foo(s, len);
+ OUTPUT:
+ RETVAL
+
+or alternately
+
+ static int
+ my_foo(SV *sv)
+ {
+ STRLEN len;
+ char *s = SvPV(sv,len);
+
+ return foo(s, len);
+ }
+
+ MODULE = foo PACKAGE = foo PREFIX = my_
+
+ int
+ foo(sv)
+ SV *sv
+
+See L<perlxs> and L<perlxstut> for additional details.
+
=cut
-my( $H2XS_VERSION ) = ' $Revision: 1.19 $ ' =~ /\$Revision:\s+([^\s]+)/;
+use strict;
+
+
+my( $H2XS_VERSION ) = ' $Revision: 1.20 $ ' =~ /\$Revision:\s+([^\s]+)/;
my $TEMPLATE_VERSION = '0.01';
+my @ARGS = @ARGV;
use Getopt::Std;
sub usage{
warn "@_\n" if @_;
- die "h2xs [-AOPXcdfh] [-v version] [-n module_name] [-p prefix] [-s subs] [headerfile [extra_libraries]]
+ die "h2xs [-ACOPXcdfh] [-v version] [-n module_name] [-p prefix] [-s subs] [headerfile [extra_libraries]]
version: $H2XS_VERSION
-A Omit all autoloading facilities (implies -c).
+ -C Omit creating the Changes file, add HISTORY heading to stub POD.
-F Additional flags for C preprocessor (used with -x).
+ -M Mask to select C functions/macros (default is select all).
-O Allow overwriting of a pre-existing extension directory.
-P Omit the stub POD section.
- -X Omit the XS portion.
+ -X Omit the XS portion (implies both -c and -f).
+ -a Generate get/set accessors for struct and union members (used with -x).
-c Omit the constant() function and specialised AUTOLOAD from the XS file.
-d Turn on debugging messages.
-f Force creation of the extension even if the C header does not exist.
-h Display this help message
+ -k Omit 'const' attribute on function arguments (used with -x).
+ -m Generate tied variables for access to declared variables.
-n Specify a name to use for the extension (recommended).
+ -o Regular expression for \"opaque\" types.
-p Specify a prefix which should be removed from the Perl function names.
-s Create subroutines for specified macros.
-v Specify a version number for this extension.
@@ -241,15 +366,25 @@ extra_libraries
}
-getopts("AF:OPXcdfhn:p:s:v:x") || usage;
+getopts("ACF:M:OPXacdfhkmn:o:p:s:v:x") || usage;
+use vars qw($opt_A $opt_C $opt_F $opt_M $opt_O $opt_P $opt_X $opt_a $opt_c $opt_d
+ $opt_f $opt_h $opt_k $opt_m $opt_n $opt_o $opt_p $opt_s $opt_v $opt_x);
usage if $opt_h;
if( $opt_v ){
$TEMPLATE_VERSION = $opt_v;
}
+
+# -A implies -c.
$opt_c = 1 if $opt_A;
-%const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
+
+# -X implies -c and -f
+$opt_c = $opt_f = 1 if $opt_X;
+
+my %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
+my $extralibs;
+my @path_h;
while (my $arg = shift) {
if ($arg =~ /^-l/i) {
@@ -262,34 +397,78 @@ while (my $arg = shift) {
usage "Must supply header file or module name\n"
unless (@path_h or $opt_n);
+my $fmask;
+my $tmask;
+
+$fmask = qr{$opt_M} if defined $opt_M;
+$tmask = qr{$opt_o} if defined $opt_o;
+my $tmask_all = $tmask && $opt_o eq '.';
+
+if ($opt_x) {
+ eval {require C::Scan; 1}
+ or die <<EOD;
+C::Scan required if you use -x option.
+To install C::Scan, execute
+ perl -MCPAN -e "install C::Scan"
+EOD
+ unless ($tmask_all) {
+ $C::Scan::VERSION >= 0.70
+ or die <<EOD;
+C::Scan v. 0.70 or later required unless you use -o . option.
+You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
+To install C::Scan, execute
+ perl -MCPAN -e "install C::Scan"
+EOD
+ }
+ if (($opt_m || $opt_a) && $C::Scan::VERSION < 0.73) {
+ die <<EOD;
+C::Scan v. 0.73 or later required to use -m or -a options.
+You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
+To install C::Scan, execute
+ perl -MCPAN -e "install C::Scan"
+EOD
+ }
+}
+elsif ($opt_o or $opt_F) {
+ warn <<EOD;
+Options -o and -F do not make sense without -x.
+EOD
+}
+
+my @path_h_ini = @path_h;
+my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
if( @path_h ){
+ use Config;
+ use File::Spec;
+ my @paths;
+ if ($^O eq 'VMS') { # Consider overrides of default location
+ # XXXX This is not equivalent to what the older version did:
+ # it was looking at $hadsys header-file per header-file...
+ my($hadsys) = grep s!^sys/!!i , @path_h;
+ @paths = qw( Sys$Library VAXC$Include );
+ push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
+ push @paths, qw( DECC$Library_Include DECC$System_Include );
+ }
+ else {
+ @paths = (File::Spec->curdir(), $Config{usrinc},
+ (split ' ', $Config{locincpth}), '/usr/include');
+ }
foreach my $path_h (@path_h) {
$name ||= $path_h;
if( $path_h =~ s#::#/#g && $opt_n ){
warn "Nesting of headerfile ignored with -n\n";
}
$path_h .= ".h" unless $path_h =~ /\.h$/;
- $fullpath = $path_h;
+ my $fullpath = $path_h;
$path_h =~ s/,.*$// if $opt_x;
- if ($^O eq 'VMS') { # Consider overrides of default location
- if ($path_h !~ m![:>\[]!) {
- my($hadsys) = ($path_h =~ s!^sys/!!i);
- if ($ENV{'DECC$System_Include'}) { $path_h = "DECC\$System_Include:$path_h"; }
- elsif ($ENV{'DECC$Library_Include'}) { $path_h = "DECC\$Library_Include:$path_h"; }
- elsif ($ENV{'GNU_CC_Include'}) { $path_h = 'GNU_CC_Include:' .
- ($hadsys ? '[vms]' : '[000000]') . $path_h; }
- elsif ($ENV{'VAXC$Include'}) { $path_h = "VAXC\$_Include:$path_h"; }
- else { $path_h = "Sys\$Library:$path_h"; }
- }
- }
- elsif ($^O eq 'os2') {
- $path_h = "/usr/include/$path_h"
- if $path_h !~ m#^([a-z]:)?[./]#i and -r "/usr/include/$path_h";
- }
- else {
- $path_h = "/usr/include/$path_h"
- if $path_h !~ m#^[./]# and -r "/usr/include/$path_h";
+ $fullpath{$path_h} = $fullpath;
+
+ if (not -f $path_h) {
+ my $tmp_path_h = $path_h;
+ for my $dir (@paths) {
+ last if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
+ }
}
if (!$opt_c) {
@@ -298,10 +477,24 @@ if( @path_h ){
# Record the names of simple #define constants into const_names
# Function prototypes are processed below.
open(CH, "<$path_h") || die "Can't open $path_h: $!\n";
+ defines:
while (<CH>) {
- if (/^#[ \t]*define\s+([\$\w]+)\b\s*[^("]/) {
- print "Matched $_ ($1)\n" if $opt_d;
- $_ = $1;
+ if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^" \t])(.*)/) {
+ my $def = $1;
+ my $rest = $2;
+ $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
+ $rest =~ s/^\s+//;
+ $rest =~ s/\s+$//;
+ # Cannot do: (-1) and ((LHANDLE)3) are OK:
+ #print("Skip non-wordy $def => $rest\n"),
+ # next defines if $rest =~ /[^\w\$]/;
+ if ($rest =~ /"/) {
+ print("Skip stringy $def => $rest\n") if $opt_d;
+ next defines;
+ }
+ print "Matched $_ ($def)\n" if $opt_d;
+ $seen_define{$def} = $rest;
+ $_ = $def;
next if /^_.*_h_*$/i; # special case, but for what?
if (defined $opt_p) {
if (!/^$opt_p(\d)/) {
@@ -311,17 +504,20 @@ if( @path_h ){
warn "can't remove $opt_p prefix from '$_'!\n";
}
}
- $const_names{$_}++;
+ $prefixless{$def} = $_;
+ if (!$fmask or /$fmask/) {
+ print "... Passes mask of -M.\n" if $opt_d and $fmask;
+ $const_names{$_}++;
+ }
}
}
close(CH);
}
}
- @const_names = sort keys %const_names;
}
-$module = $opt_n || do {
+my $module = $opt_n || do {
$name =~ s/\.h$//;
if( $name !~ /::/ ){
$name =~ s#^.*/##;
@@ -330,6 +526,7 @@ $module = $opt_n || do {
$name;
};
+my ($ext, $nested, @modparts, $modfname, $modpname);
(chdir 'ext', $ext = 'ext/') if -d 'ext';
if( $module =~ /::/ ){
@@ -347,11 +544,12 @@ else {
if ($opt_O) {
warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
-} else {
+}
+else {
die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
}
if( $nested ){
- $modpath = "";
+ my $modpath = "";
foreach (@modparts){
mkdir("$modpath$_", 0777);
$modpath .= "$_/";
@@ -362,36 +560,125 @@ chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
my %types_seen;
my %std_types;
-my $fdecls;
-my $fdecls_parsed;
+my $fdecls = [];
+my $fdecls_parsed = [];
+my $typedef_rex;
+my %typedefs_pre;
+my %known_fnames;
+my %structs;
+
+my @fnames;
+my @fnames_no_prefix;
+my %vdecl_hash;
+my @vdecls;
if( ! $opt_X ){ # use XS, unless it was disabled
open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
if ($opt_x) {
- require C::Scan; # Run-time directive
require Config; # Run-time directive
warn "Scanning typemaps...\n";
get_typemap();
- my $c;
- my $filter;
- my @fdecls;
- foreach my $filename (@path_h) {
+ my @td;
+ my @good_td;
my $addflags = $opt_F || '';
- if ($fullpath =~ /,/) {
- $filename = $`;
- $filter = $';
+
+ foreach my $filename (@path_h) {
+ my $c;
+ my $filter;
+
+ if ($fullpath{$filename} =~ /,/) {
+ $filename = $`;
+ $filter = $';
+ }
+ warn "Scanning $filename for functions...\n";
+ $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
+ 'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
+ $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
+
+ push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
+ push(@$fdecls, @{$c->get('fdecls')});
+
+ push @td, @{$c->get('typedefs_maybe')};
+ if ($opt_a) {
+ my $structs = $c->get('typedef_structs');
+ @structs{keys %$structs} = values %$structs;
+ }
+
+ if ($opt_m) {
+ %vdecl_hash = %{ $c->get('vdecl_hash') };
+ @vdecls = sort keys %vdecl_hash;
+ for (local $_ = 0; $_ < @vdecls; ++$_) {
+ my $var = $vdecls[$_];
+ my($type, $post) = @{ $vdecl_hash{$var} };
+ if (defined $post) {
+ warn "Can't handle variable '$type $var $post', skipping.\n";
+ splice @vdecls, $_, 1;
+ redo;
+ }
+ $type = normalize_type($type);
+ $vdecl_hash{$var} = $type;
+ }
+ }
+
+ unless ($tmask_all) {
+ warn "Scanning $filename for typedefs...\n";
+ my $td = $c->get('typedef_hash');
+ # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
+ my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
+ push @good_td, @f_good_td;
+ @typedefs_pre{@f_good_td} = map $_->[0], @$td{@f_good_td};
+ }
+ }
+ { local $" = '|';
+ $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
+ }
+ %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
+ if ($fmask) {
+ my @good;
+ for my $i (0..$#$fdecls_parsed) {
+ next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
+ push @good, $i;
+ print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
+ if $opt_d;
+ }
+ $fdecls = [@$fdecls[@good]];
+ $fdecls_parsed = [@$fdecls_parsed[@good]];
+ }
+ @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
+ # Sort declarations:
+ {
+ my %h = map( ($_->[1], $_), @$fdecls_parsed);
+ $fdecls_parsed = [ @h{@fnames} ];
+ }
+ @fnames_no_prefix = @fnames;
+ @fnames_no_prefix
+ = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix;
+ # Remove macros which expand to typedefs
+ print "Typedefs are @td.\n" if $opt_d;
+ my %td = map {($_, $_)} @td;
+ # Add some other possible but meaningless values for macros
+ for my $k (qw(char double float int long short unsigned signed void)) {
+ $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
+ }
+ # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
+ my $n = 0;
+ my %bad_macs;
+ while (keys %td > $n) {
+ $n = keys %td;
+ my ($k, $v);
+ while (($k, $v) = each %seen_define) {
+ # print("found '$k'=>'$v'\n"),
+ $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
+ }
+ }
+ # Now %bad_macs contains names of bad macros
+ for my $k (keys %bad_macs) {
+ delete $const_names{$prefixless{$k}};
+ print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
}
- warn "Scanning $filename for functions...\n";
- $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
- 'add_cppflags' => $addflags;
- $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
-
- $fdecls_parsed = $c->get('parsed_fdecls');
- push(@fdecls, @{$c->get('fdecls')});
- }
- $fdecls = [ @fdecls ];
}
}
+my @const_names = sort keys %const_names;
open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n";
@@ -401,21 +688,16 @@ warn "Writing $ext$modpname/$modfname.pm\n";
print PM <<"END";
package $module;
+require 5.005_62;
use strict;
+use warnings;
END
-if( $opt_X || $opt_c || $opt_A ){
- # we won't have our own AUTOLOAD(), so won't have $AUTOLOAD
- print PM <<'END';
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
-END
-}
-else{
+unless( $opt_X || $opt_c || $opt_A ){
# we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
# will want Carp.
print PM <<'END';
use Carp;
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD);
END
}
@@ -428,58 +710,50 @@ print PM <<"END" if ! $opt_X; # use DynaLoader, unless XS was disabled
require DynaLoader;
END
-# require autoloader if XS is disabled.
-# if XS is enabled, require autoloader unless autoloading is disabled.
-if( ($opt_X && (! $opt_A)) || (!$opt_X) ) {
- print PM <<"END";
-require AutoLoader;
-END
-}
-
-if( $opt_X || ($opt_c && ! $opt_A) ){
- # we won't have our own AUTOLOAD(), so we'll inherit it.
- if( ! $opt_X ) { # use DynaLoader, unless XS was disabled
- print PM <<"END";
-\@ISA = qw(Exporter AutoLoader DynaLoader);
-END
+# Are we using AutoLoader or not?
+unless ($opt_A) { # no autoloader whatsoever.
+ unless ($opt_c) { # we're doing the AUTOLOAD
+ print PM "use AutoLoader;\n";
}
- else{
- print PM <<"END";
-
-\@ISA = qw(Exporter AutoLoader);
-END
+ else {
+ print PM "use AutoLoader qw(AUTOLOAD);\n"
}
}
-else{
- # 1) we have our own AUTOLOAD(), so don't need to inherit it.
- # or
- # 2) we don't want autoloading mentioned.
- if( ! $opt_X ){ # use DynaLoader, unless XS was disabled
- print PM <<"END";
-\@ISA = qw(Exporter DynaLoader);
-END
- }
- else{
- print PM <<"END";
+# Determine @ISA.
+my $myISA = 'our @ISA = qw(Exporter'; # We seem to always want this.
+$myISA .= ' DynaLoader' unless $opt_X; # no XS
+$myISA .= ');';
+print PM "\n$myISA\n\n";
-\@ISA = qw(Exporter);
-END
- }
-}
+my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
print PM<<"END";
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
-\@EXPORT = qw(
+
+# This allows declaration use $module ':all';
+# If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
+# will save memory.
+our %EXPORT_TAGS = ( 'all' => [ qw(
+ @exported_names
+) ] );
+
+our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
+
+our \@EXPORT = qw(
@const_names
);
-\$VERSION = '$TEMPLATE_VERSION';
+our \$VERSION = '$TEMPLATE_VERSION';
END
+if (@vdecls) {
+ printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
+}
+
print PM <<"END" unless $opt_c or $opt_X;
sub AUTOLOAD {
# This AUTOLOAD is used to 'autoload' constants from the constant()
@@ -487,20 +761,29 @@ sub AUTOLOAD {
# to the AUTOLOAD in AutoLoader.
my \$constname;
+ our \$AUTOLOAD;
(\$constname = \$AUTOLOAD) =~ s/.*:://;
croak "&$module::constant not defined" if \$constname eq 'constant';
my \$val = constant(\$constname, \@_ ? \$_[0] : 0);
if (\$! != 0) {
- if (\$! =~ /Invalid/) {
+ if (\$! =~ /Invalid/ || \$!{EINVAL}) {
\$AutoLoader::AUTOLOAD = \$AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
else {
- croak "Your vendor has not defined $module macro \$constname";
+ croak "Your vendor has not defined $module macro \$constname";
+ }
+ }
+ {
+ no strict 'refs';
+ # Fixed between 5.005_53 and 5.005_61
+ if (\$] >= 5.00561) {
+ *\$AUTOLOAD = sub () { \$val };
+ }
+ else {
+ *\$AUTOLOAD = sub { \$val };
}
}
- no strict 'refs';
- *\$AUTOLOAD = sub () { \$val };
goto &\$AUTOLOAD;
}
@@ -512,6 +795,17 @@ bootstrap $module \$VERSION;
END
}
+# tying the variables can happen only after bootstrap
+if (@vdecls) {
+ printf PM <<END;
+{
+@{[ join "\n", map " _tievar_$_(\$$_);", @vdecls ]}
+}
+
+END
+}
+
+my $after;
if( $opt_P ){ # if POD is disabled
$after = '__END__';
}
@@ -522,37 +816,71 @@ else {
print PM <<"END";
# Preloaded methods go here.
+END
+
+print PM <<"END" unless $opt_A;
# Autoload methods go after $after, and are processed by the autosplit program.
+END
+
+print PM <<"END";
1;
__END__
END
-$author = "A. U. Thor";
-$email = 'a.u.thor@a.galaxy.far.far.away';
+my $author = "A. U. Thor";
+my $email = 'a.u.thor@a.galaxy.far.far.away';
+
+my $revhist = '';
+$revhist = <<EOT if $opt_C;
+
+=head1 HISTORY
-my $const_doc = '';
-my $fdecl_doc = '';
+=over 8
+
+=item $TEMPLATE_VERSION
+
+Original version; created by h2xs $H2XS_VERSION with options
+
+ @ARGS
+
+=back
+
+EOT
+
+my $exp_doc = <<EOD;
+
+=head2 EXPORT
+
+None by default.
+
+EOD
if (@const_names and not $opt_P) {
- $const_doc = <<EOD;
-\n=head1 Exported constants
+ $exp_doc .= <<EOD;
+=head2 Exportable constants
@{[join "\n ", @const_names]}
EOD
}
if (defined $fdecls and @$fdecls and not $opt_P) {
- $fdecl_doc = <<EOD;
-\n=head1 Exported functions
+ $exp_doc .= <<EOD;
+=head2 Exportable functions
+
+EOD
+ $exp_doc .= <<EOD if $opt_p;
+When accessing these functions from Perl, prefix C<$opt_p> should be removed.
- @{[join "\n ", @$fdecls]}
+EOD
+ $exp_doc .= <<EOD;
+ @{[join "\n ", @known_fnames{@fnames}]}
EOD
}
-$pod = <<"END" unless $opt_P;
-## Below is the stub of documentation for your module. You better edit it!
+my $pod = <<"END" unless $opt_P;
+## Below is stub documentation for your module. You better edit it!
#
#=head1 NAME
#
@@ -565,12 +893,12 @@ $pod = <<"END" unless $opt_P;
#
#=head1 DESCRIPTION
#
-#Stub documentation for $module was created by h2xs. It looks like the
+#Stub documentation for $module, created by h2xs. It looks like the
#author of the extension was negligent enough to leave the stub
#unedited.
#
#Blah blah blah.
-#$const_doc$fdecl_doc
+#$exp_doc$revhist
#=head1 AUTHOR
#
#$author, $email
@@ -598,7 +926,7 @@ print XS <<"END";
END
if( @path_h ){
- foreach my $path_h (@path_h) {
+ foreach my $path_h (@path_h_ini) {
my($h) = $path_h;
$h =~ s#^/usr/include/##;
if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
@@ -607,54 +935,185 @@ if( @path_h ){
print XS "\n";
}
-if( ! $opt_c ){
-print XS <<"END";
-static int
-not_here(char *s)
+my %pointer_typedefs;
+my %struct_typedefs;
+
+sub td_is_pointer {
+ my $type = shift;
+ my $out = $pointer_typedefs{$type};
+ return $out if defined $out;
+ my $otype = $type;
+ $out = ($type =~ /\*$/);
+ # This converts only the guys which do not have trailing part in the typedef
+ if (not $out
+ and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
+ $type = normalize_type($type);
+ print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
+ if $opt_d;
+ $out = td_is_pointer($type);
+ }
+ return ($pointer_typedefs{$otype} = $out);
+}
+
+sub td_is_struct {
+ my $type = shift;
+ my $out = $struct_typedefs{$type};
+ return $out if defined $out;
+ my $otype = $type;
+ $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
+ # This converts only the guys which do not have trailing part in the typedef
+ if (not $out
+ and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
+ $type = normalize_type($type);
+ print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
+ if $opt_d;
+ $out = td_is_struct($type);
+ }
+ return ($struct_typedefs{$otype} = $out);
+}
+
+# Some macros will bomb if you try to return them from a double-returning func.
+# Say, ((char *)0), or strlen (if somebody #define STRLEN strlen).
+# Fortunately, we can detect both these cases...
+sub protect_convert_to_double {
+ my $in = shift;
+ my $val;
+ return '' unless defined ($val = $seen_define{$in});
+ return '(IV)' if $known_fnames{$val};
+ # OUT_t of ((OUT_t)-1):
+ return '' unless $val =~ /^\s*(\(\s*)?\(\s*([^()]*?)\s*\)/;
+ td_is_pointer($2) ? '(IV)' : '';
+}
+
+# For each of the generated functions, length($pref) leading
+# letters are already checked. Moreover, it is recommended that
+# the generated functions uses switch on letter at offset at least
+# $off + length($pref).
+#
+# The given list has length($pref) chars removed at front, it is
+# guarantied that $off leading chars in the rest are the same for all
+# elts of the list.
+#
+# Returns: how at which offset it was decided to make a switch, or -1 if none.
+
+sub write_const;
+
+sub write_const {
+ my ($fh, $pref, $off, $list) = (shift,shift,shift,shift);
+ my %leading;
+ my $offarg = length $pref;
+
+ if (@$list == 0) { # Can happen on the initial iteration only
+ print $fh <<"END";
+static double
+constant(char *name, int len, int arg)
{
- croak("$module::%s not implemented on this architecture", s);
- return -1;
+ errno = EINVAL;
+ return 0;
}
+END
+ return -1;
+ }
+ if (@$list == 1) { # Can happen on the initial iteration only
+ my $protect = protect_convert_to_double("$pref$list->[0]");
+
+ print $fh <<"END";
static double
-constant(char *name, int arg)
+constant(char *name, int len, int arg)
{
errno = 0;
- switch (*name) {
+ if (strEQ(name + $offarg, "$list->[0]")) { /* $pref removed */
+#ifdef $pref$list->[0]
+ return $protect$pref$list->[0];
+#else
+ errno = ENOENT;
+ return 0;
+#endif
+ }
+ errno = EINVAL;
+ return 0;
+}
END
+ return -1;
+ }
-my(@AZ, @az, @under);
+ for my $n (@$list) {
+ my $c = substr $n, $off, 1;
+ $leading{$c} = [] unless exists $leading{$c};
+ push @{$leading{$c}}, substr $n, $off + 1;
+ }
-foreach(@const_names){
- @AZ = 'A' .. 'Z' if !@AZ && /^[A-Z]/;
- @az = 'a' .. 'z' if !@az && /^[a-z]/;
- @under = '_' if !@under && /^_/;
-}
+ if (keys(%leading) == 1) {
+ return 1 + write_const $fh, $pref, $off + 1, $list;
+ }
-foreach $letter (@AZ, @az, @under) {
+ my $leader = substr $list->[0], 0, $off;
+ foreach my $letter (keys %leading) {
+ write_const $fh, "$pref$leader$letter", 0, $leading{$letter}
+ if @{$leading{$letter}} > 1;
+ }
- last if $letter eq 'a' && !@const_names;
+ my $npref = "_$pref";
+ $npref = '' if $pref eq '';
- print XS " case '$letter':\n";
- my($name);
- while (substr($const_names[0],0,1) eq $letter) {
- $name = shift(@const_names);
- $macro = $prefix{$name} ? "$opt_p$name" : $name;
- next if $const_xsub{$macro};
- print XS <<"END";
- if (strEQ(name, "$name"))
-#ifdef $macro
- return $macro;
+ print $fh <<"END";
+static double
+constant$npref(char *name, int len, int arg)
+{
+END
+
+ print $fh <<"END" if $npref eq '';
+ errno = 0;
+END
+
+ print $fh <<"END" if $off;
+ if ($offarg + $off >= len ) {
+ errno = EINVAL;
+ return 0;
+ }
+END
+
+ print $fh <<"END";
+ switch (name[$offarg + $off]) {
+END
+
+ foreach my $letter (sort keys %leading) {
+ my $let = $letter;
+ $let = '\0' if $letter eq '';
+
+ print $fh <<EOP;
+ case '$let':
+EOP
+ if (@{$leading{$letter}} > 1) {
+ # It makes sense to call a function
+ if ($off) {
+ print $fh <<EOP;
+ if (!strnEQ(name + $offarg,"$leader", $off))
+ break;
+EOP
+ }
+ print $fh <<EOP;
+ return constant_$pref$leader$letter(name, len, arg);
+EOP
+ }
+ else {
+ # Do it ourselves
+ my $protect
+ = protect_convert_to_double("$pref$leader$letter$leading{$letter}[0]");
+
+ print $fh <<EOP;
+ if (strEQ(name + $offarg, "$leader$letter$leading{$letter}[0]")) { /* $pref removed */
+#ifdef $pref$leader$letter$leading{$letter}[0]
+ return $protect$pref$leader$letter$leading{$letter}[0];
#else
goto not_there;
#endif
-END
+ }
+EOP
}
- print XS <<"END";
- break;
-END
-}
-print XS <<"END";
+ }
+ print $fh <<"END";
}
errno = EINVAL;
return 0;
@@ -665,9 +1124,28 @@ not_there:
}
END
+
+}
+
+if( ! $opt_c ) {
+ print XS <<"END";
+static int
+not_here(char *s)
+{
+ croak("$module::%s not implemented on this architecture", s);
+ return -1;
+}
+
+END
+
+ write_const(\*XS, '', 0, \@const_names);
}
+print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
+
+my $prefix;
$prefix = "PREFIX = $opt_p" if defined $opt_p;
+
# Now switch from C to XS by issuing the first MODULE declaration:
print XS <<"END";
@@ -682,13 +1160,13 @@ $_()
CODE:
#ifdef $_
- RETVAL = $_;
+ RETVAL = $_;
#else
- croak("Your vendor has not defined the $module macro $_");
+ croak("Your vendor has not defined the $module macro $_");
#endif
OUTPUT:
- RETVAL
+ RETVAL
END
}
@@ -698,14 +1176,22 @@ END
print XS <<"END" unless $opt_c;
double
-constant(name,arg)
- char * name
+constant(sv,arg)
+ PREINIT:
+ STRLEN len;
+ INPUT:
+ SV * sv
+ char * s = SvPV(sv, len);
int arg
+ CODE:
+ RETVAL = constant(s,len,arg);
+ OUTPUT:
+ RETVAL
END
my %seen_decl;
-
+my %typemap;
sub print_decl {
my $fh = shift;
@@ -714,7 +1200,10 @@ sub print_decl {
return if $seen_decl{$name}++; # Need to do the same for docs as well?
my @argnames = map {$_->[1]} @$args;
- my @argtypes = map { normalize_type( $_->[0] ) } @$args;
+ my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
+ if ($opt_k) {
+ s/^\s*const\b\s*// for @argtypes;
+ }
my @argarrays = map { $_->[4] || '' } @$args;
my $numargs = @$args;
if ($numargs and $argtypes[-1] eq '...') {
@@ -722,21 +1211,152 @@ sub print_decl {
$argnames[-1] = '...';
}
local $" = ', ';
- $type = normalize_type($type);
-
+ $type = normalize_type($type, 1);
+
print $fh <<"EOP";
$type
$name(@argnames)
EOP
- for $arg (0 .. $numargs - 1) {
+ for my $arg (0 .. $numargs - 1) {
print $fh <<"EOP";
$argtypes[$arg] $argnames[$arg]$argarrays[$arg]
EOP
}
}
+sub print_tievar_subs {
+ my($fh, $name, $type) = @_;
+ print $fh <<END;
+I32
+_get_$name(IV index, SV *sv) {
+ dSP;
+ PUSHMARK(SP);
+ XPUSHs(sv);
+ PUTBACK;
+ (void)call_pv("$module\::_get_$name", G_DISCARD);
+ return (I32)0;
+}
+
+I32
+_set_$name(IV index, SV *sv) {
+ dSP;
+ PUSHMARK(SP);
+ XPUSHs(sv);
+ PUTBACK;
+ (void)call_pv("$module\::_set_$name", G_DISCARD);
+ return (I32)0;
+}
+
+END
+}
+
+sub print_tievar_xsubs {
+ my($fh, $name, $type) = @_;
+ print $fh <<END;
+void
+_tievar_$name(sv)
+ SV* sv
+ PREINIT:
+ struct ufuncs uf;
+ CODE:
+ uf.uf_val = &_get_$name;
+ uf.uf_set = &_set_$name;
+ uf.uf_index = (IV)&_get_$name;
+ sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
+
+void
+_get_$name(THIS)
+ $type THIS = NO_INIT
+ CODE:
+ THIS = $name;
+ OUTPUT:
+ SETMAGIC: DISABLE
+ THIS
+
+void
+_set_$name(THIS)
+ $type THIS
+ CODE:
+ $name = THIS;
+
+END
+}
+
+sub print_accessors {
+ my($fh, $name, $struct) = @_;
+ return unless defined $struct && $name !~ /\s|_ANON/;
+ $name = normalize_type($name);
+ my $ptrname = normalize_type("$name *");
+ print $fh <<"EOF";
+
+MODULE = $module PACKAGE = ${name} $prefix
+
+$name *
+_to_ptr(THIS)
+ $name THIS = NO_INIT
+ PROTOTYPE: \$
+ CODE:
+ if (sv_derived_from(ST(0), "$name")) {
+ STRLEN len;
+ char *s = SvPV((SV*)SvRV(ST(0)), len);
+ if (len != sizeof(THIS))
+ croak("Size \%d of packed data != expected \%d",
+ len, sizeof(THIS));
+ RETVAL = ($name *)s;
+ }
+ else
+ croak("THIS is not of type $name");
+ OUTPUT:
+ RETVAL
+
+$name
+new(CLASS)
+ char *CLASS = NO_INIT
+ PROTOTYPE: \$
+ CODE:
+ Zero((void*)&RETVAL, sizeof(RETVAL), char);
+ OUTPUT:
+ RETVAL
+
+MODULE = $module PACKAGE = ${name}Ptr $prefix
+
+EOF
+ my @items = @$struct;
+ while (@items) {
+ my $item = shift @items;
+ if ($item->[0] =~ /_ANON/) {
+ if (defined $item->[2]) {
+ push @items, map [
+ @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
+ ], @{ $structs{$item->[0]} };
+ } else {
+ push @items, @{ $structs{$item->[0]} };
+ }
+ } else {
+ my $type = normalize_type($item->[0]);
+ my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
+ print $fh <<"EOF";
+$ttype
+$item->[2](THIS, __value = NO_INIT)
+ $ptrname THIS
+ $type __value
+ PROTOTYPE: \$;\$
+ CODE:
+ if (items > 1)
+ THIS->$item->[-1] = __value;
+ RETVAL = @{[
+ $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
+ ]};
+ OUTPUT:
+ RETVAL
+
+EOF
+ }
+ }
+}
+
# Should be called before any actual call to normalize_type().
sub get_typemap {
# We do not want to read ./typemap by obvios reasons.
@@ -744,9 +1364,11 @@ sub get_typemap {
my $stdtypemap = "$Config::Config{privlib}/ExtUtils/typemap";
unshift @tm, $stdtypemap;
my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
- my $image;
-
- foreach $typemap (@tm) {
+
+ # Start with useful default values
+ $typemap{float} = 'T_DOUBLE';
+
+ foreach my $typemap (@tm) {
next unless -e $typemap ;
# skip directories, binary files etc.
warn " Scanning $typemap\n";
@@ -762,11 +1384,12 @@ sub get_typemap {
elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
elsif ($mode eq 'Typemap') {
next if /^\s*($|\#)/ ;
- if ( ($type, $image) =
+ my ($type, $image);
+ if ( ($type, $image) =
/^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
# This may reference undefined functions:
and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
- normalize_type($type);
+ $typemap{normalize_type($type)} = $image;
}
}
}
@@ -777,24 +1400,64 @@ sub get_typemap {
}
-sub normalize_type {
- my $ignore_mods = '(?:\b(?:__const__|static|inline|__inline__)\b\s*)*';
+sub normalize_type { # Second arg: do not strip const's before \*
my $type = shift;
- $type =~ s/$ignore_mods//go;
- $type =~ s/([\]\[()])/ \1 /g;
- $type =~ s/\s+/ /g;
+ my $do_keep_deep_const = shift;
+ # If $do_keep_deep_const this is heuristical only
+ my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
+ my $ignore_mods
+ = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
+ if ($do_keep_deep_const) { # Keep different compiled /RExen/o separately!
+ $type =~ s/$ignore_mods//go;
+ }
+ else {
+ $type =~ s/$ignore_mods//go;
+ }
+ $type =~ s/([^\s\w])/ \1 /g;
$type =~ s/\s+$//;
$type =~ s/^\s+//;
- $type =~ s/\b\*/ */g;
- $type =~ s/\*\b/* /g;
- $type =~ s/\*\s+(?=\*)/*/g;
+ $type =~ s/\s+/ /g;
+ $type =~ s/\* (?=\*)/*/g;
+ $type =~ s/\. \. \./.../g;
+ $type =~ s/ ,/,/g;
$types_seen{$type}++
unless $type eq '...' or $type eq 'void' or $std_types{$type};
$type;
}
+my $need_opaque;
+
+sub assign_typemap_entry {
+ my $type = shift;
+ my $otype = $type;
+ my $entry;
+ if ($tmask and $type =~ /$tmask/) {
+ print "Type $type matches -o mask\n" if $opt_d;
+ $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
+ }
+ elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
+ $type = normalize_type $type;
+ print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
+ $entry = assign_typemap_entry($type);
+ }
+ $entry ||= $typemap{$otype}
+ || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
+ $typemap{$otype} = $entry;
+ $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
+ return $entry;
+}
+
+for (@vdecls) {
+ print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
+}
+
if ($opt_x) {
- for $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
+ for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
+ if ($opt_a) {
+ while (my($name, $struct) = each %structs) {
+ print_accessors(\*XS, $name, $struct);
+ }
+ }
}
close XS;
@@ -804,10 +1467,32 @@ if (%types_seen) {
warn "Writing $ext$modpname/typemap\n";
open TM, ">typemap" or die "Cannot open typemap file for write: $!";
- for $type (keys %types_seen) {
- print TM $type, "\t" x (6 - int((length $type)/8)), "T_PTROBJ\n"
+ for $type (sort keys %types_seen) {
+ my $entry = assign_typemap_entry $type;
+ print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
}
+ print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
+#############################################################################
+INPUT
+T_OPAQUE_STRUCT
+ if (sv_derived_from($arg, \"${ntype}\")) {
+ STRLEN len;
+ char *s = SvPV((SV*)SvRV($arg), len);
+
+ if (len != sizeof($var))
+ croak(\"Size %d of packed data != expected %d\",
+ len, sizeof($var));
+ $var = *($type *)s;
+ }
+ else
+ croak(\"$var is not of type ${ntype}\")
+#############################################################################
+OUTPUT
+T_OPAQUE_STRUCT
+ sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
+EOP
+
close TM or die "Cannot close typemap file for write: $!";
}
@@ -816,18 +1501,22 @@ if (%types_seen) {
warn "Writing $ext$modpname/Makefile.PL\n";
open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
-print PL <<'END';
+print PL <<END;
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
+WriteMakefile(
+ 'NAME' => '$module',
+ 'VERSION_FROM' => '$modfname.pm', # finds \$VERSION
+ 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1
+END
+if (!$opt_X) { # print C stuff, unless XS is disabled
+ $opt_F = '' unless defined $opt_F;
+ print PL <<END;
+ 'LIBS' => ['$extralibs'], # e.g., '-lm'
+ 'DEFINE' => '$opt_F', # e.g., '-DHAVE_SOMETHING'
+ 'INC' => '', # e.g., '-I/usr/include/other'
END
-print PL "WriteMakefile(\n";
-print PL " 'NAME' => '$module',\n";
-print PL " 'VERSION_FROM' => '$modfname.pm', # finds \$VERSION\n";
-if( ! $opt_X ){ # print C stuff, unless XS is disabled
- print PL " 'LIBS' => ['$extralibs'], # e.g., '-lm' \n";
- print PL " 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' \n";
- print PL " 'INC' => '', # e.g., '-I/usr/include/other' \n";
}
print PL ");\n";
close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
@@ -862,16 +1551,25 @@ print "ok 1\n";
_END_
close(EX) || die "Can't close $ext$modpname/test.pl: $!\n";
-warn "Writing $ext$modpname/Changes\n";
-open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
-print EX "Revision history for Perl extension $module.\n\n";
-print EX "$TEMPLATE_VERSION ",scalar localtime,"\n";
-print EX "\t- original version; created by h2xs $H2XS_VERSION\n\n";
-close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
+unless ($opt_C) {
+ warn "Writing $ext$modpname/Changes\n";
+ $" = ' ';
+ open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
+ @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
+ print EX <<EOP;
+Revision history for Perl extension $module.
+
+$TEMPLATE_VERSION @{[scalar localtime]}
+\t- original version; created by h2xs $H2XS_VERSION with options
+\t\t@ARGS
+
+EOP
+ close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
+}
warn "Writing $ext$modpname/MANIFEST\n";
open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
-@files = <*>;
+my @files = <*>;
if (!@files) {
eval {opendir(D,'.');};
unless ($@) { @files = readdir(D); closedir(D); }
diff --git a/contrib/perl5/utils/perlbc.PL b/contrib/perl5/utils/perlbc.PL
new file mode 100644
index 0000000..51d074b
--- /dev/null
+++ b/contrib/perl5/utils/perlbc.PL
@@ -0,0 +1,80 @@
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+use Cwd;
+
+# List explicitly here the variables you want Configure to
+# generate. Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries. Thus you write
+# $startperl
+# to ensure Configure will look for $Config{startperl}.
+# Wanted: $archlibexp
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+$origdir = cwd;
+chdir dirname($0);
+$file = basename($0, '.PL');
+$file .= '.com' if $^O eq 'VMS';
+
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{startperl}
+ eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
+ if \$running_under_some_shell;
+!GROK!THIS!
+
+# In the following, perl variables are not expanded during extraction.
+
+print OUT <<'!NO!SUBS!';
+
+use strict;
+use warning;
+no warning qw(once);
+
+use Config;
+
+require ByteLoader;
+
+foreach my $infile (@ARGV)
+{
+ if ($infile =~ /\.p[ml]$/)
+ {
+ my $outfile = $infile . "c";
+
+ open(OUT,"> $outfile") || die "Can't open $outfile: $!";
+
+ if ($infile =~ /\.pl$/)
+ {
+ print OUT "$Config{startperl}\n";
+ print OUT " eval 'exec $Config{perlpath} -S \$0 \${1+\"\$@\"}'\n";
+ print OUT " if \$running_under_some_shell;\n\n";
+ }
+
+ print OUT "use ByteLoader $ByteLoader::VERSION;\n";
+
+ close(OUT);
+
+ print "$^X -MO=Bytecode $infile >> $outfile\n";
+
+ system("$^X -MO=Bytecode $infile >> $outfile");
+ }
+ else
+ {
+ warn "Don't know how to byte compile $infile";
+ }
+}
+!NO!SUBS!
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
diff --git a/contrib/perl5/utils/perlbug.PL b/contrib/perl5/utils/perlbug.PL
index 6f87589..208da36 100644
--- a/contrib/perl5/utils/perlbug.PL
+++ b/contrib/perl5/utils/perlbug.PL
@@ -3,6 +3,7 @@
use Config;
use File::Basename qw(&basename &dirname);
use Cwd;
+use File::Spec::Functions;
# List explicitly here the variables you want Configure to
# generate. Metaconfig only looks for shell variables, so you
@@ -23,7 +24,8 @@ open OUT, ">$file" or die "Can't create $file: $!";
# extract patchlevel.h information
-open PATCH_LEVEL, "<../patchlevel.h" or die "Can't open patchlevel.h: $!";
+open PATCH_LEVEL, "<" . catfile(updir, "patchlevel.h")
+ or die "Can't open patchlevel.h: $!";
my $patchlevel_date = (stat PATCH_LEVEL)[9];
@@ -35,8 +37,8 @@ my @patches;
while (<PATCH_LEVEL>) {
last if /^\s*}/;
chomp;
- s/^\s+,?"?//;
- s/"?,?$//;
+ s/^\s+,?\s*"?//;
+ s/"?\s*,?$//;
s/(['\\])/\\$1/g;
push @patches, $_ unless $_ eq 'NULL';
}
@@ -55,12 +57,14 @@ print "Extracting $file (with variable substitutions)\n";
# In this section, perl variables will be expanded during extraction.
# You can use $Config{...} to use Configure variables.
+my $extract_version = sprintf("v%vd", $^V);
+
print OUT <<"!GROK!THIS!";
$Config{startperl}
eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
if \$running_under_some_shell;
-my \$config_tag1 = '$] - $Config{cf_time}';
+my \$config_tag1 = '$extract_version - $Config{cf_time}';
my \$patchlevel_date = $patchlevel_date;
my \$patch_tags = '$patch_tags';
@@ -74,6 +78,7 @@ my \@patches = (
print OUT <<'!NO!SUBS!';
use Config;
+use File::Spec; # keep perlbug Perl 5.005 compatible
use Getopt::Std;
use strict;
@@ -86,7 +91,7 @@ BEGIN {
$::HaveUtil = ($@ eq "");
};
-my $Version = "1.26";
+my $Version = "1.28";
# Changed in 1.06 to skip Mail::Send and Mail::Util if not available.
# Changed in 1.07 to see more sendmail execs, and added pipe output.
@@ -117,6 +122,8 @@ my $Version = "1.26";
# Changed in 1.24 Added '-F<file>' to save report HVDS 98-07-01
# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12
# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15
+# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27
+# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000
# TODO: - Allow the user to re-name the file on mail failure, and
# make sure failure (transmission-wise) of Mail::Send is
@@ -124,10 +131,12 @@ my $Version = "1.26";
# - Test -b option
my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename,
- $subject, $from, $verbose, $ed, $outfile,
+ $subject, $from, $verbose, $ed, $outfile, $Is_MacOS, $category, $severity,
$fh, $me, $Is_MSWin32, $Is_VMS, $msg, $body, $andcc, %REP, $ok);
-my $config_tag2 = "$] - $Config{cf_time}";
+my $perl_version = $^V ? sprintf("v%vd", $^V) : $];
+
+my $config_tag2 = "$perl_version - $Config{cf_time}";
Init();
@@ -149,11 +158,43 @@ Send();
exit;
+sub ask_for_alternatives {
+ my $name = shift;
+ my $default = shift;
+ my @alts = @_;
+ my $alt = "";
+ paraprint <<EOF;
+Please pick a \u$name from the following:
+
+ @alts
+
+EOF
+ my $err = 0;
+ my $joined_alts = join('|', @alts);
+ do {
+ if ($err++ > 5) {
+ die "Invalid $name: aborting.\n";
+ }
+ print "Please enter a \u$name [$default]: ";
+ $alt = <>;
+ chomp $alt;
+ if ($alt =~ /^\s*$/) {
+ $alt = $default;
+ }
+ } while ($alt !~ /^($joined_alts)$/i);
+ lc $alt;
+}
+
sub Init {
# -------- Setup --------
$Is_MSWin32 = $^O eq 'MSWin32';
$Is_VMS = $^O eq 'VMS';
+ $Is_MacOS = $^O eq 'MacOS';
+
+ @ARGV = split m/\s+/,
+ MacPerl::Ask('Provide command-line args here (-h for help):')
+ if $Is_MacOS && $MacPerl::Version =~ /App/;
if (!getopts("dhva:s:b:f:F:r:e:SCc:to:n:")) { Help(); exit; };
@@ -196,6 +237,7 @@ sub Init {
$ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT}
|| ($Is_VMS && "edit/tpu")
|| ($Is_MSWin32 && "notepad")
+ || ($Is_MacOS && '')
|| "vi";
# Not OK - provide build failure template by finessing OK report
@@ -232,8 +274,10 @@ EOF
$::opt_C = 1; # don't send a copy to the local admin
$::opt_s = 1; # we have a subject line
$subject = ($::opt_n ? 'Not ' : '')
- . "OK: perl $] ${patch_tags}on"
+ . "OK: perl $perl_version ${patch_tags}on"
." $::Config{'archname'} $::Config{'osvers'} $subject";
+ $category = "install";
+ $severity = "none";
$ok = 1;
} else {
Help();
@@ -255,6 +299,7 @@ EOF
# My username
$me = $Is_MSWin32 ? $ENV{'USERNAME'}
: $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'}
+ : $Is_MacOS ? $ENV{'USER'}
: eval { getpwuid($<) }; # May be missing
$from = $::Config{'cf_email'}
@@ -307,6 +352,13 @@ EOF
my $guess;
$guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || '';
+ if ($Is_MacOS) {
+ require Mac::InternetConfig;
+ $guess = $Mac::InternetConfig::InternetConfig{
+ Mac::InternetConfig::kICEmail()
+ };
+ }
+
unless ($guess) {
my $domain;
if ($::HaveUtil) {
@@ -415,6 +467,16 @@ EOF
}
}
+ # Prompt for category of bug
+ $category ||= ask_for_alternatives("category", "core",
+ qw(core docs install
+ library utilities));
+
+ # Prompt for severity of bug
+ $severity ||= ask_for_alternatives("severity", "low",
+ qw(critical high medium
+ low wishlist none));
+
# Generate scratch file to edit report in
$filename = filename();
@@ -452,7 +514,7 @@ EOF
print REP <<EOF;
This is a $reptype report for perl from $from,
-generated with the help of perlbug $Version running under perl $].
+generated with the help of perlbug $Version running under perl $perl_version.
EOF
@@ -494,13 +556,19 @@ EOF
sub Dump {
local(*OUT) = @_;
- print REP "\n---\n";
- print REP "This perlbug was built using Perl $config_tag1\n",
+ print OUT <<EFF;
+---
+Flags:
+ category=$category
+ severity=$severity
+---
+EFF
+ print OUT "This perlbug was built using Perl $config_tag1\n",
"It is being executed now by Perl $config_tag2.\n\n"
if $config_tag2 ne $config_tag1;
print OUT <<EOF;
-Site configuration information for perl $]:
+Site configuration information for perl $perl_version:
EOF
if ($::Config{cf_by} and $::Config{cf_time}) {
@@ -516,7 +584,7 @@ EOF
print OUT <<EOF;
---
-\@INC for perl $]:
+\@INC for perl $perl_version:
EOF
for my $i (@INC) {
print OUT " $i\n";
@@ -525,18 +593,21 @@ EOF
print OUT <<EOF;
---
-Environment for perl $]:
+Environment for perl $perl_version:
EOF
- for my $env (sort
- (qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE),
- grep /^(?:PERL|LC_)/, keys %ENV)
- ) {
+ my @env =
+ qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE);
+ push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne '';
+ push @env, grep /^(?:PERL|LC_|LANG)/, keys %ENV;
+ my %env;
+ @env{@env} = @env;
+ for my $env (sort keys %env) {
print OUT " $env",
exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
"\n";
}
if ($verbose) {
- print OUT "\nComplete configuration data for perl $]:\n\n";
+ print OUT "\nComplete configuration data for perl $perl_version:\n\n";
my $value;
foreach (sort keys %::Config) {
$value = $::Config{$_};
@@ -559,7 +630,15 @@ EOF
}
tryagain:
- my $sts = system("$ed $filename");
+ my $sts = system("$ed $filename") unless $Is_MacOS;
+ if ($Is_MacOS) {
+ require ExtUtils::MakeMaker;
+ ExtUtils::MM_MacOS::launch_file($filename);
+ paraprint <<EOF;
+Press Enter when done.
+EOF
+ scalar <>;
+ }
if ($sts) {
paraprint <<EOF;
The editor you chose (`$ed') could apparently not be run!
@@ -783,7 +862,7 @@ Options:
-v Include Verbose configuration data in the report
-f File containing the body of the report. Use this to
quickly send a prepared message.
- -F File to output the resulting mail message to, instead of mailing.
+ -F File to output the resulting mail message to, instead of mailing.
-S Send without asking for confirmation.
-a Address to send the report to. Defaults to `$address'.
-c Address to send copy of report to. Defaults to `$cc'.
@@ -796,7 +875,7 @@ Options:
this if you don't give it here.
-e Editor to use.
-t Test mode. The target address defaults to `$testaddress'.
- -d Data mode (the default if you redirect or pipe output.)
+ -d Data mode (the default if you redirect or pipe output.)
This prints out your configuration data, without mailing
anything. You can use this with -v to get more complete data.
-ok Report successful build on this system to perl porters
@@ -815,11 +894,12 @@ EOF
sub filename {
my $dir = $Is_VMS ? 'sys$scratch:'
: ($Is_MSWin32 && $ENV{'TEMP'}) ? $ENV{'TEMP'}
- : '/tmp/';
+ : $Is_MacOS ? $ENV{'TMPDIR'}
+ : '/tmp';
$filename = "bugrep0$$";
- $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
- $filename++ while -e "$dir$filename";
- $filename = "$dir$filename";
+# $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
+ $filename++ while -e File::Spec->catfile($dir, $filename);
+ $filename = File::Spec->catfile($dir, $filename);
}
sub paraprint {
@@ -878,7 +958,7 @@ this checklist:
=over 4
-=item What version of perl you are running?
+=item What version of Perl you are running?
Type C<perl -v> at the command line to find out.
@@ -886,16 +966,16 @@ Type C<perl -v> at the command line to find out.
Look at http://www.perl.com/ to find out. If it is not the latest
released version, get that one and see whether your bug has been
-fixed. Note that bug reports about old versions of perl, especially
+fixed. Note that bug reports about old versions of Perl, especially
those prior to the 5.0 release, are likely to fall upon deaf ears.
You are on your own if you continue to use perl1 .. perl4.
=item Are you sure what you have is a bug?
A significant number of the bug reports we get turn out to be documented
-features in perl. Make sure the behavior you are witnessing doesn't fall
+features in Perl. Make sure the behavior you are witnessing doesn't fall
under that category, by glancing through the documentation that comes
-with perl (we'll admit this is no mean task, given the sheer volume of
+with Perl (we'll admit this is no mean task, given the sheer volume of
it all, but at least have a look at the sections that I<seem> relevant).
Be aware of the familiar traps that perl programmers of various hues
@@ -905,10 +985,10 @@ Check in L<perldiag> to see what any Perl error message(s) mean.
If message isn't in perldiag, it probably isn't generated by Perl.
Consult your operating system documentation instead.
-If you are on a non-UNIX platform check also L<perlport>, some
-features may not be implemented or work differently.
+If you are on a non-UNIX platform check also L<perlport>, as some
+features may be unimplemented or work differently.
-Try to study the problem under the perl debugger, if necessary.
+Try to study the problem under the Perl debugger, if necessary.
See L<perldebug>.
=item Do you have a proper test case?
@@ -930,7 +1010,7 @@ If you get a core dump (or equivalent), you may use a debugger
(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug
report. NOTE: unless your Perl has been compiled with debug info
(often B<-g>), the stack trace is likely to be somewhat hard to use
-because it will most probably contain only the function names, not
+because it will most probably contain only the function names and not
their arguments. If possible, recompile your Perl with debug info and
reproduce the dump and the stack trace.
@@ -938,8 +1018,8 @@ reproduce the dump and the stack trace.
The easier it is to understand a reproducible bug, the more likely it
will be fixed. Anything you can provide by way of insight into the
-problem helps a great deal. In other words, try to analyse the
-problem to the extent you feel qualified and report your discoveries.
+problem helps a great deal. In other words, try to analyze the
+problem (to the extent you can) and report your discoveries.
=item Can you fix the bug yourself?
@@ -973,14 +1053,14 @@ C<perlbug> at all on your system, be sure to include the entire output
produced by running C<perl -V> (note the uppercase V).
Whether you use C<perlbug> or send the email manually, please make
-your subject informative. "a bug" not informative. Neither is "perl
-crashes" nor "HELP!!!", these all are null information. A compact
-description of what's wrong is fine.
+your Subject line informative. "a bug" not informative. Neither is
+"perl crashes" nor "HELP!!!". These don't help.
+A compact description of what's wrong is fine.
=back
Having done your bit, please be prepared to wait, to be told the bug
-is in your code, or even to get no reply at all. The perl maintainers
+is in your code, or even to get no reply at all. The Perl maintainers
are busy folks, so if your problem is a small one or if it is difficult
to understand or already known, they may not respond with a personal reply.
If it is important to you that your bug be fixed, do monitor the
@@ -1091,12 +1171,14 @@ Include verbose configuration data in the report.
=head1 AUTHORS
Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently I<doc>tored
-by Gurusamy Sarathy (E<lt>gsar@umich.eduE<gt>), Tom Christiansen
+by Gurusamy Sarathy (E<lt>gsar@activestate.comE<gt>), Tom Christiansen
(E<lt>tchrist@perl.comE<gt>), Nathan Torkington (E<lt>gnat@frii.comE<gt>),
Charles F. Randall (E<lt>cfr@pobox.comE<gt>), Mike Guy
(E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop (E<lt>domo@computer.orgE<gt>),
-Hugo van der Sanden (E<lt>hv@crypt0.demon.co.ukE<gt>), and
-Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>).
+Hugo van der Sanden (E<lt>hv@crypt0.demon.co.ukE<gt>),
+Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>), Chris Nandor
+(E<lt>pudge@pobox.comE<gt>), Jon Orwant (E<lt>orwant@media.mit.eduE<gt>,
+and Richard Foley (E<lt>richard@rfi.netE<gt>).
=head1 SEE ALSO
diff --git a/contrib/perl5/utils/perlcc.PL b/contrib/perl5/utils/perlcc.PL
index b214645..f0636f6 100644
--- a/contrib/perl5/utils/perlcc.PL
+++ b/contrib/perl5/utils/perlcc.PL
@@ -2,6 +2,7 @@
use Config;
use File::Basename qw(&basename &dirname);
+use File::Spec;
use Cwd;
# List explicitly here the variables you want Configure to
@@ -48,8 +49,12 @@ $Getopt::Long::bundling_override = 1;
$Getopt::Long::passthrough = 0;
$Getopt::Long::ignore_case = 0;
+my $pathsep = ($Config{'osname'} eq 'MSWin32')? "\\" : "/"; # MAJOR HACK. SHOULD
+ # BE IN Config.pm
+
my $options = {};
my $_fh;
+unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS};
main();
@@ -66,7 +71,9 @@ sub main
"regex:s",
"verbose:s",
"log:s",
- "argv:s",
+ "argv:s",
+ "b",
+ "opt",
"gen",
"sav",
"run",
@@ -101,33 +108,53 @@ sub _doit
my ($file) = @_;
my ($program_ext, $module_ext) = _getRegexps();
- my ($obj, $objfile, $so, $type);
+ my ($obj, $objfile, $so, $type, $backend, $gentype);
+
+ $backend = $options->{'b'} ? 'Bytecode' : $options->{'opt'} ? 'CC' : 'C';
+
+ $gentype = $options->{'b'} ? 'Bytecode' : 'C';
if (
(($file =~ m"@$program_ext") && ($file !~ m"@$module_ext"))
|| (defined($options->{'prog'}) || defined($options->{'run'}))
)
{
- $objfile = ($options->{'C'}) ? $options->{'C'} : "$file.c";
$type = 'program';
- $obj = ($options->{'o'})? $options->{'o'} :
- _getExecutable( $file,$program_ext);
+ if ($options->{'b'})
+ {
+ $obj = $objfile = $options->{'o'} ? $options->{'o'} : "${file}c";
+ }
+ else
+ {
+ $objfile = $options->{'C'} ? $options->{'C'} : "$file.c";
+ $obj = $options->{'o'} ? $options->{'o'}
+ : _getExecutable( $file,$program_ext);
+ }
return() if (!$obj);
}
elsif (($file =~ m"@$module_ext") || ($options->{'mod'}))
{
- die "Shared objects are not supported on Win32 yet!!!!\n"
- if ($Config{'osname'} eq 'MSWin32');
+ $type = 'module';
+
+ if ($options->{'b'})
+ {
+ $obj = $objfile = $options->{'o'} ? $options->{'o'} : "${file}c";
+ }
+ else
+ {
+ die "Shared objects are not supported on Win32 yet!!!!\n"
+ if ($Config{'osname'} eq 'MSWin32');
+
+ $objfile = $options->{'C'} ? $options->{'C'} : "$file.c";
+ $obj = $options->{'o'} ? $options->{'o'}
+ : _getExecutable($file, $module_ext);
+ $so = "$obj.$Config{so}";
+ }
- $obj = ($options->{'o'})? $options->{'o'} :
- _getExecutable($file, $module_ext);
- $so = "$obj.$Config{so}";
- $type = 'sharedlib';
return() if (!$obj);
- $objfile = ($options->{'C'}) ? $options->{'C'} : "$file.c";
}
else
{
@@ -137,15 +164,17 @@ sub _doit
if ($type eq 'program')
{
- _print("Making C($objfile) for $file!\n", 36 );
+ _print("Making $gentype($objfile) for $file!\n", 36 );
- my $errcode = _createCode($objfile, $file);
+ my $errcode = _createCode($backend, $objfile, $file);
(_print( "ERROR: In generating code for $file!\n", -1), return())
if ($errcode);
- _print("Compiling C($obj) for $file!\n", 36 ) if (!$options->{'gen'});
+ _print("Compiling C($obj) for $file!\n", 36 ) if (!$options->{'gen'} &&
+ !$options->{'b'});
$errcode = _compileCode($file, $objfile, $obj)
- if (!$options->{'gen'});
+ if (!$options->{'gen'} &&
+ !$options->{'b'});
if ($errcode)
{
@@ -157,29 +186,35 @@ sub _doit
return()
}
- _runCode($obj) if ($options->{'run'});
+ _runCode($objfile) if ($options->{'run'} && $options->{'b'});
+ _runCode($obj) if ($options->{'run'} && !$options->{'b'});
- _removeCode($objfile) if (!$options->{'sav'} ||
- ($options->{'e'} && !$options->{'C'}));
+ _removeCode($objfile) if (($options->{'b'} &&
+ ($options->{'e'} && !$options->{'o'})) ||
+ (!$options->{'b'} &&
+ (!$options->{'sav'} ||
+ ($options->{'e'} && !$options->{'C'}))));
_removeCode($file) if ($options->{'e'});
- _removeCode($obj) if (($options->{'e'}
- && !$options->{'sav'}
- && !$options->{'o'})
- || ($options->{'run'} && !$options->{'sav'}));
+ _removeCode($obj) if (!$options->{'b'} &&
+ (($options->{'e'} &&
+ !$options->{'sav'} && !$options->{'o'}) ||
+ ($options->{'run'} && !$options->{'sav'})));
}
else
{
- _print( "Making C($objfile) for $file!\n", 36 );
- my $errcode = _createCode($objfile, $file, $obj);
+ _print( "Making $gentype($objfile) for $file!\n", 36 );
+ my $errcode = _createCode($backend, $objfile, $file, $obj);
(_print( "ERROR: In generating code for $file!\n", -1), return())
if ($errcode);
- _print( "Compiling C($so) for $file!\n", 36 ) if (!$options->{'gen'});
+ _print( "Compiling C($so) for $file!\n", 36 ) if (!$options->{'gen'} &&
+ !$options->{'b'});
- my $errorcode =
- _compileCode($file, $objfile, $obj, $so ) if (!$options->{'gen'});
+ $errcode =
+ _compileCode($file, $objfile, $obj, $so ) if (!$options->{'gen'} &&
+ !$options->{'b'});
(_print( "ERROR: In compiling code for $objfile!\n", -1), return())
if ($errcode);
@@ -202,10 +237,10 @@ sub _getExecutable
($obj = $sourceprog) =~ s"@$ext"$options->{ext}"g;
return(0) if (_error('equal', $obj, $sourceprog));
}
- elsif (defined ($options->{'run'}))
- {
- $obj = "perlc$$";
- }
+ elsif (defined ($options->{'run'}))
+ {
+ $obj = "perlc$$";
+ }
else
{
($obj = $sourceprog) =~ s"@$ext""g;
@@ -216,23 +251,49 @@ sub _getExecutable
sub _createCode
{
- my ( $generated_cfile, $file, $final_output ) = @_;
+ my ( $backend, $generated_file, $file, $final_output ) = @_;
my $return;
+ my $output_switch = "o";
+ my $max_line_len = '';
local($") = " -I";
- if (@_ == 2) # compiling a program
+ if ($^O eq 'MSWin32' && $backend =~ /^CC?$/ && $Config{cc} =~ /^cl/i) {
+ $max_line_len = '-l2000,';
+ }
+
+ if ($backend eq "Bytecode")
{
- _print( "$^X -I@INC -MO=CC,-o$generated_cfile $file\n", 36);
- $return = _run("$ -I@INC -MO=CC,-o$generated_cfile $file", 9);
+ require ByteLoader;
+
+ open(GENFILE, "> $generated_file") || die "Can't open $generated_file: $!";
+ binmode GENFILE;
+ print GENFILE "#!$^X\n" if @_ == 3;
+ print GENFILE "use ByteLoader $ByteLoader::VERSION;\n";
+ close(GENFILE);
+
+ $output_switch ="a";
+ }
+
+ if (@_ == 3) # compiling a program
+ {
+ chmod $generated_file, 0777 & ~umask if $backend eq "Bytecode";
+ my $null=File::Spec->devnull;
+ _print( "$^X -I@INC -MB::Stash -c $file\n", 36);
+ my @stash=`$^X -I@INC -MB::Stash -c $file 2>$null`;
+ my $stash=$stash[-1];
+ chomp $stash;
+
+ _print( "$^X -I@INC -MO=$backend,$max_line_len$stash $file\n", 36);
+ $return = _run("$^X -I@INC -MO=$backend,$max_line_len$stash,-$output_switch$generated_file $file", 9);
$return;
}
else # compiling a shared object
{
_print(
- "$ -I@INC -MO=CC,-m$final_output,-o$generated_cfile $file\n", 36);
+ "$^X -I@INC -MO=$backend,$max_line_len-m$final_output $file\n", 36);
$return =
- _run("$ -I@INC -MO=CC,-m$final_output,-o$generated_cfile $file", 9);
+ _run("$^X -I@INC -MO=$backend,$max_line_len-m$final_output,-$output_switch$generated_file $file ", 9);
$return;
}
}
@@ -245,7 +306,8 @@ sub _compileCode
if (@_ == 3) # just compiling a program
{
$return[0] =
- _ccharness('static', $sourceprog, "-o", $output_executable, $generated_cfile);
+ _ccharness('static', $sourceprog, "-o", $output_executable,
+ $generated_cfile);
$return[0];
}
else
@@ -256,7 +318,7 @@ sub _compileCode
$return[0] = _ccharness('compile', $sourceprog, "-c", $generated_cfile);
$return[1] = _ccharness
(
- 'dynamic',
+ 'dynamic',
$sourceprog, "-o",
$shared_object, $object_file
);
@@ -287,34 +349,57 @@ sub _ccharness
my $sourceprog = shift(@args);
my ($libdir, $incdir);
+ my $L = '-L';
+ $L = '-libpath:' if $^O eq 'MSWin32' && $Config{cc} =~ /^cl/i;
+
if (-d "$Config{installarchlib}/CORE")
{
- $libdir = "-L$Config{installarchlib}/CORE";
+ $libdir = "$L$Config{installarchlib}/CORE";
$incdir = "-I$Config{installarchlib}/CORE";
}
else
{
- $libdir = "-L.. -L.";
+ $libdir = "$L.. $L.";
$incdir = "-I.. -I.";
}
- $libdir .= " -L$options->{L}" if (defined($options->{L}));
+ $libdir .= " $L$options->{L}" if (defined($options->{L}));
$incdir .= " -I$options->{L}" if (defined($options->{L}));
my $linkargs = '';
+ my $dynaloader = '';
+ my $optimize = '';
+ my $flags = '';
if (!grep(/^-[cS]$/, @args))
{
- my $lperl = $^O eq 'os2' ? '-llibperl' : '-lperl';
- my $flags = $type eq 'dynamic' ? $Config{lddlflags} : $Config{ldflags};
- $linkargs = "$flags $libdir $lperl @Config{libs}";
+ my $lperl = $^O eq 'os2' ? '-llibperl'
+ : $^O eq 'MSWin32' ? "$Config{archlibexp}\\CORE\\$Config{libperl}"
+ : '-lperl';
+ ($lperl = $Config{libperl}) =~ s/lib(.*)\Q$Config{_a}\E/-l$1/
+ if($^O eq 'cygwin');
+
+ $optimize = $Config{'optimize'} =~ /-O\d/ ? '' : $Config{'optimize'};
+
+ $flags = $type eq 'dynamic' ? $Config{lddlflags} : $Config{ldflags};
+ $linkargs = "$flags $libdir $lperl @Config{libs}";
+ $linkargs = "/link $linkargs" if $^O eq 'MSWin32' && $Config{cc} =~ /^cl/i;
}
- my @sharedobjects = _getSharedObjects($sourceprog);
+ my $libs = _getSharedObjects($sourceprog);
+ @$libs = grep { !(/DynaLoader\.a$/ && ($dynaloader = $_)) } @$libs
+ if($^O eq 'cygwin');
- my $cccmd =
- "$Config{cc} @Config{qw(ccflags optimize)} $incdir @sharedobjects @args $linkargs";
+ my $args = "@args";
+ if ($^O eq 'MSWin32' && $Config{cc} =~ /^bcc/i) {
+ # BC++ cmd line syntax does not allow space between -[oexz...] and arg
+ $args =~ s/(^|\s+)-([oe])\s+/$1-$2/g;
+ }
+ my $ccflags = $Config{ccflags};
+ $ccflags .= ' -DUSEIMPORTLIB' if $^O eq 'cygwin';
+ my $cccmd = "$Config{cc} $ccflags $optimize $incdir "
+ ."$args $dynaloader $linkargs @$libs";
_print ("$cccmd\n", 36);
_run("$cccmd", 18 );
@@ -324,29 +409,22 @@ sub _getSharedObjects
{
my ($sourceprog) = @_;
my ($tmpfile, $incfile);
- my (@return);
+ my (@sharedobjects, @libraries);
local($") = " -I";
- if ($Config{'osname'} eq 'MSWin32')
- {
- # _addstuff;
- }
- else
- {
- my ($tmpprog);
- ($tmpprog = $sourceprog) =~ s"(.*)[\/\\](.*)"$2";
- $tmpfile = "/tmp/$tmpprog.tst";
- $incfile = "/tmp/$tmpprog.val";
- }
+ my ($tmpprog);
+ ($tmpprog = $sourceprog) =~ s"(.*)[\\/](.*)"$2";
+
+ my $tempdir= File::Spec->tmpdir;
+
+ $tmpfile = "$tempdir/$tmpprog.tst";
+ $incfile = "$tempdir/$tmpprog.val";
my $fd = new FileHandle("> $tmpfile") || die "Couldn't open $tmpfile!\n";
my $fd2 =
new FileHandle("$sourceprog") || die "Couldn't open $sourceprog!\n";
- my $perl = <$fd2>; # strip off header;
-
- print $fd
-<<"EOF";
+ print $fd <<"EOF";
use FileHandle;
my \$fh3 = new FileHandle("> $incfile")
|| die "Couldn't open $incfile\\n";
@@ -360,8 +438,8 @@ EOF
print $fd ( <$fd2> );
close($fd);
- _print("$ -I@INC $tmpfile\n", 36);
- _run("$ -I@INC $tmpfile", 9 );
+ _print("$^X -I@INC $tmpfile\n", 36);
+ _run("$^X -I@INC $tmpfile", 9 );
$fd = new FileHandle ("$incfile");
my @lines = <$fd>;
@@ -372,19 +450,18 @@ EOF
my $line;
my $autolib;
+ my @return;
+
foreach $line (@lines)
{
chomp($line);
+
my ($modname, $modpath) = split(':', $line);
my ($dir, $file) = ($modpath=~ m"(.*)[\\/]($modname)");
-
- if ($autolib = _lookforAuto($dir, $file))
- {
- push(@return, $autolib);
- }
- }
- return(@return);
+ if ($autolib = _lookforAuto($dir, $file)) { push(@return, $autolib); }
+ }
+ return(\@return);
}
sub _maketempfile
@@ -410,34 +487,29 @@ sub _lookforAuto
{
my ($dir, $file) = @_;
- my $relshared;
+ my ($relabs, $relshared);
+ my ($prefix);
my $return;
+ my $sharedextension = $^O =~ /MSWin32|cygwin|os2/i
+ ? $Config{_a} : ".$Config{so}";
+ ($prefix = $file) =~ s"(.*)\.pm"$1";
- ($relshared = $file) =~ s"(.*)\.pm"$1";
+ my ($tmp, $modname) = ($prefix =~ m"(?:(.*)[\\/]){0,1}(.*)"s);
- my ($tmp, $modname) = ($relshared =~ m"(?:(.*)[\\/]){0,1}(.*)"s);
+ $relshared = "$pathsep$prefix$pathsep$modname$sharedextension";
+ $relabs = "$pathsep$prefix$pathsep$modname$Config{_a}";
+ # HACK . WHY DOES _a HAVE A '.'
+ # AND so HAVE NONE??
- $relshared .=
- ($Config{'osname'} eq 'MSWin32')? "\\$modname.dll" : "/$modname.so";
+ my @searchpaths = map("$_${pathsep}auto", @INC);
-
-
- if (-e ($return = "$Config{'installarchlib'}/auto/$relshared") )
- {
- return($return);
- }
- elsif (-e ($return = "$Config{'installsitearch'}/auto/$relshared"))
- {
- return($return);
- }
- elsif (-e ($return = "$dir/arch/auto/$relshared"))
- {
- return($return);
- }
- else
+ my $path;
+ foreach $path (@searchpaths)
{
- return(undef);
+ if (-e ($return = "$path$relshared")) { return($return); }
+ if (-e ($return = "$path$relabs")) { return($return); }
}
+ return(undef);
}
sub _getRegexps # make the appropriate regexps for making executables,
@@ -453,7 +525,6 @@ sub _getRegexps # make the appropriate regexps for making executables,
@$module_ext = ($ENV{PERL_MODULE_EXT})? split(':', $ENV{PERL_MODULE_EXT}) :
('.pm$');
-
_mungeRegexp( $program_ext );
_mungeRegexp( $module_ext );
@@ -469,7 +540,6 @@ sub _mungeRegexp
grep(s:\x00::g, @$regexp);
}
-
sub _error
{
my ($type, @args) = @_;
@@ -530,6 +600,21 @@ sub _checkopts
$_fh = new FileHandle(">> $options->{'log'}") || push(@errors, "ERROR: Couldn't open $options->{'log'}\n");
}
+ if ($options->{'b'} && $options->{'c'})
+ {
+ push(@errors,
+"ERROR: The '-b' and '-c' options are incompatible. The '-c' option specifies
+ a name for the intermediate C code but '-b' generates byte code
+ directly.\n");
+ }
+ if ($options->{'b'} && ($options->{'sav'} || $options->{'gen'}))
+ {
+ push(@errors,
+"ERROR: The '-sav' and '-gen' options are incompatible with the '-b' option.
+ They ask for intermediate C code to be saved by '-b' generates byte
+ code directly.\n");
+ }
+
if (($options->{'c'}) && (@ARGV > 1) && ($options->{'sav'} ))
{
push(@errors,
@@ -541,17 +626,17 @@ sub _checkopts
if (($options->{'o'}) && (@ARGV > 1))
{
push(@errors,
-"ERROR: The '-o' option is incompatible when you have more than one input file!
- (-o explicitly names the resulting executable, hence, with more than
+"ERROR: The '-o' option is incompatible when you have more than one input
+ file! (-o explicitly names the resulting file, hence, with more than
one file the names clash)\n");
}
- if ($options->{'e'} && $options->{'sav'} && !$options->{'o'} &&
+ if ($options->{'e'} && ($options->{'sav'} || $options->{'gen'}) &&
!$options->{'C'})
{
push(@errors,
"ERROR: You need to specify where you are going to save the resulting
- executable or C code, when using '-sav' and '-e'. Use '-o' or '-C'.\n");
+ C code when using '-sav' and '-e'. Use '-C'.\n");
}
if (($options->{'regex'} || $options->{'run'} || $options->{'o'})
@@ -673,20 +758,74 @@ sub _run
my $doreg = (($regflag & $options->{'verbose'}) || $flag == -1);
if ($doreg && !$dolog)
- { system("$command"); }
-
+ {
+ print _interruptrun("$command");
+ }
elsif ($doreg && $dolog)
- { my $text = `$command 2>&1`; print $_fh $text; print STDERR $text;}
+ {
+ my $text = _interruptrun($command);
+ print $_fh $text;
+ print STDERR $text;
+ }
else
- { my $text = `$command 2>&1`; print $_fh $text; }
+ {
+ my $text = _interruptrun($command);
+ print $_fh $text;
+ }
}
else
{
- `$command 2>&1`;
+ _interruptrun($command);
}
return($?);
}
+sub _interruptrun
+{
+ my ($command) = @_;
+ my $pid = open (FD, "$command |");
+
+ local($SIG{HUP}) = sub {
+# kill 9, $pid + 1;
+# HACK... 2>&1 doesn't propogate
+# kill, comment out for quick and dirty
+# process killing of child.
+
+ kill 9, $pid;
+ exit();
+ };
+ local($SIG{INT}) = sub {
+# kill 9, $pid + 1;
+# HACK... 2>&1 doesn't propogate
+# kill, comment out for quick and dirty
+# process killing of child.
+ kill 9, $pid;
+ exit();
+ };
+
+ my $needalarm =
+ ($ENV{'PERLCC_TIMEOUT'} &&
+ $Config{'osname'} ne 'MSWin32' && $command =~ m"^perlc");
+ my $text;
+
+ eval
+ {
+ local($SIG{ALRM}) = sub { die "INFINITE LOOP"; };
+ alarm($ENV{'PERLCC_TIMEOUT'}) if ($needalarm);
+ $text = join('', <FD>);
+ alarm(0) if ($needalarm);
+ };
+
+ if ($@)
+ {
+ eval { kill 'HUP', $pid; };
+ _print("SYSTEM TIMEOUT (infinite loop?)\n", 36);
+ }
+
+ close(FD);
+ return($text);
+}
+
sub _usage
{
_print
@@ -695,6 +834,9 @@ sub _usage
Usage: $0 <file_list>
+WARNING: The whole compiler suite ('perlcc' included) is considered VERY
+experimental. Use for production purposes is strongly discouraged.
+
Flags with arguments
-L < extra library dirs for installation (form of 'dir1:dir2') >
-I < extra include dirs for installation (form of 'dir1:dir2') >
@@ -702,12 +844,14 @@ Usage: $0 <file_list>
-o < explicit name of resulting executable >
-e < to compile 'one liners'. Need executable name (-o) or '-run'>
-regex < rename regex, -regex 's/\.p/\.exe/' compiles a.p to a.exe >
- -verbose < verbose level (1-63, or following letters 'gatfcd' >
+ -verbose < verbose level < 1-63, or following letters 'gatfcd' >
-argv < arguments for the executables to be run via '-run' or '-e' >
Boolean flags
- -gen ( to just generate the c code. Implies '-sav' )
- -sav ( to save intermediate c code, (and executables with '-run'))
+ -b ( to generate byte code )
+ -opt ( to generated optimised C code. May not work in some cases. )
+ -gen ( to just generate the C code. Implies '-sav' )
+ -sav ( to save intermediate C code, (and executables with '-run'))
-run ( to run the compiled program on the fly, as were interpreted.)
-prog ( to indicate that the files on command line are programs )
-mod ( to indicate that the files on command line are modules )
@@ -785,8 +929,9 @@ Adds directories inside B<include_directories> to the compilation command.
=item -C < c_code_name >
-Explicitly gives the name B<c_code_name> to the generated c code which is to
-be compiled. Can only be used if compiling one file on the command line.
+Explicitly gives the name B<c_code_name> to the generated file containing
+the C code which is to be compiled. Can only be used if compiling one file
+on the command line.
=item -o < executable_name >
@@ -801,6 +946,20 @@ in one go (see B<-run>); giving the B<-o> flag saves the resultant executable,
rather than throwing it away. Use '-argv' to pass arguments to the executable
created.
+=item -b
+
+Generates bytecode instead of C code.
+
+=item -opt
+
+Uses the optimized C backend (C<B::CC>)rather than the simple C backend
+(C<B::C>). Beware that the optimized C backend creates very large
+switch structures and structure initializations. Many C compilers
+find it a challenge to compile the resulting output in finite amounts
+of time. Many Perl features such as C<goto LABEL> are also not
+supported by the optimized C backend. The simple C backend should
+work in more instances, but can only offer modest speed increases.
+
=item -regex <rename_regex>
Gives a rule B<rename_regex> - which is a legal perl regular expression - to
@@ -808,11 +967,12 @@ create executable file names.
=item -verbose <verbose_level>
-Show exactly what steps perlcc is taking to compile your code. You can change
-the verbosity level B<verbose_level> much in the same way that the '-D' switch
-changes perl's debugging level, by giving either a number which is the sum of
-bits you want or a list of letters representing what you wish to see. Here are
-the verbosity levels so far :
+Show exactly what steps perlcc is taking to compile your code. You can
+change the verbosity level B<verbose_level> much in the same way that
+the C<-D> switch changes perl's debugging level, by giving either a
+number which is the sum of bits you want or a list of letters
+representing what you wish to see. Here are the verbosity levels so
+far :
Bit 1(g): Code Generation Errors to STDERR
Bit 2(a): Compilation Errors to STDERR
@@ -839,14 +999,14 @@ manually.
=item -argv <arguments>
-In combination with '-run' or '-e', tells perlcc to run the resulting
+In combination with C<-run> or C<-e>, tells perlcc to run the resulting
executable with the string B<arguments> as @ARGV.
=item -sav
Tells perl to save the intermediate C code. Usually, this C code is the name
of the perl code, plus '.c'; 'perlcode.p' gets generated in 'perlcode.p.c',
-for example. If used with the '-e' operator, you need to tell perlcc where to
+for example. If used with the C<-e> operator, you need to tell perlcc where to
save resulting executables.
=item -gen
@@ -887,7 +1047,7 @@ indicate a perl program, and:
.pm$
indicate a library, for the purposes of creating executables. And furthermore,
-by default, these extensions will be replaced (and dropped ) in the process of
+by default, these extensions will be replaced (and dropped) in the process of
creating an executable.
To change the extensions which are programs, and which are modules, set the
@@ -921,6 +1081,14 @@ setenv PERL_SCRIPT_EXT '\.\.\.\.\.'
which would have the effect of compiling ANYTHING (except what is in
PERL_MODULE_EXT) into an executable with 5 less characters in its name.
+The PERLCC_OPTS environment variable can be set to the default flags
+that must be used by the compiler.
+
+The PERLCC_TIMEOUT environment variable can be set to the number of
+seconds to wait for the backends before giving up. This is sometimes
+necessary to avoid some compilers taking forever to compile the
+generated output. May not work on Windows and similar platforms.
+
=head1 FILES
'perlcc' uses a temporary file when you use the B<-e> option to evaluate
@@ -932,8 +1100,14 @@ perlc$$
=head1 BUGS
+The whole compiler suite (C<perlcc> included) should be considered very
+experimental. Use for production purposes is strongly discouraged.
+
perlcc currently cannot compile shared objects on Win32. This should be fixed
-by perl5.005.
+in future.
+
+Bugs in the various compiler backends still exist, and are perhaps too
+numerous to list here.
=cut
diff --git a/contrib/perl5/utils/perldoc.PL b/contrib/perl5/utils/perldoc.PL
index 2633510..32421d7 100644
--- a/contrib/perl5/utils/perldoc.PL
+++ b/contrib/perl5/utils/perldoc.PL
@@ -30,39 +30,49 @@ $Config{startperl}
eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
if 0;
+use warnings;
use strict;
+
+# make sure creat()s are neither too much nor too little
+INIT { eval { umask(0077) } } # doubtless someone has no mask
+
my \@pagers = ();
push \@pagers, "$Config{'pager'}" if -x "$Config{'pager'}";
+
!GROK!THIS!
# In the following, perl variables are not expanded during extraction.
print OUT <<'!NO!SUBS!';
+use Fcntl; # for sysopen
+use Getopt::Std;
+use Config '%Config';
+
#
# Perldoc revision #1 -- look up a piece of documentation in .pod format that
# is embedded in the perl installation tree.
#
-# This is not to be confused with Tom Christianson's perlman, which is a
+# This is not to be confused with Tom Christiansen's perlman, which is a
# man replacement, written in perl. This perldoc is strictly for reading
# the perl manuals, though it too is written in perl.
+#
+# Massive security and correctness patches applied to this
+# noisome program by Tom Christiansen Sat Mar 11 15:22:33 MST 2000
-if(@ARGV<1) {
+if (@ARGV<1) {
my $me = $0; # Editing $0 is unportable
$me =~ s,.*/,,;
die <<EOF;
-Usage: $me [-h] [-r] [-i] [-v] [-t] [-u] [-m] [-l] [-F] [-X] PageName|ModuleName|ProgramName
+Usage: $me [-h] [-r] [-i] [-v] [-t] [-u] [-m] [-n program] [-l] [-F] [-X] PageName|ModuleName|ProgramName
$me -f PerlFunc
$me -q FAQKeywords
The -h option prints more help. Also try "perldoc perldoc" to get
-aquainted with the system.
+acquainted with the system.
EOF
}
-use Getopt::Std;
-use Config '%Config';
-
my @global_found = ();
my $global_target = "";
@@ -82,22 +92,24 @@ perldoc [options] -q FAQRegex
Options:
-h Display this help message
-r Recursive search (slow)
- -i Ignore case
+ -i Ignore case
-t Display pod using pod2text instead of pod2man and nroff
(-t is the default on win32)
-u Display unformatted pod text
-m Display module's file in its entirety
+ -n Specify replacement for nroff
-l Display the module's file name
-F Arguments are file names, not modules
-v Verbosely describe what's going on
-X use index if present (looks for pod.idx at $Config{archlib})
-q Search the text of questions (not answers) in perlfaq[1-9]
+ -U Run in insecure mode (superuser only)
PageName|ModuleName...
- is the name of a piece of documentation that you want to look at. You
+ is the name of a piece of documentation that you want to look at. You
may either give a descriptive name of the page (as in the case of
- `perlfunc') the name of a module, either like `Term::Info',
- `Term/Info', the partial name of a module, like `info', or
+ `perlfunc') the name of a module, either like `Term::Info',
+ `Term/Info', the partial name of a module, like `info', or
`makemaker', or the name of a program, like `perldoc'.
BuiltinFunction
@@ -108,20 +120,20 @@ FAQRegex
is a regex. Will search perlfaq[1-9] for and extract any
questions that match.
-Any switches in the PERLDOC environment variable will be used before the
+Any switches in the PERLDOC environment variable will be used before the
command line arguments. The optional pod index file contains a list of
filenames, one per line.
EOF
}
-if( defined $ENV{"PERLDOC"} ) {
+if (defined $ENV{"PERLDOC"}) {
require Text::ParseWords;
unshift(@ARGV, Text::ParseWords::shellwords($ENV{"PERLDOC"}));
}
!NO!SUBS!
-my $getopts = "mhtluvriFf:Xq:";
+my $getopts = "mhtluvriFf:Xq:n:U";
print OUT <<"!GET!OPTS!";
use vars qw( @{[map "\$opt_$_", ($getopts =~ /\w/g)]} );
@@ -133,75 +145,105 @@ print OUT <<'!NO!SUBS!';
usage if $opt_h;
+# refuse to run if we should be tainting and aren't
+# (but regular users deserve protection too, though!)
+if (!($Is_VMS || $Is_MSWin32 || $Is_Dos) && ($> == 0 || $< == 0)
+ && !am_taint_checking())
+{{
+ if ($opt_U) {
+ my $id = eval { getpwnam("nobody") };
+ $id = eval { getpwnam("nouser") } unless defined $id;
+ $id = -2 unless defined $id;
+ eval {
+ $> = $id; # must do this one first!
+ $< = $id;
+ };
+ last if !$@ && $< && $>;
+ }
+ die "Superuser must not run $0 without security audit and taint checks.\n";
+}}
+
+$opt_n = "nroff" if !$opt_n;
+
my $podidx;
-if( $opt_X ) {
+if ($opt_X) {
$podidx = "$Config{'archlib'}/pod.idx";
$podidx = "" unless -f $podidx && -r _ && -M _ <= 7;
}
-if( (my $opts = do{ local $^W; $opt_t + $opt_u + $opt_m + $opt_l }) > 1) {
+if ((my $opts = do{ no warnings; $opt_t + $opt_u + $opt_m + $opt_l }) > 1) {
usage("only one of -t, -u, -m or -l")
-} elsif ($Is_MSWin32 || $Is_Dos) {
- $opt_t = 1 unless $opts
+}
+elsif ($Is_MSWin32
+ || $Is_Dos
+ || !($ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i))
+{
+ $opt_t = 1 unless $opts;
}
if ($opt_t) { require Pod::Text; import Pod::Text; }
my @pages;
if ($opt_f) {
- @pages = ("perlfunc");
-} elsif ($opt_q) {
- @pages = ("perlfaq1" .. "perlfaq9");
-} else {
- @pages = @ARGV;
+ @pages = ("perlfunc");
+}
+elsif ($opt_q) {
+ @pages = ("perlfaq1" .. "perlfaq9");
+}
+else {
+ @pages = @ARGV;
}
# Does this look like a module or extension directory?
if (-f "Makefile.PL") {
- # Add ., lib and blib/* libs to @INC (if they exist)
- unshift(@INC, '.');
- unshift(@INC, 'lib') if -d 'lib';
- require ExtUtils::testlib;
-}
+ # Add ., lib to @INC (if they exist)
+ eval q{ use lib qw(. lib); 1; } or die;
+ # don't add if superuser
+ if ($< && $>) { # don't be looking too hard now!
+ eval q{ use blib; 1 } or die;
+ }
+}
sub containspod {
my($file, $readit) = @_;
- return 1 if !$readit && $file =~ /\.pod$/i;
+ return 1 if !$readit && $file =~ /\.pod\z/i;
local($_);
- open(TEST,"<$file");
- while(<TEST>) {
- if(/^=head/) {
- close(TEST);
+ open(TEST,"<", $file) or die "Can't open $file: $!";
+ while (<TEST>) {
+ if (/^=head/) {
+ close(TEST) or die "Can't close $file: $!";
return 1;
}
}
- close(TEST);
+ close(TEST) or die "Can't close $file: $!";
return 0;
}
sub minus_f_nocase {
my($dir,$file) = @_;
- my $path = join('/',$dir,$file);
+ my $path = join('/',$dir,$file); # XXX: dirseps
return $path if -f $path and -r _;
if (!$opt_i or $Is_VMS or $Is_MSWin32 or $Is_Dos or $^O eq 'os2') {
- # on a case-forgiving file system or if case is important
+ # on a case-forgiving file system or if case is important
# that is it all we can do
warn "Ignored $path: unreadable\n" if -f _;
return '';
}
local *DIR;
+ # this is completely wicked. don't mess with $", and if
+ # you do, don't assume / is the dirsep!
local($")="/";
my @p = ($dir);
my($p,$cip);
- foreach $p (split(/\//, $file)){
+ foreach $p (split(m!/!, $file)){ # XXX: dirseps
my $try = "@p/$p";
stat $try;
- if (-d _){
+ if (-d _) {
push @p, $p;
if ( $p eq $global_target) {
- my $tmp_path = join ('/', @p);
+ my $tmp_path = join ('/', @p); # XXX: dirseps
my $path_f = 0;
for (@global_found) {
$path_f = 1 if $_ eq $tmp_path;
@@ -209,21 +251,24 @@ sub minus_f_nocase {
push (@global_found, $tmp_path) unless $path_f;
print STDERR "Found as @p but directory\n" if $opt_v;
}
- } elsif (-f _ && -r _) {
+ }
+ elsif (-f _ && -r _) {
return $try;
- } elsif (-f _) {
+ }
+ elsif (-f _) {
warn "Ignored $try: unreadable\n";
- } else {
+ }
+ elsif (-d "@p") {
my $found=0;
my $lcp = lc $p;
- opendir DIR, "@p";
+ opendir DIR, "@p" or die "opendir @p: $!";
while ($cip=readdir(DIR)) {
if (lc $cip eq $lcp){
$found++;
last;
}
}
- closedir DIR;
+ closedir DIR or die "closedir @p: $!";
return "" unless $found;
push @p, $cip;
return "@p" if -f "@p" and -r _;
@@ -232,13 +277,15 @@ sub minus_f_nocase {
}
return "";
}
-
+
sub check_file {
my($dir,$file) = @_;
+ return "" if length $dir and not -d $dir;
if ($opt_m) {
return minus_f_nocase($dir,$file);
- } else {
+ }
+ else {
my $path = minus_f_nocase($dir,$file);
return $path if length $path and containspod($path);
}
@@ -255,35 +302,38 @@ sub searchfor {
my $ret;
my $i;
my $dir;
- $global_target = (split('/', $s))[-1];
+ $global_target = (split(m!/!, $s))[-1]; # XXX: dirseps
for ($i=0; $i<@dirs; $i++) {
$dir = $dirs[$i];
- ($dir = VMS::Filespec::unixpath($dir)) =~ s!/$!! if $Is_VMS;
+ ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if $Is_VMS;
if ( ( $ret = check_file $dir,"$s.pod")
or ( $ret = check_file $dir,"$s.pm")
or ( $ret = check_file $dir,$s)
or ( $Is_VMS and
$ret = check_file $dir,"$s.com")
- or ( $^O eq 'os2' and
+ or ( $^O eq 'os2' and
$ret = check_file $dir,"$s.cmd")
or ( ($Is_MSWin32 or $Is_Dos or $^O eq 'os2') and
$ret = check_file $dir,"$s.bat")
or ( $ret = check_file "$dir/pod","$s.pod")
or ( $ret = check_file "$dir/pod",$s)
+ or ( $ret = check_file "$dir/pods","$s.pod")
+ or ( $ret = check_file "$dir/pods",$s)
) {
return $ret;
}
-
+
if ($recurse) {
- opendir(D,$dir);
- my @newdirs = map "$dir/$_", grep {
- not /^\.\.?$/ and
- not /^auto$/ and # save time! don't search auto dirs
- -d "$dir/$_"
+ opendir(D,$dir) or die "Can't opendir $dir: $!";
+ my @newdirs = map "$dir/$_", grep { # XXX: dirseps
+ not /^\.\.?\z/s and
+ not /^auto\z/s and # save time! don't search auto dirs
+ -d "$dir/$_" # XXX: dirseps
} readdir D;
- closedir(D);
+ closedir(D) or die "Can't closedir $dir: $!";
next unless @newdirs;
- @newdirs = map((s/.dir$//,$_)[1],@newdirs) if $Is_VMS;
+ # what a wicked map!
+ @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if $Is_VMS;
print STDERR "Also looking in @newdirs\n" if $opt_v;
push(@dirs,@newdirs);
}
@@ -291,73 +341,155 @@ sub searchfor {
return ();
}
+sub filter_nroff {
+ my @data = split /\n{2,}/, shift;
+ shift @data while @data and $data[0] !~ /\S/; # Go to header
+ shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
+ pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
+ # 28/Jan/99 perl 5.005, patch 53 1
+ join "\n\n", @data;
+}
+
+sub printout {
+ my ($file, $tmp, $filter) = @_;
+ my $err;
+
+ if ($opt_t) {
+ # why was this append?
+ sysopen(OUT, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600)
+ or die ("Can't open $tmp: $!");
+ Pod::Text->new()->parse_from_file($file,\*OUT);
+ close OUT or die "can't close $tmp: $!";
+ }
+ elsif (not $opt_u) {
+ my $cmd = "pod2man --lax $file | $opt_n -man";
+ $cmd .= " | col -x" if $^O =~ /hpux/;
+ my $rslt = `$cmd`;
+ $rslt = filter_nroff($rslt) if $filter;
+ unless (($err = $?)) {
+ # why was this append?
+ sysopen(TMP, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600)
+ or die "Can't open $tmp: $!";
+ print TMP $rslt
+ or die "Can't print $tmp: $!";
+ close TMP
+ or die "Can't close $tmp: $!";
+ }
+ }
+ if ($opt_u or $err or -z $tmp) { # XXX: race with -z
+ # why was this append?
+ sysopen(OUT, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600)
+ or die "Can't open $tmp: $!";
+ open(IN,"<", $file) or die("Can't open $file: $!");
+ my $cut = 1;
+ local $_;
+ while (<IN>) {
+ $cut = $1 eq 'cut' if /^=(\w+)/;
+ next if $cut;
+ print OUT
+ or die "Can't print $tmp: $!";
+ }
+ close IN or die "Can't close $file: $!";
+ close OUT or die "Can't close $tmp: $!";
+ }
+}
+
+sub page {
+ my ($tmp, $no_tty, @pagers) = @_;
+ if ($no_tty) {
+ open(TMP,"<", $tmp) or die "Can't open $tmp: $!";
+ local $_;
+ while (<TMP>) {
+ print or die "Can't print to stdout: $!";
+ }
+ close TMP or die "Can't close while $tmp: $!";
+ }
+ else {
+ foreach my $pager (@pagers) {
+ last if system("$pager $tmp") == 0;
+ }
+ }
+}
+
+sub cleanup {
+ my @files = @_;
+ for (@files) {
+ if ($Is_VMS) {
+ 1 while unlink($_); # XXX: expect failure
+ } else {
+ unlink($_); # or die "Can't unlink $_: $!";
+ }
+ }
+}
+
my @found;
foreach (@pages) {
- if ($podidx && open(PODIDX, $podidx)) {
- my $searchfor = $_;
- local($_);
- $searchfor =~ s,::,/,g;
- print STDERR "Searching for '$searchfor' in $podidx\n" if $opt_v;
- while (<PODIDX>) {
- chomp;
- push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?$,i;
- }
- close(PODIDX);
- next;
- }
- print STDERR "Searching for $_\n" if $opt_v;
- # We must look both in @INC for library modules and in PATH
- # for executables, like h2xs or perldoc itself.
- my @searchdirs = @INC;
- if ($opt_F) {
- next unless -r;
- push @found, $_ if $opt_m or containspod($_);
- next;
+ if ($podidx && open(PODIDX, $podidx)) {
+ my $searchfor = $_;
+ $searchfor =~ s,::,/,g; # XXX: dirseps
+ print STDERR "Searching for '$searchfor' in $podidx\n" if $opt_v;
+ local $_;
+ while (<PODIDX>) {
+ chomp;
+ push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i;
}
- unless ($opt_m) {
- if ($Is_VMS) {
- my($i,$trn);
- for ($i = 0; $trn = $ENV{'DCL$PATH'.$i}; $i++) {
- push(@searchdirs,$trn);
- }
- push(@searchdirs,'perl_root:[lib.pod]') # installed pods
- } else {
- push(@searchdirs, grep(-d, split($Config{path_sep},
- $ENV{'PATH'})));
+ close(PODIDX) or die "Can't close $podidx: $!";
+ next;
+ }
+ print STDERR "Searching for $_\n" if $opt_v;
+ # We must look both in @INC for library modules and in PATH
+ # for executables, like h2xs or perldoc itself.
+ my @searchdirs = @INC;
+ if ($opt_F) {
+ next unless -r;
+ push @found, $_ if $opt_m or containspod($_);
+ next;
+ }
+ unless ($opt_m) {
+ if ($Is_VMS) {
+ my($i,$trn);
+ for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) {
+ push(@searchdirs,$trn);
}
+ push(@searchdirs,'perl_root:[lib.pod]') # installed pods
}
- my @files = searchfor(0,$_,@searchdirs);
- if( @files ) {
- print STDERR "Found as @files\n" if $opt_v;
- } else {
- # no match, try recursive search
-
- @searchdirs = grep(!/^\.$/,@INC);
-
- @files= searchfor(1,$_,@searchdirs) if $opt_r;
- if( @files ) {
- print STDERR "Loosely found as @files\n" if $opt_v;
- } else {
- print STDERR "No documentation found for \"$_\".\n";
- if (@global_found) {
- print STDERR "However, try\n";
- for my $dir (@global_found) {
- opendir(DIR, $dir) or die "$!";
- while (my $file = readdir(DIR)) {
- next if ($file =~ /^\./);
- $file =~ s/\.(pm|pod)$//;
- print STDERR "\tperldoc $_\::$file\n";
- }
- closedir DIR;
- }
- }
+ else {
+ push(@searchdirs, grep(-d, split($Config{path_sep},
+ $ENV{'PATH'})));
+ }
+ }
+ my @files = searchfor(0,$_,@searchdirs);
+ if (@files) {
+ print STDERR "Found as @files\n" if $opt_v;
+ }
+ else {
+ # no match, try recursive search
+ @searchdirs = grep(!/^\.\z/s,@INC);
+ @files= searchfor(1,$_,@searchdirs) if $opt_r;
+ if (@files) {
+ print STDERR "Loosely found as @files\n" if $opt_v;
+ }
+ else {
+ print STDERR "No documentation found for \"$_\".\n";
+ if (@global_found) {
+ print STDERR "However, try\n";
+ for my $dir (@global_found) {
+ opendir(DIR, $dir) or die "opendir $dir: $!";
+ while (my $file = readdir(DIR)) {
+ next if ($file =~ /^\./s);
+ $file =~ s/\.(pm|pod)\z//; # XXX: badfs
+ print STDERR "\tperldoc $_\::$file\n";
+ }
+ closedir DIR or die "closedir $dir: $!";
}
+ }
}
- push(@found,@files);
+ }
+ push(@found,@files);
}
-if(!@found) {
- exit ($Is_VMS ? 98962 : 1);
+if (!@found) {
+ exit ($Is_VMS ? 98962 : 1);
}
if ($opt_l) {
@@ -368,175 +500,181 @@ if ($opt_l) {
my $lines = $ENV{LINES} || 24;
my $no_tty;
-if( ! -t STDOUT ) { $no_tty = 1 }
+if (! -t STDOUT) { $no_tty = 1 }
+END { close(STDOUT) || die "Can't close STDOUT: $!" }
+
+# until here we could simply exit or die
+# now we create temporary files that we have to clean up
+# namely $tmp, $buffer
+# that's because you did it wrong, should be descriptor based --tchrist
my $tmp;
+my $buffer;
if ($Is_MSWin32) {
- $tmp = "$ENV{TEMP}\\perldoc1.$$";
- push @pagers, qw( more< less notepad );
- unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
-} elsif ($Is_VMS) {
- $tmp = 'Sys$Scratch:perldoc.tmp1_'.$$;
- push @pagers, qw( most more less type/page );
-} elsif ($Is_Dos) {
- $tmp = "$ENV{TEMP}/perldoc1.$$";
- $tmp =~ tr!\\/!//!s;
- push @pagers, qw( less.exe more.com< );
- unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
-} else {
- if ($^O eq 'os2') {
- require POSIX;
- $tmp = POSIX::tmpnam();
- unshift @pagers, 'less', 'cmd /c more <';
- } else {
- $tmp = "/tmp/perldoc1.$$";
- }
- push @pagers, qw( more less pg view cat );
- unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ $tmp = "$ENV{TEMP}\\perldoc1.$$";
+ $buffer = "$ENV{TEMP}\\perldoc1.b$$";
+ push @pagers, qw( more< less notepad );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ for (@found) { s,/,\\,g }
+}
+elsif ($Is_VMS) {
+ $tmp = 'Sys$Scratch:perldoc.tmp1_'.$$;
+ $buffer = 'Sys$Scratch:perldoc.tmp1_b'.$$;
+ push @pagers, qw( most more less type/page );
+}
+elsif ($Is_Dos) {
+ $tmp = "$ENV{TEMP}/perldoc1.$$";
+ $buffer = "$ENV{TEMP}/perldoc1.b$$";
+ $tmp =~ tr!\\/!//!s;
+ $buffer =~ tr!\\/!//!s;
+ push @pagers, qw( less.exe more.com< );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+}
+else {
+ if ($^O eq 'os2') {
+ require POSIX;
+ $tmp = POSIX::tmpnam();
+ $buffer = POSIX::tmpnam();
+ unshift @pagers, 'less', 'cmd /c more <';
+ }
+ else {
+ # XXX: this is not secure, because it doesn't open it
+ ($tmp, $buffer) = eval { require POSIX }
+ ? (POSIX::tmpnam(), POSIX::tmpnam() )
+ : ("/tmp/perldoc1.$$", "/tmp/perldoc1.b$$" );
+ }
+ push @pagers, qw( more less pg view cat );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
}
unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
+# make sure cleanup called
+eval q{
+ sub END { cleanup($tmp, $buffer) }
+ 1;
+} || die;
+eval q{ use sigtrap qw(die INT TERM HUP QUIT) };
+
if ($opt_m) {
- foreach my $pager (@pagers) {
- system("$pager @found") or exit;
- }
- if ($Is_VMS) { eval 'use vmsish qw(status exit); exit $?' }
- exit 1;
-}
+ foreach my $pager (@pagers) {
+ if (system($pager, @found) == 0) {
+ exit;
+ }
+ }
+ if ($Is_VMS) {
+ eval q{
+ use vmsish qw(status exit);
+ exit $?;
+ 1;
+ } or die;
+ }
+ exit(1);
+}
+my @pod;
if ($opt_f) {
- my $perlfunc = shift @found;
- open(PFUNC, $perlfunc) or die "Can't open $perlfunc: $!";
-
- # Functions like -r, -e, etc. are listed under `-X'.
- my $search_string = ($opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/) ? 'I<-X' : $opt_f ;
-
- # Skip introduction
- while (<PFUNC>) {
- last if /^=head2 Alphabetical Listing of Perl Functions/;
- }
-
- # Look for our function
- my $found = 0;
- my @pod;
- while (<PFUNC>) {
- if (/^=item\s+\Q$search_string\E\b/o) {
- $found = 1;
- } elsif (/^=item/) {
- last if $found > 1;
- }
- next unless $found;
- push @pod, $_;
- ++$found if /^\w/; # found descriptive text
- }
- if (@pod) {
- if ($opt_t) {
- open(FORMATTER, "| pod2text") || die "Can't start filter";
- print FORMATTER "=over 8\n\n";
- print FORMATTER @pod;
- print FORMATTER "=back\n";
- close(FORMATTER);
- } elsif (@pod < $lines-2) {
- print @pod;
- } else {
- foreach my $pager (@pagers) {
- open (PAGER, "| $pager") or next;
- print PAGER @pod ;
- close(PAGER) or next;
- last;
- }
- }
- } else {
- die "No documentation for perl function `$opt_f' found\n";
- }
- exit;
+ my $perlfunc = shift @found;
+ open(PFUNC, "<", $perlfunc)
+ or die("Can't open $perlfunc: $!");
+
+ # Functions like -r, -e, etc. are listed under `-X'.
+ my $search_string = ($opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
+ ? 'I<-X' : $opt_f ;
+
+ # Skip introduction
+ local $_;
+ while (<PFUNC>) {
+ last if /^=head2 Alphabetical Listing of Perl Functions/;
+ }
+
+ # Look for our function
+ my $found = 0;
+ my $inlist = 0;
+ while (<PFUNC>) {
+ if (/^=item\s+\Q$search_string\E\b/o) {
+ $found = 1;
+ }
+ elsif (/^=item/) {
+ last if $found > 1 and not $inlist;
+ }
+ next unless $found;
+ if (/^=over/) {
+ ++$inlist;
+ }
+ elsif (/^=back/) {
+ --$inlist;
+ }
+ push @pod, $_;
+ ++$found if /^\w/; # found descriptive text
+ }
+ if (!@pod) {
+ die "No documentation for perl function `$opt_f' found\n";
+ }
+ close PFUNC or die "Can't open $perlfunc: $!";
}
if ($opt_q) {
- local @ARGV = @found; # I'm lazy, sue me.
- my $found = 0;
- my %found_in;
- my @pod;
-
- while (<>) {
- if (/^=head2\s+.*(?:$opt_q)/oi) {
- $found = 1;
- push @pod, "=head1 Found in $ARGV\n\n" unless $found_in{$ARGV}++;
- } elsif (/^=head2/) {
- $found = 0;
- }
- next unless $found;
- push @pod, $_;
- }
-
- if (@pod) {
- if ($opt_t) {
- open(FORMATTER, "| pod2text") || die "Can't start filter";
- print FORMATTER "=over 8\n\n";
- print FORMATTER @pod;
- print FORMATTER "=back\n";
- close(FORMATTER);
- } elsif (@pod < $lines-2) {
- print @pod;
- } else {
- foreach my $pager (@pagers) {
- open (PAGER, "| $pager") or next;
- print PAGER @pod ;
- close(PAGER) or next;
- last;
- }
- }
- } else {
- die "No documentation for perl FAQ keyword `$opt_q' found\n";
- }
- exit;
+ local @ARGV = @found; # I'm lazy, sue me.
+ my $found = 0;
+ my %found_in;
+ my $rx = eval { qr/$opt_q/ } or die <<EOD;
+Invalid regular expression '$opt_q' given as -q pattern:
+ $@
+Did you mean \\Q$opt_q ?
+
+EOD
+
+ for (@found) { die "invalid file spec: $!" if /[<>|]/ }
+ local $_;
+ while (<>) {
+ if (/^=head2\s+.*(?:$opt_q)/oi) {
+ $found = 1;
+ push @pod, "=head1 Found in $ARGV\n\n" unless $found_in{$ARGV}++;
+ }
+ elsif (/^=head2/) {
+ $found = 0;
+ }
+ next unless $found;
+ push @pod, $_;
+ }
+ if (!@pod) {
+ die("No documentation for perl FAQ keyword `$opt_q' found\n");
+ }
}
-foreach (@found) {
+my $filter;
+
+if (@pod) {
+ sysopen(TMP, $buffer, O_WRONLY | O_EXCL | O_CREAT)
+ or die("Can't open $buffer: $!");
+ print TMP "=over 8\n\n";
+ print TMP @pod or die "Can't print $buffer: $!";
+ print TMP "=back\n";
+ close TMP or die "Can't close $buffer: $!";
+ @found = $buffer;
+ $filter = 1;
+}
- my $err;
- if($opt_t) {
- open(TMP,">>$tmp");
- Pod::Text::pod2text($_,*TMP);
- close(TMP);
- } elsif(not $opt_u) {
- my $cmd = "pod2man --lax $_ | nroff -man";
- $cmd .= " | col -x" if $^O =~ /hpux/;
- my $rslt = `$cmd`;
- unless(($err = $?)) {
- open(TMP,">>$tmp");
- print TMP $rslt;
- close TMP;
- }
- }
-
- if( $opt_u or $err or -z $tmp) {
- open(OUT,">>$tmp");
- open(IN,"<$_");
- my $cut = 1;
- while (<IN>) {
- $cut = $1 eq 'cut' if /^=(\w+)/;
- next if $cut;
- print OUT;
- }
- close(IN);
- close(OUT);
- }
+foreach (@found) {
+ printout($_, $tmp, $filter);
}
+page($tmp, $no_tty, @pagers);
-if( $no_tty ) {
- open(TMP,"<$tmp");
- print while <TMP>;
- close(TMP);
-} else {
- foreach my $pager (@pagers) {
- system("$pager $tmp") or last;
- }
+exit;
+
+sub is_tainted {
+ my $arg = shift;
+ my $nada = substr($arg, 0, 0); # zero-length
+ local $@; # preserve caller's version
+ eval { eval "# $nada" };
+ return length($@) != 0;
}
-1 while unlink($tmp); #Possibly pointless VMSism
+sub am_taint_checking {
+ my($k,$v) = each %ENV;
+ return is_tainted($v);
+}
-exit 0;
__END__
@@ -616,11 +754,20 @@ The B<-X> option looks for a entry whose basename matches the name given on the
command line in the file C<$Config{archlib}/pod.idx>. The pod.idx file should
contain fully qualified filenames, one per line.
+=item B<-U> run insecurely
+
+Because B<perldoc> does not run properly tainted, and is known to
+have security issues, it will not normally execute as the superuser.
+If you use the B<-U> flag, it will do so, but only after setting
+the effective and real IDs to nobody's or nouser's account, or -2
+if unavailable. If it cannot relinguish its privileges, it will not
+run.
+
=item B<PageName|ModuleName|ProgramName>
The item you want to look up. Nested modules (such as C<File::Basename>)
are specified either as C<File::Basename> or C<File/Basename>. You may also
-give a descriptive name of a page, such as C<perlfunc>. You make also give a
+give a descriptive name of a page, such as C<perlfunc>. You may also give a
partial or wrong-case name, such as "basename" for "File::Basename", but
this will be slower, if there is more then one page with the same partial
name, you will only get the first one.
@@ -629,7 +776,7 @@ name, you will only get the first one.
=head1 ENVIRONMENT
-Any switches in the C<PERLDOC> environment variable will be used before the
+Any switches in the C<PERLDOC> environment variable will be used before the
command line arguments. C<perldoc> also searches directories
specified by the C<PERL5LIB> (or C<PERLLIB> if C<PERL5LIB> is not
defined) and C<PATH> environment variables.
@@ -639,29 +786,48 @@ preference, the pager defined in C<PERLDOC_PAGER>, C<MANPAGER>, or
C<PAGER> before trying to find a pager on its own. (C<MANPAGER> is not
used if C<perldoc> was told to display plain text or unformatted pod.)
+One useful value for C<PERLDOC_PAGER> is C<less -+C -E>.
+
+=head1 VERSION
+
+This is perldoc v2.01.
+
=head1 AUTHOR
Kenneth Albanowski <kjahds@kjahds.com>
-Minor updates by Andy Dougherty <doughera@lafcol.lafayette.edu>
+Minor updates by Andy Dougherty <doughera@lafcol.lafayette.edu>,
+and others.
=cut
#
+# Version 2.02: Mon Mar 13 18:03:04 MST 2000
+# Tom Christiansen <tchrist@perl.com>
+# Added -U insecurity option
+# Version 2.01: Sat Mar 11 15:22:33 MST 2000
+# Tom Christiansen <tchrist@perl.com>, querulously.
+# Security and correctness patches.
+# What a twisted bit of distasteful spaghetti code.
+# Version 2.0: ????
+# Version 1.15: Tue Aug 24 01:50:20 EST 1999
+# Charles Wilson <cwilson@ece.gatech.edu>
+# changed /pod/ directory to /pods/ for cygwin
+# to support cygwin/win32
# Version 1.14: Wed Jul 15 01:50:20 EST 1998
# Robin Barker <rmb1@cise.npl.co.uk>
# -strict, -w cleanups
# Version 1.13: Fri Feb 27 16:20:50 EST 1997
-# Gurusamy Sarathy <gsar@umich.edu>
+# Gurusamy Sarathy <gsar@activestate.com>
# -doc tweaks for -F and -X options
# Version 1.12: Sat Apr 12 22:41:09 EST 1997
-# Gurusamy Sarathy <gsar@umich.edu>
+# Gurusamy Sarathy <gsar@activestate.com>
# -various fixes for win32
# Version 1.11: Tue Dec 26 09:54:33 EST 1995
# Kenneth Albanowski <kjahds@kjahds.com>
# -added Charles Bailey's further VMS patches, and -u switch
# -added -t switch, with pod2text support
-#
+#
# Version 1.10: Thu Nov 9 07:23:47 EST 1995
# Kenneth Albanowski <kjahds@kjahds.com>
# -added VMS support
diff --git a/contrib/perl5/warnings.h b/contrib/perl5/warnings.h
new file mode 100644
index 0000000..a2bcaeb
--- /dev/null
+++ b/contrib/perl5/warnings.h
@@ -0,0 +1,117 @@
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by warnings.pl
+ Any changes made here will be lost!
+*/
+
+
+#define Off(x) ((x) / 8)
+#define Bit(x) (1 << ((x) % 8))
+#define IsSet(a, x) ((a)[Off(x)] & Bit(x))
+
+
+#define G_WARN_OFF 0 /* $^W == 0 */
+#define G_WARN_ON 1 /* -w flag and $^W != 0 */
+#define G_WARN_ALL_ON 2 /* -W flag */
+#define G_WARN_ALL_OFF 4 /* -X flag */
+#define G_WARN_ONCE 8 /* set if 'once' ever enabled */
+#define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
+
+#define pWARN_STD Nullsv
+#define pWARN_ALL (Nullsv+1) /* use warnings 'all' */
+#define pWARN_NONE (Nullsv+2) /* no warnings 'all' */
+
+#define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
+ (x) == pWARN_NONE)
+
+#define ckDEAD(x) \
+ ( ! specialWARN(PL_curcop->cop_warnings) && \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x+1))
+
+#define ckWARN(x) \
+ ( (PL_curcop->cop_warnings != pWARN_STD && \
+ PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) ) ) \
+ || (PL_curcop->cop_warnings == pWARN_STD && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN2(x,y) \
+ ( (PL_curcop->cop_warnings != pWARN_STD && \
+ PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*y) ) ) \
+ || (PL_curcop->cop_warnings == pWARN_STD && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN_d(x) \
+ (PL_curcop->cop_warnings == pWARN_STD || \
+ PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) ) )
+
+#define ckWARN2_d(x,y) \
+ (PL_curcop->cop_warnings == pWARN_STD || \
+ PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ (IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*y) ) ) )
+
+
+#define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
+#define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
+#define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
+#define isWARN_on(c,x) (IsSet(SvPVX(c), 2*(x)))
+
+#define WARN_ALL 0
+#define WARN_CHMOD 1
+#define WARN_CLOSURE 2
+#define WARN_EXITING 3
+#define WARN_GLOB 4
+#define WARN_IO 5
+#define WARN_CLOSED 6
+#define WARN_EXEC 7
+#define WARN_NEWLINE 8
+#define WARN_PIPE 9
+#define WARN_UNOPENED 10
+#define WARN_MISC 11
+#define WARN_NUMERIC 12
+#define WARN_ONCE 13
+#define WARN_OVERFLOW 14
+#define WARN_PACK 15
+#define WARN_PORTABLE 16
+#define WARN_RECURSION 17
+#define WARN_REDEFINE 18
+#define WARN_REGEXP 19
+#define WARN_SEVERE 20
+#define WARN_DEBUGGING 21
+#define WARN_INPLACE 22
+#define WARN_INTERNAL 23
+#define WARN_MALLOC 24
+#define WARN_SIGNAL 25
+#define WARN_SUBSTR 26
+#define WARN_SYNTAX 27
+#define WARN_AMBIGUOUS 28
+#define WARN_BAREWORD 29
+#define WARN_DEPRECATED 30
+#define WARN_DIGIT 31
+#define WARN_PARENTHESIS 32
+#define WARN_PRECEDENCE 33
+#define WARN_PRINTF 34
+#define WARN_PROTOTYPE 35
+#define WARN_QW 36
+#define WARN_RESERVED 37
+#define WARN_SEMICOLON 38
+#define WARN_TAINT 39
+#define WARN_UMASK 40
+#define WARN_UNINITIALIZED 41
+#define WARN_UNPACK 42
+#define WARN_UNTIE 43
+#define WARN_UTF8 44
+#define WARN_VOID 45
+#define WARN_Y2K 46
+
+#define WARNsize 12
+#define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125"
+#define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0"
+
+/* end of file warnings.h */
+
diff --git a/contrib/perl5/warnings.pl b/contrib/perl5/warnings.pl
new file mode 100644
index 0000000..61602d5
--- /dev/null
+++ b/contrib/perl5/warnings.pl
@@ -0,0 +1,492 @@
+#!/usr/bin/perl
+
+BEGIN {
+ push @INC, './lib';
+}
+use strict ;
+
+sub DEFAULT_ON () { 1 }
+sub DEFAULT_OFF () { 2 }
+
+my $tree = {
+
+'all' => {
+ 'io' => { 'pipe' => DEFAULT_OFF,
+ 'unopened' => DEFAULT_OFF,
+ 'closed' => DEFAULT_OFF,
+ 'newline' => DEFAULT_OFF,
+ 'exec' => DEFAULT_OFF,
+ },
+ 'syntax' => { 'ambiguous' => DEFAULT_OFF,
+ 'semicolon' => DEFAULT_OFF,
+ 'precedence' => DEFAULT_OFF,
+ 'bareword' => DEFAULT_OFF,
+ 'reserved' => DEFAULT_OFF,
+ 'digit' => DEFAULT_OFF,
+ 'parenthesis' => DEFAULT_OFF,
+ 'deprecated' => DEFAULT_OFF,
+ 'printf' => DEFAULT_OFF,
+ 'prototype' => DEFAULT_OFF,
+ 'qw' => DEFAULT_OFF,
+ },
+ 'severe' => { 'inplace' => DEFAULT_ON,
+ 'internal' => DEFAULT_ON,
+ 'debugging' => DEFAULT_ON,
+ 'malloc' => DEFAULT_ON,
+ },
+ 'void' => DEFAULT_OFF,
+ 'recursion' => DEFAULT_OFF,
+ 'redefine' => DEFAULT_OFF,
+ 'numeric' => DEFAULT_OFF,
+ 'uninitialized' => DEFAULT_OFF,
+ 'once' => DEFAULT_OFF,
+ 'misc' => DEFAULT_OFF,
+ 'regexp' => DEFAULT_OFF,
+ 'glob' => DEFAULT_OFF,
+ 'y2k' => DEFAULT_OFF,
+ 'chmod' => DEFAULT_OFF,
+ 'umask' => DEFAULT_OFF,
+ 'untie' => DEFAULT_OFF,
+ 'substr' => DEFAULT_OFF,
+ 'taint' => DEFAULT_OFF,
+ 'signal' => DEFAULT_OFF,
+ 'closure' => DEFAULT_OFF,
+ 'overflow' => DEFAULT_OFF,
+ 'portable' => DEFAULT_OFF,
+ 'utf8' => DEFAULT_OFF,
+ 'exiting' => DEFAULT_OFF,
+ 'pack' => DEFAULT_OFF,
+ 'unpack' => DEFAULT_OFF,
+ #'default' => DEFAULT_ON,
+ }
+} ;
+
+
+###########################################################################
+sub tab {
+ my($l, $t) = @_;
+ $t .= "\t" x ($l - (length($t) + 1) / 8);
+ $t;
+}
+
+###########################################################################
+
+my %list ;
+my %Value ;
+my $index ;
+
+sub walk
+{
+ my $tre = shift ;
+ my @list = () ;
+ my ($k, $v) ;
+
+ foreach $k (sort keys %$tre) {
+ $v = $tre->{$k};
+ die "duplicate key $k\n" if defined $list{$k} ;
+ $Value{$index} = uc $k ;
+ push @{ $list{$k} }, $index ++ ;
+ if (ref $v)
+ { push (@{ $list{$k} }, walk ($v)) }
+ push @list, @{ $list{$k} } ;
+ }
+
+ return @list ;
+}
+
+###########################################################################
+
+sub mkRange
+{
+ my @a = @_ ;
+ my @out = @a ;
+ my $i ;
+
+
+ for ($i = 1 ; $i < @a; ++ $i) {
+ $out[$i] = ".."
+ if $a[$i] == $a[$i - 1] + 1 && $a[$i] + 1 == $a[$i + 1] ;
+ }
+
+ my $out = join(",",@out);
+
+ $out =~ s/,(\.\.,)+/../g ;
+ return $out;
+}
+
+###########################################################################
+sub printTree
+{
+ my $tre = shift ;
+ my $prefix = shift ;
+ my $indent = shift ;
+ my ($k, $v) ;
+
+ my $max = (sort {$a <=> $b} map { length $_ } keys %$tre)[-1] ;
+
+ $prefix .= " " x $indent ;
+ foreach $k (sort keys %$tre) {
+ $v = $tre->{$k};
+ print $prefix . "|\n" ;
+ print $prefix . "+- $k" ;
+ if (ref $v)
+ {
+ print " " . "-" x ($max - length $k ) . "+\n" ;
+ printTree ($v, $prefix . "|" , $max + $indent - 1)
+ }
+ else
+ { print "\n" }
+ }
+
+}
+
+###########################################################################
+
+sub mkHex
+{
+ my ($max, @a) = @_ ;
+ my $mask = "\x00" x $max ;
+ my $string = "" ;
+
+ foreach (@a) {
+ vec($mask, $_, 1) = 1 ;
+ }
+
+ #$string = unpack("H$max", $mask) ;
+ #$string =~ s/(..)/\x$1/g;
+ foreach (unpack("C*", $mask)) {
+ $string .= '\x' . sprintf("%2.2x", $_) ;
+ }
+ return $string ;
+}
+
+###########################################################################
+
+if (@ARGV && $ARGV[0] eq "tree")
+{
+ #print " all -+\n" ;
+ printTree($tree, " ", 4) ;
+ exit ;
+}
+
+#unlink "warnings.h";
+#unlink "lib/warnings.pm";
+open(WARN, ">warnings.h") || die "Can't create warnings.h: $!\n";
+open(PM, ">lib/warnings.pm") || die "Can't create lib/warnings.pm: $!\n";
+
+print WARN <<'EOM' ;
+/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by warnings.pl
+ Any changes made here will be lost!
+*/
+
+
+#define Off(x) ((x) / 8)
+#define Bit(x) (1 << ((x) % 8))
+#define IsSet(a, x) ((a)[Off(x)] & Bit(x))
+
+
+#define G_WARN_OFF 0 /* $^W == 0 */
+#define G_WARN_ON 1 /* -w flag and $^W != 0 */
+#define G_WARN_ALL_ON 2 /* -W flag */
+#define G_WARN_ALL_OFF 4 /* -X flag */
+#define G_WARN_ONCE 8 /* set if 'once' ever enabled */
+#define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
+
+#define pWARN_STD Nullsv
+#define pWARN_ALL (Nullsv+1) /* use warnings 'all' */
+#define pWARN_NONE (Nullsv+2) /* no warnings 'all' */
+
+#define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
+ (x) == pWARN_NONE)
+
+#define ckDEAD(x) \
+ ( ! specialWARN(PL_curcop->cop_warnings) && \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x+1))
+
+#define ckWARN(x) \
+ ( (PL_curcop->cop_warnings != pWARN_STD && \
+ PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) ) ) \
+ || (PL_curcop->cop_warnings == pWARN_STD && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN2(x,y) \
+ ( (PL_curcop->cop_warnings != pWARN_STD && \
+ PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*y) ) ) \
+ || (PL_curcop->cop_warnings == pWARN_STD && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN_d(x) \
+ (PL_curcop->cop_warnings == pWARN_STD || \
+ PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) ) )
+
+#define ckWARN2_d(x,y) \
+ (PL_curcop->cop_warnings == pWARN_STD || \
+ PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ (IsSet(SvPVX(PL_curcop->cop_warnings), 2*x) || \
+ IsSet(SvPVX(PL_curcop->cop_warnings), 2*y) ) ) )
+
+
+#define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
+#define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
+#define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
+#define isWARN_on(c,x) (IsSet(SvPVX(c), 2*(x)))
+
+EOM
+
+my $offset = 0 ;
+
+$index = $offset ;
+#@{ $list{"all"} } = walk ($tree) ;
+walk ($tree) ;
+
+
+$index *= 2 ;
+my $warn_size = int($index / 8) + ($index % 8 != 0) ;
+
+my $k ;
+foreach $k (sort { $a <=> $b } keys %Value) {
+ print WARN tab(5, "#define WARN_$Value{$k}"), "$k\n" ;
+}
+print WARN "\n" ;
+
+print WARN tab(5, '#define WARNsize'), "$warn_size\n" ;
+#print WARN tab(5, '#define WARN_ALLstring'), '"', ('\377' x $warn_size) , "\"\n" ;
+print WARN tab(5, '#define WARN_ALLstring'), '"', ('\125' x $warn_size) , "\"\n" ;
+print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n" ;
+
+print WARN <<'EOM';
+
+/* end of file warnings.h */
+
+EOM
+
+close WARN ;
+
+while (<DATA>) {
+ last if /^KEYWORDS$/ ;
+ print PM $_ ;
+}
+
+#$list{'all'} = [ $offset .. 8 * ($warn_size/2) - 1 ] ;
+
+#my %Keys = map {lc $Value{$_}, $_} keys %Value ;
+
+print PM "%Offsets = (\n" ;
+foreach my $k (sort { $a <=> $b } keys %Value) {
+ my $v = lc $Value{$k} ;
+ $k *= 2 ;
+ print PM tab(4, " '$v'"), "=> $k,\n" ;
+}
+
+print PM " );\n\n" ;
+
+print PM "%Bits = (\n" ;
+foreach $k (sort keys %list) {
+
+ my $v = $list{$k} ;
+ my @list = sort { $a <=> $b } @$v ;
+
+ print PM tab(4, " '$k'"), '=> "',
+ # mkHex($warn_size, @list),
+ mkHex($warn_size, map $_ * 2 , @list),
+ '", # [', mkRange(@list), "]\n" ;
+}
+
+print PM " );\n\n" ;
+
+print PM "%DeadBits = (\n" ;
+foreach $k (sort keys %list) {
+
+ my $v = $list{$k} ;
+ my @list = sort { $a <=> $b } @$v ;
+
+ print PM tab(4, " '$k'"), '=> "',
+ # mkHex($warn_size, @list),
+ mkHex($warn_size, map $_ * 2 + 1 , @list),
+ '", # [', mkRange(@list), "]\n" ;
+}
+
+print PM " );\n\n" ;
+print PM '$NONE = "', ('\0' x $warn_size) , "\";\n" ;
+print PM '$LAST_BIT = ' . "$index ;\n" ;
+print PM '$BYTES = ' . "$warn_size ;\n" ;
+while (<DATA>) {
+ print PM $_ ;
+}
+
+close PM ;
+
+__END__
+
+# This file was created by warnings.pl
+# Any changes made here will be lost.
+#
+
+package warnings;
+
+=head1 NAME
+
+warnings - Perl pragma to control optional warnings
+
+=head1 SYNOPSIS
+
+ use warnings;
+ no warnings;
+
+ use warnings "all";
+ no warnings "all";
+
+ use warnings::register;
+ if (warnings::enabled()) {
+ warnings::warn("some warning");
+ }
+
+ if (warnings::enabled("void")) {
+ warnings::warn("void", "some warning");
+ }
+
+=head1 DESCRIPTION
+
+If no import list is supplied, all possible warnings are either enabled
+or disabled.
+
+A number of functions are provided to assist module authors.
+
+=over 4
+
+=item use warnings::register
+
+Creates a new warnings category which has the same name as the module
+where the call to the pragma is used.
+
+=item warnings::enabled([$category])
+
+Returns TRUE if the warnings category C<$category> is enabled in the
+calling module. Otherwise returns FALSE.
+
+If the parameter, C<$category>, isn't supplied, the current package name
+will be used.
+
+=item warnings::warn([$category,] $message)
+
+If the calling module has I<not> set C<$category> to "FATAL", print
+C<$message> to STDERR.
+If the calling module has set C<$category> to "FATAL", print C<$message>
+STDERR then die.
+
+If the parameter, C<$category>, isn't supplied, the current package name
+will be used.
+
+=back
+
+See L<perlmod/Pragmatic Modules> and L<perllexwarn>.
+
+=cut
+
+use Carp ;
+
+KEYWORDS
+
+$All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
+
+sub bits {
+ my $mask ;
+ my $catmask ;
+ my $fatal = 0 ;
+ foreach my $word (@_) {
+ if ($word eq 'FATAL') {
+ $fatal = 1;
+ }
+ elsif ($catmask = $Bits{$word}) {
+ $mask |= $catmask ;
+ $mask |= $DeadBits{$word} if $fatal ;
+ }
+ else
+ { croak("unknown warnings category '$word'")}
+ }
+
+ return $mask ;
+}
+
+sub import {
+ shift;
+ ${^WARNING_BITS} |= bits(@_ ? @_ : 'all') ;
+}
+
+sub unimport {
+ shift;
+ my $mask = ${^WARNING_BITS} ;
+ if (vec($mask, $Offsets{'all'}, 1)) {
+ $mask = $Bits{'all'} ;
+ $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+ }
+ ${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
+}
+
+sub enabled
+{
+ croak("Usage: warnings::enabled([category])")
+ unless @_ == 1 || @_ == 0 ;
+ local $Carp::CarpLevel = 1 ;
+ my $category ;
+ my $offset ;
+ my $callers_bitmask = (caller(1))[9] ;
+ return 0 unless defined $callers_bitmask ;
+
+
+ if (@_) {
+ # check the category supplied.
+ $category = shift ;
+ $offset = $Offsets{$category};
+ croak("unknown warnings category '$category'")
+ unless defined $offset;
+ }
+ else {
+ $category = (caller(0))[0] ;
+ $offset = $Offsets{$category};
+ croak("package '$category' not registered for warnings")
+ unless defined $offset ;
+ }
+
+ return vec($callers_bitmask, $offset, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}, 1) ;
+}
+
+
+sub warn
+{
+ croak("Usage: warnings::warn([category,] 'message')")
+ unless @_ == 2 || @_ == 1 ;
+ local $Carp::CarpLevel = 1 ;
+ my $category ;
+ my $offset ;
+ my $callers_bitmask = (caller(1))[9] ;
+
+ if (@_ == 2) {
+ $category = shift ;
+ $offset = $Offsets{$category};
+ croak("unknown warnings category '$category'")
+ unless defined $offset ;
+ }
+ else {
+ $category = (caller(0))[0] ;
+ $offset = $Offsets{$category};
+ croak("package '$category' not registered for warnings")
+ unless defined $offset ;
+ }
+
+ my $message = shift ;
+ croak($message)
+ if vec($callers_bitmask, $offset+1, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+ carp($message) ;
+}
+
+1;
diff --git a/contrib/perl5/writemain.SH b/contrib/perl5/writemain.SH
index c428383..18544c1 100755
--- a/contrib/perl5/writemain.SH
+++ b/contrib/perl5/writemain.SH
@@ -1,4 +1,4 @@
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
@@ -37,7 +37,11 @@ $spitshell >>writemain <<'!NO!SUBS!'
orig="$*"
args=''
: Remove any .a suffixes and any leading path components
-for file in `echo $orig | sed 's/\.a//g'` ; do
+for file in $orig ; do
+ case "$file" in
+ *.a) file=`echo $file | sed 's/\.a//g'`
+ ;;
+ esac
case "$file" in
ext/*) file=`echo $file | sed 's:ext/\(.*\)/[^/]*:\1:'`
;;
@@ -61,14 +65,14 @@ if test X"$args" != "X" ; then
mname=`echo $ext | sed 's!/!::!g'`
cname=`echo $mname | sed 's!:!_!g'`
-echo "EXTERN_C void boot_${cname} _((CV* cv));"
+echo "EXTERN_C void boot_${cname} (pTHX_ CV* cv);"
done
fi
cat << 'EOP'
static void
-xs_init()
+xs_init(pTHX)
{
EOP
diff --git a/contrib/perl5/x2p/Makefile.SH b/contrib/perl5/x2p/Makefile.SH
index 1f92d5d..8ed7d31 100755
--- a/contrib/perl5/x2p/Makefile.SH
+++ b/contrib/perl5/x2p/Makefile.SH
@@ -1,4 +1,4 @@
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
@@ -85,6 +85,7 @@ pl = find2perl.PL s2p.PL
plextract = find2perl s2p
plexe = find2perl.exe s2p.exe
plc = find2perl.c s2p.c
+plm = a2p.loadmap
addedbyconf = $(shextract) $(plextract)
@@ -119,6 +120,8 @@ run_byacc: FORCE
rm -f a2p.c
mv y.tab.c a2p.c
+FORCE:
+
# We don't want to regenerate a2p.c, but it might appear out-of-date
# after a patch is applied or a new distribution is made.
a2p.c: a2p.y
@@ -129,7 +132,7 @@ a2p$(OBJ_EXT): a2p.c a2py.c a2p.h EXTERN.h util.h INTERN.h \
$(CCCMD) $(LARGE) a2p.c
clean:
- rm -f a2p *$(OBJ_EXT) $(plexe) $(plc)
+ rm -f a2p *$(OBJ_EXT) $(plexe) $(plc) $(plm)
realclean: clean
rm -f *.orig core $(addedbyconf) all malloc.c
diff --git a/contrib/perl5/x2p/a2p.c b/contrib/perl5/x2p/a2p.c
index e79e156..b512cf9 100644
--- a/contrib/perl5/x2p/a2p.c
+++ b/contrib/perl5/x2p/a2p.c
@@ -32,1788 +32,1858 @@ int ends = Nullop;
#define GRGR 265
#define PRINT 266
#define PRINTF 267
-#define SPRINTF 268
-#define SPLIT 269
-#define IF 270
-#define ELSE 271
-#define WHILE 272
-#define FOR 273
-#define IN 274
-#define EXIT 275
-#define NEXT 276
-#define BREAK 277
-#define CONTINUE 278
-#define RET 279
-#define GETLINE 280
-#define DO 281
-#define SUB 282
-#define GSUB 283
-#define MATCH 284
-#define FUNCTION 285
-#define USERFUN 286
-#define DELETE 287
-#define ASGNOP 288
-#define OROR 289
-#define ANDAND 290
-#define NUMBER 291
-#define VAR 292
-#define SUBSTR 293
-#define INDEX 294
-#define MATCHOP 295
-#define RELOP 296
-#define OR 297
-#define STRING 298
-#define UMINUS 299
-#define NOT 300
-#define INCR 301
-#define DECR 302
-#define FIELD 303
-#define VFIELD 304
+#define SPRINTF_OLD 268
+#define SPRINTF_NEW 269
+#define SPLIT 270
+#define IF 271
+#define ELSE 272
+#define WHILE 273
+#define FOR 274
+#define IN 275
+#define EXIT 276
+#define NEXT 277
+#define BREAK 278
+#define CONTINUE 279
+#define RET 280
+#define GETLINE 281
+#define DO 282
+#define SUB 283
+#define GSUB 284
+#define MATCH 285
+#define FUNCTION 286
+#define USERFUN 287
+#define DELETE 288
+#define ASGNOP 289
+#define OROR 290
+#define ANDAND 291
+#define NUMBER 292
+#define VAR 293
+#define SUBSTR 294
+#define INDEX 295
+#define MATCHOP 296
+#define RELOP 297
+#define OR 298
+#define STRING 299
+#define UMINUS 300
+#define NOT 301
+#define INCR 302
+#define DECR 303
+#define FIELD 304
+#define VFIELD 305
#define YYERRCODE 256
short yylhs[] = { -1,
0, 3, 6, 6, 2, 2, 7, 7, 7, 7,
7, 7, 9, 8, 8, 11, 11, 11, 11, 11,
15, 15, 15, 15, 14, 14, 14, 14, 13, 13,
- 13, 13, 12, 12, 12, 12, 16, 16, 16, 16,
+ 13, 13, 12, 12, 12, 12, 18, 18, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 17, 17, 17, 17, 10, 10, 10, 18, 18,
- 18, 1, 1, 19, 19, 19, 19, 4, 4, 20,
- 20, 21, 21, 21, 21, 5, 5, 22, 22, 22,
- 22, 25, 25, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 26, 26, 26, 24,
- 24, 24, 24, 24, 24, 24, 24,
+ 16, 16, 16, 16, 17, 17, 17, 17, 10, 10,
+ 10, 19, 19, 19, 1, 1, 20, 20, 20, 20,
+ 4, 4, 21, 21, 22, 22, 22, 22, 5, 5,
+ 23, 23, 23, 23, 26, 26, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 27,
+ 27, 27, 25, 25, 25, 25, 25, 25, 25, 25,
};
short yylen[] = { 2,
2, 6, 5, 2, 3, 0, 1, 5, 10, 4,
1, 1, 1, 1, 3, 1, 1, 1, 1, 5,
3, 4, 4, 2, 3, 3, 3, 3, 3, 3,
- 1, 3, 1, 2, 5, 3, 1, 1, 1, 3,
- 3, 3, 3, 3, 3, 3, 2, 2, 2, 2,
- 2, 2, 3, 1, 2, 3, 4, 3, 4, 1,
- 3, 4, 4, 4, 2, 8, 6, 8, 8, 6,
- 6, 6, 6, 6, 6, 6, 6, 8, 8, 8,
- 8, 1, 4, 1, 2, 1, 1, 0, 4, 4,
- 3, 2, 0, 1, 1, 1, 1, 2, 0, 1,
- 1, 2, 2, 2, 2, 2, 0, 3, 2, 2,
- 1, 1, 0, 1, 4, 2, 4, 2, 1, 1,
- 1, 2, 1, 1, 2, 5, 1, 1, 1, 6,
- 9, 6, 7, 10, 9, 6, 5,
+ 1, 3, 1, 2, 5, 3, 1, 1, 1, 1,
+ 1, 3, 3, 3, 3, 3, 3, 3, 2, 2,
+ 2, 2, 2, 2, 3, 1, 2, 3, 4, 3,
+ 4, 1, 3, 4, 4, 4, 4, 2, 8, 6,
+ 8, 8, 6, 6, 6, 6, 6, 6, 6, 6,
+ 8, 8, 8, 8, 1, 4, 1, 2, 1, 1,
+ 0, 4, 4, 3, 2, 0, 1, 1, 1, 1,
+ 2, 0, 1, 1, 2, 2, 2, 2, 2, 0,
+ 3, 2, 2, 1, 1, 0, 1, 4, 2, 4,
+ 2, 1, 1, 1, 2, 1, 1, 2, 5, 1,
+ 1, 1, 6, 9, 6, 7, 10, 9, 6, 5,
};
-short yydefred[] = { 93,
- 0, 0, 95, 96, 97, 94, 0, 92, 0, 0,
- 31, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 38, 0, 0, 0, 39, 0, 0, 0, 0,
- 0, 84, 0, 99, 0, 11, 0, 93, 0, 0,
- 0, 17, 18, 19, 0, 0, 99, 99, 0, 0,
- 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
- 49, 50, 0, 0, 0, 0, 0, 0, 4, 0,
- 99, 0, 99, 99, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 47, 48, 0, 0, 61, 0, 0, 0, 0, 0,
- 99, 99, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 100, 101, 0, 98, 53,
- 32, 28, 21, 0, 0, 0, 0, 0, 0, 30,
- 0, 0, 0, 0, 46, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 62, 63, 91, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 13, 64,
- 83, 0, 0, 99, 0, 0, 0, 0, 0, 0,
- 120, 119, 123, 0, 99, 0, 99, 10, 99, 0,
- 106, 0, 111, 0, 0, 0, 22, 0, 59, 93,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 99, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 99, 99, 99, 99, 99,
- 8, 0, 0, 0, 70, 0, 75, 0, 74, 0,
- 77, 0, 76, 0, 72, 73, 0, 67, 0, 71,
- 128, 127, 129, 0, 0, 0, 0, 0, 112, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 99, 0, 0, 0, 99, 99,
- 99, 0, 0, 0, 99, 69, 68, 79, 78, 81,
- 80, 0, 66, 0, 0, 0, 0, 0, 0, 126,
- 0, 0, 0, 132, 136, 0, 0, 0, 9, 99,
- 99, 0, 133, 0, 0, 99, 131, 135, 0, 134,
+short yydefred[] = { 96,
+ 0, 0, 98, 99, 100, 97, 0, 95, 0, 0,
+ 31, 0, 0, 38, 0, 0, 0, 0, 0, 0,
+ 0, 0, 40, 0, 0, 0, 41, 0, 0, 0,
+ 0, 0, 87, 0, 102, 0, 11, 0, 96, 0,
+ 0, 0, 17, 18, 19, 0, 0, 0, 102, 102,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 51,
+ 52, 0, 0, 0, 0, 0, 0, 4, 0, 102,
+ 0, 102, 102, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,
+ 50, 0, 68, 0, 0, 0, 0, 63, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 103, 104, 0, 101, 55, 32,
+ 28, 21, 0, 0, 0, 0, 0, 0, 30, 0,
+ 0, 0, 0, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 102, 102, 0, 0, 64,
+ 65, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 66, 86, 0, 0, 102, 0, 0, 0, 0,
+ 0, 0, 123, 122, 126, 0, 102, 0, 102, 10,
+ 102, 0, 109, 0, 114, 0, 0, 0, 22, 0,
+ 61, 94, 0, 0, 96, 3, 0, 0, 0, 0,
+ 0, 0, 0, 102, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 102, 102,
+ 102, 102, 102, 8, 0, 0, 0, 0, 0, 73,
+ 0, 78, 0, 77, 0, 80, 0, 79, 0, 75,
+ 76, 0, 70, 0, 74, 131, 130, 132, 0, 0,
+ 0, 0, 0, 115, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 102,
+ 0, 0, 0, 102, 102, 102, 0, 0, 0, 102,
+ 72, 71, 82, 81, 84, 83, 0, 69, 0, 0,
+ 0, 0, 0, 0, 129, 0, 0, 0, 135, 139,
+ 0, 0, 0, 9, 102, 102, 0, 136, 0, 0,
+ 102, 134, 138, 0, 137,
};
short yydgoto[] = { 1,
- 2, 7, 36, 74, 128, 37, 38, 39, 168, 52,
- 75, 190, 42, 43, 44, 45, 46, 54, 8, 129,
- 230, 191, 192, 193, 260, 254,
+ 2, 7, 37, 73, 127, 38, 39, 40, 170, 103,
+ 74, 192, 43, 44, 45, 46, 47, 48, 105, 8,
+ 128, 233, 193, 194, 195, 265, 259,
};
short yysindex[] = { 0,
- 0, -50, 0, 0, 0, 0, 4775, 0, -91, -38,
- 0, 34, 41, 7201, 42, 6, 46, 48, 50, -184,
- 70, 0, 16, 77, 80, 0, 7255, 7255, 5051, -220,
- -220, 0, 7255, 0, 5051, 0, -140, 0, 5, -13,
- 5693, 0, 0, 0, -32, -233, 0, 0, 4619, 7201,
- 5962, 0, 6006, 79, 7255, 7255, 71, 6890, 6936, 7255,
- 87, 7201, 7201, 7255, 7255, 5051, -42, -244, -42, 0,
- 0, 0, 20, -183, -41, 89, 92, 93, 0, -50,
- 0, 7255, 0, 0, 5051, 7255, 6990, 7255, 7255, 7255,
- -32, -157, 7255, 7255, 7255, 7255, 7255, 7255, -144, 5051,
- 0, 0, -183, -183, 0, 3590, 96, 5962, 5577, 10,
- 0, 0, 6049, 1522, 7255, 94, 6107, 95, 6153, 6195,
- 7201, 99, 51, 6238, 6281, 0, 0, 4886, 0, 0,
- 0, 0, 0, -183, 6323, 1605, 1605, -60, 6380, 0,
- 1522, 1522, 1522, 1522, 0, -7, -7, -42, -42, -42,
- -42, -220, -60, 4931, 4977, 0, 0, 0, 6425, 6425,
- -151, 1522, 7255, 7255, 7255, 7255, 7052, 102, 0, 0,
- 0, 7255, 7255, 0, 7201, 7201, 115, 119, 121, 7255,
- 0, 0, 0, 7255, 0, -130, 0, 0, 0, 7112,
- 0, 18, 0, 5242, 7255, -126, 0, 7255, 0, 0,
- 0, 7112, 7112, 32, 2427, 2474, 5735, 5779, 126, 6470,
- 0, 5842, 6513, -183, -33, -33, 5051, 5051, 5428, 7112,
- 7112, 4046, 81, -183, -183, 0, 0, 0, 0, 0,
- 0, 7112, 7112, -50, 0, 7158, 0, 7255, 0, 7255,
- 0, 7255, 0, 7255, 0, 0, -96, 0, 7255, 0,
- 0, 0, 0, 7255, 7255, -39, -37, 6555, 0, 116,
- -95, 7201, 5287, -183, -183, -183, -183, -183, 135, 6612,
- 6657, 6702, 6745, 6787, 0, 6844, 7112, 7112, 0, 0,
- 0, 5908, 144, 97, 0, 0, 0, 0, 0, 0,
- 0, -183, 0, 4046, 4046, 4046, 5428, -51, 5051, 0,
- -183, 5332, -85, 0, 0, 146, 5428, -35, 0, 0,
- 0, 147, 0, 4046, 4046, 0, 0, 0, 4046, 0,
+ 0, -52, 0, 0, 0, 0, 2796, 0, -90, -86,
+ 0, 17, 25, 0, 38, 44, -57, 45, 47, 48,
+ -219, 49, 0, -1, 51, 52, 0, 7708, 7708, 6350,
+ -238, -238, 0, 7708, 0, 6350, 0, -165, 0, -21,
+ -12, 5968, 0, 0, 0, -32, -253, 7759, 0, 0,
+ 7372, 7759, 7759, 7708, 7708, 46, 7419, 7473, 7708, 65,
+ 7759, 7759, 7708, 7708, 6350, -54, -228, -54, 0, 0,
+ 0, -5, -185, -41, 71, 76, 80, 0, -52, 0,
+ 7708, 0, 0, 6350, 7708, 7528, 7708, 7708, 7708, -32,
+ -171, 7708, 7708, 7708, 7708, 7708, 7708, -152, 6350, 0,
+ 0, 6397, 0, 6481, 86, -185, -185, 0, 6528, 90,
+ 91, 6583, 184, 7708, 89, 6630, 93, 6673, 6716, 7759,
+ 94, 41, 6761, 6816, 0, 0, 5228, 0, 0, 0,
+ 0, 0, -185, 6863, 6015, 6015, -49, 6906, 0, 184,
+ 184, 184, 184, 0, -8, -8, -54, -54, -54, -54,
+ -238, -49, 6397, 5924, 28, 0, 0, 5320, 5411, 0,
+ 0, 0, -154, 184, 7708, 7708, 7708, 7708, 7575, 100,
+ 0, 0, 0, 7708, 7708, 0, 7759, 7759, 104, 105,
+ 117, 7708, 0, 0, 0, 7708, 0, -151, 0, 0,
+ 0, 7618, 0, -43, 0, 5495, 7708, -129, 0, 7708,
+ 0, 0, 3816, 3816, 0, 0, 29, 6062, 6119, 6203,
+ 6248, 122, 6949, 0, 6295, 6994, -185, -45, -45, 6350,
+ 6350, 4306, 7618, 7618, 4429, 81, -185, -185, 0, 0,
+ 0, 0, 0, 0, 7618, 7618, 7618, 7618, -52, 0,
+ 7665, 0, 7708, 0, 7708, 0, 7708, 0, 7708, 0,
+ 0, -96, 0, 7708, 0, 0, 0, 0, 7708, 7708,
+ -39, -37, 7049, 0, 108, -97, 7759, 5586, -185, -185,
+ -185, -185, -185, 136, 7096, 7139, 7182, 7227, 7282, 0,
+ 7329, 7618, 7618, 0, 0, 0, 3890, 138, 88, 0,
+ 0, 0, 0, 0, 0, 0, -185, 0, 4429, 4429,
+ 4429, 4306, -51, 6350, 0, -185, 5678, -89, 0, 0,
+ 141, 4306, -35, 0, 0, 0, 143, 0, 4429, 4429,
+ 0, 0, 0, 4429, 0,
};
short yyrindex[] = { 0,
- 0, 2000, 0, 0, 0, 0, 189, 0, 0, 0,
- 0, 56, 0, 3312, 0, 2591, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2138, 0, 1930, 1209,
- 3755, 0, 0, 0, 1818, 1394, 0, 0, 0, 151,
- 0, 0, 3707, 111, 0, 0, 381, 0, 0, 0,
- 0, 151, 100, 0, 0, 0, 564, 834, 889, 0,
- 0, 0, 436, 5378, 0, -49, -46, -43, 0, 2195,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2084, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 5378, 5378, 0, 0, 0, 0, -22, 0,
- 0, 0, 0, 2639, 0, 0, 0, 0, 0, 0,
- 151, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5378, 0, 0, 0, 1872, 0, 0,
- 2878, 2923, 2968, 3037, 0, 1719, 1770, 943, 1016, 1286,
- 1340, 2536, 1664, 0, 0, 0, 0, 0, 0, 0,
- 0, 3245, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67, 67, 0, 0, 0, -34,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 101,
- 0, 0, 0, 0, 0, 491, 0, 0, 0, 0,
- 0, 3360, 3432, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 4091, 104, 172, 0, 0, 136, 241,
- 247, 0, 0, 5378, 4146, 0, 0, 0, 0, 0,
- 0, 3520, 3640, 2266, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 137, 0, 0,
- 0, 100, 0, 4220, 4411, 4485, 4530, 4576, 0, 0,
- 0, 0, 0, 0, 0, 0, 296, 357, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 5378, 0, 0, 0, 0, 153, 0, 0, 0,
- 4841, 0, 5643, 0, 0, 0, 153, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2452, 0, 0, 0, 0, 185, 0, 0, 0,
+ 0, 56, 0, 0, 111, 0, 2886, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2279, 0, 2328,
+ 2048, 4023, 0, 0, 0, 2120, 1671, 3590, 0, 0,
+ 0, 145, 145, 0, 0, 382, 0, 0, 0, 0,
+ 145, 95, 0, 0, 0, 818, 872, 946, 0, 0,
+ 0, 437, 5769, 0, -16, -10, 18, 0, 2511, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3951, 492, 5769, 5769, 0, 0, 0,
+ 0, 0, 2934, 0, 0, 0, 0, 0, 0, 145,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 5769, 0, 0, 0, 2221, 0, 0, 2982,
+ 3222, 3267, 3312, 0, 1781, 1854, 1217, 1271, 1325, 1400,
+ 2619, 1726, 0, -23, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3381, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 102, 102, 0, 0,
+ 0, 171, 0, 0, 0, 174, 0, 0, 0, 0,
+ 0, 242, 0, 0, 0, 0, 0, 763, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4508, 248, 297, 0,
+ 0, 128, 350, 358, 0, 0, 5769, 4604, 0, 0,
+ 0, 0, 0, 0, 3657, 3705, 3760, 3866, 2561, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 130, 0, 0, 0, 95, 0, 4695, 4779,
+ 4870, 4962, 5053, 0, 0, 0, 0, 0, 0, 0,
+ 0, 398, 431, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5769, 0, 0, 0,
+ 0, 149, 0, 0, 0, 5137, 0, 5853, 0, 0,
+ 0, 149, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
};
short yygindex[] = { 0,
- -15, 0, 0, 3236, -67, 0, 0, 0, 0, -29,
- 171, 4012, -19, 4, 14, 7669, 7480, -4, 0, 0,
- 0, -113, -201, 0, -232, -18,
+ -30, 0, 0, 4250, -24, 0, 0, 0, 0, 397,
+ 24, 4208, -17, -15, -13, 7990, 4404, 0, -82, 0,
+ 0, 0, -173, -192, 0, -277, -28,
};
-#define YYTABLESIZE 7947
-short yytable[] = { 130,
- 82, 279, 82, 280, 97, 313, 121, 307, 6, 95,
- 93, 82, 94, 17, 96, 76, 18, 259, 16, 19,
- 107, 82, 80, 82, 121, 82, 275, 82, 252, 97,
- 85, 47, 122, 123, 95, 154, 155, 82, 77, 96,
- 82, 82, 82, 82, 82, 82, 110, 82, 78, 82,
- 158, 98, 124, 112, 100, 60, 101, 102, 82, 82,
- 82, 98, 82, 82, 306, 56, 194, 101, 102, 99,
- 124, 23, 235, 49, 312, 236, 229, 126, 127, 99,
- 50, 55, 32, 33, 48, 58, 98, 59, 76, 60,
- 253, 169, 60, 82, 82, 259, 60, 60, 60, 60,
- 60, 61, 60, 110, 99, 259, 63, 88, 261, 62,
- 87, 77, 82, 60, 60, 60, 64, 60, 60, 65,
- 79, 78, 112, 82, 82, 88, 121, 81, 88, 131,
- 115, 99, 132, 133, 145, 152, 157, 163, 165, 170,
- 204, 114, 211, 171, 116, 215, 216, 87, 60, 60,
- 87, 87, 87, 87, 217, 87, 263, 87, 218, 114,
- 219, 223, 116, 84, 126, 127, 245, 60, 87, 87,
- 87, 262, 87, 87, 282, 286, 283, 40, 60, 60,
- 303, 304, 305, 299, 234, 310, 311, 316, 1, 300,
- 88, 88, 88, 113, 113, 114, 0, 255, 0, 70,
- 317, 318, 0, 87, 87, 320, 0, 0, 0, 3,
- 4, 5, 118, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 87, 0, 302, 121, 121, 121, 83, 84,
- 118, 251, 284, 87, 87, 0, 0, 83, 84, 17,
- 17, 92, 18, 18, 0, 19, 19, 83, 84, 83,
- 84, 83, 84, 83, 84, 138, 0, 82, 82, 82,
- 82, 82, 82, 82, 82, 82, 16, 16, 82, 82,
- 153, 124, 124, 124, 82, 83, 84, 226, 227, 228,
- 82, 122, 82, 82, 82, 82, 82, 125, 82, 82,
- 82, 82, 82, 82, 82, 82, 82, 23, 82, 122,
- 82, 82, 82, 82, 82, 125, 196, 197, 32, 33,
- 0, 0, 60, 60, 60, 60, 60, 60, 60, 60,
- 60, 0, 0, 60, 60, 0, 88, 88, 88, 60,
- 0, 88, 0, 0, 0, 60, 115, 60, 60, 60,
- 60, 60, 0, 60, 60, 60, 60, 60, 60, 60,
- 60, 60, 0, 60, 115, 60, 60, 60, 60, 60,
- 114, 114, 114, 116, 116, 116, 0, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 0, 0, 87, 87,
- 55, 0, 0, 0, 87, 0, 0, 256, 257, 0,
- 87, 0, 87, 87, 87, 87, 87, 117, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 0, 87, 0,
- 87, 87, 87, 87, 87, 117, 0, 55, 0, 0,
- 55, 55, 55, 55, 55, 55, 0, 55, 0, 0,
- 0, 118, 118, 118, 0, 85, 0, 0, 55, 55,
- 0, 0, 55, 55, 0, 0, 0, 0, 0, 0,
- 0, 0, 298, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 308,
- 0, 0, 85, 55, 55, 85, 85, 85, 85, 85,
- 85, 0, 85, 0, 0, 0, 0, 0, 0, 0,
- 23, 0, 55, 85, 85, 85, 0, 85, 85, 0,
- 122, 122, 122, 55, 55, 0, 125, 125, 125, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 23, 85, 85,
- 23, 23, 23, 23, 23, 23, 0, 23, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 23, 23,
- 23, 0, 23, 23, 0, 115, 115, 115, 85, 85,
- 0, 0, 0, 52, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 23, 23, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 52, 0, 23, 52, 52, 52, 52, 52, 52, 0,
- 52, 0, 0, 23, 23, 0, 117, 117, 117, 0,
- 0, 52, 52, 52, 0, 52, 52, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 0, 0, 55, 55,
- 0, 0, 0, 0, 55, 0, 52, 0, 0, 0,
- 55, 0, 55, 55, 55, 55, 55, 0, 55, 55,
- 55, 55, 55, 55, 55, 55, 55, 0, 55, 0,
- 55, 55, 55, 55, 55, 0, 52, 52, 0, 0,
- 0, 0, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 0, 0, 85, 85, 0, 0, 0, 0, 85,
- 0, 0, 0, 0, 0, 85, 0, 85, 85, 85,
- 85, 85, 0, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 0, 85, 0, 85, 85, 85, 85, 85,
- 0, 0, 0, 0, 0, 0, 0, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 0, 0, 23, 23,
- 0, 0, 0, 0, 23, 0, 0, 0, 0, 0,
- 23, 0, 23, 23, 23, 23, 23, 0, 23, 23,
- 0, 23, 23, 23, 23, 23, 23, 0, 23, 0,
- 23, 23, 23, 23, 23, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 0,
- 0, 52, 52, 37, 0, 0, 0, 52, 0, 0,
- 0, 0, 0, 52, 0, 52, 52, 52, 52, 52,
- 0, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 0, 52, 0, 52, 52, 52, 52, 52, 0, 0,
- 37, 0, 0, 37, 37, 37, 37, 37, 37, 0,
- 37, 0, 0, 0, 0, 0, 0, 0, 51, 0,
- 0, 37, 37, 37, 0, 37, 37, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 51, 37, 37, 51, 51,
- 51, 51, 51, 51, 0, 51, 0, 0, 0, 0,
- 0, 0, 42, 0, 0, 37, 51, 51, 51, 0,
- 51, 51, 0, 0, 0, 0, 37, 37, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
- 0, 51, 42, 42, 42, 42, 42, 42, 0, 42,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 42, 42, 42, 0, 42, 42, 0, 0, 0, 0,
- 0, 51, 51, 0, 0, 43, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 42, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 43, 0, 0, 43, 43, 43, 43, 43,
- 43, 0, 43, 0, 0, 42, 42, 0, 0, 0,
- 0, 0, 0, 43, 43, 43, 0, 43, 43, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
- 0, 37, 37, 0, 0, 0, 0, 37, 43, 0,
- 0, 0, 0, 37, 0, 37, 37, 37, 37, 37,
- 0, 37, 37, 37, 37, 37, 37, 37, 37, 37,
- 0, 37, 0, 37, 0, 0, 37, 37, 43, 43,
- 0, 0, 0, 0, 0, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 0, 0, 51, 51, 0, 0,
- 0, 0, 51, 0, 0, 0, 0, 0, 51, 0,
- 51, 51, 51, 51, 51, 0, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 0, 51, 0, 51, 51,
- 51, 51, 51, 0, 0, 0, 0, 0, 0, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 14, 0,
- 42, 42, 0, 0, 0, 0, 42, 0, 0, 0,
- 0, 0, 42, 0, 42, 42, 42, 42, 42, 0,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 0,
- 42, 0, 42, 42, 42, 42, 42, 0, 14, 0,
- 0, 14, 0, 14, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 14, 0, 0,
- 0, 0, 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 0, 0, 43, 43, 44, 0, 0, 0, 43,
- 0, 0, 0, 0, 0, 43, 0, 43, 43, 43,
- 43, 43, 0, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 0, 43, 0, 43, 43, 43, 43, 43,
- 0, 0, 44, 0, 0, 44, 44, 44, 44, 44,
- 44, 14, 44, 0, 0, 0, 0, 0, 0, 45,
- 0, 0, 0, 44, 44, 44, 0, 44, 44, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 45, 0, 44, 45,
- 45, 45, 45, 45, 45, 0, 45, 0, 0, 0,
- 0, 0, 0, 37, 0, 0, 0, 45, 45, 45,
- 0, 45, 45, 0, 0, 0, 0, 0, 44, 44,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 37, 0, 45, 37, 37, 37, 37, 37, 37, 0,
- 37, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 37, 37, 37, 0, 37, 37, 0, 0, 0,
- 0, 0, 45, 45, 0, 14, 14, 14, 14, 14,
- 14, 14, 14, 0, 0, 0, 14, 14, 0, 0,
- 0, 0, 0, 0, 0, 0, 37, 37, 14, 0,
- 14, 14, 14, 14, 14, 0, 0, 0, 0, 14,
- 14, 14, 14, 0, 0, 37, 14, 0, 14, 14,
- 14, 14, 14, 0, 0, 0, 37, 37, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 0, 0, 44, 44, 0, 0, 0, 0, 44,
- 0, 66, 0, 0, 27, 44, 28, 44, 44, 44,
- 44, 44, 0, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 0, 44, 0, 44, 44, 44, 44, 44,
- 0, 0, 0, 0, 0, 0, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 0, 0, 45, 45, 0,
- 0, 0, 0, 45, 0, 0, 0, 0, 0, 45,
- 0, 45, 45, 45, 45, 45, 0, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 0, 45, 0, 45,
- 45, 45, 45, 45, 35, 0, 0, 27, 0, 28,
- 37, 37, 37, 37, 37, 37, 37, 37, 37, 0,
- 0, 37, 37, 36, 0, 0, 0, 37, 0, 0,
- 0, 0, 0, 37, 0, 37, 37, 37, 37, 37,
- 0, 0, 37, 37, 37, 37, 37, 37, 37, 37,
- 0, 37, 0, 37, 0, 0, 37, 37, 0, 0,
- 36, 0, 0, 36, 36, 36, 36, 36, 36, 0,
- 36, 0, 0, 0, 0, 0, 0, 0, 40, 0,
- 0, 36, 36, 36, 0, 36, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 36, 36, 40, 40,
- 0, 40, 40, 40, 0, 0, 0, 0, 0, 41,
- 0, 0, 0, 0, 0, 36, 40, 40, 40, 0,
- 40, 40, 0, 0, 12, 13, 36, 36, 0, 14,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 16, 0, 17, 18, 19, 0, 21, 0, 41,
- 41, 40, 41, 41, 41, 0, 0, 33, 0, 26,
- 0, 0, 30, 31, 32, 33, 0, 41, 41, 41,
- 0, 41, 41, 0, 0, 0, 0, 0, 0, 0,
- 0, 40, 40, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 33, 33, 0,
- 0, 33, 41, 11, 0, 126, 127, 12, 13, 0,
- 0, 15, 14, 15, 0, 33, 33, 33, 0, 33,
- 33, 0, 0, 0, 16, 0, 17, 18, 19, 0,
- 21, 0, 41, 41, 0, 22, 23, 24, 25, 0,
- 0, 0, 26, 0, 29, 30, 31, 32, 33, 0,
- 33, 15, 0, 0, 15, 0, 15, 0, 0, 0,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 7,
- 15, 36, 36, 0, 0, 0, 0, 36, 0, 0,
- 33, 33, 0, 36, 0, 36, 36, 36, 36, 36,
- 0, 36, 0, 0, 36, 36, 36, 36, 36, 36,
- 0, 36, 0, 36, 36, 36, 36, 36, 0, 7,
- 0, 0, 7, 0, 7, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 0, 0, 40, 40, 7, 0,
- 0, 0, 40, 0, 15, 0, 0, 0, 40, 6,
- 40, 40, 40, 40, 40, 0, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 0, 40, 0, 40, 40,
- 40, 40, 40, 0, 0, 0, 41, 41, 41, 41,
- 41, 41, 41, 41, 41, 0, 0, 41, 41, 6,
- 0, 0, 6, 41, 6, 0, 0, 0, 0, 41,
- 0, 41, 41, 41, 41, 41, 0, 41, 41, 41,
- 41, 41, 41, 41, 41, 41, 0, 41, 0, 41,
- 41, 41, 41, 41, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 34, 0, 33, 33, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 33, 0, 33,
- 33, 33, 33, 33, 0, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 0, 33, 0, 33, 33, 33,
- 33, 33, 6, 34, 34, 0, 0, 34, 15, 15,
- 15, 15, 15, 15, 15, 15, 0, 12, 0, 15,
- 15, 34, 34, 34, 0, 34, 34, 0, 0, 0,
- 0, 15, 0, 15, 15, 15, 15, 15, 0, 0,
- 0, 0, 15, 15, 15, 15, 0, 0, 0, 15,
- 0, 15, 15, 15, 15, 15, 34, 12, 0, 0,
- 12, 0, 12, 0, 0, 0, 7, 7, 7, 7,
- 7, 7, 7, 7, 5, 0, 12, 7, 7, 0,
- 0, 0, 0, 0, 0, 0, 34, 34, 0, 7,
- 0, 7, 7, 7, 7, 7, 0, 0, 0, 0,
- 7, 7, 7, 7, 0, 0, 0, 7, 0, 7,
- 7, 7, 7, 7, 5, 0, 0, 5, 0, 5,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 6, 6, 6, 0,
- 12, 0, 6, 6, 0, 2, 0, 6, 6, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
- 0, 6, 6, 6, 6, 6, 0, 0, 0, 0,
- 6, 6, 6, 6, 0, 0, 0, 6, 0, 6,
- 6, 6, 6, 6, 0, 2, 0, 0, 2, 0,
- 2, 0, 0, 0, 0, 0, 0, 5, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 0,
+#define YYTABLESIZE 8273
+short yytable[] = { 129,
+ 85, 284, 55, 285, 96, 318, 6, 312, 79, 94,
+ 92, 81, 93, 81, 95, 232, 257, 16, 75, 155,
+ 76, 81, 77, 81, 311, 81, 280, 81, 96, 264,
+ 41, 84, 49, 94, 317, 99, 50, 85, 95, 97,
+ 85, 85, 85, 85, 85, 85, 17, 85, 100, 101,
+ 81, 266, 18, 69, 24, 62, 51, 98, 85, 85,
+ 85, 97, 85, 85, 52, 33, 34, 60, 202, 240,
+ 155, 157, 241, 100, 101, 125, 126, 53, 258, 98,
+ 19, 158, 159, 54, 57, 97, 58, 59, 61, 62,
+ 63, 64, 62, 85, 85, 78, 62, 62, 62, 62,
+ 62, 80, 62, 98, 120, 114, 98, 137, 196, 264,
+ 37, 130, 85, 62, 62, 62, 131, 62, 62, 264,
+ 132, 144, 152, 85, 85, 308, 309, 310, 151, 157,
+ 161, 162, 165, 173, 172, 75, 167, 76, 207, 77,
+ 214, 226, 91, 220, 221, 322, 323, 37, 62, 62,
+ 325, 37, 37, 37, 37, 37, 222, 37, 198, 199,
+ 91, 83, 250, 91, 125, 126, 287, 62, 37, 37,
+ 37, 267, 37, 37, 239, 288, 291, 304, 62, 62,
+ 305, 316, 315, 321, 1, 91, 116, 91, 117, 116,
+ 260, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 268, 37, 37, 0, 0, 3, 4, 5,
+ 0, 124, 0, 0, 127, 0, 229, 230, 231, 256,
+ 0, 0, 37, 65, 0, 91, 28, 0, 29, 124,
+ 0, 0, 127, 37, 37, 24, 0, 0, 82, 83,
+ 82, 83, 91, 261, 262, 0, 33, 34, 82, 83,
+ 82, 83, 82, 83, 82, 83, 0, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 16, 16, 85, 85,
+ 85, 0, 307, 17, 17, 85, 0, 82, 83, 18,
+ 18, 85, 117, 85, 85, 85, 85, 85, 119, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 0, 85,
+ 117, 85, 85, 85, 85, 85, 119, 19, 19, 0,
+ 303, 0, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 0, 0, 62, 62, 62, 0, 313, 0, 0,
+ 62, 0, 0, 0, 0, 0, 62, 121, 62, 62,
+ 62, 62, 62, 0, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 0, 62, 121, 62, 62, 62, 62,
+ 62, 91, 91, 91, 0, 0, 91, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 0, 0, 37, 37,
+ 37, 57, 0, 0, 0, 37, 0, 0, 0, 0,
+ 125, 37, 0, 37, 37, 37, 37, 37, 128, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 125, 37,
+ 0, 37, 37, 37, 37, 37, 128, 0, 57, 0,
+ 0, 57, 57, 57, 57, 57, 57, 0, 57, 0,
+ 124, 124, 124, 127, 127, 127, 88, 0, 118, 57,
+ 57, 0, 0, 57, 57, 0, 12, 13, 110, 111,
+ 0, 14, 15, 16, 0, 0, 118, 121, 122, 0,
+ 0, 0, 0, 0, 17, 0, 18, 19, 20, 0,
+ 22, 120, 0, 88, 57, 57, 88, 88, 88, 88,
+ 88, 88, 27, 88, 0, 31, 32, 33, 34, 120,
+ 0, 90, 0, 57, 88, 88, 88, 0, 88, 88,
+ 0, 117, 117, 117, 57, 57, 0, 119, 119, 119,
+ 0, 0, 0, 0, 0, 0, 171, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 90, 88,
+ 88, 90, 90, 90, 90, 0, 90, 0, 90, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 90,
+ 90, 90, 0, 90, 90, 0, 121, 121, 121, 88,
+ 88, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 218, 219, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 90, 90, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 90, 0, 0, 0, 0, 0, 125,
+ 125, 125, 0, 0, 90, 90, 0, 128, 128, 128,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 0, 0, 57,
+ 57, 57, 0, 0, 0, 0, 57, 118, 118, 118,
+ 0, 0, 57, 289, 57, 57, 57, 57, 57, 0,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 0,
+ 57, 0, 57, 57, 57, 57, 57, 0, 0, 0,
+ 120, 120, 120, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 0, 0, 88, 88, 88, 0, 0, 0,
+ 0, 88, 0, 0, 0, 0, 0, 88, 0, 88,
+ 88, 88, 88, 88, 0, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 0, 88, 0, 88, 88, 88,
+ 88, 88, 0, 0, 0, 0, 0, 0, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 0, 0, 90,
+ 90, 90, 23, 0, 0, 0, 90, 0, 0, 0,
+ 0, 0, 90, 0, 90, 90, 90, 90, 90, 0,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 0,
+ 90, 0, 90, 90, 90, 90, 90, 0, 0, 23,
+ 0, 0, 23, 23, 23, 23, 23, 23, 0, 23,
+ 0, 0, 0, 0, 0, 0, 0, 54, 0, 0,
+ 23, 23, 23, 0, 23, 23, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 54, 23, 23, 54, 54, 54,
+ 54, 54, 54, 0, 54, 0, 0, 0, 0, 0,
+ 0, 39, 0, 0, 23, 54, 54, 54, 0, 54,
+ 54, 0, 0, 0, 0, 23, 23, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 39, 0,
+ 54, 39, 39, 39, 39, 39, 39, 0, 39, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+ 39, 39, 0, 39, 39, 0, 0, 0, 0, 0,
+ 54, 54, 0, 0, 0, 53, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 39, 39, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 53, 39, 0, 53, 53, 53, 53, 53,
+ 53, 0, 53, 0, 39, 39, 0, 0, 0, 0,
+ 0, 0, 0, 53, 53, 53, 0, 53, 53, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 0, 0,
+ 23, 23, 23, 0, 0, 0, 0, 23, 53, 0,
+ 0, 0, 0, 23, 0, 23, 23, 23, 23, 23,
+ 0, 23, 23, 0, 23, 23, 23, 23, 23, 23,
+ 0, 23, 0, 23, 23, 23, 23, 23, 53, 53,
+ 0, 0, 0, 0, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 0, 0, 54, 54, 54, 0, 0,
+ 0, 0, 54, 0, 0, 0, 0, 0, 54, 0,
+ 54, 54, 54, 54, 54, 0, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 0, 54, 0, 54, 54,
+ 54, 54, 54, 0, 0, 0, 0, 0, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 0, 0, 39,
+ 39, 39, 0, 0, 0, 0, 39, 0, 0, 0,
+ 0, 0, 39, 0, 39, 39, 39, 39, 39, 0,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 0,
+ 39, 0, 39, 0, 0, 39, 39, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 0, 0, 53, 53, 53, 44, 0, 0, 0,
+ 53, 0, 0, 0, 0, 0, 53, 0, 53, 53,
+ 53, 53, 53, 0, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 0, 53, 0, 53, 53, 53, 53,
+ 53, 0, 0, 44, 0, 0, 44, 44, 44, 44,
+ 44, 44, 0, 44, 0, 0, 0, 0, 0, 0,
+ 45, 0, 0, 0, 44, 44, 44, 0, 44, 44,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 45, 0, 44,
+ 45, 45, 45, 45, 45, 45, 0, 45, 0, 0,
+ 0, 0, 0, 0, 46, 0, 0, 0, 45, 45,
+ 45, 0, 45, 45, 0, 0, 0, 0, 0, 44,
+ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 46, 0, 45, 46, 46, 46, 46, 46, 46,
+ 0, 46, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 46, 46, 46, 0, 46, 46, 0, 0,
+ 0, 0, 0, 45, 45, 0, 0, 0, 0, 47,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 46, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 47, 0, 0, 47,
+ 47, 47, 47, 47, 47, 0, 47, 46, 46, 0,
+ 0, 0, 0, 0, 0, 0, 0, 47, 47, 47,
+ 0, 47, 47, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 0, 0, 44, 44, 44, 0, 0, 0,
+ 0, 44, 47, 0, 0, 0, 0, 44, 0, 44,
+ 44, 44, 44, 44, 0, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 0, 44, 0, 44, 44, 44,
+ 44, 44, 47, 47, 0, 0, 0, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 0, 0, 45, 45,
+ 45, 0, 0, 0, 0, 45, 0, 0, 0, 0,
+ 0, 45, 0, 45, 45, 45, 45, 45, 0, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 0, 45,
+ 0, 45, 45, 45, 45, 45, 0, 0, 0, 0,
+ 0, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 0, 0, 46, 46, 46, 0, 0, 0, 0, 46,
+ 0, 0, 0, 0, 0, 46, 0, 46, 46, 46,
+ 46, 46, 0, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 0, 46, 0, 46, 46, 46, 46, 46,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 0, 0, 47, 47, 47,
+ 39, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+ 47, 0, 47, 47, 47, 47, 47, 0, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 0, 47, 0,
+ 47, 47, 47, 47, 47, 0, 0, 39, 0, 0,
+ 39, 39, 39, 39, 39, 39, 0, 39, 0, 0,
+ 0, 0, 0, 0, 0, 36, 0, 0, 39, 39,
+ 39, 0, 39, 39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 36, 39, 39, 36, 36, 36, 36, 36,
+ 36, 0, 36, 0, 0, 0, 0, 0, 0, 0,
+ 42, 0, 39, 36, 36, 36, 0, 36, 0, 0,
+ 0, 0, 0, 39, 39, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 36, 36,
+ 42, 42, 0, 42, 42, 42, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 36, 42, 42,
+ 42, 0, 42, 42, 0, 0, 0, 0, 36, 36,
+ 0, 0, 0, 43, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 42, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 43, 43, 0, 43, 43, 43, 0,
+ 0, 0, 0, 42, 42, 0, 0, 0, 0, 0,
+ 0, 43, 43, 43, 0, 43, 43, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 0, 0, 39, 39,
+ 39, 0, 0, 0, 0, 39, 43, 0, 0, 0,
+ 0, 39, 0, 39, 39, 39, 39, 39, 0, 0,
+ 39, 39, 39, 39, 39, 39, 39, 39, 0, 39,
+ 0, 39, 0, 0, 39, 39, 43, 43, 0, 0,
+ 0, 0, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 0, 0, 36, 36, 36, 0, 0, 0, 0,
+ 36, 0, 0, 0, 0, 0, 36, 0, 36, 36,
+ 36, 36, 36, 0, 36, 0, 0, 36, 36, 36,
+ 36, 36, 36, 0, 36, 0, 36, 36, 36, 36,
+ 36, 0, 0, 0, 0, 0, 0, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 0, 14, 42, 42,
+ 42, 0, 0, 0, 0, 42, 0, 0, 0, 0,
+ 0, 42, 0, 42, 42, 42, 42, 42, 0, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 0, 42,
+ 0, 42, 42, 42, 42, 42, 0, 14, 0, 0,
+ 14, 0, 14, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 33,
+ 0, 43, 43, 43, 0, 0, 0, 0, 43, 0,
+ 0, 0, 0, 0, 43, 0, 43, 43, 43, 43,
+ 43, 0, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 0, 43, 0, 43, 43, 43, 43, 43, 33,
+ 33, 0, 0, 33, 0, 0, 0, 0, 0, 34,
+ 14, 0, 0, 0, 0, 0, 0, 33, 33, 33,
+ 0, 33, 33, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,
+ 34, 0, 33, 34, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 34, 34, 34,
0, 34, 34, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 34, 0, 34, 34, 34, 34, 34,
- 0, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 0, 34, 0, 34, 34, 34, 34, 34, 2, 0,
- 0, 0, 0, 0, 12, 12, 12, 12, 0, 12,
- 12, 12, 0, 0, 0, 12, 12, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 12,
- 12, 12, 12, 12, 0, 0, 0, 0, 12, 12,
- 12, 12, 0, 0, 0, 12, 0, 12, 12, 12,
- 12, 12, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 5, 5, 5, 0, 0, 0, 5, 5, 0,
- 0, 0, 5, 5, 0, 0, 66, 237, 0, 27,
- 238, 28, 0, 0, 5, 0, 5, 5, 5, 5,
- 5, 0, 0, 0, 0, 5, 5, 5, 5, 86,
- 0, 0, 5, 0, 5, 5, 5, 5, 5, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 66, 239, 0, 27, 240, 28, 0,
- 0, 0, 2, 2, 2, 0, 0, 0, 2, 2,
- 0, 0, 0, 2, 2, 58, 86, 0, 0, 0,
- 0, 0, 0, 0, 0, 2, 0, 2, 2, 2,
- 2, 2, 0, 0, 0, 0, 2, 2, 2, 2,
- 0, 0, 0, 2, 0, 2, 2, 2, 2, 2,
- 0, 0, 58, 0, 0, 58, 58, 58, 58, 58,
- 58, 0, 58, 0, 0, 0, 0, 0, 0, 0,
- 54, 0, 0, 58, 58, 58, 0, 58, 58, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 54, 58, 58,
- 54, 54, 54, 54, 54, 54, 0, 54, 56, 0,
- 0, 0, 0, 0, 0, 0, 0, 58, 54, 54,
- 0, 0, 54, 54, 0, 0, 0, 0, 58, 58,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 56, 0, 0, 0, 56,
- 56, 0, 56, 54, 54, 56, 0, 0, 0, 12,
- 13, 0, 0, 0, 14, 15, 56, 56, 56, 0,
- 56, 56, 54, 0, 0, 0, 16, 0, 17, 18,
- 19, 0, 21, 54, 54, 0, 0, 22, 23, 24,
- 25, 0, 0, 0, 26, 0, 0, 30, 31, 32,
- 33, 56, 56, 0, 0, 0, 12, 13, 0, 0,
- 0, 14, 15, 0, 0, 0, 0, 0, 0, 0,
- 56, 0, 0, 16, 0, 17, 18, 19, 0, 21,
- 0, 56, 56, 0, 22, 23, 24, 25, 0, 0,
- 0, 26, 0, 0, 30, 31, 32, 33, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 58, 58, 58, 58, 58, 58, 58, 58,
- 58, 0, 0, 58, 58, 0, 0, 0, 0, 58,
- 0, 0, 0, 0, 0, 58, 0, 58, 58, 58,
- 58, 58, 0, 58, 58, 58, 58, 0, 58, 58,
- 58, 58, 0, 58, 0, 58, 58, 58, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 54, 54, 54,
- 54, 54, 54, 54, 54, 54, 0, 0, 54, 54,
- 0, 0, 0, 0, 54, 0, 0, 0, 0, 0,
- 54, 0, 54, 54, 54, 54, 54, 29, 54, 54,
- 54, 54, 0, 54, 54, 54, 54, 0, 54, 0,
- 54, 54, 54, 0, 0, 56, 56, 56, 56, 56,
- 56, 0, 0, 56, 0, 0, 0, 0, 0, 0,
- 0, 0, 56, 0, 29, 0, 0, 0, 29, 29,
- 0, 29, 25, 56, 29, 0, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 29, 29, 29, 56, 29,
- 29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
- 0, 0, 0, 25, 25, 0, 25, 27, 0, 25,
- 29, 29, 0, 0, 0, 0, 0, 0, 0, 0,
- 25, 25, 25, 0, 25, 25, 0, 0, 0, 29,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 29, 29, 0, 0, 27, 0, 0, 0, 27, 27,
- 0, 27, 0, 0, 27, 25, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 27, 27, 27, 0, 27,
- 27, 0, 0, 0, 25, 0, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 25, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 27, 27, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 26, 0, 0, 0, 26, 26, 27,
- 26, 0, 0, 26, 0, 0, 0, 0, 0, 0,
- 27, 27, 0, 0, 26, 26, 26, 0, 26, 26,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
- 26, 0, 0, 0, 29, 29, 29, 29, 29, 29,
- 0, 0, 29, 0, 0, 0, 0, 0, 26, 0,
- 0, 29, 0, 0, 0, 0, 0, 0, 0, 26,
- 26, 0, 29, 0, 0, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 0, 0, 0, 29, 0, 25,
- 25, 25, 25, 25, 25, 0, 0, 25, 0, 0,
- 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 25, 0, 0,
+ 0, 0, 33, 33, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 34, 15, 0, 15, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 12, 15,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 34, 34, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 14, 14, 14, 14, 14, 14,
+ 14, 14, 0, 0, 0, 14, 14, 14, 12, 0,
+ 0, 12, 0, 12, 0, 0, 0, 7, 14, 0,
+ 14, 14, 14, 14, 14, 0, 0, 12, 0, 14,
+ 14, 14, 14, 15, 0, 0, 14, 0, 14, 14,
+ 14, 14, 14, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+ 7, 0, 7, 0, 0, 0, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 0, 7, 33, 33, 33,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 33, 12, 33, 33, 33, 33, 33, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 0, 33, 0,
+ 33, 33, 33, 33, 33, 0, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 0, 0, 34, 34, 34,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 34, 6, 34, 34, 34, 34, 34, 0, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 0, 34, 0,
+ 34, 34, 34, 34, 34, 0, 0, 15, 15, 15,
+ 15, 15, 15, 15, 15, 0, 0, 0, 15, 15,
+ 15, 6, 0, 0, 6, 0, 6, 0, 0, 0,
+ 0, 15, 0, 15, 15, 15, 15, 15, 0, 0,
+ 5, 0, 15, 15, 15, 15, 0, 0, 0, 15,
+ 0, 15, 15, 15, 15, 15, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 12, 12, 12, 12, 0,
+ 12, 12, 12, 0, 0, 0, 12, 12, 12, 0,
+ 5, 0, 0, 5, 0, 5, 0, 0, 0, 12,
+ 2, 12, 12, 12, 12, 12, 0, 0, 0, 0,
+ 12, 12, 12, 12, 6, 0, 0, 12, 0, 12,
+ 12, 12, 12, 12, 7, 7, 7, 7, 7, 7,
+ 7, 7, 0, 0, 0, 7, 7, 7, 0, 0,
+ 2, 0, 0, 2, 0, 2, 0, 0, 7, 0,
+ 7, 7, 7, 7, 7, 0, 0, 0, 60, 7,
+ 7, 7, 7, 0, 0, 0, 7, 0, 7, 7,
+ 7, 7, 7, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 60, 0, 0, 60, 60,
+ 60, 60, 60, 60, 0, 60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 60, 60, 60, 0,
+ 60, 60, 0, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 6, 6,
+ 6, 60, 60, 0, 6, 6, 0, 0, 0, 6,
+ 6, 6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 60, 0, 6, 0, 6, 6, 6, 6, 6, 0,
+ 0, 60, 60, 6, 6, 6, 6, 0, 0, 0,
+ 6, 0, 6, 6, 6, 6, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 5, 5, 5,
+ 0, 0, 0, 5, 5, 0, 0, 0, 5, 5,
+ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5, 0, 5, 5, 5, 5, 5, 0, 0,
+ 0, 0, 5, 5, 5, 5, 0, 0, 0, 5,
+ 0, 5, 5, 5, 5, 5, 0, 2, 2, 2,
+ 0, 0, 0, 2, 2, 0, 0, 0, 2, 2,
+ 2, 0, 0, 0, 0, 36, 0, 0, 28, 0,
+ 29, 2, 0, 2, 2, 2, 2, 2, 0, 0,
+ 0, 0, 2, 2, 2, 2, 0, 0, 0, 2,
+ 0, 2, 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 0, 56, 60, 60, 60, 0,
+ 0, 0, 0, 60, 0, 0, 0, 0, 0, 60,
+ 0, 60, 60, 60, 60, 60, 0, 60, 60, 60,
+ 60, 0, 60, 60, 60, 60, 0, 60, 35, 60,
+ 60, 60, 56, 0, 0, 56, 56, 56, 56, 56,
+ 56, 0, 56, 58, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 56, 56, 0, 0, 56, 56, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 58, 0, 0, 0, 58, 58, 0, 58, 56, 56,
+ 58, 29, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 58, 58, 58, 0, 58, 58, 56, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 56,
+ 0, 0, 0, 0, 0, 0, 0, 0, 29, 0,
+ 0, 0, 29, 29, 0, 29, 58, 58, 29, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 29,
+ 29, 29, 0, 29, 29, 58, 0, 0, 0, 0,
+ 0, 0, 9, 10, 11, 0, 58, 58, 12, 13,
+ 0, 0, 0, 14, 15, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 29, 29, 17, 0, 18, 19,
+ 20, 21, 22, 0, 0, 0, 0, 23, 24, 25,
+ 26, 0, 0, 29, 27, 0, 30, 31, 32, 33,
+ 34, 0, 0, 0, 29, 29, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 0, 0, 56, 56, 56, 0, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 56, 0, 56, 56,
+ 56, 56, 56, 0, 56, 56, 56, 56, 0, 56,
+ 56, 56, 56, 0, 56, 0, 56, 56, 56, 0,
+ 58, 58, 58, 58, 58, 58, 0, 0, 58, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 58, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,
+ 0, 25, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 0, 0, 0, 58, 0, 0, 0, 29, 29,
+ 29, 29, 29, 29, 0, 0, 29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 29, 0, 25, 0,
+ 0, 0, 25, 25, 0, 25, 27, 29, 25, 0,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 25,
+ 25, 25, 29, 25, 25, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 27, 0, 0, 0, 27, 27, 0,
+ 27, 26, 0, 27, 25, 25, 0, 0, 0, 0,
+ 0, 0, 0, 0, 27, 27, 27, 0, 27, 27,
+ 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 25, 25, 0, 0, 26, 0,
+ 0, 0, 26, 26, 0, 26, 0, 0, 26, 27,
+ 27, 0, 0, 0, 0, 0, 0, 0, 0, 26,
+ 26, 26, 0, 26, 26, 0, 0, 0, 27, 0,
+ 59, 0, 0, 0, 0, 0, 0, 0, 0, 27,
+ 27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 26, 26, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 59, 0, 0,
+ 0, 59, 59, 26, 59, 0, 0, 59, 0, 0,
+ 0, 0, 0, 0, 26, 26, 0, 0, 59, 59,
+ 59, 0, 59, 59, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 59, 59, 0, 0, 0, 25, 25,
+ 25, 25, 25, 25, 0, 0, 25, 0, 0, 0,
+ 0, 0, 59, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 59, 59, 0, 0, 25, 0, 0,
25, 25, 25, 25, 25, 25, 25, 25, 25, 0,
- 0, 0, 25, 0, 27, 27, 27, 27, 27, 27,
- 0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
- 0, 27, 0, 0, 57, 0, 0, 0, 0, 0,
+ 0, 0, 25, 27, 27, 27, 27, 27, 27, 0,
+ 0, 27, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 27, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 27, 0, 0, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 0, 0, 0, 27, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 57, 103, 104, 0, 57, 57, 0, 57, 0,
- 0, 57, 0, 26, 26, 26, 26, 26, 26, 0,
- 0, 26, 57, 57, 57, 0, 57, 57, 0, 0,
- 26, 88, 0, 0, 0, 0, 134, 0, 136, 137,
- 0, 26, 0, 0, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 0, 0, 0, 26, 57, 57, 0,
- 0, 0, 0, 0, 0, 0, 159, 160, 88, 0,
- 0, 0, 88, 88, 0, 88, 57, 0, 88, 89,
- 0, 0, 0, 0, 0, 0, 0, 57, 57, 88,
- 88, 88, 0, 88, 88, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 89, 0, 0, 0,
- 89, 89, 0, 89, 88, 88, 89, 0, 0, 214,
+ 27, 27, 27, 27, 0, 0, 0, 27, 26, 26,
+ 26, 26, 26, 26, 0, 0, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 0, 0, 91,
+ 0, 0, 0, 0, 0, 0, 0, 26, 0, 0,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 0,
+ 0, 0, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 91, 0, 0, 0,
+ 91, 91, 0, 91, 0, 0, 91, 59, 59, 59,
+ 59, 59, 59, 0, 0, 59, 0, 91, 91, 91,
+ 0, 91, 91, 0, 0, 59, 20, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 59, 0, 0, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 0, 0,
+ 0, 59, 91, 91, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 20, 0, 0, 0, 20, 20, 0,
+ 20, 91, 0, 20, 35, 0, 0, 0, 0, 0,
+ 0, 0, 91, 91, 20, 20, 20, 0, 20, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35, 0, 0, 0, 35, 35, 0, 35, 20,
+ 20, 35, 0, 0, 0, 0, 0, 0, 0, 92,
+ 0, 0, 35, 35, 35, 0, 35, 0, 20, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,
+ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 92, 35, 35, 0,
+ 92, 92, 0, 92, 0, 0, 92, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 35, 92, 92, 92,
+ 0, 92, 0, 0, 0, 0, 0, 35, 35, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 91, 91, 91, 91,
+ 91, 91, 92, 92, 91, 65, 0, 0, 28, 0,
+ 29, 0, 0, 0, 91, 93, 0, 0, 0, 0,
+ 0, 92, 0, 0, 0, 91, 0, 0, 91, 91,
+ 91, 0, 92, 92, 0, 91, 91, 0, 0, 0,
+ 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 93, 0, 0, 0, 93, 93, 0, 93,
+ 0, 0, 93, 20, 20, 20, 20, 20, 20, 0,
+ 0, 20, 0, 93, 93, 93, 0, 93, 0, 36,
+ 0, 20, 28, 0, 29, 0, 0, 0, 0, 0,
+ 0, 0, 20, 0, 0, 20, 20, 20, 302, 0,
+ 89, 0, 20, 20, 0, 0, 0, 20, 93, 93,
+ 0, 35, 35, 35, 35, 35, 35, 0, 0, 35,
+ 0, 0, 0, 0, 0, 0, 0, 93, 0, 35,
+ 0, 0, 0, 0, 0, 0, 0, 89, 93, 93,
+ 35, 89, 89, 35, 35, 35, 0, 89, 0, 0,
+ 35, 35, 0, 0, 0, 35, 0, 0, 89, 89,
+ 89, 0, 89, 0, 0, 0, 92, 92, 92, 92,
+ 92, 92, 16, 0, 92, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 92, 0, 0, 0, 0, 0,
+ 0, 0, 0, 89, 89, 92, 0, 0, 92, 92,
+ 92, 0, 0, 0, 0, 92, 92, 0, 0, 16,
+ 92, 0, 89, 16, 16, 0, 16, 0, 0, 16,
+ 0, 0, 0, 89, 89, 0, 125, 126, 12, 13,
+ 16, 16, 0, 14, 15, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 17, 0, 18, 19,
+ 20, 0, 22, 0, 0, 0, 0, 23, 24, 25,
+ 26, 0, 0, 0, 27, 16, 16, 31, 32, 33,
+ 34, 0, 93, 93, 93, 93, 93, 93, 0, 0,
+ 93, 0, 0, 0, 16, 0, 0, 0, 0, 0,
+ 93, 0, 0, 0, 0, 16, 16, 0, 11, 0,
+ 0, 93, 12, 13, 93, 93, 93, 14, 15, 16,
+ 0, 93, 93, 0, 0, 0, 93, 0, 0, 0,
+ 17, 0, 18, 19, 20, 0, 22, 0, 0, 0,
+ 0, 23, 24, 25, 26, 0, 0, 0, 27, 0,
+ 30, 31, 32, 33, 34, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 89, 89, 89,
- 222, 89, 224, 88, 225, 0, 0, 0, 0, 0,
- 0, 90, 0, 0, 88, 88, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 247, 0, 0, 0,
- 0, 0, 89, 89, 0, 0, 0, 0, 0, 0,
- 0, 264, 265, 266, 267, 268, 0, 0, 90, 0,
- 0, 89, 90, 90, 0, 90, 0, 0, 90, 0,
- 0, 0, 89, 89, 0, 0, 0, 0, 0, 90,
- 90, 90, 0, 90, 0, 0, 0, 0, 0, 0,
- 0, 57, 57, 57, 57, 57, 57, 0, 0, 57,
- 292, 0, 0, 0, 294, 295, 296, 0, 57, 20,
- 301, 0, 0, 0, 90, 90, 0, 0, 0, 57,
- 0, 0, 57, 57, 57, 57, 57, 57, 57, 57,
- 57, 0, 0, 90, 57, 314, 315, 0, 0, 0,
- 0, 319, 0, 0, 90, 90, 20, 0, 0, 0,
- 20, 20, 0, 20, 0, 0, 20, 0, 88, 88,
- 88, 88, 88, 88, 0, 0, 88, 20, 20, 20,
- 0, 20, 0, 0, 0, 88, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 88, 0, 0, 88,
- 88, 88, 0, 0, 0, 0, 88, 88, 0, 0,
- 0, 88, 20, 20, 0, 0, 89, 89, 89, 89,
- 89, 89, 0, 0, 89, 0, 0, 0, 0, 66,
- 156, 20, 27, 89, 28, 0, 0, 0, 0, 35,
- 0, 0, 20, 20, 89, 0, 0, 89, 89, 89,
- 0, 0, 86, 0, 89, 89, 0, 0, 0, 89,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,
- 35, 35, 0, 35, 0, 0, 35, 0, 90, 90,
- 90, 90, 90, 90, 0, 0, 90, 35, 35, 35,
- 0, 35, 0, 0, 0, 90, 86, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 90, 0, 0, 90,
- 90, 90, 0, 0, 0, 0, 90, 90, 0, 0,
- 0, 90, 35, 35, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 86, 0, 0, 0, 86, 86, 0,
- 0, 35, 0, 86, 16, 0, 0, 0, 0, 0,
- 0, 0, 35, 35, 86, 86, 86, 0, 86, 0,
- 0, 0, 0, 0, 0, 0, 20, 20, 20, 20,
- 20, 20, 0, 0, 20, 0, 0, 0, 0, 0,
- 0, 16, 0, 20, 0, 16, 16, 0, 16, 86,
- 86, 16, 0, 0, 20, 0, 0, 20, 20, 20,
- 0, 0, 16, 16, 20, 20, 0, 0, 86, 20,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,
- 86, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 16, 16, 0,
- 0, 0, 12, 13, 0, 0, 0, 14, 15, 0,
- 0, 0, 0, 0, 0, 0, 16, 0, 0, 16,
- 0, 17, 18, 19, 0, 21, 0, 16, 16, 0,
- 22, 23, 24, 25, 0, 0, 0, 26, 0, 0,
- 30, 31, 32, 33, 0, 0, 35, 35, 35, 35,
- 35, 35, 0, 0, 35, 0, 0, 0, 0, 0,
- 0, 0, 0, 35, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 35, 0, 0, 35, 35, 35,
- 0, 0, 0, 0, 35, 35, 0, 0, 0, 35,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 86, 86, 86, 86, 86, 86, 0,
- 0, 86, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 86, 0, 0, 86, 86, 86, 0, 0, 0,
- 0, 86, 86, 0, 0, 0, 86, 0, 0, 0,
- 0, 16, 16, 16, 16, 16, 16, 0, 41, 16,
- 0, 0, 0, 0, 0, 53, 0, 0, 16, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
- 41, 0, 16, 16, 16, 0, 41, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 0, 0,
- 106, 53, 109, 0, 0, 0, 113, 114, 0, 117,
- 119, 120, 0, 53, 53, 124, 125, 41, 0, 0,
- 0, 0, 0, 0, 0, 66, 0, 0, 27, 0,
- 28, 0, 0, 135, 0, 0, 41, 139, 141, 142,
- 143, 144, 0, 0, 189, 0, 0, 0, 0, 0,
- 0, 41, 0, 0, 0, 0, 0, 0, 0, 109,
- 0, 0, 0, 0, 0, 0, 162, 0, 0, 0,
- 110, 0, 53, 110, 0, 110, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 41, 41, 110,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 187, 0,
- 202, 203, 0, 0, 205, 206, 207, 208, 210, 0,
- 0, 0, 0, 212, 213, 109, 53, 53, 109, 0,
- 109, 220, 0, 0, 0, 221, 0, 0, 0, 0,
- 0, 0, 0, 0, 109, 0, 232, 0, 0, 233,
- 0, 0, 0, 110, 0, 110, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 41, 41,
- 258, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 270, 0, 271,
- 0, 272, 0, 273, 0, 274, 0, 0, 0, 103,
- 276, 0, 103, 0, 103, 277, 278, 0, 109, 0,
- 109, 0, 0, 53, 0, 0, 0, 0, 103, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 41, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 174, 126, 127, 12, 13,
- 41, 175, 176, 14, 15, 177, 0, 178, 179, 0,
- 180, 181, 182, 183, 184, 16, 185, 17, 18, 19,
- 0, 21, 186, 0, 0, 0, 22, 23, 24, 25,
- 0, 0, 103, 26, 103, 0, 30, 31, 32, 33,
- 110, 0, 0, 110, 110, 0, 110, 110, 110, 110,
- 110, 110, 110, 110, 0, 110, 110, 110, 110, 110,
- 110, 110, 110, 110, 110, 0, 110, 110, 0, 0,
- 0, 110, 110, 110, 110, 0, 0, 0, 110, 0,
- 0, 110, 110, 110, 110, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 109, 0, 0, 109, 109,
- 0, 109, 109, 109, 109, 109, 109, 109, 109, 0,
- 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
- 0, 109, 109, 0, 0, 0, 109, 109, 109, 109,
- 0, 0, 0, 109, 0, 0, 109, 109, 109, 109,
- 104, 0, 0, 104, 0, 104, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 104,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 103,
- 0, 0, 103, 103, 0, 103, 103, 103, 103, 103,
- 103, 103, 103, 0, 103, 103, 103, 103, 103, 103,
- 103, 103, 103, 103, 0, 103, 103, 0, 0, 0,
- 103, 103, 103, 103, 0, 0, 0, 103, 0, 0,
- 103, 103, 103, 103, 105, 0, 0, 105, 0, 105,
- 0, 0, 0, 104, 0, 104, 0, 0, 0, 0,
- 0, 0, 0, 105, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 102,
- 0, 0, 102, 0, 102, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 102, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 105, 0, 105,
- 0, 0, 0, 0, 0, 108, 0, 0, 108, 0,
- 108, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 108, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 102, 0, 102, 0, 0, 0, 66, 105,
- 0, 27, 0, 28, 0, 0, 0, 0, 0, 0,
- 104, 0, 0, 104, 104, 0, 104, 104, 104, 104,
- 104, 104, 104, 104, 0, 104, 104, 104, 104, 104,
- 104, 104, 104, 104, 104, 0, 104, 104, 108, 0,
- 108, 104, 104, 104, 104, 0, 0, 0, 104, 0,
- 0, 104, 104, 104, 104, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 105, 0, 0, 105, 105, 0,
- 105, 105, 105, 105, 105, 105, 105, 105, 0, 105,
- 105, 105, 105, 105, 105, 105, 105, 105, 105, 0,
- 105, 105, 0, 0, 0, 105, 105, 105, 105, 0,
- 0, 0, 105, 0, 0, 105, 105, 105, 105, 102,
- 0, 0, 102, 102, 0, 102, 102, 102, 102, 102,
- 102, 102, 102, 0, 102, 102, 102, 102, 102, 102,
- 102, 102, 102, 102, 35, 102, 102, 27, 0, 28,
- 102, 102, 102, 102, 0, 0, 0, 102, 0, 0,
- 102, 102, 102, 102, 0, 108, 0, 0, 108, 108,
- 0, 108, 108, 108, 108, 108, 108, 108, 108, 0,
- 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
- 0, 108, 108, 0, 0, 0, 108, 108, 108, 108,
- 0, 0, 0, 108, 0, 0, 108, 108, 108, 108,
- 137, 12, 13, 137, 0, 137, 14, 15, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 16, 137,
- 17, 18, 19, 0, 21, 0, 0, 0, 0, 22,
- 23, 24, 25, 0, 0, 0, 26, 0, 0, 30,
- 31, 32, 33, 0, 0, 66, 0, 0, 27, 0,
- 28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 189, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 137, 0, 137, 0, 0, 0, 0,
- 66, 0, 0, 27, 0, 28, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 189,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 187, 0,
- 188, 0, 0, 0, 0, 0, 66, 0, 0, 27,
- 0, 28, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 9, 10, 11, 0, 189, 0, 12, 13, 0,
- 0, 0, 14, 15, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 187, 16, 200, 17, 18, 19, 20,
- 21, 0, 0, 0, 0, 22, 23, 24, 25, 0,
- 0, 0, 26, 0, 29, 30, 31, 32, 33, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 35, 0, 0, 27, 0, 28, 0, 0, 0, 187,
- 137, 201, 0, 137, 137, 0, 137, 137, 137, 137,
- 137, 137, 137, 137, 0, 137, 137, 137, 137, 137,
- 137, 137, 137, 137, 137, 0, 137, 137, 0, 0,
- 0, 137, 137, 137, 137, 0, 0, 0, 137, 0,
- 0, 137, 137, 137, 137, 174, 0, 0, 12, 13,
- 0, 175, 176, 14, 15, 177, 0, 178, 179, 0,
- 180, 181, 182, 183, 184, 16, 185, 17, 18, 19,
- 0, 21, 186, 0, 0, 0, 22, 23, 24, 25,
- 0, 0, 0, 26, 0, 0, 30, 31, 32, 33,
- 174, 0, 0, 12, 13, 0, 175, 176, 14, 15,
- 177, 0, 178, 179, 0, 180, 181, 182, 183, 184,
- 16, 185, 17, 18, 19, 0, 21, 186, 0, 0,
- 0, 22, 23, 24, 25, 0, 0, 0, 26, 0,
- 0, 30, 31, 32, 33, 0, 174, 0, 0, 12,
- 13, 0, 175, 176, 14, 15, 177, 0, 178, 179,
- 0, 180, 181, 182, 183, 184, 16, 185, 17, 18,
- 19, 0, 21, 186, 0, 0, 0, 22, 23, 24,
- 25, 0, 0, 0, 26, 0, 0, 30, 31, 32,
- 33, 66, 0, 0, 27, 0, 28, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 189, 0, 0, 0, 0, 0, 0, 0, 0, 11,
- 0, 0, 0, 12, 13, 0, 0, 0, 14, 15,
- 0, 0, 0, 0, 0, 0, 66, 0, 0, 27,
- 16, 28, 17, 18, 19, 0, 21, 0, 0, 0,
- 0, 22, 23, 24, 25, 189, 0, 0, 26, 0,
- 29, 30, 31, 32, 33, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 187, 0, 231, 0, 0, 0,
- 0, 66, 0, 0, 27, 0, 28, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 189, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 187,
- 0, 285, 0, 0, 0, 0, 0, 107, 0, 0,
- 107, 0, 107, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 107, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 187, 0, 309, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 66, 0, 0,
- 27, 0, 28, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 107, 174, 107, 0, 12, 13, 0, 175, 176, 14,
- 15, 177, 0, 178, 179, 0, 180, 181, 182, 183,
- 184, 16, 185, 17, 18, 19, 0, 21, 186, 0,
- 0, 0, 22, 23, 24, 25, 0, 0, 0, 26,
- 0, 0, 30, 31, 32, 33, 174, 0, 0, 12,
- 13, 0, 175, 176, 14, 15, 177, 0, 178, 179,
- 0, 180, 181, 182, 183, 184, 16, 185, 17, 18,
- 19, 0, 21, 186, 0, 0, 0, 22, 23, 24,
- 25, 0, 0, 0, 26, 0, 0, 30, 31, 32,
- 33, 174, 0, 0, 12, 13, 0, 175, 176, 14,
- 15, 177, 0, 178, 179, 0, 180, 181, 182, 183,
- 184, 16, 185, 17, 18, 19, 66, 21, 186, 27,
- 111, 28, 22, 23, 24, 25, 0, 0, 0, 26,
- 0, 0, 30, 31, 32, 33, 89, 107, 90, 86,
- 107, 107, 0, 107, 107, 107, 107, 107, 0, 107,
- 107, 0, 107, 107, 107, 107, 107, 107, 107, 107,
- 107, 107, 0, 107, 107, 0, 0, 0, 107, 107,
- 107, 107, 0, 0, 0, 107, 0, 0, 107, 107,
- 107, 107, 130, 0, 0, 130, 0, 130, 0, 0,
- 12, 13, 0, 175, 176, 14, 15, 0, 0, 0,
- 0, 130, 180, 181, 182, 183, 184, 16, 0, 17,
- 18, 19, 0, 21, 186, 0, 0, 0, 22, 23,
- 24, 25, 0, 0, 0, 26, 0, 0, 30, 31,
- 32, 33, 66, 0, 0, 27, 0, 28, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 89, 0, 90, 86, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 130, 0, 130, 0, 0,
- 0, 0, 0, 0, 66, 241, 0, 27, 242, 28,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 86, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 243,
- 0, 27, 244, 28, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
- 13, 86, 0, 0, 14, 15, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 16, 0, 17, 18,
- 19, 0, 21, 0, 0, 0, 0, 22, 23, 24,
- 25, 87, 88, 0, 26, 0, 0, 30, 31, 32,
- 33, 66, 248, 0, 27, 249, 28, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 130, 0, 86, 130, 130, 0, 130, 130,
- 130, 130, 130, 0, 130, 130, 0, 130, 130, 130,
- 130, 130, 130, 130, 130, 130, 130, 0, 130, 130,
- 0, 0, 0, 130, 130, 130, 130, 0, 0, 0,
- 130, 0, 0, 130, 130, 130, 130, 35, 0, 0,
- 27, 0, 28, 0, 0, 12, 13, 0, 0, 0,
- 14, 15, 0, 0, 0, 0, 297, 0, 0, 0,
- 0, 0, 16, 0, 17, 18, 19, 0, 21, 0,
- 0, 0, 0, 22, 23, 24, 25, 87, 88, 0,
- 26, 0, 0, 30, 31, 32, 33, 12, 13, 0,
- 0, 108, 14, 15, 27, 0, 28, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 17, 18, 19, 0,
- 21, 0, 0, 0, 0, 22, 23, 24, 25, 0,
- 0, 0, 26, 0, 0, 30, 31, 32, 33, 0,
- 0, 12, 13, 0, 0, 66, 14, 15, 27, 111,
- 28, 0, 0, 0, 0, 0, 0, 0, 16, 0,
- 17, 18, 19, 0, 21, 0, 0, 0, 86, 22,
- 23, 24, 25, 0, 0, 0, 26, 0, 0, 30,
- 31, 32, 33, 0, 0, 0, 0, 0, 66, 0,
- 0, 27, 161, 28, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 12, 13, 0, 0, 0, 14,
- 15, 86, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 16, 0, 17, 18, 19, 0, 21, 0, 0,
- 0, 0, 22, 23, 24, 25, 0, 0, 0, 26,
- 0, 0, 30, 31, 32, 33, 66, 0, 0, 27,
- 164, 28, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 11, 0, 0, 86,
- 12, 13, 0, 0, 0, 14, 15, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 16, 0, 17,
- 18, 19, 66, 21, 0, 27, 166, 28, 22, 23,
- 24, 25, 0, 0, 0, 26, 0, 29, 30, 31,
- 32, 33, 0, 0, 0, 86, 0, 0, 0, 0,
- 11, 0, 0, 0, 12, 13, 0, 0, 0, 14,
- 15, 0, 0, 0, 66, 0, 0, 27, 167, 28,
- 0, 16, 0, 17, 18, 19, 0, 21, 0, 0,
- 0, 0, 22, 23, 24, 25, 0, 86, 0, 26,
- 0, 29, 30, 31, 32, 33, 0, 0, 12, 13,
- 0, 0, 0, 14, 15, 0, 0, 66, 0, 0,
- 27, 172, 28, 0, 0, 16, 0, 17, 18, 19,
- 0, 21, 0, 0, 0, 0, 22, 23, 24, 25,
- 86, 0, 0, 26, 0, 0, 30, 31, 32, 33,
- 0, 12, 13, 0, 0, 0, 14, 15, 0, 0,
- 66, 0, 0, 27, 173, 28, 0, 0, 16, 0,
- 17, 18, 19, 0, 21, 0, 0, 0, 0, 22,
- 23, 24, 25, 86, 0, 0, 26, 0, 0, 30,
- 31, 32, 33, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 66, 0, 0, 27, 0, 28, 0, 12,
- 13, 0, 0, 0, 14, 15, 0, 0, 0, 0,
- 195, 0, 0, 0, 0, 86, 16, 0, 17, 18,
- 19, 0, 21, 0, 0, 0, 0, 22, 23, 24,
- 25, 0, 0, 0, 26, 0, 0, 30, 31, 32,
- 33, 0, 0, 0, 0, 12, 13, 0, 0, 66,
- 14, 15, 27, 0, 28, 0, 0, 0, 0, 0,
- 0, 0, 16, 0, 17, 18, 19, 198, 21, 0,
- 0, 0, 86, 22, 23, 24, 25, 0, 0, 0,
- 26, 0, 0, 30, 31, 32, 33, 12, 13, 0,
- 0, 0, 14, 15, 66, 0, 0, 27, 0, 28,
- 0, 0, 0, 0, 16, 0, 17, 18, 19, 0,
- 21, 0, 0, 0, 0, 22, 23, 24, 25, 0,
- 0, 0, 26, 0, 0, 30, 31, 32, 33, 0,
- 12, 13, 0, 0, 0, 14, 15, 0, 0, 66,
- 246, 0, 27, 0, 28, 0, 0, 16, 0, 17,
- 18, 19, 0, 21, 0, 0, 0, 0, 22, 23,
- 24, 25, 86, 0, 0, 26, 0, 0, 30, 31,
- 32, 33, 0, 12, 13, 0, 0, 0, 14, 15,
- 0, 0, 66, 250, 0, 27, 0, 28, 0, 0,
- 16, 0, 17, 18, 19, 0, 21, 0, 0, 0,
- 0, 22, 23, 24, 25, 86, 0, 0, 26, 0,
- 0, 30, 31, 32, 33, 12, 13, 0, 0, 0,
- 14, 15, 0, 0, 66, 281, 0, 27, 0, 28,
- 0, 0, 16, 0, 17, 18, 19, 0, 21, 0,
- 0, 0, 0, 22, 23, 24, 25, 86, 0, 0,
- 26, 0, 0, 30, 31, 32, 33, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 12, 13, 0, 0, 0, 14, 15, 0,
- 0, 66, 287, 0, 27, 0, 28, 0, 0, 16,
- 0, 17, 18, 19, 0, 21, 0, 0, 0, 0,
- 22, 23, 24, 25, 86, 0, 0, 26, 0, 0,
- 30, 31, 32, 33, 0, 126, 127, 12, 13, 0,
- 0, 0, 14, 15, 0, 0, 66, 288, 0, 27,
- 0, 28, 0, 0, 16, 0, 17, 18, 19, 0,
- 21, 0, 0, 0, 0, 22, 23, 24, 25, 86,
- 0, 0, 26, 0, 0, 30, 31, 32, 33, 0,
- 0, 0, 12, 13, 0, 0, 0, 14, 15, 0,
- 0, 66, 289, 0, 27, 0, 28, 0, 0, 16,
- 0, 17, 18, 19, 0, 21, 0, 0, 0, 0,
- 22, 23, 24, 25, 86, 0, 0, 26, 0, 0,
- 30, 31, 32, 33, 0, 12, 13, 0, 0, 0,
- 14, 15, 0, 0, 66, 290, 0, 27, 0, 28,
- 0, 0, 16, 0, 17, 18, 19, 0, 21, 0,
- 0, 0, 0, 22, 23, 24, 25, 86, 0, 0,
- 26, 0, 0, 30, 31, 32, 33, 12, 13, 0,
- 0, 0, 14, 15, 0, 0, 66, 291, 0, 27,
- 0, 28, 0, 0, 16, 0, 17, 18, 19, 0,
- 21, 0, 0, 0, 0, 22, 23, 24, 25, 86,
- 0, 0, 26, 0, 0, 30, 31, 32, 33, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 89, 89, 89, 0, 42, 89, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 89, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 89, 42, 0, 89,
+ 89, 89, 0, 42, 0, 0, 89, 89, 0, 0,
+ 0, 89, 0, 0, 0, 104, 0, 0, 109, 104,
+ 104, 112, 113, 0, 116, 118, 119, 0, 104, 104,
+ 123, 124, 42, 0, 0, 0, 0, 0, 0, 16,
+ 16, 16, 16, 16, 16, 0, 0, 16, 134, 0,
+ 0, 42, 138, 140, 141, 142, 143, 16, 106, 107,
+ 0, 0, 0, 0, 0, 0, 42, 0, 16, 154,
+ 0, 16, 16, 16, 0, 0, 0, 0, 0, 0,
+ 0, 164, 0, 16, 0, 0, 0, 104, 0, 133,
+ 0, 135, 136, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 42, 42, 0, 65, 0, 0, 28, 0,
+ 29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 154, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 208, 209, 210, 211, 213, 0, 0, 0,
+ 0, 215, 216, 0, 104, 104, 0, 0, 0, 223,
+ 0, 0, 0, 224, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 235, 203, 204, 236, 0, 0,
+ 237, 238, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56, 0, 0, 0, 0, 217, 0, 42, 42, 263,
+ 0, 67, 67, 0, 70, 71, 225, 67, 227, 0,
+ 228, 0, 0, 0, 0, 67, 0, 0, 275, 0,
+ 276, 0, 277, 0, 278, 0, 279, 0, 0, 0,
+ 0, 281, 0, 252, 0, 0, 282, 283, 65, 0,
+ 0, 28, 0, 29, 104, 0, 0, 0, 269, 270,
+ 271, 272, 273, 0, 0, 0, 0, 191, 0, 0,
+ 0, 0, 0, 0, 42, 67, 67, 67, 67, 67,
+ 67, 0, 0, 0, 0, 0, 0, 67, 0, 0,
+ 0, 42, 67, 0, 0, 67, 67, 0, 0, 67,
+ 0, 67, 67, 0, 0, 0, 67, 67, 0, 297,
+ 0, 0, 0, 299, 300, 301, 0, 67, 0, 306,
+ 0, 67, 0, 67, 67, 67, 67, 113, 0, 0,
+ 113, 189, 113, 0, 201, 0, 0, 67, 0, 0,
+ 0, 0, 0, 0, 319, 320, 113, 67, 12, 13,
+ 324, 177, 178, 14, 15, 16, 0, 0, 0, 0,
+ 0, 182, 183, 184, 185, 186, 17, 0, 18, 19,
+ 20, 0, 22, 188, 0, 67, 0, 23, 24, 25,
+ 26, 0, 0, 0, 27, 0, 0, 31, 32, 33,
+ 34, 67, 67, 67, 67, 0, 67, 0, 67, 67,
+ 0, 0, 0, 0, 0, 0, 67, 67, 0, 0,
+ 113, 0, 113, 0, 0, 0, 0, 0, 67, 67,
+ 67, 67, 0, 112, 0, 0, 112, 0, 112, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 112, 0, 0, 0, 67, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 67,
+ 67, 67, 67, 0, 67, 67, 67, 0, 176, 125,
+ 126, 12, 13, 0, 177, 178, 14, 15, 16, 179,
+ 0, 180, 181, 0, 182, 183, 184, 185, 186, 17,
+ 187, 18, 19, 20, 0, 22, 188, 0, 0, 0,
+ 23, 24, 25, 26, 0, 0, 112, 27, 112, 0,
+ 31, 32, 33, 34, 106, 0, 0, 106, 0, 106,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 106, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 113, 0, 0,
+ 113, 113, 0, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 0, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 0, 113, 113, 0, 0, 0, 113,
+ 113, 113, 113, 0, 0, 0, 113, 0, 0, 113,
+ 113, 113, 113, 0, 0, 0, 0, 106, 107, 106,
+ 0, 107, 0, 107, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 107, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 112, 0, 0, 112, 112, 0, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 0, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 0,
+ 112, 112, 0, 0, 0, 112, 112, 112, 112, 0,
+ 0, 107, 112, 107, 0, 112, 112, 112, 112, 108,
+ 0, 0, 108, 0, 108, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 108, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 106, 0, 0, 106, 106, 0,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 0,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 0, 106, 106, 0, 0, 0, 106, 106, 106, 106,
+ 0, 0, 108, 106, 108, 0, 106, 106, 106, 106,
+ 0, 105, 0, 0, 105, 0, 105, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 105, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 107, 0,
+ 0, 107, 107, 0, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 0, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 0, 107, 107, 0, 0, 0,
+ 107, 107, 107, 107, 0, 0, 0, 107, 0, 0,
+ 107, 107, 107, 107, 105, 0, 105, 0, 0, 0,
+ 0, 0, 111, 0, 0, 111, 0, 111, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 111, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 108,
+ 0, 0, 108, 108, 0, 108, 108, 108, 108, 108,
+ 108, 108, 108, 108, 0, 108, 108, 108, 108, 108,
+ 108, 108, 108, 108, 108, 0, 108, 108, 0, 0,
+ 0, 108, 108, 108, 108, 0, 0, 0, 108, 0,
+ 0, 108, 108, 108, 108, 111, 140, 111, 0, 140,
+ 0, 140, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 140, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 105, 0, 0, 105, 105, 0, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 0, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 0, 105, 105,
+ 0, 0, 0, 105, 105, 105, 105, 0, 0, 140,
+ 105, 140, 0, 105, 105, 105, 105, 65, 0, 0,
+ 28, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 191, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 111, 0, 0, 111, 111, 0, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 0, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 0, 111,
+ 111, 0, 0, 0, 111, 111, 111, 111, 0, 0,
+ 189, 111, 190, 0, 111, 111, 111, 111, 0, 65,
+ 0, 0, 28, 0, 29, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 191, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 140, 0, 0, 140,
+ 140, 0, 140, 140, 140, 140, 140, 140, 140, 140,
+ 140, 0, 140, 140, 140, 140, 140, 140, 140, 140,
+ 140, 140, 0, 140, 140, 0, 0, 0, 140, 140,
+ 140, 140, 0, 0, 0, 140, 0, 0, 140, 140,
+ 140, 140, 189, 0, 205, 0, 0, 0, 0, 0,
+ 65, 0, 0, 28, 0, 29, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 176, 0, 0,
+ 12, 13, 0, 177, 178, 14, 15, 16, 179, 0,
+ 180, 181, 0, 182, 183, 184, 185, 186, 17, 187,
+ 18, 19, 20, 0, 22, 188, 0, 0, 0, 23,
+ 24, 25, 26, 0, 0, 0, 27, 0, 0, 31,
+ 32, 33, 34, 189, 65, 206, 0, 28, 0, 29,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 191, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 176,
+ 0, 0, 12, 13, 0, 177, 178, 14, 15, 16,
+ 179, 0, 180, 181, 0, 182, 183, 184, 185, 186,
+ 17, 187, 18, 19, 20, 0, 22, 188, 0, 0,
+ 0, 23, 24, 25, 26, 0, 0, 189, 27, 234,
+ 0, 31, 32, 33, 34, 65, 0, 0, 28, 0,
+ 29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 191, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 176, 0, 0, 12, 13, 0, 177, 178, 14, 15,
+ 16, 179, 0, 180, 181, 0, 182, 183, 184, 185,
+ 186, 17, 187, 18, 19, 20, 0, 22, 188, 0,
+ 0, 0, 23, 24, 25, 26, 0, 0, 189, 27,
+ 290, 0, 31, 32, 33, 34, 0, 65, 0, 0,
+ 28, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 191, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 176, 0, 0, 12, 13, 0,
+ 177, 178, 14, 15, 16, 179, 0, 180, 181, 0,
+ 182, 183, 184, 185, 186, 17, 187, 18, 19, 20,
+ 0, 22, 188, 0, 0, 0, 23, 24, 25, 26,
+ 0, 0, 0, 27, 0, 0, 31, 32, 33, 34,
+ 189, 0, 314, 0, 0, 0, 0, 0, 110, 0,
+ 0, 110, 0, 110, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 110, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 176, 0, 0, 12, 13,
+ 0, 177, 178, 14, 15, 16, 179, 0, 180, 181,
+ 0, 182, 183, 184, 185, 186, 17, 187, 18, 19,
+ 20, 0, 22, 188, 0, 0, 0, 23, 24, 25,
+ 26, 0, 0, 0, 27, 0, 0, 31, 32, 33,
+ 34, 110, 133, 110, 0, 133, 0, 133, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 133, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 176, 0, 0,
+ 12, 13, 0, 177, 178, 14, 15, 16, 179, 0,
+ 180, 181, 0, 182, 183, 184, 185, 186, 17, 187,
+ 18, 19, 20, 65, 22, 188, 28, 156, 29, 23,
+ 24, 25, 26, 0, 0, 133, 27, 133, 0, 31,
+ 32, 33, 34, 88, 0, 89, 85, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 65, 0, 0,
+ 28, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 88, 110, 89,
+ 85, 110, 110, 0, 110, 110, 110, 110, 110, 110,
+ 0, 110, 110, 0, 110, 110, 110, 110, 110, 110,
+ 110, 110, 110, 110, 36, 110, 110, 28, 0, 29,
+ 110, 110, 110, 110, 0, 0, 0, 110, 0, 0,
+ 110, 110, 110, 110, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 65, 242, 0, 28, 243, 29, 0, 0, 0,
+ 0, 0, 133, 0, 0, 133, 133, 0, 133, 133,
+ 133, 133, 133, 133, 85, 133, 133, 0, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 0, 133,
+ 133, 0, 0, 0, 133, 133, 133, 133, 0, 0,
+ 0, 133, 0, 0, 133, 133, 133, 133, 65, 244,
+ 0, 28, 245, 29, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 85, 0, 0, 0, 0, 12, 13, 0, 0,
+ 0, 14, 15, 16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 18, 19, 20, 0,
+ 22, 0, 0, 0, 0, 23, 24, 25, 26, 86,
+ 87, 0, 27, 0, 0, 31, 32, 33, 34, 0,
+ 12, 13, 0, 0, 0, 14, 15, 16, 0, 0,
+ 0, 0, 65, 246, 0, 28, 247, 29, 17, 0,
+ 18, 19, 20, 0, 22, 0, 0, 0, 0, 23,
+ 24, 25, 26, 86, 87, 85, 27, 0, 0, 31,
+ 32, 33, 34, 11, 0, 125, 126, 12, 13, 0,
+ 0, 0, 14, 15, 16, 0, 0, 65, 248, 0,
+ 28, 249, 29, 0, 0, 17, 0, 18, 19, 20,
+ 0, 22, 0, 0, 0, 0, 23, 24, 25, 26,
+ 85, 0, 0, 27, 0, 30, 31, 32, 33, 34,
0, 0, 0, 0, 12, 13, 0, 0, 0, 14,
- 15, 0, 0, 66, 293, 0, 27, 0, 28, 0,
- 0, 16, 0, 17, 18, 19, 0, 21, 0, 0,
- 0, 0, 22, 23, 24, 25, 86, 0, 0, 26,
- 0, 0, 30, 31, 32, 33, 0, 0, 0, 12,
- 13, 0, 0, 0, 14, 15, 0, 0, 0, 66,
- 0, 0, 27, 0, 28, 0, 16, 0, 17, 18,
- 19, 0, 21, 0, 0, 0, 0, 22, 23, 24,
- 25, 0, 0, 0, 26, 0, 0, 30, 31, 32,
- 33, 0, 0, 0, 12, 13, 0, 0, 0, 14,
- 15, 0, 0, 0, 0, 66, 0, 0, 27, 0,
- 28, 16, 0, 17, 18, 19, 0, 21, 0, 0,
- 0, 0, 22, 23, 24, 25, 0, 0, 0, 26,
- 0, 0, 30, 31, 32, 33, 0, 12, 13, 0,
- 0, 0, 14, 15, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 17, 18, 19, 66,
- 21, 0, 27, 0, 28, 22, 23, 24, 25, 0,
- 0, 0, 26, 0, 0, 30, 31, 32, 33, 12,
- 13, 0, 0, 0, 14, 15, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 16, 0, 17, 18,
- 19, 0, 21, 0, 0, 0, 0, 22, 23, 24,
- 25, 0, 0, 0, 26, 0, 0, 30, 31, 32,
- 33, 66, 0, 0, 27, 0, 28, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 12, 13, 0, 0,
- 0, 14, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 16, 0, 17, 18, 19, 0, 21,
- 0, 0, 0, 0, 22, 23, 24, 25, 0, 0,
- 0, 26, 0, 0, 30, 31, 32, 33, 116, 0,
- 0, 66, 12, 13, 27, 0, 28, 14, 15, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 17, 18, 19, 86, 21, 0, 0, 0, 0,
- 22, 23, 24, 25, 0, 0, 0, 26, 0, 0,
- 30, 31, 32, 33, 118, 0, 0, 66, 12, 13,
- 27, 0, 28, 14, 15, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 16, 0, 17, 18, 19,
- 0, 21, 0, 0, 0, 0, 22, 23, 24, 25,
- 0, 0, 0, 26, 0, 0, 30, 31, 32, 33,
- 51, 0, 0, 27, 0, 28, 0, 0, 140, 0,
- 0, 0, 12, 13, 0, 0, 0, 14, 15, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 17, 18, 19, 0, 21, 0, 0, 0, 0,
- 22, 23, 24, 25, 0, 0, 0, 26, 0, 0,
- 30, 31, 32, 33, 66, 0, 0, 27, 0, 28,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 209, 0, 0, 0, 12, 13, 0, 0, 0, 14,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 16, 0, 17, 18, 19, 0, 21, 0, 0,
- 0, 0, 22, 23, 24, 25, 0, 0, 0, 26,
- 0, 0, 30, 31, 32, 33, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 16, 0, 0, 65, 253, 0, 28, 254, 29,
+ 0, 0, 17, 0, 18, 19, 20, 0, 22, 0,
+ 0, 0, 0, 23, 24, 25, 26, 85, 0, 0,
+ 27, 0, 0, 31, 32, 33, 34, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 12, 13, 0, 0, 0, 14, 15, 16, 36,
+ 0, 0, 28, 0, 29, 0, 0, 0, 0, 17,
+ 0, 18, 19, 20, 0, 22, 0, 0, 0, 0,
+ 23, 24, 25, 26, 0, 0, 0, 27, 0, 0,
+ 31, 32, 33, 34, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 153, 0, 0, 28,
+ 0, 29, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 12, 13, 0, 0, 0,
+ 14, 15, 16, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 18, 19, 20, 0, 22,
+ 0, 0, 0, 0, 23, 24, 25, 26, 0, 0,
+ 0, 27, 0, 0, 31, 32, 33, 34, 0, 0,
+ 12, 13, 0, 0, 0, 14, 15, 16, 0, 0,
+ 65, 0, 0, 28, 156, 29, 0, 0, 17, 0,
+ 18, 19, 20, 0, 22, 0, 0, 0, 0, 23,
+ 24, 25, 26, 85, 0, 0, 27, 0, 0, 31,
+ 32, 33, 34, 0, 0, 0, 0, 12, 13, 0,
+ 0, 0, 14, 15, 16, 0, 0, 65, 160, 0,
+ 28, 0, 29, 0, 0, 17, 0, 18, 19, 20,
+ 0, 22, 0, 0, 0, 0, 23, 24, 25, 26,
+ 85, 0, 0, 27, 0, 0, 31, 32, 33, 34,
+ 0, 0, 0, 0, 0, 0, 0, 0, 11, 0,
+ 0, 0, 12, 13, 0, 0, 0, 14, 15, 16,
+ 0, 0, 65, 0, 0, 28, 163, 29, 0, 0,
+ 17, 0, 18, 19, 20, 0, 22, 0, 0, 0,
+ 0, 23, 24, 25, 26, 85, 0, 0, 27, 0,
+ 30, 31, 32, 33, 34, 11, 0, 0, 0, 12,
+ 13, 0, 0, 0, 14, 15, 16, 0, 0, 65,
+ 0, 0, 28, 166, 29, 0, 0, 17, 0, 18,
+ 19, 20, 0, 22, 0, 0, 0, 0, 23, 24,
+ 25, 26, 85, 0, 0, 27, 0, 30, 31, 32,
+ 33, 34, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 65, 0, 0, 28, 168, 29, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 85, 0, 0, 0, 0,
+ 0, 0, 0, 12, 13, 0, 0, 0, 14, 15,
+ 16, 0, 0, 0, 0, 65, 0, 0, 28, 169,
+ 29, 17, 0, 18, 19, 20, 0, 22, 0, 0,
+ 0, 0, 23, 24, 25, 26, 0, 0, 85, 27,
+ 0, 0, 31, 32, 33, 34, 0, 0, 0, 0,
+ 12, 13, 0, 0, 0, 14, 15, 16, 0, 0,
+ 65, 0, 0, 28, 174, 29, 0, 0, 17, 0,
+ 18, 19, 20, 0, 22, 0, 0, 0, 0, 23,
+ 24, 25, 26, 85, 0, 0, 27, 0, 0, 31,
+ 32, 33, 34, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 12, 13, 0, 0, 0,
+ 14, 15, 16, 0, 0, 65, 0, 0, 28, 175,
+ 29, 0, 0, 17, 0, 18, 19, 20, 0, 22,
+ 0, 0, 0, 0, 23, 24, 25, 26, 85, 0,
+ 0, 27, 0, 0, 31, 32, 33, 34, 0, 0,
+ 0, 0, 12, 13, 0, 0, 0, 14, 15, 16,
+ 0, 0, 65, 0, 0, 28, 0, 29, 0, 0,
+ 17, 0, 18, 19, 20, 0, 22, 0, 0, 0,
+ 197, 23, 24, 25, 26, 85, 0, 0, 27, 0,
+ 0, 31, 32, 33, 34, 12, 13, 0, 0, 0,
+ 14, 15, 16, 0, 0, 65, 0, 0, 28, 0,
+ 29, 0, 0, 17, 0, 18, 19, 20, 0, 22,
+ 0, 0, 0, 200, 23, 24, 25, 26, 85, 0,
+ 0, 27, 0, 0, 31, 32, 33, 34, 12, 13,
+ 0, 0, 0, 14, 15, 16, 0, 0, 65, 251,
+ 0, 28, 0, 29, 0, 0, 17, 0, 18, 19,
+ 20, 0, 22, 0, 0, 0, 0, 23, 24, 25,
+ 26, 85, 0, 0, 27, 0, 0, 31, 32, 33,
+ 34, 0, 0, 12, 13, 0, 0, 0, 14, 15,
+ 16, 0, 0, 65, 255, 0, 28, 0, 29, 0,
+ 0, 17, 0, 18, 19, 20, 0, 22, 0, 0,
+ 0, 0, 23, 24, 25, 26, 85, 0, 0, 27,
+ 0, 0, 31, 32, 33, 34, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 12, 13,
+ 0, 0, 0, 14, 15, 16, 0, 0, 65, 286,
+ 0, 28, 0, 29, 0, 0, 17, 0, 18, 19,
+ 20, 0, 22, 0, 0, 0, 0, 23, 24, 25,
+ 26, 85, 0, 0, 27, 0, 0, 31, 32, 33,
+ 34, 0, 0, 0, 0, 12, 13, 0, 0, 0,
+ 14, 15, 16, 0, 0, 65, 292, 0, 28, 0,
+ 29, 0, 0, 17, 0, 18, 19, 20, 0, 22,
+ 0, 0, 0, 0, 23, 24, 25, 26, 85, 0,
+ 0, 27, 0, 0, 31, 32, 33, 34, 12, 13,
+ 0, 0, 0, 14, 15, 16, 0, 0, 65, 293,
+ 0, 28, 0, 29, 0, 0, 17, 0, 18, 19,
+ 20, 0, 22, 0, 0, 0, 0, 23, 24, 25,
+ 26, 85, 0, 0, 27, 0, 0, 31, 32, 33,
+ 34, 12, 13, 0, 0, 0, 14, 15, 16, 0,
+ 0, 65, 294, 0, 28, 0, 29, 0, 0, 17,
+ 0, 18, 19, 20, 0, 22, 0, 0, 0, 0,
+ 23, 24, 25, 26, 85, 0, 0, 27, 0, 0,
+ 31, 32, 33, 34, 0, 0, 12, 13, 0, 0,
+ 0, 14, 15, 16, 0, 0, 65, 295, 0, 28,
+ 0, 29, 0, 0, 17, 0, 18, 19, 20, 0,
+ 22, 0, 0, 0, 0, 23, 24, 25, 26, 85,
+ 0, 0, 27, 0, 0, 31, 32, 33, 34, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 12, 13, 0, 0, 0, 14, 15, 16, 0,
+ 0, 65, 296, 0, 28, 0, 29, 0, 0, 17,
+ 0, 18, 19, 20, 0, 22, 0, 0, 0, 0,
+ 23, 24, 25, 26, 85, 0, 0, 27, 0, 0,
+ 31, 32, 33, 34, 0, 0, 0, 0, 12, 13,
+ 0, 0, 0, 14, 15, 16, 0, 0, 65, 298,
+ 0, 28, 0, 29, 0, 0, 17, 0, 18, 19,
+ 20, 0, 22, 0, 0, 0, 0, 23, 24, 25,
+ 26, 85, 0, 0, 27, 0, 0, 31, 32, 33,
+ 34, 12, 13, 0, 0, 0, 14, 15, 16, 0,
+ 0, 65, 108, 0, 28, 0, 29, 0, 0, 17,
+ 0, 18, 19, 20, 0, 22, 0, 0, 0, 0,
+ 23, 24, 25, 26, 0, 0, 0, 27, 0, 0,
+ 31, 32, 33, 34, 12, 13, 0, 0, 0, 14,
+ 15, 16, 0, 0, 0, 0, 0, 0, 65, 0,
+ 0, 28, 17, 29, 18, 19, 20, 0, 22, 0,
+ 0, 0, 0, 23, 24, 25, 26, 0, 0, 0,
+ 27, 0, 0, 31, 32, 33, 34, 0, 0, 12,
+ 13, 0, 0, 0, 14, 15, 16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 18,
+ 19, 20, 65, 22, 0, 28, 0, 29, 23, 24,
+ 25, 26, 0, 0, 0, 27, 0, 0, 31, 32,
+ 33, 34, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 12, 13, 0, 0, 0, 14,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 16, 0, 17, 18, 19, 0, 21, 0, 0,
- 0, 0, 22, 23, 24, 25, 0, 0, 0, 26,
- 0, 0, 30, 31, 32, 33, 269, 0, 0, 0,
- 12, 13, 0, 0, 0, 14, 15, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 16, 0, 17,
- 18, 19, 0, 21, 0, 0, 0, 0, 22, 23,
- 24, 25, 0, 0, 0, 26, 0, 0, 30, 31,
- 32, 33, 0, 12, 13, 0, 0, 0, 14, 15,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 16, 0, 17, 18, 19, 0, 21, 0, 0, 0,
- 0, 22, 23, 24, 25, 57, 0, 0, 26, 0,
- 0, 30, 31, 32, 33, 0, 68, 68, 0, 71,
- 72, 0, 68, 0, 0, 0, 0, 12, 13, 0,
- 68, 0, 14, 15, 0, 0, 0, 0, 0, 0,
- 0, 0, 68, 0, 16, 0, 17, 18, 19, 0,
- 21, 0, 0, 0, 0, 22, 23, 24, 25, 0,
- 0, 0, 26, 0, 0, 30, 31, 32, 33, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 68, 68, 68, 68, 68, 68, 0, 0,
- 0, 0, 0, 0, 0, 68, 0, 0, 68, 0,
- 0, 0, 68, 68, 0, 0, 68, 0, 68, 68,
- 0, 0, 0, 68, 68, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 0, 0, 0, 68, 0,
- 68, 68, 68, 68, 0, 0, 0, 0, 0, 0,
- 0, 199, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 68, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 68, 68, 0, 68, 68, 68, 68, 0, 68,
- 0, 68, 68, 0, 0, 67, 69, 0, 0, 68,
- 68, 73, 0, 0, 0, 0, 0, 0, 0, 91,
- 0, 68, 68, 0, 0, 0, 0, 0, 0, 0,
- 0, 91, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 68, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,
- 68, 68, 68, 68, 0, 68, 68, 68, 0, 0,
- 0, 146, 147, 148, 149, 150, 151, 0, 0, 0,
- 0, 0, 0, 0, 91, 0, 0, 91, 0, 0,
- 0, 91, 91, 0, 0, 91, 0, 91, 91, 0,
- 0, 0, 91, 91, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 91, 0, 0, 0, 91, 0, 91,
- 91, 91, 91, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 91, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 91, 91, 0, 91, 91, 91, 91, 0, 91, 0,
- 91, 91, 0, 0, 0, 0, 0, 0, 91, 91,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 91, 91, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 91, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 91, 91,
- 91, 91, 91, 0, 91, 91, 91,
+ 15, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 0, 18, 19, 20, 65, 22, 0,
+ 28, 0, 29, 23, 24, 25, 26, 0, 0, 0,
+ 27, 0, 0, 31, 32, 33, 34, 0, 0, 0,
+ 0, 12, 13, 0, 0, 0, 14, 15, 16, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 18, 19, 20, 65, 22, 0, 28, 0, 29,
+ 23, 24, 25, 26, 0, 0, 0, 27, 0, 0,
+ 31, 32, 33, 34, 12, 13, 0, 0, 0, 14,
+ 15, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 0, 18, 19, 20, 65, 22, 0,
+ 28, 0, 29, 23, 24, 25, 26, 0, 0, 0,
+ 27, 0, 0, 31, 32, 33, 34, 115, 0, 0,
+ 85, 12, 13, 0, 0, 0, 14, 15, 16, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 18, 19, 20, 65, 22, 0, 28, 0, 29,
+ 23, 24, 25, 26, 0, 0, 0, 27, 0, 0,
+ 31, 32, 33, 34, 0, 0, 0, 0, 0, 0,
+ 0, 117, 0, 0, 0, 12, 13, 0, 0, 0,
+ 14, 15, 16, 0, 0, 0, 0, 65, 0, 0,
+ 28, 0, 29, 17, 0, 18, 19, 20, 0, 22,
+ 0, 0, 0, 0, 23, 24, 25, 26, 0, 0,
+ 0, 27, 0, 0, 31, 32, 33, 34, 0, 0,
+ 0, 0, 0, 0, 0, 0, 139, 0, 0, 0,
+ 12, 13, 0, 0, 0, 14, 15, 16, 102, 0,
+ 0, 28, 0, 29, 0, 0, 0, 0, 17, 0,
+ 18, 19, 20, 0, 22, 0, 0, 0, 0, 23,
+ 24, 25, 26, 0, 0, 0, 27, 0, 0, 31,
+ 32, 33, 34, 212, 0, 0, 0, 12, 13, 0,
+ 0, 0, 14, 15, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 17, 0, 18, 19, 20,
+ 0, 22, 0, 0, 0, 0, 23, 24, 25, 26,
+ 0, 0, 0, 27, 0, 0, 31, 32, 33, 34,
+ 12, 13, 0, 0, 0, 14, 15, 16, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0,
+ 18, 19, 20, 0, 22, 0, 0, 0, 0, 23,
+ 24, 25, 26, 0, 0, 0, 27, 0, 0, 31,
+ 32, 33, 34, 274, 0, 0, 0, 12, 13, 0,
+ 0, 0, 14, 15, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 17, 0, 18, 19, 20,
+ 0, 22, 0, 0, 0, 0, 23, 24, 25, 26,
+ 0, 0, 0, 27, 0, 0, 31, 32, 33, 34,
+ 12, 13, 0, 0, 0, 14, 15, 16, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0,
+ 18, 19, 20, 0, 22, 0, 0, 0, 0, 23,
+ 24, 25, 26, 0, 0, 0, 27, 0, 0, 31,
+ 32, 33, 34, 0, 0, 0, 0, 66, 68, 0,
+ 0, 12, 13, 72, 0, 0, 14, 15, 16, 0,
+ 0, 90, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 18, 19, 20, 0, 22, 0, 0, 0, 0,
+ 23, 24, 25, 26, 0, 0, 0, 27, 0, 0,
+ 31, 32, 33, 34, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 145, 146, 147, 148, 149, 150, 0, 0, 0,
+ 0, 0, 0, 90, 0, 0, 0, 0, 90, 0,
+ 0, 90, 90, 0, 0, 90, 0, 90, 90, 0,
+ 0, 0, 90, 90, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 90, 0, 0, 0, 90, 0, 90,
+ 90, 90, 90, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 90, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 90, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 90, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 90, 90, 90,
+ 90, 0, 90, 0, 90, 90, 0, 0, 0, 0,
+ 0, 0, 90, 90, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 90, 90, 90, 90, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 90, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 90, 90, 90, 90, 90, 0,
+ 90, 90, 90,
};
short yycheck[] = { 41,
- 0, 41, 63, 41, 37, 41, 41, 59, 59, 42,
- 43, 63, 45, 63, 47, 35, 63, 219, 41, 63,
- 50, 63, 38, 63, 59, 63, 123, 63, 62, 37,
- 44, 123, 62, 63, 42, 103, 104, 37, 35, 47,
- 40, 41, 42, 43, 44, 45, 51, 47, 35, 63,
- 41, 94, 41, 44, 288, 0, 301, 302, 58, 59,
- 60, 94, 62, 63, 297, 60, 134, 301, 302, 112,
- 59, 292, 41, 40, 307, 44, 59, 261, 262, 112,
- 40, 40, 303, 304, 123, 40, 94, 40, 108, 40,
- 124, 121, 37, 93, 94, 297, 41, 42, 43, 44,
- 45, 286, 47, 108, 112, 307, 91, 41, 222, 40,
- 0, 108, 112, 58, 59, 60, 40, 62, 63, 40,
- 261, 108, 44, 123, 124, 59, 40, 123, 62, 41,
- 60, 112, 41, 41, 292, 280, 41, 44, 44, 41,
- 292, 41, 41, 93, 41, 175, 176, 37, 93, 94,
- 40, 41, 42, 43, 40, 45, 224, 47, 40, 59,
- 40, 292, 59, 290, 261, 262, 41, 112, 58, 59,
- 60, 91, 62, 63, 59, 41, 272, 7, 123, 124,
- 294, 295, 296, 40, 200, 271, 41, 41, 0, 93,
- 124, 41, 93, 41, 59, 59, -1, 216, -1, 29,
- 314, 315, -1, 93, 94, 319, -1, -1, -1, 260,
- 261, 262, 41, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 112, -1, 292, 260, 261, 262, 289, 290,
- 59, 265, 262, 123, 124, -1, -1, 289, 290, 289,
- 290, 274, 289, 290, -1, 289, 290, 289, 290, 289,
- 290, 289, 290, 289, 290, 85, -1, 257, 258, 259,
- 260, 261, 262, 263, 264, 265, 289, 290, 268, 269,
- 100, 260, 261, 262, 274, 289, 290, 260, 261, 262,
- 280, 41, 282, 283, 284, 285, 286, 41, 288, 289,
- 290, 291, 292, 293, 294, 295, 296, 292, 298, 59,
- 300, 301, 302, 303, 304, 59, 136, 137, 303, 304,
- -1, -1, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, -1, -1, 268, 269, -1, 260, 261, 262, 274,
- -1, 265, -1, -1, -1, 280, 41, 282, 283, 284,
- 285, 286, -1, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, -1, 298, 59, 300, 301, 302, 303, 304,
- 260, 261, 262, 260, 261, 262, -1, 257, 258, 259,
- 260, 261, 262, 263, 264, 265, -1, -1, 268, 269,
- 0, -1, -1, -1, 274, -1, -1, 217, 218, -1,
- 280, -1, 282, 283, 284, 285, 286, 41, 288, 289,
- 290, 291, 292, 293, 294, 295, 296, -1, 298, -1,
- 300, 301, 302, 303, 304, 59, -1, 37, -1, -1,
- 40, 41, 42, 43, 44, 45, -1, 47, -1, -1,
- -1, 260, 261, 262, -1, 0, -1, -1, 58, 59,
- -1, -1, 62, 63, -1, -1, -1, -1, -1, -1,
- -1, -1, 282, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 299,
- -1, -1, 37, 93, 94, 40, 41, 42, 43, 44,
- 45, -1, 47, -1, -1, -1, -1, -1, -1, -1,
- 0, -1, 112, 58, 59, 60, -1, 62, 63, -1,
- 260, 261, 262, 123, 124, -1, 260, 261, 262, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 37, 93, 94,
- 40, 41, 42, 43, 44, 45, -1, 47, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 58, 59,
- 60, -1, 62, 63, -1, 260, 261, 262, 123, 124,
- -1, -1, -1, 0, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 93, 94, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 37, -1, 112, 40, 41, 42, 43, 44, 45, -1,
- 47, -1, -1, 123, 124, -1, 260, 261, 262, -1,
- -1, 58, 59, 60, -1, 62, 63, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 257, 258, 259,
- 260, 261, 262, 263, 264, 265, -1, -1, 268, 269,
- -1, -1, -1, -1, 274, -1, 93, -1, -1, -1,
- 280, -1, 282, 283, 284, 285, 286, -1, 288, 289,
- 290, 291, 292, 293, 294, 295, 296, -1, 298, -1,
- 300, 301, 302, 303, 304, -1, 123, 124, -1, -1,
- -1, -1, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, -1, -1, 268, 269, -1, -1, -1, -1, 274,
- -1, -1, -1, -1, -1, 280, -1, 282, 283, 284,
- 285, 286, -1, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, -1, 298, -1, 300, 301, 302, 303, 304,
- -1, -1, -1, -1, -1, -1, -1, 257, 258, 259,
+ 0, 41, 60, 41, 37, 41, 59, 59, 39, 42,
+ 43, 63, 45, 63, 47, 59, 62, 41, 36, 102,
+ 36, 63, 36, 63, 302, 63, 123, 63, 37, 222,
+ 7, 44, 123, 42, 312, 289, 123, 37, 47, 94,
+ 40, 41, 42, 43, 44, 45, 63, 47, 302, 303,
+ 63, 225, 63, 30, 293, 0, 40, 112, 58, 59,
+ 60, 94, 62, 63, 40, 304, 305, 287, 41, 41,
+ 153, 44, 44, 302, 303, 261, 262, 40, 124, 112,
+ 63, 106, 107, 40, 40, 94, 40, 40, 40, 91,
+ 40, 40, 37, 93, 94, 261, 41, 42, 43, 44,
+ 45, 123, 47, 112, 40, 60, 112, 84, 133, 302,
+ 0, 41, 112, 58, 59, 60, 41, 62, 63, 312,
+ 41, 293, 99, 123, 124, 299, 300, 301, 281, 44,
+ 41, 41, 44, 93, 41, 153, 44, 153, 293, 153,
+ 41, 293, 41, 40, 40, 319, 320, 37, 93, 94,
+ 324, 41, 42, 43, 44, 45, 40, 47, 135, 136,
+ 59, 291, 41, 62, 261, 262, 59, 112, 58, 59,
+ 60, 91, 62, 63, 205, 273, 41, 40, 123, 124,
+ 93, 41, 272, 41, 0, 41, 59, 93, 59, 41,
+ 219, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 227, 93, 94, -1, -1, 260, 261, 262,
+ -1, 41, -1, -1, 41, -1, 260, 261, 262, 265,
+ -1, -1, 112, 40, -1, 124, 43, -1, 45, 59,
+ -1, -1, 59, 123, 124, 293, -1, -1, 290, 291,
+ 290, 291, 275, 220, 221, -1, 304, 305, 290, 291,
+ 290, 291, 290, 291, 290, 291, -1, 257, 258, 259,
+ 260, 261, 262, 263, 264, 265, 290, 291, 268, 269,
+ 270, -1, 297, 290, 291, 275, -1, 290, 291, 290,
+ 291, 281, 41, 283, 284, 285, 286, 287, 41, 289,
+ 290, 291, 292, 293, 294, 295, 296, 297, -1, 299,
+ 59, 301, 302, 303, 304, 305, 59, 290, 291, -1,
+ 287, -1, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, -1, -1, 268, 269, 270, -1, 304, -1, -1,
+ 275, -1, -1, -1, -1, -1, 281, 41, 283, 284,
+ 285, 286, 287, -1, 289, 290, 291, 292, 293, 294,
+ 295, 296, 297, -1, 299, 59, 301, 302, 303, 304,
+ 305, 260, 261, 262, -1, -1, 265, 257, 258, 259,
260, 261, 262, 263, 264, 265, -1, -1, 268, 269,
- -1, -1, -1, -1, 274, -1, -1, -1, -1, -1,
- 280, -1, 282, 283, 284, 285, 286, -1, 288, 289,
- -1, 291, 292, 293, 294, 295, 296, -1, 298, -1,
- 300, 301, 302, 303, 304, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 257, 258, 259, 260, 261, 262, 263, 264, 265, -1,
- -1, 268, 269, 0, -1, -1, -1, 274, -1, -1,
- -1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
- -1, 288, 289, 290, 291, 292, 293, 294, 295, 296,
- -1, 298, -1, 300, 301, 302, 303, 304, -1, -1,
- 37, -1, -1, 40, 41, 42, 43, 44, 45, -1,
- 47, -1, -1, -1, -1, -1, -1, -1, 0, -1,
- -1, 58, 59, 60, -1, 62, 63, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 270, 0, -1, -1, -1, 275, -1, -1, -1, -1,
+ 41, 281, -1, 283, 284, 285, 286, 287, 41, 289,
+ 290, 291, 292, 293, 294, 295, 296, 297, 59, 299,
+ -1, 301, 302, 303, 304, 305, 59, -1, 37, -1,
+ -1, 40, 41, 42, 43, 44, 45, -1, 47, -1,
+ 260, 261, 262, 260, 261, 262, 0, -1, 41, 58,
+ 59, -1, -1, 62, 63, -1, 263, 264, 52, 53,
+ -1, 268, 269, 270, -1, -1, 59, 61, 62, -1,
+ -1, -1, -1, -1, 281, -1, 283, 284, 285, -1,
+ 287, 41, -1, 37, 93, 94, 40, 41, 42, 43,
+ 44, 45, 299, 47, -1, 302, 303, 304, 305, 59,
+ -1, 0, -1, 112, 58, 59, 60, -1, 62, 63,
+ -1, 260, 261, 262, 123, 124, -1, 260, 261, 262,
+ -1, -1, -1, -1, -1, -1, 120, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, 93,
+ 94, 40, 41, 42, 43, -1, 45, -1, 47, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 58,
+ 59, 60, -1, 62, 63, -1, 260, 261, 262, 123,
+ 124, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 177, 178, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 93, 94, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 112, -1, -1, -1, -1, -1, 260,
+ 261, 262, -1, -1, 123, 124, -1, 260, 261, 262,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, 262, 263, 264, 265, -1, -1, 268,
+ 269, 270, -1, -1, -1, -1, 275, 260, 261, 262,
+ -1, -1, 281, 267, 283, 284, 285, 286, 287, -1,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, -1,
+ 299, -1, 301, 302, 303, 304, 305, -1, -1, -1,
+ 260, 261, 262, 257, 258, 259, 260, 261, 262, 263,
+ 264, 265, -1, -1, 268, 269, 270, -1, -1, -1,
+ -1, 275, -1, -1, -1, -1, -1, 281, -1, 283,
+ 284, 285, 286, 287, -1, 289, 290, 291, 292, 293,
+ 294, 295, 296, 297, -1, 299, -1, 301, 302, 303,
+ 304, 305, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, 262, 263, 264, 265, -1, -1, 268,
+ 269, 270, 0, -1, -1, -1, 275, -1, -1, -1,
+ -1, -1, 281, -1, 283, 284, 285, 286, 287, -1,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, -1,
+ 299, -1, 301, 302, 303, 304, 305, -1, -1, 37,
+ -1, -1, 40, 41, 42, 43, 44, 45, -1, 47,
+ -1, -1, -1, -1, -1, -1, -1, 0, -1, -1,
+ 58, 59, 60, -1, 62, 63, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 37, 93, 94, 40, 41,
- 42, 43, 44, 45, -1, 47, -1, -1, -1, -1,
- -1, -1, 0, -1, -1, 112, 58, 59, 60, -1,
- 62, 63, -1, -1, -1, -1, 123, 124, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 37,
- -1, 93, 40, 41, 42, 43, 44, 45, -1, 47,
+ -1, -1, -1, -1, 37, 93, 94, 40, 41, 42,
+ 43, 44, 45, -1, 47, -1, -1, -1, -1, -1,
+ -1, 0, -1, -1, 112, 58, 59, 60, -1, 62,
+ 63, -1, -1, -1, -1, 123, 124, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 58, 59, 60, -1, 62, 63, -1, -1, -1, -1,
- -1, 123, 124, -1, -1, 0, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, -1,
+ 93, 40, 41, 42, 43, 44, 45, -1, 47, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 58,
+ 59, 60, -1, 62, 63, -1, -1, -1, -1, -1,
+ 123, 124, -1, -1, -1, 0, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 93, -1, -1, -1, -1,
+ -1, -1, -1, -1, 93, 94, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 37, -1, -1, 40, 41, 42, 43, 44,
- 45, -1, 47, -1, -1, 123, 124, -1, -1, -1,
+ -1, -1, 37, 112, -1, 40, 41, 42, 43, 44,
+ 45, -1, 47, -1, 123, 124, -1, -1, -1, -1,
-1, -1, -1, 58, 59, 60, -1, 62, 63, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265, -1, -1,
+ 268, 269, 270, -1, -1, -1, -1, 275, 93, -1,
+ -1, -1, -1, 281, -1, 283, 284, 285, 286, 287,
+ -1, 289, 290, -1, 292, 293, 294, 295, 296, 297,
+ -1, 299, -1, 301, 302, 303, 304, 305, 123, 124,
+ -1, -1, -1, -1, 257, 258, 259, 260, 261, 262,
+ 263, 264, 265, -1, -1, 268, 269, 270, -1, -1,
+ -1, -1, 275, -1, -1, -1, -1, -1, 281, -1,
+ 283, 284, 285, 286, 287, -1, 289, 290, 291, 292,
+ 293, 294, 295, 296, 297, -1, 299, -1, 301, 302,
+ 303, 304, 305, -1, -1, -1, -1, -1, 257, 258,
+ 259, 260, 261, 262, 263, 264, 265, -1, -1, 268,
+ 269, 270, -1, -1, -1, -1, 275, -1, -1, -1,
+ -1, -1, 281, -1, 283, 284, 285, 286, 287, -1,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, -1,
+ 299, -1, 301, -1, -1, 304, 305, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 257, 258, 259, 260, 261, 262, 263, 264, 265, -1,
- -1, 268, 269, -1, -1, -1, -1, 274, 93, -1,
- -1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
- -1, 288, 289, 290, 291, 292, 293, 294, 295, 296,
- -1, 298, -1, 300, -1, -1, 303, 304, 123, 124,
- -1, -1, -1, -1, -1, 257, 258, 259, 260, 261,
- 262, 263, 264, 265, -1, -1, 268, 269, -1, -1,
- -1, -1, 274, -1, -1, -1, -1, -1, 280, -1,
- 282, 283, 284, 285, 286, -1, 288, 289, 290, 291,
- 292, 293, 294, 295, 296, -1, 298, -1, 300, 301,
- 302, 303, 304, -1, -1, -1, -1, -1, -1, 257,
- 258, 259, 260, 261, 262, 263, 264, 265, 0, -1,
- 268, 269, -1, -1, -1, -1, 274, -1, -1, -1,
- -1, -1, 280, -1, 282, 283, 284, 285, 286, -1,
- 288, 289, 290, 291, 292, 293, 294, 295, 296, -1,
- 298, -1, 300, 301, 302, 303, 304, -1, 40, -1,
- -1, 43, -1, 45, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 59, -1, -1,
-1, -1, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, -1, -1, 268, 269, 0, -1, -1, -1, 274,
- -1, -1, -1, -1, -1, 280, -1, 282, 283, 284,
- 285, 286, -1, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, -1, 298, -1, 300, 301, 302, 303, 304,
- -1, -1, 37, -1, -1, 40, 41, 42, 43, 44,
- 45, 123, 47, -1, -1, -1, -1, -1, -1, 0,
- -1, -1, -1, 58, 59, 60, -1, 62, 63, -1,
+ 265, -1, -1, 268, 269, 270, 0, -1, -1, -1,
+ 275, -1, -1, -1, -1, -1, 281, -1, 283, 284,
+ 285, 286, 287, -1, 289, 290, 291, 292, 293, 294,
+ 295, 296, 297, -1, 299, -1, 301, 302, 303, 304,
+ 305, -1, -1, 37, -1, -1, 40, 41, 42, 43,
+ 44, 45, -1, 47, -1, -1, -1, -1, -1, -1,
+ 0, -1, -1, -1, 58, 59, 60, -1, 62, 63,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 37, -1, 93, 40,
- 41, 42, 43, 44, 45, -1, 47, -1, -1, -1,
- -1, -1, -1, 0, -1, -1, -1, 58, 59, 60,
- -1, 62, 63, -1, -1, -1, -1, -1, 123, 124,
+ -1, -1, -1, -1, -1, -1, -1, 37, -1, 93,
+ 40, 41, 42, 43, 44, 45, -1, 47, -1, -1,
+ -1, -1, -1, -1, 0, -1, -1, -1, 58, 59,
+ 60, -1, 62, 63, -1, -1, -1, -1, -1, 123,
+ 124, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 37, -1, 93, 40, 41, 42, 43, 44, 45,
+ -1, 47, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 58, 59, 60, -1, 62, 63, -1, -1,
+ -1, -1, -1, 123, 124, -1, -1, -1, -1, 0,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 37, -1, 93, 40, 41, 42, 43, 44, 45, -1,
- 47, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 58, 59, 60, -1, 62, 63, -1, -1, -1,
- -1, -1, 123, 124, -1, 257, 258, 259, 260, 261,
- 262, 263, 264, -1, -1, -1, 268, 269, -1, -1,
- -1, -1, -1, -1, -1, -1, 93, 94, 280, -1,
- 282, 283, 284, 285, 286, -1, -1, -1, -1, 291,
- 292, 293, 294, -1, -1, 112, 298, -1, 300, 301,
- 302, 303, 304, -1, -1, -1, 123, 124, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 93, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 37, -1, -1, 40,
+ 41, 42, 43, 44, 45, -1, 47, 123, 124, -1,
+ -1, -1, -1, -1, -1, -1, -1, 58, 59, 60,
+ -1, 62, 63, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 257, 258, 259, 260, 261, 262, 263,
+ 264, 265, -1, -1, 268, 269, 270, -1, -1, -1,
+ -1, 275, 93, -1, -1, -1, -1, 281, -1, 283,
+ 284, 285, 286, 287, -1, 289, 290, 291, 292, 293,
+ 294, 295, 296, 297, -1, 299, -1, 301, 302, 303,
+ 304, 305, 123, 124, -1, -1, -1, 257, 258, 259,
+ 260, 261, 262, 263, 264, 265, -1, -1, 268, 269,
+ 270, -1, -1, -1, -1, 275, -1, -1, -1, -1,
+ -1, 281, -1, 283, 284, 285, 286, 287, -1, 289,
+ 290, 291, 292, 293, 294, 295, 296, 297, -1, 299,
+ -1, 301, 302, 303, 304, 305, -1, -1, -1, -1,
+ -1, 257, 258, 259, 260, 261, 262, 263, 264, 265,
+ -1, -1, 268, 269, 270, -1, -1, -1, -1, 275,
+ -1, -1, -1, -1, -1, 281, -1, 283, 284, 285,
+ 286, 287, -1, 289, 290, 291, 292, 293, 294, 295,
+ 296, 297, -1, 299, -1, 301, 302, 303, 304, 305,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, -1, -1, 268, 269, -1, -1, -1, -1, 274,
- -1, 40, -1, -1, 43, 280, 45, 282, 283, 284,
- 285, 286, -1, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, -1, 298, -1, 300, 301, 302, 303, 304,
-1, -1, -1, -1, -1, -1, 257, 258, 259, 260,
- 261, 262, 263, 264, 265, -1, -1, 268, 269, -1,
- -1, -1, -1, 274, -1, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, 288, 289, 290,
- 291, 292, 293, 294, 295, 296, -1, 298, -1, 300,
- 301, 302, 303, 304, 40, -1, -1, 43, -1, 45,
- 257, 258, 259, 260, 261, 262, 263, 264, 265, -1,
- -1, 268, 269, 0, -1, -1, -1, 274, -1, -1,
- -1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
- -1, -1, 289, 290, 291, 292, 293, 294, 295, 296,
- -1, 298, -1, 300, -1, -1, 303, 304, -1, -1,
- 37, -1, -1, 40, 41, 42, 43, 44, 45, -1,
- 47, -1, -1, -1, -1, -1, -1, -1, 0, -1,
- -1, 58, 59, 60, -1, 62, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 93, 94, 40, 41,
- -1, 43, 44, 45, -1, -1, -1, -1, -1, 0,
- -1, -1, -1, -1, -1, 112, 58, 59, 60, -1,
- 62, 63, -1, -1, 263, 264, 123, 124, -1, 268,
- 269, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 280, -1, 282, 283, 284, -1, 286, -1, 40,
- 41, 93, 43, 44, 45, -1, -1, 0, -1, 298,
- -1, -1, 301, 302, 303, 304, -1, 58, 59, 60,
- -1, 62, 63, -1, -1, -1, -1, -1, -1, -1,
- -1, 123, 124, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 40, 41, -1,
- -1, 44, 93, 259, -1, 261, 262, 263, 264, -1,
- -1, 0, 268, 269, -1, 58, 59, 60, -1, 62,
- 63, -1, -1, -1, 280, -1, 282, 283, 284, -1,
- 286, -1, 123, 124, -1, 291, 292, 293, 294, -1,
- -1, -1, 298, -1, 300, 301, 302, 303, 304, -1,
- 93, 40, -1, -1, 43, -1, 45, -1, -1, -1,
- 257, 258, 259, 260, 261, 262, 263, 264, 265, 0,
- 59, 268, 269, -1, -1, -1, -1, 274, -1, -1,
- 123, 124, -1, 280, -1, 282, 283, 284, 285, 286,
- -1, 288, -1, -1, 291, 292, 293, 294, 295, 296,
- -1, 298, -1, 300, 301, 302, 303, 304, -1, 40,
- -1, -1, 43, -1, 45, 257, 258, 259, 260, 261,
- 262, 263, 264, 265, -1, -1, 268, 269, 59, -1,
- -1, -1, 274, -1, 123, -1, -1, -1, 280, 0,
- 282, 283, 284, 285, 286, -1, 288, 289, 290, 291,
- 292, 293, 294, 295, 296, -1, 298, -1, 300, 301,
- 302, 303, 304, -1, -1, -1, 257, 258, 259, 260,
- 261, 262, 263, 264, 265, -1, -1, 268, 269, 40,
- -1, -1, 43, 274, 45, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, 288, 289, 290,
- 291, 292, 293, 294, 295, 296, -1, 298, -1, 300,
- 301, 302, 303, 304, 257, 258, 259, 260, 261, 262,
- 263, 264, 265, 0, -1, 268, 269, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 280, -1, 282,
- 283, 284, 285, 286, -1, 288, 289, 290, 291, 292,
- 293, 294, 295, 296, -1, 298, -1, 300, 301, 302,
- 303, 304, 123, 40, 41, -1, -1, 44, 257, 258,
- 259, 260, 261, 262, 263, 264, -1, 0, -1, 268,
- 269, 58, 59, 60, -1, 62, 63, -1, -1, -1,
- -1, 280, -1, 282, 283, 284, 285, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, -1, -1, -1, 298,
- -1, 300, 301, 302, 303, 304, 93, 40, -1, -1,
- 43, -1, 45, -1, -1, -1, 257, 258, 259, 260,
- 261, 262, 263, 264, 0, -1, 59, 268, 269, -1,
- -1, -1, -1, -1, -1, -1, 123, 124, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, -1, -1, -1, 298, -1, 300,
- 301, 302, 303, 304, 40, -1, -1, 43, -1, 45,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 257, 258, 259, -1,
- 123, -1, 263, 264, -1, 0, -1, 268, 269, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 285, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, -1, -1, -1, 298, -1, 300,
- 301, 302, 303, 304, -1, 40, -1, -1, 43, -1,
- 45, -1, -1, -1, -1, -1, -1, 123, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 257, 258, 259, 260, 261, 262, 263, 264, 265, -1,
- -1, 268, 269, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 280, -1, 282, 283, 284, 285, 286,
- -1, 288, 289, 290, 291, 292, 293, 294, 295, 296,
- -1, 298, -1, 300, 301, 302, 303, 304, 123, -1,
- -1, -1, -1, -1, 257, 258, 259, 260, -1, 262,
- 263, 264, -1, -1, -1, 268, 269, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 280, -1, 282,
- 283, 284, 285, 286, -1, -1, -1, -1, 291, 292,
- 293, 294, -1, -1, -1, 298, -1, 300, 301, 302,
- 303, 304, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 257, 258, 259, -1, -1, -1, 263, 264, -1,
- -1, -1, 268, 269, -1, -1, 40, 41, -1, 43,
- 44, 45, -1, -1, 280, -1, 282, 283, 284, 285,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, 63,
- -1, -1, 298, -1, 300, 301, 302, 303, 304, -1,
+ 261, 262, 263, 264, 265, -1, -1, 268, 269, 270,
+ 0, -1, -1, -1, 275, -1, -1, -1, -1, -1,
+ 281, -1, 283, 284, 285, 286, 287, -1, 289, 290,
+ 291, 292, 293, 294, 295, 296, 297, -1, 299, -1,
+ 301, 302, 303, 304, 305, -1, -1, 37, -1, -1,
+ 40, 41, 42, 43, 44, 45, -1, 47, -1, -1,
+ -1, -1, -1, -1, -1, 0, -1, -1, 58, 59,
+ 60, -1, 62, 63, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 40, 41, -1, 43, 44, 45, -1,
- -1, -1, 257, 258, 259, -1, -1, -1, 263, 264,
- -1, -1, -1, 268, 269, 0, 63, -1, -1, -1,
- -1, -1, -1, -1, -1, 280, -1, 282, 283, 284,
- 285, 286, -1, -1, -1, -1, 291, 292, 293, 294,
- -1, -1, -1, 298, -1, 300, 301, 302, 303, 304,
- -1, -1, 37, -1, -1, 40, 41, 42, 43, 44,
- 45, -1, 47, -1, -1, -1, -1, -1, -1, -1,
- 0, -1, -1, 58, 59, 60, -1, 62, 63, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 37, 93, 94, 40, 41, 42, 43, 44,
+ 45, -1, 47, -1, -1, -1, -1, -1, -1, -1,
+ 0, -1, 112, 58, 59, 60, -1, 62, -1, -1,
+ -1, -1, -1, 123, 124, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 37, 93, 94,
- 40, 41, 42, 43, 44, 45, -1, 47, 0, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 93, 94,
+ 40, 41, -1, 43, 44, 45, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 112, 58, 59,
- -1, -1, 62, 63, -1, -1, -1, -1, 123, 124,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 37, -1, -1, -1, 41,
- 42, -1, 44, 93, 94, 47, -1, -1, -1, 263,
- 264, -1, -1, -1, 268, 269, 58, 59, 60, -1,
- 62, 63, 112, -1, -1, -1, 280, -1, 282, 283,
- 284, -1, 286, 123, 124, -1, -1, 291, 292, 293,
- 294, -1, -1, -1, 298, -1, -1, 301, 302, 303,
- 304, 93, 94, -1, -1, -1, 263, 264, -1, -1,
- -1, 268, 269, -1, -1, -1, -1, -1, -1, -1,
- 112, -1, -1, 280, -1, 282, 283, 284, -1, 286,
- -1, 123, 124, -1, 291, 292, 293, 294, -1, -1,
- -1, 298, -1, -1, 301, 302, 303, 304, -1, -1,
+ 60, -1, 62, 63, -1, -1, -1, -1, 123, 124,
+ -1, -1, -1, 0, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, -1, -1, 268, 269, -1, -1, -1, -1, 274,
- -1, -1, -1, -1, -1, 280, -1, 282, 283, 284,
- 285, 286, -1, 288, 289, 290, 291, -1, 293, 294,
- 295, 296, -1, 298, -1, 300, 301, 302, -1, -1,
+ -1, -1, -1, 93, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 40, 41, -1, 43, 44, 45, -1,
+ -1, -1, -1, 123, 124, -1, -1, -1, -1, -1,
+ -1, 58, 59, 60, -1, 62, 63, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 257, 258, 259,
260, 261, 262, 263, 264, 265, -1, -1, 268, 269,
- -1, -1, -1, -1, 274, -1, -1, -1, -1, -1,
- 280, -1, 282, 283, 284, 285, 286, 0, 288, 289,
- 290, 291, -1, 293, 294, 295, 296, -1, 298, -1,
- 300, 301, 302, -1, -1, 257, 258, 259, 260, 261,
- 262, -1, -1, 265, -1, -1, -1, -1, -1, -1,
- -1, -1, 274, -1, 37, -1, -1, -1, 41, 42,
- -1, 44, 0, 285, 47, -1, 288, 289, 290, 291,
- 292, 293, 294, 295, 296, 58, 59, 60, 300, 62,
- 63, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 37,
- -1, -1, -1, 41, 42, -1, 44, 0, -1, 47,
- 93, 94, -1, -1, -1, -1, -1, -1, -1, -1,
- 58, 59, 60, -1, 62, 63, -1, -1, -1, 112,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 123, 124, -1, -1, 37, -1, -1, -1, 41, 42,
- -1, 44, -1, -1, 47, 93, 94, -1, -1, -1,
- -1, -1, -1, -1, -1, 58, 59, 60, -1, 62,
- 63, -1, -1, -1, 112, -1, 0, -1, -1, -1,
- -1, -1, -1, -1, -1, 123, 124, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 93, 94, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 37, -1, -1, -1, 41, 42, 112,
- 44, -1, -1, 47, -1, -1, -1, -1, -1, -1,
- 123, 124, -1, -1, 58, 59, 60, -1, 62, 63,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 93,
- 94, -1, -1, -1, 257, 258, 259, 260, 261, 262,
- -1, -1, 265, -1, -1, -1, -1, -1, 112, -1,
- -1, 274, -1, -1, -1, -1, -1, -1, -1, 123,
- 124, -1, 285, -1, -1, 288, 289, 290, 291, 292,
- 293, 294, 295, 296, -1, -1, -1, 300, -1, 257,
- 258, 259, 260, 261, 262, -1, -1, 265, -1, -1,
- -1, -1, -1, -1, -1, -1, 274, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 285, -1, -1,
- 288, 289, 290, 291, 292, 293, 294, 295, 296, -1,
- -1, -1, 300, -1, 257, 258, 259, 260, 261, 262,
- -1, -1, 265, -1, -1, -1, -1, -1, -1, -1,
- -1, 274, -1, -1, 0, -1, -1, -1, -1, -1,
- -1, -1, 285, -1, -1, 288, 289, 290, 291, 292,
- 293, 294, 295, 296, -1, -1, -1, 300, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 37, 47, 48, -1, 41, 42, -1, 44, -1,
- -1, 47, -1, 257, 258, 259, 260, 261, 262, -1,
- -1, 265, 58, 59, 60, -1, 62, 63, -1, -1,
- 274, 0, -1, -1, -1, -1, 81, -1, 83, 84,
- -1, 285, -1, -1, 288, 289, 290, 291, 292, 293,
- 294, 295, 296, -1, -1, -1, 300, 93, 94, -1,
- -1, -1, -1, -1, -1, -1, 111, 112, 37, -1,
- -1, -1, 41, 42, -1, 44, 112, -1, 47, 0,
- -1, -1, -1, -1, -1, -1, -1, 123, 124, 58,
- 59, 60, -1, 62, 63, -1, -1, -1, -1, -1,
+ 270, -1, -1, -1, -1, 275, 93, -1, -1, -1,
+ -1, 281, -1, 283, 284, 285, 286, 287, -1, -1,
+ 290, 291, 292, 293, 294, 295, 296, 297, -1, 299,
+ -1, 301, -1, -1, 304, 305, 123, 124, -1, -1,
+ -1, -1, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, -1, -1, 268, 269, 270, -1, -1, -1, -1,
+ 275, -1, -1, -1, -1, -1, 281, -1, 283, 284,
+ 285, 286, 287, -1, 289, -1, -1, 292, 293, 294,
+ 295, 296, 297, -1, 299, -1, 301, 302, 303, 304,
+ 305, -1, -1, -1, -1, -1, -1, 257, 258, 259,
+ 260, 261, 262, 263, 264, 265, -1, 0, 268, 269,
+ 270, -1, -1, -1, -1, 275, -1, -1, -1, -1,
+ -1, 281, -1, 283, 284, 285, 286, 287, -1, 289,
+ 290, 291, 292, 293, 294, 295, 296, 297, -1, 299,
+ -1, 301, 302, 303, 304, 305, -1, 40, -1, -1,
+ 43, -1, 45, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 59, -1, -1, -1,
+ 257, 258, 259, 260, 261, 262, 263, 264, 265, 0,
+ -1, 268, 269, 270, -1, -1, -1, -1, 275, -1,
+ -1, -1, -1, -1, 281, -1, 283, 284, 285, 286,
+ 287, -1, 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, -1, 299, -1, 301, 302, 303, 304, 305, 40,
+ 41, -1, -1, 44, -1, -1, -1, -1, -1, 0,
+ 123, -1, -1, -1, -1, -1, -1, 58, 59, 60,
+ -1, 62, 63, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 40,
+ 41, -1, 93, 44, -1, -1, -1, -1, -1, -1,
+ 0, -1, -1, -1, -1, -1, -1, 58, 59, 60,
+ -1, 62, 63, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 123, 124, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 40, -1, 93, 43, -1, 45, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 0, 59,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 123, 124, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 257, 258, 259, 260, 261, 262,
+ 263, 264, -1, -1, -1, 268, 269, 270, 40, -1,
+ -1, 43, -1, 45, -1, -1, -1, 0, 281, -1,
+ 283, 284, 285, 286, 287, -1, -1, 59, -1, 292,
+ 293, 294, 295, 123, -1, -1, 299, -1, 301, 302,
+ 303, 304, 305, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 40, -1, -1,
+ 43, -1, 45, -1, -1, -1, 257, 258, 259, 260,
+ 261, 262, 263, 264, 265, -1, 59, 268, 269, 270,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 281, 123, 283, 284, 285, 286, 287, -1, 289, 290,
+ 291, 292, 293, 294, 295, 296, 297, -1, 299, -1,
+ 301, 302, 303, 304, 305, -1, 257, 258, 259, 260,
+ 261, 262, 263, 264, 265, -1, -1, 268, 269, 270,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 281, 0, 283, 284, 285, 286, 287, -1, 289, 290,
+ 291, 292, 293, 294, 295, 296, 297, -1, 299, -1,
+ 301, 302, 303, 304, 305, -1, -1, 257, 258, 259,
+ 260, 261, 262, 263, 264, -1, -1, -1, 268, 269,
+ 270, 40, -1, -1, 43, -1, 45, -1, -1, -1,
+ -1, 281, -1, 283, 284, 285, 286, 287, -1, -1,
+ 0, -1, 292, 293, 294, 295, -1, -1, -1, 299,
+ -1, 301, 302, 303, 304, 305, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 257, 258, 259, 260, -1,
+ 262, 263, 264, -1, -1, -1, 268, 269, 270, -1,
+ 40, -1, -1, 43, -1, 45, -1, -1, -1, 281,
+ 0, 283, 284, 285, 286, 287, -1, -1, -1, -1,
+ 292, 293, 294, 295, 123, -1, -1, 299, -1, 301,
+ 302, 303, 304, 305, 257, 258, 259, 260, 261, 262,
+ 263, 264, -1, -1, -1, 268, 269, 270, -1, -1,
+ 40, -1, -1, 43, -1, 45, -1, -1, 281, -1,
+ 283, 284, 285, 286, 287, -1, -1, -1, 0, 292,
+ 293, 294, 295, -1, -1, -1, 299, -1, 301, 302,
+ 303, 304, 305, 123, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 37, -1, -1, 40, 41,
+ 42, 43, 44, 45, -1, 47, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 58, 59, 60, -1,
+ 62, 63, -1, 123, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 257, 258,
+ 259, 93, 94, -1, 263, 264, -1, -1, -1, 268,
+ 269, 270, -1, -1, -1, -1, -1, -1, -1, -1,
+ 112, -1, 281, -1, 283, 284, 285, 286, 287, -1,
+ -1, 123, 124, 292, 293, 294, 295, -1, -1, -1,
+ 299, -1, 301, 302, 303, 304, 305, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 257, 258, 259,
+ -1, -1, -1, 263, 264, -1, -1, -1, 268, 269,
+ 270, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 281, -1, 283, 284, 285, 286, 287, -1, -1,
+ -1, -1, 292, 293, 294, 295, -1, -1, -1, 299,
+ -1, 301, 302, 303, 304, 305, -1, 257, 258, 259,
+ -1, -1, -1, 263, 264, -1, -1, -1, 268, 269,
+ 270, -1, -1, -1, -1, 40, -1, -1, 43, -1,
+ 45, 281, -1, 283, 284, 285, 286, 287, -1, -1,
+ -1, -1, 292, 293, 294, 295, -1, -1, -1, 299,
+ -1, 301, 302, 303, 304, 305, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 257, 258, 259, 260, 261,
+ 262, 263, 264, 265, -1, 0, 268, 269, 270, -1,
+ -1, -1, -1, 275, -1, -1, -1, -1, -1, 281,
+ -1, 283, 284, 285, 286, 287, -1, 289, 290, 291,
+ 292, -1, 294, 295, 296, 297, -1, 299, 123, 301,
+ 302, 303, 37, -1, -1, 40, 41, 42, 43, 44,
+ 45, -1, 47, 0, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 58, 59, -1, -1, 62, 63, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 37, -1, -1, -1, 41, 42, -1, 44, 93, 94,
+ 47, 0, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 58, 59, 60, -1, 62, 63, 112, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 123, 124,
+ -1, -1, -1, -1, -1, -1, -1, -1, 37, -1,
+ -1, -1, 41, 42, -1, 44, 93, 94, 47, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 58,
+ 59, 60, -1, 62, 63, 112, -1, -1, -1, -1,
+ -1, -1, 257, 258, 259, -1, 123, 124, 263, 264,
+ -1, -1, -1, 268, 269, 270, -1, -1, -1, -1,
+ -1, -1, -1, -1, 93, 94, 281, -1, 283, 284,
+ 285, 286, 287, -1, -1, -1, -1, 292, 293, 294,
+ 295, -1, -1, 112, 299, -1, 301, 302, 303, 304,
+ 305, -1, -1, -1, 123, 124, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 37, -1, -1, -1,
- 41, 42, -1, 44, 93, 94, 47, -1, -1, 174,
- -1, -1, -1, -1, -1, -1, -1, 58, 59, 60,
- 185, 62, 187, 112, 189, -1, -1, -1, -1, -1,
- -1, 0, -1, -1, 123, 124, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 211, -1, -1, -1,
- -1, -1, 93, 94, -1, -1, -1, -1, -1, -1,
- -1, 226, 227, 228, 229, 230, -1, -1, 37, -1,
- -1, 112, 41, 42, -1, 44, -1, -1, 47, -1,
- -1, -1, 123, 124, -1, -1, -1, -1, -1, 58,
- 59, 60, -1, 62, -1, -1, -1, -1, -1, -1,
- -1, 257, 258, 259, 260, 261, 262, -1, -1, 265,
- 275, -1, -1, -1, 279, 280, 281, -1, 274, 0,
- 285, -1, -1, -1, 93, 94, -1, -1, -1, 285,
- -1, -1, 288, 289, 290, 291, 292, 293, 294, 295,
- 296, -1, -1, 112, 300, 310, 311, -1, -1, -1,
- -1, 316, -1, -1, 123, 124, 37, -1, -1, -1,
- 41, 42, -1, 44, -1, -1, 47, -1, 257, 258,
- 259, 260, 261, 262, -1, -1, 265, 58, 59, 60,
- -1, 62, -1, -1, -1, 274, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 285, -1, -1, 288,
- 289, 290, -1, -1, -1, -1, 295, 296, -1, -1,
- -1, 300, 93, 94, -1, -1, 257, 258, 259, 260,
- 261, 262, -1, -1, 265, -1, -1, -1, -1, 40,
- 41, 112, 43, 274, 45, -1, -1, -1, -1, 0,
- -1, -1, 123, 124, 285, -1, -1, 288, 289, 290,
- -1, -1, 63, -1, 295, 296, -1, -1, -1, 300,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, -1, -1, 268, 269, 270, -1, -1, -1, -1,
+ 275, -1, -1, -1, -1, -1, 281, -1, 283, 284,
+ 285, 286, 287, -1, 289, 290, 291, 292, -1, 294,
+ 295, 296, 297, -1, 299, -1, 301, 302, 303, -1,
+ 257, 258, 259, 260, 261, 262, -1, -1, 265, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 275, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 286,
+ -1, 0, 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, -1, -1, -1, 301, -1, -1, -1, 257, 258,
+ 259, 260, 261, 262, -1, -1, 265, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 275, -1, 37, -1,
+ -1, -1, 41, 42, -1, 44, 0, 286, 47, -1,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, 58,
+ 59, 60, 301, 62, 63, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 37, -1, -1, -1, 41, 42, -1,
+ 44, 0, -1, 47, 93, 94, -1, -1, -1, -1,
+ -1, -1, -1, -1, 58, 59, 60, -1, 62, 63,
+ -1, -1, -1, 112, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 123, 124, -1, -1, 37, -1,
+ -1, -1, 41, 42, -1, 44, -1, -1, 47, 93,
+ 94, -1, -1, -1, -1, -1, -1, -1, -1, 58,
+ 59, 60, -1, 62, 63, -1, -1, -1, 112, -1,
+ 0, -1, -1, -1, -1, -1, -1, -1, -1, 123,
+ 124, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 93, 94, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 37, -1, -1,
+ -1, 41, 42, 112, 44, -1, -1, 47, -1, -1,
+ -1, -1, -1, -1, 123, 124, -1, -1, 58, 59,
+ 60, -1, 62, 63, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 93, 94, -1, -1, -1, 257, 258,
+ 259, 260, 261, 262, -1, -1, 265, -1, -1, -1,
+ -1, -1, 112, -1, -1, -1, 275, -1, -1, -1,
+ -1, -1, -1, 123, 124, -1, -1, 286, -1, -1,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, -1,
+ -1, -1, 301, 257, 258, 259, 260, 261, 262, -1,
+ -1, 265, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 275, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 286, -1, -1, 289, 290, 291, 292, 293,
+ 294, 295, 296, 297, -1, -1, -1, 301, 257, 258,
+ 259, 260, 261, 262, -1, -1, 265, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 275, -1, -1, 0,
+ -1, -1, -1, -1, -1, -1, -1, 286, -1, -1,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, -1,
+ -1, -1, 301, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 37, -1, -1, -1,
- 41, 42, -1, 44, -1, -1, 47, -1, 257, 258,
- 259, 260, 261, 262, -1, -1, 265, 58, 59, 60,
- -1, 62, -1, -1, -1, 274, 0, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 285, -1, -1, 288,
- 289, 290, -1, -1, -1, -1, 295, 296, -1, -1,
- -1, 300, 93, 94, -1, -1, -1, -1, -1, -1,
+ 41, 42, -1, 44, -1, -1, 47, 257, 258, 259,
+ 260, 261, 262, -1, -1, 265, -1, 58, 59, 60,
+ -1, 62, 63, -1, -1, 275, 0, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 286, -1, -1, 289,
+ 290, 291, 292, 293, 294, 295, 296, 297, -1, -1,
+ -1, 301, 93, 94, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 37, -1, -1, -1, 41, 42, -1,
- -1, 112, -1, 47, 0, -1, -1, -1, -1, -1,
+ 44, 112, -1, 47, 0, -1, -1, -1, -1, -1,
-1, -1, 123, 124, 58, 59, 60, -1, 62, -1,
- -1, -1, -1, -1, -1, -1, 257, 258, 259, 260,
- 261, 262, -1, -1, 265, -1, -1, -1, -1, -1,
- -1, 37, -1, 274, -1, 41, 42, -1, 44, 93,
- 94, 47, -1, -1, 285, -1, -1, 288, 289, 290,
- -1, -1, 58, 59, 295, 296, -1, -1, 112, 300,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 37, -1, -1, -1, 41, 42, -1, 44, 93,
+ 94, 47, -1, -1, -1, -1, -1, -1, -1, 0,
+ -1, -1, 58, 59, 60, -1, 62, -1, 112, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 123,
124, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 93, 94, -1,
- -1, -1, 263, 264, -1, -1, -1, 268, 269, -1,
- -1, -1, -1, -1, -1, -1, 112, -1, -1, 280,
- -1, 282, 283, 284, -1, 286, -1, 123, 124, -1,
- 291, 292, 293, 294, -1, -1, -1, 298, -1, -1,
- 301, 302, 303, 304, -1, -1, 257, 258, 259, 260,
- 261, 262, -1, -1, 265, -1, -1, -1, -1, -1,
- -1, -1, -1, 274, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 285, -1, -1, 288, 289, 290,
- -1, -1, -1, -1, 295, 296, -1, -1, -1, 300,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 257, 258, 259, 260, 261, 262, -1,
- -1, 265, -1, -1, -1, -1, -1, -1, -1, -1,
- 274, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 285, -1, -1, 288, 289, 290, -1, -1, -1,
- -1, 295, 296, -1, -1, -1, 300, -1, -1, -1,
- -1, 257, 258, 259, 260, 261, 262, -1, 7, 265,
- -1, -1, -1, -1, -1, 14, -1, -1, 274, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 285,
- 29, -1, 288, 289, 290, -1, 35, -1, -1, -1,
- -1, -1, -1, -1, 300, -1, -1, -1, -1, -1,
- 49, 50, 51, -1, -1, -1, 55, 56, -1, 58,
- 59, 60, -1, 62, 63, 64, 65, 66, -1, -1,
- -1, -1, -1, -1, -1, 40, -1, -1, 43, -1,
- 45, -1, -1, 82, -1, -1, 85, 86, 87, 88,
- 89, 90, -1, -1, 59, -1, -1, -1, -1, -1,
- -1, 100, -1, -1, -1, -1, -1, -1, -1, 108,
- -1, -1, -1, -1, -1, -1, 115, -1, -1, -1,
- 40, -1, 121, 43, -1, 45, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 136, 137, 59,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 123, -1,
- 159, 160, -1, -1, 163, 164, 165, 166, 167, -1,
- -1, -1, -1, 172, 173, 40, 175, 176, 43, -1,
- 45, 180, -1, -1, -1, 184, -1, -1, -1, -1,
- -1, -1, -1, -1, 59, -1, 195, -1, -1, 198,
- -1, -1, -1, 123, -1, 125, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 217, 218,
- 219, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 236, -1, 238,
- -1, 240, -1, 242, -1, 244, -1, -1, -1, 40,
- 249, -1, 43, -1, 45, 254, 255, -1, 123, -1,
- 125, -1, -1, 262, -1, -1, -1, -1, 59, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 282, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 260, 261, 262, 263, 264,
- 299, 266, 267, 268, 269, 270, -1, 272, 273, -1,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- -1, 286, 287, -1, -1, -1, 291, 292, 293, 294,
- -1, -1, 123, 298, 125, -1, 301, 302, 303, 304,
- 260, -1, -1, 263, 264, -1, 266, 267, 268, 269,
- 270, 271, 272, 273, -1, 275, 276, 277, 278, 279,
- 280, 281, 282, 283, 284, -1, 286, 287, -1, -1,
- -1, 291, 292, 293, 294, -1, -1, -1, 298, -1,
- -1, 301, 302, 303, 304, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 260, -1, -1, 263, 264,
- -1, 266, 267, 268, 269, 270, 271, 272, 273, -1,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- -1, 286, 287, -1, -1, -1, 291, 292, 293, 294,
- -1, -1, -1, 298, -1, -1, 301, 302, 303, 304,
- 40, -1, -1, 43, -1, 45, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 59,
+ -1, -1, -1, -1, -1, -1, 37, 93, 94, -1,
+ 41, 42, -1, 44, -1, -1, 47, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 112, 58, 59, 60,
+ -1, 62, -1, -1, -1, -1, -1, 123, 124, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 257, 258, 259, 260,
+ 261, 262, 93, 94, 265, 40, -1, -1, 43, -1,
+ 45, -1, -1, -1, 275, 0, -1, -1, -1, -1,
+ -1, 112, -1, -1, -1, 286, -1, -1, 289, 290,
+ 291, -1, 123, 124, -1, 296, 297, -1, -1, -1,
+ 301, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 37, -1, -1, -1, 41, 42, -1, 44,
+ -1, -1, 47, 257, 258, 259, 260, 261, 262, -1,
+ -1, 265, -1, 58, 59, 60, -1, 62, -1, 40,
+ -1, 275, 43, -1, 45, -1, -1, -1, -1, -1,
+ -1, -1, 286, -1, -1, 289, 290, 291, 59, -1,
+ 0, -1, 296, 297, -1, -1, -1, 301, 93, 94,
+ -1, 257, 258, 259, 260, 261, 262, -1, -1, 265,
+ -1, -1, -1, -1, -1, -1, -1, 112, -1, 275,
+ -1, -1, -1, -1, -1, -1, -1, 37, 123, 124,
+ 286, 41, 42, 289, 290, 291, -1, 47, -1, -1,
+ 296, 297, -1, -1, -1, 301, -1, -1, 58, 59,
+ 60, -1, 62, -1, -1, -1, 257, 258, 259, 260,
+ 261, 262, 0, -1, 265, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 275, -1, -1, -1, -1, -1,
+ -1, -1, -1, 93, 94, 286, -1, -1, 289, 290,
+ 291, -1, -1, -1, -1, 296, 297, -1, -1, 37,
+ 301, -1, 112, 41, 42, -1, 44, -1, -1, 47,
+ -1, -1, -1, 123, 124, -1, 261, 262, 263, 264,
+ 58, 59, -1, 268, 269, 270, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 281, -1, 283, 284,
+ 285, -1, 287, -1, -1, -1, -1, 292, 293, 294,
+ 295, -1, -1, -1, 299, 93, 94, 302, 303, 304,
+ 305, -1, 257, 258, 259, 260, 261, 262, -1, -1,
+ 265, -1, -1, -1, 112, -1, -1, -1, -1, -1,
+ 275, -1, -1, -1, -1, 123, 124, -1, 259, -1,
+ -1, 286, 263, 264, 289, 290, 291, 268, 269, 270,
+ -1, 296, 297, -1, -1, -1, 301, -1, -1, -1,
+ 281, -1, 283, 284, 285, -1, 287, -1, -1, -1,
+ -1, 292, 293, 294, 295, -1, -1, -1, 299, -1,
+ 301, 302, 303, 304, 305, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 257, 258, 259,
+ 260, 261, 262, -1, 7, 265, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 275, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 286, 30, -1, 289,
+ 290, 291, -1, 36, -1, -1, 296, 297, -1, -1,
+ -1, 301, -1, -1, -1, 48, -1, -1, 51, 52,
+ 53, 54, 55, -1, 57, 58, 59, -1, 61, 62,
+ 63, 64, 65, -1, -1, -1, -1, -1, -1, 257,
+ 258, 259, 260, 261, 262, -1, -1, 265, 81, -1,
+ -1, 84, 85, 86, 87, 88, 89, 275, 49, 50,
+ -1, -1, -1, -1, -1, -1, 99, -1, 286, 102,
+ -1, 289, 290, 291, -1, -1, -1, -1, -1, -1,
+ -1, 114, -1, 301, -1, -1, -1, 120, -1, 80,
+ -1, 82, 83, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 135, 136, -1, 40, -1, -1, 43, -1,
+ 45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 153, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 165, 166, 167, 168, 169, -1, -1, -1,
+ -1, 174, 175, -1, 177, 178, -1, -1, -1, 182,
+ -1, -1, -1, 186, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 197, 156, 157, 200, -1, -1,
+ 203, 204, -1, -1, -1, -1, -1, -1, -1, -1,
+ 17, -1, -1, -1, -1, 176, -1, 220, 221, 222,
+ -1, 28, 29, -1, 31, 32, 187, 34, 189, -1,
+ 191, -1, -1, -1, -1, 42, -1, -1, 241, -1,
+ 243, -1, 245, -1, 247, -1, 249, -1, -1, -1,
+ -1, 254, -1, 214, -1, -1, 259, 260, 40, -1,
+ -1, 43, -1, 45, 267, -1, -1, -1, 229, 230,
+ 231, 232, 233, -1, -1, -1, -1, 59, -1, -1,
+ -1, -1, -1, -1, 287, 92, 93, 94, 95, 96,
+ 97, -1, -1, -1, -1, -1, -1, 104, -1, -1,
+ -1, 304, 109, -1, -1, 112, 113, -1, -1, 116,
+ -1, 118, 119, -1, -1, -1, 123, 124, -1, 280,
+ -1, -1, -1, 284, 285, 286, -1, 134, -1, 290,
+ -1, 138, -1, 140, 141, 142, 143, 40, -1, -1,
+ 43, 123, 45, -1, 151, -1, -1, 154, -1, -1,
+ -1, -1, -1, -1, 315, 316, 59, 164, 263, 264,
+ 321, 266, 267, 268, 269, 270, -1, -1, -1, -1,
+ -1, 276, 277, 278, 279, 280, 281, -1, 283, 284,
+ 285, -1, 287, 288, -1, 192, -1, 292, 293, 294,
+ 295, -1, -1, -1, 299, -1, -1, 302, 303, 304,
+ 305, 208, 209, 210, 211, -1, 213, -1, 215, 216,
+ -1, -1, -1, -1, -1, -1, 223, 224, -1, -1,
+ 123, -1, 125, -1, -1, -1, -1, -1, 235, 236,
+ 237, 238, -1, 40, -1, -1, 43, -1, 45, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 59, -1, -1, -1, 263, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 275, 276,
+ 277, 278, 279, -1, 281, 282, 283, -1, 260, 261,
+ 262, 263, 264, -1, 266, 267, 268, 269, 270, 271,
+ -1, 273, 274, -1, 276, 277, 278, 279, 280, 281,
+ 282, 283, 284, 285, -1, 287, 288, -1, -1, -1,
+ 292, 293, 294, 295, -1, -1, 123, 299, 125, -1,
+ 302, 303, 304, 305, 40, -1, -1, 43, -1, 45,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 59, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 260, -1, -1,
+ 263, 264, -1, 266, 267, 268, 269, 270, 271, 272,
+ 273, 274, -1, 276, 277, 278, 279, 280, 281, 282,
+ 283, 284, 285, -1, 287, 288, -1, -1, -1, 292,
+ 293, 294, 295, -1, -1, -1, 299, -1, -1, 302,
+ 303, 304, 305, -1, -1, -1, -1, 123, 40, 125,
+ -1, 43, -1, 45, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 59, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 260, -1, -1, 263, 264, -1, 266,
+ 267, 268, 269, 270, 271, 272, 273, 274, -1, 276,
+ 277, 278, 279, 280, 281, 282, 283, 284, 285, -1,
+ 287, 288, -1, -1, -1, 292, 293, 294, 295, -1,
+ -1, 123, 299, 125, -1, 302, 303, 304, 305, 40,
+ -1, -1, 43, -1, 45, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 59, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 260, -1, -1, 263, 264, -1,
+ 266, 267, 268, 269, 270, 271, 272, 273, 274, -1,
+ 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
+ -1, 287, 288, -1, -1, -1, 292, 293, 294, 295,
+ -1, -1, 123, 299, 125, -1, 302, 303, 304, 305,
+ -1, 40, -1, -1, 43, -1, 45, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 59, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 260, -1,
+ -1, 263, 264, -1, 266, 267, 268, 269, 270, 271,
+ 272, 273, 274, -1, 276, 277, 278, 279, 280, 281,
+ 282, 283, 284, 285, -1, 287, 288, -1, -1, -1,
+ 292, 293, 294, 295, -1, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, 123, -1, 125, -1, -1, -1,
+ -1, -1, 40, -1, -1, 43, -1, 45, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 59, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 260,
-1, -1, 263, 264, -1, 266, 267, 268, 269, 270,
- 271, 272, 273, -1, 275, 276, 277, 278, 279, 280,
- 281, 282, 283, 284, -1, 286, 287, -1, -1, -1,
- 291, 292, 293, 294, -1, -1, -1, 298, -1, -1,
- 301, 302, 303, 304, 40, -1, -1, 43, -1, 45,
- -1, -1, -1, 123, -1, 125, -1, -1, -1, -1,
- -1, -1, -1, 59, -1, -1, -1, -1, -1, -1,
+ 271, 272, 273, 274, -1, 276, 277, 278, 279, 280,
+ 281, 282, 283, 284, 285, -1, 287, 288, -1, -1,
+ -1, 292, 293, 294, 295, -1, -1, -1, 299, -1,
+ -1, 302, 303, 304, 305, 123, 40, 125, -1, 43,
+ -1, 45, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 59, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 40,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 260, -1, -1, 263, 264, -1, 266, 267, 268,
+ 269, 270, 271, 272, 273, 274, -1, 276, 277, 278,
+ 279, 280, 281, 282, 283, 284, 285, -1, 287, 288,
+ -1, -1, -1, 292, 293, 294, 295, -1, -1, 123,
+ 299, 125, -1, 302, 303, 304, 305, 40, -1, -1,
+ 43, -1, 45, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 59, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 260, -1, -1, 263, 264, -1, 266, 267,
+ 268, 269, 270, 271, 272, 273, 274, -1, 276, 277,
+ 278, 279, 280, 281, 282, 283, 284, 285, -1, 287,
+ 288, -1, -1, -1, 292, 293, 294, 295, -1, -1,
+ 123, 299, 125, -1, 302, 303, 304, 305, -1, 40,
-1, -1, 43, -1, 45, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 59, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 123, -1, 125,
- -1, -1, -1, -1, -1, 40, -1, -1, 43, -1,
- 45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 59, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 260, -1, -1, 263,
+ 264, -1, 266, 267, 268, 269, 270, 271, 272, 273,
+ 274, -1, 276, 277, 278, 279, 280, 281, 282, 283,
+ 284, 285, -1, 287, 288, -1, -1, -1, 292, 293,
+ 294, 295, -1, -1, -1, 299, -1, -1, 302, 303,
+ 304, 305, 123, -1, 125, -1, -1, -1, -1, -1,
+ 40, -1, -1, 43, -1, 45, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 59,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 123, -1, 125, -1, -1, -1, 40, 41,
- -1, 43, -1, 45, -1, -1, -1, -1, -1, -1,
- 260, -1, -1, 263, 264, -1, 266, 267, 268, 269,
- 270, 271, 272, 273, -1, 275, 276, 277, 278, 279,
- 280, 281, 282, 283, 284, -1, 286, 287, 123, -1,
- 125, 291, 292, 293, 294, -1, -1, -1, 298, -1,
- -1, 301, 302, 303, 304, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 260, -1, -1,
+ 263, 264, -1, 266, 267, 268, 269, 270, 271, -1,
+ 273, 274, -1, 276, 277, 278, 279, 280, 281, 282,
+ 283, 284, 285, -1, 287, 288, -1, -1, -1, 292,
+ 293, 294, 295, -1, -1, -1, 299, -1, -1, 302,
+ 303, 304, 305, 123, 40, 125, -1, 43, -1, 45,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 59, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 260, -1, -1, 263, 264, -1,
- 266, 267, 268, 269, 270, 271, 272, 273, -1, 275,
- 276, 277, 278, 279, 280, 281, 282, 283, 284, -1,
- 286, 287, -1, -1, -1, 291, 292, 293, 294, -1,
- -1, -1, 298, -1, -1, 301, 302, 303, 304, 260,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 260,
-1, -1, 263, 264, -1, 266, 267, 268, 269, 270,
- 271, 272, 273, -1, 275, 276, 277, 278, 279, 280,
- 281, 282, 283, 284, 40, 286, 287, 43, -1, 45,
- 291, 292, 293, 294, -1, -1, -1, 298, -1, -1,
- 301, 302, 303, 304, -1, 260, -1, -1, 263, 264,
- -1, 266, 267, 268, 269, 270, 271, 272, 273, -1,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- -1, 286, 287, -1, -1, -1, 291, 292, 293, 294,
- -1, -1, -1, 298, -1, -1, 301, 302, 303, 304,
- 40, 263, 264, 43, -1, 45, 268, 269, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 123, 280, 59,
- 282, 283, 284, -1, 286, -1, -1, -1, -1, 291,
- 292, 293, 294, -1, -1, -1, 298, -1, -1, 301,
- 302, 303, 304, -1, -1, 40, -1, -1, 43, -1,
+ 271, -1, 273, 274, -1, 276, 277, 278, 279, 280,
+ 281, 282, 283, 284, 285, -1, 287, 288, -1, -1,
+ -1, 292, 293, 294, 295, -1, -1, 123, 299, 125,
+ -1, 302, 303, 304, 305, 40, -1, -1, 43, -1,
45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 59, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 123, -1, 125, -1, -1, -1, -1,
- 40, -1, -1, 43, -1, 45, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 59,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 123, -1,
- 125, -1, -1, -1, -1, -1, 40, -1, -1, 43,
- -1, 45, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 257, 258, 259, -1, 59, -1, 263, 264, -1,
- -1, -1, 268, 269, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 123, 280, 125, 282, 283, 284, 285,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, -1,
- -1, -1, 298, -1, 300, 301, 302, 303, 304, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 40, -1, -1, 43, -1, 45, -1, -1, -1, 123,
- 260, 125, -1, 263, 264, -1, 266, 267, 268, 269,
- 270, 271, 272, 273, -1, 275, 276, 277, 278, 279,
- 280, 281, 282, 283, 284, -1, 286, 287, -1, -1,
- -1, 291, 292, 293, 294, -1, -1, -1, 298, -1,
- -1, 301, 302, 303, 304, 260, -1, -1, 263, 264,
- -1, 266, 267, 268, 269, 270, -1, 272, 273, -1,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- -1, 286, 287, -1, -1, -1, 291, 292, 293, 294,
- -1, -1, -1, 298, -1, -1, 301, 302, 303, 304,
260, -1, -1, 263, 264, -1, 266, 267, 268, 269,
- 270, -1, 272, 273, -1, 275, 276, 277, 278, 279,
- 280, 281, 282, 283, 284, -1, 286, 287, -1, -1,
- -1, 291, 292, 293, 294, -1, -1, -1, 298, -1,
- -1, 301, 302, 303, 304, -1, 260, -1, -1, 263,
- 264, -1, 266, 267, 268, 269, 270, -1, 272, 273,
- -1, 275, 276, 277, 278, 279, 280, 281, 282, 283,
- 284, -1, 286, 287, -1, -1, -1, 291, 292, 293,
- 294, -1, -1, -1, 298, -1, -1, 301, 302, 303,
- 304, 40, -1, -1, 43, -1, 45, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 59, -1, -1, -1, -1, -1, -1, -1, -1, 259,
- -1, -1, -1, 263, 264, -1, -1, -1, 268, 269,
- -1, -1, -1, -1, -1, -1, 40, -1, -1, 43,
- 280, 45, 282, 283, 284, -1, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 59, -1, -1, 298, -1,
- 300, 301, 302, 303, 304, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 123, -1, 125, -1, -1, -1,
- -1, 40, -1, -1, 43, -1, 45, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 59, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 123,
- -1, 125, -1, -1, -1, -1, -1, 40, -1, -1,
+ 270, 271, -1, 273, 274, -1, 276, 277, 278, 279,
+ 280, 281, 282, 283, 284, 285, -1, 287, 288, -1,
+ -1, -1, 292, 293, 294, 295, -1, -1, 123, 299,
+ 125, -1, 302, 303, 304, 305, -1, 40, -1, -1,
43, -1, 45, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 59, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 123, -1, 125, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 40, -1, -1,
- 43, -1, 45, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 260, -1, -1, 263, 264, -1,
+ 266, 267, 268, 269, 270, 271, -1, 273, 274, -1,
+ 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
+ -1, 287, 288, -1, -1, -1, 292, 293, 294, 295,
+ -1, -1, -1, 299, -1, -1, 302, 303, 304, 305,
+ 123, -1, 125, -1, -1, -1, -1, -1, 40, -1,
+ -1, 43, -1, 45, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 59, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 260, -1, -1, 263, 264,
+ -1, 266, 267, 268, 269, 270, 271, -1, 273, 274,
+ -1, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, -1, 287, 288, -1, -1, -1, 292, 293, 294,
+ 295, -1, -1, -1, 299, -1, -1, 302, 303, 304,
+ 305, 123, 40, 125, -1, 43, -1, 45, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 123, 260, 125, -1, 263, 264, -1, 266, 267, 268,
- 269, 270, -1, 272, 273, -1, 275, 276, 277, 278,
- 279, 280, 281, 282, 283, 284, -1, 286, 287, -1,
- -1, -1, 291, 292, 293, 294, -1, -1, -1, 298,
- -1, -1, 301, 302, 303, 304, 260, -1, -1, 263,
- 264, -1, 266, 267, 268, 269, 270, -1, 272, 273,
- -1, 275, 276, 277, 278, 279, 280, 281, 282, 283,
- 284, -1, 286, 287, -1, -1, -1, 291, 292, 293,
- 294, -1, -1, -1, 298, -1, -1, 301, 302, 303,
- 304, 260, -1, -1, 263, 264, -1, 266, 267, 268,
- 269, 270, -1, 272, 273, -1, 275, 276, 277, 278,
- 279, 280, 281, 282, 283, 284, 40, 286, 287, 43,
- 44, 45, 291, 292, 293, 294, -1, -1, -1, 298,
- -1, -1, 301, 302, 303, 304, 60, 260, 62, 63,
- 263, 264, -1, 266, 267, 268, 269, 270, -1, 272,
- 273, -1, 275, 276, 277, 278, 279, 280, 281, 282,
- 283, 284, -1, 286, 287, -1, -1, -1, 291, 292,
- 293, 294, -1, -1, -1, 298, -1, -1, 301, 302,
- 303, 304, 40, -1, -1, 43, -1, 45, -1, -1,
- 263, 264, -1, 266, 267, 268, 269, -1, -1, -1,
- -1, 59, 275, 276, 277, 278, 279, 280, -1, 282,
- 283, 284, -1, 286, 287, -1, -1, -1, 291, 292,
- 293, 294, -1, -1, -1, 298, -1, -1, 301, 302,
- 303, 304, 40, -1, -1, 43, -1, 45, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 60, -1, 62, 63, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 123, -1, 125, -1, -1,
- -1, -1, -1, -1, 40, 41, -1, 43, 44, 45,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 63, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 40, 41,
- -1, 43, 44, 45, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 263,
- 264, 63, -1, -1, 268, 269, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 280, -1, 282, 283,
- 284, -1, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, 295, 296, -1, 298, -1, -1, 301, 302, 303,
- 304, 40, 41, -1, 43, 44, 45, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 260, -1, 63, 263, 264, -1, 266, 267,
- 268, 269, 270, -1, 272, 273, -1, 275, 276, 277,
- 278, 279, 280, 281, 282, 283, 284, -1, 286, 287,
- -1, -1, -1, 291, 292, 293, 294, -1, -1, -1,
- 298, -1, -1, 301, 302, 303, 304, 40, -1, -1,
- 43, -1, 45, -1, -1, 263, 264, -1, -1, -1,
- 268, 269, -1, -1, -1, -1, 59, -1, -1, -1,
- -1, -1, 280, -1, 282, 283, 284, -1, 286, -1,
- -1, -1, -1, 291, 292, 293, 294, 295, 296, -1,
- 298, -1, -1, 301, 302, 303, 304, 263, 264, -1,
- -1, 40, 268, 269, 43, -1, 45, -1, -1, -1,
- -1, -1, -1, -1, 280, -1, 282, 283, 284, -1,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, -1,
- -1, -1, 298, -1, -1, 301, 302, 303, 304, -1,
- -1, 263, 264, -1, -1, 40, 268, 269, 43, 44,
- 45, -1, -1, -1, -1, -1, -1, -1, 280, -1,
- 282, 283, 284, -1, 286, -1, -1, -1, 63, 291,
- 292, 293, 294, -1, -1, -1, 298, -1, -1, 301,
- 302, 303, 304, -1, -1, -1, -1, -1, 40, -1,
+ -1, 59, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 260, -1, -1,
+ 263, 264, -1, 266, 267, 268, 269, 270, 271, -1,
+ 273, 274, -1, 276, 277, 278, 279, 280, 281, 282,
+ 283, 284, 285, 40, 287, 288, 43, 44, 45, 292,
+ 293, 294, 295, -1, -1, 123, 299, 125, -1, 302,
+ 303, 304, 305, 60, -1, 62, 63, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 40, -1, -1,
+ 43, -1, 45, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 60, 260, 62,
+ 63, 263, 264, -1, 266, 267, 268, 269, 270, 271,
+ -1, 273, 274, -1, 276, 277, 278, 279, 280, 281,
+ 282, 283, 284, 285, 40, 287, 288, 43, -1, 45,
+ 292, 293, 294, 295, -1, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 40, 41, -1, 43, 44, 45, -1, -1, -1,
+ -1, -1, 260, -1, -1, 263, 264, -1, 266, 267,
+ 268, 269, 270, 271, 63, 273, 274, -1, 276, 277,
+ 278, 279, 280, 281, 282, 283, 284, 285, -1, 287,
+ 288, -1, -1, -1, 292, 293, 294, 295, -1, -1,
+ -1, 299, -1, -1, 302, 303, 304, 305, 40, 41,
-1, 43, 44, 45, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 263, 264, -1, -1, -1, 268,
- 269, 63, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 280, -1, 282, 283, 284, -1, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, -1, -1, -1, 298,
- -1, -1, 301, 302, 303, 304, 40, -1, -1, 43,
- 44, 45, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 259, -1, -1, 63,
- 263, 264, -1, -1, -1, 268, 269, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 280, -1, 282,
- 283, 284, 40, 286, -1, 43, 44, 45, 291, 292,
- 293, 294, -1, -1, -1, 298, -1, 300, 301, 302,
- 303, 304, -1, -1, -1, 63, -1, -1, -1, -1,
- 259, -1, -1, -1, 263, 264, -1, -1, -1, 268,
- 269, -1, -1, -1, 40, -1, -1, 43, 44, 45,
- -1, 280, -1, 282, 283, 284, -1, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, -1, 63, -1, 298,
- -1, 300, 301, 302, 303, 304, -1, -1, 263, 264,
- -1, -1, -1, 268, 269, -1, -1, 40, -1, -1,
- 43, 44, 45, -1, -1, 280, -1, 282, 283, 284,
- -1, 286, -1, -1, -1, -1, 291, 292, 293, 294,
- 63, -1, -1, 298, -1, -1, 301, 302, 303, 304,
- -1, 263, 264, -1, -1, -1, 268, 269, -1, -1,
- 40, -1, -1, 43, 44, 45, -1, -1, 280, -1,
- 282, 283, 284, -1, 286, -1, -1, -1, -1, 291,
- 292, 293, 294, 63, -1, -1, 298, -1, -1, 301,
- 302, 303, 304, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 40, -1, -1, 43, -1, 45, -1, 263,
- 264, -1, -1, -1, 268, 269, -1, -1, -1, -1,
- 58, -1, -1, -1, -1, 63, 280, -1, 282, 283,
- 284, -1, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, -1, -1, -1, 298, -1, -1, 301, 302, 303,
- 304, -1, -1, -1, -1, 263, 264, -1, -1, 40,
- 268, 269, 43, -1, 45, -1, -1, -1, -1, -1,
- -1, -1, 280, -1, 282, 283, 284, 58, 286, -1,
- -1, -1, 63, 291, 292, 293, 294, -1, -1, -1,
- 298, -1, -1, 301, 302, 303, 304, 263, 264, -1,
- -1, -1, 268, 269, 40, -1, -1, 43, -1, 45,
- -1, -1, -1, -1, 280, -1, 282, 283, 284, -1,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, -1,
- -1, -1, 298, -1, -1, 301, 302, 303, 304, -1,
- 263, 264, -1, -1, -1, 268, 269, -1, -1, 40,
- 41, -1, 43, -1, 45, -1, -1, 280, -1, 282,
- 283, 284, -1, 286, -1, -1, -1, -1, 291, 292,
- 293, 294, 63, -1, -1, 298, -1, -1, 301, 302,
- 303, 304, -1, 263, 264, -1, -1, -1, 268, 269,
- -1, -1, 40, 41, -1, 43, -1, 45, -1, -1,
- 280, -1, 282, 283, 284, -1, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 63, -1, -1, 298, -1,
- -1, 301, 302, 303, 304, 263, 264, -1, -1, -1,
- 268, 269, -1, -1, 40, 41, -1, 43, -1, 45,
- -1, -1, 280, -1, 282, 283, 284, -1, 286, -1,
- -1, -1, -1, 291, 292, 293, 294, 63, -1, -1,
- 298, -1, -1, 301, 302, 303, 304, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 263, 264, -1, -1, -1, 268, 269, -1,
- -1, 40, 41, -1, 43, -1, 45, -1, -1, 280,
- -1, 282, 283, 284, -1, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, 63, -1, -1, 298, -1, -1,
- 301, 302, 303, 304, -1, 261, 262, 263, 264, -1,
- -1, -1, 268, 269, -1, -1, 40, 41, -1, 43,
- -1, 45, -1, -1, 280, -1, 282, 283, 284, -1,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, 63,
- -1, -1, 298, -1, -1, 301, 302, 303, 304, -1,
- -1, -1, 263, 264, -1, -1, -1, 268, 269, -1,
- -1, 40, 41, -1, 43, -1, 45, -1, -1, 280,
- -1, 282, 283, 284, -1, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, 63, -1, -1, 298, -1, -1,
- 301, 302, 303, 304, -1, 263, 264, -1, -1, -1,
- 268, 269, -1, -1, 40, 41, -1, 43, -1, 45,
- -1, -1, 280, -1, 282, 283, 284, -1, 286, -1,
- -1, -1, -1, 291, 292, 293, 294, 63, -1, -1,
- 298, -1, -1, 301, 302, 303, 304, 263, 264, -1,
- -1, -1, 268, 269, -1, -1, 40, 41, -1, 43,
- -1, 45, -1, -1, 280, -1, 282, 283, 284, -1,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, 63,
- -1, -1, 298, -1, -1, 301, 302, 303, 304, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 63, -1, -1, -1, -1, 263, 264, -1, -1,
+ -1, 268, 269, 270, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 281, -1, 283, 284, 285, -1,
+ 287, -1, -1, -1, -1, 292, 293, 294, 295, 296,
+ 297, -1, 299, -1, -1, 302, 303, 304, 305, -1,
+ 263, 264, -1, -1, -1, 268, 269, 270, -1, -1,
+ -1, -1, 40, 41, -1, 43, 44, 45, 281, -1,
+ 283, 284, 285, -1, 287, -1, -1, -1, -1, 292,
+ 293, 294, 295, 296, 297, 63, 299, -1, -1, 302,
+ 303, 304, 305, 259, -1, 261, 262, 263, 264, -1,
+ -1, -1, 268, 269, 270, -1, -1, 40, 41, -1,
+ 43, 44, 45, -1, -1, 281, -1, 283, 284, 285,
+ -1, 287, -1, -1, -1, -1, 292, 293, 294, 295,
+ 63, -1, -1, 299, -1, 301, 302, 303, 304, 305,
-1, -1, -1, -1, 263, 264, -1, -1, -1, 268,
- 269, -1, -1, 40, 41, -1, 43, -1, 45, -1,
- -1, 280, -1, 282, 283, 284, -1, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, 63, -1, -1, 298,
- -1, -1, 301, 302, 303, 304, -1, -1, -1, 263,
- 264, -1, -1, -1, 268, 269, -1, -1, -1, 40,
- -1, -1, 43, -1, 45, -1, 280, -1, 282, 283,
- 284, -1, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, -1, -1, -1, 298, -1, -1, 301, 302, 303,
- 304, -1, -1, -1, 263, 264, -1, -1, -1, 268,
- 269, -1, -1, -1, -1, 40, -1, -1, 43, -1,
- 45, 280, -1, 282, 283, 284, -1, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, -1, -1, -1, 298,
- -1, -1, 301, 302, 303, 304, -1, 263, 264, -1,
- -1, -1, 268, 269, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 280, -1, 282, 283, 284, 40,
- 286, -1, 43, -1, 45, 291, 292, 293, 294, -1,
- -1, -1, 298, -1, -1, 301, 302, 303, 304, 263,
- 264, -1, -1, -1, 268, 269, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 280, -1, 282, 283,
- 284, -1, 286, -1, -1, -1, -1, 291, 292, 293,
- 294, -1, -1, -1, 298, -1, -1, 301, 302, 303,
- 304, 40, -1, -1, 43, -1, 45, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 263, 264, -1, -1,
- -1, 268, 269, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 280, -1, 282, 283, 284, -1, 286,
- -1, -1, -1, -1, 291, 292, 293, 294, -1, -1,
- -1, 298, -1, -1, 301, 302, 303, 304, 259, -1,
- -1, 40, 263, 264, 43, -1, 45, 268, 269, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, 63, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, -1, -1, -1, 298, -1, -1,
- 301, 302, 303, 304, 259, -1, -1, 40, 263, 264,
- 43, -1, 45, 268, 269, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 280, -1, 282, 283, 284,
- -1, 286, -1, -1, -1, -1, 291, 292, 293, 294,
- -1, -1, -1, 298, -1, -1, 301, 302, 303, 304,
- 40, -1, -1, 43, -1, 45, -1, -1, 259, -1,
- -1, -1, 263, 264, -1, -1, -1, 268, 269, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 280,
- -1, 282, 283, 284, -1, 286, -1, -1, -1, -1,
- 291, 292, 293, 294, -1, -1, -1, 298, -1, -1,
- 301, 302, 303, 304, 40, -1, -1, 43, -1, 45,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 259, -1, -1, -1, 263, 264, -1, -1, -1, 268,
- 269, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 280, -1, 282, 283, 284, -1, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, -1, -1, -1, 298,
- -1, -1, 301, 302, 303, 304, -1, -1, -1, -1,
+ 269, 270, -1, -1, 40, 41, -1, 43, 44, 45,
+ -1, -1, 281, -1, 283, 284, 285, -1, 287, -1,
+ -1, -1, -1, 292, 293, 294, 295, 63, -1, -1,
+ 299, -1, -1, 302, 303, 304, 305, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 263, 264, -1, -1, -1, 268, 269, 270, 40,
+ -1, -1, 43, -1, 45, -1, -1, -1, -1, 281,
+ -1, 283, 284, 285, -1, 287, -1, -1, -1, -1,
+ 292, 293, 294, 295, -1, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 40, -1, -1, 43,
+ -1, 45, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 263, 264, -1, -1, -1,
+ 268, 269, 270, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 281, -1, 283, 284, 285, -1, 287,
+ -1, -1, -1, -1, 292, 293, 294, 295, -1, -1,
+ -1, 299, -1, -1, 302, 303, 304, 305, -1, -1,
+ 263, 264, -1, -1, -1, 268, 269, 270, -1, -1,
+ 40, -1, -1, 43, 44, 45, -1, -1, 281, -1,
+ 283, 284, 285, -1, 287, -1, -1, -1, -1, 292,
+ 293, 294, 295, 63, -1, -1, 299, -1, -1, 302,
+ 303, 304, 305, -1, -1, -1, -1, 263, 264, -1,
+ -1, -1, 268, 269, 270, -1, -1, 40, 41, -1,
+ 43, -1, 45, -1, -1, 281, -1, 283, 284, 285,
+ -1, 287, -1, -1, -1, -1, 292, 293, 294, 295,
+ 63, -1, -1, 299, -1, -1, 302, 303, 304, 305,
+ -1, -1, -1, -1, -1, -1, -1, -1, 259, -1,
+ -1, -1, 263, 264, -1, -1, -1, 268, 269, 270,
+ -1, -1, 40, -1, -1, 43, 44, 45, -1, -1,
+ 281, -1, 283, 284, 285, -1, 287, -1, -1, -1,
+ -1, 292, 293, 294, 295, 63, -1, -1, 299, -1,
+ 301, 302, 303, 304, 305, 259, -1, -1, -1, 263,
+ 264, -1, -1, -1, 268, 269, 270, -1, -1, 40,
+ -1, -1, 43, 44, 45, -1, -1, 281, -1, 283,
+ 284, 285, -1, 287, -1, -1, -1, -1, 292, 293,
+ 294, 295, 63, -1, -1, 299, -1, 301, 302, 303,
+ 304, 305, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 40, -1, -1, 43, 44, 45, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 63, -1, -1, -1, -1,
+ -1, -1, -1, 263, 264, -1, -1, -1, 268, 269,
+ 270, -1, -1, -1, -1, 40, -1, -1, 43, 44,
+ 45, 281, -1, 283, 284, 285, -1, 287, -1, -1,
+ -1, -1, 292, 293, 294, 295, -1, -1, 63, 299,
+ -1, -1, 302, 303, 304, 305, -1, -1, -1, -1,
+ 263, 264, -1, -1, -1, 268, 269, 270, -1, -1,
+ 40, -1, -1, 43, 44, 45, -1, -1, 281, -1,
+ 283, 284, 285, -1, 287, -1, -1, -1, -1, 292,
+ 293, 294, 295, 63, -1, -1, 299, -1, -1, 302,
+ 303, 304, 305, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 263, 264, -1, -1, -1,
+ 268, 269, 270, -1, -1, 40, -1, -1, 43, 44,
+ 45, -1, -1, 281, -1, 283, 284, 285, -1, 287,
+ -1, -1, -1, -1, 292, 293, 294, 295, 63, -1,
+ -1, 299, -1, -1, 302, 303, 304, 305, -1, -1,
+ -1, -1, 263, 264, -1, -1, -1, 268, 269, 270,
+ -1, -1, 40, -1, -1, 43, -1, 45, -1, -1,
+ 281, -1, 283, 284, 285, -1, 287, -1, -1, -1,
+ 58, 292, 293, 294, 295, 63, -1, -1, 299, -1,
+ -1, 302, 303, 304, 305, 263, 264, -1, -1, -1,
+ 268, 269, 270, -1, -1, 40, -1, -1, 43, -1,
+ 45, -1, -1, 281, -1, 283, 284, 285, -1, 287,
+ -1, -1, -1, 58, 292, 293, 294, 295, 63, -1,
+ -1, 299, -1, -1, 302, 303, 304, 305, 263, 264,
+ -1, -1, -1, 268, 269, 270, -1, -1, 40, 41,
+ -1, 43, -1, 45, -1, -1, 281, -1, 283, 284,
+ 285, -1, 287, -1, -1, -1, -1, 292, 293, 294,
+ 295, 63, -1, -1, 299, -1, -1, 302, 303, 304,
+ 305, -1, -1, 263, 264, -1, -1, -1, 268, 269,
+ 270, -1, -1, 40, 41, -1, 43, -1, 45, -1,
+ -1, 281, -1, 283, 284, 285, -1, 287, -1, -1,
+ -1, -1, 292, 293, 294, 295, 63, -1, -1, 299,
+ -1, -1, 302, 303, 304, 305, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 263, 264,
+ -1, -1, -1, 268, 269, 270, -1, -1, 40, 41,
+ -1, 43, -1, 45, -1, -1, 281, -1, 283, 284,
+ 285, -1, 287, -1, -1, -1, -1, 292, 293, 294,
+ 295, 63, -1, -1, 299, -1, -1, 302, 303, 304,
+ 305, -1, -1, -1, -1, 263, 264, -1, -1, -1,
+ 268, 269, 270, -1, -1, 40, 41, -1, 43, -1,
+ 45, -1, -1, 281, -1, 283, 284, 285, -1, 287,
+ -1, -1, -1, -1, 292, 293, 294, 295, 63, -1,
+ -1, 299, -1, -1, 302, 303, 304, 305, 263, 264,
+ -1, -1, -1, 268, 269, 270, -1, -1, 40, 41,
+ -1, 43, -1, 45, -1, -1, 281, -1, 283, 284,
+ 285, -1, 287, -1, -1, -1, -1, 292, 293, 294,
+ 295, 63, -1, -1, 299, -1, -1, 302, 303, 304,
+ 305, 263, 264, -1, -1, -1, 268, 269, 270, -1,
+ -1, 40, 41, -1, 43, -1, 45, -1, -1, 281,
+ -1, 283, 284, 285, -1, 287, -1, -1, -1, -1,
+ 292, 293, 294, 295, 63, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, -1, -1, 263, 264, -1, -1,
+ -1, 268, 269, 270, -1, -1, 40, 41, -1, 43,
+ -1, 45, -1, -1, 281, -1, 283, 284, 285, -1,
+ 287, -1, -1, -1, -1, 292, 293, 294, 295, 63,
+ -1, -1, 299, -1, -1, 302, 303, 304, 305, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 263, 264, -1, -1, -1, 268, 269, 270, -1,
+ -1, 40, 41, -1, 43, -1, 45, -1, -1, 281,
+ -1, 283, 284, 285, -1, 287, -1, -1, -1, -1,
+ 292, 293, 294, 295, 63, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, -1, -1, -1, -1, 263, 264,
+ -1, -1, -1, 268, 269, 270, -1, -1, 40, 41,
+ -1, 43, -1, 45, -1, -1, 281, -1, 283, 284,
+ 285, -1, 287, -1, -1, -1, -1, 292, 293, 294,
+ 295, 63, -1, -1, 299, -1, -1, 302, 303, 304,
+ 305, 263, 264, -1, -1, -1, 268, 269, 270, -1,
+ -1, 40, 41, -1, 43, -1, 45, -1, -1, 281,
+ -1, 283, 284, 285, -1, 287, -1, -1, -1, -1,
+ 292, 293, 294, 295, -1, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, 263, 264, -1, -1, -1, 268,
+ 269, 270, -1, -1, -1, -1, -1, -1, 40, -1,
+ -1, 43, 281, 45, 283, 284, 285, -1, 287, -1,
+ -1, -1, -1, 292, 293, 294, 295, -1, -1, -1,
+ 299, -1, -1, 302, 303, 304, 305, -1, -1, 263,
+ 264, -1, -1, -1, 268, 269, 270, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 281, -1, 283,
+ 284, 285, 40, 287, -1, 43, -1, 45, 292, 293,
+ 294, 295, -1, -1, -1, 299, -1, -1, 302, 303,
+ 304, 305, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 263, 264, -1, -1, -1, 268,
- 269, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 280, -1, 282, 283, 284, -1, 286, -1, -1,
- -1, -1, 291, 292, 293, 294, -1, -1, -1, 298,
- -1, -1, 301, 302, 303, 304, 259, -1, -1, -1,
- 263, 264, -1, -1, -1, 268, 269, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 280, -1, 282,
- 283, 284, -1, 286, -1, -1, -1, -1, 291, 292,
- 293, 294, -1, -1, -1, 298, -1, -1, 301, 302,
- 303, 304, -1, 263, 264, -1, -1, -1, 268, 269,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 280, -1, 282, 283, 284, -1, 286, -1, -1, -1,
- -1, 291, 292, 293, 294, 16, -1, -1, 298, -1,
- -1, 301, 302, 303, 304, -1, 27, 28, -1, 30,
- 31, -1, 33, -1, -1, -1, -1, 263, 264, -1,
- 41, -1, 268, 269, -1, -1, -1, -1, -1, -1,
- -1, -1, 53, -1, 280, -1, 282, 283, 284, -1,
- 286, -1, -1, -1, -1, 291, 292, 293, 294, -1,
- -1, -1, 298, -1, -1, 301, 302, 303, 304, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 93, 94, 95, 96, 97, 98, -1, -1,
- -1, -1, -1, -1, -1, 106, -1, -1, 109, -1,
- -1, -1, 113, 114, -1, -1, 117, -1, 119, 120,
- -1, -1, -1, 124, 125, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 135, -1, -1, -1, 139, -1,
- 141, 142, 143, 144, -1, -1, -1, -1, -1, -1,
- -1, 152, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 162, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 190,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 202, 203, -1, 205, 206, 207, 208, -1, 210,
- -1, 212, 213, -1, -1, 27, 28, -1, -1, 220,
- 221, 33, -1, -1, -1, -1, -1, -1, -1, 41,
- -1, 232, 233, -1, -1, -1, -1, -1, -1, -1,
- -1, 53, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 258, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 270,
- 271, 272, 273, 274, -1, 276, 277, 278, -1, -1,
- -1, 93, 94, 95, 96, 97, 98, -1, -1, -1,
- -1, -1, -1, -1, 106, -1, -1, 109, -1, -1,
- -1, 113, 114, -1, -1, 117, -1, 119, 120, -1,
- -1, -1, 124, 125, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 135, -1, -1, -1, 139, -1, 141,
- 142, 143, 144, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 162, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 190, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 202, 203, -1, 205, 206, 207, 208, -1, 210, -1,
- 212, 213, -1, -1, -1, -1, -1, -1, 220, 221,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 232, 233, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 258, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 270, 271,
- 272, 273, 274, -1, 276, 277, 278,
+ 269, 270, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 281, -1, 283, 284, 285, 40, 287, -1,
+ 43, -1, 45, 292, 293, 294, 295, -1, -1, -1,
+ 299, -1, -1, 302, 303, 304, 305, -1, -1, -1,
+ -1, 263, 264, -1, -1, -1, 268, 269, 270, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 281,
+ -1, 283, 284, 285, 40, 287, -1, 43, -1, 45,
+ 292, 293, 294, 295, -1, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, 263, 264, -1, -1, -1, 268,
+ 269, 270, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 281, -1, 283, 284, 285, 40, 287, -1,
+ 43, -1, 45, 292, 293, 294, 295, -1, -1, -1,
+ 299, -1, -1, 302, 303, 304, 305, 259, -1, -1,
+ 63, 263, 264, -1, -1, -1, 268, 269, 270, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 281,
+ -1, 283, 284, 285, 40, 287, -1, 43, -1, 45,
+ 292, 293, 294, 295, -1, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, -1, -1, -1, -1, -1, -1,
+ -1, 259, -1, -1, -1, 263, 264, -1, -1, -1,
+ 268, 269, 270, -1, -1, -1, -1, 40, -1, -1,
+ 43, -1, 45, 281, -1, 283, 284, 285, -1, 287,
+ -1, -1, -1, -1, 292, 293, 294, 295, -1, -1,
+ -1, 299, -1, -1, 302, 303, 304, 305, -1, -1,
+ -1, -1, -1, -1, -1, -1, 259, -1, -1, -1,
+ 263, 264, -1, -1, -1, 268, 269, 270, 40, -1,
+ -1, 43, -1, 45, -1, -1, -1, -1, 281, -1,
+ 283, 284, 285, -1, 287, -1, -1, -1, -1, 292,
+ 293, 294, 295, -1, -1, -1, 299, -1, -1, 302,
+ 303, 304, 305, 259, -1, -1, -1, 263, 264, -1,
+ -1, -1, 268, 269, 270, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 281, -1, 283, 284, 285,
+ -1, 287, -1, -1, -1, -1, 292, 293, 294, 295,
+ -1, -1, -1, 299, -1, -1, 302, 303, 304, 305,
+ 263, 264, -1, -1, -1, 268, 269, 270, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 281, -1,
+ 283, 284, 285, -1, 287, -1, -1, -1, -1, 292,
+ 293, 294, 295, -1, -1, -1, 299, -1, -1, 302,
+ 303, 304, 305, 259, -1, -1, -1, 263, 264, -1,
+ -1, -1, 268, 269, 270, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 281, -1, 283, 284, 285,
+ -1, 287, -1, -1, -1, -1, 292, 293, 294, 295,
+ -1, -1, -1, 299, -1, -1, 302, 303, 304, 305,
+ 263, 264, -1, -1, -1, 268, 269, 270, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 281, -1,
+ 283, 284, 285, -1, 287, -1, -1, -1, -1, 292,
+ 293, 294, 295, -1, -1, -1, 299, -1, -1, 302,
+ 303, 304, 305, -1, -1, -1, -1, 28, 29, -1,
+ -1, 263, 264, 34, -1, -1, 268, 269, 270, -1,
+ -1, 42, -1, -1, -1, -1, -1, -1, -1, 281,
+ -1, 283, 284, 285, -1, 287, -1, -1, -1, -1,
+ 292, 293, 294, 295, -1, -1, -1, 299, -1, -1,
+ 302, 303, 304, 305, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 92, 93, 94, 95, 96, 97, -1, -1, -1,
+ -1, -1, -1, 104, -1, -1, -1, -1, 109, -1,
+ -1, 112, 113, -1, -1, 116, -1, 118, 119, -1,
+ -1, -1, 123, 124, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 134, -1, -1, -1, 138, -1, 140,
+ 141, 142, 143, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 154, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 164, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 192, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 208, 209, 210,
+ 211, -1, 213, -1, 215, 216, -1, -1, -1, -1,
+ -1, -1, 223, 224, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 235, 236, 237, 238, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 263, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 275, 276, 277, 278, 279, -1,
+ 281, 282, 283,
};
#define YYFINAL 1
#ifndef YYDEBUG
#define YYDEBUG 0
#endif
-#define YYMAXTOKEN 304
+#define YYMAXTOKEN 305
#if YYDEBUG
char *yyname[] = {
"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -1824,11 +1894,11 @@ char *yyname[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"BEGIN","END","REGEX","SEMINEW",
-"NEWLINE","COMMENT","FUN1","FUNN","GRGR","PRINT","PRINTF","SPRINTF","SPLIT",
-"IF","ELSE","WHILE","FOR","IN","EXIT","NEXT","BREAK","CONTINUE","RET","GETLINE",
-"DO","SUB","GSUB","MATCH","FUNCTION","USERFUN","DELETE","ASGNOP","OROR",
-"ANDAND","NUMBER","VAR","SUBSTR","INDEX","MATCHOP","RELOP","OR","STRING",
-"UMINUS","NOT","INCR","DECR","FIELD","VFIELD",
+"NEWLINE","COMMENT","FUN1","FUNN","GRGR","PRINT","PRINTF","SPRINTF_OLD",
+"SPRINTF_NEW","SPLIT","IF","ELSE","WHILE","FOR","IN","EXIT","NEXT","BREAK",
+"CONTINUE","RET","GETLINE","DO","SUB","GSUB","MATCH","FUNCTION","USERFUN",
+"DELETE","ASGNOP","OROR","ANDAND","NUMBER","VAR","SUBSTR","INDEX","MATCHOP",
+"RELOP","OR","STRING","UMINUS","NOT","INCR","DECR","FIELD","VFIELD",
};
char *yyrule[] = {
"$accept : program",
@@ -1868,6 +1938,8 @@ char *yyrule[] = {
"expr : expr term",
"expr : expr '?' expr ':' expr",
"expr : variable ASGNOP cond",
+"sprintf : SPRINTF_NEW",
+"sprintf : SPRINTF_OLD",
"term : variable",
"term : NUMBER",
"term : STRING",
@@ -1896,7 +1968,8 @@ char *yyrule[] = {
"term : FUN1 '(' expr ')'",
"term : FUNN '(' expr_list ')'",
"term : USERFUN '(' expr_list ')'",
-"term : SPRINTF expr_list",
+"term : SPRINTF_NEW '(' expr_list ')'",
+"term : sprintf expr_list",
"term : SUBSTR '(' expr ',' expr ',' expr ')'",
"term : SUBSTR '(' expr ',' expr ')'",
"term : SPLIT '(' expr ',' VAR ',' expr ')'",
@@ -1999,12 +2072,12 @@ YYSTYPE yylval;
short yyss[YYSTACKSIZE];
YYSTYPE yyvs[YYSTACKSIZE];
#define yystacksize YYSTACKSIZE
-#line 396 "a2p.y"
+#line 401 "a2p.y"
-int yyparse _((void));
+int yyparse (void);
#include "a2py.c"
-#line 2008 "y.tab.c"
+#line 2081 "y.tab.c"
#define YYABORT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
@@ -2017,7 +2090,6 @@ yyparse()
#ifndef __cplusplus
extern char *getenv();
#endif
-
if (yys = getenv("YYDEBUG"))
{
yyn = *yys;
@@ -2272,407 +2344,411 @@ case 36:
lval_field = TRUE;
}
break;
-case 37:
-#line 148 "a2p.y"
+case 39:
+#line 151 "a2p.y"
{ yyval = yyvsp[0]; }
break;
-case 38:
-#line 150 "a2p.y"
+case 40:
+#line 153 "a2p.y"
{ yyval = oper1(ONUM,yyvsp[0]); }
break;
-case 39:
-#line 152 "a2p.y"
+case 41:
+#line 155 "a2p.y"
{ yyval = oper1(OSTR,yyvsp[0]); }
break;
-case 40:
-#line 154 "a2p.y"
+case 42:
+#line 157 "a2p.y"
{ yyval = oper2(OADD,yyvsp[-2],yyvsp[0]); }
break;
-case 41:
-#line 156 "a2p.y"
+case 43:
+#line 159 "a2p.y"
{ yyval = oper2(OSUBTRACT,yyvsp[-2],yyvsp[0]); }
break;
-case 42:
-#line 158 "a2p.y"
+case 44:
+#line 161 "a2p.y"
{ yyval = oper2(OMULT,yyvsp[-2],yyvsp[0]); }
break;
-case 43:
-#line 160 "a2p.y"
+case 45:
+#line 163 "a2p.y"
{ yyval = oper2(ODIV,yyvsp[-2],yyvsp[0]); }
break;
-case 44:
-#line 162 "a2p.y"
+case 46:
+#line 165 "a2p.y"
{ yyval = oper2(OMOD,yyvsp[-2],yyvsp[0]); }
break;
-case 45:
-#line 164 "a2p.y"
+case 47:
+#line 167 "a2p.y"
{ yyval = oper2(OPOW,yyvsp[-2],yyvsp[0]); }
break;
-case 46:
-#line 166 "a2p.y"
+case 48:
+#line 169 "a2p.y"
{ yyval = oper2(ODEFINED,aryrefarg(yyvsp[0]),yyvsp[-2]); }
break;
-case 47:
-#line 168 "a2p.y"
+case 49:
+#line 171 "a2p.y"
{ yyval = oper1(OPOSTINCR,yyvsp[-1]); }
break;
-case 48:
-#line 170 "a2p.y"
+case 50:
+#line 173 "a2p.y"
{ yyval = oper1(OPOSTDECR,yyvsp[-1]); }
break;
-case 49:
-#line 172 "a2p.y"
+case 51:
+#line 175 "a2p.y"
{ yyval = oper1(OPREINCR,yyvsp[0]); }
break;
-case 50:
-#line 174 "a2p.y"
+case 52:
+#line 177 "a2p.y"
{ yyval = oper1(OPREDECR,yyvsp[0]); }
break;
-case 51:
-#line 176 "a2p.y"
+case 53:
+#line 179 "a2p.y"
{ yyval = oper1(OUMINUS,yyvsp[0]); }
break;
-case 52:
-#line 178 "a2p.y"
+case 54:
+#line 181 "a2p.y"
{ yyval = oper1(OUPLUS,yyvsp[0]); }
break;
-case 53:
-#line 180 "a2p.y"
+case 55:
+#line 183 "a2p.y"
{ yyval = oper1(OPAREN,yyvsp[-1]); }
break;
-case 54:
-#line 182 "a2p.y"
+case 56:
+#line 185 "a2p.y"
{ yyval = oper0(OGETLINE); }
break;
-case 55:
-#line 184 "a2p.y"
+case 57:
+#line 187 "a2p.y"
{ yyval = oper1(OGETLINE,yyvsp[0]); }
break;
-case 56:
-#line 186 "a2p.y"
+case 58:
+#line 189 "a2p.y"
{ yyval = oper3(OGETLINE,Nullop,string("<",1),yyvsp[0]);
if (ops[yyvsp[0]].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
break;
-case 57:
-#line 189 "a2p.y"
+case 59:
+#line 192 "a2p.y"
{ yyval = oper3(OGETLINE,yyvsp[-2],string("<",1),yyvsp[0]);
if (ops[yyvsp[0]].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
break;
-case 58:
-#line 192 "a2p.y"
+case 60:
+#line 195 "a2p.y"
{ yyval = oper3(OGETLINE,Nullop,string("|",1),yyvsp[-2]);
if (ops[yyvsp[-2]].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
break;
-case 59:
-#line 195 "a2p.y"
+case 61:
+#line 198 "a2p.y"
{ yyval = oper3(OGETLINE,yyvsp[0],string("|",1),yyvsp[-3]);
if (ops[yyvsp[-3]].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
break;
-case 60:
-#line 198 "a2p.y"
+case 62:
+#line 201 "a2p.y"
{ yyval = oper0(yyvsp[0]); need_entire = do_chop = TRUE; }
break;
-case 61:
-#line 200 "a2p.y"
+case 63:
+#line 203 "a2p.y"
{ yyval = oper1(yyvsp[-2],Nullop); need_entire = do_chop = TRUE; }
break;
-case 62:
-#line 202 "a2p.y"
+case 64:
+#line 205 "a2p.y"
{ yyval = oper1(yyvsp[-3],yyvsp[-1]); }
break;
-case 63:
-#line 204 "a2p.y"
+case 65:
+#line 207 "a2p.y"
{ yyval = oper1(yyvsp[-3],yyvsp[-1]); }
break;
-case 64:
-#line 206 "a2p.y"
+case 66:
+#line 209 "a2p.y"
{ yyval = oper2(OUSERFUN,yyvsp[-3],yyvsp[-1]); }
break;
-case 65:
-#line 208 "a2p.y"
+case 67:
+#line 211 "a2p.y"
+{ yyval = oper1(OSPRINTF,yyvsp[-1]); }
+break;
+case 68:
+#line 213 "a2p.y"
{ yyval = oper1(OSPRINTF,yyvsp[0]); }
break;
-case 66:
-#line 210 "a2p.y"
+case 69:
+#line 215 "a2p.y"
{ yyval = oper3(OSUBSTR,yyvsp[-5],yyvsp[-3],yyvsp[-1]); }
break;
-case 67:
-#line 212 "a2p.y"
+case 70:
+#line 217 "a2p.y"
{ yyval = oper2(OSUBSTR,yyvsp[-3],yyvsp[-1]); }
break;
-case 68:
-#line 214 "a2p.y"
+case 71:
+#line 219 "a2p.y"
{ yyval = oper3(OSPLIT,yyvsp[-5],aryrefarg(numary(yyvsp[-3])),yyvsp[-1]); }
break;
-case 69:
-#line 216 "a2p.y"
+case 72:
+#line 221 "a2p.y"
{ yyval = oper3(OSPLIT,yyvsp[-5],aryrefarg(numary(yyvsp[-3])),oper1(OREGEX,yyvsp[-1]));}
break;
-case 70:
-#line 218 "a2p.y"
+case 73:
+#line 223 "a2p.y"
{ yyval = oper2(OSPLIT,yyvsp[-3],aryrefarg(numary(yyvsp[-1]))); }
break;
-case 71:
-#line 220 "a2p.y"
+case 74:
+#line 225 "a2p.y"
{ yyval = oper2(OINDEX,yyvsp[-3],yyvsp[-1]); }
break;
-case 72:
-#line 222 "a2p.y"
+case 75:
+#line 227 "a2p.y"
{ yyval = oper2(OMATCH,yyvsp[-3],oper1(OREGEX,yyvsp[-1])); }
break;
-case 73:
-#line 224 "a2p.y"
+case 76:
+#line 229 "a2p.y"
{ yyval = oper2(OMATCH,yyvsp[-3],yyvsp[-1]); }
break;
-case 74:
-#line 226 "a2p.y"
+case 77:
+#line 231 "a2p.y"
{ yyval = oper2(OSUB,yyvsp[-3],yyvsp[-1]); }
break;
-case 75:
-#line 228 "a2p.y"
+case 78:
+#line 233 "a2p.y"
{ yyval = oper2(OSUB,oper1(OREGEX,yyvsp[-3]),yyvsp[-1]); }
break;
-case 76:
-#line 230 "a2p.y"
+case 79:
+#line 235 "a2p.y"
{ yyval = oper2(OGSUB,yyvsp[-3],yyvsp[-1]); }
break;
-case 77:
-#line 232 "a2p.y"
+case 80:
+#line 237 "a2p.y"
{ yyval = oper2(OGSUB,oper1(OREGEX,yyvsp[-3]),yyvsp[-1]); }
break;
-case 78:
-#line 234 "a2p.y"
+case 81:
+#line 239 "a2p.y"
{ yyval = oper3(OSUB,yyvsp[-5],yyvsp[-3],yyvsp[-1]); }
break;
-case 79:
-#line 236 "a2p.y"
+case 82:
+#line 241 "a2p.y"
{ yyval = oper3(OSUB,oper1(OREGEX,yyvsp[-5]),yyvsp[-3],yyvsp[-1]); }
break;
-case 80:
-#line 238 "a2p.y"
+case 83:
+#line 243 "a2p.y"
{ yyval = oper3(OGSUB,yyvsp[-5],yyvsp[-3],yyvsp[-1]); }
break;
-case 81:
-#line 240 "a2p.y"
+case 84:
+#line 245 "a2p.y"
{ yyval = oper3(OGSUB,oper1(OREGEX,yyvsp[-5]),yyvsp[-3],yyvsp[-1]); }
break;
-case 82:
-#line 244 "a2p.y"
+case 85:
+#line 249 "a2p.y"
{ yyval = oper1(OVAR,yyvsp[0]); }
break;
-case 83:
-#line 246 "a2p.y"
+case 86:
+#line 251 "a2p.y"
{ yyval = oper2(OVAR,aryrefarg(yyvsp[-3]),yyvsp[-1]); }
break;
-case 84:
-#line 248 "a2p.y"
+case 87:
+#line 253 "a2p.y"
{ yyval = oper1(OFLD,yyvsp[0]); }
break;
-case 85:
-#line 250 "a2p.y"
+case 88:
+#line 255 "a2p.y"
{ yyval = oper1(OVFLD,yyvsp[0]); }
break;
-case 88:
-#line 257 "a2p.y"
+case 91:
+#line 262 "a2p.y"
{ yyval = Nullop; }
break;
-case 89:
-#line 261 "a2p.y"
+case 92:
+#line 266 "a2p.y"
{ yyval = oper3(OCOMMA,yyvsp[-3],yyvsp[-1],yyvsp[0]); }
break;
-case 90:
-#line 263 "a2p.y"
+case 93:
+#line 268 "a2p.y"
{ yyval = oper3(OCOMMA,yyvsp[-3],yyvsp[-1],yyvsp[0]); }
break;
-case 91:
-#line 265 "a2p.y"
+case 94:
+#line 270 "a2p.y"
{ yyval = yyvsp[-1]; }
break;
-case 92:
-#line 269 "a2p.y"
+case 95:
+#line 274 "a2p.y"
{ yyval = oper2(OJUNK,yyvsp[-1],yyvsp[0]); }
break;
-case 93:
-#line 271 "a2p.y"
+case 96:
+#line 276 "a2p.y"
{ yyval = Nullop; }
break;
-case 94:
-#line 275 "a2p.y"
+case 97:
+#line 280 "a2p.y"
{ yyval = oper2(OJUNK,oper0(OSEMICOLON),oper0(ONEWLINE)); }
break;
-case 95:
-#line 277 "a2p.y"
+case 98:
+#line 282 "a2p.y"
{ yyval = oper2(OJUNK,oper0(OSEMICOLON),oper0(ONEWLINE)); }
break;
-case 96:
-#line 279 "a2p.y"
+case 99:
+#line 284 "a2p.y"
{ yyval = oper0(ONEWLINE); }
break;
-case 97:
-#line 281 "a2p.y"
+case 100:
+#line 286 "a2p.y"
{ yyval = oper1(OCOMMENT,yyvsp[0]); }
break;
-case 98:
-#line 285 "a2p.y"
+case 101:
+#line 290 "a2p.y"
{ yyval = oper2(OJUNK,yyvsp[-1],yyvsp[0]); }
break;
-case 99:
-#line 287 "a2p.y"
+case 102:
+#line 292 "a2p.y"
{ yyval = Nullop; }
break;
-case 100:
-#line 291 "a2p.y"
+case 103:
+#line 296 "a2p.y"
{ yyval = oper0(ONEWLINE); }
break;
-case 101:
-#line 293 "a2p.y"
+case 104:
+#line 298 "a2p.y"
{ yyval = oper1(OCOMMENT,yyvsp[0]); }
break;
-case 102:
-#line 298 "a2p.y"
+case 105:
+#line 303 "a2p.y"
{ yyval = oper2(OJUNK,oper0(OSEMICOLON),yyvsp[0]); }
break;
-case 103:
-#line 300 "a2p.y"
+case 106:
+#line 305 "a2p.y"
{ yyval = oper2(OJUNK,oper0(OSNEWLINE),yyvsp[0]); }
break;
-case 104:
-#line 302 "a2p.y"
+case 107:
+#line 307 "a2p.y"
{ yyval = oper2(OJUNK,oper0(OSNEWLINE),yyvsp[0]); }
break;
-case 105:
-#line 304 "a2p.y"
+case 108:
+#line 309 "a2p.y"
{ yyval = oper2(OJUNK,oper1(OSCOMMENT,yyvsp[-1]),yyvsp[0]); }
break;
-case 106:
-#line 308 "a2p.y"
+case 109:
+#line 313 "a2p.y"
{ yyval = oper2(OSTATES,yyvsp[-1],yyvsp[0]); }
break;
-case 107:
-#line 310 "a2p.y"
+case 110:
+#line 315 "a2p.y"
{ yyval = Nullop; }
break;
-case 108:
-#line 315 "a2p.y"
+case 111:
+#line 320 "a2p.y"
{ yyval = oper2(OJUNK,oper2(OSTATE,yyvsp[-2],yyvsp[-1]),yyvsp[0]); }
break;
-case 109:
-#line 317 "a2p.y"
+case 112:
+#line 322 "a2p.y"
{ yyval = oper2(OSTATE,Nullop,oper2(OJUNK,oper0(OSEMICOLON),yyvsp[0])); }
break;
-case 110:
-#line 319 "a2p.y"
+case 113:
+#line 324 "a2p.y"
{ yyval = oper2(OSTATE,Nullop,oper2(OJUNK,oper0(OSNEWLINE),yyvsp[0])); }
break;
-case 113:
-#line 325 "a2p.y"
+case 116:
+#line 330 "a2p.y"
{ yyval = Nullop; }
break;
-case 115:
-#line 331 "a2p.y"
+case 118:
+#line 336 "a2p.y"
{ yyval = oper3(OPRINT,yyvsp[-2],yyvsp[-1],yyvsp[0]);
do_opens = TRUE;
saw_ORS = saw_OFS = TRUE;
if (!yyvsp[-2]) need_entire = TRUE;
if (ops[yyvsp[0]].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
break;
-case 116:
-#line 337 "a2p.y"
+case 119:
+#line 342 "a2p.y"
{ yyval = oper1(OPRINT,yyvsp[0]);
if (!yyvsp[0]) need_entire = TRUE;
saw_ORS = saw_OFS = TRUE;
}
break;
-case 117:
-#line 342 "a2p.y"
+case 120:
+#line 347 "a2p.y"
{ yyval = oper3(OPRINTF,yyvsp[-2],yyvsp[-1],yyvsp[0]);
do_opens = TRUE;
if (!yyvsp[-2]) need_entire = TRUE;
if (ops[yyvsp[0]].ival != OSTR + (1<<8)) do_fancy_opens = TRUE; }
break;
-case 118:
-#line 347 "a2p.y"
+case 121:
+#line 352 "a2p.y"
{ yyval = oper1(OPRINTF,yyvsp[0]);
if (!yyvsp[0]) need_entire = TRUE;
}
break;
-case 119:
-#line 351 "a2p.y"
+case 122:
+#line 356 "a2p.y"
{ yyval = oper0(OBREAK); }
break;
-case 120:
-#line 353 "a2p.y"
+case 123:
+#line 358 "a2p.y"
{ yyval = oper0(ONEXT); }
break;
-case 121:
-#line 355 "a2p.y"
+case 124:
+#line 360 "a2p.y"
{ yyval = oper0(OEXIT); }
break;
-case 122:
-#line 357 "a2p.y"
+case 125:
+#line 362 "a2p.y"
{ yyval = oper1(OEXIT,yyvsp[0]); }
break;
-case 123:
-#line 359 "a2p.y"
+case 126:
+#line 364 "a2p.y"
{ yyval = oper0(OCONTINUE); }
break;
-case 124:
-#line 361 "a2p.y"
+case 127:
+#line 366 "a2p.y"
{ yyval = oper0(ORETURN); }
break;
-case 125:
-#line 363 "a2p.y"
+case 128:
+#line 368 "a2p.y"
{ yyval = oper1(ORETURN,yyvsp[0]); }
break;
-case 126:
-#line 365 "a2p.y"
+case 129:
+#line 370 "a2p.y"
{ yyval = oper2(ODELETE,aryrefarg(yyvsp[-3]),yyvsp[-1]); }
break;
-case 127:
-#line 369 "a2p.y"
+case 130:
+#line 374 "a2p.y"
{ yyval = oper1(OREDIR,string(">",1)); }
break;
-case 128:
-#line 371 "a2p.y"
+case 131:
+#line 376 "a2p.y"
{ yyval = oper1(OREDIR,string(">>",2)); }
break;
-case 129:
-#line 373 "a2p.y"
+case 132:
+#line 378 "a2p.y"
{ yyval = oper1(OREDIR,string("|",1)); }
break;
-case 130:
-#line 378 "a2p.y"
+case 133:
+#line 383 "a2p.y"
{ yyval = oper2(OIF,yyvsp[-3],bl(yyvsp[0],yyvsp[-1])); }
break;
-case 131:
-#line 380 "a2p.y"
+case 134:
+#line 385 "a2p.y"
{ yyval = oper3(OIF,yyvsp[-6],bl(yyvsp[-3],yyvsp[-4]),bl(yyvsp[0],yyvsp[-1])); }
break;
-case 132:
-#line 382 "a2p.y"
+case 135:
+#line 387 "a2p.y"
{ yyval = oper2(OWHILE,yyvsp[-3],bl(yyvsp[0],yyvsp[-1])); }
break;
-case 133:
-#line 384 "a2p.y"
+case 136:
+#line 389 "a2p.y"
{ yyval = oper2(ODO,bl(yyvsp[-4],yyvsp[-5]),yyvsp[-1]); }
break;
-case 134:
-#line 386 "a2p.y"
+case 137:
+#line 391 "a2p.y"
{ yyval = oper4(OFOR,yyvsp[-7],yyvsp[-5],yyvsp[-3],bl(yyvsp[0],yyvsp[-1])); }
break;
-case 135:
-#line 388 "a2p.y"
+case 138:
+#line 393 "a2p.y"
{ yyval = oper4(OFOR,yyvsp[-6],string("",0),yyvsp[-3],bl(yyvsp[0],yyvsp[-1])); }
break;
-case 136:
-#line 390 "a2p.y"
+case 139:
+#line 395 "a2p.y"
{ yyval = oper2(OFORIN,yyvsp[-3],bl(yyvsp[0],yyvsp[-1])); }
break;
-case 137:
-#line 392 "a2p.y"
+case 140:
+#line 397 "a2p.y"
{ yyval = oper3(OBLOCK,oper2(OJUNK,yyvsp[-3],yyvsp[-2]),Nullop,yyvsp[0]); }
break;
-#line 2674 "y.tab.c"
+#line 2751 "y.tab.c"
}
yyssp -= yym;
yystate = *yyssp;
diff --git a/contrib/perl5/x2p/a2p.h b/contrib/perl5/x2p/a2p.h
index 8053046..3b0338c 100644
--- a/contrib/perl5/x2p/a2p.h
+++ b/contrib/perl5/x2p/a2p.h
@@ -73,13 +73,11 @@
#define MEM_SIZE Size_t
-#ifdef STANDARD_C
-# include <stdlib.h>
-#else
- Malloc_t malloc _((MEM_SIZE nbytes));
- Malloc_t calloc _((MEM_SIZE elements, MEM_SIZE size));
- Malloc_t realloc _((Malloc_t where, MEM_SIZE nbytes));
- Free_t free _((Malloc_t where));
+#ifndef STANDARD_C
+ Malloc_t malloc (MEM_SIZE nbytes);
+ Malloc_t calloc (MEM_SIZE elements, MEM_SIZE size);
+ Malloc_t realloc (Malloc_t where, MEM_SIZE nbytes);
+ Free_t free (Malloc_t where);
#endif
#if defined(I_STRING) || defined(__cplusplus)
@@ -138,8 +136,13 @@
/* All of these are in stdlib.h or time.h for ANSI C */
Time_t time();
struct tm *gmtime(), *localtime();
+#if defined(OEMVS) || defined(__OPEN_VM)
+char *(strchr)(), *(strrchr)();
+char *(strcpy)(), *(strcat)();
+#else
char *strchr(), *strrchr();
char *strcpy(), *strcat();
+#endif
#endif /* ! STANDARD_C */
#ifdef VMS
@@ -374,27 +377,27 @@ EXT STR *Str;
#define GROWSTR(pp,lp,len) if (*(lp) < (len)) growstr(pp,lp,len)
/* Prototypes for things in a2p.c */
-int aryrefarg _(( int arg ));
-int bl _(( int arg, int maybe ));
-void dump _(( int branch ));
-int fixfargs _(( int name, int arg, int prevargs ));
-int fixrargs _(( char *name, int arg, int prevargs ));
-void fixup _(( STR *str ));
-int numary _(( int arg ));
-int oper0 _(( int type ));
-int oper1 _(( int type, int arg1 ));
-int oper2 _(( int type, int arg1, int arg2 ));
-int oper3 _(( int type, int arg1, int arg2, int arg3 ));
-int oper4 _(( int type, int arg1, int arg2, int arg3, int arg4 ));
-int oper5 _(( int type, int arg1, int arg2, int arg3, int arg4, int arg5 ));
-void putlines _(( STR *str ));
-void putone _(( void ));
-int rememberargs _(( int arg ));
-char * scannum _(( char *s ));
-char * scanpat _(( char *s ));
-int string _(( char *ptr, int len ));
-void yyerror _(( char *s ));
-int yylex _(( void ));
+int aryrefarg ( int arg );
+int bl ( int arg, int maybe );
+void dump ( int branch );
+int fixfargs ( int name, int arg, int prevargs );
+int fixrargs ( char *name, int arg, int prevargs );
+void fixup ( STR *str );
+int numary ( int arg );
+int oper0 ( int type );
+int oper1 ( int type, int arg1 );
+int oper2 ( int type, int arg1, int arg2 );
+int oper3 ( int type, int arg1, int arg2, int arg3 );
+int oper4 ( int type, int arg1, int arg2, int arg3, int arg4 );
+int oper5 ( int type, int arg1, int arg2, int arg3, int arg4, int arg5 );
+void putlines ( STR *str );
+void putone ( void );
+int rememberargs ( int arg );
+char * scannum ( char *s );
+char * scanpat ( char *s );
+int string ( char *ptr, int len );
+void yyerror ( char *s );
+int yylex ( void );
EXT int line INIT(0);
diff --git a/contrib/perl5/x2p/a2p.pod b/contrib/perl5/x2p/a2p.pod
index fa726fb..f6395a4 100644
--- a/contrib/perl5/x2p/a2p.pod
+++ b/contrib/perl5/x2p/a2p.pod
@@ -43,10 +43,25 @@ causes a2p to assume that input will always have that many fields.
=item B<-o>
-tells a2p to use old awk behavior. For now, the only difference is
-that old awk always has a line loop, even if there are no line
+tells a2p to use old awk behavior. The only current differences are:
+
+=over 5
+
+=item
+
+Old awk always has a line loop, even if there are no line
actions, whereas new awk does not.
+=item
+
+In old awk, sprintf is extremely greedy about its arguments.
+For example, given the statement
+
+ print sprintf(some_args), extra_args;
+
+old awk considers I<extra_args> to be arguments to C<sprintf>; new awk
+considers them arguments to C<print>.
+
=back
=head2 "Considerations"
diff --git a/contrib/perl5/x2p/a2p.y b/contrib/perl5/x2p/a2p.y
index 2d3f239..da9b628 100644
--- a/contrib/perl5/x2p/a2p.y
+++ b/contrib/perl5/x2p/a2p.y
@@ -21,7 +21,7 @@ int ends = Nullop;
%token REGEX
%token SEMINEW NEWLINE COMMENT
%token FUN1 FUNN GRGR
-%token PRINT PRINTF SPRINTF SPLIT
+%token PRINT PRINTF SPRINTF_OLD SPRINTF_NEW SPLIT
%token IF ELSE WHILE FOR IN
%token EXIT NEXT BREAK CONTINUE RET
%token GETLINE DO SUB GSUB MATCH
@@ -144,6 +144,9 @@ expr : term
}
;
+sprintf : SPRINTF_NEW
+ | SPRINTF_OLD ;
+
term : variable
{ $$ = $1; }
| NUMBER
@@ -204,7 +207,9 @@ term : variable
{ $$ = oper1($1,$3); }
| USERFUN '(' expr_list ')'
{ $$ = oper2(OUSERFUN,$1,$3); }
- | SPRINTF expr_list
+ | SPRINTF_NEW '(' expr_list ')'
+ { $$ = oper1(OSPRINTF,$3); }
+ | sprintf expr_list
{ $$ = oper1(OSPRINTF,$2); }
| SUBSTR '(' expr ',' expr ',' expr ')'
{ $$ = oper3(OSUBSTR,$3,$5,$7); }
@@ -394,6 +399,6 @@ compound
%%
-int yyparse _((void));
+int yyparse (void);
#include "a2py.c"
diff --git a/contrib/perl5/x2p/a2py.c b/contrib/perl5/x2p/a2py.c
index 8a6155f..3976c86 100644
--- a/contrib/perl5/x2p/a2py.c
+++ b/contrib/perl5/x2p/a2py.c
@@ -35,7 +35,7 @@ static void usage(void);
static void
usage()
{
- printf("\nThis is the AWK to PERL translator, version 5.0, patchlevel %d\n", PATCHLEVEL);
+ printf("\nThis is the AWK to PERL translator, revision %d.0, version %d\n", PERL_REVISION, PERL_VERSION);
printf("\nUsage: %s [-D<number>] [-F<char>] [-n<fieldlist>] [-<number>] filename\n", myname);
printf("\n -D<number> sets debugging flags."
"\n -F<character> the awk script to translate is always invoked with"
@@ -705,8 +705,15 @@ yylex(void)
}
if (strEQ(d,"sub"))
XTERM(SUB);
- if (strEQ(d,"sprintf"))
- XTERM(SPRINTF);
+ if (strEQ(d,"sprintf")) {
+ /* In old awk, { print sprintf("str%sg"),"in" } prints
+ * "string"; in new awk, "in" is not considered an argument to
+ * sprintf, so the statement breaks. To support both, the
+ * grammar treats arguments to SPRINTF_OLD like old awk,
+ * SPRINTF_NEW like new. Here we return the appropriate one.
+ */
+ XTERM(old_awk ? SPRINTF_OLD : SPRINTF_NEW);
+ }
if (strEQ(d,"sqrt")) {
yylval = OSQRT;
XTERM(FUN1);
diff --git a/contrib/perl5/x2p/cflags.SH b/contrib/perl5/x2p/cflags.SH
index 62bd11c..b5ef917 100755
--- a/contrib/perl5/x2p/cflags.SH
+++ b/contrib/perl5/x2p/cflags.SH
@@ -1,4 +1,4 @@
-case $CONFIG in
+case $CONFIGDOTSH in
'')
if test -f config.sh; then TOP=.;
elif test -f ../config.sh; then TOP=..;
@@ -57,7 +57,7 @@ case $# in
0) set *.c; echo "The current C flags are:" ;;
esac
-set `echo "$* " | sed -e 's/\.[oc] / /g' -e 's/\.obj / /g'`
+set `echo "$* " | sed -e 's/\.[oc] / /g' -e 's/\.obj / /g' -e "s/\\$obj_ext / /g"`
for file do
diff --git a/contrib/perl5/x2p/find2perl.PL b/contrib/perl5/x2p/find2perl.PL
index f82b660..25d0135 100644
--- a/contrib/perl5/x2p/find2perl.PL
+++ b/contrib/perl5/x2p/find2perl.PL
@@ -29,539 +29,602 @@ print OUT <<"!GROK!THIS!";
$Config{startperl}
eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
if \$running_under_some_shell;
-\$startperl = "$Config{startperl}";
-\$perlpath = "$Config{perlpath}";
+my \$perlpath = "$Config{perlpath}";
!GROK!THIS!
# In the following, perl variables are not expanded during extraction.
print OUT <<'!NO!SUBS!';
+use strict;
+use vars qw/$statdone/;
+my $startperl = "#! $perlpath -w";
-#
+#
# Modified September 26, 1993 to provide proper handling of years after 1999
# Tom Link <tml+@pitt.edu>
# University of Pittsburgh
-#
+#
# Modified April 7, 1998 with nasty hacks to implement the troublesome -follow
# Billy Constantine <wdconsta@cs.adelaide.edu.au> <billy@smug.adelaide.edu.au>
# University of Adelaide, Adelaide, South Australia
-#
+#
+# Modified 1999-06-10, 1999-07-07 to migrate to cleaner perl5 usage
+# Ken Pizzini <ken@halcyon.com>
+#
+# Modified 2000-01-28 to use the 'follow' option of File::Find
+my @roots = ();
while ($ARGV[0] =~ /^[^-!(]/) {
push(@roots, shift);
}
@roots = ('.') unless @roots;
-for (@roots) { $_ = &quote($_); }
-$roots = join(',', @roots);
-
-$indent = 1;
-$stat = 'lstat';
-$decl = '';
+for (@roots) { $_ = &quote($_) }
+my $roots = join(', ', @roots);
+
+my $find = "find";
+my $indent_depth = 1;
+my $stat = 'lstat';
+my $decl = '';
+my $flushall = '';
+my $initfile = '';
+my $initnewer = '';
+my $out = '';
+my %init = ();
+my ($follow_in_effect,$Skip_And) = (0,0);
while (@ARGV) {
$_ = shift;
s/^-// || /^[()!]/ || die "Unrecognized switch: $_\n";
if ($_ eq '(') {
- $out .= &tab . "(\n";
- $indent++;
- next;
- }
- elsif ($_ eq ')') {
- $indent--;
- $out .= &tab . ")";
- }
- elsif ($_ eq 'follow') {
- $stat = 'stat';
- $decl = '%already_seen = ();';
- $out .= &tab . '(not $already_seen{"$dev,$ino"}) &&';
- $out .= "\n" . &tab . '(($already_seen{"$dev,$ino"} = !(-d _)) || 1)';
- }
- elsif ($_ eq '!') {
- $out .= &tab . "!";
- next;
- }
- elsif ($_ eq 'name') {
- $out .= &tab;
- $pat = &fileglob_to_re(shift);
- $out .= '/' . $pat . "/";
- }
- elsif ($_ eq 'perm') {
- $onum = shift;
- die "Malformed -perm argument: $onum\n" unless $onum =~ /^-?[0-7]+$/;
- if ($onum =~ s/^-//) {
- $onum = '0' . sprintf("%o", oct($onum) & 017777); # s/b 07777 ?
- $out .= &tab . "((\$mode & $onum) == $onum)";
- }
- else {
- $onum = '0' . $onum unless $onum =~ /^0/;
- $out .= &tab . "((\$mode & 0777) == $onum)";
- }
- }
- elsif ($_ eq 'type') {
- ($filetest = shift) =~ tr/s/S/;
- $out .= &tab . "-$filetest _";
- }
- elsif ($_ eq 'print') {
- $out .= &tab . 'print("$name\n")';
- }
- elsif ($_ eq 'print0') {
- $out .= &tab . 'print("$name\0")';
- }
- elsif ($_ eq 'fstype') {
- $out .= &tab;
- $type = shift;
- if ($type eq 'nfs')
- { $out .= '($dev < 0)'; }
- else
- { $out .= '($dev >= 0)'; }
- }
- elsif ($_ eq 'user') {
- $uname = shift;
- $out .= &tab . "(\$uid == \$uid{'$uname'})";
- $inituser++;
- }
- elsif ($_ eq 'group') {
- $gname = shift;
- $out .= &tab . "(\$gid == \$gid{'$gname'})";
- $initgroup++;
- }
- elsif ($_ eq 'nouser') {
- $out .= &tab . '!defined $uid{$uid}';
- $inituser++;
- }
- elsif ($_ eq 'nogroup') {
- $out .= &tab . '!defined $gid{$gid}';
- $initgroup++;
- }
- elsif ($_ eq 'links') {
- $out .= &tab . '($nlink ' . &n(shift);
- }
- elsif ($_ eq 'inum') {
- $out .= &tab . '($ino ' . &n(shift);
- }
- elsif ($_ eq 'size') {
- $out .= &tab . '(int(((-s _) + 511) / 512) ' . &n(shift);
- }
- elsif ($_ eq 'atime') {
- $out .= &tab . '(int(-A _) ' . &n(shift);
- }
- elsif ($_ eq 'mtime') {
- $out .= &tab . '(int(-M _) ' . &n(shift);
- }
- elsif ($_ eq 'ctime') {
- $out .= &tab . '(int(-C _) ' . &n(shift);
- }
- elsif ($_ eq 'exec') {
- for (@cmd = (); @ARGV && $ARGV[0] ne ';'; push(@cmd,shift)) { }
- shift;
- $_ = "@cmd";
- if (m#^(/bin/)?rm -f {}$#) {
- if (!@ARGV) {
- $out .= &tab . 'unlink($_)';
- }
- else {
- $out .= &tab . '(unlink($_) || 1)';
- }
- }
- elsif (m#^(/bin/)?rm {}$#) {
- $out .= &tab . '(unlink($_) || warn "$name: $!\n")';
- }
- else {
- for (@cmd) { s/'/\\'/g; }
- $" = "','";
- $out .= &tab . "&exec(0, '@cmd')";
- $" = ' ';
- $initexec++;
- }
- }
- elsif ($_ eq 'ok') {
- for (@cmd = (); @ARGV && $ARGV[0] ne ';'; push(@cmd,shift)) { }
- shift;
- for (@cmd) { s/'/\\'/g; }
- $" = "','";
- $out .= &tab . "&exec(1, '@cmd')";
- $" = ' ';
- $initexec++;
- }
- elsif ($_ eq 'prune') {
- $out .= &tab . '($prune = 1)';
- }
- elsif ($_ eq 'xdev') {
- $out .= &tab . '!($prune |= ($dev != $topdev))';
- }
- elsif ($_ eq 'newer') {
- $out .= &tab;
- $file = shift;
- $newername = 'AGE_OF' . $file;
- $newername =~ s/[^\w]/_/g;
- $newername = "\$$newername";
- $out .= "(-M _ < $newername)";
- $initnewer .= "$newername = -M " . &quote($file) . ";\n";
- }
- elsif ($_ eq 'eval') {
- $prog = &quote(shift);
- $out .= &tab . "eval $prog";
- }
- elsif ($_ eq 'depth') {
- $depth++;
- next;
- }
- elsif ($_ eq 'ls') {
- $out .= &tab . "&ls";
- $initls++;
- }
- elsif ($_ eq 'tar') {
- $out .= &tab;
- die "-tar must have a filename argument\n" unless @ARGV;
- $file = shift;
- $fh = 'FH' . $file;
- $fh =~ s/[^\w]/_/g;
- $out .= "&tar($fh)";
- $file = '>' . $file;
- $initfile .= "open($fh, " . &quote($file) .
- qq{) || die "Can't open $fh: \$!\\n";\n};
- $inittar++;
- $flushall = "\n&tflushall;\n";
- }
- elsif (/^n?cpio$/) {
- $depth++;
- $out .= &tab;
- die "-$_ must have a filename argument\n" unless @ARGV;
- $file = shift;
- $fh = 'FH' . $file;
- $fh =~ s/[^\w]/_/g;
- $out .= "&cpio('" . substr($_,0,1) . "', $fh)";
- $file = '>' . $file;
- $initfile .= "open($fh, " . &quote($file) .
- qq{) || die "Can't open $fh: \$!\\n";\n};
- $initcpio++;
- $flushall = "\n&flushall;\n";
- }
- else {
- die "Unrecognized switch: -$_\n";
+ $out .= &tab . "(\n";
+ $indent_depth++;
+ next;
+ } elsif ($_ eq ')') {
+ --$indent_depth;
+ $out .= &tab . ")";
+ } elsif ($_ eq 'follow') {
+ $follow_in_effect= 1;
+ $stat = 'stat';
+ $Skip_And= 1;
+ } elsif ($_ eq '!') {
+ $out .= &tab . "!";
+ next;
+ } elsif ($_ eq 'name') {
+ $out .= &tab . '/' . &fileglob_to_re(shift) . "/s";
+ } elsif ($_ eq 'perm') {
+ my $onum = shift;
+ $onum =~ /^-?[0-7]+$/
+ || die "Malformed -perm argument: $onum\n";
+ $out .= &tab;
+ if ($onum =~ s/^-//) {
+ $onum = sprintf("0%o", oct($onum) & 07777);
+ $out .= "((\$mode & $onum) == $onum)";
+ } else {
+ $onum =~ s/^0*/0/;
+ $out .= "((\$mode & 0777) == $onum)";
+ }
+ } elsif ($_ eq 'type') {
+ (my $filetest = shift) =~ tr/s/S/;
+ $out .= &tab . "-$filetest _";
+ } elsif ($_ eq 'print') {
+ $out .= &tab . 'print("$name\n")';
+ } elsif ($_ eq 'print0') {
+ $out .= &tab . 'print("$name\0")';
+ } elsif ($_ eq 'fstype') {
+ my $type = shift;
+ $out .= &tab;
+ if ($type eq 'nfs') {
+ $out .= '($dev < 0)';
+ } else {
+ $out .= '($dev >= 0)'; #XXX
+ }
+ } elsif ($_ eq 'user') {
+ my $uname = shift;
+ $out .= &tab . "(\$uid == \$uid{'$uname'})";
+ $init{user} = 1;
+ } elsif ($_ eq 'group') {
+ my $gname = shift;
+ $out .= &tab . "(\$gid == \$gid{'$gname'})";
+ $init{group} = 1;
+ } elsif ($_ eq 'nouser') {
+ $out .= &tab . '!exists $uid{$uid}';
+ $init{user} = 1;
+ } elsif ($_ eq 'nogroup') {
+ $out .= &tab . '!exists $gid{$gid}';
+ $init{group} = 1;
+ } elsif ($_ eq 'links') {
+ $out .= &tab . &n('$nlink', shift);
+ } elsif ($_ eq 'inum') {
+ $out .= &tab . &n('$ino', shift);
+ } elsif ($_ eq 'size') {
+ $_ = shift;
+ my $n = 'int(((-s _) + 511) / 512)';
+ if (s/c\z//) {
+ $n = 'int(-s _)';
+ } elsif (s/k\z//) {
+ $n = 'int(((-s _) + 1023) / 1024)';
+ }
+ $out .= &tab . &n($n, $_);
+ } elsif ($_ eq 'atime') {
+ $out .= &tab . &n('int(-A _)', shift);
+ } elsif ($_ eq 'mtime') {
+ $out .= &tab . &n('int(-M _)', shift);
+ } elsif ($_ eq 'ctime') {
+ $out .= &tab . &n('int(-C _)', shift);
+ } elsif ($_ eq 'exec') {
+ my @cmd = ();
+ while (@ARGV && $ARGV[0] ne ';')
+ { push(@cmd, shift) }
+ shift;
+ $out .= &tab;
+ if ($cmd[0] =~m#^(?:(?:/usr)?/bin/)?rm$#
+ && $cmd[$#cmd] eq '{}'
+ && (@cmd == 2 || (@cmd == 3 && $cmd[1] eq '-f'))) {
+ if (@cmd == 2) {
+ $out .= '(unlink($_) || warn "$name: $!\n")';
+ } elsif (!@ARGV) {
+ $out .= 'unlink($_)';
+ } else {
+ $out .= '(unlink($_) || 1)';
+ }
+ } else {
+ for (@cmd)
+ { s/'/\\'/g }
+ { local $" = "','"; $out .= "&doexec(0, '@cmd')"; }
+ $init{doexec} = 1;
+ }
+ } elsif ($_ eq 'ok') {
+ my @cmd = ();
+ while (@ARGV && $ARGV[0] ne ';')
+ { push(@cmd, shift) }
+ shift;
+ $out .= &tab;
+ for (@cmd)
+ { s/'/\\'/g }
+ { local $" = "','"; $out .= "&doexec(0, '@cmd')"; }
+ $init{doexec} = 1;
+ } elsif ($_ eq 'prune') {
+ $out .= &tab . '($File::Find::prune = 1)';
+ } elsif ($_ eq 'xdev') {
+ $out .= &tab . '!($File::Find::prune |= ($dev != $File::Find::topdev))'
+;
+ } elsif ($_ eq 'newer') {
+ my $file = shift;
+ my $newername = 'AGE_OF' . $file;
+ $newername =~ s/\W/_/g;
+ $newername = '$' . $newername;
+ $out .= &tab . "(-M _ < $newername)";
+ $initnewer .= "my $newername = -M " . &quote($file) . ";\n";
+ } elsif ($_ eq 'eval') {
+ my $prog = shift;
+ $prog =~ s/'/\\'/g;
+ $out .= &tab . "eval {$prog}";
+ } elsif ($_ eq 'depth') {
+ $find = 'finddepth';
+ next;
+ } elsif ($_ eq 'ls') {
+ $out .= &tab . "&ls";
+ $init{ls} = 1;
+ } elsif ($_ eq 'tar') {
+ die "-tar must have a filename argument\n" unless @ARGV;
+ my $file = shift;
+ my $fh = 'FH' . $file;
+ $fh =~ s/\W/_/g;
+ $out .= &tab . "&tar(*$fh, \$name)";
+ $flushall .= "&tflushall;\n";
+ $initfile .= "open($fh, " . &quote('> ' . $file) .
+ qq{) || die "Can't open $fh: \$!\\n";\n};
+ $init{tar} = 1;
+ } elsif (/^(n?)cpio\z/) {
+ die "-$_ must have a filename argument\n" unless @ARGV;
+ my $file = shift;
+ my $fh = 'FH' . $file;
+ $fh =~ s/\W/_/g;
+ $out .= &tab . "&cpio(*$fh, \$name, '$1')";
+ $find = 'finddepth';
+ $flushall .= "&cflushall;\n";
+ $initfile .= "open($fh, " . &quote('> ' . $file) .
+ qq{) || die "Can't open $fh: \$!\\n";\n};
+ $init{cpio} = 1;
+ } else {
+ die "Unrecognized switch: -$_\n";
}
+
if (@ARGV) {
- if ($ARGV[0] eq '-o') {
- { local($statdone) = 1; $out .= "\n" . &tab . "||\n"; }
- $statdone = 0 if $indent == 1 && $delayedstat;
- $saw_or++;
- shift;
- }
- else {
- $out .= " &&" unless $ARGV[0] eq ')';
- $out .= "\n";
- shift if $ARGV[0] eq '-a';
- }
+ if ($ARGV[0] eq '-o') {
+ { local($statdone) = 1; $out .= "\n" . &tab . "||\n"; }
+ $statdone = 0 if $indent_depth == 1 && exists $init{delayedstat};
+ $init{saw_or} = 1;
+ shift;
+ } else {
+ $out .= " &&" unless $Skip_And || $ARGV[0] eq ')';
+ $out .= "\n";
+ shift if $ARGV[0] eq '-a';
+ }
}
}
+
print <<"END";
$startperl
eval 'exec $perlpath -S \$0 \${1+"\$@"}'
- if \$running_under_some_shell;
+ if 0; #\$running_under_some_shell
+
+use strict;
+use File::Find ();
+
+# Set the variable \$File::Find::dont_use_nlink if you're using AFS,
+# since AFS cheats.
+
+# for the convenience of &wanted calls, including -eval statements:
+use vars qw/*name *dir *prune/;
+*name = *File::Find::name;
+*dir = *File::Find::dir;
+*prune = *File::Find::prune;
END
-if ($initls) {
+
+if (exists $init{ls}) {
print <<'END';
-@rwx = ('---','--x','-w-','-wx','r--','r-x','rw-','rwx');
-@moname = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
+my @rwx = qw(--- --x -w- -wx r-- r-x rw- rwx);
+my @moname = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
END
}
-if ($inituser || $initls) {
- print 'while (($name, $pw, $uid) = getpwent) {', "\n";
- print ' $uid{$name} = $uid{$uid} = $uid;', "\n" if $inituser;
- print ' $user{$uid} = $name unless $user{$uid};', "\n" if $initls;
+if (exists $init{user} || exists $init{ls} || exists $init{tar}) {
+ print "my (%uid, %user);\n";
+ print "while (my (\$name, \$pw, \$uid) = getpwent) {\n";
+ print ' $uid{$name} = $uid{$uid} = $uid;', "\n"
+ if exists $init{user};
+ print ' $user{$uid} = $name unless exists $user{$uid};', "\n"
+ if exists $init{ls} || exists $init{tar};
print "}\n\n";
}
-if ($initgroup || $initls) {
- print 'while (($name, $pw, $gid) = getgrent) {', "\n";
- print ' $gid{$name} = $gid{$gid} = $gid;', "\n" if $initgroup;
- print ' $group{$gid} = $name unless $group{$gid};', "\n" if $initls;
+if (exists $init{group} || exists $init{ls} || exists $init{tar}) {
+ print "my (%gid, %group);\n";
+ print "while (my (\$name, \$pw, \$gid) = getgrent) {\n";
+ print ' $gid{$name} = $gid{$gid} = $gid;', "\n"
+ if exists $init{group};
+ print ' $group{$gid} = $name unless exists $group{$gid};', "\n"
+ if exists $init{ls} || exists $init{tar};
print "}\n\n";
}
-print $initnewer, "\n" if $initnewer;
+print $initnewer, "\n" if $initnewer ne '';
+print $initfile, "\n" if $initfile ne '';
+$flushall .= "exit;\n";
+if (exists $init{declarestat}) {
+ $out = <<'END' . $out;
+ my ($dev,$ino,$mode,$nlink,$uid,$gid);
-print $initfile, "\n" if $initfile;
+END
+}
-$find = $depth ? "finddepth" : "find";
+if ( $follow_in_effect ) {
+$out =~ s/lstat\(\$_\)/lstat(_)/;
print <<"END";
-require "$find.pl";
-
+$decl
# Traverse desired filesystems
+File::Find::$find( {wanted => \\&wanted, follow => 1}, $roots);
+$flushall
+sub wanted {
+$out;
+}
+
+END
+} else {
+print <<"END";
$decl
-&$find($roots);
+# Traverse desired filesystems
+File::Find::$find({wanted => \\&wanted}, $roots);
$flushall
-exit;
+
sub wanted {
$out;
}
END
+}
-if ($initexec) {
+if (exists $init{doexec}) {
print <<'END';
-sub exec {
- local($ok, @cmd) = @_;
- foreach $word (@cmd) {
- $word =~ s#{}#$name#g;
- }
+
+BEGIN {
+ require Cwd;
+ my $cwd = Cwd::cwd();
+}
+
+sub doexec {
+ my $ok = shift;
+ for my $word (@_)
+ { $word =~ s#{}#$name#g }
if ($ok) {
- local($old) = select(STDOUT);
- $| = 1;
- print "@cmd";
- select($old);
- return 0 unless <STDIN> =~ /^y/;
- }
- chdir $cwd; # sigh
- system @cmd;
- chdir $dir;
+ my $old = select(STDOUT);
+ $| = 1;
+ print "@_";
+ select($old);
+ return 0 unless <STDIN> =~ /^y/;
+ }
+ chdir $cwd; #sigh
+ system @_;
+ chdir $File::Find::dir;
return !$?;
}
END
}
-if ($initls) {
- print <<"INTERP", <<'END';
-sub ls {
- (\$dev,\$ino,\$mode,\$nlink,\$uid,\$gid,\$rdev,\$sizemm,
- \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat\(_\);
-INTERP
-
- $pname = $name;
+if (exists $init{ls}) {
+ print <<'INTRO', <<"SUB", <<'END';
- if (defined $blocks) {
- $blocks = int(($blocks + 1) / 2);
- }
- else {
- $blocks = int(($size + 1023) / 1024);
- }
+sub sizemm {
+ my $rdev = shift;
+ sprintf("%3d, %3d", ($rdev >> 8) & 0xff, $rdev & 0xff);
+}
- if (-f _) { $perms = '-'; }
- elsif (-d _) { $perms = 'd'; }
- elsif (-c _) { $perms = 'c'; $sizemm = &sizemm; }
- elsif (-b _) { $perms = 'b'; $sizemm = &sizemm; }
- elsif (-p _) { $perms = 'p'; }
- elsif (-S _) { $perms = 's'; }
- else { $perms = 'l'; $pname .= ' -> ' . readlink($_); }
-
- $tmpmode = $mode;
- $tmp = $rwx[$tmpmode & 7];
- $tmpmode >>= 3;
- $tmp = $rwx[$tmpmode & 7] . $tmp;
- $tmpmode >>= 3;
- $tmp = $rwx[$tmpmode & 7] . $tmp;
- substr($tmp,2,1) =~ tr/-x/Ss/ if -u _;
- substr($tmp,5,1) =~ tr/-x/Ss/ if -g _;
- substr($tmp,8,1) =~ tr/-x/Tt/ if -k _;
- $perms .= $tmp;
-
- $user = $user{$uid} || $uid;
- $group = $group{$gid} || $gid;
-
- ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
- $moname = $moname[$mon];
+sub ls {
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+INTRO
+ \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_);
+SUB
+ my $pname = $name;
+
+ $blocks
+ or $blocks = int(($size + 1023) / 1024);
+
+ my $perms = $rwx[$mode & 7];
+ $mode >>= 3;
+ $perms = $rwx[$mode & 7] . $perms;
+ $mode >>= 3;
+ $perms = $rwx[$mode & 7] . $perms;
+ substr($perms, 2, 1) =~ tr/-x/Ss/ if -u _;
+ substr($perms, 5, 1) =~ tr/-x/Ss/ if -g _;
+ substr($perms, 8, 1) =~ tr/-x/Tt/ if -k _;
+ if (-f _) { $perms = '-' . $perms; }
+ elsif (-d _) { $perms = 'd' . $perms; }
+ elsif (-l _) { $perms = 'l' . $perms; $pname .= ' -> ' . readlink($_); }
+ elsif (-c _) { $perms = 'c' . $perms; $size = sizemm($rdev); }
+ elsif (-b _) { $perms = 'b' . $perms; $size = sizemm($rdev); }
+ elsif (-p _) { $perms = 'p' . $perms; }
+ elsif (-S _) { $perms = 's' . $perms; }
+ else { $perms = '?' . $perms; }
+
+ my $user = $user{$uid} || $uid;
+ my $group = $group{$gid} || $gid;
+
+ my ($sec,$min,$hour,$mday,$mon,$timeyear) = localtime($mtime);
if (-M _ > 365.25 / 2) {
- $timeyear = $year + 1900;
- }
- else {
- $timeyear = sprintf("%02d:%02d", $hour, $min);
- }
-
- printf "%5lu %4ld %-10s %2d %-8s %-8s %8s %s %2d %5s %s\n",
- $ino,
- $blocks,
- $perms,
- $nlink,
- $user,
- $group,
- $sizemm,
- $moname,
- $mday,
- $timeyear,
- $pname;
+ $timeyear += 1900;
+ } else {
+ $timeyear = sprintf("%02d:%02d", $hour, $min);
+ }
+
+ printf "%5lu %4ld %-10s %3d %-8s %-8s %8s %s %2d %5s %s\n",
+ $ino,
+ $blocks,
+ $perms,
+ $nlink,
+ $user,
+ $group,
+ $size,
+ $moname[$mon],
+ $mday,
+ $timeyear,
+ $pname;
1;
}
-sub sizemm {
- sprintf("%3d, %3d", ($rdev >> 8) & 255, $rdev & 255);
+END
+}
+
+
+if (exists $init{cpio} || exists $init{tar}) {
+print <<'END';
+
+my %blocks = ();
+
+sub flush {
+ my ($fh, $varref, $blksz) = @_;
+
+ while (length($$varref) >= $blksz) {
+ no strict qw/refs/;
+ syswrite($fh, $$varref, $blksz);
+ substr($$varref, 0, $blksz) = '';
+ ++$blocks{$fh};
+ }
}
END
}
-if ($initcpio) {
-print <<'START', <<"INTERP", <<'END';
-sub cpio {
- local($nc,$fh) = @_;
- local($text);
- if ($name eq 'TRAILER!!!') {
- $text = '';
- $size = 0;
- }
- else {
-START
- (\$dev,\$ino,\$mode,\$nlink,\$uid,\$gid,\$rdev,\$size,
- \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat\(_\);
-INTERP
- if (-f _) {
- open(IN, "./$_\0") || do {
- warn "Couldn't open $name: $!\n";
- return;
- };
- }
- else {
- $text = readlink($_);
- $size = 0 unless defined $text;
- }
- }
+if (exists $init{cpio}) {
+ print <<'INTRO', <<"SUB", <<'END';
+
+my %cpout = ();
+my %nc = ();
- ($nm = $name) =~ s#^\./##;
+sub cpio {
+ my ($fh, $fname, $nc) = @_;
+ my $text = '';
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks);
+ local (*IN);
+
+ if ( ! defined $fname ) {
+ $fname = 'TRAILER!!!';
+ ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks) = (0) x 13;
+ } else {
+ ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+INTRO
+ \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_);
+SUB
+ if (-f _) {
+ open(IN, "./$_\0") || do {
+ warn "Couldn't open $fname: $!\n";
+ return;
+ }
+ } else {
+ $text = readlink($_);
+ $size = 0 unless defined $text;
+ }
+ }
+
+ $fname =~ s#^\./##;
$nc{$fh} = $nc;
if ($nc eq 'n') {
- $cpout{$fh} .=
- sprintf("%06o%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo%s\0",
- 070707,
- $dev & 0777777,
- $ino & 0777777,
- $mode & 0777777,
- $uid & 0777777,
- $gid & 0777777,
- $nlink & 0777777,
- $rdev & 0177777,
- $mtime,
- length($nm)+1,
- $size,
- $nm);
+ $cpout{$fh} .=
+ sprintf("%06o%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo%s\0",
+ 070707,
+ $dev & 0777777,
+ $ino & 0777777,
+ $mode & 0777777,
+ $uid & 0777777,
+ $gid & 0777777,
+ $nlink & 0777777,
+ $rdev & 0177777,
+ $mtime,
+ length($fname)+1,
+ $size,
+ $fname);
+ } else {
+ $cpout{$fh} .= "\0" if length($cpout{$fh}) & 1;
+ $cpout{$fh} .= pack("SSSSSSSSLSLa*",
+ 070707, $dev, $ino, $mode, $uid, $gid, $nlink, $rdev, $mtime,
+ length($fname)+1, $size,
+ $fname . (length($fname) & 1 ? "\0" : "\0\0"));
}
- else {
- $cpout{$fh} .= "\0" if length($cpout{$fh}) & 1;
- $cpout{$fh} .= pack("SSSSSSSSLSLa*",
- 070707, $dev, $ino, $mode, $uid, $gid, $nlink, $rdev, $mtime,
- length($nm)+1, $size, $nm . (length($nm) & 1 ? "\0" : "\0\0"));
- }
- if ($text ne '') {
- $cpout{$fh} .= $text;
- }
- elsif ($size) {
- &flush($fh) while ($l = length($cpout{$fh})) >= 5120;
- while (sysread(IN, $cpout{$fh}, 5120 - $l, $l)) {
- &flush($fh);
- $l = length($cpout{$fh});
- }
- }
- close IN;
-}
-sub flush {
- local($fh) = @_;
-
- while (length($cpout{$fh}) >= 5120) {
- syswrite($fh,$cpout{$fh},5120);
- ++$blocks{$fh};
- substr($cpout{$fh}, 0, 5120) = '';
+ if ($text ne '') {
+ $cpout{$fh} .= $text;
+ } elsif ($size) {
+ my $l;
+ flush($fh, \$cpout{$fh}, 5120)
+ while ($l = length($cpout{$fh})) >= 5120;
+ while (sysread(IN, $cpout{$fh}, 5120 - $l, $l)) {
+ flush($fh, \$cpout{$fh}, 5120);
+ $l = length($cpout{$fh});
+ }
+ close IN;
}
}
-sub flushall {
- $name = 'TRAILER!!!';
- foreach $fh (keys %cpout) {
- &cpio($nc{$fh},$fh);
- $cpout{$fh} .= "0" x (5120 - length($cpout{$fh}));
- &flush($fh);
- print $blocks{$fh} * 10, " blocks\n";
+sub cflushall {
+ for my $fh (keys %cpout) {
+ &cpio($fh, undef, $nc{$fh});
+ $cpout{$fh} .= "0" x (5120 - length($cpout{$fh}));
+ flush($fh, \$cpout{$fh}, 5120);
+ print $blocks{$fh} * 10, " blocks\n";
}
}
END
}
-if ($inittar) {
-print <<'START', <<"INTERP", <<'END';
+if (exists $init{tar}) {
+ print <<'INTRO', <<"SUB", <<'END';
+
+my %tarout = ();
+my %linkseen = ();
+
sub tar {
- local($fh) = @_;
- local($linkname,$header,$l,$slop);
- local($linkflag) = "\0";
-
-START
- (\$dev,\$ino,\$mode,\$nlink,\$uid,\$gid,\$rdev,\$size,
- \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat\(_\);
-INTERP
- $nm = $name;
- if ($nlink > 1) {
- if ($linkname = $linkseen{$fh,$dev,$ino}) {
- $linkflag = 1;
- }
- else {
- $linkseen{$fh,$dev,$ino} = $nm;
- }
- }
- if (-f _) {
- open(IN, "./$_\0") || do {
- warn "Couldn't open $name: $!\n";
- return;
- };
- $size = 0 if $linkflag ne "\0";
- }
- else {
- $linkname = readlink($_);
- $linkflag = 2 if defined $linkname;
- $nm .= '/' if -d _;
- $size = 0;
- }
+ my ($fh, $fname) = @_;
+ my $prefix = '';
+ my $typeflag = '0';
+ my $linkname;
+ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+INTRO
+ \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_);
+SUB
+ local (*IN);
- $header = pack("a100a8a8a8a12a12a8a1a100",
- $nm,
- sprintf("%6o ", $mode & 0777),
- sprintf("%6o ", $uid & 0777777),
- sprintf("%6o ", $gid & 0777777),
- sprintf("%11o ", $size),
- sprintf("%11o ", $mtime),
- " ",
- $linkflag,
- $linkname);
- $l = length($header) % 512;
- substr($header, 148, 6) = sprintf("%6o", unpack("%16C*", $header));
- substr($header, 154, 1) = "\0"; # blech
+ if ($nlink > 1) {
+ if ($linkname = $linkseen{$fh, $dev, $ino}) {
+ if (length($linkname) > 100) {
+ warn "$0: omitting file with linkname ",
+ "too long for tar output: $linkname\n";
+ return;
+ }
+ $typeflag = '1';
+ $size = 0;
+ } else {
+ $linkseen{$fh, $dev, $ino} = $fname;
+ }
+ }
+ if ($typeflag eq '0') {
+ if (-f _) {
+ open(IN, "./$_\0") || do {
+ warn "Couldn't open $fname: $!\n";
+ return;
+ }
+ } else {
+ $linkname = readlink($_);
+ if (defined $linkname) { $typeflag = '2' }
+ elsif (-c _) { $typeflag = '3' }
+ elsif (-b _) { $typeflag = '4' }
+ elsif (-d _) { $typeflag = '5' }
+ elsif (-p _) { $typeflag = '6' }
+ }
+ }
+
+ if (length($fname) > 100) {
+ ($prefix, $fname) = ($fname =~ m#\A(.*?)/(.{,100})\Z(?!\n)#);
+ if (!defined($fname) || length($prefix) > 155) {
+ warn "$0: omitting file with name too long for tar output: ",
+ $fname, "\n";
+ return;
+ }
+ }
+
+ $size = 0 if $typeflag ne '0';
+ my $header = pack("a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155",
+ $fname,
+ sprintf("%7o ", $mode & 0777),
+ sprintf("%7o ", $uid & 0777777),
+ sprintf("%7o ", $gid & 0777777),
+ sprintf("%11o ", $size),
+ sprintf("%11o ", $mtime),
+ ' 'x8,
+ $typeflag,
+ defined $linkname ? $linkname : '',
+ "ustar\0",
+ "00",
+ $user{$uid},
+ $group{$gid},
+ ($rdev >> 8) & 0xff,
+ $rdev & 0xff,
+ $prefix,
+ );
+ substr($header, 148, 8) = sprintf("%7o ", unpack("%16C*", $header));
+ my $l = length($header) % 512;
$tarout{$fh} .= $header;
$tarout{$fh} .= "\0" x (512 - $l) if $l;
- if ($size) {
- &tflush($fh) while ($l = length($tarout{$fh})) >= 10240;
- while (sysread(IN, $tarout{$fh}, 10240 - $l, $l)) {
- $slop = length($tarout{$fh}) % 512;
- $tarout{$fh} .= "\0" x (512 - $slop) if $slop;
- &tflush($fh);
- $l = length($tarout{$fh});
- }
- }
- close IN;
-}
-
-sub tflush {
- local($fh) = @_;
- while (length($tarout{$fh}) >= 10240) {
- syswrite($fh,$tarout{$fh},10240);
- ++$blocks{$fh};
- substr($tarout{$fh}, 0, 10240) = '';
+ if ($size) {
+ flush($fh, \$tarout{$fh}, 10240)
+ while ($l = length($tarout{$fh})) >= 10240;
+ while (sysread(IN, $tarout{$fh}, 10240 - $l, $l)) {
+ my $slop = length($tarout{$fh}) % 512;
+ $tarout{$fh} .= "\0" x (512 - $slop) if $slop;
+ flush($fh, \$tarout{$fh}, 10240);
+ $l = length($tarout{$fh});
+ }
+ close IN;
}
}
sub tflushall {
- local($len);
-
- foreach $fh (keys %tarout) {
- $len = 10240 - length($tarout{$fh});
- $len += 10240 if $len < 1024;
- $tarout{$fh} .= "\0" x $len;
- &tflush($fh);
+ my $len;
+ for my $fh (keys %tarout) {
+ $len = 10240 - length($tarout{$fh});
+ $len += 10240 if $len < 1024;
+ $tarout{$fh} .= "\0" x $len;
+ flush($fh, \$tarout{$fh}, 10240);
}
}
@@ -573,52 +636,245 @@ exit;
############################################################################
sub tab {
- local($tabstring);
+ my $tabstring;
- $tabstring = "\t" x ($indent / 2) . ' ' x ($indent % 2 * 4);
+ $tabstring = "\t" x ($indent_depth/2) . ' ' x ($indent_depth%2 * 4);
if (!$statdone) {
- if ($_ =~ /^(name|print|prune|exec|ok|\(|\))/) {
- $delayedstat++;
- }
- else {
- if ($saw_or) {
- $tabstring .= <<"ENDOFSTAT" . $tabstring;
-(\$nlink || ((\$dev,\$ino,\$mode,\$nlink,\$uid,\$gid) = $stat\(\$_\))) &&
-ENDOFSTAT
- }
- else {
- $tabstring .= <<"ENDOFSTAT" . $tabstring;
-((\$dev,\$ino,\$mode,\$nlink,\$uid,\$gid) = $stat\(\$_\)) &&
-ENDOFSTAT
- }
- $statdone = 1;
- }
+ if ($_ =~ /^(?:name|print|prune|exec|ok|\(|\))/) {
+ $init{delayedstat} = 1;
+ } else {
+ my $statcall = '(($dev,$ino,$mode,$nlink,$uid,$gid) = '
+ . $stat . '($_))';
+ if (exists $init{saw_or}) {
+ $tabstring .= "(\$nlink || $statcall) &&\n" . $tabstring;
+ } else {
+ $tabstring .= "$statcall &&\n" . $tabstring;
+ }
+ $statdone = 1;
+ $init{declarestat} = 1;
+ }
}
$tabstring =~ s/^\s+/ / if $out =~ /!$/;
$tabstring;
}
sub fileglob_to_re {
- local($tmp) = @_;
-
- $tmp =~ s#([./^\$()])#\\$1#g;
- $tmp =~ s/([?*])/.$1/g;
- "^$tmp\$";
+ my $x = shift;
+ $x =~ s#([./^\$()])#\\$1#g;
+ $x =~ s#([?*])#.$1#g;
+ "^$x\\z";
}
sub n {
- local($n) = @_;
-
+ my ($pre, $n) = @_;
$n =~ s/^-/< / || $n =~ s/^\+/> / || $n =~ s/^/== /;
$n =~ s/ 0*(\d)/ $1/;
- $n . ')';
+ "($pre $n)";
}
sub quote {
- local($string) = @_;
- $string =~ s/'/\\'/;
+ my $string = shift;
+ $string =~ s/'/\\'/g;
"'$string'";
}
+
+__END__
+
+=head1 NAME
+
+find2perl - translate find command lines to Perl code
+
+=head1 SYNOPSIS
+
+ find2perl [paths] [predicates] | perl
+
+=head1 DESCRIPTION
+
+find2perl is a little translator to convert find command lines to
+equivalent Perl code. The resulting code is typically faster than
+running find itself.
+
+"paths" are a set of paths where find2perl will start its searches and
+"predicates" are taken from the following list.
+
+=over 4
+
+=item C<! PREDICATE>
+
+Negate the sense of the following predicate. The C<!> must be passed as
+a distinct argument, so it may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<( PREDICATES )>
+
+Group the given PREDICATES. The parentheses must be passed as distinct
+arguments, so they may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<PREDICATE1 PREDICATE2>
+
+True if _both_ PREDICATE1 and PREDICATE2 are true; PREDICATE2 is not
+evaluated if PREDICATE1 is false.
+
+=item C<PREDICATE1 -o PREDICATE2>
+
+True if either one of PREDICATE1 or PREDICATE2 is true; PREDICATE2 is
+not evaluated if PREDICATE1 is true.
+
+=item C<-follow>
+
+Follow (dereference) symlinks. The checking of file attributes depends
+on the position of the C<-follow> option. If it precedes the file
+check option, an C<stat> is done which means the file check applies to the
+file the symbolic link is pointing to. If C<-follow> option follows the
+file check option, this now applies to the symbolic link itself, i.e.
+an C<lstat> is done.
+
+=item C<-depth>
+
+Change directory traversal algorithm from breadth-first to depth-first.
+
+=item C<-prune>
+
+Do not descend into the directory currently matched.
+
+=item C<-xdev>
+
+Do not traverse mount points (prunes search at mount-point directories).
+
+=item C<-name GLOB>
+
+File name matches specified GLOB wildcard pattern. GLOB may need to be
+quoted to avoid interpretation by the shell (just as with using
+C<find(1)>).
+
+=item C<-perm PERM>
+
+Low-order 9 bits of permission match octal value PERM.
+
+=item C<-perm -PERM>
+
+The bits specified in PERM are all set in file's permissions.
+
+=item C<-type X>
+
+The file's type matches perl's C<-X> operator.
+
+=item C<-fstype TYPE>
+
+Filesystem of current path is of type TYPE (only NFS/non-NFS distinction
+is implemented).
+
+=item C<-user USER>
+
+True if USER is owner of file.
+
+=item C<-group GROUP>
+
+True if file's group is GROUP.
+
+=item C<-nouser>
+
+True if file's owner is not in password database.
+
+=item C<-nogroup>
+
+True if file's group is not in group database.
+
+=item C<-inum INUM>
+
+True file's inode number is INUM.
+
+=item C<-links N>
+
+True if (hard) link count of file matches N (see below).
+
+=item C<-size N>
+
+True if file's size matches N (see below) N is normally counted in
+512-byte blocks, but a suffix of "c" specifies that size should be
+counted in characters (bytes) and a suffix of "k" specifes that
+size should be counted in 1024-byte blocks.
+
+=item C<-atime N>
+
+True if last-access time of file matches N (measured in days) (see
+below).
+
+=item C<-ctime N>
+
+True if last-changed time of file's inode matches N (measured in days,
+see below).
+
+=item C<-mtime N>
+
+True if last-modified time of file matches N (measured in days, see below).
+
+=item C<-newer FILE>
+
+True if last-modified time of file matches N.
+
+=item C<-print>
+
+Print out path of file (always true).
+
+=item C<-print0>
+
+Like -print, but terminates with \0 instead of \n.
+
+=item C<-exec OPTIONS ;>
+
+exec() the arguments in OPTIONS in a subprocess; any occurence of {} in
+OPTIONS will first be substituted with the path of the current
+file. Note that the command "rm" has been special-cased to use perl's
+unlink() function instead (as an optimization). The C<;> must be passed as
+a distinct argument, so it may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<-ok OPTIONS ;>
+
+Like -exec, but first prompts user; if user's response does not begin
+with a y, skip the exec. The C<;> must be passed as
+a distinct argument, so it may need to be surrounded by whitespace and/or
+quoted from interpretation by the shell using a backslash (just as with
+using C<find(1)>).
+
+=item C<-eval EXPR>
+
+Has the perl script eval() the EXPR.
+
+=item C<-ls>
+
+Simulates C<-exec ls -dils {} ;>
+
+=item C<-tar FILE>
+
+Adds current output to tar-format FILE.
+
+=item C<-cpio FILE>
+
+Adds current output to old-style cpio-format FILE.
+
+=item C<-ncpio FILE>
+
+Adds current output to "new"-style cpio-format FILE.
+
+=back
+
+Predicates which take a numeric argument N can come in three forms:
+
+ * N is prefixed with a +: match values greater than N
+ * N is prefixed with a -: match values less than N
+ * N is not prefixed with either + or -: match only values equal to N
+
+=head1 SEE ALSO
+
+find
+
+=cut
!NO!SUBS!
close OUT or die "Can't close $file: $!";
diff --git a/contrib/perl5/x2p/hash.c b/contrib/perl5/x2p/hash.c
index f11f7df..77b9ad8 100644
--- a/contrib/perl5/x2p/hash.c
+++ b/contrib/perl5/x2p/hash.c
@@ -89,9 +89,7 @@ hstore(register HASH *tb, char *key, STR *val)
#ifdef NOTUSED
bool
-hdelete(tb,key)
-register HASH *tb;
-char *key;
+hdelete(register HASH *tb, char *key)
{
register char *s;
register int i;
@@ -178,8 +176,7 @@ hnew(void)
}
#ifdef NOTUSED
-hshow(tb)
-register HASH *tb;
+hshow(register HASH *tb)
{
fprintf(stderr,"%5d %4d (%2d%%)\n",
tb->tbl_max+1,
diff --git a/contrib/perl5/x2p/hash.h b/contrib/perl5/x2p/hash.h
index 9dc64a1..377bfd2 100644
--- a/contrib/perl5/x2p/hash.h
+++ b/contrib/perl5/x2p/hash.h
@@ -41,12 +41,12 @@ struct htbl {
HENT *tbl_eiter; /* current entry of iterator */
};
-bool hdelete _((HASH *tb, char *key));
-STR * hfetch _(( HASH *tb, char *key ));
-int hiterinit _(( HASH *tb ));
-char * hiterkey _(( HENT *entry ));
-HENT * hiternext _(( HASH *tb ));
-STR * hiterval _(( HENT *entry ));
-HASH * hnew _(( void ));
-void hsplit _(( HASH *tb ));
-bool hstore _(( HASH *tb, char *key, STR *val ));
+bool hdelete (HASH *tb, char *key);
+STR * hfetch ( HASH *tb, char *key );
+int hiterinit ( HASH *tb );
+char * hiterkey ( HENT *entry );
+HENT * hiternext ( HASH *tb );
+STR * hiterval ( HENT *entry );
+HASH * hnew ( void );
+void hsplit ( HASH *tb );
+bool hstore ( HASH *tb, char *key, STR *val );
diff --git a/contrib/perl5/x2p/s2p.PL b/contrib/perl5/x2p/s2p.PL
index 463465d..4f7bf8c 100644
--- a/contrib/perl5/x2p/s2p.PL
+++ b/contrib/perl5/x2p/s2p.PL
@@ -51,7 +51,7 @@ B<s2p [options] filename>
=head1 DESCRIPTION
-I<S2p> takes a sed script specified on the command line (or from
+I<s2p> takes a sed script specified on the command line (or from
standard input) and produces a comparable I<perl> script on the
standard output.
@@ -93,7 +93,7 @@ $\ and chop.
=head1 ENVIRONMENT
-S2p uses no environment variables.
+s2p uses no environment variables.
=head1 AUTHOR
@@ -104,7 +104,7 @@ Larry Wall E<lt>F<larry@wall.org>E<gt>
=head1 SEE ALSO
perl The perl compiler/interpreter
-
+
a2p awk to perl translator
=head1 DIAGNOSTICS
@@ -339,11 +339,11 @@ if ($appendseen || $tseen || !$assumen) {
: if ($atext) { chop $atext; print $atext; $atext = ''; }
: #endif
EOT
+}
print BODY &q(<<'EOT');
: }
EOT
-}
unless ($debug) {
@@ -552,6 +552,11 @@ EOT
substr($_,$i-1,1) = '$';
}
}
+ elsif ($c eq '@') {
+ substr($_, $i, 0) = '\\';
+ $i++;
+ $len++;
+ }
elsif ($c eq '&' && $repl) {
substr($_, $i, 0) = '$';
$i++;
@@ -797,6 +802,7 @@ sub fetchpat {
}
}
$addr =~ s/\t/\\t/g;
+ $addr =~ s/\@/\\@/g;
&simplify($addr);
$addr;
}
diff --git a/contrib/perl5/x2p/str.h b/contrib/perl5/x2p/str.h
index 3deaaec..a7eec88 100644
--- a/contrib/perl5/x2p/str.h
+++ b/contrib/perl5/x2p/str.h
@@ -29,25 +29,25 @@ struct string {
EXT STR **tmps_list;
EXT long tmps_max INIT(-1);
-double str_2num _(( STR *str ));
-char * str_2ptr _(( STR *str ));
-char * str_append_till _(( STR *str, char *from, int delim, char *keeplist ));
-void str_cat _(( STR *str, char *ptr ));
-void str_chop _(( STR *str, char *ptr ));
-void str_dec _(( STR *str ));
-void str_free _(( STR *str ));
-char * str_gets _(( STR *str, FILE *fp ));
-void str_grow _(( STR *str, int len ));
-void str_inc _(( STR *str ));
-int str_len _(( STR *str ));
-STR * str_make _(( char *s ));
-STR * str_mortal _(( STR *oldstr ));
-void str_ncat _(( STR *str, char *ptr, int len ));
-STR * str_new _(( int len ));
-STR * str_nmake _(( double n ));
-void str_nset _(( STR *str, char *ptr, int len ));
-void str_numset _(( STR *str, double num ));
-void str_replace _(( STR *str, STR *nstr ));
-void str_scat _(( STR *dstr, STR *sstr ));
-void str_set _(( STR *str, char *ptr ));
-void str_sset _(( STR *dstr, STR *sstr ));
+double str_2num ( STR *str );
+char * str_2ptr ( STR *str );
+char * str_append_till ( STR *str, char *from, int delim, char *keeplist );
+void str_cat ( STR *str, char *ptr );
+void str_chop ( STR *str, char *ptr );
+void str_dec ( STR *str );
+void str_free ( STR *str );
+char * str_gets ( STR *str, FILE *fp );
+void str_grow ( STR *str, int len );
+void str_inc ( STR *str );
+int str_len ( STR *str );
+STR * str_make ( char *s );
+STR * str_mortal ( STR *oldstr );
+void str_ncat ( STR *str, char *ptr, int len );
+STR * str_new ( int len );
+STR * str_nmake ( double n );
+void str_nset ( STR *str, char *ptr, int len );
+void str_numset ( STR *str, double num );
+void str_replace ( STR *str, STR *nstr );
+void str_scat ( STR *dstr, STR *sstr );
+void str_set ( STR *str, char *ptr );
+void str_sset ( STR *dstr, STR *sstr );
diff --git a/contrib/perl5/x2p/util.c b/contrib/perl5/x2p/util.c
index 364dfe9..d43a1eb 100644
--- a/contrib/perl5/x2p/util.c
+++ b/contrib/perl5/x2p/util.c
@@ -203,6 +203,9 @@ fatal(char *pat,...)
exit(1);
}
+#if defined(__APPLE_CC__)
+__private_extern__ /* warn() conflicts with libc */
+#endif
void
warn(char *pat,...)
{
diff --git a/contrib/perl5/x2p/util.h b/contrib/perl5/x2p/util.h
index aa31bea..34138c7 100644
--- a/contrib/perl5/x2p/util.h
+++ b/contrib/perl5/x2p/util.h
@@ -22,18 +22,18 @@
char *getwd();
int makedir();
-char * cpy2 _(( char *to, char *from, int delim ));
-char * cpytill _(( char *to, char *from, int delim ));
-void growstr _(( char **strptr, int *curlen, int newlen ));
-char * instr _(( char *big, char *little ));
-char * safecpy _(( char *to, char *from, int len ));
-char * savestr _(( char *str ));
-void croak _(( char *pat, ... ));
-void fatal _(( char *pat, ... ));
-void warn _(( char *pat, ... ));
-int prewalk _(( int numit, int level, int node, int *numericptr ));
+char * cpy2 ( char *to, char *from, int delim );
+char * cpytill ( char *to, char *from, int delim );
+void growstr ( char **strptr, int *curlen, int newlen );
+char * instr ( char *big, char *little );
+char * safecpy ( char *to, char *from, int len );
+char * savestr ( char *str );
+void croak ( char *pat, ... );
+void fatal ( char *pat, ... );
+void warn ( char *pat, ... );
+int prewalk ( int numit, int level, int node, int *numericptr );
-Malloc_t safemalloc _((MEM_SIZE nbytes));
-Malloc_t safecalloc _((MEM_SIZE elements, MEM_SIZE size));
-Malloc_t saferealloc _((Malloc_t where, MEM_SIZE nbytes));
-Free_t safefree _((Malloc_t where));
+Malloc_t safemalloc (MEM_SIZE nbytes);
+Malloc_t safecalloc (MEM_SIZE elements, MEM_SIZE size);
+Malloc_t saferealloc (Malloc_t where, MEM_SIZE nbytes);
+Free_t safefree (Malloc_t where);
diff --git a/contrib/perl5/x2p/walk.c b/contrib/perl5/x2p/walk.c
index 24b86aa..3344688 100644
--- a/contrib/perl5/x2p/walk.c
+++ b/contrib/perl5/x2p/walk.c
@@ -26,14 +26,14 @@ char *limit;
STR *subs;
STR *curargs = Nullstr;
-static void addsemi _(( STR *str ));
-static void emit_split _(( STR *str, int level ));
-static void fixtab _(( STR *str, int lvl ));
-static void numericize _(( int node ));
-static void tab _(( STR *str, int lvl ));
+static void addsemi ( STR *str );
+static void emit_split ( STR *str, int level );
+static void fixtab ( STR *str, int lvl );
+static void numericize ( int node );
+static void tab ( STR *str, int lvl );
-int prewalk _(( int numit, int level, int node, int *numericptr ));
-STR * walk _(( int useval, int level, int node, int *numericptr, int minprec ));
+int prewalk ( int numit, int level, int node, int *numericptr );
+STR * walk ( int useval, int level, int node, int *numericptr, int minprec );
STR *
@@ -863,7 +863,7 @@ sub Pick {\n\
str_scat(tmp3str,tmp2str);
str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
str_set(tmp2str,"eval $s_");
- s = (*s == 'g' ? "ge" : "e");
+ s = (char*)(*s == 'g' ? "ge" : "e");
i++;
}
type = ops[ops[node+1].ival].ival;
@@ -1219,7 +1219,7 @@ sub Pick {\n\
}
tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
if (!*tmpstr->str_ptr && lval_field) {
- t = saw_OFS ? "$," : "' '";
+ t = (char*)(saw_OFS ? "$," : "' '");
if (split_to_array) {
sprintf(tokenbuf,"join(%s,@Fld)",t);
str_cat(tmpstr,tokenbuf);
@@ -1292,10 +1292,10 @@ sub Pick {\n\
if (len > 0)
tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
else
- tmpstr = str_new(0);;
+ tmpstr = str_new(0);
if (!tmpstr->str_ptr || !*tmpstr->str_ptr) {
if (lval_field) {
- t = saw_OFS ? "$," : "' '";
+ t = (char*)(saw_OFS ? "$," : "' '");
if (split_to_array) {
sprintf(tokenbuf,"join(%s,@Fld)",t);
str_cat(tmpstr,tokenbuf);
@@ -1417,7 +1417,7 @@ sub Pick {\n\
str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
str_free(fstr);
if (str->str_ptr[str->str_cur - 1] == '\n')
- --str->str_cur;;
+ --str->str_cur;
str_cat(str," while (");
str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
str_free(fstr);
diff --git a/contrib/perl5/xsutils.c b/contrib/perl5/xsutils.c
new file mode 100644
index 0000000..0f5989b
--- /dev/null
+++ b/contrib/perl5/xsutils.c
@@ -0,0 +1,290 @@
+#include "EXTERN.h"
+#define PERL_IN_XSUTILS_C
+#include "perl.h"
+
+/*
+ * Contributed by Spider Boardman (spider.boardman@orb.nashua.nh.us).
+ */
+
+/* package attributes; */
+void XS_attributes__warn_reserved(pTHXo_ CV *cv);
+void XS_attributes_reftype(pTHXo_ CV *cv);
+void XS_attributes__modify_attrs(pTHXo_ CV *cv);
+void XS_attributes__guess_stash(pTHXo_ CV *cv);
+void XS_attributes__fetch_attrs(pTHXo_ CV *cv);
+void XS_attributes_bootstrap(pTHXo_ CV *cv);
+
+
+/*
+ * Note that only ${pkg}::bootstrap definitions should go here.
+ * This helps keep down the start-up time, which is especially
+ * relevant for users who don't invoke any features which are
+ * (partially) implemented here.
+ *
+ * The various bootstrap definitions can take care of doing
+ * package-specific newXS() calls. Since the layout of the
+ * bundled *.pm files is in a version-specific directory,
+ * version checks in these bootstrap calls are optional.
+ */
+
+void
+Perl_boot_core_xsutils(pTHX)
+{
+ char *file = __FILE__;
+
+ newXS("attributes::bootstrap", XS_attributes_bootstrap, file);
+}
+
+#include "XSUB.h"
+
+static int
+modify_SV_attributes(pTHXo_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
+{
+ SV *attr;
+ char *name;
+ STRLEN len;
+ bool negated;
+ int nret;
+
+ for (nret = 0 ; numattrs && (attr = *attrlist++); numattrs--) {
+ name = SvPV(attr, len);
+ if ((negated = (*name == '-'))) {
+ name++;
+ len--;
+ }
+ switch (SvTYPE(sv)) {
+ case SVt_PVCV:
+ switch ((int)len) {
+ case 6:
+ switch (*name) {
+ case 'l':
+#ifdef CVf_LVALUE
+ if (strEQ(name, "lvalue")) {
+ if (negated)
+ CvFLAGS((CV*)sv) &= ~CVf_LVALUE;
+ else
+ CvFLAGS((CV*)sv) |= CVf_LVALUE;
+ continue;
+ }
+#endif /* defined CVf_LVALUE */
+ if (strEQ(name, "locked")) {
+ if (negated)
+ CvFLAGS((CV*)sv) &= ~CVf_LOCKED;
+ else
+ CvFLAGS((CV*)sv) |= CVf_LOCKED;
+ continue;
+ }
+ break;
+ case 'm':
+ if (strEQ(name, "method")) {
+ if (negated)
+ CvFLAGS((CV*)sv) &= ~CVf_METHOD;
+ else
+ CvFLAGS((CV*)sv) |= CVf_METHOD;
+ continue;
+ }
+ break;
+ }
+ break;
+ }
+ break;
+ default:
+ /* nothing, yet */
+ break;
+ }
+ /* anything recognized had a 'continue' above */
+ *retlist++ = attr;
+ nret++;
+ }
+
+ return nret;
+}
+
+
+
+/* package attributes; */
+
+XS(XS_attributes_bootstrap)
+{
+ dXSARGS;
+ char *file = __FILE__;
+
+ newXSproto("attributes::_warn_reserved", XS_attributes__warn_reserved, file, "");
+ newXS("attributes::_modify_attrs", XS_attributes__modify_attrs, file);
+ newXSproto("attributes::_guess_stash", XS_attributes__guess_stash, file, "$");
+ newXSproto("attributes::_fetch_attrs", XS_attributes__fetch_attrs, file, "$");
+ newXSproto("attributes::reftype", XS_attributes_reftype, file, "$");
+
+ XSRETURN(0);
+}
+
+XS(XS_attributes__modify_attrs)
+{
+ dXSARGS;
+ SV *rv, *sv;
+
+ if (items < 1) {
+usage:
+ Perl_croak(aTHX_
+ "Usage: attributes::_modify_attrs $reference, @attributes");
+ }
+
+ rv = ST(0);
+ if (!(SvOK(rv) && SvROK(rv)))
+ goto usage;
+ sv = SvRV(rv);
+ if (items > 1)
+ XSRETURN(modify_SV_attributes(aTHXo_ sv, &ST(0), &ST(1), items-1));
+
+ XSRETURN(0);
+}
+
+XS(XS_attributes__fetch_attrs)
+{
+ dXSARGS;
+ SV *rv, *sv;
+ cv_flags_t cvflags;
+
+ if (items != 1) {
+usage:
+ Perl_croak(aTHX_
+ "Usage: attributes::_fetch_attrs $reference");
+ }
+
+ rv = ST(0);
+ SP -= items;
+ if (!(SvOK(rv) && SvROK(rv)))
+ goto usage;
+ sv = SvRV(rv);
+
+ switch (SvTYPE(sv)) {
+ case SVt_PVCV:
+ cvflags = CvFLAGS((CV*)sv);
+ if (cvflags & CVf_LOCKED)
+ XPUSHs(sv_2mortal(newSVpvn("locked", 6)));
+#ifdef CVf_LVALUE
+ if (cvflags & CVf_LVALUE)
+ XPUSHs(sv_2mortal(newSVpvn("lvalue", 6)));
+#endif
+ if (cvflags & CVf_METHOD)
+ XPUSHs(sv_2mortal(newSVpvn("method", 6)));
+ break;
+ default:
+ break;
+ }
+
+ PUTBACK;
+}
+
+XS(XS_attributes__guess_stash)
+{
+ dXSARGS;
+ SV *rv, *sv;
+#ifdef dXSTARGET
+ dXSTARGET;
+#else
+ SV * TARG = sv_newmortal();
+#endif
+
+ if (items != 1) {
+usage:
+ Perl_croak(aTHX_
+ "Usage: attributes::_guess_stash $reference");
+ }
+
+ rv = ST(0);
+ ST(0) = TARG;
+ if (!(SvOK(rv) && SvROK(rv)))
+ goto usage;
+ sv = SvRV(rv);
+
+ if (SvOBJECT(sv))
+ sv_setpv(TARG, HvNAME(SvSTASH(sv)));
+#if 0 /* this was probably a bad idea */
+ else if (SvPADMY(sv))
+ sv_setsv(TARG, &PL_sv_no); /* unblessed lexical */
+#endif
+ else {
+ HV *stash = Nullhv;
+ switch (SvTYPE(sv)) {
+ case SVt_PVCV:
+ if (CvGV(sv) && isGV(CvGV(sv)) && GvSTASH(CvGV(sv)) &&
+ HvNAME(GvSTASH(CvGV(sv))))
+ stash = GvSTASH(CvGV(sv));
+ else if (/* !CvANON(sv) && */ CvSTASH(sv) && HvNAME(CvSTASH(sv)))
+ stash = CvSTASH(sv);
+ break;
+ case SVt_PVMG:
+ if (!(SvFAKE(sv) && SvTIED_mg(sv, '*')))
+ break;
+ /*FALLTHROUGH*/
+ case SVt_PVGV:
+ if (GvGP(sv) && GvESTASH((GV*)sv) && HvNAME(GvESTASH((GV*)sv)))
+ stash = GvESTASH((GV*)sv);
+ break;
+ default:
+ break;
+ }
+ if (stash)
+ sv_setpv(TARG, HvNAME(stash));
+ }
+
+#ifdef dXSTARGET
+ SvSETMAGIC(TARG);
+#endif
+ XSRETURN(1);
+}
+
+XS(XS_attributes_reftype)
+{
+ dXSARGS;
+ SV *rv, *sv;
+#ifdef dXSTARGET
+ dXSTARGET;
+#else
+ SV * TARG = sv_newmortal();
+#endif
+
+ if (items != 1) {
+usage:
+ Perl_croak(aTHX_
+ "Usage: attributes::reftype $reference");
+ }
+
+ rv = ST(0);
+ ST(0) = TARG;
+ if (!(SvOK(rv) && SvROK(rv)))
+ goto usage;
+ sv = SvRV(rv);
+ sv_setpv(TARG, sv_reftype(sv, 0));
+#ifdef dXSTARGET
+ SvSETMAGIC(TARG);
+#endif
+
+ XSRETURN(1);
+}
+
+XS(XS_attributes__warn_reserved)
+{
+ dXSARGS;
+#ifdef dXSTARGET
+ dXSTARGET;
+#else
+ SV * TARG = sv_newmortal();
+#endif
+
+ if (items != 0) {
+ Perl_croak(aTHX_
+ "Usage: attributes::_warn_reserved ()");
+ }
+
+ EXTEND(SP,1);
+ ST(0) = TARG;
+ sv_setiv(TARG, ckWARN(WARN_RESERVED) != 0);
+#ifdef dXSTARGET
+ SvSETMAGIC(TARG);
+#endif
+
+ XSRETURN(1);
+}
+
OpenPOWER on IntegriCloud